diff --git a/.eslintignore b/.eslintignore deleted file mode 100644 index 40cc7195..00000000 --- a/.eslintignore +++ /dev/null @@ -1,6 +0,0 @@ -dist/ -lib/ -node_modules/ -jest.config.js -*.test.ts -*.spec.ts \ No newline at end of file diff --git a/.eslintrc.json b/.eslintrc.json deleted file mode 100644 index 9d6daec2..00000000 --- a/.eslintrc.json +++ /dev/null @@ -1,63 +0,0 @@ -{ - "plugins": ["jest", "@typescript-eslint"], - "extends": ["plugin:github/recommended"], - "parser": "@typescript-eslint/parser", - "parserOptions": { - "ecmaVersion": 9, - "sourceType": "module", - "project": "./tsconfig.json" - }, - "rules": { - "i18n-text/no-en": "off", - "eslint-comments/no-use": "off", - "import/no-namespace": "off", - "no-unused-vars": "off", - "@typescript-eslint/no-unused-vars": "error", - "@typescript-eslint/explicit-member-accessibility": [ - "error", - {"accessibility": "no-public"} - ], - "@typescript-eslint/no-require-imports": "error", - "@typescript-eslint/array-type": "error", - "@typescript-eslint/await-thenable": "error", - "@typescript-eslint/ban-ts-comment": "error", - "camelcase": "off", - "@typescript-eslint/consistent-type-assertions": "error", - "@typescript-eslint/explicit-function-return-type": [ - "error", - {"allowExpressions": true} - ], - "@typescript-eslint/func-call-spacing": ["error", "never"], - "@typescript-eslint/no-array-constructor": "error", - "@typescript-eslint/no-empty-interface": "error", - "@typescript-eslint/no-explicit-any": "error", - "@typescript-eslint/no-extraneous-class": "error", - "@typescript-eslint/no-for-in-array": "error", - "@typescript-eslint/no-inferrable-types": "error", - "@typescript-eslint/no-misused-new": "error", - "@typescript-eslint/no-namespace": "error", - "@typescript-eslint/no-non-null-assertion": "warn", - "@typescript-eslint/no-unnecessary-qualifier": "error", - "@typescript-eslint/no-unnecessary-type-assertion": "error", - "@typescript-eslint/no-useless-constructor": "error", - "@typescript-eslint/no-var-requires": "error", - "@typescript-eslint/prefer-for-of": "warn", - "@typescript-eslint/prefer-function-type": "warn", - "@typescript-eslint/prefer-includes": "error", - "@typescript-eslint/prefer-string-starts-ends-with": "error", - "@typescript-eslint/promise-function-async": "error", - "@typescript-eslint/require-array-sort-compare": "error", - "@typescript-eslint/restrict-plus-operands": "error", - "semi": "off", - "@typescript-eslint/semi": ["error", "never"], - "@typescript-eslint/type-annotation-spacing": "error", - "@typescript-eslint/unbound-method": "error", - "no-redeclare": "off", - "@typescript-eslint/no-redeclare": "error" - }, - "env": { - "node": true, - "es6": true, - "jest/globals": true - } -} diff --git a/.gitattributes b/.gitattributes index 2e051e1f..248af7d2 100644 --- a/.gitattributes +++ b/.gitattributes @@ -1 +1 @@ -dist/** -diff linguist-generated=true \ No newline at end of file +index.js -diff linguist-generated=true diff --git a/.github/workflows/check-dist.yml b/.github/workflows/check-dist.yml deleted file mode 100644 index 128897f7..00000000 --- a/.github/workflows/check-dist.yml +++ /dev/null @@ -1,53 +0,0 @@ -# `dist/index.js` is a special file in Actions. -# When you reference an action with `uses:` in a workflow, -# `index.js` is the code that will run. -# For our project, we generate this file through a build process from other source files. -# We need to make sure the checked-in `index.js` actually matches what we expect it to be. -name: Check dist/ - -on: - push: - branches: - - main - paths-ignore: - - '**.md' - pull_request: - paths-ignore: - - '**.md' - workflow_dispatch: - -jobs: - check-dist: - runs-on: ubuntu-latest - - steps: - - uses: actions/checkout@v4 - - - name: Set Node.js 20.x - uses: actions/setup-node@v4.0.4 - with: - node-version: 20.x - - - name: Install dependencies - run: npm ci - - - name: Rebuild the dist/ directory - run: | - npm run build - npm run package - - - name: Compare the expected and actual dist/ directories - run: | - if [ "$(git diff --ignore-space-at-eol dist/ | wc -l)" -gt "0" ]; then - echo "Detected uncommitted changes after build. See status below:" - git diff - exit 1 - fi - id: diff - - # If index.js was different than expected, upload the expected version as an artifact - - uses: actions/upload-artifact@v4 - if: ${{ failure() && steps.diff.conclusion == 'failure' }} - with: - name: dist - path: dist/ diff --git a/.github/workflows/codeql-analysis.yml b/.github/workflows/codeql-analysis.yml deleted file mode 100644 index f5b5821e..00000000 --- a/.github/workflows/codeql-analysis.yml +++ /dev/null @@ -1,71 +0,0 @@ -# For most projects, this workflow file will not need changing; you simply need -# to commit it to your repository. -# -# You may wish to alter this file to override the set of languages analyzed, -# or to provide custom queries or build logic. -# -# ******** NOTE ******** -# We have attempted to detect the languages in your repository. Please check -# the `language` matrix defined below to confirm you have the correct set of -# supported CodeQL languages. -# -name: "CodeQL" - -on: - push: - branches: [ main ] - pull_request: - # The branches below must be a subset of the branches above - branches: [ main ] - schedule: - - cron: '31 7 * * 3' - -jobs: - analyze: - name: Analyze - runs-on: ubuntu-latest - permissions: - actions: read - contents: read - security-events: write - - strategy: - fail-fast: false - matrix: - language: [ 'TypeScript' ] - # CodeQL supports [ 'cpp', 'csharp', 'go', 'java', 'javascript', 'python', 'ruby' ] - # Learn more about CodeQL language support at https://git.io/codeql-language-support - - steps: - - name: Checkout repository - uses: actions/checkout@v4 - - # Initializes the CodeQL tools for scanning. - - name: Initialize CodeQL - uses: github/codeql-action/init@v3 - with: - languages: ${{ matrix.language }} - source-root: src - # If you wish to specify custom queries, you can do so here or in a config file. - # By default, queries listed here will override any specified in a config file. - # Prefix the list here with "+" to use these queries and those in the config file. - # queries: ./path/to/local/query, your-org/your-repo/queries@main - - # Autobuild attempts to build any compiled languages (C/C++, C#, or Java). - # If this step fails, then you should remove it and run the build manually (see below) - - name: Autobuild - uses: github/codeql-action/autobuild@v3 - - # ℹī¸ Command-line programs to run using the OS shell. - # 📚 https://git.io/JvXDl - - # ✏ī¸ If the Autobuild fails above, remove it and uncomment the following three lines - # and modify them (or add more) to build your code if your project - # uses a compiled language - - #- run: | - # make bootstrap - # make release - - - name: Perform CodeQL Analysis - uses: github/codeql-action/analyze@v3 diff --git a/.github/workflows/k8s-local-go.yml b/.github/workflows/k8s-local-go.yml deleted file mode 100644 index 6bdb05ba..00000000 --- a/.github/workflows/k8s-local-go.yml +++ /dev/null @@ -1,72 +0,0 @@ -name: k8s-local-go -on: - workflow_dispatch: - inputs: - read-rps: - description: Required Read RPS - required: true - type: string - default: '1000' - write-rps: - description: Required Write RPS - required: true - type: string - default: '50' - pull_request: - branches: - - 'k8s-local' - -jobs: - test-slo: - concurrency: - group: slo-${{ github.ref }} - - runs-on: ubuntu-latest - name: SLO test - permissions: - checks: write - pull-requests: write - contents: read - issues: write - steps: - - name: Checkout repository - uses: actions/checkout@v4 - with: - repository: ydb-platform/ydb-go-sdk - - - name: Run SLO - uses: ydb-platform/slo-tests@k8s-local - env: - DOCKER_REPO: ${{ secrets.SLO_DOCKER_REPO }} - continue-on-error: true - with: - GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} - READ_RPS: ${{ github.event.inputs.read-rps }} - WRITE_RPS: ${{ github.event.inputs.write-rps }} - grafana_dashboard: ${{ vars.SLO_GRAFANA_DASHBOARD }} - ydb_version: 'newest' - timeBetweenPhases: 30 - shutdownTime: 30 - - language_id0: 'native-table' - workload_path0: 'tests/slo' - language0: 'Native ydb-go-sdk/v3 over table-service' - workload_build_context0: ../.. - workload_build_options0: -f Dockerfile --build-arg SRC_PATH=native/table --build-arg JOB_NAME=workload-native-table - - language_id1: 'database-sql' - workload_path1: 'tests/slo' - language1: 'Go SDK database/sql' - workload_build_context1: ../.. - workload_build_options1: -f Dockerfile --build-arg SRC_PATH=database/sql --build-arg JOB_NAME=workload-database-sql - - language_id2: 'native-query' - workload_path2: 'tests/slo' - language2: 'Native ydb-go-sdk/v3 over query-service' - workload_build_context2: ../.. - workload_build_options2: -f Dockerfile --build-arg SRC_PATH=native/query --build-arg JOB_NAME=workload-native-query - - - uses: actions/upload-artifact@v4 - with: - name: slo-logs - path: logs/ diff --git a/.github/workflows/k8s-local-python.yml b/.github/workflows/k8s-local-python.yml deleted file mode 100644 index f9efd7b7..00000000 --- a/.github/workflows/k8s-local-python.yml +++ /dev/null @@ -1,69 +0,0 @@ - -name: k8s-local-python -on: - workflow_dispatch: - inputs: - read-rps: - description: Required Read RPS - required: true - type: string - default: '1000' - write-rps: - description: Required Write RPS - required: true - type: string - default: '50' - pull_request: - branches: - - 'k8s-local' - -jobs: - test-slo: - concurrency: - group: slo-${{ github.ref }} - - runs-on: ubuntu-latest - name: SLO test - permissions: - checks: write - pull-requests: write - contents: read - issues: write - - steps: - - name: Checkout repository - uses: actions/checkout@v4 - with: - repository: ydb-platform/ydb-python-sdk - - - - name: Run SLO - uses: ydb-platform/slo-tests@k8s-local - env: - DOCKER_REPO: ${{ secrets.SLO_DOCKER_REPO }} - continue-on-error: true - with: - GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} - grafana_dashboard: ${{ vars.SLO_GRAFANA_DASHBOARD }} - READ_RPS: ${{ github.event.inputs.read-rps }} - WRITE_RPS: ${{ github.event.inputs.write-rps }} - ydb_version: 'newest' - timeBetweenPhases: 30 - shutdownTime: 30 - - language_id0: sync-python-table - language0: Python SDK over Table Service - workload_path0: tests/slo - workload_build_context0: ../.. - workload_build_options0: -f Dockerfile --build-arg SDK_SERVICE=sync-python-table - - language_id1: sync-python-query - language1: Python SDK over Query Service - workload_path1: tests/slo - workload_build_context1: ../.. - workload_build_options1: -f Dockerfile --build-arg SDK_SERVICE=sync-python-query - - - uses: actions/upload-artifact@v4 - with: - name: slo-logs - path: logs/ diff --git a/.github/workflows/slo-action-test.yml b/.github/workflows/slo-action-test.yml new file mode 100644 index 00000000..3ff5a2a7 --- /dev/null +++ b/.github/workflows/slo-action-test.yml @@ -0,0 +1,31 @@ +name: slo-action-test +on: + workflow_dispatch: + push: + branches: + - "v2" + pull_request: + branches: + - "main" + paths: + - ".github/workflows/slo-actions-test.yml" + +jobs: + test-slo-action: + runs-on: ubuntu-latest + name: SLO Action test + permissions: + pull-requests: write + contents: read + actions: write + issues: write + checks: write + steps: + - name: Run SLO + uses: ydb-platform/slo-tests@v2 + with: + GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} + GITHUB_HEAD_REF: ${{ github.head_ref }} + GITHUB_BASE_REF: ${{ github.base_ref }} + WORKLOAD_RUNNER: "sleep 10" + CHAOS_TEST_RUNNER: "sleep 10" diff --git a/.gitignore b/.gitignore index afece18b..13df3ec3 100644 --- a/.gitignore +++ b/.gitignore @@ -13,91 +13,26 @@ lerna-debug.log* # Diagnostic reports (https://nodejs.org/api/report.html) report.[0-9]*.[0-9]*.[0-9]*.[0-9]*.json -# Runtime data -pids -*.pid -*.seed -*.pid.lock - -# Directory for instrumented libs generated by jscoverage/JSCover -lib-cov - # Coverage directory used by tools like istanbul coverage *.lcov -# nyc test coverage -.nyc_output - -# Grunt intermediate storage (https://gruntjs.com/creating-plugins#storing-task-files) -.grunt - -# Bower dependency directory (https://bower.io/) -bower_components - -# node-waf configuration -.lock-wscript - -# Compiled binary addons (https://nodejs.org/api/addons.html) -build/Release - -# Dependency directories -jspm_packages/ - -# TypeScript v1 declaration files -typings/ - # TypeScript cache *.tsbuildinfo # Optional npm cache directory .npm -# Optional eslint cache -.eslintcache - -# Optional REPL history -.node_repl_history - # Output of 'npm pack' *.tgz -# Yarn Integrity file -.yarn-integrity - # dotenv environment variables file .env .env.test -# parcel-bundler cache (https://parceljs.org/) -.cache - -# next.js build output -.next - -# nuxt.js build output -.nuxt - -# vuepress build output -.vuepress/dist - -# Serverless directories -.serverless/ - -# FuseBox cache -.fusebox/ - -# DynamoDB Local files -.dynamodb/ - # OS metadata .DS_Store Thumbs.db -# Ignore built ts files -__tests__/runner/* -lib/**/* -src/manifests/*.json - # IDEs .idea diff --git a/.gitmodules b/.gitmodules deleted file mode 100644 index e69de29b..00000000 diff --git a/.prettierignore b/.prettierignore deleted file mode 100644 index 21869472..00000000 --- a/.prettierignore +++ /dev/null @@ -1,3 +0,0 @@ -dist/ -lib/ -node_modules/ \ No newline at end of file diff --git a/.prettierrc.json b/.prettierrc.json deleted file mode 100644 index c34bafcb..00000000 --- a/.prettierrc.json +++ /dev/null @@ -1,10 +0,0 @@ -{ - "printWidth": 80, - "tabWidth": 2, - "useTabs": false, - "semi": false, - "singleQuote": true, - "trailingComma": "none", - "bracketSpacing": false, - "arrowParens": "avoid" -} diff --git a/README.md b/README.md index ae9bcdb2..2274e008 100644 --- a/README.md +++ b/README.md @@ -1,7 +1,5 @@ # slo-tests -### [Deployment and CI readme](/k8s/README.md) -
This repo contains github workflows and actions to run SLO tests over YDB and YDB SDK's diff --git a/action.yml b/action.yml index e3be91d5..16afb7cf 100644 --- a/action.yml +++ b/action.yml @@ -1,149 +1,32 @@ name: 'SLO test over YDB' -description: 'YDB SLO test for SDKs. Uses kubernetes cluster to run tests over. Creates possible errors in cluster to check how SDK handles them.' +description: 'YDB SLO test for SDKs. Creates possible errors in cluster to check how SDK handles them.' inputs: GITHUB_TOKEN: - description: 'Github token' - required: true - KUBECONFIG_B64: - description: '.kube/config base64' - required: true - AWS_CREDENTIALS_B64: - description: '.aws/credentials base64' - required: true - AWS_CONFIG_B64: - description: '.aws/config base64' - required: true - DOCKER_USERNAME: - description: 'Docker username' - required: true - DOCKER_PASSWORD: - description: 'Docker password' - required: true - DOCKER_REPO: - description: 'Docker repository' - required: true - DOCKER_FOLDER: - description: 'Docker folder' - required: true - s3_endpoint: - description: 'AWS S3-compatible service endpoint' - required: true - s3_images_folder: - description: 'S3 folder' - required: true - grafana_domain: - description: 'Grafana service domain' - required: true - grafana_dashboard: - description: 'Grafana service dashboard' - required: true - grafana_dashboard_width: - description: 'Grafana service screenshot dashboard width' - required: false - grafana_dashboard_height: - description: 'Grafana service screenshot dashboard height' - required: false - ydb_version: - description: 'YDB version to run SLO over: use docker tag or `newest`' - required: true - timeBetweenPhases: - description: 'Time between errors phases of SLO test' - required: true - shutdownTime: - description: 'SLO workload shutdown timeout' - required: true - # You need to use sequential ids for workloads to run - language_id0: - description: 'SLO workload #0 language ID' - required: false - workload_path0: - description: 'SLO workload #0 workload path' - required: false - language0: - description: 'SLO workload #0 language name' - required: false - workload_build_context0: - description: 'SLO workload #0 docker build context' - required: false - workload_build_options0: - description: 'SLO workload #0 docker build arguments' - required: false - language_id1: - description: 'SLO workload #1 language ID' - required: false - workload_path1: - description: 'SLO workload #1 workload path' - required: false - language1: - description: 'SLO workload #1 language name' - required: false - workload_build_context1: - description: 'SLO workload #1 docker build context' - required: false - workload_build_options1: - description: 'SLO workload #1 docker build arguments' - required: false - language_id2: - description: 'SLO workload #2 language ID' - required: false - workload_path2: - description: 'SLO workload #2 workload path' - required: false - language2: - description: 'SLO workload #2 language name' - required: false - workload_build_context2: - description: 'SLO workload #2 docker build context' - required: false - workload_build_options2: - description: 'SLO workload #2 docker build arguments' - required: false - language_id3: - description: 'SLO workload #3 language ID' - required: false - workload_path3: - description: 'SLO workload #3 workload path' - required: false - language3: - description: 'SLO workload #3 language name' - required: false - workload_build_context3: - description: 'SLO workload #3 docker build context' - required: false - workload_build_options3: - description: 'SLO workload #3 docker build arguments' - required: false - language_id4: - description: 'SLO workload #4 language ID' - required: false - workload_path4: - description: 'SLO workload #4 workload path' - required: false - language4: - description: 'SLO workload #4 language name' - required: false - workload_build_context4: - description: 'SLO workload #4 docker build context' - required: false - workload_build_options4: - description: 'SLO workload #4 docker build arguments' - required: false - language_id5: - description: 'SLO workload #5 language ID' - required: false - workload_path5: - description: 'SLO workload #5 workload path' - required: false - language5: - description: 'SLO workload #5 language name' - required: false - workload_build_context5: - description: 'SLO workload #5 docker build context' - required: false - workload_build_options5: - description: 'SLO workload #5 docker build arguments' - required: false + description: 'A token to authenticate on behalf of the GitHub App installed on your repository.' + required: true + default: ${{ github.token }} + GITHUB_HEAD_REF: + description: 'The head_ref or source branch of the pull request in a workflow run.' + required: false + default: ${{ github.head_ref }} + GITHUB_BASE_REF: + description: 'The base_ref or target branch of the pull request in a workflow run.' + required: true + default: ${{ github.base_ref || github.ref }} + WORKLOAD_RUNNER: + description: 'The command or executable name used to run the workload against the YDB database.' + required: false + default: "sleep 10" + CHAOS_TEST_RUNNER: + description: 'The command or executable name used to run the chaos testing against the YDB cluster.' + required: false + default: "sleep 10" + # YDB_STORAGE_NODE_COUNT: + # description: 'The number of YDB storage nodes to create.' + # default: "1" + YDB_DATABASE_NODE_COUNT: + description: 'The number of YDB database nodes to create.' + default: "3" runs: using: 'node20' - main: 'dist/main/index.js' - post: 'dist/post/index.js' + main: 'index.js' diff --git a/bun.lockb b/bun.lockb new file mode 100755 index 00000000..2746196a Binary files /dev/null and b/bun.lockb differ diff --git a/dist/main/index.js b/dist/main/index.js deleted file mode 100644 index 4c273d0c..00000000 --- a/dist/main/index.js +++ /dev/null @@ -1,3 +0,0 @@ -(()=>{var e={2965:function(e,A,t){"use strict";var r=this&&this.__createBinding||(Object.create?function(e,A,t,r){if(r===undefined)r=t;var s=Object.getOwnPropertyDescriptor(A,t);if(!s||("get"in s?!A.__esModule:s.writable||s.configurable)){s={enumerable:true,get:function(){return A[t]}}}Object.defineProperty(e,r,s)}:function(e,A,t,r){if(r===undefined)r=t;e[r]=A[t]});var s=this&&this.__setModuleDefault||(Object.create?function(e,A){Object.defineProperty(e,"default",{enumerable:true,value:A})}:function(e,A){e["default"]=A});var o=this&&this.__importStar||function(e){if(e&&e.__esModule)return e;var A={};if(e!=null)for(var t in e)if(t!=="default"&&Object.prototype.hasOwnProperty.call(e,t))r(A,e,t);s(A,e);return A};var n=this&&this.__importDefault||function(e){return e&&e.__esModule?e:{default:e}};Object.defineProperty(A,"__esModule",{value:true});A.prepareK8S=prepareK8S;A.prepareAWS=prepareAWS;A.call=call;A.callAsync=callAsync;A.callKubernetes=callKubernetes;A.callKubernetesPath=callKubernetesPath;A.callKubernetesAsync=callKubernetesAsync;A.callKubernetesPathAsync=callKubernetesPathAsync;const i=o(t(7484));const a=t(5317);const c=t(9896);const g=t(857);const l=n(t(6928));const E=t(672);let u=null;let h=0;function prepareK8S(e){return(0,E.logGroup)("Prepare k8s",(()=>{const A=l.default.join((0,g.homedir)(),".kube");i.info(`mkdir ${A}`);try{(0,c.mkdirSync)(A)}catch(e){i.debug("error"+JSON.stringify(e));if((e===null||e===void 0?void 0:e.code)==="EEXIST"){i.debug(A+" EEXIST")}else throw e}if(e.length>0){i.debug("Get kubeconfig string");const A=Buffer.from(e,"base64").toString("utf8");i.info(`Write kubeconfig to ~/.kube/config`);(0,c.writeFileSync)(l.default.join((0,g.homedir)(),".kube/config"),A)}u=call("which kubectl").split("\n")[0];i.info(`kubectl path: ${u}`)}))}function prepareAWS(e,A){const t=l.default.join((0,g.homedir)(),".aws");i.info(`mkdir ${t}`);try{(0,c.mkdirSync)(t)}catch(e){i.debug("error"+JSON.stringify(e));if((e===null||e===void 0?void 0:e.code)==="EEXIST"){i.debug(t+" EEXIST")}else throw e}if(e.length>0){i.debug("Get aws credentials string");const A=Buffer.from(e,"base64").toString("utf8");i.info(`Write awsCredentials to ~/.aws/credentials`);(0,c.writeFileSync)(l.default.join((0,g.homedir)(),".aws/credentials"),A)}if(A.length>0){i.debug("Get aws credentials string");const e=Buffer.from(A,"base64").toString("utf8");i.info(`Write awsConfig to ~/.aws/config`);(0,c.writeFileSync)(l.default.join((0,g.homedir)(),".aws/config"),e)}}function call(e,A=false){const t=++h;!A&&i.info(`Call #${t} command: '${e}'`);const r=(0,a.execSync)(e,{encoding:"utf8",maxBuffer:Infinity,stdio:"pipe"});i.debug(`Call #${t} result ${r}`);return r}function callAsync(e,A=false,t="."){return new Promise(((r,s)=>{const o=++h;!A&&i.info(`Call #${o} command: '${e}' with cwd '${t}'`);const n=(0,a.exec)(e,{encoding:"utf8",maxBuffer:Infinity,cwd:t});if(!n.stdio||!n.stdout||!n.stderr){i.info(`Error in callAsync #${o}: can't spawn process`);throw new Error(`Error in callAsync #${o}: can't spawn process`)}let c="",g="";n.stdout.on("data",(e=>c+=e.toString()));n.stderr.on("data",(e=>g+=e.toString()));n.on("close",(e=>{i.debug(`Call #${o} async code = ${e}`);if(e==0){if(c.length>3e3)i.debug(`Call #${o} async TRUNCATED (full size is ${c.length/1024}kb - showing 3000 symbols) output: \n${c.slice(0,1500)}\n.........\n${c.slice(-1500)}`);else i.debug(`Call #${o} async output \n${c}`);r(c)}else{if(A)i.info(`Call #${o} async with secrets failed - on close`);else i.info(`Call #${o} async failed - on close:\nError: ${g}\nOutput: ${c}`);s(new Error(g))}}));n.on("error",(e=>{if(A)i.info(`Call #${o} async with secrets failed - on error`);else i.info(`Call #${o} async failed - on error:\nError: ${e}\nOutput: ${c}`);s(e)}))}))}function callKubernetes(e){if(u===null)throw new Error("K8s not initialized, call prepareK8S first");return call(`${u} ${e}`)}function callKubernetesPath(e){if(u===null)throw new Error("K8s not initialized, call prepareK8S first");return call(e(u))}function callKubernetesAsync(e){if(u===null)throw new Error("K8s not initialized, call prepareK8S first");return callAsync(`${u} ${e}`)}function callKubernetesPathAsync(e){if(u===null)throw new Error("K8s not initialized, call prepareK8S first");return callAsync(e(u))}},392:function(e,A,t){"use strict";var r=this&&this.__createBinding||(Object.create?function(e,A,t,r){if(r===undefined)r=t;var s=Object.getOwnPropertyDescriptor(A,t);if(!s||("get"in s?!A.__esModule:s.writable||s.configurable)){s={enumerable:true,get:function(){return A[t]}}}Object.defineProperty(e,r,s)}:function(e,A,t,r){if(r===undefined)r=t;e[r]=A[t]});var s=this&&this.__setModuleDefault||(Object.create?function(e,A){Object.defineProperty(e,"default",{enumerable:true,value:A})}:function(e,A){e["default"]=A});var o=this&&this.__importStar||function(e){if(e&&e.__esModule)return e;var A={};if(e!=null)for(var t in e)if(t!=="default"&&Object.prototype.hasOwnProperty.call(e,t))r(A,e,t);s(A,e);return A};var n=this&&this.__awaiter||function(e,A,t,r){function adopt(e){return e instanceof t?e:new t((function(A){A(e)}))}return new(t||(t=Promise))((function(t,s){function fulfilled(e){try{step(r.next(e))}catch(e){s(e)}}function rejected(e){try{step(r["throw"](e))}catch(e){s(e)}}function step(e){e.done?t(e.value):adopt(e.value).then(fulfilled,rejected)}step((r=r.apply(e,A||[])).next())}))};var i=this&&this.__importDefault||function(e){return e&&e.__esModule?e:{default:e}};Object.defineProperty(A,"__esModule",{value:true});A.getUUID=getUUID;A.getDataFromGrafana=getDataFromGrafana;A.parseRawGraph=parseRawGraph;A.filterGraphData=filterGraphData;A.checkGraphValues=checkGraphValues;A.checkResults=checkResults;const a=i(t(6982));const c=o(t(7484));const g=o(t(3228));const l=t(2965);const E=t(5524);function getUUID(){const e=a.default.randomBytes(16).toString("hex");return e.substring(0,8)+"-"+e.substring(8,12)+"-"+e.substring(12,16)+"-"+e.substring(16,20)+"-"+e.substring(20)}function getDataFromGrafana(e,A,t){return n(this,void 0,void 0,(function*(){const r={queries:t.map(((e,A)=>Object.assign(Object.assign({refId:e.refId,expr:e.expr,key:`Q-${getUUID()}-${A}`,interval:e.interval},e.format?{format:e.format}:{}),{datasource:{type:"prometheus",uid:"prometheus"},editorMode:"code",legendFormat:"__auto",range:false,instant:true,exemplar:false,hide:false,queryType:"timeSeriesQuery",utcOffsetSec:14400,datasourceId:1,intervalMs:5e3,maxDataPoints:1514}))),range:{from:e.toISOString(),to:A.toISOString(),raw:{from:e.toISOString(),to:A.toISOString()}},from:""+e.valueOf(),to:""+A.valueOf()};let s=r.queries.reduce(((e,A)=>e+=A.key),"");r.queries=r.queries.map((e=>Object.assign({requestId:`${s}${e.refId}`},e)));let o=`wget -q -O- --header='content-type: application/json' --post-data='${JSON.stringify(r)}' 'http://grafana/api/ds/query' | base64`;o=o.replace(/'/g,"'\\''");c.debug(`getDataFromGrafana kube request:\nkubectl run -q -i --image=busybox --rm grafana-result-peeker --restart=Never -- sh -c '${o}'`);return Buffer.from(yield(0,l.callKubernetesPathAsync)((e=>`${e} run -q -i --image=busybox --rm grafana-result-peeker-${Math.ceil(Math.random()*1e3%1e3)} --restart=Never -- sh -c '${o}'`)),"base64").toString("utf8")}))}function parseRawGraph(e){const A=JSON.parse(e);c.debug("Parsed JSON graph data "+JSON.stringify(A));const t=Object.keys(A.results);c.debug("Process graph data");return t.reduce(((e,t)=>{e[t]=A.results[t].frames.map((e=>{var A,t,r,s,o,n;return{value:(r=(t=(A=e===null||e===void 0?void 0:e.data)===null||A===void 0?void 0:A.values)===null||t===void 0?void 0:t[1])===null||r===void 0?void 0:r[0],labels:(n=(o=(s=e===null||e===void 0?void 0:e.schema)===null||s===void 0?void 0:s.fields)===null||o===void 0?void 0:o[1])===null||n===void 0?void 0:n.labels}}));return e}),{})}function filterGraphData(e){return function filterGraphFun(A){return Object.entries(e).reduce(((e,t)=>e&&A.labels[t[0]]===t[1]),true)}}function checkGraphValues(e,A,t){let r=[];for(const s of Object.keys(t)){const o=A[s];const n=t[s];c.debug(`Check query '${s}': result: ${JSON.stringify(o)}; desired result:${JSON.stringify(n)}`);for(const A of n){const t=Object.assign({job:`workload-${e}`},A.filter);let n=(o||[]).filter(filterGraphData(t));c.debug(`Apply filter '${JSON.stringify(t)}': ${JSON.stringify(n)}`);const i=`${s}${JSON.stringify(t)}`;const a=`slo-${i.replace(/[{":}\[\]]/g,"-")}`;if(n.length===0){c.debug(`Not found results by filter to inspect`);r.push([a,"notfound",i,`Not found results by filter to inspect`])}else{c.debug(`Found results by filter to inspect: ${JSON.stringify(Object.entries(n))}`);for(const[e,t]of Object.entries(n)){const s=A.value[0]===">"?t.value>A.value[1]:t.value0",interval:"1s"},{refId:"max_99_latency",expr:'max_over_time(latency{quantile="0.99"}[$__range])>0',interval:""},{refId:"fail_interval",expr:"sum_over_time(clamp(irate(not_oks[2s])*2, 0, 1)[$__range:1s])>0",interval:"1s"}];const i=yield(0,E.retry)(2,(()=>n(this,void 0,void 0,(function*(){const e=yield getDataFromGrafana(t,r,o);c.debug("graphsRaw: "+e);return parseRawGraph(e)}))));c.debug("parsed: "+JSON.stringify(i));const a=checkGraphValues(A,i,s);c.info("checks: "+JSON.stringify(a));let l=false;let u="SLO check failed: ";for(let A=0;Ae[1]=="error")).length>0}))}},9810:function(e,A,t){"use strict";var r=this&&this.__createBinding||(Object.create?function(e,A,t,r){if(r===undefined)r=t;var s=Object.getOwnPropertyDescriptor(A,t);if(!s||("get"in s?!A.__esModule:s.writable||s.configurable)){s={enumerable:true,get:function(){return A[t]}}}Object.defineProperty(e,r,s)}:function(e,A,t,r){if(r===undefined)r=t;e[r]=A[t]});var s=this&&this.__setModuleDefault||(Object.create?function(e,A){Object.defineProperty(e,"default",{enumerable:true,value:A})}:function(e,A){e["default"]=A});var o=this&&this.__importStar||function(e){if(e&&e.__esModule)return e;var A={};if(e!=null)for(var t in e)if(t!=="default"&&Object.prototype.hasOwnProperty.call(e,t))r(A,e,t);s(A,e);return A};var n=this&&this.__awaiter||function(e,A,t,r){function adopt(e){return e instanceof t?e:new t((function(A){A(e)}))}return new(t||(t=Promise))((function(t,s){function fulfilled(e){try{step(r.next(e))}catch(e){s(e)}}function rejected(e){try{step(r["throw"](e))}catch(e){s(e)}}function step(e){e.done?t(e.value):adopt(e.value).then(fulfilled,rejected)}step((r=r.apply(e,A||[])).next())}))};Object.defineProperty(A,"__esModule",{value:true});A.createCluster=createCluster;A.getYdbVersions=getYdbVersions;A.deleteCluster=deleteCluster;const i=o(t(7484));const a=t(672);const c=t(2965);const g=t(7063);const l=t(117);function createCluster(){return n(this,arguments,void 0,(function*(e="24.1",A,t=10){return(0,a.logGroup)("Create cluster",(()=>n(this,void 0,void 0,(function*(){const r=g.databaseManifestTemplate.replace("${{VERSION}}",e);const s=g.storageManifestTemplate.replace("${{VERSION}}",e);i.debug("database manifest:\n\n"+r);i.debug("storage manifest:\n\n"+s);i.info("Apply database and storage manifests");i.info("storage apply result:\n"+(0,c.callKubernetesPath)((e=>`${e} apply -f - <`${e} apply -f - <n(this,void 0,void 0,(function*(){i.debug("check status of cluster");const e=getStatus("database");const A=getStatus("storage");i.debug(`Current status of cluster: database - ${e}, storage - ${A}`);if(e!==o){i.info(`Database become '${e}', storage is '${A}'`);o=e}if(A!==a){i.info(`Storage become '${A}', database is '${e}'`);a=A}if(e==="Ready"&&A==="Ready")return true;return false}))))}))))}))}function getYdbVersions(){return(0,a.logGroup)("Get versions",(()=>{const e=(0,c.call)("docker run --rm ghcr.io/regclient/regctl:v0.4.8 tag ls cr.yandex/crptqonuodf51kdj7a7d/ydb");const A=e.split("\n").filter((e=>e.length>0));A.sort();return A}))}function getStatus(e){const A=(0,c.callKubernetes)(`get ${e}s.ydb.tech ${e}-sample -ojsonpath={.status}`);return JSON.parse(A).state}function deleteCluster(){return(0,a.logGroup)("Delete cluster",(()=>{i.info("Delete database and storage manifests");try{i.info("Database delete result:\n"+(0,c.callKubernetes)("delete databases.ydb.tech database-sample"))}catch(e){i.info("Error while deleting database"+JSON.stringify(e))}try{i.info("Storage delete result:\n"+(0,c.callKubernetes)("delete storages.ydb.tech storage-sample"))}catch(e){i.info("Error while deleting storage"+JSON.stringify(e))}try{const e=(0,c.callKubernetes)('get pvc -o=jsonpath="{.items[*].metadata.name}" -l ydb.tech/statefulset-name=storage-sample');i.debug("pvcs"+e);i.info("PVC delete result:\n"+(0,c.callKubernetes)(`delete pvc ${e}`))}catch(e){i.info("Error while deleting pvcs"+JSON.stringify(e))}}))}},773:function(e,A,t){"use strict";var r=this&&this.__createBinding||(Object.create?function(e,A,t,r){if(r===undefined)r=t;var s=Object.getOwnPropertyDescriptor(A,t);if(!s||("get"in s?!A.__esModule:s.writable||s.configurable)){s={enumerable:true,get:function(){return A[t]}}}Object.defineProperty(e,r,s)}:function(e,A,t,r){if(r===undefined)r=t;e[r]=A[t]});var s=this&&this.__setModuleDefault||(Object.create?function(e,A){Object.defineProperty(e,"default",{enumerable:true,value:A})}:function(e,A){e["default"]=A});var o=this&&this.__importStar||function(e){if(e&&e.__esModule)return e;var A={};if(e!=null)for(var t in e)if(t!=="default"&&Object.prototype.hasOwnProperty.call(e,t))r(A,e,t);s(A,e);return A};var n=this&&this.__awaiter||function(e,A,t,r){function adopt(e){return e instanceof t?e:new t((function(A){A(e)}))}return new(t||(t=Promise))((function(t,s){function fulfilled(e){try{step(r.next(e))}catch(e){s(e)}}function rejected(e){try{step(r["throw"](e))}catch(e){s(e)}}function step(e){e.done?t(e.value):adopt(e.value).then(fulfilled,rejected)}step((r=r.apply(e,A||[])).next())}))};Object.defineProperty(A,"__esModule",{value:true});A.errorScheduler=errorScheduler;A.annotate=annotate;const i=o(t(7484));const a=t(2965);let c=null;function errorScheduler(e,A){return n(this,void 0,void 0,(function*(){const t=(yield(0,a.callKubernetesAsync)(`get pods database-sample-0 -o=jsonpath='{.status.podIP}'`)).split("\n")[0];i.info(`Target of the error scheduler (database-sample-0) IP: ${t}`);c=e;i.info(`Grafana pod name: ${c}`);yield new Promise((e=>{setTimeout(e,A*1e3)}));const freezeCmd=e=>`run -it --image=busybox --rm tablet-${e==="0"?"un":""}freezer --restart=Never --`+` sh -c "wget -q -O- '${t}:8765/tablets/app?`+`TabletID=72057594037968897&node=1&page=SetFreeze&freeze=${e}' "`;yield createError("Freeze tablet",freezeCmd("1"),A);yield createError("Unfreeze tablet",freezeCmd("0"),A);yield createError("Delete database pod",`delete pod database-sample-1`,A);yield createError("Force delete database pod",`delete pod database-sample-1 --force=true --grace-period=0`,A);yield createError("Kill database from inside",`exec -it database-sample-0 -- /bin/bash -c "kill -2 1 && echo 'process killed'"`,A)}))}function createError(e,A,t){return n(this,void 0,void 0,(function*(){return yield Promise.allSettled([(0,a.callKubernetesAsync)(A),annotate(e,i.getInput("grafana_dashboard")||"7CzMl5t4k"),new Promise((e=>{setTimeout(e,t*1e3)}))]).then((e=>{if(e.filter((e=>e.status==="rejected")).length>0)return Promise.reject("Error in YDB error creation")}))}))}function annotate(e,A="7CzMl5t4k"){const t="http://localhost:3000/api/annotations";const createWgetPost=(e,A)=>`wget -qS -O- --header 'Accept: application/json' --header 'Content-Type: application/json' --post-data '${A}' '${e}'`;const r=`{\\"dashboardUID\\":\\"${A}\\", \\"text\\":\\"${e}\\", \\"tags\\":[]}`;return(0,a.callKubernetes)(`exec -it ${c} --container grafana -- /bin/bash -c "${createWgetPost(t,r)}"`)}},2405:function(e,A,t){"use strict";var r=this&&this.__awaiter||function(e,A,t,r){function adopt(e){return e instanceof t?e:new t((function(A){A(e)}))}return new(t||(t=Promise))((function(t,s){function fulfilled(e){try{step(r.next(e))}catch(e){s(e)}}function rejected(e){try{step(r["throw"](e))}catch(e){s(e)}}function step(e){e.done?t(e.value):adopt(e.value).then(fulfilled,rejected)}step((r=r.apply(e,A||[])).next())}))};Object.defineProperty(A,"__esModule",{value:true});A.getInfrastractureEndpoints=getInfrastractureEndpoints;const s=t(2965);const o=t(5524);const n=t(117);function getInfrastractureEndpoints(){return r(this,void 0,void 0,(function*(){const e=["prometheus-operator","prometheus","prometheus-pushgateway","grafana","grafana-renderer","ydb-operator"];return Promise.allSettled(e.map(getEndpoint)).then((A=>{const t=e.filter(((e,t)=>A[t].status==="rejected"));if(t.length>0){throw new Error(`Not found those required k8s pods: ${t.join(", ")}`)}return{prometheusOperator:A[0].value,prometheus:A[1].value,prometheusPushgateway:A[2].value,grafana:A[3].value,grafanaRenderer:A[4].value,ydbOperator:A[5].value}}))}))}function getEndpoint(e){return(0,o.retry)(2,(()=>(0,n.withTimeoutSimple)(10,(0,s.callKubernetesAsync)(`get pods -l "app.kubernetes.io/name=${e}" -o jsonpath="{.items[0].metadata.name}"`).then((e=>e.split("\n")[0])))))}},3464:function(e,A,t){"use strict";var r=this&&this.__createBinding||(Object.create?function(e,A,t,r){if(r===undefined)r=t;var s=Object.getOwnPropertyDescriptor(A,t);if(!s||("get"in s?!A.__esModule:s.writable||s.configurable)){s={enumerable:true,get:function(){return A[t]}}}Object.defineProperty(e,r,s)}:function(e,A,t,r){if(r===undefined)r=t;e[r]=A[t]});var s=this&&this.__setModuleDefault||(Object.create?function(e,A){Object.defineProperty(e,"default",{enumerable:true,value:A})}:function(e,A){e["default"]=A});var o=this&&this.__importStar||function(e){if(e&&e.__esModule)return e;var A={};if(e!=null)for(var t in e)if(t!=="default"&&Object.prototype.hasOwnProperty.call(e,t))r(A,e,t);s(A,e);return A};var n=this&&this.__awaiter||function(e,A,t,r){function adopt(e){return e instanceof t?e:new t((function(A){A(e)}))}return new(t||(t=Promise))((function(t,s){function fulfilled(e){try{step(r.next(e))}catch(e){s(e)}}function rejected(e){try{step(r["throw"](e))}catch(e){s(e)}}function step(e){e.done?t(e.value):adopt(e.value).then(fulfilled,rejected)}step((r=r.apply(e,A||[])).next())}))};var i=this&&this.__importDefault||function(e){return e&&e.__esModule?e:{default:e}};Object.defineProperty(A,"__esModule",{value:true});A.grafanaScreenshot=grafanaScreenshot;A.postComment=postComment;const a=i(t(6928));const c=o(t(7484));const g=t(3228);const l=t(2965);const E=t(1943);function grafanaScreenshot(e,A,t,r,s){return n(this,arguments,void 0,(function*(e,A,t,r,s,o="7CzMl5t4k",n=1500,i=1100){c.debug(`grafanaScreenshot(${e}, ${A}, ${t}, ${r}, ${s}, ${o}, ${n}, ${i})`);const g=`http://grafana/render/d/${o.split("/")[0]}/slo?orgId=1&from=${r.valueOf()}&to=${s.valueOf()}&width=${n}&height=${i}&tz=Europe%2FIstanbul&kiosk=tv&var-filter=job|=|workload-${t}`;c.debug("grafana query: "+g);const u=yield c.group("Get base64 image",(()=>(0,l.callKubernetesAsync)(`run -q -i --image=busybox --rm grafana-screenshoter-${t} --restart=Never -- sh -c "wget -q -O- '${g}' | base64"`)));c.debug("grafana imageb64: "+u.slice(0,100)+"...TRUNCATED..."+u.slice(-100));c.debug("Write picture to FS");const h=`${t}-${(new Date).valueOf()}.png`;yield(0,E.writeFile)(h,Buffer.from(u,"base64"));yield(0,l.callAsync)(`aws s3 --endpoint-url=${e} cp ./${h} "s3://${a.default.join(A,h)}"`);yield(0,l.callAsync)(`rm ${h}`);const Q="https://"+a.default.join(e.split("//")[1],A,h);c.debug("fullPictureUri: "+Q);return`${Q}`}))}function postComment(e,A,t){return n(this,void 0,void 0,(function*(){if(!g.context.payload.pull_request)return;const r=`\x3c!-- slo-test-action "${A}" --\x3e`;const s=yield e.rest.issues.listComments(Object.assign({issue_number:g.context.payload.pull_request.number},g.context.repo));const o=s.data.filter((e=>{var A;return(A=e.body)===null||A===void 0?void 0:A.includes(r)}));if(o.length===0){const s=Object.assign(Object.assign({},g.context.repo),{issue_number:g.context.payload.pull_request.number,comment_id:A,body:t+`\n${r}`});c.debug("Create comment with data:"+JSON.stringify(s));const o=yield e.rest.issues.createComment(s);c.debug("Create comment result:"+JSON.stringify(o))}else{const A=Object.assign(Object.assign({},g.context.repo),{comment_id:o[0].id,body:t+`\n${r}`});c.debug("Update comment with data:"+JSON.stringify(A));const s=yield e.rest.issues.updateComment(A);c.debug("Update comment result:"+JSON.stringify(s))}}))}},5915:function(e,A,t){"use strict";var r=this&&this.__createBinding||(Object.create?function(e,A,t,r){if(r===undefined)r=t;var s=Object.getOwnPropertyDescriptor(A,t);if(!s||("get"in s?!A.__esModule:s.writable||s.configurable)){s={enumerable:true,get:function(){return A[t]}}}Object.defineProperty(e,r,s)}:function(e,A,t,r){if(r===undefined)r=t;e[r]=A[t]});var s=this&&this.__setModuleDefault||(Object.create?function(e,A){Object.defineProperty(e,"default",{enumerable:true,value:A})}:function(e,A){e["default"]=A});var o=this&&this.__importStar||function(e){if(e&&e.__esModule)return e;var A={};if(e!=null)for(var t in e)if(t!=="default"&&Object.prototype.hasOwnProperty.call(e,t))r(A,e,t);s(A,e);return A};var n=this&&this.__awaiter||function(e,A,t,r){function adopt(e){return e instanceof t?e:new t((function(A){A(e)}))}return new(t||(t=Promise))((function(t,s){function fulfilled(e){try{step(r.next(e))}catch(e){s(e)}}function rejected(e){try{step(r["throw"](e))}catch(e){s(e)}}function step(e){e.done?t(e.value):adopt(e.value).then(fulfilled,rejected)}step((r=r.apply(e,A||[])).next())}))};Object.defineProperty(A,"__esModule",{value:true});const i=o(t(7484));const a=o(t(3228));const c=t(4139);const g=t(2965);const l=t(7279);const E=t(9810);const u=t(9543);const h=t(2405);const Q=t(773);const C=t(5524);const d=t(392);const B=t(3464);const I=t(6982);const p=!!a.context.payload.pull_request;let m=false;let y=false;function main(){return n(this,void 0,void 0,(function*(){try{let{workloads:e,githubToken:A,kubeconfig:t,awsCredentials:r,awsConfig:s,s3Endpoint:o,s3Folder:w,dockerRepo:b,dockerFolder:R,dockerUsername:k,dockerPassword:D,ydbVersion:S,timeBetweenPhases:F,shutdownTime:T,grafanaDomain:N,grafanaDashboard:U,grafanaDashboardWidth:v,grafanaDashboardHeight:L}=(0,c.parseArguments)();i.debug(`Setting up OctoKit`);const G=a.getOctokit(A);(0,g.prepareK8S)(t);(0,g.prepareAWS)(r,s);yield(0,u.dockerLogin)(b,k,D);const M=yield(0,h.getInfrastractureEndpoints)();i.info(`Services pods: ${JSON.stringify(M)}`);i.info("Run SLO tests for: \n"+e.map((e=>{let A=`#${e.id}`;A+=e.name?`(${e.name})\n`:"\n";A+=`path: '${e.path}'\n`;A+=e.buildContext?`build context: '${e.buildContext}'\n`:"";A+=e.buildOptions?`build options: '${e.buildOptions}'\n`:"";return A})).join("==="));const _=e.length>1?e.map((e=>e.id)).join("__+__"):e[0].id;yield(0,l.obtainMutex)(_,Math.ceil(((5+4)*F+T)/60)+1,30);i.info("Mutex obtained!");m=true;const O=e.map((e=>(0,u.generateDockerPath)(b,R,e.id)));i.info("Create cluster and build all workloads");const P=e.map((()=>false));const H=yield Promise.allSettled([(0,E.createCluster)(S,15),...e.map(((e,A)=>(0,u.buildWorkload)(e.id,O[A],e.path,e.buildOptions,e.buildContext).then((()=>{P[A]=true}))))]);const Y=H[0].status==="fulfilled"&&P.filter((e=>e)).length>0;i.debug(`builded: [${P.toString()}], continueRun: ${Y}`);if(H[0].status==="fulfilled"){y=true}if(P.every((e=>e))){i.info("All workloads builded successfully")}else{if(Y){P.map(((A,t)=>{if(!A)i.info(`Error in '${e[t].id}' build`);else i.info(`'${e[t].id}' build successful`)}))}else{i.info("No workloads builded!")}}if(Y){const A=yield Promise.allSettled(e.map(((e,A)=>n(this,void 0,void 0,(function*(){return(0,C.retry)(2,(()=>(0,u.runWorkload)("create",{id:e.id,dockerPath:O[A],timeoutMins:2,args:`--min-partitions-count 6 --max-partitions-count 1000 `+`--partition-size 1 --initial-data-count 1000`})))})))));i.debug("create results: "+JSON.stringify(A));if(A.filter((e=>e.status==="fulfilled")).length===0){throw new Error("No workloads performed `create` action, exit")}else{const A=yield Promise.allSettled([...e.map(((e,A)=>(0,u.runWorkload)("run",{id:e.id,dockerPath:O[A],timeoutMins:Math.ceil(((5+4)*F+T)/60),args:`--time ${(5+2)*F} --shutdown-time ${T} --read-rps 1000 `+`--write-rps 100 --prom-pgw http://prometheus-pushgateway:9091`}))),(0,Q.errorScheduler)(M.grafana,F)]);i.debug("run results: "+JSON.stringify(A));if(A.slice(0,e.length).filter((e=>e.status==="fulfilled")).length===0){i.info("No successfull workload runs!");throw new Error("No workloads runs completed successfully")}else{const t={success_rate:[{filter:{},value:[">",.98]}],max_99_latency:[{filter:{status:"ok"},value:["<",100]},{filter:{status:"err"},value:["<",3e4]}],fail_interval:[{filter:{},value:["<",20]}]};let r=[];A.map(((s,a)=>{if(s.status==="fulfilled"&&a!==A.length-1){const A=s.value;r.push((0,d.checkResults)(G,e[a].id,A.startTime,A.endTime,t));i.debug("isPullRequest="+p);if(p){i.debug("Push to promises grafana screenshot and postComment");r.push((()=>n(this,void 0,void 0,(function*(){var t;const r=yield(0,B.grafanaScreenshot)(o,w,e[a].id,A.startTime,A.endTime,U,v,L);const s=`\n:volcano: Here are results of SLO test for **${(t=e[a].name)!==null&&t!==void 0?t:e[a].id}**:\n\n[Grafana Dashboard](${N}/d/${U}?orgId=1&from=${A.startTime.valueOf()}&to=${A.endTime.valueOf()})\n\n![SLO-${e[a].id}](${r})\n`;yield(0,B.postComment)(G,(0,I.createHash)("sha1").update(e[a].id).digest().readUint16BE(),s)})))())}}}));const s=yield Promise.allSettled(r);i.info("checkResults and grafana screenshot result: "+JSON.stringify(s))}}}(0,E.deleteCluster)();(0,l.releaseMutex)()}catch(e){if(e instanceof Error)i.setFailed(e.message);if(y){try{(0,E.deleteCluster)()}catch(e){i.info("Failed to delete cluster:"+JSON.stringify(e))}}if(m){try{(0,l.releaseMutex)()}catch(e){i.info("Failed to release mutex:"+JSON.stringify(e))}}}}))}i.info("Main SLO action");main()},7063:function(e,A,t){"use strict";var r=this&&this.__importDefault||function(e){return e&&e.__esModule?e:{default:e}};Object.defineProperty(A,"__esModule",{value:true});A.storageManifestTemplate=A.databaseManifestTemplate=A.workloadManifestTemplate=void 0;const s=r(t(8112));const o=r(t(7076));const n=r(t(6046));A.workloadManifestTemplate=s.default["k8s/ci/workload.yaml"].content;A.databaseManifestTemplate=o.default["k8s/ci/database.yaml"].content;A.storageManifestTemplate=n.default["k8s/ci/storage.yaml"].content},7279:function(e,A,t){"use strict";var r=this&&this.__createBinding||(Object.create?function(e,A,t,r){if(r===undefined)r=t;var s=Object.getOwnPropertyDescriptor(A,t);if(!s||("get"in s?!A.__esModule:s.writable||s.configurable)){s={enumerable:true,get:function(){return A[t]}}}Object.defineProperty(e,r,s)}:function(e,A,t,r){if(r===undefined)r=t;e[r]=A[t]});var s=this&&this.__setModuleDefault||(Object.create?function(e,A){Object.defineProperty(e,"default",{enumerable:true,value:A})}:function(e,A){e["default"]=A});var o=this&&this.__importStar||function(e){if(e&&e.__esModule)return e;var A={};if(e!=null)for(var t in e)if(t!=="default"&&Object.prototype.hasOwnProperty.call(e,t))r(A,e,t);s(A,e);return A};var n=this&&this.__awaiter||function(e,A,t,r){function adopt(e){return e instanceof t?e:new t((function(A){A(e)}))}return new(t||(t=Promise))((function(t,s){function fulfilled(e){try{step(r.next(e))}catch(e){s(e)}}function rejected(e){try{step(r["throw"](e))}catch(e){s(e)}}function step(e){e.done?t(e.value):adopt(e.value).then(fulfilled,rejected)}step((r=r.apply(e,A||[])).next())}))};Object.defineProperty(A,"__esModule",{value:true});A.isBusy=isBusy;A.setBusy=setBusy;A.obtainMutex=obtainMutex;A.releaseMutex=releaseMutex;const i=o(t(7484));const a=t(2965);const c=t(672);const g=t(117);function isBusy(e){var A,t,r,s,o;i.debug(`isBusy(${e})`);const n=(0,a.callKubernetes)(`get configmaps ${e} -ojson`);i.debug("isBusy result: "+n);const c=JSON.parse(n);i.debug("configmap parsed: "+JSON.stringify(c));if(((A=c===null||c===void 0?void 0:c.data)===null||A===void 0?void 0:A.busy)!==undefined&&typeof((t=c===null||c===void 0?void 0:c.data)===null||t===void 0?void 0:t.lockedTill)==="string"&&parseInt(c.data.lockedTill)>=Date.now()){i.info(`Mutex locked by ${(r=c===null||c===void 0?void 0:c.data)===null||r===void 0?void 0:r.lockedBy} till ${new Date(parseInt((s=c===null||c===void 0?void 0:c.data)===null||s===void 0?void 0:s.lockedTill))}`);return(o=c===null||c===void 0?void 0:c.data)===null||o===void 0?void 0:o.lockedBy}return false}function setBusy(e,A){i.debug(`setBusy(${e})`);(0,a.callKubernetesPath)((t=>`${t} create configmap slo-mutex --from-literal=busy=true --from-literal=lockedBy=${e} --from-literal=lockedTill=${Date.now()+A*6e4} -o=yaml --dry-run=client | ${t} apply -f -`))}function obtainMutex(e,A,t,r=20){return(0,c.logGroup)("Obtain mutex",(()=>n(this,void 0,void 0,(function*(){return(0,g.withTimeout)(t,r,"Obtain mutex",(()=>{const t=isBusy("slo-mutex");if(typeof t==="boolean"&&!t){i.debug("Set mutex");setBusy(e,A);i.info("Mutex obtained");i.debug("Mutex sleep 5s");(0,a.call)("sleep 5");i.debug("Re-check after sleep");const t=isBusy("slo-mutex");if(t!==e){i.info("Mutex is not obtained!");return false}return true}return false}))}))))}function releaseMutex(){return(0,c.logGroup)("Release mutex",(()=>{(0,a.callKubernetesPath)((e=>`${e} create configmap slo-mutex -o=yaml --dry-run=client | ${e} apply -f -`))}))}},4139:function(e,A,t){"use strict";var r=this&&this.__createBinding||(Object.create?function(e,A,t,r){if(r===undefined)r=t;var s=Object.getOwnPropertyDescriptor(A,t);if(!s||("get"in s?!A.__esModule:s.writable||s.configurable)){s={enumerable:true,get:function(){return A[t]}}}Object.defineProperty(e,r,s)}:function(e,A,t,r){if(r===undefined)r=t;e[r]=A[t]});var s=this&&this.__setModuleDefault||(Object.create?function(e,A){Object.defineProperty(e,"default",{enumerable:true,value:A})}:function(e,A){e["default"]=A});var o=this&&this.__importStar||function(e){if(e&&e.__esModule)return e;var A={};if(e!=null)for(var t in e)if(t!=="default"&&Object.prototype.hasOwnProperty.call(e,t))r(A,e,t);s(A,e);return A};Object.defineProperty(A,"__esModule",{value:true});A.parseArguments=parseArguments;const n=o(t(7484));const i=t(672);const a=t(9810);function parseArguments(){return(0,i.logGroup)("Parse arguments",(()=>{let e=[];let A=-1,t=true;do{const r=getWorkloadParam(A);if(null===r){if(A!==-1)t=false}else{e.push(r)}A++}while(t);const r=n.getInput("GITHUB_TOKEN");const s=n.getInput("KUBECONFIG_B64");const o=n.getInput("DOCKER_REPO");const i=n.getInput("DOCKER_FOLDER");const c=n.getInput("DOCKER_USERNAME");const g=n.getInput("DOCKER_PASSWORD");const l=n.getInput("AWS_CREDENTIALS_B64");const E=n.getInput("AWS_CONFIG_B64");const u=n.getInput("s3_endpoint");const h=n.getInput("s3_images_folder");const Q=n.getInput("grafana_domain");const C=n.getInput("grafana_dashboard")||"7CzMl5t4k";const d=Number(n.getInput("grafana_dashboard_width")||"1500");const B=Number(n.getInput("grafana_dashboard_height")||"1700");let I=n.getInput("ydb_version");const p=Number(n.getInput("time_between_phases")||"20");const m=Number(n.getInput("shutdown_time")||"30");if(isNaN(p))throw new Error("time_between_phases is not a number");if(isNaN(m))throw new Error("shutdown_time is not a number");if(I==="")I="24.1";if(I==="newest"){n.info("Get YDB docker versions");const e=(0,a.getYdbVersions)();I=e[e.length-1];n.info(`Use YDB docker version = '${I}'`)}return{workloads:e,githubToken:r,kubeconfig:s,awsCredentials:l,awsConfig:E,s3Endpoint:u,s3Folder:h,dockerRepo:o,dockerFolder:i,dockerUsername:c,dockerPassword:g,ydbVersion:I,timeBetweenPhases:p,shutdownTime:m,grafanaDomain:Q,grafanaDashboard:C,grafanaDashboardWidth:d,grafanaDashboardHeight:B}}))}function getWorkloadParam(e){let A=e==-1?"":`${e}`;const t=n.getInput("language_id"+A);const r=n.getInput("language"+A);const s=n.getInput("workload_path"+A);const o=n.getInput("workload_build_context"+A);const i=n.getInput("workload_build_options"+A);n.debug(`getWorkloadParam(${e}):\n suffix='${A}'\n languageId='${t}'\n languageName='${r}'\n workloadPath='${s}'\n workloadBuildContext='${o}'\n workloadBuildOptions='${i}'`);if(t.length===0||s.length===0){n.debug(`Not found params for ${e} workload - ${"language_id"+A} and ${"workload_path"+A} are not presented`);return null}let a={id:t,path:s};if(r)a.name=r;if(o)a.buildContext=o;if(i)a.buildOptions=i;return a}},672:function(e,A,t){"use strict";var r=this&&this.__createBinding||(Object.create?function(e,A,t,r){if(r===undefined)r=t;var s=Object.getOwnPropertyDescriptor(A,t);if(!s||("get"in s?!A.__esModule:s.writable||s.configurable)){s={enumerable:true,get:function(){return A[t]}}}Object.defineProperty(e,r,s)}:function(e,A,t,r){if(r===undefined)r=t;e[r]=A[t]});var s=this&&this.__setModuleDefault||(Object.create?function(e,A){Object.defineProperty(e,"default",{enumerable:true,value:A})}:function(e,A){e["default"]=A});var o=this&&this.__importStar||function(e){if(e&&e.__esModule)return e;var A={};if(e!=null)for(var t in e)if(t!=="default"&&Object.prototype.hasOwnProperty.call(e,t))r(A,e,t);s(A,e);return A};Object.defineProperty(A,"__esModule",{value:true});A.logGroup=logGroup;const n=o(t(7484));function logGroup(e,A){n.startGroup(e);const t=A();if(t instanceof Promise){return t.finally((()=>{n.endGroup()}))}else{n.endGroup();return t}}},5524:function(e,A,t){"use strict";var r=this&&this.__createBinding||(Object.create?function(e,A,t,r){if(r===undefined)r=t;var s=Object.getOwnPropertyDescriptor(A,t);if(!s||("get"in s?!A.__esModule:s.writable||s.configurable)){s={enumerable:true,get:function(){return A[t]}}}Object.defineProperty(e,r,s)}:function(e,A,t,r){if(r===undefined)r=t;e[r]=A[t]});var s=this&&this.__setModuleDefault||(Object.create?function(e,A){Object.defineProperty(e,"default",{enumerable:true,value:A})}:function(e,A){e["default"]=A});var o=this&&this.__importStar||function(e){if(e&&e.__esModule)return e;var A={};if(e!=null)for(var t in e)if(t!=="default"&&Object.prototype.hasOwnProperty.call(e,t))r(A,e,t);s(A,e);return A};var n=this&&this.__awaiter||function(e,A,t,r){function adopt(e){return e instanceof t?e:new t((function(A){A(e)}))}return new(t||(t=Promise))((function(t,s){function fulfilled(e){try{step(r.next(e))}catch(e){s(e)}}function rejected(e){try{step(r["throw"](e))}catch(e){s(e)}}function step(e){e.done?t(e.value):adopt(e.value).then(fulfilled,rejected)}step((r=r.apply(e,A||[])).next())}))};Object.defineProperty(A,"__esModule",{value:true});A.retry=retry;const i=o(t(7484));function retry(e,A){return n(this,void 0,void 0,(function*(){let t;while(e>0){try{return yield A()}catch(e){t=e}e--}i.info("All retries have been used, re-throwing error");throw t}))}},117:function(e,A,t){"use strict";var r=this&&this.__createBinding||(Object.create?function(e,A,t,r){if(r===undefined)r=t;var s=Object.getOwnPropertyDescriptor(A,t);if(!s||("get"in s?!A.__esModule:s.writable||s.configurable)){s={enumerable:true,get:function(){return A[t]}}}Object.defineProperty(e,r,s)}:function(e,A,t,r){if(r===undefined)r=t;e[r]=A[t]});var s=this&&this.__setModuleDefault||(Object.create?function(e,A){Object.defineProperty(e,"default",{enumerable:true,value:A})}:function(e,A){e["default"]=A});var o=this&&this.__importStar||function(e){if(e&&e.__esModule)return e;var A={};if(e!=null)for(var t in e)if(t!=="default"&&Object.prototype.hasOwnProperty.call(e,t))r(A,e,t);s(A,e);return A};var n=this&&this.__awaiter||function(e,A,t,r){function adopt(e){return e instanceof t?e:new t((function(A){A(e)}))}return new(t||(t=Promise))((function(t,s){function fulfilled(e){try{step(r.next(e))}catch(e){s(e)}}function rejected(e){try{step(r["throw"](e))}catch(e){s(e)}}function step(e){e.done?t(e.value):adopt(e.value).then(fulfilled,rejected)}step((r=r.apply(e,A||[])).next())}))};Object.defineProperty(A,"__esModule",{value:true});A.TimeoutExceededError=void 0;A.withTimeout=withTimeout;A.withTimeoutSimple=withTimeoutSimple;const i=o(t(7484));class TimeoutExceededError extends Error{}A.TimeoutExceededError=TimeoutExceededError;function withTimeout(e,A,t,r){return n(this,void 0,void 0,(function*(){i.debug(`Call withTimeout: timeout=${e}mins refreshPeriod=${A}s now: ${(new Date).toISOString()}`);const s=(new Date).valueOf()+e*1e3*60;i.debug(`Deadline is set to: ${s} ( ${new Date(s).toISOString()} )`);do{i.debug(`withTimeout check: ${s} ( ${new Date(s).toISOString()} )`);if(yield r())return;yield new Promise((e=>setTimeout(e,A*1e3)))}while((new Date).valueOf()setTimeout(t,e*1e3)));return Promise.race([A,t])}))}},9543:function(e,A,t){"use strict";var r=this&&this.__createBinding||(Object.create?function(e,A,t,r){if(r===undefined)r=t;var s=Object.getOwnPropertyDescriptor(A,t);if(!s||("get"in s?!A.__esModule:s.writable||s.configurable)){s={enumerable:true,get:function(){return A[t]}}}Object.defineProperty(e,r,s)}:function(e,A,t,r){if(r===undefined)r=t;e[r]=A[t]});var s=this&&this.__setModuleDefault||(Object.create?function(e,A){Object.defineProperty(e,"default",{enumerable:true,value:A})}:function(e,A){e["default"]=A});var o=this&&this.__importStar||function(e){if(e&&e.__esModule)return e;var A={};if(e!=null)for(var t in e)if(t!=="default"&&Object.prototype.hasOwnProperty.call(e,t))r(A,e,t);s(A,e);return A};var n=this&&this.__awaiter||function(e,A,t,r){function adopt(e){return e instanceof t?e:new t((function(A){A(e)}))}return new(t||(t=Promise))((function(t,s){function fulfilled(e){try{step(r.next(e))}catch(e){s(e)}}function rejected(e){try{step(r["throw"](e))}catch(e){s(e)}}function step(e){e.done?t(e.value):adopt(e.value).then(fulfilled,rejected)}step((r=r.apply(e,A||[])).next())}))};Object.defineProperty(A,"__esModule",{value:true});A.dockerLogin=dockerLogin;A.generateDockerPath=generateDockerPath;A.buildWorkload=buildWorkload;A.runWorkload=runWorkload;const i=o(t(7484));const a=o(t(3228));const c=t(2965);const g=t(672);const l=t(7063);const E=t(117);const u=t(9896);function dockerLogin(e,A,t){return(0,g.logGroup)("Docker login",(()=>n(this,void 0,void 0,(function*(){try{yield(0,c.callAsync)(`echo "${t}" | base64 -d | docker login ${e} -u ${A} --password-stdin`,true);i.info("Successfully logged in")}catch(e){const A="Incorrect docker repo, username or password";if((e===null||e===void 0?void 0:e.message)&&(e===null||e===void 0?void 0:e.message).indexOf("username or password")>-1){i.info(A)}else{i.info("Something went wrong in docker login")}throw new Error(A)}}))))}function generateDockerPath(e,A,t){return`${e}/${A}/${t}`}function buildWorkload(e,A,t,r,s){if(!r||r.length===0)r="";if(!s||s.length===0)s=".";return i.group(`Build workload ${e}`,(()=>n(this,void 0,void 0,(function*(){i.info("Build docker image");yield(0,c.callAsync)(`docker buildx build --platform linux/amd64 `+`-t ${A}:latest `+`-t ${A}:gh-${a.context.sha} `+`${r} `+`${s}`,false,t);i.info("Push docker tag @latest");yield(0,c.callAsync)(`docker image push ${A}:latest`);i.info(`Push docker tag '@gh-${a.context.sha}'`);yield(0,c.callAsync)(`docker image push ${A}:gh-${a.context.sha}`)}))))}function runWorkload(e,A){return i.group(`Workload ${A.id} - ${e}`,(()=>n(this,void 0,void 0,(function*(){const t=`grpc://database-sample-grpc:2135 /root/database-sample --table-name slo-${A.id} ${A.args}`;const r=l.workloadManifestTemplate.replace(/\$\{\{LANGUAGE_ID}}/g,A.id).replace(/\$\{\{COMMAND}}/g,e).replace(/\$\{\{DOCKER_IMAGE}}/g,A.dockerPath).replace("${{ARGS}}",t.split(" ").map((e=>`'${e}'`)).join("\n - "));i.debug(`Workload manifest: \n\n${r}`);const s=new Date;i.info(`Workload apply ${e} result:\n`+(yield(0,c.callKubernetesPathAsync)((e=>`${e} apply -f - <n(this,void 0,void 0,(function*(){const t=JSON.parse(yield(0,c.callKubernetesAsync)(`get job/${A.id}-wl-${e} -o=jsonpath={.status}`));i.debug("Workload status check: "+JSON.stringify(t));if(t.failed){const t=`Workload ${A.id} ${e} failed`;i.info(t);yield saveLogs(A.id,e);throw new Error(t)}return t.complete||t.succeeded}))))}finally{const t=new Date;yield saveLogs(A.id,e);return{startTime:s,endTime:t}}}))))}function saveLogs(e,A){return n(this,void 0,void 0,(function*(){let t=yield(0,c.callKubernetesAsync)(`logs job/${e}-wl-${A}`);try{let r="./logs";if(!u.existsSync(r)){yield u.promises.mkdir(r)}yield u.promises.writeFile(`${r}/${e}-${A}.log`,t)}catch(r){i.info(`error write file for ${e}-${A}: ${r.message}`);i.group(`Workload ${e} ${A} logs`,(()=>n(this,void 0,void 0,(function*(){i.info(t)}))))}}))}},4914:function(e,A,t){"use strict";var r=this&&this.__createBinding||(Object.create?function(e,A,t,r){if(r===undefined)r=t;var s=Object.getOwnPropertyDescriptor(A,t);if(!s||("get"in s?!A.__esModule:s.writable||s.configurable)){s={enumerable:true,get:function(){return A[t]}}}Object.defineProperty(e,r,s)}:function(e,A,t,r){if(r===undefined)r=t;e[r]=A[t]});var s=this&&this.__setModuleDefault||(Object.create?function(e,A){Object.defineProperty(e,"default",{enumerable:true,value:A})}:function(e,A){e["default"]=A});var o=this&&this.__importStar||function(e){if(e&&e.__esModule)return e;var A={};if(e!=null)for(var t in e)if(t!=="default"&&Object.prototype.hasOwnProperty.call(e,t))r(A,e,t);s(A,e);return A};Object.defineProperty(A,"__esModule",{value:true});A.issue=A.issueCommand=void 0;const n=o(t(857));const i=t(302);function issueCommand(e,A,t){const r=new Command(e,A,t);process.stdout.write(r.toString()+n.EOL)}A.issueCommand=issueCommand;function issue(e,A=""){issueCommand(e,{},A)}A.issue=issue;const a="::";class Command{constructor(e,A,t){if(!e){e="missing.command"}this.command=e;this.properties=A;this.message=t}toString(){let e=a+this.command;if(this.properties&&Object.keys(this.properties).length>0){e+=" ";let A=true;for(const t in this.properties){if(this.properties.hasOwnProperty(t)){const r=this.properties[t];if(r){if(A){A=false}else{e+=","}e+=`${t}=${escapeProperty(r)}`}}}}e+=`${a}${escapeData(this.message)}`;return e}}function escapeData(e){return(0,i.toCommandValue)(e).replace(/%/g,"%25").replace(/\r/g,"%0D").replace(/\n/g,"%0A")}function escapeProperty(e){return(0,i.toCommandValue)(e).replace(/%/g,"%25").replace(/\r/g,"%0D").replace(/\n/g,"%0A").replace(/:/g,"%3A").replace(/,/g,"%2C")}},7484:function(e,A,t){"use strict";var r=this&&this.__createBinding||(Object.create?function(e,A,t,r){if(r===undefined)r=t;var s=Object.getOwnPropertyDescriptor(A,t);if(!s||("get"in s?!A.__esModule:s.writable||s.configurable)){s={enumerable:true,get:function(){return A[t]}}}Object.defineProperty(e,r,s)}:function(e,A,t,r){if(r===undefined)r=t;e[r]=A[t]});var s=this&&this.__setModuleDefault||(Object.create?function(e,A){Object.defineProperty(e,"default",{enumerable:true,value:A})}:function(e,A){e["default"]=A});var o=this&&this.__importStar||function(e){if(e&&e.__esModule)return e;var A={};if(e!=null)for(var t in e)if(t!=="default"&&Object.prototype.hasOwnProperty.call(e,t))r(A,e,t);s(A,e);return A};var n=this&&this.__awaiter||function(e,A,t,r){function adopt(e){return e instanceof t?e:new t((function(A){A(e)}))}return new(t||(t=Promise))((function(t,s){function fulfilled(e){try{step(r.next(e))}catch(e){s(e)}}function rejected(e){try{step(r["throw"](e))}catch(e){s(e)}}function step(e){e.done?t(e.value):adopt(e.value).then(fulfilled,rejected)}step((r=r.apply(e,A||[])).next())}))};Object.defineProperty(A,"__esModule",{value:true});A.platform=A.toPlatformPath=A.toWin32Path=A.toPosixPath=A.markdownSummary=A.summary=A.getIDToken=A.getState=A.saveState=A.group=A.endGroup=A.startGroup=A.info=A.notice=A.warning=A.error=A.debug=A.isDebug=A.setFailed=A.setCommandEcho=A.setOutput=A.getBooleanInput=A.getMultilineInput=A.getInput=A.addPath=A.setSecret=A.exportVariable=A.ExitCode=void 0;const i=t(4914);const a=t(4753);const c=t(302);const g=o(t(857));const l=o(t(6928));const E=t(5306);var u;(function(e){e[e["Success"]=0]="Success";e[e["Failure"]=1]="Failure"})(u||(A.ExitCode=u={}));function exportVariable(e,A){const t=(0,c.toCommandValue)(A);process.env[e]=t;const r=process.env["GITHUB_ENV"]||"";if(r){return(0,a.issueFileCommand)("ENV",(0,a.prepareKeyValueMessage)(e,A))}(0,i.issueCommand)("set-env",{name:e},t)}A.exportVariable=exportVariable;function setSecret(e){(0,i.issueCommand)("add-mask",{},e)}A.setSecret=setSecret;function addPath(e){const A=process.env["GITHUB_PATH"]||"";if(A){(0,a.issueFileCommand)("PATH",e)}else{(0,i.issueCommand)("add-path",{},e)}process.env["PATH"]=`${e}${l.delimiter}${process.env["PATH"]}`}A.addPath=addPath;function getInput(e,A){const t=process.env[`INPUT_${e.replace(/ /g,"_").toUpperCase()}`]||"";if(A&&A.required&&!t){throw new Error(`Input required and not supplied: ${e}`)}if(A&&A.trimWhitespace===false){return t}return t.trim()}A.getInput=getInput;function getMultilineInput(e,A){const t=getInput(e,A).split("\n").filter((e=>e!==""));if(A&&A.trimWhitespace===false){return t}return t.map((e=>e.trim()))}A.getMultilineInput=getMultilineInput;function getBooleanInput(e,A){const t=["true","True","TRUE"];const r=["false","False","FALSE"];const s=getInput(e,A);if(t.includes(s))return true;if(r.includes(s))return false;throw new TypeError(`Input does not meet YAML 1.2 "Core Schema" specification: ${e}\n`+`Support boolean input list: \`true | True | TRUE | false | False | FALSE\``)}A.getBooleanInput=getBooleanInput;function setOutput(e,A){const t=process.env["GITHUB_OUTPUT"]||"";if(t){return(0,a.issueFileCommand)("OUTPUT",(0,a.prepareKeyValueMessage)(e,A))}process.stdout.write(g.EOL);(0,i.issueCommand)("set-output",{name:e},(0,c.toCommandValue)(A))}A.setOutput=setOutput;function setCommandEcho(e){(0,i.issue)("echo",e?"on":"off")}A.setCommandEcho=setCommandEcho;function setFailed(e){process.exitCode=u.Failure;error(e)}A.setFailed=setFailed;function isDebug(){return process.env["RUNNER_DEBUG"]==="1"}A.isDebug=isDebug;function debug(e){(0,i.issueCommand)("debug",{},e)}A.debug=debug;function error(e,A={}){(0,i.issueCommand)("error",(0,c.toCommandProperties)(A),e instanceof Error?e.toString():e)}A.error=error;function warning(e,A={}){(0,i.issueCommand)("warning",(0,c.toCommandProperties)(A),e instanceof Error?e.toString():e)}A.warning=warning;function notice(e,A={}){(0,i.issueCommand)("notice",(0,c.toCommandProperties)(A),e instanceof Error?e.toString():e)}A.notice=notice;function info(e){process.stdout.write(e+g.EOL)}A.info=info;function startGroup(e){(0,i.issue)("group",e)}A.startGroup=startGroup;function endGroup(){(0,i.issue)("endgroup")}A.endGroup=endGroup;function group(e,A){return n(this,void 0,void 0,(function*(){startGroup(e);let t;try{t=yield A()}finally{endGroup()}return t}))}A.group=group;function saveState(e,A){const t=process.env["GITHUB_STATE"]||"";if(t){return(0,a.issueFileCommand)("STATE",(0,a.prepareKeyValueMessage)(e,A))}(0,i.issueCommand)("save-state",{name:e},(0,c.toCommandValue)(A))}A.saveState=saveState;function getState(e){return process.env[`STATE_${e}`]||""}A.getState=getState;function getIDToken(e){return n(this,void 0,void 0,(function*(){return yield E.OidcClient.getIDToken(e)}))}A.getIDToken=getIDToken;var h=t(1847);Object.defineProperty(A,"summary",{enumerable:true,get:function(){return h.summary}});var Q=t(1847);Object.defineProperty(A,"markdownSummary",{enumerable:true,get:function(){return Q.markdownSummary}});var C=t(1976);Object.defineProperty(A,"toPosixPath",{enumerable:true,get:function(){return C.toPosixPath}});Object.defineProperty(A,"toWin32Path",{enumerable:true,get:function(){return C.toWin32Path}});Object.defineProperty(A,"toPlatformPath",{enumerable:true,get:function(){return C.toPlatformPath}});A.platform=o(t(8968))},4753:function(e,A,t){"use strict";var r=this&&this.__createBinding||(Object.create?function(e,A,t,r){if(r===undefined)r=t;var s=Object.getOwnPropertyDescriptor(A,t);if(!s||("get"in s?!A.__esModule:s.writable||s.configurable)){s={enumerable:true,get:function(){return A[t]}}}Object.defineProperty(e,r,s)}:function(e,A,t,r){if(r===undefined)r=t;e[r]=A[t]});var s=this&&this.__setModuleDefault||(Object.create?function(e,A){Object.defineProperty(e,"default",{enumerable:true,value:A})}:function(e,A){e["default"]=A});var o=this&&this.__importStar||function(e){if(e&&e.__esModule)return e;var A={};if(e!=null)for(var t in e)if(t!=="default"&&Object.prototype.hasOwnProperty.call(e,t))r(A,e,t);s(A,e);return A};Object.defineProperty(A,"__esModule",{value:true});A.prepareKeyValueMessage=A.issueFileCommand=void 0;const n=o(t(9896));const i=o(t(857));const a=t(302);function issueFileCommand(e,A){const t=process.env[`GITHUB_${e}`];if(!t){throw new Error(`Unable to find environment variable for file command ${e}`)}if(!n.existsSync(t)){throw new Error(`Missing file at path: ${t}`)}n.appendFileSync(t,`${(0,a.toCommandValue)(A)}${i.EOL}`,{encoding:"utf8"})}A.issueFileCommand=issueFileCommand;function prepareKeyValueMessage(e,A){const t=`ghadelimiter_${crypto.randomUUID()}`;const r=(0,a.toCommandValue)(A);if(e.includes(t)){throw new Error(`Unexpected input: name should not contain the delimiter "${t}"`)}if(r.includes(t)){throw new Error(`Unexpected input: value should not contain the delimiter "${t}"`)}return`${e}<<${t}${i.EOL}${r}${i.EOL}${t}`}A.prepareKeyValueMessage=prepareKeyValueMessage},5306:function(e,A,t){"use strict";var r=this&&this.__awaiter||function(e,A,t,r){function adopt(e){return e instanceof t?e:new t((function(A){A(e)}))}return new(t||(t=Promise))((function(t,s){function fulfilled(e){try{step(r.next(e))}catch(e){s(e)}}function rejected(e){try{step(r["throw"](e))}catch(e){s(e)}}function step(e){e.done?t(e.value):adopt(e.value).then(fulfilled,rejected)}step((r=r.apply(e,A||[])).next())}))};Object.defineProperty(A,"__esModule",{value:true});A.OidcClient=void 0;const s=t(4844);const o=t(4552);const n=t(7484);class OidcClient{static createHttpClient(e=true,A=10){const t={allowRetries:e,maxRetries:A};return new s.HttpClient("actions/oidc-client",[new o.BearerCredentialHandler(OidcClient.getRequestToken())],t)}static getRequestToken(){const e=process.env["ACTIONS_ID_TOKEN_REQUEST_TOKEN"];if(!e){throw new Error("Unable to get ACTIONS_ID_TOKEN_REQUEST_TOKEN env variable")}return e}static getIDTokenUrl(){const e=process.env["ACTIONS_ID_TOKEN_REQUEST_URL"];if(!e){throw new Error("Unable to get ACTIONS_ID_TOKEN_REQUEST_URL env variable")}return e}static getCall(e){var A;return r(this,void 0,void 0,(function*(){const t=OidcClient.createHttpClient();const r=yield t.getJson(e).catch((e=>{throw new Error(`Failed to get ID Token. \n \n Error Code : ${e.statusCode}\n \n Error Message: ${e.message}`)}));const s=(A=r.result)===null||A===void 0?void 0:A.value;if(!s){throw new Error("Response json body do not have ID Token field")}return s}))}static getIDToken(e){return r(this,void 0,void 0,(function*(){try{let A=OidcClient.getIDTokenUrl();if(e){const t=encodeURIComponent(e);A=`${A}&audience=${t}`}(0,n.debug)(`ID token url is ${A}`);const t=yield OidcClient.getCall(A);(0,n.setSecret)(t);return t}catch(e){throw new Error(`Error message: ${e.message}`)}}))}}A.OidcClient=OidcClient},1976:function(e,A,t){"use strict";var r=this&&this.__createBinding||(Object.create?function(e,A,t,r){if(r===undefined)r=t;var s=Object.getOwnPropertyDescriptor(A,t);if(!s||("get"in s?!A.__esModule:s.writable||s.configurable)){s={enumerable:true,get:function(){return A[t]}}}Object.defineProperty(e,r,s)}:function(e,A,t,r){if(r===undefined)r=t;e[r]=A[t]});var s=this&&this.__setModuleDefault||(Object.create?function(e,A){Object.defineProperty(e,"default",{enumerable:true,value:A})}:function(e,A){e["default"]=A});var o=this&&this.__importStar||function(e){if(e&&e.__esModule)return e;var A={};if(e!=null)for(var t in e)if(t!=="default"&&Object.prototype.hasOwnProperty.call(e,t))r(A,e,t);s(A,e);return A};Object.defineProperty(A,"__esModule",{value:true});A.toPlatformPath=A.toWin32Path=A.toPosixPath=void 0;const n=o(t(6928));function toPosixPath(e){return e.replace(/[\\]/g,"/")}A.toPosixPath=toPosixPath;function toWin32Path(e){return e.replace(/[/]/g,"\\")}A.toWin32Path=toWin32Path;function toPlatformPath(e){return e.replace(/[/\\]/g,n.sep)}A.toPlatformPath=toPlatformPath},8968:function(e,A,t){"use strict";var r=this&&this.__createBinding||(Object.create?function(e,A,t,r){if(r===undefined)r=t;var s=Object.getOwnPropertyDescriptor(A,t);if(!s||("get"in s?!A.__esModule:s.writable||s.configurable)){s={enumerable:true,get:function(){return A[t]}}}Object.defineProperty(e,r,s)}:function(e,A,t,r){if(r===undefined)r=t;e[r]=A[t]});var s=this&&this.__setModuleDefault||(Object.create?function(e,A){Object.defineProperty(e,"default",{enumerable:true,value:A})}:function(e,A){e["default"]=A});var o=this&&this.__importStar||function(e){if(e&&e.__esModule)return e;var A={};if(e!=null)for(var t in e)if(t!=="default"&&Object.prototype.hasOwnProperty.call(e,t))r(A,e,t);s(A,e);return A};var n=this&&this.__awaiter||function(e,A,t,r){function adopt(e){return e instanceof t?e:new t((function(A){A(e)}))}return new(t||(t=Promise))((function(t,s){function fulfilled(e){try{step(r.next(e))}catch(e){s(e)}}function rejected(e){try{step(r["throw"](e))}catch(e){s(e)}}function step(e){e.done?t(e.value):adopt(e.value).then(fulfilled,rejected)}step((r=r.apply(e,A||[])).next())}))};var i=this&&this.__importDefault||function(e){return e&&e.__esModule?e:{default:e}};Object.defineProperty(A,"__esModule",{value:true});A.getDetails=A.isLinux=A.isMacOS=A.isWindows=A.arch=A.platform=void 0;const a=i(t(857));const c=o(t(5236));const getWindowsInfo=()=>n(void 0,void 0,void 0,(function*(){const{stdout:e}=yield c.getExecOutput('powershell -command "(Get-CimInstance -ClassName Win32_OperatingSystem).Version"',undefined,{silent:true});const{stdout:A}=yield c.getExecOutput('powershell -command "(Get-CimInstance -ClassName Win32_OperatingSystem).Caption"',undefined,{silent:true});return{name:A.trim(),version:e.trim()}}));const getMacOsInfo=()=>n(void 0,void 0,void 0,(function*(){var e,A,t,r;const{stdout:s}=yield c.getExecOutput("sw_vers",undefined,{silent:true});const o=(A=(e=s.match(/ProductVersion:\s*(.+)/))===null||e===void 0?void 0:e[1])!==null&&A!==void 0?A:"";const n=(r=(t=s.match(/ProductName:\s*(.+)/))===null||t===void 0?void 0:t[1])!==null&&r!==void 0?r:"";return{name:n,version:o}}));const getLinuxInfo=()=>n(void 0,void 0,void 0,(function*(){const{stdout:e}=yield c.getExecOutput("lsb_release",["-i","-r","-s"],{silent:true});const[A,t]=e.trim().split("\n");return{name:A,version:t}}));A.platform=a.default.platform();A.arch=a.default.arch();A.isWindows=A.platform==="win32";A.isMacOS=A.platform==="darwin";A.isLinux=A.platform==="linux";function getDetails(){return n(this,void 0,void 0,(function*(){return Object.assign(Object.assign({},yield A.isWindows?getWindowsInfo():A.isMacOS?getMacOsInfo():getLinuxInfo()),{platform:A.platform,arch:A.arch,isWindows:A.isWindows,isMacOS:A.isMacOS,isLinux:A.isLinux})}))}A.getDetails=getDetails},1847:function(e,A,t){"use strict";var r=this&&this.__awaiter||function(e,A,t,r){function adopt(e){return e instanceof t?e:new t((function(A){A(e)}))}return new(t||(t=Promise))((function(t,s){function fulfilled(e){try{step(r.next(e))}catch(e){s(e)}}function rejected(e){try{step(r["throw"](e))}catch(e){s(e)}}function step(e){e.done?t(e.value):adopt(e.value).then(fulfilled,rejected)}step((r=r.apply(e,A||[])).next())}))};Object.defineProperty(A,"__esModule",{value:true});A.summary=A.markdownSummary=A.SUMMARY_DOCS_URL=A.SUMMARY_ENV_VAR=void 0;const s=t(857);const o=t(9896);const{access:n,appendFile:i,writeFile:a}=o.promises;A.SUMMARY_ENV_VAR="GITHUB_STEP_SUMMARY";A.SUMMARY_DOCS_URL="https://docs.github.com/actions/using-workflows/workflow-commands-for-github-actions#adding-a-job-summary";class Summary{constructor(){this._buffer=""}filePath(){return r(this,void 0,void 0,(function*(){if(this._filePath){return this._filePath}const e=process.env[A.SUMMARY_ENV_VAR];if(!e){throw new Error(`Unable to find environment variable for $${A.SUMMARY_ENV_VAR}. Check if your runtime environment supports job summaries.`)}try{yield n(e,o.constants.R_OK|o.constants.W_OK)}catch(A){throw new Error(`Unable to access summary file: '${e}'. Check if the file has correct read/write permissions.`)}this._filePath=e;return this._filePath}))}wrap(e,A,t={}){const r=Object.entries(t).map((([e,A])=>` ${e}="${A}"`)).join("");if(!A){return`<${e}${r}>`}return`<${e}${r}>${A}`}write(e){return r(this,void 0,void 0,(function*(){const A=!!(e===null||e===void 0?void 0:e.overwrite);const t=yield this.filePath();const r=A?a:i;yield r(t,this._buffer,{encoding:"utf8"});return this.emptyBuffer()}))}clear(){return r(this,void 0,void 0,(function*(){return this.emptyBuffer().write({overwrite:true})}))}stringify(){return this._buffer}isEmptyBuffer(){return this._buffer.length===0}emptyBuffer(){this._buffer="";return this}addRaw(e,A=false){this._buffer+=e;return A?this.addEOL():this}addEOL(){return this.addRaw(s.EOL)}addCodeBlock(e,A){const t=Object.assign({},A&&{lang:A});const r=this.wrap("pre",this.wrap("code",e),t);return this.addRaw(r).addEOL()}addList(e,A=false){const t=A?"ol":"ul";const r=e.map((e=>this.wrap("li",e))).join("");const s=this.wrap(t,r);return this.addRaw(s).addEOL()}addTable(e){const A=e.map((e=>{const A=e.map((e=>{if(typeof e==="string"){return this.wrap("td",e)}const{header:A,data:t,colspan:r,rowspan:s}=e;const o=A?"th":"td";const n=Object.assign(Object.assign({},r&&{colspan:r}),s&&{rowspan:s});return this.wrap(o,t,n)})).join("");return this.wrap("tr",A)})).join("");const t=this.wrap("table",A);return this.addRaw(t).addEOL()}addDetails(e,A){const t=this.wrap("details",this.wrap("summary",e)+A);return this.addRaw(t).addEOL()}addImage(e,A,t){const{width:r,height:s}=t||{};const o=Object.assign(Object.assign({},r&&{width:r}),s&&{height:s});const n=this.wrap("img",null,Object.assign({src:e,alt:A},o));return this.addRaw(n).addEOL()}addHeading(e,A){const t=`h${A}`;const r=["h1","h2","h3","h4","h5","h6"].includes(t)?t:"h1";const s=this.wrap(r,e);return this.addRaw(s).addEOL()}addSeparator(){const e=this.wrap("hr",null);return this.addRaw(e).addEOL()}addBreak(){const e=this.wrap("br",null);return this.addRaw(e).addEOL()}addQuote(e,A){const t=Object.assign({},A&&{cite:A});const r=this.wrap("blockquote",e,t);return this.addRaw(r).addEOL()}addLink(e,A){const t=this.wrap("a",e,{href:A});return this.addRaw(t).addEOL()}}const c=new Summary;A.markdownSummary=c;A.summary=c},302:(e,A)=>{"use strict";Object.defineProperty(A,"__esModule",{value:true});A.toCommandProperties=A.toCommandValue=void 0;function toCommandValue(e){if(e===null||e===undefined){return""}else if(typeof e==="string"||e instanceof String){return e}return JSON.stringify(e)}A.toCommandValue=toCommandValue;function toCommandProperties(e){if(!Object.keys(e).length){return{}}return{title:e.title,file:e.file,line:e.startLine,endLine:e.endLine,col:e.startColumn,endColumn:e.endColumn}}A.toCommandProperties=toCommandProperties},5236:function(e,A,t){"use strict";var r=this&&this.__createBinding||(Object.create?function(e,A,t,r){if(r===undefined)r=t;Object.defineProperty(e,r,{enumerable:true,get:function(){return A[t]}})}:function(e,A,t,r){if(r===undefined)r=t;e[r]=A[t]});var s=this&&this.__setModuleDefault||(Object.create?function(e,A){Object.defineProperty(e,"default",{enumerable:true,value:A})}:function(e,A){e["default"]=A});var o=this&&this.__importStar||function(e){if(e&&e.__esModule)return e;var A={};if(e!=null)for(var t in e)if(t!=="default"&&Object.hasOwnProperty.call(e,t))r(A,e,t);s(A,e);return A};var n=this&&this.__awaiter||function(e,A,t,r){function adopt(e){return e instanceof t?e:new t((function(A){A(e)}))}return new(t||(t=Promise))((function(t,s){function fulfilled(e){try{step(r.next(e))}catch(e){s(e)}}function rejected(e){try{step(r["throw"](e))}catch(e){s(e)}}function step(e){e.done?t(e.value):adopt(e.value).then(fulfilled,rejected)}step((r=r.apply(e,A||[])).next())}))};Object.defineProperty(A,"__esModule",{value:true});A.getExecOutput=A.exec=void 0;const i=t(3193);const a=o(t(6665));function exec(e,A,t){return n(this,void 0,void 0,(function*(){const r=a.argStringToArray(e);if(r.length===0){throw new Error(`Parameter 'commandLine' cannot be null or empty.`)}const s=r[0];A=r.slice(1).concat(A||[]);const o=new a.ToolRunner(s,A,t);return o.exec()}))}A.exec=exec;function getExecOutput(e,A,t){var r,s;return n(this,void 0,void 0,(function*(){let o="";let n="";const a=new i.StringDecoder("utf8");const c=new i.StringDecoder("utf8");const g=(r=t===null||t===void 0?void 0:t.listeners)===null||r===void 0?void 0:r.stdout;const l=(s=t===null||t===void 0?void 0:t.listeners)===null||s===void 0?void 0:s.stderr;const stdErrListener=e=>{n+=c.write(e);if(l){l(e)}};const stdOutListener=e=>{o+=a.write(e);if(g){g(e)}};const E=Object.assign(Object.assign({},t===null||t===void 0?void 0:t.listeners),{stdout:stdOutListener,stderr:stdErrListener});const u=yield exec(e,A,Object.assign(Object.assign({},t),{listeners:E}));o+=a.end();n+=c.end();return{exitCode:u,stdout:o,stderr:n}}))}A.getExecOutput=getExecOutput},6665:function(e,A,t){"use strict";var r=this&&this.__createBinding||(Object.create?function(e,A,t,r){if(r===undefined)r=t;Object.defineProperty(e,r,{enumerable:true,get:function(){return A[t]}})}:function(e,A,t,r){if(r===undefined)r=t;e[r]=A[t]});var s=this&&this.__setModuleDefault||(Object.create?function(e,A){Object.defineProperty(e,"default",{enumerable:true,value:A})}:function(e,A){e["default"]=A});var o=this&&this.__importStar||function(e){if(e&&e.__esModule)return e;var A={};if(e!=null)for(var t in e)if(t!=="default"&&Object.hasOwnProperty.call(e,t))r(A,e,t);s(A,e);return A};var n=this&&this.__awaiter||function(e,A,t,r){function adopt(e){return e instanceof t?e:new t((function(A){A(e)}))}return new(t||(t=Promise))((function(t,s){function fulfilled(e){try{step(r.next(e))}catch(e){s(e)}}function rejected(e){try{step(r["throw"](e))}catch(e){s(e)}}function step(e){e.done?t(e.value):adopt(e.value).then(fulfilled,rejected)}step((r=r.apply(e,A||[])).next())}))};Object.defineProperty(A,"__esModule",{value:true});A.argStringToArray=A.ToolRunner=void 0;const i=o(t(857));const a=o(t(4434));const c=o(t(5317));const g=o(t(6928));const l=o(t(4994));const E=o(t(5207));const u=t(3557);const h=process.platform==="win32";class ToolRunner extends a.EventEmitter{constructor(e,A,t){super();if(!e){throw new Error("Parameter 'toolPath' cannot be null or empty.")}this.toolPath=e;this.args=A||[];this.options=t||{}}_debug(e){if(this.options.listeners&&this.options.listeners.debug){this.options.listeners.debug(e)}}_getCommandString(e,A){const t=this._getSpawnFileName();const r=this._getSpawnArgs(e);let s=A?"":"[command]";if(h){if(this._isCmdFile()){s+=t;for(const e of r){s+=` ${e}`}}else if(e.windowsVerbatimArguments){s+=`"${t}"`;for(const e of r){s+=` ${e}`}}else{s+=this._windowsQuoteCmdArg(t);for(const e of r){s+=` ${this._windowsQuoteCmdArg(e)}`}}}else{s+=t;for(const e of r){s+=` ${e}`}}return s}_processLineBuffer(e,A,t){try{let r=A+e.toString();let s=r.indexOf(i.EOL);while(s>-1){const e=r.substring(0,s);t(e);r=r.substring(s+i.EOL.length);s=r.indexOf(i.EOL)}return r}catch(e){this._debug(`error processing line. Failed with error ${e}`);return""}}_getSpawnFileName(){if(h){if(this._isCmdFile()){return process.env["COMSPEC"]||"cmd.exe"}}return this.toolPath}_getSpawnArgs(e){if(h){if(this._isCmdFile()){let A=`/D /S /C "${this._windowsQuoteCmdArg(this.toolPath)}`;for(const t of this.args){A+=" ";A+=e.windowsVerbatimArguments?t:this._windowsQuoteCmdArg(t)}A+='"';return[A]}}return this.args}_endsWith(e,A){return e.endsWith(A)}_isCmdFile(){const e=this.toolPath.toUpperCase();return this._endsWith(e,".CMD")||this._endsWith(e,".BAT")}_windowsQuoteCmdArg(e){if(!this._isCmdFile()){return this._uvQuoteCmdArg(e)}if(!e){return'""'}const A=[" ","\t","&","(",")","[","]","{","}","^","=",";","!","'","+",",","`","~","|","<",">",'"'];let t=false;for(const r of e){if(A.some((e=>e===r))){t=true;break}}if(!t){return e}let r='"';let s=true;for(let A=e.length;A>0;A--){r+=e[A-1];if(s&&e[A-1]==="\\"){r+="\\"}else if(e[A-1]==='"'){s=true;r+='"'}else{s=false}}r+='"';return r.split("").reverse().join("")}_uvQuoteCmdArg(e){if(!e){return'""'}if(!e.includes(" ")&&!e.includes("\t")&&!e.includes('"')){return e}if(!e.includes('"')&&!e.includes("\\")){return`"${e}"`}let A='"';let t=true;for(let r=e.length;r>0;r--){A+=e[r-1];if(t&&e[r-1]==="\\"){A+="\\"}else if(e[r-1]==='"'){t=true;A+="\\"}else{t=false}}A+='"';return A.split("").reverse().join("")}_cloneExecOptions(e){e=e||{};const A={cwd:e.cwd||process.cwd(),env:e.env||process.env,silent:e.silent||false,windowsVerbatimArguments:e.windowsVerbatimArguments||false,failOnStdErr:e.failOnStdErr||false,ignoreReturnCode:e.ignoreReturnCode||false,delay:e.delay||1e4};A.outStream=e.outStream||process.stdout;A.errStream=e.errStream||process.stderr;return A}_getSpawnOptions(e,A){e=e||{};const t={};t.cwd=e.cwd;t.env=e.env;t["windowsVerbatimArguments"]=e.windowsVerbatimArguments||this._isCmdFile();if(e.windowsVerbatimArguments){t.argv0=`"${A}"`}return t}exec(){return n(this,void 0,void 0,(function*(){if(!E.isRooted(this.toolPath)&&(this.toolPath.includes("/")||h&&this.toolPath.includes("\\"))){this.toolPath=g.resolve(process.cwd(),this.options.cwd||process.cwd(),this.toolPath)}this.toolPath=yield l.which(this.toolPath,true);return new Promise(((e,A)=>n(this,void 0,void 0,(function*(){this._debug(`exec tool: ${this.toolPath}`);this._debug("arguments:");for(const e of this.args){this._debug(` ${e}`)}const t=this._cloneExecOptions(this.options);if(!t.silent&&t.outStream){t.outStream.write(this._getCommandString(t)+i.EOL)}const r=new ExecState(t,this.toolPath);r.on("debug",(e=>{this._debug(e)}));if(this.options.cwd&&!(yield E.exists(this.options.cwd))){return A(new Error(`The cwd: ${this.options.cwd} does not exist!`))}const s=this._getSpawnFileName();const o=c.spawn(s,this._getSpawnArgs(t),this._getSpawnOptions(this.options,s));let n="";if(o.stdout){o.stdout.on("data",(e=>{if(this.options.listeners&&this.options.listeners.stdout){this.options.listeners.stdout(e)}if(!t.silent&&t.outStream){t.outStream.write(e)}n=this._processLineBuffer(e,n,(e=>{if(this.options.listeners&&this.options.listeners.stdline){this.options.listeners.stdline(e)}}))}))}let a="";if(o.stderr){o.stderr.on("data",(e=>{r.processStderr=true;if(this.options.listeners&&this.options.listeners.stderr){this.options.listeners.stderr(e)}if(!t.silent&&t.errStream&&t.outStream){const A=t.failOnStdErr?t.errStream:t.outStream;A.write(e)}a=this._processLineBuffer(e,a,(e=>{if(this.options.listeners&&this.options.listeners.errline){this.options.listeners.errline(e)}}))}))}o.on("error",(e=>{r.processError=e.message;r.processExited=true;r.processClosed=true;r.CheckComplete()}));o.on("exit",(e=>{r.processExitCode=e;r.processExited=true;this._debug(`Exit code ${e} received from tool '${this.toolPath}'`);r.CheckComplete()}));o.on("close",(e=>{r.processExitCode=e;r.processExited=true;r.processClosed=true;this._debug(`STDIO streams have closed for tool '${this.toolPath}'`);r.CheckComplete()}));r.on("done",((t,r)=>{if(n.length>0){this.emit("stdline",n)}if(a.length>0){this.emit("errline",a)}o.removeAllListeners();if(t){A(t)}else{e(r)}}));if(this.options.input){if(!o.stdin){throw new Error("child process missing stdin")}o.stdin.end(this.options.input)}}))))}))}}A.ToolRunner=ToolRunner;function argStringToArray(e){const A=[];let t=false;let r=false;let s="";function append(e){if(r&&e!=='"'){s+="\\"}s+=e;r=false}for(let o=0;o0){A.push(s);s=""}continue}append(n)}if(s.length>0){A.push(s.trim())}return A}A.argStringToArray=argStringToArray;class ExecState extends a.EventEmitter{constructor(e,A){super();this.processClosed=false;this.processError="";this.processExitCode=0;this.processExited=false;this.processStderr=false;this.delay=1e4;this.done=false;this.timeout=null;if(!A){throw new Error("toolPath must not be empty")}this.options=e;this.toolPath=A;if(e.delay){this.delay=e.delay}}CheckComplete(){if(this.done){return}if(this.processClosed){this._setResult()}else if(this.processExited){this.timeout=u.setTimeout(ExecState.HandleTimeout,this.delay,this)}}_debug(e){this.emit("debug",e)}_setResult(){let e;if(this.processExited){if(this.processError){e=new Error(`There was an error when attempting to execute the process '${this.toolPath}'. This may indicate the process failed to start. Error: ${this.processError}`)}else if(this.processExitCode!==0&&!this.options.ignoreReturnCode){e=new Error(`The process '${this.toolPath}' failed with exit code ${this.processExitCode}`)}else if(this.processStderr&&this.options.failOnStdErr){e=new Error(`The process '${this.toolPath}' failed because one or more lines were written to the STDERR stream`)}}if(this.timeout){clearTimeout(this.timeout);this.timeout=null}this.done=true;this.emit("done",e,this.processExitCode)}static HandleTimeout(e){if(e.done){return}if(!e.processClosed&&e.processExited){const A=`The STDIO streams did not close within ${e.delay/1e3} seconds of the exit event from process '${e.toolPath}'. This may indicate a child process inherited the STDIO streams and has not yet exited.`;e._debug(A)}e._setResult()}}},1648:(e,A,t)=>{"use strict";Object.defineProperty(A,"__esModule",{value:true});A.Context=void 0;const r=t(9896);const s=t(857);class Context{constructor(){var e,A,t;this.payload={};if(process.env.GITHUB_EVENT_PATH){if((0,r.existsSync)(process.env.GITHUB_EVENT_PATH)){this.payload=JSON.parse((0,r.readFileSync)(process.env.GITHUB_EVENT_PATH,{encoding:"utf8"}))}else{const e=process.env.GITHUB_EVENT_PATH;process.stdout.write(`GITHUB_EVENT_PATH ${e} does not exist${s.EOL}`)}}this.eventName=process.env.GITHUB_EVENT_NAME;this.sha=process.env.GITHUB_SHA;this.ref=process.env.GITHUB_REF;this.workflow=process.env.GITHUB_WORKFLOW;this.action=process.env.GITHUB_ACTION;this.actor=process.env.GITHUB_ACTOR;this.job=process.env.GITHUB_JOB;this.runNumber=parseInt(process.env.GITHUB_RUN_NUMBER,10);this.runId=parseInt(process.env.GITHUB_RUN_ID,10);this.apiUrl=(e=process.env.GITHUB_API_URL)!==null&&e!==void 0?e:`https://api.github.com`;this.serverUrl=(A=process.env.GITHUB_SERVER_URL)!==null&&A!==void 0?A:`https://github.com`;this.graphqlUrl=(t=process.env.GITHUB_GRAPHQL_URL)!==null&&t!==void 0?t:`https://api.github.com/graphql`}get issue(){const e=this.payload;return Object.assign(Object.assign({},this.repo),{number:(e.issue||e.pull_request||e).number})}get repo(){if(process.env.GITHUB_REPOSITORY){const[e,A]=process.env.GITHUB_REPOSITORY.split("/");return{owner:e,repo:A}}if(this.payload.repository){return{owner:this.payload.repository.owner.login,repo:this.payload.repository.name}}throw new Error("context.repo requires a GITHUB_REPOSITORY environment variable like 'owner/repo'")}}A.Context=Context},3228:function(e,A,t){"use strict";var r=this&&this.__createBinding||(Object.create?function(e,A,t,r){if(r===undefined)r=t;var s=Object.getOwnPropertyDescriptor(A,t);if(!s||("get"in s?!A.__esModule:s.writable||s.configurable)){s={enumerable:true,get:function(){return A[t]}}}Object.defineProperty(e,r,s)}:function(e,A,t,r){if(r===undefined)r=t;e[r]=A[t]});var s=this&&this.__setModuleDefault||(Object.create?function(e,A){Object.defineProperty(e,"default",{enumerable:true,value:A})}:function(e,A){e["default"]=A});var o=this&&this.__importStar||function(e){if(e&&e.__esModule)return e;var A={};if(e!=null)for(var t in e)if(t!=="default"&&Object.prototype.hasOwnProperty.call(e,t))r(A,e,t);s(A,e);return A};Object.defineProperty(A,"__esModule",{value:true});A.getOctokit=A.context=void 0;const n=o(t(1648));const i=t(8006);A.context=new n.Context;function getOctokit(e,A,...t){const r=i.GitHub.plugin(...t);return new r((0,i.getOctokitOptions)(e,A))}A.getOctokit=getOctokit},5156:function(e,A,t){"use strict";var r=this&&this.__createBinding||(Object.create?function(e,A,t,r){if(r===undefined)r=t;var s=Object.getOwnPropertyDescriptor(A,t);if(!s||("get"in s?!A.__esModule:s.writable||s.configurable)){s={enumerable:true,get:function(){return A[t]}}}Object.defineProperty(e,r,s)}:function(e,A,t,r){if(r===undefined)r=t;e[r]=A[t]});var s=this&&this.__setModuleDefault||(Object.create?function(e,A){Object.defineProperty(e,"default",{enumerable:true,value:A})}:function(e,A){e["default"]=A});var o=this&&this.__importStar||function(e){if(e&&e.__esModule)return e;var A={};if(e!=null)for(var t in e)if(t!=="default"&&Object.prototype.hasOwnProperty.call(e,t))r(A,e,t);s(A,e);return A};var n=this&&this.__awaiter||function(e,A,t,r){function adopt(e){return e instanceof t?e:new t((function(A){A(e)}))}return new(t||(t=Promise))((function(t,s){function fulfilled(e){try{step(r.next(e))}catch(e){s(e)}}function rejected(e){try{step(r["throw"](e))}catch(e){s(e)}}function step(e){e.done?t(e.value):adopt(e.value).then(fulfilled,rejected)}step((r=r.apply(e,A||[])).next())}))};Object.defineProperty(A,"__esModule",{value:true});A.getApiBaseUrl=A.getProxyFetch=A.getProxyAgentDispatcher=A.getProxyAgent=A.getAuthString=void 0;const i=o(t(4844));const a=t(6752);function getAuthString(e,A){if(!e&&!A.auth){throw new Error("Parameter token or opts.auth is required")}else if(e&&A.auth){throw new Error("Parameters token and opts.auth may not both be specified")}return typeof A.auth==="string"?A.auth:`token ${e}`}A.getAuthString=getAuthString;function getProxyAgent(e){const A=new i.HttpClient;return A.getAgent(e)}A.getProxyAgent=getProxyAgent;function getProxyAgentDispatcher(e){const A=new i.HttpClient;return A.getAgentDispatcher(e)}A.getProxyAgentDispatcher=getProxyAgentDispatcher;function getProxyFetch(e){const A=getProxyAgentDispatcher(e);const proxyFetch=(e,t)=>n(this,void 0,void 0,(function*(){return(0,a.fetch)(e,Object.assign(Object.assign({},t),{dispatcher:A}))}));return proxyFetch}A.getProxyFetch=getProxyFetch;function getApiBaseUrl(){return process.env["GITHUB_API_URL"]||"https://api.github.com"}A.getApiBaseUrl=getApiBaseUrl},8006:function(e,A,t){"use strict";var r=this&&this.__createBinding||(Object.create?function(e,A,t,r){if(r===undefined)r=t;var s=Object.getOwnPropertyDescriptor(A,t);if(!s||("get"in s?!A.__esModule:s.writable||s.configurable)){s={enumerable:true,get:function(){return A[t]}}}Object.defineProperty(e,r,s)}:function(e,A,t,r){if(r===undefined)r=t;e[r]=A[t]});var s=this&&this.__setModuleDefault||(Object.create?function(e,A){Object.defineProperty(e,"default",{enumerable:true,value:A})}:function(e,A){e["default"]=A});var o=this&&this.__importStar||function(e){if(e&&e.__esModule)return e;var A={};if(e!=null)for(var t in e)if(t!=="default"&&Object.prototype.hasOwnProperty.call(e,t))r(A,e,t);s(A,e);return A};Object.defineProperty(A,"__esModule",{value:true});A.getOctokitOptions=A.GitHub=A.defaults=A.context=void 0;const n=o(t(1648));const i=o(t(5156));const a=t(1897);const c=t(4935);const g=t(8082);A.context=new n.Context;const l=i.getApiBaseUrl();A.defaults={baseUrl:l,request:{agent:i.getProxyAgent(l),fetch:i.getProxyFetch(l)}};A.GitHub=a.Octokit.plugin(c.restEndpointMethods,g.paginateRest).defaults(A.defaults);function getOctokitOptions(e,A){const t=Object.assign({},A||{});const r=i.getAuthString(e,t);if(r){t.auth=r}return t}A.getOctokitOptions=getOctokitOptions},4552:function(e,A){"use strict";var t=this&&this.__awaiter||function(e,A,t,r){function adopt(e){return e instanceof t?e:new t((function(A){A(e)}))}return new(t||(t=Promise))((function(t,s){function fulfilled(e){try{step(r.next(e))}catch(e){s(e)}}function rejected(e){try{step(r["throw"](e))}catch(e){s(e)}}function step(e){e.done?t(e.value):adopt(e.value).then(fulfilled,rejected)}step((r=r.apply(e,A||[])).next())}))};Object.defineProperty(A,"__esModule",{value:true});A.PersonalAccessTokenCredentialHandler=A.BearerCredentialHandler=A.BasicCredentialHandler=void 0;class BasicCredentialHandler{constructor(e,A){this.username=e;this.password=A}prepareRequest(e){if(!e.headers){throw Error("The request has no headers")}e.headers["Authorization"]=`Basic ${Buffer.from(`${this.username}:${this.password}`).toString("base64")}`}canHandleAuthentication(){return false}handleAuthentication(){return t(this,void 0,void 0,(function*(){throw new Error("not implemented")}))}}A.BasicCredentialHandler=BasicCredentialHandler;class BearerCredentialHandler{constructor(e){this.token=e}prepareRequest(e){if(!e.headers){throw Error("The request has no headers")}e.headers["Authorization"]=`Bearer ${this.token}`}canHandleAuthentication(){return false}handleAuthentication(){return t(this,void 0,void 0,(function*(){throw new Error("not implemented")}))}}A.BearerCredentialHandler=BearerCredentialHandler;class PersonalAccessTokenCredentialHandler{constructor(e){this.token=e}prepareRequest(e){if(!e.headers){throw Error("The request has no headers")}e.headers["Authorization"]=`Basic ${Buffer.from(`PAT:${this.token}`).toString("base64")}`}canHandleAuthentication(){return false}handleAuthentication(){return t(this,void 0,void 0,(function*(){throw new Error("not implemented")}))}}A.PersonalAccessTokenCredentialHandler=PersonalAccessTokenCredentialHandler},4844:function(e,A,t){"use strict";var r=this&&this.__createBinding||(Object.create?function(e,A,t,r){if(r===undefined)r=t;var s=Object.getOwnPropertyDescriptor(A,t);if(!s||("get"in s?!A.__esModule:s.writable||s.configurable)){s={enumerable:true,get:function(){return A[t]}}}Object.defineProperty(e,r,s)}:function(e,A,t,r){if(r===undefined)r=t;e[r]=A[t]});var s=this&&this.__setModuleDefault||(Object.create?function(e,A){Object.defineProperty(e,"default",{enumerable:true,value:A})}:function(e,A){e["default"]=A});var o=this&&this.__importStar||function(e){if(e&&e.__esModule)return e;var A={};if(e!=null)for(var t in e)if(t!=="default"&&Object.prototype.hasOwnProperty.call(e,t))r(A,e,t);s(A,e);return A};var n=this&&this.__awaiter||function(e,A,t,r){function adopt(e){return e instanceof t?e:new t((function(A){A(e)}))}return new(t||(t=Promise))((function(t,s){function fulfilled(e){try{step(r.next(e))}catch(e){s(e)}}function rejected(e){try{step(r["throw"](e))}catch(e){s(e)}}function step(e){e.done?t(e.value):adopt(e.value).then(fulfilled,rejected)}step((r=r.apply(e,A||[])).next())}))};Object.defineProperty(A,"__esModule",{value:true});A.HttpClient=A.isHttps=A.HttpClientResponse=A.HttpClientError=A.getProxyUrl=A.MediaTypes=A.Headers=A.HttpCodes=void 0;const i=o(t(8611));const a=o(t(5692));const c=o(t(4988));const g=o(t(770));const l=t(6752);var E;(function(e){e[e["OK"]=200]="OK";e[e["MultipleChoices"]=300]="MultipleChoices";e[e["MovedPermanently"]=301]="MovedPermanently";e[e["ResourceMoved"]=302]="ResourceMoved";e[e["SeeOther"]=303]="SeeOther";e[e["NotModified"]=304]="NotModified";e[e["UseProxy"]=305]="UseProxy";e[e["SwitchProxy"]=306]="SwitchProxy";e[e["TemporaryRedirect"]=307]="TemporaryRedirect";e[e["PermanentRedirect"]=308]="PermanentRedirect";e[e["BadRequest"]=400]="BadRequest";e[e["Unauthorized"]=401]="Unauthorized";e[e["PaymentRequired"]=402]="PaymentRequired";e[e["Forbidden"]=403]="Forbidden";e[e["NotFound"]=404]="NotFound";e[e["MethodNotAllowed"]=405]="MethodNotAllowed";e[e["NotAcceptable"]=406]="NotAcceptable";e[e["ProxyAuthenticationRequired"]=407]="ProxyAuthenticationRequired";e[e["RequestTimeout"]=408]="RequestTimeout";e[e["Conflict"]=409]="Conflict";e[e["Gone"]=410]="Gone";e[e["TooManyRequests"]=429]="TooManyRequests";e[e["InternalServerError"]=500]="InternalServerError";e[e["NotImplemented"]=501]="NotImplemented";e[e["BadGateway"]=502]="BadGateway";e[e["ServiceUnavailable"]=503]="ServiceUnavailable";e[e["GatewayTimeout"]=504]="GatewayTimeout"})(E||(A.HttpCodes=E={}));var u;(function(e){e["Accept"]="accept";e["ContentType"]="content-type"})(u||(A.Headers=u={}));var h;(function(e){e["ApplicationJson"]="application/json"})(h||(A.MediaTypes=h={}));function getProxyUrl(e){const A=c.getProxyUrl(new URL(e));return A?A.href:""}A.getProxyUrl=getProxyUrl;const Q=[E.MovedPermanently,E.ResourceMoved,E.SeeOther,E.TemporaryRedirect,E.PermanentRedirect];const C=[E.BadGateway,E.ServiceUnavailable,E.GatewayTimeout];const d=["OPTIONS","GET","DELETE","HEAD"];const B=10;const I=5;class HttpClientError extends Error{constructor(e,A){super(e);this.name="HttpClientError";this.statusCode=A;Object.setPrototypeOf(this,HttpClientError.prototype)}}A.HttpClientError=HttpClientError;class HttpClientResponse{constructor(e){this.message=e}readBody(){return n(this,void 0,void 0,(function*(){return new Promise((e=>n(this,void 0,void 0,(function*(){let A=Buffer.alloc(0);this.message.on("data",(e=>{A=Buffer.concat([A,e])}));this.message.on("end",(()=>{e(A.toString())}))}))))}))}readBodyBuffer(){return n(this,void 0,void 0,(function*(){return new Promise((e=>n(this,void 0,void 0,(function*(){const A=[];this.message.on("data",(e=>{A.push(e)}));this.message.on("end",(()=>{e(Buffer.concat(A))}))}))))}))}}A.HttpClientResponse=HttpClientResponse;function isHttps(e){const A=new URL(e);return A.protocol==="https:"}A.isHttps=isHttps;class HttpClient{constructor(e,A,t){this._ignoreSslError=false;this._allowRedirects=true;this._allowRedirectDowngrade=false;this._maxRedirects=50;this._allowRetries=false;this._maxRetries=1;this._keepAlive=false;this._disposed=false;this.userAgent=e;this.handlers=A||[];this.requestOptions=t;if(t){if(t.ignoreSslError!=null){this._ignoreSslError=t.ignoreSslError}this._socketTimeout=t.socketTimeout;if(t.allowRedirects!=null){this._allowRedirects=t.allowRedirects}if(t.allowRedirectDowngrade!=null){this._allowRedirectDowngrade=t.allowRedirectDowngrade}if(t.maxRedirects!=null){this._maxRedirects=Math.max(t.maxRedirects,0)}if(t.keepAlive!=null){this._keepAlive=t.keepAlive}if(t.allowRetries!=null){this._allowRetries=t.allowRetries}if(t.maxRetries!=null){this._maxRetries=t.maxRetries}}}options(e,A){return n(this,void 0,void 0,(function*(){return this.request("OPTIONS",e,null,A||{})}))}get(e,A){return n(this,void 0,void 0,(function*(){return this.request("GET",e,null,A||{})}))}del(e,A){return n(this,void 0,void 0,(function*(){return this.request("DELETE",e,null,A||{})}))}post(e,A,t){return n(this,void 0,void 0,(function*(){return this.request("POST",e,A,t||{})}))}patch(e,A,t){return n(this,void 0,void 0,(function*(){return this.request("PATCH",e,A,t||{})}))}put(e,A,t){return n(this,void 0,void 0,(function*(){return this.request("PUT",e,A,t||{})}))}head(e,A){return n(this,void 0,void 0,(function*(){return this.request("HEAD",e,null,A||{})}))}sendStream(e,A,t,r){return n(this,void 0,void 0,(function*(){return this.request(e,A,t,r)}))}getJson(e,A={}){return n(this,void 0,void 0,(function*(){A[u.Accept]=this._getExistingOrDefaultHeader(A,u.Accept,h.ApplicationJson);const t=yield this.get(e,A);return this._processResponse(t,this.requestOptions)}))}postJson(e,A,t={}){return n(this,void 0,void 0,(function*(){const r=JSON.stringify(A,null,2);t[u.Accept]=this._getExistingOrDefaultHeader(t,u.Accept,h.ApplicationJson);t[u.ContentType]=this._getExistingOrDefaultHeader(t,u.ContentType,h.ApplicationJson);const s=yield this.post(e,r,t);return this._processResponse(s,this.requestOptions)}))}putJson(e,A,t={}){return n(this,void 0,void 0,(function*(){const r=JSON.stringify(A,null,2);t[u.Accept]=this._getExistingOrDefaultHeader(t,u.Accept,h.ApplicationJson);t[u.ContentType]=this._getExistingOrDefaultHeader(t,u.ContentType,h.ApplicationJson);const s=yield this.put(e,r,t);return this._processResponse(s,this.requestOptions)}))}patchJson(e,A,t={}){return n(this,void 0,void 0,(function*(){const r=JSON.stringify(A,null,2);t[u.Accept]=this._getExistingOrDefaultHeader(t,u.Accept,h.ApplicationJson);t[u.ContentType]=this._getExistingOrDefaultHeader(t,u.ContentType,h.ApplicationJson);const s=yield this.patch(e,r,t);return this._processResponse(s,this.requestOptions)}))}request(e,A,t,r){return n(this,void 0,void 0,(function*(){if(this._disposed){throw new Error("Client has already been disposed.")}const s=new URL(A);let o=this._prepareRequest(e,s,r);const n=this._allowRetries&&d.includes(e)?this._maxRetries+1:1;let i=0;let a;do{a=yield this.requestRaw(o,t);if(a&&a.message&&a.message.statusCode===E.Unauthorized){let e;for(const A of this.handlers){if(A.canHandleAuthentication(a)){e=A;break}}if(e){return e.handleAuthentication(this,o,t)}else{return a}}let A=this._maxRedirects;while(a.message.statusCode&&Q.includes(a.message.statusCode)&&this._allowRedirects&&A>0){const n=a.message.headers["location"];if(!n){break}const i=new URL(n);if(s.protocol==="https:"&&s.protocol!==i.protocol&&!this._allowRedirectDowngrade){throw new Error("Redirect from HTTPS to HTTP protocol. This downgrade is not allowed for security reasons. If you want to allow this behavior, set the allowRedirectDowngrade option to true.")}yield a.readBody();if(i.hostname!==s.hostname){for(const e in r){if(e.toLowerCase()==="authorization"){delete r[e]}}}o=this._prepareRequest(e,i,r);a=yield this.requestRaw(o,t);A--}if(!a.message.statusCode||!C.includes(a.message.statusCode)){return a}i+=1;if(i{function callbackForResult(e,A){if(e){r(e)}else if(!A){r(new Error("Unknown error"))}else{t(A)}}this.requestRawWithCallback(e,A,callbackForResult)}))}))}requestRawWithCallback(e,A,t){if(typeof A==="string"){if(!e.options.headers){e.options.headers={}}e.options.headers["Content-Length"]=Buffer.byteLength(A,"utf8")}let r=false;function handleResult(e,A){if(!r){r=true;t(e,A)}}const s=e.httpModule.request(e.options,(e=>{const A=new HttpClientResponse(e);handleResult(undefined,A)}));let o;s.on("socket",(e=>{o=e}));s.setTimeout(this._socketTimeout||3*6e4,(()=>{if(o){o.end()}handleResult(new Error(`Request timeout: ${e.options.path}`))}));s.on("error",(function(e){handleResult(e)}));if(A&&typeof A==="string"){s.write(A,"utf8")}if(A&&typeof A!=="string"){A.on("close",(function(){s.end()}));A.pipe(s)}else{s.end()}}getAgent(e){const A=new URL(e);return this._getAgent(A)}getAgentDispatcher(e){const A=new URL(e);const t=c.getProxyUrl(A);const r=t&&t.hostname;if(!r){return}return this._getProxyAgentDispatcher(A,t)}_prepareRequest(e,A,t){const r={};r.parsedUrl=A;const s=r.parsedUrl.protocol==="https:";r.httpModule=s?a:i;const o=s?443:80;r.options={};r.options.host=r.parsedUrl.hostname;r.options.port=r.parsedUrl.port?parseInt(r.parsedUrl.port):o;r.options.path=(r.parsedUrl.pathname||"")+(r.parsedUrl.search||"");r.options.method=e;r.options.headers=this._mergeHeaders(t);if(this.userAgent!=null){r.options.headers["user-agent"]=this.userAgent}r.options.agent=this._getAgent(r.parsedUrl);if(this.handlers){for(const e of this.handlers){e.prepareRequest(r.options)}}return r}_mergeHeaders(e){if(this.requestOptions&&this.requestOptions.headers){return Object.assign({},lowercaseKeys(this.requestOptions.headers),lowercaseKeys(e||{}))}return lowercaseKeys(e||{})}_getExistingOrDefaultHeader(e,A,t){let r;if(this.requestOptions&&this.requestOptions.headers){r=lowercaseKeys(this.requestOptions.headers)[A]}return e[A]||r||t}_getAgent(e){let A;const t=c.getProxyUrl(e);const r=t&&t.hostname;if(this._keepAlive&&r){A=this._proxyAgent}if(!r){A=this._agent}if(A){return A}const s=e.protocol==="https:";let o=100;if(this.requestOptions){o=this.requestOptions.maxSockets||i.globalAgent.maxSockets}if(t&&t.hostname){const e={maxSockets:o,keepAlive:this._keepAlive,proxy:Object.assign(Object.assign({},(t.username||t.password)&&{proxyAuth:`${t.username}:${t.password}`}),{host:t.hostname,port:t.port})};let r;const n=t.protocol==="https:";if(s){r=n?g.httpsOverHttps:g.httpsOverHttp}else{r=n?g.httpOverHttps:g.httpOverHttp}A=r(e);this._proxyAgent=A}if(!A){const e={keepAlive:this._keepAlive,maxSockets:o};A=s?new a.Agent(e):new i.Agent(e);this._agent=A}if(s&&this._ignoreSslError){A.options=Object.assign(A.options||{},{rejectUnauthorized:false})}return A}_getProxyAgentDispatcher(e,A){let t;if(this._keepAlive){t=this._proxyAgentDispatcher}if(t){return t}const r=e.protocol==="https:";t=new l.ProxyAgent(Object.assign({uri:A.href,pipelining:!this._keepAlive?0:1},(A.username||A.password)&&{token:`Basic ${Buffer.from(`${A.username}:${A.password}`).toString("base64")}`}));this._proxyAgentDispatcher=t;if(r&&this._ignoreSslError){t.options=Object.assign(t.options.requestTls||{},{rejectUnauthorized:false})}return t}_performExponentialBackoff(e){return n(this,void 0,void 0,(function*(){e=Math.min(B,e);const A=I*Math.pow(2,e);return new Promise((e=>setTimeout((()=>e()),A)))}))}_processResponse(e,A){return n(this,void 0,void 0,(function*(){return new Promise(((t,r)=>n(this,void 0,void 0,(function*(){const s=e.message.statusCode||0;const o={statusCode:s,result:null,headers:{}};if(s===E.NotFound){t(o)}function dateTimeDeserializer(e,A){if(typeof A==="string"){const e=new Date(A);if(!isNaN(e.valueOf())){return e}}return A}let n;let i;try{i=yield e.readBody();if(i&&i.length>0){if(A&&A.deserializeDates){n=JSON.parse(i,dateTimeDeserializer)}else{n=JSON.parse(i)}o.result=n}o.headers=e.message.headers}catch(e){}if(s>299){let e;if(n&&n.message){e=n.message}else if(i&&i.length>0){e=i}else{e=`Failed request: (${s})`}const A=new HttpClientError(e,s);A.result=o.result;r(A)}else{t(o)}}))))}))}}A.HttpClient=HttpClient;const lowercaseKeys=e=>Object.keys(e).reduce(((A,t)=>(A[t.toLowerCase()]=e[t],A)),{})},4988:(e,A)=>{"use strict";Object.defineProperty(A,"__esModule",{value:true});A.checkBypass=A.getProxyUrl=void 0;function getProxyUrl(e){const A=e.protocol==="https:";if(checkBypass(e)){return undefined}const t=(()=>{if(A){return process.env["https_proxy"]||process.env["HTTPS_PROXY"]}else{return process.env["http_proxy"]||process.env["HTTP_PROXY"]}})();if(t){try{return new DecodedURL(t)}catch(e){if(!t.startsWith("http://")&&!t.startsWith("https://"))return new DecodedURL(`http://${t}`)}}else{return undefined}}A.getProxyUrl=getProxyUrl;function checkBypass(e){if(!e.hostname){return false}const A=e.hostname;if(isLoopbackAddress(A)){return true}const t=process.env["no_proxy"]||process.env["NO_PROXY"]||"";if(!t){return false}let r;if(e.port){r=Number(e.port)}else if(e.protocol==="http:"){r=80}else if(e.protocol==="https:"){r=443}const s=[e.hostname.toUpperCase()];if(typeof r==="number"){s.push(`${s[0]}:${r}`)}for(const e of t.split(",").map((e=>e.trim().toUpperCase())).filter((e=>e))){if(e==="*"||s.some((A=>A===e||A.endsWith(`.${e}`)||e.startsWith(".")&&A.endsWith(`${e}`)))){return true}}return false}A.checkBypass=checkBypass;function isLoopbackAddress(e){const A=e.toLowerCase();return A==="localhost"||A.startsWith("127.")||A.startsWith("[::1]")||A.startsWith("[0:0:0:0:0:0:0:1]")}class DecodedURL extends URL{constructor(e,A){super(e,A);this._decodedUsername=decodeURIComponent(super.username);this._decodedPassword=decodeURIComponent(super.password)}get username(){return this._decodedUsername}get password(){return this._decodedPassword}}},5207:function(e,A,t){"use strict";var r=this&&this.__createBinding||(Object.create?function(e,A,t,r){if(r===undefined)r=t;Object.defineProperty(e,r,{enumerable:true,get:function(){return A[t]}})}:function(e,A,t,r){if(r===undefined)r=t;e[r]=A[t]});var s=this&&this.__setModuleDefault||(Object.create?function(e,A){Object.defineProperty(e,"default",{enumerable:true,value:A})}:function(e,A){e["default"]=A});var o=this&&this.__importStar||function(e){if(e&&e.__esModule)return e;var A={};if(e!=null)for(var t in e)if(t!=="default"&&Object.hasOwnProperty.call(e,t))r(A,e,t);s(A,e);return A};var n=this&&this.__awaiter||function(e,A,t,r){function adopt(e){return e instanceof t?e:new t((function(A){A(e)}))}return new(t||(t=Promise))((function(t,s){function fulfilled(e){try{step(r.next(e))}catch(e){s(e)}}function rejected(e){try{step(r["throw"](e))}catch(e){s(e)}}function step(e){e.done?t(e.value):adopt(e.value).then(fulfilled,rejected)}step((r=r.apply(e,A||[])).next())}))};var i;Object.defineProperty(A,"__esModule",{value:true});A.getCmdPath=A.tryGetExecutablePath=A.isRooted=A.isDirectory=A.exists=A.READONLY=A.UV_FS_O_EXLOCK=A.IS_WINDOWS=A.unlink=A.symlink=A.stat=A.rmdir=A.rm=A.rename=A.readlink=A.readdir=A.open=A.mkdir=A.lstat=A.copyFile=A.chmod=void 0;const a=o(t(9896));const c=o(t(6928));i=a.promises,A.chmod=i.chmod,A.copyFile=i.copyFile,A.lstat=i.lstat,A.mkdir=i.mkdir,A.open=i.open,A.readdir=i.readdir,A.readlink=i.readlink,A.rename=i.rename,A.rm=i.rm,A.rmdir=i.rmdir,A.stat=i.stat,A.symlink=i.symlink,A.unlink=i.unlink;A.IS_WINDOWS=process.platform==="win32";A.UV_FS_O_EXLOCK=268435456;A.READONLY=a.constants.O_RDONLY;function exists(e){return n(this,void 0,void 0,(function*(){try{yield A.stat(e)}catch(e){if(e.code==="ENOENT"){return false}throw e}return true}))}A.exists=exists;function isDirectory(e,t=false){return n(this,void 0,void 0,(function*(){const r=t?yield A.stat(e):yield A.lstat(e);return r.isDirectory()}))}A.isDirectory=isDirectory;function isRooted(e){e=normalizeSeparators(e);if(!e){throw new Error('isRooted() parameter "p" cannot be empty')}if(A.IS_WINDOWS){return e.startsWith("\\")||/^[A-Z]:/i.test(e)}return e.startsWith("/")}A.isRooted=isRooted;function tryGetExecutablePath(e,t){return n(this,void 0,void 0,(function*(){let r=undefined;try{r=yield A.stat(e)}catch(A){if(A.code!=="ENOENT"){console.log(`Unexpected error attempting to determine if executable file exists '${e}': ${A}`)}}if(r&&r.isFile()){if(A.IS_WINDOWS){const A=c.extname(e).toUpperCase();if(t.some((e=>e.toUpperCase()===A))){return e}}else{if(isUnixExecutable(r)){return e}}}const s=e;for(const o of t){e=s+o;r=undefined;try{r=yield A.stat(e)}catch(A){if(A.code!=="ENOENT"){console.log(`Unexpected error attempting to determine if executable file exists '${e}': ${A}`)}}if(r&&r.isFile()){if(A.IS_WINDOWS){try{const t=c.dirname(e);const r=c.basename(e).toUpperCase();for(const s of yield A.readdir(t)){if(r===s.toUpperCase()){e=c.join(t,s);break}}}catch(A){console.log(`Unexpected error attempting to determine the actual case of the file '${e}': ${A}`)}return e}else{if(isUnixExecutable(r)){return e}}}}return""}))}A.tryGetExecutablePath=tryGetExecutablePath;function normalizeSeparators(e){e=e||"";if(A.IS_WINDOWS){e=e.replace(/\//g,"\\");return e.replace(/\\\\+/g,"\\")}return e.replace(/\/\/+/g,"/")}function isUnixExecutable(e){return(e.mode&1)>0||(e.mode&8)>0&&e.gid===process.getgid()||(e.mode&64)>0&&e.uid===process.getuid()}function getCmdPath(){var e;return(e=process.env["COMSPEC"])!==null&&e!==void 0?e:`cmd.exe`}A.getCmdPath=getCmdPath},4994:function(e,A,t){"use strict";var r=this&&this.__createBinding||(Object.create?function(e,A,t,r){if(r===undefined)r=t;Object.defineProperty(e,r,{enumerable:true,get:function(){return A[t]}})}:function(e,A,t,r){if(r===undefined)r=t;e[r]=A[t]});var s=this&&this.__setModuleDefault||(Object.create?function(e,A){Object.defineProperty(e,"default",{enumerable:true,value:A})}:function(e,A){e["default"]=A});var o=this&&this.__importStar||function(e){if(e&&e.__esModule)return e;var A={};if(e!=null)for(var t in e)if(t!=="default"&&Object.hasOwnProperty.call(e,t))r(A,e,t);s(A,e);return A};var n=this&&this.__awaiter||function(e,A,t,r){function adopt(e){return e instanceof t?e:new t((function(A){A(e)}))}return new(t||(t=Promise))((function(t,s){function fulfilled(e){try{step(r.next(e))}catch(e){s(e)}}function rejected(e){try{step(r["throw"](e))}catch(e){s(e)}}function step(e){e.done?t(e.value):adopt(e.value).then(fulfilled,rejected)}step((r=r.apply(e,A||[])).next())}))};Object.defineProperty(A,"__esModule",{value:true});A.findInPath=A.which=A.mkdirP=A.rmRF=A.mv=A.cp=void 0;const i=t(2613);const a=o(t(6928));const c=o(t(5207));function cp(e,A,t={}){return n(this,void 0,void 0,(function*(){const{force:r,recursive:s,copySourceDirectory:o}=readCopyOptions(t);const n=(yield c.exists(A))?yield c.stat(A):null;if(n&&n.isFile()&&!r){return}const i=n&&n.isDirectory()&&o?a.join(A,a.basename(e)):A;if(!(yield c.exists(e))){throw new Error(`no such file or directory: ${e}`)}const g=yield c.stat(e);if(g.isDirectory()){if(!s){throw new Error(`Failed to copy. ${e} is a directory, but tried to copy without recursive flag.`)}else{yield cpDirRecursive(e,i,0,r)}}else{if(a.relative(e,i)===""){throw new Error(`'${i}' and '${e}' are the same file`)}yield copyFile(e,i,r)}}))}A.cp=cp;function mv(e,A,t={}){return n(this,void 0,void 0,(function*(){if(yield c.exists(A)){let r=true;if(yield c.isDirectory(A)){A=a.join(A,a.basename(e));r=yield c.exists(A)}if(r){if(t.force==null||t.force){yield rmRF(A)}else{throw new Error("Destination already exists")}}}yield mkdirP(a.dirname(A));yield c.rename(e,A)}))}A.mv=mv;function rmRF(e){return n(this,void 0,void 0,(function*(){if(c.IS_WINDOWS){if(/[*"<>|]/.test(e)){throw new Error('File path must not contain `*`, `"`, `<`, `>` or `|` on Windows')}}try{yield c.rm(e,{force:true,maxRetries:3,recursive:true,retryDelay:300})}catch(e){throw new Error(`File was unable to be removed ${e}`)}}))}A.rmRF=rmRF;function mkdirP(e){return n(this,void 0,void 0,(function*(){i.ok(e,"a path argument must be provided");yield c.mkdir(e,{recursive:true})}))}A.mkdirP=mkdirP;function which(e,A){return n(this,void 0,void 0,(function*(){if(!e){throw new Error("parameter 'tool' is required")}if(A){const A=yield which(e,false);if(!A){if(c.IS_WINDOWS){throw new Error(`Unable to locate executable file: ${e}. Please verify either the file path exists or the file can be found within a directory specified by the PATH environment variable. Also verify the file has a valid extension for an executable file.`)}else{throw new Error(`Unable to locate executable file: ${e}. Please verify either the file path exists or the file can be found within a directory specified by the PATH environment variable. Also check the file mode to verify the file is executable.`)}}return A}const t=yield findInPath(e);if(t&&t.length>0){return t[0]}return""}))}A.which=which;function findInPath(e){return n(this,void 0,void 0,(function*(){if(!e){throw new Error("parameter 'tool' is required")}const A=[];if(c.IS_WINDOWS&&process.env["PATHEXT"]){for(const e of process.env["PATHEXT"].split(a.delimiter)){if(e){A.push(e)}}}if(c.isRooted(e)){const t=yield c.tryGetExecutablePath(e,A);if(t){return[t]}return[]}if(e.includes(a.sep)){return[]}const t=[];if(process.env.PATH){for(const e of process.env.PATH.split(a.delimiter)){if(e){t.push(e)}}}const r=[];for(const s of t){const t=yield c.tryGetExecutablePath(a.join(s,e),A);if(t){r.push(t)}}return r}))}A.findInPath=findInPath;function readCopyOptions(e){const A=e.force==null?true:e.force;const t=Boolean(e.recursive);const r=e.copySourceDirectory==null?true:Boolean(e.copySourceDirectory);return{force:A,recursive:t,copySourceDirectory:r}}function cpDirRecursive(e,A,t,r){return n(this,void 0,void 0,(function*(){if(t>=255)return;t++;yield mkdirP(A);const s=yield c.readdir(e);for(const o of s){const s=`${e}/${o}`;const n=`${A}/${o}`;const i=yield c.lstat(s);if(i.isDirectory()){yield cpDirRecursive(s,n,t,r)}else{yield copyFile(s,n,r)}}yield c.chmod(A,(yield c.stat(e)).mode)}))}function copyFile(e,A,t){return n(this,void 0,void 0,(function*(){if((yield c.lstat(e)).isSymbolicLink()){try{yield c.lstat(A);yield c.unlink(A)}catch(e){if(e.code==="EPERM"){yield c.chmod(A,"0666");yield c.unlink(A)}}const t=yield c.readlink(e);yield c.symlink(t,A,c.IS_WINDOWS?"junction":null)}else if(!(yield c.exists(A))||t){yield c.copyFile(e,A)}}))}},7864:e=>{"use strict";var A=Object.defineProperty;var t=Object.getOwnPropertyDescriptor;var r=Object.getOwnPropertyNames;var s=Object.prototype.hasOwnProperty;var __export=(e,t)=>{for(var r in t)A(e,r,{get:t[r],enumerable:true})};var __copyProps=(e,o,n,i)=>{if(o&&typeof o==="object"||typeof o==="function"){for(let a of r(o))if(!s.call(e,a)&&a!==n)A(e,a,{get:()=>o[a],enumerable:!(i=t(o,a))||i.enumerable})}return e};var __toCommonJS=e=>__copyProps(A({},"__esModule",{value:true}),e);var o={};__export(o,{createTokenAuth:()=>c});e.exports=__toCommonJS(o);var n=/^v1\./;var i=/^ghs_/;var a=/^ghu_/;async function auth(e){const A=e.split(/\./).length===3;const t=n.test(e)||i.test(e);const r=a.test(e);const s=A?"app":t?"installation":r?"user-to-server":"oauth";return{type:"token",token:e,tokenType:s}}function withAuthorizationPrefix(e){if(e.split(/\./).length===3){return`bearer ${e}`}return`token ${e}`}async function hook(e,A,t,r){const s=A.endpoint.merge(t,r);s.headers.authorization=withAuthorizationPrefix(e);return A(s)}var c=function createTokenAuth2(e){if(!e){throw new Error("[@octokit/auth-token] No token passed to createTokenAuth")}if(typeof e!=="string"){throw new Error("[@octokit/auth-token] Token passed to createTokenAuth is not a string")}e=e.replace(/^(token|bearer) +/i,"");return Object.assign(auth.bind(null,e),{hook:hook.bind(null,e)})};0&&0},1897:(e,A,t)=>{"use strict";var r=Object.defineProperty;var s=Object.getOwnPropertyDescriptor;var o=Object.getOwnPropertyNames;var n=Object.prototype.hasOwnProperty;var __export=(e,A)=>{for(var t in A)r(e,t,{get:A[t],enumerable:true})};var __copyProps=(e,A,t,i)=>{if(A&&typeof A==="object"||typeof A==="function"){for(let a of o(A))if(!n.call(e,a)&&a!==t)r(e,a,{get:()=>A[a],enumerable:!(i=s(A,a))||i.enumerable})}return e};var __toCommonJS=e=>__copyProps(r({},"__esModule",{value:true}),e);var i={};__export(i,{Octokit:()=>d});e.exports=__toCommonJS(i);var a=t(3843);var c=t(2732);var g=t(8636);var l=t(7);var E=t(7864);var u="5.2.0";var noop=()=>{};var h=console.warn.bind(console);var Q=console.error.bind(console);var C=`octokit-core.js/${u} ${(0,a.getUserAgent)()}`;var d=class{static{this.VERSION=u}static defaults(e){const A=class extends(this){constructor(...A){const t=A[0]||{};if(typeof e==="function"){super(e(t));return}super(Object.assign({},e,t,t.userAgent&&e.userAgent?{userAgent:`${t.userAgent} ${e.userAgent}`}:null))}};return A}static{this.plugins=[]}static plugin(...e){const A=this.plugins;const t=class extends(this){static{this.plugins=A.concat(e.filter((e=>!A.includes(e))))}};return t}constructor(e={}){const A=new c.Collection;const t={baseUrl:g.request.endpoint.DEFAULTS.baseUrl,headers:{},request:Object.assign({},e.request,{hook:A.bind(null,"request")}),mediaType:{previews:[],format:""}};t.headers["user-agent"]=e.userAgent?`${e.userAgent} ${C}`:C;if(e.baseUrl){t.baseUrl=e.baseUrl}if(e.previews){t.mediaType.previews=e.previews}if(e.timeZone){t.headers["time-zone"]=e.timeZone}this.request=g.request.defaults(t);this.graphql=(0,l.withCustomRequest)(this.request).defaults(t);this.log=Object.assign({debug:noop,info:noop,warn:h,error:Q},e.log);this.hook=A;if(!e.authStrategy){if(!e.auth){this.auth=async()=>({type:"unauthenticated"})}else{const t=(0,E.createTokenAuth)(e.auth);A.wrap("request",t.hook);this.auth=t}}else{const{authStrategy:t,...r}=e;const s=t(Object.assign({request:this.request,log:this.log,octokit:this,octokitOptions:r},e.auth));A.wrap("request",s.hook);this.auth=s}const r=this.constructor;for(let A=0;A{"use strict";var r=Object.defineProperty;var s=Object.getOwnPropertyDescriptor;var o=Object.getOwnPropertyNames;var n=Object.prototype.hasOwnProperty;var __export=(e,A)=>{for(var t in A)r(e,t,{get:A[t],enumerable:true})};var __copyProps=(e,A,t,i)=>{if(A&&typeof A==="object"||typeof A==="function"){for(let a of o(A))if(!n.call(e,a)&&a!==t)r(e,a,{get:()=>A[a],enumerable:!(i=s(A,a))||i.enumerable})}return e};var __toCommonJS=e=>__copyProps(r({},"__esModule",{value:true}),e);var i={};__export(i,{endpoint:()=>u});e.exports=__toCommonJS(i);var a=t(3843);var c="9.0.5";var g=`octokit-endpoint.js/${c} ${(0,a.getUserAgent)()}`;var l={method:"GET",baseUrl:"https://api.github.com",headers:{accept:"application/vnd.github.v3+json","user-agent":g},mediaType:{format:""}};function lowercaseKeys(e){if(!e){return{}}return Object.keys(e).reduce(((A,t)=>{A[t.toLowerCase()]=e[t];return A}),{})}function isPlainObject(e){if(typeof e!=="object"||e===null)return false;if(Object.prototype.toString.call(e)!=="[object Object]")return false;const A=Object.getPrototypeOf(e);if(A===null)return true;const t=Object.prototype.hasOwnProperty.call(A,"constructor")&&A.constructor;return typeof t==="function"&&t instanceof t&&Function.prototype.call(t)===Function.prototype.call(e)}function mergeDeep(e,A){const t=Object.assign({},e);Object.keys(A).forEach((r=>{if(isPlainObject(A[r])){if(!(r in e))Object.assign(t,{[r]:A[r]});else t[r]=mergeDeep(e[r],A[r])}else{Object.assign(t,{[r]:A[r]})}}));return t}function removeUndefinedProperties(e){for(const A in e){if(e[A]===void 0){delete e[A]}}return e}function merge(e,A,t){if(typeof A==="string"){let[e,r]=A.split(" ");t=Object.assign(r?{method:e,url:r}:{url:e},t)}else{t=Object.assign({},A)}t.headers=lowercaseKeys(t.headers);removeUndefinedProperties(t);removeUndefinedProperties(t.headers);const r=mergeDeep(e||{},t);if(t.url==="/graphql"){if(e&&e.mediaType.previews?.length){r.mediaType.previews=e.mediaType.previews.filter((e=>!r.mediaType.previews.includes(e))).concat(r.mediaType.previews)}r.mediaType.previews=(r.mediaType.previews||[]).map((e=>e.replace(/-preview/,"")))}return r}function addQueryParameters(e,A){const t=/\?/.test(e)?"&":"?";const r=Object.keys(A);if(r.length===0){return e}return e+t+r.map((e=>{if(e==="q"){return"q="+A.q.split("+").map(encodeURIComponent).join("+")}return`${e}=${encodeURIComponent(A[e])}`})).join("&")}var E=/\{[^}]+\}/g;function removeNonChars(e){return e.replace(/^\W+|\W+$/g,"").split(/,/)}function extractUrlVariableNames(e){const A=e.match(E);if(!A){return[]}return A.map(removeNonChars).reduce(((e,A)=>e.concat(A)),[])}function omit(e,A){const t={__proto__:null};for(const r of Object.keys(e)){if(A.indexOf(r)===-1){t[r]=e[r]}}return t}function encodeReserved(e){return e.split(/(%[0-9A-Fa-f]{2})/g).map((function(e){if(!/%[0-9A-Fa-f]/.test(e)){e=encodeURI(e).replace(/%5B/g,"[").replace(/%5D/g,"]")}return e})).join("")}function encodeUnreserved(e){return encodeURIComponent(e).replace(/[!'()*]/g,(function(e){return"%"+e.charCodeAt(0).toString(16).toUpperCase()}))}function encodeValue(e,A,t){A=e==="+"||e==="#"?encodeReserved(A):encodeUnreserved(A);if(t){return encodeUnreserved(t)+"="+A}else{return A}}function isDefined(e){return e!==void 0&&e!==null}function isKeyOperator(e){return e===";"||e==="&"||e==="?"}function getValues(e,A,t,r){var s=e[t],o=[];if(isDefined(s)&&s!==""){if(typeof s==="string"||typeof s==="number"||typeof s==="boolean"){s=s.toString();if(r&&r!=="*"){s=s.substring(0,parseInt(r,10))}o.push(encodeValue(A,s,isKeyOperator(A)?t:""))}else{if(r==="*"){if(Array.isArray(s)){s.filter(isDefined).forEach((function(e){o.push(encodeValue(A,e,isKeyOperator(A)?t:""))}))}else{Object.keys(s).forEach((function(e){if(isDefined(s[e])){o.push(encodeValue(A,s[e],e))}}))}}else{const e=[];if(Array.isArray(s)){s.filter(isDefined).forEach((function(t){e.push(encodeValue(A,t))}))}else{Object.keys(s).forEach((function(t){if(isDefined(s[t])){e.push(encodeUnreserved(t));e.push(encodeValue(A,s[t].toString()))}}))}if(isKeyOperator(A)){o.push(encodeUnreserved(t)+"="+e.join(","))}else if(e.length!==0){o.push(e.join(","))}}}}else{if(A===";"){if(isDefined(s)){o.push(encodeUnreserved(t))}}else if(s===""&&(A==="&"||A==="?")){o.push(encodeUnreserved(t)+"=")}else if(s===""){o.push("")}}return o}function parseUrl(e){return{expand:expand.bind(null,e)}}function expand(e,A){var t=["+","#",".","/",";","?","&"];e=e.replace(/\{([^\{\}]+)\}|([^\{\}]+)/g,(function(e,r,s){if(r){let e="";const s=[];if(t.indexOf(r.charAt(0))!==-1){e=r.charAt(0);r=r.substr(1)}r.split(/,/g).forEach((function(t){var r=/([^:\*]*)(?::(\d+)|(\*))?/.exec(t);s.push(getValues(A,e,r[1],r[2]||r[3]))}));if(e&&e!=="+"){var o=",";if(e==="?"){o="&"}else if(e!=="#"){o=e}return(s.length!==0?e:"")+s.join(o)}else{return s.join(",")}}else{return encodeReserved(s)}}));if(e==="/"){return e}else{return e.replace(/\/$/,"")}}function parse(e){let A=e.method.toUpperCase();let t=(e.url||"/").replace(/:([a-z]\w+)/g,"{$1}");let r=Object.assign({},e.headers);let s;let o=omit(e,["method","baseUrl","url","headers","request","mediaType"]);const n=extractUrlVariableNames(t);t=parseUrl(t).expand(o);if(!/^http/.test(t)){t=e.baseUrl+t}const i=Object.keys(e).filter((e=>n.includes(e))).concat("baseUrl");const a=omit(o,i);const c=/application\/octet-stream/i.test(r.accept);if(!c){if(e.mediaType.format){r.accept=r.accept.split(/,/).map((A=>A.replace(/application\/vnd(\.\w+)(\.v3)?(\.\w+)?(\+json)?$/,`application/vnd$1$2.${e.mediaType.format}`))).join(",")}if(t.endsWith("/graphql")){if(e.mediaType.previews?.length){const A=r.accept.match(/[\w-]+(?=-preview)/g)||[];r.accept=A.concat(e.mediaType.previews).map((A=>{const t=e.mediaType.format?`.${e.mediaType.format}`:"+json";return`application/vnd.github.${A}-preview${t}`})).join(",")}}}if(["GET","HEAD"].includes(A)){t=addQueryParameters(t,a)}else{if("data"in a){s=a.data}else{if(Object.keys(a).length){s=a}}}if(!r["content-type"]&&typeof s!=="undefined"){r["content-type"]="application/json; charset=utf-8"}if(["PATCH","PUT"].includes(A)&&typeof s==="undefined"){s=""}return Object.assign({method:A,url:t,headers:r},typeof s!=="undefined"?{body:s}:null,e.request?{request:e.request}:null)}function endpointWithDefaults(e,A,t){return parse(merge(e,A,t))}function withDefaults(e,A){const t=merge(e,A);const r=endpointWithDefaults.bind(null,t);return Object.assign(r,{DEFAULTS:t,defaults:withDefaults.bind(null,t),merge:merge.bind(null,t),parse:parse})}var u=withDefaults(null,l);0&&0},7:(e,A,t)=>{"use strict";var r=Object.defineProperty;var s=Object.getOwnPropertyDescriptor;var o=Object.getOwnPropertyNames;var n=Object.prototype.hasOwnProperty;var __export=(e,A)=>{for(var t in A)r(e,t,{get:A[t],enumerable:true})};var __copyProps=(e,A,t,i)=>{if(A&&typeof A==="object"||typeof A==="function"){for(let a of o(A))if(!n.call(e,a)&&a!==t)r(e,a,{get:()=>A[a],enumerable:!(i=s(A,a))||i.enumerable})}return e};var __toCommonJS=e=>__copyProps(r({},"__esModule",{value:true}),e);var i={};__export(i,{GraphqlResponseError:()=>u,graphql:()=>d,withCustomRequest:()=>withCustomRequest});e.exports=__toCommonJS(i);var a=t(8636);var c=t(3843);var g="7.1.0";var l=t(8636);var E=t(8636);function _buildMessageForResponseErrors(e){return`Request failed due to following response errors:\n`+e.errors.map((e=>` - ${e.message}`)).join("\n")}var u=class extends Error{constructor(e,A,t){super(_buildMessageForResponseErrors(t));this.request=e;this.headers=A;this.response=t;this.name="GraphqlResponseError";this.errors=t.errors;this.data=t.data;if(Error.captureStackTrace){Error.captureStackTrace(this,this.constructor)}}};var h=["method","baseUrl","url","headers","request","query","mediaType"];var Q=["query","method","url"];var C=/\/api\/v3\/?$/;function graphql(e,A,t){if(t){if(typeof A==="string"&&"query"in t){return Promise.reject(new Error(`[@octokit/graphql] "query" cannot be used as variable name`))}for(const e in t){if(!Q.includes(e))continue;return Promise.reject(new Error(`[@octokit/graphql] "${e}" cannot be used as variable name`))}}const r=typeof A==="string"?Object.assign({query:A},t):A;const s=Object.keys(r).reduce(((e,A)=>{if(h.includes(A)){e[A]=r[A];return e}if(!e.variables){e.variables={}}e.variables[A]=r[A];return e}),{});const o=r.baseUrl||e.endpoint.DEFAULTS.baseUrl;if(C.test(o)){s.url=o.replace(C,"/api/graphql")}return e(s).then((e=>{if(e.data.errors){const A={};for(const t of Object.keys(e.headers)){A[t]=e.headers[t]}throw new u(s,A,e.data)}return e.data.data}))}function withDefaults(e,A){const t=e.defaults(A);const newApi=(e,A)=>graphql(t,e,A);return Object.assign(newApi,{defaults:withDefaults.bind(null,t),endpoint:t.endpoint})}var d=withDefaults(a.request,{headers:{"user-agent":`octokit-graphql.js/${g} ${(0,c.getUserAgent)()}`},method:"POST",url:"/graphql"});function withCustomRequest(e){return withDefaults(e,{method:"POST",url:"/graphql"})}0&&0},8082:e=>{"use strict";var A=Object.defineProperty;var t=Object.getOwnPropertyDescriptor;var r=Object.getOwnPropertyNames;var s=Object.prototype.hasOwnProperty;var __export=(e,t)=>{for(var r in t)A(e,r,{get:t[r],enumerable:true})};var __copyProps=(e,o,n,i)=>{if(o&&typeof o==="object"||typeof o==="function"){for(let a of r(o))if(!s.call(e,a)&&a!==n)A(e,a,{get:()=>o[a],enumerable:!(i=t(o,a))||i.enumerable})}return e};var __toCommonJS=e=>__copyProps(A({},"__esModule",{value:true}),e);var o={};__export(o,{composePaginateRest:()=>i,isPaginatingEndpoint:()=>isPaginatingEndpoint,paginateRest:()=>paginateRest,paginatingEndpoints:()=>a});e.exports=__toCommonJS(o);var n="9.2.1";function normalizePaginatedListResponse(e){if(!e.data){return{...e,data:[]}}const A="total_count"in e.data&&!("url"in e.data);if(!A)return e;const t=e.data.incomplete_results;const r=e.data.repository_selection;const s=e.data.total_count;delete e.data.incomplete_results;delete e.data.repository_selection;delete e.data.total_count;const o=Object.keys(e.data)[0];const n=e.data[o];e.data=n;if(typeof t!=="undefined"){e.data.incomplete_results=t}if(typeof r!=="undefined"){e.data.repository_selection=r}e.data.total_count=s;return e}function iterator(e,A,t){const r=typeof A==="function"?A.endpoint(t):e.request.endpoint(A,t);const s=typeof A==="function"?A:e.request;const o=r.method;const n=r.headers;let i=r.url;return{[Symbol.asyncIterator]:()=>({async next(){if(!i)return{done:true};try{const e=await s({method:o,url:i,headers:n});const A=normalizePaginatedListResponse(e);i=((A.headers.link||"").match(/<([^>]+)>;\s*rel="next"/)||[])[1];return{value:A}}catch(e){if(e.status!==409)throw e;i="";return{value:{status:200,headers:{},data:[]}}}}})}}function paginate(e,A,t,r){if(typeof t==="function"){r=t;t=void 0}return gather(e,[],iterator(e,A,t)[Symbol.asyncIterator](),r)}function gather(e,A,t,r){return t.next().then((s=>{if(s.done){return A}let o=false;function done(){o=true}A=A.concat(r?r(s.value,done):s.value.data);if(o){return A}return gather(e,A,t,r)}))}var i=Object.assign(paginate,{iterator:iterator});var a=["GET /advisories","GET /app/hook/deliveries","GET /app/installation-requests","GET /app/installations","GET /assignments/{assignment_id}/accepted_assignments","GET /classrooms","GET /classrooms/{classroom_id}/assignments","GET /enterprises/{enterprise}/dependabot/alerts","GET /enterprises/{enterprise}/secret-scanning/alerts","GET /events","GET /gists","GET /gists/public","GET /gists/starred","GET /gists/{gist_id}/comments","GET /gists/{gist_id}/commits","GET /gists/{gist_id}/forks","GET /installation/repositories","GET /issues","GET /licenses","GET /marketplace_listing/plans","GET /marketplace_listing/plans/{plan_id}/accounts","GET /marketplace_listing/stubbed/plans","GET /marketplace_listing/stubbed/plans/{plan_id}/accounts","GET /networks/{owner}/{repo}/events","GET /notifications","GET /organizations","GET /orgs/{org}/actions/cache/usage-by-repository","GET /orgs/{org}/actions/permissions/repositories","GET /orgs/{org}/actions/runners","GET /orgs/{org}/actions/secrets","GET /orgs/{org}/actions/secrets/{secret_name}/repositories","GET /orgs/{org}/actions/variables","GET /orgs/{org}/actions/variables/{name}/repositories","GET /orgs/{org}/blocks","GET /orgs/{org}/code-scanning/alerts","GET /orgs/{org}/codespaces","GET /orgs/{org}/codespaces/secrets","GET /orgs/{org}/codespaces/secrets/{secret_name}/repositories","GET /orgs/{org}/copilot/billing/seats","GET /orgs/{org}/dependabot/alerts","GET /orgs/{org}/dependabot/secrets","GET /orgs/{org}/dependabot/secrets/{secret_name}/repositories","GET /orgs/{org}/events","GET /orgs/{org}/failed_invitations","GET /orgs/{org}/hooks","GET /orgs/{org}/hooks/{hook_id}/deliveries","GET /orgs/{org}/installations","GET /orgs/{org}/invitations","GET /orgs/{org}/invitations/{invitation_id}/teams","GET /orgs/{org}/issues","GET /orgs/{org}/members","GET /orgs/{org}/members/{username}/codespaces","GET /orgs/{org}/migrations","GET /orgs/{org}/migrations/{migration_id}/repositories","GET /orgs/{org}/organization-roles/{role_id}/teams","GET /orgs/{org}/organization-roles/{role_id}/users","GET /orgs/{org}/outside_collaborators","GET /orgs/{org}/packages","GET /orgs/{org}/packages/{package_type}/{package_name}/versions","GET /orgs/{org}/personal-access-token-requests","GET /orgs/{org}/personal-access-token-requests/{pat_request_id}/repositories","GET /orgs/{org}/personal-access-tokens","GET /orgs/{org}/personal-access-tokens/{pat_id}/repositories","GET /orgs/{org}/projects","GET /orgs/{org}/properties/values","GET /orgs/{org}/public_members","GET /orgs/{org}/repos","GET /orgs/{org}/rulesets","GET /orgs/{org}/rulesets/rule-suites","GET /orgs/{org}/secret-scanning/alerts","GET /orgs/{org}/security-advisories","GET /orgs/{org}/teams","GET /orgs/{org}/teams/{team_slug}/discussions","GET /orgs/{org}/teams/{team_slug}/discussions/{discussion_number}/comments","GET /orgs/{org}/teams/{team_slug}/discussions/{discussion_number}/comments/{comment_number}/reactions","GET /orgs/{org}/teams/{team_slug}/discussions/{discussion_number}/reactions","GET /orgs/{org}/teams/{team_slug}/invitations","GET /orgs/{org}/teams/{team_slug}/members","GET /orgs/{org}/teams/{team_slug}/projects","GET /orgs/{org}/teams/{team_slug}/repos","GET /orgs/{org}/teams/{team_slug}/teams","GET /projects/columns/{column_id}/cards","GET /projects/{project_id}/collaborators","GET /projects/{project_id}/columns","GET /repos/{owner}/{repo}/actions/artifacts","GET /repos/{owner}/{repo}/actions/caches","GET /repos/{owner}/{repo}/actions/organization-secrets","GET /repos/{owner}/{repo}/actions/organization-variables","GET /repos/{owner}/{repo}/actions/runners","GET /repos/{owner}/{repo}/actions/runs","GET /repos/{owner}/{repo}/actions/runs/{run_id}/artifacts","GET /repos/{owner}/{repo}/actions/runs/{run_id}/attempts/{attempt_number}/jobs","GET /repos/{owner}/{repo}/actions/runs/{run_id}/jobs","GET /repos/{owner}/{repo}/actions/secrets","GET /repos/{owner}/{repo}/actions/variables","GET /repos/{owner}/{repo}/actions/workflows","GET /repos/{owner}/{repo}/actions/workflows/{workflow_id}/runs","GET /repos/{owner}/{repo}/activity","GET /repos/{owner}/{repo}/assignees","GET /repos/{owner}/{repo}/branches","GET /repos/{owner}/{repo}/check-runs/{check_run_id}/annotations","GET /repos/{owner}/{repo}/check-suites/{check_suite_id}/check-runs","GET /repos/{owner}/{repo}/code-scanning/alerts","GET /repos/{owner}/{repo}/code-scanning/alerts/{alert_number}/instances","GET /repos/{owner}/{repo}/code-scanning/analyses","GET /repos/{owner}/{repo}/codespaces","GET /repos/{owner}/{repo}/codespaces/devcontainers","GET /repos/{owner}/{repo}/codespaces/secrets","GET /repos/{owner}/{repo}/collaborators","GET /repos/{owner}/{repo}/comments","GET /repos/{owner}/{repo}/comments/{comment_id}/reactions","GET /repos/{owner}/{repo}/commits","GET /repos/{owner}/{repo}/commits/{commit_sha}/comments","GET /repos/{owner}/{repo}/commits/{commit_sha}/pulls","GET /repos/{owner}/{repo}/commits/{ref}/check-runs","GET /repos/{owner}/{repo}/commits/{ref}/check-suites","GET /repos/{owner}/{repo}/commits/{ref}/status","GET /repos/{owner}/{repo}/commits/{ref}/statuses","GET /repos/{owner}/{repo}/contributors","GET /repos/{owner}/{repo}/dependabot/alerts","GET /repos/{owner}/{repo}/dependabot/secrets","GET /repos/{owner}/{repo}/deployments","GET /repos/{owner}/{repo}/deployments/{deployment_id}/statuses","GET /repos/{owner}/{repo}/environments","GET /repos/{owner}/{repo}/environments/{environment_name}/deployment-branch-policies","GET /repos/{owner}/{repo}/environments/{environment_name}/deployment_protection_rules/apps","GET /repos/{owner}/{repo}/events","GET /repos/{owner}/{repo}/forks","GET /repos/{owner}/{repo}/hooks","GET /repos/{owner}/{repo}/hooks/{hook_id}/deliveries","GET /repos/{owner}/{repo}/invitations","GET /repos/{owner}/{repo}/issues","GET /repos/{owner}/{repo}/issues/comments","GET /repos/{owner}/{repo}/issues/comments/{comment_id}/reactions","GET /repos/{owner}/{repo}/issues/events","GET /repos/{owner}/{repo}/issues/{issue_number}/comments","GET /repos/{owner}/{repo}/issues/{issue_number}/events","GET /repos/{owner}/{repo}/issues/{issue_number}/labels","GET /repos/{owner}/{repo}/issues/{issue_number}/reactions","GET /repos/{owner}/{repo}/issues/{issue_number}/timeline","GET /repos/{owner}/{repo}/keys","GET /repos/{owner}/{repo}/labels","GET /repos/{owner}/{repo}/milestones","GET /repos/{owner}/{repo}/milestones/{milestone_number}/labels","GET /repos/{owner}/{repo}/notifications","GET /repos/{owner}/{repo}/pages/builds","GET /repos/{owner}/{repo}/projects","GET /repos/{owner}/{repo}/pulls","GET /repos/{owner}/{repo}/pulls/comments","GET /repos/{owner}/{repo}/pulls/comments/{comment_id}/reactions","GET /repos/{owner}/{repo}/pulls/{pull_number}/comments","GET /repos/{owner}/{repo}/pulls/{pull_number}/commits","GET /repos/{owner}/{repo}/pulls/{pull_number}/files","GET /repos/{owner}/{repo}/pulls/{pull_number}/reviews","GET /repos/{owner}/{repo}/pulls/{pull_number}/reviews/{review_id}/comments","GET /repos/{owner}/{repo}/releases","GET /repos/{owner}/{repo}/releases/{release_id}/assets","GET /repos/{owner}/{repo}/releases/{release_id}/reactions","GET /repos/{owner}/{repo}/rules/branches/{branch}","GET /repos/{owner}/{repo}/rulesets","GET /repos/{owner}/{repo}/rulesets/rule-suites","GET /repos/{owner}/{repo}/secret-scanning/alerts","GET /repos/{owner}/{repo}/secret-scanning/alerts/{alert_number}/locations","GET /repos/{owner}/{repo}/security-advisories","GET /repos/{owner}/{repo}/stargazers","GET /repos/{owner}/{repo}/subscribers","GET /repos/{owner}/{repo}/tags","GET /repos/{owner}/{repo}/teams","GET /repos/{owner}/{repo}/topics","GET /repositories","GET /repositories/{repository_id}/environments/{environment_name}/secrets","GET /repositories/{repository_id}/environments/{environment_name}/variables","GET /search/code","GET /search/commits","GET /search/issues","GET /search/labels","GET /search/repositories","GET /search/topics","GET /search/users","GET /teams/{team_id}/discussions","GET /teams/{team_id}/discussions/{discussion_number}/comments","GET /teams/{team_id}/discussions/{discussion_number}/comments/{comment_number}/reactions","GET /teams/{team_id}/discussions/{discussion_number}/reactions","GET /teams/{team_id}/invitations","GET /teams/{team_id}/members","GET /teams/{team_id}/projects","GET /teams/{team_id}/repos","GET /teams/{team_id}/teams","GET /user/blocks","GET /user/codespaces","GET /user/codespaces/secrets","GET /user/emails","GET /user/followers","GET /user/following","GET /user/gpg_keys","GET /user/installations","GET /user/installations/{installation_id}/repositories","GET /user/issues","GET /user/keys","GET /user/marketplace_purchases","GET /user/marketplace_purchases/stubbed","GET /user/memberships/orgs","GET /user/migrations","GET /user/migrations/{migration_id}/repositories","GET /user/orgs","GET /user/packages","GET /user/packages/{package_type}/{package_name}/versions","GET /user/public_emails","GET /user/repos","GET /user/repository_invitations","GET /user/social_accounts","GET /user/ssh_signing_keys","GET /user/starred","GET /user/subscriptions","GET /user/teams","GET /users","GET /users/{username}/events","GET /users/{username}/events/orgs/{org}","GET /users/{username}/events/public","GET /users/{username}/followers","GET /users/{username}/following","GET /users/{username}/gists","GET /users/{username}/gpg_keys","GET /users/{username}/keys","GET /users/{username}/orgs","GET /users/{username}/packages","GET /users/{username}/projects","GET /users/{username}/received_events","GET /users/{username}/received_events/public","GET /users/{username}/repos","GET /users/{username}/social_accounts","GET /users/{username}/ssh_signing_keys","GET /users/{username}/starred","GET /users/{username}/subscriptions"];function isPaginatingEndpoint(e){if(typeof e==="string"){return a.includes(e)}else{return false}}function paginateRest(e){return{paginate:Object.assign(paginate.bind(null,e),{iterator:iterator.bind(null,e)})}}paginateRest.VERSION=n;0&&0},4935:e=>{"use strict";var A=Object.defineProperty;var t=Object.getOwnPropertyDescriptor;var r=Object.getOwnPropertyNames;var s=Object.prototype.hasOwnProperty;var __export=(e,t)=>{for(var r in t)A(e,r,{get:t[r],enumerable:true})};var __copyProps=(e,o,n,i)=>{if(o&&typeof o==="object"||typeof o==="function"){for(let a of r(o))if(!s.call(e,a)&&a!==n)A(e,a,{get:()=>o[a],enumerable:!(i=t(o,a))||i.enumerable})}return e};var __toCommonJS=e=>__copyProps(A({},"__esModule",{value:true}),e);var o={};__export(o,{legacyRestEndpointMethods:()=>legacyRestEndpointMethods,restEndpointMethods:()=>restEndpointMethods});e.exports=__toCommonJS(o);var n="10.4.1";var i={actions:{addCustomLabelsToSelfHostedRunnerForOrg:["POST /orgs/{org}/actions/runners/{runner_id}/labels"],addCustomLabelsToSelfHostedRunnerForRepo:["POST /repos/{owner}/{repo}/actions/runners/{runner_id}/labels"],addSelectedRepoToOrgSecret:["PUT /orgs/{org}/actions/secrets/{secret_name}/repositories/{repository_id}"],addSelectedRepoToOrgVariable:["PUT /orgs/{org}/actions/variables/{name}/repositories/{repository_id}"],approveWorkflowRun:["POST /repos/{owner}/{repo}/actions/runs/{run_id}/approve"],cancelWorkflowRun:["POST /repos/{owner}/{repo}/actions/runs/{run_id}/cancel"],createEnvironmentVariable:["POST /repositories/{repository_id}/environments/{environment_name}/variables"],createOrUpdateEnvironmentSecret:["PUT /repositories/{repository_id}/environments/{environment_name}/secrets/{secret_name}"],createOrUpdateOrgSecret:["PUT /orgs/{org}/actions/secrets/{secret_name}"],createOrUpdateRepoSecret:["PUT /repos/{owner}/{repo}/actions/secrets/{secret_name}"],createOrgVariable:["POST /orgs/{org}/actions/variables"],createRegistrationTokenForOrg:["POST /orgs/{org}/actions/runners/registration-token"],createRegistrationTokenForRepo:["POST /repos/{owner}/{repo}/actions/runners/registration-token"],createRemoveTokenForOrg:["POST /orgs/{org}/actions/runners/remove-token"],createRemoveTokenForRepo:["POST /repos/{owner}/{repo}/actions/runners/remove-token"],createRepoVariable:["POST /repos/{owner}/{repo}/actions/variables"],createWorkflowDispatch:["POST /repos/{owner}/{repo}/actions/workflows/{workflow_id}/dispatches"],deleteActionsCacheById:["DELETE /repos/{owner}/{repo}/actions/caches/{cache_id}"],deleteActionsCacheByKey:["DELETE /repos/{owner}/{repo}/actions/caches{?key,ref}"],deleteArtifact:["DELETE /repos/{owner}/{repo}/actions/artifacts/{artifact_id}"],deleteEnvironmentSecret:["DELETE /repositories/{repository_id}/environments/{environment_name}/secrets/{secret_name}"],deleteEnvironmentVariable:["DELETE /repositories/{repository_id}/environments/{environment_name}/variables/{name}"],deleteOrgSecret:["DELETE /orgs/{org}/actions/secrets/{secret_name}"],deleteOrgVariable:["DELETE /orgs/{org}/actions/variables/{name}"],deleteRepoSecret:["DELETE /repos/{owner}/{repo}/actions/secrets/{secret_name}"],deleteRepoVariable:["DELETE /repos/{owner}/{repo}/actions/variables/{name}"],deleteSelfHostedRunnerFromOrg:["DELETE /orgs/{org}/actions/runners/{runner_id}"],deleteSelfHostedRunnerFromRepo:["DELETE /repos/{owner}/{repo}/actions/runners/{runner_id}"],deleteWorkflowRun:["DELETE /repos/{owner}/{repo}/actions/runs/{run_id}"],deleteWorkflowRunLogs:["DELETE /repos/{owner}/{repo}/actions/runs/{run_id}/logs"],disableSelectedRepositoryGithubActionsOrganization:["DELETE /orgs/{org}/actions/permissions/repositories/{repository_id}"],disableWorkflow:["PUT /repos/{owner}/{repo}/actions/workflows/{workflow_id}/disable"],downloadArtifact:["GET /repos/{owner}/{repo}/actions/artifacts/{artifact_id}/{archive_format}"],downloadJobLogsForWorkflowRun:["GET /repos/{owner}/{repo}/actions/jobs/{job_id}/logs"],downloadWorkflowRunAttemptLogs:["GET /repos/{owner}/{repo}/actions/runs/{run_id}/attempts/{attempt_number}/logs"],downloadWorkflowRunLogs:["GET /repos/{owner}/{repo}/actions/runs/{run_id}/logs"],enableSelectedRepositoryGithubActionsOrganization:["PUT /orgs/{org}/actions/permissions/repositories/{repository_id}"],enableWorkflow:["PUT /repos/{owner}/{repo}/actions/workflows/{workflow_id}/enable"],forceCancelWorkflowRun:["POST /repos/{owner}/{repo}/actions/runs/{run_id}/force-cancel"],generateRunnerJitconfigForOrg:["POST /orgs/{org}/actions/runners/generate-jitconfig"],generateRunnerJitconfigForRepo:["POST /repos/{owner}/{repo}/actions/runners/generate-jitconfig"],getActionsCacheList:["GET /repos/{owner}/{repo}/actions/caches"],getActionsCacheUsage:["GET /repos/{owner}/{repo}/actions/cache/usage"],getActionsCacheUsageByRepoForOrg:["GET /orgs/{org}/actions/cache/usage-by-repository"],getActionsCacheUsageForOrg:["GET /orgs/{org}/actions/cache/usage"],getAllowedActionsOrganization:["GET /orgs/{org}/actions/permissions/selected-actions"],getAllowedActionsRepository:["GET /repos/{owner}/{repo}/actions/permissions/selected-actions"],getArtifact:["GET /repos/{owner}/{repo}/actions/artifacts/{artifact_id}"],getCustomOidcSubClaimForRepo:["GET /repos/{owner}/{repo}/actions/oidc/customization/sub"],getEnvironmentPublicKey:["GET /repositories/{repository_id}/environments/{environment_name}/secrets/public-key"],getEnvironmentSecret:["GET /repositories/{repository_id}/environments/{environment_name}/secrets/{secret_name}"],getEnvironmentVariable:["GET /repositories/{repository_id}/environments/{environment_name}/variables/{name}"],getGithubActionsDefaultWorkflowPermissionsOrganization:["GET /orgs/{org}/actions/permissions/workflow"],getGithubActionsDefaultWorkflowPermissionsRepository:["GET /repos/{owner}/{repo}/actions/permissions/workflow"],getGithubActionsPermissionsOrganization:["GET /orgs/{org}/actions/permissions"],getGithubActionsPermissionsRepository:["GET /repos/{owner}/{repo}/actions/permissions"],getJobForWorkflowRun:["GET /repos/{owner}/{repo}/actions/jobs/{job_id}"],getOrgPublicKey:["GET /orgs/{org}/actions/secrets/public-key"],getOrgSecret:["GET /orgs/{org}/actions/secrets/{secret_name}"],getOrgVariable:["GET /orgs/{org}/actions/variables/{name}"],getPendingDeploymentsForRun:["GET /repos/{owner}/{repo}/actions/runs/{run_id}/pending_deployments"],getRepoPermissions:["GET /repos/{owner}/{repo}/actions/permissions",{},{renamed:["actions","getGithubActionsPermissionsRepository"]}],getRepoPublicKey:["GET /repos/{owner}/{repo}/actions/secrets/public-key"],getRepoSecret:["GET /repos/{owner}/{repo}/actions/secrets/{secret_name}"],getRepoVariable:["GET /repos/{owner}/{repo}/actions/variables/{name}"],getReviewsForRun:["GET /repos/{owner}/{repo}/actions/runs/{run_id}/approvals"],getSelfHostedRunnerForOrg:["GET /orgs/{org}/actions/runners/{runner_id}"],getSelfHostedRunnerForRepo:["GET /repos/{owner}/{repo}/actions/runners/{runner_id}"],getWorkflow:["GET /repos/{owner}/{repo}/actions/workflows/{workflow_id}"],getWorkflowAccessToRepository:["GET /repos/{owner}/{repo}/actions/permissions/access"],getWorkflowRun:["GET /repos/{owner}/{repo}/actions/runs/{run_id}"],getWorkflowRunAttempt:["GET /repos/{owner}/{repo}/actions/runs/{run_id}/attempts/{attempt_number}"],getWorkflowRunUsage:["GET /repos/{owner}/{repo}/actions/runs/{run_id}/timing"],getWorkflowUsage:["GET /repos/{owner}/{repo}/actions/workflows/{workflow_id}/timing"],listArtifactsForRepo:["GET /repos/{owner}/{repo}/actions/artifacts"],listEnvironmentSecrets:["GET /repositories/{repository_id}/environments/{environment_name}/secrets"],listEnvironmentVariables:["GET /repositories/{repository_id}/environments/{environment_name}/variables"],listJobsForWorkflowRun:["GET /repos/{owner}/{repo}/actions/runs/{run_id}/jobs"],listJobsForWorkflowRunAttempt:["GET /repos/{owner}/{repo}/actions/runs/{run_id}/attempts/{attempt_number}/jobs"],listLabelsForSelfHostedRunnerForOrg:["GET /orgs/{org}/actions/runners/{runner_id}/labels"],listLabelsForSelfHostedRunnerForRepo:["GET /repos/{owner}/{repo}/actions/runners/{runner_id}/labels"],listOrgSecrets:["GET /orgs/{org}/actions/secrets"],listOrgVariables:["GET /orgs/{org}/actions/variables"],listRepoOrganizationSecrets:["GET /repos/{owner}/{repo}/actions/organization-secrets"],listRepoOrganizationVariables:["GET /repos/{owner}/{repo}/actions/organization-variables"],listRepoSecrets:["GET /repos/{owner}/{repo}/actions/secrets"],listRepoVariables:["GET /repos/{owner}/{repo}/actions/variables"],listRepoWorkflows:["GET /repos/{owner}/{repo}/actions/workflows"],listRunnerApplicationsForOrg:["GET /orgs/{org}/actions/runners/downloads"],listRunnerApplicationsForRepo:["GET /repos/{owner}/{repo}/actions/runners/downloads"],listSelectedReposForOrgSecret:["GET /orgs/{org}/actions/secrets/{secret_name}/repositories"],listSelectedReposForOrgVariable:["GET /orgs/{org}/actions/variables/{name}/repositories"],listSelectedRepositoriesEnabledGithubActionsOrganization:["GET /orgs/{org}/actions/permissions/repositories"],listSelfHostedRunnersForOrg:["GET /orgs/{org}/actions/runners"],listSelfHostedRunnersForRepo:["GET /repos/{owner}/{repo}/actions/runners"],listWorkflowRunArtifacts:["GET /repos/{owner}/{repo}/actions/runs/{run_id}/artifacts"],listWorkflowRuns:["GET /repos/{owner}/{repo}/actions/workflows/{workflow_id}/runs"],listWorkflowRunsForRepo:["GET /repos/{owner}/{repo}/actions/runs"],reRunJobForWorkflowRun:["POST /repos/{owner}/{repo}/actions/jobs/{job_id}/rerun"],reRunWorkflow:["POST /repos/{owner}/{repo}/actions/runs/{run_id}/rerun"],reRunWorkflowFailedJobs:["POST /repos/{owner}/{repo}/actions/runs/{run_id}/rerun-failed-jobs"],removeAllCustomLabelsFromSelfHostedRunnerForOrg:["DELETE /orgs/{org}/actions/runners/{runner_id}/labels"],removeAllCustomLabelsFromSelfHostedRunnerForRepo:["DELETE /repos/{owner}/{repo}/actions/runners/{runner_id}/labels"],removeCustomLabelFromSelfHostedRunnerForOrg:["DELETE /orgs/{org}/actions/runners/{runner_id}/labels/{name}"],removeCustomLabelFromSelfHostedRunnerForRepo:["DELETE /repos/{owner}/{repo}/actions/runners/{runner_id}/labels/{name}"],removeSelectedRepoFromOrgSecret:["DELETE /orgs/{org}/actions/secrets/{secret_name}/repositories/{repository_id}"],removeSelectedRepoFromOrgVariable:["DELETE /orgs/{org}/actions/variables/{name}/repositories/{repository_id}"],reviewCustomGatesForRun:["POST /repos/{owner}/{repo}/actions/runs/{run_id}/deployment_protection_rule"],reviewPendingDeploymentsForRun:["POST /repos/{owner}/{repo}/actions/runs/{run_id}/pending_deployments"],setAllowedActionsOrganization:["PUT /orgs/{org}/actions/permissions/selected-actions"],setAllowedActionsRepository:["PUT /repos/{owner}/{repo}/actions/permissions/selected-actions"],setCustomLabelsForSelfHostedRunnerForOrg:["PUT /orgs/{org}/actions/runners/{runner_id}/labels"],setCustomLabelsForSelfHostedRunnerForRepo:["PUT /repos/{owner}/{repo}/actions/runners/{runner_id}/labels"],setCustomOidcSubClaimForRepo:["PUT /repos/{owner}/{repo}/actions/oidc/customization/sub"],setGithubActionsDefaultWorkflowPermissionsOrganization:["PUT /orgs/{org}/actions/permissions/workflow"],setGithubActionsDefaultWorkflowPermissionsRepository:["PUT /repos/{owner}/{repo}/actions/permissions/workflow"],setGithubActionsPermissionsOrganization:["PUT /orgs/{org}/actions/permissions"],setGithubActionsPermissionsRepository:["PUT /repos/{owner}/{repo}/actions/permissions"],setSelectedReposForOrgSecret:["PUT /orgs/{org}/actions/secrets/{secret_name}/repositories"],setSelectedReposForOrgVariable:["PUT /orgs/{org}/actions/variables/{name}/repositories"],setSelectedRepositoriesEnabledGithubActionsOrganization:["PUT /orgs/{org}/actions/permissions/repositories"],setWorkflowAccessToRepository:["PUT /repos/{owner}/{repo}/actions/permissions/access"],updateEnvironmentVariable:["PATCH /repositories/{repository_id}/environments/{environment_name}/variables/{name}"],updateOrgVariable:["PATCH /orgs/{org}/actions/variables/{name}"],updateRepoVariable:["PATCH /repos/{owner}/{repo}/actions/variables/{name}"]},activity:{checkRepoIsStarredByAuthenticatedUser:["GET /user/starred/{owner}/{repo}"],deleteRepoSubscription:["DELETE /repos/{owner}/{repo}/subscription"],deleteThreadSubscription:["DELETE /notifications/threads/{thread_id}/subscription"],getFeeds:["GET /feeds"],getRepoSubscription:["GET /repos/{owner}/{repo}/subscription"],getThread:["GET /notifications/threads/{thread_id}"],getThreadSubscriptionForAuthenticatedUser:["GET /notifications/threads/{thread_id}/subscription"],listEventsForAuthenticatedUser:["GET /users/{username}/events"],listNotificationsForAuthenticatedUser:["GET /notifications"],listOrgEventsForAuthenticatedUser:["GET /users/{username}/events/orgs/{org}"],listPublicEvents:["GET /events"],listPublicEventsForRepoNetwork:["GET /networks/{owner}/{repo}/events"],listPublicEventsForUser:["GET /users/{username}/events/public"],listPublicOrgEvents:["GET /orgs/{org}/events"],listReceivedEventsForUser:["GET /users/{username}/received_events"],listReceivedPublicEventsForUser:["GET /users/{username}/received_events/public"],listRepoEvents:["GET /repos/{owner}/{repo}/events"],listRepoNotificationsForAuthenticatedUser:["GET /repos/{owner}/{repo}/notifications"],listReposStarredByAuthenticatedUser:["GET /user/starred"],listReposStarredByUser:["GET /users/{username}/starred"],listReposWatchedByUser:["GET /users/{username}/subscriptions"],listStargazersForRepo:["GET /repos/{owner}/{repo}/stargazers"],listWatchedReposForAuthenticatedUser:["GET /user/subscriptions"],listWatchersForRepo:["GET /repos/{owner}/{repo}/subscribers"],markNotificationsAsRead:["PUT /notifications"],markRepoNotificationsAsRead:["PUT /repos/{owner}/{repo}/notifications"],markThreadAsDone:["DELETE /notifications/threads/{thread_id}"],markThreadAsRead:["PATCH /notifications/threads/{thread_id}"],setRepoSubscription:["PUT /repos/{owner}/{repo}/subscription"],setThreadSubscription:["PUT /notifications/threads/{thread_id}/subscription"],starRepoForAuthenticatedUser:["PUT /user/starred/{owner}/{repo}"],unstarRepoForAuthenticatedUser:["DELETE /user/starred/{owner}/{repo}"]},apps:{addRepoToInstallation:["PUT /user/installations/{installation_id}/repositories/{repository_id}",{},{renamed:["apps","addRepoToInstallationForAuthenticatedUser"]}],addRepoToInstallationForAuthenticatedUser:["PUT /user/installations/{installation_id}/repositories/{repository_id}"],checkToken:["POST /applications/{client_id}/token"],createFromManifest:["POST /app-manifests/{code}/conversions"],createInstallationAccessToken:["POST /app/installations/{installation_id}/access_tokens"],deleteAuthorization:["DELETE /applications/{client_id}/grant"],deleteInstallation:["DELETE /app/installations/{installation_id}"],deleteToken:["DELETE /applications/{client_id}/token"],getAuthenticated:["GET /app"],getBySlug:["GET /apps/{app_slug}"],getInstallation:["GET /app/installations/{installation_id}"],getOrgInstallation:["GET /orgs/{org}/installation"],getRepoInstallation:["GET /repos/{owner}/{repo}/installation"],getSubscriptionPlanForAccount:["GET /marketplace_listing/accounts/{account_id}"],getSubscriptionPlanForAccountStubbed:["GET /marketplace_listing/stubbed/accounts/{account_id}"],getUserInstallation:["GET /users/{username}/installation"],getWebhookConfigForApp:["GET /app/hook/config"],getWebhookDelivery:["GET /app/hook/deliveries/{delivery_id}"],listAccountsForPlan:["GET /marketplace_listing/plans/{plan_id}/accounts"],listAccountsForPlanStubbed:["GET /marketplace_listing/stubbed/plans/{plan_id}/accounts"],listInstallationReposForAuthenticatedUser:["GET /user/installations/{installation_id}/repositories"],listInstallationRequestsForAuthenticatedApp:["GET /app/installation-requests"],listInstallations:["GET /app/installations"],listInstallationsForAuthenticatedUser:["GET /user/installations"],listPlans:["GET /marketplace_listing/plans"],listPlansStubbed:["GET /marketplace_listing/stubbed/plans"],listReposAccessibleToInstallation:["GET /installation/repositories"],listSubscriptionsForAuthenticatedUser:["GET /user/marketplace_purchases"],listSubscriptionsForAuthenticatedUserStubbed:["GET /user/marketplace_purchases/stubbed"],listWebhookDeliveries:["GET /app/hook/deliveries"],redeliverWebhookDelivery:["POST /app/hook/deliveries/{delivery_id}/attempts"],removeRepoFromInstallation:["DELETE /user/installations/{installation_id}/repositories/{repository_id}",{},{renamed:["apps","removeRepoFromInstallationForAuthenticatedUser"]}],removeRepoFromInstallationForAuthenticatedUser:["DELETE /user/installations/{installation_id}/repositories/{repository_id}"],resetToken:["PATCH /applications/{client_id}/token"],revokeInstallationAccessToken:["DELETE /installation/token"],scopeToken:["POST /applications/{client_id}/token/scoped"],suspendInstallation:["PUT /app/installations/{installation_id}/suspended"],unsuspendInstallation:["DELETE /app/installations/{installation_id}/suspended"],updateWebhookConfigForApp:["PATCH /app/hook/config"]},billing:{getGithubActionsBillingOrg:["GET /orgs/{org}/settings/billing/actions"],getGithubActionsBillingUser:["GET /users/{username}/settings/billing/actions"],getGithubPackagesBillingOrg:["GET /orgs/{org}/settings/billing/packages"],getGithubPackagesBillingUser:["GET /users/{username}/settings/billing/packages"],getSharedStorageBillingOrg:["GET /orgs/{org}/settings/billing/shared-storage"],getSharedStorageBillingUser:["GET /users/{username}/settings/billing/shared-storage"]},checks:{create:["POST /repos/{owner}/{repo}/check-runs"],createSuite:["POST /repos/{owner}/{repo}/check-suites"],get:["GET /repos/{owner}/{repo}/check-runs/{check_run_id}"],getSuite:["GET /repos/{owner}/{repo}/check-suites/{check_suite_id}"],listAnnotations:["GET /repos/{owner}/{repo}/check-runs/{check_run_id}/annotations"],listForRef:["GET /repos/{owner}/{repo}/commits/{ref}/check-runs"],listForSuite:["GET /repos/{owner}/{repo}/check-suites/{check_suite_id}/check-runs"],listSuitesForRef:["GET /repos/{owner}/{repo}/commits/{ref}/check-suites"],rerequestRun:["POST /repos/{owner}/{repo}/check-runs/{check_run_id}/rerequest"],rerequestSuite:["POST /repos/{owner}/{repo}/check-suites/{check_suite_id}/rerequest"],setSuitesPreferences:["PATCH /repos/{owner}/{repo}/check-suites/preferences"],update:["PATCH /repos/{owner}/{repo}/check-runs/{check_run_id}"]},codeScanning:{deleteAnalysis:["DELETE /repos/{owner}/{repo}/code-scanning/analyses/{analysis_id}{?confirm_delete}"],getAlert:["GET /repos/{owner}/{repo}/code-scanning/alerts/{alert_number}",{},{renamedParameters:{alert_id:"alert_number"}}],getAnalysis:["GET /repos/{owner}/{repo}/code-scanning/analyses/{analysis_id}"],getCodeqlDatabase:["GET /repos/{owner}/{repo}/code-scanning/codeql/databases/{language}"],getDefaultSetup:["GET /repos/{owner}/{repo}/code-scanning/default-setup"],getSarif:["GET /repos/{owner}/{repo}/code-scanning/sarifs/{sarif_id}"],listAlertInstances:["GET /repos/{owner}/{repo}/code-scanning/alerts/{alert_number}/instances"],listAlertsForOrg:["GET /orgs/{org}/code-scanning/alerts"],listAlertsForRepo:["GET /repos/{owner}/{repo}/code-scanning/alerts"],listAlertsInstances:["GET /repos/{owner}/{repo}/code-scanning/alerts/{alert_number}/instances",{},{renamed:["codeScanning","listAlertInstances"]}],listCodeqlDatabases:["GET /repos/{owner}/{repo}/code-scanning/codeql/databases"],listRecentAnalyses:["GET /repos/{owner}/{repo}/code-scanning/analyses"],updateAlert:["PATCH /repos/{owner}/{repo}/code-scanning/alerts/{alert_number}"],updateDefaultSetup:["PATCH /repos/{owner}/{repo}/code-scanning/default-setup"],uploadSarif:["POST /repos/{owner}/{repo}/code-scanning/sarifs"]},codesOfConduct:{getAllCodesOfConduct:["GET /codes_of_conduct"],getConductCode:["GET /codes_of_conduct/{key}"]},codespaces:{addRepositoryForSecretForAuthenticatedUser:["PUT /user/codespaces/secrets/{secret_name}/repositories/{repository_id}"],addSelectedRepoToOrgSecret:["PUT /orgs/{org}/codespaces/secrets/{secret_name}/repositories/{repository_id}"],checkPermissionsForDevcontainer:["GET /repos/{owner}/{repo}/codespaces/permissions_check"],codespaceMachinesForAuthenticatedUser:["GET /user/codespaces/{codespace_name}/machines"],createForAuthenticatedUser:["POST /user/codespaces"],createOrUpdateOrgSecret:["PUT /orgs/{org}/codespaces/secrets/{secret_name}"],createOrUpdateRepoSecret:["PUT /repos/{owner}/{repo}/codespaces/secrets/{secret_name}"],createOrUpdateSecretForAuthenticatedUser:["PUT /user/codespaces/secrets/{secret_name}"],createWithPrForAuthenticatedUser:["POST /repos/{owner}/{repo}/pulls/{pull_number}/codespaces"],createWithRepoForAuthenticatedUser:["POST /repos/{owner}/{repo}/codespaces"],deleteForAuthenticatedUser:["DELETE /user/codespaces/{codespace_name}"],deleteFromOrganization:["DELETE /orgs/{org}/members/{username}/codespaces/{codespace_name}"],deleteOrgSecret:["DELETE /orgs/{org}/codespaces/secrets/{secret_name}"],deleteRepoSecret:["DELETE /repos/{owner}/{repo}/codespaces/secrets/{secret_name}"],deleteSecretForAuthenticatedUser:["DELETE /user/codespaces/secrets/{secret_name}"],exportForAuthenticatedUser:["POST /user/codespaces/{codespace_name}/exports"],getCodespacesForUserInOrg:["GET /orgs/{org}/members/{username}/codespaces"],getExportDetailsForAuthenticatedUser:["GET /user/codespaces/{codespace_name}/exports/{export_id}"],getForAuthenticatedUser:["GET /user/codespaces/{codespace_name}"],getOrgPublicKey:["GET /orgs/{org}/codespaces/secrets/public-key"],getOrgSecret:["GET /orgs/{org}/codespaces/secrets/{secret_name}"],getPublicKeyForAuthenticatedUser:["GET /user/codespaces/secrets/public-key"],getRepoPublicKey:["GET /repos/{owner}/{repo}/codespaces/secrets/public-key"],getRepoSecret:["GET /repos/{owner}/{repo}/codespaces/secrets/{secret_name}"],getSecretForAuthenticatedUser:["GET /user/codespaces/secrets/{secret_name}"],listDevcontainersInRepositoryForAuthenticatedUser:["GET /repos/{owner}/{repo}/codespaces/devcontainers"],listForAuthenticatedUser:["GET /user/codespaces"],listInOrganization:["GET /orgs/{org}/codespaces",{},{renamedParameters:{org_id:"org"}}],listInRepositoryForAuthenticatedUser:["GET /repos/{owner}/{repo}/codespaces"],listOrgSecrets:["GET /orgs/{org}/codespaces/secrets"],listRepoSecrets:["GET /repos/{owner}/{repo}/codespaces/secrets"],listRepositoriesForSecretForAuthenticatedUser:["GET /user/codespaces/secrets/{secret_name}/repositories"],listSecretsForAuthenticatedUser:["GET /user/codespaces/secrets"],listSelectedReposForOrgSecret:["GET /orgs/{org}/codespaces/secrets/{secret_name}/repositories"],preFlightWithRepoForAuthenticatedUser:["GET /repos/{owner}/{repo}/codespaces/new"],publishForAuthenticatedUser:["POST /user/codespaces/{codespace_name}/publish"],removeRepositoryForSecretForAuthenticatedUser:["DELETE /user/codespaces/secrets/{secret_name}/repositories/{repository_id}"],removeSelectedRepoFromOrgSecret:["DELETE /orgs/{org}/codespaces/secrets/{secret_name}/repositories/{repository_id}"],repoMachinesForAuthenticatedUser:["GET /repos/{owner}/{repo}/codespaces/machines"],setRepositoriesForSecretForAuthenticatedUser:["PUT /user/codespaces/secrets/{secret_name}/repositories"],setSelectedReposForOrgSecret:["PUT /orgs/{org}/codespaces/secrets/{secret_name}/repositories"],startForAuthenticatedUser:["POST /user/codespaces/{codespace_name}/start"],stopForAuthenticatedUser:["POST /user/codespaces/{codespace_name}/stop"],stopInOrganization:["POST /orgs/{org}/members/{username}/codespaces/{codespace_name}/stop"],updateForAuthenticatedUser:["PATCH /user/codespaces/{codespace_name}"]},copilot:{addCopilotSeatsForTeams:["POST /orgs/{org}/copilot/billing/selected_teams"],addCopilotSeatsForUsers:["POST /orgs/{org}/copilot/billing/selected_users"],cancelCopilotSeatAssignmentForTeams:["DELETE /orgs/{org}/copilot/billing/selected_teams"],cancelCopilotSeatAssignmentForUsers:["DELETE /orgs/{org}/copilot/billing/selected_users"],getCopilotOrganizationDetails:["GET /orgs/{org}/copilot/billing"],getCopilotSeatDetailsForUser:["GET /orgs/{org}/members/{username}/copilot"],listCopilotSeats:["GET /orgs/{org}/copilot/billing/seats"]},dependabot:{addSelectedRepoToOrgSecret:["PUT /orgs/{org}/dependabot/secrets/{secret_name}/repositories/{repository_id}"],createOrUpdateOrgSecret:["PUT /orgs/{org}/dependabot/secrets/{secret_name}"],createOrUpdateRepoSecret:["PUT /repos/{owner}/{repo}/dependabot/secrets/{secret_name}"],deleteOrgSecret:["DELETE /orgs/{org}/dependabot/secrets/{secret_name}"],deleteRepoSecret:["DELETE /repos/{owner}/{repo}/dependabot/secrets/{secret_name}"],getAlert:["GET /repos/{owner}/{repo}/dependabot/alerts/{alert_number}"],getOrgPublicKey:["GET /orgs/{org}/dependabot/secrets/public-key"],getOrgSecret:["GET /orgs/{org}/dependabot/secrets/{secret_name}"],getRepoPublicKey:["GET /repos/{owner}/{repo}/dependabot/secrets/public-key"],getRepoSecret:["GET /repos/{owner}/{repo}/dependabot/secrets/{secret_name}"],listAlertsForEnterprise:["GET /enterprises/{enterprise}/dependabot/alerts"],listAlertsForOrg:["GET /orgs/{org}/dependabot/alerts"],listAlertsForRepo:["GET /repos/{owner}/{repo}/dependabot/alerts"],listOrgSecrets:["GET /orgs/{org}/dependabot/secrets"],listRepoSecrets:["GET /repos/{owner}/{repo}/dependabot/secrets"],listSelectedReposForOrgSecret:["GET /orgs/{org}/dependabot/secrets/{secret_name}/repositories"],removeSelectedRepoFromOrgSecret:["DELETE /orgs/{org}/dependabot/secrets/{secret_name}/repositories/{repository_id}"],setSelectedReposForOrgSecret:["PUT /orgs/{org}/dependabot/secrets/{secret_name}/repositories"],updateAlert:["PATCH /repos/{owner}/{repo}/dependabot/alerts/{alert_number}"]},dependencyGraph:{createRepositorySnapshot:["POST /repos/{owner}/{repo}/dependency-graph/snapshots"],diffRange:["GET /repos/{owner}/{repo}/dependency-graph/compare/{basehead}"],exportSbom:["GET /repos/{owner}/{repo}/dependency-graph/sbom"]},emojis:{get:["GET /emojis"]},gists:{checkIsStarred:["GET /gists/{gist_id}/star"],create:["POST /gists"],createComment:["POST /gists/{gist_id}/comments"],delete:["DELETE /gists/{gist_id}"],deleteComment:["DELETE /gists/{gist_id}/comments/{comment_id}"],fork:["POST /gists/{gist_id}/forks"],get:["GET /gists/{gist_id}"],getComment:["GET /gists/{gist_id}/comments/{comment_id}"],getRevision:["GET /gists/{gist_id}/{sha}"],list:["GET /gists"],listComments:["GET /gists/{gist_id}/comments"],listCommits:["GET /gists/{gist_id}/commits"],listForUser:["GET /users/{username}/gists"],listForks:["GET /gists/{gist_id}/forks"],listPublic:["GET /gists/public"],listStarred:["GET /gists/starred"],star:["PUT /gists/{gist_id}/star"],unstar:["DELETE /gists/{gist_id}/star"],update:["PATCH /gists/{gist_id}"],updateComment:["PATCH /gists/{gist_id}/comments/{comment_id}"]},git:{createBlob:["POST /repos/{owner}/{repo}/git/blobs"],createCommit:["POST /repos/{owner}/{repo}/git/commits"],createRef:["POST /repos/{owner}/{repo}/git/refs"],createTag:["POST /repos/{owner}/{repo}/git/tags"],createTree:["POST /repos/{owner}/{repo}/git/trees"],deleteRef:["DELETE /repos/{owner}/{repo}/git/refs/{ref}"],getBlob:["GET /repos/{owner}/{repo}/git/blobs/{file_sha}"],getCommit:["GET /repos/{owner}/{repo}/git/commits/{commit_sha}"],getRef:["GET /repos/{owner}/{repo}/git/ref/{ref}"],getTag:["GET /repos/{owner}/{repo}/git/tags/{tag_sha}"],getTree:["GET /repos/{owner}/{repo}/git/trees/{tree_sha}"],listMatchingRefs:["GET /repos/{owner}/{repo}/git/matching-refs/{ref}"],updateRef:["PATCH /repos/{owner}/{repo}/git/refs/{ref}"]},gitignore:{getAllTemplates:["GET /gitignore/templates"],getTemplate:["GET /gitignore/templates/{name}"]},interactions:{getRestrictionsForAuthenticatedUser:["GET /user/interaction-limits"],getRestrictionsForOrg:["GET /orgs/{org}/interaction-limits"],getRestrictionsForRepo:["GET /repos/{owner}/{repo}/interaction-limits"],getRestrictionsForYourPublicRepos:["GET /user/interaction-limits",{},{renamed:["interactions","getRestrictionsForAuthenticatedUser"]}],removeRestrictionsForAuthenticatedUser:["DELETE /user/interaction-limits"],removeRestrictionsForOrg:["DELETE /orgs/{org}/interaction-limits"],removeRestrictionsForRepo:["DELETE /repos/{owner}/{repo}/interaction-limits"],removeRestrictionsForYourPublicRepos:["DELETE /user/interaction-limits",{},{renamed:["interactions","removeRestrictionsForAuthenticatedUser"]}],setRestrictionsForAuthenticatedUser:["PUT /user/interaction-limits"],setRestrictionsForOrg:["PUT /orgs/{org}/interaction-limits"],setRestrictionsForRepo:["PUT /repos/{owner}/{repo}/interaction-limits"],setRestrictionsForYourPublicRepos:["PUT /user/interaction-limits",{},{renamed:["interactions","setRestrictionsForAuthenticatedUser"]}]},issues:{addAssignees:["POST /repos/{owner}/{repo}/issues/{issue_number}/assignees"],addLabels:["POST /repos/{owner}/{repo}/issues/{issue_number}/labels"],checkUserCanBeAssigned:["GET /repos/{owner}/{repo}/assignees/{assignee}"],checkUserCanBeAssignedToIssue:["GET /repos/{owner}/{repo}/issues/{issue_number}/assignees/{assignee}"],create:["POST /repos/{owner}/{repo}/issues"],createComment:["POST /repos/{owner}/{repo}/issues/{issue_number}/comments"],createLabel:["POST /repos/{owner}/{repo}/labels"],createMilestone:["POST /repos/{owner}/{repo}/milestones"],deleteComment:["DELETE /repos/{owner}/{repo}/issues/comments/{comment_id}"],deleteLabel:["DELETE /repos/{owner}/{repo}/labels/{name}"],deleteMilestone:["DELETE /repos/{owner}/{repo}/milestones/{milestone_number}"],get:["GET /repos/{owner}/{repo}/issues/{issue_number}"],getComment:["GET /repos/{owner}/{repo}/issues/comments/{comment_id}"],getEvent:["GET /repos/{owner}/{repo}/issues/events/{event_id}"],getLabel:["GET /repos/{owner}/{repo}/labels/{name}"],getMilestone:["GET /repos/{owner}/{repo}/milestones/{milestone_number}"],list:["GET /issues"],listAssignees:["GET /repos/{owner}/{repo}/assignees"],listComments:["GET /repos/{owner}/{repo}/issues/{issue_number}/comments"],listCommentsForRepo:["GET /repos/{owner}/{repo}/issues/comments"],listEvents:["GET /repos/{owner}/{repo}/issues/{issue_number}/events"],listEventsForRepo:["GET /repos/{owner}/{repo}/issues/events"],listEventsForTimeline:["GET /repos/{owner}/{repo}/issues/{issue_number}/timeline"],listForAuthenticatedUser:["GET /user/issues"],listForOrg:["GET /orgs/{org}/issues"],listForRepo:["GET /repos/{owner}/{repo}/issues"],listLabelsForMilestone:["GET /repos/{owner}/{repo}/milestones/{milestone_number}/labels"],listLabelsForRepo:["GET /repos/{owner}/{repo}/labels"],listLabelsOnIssue:["GET /repos/{owner}/{repo}/issues/{issue_number}/labels"],listMilestones:["GET /repos/{owner}/{repo}/milestones"],lock:["PUT /repos/{owner}/{repo}/issues/{issue_number}/lock"],removeAllLabels:["DELETE /repos/{owner}/{repo}/issues/{issue_number}/labels"],removeAssignees:["DELETE /repos/{owner}/{repo}/issues/{issue_number}/assignees"],removeLabel:["DELETE /repos/{owner}/{repo}/issues/{issue_number}/labels/{name}"],setLabels:["PUT /repos/{owner}/{repo}/issues/{issue_number}/labels"],unlock:["DELETE /repos/{owner}/{repo}/issues/{issue_number}/lock"],update:["PATCH /repos/{owner}/{repo}/issues/{issue_number}"],updateComment:["PATCH /repos/{owner}/{repo}/issues/comments/{comment_id}"],updateLabel:["PATCH /repos/{owner}/{repo}/labels/{name}"],updateMilestone:["PATCH /repos/{owner}/{repo}/milestones/{milestone_number}"]},licenses:{get:["GET /licenses/{license}"],getAllCommonlyUsed:["GET /licenses"],getForRepo:["GET /repos/{owner}/{repo}/license"]},markdown:{render:["POST /markdown"],renderRaw:["POST /markdown/raw",{headers:{"content-type":"text/plain; charset=utf-8"}}]},meta:{get:["GET /meta"],getAllVersions:["GET /versions"],getOctocat:["GET /octocat"],getZen:["GET /zen"],root:["GET /"]},migrations:{cancelImport:["DELETE /repos/{owner}/{repo}/import",{},{deprecated:"octokit.rest.migrations.cancelImport() is deprecated, see https://docs.github.com/rest/migrations/source-imports#cancel-an-import"}],deleteArchiveForAuthenticatedUser:["DELETE /user/migrations/{migration_id}/archive"],deleteArchiveForOrg:["DELETE /orgs/{org}/migrations/{migration_id}/archive"],downloadArchiveForOrg:["GET /orgs/{org}/migrations/{migration_id}/archive"],getArchiveForAuthenticatedUser:["GET /user/migrations/{migration_id}/archive"],getCommitAuthors:["GET /repos/{owner}/{repo}/import/authors",{},{deprecated:"octokit.rest.migrations.getCommitAuthors() is deprecated, see https://docs.github.com/rest/migrations/source-imports#get-commit-authors"}],getImportStatus:["GET /repos/{owner}/{repo}/import",{},{deprecated:"octokit.rest.migrations.getImportStatus() is deprecated, see https://docs.github.com/rest/migrations/source-imports#get-an-import-status"}],getLargeFiles:["GET /repos/{owner}/{repo}/import/large_files",{},{deprecated:"octokit.rest.migrations.getLargeFiles() is deprecated, see https://docs.github.com/rest/migrations/source-imports#get-large-files"}],getStatusForAuthenticatedUser:["GET /user/migrations/{migration_id}"],getStatusForOrg:["GET /orgs/{org}/migrations/{migration_id}"],listForAuthenticatedUser:["GET /user/migrations"],listForOrg:["GET /orgs/{org}/migrations"],listReposForAuthenticatedUser:["GET /user/migrations/{migration_id}/repositories"],listReposForOrg:["GET /orgs/{org}/migrations/{migration_id}/repositories"],listReposForUser:["GET /user/migrations/{migration_id}/repositories",{},{renamed:["migrations","listReposForAuthenticatedUser"]}],mapCommitAuthor:["PATCH /repos/{owner}/{repo}/import/authors/{author_id}",{},{deprecated:"octokit.rest.migrations.mapCommitAuthor() is deprecated, see https://docs.github.com/rest/migrations/source-imports#map-a-commit-author"}],setLfsPreference:["PATCH /repos/{owner}/{repo}/import/lfs",{},{deprecated:"octokit.rest.migrations.setLfsPreference() is deprecated, see https://docs.github.com/rest/migrations/source-imports#update-git-lfs-preference"}],startForAuthenticatedUser:["POST /user/migrations"],startForOrg:["POST /orgs/{org}/migrations"],startImport:["PUT /repos/{owner}/{repo}/import",{},{deprecated:"octokit.rest.migrations.startImport() is deprecated, see https://docs.github.com/rest/migrations/source-imports#start-an-import"}],unlockRepoForAuthenticatedUser:["DELETE /user/migrations/{migration_id}/repos/{repo_name}/lock"],unlockRepoForOrg:["DELETE /orgs/{org}/migrations/{migration_id}/repos/{repo_name}/lock"],updateImport:["PATCH /repos/{owner}/{repo}/import",{},{deprecated:"octokit.rest.migrations.updateImport() is deprecated, see https://docs.github.com/rest/migrations/source-imports#update-an-import"}]},oidc:{getOidcCustomSubTemplateForOrg:["GET /orgs/{org}/actions/oidc/customization/sub"],updateOidcCustomSubTemplateForOrg:["PUT /orgs/{org}/actions/oidc/customization/sub"]},orgs:{addSecurityManagerTeam:["PUT /orgs/{org}/security-managers/teams/{team_slug}"],assignTeamToOrgRole:["PUT /orgs/{org}/organization-roles/teams/{team_slug}/{role_id}"],assignUserToOrgRole:["PUT /orgs/{org}/organization-roles/users/{username}/{role_id}"],blockUser:["PUT /orgs/{org}/blocks/{username}"],cancelInvitation:["DELETE /orgs/{org}/invitations/{invitation_id}"],checkBlockedUser:["GET /orgs/{org}/blocks/{username}"],checkMembershipForUser:["GET /orgs/{org}/members/{username}"],checkPublicMembershipForUser:["GET /orgs/{org}/public_members/{username}"],convertMemberToOutsideCollaborator:["PUT /orgs/{org}/outside_collaborators/{username}"],createCustomOrganizationRole:["POST /orgs/{org}/organization-roles"],createInvitation:["POST /orgs/{org}/invitations"],createOrUpdateCustomProperties:["PATCH /orgs/{org}/properties/schema"],createOrUpdateCustomPropertiesValuesForRepos:["PATCH /orgs/{org}/properties/values"],createOrUpdateCustomProperty:["PUT /orgs/{org}/properties/schema/{custom_property_name}"],createWebhook:["POST /orgs/{org}/hooks"],delete:["DELETE /orgs/{org}"],deleteCustomOrganizationRole:["DELETE /orgs/{org}/organization-roles/{role_id}"],deleteWebhook:["DELETE /orgs/{org}/hooks/{hook_id}"],enableOrDisableSecurityProductOnAllOrgRepos:["POST /orgs/{org}/{security_product}/{enablement}"],get:["GET /orgs/{org}"],getAllCustomProperties:["GET /orgs/{org}/properties/schema"],getCustomProperty:["GET /orgs/{org}/properties/schema/{custom_property_name}"],getMembershipForAuthenticatedUser:["GET /user/memberships/orgs/{org}"],getMembershipForUser:["GET /orgs/{org}/memberships/{username}"],getOrgRole:["GET /orgs/{org}/organization-roles/{role_id}"],getWebhook:["GET /orgs/{org}/hooks/{hook_id}"],getWebhookConfigForOrg:["GET /orgs/{org}/hooks/{hook_id}/config"],getWebhookDelivery:["GET /orgs/{org}/hooks/{hook_id}/deliveries/{delivery_id}"],list:["GET /organizations"],listAppInstallations:["GET /orgs/{org}/installations"],listBlockedUsers:["GET /orgs/{org}/blocks"],listCustomPropertiesValuesForRepos:["GET /orgs/{org}/properties/values"],listFailedInvitations:["GET /orgs/{org}/failed_invitations"],listForAuthenticatedUser:["GET /user/orgs"],listForUser:["GET /users/{username}/orgs"],listInvitationTeams:["GET /orgs/{org}/invitations/{invitation_id}/teams"],listMembers:["GET /orgs/{org}/members"],listMembershipsForAuthenticatedUser:["GET /user/memberships/orgs"],listOrgRoleTeams:["GET /orgs/{org}/organization-roles/{role_id}/teams"],listOrgRoleUsers:["GET /orgs/{org}/organization-roles/{role_id}/users"],listOrgRoles:["GET /orgs/{org}/organization-roles"],listOrganizationFineGrainedPermissions:["GET /orgs/{org}/organization-fine-grained-permissions"],listOutsideCollaborators:["GET /orgs/{org}/outside_collaborators"],listPatGrantRepositories:["GET /orgs/{org}/personal-access-tokens/{pat_id}/repositories"],listPatGrantRequestRepositories:["GET /orgs/{org}/personal-access-token-requests/{pat_request_id}/repositories"],listPatGrantRequests:["GET /orgs/{org}/personal-access-token-requests"],listPatGrants:["GET /orgs/{org}/personal-access-tokens"],listPendingInvitations:["GET /orgs/{org}/invitations"],listPublicMembers:["GET /orgs/{org}/public_members"],listSecurityManagerTeams:["GET /orgs/{org}/security-managers"],listWebhookDeliveries:["GET /orgs/{org}/hooks/{hook_id}/deliveries"],listWebhooks:["GET /orgs/{org}/hooks"],patchCustomOrganizationRole:["PATCH /orgs/{org}/organization-roles/{role_id}"],pingWebhook:["POST /orgs/{org}/hooks/{hook_id}/pings"],redeliverWebhookDelivery:["POST /orgs/{org}/hooks/{hook_id}/deliveries/{delivery_id}/attempts"],removeCustomProperty:["DELETE /orgs/{org}/properties/schema/{custom_property_name}"],removeMember:["DELETE /orgs/{org}/members/{username}"],removeMembershipForUser:["DELETE /orgs/{org}/memberships/{username}"],removeOutsideCollaborator:["DELETE /orgs/{org}/outside_collaborators/{username}"],removePublicMembershipForAuthenticatedUser:["DELETE /orgs/{org}/public_members/{username}"],removeSecurityManagerTeam:["DELETE /orgs/{org}/security-managers/teams/{team_slug}"],reviewPatGrantRequest:["POST /orgs/{org}/personal-access-token-requests/{pat_request_id}"],reviewPatGrantRequestsInBulk:["POST /orgs/{org}/personal-access-token-requests"],revokeAllOrgRolesTeam:["DELETE /orgs/{org}/organization-roles/teams/{team_slug}"],revokeAllOrgRolesUser:["DELETE /orgs/{org}/organization-roles/users/{username}"],revokeOrgRoleTeam:["DELETE /orgs/{org}/organization-roles/teams/{team_slug}/{role_id}"],revokeOrgRoleUser:["DELETE /orgs/{org}/organization-roles/users/{username}/{role_id}"],setMembershipForUser:["PUT /orgs/{org}/memberships/{username}"],setPublicMembershipForAuthenticatedUser:["PUT /orgs/{org}/public_members/{username}"],unblockUser:["DELETE /orgs/{org}/blocks/{username}"],update:["PATCH /orgs/{org}"],updateMembershipForAuthenticatedUser:["PATCH /user/memberships/orgs/{org}"],updatePatAccess:["POST /orgs/{org}/personal-access-tokens/{pat_id}"],updatePatAccesses:["POST /orgs/{org}/personal-access-tokens"],updateWebhook:["PATCH /orgs/{org}/hooks/{hook_id}"],updateWebhookConfigForOrg:["PATCH /orgs/{org}/hooks/{hook_id}/config"]},packages:{deletePackageForAuthenticatedUser:["DELETE /user/packages/{package_type}/{package_name}"],deletePackageForOrg:["DELETE /orgs/{org}/packages/{package_type}/{package_name}"],deletePackageForUser:["DELETE /users/{username}/packages/{package_type}/{package_name}"],deletePackageVersionForAuthenticatedUser:["DELETE /user/packages/{package_type}/{package_name}/versions/{package_version_id}"],deletePackageVersionForOrg:["DELETE /orgs/{org}/packages/{package_type}/{package_name}/versions/{package_version_id}"],deletePackageVersionForUser:["DELETE /users/{username}/packages/{package_type}/{package_name}/versions/{package_version_id}"],getAllPackageVersionsForAPackageOwnedByAnOrg:["GET /orgs/{org}/packages/{package_type}/{package_name}/versions",{},{renamed:["packages","getAllPackageVersionsForPackageOwnedByOrg"]}],getAllPackageVersionsForAPackageOwnedByTheAuthenticatedUser:["GET /user/packages/{package_type}/{package_name}/versions",{},{renamed:["packages","getAllPackageVersionsForPackageOwnedByAuthenticatedUser"]}],getAllPackageVersionsForPackageOwnedByAuthenticatedUser:["GET /user/packages/{package_type}/{package_name}/versions"],getAllPackageVersionsForPackageOwnedByOrg:["GET /orgs/{org}/packages/{package_type}/{package_name}/versions"],getAllPackageVersionsForPackageOwnedByUser:["GET /users/{username}/packages/{package_type}/{package_name}/versions"],getPackageForAuthenticatedUser:["GET /user/packages/{package_type}/{package_name}"],getPackageForOrganization:["GET /orgs/{org}/packages/{package_type}/{package_name}"],getPackageForUser:["GET /users/{username}/packages/{package_type}/{package_name}"],getPackageVersionForAuthenticatedUser:["GET /user/packages/{package_type}/{package_name}/versions/{package_version_id}"],getPackageVersionForOrganization:["GET /orgs/{org}/packages/{package_type}/{package_name}/versions/{package_version_id}"],getPackageVersionForUser:["GET /users/{username}/packages/{package_type}/{package_name}/versions/{package_version_id}"],listDockerMigrationConflictingPackagesForAuthenticatedUser:["GET /user/docker/conflicts"],listDockerMigrationConflictingPackagesForOrganization:["GET /orgs/{org}/docker/conflicts"],listDockerMigrationConflictingPackagesForUser:["GET /users/{username}/docker/conflicts"],listPackagesForAuthenticatedUser:["GET /user/packages"],listPackagesForOrganization:["GET /orgs/{org}/packages"],listPackagesForUser:["GET /users/{username}/packages"],restorePackageForAuthenticatedUser:["POST /user/packages/{package_type}/{package_name}/restore{?token}"],restorePackageForOrg:["POST /orgs/{org}/packages/{package_type}/{package_name}/restore{?token}"],restorePackageForUser:["POST /users/{username}/packages/{package_type}/{package_name}/restore{?token}"],restorePackageVersionForAuthenticatedUser:["POST /user/packages/{package_type}/{package_name}/versions/{package_version_id}/restore"],restorePackageVersionForOrg:["POST /orgs/{org}/packages/{package_type}/{package_name}/versions/{package_version_id}/restore"],restorePackageVersionForUser:["POST /users/{username}/packages/{package_type}/{package_name}/versions/{package_version_id}/restore"]},projects:{addCollaborator:["PUT /projects/{project_id}/collaborators/{username}"],createCard:["POST /projects/columns/{column_id}/cards"],createColumn:["POST /projects/{project_id}/columns"],createForAuthenticatedUser:["POST /user/projects"],createForOrg:["POST /orgs/{org}/projects"],createForRepo:["POST /repos/{owner}/{repo}/projects"],delete:["DELETE /projects/{project_id}"],deleteCard:["DELETE /projects/columns/cards/{card_id}"],deleteColumn:["DELETE /projects/columns/{column_id}"],get:["GET /projects/{project_id}"],getCard:["GET /projects/columns/cards/{card_id}"],getColumn:["GET /projects/columns/{column_id}"],getPermissionForUser:["GET /projects/{project_id}/collaborators/{username}/permission"],listCards:["GET /projects/columns/{column_id}/cards"],listCollaborators:["GET /projects/{project_id}/collaborators"],listColumns:["GET /projects/{project_id}/columns"],listForOrg:["GET /orgs/{org}/projects"],listForRepo:["GET /repos/{owner}/{repo}/projects"],listForUser:["GET /users/{username}/projects"],moveCard:["POST /projects/columns/cards/{card_id}/moves"],moveColumn:["POST /projects/columns/{column_id}/moves"],removeCollaborator:["DELETE /projects/{project_id}/collaborators/{username}"],update:["PATCH /projects/{project_id}"],updateCard:["PATCH /projects/columns/cards/{card_id}"],updateColumn:["PATCH /projects/columns/{column_id}"]},pulls:{checkIfMerged:["GET /repos/{owner}/{repo}/pulls/{pull_number}/merge"],create:["POST /repos/{owner}/{repo}/pulls"],createReplyForReviewComment:["POST /repos/{owner}/{repo}/pulls/{pull_number}/comments/{comment_id}/replies"],createReview:["POST /repos/{owner}/{repo}/pulls/{pull_number}/reviews"],createReviewComment:["POST /repos/{owner}/{repo}/pulls/{pull_number}/comments"],deletePendingReview:["DELETE /repos/{owner}/{repo}/pulls/{pull_number}/reviews/{review_id}"],deleteReviewComment:["DELETE /repos/{owner}/{repo}/pulls/comments/{comment_id}"],dismissReview:["PUT /repos/{owner}/{repo}/pulls/{pull_number}/reviews/{review_id}/dismissals"],get:["GET /repos/{owner}/{repo}/pulls/{pull_number}"],getReview:["GET /repos/{owner}/{repo}/pulls/{pull_number}/reviews/{review_id}"],getReviewComment:["GET /repos/{owner}/{repo}/pulls/comments/{comment_id}"],list:["GET /repos/{owner}/{repo}/pulls"],listCommentsForReview:["GET /repos/{owner}/{repo}/pulls/{pull_number}/reviews/{review_id}/comments"],listCommits:["GET /repos/{owner}/{repo}/pulls/{pull_number}/commits"],listFiles:["GET /repos/{owner}/{repo}/pulls/{pull_number}/files"],listRequestedReviewers:["GET /repos/{owner}/{repo}/pulls/{pull_number}/requested_reviewers"],listReviewComments:["GET /repos/{owner}/{repo}/pulls/{pull_number}/comments"],listReviewCommentsForRepo:["GET /repos/{owner}/{repo}/pulls/comments"],listReviews:["GET /repos/{owner}/{repo}/pulls/{pull_number}/reviews"],merge:["PUT /repos/{owner}/{repo}/pulls/{pull_number}/merge"],removeRequestedReviewers:["DELETE /repos/{owner}/{repo}/pulls/{pull_number}/requested_reviewers"],requestReviewers:["POST /repos/{owner}/{repo}/pulls/{pull_number}/requested_reviewers"],submitReview:["POST /repos/{owner}/{repo}/pulls/{pull_number}/reviews/{review_id}/events"],update:["PATCH /repos/{owner}/{repo}/pulls/{pull_number}"],updateBranch:["PUT /repos/{owner}/{repo}/pulls/{pull_number}/update-branch"],updateReview:["PUT /repos/{owner}/{repo}/pulls/{pull_number}/reviews/{review_id}"],updateReviewComment:["PATCH /repos/{owner}/{repo}/pulls/comments/{comment_id}"]},rateLimit:{get:["GET /rate_limit"]},reactions:{createForCommitComment:["POST /repos/{owner}/{repo}/comments/{comment_id}/reactions"],createForIssue:["POST /repos/{owner}/{repo}/issues/{issue_number}/reactions"],createForIssueComment:["POST /repos/{owner}/{repo}/issues/comments/{comment_id}/reactions"],createForPullRequestReviewComment:["POST /repos/{owner}/{repo}/pulls/comments/{comment_id}/reactions"],createForRelease:["POST /repos/{owner}/{repo}/releases/{release_id}/reactions"],createForTeamDiscussionCommentInOrg:["POST /orgs/{org}/teams/{team_slug}/discussions/{discussion_number}/comments/{comment_number}/reactions"],createForTeamDiscussionInOrg:["POST /orgs/{org}/teams/{team_slug}/discussions/{discussion_number}/reactions"],deleteForCommitComment:["DELETE /repos/{owner}/{repo}/comments/{comment_id}/reactions/{reaction_id}"],deleteForIssue:["DELETE /repos/{owner}/{repo}/issues/{issue_number}/reactions/{reaction_id}"],deleteForIssueComment:["DELETE /repos/{owner}/{repo}/issues/comments/{comment_id}/reactions/{reaction_id}"],deleteForPullRequestComment:["DELETE /repos/{owner}/{repo}/pulls/comments/{comment_id}/reactions/{reaction_id}"],deleteForRelease:["DELETE /repos/{owner}/{repo}/releases/{release_id}/reactions/{reaction_id}"],deleteForTeamDiscussion:["DELETE /orgs/{org}/teams/{team_slug}/discussions/{discussion_number}/reactions/{reaction_id}"],deleteForTeamDiscussionComment:["DELETE /orgs/{org}/teams/{team_slug}/discussions/{discussion_number}/comments/{comment_number}/reactions/{reaction_id}"],listForCommitComment:["GET /repos/{owner}/{repo}/comments/{comment_id}/reactions"],listForIssue:["GET /repos/{owner}/{repo}/issues/{issue_number}/reactions"],listForIssueComment:["GET /repos/{owner}/{repo}/issues/comments/{comment_id}/reactions"],listForPullRequestReviewComment:["GET /repos/{owner}/{repo}/pulls/comments/{comment_id}/reactions"],listForRelease:["GET /repos/{owner}/{repo}/releases/{release_id}/reactions"],listForTeamDiscussionCommentInOrg:["GET /orgs/{org}/teams/{team_slug}/discussions/{discussion_number}/comments/{comment_number}/reactions"],listForTeamDiscussionInOrg:["GET /orgs/{org}/teams/{team_slug}/discussions/{discussion_number}/reactions"]},repos:{acceptInvitation:["PATCH /user/repository_invitations/{invitation_id}",{},{renamed:["repos","acceptInvitationForAuthenticatedUser"]}],acceptInvitationForAuthenticatedUser:["PATCH /user/repository_invitations/{invitation_id}"],addAppAccessRestrictions:["POST /repos/{owner}/{repo}/branches/{branch}/protection/restrictions/apps",{},{mapToData:"apps"}],addCollaborator:["PUT /repos/{owner}/{repo}/collaborators/{username}"],addStatusCheckContexts:["POST /repos/{owner}/{repo}/branches/{branch}/protection/required_status_checks/contexts",{},{mapToData:"contexts"}],addTeamAccessRestrictions:["POST /repos/{owner}/{repo}/branches/{branch}/protection/restrictions/teams",{},{mapToData:"teams"}],addUserAccessRestrictions:["POST /repos/{owner}/{repo}/branches/{branch}/protection/restrictions/users",{},{mapToData:"users"}],cancelPagesDeployment:["POST /repos/{owner}/{repo}/pages/deployments/{pages_deployment_id}/cancel"],checkAutomatedSecurityFixes:["GET /repos/{owner}/{repo}/automated-security-fixes"],checkCollaborator:["GET /repos/{owner}/{repo}/collaborators/{username}"],checkVulnerabilityAlerts:["GET /repos/{owner}/{repo}/vulnerability-alerts"],codeownersErrors:["GET /repos/{owner}/{repo}/codeowners/errors"],compareCommits:["GET /repos/{owner}/{repo}/compare/{base}...{head}"],compareCommitsWithBasehead:["GET /repos/{owner}/{repo}/compare/{basehead}"],createAutolink:["POST /repos/{owner}/{repo}/autolinks"],createCommitComment:["POST /repos/{owner}/{repo}/commits/{commit_sha}/comments"],createCommitSignatureProtection:["POST /repos/{owner}/{repo}/branches/{branch}/protection/required_signatures"],createCommitStatus:["POST /repos/{owner}/{repo}/statuses/{sha}"],createDeployKey:["POST /repos/{owner}/{repo}/keys"],createDeployment:["POST /repos/{owner}/{repo}/deployments"],createDeploymentBranchPolicy:["POST /repos/{owner}/{repo}/environments/{environment_name}/deployment-branch-policies"],createDeploymentProtectionRule:["POST /repos/{owner}/{repo}/environments/{environment_name}/deployment_protection_rules"],createDeploymentStatus:["POST /repos/{owner}/{repo}/deployments/{deployment_id}/statuses"],createDispatchEvent:["POST /repos/{owner}/{repo}/dispatches"],createForAuthenticatedUser:["POST /user/repos"],createFork:["POST /repos/{owner}/{repo}/forks"],createInOrg:["POST /orgs/{org}/repos"],createOrUpdateCustomPropertiesValues:["PATCH /repos/{owner}/{repo}/properties/values"],createOrUpdateEnvironment:["PUT /repos/{owner}/{repo}/environments/{environment_name}"],createOrUpdateFileContents:["PUT /repos/{owner}/{repo}/contents/{path}"],createOrgRuleset:["POST /orgs/{org}/rulesets"],createPagesDeployment:["POST /repos/{owner}/{repo}/pages/deployments"],createPagesSite:["POST /repos/{owner}/{repo}/pages"],createRelease:["POST /repos/{owner}/{repo}/releases"],createRepoRuleset:["POST /repos/{owner}/{repo}/rulesets"],createTagProtection:["POST /repos/{owner}/{repo}/tags/protection"],createUsingTemplate:["POST /repos/{template_owner}/{template_repo}/generate"],createWebhook:["POST /repos/{owner}/{repo}/hooks"],declineInvitation:["DELETE /user/repository_invitations/{invitation_id}",{},{renamed:["repos","declineInvitationForAuthenticatedUser"]}],declineInvitationForAuthenticatedUser:["DELETE /user/repository_invitations/{invitation_id}"],delete:["DELETE /repos/{owner}/{repo}"],deleteAccessRestrictions:["DELETE /repos/{owner}/{repo}/branches/{branch}/protection/restrictions"],deleteAdminBranchProtection:["DELETE /repos/{owner}/{repo}/branches/{branch}/protection/enforce_admins"],deleteAnEnvironment:["DELETE /repos/{owner}/{repo}/environments/{environment_name}"],deleteAutolink:["DELETE /repos/{owner}/{repo}/autolinks/{autolink_id}"],deleteBranchProtection:["DELETE /repos/{owner}/{repo}/branches/{branch}/protection"],deleteCommitComment:["DELETE /repos/{owner}/{repo}/comments/{comment_id}"],deleteCommitSignatureProtection:["DELETE /repos/{owner}/{repo}/branches/{branch}/protection/required_signatures"],deleteDeployKey:["DELETE /repos/{owner}/{repo}/keys/{key_id}"],deleteDeployment:["DELETE /repos/{owner}/{repo}/deployments/{deployment_id}"],deleteDeploymentBranchPolicy:["DELETE /repos/{owner}/{repo}/environments/{environment_name}/deployment-branch-policies/{branch_policy_id}"],deleteFile:["DELETE /repos/{owner}/{repo}/contents/{path}"],deleteInvitation:["DELETE /repos/{owner}/{repo}/invitations/{invitation_id}"],deleteOrgRuleset:["DELETE /orgs/{org}/rulesets/{ruleset_id}"],deletePagesSite:["DELETE /repos/{owner}/{repo}/pages"],deletePullRequestReviewProtection:["DELETE /repos/{owner}/{repo}/branches/{branch}/protection/required_pull_request_reviews"],deleteRelease:["DELETE /repos/{owner}/{repo}/releases/{release_id}"],deleteReleaseAsset:["DELETE /repos/{owner}/{repo}/releases/assets/{asset_id}"],deleteRepoRuleset:["DELETE /repos/{owner}/{repo}/rulesets/{ruleset_id}"],deleteTagProtection:["DELETE /repos/{owner}/{repo}/tags/protection/{tag_protection_id}"],deleteWebhook:["DELETE /repos/{owner}/{repo}/hooks/{hook_id}"],disableAutomatedSecurityFixes:["DELETE /repos/{owner}/{repo}/automated-security-fixes"],disableDeploymentProtectionRule:["DELETE /repos/{owner}/{repo}/environments/{environment_name}/deployment_protection_rules/{protection_rule_id}"],disablePrivateVulnerabilityReporting:["DELETE /repos/{owner}/{repo}/private-vulnerability-reporting"],disableVulnerabilityAlerts:["DELETE /repos/{owner}/{repo}/vulnerability-alerts"],downloadArchive:["GET /repos/{owner}/{repo}/zipball/{ref}",{},{renamed:["repos","downloadZipballArchive"]}],downloadTarballArchive:["GET /repos/{owner}/{repo}/tarball/{ref}"],downloadZipballArchive:["GET /repos/{owner}/{repo}/zipball/{ref}"],enableAutomatedSecurityFixes:["PUT /repos/{owner}/{repo}/automated-security-fixes"],enablePrivateVulnerabilityReporting:["PUT /repos/{owner}/{repo}/private-vulnerability-reporting"],enableVulnerabilityAlerts:["PUT /repos/{owner}/{repo}/vulnerability-alerts"],generateReleaseNotes:["POST /repos/{owner}/{repo}/releases/generate-notes"],get:["GET /repos/{owner}/{repo}"],getAccessRestrictions:["GET /repos/{owner}/{repo}/branches/{branch}/protection/restrictions"],getAdminBranchProtection:["GET /repos/{owner}/{repo}/branches/{branch}/protection/enforce_admins"],getAllDeploymentProtectionRules:["GET /repos/{owner}/{repo}/environments/{environment_name}/deployment_protection_rules"],getAllEnvironments:["GET /repos/{owner}/{repo}/environments"],getAllStatusCheckContexts:["GET /repos/{owner}/{repo}/branches/{branch}/protection/required_status_checks/contexts"],getAllTopics:["GET /repos/{owner}/{repo}/topics"],getAppsWithAccessToProtectedBranch:["GET /repos/{owner}/{repo}/branches/{branch}/protection/restrictions/apps"],getAutolink:["GET /repos/{owner}/{repo}/autolinks/{autolink_id}"],getBranch:["GET /repos/{owner}/{repo}/branches/{branch}"],getBranchProtection:["GET /repos/{owner}/{repo}/branches/{branch}/protection"],getBranchRules:["GET /repos/{owner}/{repo}/rules/branches/{branch}"],getClones:["GET /repos/{owner}/{repo}/traffic/clones"],getCodeFrequencyStats:["GET /repos/{owner}/{repo}/stats/code_frequency"],getCollaboratorPermissionLevel:["GET /repos/{owner}/{repo}/collaborators/{username}/permission"],getCombinedStatusForRef:["GET /repos/{owner}/{repo}/commits/{ref}/status"],getCommit:["GET /repos/{owner}/{repo}/commits/{ref}"],getCommitActivityStats:["GET /repos/{owner}/{repo}/stats/commit_activity"],getCommitComment:["GET /repos/{owner}/{repo}/comments/{comment_id}"],getCommitSignatureProtection:["GET /repos/{owner}/{repo}/branches/{branch}/protection/required_signatures"],getCommunityProfileMetrics:["GET /repos/{owner}/{repo}/community/profile"],getContent:["GET /repos/{owner}/{repo}/contents/{path}"],getContributorsStats:["GET /repos/{owner}/{repo}/stats/contributors"],getCustomDeploymentProtectionRule:["GET /repos/{owner}/{repo}/environments/{environment_name}/deployment_protection_rules/{protection_rule_id}"],getCustomPropertiesValues:["GET /repos/{owner}/{repo}/properties/values"],getDeployKey:["GET /repos/{owner}/{repo}/keys/{key_id}"],getDeployment:["GET /repos/{owner}/{repo}/deployments/{deployment_id}"],getDeploymentBranchPolicy:["GET /repos/{owner}/{repo}/environments/{environment_name}/deployment-branch-policies/{branch_policy_id}"],getDeploymentStatus:["GET /repos/{owner}/{repo}/deployments/{deployment_id}/statuses/{status_id}"],getEnvironment:["GET /repos/{owner}/{repo}/environments/{environment_name}"],getLatestPagesBuild:["GET /repos/{owner}/{repo}/pages/builds/latest"],getLatestRelease:["GET /repos/{owner}/{repo}/releases/latest"],getOrgRuleSuite:["GET /orgs/{org}/rulesets/rule-suites/{rule_suite_id}"],getOrgRuleSuites:["GET /orgs/{org}/rulesets/rule-suites"],getOrgRuleset:["GET /orgs/{org}/rulesets/{ruleset_id}"],getOrgRulesets:["GET /orgs/{org}/rulesets"],getPages:["GET /repos/{owner}/{repo}/pages"],getPagesBuild:["GET /repos/{owner}/{repo}/pages/builds/{build_id}"],getPagesDeployment:["GET /repos/{owner}/{repo}/pages/deployments/{pages_deployment_id}"],getPagesHealthCheck:["GET /repos/{owner}/{repo}/pages/health"],getParticipationStats:["GET /repos/{owner}/{repo}/stats/participation"],getPullRequestReviewProtection:["GET /repos/{owner}/{repo}/branches/{branch}/protection/required_pull_request_reviews"],getPunchCardStats:["GET /repos/{owner}/{repo}/stats/punch_card"],getReadme:["GET /repos/{owner}/{repo}/readme"],getReadmeInDirectory:["GET /repos/{owner}/{repo}/readme/{dir}"],getRelease:["GET /repos/{owner}/{repo}/releases/{release_id}"],getReleaseAsset:["GET /repos/{owner}/{repo}/releases/assets/{asset_id}"],getReleaseByTag:["GET /repos/{owner}/{repo}/releases/tags/{tag}"],getRepoRuleSuite:["GET /repos/{owner}/{repo}/rulesets/rule-suites/{rule_suite_id}"],getRepoRuleSuites:["GET /repos/{owner}/{repo}/rulesets/rule-suites"],getRepoRuleset:["GET /repos/{owner}/{repo}/rulesets/{ruleset_id}"],getRepoRulesets:["GET /repos/{owner}/{repo}/rulesets"],getStatusChecksProtection:["GET /repos/{owner}/{repo}/branches/{branch}/protection/required_status_checks"],getTeamsWithAccessToProtectedBranch:["GET /repos/{owner}/{repo}/branches/{branch}/protection/restrictions/teams"],getTopPaths:["GET /repos/{owner}/{repo}/traffic/popular/paths"],getTopReferrers:["GET /repos/{owner}/{repo}/traffic/popular/referrers"],getUsersWithAccessToProtectedBranch:["GET /repos/{owner}/{repo}/branches/{branch}/protection/restrictions/users"],getViews:["GET /repos/{owner}/{repo}/traffic/views"],getWebhook:["GET /repos/{owner}/{repo}/hooks/{hook_id}"],getWebhookConfigForRepo:["GET /repos/{owner}/{repo}/hooks/{hook_id}/config"],getWebhookDelivery:["GET /repos/{owner}/{repo}/hooks/{hook_id}/deliveries/{delivery_id}"],listActivities:["GET /repos/{owner}/{repo}/activity"],listAutolinks:["GET /repos/{owner}/{repo}/autolinks"],listBranches:["GET /repos/{owner}/{repo}/branches"],listBranchesForHeadCommit:["GET /repos/{owner}/{repo}/commits/{commit_sha}/branches-where-head"],listCollaborators:["GET /repos/{owner}/{repo}/collaborators"],listCommentsForCommit:["GET /repos/{owner}/{repo}/commits/{commit_sha}/comments"],listCommitCommentsForRepo:["GET /repos/{owner}/{repo}/comments"],listCommitStatusesForRef:["GET /repos/{owner}/{repo}/commits/{ref}/statuses"],listCommits:["GET /repos/{owner}/{repo}/commits"],listContributors:["GET /repos/{owner}/{repo}/contributors"],listCustomDeploymentRuleIntegrations:["GET /repos/{owner}/{repo}/environments/{environment_name}/deployment_protection_rules/apps"],listDeployKeys:["GET /repos/{owner}/{repo}/keys"],listDeploymentBranchPolicies:["GET /repos/{owner}/{repo}/environments/{environment_name}/deployment-branch-policies"],listDeploymentStatuses:["GET /repos/{owner}/{repo}/deployments/{deployment_id}/statuses"],listDeployments:["GET /repos/{owner}/{repo}/deployments"],listForAuthenticatedUser:["GET /user/repos"],listForOrg:["GET /orgs/{org}/repos"],listForUser:["GET /users/{username}/repos"],listForks:["GET /repos/{owner}/{repo}/forks"],listInvitations:["GET /repos/{owner}/{repo}/invitations"],listInvitationsForAuthenticatedUser:["GET /user/repository_invitations"],listLanguages:["GET /repos/{owner}/{repo}/languages"],listPagesBuilds:["GET /repos/{owner}/{repo}/pages/builds"],listPublic:["GET /repositories"],listPullRequestsAssociatedWithCommit:["GET /repos/{owner}/{repo}/commits/{commit_sha}/pulls"],listReleaseAssets:["GET /repos/{owner}/{repo}/releases/{release_id}/assets"],listReleases:["GET /repos/{owner}/{repo}/releases"],listTagProtection:["GET /repos/{owner}/{repo}/tags/protection"],listTags:["GET /repos/{owner}/{repo}/tags"],listTeams:["GET /repos/{owner}/{repo}/teams"],listWebhookDeliveries:["GET /repos/{owner}/{repo}/hooks/{hook_id}/deliveries"],listWebhooks:["GET /repos/{owner}/{repo}/hooks"],merge:["POST /repos/{owner}/{repo}/merges"],mergeUpstream:["POST /repos/{owner}/{repo}/merge-upstream"],pingWebhook:["POST /repos/{owner}/{repo}/hooks/{hook_id}/pings"],redeliverWebhookDelivery:["POST /repos/{owner}/{repo}/hooks/{hook_id}/deliveries/{delivery_id}/attempts"],removeAppAccessRestrictions:["DELETE /repos/{owner}/{repo}/branches/{branch}/protection/restrictions/apps",{},{mapToData:"apps"}],removeCollaborator:["DELETE /repos/{owner}/{repo}/collaborators/{username}"],removeStatusCheckContexts:["DELETE /repos/{owner}/{repo}/branches/{branch}/protection/required_status_checks/contexts",{},{mapToData:"contexts"}],removeStatusCheckProtection:["DELETE /repos/{owner}/{repo}/branches/{branch}/protection/required_status_checks"],removeTeamAccessRestrictions:["DELETE /repos/{owner}/{repo}/branches/{branch}/protection/restrictions/teams",{},{mapToData:"teams"}],removeUserAccessRestrictions:["DELETE /repos/{owner}/{repo}/branches/{branch}/protection/restrictions/users",{},{mapToData:"users"}],renameBranch:["POST /repos/{owner}/{repo}/branches/{branch}/rename"],replaceAllTopics:["PUT /repos/{owner}/{repo}/topics"],requestPagesBuild:["POST /repos/{owner}/{repo}/pages/builds"],setAdminBranchProtection:["POST /repos/{owner}/{repo}/branches/{branch}/protection/enforce_admins"],setAppAccessRestrictions:["PUT /repos/{owner}/{repo}/branches/{branch}/protection/restrictions/apps",{},{mapToData:"apps"}],setStatusCheckContexts:["PUT /repos/{owner}/{repo}/branches/{branch}/protection/required_status_checks/contexts",{},{mapToData:"contexts"}],setTeamAccessRestrictions:["PUT /repos/{owner}/{repo}/branches/{branch}/protection/restrictions/teams",{},{mapToData:"teams"}],setUserAccessRestrictions:["PUT /repos/{owner}/{repo}/branches/{branch}/protection/restrictions/users",{},{mapToData:"users"}],testPushWebhook:["POST /repos/{owner}/{repo}/hooks/{hook_id}/tests"],transfer:["POST /repos/{owner}/{repo}/transfer"],update:["PATCH /repos/{owner}/{repo}"],updateBranchProtection:["PUT /repos/{owner}/{repo}/branches/{branch}/protection"],updateCommitComment:["PATCH /repos/{owner}/{repo}/comments/{comment_id}"],updateDeploymentBranchPolicy:["PUT /repos/{owner}/{repo}/environments/{environment_name}/deployment-branch-policies/{branch_policy_id}"],updateInformationAboutPagesSite:["PUT /repos/{owner}/{repo}/pages"],updateInvitation:["PATCH /repos/{owner}/{repo}/invitations/{invitation_id}"],updateOrgRuleset:["PUT /orgs/{org}/rulesets/{ruleset_id}"],updatePullRequestReviewProtection:["PATCH /repos/{owner}/{repo}/branches/{branch}/protection/required_pull_request_reviews"],updateRelease:["PATCH /repos/{owner}/{repo}/releases/{release_id}"],updateReleaseAsset:["PATCH /repos/{owner}/{repo}/releases/assets/{asset_id}"],updateRepoRuleset:["PUT /repos/{owner}/{repo}/rulesets/{ruleset_id}"],updateStatusCheckPotection:["PATCH /repos/{owner}/{repo}/branches/{branch}/protection/required_status_checks",{},{renamed:["repos","updateStatusCheckProtection"]}],updateStatusCheckProtection:["PATCH /repos/{owner}/{repo}/branches/{branch}/protection/required_status_checks"],updateWebhook:["PATCH /repos/{owner}/{repo}/hooks/{hook_id}"],updateWebhookConfigForRepo:["PATCH /repos/{owner}/{repo}/hooks/{hook_id}/config"],uploadReleaseAsset:["POST /repos/{owner}/{repo}/releases/{release_id}/assets{?name,label}",{baseUrl:"https://uploads.github.com"}]},search:{code:["GET /search/code"],commits:["GET /search/commits"],issuesAndPullRequests:["GET /search/issues"],labels:["GET /search/labels"],repos:["GET /search/repositories"],topics:["GET /search/topics"],users:["GET /search/users"]},secretScanning:{getAlert:["GET /repos/{owner}/{repo}/secret-scanning/alerts/{alert_number}"],listAlertsForEnterprise:["GET /enterprises/{enterprise}/secret-scanning/alerts"],listAlertsForOrg:["GET /orgs/{org}/secret-scanning/alerts"],listAlertsForRepo:["GET /repos/{owner}/{repo}/secret-scanning/alerts"],listLocationsForAlert:["GET /repos/{owner}/{repo}/secret-scanning/alerts/{alert_number}/locations"],updateAlert:["PATCH /repos/{owner}/{repo}/secret-scanning/alerts/{alert_number}"]},securityAdvisories:{createFork:["POST /repos/{owner}/{repo}/security-advisories/{ghsa_id}/forks"],createPrivateVulnerabilityReport:["POST /repos/{owner}/{repo}/security-advisories/reports"],createRepositoryAdvisory:["POST /repos/{owner}/{repo}/security-advisories"],createRepositoryAdvisoryCveRequest:["POST /repos/{owner}/{repo}/security-advisories/{ghsa_id}/cve"],getGlobalAdvisory:["GET /advisories/{ghsa_id}"],getRepositoryAdvisory:["GET /repos/{owner}/{repo}/security-advisories/{ghsa_id}"],listGlobalAdvisories:["GET /advisories"],listOrgRepositoryAdvisories:["GET /orgs/{org}/security-advisories"],listRepositoryAdvisories:["GET /repos/{owner}/{repo}/security-advisories"],updateRepositoryAdvisory:["PATCH /repos/{owner}/{repo}/security-advisories/{ghsa_id}"]},teams:{addOrUpdateMembershipForUserInOrg:["PUT /orgs/{org}/teams/{team_slug}/memberships/{username}"],addOrUpdateProjectPermissionsInOrg:["PUT /orgs/{org}/teams/{team_slug}/projects/{project_id}"],addOrUpdateRepoPermissionsInOrg:["PUT /orgs/{org}/teams/{team_slug}/repos/{owner}/{repo}"],checkPermissionsForProjectInOrg:["GET /orgs/{org}/teams/{team_slug}/projects/{project_id}"],checkPermissionsForRepoInOrg:["GET /orgs/{org}/teams/{team_slug}/repos/{owner}/{repo}"],create:["POST /orgs/{org}/teams"],createDiscussionCommentInOrg:["POST /orgs/{org}/teams/{team_slug}/discussions/{discussion_number}/comments"],createDiscussionInOrg:["POST /orgs/{org}/teams/{team_slug}/discussions"],deleteDiscussionCommentInOrg:["DELETE /orgs/{org}/teams/{team_slug}/discussions/{discussion_number}/comments/{comment_number}"],deleteDiscussionInOrg:["DELETE /orgs/{org}/teams/{team_slug}/discussions/{discussion_number}"],deleteInOrg:["DELETE /orgs/{org}/teams/{team_slug}"],getByName:["GET /orgs/{org}/teams/{team_slug}"],getDiscussionCommentInOrg:["GET /orgs/{org}/teams/{team_slug}/discussions/{discussion_number}/comments/{comment_number}"],getDiscussionInOrg:["GET /orgs/{org}/teams/{team_slug}/discussions/{discussion_number}"],getMembershipForUserInOrg:["GET /orgs/{org}/teams/{team_slug}/memberships/{username}"],list:["GET /orgs/{org}/teams"],listChildInOrg:["GET /orgs/{org}/teams/{team_slug}/teams"],listDiscussionCommentsInOrg:["GET /orgs/{org}/teams/{team_slug}/discussions/{discussion_number}/comments"],listDiscussionsInOrg:["GET /orgs/{org}/teams/{team_slug}/discussions"],listForAuthenticatedUser:["GET /user/teams"],listMembersInOrg:["GET /orgs/{org}/teams/{team_slug}/members"],listPendingInvitationsInOrg:["GET /orgs/{org}/teams/{team_slug}/invitations"],listProjectsInOrg:["GET /orgs/{org}/teams/{team_slug}/projects"],listReposInOrg:["GET /orgs/{org}/teams/{team_slug}/repos"],removeMembershipForUserInOrg:["DELETE /orgs/{org}/teams/{team_slug}/memberships/{username}"],removeProjectInOrg:["DELETE /orgs/{org}/teams/{team_slug}/projects/{project_id}"],removeRepoInOrg:["DELETE /orgs/{org}/teams/{team_slug}/repos/{owner}/{repo}"],updateDiscussionCommentInOrg:["PATCH /orgs/{org}/teams/{team_slug}/discussions/{discussion_number}/comments/{comment_number}"],updateDiscussionInOrg:["PATCH /orgs/{org}/teams/{team_slug}/discussions/{discussion_number}"],updateInOrg:["PATCH /orgs/{org}/teams/{team_slug}"]},users:{addEmailForAuthenticated:["POST /user/emails",{},{renamed:["users","addEmailForAuthenticatedUser"]}],addEmailForAuthenticatedUser:["POST /user/emails"],addSocialAccountForAuthenticatedUser:["POST /user/social_accounts"],block:["PUT /user/blocks/{username}"],checkBlocked:["GET /user/blocks/{username}"],checkFollowingForUser:["GET /users/{username}/following/{target_user}"],checkPersonIsFollowedByAuthenticated:["GET /user/following/{username}"],createGpgKeyForAuthenticated:["POST /user/gpg_keys",{},{renamed:["users","createGpgKeyForAuthenticatedUser"]}],createGpgKeyForAuthenticatedUser:["POST /user/gpg_keys"],createPublicSshKeyForAuthenticated:["POST /user/keys",{},{renamed:["users","createPublicSshKeyForAuthenticatedUser"]}],createPublicSshKeyForAuthenticatedUser:["POST /user/keys"],createSshSigningKeyForAuthenticatedUser:["POST /user/ssh_signing_keys"],deleteEmailForAuthenticated:["DELETE /user/emails",{},{renamed:["users","deleteEmailForAuthenticatedUser"]}],deleteEmailForAuthenticatedUser:["DELETE /user/emails"],deleteGpgKeyForAuthenticated:["DELETE /user/gpg_keys/{gpg_key_id}",{},{renamed:["users","deleteGpgKeyForAuthenticatedUser"]}],deleteGpgKeyForAuthenticatedUser:["DELETE /user/gpg_keys/{gpg_key_id}"],deletePublicSshKeyForAuthenticated:["DELETE /user/keys/{key_id}",{},{renamed:["users","deletePublicSshKeyForAuthenticatedUser"]}],deletePublicSshKeyForAuthenticatedUser:["DELETE /user/keys/{key_id}"],deleteSocialAccountForAuthenticatedUser:["DELETE /user/social_accounts"],deleteSshSigningKeyForAuthenticatedUser:["DELETE /user/ssh_signing_keys/{ssh_signing_key_id}"],follow:["PUT /user/following/{username}"],getAuthenticated:["GET /user"],getByUsername:["GET /users/{username}"],getContextForUser:["GET /users/{username}/hovercard"],getGpgKeyForAuthenticated:["GET /user/gpg_keys/{gpg_key_id}",{},{renamed:["users","getGpgKeyForAuthenticatedUser"]}],getGpgKeyForAuthenticatedUser:["GET /user/gpg_keys/{gpg_key_id}"],getPublicSshKeyForAuthenticated:["GET /user/keys/{key_id}",{},{renamed:["users","getPublicSshKeyForAuthenticatedUser"]}],getPublicSshKeyForAuthenticatedUser:["GET /user/keys/{key_id}"],getSshSigningKeyForAuthenticatedUser:["GET /user/ssh_signing_keys/{ssh_signing_key_id}"],list:["GET /users"],listBlockedByAuthenticated:["GET /user/blocks",{},{renamed:["users","listBlockedByAuthenticatedUser"]}],listBlockedByAuthenticatedUser:["GET /user/blocks"],listEmailsForAuthenticated:["GET /user/emails",{},{renamed:["users","listEmailsForAuthenticatedUser"]}],listEmailsForAuthenticatedUser:["GET /user/emails"],listFollowedByAuthenticated:["GET /user/following",{},{renamed:["users","listFollowedByAuthenticatedUser"]}],listFollowedByAuthenticatedUser:["GET /user/following"],listFollowersForAuthenticatedUser:["GET /user/followers"],listFollowersForUser:["GET /users/{username}/followers"],listFollowingForUser:["GET /users/{username}/following"],listGpgKeysForAuthenticated:["GET /user/gpg_keys",{},{renamed:["users","listGpgKeysForAuthenticatedUser"]}],listGpgKeysForAuthenticatedUser:["GET /user/gpg_keys"],listGpgKeysForUser:["GET /users/{username}/gpg_keys"],listPublicEmailsForAuthenticated:["GET /user/public_emails",{},{renamed:["users","listPublicEmailsForAuthenticatedUser"]}],listPublicEmailsForAuthenticatedUser:["GET /user/public_emails"],listPublicKeysForUser:["GET /users/{username}/keys"],listPublicSshKeysForAuthenticated:["GET /user/keys",{},{renamed:["users","listPublicSshKeysForAuthenticatedUser"]}],listPublicSshKeysForAuthenticatedUser:["GET /user/keys"],listSocialAccountsForAuthenticatedUser:["GET /user/social_accounts"],listSocialAccountsForUser:["GET /users/{username}/social_accounts"],listSshSigningKeysForAuthenticatedUser:["GET /user/ssh_signing_keys"],listSshSigningKeysForUser:["GET /users/{username}/ssh_signing_keys"],setPrimaryEmailVisibilityForAuthenticated:["PATCH /user/email/visibility",{},{renamed:["users","setPrimaryEmailVisibilityForAuthenticatedUser"]}],setPrimaryEmailVisibilityForAuthenticatedUser:["PATCH /user/email/visibility"],unblock:["DELETE /user/blocks/{username}"],unfollow:["DELETE /user/following/{username}"],updateAuthenticated:["PATCH /user"]}};var a=i;var c=new Map;for(const[e,A]of Object.entries(a)){for(const[t,r]of Object.entries(A)){const[A,s,o]=r;const[n,i]=A.split(/ /);const a=Object.assign({method:n,url:i},s);if(!c.has(e)){c.set(e,new Map)}c.get(e).set(t,{scope:e,methodName:t,endpointDefaults:a,decorations:o})}}var g={has({scope:e},A){return c.get(e).has(A)},getOwnPropertyDescriptor(e,A){return{value:this.get(e,A),configurable:true,writable:true,enumerable:true}},defineProperty(e,A,t){Object.defineProperty(e.cache,A,t);return true},deleteProperty(e,A){delete e.cache[A];return true},ownKeys({scope:e}){return[...c.get(e).keys()]},set(e,A,t){return e.cache[A]=t},get({octokit:e,scope:A,cache:t},r){if(t[r]){return t[r]}const s=c.get(A).get(r);if(!s){return void 0}const{endpointDefaults:o,decorations:n}=s;if(n){t[r]=decorate(e,A,r,o,n)}else{t[r]=e.request.defaults(o)}return t[r]}};function endpointsToMethods(e){const A={};for(const t of c.keys()){A[t]=new Proxy({octokit:e,scope:t,cache:{}},g)}return A}function decorate(e,A,t,r,s){const o=e.request.defaults(r);function withDecorations(...r){let n=o.endpoint.merge(...r);if(s.mapToData){n=Object.assign({},n,{data:n[s.mapToData],[s.mapToData]:void 0});return o(n)}if(s.renamed){const[r,o]=s.renamed;e.log.warn(`octokit.${A}.${t}() has been renamed to octokit.${r}.${o}()`)}if(s.deprecated){e.log.warn(s.deprecated)}if(s.renamedParameters){const n=o.endpoint.merge(...r);for(const[r,o]of Object.entries(s.renamedParameters)){if(r in n){e.log.warn(`"${r}" parameter is deprecated for "octokit.${A}.${t}()". Use "${o}" instead`);if(!(o in n)){n[o]=n[r]}delete n[r]}}return o(n)}return o(...r)}return Object.assign(withDecorations,o)}function restEndpointMethods(e){const A=endpointsToMethods(e);return{rest:A}}restEndpointMethods.VERSION=n;function legacyRestEndpointMethods(e){const A=endpointsToMethods(e);return{...A,rest:A}}legacyRestEndpointMethods.VERSION=n;0&&0},3708:(e,A,t)=>{"use strict";var r=Object.create;var s=Object.defineProperty;var o=Object.getOwnPropertyDescriptor;var n=Object.getOwnPropertyNames;var i=Object.getPrototypeOf;var a=Object.prototype.hasOwnProperty;var __export=(e,A)=>{for(var t in A)s(e,t,{get:A[t],enumerable:true})};var __copyProps=(e,A,t,r)=>{if(A&&typeof A==="object"||typeof A==="function"){for(let i of n(A))if(!a.call(e,i)&&i!==t)s(e,i,{get:()=>A[i],enumerable:!(r=o(A,i))||r.enumerable})}return e};var __toESM=(e,A,t)=>(t=e!=null?r(i(e)):{},__copyProps(A||!e||!e.__esModule?s(t,"default",{value:e,enumerable:true}):t,e));var __toCommonJS=e=>__copyProps(s({},"__esModule",{value:true}),e);var c={};__export(c,{RequestError:()=>h});e.exports=__toCommonJS(c);var g=t(4150);var l=__toESM(t(5560));var E=(0,l.default)((e=>console.warn(e)));var u=(0,l.default)((e=>console.warn(e)));var h=class extends Error{constructor(e,A,t){super(e);if(Error.captureStackTrace){Error.captureStackTrace(this,this.constructor)}this.name="HttpError";this.status=A;let r;if("headers"in t&&typeof t.headers!=="undefined"){r=t.headers}if("response"in t){this.response=t.response;r=t.response.headers}const s=Object.assign({},t.request);if(t.request.headers.authorization){s.headers=Object.assign({},t.request.headers,{authorization:t.request.headers.authorization.replace(/ .*$/," [REDACTED]")})}s.url=s.url.replace(/\bclient_secret=\w+/g,"client_secret=[REDACTED]").replace(/\baccess_token=\w+/g,"access_token=[REDACTED]");this.request=s;Object.defineProperty(this,"code",{get(){E(new g.Deprecation("[@octokit/request-error] `error.code` is deprecated, use `error.status`."));return A}});Object.defineProperty(this,"headers",{get(){u(new g.Deprecation("[@octokit/request-error] `error.headers` is deprecated, use `error.response.headers`."));return r||{}}})}};0&&0},8636:(e,A,t)=>{"use strict";var r=Object.defineProperty;var s=Object.getOwnPropertyDescriptor;var o=Object.getOwnPropertyNames;var n=Object.prototype.hasOwnProperty;var __export=(e,A)=>{for(var t in A)r(e,t,{get:A[t],enumerable:true})};var __copyProps=(e,A,t,i)=>{if(A&&typeof A==="object"||typeof A==="function"){for(let a of o(A))if(!n.call(e,a)&&a!==t)r(e,a,{get:()=>A[a],enumerable:!(i=s(A,a))||i.enumerable})}return e};var __toCommonJS=e=>__copyProps(r({},"__esModule",{value:true}),e);var i={};__export(i,{request:()=>E});e.exports=__toCommonJS(i);var a=t(4471);var c=t(3843);var g="8.4.0";function isPlainObject(e){if(typeof e!=="object"||e===null)return false;if(Object.prototype.toString.call(e)!=="[object Object]")return false;const A=Object.getPrototypeOf(e);if(A===null)return true;const t=Object.prototype.hasOwnProperty.call(A,"constructor")&&A.constructor;return typeof t==="function"&&t instanceof t&&Function.prototype.call(t)===Function.prototype.call(e)}var l=t(3708);function getBufferResponse(e){return e.arrayBuffer()}function fetchWrapper(e){var A,t,r,s;const o=e.request&&e.request.log?e.request.log:console;const n=((A=e.request)==null?void 0:A.parseSuccessResponseBody)!==false;if(isPlainObject(e.body)||Array.isArray(e.body)){e.body=JSON.stringify(e.body)}let i={};let a;let c;let{fetch:g}=globalThis;if((t=e.request)==null?void 0:t.fetch){g=e.request.fetch}if(!g){throw new Error("fetch is not set. Please pass a fetch implementation as new Octokit({ request: { fetch }}). Learn more at https://github.com/octokit/octokit.js/#fetch-missing")}return g(e.url,{method:e.method,body:e.body,redirect:(r=e.request)==null?void 0:r.redirect,headers:e.headers,signal:(s=e.request)==null?void 0:s.signal,...e.body&&{duplex:"half"}}).then((async A=>{c=A.url;a=A.status;for(const e of A.headers){i[e[0]]=e[1]}if("deprecation"in i){const A=i.link&&i.link.match(/<([^>]+)>; rel="deprecation"/);const t=A&&A.pop();o.warn(`[@octokit/request] "${e.method} ${e.url}" is deprecated. It is scheduled to be removed on ${i.sunset}${t?`. See ${t}`:""}`)}if(a===204||a===205){return}if(e.method==="HEAD"){if(a<400){return}throw new l.RequestError(A.statusText,a,{response:{url:c,status:a,headers:i,data:void 0},request:e})}if(a===304){throw new l.RequestError("Not modified",a,{response:{url:c,status:a,headers:i,data:await getResponseData(A)},request:e})}if(a>=400){const t=await getResponseData(A);const r=new l.RequestError(toErrorMessage(t),a,{response:{url:c,status:a,headers:i,data:t},request:e});throw r}return n?await getResponseData(A):A.body})).then((e=>({status:a,url:c,headers:i,data:e}))).catch((A=>{if(A instanceof l.RequestError)throw A;else if(A.name==="AbortError")throw A;let t=A.message;if(A.name==="TypeError"&&"cause"in A){if(A.cause instanceof Error){t=A.cause.message}else if(typeof A.cause==="string"){t=A.cause}}throw new l.RequestError(t,500,{request:e})}))}async function getResponseData(e){const A=e.headers.get("content-type");if(/application\/json/.test(A)){return e.json().catch((()=>e.text())).catch((()=>""))}if(!A||/^text\/|charset=utf-8$/.test(A)){return e.text()}return getBufferResponse(e)}function toErrorMessage(e){if(typeof e==="string")return e;let A;if("documentation_url"in e){A=` - ${e.documentation_url}`}else{A=""}if("message"in e){if(Array.isArray(e.errors)){return`${e.message}: ${e.errors.map(JSON.stringify).join(", ")}${A}`}return`${e.message}${A}`}return`Unknown error: ${JSON.stringify(e)}`}function withDefaults(e,A){const t=e.defaults(A);const newApi=function(e,A){const r=t.merge(e,A);if(!r.request||!r.request.hook){return fetchWrapper(t.parse(r))}const request2=(e,A)=>fetchWrapper(t.parse(t.merge(e,A)));Object.assign(request2,{endpoint:t,defaults:withDefaults.bind(null,t)});return r.request.hook(request2,r)};return Object.assign(newApi,{endpoint:t,defaults:withDefaults.bind(null,t)})}var E=withDefaults(a.endpoint,{headers:{"user-agent":`octokit-request.js/${g} ${(0,c.getUserAgent)()}`}});0&&0},2732:(e,A,t)=>{var r=t(1063);var s=t(2027);var o=t(9934);var n=Function.bind;var i=n.bind(n);function bindApi(e,A,t){var r=i(o,null).apply(null,t?[A,t]:[A]);e.api={remove:r};e.remove=r;["before","error","after","wrap"].forEach((function(r){var o=t?[A,r,t]:[A,r];e[r]=e.api[r]=i(s,null).apply(null,o)}))}function HookSingular(){var e="h";var A={registry:{}};var t=r.bind(null,A,e);bindApi(t,A,e);return t}function HookCollection(){var e={registry:{}};var A=r.bind(null,e);bindApi(A,e);return A}var a=false;function Hook(){if(!a){console.warn('[before-after-hook]: "Hook()" repurposing warning, use "Hook.Collection()". Read more: https://git.io/upgrade-before-after-hook-to-1.4');a=true}return HookCollection()}Hook.Singular=HookSingular.bind();Hook.Collection=HookCollection.bind();e.exports=Hook;e.exports.Hook=Hook;e.exports.Singular=Hook.Singular;e.exports.Collection=Hook.Collection},2027:e=>{e.exports=addHook;function addHook(e,A,t,r){var s=r;if(!e.registry[t]){e.registry[t]=[]}if(A==="before"){r=function(e,A){return Promise.resolve().then(s.bind(null,A)).then(e.bind(null,A))}}if(A==="after"){r=function(e,A){var t;return Promise.resolve().then(e.bind(null,A)).then((function(e){t=e;return s(t,A)})).then((function(){return t}))}}if(A==="error"){r=function(e,A){return Promise.resolve().then(e.bind(null,A)).catch((function(e){return s(e,A)}))}}e.registry[t].push({hook:r,orig:s})}},1063:e=>{e.exports=register;function register(e,A,t,r){if(typeof t!=="function"){throw new Error("method for before hook must be a function")}if(!r){r={}}if(Array.isArray(A)){return A.reverse().reduce((function(A,t){return register.bind(null,e,t,A,r)}),t)()}return Promise.resolve().then((function(){if(!e.registry[A]){return t(r)}return e.registry[A].reduce((function(e,A){return A.hook.bind(null,e,r)}),t)()}))}},9934:e=>{e.exports=removeHook;function removeHook(e,A,t){if(!e.registry[A]){return}var r=e.registry[A].map((function(e){return e.orig})).indexOf(t);if(r===-1){return}e.registry[A].splice(r,1)}},4150:(e,A)=>{"use strict";Object.defineProperty(A,"__esModule",{value:true});class Deprecation extends Error{constructor(e){super(e);if(Error.captureStackTrace){Error.captureStackTrace(this,this.constructor)}this.name="Deprecation"}}A.Deprecation=Deprecation},5560:(e,A,t)=>{var r=t(8264);e.exports=r(once);e.exports.strict=r(onceStrict);once.proto=once((function(){Object.defineProperty(Function.prototype,"once",{value:function(){return once(this)},configurable:true});Object.defineProperty(Function.prototype,"onceStrict",{value:function(){return onceStrict(this)},configurable:true})}));function once(e){var f=function(){if(f.called)return f.value;f.called=true;return f.value=e.apply(this,arguments)};f.called=false;return f}function onceStrict(e){var f=function(){if(f.called)throw new Error(f.onceError);f.called=true;return f.value=e.apply(this,arguments)};var A=e.name||"Function wrapped with `once`";f.onceError=A+" shouldn't be called more than once";f.called=false;return f}},770:(e,A,t)=>{e.exports=t(218)},218:(e,A,t)=>{"use strict";var r=t(9278);var s=t(4756);var o=t(8611);var n=t(5692);var i=t(4434);var a=t(2613);var c=t(9023);A.httpOverHttp=httpOverHttp;A.httpsOverHttp=httpsOverHttp;A.httpOverHttps=httpOverHttps;A.httpsOverHttps=httpsOverHttps;function httpOverHttp(e){var A=new TunnelingAgent(e);A.request=o.request;return A}function httpsOverHttp(e){var A=new TunnelingAgent(e);A.request=o.request;A.createSocket=createSecureSocket;A.defaultPort=443;return A}function httpOverHttps(e){var A=new TunnelingAgent(e);A.request=n.request;return A}function httpsOverHttps(e){var A=new TunnelingAgent(e);A.request=n.request;A.createSocket=createSecureSocket;A.defaultPort=443;return A}function TunnelingAgent(e){var A=this;A.options=e||{};A.proxyOptions=A.options.proxy||{};A.maxSockets=A.options.maxSockets||o.Agent.defaultMaxSockets;A.requests=[];A.sockets=[];A.on("free",(function onFree(e,t,r,s){var o=toOptions(t,r,s);for(var n=0,i=A.requests.length;n=this.maxSockets){s.requests.push(o);return}s.createSocket(o,(function(A){A.on("free",onFree);A.on("close",onCloseOrRemove);A.on("agentRemove",onCloseOrRemove);e.onSocket(A);function onFree(){s.emit("free",A,o)}function onCloseOrRemove(e){s.removeSocket(A);A.removeListener("free",onFree);A.removeListener("close",onCloseOrRemove);A.removeListener("agentRemove",onCloseOrRemove)}}))};TunnelingAgent.prototype.createSocket=function createSocket(e,A){var t=this;var r={};t.sockets.push(r);var s=mergeOptions({},t.proxyOptions,{method:"CONNECT",path:e.host+":"+e.port,agent:false,headers:{host:e.host+":"+e.port}});if(e.localAddress){s.localAddress=e.localAddress}if(s.proxyAuth){s.headers=s.headers||{};s.headers["Proxy-Authorization"]="Basic "+new Buffer(s.proxyAuth).toString("base64")}g("making CONNECT request");var o=t.request(s);o.useChunkedEncodingByDefault=false;o.once("response",onResponse);o.once("upgrade",onUpgrade);o.once("connect",onConnect);o.once("error",onError);o.end();function onResponse(e){e.upgrade=true}function onUpgrade(e,A,t){process.nextTick((function(){onConnect(e,A,t)}))}function onConnect(s,n,i){o.removeAllListeners();n.removeAllListeners();if(s.statusCode!==200){g("tunneling socket could not be established, statusCode=%d",s.statusCode);n.destroy();var a=new Error("tunneling socket could not be established, "+"statusCode="+s.statusCode);a.code="ECONNRESET";e.request.emit("error",a);t.removeSocket(r);return}if(i.length>0){g("got illegal response body from proxy");n.destroy();var a=new Error("got illegal response body from proxy");a.code="ECONNRESET";e.request.emit("error",a);t.removeSocket(r);return}g("tunneling connection has established");t.sockets[t.sockets.indexOf(r)]=n;return A(n)}function onError(A){o.removeAllListeners();g("tunneling socket could not be established, cause=%s\n",A.message,A.stack);var s=new Error("tunneling socket could not be established, "+"cause="+A.message);s.code="ECONNRESET";e.request.emit("error",s);t.removeSocket(r)}};TunnelingAgent.prototype.removeSocket=function removeSocket(e){var A=this.sockets.indexOf(e);if(A===-1){return}this.sockets.splice(A,1);var t=this.requests.shift();if(t){this.createSocket(t,(function(e){t.request.onSocket(e)}))}};function createSecureSocket(e,A){var t=this;TunnelingAgent.prototype.createSocket.call(t,e,(function(r){var o=e.request.getHeader("host");var n=mergeOptions({},t.options,{socket:r,servername:o?o.replace(/:.*$/,""):e.host});var i=s.connect(0,n);t.sockets[t.sockets.indexOf(r)]=i;A(i)}))}function toOptions(e,A,t){if(typeof e==="string"){return{host:e,port:A,localAddress:t}}return e}function mergeOptions(e){for(var A=1,t=arguments.length;A{"use strict";const r=t(6197);const s=t(992);const o=t(8707);const n=t(5076);const i=t(1093);const a=t(9965);const c=t(3440);const{InvalidArgumentError:g}=o;const l=t(6615);const E=t(9136);const u=t(7365);const h=t(7501);const Q=t(4004);const C=t(2429);const d=t(2720);const B=t(3573);const{getGlobalDispatcher:I,setGlobalDispatcher:p}=t(2581);const m=t(8840);const y=t(8299);const w=t(4415);let b;try{t(6982);b=true}catch{b=false}Object.assign(s.prototype,l);e.exports.Dispatcher=s;e.exports.Client=r;e.exports.Pool=n;e.exports.BalancedPool=i;e.exports.Agent=a;e.exports.ProxyAgent=d;e.exports.RetryHandler=B;e.exports.DecoratorHandler=m;e.exports.RedirectHandler=y;e.exports.createRedirectInterceptor=w;e.exports.buildConnector=E;e.exports.errors=o;function makeDispatcher(e){return(A,t,r)=>{if(typeof t==="function"){r=t;t=null}if(!A||typeof A!=="string"&&typeof A!=="object"&&!(A instanceof URL)){throw new g("invalid url")}if(t!=null&&typeof t!=="object"){throw new g("invalid opts")}if(t&&t.path!=null){if(typeof t.path!=="string"){throw new g("invalid opts.path")}let e=t.path;if(!t.path.startsWith("/")){e=`/${e}`}A=new URL(c.parseOrigin(A).origin+e)}else{if(!t){t=typeof A==="object"?A:{}}A=c.parseURL(A)}const{agent:s,dispatcher:o=I()}=t;if(s){throw new g("unsupported opts.agent. Did you mean opts.client?")}return e.call(o,{...t,origin:A.origin,path:A.search?`${A.pathname}${A.search}`:A.pathname,method:t.method||(t.body?"PUT":"GET")},r)}}e.exports.setGlobalDispatcher=p;e.exports.getGlobalDispatcher=I;if(c.nodeMajor>16||c.nodeMajor===16&&c.nodeMinor>=8){let A=null;e.exports.fetch=async function fetch(e){if(!A){A=t(2315).fetch}try{return await A(...arguments)}catch(e){if(typeof e==="object"){Error.captureStackTrace(e,this)}throw e}};e.exports.Headers=t(6349).Headers;e.exports.Response=t(8676).Response;e.exports.Request=t(5194).Request;e.exports.FormData=t(3073).FormData;e.exports.File=t(3041).File;e.exports.FileReader=t(2160).FileReader;const{setGlobalOrigin:r,getGlobalOrigin:s}=t(5628);e.exports.setGlobalOrigin=r;e.exports.getGlobalOrigin=s;const{CacheStorage:o}=t(4738);const{kConstruct:n}=t(296);e.exports.caches=new o(n)}if(c.nodeMajor>=16){const{deleteCookie:A,getCookies:r,getSetCookies:s,setCookie:o}=t(3168);e.exports.deleteCookie=A;e.exports.getCookies=r;e.exports.getSetCookies=s;e.exports.setCookie=o;const{parseMIMEType:n,serializeAMimeType:i}=t(4322);e.exports.parseMIMEType=n;e.exports.serializeAMimeType=i}if(c.nodeMajor>=18&&b){const{WebSocket:A}=t(5171);e.exports.WebSocket=A}e.exports.request=makeDispatcher(l.request);e.exports.stream=makeDispatcher(l.stream);e.exports.pipeline=makeDispatcher(l.pipeline);e.exports.connect=makeDispatcher(l.connect);e.exports.upgrade=makeDispatcher(l.upgrade);e.exports.MockClient=u;e.exports.MockPool=Q;e.exports.MockAgent=h;e.exports.mockErrors=C},9965:(e,A,t)=>{"use strict";const{InvalidArgumentError:r}=t(8707);const{kClients:s,kRunning:o,kClose:n,kDestroy:i,kDispatch:a,kInterceptors:c}=t(6443);const g=t(1);const l=t(5076);const E=t(6197);const u=t(3440);const h=t(4415);const{WeakRef:Q,FinalizationRegistry:C}=t(3194)();const d=Symbol("onConnect");const B=Symbol("onDisconnect");const I=Symbol("onConnectionError");const p=Symbol("maxRedirections");const m=Symbol("onDrain");const y=Symbol("factory");const w=Symbol("finalizer");const b=Symbol("options");function defaultFactory(e,A){return A&&A.connections===1?new E(e,A):new l(e,A)}class Agent extends g{constructor({factory:e=defaultFactory,maxRedirections:A=0,connect:t,...o}={}){super();if(typeof e!=="function"){throw new r("factory must be a function.")}if(t!=null&&typeof t!=="function"&&typeof t!=="object"){throw new r("connect must be a function or an object")}if(!Number.isInteger(A)||A<0){throw new r("maxRedirections must be a positive number")}if(t&&typeof t!=="function"){t={...t}}this[c]=o.interceptors&&o.interceptors.Agent&&Array.isArray(o.interceptors.Agent)?o.interceptors.Agent:[h({maxRedirections:A})];this[b]={...u.deepClone(o),connect:t};this[b].interceptors=o.interceptors?{...o.interceptors}:undefined;this[p]=A;this[y]=e;this[s]=new Map;this[w]=new C((e=>{const A=this[s].get(e);if(A!==undefined&&A.deref()===undefined){this[s].delete(e)}}));const n=this;this[m]=(e,A)=>{n.emit("drain",e,[n,...A])};this[d]=(e,A)=>{n.emit("connect",e,[n,...A])};this[B]=(e,A,t)=>{n.emit("disconnect",e,[n,...A],t)};this[I]=(e,A,t)=>{n.emit("connectionError",e,[n,...A],t)}}get[o](){let e=0;for(const A of this[s].values()){const t=A.deref();if(t){e+=t[o]}}return e}[a](e,A){let t;if(e.origin&&(typeof e.origin==="string"||e.origin instanceof URL)){t=String(e.origin)}else{throw new r("opts.origin must be a non-empty string or URL.")}const o=this[s].get(t);let n=o?o.deref():null;if(!n){n=this[y](e.origin,this[b]).on("drain",this[m]).on("connect",this[d]).on("disconnect",this[B]).on("connectionError",this[I]);this[s].set(t,new Q(n));this[w].register(n,t)}return n.dispatch(e,A)}async[n](){const e=[];for(const A of this[s].values()){const t=A.deref();if(t){e.push(t.close())}}await Promise.all(e)}async[i](e){const A=[];for(const t of this[s].values()){const r=t.deref();if(r){A.push(r.destroy(e))}}await Promise.all(A)}}e.exports=Agent},158:(e,A,t)=>{const{addAbortListener:r}=t(3440);const{RequestAbortedError:s}=t(8707);const o=Symbol("kListener");const n=Symbol("kSignal");function abort(e){if(e.abort){e.abort()}else{e.onError(new s)}}function addSignal(e,A){e[n]=null;e[o]=null;if(!A){return}if(A.aborted){abort(e);return}e[n]=A;e[o]=()=>{abort(e)};r(e[n],e[o])}function removeSignal(e){if(!e[n]){return}if("removeEventListener"in e[n]){e[n].removeEventListener("abort",e[o])}else{e[n].removeListener("abort",e[o])}e[n]=null;e[o]=null}e.exports={addSignal:addSignal,removeSignal:removeSignal}},4660:(e,A,t)=>{"use strict";const{AsyncResource:r}=t(290);const{InvalidArgumentError:s,RequestAbortedError:o,SocketError:n}=t(8707);const i=t(3440);const{addSignal:a,removeSignal:c}=t(158);class ConnectHandler extends r{constructor(e,A){if(!e||typeof e!=="object"){throw new s("invalid opts")}if(typeof A!=="function"){throw new s("invalid callback")}const{signal:t,opaque:r,responseHeaders:o}=e;if(t&&typeof t.on!=="function"&&typeof t.addEventListener!=="function"){throw new s("signal must be an EventEmitter or EventTarget")}super("UNDICI_CONNECT");this.opaque=r||null;this.responseHeaders=o||null;this.callback=A;this.abort=null;a(this,t)}onConnect(e,A){if(!this.callback){throw new o}this.abort=e;this.context=A}onHeaders(){throw new n("bad connect",null)}onUpgrade(e,A,t){const{callback:r,opaque:s,context:o}=this;c(this);this.callback=null;let n=A;if(n!=null){n=this.responseHeaders==="raw"?i.parseRawHeaders(A):i.parseHeaders(A)}this.runInAsyncScope(r,null,null,{statusCode:e,headers:n,socket:t,opaque:s,context:o})}onError(e){const{callback:A,opaque:t}=this;c(this);if(A){this.callback=null;queueMicrotask((()=>{this.runInAsyncScope(A,null,e,{opaque:t})}))}}}function connect(e,A){if(A===undefined){return new Promise(((A,t)=>{connect.call(this,e,((e,r)=>e?t(e):A(r)))}))}try{const t=new ConnectHandler(e,A);this.dispatch({...e,method:"CONNECT"},t)}catch(t){if(typeof A!=="function"){throw t}const r=e&&e.opaque;queueMicrotask((()=>A(t,{opaque:r})))}}e.exports=connect},6862:(e,A,t)=>{"use strict";const{Readable:r,Duplex:s,PassThrough:o}=t(2203);const{InvalidArgumentError:n,InvalidReturnValueError:i,RequestAbortedError:a}=t(8707);const c=t(3440);const{AsyncResource:g}=t(290);const{addSignal:l,removeSignal:E}=t(158);const u=t(2613);const h=Symbol("resume");class PipelineRequest extends r{constructor(){super({autoDestroy:true});this[h]=null}_read(){const{[h]:e}=this;if(e){this[h]=null;e()}}_destroy(e,A){this._read();A(e)}}class PipelineResponse extends r{constructor(e){super({autoDestroy:true});this[h]=e}_read(){this[h]()}_destroy(e,A){if(!e&&!this._readableState.endEmitted){e=new a}A(e)}}class PipelineHandler extends g{constructor(e,A){if(!e||typeof e!=="object"){throw new n("invalid opts")}if(typeof A!=="function"){throw new n("invalid handler")}const{signal:t,method:r,opaque:o,onInfo:i,responseHeaders:g}=e;if(t&&typeof t.on!=="function"&&typeof t.addEventListener!=="function"){throw new n("signal must be an EventEmitter or EventTarget")}if(r==="CONNECT"){throw new n("invalid method")}if(i&&typeof i!=="function"){throw new n("invalid onInfo callback")}super("UNDICI_PIPELINE");this.opaque=o||null;this.responseHeaders=g||null;this.handler=A;this.abort=null;this.context=null;this.onInfo=i||null;this.req=(new PipelineRequest).on("error",c.nop);this.ret=new s({readableObjectMode:e.objectMode,autoDestroy:true,read:()=>{const{body:e}=this;if(e&&e.resume){e.resume()}},write:(e,A,t)=>{const{req:r}=this;if(r.push(e,A)||r._readableState.destroyed){t()}else{r[h]=t}},destroy:(e,A)=>{const{body:t,req:r,res:s,ret:o,abort:n}=this;if(!e&&!o._readableState.endEmitted){e=new a}if(n&&e){n()}c.destroy(t,e);c.destroy(r,e);c.destroy(s,e);E(this);A(e)}}).on("prefinish",(()=>{const{req:e}=this;e.push(null)}));this.res=null;l(this,t)}onConnect(e,A){const{ret:t,res:r}=this;u(!r,"pipeline cannot be retried");if(t.destroyed){throw new a}this.abort=e;this.context=A}onHeaders(e,A,t){const{opaque:r,handler:s,context:o}=this;if(e<200){if(this.onInfo){const t=this.responseHeaders==="raw"?c.parseRawHeaders(A):c.parseHeaders(A);this.onInfo({statusCode:e,headers:t})}return}this.res=new PipelineResponse(t);let n;try{this.handler=null;const t=this.responseHeaders==="raw"?c.parseRawHeaders(A):c.parseHeaders(A);n=this.runInAsyncScope(s,null,{statusCode:e,headers:t,opaque:r,body:this.res,context:o})}catch(e){this.res.on("error",c.nop);throw e}if(!n||typeof n.on!=="function"){throw new i("expected Readable")}n.on("data",(e=>{const{ret:A,body:t}=this;if(!A.push(e)&&t.pause){t.pause()}})).on("error",(e=>{const{ret:A}=this;c.destroy(A,e)})).on("end",(()=>{const{ret:e}=this;e.push(null)})).on("close",(()=>{const{ret:e}=this;if(!e._readableState.ended){c.destroy(e,new a)}}));this.body=n}onData(e){const{res:A}=this;return A.push(e)}onComplete(e){const{res:A}=this;A.push(null)}onError(e){const{ret:A}=this;this.handler=null;c.destroy(A,e)}}function pipeline(e,A){try{const t=new PipelineHandler(e,A);this.dispatch({...e,body:t.req},t);return t.ret}catch(e){return(new o).destroy(e)}}e.exports=pipeline},4043:(e,A,t)=>{"use strict";const r=t(9927);const{InvalidArgumentError:s,RequestAbortedError:o}=t(8707);const n=t(3440);const{getResolveErrorBodyCallback:i}=t(7655);const{AsyncResource:a}=t(290);const{addSignal:c,removeSignal:g}=t(158);class RequestHandler extends a{constructor(e,A){if(!e||typeof e!=="object"){throw new s("invalid opts")}const{signal:t,method:r,opaque:o,body:i,onInfo:a,responseHeaders:g,throwOnError:l,highWaterMark:E}=e;try{if(typeof A!=="function"){throw new s("invalid callback")}if(E&&(typeof E!=="number"||E<0)){throw new s("invalid highWaterMark")}if(t&&typeof t.on!=="function"&&typeof t.addEventListener!=="function"){throw new s("signal must be an EventEmitter or EventTarget")}if(r==="CONNECT"){throw new s("invalid method")}if(a&&typeof a!=="function"){throw new s("invalid onInfo callback")}super("UNDICI_REQUEST")}catch(e){if(n.isStream(i)){n.destroy(i.on("error",n.nop),e)}throw e}this.responseHeaders=g||null;this.opaque=o||null;this.callback=A;this.res=null;this.abort=null;this.body=i;this.trailers={};this.context=null;this.onInfo=a||null;this.throwOnError=l;this.highWaterMark=E;if(n.isStream(i)){i.on("error",(e=>{this.onError(e)}))}c(this,t)}onConnect(e,A){if(!this.callback){throw new o}this.abort=e;this.context=A}onHeaders(e,A,t,s){const{callback:o,opaque:a,abort:c,context:g,responseHeaders:l,highWaterMark:E}=this;const u=l==="raw"?n.parseRawHeaders(A):n.parseHeaders(A);if(e<200){if(this.onInfo){this.onInfo({statusCode:e,headers:u})}return}const h=l==="raw"?n.parseHeaders(A):u;const Q=h["content-type"];const C=new r({resume:t,abort:c,contentType:Q,highWaterMark:E});this.callback=null;this.res=C;if(o!==null){if(this.throwOnError&&e>=400){this.runInAsyncScope(i,null,{callback:o,body:C,contentType:Q,statusCode:e,statusMessage:s,headers:u})}else{this.runInAsyncScope(o,null,null,{statusCode:e,headers:u,trailers:this.trailers,opaque:a,body:C,context:g})}}}onData(e){const{res:A}=this;return A.push(e)}onComplete(e){const{res:A}=this;g(this);n.parseHeaders(e,this.trailers);A.push(null)}onError(e){const{res:A,callback:t,body:r,opaque:s}=this;g(this);if(t){this.callback=null;queueMicrotask((()=>{this.runInAsyncScope(t,null,e,{opaque:s})}))}if(A){this.res=null;queueMicrotask((()=>{n.destroy(A,e)}))}if(r){this.body=null;n.destroy(r,e)}}}function request(e,A){if(A===undefined){return new Promise(((A,t)=>{request.call(this,e,((e,r)=>e?t(e):A(r)))}))}try{this.dispatch(e,new RequestHandler(e,A))}catch(t){if(typeof A!=="function"){throw t}const r=e&&e.opaque;queueMicrotask((()=>A(t,{opaque:r})))}}e.exports=request;e.exports.RequestHandler=RequestHandler},3560:(e,A,t)=>{"use strict";const{finished:r,PassThrough:s}=t(2203);const{InvalidArgumentError:o,InvalidReturnValueError:n,RequestAbortedError:i}=t(8707);const a=t(3440);const{getResolveErrorBodyCallback:c}=t(7655);const{AsyncResource:g}=t(290);const{addSignal:l,removeSignal:E}=t(158);class StreamHandler extends g{constructor(e,A,t){if(!e||typeof e!=="object"){throw new o("invalid opts")}const{signal:r,method:s,opaque:n,body:i,onInfo:c,responseHeaders:g,throwOnError:E}=e;try{if(typeof t!=="function"){throw new o("invalid callback")}if(typeof A!=="function"){throw new o("invalid factory")}if(r&&typeof r.on!=="function"&&typeof r.addEventListener!=="function"){throw new o("signal must be an EventEmitter or EventTarget")}if(s==="CONNECT"){throw new o("invalid method")}if(c&&typeof c!=="function"){throw new o("invalid onInfo callback")}super("UNDICI_STREAM")}catch(e){if(a.isStream(i)){a.destroy(i.on("error",a.nop),e)}throw e}this.responseHeaders=g||null;this.opaque=n||null;this.factory=A;this.callback=t;this.res=null;this.abort=null;this.context=null;this.trailers=null;this.body=i;this.onInfo=c||null;this.throwOnError=E||false;if(a.isStream(i)){i.on("error",(e=>{this.onError(e)}))}l(this,r)}onConnect(e,A){if(!this.callback){throw new i}this.abort=e;this.context=A}onHeaders(e,A,t,o){const{factory:i,opaque:g,context:l,callback:E,responseHeaders:u}=this;const h=u==="raw"?a.parseRawHeaders(A):a.parseHeaders(A);if(e<200){if(this.onInfo){this.onInfo({statusCode:e,headers:h})}return}this.factory=null;let Q;if(this.throwOnError&&e>=400){const t=u==="raw"?a.parseHeaders(A):h;const r=t["content-type"];Q=new s;this.callback=null;this.runInAsyncScope(c,null,{callback:E,body:Q,contentType:r,statusCode:e,statusMessage:o,headers:h})}else{if(i===null){return}Q=this.runInAsyncScope(i,null,{statusCode:e,headers:h,opaque:g,context:l});if(!Q||typeof Q.write!=="function"||typeof Q.end!=="function"||typeof Q.on!=="function"){throw new n("expected Writable")}r(Q,{readable:false},(e=>{const{callback:A,res:t,opaque:r,trailers:s,abort:o}=this;this.res=null;if(e||!t.readable){a.destroy(t,e)}this.callback=null;this.runInAsyncScope(A,null,e||null,{opaque:r,trailers:s});if(e){o()}}))}Q.on("drain",t);this.res=Q;const C=Q.writableNeedDrain!==undefined?Q.writableNeedDrain:Q._writableState&&Q._writableState.needDrain;return C!==true}onData(e){const{res:A}=this;return A?A.write(e):true}onComplete(e){const{res:A}=this;E(this);if(!A){return}this.trailers=a.parseHeaders(e);A.end()}onError(e){const{res:A,callback:t,opaque:r,body:s}=this;E(this);this.factory=null;if(A){this.res=null;a.destroy(A,e)}else if(t){this.callback=null;queueMicrotask((()=>{this.runInAsyncScope(t,null,e,{opaque:r})}))}if(s){this.body=null;a.destroy(s,e)}}}function stream(e,A,t){if(t===undefined){return new Promise(((t,r)=>{stream.call(this,e,A,((e,A)=>e?r(e):t(A)))}))}try{this.dispatch(e,new StreamHandler(e,A,t))}catch(A){if(typeof t!=="function"){throw A}const r=e&&e.opaque;queueMicrotask((()=>t(A,{opaque:r})))}}e.exports=stream},1882:(e,A,t)=>{"use strict";const{InvalidArgumentError:r,RequestAbortedError:s,SocketError:o}=t(8707);const{AsyncResource:n}=t(290);const i=t(3440);const{addSignal:a,removeSignal:c}=t(158);const g=t(2613);class UpgradeHandler extends n{constructor(e,A){if(!e||typeof e!=="object"){throw new r("invalid opts")}if(typeof A!=="function"){throw new r("invalid callback")}const{signal:t,opaque:s,responseHeaders:o}=e;if(t&&typeof t.on!=="function"&&typeof t.addEventListener!=="function"){throw new r("signal must be an EventEmitter or EventTarget")}super("UNDICI_UPGRADE");this.responseHeaders=o||null;this.opaque=s||null;this.callback=A;this.abort=null;this.context=null;a(this,t)}onConnect(e,A){if(!this.callback){throw new s}this.abort=e;this.context=null}onHeaders(){throw new o("bad upgrade",null)}onUpgrade(e,A,t){const{callback:r,opaque:s,context:o}=this;g.strictEqual(e,101);c(this);this.callback=null;const n=this.responseHeaders==="raw"?i.parseRawHeaders(A):i.parseHeaders(A);this.runInAsyncScope(r,null,null,{headers:n,socket:t,opaque:s,context:o})}onError(e){const{callback:A,opaque:t}=this;c(this);if(A){this.callback=null;queueMicrotask((()=>{this.runInAsyncScope(A,null,e,{opaque:t})}))}}}function upgrade(e,A){if(A===undefined){return new Promise(((A,t)=>{upgrade.call(this,e,((e,r)=>e?t(e):A(r)))}))}try{const t=new UpgradeHandler(e,A);this.dispatch({...e,method:e.method||"GET",upgrade:e.protocol||"Websocket"},t)}catch(t){if(typeof A!=="function"){throw t}const r=e&&e.opaque;queueMicrotask((()=>A(t,{opaque:r})))}}e.exports=upgrade},6615:(e,A,t)=>{"use strict";e.exports.request=t(4043);e.exports.stream=t(3560);e.exports.pipeline=t(6862);e.exports.upgrade=t(1882);e.exports.connect=t(4660)},9927:(e,A,t)=>{"use strict";const r=t(2613);const{Readable:s}=t(2203);const{RequestAbortedError:o,NotSupportedError:n,InvalidArgumentError:i}=t(8707);const a=t(3440);const{ReadableStreamFrom:c,toUSVString:g}=t(3440);let l;const E=Symbol("kConsume");const u=Symbol("kReading");const h=Symbol("kBody");const Q=Symbol("abort");const C=Symbol("kContentType");const noop=()=>{};e.exports=class BodyReadable extends s{constructor({resume:e,abort:A,contentType:t="",highWaterMark:r=64*1024}){super({autoDestroy:true,read:e,highWaterMark:r});this._readableState.dataEmitted=false;this[Q]=A;this[E]=null;this[h]=null;this[C]=t;this[u]=false}destroy(e){if(this.destroyed){return this}if(!e&&!this._readableState.endEmitted){e=new o}if(e){this[Q]()}return super.destroy(e)}emit(e,...A){if(e==="data"){this._readableState.dataEmitted=true}else if(e==="error"){this._readableState.errorEmitted=true}return super.emit(e,...A)}on(e,...A){if(e==="data"||e==="readable"){this[u]=true}return super.on(e,...A)}addListener(e,...A){return this.on(e,...A)}off(e,...A){const t=super.off(e,...A);if(e==="data"||e==="readable"){this[u]=this.listenerCount("data")>0||this.listenerCount("readable")>0}return t}removeListener(e,...A){return this.off(e,...A)}push(e){if(this[E]&&e!==null&&this.readableLength===0){consumePush(this[E],e);return this[u]?super.push(e):true}return super.push(e)}async text(){return consume(this,"text")}async json(){return consume(this,"json")}async blob(){return consume(this,"blob")}async arrayBuffer(){return consume(this,"arrayBuffer")}async formData(){throw new n}get bodyUsed(){return a.isDisturbed(this)}get body(){if(!this[h]){this[h]=c(this);if(this[E]){this[h].getReader();r(this[h].locked)}}return this[h]}dump(e){let A=e&&Number.isFinite(e.limit)?e.limit:262144;const t=e&&e.signal;if(t){try{if(typeof t!=="object"||!("aborted"in t)){throw new i("signal must be an AbortSignal")}a.throwIfAborted(t)}catch(e){return Promise.reject(e)}}if(this.closed){return Promise.resolve(null)}return new Promise(((e,r)=>{const s=t?a.addAbortListener(t,(()=>{this.destroy()})):noop;this.on("close",(function(){s();if(t&&t.aborted){r(t.reason||Object.assign(new Error("The operation was aborted"),{name:"AbortError"}))}else{e(null)}})).on("error",noop).on("data",(function(e){A-=e.length;if(A<=0){this.destroy()}})).resume()}))}};function isLocked(e){return e[h]&&e[h].locked===true||e[E]}function isUnusable(e){return a.isDisturbed(e)||isLocked(e)}async function consume(e,A){if(isUnusable(e)){throw new TypeError("unusable")}r(!e[E]);return new Promise(((t,r)=>{e[E]={type:A,stream:e,resolve:t,reject:r,length:0,body:[]};e.on("error",(function(e){consumeFinish(this[E],e)})).on("close",(function(){if(this[E].body!==null){consumeFinish(this[E],new o)}}));process.nextTick(consumeStart,e[E])}))}function consumeStart(e){if(e.body===null){return}const{_readableState:A}=e.stream;for(const t of A.buffer){consumePush(e,t)}if(A.endEmitted){consumeEnd(this[E])}else{e.stream.on("end",(function(){consumeEnd(this[E])}))}e.stream.resume();while(e.stream.read()!=null){}}function consumeEnd(e){const{type:A,body:r,resolve:s,stream:o,length:n}=e;try{if(A==="text"){s(g(Buffer.concat(r)))}else if(A==="json"){s(JSON.parse(Buffer.concat(r)))}else if(A==="arrayBuffer"){const e=new Uint8Array(n);let A=0;for(const t of r){e.set(t,A);A+=t.byteLength}s(e.buffer)}else if(A==="blob"){if(!l){l=t(181).Blob}s(new l(r,{type:o[C]}))}consumeFinish(e)}catch(e){o.destroy(e)}}function consumePush(e,A){e.length+=A.length;e.body.push(A)}function consumeFinish(e,A){if(e.body===null){return}if(A){e.reject(A)}else{e.resolve()}e.type=null;e.stream=null;e.resolve=null;e.reject=null;e.length=0;e.body=null}},7655:(e,A,t)=>{const r=t(2613);const{ResponseStatusCodeError:s}=t(8707);const{toUSVString:o}=t(3440);async function getResolveErrorBodyCallback({callback:e,body:A,contentType:t,statusCode:n,statusMessage:i,headers:a}){r(A);let c=[];let g=0;for await(const e of A){c.push(e);g+=e.length;if(g>128*1024){c=null;break}}if(n===204||!t||!c){process.nextTick(e,new s(`Response status code ${n}${i?`: ${i}`:""}`,n,a));return}try{if(t.startsWith("application/json")){const A=JSON.parse(o(Buffer.concat(c)));process.nextTick(e,new s(`Response status code ${n}${i?`: ${i}`:""}`,n,a,A));return}if(t.startsWith("text/")){const A=o(Buffer.concat(c));process.nextTick(e,new s(`Response status code ${n}${i?`: ${i}`:""}`,n,a,A));return}}catch(e){}process.nextTick(e,new s(`Response status code ${n}${i?`: ${i}`:""}`,n,a))}e.exports={getResolveErrorBodyCallback:getResolveErrorBodyCallback}},1093:(e,A,t)=>{"use strict";const{BalancedPoolMissingUpstreamError:r,InvalidArgumentError:s}=t(8707);const{PoolBase:o,kClients:n,kNeedDrain:i,kAddClient:a,kRemoveClient:c,kGetDispatcher:g}=t(8640);const l=t(5076);const{kUrl:E,kInterceptors:u}=t(6443);const{parseOrigin:h}=t(3440);const Q=Symbol("factory");const C=Symbol("options");const d=Symbol("kGreatestCommonDivisor");const B=Symbol("kCurrentWeight");const I=Symbol("kIndex");const p=Symbol("kWeight");const m=Symbol("kMaxWeightPerServer");const y=Symbol("kErrorPenalty");function getGreatestCommonDivisor(e,A){if(A===0)return e;return getGreatestCommonDivisor(A,e%A)}function defaultFactory(e,A){return new l(e,A)}class BalancedPool extends o{constructor(e=[],{factory:A=defaultFactory,...t}={}){super();this[C]=t;this[I]=-1;this[B]=0;this[m]=this[C].maxWeightPerServer||100;this[y]=this[C].errorPenalty||15;if(!Array.isArray(e)){e=[e]}if(typeof A!=="function"){throw new s("factory must be a function.")}this[u]=t.interceptors&&t.interceptors.BalancedPool&&Array.isArray(t.interceptors.BalancedPool)?t.interceptors.BalancedPool:[];this[Q]=A;for(const A of e){this.addUpstream(A)}this._updateBalancedPoolStats()}addUpstream(e){const A=h(e).origin;if(this[n].find((e=>e[E].origin===A&&e.closed!==true&&e.destroyed!==true))){return this}const t=this[Q](A,Object.assign({},this[C]));this[a](t);t.on("connect",(()=>{t[p]=Math.min(this[m],t[p]+this[y])}));t.on("connectionError",(()=>{t[p]=Math.max(1,t[p]-this[y]);this._updateBalancedPoolStats()}));t.on("disconnect",((...e)=>{const A=e[2];if(A&&A.code==="UND_ERR_SOCKET"){t[p]=Math.max(1,t[p]-this[y]);this._updateBalancedPoolStats()}}));for(const e of this[n]){e[p]=this[m]}this._updateBalancedPoolStats();return this}_updateBalancedPoolStats(){this[d]=this[n].map((e=>e[p])).reduce(getGreatestCommonDivisor,0)}removeUpstream(e){const A=h(e).origin;const t=this[n].find((e=>e[E].origin===A&&e.closed!==true&&e.destroyed!==true));if(t){this[c](t)}return this}get upstreams(){return this[n].filter((e=>e.closed!==true&&e.destroyed!==true)).map((e=>e[E].origin))}[g](){if(this[n].length===0){throw new r}const e=this[n].find((e=>!e[i]&&e.closed!==true&&e.destroyed!==true));if(!e){return}const A=this[n].map((e=>e[i])).reduce(((e,A)=>e&&A),true);if(A){return}let t=0;let s=this[n].findIndex((e=>!e[i]));while(t++this[n][s][p]&&!e[i]){s=this[I]}if(this[I]===0){this[B]=this[B]-this[d];if(this[B]<=0){this[B]=this[m]}}if(e[p]>=this[B]&&!e[i]){return e}}this[B]=this[n][s][p];this[I]=s;return this[n][s]}}e.exports=BalancedPool},479:(e,A,t)=>{"use strict";const{kConstruct:r}=t(296);const{urlEquals:s,fieldValues:o}=t(3993);const{kEnumerableProperty:n,isDisturbed:i}=t(3440);const{kHeadersList:a}=t(6443);const{webidl:c}=t(4222);const{Response:g,cloneResponse:l}=t(8676);const{Request:E}=t(5194);const{kState:u,kHeaders:h,kGuard:Q,kRealm:C}=t(9710);const{fetching:d}=t(2315);const{urlIsHttpHttpsScheme:B,createDeferredPromise:I,readAllBytes:p}=t(5523);const m=t(2613);const{getGlobalDispatcher:y}=t(2581);class Cache{#e;constructor(){if(arguments[0]!==r){c.illegalConstructor()}this.#e=arguments[1]}async match(e,A={}){c.brandCheck(this,Cache);c.argumentLengthCheck(arguments,1,{header:"Cache.match"});e=c.converters.RequestInfo(e);A=c.converters.CacheQueryOptions(A);const t=await this.matchAll(e,A);if(t.length===0){return}return t[0]}async matchAll(e=undefined,A={}){c.brandCheck(this,Cache);if(e!==undefined)e=c.converters.RequestInfo(e);A=c.converters.CacheQueryOptions(A);let t=null;if(e!==undefined){if(e instanceof E){t=e[u];if(t.method!=="GET"&&!A.ignoreMethod){return[]}}else if(typeof e==="string"){t=new E(e)[u]}}const r=[];if(e===undefined){for(const e of this.#e){r.push(e[1])}}else{const e=this.#A(t,A);for(const A of e){r.push(A[1])}}const s=[];for(const e of r){const A=new g(e.body?.source??null);const t=A[u].body;A[u]=e;A[u].body=t;A[h][a]=e.headersList;A[h][Q]="immutable";s.push(A)}return Object.freeze(s)}async add(e){c.brandCheck(this,Cache);c.argumentLengthCheck(arguments,1,{header:"Cache.add"});e=c.converters.RequestInfo(e);const A=[e];const t=this.addAll(A);return await t}async addAll(e){c.brandCheck(this,Cache);c.argumentLengthCheck(arguments,1,{header:"Cache.addAll"});e=c.converters["sequence"](e);const A=[];const t=[];for(const A of e){if(typeof A==="string"){continue}const e=A[u];if(!B(e.url)||e.method!=="GET"){throw c.errors.exception({header:"Cache.addAll",message:"Expected http/s scheme when method is not GET."})}}const r=[];for(const s of e){const e=new E(s)[u];if(!B(e.url)){throw c.errors.exception({header:"Cache.addAll",message:"Expected http/s scheme."})}e.initiator="fetch";e.destination="subresource";t.push(e);const n=I();r.push(d({request:e,dispatcher:y(),processResponse(e){if(e.type==="error"||e.status===206||e.status<200||e.status>299){n.reject(c.errors.exception({header:"Cache.addAll",message:"Received an invalid status code or the request failed."}))}else if(e.headersList.contains("vary")){const A=o(e.headersList.get("vary"));for(const e of A){if(e==="*"){n.reject(c.errors.exception({header:"Cache.addAll",message:"invalid vary field value"}));for(const e of r){e.abort()}return}}}},processResponseEndOfBody(e){if(e.aborted){n.reject(new DOMException("aborted","AbortError"));return}n.resolve(e)}}));A.push(n.promise)}const s=Promise.all(A);const n=await s;const i=[];let a=0;for(const e of n){const A={type:"put",request:t[a],response:e};i.push(A);a++}const g=I();let l=null;try{this.#t(i)}catch(e){l=e}queueMicrotask((()=>{if(l===null){g.resolve(undefined)}else{g.reject(l)}}));return g.promise}async put(e,A){c.brandCheck(this,Cache);c.argumentLengthCheck(arguments,2,{header:"Cache.put"});e=c.converters.RequestInfo(e);A=c.converters.Response(A);let t=null;if(e instanceof E){t=e[u]}else{t=new E(e)[u]}if(!B(t.url)||t.method!=="GET"){throw c.errors.exception({header:"Cache.put",message:"Expected an http/s scheme when method is not GET"})}const r=A[u];if(r.status===206){throw c.errors.exception({header:"Cache.put",message:"Got 206 status"})}if(r.headersList.contains("vary")){const e=o(r.headersList.get("vary"));for(const A of e){if(A==="*"){throw c.errors.exception({header:"Cache.put",message:"Got * vary field value"})}}}if(r.body&&(i(r.body.stream)||r.body.stream.locked)){throw c.errors.exception({header:"Cache.put",message:"Response body is locked or disturbed"})}const s=l(r);const n=I();if(r.body!=null){const e=r.body.stream;const A=e.getReader();p(A).then(n.resolve,n.reject)}else{n.resolve(undefined)}const a=[];const g={type:"put",request:t,response:s};a.push(g);const h=await n.promise;if(s.body!=null){s.body.source=h}const Q=I();let C=null;try{this.#t(a)}catch(e){C=e}queueMicrotask((()=>{if(C===null){Q.resolve()}else{Q.reject(C)}}));return Q.promise}async delete(e,A={}){c.brandCheck(this,Cache);c.argumentLengthCheck(arguments,1,{header:"Cache.delete"});e=c.converters.RequestInfo(e);A=c.converters.CacheQueryOptions(A);let t=null;if(e instanceof E){t=e[u];if(t.method!=="GET"&&!A.ignoreMethod){return false}}else{m(typeof e==="string");t=new E(e)[u]}const r=[];const s={type:"delete",request:t,options:A};r.push(s);const o=I();let n=null;let i;try{i=this.#t(r)}catch(e){n=e}queueMicrotask((()=>{if(n===null){o.resolve(!!i?.length)}else{o.reject(n)}}));return o.promise}async keys(e=undefined,A={}){c.brandCheck(this,Cache);if(e!==undefined)e=c.converters.RequestInfo(e);A=c.converters.CacheQueryOptions(A);let t=null;if(e!==undefined){if(e instanceof E){t=e[u];if(t.method!=="GET"&&!A.ignoreMethod){return[]}}else if(typeof e==="string"){t=new E(e)[u]}}const r=I();const s=[];if(e===undefined){for(const e of this.#e){s.push(e[0])}}else{const e=this.#A(t,A);for(const A of e){s.push(A[0])}}queueMicrotask((()=>{const e=[];for(const A of s){const t=new E("https://a");t[u]=A;t[h][a]=A.headersList;t[h][Q]="immutable";t[C]=A.client;e.push(t)}r.resolve(Object.freeze(e))}));return r.promise}#t(e){const A=this.#e;const t=[...A];const r=[];const s=[];try{for(const t of e){if(t.type!=="delete"&&t.type!=="put"){throw c.errors.exception({header:"Cache.#batchCacheOperations",message:'operation type does not match "delete" or "put"'})}if(t.type==="delete"&&t.response!=null){throw c.errors.exception({header:"Cache.#batchCacheOperations",message:"delete operation should not have an associated response"})}if(this.#A(t.request,t.options,r).length){throw new DOMException("???","InvalidStateError")}let e;if(t.type==="delete"){e=this.#A(t.request,t.options);if(e.length===0){return[]}for(const t of e){const e=A.indexOf(t);m(e!==-1);A.splice(e,1)}}else if(t.type==="put"){if(t.response==null){throw c.errors.exception({header:"Cache.#batchCacheOperations",message:"put operation should have an associated response"})}const s=t.request;if(!B(s.url)){throw c.errors.exception({header:"Cache.#batchCacheOperations",message:"expected http or https scheme"})}if(s.method!=="GET"){throw c.errors.exception({header:"Cache.#batchCacheOperations",message:"not get method"})}if(t.options!=null){throw c.errors.exception({header:"Cache.#batchCacheOperations",message:"options must not be defined"})}e=this.#A(t.request);for(const t of e){const e=A.indexOf(t);m(e!==-1);A.splice(e,1)}A.push([t.request,t.response]);r.push([t.request,t.response])}s.push([t.request,t.response])}return s}catch(e){this.#e.length=0;this.#e=t;throw e}}#A(e,A,t){const r=[];const s=t??this.#e;for(const t of s){const[s,o]=t;if(this.#r(e,s,o,A)){r.push(t)}}return r}#r(e,A,t=null,r){const n=new URL(e.url);const i=new URL(A.url);if(r?.ignoreSearch){i.search="";n.search=""}if(!s(n,i,true)){return false}if(t==null||r?.ignoreVary||!t.headersList.contains("vary")){return true}const a=o(t.headersList.get("vary"));for(const t of a){if(t==="*"){return false}const r=A.headersList.get(t);const s=e.headersList.get(t);if(r!==s){return false}}return true}}Object.defineProperties(Cache.prototype,{[Symbol.toStringTag]:{value:"Cache",configurable:true},match:n,matchAll:n,add:n,addAll:n,put:n,delete:n,keys:n});const w=[{key:"ignoreSearch",converter:c.converters.boolean,defaultValue:false},{key:"ignoreMethod",converter:c.converters.boolean,defaultValue:false},{key:"ignoreVary",converter:c.converters.boolean,defaultValue:false}];c.converters.CacheQueryOptions=c.dictionaryConverter(w);c.converters.MultiCacheQueryOptions=c.dictionaryConverter([...w,{key:"cacheName",converter:c.converters.DOMString}]);c.converters.Response=c.interfaceConverter(g);c.converters["sequence"]=c.sequenceConverter(c.converters.RequestInfo);e.exports={Cache:Cache}},4738:(e,A,t)=>{"use strict";const{kConstruct:r}=t(296);const{Cache:s}=t(479);const{webidl:o}=t(4222);const{kEnumerableProperty:n}=t(3440);class CacheStorage{#s=new Map;constructor(){if(arguments[0]!==r){o.illegalConstructor()}}async match(e,A={}){o.brandCheck(this,CacheStorage);o.argumentLengthCheck(arguments,1,{header:"CacheStorage.match"});e=o.converters.RequestInfo(e);A=o.converters.MultiCacheQueryOptions(A);if(A.cacheName!=null){if(this.#s.has(A.cacheName)){const t=this.#s.get(A.cacheName);const o=new s(r,t);return await o.match(e,A)}}else{for(const t of this.#s.values()){const o=new s(r,t);const n=await o.match(e,A);if(n!==undefined){return n}}}}async has(e){o.brandCheck(this,CacheStorage);o.argumentLengthCheck(arguments,1,{header:"CacheStorage.has"});e=o.converters.DOMString(e);return this.#s.has(e)}async open(e){o.brandCheck(this,CacheStorage);o.argumentLengthCheck(arguments,1,{header:"CacheStorage.open"});e=o.converters.DOMString(e);if(this.#s.has(e)){const A=this.#s.get(e);return new s(r,A)}const A=[];this.#s.set(e,A);return new s(r,A)}async delete(e){o.brandCheck(this,CacheStorage);o.argumentLengthCheck(arguments,1,{header:"CacheStorage.delete"});e=o.converters.DOMString(e);return this.#s.delete(e)}async keys(){o.brandCheck(this,CacheStorage);const e=this.#s.keys();return[...e]}}Object.defineProperties(CacheStorage.prototype,{[Symbol.toStringTag]:{value:"CacheStorage",configurable:true},match:n,has:n,open:n,delete:n,keys:n});e.exports={CacheStorage:CacheStorage}},296:(e,A,t)=>{"use strict";e.exports={kConstruct:t(6443).kConstruct}},3993:(e,A,t)=>{"use strict";const r=t(2613);const{URLSerializer:s}=t(4322);const{isValidHeaderName:o}=t(5523);function urlEquals(e,A,t=false){const r=s(e,t);const o=s(A,t);return r===o}function fieldValues(e){r(e!==null);const A=[];for(let t of e.split(",")){t=t.trim();if(!t.length){continue}else if(!o(t)){continue}A.push(t)}return A}e.exports={urlEquals:urlEquals,fieldValues:fieldValues}},6197:(e,A,t)=>{"use strict";const r=t(2613);const s=t(9278);const o=t(8611);const{pipeline:n}=t(2203);const i=t(3440);const a=t(8804);const c=t(4655);const g=t(1);const{RequestContentLengthMismatchError:l,ResponseContentLengthMismatchError:E,InvalidArgumentError:u,RequestAbortedError:h,HeadersTimeoutError:Q,HeadersOverflowError:C,SocketError:d,InformationalError:B,BodyTimeoutError:I,HTTPParserError:p,ResponseExceededMaxSizeError:m,ClientDestroyedError:y}=t(8707);const w=t(9136);const{kUrl:b,kReset:R,kServerName:k,kClient:D,kBusy:S,kParser:F,kConnect:T,kBlocking:N,kResuming:U,kRunning:v,kPending:L,kSize:G,kWriting:M,kQueue:_,kConnected:O,kConnecting:P,kNeedDrain:H,kNoRef:Y,kKeepAliveDefaultTimeout:J,kHostHeader:x,kPendingIdx:V,kRunningIdx:q,kError:W,kPipelining:j,kSocket:K,kKeepAliveTimeoutValue:Z,kMaxHeadersSize:X,kKeepAliveMaxTimeout:z,kKeepAliveTimeoutThreshold:$,kHeadersTimeout:ee,kBodyTimeout:Ae,kStrictContentLength:te,kConnector:re,kMaxRedirections:se,kMaxRequests:oe,kCounter:ne,kClose:ie,kDestroy:ae,kDispatch:ce,kInterceptors:ge,kLocalAddress:le,kMaxResponseSize:Ee,kHTTPConnVersion:ue,kHost:he,kHTTP2Session:Qe,kHTTP2SessionState:Ce,kHTTP2BuildRequest:de,kHTTP2CopyHeaders:Be,kHTTP1BuildRequest:Ie}=t(6443);let pe;try{pe=t(5675)}catch{pe={constants:{}}}const{constants:{HTTP2_HEADER_AUTHORITY:fe,HTTP2_HEADER_METHOD:me,HTTP2_HEADER_PATH:ye,HTTP2_HEADER_SCHEME:we,HTTP2_HEADER_CONTENT_LENGTH:be,HTTP2_HEADER_EXPECT:Re,HTTP2_HEADER_STATUS:ke}}=pe;let De=false;const Se=Buffer[Symbol.species];const Fe=Symbol("kClosedResolve");const Te={};try{const e=t(1637);Te.sendHeaders=e.channel("undici:client:sendHeaders");Te.beforeConnect=e.channel("undici:client:beforeConnect");Te.connectError=e.channel("undici:client:connectError");Te.connected=e.channel("undici:client:connected")}catch{Te.sendHeaders={hasSubscribers:false};Te.beforeConnect={hasSubscribers:false};Te.connectError={hasSubscribers:false};Te.connected={hasSubscribers:false}}class Client extends g{constructor(e,{interceptors:A,maxHeaderSize:t,headersTimeout:r,socketTimeout:n,requestTimeout:a,connectTimeout:c,bodyTimeout:g,idleTimeout:l,keepAlive:E,keepAliveTimeout:h,maxKeepAliveTimeout:Q,keepAliveMaxTimeout:C,keepAliveTimeoutThreshold:d,socketPath:B,pipelining:I,tls:p,strictContentLength:m,maxCachedSessions:y,maxRedirections:R,connect:D,maxRequestsPerClient:S,localAddress:F,maxResponseSize:T,autoSelectFamily:N,autoSelectFamilyAttemptTimeout:v,allowH2:L,maxConcurrentStreams:G}={}){super();if(E!==undefined){throw new u("unsupported keepAlive, use pipelining=0 instead")}if(n!==undefined){throw new u("unsupported socketTimeout, use headersTimeout & bodyTimeout instead")}if(a!==undefined){throw new u("unsupported requestTimeout, use headersTimeout & bodyTimeout instead")}if(l!==undefined){throw new u("unsupported idleTimeout, use keepAliveTimeout instead")}if(Q!==undefined){throw new u("unsupported maxKeepAliveTimeout, use keepAliveMaxTimeout instead")}if(t!=null&&!Number.isFinite(t)){throw new u("invalid maxHeaderSize")}if(B!=null&&typeof B!=="string"){throw new u("invalid socketPath")}if(c!=null&&(!Number.isFinite(c)||c<0)){throw new u("invalid connectTimeout")}if(h!=null&&(!Number.isFinite(h)||h<=0)){throw new u("invalid keepAliveTimeout")}if(C!=null&&(!Number.isFinite(C)||C<=0)){throw new u("invalid keepAliveMaxTimeout")}if(d!=null&&!Number.isFinite(d)){throw new u("invalid keepAliveTimeoutThreshold")}if(r!=null&&(!Number.isInteger(r)||r<0)){throw new u("headersTimeout must be a positive integer or zero")}if(g!=null&&(!Number.isInteger(g)||g<0)){throw new u("bodyTimeout must be a positive integer or zero")}if(D!=null&&typeof D!=="function"&&typeof D!=="object"){throw new u("connect must be a function or an object")}if(R!=null&&(!Number.isInteger(R)||R<0)){throw new u("maxRedirections must be a positive number")}if(S!=null&&(!Number.isInteger(S)||S<0)){throw new u("maxRequestsPerClient must be a positive number")}if(F!=null&&(typeof F!=="string"||s.isIP(F)===0)){throw new u("localAddress must be valid string IP address")}if(T!=null&&(!Number.isInteger(T)||T<-1)){throw new u("maxResponseSize must be a positive number")}if(v!=null&&(!Number.isInteger(v)||v<-1)){throw new u("autoSelectFamilyAttemptTimeout must be a positive number")}if(L!=null&&typeof L!=="boolean"){throw new u("allowH2 must be a valid boolean value")}if(G!=null&&(typeof G!=="number"||G<1)){throw new u("maxConcurrentStreams must be a possitive integer, greater than 0")}if(typeof D!=="function"){D=w({...p,maxCachedSessions:y,allowH2:L,socketPath:B,timeout:c,...i.nodeHasAutoSelectFamily&&N?{autoSelectFamily:N,autoSelectFamilyAttemptTimeout:v}:undefined,...D})}this[ge]=A&&A.Client&&Array.isArray(A.Client)?A.Client:[Ue({maxRedirections:R})];this[b]=i.parseOrigin(e);this[re]=D;this[K]=null;this[j]=I!=null?I:1;this[X]=t||o.maxHeaderSize;this[J]=h==null?4e3:h;this[z]=C==null?6e5:C;this[$]=d==null?1e3:d;this[Z]=this[J];this[k]=null;this[le]=F!=null?F:null;this[U]=0;this[H]=0;this[x]=`host: ${this[b].hostname}${this[b].port?`:${this[b].port}`:""}\r\n`;this[Ae]=g!=null?g:3e5;this[ee]=r!=null?r:3e5;this[te]=m==null?true:m;this[se]=R;this[oe]=S;this[Fe]=null;this[Ee]=T>-1?T:-1;this[ue]="h1";this[Qe]=null;this[Ce]=!L?null:{openStreams:0,maxConcurrentStreams:G!=null?G:100};this[he]=`${this[b].hostname}${this[b].port?`:${this[b].port}`:""}`;this[_]=[];this[q]=0;this[V]=0}get pipelining(){return this[j]}set pipelining(e){this[j]=e;resume(this,true)}get[L](){return this[_].length-this[V]}get[v](){return this[V]-this[q]}get[G](){return this[_].length-this[q]}get[O](){return!!this[K]&&!this[P]&&!this[K].destroyed}get[S](){const e=this[K];return e&&(e[R]||e[M]||e[N])||this[G]>=(this[j]||1)||this[L]>0}[T](e){connect(this);this.once("connect",e)}[ce](e,A){const t=e.origin||this[b].origin;const r=this[ue]==="h2"?c[de](t,e,A):c[Ie](t,e,A);this[_].push(r);if(this[U]){}else if(i.bodyLength(r.body)==null&&i.isIterable(r.body)){this[U]=1;process.nextTick(resume,this)}else{resume(this,true)}if(this[U]&&this[H]!==2&&this[S]){this[H]=2}return this[H]<2}async[ie](){return new Promise((e=>{if(!this[G]){e(null)}else{this[Fe]=e}}))}async[ae](e){return new Promise((A=>{const t=this[_].splice(this[V]);for(let A=0;A{if(this[Fe]){this[Fe]();this[Fe]=null}A()};if(this[Qe]!=null){i.destroy(this[Qe],e);this[Qe]=null;this[Ce]=null}if(!this[K]){queueMicrotask(callback)}else{i.destroy(this[K].on("close",callback),e)}resume(this)}))}}function onHttp2SessionError(e){r(e.code!=="ERR_TLS_CERT_ALTNAME_INVALID");this[K][W]=e;onError(this[D],e)}function onHttp2FrameError(e,A,t){const r=new B(`HTTP/2: "frameError" received - type ${e}, code ${A}`);if(t===0){this[K][W]=r;onError(this[D],r)}}function onHttp2SessionEnd(){i.destroy(this,new d("other side closed"));i.destroy(this[K],new d("other side closed"))}function onHTTP2GoAway(e){const A=this[D];const t=new B(`HTTP/2: "GOAWAY" frame received with code ${e}`);A[K]=null;A[Qe]=null;if(A.destroyed){r(this[L]===0);const e=A[_].splice(A[q]);for(let A=0;A0){const e=A[_][A[q]];A[_][A[q]++]=null;errorRequest(A,e,t)}A[V]=A[q];r(A[v]===0);A.emit("disconnect",A[b],[A],t);resume(A)}const Ne=t(2824);const Ue=t(4415);const ve=Buffer.alloc(0);async function lazyllhttp(){const e=process.env.JEST_WORKER_ID?t(3870):undefined;let A;try{A=await WebAssembly.compile(Buffer.from(t(3434),"base64"))}catch(r){A=await WebAssembly.compile(Buffer.from(e||t(3870),"base64"))}return await WebAssembly.instantiate(A,{env:{wasm_on_url:(e,A,t)=>0,wasm_on_status:(e,A,t)=>{r.strictEqual(Me.ptr,e);const s=A-Pe+_e.byteOffset;return Me.onStatus(new Se(_e.buffer,s,t))||0},wasm_on_message_begin:e=>{r.strictEqual(Me.ptr,e);return Me.onMessageBegin()||0},wasm_on_header_field:(e,A,t)=>{r.strictEqual(Me.ptr,e);const s=A-Pe+_e.byteOffset;return Me.onHeaderField(new Se(_e.buffer,s,t))||0},wasm_on_header_value:(e,A,t)=>{r.strictEqual(Me.ptr,e);const s=A-Pe+_e.byteOffset;return Me.onHeaderValue(new Se(_e.buffer,s,t))||0},wasm_on_headers_complete:(e,A,t,s)=>{r.strictEqual(Me.ptr,e);return Me.onHeadersComplete(A,Boolean(t),Boolean(s))||0},wasm_on_body:(e,A,t)=>{r.strictEqual(Me.ptr,e);const s=A-Pe+_e.byteOffset;return Me.onBody(new Se(_e.buffer,s,t))||0},wasm_on_message_complete:e=>{r.strictEqual(Me.ptr,e);return Me.onMessageComplete()||0}}})}let Le=null;let Ge=lazyllhttp();Ge.catch();let Me=null;let _e=null;let Oe=0;let Pe=null;const He=1;const Ye=2;const Je=3;class Parser{constructor(e,A,{exports:t}){r(Number.isFinite(e[X])&&e[X]>0);this.llhttp=t;this.ptr=this.llhttp.llhttp_alloc(Ne.TYPE.RESPONSE);this.client=e;this.socket=A;this.timeout=null;this.timeoutValue=null;this.timeoutType=null;this.statusCode=null;this.statusText="";this.upgrade=false;this.headers=[];this.headersSize=0;this.headersMaxSize=e[X];this.shouldKeepAlive=false;this.paused=false;this.resume=this.resume.bind(this);this.bytesRead=0;this.keepAlive="";this.contentLength="";this.connection="";this.maxResponseSize=e[Ee]}setTimeout(e,A){this.timeoutType=A;if(e!==this.timeoutValue){a.clearTimeout(this.timeout);if(e){this.timeout=a.setTimeout(onParserTimeout,e,this);if(this.timeout.unref){this.timeout.unref()}}else{this.timeout=null}this.timeoutValue=e}else if(this.timeout){if(this.timeout.refresh){this.timeout.refresh()}}}resume(){if(this.socket.destroyed||!this.paused){return}r(this.ptr!=null);r(Me==null);this.llhttp.llhttp_resume(this.ptr);r(this.timeoutType===Ye);if(this.timeout){if(this.timeout.refresh){this.timeout.refresh()}}this.paused=false;this.execute(this.socket.read()||ve);this.readMore()}readMore(){while(!this.paused&&this.ptr){const e=this.socket.read();if(e===null){break}this.execute(e)}}execute(e){r(this.ptr!=null);r(Me==null);r(!this.paused);const{socket:A,llhttp:t}=this;if(e.length>Oe){if(Pe){t.free(Pe)}Oe=Math.ceil(e.length/4096)*4096;Pe=t.malloc(Oe)}new Uint8Array(t.memory.buffer,Pe,Oe).set(e);try{let r;try{_e=e;Me=this;r=t.llhttp_execute(this.ptr,Pe,e.length)}catch(e){throw e}finally{Me=null;_e=null}const s=t.llhttp_get_error_pos(this.ptr)-Pe;if(r===Ne.ERROR.PAUSED_UPGRADE){this.onUpgrade(e.slice(s))}else if(r===Ne.ERROR.PAUSED){this.paused=true;A.unshift(e.slice(s))}else if(r!==Ne.ERROR.OK){const A=t.llhttp_get_error_reason(this.ptr);let o="";if(A){const e=new Uint8Array(t.memory.buffer,A).indexOf(0);o="Response does not match the HTTP/1.1 protocol ("+Buffer.from(t.memory.buffer,A,e).toString()+")"}throw new p(o,Ne.ERROR[r],e.slice(s))}}catch(e){i.destroy(A,e)}}destroy(){r(this.ptr!=null);r(Me==null);this.llhttp.llhttp_free(this.ptr);this.ptr=null;a.clearTimeout(this.timeout);this.timeout=null;this.timeoutValue=null;this.timeoutType=null;this.paused=false}onStatus(e){this.statusText=e.toString()}onMessageBegin(){const{socket:e,client:A}=this;if(e.destroyed){return-1}const t=A[_][A[q]];if(!t){return-1}}onHeaderField(e){const A=this.headers.length;if((A&1)===0){this.headers.push(e)}else{this.headers[A-1]=Buffer.concat([this.headers[A-1],e])}this.trackHeader(e.length)}onHeaderValue(e){let A=this.headers.length;if((A&1)===1){this.headers.push(e);A+=1}else{this.headers[A-1]=Buffer.concat([this.headers[A-1],e])}const t=this.headers[A-2];if(t.length===10&&t.toString().toLowerCase()==="keep-alive"){this.keepAlive+=e.toString()}else if(t.length===10&&t.toString().toLowerCase()==="connection"){this.connection+=e.toString()}else if(t.length===14&&t.toString().toLowerCase()==="content-length"){this.contentLength+=e.toString()}this.trackHeader(e.length)}trackHeader(e){this.headersSize+=e;if(this.headersSize>=this.headersMaxSize){i.destroy(this.socket,new C)}}onUpgrade(e){const{upgrade:A,client:t,socket:s,headers:o,statusCode:n}=this;r(A);const a=t[_][t[q]];r(a);r(!s.destroyed);r(s===t[K]);r(!this.paused);r(a.upgrade||a.method==="CONNECT");this.statusCode=null;this.statusText="";this.shouldKeepAlive=null;r(this.headers.length%2===0);this.headers=[];this.headersSize=0;s.unshift(e);s[F].destroy();s[F]=null;s[D]=null;s[W]=null;s.removeListener("error",onSocketError).removeListener("readable",onSocketReadable).removeListener("end",onSocketEnd).removeListener("close",onSocketClose);t[K]=null;t[_][t[q]++]=null;t.emit("disconnect",t[b],[t],new B("upgrade"));try{a.onUpgrade(n,o,s)}catch(e){i.destroy(s,e)}resume(t)}onHeadersComplete(e,A,t){const{client:s,socket:o,headers:n,statusText:a}=this;if(o.destroyed){return-1}const c=s[_][s[q]];if(!c){return-1}r(!this.upgrade);r(this.statusCode<200);if(e===100){i.destroy(o,new d("bad response",i.getSocketInfo(o)));return-1}if(A&&!c.upgrade){i.destroy(o,new d("bad upgrade",i.getSocketInfo(o)));return-1}r.strictEqual(this.timeoutType,He);this.statusCode=e;this.shouldKeepAlive=t||c.method==="HEAD"&&!o[R]&&this.connection.toLowerCase()==="keep-alive";if(this.statusCode>=200){const e=c.bodyTimeout!=null?c.bodyTimeout:s[Ae];this.setTimeout(e,Ye)}else if(this.timeout){if(this.timeout.refresh){this.timeout.refresh()}}if(c.method==="CONNECT"){r(s[v]===1);this.upgrade=true;return 2}if(A){r(s[v]===1);this.upgrade=true;return 2}r(this.headers.length%2===0);this.headers=[];this.headersSize=0;if(this.shouldKeepAlive&&s[j]){const e=this.keepAlive?i.parseKeepAliveTimeout(this.keepAlive):null;if(e!=null){const A=Math.min(e-s[$],s[z]);if(A<=0){o[R]=true}else{s[Z]=A}}else{s[Z]=s[J]}}else{o[R]=true}const g=c.onHeaders(e,n,this.resume,a)===false;if(c.aborted){return-1}if(c.method==="HEAD"){return 1}if(e<200){return 1}if(o[N]){o[N]=false;resume(s)}return g?Ne.ERROR.PAUSED:0}onBody(e){const{client:A,socket:t,statusCode:s,maxResponseSize:o}=this;if(t.destroyed){return-1}const n=A[_][A[q]];r(n);r.strictEqual(this.timeoutType,Ye);if(this.timeout){if(this.timeout.refresh){this.timeout.refresh()}}r(s>=200);if(o>-1&&this.bytesRead+e.length>o){i.destroy(t,new m);return-1}this.bytesRead+=e.length;if(n.onData(e)===false){return Ne.ERROR.PAUSED}}onMessageComplete(){const{client:e,socket:A,statusCode:t,upgrade:s,headers:o,contentLength:n,bytesRead:a,shouldKeepAlive:c}=this;if(A.destroyed&&(!t||c)){return-1}if(s){return}const g=e[_][e[q]];r(g);r(t>=100);this.statusCode=null;this.statusText="";this.bytesRead=0;this.contentLength="";this.keepAlive="";this.connection="";r(this.headers.length%2===0);this.headers=[];this.headersSize=0;if(t<200){return}if(g.method!=="HEAD"&&n&&a!==parseInt(n,10)){i.destroy(A,new E);return-1}g.onComplete(o);e[_][e[q]++]=null;if(A[M]){r.strictEqual(e[v],0);i.destroy(A,new B("reset"));return Ne.ERROR.PAUSED}else if(!c){i.destroy(A,new B("reset"));return Ne.ERROR.PAUSED}else if(A[R]&&e[v]===0){i.destroy(A,new B("reset"));return Ne.ERROR.PAUSED}else if(e[j]===1){setImmediate(resume,e)}else{resume(e)}}}function onParserTimeout(e){const{socket:A,timeoutType:t,client:s}=e;if(t===He){if(!A[M]||A.writableNeedDrain||s[v]>1){r(!e.paused,"cannot be paused while waiting for headers");i.destroy(A,new Q)}}else if(t===Ye){if(!e.paused){i.destroy(A,new I)}}else if(t===Je){r(s[v]===0&&s[Z]);i.destroy(A,new B("socket idle timeout"))}}function onSocketReadable(){const{[F]:e}=this;if(e){e.readMore()}}function onSocketError(e){const{[D]:A,[F]:t}=this;r(e.code!=="ERR_TLS_CERT_ALTNAME_INVALID");if(A[ue]!=="h2"){if(e.code==="ECONNRESET"&&t.statusCode&&!t.shouldKeepAlive){t.onMessageComplete();return}}this[W]=e;onError(this[D],e)}function onError(e,A){if(e[v]===0&&A.code!=="UND_ERR_INFO"&&A.code!=="UND_ERR_SOCKET"){r(e[V]===e[q]);const t=e[_].splice(e[q]);for(let r=0;r0&&t.code!=="UND_ERR_INFO"){const A=e[_][e[q]];e[_][e[q]++]=null;errorRequest(e,A,t)}e[V]=e[q];r(e[v]===0);e.emit("disconnect",e[b],[e],t);resume(e)}async function connect(e){r(!e[P]);r(!e[K]);let{host:A,hostname:t,protocol:o,port:n}=e[b];if(t[0]==="["){const e=t.indexOf("]");r(e!==-1);const A=t.substring(1,e);r(s.isIP(A));t=A}e[P]=true;if(Te.beforeConnect.hasSubscribers){Te.beforeConnect.publish({connectParams:{host:A,hostname:t,protocol:o,port:n,servername:e[k],localAddress:e[le]},connector:e[re]})}try{const s=await new Promise(((r,s)=>{e[re]({host:A,hostname:t,protocol:o,port:n,servername:e[k],localAddress:e[le]},((e,A)=>{if(e){s(e)}else{r(A)}}))}));if(e.destroyed){i.destroy(s.on("error",(()=>{})),new y);return}e[P]=false;r(s);const a=s.alpnProtocol==="h2";if(a){if(!De){De=true;process.emitWarning("H2 support is experimental, expect them to change at any time.",{code:"UNDICI-H2"})}const A=pe.connect(e[b],{createConnection:()=>s,peerMaxConcurrentStreams:e[Ce].maxConcurrentStreams});e[ue]="h2";A[D]=e;A[K]=s;A.on("error",onHttp2SessionError);A.on("frameError",onHttp2FrameError);A.on("end",onHttp2SessionEnd);A.on("goaway",onHTTP2GoAway);A.on("close",onSocketClose);A.unref();e[Qe]=A;s[Qe]=A}else{if(!Le){Le=await Ge;Ge=null}s[Y]=false;s[M]=false;s[R]=false;s[N]=false;s[F]=new Parser(e,s,Le)}s[ne]=0;s[oe]=e[oe];s[D]=e;s[W]=null;s.on("error",onSocketError).on("readable",onSocketReadable).on("end",onSocketEnd).on("close",onSocketClose);e[K]=s;if(Te.connected.hasSubscribers){Te.connected.publish({connectParams:{host:A,hostname:t,protocol:o,port:n,servername:e[k],localAddress:e[le]},connector:e[re],socket:s})}e.emit("connect",e[b],[e])}catch(s){if(e.destroyed){return}e[P]=false;if(Te.connectError.hasSubscribers){Te.connectError.publish({connectParams:{host:A,hostname:t,protocol:o,port:n,servername:e[k],localAddress:e[le]},connector:e[re],error:s})}if(s.code==="ERR_TLS_CERT_ALTNAME_INVALID"){r(e[v]===0);while(e[L]>0&&e[_][e[V]].servername===e[k]){const A=e[_][e[V]++];errorRequest(e,A,s)}}else{onError(e,s)}e.emit("connectionError",e[b],[e],s)}resume(e)}function emitDrain(e){e[H]=0;e.emit("drain",e[b],[e])}function resume(e,A){if(e[U]===2){return}e[U]=2;_resume(e,A);e[U]=0;if(e[q]>256){e[_].splice(0,e[q]);e[V]-=e[q];e[q]=0}}function _resume(e,A){while(true){if(e.destroyed){r(e[L]===0);return}if(e[Fe]&&!e[G]){e[Fe]();e[Fe]=null;return}const t=e[K];if(t&&!t.destroyed&&t.alpnProtocol!=="h2"){if(e[G]===0){if(!t[Y]&&t.unref){t.unref();t[Y]=true}}else if(t[Y]&&t.ref){t.ref();t[Y]=false}if(e[G]===0){if(t[F].timeoutType!==Je){t[F].setTimeout(e[Z],Je)}}else if(e[v]>0&&t[F].statusCode<200){if(t[F].timeoutType!==He){const A=e[_][e[q]];const r=A.headersTimeout!=null?A.headersTimeout:e[ee];t[F].setTimeout(r,He)}}}if(e[S]){e[H]=2}else if(e[H]===2){if(A){e[H]=1;process.nextTick(emitDrain,e)}else{emitDrain(e)}continue}if(e[L]===0){return}if(e[v]>=(e[j]||1)){return}const s=e[_][e[V]];if(e[b].protocol==="https:"&&e[k]!==s.servername){if(e[v]>0){return}e[k]=s.servername;if(t&&t.servername!==s.servername){i.destroy(t,new B("servername changed"));return}}if(e[P]){return}if(!t&&!e[Qe]){connect(e);return}if(t.destroyed||t[M]||t[R]||t[N]){return}if(e[v]>0&&!s.idempotent){return}if(e[v]>0&&(s.upgrade||s.method==="CONNECT")){return}if(e[v]>0&&i.bodyLength(s.body)!==0&&(i.isStream(s.body)||i.isAsyncIterable(s.body))){return}if(!s.aborted&&write(e,s)){e[V]++}else{e[_].splice(e[V],1)}}}function shouldSendContentLength(e){return e!=="GET"&&e!=="HEAD"&&e!=="OPTIONS"&&e!=="TRACE"&&e!=="CONNECT"}function write(e,A){if(e[ue]==="h2"){writeH2(e,e[Qe],A);return}const{body:t,method:s,path:o,host:n,upgrade:a,headers:c,blocking:g,reset:E}=A;const u=s==="PUT"||s==="POST"||s==="PATCH";if(t&&typeof t.read==="function"){t.read(0)}const Q=i.bodyLength(t);let C=Q;if(C===null){C=A.contentLength}if(C===0&&!u){C=null}if(shouldSendContentLength(s)&&C>0&&A.contentLength!==null&&A.contentLength!==C){if(e[te]){errorRequest(e,A,new l);return false}process.emitWarning(new l)}const d=e[K];try{A.onConnect((t=>{if(A.aborted||A.completed){return}errorRequest(e,A,t||new h);i.destroy(d,new B("aborted"))}))}catch(t){errorRequest(e,A,t)}if(A.aborted){return false}if(s==="HEAD"){d[R]=true}if(a||s==="CONNECT"){d[R]=true}if(E!=null){d[R]=E}if(e[oe]&&d[ne]++>=e[oe]){d[R]=true}if(g){d[N]=true}let I=`${s} ${o} HTTP/1.1\r\n`;if(typeof n==="string"){I+=`host: ${n}\r\n`}else{I+=e[x]}if(a){I+=`connection: upgrade\r\nupgrade: ${a}\r\n`}else if(e[j]&&!d[R]){I+="connection: keep-alive\r\n"}else{I+="connection: close\r\n"}if(c){I+=c}if(Te.sendHeaders.hasSubscribers){Te.sendHeaders.publish({request:A,headers:I,socket:d})}if(!t||Q===0){if(C===0){d.write(`${I}content-length: 0\r\n\r\n`,"latin1")}else{r(C===null,"no body must not have content length");d.write(`${I}\r\n`,"latin1")}A.onRequestSent()}else if(i.isBuffer(t)){r(C===t.byteLength,"buffer body must have content length");d.cork();d.write(`${I}content-length: ${C}\r\n\r\n`,"latin1");d.write(t);d.uncork();A.onBodySent(t);A.onRequestSent();if(!u){d[R]=true}}else if(i.isBlobLike(t)){if(typeof t.stream==="function"){writeIterable({body:t.stream(),client:e,request:A,socket:d,contentLength:C,header:I,expectsPayload:u})}else{writeBlob({body:t,client:e,request:A,socket:d,contentLength:C,header:I,expectsPayload:u})}}else if(i.isStream(t)){writeStream({body:t,client:e,request:A,socket:d,contentLength:C,header:I,expectsPayload:u})}else if(i.isIterable(t)){writeIterable({body:t,client:e,request:A,socket:d,contentLength:C,header:I,expectsPayload:u})}else{r(false)}return true}function writeH2(e,A,t){const{body:s,method:o,path:n,host:a,upgrade:g,expectContinue:E,signal:u,headers:Q}=t;let C;if(typeof Q==="string")C=c[Be](Q.trim());else C=Q;if(g){errorRequest(e,t,new Error("Upgrade not supported for H2"));return false}try{t.onConnect((A=>{if(t.aborted||t.completed){return}errorRequest(e,t,A||new h)}))}catch(A){errorRequest(e,t,A)}if(t.aborted){return false}let d;const I=e[Ce];C[fe]=a||e[he];C[me]=o;if(o==="CONNECT"){A.ref();d=A.request(C,{endStream:false,signal:u});if(d.id&&!d.pending){t.onUpgrade(null,null,d);++I.openStreams}else{d.once("ready",(()=>{t.onUpgrade(null,null,d);++I.openStreams}))}d.once("close",(()=>{I.openStreams-=1;if(I.openStreams===0)A.unref()}));return true}C[ye]=n;C[we]="https";const p=o==="PUT"||o==="POST"||o==="PATCH";if(s&&typeof s.read==="function"){s.read(0)}let m=i.bodyLength(s);if(m==null){m=t.contentLength}if(m===0||!p){m=null}if(shouldSendContentLength(o)&&m>0&&t.contentLength!=null&&t.contentLength!==m){if(e[te]){errorRequest(e,t,new l);return false}process.emitWarning(new l)}if(m!=null){r(s,"no body must not have content length");C[be]=`${m}`}A.ref();const y=o==="GET"||o==="HEAD";if(E){C[Re]="100-continue";d=A.request(C,{endStream:y,signal:u});d.once("continue",writeBodyH2)}else{d=A.request(C,{endStream:y,signal:u});writeBodyH2()}++I.openStreams;d.once("response",(e=>{const{[ke]:A,...r}=e;if(t.onHeaders(Number(A),r,d.resume.bind(d),"")===false){d.pause()}}));d.once("end",(()=>{t.onComplete([])}));d.on("data",(e=>{if(t.onData(e)===false){d.pause()}}));d.once("close",(()=>{I.openStreams-=1;if(I.openStreams===0){A.unref()}}));d.once("error",(function(A){if(e[Qe]&&!e[Qe].destroyed&&!this.closed&&!this.destroyed){I.streams-=1;i.destroy(d,A)}}));d.once("frameError",((A,r)=>{const s=new B(`HTTP/2: "frameError" received - type ${A}, code ${r}`);errorRequest(e,t,s);if(e[Qe]&&!e[Qe].destroyed&&!this.closed&&!this.destroyed){I.streams-=1;i.destroy(d,s)}}));return true;function writeBodyH2(){if(!s){t.onRequestSent()}else if(i.isBuffer(s)){r(m===s.byteLength,"buffer body must have content length");d.cork();d.write(s);d.uncork();d.end();t.onBodySent(s);t.onRequestSent()}else if(i.isBlobLike(s)){if(typeof s.stream==="function"){writeIterable({client:e,request:t,contentLength:m,h2stream:d,expectsPayload:p,body:s.stream(),socket:e[K],header:""})}else{writeBlob({body:s,client:e,request:t,contentLength:m,expectsPayload:p,h2stream:d,header:"",socket:e[K]})}}else if(i.isStream(s)){writeStream({body:s,client:e,request:t,contentLength:m,expectsPayload:p,socket:e[K],h2stream:d,header:""})}else if(i.isIterable(s)){writeIterable({body:s,client:e,request:t,contentLength:m,expectsPayload:p,header:"",h2stream:d,socket:e[K]})}else{r(false)}}}function writeStream({h2stream:e,body:A,client:t,request:s,socket:o,contentLength:a,header:c,expectsPayload:g}){r(a!==0||t[v]===0,"stream body cannot be pipelined");if(t[ue]==="h2"){const u=n(A,e,(t=>{if(t){i.destroy(A,t);i.destroy(e,t)}else{s.onRequestSent()}}));u.on("data",onPipeData);u.once("end",(()=>{u.removeListener("data",onPipeData);i.destroy(u)}));function onPipeData(e){s.onBodySent(e)}return}let l=false;const E=new AsyncWriter({socket:o,request:s,contentLength:a,client:t,expectsPayload:g,header:c});const onData=function(e){if(l){return}try{if(!E.write(e)&&this.pause){this.pause()}}catch(e){i.destroy(this,e)}};const onDrain=function(){if(l){return}if(A.resume){A.resume()}};const onAbort=function(){if(l){return}const e=new h;queueMicrotask((()=>onFinished(e)))};const onFinished=function(e){if(l){return}l=true;r(o.destroyed||o[M]&&t[v]<=1);o.off("drain",onDrain).off("error",onFinished);A.removeListener("data",onData).removeListener("end",onFinished).removeListener("error",onFinished).removeListener("close",onAbort);if(!e){try{E.end()}catch(A){e=A}}E.destroy(e);if(e&&(e.code!=="UND_ERR_INFO"||e.message!=="reset")){i.destroy(A,e)}else{i.destroy(A)}};A.on("data",onData).on("end",onFinished).on("error",onFinished).on("close",onAbort);if(A.resume){A.resume()}o.on("drain",onDrain).on("error",onFinished)}async function writeBlob({h2stream:e,body:A,client:t,request:s,socket:o,contentLength:n,header:a,expectsPayload:c}){r(n===A.size,"blob body must have content length");const g=t[ue]==="h2";try{if(n!=null&&n!==A.size){throw new l}const r=Buffer.from(await A.arrayBuffer());if(g){e.cork();e.write(r);e.uncork()}else{o.cork();o.write(`${a}content-length: ${n}\r\n\r\n`,"latin1");o.write(r);o.uncork()}s.onBodySent(r);s.onRequestSent();if(!c){o[R]=true}resume(t)}catch(A){i.destroy(g?e:o,A)}}async function writeIterable({h2stream:e,body:A,client:t,request:s,socket:o,contentLength:n,header:i,expectsPayload:a}){r(n!==0||t[v]===0,"iterator body cannot be pipelined");let c=null;function onDrain(){if(c){const e=c;c=null;e()}}const waitForDrain=()=>new Promise(((e,A)=>{r(c===null);if(o[W]){A(o[W])}else{c=e}}));if(t[ue]==="h2"){e.on("close",onDrain).on("drain",onDrain);try{for await(const t of A){if(o[W]){throw o[W]}const A=e.write(t);s.onBodySent(t);if(!A){await waitForDrain()}}}catch(A){e.destroy(A)}finally{s.onRequestSent();e.end();e.off("close",onDrain).off("drain",onDrain)}return}o.on("close",onDrain).on("drain",onDrain);const g=new AsyncWriter({socket:o,request:s,contentLength:n,client:t,expectsPayload:a,header:i});try{for await(const e of A){if(o[W]){throw o[W]}if(!g.write(e)){await waitForDrain()}}g.end()}catch(e){g.destroy(e)}finally{o.off("close",onDrain).off("drain",onDrain)}}class AsyncWriter{constructor({socket:e,request:A,contentLength:t,client:r,expectsPayload:s,header:o}){this.socket=e;this.request=A;this.contentLength=t;this.client=r;this.bytesWritten=0;this.expectsPayload=s;this.header=o;e[M]=true}write(e){const{socket:A,request:t,contentLength:r,client:s,bytesWritten:o,expectsPayload:n,header:i}=this;if(A[W]){throw A[W]}if(A.destroyed){return false}const a=Buffer.byteLength(e);if(!a){return true}if(r!==null&&o+a>r){if(s[te]){throw new l}process.emitWarning(new l)}A.cork();if(o===0){if(!n){A[R]=true}if(r===null){A.write(`${i}transfer-encoding: chunked\r\n`,"latin1")}else{A.write(`${i}content-length: ${r}\r\n\r\n`,"latin1")}}if(r===null){A.write(`\r\n${a.toString(16)}\r\n`,"latin1")}this.bytesWritten+=a;const c=A.write(e);A.uncork();t.onBodySent(e);if(!c){if(A[F].timeout&&A[F].timeoutType===He){if(A[F].timeout.refresh){A[F].timeout.refresh()}}}return c}end(){const{socket:e,contentLength:A,client:t,bytesWritten:r,expectsPayload:s,header:o,request:n}=this;n.onRequestSent();e[M]=false;if(e[W]){throw e[W]}if(e.destroyed){return}if(r===0){if(s){e.write(`${o}content-length: 0\r\n\r\n`,"latin1")}else{e.write(`${o}\r\n`,"latin1")}}else if(A===null){e.write("\r\n0\r\n\r\n","latin1")}if(A!==null&&r!==A){if(t[te]){throw new l}else{process.emitWarning(new l)}}if(e[F].timeout&&e[F].timeoutType===He){if(e[F].timeout.refresh){e[F].timeout.refresh()}}resume(t)}destroy(e){const{socket:A,client:t}=this;A[M]=false;if(e){r(t[v]<=1,"pipeline should only contain this request");i.destroy(A,e)}}}function errorRequest(e,A,t){try{A.onError(t);r(A.aborted)}catch(t){e.emit("error",t)}}e.exports=Client},3194:(e,A,t)=>{"use strict";const{kConnected:r,kSize:s}=t(6443);class CompatWeakRef{constructor(e){this.value=e}deref(){return this.value[r]===0&&this.value[s]===0?undefined:this.value}}class CompatFinalizer{constructor(e){this.finalizer=e}register(e,A){if(e.on){e.on("disconnect",(()=>{if(e[r]===0&&e[s]===0){this.finalizer(A)}}))}}}e.exports=function(){if(process.env.NODE_V8_COVERAGE){return{WeakRef:CompatWeakRef,FinalizationRegistry:CompatFinalizer}}return{WeakRef:global.WeakRef||CompatWeakRef,FinalizationRegistry:global.FinalizationRegistry||CompatFinalizer}}},9237:e=>{"use strict";const A=1024;const t=4096;e.exports={maxAttributeValueSize:A,maxNameValuePairSize:t}},3168:(e,A,t)=>{"use strict";const{parseSetCookie:r}=t(8915);const{stringify:s,getHeadersList:o}=t(3834);const{webidl:n}=t(4222);const{Headers:i}=t(6349);function getCookies(e){n.argumentLengthCheck(arguments,1,{header:"getCookies"});n.brandCheck(e,i,{strict:false});const A=e.get("cookie");const t={};if(!A){return t}for(const e of A.split(";")){const[A,...r]=e.split("=");t[A.trim()]=r.join("=")}return t}function deleteCookie(e,A,t){n.argumentLengthCheck(arguments,2,{header:"deleteCookie"});n.brandCheck(e,i,{strict:false});A=n.converters.DOMString(A);t=n.converters.DeleteCookieAttributes(t);setCookie(e,{name:A,value:"",expires:new Date(0),...t})}function getSetCookies(e){n.argumentLengthCheck(arguments,1,{header:"getSetCookies"});n.brandCheck(e,i,{strict:false});const A=o(e).cookies;if(!A){return[]}return A.map((e=>r(Array.isArray(e)?e[1]:e)))}function setCookie(e,A){n.argumentLengthCheck(arguments,2,{header:"setCookie"});n.brandCheck(e,i,{strict:false});A=n.converters.Cookie(A);const t=s(A);if(t){e.append("Set-Cookie",s(A))}}n.converters.DeleteCookieAttributes=n.dictionaryConverter([{converter:n.nullableConverter(n.converters.DOMString),key:"path",defaultValue:null},{converter:n.nullableConverter(n.converters.DOMString),key:"domain",defaultValue:null}]);n.converters.Cookie=n.dictionaryConverter([{converter:n.converters.DOMString,key:"name"},{converter:n.converters.DOMString,key:"value"},{converter:n.nullableConverter((e=>{if(typeof e==="number"){return n.converters["unsigned long long"](e)}return new Date(e)})),key:"expires",defaultValue:null},{converter:n.nullableConverter(n.converters["long long"]),key:"maxAge",defaultValue:null},{converter:n.nullableConverter(n.converters.DOMString),key:"domain",defaultValue:null},{converter:n.nullableConverter(n.converters.DOMString),key:"path",defaultValue:null},{converter:n.nullableConverter(n.converters.boolean),key:"secure",defaultValue:null},{converter:n.nullableConverter(n.converters.boolean),key:"httpOnly",defaultValue:null},{converter:n.converters.USVString,key:"sameSite",allowedValues:["Strict","Lax","None"]},{converter:n.sequenceConverter(n.converters.DOMString),key:"unparsed",defaultValue:[]}]);e.exports={getCookies:getCookies,deleteCookie:deleteCookie,getSetCookies:getSetCookies,setCookie:setCookie}},8915:(e,A,t)=>{"use strict";const{maxNameValuePairSize:r,maxAttributeValueSize:s}=t(9237);const{isCTLExcludingHtab:o}=t(3834);const{collectASequenceOfCodePointsFast:n}=t(4322);const i=t(2613);function parseSetCookie(e){if(o(e)){return null}let A="";let t="";let s="";let i="";if(e.includes(";")){const r={position:0};A=n(";",e,r);t=e.slice(r.position)}else{A=e}if(!A.includes("=")){i=A}else{const e={position:0};s=n("=",A,e);i=A.slice(e.position+1)}s=s.trim();i=i.trim();if(s.length+i.length>r){return null}return{name:s,value:i,...parseUnparsedAttributes(t)}}function parseUnparsedAttributes(e,A={}){if(e.length===0){return A}i(e[0]===";");e=e.slice(1);let t="";if(e.includes(";")){t=n(";",e,{position:0});e=e.slice(t.length)}else{t=e;e=""}let r="";let o="";if(t.includes("=")){const e={position:0};r=n("=",t,e);o=t.slice(e.position+1)}else{r=t}r=r.trim();o=o.trim();if(o.length>s){return parseUnparsedAttributes(e,A)}const a=r.toLowerCase();if(a==="expires"){const e=new Date(o);A.expires=e}else if(a==="max-age"){const t=o.charCodeAt(0);if((t<48||t>57)&&o[0]!=="-"){return parseUnparsedAttributes(e,A)}if(!/^\d+$/.test(o)){return parseUnparsedAttributes(e,A)}const r=Number(o);A.maxAge=r}else if(a==="domain"){let e=o;if(e[0]==="."){e=e.slice(1)}e=e.toLowerCase();A.domain=e}else if(a==="path"){let e="";if(o.length===0||o[0]!=="/"){e="/"}else{e=o}A.path=e}else if(a==="secure"){A.secure=true}else if(a==="httponly"){A.httpOnly=true}else if(a==="samesite"){let e="Default";const t=o.toLowerCase();if(t.includes("none")){e="None"}if(t.includes("strict")){e="Strict"}if(t.includes("lax")){e="Lax"}A.sameSite=e}else{A.unparsed??=[];A.unparsed.push(`${r}=${o}`)}return parseUnparsedAttributes(e,A)}e.exports={parseSetCookie:parseSetCookie,parseUnparsedAttributes:parseUnparsedAttributes}},3834:(e,A,t)=>{"use strict";const r=t(2613);const{kHeadersList:s}=t(6443);function isCTLExcludingHtab(e){if(e.length===0){return false}for(const A of e){const e=A.charCodeAt(0);if(e>=0||e<=8||(e>=10||e<=31)||e===127){return false}}}function validateCookieName(e){for(const A of e){const e=A.charCodeAt(0);if(e<=32||e>127||A==="("||A===")"||A===">"||A==="<"||A==="@"||A===","||A===";"||A===":"||A==="\\"||A==='"'||A==="/"||A==="["||A==="]"||A==="?"||A==="="||A==="{"||A==="}"){throw new Error("Invalid cookie name")}}}function validateCookieValue(e){for(const A of e){const e=A.charCodeAt(0);if(e<33||e===34||e===44||e===59||e===92||e>126){throw new Error("Invalid header value")}}}function validateCookiePath(e){for(const A of e){const e=A.charCodeAt(0);if(e<33||A===";"){throw new Error("Invalid cookie path")}}}function validateCookieDomain(e){if(e.startsWith("-")||e.endsWith(".")||e.endsWith("-")){throw new Error("Invalid cookie domain")}}function toIMFDate(e){if(typeof e==="number"){e=new Date(e)}const A=["Sun","Mon","Tue","Wed","Thu","Fri","Sat"];const t=["Jan","Feb","Mar","Apr","May","Jun","Jul","Aug","Sep","Oct","Nov","Dec"];const r=A[e.getUTCDay()];const s=e.getUTCDate().toString().padStart(2,"0");const o=t[e.getUTCMonth()];const n=e.getUTCFullYear();const i=e.getUTCHours().toString().padStart(2,"0");const a=e.getUTCMinutes().toString().padStart(2,"0");const c=e.getUTCSeconds().toString().padStart(2,"0");return`${r}, ${s} ${o} ${n} ${i}:${a}:${c} GMT`}function validateCookieMaxAge(e){if(e<0){throw new Error("Invalid cookie max-age")}}function stringify(e){if(e.name.length===0){return null}validateCookieName(e.name);validateCookieValue(e.value);const A=[`${e.name}=${e.value}`];if(e.name.startsWith("__Secure-")){e.secure=true}if(e.name.startsWith("__Host-")){e.secure=true;e.domain=null;e.path="/"}if(e.secure){A.push("Secure")}if(e.httpOnly){A.push("HttpOnly")}if(typeof e.maxAge==="number"){validateCookieMaxAge(e.maxAge);A.push(`Max-Age=${e.maxAge}`)}if(e.domain){validateCookieDomain(e.domain);A.push(`Domain=${e.domain}`)}if(e.path){validateCookiePath(e.path);A.push(`Path=${e.path}`)}if(e.expires&&e.expires.toString()!=="Invalid Date"){A.push(`Expires=${toIMFDate(e.expires)}`)}if(e.sameSite){A.push(`SameSite=${e.sameSite}`)}for(const t of e.unparsed){if(!t.includes("=")){throw new Error("Invalid unparsed")}const[e,...r]=t.split("=");A.push(`${e.trim()}=${r.join("=")}`)}return A.join("; ")}let o;function getHeadersList(e){if(e[s]){return e[s]}if(!o){o=Object.getOwnPropertySymbols(e).find((e=>e.description==="headers list"));r(o,"Headers cannot be parsed")}const A=e[o];r(A);return A}e.exports={isCTLExcludingHtab:isCTLExcludingHtab,stringify:stringify,getHeadersList:getHeadersList}},9136:(e,A,t)=>{"use strict";const r=t(9278);const s=t(2613);const o=t(3440);const{InvalidArgumentError:n,ConnectTimeoutError:i}=t(8707);let a;let c;if(global.FinalizationRegistry&&!process.env.NODE_V8_COVERAGE){c=class WeakSessionCache{constructor(e){this._maxCachedSessions=e;this._sessionCache=new Map;this._sessionRegistry=new global.FinalizationRegistry((e=>{if(this._sessionCache.size=this._maxCachedSessions){const{value:e}=this._sessionCache.keys().next();this._sessionCache.delete(e)}this._sessionCache.set(e,A)}}}function buildConnector({allowH2:e,maxCachedSessions:A,socketPath:i,timeout:g,...l}){if(A!=null&&(!Number.isInteger(A)||A<0)){throw new n("maxCachedSessions must be a positive integer or zero")}const E={path:i,...l};const u=new c(A==null?100:A);g=g==null?1e4:g;e=e!=null?e:false;return function connect({hostname:A,host:n,protocol:i,port:c,servername:l,localAddress:h,httpSocket:Q},C){let d;if(i==="https:"){if(!a){a=t(4756)}l=l||E.servername||o.getServerName(n)||null;const r=l||A;const i=u.get(r)||null;s(r);d=a.connect({highWaterMark:16384,...E,servername:l,session:i,localAddress:h,ALPNProtocols:e?["http/1.1","h2"]:["http/1.1"],socket:Q,port:c||443,host:A});d.on("session",(function(e){u.set(r,e)}))}else{s(!Q,"httpSocket can only be sent on TLS update");d=r.connect({highWaterMark:64*1024,...E,localAddress:h,port:c||80,host:A})}if(E.keepAlive==null||E.keepAlive){const e=E.keepAliveInitialDelay===undefined?6e4:E.keepAliveInitialDelay;d.setKeepAlive(true,e)}const B=setupTimeout((()=>onConnectTimeout(d)),g);d.setNoDelay(true).once(i==="https:"?"secureConnect":"connect",(function(){B();if(C){const e=C;C=null;e(null,this)}})).on("error",(function(e){B();if(C){const A=C;C=null;A(e)}}));return d}}function setupTimeout(e,A){if(!A){return()=>{}}let t=null;let r=null;const s=setTimeout((()=>{t=setImmediate((()=>{if(process.platform==="win32"){r=setImmediate((()=>e()))}else{e()}}))}),A);return()=>{clearTimeout(s);clearImmediate(t);clearImmediate(r)}}function onConnectTimeout(e){o.destroy(e,new i)}e.exports=buildConnector},735:e=>{"use strict";const A={};const t=["Accept","Accept-Encoding","Accept-Language","Accept-Ranges","Access-Control-Allow-Credentials","Access-Control-Allow-Headers","Access-Control-Allow-Methods","Access-Control-Allow-Origin","Access-Control-Expose-Headers","Access-Control-Max-Age","Access-Control-Request-Headers","Access-Control-Request-Method","Age","Allow","Alt-Svc","Alt-Used","Authorization","Cache-Control","Clear-Site-Data","Connection","Content-Disposition","Content-Encoding","Content-Language","Content-Length","Content-Location","Content-Range","Content-Security-Policy","Content-Security-Policy-Report-Only","Content-Type","Cookie","Cross-Origin-Embedder-Policy","Cross-Origin-Opener-Policy","Cross-Origin-Resource-Policy","Date","Device-Memory","Downlink","ECT","ETag","Expect","Expect-CT","Expires","Forwarded","From","Host","If-Match","If-Modified-Since","If-None-Match","If-Range","If-Unmodified-Since","Keep-Alive","Last-Modified","Link","Location","Max-Forwards","Origin","Permissions-Policy","Pragma","Proxy-Authenticate","Proxy-Authorization","RTT","Range","Referer","Referrer-Policy","Refresh","Retry-After","Sec-WebSocket-Accept","Sec-WebSocket-Extensions","Sec-WebSocket-Key","Sec-WebSocket-Protocol","Sec-WebSocket-Version","Server","Server-Timing","Service-Worker-Allowed","Service-Worker-Navigation-Preload","Set-Cookie","SourceMap","Strict-Transport-Security","Supports-Loading-Mode","TE","Timing-Allow-Origin","Trailer","Transfer-Encoding","Upgrade","Upgrade-Insecure-Requests","User-Agent","Vary","Via","WWW-Authenticate","X-Content-Type-Options","X-DNS-Prefetch-Control","X-Frame-Options","X-Permitted-Cross-Domain-Policies","X-Powered-By","X-Requested-With","X-XSS-Protection"];for(let e=0;e{"use strict";class UndiciError extends Error{constructor(e){super(e);this.name="UndiciError";this.code="UND_ERR"}}class ConnectTimeoutError extends UndiciError{constructor(e){super(e);Error.captureStackTrace(this,ConnectTimeoutError);this.name="ConnectTimeoutError";this.message=e||"Connect Timeout Error";this.code="UND_ERR_CONNECT_TIMEOUT"}}class HeadersTimeoutError extends UndiciError{constructor(e){super(e);Error.captureStackTrace(this,HeadersTimeoutError);this.name="HeadersTimeoutError";this.message=e||"Headers Timeout Error";this.code="UND_ERR_HEADERS_TIMEOUT"}}class HeadersOverflowError extends UndiciError{constructor(e){super(e);Error.captureStackTrace(this,HeadersOverflowError);this.name="HeadersOverflowError";this.message=e||"Headers Overflow Error";this.code="UND_ERR_HEADERS_OVERFLOW"}}class BodyTimeoutError extends UndiciError{constructor(e){super(e);Error.captureStackTrace(this,BodyTimeoutError);this.name="BodyTimeoutError";this.message=e||"Body Timeout Error";this.code="UND_ERR_BODY_TIMEOUT"}}class ResponseStatusCodeError extends UndiciError{constructor(e,A,t,r){super(e);Error.captureStackTrace(this,ResponseStatusCodeError);this.name="ResponseStatusCodeError";this.message=e||"Response Status Code Error";this.code="UND_ERR_RESPONSE_STATUS_CODE";this.body=r;this.status=A;this.statusCode=A;this.headers=t}}class InvalidArgumentError extends UndiciError{constructor(e){super(e);Error.captureStackTrace(this,InvalidArgumentError);this.name="InvalidArgumentError";this.message=e||"Invalid Argument Error";this.code="UND_ERR_INVALID_ARG"}}class InvalidReturnValueError extends UndiciError{constructor(e){super(e);Error.captureStackTrace(this,InvalidReturnValueError);this.name="InvalidReturnValueError";this.message=e||"Invalid Return Value Error";this.code="UND_ERR_INVALID_RETURN_VALUE"}}class RequestAbortedError extends UndiciError{constructor(e){super(e);Error.captureStackTrace(this,RequestAbortedError);this.name="AbortError";this.message=e||"Request aborted";this.code="UND_ERR_ABORTED"}}class InformationalError extends UndiciError{constructor(e){super(e);Error.captureStackTrace(this,InformationalError);this.name="InformationalError";this.message=e||"Request information";this.code="UND_ERR_INFO"}}class RequestContentLengthMismatchError extends UndiciError{constructor(e){super(e);Error.captureStackTrace(this,RequestContentLengthMismatchError);this.name="RequestContentLengthMismatchError";this.message=e||"Request body length does not match content-length header";this.code="UND_ERR_REQ_CONTENT_LENGTH_MISMATCH"}}class ResponseContentLengthMismatchError extends UndiciError{constructor(e){super(e);Error.captureStackTrace(this,ResponseContentLengthMismatchError);this.name="ResponseContentLengthMismatchError";this.message=e||"Response body length does not match content-length header";this.code="UND_ERR_RES_CONTENT_LENGTH_MISMATCH"}}class ClientDestroyedError extends UndiciError{constructor(e){super(e);Error.captureStackTrace(this,ClientDestroyedError);this.name="ClientDestroyedError";this.message=e||"The client is destroyed";this.code="UND_ERR_DESTROYED"}}class ClientClosedError extends UndiciError{constructor(e){super(e);Error.captureStackTrace(this,ClientClosedError);this.name="ClientClosedError";this.message=e||"The client is closed";this.code="UND_ERR_CLOSED"}}class SocketError extends UndiciError{constructor(e,A){super(e);Error.captureStackTrace(this,SocketError);this.name="SocketError";this.message=e||"Socket error";this.code="UND_ERR_SOCKET";this.socket=A}}class NotSupportedError extends UndiciError{constructor(e){super(e);Error.captureStackTrace(this,NotSupportedError);this.name="NotSupportedError";this.message=e||"Not supported error";this.code="UND_ERR_NOT_SUPPORTED"}}class BalancedPoolMissingUpstreamError extends UndiciError{constructor(e){super(e);Error.captureStackTrace(this,NotSupportedError);this.name="MissingUpstreamError";this.message=e||"No upstream has been added to the BalancedPool";this.code="UND_ERR_BPL_MISSING_UPSTREAM"}}class HTTPParserError extends Error{constructor(e,A,t){super(e);Error.captureStackTrace(this,HTTPParserError);this.name="HTTPParserError";this.code=A?`HPE_${A}`:undefined;this.data=t?t.toString():undefined}}class ResponseExceededMaxSizeError extends UndiciError{constructor(e){super(e);Error.captureStackTrace(this,ResponseExceededMaxSizeError);this.name="ResponseExceededMaxSizeError";this.message=e||"Response content exceeded max size";this.code="UND_ERR_RES_EXCEEDED_MAX_SIZE"}}class RequestRetryError extends UndiciError{constructor(e,A,{headers:t,data:r}){super(e);Error.captureStackTrace(this,RequestRetryError);this.name="RequestRetryError";this.message=e||"Request retry error";this.code="UND_ERR_REQ_RETRY";this.statusCode=A;this.data=r;this.headers=t}}e.exports={HTTPParserError:HTTPParserError,UndiciError:UndiciError,HeadersTimeoutError:HeadersTimeoutError,HeadersOverflowError:HeadersOverflowError,BodyTimeoutError:BodyTimeoutError,RequestContentLengthMismatchError:RequestContentLengthMismatchError,ConnectTimeoutError:ConnectTimeoutError,ResponseStatusCodeError:ResponseStatusCodeError,InvalidArgumentError:InvalidArgumentError,InvalidReturnValueError:InvalidReturnValueError,RequestAbortedError:RequestAbortedError,ClientDestroyedError:ClientDestroyedError,ClientClosedError:ClientClosedError,InformationalError:InformationalError,SocketError:SocketError,NotSupportedError:NotSupportedError,ResponseContentLengthMismatchError:ResponseContentLengthMismatchError,BalancedPoolMissingUpstreamError:BalancedPoolMissingUpstreamError,ResponseExceededMaxSizeError:ResponseExceededMaxSizeError,RequestRetryError:RequestRetryError}},4655:(e,A,t)=>{"use strict";const{InvalidArgumentError:r,NotSupportedError:s}=t(8707);const o=t(2613);const{kHTTP2BuildRequest:n,kHTTP2CopyHeaders:i,kHTTP1BuildRequest:a}=t(6443);const c=t(3440);const g=/^[\^_`a-zA-Z\-0-9!#$%&'*+.|~]+$/;const l=/[^\t\x20-\x7e\x80-\xff]/;const E=/[^\u0021-\u00ff]/;const u=Symbol("handler");const h={};let Q;try{const e=t(1637);h.create=e.channel("undici:request:create");h.bodySent=e.channel("undici:request:bodySent");h.headers=e.channel("undici:request:headers");h.trailers=e.channel("undici:request:trailers");h.error=e.channel("undici:request:error")}catch{h.create={hasSubscribers:false};h.bodySent={hasSubscribers:false};h.headers={hasSubscribers:false};h.trailers={hasSubscribers:false};h.error={hasSubscribers:false}}class Request{constructor(e,{path:A,method:s,body:o,headers:n,query:i,idempotent:a,blocking:l,upgrade:C,headersTimeout:d,bodyTimeout:B,reset:I,throwOnError:p,expectContinue:m},y){if(typeof A!=="string"){throw new r("path must be a string")}else if(A[0]!=="/"&&!(A.startsWith("http://")||A.startsWith("https://"))&&s!=="CONNECT"){throw new r("path must be an absolute URL or start with a slash")}else if(E.exec(A)!==null){throw new r("invalid request path")}if(typeof s!=="string"){throw new r("method must be a string")}else if(g.exec(s)===null){throw new r("invalid request method")}if(C&&typeof C!=="string"){throw new r("upgrade must be a string")}if(d!=null&&(!Number.isFinite(d)||d<0)){throw new r("invalid headersTimeout")}if(B!=null&&(!Number.isFinite(B)||B<0)){throw new r("invalid bodyTimeout")}if(I!=null&&typeof I!=="boolean"){throw new r("invalid reset")}if(m!=null&&typeof m!=="boolean"){throw new r("invalid expectContinue")}this.headersTimeout=d;this.bodyTimeout=B;this.throwOnError=p===true;this.method=s;this.abort=null;if(o==null){this.body=null}else if(c.isStream(o)){this.body=o;const e=this.body._readableState;if(!e||!e.autoDestroy){this.endHandler=function autoDestroy(){c.destroy(this)};this.body.on("end",this.endHandler)}this.errorHandler=e=>{if(this.abort){this.abort(e)}else{this.error=e}};this.body.on("error",this.errorHandler)}else if(c.isBuffer(o)){this.body=o.byteLength?o:null}else if(ArrayBuffer.isView(o)){this.body=o.buffer.byteLength?Buffer.from(o.buffer,o.byteOffset,o.byteLength):null}else if(o instanceof ArrayBuffer){this.body=o.byteLength?Buffer.from(o):null}else if(typeof o==="string"){this.body=o.length?Buffer.from(o):null}else if(c.isFormDataLike(o)||c.isIterable(o)||c.isBlobLike(o)){this.body=o}else{throw new r("body must be a string, a Buffer, a Readable stream, an iterable, or an async iterable")}this.completed=false;this.aborted=false;this.upgrade=C||null;this.path=i?c.buildURL(A,i):A;this.origin=e;this.idempotent=a==null?s==="HEAD"||s==="GET":a;this.blocking=l==null?false:l;this.reset=I==null?null:I;this.host=null;this.contentLength=null;this.contentType=null;this.headers="";this.expectContinue=m!=null?m:false;if(Array.isArray(n)){if(n.length%2!==0){throw new r("headers array must be even")}for(let e=0;e{e.exports={kClose:Symbol("close"),kDestroy:Symbol("destroy"),kDispatch:Symbol("dispatch"),kUrl:Symbol("url"),kWriting:Symbol("writing"),kResuming:Symbol("resuming"),kQueue:Symbol("queue"),kConnect:Symbol("connect"),kConnecting:Symbol("connecting"),kHeadersList:Symbol("headers list"),kKeepAliveDefaultTimeout:Symbol("default keep alive timeout"),kKeepAliveMaxTimeout:Symbol("max keep alive timeout"),kKeepAliveTimeoutThreshold:Symbol("keep alive timeout threshold"),kKeepAliveTimeoutValue:Symbol("keep alive timeout"),kKeepAlive:Symbol("keep alive"),kHeadersTimeout:Symbol("headers timeout"),kBodyTimeout:Symbol("body timeout"),kServerName:Symbol("server name"),kLocalAddress:Symbol("local address"),kHost:Symbol("host"),kNoRef:Symbol("no ref"),kBodyUsed:Symbol("used"),kRunning:Symbol("running"),kBlocking:Symbol("blocking"),kPending:Symbol("pending"),kSize:Symbol("size"),kBusy:Symbol("busy"),kQueued:Symbol("queued"),kFree:Symbol("free"),kConnected:Symbol("connected"),kClosed:Symbol("closed"),kNeedDrain:Symbol("need drain"),kReset:Symbol("reset"),kDestroyed:Symbol.for("nodejs.stream.destroyed"),kMaxHeadersSize:Symbol("max headers size"),kRunningIdx:Symbol("running index"),kPendingIdx:Symbol("pending index"),kError:Symbol("error"),kClients:Symbol("clients"),kClient:Symbol("client"),kParser:Symbol("parser"),kOnDestroyed:Symbol("destroy callbacks"),kPipelining:Symbol("pipelining"),kSocket:Symbol("socket"),kHostHeader:Symbol("host header"),kConnector:Symbol("connector"),kStrictContentLength:Symbol("strict content length"),kMaxRedirections:Symbol("maxRedirections"),kMaxRequests:Symbol("maxRequestsPerClient"),kProxy:Symbol("proxy agent options"),kCounter:Symbol("socket request counter"),kInterceptors:Symbol("dispatch interceptors"),kMaxResponseSize:Symbol("max response size"),kHTTP2Session:Symbol("http2Session"),kHTTP2SessionState:Symbol("http2Session state"),kHTTP2BuildRequest:Symbol("http2 build request"),kHTTP1BuildRequest:Symbol("http1 build request"),kHTTP2CopyHeaders:Symbol("http2 copy headers"),kHTTPConnVersion:Symbol("http connection version"),kRetryHandlerDefaultRetry:Symbol("retry agent default retry"),kConstruct:Symbol("constructable")}},3440:(e,A,t)=>{"use strict";const r=t(2613);const{kDestroyed:s,kBodyUsed:o}=t(6443);const{IncomingMessage:n}=t(8611);const i=t(2203);const a=t(9278);const{InvalidArgumentError:c}=t(8707);const{Blob:g}=t(181);const l=t(9023);const{stringify:E}=t(3480);const{headerNameLowerCasedRecord:u}=t(735);const[h,Q]=process.versions.node.split(".").map((e=>Number(e)));function nop(){}function isStream(e){return e&&typeof e==="object"&&typeof e.pipe==="function"&&typeof e.on==="function"}function isBlobLike(e){return g&&e instanceof g||e&&typeof e==="object"&&(typeof e.stream==="function"||typeof e.arrayBuffer==="function")&&/^(Blob|File)$/.test(e[Symbol.toStringTag])}function buildURL(e,A){if(e.includes("?")||e.includes("#")){throw new Error('Query params cannot be passed when url already contains "?" or "#".')}const t=E(A);if(t){e+="?"+t}return e}function parseURL(e){if(typeof e==="string"){e=new URL(e);if(!/^https?:/.test(e.origin||e.protocol)){throw new c("Invalid URL protocol: the URL must start with `http:` or `https:`.")}return e}if(!e||typeof e!=="object"){throw new c("Invalid URL: The URL argument must be a non-null object.")}if(!/^https?:/.test(e.origin||e.protocol)){throw new c("Invalid URL protocol: the URL must start with `http:` or `https:`.")}if(!(e instanceof URL)){if(e.port!=null&&e.port!==""&&!Number.isFinite(parseInt(e.port))){throw new c("Invalid URL: port must be a valid integer or a string representation of an integer.")}if(e.path!=null&&typeof e.path!=="string"){throw new c("Invalid URL path: the path must be a string or null/undefined.")}if(e.pathname!=null&&typeof e.pathname!=="string"){throw new c("Invalid URL pathname: the pathname must be a string or null/undefined.")}if(e.hostname!=null&&typeof e.hostname!=="string"){throw new c("Invalid URL hostname: the hostname must be a string or null/undefined.")}if(e.origin!=null&&typeof e.origin!=="string"){throw new c("Invalid URL origin: the origin must be a string or null/undefined.")}const A=e.port!=null?e.port:e.protocol==="https:"?443:80;let t=e.origin!=null?e.origin:`${e.protocol}//${e.hostname}:${A}`;let r=e.path!=null?e.path:`${e.pathname||""}${e.search||""}`;if(t.endsWith("/")){t=t.substring(0,t.length-1)}if(r&&!r.startsWith("/")){r=`/${r}`}e=new URL(t+r)}return e}function parseOrigin(e){e=parseURL(e);if(e.pathname!=="/"||e.search||e.hash){throw new c("invalid url")}return e}function getHostname(e){if(e[0]==="["){const A=e.indexOf("]");r(A!==-1);return e.substring(1,A)}const A=e.indexOf(":");if(A===-1)return e;return e.substring(0,A)}function getServerName(e){if(!e){return null}r.strictEqual(typeof e,"string");const A=getHostname(e);if(a.isIP(A)){return""}return A}function deepClone(e){return JSON.parse(JSON.stringify(e))}function isAsyncIterable(e){return!!(e!=null&&typeof e[Symbol.asyncIterator]==="function")}function isIterable(e){return!!(e!=null&&(typeof e[Symbol.iterator]==="function"||typeof e[Symbol.asyncIterator]==="function"))}function bodyLength(e){if(e==null){return 0}else if(isStream(e)){const A=e._readableState;return A&&A.objectMode===false&&A.ended===true&&Number.isFinite(A.length)?A.length:null}else if(isBlobLike(e)){return e.size!=null?e.size:null}else if(isBuffer(e)){return e.byteLength}return null}function isDestroyed(e){return!e||!!(e.destroyed||e[s])}function isReadableAborted(e){const A=e&&e._readableState;return isDestroyed(e)&&A&&!A.endEmitted}function destroy(e,A){if(e==null||!isStream(e)||isDestroyed(e)){return}if(typeof e.destroy==="function"){if(Object.getPrototypeOf(e).constructor===n){e.socket=null}e.destroy(A)}else if(A){process.nextTick(((e,A)=>{e.emit("error",A)}),e,A)}if(e.destroyed!==true){e[s]=true}}const C=/timeout=(\d+)/;function parseKeepAliveTimeout(e){const A=e.toString().match(C);return A?parseInt(A[1],10)*1e3:null}function headerNameToString(e){return u[e]||e.toLowerCase()}function parseHeaders(e,A={}){if(!Array.isArray(e))return e;for(let t=0;te.toString("utf8")))}else{A[r]=e[t+1].toString("utf8")}}else{if(!Array.isArray(s)){s=[s];A[r]=s}s.push(e[t+1].toString("utf8"))}}if("content-length"in A&&"content-disposition"in A){A["content-disposition"]=Buffer.from(A["content-disposition"]).toString("latin1")}return A}function parseRawHeaders(e){const A=[];let t=false;let r=-1;for(let s=0;s{e.close()}))}else{const A=Buffer.isBuffer(r)?r:Buffer.from(r);e.enqueue(new Uint8Array(A))}return e.desiredSize>0},async cancel(e){await A.return()}},0)}function isFormDataLike(e){return e&&typeof e==="object"&&typeof e.append==="function"&&typeof e.delete==="function"&&typeof e.get==="function"&&typeof e.getAll==="function"&&typeof e.has==="function"&&typeof e.set==="function"&&e[Symbol.toStringTag]==="FormData"}function throwIfAborted(e){if(!e){return}if(typeof e.throwIfAborted==="function"){e.throwIfAborted()}else{if(e.aborted){const e=new Error("The operation was aborted");e.name="AbortError";throw e}}}function addAbortListener(e,A){if("addEventListener"in e){e.addEventListener("abort",A,{once:true});return()=>e.removeEventListener("abort",A)}e.addListener("abort",A);return()=>e.removeListener("abort",A)}const B=!!String.prototype.toWellFormed;function toUSVString(e){if(B){return`${e}`.toWellFormed()}else if(l.toUSVString){return l.toUSVString(e)}return`${e}`}function parseRangeHeader(e){if(e==null||e==="")return{start:0,end:null,size:null};const A=e?e.match(/^bytes (\d+)-(\d+)\/(\d+)?$/):null;return A?{start:parseInt(A[1]),end:A[2]?parseInt(A[2]):null,size:A[3]?parseInt(A[3]):null}:null}const I=Object.create(null);I.enumerable=true;e.exports={kEnumerableProperty:I,nop:nop,isDisturbed:isDisturbed,isErrored:isErrored,isReadable:isReadable,toUSVString:toUSVString,isReadableAborted:isReadableAborted,isBlobLike:isBlobLike,parseOrigin:parseOrigin,parseURL:parseURL,getServerName:getServerName,isStream:isStream,isIterable:isIterable,isAsyncIterable:isAsyncIterable,isDestroyed:isDestroyed,headerNameToString:headerNameToString,parseRawHeaders:parseRawHeaders,parseHeaders:parseHeaders,parseKeepAliveTimeout:parseKeepAliveTimeout,destroy:destroy,bodyLength:bodyLength,deepClone:deepClone,ReadableStreamFrom:ReadableStreamFrom,isBuffer:isBuffer,validateHandler:validateHandler,getSocketInfo:getSocketInfo,isFormDataLike:isFormDataLike,buildURL:buildURL,throwIfAborted:throwIfAborted,addAbortListener:addAbortListener,parseRangeHeader:parseRangeHeader,nodeMajor:h,nodeMinor:Q,nodeHasAutoSelectFamily:h>18||h===18&&Q>=13,safeHTTPMethods:["GET","HEAD","OPTIONS","TRACE"]}},1:(e,A,t)=>{"use strict";const r=t(992);const{ClientDestroyedError:s,ClientClosedError:o,InvalidArgumentError:n}=t(8707);const{kDestroy:i,kClose:a,kDispatch:c,kInterceptors:g}=t(6443);const l=Symbol("destroyed");const E=Symbol("closed");const u=Symbol("onDestroyed");const h=Symbol("onClosed");const Q=Symbol("Intercepted Dispatch");class DispatcherBase extends r{constructor(){super();this[l]=false;this[u]=null;this[E]=false;this[h]=[]}get destroyed(){return this[l]}get closed(){return this[E]}get interceptors(){return this[g]}set interceptors(e){if(e){for(let A=e.length-1;A>=0;A--){const e=this[g][A];if(typeof e!=="function"){throw new n("interceptor must be an function")}}}this[g]=e}close(e){if(e===undefined){return new Promise(((e,A)=>{this.close(((t,r)=>t?A(t):e(r)))}))}if(typeof e!=="function"){throw new n("invalid callback")}if(this[l]){queueMicrotask((()=>e(new s,null)));return}if(this[E]){if(this[h]){this[h].push(e)}else{queueMicrotask((()=>e(null,null)))}return}this[E]=true;this[h].push(e);const onClosed=()=>{const e=this[h];this[h]=null;for(let A=0;Athis.destroy())).then((()=>{queueMicrotask(onClosed)}))}destroy(e,A){if(typeof e==="function"){A=e;e=null}if(A===undefined){return new Promise(((A,t)=>{this.destroy(e,((e,r)=>e?t(e):A(r)))}))}if(typeof A!=="function"){throw new n("invalid callback")}if(this[l]){if(this[u]){this[u].push(A)}else{queueMicrotask((()=>A(null,null)))}return}if(!e){e=new s}this[l]=true;this[u]=this[u]||[];this[u].push(A);const onDestroyed=()=>{const e=this[u];this[u]=null;for(let A=0;A{queueMicrotask(onDestroyed)}))}[Q](e,A){if(!this[g]||this[g].length===0){this[Q]=this[c];return this[c](e,A)}let t=this[c].bind(this);for(let e=this[g].length-1;e>=0;e--){t=this[g][e](t)}this[Q]=t;return t(e,A)}dispatch(e,A){if(!A||typeof A!=="object"){throw new n("handler must be an object")}try{if(!e||typeof e!=="object"){throw new n("opts must be an object.")}if(this[l]||this[u]){throw new s}if(this[E]){throw new o}return this[Q](e,A)}catch(e){if(typeof A.onError!=="function"){throw new n("invalid onError method")}A.onError(e);return false}}}e.exports=DispatcherBase},992:(e,A,t)=>{"use strict";const r=t(4434);class Dispatcher extends r{dispatch(){throw new Error("not implemented")}close(){throw new Error("not implemented")}destroy(){throw new Error("not implemented")}}e.exports=Dispatcher},8923:(e,A,t)=>{"use strict";const r=t(9581);const s=t(3440);const{ReadableStreamFrom:o,isBlobLike:n,isReadableStreamLike:i,readableStreamClose:a,createDeferredPromise:c,fullyReadBody:g}=t(5523);const{FormData:l}=t(3073);const{kState:E}=t(9710);const{webidl:u}=t(4222);const{DOMException:h,structuredClone:Q}=t(7326);const{Blob:C,File:d}=t(181);const{kBodyUsed:B}=t(6443);const I=t(2613);const{isErrored:p}=t(3440);const{isUint8Array:m,isArrayBuffer:y}=t(8253);const{File:w}=t(3041);const{parseMIMEType:b,serializeAMimeType:R}=t(4322);let k=globalThis.ReadableStream;const D=d??w;const S=new TextEncoder;const F=new TextDecoder;function extractBody(e,A=false){if(!k){k=t(3774).ReadableStream}let r=null;if(e instanceof k){r=e}else if(n(e)){r=e.stream()}else{r=new k({async pull(e){e.enqueue(typeof g==="string"?S.encode(g):g);queueMicrotask((()=>a(e)))},start(){},type:undefined})}I(i(r));let c=null;let g=null;let l=null;let E=null;if(typeof e==="string"){g=e;E="text/plain;charset=UTF-8"}else if(e instanceof URLSearchParams){g=e.toString();E="application/x-www-form-urlencoded;charset=UTF-8"}else if(y(e)){g=new Uint8Array(e.slice())}else if(ArrayBuffer.isView(e)){g=new Uint8Array(e.buffer.slice(e.byteOffset,e.byteOffset+e.byteLength))}else if(s.isFormDataLike(e)){const A=`----formdata-undici-0${`${Math.floor(Math.random()*1e11)}`.padStart(11,"0")}`;const t=`--${A}\r\nContent-Disposition: form-data` -/*! formdata-polyfill. MIT License. Jimmy Wärting */;const escape=e=>e.replace(/\n/g,"%0A").replace(/\r/g,"%0D").replace(/"/g,"%22");const normalizeLinefeeds=e=>e.replace(/\r?\n|\r/g,"\r\n");const r=[];const s=new Uint8Array([13,10]);l=0;let o=false;for(const[A,n]of e){if(typeof n==="string"){const e=S.encode(t+`; name="${escape(normalizeLinefeeds(A))}"`+`\r\n\r\n${normalizeLinefeeds(n)}\r\n`);r.push(e);l+=e.byteLength}else{const e=S.encode(`${t}; name="${escape(normalizeLinefeeds(A))}"`+(n.name?`; filename="${escape(n.name)}"`:"")+"\r\n"+`Content-Type: ${n.type||"application/octet-stream"}\r\n\r\n`);r.push(e,n,s);if(typeof n.size==="number"){l+=e.byteLength+n.size+s.byteLength}else{o=true}}}const n=S.encode(`--${A}--`);r.push(n);l+=n.byteLength;if(o){l=null}g=e;c=async function*(){for(const e of r){if(e.stream){yield*e.stream()}else{yield e}}};E="multipart/form-data; boundary="+A}else if(n(e)){g=e;l=e.size;if(e.type){E=e.type}}else if(typeof e[Symbol.asyncIterator]==="function"){if(A){throw new TypeError("keepalive")}if(s.isDisturbed(e)||e.locked){throw new TypeError("Response body object should not be disturbed or locked")}r=e instanceof k?e:o(e)}if(typeof g==="string"||s.isBuffer(g)){l=Buffer.byteLength(g)}if(c!=null){let A;r=new k({async start(){A=c(e)[Symbol.asyncIterator]()},async pull(e){const{value:t,done:s}=await A.next();if(s){queueMicrotask((()=>{e.close()}))}else{if(!p(r)){e.enqueue(new Uint8Array(t))}}return e.desiredSize>0},async cancel(e){await A.return()},type:undefined})}const u={stream:r,source:g,length:l};return[u,E]}function safelyExtractBody(e,A=false){if(!k){k=t(3774).ReadableStream}if(e instanceof k){I(!s.isDisturbed(e),"The body has already been consumed.");I(!e.locked,"The stream is locked.")}return extractBody(e,A)}function cloneBody(e){const[A,t]=e.stream.tee();const r=Q(t,{transfer:[t]});const[,s]=r.tee();e.stream=A;return{stream:s,length:e.length,source:e.source}}async function*consumeBody(e){if(e){if(m(e)){yield e}else{const A=e.stream;if(s.isDisturbed(A)){throw new TypeError("The body has already been consumed.")}if(A.locked){throw new TypeError("The stream is locked.")}A[B]=true;yield*A}}}function throwIfAborted(e){if(e.aborted){throw new h("The operation was aborted.","AbortError")}}function bodyMixinMethods(e){const A={blob(){return specConsumeBody(this,(e=>{let A=bodyMimeType(this);if(A==="failure"){A=""}else if(A){A=R(A)}return new C([e],{type:A})}),e)},arrayBuffer(){return specConsumeBody(this,(e=>new Uint8Array(e).buffer),e)},text(){return specConsumeBody(this,utf8DecodeBytes,e)},json(){return specConsumeBody(this,parseJSONFromBytes,e)},async formData(){u.brandCheck(this,e);throwIfAborted(this[E]);const A=this.headers.get("Content-Type");if(/multipart\/form-data/.test(A)){const e={};for(const[A,t]of this.headers)e[A.toLowerCase()]=t;const A=new l;let t;try{t=new r({headers:e,preservePath:true})}catch(e){throw new h(`${e}`,"AbortError")}t.on("field",((e,t)=>{A.append(e,t)}));t.on("file",((e,t,r,s,o)=>{const n=[];if(s==="base64"||s.toLowerCase()==="base64"){let s="";t.on("data",(e=>{s+=e.toString().replace(/[\r\n]/gm,"");const A=s.length-s.length%4;n.push(Buffer.from(s.slice(0,A),"base64"));s=s.slice(A)}));t.on("end",(()=>{n.push(Buffer.from(s,"base64"));A.append(e,new D(n,r,{type:o}))}))}else{t.on("data",(e=>{n.push(e)}));t.on("end",(()=>{A.append(e,new D(n,r,{type:o}))}))}}));const s=new Promise(((e,A)=>{t.on("finish",e);t.on("error",(e=>A(new TypeError(e))))}));if(this.body!==null)for await(const e of consumeBody(this[E].body))t.write(e);t.end();await s;return A}else if(/application\/x-www-form-urlencoded/.test(A)){let e;try{let A="";const t=new TextDecoder("utf-8",{ignoreBOM:true});for await(const e of consumeBody(this[E].body)){if(!m(e)){throw new TypeError("Expected Uint8Array chunk")}A+=t.decode(e,{stream:true})}A+=t.decode();e=new URLSearchParams(A)}catch(e){throw Object.assign(new TypeError,{cause:e})}const A=new l;for(const[t,r]of e){A.append(t,r)}return A}else{await Promise.resolve();throwIfAborted(this[E]);throw u.errors.exception({header:`${e.name}.formData`,message:"Could not parse content as FormData."})}}};return A}function mixinBody(e){Object.assign(e.prototype,bodyMixinMethods(e))}async function specConsumeBody(e,A,t){u.brandCheck(e,t);throwIfAborted(e[E]);if(bodyUnusable(e[E].body)){throw new TypeError("Body is unusable")}const r=c();const errorSteps=e=>r.reject(e);const successSteps=e=>{try{r.resolve(A(e))}catch(e){errorSteps(e)}};if(e[E].body==null){successSteps(new Uint8Array);return r.promise}await g(e[E].body,successSteps,errorSteps);return r.promise}function bodyUnusable(e){return e!=null&&(e.stream.locked||s.isDisturbed(e.stream))}function utf8DecodeBytes(e){if(e.length===0){return""}if(e[0]===239&&e[1]===187&&e[2]===191){e=e.subarray(3)}const A=F.decode(e);return A}function parseJSONFromBytes(e){return JSON.parse(utf8DecodeBytes(e))}function bodyMimeType(e){const{headersList:A}=e[E];const t=A.get("content-type");if(t===null){return"failure"}return b(t)}e.exports={extractBody:extractBody,safelyExtractBody:safelyExtractBody,cloneBody:cloneBody,mixinBody:mixinBody}},7326:(e,A,t)=>{"use strict";const{MessageChannel:r,receiveMessageOnPort:s}=t(8167);const o=["GET","HEAD","POST"];const n=new Set(o);const i=[101,204,205,304];const a=[301,302,303,307,308];const c=new Set(a);const g=["1","7","9","11","13","15","17","19","20","21","22","23","25","37","42","43","53","69","77","79","87","95","101","102","103","104","109","110","111","113","115","117","119","123","135","137","139","143","161","179","389","427","465","512","513","514","515","526","530","531","532","540","548","554","556","563","587","601","636","989","990","993","995","1719","1720","1723","2049","3659","4045","5060","5061","6000","6566","6665","6666","6667","6668","6669","6697","10080"];const l=new Set(g);const E=["","no-referrer","no-referrer-when-downgrade","same-origin","origin","strict-origin","origin-when-cross-origin","strict-origin-when-cross-origin","unsafe-url"];const u=new Set(E);const h=["follow","manual","error"];const Q=["GET","HEAD","OPTIONS","TRACE"];const C=new Set(Q);const d=["navigate","same-origin","no-cors","cors"];const B=["omit","same-origin","include"];const I=["default","no-store","reload","no-cache","force-cache","only-if-cached"];const p=["content-encoding","content-language","content-location","content-type","content-length"];const m=["half"];const y=["CONNECT","TRACE","TRACK"];const w=new Set(y);const b=["audio","audioworklet","font","image","manifest","paintworklet","script","style","track","video","xslt",""];const R=new Set(b);const k=globalThis.DOMException??(()=>{try{atob("~")}catch(e){return Object.getPrototypeOf(e).constructor}})();let D;const S=globalThis.structuredClone??function structuredClone(e,A=undefined){if(arguments.length===0){throw new TypeError("missing argument")}if(!D){D=new r}D.port1.unref();D.port2.unref();D.port1.postMessage(e,A?.transfer);return s(D.port2).message};e.exports={DOMException:k,structuredClone:S,subresource:b,forbiddenMethods:y,requestBodyHeader:p,referrerPolicy:E,requestRedirect:h,requestMode:d,requestCredentials:B,requestCache:I,redirectStatus:a,corsSafeListedMethods:o,nullBodyStatus:i,safeMethods:Q,badPorts:g,requestDuplex:m,subresourceSet:R,badPortsSet:l,redirectStatusSet:c,corsSafeListedMethodsSet:n,safeMethodsSet:C,forbiddenMethodsSet:w,referrerPolicySet:u}},4322:(e,A,t)=>{const r=t(2613);const{atob:s}=t(181);const{isomorphicDecode:o}=t(5523);const n=new TextEncoder;const i=/^[!#$%&'*+-.^_|~A-Za-z0-9]+$/;const a=/(\u000A|\u000D|\u0009|\u0020)/;const c=/[\u0009|\u0020-\u007E|\u0080-\u00FF]/;function dataURLProcessor(e){r(e.protocol==="data:");let A=URLSerializer(e,true);A=A.slice(5);const t={position:0};let s=collectASequenceOfCodePointsFast(",",A,t);const n=s.length;s=removeASCIIWhitespace(s,true,true);if(t.position>=A.length){return"failure"}t.position++;const i=A.slice(n+1);let a=stringPercentDecode(i);if(/;(\u0020){0,}base64$/i.test(s)){const e=o(a);a=forgivingBase64(e);if(a==="failure"){return"failure"}s=s.slice(0,-6);s=s.replace(/(\u0020)+$/,"");s=s.slice(0,-1)}if(s.startsWith(";")){s="text/plain"+s}let c=parseMIMEType(s);if(c==="failure"){c=parseMIMEType("text/plain;charset=US-ASCII")}return{mimeType:c,body:a}}function URLSerializer(e,A=false){if(!A){return e.href}const t=e.href;const r=e.hash.length;return r===0?t:t.substring(0,t.length-r)}function collectASequenceOfCodePoints(e,A,t){let r="";while(t.positione.length){return"failure"}A.position++;let r=collectASequenceOfCodePointsFast(";",e,A);r=removeHTTPWhitespace(r,false,true);if(r.length===0||!i.test(r)){return"failure"}const s=t.toLowerCase();const o=r.toLowerCase();const n={type:s,subtype:o,parameters:new Map,essence:`${s}/${o}`};while(A.positiona.test(e)),e,A);let t=collectASequenceOfCodePoints((e=>e!==";"&&e!=="="),e,A);t=t.toLowerCase();if(A.positione.length){break}let r=null;if(e[A.position]==='"'){r=collectAnHTTPQuotedString(e,A,true);collectASequenceOfCodePointsFast(";",e,A)}else{r=collectASequenceOfCodePointsFast(";",e,A);r=removeHTTPWhitespace(r,false,true);if(r.length===0){continue}}if(t.length!==0&&i.test(t)&&(r.length===0||c.test(r))&&!n.parameters.has(t)){n.parameters.set(t,r)}}return n}function forgivingBase64(e){e=e.replace(/[\u0009\u000A\u000C\u000D\u0020]/g,"");if(e.length%4===0){e=e.replace(/=?=$/,"")}if(e.length%4===1){return"failure"}if(/[^+/0-9A-Za-z]/.test(e)){return"failure"}const A=s(e);const t=new Uint8Array(A.length);for(let e=0;ee!=='"'&&e!=="\\"),e,A);if(A.position>=e.length){break}const t=e[A.position];A.position++;if(t==="\\"){if(A.position>=e.length){o+="\\";break}o+=e[A.position];A.position++}else{r(t==='"');break}}if(t){return o}return e.slice(s,A.position)}function serializeAMimeType(e){r(e!=="failure");const{parameters:A,essence:t}=e;let s=t;for(let[e,t]of A.entries()){s+=";";s+=e;s+="=";if(!i.test(t)){t=t.replace(/(\\|")/g,"\\$1");t='"'+t;t+='"'}s+=t}return s}function isHTTPWhiteSpace(e){return e==="\r"||e==="\n"||e==="\t"||e===" "}function removeHTTPWhitespace(e,A=true,t=true){let r=0;let s=e.length-1;if(A){for(;r0&&isHTTPWhiteSpace(e[s]);s--);}return e.slice(r,s+1)}function isASCIIWhitespace(e){return e==="\r"||e==="\n"||e==="\t"||e==="\f"||e===" "}function removeASCIIWhitespace(e,A=true,t=true){let r=0;let s=e.length-1;if(A){for(;r0&&isASCIIWhitespace(e[s]);s--);}return e.slice(r,s+1)}e.exports={dataURLProcessor:dataURLProcessor,URLSerializer:URLSerializer,collectASequenceOfCodePoints:collectASequenceOfCodePoints,collectASequenceOfCodePointsFast:collectASequenceOfCodePointsFast,stringPercentDecode:stringPercentDecode,parseMIMEType:parseMIMEType,collectAnHTTPQuotedString:collectAnHTTPQuotedString,serializeAMimeType:serializeAMimeType}},3041:(e,A,t)=>{"use strict";const{Blob:r,File:s}=t(181);const{types:o}=t(9023);const{kState:n}=t(9710);const{isBlobLike:i}=t(5523);const{webidl:a}=t(4222);const{parseMIMEType:c,serializeAMimeType:g}=t(4322);const{kEnumerableProperty:l}=t(3440);const E=new TextEncoder;class File extends r{constructor(e,A,t={}){a.argumentLengthCheck(arguments,2,{header:"File constructor"});e=a.converters["sequence"](e);A=a.converters.USVString(A);t=a.converters.FilePropertyBag(t);const r=A;let s=t.type;let o;e:{if(s){s=c(s);if(s==="failure"){s="";break e}s=g(s).toLowerCase()}o=t.lastModified}super(processBlobParts(e,t),{type:s});this[n]={name:r,lastModified:o,type:s}}get name(){a.brandCheck(this,File);return this[n].name}get lastModified(){a.brandCheck(this,File);return this[n].lastModified}get type(){a.brandCheck(this,File);return this[n].type}}class FileLike{constructor(e,A,t={}){const r=A;const s=t.type;const o=t.lastModified??Date.now();this[n]={blobLike:e,name:r,type:s,lastModified:o}}stream(...e){a.brandCheck(this,FileLike);return this[n].blobLike.stream(...e)}arrayBuffer(...e){a.brandCheck(this,FileLike);return this[n].blobLike.arrayBuffer(...e)}slice(...e){a.brandCheck(this,FileLike);return this[n].blobLike.slice(...e)}text(...e){a.brandCheck(this,FileLike);return this[n].blobLike.text(...e)}get size(){a.brandCheck(this,FileLike);return this[n].blobLike.size}get type(){a.brandCheck(this,FileLike);return this[n].blobLike.type}get name(){a.brandCheck(this,FileLike);return this[n].name}get lastModified(){a.brandCheck(this,FileLike);return this[n].lastModified}get[Symbol.toStringTag](){return"File"}}Object.defineProperties(File.prototype,{[Symbol.toStringTag]:{value:"File",configurable:true},name:l,lastModified:l});a.converters.Blob=a.interfaceConverter(r);a.converters.BlobPart=function(e,A){if(a.util.Type(e)==="Object"){if(i(e)){return a.converters.Blob(e,{strict:false})}if(ArrayBuffer.isView(e)||o.isAnyArrayBuffer(e)){return a.converters.BufferSource(e,A)}}return a.converters.USVString(e,A)};a.converters["sequence"]=a.sequenceConverter(a.converters.BlobPart);a.converters.FilePropertyBag=a.dictionaryConverter([{key:"lastModified",converter:a.converters["long long"],get defaultValue(){return Date.now()}},{key:"type",converter:a.converters.DOMString,defaultValue:""},{key:"endings",converter:e=>{e=a.converters.DOMString(e);e=e.toLowerCase();if(e!=="native"){e="transparent"}return e},defaultValue:"transparent"}]);function processBlobParts(e,A){const t=[];for(const r of e){if(typeof r==="string"){let e=r;if(A.endings==="native"){e=convertLineEndingsNative(e)}t.push(E.encode(e))}else if(o.isAnyArrayBuffer(r)||o.isTypedArray(r)){if(!r.buffer){t.push(new Uint8Array(r))}else{t.push(new Uint8Array(r.buffer,r.byteOffset,r.byteLength))}}else if(i(r)){t.push(r)}}return t}function convertLineEndingsNative(e){let A="\n";if(process.platform==="win32"){A="\r\n"}return e.replace(/\r?\n/g,A)}function isFileLike(e){return s&&e instanceof s||e instanceof File||e&&(typeof e.stream==="function"||typeof e.arrayBuffer==="function")&&e[Symbol.toStringTag]==="File"}e.exports={File:File,FileLike:FileLike,isFileLike:isFileLike}},3073:(e,A,t)=>{"use strict";const{isBlobLike:r,toUSVString:s,makeIterator:o}=t(5523);const{kState:n}=t(9710);const{File:i,FileLike:a,isFileLike:c}=t(3041);const{webidl:g}=t(4222);const{Blob:l,File:E}=t(181);const u=E??i;class FormData{constructor(e){if(e!==undefined){throw g.errors.conversionFailed({prefix:"FormData constructor",argument:"Argument 1",types:["undefined"]})}this[n]=[]}append(e,A,t=undefined){g.brandCheck(this,FormData);g.argumentLengthCheck(arguments,2,{header:"FormData.append"});if(arguments.length===3&&!r(A)){throw new TypeError("Failed to execute 'append' on 'FormData': parameter 2 is not of type 'Blob'")}e=g.converters.USVString(e);A=r(A)?g.converters.Blob(A,{strict:false}):g.converters.USVString(A);t=arguments.length===3?g.converters.USVString(t):undefined;const s=makeEntry(e,A,t);this[n].push(s)}delete(e){g.brandCheck(this,FormData);g.argumentLengthCheck(arguments,1,{header:"FormData.delete"});e=g.converters.USVString(e);this[n]=this[n].filter((A=>A.name!==e))}get(e){g.brandCheck(this,FormData);g.argumentLengthCheck(arguments,1,{header:"FormData.get"});e=g.converters.USVString(e);const A=this[n].findIndex((A=>A.name===e));if(A===-1){return null}return this[n][A].value}getAll(e){g.brandCheck(this,FormData);g.argumentLengthCheck(arguments,1,{header:"FormData.getAll"});e=g.converters.USVString(e);return this[n].filter((A=>A.name===e)).map((e=>e.value))}has(e){g.brandCheck(this,FormData);g.argumentLengthCheck(arguments,1,{header:"FormData.has"});e=g.converters.USVString(e);return this[n].findIndex((A=>A.name===e))!==-1}set(e,A,t=undefined){g.brandCheck(this,FormData);g.argumentLengthCheck(arguments,2,{header:"FormData.set"});if(arguments.length===3&&!r(A)){throw new TypeError("Failed to execute 'set' on 'FormData': parameter 2 is not of type 'Blob'")}e=g.converters.USVString(e);A=r(A)?g.converters.Blob(A,{strict:false}):g.converters.USVString(A);t=arguments.length===3?s(t):undefined;const o=makeEntry(e,A,t);const i=this[n].findIndex((A=>A.name===e));if(i!==-1){this[n]=[...this[n].slice(0,i),o,...this[n].slice(i+1).filter((A=>A.name!==e))]}else{this[n].push(o)}}entries(){g.brandCheck(this,FormData);return o((()=>this[n].map((e=>[e.name,e.value]))),"FormData","key+value")}keys(){g.brandCheck(this,FormData);return o((()=>this[n].map((e=>[e.name,e.value]))),"FormData","key")}values(){g.brandCheck(this,FormData);return o((()=>this[n].map((e=>[e.name,e.value]))),"FormData","value")}forEach(e,A=globalThis){g.brandCheck(this,FormData);g.argumentLengthCheck(arguments,1,{header:"FormData.forEach"});if(typeof e!=="function"){throw new TypeError("Failed to execute 'forEach' on 'FormData': parameter 1 is not of type 'Function'.")}for(const[t,r]of this){e.apply(A,[r,t,this])}}}FormData.prototype[Symbol.iterator]=FormData.prototype.entries;Object.defineProperties(FormData.prototype,{[Symbol.toStringTag]:{value:"FormData",configurable:true}});function makeEntry(e,A,t){e=Buffer.from(e).toString("utf8");if(typeof A==="string"){A=Buffer.from(A).toString("utf8")}else{if(!c(A)){A=A instanceof l?new u([A],"blob",{type:A.type}):new a(A,"blob",{type:A.type})}if(t!==undefined){const e={type:A.type,lastModified:A.lastModified};A=E&&A instanceof E||A instanceof i?new u([A],t,e):new a(A,t,e)}}return{name:e,value:A}}e.exports={FormData:FormData}},5628:e=>{"use strict";const A=Symbol.for("undici.globalOrigin.1");function getGlobalOrigin(){return globalThis[A]}function setGlobalOrigin(e){if(e===undefined){Object.defineProperty(globalThis,A,{value:undefined,writable:true,enumerable:false,configurable:false});return}const t=new URL(e);if(t.protocol!=="http:"&&t.protocol!=="https:"){throw new TypeError(`Only http & https urls are allowed, received ${t.protocol}`)}Object.defineProperty(globalThis,A,{value:t,writable:true,enumerable:false,configurable:false})}e.exports={getGlobalOrigin:getGlobalOrigin,setGlobalOrigin:setGlobalOrigin}},6349:(e,A,t)=>{"use strict";const{kHeadersList:r,kConstruct:s}=t(6443);const{kGuard:o}=t(9710);const{kEnumerableProperty:n}=t(3440);const{makeIterator:i,isValidHeaderName:a,isValidHeaderValue:c}=t(5523);const{webidl:g}=t(4222);const l=t(2613);const E=Symbol("headers map");const u=Symbol("headers map sorted");function isHTTPWhiteSpaceCharCode(e){return e===10||e===13||e===9||e===32}function headerValueNormalize(e){let A=0;let t=e.length;while(t>A&&isHTTPWhiteSpaceCharCode(e.charCodeAt(t-1)))--t;while(t>A&&isHTTPWhiteSpaceCharCode(e.charCodeAt(A)))++A;return A===0&&t===e.length?e:e.substring(A,t)}function fill(e,A){if(Array.isArray(A)){for(let t=0;t>","record"]})}}function appendHeader(e,A,t){t=headerValueNormalize(t);if(!a(A)){throw g.errors.invalidArgument({prefix:"Headers.append",value:A,type:"header name"})}else if(!c(t)){throw g.errors.invalidArgument({prefix:"Headers.append",value:t,type:"header value"})}if(e[o]==="immutable"){throw new TypeError("immutable")}else if(e[o]==="request-no-cors"){}return e[r].append(A,t)}class HeadersList{cookies=null;constructor(e){if(e instanceof HeadersList){this[E]=new Map(e[E]);this[u]=e[u];this.cookies=e.cookies===null?null:[...e.cookies]}else{this[E]=new Map(e);this[u]=null}}contains(e){e=e.toLowerCase();return this[E].has(e)}clear(){this[E].clear();this[u]=null;this.cookies=null}append(e,A){this[u]=null;const t=e.toLowerCase();const r=this[E].get(t);if(r){const e=t==="cookie"?"; ":", ";this[E].set(t,{name:r.name,value:`${r.value}${e}${A}`})}else{this[E].set(t,{name:e,value:A})}if(t==="set-cookie"){this.cookies??=[];this.cookies.push(A)}}set(e,A){this[u]=null;const t=e.toLowerCase();if(t==="set-cookie"){this.cookies=[A]}this[E].set(t,{name:e,value:A})}delete(e){this[u]=null;e=e.toLowerCase();if(e==="set-cookie"){this.cookies=null}this[E].delete(e)}get(e){const A=this[E].get(e.toLowerCase());return A===undefined?null:A.value}*[Symbol.iterator](){for(const[e,{value:A}]of this[E]){yield[e,A]}}get entries(){const e={};if(this[E].size){for(const{name:A,value:t}of this[E].values()){e[A]=t}}return e}}class Headers{constructor(e=undefined){if(e===s){return}this[r]=new HeadersList;this[o]="none";if(e!==undefined){e=g.converters.HeadersInit(e);fill(this,e)}}append(e,A){g.brandCheck(this,Headers);g.argumentLengthCheck(arguments,2,{header:"Headers.append"});e=g.converters.ByteString(e);A=g.converters.ByteString(A);return appendHeader(this,e,A)}delete(e){g.brandCheck(this,Headers);g.argumentLengthCheck(arguments,1,{header:"Headers.delete"});e=g.converters.ByteString(e);if(!a(e)){throw g.errors.invalidArgument({prefix:"Headers.delete",value:e,type:"header name"})}if(this[o]==="immutable"){throw new TypeError("immutable")}else if(this[o]==="request-no-cors"){}if(!this[r].contains(e)){return}this[r].delete(e)}get(e){g.brandCheck(this,Headers);g.argumentLengthCheck(arguments,1,{header:"Headers.get"});e=g.converters.ByteString(e);if(!a(e)){throw g.errors.invalidArgument({prefix:"Headers.get",value:e,type:"header name"})}return this[r].get(e)}has(e){g.brandCheck(this,Headers);g.argumentLengthCheck(arguments,1,{header:"Headers.has"});e=g.converters.ByteString(e);if(!a(e)){throw g.errors.invalidArgument({prefix:"Headers.has",value:e,type:"header name"})}return this[r].contains(e)}set(e,A){g.brandCheck(this,Headers);g.argumentLengthCheck(arguments,2,{header:"Headers.set"});e=g.converters.ByteString(e);A=g.converters.ByteString(A);A=headerValueNormalize(A);if(!a(e)){throw g.errors.invalidArgument({prefix:"Headers.set",value:e,type:"header name"})}else if(!c(A)){throw g.errors.invalidArgument({prefix:"Headers.set",value:A,type:"header value"})}if(this[o]==="immutable"){throw new TypeError("immutable")}else if(this[o]==="request-no-cors"){}this[r].set(e,A)}getSetCookie(){g.brandCheck(this,Headers);const e=this[r].cookies;if(e){return[...e]}return[]}get[u](){if(this[r][u]){return this[r][u]}const e=[];const A=[...this[r]].sort(((e,A)=>e[0]e),"Headers","key")}return i((()=>[...this[u].values()]),"Headers","key")}values(){g.brandCheck(this,Headers);if(this[o]==="immutable"){const e=this[u];return i((()=>e),"Headers","value")}return i((()=>[...this[u].values()]),"Headers","value")}entries(){g.brandCheck(this,Headers);if(this[o]==="immutable"){const e=this[u];return i((()=>e),"Headers","key+value")}return i((()=>[...this[u].values()]),"Headers","key+value")}forEach(e,A=globalThis){g.brandCheck(this,Headers);g.argumentLengthCheck(arguments,1,{header:"Headers.forEach"});if(typeof e!=="function"){throw new TypeError("Failed to execute 'forEach' on 'Headers': parameter 1 is not of type 'Function'.")}for(const[t,r]of this){e.apply(A,[r,t,this])}}[Symbol.for("nodejs.util.inspect.custom")](){g.brandCheck(this,Headers);return this[r]}}Headers.prototype[Symbol.iterator]=Headers.prototype.entries;Object.defineProperties(Headers.prototype,{append:n,delete:n,get:n,has:n,set:n,getSetCookie:n,keys:n,values:n,entries:n,forEach:n,[Symbol.iterator]:{enumerable:false},[Symbol.toStringTag]:{value:"Headers",configurable:true}});g.converters.HeadersInit=function(e){if(g.util.Type(e)==="Object"){if(e[Symbol.iterator]){return g.converters["sequence>"](e)}return g.converters["record"](e)}throw g.errors.conversionFailed({prefix:"Headers constructor",argument:"Argument 1",types:["sequence>","record"]})};e.exports={fill:fill,Headers:Headers,HeadersList:HeadersList}},2315:(e,A,t)=>{"use strict";const{Response:r,makeNetworkError:s,makeAppropriateNetworkError:o,filterResponse:n,makeResponse:i}=t(8676);const{Headers:a}=t(6349);const{Request:c,makeRequest:g}=t(5194);const l=t(3106);const{bytesMatch:E,makePolicyContainer:u,clonePolicyContainer:h,requestBadPort:Q,TAOCheck:C,appendRequestOriginHeader:d,responseLocationURL:B,requestCurrentURL:I,setRequestReferrerPolicyOnRedirect:p,tryUpgradeRequestToAPotentiallyTrustworthyURL:m,createOpaqueTimingInfo:y,appendFetchMetadata:w,corsCheck:b,crossOriginResourcePolicyCheck:R,determineRequestsReferrer:k,coarsenedSharedCurrentTime:D,createDeferredPromise:S,isBlobLike:F,sameOrigin:T,isCancelled:N,isAborted:U,isErrorLike:v,fullyReadBody:L,readableStreamClose:G,isomorphicEncode:M,urlIsLocal:_,urlIsHttpHttpsScheme:O,urlHasHttpsScheme:P}=t(5523);const{kState:H,kHeaders:Y,kGuard:J,kRealm:x}=t(9710);const V=t(2613);const{safelyExtractBody:q}=t(8923);const{redirectStatusSet:W,nullBodyStatus:j,safeMethodsSet:K,requestBodyHeader:Z,subresourceSet:X,DOMException:z}=t(7326);const{kHeadersList:$}=t(6443);const ee=t(4434);const{Readable:Ae,pipeline:te}=t(2203);const{addAbortListener:re,isErrored:se,isReadable:oe,nodeMajor:ne,nodeMinor:ie}=t(3440);const{dataURLProcessor:ae,serializeAMimeType:ce}=t(4322);const{TransformStream:ge}=t(3774);const{getGlobalDispatcher:le}=t(2581);const{webidl:Ee}=t(4222);const{STATUS_CODES:ue}=t(8611);const he=["GET","HEAD"];let Qe;let Ce=globalThis.ReadableStream;class Fetch extends ee{constructor(e){super();this.dispatcher=e;this.connection=null;this.dump=false;this.state="ongoing";this.setMaxListeners(21)}terminate(e){if(this.state!=="ongoing"){return}this.state="terminated";this.connection?.destroy(e);this.emit("terminated",e)}abort(e){if(this.state!=="ongoing"){return}this.state="aborted";if(!e){e=new z("The operation was aborted.","AbortError")}this.serializedAbortReason=e;this.connection?.destroy(e);this.emit("terminated",e)}}function fetch(e,A={}){Ee.argumentLengthCheck(arguments,1,{header:"globalThis.fetch"});const t=S();let s;try{s=new c(e,A)}catch(e){t.reject(e);return t.promise}const o=s[H];if(s.signal.aborted){abortFetch(t,o,null,s.signal.reason);return t.promise}const n=o.client.globalObject;if(n?.constructor?.name==="ServiceWorkerGlobalScope"){o.serviceWorkers="none"}let i=null;const a=null;let g=false;let l=null;re(s.signal,(()=>{g=true;V(l!=null);l.abort(s.signal.reason);abortFetch(t,o,i,s.signal.reason)}));const handleFetchDone=e=>finalizeAndReportTiming(e,"fetch");const processResponse=e=>{if(g){return Promise.resolve()}if(e.aborted){abortFetch(t,o,i,l.serializedAbortReason);return Promise.resolve()}if(e.type==="error"){t.reject(Object.assign(new TypeError("fetch failed"),{cause:e.error}));return Promise.resolve()}i=new r;i[H]=e;i[x]=a;i[Y][$]=e.headersList;i[Y][J]="immutable";i[Y][x]=a;t.resolve(i)};l=fetching({request:o,processResponseEndOfBody:handleFetchDone,processResponse:processResponse,dispatcher:A.dispatcher??le()});return t.promise}function finalizeAndReportTiming(e,A="other"){if(e.type==="error"&&e.aborted){return}if(!e.urlList?.length){return}const t=e.urlList[0];let r=e.timingInfo;let s=e.cacheState;if(!O(t)){return}if(r===null){return}if(!e.timingAllowPassed){r=y({startTime:r.startTime});s=""}r.endTime=D();e.timingInfo=r;markResourceTiming(r,t,A,globalThis,s)}function markResourceTiming(e,A,t,r,s){if(ne>18||ne===18&&ie>=2){performance.markResourceTiming(e,A.href,t,r,s)}}function abortFetch(e,A,t,r){if(!r){r=new z("The operation was aborted.","AbortError")}e.reject(r);if(A.body!=null&&oe(A.body?.stream)){A.body.stream.cancel(r).catch((e=>{if(e.code==="ERR_INVALID_STATE"){return}throw e}))}if(t==null){return}const s=t[H];if(s.body!=null&&oe(s.body?.stream)){s.body.stream.cancel(r).catch((e=>{if(e.code==="ERR_INVALID_STATE"){return}throw e}))}}function fetching({request:e,processRequestBodyChunkLength:A,processRequestEndOfBody:t,processResponse:r,processResponseEndOfBody:s,processResponseConsumeBody:o,useParallelQueue:n=false,dispatcher:i}){let a=null;let c=false;if(e.client!=null){a=e.client.globalObject;c=e.client.crossOriginIsolatedCapability}const g=D(c);const l=y({startTime:g});const E={controller:new Fetch(i),request:e,timingInfo:l,processRequestBodyChunkLength:A,processRequestEndOfBody:t,processResponse:r,processResponseConsumeBody:o,processResponseEndOfBody:s,taskDestination:a,crossOriginIsolatedCapability:c};V(!e.body||e.body.stream);if(e.window==="client"){e.window=e.client?.globalObject?.constructor?.name==="Window"?e.client:"no-window"}if(e.origin==="client"){e.origin=e.client?.origin}if(e.policyContainer==="client"){if(e.client!=null){e.policyContainer=h(e.client.policyContainer)}else{e.policyContainer=u()}}if(!e.headersList.contains("accept")){const A="*/*";e.headersList.append("accept",A)}if(!e.headersList.contains("accept-language")){e.headersList.append("accept-language","*")}if(e.priority===null){}if(X.has(e.destination)){}mainFetch(E).catch((e=>{E.controller.terminate(e)}));return E.controller}async function mainFetch(e,A=false){const t=e.request;let r=null;if(t.localURLsOnly&&!_(I(t))){r=s("local URLs only")}m(t);if(Q(t)==="blocked"){r=s("bad port")}if(t.referrerPolicy===""){t.referrerPolicy=t.policyContainer.referrerPolicy}if(t.referrer!=="no-referrer"){t.referrer=k(t)}if(r===null){r=await(async()=>{const A=I(t);if(T(A,t.url)&&t.responseTainting==="basic"||A.protocol==="data:"||(t.mode==="navigate"||t.mode==="websocket")){t.responseTainting="basic";return await schemeFetch(e)}if(t.mode==="same-origin"){return s('request mode cannot be "same-origin"')}if(t.mode==="no-cors"){if(t.redirect!=="follow"){return s('redirect mode cannot be "follow" for "no-cors" request')}t.responseTainting="opaque";return await schemeFetch(e)}if(!O(I(t))){return s("URL scheme must be a HTTP(S) scheme")}t.responseTainting="cors";return await httpFetch(e)})()}if(A){return r}if(r.status!==0&&!r.internalResponse){if(t.responseTainting==="cors"){}if(t.responseTainting==="basic"){r=n(r,"basic")}else if(t.responseTainting==="cors"){r=n(r,"cors")}else if(t.responseTainting==="opaque"){r=n(r,"opaque")}else{V(false)}}let o=r.status===0?r:r.internalResponse;if(o.urlList.length===0){o.urlList.push(...t.urlList)}if(!t.timingAllowFailed){r.timingAllowPassed=true}if(r.type==="opaque"&&o.status===206&&o.rangeRequested&&!t.headers.contains("range")){r=o=s()}if(r.status!==0&&(t.method==="HEAD"||t.method==="CONNECT"||j.includes(o.status))){o.body=null;e.controller.dump=true}if(t.integrity){const processBodyError=A=>fetchFinale(e,s(A));if(t.responseTainting==="opaque"||r.body==null){processBodyError(r.error);return}const processBody=A=>{if(!E(A,t.integrity)){processBodyError("integrity mismatch");return}r.body=q(A)[0];fetchFinale(e,r)};await L(r.body,processBody,processBodyError)}else{fetchFinale(e,r)}}function schemeFetch(e){if(N(e)&&e.request.redirectCount===0){return Promise.resolve(o(e))}const{request:A}=e;const{protocol:r}=I(A);switch(r){case"about:":{return Promise.resolve(s("about scheme is not supported"))}case"blob:":{if(!Qe){Qe=t(181).resolveObjectURL}const e=I(A);if(e.search.length!==0){return Promise.resolve(s("NetworkError when attempting to fetch resource."))}const r=Qe(e.toString());if(A.method!=="GET"||!F(r)){return Promise.resolve(s("invalid method"))}const o=q(r);const n=o[0];const a=M(`${n.length}`);const c=o[1]??"";const g=i({statusText:"OK",headersList:[["content-length",{name:"Content-Length",value:a}],["content-type",{name:"Content-Type",value:c}]]});g.body=n;return Promise.resolve(g)}case"data:":{const e=I(A);const t=ae(e);if(t==="failure"){return Promise.resolve(s("failed to fetch the data URL"))}const r=ce(t.mimeType);return Promise.resolve(i({statusText:"OK",headersList:[["content-type",{name:"Content-Type",value:r}]],body:q(t.body)[0]}))}case"file:":{return Promise.resolve(s("not implemented... yet..."))}case"http:":case"https:":{return httpFetch(e).catch((e=>s(e)))}default:{return Promise.resolve(s("unknown scheme"))}}}function finalizeResponse(e,A){e.request.done=true;if(e.processResponseDone!=null){queueMicrotask((()=>e.processResponseDone(A)))}}function fetchFinale(e,A){if(A.type==="error"){A.urlList=[e.request.urlList[0]];A.timingInfo=y({startTime:e.timingInfo.startTime})}const processResponseEndOfBody=()=>{e.request.done=true;if(e.processResponseEndOfBody!=null){queueMicrotask((()=>e.processResponseEndOfBody(A)))}};if(e.processResponse!=null){queueMicrotask((()=>e.processResponse(A)))}if(A.body==null){processResponseEndOfBody()}else{const identityTransformAlgorithm=(e,A)=>{A.enqueue(e)};const e=new ge({start(){},transform:identityTransformAlgorithm,flush:processResponseEndOfBody},{size(){return 1}},{size(){return 1}});A.body={stream:A.body.stream.pipeThrough(e)}}if(e.processResponseConsumeBody!=null){const processBody=t=>e.processResponseConsumeBody(A,t);const processBodyError=t=>e.processResponseConsumeBody(A,t);if(A.body==null){queueMicrotask((()=>processBody(null)))}else{return L(A.body,processBody,processBodyError)}return Promise.resolve()}}async function httpFetch(e){const A=e.request;let t=null;let r=null;const o=e.timingInfo;if(A.serviceWorkers==="all"){}if(t===null){if(A.redirect==="follow"){A.serviceWorkers="none"}r=t=await httpNetworkOrCacheFetch(e);if(A.responseTainting==="cors"&&b(A,t)==="failure"){return s("cors failure")}if(C(A,t)==="failure"){A.timingAllowFailed=true}}if((A.responseTainting==="opaque"||t.type==="opaque")&&R(A.origin,A.client,A.destination,r)==="blocked"){return s("blocked")}if(W.has(r.status)){if(A.redirect!=="manual"){e.controller.connection.destroy()}if(A.redirect==="error"){t=s("unexpected redirect")}else if(A.redirect==="manual"){t=r}else if(A.redirect==="follow"){t=await httpRedirectFetch(e,t)}else{V(false)}}t.timingInfo=o;return t}function httpRedirectFetch(e,A){const t=e.request;const r=A.internalResponse?A.internalResponse:A;let o;try{o=B(r,I(t).hash);if(o==null){return A}}catch(e){return Promise.resolve(s(e))}if(!O(o)){return Promise.resolve(s("URL scheme must be a HTTP(S) scheme"))}if(t.redirectCount===20){return Promise.resolve(s("redirect count exceeded"))}t.redirectCount+=1;if(t.mode==="cors"&&(o.username||o.password)&&!T(t,o)){return Promise.resolve(s('cross origin not allowed for request mode "cors"'))}if(t.responseTainting==="cors"&&(o.username||o.password)){return Promise.resolve(s('URL cannot contain credentials for request mode "cors"'))}if(r.status!==303&&t.body!=null&&t.body.source==null){return Promise.resolve(s())}if([301,302].includes(r.status)&&t.method==="POST"||r.status===303&&!he.includes(t.method)){t.method="GET";t.body=null;for(const e of Z){t.headersList.delete(e)}}if(!T(I(t),o)){t.headersList.delete("authorization");t.headersList.delete("proxy-authorization",true);t.headersList.delete("cookie");t.headersList.delete("host")}if(t.body!=null){V(t.body.source!=null);t.body=q(t.body.source)[0]}const n=e.timingInfo;n.redirectEndTime=n.postRedirectStartTime=D(e.crossOriginIsolatedCapability);if(n.redirectStartTime===0){n.redirectStartTime=n.startTime}t.urlList.push(o);p(t,r);return mainFetch(e,true)}async function httpNetworkOrCacheFetch(e,A=false,t=false){const r=e.request;let n=null;let i=null;let a=null;const c=null;const l=false;if(r.window==="no-window"&&r.redirect==="error"){n=e;i=r}else{i=g(r);n={...e};n.request=i}const E=r.credentials==="include"||r.credentials==="same-origin"&&r.responseTainting==="basic";const u=i.body?i.body.length:null;let h=null;if(i.body==null&&["POST","PUT"].includes(i.method)){h="0"}if(u!=null){h=M(`${u}`)}if(h!=null){i.headersList.append("content-length",h)}if(u!=null&&i.keepalive){}if(i.referrer instanceof URL){i.headersList.append("referer",M(i.referrer.href))}d(i);w(i);if(!i.headersList.contains("user-agent")){i.headersList.append("user-agent",typeof esbuildDetection==="undefined"?"undici":"node")}if(i.cache==="default"&&(i.headersList.contains("if-modified-since")||i.headersList.contains("if-none-match")||i.headersList.contains("if-unmodified-since")||i.headersList.contains("if-match")||i.headersList.contains("if-range"))){i.cache="no-store"}if(i.cache==="no-cache"&&!i.preventNoCacheCacheControlHeaderModification&&!i.headersList.contains("cache-control")){i.headersList.append("cache-control","max-age=0")}if(i.cache==="no-store"||i.cache==="reload"){if(!i.headersList.contains("pragma")){i.headersList.append("pragma","no-cache")}if(!i.headersList.contains("cache-control")){i.headersList.append("cache-control","no-cache")}}if(i.headersList.contains("range")){i.headersList.append("accept-encoding","identity")}if(!i.headersList.contains("accept-encoding")){if(P(I(i))){i.headersList.append("accept-encoding","br, gzip, deflate")}else{i.headersList.append("accept-encoding","gzip, deflate")}}i.headersList.delete("host");if(E){}if(c==null){i.cache="no-store"}if(i.mode!=="no-store"&&i.mode!=="reload"){}if(a==null){if(i.mode==="only-if-cached"){return s("only if cached")}const e=await httpNetworkFetch(n,E,t);if(!K.has(i.method)&&e.status>=200&&e.status<=399){}if(l&&e.status===304){}if(a==null){a=e}}a.urlList=[...i.urlList];if(i.headersList.contains("range")){a.rangeRequested=true}a.requestIncludesCredentials=E;if(a.status===407){if(r.window==="no-window"){return s()}if(N(e)){return o(e)}return s("proxy authentication required")}if(a.status===421&&!t&&(r.body==null||r.body.source!=null)){if(N(e)){return o(e)}e.controller.connection.destroy();a=await httpNetworkOrCacheFetch(e,A,true)}if(A){}return a}async function httpNetworkFetch(e,A=false,r=false){V(!e.controller.connection||e.controller.connection.destroyed);e.controller.connection={abort:null,destroyed:false,destroy(e){if(!this.destroyed){this.destroyed=true;this.abort?.(e??new z("The operation was aborted.","AbortError"))}}};const n=e.request;let c=null;const g=e.timingInfo;const E=null;if(E==null){n.cache="no-store"}const u=r?"yes":"no";if(n.mode==="websocket"){}else{}let h=null;if(n.body==null&&e.processRequestEndOfBody){queueMicrotask((()=>e.processRequestEndOfBody()))}else if(n.body!=null){const processBodyChunk=async function*(A){if(N(e)){return}yield A;e.processRequestBodyChunkLength?.(A.byteLength)};const processEndOfBody=()=>{if(N(e)){return}if(e.processRequestEndOfBody){e.processRequestEndOfBody()}};const processBodyError=A=>{if(N(e)){return}if(A.name==="AbortError"){e.controller.abort()}else{e.controller.terminate(A)}};h=async function*(){try{for await(const e of n.body.stream){yield*processBodyChunk(e)}processEndOfBody()}catch(e){processBodyError(e)}}()}try{const{body:A,status:t,statusText:r,headersList:s,socket:o}=await dispatch({body:h});if(o){c=i({status:t,statusText:r,headersList:s,socket:o})}else{const o=A[Symbol.asyncIterator]();e.controller.next=()=>o.next();c=i({status:t,statusText:r,headersList:s})}}catch(A){if(A.name==="AbortError"){e.controller.connection.destroy();return o(e,A)}return s(A)}const pullAlgorithm=()=>{e.controller.resume()};const cancelAlgorithm=A=>{e.controller.abort(A)};if(!Ce){Ce=t(3774).ReadableStream}const Q=new Ce({async start(A){e.controller.controller=A},async pull(e){await pullAlgorithm(e)},async cancel(e){await cancelAlgorithm(e)}},{highWaterMark:0,size(){return 1}});c.body={stream:Q};e.controller.on("terminated",onAborted);e.controller.resume=async()=>{while(true){let A;let t;try{const{done:t,value:r}=await e.controller.next();if(U(e)){break}A=t?undefined:r}catch(r){if(e.controller.ended&&!g.encodedBodySize){A=undefined}else{A=r;t=true}}if(A===undefined){G(e.controller.controller);finalizeResponse(e,c);return}g.decodedBodySize+=A?.byteLength??0;if(t){e.controller.terminate(A);return}e.controller.controller.enqueue(new Uint8Array(A));if(se(Q)){e.controller.terminate();return}if(!e.controller.controller.desiredSize){return}}};function onAborted(A){if(U(e)){c.aborted=true;if(oe(Q)){e.controller.controller.error(e.controller.serializedAbortReason)}}else{if(oe(Q)){e.controller.controller.error(new TypeError("terminated",{cause:v(A)?A:undefined}))}}e.controller.connection.destroy()}return c;async function dispatch({body:A}){const t=I(n);const r=e.controller.dispatcher;return new Promise(((s,o)=>r.dispatch({path:t.pathname+t.search,origin:t.origin,method:n.method,body:e.controller.dispatcher.isMockActive?n.body&&(n.body.source||n.body.stream):A,headers:n.headersList.entries,maxRedirections:0,upgrade:n.mode==="websocket"?"websocket":undefined},{body:null,abort:null,onConnect(A){const{connection:t}=e.controller;if(t.destroyed){A(new z("The operation was aborted.","AbortError"))}else{e.controller.on("terminated",A);this.abort=t.abort=A}},onHeaders(e,A,t,r){if(e<200){return}let o=[];let i="";const c=new a;if(Array.isArray(A)){for(let e=0;ee.trim()))}else if(t.toLowerCase()==="location"){i=r}c[$].append(t,r)}}else{const e=Object.keys(A);for(const t of e){const e=A[t];if(t.toLowerCase()==="content-encoding"){o=e.toLowerCase().split(",").map((e=>e.trim())).reverse()}else if(t.toLowerCase()==="location"){i=e}c[$].append(t,e)}}this.body=new Ae({read:t});const g=[];const E=n.redirect==="follow"&&i&&W.has(e);if(n.method!=="HEAD"&&n.method!=="CONNECT"&&!j.includes(e)&&!E){for(const e of o){if(e==="x-gzip"||e==="gzip"){g.push(l.createGunzip({flush:l.constants.Z_SYNC_FLUSH,finishFlush:l.constants.Z_SYNC_FLUSH}))}else if(e==="deflate"){g.push(l.createInflate())}else if(e==="br"){g.push(l.createBrotliDecompress())}else{g.length=0;break}}}s({status:e,statusText:r,headersList:c[$],body:g.length?te(this.body,...g,(()=>{})):this.body.on("error",(()=>{}))});return true},onData(A){if(e.controller.dump){return}const t=A;g.encodedBodySize+=t.byteLength;return this.body.push(t)},onComplete(){if(this.abort){e.controller.off("terminated",this.abort)}e.controller.ended=true;this.body.push(null)},onError(A){if(this.abort){e.controller.off("terminated",this.abort)}this.body?.destroy(A);e.controller.terminate(A);o(A)},onUpgrade(e,A,t){if(e!==101){return}const r=new a;for(let e=0;e{"use strict";const{extractBody:r,mixinBody:s,cloneBody:o}=t(8923);const{Headers:n,fill:i,HeadersList:a}=t(6349);const{FinalizationRegistry:c}=t(3194)();const g=t(3440);const{isValidHTTPToken:l,sameOrigin:E,normalizeMethod:u,makePolicyContainer:h,normalizeMethodRecord:Q}=t(5523);const{forbiddenMethodsSet:C,corsSafeListedMethodsSet:d,referrerPolicy:B,requestRedirect:I,requestMode:p,requestCredentials:m,requestCache:y,requestDuplex:w}=t(7326);const{kEnumerableProperty:b}=g;const{kHeaders:R,kSignal:k,kState:D,kGuard:S,kRealm:F}=t(9710);const{webidl:T}=t(4222);const{getGlobalOrigin:N}=t(5628);const{URLSerializer:U}=t(4322);const{kHeadersList:v,kConstruct:L}=t(6443);const G=t(2613);const{getMaxListeners:M,setMaxListeners:_,getEventListeners:O,defaultMaxListeners:P}=t(4434);let H=globalThis.TransformStream;const Y=Symbol("abortController");const J=new c((({signal:e,abort:A})=>{e.removeEventListener("abort",A)}));class Request{constructor(e,A={}){if(e===L){return}T.argumentLengthCheck(arguments,1,{header:"Request constructor"});e=T.converters.RequestInfo(e);A=T.converters.RequestInit(A);this[F]={settingsObject:{baseUrl:N(),get origin(){return this.baseUrl?.origin},policyContainer:h()}};let s=null;let o=null;const c=this[F].settingsObject.baseUrl;let B=null;if(typeof e==="string"){let A;try{A=new URL(e,c)}catch(A){throw new TypeError("Failed to parse URL from "+e,{cause:A})}if(A.username||A.password){throw new TypeError("Request cannot be constructed from a URL that includes credentials: "+e)}s=makeRequest({urlList:[A]});o="cors"}else{G(e instanceof Request);s=e[D];B=e[k]}const I=this[F].settingsObject.origin;let p="client";if(s.window?.constructor?.name==="EnvironmentSettingsObject"&&E(s.window,I)){p=s.window}if(A.window!=null){throw new TypeError(`'window' option '${p}' must be null`)}if("window"in A){p="no-window"}s=makeRequest({method:s.method,headersList:s.headersList,unsafeRequest:s.unsafeRequest,client:this[F].settingsObject,window:p,priority:s.priority,origin:s.origin,referrer:s.referrer,referrerPolicy:s.referrerPolicy,mode:s.mode,credentials:s.credentials,cache:s.cache,redirect:s.redirect,integrity:s.integrity,keepalive:s.keepalive,reloadNavigation:s.reloadNavigation,historyNavigation:s.historyNavigation,urlList:[...s.urlList]});const m=Object.keys(A).length!==0;if(m){if(s.mode==="navigate"){s.mode="same-origin"}s.reloadNavigation=false;s.historyNavigation=false;s.origin="client";s.referrer="client";s.referrerPolicy="";s.url=s.urlList[s.urlList.length-1];s.urlList=[s.url]}if(A.referrer!==undefined){const e=A.referrer;if(e===""){s.referrer="no-referrer"}else{let A;try{A=new URL(e,c)}catch(A){throw new TypeError(`Referrer "${e}" is not a valid URL.`,{cause:A})}if(A.protocol==="about:"&&A.hostname==="client"||I&&!E(A,this[F].settingsObject.baseUrl)){s.referrer="client"}else{s.referrer=A}}}if(A.referrerPolicy!==undefined){s.referrerPolicy=A.referrerPolicy}let y;if(A.mode!==undefined){y=A.mode}else{y=o}if(y==="navigate"){throw T.errors.exception({header:"Request constructor",message:"invalid request mode navigate."})}if(y!=null){s.mode=y}if(A.credentials!==undefined){s.credentials=A.credentials}if(A.cache!==undefined){s.cache=A.cache}if(s.cache==="only-if-cached"&&s.mode!=="same-origin"){throw new TypeError("'only-if-cached' can be set only with 'same-origin' mode")}if(A.redirect!==undefined){s.redirect=A.redirect}if(A.integrity!=null){s.integrity=String(A.integrity)}if(A.keepalive!==undefined){s.keepalive=Boolean(A.keepalive)}if(A.method!==undefined){let e=A.method;if(!l(e)){throw new TypeError(`'${e}' is not a valid HTTP method.`)}if(C.has(e.toUpperCase())){throw new TypeError(`'${e}' HTTP method is unsupported.`)}e=Q[e]??u(e);s.method=e}if(A.signal!==undefined){B=A.signal}this[D]=s;const w=new AbortController;this[k]=w.signal;this[k][F]=this[F];if(B!=null){if(!B||typeof B.aborted!=="boolean"||typeof B.addEventListener!=="function"){throw new TypeError("Failed to construct 'Request': member signal is not of type AbortSignal.")}if(B.aborted){w.abort(B.reason)}else{this[Y]=w;const e=new WeakRef(w);const abort=function(){const A=e.deref();if(A!==undefined){A.abort(this.reason)}};try{if(typeof M==="function"&&M(B)===P){_(100,B)}else if(O(B,"abort").length>=P){_(100,B)}}catch{}g.addAbortListener(B,abort);J.register(w,{signal:B,abort:abort})}}this[R]=new n(L);this[R][v]=s.headersList;this[R][S]="request";this[R][F]=this[F];if(y==="no-cors"){if(!d.has(s.method)){throw new TypeError(`'${s.method} is unsupported in no-cors mode.`)}this[R][S]="request-no-cors"}if(m){const e=this[R][v];const t=A.headers!==undefined?A.headers:new a(e);e.clear();if(t instanceof a){for(const[A,r]of t){e.append(A,r)}e.cookies=t.cookies}else{i(this[R],t)}}const b=e instanceof Request?e[D].body:null;if((A.body!=null||b!=null)&&(s.method==="GET"||s.method==="HEAD")){throw new TypeError("Request with GET/HEAD method cannot have body.")}let U=null;if(A.body!=null){const[e,t]=r(A.body,s.keepalive);U=e;if(t&&!this[R][v].contains("content-type")){this[R].append("content-type",t)}}const x=U??b;if(x!=null&&x.source==null){if(U!=null&&A.duplex==null){throw new TypeError("RequestInit: duplex option is required when sending a body.")}if(s.mode!=="same-origin"&&s.mode!=="cors"){throw new TypeError('If request is made from ReadableStream, mode should be "same-origin" or "cors"')}s.useCORSPreflightFlag=true}let V=x;if(U==null&&b!=null){if(g.isDisturbed(b.stream)||b.stream.locked){throw new TypeError("Cannot construct a Request with a Request object that has already been used.")}if(!H){H=t(3774).TransformStream}const e=new H;b.stream.pipeThrough(e);V={source:b.source,length:b.length,stream:e.readable}}this[D].body=V}get method(){T.brandCheck(this,Request);return this[D].method}get url(){T.brandCheck(this,Request);return U(this[D].url)}get headers(){T.brandCheck(this,Request);return this[R]}get destination(){T.brandCheck(this,Request);return this[D].destination}get referrer(){T.brandCheck(this,Request);if(this[D].referrer==="no-referrer"){return""}if(this[D].referrer==="client"){return"about:client"}return this[D].referrer.toString()}get referrerPolicy(){T.brandCheck(this,Request);return this[D].referrerPolicy}get mode(){T.brandCheck(this,Request);return this[D].mode}get credentials(){return this[D].credentials}get cache(){T.brandCheck(this,Request);return this[D].cache}get redirect(){T.brandCheck(this,Request);return this[D].redirect}get integrity(){T.brandCheck(this,Request);return this[D].integrity}get keepalive(){T.brandCheck(this,Request);return this[D].keepalive}get isReloadNavigation(){T.brandCheck(this,Request);return this[D].reloadNavigation}get isHistoryNavigation(){T.brandCheck(this,Request);return this[D].historyNavigation}get signal(){T.brandCheck(this,Request);return this[k]}get body(){T.brandCheck(this,Request);return this[D].body?this[D].body.stream:null}get bodyUsed(){T.brandCheck(this,Request);return!!this[D].body&&g.isDisturbed(this[D].body.stream)}get duplex(){T.brandCheck(this,Request);return"half"}clone(){T.brandCheck(this,Request);if(this.bodyUsed||this.body?.locked){throw new TypeError("unusable")}const e=cloneRequest(this[D]);const A=new Request(L);A[D]=e;A[F]=this[F];A[R]=new n(L);A[R][v]=e.headersList;A[R][S]=this[R][S];A[R][F]=this[R][F];const t=new AbortController;if(this.signal.aborted){t.abort(this.signal.reason)}else{g.addAbortListener(this.signal,(()=>{t.abort(this.signal.reason)}))}A[k]=t.signal;return A}}s(Request);function makeRequest(e){const A={method:"GET",localURLsOnly:false,unsafeRequest:false,body:null,client:null,reservedClient:null,replacesClientId:"",window:"client",keepalive:false,serviceWorkers:"all",initiator:"",destination:"",priority:null,origin:"client",policyContainer:"client",referrer:"client",referrerPolicy:"",mode:"no-cors",useCORSPreflightFlag:false,credentials:"same-origin",useCredentials:false,cache:"default",redirect:"follow",integrity:"",cryptoGraphicsNonceMetadata:"",parserMetadata:"",reloadNavigation:false,historyNavigation:false,userActivation:false,taintedOrigin:false,redirectCount:0,responseTainting:"basic",preventNoCacheCacheControlHeaderModification:false,done:false,timingAllowFailed:false,...e,headersList:e.headersList?new a(e.headersList):new a};A.url=A.urlList[0];return A}function cloneRequest(e){const A=makeRequest({...e,body:null});if(e.body!=null){A.body=o(e.body)}return A}Object.defineProperties(Request.prototype,{method:b,url:b,headers:b,redirect:b,clone:b,signal:b,duplex:b,destination:b,body:b,bodyUsed:b,isHistoryNavigation:b,isReloadNavigation:b,keepalive:b,integrity:b,cache:b,credentials:b,attribute:b,referrerPolicy:b,referrer:b,mode:b,[Symbol.toStringTag]:{value:"Request",configurable:true}});T.converters.Request=T.interfaceConverter(Request);T.converters.RequestInfo=function(e){if(typeof e==="string"){return T.converters.USVString(e)}if(e instanceof Request){return T.converters.Request(e)}return T.converters.USVString(e)};T.converters.AbortSignal=T.interfaceConverter(AbortSignal);T.converters.RequestInit=T.dictionaryConverter([{key:"method",converter:T.converters.ByteString},{key:"headers",converter:T.converters.HeadersInit},{key:"body",converter:T.nullableConverter(T.converters.BodyInit)},{key:"referrer",converter:T.converters.USVString},{key:"referrerPolicy",converter:T.converters.DOMString,allowedValues:B},{key:"mode",converter:T.converters.DOMString,allowedValues:p},{key:"credentials",converter:T.converters.DOMString,allowedValues:m},{key:"cache",converter:T.converters.DOMString,allowedValues:y},{key:"redirect",converter:T.converters.DOMString,allowedValues:I},{key:"integrity",converter:T.converters.DOMString},{key:"keepalive",converter:T.converters.boolean},{key:"signal",converter:T.nullableConverter((e=>T.converters.AbortSignal(e,{strict:false})))},{key:"window",converter:T.converters.any},{key:"duplex",converter:T.converters.DOMString,allowedValues:w}]);e.exports={Request:Request,makeRequest:makeRequest}},8676:(e,A,t)=>{"use strict";const{Headers:r,HeadersList:s,fill:o}=t(6349);const{extractBody:n,cloneBody:i,mixinBody:a}=t(8923);const c=t(3440);const{kEnumerableProperty:g}=c;const{isValidReasonPhrase:l,isCancelled:E,isAborted:u,isBlobLike:h,serializeJavascriptValueToJSONString:Q,isErrorLike:C,isomorphicEncode:d}=t(5523);const{redirectStatusSet:B,nullBodyStatus:I,DOMException:p}=t(7326);const{kState:m,kHeaders:y,kGuard:w,kRealm:b}=t(9710);const{webidl:R}=t(4222);const{FormData:k}=t(3073);const{getGlobalOrigin:D}=t(5628);const{URLSerializer:S}=t(4322);const{kHeadersList:F,kConstruct:T}=t(6443);const N=t(2613);const{types:U}=t(9023);const v=globalThis.ReadableStream||t(3774).ReadableStream;const L=new TextEncoder("utf-8");class Response{static error(){const e={settingsObject:{}};const A=new Response;A[m]=makeNetworkError();A[b]=e;A[y][F]=A[m].headersList;A[y][w]="immutable";A[y][b]=e;return A}static json(e,A={}){R.argumentLengthCheck(arguments,1,{header:"Response.json"});if(A!==null){A=R.converters.ResponseInit(A)}const t=L.encode(Q(e));const r=n(t);const s={settingsObject:{}};const o=new Response;o[b]=s;o[y][w]="response";o[y][b]=s;initializeResponse(o,A,{body:r[0],type:"application/json"});return o}static redirect(e,A=302){const t={settingsObject:{}};R.argumentLengthCheck(arguments,1,{header:"Response.redirect"});e=R.converters.USVString(e);A=R.converters["unsigned short"](A);let r;try{r=new URL(e,D())}catch(A){throw Object.assign(new TypeError("Failed to parse URL from "+e),{cause:A})}if(!B.has(A)){throw new RangeError("Invalid status code "+A)}const s=new Response;s[b]=t;s[y][w]="immutable";s[y][b]=t;s[m].status=A;const o=d(S(r));s[m].headersList.append("location",o);return s}constructor(e=null,A={}){if(e!==null){e=R.converters.BodyInit(e)}A=R.converters.ResponseInit(A);this[b]={settingsObject:{}};this[m]=makeResponse({});this[y]=new r(T);this[y][w]="response";this[y][F]=this[m].headersList;this[y][b]=this[b];let t=null;if(e!=null){const[A,r]=n(e);t={body:A,type:r}}initializeResponse(this,A,t)}get type(){R.brandCheck(this,Response);return this[m].type}get url(){R.brandCheck(this,Response);const e=this[m].urlList;const A=e[e.length-1]??null;if(A===null){return""}return S(A,true)}get redirected(){R.brandCheck(this,Response);return this[m].urlList.length>1}get status(){R.brandCheck(this,Response);return this[m].status}get ok(){R.brandCheck(this,Response);return this[m].status>=200&&this[m].status<=299}get statusText(){R.brandCheck(this,Response);return this[m].statusText}get headers(){R.brandCheck(this,Response);return this[y]}get body(){R.brandCheck(this,Response);return this[m].body?this[m].body.stream:null}get bodyUsed(){R.brandCheck(this,Response);return!!this[m].body&&c.isDisturbed(this[m].body.stream)}clone(){R.brandCheck(this,Response);if(this.bodyUsed||this.body&&this.body.locked){throw R.errors.exception({header:"Response.clone",message:"Body has already been consumed."})}const e=cloneResponse(this[m]);const A=new Response;A[m]=e;A[b]=this[b];A[y][F]=e.headersList;A[y][w]=this[y][w];A[y][b]=this[y][b];return A}}a(Response);Object.defineProperties(Response.prototype,{type:g,url:g,status:g,ok:g,redirected:g,statusText:g,headers:g,clone:g,body:g,bodyUsed:g,[Symbol.toStringTag]:{value:"Response",configurable:true}});Object.defineProperties(Response,{json:g,redirect:g,error:g});function cloneResponse(e){if(e.internalResponse){return filterResponse(cloneResponse(e.internalResponse),e.type)}const A=makeResponse({...e,body:null});if(e.body!=null){A.body=i(e.body)}return A}function makeResponse(e){return{aborted:false,rangeRequested:false,timingAllowPassed:false,requestIncludesCredentials:false,type:"default",status:200,timingInfo:null,cacheState:"",statusText:"",...e,headersList:e.headersList?new s(e.headersList):new s,urlList:e.urlList?[...e.urlList]:[]}}function makeNetworkError(e){const A=C(e);return makeResponse({type:"error",status:0,error:A?e:new Error(e?String(e):e),aborted:e&&e.name==="AbortError"})}function makeFilteredResponse(e,A){A={internalResponse:e,...A};return new Proxy(e,{get(e,t){return t in A?A[t]:e[t]},set(e,t,r){N(!(t in A));e[t]=r;return true}})}function filterResponse(e,A){if(A==="basic"){return makeFilteredResponse(e,{type:"basic",headersList:e.headersList})}else if(A==="cors"){return makeFilteredResponse(e,{type:"cors",headersList:e.headersList})}else if(A==="opaque"){return makeFilteredResponse(e,{type:"opaque",urlList:Object.freeze([]),status:0,statusText:"",body:null})}else if(A==="opaqueredirect"){return makeFilteredResponse(e,{type:"opaqueredirect",status:0,statusText:"",headersList:[],body:null})}else{N(false)}}function makeAppropriateNetworkError(e,A=null){N(E(e));return u(e)?makeNetworkError(Object.assign(new p("The operation was aborted.","AbortError"),{cause:A})):makeNetworkError(Object.assign(new p("Request was cancelled."),{cause:A}))}function initializeResponse(e,A,t){if(A.status!==null&&(A.status<200||A.status>599)){throw new RangeError('init["status"] must be in the range of 200 to 599, inclusive.')}if("statusText"in A&&A.statusText!=null){if(!l(String(A.statusText))){throw new TypeError("Invalid statusText")}}if("status"in A&&A.status!=null){e[m].status=A.status}if("statusText"in A&&A.statusText!=null){e[m].statusText=A.statusText}if("headers"in A&&A.headers!=null){o(e[y],A.headers)}if(t){if(I.includes(e.status)){throw R.errors.exception({header:"Response constructor",message:"Invalid response status code "+e.status})}e[m].body=t.body;if(t.type!=null&&!e[m].headersList.contains("Content-Type")){e[m].headersList.append("content-type",t.type)}}}R.converters.ReadableStream=R.interfaceConverter(v);R.converters.FormData=R.interfaceConverter(k);R.converters.URLSearchParams=R.interfaceConverter(URLSearchParams);R.converters.XMLHttpRequestBodyInit=function(e){if(typeof e==="string"){return R.converters.USVString(e)}if(h(e)){return R.converters.Blob(e,{strict:false})}if(U.isArrayBuffer(e)||U.isTypedArray(e)||U.isDataView(e)){return R.converters.BufferSource(e)}if(c.isFormDataLike(e)){return R.converters.FormData(e,{strict:false})}if(e instanceof URLSearchParams){return R.converters.URLSearchParams(e)}return R.converters.DOMString(e)};R.converters.BodyInit=function(e){if(e instanceof v){return R.converters.ReadableStream(e)}if(e?.[Symbol.asyncIterator]){return e}return R.converters.XMLHttpRequestBodyInit(e)};R.converters.ResponseInit=R.dictionaryConverter([{key:"status",converter:R.converters["unsigned short"],defaultValue:200},{key:"statusText",converter:R.converters.ByteString,defaultValue:""},{key:"headers",converter:R.converters.HeadersInit}]);e.exports={makeNetworkError:makeNetworkError,makeResponse:makeResponse,makeAppropriateNetworkError:makeAppropriateNetworkError,filterResponse:filterResponse,Response:Response,cloneResponse:cloneResponse}},9710:e=>{"use strict";e.exports={kUrl:Symbol("url"),kHeaders:Symbol("headers"),kSignal:Symbol("signal"),kState:Symbol("state"),kGuard:Symbol("guard"),kRealm:Symbol("realm")}},5523:(e,A,t)=>{"use strict";const{redirectStatusSet:r,referrerPolicySet:s,badPortsSet:o}=t(7326);const{getGlobalOrigin:n}=t(5628);const{performance:i}=t(2987);const{isBlobLike:a,toUSVString:c,ReadableStreamFrom:g}=t(3440);const l=t(2613);const{isUint8Array:E}=t(8253);let u=[];let h;try{h=t(6982);const e=["sha256","sha384","sha512"];u=h.getHashes().filter((A=>e.includes(A)))}catch{}function responseURL(e){const A=e.urlList;const t=A.length;return t===0?null:A[t-1].toString()}function responseLocationURL(e,A){if(!r.has(e.status)){return null}let t=e.headersList.get("location");if(t!==null&&isValidHeaderValue(t)){t=new URL(t,responseURL(e))}if(t&&!t.hash){t.hash=A}return t}function requestCurrentURL(e){return e.urlList[e.urlList.length-1]}function requestBadPort(e){const A=requestCurrentURL(e);if(urlIsHttpHttpsScheme(A)&&o.has(A.port)){return"blocked"}return"allowed"}function isErrorLike(e){return e instanceof Error||(e?.constructor?.name==="Error"||e?.constructor?.name==="DOMException")}function isValidReasonPhrase(e){for(let A=0;A=32&&t<=126||t>=128&&t<=255)){return false}}return true}function isTokenCharCode(e){switch(e){case 34:case 40:case 41:case 44:case 47:case 58:case 59:case 60:case 61:case 62:case 63:case 64:case 91:case 92:case 93:case 123:case 125:return false;default:return e>=33&&e<=126}}function isValidHTTPToken(e){if(e.length===0){return false}for(let A=0;A0){for(let e=r.length;e!==0;e--){const A=r[e-1].trim();if(s.has(A)){o=A;break}}}if(o!==""){e.referrerPolicy=o}}function crossOriginResourcePolicyCheck(){return"allowed"}function corsCheck(){return"success"}function TAOCheck(){return"success"}function appendFetchMetadata(e){let A=null;A=e.mode;e.headersList.set("sec-fetch-mode",A)}function appendRequestOriginHeader(e){let A=e.origin;if(e.responseTainting==="cors"||e.mode==="websocket"){if(A){e.headersList.append("origin",A)}}else if(e.method!=="GET"&&e.method!=="HEAD"){switch(e.referrerPolicy){case"no-referrer":A=null;break;case"no-referrer-when-downgrade":case"strict-origin":case"strict-origin-when-cross-origin":if(e.origin&&urlHasHttpsScheme(e.origin)&&!urlHasHttpsScheme(requestCurrentURL(e))){A=null}break;case"same-origin":if(!sameOrigin(e,requestCurrentURL(e))){A=null}break;default:}if(A){e.headersList.append("origin",A)}}}function coarsenedSharedCurrentTime(e){return i.now()}function createOpaqueTimingInfo(e){return{startTime:e.startTime??0,redirectStartTime:0,redirectEndTime:0,postRedirectStartTime:e.startTime??0,finalServiceWorkerStartTime:0,finalNetworkResponseStartTime:0,finalNetworkRequestStartTime:0,endTime:0,encodedBodySize:0,decodedBodySize:0,finalConnectionTimingInfo:null}}function makePolicyContainer(){return{referrerPolicy:"strict-origin-when-cross-origin"}}function clonePolicyContainer(e){return{referrerPolicy:e.referrerPolicy}}function determineRequestsReferrer(e){const A=e.referrerPolicy;l(A);let t=null;if(e.referrer==="client"){const e=n();if(!e||e.origin==="null"){return"no-referrer"}t=new URL(e)}else if(e.referrer instanceof URL){t=e.referrer}let r=stripURLForReferrer(t);const s=stripURLForReferrer(t,true);if(r.toString().length>4096){r=s}const o=sameOrigin(e,r);const i=isURLPotentiallyTrustworthy(r)&&!isURLPotentiallyTrustworthy(e.url);switch(A){case"origin":return s!=null?s:stripURLForReferrer(t,true);case"unsafe-url":return r;case"same-origin":return o?s:"no-referrer";case"origin-when-cross-origin":return o?r:s;case"strict-origin-when-cross-origin":{const A=requestCurrentURL(e);if(sameOrigin(r,A)){return r}if(isURLPotentiallyTrustworthy(r)&&!isURLPotentiallyTrustworthy(A)){return"no-referrer"}return s}case"strict-origin":case"no-referrer-when-downgrade":default:return i?"no-referrer":s}}function stripURLForReferrer(e,A){l(e instanceof URL);if(e.protocol==="file:"||e.protocol==="about:"||e.protocol==="blank:"){return"no-referrer"}e.username="";e.password="";e.hash="";if(A){e.pathname="";e.search=""}return e}function isURLPotentiallyTrustworthy(e){if(!(e instanceof URL)){return false}if(e.href==="about:blank"||e.href==="about:srcdoc"){return true}if(e.protocol==="data:")return true;if(e.protocol==="file:")return true;return isOriginPotentiallyTrustworthy(e.origin);function isOriginPotentiallyTrustworthy(e){if(e==null||e==="null")return false;const A=new URL(e);if(A.protocol==="https:"||A.protocol==="wss:"){return true}if(/^127(?:\.[0-9]+){0,2}\.[0-9]+$|^\[(?:0*:)*?:?0*1\]$/.test(A.hostname)||(A.hostname==="localhost"||A.hostname.includes("localhost."))||A.hostname.endsWith(".localhost")){return true}return false}}function bytesMatch(e,A){if(h===undefined){return true}const t=parseMetadata(A);if(t==="no metadata"){return true}if(t.length===0){return true}const r=getStrongestMetadata(t);const s=filterMetadataListByAlgorithm(t,r);for(const A of s){const t=A.algo;const r=A.hash;let s=h.createHash(t).update(e).digest("base64");if(s[s.length-1]==="="){if(s[s.length-2]==="="){s=s.slice(0,-2)}else{s=s.slice(0,-1)}}if(compareBase64Mixed(s,r)){return true}}return false}const Q=/(?sha256|sha384|sha512)-((?[A-Za-z0-9+/]+|[A-Za-z0-9_-]+)={0,2}(?:\s|$)( +[!-~]*)?)?/i;function parseMetadata(e){const A=[];let t=true;for(const r of e.split(" ")){t=false;const e=Q.exec(r);if(e===null||e.groups===undefined||e.groups.algo===undefined){continue}const s=e.groups.algo.toLowerCase();if(u.includes(s)){A.push(e.groups)}}if(t===true){return"no metadata"}return A}function getStrongestMetadata(e){let A=e[0].algo;if(A[3]==="5"){return A}for(let t=1;t{e=t;A=r}));return{promise:t,resolve:e,reject:A}}function isAborted(e){return e.controller.state==="aborted"}function isCancelled(e){return e.controller.state==="aborted"||e.controller.state==="terminated"}const C={delete:"DELETE",DELETE:"DELETE",get:"GET",GET:"GET",head:"HEAD",HEAD:"HEAD",options:"OPTIONS",OPTIONS:"OPTIONS",post:"POST",POST:"POST",put:"PUT",PUT:"PUT"};Object.setPrototypeOf(C,null);function normalizeMethod(e){return C[e.toLowerCase()]??e}function serializeJavascriptValueToJSONString(e){const A=JSON.stringify(e);if(A===undefined){throw new TypeError("Value is not JSON serializable")}l(typeof A==="string");return A}const d=Object.getPrototypeOf(Object.getPrototypeOf([][Symbol.iterator]()));function makeIterator(e,A,t){const r={index:0,kind:t,target:e};const s={next(){if(Object.getPrototypeOf(this)!==s){throw new TypeError(`'next' called on an object that does not implement interface ${A} Iterator.`)}const{index:e,kind:t,target:o}=r;const n=o();const i=n.length;if(e>=i){return{value:undefined,done:true}}const a=n[e];r.index=e+1;return iteratorResult(a,t)},[Symbol.toStringTag]:`${A} Iterator`};Object.setPrototypeOf(s,d);return Object.setPrototypeOf({},s)}function iteratorResult(e,A){let t;switch(A){case"key":{t=e[0];break}case"value":{t=e[1];break}case"key+value":{t=e;break}}return{value:t,done:false}}async function fullyReadBody(e,A,t){const r=A;const s=t;let o;try{o=e.stream.getReader()}catch(e){s(e);return}try{const e=await readAllBytes(o);r(e)}catch(e){s(e)}}let B=globalThis.ReadableStream;function isReadableStreamLike(e){if(!B){B=t(3774).ReadableStream}return e instanceof B||e[Symbol.toStringTag]==="ReadableStream"&&typeof e.tee==="function"}const I=65535;function isomorphicDecode(e){if(e.lengthe+String.fromCharCode(A)),"")}function readableStreamClose(e){try{e.close()}catch(e){if(!e.message.includes("Controller is already closed")){throw e}}}function isomorphicEncode(e){for(let A=0;AObject.prototype.hasOwnProperty.call(e,A));e.exports={isAborted:isAborted,isCancelled:isCancelled,createDeferredPromise:createDeferredPromise,ReadableStreamFrom:g,toUSVString:c,tryUpgradeRequestToAPotentiallyTrustworthyURL:tryUpgradeRequestToAPotentiallyTrustworthyURL,coarsenedSharedCurrentTime:coarsenedSharedCurrentTime,determineRequestsReferrer:determineRequestsReferrer,makePolicyContainer:makePolicyContainer,clonePolicyContainer:clonePolicyContainer,appendFetchMetadata:appendFetchMetadata,appendRequestOriginHeader:appendRequestOriginHeader,TAOCheck:TAOCheck,corsCheck:corsCheck,crossOriginResourcePolicyCheck:crossOriginResourcePolicyCheck,createOpaqueTimingInfo:createOpaqueTimingInfo,setRequestReferrerPolicyOnRedirect:setRequestReferrerPolicyOnRedirect,isValidHTTPToken:isValidHTTPToken,requestBadPort:requestBadPort,requestCurrentURL:requestCurrentURL,responseURL:responseURL,responseLocationURL:responseLocationURL,isBlobLike:a,isURLPotentiallyTrustworthy:isURLPotentiallyTrustworthy,isValidReasonPhrase:isValidReasonPhrase,sameOrigin:sameOrigin,normalizeMethod:normalizeMethod,serializeJavascriptValueToJSONString:serializeJavascriptValueToJSONString,makeIterator:makeIterator,isValidHeaderName:isValidHeaderName,isValidHeaderValue:isValidHeaderValue,hasOwn:p,isErrorLike:isErrorLike,fullyReadBody:fullyReadBody,bytesMatch:bytesMatch,isReadableStreamLike:isReadableStreamLike,readableStreamClose:readableStreamClose,isomorphicEncode:isomorphicEncode,isomorphicDecode:isomorphicDecode,urlIsLocal:urlIsLocal,urlHasHttpsScheme:urlHasHttpsScheme,urlIsHttpHttpsScheme:urlIsHttpHttpsScheme,readAllBytes:readAllBytes,normalizeMethodRecord:C,parseMetadata:parseMetadata}},4222:(e,A,t)=>{"use strict";const{types:r}=t(9023);const{hasOwn:s,toUSVString:o}=t(5523);const n={};n.converters={};n.util={};n.errors={};n.errors.exception=function(e){return new TypeError(`${e.header}: ${e.message}`)};n.errors.conversionFailed=function(e){const A=e.types.length===1?"":" one of";const t=`${e.argument} could not be converted to`+`${A}: ${e.types.join(", ")}.`;return n.errors.exception({header:e.prefix,message:t})};n.errors.invalidArgument=function(e){return n.errors.exception({header:e.prefix,message:`"${e.value}" is an invalid ${e.type}.`})};n.brandCheck=function(e,A,t=undefined){if(t?.strict!==false&&!(e instanceof A)){throw new TypeError("Illegal invocation")}else{return e?.[Symbol.toStringTag]===A.prototype[Symbol.toStringTag]}};n.argumentLengthCheck=function({length:e},A,t){if(es){throw n.errors.exception({header:"Integer conversion",message:`Value must be between ${o}-${s}, got ${i}.`})}return i}if(!Number.isNaN(i)&&r.clamp===true){i=Math.min(Math.max(i,o),s);if(Math.floor(i)%2===0){i=Math.floor(i)}else{i=Math.ceil(i)}return i}if(Number.isNaN(i)||i===0&&Object.is(0,i)||i===Number.POSITIVE_INFINITY||i===Number.NEGATIVE_INFINITY){return 0}i=n.util.IntegerPart(i);i=i%Math.pow(2,A);if(t==="signed"&&i>=Math.pow(2,A)-1){return i-Math.pow(2,A)}return i};n.util.IntegerPart=function(e){const A=Math.floor(Math.abs(e));if(e<0){return-1*A}return A};n.sequenceConverter=function(e){return A=>{if(n.util.Type(A)!=="Object"){throw n.errors.exception({header:"Sequence",message:`Value of type ${n.util.Type(A)} is not an Object.`})}const t=A?.[Symbol.iterator]?.();const r=[];if(t===undefined||typeof t.next!=="function"){throw n.errors.exception({header:"Sequence",message:"Object is not an iterator."})}while(true){const{done:A,value:s}=t.next();if(A){break}r.push(e(s))}return r}};n.recordConverter=function(e,A){return t=>{if(n.util.Type(t)!=="Object"){throw n.errors.exception({header:"Record",message:`Value of type ${n.util.Type(t)} is not an Object.`})}const s={};if(!r.isProxy(t)){const r=Object.keys(t);for(const o of r){const r=e(o);const n=A(t[o]);s[r]=n}return s}const o=Reflect.ownKeys(t);for(const r of o){const o=Reflect.getOwnPropertyDescriptor(t,r);if(o?.enumerable){const o=e(r);const n=A(t[r]);s[o]=n}}return s}};n.interfaceConverter=function(e){return(A,t={})=>{if(t.strict!==false&&!(A instanceof e)){throw n.errors.exception({header:e.name,message:`Expected ${A} to be an instance of ${e.name}.`})}return A}};n.dictionaryConverter=function(e){return A=>{const t=n.util.Type(A);const r={};if(t==="Null"||t==="Undefined"){return r}else if(t!=="Object"){throw n.errors.exception({header:"Dictionary",message:`Expected ${A} to be one of: Null, Undefined, Object.`})}for(const t of e){const{key:e,defaultValue:o,required:i,converter:a}=t;if(i===true){if(!s(A,e)){throw n.errors.exception({header:"Dictionary",message:`Missing required key "${e}".`})}}let c=A[e];const g=s(t,"defaultValue");if(g&&c!==null){c=c??o}if(i||g||c!==undefined){c=a(c);if(t.allowedValues&&!t.allowedValues.includes(c)){throw n.errors.exception({header:"Dictionary",message:`${c} is not an accepted type. Expected one of ${t.allowedValues.join(", ")}.`})}r[e]=c}}return r}};n.nullableConverter=function(e){return A=>{if(A===null){return A}return e(A)}};n.converters.DOMString=function(e,A={}){if(e===null&&A.legacyNullToEmptyString){return""}if(typeof e==="symbol"){throw new TypeError("Could not convert argument of type symbol to string.")}return String(e)};n.converters.ByteString=function(e){const A=n.converters.DOMString(e);for(let e=0;e255){throw new TypeError("Cannot convert argument to a ByteString because the character at "+`index ${e} has a value of ${A.charCodeAt(e)} which is greater than 255.`)}}return A};n.converters.USVString=o;n.converters.boolean=function(e){const A=Boolean(e);return A};n.converters.any=function(e){return e};n.converters["long long"]=function(e){const A=n.util.ConvertToInt(e,64,"signed");return A};n.converters["unsigned long long"]=function(e){const A=n.util.ConvertToInt(e,64,"unsigned");return A};n.converters["unsigned long"]=function(e){const A=n.util.ConvertToInt(e,32,"unsigned");return A};n.converters["unsigned short"]=function(e,A){const t=n.util.ConvertToInt(e,16,"unsigned",A);return t};n.converters.ArrayBuffer=function(e,A={}){if(n.util.Type(e)!=="Object"||!r.isAnyArrayBuffer(e)){throw n.errors.conversionFailed({prefix:`${e}`,argument:`${e}`,types:["ArrayBuffer"]})}if(A.allowShared===false&&r.isSharedArrayBuffer(e)){throw n.errors.exception({header:"ArrayBuffer",message:"SharedArrayBuffer is not allowed."})}return e};n.converters.TypedArray=function(e,A,t={}){if(n.util.Type(e)!=="Object"||!r.isTypedArray(e)||e.constructor.name!==A.name){throw n.errors.conversionFailed({prefix:`${A.name}`,argument:`${e}`,types:[A.name]})}if(t.allowShared===false&&r.isSharedArrayBuffer(e.buffer)){throw n.errors.exception({header:"ArrayBuffer",message:"SharedArrayBuffer is not allowed."})}return e};n.converters.DataView=function(e,A={}){if(n.util.Type(e)!=="Object"||!r.isDataView(e)){throw n.errors.exception({header:"DataView",message:"Object is not a DataView."})}if(A.allowShared===false&&r.isSharedArrayBuffer(e.buffer)){throw n.errors.exception({header:"ArrayBuffer",message:"SharedArrayBuffer is not allowed."})}return e};n.converters.BufferSource=function(e,A={}){if(r.isAnyArrayBuffer(e)){return n.converters.ArrayBuffer(e,A)}if(r.isTypedArray(e)){return n.converters.TypedArray(e,e.constructor)}if(r.isDataView(e)){return n.converters.DataView(e,A)}throw new TypeError(`Could not convert ${e} to a BufferSource.`)};n.converters["sequence"]=n.sequenceConverter(n.converters.ByteString);n.converters["sequence>"]=n.sequenceConverter(n.converters["sequence"]);n.converters["record"]=n.recordConverter(n.converters.ByteString,n.converters.ByteString);e.exports={webidl:n}},396:e=>{"use strict";function getEncoding(e){if(!e){return"failure"}switch(e.trim().toLowerCase()){case"unicode-1-1-utf-8":case"unicode11utf8":case"unicode20utf8":case"utf-8":case"utf8":case"x-unicode20utf8":return"UTF-8";case"866":case"cp866":case"csibm866":case"ibm866":return"IBM866";case"csisolatin2":case"iso-8859-2":case"iso-ir-101":case"iso8859-2":case"iso88592":case"iso_8859-2":case"iso_8859-2:1987":case"l2":case"latin2":return"ISO-8859-2";case"csisolatin3":case"iso-8859-3":case"iso-ir-109":case"iso8859-3":case"iso88593":case"iso_8859-3":case"iso_8859-3:1988":case"l3":case"latin3":return"ISO-8859-3";case"csisolatin4":case"iso-8859-4":case"iso-ir-110":case"iso8859-4":case"iso88594":case"iso_8859-4":case"iso_8859-4:1988":case"l4":case"latin4":return"ISO-8859-4";case"csisolatincyrillic":case"cyrillic":case"iso-8859-5":case"iso-ir-144":case"iso8859-5":case"iso88595":case"iso_8859-5":case"iso_8859-5:1988":return"ISO-8859-5";case"arabic":case"asmo-708":case"csiso88596e":case"csiso88596i":case"csisolatinarabic":case"ecma-114":case"iso-8859-6":case"iso-8859-6-e":case"iso-8859-6-i":case"iso-ir-127":case"iso8859-6":case"iso88596":case"iso_8859-6":case"iso_8859-6:1987":return"ISO-8859-6";case"csisolatingreek":case"ecma-118":case"elot_928":case"greek":case"greek8":case"iso-8859-7":case"iso-ir-126":case"iso8859-7":case"iso88597":case"iso_8859-7":case"iso_8859-7:1987":case"sun_eu_greek":return"ISO-8859-7";case"csiso88598e":case"csisolatinhebrew":case"hebrew":case"iso-8859-8":case"iso-8859-8-e":case"iso-ir-138":case"iso8859-8":case"iso88598":case"iso_8859-8":case"iso_8859-8:1988":case"visual":return"ISO-8859-8";case"csiso88598i":case"iso-8859-8-i":case"logical":return"ISO-8859-8-I";case"csisolatin6":case"iso-8859-10":case"iso-ir-157":case"iso8859-10":case"iso885910":case"l6":case"latin6":return"ISO-8859-10";case"iso-8859-13":case"iso8859-13":case"iso885913":return"ISO-8859-13";case"iso-8859-14":case"iso8859-14":case"iso885914":return"ISO-8859-14";case"csisolatin9":case"iso-8859-15":case"iso8859-15":case"iso885915":case"iso_8859-15":case"l9":return"ISO-8859-15";case"iso-8859-16":return"ISO-8859-16";case"cskoi8r":case"koi":case"koi8":case"koi8-r":case"koi8_r":return"KOI8-R";case"koi8-ru":case"koi8-u":return"KOI8-U";case"csmacintosh":case"mac":case"macintosh":case"x-mac-roman":return"macintosh";case"iso-8859-11":case"iso8859-11":case"iso885911":case"tis-620":case"windows-874":return"windows-874";case"cp1250":case"windows-1250":case"x-cp1250":return"windows-1250";case"cp1251":case"windows-1251":case"x-cp1251":return"windows-1251";case"ansi_x3.4-1968":case"ascii":case"cp1252":case"cp819":case"csisolatin1":case"ibm819":case"iso-8859-1":case"iso-ir-100":case"iso8859-1":case"iso88591":case"iso_8859-1":case"iso_8859-1:1987":case"l1":case"latin1":case"us-ascii":case"windows-1252":case"x-cp1252":return"windows-1252";case"cp1253":case"windows-1253":case"x-cp1253":return"windows-1253";case"cp1254":case"csisolatin5":case"iso-8859-9":case"iso-ir-148":case"iso8859-9":case"iso88599":case"iso_8859-9":case"iso_8859-9:1989":case"l5":case"latin5":case"windows-1254":case"x-cp1254":return"windows-1254";case"cp1255":case"windows-1255":case"x-cp1255":return"windows-1255";case"cp1256":case"windows-1256":case"x-cp1256":return"windows-1256";case"cp1257":case"windows-1257":case"x-cp1257":return"windows-1257";case"cp1258":case"windows-1258":case"x-cp1258":return"windows-1258";case"x-mac-cyrillic":case"x-mac-ukrainian":return"x-mac-cyrillic";case"chinese":case"csgb2312":case"csiso58gb231280":case"gb2312":case"gb_2312":case"gb_2312-80":case"gbk":case"iso-ir-58":case"x-gbk":return"GBK";case"gb18030":return"gb18030";case"big5":case"big5-hkscs":case"cn-big5":case"csbig5":case"x-x-big5":return"Big5";case"cseucpkdfmtjapanese":case"euc-jp":case"x-euc-jp":return"EUC-JP";case"csiso2022jp":case"iso-2022-jp":return"ISO-2022-JP";case"csshiftjis":case"ms932":case"ms_kanji":case"shift-jis":case"shift_jis":case"sjis":case"windows-31j":case"x-sjis":return"Shift_JIS";case"cseuckr":case"csksc56011987":case"euc-kr":case"iso-ir-149":case"korean":case"ks_c_5601-1987":case"ks_c_5601-1989":case"ksc5601":case"ksc_5601":case"windows-949":return"EUC-KR";case"csiso2022kr":case"hz-gb-2312":case"iso-2022-cn":case"iso-2022-cn-ext":case"iso-2022-kr":case"replacement":return"replacement";case"unicodefffe":case"utf-16be":return"UTF-16BE";case"csunicode":case"iso-10646-ucs-2":case"ucs-2":case"unicode":case"unicodefeff":case"utf-16":case"utf-16le":return"UTF-16LE";case"x-user-defined":return"x-user-defined";default:return"failure"}}e.exports={getEncoding:getEncoding}},2160:(e,A,t)=>{"use strict";const{staticPropertyDescriptors:r,readOperation:s,fireAProgressEvent:o}=t(165);const{kState:n,kError:i,kResult:a,kEvents:c,kAborted:g}=t(6812);const{webidl:l}=t(4222);const{kEnumerableProperty:E}=t(3440);class FileReader extends EventTarget{constructor(){super();this[n]="empty";this[a]=null;this[i]=null;this[c]={loadend:null,error:null,abort:null,load:null,progress:null,loadstart:null}}readAsArrayBuffer(e){l.brandCheck(this,FileReader);l.argumentLengthCheck(arguments,1,{header:"FileReader.readAsArrayBuffer"});e=l.converters.Blob(e,{strict:false});s(this,e,"ArrayBuffer")}readAsBinaryString(e){l.brandCheck(this,FileReader);l.argumentLengthCheck(arguments,1,{header:"FileReader.readAsBinaryString"});e=l.converters.Blob(e,{strict:false});s(this,e,"BinaryString")}readAsText(e,A=undefined){l.brandCheck(this,FileReader);l.argumentLengthCheck(arguments,1,{header:"FileReader.readAsText"});e=l.converters.Blob(e,{strict:false});if(A!==undefined){A=l.converters.DOMString(A)}s(this,e,"Text",A)}readAsDataURL(e){l.brandCheck(this,FileReader);l.argumentLengthCheck(arguments,1,{header:"FileReader.readAsDataURL"});e=l.converters.Blob(e,{strict:false});s(this,e,"DataURL")}abort(){if(this[n]==="empty"||this[n]==="done"){this[a]=null;return}if(this[n]==="loading"){this[n]="done";this[a]=null}this[g]=true;o("abort",this);if(this[n]!=="loading"){o("loadend",this)}}get readyState(){l.brandCheck(this,FileReader);switch(this[n]){case"empty":return this.EMPTY;case"loading":return this.LOADING;case"done":return this.DONE}}get result(){l.brandCheck(this,FileReader);return this[a]}get error(){l.brandCheck(this,FileReader);return this[i]}get onloadend(){l.brandCheck(this,FileReader);return this[c].loadend}set onloadend(e){l.brandCheck(this,FileReader);if(this[c].loadend){this.removeEventListener("loadend",this[c].loadend)}if(typeof e==="function"){this[c].loadend=e;this.addEventListener("loadend",e)}else{this[c].loadend=null}}get onerror(){l.brandCheck(this,FileReader);return this[c].error}set onerror(e){l.brandCheck(this,FileReader);if(this[c].error){this.removeEventListener("error",this[c].error)}if(typeof e==="function"){this[c].error=e;this.addEventListener("error",e)}else{this[c].error=null}}get onloadstart(){l.brandCheck(this,FileReader);return this[c].loadstart}set onloadstart(e){l.brandCheck(this,FileReader);if(this[c].loadstart){this.removeEventListener("loadstart",this[c].loadstart)}if(typeof e==="function"){this[c].loadstart=e;this.addEventListener("loadstart",e)}else{this[c].loadstart=null}}get onprogress(){l.brandCheck(this,FileReader);return this[c].progress}set onprogress(e){l.brandCheck(this,FileReader);if(this[c].progress){this.removeEventListener("progress",this[c].progress)}if(typeof e==="function"){this[c].progress=e;this.addEventListener("progress",e)}else{this[c].progress=null}}get onload(){l.brandCheck(this,FileReader);return this[c].load}set onload(e){l.brandCheck(this,FileReader);if(this[c].load){this.removeEventListener("load",this[c].load)}if(typeof e==="function"){this[c].load=e;this.addEventListener("load",e)}else{this[c].load=null}}get onabort(){l.brandCheck(this,FileReader);return this[c].abort}set onabort(e){l.brandCheck(this,FileReader);if(this[c].abort){this.removeEventListener("abort",this[c].abort)}if(typeof e==="function"){this[c].abort=e;this.addEventListener("abort",e)}else{this[c].abort=null}}}FileReader.EMPTY=FileReader.prototype.EMPTY=0;FileReader.LOADING=FileReader.prototype.LOADING=1;FileReader.DONE=FileReader.prototype.DONE=2;Object.defineProperties(FileReader.prototype,{EMPTY:r,LOADING:r,DONE:r,readAsArrayBuffer:E,readAsBinaryString:E,readAsText:E,readAsDataURL:E,abort:E,readyState:E,result:E,error:E,onloadstart:E,onprogress:E,onload:E,onabort:E,onerror:E,onloadend:E,[Symbol.toStringTag]:{value:"FileReader",writable:false,enumerable:false,configurable:true}});Object.defineProperties(FileReader,{EMPTY:r,LOADING:r,DONE:r});e.exports={FileReader:FileReader}},5976:(e,A,t)=>{"use strict";const{webidl:r}=t(4222);const s=Symbol("ProgressEvent state");class ProgressEvent extends Event{constructor(e,A={}){e=r.converters.DOMString(e);A=r.converters.ProgressEventInit(A??{});super(e,A);this[s]={lengthComputable:A.lengthComputable,loaded:A.loaded,total:A.total}}get lengthComputable(){r.brandCheck(this,ProgressEvent);return this[s].lengthComputable}get loaded(){r.brandCheck(this,ProgressEvent);return this[s].loaded}get total(){r.brandCheck(this,ProgressEvent);return this[s].total}}r.converters.ProgressEventInit=r.dictionaryConverter([{key:"lengthComputable",converter:r.converters.boolean,defaultValue:false},{key:"loaded",converter:r.converters["unsigned long long"],defaultValue:0},{key:"total",converter:r.converters["unsigned long long"],defaultValue:0},{key:"bubbles",converter:r.converters.boolean,defaultValue:false},{key:"cancelable",converter:r.converters.boolean,defaultValue:false},{key:"composed",converter:r.converters.boolean,defaultValue:false}]);e.exports={ProgressEvent:ProgressEvent}},6812:e=>{"use strict";e.exports={kState:Symbol("FileReader state"),kResult:Symbol("FileReader result"),kError:Symbol("FileReader error"),kLastProgressEventFired:Symbol("FileReader last progress event fired timestamp"),kEvents:Symbol("FileReader events"),kAborted:Symbol("FileReader aborted")}},165:(e,A,t)=>{"use strict";const{kState:r,kError:s,kResult:o,kAborted:n,kLastProgressEventFired:i}=t(6812);const{ProgressEvent:a}=t(5976);const{getEncoding:c}=t(396);const{DOMException:g}=t(7326);const{serializeAMimeType:l,parseMIMEType:E}=t(4322);const{types:u}=t(9023);const{StringDecoder:h}=t(3193);const{btoa:Q}=t(181);const C={enumerable:true,writable:false,configurable:false};function readOperation(e,A,t,a){if(e[r]==="loading"){throw new g("Invalid state","InvalidStateError")}e[r]="loading";e[o]=null;e[s]=null;const c=A.stream();const l=c.getReader();const E=[];let h=l.read();let Q=true;(async()=>{while(!e[n]){try{const{done:c,value:g}=await h;if(Q&&!e[n]){queueMicrotask((()=>{fireAProgressEvent("loadstart",e)}))}Q=false;if(!c&&u.isUint8Array(g)){E.push(g);if((e[i]===undefined||Date.now()-e[i]>=50)&&!e[n]){e[i]=Date.now();queueMicrotask((()=>{fireAProgressEvent("progress",e)}))}h=l.read()}else if(c){queueMicrotask((()=>{e[r]="done";try{const r=packageData(E,t,A.type,a);if(e[n]){return}e[o]=r;fireAProgressEvent("load",e)}catch(A){e[s]=A;fireAProgressEvent("error",e)}if(e[r]!=="loading"){fireAProgressEvent("loadend",e)}}));break}}catch(A){if(e[n]){return}queueMicrotask((()=>{e[r]="done";e[s]=A;fireAProgressEvent("error",e);if(e[r]!=="loading"){fireAProgressEvent("loadend",e)}}));break}}})()}function fireAProgressEvent(e,A){const t=new a(e,{bubbles:false,cancelable:false});A.dispatchEvent(t)}function packageData(e,A,t,r){switch(A){case"DataURL":{let A="data:";const r=E(t||"application/octet-stream");if(r!=="failure"){A+=l(r)}A+=";base64,";const s=new h("latin1");for(const t of e){A+=Q(s.write(t))}A+=Q(s.end());return A}case"Text":{let A="failure";if(r){A=c(r)}if(A==="failure"&&t){const e=E(t);if(e!=="failure"){A=c(e.parameters.get("charset"))}}if(A==="failure"){A="UTF-8"}return decode(e,A)}case"ArrayBuffer":{const A=combineByteSequences(e);return A.buffer}case"BinaryString":{let A="";const t=new h("latin1");for(const r of e){A+=t.write(r)}A+=t.end();return A}}}function decode(e,A){const t=combineByteSequences(e);const r=BOMSniffing(t);let s=0;if(r!==null){A=r;s=r==="UTF-8"?3:2}const o=t.slice(s);return new TextDecoder(A).decode(o)}function BOMSniffing(e){const[A,t,r]=e;if(A===239&&t===187&&r===191){return"UTF-8"}else if(A===254&&t===255){return"UTF-16BE"}else if(A===255&&t===254){return"UTF-16LE"}return null}function combineByteSequences(e){const A=e.reduce(((e,A)=>e+A.byteLength),0);let t=0;return e.reduce(((e,A)=>{e.set(A,t);t+=A.byteLength;return e}),new Uint8Array(A))}e.exports={staticPropertyDescriptors:C,readOperation:readOperation,fireAProgressEvent:fireAProgressEvent}},2581:(e,A,t)=>{"use strict";const r=Symbol.for("undici.globalDispatcher.1");const{InvalidArgumentError:s}=t(8707);const o=t(9965);if(getGlobalDispatcher()===undefined){setGlobalDispatcher(new o)}function setGlobalDispatcher(e){if(!e||typeof e.dispatch!=="function"){throw new s("Argument agent must implement Agent")}Object.defineProperty(globalThis,r,{value:e,writable:true,enumerable:false,configurable:false})}function getGlobalDispatcher(){return globalThis[r]}e.exports={setGlobalDispatcher:setGlobalDispatcher,getGlobalDispatcher:getGlobalDispatcher}},8840:e=>{"use strict";e.exports=class DecoratorHandler{constructor(e){this.handler=e}onConnect(...e){return this.handler.onConnect(...e)}onError(...e){return this.handler.onError(...e)}onUpgrade(...e){return this.handler.onUpgrade(...e)}onHeaders(...e){return this.handler.onHeaders(...e)}onData(...e){return this.handler.onData(...e)}onComplete(...e){return this.handler.onComplete(...e)}onBodySent(...e){return this.handler.onBodySent(...e)}}},8299:(e,A,t)=>{"use strict";const r=t(3440);const{kBodyUsed:s}=t(6443);const o=t(2613);const{InvalidArgumentError:n}=t(8707);const i=t(4434);const a=[300,301,302,303,307,308];const c=Symbol("body");class BodyAsyncIterable{constructor(e){this[c]=e;this[s]=false}async*[Symbol.asyncIterator](){o(!this[s],"disturbed");this[s]=true;yield*this[c]}}class RedirectHandler{constructor(e,A,t,a){if(A!=null&&(!Number.isInteger(A)||A<0)){throw new n("maxRedirections must be a positive number")}r.validateHandler(a,t.method,t.upgrade);this.dispatch=e;this.location=null;this.abort=null;this.opts={...t,maxRedirections:0};this.maxRedirections=A;this.handler=a;this.history=[];if(r.isStream(this.opts.body)){if(r.bodyLength(this.opts.body)===0){this.opts.body.on("data",(function(){o(false)}))}if(typeof this.opts.body.readableDidRead!=="boolean"){this.opts.body[s]=false;i.prototype.on.call(this.opts.body,"data",(function(){this[s]=true}))}}else if(this.opts.body&&typeof this.opts.body.pipeTo==="function"){this.opts.body=new BodyAsyncIterable(this.opts.body)}else if(this.opts.body&&typeof this.opts.body!=="string"&&!ArrayBuffer.isView(this.opts.body)&&r.isIterable(this.opts.body)){this.opts.body=new BodyAsyncIterable(this.opts.body)}}onConnect(e){this.abort=e;this.handler.onConnect(e,{history:this.history})}onUpgrade(e,A,t){this.handler.onUpgrade(e,A,t)}onError(e){this.handler.onError(e)}onHeaders(e,A,t,s){this.location=this.history.length>=this.maxRedirections||r.isDisturbed(this.opts.body)?null:parseLocation(e,A);if(this.opts.origin){this.history.push(new URL(this.opts.path,this.opts.origin))}if(!this.location){return this.handler.onHeaders(e,A,t,s)}const{origin:o,pathname:n,search:i}=r.parseURL(new URL(this.location,this.opts.origin&&new URL(this.opts.path,this.opts.origin)));const a=i?`${n}${i}`:n;this.opts.headers=cleanRequestHeaders(this.opts.headers,e===303,this.opts.origin!==o);this.opts.path=a;this.opts.origin=o;this.opts.maxRedirections=0;this.opts.query=null;if(e===303&&this.opts.method!=="HEAD"){this.opts.method="GET";this.opts.body=null}}onData(e){if(this.location){}else{return this.handler.onData(e)}}onComplete(e){if(this.location){this.location=null;this.abort=null;this.dispatch(this.opts,this)}else{this.handler.onComplete(e)}}onBodySent(e){if(this.handler.onBodySent){this.handler.onBodySent(e)}}}function parseLocation(e,A){if(a.indexOf(e)===-1){return null}for(let e=0;e{const r=t(2613);const{kRetryHandlerDefaultRetry:s}=t(6443);const{RequestRetryError:o}=t(8707);const{isDisturbed:n,parseHeaders:i,parseRangeHeader:a}=t(3440);function calculateRetryAfterHeader(e){const A=Date.now();const t=new Date(e).getTime()-A;return t}class RetryHandler{constructor(e,A){const{retryOptions:t,...r}=e;const{retry:o,maxRetries:n,maxTimeout:i,minTimeout:a,timeoutFactor:c,methods:g,errorCodes:l,retryAfter:E,statusCodes:u}=t??{};this.dispatch=A.dispatch;this.handler=A.handler;this.opts=r;this.abort=null;this.aborted=false;this.retryOpts={retry:o??RetryHandler[s],retryAfter:E??true,maxTimeout:i??30*1e3,timeout:a??500,timeoutFactor:c??2,maxRetries:n??5,methods:g??["GET","HEAD","OPTIONS","PUT","DELETE","TRACE"],statusCodes:u??[500,502,503,504,429],errorCodes:l??["ECONNRESET","ECONNREFUSED","ENOTFOUND","ENETDOWN","ENETUNREACH","EHOSTDOWN","EHOSTUNREACH","EPIPE"]};this.retryCount=0;this.start=0;this.end=null;this.etag=null;this.resume=null;this.handler.onConnect((e=>{this.aborted=true;if(this.abort){this.abort(e)}else{this.reason=e}}))}onRequestSent(){if(this.handler.onRequestSent){this.handler.onRequestSent()}}onUpgrade(e,A,t){if(this.handler.onUpgrade){this.handler.onUpgrade(e,A,t)}}onConnect(e){if(this.aborted){e(this.reason)}else{this.abort=e}}onBodySent(e){if(this.handler.onBodySent)return this.handler.onBodySent(e)}static[s](e,{state:A,opts:t},r){const{statusCode:s,code:o,headers:n}=e;const{method:i,retryOptions:a}=t;const{maxRetries:c,timeout:g,maxTimeout:l,timeoutFactor:E,statusCodes:u,errorCodes:h,methods:Q}=a;let{counter:C,currentTimeout:d}=A;d=d!=null&&d>0?d:g;if(o&&o!=="UND_ERR_REQ_RETRY"&&o!=="UND_ERR_SOCKET"&&!h.includes(o)){r(e);return}if(Array.isArray(Q)&&!Q.includes(i)){r(e);return}if(s!=null&&Array.isArray(u)&&!u.includes(s)){r(e);return}if(C>c){r(e);return}let B=n!=null&&n["retry-after"];if(B){B=Number(B);B=isNaN(B)?calculateRetryAfterHeader(B):B*1e3}const I=B>0?Math.min(B,l):Math.min(d*E**C,l);A.currentTimeout=I;setTimeout((()=>r(null)),I)}onHeaders(e,A,t,s){const n=i(A);this.retryCount+=1;if(e>=300){this.abort(new o("Request failed",e,{headers:n,count:this.retryCount}));return false}if(this.resume!=null){this.resume=null;if(e!==206){return true}const A=a(n["content-range"]);if(!A){this.abort(new o("Content-Range mismatch",e,{headers:n,count:this.retryCount}));return false}if(this.etag!=null&&this.etag!==n.etag){this.abort(new o("ETag mismatch",e,{headers:n,count:this.retryCount}));return false}const{start:s,size:i,end:c=i}=A;r(this.start===s,"content-range mismatch");r(this.end==null||this.end===c,"content-range mismatch");this.resume=t;return true}if(this.end==null){if(e===206){const o=a(n["content-range"]);if(o==null){return this.handler.onHeaders(e,A,t,s)}const{start:i,size:c,end:g=c}=o;r(i!=null&&Number.isFinite(i)&&this.start!==i,"content-range mismatch");r(Number.isFinite(i));r(g!=null&&Number.isFinite(g)&&this.end!==g,"invalid content-length");this.start=i;this.end=g}if(this.end==null){const e=n["content-length"];this.end=e!=null?Number(e):null}r(Number.isFinite(this.start));r(this.end==null||Number.isFinite(this.end),"invalid content-length");this.resume=t;this.etag=n.etag!=null?n.etag:null;return this.handler.onHeaders(e,A,t,s)}const c=new o("Request failed",e,{headers:n,count:this.retryCount});this.abort(c);return false}onData(e){this.start+=e.length;return this.handler.onData(e)}onComplete(e){this.retryCount=0;return this.handler.onComplete(e)}onError(e){if(this.aborted||n(this.opts.body)){return this.handler.onError(e)}this.retryOpts.retry(e,{state:{counter:this.retryCount++,currentTimeout:this.retryAfter},opts:{retryOptions:this.retryOpts,...this.opts}},onRetry.bind(this));function onRetry(e){if(e!=null||this.aborted||n(this.opts.body)){return this.handler.onError(e)}if(this.start!==0){this.opts={...this.opts,headers:{...this.opts.headers,range:`bytes=${this.start}-${this.end??""}`}}}try{this.dispatch(this.opts,this)}catch(e){this.handler.onError(e)}}}}e.exports=RetryHandler},4415:(e,A,t)=>{"use strict";const r=t(8299);function createRedirectInterceptor({maxRedirections:e}){return A=>function Intercept(t,s){const{maxRedirections:o=e}=t;if(!o){return A(t,s)}const n=new r(A,o,t,s);t={...t,maxRedirections:0};return A(t,n)}}e.exports=createRedirectInterceptor},2824:(e,A,t)=>{"use strict";Object.defineProperty(A,"__esModule",{value:true});A.SPECIAL_HEADERS=A.HEADER_STATE=A.MINOR=A.MAJOR=A.CONNECTION_TOKEN_CHARS=A.HEADER_CHARS=A.TOKEN=A.STRICT_TOKEN=A.HEX=A.URL_CHAR=A.STRICT_URL_CHAR=A.USERINFO_CHARS=A.MARK=A.ALPHANUM=A.NUM=A.HEX_MAP=A.NUM_MAP=A.ALPHA=A.FINISH=A.H_METHOD_MAP=A.METHOD_MAP=A.METHODS_RTSP=A.METHODS_ICE=A.METHODS_HTTP=A.METHODS=A.LENIENT_FLAGS=A.FLAGS=A.TYPE=A.ERROR=void 0;const r=t(172);var s;(function(e){e[e["OK"]=0]="OK";e[e["INTERNAL"]=1]="INTERNAL";e[e["STRICT"]=2]="STRICT";e[e["LF_EXPECTED"]=3]="LF_EXPECTED";e[e["UNEXPECTED_CONTENT_LENGTH"]=4]="UNEXPECTED_CONTENT_LENGTH";e[e["CLOSED_CONNECTION"]=5]="CLOSED_CONNECTION";e[e["INVALID_METHOD"]=6]="INVALID_METHOD";e[e["INVALID_URL"]=7]="INVALID_URL";e[e["INVALID_CONSTANT"]=8]="INVALID_CONSTANT";e[e["INVALID_VERSION"]=9]="INVALID_VERSION";e[e["INVALID_HEADER_TOKEN"]=10]="INVALID_HEADER_TOKEN";e[e["INVALID_CONTENT_LENGTH"]=11]="INVALID_CONTENT_LENGTH";e[e["INVALID_CHUNK_SIZE"]=12]="INVALID_CHUNK_SIZE";e[e["INVALID_STATUS"]=13]="INVALID_STATUS";e[e["INVALID_EOF_STATE"]=14]="INVALID_EOF_STATE";e[e["INVALID_TRANSFER_ENCODING"]=15]="INVALID_TRANSFER_ENCODING";e[e["CB_MESSAGE_BEGIN"]=16]="CB_MESSAGE_BEGIN";e[e["CB_HEADERS_COMPLETE"]=17]="CB_HEADERS_COMPLETE";e[e["CB_MESSAGE_COMPLETE"]=18]="CB_MESSAGE_COMPLETE";e[e["CB_CHUNK_HEADER"]=19]="CB_CHUNK_HEADER";e[e["CB_CHUNK_COMPLETE"]=20]="CB_CHUNK_COMPLETE";e[e["PAUSED"]=21]="PAUSED";e[e["PAUSED_UPGRADE"]=22]="PAUSED_UPGRADE";e[e["PAUSED_H2_UPGRADE"]=23]="PAUSED_H2_UPGRADE";e[e["USER"]=24]="USER"})(s=A.ERROR||(A.ERROR={}));var o;(function(e){e[e["BOTH"]=0]="BOTH";e[e["REQUEST"]=1]="REQUEST";e[e["RESPONSE"]=2]="RESPONSE"})(o=A.TYPE||(A.TYPE={}));var n;(function(e){e[e["CONNECTION_KEEP_ALIVE"]=1]="CONNECTION_KEEP_ALIVE";e[e["CONNECTION_CLOSE"]=2]="CONNECTION_CLOSE";e[e["CONNECTION_UPGRADE"]=4]="CONNECTION_UPGRADE";e[e["CHUNKED"]=8]="CHUNKED";e[e["UPGRADE"]=16]="UPGRADE";e[e["CONTENT_LENGTH"]=32]="CONTENT_LENGTH";e[e["SKIPBODY"]=64]="SKIPBODY";e[e["TRAILING"]=128]="TRAILING";e[e["TRANSFER_ENCODING"]=512]="TRANSFER_ENCODING"})(n=A.FLAGS||(A.FLAGS={}));var i;(function(e){e[e["HEADERS"]=1]="HEADERS";e[e["CHUNKED_LENGTH"]=2]="CHUNKED_LENGTH";e[e["KEEP_ALIVE"]=4]="KEEP_ALIVE"})(i=A.LENIENT_FLAGS||(A.LENIENT_FLAGS={}));var a;(function(e){e[e["DELETE"]=0]="DELETE";e[e["GET"]=1]="GET";e[e["HEAD"]=2]="HEAD";e[e["POST"]=3]="POST";e[e["PUT"]=4]="PUT";e[e["CONNECT"]=5]="CONNECT";e[e["OPTIONS"]=6]="OPTIONS";e[e["TRACE"]=7]="TRACE";e[e["COPY"]=8]="COPY";e[e["LOCK"]=9]="LOCK";e[e["MKCOL"]=10]="MKCOL";e[e["MOVE"]=11]="MOVE";e[e["PROPFIND"]=12]="PROPFIND";e[e["PROPPATCH"]=13]="PROPPATCH";e[e["SEARCH"]=14]="SEARCH";e[e["UNLOCK"]=15]="UNLOCK";e[e["BIND"]=16]="BIND";e[e["REBIND"]=17]="REBIND";e[e["UNBIND"]=18]="UNBIND";e[e["ACL"]=19]="ACL";e[e["REPORT"]=20]="REPORT";e[e["MKACTIVITY"]=21]="MKACTIVITY";e[e["CHECKOUT"]=22]="CHECKOUT";e[e["MERGE"]=23]="MERGE";e[e["M-SEARCH"]=24]="M-SEARCH";e[e["NOTIFY"]=25]="NOTIFY";e[e["SUBSCRIBE"]=26]="SUBSCRIBE";e[e["UNSUBSCRIBE"]=27]="UNSUBSCRIBE";e[e["PATCH"]=28]="PATCH";e[e["PURGE"]=29]="PURGE";e[e["MKCALENDAR"]=30]="MKCALENDAR";e[e["LINK"]=31]="LINK";e[e["UNLINK"]=32]="UNLINK";e[e["SOURCE"]=33]="SOURCE";e[e["PRI"]=34]="PRI";e[e["DESCRIBE"]=35]="DESCRIBE";e[e["ANNOUNCE"]=36]="ANNOUNCE";e[e["SETUP"]=37]="SETUP";e[e["PLAY"]=38]="PLAY";e[e["PAUSE"]=39]="PAUSE";e[e["TEARDOWN"]=40]="TEARDOWN";e[e["GET_PARAMETER"]=41]="GET_PARAMETER";e[e["SET_PARAMETER"]=42]="SET_PARAMETER";e[e["REDIRECT"]=43]="REDIRECT";e[e["RECORD"]=44]="RECORD";e[e["FLUSH"]=45]="FLUSH"})(a=A.METHODS||(A.METHODS={}));A.METHODS_HTTP=[a.DELETE,a.GET,a.HEAD,a.POST,a.PUT,a.CONNECT,a.OPTIONS,a.TRACE,a.COPY,a.LOCK,a.MKCOL,a.MOVE,a.PROPFIND,a.PROPPATCH,a.SEARCH,a.UNLOCK,a.BIND,a.REBIND,a.UNBIND,a.ACL,a.REPORT,a.MKACTIVITY,a.CHECKOUT,a.MERGE,a["M-SEARCH"],a.NOTIFY,a.SUBSCRIBE,a.UNSUBSCRIBE,a.PATCH,a.PURGE,a.MKCALENDAR,a.LINK,a.UNLINK,a.PRI,a.SOURCE];A.METHODS_ICE=[a.SOURCE];A.METHODS_RTSP=[a.OPTIONS,a.DESCRIBE,a.ANNOUNCE,a.SETUP,a.PLAY,a.PAUSE,a.TEARDOWN,a.GET_PARAMETER,a.SET_PARAMETER,a.REDIRECT,a.RECORD,a.FLUSH,a.GET,a.POST];A.METHOD_MAP=r.enumToMap(a);A.H_METHOD_MAP={};Object.keys(A.METHOD_MAP).forEach((e=>{if(/^H/.test(e)){A.H_METHOD_MAP[e]=A.METHOD_MAP[e]}}));var c;(function(e){e[e["SAFE"]=0]="SAFE";e[e["SAFE_WITH_CB"]=1]="SAFE_WITH_CB";e[e["UNSAFE"]=2]="UNSAFE"})(c=A.FINISH||(A.FINISH={}));A.ALPHA=[];for(let e="A".charCodeAt(0);e<="Z".charCodeAt(0);e++){A.ALPHA.push(String.fromCharCode(e));A.ALPHA.push(String.fromCharCode(e+32))}A.NUM_MAP={0:0,1:1,2:2,3:3,4:4,5:5,6:6,7:7,8:8,9:9};A.HEX_MAP={0:0,1:1,2:2,3:3,4:4,5:5,6:6,7:7,8:8,9:9,A:10,B:11,C:12,D:13,E:14,F:15,a:10,b:11,c:12,d:13,e:14,f:15};A.NUM=["0","1","2","3","4","5","6","7","8","9"];A.ALPHANUM=A.ALPHA.concat(A.NUM);A.MARK=["-","_",".","!","~","*","'","(",")"];A.USERINFO_CHARS=A.ALPHANUM.concat(A.MARK).concat(["%",";",":","&","=","+","$",","]);A.STRICT_URL_CHAR=["!",'"',"$","%","&","'","(",")","*","+",",","-",".","/",":",";","<","=",">","@","[","\\","]","^","_","`","{","|","}","~"].concat(A.ALPHANUM);A.URL_CHAR=A.STRICT_URL_CHAR.concat(["\t","\f"]);for(let e=128;e<=255;e++){A.URL_CHAR.push(e)}A.HEX=A.NUM.concat(["a","b","c","d","e","f","A","B","C","D","E","F"]);A.STRICT_TOKEN=["!","#","$","%","&","'","*","+","-",".","^","_","`","|","~"].concat(A.ALPHANUM);A.TOKEN=A.STRICT_TOKEN.concat([" "]);A.HEADER_CHARS=["\t"];for(let e=32;e<=255;e++){if(e!==127){A.HEADER_CHARS.push(e)}}A.CONNECTION_TOKEN_CHARS=A.HEADER_CHARS.filter((e=>e!==44));A.MAJOR=A.NUM_MAP;A.MINOR=A.MAJOR;var g;(function(e){e[e["GENERAL"]=0]="GENERAL";e[e["CONNECTION"]=1]="CONNECTION";e[e["CONTENT_LENGTH"]=2]="CONTENT_LENGTH";e[e["TRANSFER_ENCODING"]=3]="TRANSFER_ENCODING";e[e["UPGRADE"]=4]="UPGRADE";e[e["CONNECTION_KEEP_ALIVE"]=5]="CONNECTION_KEEP_ALIVE";e[e["CONNECTION_CLOSE"]=6]="CONNECTION_CLOSE";e[e["CONNECTION_UPGRADE"]=7]="CONNECTION_UPGRADE";e[e["TRANSFER_ENCODING_CHUNKED"]=8]="TRANSFER_ENCODING_CHUNKED"})(g=A.HEADER_STATE||(A.HEADER_STATE={}));A.SPECIAL_HEADERS={connection:g.CONNECTION,"content-length":g.CONTENT_LENGTH,"proxy-connection":g.CONNECTION,"transfer-encoding":g.TRANSFER_ENCODING,upgrade:g.UPGRADE}},3870:e=>{e.exports="AGFzbQEAAAABMAhgAX8Bf2ADf39/AX9gBH9/f38Bf2AAAGADf39/AGABfwBgAn9/AGAGf39/f39/AALLAQgDZW52GHdhc21fb25faGVhZGVyc19jb21wbGV0ZQACA2VudhV3YXNtX29uX21lc3NhZ2VfYmVnaW4AAANlbnYLd2FzbV9vbl91cmwAAQNlbnYOd2FzbV9vbl9zdGF0dXMAAQNlbnYUd2FzbV9vbl9oZWFkZXJfZmllbGQAAQNlbnYUd2FzbV9vbl9oZWFkZXJfdmFsdWUAAQNlbnYMd2FzbV9vbl9ib2R5AAEDZW52GHdhc21fb25fbWVzc2FnZV9jb21wbGV0ZQAAA0ZFAwMEAAAFAAAAAAAABQEFAAUFBQAABgAAAAAGBgYGAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQABAAABAQcAAAUFAwABBAUBcAESEgUDAQACBggBfwFBgNQECwfRBSIGbWVtb3J5AgALX2luaXRpYWxpemUACRlfX2luZGlyZWN0X2Z1bmN0aW9uX3RhYmxlAQALbGxodHRwX2luaXQAChhsbGh0dHBfc2hvdWxkX2tlZXBfYWxpdmUAQQxsbGh0dHBfYWxsb2MADAZtYWxsb2MARgtsbGh0dHBfZnJlZQANBGZyZWUASA9sbGh0dHBfZ2V0X3R5cGUADhVsbGh0dHBfZ2V0X2h0dHBfbWFqb3IADxVsbGh0dHBfZ2V0X2h0dHBfbWlub3IAEBFsbGh0dHBfZ2V0X21ldGhvZAARFmxsaHR0cF9nZXRfc3RhdHVzX2NvZGUAEhJsbGh0dHBfZ2V0X3VwZ3JhZGUAEwxsbGh0dHBfcmVzZXQAFA5sbGh0dHBfZXhlY3V0ZQAVFGxsaHR0cF9zZXR0aW5nc19pbml0ABYNbGxodHRwX2ZpbmlzaAAXDGxsaHR0cF9wYXVzZQAYDWxsaHR0cF9yZXN1bWUAGRtsbGh0dHBfcmVzdW1lX2FmdGVyX3VwZ3JhZGUAGhBsbGh0dHBfZ2V0X2Vycm5vABsXbGxodHRwX2dldF9lcnJvcl9yZWFzb24AHBdsbGh0dHBfc2V0X2Vycm9yX3JlYXNvbgAdFGxsaHR0cF9nZXRfZXJyb3JfcG9zAB4RbGxodHRwX2Vycm5vX25hbWUAHxJsbGh0dHBfbWV0aG9kX25hbWUAIBJs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ADcDACAAQShqQgA3AwAgAEEgakIANwMAIABBEGpCADcDACAAQQhqQgA3AwAgAEHdATYCHEEAC3sBAX8CQCAAKAIMIgMNAAJAIAAoAgRFDQAgACABNgIECwJAIAAgASACEMSAgIAAIgMNACAAKAIMDwsgACADNgIcQQAhAyAAKAIEIgFFDQAgACABIAIgACgCCBGBgICAAAAiAUUNACAAIAI2AhQgACABNgIMIAEhAwsgAwvk8wEDDn8DfgR/I4CAgIAAQRBrIgMkgICAgAAgASEEIAEhBSABIQYgASEHIAEhCCABIQkgASEKIAEhCyABIQwgASENIAEhDiABIQ8CQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkAgACgCHCIQQX9qDt0B2gEB2QECAwQFBgcICQoLDA0O2AEPENcBERLWARMUFRYXGBkaG+AB3wEcHR7VAR8gISIjJCXUASYnKCkqKyzTAdIBLS7RAdABLzAxMjM0NTY3ODk6Ozw9Pj9AQUJDREVG2wFHSElKzwHOAUvNAUzMAU1OT1BRUlNUVVZXWFlaW1xdXl9gYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXp7fH1+f4ABgQGCAYMBhAGFAYYBhwGIAYkB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QAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkAC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FCAAIBA2AgxBACEQDLIBCyAAKAIEIRAgAEEANgIEAkAgACAQIAEQp4CAgAAiEA0AIAEhAQxNCyAAQdMANgIcIAAgATYCFCAAIBA2AgxBACEQDLEBCyAAKAIEIRAgAEEANgIEAkAgACAQIAEQp4CAgAAiEA0AIAEhAQxRCyAAQeUANgIcIAAgATYCFCAAIBA2AgxBACEQDLABCyAAQQA2AhwgACABNgIUIABBxoqAgAA2AhAgAEEHNgIMQQAhEAyvAQsgACgCBCEQIABBADYCBAJAIAAgECABEKeAgIAAIhANACABIQEMSQsgAEHSADYCHCAAIAE2AhQgACAQNgIMQQAhEAyuAQsgACgCBCEQIABBADYCBAJAIAAgECABEKeAgIAAIhANACABIQEMSQsgAEHTADYCHCAAIAE2AhQgACAQNgIMQQAhEAytAQsgACgCBCEQIABBADYCBAJAIAAgECABEKeAgIAAIhANACABIQEMTQsgAEHlADYCHCAAIAE2AhQgACAQNgIMQQAhEAysAQsgAEEANgIcIAAgATYCFCAAQdyIgIAANgIQIABBBzYCDEEAIRAMqwELIBBBP0cNASABQQFqIQELQQUhEAyQAQtBACEQIABBADYCHCAAIAE2AhQgAEH9koCAADYCECAAQQc2AgwMqAELIAAoAgQhECAAQQA2AgQCQCAAIBAgARCngICAACIQDQAgASEBDEILIABB0gA2AhwgACABNgIUIAAgEDYCDEEAIRAMpwELIAAoAgQhECAAQQA2AgQCQCAAIBAgARCngICAACIQDQAgASEBDEILIABB0wA2AhwgACABNgIUIAAgEDYCDEEAIRAMpgELIAAoAgQhECAAQQA2AgQCQCAAIBAgARCngICAACIQDQAgASEBDEYLIABB5QA2AhwgACABNgIUIAAgEDYCDEEAIRAMpQELIAAoAgQhASAAQQA2AgQCQCAAIAEgFBCngICAACIBDQAgFCEBDD8LIABB0gA2AhwgACAUNgIUIAAgATYCDEEAIRAMpAELIAAoAgQhASAAQQA2AgQCQCAAIAEgFBCngICAACIBDQAgFCEBDD8LIABB0wA2AhwgACAUNgIUIAAgATYCDEEAIRAMowELIAAoAgQhASAAQQA2AgQCQCAAIAEgFBCngICAACIBDQAgFCEBDEMLIABB5QA2AhwgACAU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YWdlX2JlZ2luYCBjYWxsYmFjayBlcnJvcgBgb25fY2h1bmtfZXh0ZW5zaW9uX3ZhbHVlYCBjYWxsYmFjayBlcnJvcgBgb25fc3RhdHVzX2NvbXBsZXRlYCBjYWxsYmFjayBlcnJvcgBgb25fdmVyc2lvbl9jb21wbGV0ZWAgY2FsbGJhY2sgZXJyb3IAYG9uX3VybF9jb21wbGV0ZWAgY2FsbGJhY2sgZXJyb3IAYG9uX2NodW5rX2NvbXBsZXRlYCBjYWxsYmFjayBlcnJvcgBgb25faGVhZGVyX3ZhbHVlX2NvbXBsZXRlYCBjYWxsYmFjayBlcnJvcgBgb25fbWVzc2FnZV9jb21wbGV0ZWAgY2FsbGJhY2sgZXJyb3IAYG9uX21ldGhvZF9jb21wbGV0ZWAgY2FsbGJhY2sgZXJyb3IAYG9uX2hlYWRlcl9maWVsZF9jb21wbGV0ZWAgY2FsbGJhY2sgZXJyb3IAYG9uX2NodW5rX2V4dGVuc2lvbl9uYW1lYCBjYWxsYmFjayBlcnJvcgBVbmV4cGVjdGVkIGNoYXIgaW4gdXJsIHNlcnZlcgBJbnZhbGlkIGhlYWRlciB2YWx1ZSBjaGFyAEludmFsaWQgaGVhZGVyIGZpZWxkIGNoYXIAU3BhbiBjYWxsYmFjayBlcnJvciBpbiBvbl92ZXJzaW9uAEludmFsaWQgbWlub3IgdmVyc2lvbgBJbnZhbGlkIG1ham9yIHZlcnNpb24ARXhwZWN0ZWQgc3BhY2UgYWZ0ZXIgdmVyc2lvbgBFeHBlY3RlZCBDUkxGIGFmdGVyIHZlcnNpb24ASW52YWxpZCBIVFRQIHZlcnNpb24ASW52YWxpZCBoZWFkZXIgdG9rZW4AU3BhbiBjYWxsYmFjayBlcnJvciBpbiBvbl91cmwASW52YWxpZCBjaGFyYWN0ZXJzIGluIHVybABVbmV4cGVjdGVkIHN0YXJ0IGNoYXIgaW4gdXJsAERvdWJsZSBAIGluIHVybABFbXB0eSBDb250ZW50LUxlbmd0aABJbnZhbGlkIGNoYXJhY3RlciBpbiBDb250ZW50LUxlbmd0aABEdXBsaWNhdGUgQ29udGVudC1MZW5ndGgASW52YWxpZCBjaGFyIGluIHVybCBwYXRoAENvbnRlbnQtTGVuZ3RoIGNhbid0IGJlIHByZXNlbnQgd2l0aCBUcmFuc2Zlci1FbmNvZGluZwBJbnZhbGlkIGNoYXJhY3RlciBpbiBjaHVuayBzaXplAFNwYW4gY2FsbGJhY2sgZXJyb3IgaW4gb25faGVhZGVyX3ZhbHVlAFNwYW4gY2FsbGJhY2sgZXJyb3IgaW4gb25fY2h1bmtfZXh0ZW5zaW9uX3ZhbHVlAEludmFsaWQgY2hhcmFjdGVyIGluIGNodW5rIGV4dGVuc2lvbnMgdmFsdWUATWlzc2luZyBleHBlY3RlZCBMRiBhZnRlciBoZWFkZXIgdmFsdWUASW52YWxpZCBgVHJhbnNmZXItRW5jb2RpbmdgIGhlYWRlciB2YWx1ZQBJbnZhbGlkIGNoYXJhY3RlciBpbiBjaHVuayBleHRlbnNpb25zIHF1b3RlIHZhbHVlAEludmFsaWQgY2hhcmFjdGVyIGluIGNodW5rIGV4dGVuc2lvbnMgcXVvdGVkIHZhbHVlAFBhdXNlZCBieSBvbl9oZWFkZXJzX2NvbXBsZXRlAEludmFsaWQgRU9GIHN0YXRlAG9uX3Jlc2V0IHBhdXNlAG9uX2NodW5rX2hlYWRlciBwYXVzZQBvbl9tZXNzYWdlX2JlZ2luIHBhdXNlAG9uX2NodW5rX2V4dGVuc2lvbl92YWx1ZSBwYXVzZQBvbl9zdGF0dXNfY29tcGxldGUgcGF1c2UAb25fdmVyc2lvbl9jb21wbGV0ZSBwYXVzZQBvbl91cmxfY29tcGxldGUgcGF1c2UAb25fY2h1bmtfY29tcGxldGUgcGF1c2UAb25faGVhZGVyX3ZhbHVlX2NvbXBsZXRlIHBhdXNlAG9uX21lc3NhZ2VfY29tcGxldGUgcGF1c2UAb25fbWV0aG9kX2NvbXBsZXRlIHBhdXNlAG9uX2hlYWRlcl9maWVsZF9jb21wbGV0ZSBwYXVzZQBvbl9jaHVua19leHRlbnNpb25fbmFtZSBwYXVzZQBVbmV4cGVjdGVkIHNwYWNlIGFmdGVyIHN0YXJ0IGxpbmUAU3BhbiBjYWxsYmFjayBlcnJvciBpbiBvbl9jaHVua19leHRlbnNpb25fbmFtZQBJbnZhbGlkIGNoYXJhY3RlciBpbiBjaHVuayBleHRlbnNpb25zIG5hbWUAUGF1c2Ugb24gQ09OTkVDVC9VcGdyYWRlAFBhdXNlIG9uIFBSSS9VcGdyYWRlAEV4cGVjdGVkIEhUVFAvMiBDb25uZWN0aW9uIFByZWZhY2UAU3BhbiBjYWxsYmFjayBlcnJvciBpbiBvbl9tZXRob2QARXhwZWN0ZWQgc3BhY2UgYWZ0ZXIgbWV0aG9kAFNwYW4gY2FsbGJhY2sgZXJyb3IgaW4gb25faGVhZGVyX2ZpZWxkAFBhdXNlZABJbnZhbGlkIHdvcmQgZW5jb3VudGVyZWQASW52YWxpZCBtZXRob2QgZW5jb3VudGVyZWQAVW5leHBlY3RlZCBjaGFyIGluIHVybCBzY2hlbWEAUmVxdWVzdCBoYXMgaW52YWxpZCBgVHJhbnNmZXItRW5jb2RpbmdgAFNXSVRDSF9QUk9YWQBVU0VfUFJPWFkATUtBQ1RJVklUWQBVTlBST0NFU1NBQkxFX0VOVElUWQBDT1BZAE1PVkVEX1BFUk1BTkVOVExZAFRPT19FQVJMWQBOT1RJRlkARkFJTEVEX0RFUEVOREVOQ1kAQkFEX0dBVEVXQVkAUExBWQBQVVQAQ0hFQ0tPVVQAR0FURVdBWV9USU1FT1VUAFJFUVVFU1RfVElNRU9VVABORVRXT1JLX0NPTk5FQ1RfVElNRU9VVABDT05ORUNUSU9OX1RJTUVPVVQATE9HSU5fVElNRU9VVABORVRXT1JLX1JFQURfVElNRU9VVABQT1NUAE1JU0RJUkVDVEVEX1JFUVVFU1QAQ0xJRU5UX0NMT1NFRF9SRVFVRVNUAENMSUVOVF9DTE9TRURfTE9BRF9CQUxBTkNFRF9SRVFVRVNUAEJBRF9SRVFVRVNUAEhUVFBfUkVRVUVTVF9TRU5UX1RPX0hUVFBTX1BPUlQAUkVQT1JUAElNX0FfVEVBUE9UAFJFU0VUX0NPTlRFTlQATk9fQ09OVEVOVABQQVJUSUFMX0NPTlRFTlQASFBFX0lOVkFMSURfQ09OU1RBTlQASFBFX0NCX1JFU0VUAEdFVABIUEVfU1RSSUNUAENPTkZMSUNUAFRFTVBPUkFSWV9SRURJUkVDVABQRVJNQU5FTlRfUkVESVJFQ1QAQ09OTkVDVABNVUxUSV9TVEFUVVMASFBFX0lOVkFMSURfU1RBVFVTAFRPT19NQU5ZX1JFUVVFU1RTAEVBUkxZX0hJTlRTAFVOQVZBSUxBQkxFX0ZPUl9MRUdBTF9SRUFTT05TAE9QVElPTlMAU1dJVENISU5HX1BST1RPQ09MUwBWQVJJQU5UX0FMU09fTkVHT1RJQVRFUwBNVUxUSVBMRV9DSE9JQ0VTAElOVEVSTkFMX1NFUlZFUl9FUlJPUgBXRUJfU0VSVkVSX1VOS05PV05fRVJST1IAUkFJTEdVTl9FUlJPUgBJREVOVElUWV9QUk9WSURFUl9BVVRIRU5USUNBVElPTl9FUlJPUgBTU0xfQ0VSVElGSUNBVEVfRVJST1IASU5WQUxJRF9YX0ZPUldBUkRFRF9GT1IAU0VUX1BBUkFNRVRFUgBHRVRfUEFSQU1FVEVSAEhQRV9VU0VSAFNFRV9PVEhFUgBIUEVfQ0JfQ0hVTktfSEVBREVSAE1LQ0FMRU5EQVIAU0VUVVAAV0VCX1NFUlZFUl9JU19ET1dOAFRFQVJET1dOAEhQRV9DTE9TRURfQ09OTkVDVElPTgBIRVVSSVNUSUNfRVhQSVJBVElPTgBESVNDT05ORUNURURfT1BFUkFUSU9OAE5PTl9BVVRIT1JJVEFUSVZFX0lORk9STUFUSU9OAEhQRV9JTlZBTElEX1ZFUlNJT04ASFBFX0NCX01FU1NBR0VfQkVHSU4AU0lURV9JU19GUk9aRU4ASFBFX0lOVkFMSURfSEVBREVSX1RPS0VOAElOVkFMSURfVE9LRU4ARk9SQklEREVOAEVOSEFOQ0VfWU9VUl9DQUxNAEhQRV9JTlZBTElEX1VSTABCTE9DS0VEX0JZX1BBUkVOVEFMX0NPTlRST0wATUtDT0wAQUNMAEhQRV9JTlRFUk5BTABSRVFVRVNUX0hFQURFUl9GSUVMRFNfVE9PX0xBUkdFX1VOT0ZGSUNJQUwASFBFX09LAFVOTElOSwBVTkxPQ0sAUFJJAFJFVFJZX1dJVEgASFBFX0lOVkFMSURfQ09OVEVOVF9MRU5HVEgASFBFX1VORVhQRUNURURfQ09OVEVOVF9MRU5HVEgARkxVU0gAUFJPUFBBVENIAE0tU0VBUkNIAFVSSV9UT09fTE9ORwBQUk9DRVNTSU5HAE1JU0NFTExBTkVPVVNfUEVSU0lTVEVOVF9XQVJOSU5HAE1JU0NFTExBTkVPVVNfV0FSTklORwBIUEVfSU5WQUxJRF9UUkFOU0ZFUl9FTkNPRElORwBFeHBlY3RlZCBDUkxGAEhQRV9JTlZBTElEX0NIVU5LX1NJWkUATU9WRQBDT05USU5VRQBIUEVfQ0JfU1RBVFVTX0NPTVBMRVRFAEhQRV9DQl9IRUFERVJTX0NPTVBMRVRFAEhQRV9DQl9WRVJTSU9OX0NPTVBMRVRFAEhQRV9DQl9VUkxfQ09NUExFVEUASFBFX0NCX0NIVU5LX0NPTVBMRVRFAEhQRV9DQl9IRUFERVJfVkFMVUVfQ09NUExFVEUASFBFX0NCX0NIVU5LX0VYVEVOU0lPTl9WQUxVRV9DT01QTEVURQBIUEVfQ0JfQ0hVTktfRVhURU5TSU9OX05BTUVfQ09NUExFVEUASFBFX0NCX01FU1NBR0VfQ09NUExFVEUASFBFX0NCX01FVEhPRF9DT01QTEVURQBIUEVfQ0JfSEVBREVSX0ZJRUxEX0NPTVBMRVRFAERFTEVURQBIUEVfSU5WQUxJRF9FT0ZfU1RBVEUASU5WQUxJRF9TU0xfQ0VSVElGSUNBVEUAUEFVU0UATk9fUkVTUE9OU0UAVU5TVVBQT1JURURfTUVESUFfVFlQRQBHT05FAE5PVF9BQ0NFUFRBQkxFAFNFUlZJQ0VfVU5BVkFJTEFCTEUAUkFOR0VfTk9UX1NBVElTRklBQkxFAE9SSUdJTl9JU19VTlJFQUNIQUJMRQBSRVNQT05TRV9JU19TVEFMRQBQVVJHRQBNRVJHRQBSRVFVRVNUX0hFQURFUl9GSUVMRFNfVE9PX0xBUkdFAFJFUVVFU1RfSEVBREVSX1RPT19MQVJHRQBQQVlMT0FEX1RPT19MQVJHRQBJTlNVRkZJQ0lFTlRfU1RPUkFHRQBIUEVfUEFVU0VEX1VQR1JBREUASFBFX1BBVVNFRF9IMl9VUEdSQURFAFNPVVJDRQBBTk5PVU5DRQBUUkFDRQBIUEVfVU5FWFBFQ1RFRF9TUEFDRQBERVNDUklCRQBVTlNVQlNDUklCRQBSRUNPUkQASFBFX0lOVkFMSURfTUVUSE9EAE5PVF9GT1VORABQUk9QRklORABVTkJJTkQAUkVCSU5EAFVOQVVUSE9SSVpFRABNRVRIT0RfTk9UX0FMTE9XRUQASFRUUF9WRVJTSU9OX05PVF9TVVBQT1JURUQAQUxSRUFEWV9SRVBPUlRFRABBQ0NFUFRFRABOT1RfSU1QTEVNRU5URUQATE9PUF9ERVRFQ1RFRABIUEVfQ1JfRVhQRUNURUQASFBFX0xGX0VYUEVDVEVEAENSRUFURUQASU1fVVNFRABIUEVfUEFVU0VEAFRJTUVPVVRfT0NDVVJFRABQQVlNRU5UX1JFUVVJUkVEAFBSRUNPTkRJVElPTl9SRVFVSVJFRABQUk9YWV9BVVRIRU5USUNBVElPTl9SRVFVSVJFRABORVRXT1JLX0FVVEhFTlRJQ0FUSU9OX1JFUVVJUkVEAExFTkdUSF9SRVFVSVJFRABTU0xfQ0VSVElGSUNBVEVfUkVRVUlSRUQAVVBHUkFERV9SRVFVSVJFRABQQUdFX0VYUElSRUQAUFJFQ09ORElUSU9OX0ZBSUxFRABFWFBFQ1RBVElPTl9GQUlMRUQAUkVWQUxJREFUSU9OX0ZBSUxFRABTU0xfSEFORFNIQUtFX0ZBSUxFRABMT0NLRUQAVFJBTlNGT1JNQVRJT05fQVBQTElFRABOT1RfTU9ESUZJRUQATk9UX0VYVEVOREVEAEJBTkRXSURUSF9MSU1JVF9FWENFRURFRABTSVRFX0lTX09WRVJMT0FERUQASEVBRABFeHBlY3RlZCBIVFRQLwAAXhMAACYTAAAwEAAA8BcAAJ0TAAAVEgAAORcAAPASAAAKEAAAdRIAAK0SAACCEwAATxQAAH8QAACgFQAAIxQAAIkSAACLFAAATRUAANQRAADPFAAAEBgAAMkWAADcFgAAwREAAOAXAAC7FAAAdBQAAHwVAADlFAAACBcAAB8QAABlFQAAoxQAACgVAAACFQAAmRUAACwQAACLGQAATw8AANQOAABqEAAAzhAAAAIXAACJDgAAbhMAABwTAABmFAAAVhcAAMETAADNEwAAbBMAAGgXAABmFwAAXxcAACITAADODwAAaQ4AANgOAABjFgAAyxMAAKoOAAAoFwAAJhcAAMUTAABdFgAA6BEAAGcTAABlEwAA8hYAAHMTAAAdFwAA+RYAAPMRAADPDgAAzhUAAAwSAACzEQAApREAAGEQAAAyFwAAuxMAAAAAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAABAQIBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEAAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQAAAAAAAAAAAAAAAAABAAAAAAAAAAAAAAAAAAAAAAAAAAIDAgICAgIAAAICAAICAAICAgICAgICAgIABAAAAAAAAgICAgICAgICAgICAgICAgICAgICAgICAgIAAAACAgICAgICAgICAgICAgICAgICAgICAgICAgICAgACAAIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAACAAICAgICAAACAgACAgACAgICAgICAgICAAMABAAAAAICAgICAgICAgICAgICAgICAgICAgICAgICAAAAAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAAgACAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAbG9zZWVlcC1hbGl2ZQAAAAAAAAAAAAAAAAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEAAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEAAAAAAAAAAAABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEBAQEBAQEBAQEBAQIBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAAEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBY2h1bmtlZAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQEAAQEBAQEAAAEBAAEBAAEBAQEBAQEBAQEAAAAAAAAAAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEAAAABAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQABAAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABlY3Rpb25lbnQtbGVuZ3Rob25yb3h5LWNvbm5lY3Rpb24AAAAAAAAAAAAAAAAAAAByYW5zZmVyLWVuY29kaW5ncGdyYWRlDQoNCg0KU00NCg0KVFRQL0NFL1RTUC8AAAAAAAAAAAAAAAABAgABAwAAAAAAAAAAAAAAAAAAAAAAAAQBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAAEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAAAAAAAAAAAAAQIAAQMAAAAAAAAAAAAAAAAAAAAAAAAEAQEFAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQABAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQAAAAAAAAAAAAEAAAEAAAAAAAAAAAAAAAAAAAAAAAAAAAEBAAEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQABAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEAAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEAAAAAAAAAAAAAAQAAAgAAAAAAAAAAAAAAAAAAAAAAAAMEAAAEBAQEBAQEBAQEBAUEBAQEBAQEBAQEBAQABAAGBwQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAAEAAQABAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQAAAAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEAAAEAAAAAAAAAAAAAAAAAAAAAAAABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAIAAAAAAAADAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwAAAAAAAAMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABAAABAAAAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAIAAAAAAgAAAAAAAAAAAAAAAAAAAAAAAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMAAAAAAAADAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABOT1VOQ0VFQ0tPVVRORUNURVRFQ1JJQkVMVVNIRVRFQURTRUFSQ0hSR0VDVElWSVRZTEVOREFSVkVPVElGWVBUSU9OU0NIU0VBWVNUQVRDSEdFT1JESVJFQ1RPUlRSQ0hQQVJBTUVURVJVUkNFQlNDUklCRUFSRE9XTkFDRUlORE5LQ0tVQlNDUklCRUhUVFAvQURUUC8="},3434:e=>{e.exports="AGFzbQEAAAABMAhgAX8Bf2ADf39/AX9gBH9/f38Bf2AAAGADf39/AGABfwBgAn9/AGAGf39/f39/AALLAQgDZW52GHdhc21fb25faGVhZGVyc19jb21wbGV0ZQACA2VudhV3YXNtX29uX21lc3NhZ2VfYmVnaW4AAANlbnYLd2FzbV9vbl91cmwAAQNlbnYOd2FzbV9vbl9zdGF0dXMAAQNlbnYUd2FzbV9vbl9oZWFkZXJfZmllbGQAAQNlbnYUd2FzbV9vbl9oZWFkZXJfdmFsdWUAAQNlbnYMd2FzbV9vbl9ib2R5AAEDZW52GHdhc21fb25fbWVzc2FnZV9jb21wbGV0ZQAAA0ZFAwMEAAAFAAAAAAAABQEFAAUFBQAABgAAAAAGBgYGAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQABAAABAQcAAAUFAwABBAUBcAESEgUDAQACBggBfwFBgNQECwfRBSIGbWVtb3J5AgALX2luaXRpYWxpemUACRlfX2luZGlyZWN0X2Z1bmN0aW9uX3RhYmxlAQALbGxodHRwX2luaXQAChhsbGh0dHBfc2hvdWxkX2tlZXBfYWxpdmUAQQxsbGh0dHBfYWxsb2MADAZtYWxsb2MARgtsbGh0dHBfZnJlZQANBGZyZWUASA9sbGh0dHBfZ2V0X3R5cGUADhVsbGh0dHBfZ2V0X2h0dHBfbWFqb3IADxVsbGh0dHBfZ2V0X2h0dHBfbWlub3IAEBFsbGh0dHBfZ2V0X21ldGhvZAARFmxsaHR0cF9nZXRfc3RhdHVzX2NvZGUAEhJsbGh0dHBfZ2V0X3VwZ3JhZGUAEwxsbGh0dHBfcmVzZXQAFA5sbGh0dHBfZXhlY3V0ZQAVFGxsaHR0cF9zZXR0aW5nc19pbml0ABYNbGxodHRwX2ZpbmlzaAAXDGxsaHR0cF9wYXVzZQAYDWxsaHR0cF9yZXN1bWUAGRtsbGh0dHBfcmVzdW1lX2FmdGVyX3VwZ3JhZGUAGhBsbGh0dHBfZ2V0X2Vycm5vABsXbGxodHRwX2dldF9lcnJvcl9yZWFzb24AHBdsbGh0dHBfc2V0X2Vycm9yX3JlYXNvbgAdFGxsaHR0cF9nZXRfZXJyb3JfcG9zAB4RbGxodHRwX2Vycm5vX25hbWUAHxJsbGh0dHBfbWV0aG9kX25hbWUAIBJsbGh0dHBfc3RhdHVzX25hbWUAIRpsbGh0dHBfc2V0X2xlbmllbnRfaGVhZGVycwAiIWxsaHR0cF9zZXRfbGVuaWVudF9jaHVua2VkX2xlbmd0aAAjHWxsaHR0cF9zZXRfbGVuaWVudF9rZWVwX2FsaXZlACQkbGxodHRwX3NldF9sZW5pZW50X3RyYW5zZmVyX2VuY29kaW5nACUYbGxodHRwX21lc3NhZ2VfbmVlZHNfZW9mAD8JFwEAQQELEQECAwQFCwYHNTk3MS8tJyspCrLgAkUCAAsIABCIgICAAAsZACAAEMKAgIAAGiAAIAI2AjggACABOgAoCxwAIAAgAC8BMiAALQAuIAAQwYCAgAAQgICAgAALKgEBf0HAABDGgICAACIBEMKAgIAAGiABQYCIgIAANgI4IAEgADoAKCABCwoAIAAQyICAgAALBwAgAC0AKAsHACAALQAqCwcAIAAtACsLBwAgAC0AKQsHACAALwEyCwcAIAAtAC4LRQEEfyAAKAIYIQEgAC0ALSECIAAtACghAyAAKAI4IQQgABDCgICAABogACAENgI4IAAgAzoAKCAAIAI6AC0gACABNgIYCxEAIAAgASABIAJqEMOAgIAACxAAIABBAEHcABDMgICAABoLZwEBf0EAIQECQCAAKAIMDQACQAJAAkACQCAALQAvDgMBAAMCCyAAKAI4IgFFDQAgASgCLCIBRQ0AIAAgARGAgICAAAAiAQ0DC0EADwsQyoCAgAAACyAAQcOWgIAANgIQQQ4hAQsgAQseAAJAIAAoAgwNACAAQdGbgIAANgIQIABBFTYCDAsLFgACQCAAKAIMQRVHDQAgAEEANgIMCwsWAAJAIAAoAgxBFkcNACAAQQA2AgwLCwcAIAAoAgwLBwAgACgCEAsJACAAIAE2AhALBwAgACgCFAsiAAJAIABBJEkNABDKgICAAAALIABBAnRBoLOAgABqKAIACyIAAkAgAEEuSQ0AEMqAgIAAAAsgAEECdEGwtICAAGooAgAL7gsBAX9B66iAgAAhAQJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAIABBnH9qDvQDY2IAAWFhYWFhYQIDBAVhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhBgcICQoLDA0OD2FhYWFhEGFhYWFhYWFhYWFhEWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYRITFBUWFxgZGhthYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhHB0eHyAhIiMkJSYnKCkqKywtLi8wMTIzNDU2YTc4OTphYWFhYWFhYTthYWE8YWFhYT0+P2FhYWFhYWFhQGFhQWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYUJDREVGR0hJSktMTU5PUFFSU2FhYWFhYWFhVFVWV1hZWlthXF1hYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFeYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhX2BhC0Hhp4CAAA8LQaShgIAADwtBy6yAgAAPC0H+sYCAAA8LQcCkgIAADwtBq6SAgAAPC0GNqICAAA8LQeKmgIAADwtBgLCAgAAPC0G5r4CAAA8LQdekgIAADwtB75+AgAAPC0Hhn4CAAA8LQfqfgIAADwtB8qCAgAAPC0Gor4CAAA8LQa6ygIAADwtBiLCAgAAPC0Hsp4CAAA8LQYKigIAADwtBjp2AgAAPC0HQroCAAA8LQcqjgIAADwtBxbKAgAAPC0HfnICAAA8LQdKcgIAADwtBxKCAgAAPC0HXoICAAA8LQaKfgIAADwtB7a6AgAAPC0GrsICAAA8LQdSlgIAADwtBzK6AgAAPC0H6roCAAA8LQfyrgIAADwtB0rCAgAAPC0HxnYCAAA8LQbuggIAADwtB96uAgAAPC0GQsYCAAA8LQdexgIAADwtBoq2AgAAPC0HUp4CAAA8LQeCrgIAADwtBn6yAgAAPC0HrsYCAAA8LQdWfgIAADwtByrGAgAAPC0HepYCAAA8LQdSegIAADwtB9JyAgAAPC0GnsoCAAA8LQbGdgIAADwtBoJ2AgAAPC0G5sYCAAA8LQbywgIAADwtBkqGAgAAPC0GzpoCAAA8LQemsgIAADwtBrJ6AgAAPC0HUq4CAAA8LQfemgIAADwtBgKaAgAAPC0GwoYCAAA8LQf6egIAADwtBjaOAgAAPC0GJrYCAAA8LQfeigIAADwtBoLGAgAAPC0Gun4CAAA8LQcalgIAADwtB6J6AgAAPC0GTooCAAA8LQcKvgIAADwtBw52AgAAPC0GLrICAAA8LQeGdgIAADwtBja+AgAAPC0HqoYCAAA8LQbStgIAADwtB0q+AgAAPC0HfsoCAAA8LQdKygIAADwtB8LCAgAAPC0GpooCAAA8LQfmjgIAADwtBmZ6AgAAPC0G1rICAAA8LQZuwgIAADwtBkrKAgAAPC0G2q4CAAA8LQcKigIAADwtB+LKAgAAPC0GepYCAAA8LQdCigIAADwtBup6AgAAPC0GBnoCAAA8LEMqAgIAAAAtB1qGAgAAhAQsgAQsWACAAIAAtAC1B/gFxIAFBAEdyOgAtCxkAIAAgAC0ALUH9AXEgAUEAR0EBdHI6AC0LGQAgACAALQAtQfsBcSABQQBHQQJ0cjoALQsZACAAIAAtAC1B9wFxIAFBAEdBA3RyOgAtCy4BAn9BACEDAkAgACgCOCIERQ0AIAQoAgAiBEUNACAAIAQRgICAgAAAIQMLIAMLSQECf0EAIQMCQCAAKAI4IgRFDQAgBCgCBCIERQ0AIAAgASACIAFrIAQRgYCAgAAAIgNBf0cNACAAQcaRgIAANgIQQRghAwsgAwsuAQJ/QQAhAwJAIAAoAjgiBEUNACAEKAIwIgRFDQAgACAEEYCAgIAAACEDCyADC0kBAn9BACEDAkAgACgCOCIERQ0AIAQoAggiBEUNACAAIAEgAiABayAEEYGAgIAAACIDQX9HDQAgAEH2ioCAADYCEEEYIQMLIAMLLgECf0EAIQMCQCAAKAI4IgRFDQAgBCgCNCIERQ0AIAAgBBGAgICAAAAhAwsgAwtJAQJ/QQAhAwJAIAAoAjgiBEUNACAEKAIMIgRFDQAgACABIAIgAWsgBBGBgICAAAAiA0F/Rw0AIABB7ZqAgAA2AhBBGCEDCyADCy4BAn9BACEDAkAgACgCOCIERQ0AIAQoAjgiBEUNACAAIAQRgICAgAAAIQMLIAMLSQECf0EAIQMCQCAAKAI4IgRFDQAgBCgCECIERQ0AIAAgASACIAFrIAQRgYCAgAAAIgNBf0cNACAAQZWQgIAANgIQQRghAwsgAwsuAQJ/QQAhAwJAIAAoAjgiBEUNACAEKAI8IgRFDQAgACAEEYCAgIAAACEDCyADC0kBAn9BACEDAkAgACgCOCIERQ0AIAQoAhQiBEUNACAAIAEgAiABayAEEYGAgIAAACIDQX9HDQAgAEGqm4CAADYCEEEYIQMLIAMLLgECf0EAIQMCQCAAKAI4IgRFDQAgBCgCQCIERQ0AIAAgBBGAgICAAAAhAwsgAwtJAQJ/QQAhAwJAIAAoAjgiBEUNACAEKAIYIgRFDQAgACABIAIgAWsgBBGBgICAAAAiA0F/Rw0AIABB7ZOAgAA2AhBBGCEDCyADCy4BAn9BACEDAkAgACgCOCIERQ0AIAQoAkQiBEUNACAAIAQRgICAgAAAIQMLIAMLLgECf0EAIQMCQCAAKAI4IgRFDQAgBCgCJCIERQ0AIAAgBBGAgICAAAAhAwsgAwsuAQJ/QQAhAwJAIAAoAjgiBEUNACAEKAIsIgRFDQAgACAEEYCAgIAAACEDCyADC0kBAn9BACEDAkAgACgCOCIERQ0AIAQoAigiBEUNACAAIAEgAiABayAEEYGAgIAAACIDQX9HDQAgAEH2iICAADYCEEEYIQMLIAMLLgECf0EAIQMCQCAAKAI4IgRFDQAgBCgCUCIERQ0AIAAgBBGAgICAAAAhAwsgAwtJAQJ/QQAhAwJAIAAoAjgiBEUNACAEKAIcIgRFDQAgACABIAIgAWsgBBGBgICAAAAiA0F/Rw0AIABBwpmAgAA2AhBBGCEDCyADCy4BAn9BACEDAkAgACgCOCIERQ0AIAQoAkgiBEUNACAAIAQRgICAgAAAIQMLIAMLSQECf0EAIQMCQCAAKAI4IgRFDQAgBCgCICIERQ0AIAAgASACIAFrIAQRgYCAgAAAIgNBf0cNACAAQZSUgIAANgIQQRghAwsgAwsuAQJ/QQAhAwJAIAAoAjgiBEUNACAEKAJMIgRFDQAgACAEEYCAgIAAACEDCyADCy4BAn9BACEDAkAgACgCOCIERQ0AIAQoAlQiBEUNACAAIAQRgICAgAAAIQMLIAMLLgECf0EAIQMCQCAAKAI4IgRFDQAgBCgCWCIERQ0AIAAgBBGAgICAAAAhAwsgAwtFAQF/AkACQCAALwEwQRRxQRRHDQBBASEDIAAtAChBAUYNASAALwEyQeUARiEDDAELIAAtAClBBUYhAwsgACADOgAuQQAL/gEBA39BASEDAkAgAC8BMCIEQQhxDQAgACkDIEIAUiEDCwJAAkAgAC0ALkUNAEEBIQUgAC0AKUEFRg0BQQEhBSAEQcAAcUUgA3FBAUcNAQtBACEFIARBwABxDQBBAiEFIARB//8DcSIDQQhxDQACQCADQYAEcUUNAAJAIAAtAChBAUcNACAALQAtQQpxDQBBBQ8LQQQPCwJAIANBIHENAAJAIAAtAChBAUYNACAALwEyQf//A3EiAEGcf2pB5ABJDQAgAEHMAUYNACAAQbACRg0AQQQhBSAEQShxRQ0CIANBiARxQYAERg0CC0EADwtBAEEDIAApAyBQGyEFCyAFC2IBAn9BACEBAkAgAC0AKEEBRg0AIAAvATJB//8DcSICQZx/akHkAEkNACACQcwBRg0AIAJBsAJGDQAgAC8BMCIAQcAAcQ0AQQEhASAAQYgEcUGABEYNACAAQShxRSEBCyABC6cBAQN/AkACQAJAIAAtACpFDQAgAC0AK0UNAEEAIQMgAC8BMCIEQQJxRQ0BDAILQQAhAyAALwEwIgRBAXFFDQELQQEhAyAALQAoQQFGDQAgAC8BMkH//wNxIgVBnH9qQeQASQ0AIAVBzAFGDQAgBUGwAkYNACAEQcAAcQ0AQQAhAyAEQYgEcUGABEYNACAEQShxQQBHIQMLIABBADsBMCAAQQA6AC8gAwuZAQECfwJAAkACQCAALQAqRQ0AIAAtACtFDQBBACEBIAAvATAiAkECcUUNAQwCC0EAIQEgAC8BMCICQQFxRQ0BC0EBIQEgAC0AKEEBRg0AIAAvATJB//8DcSIAQZx/akHkAEkNACAAQcwBRg0AIABBsAJGDQAgAkHAAHENAEEAIQEgAkGIBHFBgARGDQAgAkEocUEARyEBCyABC0kBAXsgAEEQav0MAAAAAAAAAAAAAAAAAAAAACIB/QsDACAAIAH9CwMAIABBMGogAf0LAwAgAEEgaiAB/QsDACAAQd0BNgIcQQALewEBfwJAIAAoAgwiAw0AAkAgACgCBEUNACAAIAE2AgQLAkAgACABIAIQxICAgAAiAw0AIAAoAgwPCyAAIAM2AhxBACEDIAAoAgQiAUUNACAAIAEgAiAAKAIIEYGAgIAAACIBRQ0AIAAgAjYCFCAAIAE2AgwgASEDCyADC+TzAQMOfwN+BH8jgICAgABBEGsiAySAgICAACABIQQgASEFIAEhBiABIQcgASEIIAEhCSABIQogASELIAEhDCABIQ0gASEOIAEhDwJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQCAAKAIcIhBBf2oO3QHaAQHZAQIDBAUGBwgJCgsMDQ7YAQ8Q1wEREtYBExQVFhcYGRob4AHfARwdHtUBHyAhIiMkJdQBJicoKSorLNMB0gEtLtEB0AEvMDEyMzQ1Njc4OTo7PD0+P0BBQkNERUbbAUdISUrPAc4BS80BTMwBTU5PUFFSU1RVVldYWVpbXF1eX2BhYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ent8fX5/gAGBAYIBgwGEAYUBhgGHAYgBiQGKAYsBjAGNAY4BjwGQAZEB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QAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAIBAOxwEAAQID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YWNrIGVycm9yAGBvbl9jaHVua19leHRlbnNpb25fdmFsdWVgIGNhbGxiYWNrIGVycm9yAGBvbl9zdGF0dXNfY29tcGxldGVgIGNhbGxiYWNrIGVycm9yAGBvbl92ZXJzaW9uX2NvbXBsZXRlYCBjYWxsYmFjayBlcnJvcgBgb25fdXJsX2NvbXBsZXRlYCBjYWxsYmFjayBlcnJvcgBgb25fY2h1bmtfY29tcGxldGVgIGNhbGxiYWNrIGVycm9yAGBvbl9oZWFkZXJfdmFsdWVfY29tcGxldGVgIGNhbGxiYWNrIGVycm9yAGBvbl9tZXNzYWdlX2NvbXBsZXRlYCBjYWxsYmFjayBlcnJvcgBgb25fbWV0aG9kX2NvbXBsZXRlYCBjYWxsYmFjayBlcnJvcgBgb25faGVhZGVyX2ZpZWxkX2NvbXBsZXRlYCBjYWxsYmFjayBlcnJvcgBgb25fY2h1bmtfZXh0ZW5zaW9uX25hbWVgIGNhbGxiYWNrIGVycm9yAFVuZXhwZWN0ZWQgY2hhciBpbiB1cmwgc2VydmVyAEludmFsaWQgaGVhZGVyIHZhbHVlIGNoYXIASW52YWxpZCBoZWFkZXIgZmllbGQgY2hhcgBTcGFuIGNhbGxiYWNrIGVycm9yIGluIG9uX3ZlcnNpb24ASW52YWxpZCBtaW5vciB2ZXJzaW9uAEludmFsaWQgbWFqb3IgdmVyc2lvbgBFeHBlY3RlZCBzcGFjZSBhZnRlciB2ZXJzaW9uAEV4cGVjdGVkIENSTEYgYWZ0ZXIgdmVyc2lvbgBJbnZhbGlkIEhUVFAgdmVyc2lvbgBJbnZhbGlkIGhlYWRlciB0b2tlbgBTcGFuIGNhbGxiYWNrIGVycm9yIGluIG9uX3VybABJbnZhbGlkIGNoYXJhY3RlcnMgaW4gdXJsAFVuZXhwZWN0ZWQgc3RhcnQgY2hhciBpbiB1cmwARG91YmxlIEAgaW4gdXJsAEVtcHR5IENvbnRlbnQtTGVuZ3RoAEludmFsaWQgY2hhcmFjdGVyIGluIENvbnRlbnQtTGVuZ3RoAER1cGxpY2F0ZSBDb250ZW50LUxlbmd0aABJbnZhbGlkIGNoYXIgaW4gdXJsIHBhdGgAQ29udGVudC1MZW5ndGggY2FuJ3QgYmUgcHJlc2VudCB3aXRoIFRyYW5zZmVyLUVuY29kaW5nAEludmFsaWQgY2hhcmFjdGVyIGluIGNodW5rIHNpemUAU3BhbiBjYWxsYmFjayBlcnJvciBpbiBvbl9oZWFkZXJfdmFsdWUAU3BhbiBjYWxsYmFjayBlcnJvciBpbiBvbl9jaHVua19leHRlbnNpb25fdmFsdWUASW52YWxpZCBjaGFyYWN0ZXIgaW4gY2h1bmsgZXh0ZW5zaW9ucyB2YWx1ZQBNaXNzaW5nIGV4cGVjdGVkIExGIGFmdGVyIGhlYWRlciB2YWx1ZQBJbnZhbGlkIGBUcmFuc2Zlci1FbmNvZGluZ2AgaGVhZGVyIHZhbHVlAEludmFsaWQgY2hhcmFjdGVyIGluIGNodW5rIGV4dGVuc2lvbnMgcXVvdGUgdmFsdWUASW52YWxpZCBjaGFyYWN0ZXIgaW4gY2h1bmsgZXh0ZW5zaW9ucyBxdW90ZWQgdmFsdWUAUGF1c2VkIGJ5IG9uX2hlYWRlcnNfY29tcGxldGUASW52YWxpZCBFT0Ygc3RhdGUAb25fcmVzZXQgcGF1c2UAb25fY2h1bmtfaGVhZGVyIHBhdXNlAG9uX21lc3NhZ2VfYmVnaW4gcGF1c2UAb25fY2h1bmtfZXh0ZW5zaW9uX3ZhbHVlIHBhdXNlAG9uX3N0YXR1c19jb21wbGV0ZSBwYXVzZQBvbl92ZXJzaW9uX2NvbXBsZXRlIHBhdXNlAG9uX3VybF9jb21wbGV0ZSBwYXVzZQBvbl9jaHVua19jb21wbGV0ZSBwYXVzZQBvbl9oZWFkZXJfdmFsdWVfY29tcGxldGUgcGF1c2UAb25fbWVzc2FnZV9jb21wbGV0ZSBwYXVzZQBvbl9tZXRob2RfY29tcGxldGUgcGF1c2UAb25faGVhZGVyX2ZpZWxkX2NvbXBsZXRlIHBhdXNlAG9uX2NodW5rX2V4dGVuc2lvbl9uYW1lIHBhdXNlAFVuZXhwZWN0ZWQgc3BhY2UgYWZ0ZXIgc3RhcnQgbGluZQBTcGFuIGNhbGxiYWNrIGVycm9yIGluIG9uX2NodW5rX2V4dGVuc2lvbl9uYW1lAEludmFsaWQgY2hhcmFjdGVyIGluIGNodW5rIGV4dGVuc2lvbnMgbmFtZQBQYXVzZSBvbiBDT05ORUNUL1VwZ3JhZGUAUGF1c2Ugb24gUFJJL1VwZ3JhZGUARXhwZWN0ZWQgSFRUUC8yIENvbm5lY3Rpb24gUHJlZmFjZQBTcGFuIGNhbGxiYWNrIGVycm9yIGluIG9uX21ldGhvZABFeHBlY3RlZCBzcGFjZSBhZnRlciBtZXRob2QAU3BhbiBjYWxsYmFjayBlcnJvciBpbiBvbl9oZWFkZXJfZmllbGQAUGF1c2VkAEludmFsaWQgd29yZCBlbmNvdW50ZXJlZABJbnZhbGlkIG1ldGhvZCBlbmNvdW50ZXJlZABVbmV4cGVjdGVkIGNoYXIgaW4gdXJsIHNjaGVtYQBSZXF1ZXN0IGhhcyBpbnZhbGlkIGBUcmFuc2Zlci1FbmNvZGluZ2AAU1dJVENIX1BST1hZAFVTRV9QUk9YWQBNS0FDVElWSVRZAFVOUFJPQ0VTU0FCTEVfRU5USVRZAENPUFkATU9WRURfUEVSTUFORU5UTFkAVE9PX0VBUkxZAE5PVElGWQBGQUlMRURfREVQRU5ERU5DWQBCQURfR0FURVdBWQBQTEFZAFBVVABDSEVDS09VVABHQVRFV0FZX1RJTUVPVVQAUkVRVUVTVF9USU1FT1VUAE5FVFdPUktfQ09OTkVDVF9USU1FT1VUAENPTk5FQ1RJT05fVElNRU9VVABMT0dJTl9USU1FT1VUAE5FVFdPUktfUkVBRF9USU1FT1VUAFBPU1QATUlTRElSRUNURURfUkVRVUVTVABDTElFTlRfQ0xPU0VEX1JFUVVFU1QAQ0xJRU5UX0NMT1NFRF9MT0FEX0JBTEFOQ0VEX1JFUVVFU1QAQkFEX1JFUVVFU1QASFRUUF9SRVFVRVNUX1NFTlRfVE9fSFRUUFNfUE9SVABSRVBPUlQASU1fQV9URUFQT1QAUkVTRVRfQ09OVEVOVABOT19DT05URU5UAFBBUlRJQUxfQ09OVEVOVABIUEVfSU5WQUxJRF9DT05TVEFOVABIUEVfQ0JfUkVTRVQAR0VUAEhQRV9TVFJJQ1QAQ09ORkxJQ1QAVEVNUE9SQVJZX1JFRElSRUNUAFBFUk1BTkVOVF9SRURJUkVDVABDT05ORUNUAE1VTFRJX1NUQVRVUwBIUEVfSU5WQUxJRF9TVEFUVVMAVE9PX01BTllfUkVRVUVTVFMARUFSTFlfSElOVFMAVU5BVkFJTEFCTEVfRk9SX0xFR0FMX1JFQVNPTlMAT1BUSU9OUwBTV0lUQ0hJTkdfUFJPVE9DT0xTAFZBUklBTlRfQUxTT19ORUdPVElBVEVTAE1VTFRJUExFX0NIT0lDRVMASU5URVJOQUxfU0VSVkVSX0VSUk9SAFdFQl9TRVJWRVJfVU5LTk9XTl9FUlJPUgBSQUlMR1VOX0VSUk9SAElERU5USVRZX1BST1ZJREVSX0FVVEhFTlRJQ0FUSU9OX0VSUk9SAFNTTF9DRVJUSUZJQ0FURV9FUlJPUgBJTlZBTElEX1hfRk9SV0FSREVEX0ZPUgBTRVRfUEFSQU1FVEVSAEdFVF9QQVJBTUVURVIASFBFX1VTRVIAU0VFX09USEVSAEhQRV9DQl9DSFVOS19IRUFERVIATUtDQUxFTkRBUgBTRVRVUABXRUJfU0VSVkVSX0lTX0RPV04AVEVBUkRPV04ASFBFX0NMT1NFRF9DT05ORUNUSU9OAEhFVVJJU1RJQ19FWFBJUkFUSU9OAERJU0NPTk5FQ1RFRF9PUEVSQVRJT04ATk9OX0FVVEhPUklUQVRJVkVfSU5GT1JNQVRJT04ASFBFX0lOVkFMSURfVkVSU0lPTgBIUEVfQ0JfTUVTU0FHRV9CRUdJTgBTSVRFX0lTX0ZST1pFTgBIUEVfSU5WQUxJRF9IRUFERVJfVE9LRU4ASU5WQUxJRF9UT0tFTgBGT1JCSURERU4ARU5IQU5DRV9ZT1VSX0NBTE0ASFBFX0lOVkFMSURfVVJMAEJMT0NLRURfQllfUEFSRU5UQUxfQ09OVFJPTABNS0NPTABBQ0wASFBFX0lOVEVSTkFMAFJFUVVFU1RfSEVBREVSX0ZJRUxEU19UT09fTEFSR0VfVU5PRkZJQ0lBTABIUEVfT0sAVU5MSU5LAFVOTE9DSwBQUkkAUkVUUllfV0lUSABIUEVfSU5WQUxJRF9DT05URU5UX0xFTkdUSABIUEVfVU5FWFBFQ1RFRF9DT05URU5UX0xFTkdUSABGTFVTSABQUk9QUEFUQ0gATS1TRUFSQ0gAVVJJX1RPT19MT05HAFBST0NFU1NJTkcATUlTQ0VMTEFORU9VU19QRVJTSVNURU5UX1dBUk5JTkcATUlTQ0VMTEFORU9VU19XQVJOSU5HAEhQRV9JTlZBTElEX1RSQU5TRkVSX0VOQ09ESU5HAEV4cGVjdGVkIENSTEYASFBFX0lOVkFMSURfQ0hVTktfU0laRQBNT1ZFAENPTlRJTlVFAEhQRV9DQl9TVEFUVVNfQ09NUExFVEUASFBFX0NCX0hFQURFUlNfQ09NUExFVEUASFBFX0NCX1ZFUlNJT05fQ09NUExFVEUASFBFX0NCX1VSTF9DT01QTEVURQBIUEVfQ0JfQ0hVTktfQ09NUExFVEUASFBFX0NCX0hFQURFUl9WQUxVRV9DT01QTEVURQBIUEVfQ0JfQ0hVTktfRVhURU5TSU9OX1ZBTFVFX0NPTVBMRVRFAEhQRV9DQl9DSFVOS19FWFRFTlNJT05fTkFNRV9DT01QTEVURQBIUEVfQ0JfTUVTU0FHRV9DT01QTEVURQBIUEVfQ0JfTUVUSE9EX0NPTVBMRVRFAEhQRV9DQl9IRUFERVJfRklFTERfQ09NUExFVEUAREVMRVRFAEhQRV9JTlZBTElEX0VPRl9TVEFURQBJTlZBTElEX1NTTF9DRVJUSUZJQ0FURQBQQVVTRQBOT19SRVNQT05TRQBVTlNVUFBPUlRFRF9NRURJQV9UWVBFAEdPTkUATk9UX0FDQ0VQVEFCTEUAU0VSVklDRV9VTkFWQUlMQUJMRQBSQU5HRV9OT1RfU0FUSVNGSUFCTEUAT1JJR0lOX0lTX1VOUkVBQ0hBQkxFAFJFU1BPTlNFX0lTX1NUQUxFAFBVUkdFAE1FUkdFAFJFUVVFU1RfSEVBREVSX0ZJRUxEU19UT09fTEFSR0UAUkVRVUVTVF9IRUFERVJfVE9PX0xBUkdFAFBBWUxPQURfVE9PX0xBUkdFAElOU1VGRklDSUVOVF9TVE9SQUdFAEhQRV9QQVVTRURfVVBHUkFERQBIUEVfUEFVU0VEX0gyX1VQR1JBREUAU09VUkNFAEFOTk9VTkNFAFRSQUNFAEhQRV9VTkVYUEVDVEVEX1NQQUNFAERFU0NSSUJFAFVOU1VCU0NSSUJFAFJFQ09SRABIUEVfSU5WQUxJRF9NRVRIT0QATk9UX0ZPVU5EAFBST1BGSU5EAFVOQklORABSRUJJTkQAVU5BVVRIT1JJWkVEAE1FVEhPRF9OT1RfQUxMT1dFRABIVFRQX1ZFUlNJT05fTk9UX1NVUFBPUlRFRABBTFJFQURZX1JFUE9SVEVEAEFDQ0VQVEVEAE5PVF9JTVBMRU1FTlRFRABMT09QX0RFVEVDVEVEAEhQRV9DUl9FWFBFQ1RFRABIUEVfTEZfRVhQRUNURUQAQ1JFQVRFRABJTV9VU0VEAEhQRV9QQVVTRUQAVElNRU9VVF9PQ0NVUkVEAFBBWU1FTlRfUkVRVUlSRUQAUFJFQ09ORElUSU9OX1JFUVVJUkVEAFBST1hZX0FVVEhFTlRJQ0FUSU9OX1JFUVVJUkVEAE5FVFdPUktfQVVUSEVOVElDQVRJT05fUkVRVUlSRUQATEVOR1RIX1JFUVVJUkVEAFNTTF9DRVJUSUZJQ0FURV9SRVFVSVJFRABVUEdSQURFX1JFUVVJUkVEAFBBR0VfRVhQSVJFRABQUkVDT05ESVRJT05fRkFJTEVEAEVYUEVDVEFUSU9OX0ZBSUxFRABSRVZBTElEQVRJT05fRkFJTEVEAFNTTF9IQU5EU0hBS0VfRkFJTEVEAExPQ0tFRABUUkFOU0ZPUk1BVElPTl9BUFBMSUVEAE5PVF9NT0RJRklFRABOT1RfRVhURU5ERUQAQkFORFdJRFRIX0xJTUlUX0VYQ0VFREVEAFNJVEVfSVNfT1ZFUkxPQURFRABIRUFEAEV4cGVjdGVkIEhUVFAvAABeEwAAJhMAADAQAADwFwAAnRMAABUSAAA5FwAA8BIAAAoQAAB1EgAArRIAAIITAABPFAAAfxAAAKAVAAAjFAAAiRIAAIsUAABNFQAA1BEAAM8UAAAQGAAAyRYAANwWAADBEQAA4BcAALsUAAB0FAAAfBUAAOUUAAAIFwAAHxAAAGUVAACjFAAAKBUAAAIVAACZFQAALBAAAIsZAABPDwAA1A4AAGoQAADOEAAAAhcAAIkOAABuEwAAHBMAAGYUAABWFwAAwRMAAM0TAABsEwAAaBcAAGYXAABfFwAAIhMAAM4PAABpDgAA2A4AAGMWAADLEwAAqg4AACgXAAAmFwAAxRMAAF0WAADoEQAAZxMAAGUTAADyFgAAcxMAAB0XAAD5FgAA8xEAAM8OAADOFQAADBIAALMRAAClEQAAYRAAADIXAAC7EwAAAAAAAAAAAAAAAAAAAAAAAAABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEBAgEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQABAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAAAAAAAAAAAAAAAAAAEAAAAAAAAAAAAAAAAAAAAAAAAAAgMCAgICAgAAAgIAAgIAAgICAgICAgICAgAEAAAAAAACAgICAgICAgICAgICAgICAgICAgICAgICAgAAAAICAgICAgICAgICAgICAgICAgICAgICAgICAgICAAIAAgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABAAAAAAAAAAAAAAAAAAAAAAAAAAIAAgICAgIAAAICAAICAAICAgICAgICAgIAAwAEAAAAAgICAgICAgICAgICAgICAgICAgICAgICAgIAAAACAgICAgICAgICAgICAgICAgICAgICAgICAgICAgACAAIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABsb3NlZWVwLWFsaXZlAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAABAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQABAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQAAAAAAAAAAAAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQEBAQEBAQEBAQEBAgEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEAAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQFjaHVua2VkAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABAQABAQEBAQAAAQEAAQEAAQEBAQEBAQEBAQAAAAAAAAABAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQAAAAEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAAEAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAGVjdGlvbmVudC1sZW5ndGhvbnJveHktY29ubmVjdGlvbgAAAAAAAAAAAAAAAAAAAHJhbnNmZXItZW5jb2RpbmdwZ3JhZGUNCg0KDQpTTQ0KDQpUVFAvQ0UvVFNQLwAAAAAAAAAAAAAAAAECAAEDAAAAAAAAAAAAAAAAAAAAAAAABAEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEAAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEAAAAAAAAAAAABAgABAwAAAAAAAAAAAAAAAAAAAAAAAAQBAQUBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAAEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAAAAAAAAAAAAAQAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAQEAAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAAEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQABAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQAAAAAAAAAAAAABAAACAAAAAAAAAAAAAAAAAAAAAAAAAwQAAAQEBAQEBAQEBAQEBQQEBAQEBAQEBAQEBAAEAAYHBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEAAQABAAEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQAAAQAAAAAAAAAAAAAAAAAAAAAAAAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAgAAAAAAAAMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAAAAAAAAAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEAAAEAAAAAAAAAAAAAAAAAAAAAAAABAAAAAAAAAAAAAgAAAAACAAAAAAAAAAAAAAAAAAAAAAADAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwAAAAAAAAMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAE5PVU5DRUVDS09VVE5FQ1RFVEVDUklCRUxVU0hFVEVBRFNFQVJDSFJHRUNUSVZJVFlMRU5EQVJWRU9USUZZUFRJT05TQ0hTRUFZU1RBVENIR0VPUkRJUkVDVE9SVFJDSFBBUkFNRVRFUlVSQ0VCU0NSSUJFQVJET1dOQUNFSU5ETktDS1VCU0NSSUJFSFRUUC9BRFRQLw=="},172:(e,A)=>{"use strict";Object.defineProperty(A,"__esModule",{value:true});A.enumToMap=void 0;function enumToMap(e){const A={};Object.keys(e).forEach((t=>{const r=e[t];if(typeof r==="number"){A[t]=r}}));return A}A.enumToMap=enumToMap},7501:(e,A,t)=>{"use strict";const{kClients:r}=t(6443);const s=t(9965);const{kAgent:o,kMockAgentSet:n,kMockAgentGet:i,kDispatches:a,kIsMockActive:c,kNetConnect:g,kGetNetConnect:l,kOptions:E,kFactory:u}=t(1117);const h=t(7365);const Q=t(4004);const{matchValue:C,buildMockOptions:d}=t(3397);const{InvalidArgumentError:B,UndiciError:I}=t(8707);const p=t(992);const m=t(1529);const y=t(6142);class FakeWeakRef{constructor(e){this.value=e}deref(){return this.value}}class MockAgent extends p{constructor(e){super(e);this[g]=true;this[c]=true;if(e&&e.agent&&typeof e.agent.dispatch!=="function"){throw new B("Argument opts.agent must implement Agent")}const A=e&&e.agent?e.agent:new s(e);this[o]=A;this[r]=A[r];this[E]=d(e)}get(e){let A=this[i](e);if(!A){A=this[u](e);this[n](e,A)}return A}dispatch(e,A){this.get(e.origin);return this[o].dispatch(e,A)}async close(){await this[o].close();this[r].clear()}deactivate(){this[c]=false}activate(){this[c]=true}enableNetConnect(e){if(typeof e==="string"||typeof e==="function"||e instanceof RegExp){if(Array.isArray(this[g])){this[g].push(e)}else{this[g]=[e]}}else if(typeof e==="undefined"){this[g]=true}else{throw new B("Unsupported matcher. Must be one of String|Function|RegExp.")}}disableNetConnect(){this[g]=false}get isMockActive(){return this[c]}[n](e,A){this[r].set(e,new FakeWeakRef(A))}[u](e){const A=Object.assign({agent:this},this[E]);return this[E]&&this[E].connections===1?new h(e,A):new Q(e,A)}[i](e){const A=this[r].get(e);if(A){return A.deref()}if(typeof e!=="string"){const A=this[u]("http://localhost:9999");this[n](e,A);return A}for(const[A,t]of Array.from(this[r])){const r=t.deref();if(r&&typeof A!=="string"&&C(A,e)){const A=this[u](e);this[n](e,A);A[a]=r[a];return A}}}[l](){return this[g]}pendingInterceptors(){const e=this[r];return Array.from(e.entries()).flatMap((([e,A])=>A.deref()[a].map((A=>({...A,origin:e}))))).filter((({pending:e})=>e))}assertNoPendingInterceptors({pendingInterceptorsFormatter:e=new y}={}){const A=this.pendingInterceptors();if(A.length===0){return}const t=new m("interceptor","interceptors").pluralize(A.length);throw new I(`\n${t.count} ${t.noun} ${t.is} pending:\n\n${e.format(A)}\n`.trim())}}e.exports=MockAgent},7365:(e,A,t)=>{"use strict";const{promisify:r}=t(9023);const s=t(6197);const{buildMockDispatch:o}=t(3397);const{kDispatches:n,kMockAgent:i,kClose:a,kOriginalClose:c,kOrigin:g,kOriginalDispatch:l,kConnected:E}=t(1117);const{MockInterceptor:u}=t(1511);const h=t(6443);const{InvalidArgumentError:Q}=t(8707);class MockClient extends s{constructor(e,A){super(e,A);if(!A||!A.agent||typeof A.agent.dispatch!=="function"){throw new Q("Argument opts.agent must implement Agent")}this[i]=A.agent;this[g]=e;this[n]=[];this[E]=1;this[l]=this.dispatch;this[c]=this.close.bind(this);this.dispatch=o.call(this);this.close=this[a]}get[h.kConnected](){return this[E]}intercept(e){return new u(e,this[n])}async[a](){await r(this[c])();this[E]=0;this[i][h.kClients].delete(this[g])}}e.exports=MockClient},2429:(e,A,t)=>{"use strict";const{UndiciError:r}=t(8707);class MockNotMatchedError extends r{constructor(e){super(e);Error.captureStackTrace(this,MockNotMatchedError);this.name="MockNotMatchedError";this.message=e||"The request does not match any registered mock dispatches";this.code="UND_MOCK_ERR_MOCK_NOT_MATCHED"}}e.exports={MockNotMatchedError:MockNotMatchedError}},1511:(e,A,t)=>{"use strict";const{getResponseData:r,buildKey:s,addMockDispatch:o}=t(3397);const{kDispatches:n,kDispatchKey:i,kDefaultHeaders:a,kDefaultTrailers:c,kContentLength:g,kMockDispatch:l}=t(1117);const{InvalidArgumentError:E}=t(8707);const{buildURL:u}=t(3440);class MockScope{constructor(e){this[l]=e}delay(e){if(typeof e!=="number"||!Number.isInteger(e)||e<=0){throw new E("waitInMs must be a valid integer > 0")}this[l].delay=e;return this}persist(){this[l].persist=true;return this}times(e){if(typeof e!=="number"||!Number.isInteger(e)||e<=0){throw new E("repeatTimes must be a valid integer > 0")}this[l].times=e;return this}}class MockInterceptor{constructor(e,A){if(typeof e!=="object"){throw new E("opts must be an object")}if(typeof e.path==="undefined"){throw new E("opts.path must be defined")}if(typeof e.method==="undefined"){e.method="GET"}if(typeof e.path==="string"){if(e.query){e.path=u(e.path,e.query)}else{const A=new URL(e.path,"data://");e.path=A.pathname+A.search}}if(typeof e.method==="string"){e.method=e.method.toUpperCase()}this[i]=s(e);this[n]=A;this[a]={};this[c]={};this[g]=false}createMockScopeDispatchData(e,A,t={}){const s=r(A);const o=this[g]?{"content-length":s.length}:{};const n={...this[a],...o,...t.headers};const i={...this[c],...t.trailers};return{statusCode:e,data:A,headers:n,trailers:i}}validateReplyParameters(e,A,t){if(typeof e==="undefined"){throw new E("statusCode must be defined")}if(typeof A==="undefined"){throw new E("data must be defined")}if(typeof t!=="object"){throw new E("responseOptions must be an object")}}reply(e){if(typeof e==="function"){const wrappedDefaultsCallback=A=>{const t=e(A);if(typeof t!=="object"){throw new E("reply options callback must return an object")}const{statusCode:r,data:s="",responseOptions:o={}}=t;this.validateReplyParameters(r,s,o);return{...this.createMockScopeDispatchData(r,s,o)}};const A=o(this[n],this[i],wrappedDefaultsCallback);return new MockScope(A)}const[A,t="",r={}]=[...arguments];this.validateReplyParameters(A,t,r);const s=this.createMockScopeDispatchData(A,t,r);const a=o(this[n],this[i],s);return new MockScope(a)}replyWithError(e){if(typeof e==="undefined"){throw new E("error must be defined")}const A=o(this[n],this[i],{error:e});return new MockScope(A)}defaultReplyHeaders(e){if(typeof e==="undefined"){throw new E("headers must be defined")}this[a]=e;return this}defaultReplyTrailers(e){if(typeof e==="undefined"){throw new E("trailers must be defined")}this[c]=e;return this}replyContentLength(){this[g]=true;return this}}e.exports.MockInterceptor=MockInterceptor;e.exports.MockScope=MockScope},4004:(e,A,t)=>{"use strict";const{promisify:r}=t(9023);const s=t(5076);const{buildMockDispatch:o}=t(3397);const{kDispatches:n,kMockAgent:i,kClose:a,kOriginalClose:c,kOrigin:g,kOriginalDispatch:l,kConnected:E}=t(1117);const{MockInterceptor:u}=t(1511);const h=t(6443);const{InvalidArgumentError:Q}=t(8707);class MockPool extends s{constructor(e,A){super(e,A);if(!A||!A.agent||typeof A.agent.dispatch!=="function"){throw new Q("Argument opts.agent must implement Agent")}this[i]=A.agent;this[g]=e;this[n]=[];this[E]=1;this[l]=this.dispatch;this[c]=this.close.bind(this);this.dispatch=o.call(this);this.close=this[a]}get[h.kConnected](){return this[E]}intercept(e){return new u(e,this[n])}async[a](){await r(this[c])();this[E]=0;this[i][h.kClients].delete(this[g])}}e.exports=MockPool},1117:e=>{"use strict";e.exports={kAgent:Symbol("agent"),kOptions:Symbol("options"),kFactory:Symbol("factory"),kDispatches:Symbol("dispatches"),kDispatchKey:Symbol("dispatch key"),kDefaultHeaders:Symbol("default headers"),kDefaultTrailers:Symbol("default trailers"),kContentLength:Symbol("content length"),kMockAgent:Symbol("mock agent"),kMockAgentSet:Symbol("mock agent set"),kMockAgentGet:Symbol("mock agent get"),kMockDispatch:Symbol("mock dispatch"),kClose:Symbol("close"),kOriginalClose:Symbol("original agent close"),kOrigin:Symbol("origin"),kIsMockActive:Symbol("is mock active"),kNetConnect:Symbol("net connect"),kGetNetConnect:Symbol("get net connect"),kConnected:Symbol("connected")}},3397:(e,A,t)=>{"use strict";const{MockNotMatchedError:r}=t(2429);const{kDispatches:s,kMockAgent:o,kOriginalDispatch:n,kOrigin:i,kGetNetConnect:a}=t(1117);const{buildURL:c,nop:g}=t(3440);const{STATUS_CODES:l}=t(8611);const{types:{isPromise:E}}=t(9023);function matchValue(e,A){if(typeof e==="string"){return e===A}if(e instanceof RegExp){return e.test(A)}if(typeof e==="function"){return e(A)===true}return false}function lowerCaseEntries(e){return Object.fromEntries(Object.entries(e).map((([e,A])=>[e.toLocaleLowerCase(),A])))}function getHeaderByName(e,A){if(Array.isArray(e)){for(let t=0;t!e)).filter((({path:e})=>matchValue(safeUrl(e),s)));if(o.length===0){throw new r(`Mock dispatch not matched for path '${s}'`)}o=o.filter((({method:e})=>matchValue(e,A.method)));if(o.length===0){throw new r(`Mock dispatch not matched for method '${A.method}'`)}o=o.filter((({body:e})=>typeof e!=="undefined"?matchValue(e,A.body):true));if(o.length===0){throw new r(`Mock dispatch not matched for body '${A.body}'`)}o=o.filter((e=>matchHeaders(e,A.headers)));if(o.length===0){throw new r(`Mock dispatch not matched for headers '${typeof A.headers==="object"?JSON.stringify(A.headers):A.headers}'`)}return o[0]}function addMockDispatch(e,A,t){const r={timesInvoked:0,times:1,persist:false,consumed:false};const s=typeof t==="function"?{callback:t}:{...t};const o={...r,...A,pending:true,data:{error:null,...s}};e.push(o);return o}function deleteMockDispatch(e,A){const t=e.findIndex((e=>{if(!e.consumed){return false}return matchKey(e,A)}));if(t!==-1){e.splice(t,1)}}function buildKey(e){const{path:A,method:t,body:r,headers:s,query:o}=e;return{path:A,method:t,body:r,headers:s,query:o}}function generateKeyValues(e){return Object.entries(e).reduce(((e,[A,t])=>[...e,Buffer.from(`${A}`),Array.isArray(t)?t.map((e=>Buffer.from(`${e}`))):Buffer.from(`${t}`)]),[])}function getStatusText(e){return l[e]||"unknown"}async function getResponse(e){const A=[];for await(const t of e){A.push(t)}return Buffer.concat(A).toString("utf8")}function mockDispatch(e,A){const t=buildKey(e);const r=getMockDispatch(this[s],t);r.timesInvoked++;if(r.data.callback){r.data={...r.data,...r.data.callback(e)}}const{data:{statusCode:o,data:n,headers:i,trailers:a,error:c},delay:l,persist:u}=r;const{timesInvoked:h,times:Q}=r;r.consumed=!u&&h>=Q;r.pending=h0){setTimeout((()=>{handleReply(this[s])}),l)}else{handleReply(this[s])}function handleReply(r,s=n){const c=Array.isArray(e.headers)?buildHeadersFromArray(e.headers):e.headers;const l=typeof s==="function"?s({...e,headers:c}):s;if(E(l)){l.then((e=>handleReply(r,e)));return}const u=getResponseData(l);const h=generateKeyValues(i);const Q=generateKeyValues(a);A.abort=g;A.onHeaders(o,h,resume,getStatusText(o));A.onData(Buffer.from(u));A.onComplete(Q);deleteMockDispatch(r,t)}function resume(){}return true}function buildMockDispatch(){const e=this[o];const A=this[i];const t=this[n];return function dispatch(s,o){if(e.isMockActive){try{mockDispatch.call(this,s,o)}catch(n){if(n instanceof r){const i=e[a]();if(i===false){throw new r(`${n.message}: subsequent request to origin ${A} was not allowed (net.connect disabled)`)}if(checkNetConnect(i,A)){t.call(this,s,o)}else{throw new r(`${n.message}: subsequent request to origin ${A} was not allowed (net.connect is not enabled for this origin)`)}}else{throw n}}}else{t.call(this,s,o)}}}function checkNetConnect(e,A){const t=new URL(A);if(e===true){return true}else if(Array.isArray(e)&&e.some((e=>matchValue(e,t.host)))){return true}return false}function buildMockOptions(e){if(e){const{agent:A,...t}=e;return t}}e.exports={getResponseData:getResponseData,getMockDispatch:getMockDispatch,addMockDispatch:addMockDispatch,deleteMockDispatch:deleteMockDispatch,buildKey:buildKey,generateKeyValues:generateKeyValues,matchValue:matchValue,getResponse:getResponse,getStatusText:getStatusText,mockDispatch:mockDispatch,buildMockDispatch:buildMockDispatch,checkNetConnect:checkNetConnect,buildMockOptions:buildMockOptions,getHeaderByName:getHeaderByName}},6142:(e,A,t)=>{"use strict";const{Transform:r}=t(2203);const{Console:s}=t(4236);e.exports=class PendingInterceptorsFormatter{constructor({disableColors:e}={}){this.transform=new r({transform(e,A,t){t(null,e)}});this.logger=new s({stdout:this.transform,inspectOptions:{colors:!e&&!process.env.CI}})}format(e){const A=e.map((({method:e,path:A,data:{statusCode:t},persist:r,times:s,timesInvoked:o,origin:n})=>({Method:e,Origin:n,Path:A,"Status code":t,Persistent:r?"✅":"❌",Invocations:o,Remaining:r?Infinity:s-o})));this.logger.table(A);return this.transform.read().toString()}}},1529:e=>{"use strict";const A={pronoun:"it",is:"is",was:"was",this:"this"};const t={pronoun:"they",is:"are",was:"were",this:"these"};e.exports=class Pluralizer{constructor(e,A){this.singular=e;this.plural=A}pluralize(e){const r=e===1;const s=r?A:t;const o=r?this.singular:this.plural;return{...s,count:e,noun:o}}}},4869:e=>{"use strict";const A=2048;const t=A-1;class FixedCircularBuffer{constructor(){this.bottom=0;this.top=0;this.list=new Array(A);this.next=null}isEmpty(){return this.top===this.bottom}isFull(){return(this.top+1&t)===this.bottom}push(e){this.list[this.top]=e;this.top=this.top+1&t}shift(){const e=this.list[this.bottom];if(e===undefined)return null;this.list[this.bottom]=undefined;this.bottom=this.bottom+1&t;return e}}e.exports=class FixedQueue{constructor(){this.head=this.tail=new FixedCircularBuffer}isEmpty(){return this.head.isEmpty()}push(e){if(this.head.isFull()){this.head=this.head.next=new FixedCircularBuffer}this.head.push(e)}shift(){const e=this.tail;const A=e.shift();if(e.isEmpty()&&e.next!==null){this.tail=e.next}return A}}},8640:(e,A,t)=>{"use strict";const r=t(1);const s=t(4869);const{kConnected:o,kSize:n,kRunning:i,kPending:a,kQueued:c,kBusy:g,kFree:l,kUrl:E,kClose:u,kDestroy:h,kDispatch:Q}=t(6443);const C=t(4622);const d=Symbol("clients");const B=Symbol("needDrain");const I=Symbol("queue");const p=Symbol("closed resolve");const m=Symbol("onDrain");const y=Symbol("onConnect");const w=Symbol("onDisconnect");const b=Symbol("onConnectionError");const R=Symbol("get dispatcher");const k=Symbol("add client");const D=Symbol("remove client");const S=Symbol("stats");class PoolBase extends r{constructor(){super();this[I]=new s;this[d]=[];this[c]=0;const e=this;this[m]=function onDrain(A,t){const r=e[I];let s=false;while(!s){const A=r.shift();if(!A){break}e[c]--;s=!this.dispatch(A.opts,A.handler)}this[B]=s;if(!this[B]&&e[B]){e[B]=false;e.emit("drain",A,[e,...t])}if(e[p]&&r.isEmpty()){Promise.all(e[d].map((e=>e.close()))).then(e[p])}};this[y]=(A,t)=>{e.emit("connect",A,[e,...t])};this[w]=(A,t,r)=>{e.emit("disconnect",A,[e,...t],r)};this[b]=(A,t,r)=>{e.emit("connectionError",A,[e,...t],r)};this[S]=new C(this)}get[g](){return this[B]}get[o](){return this[d].filter((e=>e[o])).length}get[l](){return this[d].filter((e=>e[o]&&!e[B])).length}get[a](){let e=this[c];for(const{[a]:A}of this[d]){e+=A}return e}get[i](){let e=0;for(const{[i]:A}of this[d]){e+=A}return e}get[n](){let e=this[c];for(const{[n]:A}of this[d]){e+=A}return e}get stats(){return this[S]}async[u](){if(this[I].isEmpty()){return Promise.all(this[d].map((e=>e.close())))}else{return new Promise((e=>{this[p]=e}))}}async[h](e){while(true){const A=this[I].shift();if(!A){break}A.handler.onError(e)}return Promise.all(this[d].map((A=>A.destroy(e))))}[Q](e,A){const t=this[R]();if(!t){this[B]=true;this[I].push({opts:e,handler:A});this[c]++}else if(!t.dispatch(e,A)){t[B]=true;this[B]=!this[R]()}return!this[B]}[k](e){e.on("drain",this[m]).on("connect",this[y]).on("disconnect",this[w]).on("connectionError",this[b]);this[d].push(e);if(this[B]){process.nextTick((()=>{if(this[B]){this[m](e[E],[this,e])}}))}return this}[D](e){e.close((()=>{const A=this[d].indexOf(e);if(A!==-1){this[d].splice(A,1)}}));this[B]=this[d].some((e=>!e[B]&&e.closed!==true&&e.destroyed!==true))}}e.exports={PoolBase:PoolBase,kClients:d,kNeedDrain:B,kAddClient:k,kRemoveClient:D,kGetDispatcher:R}},4622:(e,A,t)=>{const{kFree:r,kConnected:s,kPending:o,kQueued:n,kRunning:i,kSize:a}=t(6443);const c=Symbol("pool");class PoolStats{constructor(e){this[c]=e}get connected(){return this[c][s]}get free(){return this[c][r]}get pending(){return this[c][o]}get queued(){return this[c][n]}get running(){return this[c][i]}get size(){return this[c][a]}}e.exports=PoolStats},5076:(e,A,t)=>{"use strict";const{PoolBase:r,kClients:s,kNeedDrain:o,kAddClient:n,kGetDispatcher:i}=t(8640);const a=t(6197);const{InvalidArgumentError:c}=t(8707);const g=t(3440);const{kUrl:l,kInterceptors:E}=t(6443);const u=t(9136);const h=Symbol("options");const Q=Symbol("connections");const C=Symbol("factory");function defaultFactory(e,A){return new a(e,A)}class Pool extends r{constructor(e,{connections:A,factory:t=defaultFactory,connect:r,connectTimeout:s,tls:o,maxCachedSessions:n,socketPath:i,autoSelectFamily:a,autoSelectFamilyAttemptTimeout:d,allowH2:B,...I}={}){super();if(A!=null&&(!Number.isFinite(A)||A<0)){throw new c("invalid connections")}if(typeof t!=="function"){throw new c("factory must be a function.")}if(r!=null&&typeof r!=="function"&&typeof r!=="object"){throw new c("connect must be a function or an object")}if(typeof r!=="function"){r=u({...o,maxCachedSessions:n,allowH2:B,socketPath:i,timeout:s,...g.nodeHasAutoSelectFamily&&a?{autoSelectFamily:a,autoSelectFamilyAttemptTimeout:d}:undefined,...r})}this[E]=I.interceptors&&I.interceptors.Pool&&Array.isArray(I.interceptors.Pool)?I.interceptors.Pool:[];this[Q]=A||null;this[l]=g.parseOrigin(e);this[h]={...g.deepClone(I),connect:r,allowH2:B};this[h].interceptors=I.interceptors?{...I.interceptors}:undefined;this[C]=t}[i](){let e=this[s].find((e=>!e[o]));if(e){return e}if(!this[Q]||this[s].length{"use strict";const{kProxy:r,kClose:s,kDestroy:o,kInterceptors:n}=t(6443);const{URL:i}=t(7016);const a=t(9965);const c=t(5076);const g=t(1);const{InvalidArgumentError:l,RequestAbortedError:E}=t(8707);const u=t(9136);const h=Symbol("proxy agent");const Q=Symbol("proxy client");const C=Symbol("proxy headers");const d=Symbol("request tls settings");const B=Symbol("proxy tls settings");const I=Symbol("connect endpoint function");function defaultProtocolPort(e){return e==="https:"?443:80}function buildProxyOptions(e){if(typeof e==="string"){e={uri:e}}if(!e||!e.uri){throw new l("Proxy opts.uri is mandatory")}return{uri:e.uri,protocol:e.protocol||"https"}}function defaultFactory(e,A){return new c(e,A)}class ProxyAgent extends g{constructor(e){super(e);this[r]=buildProxyOptions(e);this[h]=new a(e);this[n]=e.interceptors&&e.interceptors.ProxyAgent&&Array.isArray(e.interceptors.ProxyAgent)?e.interceptors.ProxyAgent:[];if(typeof e==="string"){e={uri:e}}if(!e||!e.uri){throw new l("Proxy opts.uri is mandatory")}const{clientFactory:A=defaultFactory}=e;if(typeof A!=="function"){throw new l("Proxy opts.clientFactory must be a function.")}this[d]=e.requestTls;this[B]=e.proxyTls;this[C]=e.headers||{};const t=new i(e.uri);const{origin:s,port:o,host:c,username:g,password:p}=t;if(e.auth&&e.token){throw new l("opts.auth cannot be used in combination with opts.token")}else if(e.auth){this[C]["proxy-authorization"]=`Basic ${e.auth}`}else if(e.token){this[C]["proxy-authorization"]=e.token}else if(g&&p){this[C]["proxy-authorization"]=`Basic ${Buffer.from(`${decodeURIComponent(g)}:${decodeURIComponent(p)}`).toString("base64")}`}const m=u({...e.proxyTls});this[I]=u({...e.requestTls});this[Q]=A(t,{connect:m});this[h]=new a({...e,connect:async(e,A)=>{let t=e.host;if(!e.port){t+=`:${defaultProtocolPort(e.protocol)}`}try{const{socket:r,statusCode:n}=await this[Q].connect({origin:s,port:o,path:t,signal:e.signal,headers:{...this[C],host:c}});if(n!==200){r.on("error",(()=>{})).destroy();A(new E(`Proxy response (${n}) !== 200 when HTTP Tunneling`))}if(e.protocol!=="https:"){A(null,r);return}let i;if(this[d]){i=this[d].servername}else{i=e.servername}this[I]({...e,servername:i,httpSocket:r},A)}catch(e){A(e)}}})}dispatch(e,A){const{host:t}=new i(e.origin);const r=buildHeaders(e.headers);throwIfProxyAuthIsSent(r);return this[h].dispatch({...e,headers:{...r,host:t}},A)}async[s](){await this[h].close();await this[Q].close()}async[o](){await this[h].destroy();await this[Q].destroy()}}function buildHeaders(e){if(Array.isArray(e)){const A={};for(let t=0;te.toLowerCase()==="proxy-authorization"));if(A){throw new l("Proxy-Authorization should be sent in ProxyAgent constructor")}}e.exports=ProxyAgent},8804:e=>{"use strict";let A=Date.now();let t;const r=[];function onTimeout(){A=Date.now();let e=r.length;let t=0;while(t0&&A>=s.state){s.state=-1;s.callback(s.opaque)}if(s.state===-1){s.state=-2;if(t!==e-1){r[t]=r.pop()}else{r.pop()}e-=1}else{t+=1}}if(r.length>0){refreshTimeout()}}function refreshTimeout(){if(t&&t.refresh){t.refresh()}else{clearTimeout(t);t=setTimeout(onTimeout,1e3);if(t.unref){t.unref()}}}class Timeout{constructor(e,A,t){this.callback=e;this.delay=A;this.opaque=t;this.state=-2;this.refresh()}refresh(){if(this.state===-2){r.push(this);if(!t||r.length===1){refreshTimeout()}}this.state=0}clear(){this.state=-1}}e.exports={setTimeout(e,A,t){return A<1e3?setTimeout(e,A,t):new Timeout(e,A,t)},clearTimeout(e){if(e instanceof Timeout){e.clear()}else{clearTimeout(e)}}}},8550:(e,A,t)=>{"use strict";const r=t(1637);const{uid:s,states:o}=t(5913);const{kReadyState:n,kSentClose:i,kByteParser:a,kReceivedClose:c}=t(2933);const{fireEvent:g,failWebsocketConnection:l}=t(3574);const{CloseEvent:E}=t(6255);const{makeRequest:u}=t(5194);const{fetching:h}=t(2315);const{Headers:Q}=t(6349);const{getGlobalDispatcher:C}=t(2581);const{kHeadersList:d}=t(6443);const B={};B.open=r.channel("undici:websocket:open");B.close=r.channel("undici:websocket:close");B.socketError=r.channel("undici:websocket:socket_error");let I;try{I=t(6982)}catch{}function establishWebSocketConnection(e,A,t,r,o){const n=e;n.protocol=e.protocol==="ws:"?"http:":"https:";const i=u({urlList:[n],serviceWorkers:"none",referrer:"no-referrer",mode:"websocket",credentials:"include",cache:"no-store",redirect:"error"});if(o.headers){const e=new Q(o.headers)[d];i.headersList=e}const a=I.randomBytes(16).toString("base64");i.headersList.append("sec-websocket-key",a);i.headersList.append("sec-websocket-version","13");for(const e of A){i.headersList.append("sec-websocket-protocol",e)}const c="";const g=h({request:i,useParallelQueue:true,dispatcher:o.dispatcher??C(),processResponse(e){if(e.type==="error"||e.status!==101){l(t,"Received network error or non-101 status code.");return}if(A.length!==0&&!e.headersList.get("Sec-WebSocket-Protocol")){l(t,"Server did not respond with sent protocols.");return}if(e.headersList.get("Upgrade")?.toLowerCase()!=="websocket"){l(t,'Server did not set Upgrade header to "websocket".');return}if(e.headersList.get("Connection")?.toLowerCase()!=="upgrade"){l(t,'Server did not set Connection header to "upgrade".');return}const o=e.headersList.get("Sec-WebSocket-Accept");const n=I.createHash("sha1").update(a+s).digest("base64");if(o!==n){l(t,"Incorrect hash received in Sec-WebSocket-Accept header.");return}const g=e.headersList.get("Sec-WebSocket-Extensions");if(g!==null&&g!==c){l(t,"Received different permessage-deflate than the one set.");return}const E=e.headersList.get("Sec-WebSocket-Protocol");if(E!==null&&E!==i.headersList.get("Sec-WebSocket-Protocol")){l(t,"Protocol was not set in the opening handshake.");return}e.socket.on("data",onSocketData);e.socket.on("close",onSocketClose);e.socket.on("error",onSocketError);if(B.open.hasSubscribers){B.open.publish({address:e.socket.address(),protocol:E,extensions:g})}r(e)}});return g}function onSocketData(e){if(!this.ws[a].write(e)){this.pause()}}function onSocketClose(){const{ws:e}=this;const A=e[i]&&e[c];let t=1005;let r="";const s=e[a].closingInfo;if(s){t=s.code??1005;r=s.reason}else if(!e[i]){t=1006}e[n]=o.CLOSED;g("close",e,E,{wasClean:A,code:t,reason:r});if(B.close.hasSubscribers){B.close.publish({websocket:e,code:t,reason:r})}}function onSocketError(e){const{ws:A}=this;A[n]=o.CLOSING;if(B.socketError.hasSubscribers){B.socketError.publish(e)}this.destroy()}e.exports={establishWebSocketConnection:establishWebSocketConnection}},5913:e=>{"use strict";const A="258EAFA5-E914-47DA-95CA-C5AB0DC85B11";const t={enumerable:true,writable:false,configurable:false};const r={CONNECTING:0,OPEN:1,CLOSING:2,CLOSED:3};const s={CONTINUATION:0,TEXT:1,BINARY:2,CLOSE:8,PING:9,PONG:10};const o=2**16-1;const n={INFO:0,PAYLOADLENGTH_16:2,PAYLOADLENGTH_64:3,READ_DATA:4};const i=Buffer.allocUnsafe(0);e.exports={uid:A,staticPropertyDescriptors:t,states:r,opcodes:s,maxUnsigned16Bit:o,parserStates:n,emptyBuffer:i}},6255:(e,A,t)=>{"use strict";const{webidl:r}=t(4222);const{kEnumerableProperty:s}=t(3440);const{MessagePort:o}=t(8167);class MessageEvent extends Event{#o;constructor(e,A={}){r.argumentLengthCheck(arguments,1,{header:"MessageEvent constructor"});e=r.converters.DOMString(e);A=r.converters.MessageEventInit(A);super(e,A);this.#o=A}get data(){r.brandCheck(this,MessageEvent);return this.#o.data}get origin(){r.brandCheck(this,MessageEvent);return this.#o.origin}get lastEventId(){r.brandCheck(this,MessageEvent);return this.#o.lastEventId}get source(){r.brandCheck(this,MessageEvent);return this.#o.source}get ports(){r.brandCheck(this,MessageEvent);if(!Object.isFrozen(this.#o.ports)){Object.freeze(this.#o.ports)}return this.#o.ports}initMessageEvent(e,A=false,t=false,s=null,o="",n="",i=null,a=[]){r.brandCheck(this,MessageEvent);r.argumentLengthCheck(arguments,1,{header:"MessageEvent.initMessageEvent"});return new MessageEvent(e,{bubbles:A,cancelable:t,data:s,origin:o,lastEventId:n,source:i,ports:a})}}class CloseEvent extends Event{#o;constructor(e,A={}){r.argumentLengthCheck(arguments,1,{header:"CloseEvent constructor"});e=r.converters.DOMString(e);A=r.converters.CloseEventInit(A);super(e,A);this.#o=A}get wasClean(){r.brandCheck(this,CloseEvent);return this.#o.wasClean}get code(){r.brandCheck(this,CloseEvent);return this.#o.code}get reason(){r.brandCheck(this,CloseEvent);return this.#o.reason}}class ErrorEvent extends Event{#o;constructor(e,A){r.argumentLengthCheck(arguments,1,{header:"ErrorEvent constructor"});super(e,A);e=r.converters.DOMString(e);A=r.converters.ErrorEventInit(A??{});this.#o=A}get message(){r.brandCheck(this,ErrorEvent);return this.#o.message}get filename(){r.brandCheck(this,ErrorEvent);return this.#o.filename}get lineno(){r.brandCheck(this,ErrorEvent);return this.#o.lineno}get colno(){r.brandCheck(this,ErrorEvent);return this.#o.colno}get error(){r.brandCheck(this,ErrorEvent);return this.#o.error}}Object.defineProperties(MessageEvent.prototype,{[Symbol.toStringTag]:{value:"MessageEvent",configurable:true},data:s,origin:s,lastEventId:s,source:s,ports:s,initMessageEvent:s});Object.defineProperties(CloseEvent.prototype,{[Symbol.toStringTag]:{value:"CloseEvent",configurable:true},reason:s,code:s,wasClean:s});Object.defineProperties(ErrorEvent.prototype,{[Symbol.toStringTag]:{value:"ErrorEvent",configurable:true},message:s,filename:s,lineno:s,colno:s,error:s});r.converters.MessagePort=r.interfaceConverter(o);r.converters["sequence"]=r.sequenceConverter(r.converters.MessagePort);const n=[{key:"bubbles",converter:r.converters.boolean,defaultValue:false},{key:"cancelable",converter:r.converters.boolean,defaultValue:false},{key:"composed",converter:r.converters.boolean,defaultValue:false}];r.converters.MessageEventInit=r.dictionaryConverter([...n,{key:"data",converter:r.converters.any,defaultValue:null},{key:"origin",converter:r.converters.USVString,defaultValue:""},{key:"lastEventId",converter:r.converters.DOMString,defaultValue:""},{key:"source",converter:r.nullableConverter(r.converters.MessagePort),defaultValue:null},{key:"ports",converter:r.converters["sequence"],get defaultValue(){return[]}}]);r.converters.CloseEventInit=r.dictionaryConverter([...n,{key:"wasClean",converter:r.converters.boolean,defaultValue:false},{key:"code",converter:r.converters["unsigned short"],defaultValue:0},{key:"reason",converter:r.converters.USVString,defaultValue:""}]);r.converters.ErrorEventInit=r.dictionaryConverter([...n,{key:"message",converter:r.converters.DOMString,defaultValue:""},{key:"filename",converter:r.converters.USVString,defaultValue:""},{key:"lineno",converter:r.converters["unsigned long"],defaultValue:0},{key:"colno",converter:r.converters["unsigned long"],defaultValue:0},{key:"error",converter:r.converters.any}]);e.exports={MessageEvent:MessageEvent,CloseEvent:CloseEvent,ErrorEvent:ErrorEvent}},1237:(e,A,t)=>{"use strict";const{maxUnsigned16Bit:r}=t(5913);let s;try{s=t(6982)}catch{}class WebsocketFrameSend{constructor(e){this.frameData=e;this.maskKey=s.randomBytes(4)}createFrame(e){const A=this.frameData?.byteLength??0;let t=A;let s=6;if(A>r){s+=8;t=127}else if(A>125){s+=2;t=126}const o=Buffer.allocUnsafe(A+s);o[0]=o[1]=0;o[0]|=128;o[0]=(o[0]&240)+e; -/*! ws. MIT License. Einar Otto Stangvik */o[s-4]=this.maskKey[0];o[s-3]=this.maskKey[1];o[s-2]=this.maskKey[2];o[s-1]=this.maskKey[3];o[1]=t;if(t===126){o.writeUInt16BE(A,2)}else if(t===127){o[2]=o[3]=0;o.writeUIntBE(A,4,6)}o[1]|=128;for(let e=0;e{"use strict";const{Writable:r}=t(2203);const s=t(1637);const{parserStates:o,opcodes:n,states:i,emptyBuffer:a}=t(5913);const{kReadyState:c,kSentClose:g,kResponse:l,kReceivedClose:E}=t(2933);const{isValidStatusCode:u,failWebsocketConnection:h,websocketMessageReceived:Q}=t(3574);const{WebsocketFrameSend:C}=t(1237);const d={};d.ping=s.channel("undici:websocket:ping");d.pong=s.channel("undici:websocket:pong");class ByteParser extends r{#n=[];#i=0;#a=o.INFO;#c={};#g=[];constructor(e){super();this.ws=e}_write(e,A,t){this.#n.push(e);this.#i+=e.length;this.run(t)}run(e){while(true){if(this.#a===o.INFO){if(this.#i<2){return e()}const A=this.consume(2);this.#c.fin=(A[0]&128)!==0;this.#c.opcode=A[0]&15;this.#c.originalOpcode??=this.#c.opcode;this.#c.fragmented=!this.#c.fin&&this.#c.opcode!==n.CONTINUATION;if(this.#c.fragmented&&this.#c.opcode!==n.BINARY&&this.#c.opcode!==n.TEXT){h(this.ws,"Invalid frame type was fragmented.");return}const t=A[1]&127;if(t<=125){this.#c.payloadLength=t;this.#a=o.READ_DATA}else if(t===126){this.#a=o.PAYLOADLENGTH_16}else if(t===127){this.#a=o.PAYLOADLENGTH_64}if(this.#c.fragmented&&t>125){h(this.ws,"Fragmented frame exceeded 125 bytes.");return}else if((this.#c.opcode===n.PING||this.#c.opcode===n.PONG||this.#c.opcode===n.CLOSE)&&t>125){h(this.ws,"Payload length for control frame exceeded 125 bytes.");return}else if(this.#c.opcode===n.CLOSE){if(t===1){h(this.ws,"Received close frame with a 1-byte body.");return}const e=this.consume(t);this.#c.closeInfo=this.parseCloseBody(false,e);if(!this.ws[g]){const e=Buffer.allocUnsafe(2);e.writeUInt16BE(this.#c.closeInfo.code,0);const A=new C(e);this.ws[l].socket.write(A.createFrame(n.CLOSE),(e=>{if(!e){this.ws[g]=true}}))}this.ws[c]=i.CLOSING;this.ws[E]=true;this.end();return}else if(this.#c.opcode===n.PING){const A=this.consume(t);if(!this.ws[E]){const e=new C(A);this.ws[l].socket.write(e.createFrame(n.PONG));if(d.ping.hasSubscribers){d.ping.publish({payload:A})}}this.#a=o.INFO;if(this.#i>0){continue}else{e();return}}else if(this.#c.opcode===n.PONG){const A=this.consume(t);if(d.pong.hasSubscribers){d.pong.publish({payload:A})}if(this.#i>0){continue}else{e();return}}}else if(this.#a===o.PAYLOADLENGTH_16){if(this.#i<2){return e()}const A=this.consume(2);this.#c.payloadLength=A.readUInt16BE(0);this.#a=o.READ_DATA}else if(this.#a===o.PAYLOADLENGTH_64){if(this.#i<8){return e()}const A=this.consume(8);const t=A.readUInt32BE(0);if(t>2**31-1){h(this.ws,"Received payload length > 2^31 bytes.");return}const r=A.readUInt32BE(4);this.#c.payloadLength=(t<<8)+r;this.#a=o.READ_DATA}else if(this.#a===o.READ_DATA){if(this.#i=this.#c.payloadLength){const e=this.consume(this.#c.payloadLength);this.#g.push(e);if(!this.#c.fragmented||this.#c.fin&&this.#c.opcode===n.CONTINUATION){const e=Buffer.concat(this.#g);Q(this.ws,this.#c.originalOpcode,e);this.#c={};this.#g.length=0}this.#a=o.INFO}}if(this.#i>0){continue}else{e();break}}}consume(e){if(e>this.#i){return null}else if(e===0){return a}if(this.#n[0].length===e){this.#i-=this.#n[0].length;return this.#n.shift()}const A=Buffer.allocUnsafe(e);let t=0;while(t!==e){const r=this.#n[0];const{length:s}=r;if(s+t===e){A.set(this.#n.shift(),t);break}else if(s+t>e){A.set(r.subarray(0,e-t),t);this.#n[0]=r.subarray(e-t);break}else{A.set(this.#n.shift(),t);t+=r.length}}this.#i-=e;return A}parseCloseBody(e,A){let t;if(A.length>=2){t=A.readUInt16BE(0)}if(e){if(!u(t)){return null}return{code:t}}let r=A.subarray(2);if(r[0]===239&&r[1]===187&&r[2]===191){r=r.subarray(3)}if(t!==undefined&&!u(t)){return null}try{r=new TextDecoder("utf-8",{fatal:true}).decode(r)}catch{return null}return{code:t,reason:r}}get closingInfo(){return this.#c.closeInfo}}e.exports={ByteParser:ByteParser}},2933:e=>{"use strict";e.exports={kWebSocketURL:Symbol("url"),kReadyState:Symbol("ready state"),kController:Symbol("controller"),kResponse:Symbol("response"),kBinaryType:Symbol("binary type"),kSentClose:Symbol("sent close"),kReceivedClose:Symbol("received close"),kByteParser:Symbol("byte parser")}},3574:(e,A,t)=>{"use strict";const{kReadyState:r,kController:s,kResponse:o,kBinaryType:n,kWebSocketURL:i}=t(2933);const{states:a,opcodes:c}=t(5913);const{MessageEvent:g,ErrorEvent:l}=t(6255);function isEstablished(e){return e[r]===a.OPEN}function isClosing(e){return e[r]===a.CLOSING}function isClosed(e){return e[r]===a.CLOSED}function fireEvent(e,A,t=Event,r){const s=new t(e,r);A.dispatchEvent(s)}function websocketMessageReceived(e,A,t){if(e[r]!==a.OPEN){return}let s;if(A===c.TEXT){try{s=new TextDecoder("utf-8",{fatal:true}).decode(t)}catch{failWebsocketConnection(e,"Received invalid UTF-8 in text frame.");return}}else if(A===c.BINARY){if(e[n]==="blob"){s=new Blob([t])}else{s=new Uint8Array(t).buffer}}fireEvent("message",e,g,{origin:e[i].origin,data:s})}function isValidSubprotocol(e){if(e.length===0){return false}for(const A of e){const e=A.charCodeAt(0);if(e<33||e>126||A==="("||A===")"||A==="<"||A===">"||A==="@"||A===","||A===";"||A===":"||A==="\\"||A==='"'||A==="/"||A==="["||A==="]"||A==="?"||A==="="||A==="{"||A==="}"||e===32||e===9){return false}}return true}function isValidStatusCode(e){if(e>=1e3&&e<1015){return e!==1004&&e!==1005&&e!==1006}return e>=3e3&&e<=4999}function failWebsocketConnection(e,A){const{[s]:t,[o]:r}=e;t.abort();if(r?.socket&&!r.socket.destroyed){r.socket.destroy()}if(A){fireEvent("error",e,l,{error:new Error(A)})}}e.exports={isEstablished:isEstablished,isClosing:isClosing,isClosed:isClosed,fireEvent:fireEvent,isValidSubprotocol:isValidSubprotocol,isValidStatusCode:isValidStatusCode,failWebsocketConnection:failWebsocketConnection,websocketMessageReceived:websocketMessageReceived}},5171:(e,A,t)=>{"use strict";const{webidl:r}=t(4222);const{DOMException:s}=t(7326);const{URLSerializer:o}=t(4322);const{getGlobalOrigin:n}=t(5628);const{staticPropertyDescriptors:i,states:a,opcodes:c,emptyBuffer:g}=t(5913);const{kWebSocketURL:l,kReadyState:E,kController:u,kBinaryType:h,kResponse:Q,kSentClose:C,kByteParser:d}=t(2933);const{isEstablished:B,isClosing:I,isValidSubprotocol:p,failWebsocketConnection:m,fireEvent:y}=t(3574);const{establishWebSocketConnection:w}=t(8550);const{WebsocketFrameSend:b}=t(1237);const{ByteParser:R}=t(3171);const{kEnumerableProperty:k,isBlobLike:D}=t(3440);const{getGlobalDispatcher:S}=t(2581);const{types:F}=t(9023);let T=false;class WebSocket extends EventTarget{#l={open:null,error:null,close:null,message:null};#E=0;#u="";#h="";constructor(e,A=[]){super();r.argumentLengthCheck(arguments,1,{header:"WebSocket constructor"});if(!T){T=true;process.emitWarning("WebSockets are experimental, expect them to change at any time.",{code:"UNDICI-WS"})}const t=r.converters["DOMString or sequence or WebSocketInit"](A);e=r.converters.USVString(e);A=t.protocols;const o=n();let i;try{i=new URL(e,o)}catch(e){throw new s(e,"SyntaxError")}if(i.protocol==="http:"){i.protocol="ws:"}else if(i.protocol==="https:"){i.protocol="wss:"}if(i.protocol!=="ws:"&&i.protocol!=="wss:"){throw new s(`Expected a ws: or wss: protocol, got ${i.protocol}`,"SyntaxError")}if(i.hash||i.href.endsWith("#")){throw new s("Got fragment","SyntaxError")}if(typeof A==="string"){A=[A]}if(A.length!==new Set(A.map((e=>e.toLowerCase()))).size){throw new s("Invalid Sec-WebSocket-Protocol value","SyntaxError")}if(A.length>0&&!A.every((e=>p(e)))){throw new s("Invalid Sec-WebSocket-Protocol value","SyntaxError")}this[l]=new URL(i.href);this[u]=w(i,A,this,(e=>this.#Q(e)),t);this[E]=WebSocket.CONNECTING;this[h]="blob"}close(e=undefined,A=undefined){r.brandCheck(this,WebSocket);if(e!==undefined){e=r.converters["unsigned short"](e,{clamp:true})}if(A!==undefined){A=r.converters.USVString(A)}if(e!==undefined){if(e!==1e3&&(e<3e3||e>4999)){throw new s("invalid code","InvalidAccessError")}}let t=0;if(A!==undefined){t=Buffer.byteLength(A);if(t>123){throw new s(`Reason must be less than 123 bytes; received ${t}`,"SyntaxError")}}if(this[E]===WebSocket.CLOSING||this[E]===WebSocket.CLOSED){}else if(!B(this)){m(this,"Connection was closed before it was established.");this[E]=WebSocket.CLOSING}else if(!I(this)){const r=new b;if(e!==undefined&&A===undefined){r.frameData=Buffer.allocUnsafe(2);r.frameData.writeUInt16BE(e,0)}else if(e!==undefined&&A!==undefined){r.frameData=Buffer.allocUnsafe(2+t);r.frameData.writeUInt16BE(e,0);r.frameData.write(A,2,"utf-8")}else{r.frameData=g}const s=this[Q].socket;s.write(r.createFrame(c.CLOSE),(e=>{if(!e){this[C]=true}}));this[E]=a.CLOSING}else{this[E]=WebSocket.CLOSING}}send(e){r.brandCheck(this,WebSocket);r.argumentLengthCheck(arguments,1,{header:"WebSocket.send"});e=r.converters.WebSocketSendData(e);if(this[E]===WebSocket.CONNECTING){throw new s("Sent before connected.","InvalidStateError")}if(!B(this)||I(this)){return}const A=this[Q].socket;if(typeof e==="string"){const t=Buffer.from(e);const r=new b(t);const s=r.createFrame(c.TEXT);this.#E+=t.byteLength;A.write(s,(()=>{this.#E-=t.byteLength}))}else if(F.isArrayBuffer(e)){const t=Buffer.from(e);const r=new b(t);const s=r.createFrame(c.BINARY);this.#E+=t.byteLength;A.write(s,(()=>{this.#E-=t.byteLength}))}else if(ArrayBuffer.isView(e)){const t=Buffer.from(e,e.byteOffset,e.byteLength);const r=new b(t);const s=r.createFrame(c.BINARY);this.#E+=t.byteLength;A.write(s,(()=>{this.#E-=t.byteLength}))}else if(D(e)){const t=new b;e.arrayBuffer().then((e=>{const r=Buffer.from(e);t.frameData=r;const s=t.createFrame(c.BINARY);this.#E+=r.byteLength;A.write(s,(()=>{this.#E-=r.byteLength}))}))}}get readyState(){r.brandCheck(this,WebSocket);return this[E]}get bufferedAmount(){r.brandCheck(this,WebSocket);return this.#E}get url(){r.brandCheck(this,WebSocket);return o(this[l])}get extensions(){r.brandCheck(this,WebSocket);return this.#h}get protocol(){r.brandCheck(this,WebSocket);return this.#u}get onopen(){r.brandCheck(this,WebSocket);return this.#l.open}set onopen(e){r.brandCheck(this,WebSocket);if(this.#l.open){this.removeEventListener("open",this.#l.open)}if(typeof e==="function"){this.#l.open=e;this.addEventListener("open",e)}else{this.#l.open=null}}get onerror(){r.brandCheck(this,WebSocket);return this.#l.error}set onerror(e){r.brandCheck(this,WebSocket);if(this.#l.error){this.removeEventListener("error",this.#l.error)}if(typeof e==="function"){this.#l.error=e;this.addEventListener("error",e)}else{this.#l.error=null}}get onclose(){r.brandCheck(this,WebSocket);return this.#l.close}set onclose(e){r.brandCheck(this,WebSocket);if(this.#l.close){this.removeEventListener("close",this.#l.close)}if(typeof e==="function"){this.#l.close=e;this.addEventListener("close",e)}else{this.#l.close=null}}get onmessage(){r.brandCheck(this,WebSocket);return this.#l.message}set onmessage(e){r.brandCheck(this,WebSocket);if(this.#l.message){this.removeEventListener("message",this.#l.message)}if(typeof e==="function"){this.#l.message=e;this.addEventListener("message",e)}else{this.#l.message=null}}get binaryType(){r.brandCheck(this,WebSocket);return this[h]}set binaryType(e){r.brandCheck(this,WebSocket);if(e!=="blob"&&e!=="arraybuffer"){this[h]="blob"}else{this[h]=e}}#Q(e){this[Q]=e;const A=new R(this);A.on("drain",(function onParserDrain(){this.ws[Q].socket.resume()}));e.socket.ws=this;this[d]=A;this[E]=a.OPEN;const t=e.headersList.get("sec-websocket-extensions");if(t!==null){this.#h=t}const r=e.headersList.get("sec-websocket-protocol");if(r!==null){this.#u=r}y("open",this)}}WebSocket.CONNECTING=WebSocket.prototype.CONNECTING=a.CONNECTING;WebSocket.OPEN=WebSocket.prototype.OPEN=a.OPEN;WebSocket.CLOSING=WebSocket.prototype.CLOSING=a.CLOSING;WebSocket.CLOSED=WebSocket.prototype.CLOSED=a.CLOSED;Object.defineProperties(WebSocket.prototype,{CONNECTING:i,OPEN:i,CLOSING:i,CLOSED:i,url:k,readyState:k,bufferedAmount:k,onopen:k,onerror:k,onclose:k,close:k,onmessage:k,binaryType:k,send:k,extensions:k,protocol:k,[Symbol.toStringTag]:{value:"WebSocket",writable:false,enumerable:false,configurable:true}});Object.defineProperties(WebSocket,{CONNECTING:i,OPEN:i,CLOSING:i,CLOSED:i});r.converters["sequence"]=r.sequenceConverter(r.converters.DOMString);r.converters["DOMString or sequence"]=function(e){if(r.util.Type(e)==="Object"&&Symbol.iterator in e){return r.converters["sequence"](e)}return r.converters.DOMString(e)};r.converters.WebSocketInit=r.dictionaryConverter([{key:"protocols",converter:r.converters["DOMString or sequence"],get defaultValue(){return[]}},{key:"dispatcher",converter:e=>e,get defaultValue(){return S()}},{key:"headers",converter:r.nullableConverter(r.converters.HeadersInit)}]);r.converters["DOMString or sequence or WebSocketInit"]=function(e){if(r.util.Type(e)==="Object"&&!(Symbol.iterator in e)){return r.converters.WebSocketInit(e)}return{protocols:r.converters["DOMString or sequence"](e)}};r.converters.WebSocketSendData=function(e){if(r.util.Type(e)==="Object"){if(D(e)){return r.converters.Blob(e,{strict:false})}if(ArrayBuffer.isView(e)||F.isAnyArrayBuffer(e)){return r.converters.BufferSource(e)}}return r.converters.USVString(e)};e.exports={WebSocket:WebSocket}},3843:(e,A)=>{"use strict";Object.defineProperty(A,"__esModule",{value:true});function getUserAgent(){if(typeof navigator==="object"&&"userAgent"in navigator){return navigator.userAgent}if(typeof process==="object"&&process.version!==undefined){return`Node.js/${process.version.substr(1)} (${process.platform}; ${process.arch})`}return""}A.getUserAgent=getUserAgent},8264:e=>{e.exports=wrappy;function wrappy(e,A){if(e&&A)return wrappy(e)(A);if(typeof e!=="function")throw new TypeError("need wrapper function");Object.keys(e).forEach((function(A){wrapper[A]=e[A]}));return wrapper;function wrapper(){var A=new Array(arguments.length);for(var t=0;t{"use strict";e.exports=require("assert")},290:e=>{"use strict";e.exports=require("async_hooks")},181:e=>{"use strict";e.exports=require("buffer")},5317:e=>{"use strict";e.exports=require("child_process")},4236:e=>{"use strict";e.exports=require("console")},6982:e=>{"use strict";e.exports=require("crypto")},1637:e=>{"use strict";e.exports=require("diagnostics_channel")},4434:e=>{"use strict";e.exports=require("events")},9896:e=>{"use strict";e.exports=require("fs")},1943:e=>{"use strict";e.exports=require("fs/promises")},8611:e=>{"use strict";e.exports=require("http")},5675:e=>{"use strict";e.exports=require("http2")},5692:e=>{"use strict";e.exports=require("https")},9278:e=>{"use strict";e.exports=require("net")},8474:e=>{"use strict";e.exports=require("node:events")},7075:e=>{"use strict";e.exports=require("node:stream")},7975:e=>{"use strict";e.exports=require("node:util")},857:e=>{"use strict";e.exports=require("os")},6928:e=>{"use strict";e.exports=require("path")},2987:e=>{"use strict";e.exports=require("perf_hooks")},3480:e=>{"use strict";e.exports=require("querystring")},2203:e=>{"use strict";e.exports=require("stream")},3774:e=>{"use strict";e.exports=require("stream/web")},3193:e=>{"use strict";e.exports=require("string_decoder")},3557:e=>{"use strict";e.exports=require("timers")},4756:e=>{"use strict";e.exports=require("tls")},7016:e=>{"use strict";e.exports=require("url")},9023:e=>{"use strict";e.exports=require("util")},8253:e=>{"use strict";e.exports=require("util/types")},8167:e=>{"use strict";e.exports=require("worker_threads")},3106:e=>{"use strict";e.exports=require("zlib")},7182:(e,A,t)=>{"use strict";const r=t(7075).Writable;const s=t(7975).inherits;const o=t(4136);const n=t(612);const i=t(2271);const a=45;const c=Buffer.from("-");const g=Buffer.from("\r\n");const EMPTY_FN=function(){};function Dicer(e){if(!(this instanceof Dicer)){return new Dicer(e)}r.call(this,e);if(!e||!e.headerFirst&&typeof e.boundary!=="string"){throw new TypeError("Boundary required")}if(typeof e.boundary==="string"){this.setBoundary(e.boundary)}else{this._bparser=undefined}this._headerFirst=e.headerFirst;this._dashes=0;this._parts=0;this._finished=false;this._realFinish=false;this._isPreamble=true;this._justMatched=false;this._firstWrite=true;this._inHeader=true;this._part=undefined;this._cb=undefined;this._ignoreData=false;this._partOpts={highWaterMark:e.partHwm};this._pause=false;const A=this;this._hparser=new i(e);this._hparser.on("header",(function(e){A._inHeader=false;A._part.emit("header",e)}))}s(Dicer,r);Dicer.prototype.emit=function(e){if(e==="finish"&&!this._realFinish){if(!this._finished){const e=this;process.nextTick((function(){e.emit("error",new Error("Unexpected end of multipart data"));if(e._part&&!e._ignoreData){const A=e._isPreamble?"Preamble":"Part";e._part.emit("error",new Error(A+" terminated early due to unexpected end of multipart data"));e._part.push(null);process.nextTick((function(){e._realFinish=true;e.emit("finish");e._realFinish=false}));return}e._realFinish=true;e.emit("finish");e._realFinish=false}))}}else{r.prototype.emit.apply(this,arguments)}};Dicer.prototype._write=function(e,A,t){if(!this._hparser&&!this._bparser){return t()}if(this._headerFirst&&this._isPreamble){if(!this._part){this._part=new n(this._partOpts);if(this.listenerCount("preamble")!==0){this.emit("preamble",this._part)}else{this._ignore()}}const A=this._hparser.push(e);if(!this._inHeader&&A!==undefined&&A{"use strict";const r=t(8474).EventEmitter;const s=t(7975).inherits;const o=t(2393);const n=t(4136);const i=Buffer.from("\r\n\r\n");const a=/\r\n/g;const c=/^([^:]+):[ \t]?([\x00-\xFF]+)?$/;function HeaderParser(e){r.call(this);e=e||{};const A=this;this.nread=0;this.maxed=false;this.npairs=0;this.maxHeaderPairs=o(e,"maxHeaderPairs",2e3);this.maxHeaderSize=o(e,"maxHeaderSize",80*1024);this.buffer="";this.header={};this.finished=false;this.ss=new n(i);this.ss.on("info",(function(e,t,r,s){if(t&&!A.maxed){if(A.nread+s-r>=A.maxHeaderSize){s=A.maxHeaderSize-A.nread+r;A.nread=A.maxHeaderSize;A.maxed=true}else{A.nread+=s-r}A.buffer+=t.toString("binary",r,s)}if(e){A._finish()}}))}s(HeaderParser,r);HeaderParser.prototype.push=function(e){const A=this.ss.push(e);if(this.finished){return A}};HeaderParser.prototype.reset=function(){this.finished=false;this.buffer="";this.header={};this.ss.reset()};HeaderParser.prototype._finish=function(){if(this.buffer){this._parseHeader()}this.ss.matches=this.ss.maxMatches;const e=this.header;this.header={};this.buffer="";this.finished=true;this.nread=this.npairs=0;this.maxed=false;this.emit("header",e)};HeaderParser.prototype._parseHeader=function(){if(this.npairs===this.maxHeaderPairs){return}const e=this.buffer.split(a);const A=e.length;let t,r;for(var s=0;s{"use strict";const r=t(7975).inherits;const s=t(7075).Readable;function PartStream(e){s.call(this,e)}r(PartStream,s);PartStream.prototype._read=function(e){};e.exports=PartStream},4136:(e,A,t)=>{"use strict";const r=t(8474).EventEmitter;const s=t(7975).inherits;function SBMH(e){if(typeof e==="string"){e=Buffer.from(e)}if(!Buffer.isBuffer(e)){throw new TypeError("The needle has to be a String or a Buffer.")}const A=e.length;if(A===0){throw new Error("The needle cannot be an empty String/Buffer.")}if(A>256){throw new Error("The needle cannot have a length bigger than 256.")}this.maxMatches=Infinity;this.matches=0;this._occ=new Array(256).fill(A);this._lookbehind_size=0;this._needle=e;this._bufpos=0;this._lookbehind=Buffer.alloc(A);for(var t=0;t=0){this.emit("info",false,this._lookbehind,0,this._lookbehind_size);this._lookbehind_size=0}else{const t=this._lookbehind_size+o;if(t>0){this.emit("info",false,this._lookbehind,0,t)}this._lookbehind.copy(this._lookbehind,0,t,this._lookbehind_size-t);this._lookbehind_size-=t;e.copy(this._lookbehind,this._lookbehind_size);this._lookbehind_size+=A;this._bufpos=A;return A}}o+=(o>=0)*this._bufpos;if(e.indexOf(t,o)!==-1){o=e.indexOf(t,o);++this.matches;if(o>0){this.emit("info",true,e,this._bufpos,o)}else{this.emit("info",true)}return this._bufpos=o+r}else{o=A-r}while(o0){this.emit("info",false,e,this._bufpos,o{"use strict";const r=t(7075).Writable;const{inherits:s}=t(7975);const o=t(7182);const n=t(1192);const i=t(855);const a=t(8929);function Busboy(e){if(!(this instanceof Busboy)){return new Busboy(e)}if(typeof e!=="object"){throw new TypeError("Busboy expected an options-Object.")}if(typeof e.headers!=="object"){throw new TypeError("Busboy expected an options-Object with headers-attribute.")}if(typeof e.headers["content-type"]!=="string"){throw new TypeError("Missing Content-Type-header.")}const{headers:A,...t}=e;this.opts={autoDestroy:false,...t};r.call(this,this.opts);this._done=false;this._parser=this.getParserByHeaders(A);this._finished=false}s(Busboy,r);Busboy.prototype.emit=function(e){if(e==="finish"){if(!this._done){this._parser?.end();return}else if(this._finished){return}this._finished=true}r.prototype.emit.apply(this,arguments)};Busboy.prototype.getParserByHeaders=function(e){const A=a(e["content-type"]);const t={defCharset:this.opts.defCharset,fileHwm:this.opts.fileHwm,headers:e,highWaterMark:this.opts.highWaterMark,isPartAFile:this.opts.isPartAFile,limits:this.opts.limits,parsedConType:A,preservePath:this.opts.preservePath};if(n.detect.test(A[0])){return new n(this,t)}if(i.detect.test(A[0])){return new i(this,t)}throw new Error("Unsupported Content-Type.")};Busboy.prototype._write=function(e,A,t){this._parser.write(e,t)};e.exports=Busboy;e.exports["default"]=Busboy;e.exports.Busboy=Busboy;e.exports.Dicer=o},1192:(e,A,t)=>{"use strict";const{Readable:r}=t(7075);const{inherits:s}=t(7975);const o=t(7182);const n=t(8929);const i=t(2747);const a=t(692);const c=t(2393);const g=/^boundary$/i;const l=/^form-data$/i;const E=/^charset$/i;const u=/^filename$/i;const h=/^name$/i;Multipart.detect=/^multipart\/form-data/i;function Multipart(e,A){let t;let r;const s=this;let Q;const C=A.limits;const d=A.isPartAFile||((e,A,t)=>A==="application/octet-stream"||t!==undefined);const B=A.parsedConType||[];const I=A.defCharset||"utf8";const p=A.preservePath;const m={highWaterMark:A.fileHwm};for(t=0,r=B.length;tk){s.parser.removeListener("part",onPart);s.parser.on("part",skipPart);e.hitPartsLimit=true;e.emit("partsLimit");return skipPart(A)}if(v){const e=v;e.emit("end");e.removeAllListeners("end")}A.on("header",(function(o){let c;let g;let Q;let C;let B;let k;let D=0;if(o["content-type"]){Q=n(o["content-type"][0]);if(Q[0]){c=Q[0].toLowerCase();for(t=0,r=Q.length;tw){const r=w-D+e.length;if(r>0){t.push(e.slice(0,r))}t.truncated=true;t.bytesRead=w;A.removeAllListeners("data");t.emit("limit");return}else if(!t.push(e)){s._pause=true}t.bytesRead=D};L=function(){U=undefined;t.push(null)}}else{if(T===R){if(!e.hitFieldsLimit){e.hitFieldsLimit=true;e.emit("fieldsLimit")}return skipPart(A)}++T;++N;let t="";let r=false;v=A;S=function(e){if((D+=e.length)>y){const s=y-(D-e.length);t+=e.toString("binary",0,s);r=true;A.removeAllListeners("data")}else{t+=e.toString("binary")}};L=function(){v=undefined;if(t.length){t=i(t,"binary",C)}e.emit("field",g,t,false,r,B,c);--N;checkFinished()}}A._readableState.sync=false;A.on("data",S);A.on("end",L)})).on("error",(function(e){if(U){U.emit("error",e)}}))})).on("error",(function(A){e.emit("error",A)})).on("finish",(function(){L=true;checkFinished()}))}Multipart.prototype.write=function(e,A){const t=this.parser.write(e);if(t&&!this._pause){A()}else{this._needDrain=!t;this._cb=A}};Multipart.prototype.end=function(){const e=this;if(e.parser.writable){e.parser.end()}else if(!e._boy._done){process.nextTick((function(){e._boy._done=true;e._boy.emit("finish")}))}};function skipPart(e){e.resume()}function FileStream(e){r.call(this,e);this.bytesRead=0;this.truncated=false}s(FileStream,r);FileStream.prototype._read=function(e){};e.exports=Multipart},855:(e,A,t)=>{"use strict";const r=t(1496);const s=t(2747);const o=t(2393);const n=/^charset$/i;UrlEncoded.detect=/^application\/x-www-form-urlencoded/i;function UrlEncoded(e,A){const t=A.limits;const s=A.parsedConType;this.boy=e;this.fieldSizeLimit=o(t,"fieldSize",1*1024*1024);this.fieldNameSizeLimit=o(t,"fieldNameSize",100);this.fieldsLimit=o(t,"fields",Infinity);let i;for(var a=0,c=s.length;an){this._key+=this.decoder.write(e.toString("binary",n,t))}this._state="val";this._hitLimit=false;this._checkingBytes=true;this._val="";this._bytesVal=0;this._valTrunc=false;this.decoder.reset();n=t+1}else if(r!==undefined){++this._fields;let t;const o=this._keyTrunc;if(r>n){t=this._key+=this.decoder.write(e.toString("binary",n,r))}else{t=this._key}this._hitLimit=false;this._checkingBytes=true;this._key="";this._bytesKey=0;this._keyTrunc=false;this.decoder.reset();if(t.length){this.boy.emit("field",s(t,"binary",this.charset),"",o,false)}n=r+1;if(this._fields===this.fieldsLimit){return A()}}else if(this._hitLimit){if(o>n){this._key+=this.decoder.write(e.toString("binary",n,o))}n=o;if((this._bytesKey=this._key.length)===this.fieldNameSizeLimit){this._checkingBytes=false;this._keyTrunc=true}}else{if(nn){this._val+=this.decoder.write(e.toString("binary",n,r))}this.boy.emit("field",s(this._key,"binary",this.charset),s(this._val,"binary",this.charset),this._keyTrunc,this._valTrunc);this._state="key";this._hitLimit=false;this._checkingBytes=true;this._key="";this._bytesKey=0;this._keyTrunc=false;this.decoder.reset();n=r+1;if(this._fields===this.fieldsLimit){return A()}}else if(this._hitLimit){if(o>n){this._val+=this.decoder.write(e.toString("binary",n,o))}n=o;if(this._val===""&&this.fieldSizeLimit===0||(this._bytesVal=this._val.length)===this.fieldSizeLimit){this._checkingBytes=false;this._valTrunc=true}}else{if(n0){this.boy.emit("field",s(this._key,"binary",this.charset),"",this._keyTrunc,false)}else if(this._state==="val"){this.boy.emit("field",s(this._key,"binary",this.charset),s(this._val,"binary",this.charset),this._keyTrunc,this._valTrunc)}this.boy._done=true;this.boy.emit("finish")};e.exports=UrlEncoded},1496:e=>{"use strict";const A=/\+/g;const t=[0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,1,1,1,1,1,1,1,0,0,0,0,0,0,0,1,1,1,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0];function Decoder(){this.buffer=undefined}Decoder.prototype.write=function(e){e=e.replace(A," ");let r="";let s=0;let o=0;const n=e.length;for(;so){r+=e.substring(o,s);o=s}this.buffer="";++o}}if(o{"use strict";e.exports=function basename(e){if(typeof e!=="string"){return""}for(var A=e.length-1;A>=0;--A){switch(e.charCodeAt(A)){case 47:case 92:e=e.slice(A+1);return e===".."||e==="."?"":e}}return e===".."||e==="."?"":e}},2747:function(e){"use strict";const A=new TextDecoder("utf-8");const t=new Map([["utf-8",A],["utf8",A]]);function getDecoder(e){let A;while(true){switch(e){case"utf-8":case"utf8":return r.utf8;case"latin1":case"ascii":case"us-ascii":case"iso-8859-1":case"iso8859-1":case"iso88591":case"iso_8859-1":case"windows-1252":case"iso_8859-1:1987":case"cp1252":case"x-cp1252":return r.latin1;case"utf16le":case"utf-16le":case"ucs2":case"ucs-2":return r.utf16le;case"base64":return r.base64;default:if(A===undefined){A=true;e=e.toLowerCase();continue}return r.other.bind(e)}}}const r={utf8:(e,A)=>{if(e.length===0){return""}if(typeof e==="string"){e=Buffer.from(e,A)}return e.utf8Slice(0,e.length)},latin1:(e,A)=>{if(e.length===0){return""}if(typeof e==="string"){return e}return e.latin1Slice(0,e.length)},utf16le:(e,A)=>{if(e.length===0){return""}if(typeof e==="string"){e=Buffer.from(e,A)}return e.ucs2Slice(0,e.length)},base64:(e,A)=>{if(e.length===0){return""}if(typeof e==="string"){e=Buffer.from(e,A)}return e.base64Slice(0,e.length)},other:(e,A)=>{if(e.length===0){return""}if(typeof e==="string"){e=Buffer.from(e,A)}if(t.has(this.toString())){try{return t.get(this).decode(e)}catch{}}return typeof e==="string"?e:e.toString()}};function decodeText(e,A,t){if(e){return getDecoder(t)(e,A)}return e}e.exports=decodeText},2393:e=>{"use strict";e.exports=function getLimit(e,A,t){if(!e||e[A]===undefined||e[A]===null){return t}if(typeof e[A]!=="number"||isNaN(e[A])){throw new TypeError("Limit "+A+" is not a valid number")}return e[A]}},8929:(e,A,t)=>{"use strict";const r=t(2747);const s=/%[a-fA-F0-9][a-fA-F0-9]/g;const o={"%00":"\0","%01":"","%02":"","%03":"","%04":"","%05":"","%06":"","%07":"","%08":"\b","%09":"\t","%0a":"\n","%0A":"\n","%0b":"\v","%0B":"\v","%0c":"\f","%0C":"\f","%0d":"\r","%0D":"\r","%0e":"","%0E":"","%0f":"","%0F":"","%10":"","%11":"","%12":"","%13":"","%14":"","%15":"","%16":"","%17":"","%18":"","%19":"","%1a":"","%1A":"","%1b":"","%1B":"","%1c":"","%1C":"","%1d":"","%1D":"","%1e":"","%1E":"","%1f":"","%1F":"","%20":" ","%21":"!","%22":'"',"%23":"#","%24":"$","%25":"%","%26":"&","%27":"'","%28":"(","%29":")","%2a":"*","%2A":"*","%2b":"+","%2B":"+","%2c":",","%2C":",","%2d":"-","%2D":"-","%2e":".","%2E":".","%2f":"/","%2F":"/","%30":"0","%31":"1","%32":"2","%33":"3","%34":"4","%35":"5","%36":"6","%37":"7","%38":"8","%39":"9","%3a":":","%3A":":","%3b":";","%3B":";","%3c":"<","%3C":"<","%3d":"=","%3D":"=","%3e":">","%3E":">","%3f":"?","%3F":"?","%40":"@","%41":"A","%42":"B","%43":"C","%44":"D","%45":"E","%46":"F","%47":"G","%48":"H","%49":"I","%4a":"J","%4A":"J","%4b":"K","%4B":"K","%4c":"L","%4C":"L","%4d":"M","%4D":"M","%4e":"N","%4E":"N","%4f":"O","%4F":"O","%50":"P","%51":"Q","%52":"R","%53":"S","%54":"T","%55":"U","%56":"V","%57":"W","%58":"X","%59":"Y","%5a":"Z","%5A":"Z","%5b":"[","%5B":"[","%5c":"\\","%5C":"\\","%5d":"]","%5D":"]","%5e":"^","%5E":"^","%5f":"_","%5F":"_","%60":"`","%61":"a","%62":"b","%63":"c","%64":"d","%65":"e","%66":"f","%67":"g","%68":"h","%69":"i","%6a":"j","%6A":"j","%6b":"k","%6B":"k","%6c":"l","%6C":"l","%6d":"m","%6D":"m","%6e":"n","%6E":"n","%6f":"o","%6F":"o","%70":"p","%71":"q","%72":"r","%73":"s","%74":"t","%75":"u","%76":"v","%77":"w","%78":"x","%79":"y","%7a":"z","%7A":"z","%7b":"{","%7B":"{","%7c":"|","%7C":"|","%7d":"}","%7D":"}","%7e":"~","%7E":"~","%7f":"","%7F":"","%80":"€","%81":"","%82":"‚","%83":"ƒ","%84":"„","%85":"…","%86":"†","%87":"‡","%88":"ˆ","%89":"‰","%8a":"Š","%8A":"Š","%8b":"‹","%8B":"‹","%8c":"Œ","%8C":"Œ","%8d":"","%8D":"","%8e":"Ž","%8E":"Ž","%8f":"","%8F":"","%90":"","%91":"‘","%92":"’","%93":"“","%94":"”","%95":"•","%96":"–","%97":"—","%98":"˜","%99":"™","%9a":"š","%9A":"š","%9b":"›","%9B":"›","%9c":"œ","%9C":"œ","%9d":"","%9D":"","%9e":"ž","%9E":"ž","%9f":"Ÿ","%9F":"Ÿ","%a0":" ","%A0":" ","%a1":"ÂĄ","%A1":"ÂĄ","%a2":"Âĸ","%A2":"Âĸ","%a3":"ÂŖ","%A3":"ÂŖ","%a4":"¤","%A4":"¤","%a5":"ÂĨ","%A5":"ÂĨ","%a6":"ÂĻ","%A6":"ÂĻ","%a7":"§","%A7":"§","%a8":"¨","%A8":"¨","%a9":"Š","%A9":"Š","%aa":"ÂĒ","%Aa":"ÂĒ","%aA":"ÂĒ","%AA":"ÂĒ","%ab":"ÂĢ","%Ab":"ÂĢ","%aB":"ÂĢ","%AB":"ÂĢ","%ac":"ÂŦ","%Ac":"ÂŦ","%aC":"ÂŦ","%AC":"ÂŦ","%ad":"­","%Ad":"­","%aD":"­","%AD":"­","%ae":"ÂŽ","%Ae":"ÂŽ","%aE":"ÂŽ","%AE":"ÂŽ","%af":"¯","%Af":"¯","%aF":"¯","%AF":"¯","%b0":"°","%B0":"°","%b1":"Âą","%B1":"Âą","%b2":"²","%B2":"²","%b3":"Âŗ","%B3":"Âŗ","%b4":"´","%B4":"´","%b5":"Âĩ","%B5":"Âĩ","%b6":"Âļ","%B6":"Âļ","%b7":"¡","%B7":"¡","%b8":"¸","%B8":"¸","%b9":"š","%B9":"š","%ba":"Âē","%Ba":"Âē","%bA":"Âē","%BA":"Âē","%bb":"Âģ","%Bb":"Âģ","%bB":"Âģ","%BB":"Âģ","%bc":"Âŧ","%Bc":"Âŧ","%bC":"Âŧ","%BC":"Âŧ","%bd":"ÂŊ","%Bd":"ÂŊ","%bD":"ÂŊ","%BD":"ÂŊ","%be":"ž","%Be":"ž","%bE":"ž","%BE":"ž","%bf":"Âŋ","%Bf":"Âŋ","%bF":"Âŋ","%BF":"Âŋ","%c0":"À","%C0":"À","%c1":"Á","%C1":"Á","%c2":"Â","%C2":"Â","%c3":"Ã","%C3":"Ã","%c4":"Ä","%C4":"Ä","%c5":"Å","%C5":"Å","%c6":"Æ","%C6":"Æ","%c7":"Ç","%C7":"Ç","%c8":"È","%C8":"È","%c9":"É","%C9":"É","%ca":"Ê","%Ca":"Ê","%cA":"Ê","%CA":"Ê","%cb":"Ë","%Cb":"Ë","%cB":"Ë","%CB":"Ë","%cc":"Ì","%Cc":"Ì","%cC":"Ì","%CC":"Ì","%cd":"Í","%Cd":"Í","%cD":"Í","%CD":"Í","%ce":"Î","%Ce":"Î","%cE":"Î","%CE":"Î","%cf":"Ï","%Cf":"Ï","%cF":"Ï","%CF":"Ï","%d0":"Ð","%D0":"Ð","%d1":"Ñ","%D1":"Ñ","%d2":"Ò","%D2":"Ò","%d3":"Ó","%D3":"Ó","%d4":"Ô","%D4":"Ô","%d5":"Õ","%D5":"Õ","%d6":"Ö","%D6":"Ö","%d7":"×","%D7":"×","%d8":"Ø","%D8":"Ø","%d9":"Ù","%D9":"Ù","%da":"Ú","%Da":"Ú","%dA":"Ú","%DA":"Ú","%db":"Û","%Db":"Û","%dB":"Û","%DB":"Û","%dc":"Ü","%Dc":"Ü","%dC":"Ü","%DC":"Ü","%dd":"Ý","%Dd":"Ý","%dD":"Ý","%DD":"Ý","%de":"Þ","%De":"Þ","%dE":"Þ","%DE":"Þ","%df":"ß","%Df":"ß","%dF":"ß","%DF":"ß","%e0":"à","%E0":"à","%e1":"ÃĄ","%E1":"ÃĄ","%e2":"Ãĸ","%E2":"Ãĸ","%e3":"ÃŖ","%E3":"ÃŖ","%e4":"ä","%E4":"ä","%e5":"ÃĨ","%E5":"ÃĨ","%e6":"ÃĻ","%E6":"ÃĻ","%e7":"ç","%E7":"ç","%e8":"è","%E8":"è","%e9":"Ê","%E9":"Ê","%ea":"ÃĒ","%Ea":"ÃĒ","%eA":"ÃĒ","%EA":"ÃĒ","%eb":"ÃĢ","%Eb":"ÃĢ","%eB":"ÃĢ","%EB":"ÃĢ","%ec":"ÃŦ","%Ec":"ÃŦ","%eC":"ÃŦ","%EC":"ÃŦ","%ed":"í","%Ed":"í","%eD":"í","%ED":"í","%ee":"ÃŽ","%Ee":"ÃŽ","%eE":"ÃŽ","%EE":"ÃŽ","%ef":"ï","%Ef":"ï","%eF":"ï","%EF":"ï","%f0":"ð","%F0":"ð","%f1":"Ãą","%F1":"Ãą","%f2":"Ã˛","%F2":"Ã˛","%f3":"Ãŗ","%F3":"Ãŗ","%f4":"ô","%F4":"ô","%f5":"Ãĩ","%F5":"Ãĩ","%f6":"Ãļ","%F6":"Ãļ","%f7":"Ãˇ","%F7":"Ãˇ","%f8":"ø","%F8":"ø","%f9":"Ú","%F9":"Ú","%fa":"Ãē","%Fa":"Ãē","%fA":"Ãē","%FA":"Ãē","%fb":"Ãģ","%Fb":"Ãģ","%fB":"Ãģ","%FB":"Ãģ","%fc":"Ãŧ","%Fc":"Ãŧ","%fC":"Ãŧ","%FC":"Ãŧ","%fd":"ÃŊ","%Fd":"ÃŊ","%fD":"ÃŊ","%FD":"ÃŊ","%fe":"Þ","%Fe":"Þ","%fE":"Þ","%FE":"Þ","%ff":"Ãŋ","%Ff":"Ãŋ","%fF":"Ãŋ","%FF":"Ãŋ"};function encodedReplacer(e){return o[e]}const n=0;const i=1;const a=2;const c=3;function parseParams(e){const A=[];let t=n;let o="";let g=false;let l=false;let E=0;let u="";const h=e.length;for(var Q=0;Q{"use strict";e.exports=JSON.parse('{"k8s/ci/database.yaml":{"isBinary":false,"fileName":"k8s/ci/database.yaml","originalFileName":"k8s/ci/database.yaml","content":"apiVersion: ydb.tech/v1alpha1\\nkind: Database\\nmetadata:\\n name: database-sample\\nspec:\\n monitoring:\\n enabled: true\\n interval: 3s\\n additionalLabels:\\n ydb-cluster: slo-storage\\n ydb-cluster-monitor: slo-storage\\n affinity:\\n podAntiAffinity:\\n requiredDuringSchedulingIgnoredDuringExecution:\\n - labelSelector:\\n matchExpressions:\\n - key: ydb-cluster\\n operator: In\\n values:\\n - slo-storage\\n topologyKey: \'kubernetes.io/hostname\'\\n image:\\n name: cr.yandex/crptqonuodf51kdj7a7d/ydb:${{VERSION}}\\n domain: root\\n nodes: 6\\n resources:\\n containerResources:\\n limits:\\n cpu: 1\\n storageUnits:\\n - count: 1\\n unitKind: ssd\\n storageClusterRef:\\n name: storage-sample\\n"}}')},6046:e=>{"use strict";e.exports=JSON.parse('{"k8s/ci/storage.yaml":{"isBinary":false,"fileName":"k8s/ci/storage.yaml","originalFileName":"k8s/ci/storage.yaml","content":"apiVersion: ydb.tech/v1alpha1\\nkind: Storage\\nmetadata:\\n name: storage-sample\\nspec:\\n monitoring:\\n enabled: true\\n interval: 3s\\n additionalLabels:\\n ydb-cluster: slo-storage\\n ydb-cluster-monitor: slo-storage\\n affinity:\\n podAntiAffinity:\\n requiredDuringSchedulingIgnoredDuringExecution:\\n - labelSelector:\\n matchExpressions:\\n - key: ydb-cluster\\n operator: In\\n values:\\n - slo-storage\\n topologyKey: \'kubernetes.io/hostname\'\\n dataStore:\\n - volumeMode: Block\\n storageClassName: yc-network-ssd-nonreplicated\\n accessModes:\\n - ReadWriteOnce\\n resources:\\n requests:\\n storage: 93Gi\\n image:\\n name: cr.yandex/crptqonuodf51kdj7a7d/ydb:${{VERSION}}\\n domain: root\\n nodes: 9\\n erasure: mirror-3-dc\\n configuration: |-\\n static_erasure: mirror-3-dc\\n host_configs:\\n - drive:\\n - path: /dev/kikimr_ssd_00\\n type: SSD\\n host_config_id: 1\\n grpc_config:\\n port: 2135\\n domains_config:\\n domain:\\n - name: root\\n storage_pool_types:\\n - kind: ssd\\n pool_config:\\n box_id: 1\\n erasure_species: mirror-3-dc\\n kind: ssd\\n pdisk_filter:\\n - property:\\n - type: SSD\\n vdisk_kind: Default\\n state_storage:\\n - ring:\\n node: [ 1, 2, 3, 4, 5, 6, 7, 8, 9 ]\\n nto_select: 5\\n ssid: 1\\n actor_system_config:\\n batch_executor: 2\\n io_executor: 3\\n executor:\\n - name: System\\n spin_threshold: 0\\n threads: 2\\n type: BASIC\\n - name: User\\n spin_threshold: 0\\n threads: 3\\n type: BASIC\\n - name: Batch\\n spin_threshold: 0\\n threads: 2\\n type: BASIC\\n - name: IO\\n threads: 1\\n time_per_mailbox_micro_secs: 100\\n type: IO\\n - name: IC\\n spin_threshold: 10\\n threads: 1\\n time_per_mailbox_micro_secs: 100\\n type: BASIC\\n scheduler:\\n progress_threshold: 10000\\n resolution: 256\\n spin_threshold: 0\\n service_executor:\\n - executor_id: 4\\n service_name: Interconnect\\n blob_storage_config:\\n service_set:\\n availability_domains: 1\\n groups:\\n - erasure_species: mirror-3-dc\\n group_id: 0\\n group_generation: 1\\n rings:\\n - fail_domains:\\n - vdisk_locations:\\n - node_id: 1\\n pdisk_category: SSD\\n path: /dev/kikimr_ssd_00\\n - vdisk_locations:\\n - node_id: 2\\n pdisk_category: SSD\\n path: /dev/kikimr_ssd_00\\n - vdisk_locations:\\n - node_id: 3\\n pdisk_category: SSD\\n path: /dev/kikimr_ssd_00\\n - fail_domains:\\n - vdisk_locations:\\n - node_id: 4\\n pdisk_category: SSD\\n path: /dev/kikimr_ssd_00\\n - vdisk_locations:\\n - node_id: 5\\n pdisk_category: SSD\\n path: /dev/kikimr_ssd_00\\n - vdisk_locations:\\n - node_id: 6\\n pdisk_category: SSD\\n path: /dev/kikimr_ssd_00\\n - fail_domains:\\n - vdisk_locations:\\n - node_id: 7\\n pdisk_category: SSD\\n path: /dev/kikimr_ssd_00\\n - vdisk_locations:\\n - node_id: 8\\n pdisk_category: SSD\\n path: /dev/kikimr_ssd_00\\n - vdisk_locations:\\n - node_id: 9\\n pdisk_category: SSD\\n path: /dev/kikimr_ssd_00\\n channel_profile_config:\\n profile:\\n - channel:\\n - erasure_species: mirror-3-dc\\n pdisk_category: 1\\n storage_pool_kind: ssd\\n - erasure_species: mirror-3-dc\\n pdisk_category: 1\\n storage_pool_kind: ssd\\n - erasure_species: mirror-3-dc\\n pdisk_category: 1\\n storage_pool_kind: ssd\\n profile_id: 0\\n"}}')},8112:e=>{"use strict";e.exports=JSON.parse('{"k8s/ci/workload.yaml":{"isBinary":false,"fileName":"k8s/ci/workload.yaml","originalFileName":"k8s/ci/workload.yaml","content":"apiVersion: batch/v1\\nkind: Job\\nmetadata:\\n name: ${{LANGUAGE_ID}}-wl-${{COMMAND}}\\nspec:\\n ttlSecondsAfterFinished: 120\\n backoffLimit: 0\\n template:\\n metadata:\\n name: ${{LANGUAGE_ID}}-wl-${{COMMAND}}\\n spec:\\n containers:\\n - name: ${{LANGUAGE_ID}}-wl-${{COMMAND}}\\n image: ${{DOCKER_IMAGE}}:latest\\n args:\\n - \'${{COMMAND}}\'\\n - ${{ARGS}}\\n restartPolicy: Never\\n"}}')}};var A={};function __nccwpck_require__(t){var r=A[t];if(r!==undefined){return r.exports}var s=A[t]={exports:{}};var o=true;try{e[t].call(s.exports,s,s.exports,__nccwpck_require__);o=false}finally{if(o)delete A[t]}return s.exports}if(typeof __nccwpck_require__!=="undefined")__nccwpck_require__.ab=__dirname+"/";var t=__nccwpck_require__(5915);module.exports=t})(); \ No newline at end of file diff --git a/dist/main/licenses.txt b/dist/main/licenses.txt deleted file mode 100644 index 8cacbba1..00000000 --- a/dist/main/licenses.txt +++ /dev/null @@ -1,588 +0,0 @@ -@actions/core -MIT -The MIT License (MIT) - -Copyright 2019 GitHub - -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. - -@actions/exec -MIT -The MIT License (MIT) - -Copyright 2019 GitHub - -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. - -@actions/github -MIT -The MIT License (MIT) - -Copyright 2019 GitHub - -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. - -@actions/http-client -MIT -Actions Http Client for Node.js - -Copyright (c) GitHub, Inc. - -All rights reserved. - -MIT License - -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. - - -@actions/io -MIT -The MIT License (MIT) - -Copyright 2019 GitHub - -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. - -@fastify/busboy -MIT -Copyright Brian White. All rights reserved. - -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. - -@octokit/auth-token -MIT -The MIT License - -Copyright (c) 2019 Octokit contributors - -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. - - -@octokit/core -MIT -The MIT License - -Copyright (c) 2019 Octokit contributors - -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. - - -@octokit/endpoint -MIT -The MIT License - -Copyright (c) 2018 Octokit contributors - -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. - - -@octokit/graphql -MIT -The MIT License - -Copyright (c) 2018 Octokit contributors - -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. - - -@octokit/plugin-paginate-rest -MIT -MIT License Copyright (c) 2019 Octokit contributors - -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 (including the next paragraph) 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. - - -@octokit/plugin-rest-endpoint-methods -MIT -MIT License Copyright (c) 2019 Octokit contributors - -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 (including the next paragraph) 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. - - -@octokit/request -MIT -The MIT License - -Copyright (c) 2018 Octokit contributors - -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. - - -@octokit/request-error -MIT -The MIT License - -Copyright (c) 2019 Octokit contributors - -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. - - -before-after-hook -Apache-2.0 - Apache License - Version 2.0, January 2004 - http://www.apache.org/licenses/ - - TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION - - 1. Definitions. - - "License" shall mean the terms and conditions for use, reproduction, - and distribution as defined by Sections 1 through 9 of this document. - - "Licensor" shall mean the copyright owner or entity authorized by - the copyright owner that is granting the License. - - "Legal Entity" shall mean the union of the acting entity and all - other entities that control, are controlled by, or are under common - control with that entity. For the purposes of this definition, - "control" means (i) the power, direct or indirect, to cause the - direction or management of such entity, whether by contract or - otherwise, or (ii) ownership of fifty percent (50%) or more of the - outstanding shares, or (iii) beneficial ownership of such entity. - - "You" (or "Your") shall mean an individual or Legal Entity - exercising permissions granted by this License. - - "Source" form shall mean the preferred form for making modifications, - including but not limited to software source code, documentation - source, and configuration files. - - "Object" form shall mean any form resulting from mechanical - transformation or translation of a Source form, including but - not limited to compiled object code, generated documentation, - and conversions to other media types. - - "Work" shall mean the work of authorship, whether in Source or - Object form, made available under the License, as indicated by a - copyright notice that is included in or attached to the work - (an example is provided in the Appendix below). - - "Derivative Works" shall mean any work, whether in Source or Object - form, that is based on (or derived from) the Work and for which the - editorial revisions, annotations, elaborations, or other modifications - represent, as a whole, an original work of authorship. For the purposes - of this License, Derivative Works shall not include works that remain - separable from, or merely link (or bind by name) to the interfaces of, - the Work and Derivative Works thereof. - - "Contribution" shall mean any work of authorship, including - the original version of the Work and any modifications or additions - to that Work or Derivative Works thereof, that is intentionally - submitted to Licensor for inclusion in the Work by the copyright owner - or by an individual or Legal Entity authorized to submit on behalf of - the copyright owner. For the purposes of this definition, "submitted" - means any form of electronic, verbal, or written communication sent - to the Licensor or its representatives, including but not limited to - communication on electronic mailing lists, source code control systems, - and issue tracking systems that are managed by, or on behalf of, the - Licensor for the purpose of discussing and improving the Work, but - excluding communication that is conspicuously marked or otherwise - designated in writing by the copyright owner as "Not a Contribution." - - "Contributor" shall mean Licensor and any individual or Legal Entity - on behalf of whom a Contribution has been received by Licensor and - subsequently incorporated within the Work. - - 2. Grant of Copyright License. Subject to the terms and conditions of - this License, each Contributor hereby grants to You a perpetual, - worldwide, non-exclusive, no-charge, royalty-free, irrevocable - copyright license to reproduce, prepare Derivative Works of, - publicly display, publicly perform, sublicense, and distribute the - Work and such Derivative Works in Source or Object form. - - 3. Grant of Patent License. Subject to the terms and conditions of - this License, each Contributor hereby grants to You a perpetual, - worldwide, non-exclusive, no-charge, royalty-free, irrevocable - (except as stated in this section) patent license to make, have made, - use, offer to sell, sell, import, and otherwise transfer the Work, - where such license applies only to those patent claims licensable - by such Contributor that are necessarily infringed by their - Contribution(s) alone or by combination of their Contribution(s) - with the Work to which such Contribution(s) was submitted. If You - institute patent litigation against any entity (including a - cross-claim or counterclaim in a lawsuit) alleging that the Work - or a Contribution incorporated within the Work constitutes direct - or contributory patent infringement, then any patent licenses - granted to You under this License for that Work shall terminate - as of the date such litigation is filed. - - 4. Redistribution. You may reproduce and distribute copies of the - Work or Derivative Works thereof in any medium, with or without - modifications, and in Source or Object form, provided that You - meet the following conditions: - - (a) You must give any other recipients of the Work or - Derivative Works a copy of this License; and - - (b) You must cause any modified files to carry prominent notices - stating that You changed the files; and - - (c) You must retain, in the Source form of any Derivative Works - that You distribute, all copyright, patent, trademark, and - attribution notices from the Source form of the Work, - excluding those notices that do not pertain to any part of - the Derivative Works; and - - (d) If the Work includes a "NOTICE" text file as part of its - distribution, then any Derivative Works that You distribute must - include a readable copy of the attribution notices contained - within such NOTICE file, excluding those notices that do not - pertain to any part of the Derivative Works, in at least one - of the following places: within a NOTICE text file distributed - as part of the Derivative Works; within the Source form or - documentation, if provided along with the Derivative Works; or, - within a display generated by the Derivative Works, if and - wherever such third-party notices normally appear. The contents - of the NOTICE file are for informational purposes only and - do not modify the License. You may add Your own attribution - notices within Derivative Works that You distribute, alongside - or as an addendum to the NOTICE text from the Work, provided - that such additional attribution notices cannot be construed - as modifying the License. - - You may add Your own copyright statement to Your modifications and - may provide additional or different license terms and conditions - for use, reproduction, or distribution of Your modifications, or - for any such Derivative Works as a whole, provided Your use, - reproduction, and distribution of the Work otherwise complies with - the conditions stated in this License. - - 5. Submission of Contributions. Unless You explicitly state otherwise, - any Contribution intentionally submitted for inclusion in the Work - by You to the Licensor shall be under the terms and conditions of - this License, without any additional terms or conditions. - Notwithstanding the above, nothing herein shall supersede or modify - the terms of any separate license agreement you may have executed - with Licensor regarding such Contributions. - - 6. Trademarks. This License does not grant permission to use the trade - names, trademarks, service marks, or product names of the Licensor, - except as required for reasonable and customary use in describing the - origin of the Work and reproducing the content of the NOTICE file. - - 7. Disclaimer of Warranty. Unless required by applicable law or - agreed to in writing, Licensor provides the Work (and each - Contributor provides its Contributions) on an "AS IS" BASIS, - WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or - implied, including, without limitation, any warranties or conditions - of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A - PARTICULAR PURPOSE. You are solely responsible for determining the - appropriateness of using or redistributing the Work and assume any - risks associated with Your exercise of permissions under this License. - - 8. Limitation of Liability. In no event and under no legal theory, - whether in tort (including negligence), contract, or otherwise, - unless required by applicable law (such as deliberate and grossly - negligent acts) or agreed to in writing, shall any Contributor be - liable to You for damages, including any direct, indirect, special, - incidental, or consequential damages of any character arising as a - result of this License or out of the use or inability to use the - Work (including but not limited to damages for loss of goodwill, - work stoppage, computer failure or malfunction, or any and all - other commercial damages or losses), even if such Contributor - has been advised of the possibility of such damages. - - 9. Accepting Warranty or Additional Liability. While redistributing - the Work or Derivative Works thereof, You may choose to offer, - and charge a fee for, acceptance of support, warranty, indemnity, - or other liability obligations and/or rights consistent with this - License. However, in accepting such obligations, You may act only - on Your own behalf and on Your sole responsibility, not on behalf - of any other Contributor, and only if You agree to indemnify, - defend, and hold each Contributor harmless for any liability - incurred by, or claims asserted against, such Contributor by reason - of your accepting any such warranty or additional liability. - - END OF TERMS AND CONDITIONS - - APPENDIX: How to apply the Apache License to your work. - - To apply the Apache License to your work, attach the following - boilerplate notice, with the fields enclosed by brackets "{}" - replaced with your own identifying information. (Don't include - the brackets!) The text should be enclosed in the appropriate - comment syntax for the file format. We also recommend that a - file or class name and description of purpose be included on the - same "printed page" as the copyright notice for easier - identification within third-party archives. - - Copyright 2018 Gregor Martynus and other contributors. - - Licensed under the Apache License, Version 2.0 (the "License"); - you may not use this file except in compliance with the License. - You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - - Unless required by applicable law or agreed to in writing, software - distributed under the License is distributed on an "AS IS" BASIS, - WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - See the License for the specific language governing permissions and - limitations under the License. - - -deprecation -ISC -The ISC License - -Copyright (c) Gregor Martynus and contributors - -Permission to use, copy, modify, and/or distribute this software for any -purpose with or without fee is hereby granted, provided that the above -copyright notice and this permission notice appear in all copies. - -THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES -WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF -MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR -ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES -WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN -ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR -IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. - - -once -ISC -The ISC License - -Copyright (c) Isaac Z. Schlueter and Contributors - -Permission to use, copy, modify, and/or distribute this software for any -purpose with or without fee is hereby granted, provided that the above -copyright notice and this permission notice appear in all copies. - -THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES -WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF -MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR -ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES -WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN -ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR -IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. - - -tunnel -MIT -The MIT License (MIT) - -Copyright (c) 2012 Koichi Kobayashi - -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. - - -undici -MIT -MIT License - -Copyright (c) Matteo Collina and Undici contributors - -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. - - -universal-user-agent -ISC -# [ISC License](https://spdx.org/licenses/ISC) - -Copyright (c) 2018, Gregor Martynus (https://github.com/gr2m) - -Permission to use, copy, modify, and/or distribute this software for any purpose with or without fee is hereby granted, provided that the above copyright notice and this permission notice appear in all copies. - -THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. - - -wrappy -ISC -The ISC License - -Copyright (c) Isaac Z. Schlueter and Contributors - -Permission to use, copy, modify, and/or distribute this software for any -purpose with or without fee is hereby granted, provided that the above -copyright notice and this permission notice appear in all copies. - -THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES -WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF -MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR -ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES -WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN -ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR -IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. diff --git a/dist/post/index.js b/dist/post/index.js deleted file mode 100644 index 6032a3de..00000000 --- a/dist/post/index.js +++ /dev/null @@ -1,3 +0,0 @@ -(()=>{var A={2965:function(A,e,t){"use strict";var r=this&&this.__createBinding||(Object.create?function(A,e,t,r){if(r===undefined)r=t;var s=Object.getOwnPropertyDescriptor(e,t);if(!s||("get"in s?!e.__esModule:s.writable||s.configurable)){s={enumerable:true,get:function(){return e[t]}}}Object.defineProperty(A,r,s)}:function(A,e,t,r){if(r===undefined)r=t;A[r]=e[t]});var s=this&&this.__setModuleDefault||(Object.create?function(A,e){Object.defineProperty(A,"default",{enumerable:true,value:e})}:function(A,e){A["default"]=e});var o=this&&this.__importStar||function(A){if(A&&A.__esModule)return A;var e={};if(A!=null)for(var t in A)if(t!=="default"&&Object.prototype.hasOwnProperty.call(A,t))r(e,A,t);s(e,A);return e};var n=this&&this.__importDefault||function(A){return A&&A.__esModule?A:{default:A}};Object.defineProperty(e,"__esModule",{value:true});e.prepareK8S=prepareK8S;e.prepareAWS=prepareAWS;e.call=call;e.callAsync=callAsync;e.callKubernetes=callKubernetes;e.callKubernetesPath=callKubernetesPath;e.callKubernetesAsync=callKubernetesAsync;e.callKubernetesPathAsync=callKubernetesPathAsync;const i=o(t(7484));const a=t(5317);const E=t(9896);const g=t(857);const c=n(t(6928));const Q=t(672);let C=null;let B=0;function prepareK8S(A){return(0,Q.logGroup)("Prepare k8s",(()=>{const e=c.default.join((0,g.homedir)(),".kube");i.info(`mkdir ${e}`);try{(0,E.mkdirSync)(e)}catch(A){i.debug("error"+JSON.stringify(A));if((A===null||A===void 0?void 0:A.code)==="EEXIST"){i.debug(e+" EEXIST")}else throw A}if(A.length>0){i.debug("Get kubeconfig string");const e=Buffer.from(A,"base64").toString("utf8");i.info(`Write kubeconfig to ~/.kube/config`);(0,E.writeFileSync)(c.default.join((0,g.homedir)(),".kube/config"),e)}C=call("which kubectl").split("\n")[0];i.info(`kubectl path: ${C}`)}))}function prepareAWS(A,e){const t=c.default.join((0,g.homedir)(),".aws");i.info(`mkdir ${t}`);try{(0,E.mkdirSync)(t)}catch(A){i.debug("error"+JSON.stringify(A));if((A===null||A===void 0?void 0:A.code)==="EEXIST"){i.debug(t+" EEXIST")}else throw A}if(A.length>0){i.debug("Get aws credentials string");const e=Buffer.from(A,"base64").toString("utf8");i.info(`Write awsCredentials to ~/.aws/credentials`);(0,E.writeFileSync)(c.default.join((0,g.homedir)(),".aws/credentials"),e)}if(e.length>0){i.debug("Get aws credentials string");const A=Buffer.from(e,"base64").toString("utf8");i.info(`Write awsConfig to ~/.aws/config`);(0,E.writeFileSync)(c.default.join((0,g.homedir)(),".aws/config"),A)}}function call(A,e=false){const t=++B;!e&&i.info(`Call #${t} command: '${A}'`);const r=(0,a.execSync)(A,{encoding:"utf8",maxBuffer:Infinity,stdio:"pipe"});i.debug(`Call #${t} result ${r}`);return r}function callAsync(A,e=false,t="."){return new Promise(((r,s)=>{const o=++B;!e&&i.info(`Call #${o} command: '${A}' with cwd '${t}'`);const n=(0,a.exec)(A,{encoding:"utf8",maxBuffer:Infinity,cwd:t});if(!n.stdio||!n.stdout||!n.stderr){i.info(`Error in callAsync #${o}: can't spawn process`);throw new Error(`Error in callAsync #${o}: can't spawn process`)}let E="",g="";n.stdout.on("data",(A=>E+=A.toString()));n.stderr.on("data",(A=>g+=A.toString()));n.on("close",(A=>{i.debug(`Call #${o} async code = ${A}`);if(A==0){if(E.length>3e3)i.debug(`Call #${o} async TRUNCATED (full size is ${E.length/1024}kb - showing 3000 symbols) output: \n${E.slice(0,1500)}\n.........\n${E.slice(-1500)}`);else i.debug(`Call #${o} async output \n${E}`);r(E)}else{if(e)i.info(`Call #${o} async with secrets failed - on close`);else i.info(`Call #${o} async failed - on close:\nError: ${g}\nOutput: ${E}`);s(new Error(g))}}));n.on("error",(A=>{if(e)i.info(`Call #${o} async with secrets failed - on error`);else i.info(`Call #${o} async failed - on error:\nError: ${A}\nOutput: ${E}`);s(A)}))}))}function callKubernetes(A){if(C===null)throw new Error("K8s not initialized, call prepareK8S first");return call(`${C} ${A}`)}function callKubernetesPath(A){if(C===null)throw new Error("K8s not initialized, call prepareK8S first");return call(A(C))}function callKubernetesAsync(A){if(C===null)throw new Error("K8s not initialized, call prepareK8S first");return callAsync(`${C} ${A}`)}function callKubernetesPathAsync(A){if(C===null)throw new Error("K8s not initialized, call prepareK8S first");return callAsync(A(C))}},5960:function(A,e,t){"use strict";var r=this&&this.__createBinding||(Object.create?function(A,e,t,r){if(r===undefined)r=t;var s=Object.getOwnPropertyDescriptor(e,t);if(!s||("get"in s?!e.__esModule:s.writable||s.configurable)){s={enumerable:true,get:function(){return e[t]}}}Object.defineProperty(A,r,s)}:function(A,e,t,r){if(r===undefined)r=t;A[r]=e[t]});var s=this&&this.__setModuleDefault||(Object.create?function(A,e){Object.defineProperty(A,"default",{enumerable:true,value:e})}:function(A,e){A["default"]=e});var o=this&&this.__importStar||function(A){if(A&&A.__esModule)return A;var e={};if(A!=null)for(var t in A)if(t!=="default"&&Object.prototype.hasOwnProperty.call(A,t))r(e,A,t);s(e,A);return e};Object.defineProperty(e,"__esModule",{value:true});const n=o(t(7484));const i=t(2965);n.info("Cleanup");n.debug("Remove .kube dir");(0,i.call)("rm -rf ~/.kube");n.debug("Remove .aws dir");(0,i.call)("rm -rf ~/.aws")},672:function(A,e,t){"use strict";var r=this&&this.__createBinding||(Object.create?function(A,e,t,r){if(r===undefined)r=t;var s=Object.getOwnPropertyDescriptor(e,t);if(!s||("get"in s?!e.__esModule:s.writable||s.configurable)){s={enumerable:true,get:function(){return e[t]}}}Object.defineProperty(A,r,s)}:function(A,e,t,r){if(r===undefined)r=t;A[r]=e[t]});var s=this&&this.__setModuleDefault||(Object.create?function(A,e){Object.defineProperty(A,"default",{enumerable:true,value:e})}:function(A,e){A["default"]=e});var o=this&&this.__importStar||function(A){if(A&&A.__esModule)return A;var e={};if(A!=null)for(var t in A)if(t!=="default"&&Object.prototype.hasOwnProperty.call(A,t))r(e,A,t);s(e,A);return e};Object.defineProperty(e,"__esModule",{value:true});e.logGroup=logGroup;const n=o(t(7484));function logGroup(A,e){n.startGroup(A);const t=e();if(t instanceof Promise){return t.finally((()=>{n.endGroup()}))}else{n.endGroup();return t}}},4914:function(A,e,t){"use strict";var r=this&&this.__createBinding||(Object.create?function(A,e,t,r){if(r===undefined)r=t;var s=Object.getOwnPropertyDescriptor(e,t);if(!s||("get"in s?!e.__esModule:s.writable||s.configurable)){s={enumerable:true,get:function(){return e[t]}}}Object.defineProperty(A,r,s)}:function(A,e,t,r){if(r===undefined)r=t;A[r]=e[t]});var s=this&&this.__setModuleDefault||(Object.create?function(A,e){Object.defineProperty(A,"default",{enumerable:true,value:e})}:function(A,e){A["default"]=e});var o=this&&this.__importStar||function(A){if(A&&A.__esModule)return A;var e={};if(A!=null)for(var t in A)if(t!=="default"&&Object.prototype.hasOwnProperty.call(A,t))r(e,A,t);s(e,A);return e};Object.defineProperty(e,"__esModule",{value:true});e.issue=e.issueCommand=void 0;const n=o(t(857));const i=t(302);function issueCommand(A,e,t){const r=new Command(A,e,t);process.stdout.write(r.toString()+n.EOL)}e.issueCommand=issueCommand;function issue(A,e=""){issueCommand(A,{},e)}e.issue=issue;const a="::";class Command{constructor(A,e,t){if(!A){A="missing.command"}this.command=A;this.properties=e;this.message=t}toString(){let A=a+this.command;if(this.properties&&Object.keys(this.properties).length>0){A+=" ";let e=true;for(const t in this.properties){if(this.properties.hasOwnProperty(t)){const r=this.properties[t];if(r){if(e){e=false}else{A+=","}A+=`${t}=${escapeProperty(r)}`}}}}A+=`${a}${escapeData(this.message)}`;return A}}function escapeData(A){return(0,i.toCommandValue)(A).replace(/%/g,"%25").replace(/\r/g,"%0D").replace(/\n/g,"%0A")}function escapeProperty(A){return(0,i.toCommandValue)(A).replace(/%/g,"%25").replace(/\r/g,"%0D").replace(/\n/g,"%0A").replace(/:/g,"%3A").replace(/,/g,"%2C")}},7484:function(A,e,t){"use strict";var r=this&&this.__createBinding||(Object.create?function(A,e,t,r){if(r===undefined)r=t;var s=Object.getOwnPropertyDescriptor(e,t);if(!s||("get"in s?!e.__esModule:s.writable||s.configurable)){s={enumerable:true,get:function(){return e[t]}}}Object.defineProperty(A,r,s)}:function(A,e,t,r){if(r===undefined)r=t;A[r]=e[t]});var s=this&&this.__setModuleDefault||(Object.create?function(A,e){Object.defineProperty(A,"default",{enumerable:true,value:e})}:function(A,e){A["default"]=e});var o=this&&this.__importStar||function(A){if(A&&A.__esModule)return A;var e={};if(A!=null)for(var t in A)if(t!=="default"&&Object.prototype.hasOwnProperty.call(A,t))r(e,A,t);s(e,A);return e};var n=this&&this.__awaiter||function(A,e,t,r){function adopt(A){return A instanceof t?A:new t((function(e){e(A)}))}return new(t||(t=Promise))((function(t,s){function fulfilled(A){try{step(r.next(A))}catch(A){s(A)}}function rejected(A){try{step(r["throw"](A))}catch(A){s(A)}}function step(A){A.done?t(A.value):adopt(A.value).then(fulfilled,rejected)}step((r=r.apply(A,e||[])).next())}))};Object.defineProperty(e,"__esModule",{value:true});e.platform=e.toPlatformPath=e.toWin32Path=e.toPosixPath=e.markdownSummary=e.summary=e.getIDToken=e.getState=e.saveState=e.group=e.endGroup=e.startGroup=e.info=e.notice=e.warning=e.error=e.debug=e.isDebug=e.setFailed=e.setCommandEcho=e.setOutput=e.getBooleanInput=e.getMultilineInput=e.getInput=e.addPath=e.setSecret=e.exportVariable=e.ExitCode=void 0;const i=t(4914);const a=t(4753);const E=t(302);const g=o(t(857));const c=o(t(6928));const Q=t(5306);var C;(function(A){A[A["Success"]=0]="Success";A[A["Failure"]=1]="Failure"})(C||(e.ExitCode=C={}));function exportVariable(A,e){const t=(0,E.toCommandValue)(e);process.env[A]=t;const r=process.env["GITHUB_ENV"]||"";if(r){return(0,a.issueFileCommand)("ENV",(0,a.prepareKeyValueMessage)(A,e))}(0,i.issueCommand)("set-env",{name:A},t)}e.exportVariable=exportVariable;function setSecret(A){(0,i.issueCommand)("add-mask",{},A)}e.setSecret=setSecret;function addPath(A){const e=process.env["GITHUB_PATH"]||"";if(e){(0,a.issueFileCommand)("PATH",A)}else{(0,i.issueCommand)("add-path",{},A)}process.env["PATH"]=`${A}${c.delimiter}${process.env["PATH"]}`}e.addPath=addPath;function getInput(A,e){const t=process.env[`INPUT_${A.replace(/ /g,"_").toUpperCase()}`]||"";if(e&&e.required&&!t){throw new Error(`Input required and not supplied: ${A}`)}if(e&&e.trimWhitespace===false){return t}return t.trim()}e.getInput=getInput;function getMultilineInput(A,e){const t=getInput(A,e).split("\n").filter((A=>A!==""));if(e&&e.trimWhitespace===false){return t}return t.map((A=>A.trim()))}e.getMultilineInput=getMultilineInput;function getBooleanInput(A,e){const t=["true","True","TRUE"];const r=["false","False","FALSE"];const s=getInput(A,e);if(t.includes(s))return true;if(r.includes(s))return false;throw new TypeError(`Input does not meet YAML 1.2 "Core Schema" specification: ${A}\n`+`Support boolean input list: \`true | True | TRUE | false | False | FALSE\``)}e.getBooleanInput=getBooleanInput;function setOutput(A,e){const t=process.env["GITHUB_OUTPUT"]||"";if(t){return(0,a.issueFileCommand)("OUTPUT",(0,a.prepareKeyValueMessage)(A,e))}process.stdout.write(g.EOL);(0,i.issueCommand)("set-output",{name:A},(0,E.toCommandValue)(e))}e.setOutput=setOutput;function setCommandEcho(A){(0,i.issue)("echo",A?"on":"off")}e.setCommandEcho=setCommandEcho;function setFailed(A){process.exitCode=C.Failure;error(A)}e.setFailed=setFailed;function isDebug(){return process.env["RUNNER_DEBUG"]==="1"}e.isDebug=isDebug;function debug(A){(0,i.issueCommand)("debug",{},A)}e.debug=debug;function error(A,e={}){(0,i.issueCommand)("error",(0,E.toCommandProperties)(e),A instanceof Error?A.toString():A)}e.error=error;function warning(A,e={}){(0,i.issueCommand)("warning",(0,E.toCommandProperties)(e),A instanceof Error?A.toString():A)}e.warning=warning;function notice(A,e={}){(0,i.issueCommand)("notice",(0,E.toCommandProperties)(e),A instanceof Error?A.toString():A)}e.notice=notice;function info(A){process.stdout.write(A+g.EOL)}e.info=info;function startGroup(A){(0,i.issue)("group",A)}e.startGroup=startGroup;function endGroup(){(0,i.issue)("endgroup")}e.endGroup=endGroup;function group(A,e){return n(this,void 0,void 0,(function*(){startGroup(A);let t;try{t=yield e()}finally{endGroup()}return t}))}e.group=group;function saveState(A,e){const t=process.env["GITHUB_STATE"]||"";if(t){return(0,a.issueFileCommand)("STATE",(0,a.prepareKeyValueMessage)(A,e))}(0,i.issueCommand)("save-state",{name:A},(0,E.toCommandValue)(e))}e.saveState=saveState;function getState(A){return process.env[`STATE_${A}`]||""}e.getState=getState;function getIDToken(A){return n(this,void 0,void 0,(function*(){return yield Q.OidcClient.getIDToken(A)}))}e.getIDToken=getIDToken;var B=t(1847);Object.defineProperty(e,"summary",{enumerable:true,get:function(){return B.summary}});var I=t(1847);Object.defineProperty(e,"markdownSummary",{enumerable:true,get:function(){return I.markdownSummary}});var h=t(1976);Object.defineProperty(e,"toPosixPath",{enumerable:true,get:function(){return h.toPosixPath}});Object.defineProperty(e,"toWin32Path",{enumerable:true,get:function(){return h.toWin32Path}});Object.defineProperty(e,"toPlatformPath",{enumerable:true,get:function(){return h.toPlatformPath}});e.platform=o(t(8968))},4753:function(A,e,t){"use strict";var r=this&&this.__createBinding||(Object.create?function(A,e,t,r){if(r===undefined)r=t;var s=Object.getOwnPropertyDescriptor(e,t);if(!s||("get"in s?!e.__esModule:s.writable||s.configurable)){s={enumerable:true,get:function(){return e[t]}}}Object.defineProperty(A,r,s)}:function(A,e,t,r){if(r===undefined)r=t;A[r]=e[t]});var s=this&&this.__setModuleDefault||(Object.create?function(A,e){Object.defineProperty(A,"default",{enumerable:true,value:e})}:function(A,e){A["default"]=e});var o=this&&this.__importStar||function(A){if(A&&A.__esModule)return A;var e={};if(A!=null)for(var t in A)if(t!=="default"&&Object.prototype.hasOwnProperty.call(A,t))r(e,A,t);s(e,A);return e};Object.defineProperty(e,"__esModule",{value:true});e.prepareKeyValueMessage=e.issueFileCommand=void 0;const n=o(t(9896));const i=o(t(857));const a=t(302);function issueFileCommand(A,e){const t=process.env[`GITHUB_${A}`];if(!t){throw new Error(`Unable to find environment variable for file command ${A}`)}if(!n.existsSync(t)){throw new Error(`Missing file at path: ${t}`)}n.appendFileSync(t,`${(0,a.toCommandValue)(e)}${i.EOL}`,{encoding:"utf8"})}e.issueFileCommand=issueFileCommand;function prepareKeyValueMessage(A,e){const t=`ghadelimiter_${crypto.randomUUID()}`;const r=(0,a.toCommandValue)(e);if(A.includes(t)){throw new Error(`Unexpected input: name should not contain the delimiter "${t}"`)}if(r.includes(t)){throw new Error(`Unexpected input: value should not contain the delimiter "${t}"`)}return`${A}<<${t}${i.EOL}${r}${i.EOL}${t}`}e.prepareKeyValueMessage=prepareKeyValueMessage},5306:function(A,e,t){"use strict";var r=this&&this.__awaiter||function(A,e,t,r){function adopt(A){return A instanceof t?A:new t((function(e){e(A)}))}return new(t||(t=Promise))((function(t,s){function fulfilled(A){try{step(r.next(A))}catch(A){s(A)}}function rejected(A){try{step(r["throw"](A))}catch(A){s(A)}}function step(A){A.done?t(A.value):adopt(A.value).then(fulfilled,rejected)}step((r=r.apply(A,e||[])).next())}))};Object.defineProperty(e,"__esModule",{value:true});e.OidcClient=void 0;const s=t(4844);const o=t(4552);const n=t(7484);class OidcClient{static createHttpClient(A=true,e=10){const t={allowRetries:A,maxRetries:e};return new s.HttpClient("actions/oidc-client",[new o.BearerCredentialHandler(OidcClient.getRequestToken())],t)}static getRequestToken(){const A=process.env["ACTIONS_ID_TOKEN_REQUEST_TOKEN"];if(!A){throw new Error("Unable to get ACTIONS_ID_TOKEN_REQUEST_TOKEN env variable")}return A}static getIDTokenUrl(){const A=process.env["ACTIONS_ID_TOKEN_REQUEST_URL"];if(!A){throw new Error("Unable to get ACTIONS_ID_TOKEN_REQUEST_URL env variable")}return A}static getCall(A){var e;return r(this,void 0,void 0,(function*(){const t=OidcClient.createHttpClient();const r=yield t.getJson(A).catch((A=>{throw new Error(`Failed to get ID Token. \n \n Error Code : ${A.statusCode}\n \n Error Message: ${A.message}`)}));const s=(e=r.result)===null||e===void 0?void 0:e.value;if(!s){throw new Error("Response json body do not have ID Token field")}return s}))}static getIDToken(A){return r(this,void 0,void 0,(function*(){try{let e=OidcClient.getIDTokenUrl();if(A){const t=encodeURIComponent(A);e=`${e}&audience=${t}`}(0,n.debug)(`ID token url is ${e}`);const t=yield OidcClient.getCall(e);(0,n.setSecret)(t);return t}catch(A){throw new Error(`Error message: ${A.message}`)}}))}}e.OidcClient=OidcClient},1976:function(A,e,t){"use strict";var r=this&&this.__createBinding||(Object.create?function(A,e,t,r){if(r===undefined)r=t;var s=Object.getOwnPropertyDescriptor(e,t);if(!s||("get"in s?!e.__esModule:s.writable||s.configurable)){s={enumerable:true,get:function(){return e[t]}}}Object.defineProperty(A,r,s)}:function(A,e,t,r){if(r===undefined)r=t;A[r]=e[t]});var s=this&&this.__setModuleDefault||(Object.create?function(A,e){Object.defineProperty(A,"default",{enumerable:true,value:e})}:function(A,e){A["default"]=e});var o=this&&this.__importStar||function(A){if(A&&A.__esModule)return A;var e={};if(A!=null)for(var t in A)if(t!=="default"&&Object.prototype.hasOwnProperty.call(A,t))r(e,A,t);s(e,A);return e};Object.defineProperty(e,"__esModule",{value:true});e.toPlatformPath=e.toWin32Path=e.toPosixPath=void 0;const n=o(t(6928));function toPosixPath(A){return A.replace(/[\\]/g,"/")}e.toPosixPath=toPosixPath;function toWin32Path(A){return A.replace(/[/]/g,"\\")}e.toWin32Path=toWin32Path;function toPlatformPath(A){return A.replace(/[/\\]/g,n.sep)}e.toPlatformPath=toPlatformPath},8968:function(A,e,t){"use strict";var r=this&&this.__createBinding||(Object.create?function(A,e,t,r){if(r===undefined)r=t;var s=Object.getOwnPropertyDescriptor(e,t);if(!s||("get"in s?!e.__esModule:s.writable||s.configurable)){s={enumerable:true,get:function(){return e[t]}}}Object.defineProperty(A,r,s)}:function(A,e,t,r){if(r===undefined)r=t;A[r]=e[t]});var s=this&&this.__setModuleDefault||(Object.create?function(A,e){Object.defineProperty(A,"default",{enumerable:true,value:e})}:function(A,e){A["default"]=e});var o=this&&this.__importStar||function(A){if(A&&A.__esModule)return A;var e={};if(A!=null)for(var t in A)if(t!=="default"&&Object.prototype.hasOwnProperty.call(A,t))r(e,A,t);s(e,A);return e};var n=this&&this.__awaiter||function(A,e,t,r){function adopt(A){return A instanceof t?A:new t((function(e){e(A)}))}return new(t||(t=Promise))((function(t,s){function fulfilled(A){try{step(r.next(A))}catch(A){s(A)}}function rejected(A){try{step(r["throw"](A))}catch(A){s(A)}}function step(A){A.done?t(A.value):adopt(A.value).then(fulfilled,rejected)}step((r=r.apply(A,e||[])).next())}))};var i=this&&this.__importDefault||function(A){return A&&A.__esModule?A:{default:A}};Object.defineProperty(e,"__esModule",{value:true});e.getDetails=e.isLinux=e.isMacOS=e.isWindows=e.arch=e.platform=void 0;const a=i(t(857));const E=o(t(5236));const getWindowsInfo=()=>n(void 0,void 0,void 0,(function*(){const{stdout:A}=yield E.getExecOutput('powershell -command "(Get-CimInstance -ClassName Win32_OperatingSystem).Version"',undefined,{silent:true});const{stdout:e}=yield E.getExecOutput('powershell -command "(Get-CimInstance -ClassName Win32_OperatingSystem).Caption"',undefined,{silent:true});return{name:e.trim(),version:A.trim()}}));const getMacOsInfo=()=>n(void 0,void 0,void 0,(function*(){var A,e,t,r;const{stdout:s}=yield E.getExecOutput("sw_vers",undefined,{silent:true});const o=(e=(A=s.match(/ProductVersion:\s*(.+)/))===null||A===void 0?void 0:A[1])!==null&&e!==void 0?e:"";const n=(r=(t=s.match(/ProductName:\s*(.+)/))===null||t===void 0?void 0:t[1])!==null&&r!==void 0?r:"";return{name:n,version:o}}));const getLinuxInfo=()=>n(void 0,void 0,void 0,(function*(){const{stdout:A}=yield E.getExecOutput("lsb_release",["-i","-r","-s"],{silent:true});const[e,t]=A.trim().split("\n");return{name:e,version:t}}));e.platform=a.default.platform();e.arch=a.default.arch();e.isWindows=e.platform==="win32";e.isMacOS=e.platform==="darwin";e.isLinux=e.platform==="linux";function getDetails(){return n(this,void 0,void 0,(function*(){return Object.assign(Object.assign({},yield e.isWindows?getWindowsInfo():e.isMacOS?getMacOsInfo():getLinuxInfo()),{platform:e.platform,arch:e.arch,isWindows:e.isWindows,isMacOS:e.isMacOS,isLinux:e.isLinux})}))}e.getDetails=getDetails},1847:function(A,e,t){"use strict";var r=this&&this.__awaiter||function(A,e,t,r){function adopt(A){return A instanceof t?A:new t((function(e){e(A)}))}return new(t||(t=Promise))((function(t,s){function fulfilled(A){try{step(r.next(A))}catch(A){s(A)}}function rejected(A){try{step(r["throw"](A))}catch(A){s(A)}}function step(A){A.done?t(A.value):adopt(A.value).then(fulfilled,rejected)}step((r=r.apply(A,e||[])).next())}))};Object.defineProperty(e,"__esModule",{value:true});e.summary=e.markdownSummary=e.SUMMARY_DOCS_URL=e.SUMMARY_ENV_VAR=void 0;const s=t(857);const o=t(9896);const{access:n,appendFile:i,writeFile:a}=o.promises;e.SUMMARY_ENV_VAR="GITHUB_STEP_SUMMARY";e.SUMMARY_DOCS_URL="https://docs.github.com/actions/using-workflows/workflow-commands-for-github-actions#adding-a-job-summary";class Summary{constructor(){this._buffer=""}filePath(){return r(this,void 0,void 0,(function*(){if(this._filePath){return this._filePath}const A=process.env[e.SUMMARY_ENV_VAR];if(!A){throw new Error(`Unable to find environment variable for $${e.SUMMARY_ENV_VAR}. Check if your runtime environment supports job summaries.`)}try{yield n(A,o.constants.R_OK|o.constants.W_OK)}catch(e){throw new Error(`Unable to access summary file: '${A}'. Check if the file has correct read/write permissions.`)}this._filePath=A;return this._filePath}))}wrap(A,e,t={}){const r=Object.entries(t).map((([A,e])=>` ${A}="${e}"`)).join("");if(!e){return`<${A}${r}>`}return`<${A}${r}>${e}`}write(A){return r(this,void 0,void 0,(function*(){const e=!!(A===null||A===void 0?void 0:A.overwrite);const t=yield this.filePath();const r=e?a:i;yield r(t,this._buffer,{encoding:"utf8"});return this.emptyBuffer()}))}clear(){return r(this,void 0,void 0,(function*(){return this.emptyBuffer().write({overwrite:true})}))}stringify(){return this._buffer}isEmptyBuffer(){return this._buffer.length===0}emptyBuffer(){this._buffer="";return this}addRaw(A,e=false){this._buffer+=A;return e?this.addEOL():this}addEOL(){return this.addRaw(s.EOL)}addCodeBlock(A,e){const t=Object.assign({},e&&{lang:e});const r=this.wrap("pre",this.wrap("code",A),t);return this.addRaw(r).addEOL()}addList(A,e=false){const t=e?"ol":"ul";const r=A.map((A=>this.wrap("li",A))).join("");const s=this.wrap(t,r);return this.addRaw(s).addEOL()}addTable(A){const e=A.map((A=>{const e=A.map((A=>{if(typeof A==="string"){return this.wrap("td",A)}const{header:e,data:t,colspan:r,rowspan:s}=A;const o=e?"th":"td";const n=Object.assign(Object.assign({},r&&{colspan:r}),s&&{rowspan:s});return this.wrap(o,t,n)})).join("");return this.wrap("tr",e)})).join("");const t=this.wrap("table",e);return this.addRaw(t).addEOL()}addDetails(A,e){const t=this.wrap("details",this.wrap("summary",A)+e);return this.addRaw(t).addEOL()}addImage(A,e,t){const{width:r,height:s}=t||{};const o=Object.assign(Object.assign({},r&&{width:r}),s&&{height:s});const n=this.wrap("img",null,Object.assign({src:A,alt:e},o));return this.addRaw(n).addEOL()}addHeading(A,e){const t=`h${e}`;const r=["h1","h2","h3","h4","h5","h6"].includes(t)?t:"h1";const s=this.wrap(r,A);return this.addRaw(s).addEOL()}addSeparator(){const A=this.wrap("hr",null);return this.addRaw(A).addEOL()}addBreak(){const A=this.wrap("br",null);return this.addRaw(A).addEOL()}addQuote(A,e){const t=Object.assign({},e&&{cite:e});const r=this.wrap("blockquote",A,t);return this.addRaw(r).addEOL()}addLink(A,e){const t=this.wrap("a",A,{href:e});return this.addRaw(t).addEOL()}}const E=new Summary;e.markdownSummary=E;e.summary=E},302:(A,e)=>{"use strict";Object.defineProperty(e,"__esModule",{value:true});e.toCommandProperties=e.toCommandValue=void 0;function toCommandValue(A){if(A===null||A===undefined){return""}else if(typeof A==="string"||A instanceof String){return A}return JSON.stringify(A)}e.toCommandValue=toCommandValue;function toCommandProperties(A){if(!Object.keys(A).length){return{}}return{title:A.title,file:A.file,line:A.startLine,endLine:A.endLine,col:A.startColumn,endColumn:A.endColumn}}e.toCommandProperties=toCommandProperties},5236:function(A,e,t){"use strict";var r=this&&this.__createBinding||(Object.create?function(A,e,t,r){if(r===undefined)r=t;Object.defineProperty(A,r,{enumerable:true,get:function(){return e[t]}})}:function(A,e,t,r){if(r===undefined)r=t;A[r]=e[t]});var s=this&&this.__setModuleDefault||(Object.create?function(A,e){Object.defineProperty(A,"default",{enumerable:true,value:e})}:function(A,e){A["default"]=e});var o=this&&this.__importStar||function(A){if(A&&A.__esModule)return A;var e={};if(A!=null)for(var t in A)if(t!=="default"&&Object.hasOwnProperty.call(A,t))r(e,A,t);s(e,A);return e};var n=this&&this.__awaiter||function(A,e,t,r){function adopt(A){return A instanceof t?A:new t((function(e){e(A)}))}return new(t||(t=Promise))((function(t,s){function fulfilled(A){try{step(r.next(A))}catch(A){s(A)}}function rejected(A){try{step(r["throw"](A))}catch(A){s(A)}}function step(A){A.done?t(A.value):adopt(A.value).then(fulfilled,rejected)}step((r=r.apply(A,e||[])).next())}))};Object.defineProperty(e,"__esModule",{value:true});e.getExecOutput=e.exec=void 0;const i=t(3193);const a=o(t(6665));function exec(A,e,t){return n(this,void 0,void 0,(function*(){const r=a.argStringToArray(A);if(r.length===0){throw new Error(`Parameter 'commandLine' cannot be null or empty.`)}const s=r[0];e=r.slice(1).concat(e||[]);const o=new a.ToolRunner(s,e,t);return o.exec()}))}e.exec=exec;function getExecOutput(A,e,t){var r,s;return n(this,void 0,void 0,(function*(){let o="";let n="";const a=new i.StringDecoder("utf8");const E=new i.StringDecoder("utf8");const g=(r=t===null||t===void 0?void 0:t.listeners)===null||r===void 0?void 0:r.stdout;const c=(s=t===null||t===void 0?void 0:t.listeners)===null||s===void 0?void 0:s.stderr;const stdErrListener=A=>{n+=E.write(A);if(c){c(A)}};const stdOutListener=A=>{o+=a.write(A);if(g){g(A)}};const Q=Object.assign(Object.assign({},t===null||t===void 0?void 0:t.listeners),{stdout:stdOutListener,stderr:stdErrListener});const C=yield exec(A,e,Object.assign(Object.assign({},t),{listeners:Q}));o+=a.end();n+=E.end();return{exitCode:C,stdout:o,stderr:n}}))}e.getExecOutput=getExecOutput},6665:function(A,e,t){"use strict";var r=this&&this.__createBinding||(Object.create?function(A,e,t,r){if(r===undefined)r=t;Object.defineProperty(A,r,{enumerable:true,get:function(){return e[t]}})}:function(A,e,t,r){if(r===undefined)r=t;A[r]=e[t]});var s=this&&this.__setModuleDefault||(Object.create?function(A,e){Object.defineProperty(A,"default",{enumerable:true,value:e})}:function(A,e){A["default"]=e});var o=this&&this.__importStar||function(A){if(A&&A.__esModule)return A;var e={};if(A!=null)for(var t in A)if(t!=="default"&&Object.hasOwnProperty.call(A,t))r(e,A,t);s(e,A);return e};var n=this&&this.__awaiter||function(A,e,t,r){function adopt(A){return A instanceof t?A:new t((function(e){e(A)}))}return new(t||(t=Promise))((function(t,s){function fulfilled(A){try{step(r.next(A))}catch(A){s(A)}}function rejected(A){try{step(r["throw"](A))}catch(A){s(A)}}function step(A){A.done?t(A.value):adopt(A.value).then(fulfilled,rejected)}step((r=r.apply(A,e||[])).next())}))};Object.defineProperty(e,"__esModule",{value:true});e.argStringToArray=e.ToolRunner=void 0;const i=o(t(857));const a=o(t(4434));const E=o(t(5317));const g=o(t(6928));const c=o(t(4994));const Q=o(t(5207));const C=t(3557);const B=process.platform==="win32";class ToolRunner extends a.EventEmitter{constructor(A,e,t){super();if(!A){throw new Error("Parameter 'toolPath' cannot be null or empty.")}this.toolPath=A;this.args=e||[];this.options=t||{}}_debug(A){if(this.options.listeners&&this.options.listeners.debug){this.options.listeners.debug(A)}}_getCommandString(A,e){const t=this._getSpawnFileName();const r=this._getSpawnArgs(A);let s=e?"":"[command]";if(B){if(this._isCmdFile()){s+=t;for(const A of r){s+=` ${A}`}}else if(A.windowsVerbatimArguments){s+=`"${t}"`;for(const A of r){s+=` ${A}`}}else{s+=this._windowsQuoteCmdArg(t);for(const A of r){s+=` ${this._windowsQuoteCmdArg(A)}`}}}else{s+=t;for(const A of r){s+=` ${A}`}}return s}_processLineBuffer(A,e,t){try{let r=e+A.toString();let s=r.indexOf(i.EOL);while(s>-1){const A=r.substring(0,s);t(A);r=r.substring(s+i.EOL.length);s=r.indexOf(i.EOL)}return r}catch(A){this._debug(`error processing line. Failed with error ${A}`);return""}}_getSpawnFileName(){if(B){if(this._isCmdFile()){return process.env["COMSPEC"]||"cmd.exe"}}return this.toolPath}_getSpawnArgs(A){if(B){if(this._isCmdFile()){let e=`/D /S /C "${this._windowsQuoteCmdArg(this.toolPath)}`;for(const t of this.args){e+=" ";e+=A.windowsVerbatimArguments?t:this._windowsQuoteCmdArg(t)}e+='"';return[e]}}return this.args}_endsWith(A,e){return A.endsWith(e)}_isCmdFile(){const A=this.toolPath.toUpperCase();return this._endsWith(A,".CMD")||this._endsWith(A,".BAT")}_windowsQuoteCmdArg(A){if(!this._isCmdFile()){return this._uvQuoteCmdArg(A)}if(!A){return'""'}const e=[" ","\t","&","(",")","[","]","{","}","^","=",";","!","'","+",",","`","~","|","<",">",'"'];let t=false;for(const r of A){if(e.some((A=>A===r))){t=true;break}}if(!t){return A}let r='"';let s=true;for(let e=A.length;e>0;e--){r+=A[e-1];if(s&&A[e-1]==="\\"){r+="\\"}else if(A[e-1]==='"'){s=true;r+='"'}else{s=false}}r+='"';return r.split("").reverse().join("")}_uvQuoteCmdArg(A){if(!A){return'""'}if(!A.includes(" ")&&!A.includes("\t")&&!A.includes('"')){return A}if(!A.includes('"')&&!A.includes("\\")){return`"${A}"`}let e='"';let t=true;for(let r=A.length;r>0;r--){e+=A[r-1];if(t&&A[r-1]==="\\"){e+="\\"}else if(A[r-1]==='"'){t=true;e+="\\"}else{t=false}}e+='"';return e.split("").reverse().join("")}_cloneExecOptions(A){A=A||{};const e={cwd:A.cwd||process.cwd(),env:A.env||process.env,silent:A.silent||false,windowsVerbatimArguments:A.windowsVerbatimArguments||false,failOnStdErr:A.failOnStdErr||false,ignoreReturnCode:A.ignoreReturnCode||false,delay:A.delay||1e4};e.outStream=A.outStream||process.stdout;e.errStream=A.errStream||process.stderr;return e}_getSpawnOptions(A,e){A=A||{};const t={};t.cwd=A.cwd;t.env=A.env;t["windowsVerbatimArguments"]=A.windowsVerbatimArguments||this._isCmdFile();if(A.windowsVerbatimArguments){t.argv0=`"${e}"`}return t}exec(){return n(this,void 0,void 0,(function*(){if(!Q.isRooted(this.toolPath)&&(this.toolPath.includes("/")||B&&this.toolPath.includes("\\"))){this.toolPath=g.resolve(process.cwd(),this.options.cwd||process.cwd(),this.toolPath)}this.toolPath=yield c.which(this.toolPath,true);return new Promise(((A,e)=>n(this,void 0,void 0,(function*(){this._debug(`exec tool: ${this.toolPath}`);this._debug("arguments:");for(const A of this.args){this._debug(` ${A}`)}const t=this._cloneExecOptions(this.options);if(!t.silent&&t.outStream){t.outStream.write(this._getCommandString(t)+i.EOL)}const r=new ExecState(t,this.toolPath);r.on("debug",(A=>{this._debug(A)}));if(this.options.cwd&&!(yield Q.exists(this.options.cwd))){return e(new Error(`The cwd: ${this.options.cwd} does not exist!`))}const s=this._getSpawnFileName();const o=E.spawn(s,this._getSpawnArgs(t),this._getSpawnOptions(this.options,s));let n="";if(o.stdout){o.stdout.on("data",(A=>{if(this.options.listeners&&this.options.listeners.stdout){this.options.listeners.stdout(A)}if(!t.silent&&t.outStream){t.outStream.write(A)}n=this._processLineBuffer(A,n,(A=>{if(this.options.listeners&&this.options.listeners.stdline){this.options.listeners.stdline(A)}}))}))}let a="";if(o.stderr){o.stderr.on("data",(A=>{r.processStderr=true;if(this.options.listeners&&this.options.listeners.stderr){this.options.listeners.stderr(A)}if(!t.silent&&t.errStream&&t.outStream){const e=t.failOnStdErr?t.errStream:t.outStream;e.write(A)}a=this._processLineBuffer(A,a,(A=>{if(this.options.listeners&&this.options.listeners.errline){this.options.listeners.errline(A)}}))}))}o.on("error",(A=>{r.processError=A.message;r.processExited=true;r.processClosed=true;r.CheckComplete()}));o.on("exit",(A=>{r.processExitCode=A;r.processExited=true;this._debug(`Exit code ${A} received from tool '${this.toolPath}'`);r.CheckComplete()}));o.on("close",(A=>{r.processExitCode=A;r.processExited=true;r.processClosed=true;this._debug(`STDIO streams have closed for tool '${this.toolPath}'`);r.CheckComplete()}));r.on("done",((t,r)=>{if(n.length>0){this.emit("stdline",n)}if(a.length>0){this.emit("errline",a)}o.removeAllListeners();if(t){e(t)}else{A(r)}}));if(this.options.input){if(!o.stdin){throw new Error("child process missing stdin")}o.stdin.end(this.options.input)}}))))}))}}e.ToolRunner=ToolRunner;function argStringToArray(A){const e=[];let t=false;let r=false;let s="";function append(A){if(r&&A!=='"'){s+="\\"}s+=A;r=false}for(let o=0;o0){e.push(s);s=""}continue}append(n)}if(s.length>0){e.push(s.trim())}return e}e.argStringToArray=argStringToArray;class ExecState extends a.EventEmitter{constructor(A,e){super();this.processClosed=false;this.processError="";this.processExitCode=0;this.processExited=false;this.processStderr=false;this.delay=1e4;this.done=false;this.timeout=null;if(!e){throw new Error("toolPath must not be empty")}this.options=A;this.toolPath=e;if(A.delay){this.delay=A.delay}}CheckComplete(){if(this.done){return}if(this.processClosed){this._setResult()}else if(this.processExited){this.timeout=C.setTimeout(ExecState.HandleTimeout,this.delay,this)}}_debug(A){this.emit("debug",A)}_setResult(){let A;if(this.processExited){if(this.processError){A=new Error(`There was an error when attempting to execute the process '${this.toolPath}'. This may indicate the process failed to start. Error: ${this.processError}`)}else if(this.processExitCode!==0&&!this.options.ignoreReturnCode){A=new Error(`The process '${this.toolPath}' failed with exit code ${this.processExitCode}`)}else if(this.processStderr&&this.options.failOnStdErr){A=new Error(`The process '${this.toolPath}' failed because one or more lines were written to the STDERR stream`)}}if(this.timeout){clearTimeout(this.timeout);this.timeout=null}this.done=true;this.emit("done",A,this.processExitCode)}static HandleTimeout(A){if(A.done){return}if(!A.processClosed&&A.processExited){const e=`The STDIO streams did not close within ${A.delay/1e3} seconds of the exit event from process '${A.toolPath}'. This may indicate a child process inherited the STDIO streams and has not yet exited.`;A._debug(e)}A._setResult()}}},4552:function(A,e){"use strict";var t=this&&this.__awaiter||function(A,e,t,r){function adopt(A){return A instanceof t?A:new t((function(e){e(A)}))}return new(t||(t=Promise))((function(t,s){function fulfilled(A){try{step(r.next(A))}catch(A){s(A)}}function rejected(A){try{step(r["throw"](A))}catch(A){s(A)}}function step(A){A.done?t(A.value):adopt(A.value).then(fulfilled,rejected)}step((r=r.apply(A,e||[])).next())}))};Object.defineProperty(e,"__esModule",{value:true});e.PersonalAccessTokenCredentialHandler=e.BearerCredentialHandler=e.BasicCredentialHandler=void 0;class BasicCredentialHandler{constructor(A,e){this.username=A;this.password=e}prepareRequest(A){if(!A.headers){throw Error("The request has no headers")}A.headers["Authorization"]=`Basic ${Buffer.from(`${this.username}:${this.password}`).toString("base64")}`}canHandleAuthentication(){return false}handleAuthentication(){return t(this,void 0,void 0,(function*(){throw new Error("not implemented")}))}}e.BasicCredentialHandler=BasicCredentialHandler;class BearerCredentialHandler{constructor(A){this.token=A}prepareRequest(A){if(!A.headers){throw Error("The request has no headers")}A.headers["Authorization"]=`Bearer ${this.token}`}canHandleAuthentication(){return false}handleAuthentication(){return t(this,void 0,void 0,(function*(){throw new Error("not implemented")}))}}e.BearerCredentialHandler=BearerCredentialHandler;class PersonalAccessTokenCredentialHandler{constructor(A){this.token=A}prepareRequest(A){if(!A.headers){throw Error("The request has no headers")}A.headers["Authorization"]=`Basic ${Buffer.from(`PAT:${this.token}`).toString("base64")}`}canHandleAuthentication(){return false}handleAuthentication(){return t(this,void 0,void 0,(function*(){throw new Error("not implemented")}))}}e.PersonalAccessTokenCredentialHandler=PersonalAccessTokenCredentialHandler},4844:function(A,e,t){"use strict";var r=this&&this.__createBinding||(Object.create?function(A,e,t,r){if(r===undefined)r=t;var s=Object.getOwnPropertyDescriptor(e,t);if(!s||("get"in s?!e.__esModule:s.writable||s.configurable)){s={enumerable:true,get:function(){return e[t]}}}Object.defineProperty(A,r,s)}:function(A,e,t,r){if(r===undefined)r=t;A[r]=e[t]});var s=this&&this.__setModuleDefault||(Object.create?function(A,e){Object.defineProperty(A,"default",{enumerable:true,value:e})}:function(A,e){A["default"]=e});var o=this&&this.__importStar||function(A){if(A&&A.__esModule)return A;var e={};if(A!=null)for(var t in A)if(t!=="default"&&Object.prototype.hasOwnProperty.call(A,t))r(e,A,t);s(e,A);return e};var n=this&&this.__awaiter||function(A,e,t,r){function adopt(A){return A instanceof t?A:new t((function(e){e(A)}))}return new(t||(t=Promise))((function(t,s){function fulfilled(A){try{step(r.next(A))}catch(A){s(A)}}function rejected(A){try{step(r["throw"](A))}catch(A){s(A)}}function step(A){A.done?t(A.value):adopt(A.value).then(fulfilled,rejected)}step((r=r.apply(A,e||[])).next())}))};Object.defineProperty(e,"__esModule",{value:true});e.HttpClient=e.isHttps=e.HttpClientResponse=e.HttpClientError=e.getProxyUrl=e.MediaTypes=e.Headers=e.HttpCodes=void 0;const i=o(t(8611));const a=o(t(5692));const E=o(t(4988));const g=o(t(770));const c=t(6752);var Q;(function(A){A[A["OK"]=200]="OK";A[A["MultipleChoices"]=300]="MultipleChoices";A[A["MovedPermanently"]=301]="MovedPermanently";A[A["ResourceMoved"]=302]="ResourceMoved";A[A["SeeOther"]=303]="SeeOther";A[A["NotModified"]=304]="NotModified";A[A["UseProxy"]=305]="UseProxy";A[A["SwitchProxy"]=306]="SwitchProxy";A[A["TemporaryRedirect"]=307]="TemporaryRedirect";A[A["PermanentRedirect"]=308]="PermanentRedirect";A[A["BadRequest"]=400]="BadRequest";A[A["Unauthorized"]=401]="Unauthorized";A[A["PaymentRequired"]=402]="PaymentRequired";A[A["Forbidden"]=403]="Forbidden";A[A["NotFound"]=404]="NotFound";A[A["MethodNotAllowed"]=405]="MethodNotAllowed";A[A["NotAcceptable"]=406]="NotAcceptable";A[A["ProxyAuthenticationRequired"]=407]="ProxyAuthenticationRequired";A[A["RequestTimeout"]=408]="RequestTimeout";A[A["Conflict"]=409]="Conflict";A[A["Gone"]=410]="Gone";A[A["TooManyRequests"]=429]="TooManyRequests";A[A["InternalServerError"]=500]="InternalServerError";A[A["NotImplemented"]=501]="NotImplemented";A[A["BadGateway"]=502]="BadGateway";A[A["ServiceUnavailable"]=503]="ServiceUnavailable";A[A["GatewayTimeout"]=504]="GatewayTimeout"})(Q||(e.HttpCodes=Q={}));var C;(function(A){A["Accept"]="accept";A["ContentType"]="content-type"})(C||(e.Headers=C={}));var B;(function(A){A["ApplicationJson"]="application/json"})(B||(e.MediaTypes=B={}));function getProxyUrl(A){const e=E.getProxyUrl(new URL(A));return e?e.href:""}e.getProxyUrl=getProxyUrl;const I=[Q.MovedPermanently,Q.ResourceMoved,Q.SeeOther,Q.TemporaryRedirect,Q.PermanentRedirect];const h=[Q.BadGateway,Q.ServiceUnavailable,Q.GatewayTimeout];const l=["OPTIONS","GET","DELETE","HEAD"];const u=10;const d=5;class HttpClientError extends Error{constructor(A,e){super(A);this.name="HttpClientError";this.statusCode=e;Object.setPrototypeOf(this,HttpClientError.prototype)}}e.HttpClientError=HttpClientError;class HttpClientResponse{constructor(A){this.message=A}readBody(){return n(this,void 0,void 0,(function*(){return new Promise((A=>n(this,void 0,void 0,(function*(){let e=Buffer.alloc(0);this.message.on("data",(A=>{e=Buffer.concat([e,A])}));this.message.on("end",(()=>{A(e.toString())}))}))))}))}readBodyBuffer(){return n(this,void 0,void 0,(function*(){return new Promise((A=>n(this,void 0,void 0,(function*(){const e=[];this.message.on("data",(A=>{e.push(A)}));this.message.on("end",(()=>{A(Buffer.concat(e))}))}))))}))}}e.HttpClientResponse=HttpClientResponse;function isHttps(A){const e=new URL(A);return e.protocol==="https:"}e.isHttps=isHttps;class HttpClient{constructor(A,e,t){this._ignoreSslError=false;this._allowRedirects=true;this._allowRedirectDowngrade=false;this._maxRedirects=50;this._allowRetries=false;this._maxRetries=1;this._keepAlive=false;this._disposed=false;this.userAgent=A;this.handlers=e||[];this.requestOptions=t;if(t){if(t.ignoreSslError!=null){this._ignoreSslError=t.ignoreSslError}this._socketTimeout=t.socketTimeout;if(t.allowRedirects!=null){this._allowRedirects=t.allowRedirects}if(t.allowRedirectDowngrade!=null){this._allowRedirectDowngrade=t.allowRedirectDowngrade}if(t.maxRedirects!=null){this._maxRedirects=Math.max(t.maxRedirects,0)}if(t.keepAlive!=null){this._keepAlive=t.keepAlive}if(t.allowRetries!=null){this._allowRetries=t.allowRetries}if(t.maxRetries!=null){this._maxRetries=t.maxRetries}}}options(A,e){return n(this,void 0,void 0,(function*(){return this.request("OPTIONS",A,null,e||{})}))}get(A,e){return n(this,void 0,void 0,(function*(){return this.request("GET",A,null,e||{})}))}del(A,e){return n(this,void 0,void 0,(function*(){return this.request("DELETE",A,null,e||{})}))}post(A,e,t){return n(this,void 0,void 0,(function*(){return this.request("POST",A,e,t||{})}))}patch(A,e,t){return n(this,void 0,void 0,(function*(){return this.request("PATCH",A,e,t||{})}))}put(A,e,t){return n(this,void 0,void 0,(function*(){return this.request("PUT",A,e,t||{})}))}head(A,e){return n(this,void 0,void 0,(function*(){return this.request("HEAD",A,null,e||{})}))}sendStream(A,e,t,r){return n(this,void 0,void 0,(function*(){return this.request(A,e,t,r)}))}getJson(A,e={}){return n(this,void 0,void 0,(function*(){e[C.Accept]=this._getExistingOrDefaultHeader(e,C.Accept,B.ApplicationJson);const t=yield this.get(A,e);return this._processResponse(t,this.requestOptions)}))}postJson(A,e,t={}){return n(this,void 0,void 0,(function*(){const r=JSON.stringify(e,null,2);t[C.Accept]=this._getExistingOrDefaultHeader(t,C.Accept,B.ApplicationJson);t[C.ContentType]=this._getExistingOrDefaultHeader(t,C.ContentType,B.ApplicationJson);const s=yield this.post(A,r,t);return this._processResponse(s,this.requestOptions)}))}putJson(A,e,t={}){return n(this,void 0,void 0,(function*(){const r=JSON.stringify(e,null,2);t[C.Accept]=this._getExistingOrDefaultHeader(t,C.Accept,B.ApplicationJson);t[C.ContentType]=this._getExistingOrDefaultHeader(t,C.ContentType,B.ApplicationJson);const s=yield this.put(A,r,t);return this._processResponse(s,this.requestOptions)}))}patchJson(A,e,t={}){return n(this,void 0,void 0,(function*(){const r=JSON.stringify(e,null,2);t[C.Accept]=this._getExistingOrDefaultHeader(t,C.Accept,B.ApplicationJson);t[C.ContentType]=this._getExistingOrDefaultHeader(t,C.ContentType,B.ApplicationJson);const s=yield this.patch(A,r,t);return this._processResponse(s,this.requestOptions)}))}request(A,e,t,r){return n(this,void 0,void 0,(function*(){if(this._disposed){throw new Error("Client has already been disposed.")}const s=new URL(e);let o=this._prepareRequest(A,s,r);const n=this._allowRetries&&l.includes(A)?this._maxRetries+1:1;let i=0;let a;do{a=yield this.requestRaw(o,t);if(a&&a.message&&a.message.statusCode===Q.Unauthorized){let A;for(const e of this.handlers){if(e.canHandleAuthentication(a)){A=e;break}}if(A){return A.handleAuthentication(this,o,t)}else{return a}}let e=this._maxRedirects;while(a.message.statusCode&&I.includes(a.message.statusCode)&&this._allowRedirects&&e>0){const n=a.message.headers["location"];if(!n){break}const i=new URL(n);if(s.protocol==="https:"&&s.protocol!==i.protocol&&!this._allowRedirectDowngrade){throw new Error("Redirect from HTTPS to HTTP protocol. This downgrade is not allowed for security reasons. If you want to allow this behavior, set the allowRedirectDowngrade option to true.")}yield a.readBody();if(i.hostname!==s.hostname){for(const A in r){if(A.toLowerCase()==="authorization"){delete r[A]}}}o=this._prepareRequest(A,i,r);a=yield this.requestRaw(o,t);e--}if(!a.message.statusCode||!h.includes(a.message.statusCode)){return a}i+=1;if(i{function callbackForResult(A,e){if(A){r(A)}else if(!e){r(new Error("Unknown error"))}else{t(e)}}this.requestRawWithCallback(A,e,callbackForResult)}))}))}requestRawWithCallback(A,e,t){if(typeof e==="string"){if(!A.options.headers){A.options.headers={}}A.options.headers["Content-Length"]=Buffer.byteLength(e,"utf8")}let r=false;function handleResult(A,e){if(!r){r=true;t(A,e)}}const s=A.httpModule.request(A.options,(A=>{const e=new HttpClientResponse(A);handleResult(undefined,e)}));let o;s.on("socket",(A=>{o=A}));s.setTimeout(this._socketTimeout||3*6e4,(()=>{if(o){o.end()}handleResult(new Error(`Request timeout: ${A.options.path}`))}));s.on("error",(function(A){handleResult(A)}));if(e&&typeof e==="string"){s.write(e,"utf8")}if(e&&typeof e!=="string"){e.on("close",(function(){s.end()}));e.pipe(s)}else{s.end()}}getAgent(A){const e=new URL(A);return this._getAgent(e)}getAgentDispatcher(A){const e=new URL(A);const t=E.getProxyUrl(e);const r=t&&t.hostname;if(!r){return}return this._getProxyAgentDispatcher(e,t)}_prepareRequest(A,e,t){const r={};r.parsedUrl=e;const s=r.parsedUrl.protocol==="https:";r.httpModule=s?a:i;const o=s?443:80;r.options={};r.options.host=r.parsedUrl.hostname;r.options.port=r.parsedUrl.port?parseInt(r.parsedUrl.port):o;r.options.path=(r.parsedUrl.pathname||"")+(r.parsedUrl.search||"");r.options.method=A;r.options.headers=this._mergeHeaders(t);if(this.userAgent!=null){r.options.headers["user-agent"]=this.userAgent}r.options.agent=this._getAgent(r.parsedUrl);if(this.handlers){for(const A of this.handlers){A.prepareRequest(r.options)}}return r}_mergeHeaders(A){if(this.requestOptions&&this.requestOptions.headers){return Object.assign({},lowercaseKeys(this.requestOptions.headers),lowercaseKeys(A||{}))}return lowercaseKeys(A||{})}_getExistingOrDefaultHeader(A,e,t){let r;if(this.requestOptions&&this.requestOptions.headers){r=lowercaseKeys(this.requestOptions.headers)[e]}return A[e]||r||t}_getAgent(A){let e;const t=E.getProxyUrl(A);const r=t&&t.hostname;if(this._keepAlive&&r){e=this._proxyAgent}if(!r){e=this._agent}if(e){return e}const s=A.protocol==="https:";let o=100;if(this.requestOptions){o=this.requestOptions.maxSockets||i.globalAgent.maxSockets}if(t&&t.hostname){const A={maxSockets:o,keepAlive:this._keepAlive,proxy:Object.assign(Object.assign({},(t.username||t.password)&&{proxyAuth:`${t.username}:${t.password}`}),{host:t.hostname,port:t.port})};let r;const n=t.protocol==="https:";if(s){r=n?g.httpsOverHttps:g.httpsOverHttp}else{r=n?g.httpOverHttps:g.httpOverHttp}e=r(A);this._proxyAgent=e}if(!e){const A={keepAlive:this._keepAlive,maxSockets:o};e=s?new a.Agent(A):new i.Agent(A);this._agent=e}if(s&&this._ignoreSslError){e.options=Object.assign(e.options||{},{rejectUnauthorized:false})}return e}_getProxyAgentDispatcher(A,e){let t;if(this._keepAlive){t=this._proxyAgentDispatcher}if(t){return t}const r=A.protocol==="https:";t=new c.ProxyAgent(Object.assign({uri:e.href,pipelining:!this._keepAlive?0:1},(e.username||e.password)&&{token:`Basic ${Buffer.from(`${e.username}:${e.password}`).toString("base64")}`}));this._proxyAgentDispatcher=t;if(r&&this._ignoreSslError){t.options=Object.assign(t.options.requestTls||{},{rejectUnauthorized:false})}return t}_performExponentialBackoff(A){return n(this,void 0,void 0,(function*(){A=Math.min(u,A);const e=d*Math.pow(2,A);return new Promise((A=>setTimeout((()=>A()),e)))}))}_processResponse(A,e){return n(this,void 0,void 0,(function*(){return new Promise(((t,r)=>n(this,void 0,void 0,(function*(){const s=A.message.statusCode||0;const o={statusCode:s,result:null,headers:{}};if(s===Q.NotFound){t(o)}function dateTimeDeserializer(A,e){if(typeof e==="string"){const A=new Date(e);if(!isNaN(A.valueOf())){return A}}return e}let n;let i;try{i=yield A.readBody();if(i&&i.length>0){if(e&&e.deserializeDates){n=JSON.parse(i,dateTimeDeserializer)}else{n=JSON.parse(i)}o.result=n}o.headers=A.message.headers}catch(A){}if(s>299){let A;if(n&&n.message){A=n.message}else if(i&&i.length>0){A=i}else{A=`Failed request: (${s})`}const e=new HttpClientError(A,s);e.result=o.result;r(e)}else{t(o)}}))))}))}}e.HttpClient=HttpClient;const lowercaseKeys=A=>Object.keys(A).reduce(((e,t)=>(e[t.toLowerCase()]=A[t],e)),{})},4988:(A,e)=>{"use strict";Object.defineProperty(e,"__esModule",{value:true});e.checkBypass=e.getProxyUrl=void 0;function getProxyUrl(A){const e=A.protocol==="https:";if(checkBypass(A)){return undefined}const t=(()=>{if(e){return process.env["https_proxy"]||process.env["HTTPS_PROXY"]}else{return process.env["http_proxy"]||process.env["HTTP_PROXY"]}})();if(t){try{return new DecodedURL(t)}catch(A){if(!t.startsWith("http://")&&!t.startsWith("https://"))return new DecodedURL(`http://${t}`)}}else{return undefined}}e.getProxyUrl=getProxyUrl;function checkBypass(A){if(!A.hostname){return false}const e=A.hostname;if(isLoopbackAddress(e)){return true}const t=process.env["no_proxy"]||process.env["NO_PROXY"]||"";if(!t){return false}let r;if(A.port){r=Number(A.port)}else if(A.protocol==="http:"){r=80}else if(A.protocol==="https:"){r=443}const s=[A.hostname.toUpperCase()];if(typeof r==="number"){s.push(`${s[0]}:${r}`)}for(const A of t.split(",").map((A=>A.trim().toUpperCase())).filter((A=>A))){if(A==="*"||s.some((e=>e===A||e.endsWith(`.${A}`)||A.startsWith(".")&&e.endsWith(`${A}`)))){return true}}return false}e.checkBypass=checkBypass;function isLoopbackAddress(A){const e=A.toLowerCase();return e==="localhost"||e.startsWith("127.")||e.startsWith("[::1]")||e.startsWith("[0:0:0:0:0:0:0:1]")}class DecodedURL extends URL{constructor(A,e){super(A,e);this._decodedUsername=decodeURIComponent(super.username);this._decodedPassword=decodeURIComponent(super.password)}get username(){return this._decodedUsername}get password(){return this._decodedPassword}}},5207:function(A,e,t){"use strict";var r=this&&this.__createBinding||(Object.create?function(A,e,t,r){if(r===undefined)r=t;Object.defineProperty(A,r,{enumerable:true,get:function(){return e[t]}})}:function(A,e,t,r){if(r===undefined)r=t;A[r]=e[t]});var s=this&&this.__setModuleDefault||(Object.create?function(A,e){Object.defineProperty(A,"default",{enumerable:true,value:e})}:function(A,e){A["default"]=e});var o=this&&this.__importStar||function(A){if(A&&A.__esModule)return A;var e={};if(A!=null)for(var t in A)if(t!=="default"&&Object.hasOwnProperty.call(A,t))r(e,A,t);s(e,A);return e};var n=this&&this.__awaiter||function(A,e,t,r){function adopt(A){return A instanceof t?A:new t((function(e){e(A)}))}return new(t||(t=Promise))((function(t,s){function fulfilled(A){try{step(r.next(A))}catch(A){s(A)}}function rejected(A){try{step(r["throw"](A))}catch(A){s(A)}}function step(A){A.done?t(A.value):adopt(A.value).then(fulfilled,rejected)}step((r=r.apply(A,e||[])).next())}))};var i;Object.defineProperty(e,"__esModule",{value:true});e.getCmdPath=e.tryGetExecutablePath=e.isRooted=e.isDirectory=e.exists=e.READONLY=e.UV_FS_O_EXLOCK=e.IS_WINDOWS=e.unlink=e.symlink=e.stat=e.rmdir=e.rm=e.rename=e.readlink=e.readdir=e.open=e.mkdir=e.lstat=e.copyFile=e.chmod=void 0;const a=o(t(9896));const E=o(t(6928));i=a.promises,e.chmod=i.chmod,e.copyFile=i.copyFile,e.lstat=i.lstat,e.mkdir=i.mkdir,e.open=i.open,e.readdir=i.readdir,e.readlink=i.readlink,e.rename=i.rename,e.rm=i.rm,e.rmdir=i.rmdir,e.stat=i.stat,e.symlink=i.symlink,e.unlink=i.unlink;e.IS_WINDOWS=process.platform==="win32";e.UV_FS_O_EXLOCK=268435456;e.READONLY=a.constants.O_RDONLY;function exists(A){return n(this,void 0,void 0,(function*(){try{yield e.stat(A)}catch(A){if(A.code==="ENOENT"){return false}throw A}return true}))}e.exists=exists;function isDirectory(A,t=false){return n(this,void 0,void 0,(function*(){const r=t?yield e.stat(A):yield e.lstat(A);return r.isDirectory()}))}e.isDirectory=isDirectory;function isRooted(A){A=normalizeSeparators(A);if(!A){throw new Error('isRooted() parameter "p" cannot be empty')}if(e.IS_WINDOWS){return A.startsWith("\\")||/^[A-Z]:/i.test(A)}return A.startsWith("/")}e.isRooted=isRooted;function tryGetExecutablePath(A,t){return n(this,void 0,void 0,(function*(){let r=undefined;try{r=yield e.stat(A)}catch(e){if(e.code!=="ENOENT"){console.log(`Unexpected error attempting to determine if executable file exists '${A}': ${e}`)}}if(r&&r.isFile()){if(e.IS_WINDOWS){const e=E.extname(A).toUpperCase();if(t.some((A=>A.toUpperCase()===e))){return A}}else{if(isUnixExecutable(r)){return A}}}const s=A;for(const o of t){A=s+o;r=undefined;try{r=yield e.stat(A)}catch(e){if(e.code!=="ENOENT"){console.log(`Unexpected error attempting to determine if executable file exists '${A}': ${e}`)}}if(r&&r.isFile()){if(e.IS_WINDOWS){try{const t=E.dirname(A);const r=E.basename(A).toUpperCase();for(const s of yield e.readdir(t)){if(r===s.toUpperCase()){A=E.join(t,s);break}}}catch(e){console.log(`Unexpected error attempting to determine the actual case of the file '${A}': ${e}`)}return A}else{if(isUnixExecutable(r)){return A}}}}return""}))}e.tryGetExecutablePath=tryGetExecutablePath;function normalizeSeparators(A){A=A||"";if(e.IS_WINDOWS){A=A.replace(/\//g,"\\");return A.replace(/\\\\+/g,"\\")}return A.replace(/\/\/+/g,"/")}function isUnixExecutable(A){return(A.mode&1)>0||(A.mode&8)>0&&A.gid===process.getgid()||(A.mode&64)>0&&A.uid===process.getuid()}function getCmdPath(){var A;return(A=process.env["COMSPEC"])!==null&&A!==void 0?A:`cmd.exe`}e.getCmdPath=getCmdPath},4994:function(A,e,t){"use strict";var r=this&&this.__createBinding||(Object.create?function(A,e,t,r){if(r===undefined)r=t;Object.defineProperty(A,r,{enumerable:true,get:function(){return e[t]}})}:function(A,e,t,r){if(r===undefined)r=t;A[r]=e[t]});var s=this&&this.__setModuleDefault||(Object.create?function(A,e){Object.defineProperty(A,"default",{enumerable:true,value:e})}:function(A,e){A["default"]=e});var o=this&&this.__importStar||function(A){if(A&&A.__esModule)return A;var e={};if(A!=null)for(var t in A)if(t!=="default"&&Object.hasOwnProperty.call(A,t))r(e,A,t);s(e,A);return e};var n=this&&this.__awaiter||function(A,e,t,r){function adopt(A){return A instanceof t?A:new t((function(e){e(A)}))}return new(t||(t=Promise))((function(t,s){function fulfilled(A){try{step(r.next(A))}catch(A){s(A)}}function rejected(A){try{step(r["throw"](A))}catch(A){s(A)}}function step(A){A.done?t(A.value):adopt(A.value).then(fulfilled,rejected)}step((r=r.apply(A,e||[])).next())}))};Object.defineProperty(e,"__esModule",{value:true});e.findInPath=e.which=e.mkdirP=e.rmRF=e.mv=e.cp=void 0;const i=t(2613);const a=o(t(6928));const E=o(t(5207));function cp(A,e,t={}){return n(this,void 0,void 0,(function*(){const{force:r,recursive:s,copySourceDirectory:o}=readCopyOptions(t);const n=(yield E.exists(e))?yield E.stat(e):null;if(n&&n.isFile()&&!r){return}const i=n&&n.isDirectory()&&o?a.join(e,a.basename(A)):e;if(!(yield E.exists(A))){throw new Error(`no such file or directory: ${A}`)}const g=yield E.stat(A);if(g.isDirectory()){if(!s){throw new Error(`Failed to copy. ${A} is a directory, but tried to copy without recursive flag.`)}else{yield cpDirRecursive(A,i,0,r)}}else{if(a.relative(A,i)===""){throw new Error(`'${i}' and '${A}' are the same file`)}yield copyFile(A,i,r)}}))}e.cp=cp;function mv(A,e,t={}){return n(this,void 0,void 0,(function*(){if(yield E.exists(e)){let r=true;if(yield E.isDirectory(e)){e=a.join(e,a.basename(A));r=yield E.exists(e)}if(r){if(t.force==null||t.force){yield rmRF(e)}else{throw new Error("Destination already exists")}}}yield mkdirP(a.dirname(e));yield E.rename(A,e)}))}e.mv=mv;function rmRF(A){return n(this,void 0,void 0,(function*(){if(E.IS_WINDOWS){if(/[*"<>|]/.test(A)){throw new Error('File path must not contain `*`, `"`, `<`, `>` or `|` on Windows')}}try{yield E.rm(A,{force:true,maxRetries:3,recursive:true,retryDelay:300})}catch(A){throw new Error(`File was unable to be removed ${A}`)}}))}e.rmRF=rmRF;function mkdirP(A){return n(this,void 0,void 0,(function*(){i.ok(A,"a path argument must be provided");yield E.mkdir(A,{recursive:true})}))}e.mkdirP=mkdirP;function which(A,e){return n(this,void 0,void 0,(function*(){if(!A){throw new Error("parameter 'tool' is required")}if(e){const e=yield which(A,false);if(!e){if(E.IS_WINDOWS){throw new Error(`Unable to locate executable file: ${A}. Please verify either the file path exists or the file can be found within a directory specified by the PATH environment variable. Also verify the file has a valid extension for an executable file.`)}else{throw new Error(`Unable to locate executable file: ${A}. Please verify either the file path exists or the file can be found within a directory specified by the PATH environment variable. Also check the file mode to verify the file is executable.`)}}return e}const t=yield findInPath(A);if(t&&t.length>0){return t[0]}return""}))}e.which=which;function findInPath(A){return n(this,void 0,void 0,(function*(){if(!A){throw new Error("parameter 'tool' is required")}const e=[];if(E.IS_WINDOWS&&process.env["PATHEXT"]){for(const A of process.env["PATHEXT"].split(a.delimiter)){if(A){e.push(A)}}}if(E.isRooted(A)){const t=yield E.tryGetExecutablePath(A,e);if(t){return[t]}return[]}if(A.includes(a.sep)){return[]}const t=[];if(process.env.PATH){for(const A of process.env.PATH.split(a.delimiter)){if(A){t.push(A)}}}const r=[];for(const s of t){const t=yield E.tryGetExecutablePath(a.join(s,A),e);if(t){r.push(t)}}return r}))}e.findInPath=findInPath;function readCopyOptions(A){const e=A.force==null?true:A.force;const t=Boolean(A.recursive);const r=A.copySourceDirectory==null?true:Boolean(A.copySourceDirectory);return{force:e,recursive:t,copySourceDirectory:r}}function cpDirRecursive(A,e,t,r){return n(this,void 0,void 0,(function*(){if(t>=255)return;t++;yield mkdirP(e);const s=yield E.readdir(A);for(const o of s){const s=`${A}/${o}`;const n=`${e}/${o}`;const i=yield E.lstat(s);if(i.isDirectory()){yield cpDirRecursive(s,n,t,r)}else{yield copyFile(s,n,r)}}yield E.chmod(e,(yield E.stat(A)).mode)}))}function copyFile(A,e,t){return n(this,void 0,void 0,(function*(){if((yield E.lstat(A)).isSymbolicLink()){try{yield E.lstat(e);yield E.unlink(e)}catch(A){if(A.code==="EPERM"){yield E.chmod(e,"0666");yield E.unlink(e)}}const t=yield E.readlink(A);yield E.symlink(t,e,E.IS_WINDOWS?"junction":null)}else if(!(yield E.exists(e))||t){yield E.copyFile(A,e)}}))}},770:(A,e,t)=>{A.exports=t(218)},218:(A,e,t)=>{"use strict";var r=t(9278);var s=t(4756);var o=t(8611);var n=t(5692);var i=t(4434);var a=t(2613);var E=t(9023);e.httpOverHttp=httpOverHttp;e.httpsOverHttp=httpsOverHttp;e.httpOverHttps=httpOverHttps;e.httpsOverHttps=httpsOverHttps;function httpOverHttp(A){var e=new TunnelingAgent(A);e.request=o.request;return e}function httpsOverHttp(A){var e=new TunnelingAgent(A);e.request=o.request;e.createSocket=createSecureSocket;e.defaultPort=443;return e}function httpOverHttps(A){var e=new TunnelingAgent(A);e.request=n.request;return e}function httpsOverHttps(A){var e=new TunnelingAgent(A);e.request=n.request;e.createSocket=createSecureSocket;e.defaultPort=443;return e}function TunnelingAgent(A){var e=this;e.options=A||{};e.proxyOptions=e.options.proxy||{};e.maxSockets=e.options.maxSockets||o.Agent.defaultMaxSockets;e.requests=[];e.sockets=[];e.on("free",(function onFree(A,t,r,s){var o=toOptions(t,r,s);for(var n=0,i=e.requests.length;n=this.maxSockets){s.requests.push(o);return}s.createSocket(o,(function(e){e.on("free",onFree);e.on("close",onCloseOrRemove);e.on("agentRemove",onCloseOrRemove);A.onSocket(e);function onFree(){s.emit("free",e,o)}function onCloseOrRemove(A){s.removeSocket(e);e.removeListener("free",onFree);e.removeListener("close",onCloseOrRemove);e.removeListener("agentRemove",onCloseOrRemove)}}))};TunnelingAgent.prototype.createSocket=function createSocket(A,e){var t=this;var r={};t.sockets.push(r);var s=mergeOptions({},t.proxyOptions,{method:"CONNECT",path:A.host+":"+A.port,agent:false,headers:{host:A.host+":"+A.port}});if(A.localAddress){s.localAddress=A.localAddress}if(s.proxyAuth){s.headers=s.headers||{};s.headers["Proxy-Authorization"]="Basic "+new Buffer(s.proxyAuth).toString("base64")}g("making CONNECT request");var o=t.request(s);o.useChunkedEncodingByDefault=false;o.once("response",onResponse);o.once("upgrade",onUpgrade);o.once("connect",onConnect);o.once("error",onError);o.end();function onResponse(A){A.upgrade=true}function onUpgrade(A,e,t){process.nextTick((function(){onConnect(A,e,t)}))}function onConnect(s,n,i){o.removeAllListeners();n.removeAllListeners();if(s.statusCode!==200){g("tunneling socket could not be established, statusCode=%d",s.statusCode);n.destroy();var a=new Error("tunneling socket could not be established, "+"statusCode="+s.statusCode);a.code="ECONNRESET";A.request.emit("error",a);t.removeSocket(r);return}if(i.length>0){g("got illegal response body from proxy");n.destroy();var a=new Error("got illegal response body from proxy");a.code="ECONNRESET";A.request.emit("error",a);t.removeSocket(r);return}g("tunneling connection has established");t.sockets[t.sockets.indexOf(r)]=n;return e(n)}function onError(e){o.removeAllListeners();g("tunneling socket could not be established, cause=%s\n",e.message,e.stack);var s=new Error("tunneling socket could not be established, "+"cause="+e.message);s.code="ECONNRESET";A.request.emit("error",s);t.removeSocket(r)}};TunnelingAgent.prototype.removeSocket=function removeSocket(A){var e=this.sockets.indexOf(A);if(e===-1){return}this.sockets.splice(e,1);var t=this.requests.shift();if(t){this.createSocket(t,(function(A){t.request.onSocket(A)}))}};function createSecureSocket(A,e){var t=this;TunnelingAgent.prototype.createSocket.call(t,A,(function(r){var o=A.request.getHeader("host");var n=mergeOptions({},t.options,{socket:r,servername:o?o.replace(/:.*$/,""):A.host});var i=s.connect(0,n);t.sockets[t.sockets.indexOf(r)]=i;e(i)}))}function toOptions(A,e,t){if(typeof A==="string"){return{host:A,port:e,localAddress:t}}return A}function mergeOptions(A){for(var e=1,t=arguments.length;e{"use strict";const r=t(6197);const s=t(992);const o=t(8707);const n=t(5076);const i=t(1093);const a=t(9965);const E=t(3440);const{InvalidArgumentError:g}=o;const c=t(6615);const Q=t(9136);const C=t(7365);const B=t(7501);const I=t(4004);const h=t(2429);const l=t(2720);const u=t(3573);const{getGlobalDispatcher:d,setGlobalDispatcher:f}=t(2581);const p=t(8840);const y=t(8299);const R=t(4415);let D;try{t(6982);D=true}catch{D=false}Object.assign(s.prototype,c);A.exports.Dispatcher=s;A.exports.Client=r;A.exports.Pool=n;A.exports.BalancedPool=i;A.exports.Agent=a;A.exports.ProxyAgent=l;A.exports.RetryHandler=u;A.exports.DecoratorHandler=p;A.exports.RedirectHandler=y;A.exports.createRedirectInterceptor=R;A.exports.buildConnector=Q;A.exports.errors=o;function makeDispatcher(A){return(e,t,r)=>{if(typeof t==="function"){r=t;t=null}if(!e||typeof e!=="string"&&typeof e!=="object"&&!(e instanceof URL)){throw new g("invalid url")}if(t!=null&&typeof t!=="object"){throw new g("invalid opts")}if(t&&t.path!=null){if(typeof t.path!=="string"){throw new g("invalid opts.path")}let A=t.path;if(!t.path.startsWith("/")){A=`/${A}`}e=new URL(E.parseOrigin(e).origin+A)}else{if(!t){t=typeof e==="object"?e:{}}e=E.parseURL(e)}const{agent:s,dispatcher:o=d()}=t;if(s){throw new g("unsupported opts.agent. Did you mean opts.client?")}return A.call(o,{...t,origin:e.origin,path:e.search?`${e.pathname}${e.search}`:e.pathname,method:t.method||(t.body?"PUT":"GET")},r)}}A.exports.setGlobalDispatcher=f;A.exports.getGlobalDispatcher=d;if(E.nodeMajor>16||E.nodeMajor===16&&E.nodeMinor>=8){let e=null;A.exports.fetch=async function fetch(A){if(!e){e=t(2315).fetch}try{return await e(...arguments)}catch(A){if(typeof A==="object"){Error.captureStackTrace(A,this)}throw A}};A.exports.Headers=t(6349).Headers;A.exports.Response=t(8676).Response;A.exports.Request=t(5194).Request;A.exports.FormData=t(3073).FormData;A.exports.File=t(3041).File;A.exports.FileReader=t(2160).FileReader;const{setGlobalOrigin:r,getGlobalOrigin:s}=t(5628);A.exports.setGlobalOrigin=r;A.exports.getGlobalOrigin=s;const{CacheStorage:o}=t(4738);const{kConstruct:n}=t(296);A.exports.caches=new o(n)}if(E.nodeMajor>=16){const{deleteCookie:e,getCookies:r,getSetCookies:s,setCookie:o}=t(3168);A.exports.deleteCookie=e;A.exports.getCookies=r;A.exports.getSetCookies=s;A.exports.setCookie=o;const{parseMIMEType:n,serializeAMimeType:i}=t(4322);A.exports.parseMIMEType=n;A.exports.serializeAMimeType=i}if(E.nodeMajor>=18&&D){const{WebSocket:e}=t(5171);A.exports.WebSocket=e}A.exports.request=makeDispatcher(c.request);A.exports.stream=makeDispatcher(c.stream);A.exports.pipeline=makeDispatcher(c.pipeline);A.exports.connect=makeDispatcher(c.connect);A.exports.upgrade=makeDispatcher(c.upgrade);A.exports.MockClient=C;A.exports.MockPool=I;A.exports.MockAgent=B;A.exports.mockErrors=h},9965:(A,e,t)=>{"use strict";const{InvalidArgumentError:r}=t(8707);const{kClients:s,kRunning:o,kClose:n,kDestroy:i,kDispatch:a,kInterceptors:E}=t(6443);const g=t(1);const c=t(5076);const Q=t(6197);const C=t(3440);const B=t(4415);const{WeakRef:I,FinalizationRegistry:h}=t(3194)();const l=Symbol("onConnect");const u=Symbol("onDisconnect");const d=Symbol("onConnectionError");const f=Symbol("maxRedirections");const p=Symbol("onDrain");const y=Symbol("factory");const R=Symbol("finalizer");const D=Symbol("options");function defaultFactory(A,e){return e&&e.connections===1?new Q(A,e):new c(A,e)}class Agent extends g{constructor({factory:A=defaultFactory,maxRedirections:e=0,connect:t,...o}={}){super();if(typeof A!=="function"){throw new r("factory must be a function.")}if(t!=null&&typeof t!=="function"&&typeof t!=="object"){throw new r("connect must be a function or an object")}if(!Number.isInteger(e)||e<0){throw new r("maxRedirections must be a positive number")}if(t&&typeof t!=="function"){t={...t}}this[E]=o.interceptors&&o.interceptors.Agent&&Array.isArray(o.interceptors.Agent)?o.interceptors.Agent:[B({maxRedirections:e})];this[D]={...C.deepClone(o),connect:t};this[D].interceptors=o.interceptors?{...o.interceptors}:undefined;this[f]=e;this[y]=A;this[s]=new Map;this[R]=new h((A=>{const e=this[s].get(A);if(e!==undefined&&e.deref()===undefined){this[s].delete(A)}}));const n=this;this[p]=(A,e)=>{n.emit("drain",A,[n,...e])};this[l]=(A,e)=>{n.emit("connect",A,[n,...e])};this[u]=(A,e,t)=>{n.emit("disconnect",A,[n,...e],t)};this[d]=(A,e,t)=>{n.emit("connectionError",A,[n,...e],t)}}get[o](){let A=0;for(const e of this[s].values()){const t=e.deref();if(t){A+=t[o]}}return A}[a](A,e){let t;if(A.origin&&(typeof A.origin==="string"||A.origin instanceof URL)){t=String(A.origin)}else{throw new r("opts.origin must be a non-empty string or URL.")}const o=this[s].get(t);let n=o?o.deref():null;if(!n){n=this[y](A.origin,this[D]).on("drain",this[p]).on("connect",this[l]).on("disconnect",this[u]).on("connectionError",this[d]);this[s].set(t,new I(n));this[R].register(n,t)}return n.dispatch(A,e)}async[n](){const A=[];for(const e of this[s].values()){const t=e.deref();if(t){A.push(t.close())}}await Promise.all(A)}async[i](A){const e=[];for(const t of this[s].values()){const r=t.deref();if(r){e.push(r.destroy(A))}}await Promise.all(e)}}A.exports=Agent},158:(A,e,t)=>{const{addAbortListener:r}=t(3440);const{RequestAbortedError:s}=t(8707);const o=Symbol("kListener");const n=Symbol("kSignal");function abort(A){if(A.abort){A.abort()}else{A.onError(new s)}}function addSignal(A,e){A[n]=null;A[o]=null;if(!e){return}if(e.aborted){abort(A);return}A[n]=e;A[o]=()=>{abort(A)};r(A[n],A[o])}function removeSignal(A){if(!A[n]){return}if("removeEventListener"in A[n]){A[n].removeEventListener("abort",A[o])}else{A[n].removeListener("abort",A[o])}A[n]=null;A[o]=null}A.exports={addSignal:addSignal,removeSignal:removeSignal}},4660:(A,e,t)=>{"use strict";const{AsyncResource:r}=t(290);const{InvalidArgumentError:s,RequestAbortedError:o,SocketError:n}=t(8707);const i=t(3440);const{addSignal:a,removeSignal:E}=t(158);class ConnectHandler extends r{constructor(A,e){if(!A||typeof A!=="object"){throw new s("invalid opts")}if(typeof e!=="function"){throw new s("invalid callback")}const{signal:t,opaque:r,responseHeaders:o}=A;if(t&&typeof t.on!=="function"&&typeof t.addEventListener!=="function"){throw new s("signal must be an EventEmitter or EventTarget")}super("UNDICI_CONNECT");this.opaque=r||null;this.responseHeaders=o||null;this.callback=e;this.abort=null;a(this,t)}onConnect(A,e){if(!this.callback){throw new o}this.abort=A;this.context=e}onHeaders(){throw new n("bad connect",null)}onUpgrade(A,e,t){const{callback:r,opaque:s,context:o}=this;E(this);this.callback=null;let n=e;if(n!=null){n=this.responseHeaders==="raw"?i.parseRawHeaders(e):i.parseHeaders(e)}this.runInAsyncScope(r,null,null,{statusCode:A,headers:n,socket:t,opaque:s,context:o})}onError(A){const{callback:e,opaque:t}=this;E(this);if(e){this.callback=null;queueMicrotask((()=>{this.runInAsyncScope(e,null,A,{opaque:t})}))}}}function connect(A,e){if(e===undefined){return new Promise(((e,t)=>{connect.call(this,A,((A,r)=>A?t(A):e(r)))}))}try{const t=new ConnectHandler(A,e);this.dispatch({...A,method:"CONNECT"},t)}catch(t){if(typeof e!=="function"){throw t}const r=A&&A.opaque;queueMicrotask((()=>e(t,{opaque:r})))}}A.exports=connect},6862:(A,e,t)=>{"use strict";const{Readable:r,Duplex:s,PassThrough:o}=t(2203);const{InvalidArgumentError:n,InvalidReturnValueError:i,RequestAbortedError:a}=t(8707);const E=t(3440);const{AsyncResource:g}=t(290);const{addSignal:c,removeSignal:Q}=t(158);const C=t(2613);const B=Symbol("resume");class PipelineRequest extends r{constructor(){super({autoDestroy:true});this[B]=null}_read(){const{[B]:A}=this;if(A){this[B]=null;A()}}_destroy(A,e){this._read();e(A)}}class PipelineResponse extends r{constructor(A){super({autoDestroy:true});this[B]=A}_read(){this[B]()}_destroy(A,e){if(!A&&!this._readableState.endEmitted){A=new a}e(A)}}class PipelineHandler extends g{constructor(A,e){if(!A||typeof A!=="object"){throw new n("invalid opts")}if(typeof e!=="function"){throw new n("invalid handler")}const{signal:t,method:r,opaque:o,onInfo:i,responseHeaders:g}=A;if(t&&typeof t.on!=="function"&&typeof t.addEventListener!=="function"){throw new n("signal must be an EventEmitter or EventTarget")}if(r==="CONNECT"){throw new n("invalid method")}if(i&&typeof i!=="function"){throw new n("invalid onInfo callback")}super("UNDICI_PIPELINE");this.opaque=o||null;this.responseHeaders=g||null;this.handler=e;this.abort=null;this.context=null;this.onInfo=i||null;this.req=(new PipelineRequest).on("error",E.nop);this.ret=new s({readableObjectMode:A.objectMode,autoDestroy:true,read:()=>{const{body:A}=this;if(A&&A.resume){A.resume()}},write:(A,e,t)=>{const{req:r}=this;if(r.push(A,e)||r._readableState.destroyed){t()}else{r[B]=t}},destroy:(A,e)=>{const{body:t,req:r,res:s,ret:o,abort:n}=this;if(!A&&!o._readableState.endEmitted){A=new a}if(n&&A){n()}E.destroy(t,A);E.destroy(r,A);E.destroy(s,A);Q(this);e(A)}}).on("prefinish",(()=>{const{req:A}=this;A.push(null)}));this.res=null;c(this,t)}onConnect(A,e){const{ret:t,res:r}=this;C(!r,"pipeline cannot be retried");if(t.destroyed){throw new a}this.abort=A;this.context=e}onHeaders(A,e,t){const{opaque:r,handler:s,context:o}=this;if(A<200){if(this.onInfo){const t=this.responseHeaders==="raw"?E.parseRawHeaders(e):E.parseHeaders(e);this.onInfo({statusCode:A,headers:t})}return}this.res=new PipelineResponse(t);let n;try{this.handler=null;const t=this.responseHeaders==="raw"?E.parseRawHeaders(e):E.parseHeaders(e);n=this.runInAsyncScope(s,null,{statusCode:A,headers:t,opaque:r,body:this.res,context:o})}catch(A){this.res.on("error",E.nop);throw A}if(!n||typeof n.on!=="function"){throw new i("expected Readable")}n.on("data",(A=>{const{ret:e,body:t}=this;if(!e.push(A)&&t.pause){t.pause()}})).on("error",(A=>{const{ret:e}=this;E.destroy(e,A)})).on("end",(()=>{const{ret:A}=this;A.push(null)})).on("close",(()=>{const{ret:A}=this;if(!A._readableState.ended){E.destroy(A,new a)}}));this.body=n}onData(A){const{res:e}=this;return e.push(A)}onComplete(A){const{res:e}=this;e.push(null)}onError(A){const{ret:e}=this;this.handler=null;E.destroy(e,A)}}function pipeline(A,e){try{const t=new PipelineHandler(A,e);this.dispatch({...A,body:t.req},t);return t.ret}catch(A){return(new o).destroy(A)}}A.exports=pipeline},4043:(A,e,t)=>{"use strict";const r=t(9927);const{InvalidArgumentError:s,RequestAbortedError:o}=t(8707);const n=t(3440);const{getResolveErrorBodyCallback:i}=t(7655);const{AsyncResource:a}=t(290);const{addSignal:E,removeSignal:g}=t(158);class RequestHandler extends a{constructor(A,e){if(!A||typeof A!=="object"){throw new s("invalid opts")}const{signal:t,method:r,opaque:o,body:i,onInfo:a,responseHeaders:g,throwOnError:c,highWaterMark:Q}=A;try{if(typeof e!=="function"){throw new s("invalid callback")}if(Q&&(typeof Q!=="number"||Q<0)){throw new s("invalid highWaterMark")}if(t&&typeof t.on!=="function"&&typeof t.addEventListener!=="function"){throw new s("signal must be an EventEmitter or EventTarget")}if(r==="CONNECT"){throw new s("invalid method")}if(a&&typeof a!=="function"){throw new s("invalid onInfo callback")}super("UNDICI_REQUEST")}catch(A){if(n.isStream(i)){n.destroy(i.on("error",n.nop),A)}throw A}this.responseHeaders=g||null;this.opaque=o||null;this.callback=e;this.res=null;this.abort=null;this.body=i;this.trailers={};this.context=null;this.onInfo=a||null;this.throwOnError=c;this.highWaterMark=Q;if(n.isStream(i)){i.on("error",(A=>{this.onError(A)}))}E(this,t)}onConnect(A,e){if(!this.callback){throw new o}this.abort=A;this.context=e}onHeaders(A,e,t,s){const{callback:o,opaque:a,abort:E,context:g,responseHeaders:c,highWaterMark:Q}=this;const C=c==="raw"?n.parseRawHeaders(e):n.parseHeaders(e);if(A<200){if(this.onInfo){this.onInfo({statusCode:A,headers:C})}return}const B=c==="raw"?n.parseHeaders(e):C;const I=B["content-type"];const h=new r({resume:t,abort:E,contentType:I,highWaterMark:Q});this.callback=null;this.res=h;if(o!==null){if(this.throwOnError&&A>=400){this.runInAsyncScope(i,null,{callback:o,body:h,contentType:I,statusCode:A,statusMessage:s,headers:C})}else{this.runInAsyncScope(o,null,null,{statusCode:A,headers:C,trailers:this.trailers,opaque:a,body:h,context:g})}}}onData(A){const{res:e}=this;return e.push(A)}onComplete(A){const{res:e}=this;g(this);n.parseHeaders(A,this.trailers);e.push(null)}onError(A){const{res:e,callback:t,body:r,opaque:s}=this;g(this);if(t){this.callback=null;queueMicrotask((()=>{this.runInAsyncScope(t,null,A,{opaque:s})}))}if(e){this.res=null;queueMicrotask((()=>{n.destroy(e,A)}))}if(r){this.body=null;n.destroy(r,A)}}}function request(A,e){if(e===undefined){return new Promise(((e,t)=>{request.call(this,A,((A,r)=>A?t(A):e(r)))}))}try{this.dispatch(A,new RequestHandler(A,e))}catch(t){if(typeof e!=="function"){throw t}const r=A&&A.opaque;queueMicrotask((()=>e(t,{opaque:r})))}}A.exports=request;A.exports.RequestHandler=RequestHandler},3560:(A,e,t)=>{"use strict";const{finished:r,PassThrough:s}=t(2203);const{InvalidArgumentError:o,InvalidReturnValueError:n,RequestAbortedError:i}=t(8707);const a=t(3440);const{getResolveErrorBodyCallback:E}=t(7655);const{AsyncResource:g}=t(290);const{addSignal:c,removeSignal:Q}=t(158);class StreamHandler extends g{constructor(A,e,t){if(!A||typeof A!=="object"){throw new o("invalid opts")}const{signal:r,method:s,opaque:n,body:i,onInfo:E,responseHeaders:g,throwOnError:Q}=A;try{if(typeof t!=="function"){throw new o("invalid callback")}if(typeof e!=="function"){throw new o("invalid factory")}if(r&&typeof r.on!=="function"&&typeof r.addEventListener!=="function"){throw new o("signal must be an EventEmitter or EventTarget")}if(s==="CONNECT"){throw new o("invalid method")}if(E&&typeof E!=="function"){throw new o("invalid onInfo callback")}super("UNDICI_STREAM")}catch(A){if(a.isStream(i)){a.destroy(i.on("error",a.nop),A)}throw A}this.responseHeaders=g||null;this.opaque=n||null;this.factory=e;this.callback=t;this.res=null;this.abort=null;this.context=null;this.trailers=null;this.body=i;this.onInfo=E||null;this.throwOnError=Q||false;if(a.isStream(i)){i.on("error",(A=>{this.onError(A)}))}c(this,r)}onConnect(A,e){if(!this.callback){throw new i}this.abort=A;this.context=e}onHeaders(A,e,t,o){const{factory:i,opaque:g,context:c,callback:Q,responseHeaders:C}=this;const B=C==="raw"?a.parseRawHeaders(e):a.parseHeaders(e);if(A<200){if(this.onInfo){this.onInfo({statusCode:A,headers:B})}return}this.factory=null;let I;if(this.throwOnError&&A>=400){const t=C==="raw"?a.parseHeaders(e):B;const r=t["content-type"];I=new s;this.callback=null;this.runInAsyncScope(E,null,{callback:Q,body:I,contentType:r,statusCode:A,statusMessage:o,headers:B})}else{if(i===null){return}I=this.runInAsyncScope(i,null,{statusCode:A,headers:B,opaque:g,context:c});if(!I||typeof I.write!=="function"||typeof I.end!=="function"||typeof I.on!=="function"){throw new n("expected Writable")}r(I,{readable:false},(A=>{const{callback:e,res:t,opaque:r,trailers:s,abort:o}=this;this.res=null;if(A||!t.readable){a.destroy(t,A)}this.callback=null;this.runInAsyncScope(e,null,A||null,{opaque:r,trailers:s});if(A){o()}}))}I.on("drain",t);this.res=I;const h=I.writableNeedDrain!==undefined?I.writableNeedDrain:I._writableState&&I._writableState.needDrain;return h!==true}onData(A){const{res:e}=this;return e?e.write(A):true}onComplete(A){const{res:e}=this;Q(this);if(!e){return}this.trailers=a.parseHeaders(A);e.end()}onError(A){const{res:e,callback:t,opaque:r,body:s}=this;Q(this);this.factory=null;if(e){this.res=null;a.destroy(e,A)}else if(t){this.callback=null;queueMicrotask((()=>{this.runInAsyncScope(t,null,A,{opaque:r})}))}if(s){this.body=null;a.destroy(s,A)}}}function stream(A,e,t){if(t===undefined){return new Promise(((t,r)=>{stream.call(this,A,e,((A,e)=>A?r(A):t(e)))}))}try{this.dispatch(A,new StreamHandler(A,e,t))}catch(e){if(typeof t!=="function"){throw e}const r=A&&A.opaque;queueMicrotask((()=>t(e,{opaque:r})))}}A.exports=stream},1882:(A,e,t)=>{"use strict";const{InvalidArgumentError:r,RequestAbortedError:s,SocketError:o}=t(8707);const{AsyncResource:n}=t(290);const i=t(3440);const{addSignal:a,removeSignal:E}=t(158);const g=t(2613);class UpgradeHandler extends n{constructor(A,e){if(!A||typeof A!=="object"){throw new r("invalid opts")}if(typeof e!=="function"){throw new r("invalid callback")}const{signal:t,opaque:s,responseHeaders:o}=A;if(t&&typeof t.on!=="function"&&typeof t.addEventListener!=="function"){throw new r("signal must be an EventEmitter or EventTarget")}super("UNDICI_UPGRADE");this.responseHeaders=o||null;this.opaque=s||null;this.callback=e;this.abort=null;this.context=null;a(this,t)}onConnect(A,e){if(!this.callback){throw new s}this.abort=A;this.context=null}onHeaders(){throw new o("bad upgrade",null)}onUpgrade(A,e,t){const{callback:r,opaque:s,context:o}=this;g.strictEqual(A,101);E(this);this.callback=null;const n=this.responseHeaders==="raw"?i.parseRawHeaders(e):i.parseHeaders(e);this.runInAsyncScope(r,null,null,{headers:n,socket:t,opaque:s,context:o})}onError(A){const{callback:e,opaque:t}=this;E(this);if(e){this.callback=null;queueMicrotask((()=>{this.runInAsyncScope(e,null,A,{opaque:t})}))}}}function upgrade(A,e){if(e===undefined){return new Promise(((e,t)=>{upgrade.call(this,A,((A,r)=>A?t(A):e(r)))}))}try{const t=new UpgradeHandler(A,e);this.dispatch({...A,method:A.method||"GET",upgrade:A.protocol||"Websocket"},t)}catch(t){if(typeof e!=="function"){throw t}const r=A&&A.opaque;queueMicrotask((()=>e(t,{opaque:r})))}}A.exports=upgrade},6615:(A,e,t)=>{"use strict";A.exports.request=t(4043);A.exports.stream=t(3560);A.exports.pipeline=t(6862);A.exports.upgrade=t(1882);A.exports.connect=t(4660)},9927:(A,e,t)=>{"use strict";const r=t(2613);const{Readable:s}=t(2203);const{RequestAbortedError:o,NotSupportedError:n,InvalidArgumentError:i}=t(8707);const a=t(3440);const{ReadableStreamFrom:E,toUSVString:g}=t(3440);let c;const Q=Symbol("kConsume");const C=Symbol("kReading");const B=Symbol("kBody");const I=Symbol("abort");const h=Symbol("kContentType");const noop=()=>{};A.exports=class BodyReadable extends s{constructor({resume:A,abort:e,contentType:t="",highWaterMark:r=64*1024}){super({autoDestroy:true,read:A,highWaterMark:r});this._readableState.dataEmitted=false;this[I]=e;this[Q]=null;this[B]=null;this[h]=t;this[C]=false}destroy(A){if(this.destroyed){return this}if(!A&&!this._readableState.endEmitted){A=new o}if(A){this[I]()}return super.destroy(A)}emit(A,...e){if(A==="data"){this._readableState.dataEmitted=true}else if(A==="error"){this._readableState.errorEmitted=true}return super.emit(A,...e)}on(A,...e){if(A==="data"||A==="readable"){this[C]=true}return super.on(A,...e)}addListener(A,...e){return this.on(A,...e)}off(A,...e){const t=super.off(A,...e);if(A==="data"||A==="readable"){this[C]=this.listenerCount("data")>0||this.listenerCount("readable")>0}return t}removeListener(A,...e){return this.off(A,...e)}push(A){if(this[Q]&&A!==null&&this.readableLength===0){consumePush(this[Q],A);return this[C]?super.push(A):true}return super.push(A)}async text(){return consume(this,"text")}async json(){return consume(this,"json")}async blob(){return consume(this,"blob")}async arrayBuffer(){return consume(this,"arrayBuffer")}async formData(){throw new n}get bodyUsed(){return a.isDisturbed(this)}get body(){if(!this[B]){this[B]=E(this);if(this[Q]){this[B].getReader();r(this[B].locked)}}return this[B]}dump(A){let e=A&&Number.isFinite(A.limit)?A.limit:262144;const t=A&&A.signal;if(t){try{if(typeof t!=="object"||!("aborted"in t)){throw new i("signal must be an AbortSignal")}a.throwIfAborted(t)}catch(A){return Promise.reject(A)}}if(this.closed){return Promise.resolve(null)}return new Promise(((A,r)=>{const s=t?a.addAbortListener(t,(()=>{this.destroy()})):noop;this.on("close",(function(){s();if(t&&t.aborted){r(t.reason||Object.assign(new Error("The operation was aborted"),{name:"AbortError"}))}else{A(null)}})).on("error",noop).on("data",(function(A){e-=A.length;if(e<=0){this.destroy()}})).resume()}))}};function isLocked(A){return A[B]&&A[B].locked===true||A[Q]}function isUnusable(A){return a.isDisturbed(A)||isLocked(A)}async function consume(A,e){if(isUnusable(A)){throw new TypeError("unusable")}r(!A[Q]);return new Promise(((t,r)=>{A[Q]={type:e,stream:A,resolve:t,reject:r,length:0,body:[]};A.on("error",(function(A){consumeFinish(this[Q],A)})).on("close",(function(){if(this[Q].body!==null){consumeFinish(this[Q],new o)}}));process.nextTick(consumeStart,A[Q])}))}function consumeStart(A){if(A.body===null){return}const{_readableState:e}=A.stream;for(const t of e.buffer){consumePush(A,t)}if(e.endEmitted){consumeEnd(this[Q])}else{A.stream.on("end",(function(){consumeEnd(this[Q])}))}A.stream.resume();while(A.stream.read()!=null){}}function consumeEnd(A){const{type:e,body:r,resolve:s,stream:o,length:n}=A;try{if(e==="text"){s(g(Buffer.concat(r)))}else if(e==="json"){s(JSON.parse(Buffer.concat(r)))}else if(e==="arrayBuffer"){const A=new Uint8Array(n);let e=0;for(const t of r){A.set(t,e);e+=t.byteLength}s(A.buffer)}else if(e==="blob"){if(!c){c=t(181).Blob}s(new c(r,{type:o[h]}))}consumeFinish(A)}catch(A){o.destroy(A)}}function consumePush(A,e){A.length+=e.length;A.body.push(e)}function consumeFinish(A,e){if(A.body===null){return}if(e){A.reject(e)}else{A.resolve()}A.type=null;A.stream=null;A.resolve=null;A.reject=null;A.length=0;A.body=null}},7655:(A,e,t)=>{const r=t(2613);const{ResponseStatusCodeError:s}=t(8707);const{toUSVString:o}=t(3440);async function getResolveErrorBodyCallback({callback:A,body:e,contentType:t,statusCode:n,statusMessage:i,headers:a}){r(e);let E=[];let g=0;for await(const A of e){E.push(A);g+=A.length;if(g>128*1024){E=null;break}}if(n===204||!t||!E){process.nextTick(A,new s(`Response status code ${n}${i?`: ${i}`:""}`,n,a));return}try{if(t.startsWith("application/json")){const e=JSON.parse(o(Buffer.concat(E)));process.nextTick(A,new s(`Response status code ${n}${i?`: ${i}`:""}`,n,a,e));return}if(t.startsWith("text/")){const e=o(Buffer.concat(E));process.nextTick(A,new s(`Response status code ${n}${i?`: ${i}`:""}`,n,a,e));return}}catch(A){}process.nextTick(A,new s(`Response status code ${n}${i?`: ${i}`:""}`,n,a))}A.exports={getResolveErrorBodyCallback:getResolveErrorBodyCallback}},1093:(A,e,t)=>{"use strict";const{BalancedPoolMissingUpstreamError:r,InvalidArgumentError:s}=t(8707);const{PoolBase:o,kClients:n,kNeedDrain:i,kAddClient:a,kRemoveClient:E,kGetDispatcher:g}=t(8640);const c=t(5076);const{kUrl:Q,kInterceptors:C}=t(6443);const{parseOrigin:B}=t(3440);const I=Symbol("factory");const h=Symbol("options");const l=Symbol("kGreatestCommonDivisor");const u=Symbol("kCurrentWeight");const d=Symbol("kIndex");const f=Symbol("kWeight");const p=Symbol("kMaxWeightPerServer");const y=Symbol("kErrorPenalty");function getGreatestCommonDivisor(A,e){if(e===0)return A;return getGreatestCommonDivisor(e,A%e)}function defaultFactory(A,e){return new c(A,e)}class BalancedPool extends o{constructor(A=[],{factory:e=defaultFactory,...t}={}){super();this[h]=t;this[d]=-1;this[u]=0;this[p]=this[h].maxWeightPerServer||100;this[y]=this[h].errorPenalty||15;if(!Array.isArray(A)){A=[A]}if(typeof e!=="function"){throw new s("factory must be a function.")}this[C]=t.interceptors&&t.interceptors.BalancedPool&&Array.isArray(t.interceptors.BalancedPool)?t.interceptors.BalancedPool:[];this[I]=e;for(const e of A){this.addUpstream(e)}this._updateBalancedPoolStats()}addUpstream(A){const e=B(A).origin;if(this[n].find((A=>A[Q].origin===e&&A.closed!==true&&A.destroyed!==true))){return this}const t=this[I](e,Object.assign({},this[h]));this[a](t);t.on("connect",(()=>{t[f]=Math.min(this[p],t[f]+this[y])}));t.on("connectionError",(()=>{t[f]=Math.max(1,t[f]-this[y]);this._updateBalancedPoolStats()}));t.on("disconnect",((...A)=>{const e=A[2];if(e&&e.code==="UND_ERR_SOCKET"){t[f]=Math.max(1,t[f]-this[y]);this._updateBalancedPoolStats()}}));for(const A of this[n]){A[f]=this[p]}this._updateBalancedPoolStats();return this}_updateBalancedPoolStats(){this[l]=this[n].map((A=>A[f])).reduce(getGreatestCommonDivisor,0)}removeUpstream(A){const e=B(A).origin;const t=this[n].find((A=>A[Q].origin===e&&A.closed!==true&&A.destroyed!==true));if(t){this[E](t)}return this}get upstreams(){return this[n].filter((A=>A.closed!==true&&A.destroyed!==true)).map((A=>A[Q].origin))}[g](){if(this[n].length===0){throw new r}const A=this[n].find((A=>!A[i]&&A.closed!==true&&A.destroyed!==true));if(!A){return}const e=this[n].map((A=>A[i])).reduce(((A,e)=>A&&e),true);if(e){return}let t=0;let s=this[n].findIndex((A=>!A[i]));while(t++this[n][s][f]&&!A[i]){s=this[d]}if(this[d]===0){this[u]=this[u]-this[l];if(this[u]<=0){this[u]=this[p]}}if(A[f]>=this[u]&&!A[i]){return A}}this[u]=this[n][s][f];this[d]=s;return this[n][s]}}A.exports=BalancedPool},479:(A,e,t)=>{"use strict";const{kConstruct:r}=t(296);const{urlEquals:s,fieldValues:o}=t(3993);const{kEnumerableProperty:n,isDisturbed:i}=t(3440);const{kHeadersList:a}=t(6443);const{webidl:E}=t(4222);const{Response:g,cloneResponse:c}=t(8676);const{Request:Q}=t(5194);const{kState:C,kHeaders:B,kGuard:I,kRealm:h}=t(9710);const{fetching:l}=t(2315);const{urlIsHttpHttpsScheme:u,createDeferredPromise:d,readAllBytes:f}=t(5523);const p=t(2613);const{getGlobalDispatcher:y}=t(2581);class Cache{#A;constructor(){if(arguments[0]!==r){E.illegalConstructor()}this.#A=arguments[1]}async match(A,e={}){E.brandCheck(this,Cache);E.argumentLengthCheck(arguments,1,{header:"Cache.match"});A=E.converters.RequestInfo(A);e=E.converters.CacheQueryOptions(e);const t=await this.matchAll(A,e);if(t.length===0){return}return t[0]}async matchAll(A=undefined,e={}){E.brandCheck(this,Cache);if(A!==undefined)A=E.converters.RequestInfo(A);e=E.converters.CacheQueryOptions(e);let t=null;if(A!==undefined){if(A instanceof Q){t=A[C];if(t.method!=="GET"&&!e.ignoreMethod){return[]}}else if(typeof A==="string"){t=new Q(A)[C]}}const r=[];if(A===undefined){for(const A of this.#A){r.push(A[1])}}else{const A=this.#e(t,e);for(const e of A){r.push(e[1])}}const s=[];for(const A of r){const e=new g(A.body?.source??null);const t=e[C].body;e[C]=A;e[C].body=t;e[B][a]=A.headersList;e[B][I]="immutable";s.push(e)}return Object.freeze(s)}async add(A){E.brandCheck(this,Cache);E.argumentLengthCheck(arguments,1,{header:"Cache.add"});A=E.converters.RequestInfo(A);const e=[A];const t=this.addAll(e);return await t}async addAll(A){E.brandCheck(this,Cache);E.argumentLengthCheck(arguments,1,{header:"Cache.addAll"});A=E.converters["sequence"](A);const e=[];const t=[];for(const e of A){if(typeof e==="string"){continue}const A=e[C];if(!u(A.url)||A.method!=="GET"){throw E.errors.exception({header:"Cache.addAll",message:"Expected http/s scheme when method is not GET."})}}const r=[];for(const s of A){const A=new Q(s)[C];if(!u(A.url)){throw E.errors.exception({header:"Cache.addAll",message:"Expected http/s scheme."})}A.initiator="fetch";A.destination="subresource";t.push(A);const n=d();r.push(l({request:A,dispatcher:y(),processResponse(A){if(A.type==="error"||A.status===206||A.status<200||A.status>299){n.reject(E.errors.exception({header:"Cache.addAll",message:"Received an invalid status code or the request failed."}))}else if(A.headersList.contains("vary")){const e=o(A.headersList.get("vary"));for(const A of e){if(A==="*"){n.reject(E.errors.exception({header:"Cache.addAll",message:"invalid vary field value"}));for(const A of r){A.abort()}return}}}},processResponseEndOfBody(A){if(A.aborted){n.reject(new DOMException("aborted","AbortError"));return}n.resolve(A)}}));e.push(n.promise)}const s=Promise.all(e);const n=await s;const i=[];let a=0;for(const A of n){const e={type:"put",request:t[a],response:A};i.push(e);a++}const g=d();let c=null;try{this.#t(i)}catch(A){c=A}queueMicrotask((()=>{if(c===null){g.resolve(undefined)}else{g.reject(c)}}));return g.promise}async put(A,e){E.brandCheck(this,Cache);E.argumentLengthCheck(arguments,2,{header:"Cache.put"});A=E.converters.RequestInfo(A);e=E.converters.Response(e);let t=null;if(A instanceof Q){t=A[C]}else{t=new Q(A)[C]}if(!u(t.url)||t.method!=="GET"){throw E.errors.exception({header:"Cache.put",message:"Expected an http/s scheme when method is not GET"})}const r=e[C];if(r.status===206){throw E.errors.exception({header:"Cache.put",message:"Got 206 status"})}if(r.headersList.contains("vary")){const A=o(r.headersList.get("vary"));for(const e of A){if(e==="*"){throw E.errors.exception({header:"Cache.put",message:"Got * vary field value"})}}}if(r.body&&(i(r.body.stream)||r.body.stream.locked)){throw E.errors.exception({header:"Cache.put",message:"Response body is locked or disturbed"})}const s=c(r);const n=d();if(r.body!=null){const A=r.body.stream;const e=A.getReader();f(e).then(n.resolve,n.reject)}else{n.resolve(undefined)}const a=[];const g={type:"put",request:t,response:s};a.push(g);const B=await n.promise;if(s.body!=null){s.body.source=B}const I=d();let h=null;try{this.#t(a)}catch(A){h=A}queueMicrotask((()=>{if(h===null){I.resolve()}else{I.reject(h)}}));return I.promise}async delete(A,e={}){E.brandCheck(this,Cache);E.argumentLengthCheck(arguments,1,{header:"Cache.delete"});A=E.converters.RequestInfo(A);e=E.converters.CacheQueryOptions(e);let t=null;if(A instanceof Q){t=A[C];if(t.method!=="GET"&&!e.ignoreMethod){return false}}else{p(typeof A==="string");t=new Q(A)[C]}const r=[];const s={type:"delete",request:t,options:e};r.push(s);const o=d();let n=null;let i;try{i=this.#t(r)}catch(A){n=A}queueMicrotask((()=>{if(n===null){o.resolve(!!i?.length)}else{o.reject(n)}}));return o.promise}async keys(A=undefined,e={}){E.brandCheck(this,Cache);if(A!==undefined)A=E.converters.RequestInfo(A);e=E.converters.CacheQueryOptions(e);let t=null;if(A!==undefined){if(A instanceof Q){t=A[C];if(t.method!=="GET"&&!e.ignoreMethod){return[]}}else if(typeof A==="string"){t=new Q(A)[C]}}const r=d();const s=[];if(A===undefined){for(const A of this.#A){s.push(A[0])}}else{const A=this.#e(t,e);for(const e of A){s.push(e[0])}}queueMicrotask((()=>{const A=[];for(const e of s){const t=new Q("https://a");t[C]=e;t[B][a]=e.headersList;t[B][I]="immutable";t[h]=e.client;A.push(t)}r.resolve(Object.freeze(A))}));return r.promise}#t(A){const e=this.#A;const t=[...e];const r=[];const s=[];try{for(const t of A){if(t.type!=="delete"&&t.type!=="put"){throw E.errors.exception({header:"Cache.#batchCacheOperations",message:'operation type does not match "delete" or "put"'})}if(t.type==="delete"&&t.response!=null){throw E.errors.exception({header:"Cache.#batchCacheOperations",message:"delete operation should not have an associated response"})}if(this.#e(t.request,t.options,r).length){throw new DOMException("???","InvalidStateError")}let A;if(t.type==="delete"){A=this.#e(t.request,t.options);if(A.length===0){return[]}for(const t of A){const A=e.indexOf(t);p(A!==-1);e.splice(A,1)}}else if(t.type==="put"){if(t.response==null){throw E.errors.exception({header:"Cache.#batchCacheOperations",message:"put operation should have an associated response"})}const s=t.request;if(!u(s.url)){throw E.errors.exception({header:"Cache.#batchCacheOperations",message:"expected http or https scheme"})}if(s.method!=="GET"){throw E.errors.exception({header:"Cache.#batchCacheOperations",message:"not get method"})}if(t.options!=null){throw E.errors.exception({header:"Cache.#batchCacheOperations",message:"options must not be defined"})}A=this.#e(t.request);for(const t of A){const A=e.indexOf(t);p(A!==-1);e.splice(A,1)}e.push([t.request,t.response]);r.push([t.request,t.response])}s.push([t.request,t.response])}return s}catch(A){this.#A.length=0;this.#A=t;throw A}}#e(A,e,t){const r=[];const s=t??this.#A;for(const t of s){const[s,o]=t;if(this.#r(A,s,o,e)){r.push(t)}}return r}#r(A,e,t=null,r){const n=new URL(A.url);const i=new URL(e.url);if(r?.ignoreSearch){i.search="";n.search=""}if(!s(n,i,true)){return false}if(t==null||r?.ignoreVary||!t.headersList.contains("vary")){return true}const a=o(t.headersList.get("vary"));for(const t of a){if(t==="*"){return false}const r=e.headersList.get(t);const s=A.headersList.get(t);if(r!==s){return false}}return true}}Object.defineProperties(Cache.prototype,{[Symbol.toStringTag]:{value:"Cache",configurable:true},match:n,matchAll:n,add:n,addAll:n,put:n,delete:n,keys:n});const R=[{key:"ignoreSearch",converter:E.converters.boolean,defaultValue:false},{key:"ignoreMethod",converter:E.converters.boolean,defaultValue:false},{key:"ignoreVary",converter:E.converters.boolean,defaultValue:false}];E.converters.CacheQueryOptions=E.dictionaryConverter(R);E.converters.MultiCacheQueryOptions=E.dictionaryConverter([...R,{key:"cacheName",converter:E.converters.DOMString}]);E.converters.Response=E.interfaceConverter(g);E.converters["sequence"]=E.sequenceConverter(E.converters.RequestInfo);A.exports={Cache:Cache}},4738:(A,e,t)=>{"use strict";const{kConstruct:r}=t(296);const{Cache:s}=t(479);const{webidl:o}=t(4222);const{kEnumerableProperty:n}=t(3440);class CacheStorage{#s=new Map;constructor(){if(arguments[0]!==r){o.illegalConstructor()}}async match(A,e={}){o.brandCheck(this,CacheStorage);o.argumentLengthCheck(arguments,1,{header:"CacheStorage.match"});A=o.converters.RequestInfo(A);e=o.converters.MultiCacheQueryOptions(e);if(e.cacheName!=null){if(this.#s.has(e.cacheName)){const t=this.#s.get(e.cacheName);const o=new s(r,t);return await o.match(A,e)}}else{for(const t of this.#s.values()){const o=new s(r,t);const n=await o.match(A,e);if(n!==undefined){return n}}}}async has(A){o.brandCheck(this,CacheStorage);o.argumentLengthCheck(arguments,1,{header:"CacheStorage.has"});A=o.converters.DOMString(A);return this.#s.has(A)}async open(A){o.brandCheck(this,CacheStorage);o.argumentLengthCheck(arguments,1,{header:"CacheStorage.open"});A=o.converters.DOMString(A);if(this.#s.has(A)){const e=this.#s.get(A);return new s(r,e)}const e=[];this.#s.set(A,e);return new s(r,e)}async delete(A){o.brandCheck(this,CacheStorage);o.argumentLengthCheck(arguments,1,{header:"CacheStorage.delete"});A=o.converters.DOMString(A);return this.#s.delete(A)}async keys(){o.brandCheck(this,CacheStorage);const A=this.#s.keys();return[...A]}}Object.defineProperties(CacheStorage.prototype,{[Symbol.toStringTag]:{value:"CacheStorage",configurable:true},match:n,has:n,open:n,delete:n,keys:n});A.exports={CacheStorage:CacheStorage}},296:(A,e,t)=>{"use strict";A.exports={kConstruct:t(6443).kConstruct}},3993:(A,e,t)=>{"use strict";const r=t(2613);const{URLSerializer:s}=t(4322);const{isValidHeaderName:o}=t(5523);function urlEquals(A,e,t=false){const r=s(A,t);const o=s(e,t);return r===o}function fieldValues(A){r(A!==null);const e=[];for(let t of A.split(",")){t=t.trim();if(!t.length){continue}else if(!o(t)){continue}e.push(t)}return e}A.exports={urlEquals:urlEquals,fieldValues:fieldValues}},6197:(A,e,t)=>{"use strict";const r=t(2613);const s=t(9278);const o=t(8611);const{pipeline:n}=t(2203);const i=t(3440);const a=t(8804);const E=t(4655);const g=t(1);const{RequestContentLengthMismatchError:c,ResponseContentLengthMismatchError:Q,InvalidArgumentError:C,RequestAbortedError:B,HeadersTimeoutError:I,HeadersOverflowError:h,SocketError:l,InformationalError:u,BodyTimeoutError:d,HTTPParserError:f,ResponseExceededMaxSizeError:p,ClientDestroyedError:y}=t(8707);const R=t(9136);const{kUrl:D,kReset:w,kServerName:k,kClient:m,kBusy:b,kParser:F,kConnect:S,kBlocking:N,kResuming:U,kRunning:L,kPending:M,kSize:T,kWriting:Y,kQueue:H,kConnected:J,kConnecting:G,kNeedDrain:v,kNoRef:V,kKeepAliveDefaultTimeout:x,kHostHeader:O,kPendingIdx:P,kRunningIdx:W,kError:q,kPipelining:_,kSocket:Z,kKeepAliveTimeoutValue:j,kMaxHeadersSize:X,kKeepAliveMaxTimeout:K,kKeepAliveTimeoutThreshold:z,kHeadersTimeout:$,kBodyTimeout:AA,kStrictContentLength:eA,kConnector:tA,kMaxRedirections:rA,kMaxRequests:sA,kCounter:oA,kClose:nA,kDestroy:iA,kDispatch:aA,kInterceptors:EA,kLocalAddress:gA,kMaxResponseSize:cA,kHTTPConnVersion:QA,kHost:CA,kHTTP2Session:BA,kHTTP2SessionState:IA,kHTTP2BuildRequest:hA,kHTTP2CopyHeaders:lA,kHTTP1BuildRequest:uA}=t(6443);let dA;try{dA=t(5675)}catch{dA={constants:{}}}const{constants:{HTTP2_HEADER_AUTHORITY:fA,HTTP2_HEADER_METHOD:pA,HTTP2_HEADER_PATH:yA,HTTP2_HEADER_SCHEME:RA,HTTP2_HEADER_CONTENT_LENGTH:DA,HTTP2_HEADER_EXPECT:wA,HTTP2_HEADER_STATUS:kA}}=dA;let mA=false;const bA=Buffer[Symbol.species];const FA=Symbol("kClosedResolve");const SA={};try{const A=t(1637);SA.sendHeaders=A.channel("undici:client:sendHeaders");SA.beforeConnect=A.channel("undici:client:beforeConnect");SA.connectError=A.channel("undici:client:connectError");SA.connected=A.channel("undici:client:connected")}catch{SA.sendHeaders={hasSubscribers:false};SA.beforeConnect={hasSubscribers:false};SA.connectError={hasSubscribers:false};SA.connected={hasSubscribers:false}}class Client extends g{constructor(A,{interceptors:e,maxHeaderSize:t,headersTimeout:r,socketTimeout:n,requestTimeout:a,connectTimeout:E,bodyTimeout:g,idleTimeout:c,keepAlive:Q,keepAliveTimeout:B,maxKeepAliveTimeout:I,keepAliveMaxTimeout:h,keepAliveTimeoutThreshold:l,socketPath:u,pipelining:d,tls:f,strictContentLength:p,maxCachedSessions:y,maxRedirections:w,connect:m,maxRequestsPerClient:b,localAddress:F,maxResponseSize:S,autoSelectFamily:N,autoSelectFamilyAttemptTimeout:L,allowH2:M,maxConcurrentStreams:T}={}){super();if(Q!==undefined){throw new C("unsupported keepAlive, use pipelining=0 instead")}if(n!==undefined){throw new C("unsupported socketTimeout, use headersTimeout & bodyTimeout instead")}if(a!==undefined){throw new C("unsupported requestTimeout, use headersTimeout & bodyTimeout instead")}if(c!==undefined){throw new C("unsupported idleTimeout, use keepAliveTimeout instead")}if(I!==undefined){throw new C("unsupported maxKeepAliveTimeout, use keepAliveMaxTimeout instead")}if(t!=null&&!Number.isFinite(t)){throw new C("invalid maxHeaderSize")}if(u!=null&&typeof u!=="string"){throw new C("invalid socketPath")}if(E!=null&&(!Number.isFinite(E)||E<0)){throw new C("invalid connectTimeout")}if(B!=null&&(!Number.isFinite(B)||B<=0)){throw new C("invalid keepAliveTimeout")}if(h!=null&&(!Number.isFinite(h)||h<=0)){throw new C("invalid keepAliveMaxTimeout")}if(l!=null&&!Number.isFinite(l)){throw new C("invalid keepAliveTimeoutThreshold")}if(r!=null&&(!Number.isInteger(r)||r<0)){throw new C("headersTimeout must be a positive integer or zero")}if(g!=null&&(!Number.isInteger(g)||g<0)){throw new C("bodyTimeout must be a positive integer or zero")}if(m!=null&&typeof m!=="function"&&typeof m!=="object"){throw new C("connect must be a function or an object")}if(w!=null&&(!Number.isInteger(w)||w<0)){throw new C("maxRedirections must be a positive number")}if(b!=null&&(!Number.isInteger(b)||b<0)){throw new C("maxRequestsPerClient must be a positive number")}if(F!=null&&(typeof F!=="string"||s.isIP(F)===0)){throw new C("localAddress must be valid string IP address")}if(S!=null&&(!Number.isInteger(S)||S<-1)){throw new C("maxResponseSize must be a positive number")}if(L!=null&&(!Number.isInteger(L)||L<-1)){throw new C("autoSelectFamilyAttemptTimeout must be a positive number")}if(M!=null&&typeof M!=="boolean"){throw new C("allowH2 must be a valid boolean value")}if(T!=null&&(typeof T!=="number"||T<1)){throw new C("maxConcurrentStreams must be a possitive integer, greater than 0")}if(typeof m!=="function"){m=R({...f,maxCachedSessions:y,allowH2:M,socketPath:u,timeout:E,...i.nodeHasAutoSelectFamily&&N?{autoSelectFamily:N,autoSelectFamilyAttemptTimeout:L}:undefined,...m})}this[EA]=e&&e.Client&&Array.isArray(e.Client)?e.Client:[UA({maxRedirections:w})];this[D]=i.parseOrigin(A);this[tA]=m;this[Z]=null;this[_]=d!=null?d:1;this[X]=t||o.maxHeaderSize;this[x]=B==null?4e3:B;this[K]=h==null?6e5:h;this[z]=l==null?1e3:l;this[j]=this[x];this[k]=null;this[gA]=F!=null?F:null;this[U]=0;this[v]=0;this[O]=`host: ${this[D].hostname}${this[D].port?`:${this[D].port}`:""}\r\n`;this[AA]=g!=null?g:3e5;this[$]=r!=null?r:3e5;this[eA]=p==null?true:p;this[rA]=w;this[sA]=b;this[FA]=null;this[cA]=S>-1?S:-1;this[QA]="h1";this[BA]=null;this[IA]=!M?null:{openStreams:0,maxConcurrentStreams:T!=null?T:100};this[CA]=`${this[D].hostname}${this[D].port?`:${this[D].port}`:""}`;this[H]=[];this[W]=0;this[P]=0}get pipelining(){return this[_]}set pipelining(A){this[_]=A;resume(this,true)}get[M](){return this[H].length-this[P]}get[L](){return this[P]-this[W]}get[T](){return this[H].length-this[W]}get[J](){return!!this[Z]&&!this[G]&&!this[Z].destroyed}get[b](){const A=this[Z];return A&&(A[w]||A[Y]||A[N])||this[T]>=(this[_]||1)||this[M]>0}[S](A){connect(this);this.once("connect",A)}[aA](A,e){const t=A.origin||this[D].origin;const r=this[QA]==="h2"?E[hA](t,A,e):E[uA](t,A,e);this[H].push(r);if(this[U]){}else if(i.bodyLength(r.body)==null&&i.isIterable(r.body)){this[U]=1;process.nextTick(resume,this)}else{resume(this,true)}if(this[U]&&this[v]!==2&&this[b]){this[v]=2}return this[v]<2}async[nA](){return new Promise((A=>{if(!this[T]){A(null)}else{this[FA]=A}}))}async[iA](A){return new Promise((e=>{const t=this[H].splice(this[P]);for(let e=0;e{if(this[FA]){this[FA]();this[FA]=null}e()};if(this[BA]!=null){i.destroy(this[BA],A);this[BA]=null;this[IA]=null}if(!this[Z]){queueMicrotask(callback)}else{i.destroy(this[Z].on("close",callback),A)}resume(this)}))}}function onHttp2SessionError(A){r(A.code!=="ERR_TLS_CERT_ALTNAME_INVALID");this[Z][q]=A;onError(this[m],A)}function onHttp2FrameError(A,e,t){const r=new u(`HTTP/2: "frameError" received - type ${A}, code ${e}`);if(t===0){this[Z][q]=r;onError(this[m],r)}}function onHttp2SessionEnd(){i.destroy(this,new l("other side closed"));i.destroy(this[Z],new l("other side closed"))}function onHTTP2GoAway(A){const e=this[m];const t=new u(`HTTP/2: "GOAWAY" frame received with code ${A}`);e[Z]=null;e[BA]=null;if(e.destroyed){r(this[M]===0);const A=e[H].splice(e[W]);for(let e=0;e0){const A=e[H][e[W]];e[H][e[W]++]=null;errorRequest(e,A,t)}e[P]=e[W];r(e[L]===0);e.emit("disconnect",e[D],[e],t);resume(e)}const NA=t(2824);const UA=t(4415);const LA=Buffer.alloc(0);async function lazyllhttp(){const A=process.env.JEST_WORKER_ID?t(3870):undefined;let e;try{e=await WebAssembly.compile(Buffer.from(t(3434),"base64"))}catch(r){e=await WebAssembly.compile(Buffer.from(A||t(3870),"base64"))}return await WebAssembly.instantiate(e,{env:{wasm_on_url:(A,e,t)=>0,wasm_on_status:(A,e,t)=>{r.strictEqual(YA.ptr,A);const s=e-GA+HA.byteOffset;return YA.onStatus(new bA(HA.buffer,s,t))||0},wasm_on_message_begin:A=>{r.strictEqual(YA.ptr,A);return YA.onMessageBegin()||0},wasm_on_header_field:(A,e,t)=>{r.strictEqual(YA.ptr,A);const s=e-GA+HA.byteOffset;return YA.onHeaderField(new bA(HA.buffer,s,t))||0},wasm_on_header_value:(A,e,t)=>{r.strictEqual(YA.ptr,A);const s=e-GA+HA.byteOffset;return YA.onHeaderValue(new bA(HA.buffer,s,t))||0},wasm_on_headers_complete:(A,e,t,s)=>{r.strictEqual(YA.ptr,A);return YA.onHeadersComplete(e,Boolean(t),Boolean(s))||0},wasm_on_body:(A,e,t)=>{r.strictEqual(YA.ptr,A);const s=e-GA+HA.byteOffset;return YA.onBody(new bA(HA.buffer,s,t))||0},wasm_on_message_complete:A=>{r.strictEqual(YA.ptr,A);return YA.onMessageComplete()||0}}})}let MA=null;let TA=lazyllhttp();TA.catch();let YA=null;let HA=null;let JA=0;let GA=null;const vA=1;const VA=2;const xA=3;class Parser{constructor(A,e,{exports:t}){r(Number.isFinite(A[X])&&A[X]>0);this.llhttp=t;this.ptr=this.llhttp.llhttp_alloc(NA.TYPE.RESPONSE);this.client=A;this.socket=e;this.timeout=null;this.timeoutValue=null;this.timeoutType=null;this.statusCode=null;this.statusText="";this.upgrade=false;this.headers=[];this.headersSize=0;this.headersMaxSize=A[X];this.shouldKeepAlive=false;this.paused=false;this.resume=this.resume.bind(this);this.bytesRead=0;this.keepAlive="";this.contentLength="";this.connection="";this.maxResponseSize=A[cA]}setTimeout(A,e){this.timeoutType=e;if(A!==this.timeoutValue){a.clearTimeout(this.timeout);if(A){this.timeout=a.setTimeout(onParserTimeout,A,this);if(this.timeout.unref){this.timeout.unref()}}else{this.timeout=null}this.timeoutValue=A}else if(this.timeout){if(this.timeout.refresh){this.timeout.refresh()}}}resume(){if(this.socket.destroyed||!this.paused){return}r(this.ptr!=null);r(YA==null);this.llhttp.llhttp_resume(this.ptr);r(this.timeoutType===VA);if(this.timeout){if(this.timeout.refresh){this.timeout.refresh()}}this.paused=false;this.execute(this.socket.read()||LA);this.readMore()}readMore(){while(!this.paused&&this.ptr){const A=this.socket.read();if(A===null){break}this.execute(A)}}execute(A){r(this.ptr!=null);r(YA==null);r(!this.paused);const{socket:e,llhttp:t}=this;if(A.length>JA){if(GA){t.free(GA)}JA=Math.ceil(A.length/4096)*4096;GA=t.malloc(JA)}new Uint8Array(t.memory.buffer,GA,JA).set(A);try{let r;try{HA=A;YA=this;r=t.llhttp_execute(this.ptr,GA,A.length)}catch(A){throw A}finally{YA=null;HA=null}const s=t.llhttp_get_error_pos(this.ptr)-GA;if(r===NA.ERROR.PAUSED_UPGRADE){this.onUpgrade(A.slice(s))}else if(r===NA.ERROR.PAUSED){this.paused=true;e.unshift(A.slice(s))}else if(r!==NA.ERROR.OK){const e=t.llhttp_get_error_reason(this.ptr);let o="";if(e){const A=new Uint8Array(t.memory.buffer,e).indexOf(0);o="Response does not match the HTTP/1.1 protocol ("+Buffer.from(t.memory.buffer,e,A).toString()+")"}throw new f(o,NA.ERROR[r],A.slice(s))}}catch(A){i.destroy(e,A)}}destroy(){r(this.ptr!=null);r(YA==null);this.llhttp.llhttp_free(this.ptr);this.ptr=null;a.clearTimeout(this.timeout);this.timeout=null;this.timeoutValue=null;this.timeoutType=null;this.paused=false}onStatus(A){this.statusText=A.toString()}onMessageBegin(){const{socket:A,client:e}=this;if(A.destroyed){return-1}const t=e[H][e[W]];if(!t){return-1}}onHeaderField(A){const e=this.headers.length;if((e&1)===0){this.headers.push(A)}else{this.headers[e-1]=Buffer.concat([this.headers[e-1],A])}this.trackHeader(A.length)}onHeaderValue(A){let e=this.headers.length;if((e&1)===1){this.headers.push(A);e+=1}else{this.headers[e-1]=Buffer.concat([this.headers[e-1],A])}const t=this.headers[e-2];if(t.length===10&&t.toString().toLowerCase()==="keep-alive"){this.keepAlive+=A.toString()}else if(t.length===10&&t.toString().toLowerCase()==="connection"){this.connection+=A.toString()}else if(t.length===14&&t.toString().toLowerCase()==="content-length"){this.contentLength+=A.toString()}this.trackHeader(A.length)}trackHeader(A){this.headersSize+=A;if(this.headersSize>=this.headersMaxSize){i.destroy(this.socket,new h)}}onUpgrade(A){const{upgrade:e,client:t,socket:s,headers:o,statusCode:n}=this;r(e);const a=t[H][t[W]];r(a);r(!s.destroyed);r(s===t[Z]);r(!this.paused);r(a.upgrade||a.method==="CONNECT");this.statusCode=null;this.statusText="";this.shouldKeepAlive=null;r(this.headers.length%2===0);this.headers=[];this.headersSize=0;s.unshift(A);s[F].destroy();s[F]=null;s[m]=null;s[q]=null;s.removeListener("error",onSocketError).removeListener("readable",onSocketReadable).removeListener("end",onSocketEnd).removeListener("close",onSocketClose);t[Z]=null;t[H][t[W]++]=null;t.emit("disconnect",t[D],[t],new u("upgrade"));try{a.onUpgrade(n,o,s)}catch(A){i.destroy(s,A)}resume(t)}onHeadersComplete(A,e,t){const{client:s,socket:o,headers:n,statusText:a}=this;if(o.destroyed){return-1}const E=s[H][s[W]];if(!E){return-1}r(!this.upgrade);r(this.statusCode<200);if(A===100){i.destroy(o,new l("bad response",i.getSocketInfo(o)));return-1}if(e&&!E.upgrade){i.destroy(o,new l("bad upgrade",i.getSocketInfo(o)));return-1}r.strictEqual(this.timeoutType,vA);this.statusCode=A;this.shouldKeepAlive=t||E.method==="HEAD"&&!o[w]&&this.connection.toLowerCase()==="keep-alive";if(this.statusCode>=200){const A=E.bodyTimeout!=null?E.bodyTimeout:s[AA];this.setTimeout(A,VA)}else if(this.timeout){if(this.timeout.refresh){this.timeout.refresh()}}if(E.method==="CONNECT"){r(s[L]===1);this.upgrade=true;return 2}if(e){r(s[L]===1);this.upgrade=true;return 2}r(this.headers.length%2===0);this.headers=[];this.headersSize=0;if(this.shouldKeepAlive&&s[_]){const A=this.keepAlive?i.parseKeepAliveTimeout(this.keepAlive):null;if(A!=null){const e=Math.min(A-s[z],s[K]);if(e<=0){o[w]=true}else{s[j]=e}}else{s[j]=s[x]}}else{o[w]=true}const g=E.onHeaders(A,n,this.resume,a)===false;if(E.aborted){return-1}if(E.method==="HEAD"){return 1}if(A<200){return 1}if(o[N]){o[N]=false;resume(s)}return g?NA.ERROR.PAUSED:0}onBody(A){const{client:e,socket:t,statusCode:s,maxResponseSize:o}=this;if(t.destroyed){return-1}const n=e[H][e[W]];r(n);r.strictEqual(this.timeoutType,VA);if(this.timeout){if(this.timeout.refresh){this.timeout.refresh()}}r(s>=200);if(o>-1&&this.bytesRead+A.length>o){i.destroy(t,new p);return-1}this.bytesRead+=A.length;if(n.onData(A)===false){return NA.ERROR.PAUSED}}onMessageComplete(){const{client:A,socket:e,statusCode:t,upgrade:s,headers:o,contentLength:n,bytesRead:a,shouldKeepAlive:E}=this;if(e.destroyed&&(!t||E)){return-1}if(s){return}const g=A[H][A[W]];r(g);r(t>=100);this.statusCode=null;this.statusText="";this.bytesRead=0;this.contentLength="";this.keepAlive="";this.connection="";r(this.headers.length%2===0);this.headers=[];this.headersSize=0;if(t<200){return}if(g.method!=="HEAD"&&n&&a!==parseInt(n,10)){i.destroy(e,new Q);return-1}g.onComplete(o);A[H][A[W]++]=null;if(e[Y]){r.strictEqual(A[L],0);i.destroy(e,new u("reset"));return NA.ERROR.PAUSED}else if(!E){i.destroy(e,new u("reset"));return NA.ERROR.PAUSED}else if(e[w]&&A[L]===0){i.destroy(e,new u("reset"));return NA.ERROR.PAUSED}else if(A[_]===1){setImmediate(resume,A)}else{resume(A)}}}function onParserTimeout(A){const{socket:e,timeoutType:t,client:s}=A;if(t===vA){if(!e[Y]||e.writableNeedDrain||s[L]>1){r(!A.paused,"cannot be paused while waiting for headers");i.destroy(e,new I)}}else if(t===VA){if(!A.paused){i.destroy(e,new d)}}else if(t===xA){r(s[L]===0&&s[j]);i.destroy(e,new u("socket idle timeout"))}}function onSocketReadable(){const{[F]:A}=this;if(A){A.readMore()}}function onSocketError(A){const{[m]:e,[F]:t}=this;r(A.code!=="ERR_TLS_CERT_ALTNAME_INVALID");if(e[QA]!=="h2"){if(A.code==="ECONNRESET"&&t.statusCode&&!t.shouldKeepAlive){t.onMessageComplete();return}}this[q]=A;onError(this[m],A)}function onError(A,e){if(A[L]===0&&e.code!=="UND_ERR_INFO"&&e.code!=="UND_ERR_SOCKET"){r(A[P]===A[W]);const t=A[H].splice(A[W]);for(let r=0;r0&&t.code!=="UND_ERR_INFO"){const e=A[H][A[W]];A[H][A[W]++]=null;errorRequest(A,e,t)}A[P]=A[W];r(A[L]===0);A.emit("disconnect",A[D],[A],t);resume(A)}async function connect(A){r(!A[G]);r(!A[Z]);let{host:e,hostname:t,protocol:o,port:n}=A[D];if(t[0]==="["){const A=t.indexOf("]");r(A!==-1);const e=t.substring(1,A);r(s.isIP(e));t=e}A[G]=true;if(SA.beforeConnect.hasSubscribers){SA.beforeConnect.publish({connectParams:{host:e,hostname:t,protocol:o,port:n,servername:A[k],localAddress:A[gA]},connector:A[tA]})}try{const s=await new Promise(((r,s)=>{A[tA]({host:e,hostname:t,protocol:o,port:n,servername:A[k],localAddress:A[gA]},((A,e)=>{if(A){s(A)}else{r(e)}}))}));if(A.destroyed){i.destroy(s.on("error",(()=>{})),new y);return}A[G]=false;r(s);const a=s.alpnProtocol==="h2";if(a){if(!mA){mA=true;process.emitWarning("H2 support is experimental, expect them to change at any time.",{code:"UNDICI-H2"})}const e=dA.connect(A[D],{createConnection:()=>s,peerMaxConcurrentStreams:A[IA].maxConcurrentStreams});A[QA]="h2";e[m]=A;e[Z]=s;e.on("error",onHttp2SessionError);e.on("frameError",onHttp2FrameError);e.on("end",onHttp2SessionEnd);e.on("goaway",onHTTP2GoAway);e.on("close",onSocketClose);e.unref();A[BA]=e;s[BA]=e}else{if(!MA){MA=await TA;TA=null}s[V]=false;s[Y]=false;s[w]=false;s[N]=false;s[F]=new Parser(A,s,MA)}s[oA]=0;s[sA]=A[sA];s[m]=A;s[q]=null;s.on("error",onSocketError).on("readable",onSocketReadable).on("end",onSocketEnd).on("close",onSocketClose);A[Z]=s;if(SA.connected.hasSubscribers){SA.connected.publish({connectParams:{host:e,hostname:t,protocol:o,port:n,servername:A[k],localAddress:A[gA]},connector:A[tA],socket:s})}A.emit("connect",A[D],[A])}catch(s){if(A.destroyed){return}A[G]=false;if(SA.connectError.hasSubscribers){SA.connectError.publish({connectParams:{host:e,hostname:t,protocol:o,port:n,servername:A[k],localAddress:A[gA]},connector:A[tA],error:s})}if(s.code==="ERR_TLS_CERT_ALTNAME_INVALID"){r(A[L]===0);while(A[M]>0&&A[H][A[P]].servername===A[k]){const e=A[H][A[P]++];errorRequest(A,e,s)}}else{onError(A,s)}A.emit("connectionError",A[D],[A],s)}resume(A)}function emitDrain(A){A[v]=0;A.emit("drain",A[D],[A])}function resume(A,e){if(A[U]===2){return}A[U]=2;_resume(A,e);A[U]=0;if(A[W]>256){A[H].splice(0,A[W]);A[P]-=A[W];A[W]=0}}function _resume(A,e){while(true){if(A.destroyed){r(A[M]===0);return}if(A[FA]&&!A[T]){A[FA]();A[FA]=null;return}const t=A[Z];if(t&&!t.destroyed&&t.alpnProtocol!=="h2"){if(A[T]===0){if(!t[V]&&t.unref){t.unref();t[V]=true}}else if(t[V]&&t.ref){t.ref();t[V]=false}if(A[T]===0){if(t[F].timeoutType!==xA){t[F].setTimeout(A[j],xA)}}else if(A[L]>0&&t[F].statusCode<200){if(t[F].timeoutType!==vA){const e=A[H][A[W]];const r=e.headersTimeout!=null?e.headersTimeout:A[$];t[F].setTimeout(r,vA)}}}if(A[b]){A[v]=2}else if(A[v]===2){if(e){A[v]=1;process.nextTick(emitDrain,A)}else{emitDrain(A)}continue}if(A[M]===0){return}if(A[L]>=(A[_]||1)){return}const s=A[H][A[P]];if(A[D].protocol==="https:"&&A[k]!==s.servername){if(A[L]>0){return}A[k]=s.servername;if(t&&t.servername!==s.servername){i.destroy(t,new u("servername changed"));return}}if(A[G]){return}if(!t&&!A[BA]){connect(A);return}if(t.destroyed||t[Y]||t[w]||t[N]){return}if(A[L]>0&&!s.idempotent){return}if(A[L]>0&&(s.upgrade||s.method==="CONNECT")){return}if(A[L]>0&&i.bodyLength(s.body)!==0&&(i.isStream(s.body)||i.isAsyncIterable(s.body))){return}if(!s.aborted&&write(A,s)){A[P]++}else{A[H].splice(A[P],1)}}}function shouldSendContentLength(A){return A!=="GET"&&A!=="HEAD"&&A!=="OPTIONS"&&A!=="TRACE"&&A!=="CONNECT"}function write(A,e){if(A[QA]==="h2"){writeH2(A,A[BA],e);return}const{body:t,method:s,path:o,host:n,upgrade:a,headers:E,blocking:g,reset:Q}=e;const C=s==="PUT"||s==="POST"||s==="PATCH";if(t&&typeof t.read==="function"){t.read(0)}const I=i.bodyLength(t);let h=I;if(h===null){h=e.contentLength}if(h===0&&!C){h=null}if(shouldSendContentLength(s)&&h>0&&e.contentLength!==null&&e.contentLength!==h){if(A[eA]){errorRequest(A,e,new c);return false}process.emitWarning(new c)}const l=A[Z];try{e.onConnect((t=>{if(e.aborted||e.completed){return}errorRequest(A,e,t||new B);i.destroy(l,new u("aborted"))}))}catch(t){errorRequest(A,e,t)}if(e.aborted){return false}if(s==="HEAD"){l[w]=true}if(a||s==="CONNECT"){l[w]=true}if(Q!=null){l[w]=Q}if(A[sA]&&l[oA]++>=A[sA]){l[w]=true}if(g){l[N]=true}let d=`${s} ${o} HTTP/1.1\r\n`;if(typeof n==="string"){d+=`host: ${n}\r\n`}else{d+=A[O]}if(a){d+=`connection: upgrade\r\nupgrade: ${a}\r\n`}else if(A[_]&&!l[w]){d+="connection: keep-alive\r\n"}else{d+="connection: close\r\n"}if(E){d+=E}if(SA.sendHeaders.hasSubscribers){SA.sendHeaders.publish({request:e,headers:d,socket:l})}if(!t||I===0){if(h===0){l.write(`${d}content-length: 0\r\n\r\n`,"latin1")}else{r(h===null,"no body must not have content length");l.write(`${d}\r\n`,"latin1")}e.onRequestSent()}else if(i.isBuffer(t)){r(h===t.byteLength,"buffer body must have content length");l.cork();l.write(`${d}content-length: ${h}\r\n\r\n`,"latin1");l.write(t);l.uncork();e.onBodySent(t);e.onRequestSent();if(!C){l[w]=true}}else if(i.isBlobLike(t)){if(typeof t.stream==="function"){writeIterable({body:t.stream(),client:A,request:e,socket:l,contentLength:h,header:d,expectsPayload:C})}else{writeBlob({body:t,client:A,request:e,socket:l,contentLength:h,header:d,expectsPayload:C})}}else if(i.isStream(t)){writeStream({body:t,client:A,request:e,socket:l,contentLength:h,header:d,expectsPayload:C})}else if(i.isIterable(t)){writeIterable({body:t,client:A,request:e,socket:l,contentLength:h,header:d,expectsPayload:C})}else{r(false)}return true}function writeH2(A,e,t){const{body:s,method:o,path:n,host:a,upgrade:g,expectContinue:Q,signal:C,headers:I}=t;let h;if(typeof I==="string")h=E[lA](I.trim());else h=I;if(g){errorRequest(A,t,new Error("Upgrade not supported for H2"));return false}try{t.onConnect((e=>{if(t.aborted||t.completed){return}errorRequest(A,t,e||new B)}))}catch(e){errorRequest(A,t,e)}if(t.aborted){return false}let l;const d=A[IA];h[fA]=a||A[CA];h[pA]=o;if(o==="CONNECT"){e.ref();l=e.request(h,{endStream:false,signal:C});if(l.id&&!l.pending){t.onUpgrade(null,null,l);++d.openStreams}else{l.once("ready",(()=>{t.onUpgrade(null,null,l);++d.openStreams}))}l.once("close",(()=>{d.openStreams-=1;if(d.openStreams===0)e.unref()}));return true}h[yA]=n;h[RA]="https";const f=o==="PUT"||o==="POST"||o==="PATCH";if(s&&typeof s.read==="function"){s.read(0)}let p=i.bodyLength(s);if(p==null){p=t.contentLength}if(p===0||!f){p=null}if(shouldSendContentLength(o)&&p>0&&t.contentLength!=null&&t.contentLength!==p){if(A[eA]){errorRequest(A,t,new c);return false}process.emitWarning(new c)}if(p!=null){r(s,"no body must not have content length");h[DA]=`${p}`}e.ref();const y=o==="GET"||o==="HEAD";if(Q){h[wA]="100-continue";l=e.request(h,{endStream:y,signal:C});l.once("continue",writeBodyH2)}else{l=e.request(h,{endStream:y,signal:C});writeBodyH2()}++d.openStreams;l.once("response",(A=>{const{[kA]:e,...r}=A;if(t.onHeaders(Number(e),r,l.resume.bind(l),"")===false){l.pause()}}));l.once("end",(()=>{t.onComplete([])}));l.on("data",(A=>{if(t.onData(A)===false){l.pause()}}));l.once("close",(()=>{d.openStreams-=1;if(d.openStreams===0){e.unref()}}));l.once("error",(function(e){if(A[BA]&&!A[BA].destroyed&&!this.closed&&!this.destroyed){d.streams-=1;i.destroy(l,e)}}));l.once("frameError",((e,r)=>{const s=new u(`HTTP/2: "frameError" received - type ${e}, code ${r}`);errorRequest(A,t,s);if(A[BA]&&!A[BA].destroyed&&!this.closed&&!this.destroyed){d.streams-=1;i.destroy(l,s)}}));return true;function writeBodyH2(){if(!s){t.onRequestSent()}else if(i.isBuffer(s)){r(p===s.byteLength,"buffer body must have content length");l.cork();l.write(s);l.uncork();l.end();t.onBodySent(s);t.onRequestSent()}else if(i.isBlobLike(s)){if(typeof s.stream==="function"){writeIterable({client:A,request:t,contentLength:p,h2stream:l,expectsPayload:f,body:s.stream(),socket:A[Z],header:""})}else{writeBlob({body:s,client:A,request:t,contentLength:p,expectsPayload:f,h2stream:l,header:"",socket:A[Z]})}}else if(i.isStream(s)){writeStream({body:s,client:A,request:t,contentLength:p,expectsPayload:f,socket:A[Z],h2stream:l,header:""})}else if(i.isIterable(s)){writeIterable({body:s,client:A,request:t,contentLength:p,expectsPayload:f,header:"",h2stream:l,socket:A[Z]})}else{r(false)}}}function writeStream({h2stream:A,body:e,client:t,request:s,socket:o,contentLength:a,header:E,expectsPayload:g}){r(a!==0||t[L]===0,"stream body cannot be pipelined");if(t[QA]==="h2"){const C=n(e,A,(t=>{if(t){i.destroy(e,t);i.destroy(A,t)}else{s.onRequestSent()}}));C.on("data",onPipeData);C.once("end",(()=>{C.removeListener("data",onPipeData);i.destroy(C)}));function onPipeData(A){s.onBodySent(A)}return}let c=false;const Q=new AsyncWriter({socket:o,request:s,contentLength:a,client:t,expectsPayload:g,header:E});const onData=function(A){if(c){return}try{if(!Q.write(A)&&this.pause){this.pause()}}catch(A){i.destroy(this,A)}};const onDrain=function(){if(c){return}if(e.resume){e.resume()}};const onAbort=function(){if(c){return}const A=new B;queueMicrotask((()=>onFinished(A)))};const onFinished=function(A){if(c){return}c=true;r(o.destroyed||o[Y]&&t[L]<=1);o.off("drain",onDrain).off("error",onFinished);e.removeListener("data",onData).removeListener("end",onFinished).removeListener("error",onFinished).removeListener("close",onAbort);if(!A){try{Q.end()}catch(e){A=e}}Q.destroy(A);if(A&&(A.code!=="UND_ERR_INFO"||A.message!=="reset")){i.destroy(e,A)}else{i.destroy(e)}};e.on("data",onData).on("end",onFinished).on("error",onFinished).on("close",onAbort);if(e.resume){e.resume()}o.on("drain",onDrain).on("error",onFinished)}async function writeBlob({h2stream:A,body:e,client:t,request:s,socket:o,contentLength:n,header:a,expectsPayload:E}){r(n===e.size,"blob body must have content length");const g=t[QA]==="h2";try{if(n!=null&&n!==e.size){throw new c}const r=Buffer.from(await e.arrayBuffer());if(g){A.cork();A.write(r);A.uncork()}else{o.cork();o.write(`${a}content-length: ${n}\r\n\r\n`,"latin1");o.write(r);o.uncork()}s.onBodySent(r);s.onRequestSent();if(!E){o[w]=true}resume(t)}catch(e){i.destroy(g?A:o,e)}}async function writeIterable({h2stream:A,body:e,client:t,request:s,socket:o,contentLength:n,header:i,expectsPayload:a}){r(n!==0||t[L]===0,"iterator body cannot be pipelined");let E=null;function onDrain(){if(E){const A=E;E=null;A()}}const waitForDrain=()=>new Promise(((A,e)=>{r(E===null);if(o[q]){e(o[q])}else{E=A}}));if(t[QA]==="h2"){A.on("close",onDrain).on("drain",onDrain);try{for await(const t of e){if(o[q]){throw o[q]}const e=A.write(t);s.onBodySent(t);if(!e){await waitForDrain()}}}catch(e){A.destroy(e)}finally{s.onRequestSent();A.end();A.off("close",onDrain).off("drain",onDrain)}return}o.on("close",onDrain).on("drain",onDrain);const g=new AsyncWriter({socket:o,request:s,contentLength:n,client:t,expectsPayload:a,header:i});try{for await(const A of e){if(o[q]){throw o[q]}if(!g.write(A)){await waitForDrain()}}g.end()}catch(A){g.destroy(A)}finally{o.off("close",onDrain).off("drain",onDrain)}}class AsyncWriter{constructor({socket:A,request:e,contentLength:t,client:r,expectsPayload:s,header:o}){this.socket=A;this.request=e;this.contentLength=t;this.client=r;this.bytesWritten=0;this.expectsPayload=s;this.header=o;A[Y]=true}write(A){const{socket:e,request:t,contentLength:r,client:s,bytesWritten:o,expectsPayload:n,header:i}=this;if(e[q]){throw e[q]}if(e.destroyed){return false}const a=Buffer.byteLength(A);if(!a){return true}if(r!==null&&o+a>r){if(s[eA]){throw new c}process.emitWarning(new c)}e.cork();if(o===0){if(!n){e[w]=true}if(r===null){e.write(`${i}transfer-encoding: chunked\r\n`,"latin1")}else{e.write(`${i}content-length: ${r}\r\n\r\n`,"latin1")}}if(r===null){e.write(`\r\n${a.toString(16)}\r\n`,"latin1")}this.bytesWritten+=a;const E=e.write(A);e.uncork();t.onBodySent(A);if(!E){if(e[F].timeout&&e[F].timeoutType===vA){if(e[F].timeout.refresh){e[F].timeout.refresh()}}}return E}end(){const{socket:A,contentLength:e,client:t,bytesWritten:r,expectsPayload:s,header:o,request:n}=this;n.onRequestSent();A[Y]=false;if(A[q]){throw A[q]}if(A.destroyed){return}if(r===0){if(s){A.write(`${o}content-length: 0\r\n\r\n`,"latin1")}else{A.write(`${o}\r\n`,"latin1")}}else if(e===null){A.write("\r\n0\r\n\r\n","latin1")}if(e!==null&&r!==e){if(t[eA]){throw new c}else{process.emitWarning(new c)}}if(A[F].timeout&&A[F].timeoutType===vA){if(A[F].timeout.refresh){A[F].timeout.refresh()}}resume(t)}destroy(A){const{socket:e,client:t}=this;e[Y]=false;if(A){r(t[L]<=1,"pipeline should only contain this request");i.destroy(e,A)}}}function errorRequest(A,e,t){try{e.onError(t);r(e.aborted)}catch(t){A.emit("error",t)}}A.exports=Client},3194:(A,e,t)=>{"use strict";const{kConnected:r,kSize:s}=t(6443);class CompatWeakRef{constructor(A){this.value=A}deref(){return this.value[r]===0&&this.value[s]===0?undefined:this.value}}class CompatFinalizer{constructor(A){this.finalizer=A}register(A,e){if(A.on){A.on("disconnect",(()=>{if(A[r]===0&&A[s]===0){this.finalizer(e)}}))}}}A.exports=function(){if(process.env.NODE_V8_COVERAGE){return{WeakRef:CompatWeakRef,FinalizationRegistry:CompatFinalizer}}return{WeakRef:global.WeakRef||CompatWeakRef,FinalizationRegistry:global.FinalizationRegistry||CompatFinalizer}}},9237:A=>{"use strict";const e=1024;const t=4096;A.exports={maxAttributeValueSize:e,maxNameValuePairSize:t}},3168:(A,e,t)=>{"use strict";const{parseSetCookie:r}=t(8915);const{stringify:s,getHeadersList:o}=t(3834);const{webidl:n}=t(4222);const{Headers:i}=t(6349);function getCookies(A){n.argumentLengthCheck(arguments,1,{header:"getCookies"});n.brandCheck(A,i,{strict:false});const e=A.get("cookie");const t={};if(!e){return t}for(const A of e.split(";")){const[e,...r]=A.split("=");t[e.trim()]=r.join("=")}return t}function deleteCookie(A,e,t){n.argumentLengthCheck(arguments,2,{header:"deleteCookie"});n.brandCheck(A,i,{strict:false});e=n.converters.DOMString(e);t=n.converters.DeleteCookieAttributes(t);setCookie(A,{name:e,value:"",expires:new Date(0),...t})}function getSetCookies(A){n.argumentLengthCheck(arguments,1,{header:"getSetCookies"});n.brandCheck(A,i,{strict:false});const e=o(A).cookies;if(!e){return[]}return e.map((A=>r(Array.isArray(A)?A[1]:A)))}function setCookie(A,e){n.argumentLengthCheck(arguments,2,{header:"setCookie"});n.brandCheck(A,i,{strict:false});e=n.converters.Cookie(e);const t=s(e);if(t){A.append("Set-Cookie",s(e))}}n.converters.DeleteCookieAttributes=n.dictionaryConverter([{converter:n.nullableConverter(n.converters.DOMString),key:"path",defaultValue:null},{converter:n.nullableConverter(n.converters.DOMString),key:"domain",defaultValue:null}]);n.converters.Cookie=n.dictionaryConverter([{converter:n.converters.DOMString,key:"name"},{converter:n.converters.DOMString,key:"value"},{converter:n.nullableConverter((A=>{if(typeof A==="number"){return n.converters["unsigned long long"](A)}return new Date(A)})),key:"expires",defaultValue:null},{converter:n.nullableConverter(n.converters["long long"]),key:"maxAge",defaultValue:null},{converter:n.nullableConverter(n.converters.DOMString),key:"domain",defaultValue:null},{converter:n.nullableConverter(n.converters.DOMString),key:"path",defaultValue:null},{converter:n.nullableConverter(n.converters.boolean),key:"secure",defaultValue:null},{converter:n.nullableConverter(n.converters.boolean),key:"httpOnly",defaultValue:null},{converter:n.converters.USVString,key:"sameSite",allowedValues:["Strict","Lax","None"]},{converter:n.sequenceConverter(n.converters.DOMString),key:"unparsed",defaultValue:[]}]);A.exports={getCookies:getCookies,deleteCookie:deleteCookie,getSetCookies:getSetCookies,setCookie:setCookie}},8915:(A,e,t)=>{"use strict";const{maxNameValuePairSize:r,maxAttributeValueSize:s}=t(9237);const{isCTLExcludingHtab:o}=t(3834);const{collectASequenceOfCodePointsFast:n}=t(4322);const i=t(2613);function parseSetCookie(A){if(o(A)){return null}let e="";let t="";let s="";let i="";if(A.includes(";")){const r={position:0};e=n(";",A,r);t=A.slice(r.position)}else{e=A}if(!e.includes("=")){i=e}else{const A={position:0};s=n("=",e,A);i=e.slice(A.position+1)}s=s.trim();i=i.trim();if(s.length+i.length>r){return null}return{name:s,value:i,...parseUnparsedAttributes(t)}}function parseUnparsedAttributes(A,e={}){if(A.length===0){return e}i(A[0]===";");A=A.slice(1);let t="";if(A.includes(";")){t=n(";",A,{position:0});A=A.slice(t.length)}else{t=A;A=""}let r="";let o="";if(t.includes("=")){const A={position:0};r=n("=",t,A);o=t.slice(A.position+1)}else{r=t}r=r.trim();o=o.trim();if(o.length>s){return parseUnparsedAttributes(A,e)}const a=r.toLowerCase();if(a==="expires"){const A=new Date(o);e.expires=A}else if(a==="max-age"){const t=o.charCodeAt(0);if((t<48||t>57)&&o[0]!=="-"){return parseUnparsedAttributes(A,e)}if(!/^\d+$/.test(o)){return parseUnparsedAttributes(A,e)}const r=Number(o);e.maxAge=r}else if(a==="domain"){let A=o;if(A[0]==="."){A=A.slice(1)}A=A.toLowerCase();e.domain=A}else if(a==="path"){let A="";if(o.length===0||o[0]!=="/"){A="/"}else{A=o}e.path=A}else if(a==="secure"){e.secure=true}else if(a==="httponly"){e.httpOnly=true}else if(a==="samesite"){let A="Default";const t=o.toLowerCase();if(t.includes("none")){A="None"}if(t.includes("strict")){A="Strict"}if(t.includes("lax")){A="Lax"}e.sameSite=A}else{e.unparsed??=[];e.unparsed.push(`${r}=${o}`)}return parseUnparsedAttributes(A,e)}A.exports={parseSetCookie:parseSetCookie,parseUnparsedAttributes:parseUnparsedAttributes}},3834:(A,e,t)=>{"use strict";const r=t(2613);const{kHeadersList:s}=t(6443);function isCTLExcludingHtab(A){if(A.length===0){return false}for(const e of A){const A=e.charCodeAt(0);if(A>=0||A<=8||(A>=10||A<=31)||A===127){return false}}}function validateCookieName(A){for(const e of A){const A=e.charCodeAt(0);if(A<=32||A>127||e==="("||e===")"||e===">"||e==="<"||e==="@"||e===","||e===";"||e===":"||e==="\\"||e==='"'||e==="/"||e==="["||e==="]"||e==="?"||e==="="||e==="{"||e==="}"){throw new Error("Invalid cookie name")}}}function validateCookieValue(A){for(const e of A){const A=e.charCodeAt(0);if(A<33||A===34||A===44||A===59||A===92||A>126){throw new Error("Invalid header value")}}}function validateCookiePath(A){for(const e of A){const A=e.charCodeAt(0);if(A<33||e===";"){throw new Error("Invalid cookie path")}}}function validateCookieDomain(A){if(A.startsWith("-")||A.endsWith(".")||A.endsWith("-")){throw new Error("Invalid cookie domain")}}function toIMFDate(A){if(typeof A==="number"){A=new Date(A)}const e=["Sun","Mon","Tue","Wed","Thu","Fri","Sat"];const t=["Jan","Feb","Mar","Apr","May","Jun","Jul","Aug","Sep","Oct","Nov","Dec"];const r=e[A.getUTCDay()];const s=A.getUTCDate().toString().padStart(2,"0");const o=t[A.getUTCMonth()];const n=A.getUTCFullYear();const i=A.getUTCHours().toString().padStart(2,"0");const a=A.getUTCMinutes().toString().padStart(2,"0");const E=A.getUTCSeconds().toString().padStart(2,"0");return`${r}, ${s} ${o} ${n} ${i}:${a}:${E} GMT`}function validateCookieMaxAge(A){if(A<0){throw new Error("Invalid cookie max-age")}}function stringify(A){if(A.name.length===0){return null}validateCookieName(A.name);validateCookieValue(A.value);const e=[`${A.name}=${A.value}`];if(A.name.startsWith("__Secure-")){A.secure=true}if(A.name.startsWith("__Host-")){A.secure=true;A.domain=null;A.path="/"}if(A.secure){e.push("Secure")}if(A.httpOnly){e.push("HttpOnly")}if(typeof A.maxAge==="number"){validateCookieMaxAge(A.maxAge);e.push(`Max-Age=${A.maxAge}`)}if(A.domain){validateCookieDomain(A.domain);e.push(`Domain=${A.domain}`)}if(A.path){validateCookiePath(A.path);e.push(`Path=${A.path}`)}if(A.expires&&A.expires.toString()!=="Invalid Date"){e.push(`Expires=${toIMFDate(A.expires)}`)}if(A.sameSite){e.push(`SameSite=${A.sameSite}`)}for(const t of A.unparsed){if(!t.includes("=")){throw new Error("Invalid unparsed")}const[A,...r]=t.split("=");e.push(`${A.trim()}=${r.join("=")}`)}return e.join("; ")}let o;function getHeadersList(A){if(A[s]){return A[s]}if(!o){o=Object.getOwnPropertySymbols(A).find((A=>A.description==="headers list"));r(o,"Headers cannot be parsed")}const e=A[o];r(e);return e}A.exports={isCTLExcludingHtab:isCTLExcludingHtab,stringify:stringify,getHeadersList:getHeadersList}},9136:(A,e,t)=>{"use strict";const r=t(9278);const s=t(2613);const o=t(3440);const{InvalidArgumentError:n,ConnectTimeoutError:i}=t(8707);let a;let E;if(global.FinalizationRegistry&&!process.env.NODE_V8_COVERAGE){E=class WeakSessionCache{constructor(A){this._maxCachedSessions=A;this._sessionCache=new Map;this._sessionRegistry=new global.FinalizationRegistry((A=>{if(this._sessionCache.size=this._maxCachedSessions){const{value:A}=this._sessionCache.keys().next();this._sessionCache.delete(A)}this._sessionCache.set(A,e)}}}function buildConnector({allowH2:A,maxCachedSessions:e,socketPath:i,timeout:g,...c}){if(e!=null&&(!Number.isInteger(e)||e<0)){throw new n("maxCachedSessions must be a positive integer or zero")}const Q={path:i,...c};const C=new E(e==null?100:e);g=g==null?1e4:g;A=A!=null?A:false;return function connect({hostname:e,host:n,protocol:i,port:E,servername:c,localAddress:B,httpSocket:I},h){let l;if(i==="https:"){if(!a){a=t(4756)}c=c||Q.servername||o.getServerName(n)||null;const r=c||e;const i=C.get(r)||null;s(r);l=a.connect({highWaterMark:16384,...Q,servername:c,session:i,localAddress:B,ALPNProtocols:A?["http/1.1","h2"]:["http/1.1"],socket:I,port:E||443,host:e});l.on("session",(function(A){C.set(r,A)}))}else{s(!I,"httpSocket can only be sent on TLS update");l=r.connect({highWaterMark:64*1024,...Q,localAddress:B,port:E||80,host:e})}if(Q.keepAlive==null||Q.keepAlive){const A=Q.keepAliveInitialDelay===undefined?6e4:Q.keepAliveInitialDelay;l.setKeepAlive(true,A)}const u=setupTimeout((()=>onConnectTimeout(l)),g);l.setNoDelay(true).once(i==="https:"?"secureConnect":"connect",(function(){u();if(h){const A=h;h=null;A(null,this)}})).on("error",(function(A){u();if(h){const e=h;h=null;e(A)}}));return l}}function setupTimeout(A,e){if(!e){return()=>{}}let t=null;let r=null;const s=setTimeout((()=>{t=setImmediate((()=>{if(process.platform==="win32"){r=setImmediate((()=>A()))}else{A()}}))}),e);return()=>{clearTimeout(s);clearImmediate(t);clearImmediate(r)}}function onConnectTimeout(A){o.destroy(A,new i)}A.exports=buildConnector},735:A=>{"use strict";const e={};const t=["Accept","Accept-Encoding","Accept-Language","Accept-Ranges","Access-Control-Allow-Credentials","Access-Control-Allow-Headers","Access-Control-Allow-Methods","Access-Control-Allow-Origin","Access-Control-Expose-Headers","Access-Control-Max-Age","Access-Control-Request-Headers","Access-Control-Request-Method","Age","Allow","Alt-Svc","Alt-Used","Authorization","Cache-Control","Clear-Site-Data","Connection","Content-Disposition","Content-Encoding","Content-Language","Content-Length","Content-Location","Content-Range","Content-Security-Policy","Content-Security-Policy-Report-Only","Content-Type","Cookie","Cross-Origin-Embedder-Policy","Cross-Origin-Opener-Policy","Cross-Origin-Resource-Policy","Date","Device-Memory","Downlink","ECT","ETag","Expect","Expect-CT","Expires","Forwarded","From","Host","If-Match","If-Modified-Since","If-None-Match","If-Range","If-Unmodified-Since","Keep-Alive","Last-Modified","Link","Location","Max-Forwards","Origin","Permissions-Policy","Pragma","Proxy-Authenticate","Proxy-Authorization","RTT","Range","Referer","Referrer-Policy","Refresh","Retry-After","Sec-WebSocket-Accept","Sec-WebSocket-Extensions","Sec-WebSocket-Key","Sec-WebSocket-Protocol","Sec-WebSocket-Version","Server","Server-Timing","Service-Worker-Allowed","Service-Worker-Navigation-Preload","Set-Cookie","SourceMap","Strict-Transport-Security","Supports-Loading-Mode","TE","Timing-Allow-Origin","Trailer","Transfer-Encoding","Upgrade","Upgrade-Insecure-Requests","User-Agent","Vary","Via","WWW-Authenticate","X-Content-Type-Options","X-DNS-Prefetch-Control","X-Frame-Options","X-Permitted-Cross-Domain-Policies","X-Powered-By","X-Requested-With","X-XSS-Protection"];for(let A=0;A{"use strict";class UndiciError extends Error{constructor(A){super(A);this.name="UndiciError";this.code="UND_ERR"}}class ConnectTimeoutError extends UndiciError{constructor(A){super(A);Error.captureStackTrace(this,ConnectTimeoutError);this.name="ConnectTimeoutError";this.message=A||"Connect Timeout Error";this.code="UND_ERR_CONNECT_TIMEOUT"}}class HeadersTimeoutError extends UndiciError{constructor(A){super(A);Error.captureStackTrace(this,HeadersTimeoutError);this.name="HeadersTimeoutError";this.message=A||"Headers Timeout Error";this.code="UND_ERR_HEADERS_TIMEOUT"}}class HeadersOverflowError extends UndiciError{constructor(A){super(A);Error.captureStackTrace(this,HeadersOverflowError);this.name="HeadersOverflowError";this.message=A||"Headers Overflow Error";this.code="UND_ERR_HEADERS_OVERFLOW"}}class BodyTimeoutError extends UndiciError{constructor(A){super(A);Error.captureStackTrace(this,BodyTimeoutError);this.name="BodyTimeoutError";this.message=A||"Body Timeout Error";this.code="UND_ERR_BODY_TIMEOUT"}}class ResponseStatusCodeError extends UndiciError{constructor(A,e,t,r){super(A);Error.captureStackTrace(this,ResponseStatusCodeError);this.name="ResponseStatusCodeError";this.message=A||"Response Status Code Error";this.code="UND_ERR_RESPONSE_STATUS_CODE";this.body=r;this.status=e;this.statusCode=e;this.headers=t}}class InvalidArgumentError extends UndiciError{constructor(A){super(A);Error.captureStackTrace(this,InvalidArgumentError);this.name="InvalidArgumentError";this.message=A||"Invalid Argument Error";this.code="UND_ERR_INVALID_ARG"}}class InvalidReturnValueError extends UndiciError{constructor(A){super(A);Error.captureStackTrace(this,InvalidReturnValueError);this.name="InvalidReturnValueError";this.message=A||"Invalid Return Value Error";this.code="UND_ERR_INVALID_RETURN_VALUE"}}class RequestAbortedError extends UndiciError{constructor(A){super(A);Error.captureStackTrace(this,RequestAbortedError);this.name="AbortError";this.message=A||"Request aborted";this.code="UND_ERR_ABORTED"}}class InformationalError extends UndiciError{constructor(A){super(A);Error.captureStackTrace(this,InformationalError);this.name="InformationalError";this.message=A||"Request information";this.code="UND_ERR_INFO"}}class RequestContentLengthMismatchError extends UndiciError{constructor(A){super(A);Error.captureStackTrace(this,RequestContentLengthMismatchError);this.name="RequestContentLengthMismatchError";this.message=A||"Request body length does not match content-length header";this.code="UND_ERR_REQ_CONTENT_LENGTH_MISMATCH"}}class ResponseContentLengthMismatchError extends UndiciError{constructor(A){super(A);Error.captureStackTrace(this,ResponseContentLengthMismatchError);this.name="ResponseContentLengthMismatchError";this.message=A||"Response body length does not match content-length header";this.code="UND_ERR_RES_CONTENT_LENGTH_MISMATCH"}}class ClientDestroyedError extends UndiciError{constructor(A){super(A);Error.captureStackTrace(this,ClientDestroyedError);this.name="ClientDestroyedError";this.message=A||"The client is destroyed";this.code="UND_ERR_DESTROYED"}}class ClientClosedError extends UndiciError{constructor(A){super(A);Error.captureStackTrace(this,ClientClosedError);this.name="ClientClosedError";this.message=A||"The client is closed";this.code="UND_ERR_CLOSED"}}class SocketError extends UndiciError{constructor(A,e){super(A);Error.captureStackTrace(this,SocketError);this.name="SocketError";this.message=A||"Socket error";this.code="UND_ERR_SOCKET";this.socket=e}}class NotSupportedError extends UndiciError{constructor(A){super(A);Error.captureStackTrace(this,NotSupportedError);this.name="NotSupportedError";this.message=A||"Not supported error";this.code="UND_ERR_NOT_SUPPORTED"}}class BalancedPoolMissingUpstreamError extends UndiciError{constructor(A){super(A);Error.captureStackTrace(this,NotSupportedError);this.name="MissingUpstreamError";this.message=A||"No upstream has been added to the BalancedPool";this.code="UND_ERR_BPL_MISSING_UPSTREAM"}}class HTTPParserError extends Error{constructor(A,e,t){super(A);Error.captureStackTrace(this,HTTPParserError);this.name="HTTPParserError";this.code=e?`HPE_${e}`:undefined;this.data=t?t.toString():undefined}}class ResponseExceededMaxSizeError extends UndiciError{constructor(A){super(A);Error.captureStackTrace(this,ResponseExceededMaxSizeError);this.name="ResponseExceededMaxSizeError";this.message=A||"Response content exceeded max size";this.code="UND_ERR_RES_EXCEEDED_MAX_SIZE"}}class RequestRetryError extends UndiciError{constructor(A,e,{headers:t,data:r}){super(A);Error.captureStackTrace(this,RequestRetryError);this.name="RequestRetryError";this.message=A||"Request retry error";this.code="UND_ERR_REQ_RETRY";this.statusCode=e;this.data=r;this.headers=t}}A.exports={HTTPParserError:HTTPParserError,UndiciError:UndiciError,HeadersTimeoutError:HeadersTimeoutError,HeadersOverflowError:HeadersOverflowError,BodyTimeoutError:BodyTimeoutError,RequestContentLengthMismatchError:RequestContentLengthMismatchError,ConnectTimeoutError:ConnectTimeoutError,ResponseStatusCodeError:ResponseStatusCodeError,InvalidArgumentError:InvalidArgumentError,InvalidReturnValueError:InvalidReturnValueError,RequestAbortedError:RequestAbortedError,ClientDestroyedError:ClientDestroyedError,ClientClosedError:ClientClosedError,InformationalError:InformationalError,SocketError:SocketError,NotSupportedError:NotSupportedError,ResponseContentLengthMismatchError:ResponseContentLengthMismatchError,BalancedPoolMissingUpstreamError:BalancedPoolMissingUpstreamError,ResponseExceededMaxSizeError:ResponseExceededMaxSizeError,RequestRetryError:RequestRetryError}},4655:(A,e,t)=>{"use strict";const{InvalidArgumentError:r,NotSupportedError:s}=t(8707);const o=t(2613);const{kHTTP2BuildRequest:n,kHTTP2CopyHeaders:i,kHTTP1BuildRequest:a}=t(6443);const E=t(3440);const g=/^[\^_`a-zA-Z\-0-9!#$%&'*+.|~]+$/;const c=/[^\t\x20-\x7e\x80-\xff]/;const Q=/[^\u0021-\u00ff]/;const C=Symbol("handler");const B={};let I;try{const A=t(1637);B.create=A.channel("undici:request:create");B.bodySent=A.channel("undici:request:bodySent");B.headers=A.channel("undici:request:headers");B.trailers=A.channel("undici:request:trailers");B.error=A.channel("undici:request:error")}catch{B.create={hasSubscribers:false};B.bodySent={hasSubscribers:false};B.headers={hasSubscribers:false};B.trailers={hasSubscribers:false};B.error={hasSubscribers:false}}class Request{constructor(A,{path:e,method:s,body:o,headers:n,query:i,idempotent:a,blocking:c,upgrade:h,headersTimeout:l,bodyTimeout:u,reset:d,throwOnError:f,expectContinue:p},y){if(typeof e!=="string"){throw new r("path must be a string")}else if(e[0]!=="/"&&!(e.startsWith("http://")||e.startsWith("https://"))&&s!=="CONNECT"){throw new r("path must be an absolute URL or start with a slash")}else if(Q.exec(e)!==null){throw new r("invalid request path")}if(typeof s!=="string"){throw new r("method must be a string")}else if(g.exec(s)===null){throw new r("invalid request method")}if(h&&typeof h!=="string"){throw new r("upgrade must be a string")}if(l!=null&&(!Number.isFinite(l)||l<0)){throw new r("invalid headersTimeout")}if(u!=null&&(!Number.isFinite(u)||u<0)){throw new r("invalid bodyTimeout")}if(d!=null&&typeof d!=="boolean"){throw new r("invalid reset")}if(p!=null&&typeof p!=="boolean"){throw new r("invalid expectContinue")}this.headersTimeout=l;this.bodyTimeout=u;this.throwOnError=f===true;this.method=s;this.abort=null;if(o==null){this.body=null}else if(E.isStream(o)){this.body=o;const A=this.body._readableState;if(!A||!A.autoDestroy){this.endHandler=function autoDestroy(){E.destroy(this)};this.body.on("end",this.endHandler)}this.errorHandler=A=>{if(this.abort){this.abort(A)}else{this.error=A}};this.body.on("error",this.errorHandler)}else if(E.isBuffer(o)){this.body=o.byteLength?o:null}else if(ArrayBuffer.isView(o)){this.body=o.buffer.byteLength?Buffer.from(o.buffer,o.byteOffset,o.byteLength):null}else if(o instanceof ArrayBuffer){this.body=o.byteLength?Buffer.from(o):null}else if(typeof o==="string"){this.body=o.length?Buffer.from(o):null}else if(E.isFormDataLike(o)||E.isIterable(o)||E.isBlobLike(o)){this.body=o}else{throw new r("body must be a string, a Buffer, a Readable stream, an iterable, or an async iterable")}this.completed=false;this.aborted=false;this.upgrade=h||null;this.path=i?E.buildURL(e,i):e;this.origin=A;this.idempotent=a==null?s==="HEAD"||s==="GET":a;this.blocking=c==null?false:c;this.reset=d==null?null:d;this.host=null;this.contentLength=null;this.contentType=null;this.headers="";this.expectContinue=p!=null?p:false;if(Array.isArray(n)){if(n.length%2!==0){throw new r("headers array must be even")}for(let A=0;A{A.exports={kClose:Symbol("close"),kDestroy:Symbol("destroy"),kDispatch:Symbol("dispatch"),kUrl:Symbol("url"),kWriting:Symbol("writing"),kResuming:Symbol("resuming"),kQueue:Symbol("queue"),kConnect:Symbol("connect"),kConnecting:Symbol("connecting"),kHeadersList:Symbol("headers list"),kKeepAliveDefaultTimeout:Symbol("default keep alive timeout"),kKeepAliveMaxTimeout:Symbol("max keep alive timeout"),kKeepAliveTimeoutThreshold:Symbol("keep alive timeout threshold"),kKeepAliveTimeoutValue:Symbol("keep alive timeout"),kKeepAlive:Symbol("keep alive"),kHeadersTimeout:Symbol("headers timeout"),kBodyTimeout:Symbol("body timeout"),kServerName:Symbol("server name"),kLocalAddress:Symbol("local address"),kHost:Symbol("host"),kNoRef:Symbol("no ref"),kBodyUsed:Symbol("used"),kRunning:Symbol("running"),kBlocking:Symbol("blocking"),kPending:Symbol("pending"),kSize:Symbol("size"),kBusy:Symbol("busy"),kQueued:Symbol("queued"),kFree:Symbol("free"),kConnected:Symbol("connected"),kClosed:Symbol("closed"),kNeedDrain:Symbol("need drain"),kReset:Symbol("reset"),kDestroyed:Symbol.for("nodejs.stream.destroyed"),kMaxHeadersSize:Symbol("max headers size"),kRunningIdx:Symbol("running index"),kPendingIdx:Symbol("pending index"),kError:Symbol("error"),kClients:Symbol("clients"),kClient:Symbol("client"),kParser:Symbol("parser"),kOnDestroyed:Symbol("destroy callbacks"),kPipelining:Symbol("pipelining"),kSocket:Symbol("socket"),kHostHeader:Symbol("host header"),kConnector:Symbol("connector"),kStrictContentLength:Symbol("strict content length"),kMaxRedirections:Symbol("maxRedirections"),kMaxRequests:Symbol("maxRequestsPerClient"),kProxy:Symbol("proxy agent options"),kCounter:Symbol("socket request counter"),kInterceptors:Symbol("dispatch interceptors"),kMaxResponseSize:Symbol("max response size"),kHTTP2Session:Symbol("http2Session"),kHTTP2SessionState:Symbol("http2Session state"),kHTTP2BuildRequest:Symbol("http2 build request"),kHTTP1BuildRequest:Symbol("http1 build request"),kHTTP2CopyHeaders:Symbol("http2 copy headers"),kHTTPConnVersion:Symbol("http connection version"),kRetryHandlerDefaultRetry:Symbol("retry agent default retry"),kConstruct:Symbol("constructable")}},3440:(A,e,t)=>{"use strict";const r=t(2613);const{kDestroyed:s,kBodyUsed:o}=t(6443);const{IncomingMessage:n}=t(8611);const i=t(2203);const a=t(9278);const{InvalidArgumentError:E}=t(8707);const{Blob:g}=t(181);const c=t(9023);const{stringify:Q}=t(3480);const{headerNameLowerCasedRecord:C}=t(735);const[B,I]=process.versions.node.split(".").map((A=>Number(A)));function nop(){}function isStream(A){return A&&typeof A==="object"&&typeof A.pipe==="function"&&typeof A.on==="function"}function isBlobLike(A){return g&&A instanceof g||A&&typeof A==="object"&&(typeof A.stream==="function"||typeof A.arrayBuffer==="function")&&/^(Blob|File)$/.test(A[Symbol.toStringTag])}function buildURL(A,e){if(A.includes("?")||A.includes("#")){throw new Error('Query params cannot be passed when url already contains "?" or "#".')}const t=Q(e);if(t){A+="?"+t}return A}function parseURL(A){if(typeof A==="string"){A=new URL(A);if(!/^https?:/.test(A.origin||A.protocol)){throw new E("Invalid URL protocol: the URL must start with `http:` or `https:`.")}return A}if(!A||typeof A!=="object"){throw new E("Invalid URL: The URL argument must be a non-null object.")}if(!/^https?:/.test(A.origin||A.protocol)){throw new E("Invalid URL protocol: the URL must start with `http:` or `https:`.")}if(!(A instanceof URL)){if(A.port!=null&&A.port!==""&&!Number.isFinite(parseInt(A.port))){throw new E("Invalid URL: port must be a valid integer or a string representation of an integer.")}if(A.path!=null&&typeof A.path!=="string"){throw new E("Invalid URL path: the path must be a string or null/undefined.")}if(A.pathname!=null&&typeof A.pathname!=="string"){throw new E("Invalid URL pathname: the pathname must be a string or null/undefined.")}if(A.hostname!=null&&typeof A.hostname!=="string"){throw new E("Invalid URL hostname: the hostname must be a string or null/undefined.")}if(A.origin!=null&&typeof A.origin!=="string"){throw new E("Invalid URL origin: the origin must be a string or null/undefined.")}const e=A.port!=null?A.port:A.protocol==="https:"?443:80;let t=A.origin!=null?A.origin:`${A.protocol}//${A.hostname}:${e}`;let r=A.path!=null?A.path:`${A.pathname||""}${A.search||""}`;if(t.endsWith("/")){t=t.substring(0,t.length-1)}if(r&&!r.startsWith("/")){r=`/${r}`}A=new URL(t+r)}return A}function parseOrigin(A){A=parseURL(A);if(A.pathname!=="/"||A.search||A.hash){throw new E("invalid url")}return A}function getHostname(A){if(A[0]==="["){const e=A.indexOf("]");r(e!==-1);return A.substring(1,e)}const e=A.indexOf(":");if(e===-1)return A;return A.substring(0,e)}function getServerName(A){if(!A){return null}r.strictEqual(typeof A,"string");const e=getHostname(A);if(a.isIP(e)){return""}return e}function deepClone(A){return JSON.parse(JSON.stringify(A))}function isAsyncIterable(A){return!!(A!=null&&typeof A[Symbol.asyncIterator]==="function")}function isIterable(A){return!!(A!=null&&(typeof A[Symbol.iterator]==="function"||typeof A[Symbol.asyncIterator]==="function"))}function bodyLength(A){if(A==null){return 0}else if(isStream(A)){const e=A._readableState;return e&&e.objectMode===false&&e.ended===true&&Number.isFinite(e.length)?e.length:null}else if(isBlobLike(A)){return A.size!=null?A.size:null}else if(isBuffer(A)){return A.byteLength}return null}function isDestroyed(A){return!A||!!(A.destroyed||A[s])}function isReadableAborted(A){const e=A&&A._readableState;return isDestroyed(A)&&e&&!e.endEmitted}function destroy(A,e){if(A==null||!isStream(A)||isDestroyed(A)){return}if(typeof A.destroy==="function"){if(Object.getPrototypeOf(A).constructor===n){A.socket=null}A.destroy(e)}else if(e){process.nextTick(((A,e)=>{A.emit("error",e)}),A,e)}if(A.destroyed!==true){A[s]=true}}const h=/timeout=(\d+)/;function parseKeepAliveTimeout(A){const e=A.toString().match(h);return e?parseInt(e[1],10)*1e3:null}function headerNameToString(A){return C[A]||A.toLowerCase()}function parseHeaders(A,e={}){if(!Array.isArray(A))return A;for(let t=0;tA.toString("utf8")))}else{e[r]=A[t+1].toString("utf8")}}else{if(!Array.isArray(s)){s=[s];e[r]=s}s.push(A[t+1].toString("utf8"))}}if("content-length"in e&&"content-disposition"in e){e["content-disposition"]=Buffer.from(e["content-disposition"]).toString("latin1")}return e}function parseRawHeaders(A){const e=[];let t=false;let r=-1;for(let s=0;s{A.close()}))}else{const e=Buffer.isBuffer(r)?r:Buffer.from(r);A.enqueue(new Uint8Array(e))}return A.desiredSize>0},async cancel(A){await e.return()}},0)}function isFormDataLike(A){return A&&typeof A==="object"&&typeof A.append==="function"&&typeof A.delete==="function"&&typeof A.get==="function"&&typeof A.getAll==="function"&&typeof A.has==="function"&&typeof A.set==="function"&&A[Symbol.toStringTag]==="FormData"}function throwIfAborted(A){if(!A){return}if(typeof A.throwIfAborted==="function"){A.throwIfAborted()}else{if(A.aborted){const A=new Error("The operation was aborted");A.name="AbortError";throw A}}}function addAbortListener(A,e){if("addEventListener"in A){A.addEventListener("abort",e,{once:true});return()=>A.removeEventListener("abort",e)}A.addListener("abort",e);return()=>A.removeListener("abort",e)}const u=!!String.prototype.toWellFormed;function toUSVString(A){if(u){return`${A}`.toWellFormed()}else if(c.toUSVString){return c.toUSVString(A)}return`${A}`}function parseRangeHeader(A){if(A==null||A==="")return{start:0,end:null,size:null};const e=A?A.match(/^bytes (\d+)-(\d+)\/(\d+)?$/):null;return e?{start:parseInt(e[1]),end:e[2]?parseInt(e[2]):null,size:e[3]?parseInt(e[3]):null}:null}const d=Object.create(null);d.enumerable=true;A.exports={kEnumerableProperty:d,nop:nop,isDisturbed:isDisturbed,isErrored:isErrored,isReadable:isReadable,toUSVString:toUSVString,isReadableAborted:isReadableAborted,isBlobLike:isBlobLike,parseOrigin:parseOrigin,parseURL:parseURL,getServerName:getServerName,isStream:isStream,isIterable:isIterable,isAsyncIterable:isAsyncIterable,isDestroyed:isDestroyed,headerNameToString:headerNameToString,parseRawHeaders:parseRawHeaders,parseHeaders:parseHeaders,parseKeepAliveTimeout:parseKeepAliveTimeout,destroy:destroy,bodyLength:bodyLength,deepClone:deepClone,ReadableStreamFrom:ReadableStreamFrom,isBuffer:isBuffer,validateHandler:validateHandler,getSocketInfo:getSocketInfo,isFormDataLike:isFormDataLike,buildURL:buildURL,throwIfAborted:throwIfAborted,addAbortListener:addAbortListener,parseRangeHeader:parseRangeHeader,nodeMajor:B,nodeMinor:I,nodeHasAutoSelectFamily:B>18||B===18&&I>=13,safeHTTPMethods:["GET","HEAD","OPTIONS","TRACE"]}},1:(A,e,t)=>{"use strict";const r=t(992);const{ClientDestroyedError:s,ClientClosedError:o,InvalidArgumentError:n}=t(8707);const{kDestroy:i,kClose:a,kDispatch:E,kInterceptors:g}=t(6443);const c=Symbol("destroyed");const Q=Symbol("closed");const C=Symbol("onDestroyed");const B=Symbol("onClosed");const I=Symbol("Intercepted Dispatch");class DispatcherBase extends r{constructor(){super();this[c]=false;this[C]=null;this[Q]=false;this[B]=[]}get destroyed(){return this[c]}get closed(){return this[Q]}get interceptors(){return this[g]}set interceptors(A){if(A){for(let e=A.length-1;e>=0;e--){const A=this[g][e];if(typeof A!=="function"){throw new n("interceptor must be an function")}}}this[g]=A}close(A){if(A===undefined){return new Promise(((A,e)=>{this.close(((t,r)=>t?e(t):A(r)))}))}if(typeof A!=="function"){throw new n("invalid callback")}if(this[c]){queueMicrotask((()=>A(new s,null)));return}if(this[Q]){if(this[B]){this[B].push(A)}else{queueMicrotask((()=>A(null,null)))}return}this[Q]=true;this[B].push(A);const onClosed=()=>{const A=this[B];this[B]=null;for(let e=0;ethis.destroy())).then((()=>{queueMicrotask(onClosed)}))}destroy(A,e){if(typeof A==="function"){e=A;A=null}if(e===undefined){return new Promise(((e,t)=>{this.destroy(A,((A,r)=>A?t(A):e(r)))}))}if(typeof e!=="function"){throw new n("invalid callback")}if(this[c]){if(this[C]){this[C].push(e)}else{queueMicrotask((()=>e(null,null)))}return}if(!A){A=new s}this[c]=true;this[C]=this[C]||[];this[C].push(e);const onDestroyed=()=>{const A=this[C];this[C]=null;for(let e=0;e{queueMicrotask(onDestroyed)}))}[I](A,e){if(!this[g]||this[g].length===0){this[I]=this[E];return this[E](A,e)}let t=this[E].bind(this);for(let A=this[g].length-1;A>=0;A--){t=this[g][A](t)}this[I]=t;return t(A,e)}dispatch(A,e){if(!e||typeof e!=="object"){throw new n("handler must be an object")}try{if(!A||typeof A!=="object"){throw new n("opts must be an object.")}if(this[c]||this[C]){throw new s}if(this[Q]){throw new o}return this[I](A,e)}catch(A){if(typeof e.onError!=="function"){throw new n("invalid onError method")}e.onError(A);return false}}}A.exports=DispatcherBase},992:(A,e,t)=>{"use strict";const r=t(4434);class Dispatcher extends r{dispatch(){throw new Error("not implemented")}close(){throw new Error("not implemented")}destroy(){throw new Error("not implemented")}}A.exports=Dispatcher},8923:(A,e,t)=>{"use strict";const r=t(9581);const s=t(3440);const{ReadableStreamFrom:o,isBlobLike:n,isReadableStreamLike:i,readableStreamClose:a,createDeferredPromise:E,fullyReadBody:g}=t(5523);const{FormData:c}=t(3073);const{kState:Q}=t(9710);const{webidl:C}=t(4222);const{DOMException:B,structuredClone:I}=t(7326);const{Blob:h,File:l}=t(181);const{kBodyUsed:u}=t(6443);const d=t(2613);const{isErrored:f}=t(3440);const{isUint8Array:p,isArrayBuffer:y}=t(8253);const{File:R}=t(3041);const{parseMIMEType:D,serializeAMimeType:w}=t(4322);let k=globalThis.ReadableStream;const m=l??R;const b=new TextEncoder;const F=new TextDecoder;function extractBody(A,e=false){if(!k){k=t(3774).ReadableStream}let r=null;if(A instanceof k){r=A}else if(n(A)){r=A.stream()}else{r=new k({async pull(A){A.enqueue(typeof g==="string"?b.encode(g):g);queueMicrotask((()=>a(A)))},start(){},type:undefined})}d(i(r));let E=null;let g=null;let c=null;let Q=null;if(typeof A==="string"){g=A;Q="text/plain;charset=UTF-8"}else if(A instanceof URLSearchParams){g=A.toString();Q="application/x-www-form-urlencoded;charset=UTF-8"}else if(y(A)){g=new Uint8Array(A.slice())}else if(ArrayBuffer.isView(A)){g=new Uint8Array(A.buffer.slice(A.byteOffset,A.byteOffset+A.byteLength))}else if(s.isFormDataLike(A)){const e=`----formdata-undici-0${`${Math.floor(Math.random()*1e11)}`.padStart(11,"0")}`;const t=`--${e}\r\nContent-Disposition: form-data` -/*! formdata-polyfill. MIT License. Jimmy Wärting */;const escape=A=>A.replace(/\n/g,"%0A").replace(/\r/g,"%0D").replace(/"/g,"%22");const normalizeLinefeeds=A=>A.replace(/\r?\n|\r/g,"\r\n");const r=[];const s=new Uint8Array([13,10]);c=0;let o=false;for(const[e,n]of A){if(typeof n==="string"){const A=b.encode(t+`; name="${escape(normalizeLinefeeds(e))}"`+`\r\n\r\n${normalizeLinefeeds(n)}\r\n`);r.push(A);c+=A.byteLength}else{const A=b.encode(`${t}; name="${escape(normalizeLinefeeds(e))}"`+(n.name?`; filename="${escape(n.name)}"`:"")+"\r\n"+`Content-Type: ${n.type||"application/octet-stream"}\r\n\r\n`);r.push(A,n,s);if(typeof n.size==="number"){c+=A.byteLength+n.size+s.byteLength}else{o=true}}}const n=b.encode(`--${e}--`);r.push(n);c+=n.byteLength;if(o){c=null}g=A;E=async function*(){for(const A of r){if(A.stream){yield*A.stream()}else{yield A}}};Q="multipart/form-data; boundary="+e}else if(n(A)){g=A;c=A.size;if(A.type){Q=A.type}}else if(typeof A[Symbol.asyncIterator]==="function"){if(e){throw new TypeError("keepalive")}if(s.isDisturbed(A)||A.locked){throw new TypeError("Response body object should not be disturbed or locked")}r=A instanceof k?A:o(A)}if(typeof g==="string"||s.isBuffer(g)){c=Buffer.byteLength(g)}if(E!=null){let e;r=new k({async start(){e=E(A)[Symbol.asyncIterator]()},async pull(A){const{value:t,done:s}=await e.next();if(s){queueMicrotask((()=>{A.close()}))}else{if(!f(r)){A.enqueue(new Uint8Array(t))}}return A.desiredSize>0},async cancel(A){await e.return()},type:undefined})}const C={stream:r,source:g,length:c};return[C,Q]}function safelyExtractBody(A,e=false){if(!k){k=t(3774).ReadableStream}if(A instanceof k){d(!s.isDisturbed(A),"The body has already been consumed.");d(!A.locked,"The stream is locked.")}return extractBody(A,e)}function cloneBody(A){const[e,t]=A.stream.tee();const r=I(t,{transfer:[t]});const[,s]=r.tee();A.stream=e;return{stream:s,length:A.length,source:A.source}}async function*consumeBody(A){if(A){if(p(A)){yield A}else{const e=A.stream;if(s.isDisturbed(e)){throw new TypeError("The body has already been consumed.")}if(e.locked){throw new TypeError("The stream is locked.")}e[u]=true;yield*e}}}function throwIfAborted(A){if(A.aborted){throw new B("The operation was aborted.","AbortError")}}function bodyMixinMethods(A){const e={blob(){return specConsumeBody(this,(A=>{let e=bodyMimeType(this);if(e==="failure"){e=""}else if(e){e=w(e)}return new h([A],{type:e})}),A)},arrayBuffer(){return specConsumeBody(this,(A=>new Uint8Array(A).buffer),A)},text(){return specConsumeBody(this,utf8DecodeBytes,A)},json(){return specConsumeBody(this,parseJSONFromBytes,A)},async formData(){C.brandCheck(this,A);throwIfAborted(this[Q]);const e=this.headers.get("Content-Type");if(/multipart\/form-data/.test(e)){const A={};for(const[e,t]of this.headers)A[e.toLowerCase()]=t;const e=new c;let t;try{t=new r({headers:A,preservePath:true})}catch(A){throw new B(`${A}`,"AbortError")}t.on("field",((A,t)=>{e.append(A,t)}));t.on("file",((A,t,r,s,o)=>{const n=[];if(s==="base64"||s.toLowerCase()==="base64"){let s="";t.on("data",(A=>{s+=A.toString().replace(/[\r\n]/gm,"");const e=s.length-s.length%4;n.push(Buffer.from(s.slice(0,e),"base64"));s=s.slice(e)}));t.on("end",(()=>{n.push(Buffer.from(s,"base64"));e.append(A,new m(n,r,{type:o}))}))}else{t.on("data",(A=>{n.push(A)}));t.on("end",(()=>{e.append(A,new m(n,r,{type:o}))}))}}));const s=new Promise(((A,e)=>{t.on("finish",A);t.on("error",(A=>e(new TypeError(A))))}));if(this.body!==null)for await(const A of consumeBody(this[Q].body))t.write(A);t.end();await s;return e}else if(/application\/x-www-form-urlencoded/.test(e)){let A;try{let e="";const t=new TextDecoder("utf-8",{ignoreBOM:true});for await(const A of consumeBody(this[Q].body)){if(!p(A)){throw new TypeError("Expected Uint8Array chunk")}e+=t.decode(A,{stream:true})}e+=t.decode();A=new URLSearchParams(e)}catch(A){throw Object.assign(new TypeError,{cause:A})}const e=new c;for(const[t,r]of A){e.append(t,r)}return e}else{await Promise.resolve();throwIfAborted(this[Q]);throw C.errors.exception({header:`${A.name}.formData`,message:"Could not parse content as FormData."})}}};return e}function mixinBody(A){Object.assign(A.prototype,bodyMixinMethods(A))}async function specConsumeBody(A,e,t){C.brandCheck(A,t);throwIfAborted(A[Q]);if(bodyUnusable(A[Q].body)){throw new TypeError("Body is unusable")}const r=E();const errorSteps=A=>r.reject(A);const successSteps=A=>{try{r.resolve(e(A))}catch(A){errorSteps(A)}};if(A[Q].body==null){successSteps(new Uint8Array);return r.promise}await g(A[Q].body,successSteps,errorSteps);return r.promise}function bodyUnusable(A){return A!=null&&(A.stream.locked||s.isDisturbed(A.stream))}function utf8DecodeBytes(A){if(A.length===0){return""}if(A[0]===239&&A[1]===187&&A[2]===191){A=A.subarray(3)}const e=F.decode(A);return e}function parseJSONFromBytes(A){return JSON.parse(utf8DecodeBytes(A))}function bodyMimeType(A){const{headersList:e}=A[Q];const t=e.get("content-type");if(t===null){return"failure"}return D(t)}A.exports={extractBody:extractBody,safelyExtractBody:safelyExtractBody,cloneBody:cloneBody,mixinBody:mixinBody}},7326:(A,e,t)=>{"use strict";const{MessageChannel:r,receiveMessageOnPort:s}=t(8167);const o=["GET","HEAD","POST"];const n=new Set(o);const i=[101,204,205,304];const a=[301,302,303,307,308];const E=new Set(a);const g=["1","7","9","11","13","15","17","19","20","21","22","23","25","37","42","43","53","69","77","79","87","95","101","102","103","104","109","110","111","113","115","117","119","123","135","137","139","143","161","179","389","427","465","512","513","514","515","526","530","531","532","540","548","554","556","563","587","601","636","989","990","993","995","1719","1720","1723","2049","3659","4045","5060","5061","6000","6566","6665","6666","6667","6668","6669","6697","10080"];const c=new Set(g);const Q=["","no-referrer","no-referrer-when-downgrade","same-origin","origin","strict-origin","origin-when-cross-origin","strict-origin-when-cross-origin","unsafe-url"];const C=new Set(Q);const B=["follow","manual","error"];const I=["GET","HEAD","OPTIONS","TRACE"];const h=new Set(I);const l=["navigate","same-origin","no-cors","cors"];const u=["omit","same-origin","include"];const d=["default","no-store","reload","no-cache","force-cache","only-if-cached"];const f=["content-encoding","content-language","content-location","content-type","content-length"];const p=["half"];const y=["CONNECT","TRACE","TRACK"];const R=new Set(y);const D=["audio","audioworklet","font","image","manifest","paintworklet","script","style","track","video","xslt",""];const w=new Set(D);const k=globalThis.DOMException??(()=>{try{atob("~")}catch(A){return Object.getPrototypeOf(A).constructor}})();let m;const b=globalThis.structuredClone??function structuredClone(A,e=undefined){if(arguments.length===0){throw new TypeError("missing argument")}if(!m){m=new r}m.port1.unref();m.port2.unref();m.port1.postMessage(A,e?.transfer);return s(m.port2).message};A.exports={DOMException:k,structuredClone:b,subresource:D,forbiddenMethods:y,requestBodyHeader:f,referrerPolicy:Q,requestRedirect:B,requestMode:l,requestCredentials:u,requestCache:d,redirectStatus:a,corsSafeListedMethods:o,nullBodyStatus:i,safeMethods:I,badPorts:g,requestDuplex:p,subresourceSet:w,badPortsSet:c,redirectStatusSet:E,corsSafeListedMethodsSet:n,safeMethodsSet:h,forbiddenMethodsSet:R,referrerPolicySet:C}},4322:(A,e,t)=>{const r=t(2613);const{atob:s}=t(181);const{isomorphicDecode:o}=t(5523);const n=new TextEncoder;const i=/^[!#$%&'*+-.^_|~A-Za-z0-9]+$/;const a=/(\u000A|\u000D|\u0009|\u0020)/;const E=/[\u0009|\u0020-\u007E|\u0080-\u00FF]/;function dataURLProcessor(A){r(A.protocol==="data:");let e=URLSerializer(A,true);e=e.slice(5);const t={position:0};let s=collectASequenceOfCodePointsFast(",",e,t);const n=s.length;s=removeASCIIWhitespace(s,true,true);if(t.position>=e.length){return"failure"}t.position++;const i=e.slice(n+1);let a=stringPercentDecode(i);if(/;(\u0020){0,}base64$/i.test(s)){const A=o(a);a=forgivingBase64(A);if(a==="failure"){return"failure"}s=s.slice(0,-6);s=s.replace(/(\u0020)+$/,"");s=s.slice(0,-1)}if(s.startsWith(";")){s="text/plain"+s}let E=parseMIMEType(s);if(E==="failure"){E=parseMIMEType("text/plain;charset=US-ASCII")}return{mimeType:E,body:a}}function URLSerializer(A,e=false){if(!e){return A.href}const t=A.href;const r=A.hash.length;return r===0?t:t.substring(0,t.length-r)}function collectASequenceOfCodePoints(A,e,t){let r="";while(t.positionA.length){return"failure"}e.position++;let r=collectASequenceOfCodePointsFast(";",A,e);r=removeHTTPWhitespace(r,false,true);if(r.length===0||!i.test(r)){return"failure"}const s=t.toLowerCase();const o=r.toLowerCase();const n={type:s,subtype:o,parameters:new Map,essence:`${s}/${o}`};while(e.positiona.test(A)),A,e);let t=collectASequenceOfCodePoints((A=>A!==";"&&A!=="="),A,e);t=t.toLowerCase();if(e.positionA.length){break}let r=null;if(A[e.position]==='"'){r=collectAnHTTPQuotedString(A,e,true);collectASequenceOfCodePointsFast(";",A,e)}else{r=collectASequenceOfCodePointsFast(";",A,e);r=removeHTTPWhitespace(r,false,true);if(r.length===0){continue}}if(t.length!==0&&i.test(t)&&(r.length===0||E.test(r))&&!n.parameters.has(t)){n.parameters.set(t,r)}}return n}function forgivingBase64(A){A=A.replace(/[\u0009\u000A\u000C\u000D\u0020]/g,"");if(A.length%4===0){A=A.replace(/=?=$/,"")}if(A.length%4===1){return"failure"}if(/[^+/0-9A-Za-z]/.test(A)){return"failure"}const e=s(A);const t=new Uint8Array(e.length);for(let A=0;AA!=='"'&&A!=="\\"),A,e);if(e.position>=A.length){break}const t=A[e.position];e.position++;if(t==="\\"){if(e.position>=A.length){o+="\\";break}o+=A[e.position];e.position++}else{r(t==='"');break}}if(t){return o}return A.slice(s,e.position)}function serializeAMimeType(A){r(A!=="failure");const{parameters:e,essence:t}=A;let s=t;for(let[A,t]of e.entries()){s+=";";s+=A;s+="=";if(!i.test(t)){t=t.replace(/(\\|")/g,"\\$1");t='"'+t;t+='"'}s+=t}return s}function isHTTPWhiteSpace(A){return A==="\r"||A==="\n"||A==="\t"||A===" "}function removeHTTPWhitespace(A,e=true,t=true){let r=0;let s=A.length-1;if(e){for(;r0&&isHTTPWhiteSpace(A[s]);s--);}return A.slice(r,s+1)}function isASCIIWhitespace(A){return A==="\r"||A==="\n"||A==="\t"||A==="\f"||A===" "}function removeASCIIWhitespace(A,e=true,t=true){let r=0;let s=A.length-1;if(e){for(;r0&&isASCIIWhitespace(A[s]);s--);}return A.slice(r,s+1)}A.exports={dataURLProcessor:dataURLProcessor,URLSerializer:URLSerializer,collectASequenceOfCodePoints:collectASequenceOfCodePoints,collectASequenceOfCodePointsFast:collectASequenceOfCodePointsFast,stringPercentDecode:stringPercentDecode,parseMIMEType:parseMIMEType,collectAnHTTPQuotedString:collectAnHTTPQuotedString,serializeAMimeType:serializeAMimeType}},3041:(A,e,t)=>{"use strict";const{Blob:r,File:s}=t(181);const{types:o}=t(9023);const{kState:n}=t(9710);const{isBlobLike:i}=t(5523);const{webidl:a}=t(4222);const{parseMIMEType:E,serializeAMimeType:g}=t(4322);const{kEnumerableProperty:c}=t(3440);const Q=new TextEncoder;class File extends r{constructor(A,e,t={}){a.argumentLengthCheck(arguments,2,{header:"File constructor"});A=a.converters["sequence"](A);e=a.converters.USVString(e);t=a.converters.FilePropertyBag(t);const r=e;let s=t.type;let o;A:{if(s){s=E(s);if(s==="failure"){s="";break A}s=g(s).toLowerCase()}o=t.lastModified}super(processBlobParts(A,t),{type:s});this[n]={name:r,lastModified:o,type:s}}get name(){a.brandCheck(this,File);return this[n].name}get lastModified(){a.brandCheck(this,File);return this[n].lastModified}get type(){a.brandCheck(this,File);return this[n].type}}class FileLike{constructor(A,e,t={}){const r=e;const s=t.type;const o=t.lastModified??Date.now();this[n]={blobLike:A,name:r,type:s,lastModified:o}}stream(...A){a.brandCheck(this,FileLike);return this[n].blobLike.stream(...A)}arrayBuffer(...A){a.brandCheck(this,FileLike);return this[n].blobLike.arrayBuffer(...A)}slice(...A){a.brandCheck(this,FileLike);return this[n].blobLike.slice(...A)}text(...A){a.brandCheck(this,FileLike);return this[n].blobLike.text(...A)}get size(){a.brandCheck(this,FileLike);return this[n].blobLike.size}get type(){a.brandCheck(this,FileLike);return this[n].blobLike.type}get name(){a.brandCheck(this,FileLike);return this[n].name}get lastModified(){a.brandCheck(this,FileLike);return this[n].lastModified}get[Symbol.toStringTag](){return"File"}}Object.defineProperties(File.prototype,{[Symbol.toStringTag]:{value:"File",configurable:true},name:c,lastModified:c});a.converters.Blob=a.interfaceConverter(r);a.converters.BlobPart=function(A,e){if(a.util.Type(A)==="Object"){if(i(A)){return a.converters.Blob(A,{strict:false})}if(ArrayBuffer.isView(A)||o.isAnyArrayBuffer(A)){return a.converters.BufferSource(A,e)}}return a.converters.USVString(A,e)};a.converters["sequence"]=a.sequenceConverter(a.converters.BlobPart);a.converters.FilePropertyBag=a.dictionaryConverter([{key:"lastModified",converter:a.converters["long long"],get defaultValue(){return Date.now()}},{key:"type",converter:a.converters.DOMString,defaultValue:""},{key:"endings",converter:A=>{A=a.converters.DOMString(A);A=A.toLowerCase();if(A!=="native"){A="transparent"}return A},defaultValue:"transparent"}]);function processBlobParts(A,e){const t=[];for(const r of A){if(typeof r==="string"){let A=r;if(e.endings==="native"){A=convertLineEndingsNative(A)}t.push(Q.encode(A))}else if(o.isAnyArrayBuffer(r)||o.isTypedArray(r)){if(!r.buffer){t.push(new Uint8Array(r))}else{t.push(new Uint8Array(r.buffer,r.byteOffset,r.byteLength))}}else if(i(r)){t.push(r)}}return t}function convertLineEndingsNative(A){let e="\n";if(process.platform==="win32"){e="\r\n"}return A.replace(/\r?\n/g,e)}function isFileLike(A){return s&&A instanceof s||A instanceof File||A&&(typeof A.stream==="function"||typeof A.arrayBuffer==="function")&&A[Symbol.toStringTag]==="File"}A.exports={File:File,FileLike:FileLike,isFileLike:isFileLike}},3073:(A,e,t)=>{"use strict";const{isBlobLike:r,toUSVString:s,makeIterator:o}=t(5523);const{kState:n}=t(9710);const{File:i,FileLike:a,isFileLike:E}=t(3041);const{webidl:g}=t(4222);const{Blob:c,File:Q}=t(181);const C=Q??i;class FormData{constructor(A){if(A!==undefined){throw g.errors.conversionFailed({prefix:"FormData constructor",argument:"Argument 1",types:["undefined"]})}this[n]=[]}append(A,e,t=undefined){g.brandCheck(this,FormData);g.argumentLengthCheck(arguments,2,{header:"FormData.append"});if(arguments.length===3&&!r(e)){throw new TypeError("Failed to execute 'append' on 'FormData': parameter 2 is not of type 'Blob'")}A=g.converters.USVString(A);e=r(e)?g.converters.Blob(e,{strict:false}):g.converters.USVString(e);t=arguments.length===3?g.converters.USVString(t):undefined;const s=makeEntry(A,e,t);this[n].push(s)}delete(A){g.brandCheck(this,FormData);g.argumentLengthCheck(arguments,1,{header:"FormData.delete"});A=g.converters.USVString(A);this[n]=this[n].filter((e=>e.name!==A))}get(A){g.brandCheck(this,FormData);g.argumentLengthCheck(arguments,1,{header:"FormData.get"});A=g.converters.USVString(A);const e=this[n].findIndex((e=>e.name===A));if(e===-1){return null}return this[n][e].value}getAll(A){g.brandCheck(this,FormData);g.argumentLengthCheck(arguments,1,{header:"FormData.getAll"});A=g.converters.USVString(A);return this[n].filter((e=>e.name===A)).map((A=>A.value))}has(A){g.brandCheck(this,FormData);g.argumentLengthCheck(arguments,1,{header:"FormData.has"});A=g.converters.USVString(A);return this[n].findIndex((e=>e.name===A))!==-1}set(A,e,t=undefined){g.brandCheck(this,FormData);g.argumentLengthCheck(arguments,2,{header:"FormData.set"});if(arguments.length===3&&!r(e)){throw new TypeError("Failed to execute 'set' on 'FormData': parameter 2 is not of type 'Blob'")}A=g.converters.USVString(A);e=r(e)?g.converters.Blob(e,{strict:false}):g.converters.USVString(e);t=arguments.length===3?s(t):undefined;const o=makeEntry(A,e,t);const i=this[n].findIndex((e=>e.name===A));if(i!==-1){this[n]=[...this[n].slice(0,i),o,...this[n].slice(i+1).filter((e=>e.name!==A))]}else{this[n].push(o)}}entries(){g.brandCheck(this,FormData);return o((()=>this[n].map((A=>[A.name,A.value]))),"FormData","key+value")}keys(){g.brandCheck(this,FormData);return o((()=>this[n].map((A=>[A.name,A.value]))),"FormData","key")}values(){g.brandCheck(this,FormData);return o((()=>this[n].map((A=>[A.name,A.value]))),"FormData","value")}forEach(A,e=globalThis){g.brandCheck(this,FormData);g.argumentLengthCheck(arguments,1,{header:"FormData.forEach"});if(typeof A!=="function"){throw new TypeError("Failed to execute 'forEach' on 'FormData': parameter 1 is not of type 'Function'.")}for(const[t,r]of this){A.apply(e,[r,t,this])}}}FormData.prototype[Symbol.iterator]=FormData.prototype.entries;Object.defineProperties(FormData.prototype,{[Symbol.toStringTag]:{value:"FormData",configurable:true}});function makeEntry(A,e,t){A=Buffer.from(A).toString("utf8");if(typeof e==="string"){e=Buffer.from(e).toString("utf8")}else{if(!E(e)){e=e instanceof c?new C([e],"blob",{type:e.type}):new a(e,"blob",{type:e.type})}if(t!==undefined){const A={type:e.type,lastModified:e.lastModified};e=Q&&e instanceof Q||e instanceof i?new C([e],t,A):new a(e,t,A)}}return{name:A,value:e}}A.exports={FormData:FormData}},5628:A=>{"use strict";const e=Symbol.for("undici.globalOrigin.1");function getGlobalOrigin(){return globalThis[e]}function setGlobalOrigin(A){if(A===undefined){Object.defineProperty(globalThis,e,{value:undefined,writable:true,enumerable:false,configurable:false});return}const t=new URL(A);if(t.protocol!=="http:"&&t.protocol!=="https:"){throw new TypeError(`Only http & https urls are allowed, received ${t.protocol}`)}Object.defineProperty(globalThis,e,{value:t,writable:true,enumerable:false,configurable:false})}A.exports={getGlobalOrigin:getGlobalOrigin,setGlobalOrigin:setGlobalOrigin}},6349:(A,e,t)=>{"use strict";const{kHeadersList:r,kConstruct:s}=t(6443);const{kGuard:o}=t(9710);const{kEnumerableProperty:n}=t(3440);const{makeIterator:i,isValidHeaderName:a,isValidHeaderValue:E}=t(5523);const{webidl:g}=t(4222);const c=t(2613);const Q=Symbol("headers map");const C=Symbol("headers map sorted");function isHTTPWhiteSpaceCharCode(A){return A===10||A===13||A===9||A===32}function headerValueNormalize(A){let e=0;let t=A.length;while(t>e&&isHTTPWhiteSpaceCharCode(A.charCodeAt(t-1)))--t;while(t>e&&isHTTPWhiteSpaceCharCode(A.charCodeAt(e)))++e;return e===0&&t===A.length?A:A.substring(e,t)}function fill(A,e){if(Array.isArray(e)){for(let t=0;t>","record"]})}}function appendHeader(A,e,t){t=headerValueNormalize(t);if(!a(e)){throw g.errors.invalidArgument({prefix:"Headers.append",value:e,type:"header name"})}else if(!E(t)){throw g.errors.invalidArgument({prefix:"Headers.append",value:t,type:"header value"})}if(A[o]==="immutable"){throw new TypeError("immutable")}else if(A[o]==="request-no-cors"){}return A[r].append(e,t)}class HeadersList{cookies=null;constructor(A){if(A instanceof HeadersList){this[Q]=new Map(A[Q]);this[C]=A[C];this.cookies=A.cookies===null?null:[...A.cookies]}else{this[Q]=new Map(A);this[C]=null}}contains(A){A=A.toLowerCase();return this[Q].has(A)}clear(){this[Q].clear();this[C]=null;this.cookies=null}append(A,e){this[C]=null;const t=A.toLowerCase();const r=this[Q].get(t);if(r){const A=t==="cookie"?"; ":", ";this[Q].set(t,{name:r.name,value:`${r.value}${A}${e}`})}else{this[Q].set(t,{name:A,value:e})}if(t==="set-cookie"){this.cookies??=[];this.cookies.push(e)}}set(A,e){this[C]=null;const t=A.toLowerCase();if(t==="set-cookie"){this.cookies=[e]}this[Q].set(t,{name:A,value:e})}delete(A){this[C]=null;A=A.toLowerCase();if(A==="set-cookie"){this.cookies=null}this[Q].delete(A)}get(A){const e=this[Q].get(A.toLowerCase());return e===undefined?null:e.value}*[Symbol.iterator](){for(const[A,{value:e}]of this[Q]){yield[A,e]}}get entries(){const A={};if(this[Q].size){for(const{name:e,value:t}of this[Q].values()){A[e]=t}}return A}}class Headers{constructor(A=undefined){if(A===s){return}this[r]=new HeadersList;this[o]="none";if(A!==undefined){A=g.converters.HeadersInit(A);fill(this,A)}}append(A,e){g.brandCheck(this,Headers);g.argumentLengthCheck(arguments,2,{header:"Headers.append"});A=g.converters.ByteString(A);e=g.converters.ByteString(e);return appendHeader(this,A,e)}delete(A){g.brandCheck(this,Headers);g.argumentLengthCheck(arguments,1,{header:"Headers.delete"});A=g.converters.ByteString(A);if(!a(A)){throw g.errors.invalidArgument({prefix:"Headers.delete",value:A,type:"header name"})}if(this[o]==="immutable"){throw new TypeError("immutable")}else if(this[o]==="request-no-cors"){}if(!this[r].contains(A)){return}this[r].delete(A)}get(A){g.brandCheck(this,Headers);g.argumentLengthCheck(arguments,1,{header:"Headers.get"});A=g.converters.ByteString(A);if(!a(A)){throw g.errors.invalidArgument({prefix:"Headers.get",value:A,type:"header name"})}return this[r].get(A)}has(A){g.brandCheck(this,Headers);g.argumentLengthCheck(arguments,1,{header:"Headers.has"});A=g.converters.ByteString(A);if(!a(A)){throw g.errors.invalidArgument({prefix:"Headers.has",value:A,type:"header name"})}return this[r].contains(A)}set(A,e){g.brandCheck(this,Headers);g.argumentLengthCheck(arguments,2,{header:"Headers.set"});A=g.converters.ByteString(A);e=g.converters.ByteString(e);e=headerValueNormalize(e);if(!a(A)){throw g.errors.invalidArgument({prefix:"Headers.set",value:A,type:"header name"})}else if(!E(e)){throw g.errors.invalidArgument({prefix:"Headers.set",value:e,type:"header value"})}if(this[o]==="immutable"){throw new TypeError("immutable")}else if(this[o]==="request-no-cors"){}this[r].set(A,e)}getSetCookie(){g.brandCheck(this,Headers);const A=this[r].cookies;if(A){return[...A]}return[]}get[C](){if(this[r][C]){return this[r][C]}const A=[];const e=[...this[r]].sort(((A,e)=>A[0]A),"Headers","key")}return i((()=>[...this[C].values()]),"Headers","key")}values(){g.brandCheck(this,Headers);if(this[o]==="immutable"){const A=this[C];return i((()=>A),"Headers","value")}return i((()=>[...this[C].values()]),"Headers","value")}entries(){g.brandCheck(this,Headers);if(this[o]==="immutable"){const A=this[C];return i((()=>A),"Headers","key+value")}return i((()=>[...this[C].values()]),"Headers","key+value")}forEach(A,e=globalThis){g.brandCheck(this,Headers);g.argumentLengthCheck(arguments,1,{header:"Headers.forEach"});if(typeof A!=="function"){throw new TypeError("Failed to execute 'forEach' on 'Headers': parameter 1 is not of type 'Function'.")}for(const[t,r]of this){A.apply(e,[r,t,this])}}[Symbol.for("nodejs.util.inspect.custom")](){g.brandCheck(this,Headers);return this[r]}}Headers.prototype[Symbol.iterator]=Headers.prototype.entries;Object.defineProperties(Headers.prototype,{append:n,delete:n,get:n,has:n,set:n,getSetCookie:n,keys:n,values:n,entries:n,forEach:n,[Symbol.iterator]:{enumerable:false},[Symbol.toStringTag]:{value:"Headers",configurable:true}});g.converters.HeadersInit=function(A){if(g.util.Type(A)==="Object"){if(A[Symbol.iterator]){return g.converters["sequence>"](A)}return g.converters["record"](A)}throw g.errors.conversionFailed({prefix:"Headers constructor",argument:"Argument 1",types:["sequence>","record"]})};A.exports={fill:fill,Headers:Headers,HeadersList:HeadersList}},2315:(A,e,t)=>{"use strict";const{Response:r,makeNetworkError:s,makeAppropriateNetworkError:o,filterResponse:n,makeResponse:i}=t(8676);const{Headers:a}=t(6349);const{Request:E,makeRequest:g}=t(5194);const c=t(3106);const{bytesMatch:Q,makePolicyContainer:C,clonePolicyContainer:B,requestBadPort:I,TAOCheck:h,appendRequestOriginHeader:l,responseLocationURL:u,requestCurrentURL:d,setRequestReferrerPolicyOnRedirect:f,tryUpgradeRequestToAPotentiallyTrustworthyURL:p,createOpaqueTimingInfo:y,appendFetchMetadata:R,corsCheck:D,crossOriginResourcePolicyCheck:w,determineRequestsReferrer:k,coarsenedSharedCurrentTime:m,createDeferredPromise:b,isBlobLike:F,sameOrigin:S,isCancelled:N,isAborted:U,isErrorLike:L,fullyReadBody:M,readableStreamClose:T,isomorphicEncode:Y,urlIsLocal:H,urlIsHttpHttpsScheme:J,urlHasHttpsScheme:G}=t(5523);const{kState:v,kHeaders:V,kGuard:x,kRealm:O}=t(9710);const P=t(2613);const{safelyExtractBody:W}=t(8923);const{redirectStatusSet:q,nullBodyStatus:_,safeMethodsSet:Z,requestBodyHeader:j,subresourceSet:X,DOMException:K}=t(7326);const{kHeadersList:z}=t(6443);const $=t(4434);const{Readable:AA,pipeline:eA}=t(2203);const{addAbortListener:tA,isErrored:rA,isReadable:sA,nodeMajor:oA,nodeMinor:nA}=t(3440);const{dataURLProcessor:iA,serializeAMimeType:aA}=t(4322);const{TransformStream:EA}=t(3774);const{getGlobalDispatcher:gA}=t(2581);const{webidl:cA}=t(4222);const{STATUS_CODES:QA}=t(8611);const CA=["GET","HEAD"];let BA;let IA=globalThis.ReadableStream;class Fetch extends ${constructor(A){super();this.dispatcher=A;this.connection=null;this.dump=false;this.state="ongoing";this.setMaxListeners(21)}terminate(A){if(this.state!=="ongoing"){return}this.state="terminated";this.connection?.destroy(A);this.emit("terminated",A)}abort(A){if(this.state!=="ongoing"){return}this.state="aborted";if(!A){A=new K("The operation was aborted.","AbortError")}this.serializedAbortReason=A;this.connection?.destroy(A);this.emit("terminated",A)}}function fetch(A,e={}){cA.argumentLengthCheck(arguments,1,{header:"globalThis.fetch"});const t=b();let s;try{s=new E(A,e)}catch(A){t.reject(A);return t.promise}const o=s[v];if(s.signal.aborted){abortFetch(t,o,null,s.signal.reason);return t.promise}const n=o.client.globalObject;if(n?.constructor?.name==="ServiceWorkerGlobalScope"){o.serviceWorkers="none"}let i=null;const a=null;let g=false;let c=null;tA(s.signal,(()=>{g=true;P(c!=null);c.abort(s.signal.reason);abortFetch(t,o,i,s.signal.reason)}));const handleFetchDone=A=>finalizeAndReportTiming(A,"fetch");const processResponse=A=>{if(g){return Promise.resolve()}if(A.aborted){abortFetch(t,o,i,c.serializedAbortReason);return Promise.resolve()}if(A.type==="error"){t.reject(Object.assign(new TypeError("fetch failed"),{cause:A.error}));return Promise.resolve()}i=new r;i[v]=A;i[O]=a;i[V][z]=A.headersList;i[V][x]="immutable";i[V][O]=a;t.resolve(i)};c=fetching({request:o,processResponseEndOfBody:handleFetchDone,processResponse:processResponse,dispatcher:e.dispatcher??gA()});return t.promise}function finalizeAndReportTiming(A,e="other"){if(A.type==="error"&&A.aborted){return}if(!A.urlList?.length){return}const t=A.urlList[0];let r=A.timingInfo;let s=A.cacheState;if(!J(t)){return}if(r===null){return}if(!A.timingAllowPassed){r=y({startTime:r.startTime});s=""}r.endTime=m();A.timingInfo=r;markResourceTiming(r,t,e,globalThis,s)}function markResourceTiming(A,e,t,r,s){if(oA>18||oA===18&&nA>=2){performance.markResourceTiming(A,e.href,t,r,s)}}function abortFetch(A,e,t,r){if(!r){r=new K("The operation was aborted.","AbortError")}A.reject(r);if(e.body!=null&&sA(e.body?.stream)){e.body.stream.cancel(r).catch((A=>{if(A.code==="ERR_INVALID_STATE"){return}throw A}))}if(t==null){return}const s=t[v];if(s.body!=null&&sA(s.body?.stream)){s.body.stream.cancel(r).catch((A=>{if(A.code==="ERR_INVALID_STATE"){return}throw A}))}}function fetching({request:A,processRequestBodyChunkLength:e,processRequestEndOfBody:t,processResponse:r,processResponseEndOfBody:s,processResponseConsumeBody:o,useParallelQueue:n=false,dispatcher:i}){let a=null;let E=false;if(A.client!=null){a=A.client.globalObject;E=A.client.crossOriginIsolatedCapability}const g=m(E);const c=y({startTime:g});const Q={controller:new Fetch(i),request:A,timingInfo:c,processRequestBodyChunkLength:e,processRequestEndOfBody:t,processResponse:r,processResponseConsumeBody:o,processResponseEndOfBody:s,taskDestination:a,crossOriginIsolatedCapability:E};P(!A.body||A.body.stream);if(A.window==="client"){A.window=A.client?.globalObject?.constructor?.name==="Window"?A.client:"no-window"}if(A.origin==="client"){A.origin=A.client?.origin}if(A.policyContainer==="client"){if(A.client!=null){A.policyContainer=B(A.client.policyContainer)}else{A.policyContainer=C()}}if(!A.headersList.contains("accept")){const e="*/*";A.headersList.append("accept",e)}if(!A.headersList.contains("accept-language")){A.headersList.append("accept-language","*")}if(A.priority===null){}if(X.has(A.destination)){}mainFetch(Q).catch((A=>{Q.controller.terminate(A)}));return Q.controller}async function mainFetch(A,e=false){const t=A.request;let r=null;if(t.localURLsOnly&&!H(d(t))){r=s("local URLs only")}p(t);if(I(t)==="blocked"){r=s("bad port")}if(t.referrerPolicy===""){t.referrerPolicy=t.policyContainer.referrerPolicy}if(t.referrer!=="no-referrer"){t.referrer=k(t)}if(r===null){r=await(async()=>{const e=d(t);if(S(e,t.url)&&t.responseTainting==="basic"||e.protocol==="data:"||(t.mode==="navigate"||t.mode==="websocket")){t.responseTainting="basic";return await schemeFetch(A)}if(t.mode==="same-origin"){return s('request mode cannot be "same-origin"')}if(t.mode==="no-cors"){if(t.redirect!=="follow"){return s('redirect mode cannot be "follow" for "no-cors" request')}t.responseTainting="opaque";return await schemeFetch(A)}if(!J(d(t))){return s("URL scheme must be a HTTP(S) scheme")}t.responseTainting="cors";return await httpFetch(A)})()}if(e){return r}if(r.status!==0&&!r.internalResponse){if(t.responseTainting==="cors"){}if(t.responseTainting==="basic"){r=n(r,"basic")}else if(t.responseTainting==="cors"){r=n(r,"cors")}else if(t.responseTainting==="opaque"){r=n(r,"opaque")}else{P(false)}}let o=r.status===0?r:r.internalResponse;if(o.urlList.length===0){o.urlList.push(...t.urlList)}if(!t.timingAllowFailed){r.timingAllowPassed=true}if(r.type==="opaque"&&o.status===206&&o.rangeRequested&&!t.headers.contains("range")){r=o=s()}if(r.status!==0&&(t.method==="HEAD"||t.method==="CONNECT"||_.includes(o.status))){o.body=null;A.controller.dump=true}if(t.integrity){const processBodyError=e=>fetchFinale(A,s(e));if(t.responseTainting==="opaque"||r.body==null){processBodyError(r.error);return}const processBody=e=>{if(!Q(e,t.integrity)){processBodyError("integrity mismatch");return}r.body=W(e)[0];fetchFinale(A,r)};await M(r.body,processBody,processBodyError)}else{fetchFinale(A,r)}}function schemeFetch(A){if(N(A)&&A.request.redirectCount===0){return Promise.resolve(o(A))}const{request:e}=A;const{protocol:r}=d(e);switch(r){case"about:":{return Promise.resolve(s("about scheme is not supported"))}case"blob:":{if(!BA){BA=t(181).resolveObjectURL}const A=d(e);if(A.search.length!==0){return Promise.resolve(s("NetworkError when attempting to fetch resource."))}const r=BA(A.toString());if(e.method!=="GET"||!F(r)){return Promise.resolve(s("invalid method"))}const o=W(r);const n=o[0];const a=Y(`${n.length}`);const E=o[1]??"";const g=i({statusText:"OK",headersList:[["content-length",{name:"Content-Length",value:a}],["content-type",{name:"Content-Type",value:E}]]});g.body=n;return Promise.resolve(g)}case"data:":{const A=d(e);const t=iA(A);if(t==="failure"){return Promise.resolve(s("failed to fetch the data URL"))}const r=aA(t.mimeType);return Promise.resolve(i({statusText:"OK",headersList:[["content-type",{name:"Content-Type",value:r}]],body:W(t.body)[0]}))}case"file:":{return Promise.resolve(s("not implemented... yet..."))}case"http:":case"https:":{return httpFetch(A).catch((A=>s(A)))}default:{return Promise.resolve(s("unknown scheme"))}}}function finalizeResponse(A,e){A.request.done=true;if(A.processResponseDone!=null){queueMicrotask((()=>A.processResponseDone(e)))}}function fetchFinale(A,e){if(e.type==="error"){e.urlList=[A.request.urlList[0]];e.timingInfo=y({startTime:A.timingInfo.startTime})}const processResponseEndOfBody=()=>{A.request.done=true;if(A.processResponseEndOfBody!=null){queueMicrotask((()=>A.processResponseEndOfBody(e)))}};if(A.processResponse!=null){queueMicrotask((()=>A.processResponse(e)))}if(e.body==null){processResponseEndOfBody()}else{const identityTransformAlgorithm=(A,e)=>{e.enqueue(A)};const A=new EA({start(){},transform:identityTransformAlgorithm,flush:processResponseEndOfBody},{size(){return 1}},{size(){return 1}});e.body={stream:e.body.stream.pipeThrough(A)}}if(A.processResponseConsumeBody!=null){const processBody=t=>A.processResponseConsumeBody(e,t);const processBodyError=t=>A.processResponseConsumeBody(e,t);if(e.body==null){queueMicrotask((()=>processBody(null)))}else{return M(e.body,processBody,processBodyError)}return Promise.resolve()}}async function httpFetch(A){const e=A.request;let t=null;let r=null;const o=A.timingInfo;if(e.serviceWorkers==="all"){}if(t===null){if(e.redirect==="follow"){e.serviceWorkers="none"}r=t=await httpNetworkOrCacheFetch(A);if(e.responseTainting==="cors"&&D(e,t)==="failure"){return s("cors failure")}if(h(e,t)==="failure"){e.timingAllowFailed=true}}if((e.responseTainting==="opaque"||t.type==="opaque")&&w(e.origin,e.client,e.destination,r)==="blocked"){return s("blocked")}if(q.has(r.status)){if(e.redirect!=="manual"){A.controller.connection.destroy()}if(e.redirect==="error"){t=s("unexpected redirect")}else if(e.redirect==="manual"){t=r}else if(e.redirect==="follow"){t=await httpRedirectFetch(A,t)}else{P(false)}}t.timingInfo=o;return t}function httpRedirectFetch(A,e){const t=A.request;const r=e.internalResponse?e.internalResponse:e;let o;try{o=u(r,d(t).hash);if(o==null){return e}}catch(A){return Promise.resolve(s(A))}if(!J(o)){return Promise.resolve(s("URL scheme must be a HTTP(S) scheme"))}if(t.redirectCount===20){return Promise.resolve(s("redirect count exceeded"))}t.redirectCount+=1;if(t.mode==="cors"&&(o.username||o.password)&&!S(t,o)){return Promise.resolve(s('cross origin not allowed for request mode "cors"'))}if(t.responseTainting==="cors"&&(o.username||o.password)){return Promise.resolve(s('URL cannot contain credentials for request mode "cors"'))}if(r.status!==303&&t.body!=null&&t.body.source==null){return Promise.resolve(s())}if([301,302].includes(r.status)&&t.method==="POST"||r.status===303&&!CA.includes(t.method)){t.method="GET";t.body=null;for(const A of j){t.headersList.delete(A)}}if(!S(d(t),o)){t.headersList.delete("authorization");t.headersList.delete("proxy-authorization",true);t.headersList.delete("cookie");t.headersList.delete("host")}if(t.body!=null){P(t.body.source!=null);t.body=W(t.body.source)[0]}const n=A.timingInfo;n.redirectEndTime=n.postRedirectStartTime=m(A.crossOriginIsolatedCapability);if(n.redirectStartTime===0){n.redirectStartTime=n.startTime}t.urlList.push(o);f(t,r);return mainFetch(A,true)}async function httpNetworkOrCacheFetch(A,e=false,t=false){const r=A.request;let n=null;let i=null;let a=null;const E=null;const c=false;if(r.window==="no-window"&&r.redirect==="error"){n=A;i=r}else{i=g(r);n={...A};n.request=i}const Q=r.credentials==="include"||r.credentials==="same-origin"&&r.responseTainting==="basic";const C=i.body?i.body.length:null;let B=null;if(i.body==null&&["POST","PUT"].includes(i.method)){B="0"}if(C!=null){B=Y(`${C}`)}if(B!=null){i.headersList.append("content-length",B)}if(C!=null&&i.keepalive){}if(i.referrer instanceof URL){i.headersList.append("referer",Y(i.referrer.href))}l(i);R(i);if(!i.headersList.contains("user-agent")){i.headersList.append("user-agent",typeof esbuildDetection==="undefined"?"undici":"node")}if(i.cache==="default"&&(i.headersList.contains("if-modified-since")||i.headersList.contains("if-none-match")||i.headersList.contains("if-unmodified-since")||i.headersList.contains("if-match")||i.headersList.contains("if-range"))){i.cache="no-store"}if(i.cache==="no-cache"&&!i.preventNoCacheCacheControlHeaderModification&&!i.headersList.contains("cache-control")){i.headersList.append("cache-control","max-age=0")}if(i.cache==="no-store"||i.cache==="reload"){if(!i.headersList.contains("pragma")){i.headersList.append("pragma","no-cache")}if(!i.headersList.contains("cache-control")){i.headersList.append("cache-control","no-cache")}}if(i.headersList.contains("range")){i.headersList.append("accept-encoding","identity")}if(!i.headersList.contains("accept-encoding")){if(G(d(i))){i.headersList.append("accept-encoding","br, gzip, deflate")}else{i.headersList.append("accept-encoding","gzip, deflate")}}i.headersList.delete("host");if(Q){}if(E==null){i.cache="no-store"}if(i.mode!=="no-store"&&i.mode!=="reload"){}if(a==null){if(i.mode==="only-if-cached"){return s("only if cached")}const A=await httpNetworkFetch(n,Q,t);if(!Z.has(i.method)&&A.status>=200&&A.status<=399){}if(c&&A.status===304){}if(a==null){a=A}}a.urlList=[...i.urlList];if(i.headersList.contains("range")){a.rangeRequested=true}a.requestIncludesCredentials=Q;if(a.status===407){if(r.window==="no-window"){return s()}if(N(A)){return o(A)}return s("proxy authentication required")}if(a.status===421&&!t&&(r.body==null||r.body.source!=null)){if(N(A)){return o(A)}A.controller.connection.destroy();a=await httpNetworkOrCacheFetch(A,e,true)}if(e){}return a}async function httpNetworkFetch(A,e=false,r=false){P(!A.controller.connection||A.controller.connection.destroyed);A.controller.connection={abort:null,destroyed:false,destroy(A){if(!this.destroyed){this.destroyed=true;this.abort?.(A??new K("The operation was aborted.","AbortError"))}}};const n=A.request;let E=null;const g=A.timingInfo;const Q=null;if(Q==null){n.cache="no-store"}const C=r?"yes":"no";if(n.mode==="websocket"){}else{}let B=null;if(n.body==null&&A.processRequestEndOfBody){queueMicrotask((()=>A.processRequestEndOfBody()))}else if(n.body!=null){const processBodyChunk=async function*(e){if(N(A)){return}yield e;A.processRequestBodyChunkLength?.(e.byteLength)};const processEndOfBody=()=>{if(N(A)){return}if(A.processRequestEndOfBody){A.processRequestEndOfBody()}};const processBodyError=e=>{if(N(A)){return}if(e.name==="AbortError"){A.controller.abort()}else{A.controller.terminate(e)}};B=async function*(){try{for await(const A of n.body.stream){yield*processBodyChunk(A)}processEndOfBody()}catch(A){processBodyError(A)}}()}try{const{body:e,status:t,statusText:r,headersList:s,socket:o}=await dispatch({body:B});if(o){E=i({status:t,statusText:r,headersList:s,socket:o})}else{const o=e[Symbol.asyncIterator]();A.controller.next=()=>o.next();E=i({status:t,statusText:r,headersList:s})}}catch(e){if(e.name==="AbortError"){A.controller.connection.destroy();return o(A,e)}return s(e)}const pullAlgorithm=()=>{A.controller.resume()};const cancelAlgorithm=e=>{A.controller.abort(e)};if(!IA){IA=t(3774).ReadableStream}const I=new IA({async start(e){A.controller.controller=e},async pull(A){await pullAlgorithm(A)},async cancel(A){await cancelAlgorithm(A)}},{highWaterMark:0,size(){return 1}});E.body={stream:I};A.controller.on("terminated",onAborted);A.controller.resume=async()=>{while(true){let e;let t;try{const{done:t,value:r}=await A.controller.next();if(U(A)){break}e=t?undefined:r}catch(r){if(A.controller.ended&&!g.encodedBodySize){e=undefined}else{e=r;t=true}}if(e===undefined){T(A.controller.controller);finalizeResponse(A,E);return}g.decodedBodySize+=e?.byteLength??0;if(t){A.controller.terminate(e);return}A.controller.controller.enqueue(new Uint8Array(e));if(rA(I)){A.controller.terminate();return}if(!A.controller.controller.desiredSize){return}}};function onAborted(e){if(U(A)){E.aborted=true;if(sA(I)){A.controller.controller.error(A.controller.serializedAbortReason)}}else{if(sA(I)){A.controller.controller.error(new TypeError("terminated",{cause:L(e)?e:undefined}))}}A.controller.connection.destroy()}return E;async function dispatch({body:e}){const t=d(n);const r=A.controller.dispatcher;return new Promise(((s,o)=>r.dispatch({path:t.pathname+t.search,origin:t.origin,method:n.method,body:A.controller.dispatcher.isMockActive?n.body&&(n.body.source||n.body.stream):e,headers:n.headersList.entries,maxRedirections:0,upgrade:n.mode==="websocket"?"websocket":undefined},{body:null,abort:null,onConnect(e){const{connection:t}=A.controller;if(t.destroyed){e(new K("The operation was aborted.","AbortError"))}else{A.controller.on("terminated",e);this.abort=t.abort=e}},onHeaders(A,e,t,r){if(A<200){return}let o=[];let i="";const E=new a;if(Array.isArray(e)){for(let A=0;AA.trim()))}else if(t.toLowerCase()==="location"){i=r}E[z].append(t,r)}}else{const A=Object.keys(e);for(const t of A){const A=e[t];if(t.toLowerCase()==="content-encoding"){o=A.toLowerCase().split(",").map((A=>A.trim())).reverse()}else if(t.toLowerCase()==="location"){i=A}E[z].append(t,A)}}this.body=new AA({read:t});const g=[];const Q=n.redirect==="follow"&&i&&q.has(A);if(n.method!=="HEAD"&&n.method!=="CONNECT"&&!_.includes(A)&&!Q){for(const A of o){if(A==="x-gzip"||A==="gzip"){g.push(c.createGunzip({flush:c.constants.Z_SYNC_FLUSH,finishFlush:c.constants.Z_SYNC_FLUSH}))}else if(A==="deflate"){g.push(c.createInflate())}else if(A==="br"){g.push(c.createBrotliDecompress())}else{g.length=0;break}}}s({status:A,statusText:r,headersList:E[z],body:g.length?eA(this.body,...g,(()=>{})):this.body.on("error",(()=>{}))});return true},onData(e){if(A.controller.dump){return}const t=e;g.encodedBodySize+=t.byteLength;return this.body.push(t)},onComplete(){if(this.abort){A.controller.off("terminated",this.abort)}A.controller.ended=true;this.body.push(null)},onError(e){if(this.abort){A.controller.off("terminated",this.abort)}this.body?.destroy(e);A.controller.terminate(e);o(e)},onUpgrade(A,e,t){if(A!==101){return}const r=new a;for(let A=0;A{"use strict";const{extractBody:r,mixinBody:s,cloneBody:o}=t(8923);const{Headers:n,fill:i,HeadersList:a}=t(6349);const{FinalizationRegistry:E}=t(3194)();const g=t(3440);const{isValidHTTPToken:c,sameOrigin:Q,normalizeMethod:C,makePolicyContainer:B,normalizeMethodRecord:I}=t(5523);const{forbiddenMethodsSet:h,corsSafeListedMethodsSet:l,referrerPolicy:u,requestRedirect:d,requestMode:f,requestCredentials:p,requestCache:y,requestDuplex:R}=t(7326);const{kEnumerableProperty:D}=g;const{kHeaders:w,kSignal:k,kState:m,kGuard:b,kRealm:F}=t(9710);const{webidl:S}=t(4222);const{getGlobalOrigin:N}=t(5628);const{URLSerializer:U}=t(4322);const{kHeadersList:L,kConstruct:M}=t(6443);const T=t(2613);const{getMaxListeners:Y,setMaxListeners:H,getEventListeners:J,defaultMaxListeners:G}=t(4434);let v=globalThis.TransformStream;const V=Symbol("abortController");const x=new E((({signal:A,abort:e})=>{A.removeEventListener("abort",e)}));class Request{constructor(A,e={}){if(A===M){return}S.argumentLengthCheck(arguments,1,{header:"Request constructor"});A=S.converters.RequestInfo(A);e=S.converters.RequestInit(e);this[F]={settingsObject:{baseUrl:N(),get origin(){return this.baseUrl?.origin},policyContainer:B()}};let s=null;let o=null;const E=this[F].settingsObject.baseUrl;let u=null;if(typeof A==="string"){let e;try{e=new URL(A,E)}catch(e){throw new TypeError("Failed to parse URL from "+A,{cause:e})}if(e.username||e.password){throw new TypeError("Request cannot be constructed from a URL that includes credentials: "+A)}s=makeRequest({urlList:[e]});o="cors"}else{T(A instanceof Request);s=A[m];u=A[k]}const d=this[F].settingsObject.origin;let f="client";if(s.window?.constructor?.name==="EnvironmentSettingsObject"&&Q(s.window,d)){f=s.window}if(e.window!=null){throw new TypeError(`'window' option '${f}' must be null`)}if("window"in e){f="no-window"}s=makeRequest({method:s.method,headersList:s.headersList,unsafeRequest:s.unsafeRequest,client:this[F].settingsObject,window:f,priority:s.priority,origin:s.origin,referrer:s.referrer,referrerPolicy:s.referrerPolicy,mode:s.mode,credentials:s.credentials,cache:s.cache,redirect:s.redirect,integrity:s.integrity,keepalive:s.keepalive,reloadNavigation:s.reloadNavigation,historyNavigation:s.historyNavigation,urlList:[...s.urlList]});const p=Object.keys(e).length!==0;if(p){if(s.mode==="navigate"){s.mode="same-origin"}s.reloadNavigation=false;s.historyNavigation=false;s.origin="client";s.referrer="client";s.referrerPolicy="";s.url=s.urlList[s.urlList.length-1];s.urlList=[s.url]}if(e.referrer!==undefined){const A=e.referrer;if(A===""){s.referrer="no-referrer"}else{let e;try{e=new URL(A,E)}catch(e){throw new TypeError(`Referrer "${A}" is not a valid URL.`,{cause:e})}if(e.protocol==="about:"&&e.hostname==="client"||d&&!Q(e,this[F].settingsObject.baseUrl)){s.referrer="client"}else{s.referrer=e}}}if(e.referrerPolicy!==undefined){s.referrerPolicy=e.referrerPolicy}let y;if(e.mode!==undefined){y=e.mode}else{y=o}if(y==="navigate"){throw S.errors.exception({header:"Request constructor",message:"invalid request mode navigate."})}if(y!=null){s.mode=y}if(e.credentials!==undefined){s.credentials=e.credentials}if(e.cache!==undefined){s.cache=e.cache}if(s.cache==="only-if-cached"&&s.mode!=="same-origin"){throw new TypeError("'only-if-cached' can be set only with 'same-origin' mode")}if(e.redirect!==undefined){s.redirect=e.redirect}if(e.integrity!=null){s.integrity=String(e.integrity)}if(e.keepalive!==undefined){s.keepalive=Boolean(e.keepalive)}if(e.method!==undefined){let A=e.method;if(!c(A)){throw new TypeError(`'${A}' is not a valid HTTP method.`)}if(h.has(A.toUpperCase())){throw new TypeError(`'${A}' HTTP method is unsupported.`)}A=I[A]??C(A);s.method=A}if(e.signal!==undefined){u=e.signal}this[m]=s;const R=new AbortController;this[k]=R.signal;this[k][F]=this[F];if(u!=null){if(!u||typeof u.aborted!=="boolean"||typeof u.addEventListener!=="function"){throw new TypeError("Failed to construct 'Request': member signal is not of type AbortSignal.")}if(u.aborted){R.abort(u.reason)}else{this[V]=R;const A=new WeakRef(R);const abort=function(){const e=A.deref();if(e!==undefined){e.abort(this.reason)}};try{if(typeof Y==="function"&&Y(u)===G){H(100,u)}else if(J(u,"abort").length>=G){H(100,u)}}catch{}g.addAbortListener(u,abort);x.register(R,{signal:u,abort:abort})}}this[w]=new n(M);this[w][L]=s.headersList;this[w][b]="request";this[w][F]=this[F];if(y==="no-cors"){if(!l.has(s.method)){throw new TypeError(`'${s.method} is unsupported in no-cors mode.`)}this[w][b]="request-no-cors"}if(p){const A=this[w][L];const t=e.headers!==undefined?e.headers:new a(A);A.clear();if(t instanceof a){for(const[e,r]of t){A.append(e,r)}A.cookies=t.cookies}else{i(this[w],t)}}const D=A instanceof Request?A[m].body:null;if((e.body!=null||D!=null)&&(s.method==="GET"||s.method==="HEAD")){throw new TypeError("Request with GET/HEAD method cannot have body.")}let U=null;if(e.body!=null){const[A,t]=r(e.body,s.keepalive);U=A;if(t&&!this[w][L].contains("content-type")){this[w].append("content-type",t)}}const O=U??D;if(O!=null&&O.source==null){if(U!=null&&e.duplex==null){throw new TypeError("RequestInit: duplex option is required when sending a body.")}if(s.mode!=="same-origin"&&s.mode!=="cors"){throw new TypeError('If request is made from ReadableStream, mode should be "same-origin" or "cors"')}s.useCORSPreflightFlag=true}let P=O;if(U==null&&D!=null){if(g.isDisturbed(D.stream)||D.stream.locked){throw new TypeError("Cannot construct a Request with a Request object that has already been used.")}if(!v){v=t(3774).TransformStream}const A=new v;D.stream.pipeThrough(A);P={source:D.source,length:D.length,stream:A.readable}}this[m].body=P}get method(){S.brandCheck(this,Request);return this[m].method}get url(){S.brandCheck(this,Request);return U(this[m].url)}get headers(){S.brandCheck(this,Request);return this[w]}get destination(){S.brandCheck(this,Request);return this[m].destination}get referrer(){S.brandCheck(this,Request);if(this[m].referrer==="no-referrer"){return""}if(this[m].referrer==="client"){return"about:client"}return this[m].referrer.toString()}get referrerPolicy(){S.brandCheck(this,Request);return this[m].referrerPolicy}get mode(){S.brandCheck(this,Request);return this[m].mode}get credentials(){return this[m].credentials}get cache(){S.brandCheck(this,Request);return this[m].cache}get redirect(){S.brandCheck(this,Request);return this[m].redirect}get integrity(){S.brandCheck(this,Request);return this[m].integrity}get keepalive(){S.brandCheck(this,Request);return this[m].keepalive}get isReloadNavigation(){S.brandCheck(this,Request);return this[m].reloadNavigation}get isHistoryNavigation(){S.brandCheck(this,Request);return this[m].historyNavigation}get signal(){S.brandCheck(this,Request);return this[k]}get body(){S.brandCheck(this,Request);return this[m].body?this[m].body.stream:null}get bodyUsed(){S.brandCheck(this,Request);return!!this[m].body&&g.isDisturbed(this[m].body.stream)}get duplex(){S.brandCheck(this,Request);return"half"}clone(){S.brandCheck(this,Request);if(this.bodyUsed||this.body?.locked){throw new TypeError("unusable")}const A=cloneRequest(this[m]);const e=new Request(M);e[m]=A;e[F]=this[F];e[w]=new n(M);e[w][L]=A.headersList;e[w][b]=this[w][b];e[w][F]=this[w][F];const t=new AbortController;if(this.signal.aborted){t.abort(this.signal.reason)}else{g.addAbortListener(this.signal,(()=>{t.abort(this.signal.reason)}))}e[k]=t.signal;return e}}s(Request);function makeRequest(A){const e={method:"GET",localURLsOnly:false,unsafeRequest:false,body:null,client:null,reservedClient:null,replacesClientId:"",window:"client",keepalive:false,serviceWorkers:"all",initiator:"",destination:"",priority:null,origin:"client",policyContainer:"client",referrer:"client",referrerPolicy:"",mode:"no-cors",useCORSPreflightFlag:false,credentials:"same-origin",useCredentials:false,cache:"default",redirect:"follow",integrity:"",cryptoGraphicsNonceMetadata:"",parserMetadata:"",reloadNavigation:false,historyNavigation:false,userActivation:false,taintedOrigin:false,redirectCount:0,responseTainting:"basic",preventNoCacheCacheControlHeaderModification:false,done:false,timingAllowFailed:false,...A,headersList:A.headersList?new a(A.headersList):new a};e.url=e.urlList[0];return e}function cloneRequest(A){const e=makeRequest({...A,body:null});if(A.body!=null){e.body=o(A.body)}return e}Object.defineProperties(Request.prototype,{method:D,url:D,headers:D,redirect:D,clone:D,signal:D,duplex:D,destination:D,body:D,bodyUsed:D,isHistoryNavigation:D,isReloadNavigation:D,keepalive:D,integrity:D,cache:D,credentials:D,attribute:D,referrerPolicy:D,referrer:D,mode:D,[Symbol.toStringTag]:{value:"Request",configurable:true}});S.converters.Request=S.interfaceConverter(Request);S.converters.RequestInfo=function(A){if(typeof A==="string"){return S.converters.USVString(A)}if(A instanceof Request){return S.converters.Request(A)}return S.converters.USVString(A)};S.converters.AbortSignal=S.interfaceConverter(AbortSignal);S.converters.RequestInit=S.dictionaryConverter([{key:"method",converter:S.converters.ByteString},{key:"headers",converter:S.converters.HeadersInit},{key:"body",converter:S.nullableConverter(S.converters.BodyInit)},{key:"referrer",converter:S.converters.USVString},{key:"referrerPolicy",converter:S.converters.DOMString,allowedValues:u},{key:"mode",converter:S.converters.DOMString,allowedValues:f},{key:"credentials",converter:S.converters.DOMString,allowedValues:p},{key:"cache",converter:S.converters.DOMString,allowedValues:y},{key:"redirect",converter:S.converters.DOMString,allowedValues:d},{key:"integrity",converter:S.converters.DOMString},{key:"keepalive",converter:S.converters.boolean},{key:"signal",converter:S.nullableConverter((A=>S.converters.AbortSignal(A,{strict:false})))},{key:"window",converter:S.converters.any},{key:"duplex",converter:S.converters.DOMString,allowedValues:R}]);A.exports={Request:Request,makeRequest:makeRequest}},8676:(A,e,t)=>{"use strict";const{Headers:r,HeadersList:s,fill:o}=t(6349);const{extractBody:n,cloneBody:i,mixinBody:a}=t(8923);const E=t(3440);const{kEnumerableProperty:g}=E;const{isValidReasonPhrase:c,isCancelled:Q,isAborted:C,isBlobLike:B,serializeJavascriptValueToJSONString:I,isErrorLike:h,isomorphicEncode:l}=t(5523);const{redirectStatusSet:u,nullBodyStatus:d,DOMException:f}=t(7326);const{kState:p,kHeaders:y,kGuard:R,kRealm:D}=t(9710);const{webidl:w}=t(4222);const{FormData:k}=t(3073);const{getGlobalOrigin:m}=t(5628);const{URLSerializer:b}=t(4322);const{kHeadersList:F,kConstruct:S}=t(6443);const N=t(2613);const{types:U}=t(9023);const L=globalThis.ReadableStream||t(3774).ReadableStream;const M=new TextEncoder("utf-8");class Response{static error(){const A={settingsObject:{}};const e=new Response;e[p]=makeNetworkError();e[D]=A;e[y][F]=e[p].headersList;e[y][R]="immutable";e[y][D]=A;return e}static json(A,e={}){w.argumentLengthCheck(arguments,1,{header:"Response.json"});if(e!==null){e=w.converters.ResponseInit(e)}const t=M.encode(I(A));const r=n(t);const s={settingsObject:{}};const o=new Response;o[D]=s;o[y][R]="response";o[y][D]=s;initializeResponse(o,e,{body:r[0],type:"application/json"});return o}static redirect(A,e=302){const t={settingsObject:{}};w.argumentLengthCheck(arguments,1,{header:"Response.redirect"});A=w.converters.USVString(A);e=w.converters["unsigned short"](e);let r;try{r=new URL(A,m())}catch(e){throw Object.assign(new TypeError("Failed to parse URL from "+A),{cause:e})}if(!u.has(e)){throw new RangeError("Invalid status code "+e)}const s=new Response;s[D]=t;s[y][R]="immutable";s[y][D]=t;s[p].status=e;const o=l(b(r));s[p].headersList.append("location",o);return s}constructor(A=null,e={}){if(A!==null){A=w.converters.BodyInit(A)}e=w.converters.ResponseInit(e);this[D]={settingsObject:{}};this[p]=makeResponse({});this[y]=new r(S);this[y][R]="response";this[y][F]=this[p].headersList;this[y][D]=this[D];let t=null;if(A!=null){const[e,r]=n(A);t={body:e,type:r}}initializeResponse(this,e,t)}get type(){w.brandCheck(this,Response);return this[p].type}get url(){w.brandCheck(this,Response);const A=this[p].urlList;const e=A[A.length-1]??null;if(e===null){return""}return b(e,true)}get redirected(){w.brandCheck(this,Response);return this[p].urlList.length>1}get status(){w.brandCheck(this,Response);return this[p].status}get ok(){w.brandCheck(this,Response);return this[p].status>=200&&this[p].status<=299}get statusText(){w.brandCheck(this,Response);return this[p].statusText}get headers(){w.brandCheck(this,Response);return this[y]}get body(){w.brandCheck(this,Response);return this[p].body?this[p].body.stream:null}get bodyUsed(){w.brandCheck(this,Response);return!!this[p].body&&E.isDisturbed(this[p].body.stream)}clone(){w.brandCheck(this,Response);if(this.bodyUsed||this.body&&this.body.locked){throw w.errors.exception({header:"Response.clone",message:"Body has already been consumed."})}const A=cloneResponse(this[p]);const e=new Response;e[p]=A;e[D]=this[D];e[y][F]=A.headersList;e[y][R]=this[y][R];e[y][D]=this[y][D];return e}}a(Response);Object.defineProperties(Response.prototype,{type:g,url:g,status:g,ok:g,redirected:g,statusText:g,headers:g,clone:g,body:g,bodyUsed:g,[Symbol.toStringTag]:{value:"Response",configurable:true}});Object.defineProperties(Response,{json:g,redirect:g,error:g});function cloneResponse(A){if(A.internalResponse){return filterResponse(cloneResponse(A.internalResponse),A.type)}const e=makeResponse({...A,body:null});if(A.body!=null){e.body=i(A.body)}return e}function makeResponse(A){return{aborted:false,rangeRequested:false,timingAllowPassed:false,requestIncludesCredentials:false,type:"default",status:200,timingInfo:null,cacheState:"",statusText:"",...A,headersList:A.headersList?new s(A.headersList):new s,urlList:A.urlList?[...A.urlList]:[]}}function makeNetworkError(A){const e=h(A);return makeResponse({type:"error",status:0,error:e?A:new Error(A?String(A):A),aborted:A&&A.name==="AbortError"})}function makeFilteredResponse(A,e){e={internalResponse:A,...e};return new Proxy(A,{get(A,t){return t in e?e[t]:A[t]},set(A,t,r){N(!(t in e));A[t]=r;return true}})}function filterResponse(A,e){if(e==="basic"){return makeFilteredResponse(A,{type:"basic",headersList:A.headersList})}else if(e==="cors"){return makeFilteredResponse(A,{type:"cors",headersList:A.headersList})}else if(e==="opaque"){return makeFilteredResponse(A,{type:"opaque",urlList:Object.freeze([]),status:0,statusText:"",body:null})}else if(e==="opaqueredirect"){return makeFilteredResponse(A,{type:"opaqueredirect",status:0,statusText:"",headersList:[],body:null})}else{N(false)}}function makeAppropriateNetworkError(A,e=null){N(Q(A));return C(A)?makeNetworkError(Object.assign(new f("The operation was aborted.","AbortError"),{cause:e})):makeNetworkError(Object.assign(new f("Request was cancelled."),{cause:e}))}function initializeResponse(A,e,t){if(e.status!==null&&(e.status<200||e.status>599)){throw new RangeError('init["status"] must be in the range of 200 to 599, inclusive.')}if("statusText"in e&&e.statusText!=null){if(!c(String(e.statusText))){throw new TypeError("Invalid statusText")}}if("status"in e&&e.status!=null){A[p].status=e.status}if("statusText"in e&&e.statusText!=null){A[p].statusText=e.statusText}if("headers"in e&&e.headers!=null){o(A[y],e.headers)}if(t){if(d.includes(A.status)){throw w.errors.exception({header:"Response constructor",message:"Invalid response status code "+A.status})}A[p].body=t.body;if(t.type!=null&&!A[p].headersList.contains("Content-Type")){A[p].headersList.append("content-type",t.type)}}}w.converters.ReadableStream=w.interfaceConverter(L);w.converters.FormData=w.interfaceConverter(k);w.converters.URLSearchParams=w.interfaceConverter(URLSearchParams);w.converters.XMLHttpRequestBodyInit=function(A){if(typeof A==="string"){return w.converters.USVString(A)}if(B(A)){return w.converters.Blob(A,{strict:false})}if(U.isArrayBuffer(A)||U.isTypedArray(A)||U.isDataView(A)){return w.converters.BufferSource(A)}if(E.isFormDataLike(A)){return w.converters.FormData(A,{strict:false})}if(A instanceof URLSearchParams){return w.converters.URLSearchParams(A)}return w.converters.DOMString(A)};w.converters.BodyInit=function(A){if(A instanceof L){return w.converters.ReadableStream(A)}if(A?.[Symbol.asyncIterator]){return A}return w.converters.XMLHttpRequestBodyInit(A)};w.converters.ResponseInit=w.dictionaryConverter([{key:"status",converter:w.converters["unsigned short"],defaultValue:200},{key:"statusText",converter:w.converters.ByteString,defaultValue:""},{key:"headers",converter:w.converters.HeadersInit}]);A.exports={makeNetworkError:makeNetworkError,makeResponse:makeResponse,makeAppropriateNetworkError:makeAppropriateNetworkError,filterResponse:filterResponse,Response:Response,cloneResponse:cloneResponse}},9710:A=>{"use strict";A.exports={kUrl:Symbol("url"),kHeaders:Symbol("headers"),kSignal:Symbol("signal"),kState:Symbol("state"),kGuard:Symbol("guard"),kRealm:Symbol("realm")}},5523:(A,e,t)=>{"use strict";const{redirectStatusSet:r,referrerPolicySet:s,badPortsSet:o}=t(7326);const{getGlobalOrigin:n}=t(5628);const{performance:i}=t(2987);const{isBlobLike:a,toUSVString:E,ReadableStreamFrom:g}=t(3440);const c=t(2613);const{isUint8Array:Q}=t(8253);let C=[];let B;try{B=t(6982);const A=["sha256","sha384","sha512"];C=B.getHashes().filter((e=>A.includes(e)))}catch{}function responseURL(A){const e=A.urlList;const t=e.length;return t===0?null:e[t-1].toString()}function responseLocationURL(A,e){if(!r.has(A.status)){return null}let t=A.headersList.get("location");if(t!==null&&isValidHeaderValue(t)){t=new URL(t,responseURL(A))}if(t&&!t.hash){t.hash=e}return t}function requestCurrentURL(A){return A.urlList[A.urlList.length-1]}function requestBadPort(A){const e=requestCurrentURL(A);if(urlIsHttpHttpsScheme(e)&&o.has(e.port)){return"blocked"}return"allowed"}function isErrorLike(A){return A instanceof Error||(A?.constructor?.name==="Error"||A?.constructor?.name==="DOMException")}function isValidReasonPhrase(A){for(let e=0;e=32&&t<=126||t>=128&&t<=255)){return false}}return true}function isTokenCharCode(A){switch(A){case 34:case 40:case 41:case 44:case 47:case 58:case 59:case 60:case 61:case 62:case 63:case 64:case 91:case 92:case 93:case 123:case 125:return false;default:return A>=33&&A<=126}}function isValidHTTPToken(A){if(A.length===0){return false}for(let e=0;e0){for(let A=r.length;A!==0;A--){const e=r[A-1].trim();if(s.has(e)){o=e;break}}}if(o!==""){A.referrerPolicy=o}}function crossOriginResourcePolicyCheck(){return"allowed"}function corsCheck(){return"success"}function TAOCheck(){return"success"}function appendFetchMetadata(A){let e=null;e=A.mode;A.headersList.set("sec-fetch-mode",e)}function appendRequestOriginHeader(A){let e=A.origin;if(A.responseTainting==="cors"||A.mode==="websocket"){if(e){A.headersList.append("origin",e)}}else if(A.method!=="GET"&&A.method!=="HEAD"){switch(A.referrerPolicy){case"no-referrer":e=null;break;case"no-referrer-when-downgrade":case"strict-origin":case"strict-origin-when-cross-origin":if(A.origin&&urlHasHttpsScheme(A.origin)&&!urlHasHttpsScheme(requestCurrentURL(A))){e=null}break;case"same-origin":if(!sameOrigin(A,requestCurrentURL(A))){e=null}break;default:}if(e){A.headersList.append("origin",e)}}}function coarsenedSharedCurrentTime(A){return i.now()}function createOpaqueTimingInfo(A){return{startTime:A.startTime??0,redirectStartTime:0,redirectEndTime:0,postRedirectStartTime:A.startTime??0,finalServiceWorkerStartTime:0,finalNetworkResponseStartTime:0,finalNetworkRequestStartTime:0,endTime:0,encodedBodySize:0,decodedBodySize:0,finalConnectionTimingInfo:null}}function makePolicyContainer(){return{referrerPolicy:"strict-origin-when-cross-origin"}}function clonePolicyContainer(A){return{referrerPolicy:A.referrerPolicy}}function determineRequestsReferrer(A){const e=A.referrerPolicy;c(e);let t=null;if(A.referrer==="client"){const A=n();if(!A||A.origin==="null"){return"no-referrer"}t=new URL(A)}else if(A.referrer instanceof URL){t=A.referrer}let r=stripURLForReferrer(t);const s=stripURLForReferrer(t,true);if(r.toString().length>4096){r=s}const o=sameOrigin(A,r);const i=isURLPotentiallyTrustworthy(r)&&!isURLPotentiallyTrustworthy(A.url);switch(e){case"origin":return s!=null?s:stripURLForReferrer(t,true);case"unsafe-url":return r;case"same-origin":return o?s:"no-referrer";case"origin-when-cross-origin":return o?r:s;case"strict-origin-when-cross-origin":{const e=requestCurrentURL(A);if(sameOrigin(r,e)){return r}if(isURLPotentiallyTrustworthy(r)&&!isURLPotentiallyTrustworthy(e)){return"no-referrer"}return s}case"strict-origin":case"no-referrer-when-downgrade":default:return i?"no-referrer":s}}function stripURLForReferrer(A,e){c(A instanceof URL);if(A.protocol==="file:"||A.protocol==="about:"||A.protocol==="blank:"){return"no-referrer"}A.username="";A.password="";A.hash="";if(e){A.pathname="";A.search=""}return A}function isURLPotentiallyTrustworthy(A){if(!(A instanceof URL)){return false}if(A.href==="about:blank"||A.href==="about:srcdoc"){return true}if(A.protocol==="data:")return true;if(A.protocol==="file:")return true;return isOriginPotentiallyTrustworthy(A.origin);function isOriginPotentiallyTrustworthy(A){if(A==null||A==="null")return false;const e=new URL(A);if(e.protocol==="https:"||e.protocol==="wss:"){return true}if(/^127(?:\.[0-9]+){0,2}\.[0-9]+$|^\[(?:0*:)*?:?0*1\]$/.test(e.hostname)||(e.hostname==="localhost"||e.hostname.includes("localhost."))||e.hostname.endsWith(".localhost")){return true}return false}}function bytesMatch(A,e){if(B===undefined){return true}const t=parseMetadata(e);if(t==="no metadata"){return true}if(t.length===0){return true}const r=getStrongestMetadata(t);const s=filterMetadataListByAlgorithm(t,r);for(const e of s){const t=e.algo;const r=e.hash;let s=B.createHash(t).update(A).digest("base64");if(s[s.length-1]==="="){if(s[s.length-2]==="="){s=s.slice(0,-2)}else{s=s.slice(0,-1)}}if(compareBase64Mixed(s,r)){return true}}return false}const I=/(?sha256|sha384|sha512)-((?[A-Za-z0-9+/]+|[A-Za-z0-9_-]+)={0,2}(?:\s|$)( +[!-~]*)?)?/i;function parseMetadata(A){const e=[];let t=true;for(const r of A.split(" ")){t=false;const A=I.exec(r);if(A===null||A.groups===undefined||A.groups.algo===undefined){continue}const s=A.groups.algo.toLowerCase();if(C.includes(s)){e.push(A.groups)}}if(t===true){return"no metadata"}return e}function getStrongestMetadata(A){let e=A[0].algo;if(e[3]==="5"){return e}for(let t=1;t{A=t;e=r}));return{promise:t,resolve:A,reject:e}}function isAborted(A){return A.controller.state==="aborted"}function isCancelled(A){return A.controller.state==="aborted"||A.controller.state==="terminated"}const h={delete:"DELETE",DELETE:"DELETE",get:"GET",GET:"GET",head:"HEAD",HEAD:"HEAD",options:"OPTIONS",OPTIONS:"OPTIONS",post:"POST",POST:"POST",put:"PUT",PUT:"PUT"};Object.setPrototypeOf(h,null);function normalizeMethod(A){return h[A.toLowerCase()]??A}function serializeJavascriptValueToJSONString(A){const e=JSON.stringify(A);if(e===undefined){throw new TypeError("Value is not JSON serializable")}c(typeof e==="string");return e}const l=Object.getPrototypeOf(Object.getPrototypeOf([][Symbol.iterator]()));function makeIterator(A,e,t){const r={index:0,kind:t,target:A};const s={next(){if(Object.getPrototypeOf(this)!==s){throw new TypeError(`'next' called on an object that does not implement interface ${e} Iterator.`)}const{index:A,kind:t,target:o}=r;const n=o();const i=n.length;if(A>=i){return{value:undefined,done:true}}const a=n[A];r.index=A+1;return iteratorResult(a,t)},[Symbol.toStringTag]:`${e} Iterator`};Object.setPrototypeOf(s,l);return Object.setPrototypeOf({},s)}function iteratorResult(A,e){let t;switch(e){case"key":{t=A[0];break}case"value":{t=A[1];break}case"key+value":{t=A;break}}return{value:t,done:false}}async function fullyReadBody(A,e,t){const r=e;const s=t;let o;try{o=A.stream.getReader()}catch(A){s(A);return}try{const A=await readAllBytes(o);r(A)}catch(A){s(A)}}let u=globalThis.ReadableStream;function isReadableStreamLike(A){if(!u){u=t(3774).ReadableStream}return A instanceof u||A[Symbol.toStringTag]==="ReadableStream"&&typeof A.tee==="function"}const d=65535;function isomorphicDecode(A){if(A.lengthA+String.fromCharCode(e)),"")}function readableStreamClose(A){try{A.close()}catch(A){if(!A.message.includes("Controller is already closed")){throw A}}}function isomorphicEncode(A){for(let e=0;eObject.prototype.hasOwnProperty.call(A,e));A.exports={isAborted:isAborted,isCancelled:isCancelled,createDeferredPromise:createDeferredPromise,ReadableStreamFrom:g,toUSVString:E,tryUpgradeRequestToAPotentiallyTrustworthyURL:tryUpgradeRequestToAPotentiallyTrustworthyURL,coarsenedSharedCurrentTime:coarsenedSharedCurrentTime,determineRequestsReferrer:determineRequestsReferrer,makePolicyContainer:makePolicyContainer,clonePolicyContainer:clonePolicyContainer,appendFetchMetadata:appendFetchMetadata,appendRequestOriginHeader:appendRequestOriginHeader,TAOCheck:TAOCheck,corsCheck:corsCheck,crossOriginResourcePolicyCheck:crossOriginResourcePolicyCheck,createOpaqueTimingInfo:createOpaqueTimingInfo,setRequestReferrerPolicyOnRedirect:setRequestReferrerPolicyOnRedirect,isValidHTTPToken:isValidHTTPToken,requestBadPort:requestBadPort,requestCurrentURL:requestCurrentURL,responseURL:responseURL,responseLocationURL:responseLocationURL,isBlobLike:a,isURLPotentiallyTrustworthy:isURLPotentiallyTrustworthy,isValidReasonPhrase:isValidReasonPhrase,sameOrigin:sameOrigin,normalizeMethod:normalizeMethod,serializeJavascriptValueToJSONString:serializeJavascriptValueToJSONString,makeIterator:makeIterator,isValidHeaderName:isValidHeaderName,isValidHeaderValue:isValidHeaderValue,hasOwn:f,isErrorLike:isErrorLike,fullyReadBody:fullyReadBody,bytesMatch:bytesMatch,isReadableStreamLike:isReadableStreamLike,readableStreamClose:readableStreamClose,isomorphicEncode:isomorphicEncode,isomorphicDecode:isomorphicDecode,urlIsLocal:urlIsLocal,urlHasHttpsScheme:urlHasHttpsScheme,urlIsHttpHttpsScheme:urlIsHttpHttpsScheme,readAllBytes:readAllBytes,normalizeMethodRecord:h,parseMetadata:parseMetadata}},4222:(A,e,t)=>{"use strict";const{types:r}=t(9023);const{hasOwn:s,toUSVString:o}=t(5523);const n={};n.converters={};n.util={};n.errors={};n.errors.exception=function(A){return new TypeError(`${A.header}: ${A.message}`)};n.errors.conversionFailed=function(A){const e=A.types.length===1?"":" one of";const t=`${A.argument} could not be converted to`+`${e}: ${A.types.join(", ")}.`;return n.errors.exception({header:A.prefix,message:t})};n.errors.invalidArgument=function(A){return n.errors.exception({header:A.prefix,message:`"${A.value}" is an invalid ${A.type}.`})};n.brandCheck=function(A,e,t=undefined){if(t?.strict!==false&&!(A instanceof e)){throw new TypeError("Illegal invocation")}else{return A?.[Symbol.toStringTag]===e.prototype[Symbol.toStringTag]}};n.argumentLengthCheck=function({length:A},e,t){if(As){throw n.errors.exception({header:"Integer conversion",message:`Value must be between ${o}-${s}, got ${i}.`})}return i}if(!Number.isNaN(i)&&r.clamp===true){i=Math.min(Math.max(i,o),s);if(Math.floor(i)%2===0){i=Math.floor(i)}else{i=Math.ceil(i)}return i}if(Number.isNaN(i)||i===0&&Object.is(0,i)||i===Number.POSITIVE_INFINITY||i===Number.NEGATIVE_INFINITY){return 0}i=n.util.IntegerPart(i);i=i%Math.pow(2,e);if(t==="signed"&&i>=Math.pow(2,e)-1){return i-Math.pow(2,e)}return i};n.util.IntegerPart=function(A){const e=Math.floor(Math.abs(A));if(A<0){return-1*e}return e};n.sequenceConverter=function(A){return e=>{if(n.util.Type(e)!=="Object"){throw n.errors.exception({header:"Sequence",message:`Value of type ${n.util.Type(e)} is not an Object.`})}const t=e?.[Symbol.iterator]?.();const r=[];if(t===undefined||typeof t.next!=="function"){throw n.errors.exception({header:"Sequence",message:"Object is not an iterator."})}while(true){const{done:e,value:s}=t.next();if(e){break}r.push(A(s))}return r}};n.recordConverter=function(A,e){return t=>{if(n.util.Type(t)!=="Object"){throw n.errors.exception({header:"Record",message:`Value of type ${n.util.Type(t)} is not an Object.`})}const s={};if(!r.isProxy(t)){const r=Object.keys(t);for(const o of r){const r=A(o);const n=e(t[o]);s[r]=n}return s}const o=Reflect.ownKeys(t);for(const r of o){const o=Reflect.getOwnPropertyDescriptor(t,r);if(o?.enumerable){const o=A(r);const n=e(t[r]);s[o]=n}}return s}};n.interfaceConverter=function(A){return(e,t={})=>{if(t.strict!==false&&!(e instanceof A)){throw n.errors.exception({header:A.name,message:`Expected ${e} to be an instance of ${A.name}.`})}return e}};n.dictionaryConverter=function(A){return e=>{const t=n.util.Type(e);const r={};if(t==="Null"||t==="Undefined"){return r}else if(t!=="Object"){throw n.errors.exception({header:"Dictionary",message:`Expected ${e} to be one of: Null, Undefined, Object.`})}for(const t of A){const{key:A,defaultValue:o,required:i,converter:a}=t;if(i===true){if(!s(e,A)){throw n.errors.exception({header:"Dictionary",message:`Missing required key "${A}".`})}}let E=e[A];const g=s(t,"defaultValue");if(g&&E!==null){E=E??o}if(i||g||E!==undefined){E=a(E);if(t.allowedValues&&!t.allowedValues.includes(E)){throw n.errors.exception({header:"Dictionary",message:`${E} is not an accepted type. Expected one of ${t.allowedValues.join(", ")}.`})}r[A]=E}}return r}};n.nullableConverter=function(A){return e=>{if(e===null){return e}return A(e)}};n.converters.DOMString=function(A,e={}){if(A===null&&e.legacyNullToEmptyString){return""}if(typeof A==="symbol"){throw new TypeError("Could not convert argument of type symbol to string.")}return String(A)};n.converters.ByteString=function(A){const e=n.converters.DOMString(A);for(let A=0;A255){throw new TypeError("Cannot convert argument to a ByteString because the character at "+`index ${A} has a value of ${e.charCodeAt(A)} which is greater than 255.`)}}return e};n.converters.USVString=o;n.converters.boolean=function(A){const e=Boolean(A);return e};n.converters.any=function(A){return A};n.converters["long long"]=function(A){const e=n.util.ConvertToInt(A,64,"signed");return e};n.converters["unsigned long long"]=function(A){const e=n.util.ConvertToInt(A,64,"unsigned");return e};n.converters["unsigned long"]=function(A){const e=n.util.ConvertToInt(A,32,"unsigned");return e};n.converters["unsigned short"]=function(A,e){const t=n.util.ConvertToInt(A,16,"unsigned",e);return t};n.converters.ArrayBuffer=function(A,e={}){if(n.util.Type(A)!=="Object"||!r.isAnyArrayBuffer(A)){throw n.errors.conversionFailed({prefix:`${A}`,argument:`${A}`,types:["ArrayBuffer"]})}if(e.allowShared===false&&r.isSharedArrayBuffer(A)){throw n.errors.exception({header:"ArrayBuffer",message:"SharedArrayBuffer is not allowed."})}return A};n.converters.TypedArray=function(A,e,t={}){if(n.util.Type(A)!=="Object"||!r.isTypedArray(A)||A.constructor.name!==e.name){throw n.errors.conversionFailed({prefix:`${e.name}`,argument:`${A}`,types:[e.name]})}if(t.allowShared===false&&r.isSharedArrayBuffer(A.buffer)){throw n.errors.exception({header:"ArrayBuffer",message:"SharedArrayBuffer is not allowed."})}return A};n.converters.DataView=function(A,e={}){if(n.util.Type(A)!=="Object"||!r.isDataView(A)){throw n.errors.exception({header:"DataView",message:"Object is not a DataView."})}if(e.allowShared===false&&r.isSharedArrayBuffer(A.buffer)){throw n.errors.exception({header:"ArrayBuffer",message:"SharedArrayBuffer is not allowed."})}return A};n.converters.BufferSource=function(A,e={}){if(r.isAnyArrayBuffer(A)){return n.converters.ArrayBuffer(A,e)}if(r.isTypedArray(A)){return n.converters.TypedArray(A,A.constructor)}if(r.isDataView(A)){return n.converters.DataView(A,e)}throw new TypeError(`Could not convert ${A} to a BufferSource.`)};n.converters["sequence"]=n.sequenceConverter(n.converters.ByteString);n.converters["sequence>"]=n.sequenceConverter(n.converters["sequence"]);n.converters["record"]=n.recordConverter(n.converters.ByteString,n.converters.ByteString);A.exports={webidl:n}},396:A=>{"use strict";function getEncoding(A){if(!A){return"failure"}switch(A.trim().toLowerCase()){case"unicode-1-1-utf-8":case"unicode11utf8":case"unicode20utf8":case"utf-8":case"utf8":case"x-unicode20utf8":return"UTF-8";case"866":case"cp866":case"csibm866":case"ibm866":return"IBM866";case"csisolatin2":case"iso-8859-2":case"iso-ir-101":case"iso8859-2":case"iso88592":case"iso_8859-2":case"iso_8859-2:1987":case"l2":case"latin2":return"ISO-8859-2";case"csisolatin3":case"iso-8859-3":case"iso-ir-109":case"iso8859-3":case"iso88593":case"iso_8859-3":case"iso_8859-3:1988":case"l3":case"latin3":return"ISO-8859-3";case"csisolatin4":case"iso-8859-4":case"iso-ir-110":case"iso8859-4":case"iso88594":case"iso_8859-4":case"iso_8859-4:1988":case"l4":case"latin4":return"ISO-8859-4";case"csisolatincyrillic":case"cyrillic":case"iso-8859-5":case"iso-ir-144":case"iso8859-5":case"iso88595":case"iso_8859-5":case"iso_8859-5:1988":return"ISO-8859-5";case"arabic":case"asmo-708":case"csiso88596e":case"csiso88596i":case"csisolatinarabic":case"ecma-114":case"iso-8859-6":case"iso-8859-6-e":case"iso-8859-6-i":case"iso-ir-127":case"iso8859-6":case"iso88596":case"iso_8859-6":case"iso_8859-6:1987":return"ISO-8859-6";case"csisolatingreek":case"ecma-118":case"elot_928":case"greek":case"greek8":case"iso-8859-7":case"iso-ir-126":case"iso8859-7":case"iso88597":case"iso_8859-7":case"iso_8859-7:1987":case"sun_eu_greek":return"ISO-8859-7";case"csiso88598e":case"csisolatinhebrew":case"hebrew":case"iso-8859-8":case"iso-8859-8-e":case"iso-ir-138":case"iso8859-8":case"iso88598":case"iso_8859-8":case"iso_8859-8:1988":case"visual":return"ISO-8859-8";case"csiso88598i":case"iso-8859-8-i":case"logical":return"ISO-8859-8-I";case"csisolatin6":case"iso-8859-10":case"iso-ir-157":case"iso8859-10":case"iso885910":case"l6":case"latin6":return"ISO-8859-10";case"iso-8859-13":case"iso8859-13":case"iso885913":return"ISO-8859-13";case"iso-8859-14":case"iso8859-14":case"iso885914":return"ISO-8859-14";case"csisolatin9":case"iso-8859-15":case"iso8859-15":case"iso885915":case"iso_8859-15":case"l9":return"ISO-8859-15";case"iso-8859-16":return"ISO-8859-16";case"cskoi8r":case"koi":case"koi8":case"koi8-r":case"koi8_r":return"KOI8-R";case"koi8-ru":case"koi8-u":return"KOI8-U";case"csmacintosh":case"mac":case"macintosh":case"x-mac-roman":return"macintosh";case"iso-8859-11":case"iso8859-11":case"iso885911":case"tis-620":case"windows-874":return"windows-874";case"cp1250":case"windows-1250":case"x-cp1250":return"windows-1250";case"cp1251":case"windows-1251":case"x-cp1251":return"windows-1251";case"ansi_x3.4-1968":case"ascii":case"cp1252":case"cp819":case"csisolatin1":case"ibm819":case"iso-8859-1":case"iso-ir-100":case"iso8859-1":case"iso88591":case"iso_8859-1":case"iso_8859-1:1987":case"l1":case"latin1":case"us-ascii":case"windows-1252":case"x-cp1252":return"windows-1252";case"cp1253":case"windows-1253":case"x-cp1253":return"windows-1253";case"cp1254":case"csisolatin5":case"iso-8859-9":case"iso-ir-148":case"iso8859-9":case"iso88599":case"iso_8859-9":case"iso_8859-9:1989":case"l5":case"latin5":case"windows-1254":case"x-cp1254":return"windows-1254";case"cp1255":case"windows-1255":case"x-cp1255":return"windows-1255";case"cp1256":case"windows-1256":case"x-cp1256":return"windows-1256";case"cp1257":case"windows-1257":case"x-cp1257":return"windows-1257";case"cp1258":case"windows-1258":case"x-cp1258":return"windows-1258";case"x-mac-cyrillic":case"x-mac-ukrainian":return"x-mac-cyrillic";case"chinese":case"csgb2312":case"csiso58gb231280":case"gb2312":case"gb_2312":case"gb_2312-80":case"gbk":case"iso-ir-58":case"x-gbk":return"GBK";case"gb18030":return"gb18030";case"big5":case"big5-hkscs":case"cn-big5":case"csbig5":case"x-x-big5":return"Big5";case"cseucpkdfmtjapanese":case"euc-jp":case"x-euc-jp":return"EUC-JP";case"csiso2022jp":case"iso-2022-jp":return"ISO-2022-JP";case"csshiftjis":case"ms932":case"ms_kanji":case"shift-jis":case"shift_jis":case"sjis":case"windows-31j":case"x-sjis":return"Shift_JIS";case"cseuckr":case"csksc56011987":case"euc-kr":case"iso-ir-149":case"korean":case"ks_c_5601-1987":case"ks_c_5601-1989":case"ksc5601":case"ksc_5601":case"windows-949":return"EUC-KR";case"csiso2022kr":case"hz-gb-2312":case"iso-2022-cn":case"iso-2022-cn-ext":case"iso-2022-kr":case"replacement":return"replacement";case"unicodefffe":case"utf-16be":return"UTF-16BE";case"csunicode":case"iso-10646-ucs-2":case"ucs-2":case"unicode":case"unicodefeff":case"utf-16":case"utf-16le":return"UTF-16LE";case"x-user-defined":return"x-user-defined";default:return"failure"}}A.exports={getEncoding:getEncoding}},2160:(A,e,t)=>{"use strict";const{staticPropertyDescriptors:r,readOperation:s,fireAProgressEvent:o}=t(165);const{kState:n,kError:i,kResult:a,kEvents:E,kAborted:g}=t(6812);const{webidl:c}=t(4222);const{kEnumerableProperty:Q}=t(3440);class FileReader extends EventTarget{constructor(){super();this[n]="empty";this[a]=null;this[i]=null;this[E]={loadend:null,error:null,abort:null,load:null,progress:null,loadstart:null}}readAsArrayBuffer(A){c.brandCheck(this,FileReader);c.argumentLengthCheck(arguments,1,{header:"FileReader.readAsArrayBuffer"});A=c.converters.Blob(A,{strict:false});s(this,A,"ArrayBuffer")}readAsBinaryString(A){c.brandCheck(this,FileReader);c.argumentLengthCheck(arguments,1,{header:"FileReader.readAsBinaryString"});A=c.converters.Blob(A,{strict:false});s(this,A,"BinaryString")}readAsText(A,e=undefined){c.brandCheck(this,FileReader);c.argumentLengthCheck(arguments,1,{header:"FileReader.readAsText"});A=c.converters.Blob(A,{strict:false});if(e!==undefined){e=c.converters.DOMString(e)}s(this,A,"Text",e)}readAsDataURL(A){c.brandCheck(this,FileReader);c.argumentLengthCheck(arguments,1,{header:"FileReader.readAsDataURL"});A=c.converters.Blob(A,{strict:false});s(this,A,"DataURL")}abort(){if(this[n]==="empty"||this[n]==="done"){this[a]=null;return}if(this[n]==="loading"){this[n]="done";this[a]=null}this[g]=true;o("abort",this);if(this[n]!=="loading"){o("loadend",this)}}get readyState(){c.brandCheck(this,FileReader);switch(this[n]){case"empty":return this.EMPTY;case"loading":return this.LOADING;case"done":return this.DONE}}get result(){c.brandCheck(this,FileReader);return this[a]}get error(){c.brandCheck(this,FileReader);return this[i]}get onloadend(){c.brandCheck(this,FileReader);return this[E].loadend}set onloadend(A){c.brandCheck(this,FileReader);if(this[E].loadend){this.removeEventListener("loadend",this[E].loadend)}if(typeof A==="function"){this[E].loadend=A;this.addEventListener("loadend",A)}else{this[E].loadend=null}}get onerror(){c.brandCheck(this,FileReader);return this[E].error}set onerror(A){c.brandCheck(this,FileReader);if(this[E].error){this.removeEventListener("error",this[E].error)}if(typeof A==="function"){this[E].error=A;this.addEventListener("error",A)}else{this[E].error=null}}get onloadstart(){c.brandCheck(this,FileReader);return this[E].loadstart}set onloadstart(A){c.brandCheck(this,FileReader);if(this[E].loadstart){this.removeEventListener("loadstart",this[E].loadstart)}if(typeof A==="function"){this[E].loadstart=A;this.addEventListener("loadstart",A)}else{this[E].loadstart=null}}get onprogress(){c.brandCheck(this,FileReader);return this[E].progress}set onprogress(A){c.brandCheck(this,FileReader);if(this[E].progress){this.removeEventListener("progress",this[E].progress)}if(typeof A==="function"){this[E].progress=A;this.addEventListener("progress",A)}else{this[E].progress=null}}get onload(){c.brandCheck(this,FileReader);return this[E].load}set onload(A){c.brandCheck(this,FileReader);if(this[E].load){this.removeEventListener("load",this[E].load)}if(typeof A==="function"){this[E].load=A;this.addEventListener("load",A)}else{this[E].load=null}}get onabort(){c.brandCheck(this,FileReader);return this[E].abort}set onabort(A){c.brandCheck(this,FileReader);if(this[E].abort){this.removeEventListener("abort",this[E].abort)}if(typeof A==="function"){this[E].abort=A;this.addEventListener("abort",A)}else{this[E].abort=null}}}FileReader.EMPTY=FileReader.prototype.EMPTY=0;FileReader.LOADING=FileReader.prototype.LOADING=1;FileReader.DONE=FileReader.prototype.DONE=2;Object.defineProperties(FileReader.prototype,{EMPTY:r,LOADING:r,DONE:r,readAsArrayBuffer:Q,readAsBinaryString:Q,readAsText:Q,readAsDataURL:Q,abort:Q,readyState:Q,result:Q,error:Q,onloadstart:Q,onprogress:Q,onload:Q,onabort:Q,onerror:Q,onloadend:Q,[Symbol.toStringTag]:{value:"FileReader",writable:false,enumerable:false,configurable:true}});Object.defineProperties(FileReader,{EMPTY:r,LOADING:r,DONE:r});A.exports={FileReader:FileReader}},5976:(A,e,t)=>{"use strict";const{webidl:r}=t(4222);const s=Symbol("ProgressEvent state");class ProgressEvent extends Event{constructor(A,e={}){A=r.converters.DOMString(A);e=r.converters.ProgressEventInit(e??{});super(A,e);this[s]={lengthComputable:e.lengthComputable,loaded:e.loaded,total:e.total}}get lengthComputable(){r.brandCheck(this,ProgressEvent);return this[s].lengthComputable}get loaded(){r.brandCheck(this,ProgressEvent);return this[s].loaded}get total(){r.brandCheck(this,ProgressEvent);return this[s].total}}r.converters.ProgressEventInit=r.dictionaryConverter([{key:"lengthComputable",converter:r.converters.boolean,defaultValue:false},{key:"loaded",converter:r.converters["unsigned long long"],defaultValue:0},{key:"total",converter:r.converters["unsigned long long"],defaultValue:0},{key:"bubbles",converter:r.converters.boolean,defaultValue:false},{key:"cancelable",converter:r.converters.boolean,defaultValue:false},{key:"composed",converter:r.converters.boolean,defaultValue:false}]);A.exports={ProgressEvent:ProgressEvent}},6812:A=>{"use strict";A.exports={kState:Symbol("FileReader state"),kResult:Symbol("FileReader result"),kError:Symbol("FileReader error"),kLastProgressEventFired:Symbol("FileReader last progress event fired timestamp"),kEvents:Symbol("FileReader events"),kAborted:Symbol("FileReader aborted")}},165:(A,e,t)=>{"use strict";const{kState:r,kError:s,kResult:o,kAborted:n,kLastProgressEventFired:i}=t(6812);const{ProgressEvent:a}=t(5976);const{getEncoding:E}=t(396);const{DOMException:g}=t(7326);const{serializeAMimeType:c,parseMIMEType:Q}=t(4322);const{types:C}=t(9023);const{StringDecoder:B}=t(3193);const{btoa:I}=t(181);const h={enumerable:true,writable:false,configurable:false};function readOperation(A,e,t,a){if(A[r]==="loading"){throw new g("Invalid state","InvalidStateError")}A[r]="loading";A[o]=null;A[s]=null;const E=e.stream();const c=E.getReader();const Q=[];let B=c.read();let I=true;(async()=>{while(!A[n]){try{const{done:E,value:g}=await B;if(I&&!A[n]){queueMicrotask((()=>{fireAProgressEvent("loadstart",A)}))}I=false;if(!E&&C.isUint8Array(g)){Q.push(g);if((A[i]===undefined||Date.now()-A[i]>=50)&&!A[n]){A[i]=Date.now();queueMicrotask((()=>{fireAProgressEvent("progress",A)}))}B=c.read()}else if(E){queueMicrotask((()=>{A[r]="done";try{const r=packageData(Q,t,e.type,a);if(A[n]){return}A[o]=r;fireAProgressEvent("load",A)}catch(e){A[s]=e;fireAProgressEvent("error",A)}if(A[r]!=="loading"){fireAProgressEvent("loadend",A)}}));break}}catch(e){if(A[n]){return}queueMicrotask((()=>{A[r]="done";A[s]=e;fireAProgressEvent("error",A);if(A[r]!=="loading"){fireAProgressEvent("loadend",A)}}));break}}})()}function fireAProgressEvent(A,e){const t=new a(A,{bubbles:false,cancelable:false});e.dispatchEvent(t)}function packageData(A,e,t,r){switch(e){case"DataURL":{let e="data:";const r=Q(t||"application/octet-stream");if(r!=="failure"){e+=c(r)}e+=";base64,";const s=new B("latin1");for(const t of A){e+=I(s.write(t))}e+=I(s.end());return e}case"Text":{let e="failure";if(r){e=E(r)}if(e==="failure"&&t){const A=Q(t);if(A!=="failure"){e=E(A.parameters.get("charset"))}}if(e==="failure"){e="UTF-8"}return decode(A,e)}case"ArrayBuffer":{const e=combineByteSequences(A);return e.buffer}case"BinaryString":{let e="";const t=new B("latin1");for(const r of A){e+=t.write(r)}e+=t.end();return e}}}function decode(A,e){const t=combineByteSequences(A);const r=BOMSniffing(t);let s=0;if(r!==null){e=r;s=r==="UTF-8"?3:2}const o=t.slice(s);return new TextDecoder(e).decode(o)}function BOMSniffing(A){const[e,t,r]=A;if(e===239&&t===187&&r===191){return"UTF-8"}else if(e===254&&t===255){return"UTF-16BE"}else if(e===255&&t===254){return"UTF-16LE"}return null}function combineByteSequences(A){const e=A.reduce(((A,e)=>A+e.byteLength),0);let t=0;return A.reduce(((A,e)=>{A.set(e,t);t+=e.byteLength;return A}),new Uint8Array(e))}A.exports={staticPropertyDescriptors:h,readOperation:readOperation,fireAProgressEvent:fireAProgressEvent}},2581:(A,e,t)=>{"use strict";const r=Symbol.for("undici.globalDispatcher.1");const{InvalidArgumentError:s}=t(8707);const o=t(9965);if(getGlobalDispatcher()===undefined){setGlobalDispatcher(new o)}function setGlobalDispatcher(A){if(!A||typeof A.dispatch!=="function"){throw new s("Argument agent must implement Agent")}Object.defineProperty(globalThis,r,{value:A,writable:true,enumerable:false,configurable:false})}function getGlobalDispatcher(){return globalThis[r]}A.exports={setGlobalDispatcher:setGlobalDispatcher,getGlobalDispatcher:getGlobalDispatcher}},8840:A=>{"use strict";A.exports=class DecoratorHandler{constructor(A){this.handler=A}onConnect(...A){return this.handler.onConnect(...A)}onError(...A){return this.handler.onError(...A)}onUpgrade(...A){return this.handler.onUpgrade(...A)}onHeaders(...A){return this.handler.onHeaders(...A)}onData(...A){return this.handler.onData(...A)}onComplete(...A){return this.handler.onComplete(...A)}onBodySent(...A){return this.handler.onBodySent(...A)}}},8299:(A,e,t)=>{"use strict";const r=t(3440);const{kBodyUsed:s}=t(6443);const o=t(2613);const{InvalidArgumentError:n}=t(8707);const i=t(4434);const a=[300,301,302,303,307,308];const E=Symbol("body");class BodyAsyncIterable{constructor(A){this[E]=A;this[s]=false}async*[Symbol.asyncIterator](){o(!this[s],"disturbed");this[s]=true;yield*this[E]}}class RedirectHandler{constructor(A,e,t,a){if(e!=null&&(!Number.isInteger(e)||e<0)){throw new n("maxRedirections must be a positive number")}r.validateHandler(a,t.method,t.upgrade);this.dispatch=A;this.location=null;this.abort=null;this.opts={...t,maxRedirections:0};this.maxRedirections=e;this.handler=a;this.history=[];if(r.isStream(this.opts.body)){if(r.bodyLength(this.opts.body)===0){this.opts.body.on("data",(function(){o(false)}))}if(typeof this.opts.body.readableDidRead!=="boolean"){this.opts.body[s]=false;i.prototype.on.call(this.opts.body,"data",(function(){this[s]=true}))}}else if(this.opts.body&&typeof this.opts.body.pipeTo==="function"){this.opts.body=new BodyAsyncIterable(this.opts.body)}else if(this.opts.body&&typeof this.opts.body!=="string"&&!ArrayBuffer.isView(this.opts.body)&&r.isIterable(this.opts.body)){this.opts.body=new BodyAsyncIterable(this.opts.body)}}onConnect(A){this.abort=A;this.handler.onConnect(A,{history:this.history})}onUpgrade(A,e,t){this.handler.onUpgrade(A,e,t)}onError(A){this.handler.onError(A)}onHeaders(A,e,t,s){this.location=this.history.length>=this.maxRedirections||r.isDisturbed(this.opts.body)?null:parseLocation(A,e);if(this.opts.origin){this.history.push(new URL(this.opts.path,this.opts.origin))}if(!this.location){return this.handler.onHeaders(A,e,t,s)}const{origin:o,pathname:n,search:i}=r.parseURL(new URL(this.location,this.opts.origin&&new URL(this.opts.path,this.opts.origin)));const a=i?`${n}${i}`:n;this.opts.headers=cleanRequestHeaders(this.opts.headers,A===303,this.opts.origin!==o);this.opts.path=a;this.opts.origin=o;this.opts.maxRedirections=0;this.opts.query=null;if(A===303&&this.opts.method!=="HEAD"){this.opts.method="GET";this.opts.body=null}}onData(A){if(this.location){}else{return this.handler.onData(A)}}onComplete(A){if(this.location){this.location=null;this.abort=null;this.dispatch(this.opts,this)}else{this.handler.onComplete(A)}}onBodySent(A){if(this.handler.onBodySent){this.handler.onBodySent(A)}}}function parseLocation(A,e){if(a.indexOf(A)===-1){return null}for(let A=0;A{const r=t(2613);const{kRetryHandlerDefaultRetry:s}=t(6443);const{RequestRetryError:o}=t(8707);const{isDisturbed:n,parseHeaders:i,parseRangeHeader:a}=t(3440);function calculateRetryAfterHeader(A){const e=Date.now();const t=new Date(A).getTime()-e;return t}class RetryHandler{constructor(A,e){const{retryOptions:t,...r}=A;const{retry:o,maxRetries:n,maxTimeout:i,minTimeout:a,timeoutFactor:E,methods:g,errorCodes:c,retryAfter:Q,statusCodes:C}=t??{};this.dispatch=e.dispatch;this.handler=e.handler;this.opts=r;this.abort=null;this.aborted=false;this.retryOpts={retry:o??RetryHandler[s],retryAfter:Q??true,maxTimeout:i??30*1e3,timeout:a??500,timeoutFactor:E??2,maxRetries:n??5,methods:g??["GET","HEAD","OPTIONS","PUT","DELETE","TRACE"],statusCodes:C??[500,502,503,504,429],errorCodes:c??["ECONNRESET","ECONNREFUSED","ENOTFOUND","ENETDOWN","ENETUNREACH","EHOSTDOWN","EHOSTUNREACH","EPIPE"]};this.retryCount=0;this.start=0;this.end=null;this.etag=null;this.resume=null;this.handler.onConnect((A=>{this.aborted=true;if(this.abort){this.abort(A)}else{this.reason=A}}))}onRequestSent(){if(this.handler.onRequestSent){this.handler.onRequestSent()}}onUpgrade(A,e,t){if(this.handler.onUpgrade){this.handler.onUpgrade(A,e,t)}}onConnect(A){if(this.aborted){A(this.reason)}else{this.abort=A}}onBodySent(A){if(this.handler.onBodySent)return this.handler.onBodySent(A)}static[s](A,{state:e,opts:t},r){const{statusCode:s,code:o,headers:n}=A;const{method:i,retryOptions:a}=t;const{maxRetries:E,timeout:g,maxTimeout:c,timeoutFactor:Q,statusCodes:C,errorCodes:B,methods:I}=a;let{counter:h,currentTimeout:l}=e;l=l!=null&&l>0?l:g;if(o&&o!=="UND_ERR_REQ_RETRY"&&o!=="UND_ERR_SOCKET"&&!B.includes(o)){r(A);return}if(Array.isArray(I)&&!I.includes(i)){r(A);return}if(s!=null&&Array.isArray(C)&&!C.includes(s)){r(A);return}if(h>E){r(A);return}let u=n!=null&&n["retry-after"];if(u){u=Number(u);u=isNaN(u)?calculateRetryAfterHeader(u):u*1e3}const d=u>0?Math.min(u,c):Math.min(l*Q**h,c);e.currentTimeout=d;setTimeout((()=>r(null)),d)}onHeaders(A,e,t,s){const n=i(e);this.retryCount+=1;if(A>=300){this.abort(new o("Request failed",A,{headers:n,count:this.retryCount}));return false}if(this.resume!=null){this.resume=null;if(A!==206){return true}const e=a(n["content-range"]);if(!e){this.abort(new o("Content-Range mismatch",A,{headers:n,count:this.retryCount}));return false}if(this.etag!=null&&this.etag!==n.etag){this.abort(new o("ETag mismatch",A,{headers:n,count:this.retryCount}));return false}const{start:s,size:i,end:E=i}=e;r(this.start===s,"content-range mismatch");r(this.end==null||this.end===E,"content-range mismatch");this.resume=t;return true}if(this.end==null){if(A===206){const o=a(n["content-range"]);if(o==null){return this.handler.onHeaders(A,e,t,s)}const{start:i,size:E,end:g=E}=o;r(i!=null&&Number.isFinite(i)&&this.start!==i,"content-range mismatch");r(Number.isFinite(i));r(g!=null&&Number.isFinite(g)&&this.end!==g,"invalid content-length");this.start=i;this.end=g}if(this.end==null){const A=n["content-length"];this.end=A!=null?Number(A):null}r(Number.isFinite(this.start));r(this.end==null||Number.isFinite(this.end),"invalid content-length");this.resume=t;this.etag=n.etag!=null?n.etag:null;return this.handler.onHeaders(A,e,t,s)}const E=new o("Request failed",A,{headers:n,count:this.retryCount});this.abort(E);return false}onData(A){this.start+=A.length;return this.handler.onData(A)}onComplete(A){this.retryCount=0;return this.handler.onComplete(A)}onError(A){if(this.aborted||n(this.opts.body)){return this.handler.onError(A)}this.retryOpts.retry(A,{state:{counter:this.retryCount++,currentTimeout:this.retryAfter},opts:{retryOptions:this.retryOpts,...this.opts}},onRetry.bind(this));function onRetry(A){if(A!=null||this.aborted||n(this.opts.body)){return this.handler.onError(A)}if(this.start!==0){this.opts={...this.opts,headers:{...this.opts.headers,range:`bytes=${this.start}-${this.end??""}`}}}try{this.dispatch(this.opts,this)}catch(A){this.handler.onError(A)}}}}A.exports=RetryHandler},4415:(A,e,t)=>{"use strict";const r=t(8299);function createRedirectInterceptor({maxRedirections:A}){return e=>function Intercept(t,s){const{maxRedirections:o=A}=t;if(!o){return e(t,s)}const n=new r(e,o,t,s);t={...t,maxRedirections:0};return e(t,n)}}A.exports=createRedirectInterceptor},2824:(A,e,t)=>{"use strict";Object.defineProperty(e,"__esModule",{value:true});e.SPECIAL_HEADERS=e.HEADER_STATE=e.MINOR=e.MAJOR=e.CONNECTION_TOKEN_CHARS=e.HEADER_CHARS=e.TOKEN=e.STRICT_TOKEN=e.HEX=e.URL_CHAR=e.STRICT_URL_CHAR=e.USERINFO_CHARS=e.MARK=e.ALPHANUM=e.NUM=e.HEX_MAP=e.NUM_MAP=e.ALPHA=e.FINISH=e.H_METHOD_MAP=e.METHOD_MAP=e.METHODS_RTSP=e.METHODS_ICE=e.METHODS_HTTP=e.METHODS=e.LENIENT_FLAGS=e.FLAGS=e.TYPE=e.ERROR=void 0;const r=t(172);var s;(function(A){A[A["OK"]=0]="OK";A[A["INTERNAL"]=1]="INTERNAL";A[A["STRICT"]=2]="STRICT";A[A["LF_EXPECTED"]=3]="LF_EXPECTED";A[A["UNEXPECTED_CONTENT_LENGTH"]=4]="UNEXPECTED_CONTENT_LENGTH";A[A["CLOSED_CONNECTION"]=5]="CLOSED_CONNECTION";A[A["INVALID_METHOD"]=6]="INVALID_METHOD";A[A["INVALID_URL"]=7]="INVALID_URL";A[A["INVALID_CONSTANT"]=8]="INVALID_CONSTANT";A[A["INVALID_VERSION"]=9]="INVALID_VERSION";A[A["INVALID_HEADER_TOKEN"]=10]="INVALID_HEADER_TOKEN";A[A["INVALID_CONTENT_LENGTH"]=11]="INVALID_CONTENT_LENGTH";A[A["INVALID_CHUNK_SIZE"]=12]="INVALID_CHUNK_SIZE";A[A["INVALID_STATUS"]=13]="INVALID_STATUS";A[A["INVALID_EOF_STATE"]=14]="INVALID_EOF_STATE";A[A["INVALID_TRANSFER_ENCODING"]=15]="INVALID_TRANSFER_ENCODING";A[A["CB_MESSAGE_BEGIN"]=16]="CB_MESSAGE_BEGIN";A[A["CB_HEADERS_COMPLETE"]=17]="CB_HEADERS_COMPLETE";A[A["CB_MESSAGE_COMPLETE"]=18]="CB_MESSAGE_COMPLETE";A[A["CB_CHUNK_HEADER"]=19]="CB_CHUNK_HEADER";A[A["CB_CHUNK_COMPLETE"]=20]="CB_CHUNK_COMPLETE";A[A["PAUSED"]=21]="PAUSED";A[A["PAUSED_UPGRADE"]=22]="PAUSED_UPGRADE";A[A["PAUSED_H2_UPGRADE"]=23]="PAUSED_H2_UPGRADE";A[A["USER"]=24]="USER"})(s=e.ERROR||(e.ERROR={}));var o;(function(A){A[A["BOTH"]=0]="BOTH";A[A["REQUEST"]=1]="REQUEST";A[A["RESPONSE"]=2]="RESPONSE"})(o=e.TYPE||(e.TYPE={}));var n;(function(A){A[A["CONNECTION_KEEP_ALIVE"]=1]="CONNECTION_KEEP_ALIVE";A[A["CONNECTION_CLOSE"]=2]="CONNECTION_CLOSE";A[A["CONNECTION_UPGRADE"]=4]="CONNECTION_UPGRADE";A[A["CHUNKED"]=8]="CHUNKED";A[A["UPGRADE"]=16]="UPGRADE";A[A["CONTENT_LENGTH"]=32]="CONTENT_LENGTH";A[A["SKIPBODY"]=64]="SKIPBODY";A[A["TRAILING"]=128]="TRAILING";A[A["TRANSFER_ENCODING"]=512]="TRANSFER_ENCODING"})(n=e.FLAGS||(e.FLAGS={}));var i;(function(A){A[A["HEADERS"]=1]="HEADERS";A[A["CHUNKED_LENGTH"]=2]="CHUNKED_LENGTH";A[A["KEEP_ALIVE"]=4]="KEEP_ALIVE"})(i=e.LENIENT_FLAGS||(e.LENIENT_FLAGS={}));var a;(function(A){A[A["DELETE"]=0]="DELETE";A[A["GET"]=1]="GET";A[A["HEAD"]=2]="HEAD";A[A["POST"]=3]="POST";A[A["PUT"]=4]="PUT";A[A["CONNECT"]=5]="CONNECT";A[A["OPTIONS"]=6]="OPTIONS";A[A["TRACE"]=7]="TRACE";A[A["COPY"]=8]="COPY";A[A["LOCK"]=9]="LOCK";A[A["MKCOL"]=10]="MKCOL";A[A["MOVE"]=11]="MOVE";A[A["PROPFIND"]=12]="PROPFIND";A[A["PROPPATCH"]=13]="PROPPATCH";A[A["SEARCH"]=14]="SEARCH";A[A["UNLOCK"]=15]="UNLOCK";A[A["BIND"]=16]="BIND";A[A["REBIND"]=17]="REBIND";A[A["UNBIND"]=18]="UNBIND";A[A["ACL"]=19]="ACL";A[A["REPORT"]=20]="REPORT";A[A["MKACTIVITY"]=21]="MKACTIVITY";A[A["CHECKOUT"]=22]="CHECKOUT";A[A["MERGE"]=23]="MERGE";A[A["M-SEARCH"]=24]="M-SEARCH";A[A["NOTIFY"]=25]="NOTIFY";A[A["SUBSCRIBE"]=26]="SUBSCRIBE";A[A["UNSUBSCRIBE"]=27]="UNSUBSCRIBE";A[A["PATCH"]=28]="PATCH";A[A["PURGE"]=29]="PURGE";A[A["MKCALENDAR"]=30]="MKCALENDAR";A[A["LINK"]=31]="LINK";A[A["UNLINK"]=32]="UNLINK";A[A["SOURCE"]=33]="SOURCE";A[A["PRI"]=34]="PRI";A[A["DESCRIBE"]=35]="DESCRIBE";A[A["ANNOUNCE"]=36]="ANNOUNCE";A[A["SETUP"]=37]="SETUP";A[A["PLAY"]=38]="PLAY";A[A["PAUSE"]=39]="PAUSE";A[A["TEARDOWN"]=40]="TEARDOWN";A[A["GET_PARAMETER"]=41]="GET_PARAMETER";A[A["SET_PARAMETER"]=42]="SET_PARAMETER";A[A["REDIRECT"]=43]="REDIRECT";A[A["RECORD"]=44]="RECORD";A[A["FLUSH"]=45]="FLUSH"})(a=e.METHODS||(e.METHODS={}));e.METHODS_HTTP=[a.DELETE,a.GET,a.HEAD,a.POST,a.PUT,a.CONNECT,a.OPTIONS,a.TRACE,a.COPY,a.LOCK,a.MKCOL,a.MOVE,a.PROPFIND,a.PROPPATCH,a.SEARCH,a.UNLOCK,a.BIND,a.REBIND,a.UNBIND,a.ACL,a.REPORT,a.MKACTIVITY,a.CHECKOUT,a.MERGE,a["M-SEARCH"],a.NOTIFY,a.SUBSCRIBE,a.UNSUBSCRIBE,a.PATCH,a.PURGE,a.MKCALENDAR,a.LINK,a.UNLINK,a.PRI,a.SOURCE];e.METHODS_ICE=[a.SOURCE];e.METHODS_RTSP=[a.OPTIONS,a.DESCRIBE,a.ANNOUNCE,a.SETUP,a.PLAY,a.PAUSE,a.TEARDOWN,a.GET_PARAMETER,a.SET_PARAMETER,a.REDIRECT,a.RECORD,a.FLUSH,a.GET,a.POST];e.METHOD_MAP=r.enumToMap(a);e.H_METHOD_MAP={};Object.keys(e.METHOD_MAP).forEach((A=>{if(/^H/.test(A)){e.H_METHOD_MAP[A]=e.METHOD_MAP[A]}}));var E;(function(A){A[A["SAFE"]=0]="SAFE";A[A["SAFE_WITH_CB"]=1]="SAFE_WITH_CB";A[A["UNSAFE"]=2]="UNSAFE"})(E=e.FINISH||(e.FINISH={}));e.ALPHA=[];for(let A="A".charCodeAt(0);A<="Z".charCodeAt(0);A++){e.ALPHA.push(String.fromCharCode(A));e.ALPHA.push(String.fromCharCode(A+32))}e.NUM_MAP={0:0,1:1,2:2,3:3,4:4,5:5,6:6,7:7,8:8,9:9};e.HEX_MAP={0:0,1:1,2:2,3:3,4:4,5:5,6:6,7:7,8:8,9:9,A:10,B:11,C:12,D:13,E:14,F:15,a:10,b:11,c:12,d:13,e:14,f:15};e.NUM=["0","1","2","3","4","5","6","7","8","9"];e.ALPHANUM=e.ALPHA.concat(e.NUM);e.MARK=["-","_",".","!","~","*","'","(",")"];e.USERINFO_CHARS=e.ALPHANUM.concat(e.MARK).concat(["%",";",":","&","=","+","$",","]);e.STRICT_URL_CHAR=["!",'"',"$","%","&","'","(",")","*","+",",","-",".","/",":",";","<","=",">","@","[","\\","]","^","_","`","{","|","}","~"].concat(e.ALPHANUM);e.URL_CHAR=e.STRICT_URL_CHAR.concat(["\t","\f"]);for(let A=128;A<=255;A++){e.URL_CHAR.push(A)}e.HEX=e.NUM.concat(["a","b","c","d","e","f","A","B","C","D","E","F"]);e.STRICT_TOKEN=["!","#","$","%","&","'","*","+","-",".","^","_","`","|","~"].concat(e.ALPHANUM);e.TOKEN=e.STRICT_TOKEN.concat([" "]);e.HEADER_CHARS=["\t"];for(let A=32;A<=255;A++){if(A!==127){e.HEADER_CHARS.push(A)}}e.CONNECTION_TOKEN_CHARS=e.HEADER_CHARS.filter((A=>A!==44));e.MAJOR=e.NUM_MAP;e.MINOR=e.MAJOR;var g;(function(A){A[A["GENERAL"]=0]="GENERAL";A[A["CONNECTION"]=1]="CONNECTION";A[A["CONTENT_LENGTH"]=2]="CONTENT_LENGTH";A[A["TRANSFER_ENCODING"]=3]="TRANSFER_ENCODING";A[A["UPGRADE"]=4]="UPGRADE";A[A["CONNECTION_KEEP_ALIVE"]=5]="CONNECTION_KEEP_ALIVE";A[A["CONNECTION_CLOSE"]=6]="CONNECTION_CLOSE";A[A["CONNECTION_UPGRADE"]=7]="CONNECTION_UPGRADE";A[A["TRANSFER_ENCODING_CHUNKED"]=8]="TRANSFER_ENCODING_CHUNKED"})(g=e.HEADER_STATE||(e.HEADER_STATE={}));e.SPECIAL_HEADERS={connection:g.CONNECTION,"content-length":g.CONTENT_LENGTH,"proxy-connection":g.CONNECTION,"transfer-encoding":g.TRANSFER_ENCODING,upgrade:g.UPGRADE}},3870:A=>{A.exports="AGFzbQEAAAABMAhgAX8Bf2ADf39/AX9gBH9/f38Bf2AAAGADf39/AGABfwBgAn9/AGAGf39/f39/AALLAQgDZW52GHdhc21fb25faGVhZGVyc19jb21wbGV0ZQACA2VudhV3YXNtX29uX21lc3NhZ2VfYmVnaW4AAANlbnYLd2FzbV9vbl91cmwAAQNlbnYOd2FzbV9vbl9zdGF0dXMAAQNlbnYUd2FzbV9vbl9oZWFkZXJfZmllbGQAAQNlbnYUd2FzbV9vbl9oZWFkZXJfdmFsdWUAAQNlbnYMd2FzbV9vbl9ib2R5AAEDZW52GHdhc21fb25fbWVzc2FnZV9jb21wbGV0ZQAAA0ZFAwMEAAAFAAAAAAAABQEFAAUFBQAABgAAAAAGBgYGAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQABAAABAQcAAAUFAwABBAUBcAESEgUDAQACBggBfwFBgNQECwfRBSIGbWVtb3J5AgALX2luaXRpYWxpemUACRlfX2luZGlyZWN0X2Z1bmN0aW9uX3RhYmxlAQALbGxodHRwX2luaXQAChhsbGh0dHBfc2hvdWxkX2tlZXBfYWxpdmUAQQxsbGh0dHBfYWxsb2MADAZtYWxsb2MARgtsbGh0dHBfZnJlZQANBGZyZWUASA9sbGh0dHBfZ2V0X3R5cGUADhVsbGh0dHBfZ2V0X2h0dHBfbWFqb3IADxVsbGh0dHBfZ2V0X2h0dHBfbWlub3IAEBFsbGh0dHBfZ2V0X21ldGhvZAARFmxsaHR0cF9nZXRfc3RhdHVzX2NvZGUAEhJsbGh0dHBfZ2V0X3VwZ3JhZGUAEwxsbGh0dHBfcmVzZXQAFA5sbGh0dHBfZXhlY3V0ZQAVFGxsaHR0cF9zZXR0aW5nc19pbml0ABYNbGxodHRwX2ZpbmlzaAAXDGxsaHR0cF9wYXVzZQAYDWxsaHR0cF9yZXN1bWUAGRtsbGh0dHBfcmVzdW1lX2FmdGVyX3VwZ3JhZGUAGhBsbGh0dHBfZ2V0X2Vycm5vABsXbGxodHRwX2dldF9lcnJvcl9yZWFzb24AHBdsbGh0dHBfc2V0X2Vycm9yX3JlYXNvbgAdFGxsaHR0cF9nZXRfZXJyb3JfcG9zAB4RbGxodHRwX2Vycm5vX25hbWUAHxJsbGh0dHBfbWV0aG9kX25hbWUAIBJsbGh0dHBfc3RhdHVzX25hbWUAIRpsbGh0dHBfc2V0X2xlbmllbnRfaGVhZGVycwAiIWxsaHR0cF9zZXRfbGVuaWVudF9jaHVua2VkX2xlbmd0aAAjHWxsaHR0cF9zZXRfbGVuaWVudF9rZWVwX2FsaXZlACQkbGxodHRwX3NldF9sZW5pZW50X3RyYW5zZmVyX2VuY29kaW5nACUYbGxodHRwX21lc3NhZ2VfbmVlZHNfZW9mAD8JFwEAQQELEQECAwQFCwYHNTk3MS8tJyspCsLgAkUCAAsIABCIgICAAAsZACAAEMKAgIAAGiAAIAI2AjggACABOgAoCxwAIAAgAC8BMiAALQAuIAAQwYCAgAAQgICAgAALKgEBf0HAABDGgICAACIBEMKAgIAAGiABQYCIgIAANgI4IAEgADoAKCABCwoAIAAQyICAgAALBwAgAC0AKAsHACAALQAqCwcAIAAtACsLBwAgAC0AKQsHACAALwEyCwcAIAAtAC4LRQEEfyAAKAIYIQEgAC0ALSECIAAtACghAyAAKAI4IQQgABDCgICAABogACAENgI4IAAgAzoAKCAAIAI6AC0gACABNgIYCxEAIAAgASABIAJqEMOAgIAACxAAIABBAEHcABDMgICAABoLZwEBf0EAIQECQCAAKAIMDQACQAJAAkACQCAALQAvDgMBAAMCCyAAKAI4IgFFDQAgASgCLCIBRQ0AIAAgARGAgICAAAAiAQ0DC0EADwsQyoCAgAAACyAAQcOWgIAANgIQQQ4hAQsgAQseAAJAIAAoAgwNACAAQdGbgIAANgIQIABBFTYCDAsLFgACQCAAKAIMQRVHDQAgAEEANgIMCwsWAAJAIAAoAgxBFkcNACAAQQA2AgwLCwcAIAAoAgwLBwAgACgCEAsJACAAIAE2AhALBwAgACgCFAsiAAJAIABBJEkNABDKgICAAAALIABBAnRBoLOAgABqKAIACyIAAkAgAEEuSQ0AEMqAgIAAAAsgAEECdEGwtICAAGooAgAL7gsBAX9B66iAgAAhAQJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAIABBnH9qDvQDY2IAAWFhYWFhYQIDBAVhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhBgcICQoLDA0OD2FhYWFhEGFhYWFhYWFhYWFhEWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYRITFBUWFxgZGhthYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhHB0eHyAhIiMkJSYnKCkqKywtLi8wMTIzNDU2YTc4OTphYWFhYWFhYTthYWE8YWFhYT0+P2FhYWFhYWFhQGFhQWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYUJDREVGR0hJSktMTU5PUFFSU2FhYWFhYWFhVFVWV1hZWlthXF1hYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFeYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhX2BhC0Hhp4CAAA8LQaShgIAADwtBy6yAgAAPC0H+sYCAAA8LQcCkgIAADwtBq6SAgAAPC0GNqICAAA8LQeKmgIAADwtBgLCAgAAPC0G5r4CAAA8LQdekgIAADwtB75+AgAAPC0Hhn4CAAA8LQfqfgIAADwtB8qCAgAAPC0Gor4CAAA8LQa6ygIAADwtBiLCAgAAPC0Hsp4CAAA8LQYKigIAADwtBjp2AgAAPC0HQroCAAA8LQcqjgIAADwtBxbKAgAAPC0HfnICAAA8LQdKcgIAADwtBxKCAgAAPC0HXoICAAA8LQaKfgIAADwtB7a6AgAAPC0GrsICAAA8LQdSlgIAADwtBzK6AgAAPC0H6roCAAA8LQfyrgIAADwtB0rCAgAAPC0HxnYCAAA8LQbuggIAADwtB96uAgAAPC0GQsYCAAA8LQdexgIAADwtBoq2AgAAPC0HUp4CAAA8LQeCrgIAADwtBn6yAgAAPC0HrsYCAAA8LQdWfgIAADwtByrGAgAAPC0HepYCAAA8LQdSegIAADwtB9JyAgAAPC0GnsoCAAA8LQbGdgIAADwtBoJ2AgAAPC0G5sYCAAA8LQbywgIAADwtBkqGAgAAPC0GzpoCAAA8LQemsgIAADwtBrJ6AgAAPC0HUq4CAAA8LQfemgIAADwtBgKaAgAAPC0GwoYCAAA8LQf6egIAADwtBjaOAgAAPC0GJrYCAAA8LQfeigIAADwtBoLGAgAAPC0Gun4CAAA8LQcalgIAADwtB6J6AgAAPC0GTooCAAA8LQcKvgIAADwtBw52AgAAPC0GLrICAAA8LQeGdgIAADwtBja+AgAAPC0HqoYCAAA8LQbStgIAADwtB0q+AgAAPC0HfsoCAAA8LQdKygIAADwtB8LCAgAAPC0GpooCAAA8LQfmjgIAADwtBmZ6AgAAPC0G1rICAAA8LQZuwgIAADwtBkrKAgAAPC0G2q4CAAA8LQcKigIAADwtB+LKAgAAPC0GepYCAAA8LQdCigIAADwtBup6AgAAPC0GBnoCAAA8LEMqAgIAAAAtB1qGAgAAhAQsgAQsWACAAIAAtAC1B/gFxIAFBAEdyOgAtCxkAIAAgAC0ALUH9AXEgAUEAR0EBdHI6AC0LGQAgACAALQAtQfsBcSABQQBHQQJ0cjoALQsZACAAIAAtAC1B9wFxIAFBAEdBA3RyOgAtCy4BAn9BACEDAkAgACgCOCIERQ0AIAQoAgAiBEUNACAAIAQRgICAgAAAIQMLIAMLSQECf0EAIQMCQCAAKAI4IgRFDQAgBCgCBCIERQ0AIAAgASACIAFrIAQRgYCAgAAAIgNBf0cNACAAQcaRgIAANgIQQRghAwsgAwsuAQJ/QQAhAwJAIAAoAjgiBEUNACAEKAIwIgRFDQAgACAEEYCAgIAAACEDCyADC0kBAn9BACEDAkAgACgCOCIERQ0AIAQoAggiBEUNACAAIAEgAiABayAEEYGAgIAAACIDQX9HDQAgAEH2ioCAADYCEEEYIQMLIAMLLgECf0EAIQMCQCAAKAI4IgRFDQAgBCgCNCIERQ0AIAAgBBGAgICAAAAhAwsgAwtJAQJ/QQAhAwJAIAAoAjgiBEUNACAEKAIMIgRFDQAgACABIAIgAWsgBBGBgICAAAAiA0F/Rw0AIABB7ZqAgAA2AhBBGCEDCyADCy4BAn9BACEDAkAgACgCOCIERQ0AIAQoAjgiBEUNACAAIAQRgICAgAAAIQMLIAMLSQECf0EAIQMCQCAAKAI4IgRFDQAgBCgCECIERQ0AIAAgASACIAFrIAQRgYCAgAAAIgNBf0cNACAAQZWQgIAANgIQQRghAwsgAwsuAQJ/QQAhAwJAIAAoAjgiBEUNACAEKAI8IgRFDQAgACAEEYCAgIAAACEDCyADC0kBAn9BACEDAkAgACgCOCIERQ0AIAQoAhQiBEUNACAAIAEgAiABayAEEYGAgIAAACIDQX9HDQAgAEGqm4CAADYCEEEYIQMLIAMLLgECf0EAIQMCQCAAKAI4IgRFDQAgBCgCQCIERQ0AIAAgBBGAgICAAAAhAwsgAwtJAQJ/QQAhAwJAIAAoAjgiBEUNACAEKAIYIgRFDQAgACABIAIgAWsgBBGBgICAAAAiA0F/Rw0AIABB7ZOAgAA2AhBBGCEDCyADCy4BAn9BACEDAkAgACgCOCIERQ0AIAQoAkQiBEUNACAAIAQRgICAgAAAIQMLIAMLLgECf0EAIQMCQCAAKAI4IgRFDQAgBCgCJCIERQ0AIAAgBBGAgICAAAAhAwsgAwsuAQJ/QQAhAwJAIAAoAjgiBEUNACAEKAIsIgRFDQAgACAEEYCAgIAAACEDCyADC0kBAn9BACEDAkAgACgCOCIERQ0AIAQoAigiBEUNACAAIAEgAiABayAEEYGAgIAAACIDQX9HDQAgAEH2iICAADYCEEEYIQMLIAMLLgECf0EAIQMCQCAAKAI4IgRFDQAgBCgCUCIERQ0AIAAgBBGAgICAAAAhAwsgAwtJAQJ/QQAhAwJAIAAoAjgiBEUNACAEKAIcIgRFDQAgACABIAIgAWsgBBGBgICAAAAiA0F/Rw0AIABBwpmAgAA2AhBBGCEDCyADCy4BAn9BACEDAkAgACgCOCIERQ0AIAQoAkgiBEUNACAAIAQRgICAgAAAIQMLIAMLSQECf0EAIQMCQCAAKAI4IgRFDQAgBCgCICIERQ0AIAAgASACIAFrIAQRgYCAgAAAIgNBf0cNACAAQZSUgIAANgIQQRghAwsgAwsuAQJ/QQAhAwJAIAAoAjgiBEUNACAEKAJMIgRFDQAgACAEEYCAgIAAACEDCyADCy4BAn9BACEDAkAgACgCOCIERQ0AIAQoAlQiBEUNACAAIAQRgICAgAAAIQMLIAMLLgECf0EAIQMCQCAAKAI4IgRFDQAgBCgCWCIERQ0AIAAgBBGAgICAAAAhAwsgAwtFAQF/AkACQCAALwEwQRRxQRRHDQBBASEDIAAtAChBAUYNASAALwEyQeUARiEDDAELIAAtAClBBUYhAwsgACADOgAuQQAL/gEBA39BASEDAkAgAC8BMCIEQQhxDQAgACkDIEIAUiEDCwJAAkAgAC0ALkUNAEEBIQUgAC0AKUEFRg0BQQEhBSAEQcAAcUUgA3FBAUcNAQtBACEFIARBwABxDQBBAiEFIARB//8DcSIDQQhxDQACQCADQYAEcUUNAAJAIAAtAChBAUcNACAALQAtQQpxDQBBBQ8LQQQPCwJAIANBIHENAAJAIAAtAChBAUYNACAALwEyQf//A3EiAEGcf2pB5ABJDQAgAEHMAUYNACAAQbACRg0AQQQhBSAEQShxRQ0CIANBiARxQYAERg0CC0EADwtBAEEDIAApAyBQGyEFCyAFC2IBAn9BACEBAkAgAC0AKEEBRg0AIAAvATJB//8DcSICQZx/akHkAEkNACACQcwBRg0AIAJBsAJGDQAgAC8BMCIAQcAAcQ0AQQEhASAAQYgEcUGABEYNACAAQShxRSEBCyABC6cBAQN/AkACQAJAIAAtACpFDQAgAC0AK0UNAEEAIQMgAC8BMCIEQQJxRQ0BDAILQQAhAyAALwEwIgRBAXFFDQELQQEhAyAALQAoQQFGDQAgAC8BMkH//wNxIgVBnH9qQeQASQ0AIAVBzAFGDQAgBUGwAkYNACAEQcAAcQ0AQQAhAyAEQYgEcUGABEYNACAEQShxQQBHIQMLIABBADsBMCAAQQA6AC8gAwuZAQECfwJAAkACQCAALQAqRQ0AIAAtACtFDQBBACEBIAAvATAiAkECcUUNAQwCC0EAIQEgAC8BMCICQQFxRQ0BC0EBIQEgAC0AKEEBRg0AIAAvATJB//8DcSIAQZx/akHkAEkNACAAQcwBRg0AIABBsAJGDQAgAkHAAHENAEEAIQEgAkGIBHFBgARGDQAgAkEocUEARyEBCyABC1kAIABBGGpCADcDACAAQgA3AwAgAEE4akIANwMAIABBMGpCADcDACAAQShqQgA3AwAgAEEgakIANwMAIABBEGpCADcDACAAQQhqQgA3AwAgAEHdATYCHEEAC3sBAX8CQCAAKAIMIgMNAAJAIAAoAgRFDQAgACABNgIECwJAIAAgASACEMSAgIAAIgMNACAAKAIMDwsgACADNgIcQQAhAyAAKAIEIgFFDQAgACABIAIgACgCCBGBgICAAAAiAUUNACAAIAI2AhQgACABNgIMIAEhAwsgAwvk8wEDDn8DfgR/I4CAgIAAQRBrIgMkgICAgAAgASEEIAEhBSABIQYgASEHIAEhCCABIQkgASEKIAEhCyABIQwgASENIAEhDiABIQ8CQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkAgACgCHCIQQX9qDt0B2gEB2QECAwQFBgcICQoLDA0O2AEPENcBERLWARMUFRYXGBkaG+AB3wEcHR7VAR8gISIjJCXUASYnKCkqKyzTAdIBLS7RAdABLzAxMjM0NTY3ODk6Ozw9Pj9AQUJDREVG2wFHSElKzwHOAUvNAUzMAU1OT1BRUlNUVVZXWFlaW1xdXl9gYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXp7fH1+f4ABgQGCAYMBhAGFAYYBhwGIAYkB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QAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkAC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FCAAIBA2AgxBACEQDLIBCyAAKAIEIRAgAEEANgIEAkAgACAQIAEQp4CAgAAiEA0AIAEhAQxNCyAAQdMANgIcIAAgATYCFCAAIBA2AgxBACEQDLEBCyAAKAIEIRAgAEEANgIEAkAgACAQIAEQp4CAgAAiEA0AIAEhAQxRCyAAQeUANgIcIAAgATYCFCAAIBA2AgxBACEQDLABCyAAQQA2AhwgACABNgIUIABBxoqAgAA2AhAgAEEHNgIMQQAhEAyvAQsgACgCBCEQIABBADYCBAJAIAAgECABEKeAgIAAIhANACABIQEMSQsgAEHSADYCHCAAIAE2AhQgACAQNgIMQQAhEAyuAQsgACgCBCEQIABBADYCBAJAIAAgECABEKeAgIAAIhANACABIQEMSQsgAEHTADYCHCAAIAE2AhQgACAQNgIMQQAhEAytAQsgACgCBCEQIABBADYCBAJAIAAgECABEKeAgIAAIhANACABIQEMTQsgAEHlADYCHCAAIAE2AhQgACAQNgIMQQAhEAysAQsgAEEANgIcIAAgATYCFCAAQdyIgIAANgIQIABBBzYCDEEAIRAMqwELIBBBP0cNASABQQFqIQELQQUhEAyQAQtBACEQIABBADYCHCAAIAE2AhQgAEH9koCAADYCECAAQQc2AgwMqAELIAAoAgQhECAAQQA2AgQCQCAAIBAgARCngICAACIQDQAgASEBDEILIABB0gA2AhwgACABNgIUIAAgEDYCDEEAIRAMpwELIAAoAgQhECAAQQA2AgQCQCAAIBAgARCngICAACIQDQAgASEBDEILIABB0wA2AhwgACABNgIUIAAgEDYCDEEAIRAMpgELIAAoAgQhECAAQQA2AgQCQCAAIBAgARCngICAACIQDQAgASEBDEYLIABB5QA2AhwgACABNgIUIAAgEDYCDEEAIRAMpQELIAAoAgQhASAAQQA2AgQCQCAAIAEgFBCngICAACIBDQAgFCEBDD8LIABB0gA2AhwgACAUNgIUIAAgATYCDEEAIRAMpAELIAAoAgQhASAAQQA2AgQCQCAAIAEgFBCngICAACIBDQAgFCEBDD8LIABB0wA2AhwgACAUNgIUIAAgATYCDEEAIRAMowELIAAoAgQhASAAQQA2AgQCQCAAIAEgFBCngICAACIBDQAgFCEBDEMLIABB5QA2AhwgACAU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YWdlX2JlZ2luYCBjYWxsYmFjayBlcnJvcgBgb25fY2h1bmtfZXh0ZW5zaW9uX3ZhbHVlYCBjYWxsYmFjayBlcnJvcgBgb25fc3RhdHVzX2NvbXBsZXRlYCBjYWxsYmFjayBlcnJvcgBgb25fdmVyc2lvbl9jb21wbGV0ZWAgY2FsbGJhY2sgZXJyb3IAYG9uX3VybF9jb21wbGV0ZWAgY2FsbGJhY2sgZXJyb3IAYG9uX2NodW5rX2NvbXBsZXRlYCBjYWxsYmFjayBlcnJvcgBgb25faGVhZGVyX3ZhbHVlX2NvbXBsZXRlYCBjYWxsYmFjayBlcnJvcgBgb25fbWVzc2FnZV9jb21wbGV0ZWAgY2FsbGJhY2sgZXJyb3IAYG9uX21ldGhvZF9jb21wbGV0ZWAgY2FsbGJhY2sgZXJyb3IAYG9uX2hlYWRlcl9maWVsZF9jb21wbGV0ZWAgY2FsbGJhY2sgZXJyb3IAYG9uX2NodW5rX2V4dGVuc2lvbl9uYW1lYCBjYWxsYmFjayBlcnJvcgBVbmV4cGVjdGVkIGNoYXIgaW4gdXJsIHNlcnZlcgBJbnZhbGlkIGhlYWRlciB2YWx1ZSBjaGFyAEludmFsaWQgaGVhZGVyIGZpZWxkIGNoYXIAU3BhbiBjYWxsYmFjayBlcnJvciBpbiBvbl92ZXJzaW9uAEludmFsaWQgbWlub3IgdmVyc2lvbgBJbnZhbGlkIG1ham9yIHZlcnNpb24ARXhwZWN0ZWQgc3BhY2UgYWZ0ZXIgdmVyc2lvbgBFeHBlY3RlZCBDUkxGIGFmdGVyIHZlcnNpb24ASW52YWxpZCBIVFRQIHZlcnNpb24ASW52YWxpZCBoZWFkZXIgdG9rZW4AU3BhbiBjYWxsYmFjayBlcnJvciBpbiBvbl91cmwASW52YWxpZCBjaGFyYWN0ZXJzIGluIHVybABVbmV4cGVjdGVkIHN0YXJ0IGNoYXIgaW4gdXJsAERvdWJsZSBAIGluIHVybABFbXB0eSBDb250ZW50LUxlbmd0aABJbnZhbGlkIGNoYXJhY3RlciBpbiBDb250ZW50LUxlbmd0aABEdXBsaWNhdGUgQ29udGVudC1MZW5ndGgASW52YWxpZCBjaGFyIGluIHVybCBwYXRoAENvbnRlbnQtTGVuZ3RoIGNhbid0IGJlIHByZXNlbnQgd2l0aCBUcmFuc2Zlci1FbmNvZGluZwBJbnZhbGlkIGNoYXJhY3RlciBpbiBjaHVuayBzaXplAFNwYW4gY2FsbGJhY2sgZXJyb3IgaW4gb25faGVhZGVyX3ZhbHVlAFNwYW4gY2FsbGJhY2sgZXJyb3IgaW4gb25fY2h1bmtfZXh0ZW5zaW9uX3ZhbHVlAEludmFsaWQgY2hhcmFjdGVyIGluIGNodW5rIGV4dGVuc2lvbnMgdmFsdWUATWlzc2luZyBleHBlY3RlZCBMRiBhZnRlciBoZWFkZXIgdmFsdWUASW52YWxpZCBgVHJhbnNmZXItRW5jb2RpbmdgIGhlYWRlciB2YWx1ZQBJbnZhbGlkIGNoYXJhY3RlciBpbiBjaHVuayBleHRlbnNpb25zIHF1b3RlIHZhbHVlAEludmFsaWQgY2hhcmFjdGVyIGluIGNodW5rIGV4dGVuc2lvbnMgcXVvdGVkIHZhbHVlAFBhdXNlZCBieSBvbl9oZWFkZXJzX2NvbXBsZXRlAEludmFsaWQgRU9GIHN0YXRlAG9uX3Jlc2V0IHBhdXNlAG9uX2NodW5rX2hlYWRlciBwYXVzZQBvbl9tZXNzYWdlX2JlZ2luIHBhdXNlAG9uX2NodW5rX2V4dGVuc2lvbl92YWx1ZSBwYXVzZQBvbl9zdGF0dXNfY29tcGxldGUgcGF1c2UAb25fdmVyc2lvbl9jb21wbGV0ZSBwYXVzZQBvbl91cmxfY29tcGxldGUgcGF1c2UAb25fY2h1bmtfY29tcGxldGUgcGF1c2UAb25faGVhZGVyX3ZhbHVlX2NvbXBsZXRlIHBhdXNlAG9uX21lc3NhZ2VfY29tcGxldGUgcGF1c2UAb25fbWV0aG9kX2NvbXBsZXRlIHBhdXNlAG9uX2hlYWRlcl9maWVsZF9jb21wbGV0ZSBwYXVzZQBvbl9jaHVua19leHRlbnNpb25fbmFtZSBwYXVzZQBVbmV4cGVjdGVkIHNwYWNlIGFmdGVyIHN0YXJ0IGxpbmUAU3BhbiBjYWxsYmFjayBlcnJvciBpbiBvbl9jaHVua19leHRlbnNpb25fbmFtZQBJbnZhbGlkIGNoYXJhY3RlciBpbiBjaHVuayBleHRlbnNpb25zIG5hbWUAUGF1c2Ugb24gQ09OTkVDVC9VcGdyYWRlAFBhdXNlIG9uIFBSSS9VcGdyYWRlAEV4cGVjdGVkIEhUVFAvMiBDb25uZWN0aW9uIFByZWZhY2UAU3BhbiBjYWxsYmFjayBlcnJvciBpbiBvbl9tZXRob2QARXhwZWN0ZWQgc3BhY2UgYWZ0ZXIgbWV0aG9kAFNwYW4gY2FsbGJhY2sgZXJyb3IgaW4gb25faGVhZGVyX2ZpZWxkAFBhdXNlZABJbnZhbGlkIHdvcmQgZW5jb3VudGVyZWQASW52YWxpZCBtZXRob2QgZW5jb3VudGVyZWQAVW5leHBlY3RlZCBjaGFyIGluIHVybCBzY2hlbWEAUmVxdWVzdCBoYXMgaW52YWxpZCBgVHJhbnNmZXItRW5jb2RpbmdgAFNXSVRDSF9QUk9YWQBVU0VfUFJPWFkATUtBQ1RJVklUWQBVTlBST0NFU1NBQkxFX0VOVElUWQBDT1BZAE1PVkVEX1BFUk1BTkVOVExZAFRPT19FQVJMWQBOT1RJRlkARkFJTEVEX0RFUEVOREVOQ1kAQkFEX0dBVEVXQVkAUExBWQBQVVQAQ0hFQ0tPVVQAR0FURVdBWV9USU1FT1VUAFJFUVVFU1RfVElNRU9VVABORVRXT1JLX0NPTk5FQ1RfVElNRU9VVABDT05ORUNUSU9OX1RJTUVPVVQATE9HSU5fVElNRU9VVABORVRXT1JLX1JFQURfVElNRU9VVABQT1NUAE1JU0RJUkVDVEVEX1JFUVVFU1QAQ0xJRU5UX0NMT1NFRF9SRVFVRVNUAENMSUVOVF9DTE9TRURfTE9BRF9CQUxBTkNFRF9SRVFVRVNUAEJBRF9SRVFVRVNUAEhUVFBfUkVRVUVTVF9TRU5UX1RPX0hUVFBTX1BPUlQAUkVQT1JUAElNX0FfVEVBUE9UAFJFU0VUX0NPTlRFTlQATk9fQ09OVEVOVABQQVJUSUFMX0NPTlRFTlQASFBFX0lOVkFMSURfQ09OU1RBTlQASFBFX0NCX1JFU0VUAEdFVABIUEVfU1RSSUNUAENPTkZMSUNUAFRFTVBPUkFSWV9SRURJUkVDVABQRVJNQU5FTlRfUkVESVJFQ1QAQ09OTkVDVABNVUxUSV9TVEFUVVMASFBFX0lOVkFMSURfU1RBVFVTAFRPT19NQU5ZX1JFUVVFU1RTAEVBUkxZX0hJTlRTAFVOQVZBSUxBQkxFX0ZPUl9MRUdBTF9SRUFTT05TAE9QVElPTlMAU1dJVENISU5HX1BST1RPQ09MUwBWQVJJQU5UX0FMU09fTkVHT1RJQVRFUwBNVUxUSVBMRV9DSE9JQ0VTAElOVEVSTkFMX1NFUlZFUl9FUlJPUgBXRUJfU0VSVkVSX1VOS05PV05fRVJST1IAUkFJTEdVTl9FUlJPUgBJREVOVElUWV9QUk9WSURFUl9BVVRIRU5USUNBVElPTl9FUlJPUgBTU0xfQ0VSVElGSUNBVEVfRVJST1IASU5WQUxJRF9YX0ZPUldBUkRFRF9GT1IAU0VUX1BBUkFNRVRFUgBHRVRfUEFSQU1FVEVSAEhQRV9VU0VSAFNFRV9PVEhFUgBIUEVfQ0JfQ0hVTktfSEVBREVSAE1LQ0FMRU5EQVIAU0VUVVAAV0VCX1NFUlZFUl9JU19ET1dOAFRFQVJET1dOAEhQRV9DTE9TRURfQ09OTkVDVElPTgBIRVVSSVNUSUNfRVhQSVJBVElPTgBESVNDT05ORUNURURfT1BFUkFUSU9OAE5PTl9BVVRIT1JJVEFUSVZFX0lORk9STUFUSU9OAEhQRV9JTlZBTElEX1ZFUlNJT04ASFBFX0NCX01FU1NBR0VfQkVHSU4AU0lURV9JU19GUk9aRU4ASFBFX0lOVkFMSURfSEVBREVSX1RPS0VOAElOVkFMSURfVE9LRU4ARk9SQklEREVOAEVOSEFOQ0VfWU9VUl9DQUxNAEhQRV9JTlZBTElEX1VSTABCTE9DS0VEX0JZX1BBUkVOVEFMX0NPTlRST0wATUtDT0wAQUNMAEhQRV9JTlRFUk5BTABSRVFVRVNUX0hFQURFUl9GSUVMRFNfVE9PX0xBUkdFX1VOT0ZGSUNJQUwASFBFX09LAFVOTElOSwBVTkxPQ0sAUFJJAFJFVFJZX1dJVEgASFBFX0lOVkFMSURfQ09OVEVOVF9MRU5HVEgASFBFX1VORVhQRUNURURfQ09OVEVOVF9MRU5HVEgARkxVU0gAUFJPUFBBVENIAE0tU0VBUkNIAFVSSV9UT09fTE9ORwBQUk9DRVNTSU5HAE1JU0NFTExBTkVPVVNfUEVSU0lTVEVOVF9XQVJOSU5HAE1JU0NFTExBTkVPVVNfV0FSTklORwBIUEVfSU5WQUxJRF9UUkFOU0ZFUl9FTkNPRElORwBFeHBlY3RlZCBDUkxGAEhQRV9JTlZBTElEX0NIVU5LX1NJWkUATU9WRQBDT05USU5VRQBIUEVfQ0JfU1RBVFVTX0NPTVBMRVRFAEhQRV9DQl9IRUFERVJTX0NPTVBMRVRFAEhQRV9DQl9WRVJTSU9OX0NPTVBMRVRFAEhQRV9DQl9VUkxfQ09NUExFVEUASFBFX0NCX0NIVU5LX0NPTVBMRVRFAEhQRV9DQl9IRUFERVJfVkFMVUVfQ09NUExFVEUASFBFX0NCX0NIVU5LX0VYVEVOU0lPTl9WQUxVRV9DT01QTEVURQBIUEVfQ0JfQ0hVTktfRVhURU5TSU9OX05BTUVfQ09NUExFVEUASFBFX0NCX01FU1NBR0VfQ09NUExFVEUASFBFX0NCX01FVEhPRF9DT01QTEVURQBIUEVfQ0JfSEVBREVSX0ZJRUxEX0NPTVBMRVRFAERFTEVURQBIUEVfSU5WQUxJRF9FT0ZfU1RBVEUASU5WQUxJRF9TU0xfQ0VSVElGSUNBVEUAUEFVU0UATk9fUkVTUE9OU0UAVU5TVVBQT1JURURfTUVESUFfVFlQRQBHT05FAE5PVF9BQ0NFUFRBQkxFAFNFUlZJQ0VfVU5BVkFJTEFCTEUAUkFOR0VfTk9UX1NBVElTRklBQkxFAE9SSUdJTl9JU19VTlJFQUNIQUJMRQBSRVNQT05TRV9JU19TVEFMRQBQVVJHRQBNRVJHRQBSRVFVRVNUX0hFQURFUl9GSUVMRFNfVE9PX0xBUkdFAFJFUVVFU1RfSEVBREVSX1RPT19MQVJHRQBQQVlMT0FEX1RPT19MQVJHRQBJTlNVRkZJQ0lFTlRfU1RPUkFHRQBIUEVfUEFVU0VEX1VQR1JBREUASFBFX1BBVVNFRF9IMl9VUEdSQURFAFNPVVJDRQBBTk5PVU5DRQBUUkFDRQBIUEVfVU5FWFBFQ1RFRF9TUEFDRQBERVNDUklCRQBVTlNVQlNDUklCRQBSRUNPUkQASFBFX0lOVkFMSURfTUVUSE9EAE5PVF9GT1VORABQUk9QRklORABVTkJJTkQAUkVCSU5EAFVOQVVUSE9SSVpFRABNRVRIT0RfTk9UX0FMTE9XRUQASFRUUF9WRVJTSU9OX05PVF9TVVBQT1JURUQAQUxSRUFEWV9SRVBPUlRFRABBQ0NFUFRFRABOT1RfSU1QTEVNRU5URUQATE9PUF9ERVRFQ1RFRABIUEVfQ1JfRVhQRUNURUQASFBFX0xGX0VYUEVDVEVEAENSRUFURUQASU1fVVNFRABIUEVfUEFVU0VEAFRJTUVPVVRfT0NDVVJFRABQQVlNRU5UX1JFUVVJUkVEAFBSRUNPTkRJVElPTl9SRVFVSVJFRABQUk9YWV9BVVRIRU5USUNBVElPTl9SRVFVSVJFRABORVRXT1JLX0FVVEhFTlRJQ0FUSU9OX1JFUVVJUkVEAExFTkdUSF9SRVFVSVJFRABTU0xfQ0VSVElGSUNBVEVfUkVRVUlSRUQAVVBHUkFERV9SRVFVSVJFRABQQUdFX0VYUElSRUQAUFJFQ09ORElUSU9OX0ZBSUxFRABFWFBFQ1RBVElPTl9GQUlMRUQAUkVWQUxJREFUSU9OX0ZBSUxFRABTU0xfSEFORFNIQUtFX0ZBSUxFRABMT0NLRUQAVFJBTlNGT1JNQVRJT05fQVBQTElFRABOT1RfTU9ESUZJRUQATk9UX0VYVEVOREVEAEJBTkRXSURUSF9MSU1JVF9FWENFRURFRABTSVRFX0lTX09WRVJMT0FERUQASEVBRABFeHBlY3RlZCBIVFRQLwAAXhMAACYTAAAwEAAA8BcAAJ0TAAAVEgAAORcAAPASAAAKEAAAdRIAAK0SAACCEwAATxQAAH8QAACgFQAAIxQAAIkSAACLFAAATRUAANQRAADPFAAAEBgAAMkWAADcFgAAwREAAOAXAAC7FAAAdBQAAHwVAADlFAAACBcAAB8QAABlFQAAoxQAACgVAAACFQAAmRUAACwQAACLGQAATw8AANQOAABqEAAAzhAAAAIXAACJDgAAbhMAABwTAABmFAAAVhcAAMETAADNEwAAbBMAAGgXAABmFwAAXxcAACITAADODwAAaQ4AANgOAABjFgAAyxMAAKoOAAAoFwAAJhcAAMUTAABdFgAA6BEAAGcTAABlEwAA8hYAAHMTAAAdFwAA+RYAAPMRAADPDgAAzhUAAAwSAACzEQAApREAAGEQAAAyFwAAuxMAAAAAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAABAQIBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEAAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQAAAAAAAAAAAAAAAAABAAAAAAAAAAAAAAAAAAAAAAAAAAIDAgICAgIAAAICAAICAAICAgICAgICAgIABAAAAAAAAgICAgICAgICAgICAgICAgICAgICAgICAgIAAAACAgICAgICAgICAgICAgICAgICAgICAgICAgICAgACAAIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAACAAICAgICAAACAgACAgACAgICAgICAgICAAMABAAAAAICAgICAgICAgICAgICAgICAgICAgICAgICAAAAAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAAgACAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAbG9zZWVlcC1hbGl2ZQAAAAAAAAAAAAAAAAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEAAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEAAAAAAAAAAAABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEBAQEBAQEBAQEBAQIBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAAEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBY2h1bmtlZAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQEAAQEBAQEAAAEBAAEBAAEBAQEBAQEBAQEAAAAAAAAAAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEAAAABAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQABAAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABlY3Rpb25lbnQtbGVuZ3Rob25yb3h5LWNvbm5lY3Rpb24AAAAAAAAAAAAAAAAAAAByYW5zZmVyLWVuY29kaW5ncGdyYWRlDQoNCg0KU00NCg0KVFRQL0NFL1RTUC8AAAAAAAAAAAAAAAABAgABAwAAAAAAAAAAAAAAAAAAAAAAAAQBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAAEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAAAAAAAAAAAAAQIAAQMAAAAAAAAAAAAAAAAAAAAAAAAEAQEFAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQABAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQAAAAAAAAAAAAEAAAEAAAAAAAAAAAAAAAAAAAAAAAAAAAEBAAEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQABAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEAAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEAAAAAAAAAAAAAAQAAAgAAAAAAAAAAAAAAAAAAAAAAAAMEAAAEBAQEBAQEBAQEBAUEBAQEBAQEBAQEBAQABAAGBwQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAAEAAQABAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQAAAAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEAAAEAAAAAAAAAAAAAAAAAAAAAAAABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAIAAAAAAAADAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwAAAAAAAAMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABAAABAAAAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAIAAAAAAgAAAAAAAAAAAAAAAAAAAAAAAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMAAAAAAAADAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABOT1VOQ0VFQ0tPVVRORUNURVRFQ1JJQkVMVVNIRVRFQURTRUFSQ0hSR0VDVElWSVRZTEVOREFSVkVPVElGWVBUSU9OU0NIU0VBWVNUQVRDSEdFT1JESVJFQ1RPUlRSQ0hQQVJBTUVURVJVUkNFQlNDUklCRUFSRE9XTkFDRUlORE5LQ0tVQlNDUklCRUhUVFAvQURUUC8="},3434:A=>{A.exports="AGFzbQEAAAABMAhgAX8Bf2ADf39/AX9gBH9/f38Bf2AAAGADf39/AGABfwBgAn9/AGAGf39/f39/AALLAQgDZW52GHdhc21fb25faGVhZGVyc19jb21wbGV0ZQACA2VudhV3YXNtX29uX21lc3NhZ2VfYmVnaW4AAANlbnYLd2FzbV9vbl91cmwAAQNlbnYOd2FzbV9vbl9zdGF0dXMAAQNlbnYUd2FzbV9vbl9oZWFkZXJfZmllbGQAAQNlbnYUd2FzbV9vbl9oZWFkZXJfdmFsdWUAAQNlbnYMd2FzbV9vbl9ib2R5AAEDZW52GHdhc21fb25fbWVzc2FnZV9jb21wbGV0ZQAAA0ZFAwMEAAAFAAAAAAAABQEFAAUFBQAABgAAAAAGBgYGAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQABAAABAQcAAAUFAwABBAUBcAESEgUDAQACBggBfwFBgNQECwfRBSIGbWVtb3J5AgALX2luaXRpYWxpemUACRlfX2luZGlyZWN0X2Z1bmN0aW9uX3RhYmxlAQALbGxodHRwX2luaXQAChhsbGh0dHBfc2hvdWxkX2tlZXBfYWxpdmUAQQxsbGh0dHBfYWxsb2MADAZtYWxsb2MARgtsbGh0dHBfZnJlZQANBGZyZWUASA9sbGh0dHBfZ2V0X3R5cGUADhVsbGh0dHBfZ2V0X2h0dHBfbWFqb3IADxVsbGh0dHBfZ2V0X2h0dHBfbWlub3IAEBFsbGh0dHBfZ2V0X21ldGhvZAARFmxsaHR0cF9nZXRfc3RhdHVzX2NvZGUAEhJsbGh0dHBfZ2V0X3VwZ3JhZGUAEwxsbGh0dHBfcmVzZXQAFA5sbGh0dHBfZXhlY3V0ZQAVFGxsaHR0cF9zZXR0aW5nc19pbml0ABYNbGxodHRwX2ZpbmlzaAAXDGxsaHR0cF9wYXVzZQAYDWxsaHR0cF9yZXN1bWUAGRtsbGh0dHBfcmVzdW1lX2FmdGVyX3VwZ3JhZGUAGhBsbGh0dHBfZ2V0X2Vycm5vABsXbGxodHRwX2dldF9lcnJvcl9yZWFzb24AHBdsbGh0dHBfc2V0X2Vycm9yX3JlYXNvbgAdFGxsaHR0cF9nZXRfZXJyb3JfcG9zAB4RbGxodHRwX2Vycm5vX25hbWUAHxJsbGh0dHBfbWV0aG9kX25hbWUAIBJs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IAH9CwMAIABBMGogAf0LAwAgAEEgaiAB/QsDACAAQd0BNgIcQQALewEBfwJAIAAoAgwiAw0AAkAgACgCBEUNACAAIAE2AgQLAkAgACABIAIQxICAgAAiAw0AIAAoAgwPCyAAIAM2AhxBACEDIAAoAgQiAUUNACAAIAEgAiAAKAIIEYGAgIAAACIBRQ0AIAAgAjYCFCAAIAE2AgwgASEDCyADC+TzAQMOfwN+BH8jgICAgABBEGsiAySAgICAACABIQQgASEFIAEhBiABIQcgASEIIAEhCSABIQogASELIAEhDCABIQ0gASEOIAEhDwJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQCAAKAIcIhBBf2oO3QHaAQHZAQIDBAUGBwgJCgsMDQ7YAQ8Q1wEREtYBExQVFhcYGRob4AHfARwdHtUBHyAhIiMkJdQBJicoKSorLNMB0gEtLtEB0AEvMDEyMzQ1Njc4OTo7PD0+P0BBQkNERUbbAUdISUrPAc4BS80BTMwBTU5PUFFSU1RVVldYWVpbXF1eX2BhYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ent8fX5/gAGBAYIBgwGEAYUBhgGHAYgBiQGKAYsBjAGNAY4BjwGQAZEB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QAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAIBAOxwEAAQID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YWNrIGVycm9yAGBvbl9jaHVua19leHRlbnNpb25fdmFsdWVgIGNhbGxiYWNrIGVycm9yAGBvbl9zdGF0dXNfY29tcGxldGVgIGNhbGxiYWNrIGVycm9yAGBvbl92ZXJzaW9uX2NvbXBsZXRlYCBjYWxsYmFjayBlcnJvcgBgb25fdXJsX2NvbXBsZXRlYCBjYWxsYmFjayBlcnJvcgBgb25fY2h1bmtfY29tcGxldGVgIGNhbGxiYWNrIGVycm9yAGBvbl9oZWFkZXJfdmFsdWVfY29tcGxldGVgIGNhbGxiYWNrIGVycm9yAGBvbl9tZXNzYWdlX2NvbXBsZXRlYCBjYWxsYmFjayBlcnJvcgBgb25fbWV0aG9kX2NvbXBsZXRlYCBjYWxsYmFjayBlcnJvcgBgb25faGVhZGVyX2ZpZWxkX2NvbXBsZXRlYCBjYWxsYmFjayBlcnJvcgBgb25fY2h1bmtfZXh0ZW5zaW9uX25hbWVgIGNhbGxiYWNrIGVycm9yAFVuZXhwZWN0ZWQgY2hhciBpbiB1cmwgc2VydmVyAEludmFsaWQgaGVhZGVyIHZhbHVlIGNoYXIASW52YWxpZCBoZWFkZXIgZmllbGQgY2hhcgBTcGFuIGNhbGxiYWNrIGVycm9yIGluIG9uX3ZlcnNpb24ASW52YWxpZCBtaW5vciB2ZXJzaW9uAEludmFsaWQgbWFqb3IgdmVyc2lvbgBFeHBlY3RlZCBzcGFjZSBhZnRlciB2ZXJzaW9uAEV4cGVjdGVkIENSTEYgYWZ0ZXIgdmVyc2lvbgBJbnZhbGlkIEhUVFAgdmVyc2lvbgBJbnZhbGlkIGhlYWRlciB0b2tlbgBTcGFuIGNhbGxiYWNrIGVycm9yIGluIG9uX3VybABJbnZhbGlkIGNoYXJhY3RlcnMgaW4gdXJsAFVuZXhwZWN0ZWQgc3RhcnQgY2hhciBpbiB1cmwARG91YmxlIEAgaW4gdXJsAEVtcHR5IENvbnRlbnQtTGVuZ3RoAEludmFsaWQgY2hhcmFjdGVyIGluIENvbnRlbnQtTGVuZ3RoAER1cGxpY2F0ZSBDb250ZW50LUxlbmd0aABJbnZhbGlkIGNoYXIgaW4gdXJsIHBhdGgAQ29udGVudC1MZW5ndGggY2FuJ3QgYmUgcHJlc2VudCB3aXRoIFRyYW5zZmVyLUVuY29kaW5nAEludmFsaWQgY2hhcmFjdGVyIGluIGNodW5rIHNpemUAU3BhbiBjYWxsYmFjayBlcnJvciBpbiBvbl9oZWFkZXJfdmFsdWUAU3BhbiBjYWxsYmFjayBlcnJvciBpbiBvbl9jaHVua19leHRlbnNpb25fdmFsdWUASW52YWxpZCBjaGFyYWN0ZXIgaW4gY2h1bmsgZXh0ZW5zaW9ucyB2YWx1ZQBNaXNzaW5nIGV4cGVjdGVkIExGIGFmdGVyIGhlYWRlciB2YWx1ZQBJbnZhbGlkIGBUcmFuc2Zlci1FbmNvZGluZ2AgaGVhZGVyIHZhbHVlAEludmFsaWQgY2hhcmFjdGVyIGluIGNodW5rIGV4dGVuc2lvbnMgcXVvdGUgdmFsdWUASW52YWxpZCBjaGFyYWN0ZXIgaW4gY2h1bmsgZXh0ZW5zaW9ucyBxdW90ZWQgdmFsdWUAUGF1c2VkIGJ5IG9uX2hlYWRlcnNfY29tcGxldGUASW52YWxpZCBFT0Ygc3RhdGUAb25fcmVzZXQgcGF1c2UAb25fY2h1bmtfaGVhZGVyIHBhdXNlAG9uX21lc3NhZ2VfYmVnaW4gcGF1c2UAb25fY2h1bmtfZXh0ZW5zaW9uX3ZhbHVlIHBhdXNlAG9uX3N0YXR1c19jb21wbGV0ZSBwYXVzZQBvbl92ZXJzaW9uX2NvbXBsZXRlIHBhdXNlAG9uX3VybF9jb21wbGV0ZSBwYXVzZQBvbl9jaHVua19jb21wbGV0ZSBwYXVzZQBvbl9oZWFkZXJfdmFsdWVfY29tcGxldGUgcGF1c2UAb25fbWVzc2FnZV9jb21wbGV0ZSBwYXVzZQBvbl9tZXRob2RfY29tcGxldGUgcGF1c2UAb25faGVhZGVyX2ZpZWxkX2NvbXBsZXRlIHBhdXNlAG9uX2NodW5rX2V4dGVuc2lvbl9uYW1lIHBhdXNlAFVuZXhwZWN0ZWQgc3BhY2UgYWZ0ZXIgc3RhcnQgbGluZQBTcGFuIGNhbGxiYWNrIGVycm9yIGluIG9uX2NodW5rX2V4dGVuc2lvbl9uYW1lAEludmFsaWQgY2hhcmFjdGVyIGluIGNodW5rIGV4dGVuc2lvbnMgbmFtZQBQYXVzZSBvbiBDT05ORUNUL1VwZ3JhZGUAUGF1c2Ugb24gUFJJL1VwZ3JhZGUARXhwZWN0ZWQgSFRUUC8yIENvbm5lY3Rpb24gUHJlZmFjZQBTcGFuIGNhbGxiYWNrIGVycm9yIGluIG9uX21ldGhvZABFeHBlY3RlZCBzcGFjZSBhZnRlciBtZXRob2QAU3BhbiBjYWxsYmFjayBlcnJvciBpbiBvbl9oZWFkZXJfZmllbGQAUGF1c2VkAEludmFsaWQgd29yZCBlbmNvdW50ZXJlZABJbnZhbGlkIG1ldGhvZCBlbmNvdW50ZXJlZABVbmV4cGVjdGVkIGNoYXIgaW4gdXJsIHNjaGVtYQBSZXF1ZXN0IGhhcyBpbnZhbGlkIGBUcmFuc2Zlci1FbmNvZGluZ2AAU1dJVENIX1BST1hZAFVTRV9QUk9YWQBNS0FDVElWSVRZAFVOUFJPQ0VTU0FCTEVfRU5USVRZAENPUFkATU9WRURfUEVSTUFORU5UTFkAVE9PX0VBUkxZAE5PVElGWQBGQUlMRURfREVQRU5ERU5DWQBCQURfR0FURVdBWQBQTEFZAFBVVABDSEVDS09VVABHQVRFV0FZX1RJTUVPVVQAUkVRVUVTVF9USU1FT1VUAE5FVFdPUktfQ09OTkVDVF9USU1FT1VUAENPTk5FQ1RJT05fVElNRU9VVABMT0dJTl9USU1FT1VUAE5FVFdPUktfUkVBRF9USU1FT1VUAFBPU1QATUlTRElSRUNURURfUkVRVUVTVABDTElFTlRfQ0xPU0VEX1JFUVVFU1QAQ0xJRU5UX0NMT1NFRF9MT0FEX0JBTEFOQ0VEX1JFUVVFU1QAQkFEX1JFUVVFU1QASFRUUF9SRVFVRVNUX1NFTlRfVE9fSFRUUFNfUE9SVABSRVBPUlQASU1fQV9URUFQT1QAUkVTRVRfQ09OVEVOVABOT19DT05URU5UAFBBUlRJQUxfQ09OVEVOVABIUEVfSU5WQUxJRF9DT05TVEFOVABIUEVfQ0JfUkVTRVQAR0VUAEhQRV9TVFJJQ1QAQ09ORkxJQ1QAVEVNUE9SQVJZX1JFRElSRUNUAFBFUk1BTkVOVF9SRURJUkVDVABDT05ORUNUAE1VTFRJX1NUQVRVUwBIUEVfSU5WQUxJRF9TVEFUVVMAVE9PX01BTllfUkVRVUVTVFMARUFSTFlfSElOVFMAVU5BVkFJTEFCTEVfRk9SX0xFR0FMX1JFQVNPTlMAT1BUSU9OUwBTV0lUQ0hJTkdfUFJPVE9DT0xTAFZBUklBTlRfQUxTT19ORUdPVElBVEVTAE1VTFRJUExFX0NIT0lDRVMASU5URVJOQUxfU0VSVkVSX0VSUk9SAFdFQl9TRVJWRVJfVU5LTk9XTl9FUlJPUgBSQUlMR1VOX0VSUk9SAElERU5USVRZX1BST1ZJREVSX0FVVEhFTlRJQ0FUSU9OX0VSUk9SAFNTTF9DRVJUSUZJQ0FURV9FUlJPUgBJTlZBTElEX1hfRk9SV0FSREVEX0ZPUgBTRVRfUEFSQU1FVEVSAEdFVF9QQVJBTUVURVIASFBFX1VTRVIAU0VFX09USEVSAEhQRV9DQl9DSFVOS19IRUFERVIATUtDQUxFTkRBUgBTRVRVUABXRUJfU0VSVkVSX0lTX0RPV04AVEVBUkRPV04ASFBFX0NMT1NFRF9DT05ORUNUSU9OAEhFVVJJU1RJQ19FWFBJUkFUSU9OAERJU0NPTk5FQ1RFRF9PUEVSQVRJT04ATk9OX0FVVEhPUklUQVRJVkVfSU5GT1JNQVRJT04ASFBFX0lOVkFMSURfVkVSU0lPTgBIUEVfQ0JfTUVTU0FHRV9CRUdJTgBTSVRFX0lTX0ZST1pFTgBIUEVfSU5WQUxJRF9IRUFERVJfVE9LRU4ASU5WQUxJRF9UT0tFTgBGT1JCSURERU4ARU5IQU5DRV9ZT1VSX0NBTE0ASFBFX0lOVkFMSURfVVJMAEJMT0NLRURfQllfUEFSRU5UQUxfQ09OVFJPTABNS0NPTABBQ0wASFBFX0lOVEVSTkFMAFJFUVVFU1RfSEVBREVSX0ZJRUxEU19UT09fTEFSR0VfVU5PRkZJQ0lBTABIUEVfT0sAVU5MSU5LAFVOTE9DSwBQUkkAUkVUUllfV0lUSABIUEVfSU5WQUxJRF9DT05URU5UX0xFTkdUSABIUEVfVU5FWFBFQ1RFRF9DT05URU5UX0xFTkdUSABGTFVTSABQUk9QUEFUQ0gATS1TRUFSQ0gAVVJJX1RPT19MT05HAFBST0NFU1NJTkcATUlTQ0VMTEFORU9VU19QRVJTSVNURU5UX1dBUk5JTkcATUlTQ0VMTEFORU9VU19XQVJOSU5HAEhQRV9JTlZBTElEX1RSQU5TRkVSX0VOQ09ESU5HAEV4cGVjdGVkIENSTEYASFBFX0lOVkFMSURfQ0hVTktfU0laRQBNT1ZFAENPTlRJTlVFAEhQRV9DQl9TVEFUVVNfQ09NUExFVEUASFBFX0NCX0hFQURFUlNfQ09NUExFVEUASFBFX0NCX1ZFUlNJT05fQ09NUExFVEUASFBFX0NCX1VSTF9DT01QTEVURQBIUEVfQ0JfQ0hVTktfQ09NUExFVEUASFBFX0NCX0hFQURFUl9WQUxVRV9DT01QTEVURQBIUEVfQ0JfQ0hVTktfRVhURU5TSU9OX1ZBTFVFX0NPTVBMRVRFAEhQRV9DQl9DSFVOS19FWFRFTlNJT05fTkFNRV9DT01QTEVURQBIUEVfQ0JfTUVTU0FHRV9DT01QTEVURQBIUEVfQ0JfTUVUSE9EX0NPTVBMRVRFAEhQRV9DQl9IRUFERVJfRklFTERfQ09NUExFVEUAREVMRVRFAEhQRV9JTlZBTElEX0VPRl9TVEFURQBJTlZBTElEX1NTTF9DRVJUSUZJQ0FURQBQQVVTRQBOT19SRVNQT05TRQBVTlNVUFBPUlRFRF9NRURJQV9UWVBFAEdPTkUATk9UX0FDQ0VQVEFCTEUAU0VSVklDRV9VTkFWQUlMQUJMRQBSQU5HRV9OT1RfU0FUSVNGSUFCTEUAT1JJR0lOX0lTX1VOUkVBQ0hBQkxFAFJFU1BPTlNFX0lTX1NUQUxFAFBVUkdFAE1FUkdFAFJFUVVFU1RfSEVBREVSX0ZJRUxEU19UT09fTEFSR0UAUkVRVUVTVF9IRUFERVJfVE9PX0xBUkdFAFBBWUxPQURfVE9PX0xBUkdFAElOU1VGRklDSUVOVF9TVE9SQUdFAEhQRV9QQVVTRURfVVBHUkFERQBIUEVfUEFVU0VEX0gyX1VQR1JBREUAU09VUkNFAEFOTk9VTkNFAFRSQUNFAEhQRV9VTkVYUEVDVEVEX1NQQUNFAERFU0NSSUJFAFVOU1VCU0NSSUJFAFJFQ09SRABIUEVfSU5WQUxJRF9NRVRIT0QATk9UX0ZPVU5EAFBST1BGSU5EAFVOQklORABSRUJJTkQAVU5BVVRIT1JJWkVEAE1FVEhPRF9OT1RfQUxMT1dFRABIVFRQX1ZFUlNJT05fTk9UX1NVUFBPUlRFRABBTFJFQURZX1JFUE9SVEVEAEFDQ0VQVEVEAE5PVF9JTVBMRU1FTlRFRABMT09QX0RFVEVDVEVEAEhQRV9DUl9FWFBFQ1RFRABIUEVfTEZfRVhQRUNURUQAQ1JFQVRFRABJTV9VU0VEAEhQRV9QQVVTRUQAVElNRU9VVF9PQ0NVUkVEAFBBWU1FTlRfUkVRVUlSRUQAUFJFQ09ORElUSU9OX1JFUVVJUkVEAFBST1hZX0FVVEhFTlRJQ0FUSU9OX1JFUVVJUkVEAE5FVFdPUktfQVVUSEVOVElDQVRJT05fUkVRVUlSRUQATEVOR1RIX1JFUVVJUkVEAFNTTF9DRVJUSUZJQ0FURV9SRVFVSVJFRABVUEdSQURFX1JFUVVJUkVEAFBBR0VfRVhQSVJFRABQUkVDT05ESVRJT05fRkFJTEVEAEVYUEVDVEFUSU9OX0ZBSUxFRABSRVZBTElEQVRJT05fRkFJTEVEAFNTTF9IQU5EU0hBS0VfRkFJTEVEAExPQ0tFRABUUkFOU0ZPUk1BVElPTl9BUFBMSUVEAE5PVF9NT0RJRklFRABOT1RfRVhURU5ERUQAQkFORFdJRFRIX0xJTUlUX0VYQ0VFREVEAFNJVEVfSVNfT1ZFUkxPQURFRABIRUFEAEV4cGVjdGVkIEhUVFAvAABeEwAAJhMAADAQAADwFwAAnRMAABUSAAA5FwAA8BIAAAoQAAB1EgAArRIAAIITAABPFAAAfxAAAKAVAAAjFAAAiRIAAIsUAABNFQAA1BEAAM8UAAAQGAAAyRYAANwWAADBEQAA4BcAALsUAAB0FAAAfBUAAOUUAAAIFwAAHxAAAGUVAACjFAAAKBUAAAIVAACZFQAALBAAAIsZAABPDwAA1A4AAGoQAADOEAAAAhcAAIkOAABuEwAAHBMAAGYUAABWFwAAwRMAAM0TAABsEwAAaBcAAGYXAABfFwAAIhMAAM4PAABpDgAA2A4AAGMWAADLEwAAqg4AACgXAAAmFwAAxRMAAF0WAADoEQAAZxMAAGUTAADyFgAAcxMAAB0XAAD5FgAA8xEAAM8OAADOFQAADBIAALMRAAClEQAAYRAAADIXAAC7EwAAAAAAAAAAAAAAAAAAAAAAAAABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEBAgEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQABAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAAAAAAAAAAAAAAAAAAEAAAAAAAAAAAAAAAAAAAAAAAAAAgMCAgICAgAAAgIAAgIAAgICAgICAgICAgAEAAAAAAACAgICAgICAgICAgICAgICAgICAgICAgICAgAAAAICAgICAgICAgICAgICAgICAgICAgICAgICAgICAAIAAgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABAAAAAAAAAAAAAAAAAAAAAAAAAAIAAgICAgIAAAICAAICAAICAgICAgICAgIAAwAEAAAAAgICAgICAgICAgICAgICAgICAgICAgICAgIAAAACAgICAgICAgICAgICAgICAgICAgICAgICAgICAgACAAIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABsb3NlZWVwLWFsaXZlAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAABAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQABAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQAAAAAAAAAAAAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQEBAQEBAQEBAQEBAgEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEAAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQFjaHVua2VkAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABAQABAQEBAQAAAQEAAQEAAQEBAQEBAQEBAQAAAAAAAAABAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQAAAAEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAAEAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAGVjdGlvbmVudC1sZW5ndGhvbnJveHktY29ubmVjdGlvbgAAAAAAAAAAAAAAAAAAAHJhbnNmZXItZW5jb2RpbmdwZ3JhZGUNCg0KDQpTTQ0KDQpUVFAvQ0UvVFNQLwAAAAAAAAAAAAAAAAECAAEDAAAAAAAAAAAAAAAAAAAAAAAABAEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEAAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEAAAAAAAAAAAABAgABAwAAAAAAAAAAAAAAAAAAAAAAAAQBAQUBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAAEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAAAAAAAAAAAAAQAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAQEAAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAAEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQABAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQAAAAAAAAAAAAABAAACAAAAAAAAAAAAAAAAAAAAAAAAAwQAAAQEBAQEBAQEBAQEBQQEBAQEBAQEBAQEBAAEAAYHBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEAAQABAAEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQAAAQAAAAAAAAAAAAAAAAAAAAAAAAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAgAAAAAAAAMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAAAAAAAAAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEAAAEAAAAAAAAAAAAAAAAAAAAAAAABAAAAAAAAAAAAAgAAAAACAAAAAAAAAAAAAAAAAAAAAAADAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwAAAAAAAAMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAE5PVU5DRUVDS09VVE5FQ1RFVEVDUklCRUxVU0hFVEVBRFNFQVJDSFJHRUNUSVZJVFlMRU5EQVJWRU9USUZZUFRJT05TQ0hTRUFZU1RBVENIR0VPUkRJUkVDVE9SVFJDSFBBUkFNRVRFUlVSQ0VCU0NSSUJFQVJET1dOQUNFSU5ETktDS1VCU0NSSUJFSFRUUC9BRFRQLw=="},172:(A,e)=>{"use strict";Object.defineProperty(e,"__esModule",{value:true});e.enumToMap=void 0;function enumToMap(A){const e={};Object.keys(A).forEach((t=>{const r=A[t];if(typeof r==="number"){e[t]=r}}));return e}e.enumToMap=enumToMap},7501:(A,e,t)=>{"use strict";const{kClients:r}=t(6443);const s=t(9965);const{kAgent:o,kMockAgentSet:n,kMockAgentGet:i,kDispatches:a,kIsMockActive:E,kNetConnect:g,kGetNetConnect:c,kOptions:Q,kFactory:C}=t(1117);const B=t(7365);const I=t(4004);const{matchValue:h,buildMockOptions:l}=t(3397);const{InvalidArgumentError:u,UndiciError:d}=t(8707);const f=t(992);const p=t(1529);const y=t(6142);class FakeWeakRef{constructor(A){this.value=A}deref(){return this.value}}class MockAgent extends f{constructor(A){super(A);this[g]=true;this[E]=true;if(A&&A.agent&&typeof A.agent.dispatch!=="function"){throw new u("Argument opts.agent must implement Agent")}const e=A&&A.agent?A.agent:new s(A);this[o]=e;this[r]=e[r];this[Q]=l(A)}get(A){let e=this[i](A);if(!e){e=this[C](A);this[n](A,e)}return e}dispatch(A,e){this.get(A.origin);return this[o].dispatch(A,e)}async close(){await this[o].close();this[r].clear()}deactivate(){this[E]=false}activate(){this[E]=true}enableNetConnect(A){if(typeof A==="string"||typeof A==="function"||A instanceof RegExp){if(Array.isArray(this[g])){this[g].push(A)}else{this[g]=[A]}}else if(typeof A==="undefined"){this[g]=true}else{throw new u("Unsupported matcher. Must be one of String|Function|RegExp.")}}disableNetConnect(){this[g]=false}get isMockActive(){return this[E]}[n](A,e){this[r].set(A,new FakeWeakRef(e))}[C](A){const e=Object.assign({agent:this},this[Q]);return this[Q]&&this[Q].connections===1?new B(A,e):new I(A,e)}[i](A){const e=this[r].get(A);if(e){return e.deref()}if(typeof A!=="string"){const e=this[C]("http://localhost:9999");this[n](A,e);return e}for(const[e,t]of Array.from(this[r])){const r=t.deref();if(r&&typeof e!=="string"&&h(e,A)){const e=this[C](A);this[n](A,e);e[a]=r[a];return e}}}[c](){return this[g]}pendingInterceptors(){const A=this[r];return Array.from(A.entries()).flatMap((([A,e])=>e.deref()[a].map((e=>({...e,origin:A}))))).filter((({pending:A})=>A))}assertNoPendingInterceptors({pendingInterceptorsFormatter:A=new y}={}){const e=this.pendingInterceptors();if(e.length===0){return}const t=new p("interceptor","interceptors").pluralize(e.length);throw new d(`\n${t.count} ${t.noun} ${t.is} pending:\n\n${A.format(e)}\n`.trim())}}A.exports=MockAgent},7365:(A,e,t)=>{"use strict";const{promisify:r}=t(9023);const s=t(6197);const{buildMockDispatch:o}=t(3397);const{kDispatches:n,kMockAgent:i,kClose:a,kOriginalClose:E,kOrigin:g,kOriginalDispatch:c,kConnected:Q}=t(1117);const{MockInterceptor:C}=t(1511);const B=t(6443);const{InvalidArgumentError:I}=t(8707);class MockClient extends s{constructor(A,e){super(A,e);if(!e||!e.agent||typeof e.agent.dispatch!=="function"){throw new I("Argument opts.agent must implement Agent")}this[i]=e.agent;this[g]=A;this[n]=[];this[Q]=1;this[c]=this.dispatch;this[E]=this.close.bind(this);this.dispatch=o.call(this);this.close=this[a]}get[B.kConnected](){return this[Q]}intercept(A){return new C(A,this[n])}async[a](){await r(this[E])();this[Q]=0;this[i][B.kClients].delete(this[g])}}A.exports=MockClient},2429:(A,e,t)=>{"use strict";const{UndiciError:r}=t(8707);class MockNotMatchedError extends r{constructor(A){super(A);Error.captureStackTrace(this,MockNotMatchedError);this.name="MockNotMatchedError";this.message=A||"The request does not match any registered mock dispatches";this.code="UND_MOCK_ERR_MOCK_NOT_MATCHED"}}A.exports={MockNotMatchedError:MockNotMatchedError}},1511:(A,e,t)=>{"use strict";const{getResponseData:r,buildKey:s,addMockDispatch:o}=t(3397);const{kDispatches:n,kDispatchKey:i,kDefaultHeaders:a,kDefaultTrailers:E,kContentLength:g,kMockDispatch:c}=t(1117);const{InvalidArgumentError:Q}=t(8707);const{buildURL:C}=t(3440);class MockScope{constructor(A){this[c]=A}delay(A){if(typeof A!=="number"||!Number.isInteger(A)||A<=0){throw new Q("waitInMs must be a valid integer > 0")}this[c].delay=A;return this}persist(){this[c].persist=true;return this}times(A){if(typeof A!=="number"||!Number.isInteger(A)||A<=0){throw new Q("repeatTimes must be a valid integer > 0")}this[c].times=A;return this}}class MockInterceptor{constructor(A,e){if(typeof A!=="object"){throw new Q("opts must be an object")}if(typeof A.path==="undefined"){throw new Q("opts.path must be defined")}if(typeof A.method==="undefined"){A.method="GET"}if(typeof A.path==="string"){if(A.query){A.path=C(A.path,A.query)}else{const e=new URL(A.path,"data://");A.path=e.pathname+e.search}}if(typeof A.method==="string"){A.method=A.method.toUpperCase()}this[i]=s(A);this[n]=e;this[a]={};this[E]={};this[g]=false}createMockScopeDispatchData(A,e,t={}){const s=r(e);const o=this[g]?{"content-length":s.length}:{};const n={...this[a],...o,...t.headers};const i={...this[E],...t.trailers};return{statusCode:A,data:e,headers:n,trailers:i}}validateReplyParameters(A,e,t){if(typeof A==="undefined"){throw new Q("statusCode must be defined")}if(typeof e==="undefined"){throw new Q("data must be defined")}if(typeof t!=="object"){throw new Q("responseOptions must be an object")}}reply(A){if(typeof A==="function"){const wrappedDefaultsCallback=e=>{const t=A(e);if(typeof t!=="object"){throw new Q("reply options callback must return an object")}const{statusCode:r,data:s="",responseOptions:o={}}=t;this.validateReplyParameters(r,s,o);return{...this.createMockScopeDispatchData(r,s,o)}};const e=o(this[n],this[i],wrappedDefaultsCallback);return new MockScope(e)}const[e,t="",r={}]=[...arguments];this.validateReplyParameters(e,t,r);const s=this.createMockScopeDispatchData(e,t,r);const a=o(this[n],this[i],s);return new MockScope(a)}replyWithError(A){if(typeof A==="undefined"){throw new Q("error must be defined")}const e=o(this[n],this[i],{error:A});return new MockScope(e)}defaultReplyHeaders(A){if(typeof A==="undefined"){throw new Q("headers must be defined")}this[a]=A;return this}defaultReplyTrailers(A){if(typeof A==="undefined"){throw new Q("trailers must be defined")}this[E]=A;return this}replyContentLength(){this[g]=true;return this}}A.exports.MockInterceptor=MockInterceptor;A.exports.MockScope=MockScope},4004:(A,e,t)=>{"use strict";const{promisify:r}=t(9023);const s=t(5076);const{buildMockDispatch:o}=t(3397);const{kDispatches:n,kMockAgent:i,kClose:a,kOriginalClose:E,kOrigin:g,kOriginalDispatch:c,kConnected:Q}=t(1117);const{MockInterceptor:C}=t(1511);const B=t(6443);const{InvalidArgumentError:I}=t(8707);class MockPool extends s{constructor(A,e){super(A,e);if(!e||!e.agent||typeof e.agent.dispatch!=="function"){throw new I("Argument opts.agent must implement Agent")}this[i]=e.agent;this[g]=A;this[n]=[];this[Q]=1;this[c]=this.dispatch;this[E]=this.close.bind(this);this.dispatch=o.call(this);this.close=this[a]}get[B.kConnected](){return this[Q]}intercept(A){return new C(A,this[n])}async[a](){await r(this[E])();this[Q]=0;this[i][B.kClients].delete(this[g])}}A.exports=MockPool},1117:A=>{"use strict";A.exports={kAgent:Symbol("agent"),kOptions:Symbol("options"),kFactory:Symbol("factory"),kDispatches:Symbol("dispatches"),kDispatchKey:Symbol("dispatch key"),kDefaultHeaders:Symbol("default headers"),kDefaultTrailers:Symbol("default trailers"),kContentLength:Symbol("content length"),kMockAgent:Symbol("mock agent"),kMockAgentSet:Symbol("mock agent set"),kMockAgentGet:Symbol("mock agent get"),kMockDispatch:Symbol("mock dispatch"),kClose:Symbol("close"),kOriginalClose:Symbol("original agent close"),kOrigin:Symbol("origin"),kIsMockActive:Symbol("is mock active"),kNetConnect:Symbol("net connect"),kGetNetConnect:Symbol("get net connect"),kConnected:Symbol("connected")}},3397:(A,e,t)=>{"use strict";const{MockNotMatchedError:r}=t(2429);const{kDispatches:s,kMockAgent:o,kOriginalDispatch:n,kOrigin:i,kGetNetConnect:a}=t(1117);const{buildURL:E,nop:g}=t(3440);const{STATUS_CODES:c}=t(8611);const{types:{isPromise:Q}}=t(9023);function matchValue(A,e){if(typeof A==="string"){return A===e}if(A instanceof RegExp){return A.test(e)}if(typeof A==="function"){return A(e)===true}return false}function lowerCaseEntries(A){return Object.fromEntries(Object.entries(A).map((([A,e])=>[A.toLocaleLowerCase(),e])))}function getHeaderByName(A,e){if(Array.isArray(A)){for(let t=0;t!A)).filter((({path:A})=>matchValue(safeUrl(A),s)));if(o.length===0){throw new r(`Mock dispatch not matched for path '${s}'`)}o=o.filter((({method:A})=>matchValue(A,e.method)));if(o.length===0){throw new r(`Mock dispatch not matched for method '${e.method}'`)}o=o.filter((({body:A})=>typeof A!=="undefined"?matchValue(A,e.body):true));if(o.length===0){throw new r(`Mock dispatch not matched for body '${e.body}'`)}o=o.filter((A=>matchHeaders(A,e.headers)));if(o.length===0){throw new r(`Mock dispatch not matched for headers '${typeof e.headers==="object"?JSON.stringify(e.headers):e.headers}'`)}return o[0]}function addMockDispatch(A,e,t){const r={timesInvoked:0,times:1,persist:false,consumed:false};const s=typeof t==="function"?{callback:t}:{...t};const o={...r,...e,pending:true,data:{error:null,...s}};A.push(o);return o}function deleteMockDispatch(A,e){const t=A.findIndex((A=>{if(!A.consumed){return false}return matchKey(A,e)}));if(t!==-1){A.splice(t,1)}}function buildKey(A){const{path:e,method:t,body:r,headers:s,query:o}=A;return{path:e,method:t,body:r,headers:s,query:o}}function generateKeyValues(A){return Object.entries(A).reduce(((A,[e,t])=>[...A,Buffer.from(`${e}`),Array.isArray(t)?t.map((A=>Buffer.from(`${A}`))):Buffer.from(`${t}`)]),[])}function getStatusText(A){return c[A]||"unknown"}async function getResponse(A){const e=[];for await(const t of A){e.push(t)}return Buffer.concat(e).toString("utf8")}function mockDispatch(A,e){const t=buildKey(A);const r=getMockDispatch(this[s],t);r.timesInvoked++;if(r.data.callback){r.data={...r.data,...r.data.callback(A)}}const{data:{statusCode:o,data:n,headers:i,trailers:a,error:E},delay:c,persist:C}=r;const{timesInvoked:B,times:I}=r;r.consumed=!C&&B>=I;r.pending=B0){setTimeout((()=>{handleReply(this[s])}),c)}else{handleReply(this[s])}function handleReply(r,s=n){const E=Array.isArray(A.headers)?buildHeadersFromArray(A.headers):A.headers;const c=typeof s==="function"?s({...A,headers:E}):s;if(Q(c)){c.then((A=>handleReply(r,A)));return}const C=getResponseData(c);const B=generateKeyValues(i);const I=generateKeyValues(a);e.abort=g;e.onHeaders(o,B,resume,getStatusText(o));e.onData(Buffer.from(C));e.onComplete(I);deleteMockDispatch(r,t)}function resume(){}return true}function buildMockDispatch(){const A=this[o];const e=this[i];const t=this[n];return function dispatch(s,o){if(A.isMockActive){try{mockDispatch.call(this,s,o)}catch(n){if(n instanceof r){const i=A[a]();if(i===false){throw new r(`${n.message}: subsequent request to origin ${e} was not allowed (net.connect disabled)`)}if(checkNetConnect(i,e)){t.call(this,s,o)}else{throw new r(`${n.message}: subsequent request to origin ${e} was not allowed (net.connect is not enabled for this origin)`)}}else{throw n}}}else{t.call(this,s,o)}}}function checkNetConnect(A,e){const t=new URL(e);if(A===true){return true}else if(Array.isArray(A)&&A.some((A=>matchValue(A,t.host)))){return true}return false}function buildMockOptions(A){if(A){const{agent:e,...t}=A;return t}}A.exports={getResponseData:getResponseData,getMockDispatch:getMockDispatch,addMockDispatch:addMockDispatch,deleteMockDispatch:deleteMockDispatch,buildKey:buildKey,generateKeyValues:generateKeyValues,matchValue:matchValue,getResponse:getResponse,getStatusText:getStatusText,mockDispatch:mockDispatch,buildMockDispatch:buildMockDispatch,checkNetConnect:checkNetConnect,buildMockOptions:buildMockOptions,getHeaderByName:getHeaderByName}},6142:(A,e,t)=>{"use strict";const{Transform:r}=t(2203);const{Console:s}=t(4236);A.exports=class PendingInterceptorsFormatter{constructor({disableColors:A}={}){this.transform=new r({transform(A,e,t){t(null,A)}});this.logger=new s({stdout:this.transform,inspectOptions:{colors:!A&&!process.env.CI}})}format(A){const e=A.map((({method:A,path:e,data:{statusCode:t},persist:r,times:s,timesInvoked:o,origin:n})=>({Method:A,Origin:n,Path:e,"Status code":t,Persistent:r?"✅":"❌",Invocations:o,Remaining:r?Infinity:s-o})));this.logger.table(e);return this.transform.read().toString()}}},1529:A=>{"use strict";const e={pronoun:"it",is:"is",was:"was",this:"this"};const t={pronoun:"they",is:"are",was:"were",this:"these"};A.exports=class Pluralizer{constructor(A,e){this.singular=A;this.plural=e}pluralize(A){const r=A===1;const s=r?e:t;const o=r?this.singular:this.plural;return{...s,count:A,noun:o}}}},4869:A=>{"use strict";const e=2048;const t=e-1;class FixedCircularBuffer{constructor(){this.bottom=0;this.top=0;this.list=new Array(e);this.next=null}isEmpty(){return this.top===this.bottom}isFull(){return(this.top+1&t)===this.bottom}push(A){this.list[this.top]=A;this.top=this.top+1&t}shift(){const A=this.list[this.bottom];if(A===undefined)return null;this.list[this.bottom]=undefined;this.bottom=this.bottom+1&t;return A}}A.exports=class FixedQueue{constructor(){this.head=this.tail=new FixedCircularBuffer}isEmpty(){return this.head.isEmpty()}push(A){if(this.head.isFull()){this.head=this.head.next=new FixedCircularBuffer}this.head.push(A)}shift(){const A=this.tail;const e=A.shift();if(A.isEmpty()&&A.next!==null){this.tail=A.next}return e}}},8640:(A,e,t)=>{"use strict";const r=t(1);const s=t(4869);const{kConnected:o,kSize:n,kRunning:i,kPending:a,kQueued:E,kBusy:g,kFree:c,kUrl:Q,kClose:C,kDestroy:B,kDispatch:I}=t(6443);const h=t(4622);const l=Symbol("clients");const u=Symbol("needDrain");const d=Symbol("queue");const f=Symbol("closed resolve");const p=Symbol("onDrain");const y=Symbol("onConnect");const R=Symbol("onDisconnect");const D=Symbol("onConnectionError");const w=Symbol("get dispatcher");const k=Symbol("add client");const m=Symbol("remove client");const b=Symbol("stats");class PoolBase extends r{constructor(){super();this[d]=new s;this[l]=[];this[E]=0;const A=this;this[p]=function onDrain(e,t){const r=A[d];let s=false;while(!s){const e=r.shift();if(!e){break}A[E]--;s=!this.dispatch(e.opts,e.handler)}this[u]=s;if(!this[u]&&A[u]){A[u]=false;A.emit("drain",e,[A,...t])}if(A[f]&&r.isEmpty()){Promise.all(A[l].map((A=>A.close()))).then(A[f])}};this[y]=(e,t)=>{A.emit("connect",e,[A,...t])};this[R]=(e,t,r)=>{A.emit("disconnect",e,[A,...t],r)};this[D]=(e,t,r)=>{A.emit("connectionError",e,[A,...t],r)};this[b]=new h(this)}get[g](){return this[u]}get[o](){return this[l].filter((A=>A[o])).length}get[c](){return this[l].filter((A=>A[o]&&!A[u])).length}get[a](){let A=this[E];for(const{[a]:e}of this[l]){A+=e}return A}get[i](){let A=0;for(const{[i]:e}of this[l]){A+=e}return A}get[n](){let A=this[E];for(const{[n]:e}of this[l]){A+=e}return A}get stats(){return this[b]}async[C](){if(this[d].isEmpty()){return Promise.all(this[l].map((A=>A.close())))}else{return new Promise((A=>{this[f]=A}))}}async[B](A){while(true){const e=this[d].shift();if(!e){break}e.handler.onError(A)}return Promise.all(this[l].map((e=>e.destroy(A))))}[I](A,e){const t=this[w]();if(!t){this[u]=true;this[d].push({opts:A,handler:e});this[E]++}else if(!t.dispatch(A,e)){t[u]=true;this[u]=!this[w]()}return!this[u]}[k](A){A.on("drain",this[p]).on("connect",this[y]).on("disconnect",this[R]).on("connectionError",this[D]);this[l].push(A);if(this[u]){process.nextTick((()=>{if(this[u]){this[p](A[Q],[this,A])}}))}return this}[m](A){A.close((()=>{const e=this[l].indexOf(A);if(e!==-1){this[l].splice(e,1)}}));this[u]=this[l].some((A=>!A[u]&&A.closed!==true&&A.destroyed!==true))}}A.exports={PoolBase:PoolBase,kClients:l,kNeedDrain:u,kAddClient:k,kRemoveClient:m,kGetDispatcher:w}},4622:(A,e,t)=>{const{kFree:r,kConnected:s,kPending:o,kQueued:n,kRunning:i,kSize:a}=t(6443);const E=Symbol("pool");class PoolStats{constructor(A){this[E]=A}get connected(){return this[E][s]}get free(){return this[E][r]}get pending(){return this[E][o]}get queued(){return this[E][n]}get running(){return this[E][i]}get size(){return this[E][a]}}A.exports=PoolStats},5076:(A,e,t)=>{"use strict";const{PoolBase:r,kClients:s,kNeedDrain:o,kAddClient:n,kGetDispatcher:i}=t(8640);const a=t(6197);const{InvalidArgumentError:E}=t(8707);const g=t(3440);const{kUrl:c,kInterceptors:Q}=t(6443);const C=t(9136);const B=Symbol("options");const I=Symbol("connections");const h=Symbol("factory");function defaultFactory(A,e){return new a(A,e)}class Pool extends r{constructor(A,{connections:e,factory:t=defaultFactory,connect:r,connectTimeout:s,tls:o,maxCachedSessions:n,socketPath:i,autoSelectFamily:a,autoSelectFamilyAttemptTimeout:l,allowH2:u,...d}={}){super();if(e!=null&&(!Number.isFinite(e)||e<0)){throw new E("invalid connections")}if(typeof t!=="function"){throw new E("factory must be a function.")}if(r!=null&&typeof r!=="function"&&typeof r!=="object"){throw new E("connect must be a function or an object")}if(typeof r!=="function"){r=C({...o,maxCachedSessions:n,allowH2:u,socketPath:i,timeout:s,...g.nodeHasAutoSelectFamily&&a?{autoSelectFamily:a,autoSelectFamilyAttemptTimeout:l}:undefined,...r})}this[Q]=d.interceptors&&d.interceptors.Pool&&Array.isArray(d.interceptors.Pool)?d.interceptors.Pool:[];this[I]=e||null;this[c]=g.parseOrigin(A);this[B]={...g.deepClone(d),connect:r,allowH2:u};this[B].interceptors=d.interceptors?{...d.interceptors}:undefined;this[h]=t}[i](){let A=this[s].find((A=>!A[o]));if(A){return A}if(!this[I]||this[s].length{"use strict";const{kProxy:r,kClose:s,kDestroy:o,kInterceptors:n}=t(6443);const{URL:i}=t(7016);const a=t(9965);const E=t(5076);const g=t(1);const{InvalidArgumentError:c,RequestAbortedError:Q}=t(8707);const C=t(9136);const B=Symbol("proxy agent");const I=Symbol("proxy client");const h=Symbol("proxy headers");const l=Symbol("request tls settings");const u=Symbol("proxy tls settings");const d=Symbol("connect endpoint function");function defaultProtocolPort(A){return A==="https:"?443:80}function buildProxyOptions(A){if(typeof A==="string"){A={uri:A}}if(!A||!A.uri){throw new c("Proxy opts.uri is mandatory")}return{uri:A.uri,protocol:A.protocol||"https"}}function defaultFactory(A,e){return new E(A,e)}class ProxyAgent extends g{constructor(A){super(A);this[r]=buildProxyOptions(A);this[B]=new a(A);this[n]=A.interceptors&&A.interceptors.ProxyAgent&&Array.isArray(A.interceptors.ProxyAgent)?A.interceptors.ProxyAgent:[];if(typeof A==="string"){A={uri:A}}if(!A||!A.uri){throw new c("Proxy opts.uri is mandatory")}const{clientFactory:e=defaultFactory}=A;if(typeof e!=="function"){throw new c("Proxy opts.clientFactory must be a function.")}this[l]=A.requestTls;this[u]=A.proxyTls;this[h]=A.headers||{};const t=new i(A.uri);const{origin:s,port:o,host:E,username:g,password:f}=t;if(A.auth&&A.token){throw new c("opts.auth cannot be used in combination with opts.token")}else if(A.auth){this[h]["proxy-authorization"]=`Basic ${A.auth}`}else if(A.token){this[h]["proxy-authorization"]=A.token}else if(g&&f){this[h]["proxy-authorization"]=`Basic ${Buffer.from(`${decodeURIComponent(g)}:${decodeURIComponent(f)}`).toString("base64")}`}const p=C({...A.proxyTls});this[d]=C({...A.requestTls});this[I]=e(t,{connect:p});this[B]=new a({...A,connect:async(A,e)=>{let t=A.host;if(!A.port){t+=`:${defaultProtocolPort(A.protocol)}`}try{const{socket:r,statusCode:n}=await this[I].connect({origin:s,port:o,path:t,signal:A.signal,headers:{...this[h],host:E}});if(n!==200){r.on("error",(()=>{})).destroy();e(new Q(`Proxy response (${n}) !== 200 when HTTP Tunneling`))}if(A.protocol!=="https:"){e(null,r);return}let i;if(this[l]){i=this[l].servername}else{i=A.servername}this[d]({...A,servername:i,httpSocket:r},e)}catch(A){e(A)}}})}dispatch(A,e){const{host:t}=new i(A.origin);const r=buildHeaders(A.headers);throwIfProxyAuthIsSent(r);return this[B].dispatch({...A,headers:{...r,host:t}},e)}async[s](){await this[B].close();await this[I].close()}async[o](){await this[B].destroy();await this[I].destroy()}}function buildHeaders(A){if(Array.isArray(A)){const e={};for(let t=0;tA.toLowerCase()==="proxy-authorization"));if(e){throw new c("Proxy-Authorization should be sent in ProxyAgent constructor")}}A.exports=ProxyAgent},8804:A=>{"use strict";let e=Date.now();let t;const r=[];function onTimeout(){e=Date.now();let A=r.length;let t=0;while(t0&&e>=s.state){s.state=-1;s.callback(s.opaque)}if(s.state===-1){s.state=-2;if(t!==A-1){r[t]=r.pop()}else{r.pop()}A-=1}else{t+=1}}if(r.length>0){refreshTimeout()}}function refreshTimeout(){if(t&&t.refresh){t.refresh()}else{clearTimeout(t);t=setTimeout(onTimeout,1e3);if(t.unref){t.unref()}}}class Timeout{constructor(A,e,t){this.callback=A;this.delay=e;this.opaque=t;this.state=-2;this.refresh()}refresh(){if(this.state===-2){r.push(this);if(!t||r.length===1){refreshTimeout()}}this.state=0}clear(){this.state=-1}}A.exports={setTimeout(A,e,t){return e<1e3?setTimeout(A,e,t):new Timeout(A,e,t)},clearTimeout(A){if(A instanceof Timeout){A.clear()}else{clearTimeout(A)}}}},8550:(A,e,t)=>{"use strict";const r=t(1637);const{uid:s,states:o}=t(5913);const{kReadyState:n,kSentClose:i,kByteParser:a,kReceivedClose:E}=t(2933);const{fireEvent:g,failWebsocketConnection:c}=t(3574);const{CloseEvent:Q}=t(6255);const{makeRequest:C}=t(5194);const{fetching:B}=t(2315);const{Headers:I}=t(6349);const{getGlobalDispatcher:h}=t(2581);const{kHeadersList:l}=t(6443);const u={};u.open=r.channel("undici:websocket:open");u.close=r.channel("undici:websocket:close");u.socketError=r.channel("undici:websocket:socket_error");let d;try{d=t(6982)}catch{}function establishWebSocketConnection(A,e,t,r,o){const n=A;n.protocol=A.protocol==="ws:"?"http:":"https:";const i=C({urlList:[n],serviceWorkers:"none",referrer:"no-referrer",mode:"websocket",credentials:"include",cache:"no-store",redirect:"error"});if(o.headers){const A=new I(o.headers)[l];i.headersList=A}const a=d.randomBytes(16).toString("base64");i.headersList.append("sec-websocket-key",a);i.headersList.append("sec-websocket-version","13");for(const A of e){i.headersList.append("sec-websocket-protocol",A)}const E="";const g=B({request:i,useParallelQueue:true,dispatcher:o.dispatcher??h(),processResponse(A){if(A.type==="error"||A.status!==101){c(t,"Received network error or non-101 status code.");return}if(e.length!==0&&!A.headersList.get("Sec-WebSocket-Protocol")){c(t,"Server did not respond with sent protocols.");return}if(A.headersList.get("Upgrade")?.toLowerCase()!=="websocket"){c(t,'Server did not set Upgrade header to "websocket".');return}if(A.headersList.get("Connection")?.toLowerCase()!=="upgrade"){c(t,'Server did not set Connection header to "upgrade".');return}const o=A.headersList.get("Sec-WebSocket-Accept");const n=d.createHash("sha1").update(a+s).digest("base64");if(o!==n){c(t,"Incorrect hash received in Sec-WebSocket-Accept header.");return}const g=A.headersList.get("Sec-WebSocket-Extensions");if(g!==null&&g!==E){c(t,"Received different permessage-deflate than the one set.");return}const Q=A.headersList.get("Sec-WebSocket-Protocol");if(Q!==null&&Q!==i.headersList.get("Sec-WebSocket-Protocol")){c(t,"Protocol was not set in the opening handshake.");return}A.socket.on("data",onSocketData);A.socket.on("close",onSocketClose);A.socket.on("error",onSocketError);if(u.open.hasSubscribers){u.open.publish({address:A.socket.address(),protocol:Q,extensions:g})}r(A)}});return g}function onSocketData(A){if(!this.ws[a].write(A)){this.pause()}}function onSocketClose(){const{ws:A}=this;const e=A[i]&&A[E];let t=1005;let r="";const s=A[a].closingInfo;if(s){t=s.code??1005;r=s.reason}else if(!A[i]){t=1006}A[n]=o.CLOSED;g("close",A,Q,{wasClean:e,code:t,reason:r});if(u.close.hasSubscribers){u.close.publish({websocket:A,code:t,reason:r})}}function onSocketError(A){const{ws:e}=this;e[n]=o.CLOSING;if(u.socketError.hasSubscribers){u.socketError.publish(A)}this.destroy()}A.exports={establishWebSocketConnection:establishWebSocketConnection}},5913:A=>{"use strict";const e="258EAFA5-E914-47DA-95CA-C5AB0DC85B11";const t={enumerable:true,writable:false,configurable:false};const r={CONNECTING:0,OPEN:1,CLOSING:2,CLOSED:3};const s={CONTINUATION:0,TEXT:1,BINARY:2,CLOSE:8,PING:9,PONG:10};const o=2**16-1;const n={INFO:0,PAYLOADLENGTH_16:2,PAYLOADLENGTH_64:3,READ_DATA:4};const i=Buffer.allocUnsafe(0);A.exports={uid:e,staticPropertyDescriptors:t,states:r,opcodes:s,maxUnsigned16Bit:o,parserStates:n,emptyBuffer:i}},6255:(A,e,t)=>{"use strict";const{webidl:r}=t(4222);const{kEnumerableProperty:s}=t(3440);const{MessagePort:o}=t(8167);class MessageEvent extends Event{#o;constructor(A,e={}){r.argumentLengthCheck(arguments,1,{header:"MessageEvent constructor"});A=r.converters.DOMString(A);e=r.converters.MessageEventInit(e);super(A,e);this.#o=e}get data(){r.brandCheck(this,MessageEvent);return this.#o.data}get origin(){r.brandCheck(this,MessageEvent);return this.#o.origin}get lastEventId(){r.brandCheck(this,MessageEvent);return this.#o.lastEventId}get source(){r.brandCheck(this,MessageEvent);return this.#o.source}get ports(){r.brandCheck(this,MessageEvent);if(!Object.isFrozen(this.#o.ports)){Object.freeze(this.#o.ports)}return this.#o.ports}initMessageEvent(A,e=false,t=false,s=null,o="",n="",i=null,a=[]){r.brandCheck(this,MessageEvent);r.argumentLengthCheck(arguments,1,{header:"MessageEvent.initMessageEvent"});return new MessageEvent(A,{bubbles:e,cancelable:t,data:s,origin:o,lastEventId:n,source:i,ports:a})}}class CloseEvent extends Event{#o;constructor(A,e={}){r.argumentLengthCheck(arguments,1,{header:"CloseEvent constructor"});A=r.converters.DOMString(A);e=r.converters.CloseEventInit(e);super(A,e);this.#o=e}get wasClean(){r.brandCheck(this,CloseEvent);return this.#o.wasClean}get code(){r.brandCheck(this,CloseEvent);return this.#o.code}get reason(){r.brandCheck(this,CloseEvent);return this.#o.reason}}class ErrorEvent extends Event{#o;constructor(A,e){r.argumentLengthCheck(arguments,1,{header:"ErrorEvent constructor"});super(A,e);A=r.converters.DOMString(A);e=r.converters.ErrorEventInit(e??{});this.#o=e}get message(){r.brandCheck(this,ErrorEvent);return this.#o.message}get filename(){r.brandCheck(this,ErrorEvent);return this.#o.filename}get lineno(){r.brandCheck(this,ErrorEvent);return this.#o.lineno}get colno(){r.brandCheck(this,ErrorEvent);return this.#o.colno}get error(){r.brandCheck(this,ErrorEvent);return this.#o.error}}Object.defineProperties(MessageEvent.prototype,{[Symbol.toStringTag]:{value:"MessageEvent",configurable:true},data:s,origin:s,lastEventId:s,source:s,ports:s,initMessageEvent:s});Object.defineProperties(CloseEvent.prototype,{[Symbol.toStringTag]:{value:"CloseEvent",configurable:true},reason:s,code:s,wasClean:s});Object.defineProperties(ErrorEvent.prototype,{[Symbol.toStringTag]:{value:"ErrorEvent",configurable:true},message:s,filename:s,lineno:s,colno:s,error:s});r.converters.MessagePort=r.interfaceConverter(o);r.converters["sequence"]=r.sequenceConverter(r.converters.MessagePort);const n=[{key:"bubbles",converter:r.converters.boolean,defaultValue:false},{key:"cancelable",converter:r.converters.boolean,defaultValue:false},{key:"composed",converter:r.converters.boolean,defaultValue:false}];r.converters.MessageEventInit=r.dictionaryConverter([...n,{key:"data",converter:r.converters.any,defaultValue:null},{key:"origin",converter:r.converters.USVString,defaultValue:""},{key:"lastEventId",converter:r.converters.DOMString,defaultValue:""},{key:"source",converter:r.nullableConverter(r.converters.MessagePort),defaultValue:null},{key:"ports",converter:r.converters["sequence"],get defaultValue(){return[]}}]);r.converters.CloseEventInit=r.dictionaryConverter([...n,{key:"wasClean",converter:r.converters.boolean,defaultValue:false},{key:"code",converter:r.converters["unsigned short"],defaultValue:0},{key:"reason",converter:r.converters.USVString,defaultValue:""}]);r.converters.ErrorEventInit=r.dictionaryConverter([...n,{key:"message",converter:r.converters.DOMString,defaultValue:""},{key:"filename",converter:r.converters.USVString,defaultValue:""},{key:"lineno",converter:r.converters["unsigned long"],defaultValue:0},{key:"colno",converter:r.converters["unsigned long"],defaultValue:0},{key:"error",converter:r.converters.any}]);A.exports={MessageEvent:MessageEvent,CloseEvent:CloseEvent,ErrorEvent:ErrorEvent}},1237:(A,e,t)=>{"use strict";const{maxUnsigned16Bit:r}=t(5913);let s;try{s=t(6982)}catch{}class WebsocketFrameSend{constructor(A){this.frameData=A;this.maskKey=s.randomBytes(4)}createFrame(A){const e=this.frameData?.byteLength??0;let t=e;let s=6;if(e>r){s+=8;t=127}else if(e>125){s+=2;t=126}const o=Buffer.allocUnsafe(e+s);o[0]=o[1]=0;o[0]|=128;o[0]=(o[0]&240)+A; -/*! ws. MIT License. Einar Otto Stangvik */o[s-4]=this.maskKey[0];o[s-3]=this.maskKey[1];o[s-2]=this.maskKey[2];o[s-1]=this.maskKey[3];o[1]=t;if(t===126){o.writeUInt16BE(e,2)}else if(t===127){o[2]=o[3]=0;o.writeUIntBE(e,4,6)}o[1]|=128;for(let A=0;A{"use strict";const{Writable:r}=t(2203);const s=t(1637);const{parserStates:o,opcodes:n,states:i,emptyBuffer:a}=t(5913);const{kReadyState:E,kSentClose:g,kResponse:c,kReceivedClose:Q}=t(2933);const{isValidStatusCode:C,failWebsocketConnection:B,websocketMessageReceived:I}=t(3574);const{WebsocketFrameSend:h}=t(1237);const l={};l.ping=s.channel("undici:websocket:ping");l.pong=s.channel("undici:websocket:pong");class ByteParser extends r{#n=[];#i=0;#a=o.INFO;#E={};#g=[];constructor(A){super();this.ws=A}_write(A,e,t){this.#n.push(A);this.#i+=A.length;this.run(t)}run(A){while(true){if(this.#a===o.INFO){if(this.#i<2){return A()}const e=this.consume(2);this.#E.fin=(e[0]&128)!==0;this.#E.opcode=e[0]&15;this.#E.originalOpcode??=this.#E.opcode;this.#E.fragmented=!this.#E.fin&&this.#E.opcode!==n.CONTINUATION;if(this.#E.fragmented&&this.#E.opcode!==n.BINARY&&this.#E.opcode!==n.TEXT){B(this.ws,"Invalid frame type was fragmented.");return}const t=e[1]&127;if(t<=125){this.#E.payloadLength=t;this.#a=o.READ_DATA}else if(t===126){this.#a=o.PAYLOADLENGTH_16}else if(t===127){this.#a=o.PAYLOADLENGTH_64}if(this.#E.fragmented&&t>125){B(this.ws,"Fragmented frame exceeded 125 bytes.");return}else if((this.#E.opcode===n.PING||this.#E.opcode===n.PONG||this.#E.opcode===n.CLOSE)&&t>125){B(this.ws,"Payload length for control frame exceeded 125 bytes.");return}else if(this.#E.opcode===n.CLOSE){if(t===1){B(this.ws,"Received close frame with a 1-byte body.");return}const A=this.consume(t);this.#E.closeInfo=this.parseCloseBody(false,A);if(!this.ws[g]){const A=Buffer.allocUnsafe(2);A.writeUInt16BE(this.#E.closeInfo.code,0);const e=new h(A);this.ws[c].socket.write(e.createFrame(n.CLOSE),(A=>{if(!A){this.ws[g]=true}}))}this.ws[E]=i.CLOSING;this.ws[Q]=true;this.end();return}else if(this.#E.opcode===n.PING){const e=this.consume(t);if(!this.ws[Q]){const A=new h(e);this.ws[c].socket.write(A.createFrame(n.PONG));if(l.ping.hasSubscribers){l.ping.publish({payload:e})}}this.#a=o.INFO;if(this.#i>0){continue}else{A();return}}else if(this.#E.opcode===n.PONG){const e=this.consume(t);if(l.pong.hasSubscribers){l.pong.publish({payload:e})}if(this.#i>0){continue}else{A();return}}}else if(this.#a===o.PAYLOADLENGTH_16){if(this.#i<2){return A()}const e=this.consume(2);this.#E.payloadLength=e.readUInt16BE(0);this.#a=o.READ_DATA}else if(this.#a===o.PAYLOADLENGTH_64){if(this.#i<8){return A()}const e=this.consume(8);const t=e.readUInt32BE(0);if(t>2**31-1){B(this.ws,"Received payload length > 2^31 bytes.");return}const r=e.readUInt32BE(4);this.#E.payloadLength=(t<<8)+r;this.#a=o.READ_DATA}else if(this.#a===o.READ_DATA){if(this.#i=this.#E.payloadLength){const A=this.consume(this.#E.payloadLength);this.#g.push(A);if(!this.#E.fragmented||this.#E.fin&&this.#E.opcode===n.CONTINUATION){const A=Buffer.concat(this.#g);I(this.ws,this.#E.originalOpcode,A);this.#E={};this.#g.length=0}this.#a=o.INFO}}if(this.#i>0){continue}else{A();break}}}consume(A){if(A>this.#i){return null}else if(A===0){return a}if(this.#n[0].length===A){this.#i-=this.#n[0].length;return this.#n.shift()}const e=Buffer.allocUnsafe(A);let t=0;while(t!==A){const r=this.#n[0];const{length:s}=r;if(s+t===A){e.set(this.#n.shift(),t);break}else if(s+t>A){e.set(r.subarray(0,A-t),t);this.#n[0]=r.subarray(A-t);break}else{e.set(this.#n.shift(),t);t+=r.length}}this.#i-=A;return e}parseCloseBody(A,e){let t;if(e.length>=2){t=e.readUInt16BE(0)}if(A){if(!C(t)){return null}return{code:t}}let r=e.subarray(2);if(r[0]===239&&r[1]===187&&r[2]===191){r=r.subarray(3)}if(t!==undefined&&!C(t)){return null}try{r=new TextDecoder("utf-8",{fatal:true}).decode(r)}catch{return null}return{code:t,reason:r}}get closingInfo(){return this.#E.closeInfo}}A.exports={ByteParser:ByteParser}},2933:A=>{"use strict";A.exports={kWebSocketURL:Symbol("url"),kReadyState:Symbol("ready state"),kController:Symbol("controller"),kResponse:Symbol("response"),kBinaryType:Symbol("binary type"),kSentClose:Symbol("sent close"),kReceivedClose:Symbol("received close"),kByteParser:Symbol("byte parser")}},3574:(A,e,t)=>{"use strict";const{kReadyState:r,kController:s,kResponse:o,kBinaryType:n,kWebSocketURL:i}=t(2933);const{states:a,opcodes:E}=t(5913);const{MessageEvent:g,ErrorEvent:c}=t(6255);function isEstablished(A){return A[r]===a.OPEN}function isClosing(A){return A[r]===a.CLOSING}function isClosed(A){return A[r]===a.CLOSED}function fireEvent(A,e,t=Event,r){const s=new t(A,r);e.dispatchEvent(s)}function websocketMessageReceived(A,e,t){if(A[r]!==a.OPEN){return}let s;if(e===E.TEXT){try{s=new TextDecoder("utf-8",{fatal:true}).decode(t)}catch{failWebsocketConnection(A,"Received invalid UTF-8 in text frame.");return}}else if(e===E.BINARY){if(A[n]==="blob"){s=new Blob([t])}else{s=new Uint8Array(t).buffer}}fireEvent("message",A,g,{origin:A[i].origin,data:s})}function isValidSubprotocol(A){if(A.length===0){return false}for(const e of A){const A=e.charCodeAt(0);if(A<33||A>126||e==="("||e===")"||e==="<"||e===">"||e==="@"||e===","||e===";"||e===":"||e==="\\"||e==='"'||e==="/"||e==="["||e==="]"||e==="?"||e==="="||e==="{"||e==="}"||A===32||A===9){return false}}return true}function isValidStatusCode(A){if(A>=1e3&&A<1015){return A!==1004&&A!==1005&&A!==1006}return A>=3e3&&A<=4999}function failWebsocketConnection(A,e){const{[s]:t,[o]:r}=A;t.abort();if(r?.socket&&!r.socket.destroyed){r.socket.destroy()}if(e){fireEvent("error",A,c,{error:new Error(e)})}}A.exports={isEstablished:isEstablished,isClosing:isClosing,isClosed:isClosed,fireEvent:fireEvent,isValidSubprotocol:isValidSubprotocol,isValidStatusCode:isValidStatusCode,failWebsocketConnection:failWebsocketConnection,websocketMessageReceived:websocketMessageReceived}},5171:(A,e,t)=>{"use strict";const{webidl:r}=t(4222);const{DOMException:s}=t(7326);const{URLSerializer:o}=t(4322);const{getGlobalOrigin:n}=t(5628);const{staticPropertyDescriptors:i,states:a,opcodes:E,emptyBuffer:g}=t(5913);const{kWebSocketURL:c,kReadyState:Q,kController:C,kBinaryType:B,kResponse:I,kSentClose:h,kByteParser:l}=t(2933);const{isEstablished:u,isClosing:d,isValidSubprotocol:f,failWebsocketConnection:p,fireEvent:y}=t(3574);const{establishWebSocketConnection:R}=t(8550);const{WebsocketFrameSend:D}=t(1237);const{ByteParser:w}=t(3171);const{kEnumerableProperty:k,isBlobLike:m}=t(3440);const{getGlobalDispatcher:b}=t(2581);const{types:F}=t(9023);let S=false;class WebSocket extends EventTarget{#c={open:null,error:null,close:null,message:null};#Q=0;#C="";#B="";constructor(A,e=[]){super();r.argumentLengthCheck(arguments,1,{header:"WebSocket constructor"});if(!S){S=true;process.emitWarning("WebSockets are experimental, expect them to change at any time.",{code:"UNDICI-WS"})}const t=r.converters["DOMString or sequence or WebSocketInit"](e);A=r.converters.USVString(A);e=t.protocols;const o=n();let i;try{i=new URL(A,o)}catch(A){throw new s(A,"SyntaxError")}if(i.protocol==="http:"){i.protocol="ws:"}else if(i.protocol==="https:"){i.protocol="wss:"}if(i.protocol!=="ws:"&&i.protocol!=="wss:"){throw new s(`Expected a ws: or wss: protocol, got ${i.protocol}`,"SyntaxError")}if(i.hash||i.href.endsWith("#")){throw new s("Got fragment","SyntaxError")}if(typeof e==="string"){e=[e]}if(e.length!==new Set(e.map((A=>A.toLowerCase()))).size){throw new s("Invalid Sec-WebSocket-Protocol value","SyntaxError")}if(e.length>0&&!e.every((A=>f(A)))){throw new s("Invalid Sec-WebSocket-Protocol value","SyntaxError")}this[c]=new URL(i.href);this[C]=R(i,e,this,(A=>this.#I(A)),t);this[Q]=WebSocket.CONNECTING;this[B]="blob"}close(A=undefined,e=undefined){r.brandCheck(this,WebSocket);if(A!==undefined){A=r.converters["unsigned short"](A,{clamp:true})}if(e!==undefined){e=r.converters.USVString(e)}if(A!==undefined){if(A!==1e3&&(A<3e3||A>4999)){throw new s("invalid code","InvalidAccessError")}}let t=0;if(e!==undefined){t=Buffer.byteLength(e);if(t>123){throw new s(`Reason must be less than 123 bytes; received ${t}`,"SyntaxError")}}if(this[Q]===WebSocket.CLOSING||this[Q]===WebSocket.CLOSED){}else if(!u(this)){p(this,"Connection was closed before it was established.");this[Q]=WebSocket.CLOSING}else if(!d(this)){const r=new D;if(A!==undefined&&e===undefined){r.frameData=Buffer.allocUnsafe(2);r.frameData.writeUInt16BE(A,0)}else if(A!==undefined&&e!==undefined){r.frameData=Buffer.allocUnsafe(2+t);r.frameData.writeUInt16BE(A,0);r.frameData.write(e,2,"utf-8")}else{r.frameData=g}const s=this[I].socket;s.write(r.createFrame(E.CLOSE),(A=>{if(!A){this[h]=true}}));this[Q]=a.CLOSING}else{this[Q]=WebSocket.CLOSING}}send(A){r.brandCheck(this,WebSocket);r.argumentLengthCheck(arguments,1,{header:"WebSocket.send"});A=r.converters.WebSocketSendData(A);if(this[Q]===WebSocket.CONNECTING){throw new s("Sent before connected.","InvalidStateError")}if(!u(this)||d(this)){return}const e=this[I].socket;if(typeof A==="string"){const t=Buffer.from(A);const r=new D(t);const s=r.createFrame(E.TEXT);this.#Q+=t.byteLength;e.write(s,(()=>{this.#Q-=t.byteLength}))}else if(F.isArrayBuffer(A)){const t=Buffer.from(A);const r=new D(t);const s=r.createFrame(E.BINARY);this.#Q+=t.byteLength;e.write(s,(()=>{this.#Q-=t.byteLength}))}else if(ArrayBuffer.isView(A)){const t=Buffer.from(A,A.byteOffset,A.byteLength);const r=new D(t);const s=r.createFrame(E.BINARY);this.#Q+=t.byteLength;e.write(s,(()=>{this.#Q-=t.byteLength}))}else if(m(A)){const t=new D;A.arrayBuffer().then((A=>{const r=Buffer.from(A);t.frameData=r;const s=t.createFrame(E.BINARY);this.#Q+=r.byteLength;e.write(s,(()=>{this.#Q-=r.byteLength}))}))}}get readyState(){r.brandCheck(this,WebSocket);return this[Q]}get bufferedAmount(){r.brandCheck(this,WebSocket);return this.#Q}get url(){r.brandCheck(this,WebSocket);return o(this[c])}get extensions(){r.brandCheck(this,WebSocket);return this.#B}get protocol(){r.brandCheck(this,WebSocket);return this.#C}get onopen(){r.brandCheck(this,WebSocket);return this.#c.open}set onopen(A){r.brandCheck(this,WebSocket);if(this.#c.open){this.removeEventListener("open",this.#c.open)}if(typeof A==="function"){this.#c.open=A;this.addEventListener("open",A)}else{this.#c.open=null}}get onerror(){r.brandCheck(this,WebSocket);return this.#c.error}set onerror(A){r.brandCheck(this,WebSocket);if(this.#c.error){this.removeEventListener("error",this.#c.error)}if(typeof A==="function"){this.#c.error=A;this.addEventListener("error",A)}else{this.#c.error=null}}get onclose(){r.brandCheck(this,WebSocket);return this.#c.close}set onclose(A){r.brandCheck(this,WebSocket);if(this.#c.close){this.removeEventListener("close",this.#c.close)}if(typeof A==="function"){this.#c.close=A;this.addEventListener("close",A)}else{this.#c.close=null}}get onmessage(){r.brandCheck(this,WebSocket);return this.#c.message}set onmessage(A){r.brandCheck(this,WebSocket);if(this.#c.message){this.removeEventListener("message",this.#c.message)}if(typeof A==="function"){this.#c.message=A;this.addEventListener("message",A)}else{this.#c.message=null}}get binaryType(){r.brandCheck(this,WebSocket);return this[B]}set binaryType(A){r.brandCheck(this,WebSocket);if(A!=="blob"&&A!=="arraybuffer"){this[B]="blob"}else{this[B]=A}}#I(A){this[I]=A;const e=new w(this);e.on("drain",(function onParserDrain(){this.ws[I].socket.resume()}));A.socket.ws=this;this[l]=e;this[Q]=a.OPEN;const t=A.headersList.get("sec-websocket-extensions");if(t!==null){this.#B=t}const r=A.headersList.get("sec-websocket-protocol");if(r!==null){this.#C=r}y("open",this)}}WebSocket.CONNECTING=WebSocket.prototype.CONNECTING=a.CONNECTING;WebSocket.OPEN=WebSocket.prototype.OPEN=a.OPEN;WebSocket.CLOSING=WebSocket.prototype.CLOSING=a.CLOSING;WebSocket.CLOSED=WebSocket.prototype.CLOSED=a.CLOSED;Object.defineProperties(WebSocket.prototype,{CONNECTING:i,OPEN:i,CLOSING:i,CLOSED:i,url:k,readyState:k,bufferedAmount:k,onopen:k,onerror:k,onclose:k,close:k,onmessage:k,binaryType:k,send:k,extensions:k,protocol:k,[Symbol.toStringTag]:{value:"WebSocket",writable:false,enumerable:false,configurable:true}});Object.defineProperties(WebSocket,{CONNECTING:i,OPEN:i,CLOSING:i,CLOSED:i});r.converters["sequence"]=r.sequenceConverter(r.converters.DOMString);r.converters["DOMString or sequence"]=function(A){if(r.util.Type(A)==="Object"&&Symbol.iterator in A){return r.converters["sequence"](A)}return r.converters.DOMString(A)};r.converters.WebSocketInit=r.dictionaryConverter([{key:"protocols",converter:r.converters["DOMString or sequence"],get defaultValue(){return[]}},{key:"dispatcher",converter:A=>A,get defaultValue(){return b()}},{key:"headers",converter:r.nullableConverter(r.converters.HeadersInit)}]);r.converters["DOMString or sequence or WebSocketInit"]=function(A){if(r.util.Type(A)==="Object"&&!(Symbol.iterator in A)){return r.converters.WebSocketInit(A)}return{protocols:r.converters["DOMString or sequence"](A)}};r.converters.WebSocketSendData=function(A){if(r.util.Type(A)==="Object"){if(m(A)){return r.converters.Blob(A,{strict:false})}if(ArrayBuffer.isView(A)||F.isAnyArrayBuffer(A)){return r.converters.BufferSource(A)}}return r.converters.USVString(A)};A.exports={WebSocket:WebSocket}},2613:A=>{"use strict";A.exports=require("assert")},290:A=>{"use strict";A.exports=require("async_hooks")},181:A=>{"use strict";A.exports=require("buffer")},5317:A=>{"use strict";A.exports=require("child_process")},4236:A=>{"use strict";A.exports=require("console")},6982:A=>{"use strict";A.exports=require("crypto")},1637:A=>{"use strict";A.exports=require("diagnostics_channel")},4434:A=>{"use strict";A.exports=require("events")},9896:A=>{"use strict";A.exports=require("fs")},8611:A=>{"use strict";A.exports=require("http")},5675:A=>{"use strict";A.exports=require("http2")},5692:A=>{"use strict";A.exports=require("https")},9278:A=>{"use strict";A.exports=require("net")},8474:A=>{"use strict";A.exports=require("node:events")},7075:A=>{"use strict";A.exports=require("node:stream")},7975:A=>{"use strict";A.exports=require("node:util")},857:A=>{"use strict";A.exports=require("os")},6928:A=>{"use strict";A.exports=require("path")},2987:A=>{"use strict";A.exports=require("perf_hooks")},3480:A=>{"use strict";A.exports=require("querystring")},2203:A=>{"use strict";A.exports=require("stream")},3774:A=>{"use strict";A.exports=require("stream/web")},3193:A=>{"use strict";A.exports=require("string_decoder")},3557:A=>{"use strict";A.exports=require("timers")},4756:A=>{"use strict";A.exports=require("tls")},7016:A=>{"use strict";A.exports=require("url")},9023:A=>{"use strict";A.exports=require("util")},8253:A=>{"use strict";A.exports=require("util/types")},8167:A=>{"use strict";A.exports=require("worker_threads")},3106:A=>{"use strict";A.exports=require("zlib")},7182:(A,e,t)=>{"use strict";const r=t(7075).Writable;const s=t(7975).inherits;const o=t(4136);const n=t(612);const i=t(2271);const a=45;const E=Buffer.from("-");const g=Buffer.from("\r\n");const EMPTY_FN=function(){};function Dicer(A){if(!(this instanceof Dicer)){return new Dicer(A)}r.call(this,A);if(!A||!A.headerFirst&&typeof A.boundary!=="string"){throw new TypeError("Boundary required")}if(typeof A.boundary==="string"){this.setBoundary(A.boundary)}else{this._bparser=undefined}this._headerFirst=A.headerFirst;this._dashes=0;this._parts=0;this._finished=false;this._realFinish=false;this._isPreamble=true;this._justMatched=false;this._firstWrite=true;this._inHeader=true;this._part=undefined;this._cb=undefined;this._ignoreData=false;this._partOpts={highWaterMark:A.partHwm};this._pause=false;const e=this;this._hparser=new i(A);this._hparser.on("header",(function(A){e._inHeader=false;e._part.emit("header",A)}))}s(Dicer,r);Dicer.prototype.emit=function(A){if(A==="finish"&&!this._realFinish){if(!this._finished){const A=this;process.nextTick((function(){A.emit("error",new Error("Unexpected end of multipart data"));if(A._part&&!A._ignoreData){const e=A._isPreamble?"Preamble":"Part";A._part.emit("error",new Error(e+" terminated early due to unexpected end of multipart data"));A._part.push(null);process.nextTick((function(){A._realFinish=true;A.emit("finish");A._realFinish=false}));return}A._realFinish=true;A.emit("finish");A._realFinish=false}))}}else{r.prototype.emit.apply(this,arguments)}};Dicer.prototype._write=function(A,e,t){if(!this._hparser&&!this._bparser){return t()}if(this._headerFirst&&this._isPreamble){if(!this._part){this._part=new n(this._partOpts);if(this.listenerCount("preamble")!==0){this.emit("preamble",this._part)}else{this._ignore()}}const e=this._hparser.push(A);if(!this._inHeader&&e!==undefined&&e{"use strict";const r=t(8474).EventEmitter;const s=t(7975).inherits;const o=t(2393);const n=t(4136);const i=Buffer.from("\r\n\r\n");const a=/\r\n/g;const E=/^([^:]+):[ \t]?([\x00-\xFF]+)?$/;function HeaderParser(A){r.call(this);A=A||{};const e=this;this.nread=0;this.maxed=false;this.npairs=0;this.maxHeaderPairs=o(A,"maxHeaderPairs",2e3);this.maxHeaderSize=o(A,"maxHeaderSize",80*1024);this.buffer="";this.header={};this.finished=false;this.ss=new n(i);this.ss.on("info",(function(A,t,r,s){if(t&&!e.maxed){if(e.nread+s-r>=e.maxHeaderSize){s=e.maxHeaderSize-e.nread+r;e.nread=e.maxHeaderSize;e.maxed=true}else{e.nread+=s-r}e.buffer+=t.toString("binary",r,s)}if(A){e._finish()}}))}s(HeaderParser,r);HeaderParser.prototype.push=function(A){const e=this.ss.push(A);if(this.finished){return e}};HeaderParser.prototype.reset=function(){this.finished=false;this.buffer="";this.header={};this.ss.reset()};HeaderParser.prototype._finish=function(){if(this.buffer){this._parseHeader()}this.ss.matches=this.ss.maxMatches;const A=this.header;this.header={};this.buffer="";this.finished=true;this.nread=this.npairs=0;this.maxed=false;this.emit("header",A)};HeaderParser.prototype._parseHeader=function(){if(this.npairs===this.maxHeaderPairs){return}const A=this.buffer.split(a);const e=A.length;let t,r;for(var s=0;s{"use strict";const r=t(7975).inherits;const s=t(7075).Readable;function PartStream(A){s.call(this,A)}r(PartStream,s);PartStream.prototype._read=function(A){};A.exports=PartStream},4136:(A,e,t)=>{"use strict";const r=t(8474).EventEmitter;const s=t(7975).inherits;function SBMH(A){if(typeof A==="string"){A=Buffer.from(A)}if(!Buffer.isBuffer(A)){throw new TypeError("The needle has to be a String or a Buffer.")}const e=A.length;if(e===0){throw new Error("The needle cannot be an empty String/Buffer.")}if(e>256){throw new Error("The needle cannot have a length bigger than 256.")}this.maxMatches=Infinity;this.matches=0;this._occ=new Array(256).fill(e);this._lookbehind_size=0;this._needle=A;this._bufpos=0;this._lookbehind=Buffer.alloc(e);for(var t=0;t=0){this.emit("info",false,this._lookbehind,0,this._lookbehind_size);this._lookbehind_size=0}else{const t=this._lookbehind_size+o;if(t>0){this.emit("info",false,this._lookbehind,0,t)}this._lookbehind.copy(this._lookbehind,0,t,this._lookbehind_size-t);this._lookbehind_size-=t;A.copy(this._lookbehind,this._lookbehind_size);this._lookbehind_size+=e;this._bufpos=e;return e}}o+=(o>=0)*this._bufpos;if(A.indexOf(t,o)!==-1){o=A.indexOf(t,o);++this.matches;if(o>0){this.emit("info",true,A,this._bufpos,o)}else{this.emit("info",true)}return this._bufpos=o+r}else{o=e-r}while(o0){this.emit("info",false,A,this._bufpos,o{"use strict";const r=t(7075).Writable;const{inherits:s}=t(7975);const o=t(7182);const n=t(1192);const i=t(855);const a=t(8929);function Busboy(A){if(!(this instanceof Busboy)){return new Busboy(A)}if(typeof A!=="object"){throw new TypeError("Busboy expected an options-Object.")}if(typeof A.headers!=="object"){throw new TypeError("Busboy expected an options-Object with headers-attribute.")}if(typeof A.headers["content-type"]!=="string"){throw new TypeError("Missing Content-Type-header.")}const{headers:e,...t}=A;this.opts={autoDestroy:false,...t};r.call(this,this.opts);this._done=false;this._parser=this.getParserByHeaders(e);this._finished=false}s(Busboy,r);Busboy.prototype.emit=function(A){if(A==="finish"){if(!this._done){this._parser?.end();return}else if(this._finished){return}this._finished=true}r.prototype.emit.apply(this,arguments)};Busboy.prototype.getParserByHeaders=function(A){const e=a(A["content-type"]);const t={defCharset:this.opts.defCharset,fileHwm:this.opts.fileHwm,headers:A,highWaterMark:this.opts.highWaterMark,isPartAFile:this.opts.isPartAFile,limits:this.opts.limits,parsedConType:e,preservePath:this.opts.preservePath};if(n.detect.test(e[0])){return new n(this,t)}if(i.detect.test(e[0])){return new i(this,t)}throw new Error("Unsupported Content-Type.")};Busboy.prototype._write=function(A,e,t){this._parser.write(A,t)};A.exports=Busboy;A.exports["default"]=Busboy;A.exports.Busboy=Busboy;A.exports.Dicer=o},1192:(A,e,t)=>{"use strict";const{Readable:r}=t(7075);const{inherits:s}=t(7975);const o=t(7182);const n=t(8929);const i=t(2747);const a=t(692);const E=t(2393);const g=/^boundary$/i;const c=/^form-data$/i;const Q=/^charset$/i;const C=/^filename$/i;const B=/^name$/i;Multipart.detect=/^multipart\/form-data/i;function Multipart(A,e){let t;let r;const s=this;let I;const h=e.limits;const l=e.isPartAFile||((A,e,t)=>e==="application/octet-stream"||t!==undefined);const u=e.parsedConType||[];const d=e.defCharset||"utf8";const f=e.preservePath;const p={highWaterMark:e.fileHwm};for(t=0,r=u.length;tk){s.parser.removeListener("part",onPart);s.parser.on("part",skipPart);A.hitPartsLimit=true;A.emit("partsLimit");return skipPart(e)}if(L){const A=L;A.emit("end");A.removeAllListeners("end")}e.on("header",(function(o){let E;let g;let I;let h;let u;let k;let m=0;if(o["content-type"]){I=n(o["content-type"][0]);if(I[0]){E=I[0].toLowerCase();for(t=0,r=I.length;tR){const r=R-m+A.length;if(r>0){t.push(A.slice(0,r))}t.truncated=true;t.bytesRead=R;e.removeAllListeners("data");t.emit("limit");return}else if(!t.push(A)){s._pause=true}t.bytesRead=m};M=function(){U=undefined;t.push(null)}}else{if(S===w){if(!A.hitFieldsLimit){A.hitFieldsLimit=true;A.emit("fieldsLimit")}return skipPart(e)}++S;++N;let t="";let r=false;L=e;b=function(A){if((m+=A.length)>y){const s=y-(m-A.length);t+=A.toString("binary",0,s);r=true;e.removeAllListeners("data")}else{t+=A.toString("binary")}};M=function(){L=undefined;if(t.length){t=i(t,"binary",h)}A.emit("field",g,t,false,r,u,E);--N;checkFinished()}}e._readableState.sync=false;e.on("data",b);e.on("end",M)})).on("error",(function(A){if(U){U.emit("error",A)}}))})).on("error",(function(e){A.emit("error",e)})).on("finish",(function(){M=true;checkFinished()}))}Multipart.prototype.write=function(A,e){const t=this.parser.write(A);if(t&&!this._pause){e()}else{this._needDrain=!t;this._cb=e}};Multipart.prototype.end=function(){const A=this;if(A.parser.writable){A.parser.end()}else if(!A._boy._done){process.nextTick((function(){A._boy._done=true;A._boy.emit("finish")}))}};function skipPart(A){A.resume()}function FileStream(A){r.call(this,A);this.bytesRead=0;this.truncated=false}s(FileStream,r);FileStream.prototype._read=function(A){};A.exports=Multipart},855:(A,e,t)=>{"use strict";const r=t(1496);const s=t(2747);const o=t(2393);const n=/^charset$/i;UrlEncoded.detect=/^application\/x-www-form-urlencoded/i;function UrlEncoded(A,e){const t=e.limits;const s=e.parsedConType;this.boy=A;this.fieldSizeLimit=o(t,"fieldSize",1*1024*1024);this.fieldNameSizeLimit=o(t,"fieldNameSize",100);this.fieldsLimit=o(t,"fields",Infinity);let i;for(var a=0,E=s.length;an){this._key+=this.decoder.write(A.toString("binary",n,t))}this._state="val";this._hitLimit=false;this._checkingBytes=true;this._val="";this._bytesVal=0;this._valTrunc=false;this.decoder.reset();n=t+1}else if(r!==undefined){++this._fields;let t;const o=this._keyTrunc;if(r>n){t=this._key+=this.decoder.write(A.toString("binary",n,r))}else{t=this._key}this._hitLimit=false;this._checkingBytes=true;this._key="";this._bytesKey=0;this._keyTrunc=false;this.decoder.reset();if(t.length){this.boy.emit("field",s(t,"binary",this.charset),"",o,false)}n=r+1;if(this._fields===this.fieldsLimit){return e()}}else if(this._hitLimit){if(o>n){this._key+=this.decoder.write(A.toString("binary",n,o))}n=o;if((this._bytesKey=this._key.length)===this.fieldNameSizeLimit){this._checkingBytes=false;this._keyTrunc=true}}else{if(nn){this._val+=this.decoder.write(A.toString("binary",n,r))}this.boy.emit("field",s(this._key,"binary",this.charset),s(this._val,"binary",this.charset),this._keyTrunc,this._valTrunc);this._state="key";this._hitLimit=false;this._checkingBytes=true;this._key="";this._bytesKey=0;this._keyTrunc=false;this.decoder.reset();n=r+1;if(this._fields===this.fieldsLimit){return e()}}else if(this._hitLimit){if(o>n){this._val+=this.decoder.write(A.toString("binary",n,o))}n=o;if(this._val===""&&this.fieldSizeLimit===0||(this._bytesVal=this._val.length)===this.fieldSizeLimit){this._checkingBytes=false;this._valTrunc=true}}else{if(n0){this.boy.emit("field",s(this._key,"binary",this.charset),"",this._keyTrunc,false)}else if(this._state==="val"){this.boy.emit("field",s(this._key,"binary",this.charset),s(this._val,"binary",this.charset),this._keyTrunc,this._valTrunc)}this.boy._done=true;this.boy.emit("finish")};A.exports=UrlEncoded},1496:A=>{"use strict";const e=/\+/g;const t=[0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,1,1,1,1,1,1,1,0,0,0,0,0,0,0,1,1,1,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0];function Decoder(){this.buffer=undefined}Decoder.prototype.write=function(A){A=A.replace(e," ");let r="";let s=0;let o=0;const n=A.length;for(;so){r+=A.substring(o,s);o=s}this.buffer="";++o}}if(o{"use strict";A.exports=function basename(A){if(typeof A!=="string"){return""}for(var e=A.length-1;e>=0;--e){switch(A.charCodeAt(e)){case 47:case 92:A=A.slice(e+1);return A===".."||A==="."?"":A}}return A===".."||A==="."?"":A}},2747:function(A){"use strict";const e=new TextDecoder("utf-8");const t=new Map([["utf-8",e],["utf8",e]]);function getDecoder(A){let e;while(true){switch(A){case"utf-8":case"utf8":return r.utf8;case"latin1":case"ascii":case"us-ascii":case"iso-8859-1":case"iso8859-1":case"iso88591":case"iso_8859-1":case"windows-1252":case"iso_8859-1:1987":case"cp1252":case"x-cp1252":return r.latin1;case"utf16le":case"utf-16le":case"ucs2":case"ucs-2":return r.utf16le;case"base64":return r.base64;default:if(e===undefined){e=true;A=A.toLowerCase();continue}return r.other.bind(A)}}}const r={utf8:(A,e)=>{if(A.length===0){return""}if(typeof A==="string"){A=Buffer.from(A,e)}return A.utf8Slice(0,A.length)},latin1:(A,e)=>{if(A.length===0){return""}if(typeof A==="string"){return A}return A.latin1Slice(0,A.length)},utf16le:(A,e)=>{if(A.length===0){return""}if(typeof A==="string"){A=Buffer.from(A,e)}return A.ucs2Slice(0,A.length)},base64:(A,e)=>{if(A.length===0){return""}if(typeof A==="string"){A=Buffer.from(A,e)}return A.base64Slice(0,A.length)},other:(A,e)=>{if(A.length===0){return""}if(typeof A==="string"){A=Buffer.from(A,e)}if(t.has(this.toString())){try{return t.get(this).decode(A)}catch{}}return typeof A==="string"?A:A.toString()}};function decodeText(A,e,t){if(A){return getDecoder(t)(A,e)}return A}A.exports=decodeText},2393:A=>{"use strict";A.exports=function getLimit(A,e,t){if(!A||A[e]===undefined||A[e]===null){return t}if(typeof A[e]!=="number"||isNaN(A[e])){throw new TypeError("Limit "+e+" is not a valid number")}return A[e]}},8929:(A,e,t)=>{"use strict";const r=t(2747);const s=/%[a-fA-F0-9][a-fA-F0-9]/g;const o={"%00":"\0","%01":"","%02":"","%03":"","%04":"","%05":"","%06":"","%07":"","%08":"\b","%09":"\t","%0a":"\n","%0A":"\n","%0b":"\v","%0B":"\v","%0c":"\f","%0C":"\f","%0d":"\r","%0D":"\r","%0e":"","%0E":"","%0f":"","%0F":"","%10":"","%11":"","%12":"","%13":"","%14":"","%15":"","%16":"","%17":"","%18":"","%19":"","%1a":"","%1A":"","%1b":"","%1B":"","%1c":"","%1C":"","%1d":"","%1D":"","%1e":"","%1E":"","%1f":"","%1F":"","%20":" ","%21":"!","%22":'"',"%23":"#","%24":"$","%25":"%","%26":"&","%27":"'","%28":"(","%29":")","%2a":"*","%2A":"*","%2b":"+","%2B":"+","%2c":",","%2C":",","%2d":"-","%2D":"-","%2e":".","%2E":".","%2f":"/","%2F":"/","%30":"0","%31":"1","%32":"2","%33":"3","%34":"4","%35":"5","%36":"6","%37":"7","%38":"8","%39":"9","%3a":":","%3A":":","%3b":";","%3B":";","%3c":"<","%3C":"<","%3d":"=","%3D":"=","%3e":">","%3E":">","%3f":"?","%3F":"?","%40":"@","%41":"A","%42":"B","%43":"C","%44":"D","%45":"E","%46":"F","%47":"G","%48":"H","%49":"I","%4a":"J","%4A":"J","%4b":"K","%4B":"K","%4c":"L","%4C":"L","%4d":"M","%4D":"M","%4e":"N","%4E":"N","%4f":"O","%4F":"O","%50":"P","%51":"Q","%52":"R","%53":"S","%54":"T","%55":"U","%56":"V","%57":"W","%58":"X","%59":"Y","%5a":"Z","%5A":"Z","%5b":"[","%5B":"[","%5c":"\\","%5C":"\\","%5d":"]","%5D":"]","%5e":"^","%5E":"^","%5f":"_","%5F":"_","%60":"`","%61":"a","%62":"b","%63":"c","%64":"d","%65":"e","%66":"f","%67":"g","%68":"h","%69":"i","%6a":"j","%6A":"j","%6b":"k","%6B":"k","%6c":"l","%6C":"l","%6d":"m","%6D":"m","%6e":"n","%6E":"n","%6f":"o","%6F":"o","%70":"p","%71":"q","%72":"r","%73":"s","%74":"t","%75":"u","%76":"v","%77":"w","%78":"x","%79":"y","%7a":"z","%7A":"z","%7b":"{","%7B":"{","%7c":"|","%7C":"|","%7d":"}","%7D":"}","%7e":"~","%7E":"~","%7f":"","%7F":"","%80":"€","%81":"","%82":"‚","%83":"ƒ","%84":"„","%85":"…","%86":"†","%87":"‡","%88":"ˆ","%89":"‰","%8a":"Š","%8A":"Š","%8b":"‹","%8B":"‹","%8c":"Œ","%8C":"Œ","%8d":"","%8D":"","%8e":"Ž","%8E":"Ž","%8f":"","%8F":"","%90":"","%91":"‘","%92":"’","%93":"“","%94":"”","%95":"•","%96":"–","%97":"—","%98":"˜","%99":"™","%9a":"š","%9A":"š","%9b":"›","%9B":"›","%9c":"œ","%9C":"œ","%9d":"","%9D":"","%9e":"ž","%9E":"ž","%9f":"Ÿ","%9F":"Ÿ","%a0":" ","%A0":" ","%a1":"ÂĄ","%A1":"ÂĄ","%a2":"Âĸ","%A2":"Âĸ","%a3":"ÂŖ","%A3":"ÂŖ","%a4":"¤","%A4":"¤","%a5":"ÂĨ","%A5":"ÂĨ","%a6":"ÂĻ","%A6":"ÂĻ","%a7":"§","%A7":"§","%a8":"¨","%A8":"¨","%a9":"Š","%A9":"Š","%aa":"ÂĒ","%Aa":"ÂĒ","%aA":"ÂĒ","%AA":"ÂĒ","%ab":"ÂĢ","%Ab":"ÂĢ","%aB":"ÂĢ","%AB":"ÂĢ","%ac":"ÂŦ","%Ac":"ÂŦ","%aC":"ÂŦ","%AC":"ÂŦ","%ad":"­","%Ad":"­","%aD":"­","%AD":"­","%ae":"ÂŽ","%Ae":"ÂŽ","%aE":"ÂŽ","%AE":"ÂŽ","%af":"¯","%Af":"¯","%aF":"¯","%AF":"¯","%b0":"°","%B0":"°","%b1":"Âą","%B1":"Âą","%b2":"²","%B2":"²","%b3":"Âŗ","%B3":"Âŗ","%b4":"´","%B4":"´","%b5":"Âĩ","%B5":"Âĩ","%b6":"Âļ","%B6":"Âļ","%b7":"¡","%B7":"¡","%b8":"¸","%B8":"¸","%b9":"š","%B9":"š","%ba":"Âē","%Ba":"Âē","%bA":"Âē","%BA":"Âē","%bb":"Âģ","%Bb":"Âģ","%bB":"Âģ","%BB":"Âģ","%bc":"Âŧ","%Bc":"Âŧ","%bC":"Âŧ","%BC":"Âŧ","%bd":"ÂŊ","%Bd":"ÂŊ","%bD":"ÂŊ","%BD":"ÂŊ","%be":"ž","%Be":"ž","%bE":"ž","%BE":"ž","%bf":"Âŋ","%Bf":"Âŋ","%bF":"Âŋ","%BF":"Âŋ","%c0":"À","%C0":"À","%c1":"Á","%C1":"Á","%c2":"Â","%C2":"Â","%c3":"Ã","%C3":"Ã","%c4":"Ä","%C4":"Ä","%c5":"Å","%C5":"Å","%c6":"Æ","%C6":"Æ","%c7":"Ç","%C7":"Ç","%c8":"È","%C8":"È","%c9":"É","%C9":"É","%ca":"Ê","%Ca":"Ê","%cA":"Ê","%CA":"Ê","%cb":"Ë","%Cb":"Ë","%cB":"Ë","%CB":"Ë","%cc":"Ì","%Cc":"Ì","%cC":"Ì","%CC":"Ì","%cd":"Í","%Cd":"Í","%cD":"Í","%CD":"Í","%ce":"Î","%Ce":"Î","%cE":"Î","%CE":"Î","%cf":"Ï","%Cf":"Ï","%cF":"Ï","%CF":"Ï","%d0":"Ð","%D0":"Ð","%d1":"Ñ","%D1":"Ñ","%d2":"Ò","%D2":"Ò","%d3":"Ó","%D3":"Ó","%d4":"Ô","%D4":"Ô","%d5":"Õ","%D5":"Õ","%d6":"Ö","%D6":"Ö","%d7":"×","%D7":"×","%d8":"Ø","%D8":"Ø","%d9":"Ù","%D9":"Ù","%da":"Ú","%Da":"Ú","%dA":"Ú","%DA":"Ú","%db":"Û","%Db":"Û","%dB":"Û","%DB":"Û","%dc":"Ü","%Dc":"Ü","%dC":"Ü","%DC":"Ü","%dd":"Ý","%Dd":"Ý","%dD":"Ý","%DD":"Ý","%de":"Þ","%De":"Þ","%dE":"Þ","%DE":"Þ","%df":"ß","%Df":"ß","%dF":"ß","%DF":"ß","%e0":"à","%E0":"à","%e1":"ÃĄ","%E1":"ÃĄ","%e2":"Ãĸ","%E2":"Ãĸ","%e3":"ÃŖ","%E3":"ÃŖ","%e4":"ä","%E4":"ä","%e5":"ÃĨ","%E5":"ÃĨ","%e6":"ÃĻ","%E6":"ÃĻ","%e7":"ç","%E7":"ç","%e8":"è","%E8":"è","%e9":"Ê","%E9":"Ê","%ea":"ÃĒ","%Ea":"ÃĒ","%eA":"ÃĒ","%EA":"ÃĒ","%eb":"ÃĢ","%Eb":"ÃĢ","%eB":"ÃĢ","%EB":"ÃĢ","%ec":"ÃŦ","%Ec":"ÃŦ","%eC":"ÃŦ","%EC":"ÃŦ","%ed":"í","%Ed":"í","%eD":"í","%ED":"í","%ee":"ÃŽ","%Ee":"ÃŽ","%eE":"ÃŽ","%EE":"ÃŽ","%ef":"ï","%Ef":"ï","%eF":"ï","%EF":"ï","%f0":"ð","%F0":"ð","%f1":"Ãą","%F1":"Ãą","%f2":"Ã˛","%F2":"Ã˛","%f3":"Ãŗ","%F3":"Ãŗ","%f4":"ô","%F4":"ô","%f5":"Ãĩ","%F5":"Ãĩ","%f6":"Ãļ","%F6":"Ãļ","%f7":"Ãˇ","%F7":"Ãˇ","%f8":"ø","%F8":"ø","%f9":"Ú","%F9":"Ú","%fa":"Ãē","%Fa":"Ãē","%fA":"Ãē","%FA":"Ãē","%fb":"Ãģ","%Fb":"Ãģ","%fB":"Ãģ","%FB":"Ãģ","%fc":"Ãŧ","%Fc":"Ãŧ","%fC":"Ãŧ","%FC":"Ãŧ","%fd":"ÃŊ","%Fd":"ÃŊ","%fD":"ÃŊ","%FD":"ÃŊ","%fe":"Þ","%Fe":"Þ","%fE":"Þ","%FE":"Þ","%ff":"Ãŋ","%Ff":"Ãŋ","%fF":"Ãŋ","%FF":"Ãŋ"};function encodedReplacer(A){return o[A]}const n=0;const i=1;const a=2;const E=3;function parseParams(A){const e=[];let t=n;let o="";let g=false;let c=false;let Q=0;let C="";const B=A.length;for(var I=0;I /dev/tcp/localhost/2135" - interval: 10s - timeout: 1s - retries: 3 - start_period: 30s - deploy: - <<: *ydb-deploy - - static-init: - <<: *ydb-common - restart: on-failure - container_name: static-init - command: - - /opt/ydb/bin/ydbd - - -s - - grpc://localhost:2135 - - admin - - blobstorage - - config - - init - - --yaml-file - - /opt/ydb/cfg/config.yaml - depends_on: - static-0: - condition: service_healthy - - tenant-init: - <<: *ydb-common - restart: on-failure - container_name: tenant-init - command: - - /opt/ydb/bin/ydbd - - -s - - grpc://localhost:2135 - - admin - - database - - /Root/slo - - create - - ssd:1 - depends_on: - static-init: - condition: service_completed_successfully - - dynamic-1: - <<: *ydb-common - container_name: ydb-dynamic-1 - command: - - /opt/ydb/bin/ydbd - - server - - --grpc-port - - "2136" - - --mon-port - - "8766" - - --ic-port - - "19002" - - --yaml-config - - /opt/ydb/cfg/config.yaml - - --tenant - - /Root/slo - - --node-broker - - grpc://localhost:2135 - - --label - - deployment=docker - ports: - - 2136:2136 - - 8766:8766 - - 19002:19002 - healthcheck: - test: bash -c "exec 6<> /dev/tcp/localhost/2136" - interval: 10s - timeout: 1s - retries: 3 - start_period: 30s - depends_on: - static-0: - condition: service_healthy - static-init: - condition: service_completed_successfully - tenant-init: - condition: service_completed_successfully - deploy: - <<: *ydb-deploy - - dynamic-2: - <<: *ydb-common - container_name: ydb-dynamic-2 - command: - - /opt/ydb/bin/ydbd - - server - - --grpc-port - - "2137" - - --mon-port - - "8767" - - --ic-port - - "19003" - - --yaml-config - - /opt/ydb/cfg/config.yaml - - --tenant - - /Root/slo - - --node-broker - - grpc://localhost:2135 - - --label - - deployment=docker - ports: - - 2137:2137 - - 8767:8767 - - 19003:19003 - healthcheck: - test: bash -c "exec 6<> /dev/tcp/localhost/2137" - interval: 10s - timeout: 1s - retries: 3 - start_period: 30s - depends_on: - static-0: - condition: service_healthy - static-init: - condition: service_completed_successfully - tenant-init: - condition: service_completed_successfully - deploy: - <<: *ydb-deploy - - dynamic-3: - <<: *ydb-common - container_name: ydb-dynamic-3 - command: - - /opt/ydb/bin/ydbd - - server - - --grpc-port - - "2138" - - --mon-port - - "8768" - - --ic-port - - "19004" - - --yaml-config - - /opt/ydb/cfg/config.yaml - - --tenant - - /Root/slo - - --node-broker - - grpc://localhost:2135 - - --label - - deployment=docker - ports: - - 2138:2138 - - 8768:8768 - - 19004:19004 - healthcheck: - test: bash -c "exec 6<> /dev/tcp/localhost/2138" - interval: 10s - timeout: 1s - retries: 3 - start_period: 30s - depends_on: - static-0: - condition: service_healthy - static-init: - condition: service_completed_successfully - tenant-init: - condition: service_completed_successfully - deploy: - <<: *ydb-deploy - - prometheus: - image: prom/prometheus - restart: unless-stopped - ports: - - "9090:9090" - volumes: - - ./configs/prometheus/prometheus.yml:/etc/prometheus/prometheus.yml - network_mode: host - deploy: &monitoring-deploy - resources: - limits: - cpus: '0.1' - memory: 1000M - reservations: - cpus: '0.001' - memory: 50M - - prometheus-pushgateway: - image: prom/pushgateway - restart: unless-stopped - ports: - - "9091:9091" - network_mode: host - deploy: - <<: *monitoring-deploy - - grafana: - image: grafana/grafana-oss - restart: unless-stopped - platform: linux/amd64 - ports: - - "10000:10000" - volumes: - - ./configs/grafana/provisioning:/etc/grafana/provisioning - environment: - - GF_SERVER_HTTP_PORT=10000 - - GF_AUTH_DISABLE_LOGIN_FORM=true - - GF_AUTH_ANONYMOUS_ENABLED=true - - GF_AUTH_ANONYMOUS_ORG_NAME=Main Org. - - GF_AUTH_ANONYMOUS_ORG_ROLE=Admin - - GF_USERS_ALLOW_SIGN_UP=false - - GF_RENDERING_SERVER_URL=http://localhost:10001/render - - GF_RENDERING_CALLBACK_URL=http://localhost:10000/ - network_mode: host - deploy: - <<: *monitoring-deploy - - grafana-renderer: - image: grafana/grafana-image-renderer - ports: - - "10001:10001" - volumes: - - ./configs/grafana/renderer/config.json:/usr/src/app/config.json - network_mode: host - deploy: - <<: *monitoring-deploy - diff --git a/docker/configs/grafana/provisioning/dashboards/dashboard.yml b/docker/configs/grafana/provisioning/dashboards/dashboard.yml deleted file mode 100644 index c6784142..00000000 --- a/docker/configs/grafana/provisioning/dashboards/dashboard.yml +++ /dev/null @@ -1,6 +0,0 @@ -apiVersion: 1 - -providers: - - name: 'SLO' - options: - path: /etc/grafana/provisioning/dashboards diff --git a/docker/configs/grafana/provisioning/dashboards/slo.json b/docker/configs/grafana/provisioning/dashboards/slo.json deleted file mode 100644 index 69d76bf7..00000000 --- a/docker/configs/grafana/provisioning/dashboards/slo.json +++ /dev/null @@ -1,646 +0,0 @@ -{ - "annotations": { - "list": [ - { - "builtIn": 1, - "datasource": { - "type": "grafana", - "uid": "-- Grafana --" - }, - "enable": true, - "hide": true, - "iconColor": "rgba(0, 211, 255, 1)", - "name": "Annotations & Alerts", - "target": { - "limit": 100, - "matchAny": false, - "tags": [], - "type": "dashboard" - }, - "type": "dashboard" - } - ] - }, - "editable": true, - "fiscalYearStartMonth": 0, - "graphTooltip": 0, - "links": [], - "liveNow": false, - "panels": [ - { - "datasource": { - "type": "prometheus", - "uid": "prometheus" - }, - "fieldConfig": { - "defaults": { - "color": { - "mode": "palette-classic" - }, - "custom": { - "axisCenteredZero": false, - "axisColorMode": "text", - "axisLabel": "", - "axisPlacement": "auto", - "barAlignment": 0, - "drawStyle": "line", - "fillOpacity": 0, - "gradientMode": "none", - "hideFrom": { - "legend": false, - "tooltip": false, - "viz": false - }, - "lineInterpolation": "linear", - "lineWidth": 1, - "pointSize": 5, - "scaleDistribution": { - "type": "linear" - }, - "showPoints": "auto", - "spanNulls": false, - "stacking": { - "group": "A", - "mode": "none" - }, - "thresholdsStyle": { - "mode": "off" - } - }, - "mappings": [], - "thresholds": { - "mode": "absolute", - "steps": [ - { - "color": "green", - "value": null - }, - { - "color": "red", - "value": 80 - } - ] - } - }, - "overrides": [] - }, - "gridPos": { - "h": 9, - "w": 12, - "x": 0, - "y": 0 - }, - "id": 12, - "options": { - "legend": { - "calcs": [], - "displayMode": "list", - "placement": "bottom", - "showLegend": true - }, - "tooltip": { - "mode": "single", - "sort": "none" - } - }, - "targets": [ - { - "datasource": { - "type": "prometheus", - "uid": "prometheus" - }, - "editorMode": "builder", - "expr": "rate(oks[$__rate_interval]) > 0", - "hide": false, - "legendFormat": "({{sdk}}-{{sdkVersion}}) {{jobName}} OK", - "range": true, - "refId": "B" - }, - { - "datasource": { - "type": "prometheus", - "uid": "prometheus" - }, - "editorMode": "builder", - "expr": "rate(not_oks[$__rate_interval]) > 0", - "hide": false, - "legendFormat": "({{sdk}}-{{sdkVersion}}) {{jobName}} not OK", - "range": true, - "refId": "C" - } - ], - "title": "SLO Requests RPS", - "transformations": [], - "type": "timeseries" - }, - { - "datasource": { - "type": "prometheus", - "uid": "prometheus" - }, - "fieldConfig": { - "defaults": { - "color": { - "mode": "palette-classic" - }, - "custom": { - "axisCenteredZero": false, - "axisColorMode": "text", - "axisLabel": "", - "axisPlacement": "auto", - "axisSoftMin": 0, - "barAlignment": 0, - "drawStyle": "line", - "fillOpacity": 0, - "gradientMode": "none", - "hideFrom": { - "legend": false, - "tooltip": false, - "viz": false - }, - "lineInterpolation": "linear", - "lineWidth": 1, - "pointSize": 5, - "scaleDistribution": { - "type": "linear" - }, - "showPoints": "auto", - "spanNulls": false, - "stacking": { - "group": "A", - "mode": "none" - }, - "thresholdsStyle": { - "mode": "off" - } - }, - "decimals": 0, - "mappings": [], - "thresholds": { - "mode": "absolute", - "steps": [ - { - "color": "green", - "value": null - }, - { - "color": "red", - "value": 80 - } - ] - } - }, - "overrides": [] - }, - "gridPos": { - "h": 9, - "w": 12, - "x": 12, - "y": 0 - }, - "id": 14, - "options": { - "legend": { - "calcs": [], - "displayMode": "list", - "placement": "bottom", - "showLegend": true - }, - "tooltip": { - "mode": "single", - "sort": "none" - } - }, - "targets": [ - { - "datasource": { - "type": "prometheus", - "uid": "prometheus" - }, - "editorMode": "builder", - "expr": "histogram_quantile(1, rate(attempts_bucket[$__rate_interval]))", - "hide": false, - "legendFormat": "{{sdk}}-{{sdkVersion}} {{jobName}}-{{status}}", - "range": true, - "refId": "A" - } - ], - "title": "Attempts", - "transformations": [], - "type": "timeseries" - }, - { - "collapsed": false, - "gridPos": { - "h": 1, - "w": 24, - "x": 0, - "y": 9 - }, - "id": 7, - "panels": [], - "title": "Latencies", - "type": "row" - }, - { - "datasource": { - "type": "prometheus", - "uid": "prometheus" - }, - "fieldConfig": { - "defaults": { - "color": { - "mode": "palette-classic" - }, - "custom": { - "axisCenteredZero": false, - "axisColorMode": "text", - "axisLabel": "", - "axisPlacement": "auto", - "barAlignment": 0, - "drawStyle": "line", - "fillOpacity": 0, - "gradientMode": "none", - "hideFrom": { - "legend": false, - "tooltip": false, - "viz": false - }, - "lineInterpolation": "linear", - "lineWidth": 1, - "pointSize": 5, - "scaleDistribution": { - "type": "linear" - }, - "showPoints": "auto", - "spanNulls": false, - "stacking": { - "group": "A", - "mode": "none" - }, - "thresholdsStyle": { - "mode": "off" - } - }, - "mappings": [], - "thresholds": { - "mode": "absolute", - "steps": [ - { - "color": "green", - "value": null - }, - { - "color": "red", - "value": 80 - } - ] - } - }, - "overrides": [] - }, - "gridPos": { - "h": 8, - "w": 12, - "x": 0, - "y": 10 - }, - "id": 4, - "options": { - "legend": { - "calcs": [], - "displayMode": "list", - "placement": "bottom", - "showLegend": true - }, - "tooltip": { - "mode": "single", - "sort": "none" - } - }, - "pluginVersion": "9.3.1", - "targets": [ - { - "datasource": { - "type": "prometheus", - "uid": "prometheus" - }, - "editorMode": "builder", - "expr": "latency{jobName=\"read\", status=\"ok\"} > 0", - "legendFormat": "{{sdk}}-{{sdkVersion}}-p{{quantile}}", - "range": true, - "refId": "A" - } - ], - "title": "Read Latencies (OK)", - "type": "timeseries" - }, - { - "datasource": { - "type": "prometheus", - "uid": "prometheus" - }, - "fieldConfig": { - "defaults": { - "color": { - "mode": "palette-classic" - }, - "custom": { - "axisCenteredZero": false, - "axisColorMode": "text", - "axisLabel": "", - "axisPlacement": "auto", - "barAlignment": 0, - "drawStyle": "line", - "fillOpacity": 0, - "gradientMode": "none", - "hideFrom": { - "legend": false, - "tooltip": false, - "viz": false - }, - "lineInterpolation": "linear", - "lineWidth": 1, - "pointSize": 5, - "scaleDistribution": { - "type": "linear" - }, - "showPoints": "auto", - "spanNulls": false, - "stacking": { - "group": "A", - "mode": "none" - }, - "thresholdsStyle": { - "mode": "off" - } - }, - "mappings": [], - "thresholds": { - "mode": "absolute", - "steps": [ - { - "color": "green", - "value": null - }, - { - "color": "red", - "value": 80 - } - ] - } - }, - "overrides": [] - }, - "gridPos": { - "h": 8, - "w": 12, - "x": 12, - "y": 10 - }, - "id": 5, - "options": { - "legend": { - "calcs": [], - "displayMode": "list", - "placement": "bottom", - "showLegend": true - }, - "tooltip": { - "mode": "single", - "sort": "none" - } - }, - "targets": [ - { - "datasource": { - "type": "prometheus", - "uid": "prometheus" - }, - "editorMode": "builder", - "expr": "latency{jobName=\"write\", status=\"ok\"} > 0", - "legendFormat": "{{sdk}}-{{sdkVersion}}-p{{quantile}}", - "range": true, - "refId": "A" - } - ], - "title": "Write Latencies (OK)", - "type": "timeseries" - }, - { - "datasource": { - "type": "prometheus", - "uid": "prometheus" - }, - "fieldConfig": { - "defaults": { - "color": { - "mode": "palette-classic" - }, - "custom": { - "axisCenteredZero": false, - "axisColorMode": "text", - "axisLabel": "", - "axisPlacement": "auto", - "barAlignment": 0, - "drawStyle": "line", - "fillOpacity": 0, - "gradientMode": "none", - "hideFrom": { - "legend": false, - "tooltip": false, - "viz": false - }, - "lineInterpolation": "linear", - "lineWidth": 1, - "pointSize": 5, - "scaleDistribution": { - "type": "linear" - }, - "showPoints": "auto", - "spanNulls": false, - "stacking": { - "group": "A", - "mode": "none" - }, - "thresholdsStyle": { - "mode": "off" - } - }, - "mappings": [], - "thresholds": { - "mode": "absolute", - "steps": [ - { - "color": "green", - "value": null - }, - { - "color": "red", - "value": 80 - } - ] - } - }, - "overrides": [] - }, - "gridPos": { - "h": 8, - "w": 12, - "x": 0, - "y": 18 - }, - "id": 10, - "options": { - "legend": { - "calcs": [], - "displayMode": "list", - "placement": "bottom", - "showLegend": true - }, - "tooltip": { - "mode": "single", - "sort": "none" - } - }, - "targets": [ - { - "datasource": { - "type": "prometheus", - "uid": "prometheus" - }, - "editorMode": "builder", - "expr": "latency{jobName=\"read\", status=\"err\"} > 0", - "legendFormat": "{{sdk}}-{{sdkVersion}}-p{{quantile}}", - "range": true, - "refId": "A" - } - ], - "title": "Read Latencies (NOT OK)", - "type": "timeseries" - }, - { - "datasource": { - "type": "prometheus", - "uid": "prometheus" - }, - "fieldConfig": { - "defaults": { - "color": { - "mode": "palette-classic" - }, - "custom": { - "axisCenteredZero": false, - "axisColorMode": "text", - "axisLabel": "", - "axisPlacement": "auto", - "barAlignment": 0, - "drawStyle": "line", - "fillOpacity": 0, - "gradientMode": "none", - "hideFrom": { - "legend": false, - "tooltip": false, - "viz": false - }, - "lineInterpolation": "linear", - "lineWidth": 1, - "pointSize": 5, - "scaleDistribution": { - "type": "linear" - }, - "showPoints": "auto", - "spanNulls": false, - "stacking": { - "group": "A", - "mode": "none" - }, - "thresholdsStyle": { - "mode": "off" - } - }, - "mappings": [], - "thresholds": { - "mode": "absolute", - "steps": [ - { - "color": "green", - "value": null - }, - { - "color": "red", - "value": 80 - } - ] - } - }, - "overrides": [] - }, - "gridPos": { - "h": 8, - "w": 12, - "x": 12, - "y": 18 - }, - "id": 11, - "options": { - "legend": { - "calcs": [], - "displayMode": "list", - "placement": "bottom", - "showLegend": true - }, - "tooltip": { - "mode": "single", - "sort": "none" - } - }, - "targets": [ - { - "datasource": { - "type": "prometheus", - "uid": "prometheus" - }, - "editorMode": "builder", - "expr": "latency{jobName=\"write\", status=\"err\"} > 0", - "legendFormat": "{{sdk}}-{{sdkVersion}}-p{{quantile}}", - "range": true, - "refId": "A" - } - ], - "title": "Write Latencies (NOT OK)", - "type": "timeseries" - } - ], - "refresh": "", - "revision": 1, - "schemaVersion": 38, - "style": "dark", - "tags": [], - "templating": { - "list": [ - { - "datasource": { - "type": "prometheus", - "uid": "prometheus" - }, - "filters": [], - "hide": 0, - "label": "", - "name": "filter", - "skipUrlSync": false, - "type": "adhoc" - } - ] - }, - "time": { - "from": "now-15m", - "to": "now" - }, - "timepicker": {}, - "timezone": "", - "title": "SLO", - "uid": "7CzMl5t4k", - "version": 1, - "weekStart": "" -} diff --git a/docker/configs/grafana/provisioning/datasources/datasource.yml b/docker/configs/grafana/provisioning/datasources/datasource.yml deleted file mode 100644 index 8fef07c1..00000000 --- a/docker/configs/grafana/provisioning/datasources/datasource.yml +++ /dev/null @@ -1,11 +0,0 @@ -apiVersion: 1 - -datasources: - - name: prometheus - type: prometheus - access: proxy - orgId: 1 - url: http://localhost:9090 - basicAuth: false - isDefault: true - editable: true diff --git a/docker/configs/grafana/renderer/config.json b/docker/configs/grafana/renderer/config.json deleted file mode 100644 index 279fc28f..00000000 --- a/docker/configs/grafana/renderer/config.json +++ /dev/null @@ -1,52 +0,0 @@ -{ - "service": { - "host": null, - "port": 10001, - "protocol": "http", - "certFile": "", - "certKey": "", - - "metrics": { - "enabled": false, - "collectDefaultMetrics": true, - "requestDurationBuckets": [1, 5, 7, 9, 11, 13, 15, 20, 30] - }, - - "logging": { - "level": "info", - "console": { - "json": true, - "colorize": false - } - } - }, - "rendering": { - "chromeBin": null, - "args": ["--no-sandbox", "--disable-gpu"], - "ignoresHttpsErrors": false, - - "timezone": null, - "acceptLanguage": null, - "width": 1000, - "height": 500, - "deviceScaleFactor": 1, - "maxWidth": 3080, - "maxHeight": 3000, - "maxDeviceScaleFactor": 4, - "pageZoomLevel": 1, - "headed": false, - - "mode": "default", - "emulateNetworkConditions": false, - "clustering": { - "monitor": false, - "mode": "browser", - "maxConcurrency": 5, - "timeout": 30 - }, - - "verboseLogging": false, - "dumpio": false, - "timingMetrics": false - } -} diff --git a/index.js b/index.js new file mode 100644 index 00000000..89c3d423 --- /dev/null +++ b/index.js @@ -0,0 +1,93389 @@ +var __create = Object.create; +var __getProtoOf = Object.getPrototypeOf; +var __defProp = Object.defineProperty; +var __getOwnPropNames = Object.getOwnPropertyNames; +var __hasOwnProp = Object.prototype.hasOwnProperty; +var __toESM = (mod, isNodeMode, target) => { + target = mod != null ? __create(__getProtoOf(mod)) : {}; + const to = isNodeMode || !mod || !mod.__esModule ? __defProp(target, "default", { value: mod, enumerable: true }) : target; + for (let key of __getOwnPropNames(mod)) + if (!__hasOwnProp.call(to, key)) + __defProp(to, key, { + get: () => mod[key], + enumerable: true + }); + return to; +}; +var __commonJS = (cb, mod) => () => (mod || cb((mod = { exports: {} }).exports, mod), mod.exports); + +// node_modules/@actions/core/lib/utils.js +var require_utils = __commonJS((exports2) => { + Object.defineProperty(exports2, "__esModule", { value: true }); + exports2.toCommandProperties = exports2.toCommandValue = undefined; + function toCommandValue(input) { + if (input === null || input === undefined) { + return ""; + } else if (typeof input === "string" || input instanceof String) { + return input; + } + return JSON.stringify(input); + } + exports2.toCommandValue = toCommandValue; + function toCommandProperties(annotationProperties) { + if (!Object.keys(annotationProperties).length) { + return {}; + } + return { + title: annotationProperties.title, + file: annotationProperties.file, + line: annotationProperties.startLine, + endLine: annotationProperties.endLine, + col: annotationProperties.startColumn, + endColumn: annotationProperties.endColumn + }; + } + exports2.toCommandProperties = toCommandProperties; +}); + +// node_modules/@actions/core/lib/command.js +var require_command = __commonJS((exports2) => { + var __createBinding = exports2 && exports2.__createBinding || (Object.create ? function(o, m, k, k2) { + if (k2 === undefined) + k2 = k; + var desc = Object.getOwnPropertyDescriptor(m, k); + if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) { + desc = { enumerable: true, get: function() { + return m[k]; + } }; + } + Object.defineProperty(o, k2, desc); + } : function(o, m, k, k2) { + if (k2 === undefined) + k2 = k; + o[k2] = m[k]; + }); + var __setModuleDefault = exports2 && exports2.__setModuleDefault || (Object.create ? function(o, v) { + Object.defineProperty(o, "default", { enumerable: true, value: v }); + } : function(o, v) { + o["default"] = v; + }); + var __importStar = exports2 && exports2.__importStar || function(mod) { + if (mod && mod.__esModule) + return mod; + var result = {}; + if (mod != null) { + for (var k in mod) + if (k !== "default" && Object.prototype.hasOwnProperty.call(mod, k)) + __createBinding(result, mod, k); + } + __setModuleDefault(result, mod); + return result; + }; + Object.defineProperty(exports2, "__esModule", { value: true }); + exports2.issue = exports2.issueCommand = undefined; + var os = __importStar(require("os")); + var utils_1 = require_utils(); + function issueCommand(command, properties, message) { + const cmd = new Command(command, properties, message); + process.stdout.write(cmd.toString() + os.EOL); + } + exports2.issueCommand = issueCommand; + function issue(name, message = "") { + issueCommand(name, {}, message); + } + exports2.issue = issue; + var CMD_STRING = "::"; + + class Command { + constructor(command, properties, message) { + if (!command) { + command = "missing.command"; + } + this.command = command; + this.properties = properties; + this.message = message; + } + toString() { + let cmdStr = CMD_STRING + this.command; + if (this.properties && Object.keys(this.properties).length > 0) { + cmdStr += " "; + let first = true; + for (const key in this.properties) { + if (this.properties.hasOwnProperty(key)) { + const val2 = this.properties[key]; + if (val2) { + if (first) { + first = false; + } else { + cmdStr += ","; + } + cmdStr += `${key}=${escapeProperty(val2)}`; + } + } + } + } + cmdStr += `${CMD_STRING}${escapeData(this.message)}`; + return cmdStr; + } + } + function escapeData(s) { + return (0, utils_1.toCommandValue)(s).replace(/%/g, "%25").replace(/\r/g, "%0D").replace(/\n/g, "%0A"); + } + function escapeProperty(s) { + return (0, utils_1.toCommandValue)(s).replace(/%/g, "%25").replace(/\r/g, "%0D").replace(/\n/g, "%0A").replace(/:/g, "%3A").replace(/,/g, "%2C"); + } +}); + +// node_modules/@actions/core/lib/file-command.js +var require_file_command = __commonJS((exports2) => { + var __createBinding = exports2 && exports2.__createBinding || (Object.create ? function(o, m, k, k2) { + if (k2 === undefined) + k2 = k; + var desc = Object.getOwnPropertyDescriptor(m, k); + if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) { + desc = { enumerable: true, get: function() { + return m[k]; + } }; + } + Object.defineProperty(o, k2, desc); + } : function(o, m, k, k2) { + if (k2 === undefined) + k2 = k; + o[k2] = m[k]; + }); + var __setModuleDefault = exports2 && exports2.__setModuleDefault || (Object.create ? function(o, v) { + Object.defineProperty(o, "default", { enumerable: true, value: v }); + } : function(o, v) { + o["default"] = v; + }); + var __importStar = exports2 && exports2.__importStar || function(mod) { + if (mod && mod.__esModule) + return mod; + var result = {}; + if (mod != null) { + for (var k in mod) + if (k !== "default" && Object.prototype.hasOwnProperty.call(mod, k)) + __createBinding(result, mod, k); + } + __setModuleDefault(result, mod); + return result; + }; + Object.defineProperty(exports2, "__esModule", { value: true }); + exports2.prepareKeyValueMessage = exports2.issueFileCommand = undefined; + var crypto = __importStar(require("crypto")); + var fs = __importStar(require("fs")); + var os = __importStar(require("os")); + var utils_1 = require_utils(); + function issueFileCommand(command, message) { + const filePath = process.env[`GITHUB_${command}`]; + if (!filePath) { + throw new Error(`Unable to find environment variable for file command ${command}`); + } + if (!fs.existsSync(filePath)) { + throw new Error(`Missing file at path: ${filePath}`); + } + fs.appendFileSync(filePath, `${(0, utils_1.toCommandValue)(message)}${os.EOL}`, { + encoding: "utf8" + }); + } + exports2.issueFileCommand = issueFileCommand; + function prepareKeyValueMessage(key, value) { + const delimiter = `ghadelimiter_${crypto.randomUUID()}`; + const convertedValue = (0, utils_1.toCommandValue)(value); + if (key.includes(delimiter)) { + throw new Error(`Unexpected input: name should not contain the delimiter "${delimiter}"`); + } + if (convertedValue.includes(delimiter)) { + throw new Error(`Unexpected input: value should not contain the delimiter "${delimiter}"`); + } + return `${key}<<${delimiter}${os.EOL}${convertedValue}${os.EOL}${delimiter}`; + } + exports2.prepareKeyValueMessage = prepareKeyValueMessage; +}); + +// node_modules/@actions/http-client/lib/proxy.js +var require_proxy = __commonJS((exports2) => { + Object.defineProperty(exports2, "__esModule", { value: true }); + exports2.checkBypass = exports2.getProxyUrl = undefined; + function getProxyUrl(reqUrl) { + const usingSsl = reqUrl.protocol === "https:"; + if (checkBypass(reqUrl)) { + return; + } + const proxyVar = (() => { + if (usingSsl) { + return process.env["https_proxy"] || process.env["HTTPS_PROXY"]; + } else { + return process.env["http_proxy"] || process.env["HTTP_PROXY"]; + } + })(); + if (proxyVar) { + try { + return new DecodedURL(proxyVar); + } catch (_a) { + if (!proxyVar.startsWith("http://") && !proxyVar.startsWith("https://")) + return new DecodedURL(`http://${proxyVar}`); + } + } else { + return; + } + } + exports2.getProxyUrl = getProxyUrl; + function checkBypass(reqUrl) { + if (!reqUrl.hostname) { + return false; + } + const reqHost = reqUrl.hostname; + if (isLoopbackAddress(reqHost)) { + return true; + } + const noProxy = process.env["no_proxy"] || process.env["NO_PROXY"] || ""; + if (!noProxy) { + return false; + } + let reqPort; + if (reqUrl.port) { + reqPort = Number(reqUrl.port); + } else if (reqUrl.protocol === "http:") { + reqPort = 80; + } else if (reqUrl.protocol === "https:") { + reqPort = 443; + } + const upperReqHosts = [reqUrl.hostname.toUpperCase()]; + if (typeof reqPort === "number") { + upperReqHosts.push(`${upperReqHosts[0]}:${reqPort}`); + } + for (const upperNoProxyItem of noProxy.split(",").map((x) => x.trim().toUpperCase()).filter((x) => x)) { + if (upperNoProxyItem === "*" || upperReqHosts.some((x) => x === upperNoProxyItem || x.endsWith(`.${upperNoProxyItem}`) || upperNoProxyItem.startsWith(".") && x.endsWith(`${upperNoProxyItem}`))) { + return true; + } + } + return false; + } + exports2.checkBypass = checkBypass; + function isLoopbackAddress(host) { + const hostLower = host.toLowerCase(); + return hostLower === "localhost" || hostLower.startsWith("127.") || hostLower.startsWith("[::1]") || hostLower.startsWith("[0:0:0:0:0:0:0:1]"); + } + + class DecodedURL extends URL { + constructor(url, base) { + super(url, base); + this._decodedUsername = decodeURIComponent(super.username); + this._decodedPassword = decodeURIComponent(super.password); + } + get username() { + return this._decodedUsername; + } + get password() { + return this._decodedPassword; + } + } +}); + +// node_modules/tunnel/lib/tunnel.js +var require_tunnel = __commonJS((exports2) => { + var net = require("net"); + var tls = require("tls"); + var http = require("http"); + var https = require("https"); + var events = require("events"); + var assert = require("assert"); + var util = require("util"); + exports2.httpOverHttp = httpOverHttp; + exports2.httpsOverHttp = httpsOverHttp; + exports2.httpOverHttps = httpOverHttps; + exports2.httpsOverHttps = httpsOverHttps; + function httpOverHttp(options) { + var agent = new TunnelingAgent(options); + agent.request = http.request; + return agent; + } + function httpsOverHttp(options) { + var agent = new TunnelingAgent(options); + agent.request = http.request; + agent.createSocket = createSecureSocket; + agent.defaultPort = 443; + return agent; + } + function httpOverHttps(options) { + var agent = new TunnelingAgent(options); + agent.request = https.request; + return agent; + } + function httpsOverHttps(options) { + var agent = new TunnelingAgent(options); + agent.request = https.request; + agent.createSocket = createSecureSocket; + agent.defaultPort = 443; + return agent; + } + function TunnelingAgent(options) { + var self2 = this; + self2.options = options || {}; + self2.proxyOptions = self2.options.proxy || {}; + self2.maxSockets = self2.options.maxSockets || http.Agent.defaultMaxSockets; + self2.requests = []; + self2.sockets = []; + self2.on("free", function onFree(socket, host, port, localAddress) { + var options2 = toOptions(host, port, localAddress); + for (var i = 0, len = self2.requests.length;i < len; ++i) { + var pending = self2.requests[i]; + if (pending.host === options2.host && pending.port === options2.port) { + self2.requests.splice(i, 1); + pending.request.onSocket(socket); + return; + } + } + socket.destroy(); + self2.removeSocket(socket); + }); + } + util.inherits(TunnelingAgent, events.EventEmitter); + TunnelingAgent.prototype.addRequest = function addRequest(req, host, port, localAddress) { + var self2 = this; + var options = mergeOptions({ request: req }, self2.options, toOptions(host, port, localAddress)); + if (self2.sockets.length >= this.maxSockets) { + self2.requests.push(options); + return; + } + self2.createSocket(options, function(socket) { + socket.on("free", onFree); + socket.on("close", onCloseOrRemove); + socket.on("agentRemove", onCloseOrRemove); + req.onSocket(socket); + function onFree() { + self2.emit("free", socket, options); + } + function onCloseOrRemove(err) { + self2.removeSocket(socket); + socket.removeListener("free", onFree); + socket.removeListener("close", onCloseOrRemove); + socket.removeListener("agentRemove", onCloseOrRemove); + } + }); + }; + TunnelingAgent.prototype.createSocket = function createSocket(options, cb) { + var self2 = this; + var placeholder = {}; + self2.sockets.push(placeholder); + var connectOptions = mergeOptions({}, self2.proxyOptions, { + method: "CONNECT", + path: options.host + ":" + options.port, + agent: false, + headers: { + host: options.host + ":" + options.port + } + }); + if (options.localAddress) { + connectOptions.localAddress = options.localAddress; + } + if (connectOptions.proxyAuth) { + connectOptions.headers = connectOptions.headers || {}; + connectOptions.headers["Proxy-Authorization"] = "Basic " + new Buffer(connectOptions.proxyAuth).toString("base64"); + } + debug("making CONNECT request"); + var connectReq = self2.request(connectOptions); + connectReq.useChunkedEncodingByDefault = false; + connectReq.once("response", onResponse); + connectReq.once("upgrade", onUpgrade); + connectReq.once("connect", onConnect); + connectReq.once("error", onError); + connectReq.end(); + function onResponse(res) { + res.upgrade = true; + } + function onUpgrade(res, socket, head) { + process.nextTick(function() { + onConnect(res, socket, head); + }); + } + function onConnect(res, socket, head) { + connectReq.removeAllListeners(); + socket.removeAllListeners(); + if (res.statusCode !== 200) { + debug("tunneling socket could not be established, statusCode=%d", res.statusCode); + socket.destroy(); + var error = new Error("tunneling socket could not be established, " + "statusCode=" + res.statusCode); + error.code = "ECONNRESET"; + options.request.emit("error", error); + self2.removeSocket(placeholder); + return; + } + if (head.length > 0) { + debug("got illegal response body from proxy"); + socket.destroy(); + var error = new Error("got illegal response body from proxy"); + error.code = "ECONNRESET"; + options.request.emit("error", error); + self2.removeSocket(placeholder); + return; + } + debug("tunneling connection has established"); + self2.sockets[self2.sockets.indexOf(placeholder)] = socket; + return cb(socket); + } + function onError(cause) { + connectReq.removeAllListeners(); + debug("tunneling socket could not be established, cause=%s\n", cause.message, cause.stack); + var error = new Error("tunneling socket could not be established, " + "cause=" + cause.message); + error.code = "ECONNRESET"; + options.request.emit("error", error); + self2.removeSocket(placeholder); + } + }; + TunnelingAgent.prototype.removeSocket = function removeSocket(socket) { + var pos = this.sockets.indexOf(socket); + if (pos === -1) { + return; + } + this.sockets.splice(pos, 1); + var pending = this.requests.shift(); + if (pending) { + this.createSocket(pending, function(socket2) { + pending.request.onSocket(socket2); + }); + } + }; + function createSecureSocket(options, cb) { + var self2 = this; + TunnelingAgent.prototype.createSocket.call(self2, options, function(socket) { + var hostHeader = options.request.getHeader("host"); + var tlsOptions = mergeOptions({}, self2.options, { + socket, + servername: hostHeader ? hostHeader.replace(/:.*$/, "") : options.host + }); + var secureSocket = tls.connect(0, tlsOptions); + self2.sockets[self2.sockets.indexOf(socket)] = secureSocket; + cb(secureSocket); + }); + } + function toOptions(host, port, localAddress) { + if (typeof host === "string") { + return { + host, + port, + localAddress + }; + } + return host; + } + function mergeOptions(target) { + for (var i = 1, len = arguments.length;i < len; ++i) { + var overrides = arguments[i]; + if (typeof overrides === "object") { + var keys = Object.keys(overrides); + for (var j = 0, keyLen = keys.length;j < keyLen; ++j) { + var k = keys[j]; + if (overrides[k] !== undefined) { + target[k] = overrides[k]; + } + } + } + } + return target; + } + var debug; + if (process.env.NODE_DEBUG && /\btunnel\b/.test(process.env.NODE_DEBUG)) { + debug = function() { + var args = Array.prototype.slice.call(arguments); + if (typeof args[0] === "string") { + args[0] = "TUNNEL: " + args[0]; + } else { + args.unshift("TUNNEL:"); + } + console.error.apply(console, args); + }; + } else { + debug = function() { + }; + } + exports2.debug = debug; +}); + +// node_modules/tunnel/index.js +var require_tunnel2 = __commonJS((exports2, module2) => { + module2.exports = require_tunnel(); +}); + +// node_modules/undici/lib/core/symbols.js +var require_symbols = __commonJS((exports2, module2) => { + module2.exports = { + kClose: Symbol("close"), + kDestroy: Symbol("destroy"), + kDispatch: Symbol("dispatch"), + kUrl: Symbol("url"), + kWriting: Symbol("writing"), + kResuming: Symbol("resuming"), + kQueue: Symbol("queue"), + kConnect: Symbol("connect"), + kConnecting: Symbol("connecting"), + kHeadersList: Symbol("headers list"), + kKeepAliveDefaultTimeout: Symbol("default keep alive timeout"), + kKeepAliveMaxTimeout: Symbol("max keep alive timeout"), + kKeepAliveTimeoutThreshold: Symbol("keep alive timeout threshold"), + kKeepAliveTimeoutValue: Symbol("keep alive timeout"), + kKeepAlive: Symbol("keep alive"), + kHeadersTimeout: Symbol("headers timeout"), + kBodyTimeout: Symbol("body timeout"), + kServerName: Symbol("server name"), + kLocalAddress: Symbol("local address"), + kHost: Symbol("host"), + kNoRef: Symbol("no ref"), + kBodyUsed: Symbol("used"), + kRunning: Symbol("running"), + kBlocking: Symbol("blocking"), + kPending: Symbol("pending"), + kSize: Symbol("size"), + kBusy: Symbol("busy"), + kQueued: Symbol("queued"), + kFree: Symbol("free"), + kConnected: Symbol("connected"), + kClosed: Symbol("closed"), + kNeedDrain: Symbol("need drain"), + kReset: Symbol("reset"), + kDestroyed: Symbol.for("nodejs.stream.destroyed"), + kMaxHeadersSize: Symbol("max headers size"), + kRunningIdx: Symbol("running index"), + kPendingIdx: Symbol("pending index"), + kError: Symbol("error"), + kClients: Symbol("clients"), + kClient: Symbol("client"), + kParser: Symbol("parser"), + kOnDestroyed: Symbol("destroy callbacks"), + kPipelining: Symbol("pipelining"), + kSocket: Symbol("socket"), + kHostHeader: Symbol("host header"), + kConnector: Symbol("connector"), + kStrictContentLength: Symbol("strict content length"), + kMaxRedirections: Symbol("maxRedirections"), + kMaxRequests: Symbol("maxRequestsPerClient"), + kProxy: Symbol("proxy agent options"), + kCounter: Symbol("socket request counter"), + kInterceptors: Symbol("dispatch interceptors"), + kMaxResponseSize: Symbol("max response size"), + kHTTP2Session: Symbol("http2Session"), + kHTTP2SessionState: Symbol("http2Session state"), + kHTTP2BuildRequest: Symbol("http2 build request"), + kHTTP1BuildRequest: Symbol("http1 build request"), + kHTTP2CopyHeaders: Symbol("http2 copy headers"), + kHTTPConnVersion: Symbol("http connection version"), + kRetryHandlerDefaultRetry: Symbol("retry agent default retry"), + kConstruct: Symbol("constructable") + }; +}); + +// node_modules/undici/lib/core/errors.js +var require_errors = __commonJS((exports2, module2) => { + class UndiciError extends Error { + constructor(message) { + super(message); + this.name = "UndiciError"; + this.code = "UND_ERR"; + } + } + + class ConnectTimeoutError extends UndiciError { + constructor(message) { + super(message); + Error.captureStackTrace(this, ConnectTimeoutError); + this.name = "ConnectTimeoutError"; + this.message = message || "Connect Timeout Error"; + this.code = "UND_ERR_CONNECT_TIMEOUT"; + } + } + + class HeadersTimeoutError extends UndiciError { + constructor(message) { + super(message); + Error.captureStackTrace(this, HeadersTimeoutError); + this.name = "HeadersTimeoutError"; + this.message = message || "Headers Timeout Error"; + this.code = "UND_ERR_HEADERS_TIMEOUT"; + } + } + + class HeadersOverflowError extends UndiciError { + constructor(message) { + super(message); + Error.captureStackTrace(this, HeadersOverflowError); + this.name = "HeadersOverflowError"; + this.message = message || "Headers Overflow Error"; + this.code = "UND_ERR_HEADERS_OVERFLOW"; + } + } + + class BodyTimeoutError extends UndiciError { + constructor(message) { + super(message); + Error.captureStackTrace(this, BodyTimeoutError); + this.name = "BodyTimeoutError"; + this.message = message || "Body Timeout Error"; + this.code = "UND_ERR_BODY_TIMEOUT"; + } + } + + class ResponseStatusCodeError extends UndiciError { + constructor(message, statusCode, headers, body) { + super(message); + Error.captureStackTrace(this, ResponseStatusCodeError); + this.name = "ResponseStatusCodeError"; + this.message = message || "Response Status Code Error"; + this.code = "UND_ERR_RESPONSE_STATUS_CODE"; + this.body = body; + this.status = statusCode; + this.statusCode = statusCode; + this.headers = headers; + } + } + + class InvalidArgumentError extends UndiciError { + constructor(message) { + super(message); + Error.captureStackTrace(this, InvalidArgumentError); + this.name = "InvalidArgumentError"; + this.message = message || "Invalid Argument Error"; + this.code = "UND_ERR_INVALID_ARG"; + } + } + + class InvalidReturnValueError extends UndiciError { + constructor(message) { + super(message); + Error.captureStackTrace(this, InvalidReturnValueError); + this.name = "InvalidReturnValueError"; + this.message = message || "Invalid Return Value Error"; + this.code = "UND_ERR_INVALID_RETURN_VALUE"; + } + } + + class RequestAbortedError extends UndiciError { + constructor(message) { + super(message); + Error.captureStackTrace(this, RequestAbortedError); + this.name = "AbortError"; + this.message = message || "Request aborted"; + this.code = "UND_ERR_ABORTED"; + } + } + + class InformationalError extends UndiciError { + constructor(message) { + super(message); + Error.captureStackTrace(this, InformationalError); + this.name = "InformationalError"; + this.message = message || "Request information"; + this.code = "UND_ERR_INFO"; + } + } + + class RequestContentLengthMismatchError extends UndiciError { + constructor(message) { + super(message); + Error.captureStackTrace(this, RequestContentLengthMismatchError); + this.name = "RequestContentLengthMismatchError"; + this.message = message || "Request body length does not match content-length header"; + this.code = "UND_ERR_REQ_CONTENT_LENGTH_MISMATCH"; + } + } + + class ResponseContentLengthMismatchError extends UndiciError { + constructor(message) { + super(message); + Error.captureStackTrace(this, ResponseContentLengthMismatchError); + this.name = "ResponseContentLengthMismatchError"; + this.message = message || "Response body length does not match content-length header"; + this.code = "UND_ERR_RES_CONTENT_LENGTH_MISMATCH"; + } + } + + class ClientDestroyedError extends UndiciError { + constructor(message) { + super(message); + Error.captureStackTrace(this, ClientDestroyedError); + this.name = "ClientDestroyedError"; + this.message = message || "The client is destroyed"; + this.code = "UND_ERR_DESTROYED"; + } + } + + class ClientClosedError extends UndiciError { + constructor(message) { + super(message); + Error.captureStackTrace(this, ClientClosedError); + this.name = "ClientClosedError"; + this.message = message || "The client is closed"; + this.code = "UND_ERR_CLOSED"; + } + } + + class SocketError extends UndiciError { + constructor(message, socket) { + super(message); + Error.captureStackTrace(this, SocketError); + this.name = "SocketError"; + this.message = message || "Socket error"; + this.code = "UND_ERR_SOCKET"; + this.socket = socket; + } + } + + class NotSupportedError extends UndiciError { + constructor(message) { + super(message); + Error.captureStackTrace(this, NotSupportedError); + this.name = "NotSupportedError"; + this.message = message || "Not supported error"; + this.code = "UND_ERR_NOT_SUPPORTED"; + } + } + + class BalancedPoolMissingUpstreamError extends UndiciError { + constructor(message) { + super(message); + Error.captureStackTrace(this, NotSupportedError); + this.name = "MissingUpstreamError"; + this.message = message || "No upstream has been added to the BalancedPool"; + this.code = "UND_ERR_BPL_MISSING_UPSTREAM"; + } + } + + class HTTPParserError extends Error { + constructor(message, code, data) { + super(message); + Error.captureStackTrace(this, HTTPParserError); + this.name = "HTTPParserError"; + this.code = code ? `HPE_${code}` : undefined; + this.data = data ? data.toString() : undefined; + } + } + + class ResponseExceededMaxSizeError extends UndiciError { + constructor(message) { + super(message); + Error.captureStackTrace(this, ResponseExceededMaxSizeError); + this.name = "ResponseExceededMaxSizeError"; + this.message = message || "Response content exceeded max size"; + this.code = "UND_ERR_RES_EXCEEDED_MAX_SIZE"; + } + } + + class RequestRetryError extends UndiciError { + constructor(message, code, { headers, data }) { + super(message); + Error.captureStackTrace(this, RequestRetryError); + this.name = "RequestRetryError"; + this.message = message || "Request retry error"; + this.code = "UND_ERR_REQ_RETRY"; + this.statusCode = code; + this.data = data; + this.headers = headers; + } + } + module2.exports = { + HTTPParserError, + UndiciError, + HeadersTimeoutError, + HeadersOverflowError, + BodyTimeoutError, + RequestContentLengthMismatchError, + ConnectTimeoutError, + ResponseStatusCodeError, + InvalidArgumentError, + InvalidReturnValueError, + RequestAbortedError, + ClientDestroyedError, + ClientClosedError, + InformationalError, + SocketError, + NotSupportedError, + ResponseContentLengthMismatchError, + BalancedPoolMissingUpstreamError, + ResponseExceededMaxSizeError, + RequestRetryError + }; +}); + +// node_modules/undici/lib/core/constants.js +var require_constants = __commonJS((exports2, module2) => { + var headerNameLowerCasedRecord = {}; + var wellknownHeaderNames = [ + "Accept", + "Accept-Encoding", + "Accept-Language", + "Accept-Ranges", + "Access-Control-Allow-Credentials", + "Access-Control-Allow-Headers", + "Access-Control-Allow-Methods", + "Access-Control-Allow-Origin", + "Access-Control-Expose-Headers", + "Access-Control-Max-Age", + "Access-Control-Request-Headers", + "Access-Control-Request-Method", + "Age", + "Allow", + "Alt-Svc", + "Alt-Used", + "Authorization", + "Cache-Control", + "Clear-Site-Data", + "Connection", + "Content-Disposition", + "Content-Encoding", + "Content-Language", + "Content-Length", + "Content-Location", + "Content-Range", + "Content-Security-Policy", + "Content-Security-Policy-Report-Only", + "Content-Type", + "Cookie", + "Cross-Origin-Embedder-Policy", + "Cross-Origin-Opener-Policy", + "Cross-Origin-Resource-Policy", + "Date", + "Device-Memory", + "Downlink", + "ECT", + "ETag", + "Expect", + "Expect-CT", + "Expires", + "Forwarded", + "From", + "Host", + "If-Match", + "If-Modified-Since", + "If-None-Match", + "If-Range", + "If-Unmodified-Since", + "Keep-Alive", + "Last-Modified", + "Link", + "Location", + "Max-Forwards", + "Origin", + "Permissions-Policy", + "Pragma", + "Proxy-Authenticate", + "Proxy-Authorization", + "RTT", + "Range", + "Referer", + "Referrer-Policy", + "Refresh", + "Retry-After", + "Sec-WebSocket-Accept", + "Sec-WebSocket-Extensions", + "Sec-WebSocket-Key", + "Sec-WebSocket-Protocol", + "Sec-WebSocket-Version", + "Server", + "Server-Timing", + "Service-Worker-Allowed", + "Service-Worker-Navigation-Preload", + "Set-Cookie", + "SourceMap", + "Strict-Transport-Security", + "Supports-Loading-Mode", + "TE", + "Timing-Allow-Origin", + "Trailer", + "Transfer-Encoding", + "Upgrade", + "Upgrade-Insecure-Requests", + "User-Agent", + "Vary", + "Via", + "WWW-Authenticate", + "X-Content-Type-Options", + "X-DNS-Prefetch-Control", + "X-Frame-Options", + "X-Permitted-Cross-Domain-Policies", + "X-Powered-By", + "X-Requested-With", + "X-XSS-Protection" + ]; + for (let i = 0;i < wellknownHeaderNames.length; ++i) { + const key = wellknownHeaderNames[i]; + const lowerCasedKey = key.toLowerCase(); + headerNameLowerCasedRecord[key] = headerNameLowerCasedRecord[lowerCasedKey] = lowerCasedKey; + } + Object.setPrototypeOf(headerNameLowerCasedRecord, null); + module2.exports = { + wellknownHeaderNames, + headerNameLowerCasedRecord + }; +}); + +// node_modules/undici/lib/core/util.js +var require_util = __commonJS((exports2, module2) => { + var assert = require("assert"); + var { kDestroyed, kBodyUsed } = require_symbols(); + var { IncomingMessage } = require("http"); + var stream = require("stream"); + var net = require("net"); + var { InvalidArgumentError } = require_errors(); + var { Blob: Blob2 } = require("buffer"); + var nodeUtil = require("util"); + var { stringify } = require("querystring"); + var { headerNameLowerCasedRecord } = require_constants(); + var [nodeMajor, nodeMinor] = process.versions.node.split(".").map((v) => Number(v)); + function nop() { + } + function isStream(obj) { + return obj && typeof obj === "object" && typeof obj.pipe === "function" && typeof obj.on === "function"; + } + function isBlobLike(object) { + return Blob2 && object instanceof Blob2 || object && typeof object === "object" && (typeof object.stream === "function" || typeof object.arrayBuffer === "function") && /^(Blob|File)$/.test(object[Symbol.toStringTag]); + } + function buildURL(url, queryParams) { + if (url.includes("?") || url.includes("#")) { + throw new Error('Query params cannot be passed when url already contains "?" or "#".'); + } + const stringified = stringify(queryParams); + if (stringified) { + url += "?" + stringified; + } + return url; + } + function parseURL(url) { + if (typeof url === "string") { + url = new URL(url); + if (!/^https?:/.test(url.origin || url.protocol)) { + throw new InvalidArgumentError("Invalid URL protocol: the URL must start with `http:` or `https:`."); + } + return url; + } + if (!url || typeof url !== "object") { + throw new InvalidArgumentError("Invalid URL: The URL argument must be a non-null object."); + } + if (!/^https?:/.test(url.origin || url.protocol)) { + throw new InvalidArgumentError("Invalid URL protocol: the URL must start with `http:` or `https:`."); + } + if (!(url instanceof URL)) { + if (url.port != null && url.port !== "" && !Number.isFinite(parseInt(url.port))) { + throw new InvalidArgumentError("Invalid URL: port must be a valid integer or a string representation of an integer."); + } + if (url.path != null && typeof url.path !== "string") { + throw new InvalidArgumentError("Invalid URL path: the path must be a string or null/undefined."); + } + if (url.pathname != null && typeof url.pathname !== "string") { + throw new InvalidArgumentError("Invalid URL pathname: the pathname must be a string or null/undefined."); + } + if (url.hostname != null && typeof url.hostname !== "string") { + throw new InvalidArgumentError("Invalid URL hostname: the hostname must be a string or null/undefined."); + } + if (url.origin != null && typeof url.origin !== "string") { + throw new InvalidArgumentError("Invalid URL origin: the origin must be a string or null/undefined."); + } + const port = url.port != null ? url.port : url.protocol === "https:" ? 443 : 80; + let origin = url.origin != null ? url.origin : `${url.protocol}//${url.hostname}:${port}`; + let path = url.path != null ? url.path : `${url.pathname || ""}${url.search || ""}`; + if (origin.endsWith("/")) { + origin = origin.substring(0, origin.length - 1); + } + if (path && !path.startsWith("/")) { + path = `/${path}`; + } + url = new URL(origin + path); + } + return url; + } + function parseOrigin(url) { + url = parseURL(url); + if (url.pathname !== "/" || url.search || url.hash) { + throw new InvalidArgumentError("invalid url"); + } + return url; + } + function getHostname(host) { + if (host[0] === "[") { + const idx2 = host.indexOf("]"); + assert(idx2 !== -1); + return host.substring(1, idx2); + } + const idx = host.indexOf(":"); + if (idx === -1) + return host; + return host.substring(0, idx); + } + function getServerName(host) { + if (!host) { + return null; + } + assert.strictEqual(typeof host, "string"); + const servername = getHostname(host); + if (net.isIP(servername)) { + return ""; + } + return servername; + } + function deepClone(obj) { + return JSON.parse(JSON.stringify(obj)); + } + function isAsyncIterable(obj) { + return !!(obj != null && typeof obj[Symbol.asyncIterator] === "function"); + } + function isIterable(obj) { + return !!(obj != null && (typeof obj[Symbol.iterator] === "function" || typeof obj[Symbol.asyncIterator] === "function")); + } + function bodyLength(body) { + if (body == null) { + return 0; + } else if (isStream(body)) { + const state = body._readableState; + return state && state.objectMode === false && state.ended === true && Number.isFinite(state.length) ? state.length : null; + } else if (isBlobLike(body)) { + return body.size != null ? body.size : null; + } else if (isBuffer(body)) { + return body.byteLength; + } + return null; + } + function isDestroyed(stream2) { + return !stream2 || !!(stream2.destroyed || stream2[kDestroyed]); + } + function isReadableAborted(stream2) { + const state = stream2 && stream2._readableState; + return isDestroyed(stream2) && state && !state.endEmitted; + } + function destroy(stream2, err) { + if (stream2 == null || !isStream(stream2) || isDestroyed(stream2)) { + return; + } + if (typeof stream2.destroy === "function") { + if (Object.getPrototypeOf(stream2).constructor === IncomingMessage) { + stream2.socket = null; + } + stream2.destroy(err); + } else if (err) { + process.nextTick((stream3, err2) => { + stream3.emit("error", err2); + }, stream2, err); + } + if (stream2.destroyed !== true) { + stream2[kDestroyed] = true; + } + } + var KEEPALIVE_TIMEOUT_EXPR = /timeout=(\d+)/; + function parseKeepAliveTimeout(val2) { + const m = val2.toString().match(KEEPALIVE_TIMEOUT_EXPR); + return m ? parseInt(m[1], 10) * 1000 : null; + } + function headerNameToString(value) { + return headerNameLowerCasedRecord[value] || value.toLowerCase(); + } + function parseHeaders(headers, obj = {}) { + if (!Array.isArray(headers)) + return headers; + for (let i = 0;i < headers.length; i += 2) { + const key = headers[i].toString().toLowerCase(); + let val2 = obj[key]; + if (!val2) { + if (Array.isArray(headers[i + 1])) { + obj[key] = headers[i + 1].map((x) => x.toString("utf8")); + } else { + obj[key] = headers[i + 1].toString("utf8"); + } + } else { + if (!Array.isArray(val2)) { + val2 = [val2]; + obj[key] = val2; + } + val2.push(headers[i + 1].toString("utf8")); + } + } + if ("content-length" in obj && "content-disposition" in obj) { + obj["content-disposition"] = Buffer.from(obj["content-disposition"]).toString("latin1"); + } + return obj; + } + function parseRawHeaders(headers) { + const ret = []; + let hasContentLength = false; + let contentDispositionIdx = -1; + for (let n = 0;n < headers.length; n += 2) { + const key = headers[n + 0].toString(); + const val2 = headers[n + 1].toString("utf8"); + if (key.length === 14 && (key === "content-length" || key.toLowerCase() === "content-length")) { + ret.push(key, val2); + hasContentLength = true; + } else if (key.length === 19 && (key === "content-disposition" || key.toLowerCase() === "content-disposition")) { + contentDispositionIdx = ret.push(key, val2) - 1; + } else { + ret.push(key, val2); + } + } + if (hasContentLength && contentDispositionIdx !== -1) { + ret[contentDispositionIdx] = Buffer.from(ret[contentDispositionIdx]).toString("latin1"); + } + return ret; + } + function isBuffer(buffer) { + return buffer instanceof Uint8Array || Buffer.isBuffer(buffer); + } + function validateHandler(handler, method, upgrade) { + if (!handler || typeof handler !== "object") { + throw new InvalidArgumentError("handler must be an object"); + } + if (typeof handler.onConnect !== "function") { + throw new InvalidArgumentError("invalid onConnect method"); + } + if (typeof handler.onError !== "function") { + throw new InvalidArgumentError("invalid onError method"); + } + if (typeof handler.onBodySent !== "function" && handler.onBodySent !== undefined) { + throw new InvalidArgumentError("invalid onBodySent method"); + } + if (upgrade || method === "CONNECT") { + if (typeof handler.onUpgrade !== "function") { + throw new InvalidArgumentError("invalid onUpgrade method"); + } + } else { + if (typeof handler.onHeaders !== "function") { + throw new InvalidArgumentError("invalid onHeaders method"); + } + if (typeof handler.onData !== "function") { + throw new InvalidArgumentError("invalid onData method"); + } + if (typeof handler.onComplete !== "function") { + throw new InvalidArgumentError("invalid onComplete method"); + } + } + } + function isDisturbed(body) { + return !!(body && (stream.isDisturbed ? stream.isDisturbed(body) || body[kBodyUsed] : body[kBodyUsed] || body.readableDidRead || body._readableState && body._readableState.dataEmitted || isReadableAborted(body))); + } + function isErrored(body) { + return !!(body && (stream.isErrored ? stream.isErrored(body) : /state: 'errored'/.test(nodeUtil.inspect(body)))); + } + function isReadable(body) { + return !!(body && (stream.isReadable ? stream.isReadable(body) : /state: 'readable'/.test(nodeUtil.inspect(body)))); + } + function getSocketInfo(socket) { + return { + localAddress: socket.localAddress, + localPort: socket.localPort, + remoteAddress: socket.remoteAddress, + remotePort: socket.remotePort, + remoteFamily: socket.remoteFamily, + timeout: socket.timeout, + bytesWritten: socket.bytesWritten, + bytesRead: socket.bytesRead + }; + } + async function* convertIterableToBuffer(iterable) { + for await (const chunk of iterable) { + yield Buffer.isBuffer(chunk) ? chunk : Buffer.from(chunk); + } + } + var ReadableStream2; + function ReadableStreamFrom(iterable) { + if (!ReadableStream2) { + ReadableStream2 = require("stream/web").ReadableStream; + } + if (ReadableStream2.from) { + return ReadableStream2.from(convertIterableToBuffer(iterable)); + } + let iterator; + return new ReadableStream2({ + async start() { + iterator = iterable[Symbol.asyncIterator](); + }, + async pull(controller) { + const { done, value } = await iterator.next(); + if (done) { + queueMicrotask(() => { + controller.close(); + }); + } else { + const buf = Buffer.isBuffer(value) ? value : Buffer.from(value); + controller.enqueue(new Uint8Array(buf)); + } + return controller.desiredSize > 0; + }, + async cancel(reason) { + await iterator.return(); + } + }, 0); + } + function isFormDataLike(object) { + return object && typeof object === "object" && typeof object.append === "function" && typeof object.delete === "function" && typeof object.get === "function" && typeof object.getAll === "function" && typeof object.has === "function" && typeof object.set === "function" && object[Symbol.toStringTag] === "FormData"; + } + function throwIfAborted(signal) { + if (!signal) { + return; + } + if (typeof signal.throwIfAborted === "function") { + signal.throwIfAborted(); + } else { + if (signal.aborted) { + const err = new Error("The operation was aborted"); + err.name = "AbortError"; + throw err; + } + } + } + function addAbortListener(signal, listener) { + if ("addEventListener" in signal) { + signal.addEventListener("abort", listener, { once: true }); + return () => signal.removeEventListener("abort", listener); + } + signal.addListener("abort", listener); + return () => signal.removeListener("abort", listener); + } + var hasToWellFormed = !!String.prototype.toWellFormed; + function toUSVString(val2) { + if (hasToWellFormed) { + return `${val2}`.toWellFormed(); + } else if (nodeUtil.toUSVString) { + return nodeUtil.toUSVString(val2); + } + return `${val2}`; + } + function parseRangeHeader(range) { + if (range == null || range === "") + return { start: 0, end: null, size: null }; + const m = range ? range.match(/^bytes (\d+)-(\d+)\/(\d+)?$/) : null; + return m ? { + start: parseInt(m[1]), + end: m[2] ? parseInt(m[2]) : null, + size: m[3] ? parseInt(m[3]) : null + } : null; + } + var kEnumerableProperty = Object.create(null); + kEnumerableProperty.enumerable = true; + module2.exports = { + kEnumerableProperty, + nop, + isDisturbed, + isErrored, + isReadable, + toUSVString, + isReadableAborted, + isBlobLike, + parseOrigin, + parseURL, + getServerName, + isStream, + isIterable, + isAsyncIterable, + isDestroyed, + headerNameToString, + parseRawHeaders, + parseHeaders, + parseKeepAliveTimeout, + destroy, + bodyLength, + deepClone, + ReadableStreamFrom, + isBuffer, + validateHandler, + getSocketInfo, + isFormDataLike, + buildURL, + throwIfAborted, + addAbortListener, + parseRangeHeader, + nodeMajor, + nodeMinor, + nodeHasAutoSelectFamily: nodeMajor > 18 || nodeMajor === 18 && nodeMinor >= 13, + safeHTTPMethods: ["GET", "HEAD", "OPTIONS", "TRACE"] + }; +}); + +// node_modules/undici/lib/timers.js +var require_timers = __commonJS((exports2, module2) => { + var fastNow = Date.now(); + var fastNowTimeout; + var fastTimers = []; + function onTimeout() { + fastNow = Date.now(); + let len = fastTimers.length; + let idx = 0; + while (idx < len) { + const timer = fastTimers[idx]; + if (timer.state === 0) { + timer.state = fastNow + timer.delay; + } else if (timer.state > 0 && fastNow >= timer.state) { + timer.state = -1; + timer.callback(timer.opaque); + } + if (timer.state === -1) { + timer.state = -2; + if (idx !== len - 1) { + fastTimers[idx] = fastTimers.pop(); + } else { + fastTimers.pop(); + } + len -= 1; + } else { + idx += 1; + } + } + if (fastTimers.length > 0) { + refreshTimeout(); + } + } + function refreshTimeout() { + if (fastNowTimeout && fastNowTimeout.refresh) { + fastNowTimeout.refresh(); + } else { + clearTimeout(fastNowTimeout); + fastNowTimeout = setTimeout(onTimeout, 1000); + if (fastNowTimeout.unref) { + fastNowTimeout.unref(); + } + } + } + + class Timeout { + constructor(callback, delay, opaque) { + this.callback = callback; + this.delay = delay; + this.opaque = opaque; + this.state = -2; + this.refresh(); + } + refresh() { + if (this.state === -2) { + fastTimers.push(this); + if (!fastNowTimeout || fastTimers.length === 1) { + refreshTimeout(); + } + } + this.state = 0; + } + clear() { + this.state = -1; + } + } + module2.exports = { + setTimeout(callback, delay, opaque) { + return delay < 1000 ? setTimeout(callback, delay, opaque) : new Timeout(callback, delay, opaque); + }, + clearTimeout(timeout) { + if (timeout instanceof Timeout) { + timeout.clear(); + } else { + clearTimeout(timeout); + } + } + }; +}); + +// node_modules/@fastify/busboy/deps/streamsearch/sbmh.js +var require_sbmh = __commonJS((exports2, module2) => { + var EventEmitter = require("node:events").EventEmitter; + var inherits = require("node:util").inherits; + function SBMH(needle) { + if (typeof needle === "string") { + needle = Buffer.from(needle); + } + if (!Buffer.isBuffer(needle)) { + throw new TypeError("The needle has to be a String or a Buffer."); + } + const needleLength = needle.length; + if (needleLength === 0) { + throw new Error("The needle cannot be an empty String/Buffer."); + } + if (needleLength > 256) { + throw new Error("The needle cannot have a length bigger than 256."); + } + this.maxMatches = Infinity; + this.matches = 0; + this._occ = new Array(256).fill(needleLength); + this._lookbehind_size = 0; + this._needle = needle; + this._bufpos = 0; + this._lookbehind = Buffer.alloc(needleLength); + for (var i = 0;i < needleLength - 1; ++i) { + this._occ[needle[i]] = needleLength - 1 - i; + } + } + inherits(SBMH, EventEmitter); + SBMH.prototype.reset = function() { + this._lookbehind_size = 0; + this.matches = 0; + this._bufpos = 0; + }; + SBMH.prototype.push = function(chunk, pos) { + if (!Buffer.isBuffer(chunk)) { + chunk = Buffer.from(chunk, "binary"); + } + const chlen = chunk.length; + this._bufpos = pos || 0; + let r; + while (r !== chlen && this.matches < this.maxMatches) { + r = this._sbmh_feed(chunk); + } + return r; + }; + SBMH.prototype._sbmh_feed = function(data) { + const len = data.length; + const needle = this._needle; + const needleLength = needle.length; + const lastNeedleChar = needle[needleLength - 1]; + let pos = -this._lookbehind_size; + let ch; + if (pos < 0) { + while (pos < 0 && pos <= len - needleLength) { + ch = this._sbmh_lookup_char(data, pos + needleLength - 1); + if (ch === lastNeedleChar && this._sbmh_memcmp(data, pos, needleLength - 1)) { + this._lookbehind_size = 0; + ++this.matches; + this.emit("info", true); + return this._bufpos = pos + needleLength; + } + pos += this._occ[ch]; + } + if (pos < 0) { + while (pos < 0 && !this._sbmh_memcmp(data, pos, len - pos)) { + ++pos; + } + } + if (pos >= 0) { + this.emit("info", false, this._lookbehind, 0, this._lookbehind_size); + this._lookbehind_size = 0; + } else { + const bytesToCutOff = this._lookbehind_size + pos; + if (bytesToCutOff > 0) { + this.emit("info", false, this._lookbehind, 0, bytesToCutOff); + } + this._lookbehind.copy(this._lookbehind, 0, bytesToCutOff, this._lookbehind_size - bytesToCutOff); + this._lookbehind_size -= bytesToCutOff; + data.copy(this._lookbehind, this._lookbehind_size); + this._lookbehind_size += len; + this._bufpos = len; + return len; + } + } + pos += (pos >= 0) * this._bufpos; + if (data.indexOf(needle, pos) !== -1) { + pos = data.indexOf(needle, pos); + ++this.matches; + if (pos > 0) { + this.emit("info", true, data, this._bufpos, pos); + } else { + this.emit("info", true); + } + return this._bufpos = pos + needleLength; + } else { + pos = len - needleLength; + } + while (pos < len && (data[pos] !== needle[0] || Buffer.compare(data.subarray(pos, pos + len - pos), needle.subarray(0, len - pos)) !== 0)) { + ++pos; + } + if (pos < len) { + data.copy(this._lookbehind, 0, pos, pos + (len - pos)); + this._lookbehind_size = len - pos; + } + if (pos > 0) { + this.emit("info", false, data, this._bufpos, pos < len ? pos : len); + } + this._bufpos = len; + return len; + }; + SBMH.prototype._sbmh_lookup_char = function(data, pos) { + return pos < 0 ? this._lookbehind[this._lookbehind_size + pos] : data[pos]; + }; + SBMH.prototype._sbmh_memcmp = function(data, pos, len) { + for (var i = 0;i < len; ++i) { + if (this._sbmh_lookup_char(data, pos + i) !== this._needle[i]) { + return false; + } + } + return true; + }; + module2.exports = SBMH; +}); + +// node_modules/@fastify/busboy/deps/dicer/lib/PartStream.js +var require_PartStream = __commonJS((exports2, module2) => { + var inherits = require("node:util").inherits; + var ReadableStream2 = require("node:stream").Readable; + function PartStream(opts) { + ReadableStream2.call(this, opts); + } + inherits(PartStream, ReadableStream2); + PartStream.prototype._read = function(n) { + }; + module2.exports = PartStream; +}); + +// node_modules/@fastify/busboy/lib/utils/getLimit.js +var require_getLimit = __commonJS((exports2, module2) => { + module2.exports = function getLimit(limits, name, defaultLimit) { + if (!limits || limits[name] === undefined || limits[name] === null) { + return defaultLimit; + } + if (typeof limits[name] !== "number" || isNaN(limits[name])) { + throw new TypeError("Limit " + name + " is not a valid number"); + } + return limits[name]; + }; +}); + +// node_modules/@fastify/busboy/deps/dicer/lib/HeaderParser.js +var require_HeaderParser = __commonJS((exports2, module2) => { + var EventEmitter = require("node:events").EventEmitter; + var inherits = require("node:util").inherits; + var getLimit = require_getLimit(); + var StreamSearch = require_sbmh(); + var B_DCRLF = Buffer.from("\r\n\r\n"); + var RE_CRLF = /\r\n/g; + var RE_HDR = /^([^:]+):[ \t]?([\x00-\xFF]+)?$/; + function HeaderParser(cfg) { + EventEmitter.call(this); + cfg = cfg || {}; + const self2 = this; + this.nread = 0; + this.maxed = false; + this.npairs = 0; + this.maxHeaderPairs = getLimit(cfg, "maxHeaderPairs", 2000); + this.maxHeaderSize = getLimit(cfg, "maxHeaderSize", 80 * 1024); + this.buffer = ""; + this.header = {}; + this.finished = false; + this.ss = new StreamSearch(B_DCRLF); + this.ss.on("info", function(isMatch, data, start, end) { + if (data && !self2.maxed) { + if (self2.nread + end - start >= self2.maxHeaderSize) { + end = self2.maxHeaderSize - self2.nread + start; + self2.nread = self2.maxHeaderSize; + self2.maxed = true; + } else { + self2.nread += end - start; + } + self2.buffer += data.toString("binary", start, end); + } + if (isMatch) { + self2._finish(); + } + }); + } + inherits(HeaderParser, EventEmitter); + HeaderParser.prototype.push = function(data) { + const r = this.ss.push(data); + if (this.finished) { + return r; + } + }; + HeaderParser.prototype.reset = function() { + this.finished = false; + this.buffer = ""; + this.header = {}; + this.ss.reset(); + }; + HeaderParser.prototype._finish = function() { + if (this.buffer) { + this._parseHeader(); + } + this.ss.matches = this.ss.maxMatches; + const header = this.header; + this.header = {}; + this.buffer = ""; + this.finished = true; + this.nread = this.npairs = 0; + this.maxed = false; + this.emit("header", header); + }; + HeaderParser.prototype._parseHeader = function() { + if (this.npairs === this.maxHeaderPairs) { + return; + } + const lines = this.buffer.split(RE_CRLF); + const len = lines.length; + let m, h; + for (var i = 0;i < len; ++i) { + if (lines[i].length === 0) { + continue; + } + if (lines[i][0] === "\t" || lines[i][0] === " ") { + if (h) { + this.header[h][this.header[h].length - 1] += lines[i]; + continue; + } + } + const posColon = lines[i].indexOf(":"); + if (posColon === -1 || posColon === 0) { + return; + } + m = RE_HDR.exec(lines[i]); + h = m[1].toLowerCase(); + this.header[h] = this.header[h] || []; + this.header[h].push(m[2] || ""); + if (++this.npairs === this.maxHeaderPairs) { + break; + } + } + }; + module2.exports = HeaderParser; +}); + +// node_modules/@fastify/busboy/deps/dicer/lib/Dicer.js +var require_Dicer = __commonJS((exports2, module2) => { + var WritableStream = require("node:stream").Writable; + var inherits = require("node:util").inherits; + var StreamSearch = require_sbmh(); + var PartStream = require_PartStream(); + var HeaderParser = require_HeaderParser(); + var DASH = 45; + var B_ONEDASH = Buffer.from("-"); + var B_CRLF = Buffer.from("\r\n"); + var EMPTY_FN = function() { + }; + function Dicer(cfg) { + if (!(this instanceof Dicer)) { + return new Dicer(cfg); + } + WritableStream.call(this, cfg); + if (!cfg || !cfg.headerFirst && typeof cfg.boundary !== "string") { + throw new TypeError("Boundary required"); + } + if (typeof cfg.boundary === "string") { + this.setBoundary(cfg.boundary); + } else { + this._bparser = undefined; + } + this._headerFirst = cfg.headerFirst; + this._dashes = 0; + this._parts = 0; + this._finished = false; + this._realFinish = false; + this._isPreamble = true; + this._justMatched = false; + this._firstWrite = true; + this._inHeader = true; + this._part = undefined; + this._cb = undefined; + this._ignoreData = false; + this._partOpts = { highWaterMark: cfg.partHwm }; + this._pause = false; + const self2 = this; + this._hparser = new HeaderParser(cfg); + this._hparser.on("header", function(header) { + self2._inHeader = false; + self2._part.emit("header", header); + }); + } + inherits(Dicer, WritableStream); + Dicer.prototype.emit = function(ev) { + if (ev === "finish" && !this._realFinish) { + if (!this._finished) { + const self2 = this; + process.nextTick(function() { + self2.emit("error", new Error("Unexpected end of multipart data")); + if (self2._part && !self2._ignoreData) { + const type = self2._isPreamble ? "Preamble" : "Part"; + self2._part.emit("error", new Error(type + " terminated early due to unexpected end of multipart data")); + self2._part.push(null); + process.nextTick(function() { + self2._realFinish = true; + self2.emit("finish"); + self2._realFinish = false; + }); + return; + } + self2._realFinish = true; + self2.emit("finish"); + self2._realFinish = false; + }); + } + } else { + WritableStream.prototype.emit.apply(this, arguments); + } + }; + Dicer.prototype._write = function(data, encoding, cb) { + if (!this._hparser && !this._bparser) { + return cb(); + } + if (this._headerFirst && this._isPreamble) { + if (!this._part) { + this._part = new PartStream(this._partOpts); + if (this.listenerCount("preamble") !== 0) { + this.emit("preamble", this._part); + } else { + this._ignore(); + } + } + const r = this._hparser.push(data); + if (!this._inHeader && r !== undefined && r < data.length) { + data = data.slice(r); + } else { + return cb(); + } + } + if (this._firstWrite) { + this._bparser.push(B_CRLF); + this._firstWrite = false; + } + this._bparser.push(data); + if (this._pause) { + this._cb = cb; + } else { + cb(); + } + }; + Dicer.prototype.reset = function() { + this._part = undefined; + this._bparser = undefined; + this._hparser = undefined; + }; + Dicer.prototype.setBoundary = function(boundary) { + const self2 = this; + this._bparser = new StreamSearch("\r\n--" + boundary); + this._bparser.on("info", function(isMatch, data, start, end) { + self2._oninfo(isMatch, data, start, end); + }); + }; + Dicer.prototype._ignore = function() { + if (this._part && !this._ignoreData) { + this._ignoreData = true; + this._part.on("error", EMPTY_FN); + this._part.resume(); + } + }; + Dicer.prototype._oninfo = function(isMatch, data, start, end) { + let buf; + const self2 = this; + let i = 0; + let r; + let shouldWriteMore = true; + if (!this._part && this._justMatched && data) { + while (this._dashes < 2 && start + i < end) { + if (data[start + i] === DASH) { + ++i; + ++this._dashes; + } else { + if (this._dashes) { + buf = B_ONEDASH; + } + this._dashes = 0; + break; + } + } + if (this._dashes === 2) { + if (start + i < end && this.listenerCount("trailer") !== 0) { + this.emit("trailer", data.slice(start + i, end)); + } + this.reset(); + this._finished = true; + if (self2._parts === 0) { + self2._realFinish = true; + self2.emit("finish"); + self2._realFinish = false; + } + } + if (this._dashes) { + return; + } + } + if (this._justMatched) { + this._justMatched = false; + } + if (!this._part) { + this._part = new PartStream(this._partOpts); + this._part._read = function(n) { + self2._unpause(); + }; + if (this._isPreamble && this.listenerCount("preamble") !== 0) { + this.emit("preamble", this._part); + } else if (this._isPreamble !== true && this.listenerCount("part") !== 0) { + this.emit("part", this._part); + } else { + this._ignore(); + } + if (!this._isPreamble) { + this._inHeader = true; + } + } + if (data && start < end && !this._ignoreData) { + if (this._isPreamble || !this._inHeader) { + if (buf) { + shouldWriteMore = this._part.push(buf); + } + shouldWriteMore = this._part.push(data.slice(start, end)); + if (!shouldWriteMore) { + this._pause = true; + } + } else if (!this._isPreamble && this._inHeader) { + if (buf) { + this._hparser.push(buf); + } + r = this._hparser.push(data.slice(start, end)); + if (!this._inHeader && r !== undefined && r < end) { + this._oninfo(false, data, start + r, end); + } + } + } + if (isMatch) { + this._hparser.reset(); + if (this._isPreamble) { + this._isPreamble = false; + } else { + if (start !== end) { + ++this._parts; + this._part.on("end", function() { + if (--self2._parts === 0) { + if (self2._finished) { + self2._realFinish = true; + self2.emit("finish"); + self2._realFinish = false; + } else { + self2._unpause(); + } + } + }); + } + } + this._part.push(null); + this._part = undefined; + this._ignoreData = false; + this._justMatched = true; + this._dashes = 0; + } + }; + Dicer.prototype._unpause = function() { + if (!this._pause) { + return; + } + this._pause = false; + if (this._cb) { + const cb = this._cb; + this._cb = undefined; + cb(); + } + }; + module2.exports = Dicer; +}); + +// node_modules/@fastify/busboy/lib/utils/decodeText.js +var require_decodeText = __commonJS((exports2, module2) => { + var utf8Decoder = new TextDecoder("utf-8"); + var textDecoders = new Map([ + ["utf-8", utf8Decoder], + ["utf8", utf8Decoder] + ]); + function getDecoder(charset) { + let lc; + while (true) { + switch (charset) { + case "utf-8": + case "utf8": + return decoders.utf8; + case "latin1": + case "ascii": + case "us-ascii": + case "iso-8859-1": + case "iso8859-1": + case "iso88591": + case "iso_8859-1": + case "windows-1252": + case "iso_8859-1:1987": + case "cp1252": + case "x-cp1252": + return decoders.latin1; + case "utf16le": + case "utf-16le": + case "ucs2": + case "ucs-2": + return decoders.utf16le; + case "base64": + return decoders.base64; + default: + if (lc === undefined) { + lc = true; + charset = charset.toLowerCase(); + continue; + } + return decoders.other.bind(charset); + } + } + } + var decoders = { + utf8: (data, sourceEncoding) => { + if (data.length === 0) { + return ""; + } + if (typeof data === "string") { + data = Buffer.from(data, sourceEncoding); + } + return data.utf8Slice(0, data.length); + }, + latin1: (data, sourceEncoding) => { + if (data.length === 0) { + return ""; + } + if (typeof data === "string") { + return data; + } + return data.latin1Slice(0, data.length); + }, + utf16le: (data, sourceEncoding) => { + if (data.length === 0) { + return ""; + } + if (typeof data === "string") { + data = Buffer.from(data, sourceEncoding); + } + return data.ucs2Slice(0, data.length); + }, + base64: (data, sourceEncoding) => { + if (data.length === 0) { + return ""; + } + if (typeof data === "string") { + data = Buffer.from(data, sourceEncoding); + } + return data.base64Slice(0, data.length); + }, + other: (data, sourceEncoding) => { + if (data.length === 0) { + return ""; + } + if (typeof data === "string") { + data = Buffer.from(data, sourceEncoding); + } + if (textDecoders.has(exports2.toString())) { + try { + return textDecoders.get(exports2).decode(data); + } catch { + } + } + return typeof data === "string" ? data : data.toString(); + } + }; + function decodeText(text, sourceEncoding, destEncoding) { + if (text) { + return getDecoder(destEncoding)(text, sourceEncoding); + } + return text; + } + module2.exports = decodeText; +}); + +// node_modules/@fastify/busboy/lib/utils/parseParams.js +var require_parseParams = __commonJS((exports2, module2) => { + var decodeText = require_decodeText(); + var RE_ENCODED = /%[a-fA-F0-9][a-fA-F0-9]/g; + var EncodedLookup = { + "%00": "\0", + "%01": "\x01", + "%02": "\x02", + "%03": "\x03", + "%04": "\x04", + "%05": "\x05", + "%06": "\x06", + "%07": "\x07", + "%08": "\b", + "%09": "\t", + "%0a": ` +`, + "%0A": ` +`, + "%0b": "\v", + "%0B": "\v", + "%0c": "\f", + "%0C": "\f", + "%0d": `\r`, + "%0D": `\r`, + "%0e": "\x0E", + "%0E": "\x0E", + "%0f": "\x0F", + "%0F": "\x0F", + "%10": "\x10", + "%11": "\x11", + "%12": "\x12", + "%13": "\x13", + "%14": "\x14", + "%15": "\x15", + "%16": "\x16", + "%17": "\x17", + "%18": "\x18", + "%19": "\x19", + "%1a": "\x1A", + "%1A": "\x1A", + "%1b": "\x1B", + "%1B": "\x1B", + "%1c": "\x1C", + "%1C": "\x1C", + "%1d": "\x1D", + "%1D": "\x1D", + "%1e": "\x1E", + "%1E": "\x1E", + "%1f": "\x1F", + "%1F": "\x1F", + "%20": " ", + "%21": "!", + "%22": '"', + "%23": "#", + "%24": "$", + "%25": "%", + "%26": "&", + "%27": "'", + "%28": "(", + "%29": ")", + "%2a": "*", + "%2A": "*", + "%2b": "+", + "%2B": "+", + "%2c": ",", + "%2C": ",", + "%2d": "-", + "%2D": "-", + "%2e": ".", + "%2E": ".", + "%2f": "/", + "%2F": "/", + "%30": "0", + "%31": "1", + "%32": "2", + "%33": "3", + "%34": "4", + "%35": "5", + "%36": "6", + "%37": "7", + "%38": "8", + "%39": "9", + "%3a": ":", + "%3A": ":", + "%3b": ";", + "%3B": ";", + "%3c": "<", + "%3C": "<", + "%3d": "=", + "%3D": "=", + "%3e": ">", + "%3E": ">", + "%3f": "?", + "%3F": "?", + "%40": "@", + "%41": "A", + "%42": "B", + "%43": "C", + "%44": "D", + "%45": "E", + "%46": "F", + "%47": "G", + "%48": "H", + "%49": "I", + "%4a": "J", + "%4A": "J", + "%4b": "K", + "%4B": "K", + "%4c": "L", + "%4C": "L", + "%4d": "M", + "%4D": "M", + "%4e": "N", + "%4E": "N", + "%4f": "O", + "%4F": "O", + "%50": "P", + "%51": "Q", + "%52": "R", + "%53": "S", + "%54": "T", + "%55": "U", + "%56": "V", + "%57": "W", + "%58": "X", + "%59": "Y", + "%5a": "Z", + "%5A": "Z", + "%5b": "[", + "%5B": "[", + "%5c": "\\", + "%5C": "\\", + "%5d": "]", + "%5D": "]", + "%5e": "^", + "%5E": "^", + "%5f": "_", + "%5F": "_", + "%60": "`", + "%61": "a", + "%62": "b", + "%63": "c", + "%64": "d", + "%65": "e", + "%66": "f", + "%67": "g", + "%68": "h", + "%69": "i", + "%6a": "j", + "%6A": "j", + "%6b": "k", + "%6B": "k", + "%6c": "l", + "%6C": "l", + "%6d": "m", + "%6D": "m", + "%6e": "n", + "%6E": "n", + "%6f": "o", + "%6F": "o", + "%70": "p", + "%71": "q", + "%72": "r", + "%73": "s", + "%74": "t", + "%75": "u", + "%76": "v", + "%77": "w", + "%78": "x", + "%79": "y", + "%7a": "z", + "%7A": "z", + "%7b": "{", + "%7B": "{", + "%7c": "|", + "%7C": "|", + "%7d": "}", + "%7D": "}", + "%7e": "~", + "%7E": "~", + "%7f": "\x7F", + "%7F": "\x7F", + "%80": "\x80", + "%81": "\x81", + "%82": "\x82", + "%83": "\x83", + "%84": "\x84", + "%85": "\x85", + "%86": "\x86", + "%87": "\x87", + "%88": "\x88", + "%89": "\x89", + "%8a": "\x8A", + "%8A": "\x8A", + "%8b": "\x8B", + "%8B": "\x8B", + "%8c": "\x8C", + "%8C": "\x8C", + "%8d": "\x8D", + "%8D": "\x8D", + "%8e": "\x8E", + "%8E": "\x8E", + "%8f": "\x8F", + "%8F": "\x8F", + "%90": "\x90", + "%91": "\x91", + "%92": "\x92", + "%93": "\x93", + "%94": "\x94", + "%95": "\x95", + "%96": "\x96", + "%97": "\x97", + "%98": "\x98", + "%99": "\x99", + "%9a": "\x9A", + "%9A": "\x9A", + "%9b": "\x9B", + "%9B": "\x9B", + "%9c": "\x9C", + "%9C": "\x9C", + "%9d": "\x9D", + "%9D": "\x9D", + "%9e": "\x9E", + "%9E": "\x9E", + "%9f": "\x9F", + "%9F": "\x9F", + "%a0": "\xA0", + "%A0": "\xA0", + "%a1": "\xA1", + "%A1": "\xA1", + "%a2": "\xA2", + "%A2": "\xA2", + "%a3": "\xA3", + "%A3": "\xA3", + "%a4": "\xA4", + "%A4": "\xA4", + "%a5": "\xA5", + "%A5": "\xA5", + "%a6": "\xA6", + "%A6": "\xA6", + "%a7": "\xA7", + "%A7": "\xA7", + "%a8": "\xA8", + "%A8": "\xA8", + "%a9": "\xA9", + "%A9": "\xA9", + "%aa": "\xAA", + "%Aa": "\xAA", + "%aA": "\xAA", + "%AA": "\xAA", + "%ab": "\xAB", + "%Ab": "\xAB", + "%aB": "\xAB", + "%AB": "\xAB", + "%ac": "\xAC", + "%Ac": "\xAC", + "%aC": "\xAC", + "%AC": "\xAC", + "%ad": "\xAD", + "%Ad": "\xAD", + "%aD": "\xAD", + "%AD": "\xAD", + "%ae": "\xAE", + "%Ae": "\xAE", + "%aE": "\xAE", + "%AE": "\xAE", + "%af": "\xAF", + "%Af": "\xAF", + "%aF": "\xAF", + "%AF": "\xAF", + "%b0": "\xB0", + "%B0": "\xB0", + "%b1": "\xB1", + "%B1": "\xB1", + "%b2": "\xB2", + "%B2": "\xB2", + "%b3": "\xB3", + "%B3": "\xB3", + "%b4": "\xB4", + "%B4": "\xB4", + "%b5": "\xB5", + "%B5": "\xB5", + "%b6": "\xB6", + "%B6": "\xB6", + "%b7": "\xB7", + "%B7": "\xB7", + "%b8": "\xB8", + "%B8": "\xB8", + "%b9": "\xB9", + "%B9": "\xB9", + "%ba": "\xBA", + "%Ba": "\xBA", + "%bA": "\xBA", + "%BA": "\xBA", + "%bb": "\xBB", + "%Bb": "\xBB", + "%bB": "\xBB", + "%BB": "\xBB", + "%bc": "\xBC", + "%Bc": "\xBC", + "%bC": "\xBC", + "%BC": "\xBC", + "%bd": "\xBD", + "%Bd": "\xBD", + "%bD": "\xBD", + "%BD": "\xBD", + "%be": "\xBE", + "%Be": "\xBE", + "%bE": "\xBE", + "%BE": "\xBE", + "%bf": "\xBF", + "%Bf": "\xBF", + "%bF": "\xBF", + "%BF": "\xBF", + "%c0": "\xC0", + "%C0": "\xC0", + "%c1": "\xC1", + "%C1": "\xC1", + "%c2": "\xC2", + "%C2": "\xC2", + "%c3": "\xC3", + "%C3": "\xC3", + "%c4": "\xC4", + "%C4": "\xC4", + "%c5": "\xC5", + "%C5": "\xC5", + "%c6": "\xC6", + "%C6": "\xC6", + "%c7": "\xC7", + "%C7": "\xC7", + "%c8": "\xC8", + "%C8": "\xC8", + "%c9": "\xC9", + "%C9": "\xC9", + "%ca": "\xCA", + "%Ca": "\xCA", + "%cA": "\xCA", + "%CA": "\xCA", + "%cb": "\xCB", + "%Cb": "\xCB", + "%cB": "\xCB", + "%CB": "\xCB", + "%cc": "\xCC", + "%Cc": "\xCC", + "%cC": "\xCC", + "%CC": "\xCC", + "%cd": "\xCD", + "%Cd": "\xCD", + "%cD": "\xCD", + "%CD": "\xCD", + "%ce": "\xCE", + "%Ce": "\xCE", + "%cE": "\xCE", + "%CE": "\xCE", + "%cf": "\xCF", + "%Cf": "\xCF", + "%cF": "\xCF", + "%CF": "\xCF", + "%d0": "\xD0", + "%D0": "\xD0", + "%d1": "\xD1", + "%D1": "\xD1", + "%d2": "\xD2", + "%D2": "\xD2", + "%d3": "\xD3", + "%D3": "\xD3", + "%d4": "\xD4", + "%D4": "\xD4", + "%d5": "\xD5", + "%D5": "\xD5", + "%d6": "\xD6", + "%D6": "\xD6", + "%d7": "\xD7", + "%D7": "\xD7", + "%d8": "\xD8", + "%D8": "\xD8", + "%d9": "\xD9", + "%D9": "\xD9", + "%da": "\xDA", + "%Da": "\xDA", + "%dA": "\xDA", + "%DA": "\xDA", + "%db": "\xDB", + "%Db": "\xDB", + "%dB": "\xDB", + "%DB": "\xDB", + "%dc": "\xDC", + "%Dc": "\xDC", + "%dC": "\xDC", + "%DC": "\xDC", + "%dd": "\xDD", + "%Dd": "\xDD", + "%dD": "\xDD", + "%DD": "\xDD", + "%de": "\xDE", + "%De": "\xDE", + "%dE": "\xDE", + "%DE": "\xDE", + "%df": "\xDF", + "%Df": "\xDF", + "%dF": "\xDF", + "%DF": "\xDF", + "%e0": "\xE0", + "%E0": "\xE0", + "%e1": "\xE1", + "%E1": "\xE1", + "%e2": "\xE2", + "%E2": "\xE2", + "%e3": "\xE3", + "%E3": "\xE3", + "%e4": "\xE4", + "%E4": "\xE4", + "%e5": "\xE5", + "%E5": "\xE5", + "%e6": "\xE6", + "%E6": "\xE6", + "%e7": "\xE7", + "%E7": "\xE7", + "%e8": "\xE8", + "%E8": "\xE8", + "%e9": "\xE9", + "%E9": "\xE9", + "%ea": "\xEA", + "%Ea": "\xEA", + "%eA": "\xEA", + "%EA": "\xEA", + "%eb": "\xEB", + "%Eb": "\xEB", + "%eB": "\xEB", + "%EB": "\xEB", + "%ec": "\xEC", + "%Ec": "\xEC", + "%eC": "\xEC", + "%EC": "\xEC", + "%ed": "\xED", + "%Ed": "\xED", + "%eD": "\xED", + "%ED": "\xED", + "%ee": "\xEE", + "%Ee": "\xEE", + "%eE": "\xEE", + "%EE": "\xEE", + "%ef": "\xEF", + "%Ef": "\xEF", + "%eF": "\xEF", + "%EF": "\xEF", + "%f0": "\xF0", + "%F0": "\xF0", + "%f1": "\xF1", + "%F1": "\xF1", + "%f2": "\xF2", + "%F2": "\xF2", + "%f3": "\xF3", + "%F3": "\xF3", + "%f4": "\xF4", + "%F4": "\xF4", + "%f5": "\xF5", + "%F5": "\xF5", + "%f6": "\xF6", + "%F6": "\xF6", + "%f7": "\xF7", + "%F7": "\xF7", + "%f8": "\xF8", + "%F8": "\xF8", + "%f9": "\xF9", + "%F9": "\xF9", + "%fa": "\xFA", + "%Fa": "\xFA", + "%fA": "\xFA", + "%FA": "\xFA", + "%fb": "\xFB", + "%Fb": "\xFB", + "%fB": "\xFB", + "%FB": "\xFB", + "%fc": "\xFC", + "%Fc": "\xFC", + "%fC": "\xFC", + "%FC": "\xFC", + "%fd": "\xFD", + "%Fd": "\xFD", + "%fD": "\xFD", + "%FD": "\xFD", + "%fe": "\xFE", + "%Fe": "\xFE", + "%fE": "\xFE", + "%FE": "\xFE", + "%ff": "\xFF", + "%Ff": "\xFF", + "%fF": "\xFF", + "%FF": "\xFF" + }; + function encodedReplacer(match) { + return EncodedLookup[match]; + } + var STATE_KEY = 0; + var STATE_VALUE = 1; + var STATE_CHARSET = 2; + var STATE_LANG = 3; + function parseParams(str) { + const res = []; + let state = STATE_KEY; + let charset = ""; + let inquote = false; + let escaping = false; + let p = 0; + let tmp = ""; + const len = str.length; + for (var i = 0;i < len; ++i) { + const char = str[i]; + if (char === "\\" && inquote) { + if (escaping) { + escaping = false; + } else { + escaping = true; + continue; + } + } else if (char === '"') { + if (!escaping) { + if (inquote) { + inquote = false; + state = STATE_KEY; + } else { + inquote = true; + } + continue; + } else { + escaping = false; + } + } else { + if (escaping && inquote) { + tmp += "\\"; + } + escaping = false; + if ((state === STATE_CHARSET || state === STATE_LANG) && char === "'") { + if (state === STATE_CHARSET) { + state = STATE_LANG; + charset = tmp.substring(1); + } else { + state = STATE_VALUE; + } + tmp = ""; + continue; + } else if (state === STATE_KEY && (char === "*" || char === "=") && res.length) { + state = char === "*" ? STATE_CHARSET : STATE_VALUE; + res[p] = [tmp, undefined]; + tmp = ""; + continue; + } else if (!inquote && char === ";") { + state = STATE_KEY; + if (charset) { + if (tmp.length) { + tmp = decodeText(tmp.replace(RE_ENCODED, encodedReplacer), "binary", charset); + } + charset = ""; + } else if (tmp.length) { + tmp = decodeText(tmp, "binary", "utf8"); + } + if (res[p] === undefined) { + res[p] = tmp; + } else { + res[p][1] = tmp; + } + tmp = ""; + ++p; + continue; + } else if (!inquote && (char === " " || char === "\t")) { + continue; + } + } + tmp += char; + } + if (charset && tmp.length) { + tmp = decodeText(tmp.replace(RE_ENCODED, encodedReplacer), "binary", charset); + } else if (tmp) { + tmp = decodeText(tmp, "binary", "utf8"); + } + if (res[p] === undefined) { + if (tmp) { + res[p] = tmp; + } + } else { + res[p][1] = tmp; + } + return res; + } + module2.exports = parseParams; +}); + +// node_modules/@fastify/busboy/lib/utils/basename.js +var require_basename = __commonJS((exports2, module2) => { + module2.exports = function basename(path) { + if (typeof path !== "string") { + return ""; + } + for (var i = path.length - 1;i >= 0; --i) { + switch (path.charCodeAt(i)) { + case 47: + case 92: + path = path.slice(i + 1); + return path === ".." || path === "." ? "" : path; + } + } + return path === ".." || path === "." ? "" : path; + }; +}); + +// node_modules/@fastify/busboy/lib/types/multipart.js +var require_multipart = __commonJS((exports2, module2) => { + var { Readable } = require("node:stream"); + var { inherits } = require("node:util"); + var Dicer = require_Dicer(); + var parseParams = require_parseParams(); + var decodeText = require_decodeText(); + var basename = require_basename(); + var getLimit = require_getLimit(); + var RE_BOUNDARY = /^boundary$/i; + var RE_FIELD = /^form-data$/i; + var RE_CHARSET = /^charset$/i; + var RE_FILENAME = /^filename$/i; + var RE_NAME = /^name$/i; + Multipart.detect = /^multipart\/form-data/i; + function Multipart(boy, cfg) { + let i; + let len; + const self2 = this; + let boundary; + const limits = cfg.limits; + const isPartAFile = cfg.isPartAFile || ((fieldName, contentType, fileName) => contentType === "application/octet-stream" || fileName !== undefined); + const parsedConType = cfg.parsedConType || []; + const defCharset = cfg.defCharset || "utf8"; + const preservePath = cfg.preservePath; + const fileOpts = { highWaterMark: cfg.fileHwm }; + for (i = 0, len = parsedConType.length;i < len; ++i) { + if (Array.isArray(parsedConType[i]) && RE_BOUNDARY.test(parsedConType[i][0])) { + boundary = parsedConType[i][1]; + break; + } + } + function checkFinished() { + if (nends === 0 && finished && !boy._done) { + finished = false; + self2.end(); + } + } + if (typeof boundary !== "string") { + throw new Error("Multipart: Boundary not found"); + } + const fieldSizeLimit = getLimit(limits, "fieldSize", 1 * 1024 * 1024); + const fileSizeLimit = getLimit(limits, "fileSize", Infinity); + const filesLimit = getLimit(limits, "files", Infinity); + const fieldsLimit = getLimit(limits, "fields", Infinity); + const partsLimit = getLimit(limits, "parts", Infinity); + const headerPairsLimit = getLimit(limits, "headerPairs", 2000); + const headerSizeLimit = getLimit(limits, "headerSize", 80 * 1024); + let nfiles = 0; + let nfields = 0; + let nends = 0; + let curFile; + let curField; + let finished = false; + this._needDrain = false; + this._pause = false; + this._cb = undefined; + this._nparts = 0; + this._boy = boy; + const parserCfg = { + boundary, + maxHeaderPairs: headerPairsLimit, + maxHeaderSize: headerSizeLimit, + partHwm: fileOpts.highWaterMark, + highWaterMark: cfg.highWaterMark + }; + this.parser = new Dicer(parserCfg); + this.parser.on("drain", function() { + self2._needDrain = false; + if (self2._cb && !self2._pause) { + const cb = self2._cb; + self2._cb = undefined; + cb(); + } + }).on("part", function onPart(part) { + if (++self2._nparts > partsLimit) { + self2.parser.removeListener("part", onPart); + self2.parser.on("part", skipPart); + boy.hitPartsLimit = true; + boy.emit("partsLimit"); + return skipPart(part); + } + if (curField) { + const field = curField; + field.emit("end"); + field.removeAllListeners("end"); + } + part.on("header", function(header) { + let contype; + let fieldname; + let parsed; + let charset; + let encoding; + let filename; + let nsize = 0; + if (header["content-type"]) { + parsed = parseParams(header["content-type"][0]); + if (parsed[0]) { + contype = parsed[0].toLowerCase(); + for (i = 0, len = parsed.length;i < len; ++i) { + if (RE_CHARSET.test(parsed[i][0])) { + charset = parsed[i][1].toLowerCase(); + break; + } + } + } + } + if (contype === undefined) { + contype = "text/plain"; + } + if (charset === undefined) { + charset = defCharset; + } + if (header["content-disposition"]) { + parsed = parseParams(header["content-disposition"][0]); + if (!RE_FIELD.test(parsed[0])) { + return skipPart(part); + } + for (i = 0, len = parsed.length;i < len; ++i) { + if (RE_NAME.test(parsed[i][0])) { + fieldname = parsed[i][1]; + } else if (RE_FILENAME.test(parsed[i][0])) { + filename = parsed[i][1]; + if (!preservePath) { + filename = basename(filename); + } + } + } + } else { + return skipPart(part); + } + if (header["content-transfer-encoding"]) { + encoding = header["content-transfer-encoding"][0].toLowerCase(); + } else { + encoding = "7bit"; + } + let onData, onEnd; + if (isPartAFile(fieldname, contype, filename)) { + if (nfiles === filesLimit) { + if (!boy.hitFilesLimit) { + boy.hitFilesLimit = true; + boy.emit("filesLimit"); + } + return skipPart(part); + } + ++nfiles; + if (boy.listenerCount("file") === 0) { + self2.parser._ignore(); + return; + } + ++nends; + const file = new FileStream(fileOpts); + curFile = file; + file.on("end", function() { + --nends; + self2._pause = false; + checkFinished(); + if (self2._cb && !self2._needDrain) { + const cb = self2._cb; + self2._cb = undefined; + cb(); + } + }); + file._read = function(n) { + if (!self2._pause) { + return; + } + self2._pause = false; + if (self2._cb && !self2._needDrain) { + const cb = self2._cb; + self2._cb = undefined; + cb(); + } + }; + boy.emit("file", fieldname, file, filename, encoding, contype); + onData = function(data) { + if ((nsize += data.length) > fileSizeLimit) { + const extralen = fileSizeLimit - nsize + data.length; + if (extralen > 0) { + file.push(data.slice(0, extralen)); + } + file.truncated = true; + file.bytesRead = fileSizeLimit; + part.removeAllListeners("data"); + file.emit("limit"); + return; + } else if (!file.push(data)) { + self2._pause = true; + } + file.bytesRead = nsize; + }; + onEnd = function() { + curFile = undefined; + file.push(null); + }; + } else { + if (nfields === fieldsLimit) { + if (!boy.hitFieldsLimit) { + boy.hitFieldsLimit = true; + boy.emit("fieldsLimit"); + } + return skipPart(part); + } + ++nfields; + ++nends; + let buffer = ""; + let truncated = false; + curField = part; + onData = function(data) { + if ((nsize += data.length) > fieldSizeLimit) { + const extralen = fieldSizeLimit - (nsize - data.length); + buffer += data.toString("binary", 0, extralen); + truncated = true; + part.removeAllListeners("data"); + } else { + buffer += data.toString("binary"); + } + }; + onEnd = function() { + curField = undefined; + if (buffer.length) { + buffer = decodeText(buffer, "binary", charset); + } + boy.emit("field", fieldname, buffer, false, truncated, encoding, contype); + --nends; + checkFinished(); + }; + } + part._readableState.sync = false; + part.on("data", onData); + part.on("end", onEnd); + }).on("error", function(err) { + if (curFile) { + curFile.emit("error", err); + } + }); + }).on("error", function(err) { + boy.emit("error", err); + }).on("finish", function() { + finished = true; + checkFinished(); + }); + } + Multipart.prototype.write = function(chunk, cb) { + const r = this.parser.write(chunk); + if (r && !this._pause) { + cb(); + } else { + this._needDrain = !r; + this._cb = cb; + } + }; + Multipart.prototype.end = function() { + const self2 = this; + if (self2.parser.writable) { + self2.parser.end(); + } else if (!self2._boy._done) { + process.nextTick(function() { + self2._boy._done = true; + self2._boy.emit("finish"); + }); + } + }; + function skipPart(part) { + part.resume(); + } + function FileStream(opts) { + Readable.call(this, opts); + this.bytesRead = 0; + this.truncated = false; + } + inherits(FileStream, Readable); + FileStream.prototype._read = function(n) { + }; + module2.exports = Multipart; +}); + +// node_modules/@fastify/busboy/lib/utils/Decoder.js +var require_Decoder = __commonJS((exports2, module2) => { + var RE_PLUS = /\+/g; + var HEX = [ + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 1, + 1, + 1, + 1, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 1, + 1, + 1, + 1, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0 + ]; + function Decoder() { + this.buffer = undefined; + } + Decoder.prototype.write = function(str) { + str = str.replace(RE_PLUS, " "); + let res = ""; + let i = 0; + let p = 0; + const len = str.length; + for (;i < len; ++i) { + if (this.buffer !== undefined) { + if (!HEX[str.charCodeAt(i)]) { + res += "%" + this.buffer; + this.buffer = undefined; + --i; + } else { + this.buffer += str[i]; + ++p; + if (this.buffer.length === 2) { + res += String.fromCharCode(parseInt(this.buffer, 16)); + this.buffer = undefined; + } + } + } else if (str[i] === "%") { + if (i > p) { + res += str.substring(p, i); + p = i; + } + this.buffer = ""; + ++p; + } + } + if (p < len && this.buffer === undefined) { + res += str.substring(p); + } + return res; + }; + Decoder.prototype.reset = function() { + this.buffer = undefined; + }; + module2.exports = Decoder; +}); + +// node_modules/@fastify/busboy/lib/types/urlencoded.js +var require_urlencoded = __commonJS((exports2, module2) => { + var Decoder = require_Decoder(); + var decodeText = require_decodeText(); + var getLimit = require_getLimit(); + var RE_CHARSET = /^charset$/i; + UrlEncoded.detect = /^application\/x-www-form-urlencoded/i; + function UrlEncoded(boy, cfg) { + const limits = cfg.limits; + const parsedConType = cfg.parsedConType; + this.boy = boy; + this.fieldSizeLimit = getLimit(limits, "fieldSize", 1 * 1024 * 1024); + this.fieldNameSizeLimit = getLimit(limits, "fieldNameSize", 100); + this.fieldsLimit = getLimit(limits, "fields", Infinity); + let charset; + for (var i = 0, len = parsedConType.length;i < len; ++i) { + if (Array.isArray(parsedConType[i]) && RE_CHARSET.test(parsedConType[i][0])) { + charset = parsedConType[i][1].toLowerCase(); + break; + } + } + if (charset === undefined) { + charset = cfg.defCharset || "utf8"; + } + this.decoder = new Decoder; + this.charset = charset; + this._fields = 0; + this._state = "key"; + this._checkingBytes = true; + this._bytesKey = 0; + this._bytesVal = 0; + this._key = ""; + this._val = ""; + this._keyTrunc = false; + this._valTrunc = false; + this._hitLimit = false; + } + UrlEncoded.prototype.write = function(data, cb) { + if (this._fields === this.fieldsLimit) { + if (!this.boy.hitFieldsLimit) { + this.boy.hitFieldsLimit = true; + this.boy.emit("fieldsLimit"); + } + return cb(); + } + let idxeq; + let idxamp; + let i; + let p = 0; + const len = data.length; + while (p < len) { + if (this._state === "key") { + idxeq = idxamp = undefined; + for (i = p;i < len; ++i) { + if (!this._checkingBytes) { + ++p; + } + if (data[i] === 61) { + idxeq = i; + break; + } else if (data[i] === 38) { + idxamp = i; + break; + } + if (this._checkingBytes && this._bytesKey === this.fieldNameSizeLimit) { + this._hitLimit = true; + break; + } else if (this._checkingBytes) { + ++this._bytesKey; + } + } + if (idxeq !== undefined) { + if (idxeq > p) { + this._key += this.decoder.write(data.toString("binary", p, idxeq)); + } + this._state = "val"; + this._hitLimit = false; + this._checkingBytes = true; + this._val = ""; + this._bytesVal = 0; + this._valTrunc = false; + this.decoder.reset(); + p = idxeq + 1; + } else if (idxamp !== undefined) { + ++this._fields; + let key; + const keyTrunc = this._keyTrunc; + if (idxamp > p) { + key = this._key += this.decoder.write(data.toString("binary", p, idxamp)); + } else { + key = this._key; + } + this._hitLimit = false; + this._checkingBytes = true; + this._key = ""; + this._bytesKey = 0; + this._keyTrunc = false; + this.decoder.reset(); + if (key.length) { + this.boy.emit("field", decodeText(key, "binary", this.charset), "", keyTrunc, false); + } + p = idxamp + 1; + if (this._fields === this.fieldsLimit) { + return cb(); + } + } else if (this._hitLimit) { + if (i > p) { + this._key += this.decoder.write(data.toString("binary", p, i)); + } + p = i; + if ((this._bytesKey = this._key.length) === this.fieldNameSizeLimit) { + this._checkingBytes = false; + this._keyTrunc = true; + } + } else { + if (p < len) { + this._key += this.decoder.write(data.toString("binary", p)); + } + p = len; + } + } else { + idxamp = undefined; + for (i = p;i < len; ++i) { + if (!this._checkingBytes) { + ++p; + } + if (data[i] === 38) { + idxamp = i; + break; + } + if (this._checkingBytes && this._bytesVal === this.fieldSizeLimit) { + this._hitLimit = true; + break; + } else if (this._checkingBytes) { + ++this._bytesVal; + } + } + if (idxamp !== undefined) { + ++this._fields; + if (idxamp > p) { + this._val += this.decoder.write(data.toString("binary", p, idxamp)); + } + this.boy.emit("field", decodeText(this._key, "binary", this.charset), decodeText(this._val, "binary", this.charset), this._keyTrunc, this._valTrunc); + this._state = "key"; + this._hitLimit = false; + this._checkingBytes = true; + this._key = ""; + this._bytesKey = 0; + this._keyTrunc = false; + this.decoder.reset(); + p = idxamp + 1; + if (this._fields === this.fieldsLimit) { + return cb(); + } + } else if (this._hitLimit) { + if (i > p) { + this._val += this.decoder.write(data.toString("binary", p, i)); + } + p = i; + if (this._val === "" && this.fieldSizeLimit === 0 || (this._bytesVal = this._val.length) === this.fieldSizeLimit) { + this._checkingBytes = false; + this._valTrunc = true; + } + } else { + if (p < len) { + this._val += this.decoder.write(data.toString("binary", p)); + } + p = len; + } + } + } + cb(); + }; + UrlEncoded.prototype.end = function() { + if (this.boy._done) { + return; + } + if (this._state === "key" && this._key.length > 0) { + this.boy.emit("field", decodeText(this._key, "binary", this.charset), "", this._keyTrunc, false); + } else if (this._state === "val") { + this.boy.emit("field", decodeText(this._key, "binary", this.charset), decodeText(this._val, "binary", this.charset), this._keyTrunc, this._valTrunc); + } + this.boy._done = true; + this.boy.emit("finish"); + }; + module2.exports = UrlEncoded; +}); + +// node_modules/@fastify/busboy/lib/main.js +var require_main = __commonJS((exports2, module2) => { + var WritableStream = require("node:stream").Writable; + var { inherits } = require("node:util"); + var Dicer = require_Dicer(); + var MultipartParser = require_multipart(); + var UrlencodedParser = require_urlencoded(); + var parseParams = require_parseParams(); + function Busboy(opts) { + if (!(this instanceof Busboy)) { + return new Busboy(opts); + } + if (typeof opts !== "object") { + throw new TypeError("Busboy expected an options-Object."); + } + if (typeof opts.headers !== "object") { + throw new TypeError("Busboy expected an options-Object with headers-attribute."); + } + if (typeof opts.headers["content-type"] !== "string") { + throw new TypeError("Missing Content-Type-header."); + } + const { + headers, + ...streamOptions + } = opts; + this.opts = { + autoDestroy: false, + ...streamOptions + }; + WritableStream.call(this, this.opts); + this._done = false; + this._parser = this.getParserByHeaders(headers); + this._finished = false; + } + inherits(Busboy, WritableStream); + Busboy.prototype.emit = function(ev) { + if (ev === "finish") { + if (!this._done) { + this._parser?.end(); + return; + } else if (this._finished) { + return; + } + this._finished = true; + } + WritableStream.prototype.emit.apply(this, arguments); + }; + Busboy.prototype.getParserByHeaders = function(headers) { + const parsed = parseParams(headers["content-type"]); + const cfg = { + defCharset: this.opts.defCharset, + fileHwm: this.opts.fileHwm, + headers, + highWaterMark: this.opts.highWaterMark, + isPartAFile: this.opts.isPartAFile, + limits: this.opts.limits, + parsedConType: parsed, + preservePath: this.opts.preservePath + }; + if (MultipartParser.detect.test(parsed[0])) { + return new MultipartParser(this, cfg); + } + if (UrlencodedParser.detect.test(parsed[0])) { + return new UrlencodedParser(this, cfg); + } + throw new Error("Unsupported Content-Type."); + }; + Busboy.prototype._write = function(chunk, encoding, cb) { + this._parser.write(chunk, cb); + }; + module2.exports = Busboy; + module2.exports.default = Busboy; + module2.exports.Busboy = Busboy; + module2.exports.Dicer = Dicer; +}); + +// node_modules/undici/lib/fetch/constants.js +var require_constants2 = __commonJS((exports2, module2) => { + var { MessageChannel, receiveMessageOnPort } = require("worker_threads"); + var corsSafeListedMethods = ["GET", "HEAD", "POST"]; + var corsSafeListedMethodsSet = new Set(corsSafeListedMethods); + var nullBodyStatus = [101, 204, 205, 304]; + var redirectStatus = [301, 302, 303, 307, 308]; + var redirectStatusSet = new Set(redirectStatus); + var badPorts = [ + "1", + "7", + "9", + "11", + "13", + "15", + "17", + "19", + "20", + "21", + "22", + "23", + "25", + "37", + "42", + "43", + "53", + "69", + "77", + "79", + "87", + "95", + "101", + "102", + "103", + "104", + "109", + "110", + "111", + "113", + "115", + "117", + "119", + "123", + "135", + "137", + "139", + "143", + "161", + "179", + "389", + "427", + "465", + "512", + "513", + "514", + "515", + "526", + "530", + "531", + "532", + "540", + "548", + "554", + "556", + "563", + "587", + "601", + "636", + "989", + "990", + "993", + "995", + "1719", + "1720", + "1723", + "2049", + "3659", + "4045", + "5060", + "5061", + "6000", + "6566", + "6665", + "6666", + "6667", + "6668", + "6669", + "6697", + "10080" + ]; + var badPortsSet = new Set(badPorts); + var referrerPolicy = [ + "", + "no-referrer", + "no-referrer-when-downgrade", + "same-origin", + "origin", + "strict-origin", + "origin-when-cross-origin", + "strict-origin-when-cross-origin", + "unsafe-url" + ]; + var referrerPolicySet = new Set(referrerPolicy); + var requestRedirect = ["follow", "manual", "error"]; + var safeMethods = ["GET", "HEAD", "OPTIONS", "TRACE"]; + var safeMethodsSet = new Set(safeMethods); + var requestMode = ["navigate", "same-origin", "no-cors", "cors"]; + var requestCredentials = ["omit", "same-origin", "include"]; + var requestCache = [ + "default", + "no-store", + "reload", + "no-cache", + "force-cache", + "only-if-cached" + ]; + var requestBodyHeader = [ + "content-encoding", + "content-language", + "content-location", + "content-type", + "content-length" + ]; + var requestDuplex = [ + "half" + ]; + var forbiddenMethods = ["CONNECT", "TRACE", "TRACK"]; + var forbiddenMethodsSet = new Set(forbiddenMethods); + var subresource = [ + "audio", + "audioworklet", + "font", + "image", + "manifest", + "paintworklet", + "script", + "style", + "track", + "video", + "xslt", + "" + ]; + var subresourceSet = new Set(subresource); + var DOMException2 = globalThis.DOMException ?? (() => { + try { + atob("~"); + } catch (err) { + return Object.getPrototypeOf(err).constructor; + } + })(); + var channel; + var structuredClone = globalThis.structuredClone ?? function structuredClone(value, options = undefined) { + if (arguments.length === 0) { + throw new TypeError("missing argument"); + } + if (!channel) { + channel = new MessageChannel; + } + channel.port1.unref(); + channel.port2.unref(); + channel.port1.postMessage(value, options?.transfer); + return receiveMessageOnPort(channel.port2).message; + }; + module2.exports = { + DOMException: DOMException2, + structuredClone, + subresource, + forbiddenMethods, + requestBodyHeader, + referrerPolicy, + requestRedirect, + requestMode, + requestCredentials, + requestCache, + redirectStatus, + corsSafeListedMethods, + nullBodyStatus, + safeMethods, + badPorts, + requestDuplex, + subresourceSet, + badPortsSet, + redirectStatusSet, + corsSafeListedMethodsSet, + safeMethodsSet, + forbiddenMethodsSet, + referrerPolicySet + }; +}); + +// node_modules/undici/lib/fetch/global.js +var require_global = __commonJS((exports2, module2) => { + var globalOrigin = Symbol.for("undici.globalOrigin.1"); + function getGlobalOrigin() { + return globalThis[globalOrigin]; + } + function setGlobalOrigin(newOrigin) { + if (newOrigin === undefined) { + Object.defineProperty(globalThis, globalOrigin, { + value: undefined, + writable: true, + enumerable: false, + configurable: false + }); + return; + } + const parsedURL = new URL(newOrigin); + if (parsedURL.protocol !== "http:" && parsedURL.protocol !== "https:") { + throw new TypeError(`Only http & https urls are allowed, received ${parsedURL.protocol}`); + } + Object.defineProperty(globalThis, globalOrigin, { + value: parsedURL, + writable: true, + enumerable: false, + configurable: false + }); + } + module2.exports = { + getGlobalOrigin, + setGlobalOrigin + }; +}); + +// node_modules/undici/lib/fetch/util.js +var require_util2 = __commonJS((exports2, module2) => { + var { redirectStatusSet, referrerPolicySet: referrerPolicyTokens, badPortsSet } = require_constants2(); + var { getGlobalOrigin } = require_global(); + var { performance: performance2 } = require("perf_hooks"); + var { isBlobLike, toUSVString, ReadableStreamFrom } = require_util(); + var assert = require("assert"); + var { isUint8Array } = require("util/types"); + var supportedHashes = []; + var crypto; + try { + crypto = require("crypto"); + const possibleRelevantHashes = ["sha256", "sha384", "sha512"]; + supportedHashes = crypto.getHashes().filter((hash) => possibleRelevantHashes.includes(hash)); + } catch { + } + function responseURL(response) { + const urlList = response.urlList; + const length = urlList.length; + return length === 0 ? null : urlList[length - 1].toString(); + } + function responseLocationURL(response, requestFragment) { + if (!redirectStatusSet.has(response.status)) { + return null; + } + let location = response.headersList.get("location"); + if (location !== null && isValidHeaderValue(location)) { + location = new URL(location, responseURL(response)); + } + if (location && !location.hash) { + location.hash = requestFragment; + } + return location; + } + function requestCurrentURL(request) { + return request.urlList[request.urlList.length - 1]; + } + function requestBadPort(request) { + const url = requestCurrentURL(request); + if (urlIsHttpHttpsScheme(url) && badPortsSet.has(url.port)) { + return "blocked"; + } + return "allowed"; + } + function isErrorLike(object) { + return object instanceof Error || (object?.constructor?.name === "Error" || object?.constructor?.name === "DOMException"); + } + function isValidReasonPhrase(statusText) { + for (let i = 0;i < statusText.length; ++i) { + const c = statusText.charCodeAt(i); + if (!(c === 9 || c >= 32 && c <= 126 || c >= 128 && c <= 255)) { + return false; + } + } + return true; + } + function isTokenCharCode(c) { + switch (c) { + case 34: + case 40: + case 41: + case 44: + case 47: + case 58: + case 59: + case 60: + case 61: + case 62: + case 63: + case 64: + case 91: + case 92: + case 93: + case 123: + case 125: + return false; + default: + return c >= 33 && c <= 126; + } + } + function isValidHTTPToken(characters) { + if (characters.length === 0) { + return false; + } + for (let i = 0;i < characters.length; ++i) { + if (!isTokenCharCode(characters.charCodeAt(i))) { + return false; + } + } + return true; + } + function isValidHeaderName(potentialValue) { + return isValidHTTPToken(potentialValue); + } + function isValidHeaderValue(potentialValue) { + if (potentialValue.startsWith("\t") || potentialValue.startsWith(" ") || potentialValue.endsWith("\t") || potentialValue.endsWith(" ")) { + return false; + } + if (potentialValue.includes("\0") || potentialValue.includes("\r") || potentialValue.includes("\n")) { + return false; + } + return true; + } + function setRequestReferrerPolicyOnRedirect(request, actualResponse) { + const { headersList } = actualResponse; + const policyHeader = (headersList.get("referrer-policy") ?? "").split(","); + let policy = ""; + if (policyHeader.length > 0) { + for (let i = policyHeader.length;i !== 0; i--) { + const token = policyHeader[i - 1].trim(); + if (referrerPolicyTokens.has(token)) { + policy = token; + break; + } + } + } + if (policy !== "") { + request.referrerPolicy = policy; + } + } + function crossOriginResourcePolicyCheck() { + return "allowed"; + } + function corsCheck() { + return "success"; + } + function TAOCheck() { + return "success"; + } + function appendFetchMetadata(httpRequest) { + let header = null; + header = httpRequest.mode; + httpRequest.headersList.set("sec-fetch-mode", header); + } + function appendRequestOriginHeader(request) { + let serializedOrigin = request.origin; + if (request.responseTainting === "cors" || request.mode === "websocket") { + if (serializedOrigin) { + request.headersList.append("origin", serializedOrigin); + } + } else if (request.method !== "GET" && request.method !== "HEAD") { + switch (request.referrerPolicy) { + case "no-referrer": + serializedOrigin = null; + break; + case "no-referrer-when-downgrade": + case "strict-origin": + case "strict-origin-when-cross-origin": + if (request.origin && urlHasHttpsScheme(request.origin) && !urlHasHttpsScheme(requestCurrentURL(request))) { + serializedOrigin = null; + } + break; + case "same-origin": + if (!sameOrigin(request, requestCurrentURL(request))) { + serializedOrigin = null; + } + break; + default: + } + if (serializedOrigin) { + request.headersList.append("origin", serializedOrigin); + } + } + } + function coarsenedSharedCurrentTime(crossOriginIsolatedCapability) { + return performance2.now(); + } + function createOpaqueTimingInfo(timingInfo) { + return { + startTime: timingInfo.startTime ?? 0, + redirectStartTime: 0, + redirectEndTime: 0, + postRedirectStartTime: timingInfo.startTime ?? 0, + finalServiceWorkerStartTime: 0, + finalNetworkResponseStartTime: 0, + finalNetworkRequestStartTime: 0, + endTime: 0, + encodedBodySize: 0, + decodedBodySize: 0, + finalConnectionTimingInfo: null + }; + } + function makePolicyContainer() { + return { + referrerPolicy: "strict-origin-when-cross-origin" + }; + } + function clonePolicyContainer(policyContainer) { + return { + referrerPolicy: policyContainer.referrerPolicy + }; + } + function determineRequestsReferrer(request) { + const policy = request.referrerPolicy; + assert(policy); + let referrerSource = null; + if (request.referrer === "client") { + const globalOrigin = getGlobalOrigin(); + if (!globalOrigin || globalOrigin.origin === "null") { + return "no-referrer"; + } + referrerSource = new URL(globalOrigin); + } else if (request.referrer instanceof URL) { + referrerSource = request.referrer; + } + let referrerURL = stripURLForReferrer(referrerSource); + const referrerOrigin = stripURLForReferrer(referrerSource, true); + if (referrerURL.toString().length > 4096) { + referrerURL = referrerOrigin; + } + const areSameOrigin = sameOrigin(request, referrerURL); + const isNonPotentiallyTrustWorthy = isURLPotentiallyTrustworthy(referrerURL) && !isURLPotentiallyTrustworthy(request.url); + switch (policy) { + case "origin": + return referrerOrigin != null ? referrerOrigin : stripURLForReferrer(referrerSource, true); + case "unsafe-url": + return referrerURL; + case "same-origin": + return areSameOrigin ? referrerOrigin : "no-referrer"; + case "origin-when-cross-origin": + return areSameOrigin ? referrerURL : referrerOrigin; + case "strict-origin-when-cross-origin": { + const currentURL = requestCurrentURL(request); + if (sameOrigin(referrerURL, currentURL)) { + return referrerURL; + } + if (isURLPotentiallyTrustworthy(referrerURL) && !isURLPotentiallyTrustworthy(currentURL)) { + return "no-referrer"; + } + return referrerOrigin; + } + case "strict-origin": + case "no-referrer-when-downgrade": + default: + return isNonPotentiallyTrustWorthy ? "no-referrer" : referrerOrigin; + } + } + function stripURLForReferrer(url, originOnly) { + assert(url instanceof URL); + if (url.protocol === "file:" || url.protocol === "about:" || url.protocol === "blank:") { + return "no-referrer"; + } + url.username = ""; + url.password = ""; + url.hash = ""; + if (originOnly) { + url.pathname = ""; + url.search = ""; + } + return url; + } + function isURLPotentiallyTrustworthy(url) { + if (!(url instanceof URL)) { + return false; + } + if (url.href === "about:blank" || url.href === "about:srcdoc") { + return true; + } + if (url.protocol === "data:") + return true; + if (url.protocol === "file:") + return true; + return isOriginPotentiallyTrustworthy(url.origin); + function isOriginPotentiallyTrustworthy(origin) { + if (origin == null || origin === "null") + return false; + const originAsURL = new URL(origin); + if (originAsURL.protocol === "https:" || originAsURL.protocol === "wss:") { + return true; + } + if (/^127(?:\.[0-9]+){0,2}\.[0-9]+$|^\[(?:0*:)*?:?0*1\]$/.test(originAsURL.hostname) || (originAsURL.hostname === "localhost" || originAsURL.hostname.includes("localhost.")) || originAsURL.hostname.endsWith(".localhost")) { + return true; + } + return false; + } + } + function bytesMatch(bytes, metadataList) { + if (crypto === undefined) { + return true; + } + const parsedMetadata = parseMetadata(metadataList); + if (parsedMetadata === "no metadata") { + return true; + } + if (parsedMetadata.length === 0) { + return true; + } + const strongest = getStrongestMetadata(parsedMetadata); + const metadata = filterMetadataListByAlgorithm(parsedMetadata, strongest); + for (const item of metadata) { + const algorithm = item.algo; + const expectedValue = item.hash; + let actualValue = crypto.createHash(algorithm).update(bytes).digest("base64"); + if (actualValue[actualValue.length - 1] === "=") { + if (actualValue[actualValue.length - 2] === "=") { + actualValue = actualValue.slice(0, -2); + } else { + actualValue = actualValue.slice(0, -1); + } + } + if (compareBase64Mixed(actualValue, expectedValue)) { + return true; + } + } + return false; + } + var parseHashWithOptions = /(?sha256|sha384|sha512)-((?[A-Za-z0-9+/]+|[A-Za-z0-9_-]+)={0,2}(?:\s|$)( +[!-~]*)?)?/i; + function parseMetadata(metadata) { + const result = []; + let empty = true; + for (const token of metadata.split(" ")) { + empty = false; + const parsedToken = parseHashWithOptions.exec(token); + if (parsedToken === null || parsedToken.groups === undefined || parsedToken.groups.algo === undefined) { + continue; + } + const algorithm = parsedToken.groups.algo.toLowerCase(); + if (supportedHashes.includes(algorithm)) { + result.push(parsedToken.groups); + } + } + if (empty === true) { + return "no metadata"; + } + return result; + } + function getStrongestMetadata(metadataList) { + let algorithm = metadataList[0].algo; + if (algorithm[3] === "5") { + return algorithm; + } + for (let i = 1;i < metadataList.length; ++i) { + const metadata = metadataList[i]; + if (metadata.algo[3] === "5") { + algorithm = "sha512"; + break; + } else if (algorithm[3] === "3") { + continue; + } else if (metadata.algo[3] === "3") { + algorithm = "sha384"; + } + } + return algorithm; + } + function filterMetadataListByAlgorithm(metadataList, algorithm) { + if (metadataList.length === 1) { + return metadataList; + } + let pos = 0; + for (let i = 0;i < metadataList.length; ++i) { + if (metadataList[i].algo === algorithm) { + metadataList[pos++] = metadataList[i]; + } + } + metadataList.length = pos; + return metadataList; + } + function compareBase64Mixed(actualValue, expectedValue) { + if (actualValue.length !== expectedValue.length) { + return false; + } + for (let i = 0;i < actualValue.length; ++i) { + if (actualValue[i] !== expectedValue[i]) { + if (actualValue[i] === "+" && expectedValue[i] === "-" || actualValue[i] === "/" && expectedValue[i] === "_") { + continue; + } + return false; + } + } + return true; + } + function tryUpgradeRequestToAPotentiallyTrustworthyURL(request) { + } + function sameOrigin(A, B) { + if (A.origin === B.origin && A.origin === "null") { + return true; + } + if (A.protocol === B.protocol && A.hostname === B.hostname && A.port === B.port) { + return true; + } + return false; + } + function createDeferredPromise() { + let res; + let rej; + const promise = new Promise((resolve, reject) => { + res = resolve; + rej = reject; + }); + return { promise, resolve: res, reject: rej }; + } + function isAborted(fetchParams) { + return fetchParams.controller.state === "aborted"; + } + function isCancelled(fetchParams) { + return fetchParams.controller.state === "aborted" || fetchParams.controller.state === "terminated"; + } + var normalizeMethodRecord = { + delete: "DELETE", + DELETE: "DELETE", + get: "GET", + GET: "GET", + head: "HEAD", + HEAD: "HEAD", + options: "OPTIONS", + OPTIONS: "OPTIONS", + post: "POST", + POST: "POST", + put: "PUT", + PUT: "PUT" + }; + Object.setPrototypeOf(normalizeMethodRecord, null); + function normalizeMethod(method) { + return normalizeMethodRecord[method.toLowerCase()] ?? method; + } + function serializeJavascriptValueToJSONString(value) { + const result = JSON.stringify(value); + if (result === undefined) { + throw new TypeError("Value is not JSON serializable"); + } + assert(typeof result === "string"); + return result; + } + var esIteratorPrototype = Object.getPrototypeOf(Object.getPrototypeOf([][Symbol.iterator]())); + function makeIterator(iterator, name, kind) { + const object = { + index: 0, + kind, + target: iterator + }; + const i = { + next() { + if (Object.getPrototypeOf(this) !== i) { + throw new TypeError(`'next' called on an object that does not implement interface ${name} Iterator.`); + } + const { index, kind: kind2, target } = object; + const values = target(); + const len = values.length; + if (index >= len) { + return { value: undefined, done: true }; + } + const pair = values[index]; + object.index = index + 1; + return iteratorResult(pair, kind2); + }, + [Symbol.toStringTag]: `${name} Iterator` + }; + Object.setPrototypeOf(i, esIteratorPrototype); + return Object.setPrototypeOf({}, i); + } + function iteratorResult(pair, kind) { + let result; + switch (kind) { + case "key": { + result = pair[0]; + break; + } + case "value": { + result = pair[1]; + break; + } + case "key+value": { + result = pair; + break; + } + } + return { value: result, done: false }; + } + async function fullyReadBody(body, processBody, processBodyError) { + const successSteps = processBody; + const errorSteps = processBodyError; + let reader; + try { + reader = body.stream.getReader(); + } catch (e) { + errorSteps(e); + return; + } + try { + const result = await readAllBytes(reader); + successSteps(result); + } catch (e) { + errorSteps(e); + } + } + var ReadableStream2 = globalThis.ReadableStream; + function isReadableStreamLike(stream) { + if (!ReadableStream2) { + ReadableStream2 = require("stream/web").ReadableStream; + } + return stream instanceof ReadableStream2 || stream[Symbol.toStringTag] === "ReadableStream" && typeof stream.tee === "function"; + } + var MAXIMUM_ARGUMENT_LENGTH = 65535; + function isomorphicDecode(input) { + if (input.length < MAXIMUM_ARGUMENT_LENGTH) { + return String.fromCharCode(...input); + } + return input.reduce((previous, current) => previous + String.fromCharCode(current), ""); + } + function readableStreamClose(controller) { + try { + controller.close(); + } catch (err) { + if (!err.message.includes("Controller is already closed")) { + throw err; + } + } + } + function isomorphicEncode(input) { + for (let i = 0;i < input.length; i++) { + assert(input.charCodeAt(i) <= 255); + } + return input; + } + async function readAllBytes(reader) { + const bytes = []; + let byteLength = 0; + while (true) { + const { done, value: chunk } = await reader.read(); + if (done) { + return Buffer.concat(bytes, byteLength); + } + if (!isUint8Array(chunk)) { + throw new TypeError("Received non-Uint8Array chunk"); + } + bytes.push(chunk); + byteLength += chunk.length; + } + } + function urlIsLocal(url) { + assert("protocol" in url); + const protocol = url.protocol; + return protocol === "about:" || protocol === "blob:" || protocol === "data:"; + } + function urlHasHttpsScheme(url) { + if (typeof url === "string") { + return url.startsWith("https:"); + } + return url.protocol === "https:"; + } + function urlIsHttpHttpsScheme(url) { + assert("protocol" in url); + const protocol = url.protocol; + return protocol === "http:" || protocol === "https:"; + } + var hasOwn = Object.hasOwn || ((dict, key) => Object.prototype.hasOwnProperty.call(dict, key)); + module2.exports = { + isAborted, + isCancelled, + createDeferredPromise, + ReadableStreamFrom, + toUSVString, + tryUpgradeRequestToAPotentiallyTrustworthyURL, + coarsenedSharedCurrentTime, + determineRequestsReferrer, + makePolicyContainer, + clonePolicyContainer, + appendFetchMetadata, + appendRequestOriginHeader, + TAOCheck, + corsCheck, + crossOriginResourcePolicyCheck, + createOpaqueTimingInfo, + setRequestReferrerPolicyOnRedirect, + isValidHTTPToken, + requestBadPort, + requestCurrentURL, + responseURL, + responseLocationURL, + isBlobLike, + isURLPotentiallyTrustworthy, + isValidReasonPhrase, + sameOrigin, + normalizeMethod, + serializeJavascriptValueToJSONString, + makeIterator, + isValidHeaderName, + isValidHeaderValue, + hasOwn, + isErrorLike, + fullyReadBody, + bytesMatch, + isReadableStreamLike, + readableStreamClose, + isomorphicEncode, + isomorphicDecode, + urlIsLocal, + urlHasHttpsScheme, + urlIsHttpHttpsScheme, + readAllBytes, + normalizeMethodRecord, + parseMetadata + }; +}); + +// node_modules/undici/lib/fetch/symbols.js +var require_symbols2 = __commonJS((exports2, module2) => { + module2.exports = { + kUrl: Symbol("url"), + kHeaders: Symbol("headers"), + kSignal: Symbol("signal"), + kState: Symbol("state"), + kGuard: Symbol("guard"), + kRealm: Symbol("realm") + }; +}); + +// node_modules/undici/lib/fetch/webidl.js +var require_webidl = __commonJS((exports2, module2) => { + var { types } = require("util"); + var { hasOwn, toUSVString } = require_util2(); + var webidl = {}; + webidl.converters = {}; + webidl.util = {}; + webidl.errors = {}; + webidl.errors.exception = function(message) { + return new TypeError(`${message.header}: ${message.message}`); + }; + webidl.errors.conversionFailed = function(context) { + const plural = context.types.length === 1 ? "" : " one of"; + const message = `${context.argument} could not be converted to` + `${plural}: ${context.types.join(", ")}.`; + return webidl.errors.exception({ + header: context.prefix, + message + }); + }; + webidl.errors.invalidArgument = function(context) { + return webidl.errors.exception({ + header: context.prefix, + message: `"${context.value}" is an invalid ${context.type}.` + }); + }; + webidl.brandCheck = function(V, I, opts = undefined) { + if (opts?.strict !== false && !(V instanceof I)) { + throw new TypeError("Illegal invocation"); + } else { + return V?.[Symbol.toStringTag] === I.prototype[Symbol.toStringTag]; + } + }; + webidl.argumentLengthCheck = function({ length }, min, ctx) { + if (length < min) { + throw webidl.errors.exception({ + message: `${min} argument${min !== 1 ? "s" : ""} required, ` + `but${length ? " only" : ""} ${length} found.`, + ...ctx + }); + } + }; + webidl.illegalConstructor = function() { + throw webidl.errors.exception({ + header: "TypeError", + message: "Illegal constructor" + }); + }; + webidl.util.Type = function(V) { + switch (typeof V) { + case "undefined": + return "Undefined"; + case "boolean": + return "Boolean"; + case "string": + return "String"; + case "symbol": + return "Symbol"; + case "number": + return "Number"; + case "bigint": + return "BigInt"; + case "function": + case "object": { + if (V === null) { + return "Null"; + } + return "Object"; + } + } + }; + webidl.util.ConvertToInt = function(V, bitLength, signedness, opts = {}) { + let upperBound; + let lowerBound; + if (bitLength === 64) { + upperBound = Math.pow(2, 53) - 1; + if (signedness === "unsigned") { + lowerBound = 0; + } else { + lowerBound = Math.pow(-2, 53) + 1; + } + } else if (signedness === "unsigned") { + lowerBound = 0; + upperBound = Math.pow(2, bitLength) - 1; + } else { + lowerBound = Math.pow(-2, bitLength) - 1; + upperBound = Math.pow(2, bitLength - 1) - 1; + } + let x = Number(V); + if (x === 0) { + x = 0; + } + if (opts.enforceRange === true) { + if (Number.isNaN(x) || x === Number.POSITIVE_INFINITY || x === Number.NEGATIVE_INFINITY) { + throw webidl.errors.exception({ + header: "Integer conversion", + message: `Could not convert ${V} to an integer.` + }); + } + x = webidl.util.IntegerPart(x); + if (x < lowerBound || x > upperBound) { + throw webidl.errors.exception({ + header: "Integer conversion", + message: `Value must be between ${lowerBound}-${upperBound}, got ${x}.` + }); + } + return x; + } + if (!Number.isNaN(x) && opts.clamp === true) { + x = Math.min(Math.max(x, lowerBound), upperBound); + if (Math.floor(x) % 2 === 0) { + x = Math.floor(x); + } else { + x = Math.ceil(x); + } + return x; + } + if (Number.isNaN(x) || x === 0 && Object.is(0, x) || x === Number.POSITIVE_INFINITY || x === Number.NEGATIVE_INFINITY) { + return 0; + } + x = webidl.util.IntegerPart(x); + x = x % Math.pow(2, bitLength); + if (signedness === "signed" && x >= Math.pow(2, bitLength) - 1) { + return x - Math.pow(2, bitLength); + } + return x; + }; + webidl.util.IntegerPart = function(n) { + const r = Math.floor(Math.abs(n)); + if (n < 0) { + return -1 * r; + } + return r; + }; + webidl.sequenceConverter = function(converter) { + return (V) => { + if (webidl.util.Type(V) !== "Object") { + throw webidl.errors.exception({ + header: "Sequence", + message: `Value of type ${webidl.util.Type(V)} is not an Object.` + }); + } + const method = V?.[Symbol.iterator]?.(); + const seq = []; + if (method === undefined || typeof method.next !== "function") { + throw webidl.errors.exception({ + header: "Sequence", + message: "Object is not an iterator." + }); + } + while (true) { + const { done, value } = method.next(); + if (done) { + break; + } + seq.push(converter(value)); + } + return seq; + }; + }; + webidl.recordConverter = function(keyConverter, valueConverter) { + return (O) => { + if (webidl.util.Type(O) !== "Object") { + throw webidl.errors.exception({ + header: "Record", + message: `Value of type ${webidl.util.Type(O)} is not an Object.` + }); + } + const result = {}; + if (!types.isProxy(O)) { + const keys2 = Object.keys(O); + for (const key of keys2) { + const typedKey = keyConverter(key); + const typedValue = valueConverter(O[key]); + result[typedKey] = typedValue; + } + return result; + } + const keys = Reflect.ownKeys(O); + for (const key of keys) { + const desc = Reflect.getOwnPropertyDescriptor(O, key); + if (desc?.enumerable) { + const typedKey = keyConverter(key); + const typedValue = valueConverter(O[key]); + result[typedKey] = typedValue; + } + } + return result; + }; + }; + webidl.interfaceConverter = function(i) { + return (V, opts = {}) => { + if (opts.strict !== false && !(V instanceof i)) { + throw webidl.errors.exception({ + header: i.name, + message: `Expected ${V} to be an instance of ${i.name}.` + }); + } + return V; + }; + }; + webidl.dictionaryConverter = function(converters) { + return (dictionary) => { + const type = webidl.util.Type(dictionary); + const dict = {}; + if (type === "Null" || type === "Undefined") { + return dict; + } else if (type !== "Object") { + throw webidl.errors.exception({ + header: "Dictionary", + message: `Expected ${dictionary} to be one of: Null, Undefined, Object.` + }); + } + for (const options of converters) { + const { key, defaultValue, required, converter } = options; + if (required === true) { + if (!hasOwn(dictionary, key)) { + throw webidl.errors.exception({ + header: "Dictionary", + message: `Missing required key "${key}".` + }); + } + } + let value = dictionary[key]; + const hasDefault = hasOwn(options, "defaultValue"); + if (hasDefault && value !== null) { + value = value ?? defaultValue; + } + if (required || hasDefault || value !== undefined) { + value = converter(value); + if (options.allowedValues && !options.allowedValues.includes(value)) { + throw webidl.errors.exception({ + header: "Dictionary", + message: `${value} is not an accepted type. Expected one of ${options.allowedValues.join(", ")}.` + }); + } + dict[key] = value; + } + } + return dict; + }; + }; + webidl.nullableConverter = function(converter) { + return (V) => { + if (V === null) { + return V; + } + return converter(V); + }; + }; + webidl.converters.DOMString = function(V, opts = {}) { + if (V === null && opts.legacyNullToEmptyString) { + return ""; + } + if (typeof V === "symbol") { + throw new TypeError("Could not convert argument of type symbol to string."); + } + return String(V); + }; + webidl.converters.ByteString = function(V) { + const x = webidl.converters.DOMString(V); + for (let index = 0;index < x.length; index++) { + if (x.charCodeAt(index) > 255) { + throw new TypeError("Cannot convert argument to a ByteString because the character at " + `index ${index} has a value of ${x.charCodeAt(index)} which is greater than 255.`); + } + } + return x; + }; + webidl.converters.USVString = toUSVString; + webidl.converters.boolean = function(V) { + const x = Boolean(V); + return x; + }; + webidl.converters.any = function(V) { + return V; + }; + webidl.converters["long long"] = function(V) { + const x = webidl.util.ConvertToInt(V, 64, "signed"); + return x; + }; + webidl.converters["unsigned long long"] = function(V) { + const x = webidl.util.ConvertToInt(V, 64, "unsigned"); + return x; + }; + webidl.converters["unsigned long"] = function(V) { + const x = webidl.util.ConvertToInt(V, 32, "unsigned"); + return x; + }; + webidl.converters["unsigned short"] = function(V, opts) { + const x = webidl.util.ConvertToInt(V, 16, "unsigned", opts); + return x; + }; + webidl.converters.ArrayBuffer = function(V, opts = {}) { + if (webidl.util.Type(V) !== "Object" || !types.isAnyArrayBuffer(V)) { + throw webidl.errors.conversionFailed({ + prefix: `${V}`, + argument: `${V}`, + types: ["ArrayBuffer"] + }); + } + if (opts.allowShared === false && types.isSharedArrayBuffer(V)) { + throw webidl.errors.exception({ + header: "ArrayBuffer", + message: "SharedArrayBuffer is not allowed." + }); + } + return V; + }; + webidl.converters.TypedArray = function(V, T, opts = {}) { + if (webidl.util.Type(V) !== "Object" || !types.isTypedArray(V) || V.constructor.name !== T.name) { + throw webidl.errors.conversionFailed({ + prefix: `${T.name}`, + argument: `${V}`, + types: [T.name] + }); + } + if (opts.allowShared === false && types.isSharedArrayBuffer(V.buffer)) { + throw webidl.errors.exception({ + header: "ArrayBuffer", + message: "SharedArrayBuffer is not allowed." + }); + } + return V; + }; + webidl.converters.DataView = function(V, opts = {}) { + if (webidl.util.Type(V) !== "Object" || !types.isDataView(V)) { + throw webidl.errors.exception({ + header: "DataView", + message: "Object is not a DataView." + }); + } + if (opts.allowShared === false && types.isSharedArrayBuffer(V.buffer)) { + throw webidl.errors.exception({ + header: "ArrayBuffer", + message: "SharedArrayBuffer is not allowed." + }); + } + return V; + }; + webidl.converters.BufferSource = function(V, opts = {}) { + if (types.isAnyArrayBuffer(V)) { + return webidl.converters.ArrayBuffer(V, opts); + } + if (types.isTypedArray(V)) { + return webidl.converters.TypedArray(V, V.constructor); + } + if (types.isDataView(V)) { + return webidl.converters.DataView(V, opts); + } + throw new TypeError(`Could not convert ${V} to a BufferSource.`); + }; + webidl.converters["sequence"] = webidl.sequenceConverter(webidl.converters.ByteString); + webidl.converters["sequence>"] = webidl.sequenceConverter(webidl.converters["sequence"]); + webidl.converters["record"] = webidl.recordConverter(webidl.converters.ByteString, webidl.converters.ByteString); + module2.exports = { + webidl + }; +}); + +// node_modules/undici/lib/fetch/dataURL.js +var require_dataURL = __commonJS((exports2, module2) => { + var assert = require("assert"); + var { atob: atob2 } = require("buffer"); + var { isomorphicDecode } = require_util2(); + var encoder = new TextEncoder; + var HTTP_TOKEN_CODEPOINTS = /^[!#$%&'*+-.^_|~A-Za-z0-9]+$/; + var HTTP_WHITESPACE_REGEX = /(\u000A|\u000D|\u0009|\u0020)/; + var HTTP_QUOTED_STRING_TOKENS = /[\u0009|\u0020-\u007E|\u0080-\u00FF]/; + function dataURLProcessor(dataURL) { + assert(dataURL.protocol === "data:"); + let input = URLSerializer(dataURL, true); + input = input.slice(5); + const position = { position: 0 }; + let mimeType = collectASequenceOfCodePointsFast(",", input, position); + const mimeTypeLength = mimeType.length; + mimeType = removeASCIIWhitespace(mimeType, true, true); + if (position.position >= input.length) { + return "failure"; + } + position.position++; + const encodedBody = input.slice(mimeTypeLength + 1); + let body = stringPercentDecode(encodedBody); + if (/;(\u0020){0,}base64$/i.test(mimeType)) { + const stringBody = isomorphicDecode(body); + body = forgivingBase64(stringBody); + if (body === "failure") { + return "failure"; + } + mimeType = mimeType.slice(0, -6); + mimeType = mimeType.replace(/(\u0020)+$/, ""); + mimeType = mimeType.slice(0, -1); + } + if (mimeType.startsWith(";")) { + mimeType = "text/plain" + mimeType; + } + let mimeTypeRecord = parseMIMEType(mimeType); + if (mimeTypeRecord === "failure") { + mimeTypeRecord = parseMIMEType("text/plain;charset=US-ASCII"); + } + return { mimeType: mimeTypeRecord, body }; + } + function URLSerializer(url, excludeFragment = false) { + if (!excludeFragment) { + return url.href; + } + const href = url.href; + const hashLength = url.hash.length; + return hashLength === 0 ? href : href.substring(0, href.length - hashLength); + } + function collectASequenceOfCodePoints(condition, input, position) { + let result = ""; + while (position.position < input.length && condition(input[position.position])) { + result += input[position.position]; + position.position++; + } + return result; + } + function collectASequenceOfCodePointsFast(char, input, position) { + const idx = input.indexOf(char, position.position); + const start = position.position; + if (idx === -1) { + position.position = input.length; + return input.slice(start); + } + position.position = idx; + return input.slice(start, position.position); + } + function stringPercentDecode(input) { + const bytes = encoder.encode(input); + return percentDecode(bytes); + } + function percentDecode(input) { + const output = []; + for (let i = 0;i < input.length; i++) { + const byte = input[i]; + if (byte !== 37) { + output.push(byte); + } else if (byte === 37 && !/^[0-9A-Fa-f]{2}$/i.test(String.fromCharCode(input[i + 1], input[i + 2]))) { + output.push(37); + } else { + const nextTwoBytes = String.fromCharCode(input[i + 1], input[i + 2]); + const bytePoint = Number.parseInt(nextTwoBytes, 16); + output.push(bytePoint); + i += 2; + } + } + return Uint8Array.from(output); + } + function parseMIMEType(input) { + input = removeHTTPWhitespace(input, true, true); + const position = { position: 0 }; + const type = collectASequenceOfCodePointsFast("/", input, position); + if (type.length === 0 || !HTTP_TOKEN_CODEPOINTS.test(type)) { + return "failure"; + } + if (position.position > input.length) { + return "failure"; + } + position.position++; + let subtype = collectASequenceOfCodePointsFast(";", input, position); + subtype = removeHTTPWhitespace(subtype, false, true); + if (subtype.length === 0 || !HTTP_TOKEN_CODEPOINTS.test(subtype)) { + return "failure"; + } + const typeLowercase = type.toLowerCase(); + const subtypeLowercase = subtype.toLowerCase(); + const mimeType = { + type: typeLowercase, + subtype: subtypeLowercase, + parameters: new Map, + essence: `${typeLowercase}/${subtypeLowercase}` + }; + while (position.position < input.length) { + position.position++; + collectASequenceOfCodePoints((char) => HTTP_WHITESPACE_REGEX.test(char), input, position); + let parameterName = collectASequenceOfCodePoints((char) => char !== ";" && char !== "=", input, position); + parameterName = parameterName.toLowerCase(); + if (position.position < input.length) { + if (input[position.position] === ";") { + continue; + } + position.position++; + } + if (position.position > input.length) { + break; + } + let parameterValue = null; + if (input[position.position] === '"') { + parameterValue = collectAnHTTPQuotedString(input, position, true); + collectASequenceOfCodePointsFast(";", input, position); + } else { + parameterValue = collectASequenceOfCodePointsFast(";", input, position); + parameterValue = removeHTTPWhitespace(parameterValue, false, true); + if (parameterValue.length === 0) { + continue; + } + } + if (parameterName.length !== 0 && HTTP_TOKEN_CODEPOINTS.test(parameterName) && (parameterValue.length === 0 || HTTP_QUOTED_STRING_TOKENS.test(parameterValue)) && !mimeType.parameters.has(parameterName)) { + mimeType.parameters.set(parameterName, parameterValue); + } + } + return mimeType; + } + function forgivingBase64(data) { + data = data.replace(/[\u0009\u000A\u000C\u000D\u0020]/g, ""); + if (data.length % 4 === 0) { + data = data.replace(/=?=$/, ""); + } + if (data.length % 4 === 1) { + return "failure"; + } + if (/[^+/0-9A-Za-z]/.test(data)) { + return "failure"; + } + const binary = atob2(data); + const bytes = new Uint8Array(binary.length); + for (let byte = 0;byte < binary.length; byte++) { + bytes[byte] = binary.charCodeAt(byte); + } + return bytes; + } + function collectAnHTTPQuotedString(input, position, extractValue) { + const positionStart = position.position; + let value = ""; + assert(input[position.position] === '"'); + position.position++; + while (true) { + value += collectASequenceOfCodePoints((char) => char !== '"' && char !== "\\", input, position); + if (position.position >= input.length) { + break; + } + const quoteOrBackslash = input[position.position]; + position.position++; + if (quoteOrBackslash === "\\") { + if (position.position >= input.length) { + value += "\\"; + break; + } + value += input[position.position]; + position.position++; + } else { + assert(quoteOrBackslash === '"'); + break; + } + } + if (extractValue) { + return value; + } + return input.slice(positionStart, position.position); + } + function serializeAMimeType(mimeType) { + assert(mimeType !== "failure"); + const { parameters, essence } = mimeType; + let serialization = essence; + for (let [name, value] of parameters.entries()) { + serialization += ";"; + serialization += name; + serialization += "="; + if (!HTTP_TOKEN_CODEPOINTS.test(value)) { + value = value.replace(/(\\|")/g, "\\$1"); + value = '"' + value; + value += '"'; + } + serialization += value; + } + return serialization; + } + function isHTTPWhiteSpace(char) { + return char === "\r" || char === "\n" || char === "\t" || char === " "; + } + function removeHTTPWhitespace(str, leading = true, trailing = true) { + let lead = 0; + let trail = str.length - 1; + if (leading) { + for (;lead < str.length && isHTTPWhiteSpace(str[lead]); lead++) + ; + } + if (trailing) { + for (;trail > 0 && isHTTPWhiteSpace(str[trail]); trail--) + ; + } + return str.slice(lead, trail + 1); + } + function isASCIIWhitespace(char) { + return char === "\r" || char === "\n" || char === "\t" || char === "\f" || char === " "; + } + function removeASCIIWhitespace(str, leading = true, trailing = true) { + let lead = 0; + let trail = str.length - 1; + if (leading) { + for (;lead < str.length && isASCIIWhitespace(str[lead]); lead++) + ; + } + if (trailing) { + for (;trail > 0 && isASCIIWhitespace(str[trail]); trail--) + ; + } + return str.slice(lead, trail + 1); + } + module2.exports = { + dataURLProcessor, + URLSerializer, + collectASequenceOfCodePoints, + collectASequenceOfCodePointsFast, + stringPercentDecode, + parseMIMEType, + collectAnHTTPQuotedString, + serializeAMimeType + }; +}); + +// node_modules/undici/lib/fetch/file.js +var require_file = __commonJS((exports2, module2) => { + var { Blob: Blob2, File: NativeFile } = require("buffer"); + var { types } = require("util"); + var { kState } = require_symbols2(); + var { isBlobLike } = require_util2(); + var { webidl } = require_webidl(); + var { parseMIMEType, serializeAMimeType } = require_dataURL(); + var { kEnumerableProperty } = require_util(); + var encoder = new TextEncoder; + + class File2 extends Blob2 { + constructor(fileBits, fileName, options = {}) { + webidl.argumentLengthCheck(arguments, 2, { header: "File constructor" }); + fileBits = webidl.converters["sequence"](fileBits); + fileName = webidl.converters.USVString(fileName); + options = webidl.converters.FilePropertyBag(options); + const n = fileName; + let t = options.type; + let d; + substep: { + if (t) { + t = parseMIMEType(t); + if (t === "failure") { + t = ""; + break substep; + } + t = serializeAMimeType(t).toLowerCase(); + } + d = options.lastModified; + } + super(processBlobParts(fileBits, options), { type: t }); + this[kState] = { + name: n, + lastModified: d, + type: t + }; + } + get name() { + webidl.brandCheck(this, File2); + return this[kState].name; + } + get lastModified() { + webidl.brandCheck(this, File2); + return this[kState].lastModified; + } + get type() { + webidl.brandCheck(this, File2); + return this[kState].type; + } + } + + class FileLike { + constructor(blobLike, fileName, options = {}) { + const n = fileName; + const t = options.type; + const d = options.lastModified ?? Date.now(); + this[kState] = { + blobLike, + name: n, + type: t, + lastModified: d + }; + } + stream(...args) { + webidl.brandCheck(this, FileLike); + return this[kState].blobLike.stream(...args); + } + arrayBuffer(...args) { + webidl.brandCheck(this, FileLike); + return this[kState].blobLike.arrayBuffer(...args); + } + slice(...args) { + webidl.brandCheck(this, FileLike); + return this[kState].blobLike.slice(...args); + } + text(...args) { + webidl.brandCheck(this, FileLike); + return this[kState].blobLike.text(...args); + } + get size() { + webidl.brandCheck(this, FileLike); + return this[kState].blobLike.size; + } + get type() { + webidl.brandCheck(this, FileLike); + return this[kState].blobLike.type; + } + get name() { + webidl.brandCheck(this, FileLike); + return this[kState].name; + } + get lastModified() { + webidl.brandCheck(this, FileLike); + return this[kState].lastModified; + } + get [Symbol.toStringTag]() { + return "File"; + } + } + Object.defineProperties(File2.prototype, { + [Symbol.toStringTag]: { + value: "File", + configurable: true + }, + name: kEnumerableProperty, + lastModified: kEnumerableProperty + }); + webidl.converters.Blob = webidl.interfaceConverter(Blob2); + webidl.converters.BlobPart = function(V, opts) { + if (webidl.util.Type(V) === "Object") { + if (isBlobLike(V)) { + return webidl.converters.Blob(V, { strict: false }); + } + if (ArrayBuffer.isView(V) || types.isAnyArrayBuffer(V)) { + return webidl.converters.BufferSource(V, opts); + } + } + return webidl.converters.USVString(V, opts); + }; + webidl.converters["sequence"] = webidl.sequenceConverter(webidl.converters.BlobPart); + webidl.converters.FilePropertyBag = webidl.dictionaryConverter([ + { + key: "lastModified", + converter: webidl.converters["long long"], + get defaultValue() { + return Date.now(); + } + }, + { + key: "type", + converter: webidl.converters.DOMString, + defaultValue: "" + }, + { + key: "endings", + converter: (value) => { + value = webidl.converters.DOMString(value); + value = value.toLowerCase(); + if (value !== "native") { + value = "transparent"; + } + return value; + }, + defaultValue: "transparent" + } + ]); + function processBlobParts(parts, options) { + const bytes = []; + for (const element of parts) { + if (typeof element === "string") { + let s = element; + if (options.endings === "native") { + s = convertLineEndingsNative(s); + } + bytes.push(encoder.encode(s)); + } else if (types.isAnyArrayBuffer(element) || types.isTypedArray(element)) { + if (!element.buffer) { + bytes.push(new Uint8Array(element)); + } else { + bytes.push(new Uint8Array(element.buffer, element.byteOffset, element.byteLength)); + } + } else if (isBlobLike(element)) { + bytes.push(element); + } + } + return bytes; + } + function convertLineEndingsNative(s) { + let nativeLineEnding = "\n"; + if (process.platform === "win32") { + nativeLineEnding = "\r\n"; + } + return s.replace(/\r?\n/g, nativeLineEnding); + } + function isFileLike(object) { + return NativeFile && object instanceof NativeFile || object instanceof File2 || object && (typeof object.stream === "function" || typeof object.arrayBuffer === "function") && object[Symbol.toStringTag] === "File"; + } + module2.exports = { File: File2, FileLike, isFileLike }; +}); + +// node_modules/undici/lib/fetch/formdata.js +var require_formdata = __commonJS((exports2, module2) => { + var { isBlobLike, toUSVString, makeIterator } = require_util2(); + var { kState } = require_symbols2(); + var { File: UndiciFile, FileLike, isFileLike } = require_file(); + var { webidl } = require_webidl(); + var { Blob: Blob2, File: NativeFile } = require("buffer"); + var File2 = NativeFile ?? UndiciFile; + + class FormData2 { + constructor(form) { + if (form !== undefined) { + throw webidl.errors.conversionFailed({ + prefix: "FormData constructor", + argument: "Argument 1", + types: ["undefined"] + }); + } + this[kState] = []; + } + append(name, value, filename = undefined) { + webidl.brandCheck(this, FormData2); + webidl.argumentLengthCheck(arguments, 2, { header: "FormData.append" }); + if (arguments.length === 3 && !isBlobLike(value)) { + throw new TypeError("Failed to execute 'append' on 'FormData': parameter 2 is not of type 'Blob'"); + } + name = webidl.converters.USVString(name); + value = isBlobLike(value) ? webidl.converters.Blob(value, { strict: false }) : webidl.converters.USVString(value); + filename = arguments.length === 3 ? webidl.converters.USVString(filename) : undefined; + const entry = makeEntry(name, value, filename); + this[kState].push(entry); + } + delete(name) { + webidl.brandCheck(this, FormData2); + webidl.argumentLengthCheck(arguments, 1, { header: "FormData.delete" }); + name = webidl.converters.USVString(name); + this[kState] = this[kState].filter((entry) => entry.name !== name); + } + get(name) { + webidl.brandCheck(this, FormData2); + webidl.argumentLengthCheck(arguments, 1, { header: "FormData.get" }); + name = webidl.converters.USVString(name); + const idx = this[kState].findIndex((entry) => entry.name === name); + if (idx === -1) { + return null; + } + return this[kState][idx].value; + } + getAll(name) { + webidl.brandCheck(this, FormData2); + webidl.argumentLengthCheck(arguments, 1, { header: "FormData.getAll" }); + name = webidl.converters.USVString(name); + return this[kState].filter((entry) => entry.name === name).map((entry) => entry.value); + } + has(name) { + webidl.brandCheck(this, FormData2); + webidl.argumentLengthCheck(arguments, 1, { header: "FormData.has" }); + name = webidl.converters.USVString(name); + return this[kState].findIndex((entry) => entry.name === name) !== -1; + } + set(name, value, filename = undefined) { + webidl.brandCheck(this, FormData2); + webidl.argumentLengthCheck(arguments, 2, { header: "FormData.set" }); + if (arguments.length === 3 && !isBlobLike(value)) { + throw new TypeError("Failed to execute 'set' on 'FormData': parameter 2 is not of type 'Blob'"); + } + name = webidl.converters.USVString(name); + value = isBlobLike(value) ? webidl.converters.Blob(value, { strict: false }) : webidl.converters.USVString(value); + filename = arguments.length === 3 ? toUSVString(filename) : undefined; + const entry = makeEntry(name, value, filename); + const idx = this[kState].findIndex((entry2) => entry2.name === name); + if (idx !== -1) { + this[kState] = [ + ...this[kState].slice(0, idx), + entry, + ...this[kState].slice(idx + 1).filter((entry2) => entry2.name !== name) + ]; + } else { + this[kState].push(entry); + } + } + entries() { + webidl.brandCheck(this, FormData2); + return makeIterator(() => this[kState].map((pair) => [pair.name, pair.value]), "FormData", "key+value"); + } + keys() { + webidl.brandCheck(this, FormData2); + return makeIterator(() => this[kState].map((pair) => [pair.name, pair.value]), "FormData", "key"); + } + values() { + webidl.brandCheck(this, FormData2); + return makeIterator(() => this[kState].map((pair) => [pair.name, pair.value]), "FormData", "value"); + } + forEach(callbackFn, thisArg = globalThis) { + webidl.brandCheck(this, FormData2); + webidl.argumentLengthCheck(arguments, 1, { header: "FormData.forEach" }); + if (typeof callbackFn !== "function") { + throw new TypeError("Failed to execute 'forEach' on 'FormData': parameter 1 is not of type 'Function'."); + } + for (const [key, value] of this) { + callbackFn.apply(thisArg, [value, key, this]); + } + } + } + FormData2.prototype[Symbol.iterator] = FormData2.prototype.entries; + Object.defineProperties(FormData2.prototype, { + [Symbol.toStringTag]: { + value: "FormData", + configurable: true + } + }); + function makeEntry(name, value, filename) { + name = Buffer.from(name).toString("utf8"); + if (typeof value === "string") { + value = Buffer.from(value).toString("utf8"); + } else { + if (!isFileLike(value)) { + value = value instanceof Blob2 ? new File2([value], "blob", { type: value.type }) : new FileLike(value, "blob", { type: value.type }); + } + if (filename !== undefined) { + const options = { + type: value.type, + lastModified: value.lastModified + }; + value = NativeFile && value instanceof NativeFile || value instanceof UndiciFile ? new File2([value], filename, options) : new FileLike(value, filename, options); + } + } + return { name, value }; + } + module2.exports = { FormData: FormData2 }; +}); + +// node_modules/undici/lib/fetch/body.js +var require_body = __commonJS((exports2, module2) => { + var Busboy = require_main(); + var util = require_util(); + var { + ReadableStreamFrom, + isBlobLike, + isReadableStreamLike, + readableStreamClose, + createDeferredPromise, + fullyReadBody + } = require_util2(); + var { FormData: FormData2 } = require_formdata(); + var { kState } = require_symbols2(); + var { webidl } = require_webidl(); + var { DOMException: DOMException2, structuredClone } = require_constants2(); + var { Blob: Blob2, File: NativeFile } = require("buffer"); + var { kBodyUsed } = require_symbols(); + var assert = require("assert"); + var { isErrored } = require_util(); + var { isUint8Array, isArrayBuffer } = require("util/types"); + var { File: UndiciFile } = require_file(); + var { parseMIMEType, serializeAMimeType } = require_dataURL(); + var ReadableStream2 = globalThis.ReadableStream; + var File2 = NativeFile ?? UndiciFile; + var textEncoder = new TextEncoder; + var textDecoder = new TextDecoder; + function extractBody(object, keepalive = false) { + if (!ReadableStream2) { + ReadableStream2 = require("stream/web").ReadableStream; + } + let stream = null; + if (object instanceof ReadableStream2) { + stream = object; + } else if (isBlobLike(object)) { + stream = object.stream(); + } else { + stream = new ReadableStream2({ + async pull(controller) { + controller.enqueue(typeof source === "string" ? textEncoder.encode(source) : source); + queueMicrotask(() => readableStreamClose(controller)); + }, + start() { + }, + type: undefined + }); + } + assert(isReadableStreamLike(stream)); + let action = null; + let source = null; + let length = null; + let type = null; + if (typeof object === "string") { + source = object; + type = "text/plain;charset=UTF-8"; + } else if (object instanceof URLSearchParams) { + source = object.toString(); + type = "application/x-www-form-urlencoded;charset=UTF-8"; + } else if (isArrayBuffer(object)) { + source = new Uint8Array(object.slice()); + } else if (ArrayBuffer.isView(object)) { + source = new Uint8Array(object.buffer.slice(object.byteOffset, object.byteOffset + object.byteLength)); + } else if (util.isFormDataLike(object)) { + const boundary = `----formdata-undici-0${`${Math.floor(Math.random() * 100000000000)}`.padStart(11, "0")}`; + const prefix = `--${boundary}\r\nContent-Disposition: form-data`; + /*! formdata-polyfill. MIT License. Jimmy Wärting */ + const escape = (str) => str.replace(/\n/g, "%0A").replace(/\r/g, "%0D").replace(/"/g, "%22"); + const normalizeLinefeeds = (value) => value.replace(/\r?\n|\r/g, "\r\n"); + const blobParts = []; + const rn = new Uint8Array([13, 10]); + length = 0; + let hasUnknownSizeValue = false; + for (const [name, value] of object) { + if (typeof value === "string") { + const chunk2 = textEncoder.encode(prefix + `; name="${escape(normalizeLinefeeds(name))}"` + `\r\n\r\n${normalizeLinefeeds(value)}\r\n`); + blobParts.push(chunk2); + length += chunk2.byteLength; + } else { + const chunk2 = textEncoder.encode(`${prefix}; name="${escape(normalizeLinefeeds(name))}"` + (value.name ? `; filename="${escape(value.name)}"` : "") + "\r\n" + `Content-Type: ${value.type || "application/octet-stream"}\r\n\r\n`); + blobParts.push(chunk2, value, rn); + if (typeof value.size === "number") { + length += chunk2.byteLength + value.size + rn.byteLength; + } else { + hasUnknownSizeValue = true; + } + } + } + const chunk = textEncoder.encode(`--${boundary}--`); + blobParts.push(chunk); + length += chunk.byteLength; + if (hasUnknownSizeValue) { + length = null; + } + source = object; + action = async function* () { + for (const part of blobParts) { + if (part.stream) { + yield* part.stream(); + } else { + yield part; + } + } + }; + type = "multipart/form-data; boundary=" + boundary; + } else if (isBlobLike(object)) { + source = object; + length = object.size; + if (object.type) { + type = object.type; + } + } else if (typeof object[Symbol.asyncIterator] === "function") { + if (keepalive) { + throw new TypeError("keepalive"); + } + if (util.isDisturbed(object) || object.locked) { + throw new TypeError("Response body object should not be disturbed or locked"); + } + stream = object instanceof ReadableStream2 ? object : ReadableStreamFrom(object); + } + if (typeof source === "string" || util.isBuffer(source)) { + length = Buffer.byteLength(source); + } + if (action != null) { + let iterator; + stream = new ReadableStream2({ + async start() { + iterator = action(object)[Symbol.asyncIterator](); + }, + async pull(controller) { + const { value, done } = await iterator.next(); + if (done) { + queueMicrotask(() => { + controller.close(); + }); + } else { + if (!isErrored(stream)) { + controller.enqueue(new Uint8Array(value)); + } + } + return controller.desiredSize > 0; + }, + async cancel(reason) { + await iterator.return(); + }, + type: undefined + }); + } + const body = { stream, source, length }; + return [body, type]; + } + function safelyExtractBody(object, keepalive = false) { + if (!ReadableStream2) { + ReadableStream2 = require("stream/web").ReadableStream; + } + if (object instanceof ReadableStream2) { + assert(!util.isDisturbed(object), "The body has already been consumed."); + assert(!object.locked, "The stream is locked."); + } + return extractBody(object, keepalive); + } + function cloneBody(body) { + const [out1, out2] = body.stream.tee(); + const out2Clone = structuredClone(out2, { transfer: [out2] }); + const [, finalClone] = out2Clone.tee(); + body.stream = out1; + return { + stream: finalClone, + length: body.length, + source: body.source + }; + } + async function* consumeBody(body) { + if (body) { + if (isUint8Array(body)) { + yield body; + } else { + const stream = body.stream; + if (util.isDisturbed(stream)) { + throw new TypeError("The body has already been consumed."); + } + if (stream.locked) { + throw new TypeError("The stream is locked."); + } + stream[kBodyUsed] = true; + yield* stream; + } + } + } + function throwIfAborted(state) { + if (state.aborted) { + throw new DOMException2("The operation was aborted.", "AbortError"); + } + } + function bodyMixinMethods(instance) { + const methods = { + blob() { + return specConsumeBody(this, (bytes) => { + let mimeType = bodyMimeType(this); + if (mimeType === "failure") { + mimeType = ""; + } else if (mimeType) { + mimeType = serializeAMimeType(mimeType); + } + return new Blob2([bytes], { type: mimeType }); + }, instance); + }, + arrayBuffer() { + return specConsumeBody(this, (bytes) => { + return new Uint8Array(bytes).buffer; + }, instance); + }, + text() { + return specConsumeBody(this, utf8DecodeBytes, instance); + }, + json() { + return specConsumeBody(this, parseJSONFromBytes, instance); + }, + async formData() { + webidl.brandCheck(this, instance); + throwIfAborted(this[kState]); + const contentType = this.headers.get("Content-Type"); + if (/multipart\/form-data/.test(contentType)) { + const headers = {}; + for (const [key, value] of this.headers) + headers[key.toLowerCase()] = value; + const responseFormData = new FormData2; + let busboy; + try { + busboy = new Busboy({ + headers, + preservePath: true + }); + } catch (err) { + throw new DOMException2(`${err}`, "AbortError"); + } + busboy.on("field", (name, value) => { + responseFormData.append(name, value); + }); + busboy.on("file", (name, value, filename, encoding, mimeType) => { + const chunks = []; + if (encoding === "base64" || encoding.toLowerCase() === "base64") { + let base64chunk = ""; + value.on("data", (chunk) => { + base64chunk += chunk.toString().replace(/[\r\n]/gm, ""); + const end = base64chunk.length - base64chunk.length % 4; + chunks.push(Buffer.from(base64chunk.slice(0, end), "base64")); + base64chunk = base64chunk.slice(end); + }); + value.on("end", () => { + chunks.push(Buffer.from(base64chunk, "base64")); + responseFormData.append(name, new File2(chunks, filename, { type: mimeType })); + }); + } else { + value.on("data", (chunk) => { + chunks.push(chunk); + }); + value.on("end", () => { + responseFormData.append(name, new File2(chunks, filename, { type: mimeType })); + }); + } + }); + const busboyResolve = new Promise((resolve, reject) => { + busboy.on("finish", resolve); + busboy.on("error", (err) => reject(new TypeError(err))); + }); + if (this.body !== null) + for await (const chunk of consumeBody(this[kState].body)) + busboy.write(chunk); + busboy.end(); + await busboyResolve; + return responseFormData; + } else if (/application\/x-www-form-urlencoded/.test(contentType)) { + let entries; + try { + let text = ""; + const streamingDecoder = new TextDecoder("utf-8", { ignoreBOM: true }); + for await (const chunk of consumeBody(this[kState].body)) { + if (!isUint8Array(chunk)) { + throw new TypeError("Expected Uint8Array chunk"); + } + text += streamingDecoder.decode(chunk, { stream: true }); + } + text += streamingDecoder.decode(); + entries = new URLSearchParams(text); + } catch (err) { + throw Object.assign(new TypeError, { cause: err }); + } + const formData = new FormData2; + for (const [name, value] of entries) { + formData.append(name, value); + } + return formData; + } else { + await Promise.resolve(); + throwIfAborted(this[kState]); + throw webidl.errors.exception({ + header: `${instance.name}.formData`, + message: "Could not parse content as FormData." + }); + } + } + }; + return methods; + } + function mixinBody(prototype) { + Object.assign(prototype.prototype, bodyMixinMethods(prototype)); + } + async function specConsumeBody(object, convertBytesToJSValue, instance) { + webidl.brandCheck(object, instance); + throwIfAborted(object[kState]); + if (bodyUnusable(object[kState].body)) { + throw new TypeError("Body is unusable"); + } + const promise = createDeferredPromise(); + const errorSteps = (error) => promise.reject(error); + const successSteps = (data) => { + try { + promise.resolve(convertBytesToJSValue(data)); + } catch (e) { + errorSteps(e); + } + }; + if (object[kState].body == null) { + successSteps(new Uint8Array); + return promise.promise; + } + await fullyReadBody(object[kState].body, successSteps, errorSteps); + return promise.promise; + } + function bodyUnusable(body) { + return body != null && (body.stream.locked || util.isDisturbed(body.stream)); + } + function utf8DecodeBytes(buffer) { + if (buffer.length === 0) { + return ""; + } + if (buffer[0] === 239 && buffer[1] === 187 && buffer[2] === 191) { + buffer = buffer.subarray(3); + } + const output = textDecoder.decode(buffer); + return output; + } + function parseJSONFromBytes(bytes) { + return JSON.parse(utf8DecodeBytes(bytes)); + } + function bodyMimeType(object) { + const { headersList } = object[kState]; + const contentType = headersList.get("content-type"); + if (contentType === null) { + return "failure"; + } + return parseMIMEType(contentType); + } + module2.exports = { + extractBody, + safelyExtractBody, + cloneBody, + mixinBody + }; +}); + +// node_modules/undici/lib/core/request.js +var require_request = __commonJS((exports2, module2) => { + var { + InvalidArgumentError, + NotSupportedError + } = require_errors(); + var assert = require("assert"); + var { kHTTP2BuildRequest, kHTTP2CopyHeaders, kHTTP1BuildRequest } = require_symbols(); + var util = require_util(); + var tokenRegExp = /^[\^_`a-zA-Z\-0-9!#$%&'*+.|~]+$/; + var headerCharRegex = /[^\t\x20-\x7e\x80-\xff]/; + var invalidPathRegex = /[^\u0021-\u00ff]/; + var kHandler = Symbol("handler"); + var channels = {}; + var extractBody; + try { + const diagnosticsChannel = require("diagnostics_channel"); + channels.create = diagnosticsChannel.channel("undici:request:create"); + channels.bodySent = diagnosticsChannel.channel("undici:request:bodySent"); + channels.headers = diagnosticsChannel.channel("undici:request:headers"); + channels.trailers = diagnosticsChannel.channel("undici:request:trailers"); + channels.error = diagnosticsChannel.channel("undici:request:error"); + } catch { + channels.create = { hasSubscribers: false }; + channels.bodySent = { hasSubscribers: false }; + channels.headers = { hasSubscribers: false }; + channels.trailers = { hasSubscribers: false }; + channels.error = { hasSubscribers: false }; + } + + class Request { + constructor(origin, { + path, + method, + body, + headers, + query, + idempotent, + blocking, + upgrade, + headersTimeout, + bodyTimeout, + reset, + throwOnError, + expectContinue + }, handler) { + if (typeof path !== "string") { + throw new InvalidArgumentError("path must be a string"); + } else if (path[0] !== "/" && !(path.startsWith("http://") || path.startsWith("https://")) && method !== "CONNECT") { + throw new InvalidArgumentError("path must be an absolute URL or start with a slash"); + } else if (invalidPathRegex.exec(path) !== null) { + throw new InvalidArgumentError("invalid request path"); + } + if (typeof method !== "string") { + throw new InvalidArgumentError("method must be a string"); + } else if (tokenRegExp.exec(method) === null) { + throw new InvalidArgumentError("invalid request method"); + } + if (upgrade && typeof upgrade !== "string") { + throw new InvalidArgumentError("upgrade must be a string"); + } + if (headersTimeout != null && (!Number.isFinite(headersTimeout) || headersTimeout < 0)) { + throw new InvalidArgumentError("invalid headersTimeout"); + } + if (bodyTimeout != null && (!Number.isFinite(bodyTimeout) || bodyTimeout < 0)) { + throw new InvalidArgumentError("invalid bodyTimeout"); + } + if (reset != null && typeof reset !== "boolean") { + throw new InvalidArgumentError("invalid reset"); + } + if (expectContinue != null && typeof expectContinue !== "boolean") { + throw new InvalidArgumentError("invalid expectContinue"); + } + this.headersTimeout = headersTimeout; + this.bodyTimeout = bodyTimeout; + this.throwOnError = throwOnError === true; + this.method = method; + this.abort = null; + if (body == null) { + this.body = null; + } else if (util.isStream(body)) { + this.body = body; + const rState = this.body._readableState; + if (!rState || !rState.autoDestroy) { + this.endHandler = function autoDestroy() { + util.destroy(this); + }; + this.body.on("end", this.endHandler); + } + this.errorHandler = (err) => { + if (this.abort) { + this.abort(err); + } else { + this.error = err; + } + }; + this.body.on("error", this.errorHandler); + } else if (util.isBuffer(body)) { + this.body = body.byteLength ? body : null; + } else if (ArrayBuffer.isView(body)) { + this.body = body.buffer.byteLength ? Buffer.from(body.buffer, body.byteOffset, body.byteLength) : null; + } else if (body instanceof ArrayBuffer) { + this.body = body.byteLength ? Buffer.from(body) : null; + } else if (typeof body === "string") { + this.body = body.length ? Buffer.from(body) : null; + } else if (util.isFormDataLike(body) || util.isIterable(body) || util.isBlobLike(body)) { + this.body = body; + } else { + throw new InvalidArgumentError("body must be a string, a Buffer, a Readable stream, an iterable, or an async iterable"); + } + this.completed = false; + this.aborted = false; + this.upgrade = upgrade || null; + this.path = query ? util.buildURL(path, query) : path; + this.origin = origin; + this.idempotent = idempotent == null ? method === "HEAD" || method === "GET" : idempotent; + this.blocking = blocking == null ? false : blocking; + this.reset = reset == null ? null : reset; + this.host = null; + this.contentLength = null; + this.contentType = null; + this.headers = ""; + this.expectContinue = expectContinue != null ? expectContinue : false; + if (Array.isArray(headers)) { + if (headers.length % 2 !== 0) { + throw new InvalidArgumentError("headers array must be even"); + } + for (let i = 0;i < headers.length; i += 2) { + processHeader(this, headers[i], headers[i + 1]); + } + } else if (headers && typeof headers === "object") { + const keys = Object.keys(headers); + for (let i = 0;i < keys.length; i++) { + const key = keys[i]; + processHeader(this, key, headers[key]); + } + } else if (headers != null) { + throw new InvalidArgumentError("headers must be an object or an array"); + } + if (util.isFormDataLike(this.body)) { + if (util.nodeMajor < 16 || util.nodeMajor === 16 && util.nodeMinor < 8) { + throw new InvalidArgumentError("Form-Data bodies are only supported in node v16.8 and newer."); + } + if (!extractBody) { + extractBody = require_body().extractBody; + } + const [bodyStream, contentType] = extractBody(body); + if (this.contentType == null) { + this.contentType = contentType; + this.headers += `content-type: ${contentType}\r\n`; + } + this.body = bodyStream.stream; + this.contentLength = bodyStream.length; + } else if (util.isBlobLike(body) && this.contentType == null && body.type) { + this.contentType = body.type; + this.headers += `content-type: ${body.type}\r\n`; + } + util.validateHandler(handler, method, upgrade); + this.servername = util.getServerName(this.host); + this[kHandler] = handler; + if (channels.create.hasSubscribers) { + channels.create.publish({ request: this }); + } + } + onBodySent(chunk) { + if (this[kHandler].onBodySent) { + try { + return this[kHandler].onBodySent(chunk); + } catch (err) { + this.abort(err); + } + } + } + onRequestSent() { + if (channels.bodySent.hasSubscribers) { + channels.bodySent.publish({ request: this }); + } + if (this[kHandler].onRequestSent) { + try { + return this[kHandler].onRequestSent(); + } catch (err) { + this.abort(err); + } + } + } + onConnect(abort) { + assert(!this.aborted); + assert(!this.completed); + if (this.error) { + abort(this.error); + } else { + this.abort = abort; + return this[kHandler].onConnect(abort); + } + } + onHeaders(statusCode, headers, resume, statusText) { + assert(!this.aborted); + assert(!this.completed); + if (channels.headers.hasSubscribers) { + channels.headers.publish({ request: this, response: { statusCode, headers, statusText } }); + } + try { + return this[kHandler].onHeaders(statusCode, headers, resume, statusText); + } catch (err) { + this.abort(err); + } + } + onData(chunk) { + assert(!this.aborted); + assert(!this.completed); + try { + return this[kHandler].onData(chunk); + } catch (err) { + this.abort(err); + return false; + } + } + onUpgrade(statusCode, headers, socket) { + assert(!this.aborted); + assert(!this.completed); + return this[kHandler].onUpgrade(statusCode, headers, socket); + } + onComplete(trailers) { + this.onFinally(); + assert(!this.aborted); + this.completed = true; + if (channels.trailers.hasSubscribers) { + channels.trailers.publish({ request: this, trailers }); + } + try { + return this[kHandler].onComplete(trailers); + } catch (err) { + this.onError(err); + } + } + onError(error) { + this.onFinally(); + if (channels.error.hasSubscribers) { + channels.error.publish({ request: this, error }); + } + if (this.aborted) { + return; + } + this.aborted = true; + return this[kHandler].onError(error); + } + onFinally() { + if (this.errorHandler) { + this.body.off("error", this.errorHandler); + this.errorHandler = null; + } + if (this.endHandler) { + this.body.off("end", this.endHandler); + this.endHandler = null; + } + } + addHeader(key, value) { + processHeader(this, key, value); + return this; + } + static [kHTTP1BuildRequest](origin, opts, handler) { + return new Request(origin, opts, handler); + } + static [kHTTP2BuildRequest](origin, opts, handler) { + const headers = opts.headers; + opts = { ...opts, headers: null }; + const request = new Request(origin, opts, handler); + request.headers = {}; + if (Array.isArray(headers)) { + if (headers.length % 2 !== 0) { + throw new InvalidArgumentError("headers array must be even"); + } + for (let i = 0;i < headers.length; i += 2) { + processHeader(request, headers[i], headers[i + 1], true); + } + } else if (headers && typeof headers === "object") { + const keys = Object.keys(headers); + for (let i = 0;i < keys.length; i++) { + const key = keys[i]; + processHeader(request, key, headers[key], true); + } + } else if (headers != null) { + throw new InvalidArgumentError("headers must be an object or an array"); + } + return request; + } + static [kHTTP2CopyHeaders](raw) { + const rawHeaders = raw.split("\r\n"); + const headers = {}; + for (const header of rawHeaders) { + const [key, value] = header.split(": "); + if (value == null || value.length === 0) + continue; + if (headers[key]) + headers[key] += `,${value}`; + else + headers[key] = value; + } + return headers; + } + } + function processHeaderValue(key, val2, skipAppend) { + if (val2 && typeof val2 === "object") { + throw new InvalidArgumentError(`invalid ${key} header`); + } + val2 = val2 != null ? `${val2}` : ""; + if (headerCharRegex.exec(val2) !== null) { + throw new InvalidArgumentError(`invalid ${key} header`); + } + return skipAppend ? val2 : `${key}: ${val2}\r\n`; + } + function processHeader(request, key, val2, skipAppend = false) { + if (val2 && (typeof val2 === "object" && !Array.isArray(val2))) { + throw new InvalidArgumentError(`invalid ${key} header`); + } else if (val2 === undefined) { + return; + } + if (request.host === null && key.length === 4 && key.toLowerCase() === "host") { + if (headerCharRegex.exec(val2) !== null) { + throw new InvalidArgumentError(`invalid ${key} header`); + } + request.host = val2; + } else if (request.contentLength === null && key.length === 14 && key.toLowerCase() === "content-length") { + request.contentLength = parseInt(val2, 10); + if (!Number.isFinite(request.contentLength)) { + throw new InvalidArgumentError("invalid content-length header"); + } + } else if (request.contentType === null && key.length === 12 && key.toLowerCase() === "content-type") { + request.contentType = val2; + if (skipAppend) + request.headers[key] = processHeaderValue(key, val2, skipAppend); + else + request.headers += processHeaderValue(key, val2); + } else if (key.length === 17 && key.toLowerCase() === "transfer-encoding") { + throw new InvalidArgumentError("invalid transfer-encoding header"); + } else if (key.length === 10 && key.toLowerCase() === "connection") { + const value = typeof val2 === "string" ? val2.toLowerCase() : null; + if (value !== "close" && value !== "keep-alive") { + throw new InvalidArgumentError("invalid connection header"); + } else if (value === "close") { + request.reset = true; + } + } else if (key.length === 10 && key.toLowerCase() === "keep-alive") { + throw new InvalidArgumentError("invalid keep-alive header"); + } else if (key.length === 7 && key.toLowerCase() === "upgrade") { + throw new InvalidArgumentError("invalid upgrade header"); + } else if (key.length === 6 && key.toLowerCase() === "expect") { + throw new NotSupportedError("expect header not supported"); + } else if (tokenRegExp.exec(key) === null) { + throw new InvalidArgumentError("invalid header key"); + } else { + if (Array.isArray(val2)) { + for (let i = 0;i < val2.length; i++) { + if (skipAppend) { + if (request.headers[key]) + request.headers[key] += `,${processHeaderValue(key, val2[i], skipAppend)}`; + else + request.headers[key] = processHeaderValue(key, val2[i], skipAppend); + } else { + request.headers += processHeaderValue(key, val2[i]); + } + } + } else { + if (skipAppend) + request.headers[key] = processHeaderValue(key, val2, skipAppend); + else + request.headers += processHeaderValue(key, val2); + } + } + } + module2.exports = Request; +}); + +// node_modules/undici/lib/dispatcher.js +var require_dispatcher = __commonJS((exports2, module2) => { + var EventEmitter = require("events"); + + class Dispatcher extends EventEmitter { + dispatch() { + throw new Error("not implemented"); + } + close() { + throw new Error("not implemented"); + } + destroy() { + throw new Error("not implemented"); + } + } + module2.exports = Dispatcher; +}); + +// node_modules/undici/lib/dispatcher-base.js +var require_dispatcher_base = __commonJS((exports2, module2) => { + var Dispatcher = require_dispatcher(); + var { + ClientDestroyedError, + ClientClosedError, + InvalidArgumentError + } = require_errors(); + var { kDestroy, kClose, kDispatch, kInterceptors } = require_symbols(); + var kDestroyed = Symbol("destroyed"); + var kClosed = Symbol("closed"); + var kOnDestroyed = Symbol("onDestroyed"); + var kOnClosed = Symbol("onClosed"); + var kInterceptedDispatch = Symbol("Intercepted Dispatch"); + + class DispatcherBase extends Dispatcher { + constructor() { + super(); + this[kDestroyed] = false; + this[kOnDestroyed] = null; + this[kClosed] = false; + this[kOnClosed] = []; + } + get destroyed() { + return this[kDestroyed]; + } + get closed() { + return this[kClosed]; + } + get interceptors() { + return this[kInterceptors]; + } + set interceptors(newInterceptors) { + if (newInterceptors) { + for (let i = newInterceptors.length - 1;i >= 0; i--) { + const interceptor = this[kInterceptors][i]; + if (typeof interceptor !== "function") { + throw new InvalidArgumentError("interceptor must be an function"); + } + } + } + this[kInterceptors] = newInterceptors; + } + close(callback) { + if (callback === undefined) { + return new Promise((resolve, reject) => { + this.close((err, data) => { + return err ? reject(err) : resolve(data); + }); + }); + } + if (typeof callback !== "function") { + throw new InvalidArgumentError("invalid callback"); + } + if (this[kDestroyed]) { + queueMicrotask(() => callback(new ClientDestroyedError, null)); + return; + } + if (this[kClosed]) { + if (this[kOnClosed]) { + this[kOnClosed].push(callback); + } else { + queueMicrotask(() => callback(null, null)); + } + return; + } + this[kClosed] = true; + this[kOnClosed].push(callback); + const onClosed = () => { + const callbacks = this[kOnClosed]; + this[kOnClosed] = null; + for (let i = 0;i < callbacks.length; i++) { + callbacks[i](null, null); + } + }; + this[kClose]().then(() => this.destroy()).then(() => { + queueMicrotask(onClosed); + }); + } + destroy(err, callback) { + if (typeof err === "function") { + callback = err; + err = null; + } + if (callback === undefined) { + return new Promise((resolve, reject) => { + this.destroy(err, (err2, data) => { + return err2 ? reject(err2) : resolve(data); + }); + }); + } + if (typeof callback !== "function") { + throw new InvalidArgumentError("invalid callback"); + } + if (this[kDestroyed]) { + if (this[kOnDestroyed]) { + this[kOnDestroyed].push(callback); + } else { + queueMicrotask(() => callback(null, null)); + } + return; + } + if (!err) { + err = new ClientDestroyedError; + } + this[kDestroyed] = true; + this[kOnDestroyed] = this[kOnDestroyed] || []; + this[kOnDestroyed].push(callback); + const onDestroyed = () => { + const callbacks = this[kOnDestroyed]; + this[kOnDestroyed] = null; + for (let i = 0;i < callbacks.length; i++) { + callbacks[i](null, null); + } + }; + this[kDestroy](err).then(() => { + queueMicrotask(onDestroyed); + }); + } + [kInterceptedDispatch](opts, handler) { + if (!this[kInterceptors] || this[kInterceptors].length === 0) { + this[kInterceptedDispatch] = this[kDispatch]; + return this[kDispatch](opts, handler); + } + let dispatch = this[kDispatch].bind(this); + for (let i = this[kInterceptors].length - 1;i >= 0; i--) { + dispatch = this[kInterceptors][i](dispatch); + } + this[kInterceptedDispatch] = dispatch; + return dispatch(opts, handler); + } + dispatch(opts, handler) { + if (!handler || typeof handler !== "object") { + throw new InvalidArgumentError("handler must be an object"); + } + try { + if (!opts || typeof opts !== "object") { + throw new InvalidArgumentError("opts must be an object."); + } + if (this[kDestroyed] || this[kOnDestroyed]) { + throw new ClientDestroyedError; + } + if (this[kClosed]) { + throw new ClientClosedError; + } + return this[kInterceptedDispatch](opts, handler); + } catch (err) { + if (typeof handler.onError !== "function") { + throw new InvalidArgumentError("invalid onError method"); + } + handler.onError(err); + return false; + } + } + } + module2.exports = DispatcherBase; +}); + +// node_modules/undici/lib/core/connect.js +var require_connect = __commonJS((exports2, module2) => { + var net = require("net"); + var assert = require("assert"); + var util = require_util(); + var { InvalidArgumentError, ConnectTimeoutError } = require_errors(); + var tls; + var SessionCache; + if (global.FinalizationRegistry && !process.env.NODE_V8_COVERAGE) { + SessionCache = class WeakSessionCache { + constructor(maxCachedSessions) { + this._maxCachedSessions = maxCachedSessions; + this._sessionCache = new Map; + this._sessionRegistry = new global.FinalizationRegistry((key) => { + if (this._sessionCache.size < this._maxCachedSessions) { + return; + } + const ref = this._sessionCache.get(key); + if (ref !== undefined && ref.deref() === undefined) { + this._sessionCache.delete(key); + } + }); + } + get(sessionKey) { + const ref = this._sessionCache.get(sessionKey); + return ref ? ref.deref() : null; + } + set(sessionKey, session) { + if (this._maxCachedSessions === 0) { + return; + } + this._sessionCache.set(sessionKey, new WeakRef(session)); + this._sessionRegistry.register(session, sessionKey); + } + }; + } else { + SessionCache = class SimpleSessionCache { + constructor(maxCachedSessions) { + this._maxCachedSessions = maxCachedSessions; + this._sessionCache = new Map; + } + get(sessionKey) { + return this._sessionCache.get(sessionKey); + } + set(sessionKey, session) { + if (this._maxCachedSessions === 0) { + return; + } + if (this._sessionCache.size >= this._maxCachedSessions) { + const { value: oldestKey } = this._sessionCache.keys().next(); + this._sessionCache.delete(oldestKey); + } + this._sessionCache.set(sessionKey, session); + } + }; + } + function buildConnector({ allowH2, maxCachedSessions, socketPath, timeout, ...opts }) { + if (maxCachedSessions != null && (!Number.isInteger(maxCachedSessions) || maxCachedSessions < 0)) { + throw new InvalidArgumentError("maxCachedSessions must be a positive integer or zero"); + } + const options = { path: socketPath, ...opts }; + const sessionCache = new SessionCache(maxCachedSessions == null ? 100 : maxCachedSessions); + timeout = timeout == null ? 1e4 : timeout; + allowH2 = allowH2 != null ? allowH2 : false; + return function connect({ hostname, host, protocol, port, servername, localAddress, httpSocket }, callback) { + let socket; + if (protocol === "https:") { + if (!tls) { + tls = require("tls"); + } + servername = servername || options.servername || util.getServerName(host) || null; + const sessionKey = servername || hostname; + const session = sessionCache.get(sessionKey) || null; + assert(sessionKey); + socket = tls.connect({ + highWaterMark: 16384, + ...options, + servername, + session, + localAddress, + ALPNProtocols: allowH2 ? ["http/1.1", "h2"] : ["http/1.1"], + socket: httpSocket, + port: port || 443, + host: hostname + }); + socket.on("session", function(session2) { + sessionCache.set(sessionKey, session2); + }); + } else { + assert(!httpSocket, "httpSocket can only be sent on TLS update"); + socket = net.connect({ + highWaterMark: 64 * 1024, + ...options, + localAddress, + port: port || 80, + host: hostname + }); + } + if (options.keepAlive == null || options.keepAlive) { + const keepAliveInitialDelay = options.keepAliveInitialDelay === undefined ? 60000 : options.keepAliveInitialDelay; + socket.setKeepAlive(true, keepAliveInitialDelay); + } + const cancelTimeout = setupTimeout(() => onConnectTimeout(socket), timeout); + socket.setNoDelay(true).once(protocol === "https:" ? "secureConnect" : "connect", function() { + cancelTimeout(); + if (callback) { + const cb = callback; + callback = null; + cb(null, this); + } + }).on("error", function(err) { + cancelTimeout(); + if (callback) { + const cb = callback; + callback = null; + cb(err); + } + }); + return socket; + }; + } + function setupTimeout(onConnectTimeout2, timeout) { + if (!timeout) { + return () => { + }; + } + let s1 = null; + let s2 = null; + const timeoutId = setTimeout(() => { + s1 = setImmediate(() => { + if (process.platform === "win32") { + s2 = setImmediate(() => onConnectTimeout2()); + } else { + onConnectTimeout2(); + } + }); + }, timeout); + return () => { + clearTimeout(timeoutId); + clearImmediate(s1); + clearImmediate(s2); + }; + } + function onConnectTimeout(socket) { + util.destroy(socket, new ConnectTimeoutError); + } + module2.exports = buildConnector; +}); + +// node_modules/undici/lib/llhttp/utils.js +var require_utils2 = __commonJS((exports2) => { + Object.defineProperty(exports2, "__esModule", { value: true }); + exports2.enumToMap = undefined; + function enumToMap(obj) { + const res = {}; + Object.keys(obj).forEach((key) => { + const value = obj[key]; + if (typeof value === "number") { + res[key] = value; + } + }); + return res; + } + exports2.enumToMap = enumToMap; +}); + +// node_modules/undici/lib/llhttp/constants.js +var require_constants3 = __commonJS((exports2) => { + Object.defineProperty(exports2, "__esModule", { value: true }); + exports2.SPECIAL_HEADERS = exports2.HEADER_STATE = exports2.MINOR = exports2.MAJOR = exports2.CONNECTION_TOKEN_CHARS = exports2.HEADER_CHARS = exports2.TOKEN = exports2.STRICT_TOKEN = exports2.HEX = exports2.URL_CHAR = exports2.STRICT_URL_CHAR = exports2.USERINFO_CHARS = exports2.MARK = exports2.ALPHANUM = exports2.NUM = exports2.HEX_MAP = exports2.NUM_MAP = exports2.ALPHA = exports2.FINISH = exports2.H_METHOD_MAP = exports2.METHOD_MAP = exports2.METHODS_RTSP = exports2.METHODS_ICE = exports2.METHODS_HTTP = exports2.METHODS = exports2.LENIENT_FLAGS = exports2.FLAGS = exports2.TYPE = exports2.ERROR = undefined; + var utils_1 = require_utils2(); + var ERROR; + (function(ERROR2) { + ERROR2[ERROR2["OK"] = 0] = "OK"; + ERROR2[ERROR2["INTERNAL"] = 1] = "INTERNAL"; + ERROR2[ERROR2["STRICT"] = 2] = "STRICT"; + ERROR2[ERROR2["LF_EXPECTED"] = 3] = "LF_EXPECTED"; + ERROR2[ERROR2["UNEXPECTED_CONTENT_LENGTH"] = 4] = "UNEXPECTED_CONTENT_LENGTH"; + ERROR2[ERROR2["CLOSED_CONNECTION"] = 5] = "CLOSED_CONNECTION"; + ERROR2[ERROR2["INVALID_METHOD"] = 6] = "INVALID_METHOD"; + ERROR2[ERROR2["INVALID_URL"] = 7] = "INVALID_URL"; + ERROR2[ERROR2["INVALID_CONSTANT"] = 8] = "INVALID_CONSTANT"; + ERROR2[ERROR2["INVALID_VERSION"] = 9] = "INVALID_VERSION"; + ERROR2[ERROR2["INVALID_HEADER_TOKEN"] = 10] = "INVALID_HEADER_TOKEN"; + ERROR2[ERROR2["INVALID_CONTENT_LENGTH"] = 11] = "INVALID_CONTENT_LENGTH"; + ERROR2[ERROR2["INVALID_CHUNK_SIZE"] = 12] = "INVALID_CHUNK_SIZE"; + ERROR2[ERROR2["INVALID_STATUS"] = 13] = "INVALID_STATUS"; + ERROR2[ERROR2["INVALID_EOF_STATE"] = 14] = "INVALID_EOF_STATE"; + ERROR2[ERROR2["INVALID_TRANSFER_ENCODING"] = 15] = "INVALID_TRANSFER_ENCODING"; + ERROR2[ERROR2["CB_MESSAGE_BEGIN"] = 16] = "CB_MESSAGE_BEGIN"; + ERROR2[ERROR2["CB_HEADERS_COMPLETE"] = 17] = "CB_HEADERS_COMPLETE"; + ERROR2[ERROR2["CB_MESSAGE_COMPLETE"] = 18] = "CB_MESSAGE_COMPLETE"; + ERROR2[ERROR2["CB_CHUNK_HEADER"] = 19] = "CB_CHUNK_HEADER"; + ERROR2[ERROR2["CB_CHUNK_COMPLETE"] = 20] = "CB_CHUNK_COMPLETE"; + ERROR2[ERROR2["PAUSED"] = 21] = "PAUSED"; + ERROR2[ERROR2["PAUSED_UPGRADE"] = 22] = "PAUSED_UPGRADE"; + ERROR2[ERROR2["PAUSED_H2_UPGRADE"] = 23] = "PAUSED_H2_UPGRADE"; + ERROR2[ERROR2["USER"] = 24] = "USER"; + })(ERROR = exports2.ERROR || (exports2.ERROR = {})); + var TYPE; + (function(TYPE2) { + TYPE2[TYPE2["BOTH"] = 0] = "BOTH"; + TYPE2[TYPE2["REQUEST"] = 1] = "REQUEST"; + TYPE2[TYPE2["RESPONSE"] = 2] = "RESPONSE"; + })(TYPE = exports2.TYPE || (exports2.TYPE = {})); + var FLAGS; + (function(FLAGS2) { + FLAGS2[FLAGS2["CONNECTION_KEEP_ALIVE"] = 1] = "CONNECTION_KEEP_ALIVE"; + FLAGS2[FLAGS2["CONNECTION_CLOSE"] = 2] = "CONNECTION_CLOSE"; + FLAGS2[FLAGS2["CONNECTION_UPGRADE"] = 4] = "CONNECTION_UPGRADE"; + FLAGS2[FLAGS2["CHUNKED"] = 8] = "CHUNKED"; + FLAGS2[FLAGS2["UPGRADE"] = 16] = "UPGRADE"; + FLAGS2[FLAGS2["CONTENT_LENGTH"] = 32] = "CONTENT_LENGTH"; + FLAGS2[FLAGS2["SKIPBODY"] = 64] = "SKIPBODY"; + FLAGS2[FLAGS2["TRAILING"] = 128] = "TRAILING"; + FLAGS2[FLAGS2["TRANSFER_ENCODING"] = 512] = "TRANSFER_ENCODING"; + })(FLAGS = exports2.FLAGS || (exports2.FLAGS = {})); + var LENIENT_FLAGS; + (function(LENIENT_FLAGS2) { + LENIENT_FLAGS2[LENIENT_FLAGS2["HEADERS"] = 1] = "HEADERS"; + LENIENT_FLAGS2[LENIENT_FLAGS2["CHUNKED_LENGTH"] = 2] = "CHUNKED_LENGTH"; + LENIENT_FLAGS2[LENIENT_FLAGS2["KEEP_ALIVE"] = 4] = "KEEP_ALIVE"; + })(LENIENT_FLAGS = exports2.LENIENT_FLAGS || (exports2.LENIENT_FLAGS = {})); + var METHODS; + (function(METHODS2) { + METHODS2[METHODS2["DELETE"] = 0] = "DELETE"; + METHODS2[METHODS2["GET"] = 1] = "GET"; + METHODS2[METHODS2["HEAD"] = 2] = "HEAD"; + METHODS2[METHODS2["POST"] = 3] = "POST"; + METHODS2[METHODS2["PUT"] = 4] = "PUT"; + METHODS2[METHODS2["CONNECT"] = 5] = "CONNECT"; + METHODS2[METHODS2["OPTIONS"] = 6] = "OPTIONS"; + METHODS2[METHODS2["TRACE"] = 7] = "TRACE"; + METHODS2[METHODS2["COPY"] = 8] = "COPY"; + METHODS2[METHODS2["LOCK"] = 9] = "LOCK"; + METHODS2[METHODS2["MKCOL"] = 10] = "MKCOL"; + METHODS2[METHODS2["MOVE"] = 11] = "MOVE"; + METHODS2[METHODS2["PROPFIND"] = 12] = "PROPFIND"; + METHODS2[METHODS2["PROPPATCH"] = 13] = "PROPPATCH"; + METHODS2[METHODS2["SEARCH"] = 14] = "SEARCH"; + METHODS2[METHODS2["UNLOCK"] = 15] = "UNLOCK"; + METHODS2[METHODS2["BIND"] = 16] = "BIND"; + METHODS2[METHODS2["REBIND"] = 17] = "REBIND"; + METHODS2[METHODS2["UNBIND"] = 18] = "UNBIND"; + METHODS2[METHODS2["ACL"] = 19] = "ACL"; + METHODS2[METHODS2["REPORT"] = 20] = "REPORT"; + METHODS2[METHODS2["MKACTIVITY"] = 21] = "MKACTIVITY"; + METHODS2[METHODS2["CHECKOUT"] = 22] = "CHECKOUT"; + METHODS2[METHODS2["MERGE"] = 23] = "MERGE"; + METHODS2[METHODS2["M-SEARCH"] = 24] = "M-SEARCH"; + METHODS2[METHODS2["NOTIFY"] = 25] = "NOTIFY"; + METHODS2[METHODS2["SUBSCRIBE"] = 26] = "SUBSCRIBE"; + METHODS2[METHODS2["UNSUBSCRIBE"] = 27] = "UNSUBSCRIBE"; + METHODS2[METHODS2["PATCH"] = 28] = "PATCH"; + METHODS2[METHODS2["PURGE"] = 29] = "PURGE"; + METHODS2[METHODS2["MKCALENDAR"] = 30] = "MKCALENDAR"; + METHODS2[METHODS2["LINK"] = 31] = "LINK"; + METHODS2[METHODS2["UNLINK"] = 32] = "UNLINK"; + METHODS2[METHODS2["SOURCE"] = 33] = "SOURCE"; + METHODS2[METHODS2["PRI"] = 34] = "PRI"; + METHODS2[METHODS2["DESCRIBE"] = 35] = "DESCRIBE"; + METHODS2[METHODS2["ANNOUNCE"] = 36] = "ANNOUNCE"; + METHODS2[METHODS2["SETUP"] = 37] = "SETUP"; + METHODS2[METHODS2["PLAY"] = 38] = "PLAY"; + METHODS2[METHODS2["PAUSE"] = 39] = "PAUSE"; + METHODS2[METHODS2["TEARDOWN"] = 40] = "TEARDOWN"; + METHODS2[METHODS2["GET_PARAMETER"] = 41] = "GET_PARAMETER"; + METHODS2[METHODS2["SET_PARAMETER"] = 42] = "SET_PARAMETER"; + METHODS2[METHODS2["REDIRECT"] = 43] = "REDIRECT"; + METHODS2[METHODS2["RECORD"] = 44] = "RECORD"; + METHODS2[METHODS2["FLUSH"] = 45] = "FLUSH"; + })(METHODS = exports2.METHODS || (exports2.METHODS = {})); + exports2.METHODS_HTTP = [ + METHODS.DELETE, + METHODS.GET, + METHODS.HEAD, + METHODS.POST, + METHODS.PUT, + METHODS.CONNECT, + METHODS.OPTIONS, + METHODS.TRACE, + METHODS.COPY, + METHODS.LOCK, + METHODS.MKCOL, + METHODS.MOVE, + METHODS.PROPFIND, + METHODS.PROPPATCH, + METHODS.SEARCH, + METHODS.UNLOCK, + METHODS.BIND, + METHODS.REBIND, + METHODS.UNBIND, + METHODS.ACL, + METHODS.REPORT, + METHODS.MKACTIVITY, + METHODS.CHECKOUT, + METHODS.MERGE, + METHODS["M-SEARCH"], + METHODS.NOTIFY, + METHODS.SUBSCRIBE, + METHODS.UNSUBSCRIBE, + METHODS.PATCH, + METHODS.PURGE, + METHODS.MKCALENDAR, + METHODS.LINK, + METHODS.UNLINK, + METHODS.PRI, + METHODS.SOURCE + ]; + exports2.METHODS_ICE = [ + METHODS.SOURCE + ]; + exports2.METHODS_RTSP = [ + METHODS.OPTIONS, + METHODS.DESCRIBE, + METHODS.ANNOUNCE, + METHODS.SETUP, + METHODS.PLAY, + METHODS.PAUSE, + METHODS.TEARDOWN, + METHODS.GET_PARAMETER, + METHODS.SET_PARAMETER, + METHODS.REDIRECT, + METHODS.RECORD, + METHODS.FLUSH, + METHODS.GET, + METHODS.POST + ]; + exports2.METHOD_MAP = utils_1.enumToMap(METHODS); + exports2.H_METHOD_MAP = {}; + Object.keys(exports2.METHOD_MAP).forEach((key) => { + if (/^H/.test(key)) { + exports2.H_METHOD_MAP[key] = exports2.METHOD_MAP[key]; + } + }); + var FINISH; + (function(FINISH2) { + FINISH2[FINISH2["SAFE"] = 0] = "SAFE"; + FINISH2[FINISH2["SAFE_WITH_CB"] = 1] = "SAFE_WITH_CB"; + FINISH2[FINISH2["UNSAFE"] = 2] = "UNSAFE"; + })(FINISH = exports2.FINISH || (exports2.FINISH = {})); + exports2.ALPHA = []; + for (let i = "A".charCodeAt(0);i <= "Z".charCodeAt(0); i++) { + exports2.ALPHA.push(String.fromCharCode(i)); + exports2.ALPHA.push(String.fromCharCode(i + 32)); + } + exports2.NUM_MAP = { + 0: 0, + 1: 1, + 2: 2, + 3: 3, + 4: 4, + 5: 5, + 6: 6, + 7: 7, + 8: 8, + 9: 9 + }; + exports2.HEX_MAP = { + 0: 0, + 1: 1, + 2: 2, + 3: 3, + 4: 4, + 5: 5, + 6: 6, + 7: 7, + 8: 8, + 9: 9, + A: 10, + B: 11, + C: 12, + D: 13, + E: 14, + F: 15, + a: 10, + b: 11, + c: 12, + d: 13, + e: 14, + f: 15 + }; + exports2.NUM = [ + "0", + "1", + "2", + "3", + "4", + "5", + "6", + "7", + "8", + "9" + ]; + exports2.ALPHANUM = exports2.ALPHA.concat(exports2.NUM); + exports2.MARK = ["-", "_", ".", "!", "~", "*", "\'", "(", ")"]; + exports2.USERINFO_CHARS = exports2.ALPHANUM.concat(exports2.MARK).concat(["%", ";", ":", "&", "=", "+", "$", ","]); + exports2.STRICT_URL_CHAR = [ + "!", + '"', + "$", + "%", + "&", + "\'", + "(", + ")", + "*", + "+", + ",", + "-", + ".", + "/", + ":", + ";", + "<", + "=", + ">", + "@", + "[", + "\\", + "]", + "^", + "_", + "`", + "{", + "|", + "}", + "~" + ].concat(exports2.ALPHANUM); + exports2.URL_CHAR = exports2.STRICT_URL_CHAR.concat(["\t", "\f"]); + for (let i = 128;i <= 255; i++) { + exports2.URL_CHAR.push(i); + } + exports2.HEX = exports2.NUM.concat(["a", "b", "c", "d", "e", "f", "A", "B", "C", "D", "E", "F"]); + exports2.STRICT_TOKEN = [ + "!", + "#", + "$", + "%", + "&", + "\'", + "*", + "+", + "-", + ".", + "^", + "_", + "`", + "|", + "~" + ].concat(exports2.ALPHANUM); + exports2.TOKEN = exports2.STRICT_TOKEN.concat([" "]); + exports2.HEADER_CHARS = ["\t"]; + for (let i = 32;i <= 255; i++) { + if (i !== 127) { + exports2.HEADER_CHARS.push(i); + } + } + exports2.CONNECTION_TOKEN_CHARS = exports2.HEADER_CHARS.filter((c) => c !== 44); + exports2.MAJOR = exports2.NUM_MAP; + exports2.MINOR = exports2.MAJOR; + var HEADER_STATE; + (function(HEADER_STATE2) { + HEADER_STATE2[HEADER_STATE2["GENERAL"] = 0] = "GENERAL"; + HEADER_STATE2[HEADER_STATE2["CONNECTION"] = 1] = "CONNECTION"; + HEADER_STATE2[HEADER_STATE2["CONTENT_LENGTH"] = 2] = "CONTENT_LENGTH"; + HEADER_STATE2[HEADER_STATE2["TRANSFER_ENCODING"] = 3] = "TRANSFER_ENCODING"; + HEADER_STATE2[HEADER_STATE2["UPGRADE"] = 4] = "UPGRADE"; + HEADER_STATE2[HEADER_STATE2["CONNECTION_KEEP_ALIVE"] = 5] = "CONNECTION_KEEP_ALIVE"; + HEADER_STATE2[HEADER_STATE2["CONNECTION_CLOSE"] = 6] = "CONNECTION_CLOSE"; + HEADER_STATE2[HEADER_STATE2["CONNECTION_UPGRADE"] = 7] = "CONNECTION_UPGRADE"; + HEADER_STATE2[HEADER_STATE2["TRANSFER_ENCODING_CHUNKED"] = 8] = "TRANSFER_ENCODING_CHUNKED"; + })(HEADER_STATE = exports2.HEADER_STATE || (exports2.HEADER_STATE = {})); + exports2.SPECIAL_HEADERS = { + connection: HEADER_STATE.CONNECTION, + "content-length": HEADER_STATE.CONTENT_LENGTH, + "proxy-connection": HEADER_STATE.CONNECTION, + "transfer-encoding": HEADER_STATE.TRANSFER_ENCODING, + upgrade: HEADER_STATE.UPGRADE + }; +}); + +// node_modules/undici/lib/handler/RedirectHandler.js +var require_RedirectHandler = __commonJS((exports2, module2) => { + var util = require_util(); + var { kBodyUsed } = require_symbols(); + var assert = require("assert"); + var { InvalidArgumentError } = require_errors(); + var EE = require("events"); + var redirectableStatusCodes = [300, 301, 302, 303, 307, 308]; + var kBody = Symbol("body"); + + class BodyAsyncIterable { + constructor(body) { + this[kBody] = body; + this[kBodyUsed] = false; + } + async* [Symbol.asyncIterator]() { + assert(!this[kBodyUsed], "disturbed"); + this[kBodyUsed] = true; + yield* this[kBody]; + } + } + + class RedirectHandler { + constructor(dispatch, maxRedirections, opts, handler) { + if (maxRedirections != null && (!Number.isInteger(maxRedirections) || maxRedirections < 0)) { + throw new InvalidArgumentError("maxRedirections must be a positive number"); + } + util.validateHandler(handler, opts.method, opts.upgrade); + this.dispatch = dispatch; + this.location = null; + this.abort = null; + this.opts = { ...opts, maxRedirections: 0 }; + this.maxRedirections = maxRedirections; + this.handler = handler; + this.history = []; + if (util.isStream(this.opts.body)) { + if (util.bodyLength(this.opts.body) === 0) { + this.opts.body.on("data", function() { + assert(false); + }); + } + if (typeof this.opts.body.readableDidRead !== "boolean") { + this.opts.body[kBodyUsed] = false; + EE.prototype.on.call(this.opts.body, "data", function() { + this[kBodyUsed] = true; + }); + } + } else if (this.opts.body && typeof this.opts.body.pipeTo === "function") { + this.opts.body = new BodyAsyncIterable(this.opts.body); + } else if (this.opts.body && typeof this.opts.body !== "string" && !ArrayBuffer.isView(this.opts.body) && util.isIterable(this.opts.body)) { + this.opts.body = new BodyAsyncIterable(this.opts.body); + } + } + onConnect(abort) { + this.abort = abort; + this.handler.onConnect(abort, { history: this.history }); + } + onUpgrade(statusCode, headers, socket) { + this.handler.onUpgrade(statusCode, headers, socket); + } + onError(error) { + this.handler.onError(error); + } + onHeaders(statusCode, headers, resume, statusText) { + this.location = this.history.length >= this.maxRedirections || util.isDisturbed(this.opts.body) ? null : parseLocation(statusCode, headers); + if (this.opts.origin) { + this.history.push(new URL(this.opts.path, this.opts.origin)); + } + if (!this.location) { + return this.handler.onHeaders(statusCode, headers, resume, statusText); + } + const { origin, pathname, search } = util.parseURL(new URL(this.location, this.opts.origin && new URL(this.opts.path, this.opts.origin))); + const path = search ? `${pathname}${search}` : pathname; + this.opts.headers = cleanRequestHeaders(this.opts.headers, statusCode === 303, this.opts.origin !== origin); + this.opts.path = path; + this.opts.origin = origin; + this.opts.maxRedirections = 0; + this.opts.query = null; + if (statusCode === 303 && this.opts.method !== "HEAD") { + this.opts.method = "GET"; + this.opts.body = null; + } + } + onData(chunk) { + if (this.location) { + } else { + return this.handler.onData(chunk); + } + } + onComplete(trailers) { + if (this.location) { + this.location = null; + this.abort = null; + this.dispatch(this.opts, this); + } else { + this.handler.onComplete(trailers); + } + } + onBodySent(chunk) { + if (this.handler.onBodySent) { + this.handler.onBodySent(chunk); + } + } + } + function parseLocation(statusCode, headers) { + if (redirectableStatusCodes.indexOf(statusCode) === -1) { + return null; + } + for (let i = 0;i < headers.length; i += 2) { + if (headers[i].toString().toLowerCase() === "location") { + return headers[i + 1]; + } + } + } + function shouldRemoveHeader(header, removeContent, unknownOrigin) { + if (header.length === 4) { + return util.headerNameToString(header) === "host"; + } + if (removeContent && util.headerNameToString(header).startsWith("content-")) { + return true; + } + if (unknownOrigin && (header.length === 13 || header.length === 6 || header.length === 19)) { + const name = util.headerNameToString(header); + return name === "authorization" || name === "cookie" || name === "proxy-authorization"; + } + return false; + } + function cleanRequestHeaders(headers, removeContent, unknownOrigin) { + const ret = []; + if (Array.isArray(headers)) { + for (let i = 0;i < headers.length; i += 2) { + if (!shouldRemoveHeader(headers[i], removeContent, unknownOrigin)) { + ret.push(headers[i], headers[i + 1]); + } + } + } else if (headers && typeof headers === "object") { + for (const key of Object.keys(headers)) { + if (!shouldRemoveHeader(key, removeContent, unknownOrigin)) { + ret.push(key, headers[key]); + } + } + } else { + assert(headers == null, "headers must be an object or an array"); + } + return ret; + } + module2.exports = RedirectHandler; +}); + +// node_modules/undici/lib/interceptor/redirectInterceptor.js +var require_redirectInterceptor = __commonJS((exports2, module2) => { + var RedirectHandler = require_RedirectHandler(); + function createRedirectInterceptor({ maxRedirections: defaultMaxRedirections }) { + return (dispatch) => { + return function Intercept(opts, handler) { + const { maxRedirections = defaultMaxRedirections } = opts; + if (!maxRedirections) { + return dispatch(opts, handler); + } + const redirectHandler = new RedirectHandler(dispatch, maxRedirections, opts, handler); + opts = { ...opts, maxRedirections: 0 }; + return dispatch(opts, redirectHandler); + }; + }; + } + module2.exports = createRedirectInterceptor; +}); + +// node_modules/undici/lib/llhttp/llhttp-wasm.js +var require_llhttp_wasm = __commonJS((exports2, module2) => { + module2.exports = "AGFzbQEAAAABMAhgAX8Bf2ADf39/AX9gBH9/f38Bf2AAAGADf39/AGABfwBgAn9/AGAGf39/f39/AALLAQgDZW52GHdhc21fb25faGVhZGVyc19jb21wbGV0ZQACA2VudhV3YXNtX29uX21lc3NhZ2VfYmVnaW4AAANlbnYLd2FzbV9vbl91cmwAAQNlbnYOd2FzbV9vbl9zdGF0dXMAAQNlbnYUd2FzbV9vbl9oZWFkZXJfZmllbGQAAQNlbnYUd2FzbV9vbl9oZWFkZXJfdmFsdWUAAQNlbnYMd2FzbV9vbl9ib2R5AAEDZW52GHdhc21fb25fbWVzc2FnZV9jb21wbGV0ZQAAA0ZFAwMEAAAFAAAAAAAABQEFAAUFBQAABgAAAAAGBgYGAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQABAAABAQcAAAUFAwABBAUBcAESEgUDAQACBggBfwFBgNQECwfRBSIGbWVtb3J5AgALX2luaXRpYWxpemUACRlfX2luZGlyZWN0X2Z1bmN0aW9uX3RhYmxlAQALbGxodHRwX2luaXQAChhsbGh0dHBfc2hvdWxkX2tlZXBfYWxpdmUAQQxsbGh0dHBfYWxsb2MADAZtYWxsb2MARgtsbGh0dHBfZnJlZQANBGZyZWUASA9sbGh0dHBfZ2V0X3R5cGUADhVsbGh0dHBfZ2V0X2h0dHBfbWFqb3IADxVsbGh0dHBfZ2V0X2h0dHBfbWlub3IAEBFsbGh0dHBfZ2V0X21ldGhvZAARFmxsaHR0cF9nZXRfc3RhdHVzX2NvZGUAEhJsbGh0dHBfZ2V0X3VwZ3JhZGUAEwxsbGh0dHBfcmVzZXQAFA5sbGh0dHBfZXhlY3V0ZQAVFGxsaHR0cF9zZXR0aW5nc19pbml0ABYNbGxodHRwX2ZpbmlzaAAXDGxsaHR0cF9wYXVzZQAYDWxsaHR0cF9yZXN1bWUAGRtsbGh0dHBfcmVzdW1lX2FmdGVyX3VwZ3JhZGUAGhBsbGh0dHBfZ2V0X2Vycm5vABsXbGxodHRwX2dldF9lcnJvcl9yZWFzb24AHBdsbGh0dHBfc2V0X2Vycm9yX3JlYXNvbgAdFGxsaHR0cF9nZXRfZXJyb3JfcG9zAB4RbGxodHRwX2Vycm5vX25hbWUAHxJsbGh0dHBfbWV0aG9kX25hbWUAIBJs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ADcDACAAQShqQgA3AwAgAEEgakIANwMAIABBEGpCADcDACAAQQhqQgA3AwAgAEHdATYCHEEAC3sBAX8CQCAAKAIMIgMNAAJAIAAoAgRFDQAgACABNgIECwJAIAAgASACEMSAgIAAIgMNACAAKAIMDwsgACADNgIcQQAhAyAAKAIEIgFFDQAgACABIAIgACgCCBGBgICAAAAiAUUNACAAIAI2AhQgACABNgIMIAEhAwsgAwvk8wEDDn8DfgR/I4CAgIAAQRBrIgMkgICAgAAgASEEIAEhBSABIQYgASEHIAEhCCABIQkgASEKIAEhCyABIQwgASENIAEhDiABIQ8CQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkAgACgCHCIQQX9qDt0B2gEB2QECAwQFBgcICQoLDA0O2AEPENcBERLWARMUFRYXGBkaG+AB3wEcHR7VAR8gISIjJCXUASYnKCkqKyzTAdIBLS7RAdABLzAxMjM0NTY3ODk6Ozw9Pj9AQUJDREVG2wFHSElKzwHOAUvNAUzMAU1OT1BRUlNUVVZXWFlaW1xdXl9gYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXp7fH1+f4ABgQGCAYMBhAGFAYYBhwGIAYkB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QAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkAC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FCAAIBA2AgxBACEQDLIBCyAAKAIEIRAgAEEANgIEAkAgACAQIAEQp4CAgAAiEA0AIAEhAQxNCyAAQdMANgIcIAAgATYCFCAAIBA2AgxBACEQDLEBCyAAKAIEIRAgAEEANgIEAkAgACAQIAEQp4CAgAAiEA0AIAEhAQxRCyAAQeUANgIcIAAgATYCFCAAIBA2AgxBACEQDLABCyAAQQA2AhwgACABNgIUIABBxoqAgAA2AhAgAEEHNgIMQQAhEAyvAQsgACgCBCEQIABBADYCBAJAIAAgECABEKeAgIAAIhANACABIQEMSQsgAEHSADYCHCAAIAE2AhQgACAQNgIMQQAhEAyuAQsgACgCBCEQIABBADYCBAJAIAAgECABEKeAgIAAIhANACABIQEMSQsgAEHTADYCHCAAIAE2AhQgACAQNgIMQQAhEAytAQsgACgCBCEQIABBADYCBAJAIAAgECABEKeAgIAAIhANACABIQEMTQsgAEHlADYCHCAAIAE2AhQgACAQNgIMQQAhEAysAQsgAEEANgIcIAAgATYCFCAAQdyIgIAANgIQIABBBzYCDEEAIRAMqwELIBBBP0cNASABQQFqIQELQQUhEAyQAQtBACEQIABBADYCHCAAIAE2AhQgAEH9koCAADYCECAAQQc2AgwMqAELIAAoAgQhECAAQQA2AgQCQCAAIBAgARCngICAACIQDQAgASEBDEILIABB0gA2AhwgACABNgIUIAAgEDYCDEEAIRAMpwELIAAoAgQhECAAQQA2AgQCQCAAIBAgARCngICAACIQDQAgASEBDEILIABB0wA2AhwgACABNgIUIAAgEDYCDEEAIRAMpgELIAAoAgQhECAAQQA2AgQCQCAAIBAgARCngICAACIQDQAgASEBDEYLIABB5QA2AhwgACABNgIUIAAgEDYCDEEAIRAMpQELIAAoAgQhASAAQQA2AgQCQCAAIAEgFBCngICAACIBDQAgFCEBDD8LIABB0gA2AhwgACAUNgIUIAAgATYCDEEAIRAMpAELIAAoAgQhASAAQQA2AgQCQCAAIAEgFBCngICAACIBDQAgFCEBDD8LIABB0wA2AhwgACAUNgIUIAAgATYCDEEAIRAMowELIAAoAgQhASAAQQA2AgQCQCAAIAEgFBCngICAACIBDQAgFCEBDEMLIABB5QA2AhwgACAU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YWdlX2JlZ2luYCBjYWxsYmFjayBlcnJvcgBgb25fY2h1bmtfZXh0ZW5zaW9uX3ZhbHVlYCBjYWxsYmFjayBlcnJvcgBgb25fc3RhdHVzX2NvbXBsZXRlYCBjYWxsYmFjayBlcnJvcgBgb25fdmVyc2lvbl9jb21wbGV0ZWAgY2FsbGJhY2sgZXJyb3IAYG9uX3VybF9jb21wbGV0ZWAgY2FsbGJhY2sgZXJyb3IAYG9uX2NodW5rX2NvbXBsZXRlYCBjYWxsYmFjayBlcnJvcgBgb25faGVhZGVyX3ZhbHVlX2NvbXBsZXRlYCBjYWxsYmFjayBlcnJvcgBgb25fbWVzc2FnZV9jb21wbGV0ZWAgY2FsbGJhY2sgZXJyb3IAYG9uX21ldGhvZF9jb21wbGV0ZWAgY2FsbGJhY2sgZXJyb3IAYG9uX2hlYWRlcl9maWVsZF9jb21wbGV0ZWAgY2FsbGJhY2sgZXJyb3IAYG9uX2NodW5rX2V4dGVuc2lvbl9uYW1lYCBjYWxsYmFjayBlcnJvcgBVbmV4cGVjdGVkIGNoYXIgaW4gdXJsIHNlcnZlcgBJbnZhbGlkIGhlYWRlciB2YWx1ZSBjaGFyAEludmFsaWQgaGVhZGVyIGZpZWxkIGNoYXIAU3BhbiBjYWxsYmFjayBlcnJvciBpbiBvbl92ZXJzaW9uAEludmFsaWQgbWlub3IgdmVyc2lvbgBJbnZhbGlkIG1ham9yIHZlcnNpb24ARXhwZWN0ZWQgc3BhY2UgYWZ0ZXIgdmVyc2lvbgBFeHBlY3RlZCBDUkxGIGFmdGVyIHZlcnNpb24ASW52YWxpZCBIVFRQIHZlcnNpb24ASW52YWxpZCBoZWFkZXIgdG9rZW4AU3BhbiBjYWxsYmFjayBlcnJvciBpbiBvbl91cmwASW52YWxpZCBjaGFyYWN0ZXJzIGluIHVybABVbmV4cGVjdGVkIHN0YXJ0IGNoYXIgaW4gdXJsAERvdWJsZSBAIGluIHVybABFbXB0eSBDb250ZW50LUxlbmd0aABJbnZhbGlkIGNoYXJhY3RlciBpbiBDb250ZW50LUxlbmd0aABEdXBsaWNhdGUgQ29udGVudC1MZW5ndGgASW52YWxpZCBjaGFyIGluIHVybCBwYXRoAENvbnRlbnQtTGVuZ3RoIGNhbid0IGJlIHByZXNlbnQgd2l0aCBUcmFuc2Zlci1FbmNvZGluZwBJbnZhbGlkIGNoYXJhY3RlciBpbiBjaHVuayBzaXplAFNwYW4gY2FsbGJhY2sgZXJyb3IgaW4gb25faGVhZGVyX3ZhbHVlAFNwYW4gY2FsbGJhY2sgZXJyb3IgaW4gb25fY2h1bmtfZXh0ZW5zaW9uX3ZhbHVlAEludmFsaWQgY2hhcmFjdGVyIGluIGNodW5rIGV4dGVuc2lvbnMgdmFsdWUATWlzc2luZyBleHBlY3RlZCBMRiBhZnRlciBoZWFkZXIgdmFsdWUASW52YWxpZCBgVHJhbnNmZXItRW5jb2RpbmdgIGhlYWRlciB2YWx1ZQBJbnZhbGlkIGNoYXJhY3RlciBpbiBjaHVuayBleHRlbnNpb25zIHF1b3RlIHZhbHVlAEludmFsaWQgY2hhcmFjdGVyIGluIGNodW5rIGV4dGVuc2lvbnMgcXVvdGVkIHZhbHVlAFBhdXNlZCBieSBvbl9oZWFkZXJzX2NvbXBsZXRlAEludmFsaWQgRU9GIHN0YXRlAG9uX3Jlc2V0IHBhdXNlAG9uX2NodW5rX2hlYWRlciBwYXVzZQBvbl9tZXNzYWdlX2JlZ2luIHBhdXNlAG9uX2NodW5rX2V4dGVuc2lvbl92YWx1ZSBwYXVzZQBvbl9zdGF0dXNfY29tcGxldGUgcGF1c2UAb25fdmVyc2lvbl9jb21wbGV0ZSBwYXVzZQBvbl91cmxfY29tcGxldGUgcGF1c2UAb25fY2h1bmtfY29tcGxldGUgcGF1c2UAb25faGVhZGVyX3ZhbHVlX2NvbXBsZXRlIHBhdXNlAG9uX21lc3NhZ2VfY29tcGxldGUgcGF1c2UAb25fbWV0aG9kX2NvbXBsZXRlIHBhdXNlAG9uX2hlYWRlcl9maWVsZF9jb21wbGV0ZSBwYXVzZQBvbl9jaHVua19leHRlbnNpb25fbmFtZSBwYXVzZQBVbmV4cGVjdGVkIHNwYWNlIGFmdGVyIHN0YXJ0IGxpbmUAU3BhbiBjYWxsYmFjayBlcnJvciBpbiBvbl9jaHVua19leHRlbnNpb25fbmFtZQBJbnZhbGlkIGNoYXJhY3RlciBpbiBjaHVuayBleHRlbnNpb25zIG5hbWUAUGF1c2Ugb24gQ09OTkVDVC9VcGdyYWRlAFBhdXNlIG9uIFBSSS9VcGdyYWRlAEV4cGVjdGVkIEhUVFAvMiBDb25uZWN0aW9uIFByZWZhY2UAU3BhbiBjYWxsYmFjayBlcnJvciBpbiBvbl9tZXRob2QARXhwZWN0ZWQgc3BhY2UgYWZ0ZXIgbWV0aG9kAFNwYW4gY2FsbGJhY2sgZXJyb3IgaW4gb25faGVhZGVyX2ZpZWxkAFBhdXNlZABJbnZhbGlkIHdvcmQgZW5jb3VudGVyZWQASW52YWxpZCBtZXRob2QgZW5jb3VudGVyZWQAVW5leHBlY3RlZCBjaGFyIGluIHVybCBzY2hlbWEAUmVxdWVzdCBoYXMgaW52YWxpZCBgVHJhbnNmZXItRW5jb2RpbmdgAFNXSVRDSF9QUk9YWQBVU0VfUFJPWFkATUtBQ1RJVklUWQBVTlBST0NFU1NBQkxFX0VOVElUWQBDT1BZAE1PVkVEX1BFUk1BTkVOVExZAFRPT19FQVJMWQBOT1RJRlkARkFJTEVEX0RFUEVOREVOQ1kAQkFEX0dBVEVXQVkAUExBWQBQVVQAQ0hFQ0tPVVQAR0FURVdBWV9USU1FT1VUAFJFUVVFU1RfVElNRU9VVABORVRXT1JLX0NPTk5FQ1RfVElNRU9VVABDT05ORUNUSU9OX1RJTUVPVVQATE9HSU5fVElNRU9VVABORVRXT1JLX1JFQURfVElNRU9VVABQT1NUAE1JU0RJUkVDVEVEX1JFUVVFU1QAQ0xJRU5UX0NMT1NFRF9SRVFVRVNUAENMSUVOVF9DTE9TRURfTE9BRF9CQUxBTkNFRF9SRVFVRVNUAEJBRF9SRVFVRVNUAEhUVFBfUkVRVUVTVF9TRU5UX1RPX0hUVFBTX1BPUlQAUkVQT1JUAElNX0FfVEVBUE9UAFJFU0VUX0NPTlRFTlQATk9fQ09OVEVOVABQQVJUSUFMX0NPTlRFTlQASFBFX0lOVkFMSURfQ09OU1RBTlQASFBFX0NCX1JFU0VUAEdFVABIUEVfU1RSSUNUAENPTkZMSUNUAFRFTVBPUkFSWV9SRURJUkVDVABQRVJNQU5FTlRfUkVESVJFQ1QAQ09OTkVDVABNVUxUSV9TVEFUVVMASFBFX0lOVkFMSURfU1RBVFVTAFRPT19NQU5ZX1JFUVVFU1RTAEVBUkxZX0hJTlRTAFVOQVZBSUxBQkxFX0ZPUl9MRUdBTF9SRUFTT05TAE9QVElPTlMAU1dJVENISU5HX1BST1RPQ09MUwBWQVJJQU5UX0FMU09fTkVHT1RJQVRFUwBNVUxUSVBMRV9DSE9JQ0VTAElOVEVSTkFMX1NFUlZFUl9FUlJPUgBXRUJfU0VSVkVSX1VOS05PV05fRVJST1IAUkFJTEdVTl9FUlJPUgBJREVOVElUWV9QUk9WSURFUl9BVVRIRU5USUNBVElPTl9FUlJPUgBTU0xfQ0VSVElGSUNBVEVfRVJST1IASU5WQUxJRF9YX0ZPUldBUkRFRF9GT1IAU0VUX1BBUkFNRVRFUgBHRVRfUEFSQU1FVEVSAEhQRV9VU0VSAFNFRV9PVEhFUgBIUEVfQ0JfQ0hVTktfSEVBREVSAE1LQ0FMRU5EQVIAU0VUVVAAV0VCX1NFUlZFUl9JU19ET1dOAFRFQVJET1dOAEhQRV9DTE9TRURfQ09OTkVDVElPTgBIRVVSSVNUSUNfRVhQSVJBVElPTgBESVNDT05ORUNURURfT1BFUkFUSU9OAE5PTl9BVVRIT1JJVEFUSVZFX0lORk9STUFUSU9OAEhQRV9JTlZBTElEX1ZFUlNJT04ASFBFX0NCX01FU1NBR0VfQkVHSU4AU0lURV9JU19GUk9aRU4ASFBFX0lOVkFMSURfSEVBREVSX1RPS0VOAElOVkFMSURfVE9LRU4ARk9SQklEREVOAEVOSEFOQ0VfWU9VUl9DQUxNAEhQRV9JTlZBTElEX1VSTABCTE9DS0VEX0JZX1BBUkVOVEFMX0NPTlRST0wATUtDT0wAQUNMAEhQRV9JTlRFUk5BTABSRVFVRVNUX0hFQURFUl9GSUVMRFNfVE9PX0xBUkdFX1VOT0ZGSUNJQUwASFBFX09LAFVOTElOSwBVTkxPQ0sAUFJJAFJFVFJZX1dJVEgASFBFX0lOVkFMSURfQ09OVEVOVF9MRU5HVEgASFBFX1VORVhQRUNURURfQ09OVEVOVF9MRU5HVEgARkxVU0gAUFJPUFBBVENIAE0tU0VBUkNIAFVSSV9UT09fTE9ORwBQUk9DRVNTSU5HAE1JU0NFTExBTkVPVVNfUEVSU0lTVEVOVF9XQVJOSU5HAE1JU0NFTExBTkVPVVNfV0FSTklORwBIUEVfSU5WQUxJRF9UUkFOU0ZFUl9FTkNPRElORwBFeHBlY3RlZCBDUkxGAEhQRV9JTlZBTElEX0NIVU5LX1NJWkUATU9WRQBDT05USU5VRQBIUEVfQ0JfU1RBVFVTX0NPTVBMRVRFAEhQRV9DQl9IRUFERVJTX0NPTVBMRVRFAEhQRV9DQl9WRVJTSU9OX0NPTVBMRVRFAEhQRV9DQl9VUkxfQ09NUExFVEUASFBFX0NCX0NIVU5LX0NPTVBMRVRFAEhQRV9DQl9IRUFERVJfVkFMVUVfQ09NUExFVEUASFBFX0NCX0NIVU5LX0VYVEVOU0lPTl9WQUxVRV9DT01QTEVURQBIUEVfQ0JfQ0hVTktfRVhURU5TSU9OX05BTUVfQ09NUExFVEUASFBFX0NCX01FU1NBR0VfQ09NUExFVEUASFBFX0NCX01FVEhPRF9DT01QTEVURQBIUEVfQ0JfSEVBREVSX0ZJRUxEX0NPTVBMRVRFAERFTEVURQBIUEVfSU5WQUxJRF9FT0ZfU1RBVEUASU5WQUxJRF9TU0xfQ0VSVElGSUNBVEUAUEFVU0UATk9fUkVTUE9OU0UAVU5TVVBQT1JURURfTUVESUFfVFlQRQBHT05FAE5PVF9BQ0NFUFRBQkxFAFNFUlZJQ0VfVU5BVkFJTEFCTEUAUkFOR0VfTk9UX1NBVElTRklBQkxFAE9SSUdJTl9JU19VTlJFQUNIQUJMRQBSRVNQT05TRV9JU19TVEFMRQBQVVJHRQBNRVJHRQBSRVFVRVNUX0hFQURFUl9GSUVMRFNfVE9PX0xBUkdFAFJFUVVFU1RfSEVBREVSX1RPT19MQVJHRQBQQVlMT0FEX1RPT19MQVJHRQBJTlNVRkZJQ0lFTlRfU1RPUkFHRQBIUEVfUEFVU0VEX1VQR1JBREUASFBFX1BBVVNFRF9IMl9VUEdSQURFAFNPVVJDRQBBTk5PVU5DRQBUUkFDRQBIUEVfVU5FWFBFQ1RFRF9TUEFDRQBERVNDUklCRQBVTlNVQlNDUklCRQBSRUNPUkQASFBFX0lOVkFMSURfTUVUSE9EAE5PVF9GT1VORABQUk9QRklORABVTkJJTkQAUkVCSU5EAFVOQVVUSE9SSVpFRABNRVRIT0RfTk9UX0FMTE9XRUQASFRUUF9WRVJTSU9OX05PVF9TVVBQT1JURUQAQUxSRUFEWV9SRVBPUlRFRABBQ0NFUFRFRABOT1RfSU1QTEVNRU5URUQATE9PUF9ERVRFQ1RFRABIUEVfQ1JfRVhQRUNURUQASFBFX0xGX0VYUEVDVEVEAENSRUFURUQASU1fVVNFRABIUEVfUEFVU0VEAFRJTUVPVVRfT0NDVVJFRABQQVlNRU5UX1JFUVVJUkVEAFBSRUNPTkRJVElPTl9SRVFVSVJFRABQUk9YWV9BVVRIRU5USUNBVElPTl9SRVFVSVJFRABORVRXT1JLX0FVVEhFTlRJQ0FUSU9OX1JFUVVJUkVEAExFTkdUSF9SRVFVSVJFRABTU0xfQ0VSVElGSUNBVEVfUkVRVUlSRUQAVVBHUkFERV9SRVFVSVJFRABQQUdFX0VYUElSRUQAUFJFQ09ORElUSU9OX0ZBSUxFRABFWFBFQ1RBVElPTl9GQUlMRUQAUkVWQUxJREFUSU9OX0ZBSUxFRABTU0xfSEFORFNIQUtFX0ZBSUxFRABMT0NLRUQAVFJBTlNGT1JNQVRJT05fQVBQTElFRABOT1RfTU9ESUZJRUQATk9UX0VYVEVOREVEAEJBTkRXSURUSF9MSU1JVF9FWENFRURFRABTSVRFX0lTX09WRVJMT0FERUQASEVBRABFeHBlY3RlZCBIVFRQLwAAXhMAACYTAAAwEAAA8BcAAJ0TAAAVEgAAORcAAPASAAAKEAAAdRIAAK0SAACCEwAATxQAAH8QAACgFQAAIxQAAIkSAACLFAAATRUAANQRAADPFAAAEBgAAMkWAADcFgAAwREAAOAXAAC7FAAAdBQAAHwVAADlFAAACBcAAB8QAABlFQAAoxQAACgVAAACFQAAmRUAACwQAACLGQAATw8AANQOAABqEAAAzhAAAAIXAACJDgAAbhMAABwTAABmFAAAVhcAAMETAADNEwAAbBMAAGgXAABmFwAAXxcAACITAADODwAAaQ4AANgOAABjFgAAyxMAAKoOAAAoFwAAJhcAAMUTAABdFgAA6BEAAGcTAABlEwAA8hYAAHMTAAAdFwAA+RYAAPMRAADPDgAAzhUAAAwSAACzEQAApREAAGEQAAAyFwAAuxMAAAAAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAABAQIBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEAAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQAAAAAAAAAAAAAAAAABAAAAAAAAAAAAAAAAAAAAAAAAAAIDAgICAgIAAAICAAICAAICAgICAgICAgIABAAAAAAAAgICAgICAgICAgICAgICAgICAgICAgICAgIAAAACAgICAgICAgICAgICAgICAgICAgICAgICAgICAgACAAIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAACAAICAgICAAACAgACAgACAgICAgICAgICAAMABAAAAAICAgICAgICAgICAgICAgICAgICAgICAgICAAAAAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAAgACAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAbG9zZWVlcC1hbGl2ZQAAAAAAAAAAAAAAAAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEAAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEAAAAAAAAAAAABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEBAQEBAQEBAQEBAQIBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAAEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBY2h1bmtlZAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQEAAQEBAQEAAAEBAAEBAAEBAQEBAQEBAQEAAAAAAAAAAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEAAAABAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQABAAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABlY3Rpb25lbnQtbGVuZ3Rob25yb3h5LWNvbm5lY3Rpb24AAAAAAAAAAAAAAAAAAAByYW5zZmVyLWVuY29kaW5ncGdyYWRlDQoNCg0KU00NCg0KVFRQL0NFL1RTUC8AAAAAAAAAAAAAAAABAgABAwAAAAAAAAAAAAAAAAAAAAAAAAQBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAAEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAAAAAAAAAAAAAQIAAQMAAAAAAAAAAAAAAAAAAAAAAAAEAQEFAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQABAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQAAAAAAAAAAAAEAAAEAAAAAAAAAAAAAAAAAAAAAAAAAAAEBAAEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQABAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEAAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEAAAAAAAAAAAAAAQAAAgAAAAAAAAAAAAAAAAAAAAAAAAMEAAAEBAQEBAQEBAQEBAUEBAQEBAQEBAQEBAQABAAGBwQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAAEAAQABAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQAAAAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEAAAEAAAAAAAAAAAAAAAAAAAAAAAABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAIAAAAAAAADAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwAAAAAAAAMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABAAABAAAAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAIAAAAAAgAAAAAAAAAAAAAAAAAAAAAAAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMAAAAAAAADAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABOT1VOQ0VFQ0tPVVRORUNURVRFQ1JJQkVMVVNIRVRFQURTRUFSQ0hSR0VDVElWSVRZTEVOREFSVkVPVElGWVBUSU9OU0NIU0VBWVNUQVRDSEdFT1JESVJFQ1RPUlRSQ0hQQVJBTUVURVJVUkNFQlNDUklCRUFSRE9XTkFDRUlORE5LQ0tVQlNDUklCRUhUVFAvQURUUC8="; +}); + +// node_modules/undici/lib/llhttp/llhttp_simd-wasm.js +var require_llhttp_simd_wasm = __commonJS((exports2, module2) => { + module2.exports = "AGFzbQEAAAABMAhgAX8Bf2ADf39/AX9gBH9/f38Bf2AAAGADf39/AGABfwBgAn9/AGAGf39/f39/AALLAQgDZW52GHdhc21fb25faGVhZGVyc19jb21wbGV0ZQACA2VudhV3YXNtX29uX21lc3NhZ2VfYmVnaW4AAANlbnYLd2FzbV9vbl91cmwAAQNlbnYOd2FzbV9vbl9zdGF0dXMAAQNlbnYUd2FzbV9vbl9oZWFkZXJfZmllbGQAAQNlbnYUd2FzbV9vbl9oZWFkZXJfdmFsdWUAAQNlbnYMd2FzbV9vbl9ib2R5AAEDZW52GHdhc21fb25fbWVzc2FnZV9jb21wbGV0ZQAAA0ZFAwMEAAAFAAAAAAAABQEFAAUFBQAABgAAAAAGBgYGAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQABAAABAQcAAAUFAwABBAUBcAESEgUDAQACBggBfwFBgNQECwfRBSIGbWVtb3J5AgALX2luaXRpYWxpemUACRlfX2luZGlyZWN0X2Z1bmN0aW9uX3RhYmxlAQALbGxodHRwX2luaXQAChhsbGh0dHBfc2hvdWxkX2tlZXBfYWxpdmUAQQxsbGh0dHBfYWxsb2MADAZtYWxsb2MARgtsbGh0dHBfZnJlZQANBGZyZWUASA9sbGh0dHBfZ2V0X3R5cGUADhVsbGh0dHBfZ2V0X2h0dHBfbWFqb3IADxVsbGh0dHBfZ2V0X2h0dHBfbWlub3IAEBFsbGh0dHBfZ2V0X21ldGhvZAARFmxsaHR0cF9nZXRfc3RhdHVzX2NvZGUAEhJsbGh0dHBfZ2V0X3VwZ3JhZGUAEwxsbGh0dHBfcmVzZXQAFA5sbGh0dHBfZXhlY3V0ZQAVFGxsaHR0cF9zZXR0aW5nc19pbml0ABYNbGxodHRwX2ZpbmlzaAAXDGxsaHR0cF9wYXVzZQAYDWxsaHR0cF9yZXN1bWUAGRtsbGh0dHBfcmVzdW1lX2FmdGVyX3VwZ3JhZGUAGhBsbGh0dHBfZ2V0X2Vycm5vABsXbGxodHRwX2dldF9lcnJvcl9yZWFzb24AHBdsbGh0dHBfc2V0X2Vycm9yX3JlYXNvbgAdFGxsaHR0cF9nZXRfZXJyb3JfcG9zAB4RbGxodHRwX2Vycm5vX25hbWUAHxJsbGh0dHBfbWV0aG9kX25hbWUAIBJs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IAH9CwMAIABBMGogAf0LAwAgAEEgaiAB/QsDACAAQd0BNgIcQQALewEBfwJAIAAoAgwiAw0AAkAgACgCBEUNACAAIAE2AgQLAkAgACABIAIQxICAgAAiAw0AIAAoAgwPCyAAIAM2AhxBACEDIAAoAgQiAUUNACAAIAEgAiAAKAIIEYGAgIAAACIBRQ0AIAAgAjYCFCAAIAE2AgwgASEDCyADC+TzAQMOfwN+BH8jgICAgABBEGsiAySAgICAACABIQQgASEFIAEhBiABIQcgASEIIAEhCSABIQogASELIAEhDCABIQ0gASEOIAEhDwJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQCAAKAIcIhBBf2oO3QHaAQHZAQIDBAUGBwgJCgsMDQ7YAQ8Q1wEREtYBExQVFhcYGRob4AHfARwdHtUBHyAhIiMkJdQBJicoKSorLNMB0gEtLtEB0AEvMDEyMzQ1Njc4OTo7PD0+P0BBQkNERUbbAUdISUrPAc4BS80BTMwBTU5PUFFSU1RVVldYWVpbXF1eX2BhYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ent8fX5/gAGBAYIBgwGEAYUBhgGHAYgBiQGKAYsBjAGNAY4BjwGQAZEBkgGTAZQBlQGWAZcBmAGZAZoBmwGcAZ0BngGfAaABoQGiAaMBpAGlAaYBpwGoAakBqgGrAawBrQGuAa8BsAGxAbIBswG0AbUBtgG3AcsBygG4AckBuQHIAboBuwG8Ab0BvgG/AcABwQHCAcMBxAHFAcYBANwBC0EAIRAMxgELQQ4hEAzFAQtBDSEQDMQBC0EPIRAMwwELQRAhEAzCAQtBEyEQDMEBC0EUIRAMwAELQRUhEAy/AQtBFiEQDL4BC0EXIRAMvQELQRghEAy8AQtBGSEQDLsBC0EaIRAMugELQRshEAy5AQtBHCEQDLgBC0EIIRAMtwELQR0hEAy2AQtBICEQDLUBC0EfIRAMtAELQQchEAyzAQtBISEQDLIBC0EiIRAMsQELQR4hEAywAQtBIyEQDK8BC0ESIRAMrgELQREhEAytAQtBJCEQDKwBC0ElIRAMqwELQSYhEAyqAQtBJyEQDKkBC0HDASEQDKgBC0EpIRAMpwELQSshEAymAQtBLCEQDKUBC0EtIRAMpAELQS4hEAyjAQtBLyEQDKIBC0HEASEQDKEBC0EwIRAMoAELQTQhEAyfAQtBDCEQDJ4BC0ExIRAMnQELQTIhEAycAQtBMyEQDJsBC0E5IRAMmgELQTUhEAyZAQtBxQEhEAyYAQtBCyEQDJcBC0E6IRAMlgELQTYhEAyVAQtBCiEQDJQBC0E3IRAMkwELQTghEAySAQtBPCEQDJEBC0E7IRAMkAELQT0hEAyPAQtBCSEQDI4BC0EoIRAMjQELQT4hEAyMAQtBPyEQDIsBC0HAACEQDIoBC0HBACEQDIkBC0HCACEQDIgBC0HDACEQDIcBC0HEACEQDIYBC0HFACEQDIUBC0HGACEQDIQBC0EqIRAMgwELQccAIRAMggELQcgAIRAMgQELQckAIRAMgAELQcoAIRAMfwtBywAhEAx+C0HNACEQDH0LQcwAIRAMfAtBzgAhEAx7C0HPACEQDHoLQdAAIRAMeQtB0QAhEAx4C0HSACEQDHcLQdMAIRAMdgtB1AAhEAx1C0HWACEQDHQLQdUAIRAMcwtBBiEQDHILQdcAIRAMcQtBBSEQDHALQdgAIRAMbwtBBCEQDG4LQdkAIRAMbQtB2gAhEAxsC0HbACEQDGsLQdwAIRAMagtBAyEQDGkLQd0AIRAMaAtB3gAhEAxnC0HfACEQDGYLQeEAIRAMZQtB4AAhEAxkC0HiACEQDGMLQeMAIRAMYgtBAiEQDGELQeQAIRAMYAtB5QAhEAxfC0HmACEQDF4LQecAIRAMXQtB6AAhEAxcC0HpACEQDFsLQeoAIRAMWgtB6wAhEAxZC0HsACEQDFgLQe0AIRAMVwtB7gAhEAxWC0HvACEQDFULQfAAIRAMVAtB8QAhEAxTC0HyACEQDFILQfMAIRAMUQtB9AAhEAxQC0H1ACEQDE8LQfYAIRAMTgtB9wAhEAxNC0H4ACEQDEwLQfkAIRAMSwtB+gAhEAxKC0H7ACEQDEkLQfwAIRAMSAtB/QAhEAxHC0H+ACEQDEYLQf8AIRAMRQtBgAEhEAxEC0GBASEQDEMLQYIBIRAMQgtBgwEhEAxBC0GEASEQDEALQYUBIRAMPwtBhgEhEAw+C0GHASEQDD0LQYgBIRAMPAtBiQEhEAw7C0GKASEQDDoLQYsBIRAMOQtBjAEhEAw4C0GNASEQDDcLQY4BIRAMNgtBjwEhEAw1C0GQASEQDDQLQZEBIRAMMwtBkgEhEAwyC0GTASEQDDELQZQBIRAMMAtBlQEhEAwvC0GWASEQDC4LQZcBIRAMLQtBmAEhEAwsC0GZASEQDCsLQZoBIRAMKgtBmwEhEAwpC0GcASEQDCgLQZ0BIRAMJwtBngEhEAwmC0GfASEQDCULQaABIRAMJAtBoQEhEAwjC0GiASEQDCILQaMBIRAMIQtBpAEhEAwgC0GlASEQDB8LQaYBIRAMHgtBpwEhEAwdC0GoASEQDBwLQakBIRAMGwtBqgEhEAwaC0GrASEQDBkLQawBIRAMGAtBrQEhEAwXC0GuASEQDBYLQQEhEAwVC0GvASEQDBQLQbABIRAMEwtBsQEhEAwSC0GzASEQDBELQbIBIRAMEAtBtAEhEAwPC0G1ASEQDA4LQbYBIRAMDQtBtwEhEAwMC0G4ASEQDAsLQbkBIRAMCgtBugEhEAwJC0G7ASEQDAgLQcYBIRAMBwtBvAEhEAwGC0G9ASEQDAULQb4BIRAMBAtBvwEhEAwDC0HAASEQDAILQcIBIRAMAQtBwQEhEAsDQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAIBAOxwEAAQIDBAUGBwgJCgsMDQ4PEBESExQVFhcYGRobHB4fICEjJSg/QEFERUZHSElKS0xNT1BRUlPeA1dZW1xdYGJlZmdoaWprbG1vcHFyc3R1dnd4eXp7fH1+gAGCAYUBhgGHAYkBiwGMAY0BjgGPAZABkQGUAZUBlgGXAZgBmQGaAZsBnAGdAZ4BnwGgAaEBogGjAaQBpQGmAacBqAGpAaoBqwGsAa0BrgGvAbABsQGyAbMBtAG1AbYBtwG4AbkBugG7AbwBvQG+Ab8BwAHBAcIBwwHEAcUBxgHHAcgByQHKAcsBzAHNAc4BzwHQAdEB0gHTAdQB1QHWAdcB2AHZAdoB2wHcAd0B3gHgAeEB4gHjAeQB5QHmAecB6AHpAeoB6wHsAe0B7gHvAfAB8QHyAfMBmQKkArAC/gL+AgsgASIEIAJHDfMBQd0BIRAM/wMLIAEiECACRw3dAUHDASEQDP4DCyABIgEgAkcNkAFB9wAhEAz9AwsgASIBIAJHDYYBQe8AIRAM/AMLIAEiASACRw1/QeoAIRAM+wMLIAEiASACRw17QegAIRAM+gMLIAEiASACRw14QeYAIRAM+QMLIAEiASACRw0aQRghEAz4AwsgASIBIAJHDRRBEiEQDPcDCyABIgEgAkcNWUHFACEQDPYDCyABIgEgAkcNSkE/IRAM9QMLIAEiASACRw1IQTwhEAz0AwsgASIBIAJHDUFBMSEQDPMDCyAALQAuQQFGDesDDIcCCyAAIAEiASACEMCAgIAAQQFHDeYBIABCADcDIAznAQsgACABIgEgAhC0gICAACIQDecBIAEhAQz1AgsCQCABIgEgAkcNAEEGIRAM8AMLIAAgAUEBaiIBIAIQu4CAgAAiEA3oASABIQEMMQsgAEIANwMgQRIhEAzVAwsgASIQIAJHDStBHSEQDO0DCwJAIAEiASACRg0AIAFBAWohAUEQIRAM1AMLQQchEAzsAwsgAEIAIAApAyAiESACIAEiEGutIhJ9IhMgEyARVhs3AyAgESASViIURQ3lAUEIIRAM6wMLAkAgASIBIAJGDQAgAEGJgICAADYCCCAAIAE2AgQgASEBQRQhEAzSAwtBCSEQDOoDCyABIQEgACkDIFAN5AEgASEBDPICCwJAIAEiASACRw0AQQshEAzpAwsgACABQQFqIgEgAhC2gICAACIQDeUBIAEhAQzyAgsgACABIgEgAhC4gICAACIQDeUBIAEhAQzyAgsgACABIgEgAhC4gICAACIQDeYBIAEhAQwNCyAAIAEiASACELqAgIAAIhAN5wEgASEBDPACCwJAIAEiASACRw0AQQ8hEAzlAwsgAS0AACIQQTtGDQggEEENRw3oASABQQFqIQEM7wILIAAgASIBIAIQuoCAgAAiEA3oASABIQEM8gILA0ACQCABLQAAQfC1gIAAai0AACIQQQFGDQAgEEECRw3rASAAKAIEIRAgAEEANgIEIAAgECABQQFqIgEQuYCAgAAiEA3qASABIQEM9AILIAFBAWoiASACRw0AC0ESIRAM4gMLIAAgASIBIAIQuoCAgAAiEA3pASABIQEMCgsgASIBIAJHDQZBGyEQDOADCwJAIAEiASACRw0AQRYhEAzgAwsgAEGKgICAADYCCCAAIAE2AgQgACABIAIQuICAgAAiEA3qASABIQFBICEQDMYDCwJAIAEiASACRg0AA0ACQCABLQAAQfC3gIAAai0AACIQQQJGDQACQCAQQX9qDgTlAewBAOsB7AELIAFBAWohAUEIIRAMyAMLIAFBAWoiASACRw0AC0EVIRAM3wMLQRUhEAzeAwsDQAJAIAEtAABB8LmAgABqLQAAIhBBAkYNACAQQX9qDgTeAewB4AHrAewBCyABQQFqIgEgAkcNAAtBGCEQDN0DCwJAIAEiASACRg0AIABBi4CAgAA2AgggACABNgIEIAEhAUEHIRAMxAMLQRkhEAzcAwsgAUEBaiEBDAILAkAgASIUIAJHDQBBGiEQDNsDCyAUIQECQCAULQAAQXNqDhTdAu4C7gLuAu4C7gLuAu4C7gLuAu4C7gLuAu4C7gLuAu4C7gLuAgDuAgtBACEQIABBADYCHCAAQa+LgIAANgIQIABBAjYCDCAAIBRBAWo2AhQM2gMLAkAgAS0AACIQQTtGDQAgEEENRw3oASABQQFqIQEM5QILIAFBAWohAQtBIiEQDL8DCwJAIAEiECACRw0AQRwhEAzYAwtCACERIBAhASAQLQAAQVBqDjfnAeYBAQIDBAUGBwgAAAAAAAAACQoLDA0OAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAPEBESExQAC0EeIRAMvQMLQgIhEQzlAQtCAyERDOQBC0IEIREM4wELQgUhEQziAQtCBiERDOEBC0IHIREM4AELQgghEQzfAQtCCSERDN4BC0IKIREM3QELQgshEQzcAQtCDCERDNsBC0INIREM2gELQg4hEQzZAQtCDyERDNgBC0IKIREM1wELQgshEQzWAQtCDCERDNUBC0INIREM1AELQg4hEQzTAQtCDyERDNIBC0IAIRECQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAIBAtAABBUGoON+UB5AEAAQIDBAUGB+YB5gHmAeYB5gHmAeYBCAkKCwwN5gHmAeYB5gHmAeYB5gHmAeYB5gHmAeYB5gHmAeYB5gHmAeYB5gHmAeYB5gHmAeYB5gHmAQ4PEBESE+YBC0ICIREM5AELQgMhEQzjAQtCBCERDOIBC0IFIREM4QELQgYhEQzgAQtCByERDN8BC0IIIREM3gELQgkhEQzdAQtCCiERDNwBC0ILIREM2wELQgwhEQzaAQtCDSERDNkBC0IOIREM2AELQg8hEQzXAQtCCiERDNYBC0ILIREM1QELQgwhEQzUAQtCDSERDNMBC0IOIREM0gELQg8hEQzRAQsgAEIAIAApAyAiESACIAEiEGutIhJ9IhMgEyARVhs3AyAgESASViIURQ3SAUEfIRAMwAMLAkAgASIBIAJGDQAgAEGJgICAADYCCCAAIAE2AgQgASEBQSQhEAynAwtBICEQDL8DCyAAIAEiECACEL6AgIAAQX9qDgW2AQDFAgHRAdIBC0ERIRAMpAMLIABBAToALyAQIQEMuwMLIAEiASACRw3SAUEkIRAMuwMLIAEiDSACRw0eQcYAIRAMugMLIAAgASIBIAIQsoCAgAAiEA3UASABIQEMtQELIAEiECACRw0mQdAAIRAMuAMLAkAgASIBIAJHDQBBKCEQDLgDCyAAQQA2AgQgAEGMgICAADYCCCAAIAEgARCxgICAACIQDdMBIAEhAQzYAQsCQCABIhAgAkcNAEEpIRAMtwMLIBAtAAAiAUEgRg0UIAFBCUcN0wEgEEEBaiEBDBULAkAgASIBIAJGDQAgAUEBaiEBDBcLQSohEAy1AwsCQCABIhAgAkcNAEErIRAMtQMLAkAgEC0AACIBQQlGDQAgAUEgRw3VAQsgAC0ALEEIRg3TASAQIQEMkQMLAkAgASIBIAJHDQBBLCEQDLQDCyABLQAAQQpHDdUBIAFBAWohAQzJAgsgASIOIAJHDdUBQS8hEAyyAwsDQAJAIAEtAAAiEEEgRg0AAkAgEEF2ag4EANwB3AEA2gELIAEhAQzgAQsgAUEBaiIBIAJHDQALQTEhEAyxAwtBMiEQIAEiFCACRg2wAyACIBRrIAAoAgAiAWohFSAUIAFrQQNqIRYCQANAIBQtAAAiF0EgciAXIBdBv39qQf8BcUEaSRtB/wFxIAFB8LuAgABqLQAARw0BAkAgAUEDRw0AQQYhAQyWAwsgAUEBaiEBIBRBAWoiFCACRw0ACyAAIBU2AgAMsQMLIABBADYCACAUIQEM2QELQTMhECABIhQgAkYNrwMgAiAUayAAKAIAIgFqIRUgFCABa0EIaiEWAkADQCAULQAAIhdBIHIgFyAXQb9/akH/AXFBGkkbQf8BcSABQfS7gIAAai0AAEcNAQJAIAFBCEcNAEEFIQEMlQMLIAFBAWohASAUQQFqIhQgAkcNAAsgACAVNgIADLADCyAAQQA2AgAgFCEBDNgBC0E0IRAgASIUIAJGDa4DIAIgFGsgACgCACIBaiEVIBQgAWtBBWohFgJAA0AgFC0AACIXQSByIBcgF0G/f2pB/wFxQRpJG0H/AXEgAUHQwoCAAGotAABHDQECQCABQQVHDQBBByEBDJQDCyABQQFqIQEgFEEBaiIUIAJHDQALIAAgFTYCAAyvAwsgAEEANgIAIBQhAQzXAQsCQCABIgEgAkYNAANAAkAgAS0AAEGAvoCAAGotAAAiEEEBRg0AIBBBAkYNCiABIQEM3QELIAFBAWoiASACRw0AC0EwIRAMrgMLQTAhEAytAwsCQCABIgEgAkYNAANAAkAgAS0AACIQQSBGDQAgEEF2ag4E2QHaAdoB2QHaAQsgAUEBaiIBIAJHDQALQTghEAytAwtBOCEQDKwDCwNAAkAgAS0AACIQQSBGDQAgEEEJRw0DCyABQQFqIgEgAkcNAAtBPCEQDKsDCwNAAkAgAS0AACIQQSBGDQACQAJAIBBBdmoOBNoBAQHaAQALIBBBLEYN2wELIAEhAQwECyABQQFqIgEgAkcNAAtBPyEQDKoDCyABIQEM2wELQcAAIRAgASIUIAJGDagDIAIgFGsgACgCACIBaiEWIBQgAWtBBmohFwJAA0AgFC0AAEEgciABQYDAgIAAai0AAEcNASABQQZGDY4DIAFBAWohASAUQQFqIhQgAkcNAAsgACAWNgIADKkDCyAAQQA2AgAgFCEBC0E2IRAMjgMLAkAgASIPIAJHDQBBwQAhEAynAwsgAEGMgICAADYCCCAAIA82AgQgDyEBIAAtACxBf2oOBM0B1QHXAdkBhwMLIAFBAWohAQzMAQsCQCABIgEgAkYNAANAAkAgAS0AACIQQSByIBAgEEG/f2pB/wFxQRpJG0H/AXEiEEEJRg0AIBBBIEYNAAJAAkACQAJAIBBBnX9qDhMAAwMDAwMDAwEDAwMDAwMDAwMCAwsgAUEBaiEBQTEhEAyRAwsgAUEBaiEBQTIhEAyQAwsgAUEBaiEBQTMhEAyPAwsgASEBDNABCyABQQFqIgEgAkcNAAtBNSEQDKUDC0E1IRAMpAMLAkAgASIBIAJGDQADQAJAIAEtAABBgLyAgABqLQAAQQFGDQAgASEBDNMBCyABQQFqIgEgAkcNAAtBPSEQDKQDC0E9IRAMowMLIAAgASIBIAIQsICAgAAiEA3WASABIQEMAQsgEEEBaiEBC0E8IRAMhwMLAkAgASIBIAJHDQBBwgAhEAygAwsCQANAAkAgAS0AAEF3ag4YAAL+Av4ChAP+Av4C/gL+Av4C/gL+Av4C/gL+Av4C/gL+Av4C/gL+Av4C/gIA/gILIAFBAWoiASACRw0AC0HCACEQDKADCyABQQFqIQEgAC0ALUEBcUUNvQEgASEBC0EsIRAMhQMLIAEiASACRw3TAUHEACEQDJ0DCwNAAkAgAS0AAEGQwICAAGotAABBAUYNACABIQEMtwILIAFBAWoiASACRw0AC0HFACEQDJwDCyANLQAAIhBBIEYNswEgEEE6Rw2BAyAAKAIEIQEgAEEANgIEIAAgASANEK+AgIAAIgEN0AEgDUEBaiEBDLMCC0HHACEQIAEiDSACRg2aAyACIA1rIAAoAgAiAWohFiANIAFrQQVqIRcDQCANLQAAIhRBIHIgFCAUQb9/akH/AXFBGkkbQf8BcSABQZDCgIAAai0AAEcNgAMgAUEFRg30AiABQQFqIQEgDUEBaiINIAJHDQALIAAgFjYCAAyaAwtByAAhECABIg0gAkYNmQMgAiANayAAKAIAIgFqIRYgDSABa0EJaiEXA0AgDS0AACIUQSByIBQgFEG/f2pB/wFxQRpJG0H/AXEgAUGWwoCAAGotAABHDf8CAkAgAUEJRw0AQQIhAQz1AgsgAUEBaiEBIA1BAWoiDSACRw0ACyAAIBY2AgAMmQMLAkAgASINIAJHDQBByQAhEAyZAwsCQAJAIA0tAAAiAUEgciABIAFBv39qQf8BcUEaSRtB/wFxQZJ/ag4HAIADgAOAA4ADgAMBgAMLIA1BAWohAUE+IRAMgAMLIA1BAWohAUE/IRAM/wILQcoAIRAgASINIAJGDZcDIAIgDWsgACgCACIBaiEWIA0gAWtBAWohFwNAIA0tAAAiFEEgciAUIBRBv39qQf8BcUEaSRtB/wFxIAFBoMKAgABqLQAARw39AiABQQFGDfACIAFBAWohASANQQFqIg0gAkcNAAsgACAWNgIADJcDC0HLACEQIAEiDSACRg2WAyACIA1rIAAoAgAiAWohFiANIAFrQQ5qIRcDQCANLQAAIhRBIHIgFCAUQb9/akH/AXFBGkkbQf8BcSABQaLCgIAAai0AAEcN/AIgAUEORg3wAiABQQFqIQEgDUEBaiINIAJHDQALIAAgFjYCAAyWAwtBzAAhECABIg0gAkYNlQMgAiANayAAKAIAIgFqIRYgDSABa0EPaiEXA0AgDS0AACIUQSByIBQgFEG/f2pB/wFxQRpJG0H/AXEgAUHAwoCAAGotAABHDfsCAkAgAUEPRw0AQQMhAQzxAgsgAUEBaiEBIA1BAWoiDSACRw0ACyAAIBY2AgAMlQMLQc0AIRAgASINIAJGDZQDIAIgDWsgACgCACIBaiEWIA0gAWtBBWohFwNAIA0tAAAiFEEgciAUIBRBv39qQf8BcUEaSRtB/wFxIAFB0MKAgABqLQAARw36AgJAIAFBBUcNAEEEIQEM8AILIAFBAWohASANQQFqIg0gAkcNAAsgACAWNgIADJQDCwJAIAEiDSACRw0AQc4AIRAMlAMLAkACQAJAAkAgDS0AACIBQSByIAEgAUG/f2pB/wFxQRpJG0H/AXFBnX9qDhMA/QL9Av0C/QL9Av0C/QL9Av0C/QL9Av0CAf0C/QL9AgID/QILIA1BAWohAUHBACEQDP0CCyANQQFqIQFBwgAhEAz8AgsgDUEBaiEBQcMAIRAM+wILIA1BAWohAUHEACEQDPoCCwJAIAEiASACRg0AIABBjYCAgAA2AgggACABNgIEIAEhAUHFACEQDPoCC0HPACEQDJIDCyAQIQECQAJAIBAtAABBdmoOBAGoAqgCAKgCCyAQQQFqIQELQSchEAz4AgsCQCABIgEgAkcNAEHRACEQDJEDCwJAIAEtAABBIEYNACABIQEMjQELIAFBAWohASAALQAtQQFxRQ3HASABIQEMjAELIAEiFyACRw3IAUHSACEQDI8DC0HTACEQIAEiFCACRg2OAyACIBRrIAAoAgAiAWohFiAUIAFrQQFqIRcDQCAULQAAIAFB1sKAgABqLQAARw3MASABQQFGDccBIAFBAWohASAUQQFqIhQgAkcNAAsgACAWNgIADI4DCwJAIAEiASACRw0AQdUAIRAMjgMLIAEtAABBCkcNzAEgAUEBaiEBDMcBCwJAIAEiASACRw0AQdYAIRAMjQMLAkACQCABLQAAQXZqDgQAzQHNAQHNAQsgAUEBaiEBDMcBCyABQQFqIQFBygAhEAzzAgsgACABIgEgAhCugICAACIQDcsBIAEhAUHNACEQDPICCyAALQApQSJGDYUDDKYCCwJAIAEiASACRw0AQdsAIRAMigMLQQAhFEEBIRdBASEWQQAhEAJAAkACQAJAAkACQAJAAkACQCABLQAAQVBqDgrUAdMBAAECAwQFBgjVAQtBAiEQDAYLQQMhEAwFC0EEIRAMBAtBBSEQDAMLQQYhEAwCC0EHIRAMAQtBCCEQC0EAIRdBACEWQQAhFAzMAQtBCSEQQQEhFEEAIRdBACEWDMsBCwJAIAEiASACRw0AQd0AIRAMiQMLIAEtAABBLkcNzAEgAUEBaiEBDKYCCyABIgEgAkcNzAFB3wAhEAyHAwsCQCABIgEgAkYNACAAQY6AgIAANgIIIAAgATYCBCABIQFB0AAhEAzuAgtB4AAhEAyGAwtB4QAhECABIgEgAkYNhQMgAiABayAAKAIAIhRqIRYgASAUa0EDaiEXA0AgAS0AACAUQeLCgIAAai0AAEcNzQEgFEEDRg3MASAUQQFqIRQgAUEBaiIBIAJHDQALIAAgFjYCAAyFAwtB4gAhECABIgEgAkYNhAMgAiABayAAKAIAIhRqIRYgASAUa0ECaiEXA0AgAS0AACAUQebCgIAAai0AAEcNzAEgFEECRg3OASAUQQFqIRQgAUEBaiIBIAJHDQALIAAgFjYCAAyEAwtB4wAhECABIgEgAkYNgwMgAiABayAAKAIAIhRqIRYgASAUa0EDaiEXA0AgAS0AACAUQenCgIAAai0AAEcNywEgFEEDRg3OASAUQQFqIRQgAUEBaiIBIAJHDQALIAAgFjYCAAyDAwsCQCABIgEgAkcNAEHlACEQDIMDCyAAIAFBAWoiASACEKiAgIAAIhANzQEgASEBQdYAIRAM6QILAkAgASIBIAJGDQADQAJAIAEtAAAiEEEgRg0AAkACQAJAIBBBuH9qDgsAAc8BzwHPAc8BzwHPAc8BzwECzwELIAFBAWohAUHSACEQDO0CCyABQQFqIQFB0wAhEAzsAgsgAUEBaiEBQdQAIRAM6wILIAFBAWoiASACRw0AC0HkACEQDIIDC0HkACEQDIEDCwNAAkAgAS0AAEHwwoCAAGotAAAiEEEBRg0AIBBBfmoOA88B0AHRAdIBCyABQQFqIgEgAkcNAAtB5gAhEAyAAwsCQCABIgEgAkYNACABQQFqIQEMAwtB5wAhEAz/AgsDQAJAIAEtAABB8MSAgABqLQAAIhBBAUYNAAJAIBBBfmoOBNIB0wHUAQDVAQsgASEBQdcAIRAM5wILIAFBAWoiASACRw0AC0HoACEQDP4CCwJAIAEiASACRw0AQekAIRAM/gILAkAgAS0AACIQQXZqDhq6AdUB1QG8AdUB1QHVAdUB1QHVAdUB1QHVAdUB1QHVAdUB1QHVAdUB1QHVAcoB1QHVAQDTAQsgAUEBaiEBC0EGIRAM4wILA0ACQCABLQAAQfDGgIAAai0AAEEBRg0AIAEhAQyeAgsgAUEBaiIBIAJHDQALQeoAIRAM+wILAkAgASIBIAJGDQAgAUEBaiEBDAMLQesAIRAM+gILAkAgASIBIAJHDQBB7AAhEAz6AgsgAUEBaiEBDAELAkAgASIBIAJHDQBB7QAhEAz5AgsgAUEBaiEBC0EEIRAM3gILAkAgASIUIAJHDQBB7gAhEAz3AgsgFCEBAkACQAJAIBQtAABB8MiAgABqLQAAQX9qDgfUAdUB1gEAnAIBAtcBCyAUQQFqIQEMCgsgFEEBaiEBDM0BC0EAIRAgAEEANgIcIABBm5KAgAA2AhAgAEEHNgIMIAAgFEEBajYCFAz2AgsCQANAAkAgAS0AAEHwyICAAGotAAAiEEEERg0AAkACQCAQQX9qDgfSAdMB1AHZAQAEAdkBCyABIQFB2gAhEAzgAgsgAUEBaiEBQdwAIRAM3wILIAFBAWoiASACRw0AC0HvACEQDPYCCyABQQFqIQEMywELAkAgASIUIAJHDQBB8AAhEAz1AgsgFC0AAEEvRw3UASAUQQFqIQEMBgsCQCABIhQgAkcNAEHxACEQDPQCCwJAIBQtAAAiAUEvRw0AIBRBAWohAUHdACEQDNsCCyABQXZqIgRBFksN0wFBASAEdEGJgIACcUUN0wEMygILAkAgASIBIAJGDQAgAUEBaiEBQd4AIRAM2gILQfIAIRAM8gILAkAgASIUIAJHDQBB9AAhEAzyAgsgFCEBAkAgFC0AAEHwzICAAGotAABBf2oOA8kClAIA1AELQeEAIRAM2AILAkAgASIUIAJGDQADQAJAIBQtAABB8MqAgABqLQAAIgFBA0YNAAJAIAFBf2oOAssCANUBCyAUIQFB3wAhEAzaAgsgFEEBaiIUIAJHDQALQfMAIRAM8QILQfMAIRAM8AILAkAgASIBIAJGDQAgAEGPgICAADYCCCAAIAE2AgQgASEBQeAAIRAM1wILQfUAIRAM7wILAkAgASIBIAJHDQBB9gAhEAzvAgsgAEGPgICAADYCCCAAIAE2AgQgASEBC0EDIRAM1AILA0AgAS0AAEEgRw3DAiABQQFqIgEgAkcNAAtB9wAhEAzsAgsCQCABIgEgAkcNAEH4ACEQDOwCCyABLQAAQSBHDc4BIAFBAWohAQzvAQsgACABIgEgAhCsgICAACIQDc4BIAEhAQyOAgsCQCABIgQgAkcNAEH6ACEQDOoCCyAELQAAQcwARw3RASAEQQFqIQFBEyEQDM8BCwJAIAEiBCACRw0AQfsAIRAM6QILIAIgBGsgACgCACIBaiEUIAQgAWtBBWohEANAIAQtAAAgAUHwzoCAAGotAABHDdABIAFBBUYNzgEgAUEBaiEBIARBAWoiBCACRw0ACyAAIBQ2AgBB+wAhEAzoAgsCQCABIgQgAkcNAEH8ACEQDOgCCwJAAkAgBC0AAEG9f2oODADRAdEB0QHRAdEB0QHRAdEB0QHRAQHRAQsgBEEBaiEBQeYAIRAMzwILIARBAWohAUHnACEQDM4CCwJAIAEiBCACRw0AQf0AIRAM5wILIAIgBGsgACgCACIBaiEUIAQgAWtBAmohEAJAA0AgBC0AACABQe3PgIAAai0AAEcNzwEgAUECRg0BIAFBAWohASAEQQFqIgQgAkcNAAsgACAUNgIAQf0AIRAM5wILIABBADYCACAQQQFqIQFBECEQDMwBCwJAIAEiBCACRw0AQf4AIRAM5gILIAIgBGsgACgCACIBaiEUIAQgAWtBBWohEAJAA0AgBC0AACABQfbOgIAAai0AAEcNzgEgAUEFRg0BIAFBAWohASAEQQFqIgQgAkcNAAsgACAUNgIAQf4AIRAM5gILIABBADYCACAQQQFqIQFBFiEQDMsBCwJAIAEiBCACRw0AQf8AIRAM5QILIAIgBGsgACgCACIBaiEUIAQgAWtBA2ohEAJAA0AgBC0AACABQfzOgIAAai0AAEcNzQEgAUEDRg0BIAFBAWohASAEQQFqIgQgAkcNAAsgACAUNgIAQf8AIRAM5QILIABBADYCACAQQQFqIQFBBSEQDMoBCwJAIAEiBCACRw0AQYABIRAM5AILIAQtAABB2QBHDcsBIARBAWohAUEIIRAMyQELAkAgASIEIAJHDQBBgQEhEAzjAgsCQAJAIAQtAABBsn9qDgMAzAEBzAELIARBAWohAUHrACEQDMoCCyAEQQFqIQFB7AAhEAzJAgsCQCABIgQgAkcNAEGCASEQDOICCwJAAkAgBC0AAEG4f2oOCADLAcsBywHLAcsBywEBywELIARBAWohAUHqACEQDMkCCyAEQQFqIQFB7QAhEAzIAgsCQCABIgQgAkcNAEGDASEQDOECCyACIARrIAAoAgAiAWohECAEIAFrQQJqIRQCQANAIAQtAAAgAUGAz4CAAGotAABHDckBIAFBAkYNASABQQFqIQEgBEEBaiIEIAJHDQALIAAgEDYCAEGDASEQDOECC0EAIRAgAEEANgIAIBRBAWohAQzGAQsCQCABIgQgAkcNAEGEASEQDOACCyACIARrIAAoAgAiAWohFCAEIAFrQQRqIRACQANAIAQtAAAgAUGDz4CAAGotAABHDcgBIAFBBEYNASABQQFqIQEgBEEBaiIEIAJHDQALIAAgFDYCAEGEASEQDOACCyAAQQA2AgAgEEEBaiEBQSMhEAzFAQsCQCABIgQgAkcNAEGFASEQDN8CCwJAAkAgBC0AAEG0f2oOCADIAcgByAHIAcgByAEByAELIARBAWohAUHvACEQDMYCCyAEQQFqIQFB8AAhEAzFAgsCQCABIgQgAkcNAEGGASEQDN4CCyAELQAAQcUARw3FASAEQQFqIQEMgwILAkAgASIEIAJHDQBBhwEhEAzdAgsgAiAEayAAKAIAIgFqIRQgBCABa0EDaiEQAkADQCAELQAAIAFBiM+AgABqLQAARw3FASABQQNGDQEgAUEBaiEBIARBAWoiBCACRw0ACyAAIBQ2AgBBhwEhEAzdAgsgAEEANgIAIBBBAWohAUEtIRAMwgELAkAgASIEIAJHDQBBiAEhEAzcAgsgAiAEayAAKAIAIgFqIRQgBCABa0EIaiEQAkADQCAELQAAIAFB0M+AgABqLQAARw3EASABQQhGDQEgAUEBaiEBIARBAWoiBCACRw0ACyAAIBQ2AgBBiAEhEAzcAgsgAEEANgIAIBBBAWohAUEpIRAMwQELAkAgASIBIAJHDQBBiQEhEAzbAgtBASEQIAEtAABB3wBHDcABIAFBAWohAQyBAgsCQCABIgQgAkcNAEGKASEQDNoCCyACIARrIAAoAgAiAWohFCAEIAFrQQFqIRADQCAELQAAIAFBjM+AgABqLQAARw3BASABQQFGDa8CIAFBAWohASAEQQFqIgQgAkcNAAsgACAUNgIAQYoBIRAM2QILAkAgASIEIAJHDQBBiwEhEAzZAgsgAiAEayAAKAIAIgFqIRQgBCABa0ECaiEQAkADQCAELQAAIAFBjs+AgABqLQAARw3BASABQQJGDQEgAUEBaiEBIARBAWoiBCACRw0ACyAAIBQ2AgBBiwEhEAzZAgsgAEEANgIAIBBBAWohAUECIRAMvgELAkAgASIEIAJHDQBBjAEhEAzYAgsgAiAEayAAKAIAIgFqIRQgBCABa0EBaiEQAkADQCAELQAAIAFB8M+AgABqLQAARw3AASABQQFGDQEgAUEBaiEBIARBAWoiBCACRw0ACyAAIBQ2AgBBjAEhEAzYAgsgAEEANgIAIBBBAWohAUEfIRAMvQELAkAgASIEIAJHDQBBjQEhEAzXAgsgAiAEayAAKAIAIgFqIRQgBCABa0EBaiEQAkADQCAELQAAIAFB8s+AgABqLQAARw2/ASABQQFGDQEgAUEBaiEBIARBAWoiBCACRw0ACyAAIBQ2AgBBjQEhEAzXAgsgAEEANgIAIBBBAWohAUEJIRAMvAELAkAgASIEIAJHDQBBjgEhEAzWAgsCQAJAIAQtAABBt39qDgcAvwG/Ab8BvwG/AQG/AQsgBEEBaiEBQfgAIRAMvQILIARBAWohAUH5ACEQDLwCCwJAIAEiBCACRw0AQY8BIRAM1QILIAIgBGsgACgCACIBaiEUIAQgAWtBBWohEAJAA0AgBC0AACABQZHPgIAAai0AAEcNvQEgAUEFRg0BIAFBAWohASAEQQFqIgQgAkcNAAsgACAUNgIAQY8BIRAM1QILIABBADYCACAQQQFqIQFBGCEQDLoBCwJAIAEiBCACRw0AQZABIRAM1AILIAIgBGsgACgCACIBaiEUIAQgAWtBAmohEAJAA0AgBC0AACABQZfPgIAAai0AAEcNvAEgAUECRg0BIAFBAWohASAEQQFqIgQgAkcNAAsgACAUNgIAQZABIRAM1AILIABBADYCACAQQQFqIQFBFyEQDLkBCwJAIAEiBCACRw0AQZEBIRAM0wILIAIgBGsgACgCACIBaiEUIAQgAWtBBmohEAJAA0AgBC0AACABQZrPgIAAai0AAEcNuwEgAUEGRg0BIAFBAWohASAEQQFqIgQgAkcNAAsgACAUNgIAQZEBIRAM0wILIABBADYCACAQQQFqIQFBFSEQDLgBCwJAIAEiBCACRw0AQZIBIRAM0gILIAIgBGsgACgCACIBaiEUIAQgAWtBBWohEAJAA0AgBC0AACABQaHPgIAAai0AAEcNugEgAUEFRg0BIAFBAWohASAEQQFqIgQgAkcNAAsgACAUNgIAQZIBIRAM0gILIABBADYCACAQQQFqIQFBHiEQDLcBCwJAIAEiBCACRw0AQZMBIRAM0QILIAQtAABBzABHDbgBIARBAWohAUEKIRAMtgELAkAgBCACRw0AQZQBIRAM0AILAkACQCAELQAAQb9/ag4PALkBuQG5AbkBuQG5AbkBuQG5AbkBuQG5AbkBAbkBCyAEQQFqIQFB/gAhEAy3AgsgBEEBaiEBQf8AIRAMtgILAkAgBCACRw0AQZUBIRAMzwILAkACQCAELQAAQb9/ag4DALgBAbgBCyAEQQFqIQFB/QAhEAy2AgsgBEEBaiEEQYABIRAMtQILAkAgBCACRw0AQZYBIRAMzgILIAIgBGsgACgCACIBaiEUIAQgAWtBAWohEAJAA0AgBC0AACABQafPgIAAai0AAEcNtgEgAUEBRg0BIAFBAWohASAEQQFqIgQgAkcNAAsgACAUNgIAQZYBIRAMzgILIABBADYCACAQQQFqIQFBCyEQDLMBCwJAIAQgAkcNAEGXASEQDM0CCwJAAkACQAJAIAQtAABBU2oOIwC4AbgBuAG4AbgBuAG4AbgBuAG4AbgBuAG4AbgBuAG4AbgBuAG4AbgBuAG4AbgBAbgBuAG4AbgBuAECuAG4AbgBA7gBCyAEQQFqIQFB+wAhEAy2AgsgBEEBaiEBQfwAIRAMtQILIARBAWohBEGBASEQDLQCCyAEQQFqIQRBggEhEAyzAgsCQCAEIAJHDQBBmAEhEAzMAgsgAiAEayAAKAIAIgFqIRQgBCABa0EEaiEQAkADQCAELQAAIAFBqc+AgABqLQAARw20ASABQQRGDQEgAUEBaiEBIARBAWoiBCACRw0ACyAAIBQ2AgBBmAEhEAzMAgsgAEEANgIAIBBBAWohAUEZIRAMsQELAkAgBCACRw0AQZkBIRAMywILIAIgBGsgACgCACIBaiEUIAQgAWtBBWohEAJAA0AgBC0AACABQa7PgIAAai0AAEcNswEgAUEFRg0BIAFBAWohASAEQQFqIgQgAkcNAAsgACAUNgIAQZkBIRAMywILIABBADYCACAQQQFqIQFBBiEQDLABCwJAIAQgAkcNAEGaASEQDMoCCyACIARrIAAoAgAiAWohFCAEIAFrQQFqIRACQANAIAQtAAAgAUG0z4CAAGotAABHDbIBIAFBAUYNASABQQFqIQEgBEEBaiIEIAJHDQALIAAgFDYCAEGaASEQDMoCCyAAQQA2AgAgEEEBaiEBQRwhEAyvAQsCQCAEIAJHDQBBmwEhEAzJAgsgAiAEayAAKAIAIgFqIRQgBCABa0EBaiEQAkADQCAELQAAIAFBts+AgABqLQAARw2xASABQQFGDQEgAUEBaiEBIARBAWoiBCACRw0ACyAAIBQ2AgBBmwEhEAzJAgsgAEEANgIAIBBBAWohAUEnIRAMrgELAkAgBCACRw0AQZwBIRAMyAILAkACQCAELQAAQax/ag4CAAGxAQsgBEEBaiEEQYYBIRAMrwILIARBAWohBEGHASEQDK4CCwJAIAQgAkcNAEGdASEQDMcCCyACIARrIAAoAgAiAWohFCAEIAFrQQFqIRACQANAIAQtAAAgAUG4z4CAAGotAABHDa8BIAFBAUYNASABQQFqIQEgBEEBaiIEIAJHDQALIAAgFDYCAEGdASEQDMcCCyAAQQA2AgAgEEEBaiEBQSYhEAysAQsCQCAEIAJHDQBBngEhEAzGAgsgAiAEayAAKAIAIgFqIRQgBCABa0EBaiEQAkADQCAELQAAIAFBus+AgABqLQAARw2uASABQQFGDQEgAUEBaiEBIARBAWoiBCACRw0ACyAAIBQ2AgBBngEhEAzGAgsgAEEANgIAIBBBAWohAUEDIRAMqwELAkAgBCACRw0AQZ8BIRAMxQILIAIgBGsgACgCACIBaiEUIAQgAWtBAmohEAJAA0AgBC0AACABQe3PgIAAai0AAEcNrQEgAUECRg0BIAFBAWohASAEQQFqIgQgAkcNAAsgACAUNgIAQZ8BIRAMxQILIABBADYCACAQQQFqIQFBDCEQDKoBCwJAIAQgAkcNAEGgASEQDMQCCyACIARrIAAoAgAiAWohFCAEIAFrQQNqIRACQANAIAQtAAAgAUG8z4CAAGotAABHDawBIAFBA0YNASABQQFqIQEgBEEBaiIEIAJHDQALIAAgFDYCAEGgASEQDMQCCyAAQQA2AgAgEEEBaiEBQQ0hEAypAQsCQCAEIAJHDQBBoQEhEAzDAgsCQAJAIAQtAABBun9qDgsArAGsAawBrAGsAawBrAGsAawBAawBCyAEQQFqIQRBiwEhEAyqAgsgBEEBaiEEQYwBIRAMqQILAkAgBCACRw0AQaIBIRAMwgILIAQtAABB0ABHDakBIARBAWohBAzpAQsCQCAEIAJHDQBBowEhEAzBAgsCQAJAIAQtAABBt39qDgcBqgGqAaoBqgGqAQCqAQsgBEEBaiEEQY4BIRAMqAILIARBAWohAUEiIRAMpgELAkAgBCACRw0AQaQBIRAMwAILIAIgBGsgACgCACIBaiEUIAQgAWtBAWohEAJAA0AgBC0AACABQcDPgIAAai0AAEcNqAEgAUEBRg0BIAFBAWohASAEQQFqIgQgAkcNAAsgACAUNgIAQaQBIRAMwAILIABBADYCACAQQQFqIQFBHSEQDKUBCwJAIAQgAkcNAEGlASEQDL8CCwJAAkAgBC0AAEGuf2oOAwCoAQGoAQsgBEEBaiEEQZABIRAMpgILIARBAWohAUEEIRAMpAELAkAgBCACRw0AQaYBIRAMvgILAkACQAJAAkACQCAELQAAQb9/ag4VAKoBqgGqAaoBqgGqAaoBqgGqAaoBAaoBqgECqgGqAQOqAaoBBKoBCyAEQQFqIQRBiAEhEAyoAgsgBEEBaiEEQYkBIRAMpwILIARBAWohBEGKASEQDKYCCyAEQQFqIQRBjwEhEAylAgsgBEEBaiEEQZEBIRAMpAILAkAgBCACRw0AQacBIRAMvQILIAIgBGsgACgCACIBaiEUIAQgAWtBAmohEAJAA0AgBC0AACABQe3PgIAAai0AAEcNpQEgAUECRg0BIAFBAWohASAEQQFqIgQgAkcNAAsgACAUNgIAQacBIRAMvQILIABBADYCACAQQQFqIQFBESEQDKIBCwJAIAQgAkcNAEGoASEQDLwCCyACIARrIAAoAgAiAWohFCAEIAFrQQJqIRACQANAIAQtAAAgAUHCz4CAAGotAABHDaQBIAFBAkYNASABQQFqIQEgBEEBaiIEIAJHDQALIAAgFDYCAEGoASEQDLwCCyAAQQA2AgAgEEEBaiEBQSwhEAyhAQsCQCAEIAJHDQBBqQEhEAy7AgsgAiAEayAAKAIAIgFqIRQgBCABa0EEaiEQAkADQCAELQAAIAFBxc+AgABqLQAARw2jASABQQRGDQEgAUEBaiEBIARBAWoiBCACRw0ACyAAIBQ2AgBBqQEhEAy7AgsgAEEANgIAIBBBAWohAUErIRAMoAELAkAgBCACRw0AQaoBIRAMugILIAIgBGsgACgCACIBaiEUIAQgAWtBAmohEAJAA0AgBC0AACABQcrPgIAAai0AAEcNogEgAUECRg0BIAFBAWohASAEQQFqIgQgAkcNAAsgACAUNgIAQaoBIRAMugILIABBADYCACAQQQFqIQFBFCEQDJ8BCwJAIAQgAkcNAEGrASEQDLkCCwJAAkACQAJAIAQtAABBvn9qDg8AAQKkAaQBpAGkAaQBpAGkAaQBpAGkAaQBA6QBCyAEQQFqIQRBkwEhEAyiAgsgBEEBaiEEQZQBIRAMoQILIARBAWohBEGVASEQDKACCyAEQQFqIQRBlgEhEAyfAgsCQCAEIAJHDQBBrAEhEAy4AgsgBC0AAEHFAEcNnwEgBEEBaiEEDOABCwJAIAQgAkcNAEGtASEQDLcCCyACIARrIAAoAgAiAWohFCAEIAFrQQJqIRACQANAIAQtAAAgAUHNz4CAAGotAABHDZ8BIAFBAkYNASABQQFqIQEgBEEBaiIEIAJHDQALIAAgFDYCAEGtASEQDLcCCyAAQQA2AgAgEEEBaiEBQQ4hEAycAQsCQCAEIAJHDQBBrgEhEAy2AgsgBC0AAEHQAEcNnQEgBEEBaiEBQSUhEAybAQsCQCAEIAJHDQBBrwEhEAy1AgsgAiAEayAAKAIAIgFqIRQgBCABa0EIaiEQAkADQCAELQAAIAFB0M+AgABqLQAARw2dASABQQhGDQEgAUEBaiEBIARBAWoiBCACRw0ACyAAIBQ2AgBBrwEhEAy1AgsgAEEANgIAIBBBAWohAUEqIRAMmgELAkAgBCACRw0AQbABIRAMtAILAkACQCAELQAAQat/ag4LAJ0BnQGdAZ0BnQGdAZ0BnQGdAQGdAQsgBEEBaiEEQZoBIRAMmwILIARBAWohBEGbASEQDJoCCwJAIAQgAkcNAEGxASEQDLMCCwJAAkAgBC0AAEG/f2oOFACcAZwBnAGcAZwBnAGcAZwBnAGcAZwBnAGcAZwBnAGcAZwBnAEBnAELIARBAWohBEGZASEQDJoCCyAEQQFqIQRBnAEhEAyZAgsCQCAEIAJHDQBBsgEhEAyyAgsgAiAEayAAKAIAIgFqIRQgBCABa0EDaiEQAkADQCAELQAAIAFB2c+AgABqLQAARw2aASABQQNGDQEgAUEBaiEBIARBAWoiBCACRw0ACyAAIBQ2AgBBsgEhEAyyAgsgAEEANgIAIBBBAWohAUEhIRAMlwELAkAgBCACRw0AQbMBIRAMsQILIAIgBGsgACgCACIBaiEUIAQgAWtBBmohEAJAA0AgBC0AACABQd3PgIAAai0AAEcNmQEgAUEGRg0BIAFBAWohASAEQQFqIgQgAkcNAAsgACAUNgIAQbMBIRAMsQILIABBADYCACAQQQFqIQFBGiEQDJYBCwJAIAQgAkcNAEG0ASEQDLACCwJAAkACQCAELQAAQbt/ag4RAJoBmgGaAZoBmgGaAZoBmgGaAQGaAZoBmgGaAZoBApoBCyAEQQFqIQRBnQEhEAyYAgsgBEEBaiEEQZ4BIRAMlwILIARBAWohBEGfASEQDJYCCwJAIAQgAkcNAEG1ASEQDK8CCyACIARrIAAoAgAiAWohFCAEIAFrQQVqIRACQANAIAQtAAAgAUHkz4CAAGotAABHDZcBIAFBBUYNASABQQFqIQEgBEEBaiIEIAJHDQALIAAgFDYCAEG1ASEQDK8CCyAAQQA2AgAgEEEBaiEBQSghEAyUAQsCQCAEIAJHDQBBtgEhEAyuAgsgAiAEayAAKAIAIgFqIRQgBCABa0ECaiEQAkADQCAELQAAIAFB6s+AgABqLQAARw2WASABQQJGDQEgAUEBaiEBIARBAWoiBCACRw0ACyAAIBQ2AgBBtgEhEAyuAgsgAEEANgIAIBBBAWohAUEHIRAMkwELAkAgBCACRw0AQbcBIRAMrQILAkACQCAELQAAQbt/ag4OAJYBlgGWAZYBlgGWAZYBlgGWAZYBlgGWAQGWAQsgBEEBaiEEQaEBIRAMlAILIARBAWohBEGiASEQDJMCCwJAIAQgAkcNAEG4ASEQDKwCCyACIARrIAAoAgAiAWohFCAEIAFrQQJqIRACQANAIAQtAAAgAUHtz4CAAGotAABHDZQBIAFBAkYNASABQQFqIQEgBEEBaiIEIAJHDQALIAAgFDYCAEG4ASEQDKwCCyAAQQA2AgAgEEEBaiEBQRIhEAyRAQsCQCAEIAJHDQBBuQEhEAyrAgsgAiAEayAAKAIAIgFqIRQgBCABa0EBaiEQAkADQCAELQAAIAFB8M+AgABqLQAARw2TASABQQFGDQEgAUEBaiEBIARBAWoiBCACRw0ACyAAIBQ2AgBBuQEhEAyrAgsgAEEANgIAIBBBAWohAUEgIRAMkAELAkAgBCACRw0AQboBIRAMqgILIAIgBGsgACgCACIBaiEUIAQgAWtBAWohEAJAA0AgBC0AACABQfLPgIAAai0AAEcNkgEgAUEBRg0BIAFBAWohASAEQQFqIgQgAkcNAAsgACAUNgIAQboBIRAMqgILIABBADYCACAQQQFqIQFBDyEQDI8BCwJAIAQgAkcNAEG7ASEQDKkCCwJAAkAgBC0AAEG3f2oOBwCSAZIBkgGSAZIBAZIBCyAEQQFqIQRBpQEhEAyQAgsgBEEBaiEEQaYBIRAMjwILAkAgBCACRw0AQbwBIRAMqAILIAIgBGsgACgCACIBaiEUIAQgAWtBB2ohEAJAA0AgBC0AACABQfTPgIAAai0AAEcNkAEgAUEHRg0BIAFBAWohASAEQQFqIgQgAkcNAAsgACAUNgIAQbwBIRAMqAILIABBADYCACAQQQFqIQFBGyEQDI0BCwJAIAQgAkcNAEG9ASEQDKcCCwJAAkACQCAELQAAQb5/ag4SAJEBkQGRAZEBkQGRAZEBkQGRAQGRAZEBkQGRAZEBkQECkQELIARBAWohBEGkASEQDI8CCyAEQQFqIQRBpwEhEAyOAgsgBEEBaiEEQagBIRAMjQILAkAgBCACRw0AQb4BIRAMpgILIAQtAABBzgBHDY0BIARBAWohBAzPAQsCQCAEIAJHDQBBvwEhEAylAgsCQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQCAELQAAQb9/ag4VAAECA5wBBAUGnAGcAZwBBwgJCgucAQwNDg+cAQsgBEEBaiEBQegAIRAMmgILIARBAWohAUHpACEQDJkCCyAEQQFqIQFB7gAhEAyYAgsgBEEBaiEBQfIAIRAMlwILIARBAWohAUHzACEQDJYCCyAEQQFqIQFB9gAhEAyVAgsgBEEBaiEBQfcAIRAMlAILIARBAWohAUH6ACEQDJMCCyAEQQFqIQRBgwEhEAySAgsgBEEBaiEEQYQBIRAMkQILIARBAWohBEGFASEQDJACCyAEQQFqIQRBkgEhEAyPAgsgBEEBaiEEQZgBIRAMjgILIARBAWohBEGgASEQDI0CCyAEQQFqIQRBowEhEAyMAgsgBEEBaiEEQaoBIRAMiwILAkAgBCACRg0AIABBkICAgAA2AgggACAENgIEQasBIRAMiwILQcABIRAMowILIAAgBSACEKqAgIAAIgENiwEgBSEBDFwLAkAgBiACRg0AIAZBAWohBQyNAQtBwgEhEAyhAgsDQAJAIBAtAABBdmoOBIwBAACPAQALIBBBAWoiECACRw0AC0HDASEQDKACCwJAIAcgAkYNACAAQZGAgIAANgIIIAAgBzYCBCAHIQFBASEQDIcCC0HEASEQDJ8CCwJAIAcgAkcNAEHFASEQDJ8CCwJAAkAgBy0AAEF2ag4EAc4BzgEAzgELIAdBAWohBgyNAQsgB0EBaiEFDIkBCwJAIAcgAkcNAEHGASEQDJ4CCwJAAkAgBy0AAEF2ag4XAY8BjwEBjwGPAY8BjwGPAY8BjwGPAY8BjwGPAY8BjwGPAY8BjwGPAY8BAI8BCyAHQQFqIQcLQbABIRAMhAILAkAgCCACRw0AQcgBIRAMnQILIAgtAABBIEcNjQEgAEEAOwEyIAhBAWohAUGzASEQDIMCCyABIRcCQANAIBciByACRg0BIActAABBUGpB/wFxIhBBCk8NzAECQCAALwEyIhRBmTNLDQAgACAUQQpsIhQ7ATIgEEH//wNzIBRB/v8DcUkNACAHQQFqIRcgACAUIBBqIhA7ATIgEEH//wNxQegHSQ0BCwtBACEQIABBADYCHCAAQcGJgIAANgIQIABBDTYCDCAAIAdBAWo2AhQMnAILQccBIRAMmwILIAAgCCACEK6AgIAAIhBFDcoBIBBBFUcNjAEgAEHIATYCHCAAIAg2AhQgAEHJl4CAADYCECAAQRU2AgxBACEQDJoCCwJAIAkgAkcNAEHMASEQDJoCC0EAIRRBASEXQQEhFkEAIRACQAJAAkACQAJAAkACQAJAAkAgCS0AAEFQag4KlgGVAQABAgMEBQYIlwELQQIhEAwGC0EDIRAMBQtBBCEQDAQLQQUhEAwDC0EGIRAMAgtBByEQDAELQQghEAtBACEXQQAhFkEAIRQMjgELQQkhEEEBIRRBACEXQQAhFgyNAQsCQCAKIAJHDQBBzgEhEAyZAgsgCi0AAEEuRw2OASAKQQFqIQkMygELIAsgAkcNjgFB0AEhEAyXAgsCQCALIAJGDQAgAEGOgICAADYCCCAAIAs2AgRBtwEhEAz+AQtB0QEhEAyWAgsCQCAEIAJHDQBB0gEhEAyWAgsgAiAEayAAKAIAIhBqIRQgBCAQa0EEaiELA0AgBC0AACAQQfzPgIAAai0AAEcNjgEgEEEERg3pASAQQQFqIRAgBEEBaiIEIAJHDQALIAAgFDYCAEHSASEQDJUCCyAAIAwgAhCsgICAACIBDY0BIAwhAQy4AQsCQCAEIAJHDQBB1AEhEAyUAgsgAiAEayAAKAIAIhBqIRQgBCAQa0EBaiEMA0AgBC0AACAQQYHQgIAAai0AAEcNjwEgEEEBRg2OASAQQQFqIRAgBEEBaiIEIAJHDQALIAAgFDYCAEHUASEQDJMCCwJAIAQgAkcNAEHWASEQDJMCCyACIARrIAAoAgAiEGohFCAEIBBrQQJqIQsDQCAELQAAIBBBg9CAgABqLQAARw2OASAQQQJGDZABIBBBAWohECAEQQFqIgQgAkcNAAsgACAUNgIAQdYBIRAMkgILAkAgBCACRw0AQdcBIRAMkgILAkACQCAELQAAQbt/ag4QAI8BjwGPAY8BjwGPAY8BjwGPAY8BjwGPAY8BjwEBjwELIARBAWohBEG7ASEQDPkBCyAEQQFqIQRBvAEhEAz4AQsCQCAEIAJHDQBB2AEhEAyRAgsgBC0AAEHIAEcNjAEgBEEBaiEEDMQBCwJAIAQgAkYNACAAQZCAgIAANgIIIAAgBDYCBEG+ASEQDPcBC0HZASEQDI8CCwJAIAQgAkcNAEHaASEQDI8CCyAELQAAQcgARg3DASAAQQE6ACgMuQELIABBAjoALyAAIAQgAhCmgICAACIQDY0BQcIBIRAM9AELIAAtAChBf2oOArcBuQG4AQsDQAJAIAQtAABBdmoOBACOAY4BAI4BCyAEQQFqIgQgAkcNAAtB3QEhEAyLAgsgAEEAOgAvIAAtAC1BBHFFDYQCCyAAQQA6AC8gAEEBOgA0IAEhAQyMAQsgEEEVRg3aASAAQQA2AhwgACABNgIUIABBp46AgAA2AhAgAEESNgIMQQAhEAyIAgsCQCAAIBAgAhC0gICAACIEDQAgECEBDIECCwJAIARBFUcNACAAQQM2AhwgACAQNgIUIABBsJiAgAA2AhAgAEEVNgIMQQAhEAyIAgsgAEEANgIcIAAgEDYCFCAAQaeOgIAANgIQIABBEjYCDEEAIRAMhwILIBBBFUYN1gEgAEEANgIcIAAgATYCFCAAQdqNgIAANgIQIABBFDYCDEEAIRAMhgILIAAoAgQhFyAAQQA2AgQgECARp2oiFiEBIAAgFyAQIBYgFBsiEBC1gICAACIURQ2NASAAQQc2AhwgACAQNgIUIAAgFDYCDEEAIRAMhQILIAAgAC8BMEGAAXI7ATAgASEBC0EqIRAM6gELIBBBFUYN0QEgAEEANgIcIAAgATYCFCAAQYOMgIAANgIQIABBEzYCDEEAIRAMggILIBBBFUYNzwEgAEEANgIcIAAgATYCFCAAQZqPgIAANgIQIABBIjYCDEEAIRAMgQILIAAoAgQhECAAQQA2AgQCQCAAIBAgARC3gICAACIQDQAgAUEBaiEBDI0BCyAAQQw2AhwgACAQNgIMIAAgAUEBajYCFEEAIRAMgAILIBBBFUYNzAEgAEEANgIcIAAgATYCFCAAQZqPgIAANgIQIABBIjYCDEEAIRAM/wELIAAoAgQhECAAQQA2AgQCQCAAIBAgARC3gICAACIQDQAgAUEBaiEBDIwBCyAAQQ02AhwgACAQNgIMIAAgAUEBajYCFEEAIRAM/gELIBBBFUYNyQEgAEEANgIcIAAgATYCFCAAQcaMgIAANgIQIABBIzYCDEEAIRAM/QELIAAoAgQhECAAQQA2AgQCQCAAIBAgARC5gICAACIQDQAgAUEBaiEBDIsBCyAAQQ42AhwgACAQNgIMIAAgAUEBajYCFEEAIRAM/AELIABBADYCHCAAIAE2AhQgAEHAlYCAADYCECAAQQI2AgxBACEQDPsBCyAQQRVGDcUBIABBADYCHCAAIAE2AhQgAEHGjICAADYCECAAQSM2AgxBACEQDPoBCyAAQRA2AhwgACABNgIUIAAgEDYCDEEAIRAM+QELIAAoAgQhBCAAQQA2AgQCQCAAIAQgARC5gICAACIEDQAgAUEBaiEBDPEBCyAAQRE2AhwgACAENgIMIAAgAUEBajYCFEEAIRAM+AELIBBBFUYNwQEgAEEANgIcIAAgATYCFCAAQcaMgIAANgIQIABBIzYCDEEAIRAM9wELIAAoAgQhECAAQQA2AgQCQCAAIBAgARC5gICAACIQDQAgAUEBaiEBDIgBCyAAQRM2AhwgACAQNgIMIAAgAUEBajYCFEEAIRAM9gELIAAoAgQhBCAAQQA2AgQCQCAAIAQgARC5gICAACIEDQAgAUEBaiEBDO0BCyAAQRQ2AhwgACAENgIMIAAgAUEBajYCFEEAIRAM9QELIBBBFUYNvQEgAEEANgIcIAAgATYCFCAAQZqPgIAANgIQIABBIjYCDEEAIRAM9AELIAAoAgQhECAAQQA2AgQCQCAAIBAgARC3gICAACIQDQAgAUEBaiEBDIYBCyAAQRY2AhwgACAQNgIMIAAgAUEBajYCFEEAIRAM8wELIAAoAgQhBCAAQQA2AgQCQCAAIAQgARC3gICAACIEDQAgAUEBaiEBDOkBCyAAQRc2AhwgACAENgIMIAAgAUEBajYCFEEAIRAM8gELIABBADYCHCAAIAE2AhQgAEHNk4CAADYCECAAQQw2AgxBACEQDPEBC0IBIRELIBBBAWohAQJAIAApAyAiEkL//////////w9WDQAgACASQgSGIBGENwMgIAEhAQyEAQsgAEEANgIcIAAgATYCFCAAQa2JgIAANgIQIABBDDYCDEEAIRAM7wELIABBADYCHCAAIBA2AhQgAEHNk4CAADYCECAAQQw2AgxBACEQDO4BCyAAKAIEIRcgAEEANgIEIBAgEadqIhYhASAAIBcgECAWIBQbIhAQtYCAgAAiFEUNcyAAQQU2AhwgACAQNgIUIAAgFDYCDEEAIRAM7QELIABBADYCHCAAIBA2AhQgAEGqnICAADYCECAAQQ82AgxBACEQDOwBCyAAIBAgAhC0gICAACIBDQEgECEBC0EOIRAM0QELAkAgAUEVRw0AIABBAjYCHCAAIBA2AhQgAEGwmICAADYCECAAQRU2AgxBACEQDOoBCyAAQQA2AhwgACAQNgIUIABBp46AgAA2AhAgAEESNgIMQQAhEAzpAQsgAUEBaiEQAkAgAC8BMCIBQYABcUUNAAJAIAAgECACELuAgIAAIgENACAQIQEMcAsgAUEVRw26ASAAQQU2AhwgACAQNgIUIABB+ZeAgAA2AhAgAEEVNgIMQQAhEAzpAQsCQCABQaAEcUGgBEcNACAALQAtQQJxDQAgAEEANgIcIAAgEDYCFCAAQZaTgIAANgIQIABBBDYCDEEAIRAM6QELIAAgECACEL2AgIAAGiAQIQECQAJAAkACQAJAIAAgECACELOAgIAADhYCAQAEBAQEBAQEBAQEBAQEBAQEBAQDBAsgAEEBOgAuCyAAIAAvATBBwAByOwEwIBAhAQtBJiEQDNEBCyAAQSM2AhwgACAQNgIUIABBpZaAgAA2AhAgAEEVNgIMQQAhEAzpAQsgAEEANgIcIAAgEDYCFCAAQdWLgIAANgIQIABBETYCDEEAIRAM6AELIAAtAC1BAXFFDQFBwwEhEAzOAQsCQCANIAJGDQADQAJAIA0tAABBIEYNACANIQEMxAELIA1BAWoiDSACRw0AC0ElIRAM5wELQSUhEAzmAQsgACgCBCEEIABBADYCBCAAIAQgDRCvgICAACIERQ2tASAAQSY2AhwgACAENgIMIAAgDUEBajYCFEEAIRAM5QELIBBBFUYNqwEgAEEANgIcIAAgATYCFCAAQf2NgIAANgIQIABBHTYCDEEAIRAM5AELIABBJzYCHCAAIAE2AhQgACAQNgIMQQAhEAzjAQsgECEBQQEhFAJAAkACQAJAAkACQAJAIAAtACxBfmoOBwYFBQMBAgAFCyAAIAAvATBBCHI7ATAMAwtBAiEUDAELQQQhFAsgAEEBOgAsIAAgAC8BMCAUcjsBMAsgECEBC0ErIRAMygELIABBADYCHCAAIBA2AhQgAEGrkoCAADYCECAAQQs2AgxBACEQDOIBCyAAQQA2AhwgACABNgIUIABB4Y+AgAA2AhAgAEEKNgIMQQAhEAzhAQsgAEEAOgAsIBAhAQy9AQsgECEBQQEhFAJAAkACQAJAAkAgAC0ALEF7ag4EAwECAAULIAAgAC8BMEEIcjsBMAwDC0ECIRQMAQtBBCEUCyAAQQE6ACwgACAALwEwIBRyOwEwCyAQIQELQSkhEAzFAQsgAEEANgIcIAAgATYCFCAAQfCUgIAANgIQIABBAzYCDEEAIRAM3QELAkAgDi0AAEENRw0AIAAoAgQhASAAQQA2AgQCQCAAIAEgDhCxgICAACIBDQAgDkEBaiEBDHULIABBLDYCHCAAIAE2AgwgACAOQQFqNgIUQQAhEAzdAQsgAC0ALUEBcUUNAUHEASEQDMMBCwJAIA4gAkcNAEEtIRAM3AELAkACQANAAkAgDi0AAEF2ag4EAgAAAwALIA5BAWoiDiACRw0AC0EtIRAM3QELIAAoAgQhASAAQQA2AgQCQCAAIAEgDhCxgICAACIBDQAgDiEBDHQLIABBLDYCHCAAIA42AhQgACABNgIMQQAhEAzcAQsgACgCBCEBIABBADYCBAJAIAAgASAOELGAgIAAIgENACAOQQFqIQEMcwsgAEEsNgIcIAAgATYCDCAAIA5BAWo2AhRBACEQDNsBCyAAKAIEIQQgAEEANgIEIAAgBCAOELGAgIAAIgQNoAEgDiEBDM4BCyAQQSxHDQEgAUEBaiEQQQEhAQJAAkACQAJAAkAgAC0ALEF7ag4EAwECBAALIBAhAQwEC0ECIQEMAQtBBCEBCyAAQQE6ACwgACAALwEwIAFyOwEwIBAhAQwBCyAAIAAvATBBCHI7ATAgECEBC0E5IRAMvwELIABBADoALCABIQELQTQhEAy9AQsgACAALwEwQSByOwEwIAEhAQwCCyAAKAIEIQQgAEEANgIEAkAgACAEIAEQsYCAgAAiBA0AIAEhAQzHAQsgAEE3NgIcIAAgATYCFCAAIAQ2AgxBACEQDNQBCyAAQQg6ACwgASEBC0EwIRAMuQELAkAgAC0AKEEBRg0AIAEhAQwECyAALQAtQQhxRQ2TASABIQEMAwsgAC0AMEEgcQ2UAUHFASEQDLcBCwJAIA8gAkYNAAJAA0ACQCAPLQAAQVBqIgFB/wFxQQpJDQAgDyEBQTUhEAy6AQsgACkDICIRQpmz5syZs+bMGVYNASAAIBFCCn4iETcDICARIAGtQv8BgyISQn+FVg0BIAAgESASfDcDICAPQQFqIg8gAkcNAAtBOSEQDNEBCyAAKAIEIQIgAEEANgIEIAAgAiAPQQFqIgQQsYCAgAAiAg2VASAEIQEMwwELQTkhEAzPAQsCQCAALwEwIgFBCHFFDQAgAC0AKEEBRw0AIAAtAC1BCHFFDZABCyAAIAFB9/sDcUGABHI7ATAgDyEBC0E3IRAMtAELIAAgAC8BMEEQcjsBMAyrAQsgEEEVRg2LASAAQQA2AhwgACABNgIUIABB8I6AgAA2AhAgAEEcNgIMQQAhEAzLAQsgAEHDADYCHCAAIAE2AgwgACANQQFqNgIUQQAhEAzKAQsCQCABLQAAQTpHDQAgACgCBCEQIABBADYCBAJAIAAgECABEK+AgIAAIhANACABQQFqIQEMYwsgAEHDADYCHCAAIBA2AgwgACABQQFqNgIUQQAhEAzKAQsgAEEANgIcIAAgATYCFCAAQbGRgIAANgIQIABBCjYCDEEAIRAMyQELIABBADYCHCAAIAE2AhQgAEGgmYCAADYCECAAQR42AgxBACEQDMgBCyAAQQA2AgALIABBgBI7ASogACAXQQFqIgEgAhCogICAACIQDQEgASEBC0HHACEQDKwBCyAQQRVHDYMBIABB0QA2AhwgACABNgIUIABB45eAgAA2AhAgAEEVNgIMQQAhEAzEAQsgACgCBCEQIABBADYCBAJAIAAgECABEKeAgIAAIhANACABIQEMXgsgAEHSADYCHCAAIAE2AhQgACAQNgIMQQAhEAzDAQsgAEEANgIcIAAgFDYCFCAAQcGogIAANgIQIABBBzYCDCAAQQA2AgBBACEQDMIBCyAAKAIEIRAgAEEANgIEAkAgACAQIAEQp4CAgAAiEA0AIAEhAQxdCyAAQdMANgIcIAAgATYCFCAAIBA2AgxBACEQDMEBC0EAIRAgAEEANgIcIAAgATYCFCAAQYCRgIAANgIQIABBCTYCDAzAAQsgEEEVRg19IABBADYCHCAAIAE2AhQgAEGUjYCAADYCECAAQSE2AgxBACEQDL8BC0EBIRZBACEXQQAhFEEBIRALIAAgEDoAKyABQQFqIQECQAJAIAAtAC1BEHENAAJAAkACQCAALQAqDgMBAAIECyAWRQ0DDAILIBQNAQwCCyAXRQ0BCyAAKAIEIRAgAEEANgIEAkAgACAQIAEQrYCAgAAiEA0AIAEhAQxcCyAAQdgANgIcIAAgATYCFCAAIBA2AgxBACEQDL4BCyAAKAIEIQQgAEEANgIEAkAgACAEIAEQrYCAgAAiBA0AIAEhAQytAQsgAEHZADYCHCAAIAE2AhQgACAENgIMQQAhEAy9AQsgACgCBCEEIABBADYCBAJAIAAgBCABEK2AgIAAIgQNACABIQEMqwELIABB2gA2AhwgACABNgIUIAAgBDYCDEEAIRAMvAELIAAoAgQhBCAAQQA2AgQCQCAAIAQgARCtgICAACIEDQAgASEBDKkBCyAAQdwANgIcIAAgATYCFCAAIAQ2AgxBACEQDLsBCwJAIAEtAABBUGoiEEH/AXFBCk8NACAAIBA6ACogAUEBaiEBQc8AIRAMogELIAAoAgQhBCAAQQA2AgQCQCAAIAQgARCtgICAACIEDQAgASEBDKcBCyAAQd4ANgIcIAAgATYCFCAAIAQ2AgxBACEQDLoBCyAAQQA2AgAgF0EBaiEBAkAgAC0AKUEjTw0AIAEhAQxZCyAAQQA2AhwgACABNgIUIABB04mAgAA2AhAgAEEINgIMQQAhEAy5AQsgAEEANgIAC0EAIRAgAEEANgIcIAAgATYCFCAAQZCzgIAANgIQIABBCDYCDAy3AQsgAEEANgIAIBdBAWohAQJAIAAtAClBIUcNACABIQEMVgsgAEEANgIcIAAgATYCFCAAQZuKgIAANgIQIABBCDYCDEEAIRAMtgELIABBADYCACAXQQFqIQECQCAALQApIhBBXWpBC08NACABIQEMVQsCQCAQQQZLDQBBASAQdEHKAHFFDQAgASEBDFULQQAhECAAQQA2AhwgACABNgIUIABB94mAgAA2AhAgAEEINgIMDLUBCyAQQRVGDXEgAEEANgIcIAAgATYCFCAAQbmNgIAANgIQIABBGjYCDEEAIRAMtAELIAAoAgQhECAAQQA2AgQCQCAAIBAgARCngICAACIQDQAgASEBDFQLIABB5QA2AhwgACABNgIUIAAgEDYCDEEAIRAMswELIAAoAgQhECAAQQA2AgQCQCAAIBAgARCngICAACIQDQAgASEBDE0LIABB0gA2AhwgACABNgIUIAAgEDYCDEEAIRAMsgELIAAoAgQhECAAQQA2AgQCQCAAIBAgARCngICAACIQDQAgASEBDE0LIABB0wA2AhwgACABNgIUIAAgEDYCDEEAIRAMsQELIAAoAgQhECAAQQA2AgQCQCAAIBAgARCngICAACIQDQAgASEBDFELIABB5QA2AhwgACABNgIUIAAgEDYCDEEAIRAMsAELIABBADYCHCAAIAE2AhQgAEHGioCAADYCECAAQQc2AgxBACEQDK8BCyAAKAIEIRAgAEEANgIEAkAgACAQIAEQp4CAgAAiEA0AIAEhAQxJCyAAQdIANgIcIAAgATYCFCAAIBA2AgxBACEQDK4BCyAAKAIEIRAgAEEANgIEAkAgACAQIAEQp4CAgAAiEA0AIAEhAQxJCyAAQdMANgIcIAAgATYCFCAAIBA2AgxBACEQDK0BCyAAKAIEIRAgAEEANgIEAkAgACAQIAEQp4CAgAAiEA0AIAEhAQxNCyAAQeUANgIcIAAgATYCFCAAIBA2AgxBACEQDKwBCyAAQQA2AhwgACABNgIUIABB3IiAgAA2AhAgAEEHNgIMQQAhEAyrAQsgEEE/Rw0BIAFBAWohAQtBBSEQDJABC0EAIRAgAEEANgIcIAAgATYCFCAAQf2SgIAANgIQIABBBzYCDAyoAQsgACgCBCEQIABBADYCBAJAIAAgECABEKeAgIAAIhANACABIQEMQgsgAEHSADYCHCAAIAE2AhQgACAQNgIMQQAhEAynAQsgACgCBCEQIABBADYCBAJAIAAgECABEKeAgIAAIhANACABIQEMQgsgAEHTADYCHCAAIAE2AhQgACAQNgIMQQAhEAymAQsgACgCBCEQIABBADYCBAJAIAAgECABEKeAgIAAIhANACABIQEMRgsgAEHlADYCHCAAIAE2AhQgACAQNgIMQQAhEAylAQsgACgCBCEBIABBADYCBAJAIAAgASAUEKeAgIAAIgENACAUIQEMPwsgAEHSADYCHCAAIBQ2AhQgACABNgIMQQAhEAykAQsgACgCBCEBIABBADYCBAJAIAAgASAUEKeAgIAAIgENACAUIQEMPwsgAEHTADYCHCAAIBQ2AhQgACABNgIMQQAhEAyjAQsgACgCBCEBIABBADYCBAJAIAAgASAUEKeAgIAAIgENACAUIQEMQwsgAEHlADYCHCAAIBQ2AhQgACABNgIMQQAhEAyiAQsgAEEANgIcIAAgFDYCFCAAQcOPgIAANgIQIABBBzYCDEEAIRAMoQELIABBADYCHCAAIAE2AhQgAEHDj4CAADYCECAAQQc2AgxBACEQDKABC0EAIRAgAEEANgIcIAAgFDYCFCAAQYycgIAANgIQIABBBzYCDAyfAQsgAEEANgIcIAAgFDYCFCAAQYycgIAANgIQIABBBzYCDEEAIRAMngELIABBADYCHCAAIBQ2AhQgAEH+kYCAADYCECAAQQc2AgxBACEQDJ0BCyAAQQA2AhwgACABNgIUIABBjpuAgAA2AhAgAEEGNgIMQQAhEAycAQsgEEEVRg1XIABBADYCHCAAIAE2AhQgAEHMjoCAADYCECAAQSA2AgxBACEQDJsBCyAAQQA2AgAgEEEBaiEBQSQhEAsgACAQOgApIAAoAgQhECAAQQA2AgQgACAQIAEQq4CAgAAiEA1UIAEhAQw+CyAAQQA2AgALQQAhECAAQQA2AhwgACAENgIUIABB8ZuAgAA2AhAgAEEGNgIMDJcBCyABQRVGDVAgAEEANgIcIAAgBTYCFCAAQfCMgIAANgIQIABBGzYCDEEAIRAMlgELIAAoAgQhBSAAQQA2AgQgACAFIBAQqYCAgAAiBQ0BIBBBAWohBQtBrQEhEAx7CyAAQcEBNgIcIAAgBTYCDCAAIBBBAWo2AhRBACEQDJMBCyAAKAIEIQYgAEEANgIEIAAgBiAQEKmAgIAAIgYNASAQQQFqIQYLQa4BIRAMeAsgAEHCATYCHCAAIAY2AgwgACAQQQFqNgIUQQAhEAyQAQsgAEEANgIcIAAgBzYCFCAAQZeLgIAANgIQIABBDTYCDEEAIRAMjwELIABBADYCHCAAIAg2AhQgAEHjkICAADYCECAAQQk2AgxBACEQDI4BCyAAQQA2AhwgACAINgIUIABBlI2AgAA2AhAgAEEhNgIMQQAhEAyNAQtBASEWQQAhF0EAIRRBASEQCyAAIBA6ACsgCUEBaiEIAkACQCAALQAtQRBxDQACQAJAAkAgAC0AKg4DAQACBAsgFkUNAwwCCyAUDQEMAgsgF0UNAQsgACgCBCEQIABBADYCBCAAIBAgCBCtgICAACIQRQ09IABByQE2AhwgACAINgIUIAAgEDYCDEEAIRAMjAELIAAoAgQhBCAAQQA2AgQgACAEIAgQrYCAgAAiBEUNdiAAQcoBNgIcIAAgCDYCFCAAIAQ2AgxBACEQDIsBCyAAKAIEIQQgAEEANgIEIAAgBCAJEK2AgIAAIgRFDXQgAEHLATYCHCAAIAk2AhQgACAENgIMQQAhEAyKAQsgACgCBCEEIABBADYCBCAAIAQgChCtgICAACIERQ1yIABBzQE2AhwgACAKNgIUIAAgBDYCDEEAIRAMiQELAkAgCy0AAEFQaiIQQf8BcUEKTw0AIAAgEDoAKiALQQFqIQpBtgEhEAxwCyAAKAIEIQQgAEEANgIEIAAgBCALEK2AgIAAIgRFDXAgAEHPATYCHCAAIAs2AhQgACAENgIMQQAhEAyIAQsgAEEANgIcIAAgBDYCFCAAQZCzgIAANgIQIABBCDYCDCAAQQA2AgBBACEQDIcBCyABQRVGDT8gAEEANgIcIAAgDDYCFCAAQcyOgIAANgIQIABBIDYCDEEAIRAMhgELIABBgQQ7ASggACgCBCEQIABCADcDACAAIBAgDEEBaiIMEKuAgIAAIhBFDTggAEHTATYCHCAAIAw2AhQgACAQNgIMQQAhEAyFAQsgAEEANgIAC0EAIRAgAEEANgIcIAAgBDYCFCAAQdibgIAANgIQIABBCDYCDAyDAQsgACgCBCEQIABCADcDACAAIBAgC0EBaiILEKuAgIAAIhANAUHGASEQDGkLIABBAjoAKAxVCyAAQdUBNgIcIAAgCzYCFCAAIBA2AgxBACEQDIABCyAQQRVGDTcgAEEANgIcIAAgBDYCFCAAQaSMgIAANgIQIABBEDYCDEEAIRAMfwsgAC0ANEEBRw00IAAgBCACELyAgIAAIhBFDTQgEEEVRw01IABB3AE2AhwgACAENgIUIABB1ZaAgAA2AhAgAEEVNgIMQQAhEAx+C0EAIRAgAEEANgIcIABBr4uAgAA2AhAgAEECNgIMIAAgFEEBajYCFAx9C0EAIRAMYwtBAiEQDGILQQ0hEAxhC0EPIRAMYAtBJSEQDF8LQRMhEAxeC0EVIRAMXQtBFiEQDFwLQRchEAxbC0EYIRAMWgtBGSEQDFkLQRohEAxYC0EbIRAMVwtBHCEQDFYLQR0hEAxVC0EfIRAMVAtBISEQDFMLQSMhEAxSC0HGACEQDFELQS4hEAxQC0EvIRAMTwtBOyEQDE4LQT0hEAxNC0HIACEQDEwLQckAIRAMSwtBywAhEAxKC0HMACEQDEkLQc4AIRAMSAtB0QAhEAxHC0HVACEQDEYLQdgAIRAMRQtB2QAhEAxEC0HbACEQDEMLQeQAIRAMQgtB5QAhEAxBC0HxACEQDEALQfQAIRAMPwtBjQEhEAw+C0GXASEQDD0LQakBIRAMPAtBrAEhEAw7C0HAASEQDDoLQbkBIRAMOQtBrwEhEAw4C0GxASEQDDcLQbIBIRAMNgtBtAEhEAw1C0G1ASEQDDQLQboBIRAMMwtBvQEhEAwyC0G/ASEQDDELQcEBIRAMMAsgAEEANgIcIAAgBDYCFCAAQemLgIAANgIQIABBHzYCDEEAIRAMSAsgAEHbATYCHCAAIAQ2AhQgAEH6loCAADYCECAAQRU2AgxBACEQDEcLIABB+AA2AhwgACAMNgIUIABBypiAgAA2AhAgAEEVNgIMQQAhEAxGCyAAQdEANgIcIAAgBTYCFCAAQbCXgIAANgIQIABBFTYCDEEAIRAMRQsgAEH5ADYCHCAAIAE2AhQgACAQNgIMQQAhEAxECyAAQfgANgIcIAAgATYCFCAAQcqYgIAANgIQIABBFTYCDEEAIRAMQwsgAEHkADYCHCAAIAE2AhQgAEHjl4CAADYCECAAQRU2AgxBACEQDEILIABB1wA2AhwgACABNgIUIABByZeAgAA2AhAgAEEVNgIMQQAhEAxBCyAAQQA2AhwgACABNgIUIABBuY2AgAA2AhAgAEEaNgIMQQAhEAxACyAAQcIANgIcIAAgATYCFCAAQeOYgIAANgIQIABBFTYCDEEAIRAMPwsgAEEANgIEIAAgDyAPELGAgIAAIgRFDQEgAEE6NgIcIAAgBDYCDCAAIA9BAWo2AhRBACEQDD4LIAAoAgQhBCAAQQA2AgQCQCAAIAQgARCxgICAACIERQ0AIABBOzYCHCAAIAQ2AgwgACABQQFqNgIUQQAhEAw+CyABQQFqIQEMLQsgD0EBaiEBDC0LIABBADYCHCAAIA82AhQgAEHkkoCAADYCECAAQQQ2AgxBACEQDDsLIABBNjYCHCAAIAQ2AhQgACACNgIMQQAhEAw6CyAAQS42AhwgACAONgIUIAAgBDYCDEEAIRAMOQsgAEHQADYCHCAAIAE2AhQgAEGRmICAADYCECAAQRU2AgxBACEQDDgLIA1BAWohAQwsCyAAQRU2AhwgACABNgIUIABBgpmAgAA2AhAgAEEVNgIMQQAhEAw2CyAAQRs2AhwgACABNgIUIABBkZeAgAA2AhAgAEEVNgIMQQAhEAw1CyAAQQ82AhwgACABNgIUIABBkZeAgAA2AhAgAEEVNgIMQQAhEAw0CyAAQQs2AhwgACABNgIUIABBkZeAgAA2AhAgAEEVNgIMQQAhEAwzCyAAQRo2AhwgACABNgIUIABBgpmAgAA2AhAgAEEVNgIMQQAhEAwyCyAAQQs2AhwgACABNgIUIABBgpmAgAA2AhAgAEEVNgIMQQAhEAwxCyAAQQo2AhwgACABNgIUIABB5JaAgAA2AhAgAEEVNgIMQQAhEAwwCyAAQR42AhwgACABNgIUIABB+ZeAgAA2AhAgAEEVNgIMQQAhEAwvCyAAQQA2AhwgACAQNgIUIABB2o2AgAA2AhAgAEEUNgIMQQAhEAwuCyAAQQQ2AhwgACABNgIUIABBsJiAgAA2AhAgAEEVNgIMQQAhEAwtCyAAQQA2AgAgC0EBaiELC0G4ASEQDBILIABBADYCACAQQQFqIQFB9QAhEAwRCyABIQECQCAALQApQQVHDQBB4wAhEAwRC0HiACEQDBALQQAhECAAQQA2AhwgAEHkkYCAADYCECAAQQc2AgwgACAUQQFqNgIUDCgLIABBADYCACAXQQFqIQFBwAAhEAwOC0EBIQELIAAgAToALCAAQQA2AgAgF0EBaiEBC0EoIRAMCwsgASEBC0E4IRAMCQsCQCABIg8gAkYNAANAAkAgDy0AAEGAvoCAAGotAAAiAUEBRg0AIAFBAkcNAyAPQQFqIQEMBAsgD0EBaiIPIAJHDQALQT4hEAwiC0E+IRAMIQsgAEEAOgAsIA8hAQwBC0ELIRAMBgtBOiEQDAULIAFBAWohAUEtIRAMBAsgACABOgAsIABBADYCACAWQQFqIQFBDCEQDAMLIABBADYCACAXQQFqIQFBCiEQDAILIABBADYCAAsgAEEAOgAsIA0hAUEJIRAMAAsLQQAhECAAQQA2AhwgACALNgIUIABBzZCAgAA2AhAgAEEJNgIMDBcLQQAhECAAQQA2AhwgACAKNgIUIABB6YqAgAA2AhAgAEEJNgIMDBYLQQAhECAAQQA2AhwgACAJNgIUIABBt5CAgAA2AhAgAEEJNgIMDBULQQAhECAAQQA2AhwgACAINgIUIABBnJGAgAA2AhAgAEEJNgIMDBQLQQAhECAAQQA2AhwgACABNgIUIABBzZCAgAA2AhAgAEEJNgIMDBMLQQAhECAAQQA2AhwgACABNgIUIABB6YqAgAA2AhAgAEEJNgIMDBILQQAhECAAQQA2AhwgACABNgIUIABBt5CAgAA2AhAgAEEJNgIMDBELQQAhECAAQQA2AhwgACABNgIUIABBnJGAgAA2AhAgAEEJNgIMDBALQQAhECAAQQA2AhwgACABNgIUIABBl5WAgAA2AhAgAEEPNgIMDA8LQQAhECAAQQA2AhwgACABNgIUIABBl5WAgAA2AhAgAEEPNgIMDA4LQQAhECAAQQA2AhwgACABNgIUIABBwJKAgAA2AhAgAEELNgIMDA0LQQAhECAAQQA2AhwgACABNgIUIABBlYmAgAA2AhAgAEELNgIMDAwLQQAhECAAQQA2AhwgACABNgIUIABB4Y+AgAA2AhAgAEEKNgIMDAsLQQAhECAAQQA2AhwgACABNgIUIABB+4+AgAA2AhAgAEEKNgIMDAoLQQAhECAAQQA2AhwgACABNgIUIABB8ZmAgAA2AhAgAEECNgIMDAkLQQAhECAAQQA2AhwgACABNgIUIABBxJSAgAA2AhAgAEECNgIMDAgLQQAhECAAQQA2AhwgACABNgIUIABB8pWAgAA2AhAgAEECNgIMDAcLIABBAjYCHCAAIAE2AhQgAEGcmoCAADYCECAAQRY2AgxBACEQDAYLQQEhEAwFC0HUACEQIAEiBCACRg0EIANBCGogACAEIAJB2MKAgABBChDFgICAACADKAIMIQQgAygCCA4DAQQCAAsQyoCAgAAACyAAQQA2AhwgAEG1moCAADYCECAAQRc2AgwgACAEQQFqNgIUQQAhEAwCCyAAQQA2AhwgACAENgIUIABBypqAgAA2AhAgAEEJNgIMQQAhEAwBCwJAIAEiBCACRw0AQSIhEAwBCyAAQYmAgIAANgIIIAAgBDYCBEEhIRALIANBEGokgICAgAAgEAuvAQECfyABKAIAIQYCQAJAIAIgA0YNACAEIAZqIQQgBiADaiACayEHIAIgBkF/cyAFaiIGaiEFA0ACQCACLQAAIAQtAABGDQBBAiEEDAMLAkAgBg0AQQAhBCAFIQIMAwsgBkF/aiEGIARBAWohBCACQQFqIgIgA0cNAAsgByEGIAMhAgsgAEEBNgIAIAEgBjYCACAAIAI2AgQPCyABQQA2AgAgACAENgIAIAAgAjYCBAsKACAAEMeAgIAAC/I2AQt/I4CAgIAAQRBrIgEkgICAgAACQEEAKAKg0ICAAA0AQQAQy4CAgABBgNSEgABrIgJB2QBJDQBBACEDAkBBACgC4NOAgAAiBA0AQQBCfzcC7NOAgABBAEKAgISAgIDAADcC5NOAgABBACABQQhqQXBxQdiq1aoFcyIENgLg04CAAEEAQQA2AvTTgIAAQQBBADYCxNOAgAALQQAgAjYCzNOAgABBAEGA1ISAADYCyNOAgABBAEGA1ISAADYCmNCAgABBACAENgKs0ICAAEEAQX82AqjQgIAAA0AgA0HE0ICAAGogA0G40ICAAGoiBDYCACAEIANBsNCAgABqIgU2AgAgA0G80ICAAGogBTYCACADQczQgIAAaiADQcDQgIAAaiIFNgIAIAUgBDYCACADQdTQgIAAaiADQcjQgIAAaiIENgIAIAQgBTYCACADQdDQgIAAaiAENgIAIANBIGoiA0GAAkcNAAtBgNSEgABBeEGA1ISAAGtBD3FBAEGA1ISAAEEIakEPcRsiA2oiBEEEaiACQUhqIgUgA2siA0EBcjYCAEEAQQAoAvDTgIAANgKk0ICAAEEAIAM2ApTQgIAAQQAgBDYCoNCAgABBgNSEgAAgBWpBODYCBAsCQAJAAkACQAJAAkACQAJAAkACQAJAAkAgAEHsAUsNAAJAQQAoAojQgIAAIgZBECAAQRNqQXBxIABBC0kbIgJBA3YiBHYiA0EDcUUNAAJAAkAgA0EBcSAEckEBcyIFQQN0IgRBsNCAgABqIgMgBEG40ICAAGooAgAiBCgCCCICRw0AQQAgBkF+IAV3cTYCiNCAgAAMAQsgAyACNgIIIAIgAzYCDAsgBEEIaiEDIAQgBUEDdCIFQQNyNgIEIAQgBWoiBCAEKAIEQQFyNgIEDAwLIAJBACgCkNCAgAAiB00NAQJAIANFDQACQAJAIAMgBHRBAiAEdCIDQQAgA2tycSIDQQAgA2txQX9qIgMgA0EMdkEQcSIDdiIEQQV2QQhxIgUgA3IgBCAFdiIDQQJ2QQRxIgRyIAMgBHYiA0EBdkECcSIEciADIAR2IgNBAXZBAXEiBHIgAyAEdmoiBEEDdCIDQbDQgIAAaiIFIANBuNCAgABqKAIAIgMoAggiAEcNAEEAIAZBfiAEd3EiBjYCiNCAgAAMAQsgBSAANgIIIAAgBTYCDAsgAyACQQNyNgIEIAMgBEEDdCIEaiAEIAJrIgU2AgAgAyACaiIAIAVBAXI2AgQCQCAHRQ0AIAdBeHFBsNCAgABqIQJBACgCnNCAgAAhBAJAAkAgBkEBIAdBA3Z0IghxDQBBACAGIAhyNgKI0ICAACACIQgMAQsgAigCCCEICyAIIAQ2AgwgAiAENgIIIAQgAjYCDCAEIAg2AggLIANBCGohA0EAIAA2ApzQgIAAQQAgBTYCkNCAgAAMDAtBACgCjNCAgAAiCUUNASAJQQAgCWtxQX9qIgMgA0EMdkEQcSIDdiIEQQV2QQhxIgUgA3IgBCAFdiIDQQJ2QQRxIgRyIAMgBHYiA0EBdkECcSIEciADIAR2IgNBAXZBAXEiBHIgAyAEdmpBAnRBuNKAgABqKAIAIgAoAgRBeHEgAmshBCAAIQUCQANAAkAgBSgCECIDDQAgBUEUaigCACIDRQ0CCyADKAIEQXhxIAJrIgUgBCAFIARJIgUbIQQgAyAAIAUbIQAgAyEFDAALCyAAKAIYIQoCQCAAKAIMIgggAEYNACAAKAIIIgNBACgCmNCAgABJGiAIIAM2AgggAyAINgIMDAsLAkAgAEEUaiIFKAIAIgMNACAAKAIQIgNFDQMgAEEQaiEFCwNAIAUhCyADIghBFGoiBSgCACIDDQAgCEEQaiEFIAgoAhAiAw0ACyALQQA2AgAMCgtBfyECIABBv39LDQAgAEETaiIDQXBxIQJBACgCjNCAgAAiB0UNAEEAIQsCQCACQYACSQ0AQR8hCyACQf///wdLDQAgA0EIdiIDIANBgP4/akEQdkEIcSIDdCIEIARBgOAfakEQdkEEcSIEdCIFIAVBgIAPakEQdkECcSIFdEEPdiADIARyIAVyayIDQQF0IAIgA0EVanZBAXFyQRxqIQsLQQAgAmshBAJAAkACQAJAIAtBAnRBuNKAgABqKAIAIgUNAEEAIQNBACEIDAELQQAhAyACQQBBGSALQQF2ayALQR9GG3QhAEEAIQgDQAJAIAUoAgRBeHEgAmsiBiAETw0AIAYhBCAFIQggBg0AQQAhBCAFIQggBSEDDAMLIAMgBUEUaigCACIGIAYgBSAAQR12QQRxakEQaigCACIFRhsgAyAGGyEDIABBAXQhACAFDQALCwJAIAMgCHINAEEAIQhBAiALdCIDQQAgA2tyIAdxIgNFDQMgA0EAIANrcUF/aiIDIANBDHZBEHEiA3YiBUEFdkEIcSIAIANyIAUgAHYiA0ECdkEEcSIFciADIAV2IgNBAXZBAnEiBXIgAyAFdiIDQQF2QQFxIgVyIAMgBXZqQQJ0QbjSgIAAaigCACEDCyADRQ0BCwNAIAMoAgRBeHEgAmsiBiAESSEAAkAgAygCECIFDQAgA0EUaigCACEFCyAGIAQgABshBCADIAggABshCCAFIQMgBQ0ACwsgCEUNACAEQQAoApDQgIAAIAJrTw0AIAgoAhghCwJAIAgoAgwiACAIRg0AIAgoAggiA0EAKAKY0ICAAEkaIAAgAzYCCCADIAA2AgwMCQsCQCAIQRRqIgUoAgAiAw0AIAgoAhAiA0UNAyAIQRBqIQULA0AgBSEGIAMiAEEUaiIFKAIAIgMNACAAQRBqIQUgACgCECIDDQALIAZBADYCAAwICwJAQQAoApDQgIAAIgMgAkkNAEEAKAKc0ICAACEEAkACQCADIAJrIgVBEEkNACAEIAJqIgAgBUEBcjYCBEEAIAU2ApDQgIAAQQAgADYCnNCAgAAgBCADaiAFNgIAIAQgAkEDcjYCBAwBCyAEIANBA3I2AgQgBCADaiIDIAMoAgRBAXI2AgRBAEEANgKc0ICAAEEAQQA2ApDQgIAACyAEQQhqIQMMCgsCQEEAKAKU0ICAACIAIAJNDQBBACgCoNCAgAAiAyACaiIEIAAgAmsiBUEBcjYCBEEAIAU2ApTQgIAAQQAgBDYCoNCAgAAgAyACQQNyNgIEIANBCGohAwwKCwJAAkBBACgC4NOAgABFDQBBACgC6NOAgAAhBAwBC0EAQn83AuzTgIAAQQBCgICEgICAwAA3AuTTgIAAQQAgAUEMakFwcUHYqtWqBXM2AuDTgIAAQQBBADYC9NOAgABBAEEANgLE04CAAEGAgAQhBAtBACEDAkAgBCACQccAaiIHaiIGQQAgBGsiC3EiCCACSw0AQQBBMDYC+NOAgAAMCgsCQEEAKALA04CAACIDRQ0AAkBBACgCuNOAgAAiBCAIaiIFIARNDQAgBSADTQ0BC0EAIQNBAEEwNgL404CAAAwKC0EALQDE04CAAEEEcQ0EAkACQAJAQQAoAqDQgIAAIgRFDQBByNOAgAAhAwNAAkAgAygCACIFIARLDQAgBSADKAIEaiAESw0DCyADKAIIIgMNAAsLQQAQy4CAgAAiAEF/Rg0FIAghBgJAQQAoAuTTgIAAIgNBf2oiBCAAcUUNACAIIABrIAQgAGpBACADa3FqIQYLIAYgAk0NBSAGQf7///8HSw0FAkBBACgCwNOAgAAiA0UNAEEAKAK404CAACIEIAZqIgUgBE0NBiAFIANLDQYLIAYQy4CAgAAiAyAARw0BDAcLIAYgAGsgC3EiBkH+////B0sNBCAGEMuAgIAAIgAgAygCACADKAIEakYNAyAAIQMLAkAgA0F/Rg0AIAJByABqIAZNDQACQCAHIAZrQQAoAujTgIAAIgRqQQAgBGtxIgRB/v///wdNDQAgAyEADAcLAkAgBBDLgICAAEF/Rg0AIAQgBmohBiADIQAMBwtBACAGaxDLgICAABoMBAsgAyEAIANBf0cNBQwDC0EAIQgMBwtBACEADAULIABBf0cNAgtBAEEAKALE04CAAEEEcjYCxNOAgAALIAhB/v///wdLDQEgCBDLgICAACEAQQAQy4CAgAAhAyAAQX9GDQEgA0F/Rg0BIAAgA08NASADIABrIgYgAkE4ak0NAQtBAEEAKAK404CAACAGaiIDNgK404CAAAJAIANBACgCvNOAgABNDQBBACADNgK804CAAAsCQAJAAkACQEEAKAKg0ICAACIERQ0AQcjTgIAAIQMDQCAAIAMoAgAiBSADKAIEIghqRg0CIAMoAggiAw0ADAMLCwJAAkBBACgCmNCAgAAiA0UNACAAIANPDQELQQAgADYCmNCAgAALQQAhA0EAIAY2AszTgIAAQQAgADYCyNOAgABBAEF/NgKo0ICAAEEAQQAoAuDTgIAANgKs0ICAAEEAQQA2AtTTgIAAA0AgA0HE0ICAAGogA0G40ICAAGoiBDYCACAEIANBsNCAgABqIgU2AgAgA0G80ICAAGogBTYCACADQczQgIAAaiADQcDQgIAAaiIFNgIAIAUgBDYCACADQdTQgIAAaiADQcjQgIAAaiIENgIAIAQgBTYCACADQdDQgIAAaiAENgIAIANBIGoiA0GAAkcNAAsgAEF4IABrQQ9xQQAgAEEIakEPcRsiA2oiBCAGQUhqIgUgA2siA0EBcjYCBEEAQQAoAvDTgIAANgKk0ICAAEEAIAM2ApTQgIAAQQAgBDYCoNCAgAAgACAFakE4NgIEDAILIAMtAAxBCHENACAEIAVJDQAgBCAATw0AIARBeCAEa0EPcUEAIARBCGpBD3EbIgVqIgBBACgClNCAgAAgBmoiCyAFayIFQQFyNgIEIAMgCCAGajYCBEEAQQAoAvDTgIAANgKk0ICAAEEAIAU2ApTQgIAAQQAgADYCoNCAgAAgBCALakE4NgIEDAELAkAgAEEAKAKY0ICAACIITw0AQQAgADYCmNCAgAAgACEICyAAIAZqIQVByNOAgAAhAwJAAkACQAJAAkACQAJAA0AgAygCACAFRg0BIAMoAggiAw0ADAILCyADLQAMQQhxRQ0BC0HI04CAACEDA0ACQCADKAIAIgUgBEsNACAFIAMoAgRqIgUgBEsNAwsgAygCCCEDDAALCyADIAA2AgAgAyADKAIEIAZqNgIEIABBeCAAa0EPcUEAIABBCGpBD3EbaiILIAJBA3I2AgQgBUF4IAVrQQ9xQQAgBUEIakEPcRtqIgYgCyACaiICayEDAkAgBiAERw0AQQAgAjYCoNCAgABBAEEAKAKU0ICAACADaiIDNgKU0ICAACACIANBAXI2AgQMAwsCQCAGQQAoApzQgIAARw0AQQAgAjYCnNCAgABBAEEAKAKQ0ICAACADaiIDNgKQ0ICAACACIANBAXI2AgQgAiADaiADNgIADAMLAkAgBigCBCIEQQNxQQFHDQAgBEF4cSEHAkACQCAEQf8BSw0AIAYoAggiBSAEQQN2IghBA3RBsNCAgABqIgBGGgJAIAYoAgwiBCAFRw0AQQBBACgCiNCAgABBfiAId3E2AojQgIAADAILIAQgAEYaIAQgBTYCCCAFIAQ2AgwMAQsgBigCGCEJAkACQCAGKAIMIgAgBkYNACAGKAIIIgQgCEkaIAAgBDYCCCAEIAA2AgwMAQsCQCAGQRRqIgQoAgAiBQ0AIAZBEGoiBCgCACIFDQBBACEADAELA0AgBCEIIAUiAEEUaiIEKAIAIgUNACAAQRBqIQQgACgCECIFDQALIAhBADYCAAsgCUUNAAJAAkAgBiAGKAIcIgVBAnRBuNKAgABqIgQoAgBHDQAgBCAANgIAIAANAUEAQQAoAozQgIAAQX4gBXdxNgKM0ICAAAwCCyAJQRBBFCAJKAIQIAZGG2ogADYCACAARQ0BCyAAIAk2AhgCQCAGKAIQIgRFDQAgACAENgIQIAQgADYCGAsgBigCFCIERQ0AIABBFGogBDYCACAEIAA2AhgLIAcgA2ohAyAGIAdqIgYoAgQhBAsgBiAEQX5xNgIEIAIgA2ogAzYCACACIANBAXI2AgQCQCADQf8BSw0AIANBeHFBsNCAgABqIQQCQAJAQQAoAojQgIAAIgVBASADQQN2dCIDcQ0AQQAgBSADcjYCiNCAgAAgBCEDDAELIAQoAgghAwsgAyACNgIMIAQgAjYCCCACIAQ2AgwgAiADNgIIDAMLQR8hBAJAIANB////B0sNACADQQh2IgQgBEGA/j9qQRB2QQhxIgR0IgUgBUGA4B9qQRB2QQRxIgV0IgAgAEGAgA9qQRB2QQJxIgB0QQ92IAQgBXIgAHJrIgRBAXQgAyAEQRVqdkEBcXJBHGohBAsgAiAENgIcIAJCADcCECAEQQJ0QbjSgIAAaiEFAkBBACgCjNCAgAAiAEEBIAR0IghxDQAgBSACNgIAQQAgACAIcjYCjNCAgAAgAiAFNgIYIAIgAjYCCCACIAI2AgwMAwsgA0EAQRkgBEEBdmsgBEEfRht0IQQgBSgCACEAA0AgACIFKAIEQXhxIANGDQIgBEEddiEAIARBAXQhBCAFIABBBHFqQRBqIggoAgAiAA0ACyAIIAI2AgAgAiAFNgIYIAIgAjYCDCACIAI2AggMAgsgAEF4IABrQQ9xQQAgAEEIakEPcRsiA2oiCyAGQUhqIgggA2siA0EBcjYCBCAAIAhqQTg2AgQgBCAFQTcgBWtBD3FBACAFQUlqQQ9xG2pBQWoiCCAIIARBEGpJGyIIQSM2AgRBAEEAKALw04CAADYCpNCAgABBACADNgKU0ICAAEEAIAs2AqDQgIAAIAhBEGpBACkC0NOAgAA3AgAgCEEAKQLI04CAADcCCEEAIAhBCGo2AtDTgIAAQQAgBjYCzNOAgABBACAANgLI04CAAEEAQQA2AtTTgIAAIAhBJGohAwNAIANBBzYCACADQQRqIgMgBUkNAAsgCCAERg0DIAggCCgCBEF+cTYCBCAIIAggBGsiADYCACAEIABBAXI2AgQCQCAAQf8BSw0AIABBeHFBsNCAgABqIQMCQAJAQQAoAojQgIAAIgVBASAAQQN2dCIAcQ0AQQAgBSAAcjYCiNCAgAAgAyEFDAELIAMoAgghBQsgBSAENgIMIAMgBDYCCCAEIAM2AgwgBCAFNgIIDAQLQR8hAwJAIABB////B0sNACAAQQh2IgMgA0GA/j9qQRB2QQhxIgN0IgUgBUGA4B9qQRB2QQRxIgV0IgggCEGAgA9qQRB2QQJxIgh0QQ92IAMgBXIgCHJrIgNBAXQgACADQRVqdkEBcXJBHGohAwsgBCADNgIcIARCADcCECADQQJ0QbjSgIAAaiEFAkBBACgCjNCAgAAiCEEBIAN0IgZxDQAgBSAENgIAQQAgCCAGcjYCjNCAgAAgBCAFNgIYIAQgBDYCCCAEIAQ2AgwMBAsgAEEAQRkgA0EBdmsgA0EfRht0IQMgBSgCACEIA0AgCCIFKAIEQXhxIABGDQMgA0EddiEIIANBAXQhAyAFIAhBBHFqQRBqIgYoAgAiCA0ACyAGIAQ2AgAgBCAFNgIYIAQgBDYCDCAEIAQ2AggMAwsgBSgCCCIDIAI2AgwgBSACNgIIIAJBADYCGCACIAU2AgwgAiADNgIICyALQQhqIQMMBQsgBSgCCCIDIAQ2AgwgBSAENgIIIARBADYCGCAEIAU2AgwgBCADNgIIC0EAKAKU0ICAACIDIAJNDQBBACgCoNCAgAAiBCACaiIFIAMgAmsiA0EBcjYCBEEAIAM2ApTQgIAAQQAgBTYCoNCAgAAgBCACQQNyNgIEIARBCGohAwwDC0EAIQNBAEEwNgL404CAAAwCCwJAIAtFDQACQAJAIAggCCgCHCIFQQJ0QbjSgIAAaiIDKAIARw0AIAMgADYCACAADQFBACAHQX4gBXdxIgc2AozQgIAADAILIAtBEEEUIAsoAhAgCEYbaiAANgIAIABFDQELIAAgCzYCGAJAIAgoAhAiA0UNACAAIAM2AhAgAyAANgIYCyAIQRRqKAIAIgNFDQAgAEEUaiADNgIAIAMgADYCGAsCQAJAIARBD0sNACAIIAQgAmoiA0EDcjYCBCAIIANqIgMgAygCBEEBcjYCBAwBCyAIIAJqIgAgBEEBcjYCBCAIIAJBA3I2AgQgACAEaiAENgIAAkAgBEH/AUsNACAEQXhxQbDQgIAAaiEDAkACQEEAKAKI0ICAACIFQQEgBEEDdnQiBHENAEEAIAUgBHI2AojQgIAAIAMhBAwBCyADKAIIIQQLIAQgADYCDCADIAA2AgggACADNgIMIAAgBDYCCAwBC0EfIQMCQCAEQf///wdLDQAgBEEIdiIDIANBgP4/akEQdkEIcSIDdCIFIAVBgOAfakEQdkEEcSIFdCICIAJBgIAPakEQdkECcSICdEEPdiADIAVyIAJyayIDQQF0IAQgA0EVanZBAXFyQRxqIQMLIAAgAzYCHCAAQgA3AhAgA0ECdEG40oCAAGohBQJAIAdBASADdCICcQ0AIAUgADYCAEEAIAcgAnI2AozQgIAAIAAgBTYCGCAAIAA2AgggACAANgIMDAELIARBAEEZIANBAXZrIANBH0YbdCEDIAUoAgAhAgJAA0AgAiIFKAIEQXhxIARGDQEgA0EddiECIANBAXQhAyAFIAJBBHFqQRBqIgYoAgAiAg0ACyAGIAA2AgAgACAFNgIYIAAgADYCDCAAIAA2AggMAQsgBSgCCCIDIAA2AgwgBSAANgIIIABBADYCGCAAIAU2AgwgACADNgIICyAIQQhqIQMMAQsCQCAKRQ0AAkACQCAAIAAoAhwiBUECdEG40oCAAGoiAygCAEcNACADIAg2AgAgCA0BQQAgCUF+IAV3cTYCjNCAgAAMAgsgCkEQQRQgCigCECAARhtqIAg2AgAgCEUNAQsgCCAKNgIYAkAgACgCECIDRQ0AIAggAzYCECADIAg2AhgLIABBFGooAgAiA0UNACAIQRRqIAM2AgAgAyAINgIYCwJAAkAgBEEPSw0AIAAgBCACaiIDQQNyNgIEIAAgA2oiAyADKAIEQQFyNgIEDAELIAAgAmoiBSAEQQFyNgIEIAAgAkEDcjYCBCAFIARqIAQ2AgACQCAHRQ0AIAdBeHFBsNCAgABqIQJBACgCnNCAgAAhAwJAAkBBASAHQQN2dCIIIAZxDQBBACAIIAZyNgKI0ICAACACIQgMAQsgAigCCCEICyAIIAM2AgwgAiADNgIIIAMgAjYCDCADIAg2AggLQQAgBTYCnNCAgABBACAENgKQ0ICAAAsgAEEIaiEDCyABQRBqJICAgIAAIAMLCgAgABDJgICAAAviDQEHfwJAIABFDQAgAEF4aiIBIABBfGooAgAiAkF4cSIAaiEDAkAgAkEBcQ0AIAJBA3FFDQEgASABKAIAIgJrIgFBACgCmNCAgAAiBEkNASACIABqIQACQCABQQAoApzQgIAARg0AAkAgAkH/AUsNACABKAIIIgQgAkEDdiIFQQN0QbDQgIAAaiIGRhoCQCABKAIMIgIgBEcNAEEAQQAoAojQgIAAQX4gBXdxNgKI0ICAAAwDCyACIAZGGiACIAQ2AgggBCACNgIMDAILIAEoAhghBwJAAkAgASgCDCIGIAFGDQAgASgCCCICIARJGiAGIAI2AgggAiAGNgIMDAELAkAgAUEUaiICKAIAIgQNACABQRBqIgIoAgAiBA0AQQAhBgwBCwNAIAIhBSAEIgZBFGoiAigCACIEDQAgBkEQaiECIAYoAhAiBA0ACyAFQQA2AgALIAdFDQECQAJAIAEgASgCHCIEQQJ0QbjSgIAAaiICKAIARw0AIAIgBjYCACAGDQFBAEEAKAKM0ICAAEF+IAR3cTYCjNCAgAAMAwsgB0EQQRQgBygCECABRhtqIAY2AgAgBkUNAgsgBiAHNgIYAkAgASgCECICRQ0AIAYgAjYCECACIAY2AhgLIAEoAhQiAkUNASAGQRRqIAI2AgAgAiAGNgIYDAELIAMoAgQiAkEDcUEDRw0AIAMgAkF+cTYCBEEAIAA2ApDQgIAAIAEgAGogADYCACABIABBAXI2AgQPCyABIANPDQAgAygCBCICQQFxRQ0AAkACQCACQQJxDQACQCADQQAoAqDQgIAARw0AQQAgATYCoNCAgABBAEEAKAKU0ICAACAAaiIANgKU0ICAACABIABBAXI2AgQgAUEAKAKc0ICAAEcNA0EAQQA2ApDQgIAAQQBBADYCnNCAgAAPCwJAIANBACgCnNCAgABHDQBBACABNgKc0ICAAEEAQQAoApDQgIAAIABqIgA2ApDQgIAAIAEgAEEBcjYCBCABIABqIAA2AgAPCyACQXhxIABqIQACQAJAIAJB/wFLDQAgAygCCCIEIAJBA3YiBUEDdEGw0ICAAGoiBkYaAkAgAygCDCICIARHDQBBAEEAKAKI0ICAAEF+IAV3cTYCiNCAgAAMAgsgAiAGRhogAiAENgIIIAQgAjYCDAwBCyADKAIYIQcCQAJAIAMoAgwiBiADRg0AIAMoAggiAkEAKAKY0ICAAEkaIAYgAjYCCCACIAY2AgwMAQsCQCADQRRqIgIoAgAiBA0AIANBEGoiAigCACIEDQBBACEGDAELA0AgAiEFIAQiBkEUaiICKAIAIgQNACAGQRBqIQIgBigCECIEDQALIAVBADYCAAsgB0UNAAJAAkAgAyADKAIcIgRBAnRBuNKAgABqIgIoAgBHDQAgAiAGNgIAIAYNAUEAQQAoAozQgIAAQX4gBHdxNgKM0ICAAAwCCyAHQRBBFCAHKAIQIANGG2ogBjYCACAGRQ0BCyAGIAc2AhgCQCADKAIQIgJFDQAgBiACNgIQIAIgBjYCGAsgAygCFCICRQ0AIAZBFGogAjYCACACIAY2AhgLIAEgAGogADYCACABIABBAXI2AgQgAUEAKAKc0ICAAEcNAUEAIAA2ApDQgIAADwsgAyACQX5xNgIEIAEgAGogADYCACABIABBAXI2AgQLAkAgAEH/AUsNACAAQXhxQbDQgIAAaiECAkACQEEAKAKI0ICAACIEQQEgAEEDdnQiAHENAEEAIAQgAHI2AojQgIAAIAIhAAwBCyACKAIIIQALIAAgATYCDCACIAE2AgggASACNgIMIAEgADYCCA8LQR8hAgJAIABB////B0sNACAAQQh2IgIgAkGA/j9qQRB2QQhxIgJ0IgQgBEGA4B9qQRB2QQRxIgR0IgYgBkGAgA9qQRB2QQJxIgZ0QQ92IAIgBHIgBnJrIgJBAXQgACACQRVqdkEBcXJBHGohAgsgASACNgIcIAFCADcCECACQQJ0QbjSgIAAaiEEAkACQEEAKAKM0ICAACIGQQEgAnQiA3ENACAEIAE2AgBBACAGIANyNgKM0ICAACABIAQ2AhggASABNgIIIAEgATYCDAwBCyAAQQBBGSACQQF2ayACQR9GG3QhAiAEKAIAIQYCQANAIAYiBCgCBEF4cSAARg0BIAJBHXYhBiACQQF0IQIgBCAGQQRxakEQaiIDKAIAIgYNAAsgAyABNgIAIAEgBDYCGCABIAE2AgwgASABNgIIDAELIAQoAggiACABNgIMIAQgATYCCCABQQA2AhggASAENgIMIAEgADYCCAtBAEEAKAKo0ICAAEF/aiIBQX8gARs2AqjQgIAACwsEAAAAC04AAkAgAA0APwBBEHQPCwJAIABB//8DcQ0AIABBf0wNAAJAIABBEHZAACIAQX9HDQBBAEEwNgL404CAAEF/DwsgAEEQdA8LEMqAgIAAAAvyAgIDfwF+AkAgAkUNACAAIAE6AAAgAiAAaiIDQX9qIAE6AAAgAkEDSQ0AIAAgAToAAiAAIAE6AAEgA0F9aiABOgAAIANBfmogAToAACACQQdJDQAgACABOgADIANBfGogAToAACACQQlJDQAgAEEAIABrQQNxIgRqIgMgAUH/AXFBgYKECGwiATYCACADIAIgBGtBfHEiBGoiAkF8aiABNgIAIARBCUkNACADIAE2AgggAyABNgIEIAJBeGogATYCACACQXRqIAE2AgAgBEEZSQ0AIAMgATYCGCADIAE2AhQgAyABNgIQIAMgATYCDCACQXBqIAE2AgAgAkFsaiABNgIAIAJBaGogATYCACACQWRqIAE2AgAgBCADQQRxQRhyIgVrIgJBIEkNACABrUKBgICAEH4hBiADIAVqIQEDQCABIAY3AxggASAGNwMQIAEgBjcDCCABIAY3AwAgAUEgaiEBIAJBYGoiAkEfSw0ACwsgAAsLjkgBAEGACAuGSAEAAAACAAAAAwAAAAAAAAAAAAAABAAAAAUAAAAAAAAAAAAAAAYAAAAHAAAACAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAASW52YWxpZCBjaGFyIGluIHVybCBxdWVyeQBTcGFuIGNhbGxiYWNrIGVycm9yIGluIG9uX2JvZHkAQ29udGVudC1MZW5ndGggb3ZlcmZsb3cAQ2h1bmsgc2l6ZSBvdmVyZmxvdwBSZXNwb25zZSBvdmVyZmxvdwBJbnZhbGlkIG1ldGhvZCBmb3IgSFRUUC94LnggcmVxdWVzdABJbnZhbGlkIG1ldGhvZCBmb3IgUlRTUC94LnggcmVxdWVzdABFeHBlY3RlZCBTT1VSQ0UgbWV0aG9kIGZvciBJQ0UveC54IHJlcXVlc3QASW52YWxpZCBjaGFyIGluIHVybCBmcmFnbWVudCBzdGFydABFeHBlY3RlZCBkb3QAU3BhbiBjYWxsYmFjayBlcnJvciBpbiBvbl9zdGF0dXMASW52YWxpZCByZXNwb25zZSBzdGF0dXMASW52YWxpZCBjaGFyYWN0ZXIgaW4gY2h1bmsgZXh0ZW5zaW9ucwBVc2VyIGNhbGxiYWNrIGVycm9yAGBvbl9yZXNldGAgY2FsbGJhY2sgZXJyb3IAYG9uX2NodW5rX2hlYWRlcmAgY2FsbGJhY2sgZXJyb3IAYG9uX21lc3NhZ2VfYmVnaW5gIGNhbGxiYWNrIGVycm9yAGBvbl9jaHVua19leHRlbnNpb25fdmFsdWVgIGNhbGxiYWNrIGVycm9yAGBvbl9zdGF0dXNfY29tcGxldGVgIGNhbGxiYWNrIGVycm9yAGBvbl92ZXJzaW9uX2NvbXBsZXRlYCBjYWxsYmFjayBlcnJvcgBgb25fdXJsX2NvbXBsZXRlYCBjYWxsYmFjayBlcnJvcgBgb25fY2h1bmtfY29tcGxldGVgIGNhbGxiYWNrIGVycm9yAGBvbl9oZWFkZXJfdmFsdWVfY29tcGxldGVgIGNhbGxiYWNrIGVycm9yAGBvbl9tZXNzYWdlX2NvbXBsZXRlYCBjYWxsYmFjayBlcnJvcgBgb25fbWV0aG9kX2NvbXBsZXRlYCBjYWxsYmFjayBlcnJvcgBgb25faGVhZGVyX2ZpZWxkX2NvbXBsZXRlYCBjYWxsYmFjayBlcnJvcgBgb25fY2h1bmtfZXh0ZW5zaW9uX25hbWVgIGNhbGxiYWNrIGVycm9yAFVuZXhwZWN0ZWQgY2hhciBpbiB1cmwgc2VydmVyAEludmFsaWQgaGVhZGVyIHZhbHVlIGNoYXIASW52YWxpZCBoZWFkZXIgZmllbGQgY2hhcgBTcGFuIGNhbGxiYWNrIGVycm9yIGluIG9uX3ZlcnNpb24ASW52YWxpZCBtaW5vciB2ZXJzaW9uAEludmFsaWQgbWFqb3IgdmVyc2lvbgBFeHBlY3RlZCBzcGFjZSBhZnRlciB2ZXJzaW9uAEV4cGVjdGVkIENSTEYgYWZ0ZXIgdmVyc2lvbgBJbnZhbGlkIEhUVFAgdmVyc2lvbgBJbnZhbGlkIGhlYWRlciB0b2tlbgBTcGFuIGNhbGxiYWNrIGVycm9yIGluIG9uX3VybABJbnZhbGlkIGNoYXJhY3RlcnMgaW4gdXJsAFVuZXhwZWN0ZWQgc3RhcnQgY2hhciBpbiB1cmwARG91YmxlIEAgaW4gdXJsAEVtcHR5IENvbnRlbnQtTGVuZ3RoAEludmFsaWQgY2hhcmFjdGVyIGluIENvbnRlbnQtTGVuZ3RoAER1cGxpY2F0ZSBDb250ZW50LUxlbmd0aABJbnZhbGlkIGNoYXIgaW4gdXJsIHBhdGgAQ29udGVudC1MZW5ndGggY2FuJ3QgYmUgcHJlc2VudCB3aXRoIFRyYW5zZmVyLUVuY29kaW5nAEludmFsaWQgY2hhcmFjdGVyIGluIGNodW5rIHNpemUAU3BhbiBjYWxsYmFjayBlcnJvciBpbiBvbl9oZWFkZXJfdmFsdWUAU3BhbiBjYWxsYmFjayBlcnJvciBpbiBvbl9jaHVua19leHRlbnNpb25fdmFsdWUASW52YWxpZCBjaGFyYWN0ZXIgaW4gY2h1bmsgZXh0ZW5zaW9ucyB2YWx1ZQBNaXNzaW5nIGV4cGVjdGVkIExGIGFmdGVyIGhlYWRlciB2YWx1ZQBJbnZhbGlkIGBUcmFuc2Zlci1FbmNvZGluZ2AgaGVhZGVyIHZhbHVlAEludmFsaWQgY2hhcmFjdGVyIGluIGNodW5rIGV4dGVuc2lvbnMgcXVvdGUgdmFsdWUASW52YWxpZCBjaGFyYWN0ZXIgaW4gY2h1bmsgZXh0ZW5zaW9ucyBxdW90ZWQgdmFsdWUAUGF1c2VkIGJ5IG9uX2hlYWRlcnNfY29tcGxldGUASW52YWxpZCBFT0Ygc3RhdGUAb25fcmVzZXQgcGF1c2UAb25fY2h1bmtfaGVhZGVyIHBhdXNlAG9uX21lc3NhZ2VfYmVnaW4gcGF1c2UAb25fY2h1bmtfZXh0ZW5zaW9uX3ZhbHVlIHBhdXNlAG9uX3N0YXR1c19jb21wbGV0ZSBwYXVzZQBvbl92ZXJzaW9uX2NvbXBsZXRlIHBhdXNlAG9uX3VybF9jb21wbGV0ZSBwYXVzZQBvbl9jaHVua19jb21wbGV0ZSBwYXVzZQBvbl9oZWFkZXJfdmFsdWVfY29tcGxldGUgcGF1c2UAb25fbWVzc2FnZV9jb21wbGV0ZSBwYXVzZQBvbl9tZXRob2RfY29tcGxldGUgcGF1c2UAb25faGVhZGVyX2ZpZWxkX2NvbXBsZXRlIHBhdXNlAG9uX2NodW5rX2V4dGVuc2lvbl9uYW1lIHBhdXNlAFVuZXhwZWN0ZWQgc3BhY2UgYWZ0ZXIgc3RhcnQgbGluZQBTcGFuIGNhbGxiYWNrIGVycm9yIGluIG9uX2NodW5rX2V4dGVuc2lvbl9uYW1lAEludmFsaWQgY2hhcmFjdGVyIGluIGNodW5rIGV4dGVuc2lvbnMgbmFtZQBQYXVzZSBvbiBDT05ORUNUL1VwZ3JhZGUAUGF1c2Ugb24gUFJJL1VwZ3JhZGUARXhwZWN0ZWQgSFRUUC8yIENvbm5lY3Rpb24gUHJlZmFjZQBTcGFuIGNhbGxiYWNrIGVycm9yIGluIG9uX21ldGhvZABFeHBlY3RlZCBzcGFjZSBhZnRlciBtZXRob2QAU3BhbiBjYWxsYmFjayBlcnJvciBpbiBvbl9oZWFkZXJfZmllbGQAUGF1c2VkAEludmFsaWQgd29yZCBlbmNvdW50ZXJlZABJbnZhbGlkIG1ldGhvZCBlbmNvdW50ZXJlZABVbmV4cGVjdGVkIGNoYXIgaW4gdXJsIHNjaGVtYQBSZXF1ZXN0IGhhcyBpbnZhbGlkIGBUcmFuc2Zlci1FbmNvZGluZ2AAU1dJVENIX1BST1hZAFVTRV9QUk9YWQBNS0FDVElWSVRZAFVOUFJPQ0VTU0FCTEVfRU5USVRZAENPUFkATU9WRURfUEVSTUFORU5UTFkAVE9PX0VBUkxZAE5PVElGWQBGQUlMRURfREVQRU5ERU5DWQBCQURfR0FURVdBWQBQTEFZAFBVVABDSEVDS09VVABHQVRFV0FZX1RJTUVPVVQAUkVRVUVTVF9USU1FT1VUAE5FVFdPUktfQ09OTkVDVF9USU1FT1VUAENPTk5FQ1RJT05fVElNRU9VVABMT0dJTl9USU1FT1VUAE5FVFdPUktfUkVBRF9USU1FT1VUAFBPU1QATUlTRElSRUNURURfUkVRVUVTVABDTElFTlRfQ0xPU0VEX1JFUVVFU1QAQ0xJRU5UX0NMT1NFRF9MT0FEX0JBTEFOQ0VEX1JFUVVFU1QAQkFEX1JFUVVFU1QASFRUUF9SRVFVRVNUX1NFTlRfVE9fSFRUUFNfUE9SVABSRVBPUlQASU1fQV9URUFQT1QAUkVTRVRfQ09OVEVOVABOT19DT05URU5UAFBBUlRJQUxfQ09OVEVOVABIUEVfSU5WQUxJRF9DT05TVEFOVABIUEVfQ0JfUkVTRVQAR0VUAEhQRV9TVFJJQ1QAQ09ORkxJQ1QAVEVNUE9SQVJZX1JFRElSRUNUAFBFUk1BTkVOVF9SRURJUkVDVABDT05ORUNUAE1VTFRJX1NUQVRVUwBIUEVfSU5WQUxJRF9TVEFUVVMAVE9PX01BTllfUkVRVUVTVFMARUFSTFlfSElOVFMAVU5BVkFJTEFCTEVfRk9SX0xFR0FMX1JFQVNPTlMAT1BUSU9OUwBTV0lUQ0hJTkdfUFJPVE9DT0xTAFZBUklBTlRfQUxTT19ORUdPVElBVEVTAE1VTFRJUExFX0NIT0lDRVMASU5URVJOQUxfU0VSVkVSX0VSUk9SAFdFQl9TRVJWRVJfVU5LTk9XTl9FUlJPUgBSQUlMR1VOX0VSUk9SAElERU5USVRZX1BST1ZJREVSX0FVVEhFTlRJQ0FUSU9OX0VSUk9SAFNTTF9DRVJUSUZJQ0FURV9FUlJPUgBJTlZBTElEX1hfRk9SV0FSREVEX0ZPUgBTRVRfUEFSQU1FVEVSAEdFVF9QQVJBTUVURVIASFBFX1VTRVIAU0VFX09USEVSAEhQRV9DQl9DSFVOS19IRUFERVIATUtDQUxFTkRBUgBTRVRVUABXRUJfU0VSVkVSX0lTX0RPV04AVEVBUkRPV04ASFBFX0NMT1NFRF9DT05ORUNUSU9OAEhFVVJJU1RJQ19FWFBJUkFUSU9OAERJU0NPTk5FQ1RFRF9PUEVSQVRJT04ATk9OX0FVVEhPUklUQVRJVkVfSU5GT1JNQVRJT04ASFBFX0lOVkFMSURfVkVSU0lPTgBIUEVfQ0JfTUVTU0FHRV9CRUdJTgBTSVRFX0lTX0ZST1pFTgBIUEVfSU5WQUxJRF9IRUFERVJfVE9LRU4ASU5WQUxJRF9UT0tFTgBGT1JCSURERU4ARU5IQU5DRV9ZT1VSX0NBTE0ASFBFX0lOVkFMSURfVVJMAEJMT0NLRURfQllfUEFSRU5UQUxfQ09OVFJPTABNS0NPTABBQ0wASFBFX0lOVEVSTkFMAFJFUVVFU1RfSEVBREVSX0ZJRUxEU19UT09fTEFSR0VfVU5PRkZJQ0lBTABIUEVfT0sAVU5MSU5LAFVOTE9DSwBQUkkAUkVUUllfV0lUSABIUEVfSU5WQUxJRF9DT05URU5UX0xFTkdUSABIUEVfVU5FWFBFQ1RFRF9DT05URU5UX0xFTkdUSABGTFVTSABQUk9QUEFUQ0gATS1TRUFSQ0gAVVJJX1RPT19MT05HAFBST0NFU1NJTkcATUlTQ0VMTEFORU9VU19QRVJTSVNURU5UX1dBUk5JTkcATUlTQ0VMTEFORU9VU19XQVJOSU5HAEhQRV9JTlZBTElEX1RSQU5TRkVSX0VOQ09ESU5HAEV4cGVjdGVkIENSTEYASFBFX0lOVkFMSURfQ0hVTktfU0laRQBNT1ZFAENPTlRJTlVFAEhQRV9DQl9TVEFUVVNfQ09NUExFVEUASFBFX0NCX0hFQURFUlNfQ09NUExFVEUASFBFX0NCX1ZFUlNJT05fQ09NUExFVEUASFBFX0NCX1VSTF9DT01QTEVURQBIUEVfQ0JfQ0hVTktfQ09NUExFVEUASFBFX0NCX0hFQURFUl9WQUxVRV9DT01QTEVURQBIUEVfQ0JfQ0hVTktfRVhURU5TSU9OX1ZBTFVFX0NPTVBMRVRFAEhQRV9DQl9DSFVOS19FWFRFTlNJT05fTkFNRV9DT01QTEVURQBIUEVfQ0JfTUVTU0FHRV9DT01QTEVURQBIUEVfQ0JfTUVUSE9EX0NPTVBMRVRFAEhQRV9DQl9IRUFERVJfRklFTERfQ09NUExFVEUAREVMRVRFAEhQRV9JTlZBTElEX0VPRl9TVEFURQBJTlZBTElEX1NTTF9DRVJUSUZJQ0FURQBQQVVTRQBOT19SRVNQT05TRQBVTlNVUFBPUlRFRF9NRURJQV9UWVBFAEdPTkUATk9UX0FDQ0VQVEFCTEUAU0VSVklDRV9VTkFWQUlMQUJMRQBSQU5HRV9OT1RfU0FUSVNGSUFCTEUAT1JJR0lOX0lTX1VOUkVBQ0hBQkxFAFJFU1BPTlNFX0lTX1NUQUxFAFBVUkdFAE1FUkdFAFJFUVVFU1RfSEVBREVSX0ZJRUxEU19UT09fTEFSR0UAUkVRVUVTVF9IRUFERVJfVE9PX0xBUkdFAFBBWUxPQURfVE9PX0xBUkdFAElOU1VGRklDSUVOVF9TVE9SQUdFAEhQRV9QQVVTRURfVVBHUkFERQBIUEVfUEFVU0VEX0gyX1VQR1JBREUAU09VUkNFAEFOTk9VTkNFAFRSQUNFAEhQRV9VTkVYUEVDVEVEX1NQQUNFAERFU0NSSUJFAFVOU1VCU0NSSUJFAFJFQ09SRABIUEVfSU5WQUxJRF9NRVRIT0QATk9UX0ZPVU5EAFBST1BGSU5EAFVOQklORABSRUJJTkQAVU5BVVRIT1JJWkVEAE1FVEhPRF9OT1RfQUxMT1dFRABIVFRQX1ZFUlNJT05fTk9UX1NVUFBPUlRFRABBTFJFQURZX1JFUE9SVEVEAEFDQ0VQVEVEAE5PVF9JTVBMRU1FTlRFRABMT09QX0RFVEVDVEVEAEhQRV9DUl9FWFBFQ1RFRABIUEVfTEZfRVhQRUNURUQAQ1JFQVRFRABJTV9VU0VEAEhQRV9QQVVTRUQAVElNRU9VVF9PQ0NVUkVEAFBBWU1FTlRfUkVRVUlSRUQAUFJFQ09ORElUSU9OX1JFUVVJUkVEAFBST1hZX0FVVEhFTlRJQ0FUSU9OX1JFUVVJUkVEAE5FVFdPUktfQVVUSEVOVElDQVRJT05fUkVRVUlSRUQATEVOR1RIX1JFUVVJUkVEAFNTTF9DRVJUSUZJQ0FURV9SRVFVSVJFRABVUEdSQURFX1JFUVVJUkVEAFBBR0VfRVhQSVJFRABQUkVDT05ESVRJT05fRkFJTEVEAEVYUEVDVEFUSU9OX0ZBSUxFRABSRVZBTElEQVRJT05fRkFJTEVEAFNTTF9IQU5EU0hBS0VfRkFJTEVEAExPQ0tFRABUUkFOU0ZPUk1BVElPTl9BUFBMSUVEAE5PVF9NT0RJRklFRABOT1RfRVhURU5ERUQAQkFORFdJRFRIX0xJTUlUX0VYQ0VFREVEAFNJVEVfSVNfT1ZFUkxPQURFRABIRUFEAEV4cGVjdGVkIEhUVFAvAABeEwAAJhMAADAQAADwFwAAnRMAABUSAAA5FwAA8BIAAAoQAAB1EgAArRIAAIITAABPFAAAfxAAAKAVAAAjFAAAiRIAAIsUAABNFQAA1BEAAM8UAAAQGAAAyRYAANwWAADBEQAA4BcAALsUAAB0FAAAfBUAAOUUAAAIFwAAHxAAAGUVAACjFAAAKBUAAAIVAACZFQAALBAAAIsZAABPDwAA1A4AAGoQAADOEAAAAhcAAIkOAABuEwAAHBMAAGYUAABWFwAAwRMAAM0TAABsEwAAaBcAAGYXAABfFwAAIhMAAM4PAABpDgAA2A4AAGMWAADLEwAAqg4AACgXAAAmFwAAxRMAAF0WAADoEQAAZxMAAGUTAADyFgAAcxMAAB0XAAD5FgAA8xEAAM8OAADOFQAADBIAALMRAAClEQAAYRAAADIXAAC7EwAAAAAAAAAAAAAAAAAAAAAAAAABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEBAgEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQABAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAAAAAAAAAAAAAAAAAAEAAAAAAAAAAAAAAAAAAAAAAAAAAgMCAgICAgAAAgIAAgIAAgICAgICAgICAgAEAAAAAAACAgICAgICAgICAgICAgICAgICAgICAgICAgAAAAICAgICAgICAgICAgICAgICAgICAgICAgICAgICAAIAAgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABAAAAAAAAAAAAAAAAAAAAAAAAAAIAAgICAgIAAAICAAICAAICAgICAgICAgIAAwAEAAAAAgICAgICAgICAgICAgICAgICAgICAgICAgIAAAACAgICAgICAgICAgICAgICAgICAgICAgICAgICAgACAAIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABsb3NlZWVwLWFsaXZlAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAABAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQABAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQAAAAAAAAAAAAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQEBAQEBAQEBAQEBAgEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEAAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQFjaHVua2VkAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABAQABAQEBAQAAAQEAAQEAAQEBAQEBAQEBAQAAAAAAAAABAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQAAAAEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAAEAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAGVjdGlvbmVudC1sZW5ndGhvbnJveHktY29ubmVjdGlvbgAAAAAAAAAAAAAAAAAAAHJhbnNmZXItZW5jb2RpbmdwZ3JhZGUNCg0KDQpTTQ0KDQpUVFAvQ0UvVFNQLwAAAAAAAAAAAAAAAAECAAEDAAAAAAAAAAAAAAAAAAAAAAAABAEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEAAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEAAAAAAAAAAAABAgABAwAAAAAAAAAAAAAAAAAAAAAAAAQBAQUBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAAEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAAAAAAAAAAAAAQAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAQEAAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAAEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQABAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQAAAAAAAAAAAAABAAACAAAAAAAAAAAAAAAAAAAAAAAAAwQAAAQEBAQEBAQEBAQEBQQEBAQEBAQEBAQEBAAEAAYHBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEAAQABAAEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQAAAQAAAAAAAAAAAAAAAAAAAAAAAAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAgAAAAAAAAMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAAAAAAAAAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEAAAEAAAAAAAAAAAAAAAAAAAAAAAABAAAAAAAAAAAAAgAAAAACAAAAAAAAAAAAAAAAAAAAAAADAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwAAAAAAAAMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAE5PVU5DRUVDS09VVE5FQ1RFVEVDUklCRUxVU0hFVEVBRFNFQVJDSFJHRUNUSVZJVFlMRU5EQVJWRU9USUZZUFRJT05TQ0hTRUFZU1RBVENIR0VPUkRJUkVDVE9SVFJDSFBBUkFNRVRFUlVSQ0VCU0NSSUJFQVJET1dOQUNFSU5ETktDS1VCU0NSSUJFSFRUUC9BRFRQLw=="; +}); + +// node_modules/undici/lib/client.js +var require_client = __commonJS((exports2, module2) => { + var assert = require("assert"); + var net = require("net"); + var http = require("http"); + var { pipeline } = require("stream"); + var util = require_util(); + var timers = require_timers(); + var Request = require_request(); + var DispatcherBase = require_dispatcher_base(); + var { + RequestContentLengthMismatchError, + ResponseContentLengthMismatchError, + InvalidArgumentError, + RequestAbortedError, + HeadersTimeoutError, + HeadersOverflowError, + SocketError, + InformationalError, + BodyTimeoutError, + HTTPParserError, + ResponseExceededMaxSizeError, + ClientDestroyedError + } = require_errors(); + var buildConnector = require_connect(); + var { + kUrl, + kReset, + kServerName, + kClient, + kBusy, + kParser, + kConnect, + kBlocking, + kResuming, + kRunning, + kPending, + kSize, + kWriting, + kQueue, + kConnected, + kConnecting, + kNeedDrain, + kNoRef, + kKeepAliveDefaultTimeout, + kHostHeader, + kPendingIdx, + kRunningIdx, + kError, + kPipelining, + kSocket, + kKeepAliveTimeoutValue, + kMaxHeadersSize, + kKeepAliveMaxTimeout, + kKeepAliveTimeoutThreshold, + kHeadersTimeout, + kBodyTimeout, + kStrictContentLength, + kConnector, + kMaxRedirections, + kMaxRequests, + kCounter, + kClose, + kDestroy, + kDispatch, + kInterceptors, + kLocalAddress, + kMaxResponseSize, + kHTTPConnVersion, + kHost, + kHTTP2Session, + kHTTP2SessionState, + kHTTP2BuildRequest, + kHTTP2CopyHeaders, + kHTTP1BuildRequest + } = require_symbols(); + var http2; + try { + http2 = require("http2"); + } catch { + http2 = { constants: {} }; + } + var { + constants: { + HTTP2_HEADER_AUTHORITY, + HTTP2_HEADER_METHOD, + HTTP2_HEADER_PATH, + HTTP2_HEADER_SCHEME, + HTTP2_HEADER_CONTENT_LENGTH, + HTTP2_HEADER_EXPECT, + HTTP2_HEADER_STATUS + } + } = http2; + var h2ExperimentalWarned = false; + var FastBuffer = Buffer[Symbol.species]; + var kClosedResolve = Symbol("kClosedResolve"); + var channels = {}; + try { + const diagnosticsChannel = require("diagnostics_channel"); + channels.sendHeaders = diagnosticsChannel.channel("undici:client:sendHeaders"); + channels.beforeConnect = diagnosticsChannel.channel("undici:client:beforeConnect"); + channels.connectError = diagnosticsChannel.channel("undici:client:connectError"); + channels.connected = diagnosticsChannel.channel("undici:client:connected"); + } catch { + channels.sendHeaders = { hasSubscribers: false }; + channels.beforeConnect = { hasSubscribers: false }; + channels.connectError = { hasSubscribers: false }; + channels.connected = { hasSubscribers: false }; + } + + class Client extends DispatcherBase { + constructor(url, { + interceptors, + maxHeaderSize, + headersTimeout, + socketTimeout, + requestTimeout, + connectTimeout, + bodyTimeout, + idleTimeout, + keepAlive, + keepAliveTimeout, + maxKeepAliveTimeout, + keepAliveMaxTimeout, + keepAliveTimeoutThreshold, + socketPath, + pipelining, + tls, + strictContentLength, + maxCachedSessions, + maxRedirections, + connect: connect2, + maxRequestsPerClient, + localAddress, + maxResponseSize, + autoSelectFamily, + autoSelectFamilyAttemptTimeout, + allowH2, + maxConcurrentStreams + } = {}) { + super(); + if (keepAlive !== undefined) { + throw new InvalidArgumentError("unsupported keepAlive, use pipelining=0 instead"); + } + if (socketTimeout !== undefined) { + throw new InvalidArgumentError("unsupported socketTimeout, use headersTimeout & bodyTimeout instead"); + } + if (requestTimeout !== undefined) { + throw new InvalidArgumentError("unsupported requestTimeout, use headersTimeout & bodyTimeout instead"); + } + if (idleTimeout !== undefined) { + throw new InvalidArgumentError("unsupported idleTimeout, use keepAliveTimeout instead"); + } + if (maxKeepAliveTimeout !== undefined) { + throw new InvalidArgumentError("unsupported maxKeepAliveTimeout, use keepAliveMaxTimeout instead"); + } + if (maxHeaderSize != null && !Number.isFinite(maxHeaderSize)) { + throw new InvalidArgumentError("invalid maxHeaderSize"); + } + if (socketPath != null && typeof socketPath !== "string") { + throw new InvalidArgumentError("invalid socketPath"); + } + if (connectTimeout != null && (!Number.isFinite(connectTimeout) || connectTimeout < 0)) { + throw new InvalidArgumentError("invalid connectTimeout"); + } + if (keepAliveTimeout != null && (!Number.isFinite(keepAliveTimeout) || keepAliveTimeout <= 0)) { + throw new InvalidArgumentError("invalid keepAliveTimeout"); + } + if (keepAliveMaxTimeout != null && (!Number.isFinite(keepAliveMaxTimeout) || keepAliveMaxTimeout <= 0)) { + throw new InvalidArgumentError("invalid keepAliveMaxTimeout"); + } + if (keepAliveTimeoutThreshold != null && !Number.isFinite(keepAliveTimeoutThreshold)) { + throw new InvalidArgumentError("invalid keepAliveTimeoutThreshold"); + } + if (headersTimeout != null && (!Number.isInteger(headersTimeout) || headersTimeout < 0)) { + throw new InvalidArgumentError("headersTimeout must be a positive integer or zero"); + } + if (bodyTimeout != null && (!Number.isInteger(bodyTimeout) || bodyTimeout < 0)) { + throw new InvalidArgumentError("bodyTimeout must be a positive integer or zero"); + } + if (connect2 != null && typeof connect2 !== "function" && typeof connect2 !== "object") { + throw new InvalidArgumentError("connect must be a function or an object"); + } + if (maxRedirections != null && (!Number.isInteger(maxRedirections) || maxRedirections < 0)) { + throw new InvalidArgumentError("maxRedirections must be a positive number"); + } + if (maxRequestsPerClient != null && (!Number.isInteger(maxRequestsPerClient) || maxRequestsPerClient < 0)) { + throw new InvalidArgumentError("maxRequestsPerClient must be a positive number"); + } + if (localAddress != null && (typeof localAddress !== "string" || net.isIP(localAddress) === 0)) { + throw new InvalidArgumentError("localAddress must be valid string IP address"); + } + if (maxResponseSize != null && (!Number.isInteger(maxResponseSize) || maxResponseSize < -1)) { + throw new InvalidArgumentError("maxResponseSize must be a positive number"); + } + if (autoSelectFamilyAttemptTimeout != null && (!Number.isInteger(autoSelectFamilyAttemptTimeout) || autoSelectFamilyAttemptTimeout < -1)) { + throw new InvalidArgumentError("autoSelectFamilyAttemptTimeout must be a positive number"); + } + if (allowH2 != null && typeof allowH2 !== "boolean") { + throw new InvalidArgumentError("allowH2 must be a valid boolean value"); + } + if (maxConcurrentStreams != null && (typeof maxConcurrentStreams !== "number" || maxConcurrentStreams < 1)) { + throw new InvalidArgumentError("maxConcurrentStreams must be a possitive integer, greater than 0"); + } + if (typeof connect2 !== "function") { + connect2 = buildConnector({ + ...tls, + maxCachedSessions, + allowH2, + socketPath, + timeout: connectTimeout, + ...util.nodeHasAutoSelectFamily && autoSelectFamily ? { autoSelectFamily, autoSelectFamilyAttemptTimeout } : undefined, + ...connect2 + }); + } + this[kInterceptors] = interceptors && interceptors.Client && Array.isArray(interceptors.Client) ? interceptors.Client : [createRedirectInterceptor({ maxRedirections })]; + this[kUrl] = util.parseOrigin(url); + this[kConnector] = connect2; + this[kSocket] = null; + this[kPipelining] = pipelining != null ? pipelining : 1; + this[kMaxHeadersSize] = maxHeaderSize || http.maxHeaderSize; + this[kKeepAliveDefaultTimeout] = keepAliveTimeout == null ? 4000 : keepAliveTimeout; + this[kKeepAliveMaxTimeout] = keepAliveMaxTimeout == null ? 600000 : keepAliveMaxTimeout; + this[kKeepAliveTimeoutThreshold] = keepAliveTimeoutThreshold == null ? 1000 : keepAliveTimeoutThreshold; + this[kKeepAliveTimeoutValue] = this[kKeepAliveDefaultTimeout]; + this[kServerName] = null; + this[kLocalAddress] = localAddress != null ? localAddress : null; + this[kResuming] = 0; + this[kNeedDrain] = 0; + this[kHostHeader] = `host: ${this[kUrl].hostname}${this[kUrl].port ? `:${this[kUrl].port}` : ""}\r\n`; + this[kBodyTimeout] = bodyTimeout != null ? bodyTimeout : 300000; + this[kHeadersTimeout] = headersTimeout != null ? headersTimeout : 300000; + this[kStrictContentLength] = strictContentLength == null ? true : strictContentLength; + this[kMaxRedirections] = maxRedirections; + this[kMaxRequests] = maxRequestsPerClient; + this[kClosedResolve] = null; + this[kMaxResponseSize] = maxResponseSize > -1 ? maxResponseSize : -1; + this[kHTTPConnVersion] = "h1"; + this[kHTTP2Session] = null; + this[kHTTP2SessionState] = !allowH2 ? null : { + openStreams: 0, + maxConcurrentStreams: maxConcurrentStreams != null ? maxConcurrentStreams : 100 + }; + this[kHost] = `${this[kUrl].hostname}${this[kUrl].port ? `:${this[kUrl].port}` : ""}`; + this[kQueue] = []; + this[kRunningIdx] = 0; + this[kPendingIdx] = 0; + } + get pipelining() { + return this[kPipelining]; + } + set pipelining(value) { + this[kPipelining] = value; + resume(this, true); + } + get [kPending]() { + return this[kQueue].length - this[kPendingIdx]; + } + get [kRunning]() { + return this[kPendingIdx] - this[kRunningIdx]; + } + get [kSize]() { + return this[kQueue].length - this[kRunningIdx]; + } + get [kConnected]() { + return !!this[kSocket] && !this[kConnecting] && !this[kSocket].destroyed; + } + get [kBusy]() { + const socket = this[kSocket]; + return socket && (socket[kReset] || socket[kWriting] || socket[kBlocking]) || this[kSize] >= (this[kPipelining] || 1) || this[kPending] > 0; + } + [kConnect](cb) { + connect(this); + this.once("connect", cb); + } + [kDispatch](opts, handler) { + const origin = opts.origin || this[kUrl].origin; + const request = this[kHTTPConnVersion] === "h2" ? Request[kHTTP2BuildRequest](origin, opts, handler) : Request[kHTTP1BuildRequest](origin, opts, handler); + this[kQueue].push(request); + if (this[kResuming]) { + } else if (util.bodyLength(request.body) == null && util.isIterable(request.body)) { + this[kResuming] = 1; + process.nextTick(resume, this); + } else { + resume(this, true); + } + if (this[kResuming] && this[kNeedDrain] !== 2 && this[kBusy]) { + this[kNeedDrain] = 2; + } + return this[kNeedDrain] < 2; + } + async[kClose]() { + return new Promise((resolve) => { + if (!this[kSize]) { + resolve(null); + } else { + this[kClosedResolve] = resolve; + } + }); + } + async[kDestroy](err) { + return new Promise((resolve) => { + const requests = this[kQueue].splice(this[kPendingIdx]); + for (let i = 0;i < requests.length; i++) { + const request = requests[i]; + errorRequest(this, request, err); + } + const callback = () => { + if (this[kClosedResolve]) { + this[kClosedResolve](); + this[kClosedResolve] = null; + } + resolve(); + }; + if (this[kHTTP2Session] != null) { + util.destroy(this[kHTTP2Session], err); + this[kHTTP2Session] = null; + this[kHTTP2SessionState] = null; + } + if (!this[kSocket]) { + queueMicrotask(callback); + } else { + util.destroy(this[kSocket].on("close", callback), err); + } + resume(this); + }); + } + } + function onHttp2SessionError(err) { + assert(err.code !== "ERR_TLS_CERT_ALTNAME_INVALID"); + this[kSocket][kError] = err; + onError(this[kClient], err); + } + function onHttp2FrameError(type, code, id) { + const err = new InformationalError(`HTTP/2: "frameError" received - type ${type}, code ${code}`); + if (id === 0) { + this[kSocket][kError] = err; + onError(this[kClient], err); + } + } + function onHttp2SessionEnd() { + util.destroy(this, new SocketError("other side closed")); + util.destroy(this[kSocket], new SocketError("other side closed")); + } + function onHTTP2GoAway(code) { + const client = this[kClient]; + const err = new InformationalError(`HTTP/2: "GOAWAY" frame received with code ${code}`); + client[kSocket] = null; + client[kHTTP2Session] = null; + if (client.destroyed) { + assert(this[kPending] === 0); + const requests = client[kQueue].splice(client[kRunningIdx]); + for (let i = 0;i < requests.length; i++) { + const request = requests[i]; + errorRequest(this, request, err); + } + } else if (client[kRunning] > 0) { + const request = client[kQueue][client[kRunningIdx]]; + client[kQueue][client[kRunningIdx]++] = null; + errorRequest(client, request, err); + } + client[kPendingIdx] = client[kRunningIdx]; + assert(client[kRunning] === 0); + client.emit("disconnect", client[kUrl], [client], err); + resume(client); + } + var constants = require_constants3(); + var createRedirectInterceptor = require_redirectInterceptor(); + var EMPTY_BUF = Buffer.alloc(0); + async function lazyllhttp() { + const llhttpWasmData = process.env.JEST_WORKER_ID ? require_llhttp_wasm() : undefined; + let mod; + try { + mod = await WebAssembly.compile(Buffer.from(require_llhttp_simd_wasm(), "base64")); + } catch (e) { + mod = await WebAssembly.compile(Buffer.from(llhttpWasmData || require_llhttp_wasm(), "base64")); + } + return await WebAssembly.instantiate(mod, { + env: { + wasm_on_url: (p, at, len) => { + return 0; + }, + wasm_on_status: (p, at, len) => { + assert.strictEqual(currentParser.ptr, p); + const start = at - currentBufferPtr + currentBufferRef.byteOffset; + return currentParser.onStatus(new FastBuffer(currentBufferRef.buffer, start, len)) || 0; + }, + wasm_on_message_begin: (p) => { + assert.strictEqual(currentParser.ptr, p); + return currentParser.onMessageBegin() || 0; + }, + wasm_on_header_field: (p, at, len) => { + assert.strictEqual(currentParser.ptr, p); + const start = at - currentBufferPtr + currentBufferRef.byteOffset; + return currentParser.onHeaderField(new FastBuffer(currentBufferRef.buffer, start, len)) || 0; + }, + wasm_on_header_value: (p, at, len) => { + assert.strictEqual(currentParser.ptr, p); + const start = at - currentBufferPtr + currentBufferRef.byteOffset; + return currentParser.onHeaderValue(new FastBuffer(currentBufferRef.buffer, start, len)) || 0; + }, + wasm_on_headers_complete: (p, statusCode, upgrade, shouldKeepAlive) => { + assert.strictEqual(currentParser.ptr, p); + return currentParser.onHeadersComplete(statusCode, Boolean(upgrade), Boolean(shouldKeepAlive)) || 0; + }, + wasm_on_body: (p, at, len) => { + assert.strictEqual(currentParser.ptr, p); + const start = at - currentBufferPtr + currentBufferRef.byteOffset; + return currentParser.onBody(new FastBuffer(currentBufferRef.buffer, start, len)) || 0; + }, + wasm_on_message_complete: (p) => { + assert.strictEqual(currentParser.ptr, p); + return currentParser.onMessageComplete() || 0; + } + } + }); + } + var llhttpInstance = null; + var llhttpPromise = lazyllhttp(); + llhttpPromise.catch(); + var currentParser = null; + var currentBufferRef = null; + var currentBufferSize = 0; + var currentBufferPtr = null; + var TIMEOUT_HEADERS = 1; + var TIMEOUT_BODY = 2; + var TIMEOUT_IDLE = 3; + + class Parser { + constructor(client, socket, { exports: exports3 }) { + assert(Number.isFinite(client[kMaxHeadersSize]) && client[kMaxHeadersSize] > 0); + this.llhttp = exports3; + this.ptr = this.llhttp.llhttp_alloc(constants.TYPE.RESPONSE); + this.client = client; + this.socket = socket; + this.timeout = null; + this.timeoutValue = null; + this.timeoutType = null; + this.statusCode = null; + this.statusText = ""; + this.upgrade = false; + this.headers = []; + this.headersSize = 0; + this.headersMaxSize = client[kMaxHeadersSize]; + this.shouldKeepAlive = false; + this.paused = false; + this.resume = this.resume.bind(this); + this.bytesRead = 0; + this.keepAlive = ""; + this.contentLength = ""; + this.connection = ""; + this.maxResponseSize = client[kMaxResponseSize]; + } + setTimeout(value, type) { + this.timeoutType = type; + if (value !== this.timeoutValue) { + timers.clearTimeout(this.timeout); + if (value) { + this.timeout = timers.setTimeout(onParserTimeout, value, this); + if (this.timeout.unref) { + this.timeout.unref(); + } + } else { + this.timeout = null; + } + this.timeoutValue = value; + } else if (this.timeout) { + if (this.timeout.refresh) { + this.timeout.refresh(); + } + } + } + resume() { + if (this.socket.destroyed || !this.paused) { + return; + } + assert(this.ptr != null); + assert(currentParser == null); + this.llhttp.llhttp_resume(this.ptr); + assert(this.timeoutType === TIMEOUT_BODY); + if (this.timeout) { + if (this.timeout.refresh) { + this.timeout.refresh(); + } + } + this.paused = false; + this.execute(this.socket.read() || EMPTY_BUF); + this.readMore(); + } + readMore() { + while (!this.paused && this.ptr) { + const chunk = this.socket.read(); + if (chunk === null) { + break; + } + this.execute(chunk); + } + } + execute(data) { + assert(this.ptr != null); + assert(currentParser == null); + assert(!this.paused); + const { socket, llhttp } = this; + if (data.length > currentBufferSize) { + if (currentBufferPtr) { + llhttp.free(currentBufferPtr); + } + currentBufferSize = Math.ceil(data.length / 4096) * 4096; + currentBufferPtr = llhttp.malloc(currentBufferSize); + } + new Uint8Array(llhttp.memory.buffer, currentBufferPtr, currentBufferSize).set(data); + try { + let ret; + try { + currentBufferRef = data; + currentParser = this; + ret = llhttp.llhttp_execute(this.ptr, currentBufferPtr, data.length); + } catch (err) { + throw err; + } finally { + currentParser = null; + currentBufferRef = null; + } + const offset = llhttp.llhttp_get_error_pos(this.ptr) - currentBufferPtr; + if (ret === constants.ERROR.PAUSED_UPGRADE) { + this.onUpgrade(data.slice(offset)); + } else if (ret === constants.ERROR.PAUSED) { + this.paused = true; + socket.unshift(data.slice(offset)); + } else if (ret !== constants.ERROR.OK) { + const ptr = llhttp.llhttp_get_error_reason(this.ptr); + let message = ""; + if (ptr) { + const len = new Uint8Array(llhttp.memory.buffer, ptr).indexOf(0); + message = "Response does not match the HTTP/1.1 protocol (" + Buffer.from(llhttp.memory.buffer, ptr, len).toString() + ")"; + } + throw new HTTPParserError(message, constants.ERROR[ret], data.slice(offset)); + } + } catch (err) { + util.destroy(socket, err); + } + } + destroy() { + assert(this.ptr != null); + assert(currentParser == null); + this.llhttp.llhttp_free(this.ptr); + this.ptr = null; + timers.clearTimeout(this.timeout); + this.timeout = null; + this.timeoutValue = null; + this.timeoutType = null; + this.paused = false; + } + onStatus(buf) { + this.statusText = buf.toString(); + } + onMessageBegin() { + const { socket, client } = this; + if (socket.destroyed) { + return -1; + } + const request = client[kQueue][client[kRunningIdx]]; + if (!request) { + return -1; + } + } + onHeaderField(buf) { + const len = this.headers.length; + if ((len & 1) === 0) { + this.headers.push(buf); + } else { + this.headers[len - 1] = Buffer.concat([this.headers[len - 1], buf]); + } + this.trackHeader(buf.length); + } + onHeaderValue(buf) { + let len = this.headers.length; + if ((len & 1) === 1) { + this.headers.push(buf); + len += 1; + } else { + this.headers[len - 1] = Buffer.concat([this.headers[len - 1], buf]); + } + const key = this.headers[len - 2]; + if (key.length === 10 && key.toString().toLowerCase() === "keep-alive") { + this.keepAlive += buf.toString(); + } else if (key.length === 10 && key.toString().toLowerCase() === "connection") { + this.connection += buf.toString(); + } else if (key.length === 14 && key.toString().toLowerCase() === "content-length") { + this.contentLength += buf.toString(); + } + this.trackHeader(buf.length); + } + trackHeader(len) { + this.headersSize += len; + if (this.headersSize >= this.headersMaxSize) { + util.destroy(this.socket, new HeadersOverflowError); + } + } + onUpgrade(head) { + const { upgrade, client, socket, headers, statusCode } = this; + assert(upgrade); + const request = client[kQueue][client[kRunningIdx]]; + assert(request); + assert(!socket.destroyed); + assert(socket === client[kSocket]); + assert(!this.paused); + assert(request.upgrade || request.method === "CONNECT"); + this.statusCode = null; + this.statusText = ""; + this.shouldKeepAlive = null; + assert(this.headers.length % 2 === 0); + this.headers = []; + this.headersSize = 0; + socket.unshift(head); + socket[kParser].destroy(); + socket[kParser] = null; + socket[kClient] = null; + socket[kError] = null; + socket.removeListener("error", onSocketError).removeListener("readable", onSocketReadable).removeListener("end", onSocketEnd).removeListener("close", onSocketClose); + client[kSocket] = null; + client[kQueue][client[kRunningIdx]++] = null; + client.emit("disconnect", client[kUrl], [client], new InformationalError("upgrade")); + try { + request.onUpgrade(statusCode, headers, socket); + } catch (err) { + util.destroy(socket, err); + } + resume(client); + } + onHeadersComplete(statusCode, upgrade, shouldKeepAlive) { + const { client, socket, headers, statusText } = this; + if (socket.destroyed) { + return -1; + } + const request = client[kQueue][client[kRunningIdx]]; + if (!request) { + return -1; + } + assert(!this.upgrade); + assert(this.statusCode < 200); + if (statusCode === 100) { + util.destroy(socket, new SocketError("bad response", util.getSocketInfo(socket))); + return -1; + } + if (upgrade && !request.upgrade) { + util.destroy(socket, new SocketError("bad upgrade", util.getSocketInfo(socket))); + return -1; + } + assert.strictEqual(this.timeoutType, TIMEOUT_HEADERS); + this.statusCode = statusCode; + this.shouldKeepAlive = shouldKeepAlive || request.method === "HEAD" && !socket[kReset] && this.connection.toLowerCase() === "keep-alive"; + if (this.statusCode >= 200) { + const bodyTimeout = request.bodyTimeout != null ? request.bodyTimeout : client[kBodyTimeout]; + this.setTimeout(bodyTimeout, TIMEOUT_BODY); + } else if (this.timeout) { + if (this.timeout.refresh) { + this.timeout.refresh(); + } + } + if (request.method === "CONNECT") { + assert(client[kRunning] === 1); + this.upgrade = true; + return 2; + } + if (upgrade) { + assert(client[kRunning] === 1); + this.upgrade = true; + return 2; + } + assert(this.headers.length % 2 === 0); + this.headers = []; + this.headersSize = 0; + if (this.shouldKeepAlive && client[kPipelining]) { + const keepAliveTimeout = this.keepAlive ? util.parseKeepAliveTimeout(this.keepAlive) : null; + if (keepAliveTimeout != null) { + const timeout = Math.min(keepAliveTimeout - client[kKeepAliveTimeoutThreshold], client[kKeepAliveMaxTimeout]); + if (timeout <= 0) { + socket[kReset] = true; + } else { + client[kKeepAliveTimeoutValue] = timeout; + } + } else { + client[kKeepAliveTimeoutValue] = client[kKeepAliveDefaultTimeout]; + } + } else { + socket[kReset] = true; + } + const pause = request.onHeaders(statusCode, headers, this.resume, statusText) === false; + if (request.aborted) { + return -1; + } + if (request.method === "HEAD") { + return 1; + } + if (statusCode < 200) { + return 1; + } + if (socket[kBlocking]) { + socket[kBlocking] = false; + resume(client); + } + return pause ? constants.ERROR.PAUSED : 0; + } + onBody(buf) { + const { client, socket, statusCode, maxResponseSize } = this; + if (socket.destroyed) { + return -1; + } + const request = client[kQueue][client[kRunningIdx]]; + assert(request); + assert.strictEqual(this.timeoutType, TIMEOUT_BODY); + if (this.timeout) { + if (this.timeout.refresh) { + this.timeout.refresh(); + } + } + assert(statusCode >= 200); + if (maxResponseSize > -1 && this.bytesRead + buf.length > maxResponseSize) { + util.destroy(socket, new ResponseExceededMaxSizeError); + return -1; + } + this.bytesRead += buf.length; + if (request.onData(buf) === false) { + return constants.ERROR.PAUSED; + } + } + onMessageComplete() { + const { client, socket, statusCode, upgrade, headers, contentLength, bytesRead, shouldKeepAlive } = this; + if (socket.destroyed && (!statusCode || shouldKeepAlive)) { + return -1; + } + if (upgrade) { + return; + } + const request = client[kQueue][client[kRunningIdx]]; + assert(request); + assert(statusCode >= 100); + this.statusCode = null; + this.statusText = ""; + this.bytesRead = 0; + this.contentLength = ""; + this.keepAlive = ""; + this.connection = ""; + assert(this.headers.length % 2 === 0); + this.headers = []; + this.headersSize = 0; + if (statusCode < 200) { + return; + } + if (request.method !== "HEAD" && contentLength && bytesRead !== parseInt(contentLength, 10)) { + util.destroy(socket, new ResponseContentLengthMismatchError); + return -1; + } + request.onComplete(headers); + client[kQueue][client[kRunningIdx]++] = null; + if (socket[kWriting]) { + assert.strictEqual(client[kRunning], 0); + util.destroy(socket, new InformationalError("reset")); + return constants.ERROR.PAUSED; + } else if (!shouldKeepAlive) { + util.destroy(socket, new InformationalError("reset")); + return constants.ERROR.PAUSED; + } else if (socket[kReset] && client[kRunning] === 0) { + util.destroy(socket, new InformationalError("reset")); + return constants.ERROR.PAUSED; + } else if (client[kPipelining] === 1) { + setImmediate(resume, client); + } else { + resume(client); + } + } + } + function onParserTimeout(parser) { + const { socket, timeoutType, client } = parser; + if (timeoutType === TIMEOUT_HEADERS) { + if (!socket[kWriting] || socket.writableNeedDrain || client[kRunning] > 1) { + assert(!parser.paused, "cannot be paused while waiting for headers"); + util.destroy(socket, new HeadersTimeoutError); + } + } else if (timeoutType === TIMEOUT_BODY) { + if (!parser.paused) { + util.destroy(socket, new BodyTimeoutError); + } + } else if (timeoutType === TIMEOUT_IDLE) { + assert(client[kRunning] === 0 && client[kKeepAliveTimeoutValue]); + util.destroy(socket, new InformationalError("socket idle timeout")); + } + } + function onSocketReadable() { + const { [kParser]: parser } = this; + if (parser) { + parser.readMore(); + } + } + function onSocketError(err) { + const { [kClient]: client, [kParser]: parser } = this; + assert(err.code !== "ERR_TLS_CERT_ALTNAME_INVALID"); + if (client[kHTTPConnVersion] !== "h2") { + if (err.code === "ECONNRESET" && parser.statusCode && !parser.shouldKeepAlive) { + parser.onMessageComplete(); + return; + } + } + this[kError] = err; + onError(this[kClient], err); + } + function onError(client, err) { + if (client[kRunning] === 0 && err.code !== "UND_ERR_INFO" && err.code !== "UND_ERR_SOCKET") { + assert(client[kPendingIdx] === client[kRunningIdx]); + const requests = client[kQueue].splice(client[kRunningIdx]); + for (let i = 0;i < requests.length; i++) { + const request = requests[i]; + errorRequest(client, request, err); + } + assert(client[kSize] === 0); + } + } + function onSocketEnd() { + const { [kParser]: parser, [kClient]: client } = this; + if (client[kHTTPConnVersion] !== "h2") { + if (parser.statusCode && !parser.shouldKeepAlive) { + parser.onMessageComplete(); + return; + } + } + util.destroy(this, new SocketError("other side closed", util.getSocketInfo(this))); + } + function onSocketClose() { + const { [kClient]: client, [kParser]: parser } = this; + if (client[kHTTPConnVersion] === "h1" && parser) { + if (!this[kError] && parser.statusCode && !parser.shouldKeepAlive) { + parser.onMessageComplete(); + } + this[kParser].destroy(); + this[kParser] = null; + } + const err = this[kError] || new SocketError("closed", util.getSocketInfo(this)); + client[kSocket] = null; + if (client.destroyed) { + assert(client[kPending] === 0); + const requests = client[kQueue].splice(client[kRunningIdx]); + for (let i = 0;i < requests.length; i++) { + const request = requests[i]; + errorRequest(client, request, err); + } + } else if (client[kRunning] > 0 && err.code !== "UND_ERR_INFO") { + const request = client[kQueue][client[kRunningIdx]]; + client[kQueue][client[kRunningIdx]++] = null; + errorRequest(client, request, err); + } + client[kPendingIdx] = client[kRunningIdx]; + assert(client[kRunning] === 0); + client.emit("disconnect", client[kUrl], [client], err); + resume(client); + } + async function connect(client) { + assert(!client[kConnecting]); + assert(!client[kSocket]); + let { host, hostname, protocol, port } = client[kUrl]; + if (hostname[0] === "[") { + const idx = hostname.indexOf("]"); + assert(idx !== -1); + const ip = hostname.substring(1, idx); + assert(net.isIP(ip)); + hostname = ip; + } + client[kConnecting] = true; + if (channels.beforeConnect.hasSubscribers) { + channels.beforeConnect.publish({ + connectParams: { + host, + hostname, + protocol, + port, + servername: client[kServerName], + localAddress: client[kLocalAddress] + }, + connector: client[kConnector] + }); + } + try { + const socket = await new Promise((resolve, reject) => { + client[kConnector]({ + host, + hostname, + protocol, + port, + servername: client[kServerName], + localAddress: client[kLocalAddress] + }, (err, socket2) => { + if (err) { + reject(err); + } else { + resolve(socket2); + } + }); + }); + if (client.destroyed) { + util.destroy(socket.on("error", () => { + }), new ClientDestroyedError); + return; + } + client[kConnecting] = false; + assert(socket); + const isH2 = socket.alpnProtocol === "h2"; + if (isH2) { + if (!h2ExperimentalWarned) { + h2ExperimentalWarned = true; + process.emitWarning("H2 support is experimental, expect them to change at any time.", { + code: "UNDICI-H2" + }); + } + const session = http2.connect(client[kUrl], { + createConnection: () => socket, + peerMaxConcurrentStreams: client[kHTTP2SessionState].maxConcurrentStreams + }); + client[kHTTPConnVersion] = "h2"; + session[kClient] = client; + session[kSocket] = socket; + session.on("error", onHttp2SessionError); + session.on("frameError", onHttp2FrameError); + session.on("end", onHttp2SessionEnd); + session.on("goaway", onHTTP2GoAway); + session.on("close", onSocketClose); + session.unref(); + client[kHTTP2Session] = session; + socket[kHTTP2Session] = session; + } else { + if (!llhttpInstance) { + llhttpInstance = await llhttpPromise; + llhttpPromise = null; + } + socket[kNoRef] = false; + socket[kWriting] = false; + socket[kReset] = false; + socket[kBlocking] = false; + socket[kParser] = new Parser(client, socket, llhttpInstance); + } + socket[kCounter] = 0; + socket[kMaxRequests] = client[kMaxRequests]; + socket[kClient] = client; + socket[kError] = null; + socket.on("error", onSocketError).on("readable", onSocketReadable).on("end", onSocketEnd).on("close", onSocketClose); + client[kSocket] = socket; + if (channels.connected.hasSubscribers) { + channels.connected.publish({ + connectParams: { + host, + hostname, + protocol, + port, + servername: client[kServerName], + localAddress: client[kLocalAddress] + }, + connector: client[kConnector], + socket + }); + } + client.emit("connect", client[kUrl], [client]); + } catch (err) { + if (client.destroyed) { + return; + } + client[kConnecting] = false; + if (channels.connectError.hasSubscribers) { + channels.connectError.publish({ + connectParams: { + host, + hostname, + protocol, + port, + servername: client[kServerName], + localAddress: client[kLocalAddress] + }, + connector: client[kConnector], + error: err + }); + } + if (err.code === "ERR_TLS_CERT_ALTNAME_INVALID") { + assert(client[kRunning] === 0); + while (client[kPending] > 0 && client[kQueue][client[kPendingIdx]].servername === client[kServerName]) { + const request = client[kQueue][client[kPendingIdx]++]; + errorRequest(client, request, err); + } + } else { + onError(client, err); + } + client.emit("connectionError", client[kUrl], [client], err); + } + resume(client); + } + function emitDrain(client) { + client[kNeedDrain] = 0; + client.emit("drain", client[kUrl], [client]); + } + function resume(client, sync) { + if (client[kResuming] === 2) { + return; + } + client[kResuming] = 2; + _resume(client, sync); + client[kResuming] = 0; + if (client[kRunningIdx] > 256) { + client[kQueue].splice(0, client[kRunningIdx]); + client[kPendingIdx] -= client[kRunningIdx]; + client[kRunningIdx] = 0; + } + } + function _resume(client, sync) { + while (true) { + if (client.destroyed) { + assert(client[kPending] === 0); + return; + } + if (client[kClosedResolve] && !client[kSize]) { + client[kClosedResolve](); + client[kClosedResolve] = null; + return; + } + const socket = client[kSocket]; + if (socket && !socket.destroyed && socket.alpnProtocol !== "h2") { + if (client[kSize] === 0) { + if (!socket[kNoRef] && socket.unref) { + socket.unref(); + socket[kNoRef] = true; + } + } else if (socket[kNoRef] && socket.ref) { + socket.ref(); + socket[kNoRef] = false; + } + if (client[kSize] === 0) { + if (socket[kParser].timeoutType !== TIMEOUT_IDLE) { + socket[kParser].setTimeout(client[kKeepAliveTimeoutValue], TIMEOUT_IDLE); + } + } else if (client[kRunning] > 0 && socket[kParser].statusCode < 200) { + if (socket[kParser].timeoutType !== TIMEOUT_HEADERS) { + const request2 = client[kQueue][client[kRunningIdx]]; + const headersTimeout = request2.headersTimeout != null ? request2.headersTimeout : client[kHeadersTimeout]; + socket[kParser].setTimeout(headersTimeout, TIMEOUT_HEADERS); + } + } + } + if (client[kBusy]) { + client[kNeedDrain] = 2; + } else if (client[kNeedDrain] === 2) { + if (sync) { + client[kNeedDrain] = 1; + process.nextTick(emitDrain, client); + } else { + emitDrain(client); + } + continue; + } + if (client[kPending] === 0) { + return; + } + if (client[kRunning] >= (client[kPipelining] || 1)) { + return; + } + const request = client[kQueue][client[kPendingIdx]]; + if (client[kUrl].protocol === "https:" && client[kServerName] !== request.servername) { + if (client[kRunning] > 0) { + return; + } + client[kServerName] = request.servername; + if (socket && socket.servername !== request.servername) { + util.destroy(socket, new InformationalError("servername changed")); + return; + } + } + if (client[kConnecting]) { + return; + } + if (!socket && !client[kHTTP2Session]) { + connect(client); + return; + } + if (socket.destroyed || socket[kWriting] || socket[kReset] || socket[kBlocking]) { + return; + } + if (client[kRunning] > 0 && !request.idempotent) { + return; + } + if (client[kRunning] > 0 && (request.upgrade || request.method === "CONNECT")) { + return; + } + if (client[kRunning] > 0 && util.bodyLength(request.body) !== 0 && (util.isStream(request.body) || util.isAsyncIterable(request.body))) { + return; + } + if (!request.aborted && write(client, request)) { + client[kPendingIdx]++; + } else { + client[kQueue].splice(client[kPendingIdx], 1); + } + } + } + function shouldSendContentLength(method) { + return method !== "GET" && method !== "HEAD" && method !== "OPTIONS" && method !== "TRACE" && method !== "CONNECT"; + } + function write(client, request) { + if (client[kHTTPConnVersion] === "h2") { + writeH2(client, client[kHTTP2Session], request); + return; + } + const { body, method, path, host, upgrade, headers, blocking, reset } = request; + const expectsPayload = method === "PUT" || method === "POST" || method === "PATCH"; + if (body && typeof body.read === "function") { + body.read(0); + } + const bodyLength = util.bodyLength(body); + let contentLength = bodyLength; + if (contentLength === null) { + contentLength = request.contentLength; + } + if (contentLength === 0 && !expectsPayload) { + contentLength = null; + } + if (shouldSendContentLength(method) && contentLength > 0 && request.contentLength !== null && request.contentLength !== contentLength) { + if (client[kStrictContentLength]) { + errorRequest(client, request, new RequestContentLengthMismatchError); + return false; + } + process.emitWarning(new RequestContentLengthMismatchError); + } + const socket = client[kSocket]; + try { + request.onConnect((err) => { + if (request.aborted || request.completed) { + return; + } + errorRequest(client, request, err || new RequestAbortedError); + util.destroy(socket, new InformationalError("aborted")); + }); + } catch (err) { + errorRequest(client, request, err); + } + if (request.aborted) { + return false; + } + if (method === "HEAD") { + socket[kReset] = true; + } + if (upgrade || method === "CONNECT") { + socket[kReset] = true; + } + if (reset != null) { + socket[kReset] = reset; + } + if (client[kMaxRequests] && socket[kCounter]++ >= client[kMaxRequests]) { + socket[kReset] = true; + } + if (blocking) { + socket[kBlocking] = true; + } + let header = `${method} ${path} HTTP/1.1\r\n`; + if (typeof host === "string") { + header += `host: ${host}\r\n`; + } else { + header += client[kHostHeader]; + } + if (upgrade) { + header += `connection: upgrade\r\nupgrade: ${upgrade}\r\n`; + } else if (client[kPipelining] && !socket[kReset]) { + header += "connection: keep-alive\r\n"; + } else { + header += "connection: close\r\n"; + } + if (headers) { + header += headers; + } + if (channels.sendHeaders.hasSubscribers) { + channels.sendHeaders.publish({ request, headers: header, socket }); + } + if (!body || bodyLength === 0) { + if (contentLength === 0) { + socket.write(`${header}content-length: 0\r\n\r\n`, "latin1"); + } else { + assert(contentLength === null, "no body must not have content length"); + socket.write(`${header}\r\n`, "latin1"); + } + request.onRequestSent(); + } else if (util.isBuffer(body)) { + assert(contentLength === body.byteLength, "buffer body must have content length"); + socket.cork(); + socket.write(`${header}content-length: ${contentLength}\r\n\r\n`, "latin1"); + socket.write(body); + socket.uncork(); + request.onBodySent(body); + request.onRequestSent(); + if (!expectsPayload) { + socket[kReset] = true; + } + } else if (util.isBlobLike(body)) { + if (typeof body.stream === "function") { + writeIterable({ body: body.stream(), client, request, socket, contentLength, header, expectsPayload }); + } else { + writeBlob({ body, client, request, socket, contentLength, header, expectsPayload }); + } + } else if (util.isStream(body)) { + writeStream({ body, client, request, socket, contentLength, header, expectsPayload }); + } else if (util.isIterable(body)) { + writeIterable({ body, client, request, socket, contentLength, header, expectsPayload }); + } else { + assert(false); + } + return true; + } + function writeH2(client, session, request) { + const { body, method, path, host, upgrade, expectContinue, signal, headers: reqHeaders } = request; + let headers; + if (typeof reqHeaders === "string") + headers = Request[kHTTP2CopyHeaders](reqHeaders.trim()); + else + headers = reqHeaders; + if (upgrade) { + errorRequest(client, request, new Error("Upgrade not supported for H2")); + return false; + } + try { + request.onConnect((err) => { + if (request.aborted || request.completed) { + return; + } + errorRequest(client, request, err || new RequestAbortedError); + }); + } catch (err) { + errorRequest(client, request, err); + } + if (request.aborted) { + return false; + } + let stream; + const h2State = client[kHTTP2SessionState]; + headers[HTTP2_HEADER_AUTHORITY] = host || client[kHost]; + headers[HTTP2_HEADER_METHOD] = method; + if (method === "CONNECT") { + session.ref(); + stream = session.request(headers, { endStream: false, signal }); + if (stream.id && !stream.pending) { + request.onUpgrade(null, null, stream); + ++h2State.openStreams; + } else { + stream.once("ready", () => { + request.onUpgrade(null, null, stream); + ++h2State.openStreams; + }); + } + stream.once("close", () => { + h2State.openStreams -= 1; + if (h2State.openStreams === 0) + session.unref(); + }); + return true; + } + headers[HTTP2_HEADER_PATH] = path; + headers[HTTP2_HEADER_SCHEME] = "https"; + const expectsPayload = method === "PUT" || method === "POST" || method === "PATCH"; + if (body && typeof body.read === "function") { + body.read(0); + } + let contentLength = util.bodyLength(body); + if (contentLength == null) { + contentLength = request.contentLength; + } + if (contentLength === 0 || !expectsPayload) { + contentLength = null; + } + if (shouldSendContentLength(method) && contentLength > 0 && request.contentLength != null && request.contentLength !== contentLength) { + if (client[kStrictContentLength]) { + errorRequest(client, request, new RequestContentLengthMismatchError); + return false; + } + process.emitWarning(new RequestContentLengthMismatchError); + } + if (contentLength != null) { + assert(body, "no body must not have content length"); + headers[HTTP2_HEADER_CONTENT_LENGTH] = `${contentLength}`; + } + session.ref(); + const shouldEndStream = method === "GET" || method === "HEAD"; + if (expectContinue) { + headers[HTTP2_HEADER_EXPECT] = "100-continue"; + stream = session.request(headers, { endStream: shouldEndStream, signal }); + stream.once("continue", writeBodyH2); + } else { + stream = session.request(headers, { + endStream: shouldEndStream, + signal + }); + writeBodyH2(); + } + ++h2State.openStreams; + stream.once("response", (headers2) => { + const { [HTTP2_HEADER_STATUS]: statusCode, ...realHeaders } = headers2; + if (request.onHeaders(Number(statusCode), realHeaders, stream.resume.bind(stream), "") === false) { + stream.pause(); + } + }); + stream.once("end", () => { + request.onComplete([]); + }); + stream.on("data", (chunk) => { + if (request.onData(chunk) === false) { + stream.pause(); + } + }); + stream.once("close", () => { + h2State.openStreams -= 1; + if (h2State.openStreams === 0) { + session.unref(); + } + }); + stream.once("error", function(err) { + if (client[kHTTP2Session] && !client[kHTTP2Session].destroyed && !this.closed && !this.destroyed) { + h2State.streams -= 1; + util.destroy(stream, err); + } + }); + stream.once("frameError", (type, code) => { + const err = new InformationalError(`HTTP/2: "frameError" received - type ${type}, code ${code}`); + errorRequest(client, request, err); + if (client[kHTTP2Session] && !client[kHTTP2Session].destroyed && !this.closed && !this.destroyed) { + h2State.streams -= 1; + util.destroy(stream, err); + } + }); + return true; + function writeBodyH2() { + if (!body) { + request.onRequestSent(); + } else if (util.isBuffer(body)) { + assert(contentLength === body.byteLength, "buffer body must have content length"); + stream.cork(); + stream.write(body); + stream.uncork(); + stream.end(); + request.onBodySent(body); + request.onRequestSent(); + } else if (util.isBlobLike(body)) { + if (typeof body.stream === "function") { + writeIterable({ + client, + request, + contentLength, + h2stream: stream, + expectsPayload, + body: body.stream(), + socket: client[kSocket], + header: "" + }); + } else { + writeBlob({ + body, + client, + request, + contentLength, + expectsPayload, + h2stream: stream, + header: "", + socket: client[kSocket] + }); + } + } else if (util.isStream(body)) { + writeStream({ + body, + client, + request, + contentLength, + expectsPayload, + socket: client[kSocket], + h2stream: stream, + header: "" + }); + } else if (util.isIterable(body)) { + writeIterable({ + body, + client, + request, + contentLength, + expectsPayload, + header: "", + h2stream: stream, + socket: client[kSocket] + }); + } else { + assert(false); + } + } + } + function writeStream({ h2stream, body, client, request, socket, contentLength, header, expectsPayload }) { + assert(contentLength !== 0 || client[kRunning] === 0, "stream body cannot be pipelined"); + if (client[kHTTPConnVersion] === "h2") { + let onPipeData = function(chunk) { + request.onBodySent(chunk); + }; + const pipe = pipeline(body, h2stream, (err) => { + if (err) { + util.destroy(body, err); + util.destroy(h2stream, err); + } else { + request.onRequestSent(); + } + }); + pipe.on("data", onPipeData); + pipe.once("end", () => { + pipe.removeListener("data", onPipeData); + util.destroy(pipe); + }); + return; + } + let finished = false; + const writer = new AsyncWriter({ socket, request, contentLength, client, expectsPayload, header }); + const onData = function(chunk) { + if (finished) { + return; + } + try { + if (!writer.write(chunk) && this.pause) { + this.pause(); + } + } catch (err) { + util.destroy(this, err); + } + }; + const onDrain = function() { + if (finished) { + return; + } + if (body.resume) { + body.resume(); + } + }; + const onAbort = function() { + if (finished) { + return; + } + const err = new RequestAbortedError; + queueMicrotask(() => onFinished(err)); + }; + const onFinished = function(err) { + if (finished) { + return; + } + finished = true; + assert(socket.destroyed || socket[kWriting] && client[kRunning] <= 1); + socket.off("drain", onDrain).off("error", onFinished); + body.removeListener("data", onData).removeListener("end", onFinished).removeListener("error", onFinished).removeListener("close", onAbort); + if (!err) { + try { + writer.end(); + } catch (er) { + err = er; + } + } + writer.destroy(err); + if (err && (err.code !== "UND_ERR_INFO" || err.message !== "reset")) { + util.destroy(body, err); + } else { + util.destroy(body); + } + }; + body.on("data", onData).on("end", onFinished).on("error", onFinished).on("close", onAbort); + if (body.resume) { + body.resume(); + } + socket.on("drain", onDrain).on("error", onFinished); + } + async function writeBlob({ h2stream, body, client, request, socket, contentLength, header, expectsPayload }) { + assert(contentLength === body.size, "blob body must have content length"); + const isH2 = client[kHTTPConnVersion] === "h2"; + try { + if (contentLength != null && contentLength !== body.size) { + throw new RequestContentLengthMismatchError; + } + const buffer = Buffer.from(await body.arrayBuffer()); + if (isH2) { + h2stream.cork(); + h2stream.write(buffer); + h2stream.uncork(); + } else { + socket.cork(); + socket.write(`${header}content-length: ${contentLength}\r\n\r\n`, "latin1"); + socket.write(buffer); + socket.uncork(); + } + request.onBodySent(buffer); + request.onRequestSent(); + if (!expectsPayload) { + socket[kReset] = true; + } + resume(client); + } catch (err) { + util.destroy(isH2 ? h2stream : socket, err); + } + } + async function writeIterable({ h2stream, body, client, request, socket, contentLength, header, expectsPayload }) { + assert(contentLength !== 0 || client[kRunning] === 0, "iterator body cannot be pipelined"); + let callback = null; + function onDrain() { + if (callback) { + const cb = callback; + callback = null; + cb(); + } + } + const waitForDrain = () => new Promise((resolve, reject) => { + assert(callback === null); + if (socket[kError]) { + reject(socket[kError]); + } else { + callback = resolve; + } + }); + if (client[kHTTPConnVersion] === "h2") { + h2stream.on("close", onDrain).on("drain", onDrain); + try { + for await (const chunk of body) { + if (socket[kError]) { + throw socket[kError]; + } + const res = h2stream.write(chunk); + request.onBodySent(chunk); + if (!res) { + await waitForDrain(); + } + } + } catch (err) { + h2stream.destroy(err); + } finally { + request.onRequestSent(); + h2stream.end(); + h2stream.off("close", onDrain).off("drain", onDrain); + } + return; + } + socket.on("close", onDrain).on("drain", onDrain); + const writer = new AsyncWriter({ socket, request, contentLength, client, expectsPayload, header }); + try { + for await (const chunk of body) { + if (socket[kError]) { + throw socket[kError]; + } + if (!writer.write(chunk)) { + await waitForDrain(); + } + } + writer.end(); + } catch (err) { + writer.destroy(err); + } finally { + socket.off("close", onDrain).off("drain", onDrain); + } + } + + class AsyncWriter { + constructor({ socket, request, contentLength, client, expectsPayload, header }) { + this.socket = socket; + this.request = request; + this.contentLength = contentLength; + this.client = client; + this.bytesWritten = 0; + this.expectsPayload = expectsPayload; + this.header = header; + socket[kWriting] = true; + } + write(chunk) { + const { socket, request, contentLength, client, bytesWritten, expectsPayload, header } = this; + if (socket[kError]) { + throw socket[kError]; + } + if (socket.destroyed) { + return false; + } + const len = Buffer.byteLength(chunk); + if (!len) { + return true; + } + if (contentLength !== null && bytesWritten + len > contentLength) { + if (client[kStrictContentLength]) { + throw new RequestContentLengthMismatchError; + } + process.emitWarning(new RequestContentLengthMismatchError); + } + socket.cork(); + if (bytesWritten === 0) { + if (!expectsPayload) { + socket[kReset] = true; + } + if (contentLength === null) { + socket.write(`${header}transfer-encoding: chunked\r\n`, "latin1"); + } else { + socket.write(`${header}content-length: ${contentLength}\r\n\r\n`, "latin1"); + } + } + if (contentLength === null) { + socket.write(`\r\n${len.toString(16)}\r\n`, "latin1"); + } + this.bytesWritten += len; + const ret = socket.write(chunk); + socket.uncork(); + request.onBodySent(chunk); + if (!ret) { + if (socket[kParser].timeout && socket[kParser].timeoutType === TIMEOUT_HEADERS) { + if (socket[kParser].timeout.refresh) { + socket[kParser].timeout.refresh(); + } + } + } + return ret; + } + end() { + const { socket, contentLength, client, bytesWritten, expectsPayload, header, request } = this; + request.onRequestSent(); + socket[kWriting] = false; + if (socket[kError]) { + throw socket[kError]; + } + if (socket.destroyed) { + return; + } + if (bytesWritten === 0) { + if (expectsPayload) { + socket.write(`${header}content-length: 0\r\n\r\n`, "latin1"); + } else { + socket.write(`${header}\r\n`, "latin1"); + } + } else if (contentLength === null) { + socket.write("\r\n0\r\n\r\n", "latin1"); + } + if (contentLength !== null && bytesWritten !== contentLength) { + if (client[kStrictContentLength]) { + throw new RequestContentLengthMismatchError; + } else { + process.emitWarning(new RequestContentLengthMismatchError); + } + } + if (socket[kParser].timeout && socket[kParser].timeoutType === TIMEOUT_HEADERS) { + if (socket[kParser].timeout.refresh) { + socket[kParser].timeout.refresh(); + } + } + resume(client); + } + destroy(err) { + const { socket, client } = this; + socket[kWriting] = false; + if (err) { + assert(client[kRunning] <= 1, "pipeline should only contain this request"); + util.destroy(socket, err); + } + } + } + function errorRequest(client, request, err) { + try { + request.onError(err); + assert(request.aborted); + } catch (err2) { + client.emit("error", err2); + } + } + module2.exports = Client; +}); + +// node_modules/undici/lib/node/fixed-queue.js +var require_fixed_queue = __commonJS((exports2, module2) => { + var kSize = 2048; + var kMask = kSize - 1; + + class FixedCircularBuffer { + constructor() { + this.bottom = 0; + this.top = 0; + this.list = new Array(kSize); + this.next = null; + } + isEmpty() { + return this.top === this.bottom; + } + isFull() { + return (this.top + 1 & kMask) === this.bottom; + } + push(data) { + this.list[this.top] = data; + this.top = this.top + 1 & kMask; + } + shift() { + const nextItem = this.list[this.bottom]; + if (nextItem === undefined) + return null; + this.list[this.bottom] = undefined; + this.bottom = this.bottom + 1 & kMask; + return nextItem; + } + } + module2.exports = class FixedQueue { + constructor() { + this.head = this.tail = new FixedCircularBuffer; + } + isEmpty() { + return this.head.isEmpty(); + } + push(data) { + if (this.head.isFull()) { + this.head = this.head.next = new FixedCircularBuffer; + } + this.head.push(data); + } + shift() { + const tail = this.tail; + const next = tail.shift(); + if (tail.isEmpty() && tail.next !== null) { + this.tail = tail.next; + } + return next; + } + }; +}); + +// node_modules/undici/lib/pool-stats.js +var require_pool_stats = __commonJS((exports2, module2) => { + var { kFree, kConnected, kPending, kQueued, kRunning, kSize } = require_symbols(); + var kPool = Symbol("pool"); + + class PoolStats { + constructor(pool) { + this[kPool] = pool; + } + get connected() { + return this[kPool][kConnected]; + } + get free() { + return this[kPool][kFree]; + } + get pending() { + return this[kPool][kPending]; + } + get queued() { + return this[kPool][kQueued]; + } + get running() { + return this[kPool][kRunning]; + } + get size() { + return this[kPool][kSize]; + } + } + module2.exports = PoolStats; +}); + +// node_modules/undici/lib/pool-base.js +var require_pool_base = __commonJS((exports2, module2) => { + var DispatcherBase = require_dispatcher_base(); + var FixedQueue = require_fixed_queue(); + var { kConnected, kSize, kRunning, kPending, kQueued, kBusy, kFree, kUrl, kClose, kDestroy, kDispatch } = require_symbols(); + var PoolStats = require_pool_stats(); + var kClients = Symbol("clients"); + var kNeedDrain = Symbol("needDrain"); + var kQueue = Symbol("queue"); + var kClosedResolve = Symbol("closed resolve"); + var kOnDrain = Symbol("onDrain"); + var kOnConnect = Symbol("onConnect"); + var kOnDisconnect = Symbol("onDisconnect"); + var kOnConnectionError = Symbol("onConnectionError"); + var kGetDispatcher = Symbol("get dispatcher"); + var kAddClient = Symbol("add client"); + var kRemoveClient = Symbol("remove client"); + var kStats = Symbol("stats"); + + class PoolBase extends DispatcherBase { + constructor() { + super(); + this[kQueue] = new FixedQueue; + this[kClients] = []; + this[kQueued] = 0; + const pool = this; + this[kOnDrain] = function onDrain(origin, targets) { + const queue = pool[kQueue]; + let needDrain = false; + while (!needDrain) { + const item = queue.shift(); + if (!item) { + break; + } + pool[kQueued]--; + needDrain = !this.dispatch(item.opts, item.handler); + } + this[kNeedDrain] = needDrain; + if (!this[kNeedDrain] && pool[kNeedDrain]) { + pool[kNeedDrain] = false; + pool.emit("drain", origin, [pool, ...targets]); + } + if (pool[kClosedResolve] && queue.isEmpty()) { + Promise.all(pool[kClients].map((c) => c.close())).then(pool[kClosedResolve]); + } + }; + this[kOnConnect] = (origin, targets) => { + pool.emit("connect", origin, [pool, ...targets]); + }; + this[kOnDisconnect] = (origin, targets, err) => { + pool.emit("disconnect", origin, [pool, ...targets], err); + }; + this[kOnConnectionError] = (origin, targets, err) => { + pool.emit("connectionError", origin, [pool, ...targets], err); + }; + this[kStats] = new PoolStats(this); + } + get [kBusy]() { + return this[kNeedDrain]; + } + get [kConnected]() { + return this[kClients].filter((client) => client[kConnected]).length; + } + get [kFree]() { + return this[kClients].filter((client) => client[kConnected] && !client[kNeedDrain]).length; + } + get [kPending]() { + let ret = this[kQueued]; + for (const { [kPending]: pending } of this[kClients]) { + ret += pending; + } + return ret; + } + get [kRunning]() { + let ret = 0; + for (const { [kRunning]: running } of this[kClients]) { + ret += running; + } + return ret; + } + get [kSize]() { + let ret = this[kQueued]; + for (const { [kSize]: size } of this[kClients]) { + ret += size; + } + return ret; + } + get stats() { + return this[kStats]; + } + async[kClose]() { + if (this[kQueue].isEmpty()) { + return Promise.all(this[kClients].map((c) => c.close())); + } else { + return new Promise((resolve) => { + this[kClosedResolve] = resolve; + }); + } + } + async[kDestroy](err) { + while (true) { + const item = this[kQueue].shift(); + if (!item) { + break; + } + item.handler.onError(err); + } + return Promise.all(this[kClients].map((c) => c.destroy(err))); + } + [kDispatch](opts, handler) { + const dispatcher = this[kGetDispatcher](); + if (!dispatcher) { + this[kNeedDrain] = true; + this[kQueue].push({ opts, handler }); + this[kQueued]++; + } else if (!dispatcher.dispatch(opts, handler)) { + dispatcher[kNeedDrain] = true; + this[kNeedDrain] = !this[kGetDispatcher](); + } + return !this[kNeedDrain]; + } + [kAddClient](client) { + client.on("drain", this[kOnDrain]).on("connect", this[kOnConnect]).on("disconnect", this[kOnDisconnect]).on("connectionError", this[kOnConnectionError]); + this[kClients].push(client); + if (this[kNeedDrain]) { + process.nextTick(() => { + if (this[kNeedDrain]) { + this[kOnDrain](client[kUrl], [this, client]); + } + }); + } + return this; + } + [kRemoveClient](client) { + client.close(() => { + const idx = this[kClients].indexOf(client); + if (idx !== -1) { + this[kClients].splice(idx, 1); + } + }); + this[kNeedDrain] = this[kClients].some((dispatcher) => !dispatcher[kNeedDrain] && dispatcher.closed !== true && dispatcher.destroyed !== true); + } + } + module2.exports = { + PoolBase, + kClients, + kNeedDrain, + kAddClient, + kRemoveClient, + kGetDispatcher + }; +}); + +// node_modules/undici/lib/pool.js +var require_pool = __commonJS((exports2, module2) => { + var { + PoolBase, + kClients, + kNeedDrain, + kAddClient, + kGetDispatcher + } = require_pool_base(); + var Client = require_client(); + var { + InvalidArgumentError + } = require_errors(); + var util = require_util(); + var { kUrl, kInterceptors } = require_symbols(); + var buildConnector = require_connect(); + var kOptions = Symbol("options"); + var kConnections = Symbol("connections"); + var kFactory = Symbol("factory"); + function defaultFactory(origin, opts) { + return new Client(origin, opts); + } + + class Pool extends PoolBase { + constructor(origin, { + connections, + factory = defaultFactory, + connect, + connectTimeout, + tls, + maxCachedSessions, + socketPath, + autoSelectFamily, + autoSelectFamilyAttemptTimeout, + allowH2, + ...options + } = {}) { + super(); + if (connections != null && (!Number.isFinite(connections) || connections < 0)) { + throw new InvalidArgumentError("invalid connections"); + } + if (typeof factory !== "function") { + throw new InvalidArgumentError("factory must be a function."); + } + if (connect != null && typeof connect !== "function" && typeof connect !== "object") { + throw new InvalidArgumentError("connect must be a function or an object"); + } + if (typeof connect !== "function") { + connect = buildConnector({ + ...tls, + maxCachedSessions, + allowH2, + socketPath, + timeout: connectTimeout, + ...util.nodeHasAutoSelectFamily && autoSelectFamily ? { autoSelectFamily, autoSelectFamilyAttemptTimeout } : undefined, + ...connect + }); + } + this[kInterceptors] = options.interceptors && options.interceptors.Pool && Array.isArray(options.interceptors.Pool) ? options.interceptors.Pool : []; + this[kConnections] = connections || null; + this[kUrl] = util.parseOrigin(origin); + this[kOptions] = { ...util.deepClone(options), connect, allowH2 }; + this[kOptions].interceptors = options.interceptors ? { ...options.interceptors } : undefined; + this[kFactory] = factory; + } + [kGetDispatcher]() { + let dispatcher = this[kClients].find((dispatcher2) => !dispatcher2[kNeedDrain]); + if (dispatcher) { + return dispatcher; + } + if (!this[kConnections] || this[kClients].length < this[kConnections]) { + dispatcher = this[kFactory](this[kUrl], this[kOptions]); + this[kAddClient](dispatcher); + } + return dispatcher; + } + } + module2.exports = Pool; +}); + +// node_modules/undici/lib/balanced-pool.js +var require_balanced_pool = __commonJS((exports2, module2) => { + var { + BalancedPoolMissingUpstreamError, + InvalidArgumentError + } = require_errors(); + var { + PoolBase, + kClients, + kNeedDrain, + kAddClient, + kRemoveClient, + kGetDispatcher + } = require_pool_base(); + var Pool = require_pool(); + var { kUrl, kInterceptors } = require_symbols(); + var { parseOrigin } = require_util(); + var kFactory = Symbol("factory"); + var kOptions = Symbol("options"); + var kGreatestCommonDivisor = Symbol("kGreatestCommonDivisor"); + var kCurrentWeight = Symbol("kCurrentWeight"); + var kIndex = Symbol("kIndex"); + var kWeight = Symbol("kWeight"); + var kMaxWeightPerServer = Symbol("kMaxWeightPerServer"); + var kErrorPenalty = Symbol("kErrorPenalty"); + function getGreatestCommonDivisor(a, b) { + if (b === 0) + return a; + return getGreatestCommonDivisor(b, a % b); + } + function defaultFactory(origin, opts) { + return new Pool(origin, opts); + } + + class BalancedPool extends PoolBase { + constructor(upstreams = [], { factory = defaultFactory, ...opts } = {}) { + super(); + this[kOptions] = opts; + this[kIndex] = -1; + this[kCurrentWeight] = 0; + this[kMaxWeightPerServer] = this[kOptions].maxWeightPerServer || 100; + this[kErrorPenalty] = this[kOptions].errorPenalty || 15; + if (!Array.isArray(upstreams)) { + upstreams = [upstreams]; + } + if (typeof factory !== "function") { + throw new InvalidArgumentError("factory must be a function."); + } + this[kInterceptors] = opts.interceptors && opts.interceptors.BalancedPool && Array.isArray(opts.interceptors.BalancedPool) ? opts.interceptors.BalancedPool : []; + this[kFactory] = factory; + for (const upstream of upstreams) { + this.addUpstream(upstream); + } + this._updateBalancedPoolStats(); + } + addUpstream(upstream) { + const upstreamOrigin = parseOrigin(upstream).origin; + if (this[kClients].find((pool2) => pool2[kUrl].origin === upstreamOrigin && pool2.closed !== true && pool2.destroyed !== true)) { + return this; + } + const pool = this[kFactory](upstreamOrigin, Object.assign({}, this[kOptions])); + this[kAddClient](pool); + pool.on("connect", () => { + pool[kWeight] = Math.min(this[kMaxWeightPerServer], pool[kWeight] + this[kErrorPenalty]); + }); + pool.on("connectionError", () => { + pool[kWeight] = Math.max(1, pool[kWeight] - this[kErrorPenalty]); + this._updateBalancedPoolStats(); + }); + pool.on("disconnect", (...args) => { + const err = args[2]; + if (err && err.code === "UND_ERR_SOCKET") { + pool[kWeight] = Math.max(1, pool[kWeight] - this[kErrorPenalty]); + this._updateBalancedPoolStats(); + } + }); + for (const client of this[kClients]) { + client[kWeight] = this[kMaxWeightPerServer]; + } + this._updateBalancedPoolStats(); + return this; + } + _updateBalancedPoolStats() { + this[kGreatestCommonDivisor] = this[kClients].map((p) => p[kWeight]).reduce(getGreatestCommonDivisor, 0); + } + removeUpstream(upstream) { + const upstreamOrigin = parseOrigin(upstream).origin; + const pool = this[kClients].find((pool2) => pool2[kUrl].origin === upstreamOrigin && pool2.closed !== true && pool2.destroyed !== true); + if (pool) { + this[kRemoveClient](pool); + } + return this; + } + get upstreams() { + return this[kClients].filter((dispatcher) => dispatcher.closed !== true && dispatcher.destroyed !== true).map((p) => p[kUrl].origin); + } + [kGetDispatcher]() { + if (this[kClients].length === 0) { + throw new BalancedPoolMissingUpstreamError; + } + const dispatcher = this[kClients].find((dispatcher2) => !dispatcher2[kNeedDrain] && dispatcher2.closed !== true && dispatcher2.destroyed !== true); + if (!dispatcher) { + return; + } + const allClientsBusy = this[kClients].map((pool) => pool[kNeedDrain]).reduce((a, b) => a && b, true); + if (allClientsBusy) { + return; + } + let counter = 0; + let maxWeightIndex = this[kClients].findIndex((pool) => !pool[kNeedDrain]); + while (counter++ < this[kClients].length) { + this[kIndex] = (this[kIndex] + 1) % this[kClients].length; + const pool = this[kClients][this[kIndex]]; + if (pool[kWeight] > this[kClients][maxWeightIndex][kWeight] && !pool[kNeedDrain]) { + maxWeightIndex = this[kIndex]; + } + if (this[kIndex] === 0) { + this[kCurrentWeight] = this[kCurrentWeight] - this[kGreatestCommonDivisor]; + if (this[kCurrentWeight] <= 0) { + this[kCurrentWeight] = this[kMaxWeightPerServer]; + } + } + if (pool[kWeight] >= this[kCurrentWeight] && !pool[kNeedDrain]) { + return pool; + } + } + this[kCurrentWeight] = this[kClients][maxWeightIndex][kWeight]; + this[kIndex] = maxWeightIndex; + return this[kClients][maxWeightIndex]; + } + } + module2.exports = BalancedPool; +}); + +// node_modules/undici/lib/compat/dispatcher-weakref.js +var require_dispatcher_weakref = __commonJS((exports2, module2) => { + var { kConnected, kSize } = require_symbols(); + + class CompatWeakRef { + constructor(value) { + this.value = value; + } + deref() { + return this.value[kConnected] === 0 && this.value[kSize] === 0 ? undefined : this.value; + } + } + + class CompatFinalizer { + constructor(finalizer) { + this.finalizer = finalizer; + } + register(dispatcher, key) { + if (dispatcher.on) { + dispatcher.on("disconnect", () => { + if (dispatcher[kConnected] === 0 && dispatcher[kSize] === 0) { + this.finalizer(key); + } + }); + } + } + } + module2.exports = function() { + if (process.env.NODE_V8_COVERAGE) { + return { + WeakRef: CompatWeakRef, + FinalizationRegistry: CompatFinalizer + }; + } + return { + WeakRef: global.WeakRef || CompatWeakRef, + FinalizationRegistry: global.FinalizationRegistry || CompatFinalizer + }; + }; +}); + +// node_modules/undici/lib/agent.js +var require_agent = __commonJS((exports2, module2) => { + var { InvalidArgumentError } = require_errors(); + var { kClients, kRunning, kClose, kDestroy, kDispatch, kInterceptors } = require_symbols(); + var DispatcherBase = require_dispatcher_base(); + var Pool = require_pool(); + var Client = require_client(); + var util = require_util(); + var createRedirectInterceptor = require_redirectInterceptor(); + var { WeakRef: WeakRef2, FinalizationRegistry } = require_dispatcher_weakref()(); + var kOnConnect = Symbol("onConnect"); + var kOnDisconnect = Symbol("onDisconnect"); + var kOnConnectionError = Symbol("onConnectionError"); + var kMaxRedirections = Symbol("maxRedirections"); + var kOnDrain = Symbol("onDrain"); + var kFactory = Symbol("factory"); + var kFinalizer = Symbol("finalizer"); + var kOptions = Symbol("options"); + function defaultFactory(origin, opts) { + return opts && opts.connections === 1 ? new Client(origin, opts) : new Pool(origin, opts); + } + + class Agent extends DispatcherBase { + constructor({ factory = defaultFactory, maxRedirections = 0, connect, ...options } = {}) { + super(); + if (typeof factory !== "function") { + throw new InvalidArgumentError("factory must be a function."); + } + if (connect != null && typeof connect !== "function" && typeof connect !== "object") { + throw new InvalidArgumentError("connect must be a function or an object"); + } + if (!Number.isInteger(maxRedirections) || maxRedirections < 0) { + throw new InvalidArgumentError("maxRedirections must be a positive number"); + } + if (connect && typeof connect !== "function") { + connect = { ...connect }; + } + this[kInterceptors] = options.interceptors && options.interceptors.Agent && Array.isArray(options.interceptors.Agent) ? options.interceptors.Agent : [createRedirectInterceptor({ maxRedirections })]; + this[kOptions] = { ...util.deepClone(options), connect }; + this[kOptions].interceptors = options.interceptors ? { ...options.interceptors } : undefined; + this[kMaxRedirections] = maxRedirections; + this[kFactory] = factory; + this[kClients] = new Map; + this[kFinalizer] = new FinalizationRegistry((key) => { + const ref = this[kClients].get(key); + if (ref !== undefined && ref.deref() === undefined) { + this[kClients].delete(key); + } + }); + const agent = this; + this[kOnDrain] = (origin, targets) => { + agent.emit("drain", origin, [agent, ...targets]); + }; + this[kOnConnect] = (origin, targets) => { + agent.emit("connect", origin, [agent, ...targets]); + }; + this[kOnDisconnect] = (origin, targets, err) => { + agent.emit("disconnect", origin, [agent, ...targets], err); + }; + this[kOnConnectionError] = (origin, targets, err) => { + agent.emit("connectionError", origin, [agent, ...targets], err); + }; + } + get [kRunning]() { + let ret = 0; + for (const ref of this[kClients].values()) { + const client = ref.deref(); + if (client) { + ret += client[kRunning]; + } + } + return ret; + } + [kDispatch](opts, handler) { + let key; + if (opts.origin && (typeof opts.origin === "string" || opts.origin instanceof URL)) { + key = String(opts.origin); + } else { + throw new InvalidArgumentError("opts.origin must be a non-empty string or URL."); + } + const ref = this[kClients].get(key); + let dispatcher = ref ? ref.deref() : null; + if (!dispatcher) { + dispatcher = this[kFactory](opts.origin, this[kOptions]).on("drain", this[kOnDrain]).on("connect", this[kOnConnect]).on("disconnect", this[kOnDisconnect]).on("connectionError", this[kOnConnectionError]); + this[kClients].set(key, new WeakRef2(dispatcher)); + this[kFinalizer].register(dispatcher, key); + } + return dispatcher.dispatch(opts, handler); + } + async[kClose]() { + const closePromises = []; + for (const ref of this[kClients].values()) { + const client = ref.deref(); + if (client) { + closePromises.push(client.close()); + } + } + await Promise.all(closePromises); + } + async[kDestroy](err) { + const destroyPromises = []; + for (const ref of this[kClients].values()) { + const client = ref.deref(); + if (client) { + destroyPromises.push(client.destroy(err)); + } + } + await Promise.all(destroyPromises); + } + } + module2.exports = Agent; +}); + +// node_modules/undici/lib/api/readable.js +var require_readable = __commonJS((exports2, module2) => { + var assert = require("assert"); + var { Readable } = require("stream"); + var { RequestAbortedError, NotSupportedError, InvalidArgumentError } = require_errors(); + var util = require_util(); + var { ReadableStreamFrom, toUSVString } = require_util(); + var Blob2; + var kConsume = Symbol("kConsume"); + var kReading = Symbol("kReading"); + var kBody = Symbol("kBody"); + var kAbort = Symbol("abort"); + var kContentType = Symbol("kContentType"); + var noop = () => { + }; + module2.exports = class BodyReadable extends Readable { + constructor({ + resume, + abort, + contentType = "", + highWaterMark = 64 * 1024 + }) { + super({ + autoDestroy: true, + read: resume, + highWaterMark + }); + this._readableState.dataEmitted = false; + this[kAbort] = abort; + this[kConsume] = null; + this[kBody] = null; + this[kContentType] = contentType; + this[kReading] = false; + } + destroy(err) { + if (this.destroyed) { + return this; + } + if (!err && !this._readableState.endEmitted) { + err = new RequestAbortedError; + } + if (err) { + this[kAbort](); + } + return super.destroy(err); + } + emit(ev, ...args) { + if (ev === "data") { + this._readableState.dataEmitted = true; + } else if (ev === "error") { + this._readableState.errorEmitted = true; + } + return super.emit(ev, ...args); + } + on(ev, ...args) { + if (ev === "data" || ev === "readable") { + this[kReading] = true; + } + return super.on(ev, ...args); + } + addListener(ev, ...args) { + return this.on(ev, ...args); + } + off(ev, ...args) { + const ret = super.off(ev, ...args); + if (ev === "data" || ev === "readable") { + this[kReading] = this.listenerCount("data") > 0 || this.listenerCount("readable") > 0; + } + return ret; + } + removeListener(ev, ...args) { + return this.off(ev, ...args); + } + push(chunk) { + if (this[kConsume] && chunk !== null && this.readableLength === 0) { + consumePush(this[kConsume], chunk); + return this[kReading] ? super.push(chunk) : true; + } + return super.push(chunk); + } + async text() { + return consume(this, "text"); + } + async json() { + return consume(this, "json"); + } + async blob() { + return consume(this, "blob"); + } + async arrayBuffer() { + return consume(this, "arrayBuffer"); + } + async formData() { + throw new NotSupportedError; + } + get bodyUsed() { + return util.isDisturbed(this); + } + get body() { + if (!this[kBody]) { + this[kBody] = ReadableStreamFrom(this); + if (this[kConsume]) { + this[kBody].getReader(); + assert(this[kBody].locked); + } + } + return this[kBody]; + } + dump(opts) { + let limit = opts && Number.isFinite(opts.limit) ? opts.limit : 262144; + const signal = opts && opts.signal; + if (signal) { + try { + if (typeof signal !== "object" || !("aborted" in signal)) { + throw new InvalidArgumentError("signal must be an AbortSignal"); + } + util.throwIfAborted(signal); + } catch (err) { + return Promise.reject(err); + } + } + if (this.closed) { + return Promise.resolve(null); + } + return new Promise((resolve, reject) => { + const signalListenerCleanup = signal ? util.addAbortListener(signal, () => { + this.destroy(); + }) : noop; + this.on("close", function() { + signalListenerCleanup(); + if (signal && signal.aborted) { + reject(signal.reason || Object.assign(new Error("The operation was aborted"), { name: "AbortError" })); + } else { + resolve(null); + } + }).on("error", noop).on("data", function(chunk) { + limit -= chunk.length; + if (limit <= 0) { + this.destroy(); + } + }).resume(); + }); + } + }; + function isLocked(self2) { + return self2[kBody] && self2[kBody].locked === true || self2[kConsume]; + } + function isUnusable(self2) { + return util.isDisturbed(self2) || isLocked(self2); + } + async function consume(stream, type) { + if (isUnusable(stream)) { + throw new TypeError("unusable"); + } + assert(!stream[kConsume]); + return new Promise((resolve, reject) => { + stream[kConsume] = { + type, + stream, + resolve, + reject, + length: 0, + body: [] + }; + stream.on("error", function(err) { + consumeFinish(this[kConsume], err); + }).on("close", function() { + if (this[kConsume].body !== null) { + consumeFinish(this[kConsume], new RequestAbortedError); + } + }); + process.nextTick(consumeStart, stream[kConsume]); + }); + } + function consumeStart(consume2) { + if (consume2.body === null) { + return; + } + const { _readableState: state } = consume2.stream; + for (const chunk of state.buffer) { + consumePush(consume2, chunk); + } + if (state.endEmitted) { + consumeEnd(this[kConsume]); + } else { + consume2.stream.on("end", function() { + consumeEnd(this[kConsume]); + }); + } + consume2.stream.resume(); + while (consume2.stream.read() != null) { + } + } + function consumeEnd(consume2) { + const { type, body, resolve, stream, length } = consume2; + try { + if (type === "text") { + resolve(toUSVString(Buffer.concat(body))); + } else if (type === "json") { + resolve(JSON.parse(Buffer.concat(body))); + } else if (type === "arrayBuffer") { + const dst = new Uint8Array(length); + let pos = 0; + for (const buf of body) { + dst.set(buf, pos); + pos += buf.byteLength; + } + resolve(dst.buffer); + } else if (type === "blob") { + if (!Blob2) { + Blob2 = require("buffer").Blob; + } + resolve(new Blob2(body, { type: stream[kContentType] })); + } + consumeFinish(consume2); + } catch (err) { + stream.destroy(err); + } + } + function consumePush(consume2, chunk) { + consume2.length += chunk.length; + consume2.body.push(chunk); + } + function consumeFinish(consume2, err) { + if (consume2.body === null) { + return; + } + if (err) { + consume2.reject(err); + } else { + consume2.resolve(); + } + consume2.type = null; + consume2.stream = null; + consume2.resolve = null; + consume2.reject = null; + consume2.length = 0; + consume2.body = null; + } +}); + +// node_modules/undici/lib/api/util.js +var require_util3 = __commonJS((exports2, module2) => { + var assert = require("assert"); + var { + ResponseStatusCodeError + } = require_errors(); + var { toUSVString } = require_util(); + async function getResolveErrorBodyCallback({ callback, body, contentType, statusCode, statusMessage, headers }) { + assert(body); + let chunks = []; + let limit = 0; + for await (const chunk of body) { + chunks.push(chunk); + limit += chunk.length; + if (limit > 128 * 1024) { + chunks = null; + break; + } + } + if (statusCode === 204 || !contentType || !chunks) { + process.nextTick(callback, new ResponseStatusCodeError(`Response status code ${statusCode}${statusMessage ? `: ${statusMessage}` : ""}`, statusCode, headers)); + return; + } + try { + if (contentType.startsWith("application/json")) { + const payload = JSON.parse(toUSVString(Buffer.concat(chunks))); + process.nextTick(callback, new ResponseStatusCodeError(`Response status code ${statusCode}${statusMessage ? `: ${statusMessage}` : ""}`, statusCode, headers, payload)); + return; + } + if (contentType.startsWith("text/")) { + const payload = toUSVString(Buffer.concat(chunks)); + process.nextTick(callback, new ResponseStatusCodeError(`Response status code ${statusCode}${statusMessage ? `: ${statusMessage}` : ""}`, statusCode, headers, payload)); + return; + } + } catch (err) { + } + process.nextTick(callback, new ResponseStatusCodeError(`Response status code ${statusCode}${statusMessage ? `: ${statusMessage}` : ""}`, statusCode, headers)); + } + module2.exports = { getResolveErrorBodyCallback }; +}); + +// node_modules/undici/lib/api/abort-signal.js +var require_abort_signal = __commonJS((exports2, module2) => { + var { addAbortListener } = require_util(); + var { RequestAbortedError } = require_errors(); + var kListener = Symbol("kListener"); + var kSignal = Symbol("kSignal"); + function abort(self2) { + if (self2.abort) { + self2.abort(); + } else { + self2.onError(new RequestAbortedError); + } + } + function addSignal(self2, signal) { + self2[kSignal] = null; + self2[kListener] = null; + if (!signal) { + return; + } + if (signal.aborted) { + abort(self2); + return; + } + self2[kSignal] = signal; + self2[kListener] = () => { + abort(self2); + }; + addAbortListener(self2[kSignal], self2[kListener]); + } + function removeSignal(self2) { + if (!self2[kSignal]) { + return; + } + if ("removeEventListener" in self2[kSignal]) { + self2[kSignal].removeEventListener("abort", self2[kListener]); + } else { + self2[kSignal].removeListener("abort", self2[kListener]); + } + self2[kSignal] = null; + self2[kListener] = null; + } + module2.exports = { + addSignal, + removeSignal + }; +}); + +// node_modules/undici/lib/api/api-request.js +var require_api_request = __commonJS((exports2, module2) => { + var Readable = require_readable(); + var { + InvalidArgumentError, + RequestAbortedError + } = require_errors(); + var util = require_util(); + var { getResolveErrorBodyCallback } = require_util3(); + var { AsyncResource } = require("async_hooks"); + var { addSignal, removeSignal } = require_abort_signal(); + + class RequestHandler extends AsyncResource { + constructor(opts, callback) { + if (!opts || typeof opts !== "object") { + throw new InvalidArgumentError("invalid opts"); + } + const { signal, method, opaque, body, onInfo, responseHeaders, throwOnError, highWaterMark } = opts; + try { + if (typeof callback !== "function") { + throw new InvalidArgumentError("invalid callback"); + } + if (highWaterMark && (typeof highWaterMark !== "number" || highWaterMark < 0)) { + throw new InvalidArgumentError("invalid highWaterMark"); + } + if (signal && typeof signal.on !== "function" && typeof signal.addEventListener !== "function") { + throw new InvalidArgumentError("signal must be an EventEmitter or EventTarget"); + } + if (method === "CONNECT") { + throw new InvalidArgumentError("invalid method"); + } + if (onInfo && typeof onInfo !== "function") { + throw new InvalidArgumentError("invalid onInfo callback"); + } + super("UNDICI_REQUEST"); + } catch (err) { + if (util.isStream(body)) { + util.destroy(body.on("error", util.nop), err); + } + throw err; + } + this.responseHeaders = responseHeaders || null; + this.opaque = opaque || null; + this.callback = callback; + this.res = null; + this.abort = null; + this.body = body; + this.trailers = {}; + this.context = null; + this.onInfo = onInfo || null; + this.throwOnError = throwOnError; + this.highWaterMark = highWaterMark; + if (util.isStream(body)) { + body.on("error", (err) => { + this.onError(err); + }); + } + addSignal(this, signal); + } + onConnect(abort, context) { + if (!this.callback) { + throw new RequestAbortedError; + } + this.abort = abort; + this.context = context; + } + onHeaders(statusCode, rawHeaders, resume, statusMessage) { + const { callback, opaque, abort, context, responseHeaders, highWaterMark } = this; + const headers = responseHeaders === "raw" ? util.parseRawHeaders(rawHeaders) : util.parseHeaders(rawHeaders); + if (statusCode < 200) { + if (this.onInfo) { + this.onInfo({ statusCode, headers }); + } + return; + } + const parsedHeaders = responseHeaders === "raw" ? util.parseHeaders(rawHeaders) : headers; + const contentType = parsedHeaders["content-type"]; + const body = new Readable({ resume, abort, contentType, highWaterMark }); + this.callback = null; + this.res = body; + if (callback !== null) { + if (this.throwOnError && statusCode >= 400) { + this.runInAsyncScope(getResolveErrorBodyCallback, null, { callback, body, contentType, statusCode, statusMessage, headers }); + } else { + this.runInAsyncScope(callback, null, null, { + statusCode, + headers, + trailers: this.trailers, + opaque, + body, + context + }); + } + } + } + onData(chunk) { + const { res } = this; + return res.push(chunk); + } + onComplete(trailers) { + const { res } = this; + removeSignal(this); + util.parseHeaders(trailers, this.trailers); + res.push(null); + } + onError(err) { + const { res, callback, body, opaque } = this; + removeSignal(this); + if (callback) { + this.callback = null; + queueMicrotask(() => { + this.runInAsyncScope(callback, null, err, { opaque }); + }); + } + if (res) { + this.res = null; + queueMicrotask(() => { + util.destroy(res, err); + }); + } + if (body) { + this.body = null; + util.destroy(body, err); + } + } + } + function request(opts, callback) { + if (callback === undefined) { + return new Promise((resolve, reject) => { + request.call(this, opts, (err, data) => { + return err ? reject(err) : resolve(data); + }); + }); + } + try { + this.dispatch(opts, new RequestHandler(opts, callback)); + } catch (err) { + if (typeof callback !== "function") { + throw err; + } + const opaque = opts && opts.opaque; + queueMicrotask(() => callback(err, { opaque })); + } + } + module2.exports = request; + module2.exports.RequestHandler = RequestHandler; +}); + +// node_modules/undici/lib/api/api-stream.js +var require_api_stream = __commonJS((exports2, module2) => { + var { finished, PassThrough } = require("stream"); + var { + InvalidArgumentError, + InvalidReturnValueError, + RequestAbortedError + } = require_errors(); + var util = require_util(); + var { getResolveErrorBodyCallback } = require_util3(); + var { AsyncResource } = require("async_hooks"); + var { addSignal, removeSignal } = require_abort_signal(); + + class StreamHandler extends AsyncResource { + constructor(opts, factory, callback) { + if (!opts || typeof opts !== "object") { + throw new InvalidArgumentError("invalid opts"); + } + const { signal, method, opaque, body, onInfo, responseHeaders, throwOnError } = opts; + try { + if (typeof callback !== "function") { + throw new InvalidArgumentError("invalid callback"); + } + if (typeof factory !== "function") { + throw new InvalidArgumentError("invalid factory"); + } + if (signal && typeof signal.on !== "function" && typeof signal.addEventListener !== "function") { + throw new InvalidArgumentError("signal must be an EventEmitter or EventTarget"); + } + if (method === "CONNECT") { + throw new InvalidArgumentError("invalid method"); + } + if (onInfo && typeof onInfo !== "function") { + throw new InvalidArgumentError("invalid onInfo callback"); + } + super("UNDICI_STREAM"); + } catch (err) { + if (util.isStream(body)) { + util.destroy(body.on("error", util.nop), err); + } + throw err; + } + this.responseHeaders = responseHeaders || null; + this.opaque = opaque || null; + this.factory = factory; + this.callback = callback; + this.res = null; + this.abort = null; + this.context = null; + this.trailers = null; + this.body = body; + this.onInfo = onInfo || null; + this.throwOnError = throwOnError || false; + if (util.isStream(body)) { + body.on("error", (err) => { + this.onError(err); + }); + } + addSignal(this, signal); + } + onConnect(abort, context) { + if (!this.callback) { + throw new RequestAbortedError; + } + this.abort = abort; + this.context = context; + } + onHeaders(statusCode, rawHeaders, resume, statusMessage) { + const { factory, opaque, context, callback, responseHeaders } = this; + const headers = responseHeaders === "raw" ? util.parseRawHeaders(rawHeaders) : util.parseHeaders(rawHeaders); + if (statusCode < 200) { + if (this.onInfo) { + this.onInfo({ statusCode, headers }); + } + return; + } + this.factory = null; + let res; + if (this.throwOnError && statusCode >= 400) { + const parsedHeaders = responseHeaders === "raw" ? util.parseHeaders(rawHeaders) : headers; + const contentType = parsedHeaders["content-type"]; + res = new PassThrough; + this.callback = null; + this.runInAsyncScope(getResolveErrorBodyCallback, null, { callback, body: res, contentType, statusCode, statusMessage, headers }); + } else { + if (factory === null) { + return; + } + res = this.runInAsyncScope(factory, null, { + statusCode, + headers, + opaque, + context + }); + if (!res || typeof res.write !== "function" || typeof res.end !== "function" || typeof res.on !== "function") { + throw new InvalidReturnValueError("expected Writable"); + } + finished(res, { readable: false }, (err) => { + const { callback: callback2, res: res2, opaque: opaque2, trailers, abort } = this; + this.res = null; + if (err || !res2.readable) { + util.destroy(res2, err); + } + this.callback = null; + this.runInAsyncScope(callback2, null, err || null, { opaque: opaque2, trailers }); + if (err) { + abort(); + } + }); + } + res.on("drain", resume); + this.res = res; + const needDrain = res.writableNeedDrain !== undefined ? res.writableNeedDrain : res._writableState && res._writableState.needDrain; + return needDrain !== true; + } + onData(chunk) { + const { res } = this; + return res ? res.write(chunk) : true; + } + onComplete(trailers) { + const { res } = this; + removeSignal(this); + if (!res) { + return; + } + this.trailers = util.parseHeaders(trailers); + res.end(); + } + onError(err) { + const { res, callback, opaque, body } = this; + removeSignal(this); + this.factory = null; + if (res) { + this.res = null; + util.destroy(res, err); + } else if (callback) { + this.callback = null; + queueMicrotask(() => { + this.runInAsyncScope(callback, null, err, { opaque }); + }); + } + if (body) { + this.body = null; + util.destroy(body, err); + } + } + } + function stream(opts, factory, callback) { + if (callback === undefined) { + return new Promise((resolve, reject) => { + stream.call(this, opts, factory, (err, data) => { + return err ? reject(err) : resolve(data); + }); + }); + } + try { + this.dispatch(opts, new StreamHandler(opts, factory, callback)); + } catch (err) { + if (typeof callback !== "function") { + throw err; + } + const opaque = opts && opts.opaque; + queueMicrotask(() => callback(err, { opaque })); + } + } + module2.exports = stream; +}); + +// node_modules/undici/lib/api/api-pipeline.js +var require_api_pipeline = __commonJS((exports2, module2) => { + var { + Readable, + Duplex, + PassThrough + } = require("stream"); + var { + InvalidArgumentError, + InvalidReturnValueError, + RequestAbortedError + } = require_errors(); + var util = require_util(); + var { AsyncResource } = require("async_hooks"); + var { addSignal, removeSignal } = require_abort_signal(); + var assert = require("assert"); + var kResume = Symbol("resume"); + + class PipelineRequest extends Readable { + constructor() { + super({ autoDestroy: true }); + this[kResume] = null; + } + _read() { + const { [kResume]: resume } = this; + if (resume) { + this[kResume] = null; + resume(); + } + } + _destroy(err, callback) { + this._read(); + callback(err); + } + } + + class PipelineResponse extends Readable { + constructor(resume) { + super({ autoDestroy: true }); + this[kResume] = resume; + } + _read() { + this[kResume](); + } + _destroy(err, callback) { + if (!err && !this._readableState.endEmitted) { + err = new RequestAbortedError; + } + callback(err); + } + } + + class PipelineHandler extends AsyncResource { + constructor(opts, handler) { + if (!opts || typeof opts !== "object") { + throw new InvalidArgumentError("invalid opts"); + } + if (typeof handler !== "function") { + throw new InvalidArgumentError("invalid handler"); + } + const { signal, method, opaque, onInfo, responseHeaders } = opts; + if (signal && typeof signal.on !== "function" && typeof signal.addEventListener !== "function") { + throw new InvalidArgumentError("signal must be an EventEmitter or EventTarget"); + } + if (method === "CONNECT") { + throw new InvalidArgumentError("invalid method"); + } + if (onInfo && typeof onInfo !== "function") { + throw new InvalidArgumentError("invalid onInfo callback"); + } + super("UNDICI_PIPELINE"); + this.opaque = opaque || null; + this.responseHeaders = responseHeaders || null; + this.handler = handler; + this.abort = null; + this.context = null; + this.onInfo = onInfo || null; + this.req = new PipelineRequest().on("error", util.nop); + this.ret = new Duplex({ + readableObjectMode: opts.objectMode, + autoDestroy: true, + read: () => { + const { body } = this; + if (body && body.resume) { + body.resume(); + } + }, + write: (chunk, encoding, callback) => { + const { req } = this; + if (req.push(chunk, encoding) || req._readableState.destroyed) { + callback(); + } else { + req[kResume] = callback; + } + }, + destroy: (err, callback) => { + const { body, req, res, ret, abort } = this; + if (!err && !ret._readableState.endEmitted) { + err = new RequestAbortedError; + } + if (abort && err) { + abort(); + } + util.destroy(body, err); + util.destroy(req, err); + util.destroy(res, err); + removeSignal(this); + callback(err); + } + }).on("prefinish", () => { + const { req } = this; + req.push(null); + }); + this.res = null; + addSignal(this, signal); + } + onConnect(abort, context) { + const { ret, res } = this; + assert(!res, "pipeline cannot be retried"); + if (ret.destroyed) { + throw new RequestAbortedError; + } + this.abort = abort; + this.context = context; + } + onHeaders(statusCode, rawHeaders, resume) { + const { opaque, handler, context } = this; + if (statusCode < 200) { + if (this.onInfo) { + const headers = this.responseHeaders === "raw" ? util.parseRawHeaders(rawHeaders) : util.parseHeaders(rawHeaders); + this.onInfo({ statusCode, headers }); + } + return; + } + this.res = new PipelineResponse(resume); + let body; + try { + this.handler = null; + const headers = this.responseHeaders === "raw" ? util.parseRawHeaders(rawHeaders) : util.parseHeaders(rawHeaders); + body = this.runInAsyncScope(handler, null, { + statusCode, + headers, + opaque, + body: this.res, + context + }); + } catch (err) { + this.res.on("error", util.nop); + throw err; + } + if (!body || typeof body.on !== "function") { + throw new InvalidReturnValueError("expected Readable"); + } + body.on("data", (chunk) => { + const { ret, body: body2 } = this; + if (!ret.push(chunk) && body2.pause) { + body2.pause(); + } + }).on("error", (err) => { + const { ret } = this; + util.destroy(ret, err); + }).on("end", () => { + const { ret } = this; + ret.push(null); + }).on("close", () => { + const { ret } = this; + if (!ret._readableState.ended) { + util.destroy(ret, new RequestAbortedError); + } + }); + this.body = body; + } + onData(chunk) { + const { res } = this; + return res.push(chunk); + } + onComplete(trailers) { + const { res } = this; + res.push(null); + } + onError(err) { + const { ret } = this; + this.handler = null; + util.destroy(ret, err); + } + } + function pipeline(opts, handler) { + try { + const pipelineHandler = new PipelineHandler(opts, handler); + this.dispatch({ ...opts, body: pipelineHandler.req }, pipelineHandler); + return pipelineHandler.ret; + } catch (err) { + return new PassThrough().destroy(err); + } + } + module2.exports = pipeline; +}); + +// node_modules/undici/lib/api/api-upgrade.js +var require_api_upgrade = __commonJS((exports2, module2) => { + var { InvalidArgumentError, RequestAbortedError, SocketError } = require_errors(); + var { AsyncResource } = require("async_hooks"); + var util = require_util(); + var { addSignal, removeSignal } = require_abort_signal(); + var assert = require("assert"); + + class UpgradeHandler extends AsyncResource { + constructor(opts, callback) { + if (!opts || typeof opts !== "object") { + throw new InvalidArgumentError("invalid opts"); + } + if (typeof callback !== "function") { + throw new InvalidArgumentError("invalid callback"); + } + const { signal, opaque, responseHeaders } = opts; + if (signal && typeof signal.on !== "function" && typeof signal.addEventListener !== "function") { + throw new InvalidArgumentError("signal must be an EventEmitter or EventTarget"); + } + super("UNDICI_UPGRADE"); + this.responseHeaders = responseHeaders || null; + this.opaque = opaque || null; + this.callback = callback; + this.abort = null; + this.context = null; + addSignal(this, signal); + } + onConnect(abort, context) { + if (!this.callback) { + throw new RequestAbortedError; + } + this.abort = abort; + this.context = null; + } + onHeaders() { + throw new SocketError("bad upgrade", null); + } + onUpgrade(statusCode, rawHeaders, socket) { + const { callback, opaque, context } = this; + assert.strictEqual(statusCode, 101); + removeSignal(this); + this.callback = null; + const headers = this.responseHeaders === "raw" ? util.parseRawHeaders(rawHeaders) : util.parseHeaders(rawHeaders); + this.runInAsyncScope(callback, null, null, { + headers, + socket, + opaque, + context + }); + } + onError(err) { + const { callback, opaque } = this; + removeSignal(this); + if (callback) { + this.callback = null; + queueMicrotask(() => { + this.runInAsyncScope(callback, null, err, { opaque }); + }); + } + } + } + function upgrade(opts, callback) { + if (callback === undefined) { + return new Promise((resolve, reject) => { + upgrade.call(this, opts, (err, data) => { + return err ? reject(err) : resolve(data); + }); + }); + } + try { + const upgradeHandler = new UpgradeHandler(opts, callback); + this.dispatch({ + ...opts, + method: opts.method || "GET", + upgrade: opts.protocol || "Websocket" + }, upgradeHandler); + } catch (err) { + if (typeof callback !== "function") { + throw err; + } + const opaque = opts && opts.opaque; + queueMicrotask(() => callback(err, { opaque })); + } + } + module2.exports = upgrade; +}); + +// node_modules/undici/lib/api/api-connect.js +var require_api_connect = __commonJS((exports2, module2) => { + var { AsyncResource } = require("async_hooks"); + var { InvalidArgumentError, RequestAbortedError, SocketError } = require_errors(); + var util = require_util(); + var { addSignal, removeSignal } = require_abort_signal(); + + class ConnectHandler extends AsyncResource { + constructor(opts, callback) { + if (!opts || typeof opts !== "object") { + throw new InvalidArgumentError("invalid opts"); + } + if (typeof callback !== "function") { + throw new InvalidArgumentError("invalid callback"); + } + const { signal, opaque, responseHeaders } = opts; + if (signal && typeof signal.on !== "function" && typeof signal.addEventListener !== "function") { + throw new InvalidArgumentError("signal must be an EventEmitter or EventTarget"); + } + super("UNDICI_CONNECT"); + this.opaque = opaque || null; + this.responseHeaders = responseHeaders || null; + this.callback = callback; + this.abort = null; + addSignal(this, signal); + } + onConnect(abort, context) { + if (!this.callback) { + throw new RequestAbortedError; + } + this.abort = abort; + this.context = context; + } + onHeaders() { + throw new SocketError("bad connect", null); + } + onUpgrade(statusCode, rawHeaders, socket) { + const { callback, opaque, context } = this; + removeSignal(this); + this.callback = null; + let headers = rawHeaders; + if (headers != null) { + headers = this.responseHeaders === "raw" ? util.parseRawHeaders(rawHeaders) : util.parseHeaders(rawHeaders); + } + this.runInAsyncScope(callback, null, null, { + statusCode, + headers, + socket, + opaque, + context + }); + } + onError(err) { + const { callback, opaque } = this; + removeSignal(this); + if (callback) { + this.callback = null; + queueMicrotask(() => { + this.runInAsyncScope(callback, null, err, { opaque }); + }); + } + } + } + function connect(opts, callback) { + if (callback === undefined) { + return new Promise((resolve, reject) => { + connect.call(this, opts, (err, data) => { + return err ? reject(err) : resolve(data); + }); + }); + } + try { + const connectHandler = new ConnectHandler(opts, callback); + this.dispatch({ ...opts, method: "CONNECT" }, connectHandler); + } catch (err) { + if (typeof callback !== "function") { + throw err; + } + const opaque = opts && opts.opaque; + queueMicrotask(() => callback(err, { opaque })); + } + } + module2.exports = connect; +}); + +// node_modules/undici/lib/api/index.js +var require_api = __commonJS((exports2, module2) => { + module2.exports.request = require_api_request(); + module2.exports.stream = require_api_stream(); + module2.exports.pipeline = require_api_pipeline(); + module2.exports.upgrade = require_api_upgrade(); + module2.exports.connect = require_api_connect(); +}); + +// node_modules/undici/lib/mock/mock-errors.js +var require_mock_errors = __commonJS((exports2, module2) => { + var { UndiciError } = require_errors(); + + class MockNotMatchedError extends UndiciError { + constructor(message) { + super(message); + Error.captureStackTrace(this, MockNotMatchedError); + this.name = "MockNotMatchedError"; + this.message = message || "The request does not match any registered mock dispatches"; + this.code = "UND_MOCK_ERR_MOCK_NOT_MATCHED"; + } + } + module2.exports = { + MockNotMatchedError + }; +}); + +// node_modules/undici/lib/mock/mock-symbols.js +var require_mock_symbols = __commonJS((exports2, module2) => { + module2.exports = { + kAgent: Symbol("agent"), + kOptions: Symbol("options"), + kFactory: Symbol("factory"), + kDispatches: Symbol("dispatches"), + kDispatchKey: Symbol("dispatch key"), + kDefaultHeaders: Symbol("default headers"), + kDefaultTrailers: Symbol("default trailers"), + kContentLength: Symbol("content length"), + kMockAgent: Symbol("mock agent"), + kMockAgentSet: Symbol("mock agent set"), + kMockAgentGet: Symbol("mock agent get"), + kMockDispatch: Symbol("mock dispatch"), + kClose: Symbol("close"), + kOriginalClose: Symbol("original agent close"), + kOrigin: Symbol("origin"), + kIsMockActive: Symbol("is mock active"), + kNetConnect: Symbol("net connect"), + kGetNetConnect: Symbol("get net connect"), + kConnected: Symbol("connected") + }; +}); + +// node_modules/undici/lib/mock/mock-utils.js +var require_mock_utils = __commonJS((exports2, module2) => { + var { MockNotMatchedError } = require_mock_errors(); + var { + kDispatches, + kMockAgent, + kOriginalDispatch, + kOrigin, + kGetNetConnect + } = require_mock_symbols(); + var { buildURL, nop } = require_util(); + var { STATUS_CODES } = require("http"); + var { + types: { + isPromise + } + } = require("util"); + function matchValue(match, value) { + if (typeof match === "string") { + return match === value; + } + if (match instanceof RegExp) { + return match.test(value); + } + if (typeof match === "function") { + return match(value) === true; + } + return false; + } + function lowerCaseEntries(headers) { + return Object.fromEntries(Object.entries(headers).map(([headerName, headerValue]) => { + return [headerName.toLocaleLowerCase(), headerValue]; + })); + } + function getHeaderByName(headers, key) { + if (Array.isArray(headers)) { + for (let i = 0;i < headers.length; i += 2) { + if (headers[i].toLocaleLowerCase() === key.toLocaleLowerCase()) { + return headers[i + 1]; + } + } + return; + } else if (typeof headers.get === "function") { + return headers.get(key); + } else { + return lowerCaseEntries(headers)[key.toLocaleLowerCase()]; + } + } + function buildHeadersFromArray(headers) { + const clone = headers.slice(); + const entries = []; + for (let index = 0;index < clone.length; index += 2) { + entries.push([clone[index], clone[index + 1]]); + } + return Object.fromEntries(entries); + } + function matchHeaders(mockDispatch2, headers) { + if (typeof mockDispatch2.headers === "function") { + if (Array.isArray(headers)) { + headers = buildHeadersFromArray(headers); + } + return mockDispatch2.headers(headers ? lowerCaseEntries(headers) : {}); + } + if (typeof mockDispatch2.headers === "undefined") { + return true; + } + if (typeof headers !== "object" || typeof mockDispatch2.headers !== "object") { + return false; + } + for (const [matchHeaderName, matchHeaderValue] of Object.entries(mockDispatch2.headers)) { + const headerValue = getHeaderByName(headers, matchHeaderName); + if (!matchValue(matchHeaderValue, headerValue)) { + return false; + } + } + return true; + } + function safeUrl(path) { + if (typeof path !== "string") { + return path; + } + const pathSegments = path.split("?"); + if (pathSegments.length !== 2) { + return path; + } + const qp = new URLSearchParams(pathSegments.pop()); + qp.sort(); + return [...pathSegments, qp.toString()].join("?"); + } + function matchKey(mockDispatch2, { path, method, body, headers }) { + const pathMatch = matchValue(mockDispatch2.path, path); + const methodMatch = matchValue(mockDispatch2.method, method); + const bodyMatch = typeof mockDispatch2.body !== "undefined" ? matchValue(mockDispatch2.body, body) : true; + const headersMatch = matchHeaders(mockDispatch2, headers); + return pathMatch && methodMatch && bodyMatch && headersMatch; + } + function getResponseData(data) { + if (Buffer.isBuffer(data)) { + return data; + } else if (typeof data === "object") { + return JSON.stringify(data); + } else { + return data.toString(); + } + } + function getMockDispatch(mockDispatches, key) { + const basePath = key.query ? buildURL(key.path, key.query) : key.path; + const resolvedPath = typeof basePath === "string" ? safeUrl(basePath) : basePath; + let matchedMockDispatches = mockDispatches.filter(({ consumed }) => !consumed).filter(({ path }) => matchValue(safeUrl(path), resolvedPath)); + if (matchedMockDispatches.length === 0) { + throw new MockNotMatchedError(`Mock dispatch not matched for path '${resolvedPath}'`); + } + matchedMockDispatches = matchedMockDispatches.filter(({ method }) => matchValue(method, key.method)); + if (matchedMockDispatches.length === 0) { + throw new MockNotMatchedError(`Mock dispatch not matched for method '${key.method}'`); + } + matchedMockDispatches = matchedMockDispatches.filter(({ body }) => typeof body !== "undefined" ? matchValue(body, key.body) : true); + if (matchedMockDispatches.length === 0) { + throw new MockNotMatchedError(`Mock dispatch not matched for body '${key.body}'`); + } + matchedMockDispatches = matchedMockDispatches.filter((mockDispatch2) => matchHeaders(mockDispatch2, key.headers)); + if (matchedMockDispatches.length === 0) { + throw new MockNotMatchedError(`Mock dispatch not matched for headers '${typeof key.headers === "object" ? JSON.stringify(key.headers) : key.headers}'`); + } + return matchedMockDispatches[0]; + } + function addMockDispatch(mockDispatches, key, data) { + const baseData = { timesInvoked: 0, times: 1, persist: false, consumed: false }; + const replyData = typeof data === "function" ? { callback: data } : { ...data }; + const newMockDispatch = { ...baseData, ...key, pending: true, data: { error: null, ...replyData } }; + mockDispatches.push(newMockDispatch); + return newMockDispatch; + } + function deleteMockDispatch(mockDispatches, key) { + const index = mockDispatches.findIndex((dispatch) => { + if (!dispatch.consumed) { + return false; + } + return matchKey(dispatch, key); + }); + if (index !== -1) { + mockDispatches.splice(index, 1); + } + } + function buildKey(opts) { + const { path, method, body, headers, query } = opts; + return { + path, + method, + body, + headers, + query + }; + } + function generateKeyValues(data) { + return Object.entries(data).reduce((keyValuePairs, [key, value]) => [ + ...keyValuePairs, + Buffer.from(`${key}`), + Array.isArray(value) ? value.map((x) => Buffer.from(`${x}`)) : Buffer.from(`${value}`) + ], []); + } + function getStatusText(statusCode) { + return STATUS_CODES[statusCode] || "unknown"; + } + async function getResponse(body) { + const buffers = []; + for await (const data of body) { + buffers.push(data); + } + return Buffer.concat(buffers).toString("utf8"); + } + function mockDispatch(opts, handler) { + const key = buildKey(opts); + const mockDispatch2 = getMockDispatch(this[kDispatches], key); + mockDispatch2.timesInvoked++; + if (mockDispatch2.data.callback) { + mockDispatch2.data = { ...mockDispatch2.data, ...mockDispatch2.data.callback(opts) }; + } + const { data: { statusCode, data, headers, trailers, error }, delay, persist } = mockDispatch2; + const { timesInvoked, times } = mockDispatch2; + mockDispatch2.consumed = !persist && timesInvoked >= times; + mockDispatch2.pending = timesInvoked < times; + if (error !== null) { + deleteMockDispatch(this[kDispatches], key); + handler.onError(error); + return true; + } + if (typeof delay === "number" && delay > 0) { + setTimeout(() => { + handleReply(this[kDispatches]); + }, delay); + } else { + handleReply(this[kDispatches]); + } + function handleReply(mockDispatches, _data = data) { + const optsHeaders = Array.isArray(opts.headers) ? buildHeadersFromArray(opts.headers) : opts.headers; + const body = typeof _data === "function" ? _data({ ...opts, headers: optsHeaders }) : _data; + if (isPromise(body)) { + body.then((newData) => handleReply(mockDispatches, newData)); + return; + } + const responseData = getResponseData(body); + const responseHeaders = generateKeyValues(headers); + const responseTrailers = generateKeyValues(trailers); + handler.abort = nop; + handler.onHeaders(statusCode, responseHeaders, resume, getStatusText(statusCode)); + handler.onData(Buffer.from(responseData)); + handler.onComplete(responseTrailers); + deleteMockDispatch(mockDispatches, key); + } + function resume() { + } + return true; + } + function buildMockDispatch() { + const agent = this[kMockAgent]; + const origin = this[kOrigin]; + const originalDispatch = this[kOriginalDispatch]; + return function dispatch(opts, handler) { + if (agent.isMockActive) { + try { + mockDispatch.call(this, opts, handler); + } catch (error) { + if (error instanceof MockNotMatchedError) { + const netConnect = agent[kGetNetConnect](); + if (netConnect === false) { + throw new MockNotMatchedError(`${error.message}: subsequent request to origin ${origin} was not allowed (net.connect disabled)`); + } + if (checkNetConnect(netConnect, origin)) { + originalDispatch.call(this, opts, handler); + } else { + throw new MockNotMatchedError(`${error.message}: subsequent request to origin ${origin} was not allowed (net.connect is not enabled for this origin)`); + } + } else { + throw error; + } + } + } else { + originalDispatch.call(this, opts, handler); + } + }; + } + function checkNetConnect(netConnect, origin) { + const url = new URL(origin); + if (netConnect === true) { + return true; + } else if (Array.isArray(netConnect) && netConnect.some((matcher) => matchValue(matcher, url.host))) { + return true; + } + return false; + } + function buildMockOptions(opts) { + if (opts) { + const { agent, ...mockOptions } = opts; + return mockOptions; + } + } + module2.exports = { + getResponseData, + getMockDispatch, + addMockDispatch, + deleteMockDispatch, + buildKey, + generateKeyValues, + matchValue, + getResponse, + getStatusText, + mockDispatch, + buildMockDispatch, + checkNetConnect, + buildMockOptions, + getHeaderByName + }; +}); + +// node_modules/undici/lib/mock/mock-interceptor.js +var require_mock_interceptor = __commonJS((exports2, module2) => { + var { getResponseData, buildKey, addMockDispatch } = require_mock_utils(); + var { + kDispatches, + kDispatchKey, + kDefaultHeaders, + kDefaultTrailers, + kContentLength, + kMockDispatch + } = require_mock_symbols(); + var { InvalidArgumentError } = require_errors(); + var { buildURL } = require_util(); + + class MockScope { + constructor(mockDispatch) { + this[kMockDispatch] = mockDispatch; + } + delay(waitInMs) { + if (typeof waitInMs !== "number" || !Number.isInteger(waitInMs) || waitInMs <= 0) { + throw new InvalidArgumentError("waitInMs must be a valid integer > 0"); + } + this[kMockDispatch].delay = waitInMs; + return this; + } + persist() { + this[kMockDispatch].persist = true; + return this; + } + times(repeatTimes) { + if (typeof repeatTimes !== "number" || !Number.isInteger(repeatTimes) || repeatTimes <= 0) { + throw new InvalidArgumentError("repeatTimes must be a valid integer > 0"); + } + this[kMockDispatch].times = repeatTimes; + return this; + } + } + + class MockInterceptor { + constructor(opts, mockDispatches) { + if (typeof opts !== "object") { + throw new InvalidArgumentError("opts must be an object"); + } + if (typeof opts.path === "undefined") { + throw new InvalidArgumentError("opts.path must be defined"); + } + if (typeof opts.method === "undefined") { + opts.method = "GET"; + } + if (typeof opts.path === "string") { + if (opts.query) { + opts.path = buildURL(opts.path, opts.query); + } else { + const parsedURL = new URL(opts.path, "data://"); + opts.path = parsedURL.pathname + parsedURL.search; + } + } + if (typeof opts.method === "string") { + opts.method = opts.method.toUpperCase(); + } + this[kDispatchKey] = buildKey(opts); + this[kDispatches] = mockDispatches; + this[kDefaultHeaders] = {}; + this[kDefaultTrailers] = {}; + this[kContentLength] = false; + } + createMockScopeDispatchData(statusCode, data, responseOptions = {}) { + const responseData = getResponseData(data); + const contentLength = this[kContentLength] ? { "content-length": responseData.length } : {}; + const headers = { ...this[kDefaultHeaders], ...contentLength, ...responseOptions.headers }; + const trailers = { ...this[kDefaultTrailers], ...responseOptions.trailers }; + return { statusCode, data, headers, trailers }; + } + validateReplyParameters(statusCode, data, responseOptions) { + if (typeof statusCode === "undefined") { + throw new InvalidArgumentError("statusCode must be defined"); + } + if (typeof data === "undefined") { + throw new InvalidArgumentError("data must be defined"); + } + if (typeof responseOptions !== "object") { + throw new InvalidArgumentError("responseOptions must be an object"); + } + } + reply(replyData) { + if (typeof replyData === "function") { + const wrappedDefaultsCallback = (opts) => { + const resolvedData = replyData(opts); + if (typeof resolvedData !== "object") { + throw new InvalidArgumentError("reply options callback must return an object"); + } + const { statusCode: statusCode2, data: data2 = "", responseOptions: responseOptions2 = {} } = resolvedData; + this.validateReplyParameters(statusCode2, data2, responseOptions2); + return { + ...this.createMockScopeDispatchData(statusCode2, data2, responseOptions2) + }; + }; + const newMockDispatch2 = addMockDispatch(this[kDispatches], this[kDispatchKey], wrappedDefaultsCallback); + return new MockScope(newMockDispatch2); + } + const [statusCode, data = "", responseOptions = {}] = [...arguments]; + this.validateReplyParameters(statusCode, data, responseOptions); + const dispatchData = this.createMockScopeDispatchData(statusCode, data, responseOptions); + const newMockDispatch = addMockDispatch(this[kDispatches], this[kDispatchKey], dispatchData); + return new MockScope(newMockDispatch); + } + replyWithError(error) { + if (typeof error === "undefined") { + throw new InvalidArgumentError("error must be defined"); + } + const newMockDispatch = addMockDispatch(this[kDispatches], this[kDispatchKey], { error }); + return new MockScope(newMockDispatch); + } + defaultReplyHeaders(headers) { + if (typeof headers === "undefined") { + throw new InvalidArgumentError("headers must be defined"); + } + this[kDefaultHeaders] = headers; + return this; + } + defaultReplyTrailers(trailers) { + if (typeof trailers === "undefined") { + throw new InvalidArgumentError("trailers must be defined"); + } + this[kDefaultTrailers] = trailers; + return this; + } + replyContentLength() { + this[kContentLength] = true; + return this; + } + } + module2.exports.MockInterceptor = MockInterceptor; + module2.exports.MockScope = MockScope; +}); + +// node_modules/undici/lib/mock/mock-client.js +var require_mock_client = __commonJS((exports2, module2) => { + var { promisify } = require("util"); + var Client = require_client(); + var { buildMockDispatch } = require_mock_utils(); + var { + kDispatches, + kMockAgent, + kClose, + kOriginalClose, + kOrigin, + kOriginalDispatch, + kConnected + } = require_mock_symbols(); + var { MockInterceptor } = require_mock_interceptor(); + var Symbols = require_symbols(); + var { InvalidArgumentError } = require_errors(); + + class MockClient extends Client { + constructor(origin, opts) { + super(origin, opts); + if (!opts || !opts.agent || typeof opts.agent.dispatch !== "function") { + throw new InvalidArgumentError("Argument opts.agent must implement Agent"); + } + this[kMockAgent] = opts.agent; + this[kOrigin] = origin; + this[kDispatches] = []; + this[kConnected] = 1; + this[kOriginalDispatch] = this.dispatch; + this[kOriginalClose] = this.close.bind(this); + this.dispatch = buildMockDispatch.call(this); + this.close = this[kClose]; + } + get [Symbols.kConnected]() { + return this[kConnected]; + } + intercept(opts) { + return new MockInterceptor(opts, this[kDispatches]); + } + async[kClose]() { + await promisify(this[kOriginalClose])(); + this[kConnected] = 0; + this[kMockAgent][Symbols.kClients].delete(this[kOrigin]); + } + } + module2.exports = MockClient; +}); + +// node_modules/undici/lib/mock/mock-pool.js +var require_mock_pool = __commonJS((exports2, module2) => { + var { promisify } = require("util"); + var Pool = require_pool(); + var { buildMockDispatch } = require_mock_utils(); + var { + kDispatches, + kMockAgent, + kClose, + kOriginalClose, + kOrigin, + kOriginalDispatch, + kConnected + } = require_mock_symbols(); + var { MockInterceptor } = require_mock_interceptor(); + var Symbols = require_symbols(); + var { InvalidArgumentError } = require_errors(); + + class MockPool extends Pool { + constructor(origin, opts) { + super(origin, opts); + if (!opts || !opts.agent || typeof opts.agent.dispatch !== "function") { + throw new InvalidArgumentError("Argument opts.agent must implement Agent"); + } + this[kMockAgent] = opts.agent; + this[kOrigin] = origin; + this[kDispatches] = []; + this[kConnected] = 1; + this[kOriginalDispatch] = this.dispatch; + this[kOriginalClose] = this.close.bind(this); + this.dispatch = buildMockDispatch.call(this); + this.close = this[kClose]; + } + get [Symbols.kConnected]() { + return this[kConnected]; + } + intercept(opts) { + return new MockInterceptor(opts, this[kDispatches]); + } + async[kClose]() { + await promisify(this[kOriginalClose])(); + this[kConnected] = 0; + this[kMockAgent][Symbols.kClients].delete(this[kOrigin]); + } + } + module2.exports = MockPool; +}); + +// node_modules/undici/lib/mock/pluralizer.js +var require_pluralizer = __commonJS((exports2, module2) => { + var singulars = { + pronoun: "it", + is: "is", + was: "was", + this: "this" + }; + var plurals = { + pronoun: "they", + is: "are", + was: "were", + this: "these" + }; + module2.exports = class Pluralizer { + constructor(singular, plural) { + this.singular = singular; + this.plural = plural; + } + pluralize(count) { + const one = count === 1; + const keys = one ? singulars : plurals; + const noun = one ? this.singular : this.plural; + return { ...keys, count, noun }; + } + }; +}); + +// node_modules/undici/lib/mock/pending-interceptors-formatter.js +var require_pending_interceptors_formatter = __commonJS((exports2, module2) => { + var { Transform } = require("stream"); + var { Console } = require("console"); + module2.exports = class PendingInterceptorsFormatter { + constructor({ disableColors } = {}) { + this.transform = new Transform({ + transform(chunk, _enc, cb) { + cb(null, chunk); + } + }); + this.logger = new Console({ + stdout: this.transform, + inspectOptions: { + colors: !disableColors && !process.env.CI + } + }); + } + format(pendingInterceptors) { + const withPrettyHeaders = pendingInterceptors.map(({ method, path, data: { statusCode }, persist, times, timesInvoked, origin }) => ({ + Method: method, + Origin: origin, + Path: path, + "Status code": statusCode, + Persistent: persist ? "\u2705" : "\u274C", + Invocations: timesInvoked, + Remaining: persist ? Infinity : times - timesInvoked + })); + this.logger.table(withPrettyHeaders); + return this.transform.read().toString(); + } + }; +}); + +// node_modules/undici/lib/mock/mock-agent.js +var require_mock_agent = __commonJS((exports2, module2) => { + var { kClients } = require_symbols(); + var Agent = require_agent(); + var { + kAgent, + kMockAgentSet, + kMockAgentGet, + kDispatches, + kIsMockActive, + kNetConnect, + kGetNetConnect, + kOptions, + kFactory + } = require_mock_symbols(); + var MockClient = require_mock_client(); + var MockPool = require_mock_pool(); + var { matchValue, buildMockOptions } = require_mock_utils(); + var { InvalidArgumentError, UndiciError } = require_errors(); + var Dispatcher = require_dispatcher(); + var Pluralizer = require_pluralizer(); + var PendingInterceptorsFormatter = require_pending_interceptors_formatter(); + + class FakeWeakRef { + constructor(value) { + this.value = value; + } + deref() { + return this.value; + } + } + + class MockAgent extends Dispatcher { + constructor(opts) { + super(opts); + this[kNetConnect] = true; + this[kIsMockActive] = true; + if (opts && opts.agent && typeof opts.agent.dispatch !== "function") { + throw new InvalidArgumentError("Argument opts.agent must implement Agent"); + } + const agent = opts && opts.agent ? opts.agent : new Agent(opts); + this[kAgent] = agent; + this[kClients] = agent[kClients]; + this[kOptions] = buildMockOptions(opts); + } + get(origin) { + let dispatcher = this[kMockAgentGet](origin); + if (!dispatcher) { + dispatcher = this[kFactory](origin); + this[kMockAgentSet](origin, dispatcher); + } + return dispatcher; + } + dispatch(opts, handler) { + this.get(opts.origin); + return this[kAgent].dispatch(opts, handler); + } + async close() { + await this[kAgent].close(); + this[kClients].clear(); + } + deactivate() { + this[kIsMockActive] = false; + } + activate() { + this[kIsMockActive] = true; + } + enableNetConnect(matcher) { + if (typeof matcher === "string" || typeof matcher === "function" || matcher instanceof RegExp) { + if (Array.isArray(this[kNetConnect])) { + this[kNetConnect].push(matcher); + } else { + this[kNetConnect] = [matcher]; + } + } else if (typeof matcher === "undefined") { + this[kNetConnect] = true; + } else { + throw new InvalidArgumentError("Unsupported matcher. Must be one of String|Function|RegExp."); + } + } + disableNetConnect() { + this[kNetConnect] = false; + } + get isMockActive() { + return this[kIsMockActive]; + } + [kMockAgentSet](origin, dispatcher) { + this[kClients].set(origin, new FakeWeakRef(dispatcher)); + } + [kFactory](origin) { + const mockOptions = Object.assign({ agent: this }, this[kOptions]); + return this[kOptions] && this[kOptions].connections === 1 ? new MockClient(origin, mockOptions) : new MockPool(origin, mockOptions); + } + [kMockAgentGet](origin) { + const ref = this[kClients].get(origin); + if (ref) { + return ref.deref(); + } + if (typeof origin !== "string") { + const dispatcher = this[kFactory]("http://localhost:9999"); + this[kMockAgentSet](origin, dispatcher); + return dispatcher; + } + for (const [keyMatcher, nonExplicitRef] of Array.from(this[kClients])) { + const nonExplicitDispatcher = nonExplicitRef.deref(); + if (nonExplicitDispatcher && typeof keyMatcher !== "string" && matchValue(keyMatcher, origin)) { + const dispatcher = this[kFactory](origin); + this[kMockAgentSet](origin, dispatcher); + dispatcher[kDispatches] = nonExplicitDispatcher[kDispatches]; + return dispatcher; + } + } + } + [kGetNetConnect]() { + return this[kNetConnect]; + } + pendingInterceptors() { + const mockAgentClients = this[kClients]; + return Array.from(mockAgentClients.entries()).flatMap(([origin, scope]) => scope.deref()[kDispatches].map((dispatch) => ({ ...dispatch, origin }))).filter(({ pending }) => pending); + } + assertNoPendingInterceptors({ pendingInterceptorsFormatter = new PendingInterceptorsFormatter } = {}) { + const pending = this.pendingInterceptors(); + if (pending.length === 0) { + return; + } + const pluralizer = new Pluralizer("interceptor", "interceptors").pluralize(pending.length); + throw new UndiciError(` +${pluralizer.count} ${pluralizer.noun} ${pluralizer.is} pending: + +${pendingInterceptorsFormatter.format(pending)} +`.trim()); + } + } + module2.exports = MockAgent; +}); + +// node_modules/undici/lib/proxy-agent.js +var require_proxy_agent = __commonJS((exports2, module2) => { + var { kProxy, kClose, kDestroy, kInterceptors } = require_symbols(); + var { URL: URL2 } = require("url"); + var Agent = require_agent(); + var Pool = require_pool(); + var DispatcherBase = require_dispatcher_base(); + var { InvalidArgumentError, RequestAbortedError } = require_errors(); + var buildConnector = require_connect(); + var kAgent = Symbol("proxy agent"); + var kClient = Symbol("proxy client"); + var kProxyHeaders = Symbol("proxy headers"); + var kRequestTls = Symbol("request tls settings"); + var kProxyTls = Symbol("proxy tls settings"); + var kConnectEndpoint = Symbol("connect endpoint function"); + function defaultProtocolPort(protocol) { + return protocol === "https:" ? 443 : 80; + } + function buildProxyOptions(opts) { + if (typeof opts === "string") { + opts = { uri: opts }; + } + if (!opts || !opts.uri) { + throw new InvalidArgumentError("Proxy opts.uri is mandatory"); + } + return { + uri: opts.uri, + protocol: opts.protocol || "https" + }; + } + function defaultFactory(origin, opts) { + return new Pool(origin, opts); + } + + class ProxyAgent extends DispatcherBase { + constructor(opts) { + super(opts); + this[kProxy] = buildProxyOptions(opts); + this[kAgent] = new Agent(opts); + this[kInterceptors] = opts.interceptors && opts.interceptors.ProxyAgent && Array.isArray(opts.interceptors.ProxyAgent) ? opts.interceptors.ProxyAgent : []; + if (typeof opts === "string") { + opts = { uri: opts }; + } + if (!opts || !opts.uri) { + throw new InvalidArgumentError("Proxy opts.uri is mandatory"); + } + const { clientFactory = defaultFactory } = opts; + if (typeof clientFactory !== "function") { + throw new InvalidArgumentError("Proxy opts.clientFactory must be a function."); + } + this[kRequestTls] = opts.requestTls; + this[kProxyTls] = opts.proxyTls; + this[kProxyHeaders] = opts.headers || {}; + const resolvedUrl = new URL2(opts.uri); + const { origin, port, host, username, password } = resolvedUrl; + if (opts.auth && opts.token) { + throw new InvalidArgumentError("opts.auth cannot be used in combination with opts.token"); + } else if (opts.auth) { + this[kProxyHeaders]["proxy-authorization"] = `Basic ${opts.auth}`; + } else if (opts.token) { + this[kProxyHeaders]["proxy-authorization"] = opts.token; + } else if (username && password) { + this[kProxyHeaders]["proxy-authorization"] = `Basic ${Buffer.from(`${decodeURIComponent(username)}:${decodeURIComponent(password)}`).toString("base64")}`; + } + const connect = buildConnector({ ...opts.proxyTls }); + this[kConnectEndpoint] = buildConnector({ ...opts.requestTls }); + this[kClient] = clientFactory(resolvedUrl, { connect }); + this[kAgent] = new Agent({ + ...opts, + connect: async (opts2, callback) => { + let requestedHost = opts2.host; + if (!opts2.port) { + requestedHost += `:${defaultProtocolPort(opts2.protocol)}`; + } + try { + const { socket, statusCode } = await this[kClient].connect({ + origin, + port, + path: requestedHost, + signal: opts2.signal, + headers: { + ...this[kProxyHeaders], + host + } + }); + if (statusCode !== 200) { + socket.on("error", () => { + }).destroy(); + callback(new RequestAbortedError(`Proxy response (${statusCode}) !== 200 when HTTP Tunneling`)); + } + if (opts2.protocol !== "https:") { + callback(null, socket); + return; + } + let servername; + if (this[kRequestTls]) { + servername = this[kRequestTls].servername; + } else { + servername = opts2.servername; + } + this[kConnectEndpoint]({ ...opts2, servername, httpSocket: socket }, callback); + } catch (err) { + callback(err); + } + } + }); + } + dispatch(opts, handler) { + const { host } = new URL2(opts.origin); + const headers = buildHeaders(opts.headers); + throwIfProxyAuthIsSent(headers); + return this[kAgent].dispatch({ + ...opts, + headers: { + ...headers, + host + } + }, handler); + } + async[kClose]() { + await this[kAgent].close(); + await this[kClient].close(); + } + async[kDestroy]() { + await this[kAgent].destroy(); + await this[kClient].destroy(); + } + } + function buildHeaders(headers) { + if (Array.isArray(headers)) { + const headersPair = {}; + for (let i = 0;i < headers.length; i += 2) { + headersPair[headers[i]] = headers[i + 1]; + } + return headersPair; + } + return headers; + } + function throwIfProxyAuthIsSent(headers) { + const existProxyAuth = headers && Object.keys(headers).find((key) => key.toLowerCase() === "proxy-authorization"); + if (existProxyAuth) { + throw new InvalidArgumentError("Proxy-Authorization should be sent in ProxyAgent constructor"); + } + } + module2.exports = ProxyAgent; +}); + +// node_modules/undici/lib/handler/RetryHandler.js +var require_RetryHandler = __commonJS((exports2, module2) => { + var assert = require("assert"); + var { kRetryHandlerDefaultRetry } = require_symbols(); + var { RequestRetryError } = require_errors(); + var { isDisturbed, parseHeaders, parseRangeHeader } = require_util(); + function calculateRetryAfterHeader(retryAfter) { + const current = Date.now(); + const diff = new Date(retryAfter).getTime() - current; + return diff; + } + + class RetryHandler { + constructor(opts, handlers) { + const { retryOptions, ...dispatchOpts } = opts; + const { + retry: retryFn, + maxRetries, + maxTimeout, + minTimeout, + timeoutFactor, + methods, + errorCodes, + retryAfter, + statusCodes + } = retryOptions ?? {}; + this.dispatch = handlers.dispatch; + this.handler = handlers.handler; + this.opts = dispatchOpts; + this.abort = null; + this.aborted = false; + this.retryOpts = { + retry: retryFn ?? RetryHandler[kRetryHandlerDefaultRetry], + retryAfter: retryAfter ?? true, + maxTimeout: maxTimeout ?? 30 * 1000, + timeout: minTimeout ?? 500, + timeoutFactor: timeoutFactor ?? 2, + maxRetries: maxRetries ?? 5, + methods: methods ?? ["GET", "HEAD", "OPTIONS", "PUT", "DELETE", "TRACE"], + statusCodes: statusCodes ?? [500, 502, 503, 504, 429], + errorCodes: errorCodes ?? [ + "ECONNRESET", + "ECONNREFUSED", + "ENOTFOUND", + "ENETDOWN", + "ENETUNREACH", + "EHOSTDOWN", + "EHOSTUNREACH", + "EPIPE" + ] + }; + this.retryCount = 0; + this.start = 0; + this.end = null; + this.etag = null; + this.resume = null; + this.handler.onConnect((reason) => { + this.aborted = true; + if (this.abort) { + this.abort(reason); + } else { + this.reason = reason; + } + }); + } + onRequestSent() { + if (this.handler.onRequestSent) { + this.handler.onRequestSent(); + } + } + onUpgrade(statusCode, headers, socket) { + if (this.handler.onUpgrade) { + this.handler.onUpgrade(statusCode, headers, socket); + } + } + onConnect(abort) { + if (this.aborted) { + abort(this.reason); + } else { + this.abort = abort; + } + } + onBodySent(chunk) { + if (this.handler.onBodySent) + return this.handler.onBodySent(chunk); + } + static [kRetryHandlerDefaultRetry](err, { state, opts }, cb) { + const { statusCode, code, headers } = err; + const { method, retryOptions } = opts; + const { + maxRetries, + timeout, + maxTimeout, + timeoutFactor, + statusCodes, + errorCodes, + methods + } = retryOptions; + let { counter, currentTimeout } = state; + currentTimeout = currentTimeout != null && currentTimeout > 0 ? currentTimeout : timeout; + if (code && code !== "UND_ERR_REQ_RETRY" && code !== "UND_ERR_SOCKET" && !errorCodes.includes(code)) { + cb(err); + return; + } + if (Array.isArray(methods) && !methods.includes(method)) { + cb(err); + return; + } + if (statusCode != null && Array.isArray(statusCodes) && !statusCodes.includes(statusCode)) { + cb(err); + return; + } + if (counter > maxRetries) { + cb(err); + return; + } + let retryAfterHeader = headers != null && headers["retry-after"]; + if (retryAfterHeader) { + retryAfterHeader = Number(retryAfterHeader); + retryAfterHeader = isNaN(retryAfterHeader) ? calculateRetryAfterHeader(retryAfterHeader) : retryAfterHeader * 1000; + } + const retryTimeout = retryAfterHeader > 0 ? Math.min(retryAfterHeader, maxTimeout) : Math.min(currentTimeout * timeoutFactor ** counter, maxTimeout); + state.currentTimeout = retryTimeout; + setTimeout(() => cb(null), retryTimeout); + } + onHeaders(statusCode, rawHeaders, resume, statusMessage) { + const headers = parseHeaders(rawHeaders); + this.retryCount += 1; + if (statusCode >= 300) { + this.abort(new RequestRetryError("Request failed", statusCode, { + headers, + count: this.retryCount + })); + return false; + } + if (this.resume != null) { + this.resume = null; + if (statusCode !== 206) { + return true; + } + const contentRange = parseRangeHeader(headers["content-range"]); + if (!contentRange) { + this.abort(new RequestRetryError("Content-Range mismatch", statusCode, { + headers, + count: this.retryCount + })); + return false; + } + if (this.etag != null && this.etag !== headers.etag) { + this.abort(new RequestRetryError("ETag mismatch", statusCode, { + headers, + count: this.retryCount + })); + return false; + } + const { start, size, end = size } = contentRange; + assert(this.start === start, "content-range mismatch"); + assert(this.end == null || this.end === end, "content-range mismatch"); + this.resume = resume; + return true; + } + if (this.end == null) { + if (statusCode === 206) { + const range = parseRangeHeader(headers["content-range"]); + if (range == null) { + return this.handler.onHeaders(statusCode, rawHeaders, resume, statusMessage); + } + const { start, size, end = size } = range; + assert(start != null && Number.isFinite(start) && this.start !== start, "content-range mismatch"); + assert(Number.isFinite(start)); + assert(end != null && Number.isFinite(end) && this.end !== end, "invalid content-length"); + this.start = start; + this.end = end; + } + if (this.end == null) { + const contentLength = headers["content-length"]; + this.end = contentLength != null ? Number(contentLength) : null; + } + assert(Number.isFinite(this.start)); + assert(this.end == null || Number.isFinite(this.end), "invalid content-length"); + this.resume = resume; + this.etag = headers.etag != null ? headers.etag : null; + return this.handler.onHeaders(statusCode, rawHeaders, resume, statusMessage); + } + const err = new RequestRetryError("Request failed", statusCode, { + headers, + count: this.retryCount + }); + this.abort(err); + return false; + } + onData(chunk) { + this.start += chunk.length; + return this.handler.onData(chunk); + } + onComplete(rawTrailers) { + this.retryCount = 0; + return this.handler.onComplete(rawTrailers); + } + onError(err) { + if (this.aborted || isDisturbed(this.opts.body)) { + return this.handler.onError(err); + } + this.retryOpts.retry(err, { + state: { counter: this.retryCount++, currentTimeout: this.retryAfter }, + opts: { retryOptions: this.retryOpts, ...this.opts } + }, onRetry.bind(this)); + function onRetry(err2) { + if (err2 != null || this.aborted || isDisturbed(this.opts.body)) { + return this.handler.onError(err2); + } + if (this.start !== 0) { + this.opts = { + ...this.opts, + headers: { + ...this.opts.headers, + range: `bytes=${this.start}-${this.end ?? ""}` + } + }; + } + try { + this.dispatch(this.opts, this); + } catch (err3) { + this.handler.onError(err3); + } + } + } + } + module2.exports = RetryHandler; +}); + +// node_modules/undici/lib/global.js +var require_global2 = __commonJS((exports2, module2) => { + var globalDispatcher = Symbol.for("undici.globalDispatcher.1"); + var { InvalidArgumentError } = require_errors(); + var Agent = require_agent(); + if (getGlobalDispatcher() === undefined) { + setGlobalDispatcher(new Agent); + } + function setGlobalDispatcher(agent) { + if (!agent || typeof agent.dispatch !== "function") { + throw new InvalidArgumentError("Argument agent must implement Agent"); + } + Object.defineProperty(globalThis, globalDispatcher, { + value: agent, + writable: true, + enumerable: false, + configurable: false + }); + } + function getGlobalDispatcher() { + return globalThis[globalDispatcher]; + } + module2.exports = { + setGlobalDispatcher, + getGlobalDispatcher + }; +}); + +// node_modules/undici/lib/handler/DecoratorHandler.js +var require_DecoratorHandler = __commonJS((exports2, module2) => { + module2.exports = class DecoratorHandler { + constructor(handler) { + this.handler = handler; + } + onConnect(...args) { + return this.handler.onConnect(...args); + } + onError(...args) { + return this.handler.onError(...args); + } + onUpgrade(...args) { + return this.handler.onUpgrade(...args); + } + onHeaders(...args) { + return this.handler.onHeaders(...args); + } + onData(...args) { + return this.handler.onData(...args); + } + onComplete(...args) { + return this.handler.onComplete(...args); + } + onBodySent(...args) { + return this.handler.onBodySent(...args); + } + }; +}); + +// node_modules/undici/lib/fetch/headers.js +var require_headers = __commonJS((exports2, module2) => { + var { kHeadersList, kConstruct } = require_symbols(); + var { kGuard } = require_symbols2(); + var { kEnumerableProperty } = require_util(); + var { + makeIterator, + isValidHeaderName, + isValidHeaderValue + } = require_util2(); + var { webidl } = require_webidl(); + var assert = require("assert"); + var kHeadersMap = Symbol("headers map"); + var kHeadersSortedMap = Symbol("headers map sorted"); + function isHTTPWhiteSpaceCharCode(code) { + return code === 10 || code === 13 || code === 9 || code === 32; + } + function headerValueNormalize(potentialValue) { + let i = 0; + let j = potentialValue.length; + while (j > i && isHTTPWhiteSpaceCharCode(potentialValue.charCodeAt(j - 1))) + --j; + while (j > i && isHTTPWhiteSpaceCharCode(potentialValue.charCodeAt(i))) + ++i; + return i === 0 && j === potentialValue.length ? potentialValue : potentialValue.substring(i, j); + } + function fill(headers, object) { + if (Array.isArray(object)) { + for (let i = 0;i < object.length; ++i) { + const header = object[i]; + if (header.length !== 2) { + throw webidl.errors.exception({ + header: "Headers constructor", + message: `expected name/value pair to be length 2, found ${header.length}.` + }); + } + appendHeader(headers, header[0], header[1]); + } + } else if (typeof object === "object" && object !== null) { + const keys = Object.keys(object); + for (let i = 0;i < keys.length; ++i) { + appendHeader(headers, keys[i], object[keys[i]]); + } + } else { + throw webidl.errors.conversionFailed({ + prefix: "Headers constructor", + argument: "Argument 1", + types: ["sequence>", "record"] + }); + } + } + function appendHeader(headers, name, value) { + value = headerValueNormalize(value); + if (!isValidHeaderName(name)) { + throw webidl.errors.invalidArgument({ + prefix: "Headers.append", + value: name, + type: "header name" + }); + } else if (!isValidHeaderValue(value)) { + throw webidl.errors.invalidArgument({ + prefix: "Headers.append", + value, + type: "header value" + }); + } + if (headers[kGuard] === "immutable") { + throw new TypeError("immutable"); + } else if (headers[kGuard] === "request-no-cors") { + } + return headers[kHeadersList].append(name, value); + } + + class HeadersList { + cookies = null; + constructor(init) { + if (init instanceof HeadersList) { + this[kHeadersMap] = new Map(init[kHeadersMap]); + this[kHeadersSortedMap] = init[kHeadersSortedMap]; + this.cookies = init.cookies === null ? null : [...init.cookies]; + } else { + this[kHeadersMap] = new Map(init); + this[kHeadersSortedMap] = null; + } + } + contains(name) { + name = name.toLowerCase(); + return this[kHeadersMap].has(name); + } + clear() { + this[kHeadersMap].clear(); + this[kHeadersSortedMap] = null; + this.cookies = null; + } + append(name, value) { + this[kHeadersSortedMap] = null; + const lowercaseName = name.toLowerCase(); + const exists = this[kHeadersMap].get(lowercaseName); + if (exists) { + const delimiter = lowercaseName === "cookie" ? "; " : ", "; + this[kHeadersMap].set(lowercaseName, { + name: exists.name, + value: `${exists.value}${delimiter}${value}` + }); + } else { + this[kHeadersMap].set(lowercaseName, { name, value }); + } + if (lowercaseName === "set-cookie") { + this.cookies ??= []; + this.cookies.push(value); + } + } + set(name, value) { + this[kHeadersSortedMap] = null; + const lowercaseName = name.toLowerCase(); + if (lowercaseName === "set-cookie") { + this.cookies = [value]; + } + this[kHeadersMap].set(lowercaseName, { name, value }); + } + delete(name) { + this[kHeadersSortedMap] = null; + name = name.toLowerCase(); + if (name === "set-cookie") { + this.cookies = null; + } + this[kHeadersMap].delete(name); + } + get(name) { + const value = this[kHeadersMap].get(name.toLowerCase()); + return value === undefined ? null : value.value; + } + *[Symbol.iterator]() { + for (const [name, { value }] of this[kHeadersMap]) { + yield [name, value]; + } + } + get entries() { + const headers = {}; + if (this[kHeadersMap].size) { + for (const { name, value } of this[kHeadersMap].values()) { + headers[name] = value; + } + } + return headers; + } + } + + class Headers2 { + constructor(init = undefined) { + if (init === kConstruct) { + return; + } + this[kHeadersList] = new HeadersList; + this[kGuard] = "none"; + if (init !== undefined) { + init = webidl.converters.HeadersInit(init); + fill(this, init); + } + } + append(name, value) { + webidl.brandCheck(this, Headers2); + webidl.argumentLengthCheck(arguments, 2, { header: "Headers.append" }); + name = webidl.converters.ByteString(name); + value = webidl.converters.ByteString(value); + return appendHeader(this, name, value); + } + delete(name) { + webidl.brandCheck(this, Headers2); + webidl.argumentLengthCheck(arguments, 1, { header: "Headers.delete" }); + name = webidl.converters.ByteString(name); + if (!isValidHeaderName(name)) { + throw webidl.errors.invalidArgument({ + prefix: "Headers.delete", + value: name, + type: "header name" + }); + } + if (this[kGuard] === "immutable") { + throw new TypeError("immutable"); + } else if (this[kGuard] === "request-no-cors") { + } + if (!this[kHeadersList].contains(name)) { + return; + } + this[kHeadersList].delete(name); + } + get(name) { + webidl.brandCheck(this, Headers2); + webidl.argumentLengthCheck(arguments, 1, { header: "Headers.get" }); + name = webidl.converters.ByteString(name); + if (!isValidHeaderName(name)) { + throw webidl.errors.invalidArgument({ + prefix: "Headers.get", + value: name, + type: "header name" + }); + } + return this[kHeadersList].get(name); + } + has(name) { + webidl.brandCheck(this, Headers2); + webidl.argumentLengthCheck(arguments, 1, { header: "Headers.has" }); + name = webidl.converters.ByteString(name); + if (!isValidHeaderName(name)) { + throw webidl.errors.invalidArgument({ + prefix: "Headers.has", + value: name, + type: "header name" + }); + } + return this[kHeadersList].contains(name); + } + set(name, value) { + webidl.brandCheck(this, Headers2); + webidl.argumentLengthCheck(arguments, 2, { header: "Headers.set" }); + name = webidl.converters.ByteString(name); + value = webidl.converters.ByteString(value); + value = headerValueNormalize(value); + if (!isValidHeaderName(name)) { + throw webidl.errors.invalidArgument({ + prefix: "Headers.set", + value: name, + type: "header name" + }); + } else if (!isValidHeaderValue(value)) { + throw webidl.errors.invalidArgument({ + prefix: "Headers.set", + value, + type: "header value" + }); + } + if (this[kGuard] === "immutable") { + throw new TypeError("immutable"); + } else if (this[kGuard] === "request-no-cors") { + } + this[kHeadersList].set(name, value); + } + getSetCookie() { + webidl.brandCheck(this, Headers2); + const list = this[kHeadersList].cookies; + if (list) { + return [...list]; + } + return []; + } + get [kHeadersSortedMap]() { + if (this[kHeadersList][kHeadersSortedMap]) { + return this[kHeadersList][kHeadersSortedMap]; + } + const headers = []; + const names = [...this[kHeadersList]].sort((a, b) => a[0] < b[0] ? -1 : 1); + const cookies = this[kHeadersList].cookies; + for (let i = 0;i < names.length; ++i) { + const [name, value] = names[i]; + if (name === "set-cookie") { + for (let j = 0;j < cookies.length; ++j) { + headers.push([name, cookies[j]]); + } + } else { + assert(value !== null); + headers.push([name, value]); + } + } + this[kHeadersList][kHeadersSortedMap] = headers; + return headers; + } + keys() { + webidl.brandCheck(this, Headers2); + if (this[kGuard] === "immutable") { + const value = this[kHeadersSortedMap]; + return makeIterator(() => value, "Headers", "key"); + } + return makeIterator(() => [...this[kHeadersSortedMap].values()], "Headers", "key"); + } + values() { + webidl.brandCheck(this, Headers2); + if (this[kGuard] === "immutable") { + const value = this[kHeadersSortedMap]; + return makeIterator(() => value, "Headers", "value"); + } + return makeIterator(() => [...this[kHeadersSortedMap].values()], "Headers", "value"); + } + entries() { + webidl.brandCheck(this, Headers2); + if (this[kGuard] === "immutable") { + const value = this[kHeadersSortedMap]; + return makeIterator(() => value, "Headers", "key+value"); + } + return makeIterator(() => [...this[kHeadersSortedMap].values()], "Headers", "key+value"); + } + forEach(callbackFn, thisArg = globalThis) { + webidl.brandCheck(this, Headers2); + webidl.argumentLengthCheck(arguments, 1, { header: "Headers.forEach" }); + if (typeof callbackFn !== "function") { + throw new TypeError("Failed to execute 'forEach' on 'Headers': parameter 1 is not of type 'Function'."); + } + for (const [key, value] of this) { + callbackFn.apply(thisArg, [value, key, this]); + } + } + [Symbol.for("nodejs.util.inspect.custom")]() { + webidl.brandCheck(this, Headers2); + return this[kHeadersList]; + } + } + Headers2.prototype[Symbol.iterator] = Headers2.prototype.entries; + Object.defineProperties(Headers2.prototype, { + append: kEnumerableProperty, + delete: kEnumerableProperty, + get: kEnumerableProperty, + has: kEnumerableProperty, + set: kEnumerableProperty, + getSetCookie: kEnumerableProperty, + keys: kEnumerableProperty, + values: kEnumerableProperty, + entries: kEnumerableProperty, + forEach: kEnumerableProperty, + [Symbol.iterator]: { enumerable: false }, + [Symbol.toStringTag]: { + value: "Headers", + configurable: true + } + }); + webidl.converters.HeadersInit = function(V) { + if (webidl.util.Type(V) === "Object") { + if (V[Symbol.iterator]) { + return webidl.converters["sequence>"](V); + } + return webidl.converters["record"](V); + } + throw webidl.errors.conversionFailed({ + prefix: "Headers constructor", + argument: "Argument 1", + types: ["sequence>", "record"] + }); + }; + module2.exports = { + fill, + Headers: Headers2, + HeadersList + }; +}); + +// node_modules/undici/lib/fetch/response.js +var require_response = __commonJS((exports2, module2) => { + var { Headers: Headers2, HeadersList, fill } = require_headers(); + var { extractBody, cloneBody, mixinBody } = require_body(); + var util = require_util(); + var { kEnumerableProperty } = util; + var { + isValidReasonPhrase, + isCancelled, + isAborted, + isBlobLike, + serializeJavascriptValueToJSONString, + isErrorLike, + isomorphicEncode + } = require_util2(); + var { + redirectStatusSet, + nullBodyStatus, + DOMException: DOMException2 + } = require_constants2(); + var { kState, kHeaders, kGuard, kRealm } = require_symbols2(); + var { webidl } = require_webidl(); + var { FormData: FormData2 } = require_formdata(); + var { getGlobalOrigin } = require_global(); + var { URLSerializer } = require_dataURL(); + var { kHeadersList, kConstruct } = require_symbols(); + var assert = require("assert"); + var { types } = require("util"); + var ReadableStream2 = globalThis.ReadableStream || require("stream/web").ReadableStream; + var textEncoder = new TextEncoder("utf-8"); + + class Response { + static error() { + const relevantRealm = { settingsObject: {} }; + const responseObject = new Response; + responseObject[kState] = makeNetworkError(); + responseObject[kRealm] = relevantRealm; + responseObject[kHeaders][kHeadersList] = responseObject[kState].headersList; + responseObject[kHeaders][kGuard] = "immutable"; + responseObject[kHeaders][kRealm] = relevantRealm; + return responseObject; + } + static json(data, init = {}) { + webidl.argumentLengthCheck(arguments, 1, { header: "Response.json" }); + if (init !== null) { + init = webidl.converters.ResponseInit(init); + } + const bytes = textEncoder.encode(serializeJavascriptValueToJSONString(data)); + const body = extractBody(bytes); + const relevantRealm = { settingsObject: {} }; + const responseObject = new Response; + responseObject[kRealm] = relevantRealm; + responseObject[kHeaders][kGuard] = "response"; + responseObject[kHeaders][kRealm] = relevantRealm; + initializeResponse(responseObject, init, { body: body[0], type: "application/json" }); + return responseObject; + } + static redirect(url, status = 302) { + const relevantRealm = { settingsObject: {} }; + webidl.argumentLengthCheck(arguments, 1, { header: "Response.redirect" }); + url = webidl.converters.USVString(url); + status = webidl.converters["unsigned short"](status); + let parsedURL; + try { + parsedURL = new URL(url, getGlobalOrigin()); + } catch (err) { + throw Object.assign(new TypeError("Failed to parse URL from " + url), { + cause: err + }); + } + if (!redirectStatusSet.has(status)) { + throw new RangeError("Invalid status code " + status); + } + const responseObject = new Response; + responseObject[kRealm] = relevantRealm; + responseObject[kHeaders][kGuard] = "immutable"; + responseObject[kHeaders][kRealm] = relevantRealm; + responseObject[kState].status = status; + const value = isomorphicEncode(URLSerializer(parsedURL)); + responseObject[kState].headersList.append("location", value); + return responseObject; + } + constructor(body = null, init = {}) { + if (body !== null) { + body = webidl.converters.BodyInit(body); + } + init = webidl.converters.ResponseInit(init); + this[kRealm] = { settingsObject: {} }; + this[kState] = makeResponse({}); + this[kHeaders] = new Headers2(kConstruct); + this[kHeaders][kGuard] = "response"; + this[kHeaders][kHeadersList] = this[kState].headersList; + this[kHeaders][kRealm] = this[kRealm]; + let bodyWithType = null; + if (body != null) { + const [extractedBody, type] = extractBody(body); + bodyWithType = { body: extractedBody, type }; + } + initializeResponse(this, init, bodyWithType); + } + get type() { + webidl.brandCheck(this, Response); + return this[kState].type; + } + get url() { + webidl.brandCheck(this, Response); + const urlList = this[kState].urlList; + const url = urlList[urlList.length - 1] ?? null; + if (url === null) { + return ""; + } + return URLSerializer(url, true); + } + get redirected() { + webidl.brandCheck(this, Response); + return this[kState].urlList.length > 1; + } + get status() { + webidl.brandCheck(this, Response); + return this[kState].status; + } + get ok() { + webidl.brandCheck(this, Response); + return this[kState].status >= 200 && this[kState].status <= 299; + } + get statusText() { + webidl.brandCheck(this, Response); + return this[kState].statusText; + } + get headers() { + webidl.brandCheck(this, Response); + return this[kHeaders]; + } + get body() { + webidl.brandCheck(this, Response); + return this[kState].body ? this[kState].body.stream : null; + } + get bodyUsed() { + webidl.brandCheck(this, Response); + return !!this[kState].body && util.isDisturbed(this[kState].body.stream); + } + clone() { + webidl.brandCheck(this, Response); + if (this.bodyUsed || this.body && this.body.locked) { + throw webidl.errors.exception({ + header: "Response.clone", + message: "Body has already been consumed." + }); + } + const clonedResponse = cloneResponse(this[kState]); + const clonedResponseObject = new Response; + clonedResponseObject[kState] = clonedResponse; + clonedResponseObject[kRealm] = this[kRealm]; + clonedResponseObject[kHeaders][kHeadersList] = clonedResponse.headersList; + clonedResponseObject[kHeaders][kGuard] = this[kHeaders][kGuard]; + clonedResponseObject[kHeaders][kRealm] = this[kHeaders][kRealm]; + return clonedResponseObject; + } + } + mixinBody(Response); + Object.defineProperties(Response.prototype, { + type: kEnumerableProperty, + url: kEnumerableProperty, + status: kEnumerableProperty, + ok: kEnumerableProperty, + redirected: kEnumerableProperty, + statusText: kEnumerableProperty, + headers: kEnumerableProperty, + clone: kEnumerableProperty, + body: kEnumerableProperty, + bodyUsed: kEnumerableProperty, + [Symbol.toStringTag]: { + value: "Response", + configurable: true + } + }); + Object.defineProperties(Response, { + json: kEnumerableProperty, + redirect: kEnumerableProperty, + error: kEnumerableProperty + }); + function cloneResponse(response) { + if (response.internalResponse) { + return filterResponse(cloneResponse(response.internalResponse), response.type); + } + const newResponse = makeResponse({ ...response, body: null }); + if (response.body != null) { + newResponse.body = cloneBody(response.body); + } + return newResponse; + } + function makeResponse(init) { + return { + aborted: false, + rangeRequested: false, + timingAllowPassed: false, + requestIncludesCredentials: false, + type: "default", + status: 200, + timingInfo: null, + cacheState: "", + statusText: "", + ...init, + headersList: init.headersList ? new HeadersList(init.headersList) : new HeadersList, + urlList: init.urlList ? [...init.urlList] : [] + }; + } + function makeNetworkError(reason) { + const isError = isErrorLike(reason); + return makeResponse({ + type: "error", + status: 0, + error: isError ? reason : new Error(reason ? String(reason) : reason), + aborted: reason && reason.name === "AbortError" + }); + } + function makeFilteredResponse(response, state) { + state = { + internalResponse: response, + ...state + }; + return new Proxy(response, { + get(target, p) { + return p in state ? state[p] : target[p]; + }, + set(target, p, value) { + assert(!(p in state)); + target[p] = value; + return true; + } + }); + } + function filterResponse(response, type) { + if (type === "basic") { + return makeFilteredResponse(response, { + type: "basic", + headersList: response.headersList + }); + } else if (type === "cors") { + return makeFilteredResponse(response, { + type: "cors", + headersList: response.headersList + }); + } else if (type === "opaque") { + return makeFilteredResponse(response, { + type: "opaque", + urlList: Object.freeze([]), + status: 0, + statusText: "", + body: null + }); + } else if (type === "opaqueredirect") { + return makeFilteredResponse(response, { + type: "opaqueredirect", + status: 0, + statusText: "", + headersList: [], + body: null + }); + } else { + assert(false); + } + } + function makeAppropriateNetworkError(fetchParams, err = null) { + assert(isCancelled(fetchParams)); + return isAborted(fetchParams) ? makeNetworkError(Object.assign(new DOMException2("The operation was aborted.", "AbortError"), { cause: err })) : makeNetworkError(Object.assign(new DOMException2("Request was cancelled."), { cause: err })); + } + function initializeResponse(response, init, body) { + if (init.status !== null && (init.status < 200 || init.status > 599)) { + throw new RangeError('init["status"] must be in the range of 200 to 599, inclusive.'); + } + if ("statusText" in init && init.statusText != null) { + if (!isValidReasonPhrase(String(init.statusText))) { + throw new TypeError("Invalid statusText"); + } + } + if ("status" in init && init.status != null) { + response[kState].status = init.status; + } + if ("statusText" in init && init.statusText != null) { + response[kState].statusText = init.statusText; + } + if ("headers" in init && init.headers != null) { + fill(response[kHeaders], init.headers); + } + if (body) { + if (nullBodyStatus.includes(response.status)) { + throw webidl.errors.exception({ + header: "Response constructor", + message: "Invalid response status code " + response.status + }); + } + response[kState].body = body.body; + if (body.type != null && !response[kState].headersList.contains("Content-Type")) { + response[kState].headersList.append("content-type", body.type); + } + } + } + webidl.converters.ReadableStream = webidl.interfaceConverter(ReadableStream2); + webidl.converters.FormData = webidl.interfaceConverter(FormData2); + webidl.converters.URLSearchParams = webidl.interfaceConverter(URLSearchParams); + webidl.converters.XMLHttpRequestBodyInit = function(V) { + if (typeof V === "string") { + return webidl.converters.USVString(V); + } + if (isBlobLike(V)) { + return webidl.converters.Blob(V, { strict: false }); + } + if (types.isArrayBuffer(V) || types.isTypedArray(V) || types.isDataView(V)) { + return webidl.converters.BufferSource(V); + } + if (util.isFormDataLike(V)) { + return webidl.converters.FormData(V, { strict: false }); + } + if (V instanceof URLSearchParams) { + return webidl.converters.URLSearchParams(V); + } + return webidl.converters.DOMString(V); + }; + webidl.converters.BodyInit = function(V) { + if (V instanceof ReadableStream2) { + return webidl.converters.ReadableStream(V); + } + if (V?.[Symbol.asyncIterator]) { + return V; + } + return webidl.converters.XMLHttpRequestBodyInit(V); + }; + webidl.converters.ResponseInit = webidl.dictionaryConverter([ + { + key: "status", + converter: webidl.converters["unsigned short"], + defaultValue: 200 + }, + { + key: "statusText", + converter: webidl.converters.ByteString, + defaultValue: "" + }, + { + key: "headers", + converter: webidl.converters.HeadersInit + } + ]); + module2.exports = { + makeNetworkError, + makeResponse, + makeAppropriateNetworkError, + filterResponse, + Response, + cloneResponse + }; +}); + +// node_modules/undici/lib/fetch/request.js +var require_request2 = __commonJS((exports2, module2) => { + var { extractBody, mixinBody, cloneBody } = require_body(); + var { Headers: Headers2, fill: fillHeaders, HeadersList } = require_headers(); + var { FinalizationRegistry } = require_dispatcher_weakref()(); + var util = require_util(); + var { + isValidHTTPToken, + sameOrigin, + normalizeMethod, + makePolicyContainer, + normalizeMethodRecord + } = require_util2(); + var { + forbiddenMethodsSet, + corsSafeListedMethodsSet, + referrerPolicy, + requestRedirect, + requestMode, + requestCredentials, + requestCache, + requestDuplex + } = require_constants2(); + var { kEnumerableProperty } = util; + var { kHeaders, kSignal, kState, kGuard, kRealm } = require_symbols2(); + var { webidl } = require_webidl(); + var { getGlobalOrigin } = require_global(); + var { URLSerializer } = require_dataURL(); + var { kHeadersList, kConstruct } = require_symbols(); + var assert = require("assert"); + var { getMaxListeners, setMaxListeners, getEventListeners, defaultMaxListeners } = require("events"); + var TransformStream = globalThis.TransformStream; + var kAbortController = Symbol("abortController"); + var requestFinalizer = new FinalizationRegistry(({ signal, abort }) => { + signal.removeEventListener("abort", abort); + }); + + class Request { + constructor(input, init = {}) { + if (input === kConstruct) { + return; + } + webidl.argumentLengthCheck(arguments, 1, { header: "Request constructor" }); + input = webidl.converters.RequestInfo(input); + init = webidl.converters.RequestInit(init); + this[kRealm] = { + settingsObject: { + baseUrl: getGlobalOrigin(), + get origin() { + return this.baseUrl?.origin; + }, + policyContainer: makePolicyContainer() + } + }; + let request = null; + let fallbackMode = null; + const baseUrl = this[kRealm].settingsObject.baseUrl; + let signal = null; + if (typeof input === "string") { + let parsedURL; + try { + parsedURL = new URL(input, baseUrl); + } catch (err) { + throw new TypeError("Failed to parse URL from " + input, { cause: err }); + } + if (parsedURL.username || parsedURL.password) { + throw new TypeError("Request cannot be constructed from a URL that includes credentials: " + input); + } + request = makeRequest({ urlList: [parsedURL] }); + fallbackMode = "cors"; + } else { + assert(input instanceof Request); + request = input[kState]; + signal = input[kSignal]; + } + const origin = this[kRealm].settingsObject.origin; + let window2 = "client"; + if (request.window?.constructor?.name === "EnvironmentSettingsObject" && sameOrigin(request.window, origin)) { + window2 = request.window; + } + if (init.window != null) { + throw new TypeError(`'window' option '${window2}' must be null`); + } + if ("window" in init) { + window2 = "no-window"; + } + request = makeRequest({ + method: request.method, + headersList: request.headersList, + unsafeRequest: request.unsafeRequest, + client: this[kRealm].settingsObject, + window: window2, + priority: request.priority, + origin: request.origin, + referrer: request.referrer, + referrerPolicy: request.referrerPolicy, + mode: request.mode, + credentials: request.credentials, + cache: request.cache, + redirect: request.redirect, + integrity: request.integrity, + keepalive: request.keepalive, + reloadNavigation: request.reloadNavigation, + historyNavigation: request.historyNavigation, + urlList: [...request.urlList] + }); + const initHasKey = Object.keys(init).length !== 0; + if (initHasKey) { + if (request.mode === "navigate") { + request.mode = "same-origin"; + } + request.reloadNavigation = false; + request.historyNavigation = false; + request.origin = "client"; + request.referrer = "client"; + request.referrerPolicy = ""; + request.url = request.urlList[request.urlList.length - 1]; + request.urlList = [request.url]; + } + if (init.referrer !== undefined) { + const referrer = init.referrer; + if (referrer === "") { + request.referrer = "no-referrer"; + } else { + let parsedReferrer; + try { + parsedReferrer = new URL(referrer, baseUrl); + } catch (err) { + throw new TypeError(`Referrer "${referrer}" is not a valid URL.`, { cause: err }); + } + if (parsedReferrer.protocol === "about:" && parsedReferrer.hostname === "client" || origin && !sameOrigin(parsedReferrer, this[kRealm].settingsObject.baseUrl)) { + request.referrer = "client"; + } else { + request.referrer = parsedReferrer; + } + } + } + if (init.referrerPolicy !== undefined) { + request.referrerPolicy = init.referrerPolicy; + } + let mode; + if (init.mode !== undefined) { + mode = init.mode; + } else { + mode = fallbackMode; + } + if (mode === "navigate") { + throw webidl.errors.exception({ + header: "Request constructor", + message: "invalid request mode navigate." + }); + } + if (mode != null) { + request.mode = mode; + } + if (init.credentials !== undefined) { + request.credentials = init.credentials; + } + if (init.cache !== undefined) { + request.cache = init.cache; + } + if (request.cache === "only-if-cached" && request.mode !== "same-origin") { + throw new TypeError("'only-if-cached' can be set only with 'same-origin' mode"); + } + if (init.redirect !== undefined) { + request.redirect = init.redirect; + } + if (init.integrity != null) { + request.integrity = String(init.integrity); + } + if (init.keepalive !== undefined) { + request.keepalive = Boolean(init.keepalive); + } + if (init.method !== undefined) { + let method = init.method; + if (!isValidHTTPToken(method)) { + throw new TypeError(`'${method}' is not a valid HTTP method.`); + } + if (forbiddenMethodsSet.has(method.toUpperCase())) { + throw new TypeError(`'${method}' HTTP method is unsupported.`); + } + method = normalizeMethodRecord[method] ?? normalizeMethod(method); + request.method = method; + } + if (init.signal !== undefined) { + signal = init.signal; + } + this[kState] = request; + const ac = new AbortController; + this[kSignal] = ac.signal; + this[kSignal][kRealm] = this[kRealm]; + if (signal != null) { + if (!signal || typeof signal.aborted !== "boolean" || typeof signal.addEventListener !== "function") { + throw new TypeError("Failed to construct 'Request': member signal is not of type AbortSignal."); + } + if (signal.aborted) { + ac.abort(signal.reason); + } else { + this[kAbortController] = ac; + const acRef = new WeakRef(ac); + const abort = function() { + const ac2 = acRef.deref(); + if (ac2 !== undefined) { + ac2.abort(this.reason); + } + }; + try { + if (typeof getMaxListeners === "function" && getMaxListeners(signal) === defaultMaxListeners) { + setMaxListeners(100, signal); + } else if (getEventListeners(signal, "abort").length >= defaultMaxListeners) { + setMaxListeners(100, signal); + } + } catch { + } + util.addAbortListener(signal, abort); + requestFinalizer.register(ac, { signal, abort }); + } + } + this[kHeaders] = new Headers2(kConstruct); + this[kHeaders][kHeadersList] = request.headersList; + this[kHeaders][kGuard] = "request"; + this[kHeaders][kRealm] = this[kRealm]; + if (mode === "no-cors") { + if (!corsSafeListedMethodsSet.has(request.method)) { + throw new TypeError(`'${request.method} is unsupported in no-cors mode.`); + } + this[kHeaders][kGuard] = "request-no-cors"; + } + if (initHasKey) { + const headersList = this[kHeaders][kHeadersList]; + const headers = init.headers !== undefined ? init.headers : new HeadersList(headersList); + headersList.clear(); + if (headers instanceof HeadersList) { + for (const [key, val2] of headers) { + headersList.append(key, val2); + } + headersList.cookies = headers.cookies; + } else { + fillHeaders(this[kHeaders], headers); + } + } + const inputBody = input instanceof Request ? input[kState].body : null; + if ((init.body != null || inputBody != null) && (request.method === "GET" || request.method === "HEAD")) { + throw new TypeError("Request with GET/HEAD method cannot have body."); + } + let initBody = null; + if (init.body != null) { + const [extractedBody, contentType] = extractBody(init.body, request.keepalive); + initBody = extractedBody; + if (contentType && !this[kHeaders][kHeadersList].contains("content-type")) { + this[kHeaders].append("content-type", contentType); + } + } + const inputOrInitBody = initBody ?? inputBody; + if (inputOrInitBody != null && inputOrInitBody.source == null) { + if (initBody != null && init.duplex == null) { + throw new TypeError("RequestInit: duplex option is required when sending a body."); + } + if (request.mode !== "same-origin" && request.mode !== "cors") { + throw new TypeError('If request is made from ReadableStream, mode should be "same-origin" or "cors"'); + } + request.useCORSPreflightFlag = true; + } + let finalBody = inputOrInitBody; + if (initBody == null && inputBody != null) { + if (util.isDisturbed(inputBody.stream) || inputBody.stream.locked) { + throw new TypeError("Cannot construct a Request with a Request object that has already been used."); + } + if (!TransformStream) { + TransformStream = require("stream/web").TransformStream; + } + const identityTransform = new TransformStream; + inputBody.stream.pipeThrough(identityTransform); + finalBody = { + source: inputBody.source, + length: inputBody.length, + stream: identityTransform.readable + }; + } + this[kState].body = finalBody; + } + get method() { + webidl.brandCheck(this, Request); + return this[kState].method; + } + get url() { + webidl.brandCheck(this, Request); + return URLSerializer(this[kState].url); + } + get headers() { + webidl.brandCheck(this, Request); + return this[kHeaders]; + } + get destination() { + webidl.brandCheck(this, Request); + return this[kState].destination; + } + get referrer() { + webidl.brandCheck(this, Request); + if (this[kState].referrer === "no-referrer") { + return ""; + } + if (this[kState].referrer === "client") { + return "about:client"; + } + return this[kState].referrer.toString(); + } + get referrerPolicy() { + webidl.brandCheck(this, Request); + return this[kState].referrerPolicy; + } + get mode() { + webidl.brandCheck(this, Request); + return this[kState].mode; + } + get credentials() { + return this[kState].credentials; + } + get cache() { + webidl.brandCheck(this, Request); + return this[kState].cache; + } + get redirect() { + webidl.brandCheck(this, Request); + return this[kState].redirect; + } + get integrity() { + webidl.brandCheck(this, Request); + return this[kState].integrity; + } + get keepalive() { + webidl.brandCheck(this, Request); + return this[kState].keepalive; + } + get isReloadNavigation() { + webidl.brandCheck(this, Request); + return this[kState].reloadNavigation; + } + get isHistoryNavigation() { + webidl.brandCheck(this, Request); + return this[kState].historyNavigation; + } + get signal() { + webidl.brandCheck(this, Request); + return this[kSignal]; + } + get body() { + webidl.brandCheck(this, Request); + return this[kState].body ? this[kState].body.stream : null; + } + get bodyUsed() { + webidl.brandCheck(this, Request); + return !!this[kState].body && util.isDisturbed(this[kState].body.stream); + } + get duplex() { + webidl.brandCheck(this, Request); + return "half"; + } + clone() { + webidl.brandCheck(this, Request); + if (this.bodyUsed || this.body?.locked) { + throw new TypeError("unusable"); + } + const clonedRequest = cloneRequest(this[kState]); + const clonedRequestObject = new Request(kConstruct); + clonedRequestObject[kState] = clonedRequest; + clonedRequestObject[kRealm] = this[kRealm]; + clonedRequestObject[kHeaders] = new Headers2(kConstruct); + clonedRequestObject[kHeaders][kHeadersList] = clonedRequest.headersList; + clonedRequestObject[kHeaders][kGuard] = this[kHeaders][kGuard]; + clonedRequestObject[kHeaders][kRealm] = this[kHeaders][kRealm]; + const ac = new AbortController; + if (this.signal.aborted) { + ac.abort(this.signal.reason); + } else { + util.addAbortListener(this.signal, () => { + ac.abort(this.signal.reason); + }); + } + clonedRequestObject[kSignal] = ac.signal; + return clonedRequestObject; + } + } + mixinBody(Request); + function makeRequest(init) { + const request = { + method: "GET", + localURLsOnly: false, + unsafeRequest: false, + body: null, + client: null, + reservedClient: null, + replacesClientId: "", + window: "client", + keepalive: false, + serviceWorkers: "all", + initiator: "", + destination: "", + priority: null, + origin: "client", + policyContainer: "client", + referrer: "client", + referrerPolicy: "", + mode: "no-cors", + useCORSPreflightFlag: false, + credentials: "same-origin", + useCredentials: false, + cache: "default", + redirect: "follow", + integrity: "", + cryptoGraphicsNonceMetadata: "", + parserMetadata: "", + reloadNavigation: false, + historyNavigation: false, + userActivation: false, + taintedOrigin: false, + redirectCount: 0, + responseTainting: "basic", + preventNoCacheCacheControlHeaderModification: false, + done: false, + timingAllowFailed: false, + ...init, + headersList: init.headersList ? new HeadersList(init.headersList) : new HeadersList + }; + request.url = request.urlList[0]; + return request; + } + function cloneRequest(request) { + const newRequest = makeRequest({ ...request, body: null }); + if (request.body != null) { + newRequest.body = cloneBody(request.body); + } + return newRequest; + } + Object.defineProperties(Request.prototype, { + method: kEnumerableProperty, + url: kEnumerableProperty, + headers: kEnumerableProperty, + redirect: kEnumerableProperty, + clone: kEnumerableProperty, + signal: kEnumerableProperty, + duplex: kEnumerableProperty, + destination: kEnumerableProperty, + body: kEnumerableProperty, + bodyUsed: kEnumerableProperty, + isHistoryNavigation: kEnumerableProperty, + isReloadNavigation: kEnumerableProperty, + keepalive: kEnumerableProperty, + integrity: kEnumerableProperty, + cache: kEnumerableProperty, + credentials: kEnumerableProperty, + attribute: kEnumerableProperty, + referrerPolicy: kEnumerableProperty, + referrer: kEnumerableProperty, + mode: kEnumerableProperty, + [Symbol.toStringTag]: { + value: "Request", + configurable: true + } + }); + webidl.converters.Request = webidl.interfaceConverter(Request); + webidl.converters.RequestInfo = function(V) { + if (typeof V === "string") { + return webidl.converters.USVString(V); + } + if (V instanceof Request) { + return webidl.converters.Request(V); + } + return webidl.converters.USVString(V); + }; + webidl.converters.AbortSignal = webidl.interfaceConverter(AbortSignal); + webidl.converters.RequestInit = webidl.dictionaryConverter([ + { + key: "method", + converter: webidl.converters.ByteString + }, + { + key: "headers", + converter: webidl.converters.HeadersInit + }, + { + key: "body", + converter: webidl.nullableConverter(webidl.converters.BodyInit) + }, + { + key: "referrer", + converter: webidl.converters.USVString + }, + { + key: "referrerPolicy", + converter: webidl.converters.DOMString, + allowedValues: referrerPolicy + }, + { + key: "mode", + converter: webidl.converters.DOMString, + allowedValues: requestMode + }, + { + key: "credentials", + converter: webidl.converters.DOMString, + allowedValues: requestCredentials + }, + { + key: "cache", + converter: webidl.converters.DOMString, + allowedValues: requestCache + }, + { + key: "redirect", + converter: webidl.converters.DOMString, + allowedValues: requestRedirect + }, + { + key: "integrity", + converter: webidl.converters.DOMString + }, + { + key: "keepalive", + converter: webidl.converters.boolean + }, + { + key: "signal", + converter: webidl.nullableConverter((signal) => webidl.converters.AbortSignal(signal, { strict: false })) + }, + { + key: "window", + converter: webidl.converters.any + }, + { + key: "duplex", + converter: webidl.converters.DOMString, + allowedValues: requestDuplex + } + ]); + module2.exports = { Request, makeRequest }; +}); + +// node_modules/undici/lib/fetch/index.js +var require_fetch = __commonJS((exports2, module2) => { + var { + Response, + makeNetworkError, + makeAppropriateNetworkError, + filterResponse, + makeResponse + } = require_response(); + var { Headers: Headers2 } = require_headers(); + var { Request, makeRequest } = require_request2(); + var zlib = require("zlib"); + var { + bytesMatch, + makePolicyContainer, + clonePolicyContainer, + requestBadPort, + TAOCheck, + appendRequestOriginHeader, + responseLocationURL, + requestCurrentURL, + setRequestReferrerPolicyOnRedirect, + tryUpgradeRequestToAPotentiallyTrustworthyURL, + createOpaqueTimingInfo, + appendFetchMetadata, + corsCheck, + crossOriginResourcePolicyCheck, + determineRequestsReferrer, + coarsenedSharedCurrentTime, + createDeferredPromise, + isBlobLike, + sameOrigin, + isCancelled, + isAborted, + isErrorLike, + fullyReadBody, + readableStreamClose, + isomorphicEncode, + urlIsLocal, + urlIsHttpHttpsScheme, + urlHasHttpsScheme + } = require_util2(); + var { kState, kHeaders, kGuard, kRealm } = require_symbols2(); + var assert = require("assert"); + var { safelyExtractBody } = require_body(); + var { + redirectStatusSet, + nullBodyStatus, + safeMethodsSet, + requestBodyHeader, + subresourceSet, + DOMException: DOMException2 + } = require_constants2(); + var { kHeadersList } = require_symbols(); + var EE = require("events"); + var { Readable, pipeline } = require("stream"); + var { addAbortListener, isErrored, isReadable, nodeMajor, nodeMinor } = require_util(); + var { dataURLProcessor, serializeAMimeType } = require_dataURL(); + var { TransformStream } = require("stream/web"); + var { getGlobalDispatcher } = require_global2(); + var { webidl } = require_webidl(); + var { STATUS_CODES } = require("http"); + var GET_OR_HEAD = ["GET", "HEAD"]; + var resolveObjectURL; + var ReadableStream2 = globalThis.ReadableStream; + + class Fetch extends EE { + constructor(dispatcher) { + super(); + this.dispatcher = dispatcher; + this.connection = null; + this.dump = false; + this.state = "ongoing"; + this.setMaxListeners(21); + } + terminate(reason) { + if (this.state !== "ongoing") { + return; + } + this.state = "terminated"; + this.connection?.destroy(reason); + this.emit("terminated", reason); + } + abort(error) { + if (this.state !== "ongoing") { + return; + } + this.state = "aborted"; + if (!error) { + error = new DOMException2("The operation was aborted.", "AbortError"); + } + this.serializedAbortReason = error; + this.connection?.destroy(error); + this.emit("terminated", error); + } + } + function fetch2(input, init = {}) { + webidl.argumentLengthCheck(arguments, 1, { header: "globalThis.fetch" }); + const p = createDeferredPromise(); + let requestObject; + try { + requestObject = new Request(input, init); + } catch (e) { + p.reject(e); + return p.promise; + } + const request = requestObject[kState]; + if (requestObject.signal.aborted) { + abortFetch(p, request, null, requestObject.signal.reason); + return p.promise; + } + const globalObject = request.client.globalObject; + if (globalObject?.constructor?.name === "ServiceWorkerGlobalScope") { + request.serviceWorkers = "none"; + } + let responseObject = null; + const relevantRealm = null; + let locallyAborted = false; + let controller = null; + addAbortListener(requestObject.signal, () => { + locallyAborted = true; + assert(controller != null); + controller.abort(requestObject.signal.reason); + abortFetch(p, request, responseObject, requestObject.signal.reason); + }); + const handleFetchDone = (response) => finalizeAndReportTiming(response, "fetch"); + const processResponse = (response) => { + if (locallyAborted) { + return Promise.resolve(); + } + if (response.aborted) { + abortFetch(p, request, responseObject, controller.serializedAbortReason); + return Promise.resolve(); + } + if (response.type === "error") { + p.reject(Object.assign(new TypeError("fetch failed"), { cause: response.error })); + return Promise.resolve(); + } + responseObject = new Response; + responseObject[kState] = response; + responseObject[kRealm] = relevantRealm; + responseObject[kHeaders][kHeadersList] = response.headersList; + responseObject[kHeaders][kGuard] = "immutable"; + responseObject[kHeaders][kRealm] = relevantRealm; + p.resolve(responseObject); + }; + controller = fetching({ + request, + processResponseEndOfBody: handleFetchDone, + processResponse, + dispatcher: init.dispatcher ?? getGlobalDispatcher() + }); + return p.promise; + } + function finalizeAndReportTiming(response, initiatorType = "other") { + if (response.type === "error" && response.aborted) { + return; + } + if (!response.urlList?.length) { + return; + } + const originalURL = response.urlList[0]; + let timingInfo = response.timingInfo; + let cacheState = response.cacheState; + if (!urlIsHttpHttpsScheme(originalURL)) { + return; + } + if (timingInfo === null) { + return; + } + if (!response.timingAllowPassed) { + timingInfo = createOpaqueTimingInfo({ + startTime: timingInfo.startTime + }); + cacheState = ""; + } + timingInfo.endTime = coarsenedSharedCurrentTime(); + response.timingInfo = timingInfo; + markResourceTiming(timingInfo, originalURL, initiatorType, globalThis, cacheState); + } + function markResourceTiming(timingInfo, originalURL, initiatorType, globalThis2, cacheState) { + if (nodeMajor > 18 || nodeMajor === 18 && nodeMinor >= 2) { + performance.markResourceTiming(timingInfo, originalURL.href, initiatorType, globalThis2, cacheState); + } + } + function abortFetch(p, request, responseObject, error) { + if (!error) { + error = new DOMException2("The operation was aborted.", "AbortError"); + } + p.reject(error); + if (request.body != null && isReadable(request.body?.stream)) { + request.body.stream.cancel(error).catch((err) => { + if (err.code === "ERR_INVALID_STATE") { + return; + } + throw err; + }); + } + if (responseObject == null) { + return; + } + const response = responseObject[kState]; + if (response.body != null && isReadable(response.body?.stream)) { + response.body.stream.cancel(error).catch((err) => { + if (err.code === "ERR_INVALID_STATE") { + return; + } + throw err; + }); + } + } + function fetching({ + request, + processRequestBodyChunkLength, + processRequestEndOfBody, + processResponse, + processResponseEndOfBody, + processResponseConsumeBody, + useParallelQueue = false, + dispatcher + }) { + let taskDestination = null; + let crossOriginIsolatedCapability = false; + if (request.client != null) { + taskDestination = request.client.globalObject; + crossOriginIsolatedCapability = request.client.crossOriginIsolatedCapability; + } + const currenTime = coarsenedSharedCurrentTime(crossOriginIsolatedCapability); + const timingInfo = createOpaqueTimingInfo({ + startTime: currenTime + }); + const fetchParams = { + controller: new Fetch(dispatcher), + request, + timingInfo, + processRequestBodyChunkLength, + processRequestEndOfBody, + processResponse, + processResponseConsumeBody, + processResponseEndOfBody, + taskDestination, + crossOriginIsolatedCapability + }; + assert(!request.body || request.body.stream); + if (request.window === "client") { + request.window = request.client?.globalObject?.constructor?.name === "Window" ? request.client : "no-window"; + } + if (request.origin === "client") { + request.origin = request.client?.origin; + } + if (request.policyContainer === "client") { + if (request.client != null) { + request.policyContainer = clonePolicyContainer(request.client.policyContainer); + } else { + request.policyContainer = makePolicyContainer(); + } + } + if (!request.headersList.contains("accept")) { + const value = "*/*"; + request.headersList.append("accept", value); + } + if (!request.headersList.contains("accept-language")) { + request.headersList.append("accept-language", "*"); + } + if (request.priority === null) { + } + if (subresourceSet.has(request.destination)) { + } + mainFetch(fetchParams).catch((err) => { + fetchParams.controller.terminate(err); + }); + return fetchParams.controller; + } + async function mainFetch(fetchParams, recursive = false) { + const request = fetchParams.request; + let response = null; + if (request.localURLsOnly && !urlIsLocal(requestCurrentURL(request))) { + response = makeNetworkError("local URLs only"); + } + tryUpgradeRequestToAPotentiallyTrustworthyURL(request); + if (requestBadPort(request) === "blocked") { + response = makeNetworkError("bad port"); + } + if (request.referrerPolicy === "") { + request.referrerPolicy = request.policyContainer.referrerPolicy; + } + if (request.referrer !== "no-referrer") { + request.referrer = determineRequestsReferrer(request); + } + if (response === null) { + response = await (async () => { + const currentURL = requestCurrentURL(request); + if (sameOrigin(currentURL, request.url) && request.responseTainting === "basic" || currentURL.protocol === "data:" || (request.mode === "navigate" || request.mode === "websocket")) { + request.responseTainting = "basic"; + return await schemeFetch(fetchParams); + } + if (request.mode === "same-origin") { + return makeNetworkError('request mode cannot be "same-origin"'); + } + if (request.mode === "no-cors") { + if (request.redirect !== "follow") { + return makeNetworkError('redirect mode cannot be "follow" for "no-cors" request'); + } + request.responseTainting = "opaque"; + return await schemeFetch(fetchParams); + } + if (!urlIsHttpHttpsScheme(requestCurrentURL(request))) { + return makeNetworkError("URL scheme must be a HTTP(S) scheme"); + } + request.responseTainting = "cors"; + return await httpFetch(fetchParams); + })(); + } + if (recursive) { + return response; + } + if (response.status !== 0 && !response.internalResponse) { + if (request.responseTainting === "cors") { + } + if (request.responseTainting === "basic") { + response = filterResponse(response, "basic"); + } else if (request.responseTainting === "cors") { + response = filterResponse(response, "cors"); + } else if (request.responseTainting === "opaque") { + response = filterResponse(response, "opaque"); + } else { + assert(false); + } + } + let internalResponse = response.status === 0 ? response : response.internalResponse; + if (internalResponse.urlList.length === 0) { + internalResponse.urlList.push(...request.urlList); + } + if (!request.timingAllowFailed) { + response.timingAllowPassed = true; + } + if (response.type === "opaque" && internalResponse.status === 206 && internalResponse.rangeRequested && !request.headers.contains("range")) { + response = internalResponse = makeNetworkError(); + } + if (response.status !== 0 && (request.method === "HEAD" || request.method === "CONNECT" || nullBodyStatus.includes(internalResponse.status))) { + internalResponse.body = null; + fetchParams.controller.dump = true; + } + if (request.integrity) { + const processBodyError = (reason) => fetchFinale(fetchParams, makeNetworkError(reason)); + if (request.responseTainting === "opaque" || response.body == null) { + processBodyError(response.error); + return; + } + const processBody = (bytes) => { + if (!bytesMatch(bytes, request.integrity)) { + processBodyError("integrity mismatch"); + return; + } + response.body = safelyExtractBody(bytes)[0]; + fetchFinale(fetchParams, response); + }; + await fullyReadBody(response.body, processBody, processBodyError); + } else { + fetchFinale(fetchParams, response); + } + } + function schemeFetch(fetchParams) { + if (isCancelled(fetchParams) && fetchParams.request.redirectCount === 0) { + return Promise.resolve(makeAppropriateNetworkError(fetchParams)); + } + const { request } = fetchParams; + const { protocol: scheme } = requestCurrentURL(request); + switch (scheme) { + case "about:": { + return Promise.resolve(makeNetworkError("about scheme is not supported")); + } + case "blob:": { + if (!resolveObjectURL) { + resolveObjectURL = require("buffer").resolveObjectURL; + } + const blobURLEntry = requestCurrentURL(request); + if (blobURLEntry.search.length !== 0) { + return Promise.resolve(makeNetworkError("NetworkError when attempting to fetch resource.")); + } + const blobURLEntryObject = resolveObjectURL(blobURLEntry.toString()); + if (request.method !== "GET" || !isBlobLike(blobURLEntryObject)) { + return Promise.resolve(makeNetworkError("invalid method")); + } + const bodyWithType = safelyExtractBody(blobURLEntryObject); + const body = bodyWithType[0]; + const length = isomorphicEncode(`${body.length}`); + const type = bodyWithType[1] ?? ""; + const response = makeResponse({ + statusText: "OK", + headersList: [ + ["content-length", { name: "Content-Length", value: length }], + ["content-type", { name: "Content-Type", value: type }] + ] + }); + response.body = body; + return Promise.resolve(response); + } + case "data:": { + const currentURL = requestCurrentURL(request); + const dataURLStruct = dataURLProcessor(currentURL); + if (dataURLStruct === "failure") { + return Promise.resolve(makeNetworkError("failed to fetch the data URL")); + } + const mimeType = serializeAMimeType(dataURLStruct.mimeType); + return Promise.resolve(makeResponse({ + statusText: "OK", + headersList: [ + ["content-type", { name: "Content-Type", value: mimeType }] + ], + body: safelyExtractBody(dataURLStruct.body)[0] + })); + } + case "file:": { + return Promise.resolve(makeNetworkError("not implemented... yet...")); + } + case "http:": + case "https:": { + return httpFetch(fetchParams).catch((err) => makeNetworkError(err)); + } + default: { + return Promise.resolve(makeNetworkError("unknown scheme")); + } + } + } + function finalizeResponse(fetchParams, response) { + fetchParams.request.done = true; + if (fetchParams.processResponseDone != null) { + queueMicrotask(() => fetchParams.processResponseDone(response)); + } + } + function fetchFinale(fetchParams, response) { + if (response.type === "error") { + response.urlList = [fetchParams.request.urlList[0]]; + response.timingInfo = createOpaqueTimingInfo({ + startTime: fetchParams.timingInfo.startTime + }); + } + const processResponseEndOfBody = () => { + fetchParams.request.done = true; + if (fetchParams.processResponseEndOfBody != null) { + queueMicrotask(() => fetchParams.processResponseEndOfBody(response)); + } + }; + if (fetchParams.processResponse != null) { + queueMicrotask(() => fetchParams.processResponse(response)); + } + if (response.body == null) { + processResponseEndOfBody(); + } else { + const identityTransformAlgorithm = (chunk, controller) => { + controller.enqueue(chunk); + }; + const transformStream = new TransformStream({ + start() { + }, + transform: identityTransformAlgorithm, + flush: processResponseEndOfBody + }, { + size() { + return 1; + } + }, { + size() { + return 1; + } + }); + response.body = { stream: response.body.stream.pipeThrough(transformStream) }; + } + if (fetchParams.processResponseConsumeBody != null) { + const processBody = (nullOrBytes) => fetchParams.processResponseConsumeBody(response, nullOrBytes); + const processBodyError = (failure) => fetchParams.processResponseConsumeBody(response, failure); + if (response.body == null) { + queueMicrotask(() => processBody(null)); + } else { + return fullyReadBody(response.body, processBody, processBodyError); + } + return Promise.resolve(); + } + } + async function httpFetch(fetchParams) { + const request = fetchParams.request; + let response = null; + let actualResponse = null; + const timingInfo = fetchParams.timingInfo; + if (request.serviceWorkers === "all") { + } + if (response === null) { + if (request.redirect === "follow") { + request.serviceWorkers = "none"; + } + actualResponse = response = await httpNetworkOrCacheFetch(fetchParams); + if (request.responseTainting === "cors" && corsCheck(request, response) === "failure") { + return makeNetworkError("cors failure"); + } + if (TAOCheck(request, response) === "failure") { + request.timingAllowFailed = true; + } + } + if ((request.responseTainting === "opaque" || response.type === "opaque") && crossOriginResourcePolicyCheck(request.origin, request.client, request.destination, actualResponse) === "blocked") { + return makeNetworkError("blocked"); + } + if (redirectStatusSet.has(actualResponse.status)) { + if (request.redirect !== "manual") { + fetchParams.controller.connection.destroy(); + } + if (request.redirect === "error") { + response = makeNetworkError("unexpected redirect"); + } else if (request.redirect === "manual") { + response = actualResponse; + } else if (request.redirect === "follow") { + response = await httpRedirectFetch(fetchParams, response); + } else { + assert(false); + } + } + response.timingInfo = timingInfo; + return response; + } + function httpRedirectFetch(fetchParams, response) { + const request = fetchParams.request; + const actualResponse = response.internalResponse ? response.internalResponse : response; + let locationURL; + try { + locationURL = responseLocationURL(actualResponse, requestCurrentURL(request).hash); + if (locationURL == null) { + return response; + } + } catch (err) { + return Promise.resolve(makeNetworkError(err)); + } + if (!urlIsHttpHttpsScheme(locationURL)) { + return Promise.resolve(makeNetworkError("URL scheme must be a HTTP(S) scheme")); + } + if (request.redirectCount === 20) { + return Promise.resolve(makeNetworkError("redirect count exceeded")); + } + request.redirectCount += 1; + if (request.mode === "cors" && (locationURL.username || locationURL.password) && !sameOrigin(request, locationURL)) { + return Promise.resolve(makeNetworkError('cross origin not allowed for request mode "cors"')); + } + if (request.responseTainting === "cors" && (locationURL.username || locationURL.password)) { + return Promise.resolve(makeNetworkError('URL cannot contain credentials for request mode "cors"')); + } + if (actualResponse.status !== 303 && request.body != null && request.body.source == null) { + return Promise.resolve(makeNetworkError()); + } + if ([301, 302].includes(actualResponse.status) && request.method === "POST" || actualResponse.status === 303 && !GET_OR_HEAD.includes(request.method)) { + request.method = "GET"; + request.body = null; + for (const headerName of requestBodyHeader) { + request.headersList.delete(headerName); + } + } + if (!sameOrigin(requestCurrentURL(request), locationURL)) { + request.headersList.delete("authorization"); + request.headersList.delete("proxy-authorization", true); + request.headersList.delete("cookie"); + request.headersList.delete("host"); + } + if (request.body != null) { + assert(request.body.source != null); + request.body = safelyExtractBody(request.body.source)[0]; + } + const timingInfo = fetchParams.timingInfo; + timingInfo.redirectEndTime = timingInfo.postRedirectStartTime = coarsenedSharedCurrentTime(fetchParams.crossOriginIsolatedCapability); + if (timingInfo.redirectStartTime === 0) { + timingInfo.redirectStartTime = timingInfo.startTime; + } + request.urlList.push(locationURL); + setRequestReferrerPolicyOnRedirect(request, actualResponse); + return mainFetch(fetchParams, true); + } + async function httpNetworkOrCacheFetch(fetchParams, isAuthenticationFetch = false, isNewConnectionFetch = false) { + const request = fetchParams.request; + let httpFetchParams = null; + let httpRequest = null; + let response = null; + const httpCache = null; + const revalidatingFlag = false; + if (request.window === "no-window" && request.redirect === "error") { + httpFetchParams = fetchParams; + httpRequest = request; + } else { + httpRequest = makeRequest(request); + httpFetchParams = { ...fetchParams }; + httpFetchParams.request = httpRequest; + } + const includeCredentials = request.credentials === "include" || request.credentials === "same-origin" && request.responseTainting === "basic"; + const contentLength = httpRequest.body ? httpRequest.body.length : null; + let contentLengthHeaderValue = null; + if (httpRequest.body == null && ["POST", "PUT"].includes(httpRequest.method)) { + contentLengthHeaderValue = "0"; + } + if (contentLength != null) { + contentLengthHeaderValue = isomorphicEncode(`${contentLength}`); + } + if (contentLengthHeaderValue != null) { + httpRequest.headersList.append("content-length", contentLengthHeaderValue); + } + if (contentLength != null && httpRequest.keepalive) { + } + if (httpRequest.referrer instanceof URL) { + httpRequest.headersList.append("referer", isomorphicEncode(httpRequest.referrer.href)); + } + appendRequestOriginHeader(httpRequest); + appendFetchMetadata(httpRequest); + if (!httpRequest.headersList.contains("user-agent")) { + httpRequest.headersList.append("user-agent", typeof esbuildDetection === "undefined" ? "undici" : "node"); + } + if (httpRequest.cache === "default" && (httpRequest.headersList.contains("if-modified-since") || httpRequest.headersList.contains("if-none-match") || httpRequest.headersList.contains("if-unmodified-since") || httpRequest.headersList.contains("if-match") || httpRequest.headersList.contains("if-range"))) { + httpRequest.cache = "no-store"; + } + if (httpRequest.cache === "no-cache" && !httpRequest.preventNoCacheCacheControlHeaderModification && !httpRequest.headersList.contains("cache-control")) { + httpRequest.headersList.append("cache-control", "max-age=0"); + } + if (httpRequest.cache === "no-store" || httpRequest.cache === "reload") { + if (!httpRequest.headersList.contains("pragma")) { + httpRequest.headersList.append("pragma", "no-cache"); + } + if (!httpRequest.headersList.contains("cache-control")) { + httpRequest.headersList.append("cache-control", "no-cache"); + } + } + if (httpRequest.headersList.contains("range")) { + httpRequest.headersList.append("accept-encoding", "identity"); + } + if (!httpRequest.headersList.contains("accept-encoding")) { + if (urlHasHttpsScheme(requestCurrentURL(httpRequest))) { + httpRequest.headersList.append("accept-encoding", "br, gzip, deflate"); + } else { + httpRequest.headersList.append("accept-encoding", "gzip, deflate"); + } + } + httpRequest.headersList.delete("host"); + if (includeCredentials) { + } + if (httpCache == null) { + httpRequest.cache = "no-store"; + } + if (httpRequest.mode !== "no-store" && httpRequest.mode !== "reload") { + } + if (response == null) { + if (httpRequest.mode === "only-if-cached") { + return makeNetworkError("only if cached"); + } + const forwardResponse = await httpNetworkFetch(httpFetchParams, includeCredentials, isNewConnectionFetch); + if (!safeMethodsSet.has(httpRequest.method) && forwardResponse.status >= 200 && forwardResponse.status <= 399) { + } + if (revalidatingFlag && forwardResponse.status === 304) { + } + if (response == null) { + response = forwardResponse; + } + } + response.urlList = [...httpRequest.urlList]; + if (httpRequest.headersList.contains("range")) { + response.rangeRequested = true; + } + response.requestIncludesCredentials = includeCredentials; + if (response.status === 407) { + if (request.window === "no-window") { + return makeNetworkError(); + } + if (isCancelled(fetchParams)) { + return makeAppropriateNetworkError(fetchParams); + } + return makeNetworkError("proxy authentication required"); + } + if (response.status === 421 && !isNewConnectionFetch && (request.body == null || request.body.source != null)) { + if (isCancelled(fetchParams)) { + return makeAppropriateNetworkError(fetchParams); + } + fetchParams.controller.connection.destroy(); + response = await httpNetworkOrCacheFetch(fetchParams, isAuthenticationFetch, true); + } + if (isAuthenticationFetch) { + } + return response; + } + async function httpNetworkFetch(fetchParams, includeCredentials = false, forceNewConnection = false) { + assert(!fetchParams.controller.connection || fetchParams.controller.connection.destroyed); + fetchParams.controller.connection = { + abort: null, + destroyed: false, + destroy(err) { + if (!this.destroyed) { + this.destroyed = true; + this.abort?.(err ?? new DOMException2("The operation was aborted.", "AbortError")); + } + } + }; + const request = fetchParams.request; + let response = null; + const timingInfo = fetchParams.timingInfo; + const httpCache = null; + if (httpCache == null) { + request.cache = "no-store"; + } + const newConnection = forceNewConnection ? "yes" : "no"; + if (request.mode === "websocket") { + } else { + } + let requestBody = null; + if (request.body == null && fetchParams.processRequestEndOfBody) { + queueMicrotask(() => fetchParams.processRequestEndOfBody()); + } else if (request.body != null) { + const processBodyChunk = async function* (bytes) { + if (isCancelled(fetchParams)) { + return; + } + yield bytes; + fetchParams.processRequestBodyChunkLength?.(bytes.byteLength); + }; + const processEndOfBody = () => { + if (isCancelled(fetchParams)) { + return; + } + if (fetchParams.processRequestEndOfBody) { + fetchParams.processRequestEndOfBody(); + } + }; + const processBodyError = (e) => { + if (isCancelled(fetchParams)) { + return; + } + if (e.name === "AbortError") { + fetchParams.controller.abort(); + } else { + fetchParams.controller.terminate(e); + } + }; + requestBody = async function* () { + try { + for await (const bytes of request.body.stream) { + yield* processBodyChunk(bytes); + } + processEndOfBody(); + } catch (err) { + processBodyError(err); + } + }(); + } + try { + const { body, status, statusText, headersList, socket } = await dispatch({ body: requestBody }); + if (socket) { + response = makeResponse({ status, statusText, headersList, socket }); + } else { + const iterator = body[Symbol.asyncIterator](); + fetchParams.controller.next = () => iterator.next(); + response = makeResponse({ status, statusText, headersList }); + } + } catch (err) { + if (err.name === "AbortError") { + fetchParams.controller.connection.destroy(); + return makeAppropriateNetworkError(fetchParams, err); + } + return makeNetworkError(err); + } + const pullAlgorithm = () => { + fetchParams.controller.resume(); + }; + const cancelAlgorithm = (reason) => { + fetchParams.controller.abort(reason); + }; + if (!ReadableStream2) { + ReadableStream2 = require("stream/web").ReadableStream; + } + const stream = new ReadableStream2({ + async start(controller) { + fetchParams.controller.controller = controller; + }, + async pull(controller) { + await pullAlgorithm(controller); + }, + async cancel(reason) { + await cancelAlgorithm(reason); + } + }, { + highWaterMark: 0, + size() { + return 1; + } + }); + response.body = { stream }; + fetchParams.controller.on("terminated", onAborted); + fetchParams.controller.resume = async () => { + while (true) { + let bytes; + let isFailure; + try { + const { done, value } = await fetchParams.controller.next(); + if (isAborted(fetchParams)) { + break; + } + bytes = done ? undefined : value; + } catch (err) { + if (fetchParams.controller.ended && !timingInfo.encodedBodySize) { + bytes = undefined; + } else { + bytes = err; + isFailure = true; + } + } + if (bytes === undefined) { + readableStreamClose(fetchParams.controller.controller); + finalizeResponse(fetchParams, response); + return; + } + timingInfo.decodedBodySize += bytes?.byteLength ?? 0; + if (isFailure) { + fetchParams.controller.terminate(bytes); + return; + } + fetchParams.controller.controller.enqueue(new Uint8Array(bytes)); + if (isErrored(stream)) { + fetchParams.controller.terminate(); + return; + } + if (!fetchParams.controller.controller.desiredSize) { + return; + } + } + }; + function onAborted(reason) { + if (isAborted(fetchParams)) { + response.aborted = true; + if (isReadable(stream)) { + fetchParams.controller.controller.error(fetchParams.controller.serializedAbortReason); + } + } else { + if (isReadable(stream)) { + fetchParams.controller.controller.error(new TypeError("terminated", { + cause: isErrorLike(reason) ? reason : undefined + })); + } + } + fetchParams.controller.connection.destroy(); + } + return response; + async function dispatch({ body }) { + const url = requestCurrentURL(request); + const agent = fetchParams.controller.dispatcher; + return new Promise((resolve, reject) => agent.dispatch({ + path: url.pathname + url.search, + origin: url.origin, + method: request.method, + body: fetchParams.controller.dispatcher.isMockActive ? request.body && (request.body.source || request.body.stream) : body, + headers: request.headersList.entries, + maxRedirections: 0, + upgrade: request.mode === "websocket" ? "websocket" : undefined + }, { + body: null, + abort: null, + onConnect(abort) { + const { connection } = fetchParams.controller; + if (connection.destroyed) { + abort(new DOMException2("The operation was aborted.", "AbortError")); + } else { + fetchParams.controller.on("terminated", abort); + this.abort = connection.abort = abort; + } + }, + onHeaders(status, headersList, resume, statusText) { + if (status < 200) { + return; + } + let codings = []; + let location = ""; + const headers = new Headers2; + if (Array.isArray(headersList)) { + for (let n = 0;n < headersList.length; n += 2) { + const key = headersList[n + 0].toString("latin1"); + const val2 = headersList[n + 1].toString("latin1"); + if (key.toLowerCase() === "content-encoding") { + codings = val2.toLowerCase().split(",").map((x) => x.trim()); + } else if (key.toLowerCase() === "location") { + location = val2; + } + headers[kHeadersList].append(key, val2); + } + } else { + const keys = Object.keys(headersList); + for (const key of keys) { + const val2 = headersList[key]; + if (key.toLowerCase() === "content-encoding") { + codings = val2.toLowerCase().split(",").map((x) => x.trim()).reverse(); + } else if (key.toLowerCase() === "location") { + location = val2; + } + headers[kHeadersList].append(key, val2); + } + } + this.body = new Readable({ read: resume }); + const decoders = []; + const willFollow = request.redirect === "follow" && location && redirectStatusSet.has(status); + if (request.method !== "HEAD" && request.method !== "CONNECT" && !nullBodyStatus.includes(status) && !willFollow) { + for (const coding of codings) { + if (coding === "x-gzip" || coding === "gzip") { + decoders.push(zlib.createGunzip({ + flush: zlib.constants.Z_SYNC_FLUSH, + finishFlush: zlib.constants.Z_SYNC_FLUSH + })); + } else if (coding === "deflate") { + decoders.push(zlib.createInflate()); + } else if (coding === "br") { + decoders.push(zlib.createBrotliDecompress()); + } else { + decoders.length = 0; + break; + } + } + } + resolve({ + status, + statusText, + headersList: headers[kHeadersList], + body: decoders.length ? pipeline(this.body, ...decoders, () => { + }) : this.body.on("error", () => { + }) + }); + return true; + }, + onData(chunk) { + if (fetchParams.controller.dump) { + return; + } + const bytes = chunk; + timingInfo.encodedBodySize += bytes.byteLength; + return this.body.push(bytes); + }, + onComplete() { + if (this.abort) { + fetchParams.controller.off("terminated", this.abort); + } + fetchParams.controller.ended = true; + this.body.push(null); + }, + onError(error) { + if (this.abort) { + fetchParams.controller.off("terminated", this.abort); + } + this.body?.destroy(error); + fetchParams.controller.terminate(error); + reject(error); + }, + onUpgrade(status, headersList, socket) { + if (status !== 101) { + return; + } + const headers = new Headers2; + for (let n = 0;n < headersList.length; n += 2) { + const key = headersList[n + 0].toString("latin1"); + const val2 = headersList[n + 1].toString("latin1"); + headers[kHeadersList].append(key, val2); + } + resolve({ + status, + statusText: STATUS_CODES[status], + headersList: headers[kHeadersList], + socket + }); + return true; + } + })); + } + } + module2.exports = { + fetch: fetch2, + Fetch, + fetching, + finalizeAndReportTiming + }; +}); + +// node_modules/undici/lib/fileapi/symbols.js +var require_symbols3 = __commonJS((exports2, module2) => { + module2.exports = { + kState: Symbol("FileReader state"), + kResult: Symbol("FileReader result"), + kError: Symbol("FileReader error"), + kLastProgressEventFired: Symbol("FileReader last progress event fired timestamp"), + kEvents: Symbol("FileReader events"), + kAborted: Symbol("FileReader aborted") + }; +}); + +// node_modules/undici/lib/fileapi/progressevent.js +var require_progressevent = __commonJS((exports2, module2) => { + var { webidl } = require_webidl(); + var kState = Symbol("ProgressEvent state"); + + class ProgressEvent extends Event { + constructor(type, eventInitDict = {}) { + type = webidl.converters.DOMString(type); + eventInitDict = webidl.converters.ProgressEventInit(eventInitDict ?? {}); + super(type, eventInitDict); + this[kState] = { + lengthComputable: eventInitDict.lengthComputable, + loaded: eventInitDict.loaded, + total: eventInitDict.total + }; + } + get lengthComputable() { + webidl.brandCheck(this, ProgressEvent); + return this[kState].lengthComputable; + } + get loaded() { + webidl.brandCheck(this, ProgressEvent); + return this[kState].loaded; + } + get total() { + webidl.brandCheck(this, ProgressEvent); + return this[kState].total; + } + } + webidl.converters.ProgressEventInit = webidl.dictionaryConverter([ + { + key: "lengthComputable", + converter: webidl.converters.boolean, + defaultValue: false + }, + { + key: "loaded", + converter: webidl.converters["unsigned long long"], + defaultValue: 0 + }, + { + key: "total", + converter: webidl.converters["unsigned long long"], + defaultValue: 0 + }, + { + key: "bubbles", + converter: webidl.converters.boolean, + defaultValue: false + }, + { + key: "cancelable", + converter: webidl.converters.boolean, + defaultValue: false + }, + { + key: "composed", + converter: webidl.converters.boolean, + defaultValue: false + } + ]); + module2.exports = { + ProgressEvent + }; +}); + +// node_modules/undici/lib/fileapi/encoding.js +var require_encoding = __commonJS((exports2, module2) => { + function getEncoding(label) { + if (!label) { + return "failure"; + } + switch (label.trim().toLowerCase()) { + case "unicode-1-1-utf-8": + case "unicode11utf8": + case "unicode20utf8": + case "utf-8": + case "utf8": + case "x-unicode20utf8": + return "UTF-8"; + case "866": + case "cp866": + case "csibm866": + case "ibm866": + return "IBM866"; + case "csisolatin2": + case "iso-8859-2": + case "iso-ir-101": + case "iso8859-2": + case "iso88592": + case "iso_8859-2": + case "iso_8859-2:1987": + case "l2": + case "latin2": + return "ISO-8859-2"; + case "csisolatin3": + case "iso-8859-3": + case "iso-ir-109": + case "iso8859-3": + case "iso88593": + case "iso_8859-3": + case "iso_8859-3:1988": + case "l3": + case "latin3": + return "ISO-8859-3"; + case "csisolatin4": + case "iso-8859-4": + case "iso-ir-110": + case "iso8859-4": + case "iso88594": + case "iso_8859-4": + case "iso_8859-4:1988": + case "l4": + case "latin4": + return "ISO-8859-4"; + case "csisolatincyrillic": + case "cyrillic": + case "iso-8859-5": + case "iso-ir-144": + case "iso8859-5": + case "iso88595": + case "iso_8859-5": + case "iso_8859-5:1988": + return "ISO-8859-5"; + case "arabic": + case "asmo-708": + case "csiso88596e": + case "csiso88596i": + case "csisolatinarabic": + case "ecma-114": + case "iso-8859-6": + case "iso-8859-6-e": + case "iso-8859-6-i": + case "iso-ir-127": + case "iso8859-6": + case "iso88596": + case "iso_8859-6": + case "iso_8859-6:1987": + return "ISO-8859-6"; + case "csisolatingreek": + case "ecma-118": + case "elot_928": + case "greek": + case "greek8": + case "iso-8859-7": + case "iso-ir-126": + case "iso8859-7": + case "iso88597": + case "iso_8859-7": + case "iso_8859-7:1987": + case "sun_eu_greek": + return "ISO-8859-7"; + case "csiso88598e": + case "csisolatinhebrew": + case "hebrew": + case "iso-8859-8": + case "iso-8859-8-e": + case "iso-ir-138": + case "iso8859-8": + case "iso88598": + case "iso_8859-8": + case "iso_8859-8:1988": + case "visual": + return "ISO-8859-8"; + case "csiso88598i": + case "iso-8859-8-i": + case "logical": + return "ISO-8859-8-I"; + case "csisolatin6": + case "iso-8859-10": + case "iso-ir-157": + case "iso8859-10": + case "iso885910": + case "l6": + case "latin6": + return "ISO-8859-10"; + case "iso-8859-13": + case "iso8859-13": + case "iso885913": + return "ISO-8859-13"; + case "iso-8859-14": + case "iso8859-14": + case "iso885914": + return "ISO-8859-14"; + case "csisolatin9": + case "iso-8859-15": + case "iso8859-15": + case "iso885915": + case "iso_8859-15": + case "l9": + return "ISO-8859-15"; + case "iso-8859-16": + return "ISO-8859-16"; + case "cskoi8r": + case "koi": + case "koi8": + case "koi8-r": + case "koi8_r": + return "KOI8-R"; + case "koi8-ru": + case "koi8-u": + return "KOI8-U"; + case "csmacintosh": + case "mac": + case "macintosh": + case "x-mac-roman": + return "macintosh"; + case "iso-8859-11": + case "iso8859-11": + case "iso885911": + case "tis-620": + case "windows-874": + return "windows-874"; + case "cp1250": + case "windows-1250": + case "x-cp1250": + return "windows-1250"; + case "cp1251": + case "windows-1251": + case "x-cp1251": + return "windows-1251"; + case "ansi_x3.4-1968": + case "ascii": + case "cp1252": + case "cp819": + case "csisolatin1": + case "ibm819": + case "iso-8859-1": + case "iso-ir-100": + case "iso8859-1": + case "iso88591": + case "iso_8859-1": + case "iso_8859-1:1987": + case "l1": + case "latin1": + case "us-ascii": + case "windows-1252": + case "x-cp1252": + return "windows-1252"; + case "cp1253": + case "windows-1253": + case "x-cp1253": + return "windows-1253"; + case "cp1254": + case "csisolatin5": + case "iso-8859-9": + case "iso-ir-148": + case "iso8859-9": + case "iso88599": + case "iso_8859-9": + case "iso_8859-9:1989": + case "l5": + case "latin5": + case "windows-1254": + case "x-cp1254": + return "windows-1254"; + case "cp1255": + case "windows-1255": + case "x-cp1255": + return "windows-1255"; + case "cp1256": + case "windows-1256": + case "x-cp1256": + return "windows-1256"; + case "cp1257": + case "windows-1257": + case "x-cp1257": + return "windows-1257"; + case "cp1258": + case "windows-1258": + case "x-cp1258": + return "windows-1258"; + case "x-mac-cyrillic": + case "x-mac-ukrainian": + return "x-mac-cyrillic"; + case "chinese": + case "csgb2312": + case "csiso58gb231280": + case "gb2312": + case "gb_2312": + case "gb_2312-80": + case "gbk": + case "iso-ir-58": + case "x-gbk": + return "GBK"; + case "gb18030": + return "gb18030"; + case "big5": + case "big5-hkscs": + case "cn-big5": + case "csbig5": + case "x-x-big5": + return "Big5"; + case "cseucpkdfmtjapanese": + case "euc-jp": + case "x-euc-jp": + return "EUC-JP"; + case "csiso2022jp": + case "iso-2022-jp": + return "ISO-2022-JP"; + case "csshiftjis": + case "ms932": + case "ms_kanji": + case "shift-jis": + case "shift_jis": + case "sjis": + case "windows-31j": + case "x-sjis": + return "Shift_JIS"; + case "cseuckr": + case "csksc56011987": + case "euc-kr": + case "iso-ir-149": + case "korean": + case "ks_c_5601-1987": + case "ks_c_5601-1989": + case "ksc5601": + case "ksc_5601": + case "windows-949": + return "EUC-KR"; + case "csiso2022kr": + case "hz-gb-2312": + case "iso-2022-cn": + case "iso-2022-cn-ext": + case "iso-2022-kr": + case "replacement": + return "replacement"; + case "unicodefffe": + case "utf-16be": + return "UTF-16BE"; + case "csunicode": + case "iso-10646-ucs-2": + case "ucs-2": + case "unicode": + case "unicodefeff": + case "utf-16": + case "utf-16le": + return "UTF-16LE"; + case "x-user-defined": + return "x-user-defined"; + default: + return "failure"; + } + } + module2.exports = { + getEncoding + }; +}); + +// node_modules/undici/lib/fileapi/util.js +var require_util4 = __commonJS((exports2, module2) => { + var { + kState, + kError, + kResult, + kAborted, + kLastProgressEventFired + } = require_symbols3(); + var { ProgressEvent } = require_progressevent(); + var { getEncoding } = require_encoding(); + var { DOMException: DOMException2 } = require_constants2(); + var { serializeAMimeType, parseMIMEType } = require_dataURL(); + var { types } = require("util"); + var { StringDecoder } = require("string_decoder"); + var { btoa: btoa2 } = require("buffer"); + var staticPropertyDescriptors = { + enumerable: true, + writable: false, + configurable: false + }; + function readOperation(fr, blob, type, encodingName) { + if (fr[kState] === "loading") { + throw new DOMException2("Invalid state", "InvalidStateError"); + } + fr[kState] = "loading"; + fr[kResult] = null; + fr[kError] = null; + const stream = blob.stream(); + const reader = stream.getReader(); + const bytes = []; + let chunkPromise = reader.read(); + let isFirstChunk = true; + (async () => { + while (!fr[kAborted]) { + try { + const { done, value } = await chunkPromise; + if (isFirstChunk && !fr[kAborted]) { + queueMicrotask(() => { + fireAProgressEvent("loadstart", fr); + }); + } + isFirstChunk = false; + if (!done && types.isUint8Array(value)) { + bytes.push(value); + if ((fr[kLastProgressEventFired] === undefined || Date.now() - fr[kLastProgressEventFired] >= 50) && !fr[kAborted]) { + fr[kLastProgressEventFired] = Date.now(); + queueMicrotask(() => { + fireAProgressEvent("progress", fr); + }); + } + chunkPromise = reader.read(); + } else if (done) { + queueMicrotask(() => { + fr[kState] = "done"; + try { + const result = packageData(bytes, type, blob.type, encodingName); + if (fr[kAborted]) { + return; + } + fr[kResult] = result; + fireAProgressEvent("load", fr); + } catch (error) { + fr[kError] = error; + fireAProgressEvent("error", fr); + } + if (fr[kState] !== "loading") { + fireAProgressEvent("loadend", fr); + } + }); + break; + } + } catch (error) { + if (fr[kAborted]) { + return; + } + queueMicrotask(() => { + fr[kState] = "done"; + fr[kError] = error; + fireAProgressEvent("error", fr); + if (fr[kState] !== "loading") { + fireAProgressEvent("loadend", fr); + } + }); + break; + } + } + })(); + } + function fireAProgressEvent(e, reader) { + const event = new ProgressEvent(e, { + bubbles: false, + cancelable: false + }); + reader.dispatchEvent(event); + } + function packageData(bytes, type, mimeType, encodingName) { + switch (type) { + case "DataURL": { + let dataURL = "data:"; + const parsed = parseMIMEType(mimeType || "application/octet-stream"); + if (parsed !== "failure") { + dataURL += serializeAMimeType(parsed); + } + dataURL += ";base64,"; + const decoder = new StringDecoder("latin1"); + for (const chunk of bytes) { + dataURL += btoa2(decoder.write(chunk)); + } + dataURL += btoa2(decoder.end()); + return dataURL; + } + case "Text": { + let encoding = "failure"; + if (encodingName) { + encoding = getEncoding(encodingName); + } + if (encoding === "failure" && mimeType) { + const type2 = parseMIMEType(mimeType); + if (type2 !== "failure") { + encoding = getEncoding(type2.parameters.get("charset")); + } + } + if (encoding === "failure") { + encoding = "UTF-8"; + } + return decode(bytes, encoding); + } + case "ArrayBuffer": { + const sequence = combineByteSequences(bytes); + return sequence.buffer; + } + case "BinaryString": { + let binaryString = ""; + const decoder = new StringDecoder("latin1"); + for (const chunk of bytes) { + binaryString += decoder.write(chunk); + } + binaryString += decoder.end(); + return binaryString; + } + } + } + function decode(ioQueue, encoding) { + const bytes = combineByteSequences(ioQueue); + const BOMEncoding = BOMSniffing(bytes); + let slice = 0; + if (BOMEncoding !== null) { + encoding = BOMEncoding; + slice = BOMEncoding === "UTF-8" ? 3 : 2; + } + const sliced = bytes.slice(slice); + return new TextDecoder(encoding).decode(sliced); + } + function BOMSniffing(ioQueue) { + const [a, b, c] = ioQueue; + if (a === 239 && b === 187 && c === 191) { + return "UTF-8"; + } else if (a === 254 && b === 255) { + return "UTF-16BE"; + } else if (a === 255 && b === 254) { + return "UTF-16LE"; + } + return null; + } + function combineByteSequences(sequences) { + const size = sequences.reduce((a, b) => { + return a + b.byteLength; + }, 0); + let offset = 0; + return sequences.reduce((a, b) => { + a.set(b, offset); + offset += b.byteLength; + return a; + }, new Uint8Array(size)); + } + module2.exports = { + staticPropertyDescriptors, + readOperation, + fireAProgressEvent + }; +}); + +// node_modules/undici/lib/fileapi/filereader.js +var require_filereader = __commonJS((exports2, module2) => { + var { + staticPropertyDescriptors, + readOperation, + fireAProgressEvent + } = require_util4(); + var { + kState, + kError, + kResult, + kEvents, + kAborted + } = require_symbols3(); + var { webidl } = require_webidl(); + var { kEnumerableProperty } = require_util(); + + class FileReader extends EventTarget { + constructor() { + super(); + this[kState] = "empty"; + this[kResult] = null; + this[kError] = null; + this[kEvents] = { + loadend: null, + error: null, + abort: null, + load: null, + progress: null, + loadstart: null + }; + } + readAsArrayBuffer(blob) { + webidl.brandCheck(this, FileReader); + webidl.argumentLengthCheck(arguments, 1, { header: "FileReader.readAsArrayBuffer" }); + blob = webidl.converters.Blob(blob, { strict: false }); + readOperation(this, blob, "ArrayBuffer"); + } + readAsBinaryString(blob) { + webidl.brandCheck(this, FileReader); + webidl.argumentLengthCheck(arguments, 1, { header: "FileReader.readAsBinaryString" }); + blob = webidl.converters.Blob(blob, { strict: false }); + readOperation(this, blob, "BinaryString"); + } + readAsText(blob, encoding = undefined) { + webidl.brandCheck(this, FileReader); + webidl.argumentLengthCheck(arguments, 1, { header: "FileReader.readAsText" }); + blob = webidl.converters.Blob(blob, { strict: false }); + if (encoding !== undefined) { + encoding = webidl.converters.DOMString(encoding); + } + readOperation(this, blob, "Text", encoding); + } + readAsDataURL(blob) { + webidl.brandCheck(this, FileReader); + webidl.argumentLengthCheck(arguments, 1, { header: "FileReader.readAsDataURL" }); + blob = webidl.converters.Blob(blob, { strict: false }); + readOperation(this, blob, "DataURL"); + } + abort() { + if (this[kState] === "empty" || this[kState] === "done") { + this[kResult] = null; + return; + } + if (this[kState] === "loading") { + this[kState] = "done"; + this[kResult] = null; + } + this[kAborted] = true; + fireAProgressEvent("abort", this); + if (this[kState] !== "loading") { + fireAProgressEvent("loadend", this); + } + } + get readyState() { + webidl.brandCheck(this, FileReader); + switch (this[kState]) { + case "empty": + return this.EMPTY; + case "loading": + return this.LOADING; + case "done": + return this.DONE; + } + } + get result() { + webidl.brandCheck(this, FileReader); + return this[kResult]; + } + get error() { + webidl.brandCheck(this, FileReader); + return this[kError]; + } + get onloadend() { + webidl.brandCheck(this, FileReader); + return this[kEvents].loadend; + } + set onloadend(fn) { + webidl.brandCheck(this, FileReader); + if (this[kEvents].loadend) { + this.removeEventListener("loadend", this[kEvents].loadend); + } + if (typeof fn === "function") { + this[kEvents].loadend = fn; + this.addEventListener("loadend", fn); + } else { + this[kEvents].loadend = null; + } + } + get onerror() { + webidl.brandCheck(this, FileReader); + return this[kEvents].error; + } + set onerror(fn) { + webidl.brandCheck(this, FileReader); + if (this[kEvents].error) { + this.removeEventListener("error", this[kEvents].error); + } + if (typeof fn === "function") { + this[kEvents].error = fn; + this.addEventListener("error", fn); + } else { + this[kEvents].error = null; + } + } + get onloadstart() { + webidl.brandCheck(this, FileReader); + return this[kEvents].loadstart; + } + set onloadstart(fn) { + webidl.brandCheck(this, FileReader); + if (this[kEvents].loadstart) { + this.removeEventListener("loadstart", this[kEvents].loadstart); + } + if (typeof fn === "function") { + this[kEvents].loadstart = fn; + this.addEventListener("loadstart", fn); + } else { + this[kEvents].loadstart = null; + } + } + get onprogress() { + webidl.brandCheck(this, FileReader); + return this[kEvents].progress; + } + set onprogress(fn) { + webidl.brandCheck(this, FileReader); + if (this[kEvents].progress) { + this.removeEventListener("progress", this[kEvents].progress); + } + if (typeof fn === "function") { + this[kEvents].progress = fn; + this.addEventListener("progress", fn); + } else { + this[kEvents].progress = null; + } + } + get onload() { + webidl.brandCheck(this, FileReader); + return this[kEvents].load; + } + set onload(fn) { + webidl.brandCheck(this, FileReader); + if (this[kEvents].load) { + this.removeEventListener("load", this[kEvents].load); + } + if (typeof fn === "function") { + this[kEvents].load = fn; + this.addEventListener("load", fn); + } else { + this[kEvents].load = null; + } + } + get onabort() { + webidl.brandCheck(this, FileReader); + return this[kEvents].abort; + } + set onabort(fn) { + webidl.brandCheck(this, FileReader); + if (this[kEvents].abort) { + this.removeEventListener("abort", this[kEvents].abort); + } + if (typeof fn === "function") { + this[kEvents].abort = fn; + this.addEventListener("abort", fn); + } else { + this[kEvents].abort = null; + } + } + } + FileReader.EMPTY = FileReader.prototype.EMPTY = 0; + FileReader.LOADING = FileReader.prototype.LOADING = 1; + FileReader.DONE = FileReader.prototype.DONE = 2; + Object.defineProperties(FileReader.prototype, { + EMPTY: staticPropertyDescriptors, + LOADING: staticPropertyDescriptors, + DONE: staticPropertyDescriptors, + readAsArrayBuffer: kEnumerableProperty, + readAsBinaryString: kEnumerableProperty, + readAsText: kEnumerableProperty, + readAsDataURL: kEnumerableProperty, + abort: kEnumerableProperty, + readyState: kEnumerableProperty, + result: kEnumerableProperty, + error: kEnumerableProperty, + onloadstart: kEnumerableProperty, + onprogress: kEnumerableProperty, + onload: kEnumerableProperty, + onabort: kEnumerableProperty, + onerror: kEnumerableProperty, + onloadend: kEnumerableProperty, + [Symbol.toStringTag]: { + value: "FileReader", + writable: false, + enumerable: false, + configurable: true + } + }); + Object.defineProperties(FileReader, { + EMPTY: staticPropertyDescriptors, + LOADING: staticPropertyDescriptors, + DONE: staticPropertyDescriptors + }); + module2.exports = { + FileReader + }; +}); + +// node_modules/undici/lib/cache/symbols.js +var require_symbols4 = __commonJS((exports2, module2) => { + module2.exports = { + kConstruct: require_symbols().kConstruct + }; +}); + +// node_modules/undici/lib/cache/util.js +var require_util5 = __commonJS((exports2, module2) => { + var assert = require("assert"); + var { URLSerializer } = require_dataURL(); + var { isValidHeaderName } = require_util2(); + function urlEquals(A, B, excludeFragment = false) { + const serializedA = URLSerializer(A, excludeFragment); + const serializedB = URLSerializer(B, excludeFragment); + return serializedA === serializedB; + } + function fieldValues(header) { + assert(header !== null); + const values = []; + for (let value of header.split(",")) { + value = value.trim(); + if (!value.length) { + continue; + } else if (!isValidHeaderName(value)) { + continue; + } + values.push(value); + } + return values; + } + module2.exports = { + urlEquals, + fieldValues + }; +}); + +// node_modules/undici/lib/cache/cache.js +var require_cache = __commonJS((exports2, module2) => { + var { kConstruct } = require_symbols4(); + var { urlEquals, fieldValues: getFieldValues } = require_util5(); + var { kEnumerableProperty, isDisturbed } = require_util(); + var { kHeadersList } = require_symbols(); + var { webidl } = require_webidl(); + var { Response, cloneResponse } = require_response(); + var { Request } = require_request2(); + var { kState, kHeaders, kGuard, kRealm } = require_symbols2(); + var { fetching } = require_fetch(); + var { urlIsHttpHttpsScheme, createDeferredPromise, readAllBytes } = require_util2(); + var assert = require("assert"); + var { getGlobalDispatcher } = require_global2(); + + class Cache { + #relevantRequestResponseList; + constructor() { + if (arguments[0] !== kConstruct) { + webidl.illegalConstructor(); + } + this.#relevantRequestResponseList = arguments[1]; + } + async match(request, options = {}) { + webidl.brandCheck(this, Cache); + webidl.argumentLengthCheck(arguments, 1, { header: "Cache.match" }); + request = webidl.converters.RequestInfo(request); + options = webidl.converters.CacheQueryOptions(options); + const p = await this.matchAll(request, options); + if (p.length === 0) { + return; + } + return p[0]; + } + async matchAll(request = undefined, options = {}) { + webidl.brandCheck(this, Cache); + if (request !== undefined) + request = webidl.converters.RequestInfo(request); + options = webidl.converters.CacheQueryOptions(options); + let r = null; + if (request !== undefined) { + if (request instanceof Request) { + r = request[kState]; + if (r.method !== "GET" && !options.ignoreMethod) { + return []; + } + } else if (typeof request === "string") { + r = new Request(request)[kState]; + } + } + const responses = []; + if (request === undefined) { + for (const requestResponse of this.#relevantRequestResponseList) { + responses.push(requestResponse[1]); + } + } else { + const requestResponses = this.#queryCache(r, options); + for (const requestResponse of requestResponses) { + responses.push(requestResponse[1]); + } + } + const responseList = []; + for (const response of responses) { + const responseObject = new Response(response.body?.source ?? null); + const body = responseObject[kState].body; + responseObject[kState] = response; + responseObject[kState].body = body; + responseObject[kHeaders][kHeadersList] = response.headersList; + responseObject[kHeaders][kGuard] = "immutable"; + responseList.push(responseObject); + } + return Object.freeze(responseList); + } + async add(request) { + webidl.brandCheck(this, Cache); + webidl.argumentLengthCheck(arguments, 1, { header: "Cache.add" }); + request = webidl.converters.RequestInfo(request); + const requests = [request]; + const responseArrayPromise = this.addAll(requests); + return await responseArrayPromise; + } + async addAll(requests) { + webidl.brandCheck(this, Cache); + webidl.argumentLengthCheck(arguments, 1, { header: "Cache.addAll" }); + requests = webidl.converters["sequence"](requests); + const responsePromises = []; + const requestList = []; + for (const request of requests) { + if (typeof request === "string") { + continue; + } + const r = request[kState]; + if (!urlIsHttpHttpsScheme(r.url) || r.method !== "GET") { + throw webidl.errors.exception({ + header: "Cache.addAll", + message: "Expected http/s scheme when method is not GET." + }); + } + } + const fetchControllers = []; + for (const request of requests) { + const r = new Request(request)[kState]; + if (!urlIsHttpHttpsScheme(r.url)) { + throw webidl.errors.exception({ + header: "Cache.addAll", + message: "Expected http/s scheme." + }); + } + r.initiator = "fetch"; + r.destination = "subresource"; + requestList.push(r); + const responsePromise = createDeferredPromise(); + fetchControllers.push(fetching({ + request: r, + dispatcher: getGlobalDispatcher(), + processResponse(response) { + if (response.type === "error" || response.status === 206 || response.status < 200 || response.status > 299) { + responsePromise.reject(webidl.errors.exception({ + header: "Cache.addAll", + message: "Received an invalid status code or the request failed." + })); + } else if (response.headersList.contains("vary")) { + const fieldValues = getFieldValues(response.headersList.get("vary")); + for (const fieldValue of fieldValues) { + if (fieldValue === "*") { + responsePromise.reject(webidl.errors.exception({ + header: "Cache.addAll", + message: "invalid vary field value" + })); + for (const controller of fetchControllers) { + controller.abort(); + } + return; + } + } + } + }, + processResponseEndOfBody(response) { + if (response.aborted) { + responsePromise.reject(new DOMException("aborted", "AbortError")); + return; + } + responsePromise.resolve(response); + } + })); + responsePromises.push(responsePromise.promise); + } + const p = Promise.all(responsePromises); + const responses = await p; + const operations = []; + let index = 0; + for (const response of responses) { + const operation = { + type: "put", + request: requestList[index], + response + }; + operations.push(operation); + index++; + } + const cacheJobPromise = createDeferredPromise(); + let errorData = null; + try { + this.#batchCacheOperations(operations); + } catch (e) { + errorData = e; + } + queueMicrotask(() => { + if (errorData === null) { + cacheJobPromise.resolve(undefined); + } else { + cacheJobPromise.reject(errorData); + } + }); + return cacheJobPromise.promise; + } + async put(request, response) { + webidl.brandCheck(this, Cache); + webidl.argumentLengthCheck(arguments, 2, { header: "Cache.put" }); + request = webidl.converters.RequestInfo(request); + response = webidl.converters.Response(response); + let innerRequest = null; + if (request instanceof Request) { + innerRequest = request[kState]; + } else { + innerRequest = new Request(request)[kState]; + } + if (!urlIsHttpHttpsScheme(innerRequest.url) || innerRequest.method !== "GET") { + throw webidl.errors.exception({ + header: "Cache.put", + message: "Expected an http/s scheme when method is not GET" + }); + } + const innerResponse = response[kState]; + if (innerResponse.status === 206) { + throw webidl.errors.exception({ + header: "Cache.put", + message: "Got 206 status" + }); + } + if (innerResponse.headersList.contains("vary")) { + const fieldValues = getFieldValues(innerResponse.headersList.get("vary")); + for (const fieldValue of fieldValues) { + if (fieldValue === "*") { + throw webidl.errors.exception({ + header: "Cache.put", + message: "Got * vary field value" + }); + } + } + } + if (innerResponse.body && (isDisturbed(innerResponse.body.stream) || innerResponse.body.stream.locked)) { + throw webidl.errors.exception({ + header: "Cache.put", + message: "Response body is locked or disturbed" + }); + } + const clonedResponse = cloneResponse(innerResponse); + const bodyReadPromise = createDeferredPromise(); + if (innerResponse.body != null) { + const stream = innerResponse.body.stream; + const reader = stream.getReader(); + readAllBytes(reader).then(bodyReadPromise.resolve, bodyReadPromise.reject); + } else { + bodyReadPromise.resolve(undefined); + } + const operations = []; + const operation = { + type: "put", + request: innerRequest, + response: clonedResponse + }; + operations.push(operation); + const bytes = await bodyReadPromise.promise; + if (clonedResponse.body != null) { + clonedResponse.body.source = bytes; + } + const cacheJobPromise = createDeferredPromise(); + let errorData = null; + try { + this.#batchCacheOperations(operations); + } catch (e) { + errorData = e; + } + queueMicrotask(() => { + if (errorData === null) { + cacheJobPromise.resolve(); + } else { + cacheJobPromise.reject(errorData); + } + }); + return cacheJobPromise.promise; + } + async delete(request, options = {}) { + webidl.brandCheck(this, Cache); + webidl.argumentLengthCheck(arguments, 1, { header: "Cache.delete" }); + request = webidl.converters.RequestInfo(request); + options = webidl.converters.CacheQueryOptions(options); + let r = null; + if (request instanceof Request) { + r = request[kState]; + if (r.method !== "GET" && !options.ignoreMethod) { + return false; + } + } else { + assert(typeof request === "string"); + r = new Request(request)[kState]; + } + const operations = []; + const operation = { + type: "delete", + request: r, + options + }; + operations.push(operation); + const cacheJobPromise = createDeferredPromise(); + let errorData = null; + let requestResponses; + try { + requestResponses = this.#batchCacheOperations(operations); + } catch (e) { + errorData = e; + } + queueMicrotask(() => { + if (errorData === null) { + cacheJobPromise.resolve(!!requestResponses?.length); + } else { + cacheJobPromise.reject(errorData); + } + }); + return cacheJobPromise.promise; + } + async keys(request = undefined, options = {}) { + webidl.brandCheck(this, Cache); + if (request !== undefined) + request = webidl.converters.RequestInfo(request); + options = webidl.converters.CacheQueryOptions(options); + let r = null; + if (request !== undefined) { + if (request instanceof Request) { + r = request[kState]; + if (r.method !== "GET" && !options.ignoreMethod) { + return []; + } + } else if (typeof request === "string") { + r = new Request(request)[kState]; + } + } + const promise = createDeferredPromise(); + const requests = []; + if (request === undefined) { + for (const requestResponse of this.#relevantRequestResponseList) { + requests.push(requestResponse[0]); + } + } else { + const requestResponses = this.#queryCache(r, options); + for (const requestResponse of requestResponses) { + requests.push(requestResponse[0]); + } + } + queueMicrotask(() => { + const requestList = []; + for (const request2 of requests) { + const requestObject = new Request("https://a"); + requestObject[kState] = request2; + requestObject[kHeaders][kHeadersList] = request2.headersList; + requestObject[kHeaders][kGuard] = "immutable"; + requestObject[kRealm] = request2.client; + requestList.push(requestObject); + } + promise.resolve(Object.freeze(requestList)); + }); + return promise.promise; + } + #batchCacheOperations(operations) { + const cache = this.#relevantRequestResponseList; + const backupCache = [...cache]; + const addedItems = []; + const resultList = []; + try { + for (const operation of operations) { + if (operation.type !== "delete" && operation.type !== "put") { + throw webidl.errors.exception({ + header: "Cache.#batchCacheOperations", + message: 'operation type does not match "delete" or "put"' + }); + } + if (operation.type === "delete" && operation.response != null) { + throw webidl.errors.exception({ + header: "Cache.#batchCacheOperations", + message: "delete operation should not have an associated response" + }); + } + if (this.#queryCache(operation.request, operation.options, addedItems).length) { + throw new DOMException("???", "InvalidStateError"); + } + let requestResponses; + if (operation.type === "delete") { + requestResponses = this.#queryCache(operation.request, operation.options); + if (requestResponses.length === 0) { + return []; + } + for (const requestResponse of requestResponses) { + const idx = cache.indexOf(requestResponse); + assert(idx !== -1); + cache.splice(idx, 1); + } + } else if (operation.type === "put") { + if (operation.response == null) { + throw webidl.errors.exception({ + header: "Cache.#batchCacheOperations", + message: "put operation should have an associated response" + }); + } + const r = operation.request; + if (!urlIsHttpHttpsScheme(r.url)) { + throw webidl.errors.exception({ + header: "Cache.#batchCacheOperations", + message: "expected http or https scheme" + }); + } + if (r.method !== "GET") { + throw webidl.errors.exception({ + header: "Cache.#batchCacheOperations", + message: "not get method" + }); + } + if (operation.options != null) { + throw webidl.errors.exception({ + header: "Cache.#batchCacheOperations", + message: "options must not be defined" + }); + } + requestResponses = this.#queryCache(operation.request); + for (const requestResponse of requestResponses) { + const idx = cache.indexOf(requestResponse); + assert(idx !== -1); + cache.splice(idx, 1); + } + cache.push([operation.request, operation.response]); + addedItems.push([operation.request, operation.response]); + } + resultList.push([operation.request, operation.response]); + } + return resultList; + } catch (e) { + this.#relevantRequestResponseList.length = 0; + this.#relevantRequestResponseList = backupCache; + throw e; + } + } + #queryCache(requestQuery, options, targetStorage) { + const resultList = []; + const storage = targetStorage ?? this.#relevantRequestResponseList; + for (const requestResponse of storage) { + const [cachedRequest, cachedResponse] = requestResponse; + if (this.#requestMatchesCachedItem(requestQuery, cachedRequest, cachedResponse, options)) { + resultList.push(requestResponse); + } + } + return resultList; + } + #requestMatchesCachedItem(requestQuery, request, response = null, options) { + const queryURL = new URL(requestQuery.url); + const cachedURL = new URL(request.url); + if (options?.ignoreSearch) { + cachedURL.search = ""; + queryURL.search = ""; + } + if (!urlEquals(queryURL, cachedURL, true)) { + return false; + } + if (response == null || options?.ignoreVary || !response.headersList.contains("vary")) { + return true; + } + const fieldValues = getFieldValues(response.headersList.get("vary")); + for (const fieldValue of fieldValues) { + if (fieldValue === "*") { + return false; + } + const requestValue = request.headersList.get(fieldValue); + const queryValue = requestQuery.headersList.get(fieldValue); + if (requestValue !== queryValue) { + return false; + } + } + return true; + } + } + Object.defineProperties(Cache.prototype, { + [Symbol.toStringTag]: { + value: "Cache", + configurable: true + }, + match: kEnumerableProperty, + matchAll: kEnumerableProperty, + add: kEnumerableProperty, + addAll: kEnumerableProperty, + put: kEnumerableProperty, + delete: kEnumerableProperty, + keys: kEnumerableProperty + }); + var cacheQueryOptionConverters = [ + { + key: "ignoreSearch", + converter: webidl.converters.boolean, + defaultValue: false + }, + { + key: "ignoreMethod", + converter: webidl.converters.boolean, + defaultValue: false + }, + { + key: "ignoreVary", + converter: webidl.converters.boolean, + defaultValue: false + } + ]; + webidl.converters.CacheQueryOptions = webidl.dictionaryConverter(cacheQueryOptionConverters); + webidl.converters.MultiCacheQueryOptions = webidl.dictionaryConverter([ + ...cacheQueryOptionConverters, + { + key: "cacheName", + converter: webidl.converters.DOMString + } + ]); + webidl.converters.Response = webidl.interfaceConverter(Response); + webidl.converters["sequence"] = webidl.sequenceConverter(webidl.converters.RequestInfo); + module2.exports = { + Cache + }; +}); + +// node_modules/undici/lib/cache/cachestorage.js +var require_cachestorage = __commonJS((exports2, module2) => { + var { kConstruct } = require_symbols4(); + var { Cache } = require_cache(); + var { webidl } = require_webidl(); + var { kEnumerableProperty } = require_util(); + + class CacheStorage { + #caches = new Map; + constructor() { + if (arguments[0] !== kConstruct) { + webidl.illegalConstructor(); + } + } + async match(request, options = {}) { + webidl.brandCheck(this, CacheStorage); + webidl.argumentLengthCheck(arguments, 1, { header: "CacheStorage.match" }); + request = webidl.converters.RequestInfo(request); + options = webidl.converters.MultiCacheQueryOptions(options); + if (options.cacheName != null) { + if (this.#caches.has(options.cacheName)) { + const cacheList = this.#caches.get(options.cacheName); + const cache = new Cache(kConstruct, cacheList); + return await cache.match(request, options); + } + } else { + for (const cacheList of this.#caches.values()) { + const cache = new Cache(kConstruct, cacheList); + const response = await cache.match(request, options); + if (response !== undefined) { + return response; + } + } + } + } + async has(cacheName) { + webidl.brandCheck(this, CacheStorage); + webidl.argumentLengthCheck(arguments, 1, { header: "CacheStorage.has" }); + cacheName = webidl.converters.DOMString(cacheName); + return this.#caches.has(cacheName); + } + async open(cacheName) { + webidl.brandCheck(this, CacheStorage); + webidl.argumentLengthCheck(arguments, 1, { header: "CacheStorage.open" }); + cacheName = webidl.converters.DOMString(cacheName); + if (this.#caches.has(cacheName)) { + const cache2 = this.#caches.get(cacheName); + return new Cache(kConstruct, cache2); + } + const cache = []; + this.#caches.set(cacheName, cache); + return new Cache(kConstruct, cache); + } + async delete(cacheName) { + webidl.brandCheck(this, CacheStorage); + webidl.argumentLengthCheck(arguments, 1, { header: "CacheStorage.delete" }); + cacheName = webidl.converters.DOMString(cacheName); + return this.#caches.delete(cacheName); + } + async keys() { + webidl.brandCheck(this, CacheStorage); + const keys = this.#caches.keys(); + return [...keys]; + } + } + Object.defineProperties(CacheStorage.prototype, { + [Symbol.toStringTag]: { + value: "CacheStorage", + configurable: true + }, + match: kEnumerableProperty, + has: kEnumerableProperty, + open: kEnumerableProperty, + delete: kEnumerableProperty, + keys: kEnumerableProperty + }); + module2.exports = { + CacheStorage + }; +}); + +// node_modules/undici/lib/cookies/constants.js +var require_constants4 = __commonJS((exports2, module2) => { + var maxAttributeValueSize = 1024; + var maxNameValuePairSize = 4096; + module2.exports = { + maxAttributeValueSize, + maxNameValuePairSize + }; +}); + +// node_modules/undici/lib/cookies/util.js +var require_util6 = __commonJS((exports2, module2) => { + var assert = require("assert"); + var { kHeadersList } = require_symbols(); + function isCTLExcludingHtab(value) { + if (value.length === 0) { + return false; + } + for (const char of value) { + const code = char.charCodeAt(0); + if (code >= 0 || code <= 8 || (code >= 10 || code <= 31) || code === 127) { + return false; + } + } + } + function validateCookieName(name) { + for (const char of name) { + const code = char.charCodeAt(0); + if (code <= 32 || code > 127 || char === "(" || char === ")" || char === ">" || char === "<" || char === "@" || char === "," || char === ";" || char === ":" || char === "\\" || char === '"' || char === "/" || char === "[" || char === "]" || char === "?" || char === "=" || char === "{" || char === "}") { + throw new Error("Invalid cookie name"); + } + } + } + function validateCookieValue(value) { + for (const char of value) { + const code = char.charCodeAt(0); + if (code < 33 || code === 34 || code === 44 || code === 59 || code === 92 || code > 126) { + throw new Error("Invalid header value"); + } + } + } + function validateCookiePath(path) { + for (const char of path) { + const code = char.charCodeAt(0); + if (code < 33 || char === ";") { + throw new Error("Invalid cookie path"); + } + } + } + function validateCookieDomain(domain) { + if (domain.startsWith("-") || domain.endsWith(".") || domain.endsWith("-")) { + throw new Error("Invalid cookie domain"); + } + } + function toIMFDate(date) { + if (typeof date === "number") { + date = new Date(date); + } + const days = [ + "Sun", + "Mon", + "Tue", + "Wed", + "Thu", + "Fri", + "Sat" + ]; + const months = [ + "Jan", + "Feb", + "Mar", + "Apr", + "May", + "Jun", + "Jul", + "Aug", + "Sep", + "Oct", + "Nov", + "Dec" + ]; + const dayName = days[date.getUTCDay()]; + const day = date.getUTCDate().toString().padStart(2, "0"); + const month = months[date.getUTCMonth()]; + const year = date.getUTCFullYear(); + const hour = date.getUTCHours().toString().padStart(2, "0"); + const minute = date.getUTCMinutes().toString().padStart(2, "0"); + const second = date.getUTCSeconds().toString().padStart(2, "0"); + return `${dayName}, ${day} ${month} ${year} ${hour}:${minute}:${second} GMT`; + } + function validateCookieMaxAge(maxAge) { + if (maxAge < 0) { + throw new Error("Invalid cookie max-age"); + } + } + function stringify(cookie) { + if (cookie.name.length === 0) { + return null; + } + validateCookieName(cookie.name); + validateCookieValue(cookie.value); + const out = [`${cookie.name}=${cookie.value}`]; + if (cookie.name.startsWith("__Secure-")) { + cookie.secure = true; + } + if (cookie.name.startsWith("__Host-")) { + cookie.secure = true; + cookie.domain = null; + cookie.path = "/"; + } + if (cookie.secure) { + out.push("Secure"); + } + if (cookie.httpOnly) { + out.push("HttpOnly"); + } + if (typeof cookie.maxAge === "number") { + validateCookieMaxAge(cookie.maxAge); + out.push(`Max-Age=${cookie.maxAge}`); + } + if (cookie.domain) { + validateCookieDomain(cookie.domain); + out.push(`Domain=${cookie.domain}`); + } + if (cookie.path) { + validateCookiePath(cookie.path); + out.push(`Path=${cookie.path}`); + } + if (cookie.expires && cookie.expires.toString() !== "Invalid Date") { + out.push(`Expires=${toIMFDate(cookie.expires)}`); + } + if (cookie.sameSite) { + out.push(`SameSite=${cookie.sameSite}`); + } + for (const part of cookie.unparsed) { + if (!part.includes("=")) { + throw new Error("Invalid unparsed"); + } + const [key, ...value] = part.split("="); + out.push(`${key.trim()}=${value.join("=")}`); + } + return out.join("; "); + } + var kHeadersListNode; + function getHeadersList(headers) { + if (headers[kHeadersList]) { + return headers[kHeadersList]; + } + if (!kHeadersListNode) { + kHeadersListNode = Object.getOwnPropertySymbols(headers).find((symbol) => symbol.description === "headers list"); + assert(kHeadersListNode, "Headers cannot be parsed"); + } + const headersList = headers[kHeadersListNode]; + assert(headersList); + return headersList; + } + module2.exports = { + isCTLExcludingHtab, + stringify, + getHeadersList + }; +}); + +// node_modules/undici/lib/cookies/parse.js +var require_parse = __commonJS((exports2, module2) => { + var { maxNameValuePairSize, maxAttributeValueSize } = require_constants4(); + var { isCTLExcludingHtab } = require_util6(); + var { collectASequenceOfCodePointsFast } = require_dataURL(); + var assert = require("assert"); + function parseSetCookie(header) { + if (isCTLExcludingHtab(header)) { + return null; + } + let nameValuePair = ""; + let unparsedAttributes = ""; + let name = ""; + let value = ""; + if (header.includes(";")) { + const position = { position: 0 }; + nameValuePair = collectASequenceOfCodePointsFast(";", header, position); + unparsedAttributes = header.slice(position.position); + } else { + nameValuePair = header; + } + if (!nameValuePair.includes("=")) { + value = nameValuePair; + } else { + const position = { position: 0 }; + name = collectASequenceOfCodePointsFast("=", nameValuePair, position); + value = nameValuePair.slice(position.position + 1); + } + name = name.trim(); + value = value.trim(); + if (name.length + value.length > maxNameValuePairSize) { + return null; + } + return { + name, + value, + ...parseUnparsedAttributes(unparsedAttributes) + }; + } + function parseUnparsedAttributes(unparsedAttributes, cookieAttributeList = {}) { + if (unparsedAttributes.length === 0) { + return cookieAttributeList; + } + assert(unparsedAttributes[0] === ";"); + unparsedAttributes = unparsedAttributes.slice(1); + let cookieAv = ""; + if (unparsedAttributes.includes(";")) { + cookieAv = collectASequenceOfCodePointsFast(";", unparsedAttributes, { position: 0 }); + unparsedAttributes = unparsedAttributes.slice(cookieAv.length); + } else { + cookieAv = unparsedAttributes; + unparsedAttributes = ""; + } + let attributeName = ""; + let attributeValue = ""; + if (cookieAv.includes("=")) { + const position = { position: 0 }; + attributeName = collectASequenceOfCodePointsFast("=", cookieAv, position); + attributeValue = cookieAv.slice(position.position + 1); + } else { + attributeName = cookieAv; + } + attributeName = attributeName.trim(); + attributeValue = attributeValue.trim(); + if (attributeValue.length > maxAttributeValueSize) { + return parseUnparsedAttributes(unparsedAttributes, cookieAttributeList); + } + const attributeNameLowercase = attributeName.toLowerCase(); + if (attributeNameLowercase === "expires") { + const expiryTime = new Date(attributeValue); + cookieAttributeList.expires = expiryTime; + } else if (attributeNameLowercase === "max-age") { + const charCode = attributeValue.charCodeAt(0); + if ((charCode < 48 || charCode > 57) && attributeValue[0] !== "-") { + return parseUnparsedAttributes(unparsedAttributes, cookieAttributeList); + } + if (!/^\d+$/.test(attributeValue)) { + return parseUnparsedAttributes(unparsedAttributes, cookieAttributeList); + } + const deltaSeconds = Number(attributeValue); + cookieAttributeList.maxAge = deltaSeconds; + } else if (attributeNameLowercase === "domain") { + let cookieDomain = attributeValue; + if (cookieDomain[0] === ".") { + cookieDomain = cookieDomain.slice(1); + } + cookieDomain = cookieDomain.toLowerCase(); + cookieAttributeList.domain = cookieDomain; + } else if (attributeNameLowercase === "path") { + let cookiePath = ""; + if (attributeValue.length === 0 || attributeValue[0] !== "/") { + cookiePath = "/"; + } else { + cookiePath = attributeValue; + } + cookieAttributeList.path = cookiePath; + } else if (attributeNameLowercase === "secure") { + cookieAttributeList.secure = true; + } else if (attributeNameLowercase === "httponly") { + cookieAttributeList.httpOnly = true; + } else if (attributeNameLowercase === "samesite") { + let enforcement = "Default"; + const attributeValueLowercase = attributeValue.toLowerCase(); + if (attributeValueLowercase.includes("none")) { + enforcement = "None"; + } + if (attributeValueLowercase.includes("strict")) { + enforcement = "Strict"; + } + if (attributeValueLowercase.includes("lax")) { + enforcement = "Lax"; + } + cookieAttributeList.sameSite = enforcement; + } else { + cookieAttributeList.unparsed ??= []; + cookieAttributeList.unparsed.push(`${attributeName}=${attributeValue}`); + } + return parseUnparsedAttributes(unparsedAttributes, cookieAttributeList); + } + module2.exports = { + parseSetCookie, + parseUnparsedAttributes + }; +}); + +// node_modules/undici/lib/cookies/index.js +var require_cookies = __commonJS((exports2, module2) => { + var { parseSetCookie } = require_parse(); + var { stringify, getHeadersList } = require_util6(); + var { webidl } = require_webidl(); + var { Headers: Headers2 } = require_headers(); + function getCookies(headers) { + webidl.argumentLengthCheck(arguments, 1, { header: "getCookies" }); + webidl.brandCheck(headers, Headers2, { strict: false }); + const cookie = headers.get("cookie"); + const out = {}; + if (!cookie) { + return out; + } + for (const piece of cookie.split(";")) { + const [name, ...value] = piece.split("="); + out[name.trim()] = value.join("="); + } + return out; + } + function deleteCookie(headers, name, attributes) { + webidl.argumentLengthCheck(arguments, 2, { header: "deleteCookie" }); + webidl.brandCheck(headers, Headers2, { strict: false }); + name = webidl.converters.DOMString(name); + attributes = webidl.converters.DeleteCookieAttributes(attributes); + setCookie(headers, { + name, + value: "", + expires: new Date(0), + ...attributes + }); + } + function getSetCookies(headers) { + webidl.argumentLengthCheck(arguments, 1, { header: "getSetCookies" }); + webidl.brandCheck(headers, Headers2, { strict: false }); + const cookies = getHeadersList(headers).cookies; + if (!cookies) { + return []; + } + return cookies.map((pair) => parseSetCookie(Array.isArray(pair) ? pair[1] : pair)); + } + function setCookie(headers, cookie) { + webidl.argumentLengthCheck(arguments, 2, { header: "setCookie" }); + webidl.brandCheck(headers, Headers2, { strict: false }); + cookie = webidl.converters.Cookie(cookie); + const str = stringify(cookie); + if (str) { + headers.append("Set-Cookie", stringify(cookie)); + } + } + webidl.converters.DeleteCookieAttributes = webidl.dictionaryConverter([ + { + converter: webidl.nullableConverter(webidl.converters.DOMString), + key: "path", + defaultValue: null + }, + { + converter: webidl.nullableConverter(webidl.converters.DOMString), + key: "domain", + defaultValue: null + } + ]); + webidl.converters.Cookie = webidl.dictionaryConverter([ + { + converter: webidl.converters.DOMString, + key: "name" + }, + { + converter: webidl.converters.DOMString, + key: "value" + }, + { + converter: webidl.nullableConverter((value) => { + if (typeof value === "number") { + return webidl.converters["unsigned long long"](value); + } + return new Date(value); + }), + key: "expires", + defaultValue: null + }, + { + converter: webidl.nullableConverter(webidl.converters["long long"]), + key: "maxAge", + defaultValue: null + }, + { + converter: webidl.nullableConverter(webidl.converters.DOMString), + key: "domain", + defaultValue: null + }, + { + converter: webidl.nullableConverter(webidl.converters.DOMString), + key: "path", + defaultValue: null + }, + { + converter: webidl.nullableConverter(webidl.converters.boolean), + key: "secure", + defaultValue: null + }, + { + converter: webidl.nullableConverter(webidl.converters.boolean), + key: "httpOnly", + defaultValue: null + }, + { + converter: webidl.converters.USVString, + key: "sameSite", + allowedValues: ["Strict", "Lax", "None"] + }, + { + converter: webidl.sequenceConverter(webidl.converters.DOMString), + key: "unparsed", + defaultValue: [] + } + ]); + module2.exports = { + getCookies, + deleteCookie, + getSetCookies, + setCookie + }; +}); + +// node_modules/undici/lib/websocket/constants.js +var require_constants5 = __commonJS((exports2, module2) => { + var uid = "258EAFA5-E914-47DA-95CA-C5AB0DC85B11"; + var staticPropertyDescriptors = { + enumerable: true, + writable: false, + configurable: false + }; + var states = { + CONNECTING: 0, + OPEN: 1, + CLOSING: 2, + CLOSED: 3 + }; + var opcodes = { + CONTINUATION: 0, + TEXT: 1, + BINARY: 2, + CLOSE: 8, + PING: 9, + PONG: 10 + }; + var maxUnsigned16Bit = 2 ** 16 - 1; + var parserStates = { + INFO: 0, + PAYLOADLENGTH_16: 2, + PAYLOADLENGTH_64: 3, + READ_DATA: 4 + }; + var emptyBuffer = Buffer.allocUnsafe(0); + module2.exports = { + uid, + staticPropertyDescriptors, + states, + opcodes, + maxUnsigned16Bit, + parserStates, + emptyBuffer + }; +}); + +// node_modules/undici/lib/websocket/symbols.js +var require_symbols5 = __commonJS((exports2, module2) => { + module2.exports = { + kWebSocketURL: Symbol("url"), + kReadyState: Symbol("ready state"), + kController: Symbol("controller"), + kResponse: Symbol("response"), + kBinaryType: Symbol("binary type"), + kSentClose: Symbol("sent close"), + kReceivedClose: Symbol("received close"), + kByteParser: Symbol("byte parser") + }; +}); + +// node_modules/undici/lib/websocket/events.js +var require_events = __commonJS((exports2, module2) => { + var { webidl } = require_webidl(); + var { kEnumerableProperty } = require_util(); + var { MessagePort } = require("worker_threads"); + + class MessageEvent extends Event { + #eventInit; + constructor(type, eventInitDict = {}) { + webidl.argumentLengthCheck(arguments, 1, { header: "MessageEvent constructor" }); + type = webidl.converters.DOMString(type); + eventInitDict = webidl.converters.MessageEventInit(eventInitDict); + super(type, eventInitDict); + this.#eventInit = eventInitDict; + } + get data() { + webidl.brandCheck(this, MessageEvent); + return this.#eventInit.data; + } + get origin() { + webidl.brandCheck(this, MessageEvent); + return this.#eventInit.origin; + } + get lastEventId() { + webidl.brandCheck(this, MessageEvent); + return this.#eventInit.lastEventId; + } + get source() { + webidl.brandCheck(this, MessageEvent); + return this.#eventInit.source; + } + get ports() { + webidl.brandCheck(this, MessageEvent); + if (!Object.isFrozen(this.#eventInit.ports)) { + Object.freeze(this.#eventInit.ports); + } + return this.#eventInit.ports; + } + initMessageEvent(type, bubbles = false, cancelable = false, data = null, origin = "", lastEventId = "", source = null, ports = []) { + webidl.brandCheck(this, MessageEvent); + webidl.argumentLengthCheck(arguments, 1, { header: "MessageEvent.initMessageEvent" }); + return new MessageEvent(type, { + bubbles, + cancelable, + data, + origin, + lastEventId, + source, + ports + }); + } + } + + class CloseEvent extends Event { + #eventInit; + constructor(type, eventInitDict = {}) { + webidl.argumentLengthCheck(arguments, 1, { header: "CloseEvent constructor" }); + type = webidl.converters.DOMString(type); + eventInitDict = webidl.converters.CloseEventInit(eventInitDict); + super(type, eventInitDict); + this.#eventInit = eventInitDict; + } + get wasClean() { + webidl.brandCheck(this, CloseEvent); + return this.#eventInit.wasClean; + } + get code() { + webidl.brandCheck(this, CloseEvent); + return this.#eventInit.code; + } + get reason() { + webidl.brandCheck(this, CloseEvent); + return this.#eventInit.reason; + } + } + + class ErrorEvent extends Event { + #eventInit; + constructor(type, eventInitDict) { + webidl.argumentLengthCheck(arguments, 1, { header: "ErrorEvent constructor" }); + super(type, eventInitDict); + type = webidl.converters.DOMString(type); + eventInitDict = webidl.converters.ErrorEventInit(eventInitDict ?? {}); + this.#eventInit = eventInitDict; + } + get message() { + webidl.brandCheck(this, ErrorEvent); + return this.#eventInit.message; + } + get filename() { + webidl.brandCheck(this, ErrorEvent); + return this.#eventInit.filename; + } + get lineno() { + webidl.brandCheck(this, ErrorEvent); + return this.#eventInit.lineno; + } + get colno() { + webidl.brandCheck(this, ErrorEvent); + return this.#eventInit.colno; + } + get error() { + webidl.brandCheck(this, ErrorEvent); + return this.#eventInit.error; + } + } + Object.defineProperties(MessageEvent.prototype, { + [Symbol.toStringTag]: { + value: "MessageEvent", + configurable: true + }, + data: kEnumerableProperty, + origin: kEnumerableProperty, + lastEventId: kEnumerableProperty, + source: kEnumerableProperty, + ports: kEnumerableProperty, + initMessageEvent: kEnumerableProperty + }); + Object.defineProperties(CloseEvent.prototype, { + [Symbol.toStringTag]: { + value: "CloseEvent", + configurable: true + }, + reason: kEnumerableProperty, + code: kEnumerableProperty, + wasClean: kEnumerableProperty + }); + Object.defineProperties(ErrorEvent.prototype, { + [Symbol.toStringTag]: { + value: "ErrorEvent", + configurable: true + }, + message: kEnumerableProperty, + filename: kEnumerableProperty, + lineno: kEnumerableProperty, + colno: kEnumerableProperty, + error: kEnumerableProperty + }); + webidl.converters.MessagePort = webidl.interfaceConverter(MessagePort); + webidl.converters["sequence"] = webidl.sequenceConverter(webidl.converters.MessagePort); + var eventInit = [ + { + key: "bubbles", + converter: webidl.converters.boolean, + defaultValue: false + }, + { + key: "cancelable", + converter: webidl.converters.boolean, + defaultValue: false + }, + { + key: "composed", + converter: webidl.converters.boolean, + defaultValue: false + } + ]; + webidl.converters.MessageEventInit = webidl.dictionaryConverter([ + ...eventInit, + { + key: "data", + converter: webidl.converters.any, + defaultValue: null + }, + { + key: "origin", + converter: webidl.converters.USVString, + defaultValue: "" + }, + { + key: "lastEventId", + converter: webidl.converters.DOMString, + defaultValue: "" + }, + { + key: "source", + converter: webidl.nullableConverter(webidl.converters.MessagePort), + defaultValue: null + }, + { + key: "ports", + converter: webidl.converters["sequence"], + get defaultValue() { + return []; + } + } + ]); + webidl.converters.CloseEventInit = webidl.dictionaryConverter([ + ...eventInit, + { + key: "wasClean", + converter: webidl.converters.boolean, + defaultValue: false + }, + { + key: "code", + converter: webidl.converters["unsigned short"], + defaultValue: 0 + }, + { + key: "reason", + converter: webidl.converters.USVString, + defaultValue: "" + } + ]); + webidl.converters.ErrorEventInit = webidl.dictionaryConverter([ + ...eventInit, + { + key: "message", + converter: webidl.converters.DOMString, + defaultValue: "" + }, + { + key: "filename", + converter: webidl.converters.USVString, + defaultValue: "" + }, + { + key: "lineno", + converter: webidl.converters["unsigned long"], + defaultValue: 0 + }, + { + key: "colno", + converter: webidl.converters["unsigned long"], + defaultValue: 0 + }, + { + key: "error", + converter: webidl.converters.any + } + ]); + module2.exports = { + MessageEvent, + CloseEvent, + ErrorEvent + }; +}); + +// node_modules/undici/lib/websocket/util.js +var require_util7 = __commonJS((exports2, module2) => { + var { kReadyState, kController, kResponse, kBinaryType, kWebSocketURL } = require_symbols5(); + var { states, opcodes } = require_constants5(); + var { MessageEvent, ErrorEvent } = require_events(); + function isEstablished(ws) { + return ws[kReadyState] === states.OPEN; + } + function isClosing(ws) { + return ws[kReadyState] === states.CLOSING; + } + function isClosed(ws) { + return ws[kReadyState] === states.CLOSED; + } + function fireEvent(e, target, eventConstructor = Event, eventInitDict) { + const event = new eventConstructor(e, eventInitDict); + target.dispatchEvent(event); + } + function websocketMessageReceived(ws, type, data) { + if (ws[kReadyState] !== states.OPEN) { + return; + } + let dataForEvent; + if (type === opcodes.TEXT) { + try { + dataForEvent = new TextDecoder("utf-8", { fatal: true }).decode(data); + } catch { + failWebsocketConnection(ws, "Received invalid UTF-8 in text frame."); + return; + } + } else if (type === opcodes.BINARY) { + if (ws[kBinaryType] === "blob") { + dataForEvent = new Blob([data]); + } else { + dataForEvent = new Uint8Array(data).buffer; + } + } + fireEvent("message", ws, MessageEvent, { + origin: ws[kWebSocketURL].origin, + data: dataForEvent + }); + } + function isValidSubprotocol(protocol) { + if (protocol.length === 0) { + return false; + } + for (const char of protocol) { + const code = char.charCodeAt(0); + if (code < 33 || code > 126 || char === "(" || char === ")" || char === "<" || char === ">" || char === "@" || char === "," || char === ";" || char === ":" || char === "\\" || char === '"' || char === "/" || char === "[" || char === "]" || char === "?" || char === "=" || char === "{" || char === "}" || code === 32 || code === 9) { + return false; + } + } + return true; + } + function isValidStatusCode(code) { + if (code >= 1000 && code < 1015) { + return code !== 1004 && code !== 1005 && code !== 1006; + } + return code >= 3000 && code <= 4999; + } + function failWebsocketConnection(ws, reason) { + const { [kController]: controller, [kResponse]: response } = ws; + controller.abort(); + if (response?.socket && !response.socket.destroyed) { + response.socket.destroy(); + } + if (reason) { + fireEvent("error", ws, ErrorEvent, { + error: new Error(reason) + }); + } + } + module2.exports = { + isEstablished, + isClosing, + isClosed, + fireEvent, + isValidSubprotocol, + isValidStatusCode, + failWebsocketConnection, + websocketMessageReceived + }; +}); + +// node_modules/undici/lib/websocket/connection.js +var require_connection = __commonJS((exports2, module2) => { + var diagnosticsChannel = require("diagnostics_channel"); + var { uid, states } = require_constants5(); + var { + kReadyState, + kSentClose, + kByteParser, + kReceivedClose + } = require_symbols5(); + var { fireEvent, failWebsocketConnection } = require_util7(); + var { CloseEvent } = require_events(); + var { makeRequest } = require_request2(); + var { fetching } = require_fetch(); + var { Headers: Headers2 } = require_headers(); + var { getGlobalDispatcher } = require_global2(); + var { kHeadersList } = require_symbols(); + var channels = {}; + channels.open = diagnosticsChannel.channel("undici:websocket:open"); + channels.close = diagnosticsChannel.channel("undici:websocket:close"); + channels.socketError = diagnosticsChannel.channel("undici:websocket:socket_error"); + var crypto; + try { + crypto = require("crypto"); + } catch { + } + function establishWebSocketConnection(url, protocols, ws, onEstablish, options) { + const requestURL = url; + requestURL.protocol = url.protocol === "ws:" ? "http:" : "https:"; + const request = makeRequest({ + urlList: [requestURL], + serviceWorkers: "none", + referrer: "no-referrer", + mode: "websocket", + credentials: "include", + cache: "no-store", + redirect: "error" + }); + if (options.headers) { + const headersList = new Headers2(options.headers)[kHeadersList]; + request.headersList = headersList; + } + const keyValue = crypto.randomBytes(16).toString("base64"); + request.headersList.append("sec-websocket-key", keyValue); + request.headersList.append("sec-websocket-version", "13"); + for (const protocol of protocols) { + request.headersList.append("sec-websocket-protocol", protocol); + } + const permessageDeflate = ""; + const controller = fetching({ + request, + useParallelQueue: true, + dispatcher: options.dispatcher ?? getGlobalDispatcher(), + processResponse(response) { + if (response.type === "error" || response.status !== 101) { + failWebsocketConnection(ws, "Received network error or non-101 status code."); + return; + } + if (protocols.length !== 0 && !response.headersList.get("Sec-WebSocket-Protocol")) { + failWebsocketConnection(ws, "Server did not respond with sent protocols."); + return; + } + if (response.headersList.get("Upgrade")?.toLowerCase() !== "websocket") { + failWebsocketConnection(ws, 'Server did not set Upgrade header to "websocket".'); + return; + } + if (response.headersList.get("Connection")?.toLowerCase() !== "upgrade") { + failWebsocketConnection(ws, 'Server did not set Connection header to "upgrade".'); + return; + } + const secWSAccept = response.headersList.get("Sec-WebSocket-Accept"); + const digest = crypto.createHash("sha1").update(keyValue + uid).digest("base64"); + if (secWSAccept !== digest) { + failWebsocketConnection(ws, "Incorrect hash received in Sec-WebSocket-Accept header."); + return; + } + const secExtension = response.headersList.get("Sec-WebSocket-Extensions"); + if (secExtension !== null && secExtension !== permessageDeflate) { + failWebsocketConnection(ws, "Received different permessage-deflate than the one set."); + return; + } + const secProtocol = response.headersList.get("Sec-WebSocket-Protocol"); + if (secProtocol !== null && secProtocol !== request.headersList.get("Sec-WebSocket-Protocol")) { + failWebsocketConnection(ws, "Protocol was not set in the opening handshake."); + return; + } + response.socket.on("data", onSocketData); + response.socket.on("close", onSocketClose); + response.socket.on("error", onSocketError); + if (channels.open.hasSubscribers) { + channels.open.publish({ + address: response.socket.address(), + protocol: secProtocol, + extensions: secExtension + }); + } + onEstablish(response); + } + }); + return controller; + } + function onSocketData(chunk) { + if (!this.ws[kByteParser].write(chunk)) { + this.pause(); + } + } + function onSocketClose() { + const { ws } = this; + const wasClean = ws[kSentClose] && ws[kReceivedClose]; + let code = 1005; + let reason = ""; + const result = ws[kByteParser].closingInfo; + if (result) { + code = result.code ?? 1005; + reason = result.reason; + } else if (!ws[kSentClose]) { + code = 1006; + } + ws[kReadyState] = states.CLOSED; + fireEvent("close", ws, CloseEvent, { + wasClean, + code, + reason + }); + if (channels.close.hasSubscribers) { + channels.close.publish({ + websocket: ws, + code, + reason + }); + } + } + function onSocketError(error) { + const { ws } = this; + ws[kReadyState] = states.CLOSING; + if (channels.socketError.hasSubscribers) { + channels.socketError.publish(error); + } + this.destroy(); + } + module2.exports = { + establishWebSocketConnection + }; +}); + +// node_modules/undici/lib/websocket/frame.js +var require_frame = __commonJS((exports2, module2) => { + var { maxUnsigned16Bit } = require_constants5(); + var crypto; + try { + crypto = require("crypto"); + } catch { + } + + class WebsocketFrameSend { + constructor(data) { + this.frameData = data; + this.maskKey = crypto.randomBytes(4); + } + createFrame(opcode) { + const bodyLength = this.frameData?.byteLength ?? 0; + let payloadLength = bodyLength; + let offset = 6; + if (bodyLength > maxUnsigned16Bit) { + offset += 8; + payloadLength = 127; + } else if (bodyLength > 125) { + offset += 2; + payloadLength = 126; + } + const buffer = Buffer.allocUnsafe(bodyLength + offset); + buffer[0] = buffer[1] = 0; + buffer[0] |= 128; + buffer[0] = (buffer[0] & 240) + opcode; + /*! ws. MIT License. Einar Otto Stangvik */ + buffer[offset - 4] = this.maskKey[0]; + buffer[offset - 3] = this.maskKey[1]; + buffer[offset - 2] = this.maskKey[2]; + buffer[offset - 1] = this.maskKey[3]; + buffer[1] = payloadLength; + if (payloadLength === 126) { + buffer.writeUInt16BE(bodyLength, 2); + } else if (payloadLength === 127) { + buffer[2] = buffer[3] = 0; + buffer.writeUIntBE(bodyLength, 4, 6); + } + buffer[1] |= 128; + for (let i = 0;i < bodyLength; i++) { + buffer[offset + i] = this.frameData[i] ^ this.maskKey[i % 4]; + } + return buffer; + } + } + module2.exports = { + WebsocketFrameSend + }; +}); + +// node_modules/undici/lib/websocket/receiver.js +var require_receiver = __commonJS((exports2, module2) => { + var { Writable } = require("stream"); + var diagnosticsChannel = require("diagnostics_channel"); + var { parserStates, opcodes, states, emptyBuffer } = require_constants5(); + var { kReadyState, kSentClose, kResponse, kReceivedClose } = require_symbols5(); + var { isValidStatusCode, failWebsocketConnection, websocketMessageReceived } = require_util7(); + var { WebsocketFrameSend } = require_frame(); + var channels = {}; + channels.ping = diagnosticsChannel.channel("undici:websocket:ping"); + channels.pong = diagnosticsChannel.channel("undici:websocket:pong"); + + class ByteParser extends Writable { + #buffers = []; + #byteOffset = 0; + #state = parserStates.INFO; + #info = {}; + #fragments = []; + constructor(ws) { + super(); + this.ws = ws; + } + _write(chunk, _2, callback) { + this.#buffers.push(chunk); + this.#byteOffset += chunk.length; + this.run(callback); + } + run(callback) { + while (true) { + if (this.#state === parserStates.INFO) { + if (this.#byteOffset < 2) { + return callback(); + } + const buffer = this.consume(2); + this.#info.fin = (buffer[0] & 128) !== 0; + this.#info.opcode = buffer[0] & 15; + this.#info.originalOpcode ??= this.#info.opcode; + this.#info.fragmented = !this.#info.fin && this.#info.opcode !== opcodes.CONTINUATION; + if (this.#info.fragmented && this.#info.opcode !== opcodes.BINARY && this.#info.opcode !== opcodes.TEXT) { + failWebsocketConnection(this.ws, "Invalid frame type was fragmented."); + return; + } + const payloadLength = buffer[1] & 127; + if (payloadLength <= 125) { + this.#info.payloadLength = payloadLength; + this.#state = parserStates.READ_DATA; + } else if (payloadLength === 126) { + this.#state = parserStates.PAYLOADLENGTH_16; + } else if (payloadLength === 127) { + this.#state = parserStates.PAYLOADLENGTH_64; + } + if (this.#info.fragmented && payloadLength > 125) { + failWebsocketConnection(this.ws, "Fragmented frame exceeded 125 bytes."); + return; + } else if ((this.#info.opcode === opcodes.PING || this.#info.opcode === opcodes.PONG || this.#info.opcode === opcodes.CLOSE) && payloadLength > 125) { + failWebsocketConnection(this.ws, "Payload length for control frame exceeded 125 bytes."); + return; + } else if (this.#info.opcode === opcodes.CLOSE) { + if (payloadLength === 1) { + failWebsocketConnection(this.ws, "Received close frame with a 1-byte body."); + return; + } + const body = this.consume(payloadLength); + this.#info.closeInfo = this.parseCloseBody(false, body); + if (!this.ws[kSentClose]) { + const body2 = Buffer.allocUnsafe(2); + body2.writeUInt16BE(this.#info.closeInfo.code, 0); + const closeFrame = new WebsocketFrameSend(body2); + this.ws[kResponse].socket.write(closeFrame.createFrame(opcodes.CLOSE), (err) => { + if (!err) { + this.ws[kSentClose] = true; + } + }); + } + this.ws[kReadyState] = states.CLOSING; + this.ws[kReceivedClose] = true; + this.end(); + return; + } else if (this.#info.opcode === opcodes.PING) { + const body = this.consume(payloadLength); + if (!this.ws[kReceivedClose]) { + const frame = new WebsocketFrameSend(body); + this.ws[kResponse].socket.write(frame.createFrame(opcodes.PONG)); + if (channels.ping.hasSubscribers) { + channels.ping.publish({ + payload: body + }); + } + } + this.#state = parserStates.INFO; + if (this.#byteOffset > 0) { + continue; + } else { + callback(); + return; + } + } else if (this.#info.opcode === opcodes.PONG) { + const body = this.consume(payloadLength); + if (channels.pong.hasSubscribers) { + channels.pong.publish({ + payload: body + }); + } + if (this.#byteOffset > 0) { + continue; + } else { + callback(); + return; + } + } + } else if (this.#state === parserStates.PAYLOADLENGTH_16) { + if (this.#byteOffset < 2) { + return callback(); + } + const buffer = this.consume(2); + this.#info.payloadLength = buffer.readUInt16BE(0); + this.#state = parserStates.READ_DATA; + } else if (this.#state === parserStates.PAYLOADLENGTH_64) { + if (this.#byteOffset < 8) { + return callback(); + } + const buffer = this.consume(8); + const upper = buffer.readUInt32BE(0); + if (upper > 2 ** 31 - 1) { + failWebsocketConnection(this.ws, "Received payload length > 2^31 bytes."); + return; + } + const lower = buffer.readUInt32BE(4); + this.#info.payloadLength = (upper << 8) + lower; + this.#state = parserStates.READ_DATA; + } else if (this.#state === parserStates.READ_DATA) { + if (this.#byteOffset < this.#info.payloadLength) { + return callback(); + } else if (this.#byteOffset >= this.#info.payloadLength) { + const body = this.consume(this.#info.payloadLength); + this.#fragments.push(body); + if (!this.#info.fragmented || this.#info.fin && this.#info.opcode === opcodes.CONTINUATION) { + const fullMessage = Buffer.concat(this.#fragments); + websocketMessageReceived(this.ws, this.#info.originalOpcode, fullMessage); + this.#info = {}; + this.#fragments.length = 0; + } + this.#state = parserStates.INFO; + } + } + if (this.#byteOffset > 0) { + continue; + } else { + callback(); + break; + } + } + } + consume(n) { + if (n > this.#byteOffset) { + return null; + } else if (n === 0) { + return emptyBuffer; + } + if (this.#buffers[0].length === n) { + this.#byteOffset -= this.#buffers[0].length; + return this.#buffers.shift(); + } + const buffer = Buffer.allocUnsafe(n); + let offset = 0; + while (offset !== n) { + const next = this.#buffers[0]; + const { length } = next; + if (length + offset === n) { + buffer.set(this.#buffers.shift(), offset); + break; + } else if (length + offset > n) { + buffer.set(next.subarray(0, n - offset), offset); + this.#buffers[0] = next.subarray(n - offset); + break; + } else { + buffer.set(this.#buffers.shift(), offset); + offset += next.length; + } + } + this.#byteOffset -= n; + return buffer; + } + parseCloseBody(onlyCode, data) { + let code; + if (data.length >= 2) { + code = data.readUInt16BE(0); + } + if (onlyCode) { + if (!isValidStatusCode(code)) { + return null; + } + return { code }; + } + let reason = data.subarray(2); + if (reason[0] === 239 && reason[1] === 187 && reason[2] === 191) { + reason = reason.subarray(3); + } + if (code !== undefined && !isValidStatusCode(code)) { + return null; + } + try { + reason = new TextDecoder("utf-8", { fatal: true }).decode(reason); + } catch { + return null; + } + return { code, reason }; + } + get closingInfo() { + return this.#info.closeInfo; + } + } + module2.exports = { + ByteParser + }; +}); + +// node_modules/undici/lib/websocket/websocket.js +var require_websocket = __commonJS((exports2, module2) => { + var { webidl } = require_webidl(); + var { DOMException: DOMException2 } = require_constants2(); + var { URLSerializer } = require_dataURL(); + var { getGlobalOrigin } = require_global(); + var { staticPropertyDescriptors, states, opcodes, emptyBuffer } = require_constants5(); + var { + kWebSocketURL, + kReadyState, + kController, + kBinaryType, + kResponse, + kSentClose, + kByteParser + } = require_symbols5(); + var { isEstablished, isClosing, isValidSubprotocol, failWebsocketConnection, fireEvent } = require_util7(); + var { establishWebSocketConnection } = require_connection(); + var { WebsocketFrameSend } = require_frame(); + var { ByteParser } = require_receiver(); + var { kEnumerableProperty, isBlobLike } = require_util(); + var { getGlobalDispatcher } = require_global2(); + var { types } = require("util"); + var experimentalWarned = false; + + class WebSocket extends EventTarget { + #events = { + open: null, + error: null, + close: null, + message: null + }; + #bufferedAmount = 0; + #protocol = ""; + #extensions = ""; + constructor(url, protocols = []) { + super(); + webidl.argumentLengthCheck(arguments, 1, { header: "WebSocket constructor" }); + if (!experimentalWarned) { + experimentalWarned = true; + process.emitWarning("WebSockets are experimental, expect them to change at any time.", { + code: "UNDICI-WS" + }); + } + const options = webidl.converters["DOMString or sequence or WebSocketInit"](protocols); + url = webidl.converters.USVString(url); + protocols = options.protocols; + const baseURL = getGlobalOrigin(); + let urlRecord; + try { + urlRecord = new URL(url, baseURL); + } catch (e) { + throw new DOMException2(e, "SyntaxError"); + } + if (urlRecord.protocol === "http:") { + urlRecord.protocol = "ws:"; + } else if (urlRecord.protocol === "https:") { + urlRecord.protocol = "wss:"; + } + if (urlRecord.protocol !== "ws:" && urlRecord.protocol !== "wss:") { + throw new DOMException2(`Expected a ws: or wss: protocol, got ${urlRecord.protocol}`, "SyntaxError"); + } + if (urlRecord.hash || urlRecord.href.endsWith("#")) { + throw new DOMException2("Got fragment", "SyntaxError"); + } + if (typeof protocols === "string") { + protocols = [protocols]; + } + if (protocols.length !== new Set(protocols.map((p) => p.toLowerCase())).size) { + throw new DOMException2("Invalid Sec-WebSocket-Protocol value", "SyntaxError"); + } + if (protocols.length > 0 && !protocols.every((p) => isValidSubprotocol(p))) { + throw new DOMException2("Invalid Sec-WebSocket-Protocol value", "SyntaxError"); + } + this[kWebSocketURL] = new URL(urlRecord.href); + this[kController] = establishWebSocketConnection(urlRecord, protocols, this, (response) => this.#onConnectionEstablished(response), options); + this[kReadyState] = WebSocket.CONNECTING; + this[kBinaryType] = "blob"; + } + close(code = undefined, reason = undefined) { + webidl.brandCheck(this, WebSocket); + if (code !== undefined) { + code = webidl.converters["unsigned short"](code, { clamp: true }); + } + if (reason !== undefined) { + reason = webidl.converters.USVString(reason); + } + if (code !== undefined) { + if (code !== 1000 && (code < 3000 || code > 4999)) { + throw new DOMException2("invalid code", "InvalidAccessError"); + } + } + let reasonByteLength = 0; + if (reason !== undefined) { + reasonByteLength = Buffer.byteLength(reason); + if (reasonByteLength > 123) { + throw new DOMException2(`Reason must be less than 123 bytes; received ${reasonByteLength}`, "SyntaxError"); + } + } + if (this[kReadyState] === WebSocket.CLOSING || this[kReadyState] === WebSocket.CLOSED) { + } else if (!isEstablished(this)) { + failWebsocketConnection(this, "Connection was closed before it was established."); + this[kReadyState] = WebSocket.CLOSING; + } else if (!isClosing(this)) { + const frame = new WebsocketFrameSend; + if (code !== undefined && reason === undefined) { + frame.frameData = Buffer.allocUnsafe(2); + frame.frameData.writeUInt16BE(code, 0); + } else if (code !== undefined && reason !== undefined) { + frame.frameData = Buffer.allocUnsafe(2 + reasonByteLength); + frame.frameData.writeUInt16BE(code, 0); + frame.frameData.write(reason, 2, "utf-8"); + } else { + frame.frameData = emptyBuffer; + } + const socket = this[kResponse].socket; + socket.write(frame.createFrame(opcodes.CLOSE), (err) => { + if (!err) { + this[kSentClose] = true; + } + }); + this[kReadyState] = states.CLOSING; + } else { + this[kReadyState] = WebSocket.CLOSING; + } + } + send(data) { + webidl.brandCheck(this, WebSocket); + webidl.argumentLengthCheck(arguments, 1, { header: "WebSocket.send" }); + data = webidl.converters.WebSocketSendData(data); + if (this[kReadyState] === WebSocket.CONNECTING) { + throw new DOMException2("Sent before connected.", "InvalidStateError"); + } + if (!isEstablished(this) || isClosing(this)) { + return; + } + const socket = this[kResponse].socket; + if (typeof data === "string") { + const value = Buffer.from(data); + const frame = new WebsocketFrameSend(value); + const buffer = frame.createFrame(opcodes.TEXT); + this.#bufferedAmount += value.byteLength; + socket.write(buffer, () => { + this.#bufferedAmount -= value.byteLength; + }); + } else if (types.isArrayBuffer(data)) { + const value = Buffer.from(data); + const frame = new WebsocketFrameSend(value); + const buffer = frame.createFrame(opcodes.BINARY); + this.#bufferedAmount += value.byteLength; + socket.write(buffer, () => { + this.#bufferedAmount -= value.byteLength; + }); + } else if (ArrayBuffer.isView(data)) { + const ab = Buffer.from(data, data.byteOffset, data.byteLength); + const frame = new WebsocketFrameSend(ab); + const buffer = frame.createFrame(opcodes.BINARY); + this.#bufferedAmount += ab.byteLength; + socket.write(buffer, () => { + this.#bufferedAmount -= ab.byteLength; + }); + } else if (isBlobLike(data)) { + const frame = new WebsocketFrameSend; + data.arrayBuffer().then((ab) => { + const value = Buffer.from(ab); + frame.frameData = value; + const buffer = frame.createFrame(opcodes.BINARY); + this.#bufferedAmount += value.byteLength; + socket.write(buffer, () => { + this.#bufferedAmount -= value.byteLength; + }); + }); + } + } + get readyState() { + webidl.brandCheck(this, WebSocket); + return this[kReadyState]; + } + get bufferedAmount() { + webidl.brandCheck(this, WebSocket); + return this.#bufferedAmount; + } + get url() { + webidl.brandCheck(this, WebSocket); + return URLSerializer(this[kWebSocketURL]); + } + get extensions() { + webidl.brandCheck(this, WebSocket); + return this.#extensions; + } + get protocol() { + webidl.brandCheck(this, WebSocket); + return this.#protocol; + } + get onopen() { + webidl.brandCheck(this, WebSocket); + return this.#events.open; + } + set onopen(fn) { + webidl.brandCheck(this, WebSocket); + if (this.#events.open) { + this.removeEventListener("open", this.#events.open); + } + if (typeof fn === "function") { + this.#events.open = fn; + this.addEventListener("open", fn); + } else { + this.#events.open = null; + } + } + get onerror() { + webidl.brandCheck(this, WebSocket); + return this.#events.error; + } + set onerror(fn) { + webidl.brandCheck(this, WebSocket); + if (this.#events.error) { + this.removeEventListener("error", this.#events.error); + } + if (typeof fn === "function") { + this.#events.error = fn; + this.addEventListener("error", fn); + } else { + this.#events.error = null; + } + } + get onclose() { + webidl.brandCheck(this, WebSocket); + return this.#events.close; + } + set onclose(fn) { + webidl.brandCheck(this, WebSocket); + if (this.#events.close) { + this.removeEventListener("close", this.#events.close); + } + if (typeof fn === "function") { + this.#events.close = fn; + this.addEventListener("close", fn); + } else { + this.#events.close = null; + } + } + get onmessage() { + webidl.brandCheck(this, WebSocket); + return this.#events.message; + } + set onmessage(fn) { + webidl.brandCheck(this, WebSocket); + if (this.#events.message) { + this.removeEventListener("message", this.#events.message); + } + if (typeof fn === "function") { + this.#events.message = fn; + this.addEventListener("message", fn); + } else { + this.#events.message = null; + } + } + get binaryType() { + webidl.brandCheck(this, WebSocket); + return this[kBinaryType]; + } + set binaryType(type) { + webidl.brandCheck(this, WebSocket); + if (type !== "blob" && type !== "arraybuffer") { + this[kBinaryType] = "blob"; + } else { + this[kBinaryType] = type; + } + } + #onConnectionEstablished(response) { + this[kResponse] = response; + const parser = new ByteParser(this); + parser.on("drain", function onParserDrain() { + this.ws[kResponse].socket.resume(); + }); + response.socket.ws = this; + this[kByteParser] = parser; + this[kReadyState] = states.OPEN; + const extensions = response.headersList.get("sec-websocket-extensions"); + if (extensions !== null) { + this.#extensions = extensions; + } + const protocol = response.headersList.get("sec-websocket-protocol"); + if (protocol !== null) { + this.#protocol = protocol; + } + fireEvent("open", this); + } + } + WebSocket.CONNECTING = WebSocket.prototype.CONNECTING = states.CONNECTING; + WebSocket.OPEN = WebSocket.prototype.OPEN = states.OPEN; + WebSocket.CLOSING = WebSocket.prototype.CLOSING = states.CLOSING; + WebSocket.CLOSED = WebSocket.prototype.CLOSED = states.CLOSED; + Object.defineProperties(WebSocket.prototype, { + CONNECTING: staticPropertyDescriptors, + OPEN: staticPropertyDescriptors, + CLOSING: staticPropertyDescriptors, + CLOSED: staticPropertyDescriptors, + url: kEnumerableProperty, + readyState: kEnumerableProperty, + bufferedAmount: kEnumerableProperty, + onopen: kEnumerableProperty, + onerror: kEnumerableProperty, + onclose: kEnumerableProperty, + close: kEnumerableProperty, + onmessage: kEnumerableProperty, + binaryType: kEnumerableProperty, + send: kEnumerableProperty, + extensions: kEnumerableProperty, + protocol: kEnumerableProperty, + [Symbol.toStringTag]: { + value: "WebSocket", + writable: false, + enumerable: false, + configurable: true + } + }); + Object.defineProperties(WebSocket, { + CONNECTING: staticPropertyDescriptors, + OPEN: staticPropertyDescriptors, + CLOSING: staticPropertyDescriptors, + CLOSED: staticPropertyDescriptors + }); + webidl.converters["sequence"] = webidl.sequenceConverter(webidl.converters.DOMString); + webidl.converters["DOMString or sequence"] = function(V) { + if (webidl.util.Type(V) === "Object" && Symbol.iterator in V) { + return webidl.converters["sequence"](V); + } + return webidl.converters.DOMString(V); + }; + webidl.converters.WebSocketInit = webidl.dictionaryConverter([ + { + key: "protocols", + converter: webidl.converters["DOMString or sequence"], + get defaultValue() { + return []; + } + }, + { + key: "dispatcher", + converter: (V) => V, + get defaultValue() { + return getGlobalDispatcher(); + } + }, + { + key: "headers", + converter: webidl.nullableConverter(webidl.converters.HeadersInit) + } + ]); + webidl.converters["DOMString or sequence or WebSocketInit"] = function(V) { + if (webidl.util.Type(V) === "Object" && !(Symbol.iterator in V)) { + return webidl.converters.WebSocketInit(V); + } + return { protocols: webidl.converters["DOMString or sequence"](V) }; + }; + webidl.converters.WebSocketSendData = function(V) { + if (webidl.util.Type(V) === "Object") { + if (isBlobLike(V)) { + return webidl.converters.Blob(V, { strict: false }); + } + if (ArrayBuffer.isView(V) || types.isAnyArrayBuffer(V)) { + return webidl.converters.BufferSource(V); + } + } + return webidl.converters.USVString(V); + }; + module2.exports = { + WebSocket + }; +}); + +// node_modules/undici/index.js +var require_undici = __commonJS((exports2, module2) => { + var Client = require_client(); + var Dispatcher = require_dispatcher(); + var errors = require_errors(); + var Pool = require_pool(); + var BalancedPool = require_balanced_pool(); + var Agent = require_agent(); + var util = require_util(); + var { InvalidArgumentError } = errors; + var api = require_api(); + var buildConnector = require_connect(); + var MockClient = require_mock_client(); + var MockAgent = require_mock_agent(); + var MockPool = require_mock_pool(); + var mockErrors = require_mock_errors(); + var ProxyAgent = require_proxy_agent(); + var RetryHandler = require_RetryHandler(); + var { getGlobalDispatcher, setGlobalDispatcher } = require_global2(); + var DecoratorHandler = require_DecoratorHandler(); + var RedirectHandler = require_RedirectHandler(); + var createRedirectInterceptor = require_redirectInterceptor(); + var hasCrypto; + try { + require("crypto"); + hasCrypto = true; + } catch { + hasCrypto = false; + } + Object.assign(Dispatcher.prototype, api); + module2.exports.Dispatcher = Dispatcher; + module2.exports.Client = Client; + module2.exports.Pool = Pool; + module2.exports.BalancedPool = BalancedPool; + module2.exports.Agent = Agent; + module2.exports.ProxyAgent = ProxyAgent; + module2.exports.RetryHandler = RetryHandler; + module2.exports.DecoratorHandler = DecoratorHandler; + module2.exports.RedirectHandler = RedirectHandler; + module2.exports.createRedirectInterceptor = createRedirectInterceptor; + module2.exports.buildConnector = buildConnector; + module2.exports.errors = errors; + function makeDispatcher(fn) { + return (url, opts, handler) => { + if (typeof opts === "function") { + handler = opts; + opts = null; + } + if (!url || typeof url !== "string" && typeof url !== "object" && !(url instanceof URL)) { + throw new InvalidArgumentError("invalid url"); + } + if (opts != null && typeof opts !== "object") { + throw new InvalidArgumentError("invalid opts"); + } + if (opts && opts.path != null) { + if (typeof opts.path !== "string") { + throw new InvalidArgumentError("invalid opts.path"); + } + let path = opts.path; + if (!opts.path.startsWith("/")) { + path = `/${path}`; + } + url = new URL(util.parseOrigin(url).origin + path); + } else { + if (!opts) { + opts = typeof url === "object" ? url : {}; + } + url = util.parseURL(url); + } + const { agent, dispatcher = getGlobalDispatcher() } = opts; + if (agent) { + throw new InvalidArgumentError("unsupported opts.agent. Did you mean opts.client?"); + } + return fn.call(dispatcher, { + ...opts, + origin: url.origin, + path: url.search ? `${url.pathname}${url.search}` : url.pathname, + method: opts.method || (opts.body ? "PUT" : "GET") + }, handler); + }; + } + module2.exports.setGlobalDispatcher = setGlobalDispatcher; + module2.exports.getGlobalDispatcher = getGlobalDispatcher; + if (util.nodeMajor > 16 || util.nodeMajor === 16 && util.nodeMinor >= 8) { + let fetchImpl = null; + module2.exports.fetch = async function fetch(resource) { + if (!fetchImpl) { + fetchImpl = require_fetch().fetch; + } + try { + return await fetchImpl(...arguments); + } catch (err) { + if (typeof err === "object") { + Error.captureStackTrace(err, this); + } + throw err; + } + }; + module2.exports.Headers = require_headers().Headers; + module2.exports.Response = require_response().Response; + module2.exports.Request = require_request2().Request; + module2.exports.FormData = require_formdata().FormData; + module2.exports.File = require_file().File; + module2.exports.FileReader = require_filereader().FileReader; + const { setGlobalOrigin, getGlobalOrigin } = require_global(); + module2.exports.setGlobalOrigin = setGlobalOrigin; + module2.exports.getGlobalOrigin = getGlobalOrigin; + const { CacheStorage } = require_cachestorage(); + const { kConstruct } = require_symbols4(); + module2.exports.caches = new CacheStorage(kConstruct); + } + if (util.nodeMajor >= 16) { + const { deleteCookie, getCookies, getSetCookies, setCookie } = require_cookies(); + module2.exports.deleteCookie = deleteCookie; + module2.exports.getCookies = getCookies; + module2.exports.getSetCookies = getSetCookies; + module2.exports.setCookie = setCookie; + const { parseMIMEType, serializeAMimeType } = require_dataURL(); + module2.exports.parseMIMEType = parseMIMEType; + module2.exports.serializeAMimeType = serializeAMimeType; + } + if (util.nodeMajor >= 18 && hasCrypto) { + const { WebSocket } = require_websocket(); + module2.exports.WebSocket = WebSocket; + } + module2.exports.request = makeDispatcher(api.request); + module2.exports.stream = makeDispatcher(api.stream); + module2.exports.pipeline = makeDispatcher(api.pipeline); + module2.exports.connect = makeDispatcher(api.connect); + module2.exports.upgrade = makeDispatcher(api.upgrade); + module2.exports.MockClient = MockClient; + module2.exports.MockPool = MockPool; + module2.exports.MockAgent = MockAgent; + module2.exports.mockErrors = mockErrors; +}); + +// node_modules/@actions/http-client/lib/index.js +var require_lib = __commonJS((exports2) => { + var __createBinding = exports2 && exports2.__createBinding || (Object.create ? function(o, m, k, k2) { + if (k2 === undefined) + k2 = k; + var desc = Object.getOwnPropertyDescriptor(m, k); + if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) { + desc = { enumerable: true, get: function() { + return m[k]; + } }; + } + Object.defineProperty(o, k2, desc); + } : function(o, m, k, k2) { + if (k2 === undefined) + k2 = k; + o[k2] = m[k]; + }); + var __setModuleDefault = exports2 && exports2.__setModuleDefault || (Object.create ? function(o, v) { + Object.defineProperty(o, "default", { enumerable: true, value: v }); + } : function(o, v) { + o["default"] = v; + }); + var __importStar = exports2 && exports2.__importStar || function(mod) { + if (mod && mod.__esModule) + return mod; + var result = {}; + if (mod != null) { + for (var k in mod) + if (k !== "default" && Object.prototype.hasOwnProperty.call(mod, k)) + __createBinding(result, mod, k); + } + __setModuleDefault(result, mod); + return result; + }; + var __awaiter = exports2 && exports2.__awaiter || function(thisArg, _arguments, P, generator) { + function adopt(value) { + return value instanceof P ? value : new P(function(resolve) { + resolve(value); + }); + } + return new (P || (P = Promise))(function(resolve, reject) { + function fulfilled(value) { + try { + step(generator.next(value)); + } catch (e) { + reject(e); + } + } + function rejected(value) { + try { + step(generator["throw"](value)); + } catch (e) { + reject(e); + } + } + function step(result) { + result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); + } + step((generator = generator.apply(thisArg, _arguments || [])).next()); + }); + }; + Object.defineProperty(exports2, "__esModule", { value: true }); + exports2.HttpClient = exports2.isHttps = exports2.HttpClientResponse = exports2.HttpClientError = exports2.getProxyUrl = exports2.MediaTypes = exports2.Headers = exports2.HttpCodes = undefined; + var http = __importStar(require("http")); + var https = __importStar(require("https")); + var pm = __importStar(require_proxy()); + var tunnel = __importStar(require_tunnel2()); + var undici_1 = require_undici(); + var HttpCodes; + (function(HttpCodes2) { + HttpCodes2[HttpCodes2["OK"] = 200] = "OK"; + HttpCodes2[HttpCodes2["MultipleChoices"] = 300] = "MultipleChoices"; + HttpCodes2[HttpCodes2["MovedPermanently"] = 301] = "MovedPermanently"; + HttpCodes2[HttpCodes2["ResourceMoved"] = 302] = "ResourceMoved"; + HttpCodes2[HttpCodes2["SeeOther"] = 303] = "SeeOther"; + HttpCodes2[HttpCodes2["NotModified"] = 304] = "NotModified"; + HttpCodes2[HttpCodes2["UseProxy"] = 305] = "UseProxy"; + HttpCodes2[HttpCodes2["SwitchProxy"] = 306] = "SwitchProxy"; + HttpCodes2[HttpCodes2["TemporaryRedirect"] = 307] = "TemporaryRedirect"; + HttpCodes2[HttpCodes2["PermanentRedirect"] = 308] = "PermanentRedirect"; + HttpCodes2[HttpCodes2["BadRequest"] = 400] = "BadRequest"; + HttpCodes2[HttpCodes2["Unauthorized"] = 401] = "Unauthorized"; + HttpCodes2[HttpCodes2["PaymentRequired"] = 402] = "PaymentRequired"; + HttpCodes2[HttpCodes2["Forbidden"] = 403] = "Forbidden"; + HttpCodes2[HttpCodes2["NotFound"] = 404] = "NotFound"; + HttpCodes2[HttpCodes2["MethodNotAllowed"] = 405] = "MethodNotAllowed"; + HttpCodes2[HttpCodes2["NotAcceptable"] = 406] = "NotAcceptable"; + HttpCodes2[HttpCodes2["ProxyAuthenticationRequired"] = 407] = "ProxyAuthenticationRequired"; + HttpCodes2[HttpCodes2["RequestTimeout"] = 408] = "RequestTimeout"; + HttpCodes2[HttpCodes2["Conflict"] = 409] = "Conflict"; + HttpCodes2[HttpCodes2["Gone"] = 410] = "Gone"; + HttpCodes2[HttpCodes2["TooManyRequests"] = 429] = "TooManyRequests"; + HttpCodes2[HttpCodes2["InternalServerError"] = 500] = "InternalServerError"; + HttpCodes2[HttpCodes2["NotImplemented"] = 501] = "NotImplemented"; + HttpCodes2[HttpCodes2["BadGateway"] = 502] = "BadGateway"; + HttpCodes2[HttpCodes2["ServiceUnavailable"] = 503] = "ServiceUnavailable"; + HttpCodes2[HttpCodes2["GatewayTimeout"] = 504] = "GatewayTimeout"; + })(HttpCodes || (exports2.HttpCodes = HttpCodes = {})); + var Headers2; + (function(Headers3) { + Headers3["Accept"] = "accept"; + Headers3["ContentType"] = "content-type"; + })(Headers2 || (exports2.Headers = Headers2 = {})); + var MediaTypes; + (function(MediaTypes2) { + MediaTypes2["ApplicationJson"] = "application/json"; + })(MediaTypes || (exports2.MediaTypes = MediaTypes = {})); + function getProxyUrl(serverUrl) { + const proxyUrl = pm.getProxyUrl(new URL(serverUrl)); + return proxyUrl ? proxyUrl.href : ""; + } + exports2.getProxyUrl = getProxyUrl; + var HttpRedirectCodes = [ + HttpCodes.MovedPermanently, + HttpCodes.ResourceMoved, + HttpCodes.SeeOther, + HttpCodes.TemporaryRedirect, + HttpCodes.PermanentRedirect + ]; + var HttpResponseRetryCodes = [ + HttpCodes.BadGateway, + HttpCodes.ServiceUnavailable, + HttpCodes.GatewayTimeout + ]; + var RetryableHttpVerbs = ["OPTIONS", "GET", "DELETE", "HEAD"]; + var ExponentialBackoffCeiling = 10; + var ExponentialBackoffTimeSlice = 5; + + class HttpClientError extends Error { + constructor(message, statusCode) { + super(message); + this.name = "HttpClientError"; + this.statusCode = statusCode; + Object.setPrototypeOf(this, HttpClientError.prototype); + } + } + exports2.HttpClientError = HttpClientError; + + class HttpClientResponse { + constructor(message) { + this.message = message; + } + readBody() { + return __awaiter(this, undefined, undefined, function* () { + return new Promise((resolve) => __awaiter(this, undefined, undefined, function* () { + let output = Buffer.alloc(0); + this.message.on("data", (chunk) => { + output = Buffer.concat([output, chunk]); + }); + this.message.on("end", () => { + resolve(output.toString()); + }); + })); + }); + } + readBodyBuffer() { + return __awaiter(this, undefined, undefined, function* () { + return new Promise((resolve) => __awaiter(this, undefined, undefined, function* () { + const chunks = []; + this.message.on("data", (chunk) => { + chunks.push(chunk); + }); + this.message.on("end", () => { + resolve(Buffer.concat(chunks)); + }); + })); + }); + } + } + exports2.HttpClientResponse = HttpClientResponse; + function isHttps(requestUrl) { + const parsedUrl = new URL(requestUrl); + return parsedUrl.protocol === "https:"; + } + exports2.isHttps = isHttps; + + class HttpClient { + constructor(userAgent, handlers, requestOptions) { + this._ignoreSslError = false; + this._allowRedirects = true; + this._allowRedirectDowngrade = false; + this._maxRedirects = 50; + this._allowRetries = false; + this._maxRetries = 1; + this._keepAlive = false; + this._disposed = false; + this.userAgent = userAgent; + this.handlers = handlers || []; + this.requestOptions = requestOptions; + if (requestOptions) { + if (requestOptions.ignoreSslError != null) { + this._ignoreSslError = requestOptions.ignoreSslError; + } + this._socketTimeout = requestOptions.socketTimeout; + if (requestOptions.allowRedirects != null) { + this._allowRedirects = requestOptions.allowRedirects; + } + if (requestOptions.allowRedirectDowngrade != null) { + this._allowRedirectDowngrade = requestOptions.allowRedirectDowngrade; + } + if (requestOptions.maxRedirects != null) { + this._maxRedirects = Math.max(requestOptions.maxRedirects, 0); + } + if (requestOptions.keepAlive != null) { + this._keepAlive = requestOptions.keepAlive; + } + if (requestOptions.allowRetries != null) { + this._allowRetries = requestOptions.allowRetries; + } + if (requestOptions.maxRetries != null) { + this._maxRetries = requestOptions.maxRetries; + } + } + } + options(requestUrl, additionalHeaders) { + return __awaiter(this, undefined, undefined, function* () { + return this.request("OPTIONS", requestUrl, null, additionalHeaders || {}); + }); + } + get(requestUrl, additionalHeaders) { + return __awaiter(this, undefined, undefined, function* () { + return this.request("GET", requestUrl, null, additionalHeaders || {}); + }); + } + del(requestUrl, additionalHeaders) { + return __awaiter(this, undefined, undefined, function* () { + return this.request("DELETE", requestUrl, null, additionalHeaders || {}); + }); + } + post(requestUrl, data, additionalHeaders) { + return __awaiter(this, undefined, undefined, function* () { + return this.request("POST", requestUrl, data, additionalHeaders || {}); + }); + } + patch(requestUrl, data, additionalHeaders) { + return __awaiter(this, undefined, undefined, function* () { + return this.request("PATCH", requestUrl, data, additionalHeaders || {}); + }); + } + put(requestUrl, data, additionalHeaders) { + return __awaiter(this, undefined, undefined, function* () { + return this.request("PUT", requestUrl, data, additionalHeaders || {}); + }); + } + head(requestUrl, additionalHeaders) { + return __awaiter(this, undefined, undefined, function* () { + return this.request("HEAD", requestUrl, null, additionalHeaders || {}); + }); + } + sendStream(verb, requestUrl, stream, additionalHeaders) { + return __awaiter(this, undefined, undefined, function* () { + return this.request(verb, requestUrl, stream, additionalHeaders); + }); + } + getJson(requestUrl, additionalHeaders = {}) { + return __awaiter(this, undefined, undefined, function* () { + additionalHeaders[Headers2.Accept] = this._getExistingOrDefaultHeader(additionalHeaders, Headers2.Accept, MediaTypes.ApplicationJson); + const res = yield this.get(requestUrl, additionalHeaders); + return this._processResponse(res, this.requestOptions); + }); + } + postJson(requestUrl, obj, additionalHeaders = {}) { + return __awaiter(this, undefined, undefined, function* () { + const data = JSON.stringify(obj, null, 2); + additionalHeaders[Headers2.Accept] = this._getExistingOrDefaultHeader(additionalHeaders, Headers2.Accept, MediaTypes.ApplicationJson); + additionalHeaders[Headers2.ContentType] = this._getExistingOrDefaultHeader(additionalHeaders, Headers2.ContentType, MediaTypes.ApplicationJson); + const res = yield this.post(requestUrl, data, additionalHeaders); + return this._processResponse(res, this.requestOptions); + }); + } + putJson(requestUrl, obj, additionalHeaders = {}) { + return __awaiter(this, undefined, undefined, function* () { + const data = JSON.stringify(obj, null, 2); + additionalHeaders[Headers2.Accept] = this._getExistingOrDefaultHeader(additionalHeaders, Headers2.Accept, MediaTypes.ApplicationJson); + additionalHeaders[Headers2.ContentType] = this._getExistingOrDefaultHeader(additionalHeaders, Headers2.ContentType, MediaTypes.ApplicationJson); + const res = yield this.put(requestUrl, data, additionalHeaders); + return this._processResponse(res, this.requestOptions); + }); + } + patchJson(requestUrl, obj, additionalHeaders = {}) { + return __awaiter(this, undefined, undefined, function* () { + const data = JSON.stringify(obj, null, 2); + additionalHeaders[Headers2.Accept] = this._getExistingOrDefaultHeader(additionalHeaders, Headers2.Accept, MediaTypes.ApplicationJson); + additionalHeaders[Headers2.ContentType] = this._getExistingOrDefaultHeader(additionalHeaders, Headers2.ContentType, MediaTypes.ApplicationJson); + const res = yield this.patch(requestUrl, data, additionalHeaders); + return this._processResponse(res, this.requestOptions); + }); + } + request(verb, requestUrl, data, headers) { + return __awaiter(this, undefined, undefined, function* () { + if (this._disposed) { + throw new Error("Client has already been disposed."); + } + const parsedUrl = new URL(requestUrl); + let info = this._prepareRequest(verb, parsedUrl, headers); + const maxTries = this._allowRetries && RetryableHttpVerbs.includes(verb) ? this._maxRetries + 1 : 1; + let numTries = 0; + let response; + do { + response = yield this.requestRaw(info, data); + if (response && response.message && response.message.statusCode === HttpCodes.Unauthorized) { + let authenticationHandler; + for (const handler of this.handlers) { + if (handler.canHandleAuthentication(response)) { + authenticationHandler = handler; + break; + } + } + if (authenticationHandler) { + return authenticationHandler.handleAuthentication(this, info, data); + } else { + return response; + } + } + let redirectsRemaining = this._maxRedirects; + while (response.message.statusCode && HttpRedirectCodes.includes(response.message.statusCode) && this._allowRedirects && redirectsRemaining > 0) { + const redirectUrl = response.message.headers["location"]; + if (!redirectUrl) { + break; + } + const parsedRedirectUrl = new URL(redirectUrl); + if (parsedUrl.protocol === "https:" && parsedUrl.protocol !== parsedRedirectUrl.protocol && !this._allowRedirectDowngrade) { + throw new Error("Redirect from HTTPS to HTTP protocol. This downgrade is not allowed for security reasons. If you want to allow this behavior, set the allowRedirectDowngrade option to true."); + } + yield response.readBody(); + if (parsedRedirectUrl.hostname !== parsedUrl.hostname) { + for (const header in headers) { + if (header.toLowerCase() === "authorization") { + delete headers[header]; + } + } + } + info = this._prepareRequest(verb, parsedRedirectUrl, headers); + response = yield this.requestRaw(info, data); + redirectsRemaining--; + } + if (!response.message.statusCode || !HttpResponseRetryCodes.includes(response.message.statusCode)) { + return response; + } + numTries += 1; + if (numTries < maxTries) { + yield response.readBody(); + yield this._performExponentialBackoff(numTries); + } + } while (numTries < maxTries); + return response; + }); + } + dispose() { + if (this._agent) { + this._agent.destroy(); + } + this._disposed = true; + } + requestRaw(info, data) { + return __awaiter(this, undefined, undefined, function* () { + return new Promise((resolve, reject) => { + function callbackForResult(err, res) { + if (err) { + reject(err); + } else if (!res) { + reject(new Error("Unknown error")); + } else { + resolve(res); + } + } + this.requestRawWithCallback(info, data, callbackForResult); + }); + }); + } + requestRawWithCallback(info, data, onResult) { + if (typeof data === "string") { + if (!info.options.headers) { + info.options.headers = {}; + } + info.options.headers["Content-Length"] = Buffer.byteLength(data, "utf8"); + } + let callbackCalled = false; + function handleResult(err, res) { + if (!callbackCalled) { + callbackCalled = true; + onResult(err, res); + } + } + const req = info.httpModule.request(info.options, (msg) => { + const res = new HttpClientResponse(msg); + handleResult(undefined, res); + }); + let socket; + req.on("socket", (sock) => { + socket = sock; + }); + req.setTimeout(this._socketTimeout || 3 * 60000, () => { + if (socket) { + socket.end(); + } + handleResult(new Error(`Request timeout: ${info.options.path}`)); + }); + req.on("error", function(err) { + handleResult(err); + }); + if (data && typeof data === "string") { + req.write(data, "utf8"); + } + if (data && typeof data !== "string") { + data.on("close", function() { + req.end(); + }); + data.pipe(req); + } else { + req.end(); + } + } + getAgent(serverUrl) { + const parsedUrl = new URL(serverUrl); + return this._getAgent(parsedUrl); + } + getAgentDispatcher(serverUrl) { + const parsedUrl = new URL(serverUrl); + const proxyUrl = pm.getProxyUrl(parsedUrl); + const useProxy = proxyUrl && proxyUrl.hostname; + if (!useProxy) { + return; + } + return this._getProxyAgentDispatcher(parsedUrl, proxyUrl); + } + _prepareRequest(method, requestUrl, headers) { + const info = {}; + info.parsedUrl = requestUrl; + const usingSsl = info.parsedUrl.protocol === "https:"; + info.httpModule = usingSsl ? https : http; + const defaultPort = usingSsl ? 443 : 80; + info.options = {}; + info.options.host = info.parsedUrl.hostname; + info.options.port = info.parsedUrl.port ? parseInt(info.parsedUrl.port) : defaultPort; + info.options.path = (info.parsedUrl.pathname || "") + (info.parsedUrl.search || ""); + info.options.method = method; + info.options.headers = this._mergeHeaders(headers); + if (this.userAgent != null) { + info.options.headers["user-agent"] = this.userAgent; + } + info.options.agent = this._getAgent(info.parsedUrl); + if (this.handlers) { + for (const handler of this.handlers) { + handler.prepareRequest(info.options); + } + } + return info; + } + _mergeHeaders(headers) { + if (this.requestOptions && this.requestOptions.headers) { + return Object.assign({}, lowercaseKeys(this.requestOptions.headers), lowercaseKeys(headers || {})); + } + return lowercaseKeys(headers || {}); + } + _getExistingOrDefaultHeader(additionalHeaders, header, _default) { + let clientHeader; + if (this.requestOptions && this.requestOptions.headers) { + clientHeader = lowercaseKeys(this.requestOptions.headers)[header]; + } + return additionalHeaders[header] || clientHeader || _default; + } + _getAgent(parsedUrl) { + let agent; + const proxyUrl = pm.getProxyUrl(parsedUrl); + const useProxy = proxyUrl && proxyUrl.hostname; + if (this._keepAlive && useProxy) { + agent = this._proxyAgent; + } + if (!useProxy) { + agent = this._agent; + } + if (agent) { + return agent; + } + const usingSsl = parsedUrl.protocol === "https:"; + let maxSockets = 100; + if (this.requestOptions) { + maxSockets = this.requestOptions.maxSockets || http.globalAgent.maxSockets; + } + if (proxyUrl && proxyUrl.hostname) { + const agentOptions = { + maxSockets, + keepAlive: this._keepAlive, + proxy: Object.assign(Object.assign({}, (proxyUrl.username || proxyUrl.password) && { + proxyAuth: `${proxyUrl.username}:${proxyUrl.password}` + }), { host: proxyUrl.hostname, port: proxyUrl.port }) + }; + let tunnelAgent; + const overHttps = proxyUrl.protocol === "https:"; + if (usingSsl) { + tunnelAgent = overHttps ? tunnel.httpsOverHttps : tunnel.httpsOverHttp; + } else { + tunnelAgent = overHttps ? tunnel.httpOverHttps : tunnel.httpOverHttp; + } + agent = tunnelAgent(agentOptions); + this._proxyAgent = agent; + } + if (!agent) { + const options = { keepAlive: this._keepAlive, maxSockets }; + agent = usingSsl ? new https.Agent(options) : new http.Agent(options); + this._agent = agent; + } + if (usingSsl && this._ignoreSslError) { + agent.options = Object.assign(agent.options || {}, { + rejectUnauthorized: false + }); + } + return agent; + } + _getProxyAgentDispatcher(parsedUrl, proxyUrl) { + let proxyAgent; + if (this._keepAlive) { + proxyAgent = this._proxyAgentDispatcher; + } + if (proxyAgent) { + return proxyAgent; + } + const usingSsl = parsedUrl.protocol === "https:"; + proxyAgent = new undici_1.ProxyAgent(Object.assign({ uri: proxyUrl.href, pipelining: !this._keepAlive ? 0 : 1 }, (proxyUrl.username || proxyUrl.password) && { + token: `Basic ${Buffer.from(`${proxyUrl.username}:${proxyUrl.password}`).toString("base64")}` + })); + this._proxyAgentDispatcher = proxyAgent; + if (usingSsl && this._ignoreSslError) { + proxyAgent.options = Object.assign(proxyAgent.options.requestTls || {}, { + rejectUnauthorized: false + }); + } + return proxyAgent; + } + _performExponentialBackoff(retryNumber) { + return __awaiter(this, undefined, undefined, function* () { + retryNumber = Math.min(ExponentialBackoffCeiling, retryNumber); + const ms = ExponentialBackoffTimeSlice * Math.pow(2, retryNumber); + return new Promise((resolve) => setTimeout(() => resolve(), ms)); + }); + } + _processResponse(res, options) { + return __awaiter(this, undefined, undefined, function* () { + return new Promise((resolve, reject) => __awaiter(this, undefined, undefined, function* () { + const statusCode = res.message.statusCode || 0; + const response = { + statusCode, + result: null, + headers: {} + }; + if (statusCode === HttpCodes.NotFound) { + resolve(response); + } + function dateTimeDeserializer(key, value) { + if (typeof value === "string") { + const a = new Date(value); + if (!isNaN(a.valueOf())) { + return a; + } + } + return value; + } + let obj; + let contents; + try { + contents = yield res.readBody(); + if (contents && contents.length > 0) { + if (options && options.deserializeDates) { + obj = JSON.parse(contents, dateTimeDeserializer); + } else { + obj = JSON.parse(contents); + } + response.result = obj; + } + response.headers = res.message.headers; + } catch (err) { + } + if (statusCode > 299) { + let msg; + if (obj && obj.message) { + msg = obj.message; + } else if (contents && contents.length > 0) { + msg = contents; + } else { + msg = `Failed request: (${statusCode})`; + } + const err = new HttpClientError(msg, statusCode); + err.result = response.result; + reject(err); + } else { + resolve(response); + } + })); + }); + } + } + exports2.HttpClient = HttpClient; + var lowercaseKeys = (obj) => Object.keys(obj).reduce((c, k) => (c[k.toLowerCase()] = obj[k], c), {}); +}); + +// node_modules/@actions/http-client/lib/auth.js +var require_auth = __commonJS((exports2) => { + var __awaiter = exports2 && exports2.__awaiter || function(thisArg, _arguments, P, generator) { + function adopt(value) { + return value instanceof P ? value : new P(function(resolve) { + resolve(value); + }); + } + return new (P || (P = Promise))(function(resolve, reject) { + function fulfilled(value) { + try { + step(generator.next(value)); + } catch (e) { + reject(e); + } + } + function rejected(value) { + try { + step(generator["throw"](value)); + } catch (e) { + reject(e); + } + } + function step(result) { + result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); + } + step((generator = generator.apply(thisArg, _arguments || [])).next()); + }); + }; + Object.defineProperty(exports2, "__esModule", { value: true }); + exports2.PersonalAccessTokenCredentialHandler = exports2.BearerCredentialHandler = exports2.BasicCredentialHandler = undefined; + + class BasicCredentialHandler { + constructor(username, password) { + this.username = username; + this.password = password; + } + prepareRequest(options) { + if (!options.headers) { + throw Error("The request has no headers"); + } + options.headers["Authorization"] = `Basic ${Buffer.from(`${this.username}:${this.password}`).toString("base64")}`; + } + canHandleAuthentication() { + return false; + } + handleAuthentication() { + return __awaiter(this, undefined, undefined, function* () { + throw new Error("not implemented"); + }); + } + } + exports2.BasicCredentialHandler = BasicCredentialHandler; + + class BearerCredentialHandler { + constructor(token) { + this.token = token; + } + prepareRequest(options) { + if (!options.headers) { + throw Error("The request has no headers"); + } + options.headers["Authorization"] = `Bearer ${this.token}`; + } + canHandleAuthentication() { + return false; + } + handleAuthentication() { + return __awaiter(this, undefined, undefined, function* () { + throw new Error("not implemented"); + }); + } + } + exports2.BearerCredentialHandler = BearerCredentialHandler; + + class PersonalAccessTokenCredentialHandler { + constructor(token) { + this.token = token; + } + prepareRequest(options) { + if (!options.headers) { + throw Error("The request has no headers"); + } + options.headers["Authorization"] = `Basic ${Buffer.from(`PAT:${this.token}`).toString("base64")}`; + } + canHandleAuthentication() { + return false; + } + handleAuthentication() { + return __awaiter(this, undefined, undefined, function* () { + throw new Error("not implemented"); + }); + } + } + exports2.PersonalAccessTokenCredentialHandler = PersonalAccessTokenCredentialHandler; +}); + +// node_modules/@actions/core/lib/oidc-utils.js +var require_oidc_utils = __commonJS((exports2) => { + var __awaiter = exports2 && exports2.__awaiter || function(thisArg, _arguments, P, generator) { + function adopt(value) { + return value instanceof P ? value : new P(function(resolve) { + resolve(value); + }); + } + return new (P || (P = Promise))(function(resolve, reject) { + function fulfilled(value) { + try { + step(generator.next(value)); + } catch (e) { + reject(e); + } + } + function rejected(value) { + try { + step(generator["throw"](value)); + } catch (e) { + reject(e); + } + } + function step(result) { + result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); + } + step((generator = generator.apply(thisArg, _arguments || [])).next()); + }); + }; + Object.defineProperty(exports2, "__esModule", { value: true }); + exports2.OidcClient = undefined; + var http_client_1 = require_lib(); + var auth_1 = require_auth(); + var core_1 = require_core(); + + class OidcClient { + static createHttpClient(allowRetry = true, maxRetry = 10) { + const requestOptions = { + allowRetries: allowRetry, + maxRetries: maxRetry + }; + return new http_client_1.HttpClient("actions/oidc-client", [new auth_1.BearerCredentialHandler(OidcClient.getRequestToken())], requestOptions); + } + static getRequestToken() { + const token = process.env["ACTIONS_ID_TOKEN_REQUEST_TOKEN"]; + if (!token) { + throw new Error("Unable to get ACTIONS_ID_TOKEN_REQUEST_TOKEN env variable"); + } + return token; + } + static getIDTokenUrl() { + const runtimeUrl = process.env["ACTIONS_ID_TOKEN_REQUEST_URL"]; + if (!runtimeUrl) { + throw new Error("Unable to get ACTIONS_ID_TOKEN_REQUEST_URL env variable"); + } + return runtimeUrl; + } + static getCall(id_token_url) { + var _a; + return __awaiter(this, undefined, undefined, function* () { + const httpclient = OidcClient.createHttpClient(); + const res = yield httpclient.getJson(id_token_url).catch((error) => { + throw new Error(`Failed to get ID Token. \n + Error Code : ${error.statusCode}\n + Error Message: ${error.message}`); + }); + const id_token = (_a = res.result) === null || _a === undefined ? undefined : _a.value; + if (!id_token) { + throw new Error("Response json body do not have ID Token field"); + } + return id_token; + }); + } + static getIDToken(audience) { + return __awaiter(this, undefined, undefined, function* () { + try { + let id_token_url = OidcClient.getIDTokenUrl(); + if (audience) { + const encodedAudience = encodeURIComponent(audience); + id_token_url = `${id_token_url}&audience=${encodedAudience}`; + } + (0, core_1.debug)(`ID token url is ${id_token_url}`); + const id_token = yield OidcClient.getCall(id_token_url); + (0, core_1.setSecret)(id_token); + return id_token; + } catch (error) { + throw new Error(`Error message: ${error.message}`); + } + }); + } + } + exports2.OidcClient = OidcClient; +}); + +// node_modules/@actions/core/lib/summary.js +var require_summary = __commonJS((exports2) => { + var __awaiter = exports2 && exports2.__awaiter || function(thisArg, _arguments, P, generator) { + function adopt(value) { + return value instanceof P ? value : new P(function(resolve) { + resolve(value); + }); + } + return new (P || (P = Promise))(function(resolve, reject) { + function fulfilled(value) { + try { + step(generator.next(value)); + } catch (e) { + reject(e); + } + } + function rejected(value) { + try { + step(generator["throw"](value)); + } catch (e) { + reject(e); + } + } + function step(result) { + result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); + } + step((generator = generator.apply(thisArg, _arguments || [])).next()); + }); + }; + Object.defineProperty(exports2, "__esModule", { value: true }); + exports2.summary = exports2.markdownSummary = exports2.SUMMARY_DOCS_URL = exports2.SUMMARY_ENV_VAR = undefined; + var os_1 = require("os"); + var fs_1 = require("fs"); + var { access, appendFile, writeFile } = fs_1.promises; + exports2.SUMMARY_ENV_VAR = "GITHUB_STEP_SUMMARY"; + exports2.SUMMARY_DOCS_URL = "https://docs.github.com/actions/using-workflows/workflow-commands-for-github-actions#adding-a-job-summary"; + + class Summary { + constructor() { + this._buffer = ""; + } + filePath() { + return __awaiter(this, undefined, undefined, function* () { + if (this._filePath) { + return this._filePath; + } + const pathFromEnv = process.env[exports2.SUMMARY_ENV_VAR]; + if (!pathFromEnv) { + throw new Error(`Unable to find environment variable for \$${exports2.SUMMARY_ENV_VAR}. Check if your runtime environment supports job summaries.`); + } + try { + yield access(pathFromEnv, fs_1.constants.R_OK | fs_1.constants.W_OK); + } catch (_a) { + throw new Error(`Unable to access summary file: '${pathFromEnv}'. Check if the file has correct read/write permissions.`); + } + this._filePath = pathFromEnv; + return this._filePath; + }); + } + wrap(tag, content, attrs = {}) { + const htmlAttrs = Object.entries(attrs).map(([key, value]) => ` ${key}="${value}"`).join(""); + if (!content) { + return `<${tag}${htmlAttrs}>`; + } + return `<${tag}${htmlAttrs}>${content}`; + } + write(options) { + return __awaiter(this, undefined, undefined, function* () { + const overwrite = !!(options === null || options === undefined ? undefined : options.overwrite); + const filePath = yield this.filePath(); + const writeFunc = overwrite ? writeFile : appendFile; + yield writeFunc(filePath, this._buffer, { encoding: "utf8" }); + return this.emptyBuffer(); + }); + } + clear() { + return __awaiter(this, undefined, undefined, function* () { + return this.emptyBuffer().write({ overwrite: true }); + }); + } + stringify() { + return this._buffer; + } + isEmptyBuffer() { + return this._buffer.length === 0; + } + emptyBuffer() { + this._buffer = ""; + return this; + } + addRaw(text, addEOL = false) { + this._buffer += text; + return addEOL ? this.addEOL() : this; + } + addEOL() { + return this.addRaw(os_1.EOL); + } + addCodeBlock(code, lang) { + const attrs = Object.assign({}, lang && { lang }); + const element = this.wrap("pre", this.wrap("code", code), attrs); + return this.addRaw(element).addEOL(); + } + addList(items, ordered = false) { + const tag = ordered ? "ol" : "ul"; + const listItems = items.map((item) => this.wrap("li", item)).join(""); + const element = this.wrap(tag, listItems); + return this.addRaw(element).addEOL(); + } + addTable(rows) { + const tableBody = rows.map((row) => { + const cells = row.map((cell) => { + if (typeof cell === "string") { + return this.wrap("td", cell); + } + const { header, data, colspan, rowspan } = cell; + const tag = header ? "th" : "td"; + const attrs = Object.assign(Object.assign({}, colspan && { colspan }), rowspan && { rowspan }); + return this.wrap(tag, data, attrs); + }).join(""); + return this.wrap("tr", cells); + }).join(""); + const element = this.wrap("table", tableBody); + return this.addRaw(element).addEOL(); + } + addDetails(label, content) { + const element = this.wrap("details", this.wrap("summary", label) + content); + return this.addRaw(element).addEOL(); + } + addImage(src, alt, options) { + const { width, height } = options || {}; + const attrs = Object.assign(Object.assign({}, width && { width }), height && { height }); + const element = this.wrap("img", null, Object.assign({ src, alt }, attrs)); + return this.addRaw(element).addEOL(); + } + addHeading(text, level) { + const tag = `h${level}`; + const allowedTag = ["h1", "h2", "h3", "h4", "h5", "h6"].includes(tag) ? tag : "h1"; + const element = this.wrap(allowedTag, text); + return this.addRaw(element).addEOL(); + } + addSeparator() { + const element = this.wrap("hr", null); + return this.addRaw(element).addEOL(); + } + addBreak() { + const element = this.wrap("br", null); + return this.addRaw(element).addEOL(); + } + addQuote(text, cite) { + const attrs = Object.assign({}, cite && { cite }); + const element = this.wrap("blockquote", text, attrs); + return this.addRaw(element).addEOL(); + } + addLink(text, href) { + const element = this.wrap("a", text, { href }); + return this.addRaw(element).addEOL(); + } + } + var _summary = new Summary; + exports2.markdownSummary = _summary; + exports2.summary = _summary; +}); + +// node_modules/@actions/core/lib/path-utils.js +var require_path_utils = __commonJS((exports2) => { + var __createBinding = exports2 && exports2.__createBinding || (Object.create ? function(o, m, k, k2) { + if (k2 === undefined) + k2 = k; + var desc = Object.getOwnPropertyDescriptor(m, k); + if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) { + desc = { enumerable: true, get: function() { + return m[k]; + } }; + } + Object.defineProperty(o, k2, desc); + } : function(o, m, k, k2) { + if (k2 === undefined) + k2 = k; + o[k2] = m[k]; + }); + var __setModuleDefault = exports2 && exports2.__setModuleDefault || (Object.create ? function(o, v) { + Object.defineProperty(o, "default", { enumerable: true, value: v }); + } : function(o, v) { + o["default"] = v; + }); + var __importStar = exports2 && exports2.__importStar || function(mod) { + if (mod && mod.__esModule) + return mod; + var result = {}; + if (mod != null) { + for (var k in mod) + if (k !== "default" && Object.prototype.hasOwnProperty.call(mod, k)) + __createBinding(result, mod, k); + } + __setModuleDefault(result, mod); + return result; + }; + Object.defineProperty(exports2, "__esModule", { value: true }); + exports2.toPlatformPath = exports2.toWin32Path = exports2.toPosixPath = undefined; + var path = __importStar(require("path")); + function toPosixPath(pth) { + return pth.replace(/[\\]/g, "/"); + } + exports2.toPosixPath = toPosixPath; + function toWin32Path(pth) { + return pth.replace(/[/]/g, "\\"); + } + exports2.toWin32Path = toWin32Path; + function toPlatformPath(pth) { + return pth.replace(/[/\\]/g, path.sep); + } + exports2.toPlatformPath = toPlatformPath; +}); + +// node_modules/@actions/io/lib/io-util.js +var require_io_util = __commonJS((exports2) => { + var __createBinding = exports2 && exports2.__createBinding || (Object.create ? function(o, m, k, k2) { + if (k2 === undefined) + k2 = k; + Object.defineProperty(o, k2, { enumerable: true, get: function() { + return m[k]; + } }); + } : function(o, m, k, k2) { + if (k2 === undefined) + k2 = k; + o[k2] = m[k]; + }); + var __setModuleDefault = exports2 && exports2.__setModuleDefault || (Object.create ? function(o, v) { + Object.defineProperty(o, "default", { enumerable: true, value: v }); + } : function(o, v) { + o["default"] = v; + }); + var __importStar = exports2 && exports2.__importStar || function(mod) { + if (mod && mod.__esModule) + return mod; + var result = {}; + if (mod != null) { + for (var k in mod) + if (k !== "default" && Object.hasOwnProperty.call(mod, k)) + __createBinding(result, mod, k); + } + __setModuleDefault(result, mod); + return result; + }; + var __awaiter = exports2 && exports2.__awaiter || function(thisArg, _arguments, P, generator) { + function adopt(value) { + return value instanceof P ? value : new P(function(resolve) { + resolve(value); + }); + } + return new (P || (P = Promise))(function(resolve, reject) { + function fulfilled(value) { + try { + step(generator.next(value)); + } catch (e) { + reject(e); + } + } + function rejected(value) { + try { + step(generator["throw"](value)); + } catch (e) { + reject(e); + } + } + function step(result) { + result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); + } + step((generator = generator.apply(thisArg, _arguments || [])).next()); + }); + }; + var _a; + Object.defineProperty(exports2, "__esModule", { value: true }); + exports2.getCmdPath = exports2.tryGetExecutablePath = exports2.isRooted = exports2.isDirectory = exports2.exists = exports2.READONLY = exports2.UV_FS_O_EXLOCK = exports2.IS_WINDOWS = exports2.unlink = exports2.symlink = exports2.stat = exports2.rmdir = exports2.rm = exports2.rename = exports2.readlink = exports2.readdir = exports2.open = exports2.mkdir = exports2.lstat = exports2.copyFile = exports2.chmod = undefined; + var fs = __importStar(require("fs")); + var path = __importStar(require("path")); + _a = fs.promises, exports2.chmod = _a.chmod, exports2.copyFile = _a.copyFile, exports2.lstat = _a.lstat, exports2.mkdir = _a.mkdir, exports2.open = _a.open, exports2.readdir = _a.readdir, exports2.readlink = _a.readlink, exports2.rename = _a.rename, exports2.rm = _a.rm, exports2.rmdir = _a.rmdir, exports2.stat = _a.stat, exports2.symlink = _a.symlink, exports2.unlink = _a.unlink; + exports2.IS_WINDOWS = process.platform === "win32"; + exports2.UV_FS_O_EXLOCK = 268435456; + exports2.READONLY = fs.constants.O_RDONLY; + function exists(fsPath) { + return __awaiter(this, undefined, undefined, function* () { + try { + yield exports2.stat(fsPath); + } catch (err) { + if (err.code === "ENOENT") { + return false; + } + throw err; + } + return true; + }); + } + exports2.exists = exists; + function isDirectory(fsPath, useStat = false) { + return __awaiter(this, undefined, undefined, function* () { + const stats = useStat ? yield exports2.stat(fsPath) : yield exports2.lstat(fsPath); + return stats.isDirectory(); + }); + } + exports2.isDirectory = isDirectory; + function isRooted(p) { + p = normalizeSeparators(p); + if (!p) { + throw new Error('isRooted() parameter "p" cannot be empty'); + } + if (exports2.IS_WINDOWS) { + return p.startsWith("\\") || /^[A-Z]:/i.test(p); + } + return p.startsWith("/"); + } + exports2.isRooted = isRooted; + function tryGetExecutablePath(filePath, extensions) { + return __awaiter(this, undefined, undefined, function* () { + let stats = undefined; + try { + stats = yield exports2.stat(filePath); + } catch (err) { + if (err.code !== "ENOENT") { + console.log(`Unexpected error attempting to determine if executable file exists '${filePath}': ${err}`); + } + } + if (stats && stats.isFile()) { + if (exports2.IS_WINDOWS) { + const upperExt = path.extname(filePath).toUpperCase(); + if (extensions.some((validExt) => validExt.toUpperCase() === upperExt)) { + return filePath; + } + } else { + if (isUnixExecutable(stats)) { + return filePath; + } + } + } + const originalFilePath = filePath; + for (const extension of extensions) { + filePath = originalFilePath + extension; + stats = undefined; + try { + stats = yield exports2.stat(filePath); + } catch (err) { + if (err.code !== "ENOENT") { + console.log(`Unexpected error attempting to determine if executable file exists '${filePath}': ${err}`); + } + } + if (stats && stats.isFile()) { + if (exports2.IS_WINDOWS) { + try { + const directory = path.dirname(filePath); + const upperName = path.basename(filePath).toUpperCase(); + for (const actualName of yield exports2.readdir(directory)) { + if (upperName === actualName.toUpperCase()) { + filePath = path.join(directory, actualName); + break; + } + } + } catch (err) { + console.log(`Unexpected error attempting to determine the actual case of the file '${filePath}': ${err}`); + } + return filePath; + } else { + if (isUnixExecutable(stats)) { + return filePath; + } + } + } + } + return ""; + }); + } + exports2.tryGetExecutablePath = tryGetExecutablePath; + function normalizeSeparators(p) { + p = p || ""; + if (exports2.IS_WINDOWS) { + p = p.replace(/\//g, "\\"); + return p.replace(/\\\\+/g, "\\"); + } + return p.replace(/\/\/+/g, "/"); + } + function isUnixExecutable(stats) { + return (stats.mode & 1) > 0 || (stats.mode & 8) > 0 && stats.gid === process.getgid() || (stats.mode & 64) > 0 && stats.uid === process.getuid(); + } + function getCmdPath() { + var _a2; + return (_a2 = process.env["COMSPEC"]) !== null && _a2 !== undefined ? _a2 : `cmd.exe`; + } + exports2.getCmdPath = getCmdPath; +}); + +// node_modules/@actions/io/lib/io.js +var require_io = __commonJS((exports2) => { + var __createBinding = exports2 && exports2.__createBinding || (Object.create ? function(o, m, k, k2) { + if (k2 === undefined) + k2 = k; + Object.defineProperty(o, k2, { enumerable: true, get: function() { + return m[k]; + } }); + } : function(o, m, k, k2) { + if (k2 === undefined) + k2 = k; + o[k2] = m[k]; + }); + var __setModuleDefault = exports2 && exports2.__setModuleDefault || (Object.create ? function(o, v) { + Object.defineProperty(o, "default", { enumerable: true, value: v }); + } : function(o, v) { + o["default"] = v; + }); + var __importStar = exports2 && exports2.__importStar || function(mod) { + if (mod && mod.__esModule) + return mod; + var result = {}; + if (mod != null) { + for (var k in mod) + if (k !== "default" && Object.hasOwnProperty.call(mod, k)) + __createBinding(result, mod, k); + } + __setModuleDefault(result, mod); + return result; + }; + var __awaiter = exports2 && exports2.__awaiter || function(thisArg, _arguments, P, generator) { + function adopt(value) { + return value instanceof P ? value : new P(function(resolve) { + resolve(value); + }); + } + return new (P || (P = Promise))(function(resolve, reject) { + function fulfilled(value) { + try { + step(generator.next(value)); + } catch (e) { + reject(e); + } + } + function rejected(value) { + try { + step(generator["throw"](value)); + } catch (e) { + reject(e); + } + } + function step(result) { + result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); + } + step((generator = generator.apply(thisArg, _arguments || [])).next()); + }); + }; + Object.defineProperty(exports2, "__esModule", { value: true }); + exports2.findInPath = exports2.which = exports2.mkdirP = exports2.rmRF = exports2.mv = exports2.cp = undefined; + var assert_1 = require("assert"); + var path = __importStar(require("path")); + var ioUtil = __importStar(require_io_util()); + function cp(source, dest, options = {}) { + return __awaiter(this, undefined, undefined, function* () { + const { force, recursive, copySourceDirectory } = readCopyOptions(options); + const destStat = (yield ioUtil.exists(dest)) ? yield ioUtil.stat(dest) : null; + if (destStat && destStat.isFile() && !force) { + return; + } + const newDest = destStat && destStat.isDirectory() && copySourceDirectory ? path.join(dest, path.basename(source)) : dest; + if (!(yield ioUtil.exists(source))) { + throw new Error(`no such file or directory: ${source}`); + } + const sourceStat = yield ioUtil.stat(source); + if (sourceStat.isDirectory()) { + if (!recursive) { + throw new Error(`Failed to copy. ${source} is a directory, but tried to copy without recursive flag.`); + } else { + yield cpDirRecursive(source, newDest, 0, force); + } + } else { + if (path.relative(source, newDest) === "") { + throw new Error(`'${newDest}' and '${source}' are the same file`); + } + yield copyFile(source, newDest, force); + } + }); + } + exports2.cp = cp; + function mv(source, dest, options = {}) { + return __awaiter(this, undefined, undefined, function* () { + if (yield ioUtil.exists(dest)) { + let destExists = true; + if (yield ioUtil.isDirectory(dest)) { + dest = path.join(dest, path.basename(source)); + destExists = yield ioUtil.exists(dest); + } + if (destExists) { + if (options.force == null || options.force) { + yield rmRF(dest); + } else { + throw new Error("Destination already exists"); + } + } + } + yield mkdirP(path.dirname(dest)); + yield ioUtil.rename(source, dest); + }); + } + exports2.mv = mv; + function rmRF(inputPath) { + return __awaiter(this, undefined, undefined, function* () { + if (ioUtil.IS_WINDOWS) { + if (/[*"<>|]/.test(inputPath)) { + throw new Error('File path must not contain `*`, `"`, `<`, `>` or `|` on Windows'); + } + } + try { + yield ioUtil.rm(inputPath, { + force: true, + maxRetries: 3, + recursive: true, + retryDelay: 300 + }); + } catch (err) { + throw new Error(`File was unable to be removed ${err}`); + } + }); + } + exports2.rmRF = rmRF; + function mkdirP(fsPath) { + return __awaiter(this, undefined, undefined, function* () { + assert_1.ok(fsPath, "a path argument must be provided"); + yield ioUtil.mkdir(fsPath, { recursive: true }); + }); + } + exports2.mkdirP = mkdirP; + function which(tool, check) { + return __awaiter(this, undefined, undefined, function* () { + if (!tool) { + throw new Error("parameter 'tool' is required"); + } + if (check) { + const result = yield which(tool, false); + if (!result) { + if (ioUtil.IS_WINDOWS) { + throw new Error(`Unable to locate executable file: ${tool}. Please verify either the file path exists or the file can be found within a directory specified by the PATH environment variable. Also verify the file has a valid extension for an executable file.`); + } else { + throw new Error(`Unable to locate executable file: ${tool}. Please verify either the file path exists or the file can be found within a directory specified by the PATH environment variable. Also check the file mode to verify the file is executable.`); + } + } + return result; + } + const matches = yield findInPath(tool); + if (matches && matches.length > 0) { + return matches[0]; + } + return ""; + }); + } + exports2.which = which; + function findInPath(tool) { + return __awaiter(this, undefined, undefined, function* () { + if (!tool) { + throw new Error("parameter 'tool' is required"); + } + const extensions = []; + if (ioUtil.IS_WINDOWS && process.env["PATHEXT"]) { + for (const extension of process.env["PATHEXT"].split(path.delimiter)) { + if (extension) { + extensions.push(extension); + } + } + } + if (ioUtil.isRooted(tool)) { + const filePath = yield ioUtil.tryGetExecutablePath(tool, extensions); + if (filePath) { + return [filePath]; + } + return []; + } + if (tool.includes(path.sep)) { + return []; + } + const directories = []; + if (process.env.PATH) { + for (const p of process.env.PATH.split(path.delimiter)) { + if (p) { + directories.push(p); + } + } + } + const matches = []; + for (const directory of directories) { + const filePath = yield ioUtil.tryGetExecutablePath(path.join(directory, tool), extensions); + if (filePath) { + matches.push(filePath); + } + } + return matches; + }); + } + exports2.findInPath = findInPath; + function readCopyOptions(options) { + const force = options.force == null ? true : options.force; + const recursive = Boolean(options.recursive); + const copySourceDirectory = options.copySourceDirectory == null ? true : Boolean(options.copySourceDirectory); + return { force, recursive, copySourceDirectory }; + } + function cpDirRecursive(sourceDir, destDir, currentDepth, force) { + return __awaiter(this, undefined, undefined, function* () { + if (currentDepth >= 255) + return; + currentDepth++; + yield mkdirP(destDir); + const files = yield ioUtil.readdir(sourceDir); + for (const fileName of files) { + const srcFile = `${sourceDir}/${fileName}`; + const destFile = `${destDir}/${fileName}`; + const srcFileStat = yield ioUtil.lstat(srcFile); + if (srcFileStat.isDirectory()) { + yield cpDirRecursive(srcFile, destFile, currentDepth, force); + } else { + yield copyFile(srcFile, destFile, force); + } + } + yield ioUtil.chmod(destDir, (yield ioUtil.stat(sourceDir)).mode); + }); + } + function copyFile(srcFile, destFile, force) { + return __awaiter(this, undefined, undefined, function* () { + if ((yield ioUtil.lstat(srcFile)).isSymbolicLink()) { + try { + yield ioUtil.lstat(destFile); + yield ioUtil.unlink(destFile); + } catch (e) { + if (e.code === "EPERM") { + yield ioUtil.chmod(destFile, "0666"); + yield ioUtil.unlink(destFile); + } + } + const symlinkFull = yield ioUtil.readlink(srcFile); + yield ioUtil.symlink(symlinkFull, destFile, ioUtil.IS_WINDOWS ? "junction" : null); + } else if (!(yield ioUtil.exists(destFile)) || force) { + yield ioUtil.copyFile(srcFile, destFile); + } + }); + } +}); + +// node_modules/@actions/exec/lib/toolrunner.js +var require_toolrunner = __commonJS((exports2) => { + var __createBinding = exports2 && exports2.__createBinding || (Object.create ? function(o, m, k, k2) { + if (k2 === undefined) + k2 = k; + Object.defineProperty(o, k2, { enumerable: true, get: function() { + return m[k]; + } }); + } : function(o, m, k, k2) { + if (k2 === undefined) + k2 = k; + o[k2] = m[k]; + }); + var __setModuleDefault = exports2 && exports2.__setModuleDefault || (Object.create ? function(o, v) { + Object.defineProperty(o, "default", { enumerable: true, value: v }); + } : function(o, v) { + o["default"] = v; + }); + var __importStar = exports2 && exports2.__importStar || function(mod) { + if (mod && mod.__esModule) + return mod; + var result = {}; + if (mod != null) { + for (var k in mod) + if (k !== "default" && Object.hasOwnProperty.call(mod, k)) + __createBinding(result, mod, k); + } + __setModuleDefault(result, mod); + return result; + }; + var __awaiter = exports2 && exports2.__awaiter || function(thisArg, _arguments, P, generator) { + function adopt(value) { + return value instanceof P ? value : new P(function(resolve) { + resolve(value); + }); + } + return new (P || (P = Promise))(function(resolve, reject) { + function fulfilled(value) { + try { + step(generator.next(value)); + } catch (e) { + reject(e); + } + } + function rejected(value) { + try { + step(generator["throw"](value)); + } catch (e) { + reject(e); + } + } + function step(result) { + result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); + } + step((generator = generator.apply(thisArg, _arguments || [])).next()); + }); + }; + Object.defineProperty(exports2, "__esModule", { value: true }); + exports2.argStringToArray = exports2.ToolRunner = undefined; + var os = __importStar(require("os")); + var events = __importStar(require("events")); + var child = __importStar(require("child_process")); + var path = __importStar(require("path")); + var io = __importStar(require_io()); + var ioUtil = __importStar(require_io_util()); + var timers_1 = require("timers"); + var IS_WINDOWS = process.platform === "win32"; + + class ToolRunner extends events.EventEmitter { + constructor(toolPath, args, options) { + super(); + if (!toolPath) { + throw new Error("Parameter 'toolPath' cannot be null or empty."); + } + this.toolPath = toolPath; + this.args = args || []; + this.options = options || {}; + } + _debug(message) { + if (this.options.listeners && this.options.listeners.debug) { + this.options.listeners.debug(message); + } + } + _getCommandString(options, noPrefix) { + const toolPath = this._getSpawnFileName(); + const args = this._getSpawnArgs(options); + let cmd = noPrefix ? "" : "[command]"; + if (IS_WINDOWS) { + if (this._isCmdFile()) { + cmd += toolPath; + for (const a of args) { + cmd += ` ${a}`; + } + } else if (options.windowsVerbatimArguments) { + cmd += `"${toolPath}"`; + for (const a of args) { + cmd += ` ${a}`; + } + } else { + cmd += this._windowsQuoteCmdArg(toolPath); + for (const a of args) { + cmd += ` ${this._windowsQuoteCmdArg(a)}`; + } + } + } else { + cmd += toolPath; + for (const a of args) { + cmd += ` ${a}`; + } + } + return cmd; + } + _processLineBuffer(data, strBuffer, onLine) { + try { + let s = strBuffer + data.toString(); + let n = s.indexOf(os.EOL); + while (n > -1) { + const line = s.substring(0, n); + onLine(line); + s = s.substring(n + os.EOL.length); + n = s.indexOf(os.EOL); + } + return s; + } catch (err) { + this._debug(`error processing line. Failed with error ${err}`); + return ""; + } + } + _getSpawnFileName() { + if (IS_WINDOWS) { + if (this._isCmdFile()) { + return process.env["COMSPEC"] || "cmd.exe"; + } + } + return this.toolPath; + } + _getSpawnArgs(options) { + if (IS_WINDOWS) { + if (this._isCmdFile()) { + let argline = `/D /S /C "${this._windowsQuoteCmdArg(this.toolPath)}`; + for (const a of this.args) { + argline += " "; + argline += options.windowsVerbatimArguments ? a : this._windowsQuoteCmdArg(a); + } + argline += '"'; + return [argline]; + } + } + return this.args; + } + _endsWith(str, end) { + return str.endsWith(end); + } + _isCmdFile() { + const upperToolPath = this.toolPath.toUpperCase(); + return this._endsWith(upperToolPath, ".CMD") || this._endsWith(upperToolPath, ".BAT"); + } + _windowsQuoteCmdArg(arg) { + if (!this._isCmdFile()) { + return this._uvQuoteCmdArg(arg); + } + if (!arg) { + return '""'; + } + const cmdSpecialChars = [ + " ", + "\t", + "&", + "(", + ")", + "[", + "]", + "{", + "}", + "^", + "=", + ";", + "!", + "'", + "+", + ",", + "`", + "~", + "|", + "<", + ">", + '"' + ]; + let needsQuotes = false; + for (const char of arg) { + if (cmdSpecialChars.some((x) => x === char)) { + needsQuotes = true; + break; + } + } + if (!needsQuotes) { + return arg; + } + let reverse = '"'; + let quoteHit = true; + for (let i = arg.length;i > 0; i--) { + reverse += arg[i - 1]; + if (quoteHit && arg[i - 1] === "\\") { + reverse += "\\"; + } else if (arg[i - 1] === '"') { + quoteHit = true; + reverse += '"'; + } else { + quoteHit = false; + } + } + reverse += '"'; + return reverse.split("").reverse().join(""); + } + _uvQuoteCmdArg(arg) { + if (!arg) { + return '""'; + } + if (!arg.includes(" ") && !arg.includes("\t") && !arg.includes('"')) { + return arg; + } + if (!arg.includes('"') && !arg.includes("\\")) { + return `"${arg}"`; + } + let reverse = '"'; + let quoteHit = true; + for (let i = arg.length;i > 0; i--) { + reverse += arg[i - 1]; + if (quoteHit && arg[i - 1] === "\\") { + reverse += "\\"; + } else if (arg[i - 1] === '"') { + quoteHit = true; + reverse += "\\"; + } else { + quoteHit = false; + } + } + reverse += '"'; + return reverse.split("").reverse().join(""); + } + _cloneExecOptions(options) { + options = options || {}; + const result = { + cwd: options.cwd || process.cwd(), + env: options.env || process.env, + silent: options.silent || false, + windowsVerbatimArguments: options.windowsVerbatimArguments || false, + failOnStdErr: options.failOnStdErr || false, + ignoreReturnCode: options.ignoreReturnCode || false, + delay: options.delay || 1e4 + }; + result.outStream = options.outStream || process.stdout; + result.errStream = options.errStream || process.stderr; + return result; + } + _getSpawnOptions(options, toolPath) { + options = options || {}; + const result = {}; + result.cwd = options.cwd; + result.env = options.env; + result["windowsVerbatimArguments"] = options.windowsVerbatimArguments || this._isCmdFile(); + if (options.windowsVerbatimArguments) { + result.argv0 = `"${toolPath}"`; + } + return result; + } + exec() { + return __awaiter(this, undefined, undefined, function* () { + if (!ioUtil.isRooted(this.toolPath) && (this.toolPath.includes("/") || IS_WINDOWS && this.toolPath.includes("\\"))) { + this.toolPath = path.resolve(process.cwd(), this.options.cwd || process.cwd(), this.toolPath); + } + this.toolPath = yield io.which(this.toolPath, true); + return new Promise((resolve, reject) => __awaiter(this, undefined, undefined, function* () { + this._debug(`exec tool: ${this.toolPath}`); + this._debug("arguments:"); + for (const arg of this.args) { + this._debug(` ${arg}`); + } + const optionsNonNull = this._cloneExecOptions(this.options); + if (!optionsNonNull.silent && optionsNonNull.outStream) { + optionsNonNull.outStream.write(this._getCommandString(optionsNonNull) + os.EOL); + } + const state = new ExecState(optionsNonNull, this.toolPath); + state.on("debug", (message) => { + this._debug(message); + }); + if (this.options.cwd && !(yield ioUtil.exists(this.options.cwd))) { + return reject(new Error(`The cwd: ${this.options.cwd} does not exist!`)); + } + const fileName = this._getSpawnFileName(); + const cp = child.spawn(fileName, this._getSpawnArgs(optionsNonNull), this._getSpawnOptions(this.options, fileName)); + let stdbuffer = ""; + if (cp.stdout) { + cp.stdout.on("data", (data) => { + if (this.options.listeners && this.options.listeners.stdout) { + this.options.listeners.stdout(data); + } + if (!optionsNonNull.silent && optionsNonNull.outStream) { + optionsNonNull.outStream.write(data); + } + stdbuffer = this._processLineBuffer(data, stdbuffer, (line) => { + if (this.options.listeners && this.options.listeners.stdline) { + this.options.listeners.stdline(line); + } + }); + }); + } + let errbuffer = ""; + if (cp.stderr) { + cp.stderr.on("data", (data) => { + state.processStderr = true; + if (this.options.listeners && this.options.listeners.stderr) { + this.options.listeners.stderr(data); + } + if (!optionsNonNull.silent && optionsNonNull.errStream && optionsNonNull.outStream) { + const s = optionsNonNull.failOnStdErr ? optionsNonNull.errStream : optionsNonNull.outStream; + s.write(data); + } + errbuffer = this._processLineBuffer(data, errbuffer, (line) => { + if (this.options.listeners && this.options.listeners.errline) { + this.options.listeners.errline(line); + } + }); + }); + } + cp.on("error", (err) => { + state.processError = err.message; + state.processExited = true; + state.processClosed = true; + state.CheckComplete(); + }); + cp.on("exit", (code) => { + state.processExitCode = code; + state.processExited = true; + this._debug(`Exit code ${code} received from tool '${this.toolPath}'`); + state.CheckComplete(); + }); + cp.on("close", (code) => { + state.processExitCode = code; + state.processExited = true; + state.processClosed = true; + this._debug(`STDIO streams have closed for tool '${this.toolPath}'`); + state.CheckComplete(); + }); + state.on("done", (error, exitCode) => { + if (stdbuffer.length > 0) { + this.emit("stdline", stdbuffer); + } + if (errbuffer.length > 0) { + this.emit("errline", errbuffer); + } + cp.removeAllListeners(); + if (error) { + reject(error); + } else { + resolve(exitCode); + } + }); + if (this.options.input) { + if (!cp.stdin) { + throw new Error("child process missing stdin"); + } + cp.stdin.end(this.options.input); + } + })); + }); + } + } + exports2.ToolRunner = ToolRunner; + function argStringToArray(argString) { + const args = []; + let inQuotes = false; + let escaped = false; + let arg = ""; + function append(c) { + if (escaped && c !== '"') { + arg += "\\"; + } + arg += c; + escaped = false; + } + for (let i = 0;i < argString.length; i++) { + const c = argString.charAt(i); + if (c === '"') { + if (!escaped) { + inQuotes = !inQuotes; + } else { + append(c); + } + continue; + } + if (c === "\\" && escaped) { + append(c); + continue; + } + if (c === "\\" && inQuotes) { + escaped = true; + continue; + } + if (c === " " && !inQuotes) { + if (arg.length > 0) { + args.push(arg); + arg = ""; + } + continue; + } + append(c); + } + if (arg.length > 0) { + args.push(arg.trim()); + } + return args; + } + exports2.argStringToArray = argStringToArray; + + class ExecState extends events.EventEmitter { + constructor(options, toolPath) { + super(); + this.processClosed = false; + this.processError = ""; + this.processExitCode = 0; + this.processExited = false; + this.processStderr = false; + this.delay = 1e4; + this.done = false; + this.timeout = null; + if (!toolPath) { + throw new Error("toolPath must not be empty"); + } + this.options = options; + this.toolPath = toolPath; + if (options.delay) { + this.delay = options.delay; + } + } + CheckComplete() { + if (this.done) { + return; + } + if (this.processClosed) { + this._setResult(); + } else if (this.processExited) { + this.timeout = timers_1.setTimeout(ExecState.HandleTimeout, this.delay, this); + } + } + _debug(message) { + this.emit("debug", message); + } + _setResult() { + let error; + if (this.processExited) { + if (this.processError) { + error = new Error(`There was an error when attempting to execute the process '${this.toolPath}'. This may indicate the process failed to start. Error: ${this.processError}`); + } else if (this.processExitCode !== 0 && !this.options.ignoreReturnCode) { + error = new Error(`The process '${this.toolPath}' failed with exit code ${this.processExitCode}`); + } else if (this.processStderr && this.options.failOnStdErr) { + error = new Error(`The process '${this.toolPath}' failed because one or more lines were written to the STDERR stream`); + } + } + if (this.timeout) { + clearTimeout(this.timeout); + this.timeout = null; + } + this.done = true; + this.emit("done", error, this.processExitCode); + } + static HandleTimeout(state) { + if (state.done) { + return; + } + if (!state.processClosed && state.processExited) { + const message = `The STDIO streams did not close within ${state.delay / 1000} seconds of the exit event from process '${state.toolPath}'. This may indicate a child process inherited the STDIO streams and has not yet exited.`; + state._debug(message); + } + state._setResult(); + } + } +}); + +// node_modules/@actions/exec/lib/exec.js +var require_exec = __commonJS((exports2) => { + var __createBinding = exports2 && exports2.__createBinding || (Object.create ? function(o, m, k, k2) { + if (k2 === undefined) + k2 = k; + Object.defineProperty(o, k2, { enumerable: true, get: function() { + return m[k]; + } }); + } : function(o, m, k, k2) { + if (k2 === undefined) + k2 = k; + o[k2] = m[k]; + }); + var __setModuleDefault = exports2 && exports2.__setModuleDefault || (Object.create ? function(o, v) { + Object.defineProperty(o, "default", { enumerable: true, value: v }); + } : function(o, v) { + o["default"] = v; + }); + var __importStar = exports2 && exports2.__importStar || function(mod) { + if (mod && mod.__esModule) + return mod; + var result = {}; + if (mod != null) { + for (var k in mod) + if (k !== "default" && Object.hasOwnProperty.call(mod, k)) + __createBinding(result, mod, k); + } + __setModuleDefault(result, mod); + return result; + }; + var __awaiter = exports2 && exports2.__awaiter || function(thisArg, _arguments, P, generator) { + function adopt(value) { + return value instanceof P ? value : new P(function(resolve) { + resolve(value); + }); + } + return new (P || (P = Promise))(function(resolve, reject) { + function fulfilled(value) { + try { + step(generator.next(value)); + } catch (e) { + reject(e); + } + } + function rejected(value) { + try { + step(generator["throw"](value)); + } catch (e) { + reject(e); + } + } + function step(result) { + result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); + } + step((generator = generator.apply(thisArg, _arguments || [])).next()); + }); + }; + Object.defineProperty(exports2, "__esModule", { value: true }); + exports2.getExecOutput = exports2.exec = undefined; + var string_decoder_1 = require("string_decoder"); + var tr = __importStar(require_toolrunner()); + function exec(commandLine, args, options) { + return __awaiter(this, undefined, undefined, function* () { + const commandArgs = tr.argStringToArray(commandLine); + if (commandArgs.length === 0) { + throw new Error(`Parameter 'commandLine' cannot be null or empty.`); + } + const toolPath = commandArgs[0]; + args = commandArgs.slice(1).concat(args || []); + const runner = new tr.ToolRunner(toolPath, args, options); + return runner.exec(); + }); + } + exports2.exec = exec; + function getExecOutput(commandLine, args, options) { + var _a, _b; + return __awaiter(this, undefined, undefined, function* () { + let stdout = ""; + let stderr = ""; + const stdoutDecoder = new string_decoder_1.StringDecoder("utf8"); + const stderrDecoder = new string_decoder_1.StringDecoder("utf8"); + const originalStdoutListener = (_a = options === null || options === undefined ? undefined : options.listeners) === null || _a === undefined ? undefined : _a.stdout; + const originalStdErrListener = (_b = options === null || options === undefined ? undefined : options.listeners) === null || _b === undefined ? undefined : _b.stderr; + const stdErrListener = (data) => { + stderr += stderrDecoder.write(data); + if (originalStdErrListener) { + originalStdErrListener(data); + } + }; + const stdOutListener = (data) => { + stdout += stdoutDecoder.write(data); + if (originalStdoutListener) { + originalStdoutListener(data); + } + }; + const listeners = Object.assign(Object.assign({}, options === null || options === undefined ? undefined : options.listeners), { stdout: stdOutListener, stderr: stdErrListener }); + const exitCode = yield exec(commandLine, args, Object.assign(Object.assign({}, options), { listeners })); + stdout += stdoutDecoder.end(); + stderr += stderrDecoder.end(); + return { + exitCode, + stdout, + stderr + }; + }); + } + exports2.getExecOutput = getExecOutput; +}); + +// node_modules/@actions/core/lib/platform.js +var require_platform = __commonJS((exports2) => { + var __createBinding = exports2 && exports2.__createBinding || (Object.create ? function(o, m, k, k2) { + if (k2 === undefined) + k2 = k; + var desc = Object.getOwnPropertyDescriptor(m, k); + if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) { + desc = { enumerable: true, get: function() { + return m[k]; + } }; + } + Object.defineProperty(o, k2, desc); + } : function(o, m, k, k2) { + if (k2 === undefined) + k2 = k; + o[k2] = m[k]; + }); + var __setModuleDefault = exports2 && exports2.__setModuleDefault || (Object.create ? function(o, v) { + Object.defineProperty(o, "default", { enumerable: true, value: v }); + } : function(o, v) { + o["default"] = v; + }); + var __importStar = exports2 && exports2.__importStar || function(mod) { + if (mod && mod.__esModule) + return mod; + var result = {}; + if (mod != null) { + for (var k in mod) + if (k !== "default" && Object.prototype.hasOwnProperty.call(mod, k)) + __createBinding(result, mod, k); + } + __setModuleDefault(result, mod); + return result; + }; + var __awaiter = exports2 && exports2.__awaiter || function(thisArg, _arguments, P, generator) { + function adopt(value) { + return value instanceof P ? value : new P(function(resolve) { + resolve(value); + }); + } + return new (P || (P = Promise))(function(resolve, reject) { + function fulfilled(value) { + try { + step(generator.next(value)); + } catch (e) { + reject(e); + } + } + function rejected(value) { + try { + step(generator["throw"](value)); + } catch (e) { + reject(e); + } + } + function step(result) { + result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); + } + step((generator = generator.apply(thisArg, _arguments || [])).next()); + }); + }; + var __importDefault = exports2 && exports2.__importDefault || function(mod) { + return mod && mod.__esModule ? mod : { default: mod }; + }; + Object.defineProperty(exports2, "__esModule", { value: true }); + exports2.getDetails = exports2.isLinux = exports2.isMacOS = exports2.isWindows = exports2.arch = exports2.platform = undefined; + var os_1 = __importDefault(require("os")); + var exec = __importStar(require_exec()); + var getWindowsInfo = () => __awaiter(undefined, undefined, undefined, function* () { + const { stdout: version } = yield exec.getExecOutput('powershell -command "(Get-CimInstance -ClassName Win32_OperatingSystem).Version"', undefined, { + silent: true + }); + const { stdout: name } = yield exec.getExecOutput('powershell -command "(Get-CimInstance -ClassName Win32_OperatingSystem).Caption"', undefined, { + silent: true + }); + return { + name: name.trim(), + version: version.trim() + }; + }); + var getMacOsInfo = () => __awaiter(undefined, undefined, undefined, function* () { + var _a, _b, _c, _d; + const { stdout } = yield exec.getExecOutput("sw_vers", undefined, { + silent: true + }); + const version = (_b = (_a = stdout.match(/ProductVersion:\s*(.+)/)) === null || _a === undefined ? undefined : _a[1]) !== null && _b !== undefined ? _b : ""; + const name = (_d = (_c = stdout.match(/ProductName:\s*(.+)/)) === null || _c === undefined ? undefined : _c[1]) !== null && _d !== undefined ? _d : ""; + return { + name, + version + }; + }); + var getLinuxInfo = () => __awaiter(undefined, undefined, undefined, function* () { + const { stdout } = yield exec.getExecOutput("lsb_release", ["-i", "-r", "-s"], { + silent: true + }); + const [name, version] = stdout.trim().split("\n"); + return { + name, + version + }; + }); + exports2.platform = os_1.default.platform(); + exports2.arch = os_1.default.arch(); + exports2.isWindows = exports2.platform === "win32"; + exports2.isMacOS = exports2.platform === "darwin"; + exports2.isLinux = exports2.platform === "linux"; + function getDetails() { + return __awaiter(this, undefined, undefined, function* () { + return Object.assign(Object.assign({}, yield exports2.isWindows ? getWindowsInfo() : exports2.isMacOS ? getMacOsInfo() : getLinuxInfo()), { + platform: exports2.platform, + arch: exports2.arch, + isWindows: exports2.isWindows, + isMacOS: exports2.isMacOS, + isLinux: exports2.isLinux + }); + }); + } + exports2.getDetails = getDetails; +}); + +// node_modules/@actions/core/lib/core.js +var require_core = __commonJS((exports2) => { + var __createBinding = exports2 && exports2.__createBinding || (Object.create ? function(o, m, k, k2) { + if (k2 === undefined) + k2 = k; + var desc = Object.getOwnPropertyDescriptor(m, k); + if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) { + desc = { enumerable: true, get: function() { + return m[k]; + } }; + } + Object.defineProperty(o, k2, desc); + } : function(o, m, k, k2) { + if (k2 === undefined) + k2 = k; + o[k2] = m[k]; + }); + var __setModuleDefault = exports2 && exports2.__setModuleDefault || (Object.create ? function(o, v) { + Object.defineProperty(o, "default", { enumerable: true, value: v }); + } : function(o, v) { + o["default"] = v; + }); + var __importStar = exports2 && exports2.__importStar || function(mod) { + if (mod && mod.__esModule) + return mod; + var result = {}; + if (mod != null) { + for (var k in mod) + if (k !== "default" && Object.prototype.hasOwnProperty.call(mod, k)) + __createBinding(result, mod, k); + } + __setModuleDefault(result, mod); + return result; + }; + var __awaiter = exports2 && exports2.__awaiter || function(thisArg, _arguments, P, generator) { + function adopt(value) { + return value instanceof P ? value : new P(function(resolve) { + resolve(value); + }); + } + return new (P || (P = Promise))(function(resolve, reject) { + function fulfilled(value) { + try { + step(generator.next(value)); + } catch (e) { + reject(e); + } + } + function rejected(value) { + try { + step(generator["throw"](value)); + } catch (e) { + reject(e); + } + } + function step(result) { + result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); + } + step((generator = generator.apply(thisArg, _arguments || [])).next()); + }); + }; + Object.defineProperty(exports2, "__esModule", { value: true }); + exports2.platform = exports2.toPlatformPath = exports2.toWin32Path = exports2.toPosixPath = exports2.markdownSummary = exports2.summary = exports2.getIDToken = exports2.getState = exports2.saveState = exports2.group = exports2.endGroup = exports2.startGroup = exports2.info = exports2.notice = exports2.warning = exports2.error = exports2.debug = exports2.isDebug = exports2.setFailed = exports2.setCommandEcho = exports2.setOutput = exports2.getBooleanInput = exports2.getMultilineInput = exports2.getInput = exports2.addPath = exports2.setSecret = exports2.exportVariable = exports2.ExitCode = undefined; + var command_1 = require_command(); + var file_command_1 = require_file_command(); + var utils_1 = require_utils(); + var os = __importStar(require("os")); + var path = __importStar(require("path")); + var oidc_utils_1 = require_oidc_utils(); + var ExitCode; + (function(ExitCode2) { + ExitCode2[ExitCode2["Success"] = 0] = "Success"; + ExitCode2[ExitCode2["Failure"] = 1] = "Failure"; + })(ExitCode || (exports2.ExitCode = ExitCode = {})); + function exportVariable(name, val2) { + const convertedVal = (0, utils_1.toCommandValue)(val2); + process.env[name] = convertedVal; + const filePath = process.env["GITHUB_ENV"] || ""; + if (filePath) { + return (0, file_command_1.issueFileCommand)("ENV", (0, file_command_1.prepareKeyValueMessage)(name, val2)); + } + (0, command_1.issueCommand)("set-env", { name }, convertedVal); + } + exports2.exportVariable = exportVariable; + function setSecret(secret) { + (0, command_1.issueCommand)("add-mask", {}, secret); + } + exports2.setSecret = setSecret; + function addPath(inputPath) { + const filePath = process.env["GITHUB_PATH"] || ""; + if (filePath) { + (0, file_command_1.issueFileCommand)("PATH", inputPath); + } else { + (0, command_1.issueCommand)("add-path", {}, inputPath); + } + process.env["PATH"] = `${inputPath}${path.delimiter}${process.env["PATH"]}`; + } + exports2.addPath = addPath; + function getInput(name, options) { + const val2 = process.env[`INPUT_${name.replace(/ /g, "_").toUpperCase()}`] || ""; + if (options && options.required && !val2) { + throw new Error(`Input required and not supplied: ${name}`); + } + if (options && options.trimWhitespace === false) { + return val2; + } + return val2.trim(); + } + exports2.getInput = getInput; + function getMultilineInput(name, options) { + const inputs = getInput(name, options).split("\n").filter((x) => x !== ""); + if (options && options.trimWhitespace === false) { + return inputs; + } + return inputs.map((input) => input.trim()); + } + exports2.getMultilineInput = getMultilineInput; + function getBooleanInput(name, options) { + const trueValue = ["true", "True", "TRUE"]; + const falseValue = ["false", "False", "FALSE"]; + const val2 = getInput(name, options); + if (trueValue.includes(val2)) + return true; + if (falseValue.includes(val2)) + return false; + throw new TypeError(`Input does not meet YAML 1.2 "Core Schema" specification: ${name}\n` + `Support boolean input list: \`true | True | TRUE | false | False | FALSE\``); + } + exports2.getBooleanInput = getBooleanInput; + function setOutput(name, value) { + const filePath = process.env["GITHUB_OUTPUT"] || ""; + if (filePath) { + return (0, file_command_1.issueFileCommand)("OUTPUT", (0, file_command_1.prepareKeyValueMessage)(name, value)); + } + process.stdout.write(os.EOL); + (0, command_1.issueCommand)("set-output", { name }, (0, utils_1.toCommandValue)(value)); + } + exports2.setOutput = setOutput; + function setCommandEcho(enabled) { + (0, command_1.issue)("echo", enabled ? "on" : "off"); + } + exports2.setCommandEcho = setCommandEcho; + function setFailed(message) { + process.exitCode = ExitCode.Failure; + error(message); + } + exports2.setFailed = setFailed; + function isDebug() { + return process.env["RUNNER_DEBUG"] === "1"; + } + exports2.isDebug = isDebug; + function debug(message) { + (0, command_1.issueCommand)("debug", {}, message); + } + exports2.debug = debug; + function error(message, properties = {}) { + (0, command_1.issueCommand)("error", (0, utils_1.toCommandProperties)(properties), message instanceof Error ? message.toString() : message); + } + exports2.error = error; + function warning(message, properties = {}) { + (0, command_1.issueCommand)("warning", (0, utils_1.toCommandProperties)(properties), message instanceof Error ? message.toString() : message); + } + exports2.warning = warning; + function notice(message, properties = {}) { + (0, command_1.issueCommand)("notice", (0, utils_1.toCommandProperties)(properties), message instanceof Error ? message.toString() : message); + } + exports2.notice = notice; + function info(message) { + process.stdout.write(message + os.EOL); + } + exports2.info = info; + function startGroup(name) { + (0, command_1.issue)("group", name); + } + exports2.startGroup = startGroup; + function endGroup() { + (0, command_1.issue)("endgroup"); + } + exports2.endGroup = endGroup; + function group(name, fn) { + return __awaiter(this, undefined, undefined, function* () { + startGroup(name); + let result; + try { + result = yield fn(); + } finally { + endGroup(); + } + return result; + }); + } + exports2.group = group; + function saveState(name, value) { + const filePath = process.env["GITHUB_STATE"] || ""; + if (filePath) { + return (0, file_command_1.issueFileCommand)("STATE", (0, file_command_1.prepareKeyValueMessage)(name, value)); + } + (0, command_1.issueCommand)("save-state", { name }, (0, utils_1.toCommandValue)(value)); + } + exports2.saveState = saveState; + function getState(name) { + return process.env[`STATE_${name}`] || ""; + } + exports2.getState = getState; + function getIDToken(aud) { + return __awaiter(this, undefined, undefined, function* () { + return yield oidc_utils_1.OidcClient.getIDToken(aud); + }); + } + exports2.getIDToken = getIDToken; + var summary_1 = require_summary(); + Object.defineProperty(exports2, "summary", { enumerable: true, get: function() { + return summary_1.summary; + } }); + var summary_2 = require_summary(); + Object.defineProperty(exports2, "markdownSummary", { enumerable: true, get: function() { + return summary_2.markdownSummary; + } }); + var path_utils_1 = require_path_utils(); + Object.defineProperty(exports2, "toPosixPath", { enumerable: true, get: function() { + return path_utils_1.toPosixPath; + } }); + Object.defineProperty(exports2, "toWin32Path", { enumerable: true, get: function() { + return path_utils_1.toWin32Path; + } }); + Object.defineProperty(exports2, "toPlatformPath", { enumerable: true, get: function() { + return path_utils_1.toPlatformPath; + } }); + exports2.platform = __importStar(require_platform()); +}); + +// node_modules/@actions/github/lib/context.js +var require_context = __commonJS((exports2) => { + Object.defineProperty(exports2, "__esModule", { value: true }); + exports2.Context = undefined; + var fs_1 = require("fs"); + var os_1 = require("os"); + + class Context { + constructor() { + var _a, _b, _c; + this.payload = {}; + if (process.env.GITHUB_EVENT_PATH) { + if ((0, fs_1.existsSync)(process.env.GITHUB_EVENT_PATH)) { + this.payload = JSON.parse((0, fs_1.readFileSync)(process.env.GITHUB_EVENT_PATH, { encoding: "utf8" })); + } else { + const path = process.env.GITHUB_EVENT_PATH; + process.stdout.write(`GITHUB_EVENT_PATH ${path} does not exist${os_1.EOL}`); + } + } + this.eventName = process.env.GITHUB_EVENT_NAME; + this.sha = process.env.GITHUB_SHA; + this.ref = process.env.GITHUB_REF; + this.workflow = process.env.GITHUB_WORKFLOW; + this.action = process.env.GITHUB_ACTION; + this.actor = process.env.GITHUB_ACTOR; + this.job = process.env.GITHUB_JOB; + this.runNumber = parseInt(process.env.GITHUB_RUN_NUMBER, 10); + this.runId = parseInt(process.env.GITHUB_RUN_ID, 10); + this.apiUrl = (_a = process.env.GITHUB_API_URL) !== null && _a !== undefined ? _a : `https://api.github.com`; + this.serverUrl = (_b = process.env.GITHUB_SERVER_URL) !== null && _b !== undefined ? _b : `https://github.com`; + this.graphqlUrl = (_c = process.env.GITHUB_GRAPHQL_URL) !== null && _c !== undefined ? _c : `https://api.github.com/graphql`; + } + get issue() { + const payload = this.payload; + return Object.assign(Object.assign({}, this.repo), { number: (payload.issue || payload.pull_request || payload).number }); + } + get repo() { + if (process.env.GITHUB_REPOSITORY) { + const [owner, repo] = process.env.GITHUB_REPOSITORY.split("/"); + return { owner, repo }; + } + if (this.payload.repository) { + return { + owner: this.payload.repository.owner.login, + repo: this.payload.repository.name + }; + } + throw new Error("context.repo requires a GITHUB_REPOSITORY environment variable like 'owner/repo'"); + } + } + exports2.Context = Context; +}); + +// node_modules/@actions/github/lib/internal/utils.js +var require_utils3 = __commonJS((exports2) => { + var __createBinding = exports2 && exports2.__createBinding || (Object.create ? function(o, m, k, k2) { + if (k2 === undefined) + k2 = k; + var desc = Object.getOwnPropertyDescriptor(m, k); + if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) { + desc = { enumerable: true, get: function() { + return m[k]; + } }; + } + Object.defineProperty(o, k2, desc); + } : function(o, m, k, k2) { + if (k2 === undefined) + k2 = k; + o[k2] = m[k]; + }); + var __setModuleDefault = exports2 && exports2.__setModuleDefault || (Object.create ? function(o, v) { + Object.defineProperty(o, "default", { enumerable: true, value: v }); + } : function(o, v) { + o["default"] = v; + }); + var __importStar = exports2 && exports2.__importStar || function(mod) { + if (mod && mod.__esModule) + return mod; + var result = {}; + if (mod != null) { + for (var k in mod) + if (k !== "default" && Object.prototype.hasOwnProperty.call(mod, k)) + __createBinding(result, mod, k); + } + __setModuleDefault(result, mod); + return result; + }; + var __awaiter = exports2 && exports2.__awaiter || function(thisArg, _arguments, P, generator) { + function adopt(value) { + return value instanceof P ? value : new P(function(resolve) { + resolve(value); + }); + } + return new (P || (P = Promise))(function(resolve, reject) { + function fulfilled(value) { + try { + step(generator.next(value)); + } catch (e) { + reject(e); + } + } + function rejected(value) { + try { + step(generator["throw"](value)); + } catch (e) { + reject(e); + } + } + function step(result) { + result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); + } + step((generator = generator.apply(thisArg, _arguments || [])).next()); + }); + }; + Object.defineProperty(exports2, "__esModule", { value: true }); + exports2.getApiBaseUrl = exports2.getProxyFetch = exports2.getProxyAgentDispatcher = exports2.getProxyAgent = exports2.getAuthString = undefined; + var httpClient = __importStar(require_lib()); + var undici_1 = require_undici(); + function getAuthString(token, options) { + if (!token && !options.auth) { + throw new Error("Parameter token or opts.auth is required"); + } else if (token && options.auth) { + throw new Error("Parameters token and opts.auth may not both be specified"); + } + return typeof options.auth === "string" ? options.auth : `token ${token}`; + } + exports2.getAuthString = getAuthString; + function getProxyAgent(destinationUrl) { + const hc = new httpClient.HttpClient; + return hc.getAgent(destinationUrl); + } + exports2.getProxyAgent = getProxyAgent; + function getProxyAgentDispatcher(destinationUrl) { + const hc = new httpClient.HttpClient; + return hc.getAgentDispatcher(destinationUrl); + } + exports2.getProxyAgentDispatcher = getProxyAgentDispatcher; + function getProxyFetch(destinationUrl) { + const httpDispatcher = getProxyAgentDispatcher(destinationUrl); + const proxyFetch = (url, opts) => __awaiter(this, undefined, undefined, function* () { + return (0, undici_1.fetch)(url, Object.assign(Object.assign({}, opts), { dispatcher: httpDispatcher })); + }); + return proxyFetch; + } + exports2.getProxyFetch = getProxyFetch; + function getApiBaseUrl() { + return process.env["GITHUB_API_URL"] || "https://api.github.com"; + } + exports2.getApiBaseUrl = getApiBaseUrl; +}); + +// node_modules/universal-user-agent/dist-node/index.js +var require_dist_node = __commonJS((exports2) => { + Object.defineProperty(exports2, "__esModule", { value: true }); + function getUserAgent() { + if (typeof navigator === "object" && "userAgent" in navigator) { + return navigator.userAgent; + } + if (typeof process === "object" && process.version !== undefined) { + return `Node.js/${process.version.substr(1)} (${process.platform}; ${process.arch})`; + } + return ""; + } + exports2.getUserAgent = getUserAgent; +}); + +// node_modules/before-after-hook/lib/register.js +var require_register = __commonJS((exports2, module2) => { + module2.exports = register; + function register(state, name, method, options) { + if (typeof method !== "function") { + throw new Error("method for before hook must be a function"); + } + if (!options) { + options = {}; + } + if (Array.isArray(name)) { + return name.reverse().reduce(function(callback, name2) { + return register.bind(null, state, name2, callback, options); + }, method)(); + } + return Promise.resolve().then(function() { + if (!state.registry[name]) { + return method(options); + } + return state.registry[name].reduce(function(method2, registered) { + return registered.hook.bind(null, method2, options); + }, method)(); + }); + } +}); + +// node_modules/before-after-hook/lib/add.js +var require_add = __commonJS((exports2, module2) => { + module2.exports = addHook; + function addHook(state, kind, name, hook) { + var orig = hook; + if (!state.registry[name]) { + state.registry[name] = []; + } + if (kind === "before") { + hook = function(method, options) { + return Promise.resolve().then(orig.bind(null, options)).then(method.bind(null, options)); + }; + } + if (kind === "after") { + hook = function(method, options) { + var result; + return Promise.resolve().then(method.bind(null, options)).then(function(result_) { + result = result_; + return orig(result, options); + }).then(function() { + return result; + }); + }; + } + if (kind === "error") { + hook = function(method, options) { + return Promise.resolve().then(method.bind(null, options)).catch(function(error) { + return orig(error, options); + }); + }; + } + state.registry[name].push({ + hook, + orig + }); + } +}); + +// node_modules/before-after-hook/lib/remove.js +var require_remove = __commonJS((exports2, module2) => { + module2.exports = removeHook; + function removeHook(state, name, method) { + if (!state.registry[name]) { + return; + } + var index = state.registry[name].map(function(registered) { + return registered.orig; + }).indexOf(method); + if (index === -1) { + return; + } + state.registry[name].splice(index, 1); + } +}); + +// node_modules/before-after-hook/index.js +var require_before_after_hook = __commonJS((exports2, module2) => { + var register = require_register(); + var addHook = require_add(); + var removeHook = require_remove(); + var bind = Function.bind; + var bindable = bind.bind(bind); + function bindApi(hook, state, name) { + var removeHookRef = bindable(removeHook, null).apply(null, name ? [state, name] : [state]); + hook.api = { remove: removeHookRef }; + hook.remove = removeHookRef; + ["before", "error", "after", "wrap"].forEach(function(kind) { + var args = name ? [state, kind, name] : [state, kind]; + hook[kind] = hook.api[kind] = bindable(addHook, null).apply(null, args); + }); + } + function HookSingular() { + var singularHookName = "h"; + var singularHookState = { + registry: {} + }; + var singularHook = register.bind(null, singularHookState, singularHookName); + bindApi(singularHook, singularHookState, singularHookName); + return singularHook; + } + function HookCollection() { + var state = { + registry: {} + }; + var hook = register.bind(null, state); + bindApi(hook, state); + return hook; + } + var collectionHookDeprecationMessageDisplayed = false; + function Hook() { + if (!collectionHookDeprecationMessageDisplayed) { + console.warn('[before-after-hook]: "Hook()" repurposing warning, use "Hook.Collection()". Read more: https://git.io/upgrade-before-after-hook-to-1.4'); + collectionHookDeprecationMessageDisplayed = true; + } + return HookCollection(); + } + Hook.Singular = HookSingular.bind(); + Hook.Collection = HookCollection.bind(); + module2.exports = Hook; + module2.exports.Hook = Hook; + module2.exports.Singular = Hook.Singular; + module2.exports.Collection = Hook.Collection; +}); + +// node_modules/@actions/github/node_modules/@octokit/core/node_modules/@octokit/request/node_modules/@octokit/endpoint/dist-node/index.js +var require_dist_node2 = __commonJS((exports2, module2) => { + var __defProp2 = Object.defineProperty; + var __getOwnPropDesc = Object.getOwnPropertyDescriptor; + var __getOwnPropNames2 = Object.getOwnPropertyNames; + var __hasOwnProp2 = Object.prototype.hasOwnProperty; + var __export = (target, all) => { + for (var name in all) + __defProp2(target, name, { get: all[name], enumerable: true }); + }; + var __copyProps = (to, from, except, desc) => { + if (from && typeof from === "object" || typeof from === "function") { + for (let key of __getOwnPropNames2(from)) + if (!__hasOwnProp2.call(to, key) && key !== except) + __defProp2(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable }); + } + return to; + }; + var __toCommonJS = (mod) => __copyProps(__defProp2({}, "__esModule", { value: true }), mod); + var dist_src_exports = {}; + __export(dist_src_exports, { + endpoint: () => endpoint + }); + module2.exports = __toCommonJS(dist_src_exports); + var import_universal_user_agent = require_dist_node(); + var VERSION = "9.0.5"; + var userAgent = `octokit-endpoint.js/${VERSION} ${(0, import_universal_user_agent.getUserAgent)()}`; + var DEFAULTS = { + method: "GET", + baseUrl: "https://api.github.com", + headers: { + accept: "application/vnd.github.v3+json", + "user-agent": userAgent + }, + mediaType: { + format: "" + } + }; + function lowercaseKeys(object) { + if (!object) { + return {}; + } + return Object.keys(object).reduce((newObj, key) => { + newObj[key.toLowerCase()] = object[key]; + return newObj; + }, {}); + } + function isPlainObject(value) { + if (typeof value !== "object" || value === null) + return false; + if (Object.prototype.toString.call(value) !== "[object Object]") + return false; + const proto = Object.getPrototypeOf(value); + if (proto === null) + return true; + const Ctor = Object.prototype.hasOwnProperty.call(proto, "constructor") && proto.constructor; + return typeof Ctor === "function" && Ctor instanceof Ctor && Function.prototype.call(Ctor) === Function.prototype.call(value); + } + function mergeDeep(defaults, options) { + const result = Object.assign({}, defaults); + Object.keys(options).forEach((key) => { + if (isPlainObject(options[key])) { + if (!(key in defaults)) + Object.assign(result, { [key]: options[key] }); + else + result[key] = mergeDeep(defaults[key], options[key]); + } else { + Object.assign(result, { [key]: options[key] }); + } + }); + return result; + } + function removeUndefinedProperties(obj) { + for (const key in obj) { + if (obj[key] === undefined) { + delete obj[key]; + } + } + return obj; + } + function merge(defaults, route, options) { + if (typeof route === "string") { + let [method, url] = route.split(" "); + options = Object.assign(url ? { method, url } : { url: method }, options); + } else { + options = Object.assign({}, route); + } + options.headers = lowercaseKeys(options.headers); + removeUndefinedProperties(options); + removeUndefinedProperties(options.headers); + const mergedOptions = mergeDeep(defaults || {}, options); + if (options.url === "/graphql") { + if (defaults && defaults.mediaType.previews?.length) { + mergedOptions.mediaType.previews = defaults.mediaType.previews.filter((preview) => !mergedOptions.mediaType.previews.includes(preview)).concat(mergedOptions.mediaType.previews); + } + mergedOptions.mediaType.previews = (mergedOptions.mediaType.previews || []).map((preview) => preview.replace(/-preview/, "")); + } + return mergedOptions; + } + function addQueryParameters(url, parameters) { + const separator = /\?/.test(url) ? "&" : "?"; + const names = Object.keys(parameters); + if (names.length === 0) { + return url; + } + return url + separator + names.map((name) => { + if (name === "q") { + return "q=" + parameters.q.split("+").map(encodeURIComponent).join("+"); + } + return `${name}=${encodeURIComponent(parameters[name])}`; + }).join("&"); + } + var urlVariableRegex = /\{[^}]+\}/g; + function removeNonChars(variableName) { + return variableName.replace(/^\W+|\W+$/g, "").split(/,/); + } + function extractUrlVariableNames(url) { + const matches = url.match(urlVariableRegex); + if (!matches) { + return []; + } + return matches.map(removeNonChars).reduce((a, b) => a.concat(b), []); + } + function omit(object, keysToOmit) { + const result = { __proto__: null }; + for (const key of Object.keys(object)) { + if (keysToOmit.indexOf(key) === -1) { + result[key] = object[key]; + } + } + return result; + } + function encodeReserved(str) { + return str.split(/(%[0-9A-Fa-f]{2})/g).map(function(part) { + if (!/%[0-9A-Fa-f]/.test(part)) { + part = encodeURI(part).replace(/%5B/g, "[").replace(/%5D/g, "]"); + } + return part; + }).join(""); + } + function encodeUnreserved(str) { + return encodeURIComponent(str).replace(/[!'()*]/g, function(c) { + return "%" + c.charCodeAt(0).toString(16).toUpperCase(); + }); + } + function encodeValue(operator, value, key) { + value = operator === "+" || operator === "#" ? encodeReserved(value) : encodeUnreserved(value); + if (key) { + return encodeUnreserved(key) + "=" + value; + } else { + return value; + } + } + function isDefined(value) { + return value !== undefined && value !== null; + } + function isKeyOperator(operator) { + return operator === ";" || operator === "&" || operator === "?"; + } + function getValues(context, operator, key, modifier) { + var value = context[key], result = []; + if (isDefined(value) && value !== "") { + if (typeof value === "string" || typeof value === "number" || typeof value === "boolean") { + value = value.toString(); + if (modifier && modifier !== "*") { + value = value.substring(0, parseInt(modifier, 10)); + } + result.push(encodeValue(operator, value, isKeyOperator(operator) ? key : "")); + } else { + if (modifier === "*") { + if (Array.isArray(value)) { + value.filter(isDefined).forEach(function(value2) { + result.push(encodeValue(operator, value2, isKeyOperator(operator) ? key : "")); + }); + } else { + Object.keys(value).forEach(function(k) { + if (isDefined(value[k])) { + result.push(encodeValue(operator, value[k], k)); + } + }); + } + } else { + const tmp = []; + if (Array.isArray(value)) { + value.filter(isDefined).forEach(function(value2) { + tmp.push(encodeValue(operator, value2)); + }); + } else { + Object.keys(value).forEach(function(k) { + if (isDefined(value[k])) { + tmp.push(encodeUnreserved(k)); + tmp.push(encodeValue(operator, value[k].toString())); + } + }); + } + if (isKeyOperator(operator)) { + result.push(encodeUnreserved(key) + "=" + tmp.join(",")); + } else if (tmp.length !== 0) { + result.push(tmp.join(",")); + } + } + } + } else { + if (operator === ";") { + if (isDefined(value)) { + result.push(encodeUnreserved(key)); + } + } else if (value === "" && (operator === "&" || operator === "?")) { + result.push(encodeUnreserved(key) + "="); + } else if (value === "") { + result.push(""); + } + } + return result; + } + function parseUrl(template) { + return { + expand: expand.bind(null, template) + }; + } + function expand(template, context) { + var operators = ["+", "#", ".", "/", ";", "?", "&"]; + template = template.replace(/\{([^\{\}]+)\}|([^\{\}]+)/g, function(_2, expression, literal) { + if (expression) { + let operator = ""; + const values = []; + if (operators.indexOf(expression.charAt(0)) !== -1) { + operator = expression.charAt(0); + expression = expression.substr(1); + } + expression.split(/,/g).forEach(function(variable) { + var tmp = /([^:\*]*)(?::(\d+)|(\*))?/.exec(variable); + values.push(getValues(context, operator, tmp[1], tmp[2] || tmp[3])); + }); + if (operator && operator !== "+") { + var separator = ","; + if (operator === "?") { + separator = "&"; + } else if (operator !== "#") { + separator = operator; + } + return (values.length !== 0 ? operator : "") + values.join(separator); + } else { + return values.join(","); + } + } else { + return encodeReserved(literal); + } + }); + if (template === "/") { + return template; + } else { + return template.replace(/\/$/, ""); + } + } + function parse(options) { + let method = options.method.toUpperCase(); + let url = (options.url || "/").replace(/:([a-z]\w+)/g, "{$1}"); + let headers = Object.assign({}, options.headers); + let body; + let parameters = omit(options, [ + "method", + "baseUrl", + "url", + "headers", + "request", + "mediaType" + ]); + const urlVariableNames = extractUrlVariableNames(url); + url = parseUrl(url).expand(parameters); + if (!/^http/.test(url)) { + url = options.baseUrl + url; + } + const omittedParameters = Object.keys(options).filter((option) => urlVariableNames.includes(option)).concat("baseUrl"); + const remainingParameters = omit(parameters, omittedParameters); + const isBinaryRequest = /application\/octet-stream/i.test(headers.accept); + if (!isBinaryRequest) { + if (options.mediaType.format) { + headers.accept = headers.accept.split(/,/).map((format) => format.replace(/application\/vnd(\.\w+)(\.v3)?(\.\w+)?(\+json)?$/, `application/vnd\$1\$2.${options.mediaType.format}`)).join(","); + } + if (url.endsWith("/graphql")) { + if (options.mediaType.previews?.length) { + const previewsFromAcceptHeader = headers.accept.match(/[\w-]+(?=-preview)/g) || []; + headers.accept = previewsFromAcceptHeader.concat(options.mediaType.previews).map((preview) => { + const format = options.mediaType.format ? `.${options.mediaType.format}` : "+json"; + return `application/vnd.github.${preview}-preview${format}`; + }).join(","); + } + } + } + if (["GET", "HEAD"].includes(method)) { + url = addQueryParameters(url, remainingParameters); + } else { + if ("data" in remainingParameters) { + body = remainingParameters.data; + } else { + if (Object.keys(remainingParameters).length) { + body = remainingParameters; + } + } + } + if (!headers["content-type"] && typeof body !== "undefined") { + headers["content-type"] = "application/json; charset=utf-8"; + } + if (["PATCH", "PUT"].includes(method) && typeof body === "undefined") { + body = ""; + } + return Object.assign({ method, url, headers }, typeof body !== "undefined" ? { body } : null, options.request ? { request: options.request } : null); + } + function endpointWithDefaults(defaults, route, options) { + return parse(merge(defaults, route, options)); + } + function withDefaults(oldDefaults, newDefaults) { + const DEFAULTS2 = merge(oldDefaults, newDefaults); + const endpoint2 = endpointWithDefaults.bind(null, DEFAULTS2); + return Object.assign(endpoint2, { + DEFAULTS: DEFAULTS2, + defaults: withDefaults.bind(null, DEFAULTS2), + merge: merge.bind(null, DEFAULTS2), + parse + }); + } + var endpoint = withDefaults(null, DEFAULTS); +}); + +// node_modules/deprecation/dist-node/index.js +var require_dist_node3 = __commonJS((exports2) => { + Object.defineProperty(exports2, "__esModule", { value: true }); + + class Deprecation extends Error { + constructor(message) { + super(message); + if (Error.captureStackTrace) { + Error.captureStackTrace(this, this.constructor); + } + this.name = "Deprecation"; + } + } + exports2.Deprecation = Deprecation; +}); + +// node_modules/wrappy/wrappy.js +var require_wrappy = __commonJS((exports2, module2) => { + module2.exports = wrappy; + function wrappy(fn, cb) { + if (fn && cb) + return wrappy(fn)(cb); + if (typeof fn !== "function") + throw new TypeError("need wrapper function"); + Object.keys(fn).forEach(function(k) { + wrapper[k] = fn[k]; + }); + return wrapper; + function wrapper() { + var args = new Array(arguments.length); + for (var i = 0;i < args.length; i++) { + args[i] = arguments[i]; + } + var ret = fn.apply(this, args); + var cb2 = args[args.length - 1]; + if (typeof ret === "function" && ret !== cb2) { + Object.keys(cb2).forEach(function(k) { + ret[k] = cb2[k]; + }); + } + return ret; + } + } +}); + +// node_modules/once/once.js +var require_once = __commonJS((exports2, module2) => { + var wrappy = require_wrappy(); + module2.exports = wrappy(once); + module2.exports.strict = wrappy(onceStrict); + once.proto = once(function() { + Object.defineProperty(Function.prototype, "once", { + value: function() { + return once(this); + }, + configurable: true + }); + Object.defineProperty(Function.prototype, "onceStrict", { + value: function() { + return onceStrict(this); + }, + configurable: true + }); + }); + function once(fn) { + var f = function() { + if (f.called) + return f.value; + f.called = true; + return f.value = fn.apply(this, arguments); + }; + f.called = false; + return f; + } + function onceStrict(fn) { + var f = function() { + if (f.called) + throw new Error(f.onceError); + f.called = true; + return f.value = fn.apply(this, arguments); + }; + var name = fn.name || "Function wrapped with `once`"; + f.onceError = name + " shouldn't be called more than once"; + f.called = false; + return f; + } +}); + +// node_modules/@octokit/request-error/dist-node/index.js +var require_dist_node4 = __commonJS((exports2, module2) => { + var __create2 = Object.create; + var __defProp2 = Object.defineProperty; + var __getOwnPropDesc = Object.getOwnPropertyDescriptor; + var __getOwnPropNames2 = Object.getOwnPropertyNames; + var __getProtoOf2 = Object.getPrototypeOf; + var __hasOwnProp2 = Object.prototype.hasOwnProperty; + var __export = (target, all) => { + for (var name in all) + __defProp2(target, name, { get: all[name], enumerable: true }); + }; + var __copyProps = (to, from, except, desc) => { + if (from && typeof from === "object" || typeof from === "function") { + for (let key of __getOwnPropNames2(from)) + if (!__hasOwnProp2.call(to, key) && key !== except) + __defProp2(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable }); + } + return to; + }; + var __toESM2 = (mod, isNodeMode, target) => (target = mod != null ? __create2(__getProtoOf2(mod)) : {}, __copyProps(isNodeMode || !mod || !mod.__esModule ? __defProp2(target, "default", { value: mod, enumerable: true }) : target, mod)); + var __toCommonJS = (mod) => __copyProps(__defProp2({}, "__esModule", { value: true }), mod); + var dist_src_exports = {}; + __export(dist_src_exports, { + RequestError: () => RequestError + }); + module2.exports = __toCommonJS(dist_src_exports); + var import_deprecation = require_dist_node3(); + var import_once = __toESM2(require_once()); + var logOnceCode = (0, import_once.default)((deprecation) => console.warn(deprecation)); + var logOnceHeaders = (0, import_once.default)((deprecation) => console.warn(deprecation)); + var RequestError = class extends Error { + constructor(message, statusCode, options) { + super(message); + if (Error.captureStackTrace) { + Error.captureStackTrace(this, this.constructor); + } + this.name = "HttpError"; + this.status = statusCode; + let headers; + if ("headers" in options && typeof options.headers !== "undefined") { + headers = options.headers; + } + if ("response" in options) { + this.response = options.response; + headers = options.response.headers; + } + const requestCopy = Object.assign({}, options.request); + if (options.request.headers.authorization) { + requestCopy.headers = Object.assign({}, options.request.headers, { + authorization: options.request.headers.authorization.replace(/ .*$/, " [REDACTED]") + }); + } + requestCopy.url = requestCopy.url.replace(/\bclient_secret=\w+/g, "client_secret=[REDACTED]").replace(/\baccess_token=\w+/g, "access_token=[REDACTED]"); + this.request = requestCopy; + Object.defineProperty(this, "code", { + get() { + logOnceCode(new import_deprecation.Deprecation("[@octokit/request-error] `error.code` is deprecated, use `error.status`.")); + return statusCode; + } + }); + Object.defineProperty(this, "headers", { + get() { + logOnceHeaders(new import_deprecation.Deprecation("[@octokit/request-error] `error.headers` is deprecated, use `error.response.headers`.")); + return headers || {}; + } + }); + } + }; +}); + +// node_modules/@actions/github/node_modules/@octokit/core/node_modules/@octokit/request/dist-node/index.js +var require_dist_node5 = __commonJS((exports2, module2) => { + var __defProp2 = Object.defineProperty; + var __getOwnPropDesc = Object.getOwnPropertyDescriptor; + var __getOwnPropNames2 = Object.getOwnPropertyNames; + var __hasOwnProp2 = Object.prototype.hasOwnProperty; + var __export = (target, all) => { + for (var name in all) + __defProp2(target, name, { get: all[name], enumerable: true }); + }; + var __copyProps = (to, from, except, desc) => { + if (from && typeof from === "object" || typeof from === "function") { + for (let key of __getOwnPropNames2(from)) + if (!__hasOwnProp2.call(to, key) && key !== except) + __defProp2(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable }); + } + return to; + }; + var __toCommonJS = (mod) => __copyProps(__defProp2({}, "__esModule", { value: true }), mod); + var dist_src_exports = {}; + __export(dist_src_exports, { + request: () => request + }); + module2.exports = __toCommonJS(dist_src_exports); + var import_endpoint = require_dist_node2(); + var import_universal_user_agent = require_dist_node(); + var VERSION = "8.4.0"; + function isPlainObject(value) { + if (typeof value !== "object" || value === null) + return false; + if (Object.prototype.toString.call(value) !== "[object Object]") + return false; + const proto = Object.getPrototypeOf(value); + if (proto === null) + return true; + const Ctor = Object.prototype.hasOwnProperty.call(proto, "constructor") && proto.constructor; + return typeof Ctor === "function" && Ctor instanceof Ctor && Function.prototype.call(Ctor) === Function.prototype.call(value); + } + var import_request_error = require_dist_node4(); + function getBufferResponse(response) { + return response.arrayBuffer(); + } + function fetchWrapper(requestOptions) { + var _a, _b, _c, _d; + const log = requestOptions.request && requestOptions.request.log ? requestOptions.request.log : console; + const parseSuccessResponseBody = ((_a = requestOptions.request) == null ? undefined : _a.parseSuccessResponseBody) !== false; + if (isPlainObject(requestOptions.body) || Array.isArray(requestOptions.body)) { + requestOptions.body = JSON.stringify(requestOptions.body); + } + let headers = {}; + let status; + let url; + let { fetch: fetch2 } = globalThis; + if ((_b = requestOptions.request) == null ? undefined : _b.fetch) { + fetch2 = requestOptions.request.fetch; + } + if (!fetch2) { + throw new Error("fetch is not set. Please pass a fetch implementation as new Octokit({ request: { fetch }}). Learn more at https://github.com/octokit/octokit.js/#fetch-missing"); + } + return fetch2(requestOptions.url, { + method: requestOptions.method, + body: requestOptions.body, + redirect: (_c = requestOptions.request) == null ? undefined : _c.redirect, + headers: requestOptions.headers, + signal: (_d = requestOptions.request) == null ? undefined : _d.signal, + ...requestOptions.body && { duplex: "half" } + }).then(async (response) => { + url = response.url; + status = response.status; + for (const keyAndValue of response.headers) { + headers[keyAndValue[0]] = keyAndValue[1]; + } + if ("deprecation" in headers) { + const matches = headers.link && headers.link.match(/<([^>]+)>; rel="deprecation"/); + const deprecationLink = matches && matches.pop(); + log.warn(`[@octokit/request] "${requestOptions.method} ${requestOptions.url}" is deprecated. It is scheduled to be removed on ${headers.sunset}${deprecationLink ? `. See ${deprecationLink}` : ""}`); + } + if (status === 204 || status === 205) { + return; + } + if (requestOptions.method === "HEAD") { + if (status < 400) { + return; + } + throw new import_request_error.RequestError(response.statusText, status, { + response: { + url, + status, + headers, + data: undefined + }, + request: requestOptions + }); + } + if (status === 304) { + throw new import_request_error.RequestError("Not modified", status, { + response: { + url, + status, + headers, + data: await getResponseData(response) + }, + request: requestOptions + }); + } + if (status >= 400) { + const data = await getResponseData(response); + const error = new import_request_error.RequestError(toErrorMessage(data), status, { + response: { + url, + status, + headers, + data + }, + request: requestOptions + }); + throw error; + } + return parseSuccessResponseBody ? await getResponseData(response) : response.body; + }).then((data) => { + return { + status, + url, + headers, + data + }; + }).catch((error) => { + if (error instanceof import_request_error.RequestError) + throw error; + else if (error.name === "AbortError") + throw error; + let message = error.message; + if (error.name === "TypeError" && "cause" in error) { + if (error.cause instanceof Error) { + message = error.cause.message; + } else if (typeof error.cause === "string") { + message = error.cause; + } + } + throw new import_request_error.RequestError(message, 500, { + request: requestOptions + }); + }); + } + async function getResponseData(response) { + const contentType = response.headers.get("content-type"); + if (/application\/json/.test(contentType)) { + return response.json().catch(() => response.text()).catch(() => ""); + } + if (!contentType || /^text\/|charset=utf-8$/.test(contentType)) { + return response.text(); + } + return getBufferResponse(response); + } + function toErrorMessage(data) { + if (typeof data === "string") + return data; + let suffix; + if ("documentation_url" in data) { + suffix = ` - ${data.documentation_url}`; + } else { + suffix = ""; + } + if ("message" in data) { + if (Array.isArray(data.errors)) { + return `${data.message}: ${data.errors.map(JSON.stringify).join(", ")}${suffix}`; + } + return `${data.message}${suffix}`; + } + return `Unknown error: ${JSON.stringify(data)}`; + } + function withDefaults(oldEndpoint, newDefaults) { + const endpoint2 = oldEndpoint.defaults(newDefaults); + const newApi = function(route, parameters) { + const endpointOptions = endpoint2.merge(route, parameters); + if (!endpointOptions.request || !endpointOptions.request.hook) { + return fetchWrapper(endpoint2.parse(endpointOptions)); + } + const request2 = (route2, parameters2) => { + return fetchWrapper(endpoint2.parse(endpoint2.merge(route2, parameters2))); + }; + Object.assign(request2, { + endpoint: endpoint2, + defaults: withDefaults.bind(null, endpoint2) + }); + return endpointOptions.request.hook(request2, endpointOptions); + }; + return Object.assign(newApi, { + endpoint: endpoint2, + defaults: withDefaults.bind(null, endpoint2) + }); + } + var request = withDefaults(import_endpoint.endpoint, { + headers: { + "user-agent": `octokit-request.js/${VERSION} ${(0, import_universal_user_agent.getUserAgent)()}` + } + }); +}); + +// node_modules/@actions/github/node_modules/@octokit/core/node_modules/@octokit/graphql/dist-node/index.js +var require_dist_node6 = __commonJS((exports2, module2) => { + var __defProp2 = Object.defineProperty; + var __getOwnPropDesc = Object.getOwnPropertyDescriptor; + var __getOwnPropNames2 = Object.getOwnPropertyNames; + var __hasOwnProp2 = Object.prototype.hasOwnProperty; + var __export = (target, all) => { + for (var name in all) + __defProp2(target, name, { get: all[name], enumerable: true }); + }; + var __copyProps = (to, from, except, desc) => { + if (from && typeof from === "object" || typeof from === "function") { + for (let key of __getOwnPropNames2(from)) + if (!__hasOwnProp2.call(to, key) && key !== except) + __defProp2(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable }); + } + return to; + }; + var __toCommonJS = (mod) => __copyProps(__defProp2({}, "__esModule", { value: true }), mod); + var dist_src_exports = {}; + __export(dist_src_exports, { + GraphqlResponseError: () => GraphqlResponseError, + graphql: () => graphql2, + withCustomRequest: () => withCustomRequest + }); + module2.exports = __toCommonJS(dist_src_exports); + var import_request3 = require_dist_node5(); + var import_universal_user_agent = require_dist_node(); + var VERSION = "7.1.0"; + var import_request2 = require_dist_node5(); + var import_request = require_dist_node5(); + function _buildMessageForResponseErrors(data) { + return `Request failed due to following response errors: +` + data.errors.map((e) => ` - ${e.message}`).join("\n"); + } + var GraphqlResponseError = class extends Error { + constructor(request2, headers, response) { + super(_buildMessageForResponseErrors(response)); + this.request = request2; + this.headers = headers; + this.response = response; + this.name = "GraphqlResponseError"; + this.errors = response.errors; + this.data = response.data; + if (Error.captureStackTrace) { + Error.captureStackTrace(this, this.constructor); + } + } + }; + var NON_VARIABLE_OPTIONS = [ + "method", + "baseUrl", + "url", + "headers", + "request", + "query", + "mediaType" + ]; + var FORBIDDEN_VARIABLE_OPTIONS = ["query", "method", "url"]; + var GHES_V3_SUFFIX_REGEX = /\/api\/v3\/?$/; + function graphql(request2, query, options) { + if (options) { + if (typeof query === "string" && "query" in options) { + return Promise.reject(new Error(`[@octokit/graphql] "query" cannot be used as variable name`)); + } + for (const key in options) { + if (!FORBIDDEN_VARIABLE_OPTIONS.includes(key)) + continue; + return Promise.reject(new Error(`[@octokit/graphql] "${key}" cannot be used as variable name`)); + } + } + const parsedOptions = typeof query === "string" ? Object.assign({ query }, options) : query; + const requestOptions = Object.keys(parsedOptions).reduce((result, key) => { + if (NON_VARIABLE_OPTIONS.includes(key)) { + result[key] = parsedOptions[key]; + return result; + } + if (!result.variables) { + result.variables = {}; + } + result.variables[key] = parsedOptions[key]; + return result; + }, {}); + const baseUrl = parsedOptions.baseUrl || request2.endpoint.DEFAULTS.baseUrl; + if (GHES_V3_SUFFIX_REGEX.test(baseUrl)) { + requestOptions.url = baseUrl.replace(GHES_V3_SUFFIX_REGEX, "/api/graphql"); + } + return request2(requestOptions).then((response) => { + if (response.data.errors) { + const headers = {}; + for (const key of Object.keys(response.headers)) { + headers[key] = response.headers[key]; + } + throw new GraphqlResponseError(requestOptions, headers, response.data); + } + return response.data.data; + }); + } + function withDefaults(request2, newDefaults) { + const newRequest = request2.defaults(newDefaults); + const newApi = (query, options) => { + return graphql(newRequest, query, options); + }; + return Object.assign(newApi, { + defaults: withDefaults.bind(null, newRequest), + endpoint: newRequest.endpoint + }); + } + var graphql2 = withDefaults(import_request3.request, { + headers: { + "user-agent": `octokit-graphql.js/${VERSION} ${(0, import_universal_user_agent.getUserAgent)()}` + }, + method: "POST", + url: "/graphql" + }); + function withCustomRequest(customRequest) { + return withDefaults(customRequest, { + method: "POST", + url: "/graphql" + }); + } +}); + +// node_modules/@actions/github/node_modules/@octokit/core/node_modules/@octokit/auth-token/dist-node/index.js +var require_dist_node7 = __commonJS((exports2, module2) => { + var __defProp2 = Object.defineProperty; + var __getOwnPropDesc = Object.getOwnPropertyDescriptor; + var __getOwnPropNames2 = Object.getOwnPropertyNames; + var __hasOwnProp2 = Object.prototype.hasOwnProperty; + var __export = (target, all) => { + for (var name in all) + __defProp2(target, name, { get: all[name], enumerable: true }); + }; + var __copyProps = (to, from, except, desc) => { + if (from && typeof from === "object" || typeof from === "function") { + for (let key of __getOwnPropNames2(from)) + if (!__hasOwnProp2.call(to, key) && key !== except) + __defProp2(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable }); + } + return to; + }; + var __toCommonJS = (mod) => __copyProps(__defProp2({}, "__esModule", { value: true }), mod); + var dist_src_exports = {}; + __export(dist_src_exports, { + createTokenAuth: () => createTokenAuth + }); + module2.exports = __toCommonJS(dist_src_exports); + var REGEX_IS_INSTALLATION_LEGACY = /^v1\./; + var REGEX_IS_INSTALLATION = /^ghs_/; + var REGEX_IS_USER_TO_SERVER = /^ghu_/; + async function auth(token) { + const isApp = token.split(/\./).length === 3; + const isInstallation = REGEX_IS_INSTALLATION_LEGACY.test(token) || REGEX_IS_INSTALLATION.test(token); + const isUserToServer = REGEX_IS_USER_TO_SERVER.test(token); + const tokenType = isApp ? "app" : isInstallation ? "installation" : isUserToServer ? "user-to-server" : "oauth"; + return { + type: "token", + token, + tokenType + }; + } + function withAuthorizationPrefix(token) { + if (token.split(/\./).length === 3) { + return `bearer ${token}`; + } + return `token ${token}`; + } + async function hook(token, request, route, parameters) { + const endpoint = request.endpoint.merge(route, parameters); + endpoint.headers.authorization = withAuthorizationPrefix(token); + return request(endpoint); + } + var createTokenAuth = function createTokenAuth2(token) { + if (!token) { + throw new Error("[@octokit/auth-token] No token passed to createTokenAuth"); + } + if (typeof token !== "string") { + throw new Error("[@octokit/auth-token] Token passed to createTokenAuth is not a string"); + } + token = token.replace(/^(token|bearer) +/i, ""); + return Object.assign(auth.bind(null, token), { + hook: hook.bind(null, token) + }); + }; +}); + +// node_modules/@actions/github/node_modules/@octokit/core/dist-node/index.js +var require_dist_node8 = __commonJS((exports2, module2) => { + var __defProp2 = Object.defineProperty; + var __getOwnPropDesc = Object.getOwnPropertyDescriptor; + var __getOwnPropNames2 = Object.getOwnPropertyNames; + var __hasOwnProp2 = Object.prototype.hasOwnProperty; + var __export = (target, all) => { + for (var name in all) + __defProp2(target, name, { get: all[name], enumerable: true }); + }; + var __copyProps = (to, from, except, desc) => { + if (from && typeof from === "object" || typeof from === "function") { + for (let key of __getOwnPropNames2(from)) + if (!__hasOwnProp2.call(to, key) && key !== except) + __defProp2(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable }); + } + return to; + }; + var __toCommonJS = (mod) => __copyProps(__defProp2({}, "__esModule", { value: true }), mod); + var dist_src_exports = {}; + __export(dist_src_exports, { + Octokit: () => Octokit + }); + module2.exports = __toCommonJS(dist_src_exports); + var import_universal_user_agent = require_dist_node(); + var import_before_after_hook = require_before_after_hook(); + var import_request = require_dist_node5(); + var import_graphql = require_dist_node6(); + var import_auth_token = require_dist_node7(); + var VERSION = "5.2.0"; + var noop = () => { + }; + var consoleWarn = console.warn.bind(console); + var consoleError = console.error.bind(console); + var userAgentTrail = `octokit-core.js/${VERSION} ${(0, import_universal_user_agent.getUserAgent)()}`; + var Octokit = class { + static { + this.VERSION = VERSION; + } + static defaults(defaults) { + const OctokitWithDefaults = class extends this { + constructor(...args) { + const options = args[0] || {}; + if (typeof defaults === "function") { + super(defaults(options)); + return; + } + super(Object.assign({}, defaults, options, options.userAgent && defaults.userAgent ? { + userAgent: `${options.userAgent} ${defaults.userAgent}` + } : null)); + } + }; + return OctokitWithDefaults; + } + static { + this.plugins = []; + } + static plugin(...newPlugins) { + const currentPlugins = this.plugins; + const NewOctokit = class extends this { + static { + this.plugins = currentPlugins.concat(newPlugins.filter((plugin) => !currentPlugins.includes(plugin))); + } + }; + return NewOctokit; + } + constructor(options = {}) { + const hook = new import_before_after_hook.Collection; + const requestDefaults = { + baseUrl: import_request.request.endpoint.DEFAULTS.baseUrl, + headers: {}, + request: Object.assign({}, options.request, { + hook: hook.bind(null, "request") + }), + mediaType: { + previews: [], + format: "" + } + }; + requestDefaults.headers["user-agent"] = options.userAgent ? `${options.userAgent} ${userAgentTrail}` : userAgentTrail; + if (options.baseUrl) { + requestDefaults.baseUrl = options.baseUrl; + } + if (options.previews) { + requestDefaults.mediaType.previews = options.previews; + } + if (options.timeZone) { + requestDefaults.headers["time-zone"] = options.timeZone; + } + this.request = import_request.request.defaults(requestDefaults); + this.graphql = (0, import_graphql.withCustomRequest)(this.request).defaults(requestDefaults); + this.log = Object.assign({ + debug: noop, + info: noop, + warn: consoleWarn, + error: consoleError + }, options.log); + this.hook = hook; + if (!options.authStrategy) { + if (!options.auth) { + this.auth = async () => ({ + type: "unauthenticated" + }); + } else { + const auth = (0, import_auth_token.createTokenAuth)(options.auth); + hook.wrap("request", auth.hook); + this.auth = auth; + } + } else { + const { authStrategy, ...otherOptions } = options; + const auth = authStrategy(Object.assign({ + request: this.request, + log: this.log, + octokit: this, + octokitOptions: otherOptions + }, options.auth)); + hook.wrap("request", auth.hook); + this.auth = auth; + } + const classConstructor = this.constructor; + for (let i = 0;i < classConstructor.plugins.length; ++i) { + Object.assign(this, classConstructor.plugins[i](this, options)); + } + } + }; +}); + +// node_modules/@octokit/plugin-rest-endpoint-methods/dist-node/index.js +var require_dist_node9 = __commonJS((exports2, module2) => { + var __defProp2 = Object.defineProperty; + var __getOwnPropDesc = Object.getOwnPropertyDescriptor; + var __getOwnPropNames2 = Object.getOwnPropertyNames; + var __hasOwnProp2 = Object.prototype.hasOwnProperty; + var __export = (target, all) => { + for (var name in all) + __defProp2(target, name, { get: all[name], enumerable: true }); + }; + var __copyProps = (to, from, except, desc) => { + if (from && typeof from === "object" || typeof from === "function") { + for (let key of __getOwnPropNames2(from)) + if (!__hasOwnProp2.call(to, key) && key !== except) + __defProp2(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable }); + } + return to; + }; + var __toCommonJS = (mod) => __copyProps(__defProp2({}, "__esModule", { value: true }), mod); + var dist_src_exports = {}; + __export(dist_src_exports, { + legacyRestEndpointMethods: () => legacyRestEndpointMethods, + restEndpointMethods: () => restEndpointMethods + }); + module2.exports = __toCommonJS(dist_src_exports); + var VERSION = "10.4.1"; + var Endpoints = { + actions: { + addCustomLabelsToSelfHostedRunnerForOrg: [ + "POST /orgs/{org}/actions/runners/{runner_id}/labels" + ], + addCustomLabelsToSelfHostedRunnerForRepo: [ + "POST /repos/{owner}/{repo}/actions/runners/{runner_id}/labels" + ], + addSelectedRepoToOrgSecret: [ + "PUT /orgs/{org}/actions/secrets/{secret_name}/repositories/{repository_id}" + ], + addSelectedRepoToOrgVariable: [ + "PUT /orgs/{org}/actions/variables/{name}/repositories/{repository_id}" + ], + approveWorkflowRun: [ + "POST /repos/{owner}/{repo}/actions/runs/{run_id}/approve" + ], + cancelWorkflowRun: [ + "POST /repos/{owner}/{repo}/actions/runs/{run_id}/cancel" + ], + createEnvironmentVariable: [ + "POST /repositories/{repository_id}/environments/{environment_name}/variables" + ], + createOrUpdateEnvironmentSecret: [ + "PUT /repositories/{repository_id}/environments/{environment_name}/secrets/{secret_name}" + ], + createOrUpdateOrgSecret: ["PUT /orgs/{org}/actions/secrets/{secret_name}"], + createOrUpdateRepoSecret: [ + "PUT /repos/{owner}/{repo}/actions/secrets/{secret_name}" + ], + createOrgVariable: ["POST /orgs/{org}/actions/variables"], + createRegistrationTokenForOrg: [ + "POST /orgs/{org}/actions/runners/registration-token" + ], + createRegistrationTokenForRepo: [ + "POST /repos/{owner}/{repo}/actions/runners/registration-token" + ], + createRemoveTokenForOrg: ["POST /orgs/{org}/actions/runners/remove-token"], + createRemoveTokenForRepo: [ + "POST /repos/{owner}/{repo}/actions/runners/remove-token" + ], + createRepoVariable: ["POST /repos/{owner}/{repo}/actions/variables"], + createWorkflowDispatch: [ + "POST /repos/{owner}/{repo}/actions/workflows/{workflow_id}/dispatches" + ], + deleteActionsCacheById: [ + "DELETE /repos/{owner}/{repo}/actions/caches/{cache_id}" + ], + deleteActionsCacheByKey: [ + "DELETE /repos/{owner}/{repo}/actions/caches{?key,ref}" + ], + deleteArtifact: [ + "DELETE /repos/{owner}/{repo}/actions/artifacts/{artifact_id}" + ], + deleteEnvironmentSecret: [ + "DELETE /repositories/{repository_id}/environments/{environment_name}/secrets/{secret_name}" + ], + deleteEnvironmentVariable: [ + "DELETE /repositories/{repository_id}/environments/{environment_name}/variables/{name}" + ], + deleteOrgSecret: ["DELETE /orgs/{org}/actions/secrets/{secret_name}"], + deleteOrgVariable: ["DELETE /orgs/{org}/actions/variables/{name}"], + deleteRepoSecret: [ + "DELETE /repos/{owner}/{repo}/actions/secrets/{secret_name}" + ], + deleteRepoVariable: [ + "DELETE /repos/{owner}/{repo}/actions/variables/{name}" + ], + deleteSelfHostedRunnerFromOrg: [ + "DELETE /orgs/{org}/actions/runners/{runner_id}" + ], + deleteSelfHostedRunnerFromRepo: [ + "DELETE /repos/{owner}/{repo}/actions/runners/{runner_id}" + ], + deleteWorkflowRun: ["DELETE /repos/{owner}/{repo}/actions/runs/{run_id}"], + deleteWorkflowRunLogs: [ + "DELETE /repos/{owner}/{repo}/actions/runs/{run_id}/logs" + ], + disableSelectedRepositoryGithubActionsOrganization: [ + "DELETE /orgs/{org}/actions/permissions/repositories/{repository_id}" + ], + disableWorkflow: [ + "PUT /repos/{owner}/{repo}/actions/workflows/{workflow_id}/disable" + ], + downloadArtifact: [ + "GET /repos/{owner}/{repo}/actions/artifacts/{artifact_id}/{archive_format}" + ], + downloadJobLogsForWorkflowRun: [ + "GET /repos/{owner}/{repo}/actions/jobs/{job_id}/logs" + ], + downloadWorkflowRunAttemptLogs: [ + "GET /repos/{owner}/{repo}/actions/runs/{run_id}/attempts/{attempt_number}/logs" + ], + downloadWorkflowRunLogs: [ + "GET /repos/{owner}/{repo}/actions/runs/{run_id}/logs" + ], + enableSelectedRepositoryGithubActionsOrganization: [ + "PUT /orgs/{org}/actions/permissions/repositories/{repository_id}" + ], + enableWorkflow: [ + "PUT /repos/{owner}/{repo}/actions/workflows/{workflow_id}/enable" + ], + forceCancelWorkflowRun: [ + "POST /repos/{owner}/{repo}/actions/runs/{run_id}/force-cancel" + ], + generateRunnerJitconfigForOrg: [ + "POST /orgs/{org}/actions/runners/generate-jitconfig" + ], + generateRunnerJitconfigForRepo: [ + "POST /repos/{owner}/{repo}/actions/runners/generate-jitconfig" + ], + getActionsCacheList: ["GET /repos/{owner}/{repo}/actions/caches"], + getActionsCacheUsage: ["GET /repos/{owner}/{repo}/actions/cache/usage"], + getActionsCacheUsageByRepoForOrg: [ + "GET /orgs/{org}/actions/cache/usage-by-repository" + ], + getActionsCacheUsageForOrg: ["GET /orgs/{org}/actions/cache/usage"], + getAllowedActionsOrganization: [ + "GET /orgs/{org}/actions/permissions/selected-actions" + ], + getAllowedActionsRepository: [ + "GET /repos/{owner}/{repo}/actions/permissions/selected-actions" + ], + getArtifact: ["GET /repos/{owner}/{repo}/actions/artifacts/{artifact_id}"], + getCustomOidcSubClaimForRepo: [ + "GET /repos/{owner}/{repo}/actions/oidc/customization/sub" + ], + getEnvironmentPublicKey: [ + "GET /repositories/{repository_id}/environments/{environment_name}/secrets/public-key" + ], + getEnvironmentSecret: [ + "GET /repositories/{repository_id}/environments/{environment_name}/secrets/{secret_name}" + ], + getEnvironmentVariable: [ + "GET /repositories/{repository_id}/environments/{environment_name}/variables/{name}" + ], + getGithubActionsDefaultWorkflowPermissionsOrganization: [ + "GET /orgs/{org}/actions/permissions/workflow" + ], + getGithubActionsDefaultWorkflowPermissionsRepository: [ + "GET /repos/{owner}/{repo}/actions/permissions/workflow" + ], + getGithubActionsPermissionsOrganization: [ + "GET /orgs/{org}/actions/permissions" + ], + getGithubActionsPermissionsRepository: [ + "GET /repos/{owner}/{repo}/actions/permissions" + ], + getJobForWorkflowRun: ["GET /repos/{owner}/{repo}/actions/jobs/{job_id}"], + getOrgPublicKey: ["GET /orgs/{org}/actions/secrets/public-key"], + getOrgSecret: ["GET /orgs/{org}/actions/secrets/{secret_name}"], + getOrgVariable: ["GET /orgs/{org}/actions/variables/{name}"], + getPendingDeploymentsForRun: [ + "GET /repos/{owner}/{repo}/actions/runs/{run_id}/pending_deployments" + ], + getRepoPermissions: [ + "GET /repos/{owner}/{repo}/actions/permissions", + {}, + { renamed: ["actions", "getGithubActionsPermissionsRepository"] } + ], + getRepoPublicKey: ["GET /repos/{owner}/{repo}/actions/secrets/public-key"], + getRepoSecret: ["GET /repos/{owner}/{repo}/actions/secrets/{secret_name}"], + getRepoVariable: ["GET /repos/{owner}/{repo}/actions/variables/{name}"], + getReviewsForRun: [ + "GET /repos/{owner}/{repo}/actions/runs/{run_id}/approvals" + ], + getSelfHostedRunnerForOrg: ["GET /orgs/{org}/actions/runners/{runner_id}"], + getSelfHostedRunnerForRepo: [ + "GET /repos/{owner}/{repo}/actions/runners/{runner_id}" + ], + getWorkflow: ["GET /repos/{owner}/{repo}/actions/workflows/{workflow_id}"], + getWorkflowAccessToRepository: [ + "GET /repos/{owner}/{repo}/actions/permissions/access" + ], + getWorkflowRun: ["GET /repos/{owner}/{repo}/actions/runs/{run_id}"], + getWorkflowRunAttempt: [ + "GET /repos/{owner}/{repo}/actions/runs/{run_id}/attempts/{attempt_number}" + ], + getWorkflowRunUsage: [ + "GET /repos/{owner}/{repo}/actions/runs/{run_id}/timing" + ], + getWorkflowUsage: [ + "GET /repos/{owner}/{repo}/actions/workflows/{workflow_id}/timing" + ], + listArtifactsForRepo: ["GET /repos/{owner}/{repo}/actions/artifacts"], + listEnvironmentSecrets: [ + "GET /repositories/{repository_id}/environments/{environment_name}/secrets" + ], + listEnvironmentVariables: [ + "GET /repositories/{repository_id}/environments/{environment_name}/variables" + ], + listJobsForWorkflowRun: [ + "GET /repos/{owner}/{repo}/actions/runs/{run_id}/jobs" + ], + listJobsForWorkflowRunAttempt: [ + "GET /repos/{owner}/{repo}/actions/runs/{run_id}/attempts/{attempt_number}/jobs" + ], + listLabelsForSelfHostedRunnerForOrg: [ + "GET /orgs/{org}/actions/runners/{runner_id}/labels" + ], + listLabelsForSelfHostedRunnerForRepo: [ + "GET /repos/{owner}/{repo}/actions/runners/{runner_id}/labels" + ], + listOrgSecrets: ["GET /orgs/{org}/actions/secrets"], + listOrgVariables: ["GET /orgs/{org}/actions/variables"], + listRepoOrganizationSecrets: [ + "GET /repos/{owner}/{repo}/actions/organization-secrets" + ], + listRepoOrganizationVariables: [ + "GET /repos/{owner}/{repo}/actions/organization-variables" + ], + listRepoSecrets: ["GET /repos/{owner}/{repo}/actions/secrets"], + listRepoVariables: ["GET /repos/{owner}/{repo}/actions/variables"], + listRepoWorkflows: ["GET /repos/{owner}/{repo}/actions/workflows"], + listRunnerApplicationsForOrg: ["GET /orgs/{org}/actions/runners/downloads"], + listRunnerApplicationsForRepo: [ + "GET /repos/{owner}/{repo}/actions/runners/downloads" + ], + listSelectedReposForOrgSecret: [ + "GET /orgs/{org}/actions/secrets/{secret_name}/repositories" + ], + listSelectedReposForOrgVariable: [ + "GET /orgs/{org}/actions/variables/{name}/repositories" + ], + listSelectedRepositoriesEnabledGithubActionsOrganization: [ + "GET /orgs/{org}/actions/permissions/repositories" + ], + listSelfHostedRunnersForOrg: ["GET /orgs/{org}/actions/runners"], + listSelfHostedRunnersForRepo: ["GET /repos/{owner}/{repo}/actions/runners"], + listWorkflowRunArtifacts: [ + "GET /repos/{owner}/{repo}/actions/runs/{run_id}/artifacts" + ], + listWorkflowRuns: [ + "GET /repos/{owner}/{repo}/actions/workflows/{workflow_id}/runs" + ], + listWorkflowRunsForRepo: ["GET /repos/{owner}/{repo}/actions/runs"], + reRunJobForWorkflowRun: [ + "POST /repos/{owner}/{repo}/actions/jobs/{job_id}/rerun" + ], + reRunWorkflow: ["POST /repos/{owner}/{repo}/actions/runs/{run_id}/rerun"], + reRunWorkflowFailedJobs: [ + "POST /repos/{owner}/{repo}/actions/runs/{run_id}/rerun-failed-jobs" + ], + removeAllCustomLabelsFromSelfHostedRunnerForOrg: [ + "DELETE /orgs/{org}/actions/runners/{runner_id}/labels" + ], + removeAllCustomLabelsFromSelfHostedRunnerForRepo: [ + "DELETE /repos/{owner}/{repo}/actions/runners/{runner_id}/labels" + ], + removeCustomLabelFromSelfHostedRunnerForOrg: [ + "DELETE /orgs/{org}/actions/runners/{runner_id}/labels/{name}" + ], + removeCustomLabelFromSelfHostedRunnerForRepo: [ + "DELETE /repos/{owner}/{repo}/actions/runners/{runner_id}/labels/{name}" + ], + removeSelectedRepoFromOrgSecret: [ + "DELETE /orgs/{org}/actions/secrets/{secret_name}/repositories/{repository_id}" + ], + removeSelectedRepoFromOrgVariable: [ + "DELETE /orgs/{org}/actions/variables/{name}/repositories/{repository_id}" + ], + reviewCustomGatesForRun: [ + "POST /repos/{owner}/{repo}/actions/runs/{run_id}/deployment_protection_rule" + ], + reviewPendingDeploymentsForRun: [ + "POST /repos/{owner}/{repo}/actions/runs/{run_id}/pending_deployments" + ], + setAllowedActionsOrganization: [ + "PUT /orgs/{org}/actions/permissions/selected-actions" + ], + setAllowedActionsRepository: [ + "PUT /repos/{owner}/{repo}/actions/permissions/selected-actions" + ], + setCustomLabelsForSelfHostedRunnerForOrg: [ + "PUT /orgs/{org}/actions/runners/{runner_id}/labels" + ], + setCustomLabelsForSelfHostedRunnerForRepo: [ + "PUT /repos/{owner}/{repo}/actions/runners/{runner_id}/labels" + ], + setCustomOidcSubClaimForRepo: [ + "PUT /repos/{owner}/{repo}/actions/oidc/customization/sub" + ], + setGithubActionsDefaultWorkflowPermissionsOrganization: [ + "PUT /orgs/{org}/actions/permissions/workflow" + ], + setGithubActionsDefaultWorkflowPermissionsRepository: [ + "PUT /repos/{owner}/{repo}/actions/permissions/workflow" + ], + setGithubActionsPermissionsOrganization: [ + "PUT /orgs/{org}/actions/permissions" + ], + setGithubActionsPermissionsRepository: [ + "PUT /repos/{owner}/{repo}/actions/permissions" + ], + setSelectedReposForOrgSecret: [ + "PUT /orgs/{org}/actions/secrets/{secret_name}/repositories" + ], + setSelectedReposForOrgVariable: [ + "PUT /orgs/{org}/actions/variables/{name}/repositories" + ], + setSelectedRepositoriesEnabledGithubActionsOrganization: [ + "PUT /orgs/{org}/actions/permissions/repositories" + ], + setWorkflowAccessToRepository: [ + "PUT /repos/{owner}/{repo}/actions/permissions/access" + ], + updateEnvironmentVariable: [ + "PATCH /repositories/{repository_id}/environments/{environment_name}/variables/{name}" + ], + updateOrgVariable: ["PATCH /orgs/{org}/actions/variables/{name}"], + updateRepoVariable: [ + "PATCH /repos/{owner}/{repo}/actions/variables/{name}" + ] + }, + activity: { + checkRepoIsStarredByAuthenticatedUser: ["GET /user/starred/{owner}/{repo}"], + deleteRepoSubscription: ["DELETE /repos/{owner}/{repo}/subscription"], + deleteThreadSubscription: [ + "DELETE /notifications/threads/{thread_id}/subscription" + ], + getFeeds: ["GET /feeds"], + getRepoSubscription: ["GET /repos/{owner}/{repo}/subscription"], + getThread: ["GET /notifications/threads/{thread_id}"], + getThreadSubscriptionForAuthenticatedUser: [ + "GET /notifications/threads/{thread_id}/subscription" + ], + listEventsForAuthenticatedUser: ["GET /users/{username}/events"], + listNotificationsForAuthenticatedUser: ["GET /notifications"], + listOrgEventsForAuthenticatedUser: [ + "GET /users/{username}/events/orgs/{org}" + ], + listPublicEvents: ["GET /events"], + listPublicEventsForRepoNetwork: ["GET /networks/{owner}/{repo}/events"], + listPublicEventsForUser: ["GET /users/{username}/events/public"], + listPublicOrgEvents: ["GET /orgs/{org}/events"], + listReceivedEventsForUser: ["GET /users/{username}/received_events"], + listReceivedPublicEventsForUser: [ + "GET /users/{username}/received_events/public" + ], + listRepoEvents: ["GET /repos/{owner}/{repo}/events"], + listRepoNotificationsForAuthenticatedUser: [ + "GET /repos/{owner}/{repo}/notifications" + ], + listReposStarredByAuthenticatedUser: ["GET /user/starred"], + listReposStarredByUser: ["GET /users/{username}/starred"], + listReposWatchedByUser: ["GET /users/{username}/subscriptions"], + listStargazersForRepo: ["GET /repos/{owner}/{repo}/stargazers"], + listWatchedReposForAuthenticatedUser: ["GET /user/subscriptions"], + listWatchersForRepo: ["GET /repos/{owner}/{repo}/subscribers"], + markNotificationsAsRead: ["PUT /notifications"], + markRepoNotificationsAsRead: ["PUT /repos/{owner}/{repo}/notifications"], + markThreadAsDone: ["DELETE /notifications/threads/{thread_id}"], + markThreadAsRead: ["PATCH /notifications/threads/{thread_id}"], + setRepoSubscription: ["PUT /repos/{owner}/{repo}/subscription"], + setThreadSubscription: [ + "PUT /notifications/threads/{thread_id}/subscription" + ], + starRepoForAuthenticatedUser: ["PUT /user/starred/{owner}/{repo}"], + unstarRepoForAuthenticatedUser: ["DELETE /user/starred/{owner}/{repo}"] + }, + apps: { + addRepoToInstallation: [ + "PUT /user/installations/{installation_id}/repositories/{repository_id}", + {}, + { renamed: ["apps", "addRepoToInstallationForAuthenticatedUser"] } + ], + addRepoToInstallationForAuthenticatedUser: [ + "PUT /user/installations/{installation_id}/repositories/{repository_id}" + ], + checkToken: ["POST /applications/{client_id}/token"], + createFromManifest: ["POST /app-manifests/{code}/conversions"], + createInstallationAccessToken: [ + "POST /app/installations/{installation_id}/access_tokens" + ], + deleteAuthorization: ["DELETE /applications/{client_id}/grant"], + deleteInstallation: ["DELETE /app/installations/{installation_id}"], + deleteToken: ["DELETE /applications/{client_id}/token"], + getAuthenticated: ["GET /app"], + getBySlug: ["GET /apps/{app_slug}"], + getInstallation: ["GET /app/installations/{installation_id}"], + getOrgInstallation: ["GET /orgs/{org}/installation"], + getRepoInstallation: ["GET /repos/{owner}/{repo}/installation"], + getSubscriptionPlanForAccount: [ + "GET /marketplace_listing/accounts/{account_id}" + ], + getSubscriptionPlanForAccountStubbed: [ + "GET /marketplace_listing/stubbed/accounts/{account_id}" + ], + getUserInstallation: ["GET /users/{username}/installation"], + getWebhookConfigForApp: ["GET /app/hook/config"], + getWebhookDelivery: ["GET /app/hook/deliveries/{delivery_id}"], + listAccountsForPlan: ["GET /marketplace_listing/plans/{plan_id}/accounts"], + listAccountsForPlanStubbed: [ + "GET /marketplace_listing/stubbed/plans/{plan_id}/accounts" + ], + listInstallationReposForAuthenticatedUser: [ + "GET /user/installations/{installation_id}/repositories" + ], + listInstallationRequestsForAuthenticatedApp: [ + "GET /app/installation-requests" + ], + listInstallations: ["GET /app/installations"], + listInstallationsForAuthenticatedUser: ["GET /user/installations"], + listPlans: ["GET /marketplace_listing/plans"], + listPlansStubbed: ["GET /marketplace_listing/stubbed/plans"], + listReposAccessibleToInstallation: ["GET /installation/repositories"], + listSubscriptionsForAuthenticatedUser: ["GET /user/marketplace_purchases"], + listSubscriptionsForAuthenticatedUserStubbed: [ + "GET /user/marketplace_purchases/stubbed" + ], + listWebhookDeliveries: ["GET /app/hook/deliveries"], + redeliverWebhookDelivery: [ + "POST /app/hook/deliveries/{delivery_id}/attempts" + ], + removeRepoFromInstallation: [ + "DELETE /user/installations/{installation_id}/repositories/{repository_id}", + {}, + { renamed: ["apps", "removeRepoFromInstallationForAuthenticatedUser"] } + ], + removeRepoFromInstallationForAuthenticatedUser: [ + "DELETE /user/installations/{installation_id}/repositories/{repository_id}" + ], + resetToken: ["PATCH /applications/{client_id}/token"], + revokeInstallationAccessToken: ["DELETE /installation/token"], + scopeToken: ["POST /applications/{client_id}/token/scoped"], + suspendInstallation: ["PUT /app/installations/{installation_id}/suspended"], + unsuspendInstallation: [ + "DELETE /app/installations/{installation_id}/suspended" + ], + updateWebhookConfigForApp: ["PATCH /app/hook/config"] + }, + billing: { + getGithubActionsBillingOrg: ["GET /orgs/{org}/settings/billing/actions"], + getGithubActionsBillingUser: [ + "GET /users/{username}/settings/billing/actions" + ], + getGithubPackagesBillingOrg: ["GET /orgs/{org}/settings/billing/packages"], + getGithubPackagesBillingUser: [ + "GET /users/{username}/settings/billing/packages" + ], + getSharedStorageBillingOrg: [ + "GET /orgs/{org}/settings/billing/shared-storage" + ], + getSharedStorageBillingUser: [ + "GET /users/{username}/settings/billing/shared-storage" + ] + }, + checks: { + create: ["POST /repos/{owner}/{repo}/check-runs"], + createSuite: ["POST /repos/{owner}/{repo}/check-suites"], + get: ["GET /repos/{owner}/{repo}/check-runs/{check_run_id}"], + getSuite: ["GET /repos/{owner}/{repo}/check-suites/{check_suite_id}"], + listAnnotations: [ + "GET /repos/{owner}/{repo}/check-runs/{check_run_id}/annotations" + ], + listForRef: ["GET /repos/{owner}/{repo}/commits/{ref}/check-runs"], + listForSuite: [ + "GET /repos/{owner}/{repo}/check-suites/{check_suite_id}/check-runs" + ], + listSuitesForRef: ["GET /repos/{owner}/{repo}/commits/{ref}/check-suites"], + rerequestRun: [ + "POST /repos/{owner}/{repo}/check-runs/{check_run_id}/rerequest" + ], + rerequestSuite: [ + "POST /repos/{owner}/{repo}/check-suites/{check_suite_id}/rerequest" + ], + setSuitesPreferences: [ + "PATCH /repos/{owner}/{repo}/check-suites/preferences" + ], + update: ["PATCH /repos/{owner}/{repo}/check-runs/{check_run_id}"] + }, + codeScanning: { + deleteAnalysis: [ + "DELETE /repos/{owner}/{repo}/code-scanning/analyses/{analysis_id}{?confirm_delete}" + ], + getAlert: [ + "GET /repos/{owner}/{repo}/code-scanning/alerts/{alert_number}", + {}, + { renamedParameters: { alert_id: "alert_number" } } + ], + getAnalysis: [ + "GET /repos/{owner}/{repo}/code-scanning/analyses/{analysis_id}" + ], + getCodeqlDatabase: [ + "GET /repos/{owner}/{repo}/code-scanning/codeql/databases/{language}" + ], + getDefaultSetup: ["GET /repos/{owner}/{repo}/code-scanning/default-setup"], + getSarif: ["GET /repos/{owner}/{repo}/code-scanning/sarifs/{sarif_id}"], + listAlertInstances: [ + "GET /repos/{owner}/{repo}/code-scanning/alerts/{alert_number}/instances" + ], + listAlertsForOrg: ["GET /orgs/{org}/code-scanning/alerts"], + listAlertsForRepo: ["GET /repos/{owner}/{repo}/code-scanning/alerts"], + listAlertsInstances: [ + "GET /repos/{owner}/{repo}/code-scanning/alerts/{alert_number}/instances", + {}, + { renamed: ["codeScanning", "listAlertInstances"] } + ], + listCodeqlDatabases: [ + "GET /repos/{owner}/{repo}/code-scanning/codeql/databases" + ], + listRecentAnalyses: ["GET /repos/{owner}/{repo}/code-scanning/analyses"], + updateAlert: [ + "PATCH /repos/{owner}/{repo}/code-scanning/alerts/{alert_number}" + ], + updateDefaultSetup: [ + "PATCH /repos/{owner}/{repo}/code-scanning/default-setup" + ], + uploadSarif: ["POST /repos/{owner}/{repo}/code-scanning/sarifs"] + }, + codesOfConduct: { + getAllCodesOfConduct: ["GET /codes_of_conduct"], + getConductCode: ["GET /codes_of_conduct/{key}"] + }, + codespaces: { + addRepositoryForSecretForAuthenticatedUser: [ + "PUT /user/codespaces/secrets/{secret_name}/repositories/{repository_id}" + ], + addSelectedRepoToOrgSecret: [ + "PUT /orgs/{org}/codespaces/secrets/{secret_name}/repositories/{repository_id}" + ], + checkPermissionsForDevcontainer: [ + "GET /repos/{owner}/{repo}/codespaces/permissions_check" + ], + codespaceMachinesForAuthenticatedUser: [ + "GET /user/codespaces/{codespace_name}/machines" + ], + createForAuthenticatedUser: ["POST /user/codespaces"], + createOrUpdateOrgSecret: [ + "PUT /orgs/{org}/codespaces/secrets/{secret_name}" + ], + createOrUpdateRepoSecret: [ + "PUT /repos/{owner}/{repo}/codespaces/secrets/{secret_name}" + ], + createOrUpdateSecretForAuthenticatedUser: [ + "PUT /user/codespaces/secrets/{secret_name}" + ], + createWithPrForAuthenticatedUser: [ + "POST /repos/{owner}/{repo}/pulls/{pull_number}/codespaces" + ], + createWithRepoForAuthenticatedUser: [ + "POST /repos/{owner}/{repo}/codespaces" + ], + deleteForAuthenticatedUser: ["DELETE /user/codespaces/{codespace_name}"], + deleteFromOrganization: [ + "DELETE /orgs/{org}/members/{username}/codespaces/{codespace_name}" + ], + deleteOrgSecret: ["DELETE /orgs/{org}/codespaces/secrets/{secret_name}"], + deleteRepoSecret: [ + "DELETE /repos/{owner}/{repo}/codespaces/secrets/{secret_name}" + ], + deleteSecretForAuthenticatedUser: [ + "DELETE /user/codespaces/secrets/{secret_name}" + ], + exportForAuthenticatedUser: [ + "POST /user/codespaces/{codespace_name}/exports" + ], + getCodespacesForUserInOrg: [ + "GET /orgs/{org}/members/{username}/codespaces" + ], + getExportDetailsForAuthenticatedUser: [ + "GET /user/codespaces/{codespace_name}/exports/{export_id}" + ], + getForAuthenticatedUser: ["GET /user/codespaces/{codespace_name}"], + getOrgPublicKey: ["GET /orgs/{org}/codespaces/secrets/public-key"], + getOrgSecret: ["GET /orgs/{org}/codespaces/secrets/{secret_name}"], + getPublicKeyForAuthenticatedUser: [ + "GET /user/codespaces/secrets/public-key" + ], + getRepoPublicKey: [ + "GET /repos/{owner}/{repo}/codespaces/secrets/public-key" + ], + getRepoSecret: [ + "GET /repos/{owner}/{repo}/codespaces/secrets/{secret_name}" + ], + getSecretForAuthenticatedUser: [ + "GET /user/codespaces/secrets/{secret_name}" + ], + listDevcontainersInRepositoryForAuthenticatedUser: [ + "GET /repos/{owner}/{repo}/codespaces/devcontainers" + ], + listForAuthenticatedUser: ["GET /user/codespaces"], + listInOrganization: [ + "GET /orgs/{org}/codespaces", + {}, + { renamedParameters: { org_id: "org" } } + ], + listInRepositoryForAuthenticatedUser: [ + "GET /repos/{owner}/{repo}/codespaces" + ], + listOrgSecrets: ["GET /orgs/{org}/codespaces/secrets"], + listRepoSecrets: ["GET /repos/{owner}/{repo}/codespaces/secrets"], + listRepositoriesForSecretForAuthenticatedUser: [ + "GET /user/codespaces/secrets/{secret_name}/repositories" + ], + listSecretsForAuthenticatedUser: ["GET /user/codespaces/secrets"], + listSelectedReposForOrgSecret: [ + "GET /orgs/{org}/codespaces/secrets/{secret_name}/repositories" + ], + preFlightWithRepoForAuthenticatedUser: [ + "GET /repos/{owner}/{repo}/codespaces/new" + ], + publishForAuthenticatedUser: [ + "POST /user/codespaces/{codespace_name}/publish" + ], + removeRepositoryForSecretForAuthenticatedUser: [ + "DELETE /user/codespaces/secrets/{secret_name}/repositories/{repository_id}" + ], + removeSelectedRepoFromOrgSecret: [ + "DELETE /orgs/{org}/codespaces/secrets/{secret_name}/repositories/{repository_id}" + ], + repoMachinesForAuthenticatedUser: [ + "GET /repos/{owner}/{repo}/codespaces/machines" + ], + setRepositoriesForSecretForAuthenticatedUser: [ + "PUT /user/codespaces/secrets/{secret_name}/repositories" + ], + setSelectedReposForOrgSecret: [ + "PUT /orgs/{org}/codespaces/secrets/{secret_name}/repositories" + ], + startForAuthenticatedUser: ["POST /user/codespaces/{codespace_name}/start"], + stopForAuthenticatedUser: ["POST /user/codespaces/{codespace_name}/stop"], + stopInOrganization: [ + "POST /orgs/{org}/members/{username}/codespaces/{codespace_name}/stop" + ], + updateForAuthenticatedUser: ["PATCH /user/codespaces/{codespace_name}"] + }, + copilot: { + addCopilotSeatsForTeams: [ + "POST /orgs/{org}/copilot/billing/selected_teams" + ], + addCopilotSeatsForUsers: [ + "POST /orgs/{org}/copilot/billing/selected_users" + ], + cancelCopilotSeatAssignmentForTeams: [ + "DELETE /orgs/{org}/copilot/billing/selected_teams" + ], + cancelCopilotSeatAssignmentForUsers: [ + "DELETE /orgs/{org}/copilot/billing/selected_users" + ], + getCopilotOrganizationDetails: ["GET /orgs/{org}/copilot/billing"], + getCopilotSeatDetailsForUser: [ + "GET /orgs/{org}/members/{username}/copilot" + ], + listCopilotSeats: ["GET /orgs/{org}/copilot/billing/seats"] + }, + dependabot: { + addSelectedRepoToOrgSecret: [ + "PUT /orgs/{org}/dependabot/secrets/{secret_name}/repositories/{repository_id}" + ], + createOrUpdateOrgSecret: [ + "PUT /orgs/{org}/dependabot/secrets/{secret_name}" + ], + createOrUpdateRepoSecret: [ + "PUT /repos/{owner}/{repo}/dependabot/secrets/{secret_name}" + ], + deleteOrgSecret: ["DELETE /orgs/{org}/dependabot/secrets/{secret_name}"], + deleteRepoSecret: [ + "DELETE /repos/{owner}/{repo}/dependabot/secrets/{secret_name}" + ], + getAlert: ["GET /repos/{owner}/{repo}/dependabot/alerts/{alert_number}"], + getOrgPublicKey: ["GET /orgs/{org}/dependabot/secrets/public-key"], + getOrgSecret: ["GET /orgs/{org}/dependabot/secrets/{secret_name}"], + getRepoPublicKey: [ + "GET /repos/{owner}/{repo}/dependabot/secrets/public-key" + ], + getRepoSecret: [ + "GET /repos/{owner}/{repo}/dependabot/secrets/{secret_name}" + ], + listAlertsForEnterprise: [ + "GET /enterprises/{enterprise}/dependabot/alerts" + ], + listAlertsForOrg: ["GET /orgs/{org}/dependabot/alerts"], + listAlertsForRepo: ["GET /repos/{owner}/{repo}/dependabot/alerts"], + listOrgSecrets: ["GET /orgs/{org}/dependabot/secrets"], + listRepoSecrets: ["GET /repos/{owner}/{repo}/dependabot/secrets"], + listSelectedReposForOrgSecret: [ + "GET /orgs/{org}/dependabot/secrets/{secret_name}/repositories" + ], + removeSelectedRepoFromOrgSecret: [ + "DELETE /orgs/{org}/dependabot/secrets/{secret_name}/repositories/{repository_id}" + ], + setSelectedReposForOrgSecret: [ + "PUT /orgs/{org}/dependabot/secrets/{secret_name}/repositories" + ], + updateAlert: [ + "PATCH /repos/{owner}/{repo}/dependabot/alerts/{alert_number}" + ] + }, + dependencyGraph: { + createRepositorySnapshot: [ + "POST /repos/{owner}/{repo}/dependency-graph/snapshots" + ], + diffRange: [ + "GET /repos/{owner}/{repo}/dependency-graph/compare/{basehead}" + ], + exportSbom: ["GET /repos/{owner}/{repo}/dependency-graph/sbom"] + }, + emojis: { get: ["GET /emojis"] }, + gists: { + checkIsStarred: ["GET /gists/{gist_id}/star"], + create: ["POST /gists"], + createComment: ["POST /gists/{gist_id}/comments"], + delete: ["DELETE /gists/{gist_id}"], + deleteComment: ["DELETE /gists/{gist_id}/comments/{comment_id}"], + fork: ["POST /gists/{gist_id}/forks"], + get: ["GET /gists/{gist_id}"], + getComment: ["GET /gists/{gist_id}/comments/{comment_id}"], + getRevision: ["GET /gists/{gist_id}/{sha}"], + list: ["GET /gists"], + listComments: ["GET /gists/{gist_id}/comments"], + listCommits: ["GET /gists/{gist_id}/commits"], + listForUser: ["GET /users/{username}/gists"], + listForks: ["GET /gists/{gist_id}/forks"], + listPublic: ["GET /gists/public"], + listStarred: ["GET /gists/starred"], + star: ["PUT /gists/{gist_id}/star"], + unstar: ["DELETE /gists/{gist_id}/star"], + update: ["PATCH /gists/{gist_id}"], + updateComment: ["PATCH /gists/{gist_id}/comments/{comment_id}"] + }, + git: { + createBlob: ["POST /repos/{owner}/{repo}/git/blobs"], + createCommit: ["POST /repos/{owner}/{repo}/git/commits"], + createRef: ["POST /repos/{owner}/{repo}/git/refs"], + createTag: ["POST /repos/{owner}/{repo}/git/tags"], + createTree: ["POST /repos/{owner}/{repo}/git/trees"], + deleteRef: ["DELETE /repos/{owner}/{repo}/git/refs/{ref}"], + getBlob: ["GET /repos/{owner}/{repo}/git/blobs/{file_sha}"], + getCommit: ["GET /repos/{owner}/{repo}/git/commits/{commit_sha}"], + getRef: ["GET /repos/{owner}/{repo}/git/ref/{ref}"], + getTag: ["GET /repos/{owner}/{repo}/git/tags/{tag_sha}"], + getTree: ["GET /repos/{owner}/{repo}/git/trees/{tree_sha}"], + listMatchingRefs: ["GET /repos/{owner}/{repo}/git/matching-refs/{ref}"], + updateRef: ["PATCH /repos/{owner}/{repo}/git/refs/{ref}"] + }, + gitignore: { + getAllTemplates: ["GET /gitignore/templates"], + getTemplate: ["GET /gitignore/templates/{name}"] + }, + interactions: { + getRestrictionsForAuthenticatedUser: ["GET /user/interaction-limits"], + getRestrictionsForOrg: ["GET /orgs/{org}/interaction-limits"], + getRestrictionsForRepo: ["GET /repos/{owner}/{repo}/interaction-limits"], + getRestrictionsForYourPublicRepos: [ + "GET /user/interaction-limits", + {}, + { renamed: ["interactions", "getRestrictionsForAuthenticatedUser"] } + ], + removeRestrictionsForAuthenticatedUser: ["DELETE /user/interaction-limits"], + removeRestrictionsForOrg: ["DELETE /orgs/{org}/interaction-limits"], + removeRestrictionsForRepo: [ + "DELETE /repos/{owner}/{repo}/interaction-limits" + ], + removeRestrictionsForYourPublicRepos: [ + "DELETE /user/interaction-limits", + {}, + { renamed: ["interactions", "removeRestrictionsForAuthenticatedUser"] } + ], + setRestrictionsForAuthenticatedUser: ["PUT /user/interaction-limits"], + setRestrictionsForOrg: ["PUT /orgs/{org}/interaction-limits"], + setRestrictionsForRepo: ["PUT /repos/{owner}/{repo}/interaction-limits"], + setRestrictionsForYourPublicRepos: [ + "PUT /user/interaction-limits", + {}, + { renamed: ["interactions", "setRestrictionsForAuthenticatedUser"] } + ] + }, + issues: { + addAssignees: [ + "POST /repos/{owner}/{repo}/issues/{issue_number}/assignees" + ], + addLabels: ["POST /repos/{owner}/{repo}/issues/{issue_number}/labels"], + checkUserCanBeAssigned: ["GET /repos/{owner}/{repo}/assignees/{assignee}"], + checkUserCanBeAssignedToIssue: [ + "GET /repos/{owner}/{repo}/issues/{issue_number}/assignees/{assignee}" + ], + create: ["POST /repos/{owner}/{repo}/issues"], + createComment: [ + "POST /repos/{owner}/{repo}/issues/{issue_number}/comments" + ], + createLabel: ["POST /repos/{owner}/{repo}/labels"], + createMilestone: ["POST /repos/{owner}/{repo}/milestones"], + deleteComment: [ + "DELETE /repos/{owner}/{repo}/issues/comments/{comment_id}" + ], + deleteLabel: ["DELETE /repos/{owner}/{repo}/labels/{name}"], + deleteMilestone: [ + "DELETE /repos/{owner}/{repo}/milestones/{milestone_number}" + ], + get: ["GET /repos/{owner}/{repo}/issues/{issue_number}"], + getComment: ["GET /repos/{owner}/{repo}/issues/comments/{comment_id}"], + getEvent: ["GET /repos/{owner}/{repo}/issues/events/{event_id}"], + getLabel: ["GET /repos/{owner}/{repo}/labels/{name}"], + getMilestone: ["GET /repos/{owner}/{repo}/milestones/{milestone_number}"], + list: ["GET /issues"], + listAssignees: ["GET /repos/{owner}/{repo}/assignees"], + listComments: ["GET /repos/{owner}/{repo}/issues/{issue_number}/comments"], + listCommentsForRepo: ["GET /repos/{owner}/{repo}/issues/comments"], + listEvents: ["GET /repos/{owner}/{repo}/issues/{issue_number}/events"], + listEventsForRepo: ["GET /repos/{owner}/{repo}/issues/events"], + listEventsForTimeline: [ + "GET /repos/{owner}/{repo}/issues/{issue_number}/timeline" + ], + listForAuthenticatedUser: ["GET /user/issues"], + listForOrg: ["GET /orgs/{org}/issues"], + listForRepo: ["GET /repos/{owner}/{repo}/issues"], + listLabelsForMilestone: [ + "GET /repos/{owner}/{repo}/milestones/{milestone_number}/labels" + ], + listLabelsForRepo: ["GET /repos/{owner}/{repo}/labels"], + listLabelsOnIssue: [ + "GET /repos/{owner}/{repo}/issues/{issue_number}/labels" + ], + listMilestones: ["GET /repos/{owner}/{repo}/milestones"], + lock: ["PUT /repos/{owner}/{repo}/issues/{issue_number}/lock"], + removeAllLabels: [ + "DELETE /repos/{owner}/{repo}/issues/{issue_number}/labels" + ], + removeAssignees: [ + "DELETE /repos/{owner}/{repo}/issues/{issue_number}/assignees" + ], + removeLabel: [ + "DELETE /repos/{owner}/{repo}/issues/{issue_number}/labels/{name}" + ], + setLabels: ["PUT /repos/{owner}/{repo}/issues/{issue_number}/labels"], + unlock: ["DELETE /repos/{owner}/{repo}/issues/{issue_number}/lock"], + update: ["PATCH /repos/{owner}/{repo}/issues/{issue_number}"], + updateComment: ["PATCH /repos/{owner}/{repo}/issues/comments/{comment_id}"], + updateLabel: ["PATCH /repos/{owner}/{repo}/labels/{name}"], + updateMilestone: [ + "PATCH /repos/{owner}/{repo}/milestones/{milestone_number}" + ] + }, + licenses: { + get: ["GET /licenses/{license}"], + getAllCommonlyUsed: ["GET /licenses"], + getForRepo: ["GET /repos/{owner}/{repo}/license"] + }, + markdown: { + render: ["POST /markdown"], + renderRaw: [ + "POST /markdown/raw", + { headers: { "content-type": "text/plain; charset=utf-8" } } + ] + }, + meta: { + get: ["GET /meta"], + getAllVersions: ["GET /versions"], + getOctocat: ["GET /octocat"], + getZen: ["GET /zen"], + root: ["GET /"] + }, + migrations: { + cancelImport: [ + "DELETE /repos/{owner}/{repo}/import", + {}, + { + deprecated: "octokit.rest.migrations.cancelImport() is deprecated, see https://docs.github.com/rest/migrations/source-imports#cancel-an-import" + } + ], + deleteArchiveForAuthenticatedUser: [ + "DELETE /user/migrations/{migration_id}/archive" + ], + deleteArchiveForOrg: [ + "DELETE /orgs/{org}/migrations/{migration_id}/archive" + ], + downloadArchiveForOrg: [ + "GET /orgs/{org}/migrations/{migration_id}/archive" + ], + getArchiveForAuthenticatedUser: [ + "GET /user/migrations/{migration_id}/archive" + ], + getCommitAuthors: [ + "GET /repos/{owner}/{repo}/import/authors", + {}, + { + deprecated: "octokit.rest.migrations.getCommitAuthors() is deprecated, see https://docs.github.com/rest/migrations/source-imports#get-commit-authors" + } + ], + getImportStatus: [ + "GET /repos/{owner}/{repo}/import", + {}, + { + deprecated: "octokit.rest.migrations.getImportStatus() is deprecated, see https://docs.github.com/rest/migrations/source-imports#get-an-import-status" + } + ], + getLargeFiles: [ + "GET /repos/{owner}/{repo}/import/large_files", + {}, + { + deprecated: "octokit.rest.migrations.getLargeFiles() is deprecated, see https://docs.github.com/rest/migrations/source-imports#get-large-files" + } + ], + getStatusForAuthenticatedUser: ["GET /user/migrations/{migration_id}"], + getStatusForOrg: ["GET /orgs/{org}/migrations/{migration_id}"], + listForAuthenticatedUser: ["GET /user/migrations"], + listForOrg: ["GET /orgs/{org}/migrations"], + listReposForAuthenticatedUser: [ + "GET /user/migrations/{migration_id}/repositories" + ], + listReposForOrg: ["GET /orgs/{org}/migrations/{migration_id}/repositories"], + listReposForUser: [ + "GET /user/migrations/{migration_id}/repositories", + {}, + { renamed: ["migrations", "listReposForAuthenticatedUser"] } + ], + mapCommitAuthor: [ + "PATCH /repos/{owner}/{repo}/import/authors/{author_id}", + {}, + { + deprecated: "octokit.rest.migrations.mapCommitAuthor() is deprecated, see https://docs.github.com/rest/migrations/source-imports#map-a-commit-author" + } + ], + setLfsPreference: [ + "PATCH /repos/{owner}/{repo}/import/lfs", + {}, + { + deprecated: "octokit.rest.migrations.setLfsPreference() is deprecated, see https://docs.github.com/rest/migrations/source-imports#update-git-lfs-preference" + } + ], + startForAuthenticatedUser: ["POST /user/migrations"], + startForOrg: ["POST /orgs/{org}/migrations"], + startImport: [ + "PUT /repos/{owner}/{repo}/import", + {}, + { + deprecated: "octokit.rest.migrations.startImport() is deprecated, see https://docs.github.com/rest/migrations/source-imports#start-an-import" + } + ], + unlockRepoForAuthenticatedUser: [ + "DELETE /user/migrations/{migration_id}/repos/{repo_name}/lock" + ], + unlockRepoForOrg: [ + "DELETE /orgs/{org}/migrations/{migration_id}/repos/{repo_name}/lock" + ], + updateImport: [ + "PATCH /repos/{owner}/{repo}/import", + {}, + { + deprecated: "octokit.rest.migrations.updateImport() is deprecated, see https://docs.github.com/rest/migrations/source-imports#update-an-import" + } + ] + }, + oidc: { + getOidcCustomSubTemplateForOrg: [ + "GET /orgs/{org}/actions/oidc/customization/sub" + ], + updateOidcCustomSubTemplateForOrg: [ + "PUT /orgs/{org}/actions/oidc/customization/sub" + ] + }, + orgs: { + addSecurityManagerTeam: [ + "PUT /orgs/{org}/security-managers/teams/{team_slug}" + ], + assignTeamToOrgRole: [ + "PUT /orgs/{org}/organization-roles/teams/{team_slug}/{role_id}" + ], + assignUserToOrgRole: [ + "PUT /orgs/{org}/organization-roles/users/{username}/{role_id}" + ], + blockUser: ["PUT /orgs/{org}/blocks/{username}"], + cancelInvitation: ["DELETE /orgs/{org}/invitations/{invitation_id}"], + checkBlockedUser: ["GET /orgs/{org}/blocks/{username}"], + checkMembershipForUser: ["GET /orgs/{org}/members/{username}"], + checkPublicMembershipForUser: ["GET /orgs/{org}/public_members/{username}"], + convertMemberToOutsideCollaborator: [ + "PUT /orgs/{org}/outside_collaborators/{username}" + ], + createCustomOrganizationRole: ["POST /orgs/{org}/organization-roles"], + createInvitation: ["POST /orgs/{org}/invitations"], + createOrUpdateCustomProperties: ["PATCH /orgs/{org}/properties/schema"], + createOrUpdateCustomPropertiesValuesForRepos: [ + "PATCH /orgs/{org}/properties/values" + ], + createOrUpdateCustomProperty: [ + "PUT /orgs/{org}/properties/schema/{custom_property_name}" + ], + createWebhook: ["POST /orgs/{org}/hooks"], + delete: ["DELETE /orgs/{org}"], + deleteCustomOrganizationRole: [ + "DELETE /orgs/{org}/organization-roles/{role_id}" + ], + deleteWebhook: ["DELETE /orgs/{org}/hooks/{hook_id}"], + enableOrDisableSecurityProductOnAllOrgRepos: [ + "POST /orgs/{org}/{security_product}/{enablement}" + ], + get: ["GET /orgs/{org}"], + getAllCustomProperties: ["GET /orgs/{org}/properties/schema"], + getCustomProperty: [ + "GET /orgs/{org}/properties/schema/{custom_property_name}" + ], + getMembershipForAuthenticatedUser: ["GET /user/memberships/orgs/{org}"], + getMembershipForUser: ["GET /orgs/{org}/memberships/{username}"], + getOrgRole: ["GET /orgs/{org}/organization-roles/{role_id}"], + getWebhook: ["GET /orgs/{org}/hooks/{hook_id}"], + getWebhookConfigForOrg: ["GET /orgs/{org}/hooks/{hook_id}/config"], + getWebhookDelivery: [ + "GET /orgs/{org}/hooks/{hook_id}/deliveries/{delivery_id}" + ], + list: ["GET /organizations"], + listAppInstallations: ["GET /orgs/{org}/installations"], + listBlockedUsers: ["GET /orgs/{org}/blocks"], + listCustomPropertiesValuesForRepos: ["GET /orgs/{org}/properties/values"], + listFailedInvitations: ["GET /orgs/{org}/failed_invitations"], + listForAuthenticatedUser: ["GET /user/orgs"], + listForUser: ["GET /users/{username}/orgs"], + listInvitationTeams: ["GET /orgs/{org}/invitations/{invitation_id}/teams"], + listMembers: ["GET /orgs/{org}/members"], + listMembershipsForAuthenticatedUser: ["GET /user/memberships/orgs"], + listOrgRoleTeams: ["GET /orgs/{org}/organization-roles/{role_id}/teams"], + listOrgRoleUsers: ["GET /orgs/{org}/organization-roles/{role_id}/users"], + listOrgRoles: ["GET /orgs/{org}/organization-roles"], + listOrganizationFineGrainedPermissions: [ + "GET /orgs/{org}/organization-fine-grained-permissions" + ], + listOutsideCollaborators: ["GET /orgs/{org}/outside_collaborators"], + listPatGrantRepositories: [ + "GET /orgs/{org}/personal-access-tokens/{pat_id}/repositories" + ], + listPatGrantRequestRepositories: [ + "GET /orgs/{org}/personal-access-token-requests/{pat_request_id}/repositories" + ], + listPatGrantRequests: ["GET /orgs/{org}/personal-access-token-requests"], + listPatGrants: ["GET /orgs/{org}/personal-access-tokens"], + listPendingInvitations: ["GET /orgs/{org}/invitations"], + listPublicMembers: ["GET /orgs/{org}/public_members"], + listSecurityManagerTeams: ["GET /orgs/{org}/security-managers"], + listWebhookDeliveries: ["GET /orgs/{org}/hooks/{hook_id}/deliveries"], + listWebhooks: ["GET /orgs/{org}/hooks"], + patchCustomOrganizationRole: [ + "PATCH /orgs/{org}/organization-roles/{role_id}" + ], + pingWebhook: ["POST /orgs/{org}/hooks/{hook_id}/pings"], + redeliverWebhookDelivery: [ + "POST /orgs/{org}/hooks/{hook_id}/deliveries/{delivery_id}/attempts" + ], + removeCustomProperty: [ + "DELETE /orgs/{org}/properties/schema/{custom_property_name}" + ], + removeMember: ["DELETE /orgs/{org}/members/{username}"], + removeMembershipForUser: ["DELETE /orgs/{org}/memberships/{username}"], + removeOutsideCollaborator: [ + "DELETE /orgs/{org}/outside_collaborators/{username}" + ], + removePublicMembershipForAuthenticatedUser: [ + "DELETE /orgs/{org}/public_members/{username}" + ], + removeSecurityManagerTeam: [ + "DELETE /orgs/{org}/security-managers/teams/{team_slug}" + ], + reviewPatGrantRequest: [ + "POST /orgs/{org}/personal-access-token-requests/{pat_request_id}" + ], + reviewPatGrantRequestsInBulk: [ + "POST /orgs/{org}/personal-access-token-requests" + ], + revokeAllOrgRolesTeam: [ + "DELETE /orgs/{org}/organization-roles/teams/{team_slug}" + ], + revokeAllOrgRolesUser: [ + "DELETE /orgs/{org}/organization-roles/users/{username}" + ], + revokeOrgRoleTeam: [ + "DELETE /orgs/{org}/organization-roles/teams/{team_slug}/{role_id}" + ], + revokeOrgRoleUser: [ + "DELETE /orgs/{org}/organization-roles/users/{username}/{role_id}" + ], + setMembershipForUser: ["PUT /orgs/{org}/memberships/{username}"], + setPublicMembershipForAuthenticatedUser: [ + "PUT /orgs/{org}/public_members/{username}" + ], + unblockUser: ["DELETE /orgs/{org}/blocks/{username}"], + update: ["PATCH /orgs/{org}"], + updateMembershipForAuthenticatedUser: [ + "PATCH /user/memberships/orgs/{org}" + ], + updatePatAccess: ["POST /orgs/{org}/personal-access-tokens/{pat_id}"], + updatePatAccesses: ["POST /orgs/{org}/personal-access-tokens"], + updateWebhook: ["PATCH /orgs/{org}/hooks/{hook_id}"], + updateWebhookConfigForOrg: ["PATCH /orgs/{org}/hooks/{hook_id}/config"] + }, + packages: { + deletePackageForAuthenticatedUser: [ + "DELETE /user/packages/{package_type}/{package_name}" + ], + deletePackageForOrg: [ + "DELETE /orgs/{org}/packages/{package_type}/{package_name}" + ], + deletePackageForUser: [ + "DELETE /users/{username}/packages/{package_type}/{package_name}" + ], + deletePackageVersionForAuthenticatedUser: [ + "DELETE /user/packages/{package_type}/{package_name}/versions/{package_version_id}" + ], + deletePackageVersionForOrg: [ + "DELETE /orgs/{org}/packages/{package_type}/{package_name}/versions/{package_version_id}" + ], + deletePackageVersionForUser: [ + "DELETE /users/{username}/packages/{package_type}/{package_name}/versions/{package_version_id}" + ], + getAllPackageVersionsForAPackageOwnedByAnOrg: [ + "GET /orgs/{org}/packages/{package_type}/{package_name}/versions", + {}, + { renamed: ["packages", "getAllPackageVersionsForPackageOwnedByOrg"] } + ], + getAllPackageVersionsForAPackageOwnedByTheAuthenticatedUser: [ + "GET /user/packages/{package_type}/{package_name}/versions", + {}, + { + renamed: [ + "packages", + "getAllPackageVersionsForPackageOwnedByAuthenticatedUser" + ] + } + ], + getAllPackageVersionsForPackageOwnedByAuthenticatedUser: [ + "GET /user/packages/{package_type}/{package_name}/versions" + ], + getAllPackageVersionsForPackageOwnedByOrg: [ + "GET /orgs/{org}/packages/{package_type}/{package_name}/versions" + ], + getAllPackageVersionsForPackageOwnedByUser: [ + "GET /users/{username}/packages/{package_type}/{package_name}/versions" + ], + getPackageForAuthenticatedUser: [ + "GET /user/packages/{package_type}/{package_name}" + ], + getPackageForOrganization: [ + "GET /orgs/{org}/packages/{package_type}/{package_name}" + ], + getPackageForUser: [ + "GET /users/{username}/packages/{package_type}/{package_name}" + ], + getPackageVersionForAuthenticatedUser: [ + "GET /user/packages/{package_type}/{package_name}/versions/{package_version_id}" + ], + getPackageVersionForOrganization: [ + "GET /orgs/{org}/packages/{package_type}/{package_name}/versions/{package_version_id}" + ], + getPackageVersionForUser: [ + "GET /users/{username}/packages/{package_type}/{package_name}/versions/{package_version_id}" + ], + listDockerMigrationConflictingPackagesForAuthenticatedUser: [ + "GET /user/docker/conflicts" + ], + listDockerMigrationConflictingPackagesForOrganization: [ + "GET /orgs/{org}/docker/conflicts" + ], + listDockerMigrationConflictingPackagesForUser: [ + "GET /users/{username}/docker/conflicts" + ], + listPackagesForAuthenticatedUser: ["GET /user/packages"], + listPackagesForOrganization: ["GET /orgs/{org}/packages"], + listPackagesForUser: ["GET /users/{username}/packages"], + restorePackageForAuthenticatedUser: [ + "POST /user/packages/{package_type}/{package_name}/restore{?token}" + ], + restorePackageForOrg: [ + "POST /orgs/{org}/packages/{package_type}/{package_name}/restore{?token}" + ], + restorePackageForUser: [ + "POST /users/{username}/packages/{package_type}/{package_name}/restore{?token}" + ], + restorePackageVersionForAuthenticatedUser: [ + "POST /user/packages/{package_type}/{package_name}/versions/{package_version_id}/restore" + ], + restorePackageVersionForOrg: [ + "POST /orgs/{org}/packages/{package_type}/{package_name}/versions/{package_version_id}/restore" + ], + restorePackageVersionForUser: [ + "POST /users/{username}/packages/{package_type}/{package_name}/versions/{package_version_id}/restore" + ] + }, + projects: { + addCollaborator: ["PUT /projects/{project_id}/collaborators/{username}"], + createCard: ["POST /projects/columns/{column_id}/cards"], + createColumn: ["POST /projects/{project_id}/columns"], + createForAuthenticatedUser: ["POST /user/projects"], + createForOrg: ["POST /orgs/{org}/projects"], + createForRepo: ["POST /repos/{owner}/{repo}/projects"], + delete: ["DELETE /projects/{project_id}"], + deleteCard: ["DELETE /projects/columns/cards/{card_id}"], + deleteColumn: ["DELETE /projects/columns/{column_id}"], + get: ["GET /projects/{project_id}"], + getCard: ["GET /projects/columns/cards/{card_id}"], + getColumn: ["GET /projects/columns/{column_id}"], + getPermissionForUser: [ + "GET /projects/{project_id}/collaborators/{username}/permission" + ], + listCards: ["GET /projects/columns/{column_id}/cards"], + listCollaborators: ["GET /projects/{project_id}/collaborators"], + listColumns: ["GET /projects/{project_id}/columns"], + listForOrg: ["GET /orgs/{org}/projects"], + listForRepo: ["GET /repos/{owner}/{repo}/projects"], + listForUser: ["GET /users/{username}/projects"], + moveCard: ["POST /projects/columns/cards/{card_id}/moves"], + moveColumn: ["POST /projects/columns/{column_id}/moves"], + removeCollaborator: [ + "DELETE /projects/{project_id}/collaborators/{username}" + ], + update: ["PATCH /projects/{project_id}"], + updateCard: ["PATCH /projects/columns/cards/{card_id}"], + updateColumn: ["PATCH /projects/columns/{column_id}"] + }, + pulls: { + checkIfMerged: ["GET /repos/{owner}/{repo}/pulls/{pull_number}/merge"], + create: ["POST /repos/{owner}/{repo}/pulls"], + createReplyForReviewComment: [ + "POST /repos/{owner}/{repo}/pulls/{pull_number}/comments/{comment_id}/replies" + ], + createReview: ["POST /repos/{owner}/{repo}/pulls/{pull_number}/reviews"], + createReviewComment: [ + "POST /repos/{owner}/{repo}/pulls/{pull_number}/comments" + ], + deletePendingReview: [ + "DELETE /repos/{owner}/{repo}/pulls/{pull_number}/reviews/{review_id}" + ], + deleteReviewComment: [ + "DELETE /repos/{owner}/{repo}/pulls/comments/{comment_id}" + ], + dismissReview: [ + "PUT /repos/{owner}/{repo}/pulls/{pull_number}/reviews/{review_id}/dismissals" + ], + get: ["GET /repos/{owner}/{repo}/pulls/{pull_number}"], + getReview: [ + "GET /repos/{owner}/{repo}/pulls/{pull_number}/reviews/{review_id}" + ], + getReviewComment: ["GET /repos/{owner}/{repo}/pulls/comments/{comment_id}"], + list: ["GET /repos/{owner}/{repo}/pulls"], + listCommentsForReview: [ + "GET /repos/{owner}/{repo}/pulls/{pull_number}/reviews/{review_id}/comments" + ], + listCommits: ["GET /repos/{owner}/{repo}/pulls/{pull_number}/commits"], + listFiles: ["GET /repos/{owner}/{repo}/pulls/{pull_number}/files"], + listRequestedReviewers: [ + "GET /repos/{owner}/{repo}/pulls/{pull_number}/requested_reviewers" + ], + listReviewComments: [ + "GET /repos/{owner}/{repo}/pulls/{pull_number}/comments" + ], + listReviewCommentsForRepo: ["GET /repos/{owner}/{repo}/pulls/comments"], + listReviews: ["GET /repos/{owner}/{repo}/pulls/{pull_number}/reviews"], + merge: ["PUT /repos/{owner}/{repo}/pulls/{pull_number}/merge"], + removeRequestedReviewers: [ + "DELETE /repos/{owner}/{repo}/pulls/{pull_number}/requested_reviewers" + ], + requestReviewers: [ + "POST /repos/{owner}/{repo}/pulls/{pull_number}/requested_reviewers" + ], + submitReview: [ + "POST /repos/{owner}/{repo}/pulls/{pull_number}/reviews/{review_id}/events" + ], + update: ["PATCH /repos/{owner}/{repo}/pulls/{pull_number}"], + updateBranch: [ + "PUT /repos/{owner}/{repo}/pulls/{pull_number}/update-branch" + ], + updateReview: [ + "PUT /repos/{owner}/{repo}/pulls/{pull_number}/reviews/{review_id}" + ], + updateReviewComment: [ + "PATCH /repos/{owner}/{repo}/pulls/comments/{comment_id}" + ] + }, + rateLimit: { get: ["GET /rate_limit"] }, + reactions: { + createForCommitComment: [ + "POST /repos/{owner}/{repo}/comments/{comment_id}/reactions" + ], + createForIssue: [ + "POST /repos/{owner}/{repo}/issues/{issue_number}/reactions" + ], + createForIssueComment: [ + "POST /repos/{owner}/{repo}/issues/comments/{comment_id}/reactions" + ], + createForPullRequestReviewComment: [ + "POST /repos/{owner}/{repo}/pulls/comments/{comment_id}/reactions" + ], + createForRelease: [ + "POST /repos/{owner}/{repo}/releases/{release_id}/reactions" + ], + createForTeamDiscussionCommentInOrg: [ + "POST /orgs/{org}/teams/{team_slug}/discussions/{discussion_number}/comments/{comment_number}/reactions" + ], + createForTeamDiscussionInOrg: [ + "POST /orgs/{org}/teams/{team_slug}/discussions/{discussion_number}/reactions" + ], + deleteForCommitComment: [ + "DELETE /repos/{owner}/{repo}/comments/{comment_id}/reactions/{reaction_id}" + ], + deleteForIssue: [ + "DELETE /repos/{owner}/{repo}/issues/{issue_number}/reactions/{reaction_id}" + ], + deleteForIssueComment: [ + "DELETE /repos/{owner}/{repo}/issues/comments/{comment_id}/reactions/{reaction_id}" + ], + deleteForPullRequestComment: [ + "DELETE /repos/{owner}/{repo}/pulls/comments/{comment_id}/reactions/{reaction_id}" + ], + deleteForRelease: [ + "DELETE /repos/{owner}/{repo}/releases/{release_id}/reactions/{reaction_id}" + ], + deleteForTeamDiscussion: [ + "DELETE /orgs/{org}/teams/{team_slug}/discussions/{discussion_number}/reactions/{reaction_id}" + ], + deleteForTeamDiscussionComment: [ + "DELETE /orgs/{org}/teams/{team_slug}/discussions/{discussion_number}/comments/{comment_number}/reactions/{reaction_id}" + ], + listForCommitComment: [ + "GET /repos/{owner}/{repo}/comments/{comment_id}/reactions" + ], + listForIssue: ["GET /repos/{owner}/{repo}/issues/{issue_number}/reactions"], + listForIssueComment: [ + "GET /repos/{owner}/{repo}/issues/comments/{comment_id}/reactions" + ], + listForPullRequestReviewComment: [ + "GET /repos/{owner}/{repo}/pulls/comments/{comment_id}/reactions" + ], + listForRelease: [ + "GET /repos/{owner}/{repo}/releases/{release_id}/reactions" + ], + listForTeamDiscussionCommentInOrg: [ + "GET /orgs/{org}/teams/{team_slug}/discussions/{discussion_number}/comments/{comment_number}/reactions" + ], + listForTeamDiscussionInOrg: [ + "GET /orgs/{org}/teams/{team_slug}/discussions/{discussion_number}/reactions" + ] + }, + repos: { + acceptInvitation: [ + "PATCH /user/repository_invitations/{invitation_id}", + {}, + { renamed: ["repos", "acceptInvitationForAuthenticatedUser"] } + ], + acceptInvitationForAuthenticatedUser: [ + "PATCH /user/repository_invitations/{invitation_id}" + ], + addAppAccessRestrictions: [ + "POST /repos/{owner}/{repo}/branches/{branch}/protection/restrictions/apps", + {}, + { mapToData: "apps" } + ], + addCollaborator: ["PUT /repos/{owner}/{repo}/collaborators/{username}"], + addStatusCheckContexts: [ + "POST /repos/{owner}/{repo}/branches/{branch}/protection/required_status_checks/contexts", + {}, + { mapToData: "contexts" } + ], + addTeamAccessRestrictions: [ + "POST /repos/{owner}/{repo}/branches/{branch}/protection/restrictions/teams", + {}, + { mapToData: "teams" } + ], + addUserAccessRestrictions: [ + "POST /repos/{owner}/{repo}/branches/{branch}/protection/restrictions/users", + {}, + { mapToData: "users" } + ], + cancelPagesDeployment: [ + "POST /repos/{owner}/{repo}/pages/deployments/{pages_deployment_id}/cancel" + ], + checkAutomatedSecurityFixes: [ + "GET /repos/{owner}/{repo}/automated-security-fixes" + ], + checkCollaborator: ["GET /repos/{owner}/{repo}/collaborators/{username}"], + checkVulnerabilityAlerts: [ + "GET /repos/{owner}/{repo}/vulnerability-alerts" + ], + codeownersErrors: ["GET /repos/{owner}/{repo}/codeowners/errors"], + compareCommits: ["GET /repos/{owner}/{repo}/compare/{base}...{head}"], + compareCommitsWithBasehead: [ + "GET /repos/{owner}/{repo}/compare/{basehead}" + ], + createAutolink: ["POST /repos/{owner}/{repo}/autolinks"], + createCommitComment: [ + "POST /repos/{owner}/{repo}/commits/{commit_sha}/comments" + ], + createCommitSignatureProtection: [ + "POST /repos/{owner}/{repo}/branches/{branch}/protection/required_signatures" + ], + createCommitStatus: ["POST /repos/{owner}/{repo}/statuses/{sha}"], + createDeployKey: ["POST /repos/{owner}/{repo}/keys"], + createDeployment: ["POST /repos/{owner}/{repo}/deployments"], + createDeploymentBranchPolicy: [ + "POST /repos/{owner}/{repo}/environments/{environment_name}/deployment-branch-policies" + ], + createDeploymentProtectionRule: [ + "POST /repos/{owner}/{repo}/environments/{environment_name}/deployment_protection_rules" + ], + createDeploymentStatus: [ + "POST /repos/{owner}/{repo}/deployments/{deployment_id}/statuses" + ], + createDispatchEvent: ["POST /repos/{owner}/{repo}/dispatches"], + createForAuthenticatedUser: ["POST /user/repos"], + createFork: ["POST /repos/{owner}/{repo}/forks"], + createInOrg: ["POST /orgs/{org}/repos"], + createOrUpdateCustomPropertiesValues: [ + "PATCH /repos/{owner}/{repo}/properties/values" + ], + createOrUpdateEnvironment: [ + "PUT /repos/{owner}/{repo}/environments/{environment_name}" + ], + createOrUpdateFileContents: ["PUT /repos/{owner}/{repo}/contents/{path}"], + createOrgRuleset: ["POST /orgs/{org}/rulesets"], + createPagesDeployment: ["POST /repos/{owner}/{repo}/pages/deployments"], + createPagesSite: ["POST /repos/{owner}/{repo}/pages"], + createRelease: ["POST /repos/{owner}/{repo}/releases"], + createRepoRuleset: ["POST /repos/{owner}/{repo}/rulesets"], + createTagProtection: ["POST /repos/{owner}/{repo}/tags/protection"], + createUsingTemplate: [ + "POST /repos/{template_owner}/{template_repo}/generate" + ], + createWebhook: ["POST /repos/{owner}/{repo}/hooks"], + declineInvitation: [ + "DELETE /user/repository_invitations/{invitation_id}", + {}, + { renamed: ["repos", "declineInvitationForAuthenticatedUser"] } + ], + declineInvitationForAuthenticatedUser: [ + "DELETE /user/repository_invitations/{invitation_id}" + ], + delete: ["DELETE /repos/{owner}/{repo}"], + deleteAccessRestrictions: [ + "DELETE /repos/{owner}/{repo}/branches/{branch}/protection/restrictions" + ], + deleteAdminBranchProtection: [ + "DELETE /repos/{owner}/{repo}/branches/{branch}/protection/enforce_admins" + ], + deleteAnEnvironment: [ + "DELETE /repos/{owner}/{repo}/environments/{environment_name}" + ], + deleteAutolink: ["DELETE /repos/{owner}/{repo}/autolinks/{autolink_id}"], + deleteBranchProtection: [ + "DELETE /repos/{owner}/{repo}/branches/{branch}/protection" + ], + deleteCommitComment: ["DELETE /repos/{owner}/{repo}/comments/{comment_id}"], + deleteCommitSignatureProtection: [ + "DELETE /repos/{owner}/{repo}/branches/{branch}/protection/required_signatures" + ], + deleteDeployKey: ["DELETE /repos/{owner}/{repo}/keys/{key_id}"], + deleteDeployment: [ + "DELETE /repos/{owner}/{repo}/deployments/{deployment_id}" + ], + deleteDeploymentBranchPolicy: [ + "DELETE /repos/{owner}/{repo}/environments/{environment_name}/deployment-branch-policies/{branch_policy_id}" + ], + deleteFile: ["DELETE /repos/{owner}/{repo}/contents/{path}"], + deleteInvitation: [ + "DELETE /repos/{owner}/{repo}/invitations/{invitation_id}" + ], + deleteOrgRuleset: ["DELETE /orgs/{org}/rulesets/{ruleset_id}"], + deletePagesSite: ["DELETE /repos/{owner}/{repo}/pages"], + deletePullRequestReviewProtection: [ + "DELETE /repos/{owner}/{repo}/branches/{branch}/protection/required_pull_request_reviews" + ], + deleteRelease: ["DELETE /repos/{owner}/{repo}/releases/{release_id}"], + deleteReleaseAsset: [ + "DELETE /repos/{owner}/{repo}/releases/assets/{asset_id}" + ], + deleteRepoRuleset: ["DELETE /repos/{owner}/{repo}/rulesets/{ruleset_id}"], + deleteTagProtection: [ + "DELETE /repos/{owner}/{repo}/tags/protection/{tag_protection_id}" + ], + deleteWebhook: ["DELETE /repos/{owner}/{repo}/hooks/{hook_id}"], + disableAutomatedSecurityFixes: [ + "DELETE /repos/{owner}/{repo}/automated-security-fixes" + ], + disableDeploymentProtectionRule: [ + "DELETE /repos/{owner}/{repo}/environments/{environment_name}/deployment_protection_rules/{protection_rule_id}" + ], + disablePrivateVulnerabilityReporting: [ + "DELETE /repos/{owner}/{repo}/private-vulnerability-reporting" + ], + disableVulnerabilityAlerts: [ + "DELETE /repos/{owner}/{repo}/vulnerability-alerts" + ], + downloadArchive: [ + "GET /repos/{owner}/{repo}/zipball/{ref}", + {}, + { renamed: ["repos", "downloadZipballArchive"] } + ], + downloadTarballArchive: ["GET /repos/{owner}/{repo}/tarball/{ref}"], + downloadZipballArchive: ["GET /repos/{owner}/{repo}/zipball/{ref}"], + enableAutomatedSecurityFixes: [ + "PUT /repos/{owner}/{repo}/automated-security-fixes" + ], + enablePrivateVulnerabilityReporting: [ + "PUT /repos/{owner}/{repo}/private-vulnerability-reporting" + ], + enableVulnerabilityAlerts: [ + "PUT /repos/{owner}/{repo}/vulnerability-alerts" + ], + generateReleaseNotes: [ + "POST /repos/{owner}/{repo}/releases/generate-notes" + ], + get: ["GET /repos/{owner}/{repo}"], + getAccessRestrictions: [ + "GET /repos/{owner}/{repo}/branches/{branch}/protection/restrictions" + ], + getAdminBranchProtection: [ + "GET /repos/{owner}/{repo}/branches/{branch}/protection/enforce_admins" + ], + getAllDeploymentProtectionRules: [ + "GET /repos/{owner}/{repo}/environments/{environment_name}/deployment_protection_rules" + ], + getAllEnvironments: ["GET /repos/{owner}/{repo}/environments"], + getAllStatusCheckContexts: [ + "GET /repos/{owner}/{repo}/branches/{branch}/protection/required_status_checks/contexts" + ], + getAllTopics: ["GET /repos/{owner}/{repo}/topics"], + getAppsWithAccessToProtectedBranch: [ + "GET /repos/{owner}/{repo}/branches/{branch}/protection/restrictions/apps" + ], + getAutolink: ["GET /repos/{owner}/{repo}/autolinks/{autolink_id}"], + getBranch: ["GET /repos/{owner}/{repo}/branches/{branch}"], + getBranchProtection: [ + "GET /repos/{owner}/{repo}/branches/{branch}/protection" + ], + getBranchRules: ["GET /repos/{owner}/{repo}/rules/branches/{branch}"], + getClones: ["GET /repos/{owner}/{repo}/traffic/clones"], + getCodeFrequencyStats: ["GET /repos/{owner}/{repo}/stats/code_frequency"], + getCollaboratorPermissionLevel: [ + "GET /repos/{owner}/{repo}/collaborators/{username}/permission" + ], + getCombinedStatusForRef: ["GET /repos/{owner}/{repo}/commits/{ref}/status"], + getCommit: ["GET /repos/{owner}/{repo}/commits/{ref}"], + getCommitActivityStats: ["GET /repos/{owner}/{repo}/stats/commit_activity"], + getCommitComment: ["GET /repos/{owner}/{repo}/comments/{comment_id}"], + getCommitSignatureProtection: [ + "GET /repos/{owner}/{repo}/branches/{branch}/protection/required_signatures" + ], + getCommunityProfileMetrics: ["GET /repos/{owner}/{repo}/community/profile"], + getContent: ["GET /repos/{owner}/{repo}/contents/{path}"], + getContributorsStats: ["GET /repos/{owner}/{repo}/stats/contributors"], + getCustomDeploymentProtectionRule: [ + "GET /repos/{owner}/{repo}/environments/{environment_name}/deployment_protection_rules/{protection_rule_id}" + ], + getCustomPropertiesValues: ["GET /repos/{owner}/{repo}/properties/values"], + getDeployKey: ["GET /repos/{owner}/{repo}/keys/{key_id}"], + getDeployment: ["GET /repos/{owner}/{repo}/deployments/{deployment_id}"], + getDeploymentBranchPolicy: [ + "GET /repos/{owner}/{repo}/environments/{environment_name}/deployment-branch-policies/{branch_policy_id}" + ], + getDeploymentStatus: [ + "GET /repos/{owner}/{repo}/deployments/{deployment_id}/statuses/{status_id}" + ], + getEnvironment: [ + "GET /repos/{owner}/{repo}/environments/{environment_name}" + ], + getLatestPagesBuild: ["GET /repos/{owner}/{repo}/pages/builds/latest"], + getLatestRelease: ["GET /repos/{owner}/{repo}/releases/latest"], + getOrgRuleSuite: ["GET /orgs/{org}/rulesets/rule-suites/{rule_suite_id}"], + getOrgRuleSuites: ["GET /orgs/{org}/rulesets/rule-suites"], + getOrgRuleset: ["GET /orgs/{org}/rulesets/{ruleset_id}"], + getOrgRulesets: ["GET /orgs/{org}/rulesets"], + getPages: ["GET /repos/{owner}/{repo}/pages"], + getPagesBuild: ["GET /repos/{owner}/{repo}/pages/builds/{build_id}"], + getPagesDeployment: [ + "GET /repos/{owner}/{repo}/pages/deployments/{pages_deployment_id}" + ], + getPagesHealthCheck: ["GET /repos/{owner}/{repo}/pages/health"], + getParticipationStats: ["GET /repos/{owner}/{repo}/stats/participation"], + getPullRequestReviewProtection: [ + "GET /repos/{owner}/{repo}/branches/{branch}/protection/required_pull_request_reviews" + ], + getPunchCardStats: ["GET /repos/{owner}/{repo}/stats/punch_card"], + getReadme: ["GET /repos/{owner}/{repo}/readme"], + getReadmeInDirectory: ["GET /repos/{owner}/{repo}/readme/{dir}"], + getRelease: ["GET /repos/{owner}/{repo}/releases/{release_id}"], + getReleaseAsset: ["GET /repos/{owner}/{repo}/releases/assets/{asset_id}"], + getReleaseByTag: ["GET /repos/{owner}/{repo}/releases/tags/{tag}"], + getRepoRuleSuite: [ + "GET /repos/{owner}/{repo}/rulesets/rule-suites/{rule_suite_id}" + ], + getRepoRuleSuites: ["GET /repos/{owner}/{repo}/rulesets/rule-suites"], + getRepoRuleset: ["GET /repos/{owner}/{repo}/rulesets/{ruleset_id}"], + getRepoRulesets: ["GET /repos/{owner}/{repo}/rulesets"], + getStatusChecksProtection: [ + "GET /repos/{owner}/{repo}/branches/{branch}/protection/required_status_checks" + ], + getTeamsWithAccessToProtectedBranch: [ + "GET /repos/{owner}/{repo}/branches/{branch}/protection/restrictions/teams" + ], + getTopPaths: ["GET /repos/{owner}/{repo}/traffic/popular/paths"], + getTopReferrers: ["GET /repos/{owner}/{repo}/traffic/popular/referrers"], + getUsersWithAccessToProtectedBranch: [ + "GET /repos/{owner}/{repo}/branches/{branch}/protection/restrictions/users" + ], + getViews: ["GET /repos/{owner}/{repo}/traffic/views"], + getWebhook: ["GET /repos/{owner}/{repo}/hooks/{hook_id}"], + getWebhookConfigForRepo: [ + "GET /repos/{owner}/{repo}/hooks/{hook_id}/config" + ], + getWebhookDelivery: [ + "GET /repos/{owner}/{repo}/hooks/{hook_id}/deliveries/{delivery_id}" + ], + listActivities: ["GET /repos/{owner}/{repo}/activity"], + listAutolinks: ["GET /repos/{owner}/{repo}/autolinks"], + listBranches: ["GET /repos/{owner}/{repo}/branches"], + listBranchesForHeadCommit: [ + "GET /repos/{owner}/{repo}/commits/{commit_sha}/branches-where-head" + ], + listCollaborators: ["GET /repos/{owner}/{repo}/collaborators"], + listCommentsForCommit: [ + "GET /repos/{owner}/{repo}/commits/{commit_sha}/comments" + ], + listCommitCommentsForRepo: ["GET /repos/{owner}/{repo}/comments"], + listCommitStatusesForRef: [ + "GET /repos/{owner}/{repo}/commits/{ref}/statuses" + ], + listCommits: ["GET /repos/{owner}/{repo}/commits"], + listContributors: ["GET /repos/{owner}/{repo}/contributors"], + listCustomDeploymentRuleIntegrations: [ + "GET /repos/{owner}/{repo}/environments/{environment_name}/deployment_protection_rules/apps" + ], + listDeployKeys: ["GET /repos/{owner}/{repo}/keys"], + listDeploymentBranchPolicies: [ + "GET /repos/{owner}/{repo}/environments/{environment_name}/deployment-branch-policies" + ], + listDeploymentStatuses: [ + "GET /repos/{owner}/{repo}/deployments/{deployment_id}/statuses" + ], + listDeployments: ["GET /repos/{owner}/{repo}/deployments"], + listForAuthenticatedUser: ["GET /user/repos"], + listForOrg: ["GET /orgs/{org}/repos"], + listForUser: ["GET /users/{username}/repos"], + listForks: ["GET /repos/{owner}/{repo}/forks"], + listInvitations: ["GET /repos/{owner}/{repo}/invitations"], + listInvitationsForAuthenticatedUser: ["GET /user/repository_invitations"], + listLanguages: ["GET /repos/{owner}/{repo}/languages"], + listPagesBuilds: ["GET /repos/{owner}/{repo}/pages/builds"], + listPublic: ["GET /repositories"], + listPullRequestsAssociatedWithCommit: [ + "GET /repos/{owner}/{repo}/commits/{commit_sha}/pulls" + ], + listReleaseAssets: [ + "GET /repos/{owner}/{repo}/releases/{release_id}/assets" + ], + listReleases: ["GET /repos/{owner}/{repo}/releases"], + listTagProtection: ["GET /repos/{owner}/{repo}/tags/protection"], + listTags: ["GET /repos/{owner}/{repo}/tags"], + listTeams: ["GET /repos/{owner}/{repo}/teams"], + listWebhookDeliveries: [ + "GET /repos/{owner}/{repo}/hooks/{hook_id}/deliveries" + ], + listWebhooks: ["GET /repos/{owner}/{repo}/hooks"], + merge: ["POST /repos/{owner}/{repo}/merges"], + mergeUpstream: ["POST /repos/{owner}/{repo}/merge-upstream"], + pingWebhook: ["POST /repos/{owner}/{repo}/hooks/{hook_id}/pings"], + redeliverWebhookDelivery: [ + "POST /repos/{owner}/{repo}/hooks/{hook_id}/deliveries/{delivery_id}/attempts" + ], + removeAppAccessRestrictions: [ + "DELETE /repos/{owner}/{repo}/branches/{branch}/protection/restrictions/apps", + {}, + { mapToData: "apps" } + ], + removeCollaborator: [ + "DELETE /repos/{owner}/{repo}/collaborators/{username}" + ], + removeStatusCheckContexts: [ + "DELETE /repos/{owner}/{repo}/branches/{branch}/protection/required_status_checks/contexts", + {}, + { mapToData: "contexts" } + ], + removeStatusCheckProtection: [ + "DELETE /repos/{owner}/{repo}/branches/{branch}/protection/required_status_checks" + ], + removeTeamAccessRestrictions: [ + "DELETE /repos/{owner}/{repo}/branches/{branch}/protection/restrictions/teams", + {}, + { mapToData: "teams" } + ], + removeUserAccessRestrictions: [ + "DELETE /repos/{owner}/{repo}/branches/{branch}/protection/restrictions/users", + {}, + { mapToData: "users" } + ], + renameBranch: ["POST /repos/{owner}/{repo}/branches/{branch}/rename"], + replaceAllTopics: ["PUT /repos/{owner}/{repo}/topics"], + requestPagesBuild: ["POST /repos/{owner}/{repo}/pages/builds"], + setAdminBranchProtection: [ + "POST /repos/{owner}/{repo}/branches/{branch}/protection/enforce_admins" + ], + setAppAccessRestrictions: [ + "PUT /repos/{owner}/{repo}/branches/{branch}/protection/restrictions/apps", + {}, + { mapToData: "apps" } + ], + setStatusCheckContexts: [ + "PUT /repos/{owner}/{repo}/branches/{branch}/protection/required_status_checks/contexts", + {}, + { mapToData: "contexts" } + ], + setTeamAccessRestrictions: [ + "PUT /repos/{owner}/{repo}/branches/{branch}/protection/restrictions/teams", + {}, + { mapToData: "teams" } + ], + setUserAccessRestrictions: [ + "PUT /repos/{owner}/{repo}/branches/{branch}/protection/restrictions/users", + {}, + { mapToData: "users" } + ], + testPushWebhook: ["POST /repos/{owner}/{repo}/hooks/{hook_id}/tests"], + transfer: ["POST /repos/{owner}/{repo}/transfer"], + update: ["PATCH /repos/{owner}/{repo}"], + updateBranchProtection: [ + "PUT /repos/{owner}/{repo}/branches/{branch}/protection" + ], + updateCommitComment: ["PATCH /repos/{owner}/{repo}/comments/{comment_id}"], + updateDeploymentBranchPolicy: [ + "PUT /repos/{owner}/{repo}/environments/{environment_name}/deployment-branch-policies/{branch_policy_id}" + ], + updateInformationAboutPagesSite: ["PUT /repos/{owner}/{repo}/pages"], + updateInvitation: [ + "PATCH /repos/{owner}/{repo}/invitations/{invitation_id}" + ], + updateOrgRuleset: ["PUT /orgs/{org}/rulesets/{ruleset_id}"], + updatePullRequestReviewProtection: [ + "PATCH /repos/{owner}/{repo}/branches/{branch}/protection/required_pull_request_reviews" + ], + updateRelease: ["PATCH /repos/{owner}/{repo}/releases/{release_id}"], + updateReleaseAsset: [ + "PATCH /repos/{owner}/{repo}/releases/assets/{asset_id}" + ], + updateRepoRuleset: ["PUT /repos/{owner}/{repo}/rulesets/{ruleset_id}"], + updateStatusCheckPotection: [ + "PATCH /repos/{owner}/{repo}/branches/{branch}/protection/required_status_checks", + {}, + { renamed: ["repos", "updateStatusCheckProtection"] } + ], + updateStatusCheckProtection: [ + "PATCH /repos/{owner}/{repo}/branches/{branch}/protection/required_status_checks" + ], + updateWebhook: ["PATCH /repos/{owner}/{repo}/hooks/{hook_id}"], + updateWebhookConfigForRepo: [ + "PATCH /repos/{owner}/{repo}/hooks/{hook_id}/config" + ], + uploadReleaseAsset: [ + "POST /repos/{owner}/{repo}/releases/{release_id}/assets{?name,label}", + { baseUrl: "https://uploads.github.com" } + ] + }, + search: { + code: ["GET /search/code"], + commits: ["GET /search/commits"], + issuesAndPullRequests: ["GET /search/issues"], + labels: ["GET /search/labels"], + repos: ["GET /search/repositories"], + topics: ["GET /search/topics"], + users: ["GET /search/users"] + }, + secretScanning: { + getAlert: [ + "GET /repos/{owner}/{repo}/secret-scanning/alerts/{alert_number}" + ], + listAlertsForEnterprise: [ + "GET /enterprises/{enterprise}/secret-scanning/alerts" + ], + listAlertsForOrg: ["GET /orgs/{org}/secret-scanning/alerts"], + listAlertsForRepo: ["GET /repos/{owner}/{repo}/secret-scanning/alerts"], + listLocationsForAlert: [ + "GET /repos/{owner}/{repo}/secret-scanning/alerts/{alert_number}/locations" + ], + updateAlert: [ + "PATCH /repos/{owner}/{repo}/secret-scanning/alerts/{alert_number}" + ] + }, + securityAdvisories: { + createFork: [ + "POST /repos/{owner}/{repo}/security-advisories/{ghsa_id}/forks" + ], + createPrivateVulnerabilityReport: [ + "POST /repos/{owner}/{repo}/security-advisories/reports" + ], + createRepositoryAdvisory: [ + "POST /repos/{owner}/{repo}/security-advisories" + ], + createRepositoryAdvisoryCveRequest: [ + "POST /repos/{owner}/{repo}/security-advisories/{ghsa_id}/cve" + ], + getGlobalAdvisory: ["GET /advisories/{ghsa_id}"], + getRepositoryAdvisory: [ + "GET /repos/{owner}/{repo}/security-advisories/{ghsa_id}" + ], + listGlobalAdvisories: ["GET /advisories"], + listOrgRepositoryAdvisories: ["GET /orgs/{org}/security-advisories"], + listRepositoryAdvisories: ["GET /repos/{owner}/{repo}/security-advisories"], + updateRepositoryAdvisory: [ + "PATCH /repos/{owner}/{repo}/security-advisories/{ghsa_id}" + ] + }, + teams: { + addOrUpdateMembershipForUserInOrg: [ + "PUT /orgs/{org}/teams/{team_slug}/memberships/{username}" + ], + addOrUpdateProjectPermissionsInOrg: [ + "PUT /orgs/{org}/teams/{team_slug}/projects/{project_id}" + ], + addOrUpdateRepoPermissionsInOrg: [ + "PUT /orgs/{org}/teams/{team_slug}/repos/{owner}/{repo}" + ], + checkPermissionsForProjectInOrg: [ + "GET /orgs/{org}/teams/{team_slug}/projects/{project_id}" + ], + checkPermissionsForRepoInOrg: [ + "GET /orgs/{org}/teams/{team_slug}/repos/{owner}/{repo}" + ], + create: ["POST /orgs/{org}/teams"], + createDiscussionCommentInOrg: [ + "POST /orgs/{org}/teams/{team_slug}/discussions/{discussion_number}/comments" + ], + createDiscussionInOrg: ["POST /orgs/{org}/teams/{team_slug}/discussions"], + deleteDiscussionCommentInOrg: [ + "DELETE /orgs/{org}/teams/{team_slug}/discussions/{discussion_number}/comments/{comment_number}" + ], + deleteDiscussionInOrg: [ + "DELETE /orgs/{org}/teams/{team_slug}/discussions/{discussion_number}" + ], + deleteInOrg: ["DELETE /orgs/{org}/teams/{team_slug}"], + getByName: ["GET /orgs/{org}/teams/{team_slug}"], + getDiscussionCommentInOrg: [ + "GET /orgs/{org}/teams/{team_slug}/discussions/{discussion_number}/comments/{comment_number}" + ], + getDiscussionInOrg: [ + "GET /orgs/{org}/teams/{team_slug}/discussions/{discussion_number}" + ], + getMembershipForUserInOrg: [ + "GET /orgs/{org}/teams/{team_slug}/memberships/{username}" + ], + list: ["GET /orgs/{org}/teams"], + listChildInOrg: ["GET /orgs/{org}/teams/{team_slug}/teams"], + listDiscussionCommentsInOrg: [ + "GET /orgs/{org}/teams/{team_slug}/discussions/{discussion_number}/comments" + ], + listDiscussionsInOrg: ["GET /orgs/{org}/teams/{team_slug}/discussions"], + listForAuthenticatedUser: ["GET /user/teams"], + listMembersInOrg: ["GET /orgs/{org}/teams/{team_slug}/members"], + listPendingInvitationsInOrg: [ + "GET /orgs/{org}/teams/{team_slug}/invitations" + ], + listProjectsInOrg: ["GET /orgs/{org}/teams/{team_slug}/projects"], + listReposInOrg: ["GET /orgs/{org}/teams/{team_slug}/repos"], + removeMembershipForUserInOrg: [ + "DELETE /orgs/{org}/teams/{team_slug}/memberships/{username}" + ], + removeProjectInOrg: [ + "DELETE /orgs/{org}/teams/{team_slug}/projects/{project_id}" + ], + removeRepoInOrg: [ + "DELETE /orgs/{org}/teams/{team_slug}/repos/{owner}/{repo}" + ], + updateDiscussionCommentInOrg: [ + "PATCH /orgs/{org}/teams/{team_slug}/discussions/{discussion_number}/comments/{comment_number}" + ], + updateDiscussionInOrg: [ + "PATCH /orgs/{org}/teams/{team_slug}/discussions/{discussion_number}" + ], + updateInOrg: ["PATCH /orgs/{org}/teams/{team_slug}"] + }, + users: { + addEmailForAuthenticated: [ + "POST /user/emails", + {}, + { renamed: ["users", "addEmailForAuthenticatedUser"] } + ], + addEmailForAuthenticatedUser: ["POST /user/emails"], + addSocialAccountForAuthenticatedUser: ["POST /user/social_accounts"], + block: ["PUT /user/blocks/{username}"], + checkBlocked: ["GET /user/blocks/{username}"], + checkFollowingForUser: ["GET /users/{username}/following/{target_user}"], + checkPersonIsFollowedByAuthenticated: ["GET /user/following/{username}"], + createGpgKeyForAuthenticated: [ + "POST /user/gpg_keys", + {}, + { renamed: ["users", "createGpgKeyForAuthenticatedUser"] } + ], + createGpgKeyForAuthenticatedUser: ["POST /user/gpg_keys"], + createPublicSshKeyForAuthenticated: [ + "POST /user/keys", + {}, + { renamed: ["users", "createPublicSshKeyForAuthenticatedUser"] } + ], + createPublicSshKeyForAuthenticatedUser: ["POST /user/keys"], + createSshSigningKeyForAuthenticatedUser: ["POST /user/ssh_signing_keys"], + deleteEmailForAuthenticated: [ + "DELETE /user/emails", + {}, + { renamed: ["users", "deleteEmailForAuthenticatedUser"] } + ], + deleteEmailForAuthenticatedUser: ["DELETE /user/emails"], + deleteGpgKeyForAuthenticated: [ + "DELETE /user/gpg_keys/{gpg_key_id}", + {}, + { renamed: ["users", "deleteGpgKeyForAuthenticatedUser"] } + ], + deleteGpgKeyForAuthenticatedUser: ["DELETE /user/gpg_keys/{gpg_key_id}"], + deletePublicSshKeyForAuthenticated: [ + "DELETE /user/keys/{key_id}", + {}, + { renamed: ["users", "deletePublicSshKeyForAuthenticatedUser"] } + ], + deletePublicSshKeyForAuthenticatedUser: ["DELETE /user/keys/{key_id}"], + deleteSocialAccountForAuthenticatedUser: ["DELETE /user/social_accounts"], + deleteSshSigningKeyForAuthenticatedUser: [ + "DELETE /user/ssh_signing_keys/{ssh_signing_key_id}" + ], + follow: ["PUT /user/following/{username}"], + getAuthenticated: ["GET /user"], + getByUsername: ["GET /users/{username}"], + getContextForUser: ["GET /users/{username}/hovercard"], + getGpgKeyForAuthenticated: [ + "GET /user/gpg_keys/{gpg_key_id}", + {}, + { renamed: ["users", "getGpgKeyForAuthenticatedUser"] } + ], + getGpgKeyForAuthenticatedUser: ["GET /user/gpg_keys/{gpg_key_id}"], + getPublicSshKeyForAuthenticated: [ + "GET /user/keys/{key_id}", + {}, + { renamed: ["users", "getPublicSshKeyForAuthenticatedUser"] } + ], + getPublicSshKeyForAuthenticatedUser: ["GET /user/keys/{key_id}"], + getSshSigningKeyForAuthenticatedUser: [ + "GET /user/ssh_signing_keys/{ssh_signing_key_id}" + ], + list: ["GET /users"], + listBlockedByAuthenticated: [ + "GET /user/blocks", + {}, + { renamed: ["users", "listBlockedByAuthenticatedUser"] } + ], + listBlockedByAuthenticatedUser: ["GET /user/blocks"], + listEmailsForAuthenticated: [ + "GET /user/emails", + {}, + { renamed: ["users", "listEmailsForAuthenticatedUser"] } + ], + listEmailsForAuthenticatedUser: ["GET /user/emails"], + listFollowedByAuthenticated: [ + "GET /user/following", + {}, + { renamed: ["users", "listFollowedByAuthenticatedUser"] } + ], + listFollowedByAuthenticatedUser: ["GET /user/following"], + listFollowersForAuthenticatedUser: ["GET /user/followers"], + listFollowersForUser: ["GET /users/{username}/followers"], + listFollowingForUser: ["GET /users/{username}/following"], + listGpgKeysForAuthenticated: [ + "GET /user/gpg_keys", + {}, + { renamed: ["users", "listGpgKeysForAuthenticatedUser"] } + ], + listGpgKeysForAuthenticatedUser: ["GET /user/gpg_keys"], + listGpgKeysForUser: ["GET /users/{username}/gpg_keys"], + listPublicEmailsForAuthenticated: [ + "GET /user/public_emails", + {}, + { renamed: ["users", "listPublicEmailsForAuthenticatedUser"] } + ], + listPublicEmailsForAuthenticatedUser: ["GET /user/public_emails"], + listPublicKeysForUser: ["GET /users/{username}/keys"], + listPublicSshKeysForAuthenticated: [ + "GET /user/keys", + {}, + { renamed: ["users", "listPublicSshKeysForAuthenticatedUser"] } + ], + listPublicSshKeysForAuthenticatedUser: ["GET /user/keys"], + listSocialAccountsForAuthenticatedUser: ["GET /user/social_accounts"], + listSocialAccountsForUser: ["GET /users/{username}/social_accounts"], + listSshSigningKeysForAuthenticatedUser: ["GET /user/ssh_signing_keys"], + listSshSigningKeysForUser: ["GET /users/{username}/ssh_signing_keys"], + setPrimaryEmailVisibilityForAuthenticated: [ + "PATCH /user/email/visibility", + {}, + { renamed: ["users", "setPrimaryEmailVisibilityForAuthenticatedUser"] } + ], + setPrimaryEmailVisibilityForAuthenticatedUser: [ + "PATCH /user/email/visibility" + ], + unblock: ["DELETE /user/blocks/{username}"], + unfollow: ["DELETE /user/following/{username}"], + updateAuthenticated: ["PATCH /user"] + } + }; + var endpoints_default = Endpoints; + var endpointMethodsMap = /* @__PURE__ */ new Map; + for (const [scope, endpoints] of Object.entries(endpoints_default)) { + for (const [methodName, endpoint] of Object.entries(endpoints)) { + const [route, defaults, decorations] = endpoint; + const [method, url] = route.split(/ /); + const endpointDefaults = Object.assign({ + method, + url + }, defaults); + if (!endpointMethodsMap.has(scope)) { + endpointMethodsMap.set(scope, /* @__PURE__ */ new Map); + } + endpointMethodsMap.get(scope).set(methodName, { + scope, + methodName, + endpointDefaults, + decorations + }); + } + } + var handler = { + has({ scope }, methodName) { + return endpointMethodsMap.get(scope).has(methodName); + }, + getOwnPropertyDescriptor(target, methodName) { + return { + value: this.get(target, methodName), + configurable: true, + writable: true, + enumerable: true + }; + }, + defineProperty(target, methodName, descriptor) { + Object.defineProperty(target.cache, methodName, descriptor); + return true; + }, + deleteProperty(target, methodName) { + delete target.cache[methodName]; + return true; + }, + ownKeys({ scope }) { + return [...endpointMethodsMap.get(scope).keys()]; + }, + set(target, methodName, value) { + return target.cache[methodName] = value; + }, + get({ octokit, scope, cache }, methodName) { + if (cache[methodName]) { + return cache[methodName]; + } + const method = endpointMethodsMap.get(scope).get(methodName); + if (!method) { + return; + } + const { endpointDefaults, decorations } = method; + if (decorations) { + cache[methodName] = decorate(octokit, scope, methodName, endpointDefaults, decorations); + } else { + cache[methodName] = octokit.request.defaults(endpointDefaults); + } + return cache[methodName]; + } + }; + function endpointsToMethods(octokit) { + const newMethods = {}; + for (const scope of endpointMethodsMap.keys()) { + newMethods[scope] = new Proxy({ octokit, scope, cache: {} }, handler); + } + return newMethods; + } + function decorate(octokit, scope, methodName, defaults, decorations) { + const requestWithDefaults = octokit.request.defaults(defaults); + function withDecorations(...args) { + let options = requestWithDefaults.endpoint.merge(...args); + if (decorations.mapToData) { + options = Object.assign({}, options, { + data: options[decorations.mapToData], + [decorations.mapToData]: undefined + }); + return requestWithDefaults(options); + } + if (decorations.renamed) { + const [newScope, newMethodName] = decorations.renamed; + octokit.log.warn(`octokit.${scope}.${methodName}() has been renamed to octokit.${newScope}.${newMethodName}()`); + } + if (decorations.deprecated) { + octokit.log.warn(decorations.deprecated); + } + if (decorations.renamedParameters) { + const options2 = requestWithDefaults.endpoint.merge(...args); + for (const [name, alias] of Object.entries(decorations.renamedParameters)) { + if (name in options2) { + octokit.log.warn(`"${name}" parameter is deprecated for "octokit.${scope}.${methodName}()". Use "${alias}" instead`); + if (!(alias in options2)) { + options2[alias] = options2[name]; + } + delete options2[name]; + } + } + return requestWithDefaults(options2); + } + return requestWithDefaults(...args); + } + return Object.assign(withDecorations, requestWithDefaults); + } + function restEndpointMethods(octokit) { + const api = endpointsToMethods(octokit); + return { + rest: api + }; + } + restEndpointMethods.VERSION = VERSION; + function legacyRestEndpointMethods(octokit) { + const api = endpointsToMethods(octokit); + return { + ...api, + rest: api + }; + } + legacyRestEndpointMethods.VERSION = VERSION; +}); + +// node_modules/@octokit/plugin-paginate-rest/dist-node/index.js +var require_dist_node10 = __commonJS((exports2, module2) => { + var __defProp2 = Object.defineProperty; + var __getOwnPropDesc = Object.getOwnPropertyDescriptor; + var __getOwnPropNames2 = Object.getOwnPropertyNames; + var __hasOwnProp2 = Object.prototype.hasOwnProperty; + var __export = (target, all) => { + for (var name in all) + __defProp2(target, name, { get: all[name], enumerable: true }); + }; + var __copyProps = (to, from, except, desc) => { + if (from && typeof from === "object" || typeof from === "function") { + for (let key of __getOwnPropNames2(from)) + if (!__hasOwnProp2.call(to, key) && key !== except) + __defProp2(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable }); + } + return to; + }; + var __toCommonJS = (mod) => __copyProps(__defProp2({}, "__esModule", { value: true }), mod); + var dist_src_exports = {}; + __export(dist_src_exports, { + composePaginateRest: () => composePaginateRest, + isPaginatingEndpoint: () => isPaginatingEndpoint, + paginateRest: () => paginateRest, + paginatingEndpoints: () => paginatingEndpoints + }); + module2.exports = __toCommonJS(dist_src_exports); + var VERSION = "9.2.1"; + function normalizePaginatedListResponse(response) { + if (!response.data) { + return { + ...response, + data: [] + }; + } + const responseNeedsNormalization = "total_count" in response.data && !("url" in response.data); + if (!responseNeedsNormalization) + return response; + const incompleteResults = response.data.incomplete_results; + const repositorySelection = response.data.repository_selection; + const totalCount = response.data.total_count; + delete response.data.incomplete_results; + delete response.data.repository_selection; + delete response.data.total_count; + const namespaceKey = Object.keys(response.data)[0]; + const data = response.data[namespaceKey]; + response.data = data; + if (typeof incompleteResults !== "undefined") { + response.data.incomplete_results = incompleteResults; + } + if (typeof repositorySelection !== "undefined") { + response.data.repository_selection = repositorySelection; + } + response.data.total_count = totalCount; + return response; + } + function iterator(octokit, route, parameters) { + const options = typeof route === "function" ? route.endpoint(parameters) : octokit.request.endpoint(route, parameters); + const requestMethod = typeof route === "function" ? route : octokit.request; + const method = options.method; + const headers = options.headers; + let url = options.url; + return { + [Symbol.asyncIterator]: () => ({ + async next() { + if (!url) + return { done: true }; + try { + const response = await requestMethod({ method, url, headers }); + const normalizedResponse = normalizePaginatedListResponse(response); + url = ((normalizedResponse.headers.link || "").match(/<([^>]+)>;\s*rel="next"/) || [])[1]; + return { value: normalizedResponse }; + } catch (error) { + if (error.status !== 409) + throw error; + url = ""; + return { + value: { + status: 200, + headers: {}, + data: [] + } + }; + } + } + }) + }; + } + function paginate(octokit, route, parameters, mapFn) { + if (typeof parameters === "function") { + mapFn = parameters; + parameters = undefined; + } + return gather(octokit, [], iterator(octokit, route, parameters)[Symbol.asyncIterator](), mapFn); + } + function gather(octokit, results, iterator2, mapFn) { + return iterator2.next().then((result) => { + if (result.done) { + return results; + } + let earlyExit = false; + function done() { + earlyExit = true; + } + results = results.concat(mapFn ? mapFn(result.value, done) : result.value.data); + if (earlyExit) { + return results; + } + return gather(octokit, results, iterator2, mapFn); + }); + } + var composePaginateRest = Object.assign(paginate, { + iterator + }); + var paginatingEndpoints = [ + "GET /advisories", + "GET /app/hook/deliveries", + "GET /app/installation-requests", + "GET /app/installations", + "GET /assignments/{assignment_id}/accepted_assignments", + "GET /classrooms", + "GET /classrooms/{classroom_id}/assignments", + "GET /enterprises/{enterprise}/dependabot/alerts", + "GET /enterprises/{enterprise}/secret-scanning/alerts", + "GET /events", + "GET /gists", + "GET /gists/public", + "GET /gists/starred", + "GET /gists/{gist_id}/comments", + "GET /gists/{gist_id}/commits", + "GET /gists/{gist_id}/forks", + "GET /installation/repositories", + "GET /issues", + "GET /licenses", + "GET /marketplace_listing/plans", + "GET /marketplace_listing/plans/{plan_id}/accounts", + "GET /marketplace_listing/stubbed/plans", + "GET /marketplace_listing/stubbed/plans/{plan_id}/accounts", + "GET /networks/{owner}/{repo}/events", + "GET /notifications", + "GET /organizations", + "GET /orgs/{org}/actions/cache/usage-by-repository", + "GET /orgs/{org}/actions/permissions/repositories", + "GET /orgs/{org}/actions/runners", + "GET /orgs/{org}/actions/secrets", + "GET /orgs/{org}/actions/secrets/{secret_name}/repositories", + "GET /orgs/{org}/actions/variables", + "GET /orgs/{org}/actions/variables/{name}/repositories", + "GET /orgs/{org}/blocks", + "GET /orgs/{org}/code-scanning/alerts", + "GET /orgs/{org}/codespaces", + "GET /orgs/{org}/codespaces/secrets", + "GET /orgs/{org}/codespaces/secrets/{secret_name}/repositories", + "GET /orgs/{org}/copilot/billing/seats", + "GET /orgs/{org}/dependabot/alerts", + "GET /orgs/{org}/dependabot/secrets", + "GET /orgs/{org}/dependabot/secrets/{secret_name}/repositories", + "GET /orgs/{org}/events", + "GET /orgs/{org}/failed_invitations", + "GET /orgs/{org}/hooks", + "GET /orgs/{org}/hooks/{hook_id}/deliveries", + "GET /orgs/{org}/installations", + "GET /orgs/{org}/invitations", + "GET /orgs/{org}/invitations/{invitation_id}/teams", + "GET /orgs/{org}/issues", + "GET /orgs/{org}/members", + "GET /orgs/{org}/members/{username}/codespaces", + "GET /orgs/{org}/migrations", + "GET /orgs/{org}/migrations/{migration_id}/repositories", + "GET /orgs/{org}/organization-roles/{role_id}/teams", + "GET /orgs/{org}/organization-roles/{role_id}/users", + "GET /orgs/{org}/outside_collaborators", + "GET /orgs/{org}/packages", + "GET /orgs/{org}/packages/{package_type}/{package_name}/versions", + "GET /orgs/{org}/personal-access-token-requests", + "GET /orgs/{org}/personal-access-token-requests/{pat_request_id}/repositories", + "GET /orgs/{org}/personal-access-tokens", + "GET /orgs/{org}/personal-access-tokens/{pat_id}/repositories", + "GET /orgs/{org}/projects", + "GET /orgs/{org}/properties/values", + "GET /orgs/{org}/public_members", + "GET /orgs/{org}/repos", + "GET /orgs/{org}/rulesets", + "GET /orgs/{org}/rulesets/rule-suites", + "GET /orgs/{org}/secret-scanning/alerts", + "GET /orgs/{org}/security-advisories", + "GET /orgs/{org}/teams", + "GET /orgs/{org}/teams/{team_slug}/discussions", + "GET /orgs/{org}/teams/{team_slug}/discussions/{discussion_number}/comments", + "GET /orgs/{org}/teams/{team_slug}/discussions/{discussion_number}/comments/{comment_number}/reactions", + "GET /orgs/{org}/teams/{team_slug}/discussions/{discussion_number}/reactions", + "GET /orgs/{org}/teams/{team_slug}/invitations", + "GET /orgs/{org}/teams/{team_slug}/members", + "GET /orgs/{org}/teams/{team_slug}/projects", + "GET /orgs/{org}/teams/{team_slug}/repos", + "GET /orgs/{org}/teams/{team_slug}/teams", + "GET /projects/columns/{column_id}/cards", + "GET /projects/{project_id}/collaborators", + "GET /projects/{project_id}/columns", + "GET /repos/{owner}/{repo}/actions/artifacts", + "GET /repos/{owner}/{repo}/actions/caches", + "GET /repos/{owner}/{repo}/actions/organization-secrets", + "GET /repos/{owner}/{repo}/actions/organization-variables", + "GET /repos/{owner}/{repo}/actions/runners", + "GET /repos/{owner}/{repo}/actions/runs", + "GET /repos/{owner}/{repo}/actions/runs/{run_id}/artifacts", + "GET /repos/{owner}/{repo}/actions/runs/{run_id}/attempts/{attempt_number}/jobs", + "GET /repos/{owner}/{repo}/actions/runs/{run_id}/jobs", + "GET /repos/{owner}/{repo}/actions/secrets", + "GET /repos/{owner}/{repo}/actions/variables", + "GET /repos/{owner}/{repo}/actions/workflows", + "GET /repos/{owner}/{repo}/actions/workflows/{workflow_id}/runs", + "GET /repos/{owner}/{repo}/activity", + "GET /repos/{owner}/{repo}/assignees", + "GET /repos/{owner}/{repo}/branches", + "GET /repos/{owner}/{repo}/check-runs/{check_run_id}/annotations", + "GET /repos/{owner}/{repo}/check-suites/{check_suite_id}/check-runs", + "GET /repos/{owner}/{repo}/code-scanning/alerts", + "GET /repos/{owner}/{repo}/code-scanning/alerts/{alert_number}/instances", + "GET /repos/{owner}/{repo}/code-scanning/analyses", + "GET /repos/{owner}/{repo}/codespaces", + "GET /repos/{owner}/{repo}/codespaces/devcontainers", + "GET /repos/{owner}/{repo}/codespaces/secrets", + "GET /repos/{owner}/{repo}/collaborators", + "GET /repos/{owner}/{repo}/comments", + "GET /repos/{owner}/{repo}/comments/{comment_id}/reactions", + "GET /repos/{owner}/{repo}/commits", + "GET /repos/{owner}/{repo}/commits/{commit_sha}/comments", + "GET /repos/{owner}/{repo}/commits/{commit_sha}/pulls", + "GET /repos/{owner}/{repo}/commits/{ref}/check-runs", + "GET /repos/{owner}/{repo}/commits/{ref}/check-suites", + "GET /repos/{owner}/{repo}/commits/{ref}/status", + "GET /repos/{owner}/{repo}/commits/{ref}/statuses", + "GET /repos/{owner}/{repo}/contributors", + "GET /repos/{owner}/{repo}/dependabot/alerts", + "GET /repos/{owner}/{repo}/dependabot/secrets", + "GET /repos/{owner}/{repo}/deployments", + "GET /repos/{owner}/{repo}/deployments/{deployment_id}/statuses", + "GET /repos/{owner}/{repo}/environments", + "GET /repos/{owner}/{repo}/environments/{environment_name}/deployment-branch-policies", + "GET /repos/{owner}/{repo}/environments/{environment_name}/deployment_protection_rules/apps", + "GET /repos/{owner}/{repo}/events", + "GET /repos/{owner}/{repo}/forks", + "GET /repos/{owner}/{repo}/hooks", + "GET /repos/{owner}/{repo}/hooks/{hook_id}/deliveries", + "GET /repos/{owner}/{repo}/invitations", + "GET /repos/{owner}/{repo}/issues", + "GET /repos/{owner}/{repo}/issues/comments", + "GET /repos/{owner}/{repo}/issues/comments/{comment_id}/reactions", + "GET /repos/{owner}/{repo}/issues/events", + "GET /repos/{owner}/{repo}/issues/{issue_number}/comments", + "GET /repos/{owner}/{repo}/issues/{issue_number}/events", + "GET /repos/{owner}/{repo}/issues/{issue_number}/labels", + "GET /repos/{owner}/{repo}/issues/{issue_number}/reactions", + "GET /repos/{owner}/{repo}/issues/{issue_number}/timeline", + "GET /repos/{owner}/{repo}/keys", + "GET /repos/{owner}/{repo}/labels", + "GET /repos/{owner}/{repo}/milestones", + "GET /repos/{owner}/{repo}/milestones/{milestone_number}/labels", + "GET /repos/{owner}/{repo}/notifications", + "GET /repos/{owner}/{repo}/pages/builds", + "GET /repos/{owner}/{repo}/projects", + "GET /repos/{owner}/{repo}/pulls", + "GET /repos/{owner}/{repo}/pulls/comments", + "GET /repos/{owner}/{repo}/pulls/comments/{comment_id}/reactions", + "GET /repos/{owner}/{repo}/pulls/{pull_number}/comments", + "GET /repos/{owner}/{repo}/pulls/{pull_number}/commits", + "GET /repos/{owner}/{repo}/pulls/{pull_number}/files", + "GET /repos/{owner}/{repo}/pulls/{pull_number}/reviews", + "GET /repos/{owner}/{repo}/pulls/{pull_number}/reviews/{review_id}/comments", + "GET /repos/{owner}/{repo}/releases", + "GET /repos/{owner}/{repo}/releases/{release_id}/assets", + "GET /repos/{owner}/{repo}/releases/{release_id}/reactions", + "GET /repos/{owner}/{repo}/rules/branches/{branch}", + "GET /repos/{owner}/{repo}/rulesets", + "GET /repos/{owner}/{repo}/rulesets/rule-suites", + "GET /repos/{owner}/{repo}/secret-scanning/alerts", + "GET /repos/{owner}/{repo}/secret-scanning/alerts/{alert_number}/locations", + "GET /repos/{owner}/{repo}/security-advisories", + "GET /repos/{owner}/{repo}/stargazers", + "GET /repos/{owner}/{repo}/subscribers", + "GET /repos/{owner}/{repo}/tags", + "GET /repos/{owner}/{repo}/teams", + "GET /repos/{owner}/{repo}/topics", + "GET /repositories", + "GET /repositories/{repository_id}/environments/{environment_name}/secrets", + "GET /repositories/{repository_id}/environments/{environment_name}/variables", + "GET /search/code", + "GET /search/commits", + "GET /search/issues", + "GET /search/labels", + "GET /search/repositories", + "GET /search/topics", + "GET /search/users", + "GET /teams/{team_id}/discussions", + "GET /teams/{team_id}/discussions/{discussion_number}/comments", + "GET /teams/{team_id}/discussions/{discussion_number}/comments/{comment_number}/reactions", + "GET /teams/{team_id}/discussions/{discussion_number}/reactions", + "GET /teams/{team_id}/invitations", + "GET /teams/{team_id}/members", + "GET /teams/{team_id}/projects", + "GET /teams/{team_id}/repos", + "GET /teams/{team_id}/teams", + "GET /user/blocks", + "GET /user/codespaces", + "GET /user/codespaces/secrets", + "GET /user/emails", + "GET /user/followers", + "GET /user/following", + "GET /user/gpg_keys", + "GET /user/installations", + "GET /user/installations/{installation_id}/repositories", + "GET /user/issues", + "GET /user/keys", + "GET /user/marketplace_purchases", + "GET /user/marketplace_purchases/stubbed", + "GET /user/memberships/orgs", + "GET /user/migrations", + "GET /user/migrations/{migration_id}/repositories", + "GET /user/orgs", + "GET /user/packages", + "GET /user/packages/{package_type}/{package_name}/versions", + "GET /user/public_emails", + "GET /user/repos", + "GET /user/repository_invitations", + "GET /user/social_accounts", + "GET /user/ssh_signing_keys", + "GET /user/starred", + "GET /user/subscriptions", + "GET /user/teams", + "GET /users", + "GET /users/{username}/events", + "GET /users/{username}/events/orgs/{org}", + "GET /users/{username}/events/public", + "GET /users/{username}/followers", + "GET /users/{username}/following", + "GET /users/{username}/gists", + "GET /users/{username}/gpg_keys", + "GET /users/{username}/keys", + "GET /users/{username}/orgs", + "GET /users/{username}/packages", + "GET /users/{username}/projects", + "GET /users/{username}/received_events", + "GET /users/{username}/received_events/public", + "GET /users/{username}/repos", + "GET /users/{username}/social_accounts", + "GET /users/{username}/ssh_signing_keys", + "GET /users/{username}/starred", + "GET /users/{username}/subscriptions" + ]; + function isPaginatingEndpoint(arg) { + if (typeof arg === "string") { + return paginatingEndpoints.includes(arg); + } else { + return false; + } + } + function paginateRest(octokit) { + return { + paginate: Object.assign(paginate.bind(null, octokit), { + iterator: iterator.bind(null, octokit) + }) + }; + } + paginateRest.VERSION = VERSION; +}); + +// node_modules/@actions/github/lib/utils.js +var require_utils4 = __commonJS((exports2) => { + var __createBinding = exports2 && exports2.__createBinding || (Object.create ? function(o, m, k, k2) { + if (k2 === undefined) + k2 = k; + var desc = Object.getOwnPropertyDescriptor(m, k); + if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) { + desc = { enumerable: true, get: function() { + return m[k]; + } }; + } + Object.defineProperty(o, k2, desc); + } : function(o, m, k, k2) { + if (k2 === undefined) + k2 = k; + o[k2] = m[k]; + }); + var __setModuleDefault = exports2 && exports2.__setModuleDefault || (Object.create ? function(o, v) { + Object.defineProperty(o, "default", { enumerable: true, value: v }); + } : function(o, v) { + o["default"] = v; + }); + var __importStar = exports2 && exports2.__importStar || function(mod) { + if (mod && mod.__esModule) + return mod; + var result = {}; + if (mod != null) { + for (var k in mod) + if (k !== "default" && Object.prototype.hasOwnProperty.call(mod, k)) + __createBinding(result, mod, k); + } + __setModuleDefault(result, mod); + return result; + }; + Object.defineProperty(exports2, "__esModule", { value: true }); + exports2.getOctokitOptions = exports2.GitHub = exports2.defaults = exports2.context = undefined; + var Context = __importStar(require_context()); + var Utils = __importStar(require_utils3()); + var core_1 = require_dist_node8(); + var plugin_rest_endpoint_methods_1 = require_dist_node9(); + var plugin_paginate_rest_1 = require_dist_node10(); + exports2.context = new Context.Context; + var baseUrl = Utils.getApiBaseUrl(); + exports2.defaults = { + baseUrl, + request: { + agent: Utils.getProxyAgent(baseUrl), + fetch: Utils.getProxyFetch(baseUrl) + } + }; + exports2.GitHub = core_1.Octokit.plugin(plugin_rest_endpoint_methods_1.restEndpointMethods, plugin_paginate_rest_1.paginateRest).defaults(exports2.defaults); + function getOctokitOptions(token, options) { + const opts = Object.assign({}, options || {}); + const auth = Utils.getAuthString(token, opts); + if (auth) { + opts.auth = auth; + } + return opts; + } + exports2.getOctokitOptions = getOctokitOptions; +}); + +// node_modules/@actions/github/lib/github.js +var require_github = __commonJS((exports2) => { + var __createBinding = exports2 && exports2.__createBinding || (Object.create ? function(o, m, k, k2) { + if (k2 === undefined) + k2 = k; + var desc = Object.getOwnPropertyDescriptor(m, k); + if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) { + desc = { enumerable: true, get: function() { + return m[k]; + } }; + } + Object.defineProperty(o, k2, desc); + } : function(o, m, k, k2) { + if (k2 === undefined) + k2 = k; + o[k2] = m[k]; + }); + var __setModuleDefault = exports2 && exports2.__setModuleDefault || (Object.create ? function(o, v) { + Object.defineProperty(o, "default", { enumerable: true, value: v }); + } : function(o, v) { + o["default"] = v; + }); + var __importStar = exports2 && exports2.__importStar || function(mod) { + if (mod && mod.__esModule) + return mod; + var result = {}; + if (mod != null) { + for (var k in mod) + if (k !== "default" && Object.prototype.hasOwnProperty.call(mod, k)) + __createBinding(result, mod, k); + } + __setModuleDefault(result, mod); + return result; + }; + Object.defineProperty(exports2, "__esModule", { value: true }); + exports2.getOctokit = exports2.context = undefined; + var Context = __importStar(require_context()); + var utils_1 = require_utils4(); + exports2.context = new Context.Context; + function getOctokit(token, options, ...additionalPlugins) { + const GitHubWithPlugins = utils_1.GitHub.plugin(...additionalPlugins); + return new GitHubWithPlugins((0, utils_1.getOctokitOptions)(token, options)); + } + exports2.getOctokit = getOctokit; +}); + +// node_modules/@actions/artifact/lib/internal/shared/config.js +var require_config = __commonJS((exports2) => { + var __importDefault = exports2 && exports2.__importDefault || function(mod) { + return mod && mod.__esModule ? mod : { default: mod }; + }; + Object.defineProperty(exports2, "__esModule", { value: true }); + exports2.getUploadChunkTimeout = exports2.getConcurrency = exports2.getGitHubWorkspaceDir = exports2.isGhes = exports2.getResultsServiceUrl = exports2.getRuntimeToken = exports2.getUploadChunkSize = undefined; + var os_1 = __importDefault(require("os")); + function getUploadChunkSize() { + return 8 * 1024 * 1024; + } + exports2.getUploadChunkSize = getUploadChunkSize; + function getRuntimeToken() { + const token = process.env["ACTIONS_RUNTIME_TOKEN"]; + if (!token) { + throw new Error("Unable to get the ACTIONS_RUNTIME_TOKEN env variable"); + } + return token; + } + exports2.getRuntimeToken = getRuntimeToken; + function getResultsServiceUrl() { + const resultsUrl = process.env["ACTIONS_RESULTS_URL"]; + if (!resultsUrl) { + throw new Error("Unable to get the ACTIONS_RESULTS_URL env variable"); + } + return new URL(resultsUrl).origin; + } + exports2.getResultsServiceUrl = getResultsServiceUrl; + function isGhes() { + const ghUrl = new URL(process.env["GITHUB_SERVER_URL"] || "https://github.com"); + const hostname = ghUrl.hostname.trimEnd().toUpperCase(); + const isGitHubHost = hostname === "GITHUB.COM"; + const isGheHost = hostname.endsWith(".GHE.COM"); + const isLocalHost = hostname.endsWith(".LOCALHOST"); + return !isGitHubHost && !isGheHost && !isLocalHost; + } + exports2.isGhes = isGhes; + function getGitHubWorkspaceDir() { + const ghWorkspaceDir = process.env["GITHUB_WORKSPACE"]; + if (!ghWorkspaceDir) { + throw new Error("Unable to get the GITHUB_WORKSPACE env variable"); + } + return ghWorkspaceDir; + } + exports2.getGitHubWorkspaceDir = getGitHubWorkspaceDir; + function getConcurrency() { + const numCPUs = os_1.default.cpus().length; + if (numCPUs <= 4) { + return 32; + } + const concurrency = 16 * numCPUs; + return concurrency > 300 ? 300 : concurrency; + } + exports2.getConcurrency = getConcurrency; + function getUploadChunkTimeout() { + return 300000; + } + exports2.getUploadChunkTimeout = getUploadChunkTimeout; +}); + +// node_modules/@protobuf-ts/runtime/build/commonjs/json-typings.js +var require_json_typings = __commonJS((exports2) => { + Object.defineProperty(exports2, "__esModule", { value: true }); + exports2.isJsonObject = exports2.typeofJsonValue = undefined; + function typeofJsonValue(value) { + let t = typeof value; + if (t == "object") { + if (Array.isArray(value)) + return "array"; + if (value === null) + return "null"; + } + return t; + } + exports2.typeofJsonValue = typeofJsonValue; + function isJsonObject(value) { + return value !== null && typeof value == "object" && !Array.isArray(value); + } + exports2.isJsonObject = isJsonObject; +}); + +// node_modules/@protobuf-ts/runtime/build/commonjs/base64.js +var require_base64 = __commonJS((exports2) => { + Object.defineProperty(exports2, "__esModule", { value: true }); + exports2.base64encode = exports2.base64decode = undefined; + var encTable = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/".split(""); + var decTable = []; + for (let i = 0;i < encTable.length; i++) + decTable[encTable[i].charCodeAt(0)] = i; + decTable["-".charCodeAt(0)] = encTable.indexOf("+"); + decTable["_".charCodeAt(0)] = encTable.indexOf("/"); + function base64decode(base64Str) { + let es = base64Str.length * 3 / 4; + if (base64Str[base64Str.length - 2] == "=") + es -= 2; + else if (base64Str[base64Str.length - 1] == "=") + es -= 1; + let bytes = new Uint8Array(es), bytePos = 0, groupPos = 0, b, p = 0; + for (let i = 0;i < base64Str.length; i++) { + b = decTable[base64Str.charCodeAt(i)]; + if (b === undefined) { + switch (base64Str[i]) { + case "=": + groupPos = 0; + case "\n": + case "\r": + case "\t": + case " ": + continue; + default: + throw Error(`invalid base64 string.`); + } + } + switch (groupPos) { + case 0: + p = b; + groupPos = 1; + break; + case 1: + bytes[bytePos++] = p << 2 | (b & 48) >> 4; + p = b; + groupPos = 2; + break; + case 2: + bytes[bytePos++] = (p & 15) << 4 | (b & 60) >> 2; + p = b; + groupPos = 3; + break; + case 3: + bytes[bytePos++] = (p & 3) << 6 | b; + groupPos = 0; + break; + } + } + if (groupPos == 1) + throw Error(`invalid base64 string.`); + return bytes.subarray(0, bytePos); + } + exports2.base64decode = base64decode; + function base64encode(bytes) { + let base64 = "", groupPos = 0, b, p = 0; + for (let i = 0;i < bytes.length; i++) { + b = bytes[i]; + switch (groupPos) { + case 0: + base64 += encTable[b >> 2]; + p = (b & 3) << 4; + groupPos = 1; + break; + case 1: + base64 += encTable[p | b >> 4]; + p = (b & 15) << 2; + groupPos = 2; + break; + case 2: + base64 += encTable[p | b >> 6]; + base64 += encTable[b & 63]; + groupPos = 0; + break; + } + } + if (groupPos) { + base64 += encTable[p]; + base64 += "="; + if (groupPos == 1) + base64 += "="; + } + return base64; + } + exports2.base64encode = base64encode; +}); + +// node_modules/@protobuf-ts/runtime/build/commonjs/protobufjs-utf8.js +var require_protobufjs_utf8 = __commonJS((exports2) => { + Object.defineProperty(exports2, "__esModule", { value: true }); + exports2.utf8read = undefined; + var fromCharCodes = (chunk) => String.fromCharCode.apply(String, chunk); + function utf8read(bytes) { + if (bytes.length < 1) + return ""; + let pos = 0, parts = [], chunk = [], i = 0, t; + let len = bytes.length; + while (pos < len) { + t = bytes[pos++]; + if (t < 128) + chunk[i++] = t; + else if (t > 191 && t < 224) + chunk[i++] = (t & 31) << 6 | bytes[pos++] & 63; + else if (t > 239 && t < 365) { + t = ((t & 7) << 18 | (bytes[pos++] & 63) << 12 | (bytes[pos++] & 63) << 6 | bytes[pos++] & 63) - 65536; + chunk[i++] = 55296 + (t >> 10); + chunk[i++] = 56320 + (t & 1023); + } else + chunk[i++] = (t & 15) << 12 | (bytes[pos++] & 63) << 6 | bytes[pos++] & 63; + if (i > 8191) { + parts.push(fromCharCodes(chunk)); + i = 0; + } + } + if (parts.length) { + if (i) + parts.push(fromCharCodes(chunk.slice(0, i))); + return parts.join(""); + } + return fromCharCodes(chunk.slice(0, i)); + } + exports2.utf8read = utf8read; +}); + +// node_modules/@protobuf-ts/runtime/build/commonjs/binary-format-contract.js +var require_binary_format_contract = __commonJS((exports2) => { + Object.defineProperty(exports2, "__esModule", { value: true }); + exports2.WireType = exports2.mergeBinaryOptions = exports2.UnknownFieldHandler = undefined; + var UnknownFieldHandler; + (function(UnknownFieldHandler2) { + UnknownFieldHandler2.symbol = Symbol.for("protobuf-ts/unknown"); + UnknownFieldHandler2.onRead = (typeName, message, fieldNo, wireType, data) => { + let container = is(message) ? message[UnknownFieldHandler2.symbol] : message[UnknownFieldHandler2.symbol] = []; + container.push({ no: fieldNo, wireType, data }); + }; + UnknownFieldHandler2.onWrite = (typeName, message, writer) => { + for (let { no, wireType, data } of UnknownFieldHandler2.list(message)) + writer.tag(no, wireType).raw(data); + }; + UnknownFieldHandler2.list = (message, fieldNo) => { + if (is(message)) { + let all = message[UnknownFieldHandler2.symbol]; + return fieldNo ? all.filter((uf) => uf.no == fieldNo) : all; + } + return []; + }; + UnknownFieldHandler2.last = (message, fieldNo) => UnknownFieldHandler2.list(message, fieldNo).slice(-1)[0]; + const is = (message) => message && Array.isArray(message[UnknownFieldHandler2.symbol]); + })(UnknownFieldHandler = exports2.UnknownFieldHandler || (exports2.UnknownFieldHandler = {})); + function mergeBinaryOptions(a, b) { + return Object.assign(Object.assign({}, a), b); + } + exports2.mergeBinaryOptions = mergeBinaryOptions; + var WireType; + (function(WireType2) { + WireType2[WireType2["Varint"] = 0] = "Varint"; + WireType2[WireType2["Bit64"] = 1] = "Bit64"; + WireType2[WireType2["LengthDelimited"] = 2] = "LengthDelimited"; + WireType2[WireType2["StartGroup"] = 3] = "StartGroup"; + WireType2[WireType2["EndGroup"] = 4] = "EndGroup"; + WireType2[WireType2["Bit32"] = 5] = "Bit32"; + })(WireType = exports2.WireType || (exports2.WireType = {})); +}); + +// node_modules/@protobuf-ts/runtime/build/commonjs/goog-varint.js +var require_goog_varint = __commonJS((exports2) => { + Object.defineProperty(exports2, "__esModule", { value: true }); + exports2.varint32read = exports2.varint32write = exports2.int64toString = exports2.int64fromString = exports2.varint64write = exports2.varint64read = undefined; + function varint64read() { + let lowBits = 0; + let highBits = 0; + for (let shift = 0;shift < 28; shift += 7) { + let b = this.buf[this.pos++]; + lowBits |= (b & 127) << shift; + if ((b & 128) == 0) { + this.assertBounds(); + return [lowBits, highBits]; + } + } + let middleByte = this.buf[this.pos++]; + lowBits |= (middleByte & 15) << 28; + highBits = (middleByte & 112) >> 4; + if ((middleByte & 128) == 0) { + this.assertBounds(); + return [lowBits, highBits]; + } + for (let shift = 3;shift <= 31; shift += 7) { + let b = this.buf[this.pos++]; + highBits |= (b & 127) << shift; + if ((b & 128) == 0) { + this.assertBounds(); + return [lowBits, highBits]; + } + } + throw new Error("invalid varint"); + } + exports2.varint64read = varint64read; + function varint64write(lo, hi, bytes) { + for (let i = 0;i < 28; i = i + 7) { + const shift = lo >>> i; + const hasNext = !(shift >>> 7 == 0 && hi == 0); + const byte = (hasNext ? shift | 128 : shift) & 255; + bytes.push(byte); + if (!hasNext) { + return; + } + } + const splitBits = lo >>> 28 & 15 | (hi & 7) << 4; + const hasMoreBits = !(hi >> 3 == 0); + bytes.push((hasMoreBits ? splitBits | 128 : splitBits) & 255); + if (!hasMoreBits) { + return; + } + for (let i = 3;i < 31; i = i + 7) { + const shift = hi >>> i; + const hasNext = !(shift >>> 7 == 0); + const byte = (hasNext ? shift | 128 : shift) & 255; + bytes.push(byte); + if (!hasNext) { + return; + } + } + bytes.push(hi >>> 31 & 1); + } + exports2.varint64write = varint64write; + var TWO_PWR_32_DBL = (1 << 16) * (1 << 16); + function int64fromString(dec) { + let minus = dec[0] == "-"; + if (minus) + dec = dec.slice(1); + const base = 1e6; + let lowBits = 0; + let highBits = 0; + function add1e6digit(begin, end) { + const digit1e6 = Number(dec.slice(begin, end)); + highBits *= base; + lowBits = lowBits * base + digit1e6; + if (lowBits >= TWO_PWR_32_DBL) { + highBits = highBits + (lowBits / TWO_PWR_32_DBL | 0); + lowBits = lowBits % TWO_PWR_32_DBL; + } + } + add1e6digit(-24, -18); + add1e6digit(-18, -12); + add1e6digit(-12, -6); + add1e6digit(-6); + return [minus, lowBits, highBits]; + } + exports2.int64fromString = int64fromString; + function int64toString(bitsLow, bitsHigh) { + if (bitsHigh >>> 0 <= 2097151) { + return "" + (TWO_PWR_32_DBL * bitsHigh + (bitsLow >>> 0)); + } + let low = bitsLow & 16777215; + let mid = (bitsLow >>> 24 | bitsHigh << 8) >>> 0 & 16777215; + let high = bitsHigh >> 16 & 65535; + let digitA = low + mid * 6777216 + high * 6710656; + let digitB = mid + high * 8147497; + let digitC = high * 2; + let base = 1e7; + if (digitA >= base) { + digitB += Math.floor(digitA / base); + digitA %= base; + } + if (digitB >= base) { + digitC += Math.floor(digitB / base); + digitB %= base; + } + function decimalFrom1e7(digit1e7, needLeadingZeros) { + let partial = digit1e7 ? String(digit1e7) : ""; + if (needLeadingZeros) { + return "0000000".slice(partial.length) + partial; + } + return partial; + } + return decimalFrom1e7(digitC, 0) + decimalFrom1e7(digitB, digitC) + decimalFrom1e7(digitA, 1); + } + exports2.int64toString = int64toString; + function varint32write(value, bytes) { + if (value >= 0) { + while (value > 127) { + bytes.push(value & 127 | 128); + value = value >>> 7; + } + bytes.push(value); + } else { + for (let i = 0;i < 9; i++) { + bytes.push(value & 127 | 128); + value = value >> 7; + } + bytes.push(1); + } + } + exports2.varint32write = varint32write; + function varint32read() { + let b = this.buf[this.pos++]; + let result = b & 127; + if ((b & 128) == 0) { + this.assertBounds(); + return result; + } + b = this.buf[this.pos++]; + result |= (b & 127) << 7; + if ((b & 128) == 0) { + this.assertBounds(); + return result; + } + b = this.buf[this.pos++]; + result |= (b & 127) << 14; + if ((b & 128) == 0) { + this.assertBounds(); + return result; + } + b = this.buf[this.pos++]; + result |= (b & 127) << 21; + if ((b & 128) == 0) { + this.assertBounds(); + return result; + } + b = this.buf[this.pos++]; + result |= (b & 15) << 28; + for (let readBytes = 5;(b & 128) !== 0 && readBytes < 10; readBytes++) + b = this.buf[this.pos++]; + if ((b & 128) != 0) + throw new Error("invalid varint"); + this.assertBounds(); + return result >>> 0; + } + exports2.varint32read = varint32read; +}); + +// node_modules/@protobuf-ts/runtime/build/commonjs/pb-long.js +var require_pb_long = __commonJS((exports2) => { + Object.defineProperty(exports2, "__esModule", { value: true }); + exports2.PbLong = exports2.PbULong = exports2.detectBi = undefined; + var goog_varint_1 = require_goog_varint(); + var BI; + function detectBi() { + const dv = new DataView(new ArrayBuffer(8)); + const ok = globalThis.BigInt !== undefined && typeof dv.getBigInt64 === "function" && typeof dv.getBigUint64 === "function" && typeof dv.setBigInt64 === "function" && typeof dv.setBigUint64 === "function"; + BI = ok ? { + MIN: BigInt("-9223372036854775808"), + MAX: BigInt("9223372036854775807"), + UMIN: BigInt("0"), + UMAX: BigInt("18446744073709551615"), + C: BigInt, + V: dv + } : undefined; + } + exports2.detectBi = detectBi; + detectBi(); + function assertBi(bi) { + if (!bi) + throw new Error("BigInt unavailable, see https://github.com/timostamm/protobuf-ts/blob/v1.0.8/MANUAL.md#bigint-support"); + } + var RE_DECIMAL_STR = /^-?[0-9]+$/; + var TWO_PWR_32_DBL = 4294967296; + var HALF_2_PWR_32 = 2147483648; + + class SharedPbLong { + constructor(lo, hi) { + this.lo = lo | 0; + this.hi = hi | 0; + } + isZero() { + return this.lo == 0 && this.hi == 0; + } + toNumber() { + let result = this.hi * TWO_PWR_32_DBL + (this.lo >>> 0); + if (!Number.isSafeInteger(result)) + throw new Error("cannot convert to safe number"); + return result; + } + } + + class PbULong extends SharedPbLong { + static from(value) { + if (BI) + switch (typeof value) { + case "string": + if (value == "0") + return this.ZERO; + if (value == "") + throw new Error("string is no integer"); + value = BI.C(value); + case "number": + if (value === 0) + return this.ZERO; + value = BI.C(value); + case "bigint": + if (!value) + return this.ZERO; + if (value < BI.UMIN) + throw new Error("signed value for ulong"); + if (value > BI.UMAX) + throw new Error("ulong too large"); + BI.V.setBigUint64(0, value, true); + return new PbULong(BI.V.getInt32(0, true), BI.V.getInt32(4, true)); + } + else + switch (typeof value) { + case "string": + if (value == "0") + return this.ZERO; + value = value.trim(); + if (!RE_DECIMAL_STR.test(value)) + throw new Error("string is no integer"); + let [minus, lo, hi] = goog_varint_1.int64fromString(value); + if (minus) + throw new Error("signed value for ulong"); + return new PbULong(lo, hi); + case "number": + if (value == 0) + return this.ZERO; + if (!Number.isSafeInteger(value)) + throw new Error("number is no integer"); + if (value < 0) + throw new Error("signed value for ulong"); + return new PbULong(value, value / TWO_PWR_32_DBL); + } + throw new Error("unknown value " + typeof value); + } + toString() { + return BI ? this.toBigInt().toString() : goog_varint_1.int64toString(this.lo, this.hi); + } + toBigInt() { + assertBi(BI); + BI.V.setInt32(0, this.lo, true); + BI.V.setInt32(4, this.hi, true); + return BI.V.getBigUint64(0, true); + } + } + exports2.PbULong = PbULong; + PbULong.ZERO = new PbULong(0, 0); + + class PbLong extends SharedPbLong { + static from(value) { + if (BI) + switch (typeof value) { + case "string": + if (value == "0") + return this.ZERO; + if (value == "") + throw new Error("string is no integer"); + value = BI.C(value); + case "number": + if (value === 0) + return this.ZERO; + value = BI.C(value); + case "bigint": + if (!value) + return this.ZERO; + if (value < BI.MIN) + throw new Error("signed long too small"); + if (value > BI.MAX) + throw new Error("signed long too large"); + BI.V.setBigInt64(0, value, true); + return new PbLong(BI.V.getInt32(0, true), BI.V.getInt32(4, true)); + } + else + switch (typeof value) { + case "string": + if (value == "0") + return this.ZERO; + value = value.trim(); + if (!RE_DECIMAL_STR.test(value)) + throw new Error("string is no integer"); + let [minus, lo, hi] = goog_varint_1.int64fromString(value); + if (minus) { + if (hi > HALF_2_PWR_32 || hi == HALF_2_PWR_32 && lo != 0) + throw new Error("signed long too small"); + } else if (hi >= HALF_2_PWR_32) + throw new Error("signed long too large"); + let pbl = new PbLong(lo, hi); + return minus ? pbl.negate() : pbl; + case "number": + if (value == 0) + return this.ZERO; + if (!Number.isSafeInteger(value)) + throw new Error("number is no integer"); + return value > 0 ? new PbLong(value, value / TWO_PWR_32_DBL) : new PbLong(-value, -value / TWO_PWR_32_DBL).negate(); + } + throw new Error("unknown value " + typeof value); + } + isNegative() { + return (this.hi & HALF_2_PWR_32) !== 0; + } + negate() { + let hi = ~this.hi, lo = this.lo; + if (lo) + lo = ~lo + 1; + else + hi += 1; + return new PbLong(lo, hi); + } + toString() { + if (BI) + return this.toBigInt().toString(); + if (this.isNegative()) { + let n = this.negate(); + return "-" + goog_varint_1.int64toString(n.lo, n.hi); + } + return goog_varint_1.int64toString(this.lo, this.hi); + } + toBigInt() { + assertBi(BI); + BI.V.setInt32(0, this.lo, true); + BI.V.setInt32(4, this.hi, true); + return BI.V.getBigInt64(0, true); + } + } + exports2.PbLong = PbLong; + PbLong.ZERO = new PbLong(0, 0); +}); + +// node_modules/@protobuf-ts/runtime/build/commonjs/binary-reader.js +var require_binary_reader = __commonJS((exports2) => { + Object.defineProperty(exports2, "__esModule", { value: true }); + exports2.BinaryReader = exports2.binaryReadOptions = undefined; + var binary_format_contract_1 = require_binary_format_contract(); + var pb_long_1 = require_pb_long(); + var goog_varint_1 = require_goog_varint(); + var defaultsRead = { + readUnknownField: true, + readerFactory: (bytes) => new BinaryReader(bytes) + }; + function binaryReadOptions(options) { + return options ? Object.assign(Object.assign({}, defaultsRead), options) : defaultsRead; + } + exports2.binaryReadOptions = binaryReadOptions; + + class BinaryReader { + constructor(buf, textDecoder) { + this.varint64 = goog_varint_1.varint64read; + this.uint32 = goog_varint_1.varint32read; + this.buf = buf; + this.len = buf.length; + this.pos = 0; + this.view = new DataView(buf.buffer, buf.byteOffset, buf.byteLength); + this.textDecoder = textDecoder !== null && textDecoder !== undefined ? textDecoder : new TextDecoder("utf-8", { + fatal: true, + ignoreBOM: true + }); + } + tag() { + let tag = this.uint32(), fieldNo = tag >>> 3, wireType = tag & 7; + if (fieldNo <= 0 || wireType < 0 || wireType > 5) + throw new Error("illegal tag: field no " + fieldNo + " wire type " + wireType); + return [fieldNo, wireType]; + } + skip(wireType) { + let start = this.pos; + switch (wireType) { + case binary_format_contract_1.WireType.Varint: + while (this.buf[this.pos++] & 128) { + } + break; + case binary_format_contract_1.WireType.Bit64: + this.pos += 4; + case binary_format_contract_1.WireType.Bit32: + this.pos += 4; + break; + case binary_format_contract_1.WireType.LengthDelimited: + let len = this.uint32(); + this.pos += len; + break; + case binary_format_contract_1.WireType.StartGroup: + let t; + while ((t = this.tag()[1]) !== binary_format_contract_1.WireType.EndGroup) { + this.skip(t); + } + break; + default: + throw new Error("cant skip wire type " + wireType); + } + this.assertBounds(); + return this.buf.subarray(start, this.pos); + } + assertBounds() { + if (this.pos > this.len) + throw new RangeError("premature EOF"); + } + int32() { + return this.uint32() | 0; + } + sint32() { + let zze = this.uint32(); + return zze >>> 1 ^ -(zze & 1); + } + int64() { + return new pb_long_1.PbLong(...this.varint64()); + } + uint64() { + return new pb_long_1.PbULong(...this.varint64()); + } + sint64() { + let [lo, hi] = this.varint64(); + let s = -(lo & 1); + lo = (lo >>> 1 | (hi & 1) << 31) ^ s; + hi = hi >>> 1 ^ s; + return new pb_long_1.PbLong(lo, hi); + } + bool() { + let [lo, hi] = this.varint64(); + return lo !== 0 || hi !== 0; + } + fixed32() { + return this.view.getUint32((this.pos += 4) - 4, true); + } + sfixed32() { + return this.view.getInt32((this.pos += 4) - 4, true); + } + fixed64() { + return new pb_long_1.PbULong(this.sfixed32(), this.sfixed32()); + } + sfixed64() { + return new pb_long_1.PbLong(this.sfixed32(), this.sfixed32()); + } + float() { + return this.view.getFloat32((this.pos += 4) - 4, true); + } + double() { + return this.view.getFloat64((this.pos += 8) - 8, true); + } + bytes() { + let len = this.uint32(); + let start = this.pos; + this.pos += len; + this.assertBounds(); + return this.buf.subarray(start, start + len); + } + string() { + return this.textDecoder.decode(this.bytes()); + } + } + exports2.BinaryReader = BinaryReader; +}); + +// node_modules/@protobuf-ts/runtime/build/commonjs/assert.js +var require_assert = __commonJS((exports2) => { + Object.defineProperty(exports2, "__esModule", { value: true }); + exports2.assertFloat32 = exports2.assertUInt32 = exports2.assertInt32 = exports2.assertNever = exports2.assert = undefined; + function assert(condition, msg) { + if (!condition) { + throw new Error(msg); + } + } + exports2.assert = assert; + function assertNever(value, msg) { + throw new Error(msg !== null && msg !== undefined ? msg : "Unexpected object: " + value); + } + exports2.assertNever = assertNever; + var FLOAT32_MAX = 340282346638528860000000000000000000000; + var FLOAT32_MIN = -340282346638528860000000000000000000000; + var UINT32_MAX = 4294967295; + var INT32_MAX = 2147483647; + var INT32_MIN = -2147483648; + function assertInt32(arg) { + if (typeof arg !== "number") + throw new Error("invalid int 32: " + typeof arg); + if (!Number.isInteger(arg) || arg > INT32_MAX || arg < INT32_MIN) + throw new Error("invalid int 32: " + arg); + } + exports2.assertInt32 = assertInt32; + function assertUInt32(arg) { + if (typeof arg !== "number") + throw new Error("invalid uint 32: " + typeof arg); + if (!Number.isInteger(arg) || arg > UINT32_MAX || arg < 0) + throw new Error("invalid uint 32: " + arg); + } + exports2.assertUInt32 = assertUInt32; + function assertFloat32(arg) { + if (typeof arg !== "number") + throw new Error("invalid float 32: " + typeof arg); + if (!Number.isFinite(arg)) + return; + if (arg > FLOAT32_MAX || arg < FLOAT32_MIN) + throw new Error("invalid float 32: " + arg); + } + exports2.assertFloat32 = assertFloat32; +}); + +// node_modules/@protobuf-ts/runtime/build/commonjs/binary-writer.js +var require_binary_writer = __commonJS((exports2) => { + Object.defineProperty(exports2, "__esModule", { value: true }); + exports2.BinaryWriter = exports2.binaryWriteOptions = undefined; + var pb_long_1 = require_pb_long(); + var goog_varint_1 = require_goog_varint(); + var assert_1 = require_assert(); + var defaultsWrite = { + writeUnknownFields: true, + writerFactory: () => new BinaryWriter + }; + function binaryWriteOptions(options) { + return options ? Object.assign(Object.assign({}, defaultsWrite), options) : defaultsWrite; + } + exports2.binaryWriteOptions = binaryWriteOptions; + + class BinaryWriter { + constructor(textEncoder) { + this.stack = []; + this.textEncoder = textEncoder !== null && textEncoder !== undefined ? textEncoder : new TextEncoder; + this.chunks = []; + this.buf = []; + } + finish() { + this.chunks.push(new Uint8Array(this.buf)); + let len = 0; + for (let i = 0;i < this.chunks.length; i++) + len += this.chunks[i].length; + let bytes = new Uint8Array(len); + let offset = 0; + for (let i = 0;i < this.chunks.length; i++) { + bytes.set(this.chunks[i], offset); + offset += this.chunks[i].length; + } + this.chunks = []; + return bytes; + } + fork() { + this.stack.push({ chunks: this.chunks, buf: this.buf }); + this.chunks = []; + this.buf = []; + return this; + } + join() { + let chunk = this.finish(); + let prev = this.stack.pop(); + if (!prev) + throw new Error("invalid state, fork stack empty"); + this.chunks = prev.chunks; + this.buf = prev.buf; + this.uint32(chunk.byteLength); + return this.raw(chunk); + } + tag(fieldNo, type) { + return this.uint32((fieldNo << 3 | type) >>> 0); + } + raw(chunk) { + if (this.buf.length) { + this.chunks.push(new Uint8Array(this.buf)); + this.buf = []; + } + this.chunks.push(chunk); + return this; + } + uint32(value) { + assert_1.assertUInt32(value); + while (value > 127) { + this.buf.push(value & 127 | 128); + value = value >>> 7; + } + this.buf.push(value); + return this; + } + int32(value) { + assert_1.assertInt32(value); + goog_varint_1.varint32write(value, this.buf); + return this; + } + bool(value) { + this.buf.push(value ? 1 : 0); + return this; + } + bytes(value) { + this.uint32(value.byteLength); + return this.raw(value); + } + string(value) { + let chunk = this.textEncoder.encode(value); + this.uint32(chunk.byteLength); + return this.raw(chunk); + } + float(value) { + assert_1.assertFloat32(value); + let chunk = new Uint8Array(4); + new DataView(chunk.buffer).setFloat32(0, value, true); + return this.raw(chunk); + } + double(value) { + let chunk = new Uint8Array(8); + new DataView(chunk.buffer).setFloat64(0, value, true); + return this.raw(chunk); + } + fixed32(value) { + assert_1.assertUInt32(value); + let chunk = new Uint8Array(4); + new DataView(chunk.buffer).setUint32(0, value, true); + return this.raw(chunk); + } + sfixed32(value) { + assert_1.assertInt32(value); + let chunk = new Uint8Array(4); + new DataView(chunk.buffer).setInt32(0, value, true); + return this.raw(chunk); + } + sint32(value) { + assert_1.assertInt32(value); + value = (value << 1 ^ value >> 31) >>> 0; + goog_varint_1.varint32write(value, this.buf); + return this; + } + sfixed64(value) { + let chunk = new Uint8Array(8); + let view = new DataView(chunk.buffer); + let long = pb_long_1.PbLong.from(value); + view.setInt32(0, long.lo, true); + view.setInt32(4, long.hi, true); + return this.raw(chunk); + } + fixed64(value) { + let chunk = new Uint8Array(8); + let view = new DataView(chunk.buffer); + let long = pb_long_1.PbULong.from(value); + view.setInt32(0, long.lo, true); + view.setInt32(4, long.hi, true); + return this.raw(chunk); + } + int64(value) { + let long = pb_long_1.PbLong.from(value); + goog_varint_1.varint64write(long.lo, long.hi, this.buf); + return this; + } + sint64(value) { + let long = pb_long_1.PbLong.from(value), sign = long.hi >> 31, lo = long.lo << 1 ^ sign, hi = (long.hi << 1 | long.lo >>> 31) ^ sign; + goog_varint_1.varint64write(lo, hi, this.buf); + return this; + } + uint64(value) { + let long = pb_long_1.PbULong.from(value); + goog_varint_1.varint64write(long.lo, long.hi, this.buf); + return this; + } + } + exports2.BinaryWriter = BinaryWriter; +}); + +// node_modules/@protobuf-ts/runtime/build/commonjs/json-format-contract.js +var require_json_format_contract = __commonJS((exports2) => { + Object.defineProperty(exports2, "__esModule", { value: true }); + exports2.mergeJsonOptions = exports2.jsonWriteOptions = exports2.jsonReadOptions = undefined; + var defaultsWrite = { + emitDefaultValues: false, + enumAsInteger: false, + useProtoFieldName: false, + prettySpaces: 0 + }; + var defaultsRead = { + ignoreUnknownFields: false + }; + function jsonReadOptions(options) { + return options ? Object.assign(Object.assign({}, defaultsRead), options) : defaultsRead; + } + exports2.jsonReadOptions = jsonReadOptions; + function jsonWriteOptions(options) { + return options ? Object.assign(Object.assign({}, defaultsWrite), options) : defaultsWrite; + } + exports2.jsonWriteOptions = jsonWriteOptions; + function mergeJsonOptions(a, b) { + var _a, _b; + let c = Object.assign(Object.assign({}, a), b); + c.typeRegistry = [...(_a = a === null || a === undefined ? undefined : a.typeRegistry) !== null && _a !== undefined ? _a : [], ...(_b = b === null || b === undefined ? undefined : b.typeRegistry) !== null && _b !== undefined ? _b : []]; + return c; + } + exports2.mergeJsonOptions = mergeJsonOptions; +}); + +// node_modules/@protobuf-ts/runtime/build/commonjs/message-type-contract.js +var require_message_type_contract = __commonJS((exports2) => { + Object.defineProperty(exports2, "__esModule", { value: true }); + exports2.MESSAGE_TYPE = undefined; + exports2.MESSAGE_TYPE = Symbol.for("protobuf-ts/message-type"); +}); + +// node_modules/@protobuf-ts/runtime/build/commonjs/lower-camel-case.js +var require_lower_camel_case = __commonJS((exports2) => { + Object.defineProperty(exports2, "__esModule", { value: true }); + exports2.lowerCamelCase = undefined; + function lowerCamelCase(snakeCase) { + let capNext = false; + const sb = []; + for (let i = 0;i < snakeCase.length; i++) { + let next = snakeCase.charAt(i); + if (next == "_") { + capNext = true; + } else if (/\d/.test(next)) { + sb.push(next); + capNext = true; + } else if (capNext) { + sb.push(next.toUpperCase()); + capNext = false; + } else if (i == 0) { + sb.push(next.toLowerCase()); + } else { + sb.push(next); + } + } + return sb.join(""); + } + exports2.lowerCamelCase = lowerCamelCase; +}); + +// node_modules/@protobuf-ts/runtime/build/commonjs/reflection-info.js +var require_reflection_info = __commonJS((exports2) => { + Object.defineProperty(exports2, "__esModule", { value: true }); + exports2.readMessageOption = exports2.readFieldOption = exports2.readFieldOptions = exports2.normalizeFieldInfo = exports2.RepeatType = exports2.LongType = exports2.ScalarType = undefined; + var lower_camel_case_1 = require_lower_camel_case(); + var ScalarType; + (function(ScalarType2) { + ScalarType2[ScalarType2["DOUBLE"] = 1] = "DOUBLE"; + ScalarType2[ScalarType2["FLOAT"] = 2] = "FLOAT"; + ScalarType2[ScalarType2["INT64"] = 3] = "INT64"; + ScalarType2[ScalarType2["UINT64"] = 4] = "UINT64"; + ScalarType2[ScalarType2["INT32"] = 5] = "INT32"; + ScalarType2[ScalarType2["FIXED64"] = 6] = "FIXED64"; + ScalarType2[ScalarType2["FIXED32"] = 7] = "FIXED32"; + ScalarType2[ScalarType2["BOOL"] = 8] = "BOOL"; + ScalarType2[ScalarType2["STRING"] = 9] = "STRING"; + ScalarType2[ScalarType2["BYTES"] = 12] = "BYTES"; + ScalarType2[ScalarType2["UINT32"] = 13] = "UINT32"; + ScalarType2[ScalarType2["SFIXED32"] = 15] = "SFIXED32"; + ScalarType2[ScalarType2["SFIXED64"] = 16] = "SFIXED64"; + ScalarType2[ScalarType2["SINT32"] = 17] = "SINT32"; + ScalarType2[ScalarType2["SINT64"] = 18] = "SINT64"; + })(ScalarType = exports2.ScalarType || (exports2.ScalarType = {})); + var LongType; + (function(LongType2) { + LongType2[LongType2["BIGINT"] = 0] = "BIGINT"; + LongType2[LongType2["STRING"] = 1] = "STRING"; + LongType2[LongType2["NUMBER"] = 2] = "NUMBER"; + })(LongType = exports2.LongType || (exports2.LongType = {})); + var RepeatType; + (function(RepeatType2) { + RepeatType2[RepeatType2["NO"] = 0] = "NO"; + RepeatType2[RepeatType2["PACKED"] = 1] = "PACKED"; + RepeatType2[RepeatType2["UNPACKED"] = 2] = "UNPACKED"; + })(RepeatType = exports2.RepeatType || (exports2.RepeatType = {})); + function normalizeFieldInfo(field) { + var _a, _b, _c, _d; + field.localName = (_a = field.localName) !== null && _a !== undefined ? _a : lower_camel_case_1.lowerCamelCase(field.name); + field.jsonName = (_b = field.jsonName) !== null && _b !== undefined ? _b : lower_camel_case_1.lowerCamelCase(field.name); + field.repeat = (_c = field.repeat) !== null && _c !== undefined ? _c : RepeatType.NO; + field.opt = (_d = field.opt) !== null && _d !== undefined ? _d : field.repeat ? false : field.oneof ? false : field.kind == "message"; + return field; + } + exports2.normalizeFieldInfo = normalizeFieldInfo; + function readFieldOptions(messageType, fieldName, extensionName, extensionType) { + var _a; + const options = (_a = messageType.fields.find((m, i) => m.localName == fieldName || i == fieldName)) === null || _a === undefined ? undefined : _a.options; + return options && options[extensionName] ? extensionType.fromJson(options[extensionName]) : undefined; + } + exports2.readFieldOptions = readFieldOptions; + function readFieldOption(messageType, fieldName, extensionName, extensionType) { + var _a; + const options = (_a = messageType.fields.find((m, i) => m.localName == fieldName || i == fieldName)) === null || _a === undefined ? undefined : _a.options; + if (!options) { + return; + } + const optionVal = options[extensionName]; + if (optionVal === undefined) { + return optionVal; + } + return extensionType ? extensionType.fromJson(optionVal) : optionVal; + } + exports2.readFieldOption = readFieldOption; + function readMessageOption(messageType, extensionName, extensionType) { + const options = messageType.options; + const optionVal = options[extensionName]; + if (optionVal === undefined) { + return optionVal; + } + return extensionType ? extensionType.fromJson(optionVal) : optionVal; + } + exports2.readMessageOption = readMessageOption; +}); + +// node_modules/@protobuf-ts/runtime/build/commonjs/oneof.js +var require_oneof = __commonJS((exports2) => { + Object.defineProperty(exports2, "__esModule", { value: true }); + exports2.getSelectedOneofValue = exports2.clearOneofValue = exports2.setUnknownOneofValue = exports2.setOneofValue = exports2.getOneofValue = exports2.isOneofGroup = undefined; + function isOneofGroup(any) { + if (typeof any != "object" || any === null || !any.hasOwnProperty("oneofKind")) { + return false; + } + switch (typeof any.oneofKind) { + case "string": + if (any[any.oneofKind] === undefined) + return false; + return Object.keys(any).length == 2; + case "undefined": + return Object.keys(any).length == 1; + default: + return false; + } + } + exports2.isOneofGroup = isOneofGroup; + function getOneofValue(oneof, kind) { + return oneof[kind]; + } + exports2.getOneofValue = getOneofValue; + function setOneofValue(oneof, kind, value) { + if (oneof.oneofKind !== undefined) { + delete oneof[oneof.oneofKind]; + } + oneof.oneofKind = kind; + if (value !== undefined) { + oneof[kind] = value; + } + } + exports2.setOneofValue = setOneofValue; + function setUnknownOneofValue(oneof, kind, value) { + if (oneof.oneofKind !== undefined) { + delete oneof[oneof.oneofKind]; + } + oneof.oneofKind = kind; + if (value !== undefined && kind !== undefined) { + oneof[kind] = value; + } + } + exports2.setUnknownOneofValue = setUnknownOneofValue; + function clearOneofValue(oneof) { + if (oneof.oneofKind !== undefined) { + delete oneof[oneof.oneofKind]; + } + oneof.oneofKind = undefined; + } + exports2.clearOneofValue = clearOneofValue; + function getSelectedOneofValue(oneof) { + if (oneof.oneofKind === undefined) { + return; + } + return oneof[oneof.oneofKind]; + } + exports2.getSelectedOneofValue = getSelectedOneofValue; +}); + +// node_modules/@protobuf-ts/runtime/build/commonjs/reflection-type-check.js +var require_reflection_type_check = __commonJS((exports2) => { + Object.defineProperty(exports2, "__esModule", { value: true }); + exports2.ReflectionTypeCheck = undefined; + var reflection_info_1 = require_reflection_info(); + var oneof_1 = require_oneof(); + + class ReflectionTypeCheck { + constructor(info) { + var _a; + this.fields = (_a = info.fields) !== null && _a !== undefined ? _a : []; + } + prepare() { + if (this.data) + return; + const req = [], known = [], oneofs = []; + for (let field of this.fields) { + if (field.oneof) { + if (!oneofs.includes(field.oneof)) { + oneofs.push(field.oneof); + req.push(field.oneof); + known.push(field.oneof); + } + } else { + known.push(field.localName); + switch (field.kind) { + case "scalar": + case "enum": + if (!field.opt || field.repeat) + req.push(field.localName); + break; + case "message": + if (field.repeat) + req.push(field.localName); + break; + case "map": + req.push(field.localName); + break; + } + } + } + this.data = { req, known, oneofs: Object.values(oneofs) }; + } + is(message, depth, allowExcessProperties = false) { + if (depth < 0) + return true; + if (message === null || message === undefined || typeof message != "object") + return false; + this.prepare(); + let keys = Object.keys(message), data = this.data; + if (keys.length < data.req.length || data.req.some((n) => !keys.includes(n))) + return false; + if (!allowExcessProperties) { + if (keys.some((k) => !data.known.includes(k))) + return false; + } + if (depth < 1) { + return true; + } + for (const name of data.oneofs) { + const group = message[name]; + if (!oneof_1.isOneofGroup(group)) + return false; + if (group.oneofKind === undefined) + continue; + const field = this.fields.find((f) => f.localName === group.oneofKind); + if (!field) + return false; + if (!this.field(group[group.oneofKind], field, allowExcessProperties, depth)) + return false; + } + for (const field of this.fields) { + if (field.oneof !== undefined) + continue; + if (!this.field(message[field.localName], field, allowExcessProperties, depth)) + return false; + } + return true; + } + field(arg, field, allowExcessProperties, depth) { + let repeated = field.repeat; + switch (field.kind) { + case "scalar": + if (arg === undefined) + return field.opt; + if (repeated) + return this.scalars(arg, field.T, depth, field.L); + return this.scalar(arg, field.T, field.L); + case "enum": + if (arg === undefined) + return field.opt; + if (repeated) + return this.scalars(arg, reflection_info_1.ScalarType.INT32, depth); + return this.scalar(arg, reflection_info_1.ScalarType.INT32); + case "message": + if (arg === undefined) + return true; + if (repeated) + return this.messages(arg, field.T(), allowExcessProperties, depth); + return this.message(arg, field.T(), allowExcessProperties, depth); + case "map": + if (typeof arg != "object" || arg === null) + return false; + if (depth < 2) + return true; + if (!this.mapKeys(arg, field.K, depth)) + return false; + switch (field.V.kind) { + case "scalar": + return this.scalars(Object.values(arg), field.V.T, depth, field.V.L); + case "enum": + return this.scalars(Object.values(arg), reflection_info_1.ScalarType.INT32, depth); + case "message": + return this.messages(Object.values(arg), field.V.T(), allowExcessProperties, depth); + } + break; + } + return true; + } + message(arg, type, allowExcessProperties, depth) { + if (allowExcessProperties) { + return type.isAssignable(arg, depth); + } + return type.is(arg, depth); + } + messages(arg, type, allowExcessProperties, depth) { + if (!Array.isArray(arg)) + return false; + if (depth < 2) + return true; + if (allowExcessProperties) { + for (let i = 0;i < arg.length && i < depth; i++) + if (!type.isAssignable(arg[i], depth - 1)) + return false; + } else { + for (let i = 0;i < arg.length && i < depth; i++) + if (!type.is(arg[i], depth - 1)) + return false; + } + return true; + } + scalar(arg, type, longType) { + let argType = typeof arg; + switch (type) { + case reflection_info_1.ScalarType.UINT64: + case reflection_info_1.ScalarType.FIXED64: + case reflection_info_1.ScalarType.INT64: + case reflection_info_1.ScalarType.SFIXED64: + case reflection_info_1.ScalarType.SINT64: + switch (longType) { + case reflection_info_1.LongType.BIGINT: + return argType == "bigint"; + case reflection_info_1.LongType.NUMBER: + return argType == "number" && !isNaN(arg); + default: + return argType == "string"; + } + case reflection_info_1.ScalarType.BOOL: + return argType == "boolean"; + case reflection_info_1.ScalarType.STRING: + return argType == "string"; + case reflection_info_1.ScalarType.BYTES: + return arg instanceof Uint8Array; + case reflection_info_1.ScalarType.DOUBLE: + case reflection_info_1.ScalarType.FLOAT: + return argType == "number" && !isNaN(arg); + default: + return argType == "number" && Number.isInteger(arg); + } + } + scalars(arg, type, depth, longType) { + if (!Array.isArray(arg)) + return false; + if (depth < 2) + return true; + if (Array.isArray(arg)) { + for (let i = 0;i < arg.length && i < depth; i++) + if (!this.scalar(arg[i], type, longType)) + return false; + } + return true; + } + mapKeys(map, type, depth) { + let keys = Object.keys(map); + switch (type) { + case reflection_info_1.ScalarType.INT32: + case reflection_info_1.ScalarType.FIXED32: + case reflection_info_1.ScalarType.SFIXED32: + case reflection_info_1.ScalarType.SINT32: + case reflection_info_1.ScalarType.UINT32: + return this.scalars(keys.slice(0, depth).map((k) => parseInt(k)), type, depth); + case reflection_info_1.ScalarType.BOOL: + return this.scalars(keys.slice(0, depth).map((k) => k == "true" ? true : k == "false" ? false : k), type, depth); + default: + return this.scalars(keys, type, depth, reflection_info_1.LongType.STRING); + } + } + } + exports2.ReflectionTypeCheck = ReflectionTypeCheck; +}); + +// node_modules/@protobuf-ts/runtime/build/commonjs/reflection-long-convert.js +var require_reflection_long_convert = __commonJS((exports2) => { + Object.defineProperty(exports2, "__esModule", { value: true }); + exports2.reflectionLongConvert = undefined; + var reflection_info_1 = require_reflection_info(); + function reflectionLongConvert(long, type) { + switch (type) { + case reflection_info_1.LongType.BIGINT: + return long.toBigInt(); + case reflection_info_1.LongType.NUMBER: + return long.toNumber(); + default: + return long.toString(); + } + } + exports2.reflectionLongConvert = reflectionLongConvert; +}); + +// node_modules/@protobuf-ts/runtime/build/commonjs/reflection-json-reader.js +var require_reflection_json_reader = __commonJS((exports2) => { + Object.defineProperty(exports2, "__esModule", { value: true }); + exports2.ReflectionJsonReader = undefined; + var json_typings_1 = require_json_typings(); + var base64_1 = require_base64(); + var reflection_info_1 = require_reflection_info(); + var pb_long_1 = require_pb_long(); + var assert_1 = require_assert(); + var reflection_long_convert_1 = require_reflection_long_convert(); + + class ReflectionJsonReader { + constructor(info) { + this.info = info; + } + prepare() { + var _a; + if (this.fMap === undefined) { + this.fMap = {}; + const fieldsInput = (_a = this.info.fields) !== null && _a !== undefined ? _a : []; + for (const field of fieldsInput) { + this.fMap[field.name] = field; + this.fMap[field.jsonName] = field; + this.fMap[field.localName] = field; + } + } + } + assert(condition, fieldName, jsonValue) { + if (!condition) { + let what = json_typings_1.typeofJsonValue(jsonValue); + if (what == "number" || what == "boolean") + what = jsonValue.toString(); + throw new Error(`Cannot parse JSON ${what} for ${this.info.typeName}#${fieldName}`); + } + } + read(input, message, options) { + this.prepare(); + const oneofsHandled = []; + for (const [jsonKey, jsonValue] of Object.entries(input)) { + const field = this.fMap[jsonKey]; + if (!field) { + if (!options.ignoreUnknownFields) + throw new Error(`Found unknown field while reading ${this.info.typeName} from JSON format. JSON key: ${jsonKey}`); + continue; + } + const localName = field.localName; + let target; + if (field.oneof) { + if (jsonValue === null && (field.kind !== "enum" || field.T()[0] !== "google.protobuf.NullValue")) { + continue; + } + if (oneofsHandled.includes(field.oneof)) + throw new Error(`Multiple members of the oneof group "${field.oneof}" of ${this.info.typeName} are present in JSON.`); + oneofsHandled.push(field.oneof); + target = message[field.oneof] = { + oneofKind: localName + }; + } else { + target = message; + } + if (field.kind == "map") { + if (jsonValue === null) { + continue; + } + this.assert(json_typings_1.isJsonObject(jsonValue), field.name, jsonValue); + const fieldObj = target[localName]; + for (const [jsonObjKey, jsonObjValue] of Object.entries(jsonValue)) { + this.assert(jsonObjValue !== null, field.name + " map value", null); + let val2; + switch (field.V.kind) { + case "message": + val2 = field.V.T().internalJsonRead(jsonObjValue, options); + break; + case "enum": + val2 = this.enum(field.V.T(), jsonObjValue, field.name, options.ignoreUnknownFields); + if (val2 === false) + continue; + break; + case "scalar": + val2 = this.scalar(jsonObjValue, field.V.T, field.V.L, field.name); + break; + } + this.assert(val2 !== undefined, field.name + " map value", jsonObjValue); + let key = jsonObjKey; + if (field.K == reflection_info_1.ScalarType.BOOL) + key = key == "true" ? true : key == "false" ? false : key; + key = this.scalar(key, field.K, reflection_info_1.LongType.STRING, field.name).toString(); + fieldObj[key] = val2; + } + } else if (field.repeat) { + if (jsonValue === null) + continue; + this.assert(Array.isArray(jsonValue), field.name, jsonValue); + const fieldArr = target[localName]; + for (const jsonItem of jsonValue) { + this.assert(jsonItem !== null, field.name, null); + let val2; + switch (field.kind) { + case "message": + val2 = field.T().internalJsonRead(jsonItem, options); + break; + case "enum": + val2 = this.enum(field.T(), jsonItem, field.name, options.ignoreUnknownFields); + if (val2 === false) + continue; + break; + case "scalar": + val2 = this.scalar(jsonItem, field.T, field.L, field.name); + break; + } + this.assert(val2 !== undefined, field.name, jsonValue); + fieldArr.push(val2); + } + } else { + switch (field.kind) { + case "message": + if (jsonValue === null && field.T().typeName != "google.protobuf.Value") { + this.assert(field.oneof === undefined, field.name + " (oneof member)", null); + continue; + } + target[localName] = field.T().internalJsonRead(jsonValue, options, target[localName]); + break; + case "enum": + let val2 = this.enum(field.T(), jsonValue, field.name, options.ignoreUnknownFields); + if (val2 === false) + continue; + target[localName] = val2; + break; + case "scalar": + target[localName] = this.scalar(jsonValue, field.T, field.L, field.name); + break; + } + } + } + } + enum(type, json, fieldName, ignoreUnknownFields) { + if (type[0] == "google.protobuf.NullValue") + assert_1.assert(json === null || json === "NULL_VALUE", `Unable to parse field ${this.info.typeName}#${fieldName}, enum ${type[0]} only accepts null.`); + if (json === null) + return 0; + switch (typeof json) { + case "number": + assert_1.assert(Number.isInteger(json), `Unable to parse field ${this.info.typeName}#${fieldName}, enum can only be integral number, got ${json}.`); + return json; + case "string": + let localEnumName = json; + if (type[2] && json.substring(0, type[2].length) === type[2]) + localEnumName = json.substring(type[2].length); + let enumNumber = type[1][localEnumName]; + if (typeof enumNumber === "undefined" && ignoreUnknownFields) { + return false; + } + assert_1.assert(typeof enumNumber == "number", `Unable to parse field ${this.info.typeName}#${fieldName}, enum ${type[0]} has no value for "${json}".`); + return enumNumber; + } + assert_1.assert(false, `Unable to parse field ${this.info.typeName}#${fieldName}, cannot parse enum value from ${typeof json}".`); + } + scalar(json, type, longType, fieldName) { + let e; + try { + switch (type) { + case reflection_info_1.ScalarType.DOUBLE: + case reflection_info_1.ScalarType.FLOAT: + if (json === null) + return 0; + if (json === "NaN") + return Number.NaN; + if (json === "Infinity") + return Number.POSITIVE_INFINITY; + if (json === "-Infinity") + return Number.NEGATIVE_INFINITY; + if (json === "") { + e = "empty string"; + break; + } + if (typeof json == "string" && json.trim().length !== json.length) { + e = "extra whitespace"; + break; + } + if (typeof json != "string" && typeof json != "number") { + break; + } + let float = Number(json); + if (Number.isNaN(float)) { + e = "not a number"; + break; + } + if (!Number.isFinite(float)) { + e = "too large or small"; + break; + } + if (type == reflection_info_1.ScalarType.FLOAT) + assert_1.assertFloat32(float); + return float; + case reflection_info_1.ScalarType.INT32: + case reflection_info_1.ScalarType.FIXED32: + case reflection_info_1.ScalarType.SFIXED32: + case reflection_info_1.ScalarType.SINT32: + case reflection_info_1.ScalarType.UINT32: + if (json === null) + return 0; + let int32; + if (typeof json == "number") + int32 = json; + else if (json === "") + e = "empty string"; + else if (typeof json == "string") { + if (json.trim().length !== json.length) + e = "extra whitespace"; + else + int32 = Number(json); + } + if (int32 === undefined) + break; + if (type == reflection_info_1.ScalarType.UINT32) + assert_1.assertUInt32(int32); + else + assert_1.assertInt32(int32); + return int32; + case reflection_info_1.ScalarType.INT64: + case reflection_info_1.ScalarType.SFIXED64: + case reflection_info_1.ScalarType.SINT64: + if (json === null) + return reflection_long_convert_1.reflectionLongConvert(pb_long_1.PbLong.ZERO, longType); + if (typeof json != "number" && typeof json != "string") + break; + return reflection_long_convert_1.reflectionLongConvert(pb_long_1.PbLong.from(json), longType); + case reflection_info_1.ScalarType.FIXED64: + case reflection_info_1.ScalarType.UINT64: + if (json === null) + return reflection_long_convert_1.reflectionLongConvert(pb_long_1.PbULong.ZERO, longType); + if (typeof json != "number" && typeof json != "string") + break; + return reflection_long_convert_1.reflectionLongConvert(pb_long_1.PbULong.from(json), longType); + case reflection_info_1.ScalarType.BOOL: + if (json === null) + return false; + if (typeof json !== "boolean") + break; + return json; + case reflection_info_1.ScalarType.STRING: + if (json === null) + return ""; + if (typeof json !== "string") { + e = "extra whitespace"; + break; + } + try { + encodeURIComponent(json); + } catch (e2) { + e2 = "invalid UTF8"; + break; + } + return json; + case reflection_info_1.ScalarType.BYTES: + if (json === null || json === "") + return new Uint8Array(0); + if (typeof json !== "string") + break; + return base64_1.base64decode(json); + } + } catch (error) { + e = error.message; + } + this.assert(false, fieldName + (e ? " - " + e : ""), json); + } + } + exports2.ReflectionJsonReader = ReflectionJsonReader; +}); + +// node_modules/@protobuf-ts/runtime/build/commonjs/reflection-json-writer.js +var require_reflection_json_writer = __commonJS((exports2) => { + Object.defineProperty(exports2, "__esModule", { value: true }); + exports2.ReflectionJsonWriter = undefined; + var base64_1 = require_base64(); + var pb_long_1 = require_pb_long(); + var reflection_info_1 = require_reflection_info(); + var assert_1 = require_assert(); + + class ReflectionJsonWriter { + constructor(info) { + var _a; + this.fields = (_a = info.fields) !== null && _a !== undefined ? _a : []; + } + write(message, options) { + const json = {}, source = message; + for (const field of this.fields) { + if (!field.oneof) { + let jsonValue2 = this.field(field, source[field.localName], options); + if (jsonValue2 !== undefined) + json[options.useProtoFieldName ? field.name : field.jsonName] = jsonValue2; + continue; + } + const group = source[field.oneof]; + if (group.oneofKind !== field.localName) + continue; + const opt = field.kind == "scalar" || field.kind == "enum" ? Object.assign(Object.assign({}, options), { emitDefaultValues: true }) : options; + let jsonValue = this.field(field, group[field.localName], opt); + assert_1.assert(jsonValue !== undefined); + json[options.useProtoFieldName ? field.name : field.jsonName] = jsonValue; + } + return json; + } + field(field, value, options) { + let jsonValue = undefined; + if (field.kind == "map") { + assert_1.assert(typeof value == "object" && value !== null); + const jsonObj = {}; + switch (field.V.kind) { + case "scalar": + for (const [entryKey, entryValue] of Object.entries(value)) { + const val2 = this.scalar(field.V.T, entryValue, field.name, false, true); + assert_1.assert(val2 !== undefined); + jsonObj[entryKey.toString()] = val2; + } + break; + case "message": + const messageType = field.V.T(); + for (const [entryKey, entryValue] of Object.entries(value)) { + const val2 = this.message(messageType, entryValue, field.name, options); + assert_1.assert(val2 !== undefined); + jsonObj[entryKey.toString()] = val2; + } + break; + case "enum": + const enumInfo = field.V.T(); + for (const [entryKey, entryValue] of Object.entries(value)) { + assert_1.assert(entryValue === undefined || typeof entryValue == "number"); + const val2 = this.enum(enumInfo, entryValue, field.name, false, true, options.enumAsInteger); + assert_1.assert(val2 !== undefined); + jsonObj[entryKey.toString()] = val2; + } + break; + } + if (options.emitDefaultValues || Object.keys(jsonObj).length > 0) + jsonValue = jsonObj; + } else if (field.repeat) { + assert_1.assert(Array.isArray(value)); + const jsonArr = []; + switch (field.kind) { + case "scalar": + for (let i = 0;i < value.length; i++) { + const val2 = this.scalar(field.T, value[i], field.name, field.opt, true); + assert_1.assert(val2 !== undefined); + jsonArr.push(val2); + } + break; + case "enum": + const enumInfo = field.T(); + for (let i = 0;i < value.length; i++) { + assert_1.assert(value[i] === undefined || typeof value[i] == "number"); + const val2 = this.enum(enumInfo, value[i], field.name, field.opt, true, options.enumAsInteger); + assert_1.assert(val2 !== undefined); + jsonArr.push(val2); + } + break; + case "message": + const messageType = field.T(); + for (let i = 0;i < value.length; i++) { + const val2 = this.message(messageType, value[i], field.name, options); + assert_1.assert(val2 !== undefined); + jsonArr.push(val2); + } + break; + } + if (options.emitDefaultValues || jsonArr.length > 0 || options.emitDefaultValues) + jsonValue = jsonArr; + } else { + switch (field.kind) { + case "scalar": + jsonValue = this.scalar(field.T, value, field.name, field.opt, options.emitDefaultValues); + break; + case "enum": + jsonValue = this.enum(field.T(), value, field.name, field.opt, options.emitDefaultValues, options.enumAsInteger); + break; + case "message": + jsonValue = this.message(field.T(), value, field.name, options); + break; + } + } + return jsonValue; + } + enum(type, value, fieldName, optional, emitDefaultValues, enumAsInteger) { + if (type[0] == "google.protobuf.NullValue") + return !emitDefaultValues && !optional ? undefined : null; + if (value === undefined) { + assert_1.assert(optional); + return; + } + if (value === 0 && !emitDefaultValues && !optional) + return; + assert_1.assert(typeof value == "number"); + assert_1.assert(Number.isInteger(value)); + if (enumAsInteger || !type[1].hasOwnProperty(value)) + return value; + if (type[2]) + return type[2] + type[1][value]; + return type[1][value]; + } + message(type, value, fieldName, options) { + if (value === undefined) + return options.emitDefaultValues ? null : undefined; + return type.internalJsonWrite(value, options); + } + scalar(type, value, fieldName, optional, emitDefaultValues) { + if (value === undefined) { + assert_1.assert(optional); + return; + } + const ed = emitDefaultValues || optional; + switch (type) { + case reflection_info_1.ScalarType.INT32: + case reflection_info_1.ScalarType.SFIXED32: + case reflection_info_1.ScalarType.SINT32: + if (value === 0) + return ed ? 0 : undefined; + assert_1.assertInt32(value); + return value; + case reflection_info_1.ScalarType.FIXED32: + case reflection_info_1.ScalarType.UINT32: + if (value === 0) + return ed ? 0 : undefined; + assert_1.assertUInt32(value); + return value; + case reflection_info_1.ScalarType.FLOAT: + assert_1.assertFloat32(value); + case reflection_info_1.ScalarType.DOUBLE: + if (value === 0) + return ed ? 0 : undefined; + assert_1.assert(typeof value == "number"); + if (Number.isNaN(value)) + return "NaN"; + if (value === Number.POSITIVE_INFINITY) + return "Infinity"; + if (value === Number.NEGATIVE_INFINITY) + return "-Infinity"; + return value; + case reflection_info_1.ScalarType.STRING: + if (value === "") + return ed ? "" : undefined; + assert_1.assert(typeof value == "string"); + return value; + case reflection_info_1.ScalarType.BOOL: + if (value === false) + return ed ? false : undefined; + assert_1.assert(typeof value == "boolean"); + return value; + case reflection_info_1.ScalarType.UINT64: + case reflection_info_1.ScalarType.FIXED64: + assert_1.assert(typeof value == "number" || typeof value == "string" || typeof value == "bigint"); + let ulong = pb_long_1.PbULong.from(value); + if (ulong.isZero() && !ed) + return; + return ulong.toString(); + case reflection_info_1.ScalarType.INT64: + case reflection_info_1.ScalarType.SFIXED64: + case reflection_info_1.ScalarType.SINT64: + assert_1.assert(typeof value == "number" || typeof value == "string" || typeof value == "bigint"); + let long = pb_long_1.PbLong.from(value); + if (long.isZero() && !ed) + return; + return long.toString(); + case reflection_info_1.ScalarType.BYTES: + assert_1.assert(value instanceof Uint8Array); + if (!value.byteLength) + return ed ? "" : undefined; + return base64_1.base64encode(value); + } + } + } + exports2.ReflectionJsonWriter = ReflectionJsonWriter; +}); + +// node_modules/@protobuf-ts/runtime/build/commonjs/reflection-scalar-default.js +var require_reflection_scalar_default = __commonJS((exports2) => { + Object.defineProperty(exports2, "__esModule", { value: true }); + exports2.reflectionScalarDefault = undefined; + var reflection_info_1 = require_reflection_info(); + var reflection_long_convert_1 = require_reflection_long_convert(); + var pb_long_1 = require_pb_long(); + function reflectionScalarDefault(type, longType = reflection_info_1.LongType.STRING) { + switch (type) { + case reflection_info_1.ScalarType.BOOL: + return false; + case reflection_info_1.ScalarType.UINT64: + case reflection_info_1.ScalarType.FIXED64: + return reflection_long_convert_1.reflectionLongConvert(pb_long_1.PbULong.ZERO, longType); + case reflection_info_1.ScalarType.INT64: + case reflection_info_1.ScalarType.SFIXED64: + case reflection_info_1.ScalarType.SINT64: + return reflection_long_convert_1.reflectionLongConvert(pb_long_1.PbLong.ZERO, longType); + case reflection_info_1.ScalarType.DOUBLE: + case reflection_info_1.ScalarType.FLOAT: + return 0; + case reflection_info_1.ScalarType.BYTES: + return new Uint8Array(0); + case reflection_info_1.ScalarType.STRING: + return ""; + default: + return 0; + } + } + exports2.reflectionScalarDefault = reflectionScalarDefault; +}); + +// node_modules/@protobuf-ts/runtime/build/commonjs/reflection-binary-reader.js +var require_reflection_binary_reader = __commonJS((exports2) => { + Object.defineProperty(exports2, "__esModule", { value: true }); + exports2.ReflectionBinaryReader = undefined; + var binary_format_contract_1 = require_binary_format_contract(); + var reflection_info_1 = require_reflection_info(); + var reflection_long_convert_1 = require_reflection_long_convert(); + var reflection_scalar_default_1 = require_reflection_scalar_default(); + + class ReflectionBinaryReader { + constructor(info) { + this.info = info; + } + prepare() { + var _a; + if (!this.fieldNoToField) { + const fieldsInput = (_a = this.info.fields) !== null && _a !== undefined ? _a : []; + this.fieldNoToField = new Map(fieldsInput.map((field) => [field.no, field])); + } + } + read(reader, message, options, length) { + this.prepare(); + const end = length === undefined ? reader.len : reader.pos + length; + while (reader.pos < end) { + const [fieldNo, wireType] = reader.tag(), field = this.fieldNoToField.get(fieldNo); + if (!field) { + let u = options.readUnknownField; + if (u == "throw") + throw new Error(`Unknown field ${fieldNo} (wire type ${wireType}) for ${this.info.typeName}`); + let d = reader.skip(wireType); + if (u !== false) + (u === true ? binary_format_contract_1.UnknownFieldHandler.onRead : u)(this.info.typeName, message, fieldNo, wireType, d); + continue; + } + let target = message, repeated = field.repeat, localName = field.localName; + if (field.oneof) { + target = target[field.oneof]; + if (target.oneofKind !== localName) + target = message[field.oneof] = { + oneofKind: localName + }; + } + switch (field.kind) { + case "scalar": + case "enum": + let T = field.kind == "enum" ? reflection_info_1.ScalarType.INT32 : field.T; + let L = field.kind == "scalar" ? field.L : undefined; + if (repeated) { + let arr = target[localName]; + if (wireType == binary_format_contract_1.WireType.LengthDelimited && T != reflection_info_1.ScalarType.STRING && T != reflection_info_1.ScalarType.BYTES) { + let e = reader.uint32() + reader.pos; + while (reader.pos < e) + arr.push(this.scalar(reader, T, L)); + } else + arr.push(this.scalar(reader, T, L)); + } else + target[localName] = this.scalar(reader, T, L); + break; + case "message": + if (repeated) { + let arr = target[localName]; + let msg = field.T().internalBinaryRead(reader, reader.uint32(), options); + arr.push(msg); + } else + target[localName] = field.T().internalBinaryRead(reader, reader.uint32(), options, target[localName]); + break; + case "map": + let [mapKey, mapVal] = this.mapEntry(field, reader, options); + target[localName][mapKey] = mapVal; + break; + } + } + } + mapEntry(field, reader, options) { + let length = reader.uint32(); + let end = reader.pos + length; + let key = undefined; + let val2 = undefined; + while (reader.pos < end) { + let [fieldNo, wireType] = reader.tag(); + switch (fieldNo) { + case 1: + if (field.K == reflection_info_1.ScalarType.BOOL) + key = reader.bool().toString(); + else + key = this.scalar(reader, field.K, reflection_info_1.LongType.STRING); + break; + case 2: + switch (field.V.kind) { + case "scalar": + val2 = this.scalar(reader, field.V.T, field.V.L); + break; + case "enum": + val2 = reader.int32(); + break; + case "message": + val2 = field.V.T().internalBinaryRead(reader, reader.uint32(), options); + break; + } + break; + default: + throw new Error(`Unknown field ${fieldNo} (wire type ${wireType}) in map entry for ${this.info.typeName}#${field.name}`); + } + } + if (key === undefined) { + let keyRaw = reflection_scalar_default_1.reflectionScalarDefault(field.K); + key = field.K == reflection_info_1.ScalarType.BOOL ? keyRaw.toString() : keyRaw; + } + if (val2 === undefined) + switch (field.V.kind) { + case "scalar": + val2 = reflection_scalar_default_1.reflectionScalarDefault(field.V.T, field.V.L); + break; + case "enum": + val2 = 0; + break; + case "message": + val2 = field.V.T().create(); + break; + } + return [key, val2]; + } + scalar(reader, type, longType) { + switch (type) { + case reflection_info_1.ScalarType.INT32: + return reader.int32(); + case reflection_info_1.ScalarType.STRING: + return reader.string(); + case reflection_info_1.ScalarType.BOOL: + return reader.bool(); + case reflection_info_1.ScalarType.DOUBLE: + return reader.double(); + case reflection_info_1.ScalarType.FLOAT: + return reader.float(); + case reflection_info_1.ScalarType.INT64: + return reflection_long_convert_1.reflectionLongConvert(reader.int64(), longType); + case reflection_info_1.ScalarType.UINT64: + return reflection_long_convert_1.reflectionLongConvert(reader.uint64(), longType); + case reflection_info_1.ScalarType.FIXED64: + return reflection_long_convert_1.reflectionLongConvert(reader.fixed64(), longType); + case reflection_info_1.ScalarType.FIXED32: + return reader.fixed32(); + case reflection_info_1.ScalarType.BYTES: + return reader.bytes(); + case reflection_info_1.ScalarType.UINT32: + return reader.uint32(); + case reflection_info_1.ScalarType.SFIXED32: + return reader.sfixed32(); + case reflection_info_1.ScalarType.SFIXED64: + return reflection_long_convert_1.reflectionLongConvert(reader.sfixed64(), longType); + case reflection_info_1.ScalarType.SINT32: + return reader.sint32(); + case reflection_info_1.ScalarType.SINT64: + return reflection_long_convert_1.reflectionLongConvert(reader.sint64(), longType); + } + } + } + exports2.ReflectionBinaryReader = ReflectionBinaryReader; +}); + +// node_modules/@protobuf-ts/runtime/build/commonjs/reflection-binary-writer.js +var require_reflection_binary_writer = __commonJS((exports2) => { + Object.defineProperty(exports2, "__esModule", { value: true }); + exports2.ReflectionBinaryWriter = undefined; + var binary_format_contract_1 = require_binary_format_contract(); + var reflection_info_1 = require_reflection_info(); + var assert_1 = require_assert(); + var pb_long_1 = require_pb_long(); + + class ReflectionBinaryWriter { + constructor(info) { + this.info = info; + } + prepare() { + if (!this.fields) { + const fieldsInput = this.info.fields ? this.info.fields.concat() : []; + this.fields = fieldsInput.sort((a, b) => a.no - b.no); + } + } + write(message, writer, options) { + this.prepare(); + for (const field of this.fields) { + let value, emitDefault, repeated = field.repeat, localName = field.localName; + if (field.oneof) { + const group = message[field.oneof]; + if (group.oneofKind !== localName) + continue; + value = group[localName]; + emitDefault = true; + } else { + value = message[localName]; + emitDefault = false; + } + switch (field.kind) { + case "scalar": + case "enum": + let T = field.kind == "enum" ? reflection_info_1.ScalarType.INT32 : field.T; + if (repeated) { + assert_1.assert(Array.isArray(value)); + if (repeated == reflection_info_1.RepeatType.PACKED) + this.packed(writer, T, field.no, value); + else + for (const item of value) + this.scalar(writer, T, field.no, item, true); + } else if (value === undefined) + assert_1.assert(field.opt); + else + this.scalar(writer, T, field.no, value, emitDefault || field.opt); + break; + case "message": + if (repeated) { + assert_1.assert(Array.isArray(value)); + for (const item of value) + this.message(writer, options, field.T(), field.no, item); + } else { + this.message(writer, options, field.T(), field.no, value); + } + break; + case "map": + assert_1.assert(typeof value == "object" && value !== null); + for (const [key, val2] of Object.entries(value)) + this.mapEntry(writer, options, field, key, val2); + break; + } + } + let u = options.writeUnknownFields; + if (u !== false) + (u === true ? binary_format_contract_1.UnknownFieldHandler.onWrite : u)(this.info.typeName, message, writer); + } + mapEntry(writer, options, field, key, value) { + writer.tag(field.no, binary_format_contract_1.WireType.LengthDelimited); + writer.fork(); + let keyValue = key; + switch (field.K) { + case reflection_info_1.ScalarType.INT32: + case reflection_info_1.ScalarType.FIXED32: + case reflection_info_1.ScalarType.UINT32: + case reflection_info_1.ScalarType.SFIXED32: + case reflection_info_1.ScalarType.SINT32: + keyValue = Number.parseInt(key); + break; + case reflection_info_1.ScalarType.BOOL: + assert_1.assert(key == "true" || key == "false"); + keyValue = key == "true"; + break; + } + this.scalar(writer, field.K, 1, keyValue, true); + switch (field.V.kind) { + case "scalar": + this.scalar(writer, field.V.T, 2, value, true); + break; + case "enum": + this.scalar(writer, reflection_info_1.ScalarType.INT32, 2, value, true); + break; + case "message": + this.message(writer, options, field.V.T(), 2, value); + break; + } + writer.join(); + } + message(writer, options, handler, fieldNo, value) { + if (value === undefined) + return; + handler.internalBinaryWrite(value, writer.tag(fieldNo, binary_format_contract_1.WireType.LengthDelimited).fork(), options); + writer.join(); + } + scalar(writer, type, fieldNo, value, emitDefault) { + let [wireType, method, isDefault] = this.scalarInfo(type, value); + if (!isDefault || emitDefault) { + writer.tag(fieldNo, wireType); + writer[method](value); + } + } + packed(writer, type, fieldNo, value) { + if (!value.length) + return; + assert_1.assert(type !== reflection_info_1.ScalarType.BYTES && type !== reflection_info_1.ScalarType.STRING); + writer.tag(fieldNo, binary_format_contract_1.WireType.LengthDelimited); + writer.fork(); + let [, method] = this.scalarInfo(type); + for (let i = 0;i < value.length; i++) + writer[method](value[i]); + writer.join(); + } + scalarInfo(type, value) { + let t = binary_format_contract_1.WireType.Varint; + let m; + let i = value === undefined; + let d = value === 0; + switch (type) { + case reflection_info_1.ScalarType.INT32: + m = "int32"; + break; + case reflection_info_1.ScalarType.STRING: + d = i || !value.length; + t = binary_format_contract_1.WireType.LengthDelimited; + m = "string"; + break; + case reflection_info_1.ScalarType.BOOL: + d = value === false; + m = "bool"; + break; + case reflection_info_1.ScalarType.UINT32: + m = "uint32"; + break; + case reflection_info_1.ScalarType.DOUBLE: + t = binary_format_contract_1.WireType.Bit64; + m = "double"; + break; + case reflection_info_1.ScalarType.FLOAT: + t = binary_format_contract_1.WireType.Bit32; + m = "float"; + break; + case reflection_info_1.ScalarType.INT64: + d = i || pb_long_1.PbLong.from(value).isZero(); + m = "int64"; + break; + case reflection_info_1.ScalarType.UINT64: + d = i || pb_long_1.PbULong.from(value).isZero(); + m = "uint64"; + break; + case reflection_info_1.ScalarType.FIXED64: + d = i || pb_long_1.PbULong.from(value).isZero(); + t = binary_format_contract_1.WireType.Bit64; + m = "fixed64"; + break; + case reflection_info_1.ScalarType.BYTES: + d = i || !value.byteLength; + t = binary_format_contract_1.WireType.LengthDelimited; + m = "bytes"; + break; + case reflection_info_1.ScalarType.FIXED32: + t = binary_format_contract_1.WireType.Bit32; + m = "fixed32"; + break; + case reflection_info_1.ScalarType.SFIXED32: + t = binary_format_contract_1.WireType.Bit32; + m = "sfixed32"; + break; + case reflection_info_1.ScalarType.SFIXED64: + d = i || pb_long_1.PbLong.from(value).isZero(); + t = binary_format_contract_1.WireType.Bit64; + m = "sfixed64"; + break; + case reflection_info_1.ScalarType.SINT32: + m = "sint32"; + break; + case reflection_info_1.ScalarType.SINT64: + d = i || pb_long_1.PbLong.from(value).isZero(); + m = "sint64"; + break; + } + return [t, m, i || d]; + } + } + exports2.ReflectionBinaryWriter = ReflectionBinaryWriter; +}); + +// node_modules/@protobuf-ts/runtime/build/commonjs/reflection-create.js +var require_reflection_create = __commonJS((exports2) => { + Object.defineProperty(exports2, "__esModule", { value: true }); + exports2.reflectionCreate = undefined; + var reflection_scalar_default_1 = require_reflection_scalar_default(); + var message_type_contract_1 = require_message_type_contract(); + function reflectionCreate(type) { + const msg = type.messagePrototype ? Object.create(type.messagePrototype) : Object.defineProperty({}, message_type_contract_1.MESSAGE_TYPE, { value: type }); + for (let field of type.fields) { + let name = field.localName; + if (field.opt) + continue; + if (field.oneof) + msg[field.oneof] = { oneofKind: undefined }; + else if (field.repeat) + msg[name] = []; + else + switch (field.kind) { + case "scalar": + msg[name] = reflection_scalar_default_1.reflectionScalarDefault(field.T, field.L); + break; + case "enum": + msg[name] = 0; + break; + case "map": + msg[name] = {}; + break; + } + } + return msg; + } + exports2.reflectionCreate = reflectionCreate; +}); + +// node_modules/@protobuf-ts/runtime/build/commonjs/reflection-merge-partial.js +var require_reflection_merge_partial = __commonJS((exports2) => { + Object.defineProperty(exports2, "__esModule", { value: true }); + exports2.reflectionMergePartial = undefined; + function reflectionMergePartial(info, target, source) { + let fieldValue, input = source, output; + for (let field of info.fields) { + let name = field.localName; + if (field.oneof) { + const group = input[field.oneof]; + if ((group === null || group === undefined ? undefined : group.oneofKind) == undefined) { + continue; + } + fieldValue = group[name]; + output = target[field.oneof]; + output.oneofKind = group.oneofKind; + if (fieldValue == undefined) { + delete output[name]; + continue; + } + } else { + fieldValue = input[name]; + output = target; + if (fieldValue == undefined) { + continue; + } + } + if (field.repeat) + output[name].length = fieldValue.length; + switch (field.kind) { + case "scalar": + case "enum": + if (field.repeat) + for (let i = 0;i < fieldValue.length; i++) + output[name][i] = fieldValue[i]; + else + output[name] = fieldValue; + break; + case "message": + let T = field.T(); + if (field.repeat) + for (let i = 0;i < fieldValue.length; i++) + output[name][i] = T.create(fieldValue[i]); + else if (output[name] === undefined) + output[name] = T.create(fieldValue); + else + T.mergePartial(output[name], fieldValue); + break; + case "map": + switch (field.V.kind) { + case "scalar": + case "enum": + Object.assign(output[name], fieldValue); + break; + case "message": + let T2 = field.V.T(); + for (let k of Object.keys(fieldValue)) + output[name][k] = T2.create(fieldValue[k]); + break; + } + break; + } + } + } + exports2.reflectionMergePartial = reflectionMergePartial; +}); + +// node_modules/@protobuf-ts/runtime/build/commonjs/reflection-equals.js +var require_reflection_equals = __commonJS((exports2) => { + Object.defineProperty(exports2, "__esModule", { value: true }); + exports2.reflectionEquals = undefined; + var reflection_info_1 = require_reflection_info(); + function reflectionEquals(info, a, b) { + if (a === b) + return true; + if (!a || !b) + return false; + for (let field of info.fields) { + let localName = field.localName; + let val_a = field.oneof ? a[field.oneof][localName] : a[localName]; + let val_b = field.oneof ? b[field.oneof][localName] : b[localName]; + switch (field.kind) { + case "enum": + case "scalar": + let t = field.kind == "enum" ? reflection_info_1.ScalarType.INT32 : field.T; + if (!(field.repeat ? repeatedPrimitiveEq(t, val_a, val_b) : primitiveEq(t, val_a, val_b))) + return false; + break; + case "map": + if (!(field.V.kind == "message" ? repeatedMsgEq(field.V.T(), objectValues(val_a), objectValues(val_b)) : repeatedPrimitiveEq(field.V.kind == "enum" ? reflection_info_1.ScalarType.INT32 : field.V.T, objectValues(val_a), objectValues(val_b)))) + return false; + break; + case "message": + let T = field.T(); + if (!(field.repeat ? repeatedMsgEq(T, val_a, val_b) : T.equals(val_a, val_b))) + return false; + break; + } + } + return true; + } + exports2.reflectionEquals = reflectionEquals; + var objectValues = Object.values; + function primitiveEq(type, a, b) { + if (a === b) + return true; + if (type !== reflection_info_1.ScalarType.BYTES) + return false; + let ba = a; + let bb = b; + if (ba.length !== bb.length) + return false; + for (let i = 0;i < ba.length; i++) + if (ba[i] != bb[i]) + return false; + return true; + } + function repeatedPrimitiveEq(type, a, b) { + if (a.length !== b.length) + return false; + for (let i = 0;i < a.length; i++) + if (!primitiveEq(type, a[i], b[i])) + return false; + return true; + } + function repeatedMsgEq(type, a, b) { + if (a.length !== b.length) + return false; + for (let i = 0;i < a.length; i++) + if (!type.equals(a[i], b[i])) + return false; + return true; + } +}); + +// node_modules/@protobuf-ts/runtime/build/commonjs/message-type.js +var require_message_type = __commonJS((exports2) => { + Object.defineProperty(exports2, "__esModule", { value: true }); + exports2.MessageType = undefined; + var message_type_contract_1 = require_message_type_contract(); + var reflection_info_1 = require_reflection_info(); + var reflection_type_check_1 = require_reflection_type_check(); + var reflection_json_reader_1 = require_reflection_json_reader(); + var reflection_json_writer_1 = require_reflection_json_writer(); + var reflection_binary_reader_1 = require_reflection_binary_reader(); + var reflection_binary_writer_1 = require_reflection_binary_writer(); + var reflection_create_1 = require_reflection_create(); + var reflection_merge_partial_1 = require_reflection_merge_partial(); + var json_typings_1 = require_json_typings(); + var json_format_contract_1 = require_json_format_contract(); + var reflection_equals_1 = require_reflection_equals(); + var binary_writer_1 = require_binary_writer(); + var binary_reader_1 = require_binary_reader(); + var baseDescriptors = Object.getOwnPropertyDescriptors(Object.getPrototypeOf({})); + + class MessageType { + constructor(name, fields, options) { + this.defaultCheckDepth = 16; + this.typeName = name; + this.fields = fields.map(reflection_info_1.normalizeFieldInfo); + this.options = options !== null && options !== undefined ? options : {}; + this.messagePrototype = Object.create(null, Object.assign(Object.assign({}, baseDescriptors), { [message_type_contract_1.MESSAGE_TYPE]: { value: this } })); + this.refTypeCheck = new reflection_type_check_1.ReflectionTypeCheck(this); + this.refJsonReader = new reflection_json_reader_1.ReflectionJsonReader(this); + this.refJsonWriter = new reflection_json_writer_1.ReflectionJsonWriter(this); + this.refBinReader = new reflection_binary_reader_1.ReflectionBinaryReader(this); + this.refBinWriter = new reflection_binary_writer_1.ReflectionBinaryWriter(this); + } + create(value) { + let message = reflection_create_1.reflectionCreate(this); + if (value !== undefined) { + reflection_merge_partial_1.reflectionMergePartial(this, message, value); + } + return message; + } + clone(message) { + let copy = this.create(); + reflection_merge_partial_1.reflectionMergePartial(this, copy, message); + return copy; + } + equals(a, b) { + return reflection_equals_1.reflectionEquals(this, a, b); + } + is(arg, depth = this.defaultCheckDepth) { + return this.refTypeCheck.is(arg, depth, false); + } + isAssignable(arg, depth = this.defaultCheckDepth) { + return this.refTypeCheck.is(arg, depth, true); + } + mergePartial(target, source) { + reflection_merge_partial_1.reflectionMergePartial(this, target, source); + } + fromBinary(data, options) { + let opt = binary_reader_1.binaryReadOptions(options); + return this.internalBinaryRead(opt.readerFactory(data), data.byteLength, opt); + } + fromJson(json, options) { + return this.internalJsonRead(json, json_format_contract_1.jsonReadOptions(options)); + } + fromJsonString(json, options) { + let value = JSON.parse(json); + return this.fromJson(value, options); + } + toJson(message, options) { + return this.internalJsonWrite(message, json_format_contract_1.jsonWriteOptions(options)); + } + toJsonString(message, options) { + var _a; + let value = this.toJson(message, options); + return JSON.stringify(value, null, (_a = options === null || options === undefined ? undefined : options.prettySpaces) !== null && _a !== undefined ? _a : 0); + } + toBinary(message, options) { + let opt = binary_writer_1.binaryWriteOptions(options); + return this.internalBinaryWrite(message, opt.writerFactory(), opt).finish(); + } + internalJsonRead(json, options, target) { + if (json !== null && typeof json == "object" && !Array.isArray(json)) { + let message = target !== null && target !== undefined ? target : this.create(); + this.refJsonReader.read(json, message, options); + return message; + } + throw new Error(`Unable to parse message ${this.typeName} from JSON ${json_typings_1.typeofJsonValue(json)}.`); + } + internalJsonWrite(message, options) { + return this.refJsonWriter.write(message, options); + } + internalBinaryWrite(message, writer, options) { + this.refBinWriter.write(message, writer, options); + return writer; + } + internalBinaryRead(reader, length, options, target) { + let message = target !== null && target !== undefined ? target : this.create(); + this.refBinReader.read(reader, message, options, length); + return message; + } + } + exports2.MessageType = MessageType; +}); + +// node_modules/@protobuf-ts/runtime/build/commonjs/reflection-contains-message-type.js +var require_reflection_contains_message_type = __commonJS((exports2) => { + Object.defineProperty(exports2, "__esModule", { value: true }); + exports2.containsMessageType = undefined; + var message_type_contract_1 = require_message_type_contract(); + function containsMessageType(msg) { + return msg[message_type_contract_1.MESSAGE_TYPE] != null; + } + exports2.containsMessageType = containsMessageType; +}); + +// node_modules/@protobuf-ts/runtime/build/commonjs/enum-object.js +var require_enum_object = __commonJS((exports2) => { + Object.defineProperty(exports2, "__esModule", { value: true }); + exports2.listEnumNumbers = exports2.listEnumNames = exports2.listEnumValues = exports2.isEnumObject = undefined; + function isEnumObject(arg) { + if (typeof arg != "object" || arg === null) { + return false; + } + if (!arg.hasOwnProperty(0)) { + return false; + } + for (let k of Object.keys(arg)) { + let num = parseInt(k); + if (!Number.isNaN(num)) { + let nam = arg[num]; + if (nam === undefined) + return false; + if (arg[nam] !== num) + return false; + } else { + let num2 = arg[k]; + if (num2 === undefined) + return false; + if (typeof num2 !== "number") + return false; + if (arg[num2] === undefined) + return false; + } + } + return true; + } + exports2.isEnumObject = isEnumObject; + function listEnumValues(enumObject) { + if (!isEnumObject(enumObject)) + throw new Error("not a typescript enum object"); + let values = []; + for (let [name, number] of Object.entries(enumObject)) + if (typeof number == "number") + values.push({ name, number }); + return values; + } + exports2.listEnumValues = listEnumValues; + function listEnumNames(enumObject) { + return listEnumValues(enumObject).map((val2) => val2.name); + } + exports2.listEnumNames = listEnumNames; + function listEnumNumbers(enumObject) { + return listEnumValues(enumObject).map((val2) => val2.number).filter((num, index, arr) => arr.indexOf(num) == index); + } + exports2.listEnumNumbers = listEnumNumbers; +}); + +// node_modules/@protobuf-ts/runtime/build/commonjs/index.js +var require_commonjs = __commonJS((exports2) => { + Object.defineProperty(exports2, "__esModule", { value: true }); + var json_typings_1 = require_json_typings(); + Object.defineProperty(exports2, "typeofJsonValue", { enumerable: true, get: function() { + return json_typings_1.typeofJsonValue; + } }); + Object.defineProperty(exports2, "isJsonObject", { enumerable: true, get: function() { + return json_typings_1.isJsonObject; + } }); + var base64_1 = require_base64(); + Object.defineProperty(exports2, "base64decode", { enumerable: true, get: function() { + return base64_1.base64decode; + } }); + Object.defineProperty(exports2, "base64encode", { enumerable: true, get: function() { + return base64_1.base64encode; + } }); + var protobufjs_utf8_1 = require_protobufjs_utf8(); + Object.defineProperty(exports2, "utf8read", { enumerable: true, get: function() { + return protobufjs_utf8_1.utf8read; + } }); + var binary_format_contract_1 = require_binary_format_contract(); + Object.defineProperty(exports2, "WireType", { enumerable: true, get: function() { + return binary_format_contract_1.WireType; + } }); + Object.defineProperty(exports2, "mergeBinaryOptions", { enumerable: true, get: function() { + return binary_format_contract_1.mergeBinaryOptions; + } }); + Object.defineProperty(exports2, "UnknownFieldHandler", { enumerable: true, get: function() { + return binary_format_contract_1.UnknownFieldHandler; + } }); + var binary_reader_1 = require_binary_reader(); + Object.defineProperty(exports2, "BinaryReader", { enumerable: true, get: function() { + return binary_reader_1.BinaryReader; + } }); + Object.defineProperty(exports2, "binaryReadOptions", { enumerable: true, get: function() { + return binary_reader_1.binaryReadOptions; + } }); + var binary_writer_1 = require_binary_writer(); + Object.defineProperty(exports2, "BinaryWriter", { enumerable: true, get: function() { + return binary_writer_1.BinaryWriter; + } }); + Object.defineProperty(exports2, "binaryWriteOptions", { enumerable: true, get: function() { + return binary_writer_1.binaryWriteOptions; + } }); + var pb_long_1 = require_pb_long(); + Object.defineProperty(exports2, "PbLong", { enumerable: true, get: function() { + return pb_long_1.PbLong; + } }); + Object.defineProperty(exports2, "PbULong", { enumerable: true, get: function() { + return pb_long_1.PbULong; + } }); + var json_format_contract_1 = require_json_format_contract(); + Object.defineProperty(exports2, "jsonReadOptions", { enumerable: true, get: function() { + return json_format_contract_1.jsonReadOptions; + } }); + Object.defineProperty(exports2, "jsonWriteOptions", { enumerable: true, get: function() { + return json_format_contract_1.jsonWriteOptions; + } }); + Object.defineProperty(exports2, "mergeJsonOptions", { enumerable: true, get: function() { + return json_format_contract_1.mergeJsonOptions; + } }); + var message_type_contract_1 = require_message_type_contract(); + Object.defineProperty(exports2, "MESSAGE_TYPE", { enumerable: true, get: function() { + return message_type_contract_1.MESSAGE_TYPE; + } }); + var message_type_1 = require_message_type(); + Object.defineProperty(exports2, "MessageType", { enumerable: true, get: function() { + return message_type_1.MessageType; + } }); + var reflection_info_1 = require_reflection_info(); + Object.defineProperty(exports2, "ScalarType", { enumerable: true, get: function() { + return reflection_info_1.ScalarType; + } }); + Object.defineProperty(exports2, "LongType", { enumerable: true, get: function() { + return reflection_info_1.LongType; + } }); + Object.defineProperty(exports2, "RepeatType", { enumerable: true, get: function() { + return reflection_info_1.RepeatType; + } }); + Object.defineProperty(exports2, "normalizeFieldInfo", { enumerable: true, get: function() { + return reflection_info_1.normalizeFieldInfo; + } }); + Object.defineProperty(exports2, "readFieldOptions", { enumerable: true, get: function() { + return reflection_info_1.readFieldOptions; + } }); + Object.defineProperty(exports2, "readFieldOption", { enumerable: true, get: function() { + return reflection_info_1.readFieldOption; + } }); + Object.defineProperty(exports2, "readMessageOption", { enumerable: true, get: function() { + return reflection_info_1.readMessageOption; + } }); + var reflection_type_check_1 = require_reflection_type_check(); + Object.defineProperty(exports2, "ReflectionTypeCheck", { enumerable: true, get: function() { + return reflection_type_check_1.ReflectionTypeCheck; + } }); + var reflection_create_1 = require_reflection_create(); + Object.defineProperty(exports2, "reflectionCreate", { enumerable: true, get: function() { + return reflection_create_1.reflectionCreate; + } }); + var reflection_scalar_default_1 = require_reflection_scalar_default(); + Object.defineProperty(exports2, "reflectionScalarDefault", { enumerable: true, get: function() { + return reflection_scalar_default_1.reflectionScalarDefault; + } }); + var reflection_merge_partial_1 = require_reflection_merge_partial(); + Object.defineProperty(exports2, "reflectionMergePartial", { enumerable: true, get: function() { + return reflection_merge_partial_1.reflectionMergePartial; + } }); + var reflection_equals_1 = require_reflection_equals(); + Object.defineProperty(exports2, "reflectionEquals", { enumerable: true, get: function() { + return reflection_equals_1.reflectionEquals; + } }); + var reflection_binary_reader_1 = require_reflection_binary_reader(); + Object.defineProperty(exports2, "ReflectionBinaryReader", { enumerable: true, get: function() { + return reflection_binary_reader_1.ReflectionBinaryReader; + } }); + var reflection_binary_writer_1 = require_reflection_binary_writer(); + Object.defineProperty(exports2, "ReflectionBinaryWriter", { enumerable: true, get: function() { + return reflection_binary_writer_1.ReflectionBinaryWriter; + } }); + var reflection_json_reader_1 = require_reflection_json_reader(); + Object.defineProperty(exports2, "ReflectionJsonReader", { enumerable: true, get: function() { + return reflection_json_reader_1.ReflectionJsonReader; + } }); + var reflection_json_writer_1 = require_reflection_json_writer(); + Object.defineProperty(exports2, "ReflectionJsonWriter", { enumerable: true, get: function() { + return reflection_json_writer_1.ReflectionJsonWriter; + } }); + var reflection_contains_message_type_1 = require_reflection_contains_message_type(); + Object.defineProperty(exports2, "containsMessageType", { enumerable: true, get: function() { + return reflection_contains_message_type_1.containsMessageType; + } }); + var oneof_1 = require_oneof(); + Object.defineProperty(exports2, "isOneofGroup", { enumerable: true, get: function() { + return oneof_1.isOneofGroup; + } }); + Object.defineProperty(exports2, "setOneofValue", { enumerable: true, get: function() { + return oneof_1.setOneofValue; + } }); + Object.defineProperty(exports2, "getOneofValue", { enumerable: true, get: function() { + return oneof_1.getOneofValue; + } }); + Object.defineProperty(exports2, "clearOneofValue", { enumerable: true, get: function() { + return oneof_1.clearOneofValue; + } }); + Object.defineProperty(exports2, "getSelectedOneofValue", { enumerable: true, get: function() { + return oneof_1.getSelectedOneofValue; + } }); + var enum_object_1 = require_enum_object(); + Object.defineProperty(exports2, "listEnumValues", { enumerable: true, get: function() { + return enum_object_1.listEnumValues; + } }); + Object.defineProperty(exports2, "listEnumNames", { enumerable: true, get: function() { + return enum_object_1.listEnumNames; + } }); + Object.defineProperty(exports2, "listEnumNumbers", { enumerable: true, get: function() { + return enum_object_1.listEnumNumbers; + } }); + Object.defineProperty(exports2, "isEnumObject", { enumerable: true, get: function() { + return enum_object_1.isEnumObject; + } }); + var lower_camel_case_1 = require_lower_camel_case(); + Object.defineProperty(exports2, "lowerCamelCase", { enumerable: true, get: function() { + return lower_camel_case_1.lowerCamelCase; + } }); + var assert_1 = require_assert(); + Object.defineProperty(exports2, "assert", { enumerable: true, get: function() { + return assert_1.assert; + } }); + Object.defineProperty(exports2, "assertNever", { enumerable: true, get: function() { + return assert_1.assertNever; + } }); + Object.defineProperty(exports2, "assertInt32", { enumerable: true, get: function() { + return assert_1.assertInt32; + } }); + Object.defineProperty(exports2, "assertUInt32", { enumerable: true, get: function() { + return assert_1.assertUInt32; + } }); + Object.defineProperty(exports2, "assertFloat32", { enumerable: true, get: function() { + return assert_1.assertFloat32; + } }); +}); + +// node_modules/@actions/artifact/lib/generated/google/protobuf/timestamp.js +var require_timestamp = __commonJS((exports2) => { + Object.defineProperty(exports2, "__esModule", { value: true }); + exports2.Timestamp = undefined; + var runtime_1 = require_commonjs(); + var runtime_2 = require_commonjs(); + var runtime_3 = require_commonjs(); + var runtime_4 = require_commonjs(); + var runtime_5 = require_commonjs(); + var runtime_6 = require_commonjs(); + var runtime_7 = require_commonjs(); + + class Timestamp$Type extends runtime_7.MessageType { + constructor() { + super("google.protobuf.Timestamp", [ + { no: 1, name: "seconds", kind: "scalar", T: 3 }, + { no: 2, name: "nanos", kind: "scalar", T: 5 } + ]); + } + now() { + const msg = this.create(); + const ms = Date.now(); + msg.seconds = runtime_6.PbLong.from(Math.floor(ms / 1000)).toString(); + msg.nanos = ms % 1000 * 1e6; + return msg; + } + toDate(message) { + return new Date(runtime_6.PbLong.from(message.seconds).toNumber() * 1000 + Math.ceil(message.nanos / 1e6)); + } + fromDate(date) { + const msg = this.create(); + const ms = date.getTime(); + msg.seconds = runtime_6.PbLong.from(Math.floor(ms / 1000)).toString(); + msg.nanos = ms % 1000 * 1e6; + return msg; + } + internalJsonWrite(message, options) { + let ms = runtime_6.PbLong.from(message.seconds).toNumber() * 1000; + if (ms < Date.parse("0001-01-01T00:00:00Z") || ms > Date.parse("9999-12-31T23:59:59Z")) + throw new Error("Unable to encode Timestamp to JSON. Must be from 0001-01-01T00:00:00Z to 9999-12-31T23:59:59Z inclusive."); + if (message.nanos < 0) + throw new Error("Unable to encode invalid Timestamp to JSON. Nanos must not be negative."); + let z = "Z"; + if (message.nanos > 0) { + let nanosStr = (message.nanos + 1e9).toString().substring(1); + if (nanosStr.substring(3) === "000000") + z = "." + nanosStr.substring(0, 3) + "Z"; + else if (nanosStr.substring(6) === "000") + z = "." + nanosStr.substring(0, 6) + "Z"; + else + z = "." + nanosStr + "Z"; + } + return new Date(ms).toISOString().replace(".000Z", z); + } + internalJsonRead(json, options, target) { + if (typeof json !== "string") + throw new Error("Unable to parse Timestamp from JSON " + (0, runtime_5.typeofJsonValue)(json) + "."); + let matches = json.match(/^([0-9]{4})-([0-9]{2})-([0-9]{2})T([0-9]{2}):([0-9]{2}):([0-9]{2})(?:Z|\.([0-9]{3,9})Z|([+-][0-9][0-9]:[0-9][0-9]))$/); + if (!matches) + throw new Error("Unable to parse Timestamp from JSON. Invalid format."); + let ms = Date.parse(matches[1] + "-" + matches[2] + "-" + matches[3] + "T" + matches[4] + ":" + matches[5] + ":" + matches[6] + (matches[8] ? matches[8] : "Z")); + if (Number.isNaN(ms)) + throw new Error("Unable to parse Timestamp from JSON. Invalid value."); + if (ms < Date.parse("0001-01-01T00:00:00Z") || ms > Date.parse("9999-12-31T23:59:59Z")) + throw new globalThis.Error("Unable to parse Timestamp from JSON. Must be from 0001-01-01T00:00:00Z to 9999-12-31T23:59:59Z inclusive."); + if (!target) + target = this.create(); + target.seconds = runtime_6.PbLong.from(ms / 1000).toString(); + target.nanos = 0; + if (matches[7]) + target.nanos = parseInt("1" + matches[7] + "0".repeat(9 - matches[7].length)) - 1e9; + return target; + } + create(value) { + const message = { seconds: "0", nanos: 0 }; + globalThis.Object.defineProperty(message, runtime_4.MESSAGE_TYPE, { enumerable: false, value: this }); + if (value !== undefined) + (0, runtime_3.reflectionMergePartial)(this, message, value); + return message; + } + internalBinaryRead(reader, length, options, target) { + let message = target !== null && target !== undefined ? target : this.create(), end = reader.pos + length; + while (reader.pos < end) { + let [fieldNo, wireType] = reader.tag(); + switch (fieldNo) { + case 1: + message.seconds = reader.int64().toString(); + break; + case 2: + message.nanos = reader.int32(); + break; + default: + let u = options.readUnknownField; + if (u === "throw") + throw new globalThis.Error(`Unknown field ${fieldNo} (wire type ${wireType}) for ${this.typeName}`); + let d = reader.skip(wireType); + if (u !== false) + (u === true ? runtime_2.UnknownFieldHandler.onRead : u)(this.typeName, message, fieldNo, wireType, d); + } + } + return message; + } + internalBinaryWrite(message, writer, options) { + if (message.seconds !== "0") + writer.tag(1, runtime_1.WireType.Varint).int64(message.seconds); + if (message.nanos !== 0) + writer.tag(2, runtime_1.WireType.Varint).int32(message.nanos); + let u = options.writeUnknownFields; + if (u !== false) + (u == true ? runtime_2.UnknownFieldHandler.onWrite : u)(this.typeName, message, writer); + return writer; + } + } + exports2.Timestamp = new Timestamp$Type; +}); + +// node_modules/@actions/artifact/lib/generated/google/protobuf/wrappers.js +var require_wrappers = __commonJS((exports2) => { + Object.defineProperty(exports2, "__esModule", { value: true }); + exports2.BytesValue = exports2.StringValue = exports2.BoolValue = exports2.UInt32Value = exports2.Int32Value = exports2.UInt64Value = exports2.Int64Value = exports2.FloatValue = exports2.DoubleValue = undefined; + var runtime_1 = require_commonjs(); + var runtime_2 = require_commonjs(); + var runtime_3 = require_commonjs(); + var runtime_4 = require_commonjs(); + var runtime_5 = require_commonjs(); + var runtime_6 = require_commonjs(); + var runtime_7 = require_commonjs(); + + class DoubleValue$Type extends runtime_7.MessageType { + constructor() { + super("google.protobuf.DoubleValue", [ + { no: 1, name: "value", kind: "scalar", T: 1 } + ]); + } + internalJsonWrite(message, options) { + return this.refJsonWriter.scalar(2, message.value, "value", false, true); + } + internalJsonRead(json, options, target) { + if (!target) + target = this.create(); + target.value = this.refJsonReader.scalar(json, 1, undefined, "value"); + return target; + } + create(value) { + const message = { value: 0 }; + globalThis.Object.defineProperty(message, runtime_6.MESSAGE_TYPE, { enumerable: false, value: this }); + if (value !== undefined) + (0, runtime_5.reflectionMergePartial)(this, message, value); + return message; + } + internalBinaryRead(reader, length, options, target) { + let message = target !== null && target !== undefined ? target : this.create(), end = reader.pos + length; + while (reader.pos < end) { + let [fieldNo, wireType] = reader.tag(); + switch (fieldNo) { + case 1: + message.value = reader.double(); + break; + default: + let u = options.readUnknownField; + if (u === "throw") + throw new globalThis.Error(`Unknown field ${fieldNo} (wire type ${wireType}) for ${this.typeName}`); + let d = reader.skip(wireType); + if (u !== false) + (u === true ? runtime_4.UnknownFieldHandler.onRead : u)(this.typeName, message, fieldNo, wireType, d); + } + } + return message; + } + internalBinaryWrite(message, writer, options) { + if (message.value !== 0) + writer.tag(1, runtime_3.WireType.Bit64).double(message.value); + let u = options.writeUnknownFields; + if (u !== false) + (u == true ? runtime_4.UnknownFieldHandler.onWrite : u)(this.typeName, message, writer); + return writer; + } + } + exports2.DoubleValue = new DoubleValue$Type; + + class FloatValue$Type extends runtime_7.MessageType { + constructor() { + super("google.protobuf.FloatValue", [ + { no: 1, name: "value", kind: "scalar", T: 2 } + ]); + } + internalJsonWrite(message, options) { + return this.refJsonWriter.scalar(1, message.value, "value", false, true); + } + internalJsonRead(json, options, target) { + if (!target) + target = this.create(); + target.value = this.refJsonReader.scalar(json, 1, undefined, "value"); + return target; + } + create(value) { + const message = { value: 0 }; + globalThis.Object.defineProperty(message, runtime_6.MESSAGE_TYPE, { enumerable: false, value: this }); + if (value !== undefined) + (0, runtime_5.reflectionMergePartial)(this, message, value); + return message; + } + internalBinaryRead(reader, length, options, target) { + let message = target !== null && target !== undefined ? target : this.create(), end = reader.pos + length; + while (reader.pos < end) { + let [fieldNo, wireType] = reader.tag(); + switch (fieldNo) { + case 1: + message.value = reader.float(); + break; + default: + let u = options.readUnknownField; + if (u === "throw") + throw new globalThis.Error(`Unknown field ${fieldNo} (wire type ${wireType}) for ${this.typeName}`); + let d = reader.skip(wireType); + if (u !== false) + (u === true ? runtime_4.UnknownFieldHandler.onRead : u)(this.typeName, message, fieldNo, wireType, d); + } + } + return message; + } + internalBinaryWrite(message, writer, options) { + if (message.value !== 0) + writer.tag(1, runtime_3.WireType.Bit32).float(message.value); + let u = options.writeUnknownFields; + if (u !== false) + (u == true ? runtime_4.UnknownFieldHandler.onWrite : u)(this.typeName, message, writer); + return writer; + } + } + exports2.FloatValue = new FloatValue$Type; + + class Int64Value$Type extends runtime_7.MessageType { + constructor() { + super("google.protobuf.Int64Value", [ + { no: 1, name: "value", kind: "scalar", T: 3 } + ]); + } + internalJsonWrite(message, options) { + return this.refJsonWriter.scalar(runtime_1.ScalarType.INT64, message.value, "value", false, true); + } + internalJsonRead(json, options, target) { + if (!target) + target = this.create(); + target.value = this.refJsonReader.scalar(json, runtime_1.ScalarType.INT64, runtime_2.LongType.STRING, "value"); + return target; + } + create(value) { + const message = { value: "0" }; + globalThis.Object.defineProperty(message, runtime_6.MESSAGE_TYPE, { enumerable: false, value: this }); + if (value !== undefined) + (0, runtime_5.reflectionMergePartial)(this, message, value); + return message; + } + internalBinaryRead(reader, length, options, target) { + let message = target !== null && target !== undefined ? target : this.create(), end = reader.pos + length; + while (reader.pos < end) { + let [fieldNo, wireType] = reader.tag(); + switch (fieldNo) { + case 1: + message.value = reader.int64().toString(); + break; + default: + let u = options.readUnknownField; + if (u === "throw") + throw new globalThis.Error(`Unknown field ${fieldNo} (wire type ${wireType}) for ${this.typeName}`); + let d = reader.skip(wireType); + if (u !== false) + (u === true ? runtime_4.UnknownFieldHandler.onRead : u)(this.typeName, message, fieldNo, wireType, d); + } + } + return message; + } + internalBinaryWrite(message, writer, options) { + if (message.value !== "0") + writer.tag(1, runtime_3.WireType.Varint).int64(message.value); + let u = options.writeUnknownFields; + if (u !== false) + (u == true ? runtime_4.UnknownFieldHandler.onWrite : u)(this.typeName, message, writer); + return writer; + } + } + exports2.Int64Value = new Int64Value$Type; + + class UInt64Value$Type extends runtime_7.MessageType { + constructor() { + super("google.protobuf.UInt64Value", [ + { no: 1, name: "value", kind: "scalar", T: 4 } + ]); + } + internalJsonWrite(message, options) { + return this.refJsonWriter.scalar(runtime_1.ScalarType.UINT64, message.value, "value", false, true); + } + internalJsonRead(json, options, target) { + if (!target) + target = this.create(); + target.value = this.refJsonReader.scalar(json, runtime_1.ScalarType.UINT64, runtime_2.LongType.STRING, "value"); + return target; + } + create(value) { + const message = { value: "0" }; + globalThis.Object.defineProperty(message, runtime_6.MESSAGE_TYPE, { enumerable: false, value: this }); + if (value !== undefined) + (0, runtime_5.reflectionMergePartial)(this, message, value); + return message; + } + internalBinaryRead(reader, length, options, target) { + let message = target !== null && target !== undefined ? target : this.create(), end = reader.pos + length; + while (reader.pos < end) { + let [fieldNo, wireType] = reader.tag(); + switch (fieldNo) { + case 1: + message.value = reader.uint64().toString(); + break; + default: + let u = options.readUnknownField; + if (u === "throw") + throw new globalThis.Error(`Unknown field ${fieldNo} (wire type ${wireType}) for ${this.typeName}`); + let d = reader.skip(wireType); + if (u !== false) + (u === true ? runtime_4.UnknownFieldHandler.onRead : u)(this.typeName, message, fieldNo, wireType, d); + } + } + return message; + } + internalBinaryWrite(message, writer, options) { + if (message.value !== "0") + writer.tag(1, runtime_3.WireType.Varint).uint64(message.value); + let u = options.writeUnknownFields; + if (u !== false) + (u == true ? runtime_4.UnknownFieldHandler.onWrite : u)(this.typeName, message, writer); + return writer; + } + } + exports2.UInt64Value = new UInt64Value$Type; + + class Int32Value$Type extends runtime_7.MessageType { + constructor() { + super("google.protobuf.Int32Value", [ + { no: 1, name: "value", kind: "scalar", T: 5 } + ]); + } + internalJsonWrite(message, options) { + return this.refJsonWriter.scalar(5, message.value, "value", false, true); + } + internalJsonRead(json, options, target) { + if (!target) + target = this.create(); + target.value = this.refJsonReader.scalar(json, 5, undefined, "value"); + return target; + } + create(value) { + const message = { value: 0 }; + globalThis.Object.defineProperty(message, runtime_6.MESSAGE_TYPE, { enumerable: false, value: this }); + if (value !== undefined) + (0, runtime_5.reflectionMergePartial)(this, message, value); + return message; + } + internalBinaryRead(reader, length, options, target) { + let message = target !== null && target !== undefined ? target : this.create(), end = reader.pos + length; + while (reader.pos < end) { + let [fieldNo, wireType] = reader.tag(); + switch (fieldNo) { + case 1: + message.value = reader.int32(); + break; + default: + let u = options.readUnknownField; + if (u === "throw") + throw new globalThis.Error(`Unknown field ${fieldNo} (wire type ${wireType}) for ${this.typeName}`); + let d = reader.skip(wireType); + if (u !== false) + (u === true ? runtime_4.UnknownFieldHandler.onRead : u)(this.typeName, message, fieldNo, wireType, d); + } + } + return message; + } + internalBinaryWrite(message, writer, options) { + if (message.value !== 0) + writer.tag(1, runtime_3.WireType.Varint).int32(message.value); + let u = options.writeUnknownFields; + if (u !== false) + (u == true ? runtime_4.UnknownFieldHandler.onWrite : u)(this.typeName, message, writer); + return writer; + } + } + exports2.Int32Value = new Int32Value$Type; + + class UInt32Value$Type extends runtime_7.MessageType { + constructor() { + super("google.protobuf.UInt32Value", [ + { no: 1, name: "value", kind: "scalar", T: 13 } + ]); + } + internalJsonWrite(message, options) { + return this.refJsonWriter.scalar(13, message.value, "value", false, true); + } + internalJsonRead(json, options, target) { + if (!target) + target = this.create(); + target.value = this.refJsonReader.scalar(json, 13, undefined, "value"); + return target; + } + create(value) { + const message = { value: 0 }; + globalThis.Object.defineProperty(message, runtime_6.MESSAGE_TYPE, { enumerable: false, value: this }); + if (value !== undefined) + (0, runtime_5.reflectionMergePartial)(this, message, value); + return message; + } + internalBinaryRead(reader, length, options, target) { + let message = target !== null && target !== undefined ? target : this.create(), end = reader.pos + length; + while (reader.pos < end) { + let [fieldNo, wireType] = reader.tag(); + switch (fieldNo) { + case 1: + message.value = reader.uint32(); + break; + default: + let u = options.readUnknownField; + if (u === "throw") + throw new globalThis.Error(`Unknown field ${fieldNo} (wire type ${wireType}) for ${this.typeName}`); + let d = reader.skip(wireType); + if (u !== false) + (u === true ? runtime_4.UnknownFieldHandler.onRead : u)(this.typeName, message, fieldNo, wireType, d); + } + } + return message; + } + internalBinaryWrite(message, writer, options) { + if (message.value !== 0) + writer.tag(1, runtime_3.WireType.Varint).uint32(message.value); + let u = options.writeUnknownFields; + if (u !== false) + (u == true ? runtime_4.UnknownFieldHandler.onWrite : u)(this.typeName, message, writer); + return writer; + } + } + exports2.UInt32Value = new UInt32Value$Type; + + class BoolValue$Type extends runtime_7.MessageType { + constructor() { + super("google.protobuf.BoolValue", [ + { no: 1, name: "value", kind: "scalar", T: 8 } + ]); + } + internalJsonWrite(message, options) { + return message.value; + } + internalJsonRead(json, options, target) { + if (!target) + target = this.create(); + target.value = this.refJsonReader.scalar(json, 8, undefined, "value"); + return target; + } + create(value) { + const message = { value: false }; + globalThis.Object.defineProperty(message, runtime_6.MESSAGE_TYPE, { enumerable: false, value: this }); + if (value !== undefined) + (0, runtime_5.reflectionMergePartial)(this, message, value); + return message; + } + internalBinaryRead(reader, length, options, target) { + let message = target !== null && target !== undefined ? target : this.create(), end = reader.pos + length; + while (reader.pos < end) { + let [fieldNo, wireType] = reader.tag(); + switch (fieldNo) { + case 1: + message.value = reader.bool(); + break; + default: + let u = options.readUnknownField; + if (u === "throw") + throw new globalThis.Error(`Unknown field ${fieldNo} (wire type ${wireType}) for ${this.typeName}`); + let d = reader.skip(wireType); + if (u !== false) + (u === true ? runtime_4.UnknownFieldHandler.onRead : u)(this.typeName, message, fieldNo, wireType, d); + } + } + return message; + } + internalBinaryWrite(message, writer, options) { + if (message.value !== false) + writer.tag(1, runtime_3.WireType.Varint).bool(message.value); + let u = options.writeUnknownFields; + if (u !== false) + (u == true ? runtime_4.UnknownFieldHandler.onWrite : u)(this.typeName, message, writer); + return writer; + } + } + exports2.BoolValue = new BoolValue$Type; + + class StringValue$Type extends runtime_7.MessageType { + constructor() { + super("google.protobuf.StringValue", [ + { no: 1, name: "value", kind: "scalar", T: 9 } + ]); + } + internalJsonWrite(message, options) { + return message.value; + } + internalJsonRead(json, options, target) { + if (!target) + target = this.create(); + target.value = this.refJsonReader.scalar(json, 9, undefined, "value"); + return target; + } + create(value) { + const message = { value: "" }; + globalThis.Object.defineProperty(message, runtime_6.MESSAGE_TYPE, { enumerable: false, value: this }); + if (value !== undefined) + (0, runtime_5.reflectionMergePartial)(this, message, value); + return message; + } + internalBinaryRead(reader, length, options, target) { + let message = target !== null && target !== undefined ? target : this.create(), end = reader.pos + length; + while (reader.pos < end) { + let [fieldNo, wireType] = reader.tag(); + switch (fieldNo) { + case 1: + message.value = reader.string(); + break; + default: + let u = options.readUnknownField; + if (u === "throw") + throw new globalThis.Error(`Unknown field ${fieldNo} (wire type ${wireType}) for ${this.typeName}`); + let d = reader.skip(wireType); + if (u !== false) + (u === true ? runtime_4.UnknownFieldHandler.onRead : u)(this.typeName, message, fieldNo, wireType, d); + } + } + return message; + } + internalBinaryWrite(message, writer, options) { + if (message.value !== "") + writer.tag(1, runtime_3.WireType.LengthDelimited).string(message.value); + let u = options.writeUnknownFields; + if (u !== false) + (u == true ? runtime_4.UnknownFieldHandler.onWrite : u)(this.typeName, message, writer); + return writer; + } + } + exports2.StringValue = new StringValue$Type; + + class BytesValue$Type extends runtime_7.MessageType { + constructor() { + super("google.protobuf.BytesValue", [ + { no: 1, name: "value", kind: "scalar", T: 12 } + ]); + } + internalJsonWrite(message, options) { + return this.refJsonWriter.scalar(12, message.value, "value", false, true); + } + internalJsonRead(json, options, target) { + if (!target) + target = this.create(); + target.value = this.refJsonReader.scalar(json, 12, undefined, "value"); + return target; + } + create(value) { + const message = { value: new Uint8Array(0) }; + globalThis.Object.defineProperty(message, runtime_6.MESSAGE_TYPE, { enumerable: false, value: this }); + if (value !== undefined) + (0, runtime_5.reflectionMergePartial)(this, message, value); + return message; + } + internalBinaryRead(reader, length, options, target) { + let message = target !== null && target !== undefined ? target : this.create(), end = reader.pos + length; + while (reader.pos < end) { + let [fieldNo, wireType] = reader.tag(); + switch (fieldNo) { + case 1: + message.value = reader.bytes(); + break; + default: + let u = options.readUnknownField; + if (u === "throw") + throw new globalThis.Error(`Unknown field ${fieldNo} (wire type ${wireType}) for ${this.typeName}`); + let d = reader.skip(wireType); + if (u !== false) + (u === true ? runtime_4.UnknownFieldHandler.onRead : u)(this.typeName, message, fieldNo, wireType, d); + } + } + return message; + } + internalBinaryWrite(message, writer, options) { + if (message.value.length) + writer.tag(1, runtime_3.WireType.LengthDelimited).bytes(message.value); + let u = options.writeUnknownFields; + if (u !== false) + (u == true ? runtime_4.UnknownFieldHandler.onWrite : u)(this.typeName, message, writer); + return writer; + } + } + exports2.BytesValue = new BytesValue$Type; +}); + +// node_modules/@protobuf-ts/runtime-rpc/build/commonjs/reflection-info.js +var require_reflection_info2 = __commonJS((exports2) => { + Object.defineProperty(exports2, "__esModule", { value: true }); + exports2.readServiceOption = exports2.readMethodOption = exports2.readMethodOptions = exports2.normalizeMethodInfo = undefined; + var runtime_1 = require_commonjs(); + function normalizeMethodInfo(method, service) { + var _a, _b, _c; + let m = method; + m.service = service; + m.localName = (_a = m.localName) !== null && _a !== undefined ? _a : runtime_1.lowerCamelCase(m.name); + m.serverStreaming = !!m.serverStreaming; + m.clientStreaming = !!m.clientStreaming; + m.options = (_b = m.options) !== null && _b !== undefined ? _b : {}; + m.idempotency = (_c = m.idempotency) !== null && _c !== undefined ? _c : undefined; + return m; + } + exports2.normalizeMethodInfo = normalizeMethodInfo; + function readMethodOptions(service, methodName, extensionName, extensionType) { + var _a; + const options = (_a = service.methods.find((m, i) => m.localName === methodName || i === methodName)) === null || _a === undefined ? undefined : _a.options; + return options && options[extensionName] ? extensionType.fromJson(options[extensionName]) : undefined; + } + exports2.readMethodOptions = readMethodOptions; + function readMethodOption(service, methodName, extensionName, extensionType) { + var _a; + const options = (_a = service.methods.find((m, i) => m.localName === methodName || i === methodName)) === null || _a === undefined ? undefined : _a.options; + if (!options) { + return; + } + const optionVal = options[extensionName]; + if (optionVal === undefined) { + return optionVal; + } + return extensionType ? extensionType.fromJson(optionVal) : optionVal; + } + exports2.readMethodOption = readMethodOption; + function readServiceOption(service, extensionName, extensionType) { + const options = service.options; + if (!options) { + return; + } + const optionVal = options[extensionName]; + if (optionVal === undefined) { + return optionVal; + } + return extensionType ? extensionType.fromJson(optionVal) : optionVal; + } + exports2.readServiceOption = readServiceOption; +}); + +// node_modules/@protobuf-ts/runtime-rpc/build/commonjs/service-type.js +var require_service_type = __commonJS((exports2) => { + Object.defineProperty(exports2, "__esModule", { value: true }); + exports2.ServiceType = undefined; + var reflection_info_1 = require_reflection_info2(); + + class ServiceType { + constructor(typeName, methods, options) { + this.typeName = typeName; + this.methods = methods.map((i) => reflection_info_1.normalizeMethodInfo(i, this)); + this.options = options !== null && options !== undefined ? options : {}; + } + } + exports2.ServiceType = ServiceType; +}); + +// node_modules/@protobuf-ts/runtime-rpc/build/commonjs/rpc-error.js +var require_rpc_error = __commonJS((exports2) => { + Object.defineProperty(exports2, "__esModule", { value: true }); + exports2.RpcError = undefined; + + class RpcError extends Error { + constructor(message, code = "UNKNOWN", meta) { + super(message); + this.name = "RpcError"; + Object.setPrototypeOf(this, new.target.prototype); + this.code = code; + this.meta = meta !== null && meta !== undefined ? meta : {}; + } + toString() { + const l = [this.name + ": " + this.message]; + if (this.code) { + l.push(""); + l.push("Code: " + this.code); + } + if (this.serviceName && this.methodName) { + l.push("Method: " + this.serviceName + "/" + this.methodName); + } + let m = Object.entries(this.meta); + if (m.length) { + l.push(""); + l.push("Meta:"); + for (let [k, v] of m) { + l.push(` ${k}: ${v}`); + } + } + return l.join("\n"); + } + } + exports2.RpcError = RpcError; +}); + +// node_modules/@protobuf-ts/runtime-rpc/build/commonjs/rpc-options.js +var require_rpc_options = __commonJS((exports2) => { + Object.defineProperty(exports2, "__esModule", { value: true }); + exports2.mergeRpcOptions = undefined; + var runtime_1 = require_commonjs(); + function mergeRpcOptions(defaults, options) { + if (!options) + return defaults; + let o = {}; + copy(defaults, o); + copy(options, o); + for (let key of Object.keys(options)) { + let val2 = options[key]; + switch (key) { + case "jsonOptions": + o.jsonOptions = runtime_1.mergeJsonOptions(defaults.jsonOptions, o.jsonOptions); + break; + case "binaryOptions": + o.binaryOptions = runtime_1.mergeBinaryOptions(defaults.binaryOptions, o.binaryOptions); + break; + case "meta": + o.meta = {}; + copy(defaults.meta, o.meta); + copy(options.meta, o.meta); + break; + case "interceptors": + o.interceptors = defaults.interceptors ? defaults.interceptors.concat(val2) : val2.concat(); + break; + } + } + return o; + } + exports2.mergeRpcOptions = mergeRpcOptions; + function copy(a, into) { + if (!a) + return; + let c = into; + for (let [k, v] of Object.entries(a)) { + if (v instanceof Date) + c[k] = new Date(v.getTime()); + else if (Array.isArray(v)) + c[k] = v.concat(); + else + c[k] = v; + } + } +}); + +// node_modules/@protobuf-ts/runtime-rpc/build/commonjs/deferred.js +var require_deferred = __commonJS((exports2) => { + Object.defineProperty(exports2, "__esModule", { value: true }); + exports2.Deferred = exports2.DeferredState = undefined; + var DeferredState; + (function(DeferredState2) { + DeferredState2[DeferredState2["PENDING"] = 0] = "PENDING"; + DeferredState2[DeferredState2["REJECTED"] = 1] = "REJECTED"; + DeferredState2[DeferredState2["RESOLVED"] = 2] = "RESOLVED"; + })(DeferredState = exports2.DeferredState || (exports2.DeferredState = {})); + + class Deferred { + constructor(preventUnhandledRejectionWarning = true) { + this._state = DeferredState.PENDING; + this._promise = new Promise((resolve, reject) => { + this._resolve = resolve; + this._reject = reject; + }); + if (preventUnhandledRejectionWarning) { + this._promise.catch((_2) => { + }); + } + } + get state() { + return this._state; + } + get promise() { + return this._promise; + } + resolve(value) { + if (this.state !== DeferredState.PENDING) + throw new Error(`cannot resolve ${DeferredState[this.state].toLowerCase()}`); + this._resolve(value); + this._state = DeferredState.RESOLVED; + } + reject(reason) { + if (this.state !== DeferredState.PENDING) + throw new Error(`cannot reject ${DeferredState[this.state].toLowerCase()}`); + this._reject(reason); + this._state = DeferredState.REJECTED; + } + resolvePending(val2) { + if (this._state === DeferredState.PENDING) + this.resolve(val2); + } + rejectPending(reason) { + if (this._state === DeferredState.PENDING) + this.reject(reason); + } + } + exports2.Deferred = Deferred; +}); + +// node_modules/@protobuf-ts/runtime-rpc/build/commonjs/rpc-output-stream.js +var require_rpc_output_stream = __commonJS((exports2) => { + Object.defineProperty(exports2, "__esModule", { value: true }); + exports2.RpcOutputStreamController = undefined; + var deferred_1 = require_deferred(); + var runtime_1 = require_commonjs(); + + class RpcOutputStreamController { + constructor() { + this._lis = { + nxt: [], + msg: [], + err: [], + cmp: [] + }; + this._closed = false; + } + onNext(callback) { + return this.addLis(callback, this._lis.nxt); + } + onMessage(callback) { + return this.addLis(callback, this._lis.msg); + } + onError(callback) { + return this.addLis(callback, this._lis.err); + } + onComplete(callback) { + return this.addLis(callback, this._lis.cmp); + } + addLis(callback, list) { + list.push(callback); + return () => { + let i = list.indexOf(callback); + if (i >= 0) + list.splice(i, 1); + }; + } + clearLis() { + for (let l of Object.values(this._lis)) + l.splice(0, l.length); + } + get closed() { + return this._closed !== false; + } + notifyNext(message, error, complete) { + runtime_1.assert((message ? 1 : 0) + (error ? 1 : 0) + (complete ? 1 : 0) <= 1, "only one emission at a time"); + if (message) + this.notifyMessage(message); + if (error) + this.notifyError(error); + if (complete) + this.notifyComplete(); + } + notifyMessage(message) { + runtime_1.assert(!this.closed, "stream is closed"); + this.pushIt({ value: message, done: false }); + this._lis.msg.forEach((l) => l(message)); + this._lis.nxt.forEach((l) => l(message, undefined, false)); + } + notifyError(error) { + runtime_1.assert(!this.closed, "stream is closed"); + this._closed = error; + this.pushIt(error); + this._lis.err.forEach((l) => l(error)); + this._lis.nxt.forEach((l) => l(undefined, error, false)); + this.clearLis(); + } + notifyComplete() { + runtime_1.assert(!this.closed, "stream is closed"); + this._closed = true; + this.pushIt({ value: null, done: true }); + this._lis.cmp.forEach((l) => l()); + this._lis.nxt.forEach((l) => l(undefined, undefined, true)); + this.clearLis(); + } + [Symbol.asyncIterator]() { + if (!this._itState) { + this._itState = { q: [] }; + } + if (this._closed === true) + this.pushIt({ value: null, done: true }); + else if (this._closed !== false) + this.pushIt(this._closed); + return { + next: () => { + let state = this._itState; + runtime_1.assert(state, "bad state"); + runtime_1.assert(!state.p, "iterator contract broken"); + let first = state.q.shift(); + if (first) + return "value" in first ? Promise.resolve(first) : Promise.reject(first); + state.p = new deferred_1.Deferred; + return state.p.promise; + } + }; + } + pushIt(result) { + let state = this._itState; + if (!state) + return; + if (state.p) { + const p = state.p; + runtime_1.assert(p.state == deferred_1.DeferredState.PENDING, "iterator contract broken"); + "value" in result ? p.resolve(result) : p.reject(result); + delete state.p; + } else { + state.q.push(result); + } + } + } + exports2.RpcOutputStreamController = RpcOutputStreamController; +}); + +// node_modules/@protobuf-ts/runtime-rpc/build/commonjs/unary-call.js +var require_unary_call = __commonJS((exports2) => { + var __awaiter = exports2 && exports2.__awaiter || function(thisArg, _arguments, P, generator) { + function adopt(value) { + return value instanceof P ? value : new P(function(resolve) { + resolve(value); + }); + } + return new (P || (P = Promise))(function(resolve, reject) { + function fulfilled(value) { + try { + step(generator.next(value)); + } catch (e) { + reject(e); + } + } + function rejected(value) { + try { + step(generator["throw"](value)); + } catch (e) { + reject(e); + } + } + function step(result) { + result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); + } + step((generator = generator.apply(thisArg, _arguments || [])).next()); + }); + }; + Object.defineProperty(exports2, "__esModule", { value: true }); + exports2.UnaryCall = undefined; + + class UnaryCall { + constructor(method, requestHeaders, request, headers, response, status, trailers) { + this.method = method; + this.requestHeaders = requestHeaders; + this.request = request; + this.headers = headers; + this.response = response; + this.status = status; + this.trailers = trailers; + } + then(onfulfilled, onrejected) { + return this.promiseFinished().then((value) => onfulfilled ? Promise.resolve(onfulfilled(value)) : value, (reason) => onrejected ? Promise.resolve(onrejected(reason)) : Promise.reject(reason)); + } + promiseFinished() { + return __awaiter(this, undefined, undefined, function* () { + let [headers, response, status, trailers] = yield Promise.all([this.headers, this.response, this.status, this.trailers]); + return { + method: this.method, + requestHeaders: this.requestHeaders, + request: this.request, + headers, + response, + status, + trailers + }; + }); + } + } + exports2.UnaryCall = UnaryCall; +}); + +// node_modules/@protobuf-ts/runtime-rpc/build/commonjs/server-streaming-call.js +var require_server_streaming_call = __commonJS((exports2) => { + var __awaiter = exports2 && exports2.__awaiter || function(thisArg, _arguments, P, generator) { + function adopt(value) { + return value instanceof P ? value : new P(function(resolve) { + resolve(value); + }); + } + return new (P || (P = Promise))(function(resolve, reject) { + function fulfilled(value) { + try { + step(generator.next(value)); + } catch (e) { + reject(e); + } + } + function rejected(value) { + try { + step(generator["throw"](value)); + } catch (e) { + reject(e); + } + } + function step(result) { + result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); + } + step((generator = generator.apply(thisArg, _arguments || [])).next()); + }); + }; + Object.defineProperty(exports2, "__esModule", { value: true }); + exports2.ServerStreamingCall = undefined; + + class ServerStreamingCall { + constructor(method, requestHeaders, request, headers, response, status, trailers) { + this.method = method; + this.requestHeaders = requestHeaders; + this.request = request; + this.headers = headers; + this.responses = response; + this.status = status; + this.trailers = trailers; + } + then(onfulfilled, onrejected) { + return this.promiseFinished().then((value) => onfulfilled ? Promise.resolve(onfulfilled(value)) : value, (reason) => onrejected ? Promise.resolve(onrejected(reason)) : Promise.reject(reason)); + } + promiseFinished() { + return __awaiter(this, undefined, undefined, function* () { + let [headers, status, trailers] = yield Promise.all([this.headers, this.status, this.trailers]); + return { + method: this.method, + requestHeaders: this.requestHeaders, + request: this.request, + headers, + status, + trailers + }; + }); + } + } + exports2.ServerStreamingCall = ServerStreamingCall; +}); + +// node_modules/@protobuf-ts/runtime-rpc/build/commonjs/client-streaming-call.js +var require_client_streaming_call = __commonJS((exports2) => { + var __awaiter = exports2 && exports2.__awaiter || function(thisArg, _arguments, P, generator) { + function adopt(value) { + return value instanceof P ? value : new P(function(resolve) { + resolve(value); + }); + } + return new (P || (P = Promise))(function(resolve, reject) { + function fulfilled(value) { + try { + step(generator.next(value)); + } catch (e) { + reject(e); + } + } + function rejected(value) { + try { + step(generator["throw"](value)); + } catch (e) { + reject(e); + } + } + function step(result) { + result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); + } + step((generator = generator.apply(thisArg, _arguments || [])).next()); + }); + }; + Object.defineProperty(exports2, "__esModule", { value: true }); + exports2.ClientStreamingCall = undefined; + + class ClientStreamingCall { + constructor(method, requestHeaders, request, headers, response, status, trailers) { + this.method = method; + this.requestHeaders = requestHeaders; + this.requests = request; + this.headers = headers; + this.response = response; + this.status = status; + this.trailers = trailers; + } + then(onfulfilled, onrejected) { + return this.promiseFinished().then((value) => onfulfilled ? Promise.resolve(onfulfilled(value)) : value, (reason) => onrejected ? Promise.resolve(onrejected(reason)) : Promise.reject(reason)); + } + promiseFinished() { + return __awaiter(this, undefined, undefined, function* () { + let [headers, response, status, trailers] = yield Promise.all([this.headers, this.response, this.status, this.trailers]); + return { + method: this.method, + requestHeaders: this.requestHeaders, + headers, + response, + status, + trailers + }; + }); + } + } + exports2.ClientStreamingCall = ClientStreamingCall; +}); + +// node_modules/@protobuf-ts/runtime-rpc/build/commonjs/duplex-streaming-call.js +var require_duplex_streaming_call = __commonJS((exports2) => { + var __awaiter = exports2 && exports2.__awaiter || function(thisArg, _arguments, P, generator) { + function adopt(value) { + return value instanceof P ? value : new P(function(resolve) { + resolve(value); + }); + } + return new (P || (P = Promise))(function(resolve, reject) { + function fulfilled(value) { + try { + step(generator.next(value)); + } catch (e) { + reject(e); + } + } + function rejected(value) { + try { + step(generator["throw"](value)); + } catch (e) { + reject(e); + } + } + function step(result) { + result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); + } + step((generator = generator.apply(thisArg, _arguments || [])).next()); + }); + }; + Object.defineProperty(exports2, "__esModule", { value: true }); + exports2.DuplexStreamingCall = undefined; + + class DuplexStreamingCall { + constructor(method, requestHeaders, request, headers, response, status, trailers) { + this.method = method; + this.requestHeaders = requestHeaders; + this.requests = request; + this.headers = headers; + this.responses = response; + this.status = status; + this.trailers = trailers; + } + then(onfulfilled, onrejected) { + return this.promiseFinished().then((value) => onfulfilled ? Promise.resolve(onfulfilled(value)) : value, (reason) => onrejected ? Promise.resolve(onrejected(reason)) : Promise.reject(reason)); + } + promiseFinished() { + return __awaiter(this, undefined, undefined, function* () { + let [headers, status, trailers] = yield Promise.all([this.headers, this.status, this.trailers]); + return { + method: this.method, + requestHeaders: this.requestHeaders, + headers, + status, + trailers + }; + }); + } + } + exports2.DuplexStreamingCall = DuplexStreamingCall; +}); + +// node_modules/@protobuf-ts/runtime-rpc/build/commonjs/test-transport.js +var require_test_transport = __commonJS((exports2) => { + var __awaiter = exports2 && exports2.__awaiter || function(thisArg, _arguments, P, generator) { + function adopt(value) { + return value instanceof P ? value : new P(function(resolve) { + resolve(value); + }); + } + return new (P || (P = Promise))(function(resolve, reject) { + function fulfilled(value) { + try { + step(generator.next(value)); + } catch (e) { + reject(e); + } + } + function rejected(value) { + try { + step(generator["throw"](value)); + } catch (e) { + reject(e); + } + } + function step(result) { + result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); + } + step((generator = generator.apply(thisArg, _arguments || [])).next()); + }); + }; + Object.defineProperty(exports2, "__esModule", { value: true }); + exports2.TestTransport = undefined; + var rpc_error_1 = require_rpc_error(); + var runtime_1 = require_commonjs(); + var rpc_output_stream_1 = require_rpc_output_stream(); + var rpc_options_1 = require_rpc_options(); + var unary_call_1 = require_unary_call(); + var server_streaming_call_1 = require_server_streaming_call(); + var client_streaming_call_1 = require_client_streaming_call(); + var duplex_streaming_call_1 = require_duplex_streaming_call(); + + class TestTransport { + constructor(data) { + this.suppressUncaughtRejections = true; + this.headerDelay = 10; + this.responseDelay = 50; + this.betweenResponseDelay = 10; + this.afterResponseDelay = 10; + this.data = data !== null && data !== undefined ? data : {}; + } + get sentMessages() { + if (this.lastInput instanceof TestInputStream) { + return this.lastInput.sent; + } else if (typeof this.lastInput == "object") { + return [this.lastInput.single]; + } + return []; + } + get sendComplete() { + if (this.lastInput instanceof TestInputStream) { + return this.lastInput.completed; + } else if (typeof this.lastInput == "object") { + return true; + } + return false; + } + promiseHeaders() { + var _a; + const headers = (_a = this.data.headers) !== null && _a !== undefined ? _a : TestTransport.defaultHeaders; + return headers instanceof rpc_error_1.RpcError ? Promise.reject(headers) : Promise.resolve(headers); + } + promiseSingleResponse(method) { + if (this.data.response instanceof rpc_error_1.RpcError) { + return Promise.reject(this.data.response); + } + let r; + if (Array.isArray(this.data.response)) { + runtime_1.assert(this.data.response.length > 0); + r = this.data.response[0]; + } else if (this.data.response !== undefined) { + r = this.data.response; + } else { + r = method.O.create(); + } + runtime_1.assert(method.O.is(r)); + return Promise.resolve(r); + } + streamResponses(method, stream, abort) { + return __awaiter(this, undefined, undefined, function* () { + const messages = []; + if (this.data.response === undefined) { + messages.push(method.O.create()); + } else if (Array.isArray(this.data.response)) { + for (let msg of this.data.response) { + runtime_1.assert(method.O.is(msg)); + messages.push(msg); + } + } else if (!(this.data.response instanceof rpc_error_1.RpcError)) { + runtime_1.assert(method.O.is(this.data.response)); + messages.push(this.data.response); + } + try { + yield delay(this.responseDelay, abort)(undefined); + } catch (error) { + stream.notifyError(error); + return; + } + if (this.data.response instanceof rpc_error_1.RpcError) { + stream.notifyError(this.data.response); + return; + } + for (let msg of messages) { + stream.notifyMessage(msg); + try { + yield delay(this.betweenResponseDelay, abort)(undefined); + } catch (error) { + stream.notifyError(error); + return; + } + } + if (this.data.status instanceof rpc_error_1.RpcError) { + stream.notifyError(this.data.status); + return; + } + if (this.data.trailers instanceof rpc_error_1.RpcError) { + stream.notifyError(this.data.trailers); + return; + } + stream.notifyComplete(); + }); + } + promiseStatus() { + var _a; + const status = (_a = this.data.status) !== null && _a !== undefined ? _a : TestTransport.defaultStatus; + return status instanceof rpc_error_1.RpcError ? Promise.reject(status) : Promise.resolve(status); + } + promiseTrailers() { + var _a; + const trailers = (_a = this.data.trailers) !== null && _a !== undefined ? _a : TestTransport.defaultTrailers; + return trailers instanceof rpc_error_1.RpcError ? Promise.reject(trailers) : Promise.resolve(trailers); + } + maybeSuppressUncaught(...promise) { + if (this.suppressUncaughtRejections) { + for (let p of promise) { + p.catch(() => { + }); + } + } + } + mergeOptions(options) { + return rpc_options_1.mergeRpcOptions({}, options); + } + unary(method, input, options) { + var _a; + const requestHeaders = (_a = options.meta) !== null && _a !== undefined ? _a : {}, headersPromise = this.promiseHeaders().then(delay(this.headerDelay, options.abort)), responsePromise = headersPromise.catch((_2) => { + }).then(delay(this.responseDelay, options.abort)).then((_2) => this.promiseSingleResponse(method)), statusPromise = responsePromise.catch((_2) => { + }).then(delay(this.afterResponseDelay, options.abort)).then((_2) => this.promiseStatus()), trailersPromise = responsePromise.catch((_2) => { + }).then(delay(this.afterResponseDelay, options.abort)).then((_2) => this.promiseTrailers()); + this.maybeSuppressUncaught(statusPromise, trailersPromise); + this.lastInput = { single: input }; + return new unary_call_1.UnaryCall(method, requestHeaders, input, headersPromise, responsePromise, statusPromise, trailersPromise); + } + serverStreaming(method, input, options) { + var _a; + const requestHeaders = (_a = options.meta) !== null && _a !== undefined ? _a : {}, headersPromise = this.promiseHeaders().then(delay(this.headerDelay, options.abort)), outputStream = new rpc_output_stream_1.RpcOutputStreamController, responseStreamClosedPromise = headersPromise.then(delay(this.responseDelay, options.abort)).catch(() => { + }).then(() => this.streamResponses(method, outputStream, options.abort)).then(delay(this.afterResponseDelay, options.abort)), statusPromise = responseStreamClosedPromise.then(() => this.promiseStatus()), trailersPromise = responseStreamClosedPromise.then(() => this.promiseTrailers()); + this.maybeSuppressUncaught(statusPromise, trailersPromise); + this.lastInput = { single: input }; + return new server_streaming_call_1.ServerStreamingCall(method, requestHeaders, input, headersPromise, outputStream, statusPromise, trailersPromise); + } + clientStreaming(method, options) { + var _a; + const requestHeaders = (_a = options.meta) !== null && _a !== undefined ? _a : {}, headersPromise = this.promiseHeaders().then(delay(this.headerDelay, options.abort)), responsePromise = headersPromise.catch((_2) => { + }).then(delay(this.responseDelay, options.abort)).then((_2) => this.promiseSingleResponse(method)), statusPromise = responsePromise.catch((_2) => { + }).then(delay(this.afterResponseDelay, options.abort)).then((_2) => this.promiseStatus()), trailersPromise = responsePromise.catch((_2) => { + }).then(delay(this.afterResponseDelay, options.abort)).then((_2) => this.promiseTrailers()); + this.maybeSuppressUncaught(statusPromise, trailersPromise); + this.lastInput = new TestInputStream(this.data, options.abort); + return new client_streaming_call_1.ClientStreamingCall(method, requestHeaders, this.lastInput, headersPromise, responsePromise, statusPromise, trailersPromise); + } + duplex(method, options) { + var _a; + const requestHeaders = (_a = options.meta) !== null && _a !== undefined ? _a : {}, headersPromise = this.promiseHeaders().then(delay(this.headerDelay, options.abort)), outputStream = new rpc_output_stream_1.RpcOutputStreamController, responseStreamClosedPromise = headersPromise.then(delay(this.responseDelay, options.abort)).catch(() => { + }).then(() => this.streamResponses(method, outputStream, options.abort)).then(delay(this.afterResponseDelay, options.abort)), statusPromise = responseStreamClosedPromise.then(() => this.promiseStatus()), trailersPromise = responseStreamClosedPromise.then(() => this.promiseTrailers()); + this.maybeSuppressUncaught(statusPromise, trailersPromise); + this.lastInput = new TestInputStream(this.data, options.abort); + return new duplex_streaming_call_1.DuplexStreamingCall(method, requestHeaders, this.lastInput, headersPromise, outputStream, statusPromise, trailersPromise); + } + } + exports2.TestTransport = TestTransport; + TestTransport.defaultHeaders = { + responseHeader: "test" + }; + TestTransport.defaultStatus = { + code: "OK", + detail: "all good" + }; + TestTransport.defaultTrailers = { + responseTrailer: "test" + }; + function delay(ms, abort) { + return (v) => new Promise((resolve, reject) => { + if (abort === null || abort === undefined ? undefined : abort.aborted) { + reject(new rpc_error_1.RpcError("user cancel", "CANCELLED")); + } else { + const id = setTimeout(() => resolve(v), ms); + if (abort) { + abort.addEventListener("abort", (ev) => { + clearTimeout(id); + reject(new rpc_error_1.RpcError("user cancel", "CANCELLED")); + }); + } + } + }); + } + + class TestInputStream { + constructor(data, abort) { + this._completed = false; + this._sent = []; + this.data = data; + this.abort = abort; + } + get sent() { + return this._sent; + } + get completed() { + return this._completed; + } + send(message) { + if (this.data.inputMessage instanceof rpc_error_1.RpcError) { + return Promise.reject(this.data.inputMessage); + } + const delayMs = this.data.inputMessage === undefined ? 10 : this.data.inputMessage; + return Promise.resolve(undefined).then(() => { + this._sent.push(message); + }).then(delay(delayMs, this.abort)); + } + complete() { + if (this.data.inputComplete instanceof rpc_error_1.RpcError) { + return Promise.reject(this.data.inputComplete); + } + const delayMs = this.data.inputComplete === undefined ? 10 : this.data.inputComplete; + return Promise.resolve(undefined).then(() => { + this._completed = true; + }).then(delay(delayMs, this.abort)); + } + } +}); + +// node_modules/@protobuf-ts/runtime-rpc/build/commonjs/rpc-interceptor.js +var require_rpc_interceptor = __commonJS((exports2) => { + Object.defineProperty(exports2, "__esModule", { value: true }); + exports2.stackDuplexStreamingInterceptors = exports2.stackClientStreamingInterceptors = exports2.stackServerStreamingInterceptors = exports2.stackUnaryInterceptors = exports2.stackIntercept = undefined; + var runtime_1 = require_commonjs(); + function stackIntercept(kind, transport, method, options, input) { + var _a, _b, _c, _d; + if (kind == "unary") { + let tail = (mtd, inp, opt) => transport.unary(mtd, inp, opt); + for (const curr of ((_a = options.interceptors) !== null && _a !== undefined ? _a : []).filter((i) => i.interceptUnary).reverse()) { + const next = tail; + tail = (mtd, inp, opt) => curr.interceptUnary(next, mtd, inp, opt); + } + return tail(method, input, options); + } + if (kind == "serverStreaming") { + let tail = (mtd, inp, opt) => transport.serverStreaming(mtd, inp, opt); + for (const curr of ((_b = options.interceptors) !== null && _b !== undefined ? _b : []).filter((i) => i.interceptServerStreaming).reverse()) { + const next = tail; + tail = (mtd, inp, opt) => curr.interceptServerStreaming(next, mtd, inp, opt); + } + return tail(method, input, options); + } + if (kind == "clientStreaming") { + let tail = (mtd, opt) => transport.clientStreaming(mtd, opt); + for (const curr of ((_c = options.interceptors) !== null && _c !== undefined ? _c : []).filter((i) => i.interceptClientStreaming).reverse()) { + const next = tail; + tail = (mtd, opt) => curr.interceptClientStreaming(next, mtd, opt); + } + return tail(method, options); + } + if (kind == "duplex") { + let tail = (mtd, opt) => transport.duplex(mtd, opt); + for (const curr of ((_d = options.interceptors) !== null && _d !== undefined ? _d : []).filter((i) => i.interceptDuplex).reverse()) { + const next = tail; + tail = (mtd, opt) => curr.interceptDuplex(next, mtd, opt); + } + return tail(method, options); + } + runtime_1.assertNever(kind); + } + exports2.stackIntercept = stackIntercept; + function stackUnaryInterceptors(transport, method, input, options) { + return stackIntercept("unary", transport, method, options, input); + } + exports2.stackUnaryInterceptors = stackUnaryInterceptors; + function stackServerStreamingInterceptors(transport, method, input, options) { + return stackIntercept("serverStreaming", transport, method, options, input); + } + exports2.stackServerStreamingInterceptors = stackServerStreamingInterceptors; + function stackClientStreamingInterceptors(transport, method, options) { + return stackIntercept("clientStreaming", transport, method, options); + } + exports2.stackClientStreamingInterceptors = stackClientStreamingInterceptors; + function stackDuplexStreamingInterceptors(transport, method, options) { + return stackIntercept("duplex", transport, method, options); + } + exports2.stackDuplexStreamingInterceptors = stackDuplexStreamingInterceptors; +}); + +// node_modules/@protobuf-ts/runtime-rpc/build/commonjs/server-call-context.js +var require_server_call_context = __commonJS((exports2) => { + Object.defineProperty(exports2, "__esModule", { value: true }); + exports2.ServerCallContextController = undefined; + + class ServerCallContextController { + constructor(method, headers, deadline, sendResponseHeadersFn, defaultStatus = { code: "OK", detail: "" }) { + this._cancelled = false; + this._listeners = []; + this.method = method; + this.headers = headers; + this.deadline = deadline; + this.trailers = {}; + this._sendRH = sendResponseHeadersFn; + this.status = defaultStatus; + } + notifyCancelled() { + if (!this._cancelled) { + this._cancelled = true; + for (let l of this._listeners) { + l(); + } + } + } + sendResponseHeaders(data) { + this._sendRH(data); + } + get cancelled() { + return this._cancelled; + } + onCancel(callback) { + const l = this._listeners; + l.push(callback); + return () => { + let i = l.indexOf(callback); + if (i >= 0) + l.splice(i, 1); + }; + } + } + exports2.ServerCallContextController = ServerCallContextController; +}); + +// node_modules/@protobuf-ts/runtime-rpc/build/commonjs/index.js +var require_commonjs2 = __commonJS((exports2) => { + Object.defineProperty(exports2, "__esModule", { value: true }); + var service_type_1 = require_service_type(); + Object.defineProperty(exports2, "ServiceType", { enumerable: true, get: function() { + return service_type_1.ServiceType; + } }); + var reflection_info_1 = require_reflection_info2(); + Object.defineProperty(exports2, "readMethodOptions", { enumerable: true, get: function() { + return reflection_info_1.readMethodOptions; + } }); + Object.defineProperty(exports2, "readMethodOption", { enumerable: true, get: function() { + return reflection_info_1.readMethodOption; + } }); + Object.defineProperty(exports2, "readServiceOption", { enumerable: true, get: function() { + return reflection_info_1.readServiceOption; + } }); + var rpc_error_1 = require_rpc_error(); + Object.defineProperty(exports2, "RpcError", { enumerable: true, get: function() { + return rpc_error_1.RpcError; + } }); + var rpc_options_1 = require_rpc_options(); + Object.defineProperty(exports2, "mergeRpcOptions", { enumerable: true, get: function() { + return rpc_options_1.mergeRpcOptions; + } }); + var rpc_output_stream_1 = require_rpc_output_stream(); + Object.defineProperty(exports2, "RpcOutputStreamController", { enumerable: true, get: function() { + return rpc_output_stream_1.RpcOutputStreamController; + } }); + var test_transport_1 = require_test_transport(); + Object.defineProperty(exports2, "TestTransport", { enumerable: true, get: function() { + return test_transport_1.TestTransport; + } }); + var deferred_1 = require_deferred(); + Object.defineProperty(exports2, "Deferred", { enumerable: true, get: function() { + return deferred_1.Deferred; + } }); + Object.defineProperty(exports2, "DeferredState", { enumerable: true, get: function() { + return deferred_1.DeferredState; + } }); + var duplex_streaming_call_1 = require_duplex_streaming_call(); + Object.defineProperty(exports2, "DuplexStreamingCall", { enumerable: true, get: function() { + return duplex_streaming_call_1.DuplexStreamingCall; + } }); + var client_streaming_call_1 = require_client_streaming_call(); + Object.defineProperty(exports2, "ClientStreamingCall", { enumerable: true, get: function() { + return client_streaming_call_1.ClientStreamingCall; + } }); + var server_streaming_call_1 = require_server_streaming_call(); + Object.defineProperty(exports2, "ServerStreamingCall", { enumerable: true, get: function() { + return server_streaming_call_1.ServerStreamingCall; + } }); + var unary_call_1 = require_unary_call(); + Object.defineProperty(exports2, "UnaryCall", { enumerable: true, get: function() { + return unary_call_1.UnaryCall; + } }); + var rpc_interceptor_1 = require_rpc_interceptor(); + Object.defineProperty(exports2, "stackIntercept", { enumerable: true, get: function() { + return rpc_interceptor_1.stackIntercept; + } }); + Object.defineProperty(exports2, "stackDuplexStreamingInterceptors", { enumerable: true, get: function() { + return rpc_interceptor_1.stackDuplexStreamingInterceptors; + } }); + Object.defineProperty(exports2, "stackClientStreamingInterceptors", { enumerable: true, get: function() { + return rpc_interceptor_1.stackClientStreamingInterceptors; + } }); + Object.defineProperty(exports2, "stackServerStreamingInterceptors", { enumerable: true, get: function() { + return rpc_interceptor_1.stackServerStreamingInterceptors; + } }); + Object.defineProperty(exports2, "stackUnaryInterceptors", { enumerable: true, get: function() { + return rpc_interceptor_1.stackUnaryInterceptors; + } }); + var server_call_context_1 = require_server_call_context(); + Object.defineProperty(exports2, "ServerCallContextController", { enumerable: true, get: function() { + return server_call_context_1.ServerCallContextController; + } }); +}); + +// node_modules/@actions/artifact/lib/generated/results/api/v1/artifact.js +var require_artifact = __commonJS((exports2) => { + Object.defineProperty(exports2, "__esModule", { value: true }); + exports2.ArtifactService = exports2.DeleteArtifactResponse = exports2.DeleteArtifactRequest = exports2.GetSignedArtifactURLResponse = exports2.GetSignedArtifactURLRequest = exports2.ListArtifactsResponse_MonolithArtifact = exports2.ListArtifactsResponse = exports2.ListArtifactsRequest = exports2.FinalizeArtifactResponse = exports2.FinalizeArtifactRequest = exports2.CreateArtifactResponse = exports2.CreateArtifactRequest = undefined; + var runtime_rpc_1 = require_commonjs2(); + var runtime_1 = require_commonjs(); + var runtime_2 = require_commonjs(); + var runtime_3 = require_commonjs(); + var runtime_4 = require_commonjs(); + var runtime_5 = require_commonjs(); + var wrappers_1 = require_wrappers(); + var wrappers_2 = require_wrappers(); + var timestamp_1 = require_timestamp(); + + class CreateArtifactRequest$Type extends runtime_5.MessageType { + constructor() { + super("github.actions.results.api.v1.CreateArtifactRequest", [ + { no: 1, name: "workflow_run_backend_id", kind: "scalar", T: 9 }, + { no: 2, name: "workflow_job_run_backend_id", kind: "scalar", T: 9 }, + { no: 3, name: "name", kind: "scalar", T: 9 }, + { no: 4, name: "expires_at", kind: "message", T: () => timestamp_1.Timestamp }, + { no: 5, name: "version", kind: "scalar", T: 5 } + ]); + } + create(value) { + const message = { workflowRunBackendId: "", workflowJobRunBackendId: "", name: "", version: 0 }; + globalThis.Object.defineProperty(message, runtime_4.MESSAGE_TYPE, { enumerable: false, value: this }); + if (value !== undefined) + (0, runtime_3.reflectionMergePartial)(this, message, value); + return message; + } + internalBinaryRead(reader, length, options, target) { + let message = target !== null && target !== undefined ? target : this.create(), end = reader.pos + length; + while (reader.pos < end) { + let [fieldNo, wireType] = reader.tag(); + switch (fieldNo) { + case 1: + message.workflowRunBackendId = reader.string(); + break; + case 2: + message.workflowJobRunBackendId = reader.string(); + break; + case 3: + message.name = reader.string(); + break; + case 4: + message.expiresAt = timestamp_1.Timestamp.internalBinaryRead(reader, reader.uint32(), options, message.expiresAt); + break; + case 5: + message.version = reader.int32(); + break; + default: + let u = options.readUnknownField; + if (u === "throw") + throw new globalThis.Error(`Unknown field ${fieldNo} (wire type ${wireType}) for ${this.typeName}`); + let d = reader.skip(wireType); + if (u !== false) + (u === true ? runtime_2.UnknownFieldHandler.onRead : u)(this.typeName, message, fieldNo, wireType, d); + } + } + return message; + } + internalBinaryWrite(message, writer, options) { + if (message.workflowRunBackendId !== "") + writer.tag(1, runtime_1.WireType.LengthDelimited).string(message.workflowRunBackendId); + if (message.workflowJobRunBackendId !== "") + writer.tag(2, runtime_1.WireType.LengthDelimited).string(message.workflowJobRunBackendId); + if (message.name !== "") + writer.tag(3, runtime_1.WireType.LengthDelimited).string(message.name); + if (message.expiresAt) + timestamp_1.Timestamp.internalBinaryWrite(message.expiresAt, writer.tag(4, runtime_1.WireType.LengthDelimited).fork(), options).join(); + if (message.version !== 0) + writer.tag(5, runtime_1.WireType.Varint).int32(message.version); + let u = options.writeUnknownFields; + if (u !== false) + (u == true ? runtime_2.UnknownFieldHandler.onWrite : u)(this.typeName, message, writer); + return writer; + } + } + exports2.CreateArtifactRequest = new CreateArtifactRequest$Type; + + class CreateArtifactResponse$Type extends runtime_5.MessageType { + constructor() { + super("github.actions.results.api.v1.CreateArtifactResponse", [ + { no: 1, name: "ok", kind: "scalar", T: 8 }, + { no: 2, name: "signed_upload_url", kind: "scalar", T: 9 } + ]); + } + create(value) { + const message = { ok: false, signedUploadUrl: "" }; + globalThis.Object.defineProperty(message, runtime_4.MESSAGE_TYPE, { enumerable: false, value: this }); + if (value !== undefined) + (0, runtime_3.reflectionMergePartial)(this, message, value); + return message; + } + internalBinaryRead(reader, length, options, target) { + let message = target !== null && target !== undefined ? target : this.create(), end = reader.pos + length; + while (reader.pos < end) { + let [fieldNo, wireType] = reader.tag(); + switch (fieldNo) { + case 1: + message.ok = reader.bool(); + break; + case 2: + message.signedUploadUrl = reader.string(); + break; + default: + let u = options.readUnknownField; + if (u === "throw") + throw new globalThis.Error(`Unknown field ${fieldNo} (wire type ${wireType}) for ${this.typeName}`); + let d = reader.skip(wireType); + if (u !== false) + (u === true ? runtime_2.UnknownFieldHandler.onRead : u)(this.typeName, message, fieldNo, wireType, d); + } + } + return message; + } + internalBinaryWrite(message, writer, options) { + if (message.ok !== false) + writer.tag(1, runtime_1.WireType.Varint).bool(message.ok); + if (message.signedUploadUrl !== "") + writer.tag(2, runtime_1.WireType.LengthDelimited).string(message.signedUploadUrl); + let u = options.writeUnknownFields; + if (u !== false) + (u == true ? runtime_2.UnknownFieldHandler.onWrite : u)(this.typeName, message, writer); + return writer; + } + } + exports2.CreateArtifactResponse = new CreateArtifactResponse$Type; + + class FinalizeArtifactRequest$Type extends runtime_5.MessageType { + constructor() { + super("github.actions.results.api.v1.FinalizeArtifactRequest", [ + { no: 1, name: "workflow_run_backend_id", kind: "scalar", T: 9 }, + { no: 2, name: "workflow_job_run_backend_id", kind: "scalar", T: 9 }, + { no: 3, name: "name", kind: "scalar", T: 9 }, + { no: 4, name: "size", kind: "scalar", T: 3 }, + { no: 5, name: "hash", kind: "message", T: () => wrappers_2.StringValue } + ]); + } + create(value) { + const message = { workflowRunBackendId: "", workflowJobRunBackendId: "", name: "", size: "0" }; + globalThis.Object.defineProperty(message, runtime_4.MESSAGE_TYPE, { enumerable: false, value: this }); + if (value !== undefined) + (0, runtime_3.reflectionMergePartial)(this, message, value); + return message; + } + internalBinaryRead(reader, length, options, target) { + let message = target !== null && target !== undefined ? target : this.create(), end = reader.pos + length; + while (reader.pos < end) { + let [fieldNo, wireType] = reader.tag(); + switch (fieldNo) { + case 1: + message.workflowRunBackendId = reader.string(); + break; + case 2: + message.workflowJobRunBackendId = reader.string(); + break; + case 3: + message.name = reader.string(); + break; + case 4: + message.size = reader.int64().toString(); + break; + case 5: + message.hash = wrappers_2.StringValue.internalBinaryRead(reader, reader.uint32(), options, message.hash); + break; + default: + let u = options.readUnknownField; + if (u === "throw") + throw new globalThis.Error(`Unknown field ${fieldNo} (wire type ${wireType}) for ${this.typeName}`); + let d = reader.skip(wireType); + if (u !== false) + (u === true ? runtime_2.UnknownFieldHandler.onRead : u)(this.typeName, message, fieldNo, wireType, d); + } + } + return message; + } + internalBinaryWrite(message, writer, options) { + if (message.workflowRunBackendId !== "") + writer.tag(1, runtime_1.WireType.LengthDelimited).string(message.workflowRunBackendId); + if (message.workflowJobRunBackendId !== "") + writer.tag(2, runtime_1.WireType.LengthDelimited).string(message.workflowJobRunBackendId); + if (message.name !== "") + writer.tag(3, runtime_1.WireType.LengthDelimited).string(message.name); + if (message.size !== "0") + writer.tag(4, runtime_1.WireType.Varint).int64(message.size); + if (message.hash) + wrappers_2.StringValue.internalBinaryWrite(message.hash, writer.tag(5, runtime_1.WireType.LengthDelimited).fork(), options).join(); + let u = options.writeUnknownFields; + if (u !== false) + (u == true ? runtime_2.UnknownFieldHandler.onWrite : u)(this.typeName, message, writer); + return writer; + } + } + exports2.FinalizeArtifactRequest = new FinalizeArtifactRequest$Type; + + class FinalizeArtifactResponse$Type extends runtime_5.MessageType { + constructor() { + super("github.actions.results.api.v1.FinalizeArtifactResponse", [ + { no: 1, name: "ok", kind: "scalar", T: 8 }, + { no: 2, name: "artifact_id", kind: "scalar", T: 3 } + ]); + } + create(value) { + const message = { ok: false, artifactId: "0" }; + globalThis.Object.defineProperty(message, runtime_4.MESSAGE_TYPE, { enumerable: false, value: this }); + if (value !== undefined) + (0, runtime_3.reflectionMergePartial)(this, message, value); + return message; + } + internalBinaryRead(reader, length, options, target) { + let message = target !== null && target !== undefined ? target : this.create(), end = reader.pos + length; + while (reader.pos < end) { + let [fieldNo, wireType] = reader.tag(); + switch (fieldNo) { + case 1: + message.ok = reader.bool(); + break; + case 2: + message.artifactId = reader.int64().toString(); + break; + default: + let u = options.readUnknownField; + if (u === "throw") + throw new globalThis.Error(`Unknown field ${fieldNo} (wire type ${wireType}) for ${this.typeName}`); + let d = reader.skip(wireType); + if (u !== false) + (u === true ? runtime_2.UnknownFieldHandler.onRead : u)(this.typeName, message, fieldNo, wireType, d); + } + } + return message; + } + internalBinaryWrite(message, writer, options) { + if (message.ok !== false) + writer.tag(1, runtime_1.WireType.Varint).bool(message.ok); + if (message.artifactId !== "0") + writer.tag(2, runtime_1.WireType.Varint).int64(message.artifactId); + let u = options.writeUnknownFields; + if (u !== false) + (u == true ? runtime_2.UnknownFieldHandler.onWrite : u)(this.typeName, message, writer); + return writer; + } + } + exports2.FinalizeArtifactResponse = new FinalizeArtifactResponse$Type; + + class ListArtifactsRequest$Type extends runtime_5.MessageType { + constructor() { + super("github.actions.results.api.v1.ListArtifactsRequest", [ + { no: 1, name: "workflow_run_backend_id", kind: "scalar", T: 9 }, + { no: 2, name: "workflow_job_run_backend_id", kind: "scalar", T: 9 }, + { no: 3, name: "name_filter", kind: "message", T: () => wrappers_2.StringValue }, + { no: 4, name: "id_filter", kind: "message", T: () => wrappers_1.Int64Value } + ]); + } + create(value) { + const message = { workflowRunBackendId: "", workflowJobRunBackendId: "" }; + globalThis.Object.defineProperty(message, runtime_4.MESSAGE_TYPE, { enumerable: false, value: this }); + if (value !== undefined) + (0, runtime_3.reflectionMergePartial)(this, message, value); + return message; + } + internalBinaryRead(reader, length, options, target) { + let message = target !== null && target !== undefined ? target : this.create(), end = reader.pos + length; + while (reader.pos < end) { + let [fieldNo, wireType] = reader.tag(); + switch (fieldNo) { + case 1: + message.workflowRunBackendId = reader.string(); + break; + case 2: + message.workflowJobRunBackendId = reader.string(); + break; + case 3: + message.nameFilter = wrappers_2.StringValue.internalBinaryRead(reader, reader.uint32(), options, message.nameFilter); + break; + case 4: + message.idFilter = wrappers_1.Int64Value.internalBinaryRead(reader, reader.uint32(), options, message.idFilter); + break; + default: + let u = options.readUnknownField; + if (u === "throw") + throw new globalThis.Error(`Unknown field ${fieldNo} (wire type ${wireType}) for ${this.typeName}`); + let d = reader.skip(wireType); + if (u !== false) + (u === true ? runtime_2.UnknownFieldHandler.onRead : u)(this.typeName, message, fieldNo, wireType, d); + } + } + return message; + } + internalBinaryWrite(message, writer, options) { + if (message.workflowRunBackendId !== "") + writer.tag(1, runtime_1.WireType.LengthDelimited).string(message.workflowRunBackendId); + if (message.workflowJobRunBackendId !== "") + writer.tag(2, runtime_1.WireType.LengthDelimited).string(message.workflowJobRunBackendId); + if (message.nameFilter) + wrappers_2.StringValue.internalBinaryWrite(message.nameFilter, writer.tag(3, runtime_1.WireType.LengthDelimited).fork(), options).join(); + if (message.idFilter) + wrappers_1.Int64Value.internalBinaryWrite(message.idFilter, writer.tag(4, runtime_1.WireType.LengthDelimited).fork(), options).join(); + let u = options.writeUnknownFields; + if (u !== false) + (u == true ? runtime_2.UnknownFieldHandler.onWrite : u)(this.typeName, message, writer); + return writer; + } + } + exports2.ListArtifactsRequest = new ListArtifactsRequest$Type; + + class ListArtifactsResponse$Type extends runtime_5.MessageType { + constructor() { + super("github.actions.results.api.v1.ListArtifactsResponse", [ + { no: 1, name: "artifacts", kind: "message", repeat: 1, T: () => exports2.ListArtifactsResponse_MonolithArtifact } + ]); + } + create(value) { + const message = { artifacts: [] }; + globalThis.Object.defineProperty(message, runtime_4.MESSAGE_TYPE, { enumerable: false, value: this }); + if (value !== undefined) + (0, runtime_3.reflectionMergePartial)(this, message, value); + return message; + } + internalBinaryRead(reader, length, options, target) { + let message = target !== null && target !== undefined ? target : this.create(), end = reader.pos + length; + while (reader.pos < end) { + let [fieldNo, wireType] = reader.tag(); + switch (fieldNo) { + case 1: + message.artifacts.push(exports2.ListArtifactsResponse_MonolithArtifact.internalBinaryRead(reader, reader.uint32(), options)); + break; + default: + let u = options.readUnknownField; + if (u === "throw") + throw new globalThis.Error(`Unknown field ${fieldNo} (wire type ${wireType}) for ${this.typeName}`); + let d = reader.skip(wireType); + if (u !== false) + (u === true ? runtime_2.UnknownFieldHandler.onRead : u)(this.typeName, message, fieldNo, wireType, d); + } + } + return message; + } + internalBinaryWrite(message, writer, options) { + for (let i = 0;i < message.artifacts.length; i++) + exports2.ListArtifactsResponse_MonolithArtifact.internalBinaryWrite(message.artifacts[i], writer.tag(1, runtime_1.WireType.LengthDelimited).fork(), options).join(); + let u = options.writeUnknownFields; + if (u !== false) + (u == true ? runtime_2.UnknownFieldHandler.onWrite : u)(this.typeName, message, writer); + return writer; + } + } + exports2.ListArtifactsResponse = new ListArtifactsResponse$Type; + + class ListArtifactsResponse_MonolithArtifact$Type extends runtime_5.MessageType { + constructor() { + super("github.actions.results.api.v1.ListArtifactsResponse.MonolithArtifact", [ + { no: 1, name: "workflow_run_backend_id", kind: "scalar", T: 9 }, + { no: 2, name: "workflow_job_run_backend_id", kind: "scalar", T: 9 }, + { no: 3, name: "database_id", kind: "scalar", T: 3 }, + { no: 4, name: "name", kind: "scalar", T: 9 }, + { no: 5, name: "size", kind: "scalar", T: 3 }, + { no: 6, name: "created_at", kind: "message", T: () => timestamp_1.Timestamp } + ]); + } + create(value) { + const message = { workflowRunBackendId: "", workflowJobRunBackendId: "", databaseId: "0", name: "", size: "0" }; + globalThis.Object.defineProperty(message, runtime_4.MESSAGE_TYPE, { enumerable: false, value: this }); + if (value !== undefined) + (0, runtime_3.reflectionMergePartial)(this, message, value); + return message; + } + internalBinaryRead(reader, length, options, target) { + let message = target !== null && target !== undefined ? target : this.create(), end = reader.pos + length; + while (reader.pos < end) { + let [fieldNo, wireType] = reader.tag(); + switch (fieldNo) { + case 1: + message.workflowRunBackendId = reader.string(); + break; + case 2: + message.workflowJobRunBackendId = reader.string(); + break; + case 3: + message.databaseId = reader.int64().toString(); + break; + case 4: + message.name = reader.string(); + break; + case 5: + message.size = reader.int64().toString(); + break; + case 6: + message.createdAt = timestamp_1.Timestamp.internalBinaryRead(reader, reader.uint32(), options, message.createdAt); + break; + default: + let u = options.readUnknownField; + if (u === "throw") + throw new globalThis.Error(`Unknown field ${fieldNo} (wire type ${wireType}) for ${this.typeName}`); + let d = reader.skip(wireType); + if (u !== false) + (u === true ? runtime_2.UnknownFieldHandler.onRead : u)(this.typeName, message, fieldNo, wireType, d); + } + } + return message; + } + internalBinaryWrite(message, writer, options) { + if (message.workflowRunBackendId !== "") + writer.tag(1, runtime_1.WireType.LengthDelimited).string(message.workflowRunBackendId); + if (message.workflowJobRunBackendId !== "") + writer.tag(2, runtime_1.WireType.LengthDelimited).string(message.workflowJobRunBackendId); + if (message.databaseId !== "0") + writer.tag(3, runtime_1.WireType.Varint).int64(message.databaseId); + if (message.name !== "") + writer.tag(4, runtime_1.WireType.LengthDelimited).string(message.name); + if (message.size !== "0") + writer.tag(5, runtime_1.WireType.Varint).int64(message.size); + if (message.createdAt) + timestamp_1.Timestamp.internalBinaryWrite(message.createdAt, writer.tag(6, runtime_1.WireType.LengthDelimited).fork(), options).join(); + let u = options.writeUnknownFields; + if (u !== false) + (u == true ? runtime_2.UnknownFieldHandler.onWrite : u)(this.typeName, message, writer); + return writer; + } + } + exports2.ListArtifactsResponse_MonolithArtifact = new ListArtifactsResponse_MonolithArtifact$Type; + + class GetSignedArtifactURLRequest$Type extends runtime_5.MessageType { + constructor() { + super("github.actions.results.api.v1.GetSignedArtifactURLRequest", [ + { no: 1, name: "workflow_run_backend_id", kind: "scalar", T: 9 }, + { no: 2, name: "workflow_job_run_backend_id", kind: "scalar", T: 9 }, + { no: 3, name: "name", kind: "scalar", T: 9 } + ]); + } + create(value) { + const message = { workflowRunBackendId: "", workflowJobRunBackendId: "", name: "" }; + globalThis.Object.defineProperty(message, runtime_4.MESSAGE_TYPE, { enumerable: false, value: this }); + if (value !== undefined) + (0, runtime_3.reflectionMergePartial)(this, message, value); + return message; + } + internalBinaryRead(reader, length, options, target) { + let message = target !== null && target !== undefined ? target : this.create(), end = reader.pos + length; + while (reader.pos < end) { + let [fieldNo, wireType] = reader.tag(); + switch (fieldNo) { + case 1: + message.workflowRunBackendId = reader.string(); + break; + case 2: + message.workflowJobRunBackendId = reader.string(); + break; + case 3: + message.name = reader.string(); + break; + default: + let u = options.readUnknownField; + if (u === "throw") + throw new globalThis.Error(`Unknown field ${fieldNo} (wire type ${wireType}) for ${this.typeName}`); + let d = reader.skip(wireType); + if (u !== false) + (u === true ? runtime_2.UnknownFieldHandler.onRead : u)(this.typeName, message, fieldNo, wireType, d); + } + } + return message; + } + internalBinaryWrite(message, writer, options) { + if (message.workflowRunBackendId !== "") + writer.tag(1, runtime_1.WireType.LengthDelimited).string(message.workflowRunBackendId); + if (message.workflowJobRunBackendId !== "") + writer.tag(2, runtime_1.WireType.LengthDelimited).string(message.workflowJobRunBackendId); + if (message.name !== "") + writer.tag(3, runtime_1.WireType.LengthDelimited).string(message.name); + let u = options.writeUnknownFields; + if (u !== false) + (u == true ? runtime_2.UnknownFieldHandler.onWrite : u)(this.typeName, message, writer); + return writer; + } + } + exports2.GetSignedArtifactURLRequest = new GetSignedArtifactURLRequest$Type; + + class GetSignedArtifactURLResponse$Type extends runtime_5.MessageType { + constructor() { + super("github.actions.results.api.v1.GetSignedArtifactURLResponse", [ + { no: 1, name: "signed_url", kind: "scalar", T: 9 } + ]); + } + create(value) { + const message = { signedUrl: "" }; + globalThis.Object.defineProperty(message, runtime_4.MESSAGE_TYPE, { enumerable: false, value: this }); + if (value !== undefined) + (0, runtime_3.reflectionMergePartial)(this, message, value); + return message; + } + internalBinaryRead(reader, length, options, target) { + let message = target !== null && target !== undefined ? target : this.create(), end = reader.pos + length; + while (reader.pos < end) { + let [fieldNo, wireType] = reader.tag(); + switch (fieldNo) { + case 1: + message.signedUrl = reader.string(); + break; + default: + let u = options.readUnknownField; + if (u === "throw") + throw new globalThis.Error(`Unknown field ${fieldNo} (wire type ${wireType}) for ${this.typeName}`); + let d = reader.skip(wireType); + if (u !== false) + (u === true ? runtime_2.UnknownFieldHandler.onRead : u)(this.typeName, message, fieldNo, wireType, d); + } + } + return message; + } + internalBinaryWrite(message, writer, options) { + if (message.signedUrl !== "") + writer.tag(1, runtime_1.WireType.LengthDelimited).string(message.signedUrl); + let u = options.writeUnknownFields; + if (u !== false) + (u == true ? runtime_2.UnknownFieldHandler.onWrite : u)(this.typeName, message, writer); + return writer; + } + } + exports2.GetSignedArtifactURLResponse = new GetSignedArtifactURLResponse$Type; + + class DeleteArtifactRequest$Type extends runtime_5.MessageType { + constructor() { + super("github.actions.results.api.v1.DeleteArtifactRequest", [ + { no: 1, name: "workflow_run_backend_id", kind: "scalar", T: 9 }, + { no: 2, name: "workflow_job_run_backend_id", kind: "scalar", T: 9 }, + { no: 3, name: "name", kind: "scalar", T: 9 } + ]); + } + create(value) { + const message = { workflowRunBackendId: "", workflowJobRunBackendId: "", name: "" }; + globalThis.Object.defineProperty(message, runtime_4.MESSAGE_TYPE, { enumerable: false, value: this }); + if (value !== undefined) + (0, runtime_3.reflectionMergePartial)(this, message, value); + return message; + } + internalBinaryRead(reader, length, options, target) { + let message = target !== null && target !== undefined ? target : this.create(), end = reader.pos + length; + while (reader.pos < end) { + let [fieldNo, wireType] = reader.tag(); + switch (fieldNo) { + case 1: + message.workflowRunBackendId = reader.string(); + break; + case 2: + message.workflowJobRunBackendId = reader.string(); + break; + case 3: + message.name = reader.string(); + break; + default: + let u = options.readUnknownField; + if (u === "throw") + throw new globalThis.Error(`Unknown field ${fieldNo} (wire type ${wireType}) for ${this.typeName}`); + let d = reader.skip(wireType); + if (u !== false) + (u === true ? runtime_2.UnknownFieldHandler.onRead : u)(this.typeName, message, fieldNo, wireType, d); + } + } + return message; + } + internalBinaryWrite(message, writer, options) { + if (message.workflowRunBackendId !== "") + writer.tag(1, runtime_1.WireType.LengthDelimited).string(message.workflowRunBackendId); + if (message.workflowJobRunBackendId !== "") + writer.tag(2, runtime_1.WireType.LengthDelimited).string(message.workflowJobRunBackendId); + if (message.name !== "") + writer.tag(3, runtime_1.WireType.LengthDelimited).string(message.name); + let u = options.writeUnknownFields; + if (u !== false) + (u == true ? runtime_2.UnknownFieldHandler.onWrite : u)(this.typeName, message, writer); + return writer; + } + } + exports2.DeleteArtifactRequest = new DeleteArtifactRequest$Type; + + class DeleteArtifactResponse$Type extends runtime_5.MessageType { + constructor() { + super("github.actions.results.api.v1.DeleteArtifactResponse", [ + { no: 1, name: "ok", kind: "scalar", T: 8 }, + { no: 2, name: "artifact_id", kind: "scalar", T: 3 } + ]); + } + create(value) { + const message = { ok: false, artifactId: "0" }; + globalThis.Object.defineProperty(message, runtime_4.MESSAGE_TYPE, { enumerable: false, value: this }); + if (value !== undefined) + (0, runtime_3.reflectionMergePartial)(this, message, value); + return message; + } + internalBinaryRead(reader, length, options, target) { + let message = target !== null && target !== undefined ? target : this.create(), end = reader.pos + length; + while (reader.pos < end) { + let [fieldNo, wireType] = reader.tag(); + switch (fieldNo) { + case 1: + message.ok = reader.bool(); + break; + case 2: + message.artifactId = reader.int64().toString(); + break; + default: + let u = options.readUnknownField; + if (u === "throw") + throw new globalThis.Error(`Unknown field ${fieldNo} (wire type ${wireType}) for ${this.typeName}`); + let d = reader.skip(wireType); + if (u !== false) + (u === true ? runtime_2.UnknownFieldHandler.onRead : u)(this.typeName, message, fieldNo, wireType, d); + } + } + return message; + } + internalBinaryWrite(message, writer, options) { + if (message.ok !== false) + writer.tag(1, runtime_1.WireType.Varint).bool(message.ok); + if (message.artifactId !== "0") + writer.tag(2, runtime_1.WireType.Varint).int64(message.artifactId); + let u = options.writeUnknownFields; + if (u !== false) + (u == true ? runtime_2.UnknownFieldHandler.onWrite : u)(this.typeName, message, writer); + return writer; + } + } + exports2.DeleteArtifactResponse = new DeleteArtifactResponse$Type; + exports2.ArtifactService = new runtime_rpc_1.ServiceType("github.actions.results.api.v1.ArtifactService", [ + { name: "CreateArtifact", options: {}, I: exports2.CreateArtifactRequest, O: exports2.CreateArtifactResponse }, + { name: "FinalizeArtifact", options: {}, I: exports2.FinalizeArtifactRequest, O: exports2.FinalizeArtifactResponse }, + { name: "ListArtifacts", options: {}, I: exports2.ListArtifactsRequest, O: exports2.ListArtifactsResponse }, + { name: "GetSignedArtifactURL", options: {}, I: exports2.GetSignedArtifactURLRequest, O: exports2.GetSignedArtifactURLResponse }, + { name: "DeleteArtifact", options: {}, I: exports2.DeleteArtifactRequest, O: exports2.DeleteArtifactResponse } + ]); +}); + +// node_modules/twirp-ts/build/twirp/context.js +var require_context2 = __commonJS((exports2) => { + Object.defineProperty(exports2, "__esModule", { value: true }); +}); + +// node_modules/twirp-ts/build/twirp/hooks.js +var require_hooks = __commonJS((exports2) => { + var __awaiter = exports2 && exports2.__awaiter || function(thisArg, _arguments, P, generator) { + function adopt(value) { + return value instanceof P ? value : new P(function(resolve) { + resolve(value); + }); + } + return new (P || (P = Promise))(function(resolve, reject) { + function fulfilled(value) { + try { + step(generator.next(value)); + } catch (e) { + reject(e); + } + } + function rejected(value) { + try { + step(generator["throw"](value)); + } catch (e) { + reject(e); + } + } + function step(result) { + result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); + } + step((generator = generator.apply(thisArg, _arguments || [])).next()); + }); + }; + Object.defineProperty(exports2, "__esModule", { value: true }); + exports2.isHook = exports2.chainHooks = undefined; + function chainHooks(...hooks) { + if (hooks.length === 0) { + return null; + } + if (hooks.length === 1) { + return hooks[0]; + } + const serverHook = { + requestReceived(ctx) { + return __awaiter(this, undefined, undefined, function* () { + for (const hook of hooks) { + if (!hook.requestReceived) { + continue; + } + yield hook.requestReceived(ctx); + } + }); + }, + requestPrepared(ctx) { + return __awaiter(this, undefined, undefined, function* () { + for (const hook of hooks) { + if (!hook.requestPrepared) { + continue; + } + console.warn("hook requestPrepared is deprecated and will be removed in the next release. " + "Please use responsePrepared instead."); + yield hook.requestPrepared(ctx); + } + }); + }, + responsePrepared(ctx) { + return __awaiter(this, undefined, undefined, function* () { + for (const hook of hooks) { + if (!hook.responsePrepared) { + continue; + } + yield hook.responsePrepared(ctx); + } + }); + }, + requestSent(ctx) { + return __awaiter(this, undefined, undefined, function* () { + for (const hook of hooks) { + if (!hook.requestSent) { + continue; + } + console.warn("hook requestSent is deprecated and will be removed in the next release. " + "Please use responseSent instead."); + yield hook.requestSent(ctx); + } + }); + }, + responseSent(ctx) { + return __awaiter(this, undefined, undefined, function* () { + for (const hook of hooks) { + if (!hook.responseSent) { + continue; + } + yield hook.responseSent(ctx); + } + }); + }, + requestRouted(ctx) { + return __awaiter(this, undefined, undefined, function* () { + for (const hook of hooks) { + if (!hook.requestRouted) { + continue; + } + yield hook.requestRouted(ctx); + } + }); + }, + error(ctx, err) { + return __awaiter(this, undefined, undefined, function* () { + for (const hook of hooks) { + if (!hook.error) { + continue; + } + yield hook.error(ctx, err); + } + }); + } + }; + return serverHook; + } + exports2.chainHooks = chainHooks; + function isHook(object) { + return "requestReceived" in object || "requestPrepared" in object || "requestSent" in object || "requestRouted" in object || "responsePrepared" in object || "responseSent" in object || "error" in object; + } + exports2.isHook = isHook; +}); + +// node_modules/twirp-ts/build/twirp/errors.js +var require_errors2 = __commonJS((exports2) => { + Object.defineProperty(exports2, "__esModule", { value: true }); + exports2.isValidErrorCode = exports2.httpStatusFromErrorCode = exports2.TwirpErrorCode = exports2.BadRouteError = exports2.InternalServerErrorWith = exports2.InternalServerError = exports2.RequiredArgumentError = exports2.InvalidArgumentError = exports2.NotFoundError = exports2.TwirpError = undefined; + + class TwirpError extends Error { + constructor(code, msg) { + super(msg); + this.code = TwirpErrorCode.Internal; + this.meta = {}; + this.code = code; + this.msg = msg; + Object.setPrototypeOf(this, TwirpError.prototype); + } + withMeta(key, value) { + this.meta[key] = value; + return this; + } + getMeta(key) { + return this.meta[key] || ""; + } + withCause(err, addMeta = false) { + this._originalCause = err; + if (addMeta) { + this.withMeta("cause", err.message); + } + return this; + } + cause() { + return this._originalCause; + } + toJSON() { + try { + return JSON.stringify({ + code: this.code, + msg: this.msg, + meta: this.meta + }); + } catch (e) { + return `{"code": "internal", "msg": "There was an error but it could not be serialized into JSON"}`; + } + } + static fromObject(obj) { + const code = obj["code"] || TwirpErrorCode.Unknown; + const msg = obj["msg"] || "unknown"; + const error = new TwirpError(code, msg); + if (obj["meta"]) { + Object.keys(obj["meta"]).forEach((key) => { + error.withMeta(key, obj["meta"][key]); + }); + } + return error; + } + } + exports2.TwirpError = TwirpError; + + class NotFoundError extends TwirpError { + constructor(msg) { + super(TwirpErrorCode.NotFound, msg); + } + } + exports2.NotFoundError = NotFoundError; + + class InvalidArgumentError extends TwirpError { + constructor(argument, validationMsg) { + super(TwirpErrorCode.InvalidArgument, argument + " " + validationMsg); + this.withMeta("argument", argument); + } + } + exports2.InvalidArgumentError = InvalidArgumentError; + + class RequiredArgumentError extends InvalidArgumentError { + constructor(argument) { + super(argument, "is required"); + } + } + exports2.RequiredArgumentError = RequiredArgumentError; + + class InternalServerError extends TwirpError { + constructor(msg) { + super(TwirpErrorCode.Internal, msg); + } + } + exports2.InternalServerError = InternalServerError; + + class InternalServerErrorWith extends InternalServerError { + constructor(err) { + super(err.message); + this.withMeta("cause", err.name); + this.withCause(err); + } + } + exports2.InternalServerErrorWith = InternalServerErrorWith; + + class BadRouteError extends TwirpError { + constructor(msg, method, url) { + super(TwirpErrorCode.BadRoute, msg); + this.withMeta("twirp_invalid_route", method + " " + url); + } + } + exports2.BadRouteError = BadRouteError; + var TwirpErrorCode; + (function(TwirpErrorCode2) { + TwirpErrorCode2["Canceled"] = "canceled"; + TwirpErrorCode2["Unknown"] = "unknown"; + TwirpErrorCode2["InvalidArgument"] = "invalid_argument"; + TwirpErrorCode2["Malformed"] = "malformed"; + TwirpErrorCode2["DeadlineExceeded"] = "deadline_exceeded"; + TwirpErrorCode2["NotFound"] = "not_found"; + TwirpErrorCode2["BadRoute"] = "bad_route"; + TwirpErrorCode2["AlreadyExists"] = "already_exists"; + TwirpErrorCode2["PermissionDenied"] = "permission_denied"; + TwirpErrorCode2["Unauthenticated"] = "unauthenticated"; + TwirpErrorCode2["ResourceExhausted"] = "resource_exhausted"; + TwirpErrorCode2["FailedPrecondition"] = "failed_precondition"; + TwirpErrorCode2["Aborted"] = "aborted"; + TwirpErrorCode2["OutOfRange"] = "out_of_range"; + TwirpErrorCode2["Unimplemented"] = "unimplemented"; + TwirpErrorCode2["Internal"] = "internal"; + TwirpErrorCode2["Unavailable"] = "unavailable"; + TwirpErrorCode2["DataLoss"] = "data_loss"; + })(TwirpErrorCode = exports2.TwirpErrorCode || (exports2.TwirpErrorCode = {})); + function httpStatusFromErrorCode(code) { + switch (code) { + case TwirpErrorCode.Canceled: + return 408; + case TwirpErrorCode.Unknown: + return 500; + case TwirpErrorCode.InvalidArgument: + return 400; + case TwirpErrorCode.Malformed: + return 400; + case TwirpErrorCode.DeadlineExceeded: + return 408; + case TwirpErrorCode.NotFound: + return 404; + case TwirpErrorCode.BadRoute: + return 404; + case TwirpErrorCode.AlreadyExists: + return 409; + case TwirpErrorCode.PermissionDenied: + return 403; + case TwirpErrorCode.Unauthenticated: + return 401; + case TwirpErrorCode.ResourceExhausted: + return 429; + case TwirpErrorCode.FailedPrecondition: + return 412; + case TwirpErrorCode.Aborted: + return 409; + case TwirpErrorCode.OutOfRange: + return 400; + case TwirpErrorCode.Unimplemented: + return 501; + case TwirpErrorCode.Internal: + return 500; + case TwirpErrorCode.Unavailable: + return 503; + case TwirpErrorCode.DataLoss: + return 500; + default: + return 0; + } + } + exports2.httpStatusFromErrorCode = httpStatusFromErrorCode; + function isValidErrorCode(code) { + return httpStatusFromErrorCode(code) != 0; + } + exports2.isValidErrorCode = isValidErrorCode; +}); + +// node_modules/twirp-ts/build/twirp/request.js +var require_request3 = __commonJS((exports2) => { + var __awaiter = exports2 && exports2.__awaiter || function(thisArg, _arguments, P, generator) { + function adopt(value) { + return value instanceof P ? value : new P(function(resolve) { + resolve(value); + }); + } + return new (P || (P = Promise))(function(resolve, reject) { + function fulfilled(value) { + try { + step(generator.next(value)); + } catch (e) { + reject(e); + } + } + function rejected(value) { + try { + step(generator["throw"](value)); + } catch (e) { + reject(e); + } + } + function step(result) { + result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); + } + step((generator = generator.apply(thisArg, _arguments || [])).next()); + }); + }; + Object.defineProperty(exports2, "__esModule", { value: true }); + exports2.parseTwirpPath = exports2.getRequestData = exports2.validateRequest = exports2.getContentType = exports2.TwirpContentType = undefined; + var errors_1 = require_errors2(); + var TwirpContentType; + (function(TwirpContentType2) { + TwirpContentType2[TwirpContentType2["Protobuf"] = 0] = "Protobuf"; + TwirpContentType2[TwirpContentType2["JSON"] = 1] = "JSON"; + TwirpContentType2[TwirpContentType2["Unknown"] = 2] = "Unknown"; + })(TwirpContentType = exports2.TwirpContentType || (exports2.TwirpContentType = {})); + function getContentType(mimeType) { + switch (mimeType) { + case "application/protobuf": + return TwirpContentType.Protobuf; + case "application/json": + return TwirpContentType.JSON; + default: + return TwirpContentType.Unknown; + } + } + exports2.getContentType = getContentType; + function validateRequest(ctx, request, pathPrefix) { + if (request.method !== "POST") { + const msg = `unsupported method ${request.method} (only POST is allowed)`; + throw new errors_1.BadRouteError(msg, request.method || "", request.url || ""); + } + const path = parseTwirpPath(request.url || ""); + if (path.pkgService !== (ctx.packageName ? ctx.packageName + "." : "") + ctx.serviceName) { + const msg = `no handler for path ${request.url}`; + throw new errors_1.BadRouteError(msg, request.method || "", request.url || ""); + } + if (path.prefix !== pathPrefix) { + const msg = `invalid path prefix ${path.prefix}, expected ${pathPrefix}, on path ${request.url}`; + throw new errors_1.BadRouteError(msg, request.method || "", request.url || ""); + } + const mimeContentType = request.headers["content-type"] || ""; + if (ctx.contentType === TwirpContentType.Unknown) { + const msg = `unexpected Content-Type: ${request.headers["content-type"]}`; + throw new errors_1.BadRouteError(msg, request.method || "", request.url || ""); + } + return Object.assign(Object.assign({}, path), { mimeContentType, contentType: ctx.contentType }); + } + exports2.validateRequest = validateRequest; + function getRequestData(req) { + return new Promise((resolve, reject) => { + const reqWithRawBody = req; + if (reqWithRawBody.rawBody instanceof Buffer) { + resolve(reqWithRawBody.rawBody); + return; + } + const chunks = []; + req.on("data", (chunk) => chunks.push(chunk)); + req.on("end", () => __awaiter(this, undefined, undefined, function* () { + const data = Buffer.concat(chunks); + resolve(data); + })); + req.on("error", (err) => { + if (req.aborted) { + reject(new errors_1.TwirpError(errors_1.TwirpErrorCode.DeadlineExceeded, "failed to read request: deadline exceeded")); + } else { + reject(new errors_1.TwirpError(errors_1.TwirpErrorCode.Malformed, err.message).withCause(err)); + } + }); + req.on("close", () => { + reject(new errors_1.TwirpError(errors_1.TwirpErrorCode.Canceled, "failed to read request: context canceled")); + }); + }); + } + exports2.getRequestData = getRequestData; + function parseTwirpPath(path) { + const parts = path.split("/"); + if (parts.length < 2) { + return { + pkgService: "", + method: "", + prefix: "" + }; + } + return { + method: parts[parts.length - 1], + pkgService: parts[parts.length - 2], + prefix: parts.slice(0, parts.length - 2).join("/") + }; + } + exports2.parseTwirpPath = parseTwirpPath; +}); + +// node_modules/twirp-ts/build/twirp/server.js +var require_server = __commonJS((exports2) => { + var __awaiter = exports2 && exports2.__awaiter || function(thisArg, _arguments, P, generator) { + function adopt(value) { + return value instanceof P ? value : new P(function(resolve) { + resolve(value); + }); + } + return new (P || (P = Promise))(function(resolve, reject) { + function fulfilled(value) { + try { + step(generator.next(value)); + } catch (e) { + reject(e); + } + } + function rejected(value) { + try { + step(generator["throw"](value)); + } catch (e) { + reject(e); + } + } + function step(result) { + result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); + } + step((generator = generator.apply(thisArg, _arguments || [])).next()); + }); + }; + Object.defineProperty(exports2, "__esModule", { value: true }); + exports2.writeError = exports2.TwirpServer = undefined; + var hooks_1 = require_hooks(); + var request_1 = require_request3(); + var errors_1 = require_errors2(); + + class TwirpServer { + constructor(options) { + this.pathPrefix = "/twirp"; + this.hooks = []; + this.interceptors = []; + this.packageName = options.packageName; + this.serviceName = options.serviceName; + this.methodList = options.methodList; + this.matchRoute = options.matchRoute; + this.service = options.service; + } + get prefix() { + return this.pathPrefix; + } + httpHandler(options) { + return (req, resp) => { + if ((options === null || options === undefined ? undefined : options.prefix) !== undefined) { + this.withPrefix(options.prefix); + } + return this._httpHandler(req, resp); + }; + } + use(...middlewares) { + middlewares.forEach((middleware) => { + if (hooks_1.isHook(middleware)) { + this.hooks.push(middleware); + return this; + } + this.interceptors.push(middleware); + }); + return this; + } + withPrefix(prefix) { + if (prefix === false) { + this.pathPrefix = ""; + } else { + this.pathPrefix = prefix; + } + return this; + } + matchingPath() { + const baseRegex = this.baseURI().replace(/\./g, "\\."); + return new RegExp(`${baseRegex}/(${this.methodList.join("|")})`); + } + baseURI() { + return `${this.pathPrefix}/${this.packageName ? this.packageName + "." : ""}${this.serviceName}`; + } + createContext(req, res) { + return { + packageName: this.packageName, + serviceName: this.serviceName, + methodName: "", + contentType: request_1.getContentType(req.headers["content-type"]), + req, + res + }; + } + _httpHandler(req, resp) { + return __awaiter(this, undefined, undefined, function* () { + const ctx = this.createContext(req, resp); + try { + yield this.invokeHook("requestReceived", ctx); + const { method, mimeContentType } = request_1.validateRequest(ctx, req, this.pathPrefix || ""); + const handler = this.matchRoute(method, { + onMatch: (ctx2) => { + return this.invokeHook("requestRouted", ctx2); + }, + onNotFound: () => { + const msg = `no handler for path ${req.url}`; + throw new errors_1.BadRouteError(msg, req.method || "", req.url || ""); + } + }); + const body = yield request_1.getRequestData(req); + const response = yield handler(ctx, this.service, body, this.interceptors); + yield Promise.all([ + this.invokeHook("responsePrepared", ctx), + this.invokeHook("requestPrepared", ctx) + ]); + resp.statusCode = 200; + resp.setHeader("Content-Type", mimeContentType); + resp.end(response); + } catch (e) { + yield this.invokeHook("error", ctx, mustBeTwirpError(e)); + if (!resp.headersSent) { + writeError(resp, e); + } + } finally { + yield Promise.all([ + this.invokeHook("responseSent", ctx), + this.invokeHook("requestSent", ctx) + ]); + } + }); + } + invokeHook(hookName, ctx, err) { + return __awaiter(this, undefined, undefined, function* () { + if (this.hooks.length === 0) { + return; + } + const chainedHooks = hooks_1.chainHooks(...this.hooks); + const hook = chainedHooks === null || chainedHooks === undefined ? undefined : chainedHooks[hookName]; + if (hook) { + yield hook(ctx, err || new errors_1.InternalServerError("internal server error")); + } + }); + } + } + exports2.TwirpServer = TwirpServer; + function writeError(res, error) { + const twirpError = mustBeTwirpError(error); + res.setHeader("Content-Type", "application/json"); + res.statusCode = errors_1.httpStatusFromErrorCode(twirpError.code); + res.end(twirpError.toJSON()); + } + exports2.writeError = writeError; + function mustBeTwirpError(err) { + if (err instanceof errors_1.TwirpError) { + return err; + } + return new errors_1.InternalServerErrorWith(err); + } +}); + +// node_modules/twirp-ts/build/twirp/interceptors.js +var require_interceptors = __commonJS((exports2) => { + var __awaiter = exports2 && exports2.__awaiter || function(thisArg, _arguments, P, generator) { + function adopt(value) { + return value instanceof P ? value : new P(function(resolve) { + resolve(value); + }); + } + return new (P || (P = Promise))(function(resolve, reject) { + function fulfilled(value) { + try { + step(generator.next(value)); + } catch (e) { + reject(e); + } + } + function rejected(value) { + try { + step(generator["throw"](value)); + } catch (e) { + reject(e); + } + } + function step(result) { + result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); + } + step((generator = generator.apply(thisArg, _arguments || [])).next()); + }); + }; + Object.defineProperty(exports2, "__esModule", { value: true }); + exports2.chainInterceptors = undefined; + function chainInterceptors(...interceptors) { + if (interceptors.length === 0) { + return; + } + if (interceptors.length === 1) { + return interceptors[0]; + } + const first = interceptors[0]; + return (ctx, request, handler) => __awaiter(this, undefined, undefined, function* () { + let next = handler; + for (let i = interceptors.length - 1;i > 0; i--) { + next = ((next2) => (ctx2, typedRequest) => { + return interceptors[i](ctx2, typedRequest, next2); + })(next); + } + return first(ctx, request, next); + }); + } + exports2.chainInterceptors = chainInterceptors; +}); + +// node_modules/dot-object/index.js +var require_dot_object = __commonJS((exports2, module2) => { + function _process(v, mod) { + var i; + var r; + if (typeof mod === "function") { + r = mod(v); + if (r !== undefined) { + v = r; + } + } else if (Array.isArray(mod)) { + for (i = 0;i < mod.length; i++) { + r = mod[i](v); + if (r !== undefined) { + v = r; + } + } + } + return v; + } + function parseKey(key, val2) { + if (key[0] === "-" && Array.isArray(val2) && /^-\d+$/.test(key)) { + return val2.length + parseInt(key, 10); + } + return key; + } + function isIndex(k) { + return /^\d+$/.test(k); + } + function isObject(val2) { + return Object.prototype.toString.call(val2) === "[object Object]"; + } + function isArrayOrObject(val2) { + return Object(val2) === val2; + } + function isEmptyObject(val2) { + return Object.keys(val2).length === 0; + } + var blacklist = ["__proto__", "prototype", "constructor"]; + var blacklistFilter = function(part) { + return blacklist.indexOf(part) === -1; + }; + function parsePath(path, sep) { + if (path.indexOf("[") >= 0) { + path = path.replace(/\[/g, sep).replace(/]/g, ""); + } + var parts = path.split(sep); + var check = parts.filter(blacklistFilter); + if (check.length !== parts.length) { + throw Error("Refusing to update blacklisted property " + path); + } + return parts; + } + var hasOwnProperty = Object.prototype.hasOwnProperty; + function DotObject(separator, override, useArray, useBrackets) { + if (!(this instanceof DotObject)) { + return new DotObject(separator, override, useArray, useBrackets); + } + if (typeof override === "undefined") + override = false; + if (typeof useArray === "undefined") + useArray = true; + if (typeof useBrackets === "undefined") + useBrackets = true; + this.separator = separator || "."; + this.override = override; + this.useArray = useArray; + this.useBrackets = useBrackets; + this.keepArray = false; + this.cleanup = []; + } + var dotDefault = new DotObject(".", false, true, true); + function wrap(method) { + return function() { + return dotDefault[method].apply(dotDefault, arguments); + }; + } + DotObject.prototype._fill = function(a, obj, v, mod) { + var k = a.shift(); + if (a.length > 0) { + obj[k] = obj[k] || (this.useArray && isIndex(a[0]) ? [] : {}); + if (!isArrayOrObject(obj[k])) { + if (this.override) { + obj[k] = {}; + } else { + if (!(isArrayOrObject(v) && isEmptyObject(v))) { + throw new Error("Trying to redefine `" + k + "` which is a " + typeof obj[k]); + } + return; + } + } + this._fill(a, obj[k], v, mod); + } else { + if (!this.override && isArrayOrObject(obj[k]) && !isEmptyObject(obj[k])) { + if (!(isArrayOrObject(v) && isEmptyObject(v))) { + throw new Error("Trying to redefine non-empty obj['" + k + "']"); + } + return; + } + obj[k] = _process(v, mod); + } + }; + DotObject.prototype.object = function(obj, mods) { + var self2 = this; + Object.keys(obj).forEach(function(k) { + var mod = mods === undefined ? null : mods[k]; + var ok = parsePath(k, self2.separator).join(self2.separator); + if (ok.indexOf(self2.separator) !== -1) { + self2._fill(ok.split(self2.separator), obj, obj[k], mod); + delete obj[k]; + } else { + obj[k] = _process(obj[k], mod); + } + }); + return obj; + }; + DotObject.prototype.str = function(path, v, obj, mod) { + var ok = parsePath(path, this.separator).join(this.separator); + if (path.indexOf(this.separator) !== -1) { + this._fill(ok.split(this.separator), obj, v, mod); + } else { + obj[path] = _process(v, mod); + } + return obj; + }; + DotObject.prototype.pick = function(path, obj, remove, reindexArray) { + var i; + var keys; + var val2; + var key; + var cp; + keys = parsePath(path, this.separator); + for (i = 0;i < keys.length; i++) { + key = parseKey(keys[i], obj); + if (obj && typeof obj === "object" && key in obj) { + if (i === keys.length - 1) { + if (remove) { + val2 = obj[key]; + if (reindexArray && Array.isArray(obj)) { + obj.splice(key, 1); + } else { + delete obj[key]; + } + if (Array.isArray(obj)) { + cp = keys.slice(0, -1).join("."); + if (this.cleanup.indexOf(cp) === -1) { + this.cleanup.push(cp); + } + } + return val2; + } else { + return obj[key]; + } + } else { + obj = obj[key]; + } + } else { + return; + } + } + if (remove && Array.isArray(obj)) { + obj = obj.filter(function(n) { + return n !== undefined; + }); + } + return obj; + }; + DotObject.prototype.delete = function(path, obj) { + return this.remove(path, obj, true); + }; + DotObject.prototype.remove = function(path, obj, reindexArray) { + var i; + this.cleanup = []; + if (Array.isArray(path)) { + for (i = 0;i < path.length; i++) { + this.pick(path[i], obj, true, reindexArray); + } + if (!reindexArray) { + this._cleanup(obj); + } + return obj; + } else { + return this.pick(path, obj, true, reindexArray); + } + }; + DotObject.prototype._cleanup = function(obj) { + var ret; + var i; + var keys; + var root; + if (this.cleanup.length) { + for (i = 0;i < this.cleanup.length; i++) { + keys = this.cleanup[i].split("."); + root = keys.splice(0, -1).join("."); + ret = root ? this.pick(root, obj) : obj; + ret = ret[keys[0]].filter(function(v) { + return v !== undefined; + }); + this.set(this.cleanup[i], ret, obj); + } + this.cleanup = []; + } + }; + DotObject.prototype.del = DotObject.prototype.remove; + DotObject.prototype.move = function(source, target, obj, mods, merge) { + if (typeof mods === "function" || Array.isArray(mods)) { + this.set(target, _process(this.pick(source, obj, true), mods), obj, merge); + } else { + merge = mods; + this.set(target, this.pick(source, obj, true), obj, merge); + } + return obj; + }; + DotObject.prototype.transfer = function(source, target, obj1, obj2, mods, merge) { + if (typeof mods === "function" || Array.isArray(mods)) { + this.set(target, _process(this.pick(source, obj1, true), mods), obj2, merge); + } else { + merge = mods; + this.set(target, this.pick(source, obj1, true), obj2, merge); + } + return obj2; + }; + DotObject.prototype.copy = function(source, target, obj1, obj2, mods, merge) { + if (typeof mods === "function" || Array.isArray(mods)) { + this.set(target, _process(JSON.parse(JSON.stringify(this.pick(source, obj1, false))), mods), obj2, merge); + } else { + merge = mods; + this.set(target, this.pick(source, obj1, false), obj2, merge); + } + return obj2; + }; + DotObject.prototype.set = function(path, val2, obj, merge) { + var i; + var k; + var keys; + var key; + if (typeof val2 === "undefined") { + return obj; + } + keys = parsePath(path, this.separator); + for (i = 0;i < keys.length; i++) { + key = keys[i]; + if (i === keys.length - 1) { + if (merge && isObject(val2) && isObject(obj[key])) { + for (k in val2) { + if (hasOwnProperty.call(val2, k)) { + obj[key][k] = val2[k]; + } + } + } else if (merge && Array.isArray(obj[key]) && Array.isArray(val2)) { + for (var j = 0;j < val2.length; j++) { + obj[keys[i]].push(val2[j]); + } + } else { + obj[key] = val2; + } + } else if (!hasOwnProperty.call(obj, key) || !isObject(obj[key]) && !Array.isArray(obj[key])) { + if (/^\d+$/.test(keys[i + 1])) { + obj[key] = []; + } else { + obj[key] = {}; + } + } + obj = obj[key]; + } + return obj; + }; + DotObject.prototype.transform = function(recipe, obj, tgt) { + obj = obj || {}; + tgt = tgt || {}; + Object.keys(recipe).forEach(function(key) { + this.set(recipe[key], this.pick(key, obj), tgt); + }.bind(this)); + return tgt; + }; + DotObject.prototype.dot = function(obj, tgt, path) { + tgt = tgt || {}; + path = path || []; + var isArray = Array.isArray(obj); + Object.keys(obj).forEach(function(key) { + var index = isArray && this.useBrackets ? "[" + key + "]" : key; + if (isArrayOrObject(obj[key]) && (isObject(obj[key]) && !isEmptyObject(obj[key]) || Array.isArray(obj[key]) && !this.keepArray && obj[key].length !== 0)) { + if (isArray && this.useBrackets) { + var previousKey = path[path.length - 1] || ""; + return this.dot(obj[key], tgt, path.slice(0, -1).concat(previousKey + index)); + } else { + return this.dot(obj[key], tgt, path.concat(index)); + } + } else { + if (isArray && this.useBrackets) { + tgt[path.join(this.separator).concat("[" + key + "]")] = obj[key]; + } else { + tgt[path.concat(index).join(this.separator)] = obj[key]; + } + } + }.bind(this)); + return tgt; + }; + DotObject.pick = wrap("pick"); + DotObject.move = wrap("move"); + DotObject.transfer = wrap("transfer"); + DotObject.transform = wrap("transform"); + DotObject.copy = wrap("copy"); + DotObject.object = wrap("object"); + DotObject.str = wrap("str"); + DotObject.set = wrap("set"); + DotObject.delete = wrap("delete"); + DotObject.del = DotObject.remove = wrap("remove"); + DotObject.dot = wrap("dot"); + ["override", "overwrite"].forEach(function(prop) { + Object.defineProperty(DotObject, prop, { + get: function() { + return dotDefault.override; + }, + set: function(val2) { + dotDefault.override = !!val2; + } + }); + }); + ["useArray", "keepArray", "useBrackets"].forEach(function(prop) { + Object.defineProperty(DotObject, prop, { + get: function() { + return dotDefault[prop]; + }, + set: function(val2) { + dotDefault[prop] = val2; + } + }); + }); + DotObject._process = _process; + module2.exports = DotObject; +}); + +// node_modules/twirp-ts/build/twirp/http.client.js +var require_http_client = __commonJS((exports2) => { + var __createBinding = exports2 && exports2.__createBinding || (Object.create ? function(o, m, k, k2) { + if (k2 === undefined) + k2 = k; + Object.defineProperty(o, k2, { enumerable: true, get: function() { + return m[k]; + } }); + } : function(o, m, k, k2) { + if (k2 === undefined) + k2 = k; + o[k2] = m[k]; + }); + var __setModuleDefault = exports2 && exports2.__setModuleDefault || (Object.create ? function(o, v) { + Object.defineProperty(o, "default", { enumerable: true, value: v }); + } : function(o, v) { + o["default"] = v; + }); + var __importStar = exports2 && exports2.__importStar || function(mod) { + if (mod && mod.__esModule) + return mod; + var result = {}; + if (mod != null) { + for (var k in mod) + if (k !== "default" && Object.prototype.hasOwnProperty.call(mod, k)) + __createBinding(result, mod, k); + } + __setModuleDefault(result, mod); + return result; + }; + var __awaiter = exports2 && exports2.__awaiter || function(thisArg, _arguments, P, generator) { + function adopt(value) { + return value instanceof P ? value : new P(function(resolve) { + resolve(value); + }); + } + return new (P || (P = Promise))(function(resolve, reject) { + function fulfilled(value) { + try { + step(generator.next(value)); + } catch (e) { + reject(e); + } + } + function rejected(value) { + try { + step(generator["throw"](value)); + } catch (e) { + reject(e); + } + } + function step(result) { + result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); + } + step((generator = generator.apply(thisArg, _arguments || [])).next()); + }); + }; + Object.defineProperty(exports2, "__esModule", { value: true }); + exports2.FetchRPC = exports2.wrapErrorResponseToTwirpError = exports2.NodeHttpRPC = undefined; + var http = __importStar(require("http")); + var https = __importStar(require("https")); + var url_1 = require("url"); + var errors_1 = require_errors2(); + var NodeHttpRPC = (options) => ({ + request(service, method, contentType, data) { + let client; + return new Promise((resolve, rejected) => { + const responseChunks = []; + const requestData = contentType === "application/protobuf" ? Buffer.from(data) : JSON.stringify(data); + const url = new url_1.URL(options.baseUrl); + const isHttps = url.protocol === "https:"; + if (isHttps) { + client = https; + } else { + client = http; + } + const prefix = url.pathname !== "/" ? url.pathname : ""; + const req = client.request(Object.assign(Object.assign({}, options ? options : {}), { method: "POST", protocol: url.protocol, host: url.hostname, port: url.port ? url.port : isHttps ? 443 : 80, path: `${prefix}/${service}/${method}`, headers: Object.assign(Object.assign({}, options.headers ? options.headers : {}), { "Content-Type": contentType, "Content-Length": contentType === "application/protobuf" ? Buffer.byteLength(requestData) : Buffer.from(requestData).byteLength }) }), (res) => { + res.on("data", (chunk) => responseChunks.push(chunk)); + res.on("end", () => { + const data2 = Buffer.concat(responseChunks); + if (res.statusCode != 200) { + rejected(wrapErrorResponseToTwirpError(data2.toString())); + } else { + if (contentType === "application/json") { + resolve(JSON.parse(data2.toString())); + } else { + resolve(data2); + } + } + }); + res.on("error", (err) => { + rejected(err); + }); + }).on("error", (err) => { + rejected(err); + }); + req.end(requestData); + }); + } + }); + exports2.NodeHttpRPC = NodeHttpRPC; + function wrapErrorResponseToTwirpError(errorResponse) { + return errors_1.TwirpError.fromObject(JSON.parse(errorResponse)); + } + exports2.wrapErrorResponseToTwirpError = wrapErrorResponseToTwirpError; + var FetchRPC = (options) => ({ + request(service, method, contentType, data) { + return __awaiter(this, undefined, undefined, function* () { + const headers = new Headers(options.headers); + headers.set("content-type", contentType); + const response = yield fetch(`${options.baseUrl}/${service}/${method}`, Object.assign(Object.assign({}, options), { method: "POST", headers, body: data instanceof Uint8Array ? data : JSON.stringify(data) })); + if (response.status === 200) { + if (contentType === "application/json") { + return yield response.json(); + } + return new Uint8Array(yield response.arrayBuffer()); + } + throw errors_1.TwirpError.fromObject(yield response.json()); + }); + } + }); + exports2.FetchRPC = FetchRPC; +}); + +// node_modules/twirp-ts/build/twirp/gateway.js +var require_gateway = __commonJS((exports2) => { + var __createBinding = exports2 && exports2.__createBinding || (Object.create ? function(o, m, k, k2) { + if (k2 === undefined) + k2 = k; + Object.defineProperty(o, k2, { enumerable: true, get: function() { + return m[k]; + } }); + } : function(o, m, k, k2) { + if (k2 === undefined) + k2 = k; + o[k2] = m[k]; + }); + var __setModuleDefault = exports2 && exports2.__setModuleDefault || (Object.create ? function(o, v) { + Object.defineProperty(o, "default", { enumerable: true, value: v }); + } : function(o, v) { + o["default"] = v; + }); + var __importStar = exports2 && exports2.__importStar || function(mod) { + if (mod && mod.__esModule) + return mod; + var result = {}; + if (mod != null) { + for (var k in mod) + if (k !== "default" && Object.prototype.hasOwnProperty.call(mod, k)) + __createBinding(result, mod, k); + } + __setModuleDefault(result, mod); + return result; + }; + var __awaiter = exports2 && exports2.__awaiter || function(thisArg, _arguments, P, generator) { + function adopt(value) { + return value instanceof P ? value : new P(function(resolve) { + resolve(value); + }); + } + return new (P || (P = Promise))(function(resolve, reject) { + function fulfilled(value) { + try { + step(generator.next(value)); + } catch (e) { + reject(e); + } + } + function rejected(value) { + try { + step(generator["throw"](value)); + } catch (e) { + reject(e); + } + } + function step(result) { + result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); + } + step((generator = generator.apply(thisArg, _arguments || [])).next()); + }); + }; + var __rest = exports2 && exports2.__rest || function(s, e) { + var t = {}; + for (var p in s) + if (Object.prototype.hasOwnProperty.call(s, p) && e.indexOf(p) < 0) + t[p] = s[p]; + if (s != null && typeof Object.getOwnPropertySymbols === "function") + for (var i = 0, p = Object.getOwnPropertySymbols(s);i < p.length; i++) { + if (e.indexOf(p[i]) < 0 && Object.prototype.propertyIsEnumerable.call(s, p[i])) + t[p[i]] = s[p[i]]; + } + return t; + }; + Object.defineProperty(exports2, "__esModule", { value: true }); + exports2.Gateway = exports2.Pattern = undefined; + var querystring_1 = require("querystring"); + var dotObject = __importStar(require_dot_object()); + var request_1 = require_request3(); + var errors_1 = require_errors2(); + var http_client_1 = require_http_client(); + var server_1 = require_server(); + var Pattern; + (function(Pattern2) { + Pattern2["POST"] = "post"; + Pattern2["GET"] = "get"; + Pattern2["PATCH"] = "patch"; + Pattern2["PUT"] = "put"; + Pattern2["DELETE"] = "delete"; + })(Pattern = exports2.Pattern || (exports2.Pattern = {})); + + class Gateway { + constructor(routes) { + this.routes = routes; + } + twirpRewrite(prefix = "/twirp") { + return (req, resp, next) => { + this.rewrite(req, resp, prefix).then(() => next()).catch((e) => { + if (e instanceof errors_1.TwirpError) { + if (e.code !== errors_1.TwirpErrorCode.NotFound) { + server_1.writeError(resp, e); + } else { + next(); + } + } + }); + }; + } + rewrite(req, resp, prefix = "/twirp") { + return __awaiter(this, undefined, undefined, function* () { + const [match, route] = this.matchRoute(req); + const body = yield this.prepareTwirpBody(req, match, route); + const twirpUrl = `${prefix}/${route.packageName}.${route.serviceName}/${route.methodName}`; + req.url = twirpUrl; + req.originalUrl = twirpUrl; + req.method = "POST"; + req.headers["content-type"] = "application/json"; + req.rawBody = Buffer.from(JSON.stringify(body)); + if (route.responseBodyKey) { + const endFn = resp.end.bind(resp); + resp.end = function(chunk) { + if (resp.statusCode === 200) { + endFn(`{ "${route.responseBodyKey}": ${chunk} }`); + } else { + endFn(chunk); + } + }; + } + }); + } + reverseProxy(httpClientOption) { + const client = http_client_1.NodeHttpRPC(httpClientOption); + return (req, res) => __awaiter(this, undefined, undefined, function* () { + try { + const [match, route] = this.matchRoute(req); + const body = yield this.prepareTwirpBody(req, match, route); + const response = yield client.request(`${route.packageName}.${route.serviceName}`, route.methodName, "application/json", body); + res.statusCode = 200; + res.setHeader("content-type", "application/json"); + let jsonResponse; + if (route.responseBodyKey) { + jsonResponse = JSON.stringify({ [route.responseBodyKey]: response }); + } else { + jsonResponse = JSON.stringify(response); + } + res.end(jsonResponse); + } catch (e) { + server_1.writeError(res, e); + } + }); + } + prepareTwirpBody(req, match, route) { + return __awaiter(this, undefined, undefined, function* () { + const _a = match.params, { query_string } = _a, params = __rest(_a, ["query_string"]); + let requestBody = Object.assign({}, params); + if (query_string && route.bodyKey !== "*") { + const queryParams = this.parseQueryString(query_string); + requestBody = Object.assign(Object.assign({}, queryParams), requestBody); + } + let body = {}; + if (route.bodyKey) { + const data = yield request_1.getRequestData(req); + try { + const jsonBody = JSON.parse(data.toString() || "{}"); + if (route.bodyKey === "*") { + body = jsonBody; + } else { + body[route.bodyKey] = jsonBody; + } + } catch (e) { + const msg = "the json request could not be decoded"; + throw new errors_1.TwirpError(errors_1.TwirpErrorCode.Malformed, msg).withCause(e, true); + } + } + return Object.assign(Object.assign({}, body), requestBody); + }); + } + matchRoute(req) { + var _a; + const httpMethod = (_a = req.method) === null || _a === undefined ? undefined : _a.toLowerCase(); + if (!httpMethod) { + throw new errors_1.BadRouteError(`method not allowed`, req.method || "", req.url || ""); + } + const routes = this.routes[httpMethod]; + for (const route of routes) { + const match = route.matcher(req.url || "/"); + if (match) { + return [match, route]; + } + } + throw new errors_1.NotFoundError(`url ${req.url} not found`); + } + parseQueryString(queryString) { + const queryParams = querystring_1.parse(queryString.replace("?", "")); + return dotObject.object(queryParams); + } + } + exports2.Gateway = Gateway; +}); + +// node_modules/twirp-ts/build/twirp/index.js +var require_twirp = __commonJS((exports2) => { + var __createBinding = exports2 && exports2.__createBinding || (Object.create ? function(o, m, k, k2) { + if (k2 === undefined) + k2 = k; + Object.defineProperty(o, k2, { enumerable: true, get: function() { + return m[k]; + } }); + } : function(o, m, k, k2) { + if (k2 === undefined) + k2 = k; + o[k2] = m[k]; + }); + var __exportStar = exports2 && exports2.__exportStar || function(m, exports3) { + for (var p in m) + if (p !== "default" && !Object.prototype.hasOwnProperty.call(exports3, p)) + __createBinding(exports3, m, p); + }; + Object.defineProperty(exports2, "__esModule", { value: true }); + exports2.TwirpContentType = undefined; + __exportStar(require_context2(), exports2); + __exportStar(require_server(), exports2); + __exportStar(require_interceptors(), exports2); + __exportStar(require_hooks(), exports2); + __exportStar(require_errors2(), exports2); + __exportStar(require_gateway(), exports2); + __exportStar(require_http_client(), exports2); + var request_1 = require_request3(); + Object.defineProperty(exports2, "TwirpContentType", { enumerable: true, get: function() { + return request_1.TwirpContentType; + } }); +}); + +// node_modules/@actions/artifact/lib/generated/results/api/v1/artifact.twirp.js +var require_artifact_twirp = __commonJS((exports2) => { + var __awaiter = exports2 && exports2.__awaiter || function(thisArg, _arguments, P, generator) { + function adopt(value) { + return value instanceof P ? value : new P(function(resolve) { + resolve(value); + }); + } + return new (P || (P = Promise))(function(resolve, reject) { + function fulfilled(value) { + try { + step(generator.next(value)); + } catch (e) { + reject(e); + } + } + function rejected(value) { + try { + step(generator["throw"](value)); + } catch (e) { + reject(e); + } + } + function step(result) { + result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); + } + step((generator = generator.apply(thisArg, _arguments || [])).next()); + }); + }; + Object.defineProperty(exports2, "__esModule", { value: true }); + exports2.createArtifactServiceServer = exports2.ArtifactServiceMethodList = exports2.ArtifactServiceMethod = exports2.ArtifactServiceClientProtobuf = exports2.ArtifactServiceClientJSON = undefined; + var twirp_ts_1 = require_twirp(); + var artifact_1 = require_artifact(); + + class ArtifactServiceClientJSON { + constructor(rpc) { + this.rpc = rpc; + this.CreateArtifact.bind(this); + this.FinalizeArtifact.bind(this); + this.ListArtifacts.bind(this); + this.GetSignedArtifactURL.bind(this); + this.DeleteArtifact.bind(this); + } + CreateArtifact(request) { + const data = artifact_1.CreateArtifactRequest.toJson(request, { + useProtoFieldName: true, + emitDefaultValues: false + }); + const promise = this.rpc.request("github.actions.results.api.v1.ArtifactService", "CreateArtifact", "application/json", data); + return promise.then((data2) => artifact_1.CreateArtifactResponse.fromJson(data2, { + ignoreUnknownFields: true + })); + } + FinalizeArtifact(request) { + const data = artifact_1.FinalizeArtifactRequest.toJson(request, { + useProtoFieldName: true, + emitDefaultValues: false + }); + const promise = this.rpc.request("github.actions.results.api.v1.ArtifactService", "FinalizeArtifact", "application/json", data); + return promise.then((data2) => artifact_1.FinalizeArtifactResponse.fromJson(data2, { + ignoreUnknownFields: true + })); + } + ListArtifacts(request) { + const data = artifact_1.ListArtifactsRequest.toJson(request, { + useProtoFieldName: true, + emitDefaultValues: false + }); + const promise = this.rpc.request("github.actions.results.api.v1.ArtifactService", "ListArtifacts", "application/json", data); + return promise.then((data2) => artifact_1.ListArtifactsResponse.fromJson(data2, { ignoreUnknownFields: true })); + } + GetSignedArtifactURL(request) { + const data = artifact_1.GetSignedArtifactURLRequest.toJson(request, { + useProtoFieldName: true, + emitDefaultValues: false + }); + const promise = this.rpc.request("github.actions.results.api.v1.ArtifactService", "GetSignedArtifactURL", "application/json", data); + return promise.then((data2) => artifact_1.GetSignedArtifactURLResponse.fromJson(data2, { + ignoreUnknownFields: true + })); + } + DeleteArtifact(request) { + const data = artifact_1.DeleteArtifactRequest.toJson(request, { + useProtoFieldName: true, + emitDefaultValues: false + }); + const promise = this.rpc.request("github.actions.results.api.v1.ArtifactService", "DeleteArtifact", "application/json", data); + return promise.then((data2) => artifact_1.DeleteArtifactResponse.fromJson(data2, { + ignoreUnknownFields: true + })); + } + } + exports2.ArtifactServiceClientJSON = ArtifactServiceClientJSON; + + class ArtifactServiceClientProtobuf { + constructor(rpc) { + this.rpc = rpc; + this.CreateArtifact.bind(this); + this.FinalizeArtifact.bind(this); + this.ListArtifacts.bind(this); + this.GetSignedArtifactURL.bind(this); + this.DeleteArtifact.bind(this); + } + CreateArtifact(request) { + const data = artifact_1.CreateArtifactRequest.toBinary(request); + const promise = this.rpc.request("github.actions.results.api.v1.ArtifactService", "CreateArtifact", "application/protobuf", data); + return promise.then((data2) => artifact_1.CreateArtifactResponse.fromBinary(data2)); + } + FinalizeArtifact(request) { + const data = artifact_1.FinalizeArtifactRequest.toBinary(request); + const promise = this.rpc.request("github.actions.results.api.v1.ArtifactService", "FinalizeArtifact", "application/protobuf", data); + return promise.then((data2) => artifact_1.FinalizeArtifactResponse.fromBinary(data2)); + } + ListArtifacts(request) { + const data = artifact_1.ListArtifactsRequest.toBinary(request); + const promise = this.rpc.request("github.actions.results.api.v1.ArtifactService", "ListArtifacts", "application/protobuf", data); + return promise.then((data2) => artifact_1.ListArtifactsResponse.fromBinary(data2)); + } + GetSignedArtifactURL(request) { + const data = artifact_1.GetSignedArtifactURLRequest.toBinary(request); + const promise = this.rpc.request("github.actions.results.api.v1.ArtifactService", "GetSignedArtifactURL", "application/protobuf", data); + return promise.then((data2) => artifact_1.GetSignedArtifactURLResponse.fromBinary(data2)); + } + DeleteArtifact(request) { + const data = artifact_1.DeleteArtifactRequest.toBinary(request); + const promise = this.rpc.request("github.actions.results.api.v1.ArtifactService", "DeleteArtifact", "application/protobuf", data); + return promise.then((data2) => artifact_1.DeleteArtifactResponse.fromBinary(data2)); + } + } + exports2.ArtifactServiceClientProtobuf = ArtifactServiceClientProtobuf; + var ArtifactServiceMethod; + (function(ArtifactServiceMethod2) { + ArtifactServiceMethod2["CreateArtifact"] = "CreateArtifact"; + ArtifactServiceMethod2["FinalizeArtifact"] = "FinalizeArtifact"; + ArtifactServiceMethod2["ListArtifacts"] = "ListArtifacts"; + ArtifactServiceMethod2["GetSignedArtifactURL"] = "GetSignedArtifactURL"; + ArtifactServiceMethod2["DeleteArtifact"] = "DeleteArtifact"; + })(ArtifactServiceMethod || (exports2.ArtifactServiceMethod = ArtifactServiceMethod = {})); + exports2.ArtifactServiceMethodList = [ + ArtifactServiceMethod.CreateArtifact, + ArtifactServiceMethod.FinalizeArtifact, + ArtifactServiceMethod.ListArtifacts, + ArtifactServiceMethod.GetSignedArtifactURL, + ArtifactServiceMethod.DeleteArtifact + ]; + function createArtifactServiceServer(service) { + return new twirp_ts_1.TwirpServer({ + service, + packageName: "github.actions.results.api.v1", + serviceName: "ArtifactService", + methodList: exports2.ArtifactServiceMethodList, + matchRoute: matchArtifactServiceRoute + }); + } + exports2.createArtifactServiceServer = createArtifactServiceServer; + function matchArtifactServiceRoute(method, events) { + switch (method) { + case "CreateArtifact": + return (ctx, service, data, interceptors) => __awaiter(this, undefined, undefined, function* () { + ctx = Object.assign(Object.assign({}, ctx), { methodName: "CreateArtifact" }); + yield events.onMatch(ctx); + return handleArtifactServiceCreateArtifactRequest(ctx, service, data, interceptors); + }); + case "FinalizeArtifact": + return (ctx, service, data, interceptors) => __awaiter(this, undefined, undefined, function* () { + ctx = Object.assign(Object.assign({}, ctx), { methodName: "FinalizeArtifact" }); + yield events.onMatch(ctx); + return handleArtifactServiceFinalizeArtifactRequest(ctx, service, data, interceptors); + }); + case "ListArtifacts": + return (ctx, service, data, interceptors) => __awaiter(this, undefined, undefined, function* () { + ctx = Object.assign(Object.assign({}, ctx), { methodName: "ListArtifacts" }); + yield events.onMatch(ctx); + return handleArtifactServiceListArtifactsRequest(ctx, service, data, interceptors); + }); + case "GetSignedArtifactURL": + return (ctx, service, data, interceptors) => __awaiter(this, undefined, undefined, function* () { + ctx = Object.assign(Object.assign({}, ctx), { methodName: "GetSignedArtifactURL" }); + yield events.onMatch(ctx); + return handleArtifactServiceGetSignedArtifactURLRequest(ctx, service, data, interceptors); + }); + case "DeleteArtifact": + return (ctx, service, data, interceptors) => __awaiter(this, undefined, undefined, function* () { + ctx = Object.assign(Object.assign({}, ctx), { methodName: "DeleteArtifact" }); + yield events.onMatch(ctx); + return handleArtifactServiceDeleteArtifactRequest(ctx, service, data, interceptors); + }); + default: + events.onNotFound(); + const msg = `no handler found`; + throw new twirp_ts_1.TwirpError(twirp_ts_1.TwirpErrorCode.BadRoute, msg); + } + } + function handleArtifactServiceCreateArtifactRequest(ctx, service, data, interceptors) { + switch (ctx.contentType) { + case twirp_ts_1.TwirpContentType.JSON: + return handleArtifactServiceCreateArtifactJSON(ctx, service, data, interceptors); + case twirp_ts_1.TwirpContentType.Protobuf: + return handleArtifactServiceCreateArtifactProtobuf(ctx, service, data, interceptors); + default: + const msg = "unexpected Content-Type"; + throw new twirp_ts_1.TwirpError(twirp_ts_1.TwirpErrorCode.BadRoute, msg); + } + } + function handleArtifactServiceFinalizeArtifactRequest(ctx, service, data, interceptors) { + switch (ctx.contentType) { + case twirp_ts_1.TwirpContentType.JSON: + return handleArtifactServiceFinalizeArtifactJSON(ctx, service, data, interceptors); + case twirp_ts_1.TwirpContentType.Protobuf: + return handleArtifactServiceFinalizeArtifactProtobuf(ctx, service, data, interceptors); + default: + const msg = "unexpected Content-Type"; + throw new twirp_ts_1.TwirpError(twirp_ts_1.TwirpErrorCode.BadRoute, msg); + } + } + function handleArtifactServiceListArtifactsRequest(ctx, service, data, interceptors) { + switch (ctx.contentType) { + case twirp_ts_1.TwirpContentType.JSON: + return handleArtifactServiceListArtifactsJSON(ctx, service, data, interceptors); + case twirp_ts_1.TwirpContentType.Protobuf: + return handleArtifactServiceListArtifactsProtobuf(ctx, service, data, interceptors); + default: + const msg = "unexpected Content-Type"; + throw new twirp_ts_1.TwirpError(twirp_ts_1.TwirpErrorCode.BadRoute, msg); + } + } + function handleArtifactServiceGetSignedArtifactURLRequest(ctx, service, data, interceptors) { + switch (ctx.contentType) { + case twirp_ts_1.TwirpContentType.JSON: + return handleArtifactServiceGetSignedArtifactURLJSON(ctx, service, data, interceptors); + case twirp_ts_1.TwirpContentType.Protobuf: + return handleArtifactServiceGetSignedArtifactURLProtobuf(ctx, service, data, interceptors); + default: + const msg = "unexpected Content-Type"; + throw new twirp_ts_1.TwirpError(twirp_ts_1.TwirpErrorCode.BadRoute, msg); + } + } + function handleArtifactServiceDeleteArtifactRequest(ctx, service, data, interceptors) { + switch (ctx.contentType) { + case twirp_ts_1.TwirpContentType.JSON: + return handleArtifactServiceDeleteArtifactJSON(ctx, service, data, interceptors); + case twirp_ts_1.TwirpContentType.Protobuf: + return handleArtifactServiceDeleteArtifactProtobuf(ctx, service, data, interceptors); + default: + const msg = "unexpected Content-Type"; + throw new twirp_ts_1.TwirpError(twirp_ts_1.TwirpErrorCode.BadRoute, msg); + } + } + function handleArtifactServiceCreateArtifactJSON(ctx, service, data, interceptors) { + return __awaiter(this, undefined, undefined, function* () { + let request; + let response; + try { + const body = JSON.parse(data.toString() || "{}"); + request = artifact_1.CreateArtifactRequest.fromJson(body, { + ignoreUnknownFields: true + }); + } catch (e) { + if (e instanceof Error) { + const msg = "the json request could not be decoded"; + throw new twirp_ts_1.TwirpError(twirp_ts_1.TwirpErrorCode.Malformed, msg).withCause(e, true); + } + } + if (interceptors && interceptors.length > 0) { + const interceptor = (0, twirp_ts_1.chainInterceptors)(...interceptors); + response = yield interceptor(ctx, request, (ctx2, inputReq) => { + return service.CreateArtifact(ctx2, inputReq); + }); + } else { + response = yield service.CreateArtifact(ctx, request); + } + return JSON.stringify(artifact_1.CreateArtifactResponse.toJson(response, { + useProtoFieldName: true, + emitDefaultValues: false + })); + }); + } + function handleArtifactServiceFinalizeArtifactJSON(ctx, service, data, interceptors) { + return __awaiter(this, undefined, undefined, function* () { + let request; + let response; + try { + const body = JSON.parse(data.toString() || "{}"); + request = artifact_1.FinalizeArtifactRequest.fromJson(body, { + ignoreUnknownFields: true + }); + } catch (e) { + if (e instanceof Error) { + const msg = "the json request could not be decoded"; + throw new twirp_ts_1.TwirpError(twirp_ts_1.TwirpErrorCode.Malformed, msg).withCause(e, true); + } + } + if (interceptors && interceptors.length > 0) { + const interceptor = (0, twirp_ts_1.chainInterceptors)(...interceptors); + response = yield interceptor(ctx, request, (ctx2, inputReq) => { + return service.FinalizeArtifact(ctx2, inputReq); + }); + } else { + response = yield service.FinalizeArtifact(ctx, request); + } + return JSON.stringify(artifact_1.FinalizeArtifactResponse.toJson(response, { + useProtoFieldName: true, + emitDefaultValues: false + })); + }); + } + function handleArtifactServiceListArtifactsJSON(ctx, service, data, interceptors) { + return __awaiter(this, undefined, undefined, function* () { + let request; + let response; + try { + const body = JSON.parse(data.toString() || "{}"); + request = artifact_1.ListArtifactsRequest.fromJson(body, { + ignoreUnknownFields: true + }); + } catch (e) { + if (e instanceof Error) { + const msg = "the json request could not be decoded"; + throw new twirp_ts_1.TwirpError(twirp_ts_1.TwirpErrorCode.Malformed, msg).withCause(e, true); + } + } + if (interceptors && interceptors.length > 0) { + const interceptor = (0, twirp_ts_1.chainInterceptors)(...interceptors); + response = yield interceptor(ctx, request, (ctx2, inputReq) => { + return service.ListArtifacts(ctx2, inputReq); + }); + } else { + response = yield service.ListArtifacts(ctx, request); + } + return JSON.stringify(artifact_1.ListArtifactsResponse.toJson(response, { + useProtoFieldName: true, + emitDefaultValues: false + })); + }); + } + function handleArtifactServiceGetSignedArtifactURLJSON(ctx, service, data, interceptors) { + return __awaiter(this, undefined, undefined, function* () { + let request; + let response; + try { + const body = JSON.parse(data.toString() || "{}"); + request = artifact_1.GetSignedArtifactURLRequest.fromJson(body, { + ignoreUnknownFields: true + }); + } catch (e) { + if (e instanceof Error) { + const msg = "the json request could not be decoded"; + throw new twirp_ts_1.TwirpError(twirp_ts_1.TwirpErrorCode.Malformed, msg).withCause(e, true); + } + } + if (interceptors && interceptors.length > 0) { + const interceptor = (0, twirp_ts_1.chainInterceptors)(...interceptors); + response = yield interceptor(ctx, request, (ctx2, inputReq) => { + return service.GetSignedArtifactURL(ctx2, inputReq); + }); + } else { + response = yield service.GetSignedArtifactURL(ctx, request); + } + return JSON.stringify(artifact_1.GetSignedArtifactURLResponse.toJson(response, { + useProtoFieldName: true, + emitDefaultValues: false + })); + }); + } + function handleArtifactServiceDeleteArtifactJSON(ctx, service, data, interceptors) { + return __awaiter(this, undefined, undefined, function* () { + let request; + let response; + try { + const body = JSON.parse(data.toString() || "{}"); + request = artifact_1.DeleteArtifactRequest.fromJson(body, { + ignoreUnknownFields: true + }); + } catch (e) { + if (e instanceof Error) { + const msg = "the json request could not be decoded"; + throw new twirp_ts_1.TwirpError(twirp_ts_1.TwirpErrorCode.Malformed, msg).withCause(e, true); + } + } + if (interceptors && interceptors.length > 0) { + const interceptor = (0, twirp_ts_1.chainInterceptors)(...interceptors); + response = yield interceptor(ctx, request, (ctx2, inputReq) => { + return service.DeleteArtifact(ctx2, inputReq); + }); + } else { + response = yield service.DeleteArtifact(ctx, request); + } + return JSON.stringify(artifact_1.DeleteArtifactResponse.toJson(response, { + useProtoFieldName: true, + emitDefaultValues: false + })); + }); + } + function handleArtifactServiceCreateArtifactProtobuf(ctx, service, data, interceptors) { + return __awaiter(this, undefined, undefined, function* () { + let request; + let response; + try { + request = artifact_1.CreateArtifactRequest.fromBinary(data); + } catch (e) { + if (e instanceof Error) { + const msg = "the protobuf request could not be decoded"; + throw new twirp_ts_1.TwirpError(twirp_ts_1.TwirpErrorCode.Malformed, msg).withCause(e, true); + } + } + if (interceptors && interceptors.length > 0) { + const interceptor = (0, twirp_ts_1.chainInterceptors)(...interceptors); + response = yield interceptor(ctx, request, (ctx2, inputReq) => { + return service.CreateArtifact(ctx2, inputReq); + }); + } else { + response = yield service.CreateArtifact(ctx, request); + } + return Buffer.from(artifact_1.CreateArtifactResponse.toBinary(response)); + }); + } + function handleArtifactServiceFinalizeArtifactProtobuf(ctx, service, data, interceptors) { + return __awaiter(this, undefined, undefined, function* () { + let request; + let response; + try { + request = artifact_1.FinalizeArtifactRequest.fromBinary(data); + } catch (e) { + if (e instanceof Error) { + const msg = "the protobuf request could not be decoded"; + throw new twirp_ts_1.TwirpError(twirp_ts_1.TwirpErrorCode.Malformed, msg).withCause(e, true); + } + } + if (interceptors && interceptors.length > 0) { + const interceptor = (0, twirp_ts_1.chainInterceptors)(...interceptors); + response = yield interceptor(ctx, request, (ctx2, inputReq) => { + return service.FinalizeArtifact(ctx2, inputReq); + }); + } else { + response = yield service.FinalizeArtifact(ctx, request); + } + return Buffer.from(artifact_1.FinalizeArtifactResponse.toBinary(response)); + }); + } + function handleArtifactServiceListArtifactsProtobuf(ctx, service, data, interceptors) { + return __awaiter(this, undefined, undefined, function* () { + let request; + let response; + try { + request = artifact_1.ListArtifactsRequest.fromBinary(data); + } catch (e) { + if (e instanceof Error) { + const msg = "the protobuf request could not be decoded"; + throw new twirp_ts_1.TwirpError(twirp_ts_1.TwirpErrorCode.Malformed, msg).withCause(e, true); + } + } + if (interceptors && interceptors.length > 0) { + const interceptor = (0, twirp_ts_1.chainInterceptors)(...interceptors); + response = yield interceptor(ctx, request, (ctx2, inputReq) => { + return service.ListArtifacts(ctx2, inputReq); + }); + } else { + response = yield service.ListArtifacts(ctx, request); + } + return Buffer.from(artifact_1.ListArtifactsResponse.toBinary(response)); + }); + } + function handleArtifactServiceGetSignedArtifactURLProtobuf(ctx, service, data, interceptors) { + return __awaiter(this, undefined, undefined, function* () { + let request; + let response; + try { + request = artifact_1.GetSignedArtifactURLRequest.fromBinary(data); + } catch (e) { + if (e instanceof Error) { + const msg = "the protobuf request could not be decoded"; + throw new twirp_ts_1.TwirpError(twirp_ts_1.TwirpErrorCode.Malformed, msg).withCause(e, true); + } + } + if (interceptors && interceptors.length > 0) { + const interceptor = (0, twirp_ts_1.chainInterceptors)(...interceptors); + response = yield interceptor(ctx, request, (ctx2, inputReq) => { + return service.GetSignedArtifactURL(ctx2, inputReq); + }); + } else { + response = yield service.GetSignedArtifactURL(ctx, request); + } + return Buffer.from(artifact_1.GetSignedArtifactURLResponse.toBinary(response)); + }); + } + function handleArtifactServiceDeleteArtifactProtobuf(ctx, service, data, interceptors) { + return __awaiter(this, undefined, undefined, function* () { + let request; + let response; + try { + request = artifact_1.DeleteArtifactRequest.fromBinary(data); + } catch (e) { + if (e instanceof Error) { + const msg = "the protobuf request could not be decoded"; + throw new twirp_ts_1.TwirpError(twirp_ts_1.TwirpErrorCode.Malformed, msg).withCause(e, true); + } + } + if (interceptors && interceptors.length > 0) { + const interceptor = (0, twirp_ts_1.chainInterceptors)(...interceptors); + response = yield interceptor(ctx, request, (ctx2, inputReq) => { + return service.DeleteArtifact(ctx2, inputReq); + }); + } else { + response = yield service.DeleteArtifact(ctx, request); + } + return Buffer.from(artifact_1.DeleteArtifactResponse.toBinary(response)); + }); + } +}); + +// node_modules/@actions/artifact/lib/generated/index.js +var require_generated = __commonJS((exports2) => { + var __createBinding = exports2 && exports2.__createBinding || (Object.create ? function(o, m, k, k2) { + if (k2 === undefined) + k2 = k; + var desc = Object.getOwnPropertyDescriptor(m, k); + if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) { + desc = { enumerable: true, get: function() { + return m[k]; + } }; + } + Object.defineProperty(o, k2, desc); + } : function(o, m, k, k2) { + if (k2 === undefined) + k2 = k; + o[k2] = m[k]; + }); + var __exportStar = exports2 && exports2.__exportStar || function(m, exports3) { + for (var p in m) + if (p !== "default" && !Object.prototype.hasOwnProperty.call(exports3, p)) + __createBinding(exports3, m, p); + }; + Object.defineProperty(exports2, "__esModule", { value: true }); + __exportStar(require_timestamp(), exports2); + __exportStar(require_wrappers(), exports2); + __exportStar(require_artifact(), exports2); + __exportStar(require_artifact_twirp(), exports2); +}); + +// node_modules/@actions/artifact/lib/internal/upload/retention.js +var require_retention = __commonJS((exports2) => { + var __createBinding = exports2 && exports2.__createBinding || (Object.create ? function(o, m, k, k2) { + if (k2 === undefined) + k2 = k; + var desc = Object.getOwnPropertyDescriptor(m, k); + if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) { + desc = { enumerable: true, get: function() { + return m[k]; + } }; + } + Object.defineProperty(o, k2, desc); + } : function(o, m, k, k2) { + if (k2 === undefined) + k2 = k; + o[k2] = m[k]; + }); + var __setModuleDefault = exports2 && exports2.__setModuleDefault || (Object.create ? function(o, v) { + Object.defineProperty(o, "default", { enumerable: true, value: v }); + } : function(o, v) { + o["default"] = v; + }); + var __importStar = exports2 && exports2.__importStar || function(mod) { + if (mod && mod.__esModule) + return mod; + var result = {}; + if (mod != null) { + for (var k in mod) + if (k !== "default" && Object.prototype.hasOwnProperty.call(mod, k)) + __createBinding(result, mod, k); + } + __setModuleDefault(result, mod); + return result; + }; + Object.defineProperty(exports2, "__esModule", { value: true }); + exports2.getExpiration = undefined; + var generated_1 = require_generated(); + var core = __importStar(require_core()); + function getExpiration(retentionDays) { + if (!retentionDays) { + return; + } + const maxRetentionDays = getRetentionDays(); + if (maxRetentionDays && maxRetentionDays < retentionDays) { + core.warning(`Retention days cannot be greater than the maximum allowed retention set within the repository. Using ${maxRetentionDays} instead.`); + retentionDays = maxRetentionDays; + } + const expirationDate = new Date; + expirationDate.setDate(expirationDate.getDate() + retentionDays); + return generated_1.Timestamp.fromDate(expirationDate); + } + exports2.getExpiration = getExpiration; + function getRetentionDays() { + const retentionDays = process.env["GITHUB_RETENTION_DAYS"]; + if (!retentionDays) { + return; + } + const days = parseInt(retentionDays); + if (isNaN(days)) { + return; + } + return days; + } +}); + +// node_modules/@actions/artifact/lib/internal/upload/path-and-artifact-name-validation.js +var require_path_and_artifact_name_validation = __commonJS((exports2) => { + Object.defineProperty(exports2, "__esModule", { value: true }); + exports2.validateFilePath = exports2.validateArtifactName = undefined; + var core_1 = require_core(); + var invalidArtifactFilePathCharacters = new Map([ + ['"', ' Double quote "'], + [":", " Colon :"], + ["<", " Less than <"], + [">", " Greater than >"], + ["|", " Vertical bar |"], + ["*", " Asterisk *"], + ["?", " Question mark ?"], + ["\r", " Carriage return \\r"], + ["\n", " Line feed \\n"] + ]); + var invalidArtifactNameCharacters = new Map([ + ...invalidArtifactFilePathCharacters, + ["\\", " Backslash \\"], + ["/", " Forward slash /"] + ]); + function validateArtifactName(name) { + if (!name) { + throw new Error(`Provided artifact name input during validation is empty`); + } + for (const [invalidCharacterKey, errorMessageForCharacter] of invalidArtifactNameCharacters) { + if (name.includes(invalidCharacterKey)) { + throw new Error(`The artifact name is not valid: ${name}. Contains the following character: ${errorMessageForCharacter} + +Invalid characters include: ${Array.from(invalidArtifactNameCharacters.values()).toString()} + +These characters are not allowed in the artifact name due to limitations with certain file systems such as NTFS. To maintain file system agnostic behavior, these characters are intentionally not allowed to prevent potential problems with downloads on different file systems.`); + } + } + (0, core_1.info)(`Artifact name is valid!`); + } + exports2.validateArtifactName = validateArtifactName; + function validateFilePath(path) { + if (!path) { + throw new Error(`Provided file path input during validation is empty`); + } + for (const [invalidCharacterKey, errorMessageForCharacter] of invalidArtifactFilePathCharacters) { + if (path.includes(invalidCharacterKey)) { + throw new Error(`The path for one of the files in artifact is not valid: ${path}. Contains the following character: ${errorMessageForCharacter} + +Invalid characters include: ${Array.from(invalidArtifactFilePathCharacters.values()).toString()} + +The following characters are not allowed in files that are uploaded due to limitations with certain file systems such as NTFS. To maintain file system agnostic behavior, these characters are intentionally not allowed to prevent potential problems with downloads on different file systems. + `); + } + } + } + exports2.validateFilePath = validateFilePath; +}); + +// node_modules/@actions/artifact/package.json +var require_package = __commonJS((exports2, module2) => { + module2.exports = { + name: "@actions/artifact", + version: "2.1.11", + preview: true, + description: "Actions artifact lib", + keywords: [ + "github", + "actions", + "artifact" + ], + homepage: "https://github.com/actions/toolkit/tree/main/packages/artifact", + license: "MIT", + main: "lib/artifact.js", + types: "lib/artifact.d.ts", + directories: { + lib: "lib", + test: "__tests__" + }, + files: [ + "lib", + "!.DS_Store" + ], + publishConfig: { + access: "public" + }, + repository: { + type: "git", + url: "git+https://github.com/actions/toolkit.git", + directory: "packages/artifact" + }, + scripts: { + "audit-moderate": "npm install && npm audit --json --audit-level=moderate > audit.json", + test: "cd ../../ && npm run test ./packages/artifact", + bootstrap: "cd ../../ && npm run bootstrap", + "tsc-run": "tsc", + tsc: "npm run bootstrap && npm run tsc-run", + "gen:docs": "typedoc --plugin typedoc-plugin-markdown --out docs/generated src/artifact.ts --githubPages false --readme none" + }, + bugs: { + url: "https://github.com/actions/toolkit/issues" + }, + dependencies: { + "@actions/core": "^1.10.0", + "@actions/github": "^5.1.1", + "@actions/http-client": "^2.1.0", + "@azure/storage-blob": "^12.15.0", + "@octokit/core": "^3.5.1", + "@octokit/plugin-request-log": "^1.0.4", + "@octokit/plugin-retry": "^3.0.9", + "@octokit/request-error": "^5.0.0", + "@protobuf-ts/plugin": "^2.2.3-alpha.1", + archiver: "^7.0.1", + "jwt-decode": "^3.1.2", + "twirp-ts": "^2.5.0", + "unzip-stream": "^0.3.1" + }, + devDependencies: { + "@types/archiver": "^5.3.2", + "@types/unzip-stream": "^0.3.4", + typedoc: "^0.25.4", + "typedoc-plugin-markdown": "^3.17.1", + typescript: "^5.2.2" + } + }; +}); + +// node_modules/@actions/artifact/lib/internal/shared/user-agent.js +var require_user_agent = __commonJS((exports2) => { + Object.defineProperty(exports2, "__esModule", { value: true }); + exports2.getUserAgentString = undefined; + var packageJson = require_package(); + function getUserAgentString() { + return `@actions/artifact-${packageJson.version}`; + } + exports2.getUserAgentString = getUserAgentString; +}); + +// node_modules/@actions/artifact/lib/internal/shared/errors.js +var require_errors3 = __commonJS((exports2) => { + Object.defineProperty(exports2, "__esModule", { value: true }); + exports2.UsageError = exports2.NetworkError = exports2.GHESNotSupportedError = exports2.ArtifactNotFoundError = exports2.InvalidResponseError = exports2.FilesNotFoundError = undefined; + + class FilesNotFoundError extends Error { + constructor(files = []) { + let message = "No files were found to upload"; + if (files.length > 0) { + message += `: ${files.join(", ")}`; + } + super(message); + this.files = files; + this.name = "FilesNotFoundError"; + } + } + exports2.FilesNotFoundError = FilesNotFoundError; + + class InvalidResponseError extends Error { + constructor(message) { + super(message); + this.name = "InvalidResponseError"; + } + } + exports2.InvalidResponseError = InvalidResponseError; + + class ArtifactNotFoundError extends Error { + constructor(message = "Artifact not found") { + super(message); + this.name = "ArtifactNotFoundError"; + } + } + exports2.ArtifactNotFoundError = ArtifactNotFoundError; + + class GHESNotSupportedError extends Error { + constructor(message = "@actions/artifact v2.0.0+, upload-artifact@v4+ and download-artifact@v4+ are not currently supported on GHES.") { + super(message); + this.name = "GHESNotSupportedError"; + } + } + exports2.GHESNotSupportedError = GHESNotSupportedError; + + class NetworkError extends Error { + constructor(code) { + const message = `Unable to make request: ${code}\nIf you are using self-hosted runners, please make sure your runner has access to all GitHub endpoints: https://docs.github.com/en/actions/hosting-your-own-runners/managing-self-hosted-runners/about-self-hosted-runners#communication-between-self-hosted-runners-and-github`; + super(message); + this.code = code; + this.name = "NetworkError"; + } + } + exports2.NetworkError = NetworkError; + NetworkError.isNetworkErrorCode = (code) => { + if (!code) + return false; + return [ + "ECONNRESET", + "ENOTFOUND", + "ETIMEDOUT", + "ECONNREFUSED", + "EHOSTUNREACH" + ].includes(code); + }; + + class UsageError extends Error { + constructor() { + const message = `Artifact storage quota has been hit. Unable to upload any new artifacts. Usage is recalculated every 6-12 hours.\nMore info on storage limits: https://docs.github.com/en/billing/managing-billing-for-github-actions/about-billing-for-github-actions#calculating-minute-and-storage-spending`; + super(message); + this.name = "UsageError"; + } + } + exports2.UsageError = UsageError; + UsageError.isUsageErrorMessage = (msg) => { + if (!msg) + return false; + return msg.includes("insufficient usage"); + }; +}); + +// node_modules/@actions/artifact/lib/internal/shared/artifact-twirp-client.js +var require_artifact_twirp_client = __commonJS((exports2) => { + var __awaiter = exports2 && exports2.__awaiter || function(thisArg, _arguments, P, generator) { + function adopt(value) { + return value instanceof P ? value : new P(function(resolve) { + resolve(value); + }); + } + return new (P || (P = Promise))(function(resolve, reject) { + function fulfilled(value) { + try { + step(generator.next(value)); + } catch (e) { + reject(e); + } + } + function rejected(value) { + try { + step(generator["throw"](value)); + } catch (e) { + reject(e); + } + } + function step(result) { + result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); + } + step((generator = generator.apply(thisArg, _arguments || [])).next()); + }); + }; + Object.defineProperty(exports2, "__esModule", { value: true }); + exports2.internalArtifactTwirpClient = undefined; + var http_client_1 = require_lib(); + var auth_1 = require_auth(); + var core_1 = require_core(); + var generated_1 = require_generated(); + var config_1 = require_config(); + var user_agent_1 = require_user_agent(); + var errors_1 = require_errors3(); + + class ArtifactHttpClient { + constructor(userAgent, maxAttempts, baseRetryIntervalMilliseconds, retryMultiplier) { + this.maxAttempts = 5; + this.baseRetryIntervalMilliseconds = 3000; + this.retryMultiplier = 1.5; + const token = (0, config_1.getRuntimeToken)(); + this.baseUrl = (0, config_1.getResultsServiceUrl)(); + if (maxAttempts) { + this.maxAttempts = maxAttempts; + } + if (baseRetryIntervalMilliseconds) { + this.baseRetryIntervalMilliseconds = baseRetryIntervalMilliseconds; + } + if (retryMultiplier) { + this.retryMultiplier = retryMultiplier; + } + this.httpClient = new http_client_1.HttpClient(userAgent, [ + new auth_1.BearerCredentialHandler(token) + ]); + } + request(service, method, contentType, data) { + return __awaiter(this, undefined, undefined, function* () { + const url = new URL(`/twirp/${service}/${method}`, this.baseUrl).href; + (0, core_1.debug)(`[Request] ${method} ${url}`); + const headers = { + "Content-Type": contentType + }; + try { + const { body } = yield this.retryableRequest(() => __awaiter(this, undefined, undefined, function* () { + return this.httpClient.post(url, JSON.stringify(data), headers); + })); + return body; + } catch (error) { + throw new Error(`Failed to ${method}: ${error.message}`); + } + }); + } + retryableRequest(operation) { + return __awaiter(this, undefined, undefined, function* () { + let attempt = 0; + let errorMessage = ""; + let rawBody = ""; + while (attempt < this.maxAttempts) { + let isRetryable = false; + try { + const response = yield operation(); + const statusCode = response.message.statusCode; + rawBody = yield response.readBody(); + (0, core_1.debug)(`[Response] - ${response.message.statusCode}`); + (0, core_1.debug)(`Headers: ${JSON.stringify(response.message.headers, null, 2)}`); + const body = JSON.parse(rawBody); + (0, core_1.debug)(`Body: ${JSON.stringify(body, null, 2)}`); + if (this.isSuccessStatusCode(statusCode)) { + return { response, body }; + } + isRetryable = this.isRetryableHttpStatusCode(statusCode); + errorMessage = `Failed request: (${statusCode}) ${response.message.statusMessage}`; + if (body.msg) { + if (errors_1.UsageError.isUsageErrorMessage(body.msg)) { + throw new errors_1.UsageError; + } + errorMessage = `${errorMessage}: ${body.msg}`; + } + } catch (error) { + if (error instanceof SyntaxError) { + (0, core_1.debug)(`Raw Body: ${rawBody}`); + } + if (error instanceof errors_1.UsageError) { + throw error; + } + if (errors_1.NetworkError.isNetworkErrorCode(error === null || error === undefined ? undefined : error.code)) { + throw new errors_1.NetworkError(error === null || error === undefined ? undefined : error.code); + } + isRetryable = true; + errorMessage = error.message; + } + if (!isRetryable) { + throw new Error(`Received non-retryable error: ${errorMessage}`); + } + if (attempt + 1 === this.maxAttempts) { + throw new Error(`Failed to make request after ${this.maxAttempts} attempts: ${errorMessage}`); + } + const retryTimeMilliseconds = this.getExponentialRetryTimeMilliseconds(attempt); + (0, core_1.info)(`Attempt ${attempt + 1} of ${this.maxAttempts} failed with error: ${errorMessage}. Retrying request in ${retryTimeMilliseconds} ms...`); + yield this.sleep(retryTimeMilliseconds); + attempt++; + } + throw new Error(`Request failed`); + }); + } + isSuccessStatusCode(statusCode) { + if (!statusCode) + return false; + return statusCode >= 200 && statusCode < 300; + } + isRetryableHttpStatusCode(statusCode) { + if (!statusCode) + return false; + const retryableStatusCodes = [ + http_client_1.HttpCodes.BadGateway, + http_client_1.HttpCodes.GatewayTimeout, + http_client_1.HttpCodes.InternalServerError, + http_client_1.HttpCodes.ServiceUnavailable, + http_client_1.HttpCodes.TooManyRequests + ]; + return retryableStatusCodes.includes(statusCode); + } + sleep(milliseconds) { + return __awaiter(this, undefined, undefined, function* () { + return new Promise((resolve) => setTimeout(resolve, milliseconds)); + }); + } + getExponentialRetryTimeMilliseconds(attempt) { + if (attempt < 0) { + throw new Error("attempt should be a positive integer"); + } + if (attempt === 0) { + return this.baseRetryIntervalMilliseconds; + } + const minTime = this.baseRetryIntervalMilliseconds * Math.pow(this.retryMultiplier, attempt); + const maxTime = minTime * this.retryMultiplier; + return Math.trunc(Math.random() * (maxTime - minTime) + minTime); + } + } + function internalArtifactTwirpClient(options) { + const client = new ArtifactHttpClient((0, user_agent_1.getUserAgentString)(), options === null || options === undefined ? undefined : options.maxAttempts, options === null || options === undefined ? undefined : options.retryIntervalMs, options === null || options === undefined ? undefined : options.retryMultiplier); + return new generated_1.ArtifactServiceClientJSON(client); + } + exports2.internalArtifactTwirpClient = internalArtifactTwirpClient; +}); + +// node_modules/@actions/artifact/lib/internal/upload/upload-zip-specification.js +var require_upload_zip_specification = __commonJS((exports2) => { + var __createBinding = exports2 && exports2.__createBinding || (Object.create ? function(o, m, k, k2) { + if (k2 === undefined) + k2 = k; + var desc = Object.getOwnPropertyDescriptor(m, k); + if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) { + desc = { enumerable: true, get: function() { + return m[k]; + } }; + } + Object.defineProperty(o, k2, desc); + } : function(o, m, k, k2) { + if (k2 === undefined) + k2 = k; + o[k2] = m[k]; + }); + var __setModuleDefault = exports2 && exports2.__setModuleDefault || (Object.create ? function(o, v) { + Object.defineProperty(o, "default", { enumerable: true, value: v }); + } : function(o, v) { + o["default"] = v; + }); + var __importStar = exports2 && exports2.__importStar || function(mod) { + if (mod && mod.__esModule) + return mod; + var result = {}; + if (mod != null) { + for (var k in mod) + if (k !== "default" && Object.prototype.hasOwnProperty.call(mod, k)) + __createBinding(result, mod, k); + } + __setModuleDefault(result, mod); + return result; + }; + Object.defineProperty(exports2, "__esModule", { value: true }); + exports2.getUploadZipSpecification = exports2.validateRootDirectory = undefined; + var fs = __importStar(require("fs")); + var core_1 = require_core(); + var path_1 = require("path"); + var path_and_artifact_name_validation_1 = require_path_and_artifact_name_validation(); + function validateRootDirectory(rootDirectory) { + if (!fs.existsSync(rootDirectory)) { + throw new Error(`The provided rootDirectory ${rootDirectory} does not exist`); + } + if (!fs.statSync(rootDirectory).isDirectory()) { + throw new Error(`The provided rootDirectory ${rootDirectory} is not a valid directory`); + } + (0, core_1.info)(`Root directory input is valid!`); + } + exports2.validateRootDirectory = validateRootDirectory; + function getUploadZipSpecification(filesToZip, rootDirectory) { + const specification = []; + rootDirectory = (0, path_1.normalize)(rootDirectory); + rootDirectory = (0, path_1.resolve)(rootDirectory); + for (let file of filesToZip) { + const stats = fs.lstatSync(file, { throwIfNoEntry: false }); + if (!stats) { + throw new Error(`File ${file} does not exist`); + } + if (!stats.isDirectory()) { + file = (0, path_1.normalize)(file); + file = (0, path_1.resolve)(file); + if (!file.startsWith(rootDirectory)) { + throw new Error(`The rootDirectory: ${rootDirectory} is not a parent directory of the file: ${file}`); + } + const uploadPath = file.replace(rootDirectory, ""); + (0, path_and_artifact_name_validation_1.validateFilePath)(uploadPath); + specification.push({ + sourcePath: file, + destinationPath: uploadPath, + stats + }); + } else { + const directoryPath = file.replace(rootDirectory, ""); + (0, path_and_artifact_name_validation_1.validateFilePath)(directoryPath); + specification.push({ + sourcePath: null, + destinationPath: directoryPath, + stats + }); + } + } + return specification; + } + exports2.getUploadZipSpecification = getUploadZipSpecification; +}); + +// node_modules/jwt-decode/build/jwt-decode.cjs.js +var require_jwt_decode_cjs = __commonJS((exports2, module2) => { + function e(e2) { + this.message = e2; + } + e.prototype = new Error, e.prototype.name = "InvalidCharacterError"; + var r = typeof window != "undefined" && window.atob && window.atob.bind(window) || function(r2) { + var t2 = String(r2).replace(/=+$/, ""); + if (t2.length % 4 == 1) + throw new e("'atob' failed: The string to be decoded is not correctly encoded."); + for (var n2, o2, a2 = 0, i = 0, c = "";o2 = t2.charAt(i++); ~o2 && (n2 = a2 % 4 ? 64 * n2 + o2 : o2, a2++ % 4) ? c += String.fromCharCode(255 & n2 >> (-2 * a2 & 6)) : 0) + o2 = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/=".indexOf(o2); + return c; + }; + function t(e2) { + var t2 = e2.replace(/-/g, "+").replace(/_/g, "/"); + switch (t2.length % 4) { + case 0: + break; + case 2: + t2 += "=="; + break; + case 3: + t2 += "="; + break; + default: + throw "Illegal base64url string!"; + } + try { + return function(e3) { + return decodeURIComponent(r(e3).replace(/(.)/g, function(e4, r2) { + var t3 = r2.charCodeAt(0).toString(16).toUpperCase(); + return t3.length < 2 && (t3 = "0" + t3), "%" + t3; + })); + }(t2); + } catch (e3) { + return r(t2); + } + } + function n(e2) { + this.message = e2; + } + function o(e2, r2) { + if (typeof e2 != "string") + throw new n("Invalid token specified"); + var o2 = (r2 = r2 || {}).header === true ? 0 : 1; + try { + return JSON.parse(t(e2.split(".")[o2])); + } catch (e3) { + throw new n("Invalid token specified: " + e3.message); + } + } + n.prototype = new Error, n.prototype.name = "InvalidTokenError"; + var a = o; + a.default = o, a.InvalidTokenError = n, module2.exports = a; +}); + +// node_modules/@actions/artifact/lib/internal/shared/util.js +var require_util8 = __commonJS((exports2) => { + var __createBinding = exports2 && exports2.__createBinding || (Object.create ? function(o, m, k, k2) { + if (k2 === undefined) + k2 = k; + var desc = Object.getOwnPropertyDescriptor(m, k); + if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) { + desc = { enumerable: true, get: function() { + return m[k]; + } }; + } + Object.defineProperty(o, k2, desc); + } : function(o, m, k, k2) { + if (k2 === undefined) + k2 = k; + o[k2] = m[k]; + }); + var __setModuleDefault = exports2 && exports2.__setModuleDefault || (Object.create ? function(o, v) { + Object.defineProperty(o, "default", { enumerable: true, value: v }); + } : function(o, v) { + o["default"] = v; + }); + var __importStar = exports2 && exports2.__importStar || function(mod) { + if (mod && mod.__esModule) + return mod; + var result = {}; + if (mod != null) { + for (var k in mod) + if (k !== "default" && Object.prototype.hasOwnProperty.call(mod, k)) + __createBinding(result, mod, k); + } + __setModuleDefault(result, mod); + return result; + }; + var __importDefault = exports2 && exports2.__importDefault || function(mod) { + return mod && mod.__esModule ? mod : { default: mod }; + }; + Object.defineProperty(exports2, "__esModule", { value: true }); + exports2.getBackendIdsFromToken = undefined; + var core = __importStar(require_core()); + var config_1 = require_config(); + var jwt_decode_1 = __importDefault(require_jwt_decode_cjs()); + var InvalidJwtError = new Error("Failed to get backend IDs: The provided JWT token is invalid and/or missing claims"); + function getBackendIdsFromToken() { + const token = (0, config_1.getRuntimeToken)(); + const decoded = (0, jwt_decode_1.default)(token); + if (!decoded.scp) { + throw InvalidJwtError; + } + const scpParts = decoded.scp.split(" "); + if (scpParts.length === 0) { + throw InvalidJwtError; + } + for (const scopes of scpParts) { + const scopeParts = scopes.split(":"); + if ((scopeParts === null || scopeParts === undefined ? undefined : scopeParts[0]) !== "Actions.Results") { + continue; + } + if (scopeParts.length !== 3) { + throw InvalidJwtError; + } + const ids = { + workflowRunBackendId: scopeParts[1], + workflowJobRunBackendId: scopeParts[2] + }; + core.debug(`Workflow Run Backend ID: ${ids.workflowRunBackendId}`); + core.debug(`Workflow Job Run Backend ID: ${ids.workflowJobRunBackendId}`); + return ids; + } + throw InvalidJwtError; + } + exports2.getBackendIdsFromToken = getBackendIdsFromToken; +}); + +// node_modules/@azure/core-rest-pipeline/dist/commonjs/pipeline.js +var require_pipeline = __commonJS((exports2) => { + Object.defineProperty(exports2, "__esModule", { value: true }); + exports2.createEmptyPipeline = createEmptyPipeline; + var ValidPhaseNames = new Set(["Deserialize", "Serialize", "Retry", "Sign"]); + + class HttpPipeline { + constructor(policies) { + var _a; + this._policies = []; + this._policies = (_a = policies === null || policies === undefined ? undefined : policies.slice(0)) !== null && _a !== undefined ? _a : []; + this._orderedPolicies = undefined; + } + addPolicy(policy, options = {}) { + if (options.phase && options.afterPhase) { + throw new Error("Policies inside a phase cannot specify afterPhase."); + } + if (options.phase && !ValidPhaseNames.has(options.phase)) { + throw new Error(`Invalid phase name: ${options.phase}`); + } + if (options.afterPhase && !ValidPhaseNames.has(options.afterPhase)) { + throw new Error(`Invalid afterPhase name: ${options.afterPhase}`); + } + this._policies.push({ + policy, + options + }); + this._orderedPolicies = undefined; + } + removePolicy(options) { + const removedPolicies = []; + this._policies = this._policies.filter((policyDescriptor) => { + if (options.name && policyDescriptor.policy.name === options.name || options.phase && policyDescriptor.options.phase === options.phase) { + removedPolicies.push(policyDescriptor.policy); + return false; + } else { + return true; + } + }); + this._orderedPolicies = undefined; + return removedPolicies; + } + sendRequest(httpClient, request) { + const policies = this.getOrderedPolicies(); + const pipeline = policies.reduceRight((next, policy) => { + return (req) => { + return policy.sendRequest(req, next); + }; + }, (req) => httpClient.sendRequest(req)); + return pipeline(request); + } + getOrderedPolicies() { + if (!this._orderedPolicies) { + this._orderedPolicies = this.orderPolicies(); + } + return this._orderedPolicies; + } + clone() { + return new HttpPipeline(this._policies); + } + static create() { + return new HttpPipeline; + } + orderPolicies() { + const result = []; + const policyMap = new Map; + function createPhase(name) { + return { + name, + policies: new Set, + hasRun: false, + hasAfterPolicies: false + }; + } + const serializePhase = createPhase("Serialize"); + const noPhase = createPhase("None"); + const deserializePhase = createPhase("Deserialize"); + const retryPhase = createPhase("Retry"); + const signPhase = createPhase("Sign"); + const orderedPhases = [serializePhase, noPhase, deserializePhase, retryPhase, signPhase]; + function getPhase(phase) { + if (phase === "Retry") { + return retryPhase; + } else if (phase === "Serialize") { + return serializePhase; + } else if (phase === "Deserialize") { + return deserializePhase; + } else if (phase === "Sign") { + return signPhase; + } else { + return noPhase; + } + } + for (const descriptor of this._policies) { + const policy = descriptor.policy; + const options = descriptor.options; + const policyName = policy.name; + if (policyMap.has(policyName)) { + throw new Error("Duplicate policy names not allowed in pipeline"); + } + const node = { + policy, + dependsOn: new Set, + dependants: new Set + }; + if (options.afterPhase) { + node.afterPhase = getPhase(options.afterPhase); + node.afterPhase.hasAfterPolicies = true; + } + policyMap.set(policyName, node); + const phase = getPhase(options.phase); + phase.policies.add(node); + } + for (const descriptor of this._policies) { + const { policy, options } = descriptor; + const policyName = policy.name; + const node = policyMap.get(policyName); + if (!node) { + throw new Error(`Missing node for policy ${policyName}`); + } + if (options.afterPolicies) { + for (const afterPolicyName of options.afterPolicies) { + const afterNode = policyMap.get(afterPolicyName); + if (afterNode) { + node.dependsOn.add(afterNode); + afterNode.dependants.add(node); + } + } + } + if (options.beforePolicies) { + for (const beforePolicyName of options.beforePolicies) { + const beforeNode = policyMap.get(beforePolicyName); + if (beforeNode) { + beforeNode.dependsOn.add(node); + node.dependants.add(beforeNode); + } + } + } + } + function walkPhase(phase) { + phase.hasRun = true; + for (const node of phase.policies) { + if (node.afterPhase && (!node.afterPhase.hasRun || node.afterPhase.policies.size)) { + continue; + } + if (node.dependsOn.size === 0) { + result.push(node.policy); + for (const dependant of node.dependants) { + dependant.dependsOn.delete(node); + } + policyMap.delete(node.policy.name); + phase.policies.delete(node); + } + } + } + function walkPhases() { + for (const phase of orderedPhases) { + walkPhase(phase); + if (phase.policies.size > 0 && phase !== noPhase) { + if (!noPhase.hasRun) { + walkPhase(noPhase); + } + return; + } + if (phase.hasAfterPolicies) { + walkPhase(noPhase); + } + } + } + let iteration = 0; + while (policyMap.size > 0) { + iteration++; + const initialResultLength = result.length; + walkPhases(); + if (result.length <= initialResultLength && iteration > 1) { + throw new Error("Cannot satisfy policy dependencies due to requirements cycle."); + } + } + return result; + } + } + function createEmptyPipeline() { + return HttpPipeline.create(); + } +}); + +// node_modules/tslib/tslib.js +var require_tslib = __commonJS((exports2, module2) => { + var __extends; + var __assign; + var __rest; + var __decorate; + var __param; + var __esDecorate; + var __runInitializers; + var __propKey; + var __setFunctionName; + var __metadata; + var __awaiter; + var __generator; + var __exportStar; + var __values; + var __read; + var __spread; + var __spreadArrays; + var __spreadArray; + var __await; + var __asyncGenerator; + var __asyncDelegator; + var __asyncValues; + var __makeTemplateObject; + var __importStar; + var __importDefault; + var __classPrivateFieldGet; + var __classPrivateFieldSet; + var __classPrivateFieldIn; + var __createBinding; + var __addDisposableResource; + var __disposeResources; + var __rewriteRelativeImportExtension; + (function(factory) { + var root = typeof global === "object" ? global : typeof self === "object" ? self : typeof this === "object" ? this : {}; + if (typeof define === "function" && define.amd) { + define("tslib", ["exports"], function(exports3) { + factory(createExporter(root, createExporter(exports3))); + }); + } else if (typeof module2 === "object" && typeof module2.exports === "object") { + factory(createExporter(root, createExporter(module2.exports))); + } else { + factory(createExporter(root)); + } + function createExporter(exports3, previous) { + if (exports3 !== root) { + if (typeof Object.create === "function") { + Object.defineProperty(exports3, "__esModule", { value: true }); + } else { + exports3.__esModule = true; + } + } + return function(id, v) { + return exports3[id] = previous ? previous(id, v) : v; + }; + } + })(function(exporter) { + var extendStatics = Object.setPrototypeOf || { __proto__: [] } instanceof Array && function(d, b) { + d.__proto__ = b; + } || function(d, b) { + for (var p in b) + if (Object.prototype.hasOwnProperty.call(b, p)) + d[p] = b[p]; + }; + __extends = function(d, b) { + if (typeof b !== "function" && b !== null) + throw new TypeError("Class extends value " + String(b) + " is not a constructor or null"); + extendStatics(d, b); + function __() { + this.constructor = d; + } + d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __); + }; + __assign = Object.assign || function(t) { + for (var s, i = 1, n = arguments.length;i < n; i++) { + s = arguments[i]; + for (var p in s) + if (Object.prototype.hasOwnProperty.call(s, p)) + t[p] = s[p]; + } + return t; + }; + __rest = function(s, e) { + var t = {}; + for (var p in s) + if (Object.prototype.hasOwnProperty.call(s, p) && e.indexOf(p) < 0) + t[p] = s[p]; + if (s != null && typeof Object.getOwnPropertySymbols === "function") + for (var i = 0, p = Object.getOwnPropertySymbols(s);i < p.length; i++) { + if (e.indexOf(p[i]) < 0 && Object.prototype.propertyIsEnumerable.call(s, p[i])) + t[p[i]] = s[p[i]]; + } + return t; + }; + __decorate = function(decorators, target, key, desc) { + var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d; + if (typeof Reflect === "object" && typeof Reflect.decorate === "function") + r = Reflect.decorate(decorators, target, key, desc); + else + for (var i = decorators.length - 1;i >= 0; i--) + if (d = decorators[i]) + r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r; + return c > 3 && r && Object.defineProperty(target, key, r), r; + }; + __param = function(paramIndex, decorator) { + return function(target, key) { + decorator(target, key, paramIndex); + }; + }; + __esDecorate = function(ctor, descriptorIn, decorators, contextIn, initializers, extraInitializers) { + function accept(f) { + if (f !== undefined && typeof f !== "function") + throw new TypeError("Function expected"); + return f; + } + var kind = contextIn.kind, key = kind === "getter" ? "get" : kind === "setter" ? "set" : "value"; + var target = !descriptorIn && ctor ? contextIn["static"] ? ctor : ctor.prototype : null; + var descriptor = descriptorIn || (target ? Object.getOwnPropertyDescriptor(target, contextIn.name) : {}); + var _2, done = false; + for (var i = decorators.length - 1;i >= 0; i--) { + var context = {}; + for (var p in contextIn) + context[p] = p === "access" ? {} : contextIn[p]; + for (var p in contextIn.access) + context.access[p] = contextIn.access[p]; + context.addInitializer = function(f) { + if (done) + throw new TypeError("Cannot add initializers after decoration has completed"); + extraInitializers.push(accept(f || null)); + }; + var result = (0, decorators[i])(kind === "accessor" ? { get: descriptor.get, set: descriptor.set } : descriptor[key], context); + if (kind === "accessor") { + if (result === undefined) + continue; + if (result === null || typeof result !== "object") + throw new TypeError("Object expected"); + if (_2 = accept(result.get)) + descriptor.get = _2; + if (_2 = accept(result.set)) + descriptor.set = _2; + if (_2 = accept(result.init)) + initializers.unshift(_2); + } else if (_2 = accept(result)) { + if (kind === "field") + initializers.unshift(_2); + else + descriptor[key] = _2; + } + } + if (target) + Object.defineProperty(target, contextIn.name, descriptor); + done = true; + }; + __runInitializers = function(thisArg, initializers, value) { + var useValue = arguments.length > 2; + for (var i = 0;i < initializers.length; i++) { + value = useValue ? initializers[i].call(thisArg, value) : initializers[i].call(thisArg); + } + return useValue ? value : undefined; + }; + __propKey = function(x) { + return typeof x === "symbol" ? x : "".concat(x); + }; + __setFunctionName = function(f, name, prefix) { + if (typeof name === "symbol") + name = name.description ? "[".concat(name.description, "]") : ""; + return Object.defineProperty(f, "name", { configurable: true, value: prefix ? "".concat(prefix, " ", name) : name }); + }; + __metadata = function(metadataKey, metadataValue) { + if (typeof Reflect === "object" && typeof Reflect.metadata === "function") + return Reflect.metadata(metadataKey, metadataValue); + }; + __awaiter = function(thisArg, _arguments, P, generator) { + function adopt(value) { + return value instanceof P ? value : new P(function(resolve) { + resolve(value); + }); + } + return new (P || (P = Promise))(function(resolve, reject) { + function fulfilled(value) { + try { + step(generator.next(value)); + } catch (e) { + reject(e); + } + } + function rejected(value) { + try { + step(generator["throw"](value)); + } catch (e) { + reject(e); + } + } + function step(result) { + result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); + } + step((generator = generator.apply(thisArg, _arguments || [])).next()); + }); + }; + __generator = function(thisArg, body) { + var _2 = { label: 0, sent: function() { + if (t[0] & 1) + throw t[1]; + return t[1]; + }, trys: [], ops: [] }, f, y, t, g = Object.create((typeof Iterator === "function" ? Iterator : Object).prototype); + return g.next = verb(0), g["throw"] = verb(1), g["return"] = verb(2), typeof Symbol === "function" && (g[Symbol.iterator] = function() { + return this; + }), g; + function verb(n) { + return function(v) { + return step([n, v]); + }; + } + function step(op) { + if (f) + throw new TypeError("Generator is already executing."); + while (g && (g = 0, op[0] && (_2 = 0)), _2) + try { + if (f = 1, y && (t = op[0] & 2 ? y["return"] : op[0] ? y["throw"] || ((t = y["return"]) && t.call(y), 0) : y.next) && !(t = t.call(y, op[1])).done) + return t; + if (y = 0, t) + op = [op[0] & 2, t.value]; + switch (op[0]) { + case 0: + case 1: + t = op; + break; + case 4: + _2.label++; + return { value: op[1], done: false }; + case 5: + _2.label++; + y = op[1]; + op = [0]; + continue; + case 7: + op = _2.ops.pop(); + _2.trys.pop(); + continue; + default: + if (!(t = _2.trys, t = t.length > 0 && t[t.length - 1]) && (op[0] === 6 || op[0] === 2)) { + _2 = 0; + continue; + } + if (op[0] === 3 && (!t || op[1] > t[0] && op[1] < t[3])) { + _2.label = op[1]; + break; + } + if (op[0] === 6 && _2.label < t[1]) { + _2.label = t[1]; + t = op; + break; + } + if (t && _2.label < t[2]) { + _2.label = t[2]; + _2.ops.push(op); + break; + } + if (t[2]) + _2.ops.pop(); + _2.trys.pop(); + continue; + } + op = body.call(thisArg, _2); + } catch (e) { + op = [6, e]; + y = 0; + } finally { + f = t = 0; + } + if (op[0] & 5) + throw op[1]; + return { value: op[0] ? op[1] : undefined, done: true }; + } + }; + __exportStar = function(m, o) { + for (var p in m) + if (p !== "default" && !Object.prototype.hasOwnProperty.call(o, p)) + __createBinding(o, m, p); + }; + __createBinding = Object.create ? function(o, m, k, k2) { + if (k2 === undefined) + k2 = k; + var desc = Object.getOwnPropertyDescriptor(m, k); + if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) { + desc = { enumerable: true, get: function() { + return m[k]; + } }; + } + Object.defineProperty(o, k2, desc); + } : function(o, m, k, k2) { + if (k2 === undefined) + k2 = k; + o[k2] = m[k]; + }; + __values = function(o) { + var s = typeof Symbol === "function" && Symbol.iterator, m = s && o[s], i = 0; + if (m) + return m.call(o); + if (o && typeof o.length === "number") + return { + next: function() { + if (o && i >= o.length) + o = undefined; + return { value: o && o[i++], done: !o }; + } + }; + throw new TypeError(s ? "Object is not iterable." : "Symbol.iterator is not defined."); + }; + __read = function(o, n) { + var m = typeof Symbol === "function" && o[Symbol.iterator]; + if (!m) + return o; + var i = m.call(o), r, ar = [], e; + try { + while ((n === undefined || n-- > 0) && !(r = i.next()).done) + ar.push(r.value); + } catch (error) { + e = { error }; + } finally { + try { + if (r && !r.done && (m = i["return"])) + m.call(i); + } finally { + if (e) + throw e.error; + } + } + return ar; + }; + __spread = function() { + for (var ar = [], i = 0;i < arguments.length; i++) + ar = ar.concat(__read(arguments[i])); + return ar; + }; + __spreadArrays = function() { + for (var s = 0, i = 0, il = arguments.length;i < il; i++) + s += arguments[i].length; + for (var r = Array(s), k = 0, i = 0;i < il; i++) + for (var a = arguments[i], j = 0, jl = a.length;j < jl; j++, k++) + r[k] = a[j]; + return r; + }; + __spreadArray = function(to, from, pack) { + if (pack || arguments.length === 2) + for (var i = 0, l = from.length, ar;i < l; i++) { + if (ar || !(i in from)) { + if (!ar) + ar = Array.prototype.slice.call(from, 0, i); + ar[i] = from[i]; + } + } + return to.concat(ar || Array.prototype.slice.call(from)); + }; + __await = function(v) { + return this instanceof __await ? (this.v = v, this) : new __await(v); + }; + __asyncGenerator = function(thisArg, _arguments, generator) { + if (!Symbol.asyncIterator) + throw new TypeError("Symbol.asyncIterator is not defined."); + var g = generator.apply(thisArg, _arguments || []), i, q = []; + return i = Object.create((typeof AsyncIterator === "function" ? AsyncIterator : Object).prototype), verb("next"), verb("throw"), verb("return", awaitReturn), i[Symbol.asyncIterator] = function() { + return this; + }, i; + function awaitReturn(f) { + return function(v) { + return Promise.resolve(v).then(f, reject); + }; + } + function verb(n, f) { + if (g[n]) { + i[n] = function(v) { + return new Promise(function(a, b) { + q.push([n, v, a, b]) > 1 || resume(n, v); + }); + }; + if (f) + i[n] = f(i[n]); + } + } + function resume(n, v) { + try { + step(g[n](v)); + } catch (e) { + settle(q[0][3], e); + } + } + function step(r) { + r.value instanceof __await ? Promise.resolve(r.value.v).then(fulfill, reject) : settle(q[0][2], r); + } + function fulfill(value) { + resume("next", value); + } + function reject(value) { + resume("throw", value); + } + function settle(f, v) { + if (f(v), q.shift(), q.length) + resume(q[0][0], q[0][1]); + } + }; + __asyncDelegator = function(o) { + var i, p; + return i = {}, verb("next"), verb("throw", function(e) { + throw e; + }), verb("return"), i[Symbol.iterator] = function() { + return this; + }, i; + function verb(n, f) { + i[n] = o[n] ? function(v) { + return (p = !p) ? { value: __await(o[n](v)), done: false } : f ? f(v) : v; + } : f; + } + }; + __asyncValues = function(o) { + if (!Symbol.asyncIterator) + throw new TypeError("Symbol.asyncIterator is not defined."); + var m = o[Symbol.asyncIterator], i; + return m ? m.call(o) : (o = typeof __values === "function" ? __values(o) : o[Symbol.iterator](), i = {}, verb("next"), verb("throw"), verb("return"), i[Symbol.asyncIterator] = function() { + return this; + }, i); + function verb(n) { + i[n] = o[n] && function(v) { + return new Promise(function(resolve, reject) { + v = o[n](v), settle(resolve, reject, v.done, v.value); + }); + }; + } + function settle(resolve, reject, d, v) { + Promise.resolve(v).then(function(v2) { + resolve({ value: v2, done: d }); + }, reject); + } + }; + __makeTemplateObject = function(cooked, raw) { + if (Object.defineProperty) { + Object.defineProperty(cooked, "raw", { value: raw }); + } else { + cooked.raw = raw; + } + return cooked; + }; + var __setModuleDefault = Object.create ? function(o, v) { + Object.defineProperty(o, "default", { enumerable: true, value: v }); + } : function(o, v) { + o["default"] = v; + }; + __importStar = function(mod) { + if (mod && mod.__esModule) + return mod; + var result = {}; + if (mod != null) { + for (var k in mod) + if (k !== "default" && Object.prototype.hasOwnProperty.call(mod, k)) + __createBinding(result, mod, k); + } + __setModuleDefault(result, mod); + return result; + }; + __importDefault = function(mod) { + return mod && mod.__esModule ? mod : { default: mod }; + }; + __classPrivateFieldGet = function(receiver, state, kind, f) { + if (kind === "a" && !f) + throw new TypeError("Private accessor was defined without a getter"); + if (typeof state === "function" ? receiver !== state || !f : !state.has(receiver)) + throw new TypeError("Cannot read private member from an object whose class did not declare it"); + return kind === "m" ? f : kind === "a" ? f.call(receiver) : f ? f.value : state.get(receiver); + }; + __classPrivateFieldSet = function(receiver, state, value, kind, f) { + if (kind === "m") + throw new TypeError("Private method is not writable"); + if (kind === "a" && !f) + throw new TypeError("Private accessor was defined without a setter"); + if (typeof state === "function" ? receiver !== state || !f : !state.has(receiver)) + throw new TypeError("Cannot write private member to an object whose class did not declare it"); + return kind === "a" ? f.call(receiver, value) : f ? f.value = value : state.set(receiver, value), value; + }; + __classPrivateFieldIn = function(state, receiver) { + if (receiver === null || typeof receiver !== "object" && typeof receiver !== "function") + throw new TypeError("Cannot use 'in' operator on non-object"); + return typeof state === "function" ? receiver === state : state.has(receiver); + }; + __addDisposableResource = function(env, value, async) { + if (value !== null && value !== undefined) { + if (typeof value !== "object" && typeof value !== "function") + throw new TypeError("Object expected."); + var dispose, inner; + if (async) { + if (!Symbol.asyncDispose) + throw new TypeError("Symbol.asyncDispose is not defined."); + dispose = value[Symbol.asyncDispose]; + } + if (dispose === undefined) { + if (!Symbol.dispose) + throw new TypeError("Symbol.dispose is not defined."); + dispose = value[Symbol.dispose]; + if (async) + inner = dispose; + } + if (typeof dispose !== "function") + throw new TypeError("Object not disposable."); + if (inner) + dispose = function() { + try { + inner.call(this); + } catch (e) { + return Promise.reject(e); + } + }; + env.stack.push({ value, dispose, async }); + } else if (async) { + env.stack.push({ async: true }); + } + return value; + }; + var _SuppressedError = typeof SuppressedError === "function" ? SuppressedError : function(error, suppressed, message) { + var e = new Error(message); + return e.name = "SuppressedError", e.error = error, e.suppressed = suppressed, e; + }; + __disposeResources = function(env) { + function fail(e) { + env.error = env.hasError ? new _SuppressedError(e, env.error, "An error was suppressed during disposal.") : e; + env.hasError = true; + } + var r, s = 0; + function next() { + while (r = env.stack.pop()) { + try { + if (!r.async && s === 1) + return s = 0, env.stack.push(r), Promise.resolve().then(next); + if (r.dispose) { + var result = r.dispose.call(r.value); + if (r.async) + return s |= 2, Promise.resolve(result).then(next, function(e) { + fail(e); + return next(); + }); + } else + s |= 1; + } catch (e) { + fail(e); + } + } + if (s === 1) + return env.hasError ? Promise.reject(env.error) : Promise.resolve(); + if (env.hasError) + throw env.error; + } + return next(); + }; + __rewriteRelativeImportExtension = function(path, preserveJsx) { + if (typeof path === "string" && /^\.\.?\//.test(path)) { + return path.replace(/\.(tsx)$|((?:\.d)?)((?:\.[^./]+?)?)\.([cm]?)ts$/i, function(m, tsx, d, ext, cm) { + return tsx ? preserveJsx ? ".jsx" : ".js" : d && (!ext || !cm) ? m : d + ext + "." + cm.toLowerCase() + "js"; + }); + } + return path; + }; + exporter("__extends", __extends); + exporter("__assign", __assign); + exporter("__rest", __rest); + exporter("__decorate", __decorate); + exporter("__param", __param); + exporter("__esDecorate", __esDecorate); + exporter("__runInitializers", __runInitializers); + exporter("__propKey", __propKey); + exporter("__setFunctionName", __setFunctionName); + exporter("__metadata", __metadata); + exporter("__awaiter", __awaiter); + exporter("__generator", __generator); + exporter("__exportStar", __exportStar); + exporter("__createBinding", __createBinding); + exporter("__values", __values); + exporter("__read", __read); + exporter("__spread", __spread); + exporter("__spreadArrays", __spreadArrays); + exporter("__spreadArray", __spreadArray); + exporter("__await", __await); + exporter("__asyncGenerator", __asyncGenerator); + exporter("__asyncDelegator", __asyncDelegator); + exporter("__asyncValues", __asyncValues); + exporter("__makeTemplateObject", __makeTemplateObject); + exporter("__importStar", __importStar); + exporter("__importDefault", __importDefault); + exporter("__classPrivateFieldGet", __classPrivateFieldGet); + exporter("__classPrivateFieldSet", __classPrivateFieldSet); + exporter("__classPrivateFieldIn", __classPrivateFieldIn); + exporter("__addDisposableResource", __addDisposableResource); + exporter("__disposeResources", __disposeResources); + exporter("__rewriteRelativeImportExtension", __rewriteRelativeImportExtension); + }); +}); + +// node_modules/@azure/logger/dist/commonjs/log.js +var require_log = __commonJS((exports2) => { + Object.defineProperty(exports2, "__esModule", { value: true }); + exports2.log = log; + var tslib_1 = require_tslib(); + var node_os_1 = require("node:os"); + var node_util_1 = tslib_1.__importDefault(require("node:util")); + var process2 = tslib_1.__importStar(require("node:process")); + function log(message, ...args) { + process2.stderr.write(`${node_util_1.default.format(message, ...args)}${node_os_1.EOL}`); + } +}); + +// node_modules/@azure/logger/dist/commonjs/debug.js +var require_debug = __commonJS((exports2) => { + Object.defineProperty(exports2, "__esModule", { value: true }); + var log_js_1 = require_log(); + var debugEnvVariable = typeof process !== "undefined" && process.env && process.env.DEBUG || undefined; + var enabledString; + var enabledNamespaces = []; + var skippedNamespaces = []; + var debuggers = []; + if (debugEnvVariable) { + enable(debugEnvVariable); + } + var debugObj = Object.assign((namespace) => { + return createDebugger(namespace); + }, { + enable, + enabled, + disable, + log: log_js_1.log + }); + function enable(namespaces) { + enabledString = namespaces; + enabledNamespaces = []; + skippedNamespaces = []; + const wildcard = /\*/g; + const namespaceList = namespaces.split(",").map((ns) => ns.trim().replace(wildcard, ".*?")); + for (const ns of namespaceList) { + if (ns.startsWith("-")) { + skippedNamespaces.push(new RegExp(`^${ns.substr(1)}\$`)); + } else { + enabledNamespaces.push(new RegExp(`^${ns}\$`)); + } + } + for (const instance of debuggers) { + instance.enabled = enabled(instance.namespace); + } + } + function enabled(namespace) { + if (namespace.endsWith("*")) { + return true; + } + for (const skipped of skippedNamespaces) { + if (skipped.test(namespace)) { + return false; + } + } + for (const enabledNamespace of enabledNamespaces) { + if (enabledNamespace.test(namespace)) { + return true; + } + } + return false; + } + function disable() { + const result = enabledString || ""; + enable(""); + return result; + } + function createDebugger(namespace) { + const newDebugger = Object.assign(debug, { + enabled: enabled(namespace), + destroy, + log: debugObj.log, + namespace, + extend + }); + function debug(...args) { + if (!newDebugger.enabled) { + return; + } + if (args.length > 0) { + args[0] = `${namespace} ${args[0]}`; + } + newDebugger.log(...args); + } + debuggers.push(newDebugger); + return newDebugger; + } + function destroy() { + const index = debuggers.indexOf(this); + if (index >= 0) { + debuggers.splice(index, 1); + return true; + } + return false; + } + function extend(namespace) { + const newDebugger = createDebugger(`${this.namespace}:${namespace}`); + newDebugger.log = this.log; + return newDebugger; + } + exports2.default = debugObj; +}); + +// node_modules/@azure/logger/dist/commonjs/index.js +var require_commonjs3 = __commonJS((exports2) => { + Object.defineProperty(exports2, "__esModule", { value: true }); + exports2.AzureLogger = undefined; + exports2.setLogLevel = setLogLevel; + exports2.getLogLevel = getLogLevel; + exports2.createClientLogger = createClientLogger; + var tslib_1 = require_tslib(); + var debug_js_1 = tslib_1.__importDefault(require_debug()); + var registeredLoggers = new Set; + var logLevelFromEnv = typeof process !== "undefined" && process.env && process.env.AZURE_LOG_LEVEL || undefined; + var azureLogLevel; + exports2.AzureLogger = (0, debug_js_1.default)("azure"); + exports2.AzureLogger.log = (...args) => { + debug_js_1.default.log(...args); + }; + var AZURE_LOG_LEVELS = ["verbose", "info", "warning", "error"]; + if (logLevelFromEnv) { + if (isAzureLogLevel(logLevelFromEnv)) { + setLogLevel(logLevelFromEnv); + } else { + console.error(`AZURE_LOG_LEVEL set to unknown log level '${logLevelFromEnv}'; logging is not enabled. Acceptable values: ${AZURE_LOG_LEVELS.join(", ")}.`); + } + } + function setLogLevel(level) { + if (level && !isAzureLogLevel(level)) { + throw new Error(`Unknown log level '${level}'. Acceptable values: ${AZURE_LOG_LEVELS.join(",")}`); + } + azureLogLevel = level; + const enabledNamespaces = []; + for (const logger of registeredLoggers) { + if (shouldEnable(logger)) { + enabledNamespaces.push(logger.namespace); + } + } + debug_js_1.default.enable(enabledNamespaces.join(",")); + } + function getLogLevel() { + return azureLogLevel; + } + var levelMap = { + verbose: 400, + info: 300, + warning: 200, + error: 100 + }; + function createClientLogger(namespace) { + const clientRootLogger = exports2.AzureLogger.extend(namespace); + patchLogMethod(exports2.AzureLogger, clientRootLogger); + return { + error: createLogger(clientRootLogger, "error"), + warning: createLogger(clientRootLogger, "warning"), + info: createLogger(clientRootLogger, "info"), + verbose: createLogger(clientRootLogger, "verbose") + }; + } + function patchLogMethod(parent, child) { + child.log = (...args) => { + parent.log(...args); + }; + } + function createLogger(parent, level) { + const logger = Object.assign(parent.extend(level), { + level + }); + patchLogMethod(parent, logger); + if (shouldEnable(logger)) { + const enabledNamespaces = debug_js_1.default.disable(); + debug_js_1.default.enable(enabledNamespaces + "," + logger.namespace); + } + registeredLoggers.add(logger); + return logger; + } + function shouldEnable(logger) { + return Boolean(azureLogLevel && levelMap[logger.level] <= levelMap[azureLogLevel]); + } + function isAzureLogLevel(logLevel) { + return AZURE_LOG_LEVELS.includes(logLevel); + } +}); + +// node_modules/@azure/core-rest-pipeline/dist/commonjs/log.js +var require_log2 = __commonJS((exports2) => { + Object.defineProperty(exports2, "__esModule", { value: true }); + exports2.logger = undefined; + var logger_1 = require_commonjs3(); + exports2.logger = (0, logger_1.createClientLogger)("core-rest-pipeline"); +}); + +// node_modules/@azure/abort-controller/dist/commonjs/AbortError.js +var require_AbortError = __commonJS((exports2) => { + Object.defineProperty(exports2, "__esModule", { value: true }); + exports2.AbortError = undefined; + + class AbortError extends Error { + constructor(message) { + super(message); + this.name = "AbortError"; + } + } + exports2.AbortError = AbortError; +}); + +// node_modules/@azure/abort-controller/dist/commonjs/index.js +var require_commonjs4 = __commonJS((exports2) => { + Object.defineProperty(exports2, "__esModule", { value: true }); + exports2.AbortError = undefined; + var AbortError_js_1 = require_AbortError(); + Object.defineProperty(exports2, "AbortError", { enumerable: true, get: function() { + return AbortError_js_1.AbortError; + } }); +}); + +// node_modules/@azure/core-util/dist/commonjs/createAbortablePromise.js +var require_createAbortablePromise = __commonJS((exports2) => { + Object.defineProperty(exports2, "__esModule", { value: true }); + exports2.createAbortablePromise = createAbortablePromise; + var abort_controller_1 = require_commonjs4(); + function createAbortablePromise(buildPromise, options) { + const { cleanupBeforeAbort, abortSignal, abortErrorMsg } = options !== null && options !== undefined ? options : {}; + return new Promise((resolve, reject) => { + function rejectOnAbort() { + reject(new abort_controller_1.AbortError(abortErrorMsg !== null && abortErrorMsg !== undefined ? abortErrorMsg : "The operation was aborted.")); + } + function removeListeners() { + abortSignal === null || abortSignal === undefined || abortSignal.removeEventListener("abort", onAbort); + } + function onAbort() { + cleanupBeforeAbort === null || cleanupBeforeAbort === undefined || cleanupBeforeAbort(); + removeListeners(); + rejectOnAbort(); + } + if (abortSignal === null || abortSignal === undefined ? undefined : abortSignal.aborted) { + return rejectOnAbort(); + } + try { + buildPromise((x) => { + removeListeners(); + resolve(x); + }, (x) => { + removeListeners(); + reject(x); + }); + } catch (err) { + reject(err); + } + abortSignal === null || abortSignal === undefined || abortSignal.addEventListener("abort", onAbort); + }); + } +}); + +// node_modules/@azure/core-util/dist/commonjs/random.js +var require_random = __commonJS((exports2) => { + Object.defineProperty(exports2, "__esModule", { value: true }); + exports2.getRandomIntegerInclusive = getRandomIntegerInclusive; + function getRandomIntegerInclusive(min, max) { + min = Math.ceil(min); + max = Math.floor(max); + const offset = Math.floor(Math.random() * (max - min + 1)); + return offset + min; + } +}); + +// node_modules/@azure/core-util/dist/commonjs/delay.js +var require_delay = __commonJS((exports2) => { + Object.defineProperty(exports2, "__esModule", { value: true }); + exports2.delay = delay; + exports2.calculateRetryDelay = calculateRetryDelay; + var createAbortablePromise_js_1 = require_createAbortablePromise(); + var random_js_1 = require_random(); + var StandardAbortMessage = "The delay was aborted."; + function delay(timeInMs, options) { + let token; + const { abortSignal, abortErrorMsg } = options !== null && options !== undefined ? options : {}; + return (0, createAbortablePromise_js_1.createAbortablePromise)((resolve) => { + token = setTimeout(resolve, timeInMs); + }, { + cleanupBeforeAbort: () => clearTimeout(token), + abortSignal, + abortErrorMsg: abortErrorMsg !== null && abortErrorMsg !== undefined ? abortErrorMsg : StandardAbortMessage + }); + } + function calculateRetryDelay(retryAttempt, config) { + const exponentialDelay = config.retryDelayInMs * Math.pow(2, retryAttempt); + const clampedDelay = Math.min(config.maxRetryDelayInMs, exponentialDelay); + const retryAfterInMs = clampedDelay / 2 + (0, random_js_1.getRandomIntegerInclusive)(0, clampedDelay / 2); + return { retryAfterInMs }; + } +}); + +// node_modules/@azure/core-util/dist/commonjs/aborterUtils.js +var require_aborterUtils = __commonJS((exports2) => { + Object.defineProperty(exports2, "__esModule", { value: true }); + exports2.cancelablePromiseRace = cancelablePromiseRace; + async function cancelablePromiseRace(abortablePromiseBuilders, options) { + var _a, _b; + const aborter = new AbortController; + function abortHandler() { + aborter.abort(); + } + (_a = options === null || options === undefined ? undefined : options.abortSignal) === null || _a === undefined || _a.addEventListener("abort", abortHandler); + try { + return await Promise.race(abortablePromiseBuilders.map((p) => p({ abortSignal: aborter.signal }))); + } finally { + aborter.abort(); + (_b = options === null || options === undefined ? undefined : options.abortSignal) === null || _b === undefined || _b.removeEventListener("abort", abortHandler); + } + } +}); + +// node_modules/@azure/core-util/dist/commonjs/object.js +var require_object = __commonJS((exports2) => { + Object.defineProperty(exports2, "__esModule", { value: true }); + exports2.isObject = isObject; + function isObject(input) { + return typeof input === "object" && input !== null && !Array.isArray(input) && !(input instanceof RegExp) && !(input instanceof Date); + } +}); + +// node_modules/@azure/core-util/dist/commonjs/error.js +var require_error = __commonJS((exports2) => { + Object.defineProperty(exports2, "__esModule", { value: true }); + exports2.isError = isError; + exports2.getErrorMessage = getErrorMessage; + var object_js_1 = require_object(); + function isError(e) { + if ((0, object_js_1.isObject)(e)) { + const hasName = typeof e.name === "string"; + const hasMessage = typeof e.message === "string"; + return hasName && hasMessage; + } + return false; + } + function getErrorMessage(e) { + if (isError(e)) { + return e.message; + } else { + let stringified; + try { + if (typeof e === "object" && e) { + stringified = JSON.stringify(e); + } else { + stringified = String(e); + } + } catch (err) { + stringified = "[unable to stringify input]"; + } + return `Unknown error ${stringified}`; + } + } +}); + +// node_modules/@azure/core-util/dist/commonjs/sha256.js +var require_sha256 = __commonJS((exports2) => { + Object.defineProperty(exports2, "__esModule", { value: true }); + exports2.computeSha256Hmac = computeSha256Hmac; + exports2.computeSha256Hash = computeSha256Hash; + var crypto_1 = require("crypto"); + async function computeSha256Hmac(key, stringToSign, encoding) { + const decodedKey = Buffer.from(key, "base64"); + return (0, crypto_1.createHmac)("sha256", decodedKey).update(stringToSign).digest(encoding); + } + async function computeSha256Hash(content, encoding) { + return (0, crypto_1.createHash)("sha256").update(content).digest(encoding); + } +}); + +// node_modules/@azure/core-util/dist/commonjs/typeGuards.js +var require_typeGuards = __commonJS((exports2) => { + Object.defineProperty(exports2, "__esModule", { value: true }); + exports2.isDefined = isDefined; + exports2.isObjectWithProperties = isObjectWithProperties; + exports2.objectHasProperty = objectHasProperty; + function isDefined(thing) { + return typeof thing !== "undefined" && thing !== null; + } + function isObjectWithProperties(thing, properties) { + if (!isDefined(thing) || typeof thing !== "object") { + return false; + } + for (const property of properties) { + if (!objectHasProperty(thing, property)) { + return false; + } + } + return true; + } + function objectHasProperty(thing, property) { + return isDefined(thing) && typeof thing === "object" && property in thing; + } +}); + +// node_modules/@azure/core-util/dist/commonjs/uuidUtils.js +var require_uuidUtils = __commonJS((exports2) => { + var _a; + Object.defineProperty(exports2, "__esModule", { value: true }); + exports2.randomUUID = randomUUID; + var crypto_1 = require("crypto"); + var uuidFunction = typeof ((_a = globalThis === null || globalThis === undefined ? undefined : globalThis.crypto) === null || _a === undefined ? undefined : _a.randomUUID) === "function" ? globalThis.crypto.randomUUID.bind(globalThis.crypto) : crypto_1.randomUUID; + function randomUUID() { + return uuidFunction(); + } +}); + +// node_modules/@azure/core-util/dist/commonjs/checkEnvironment.js +var require_checkEnvironment = __commonJS((exports2) => { + var _a; + var _b; + var _c; + var _d; + Object.defineProperty(exports2, "__esModule", { value: true }); + exports2.isReactNative = exports2.isNodeRuntime = exports2.isNode = exports2.isNodeLike = exports2.isBun = exports2.isDeno = exports2.isWebWorker = exports2.isBrowser = undefined; + exports2.isBrowser = typeof window !== "undefined" && typeof window.document !== "undefined"; + exports2.isWebWorker = typeof self === "object" && typeof (self === null || self === undefined ? undefined : self.importScripts) === "function" && (((_a = self.constructor) === null || _a === undefined ? undefined : _a.name) === "DedicatedWorkerGlobalScope" || ((_b = self.constructor) === null || _b === undefined ? undefined : _b.name) === "ServiceWorkerGlobalScope" || ((_c = self.constructor) === null || _c === undefined ? undefined : _c.name) === "SharedWorkerGlobalScope"); + exports2.isDeno = typeof Deno !== "undefined" && typeof Deno.version !== "undefined" && typeof Deno.version.deno !== "undefined"; + exports2.isBun = typeof Bun !== "undefined" && typeof Bun.version !== "undefined"; + exports2.isNodeLike = typeof globalThis.process !== "undefined" && Boolean(globalThis.process.version) && Boolean((_d = globalThis.process.versions) === null || _d === undefined ? undefined : _d.node); + exports2.isNode = exports2.isNodeLike; + exports2.isNodeRuntime = exports2.isNodeLike && !exports2.isBun && !exports2.isDeno; + exports2.isReactNative = typeof navigator !== "undefined" && (navigator === null || navigator === undefined ? undefined : navigator.product) === "ReactNative"; +}); + +// node_modules/@azure/core-util/dist/commonjs/bytesEncoding.js +var require_bytesEncoding = __commonJS((exports2) => { + Object.defineProperty(exports2, "__esModule", { value: true }); + exports2.uint8ArrayToString = uint8ArrayToString; + exports2.stringToUint8Array = stringToUint8Array; + function uint8ArrayToString(bytes, format) { + return Buffer.from(bytes).toString(format); + } + function stringToUint8Array(value, format) { + return Buffer.from(value, format); + } +}); + +// node_modules/@azure/core-util/dist/commonjs/index.js +var require_commonjs5 = __commonJS((exports2) => { + Object.defineProperty(exports2, "__esModule", { value: true }); + exports2.stringToUint8Array = exports2.uint8ArrayToString = exports2.isWebWorker = exports2.isReactNative = exports2.isDeno = exports2.isNodeRuntime = exports2.isNodeLike = exports2.isNode = exports2.isBun = exports2.isBrowser = exports2.randomUUID = exports2.objectHasProperty = exports2.isObjectWithProperties = exports2.isDefined = exports2.computeSha256Hmac = exports2.computeSha256Hash = exports2.getErrorMessage = exports2.isError = exports2.isObject = exports2.getRandomIntegerInclusive = exports2.createAbortablePromise = exports2.cancelablePromiseRace = exports2.calculateRetryDelay = exports2.delay = undefined; + var delay_js_1 = require_delay(); + Object.defineProperty(exports2, "delay", { enumerable: true, get: function() { + return delay_js_1.delay; + } }); + Object.defineProperty(exports2, "calculateRetryDelay", { enumerable: true, get: function() { + return delay_js_1.calculateRetryDelay; + } }); + var aborterUtils_js_1 = require_aborterUtils(); + Object.defineProperty(exports2, "cancelablePromiseRace", { enumerable: true, get: function() { + return aborterUtils_js_1.cancelablePromiseRace; + } }); + var createAbortablePromise_js_1 = require_createAbortablePromise(); + Object.defineProperty(exports2, "createAbortablePromise", { enumerable: true, get: function() { + return createAbortablePromise_js_1.createAbortablePromise; + } }); + var random_js_1 = require_random(); + Object.defineProperty(exports2, "getRandomIntegerInclusive", { enumerable: true, get: function() { + return random_js_1.getRandomIntegerInclusive; + } }); + var object_js_1 = require_object(); + Object.defineProperty(exports2, "isObject", { enumerable: true, get: function() { + return object_js_1.isObject; + } }); + var error_js_1 = require_error(); + Object.defineProperty(exports2, "isError", { enumerable: true, get: function() { + return error_js_1.isError; + } }); + Object.defineProperty(exports2, "getErrorMessage", { enumerable: true, get: function() { + return error_js_1.getErrorMessage; + } }); + var sha256_js_1 = require_sha256(); + Object.defineProperty(exports2, "computeSha256Hash", { enumerable: true, get: function() { + return sha256_js_1.computeSha256Hash; + } }); + Object.defineProperty(exports2, "computeSha256Hmac", { enumerable: true, get: function() { + return sha256_js_1.computeSha256Hmac; + } }); + var typeGuards_js_1 = require_typeGuards(); + Object.defineProperty(exports2, "isDefined", { enumerable: true, get: function() { + return typeGuards_js_1.isDefined; + } }); + Object.defineProperty(exports2, "isObjectWithProperties", { enumerable: true, get: function() { + return typeGuards_js_1.isObjectWithProperties; + } }); + Object.defineProperty(exports2, "objectHasProperty", { enumerable: true, get: function() { + return typeGuards_js_1.objectHasProperty; + } }); + var uuidUtils_js_1 = require_uuidUtils(); + Object.defineProperty(exports2, "randomUUID", { enumerable: true, get: function() { + return uuidUtils_js_1.randomUUID; + } }); + var checkEnvironment_js_1 = require_checkEnvironment(); + Object.defineProperty(exports2, "isBrowser", { enumerable: true, get: function() { + return checkEnvironment_js_1.isBrowser; + } }); + Object.defineProperty(exports2, "isBun", { enumerable: true, get: function() { + return checkEnvironment_js_1.isBun; + } }); + Object.defineProperty(exports2, "isNode", { enumerable: true, get: function() { + return checkEnvironment_js_1.isNode; + } }); + Object.defineProperty(exports2, "isNodeLike", { enumerable: true, get: function() { + return checkEnvironment_js_1.isNodeLike; + } }); + Object.defineProperty(exports2, "isNodeRuntime", { enumerable: true, get: function() { + return checkEnvironment_js_1.isNodeRuntime; + } }); + Object.defineProperty(exports2, "isDeno", { enumerable: true, get: function() { + return checkEnvironment_js_1.isDeno; + } }); + Object.defineProperty(exports2, "isReactNative", { enumerable: true, get: function() { + return checkEnvironment_js_1.isReactNative; + } }); + Object.defineProperty(exports2, "isWebWorker", { enumerable: true, get: function() { + return checkEnvironment_js_1.isWebWorker; + } }); + var bytesEncoding_js_1 = require_bytesEncoding(); + Object.defineProperty(exports2, "uint8ArrayToString", { enumerable: true, get: function() { + return bytesEncoding_js_1.uint8ArrayToString; + } }); + Object.defineProperty(exports2, "stringToUint8Array", { enumerable: true, get: function() { + return bytesEncoding_js_1.stringToUint8Array; + } }); +}); + +// node_modules/@azure/core-rest-pipeline/dist/commonjs/util/sanitizer.js +var require_sanitizer = __commonJS((exports2) => { + Object.defineProperty(exports2, "__esModule", { value: true }); + exports2.Sanitizer = undefined; + var core_util_1 = require_commonjs5(); + var RedactedString = "REDACTED"; + var defaultAllowedHeaderNames = [ + "x-ms-client-request-id", + "x-ms-return-client-request-id", + "x-ms-useragent", + "x-ms-correlation-request-id", + "x-ms-request-id", + "client-request-id", + "ms-cv", + "return-client-request-id", + "traceparent", + "Access-Control-Allow-Credentials", + "Access-Control-Allow-Headers", + "Access-Control-Allow-Methods", + "Access-Control-Allow-Origin", + "Access-Control-Expose-Headers", + "Access-Control-Max-Age", + "Access-Control-Request-Headers", + "Access-Control-Request-Method", + "Origin", + "Accept", + "Accept-Encoding", + "Cache-Control", + "Connection", + "Content-Length", + "Content-Type", + "Date", + "ETag", + "Expires", + "If-Match", + "If-Modified-Since", + "If-None-Match", + "If-Unmodified-Since", + "Last-Modified", + "Pragma", + "Request-Id", + "Retry-After", + "Server", + "Transfer-Encoding", + "User-Agent", + "WWW-Authenticate" + ]; + var defaultAllowedQueryParameters = ["api-version"]; + + class Sanitizer { + constructor({ additionalAllowedHeaderNames: allowedHeaderNames = [], additionalAllowedQueryParameters: allowedQueryParameters = [] } = {}) { + allowedHeaderNames = defaultAllowedHeaderNames.concat(allowedHeaderNames); + allowedQueryParameters = defaultAllowedQueryParameters.concat(allowedQueryParameters); + this.allowedHeaderNames = new Set(allowedHeaderNames.map((n) => n.toLowerCase())); + this.allowedQueryParameters = new Set(allowedQueryParameters.map((p) => p.toLowerCase())); + } + sanitize(obj) { + const seen = new Set; + return JSON.stringify(obj, (key, value) => { + if (value instanceof Error) { + return Object.assign(Object.assign({}, value), { name: value.name, message: value.message }); + } + if (key === "headers") { + return this.sanitizeHeaders(value); + } else if (key === "url") { + return this.sanitizeUrl(value); + } else if (key === "query") { + return this.sanitizeQuery(value); + } else if (key === "body") { + return; + } else if (key === "response") { + return; + } else if (key === "operationSpec") { + return; + } else if (Array.isArray(value) || (0, core_util_1.isObject)(value)) { + if (seen.has(value)) { + return "[Circular]"; + } + seen.add(value); + } + return value; + }, 2); + } + sanitizeUrl(value) { + if (typeof value !== "string" || value === null || value === "") { + return value; + } + const url = new URL(value); + if (!url.search) { + return value; + } + for (const [key] of url.searchParams) { + if (!this.allowedQueryParameters.has(key.toLowerCase())) { + url.searchParams.set(key, RedactedString); + } + } + return url.toString(); + } + sanitizeHeaders(obj) { + const sanitized = {}; + for (const key of Object.keys(obj)) { + if (this.allowedHeaderNames.has(key.toLowerCase())) { + sanitized[key] = obj[key]; + } else { + sanitized[key] = RedactedString; + } + } + return sanitized; + } + sanitizeQuery(value) { + if (typeof value !== "object" || value === null) { + return value; + } + const sanitized = {}; + for (const k of Object.keys(value)) { + if (this.allowedQueryParameters.has(k.toLowerCase())) { + sanitized[k] = value[k]; + } else { + sanitized[k] = RedactedString; + } + } + return sanitized; + } + } + exports2.Sanitizer = Sanitizer; +}); + +// node_modules/@azure/core-rest-pipeline/dist/commonjs/policies/logPolicy.js +var require_logPolicy = __commonJS((exports2) => { + Object.defineProperty(exports2, "__esModule", { value: true }); + exports2.logPolicyName = undefined; + exports2.logPolicy = logPolicy; + var log_js_1 = require_log2(); + var sanitizer_js_1 = require_sanitizer(); + exports2.logPolicyName = "logPolicy"; + function logPolicy(options = {}) { + var _a; + const logger = (_a = options.logger) !== null && _a !== undefined ? _a : log_js_1.logger.info; + const sanitizer = new sanitizer_js_1.Sanitizer({ + additionalAllowedHeaderNames: options.additionalAllowedHeaderNames, + additionalAllowedQueryParameters: options.additionalAllowedQueryParameters + }); + return { + name: exports2.logPolicyName, + async sendRequest(request, next) { + if (!logger.enabled) { + return next(request); + } + logger(`Request: ${sanitizer.sanitize(request)}`); + const response = await next(request); + logger(`Response status code: ${response.status}`); + logger(`Headers: ${sanitizer.sanitize(response.headers)}`); + return response; + } + }; + } +}); + +// node_modules/@azure/core-rest-pipeline/dist/commonjs/policies/redirectPolicy.js +var require_redirectPolicy = __commonJS((exports2) => { + Object.defineProperty(exports2, "__esModule", { value: true }); + exports2.redirectPolicyName = undefined; + exports2.redirectPolicy = redirectPolicy; + exports2.redirectPolicyName = "redirectPolicy"; + var allowedRedirect = ["GET", "HEAD"]; + function redirectPolicy(options = {}) { + const { maxRetries = 20 } = options; + return { + name: exports2.redirectPolicyName, + async sendRequest(request, next) { + const response = await next(request); + return handleRedirect(next, response, maxRetries); + } + }; + } + async function handleRedirect(next, response, maxRetries, currentRetries = 0) { + const { request, status, headers } = response; + const locationHeader = headers.get("location"); + if (locationHeader && (status === 300 || status === 301 && allowedRedirect.includes(request.method) || status === 302 && allowedRedirect.includes(request.method) || status === 303 && request.method === "POST" || status === 307) && currentRetries < maxRetries) { + const url = new URL(locationHeader, request.url); + request.url = url.toString(); + if (status === 303) { + request.method = "GET"; + request.headers.delete("Content-Length"); + delete request.body; + } + request.headers.delete("Authorization"); + const res = await next(request); + return handleRedirect(next, res, maxRetries, currentRetries + 1); + } + return response; + } +}); + +// node_modules/@azure/core-rest-pipeline/dist/commonjs/util/userAgentPlatform.js +var require_userAgentPlatform = __commonJS((exports2) => { + Object.defineProperty(exports2, "__esModule", { value: true }); + exports2.getHeaderName = getHeaderName; + exports2.setPlatformSpecificData = setPlatformSpecificData; + var tslib_1 = require_tslib(); + var os = tslib_1.__importStar(require("node:os")); + var process2 = tslib_1.__importStar(require("node:process")); + function getHeaderName() { + return "User-Agent"; + } + async function setPlatformSpecificData(map) { + if (process2 && process2.versions) { + const versions = process2.versions; + if (versions.bun) { + map.set("Bun", versions.bun); + } else if (versions.deno) { + map.set("Deno", versions.deno); + } else if (versions.node) { + map.set("Node", versions.node); + } + } + map.set("OS", `(${os.arch()}-${os.type()}-${os.release()})`); + } +}); + +// node_modules/@azure/core-rest-pipeline/dist/commonjs/constants.js +var require_constants6 = __commonJS((exports2) => { + Object.defineProperty(exports2, "__esModule", { value: true }); + exports2.DEFAULT_RETRY_POLICY_COUNT = exports2.SDK_VERSION = undefined; + exports2.SDK_VERSION = "1.17.0"; + exports2.DEFAULT_RETRY_POLICY_COUNT = 3; +}); + +// node_modules/@azure/core-rest-pipeline/dist/commonjs/util/userAgent.js +var require_userAgent = __commonJS((exports2) => { + Object.defineProperty(exports2, "__esModule", { value: true }); + exports2.getUserAgentHeaderName = getUserAgentHeaderName; + exports2.getUserAgentValue = getUserAgentValue; + var userAgentPlatform_js_1 = require_userAgentPlatform(); + var constants_js_1 = require_constants6(); + function getUserAgentString(telemetryInfo) { + const parts = []; + for (const [key, value] of telemetryInfo) { + const token = value ? `${key}/${value}` : key; + parts.push(token); + } + return parts.join(" "); + } + function getUserAgentHeaderName() { + return (0, userAgentPlatform_js_1.getHeaderName)(); + } + async function getUserAgentValue(prefix) { + const runtimeInfo = new Map; + runtimeInfo.set("core-rest-pipeline", constants_js_1.SDK_VERSION); + await (0, userAgentPlatform_js_1.setPlatformSpecificData)(runtimeInfo); + const defaultAgent = getUserAgentString(runtimeInfo); + const userAgentValue = prefix ? `${prefix} ${defaultAgent}` : defaultAgent; + return userAgentValue; + } +}); + +// node_modules/@azure/core-rest-pipeline/dist/commonjs/policies/userAgentPolicy.js +var require_userAgentPolicy = __commonJS((exports2) => { + Object.defineProperty(exports2, "__esModule", { value: true }); + exports2.userAgentPolicyName = undefined; + exports2.userAgentPolicy = userAgentPolicy; + var userAgent_js_1 = require_userAgent(); + var UserAgentHeaderName = (0, userAgent_js_1.getUserAgentHeaderName)(); + exports2.userAgentPolicyName = "userAgentPolicy"; + function userAgentPolicy(options = {}) { + const userAgentValue = (0, userAgent_js_1.getUserAgentValue)(options.userAgentPrefix); + return { + name: exports2.userAgentPolicyName, + async sendRequest(request, next) { + if (!request.headers.has(UserAgentHeaderName)) { + request.headers.set(UserAgentHeaderName, await userAgentValue); + } + return next(request); + } + }; + } +}); + +// node_modules/@azure/core-rest-pipeline/dist/commonjs/util/typeGuards.js +var require_typeGuards2 = __commonJS((exports2) => { + Object.defineProperty(exports2, "__esModule", { value: true }); + exports2.isNodeReadableStream = isNodeReadableStream; + exports2.isWebReadableStream = isWebReadableStream; + exports2.isReadableStream = isReadableStream; + exports2.isBlob = isBlob; + function isNodeReadableStream(x) { + return Boolean(x && typeof x["pipe"] === "function"); + } + function isWebReadableStream(x) { + return Boolean(x && typeof x.getReader === "function" && typeof x.tee === "function"); + } + function isReadableStream(x) { + return isNodeReadableStream(x) || isWebReadableStream(x); + } + function isBlob(x) { + return typeof x.stream === "function"; + } +}); + +// node_modules/@azure/core-rest-pipeline/dist/commonjs/util/file.js +var require_file2 = __commonJS((exports2) => { + Object.defineProperty(exports2, "__esModule", { value: true }); + exports2.getRawContent = getRawContent; + exports2.createFileFromStream = createFileFromStream; + exports2.createFile = createFile; + var core_util_1 = require_commonjs5(); + var typeGuards_js_1 = require_typeGuards2(); + var unimplementedMethods = { + arrayBuffer: () => { + throw new Error("Not implemented"); + }, + slice: () => { + throw new Error("Not implemented"); + }, + text: () => { + throw new Error("Not implemented"); + } + }; + var rawContent = Symbol("rawContent"); + function hasRawContent(x) { + return typeof x[rawContent] === "function"; + } + function getRawContent(blob) { + if (hasRawContent(blob)) { + return blob[rawContent](); + } else { + return blob.stream(); + } + } + function createFileFromStream(stream, name, options = {}) { + var _a, _b, _c, _d; + return Object.assign(Object.assign({}, unimplementedMethods), { type: (_a = options.type) !== null && _a !== undefined ? _a : "", lastModified: (_b = options.lastModified) !== null && _b !== undefined ? _b : new Date().getTime(), webkitRelativePath: (_c = options.webkitRelativePath) !== null && _c !== undefined ? _c : "", size: (_d = options.size) !== null && _d !== undefined ? _d : -1, name, stream: () => { + const s = stream(); + if ((0, typeGuards_js_1.isNodeReadableStream)(s)) { + throw new Error("Not supported: a Node stream was provided as input to createFileFromStream."); + } + return s; + }, [rawContent]: stream }); + } + function createFile(content, name, options = {}) { + var _a, _b, _c; + if (core_util_1.isNodeLike) { + return Object.assign(Object.assign({}, unimplementedMethods), { type: (_a = options.type) !== null && _a !== undefined ? _a : "", lastModified: (_b = options.lastModified) !== null && _b !== undefined ? _b : new Date().getTime(), webkitRelativePath: (_c = options.webkitRelativePath) !== null && _c !== undefined ? _c : "", size: content.byteLength, name, arrayBuffer: async () => content.buffer, stream: () => new Blob([content]).stream(), [rawContent]: () => content }); + } else { + return new File([content], name, options); + } + } +}); + +// node_modules/@azure/core-rest-pipeline/dist/commonjs/util/concat.js +var require_concat = __commonJS((exports2) => { + Object.defineProperty(exports2, "__esModule", { value: true }); + exports2.concat = concat; + var tslib_1 = require_tslib(); + var node_stream_1 = require("node:stream"); + var typeGuards_js_1 = require_typeGuards2(); + var file_js_1 = require_file2(); + function streamAsyncIterator() { + return tslib_1.__asyncGenerator(this, arguments, function* streamAsyncIterator_1() { + const reader = this.getReader(); + try { + while (true) { + const { done, value } = yield tslib_1.__await(reader.read()); + if (done) { + return yield tslib_1.__await(undefined); + } + yield yield tslib_1.__await(value); + } + } finally { + reader.releaseLock(); + } + }); + } + function makeAsyncIterable(webStream) { + if (!webStream[Symbol.asyncIterator]) { + webStream[Symbol.asyncIterator] = streamAsyncIterator.bind(webStream); + } + if (!webStream.values) { + webStream.values = streamAsyncIterator.bind(webStream); + } + } + function ensureNodeStream(stream) { + if (stream instanceof ReadableStream) { + makeAsyncIterable(stream); + return node_stream_1.Readable.fromWeb(stream); + } else { + return stream; + } + } + function toStream(source) { + if (source instanceof Uint8Array) { + return node_stream_1.Readable.from(Buffer.from(source)); + } else if ((0, typeGuards_js_1.isBlob)(source)) { + return toStream((0, file_js_1.getRawContent)(source)); + } else { + return ensureNodeStream(source); + } + } + async function concat(sources) { + return function() { + const streams = sources.map((x) => typeof x === "function" ? x() : x).map(toStream); + return node_stream_1.Readable.from(function() { + return tslib_1.__asyncGenerator(this, arguments, function* () { + var _a, e_1, _b, _c; + for (const stream of streams) { + try { + for (var _d = true, stream_1 = (e_1 = undefined, tslib_1.__asyncValues(stream)), stream_1_1;stream_1_1 = yield tslib_1.__await(stream_1.next()), _a = stream_1_1.done, !_a; _d = true) { + _c = stream_1_1.value; + _d = false; + const chunk = _c; + yield yield tslib_1.__await(chunk); + } + } catch (e_1_1) { + e_1 = { error: e_1_1 }; + } finally { + try { + if (!_d && !_a && (_b = stream_1.return)) + yield tslib_1.__await(_b.call(stream_1)); + } finally { + if (e_1) + throw e_1.error; + } + } + } + }); + }()); + }; + } +}); + +// node_modules/@azure/core-rest-pipeline/dist/commonjs/policies/multipartPolicy.js +var require_multipartPolicy = __commonJS((exports2) => { + Object.defineProperty(exports2, "__esModule", { value: true }); + exports2.multipartPolicyName = undefined; + exports2.multipartPolicy = multipartPolicy; + var core_util_1 = require_commonjs5(); + var concat_js_1 = require_concat(); + var typeGuards_js_1 = require_typeGuards2(); + function generateBoundary() { + return `----AzSDKFormBoundary${(0, core_util_1.randomUUID)()}`; + } + function encodeHeaders(headers) { + let result = ""; + for (const [key, value] of headers) { + result += `${key}: ${value}\r\n`; + } + return result; + } + function getLength(source) { + if (source instanceof Uint8Array) { + return source.byteLength; + } else if ((0, typeGuards_js_1.isBlob)(source)) { + return source.size === -1 ? undefined : source.size; + } else { + return; + } + } + function getTotalLength(sources) { + let total = 0; + for (const source of sources) { + const partLength = getLength(source); + if (partLength === undefined) { + return; + } else { + total += partLength; + } + } + return total; + } + async function buildRequestBody(request, parts, boundary) { + const sources = [ + (0, core_util_1.stringToUint8Array)(`--${boundary}`, "utf-8"), + ...parts.flatMap((part) => [ + (0, core_util_1.stringToUint8Array)("\r\n", "utf-8"), + (0, core_util_1.stringToUint8Array)(encodeHeaders(part.headers), "utf-8"), + (0, core_util_1.stringToUint8Array)("\r\n", "utf-8"), + part.body, + (0, core_util_1.stringToUint8Array)(`\r\n--${boundary}`, "utf-8") + ]), + (0, core_util_1.stringToUint8Array)("--\r\n\r\n", "utf-8") + ]; + const contentLength = getTotalLength(sources); + if (contentLength) { + request.headers.set("Content-Length", contentLength); + } + request.body = await (0, concat_js_1.concat)(sources); + } + exports2.multipartPolicyName = "multipartPolicy"; + var maxBoundaryLength = 70; + var validBoundaryCharacters = new Set(`abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789'()+,-./:=?`); + function assertValidBoundary(boundary) { + if (boundary.length > maxBoundaryLength) { + throw new Error(`Multipart boundary "${boundary}" exceeds maximum length of 70 characters`); + } + if (Array.from(boundary).some((x) => !validBoundaryCharacters.has(x))) { + throw new Error(`Multipart boundary "${boundary}" contains invalid characters`); + } + } + function multipartPolicy() { + return { + name: exports2.multipartPolicyName, + async sendRequest(request, next) { + var _a; + if (!request.multipartBody) { + return next(request); + } + if (request.body) { + throw new Error("multipartBody and regular body cannot be set at the same time"); + } + let boundary = request.multipartBody.boundary; + const contentTypeHeader = (_a = request.headers.get("Content-Type")) !== null && _a !== undefined ? _a : "multipart/mixed"; + const parsedHeader = contentTypeHeader.match(/^(multipart\/[^ ;]+)(?:; *boundary=(.+))?$/); + if (!parsedHeader) { + throw new Error(`Got multipart request body, but content-type header was not multipart: ${contentTypeHeader}`); + } + const [, contentType, parsedBoundary] = parsedHeader; + if (parsedBoundary && boundary && parsedBoundary !== boundary) { + throw new Error(`Multipart boundary was specified as ${parsedBoundary} in the header, but got ${boundary} in the request body`); + } + boundary !== null && boundary !== undefined || (boundary = parsedBoundary); + if (boundary) { + assertValidBoundary(boundary); + } else { + boundary = generateBoundary(); + } + request.headers.set("Content-Type", `${contentType}; boundary=${boundary}`); + await buildRequestBody(request, request.multipartBody.parts, boundary); + request.multipartBody = undefined; + return next(request); + } + }; + } +}); + +// node_modules/@azure/core-rest-pipeline/dist/commonjs/policies/decompressResponsePolicy.js +var require_decompressResponsePolicy = __commonJS((exports2) => { + Object.defineProperty(exports2, "__esModule", { value: true }); + exports2.decompressResponsePolicyName = undefined; + exports2.decompressResponsePolicy = decompressResponsePolicy; + exports2.decompressResponsePolicyName = "decompressResponsePolicy"; + function decompressResponsePolicy() { + return { + name: exports2.decompressResponsePolicyName, + async sendRequest(request, next) { + if (request.method !== "HEAD") { + request.headers.set("Accept-Encoding", "gzip,deflate"); + } + return next(request); + } + }; + } +}); + +// node_modules/@azure/core-rest-pipeline/dist/commonjs/util/helpers.js +var require_helpers = __commonJS((exports2) => { + Object.defineProperty(exports2, "__esModule", { value: true }); + exports2.delay = delay; + exports2.parseHeaderValueAsNumber = parseHeaderValueAsNumber; + var abort_controller_1 = require_commonjs4(); + var StandardAbortMessage = "The operation was aborted."; + function delay(delayInMs, value, options) { + return new Promise((resolve, reject) => { + let timer = undefined; + let onAborted = undefined; + const rejectOnAbort = () => { + return reject(new abort_controller_1.AbortError((options === null || options === undefined ? undefined : options.abortErrorMsg) ? options === null || options === undefined ? undefined : options.abortErrorMsg : StandardAbortMessage)); + }; + const removeListeners = () => { + if ((options === null || options === undefined ? undefined : options.abortSignal) && onAborted) { + options.abortSignal.removeEventListener("abort", onAborted); + } + }; + onAborted = () => { + if (timer) { + clearTimeout(timer); + } + removeListeners(); + return rejectOnAbort(); + }; + if ((options === null || options === undefined ? undefined : options.abortSignal) && options.abortSignal.aborted) { + return rejectOnAbort(); + } + timer = setTimeout(() => { + removeListeners(); + resolve(value); + }, delayInMs); + if (options === null || options === undefined ? undefined : options.abortSignal) { + options.abortSignal.addEventListener("abort", onAborted); + } + }); + } + function parseHeaderValueAsNumber(response, headerName) { + const value = response.headers.get(headerName); + if (!value) + return; + const valueAsNum = Number(value); + if (Number.isNaN(valueAsNum)) + return; + return valueAsNum; + } +}); + +// node_modules/@azure/core-rest-pipeline/dist/commonjs/retryStrategies/throttlingRetryStrategy.js +var require_throttlingRetryStrategy = __commonJS((exports2) => { + Object.defineProperty(exports2, "__esModule", { value: true }); + exports2.isThrottlingRetryResponse = isThrottlingRetryResponse; + exports2.throttlingRetryStrategy = throttlingRetryStrategy; + var helpers_js_1 = require_helpers(); + var RetryAfterHeader = "Retry-After"; + var AllRetryAfterHeaders = ["retry-after-ms", "x-ms-retry-after-ms", RetryAfterHeader]; + function getRetryAfterInMs(response) { + if (!(response && [429, 503].includes(response.status))) + return; + try { + for (const header of AllRetryAfterHeaders) { + const retryAfterValue = (0, helpers_js_1.parseHeaderValueAsNumber)(response, header); + if (retryAfterValue === 0 || retryAfterValue) { + const multiplyingFactor = header === RetryAfterHeader ? 1000 : 1; + return retryAfterValue * multiplyingFactor; + } + } + const retryAfterHeader = response.headers.get(RetryAfterHeader); + if (!retryAfterHeader) + return; + const date = Date.parse(retryAfterHeader); + const diff = date - Date.now(); + return Number.isFinite(diff) ? Math.max(0, diff) : undefined; + } catch (_a) { + return; + } + } + function isThrottlingRetryResponse(response) { + return Number.isFinite(getRetryAfterInMs(response)); + } + function throttlingRetryStrategy() { + return { + name: "throttlingRetryStrategy", + retry({ response }) { + const retryAfterInMs = getRetryAfterInMs(response); + if (!Number.isFinite(retryAfterInMs)) { + return { skipStrategy: true }; + } + return { + retryAfterInMs + }; + } + }; + } +}); + +// node_modules/@azure/core-rest-pipeline/dist/commonjs/retryStrategies/exponentialRetryStrategy.js +var require_exponentialRetryStrategy = __commonJS((exports2) => { + Object.defineProperty(exports2, "__esModule", { value: true }); + exports2.exponentialRetryStrategy = exponentialRetryStrategy; + exports2.isExponentialRetryResponse = isExponentialRetryResponse; + exports2.isSystemError = isSystemError; + var core_util_1 = require_commonjs5(); + var throttlingRetryStrategy_js_1 = require_throttlingRetryStrategy(); + var DEFAULT_CLIENT_RETRY_INTERVAL = 1000; + var DEFAULT_CLIENT_MAX_RETRY_INTERVAL = 1000 * 64; + function exponentialRetryStrategy(options = {}) { + var _a, _b; + const retryInterval = (_a = options.retryDelayInMs) !== null && _a !== undefined ? _a : DEFAULT_CLIENT_RETRY_INTERVAL; + const maxRetryInterval = (_b = options.maxRetryDelayInMs) !== null && _b !== undefined ? _b : DEFAULT_CLIENT_MAX_RETRY_INTERVAL; + let retryAfterInMs = retryInterval; + return { + name: "exponentialRetryStrategy", + retry({ retryCount, response, responseError }) { + const matchedSystemError = isSystemError(responseError); + const ignoreSystemErrors = matchedSystemError && options.ignoreSystemErrors; + const isExponential = isExponentialRetryResponse(response); + const ignoreExponentialResponse = isExponential && options.ignoreHttpStatusCodes; + const unknownResponse = response && ((0, throttlingRetryStrategy_js_1.isThrottlingRetryResponse)(response) || !isExponential); + if (unknownResponse || ignoreExponentialResponse || ignoreSystemErrors) { + return { skipStrategy: true }; + } + if (responseError && !matchedSystemError && !isExponential) { + return { errorToThrow: responseError }; + } + const exponentialDelay = retryAfterInMs * Math.pow(2, retryCount); + const clampedExponentialDelay = Math.min(maxRetryInterval, exponentialDelay); + retryAfterInMs = clampedExponentialDelay / 2 + (0, core_util_1.getRandomIntegerInclusive)(0, clampedExponentialDelay / 2); + return { retryAfterInMs }; + } + }; + } + function isExponentialRetryResponse(response) { + return Boolean(response && response.status !== undefined && (response.status >= 500 || response.status === 408) && response.status !== 501 && response.status !== 505); + } + function isSystemError(err) { + if (!err) { + return false; + } + return err.code === "ETIMEDOUT" || err.code === "ESOCKETTIMEDOUT" || err.code === "ECONNREFUSED" || err.code === "ECONNRESET" || err.code === "ENOENT" || err.code === "ENOTFOUND"; + } +}); + +// node_modules/@azure/core-rest-pipeline/dist/commonjs/policies/retryPolicy.js +var require_retryPolicy = __commonJS((exports2) => { + Object.defineProperty(exports2, "__esModule", { value: true }); + exports2.retryPolicy = retryPolicy; + var helpers_js_1 = require_helpers(); + var logger_1 = require_commonjs3(); + var abort_controller_1 = require_commonjs4(); + var constants_js_1 = require_constants6(); + var retryPolicyLogger = (0, logger_1.createClientLogger)("core-rest-pipeline retryPolicy"); + var retryPolicyName = "retryPolicy"; + function retryPolicy(strategies, options = { maxRetries: constants_js_1.DEFAULT_RETRY_POLICY_COUNT }) { + const logger = options.logger || retryPolicyLogger; + return { + name: retryPolicyName, + async sendRequest(request, next) { + var _a, _b; + let response; + let responseError; + let retryCount = -1; + retryRequest: + while (true) { + retryCount += 1; + response = undefined; + responseError = undefined; + try { + logger.info(`Retry ${retryCount}: Attempting to send request`, request.requestId); + response = await next(request); + logger.info(`Retry ${retryCount}: Received a response from request`, request.requestId); + } catch (e) { + logger.error(`Retry ${retryCount}: Received an error from request`, request.requestId); + responseError = e; + if (!e || responseError.name !== "RestError") { + throw e; + } + response = responseError.response; + } + if ((_a = request.abortSignal) === null || _a === undefined ? undefined : _a.aborted) { + logger.error(`Retry ${retryCount}: Request aborted.`); + const abortError = new abort_controller_1.AbortError; + throw abortError; + } + if (retryCount >= ((_b = options.maxRetries) !== null && _b !== undefined ? _b : constants_js_1.DEFAULT_RETRY_POLICY_COUNT)) { + logger.info(`Retry ${retryCount}: Maximum retries reached. Returning the last received response, or throwing the last received error.`); + if (responseError) { + throw responseError; + } else if (response) { + return response; + } else { + throw new Error("Maximum retries reached with no response or error to throw"); + } + } + logger.info(`Retry ${retryCount}: Processing ${strategies.length} retry strategies.`); + strategiesLoop: + for (const strategy of strategies) { + const strategyLogger = strategy.logger || retryPolicyLogger; + strategyLogger.info(`Retry ${retryCount}: Processing retry strategy ${strategy.name}.`); + const modifiers = strategy.retry({ + retryCount, + response, + responseError + }); + if (modifiers.skipStrategy) { + strategyLogger.info(`Retry ${retryCount}: Skipped.`); + continue strategiesLoop; + } + const { errorToThrow, retryAfterInMs, redirectTo } = modifiers; + if (errorToThrow) { + strategyLogger.error(`Retry ${retryCount}: Retry strategy ${strategy.name} throws error:`, errorToThrow); + throw errorToThrow; + } + if (retryAfterInMs || retryAfterInMs === 0) { + strategyLogger.info(`Retry ${retryCount}: Retry strategy ${strategy.name} retries after ${retryAfterInMs}`); + await (0, helpers_js_1.delay)(retryAfterInMs, undefined, { abortSignal: request.abortSignal }); + continue retryRequest; + } + if (redirectTo) { + strategyLogger.info(`Retry ${retryCount}: Retry strategy ${strategy.name} redirects to ${redirectTo}`); + request.url = redirectTo; + continue retryRequest; + } + } + if (responseError) { + logger.info(`None of the retry strategies could work with the received error. Throwing it.`); + throw responseError; + } + if (response) { + logger.info(`None of the retry strategies could work with the received response. Returning it.`); + return response; + } + } + } + }; + } +}); + +// node_modules/@azure/core-rest-pipeline/dist/commonjs/policies/defaultRetryPolicy.js +var require_defaultRetryPolicy = __commonJS((exports2) => { + Object.defineProperty(exports2, "__esModule", { value: true }); + exports2.defaultRetryPolicyName = undefined; + exports2.defaultRetryPolicy = defaultRetryPolicy; + var exponentialRetryStrategy_js_1 = require_exponentialRetryStrategy(); + var throttlingRetryStrategy_js_1 = require_throttlingRetryStrategy(); + var retryPolicy_js_1 = require_retryPolicy(); + var constants_js_1 = require_constants6(); + exports2.defaultRetryPolicyName = "defaultRetryPolicy"; + function defaultRetryPolicy(options = {}) { + var _a; + return { + name: exports2.defaultRetryPolicyName, + sendRequest: (0, retryPolicy_js_1.retryPolicy)([(0, throttlingRetryStrategy_js_1.throttlingRetryStrategy)(), (0, exponentialRetryStrategy_js_1.exponentialRetryStrategy)(options)], { + maxRetries: (_a = options.maxRetries) !== null && _a !== undefined ? _a : constants_js_1.DEFAULT_RETRY_POLICY_COUNT + }).sendRequest + }; + } +}); + +// node_modules/@azure/core-rest-pipeline/dist/commonjs/httpHeaders.js +var require_httpHeaders = __commonJS((exports2) => { + Object.defineProperty(exports2, "__esModule", { value: true }); + exports2.createHttpHeaders = createHttpHeaders; + function normalizeName(name) { + return name.toLowerCase(); + } + function* headerIterator(map) { + for (const entry of map.values()) { + yield [entry.name, entry.value]; + } + } + + class HttpHeadersImpl { + constructor(rawHeaders) { + this._headersMap = new Map; + if (rawHeaders) { + for (const headerName of Object.keys(rawHeaders)) { + this.set(headerName, rawHeaders[headerName]); + } + } + } + set(name, value) { + this._headersMap.set(normalizeName(name), { name, value: String(value).trim() }); + } + get(name) { + var _a; + return (_a = this._headersMap.get(normalizeName(name))) === null || _a === undefined ? undefined : _a.value; + } + has(name) { + return this._headersMap.has(normalizeName(name)); + } + delete(name) { + this._headersMap.delete(normalizeName(name)); + } + toJSON(options = {}) { + const result = {}; + if (options.preserveCase) { + for (const entry of this._headersMap.values()) { + result[entry.name] = entry.value; + } + } else { + for (const [normalizedName, entry] of this._headersMap) { + result[normalizedName] = entry.value; + } + } + return result; + } + toString() { + return JSON.stringify(this.toJSON({ preserveCase: true })); + } + [Symbol.iterator]() { + return headerIterator(this._headersMap); + } + } + function createHttpHeaders(rawHeaders) { + return new HttpHeadersImpl(rawHeaders); + } +}); + +// node_modules/@azure/core-rest-pipeline/dist/commonjs/policies/formDataPolicy.js +var require_formDataPolicy = __commonJS((exports2) => { + Object.defineProperty(exports2, "__esModule", { value: true }); + exports2.formDataPolicyName = undefined; + exports2.formDataPolicy = formDataPolicy; + var core_util_1 = require_commonjs5(); + var httpHeaders_js_1 = require_httpHeaders(); + exports2.formDataPolicyName = "formDataPolicy"; + function formDataToFormDataMap(formData) { + var _a; + const formDataMap = {}; + for (const [key, value] of formData.entries()) { + (_a = formDataMap[key]) !== null && _a !== undefined || (formDataMap[key] = []); + formDataMap[key].push(value); + } + return formDataMap; + } + function formDataPolicy() { + return { + name: exports2.formDataPolicyName, + async sendRequest(request, next) { + if (core_util_1.isNodeLike && typeof FormData !== "undefined" && request.body instanceof FormData) { + request.formData = formDataToFormDataMap(request.body); + request.body = undefined; + } + if (request.formData) { + const contentType = request.headers.get("Content-Type"); + if (contentType && contentType.indexOf("application/x-www-form-urlencoded") !== -1) { + request.body = wwwFormUrlEncode(request.formData); + } else { + await prepareFormData(request.formData, request); + } + request.formData = undefined; + } + return next(request); + } + }; + } + function wwwFormUrlEncode(formData) { + const urlSearchParams = new URLSearchParams; + for (const [key, value] of Object.entries(formData)) { + if (Array.isArray(value)) { + for (const subValue of value) { + urlSearchParams.append(key, subValue.toString()); + } + } else { + urlSearchParams.append(key, value.toString()); + } + } + return urlSearchParams.toString(); + } + async function prepareFormData(formData, request) { + const contentType = request.headers.get("Content-Type"); + if (contentType && !contentType.startsWith("multipart/form-data")) { + return; + } + request.headers.set("Content-Type", contentType !== null && contentType !== undefined ? contentType : "multipart/form-data"); + const parts = []; + for (const [fieldName, values] of Object.entries(formData)) { + for (const value of Array.isArray(values) ? values : [values]) { + if (typeof value === "string") { + parts.push({ + headers: (0, httpHeaders_js_1.createHttpHeaders)({ + "Content-Disposition": `form-data; name="${fieldName}"` + }), + body: (0, core_util_1.stringToUint8Array)(value, "utf-8") + }); + } else if (value === undefined || value === null || typeof value !== "object") { + throw new Error(`Unexpected value for key ${fieldName}: ${value}. Value should be serialized to string first.`); + } else { + const fileName = value.name || "blob"; + const headers = (0, httpHeaders_js_1.createHttpHeaders)(); + headers.set("Content-Disposition", `form-data; name="${fieldName}"; filename="${fileName}"`); + headers.set("Content-Type", value.type || "application/octet-stream"); + parts.push({ + headers, + body: value + }); + } + } + } + request.multipartBody = { parts }; + } +}); + +// node_modules/ms/index.js +var require_ms = __commonJS((exports2, module2) => { + var s = 1000; + var m = s * 60; + var h = m * 60; + var d = h * 24; + var w = d * 7; + var y = d * 365.25; + module2.exports = function(val2, options) { + options = options || {}; + var type = typeof val2; + if (type === "string" && val2.length > 0) { + return parse(val2); + } else if (type === "number" && isFinite(val2)) { + return options.long ? fmtLong(val2) : fmtShort(val2); + } + throw new Error("val is not a non-empty string or a valid number. val=" + JSON.stringify(val2)); + }; + function parse(str) { + str = String(str); + if (str.length > 100) { + return; + } + var match = /^(-?(?:\d+)?\.?\d+) *(milliseconds?|msecs?|ms|seconds?|secs?|s|minutes?|mins?|m|hours?|hrs?|h|days?|d|weeks?|w|years?|yrs?|y)?$/i.exec(str); + if (!match) { + return; + } + var n = parseFloat(match[1]); + var type = (match[2] || "ms").toLowerCase(); + switch (type) { + case "years": + case "year": + case "yrs": + case "yr": + case "y": + return n * y; + case "weeks": + case "week": + case "w": + return n * w; + case "days": + case "day": + case "d": + return n * d; + case "hours": + case "hour": + case "hrs": + case "hr": + case "h": + return n * h; + case "minutes": + case "minute": + case "mins": + case "min": + case "m": + return n * m; + case "seconds": + case "second": + case "secs": + case "sec": + case "s": + return n * s; + case "milliseconds": + case "millisecond": + case "msecs": + case "msec": + case "ms": + return n; + default: + return; + } + } + function fmtShort(ms) { + var msAbs = Math.abs(ms); + if (msAbs >= d) { + return Math.round(ms / d) + "d"; + } + if (msAbs >= h) { + return Math.round(ms / h) + "h"; + } + if (msAbs >= m) { + return Math.round(ms / m) + "m"; + } + if (msAbs >= s) { + return Math.round(ms / s) + "s"; + } + return ms + "ms"; + } + function fmtLong(ms) { + var msAbs = Math.abs(ms); + if (msAbs >= d) { + return plural(ms, msAbs, d, "day"); + } + if (msAbs >= h) { + return plural(ms, msAbs, h, "hour"); + } + if (msAbs >= m) { + return plural(ms, msAbs, m, "minute"); + } + if (msAbs >= s) { + return plural(ms, msAbs, s, "second"); + } + return ms + " ms"; + } + function plural(ms, msAbs, n, name) { + var isPlural = msAbs >= n * 1.5; + return Math.round(ms / n) + " " + name + (isPlural ? "s" : ""); + } +}); + +// node_modules/debug/src/common.js +var require_common = __commonJS((exports2, module2) => { + function setup(env) { + createDebug.debug = createDebug; + createDebug.default = createDebug; + createDebug.coerce = coerce; + createDebug.disable = disable; + createDebug.enable = enable; + createDebug.enabled = enabled; + createDebug.humanize = require_ms(); + createDebug.destroy = destroy; + Object.keys(env).forEach((key) => { + createDebug[key] = env[key]; + }); + createDebug.names = []; + createDebug.skips = []; + createDebug.formatters = {}; + function selectColor(namespace) { + let hash = 0; + for (let i = 0;i < namespace.length; i++) { + hash = (hash << 5) - hash + namespace.charCodeAt(i); + hash |= 0; + } + return createDebug.colors[Math.abs(hash) % createDebug.colors.length]; + } + createDebug.selectColor = selectColor; + function createDebug(namespace) { + let prevTime; + let enableOverride = null; + let namespacesCache; + let enabledCache; + function debug(...args) { + if (!debug.enabled) { + return; + } + const self2 = debug; + const curr = Number(new Date); + const ms = curr - (prevTime || curr); + self2.diff = ms; + self2.prev = prevTime; + self2.curr = curr; + prevTime = curr; + args[0] = createDebug.coerce(args[0]); + if (typeof args[0] !== "string") { + args.unshift("%O"); + } + let index = 0; + args[0] = args[0].replace(/%([a-zA-Z%])/g, (match, format) => { + if (match === "%%") { + return "%"; + } + index++; + const formatter = createDebug.formatters[format]; + if (typeof formatter === "function") { + const val2 = args[index]; + match = formatter.call(self2, val2); + args.splice(index, 1); + index--; + } + return match; + }); + createDebug.formatArgs.call(self2, args); + const logFn = self2.log || createDebug.log; + logFn.apply(self2, args); + } + debug.namespace = namespace; + debug.useColors = createDebug.useColors(); + debug.color = createDebug.selectColor(namespace); + debug.extend = extend; + debug.destroy = createDebug.destroy; + Object.defineProperty(debug, "enabled", { + enumerable: true, + configurable: false, + get: () => { + if (enableOverride !== null) { + return enableOverride; + } + if (namespacesCache !== createDebug.namespaces) { + namespacesCache = createDebug.namespaces; + enabledCache = createDebug.enabled(namespace); + } + return enabledCache; + }, + set: (v) => { + enableOverride = v; + } + }); + if (typeof createDebug.init === "function") { + createDebug.init(debug); + } + return debug; + } + function extend(namespace, delimiter) { + const newDebug = createDebug(this.namespace + (typeof delimiter === "undefined" ? ":" : delimiter) + namespace); + newDebug.log = this.log; + return newDebug; + } + function enable(namespaces) { + createDebug.save(namespaces); + createDebug.namespaces = namespaces; + createDebug.names = []; + createDebug.skips = []; + let i; + const split = (typeof namespaces === "string" ? namespaces : "").split(/[\s,]+/); + const len = split.length; + for (i = 0;i < len; i++) { + if (!split[i]) { + continue; + } + namespaces = split[i].replace(/\*/g, ".*?"); + if (namespaces[0] === "-") { + createDebug.skips.push(new RegExp("^" + namespaces.slice(1) + "$")); + } else { + createDebug.names.push(new RegExp("^" + namespaces + "$")); + } + } + } + function disable() { + const namespaces = [ + ...createDebug.names.map(toNamespace), + ...createDebug.skips.map(toNamespace).map((namespace) => "-" + namespace) + ].join(","); + createDebug.enable(""); + return namespaces; + } + function enabled(name) { + if (name[name.length - 1] === "*") { + return true; + } + let i; + let len; + for (i = 0, len = createDebug.skips.length;i < len; i++) { + if (createDebug.skips[i].test(name)) { + return false; + } + } + for (i = 0, len = createDebug.names.length;i < len; i++) { + if (createDebug.names[i].test(name)) { + return true; + } + } + return false; + } + function toNamespace(regexp) { + return regexp.toString().substring(2, regexp.toString().length - 2).replace(/\.\*\?$/, "*"); + } + function coerce(val2) { + if (val2 instanceof Error) { + return val2.stack || val2.message; + } + return val2; + } + function destroy() { + console.warn("Instance method `debug.destroy()` is deprecated and no longer does anything. It will be removed in the next major version of `debug`."); + } + createDebug.enable(createDebug.load()); + return createDebug; + } + module2.exports = setup; +}); + +// node_modules/debug/src/browser.js +var require_browser = __commonJS((exports2, module2) => { + exports2.formatArgs = formatArgs; + exports2.save = save; + exports2.load = load; + exports2.useColors = useColors; + exports2.storage = localstorage(); + exports2.destroy = (() => { + let warned = false; + return () => { + if (!warned) { + warned = true; + console.warn("Instance method `debug.destroy()` is deprecated and no longer does anything. It will be removed in the next major version of `debug`."); + } + }; + })(); + exports2.colors = [ + "#0000CC", + "#0000FF", + "#0033CC", + "#0033FF", + "#0066CC", + "#0066FF", + "#0099CC", + "#0099FF", + "#00CC00", + "#00CC33", + "#00CC66", + "#00CC99", + "#00CCCC", + "#00CCFF", + "#3300CC", + "#3300FF", + "#3333CC", + "#3333FF", + "#3366CC", + "#3366FF", + "#3399CC", + "#3399FF", + "#33CC00", + "#33CC33", + "#33CC66", + "#33CC99", + "#33CCCC", + "#33CCFF", + "#6600CC", + "#6600FF", + "#6633CC", + "#6633FF", + "#66CC00", + "#66CC33", + "#9900CC", + "#9900FF", + "#9933CC", + "#9933FF", + "#99CC00", + "#99CC33", + "#CC0000", + "#CC0033", + "#CC0066", + "#CC0099", + "#CC00CC", + "#CC00FF", + "#CC3300", + "#CC3333", + "#CC3366", + "#CC3399", + "#CC33CC", + "#CC33FF", + "#CC6600", + "#CC6633", + "#CC9900", + "#CC9933", + "#CCCC00", + "#CCCC33", + "#FF0000", + "#FF0033", + "#FF0066", + "#FF0099", + "#FF00CC", + "#FF00FF", + "#FF3300", + "#FF3333", + "#FF3366", + "#FF3399", + "#FF33CC", + "#FF33FF", + "#FF6600", + "#FF6633", + "#FF9900", + "#FF9933", + "#FFCC00", + "#FFCC33" + ]; + function useColors() { + if (typeof window !== "undefined" && window.process && (window.process.type === "renderer" || window.process.__nwjs)) { + return true; + } + if (typeof navigator !== "undefined" && navigator.userAgent && navigator.userAgent.toLowerCase().match(/(edge|trident)\/(\d+)/)) { + return false; + } + let m; + return typeof document !== "undefined" && document.documentElement && document.documentElement.style && document.documentElement.style.WebkitAppearance || typeof window !== "undefined" && window.console && (window.console.firebug || window.console.exception && window.console.table) || typeof navigator !== "undefined" && navigator.userAgent && (m = navigator.userAgent.toLowerCase().match(/firefox\/(\d+)/)) && parseInt(m[1], 10) >= 31 || typeof navigator !== "undefined" && navigator.userAgent && navigator.userAgent.toLowerCase().match(/applewebkit\/(\d+)/); + } + function formatArgs(args) { + args[0] = (this.useColors ? "%c" : "") + this.namespace + (this.useColors ? " %c" : " ") + args[0] + (this.useColors ? "%c " : " ") + "+" + module2.exports.humanize(this.diff); + if (!this.useColors) { + return; + } + const c = "color: " + this.color; + args.splice(1, 0, c, "color: inherit"); + let index = 0; + let lastC = 0; + args[0].replace(/%[a-zA-Z%]/g, (match) => { + if (match === "%%") { + return; + } + index++; + if (match === "%c") { + lastC = index; + } + }); + args.splice(lastC, 0, c); + } + exports2.log = console.debug || console.log || (() => { + }); + function save(namespaces) { + try { + if (namespaces) { + exports2.storage.setItem("debug", namespaces); + } else { + exports2.storage.removeItem("debug"); + } + } catch (error) { + } + } + function load() { + let r; + try { + r = exports2.storage.getItem("debug"); + } catch (error) { + } + if (!r && typeof process !== "undefined" && "env" in process) { + r = process.env.DEBUG; + } + return r; + } + function localstorage() { + try { + return localStorage; + } catch (error) { + } + } + module2.exports = require_common()(exports2); + var { formatters } = module2.exports; + formatters.j = function(v) { + try { + return JSON.stringify(v); + } catch (error) { + return "[UnexpectedJSONParseError]: " + error.message; + } + }; +}); + +// node_modules/debug/src/node.js +var require_node = __commonJS((exports2, module2) => { + var tty = require("tty"); + var util = require("util"); + exports2.init = init; + exports2.log = log; + exports2.formatArgs = formatArgs; + exports2.save = save; + exports2.load = load; + exports2.useColors = useColors; + exports2.destroy = util.deprecate(() => { + }, "Instance method `debug.destroy()` is deprecated and no longer does anything. It will be removed in the next major version of `debug`."); + exports2.colors = [6, 2, 3, 4, 5, 1]; + try { + const supportsColor = (()=>{throw new Error(`Cannot require module "supports-color"`);})(); + if (supportsColor && (supportsColor.stderr || supportsColor).level >= 2) { + exports2.colors = [ + 20, + 21, + 26, + 27, + 32, + 33, + 38, + 39, + 40, + 41, + 42, + 43, + 44, + 45, + 56, + 57, + 62, + 63, + 68, + 69, + 74, + 75, + 76, + 77, + 78, + 79, + 80, + 81, + 92, + 93, + 98, + 99, + 112, + 113, + 128, + 129, + 134, + 135, + 148, + 149, + 160, + 161, + 162, + 163, + 164, + 165, + 166, + 167, + 168, + 169, + 170, + 171, + 172, + 173, + 178, + 179, + 184, + 185, + 196, + 197, + 198, + 199, + 200, + 201, + 202, + 203, + 204, + 205, + 206, + 207, + 208, + 209, + 214, + 215, + 220, + 221 + ]; + } + } catch (error) { + } + exports2.inspectOpts = Object.keys(process.env).filter((key) => { + return /^debug_/i.test(key); + }).reduce((obj, key) => { + const prop = key.substring(6).toLowerCase().replace(/_([a-z])/g, (_2, k) => { + return k.toUpperCase(); + }); + let val2 = process.env[key]; + if (/^(yes|on|true|enabled)$/i.test(val2)) { + val2 = true; + } else if (/^(no|off|false|disabled)$/i.test(val2)) { + val2 = false; + } else if (val2 === "null") { + val2 = null; + } else { + val2 = Number(val2); + } + obj[prop] = val2; + return obj; + }, {}); + function useColors() { + return "colors" in exports2.inspectOpts ? Boolean(exports2.inspectOpts.colors) : tty.isatty(process.stderr.fd); + } + function formatArgs(args) { + const { namespace: name, useColors: useColors2 } = this; + if (useColors2) { + const c = this.color; + const colorCode = "\x1B[3" + (c < 8 ? c : "8;5;" + c); + const prefix = ` ${colorCode};1m${name} \x1B[0m`; + args[0] = prefix + args[0].split("\n").join("\n" + prefix); + args.push(colorCode + "m+" + module2.exports.humanize(this.diff) + "\x1B[0m"); + } else { + args[0] = getDate() + name + " " + args[0]; + } + } + function getDate() { + if (exports2.inspectOpts.hideDate) { + return ""; + } + return new Date().toISOString() + " "; + } + function log(...args) { + return process.stderr.write(util.formatWithOptions(exports2.inspectOpts, ...args) + "\n"); + } + function save(namespaces) { + if (namespaces) { + process.env.DEBUG = namespaces; + } else { + delete process.env.DEBUG; + } + } + function load() { + return process.env.DEBUG; + } + function init(debug) { + debug.inspectOpts = {}; + const keys = Object.keys(exports2.inspectOpts); + for (let i = 0;i < keys.length; i++) { + debug.inspectOpts[keys[i]] = exports2.inspectOpts[keys[i]]; + } + } + module2.exports = require_common()(exports2); + var { formatters } = module2.exports; + formatters.o = function(v) { + this.inspectOpts.colors = this.useColors; + return util.inspect(v, this.inspectOpts).split("\n").map((str) => str.trim()).join(" "); + }; + formatters.O = function(v) { + this.inspectOpts.colors = this.useColors; + return util.inspect(v, this.inspectOpts); + }; +}); + +// node_modules/debug/src/index.js +var require_src = __commonJS((exports2, module2) => { + if (typeof process === "undefined" || process.type === "renderer" || false || process.__nwjs) { + module2.exports = require_browser(); + } else { + module2.exports = require_node(); + } +}); + +// node_modules/agent-base/dist/helpers.js +var require_helpers2 = __commonJS((exports2) => { + var __createBinding = exports2 && exports2.__createBinding || (Object.create ? function(o, m, k, k2) { + if (k2 === undefined) + k2 = k; + var desc = Object.getOwnPropertyDescriptor(m, k); + if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) { + desc = { enumerable: true, get: function() { + return m[k]; + } }; + } + Object.defineProperty(o, k2, desc); + } : function(o, m, k, k2) { + if (k2 === undefined) + k2 = k; + o[k2] = m[k]; + }); + var __setModuleDefault = exports2 && exports2.__setModuleDefault || (Object.create ? function(o, v) { + Object.defineProperty(o, "default", { enumerable: true, value: v }); + } : function(o, v) { + o["default"] = v; + }); + var __importStar = exports2 && exports2.__importStar || function(mod) { + if (mod && mod.__esModule) + return mod; + var result = {}; + if (mod != null) { + for (var k in mod) + if (k !== "default" && Object.prototype.hasOwnProperty.call(mod, k)) + __createBinding(result, mod, k); + } + __setModuleDefault(result, mod); + return result; + }; + Object.defineProperty(exports2, "__esModule", { value: true }); + exports2.req = exports2.json = exports2.toBuffer = undefined; + var http = __importStar(require("http")); + var https = __importStar(require("https")); + async function toBuffer(stream) { + let length = 0; + const chunks = []; + for await (const chunk of stream) { + length += chunk.length; + chunks.push(chunk); + } + return Buffer.concat(chunks, length); + } + exports2.toBuffer = toBuffer; + async function json(stream) { + const buf = await toBuffer(stream); + const str = buf.toString("utf8"); + try { + return JSON.parse(str); + } catch (_err) { + const err = _err; + err.message += ` (input: ${str})`; + throw err; + } + } + exports2.json = json; + function req(url, opts = {}) { + const href = typeof url === "string" ? url : url.href; + const req2 = (href.startsWith("https:") ? https : http).request(url, opts); + const promise = new Promise((resolve, reject) => { + req2.once("response", resolve).once("error", reject).end(); + }); + req2.then = promise.then.bind(promise); + return req2; + } + exports2.req = req; +}); + +// node_modules/agent-base/dist/index.js +var require_dist = __commonJS((exports2) => { + var __createBinding = exports2 && exports2.__createBinding || (Object.create ? function(o, m, k, k2) { + if (k2 === undefined) + k2 = k; + var desc = Object.getOwnPropertyDescriptor(m, k); + if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) { + desc = { enumerable: true, get: function() { + return m[k]; + } }; + } + Object.defineProperty(o, k2, desc); + } : function(o, m, k, k2) { + if (k2 === undefined) + k2 = k; + o[k2] = m[k]; + }); + var __setModuleDefault = exports2 && exports2.__setModuleDefault || (Object.create ? function(o, v) { + Object.defineProperty(o, "default", { enumerable: true, value: v }); + } : function(o, v) { + o["default"] = v; + }); + var __importStar = exports2 && exports2.__importStar || function(mod) { + if (mod && mod.__esModule) + return mod; + var result = {}; + if (mod != null) { + for (var k in mod) + if (k !== "default" && Object.prototype.hasOwnProperty.call(mod, k)) + __createBinding(result, mod, k); + } + __setModuleDefault(result, mod); + return result; + }; + var __exportStar = exports2 && exports2.__exportStar || function(m, exports3) { + for (var p in m) + if (p !== "default" && !Object.prototype.hasOwnProperty.call(exports3, p)) + __createBinding(exports3, m, p); + }; + Object.defineProperty(exports2, "__esModule", { value: true }); + exports2.Agent = undefined; + var net = __importStar(require("net")); + var http = __importStar(require("http")); + var https_1 = require("https"); + __exportStar(require_helpers2(), exports2); + var INTERNAL = Symbol("AgentBaseInternalState"); + + class Agent extends http.Agent { + constructor(opts) { + super(opts); + this[INTERNAL] = {}; + } + isSecureEndpoint(options) { + if (options) { + if (typeof options.secureEndpoint === "boolean") { + return options.secureEndpoint; + } + if (typeof options.protocol === "string") { + return options.protocol === "https:"; + } + } + const { stack } = new Error; + if (typeof stack !== "string") + return false; + return stack.split("\n").some((l) => l.indexOf("(https.js:") !== -1 || l.indexOf("node:https:") !== -1); + } + incrementSockets(name) { + if (this.maxSockets === Infinity && this.maxTotalSockets === Infinity) { + return null; + } + if (!this.sockets[name]) { + this.sockets[name] = []; + } + const fakeSocket = new net.Socket({ writable: false }); + this.sockets[name].push(fakeSocket); + this.totalSocketCount++; + return fakeSocket; + } + decrementSockets(name, socket) { + if (!this.sockets[name] || socket === null) { + return; + } + const sockets = this.sockets[name]; + const index = sockets.indexOf(socket); + if (index !== -1) { + sockets.splice(index, 1); + this.totalSocketCount--; + if (sockets.length === 0) { + delete this.sockets[name]; + } + } + } + getName(options) { + const secureEndpoint = typeof options.secureEndpoint === "boolean" ? options.secureEndpoint : this.isSecureEndpoint(options); + if (secureEndpoint) { + return https_1.Agent.prototype.getName.call(this, options); + } + return super.getName(options); + } + createSocket(req, options, cb) { + const connectOpts = { + ...options, + secureEndpoint: this.isSecureEndpoint(options) + }; + const name = this.getName(connectOpts); + const fakeSocket = this.incrementSockets(name); + Promise.resolve().then(() => this.connect(req, connectOpts)).then((socket) => { + this.decrementSockets(name, fakeSocket); + if (socket instanceof http.Agent) { + return socket.addRequest(req, connectOpts); + } + this[INTERNAL].currentSocket = socket; + super.createSocket(req, options, cb); + }, (err) => { + this.decrementSockets(name, fakeSocket); + cb(err); + }); + } + createConnection() { + const socket = this[INTERNAL].currentSocket; + this[INTERNAL].currentSocket = undefined; + if (!socket) { + throw new Error("No socket was returned in the `connect()` function"); + } + return socket; + } + get defaultPort() { + return this[INTERNAL].defaultPort ?? (this.protocol === "https:" ? 443 : 80); + } + set defaultPort(v) { + if (this[INTERNAL]) { + this[INTERNAL].defaultPort = v; + } + } + get protocol() { + return this[INTERNAL].protocol ?? (this.isSecureEndpoint() ? "https:" : "http:"); + } + set protocol(v) { + if (this[INTERNAL]) { + this[INTERNAL].protocol = v; + } + } + } + exports2.Agent = Agent; +}); + +// node_modules/https-proxy-agent/dist/parse-proxy-response.js +var require_parse_proxy_response = __commonJS((exports2) => { + var __importDefault = exports2 && exports2.__importDefault || function(mod) { + return mod && mod.__esModule ? mod : { default: mod }; + }; + Object.defineProperty(exports2, "__esModule", { value: true }); + exports2.parseProxyResponse = undefined; + var debug_1 = __importDefault(require_src()); + var debug = (0, debug_1.default)("https-proxy-agent:parse-proxy-response"); + function parseProxyResponse(socket) { + return new Promise((resolve, reject) => { + let buffersLength = 0; + const buffers = []; + function read() { + const b = socket.read(); + if (b) + ondata(b); + else + socket.once("readable", read); + } + function cleanup() { + socket.removeListener("end", onend); + socket.removeListener("error", onerror); + socket.removeListener("readable", read); + } + function onend() { + cleanup(); + debug("onend"); + reject(new Error("Proxy connection ended before receiving CONNECT response")); + } + function onerror(err) { + cleanup(); + debug("onerror %o", err); + reject(err); + } + function ondata(b) { + buffers.push(b); + buffersLength += b.length; + const buffered = Buffer.concat(buffers, buffersLength); + const endOfHeaders = buffered.indexOf("\r\n\r\n"); + if (endOfHeaders === -1) { + debug("have not received end of HTTP headers yet..."); + read(); + return; + } + const headerParts = buffered.slice(0, endOfHeaders).toString("ascii").split("\r\n"); + const firstLine = headerParts.shift(); + if (!firstLine) { + socket.destroy(); + return reject(new Error("No header received from proxy CONNECT response")); + } + const firstLineParts = firstLine.split(" "); + const statusCode = +firstLineParts[1]; + const statusText = firstLineParts.slice(2).join(" "); + const headers = {}; + for (const header of headerParts) { + if (!header) + continue; + const firstColon = header.indexOf(":"); + if (firstColon === -1) { + socket.destroy(); + return reject(new Error(`Invalid header from proxy CONNECT response: "${header}"`)); + } + const key = header.slice(0, firstColon).toLowerCase(); + const value = header.slice(firstColon + 1).trimStart(); + const current = headers[key]; + if (typeof current === "string") { + headers[key] = [current, value]; + } else if (Array.isArray(current)) { + current.push(value); + } else { + headers[key] = value; + } + } + debug("got proxy server response: %o %o", firstLine, headers); + cleanup(); + resolve({ + connect: { + statusCode, + statusText, + headers + }, + buffered + }); + } + socket.on("error", onerror); + socket.on("end", onend); + read(); + }); + } + exports2.parseProxyResponse = parseProxyResponse; +}); + +// node_modules/https-proxy-agent/dist/index.js +var require_dist2 = __commonJS((exports2) => { + var __createBinding = exports2 && exports2.__createBinding || (Object.create ? function(o, m, k, k2) { + if (k2 === undefined) + k2 = k; + var desc = Object.getOwnPropertyDescriptor(m, k); + if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) { + desc = { enumerable: true, get: function() { + return m[k]; + } }; + } + Object.defineProperty(o, k2, desc); + } : function(o, m, k, k2) { + if (k2 === undefined) + k2 = k; + o[k2] = m[k]; + }); + var __setModuleDefault = exports2 && exports2.__setModuleDefault || (Object.create ? function(o, v) { + Object.defineProperty(o, "default", { enumerable: true, value: v }); + } : function(o, v) { + o["default"] = v; + }); + var __importStar = exports2 && exports2.__importStar || function(mod) { + if (mod && mod.__esModule) + return mod; + var result = {}; + if (mod != null) { + for (var k in mod) + if (k !== "default" && Object.prototype.hasOwnProperty.call(mod, k)) + __createBinding(result, mod, k); + } + __setModuleDefault(result, mod); + return result; + }; + var __importDefault = exports2 && exports2.__importDefault || function(mod) { + return mod && mod.__esModule ? mod : { default: mod }; + }; + Object.defineProperty(exports2, "__esModule", { value: true }); + exports2.HttpsProxyAgent = undefined; + var net = __importStar(require("net")); + var tls = __importStar(require("tls")); + var assert_1 = __importDefault(require("assert")); + var debug_1 = __importDefault(require_src()); + var agent_base_1 = require_dist(); + var url_1 = require("url"); + var parse_proxy_response_1 = require_parse_proxy_response(); + var debug = (0, debug_1.default)("https-proxy-agent"); + + class HttpsProxyAgent extends agent_base_1.Agent { + constructor(proxy, opts) { + super(opts); + this.options = { path: undefined }; + this.proxy = typeof proxy === "string" ? new url_1.URL(proxy) : proxy; + this.proxyHeaders = opts?.headers ?? {}; + debug("Creating new HttpsProxyAgent instance: %o", this.proxy.href); + const host = (this.proxy.hostname || this.proxy.host).replace(/^\[|\]$/g, ""); + const port = this.proxy.port ? parseInt(this.proxy.port, 10) : this.proxy.protocol === "https:" ? 443 : 80; + this.connectOpts = { + ALPNProtocols: ["http/1.1"], + ...opts ? omit(opts, "headers") : null, + host, + port + }; + } + async connect(req, opts) { + const { proxy } = this; + if (!opts.host) { + throw new TypeError('No "host" provided'); + } + let socket; + if (proxy.protocol === "https:") { + debug("Creating `tls.Socket`: %o", this.connectOpts); + const servername = this.connectOpts.servername || this.connectOpts.host; + socket = tls.connect({ + ...this.connectOpts, + servername + }); + } else { + debug("Creating `net.Socket`: %o", this.connectOpts); + socket = net.connect(this.connectOpts); + } + const headers = typeof this.proxyHeaders === "function" ? this.proxyHeaders() : { ...this.proxyHeaders }; + const host = net.isIPv6(opts.host) ? `[${opts.host}]` : opts.host; + let payload = `CONNECT ${host}:${opts.port} HTTP/1.1\r\n`; + if (proxy.username || proxy.password) { + const auth = `${decodeURIComponent(proxy.username)}:${decodeURIComponent(proxy.password)}`; + headers["Proxy-Authorization"] = `Basic ${Buffer.from(auth).toString("base64")}`; + } + headers.Host = `${host}:${opts.port}`; + if (!headers["Proxy-Connection"]) { + headers["Proxy-Connection"] = this.keepAlive ? "Keep-Alive" : "close"; + } + for (const name of Object.keys(headers)) { + payload += `${name}: ${headers[name]}\r\n`; + } + const proxyResponsePromise = (0, parse_proxy_response_1.parseProxyResponse)(socket); + socket.write(`${payload}\r\n`); + const { connect, buffered } = await proxyResponsePromise; + req.emit("proxyConnect", connect); + this.emit("proxyConnect", connect, req); + if (connect.statusCode === 200) { + req.once("socket", resume); + if (opts.secureEndpoint) { + debug("Upgrading socket connection to TLS"); + const servername = opts.servername || opts.host; + return tls.connect({ + ...omit(opts, "host", "path", "port"), + socket, + servername + }); + } + return socket; + } + socket.destroy(); + const fakeSocket = new net.Socket({ writable: false }); + fakeSocket.readable = true; + req.once("socket", (s) => { + debug("Replaying proxy buffer for failed request"); + (0, assert_1.default)(s.listenerCount("data") > 0); + s.push(buffered); + s.push(null); + }); + return fakeSocket; + } + } + HttpsProxyAgent.protocols = ["http", "https"]; + exports2.HttpsProxyAgent = HttpsProxyAgent; + function resume(socket) { + socket.resume(); + } + function omit(obj, ...keys) { + const ret = {}; + let key; + for (key in obj) { + if (!keys.includes(key)) { + ret[key] = obj[key]; + } + } + return ret; + } +}); + +// node_modules/http-proxy-agent/dist/index.js +var require_dist3 = __commonJS((exports2) => { + var __createBinding = exports2 && exports2.__createBinding || (Object.create ? function(o, m, k, k2) { + if (k2 === undefined) + k2 = k; + var desc = Object.getOwnPropertyDescriptor(m, k); + if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) { + desc = { enumerable: true, get: function() { + return m[k]; + } }; + } + Object.defineProperty(o, k2, desc); + } : function(o, m, k, k2) { + if (k2 === undefined) + k2 = k; + o[k2] = m[k]; + }); + var __setModuleDefault = exports2 && exports2.__setModuleDefault || (Object.create ? function(o, v) { + Object.defineProperty(o, "default", { enumerable: true, value: v }); + } : function(o, v) { + o["default"] = v; + }); + var __importStar = exports2 && exports2.__importStar || function(mod) { + if (mod && mod.__esModule) + return mod; + var result = {}; + if (mod != null) { + for (var k in mod) + if (k !== "default" && Object.prototype.hasOwnProperty.call(mod, k)) + __createBinding(result, mod, k); + } + __setModuleDefault(result, mod); + return result; + }; + var __importDefault = exports2 && exports2.__importDefault || function(mod) { + return mod && mod.__esModule ? mod : { default: mod }; + }; + Object.defineProperty(exports2, "__esModule", { value: true }); + exports2.HttpProxyAgent = undefined; + var net = __importStar(require("net")); + var tls = __importStar(require("tls")); + var debug_1 = __importDefault(require_src()); + var events_1 = require("events"); + var agent_base_1 = require_dist(); + var url_1 = require("url"); + var debug = (0, debug_1.default)("http-proxy-agent"); + + class HttpProxyAgent extends agent_base_1.Agent { + constructor(proxy, opts) { + super(opts); + this.proxy = typeof proxy === "string" ? new url_1.URL(proxy) : proxy; + this.proxyHeaders = opts?.headers ?? {}; + debug("Creating new HttpProxyAgent instance: %o", this.proxy.href); + const host = (this.proxy.hostname || this.proxy.host).replace(/^\[|\]$/g, ""); + const port = this.proxy.port ? parseInt(this.proxy.port, 10) : this.proxy.protocol === "https:" ? 443 : 80; + this.connectOpts = { + ...opts ? omit(opts, "headers") : null, + host, + port + }; + } + addRequest(req, opts) { + req._header = null; + this.setRequestProps(req, opts); + super.addRequest(req, opts); + } + setRequestProps(req, opts) { + const { proxy } = this; + const protocol = opts.secureEndpoint ? "https:" : "http:"; + const hostname = req.getHeader("host") || "localhost"; + const base = `${protocol}//${hostname}`; + const url = new url_1.URL(req.path, base); + if (opts.port !== 80) { + url.port = String(opts.port); + } + req.path = String(url); + const headers = typeof this.proxyHeaders === "function" ? this.proxyHeaders() : { ...this.proxyHeaders }; + if (proxy.username || proxy.password) { + const auth = `${decodeURIComponent(proxy.username)}:${decodeURIComponent(proxy.password)}`; + headers["Proxy-Authorization"] = `Basic ${Buffer.from(auth).toString("base64")}`; + } + if (!headers["Proxy-Connection"]) { + headers["Proxy-Connection"] = this.keepAlive ? "Keep-Alive" : "close"; + } + for (const name of Object.keys(headers)) { + const value = headers[name]; + if (value) { + req.setHeader(name, value); + } + } + } + async connect(req, opts) { + req._header = null; + if (!req.path.includes("://")) { + this.setRequestProps(req, opts); + } + let first; + let endOfHeaders; + debug("Regenerating stored HTTP header string for request"); + req._implicitHeader(); + if (req.outputData && req.outputData.length > 0) { + debug("Patching connection write() output buffer with updated header"); + first = req.outputData[0].data; + endOfHeaders = first.indexOf("\r\n\r\n") + 4; + req.outputData[0].data = req._header + first.substring(endOfHeaders); + debug("Output buffer: %o", req.outputData[0].data); + } + let socket; + if (this.proxy.protocol === "https:") { + debug("Creating `tls.Socket`: %o", this.connectOpts); + socket = tls.connect(this.connectOpts); + } else { + debug("Creating `net.Socket`: %o", this.connectOpts); + socket = net.connect(this.connectOpts); + } + await (0, events_1.once)(socket, "connect"); + return socket; + } + } + HttpProxyAgent.protocols = ["http", "https"]; + exports2.HttpProxyAgent = HttpProxyAgent; + function omit(obj, ...keys) { + const ret = {}; + let key; + for (key in obj) { + if (!keys.includes(key)) { + ret[key] = obj[key]; + } + } + return ret; + } +}); + +// node_modules/@azure/core-rest-pipeline/dist/commonjs/policies/proxyPolicy.js +var require_proxyPolicy = __commonJS((exports2) => { + Object.defineProperty(exports2, "__esModule", { value: true }); + exports2.globalNoProxyList = exports2.proxyPolicyName = undefined; + exports2.loadNoProxy = loadNoProxy; + exports2.getDefaultProxySettings = getDefaultProxySettings; + exports2.proxyPolicy = proxyPolicy; + var https_proxy_agent_1 = require_dist2(); + var http_proxy_agent_1 = require_dist3(); + var log_js_1 = require_log2(); + var HTTPS_PROXY = "HTTPS_PROXY"; + var HTTP_PROXY = "HTTP_PROXY"; + var ALL_PROXY = "ALL_PROXY"; + var NO_PROXY = "NO_PROXY"; + exports2.proxyPolicyName = "proxyPolicy"; + exports2.globalNoProxyList = []; + var noProxyListLoaded = false; + var globalBypassedMap = new Map; + function getEnvironmentValue(name) { + if (process.env[name]) { + return process.env[name]; + } else if (process.env[name.toLowerCase()]) { + return process.env[name.toLowerCase()]; + } + return; + } + function loadEnvironmentProxyValue() { + if (!process) { + return; + } + const httpsProxy = getEnvironmentValue(HTTPS_PROXY); + const allProxy = getEnvironmentValue(ALL_PROXY); + const httpProxy = getEnvironmentValue(HTTP_PROXY); + return httpsProxy || allProxy || httpProxy; + } + function isBypassed(uri, noProxyList, bypassedMap) { + if (noProxyList.length === 0) { + return false; + } + const host = new URL(uri).hostname; + if (bypassedMap === null || bypassedMap === undefined ? undefined : bypassedMap.has(host)) { + return bypassedMap.get(host); + } + let isBypassedFlag = false; + for (const pattern of noProxyList) { + if (pattern[0] === ".") { + if (host.endsWith(pattern)) { + isBypassedFlag = true; + } else { + if (host.length === pattern.length - 1 && host === pattern.slice(1)) { + isBypassedFlag = true; + } + } + } else { + if (host === pattern) { + isBypassedFlag = true; + } + } + } + bypassedMap === null || bypassedMap === undefined || bypassedMap.set(host, isBypassedFlag); + return isBypassedFlag; + } + function loadNoProxy() { + const noProxy = getEnvironmentValue(NO_PROXY); + noProxyListLoaded = true; + if (noProxy) { + return noProxy.split(",").map((item) => item.trim()).filter((item) => item.length); + } + return []; + } + function getDefaultProxySettings(proxyUrl) { + if (!proxyUrl) { + proxyUrl = loadEnvironmentProxyValue(); + if (!proxyUrl) { + return; + } + } + const parsedUrl = new URL(proxyUrl); + const schema = parsedUrl.protocol ? parsedUrl.protocol + "//" : ""; + return { + host: schema + parsedUrl.hostname, + port: Number.parseInt(parsedUrl.port || "80"), + username: parsedUrl.username, + password: parsedUrl.password + }; + } + function getDefaultProxySettingsInternal() { + const envProxy = loadEnvironmentProxyValue(); + return envProxy ? new URL(envProxy) : undefined; + } + function getUrlFromProxySettings(settings) { + let parsedProxyUrl; + try { + parsedProxyUrl = new URL(settings.host); + } catch (_a) { + throw new Error(`Expecting a valid host string in proxy settings, but found "${settings.host}".`); + } + parsedProxyUrl.port = String(settings.port); + if (settings.username) { + parsedProxyUrl.username = settings.username; + } + if (settings.password) { + parsedProxyUrl.password = settings.password; + } + return parsedProxyUrl; + } + function setProxyAgentOnRequest(request, cachedAgents, proxyUrl) { + if (request.agent) { + return; + } + const url = new URL(request.url); + const isInsecure = url.protocol !== "https:"; + if (request.tlsSettings) { + log_js_1.logger.warning("TLS settings are not supported in combination with custom Proxy, certificates provided to the client will be ignored."); + } + const headers = request.headers.toJSON(); + if (isInsecure) { + if (!cachedAgents.httpProxyAgent) { + cachedAgents.httpProxyAgent = new http_proxy_agent_1.HttpProxyAgent(proxyUrl, { headers }); + } + request.agent = cachedAgents.httpProxyAgent; + } else { + if (!cachedAgents.httpsProxyAgent) { + cachedAgents.httpsProxyAgent = new https_proxy_agent_1.HttpsProxyAgent(proxyUrl, { headers }); + } + request.agent = cachedAgents.httpsProxyAgent; + } + } + function proxyPolicy(proxySettings, options) { + if (!noProxyListLoaded) { + exports2.globalNoProxyList.push(...loadNoProxy()); + } + const defaultProxy = proxySettings ? getUrlFromProxySettings(proxySettings) : getDefaultProxySettingsInternal(); + const cachedAgents = {}; + return { + name: exports2.proxyPolicyName, + async sendRequest(request, next) { + var _a; + if (!request.proxySettings && defaultProxy && !isBypassed(request.url, (_a = options === null || options === undefined ? undefined : options.customNoProxyList) !== null && _a !== undefined ? _a : exports2.globalNoProxyList, (options === null || options === undefined ? undefined : options.customNoProxyList) ? undefined : globalBypassedMap)) { + setProxyAgentOnRequest(request, cachedAgents, defaultProxy); + } else if (request.proxySettings) { + setProxyAgentOnRequest(request, cachedAgents, getUrlFromProxySettings(request.proxySettings)); + } + return next(request); + } + }; + } +}); + +// node_modules/@azure/core-rest-pipeline/dist/commonjs/policies/setClientRequestIdPolicy.js +var require_setClientRequestIdPolicy = __commonJS((exports2) => { + Object.defineProperty(exports2, "__esModule", { value: true }); + exports2.setClientRequestIdPolicyName = undefined; + exports2.setClientRequestIdPolicy = setClientRequestIdPolicy; + exports2.setClientRequestIdPolicyName = "setClientRequestIdPolicy"; + function setClientRequestIdPolicy(requestIdHeaderName = "x-ms-client-request-id") { + return { + name: exports2.setClientRequestIdPolicyName, + async sendRequest(request, next) { + if (!request.headers.has(requestIdHeaderName)) { + request.headers.set(requestIdHeaderName, request.requestId); + } + return next(request); + } + }; + } +}); + +// node_modules/@azure/core-rest-pipeline/dist/commonjs/policies/tlsPolicy.js +var require_tlsPolicy = __commonJS((exports2) => { + Object.defineProperty(exports2, "__esModule", { value: true }); + exports2.tlsPolicyName = undefined; + exports2.tlsPolicy = tlsPolicy; + exports2.tlsPolicyName = "tlsPolicy"; + function tlsPolicy(tlsSettings) { + return { + name: exports2.tlsPolicyName, + sendRequest: async (req, next) => { + if (!req.tlsSettings) { + req.tlsSettings = tlsSettings; + } + return next(req); + } + }; + } +}); + +// node_modules/@azure/core-tracing/dist/commonjs/tracingContext.js +var require_tracingContext = __commonJS((exports2) => { + Object.defineProperty(exports2, "__esModule", { value: true }); + exports2.TracingContextImpl = exports2.knownContextKeys = undefined; + exports2.createTracingContext = createTracingContext; + exports2.knownContextKeys = { + span: Symbol.for("@azure/core-tracing span"), + namespace: Symbol.for("@azure/core-tracing namespace") + }; + function createTracingContext(options = {}) { + let context = new TracingContextImpl(options.parentContext); + if (options.span) { + context = context.setValue(exports2.knownContextKeys.span, options.span); + } + if (options.namespace) { + context = context.setValue(exports2.knownContextKeys.namespace, options.namespace); + } + return context; + } + + class TracingContextImpl { + constructor(initialContext) { + this._contextMap = initialContext instanceof TracingContextImpl ? new Map(initialContext._contextMap) : new Map; + } + setValue(key, value) { + const newContext = new TracingContextImpl(this); + newContext._contextMap.set(key, value); + return newContext; + } + getValue(key) { + return this._contextMap.get(key); + } + deleteValue(key) { + const newContext = new TracingContextImpl(this); + newContext._contextMap.delete(key); + return newContext; + } + } + exports2.TracingContextImpl = TracingContextImpl; +}); + +// node_modules/@azure/core-tracing/dist/commonjs/state.js +var require_state = __commonJS((exports2) => { + Object.defineProperty(exports2, "__esModule", { value: true }); + exports2.state = undefined; + exports2.state = { + instrumenterImplementation: undefined + }; +}); + +// node_modules/@azure/core-tracing/dist/commonjs/instrumenter.js +var require_instrumenter = __commonJS((exports2) => { + Object.defineProperty(exports2, "__esModule", { value: true }); + exports2.createDefaultTracingSpan = createDefaultTracingSpan; + exports2.createDefaultInstrumenter = createDefaultInstrumenter; + exports2.useInstrumenter = useInstrumenter; + exports2.getInstrumenter = getInstrumenter; + var tracingContext_js_1 = require_tracingContext(); + var state_js_1 = require_state(); + function createDefaultTracingSpan() { + return { + end: () => { + }, + isRecording: () => false, + recordException: () => { + }, + setAttribute: () => { + }, + setStatus: () => { + }, + addEvent: () => { + } + }; + } + function createDefaultInstrumenter() { + return { + createRequestHeaders: () => { + return {}; + }, + parseTraceparentHeader: () => { + return; + }, + startSpan: (_name, spanOptions) => { + return { + span: createDefaultTracingSpan(), + tracingContext: (0, tracingContext_js_1.createTracingContext)({ parentContext: spanOptions.tracingContext }) + }; + }, + withContext(_context, callback, ...callbackArgs) { + return callback(...callbackArgs); + } + }; + } + function useInstrumenter(instrumenter) { + state_js_1.state.instrumenterImplementation = instrumenter; + } + function getInstrumenter() { + if (!state_js_1.state.instrumenterImplementation) { + state_js_1.state.instrumenterImplementation = createDefaultInstrumenter(); + } + return state_js_1.state.instrumenterImplementation; + } +}); + +// node_modules/@azure/core-tracing/dist/commonjs/tracingClient.js +var require_tracingClient = __commonJS((exports2) => { + Object.defineProperty(exports2, "__esModule", { value: true }); + exports2.createTracingClient = createTracingClient; + var instrumenter_js_1 = require_instrumenter(); + var tracingContext_js_1 = require_tracingContext(); + function createTracingClient(options) { + const { namespace, packageName, packageVersion } = options; + function startSpan(name, operationOptions, spanOptions) { + var _a; + const startSpanResult = (0, instrumenter_js_1.getInstrumenter)().startSpan(name, Object.assign(Object.assign({}, spanOptions), { packageName, packageVersion, tracingContext: (_a = operationOptions === null || operationOptions === undefined ? undefined : operationOptions.tracingOptions) === null || _a === undefined ? undefined : _a.tracingContext })); + let tracingContext = startSpanResult.tracingContext; + const span = startSpanResult.span; + if (!tracingContext.getValue(tracingContext_js_1.knownContextKeys.namespace)) { + tracingContext = tracingContext.setValue(tracingContext_js_1.knownContextKeys.namespace, namespace); + } + span.setAttribute("az.namespace", tracingContext.getValue(tracingContext_js_1.knownContextKeys.namespace)); + const updatedOptions = Object.assign({}, operationOptions, { + tracingOptions: Object.assign(Object.assign({}, operationOptions === null || operationOptions === undefined ? undefined : operationOptions.tracingOptions), { tracingContext }) + }); + return { + span, + updatedOptions + }; + } + async function withSpan(name, operationOptions, callback, spanOptions) { + const { span, updatedOptions } = startSpan(name, operationOptions, spanOptions); + try { + const result = await withContext(updatedOptions.tracingOptions.tracingContext, () => Promise.resolve(callback(updatedOptions, span))); + span.setStatus({ status: "success" }); + return result; + } catch (err) { + span.setStatus({ status: "error", error: err }); + throw err; + } finally { + span.end(); + } + } + function withContext(context, callback, ...callbackArgs) { + return (0, instrumenter_js_1.getInstrumenter)().withContext(context, callback, ...callbackArgs); + } + function parseTraceparentHeader(traceparentHeader) { + return (0, instrumenter_js_1.getInstrumenter)().parseTraceparentHeader(traceparentHeader); + } + function createRequestHeaders(tracingContext) { + return (0, instrumenter_js_1.getInstrumenter)().createRequestHeaders(tracingContext); + } + return { + startSpan, + withSpan, + withContext, + parseTraceparentHeader, + createRequestHeaders + }; + } +}); + +// node_modules/@azure/core-tracing/dist/commonjs/index.js +var require_commonjs6 = __commonJS((exports2) => { + Object.defineProperty(exports2, "__esModule", { value: true }); + exports2.createTracingClient = exports2.useInstrumenter = undefined; + var instrumenter_js_1 = require_instrumenter(); + Object.defineProperty(exports2, "useInstrumenter", { enumerable: true, get: function() { + return instrumenter_js_1.useInstrumenter; + } }); + var tracingClient_js_1 = require_tracingClient(); + Object.defineProperty(exports2, "createTracingClient", { enumerable: true, get: function() { + return tracingClient_js_1.createTracingClient; + } }); +}); + +// node_modules/@azure/core-rest-pipeline/dist/commonjs/util/inspect.js +var require_inspect = __commonJS((exports2) => { + Object.defineProperty(exports2, "__esModule", { value: true }); + exports2.custom = undefined; + var node_util_1 = require("node:util"); + exports2.custom = node_util_1.inspect.custom; +}); + +// node_modules/@azure/core-rest-pipeline/dist/commonjs/restError.js +var require_restError = __commonJS((exports2) => { + Object.defineProperty(exports2, "__esModule", { value: true }); + exports2.RestError = undefined; + exports2.isRestError = isRestError; + var core_util_1 = require_commonjs5(); + var inspect_js_1 = require_inspect(); + var sanitizer_js_1 = require_sanitizer(); + var errorSanitizer = new sanitizer_js_1.Sanitizer; + + class RestError extends Error { + constructor(message, options = {}) { + super(message); + this.name = "RestError"; + this.code = options.code; + this.statusCode = options.statusCode; + Object.defineProperty(this, "request", { value: options.request, enumerable: false }); + Object.defineProperty(this, "response", { value: options.response, enumerable: false }); + Object.setPrototypeOf(this, RestError.prototype); + } + [inspect_js_1.custom]() { + return `RestError: ${this.message} \n ${errorSanitizer.sanitize(Object.assign(Object.assign({}, this), { request: this.request, response: this.response }))}`; + } + } + exports2.RestError = RestError; + RestError.REQUEST_SEND_ERROR = "REQUEST_SEND_ERROR"; + RestError.PARSE_ERROR = "PARSE_ERROR"; + function isRestError(e) { + if (e instanceof RestError) { + return true; + } + return (0, core_util_1.isError)(e) && e.name === "RestError"; + } +}); + +// node_modules/@azure/core-rest-pipeline/dist/commonjs/policies/tracingPolicy.js +var require_tracingPolicy = __commonJS((exports2) => { + Object.defineProperty(exports2, "__esModule", { value: true }); + exports2.tracingPolicyName = undefined; + exports2.tracingPolicy = tracingPolicy; + var core_tracing_1 = require_commonjs6(); + var constants_js_1 = require_constants6(); + var userAgent_js_1 = require_userAgent(); + var log_js_1 = require_log2(); + var core_util_1 = require_commonjs5(); + var restError_js_1 = require_restError(); + var sanitizer_js_1 = require_sanitizer(); + exports2.tracingPolicyName = "tracingPolicy"; + function tracingPolicy(options = {}) { + const userAgentPromise = (0, userAgent_js_1.getUserAgentValue)(options.userAgentPrefix); + const sanitizer = new sanitizer_js_1.Sanitizer({ + additionalAllowedQueryParameters: options.additionalAllowedQueryParameters + }); + const tracingClient = tryCreateTracingClient(); + return { + name: exports2.tracingPolicyName, + async sendRequest(request, next) { + var _a; + if (!tracingClient) { + return next(request); + } + const userAgent = await userAgentPromise; + const spanAttributes = { + "http.url": sanitizer.sanitizeUrl(request.url), + "http.method": request.method, + "http.user_agent": userAgent, + requestId: request.requestId + }; + if (userAgent) { + spanAttributes["http.user_agent"] = userAgent; + } + const { span, tracingContext } = (_a = tryCreateSpan(tracingClient, request, spanAttributes)) !== null && _a !== undefined ? _a : {}; + if (!span || !tracingContext) { + return next(request); + } + try { + const response = await tracingClient.withContext(tracingContext, next, request); + tryProcessResponse(span, response); + return response; + } catch (err) { + tryProcessError(span, err); + throw err; + } + } + }; + } + function tryCreateTracingClient() { + try { + return (0, core_tracing_1.createTracingClient)({ + namespace: "", + packageName: "@azure/core-rest-pipeline", + packageVersion: constants_js_1.SDK_VERSION + }); + } catch (e) { + log_js_1.logger.warning(`Error when creating the TracingClient: ${(0, core_util_1.getErrorMessage)(e)}`); + return; + } + } + function tryCreateSpan(tracingClient, request, spanAttributes) { + try { + const { span, updatedOptions } = tracingClient.startSpan(`HTTP ${request.method}`, { tracingOptions: request.tracingOptions }, { + spanKind: "client", + spanAttributes + }); + if (!span.isRecording()) { + span.end(); + return; + } + const headers = tracingClient.createRequestHeaders(updatedOptions.tracingOptions.tracingContext); + for (const [key, value] of Object.entries(headers)) { + request.headers.set(key, value); + } + return { span, tracingContext: updatedOptions.tracingOptions.tracingContext }; + } catch (e) { + log_js_1.logger.warning(`Skipping creating a tracing span due to an error: ${(0, core_util_1.getErrorMessage)(e)}`); + return; + } + } + function tryProcessError(span, error) { + try { + span.setStatus({ + status: "error", + error: (0, core_util_1.isError)(error) ? error : undefined + }); + if ((0, restError_js_1.isRestError)(error) && error.statusCode) { + span.setAttribute("http.status_code", error.statusCode); + } + span.end(); + } catch (e) { + log_js_1.logger.warning(`Skipping tracing span processing due to an error: ${(0, core_util_1.getErrorMessage)(e)}`); + } + } + function tryProcessResponse(span, response) { + try { + span.setAttribute("http.status_code", response.status); + const serviceRequestId = response.headers.get("x-ms-request-id"); + if (serviceRequestId) { + span.setAttribute("serviceRequestId", serviceRequestId); + } + span.setStatus({ + status: "success" + }); + span.end(); + } catch (e) { + log_js_1.logger.warning(`Skipping tracing span processing due to an error: ${(0, core_util_1.getErrorMessage)(e)}`); + } + } +}); + +// node_modules/@azure/core-rest-pipeline/dist/commonjs/createPipelineFromOptions.js +var require_createPipelineFromOptions = __commonJS((exports2) => { + Object.defineProperty(exports2, "__esModule", { value: true }); + exports2.createPipelineFromOptions = createPipelineFromOptions; + var logPolicy_js_1 = require_logPolicy(); + var pipeline_js_1 = require_pipeline(); + var redirectPolicy_js_1 = require_redirectPolicy(); + var userAgentPolicy_js_1 = require_userAgentPolicy(); + var multipartPolicy_js_1 = require_multipartPolicy(); + var decompressResponsePolicy_js_1 = require_decompressResponsePolicy(); + var defaultRetryPolicy_js_1 = require_defaultRetryPolicy(); + var formDataPolicy_js_1 = require_formDataPolicy(); + var core_util_1 = require_commonjs5(); + var proxyPolicy_js_1 = require_proxyPolicy(); + var setClientRequestIdPolicy_js_1 = require_setClientRequestIdPolicy(); + var tlsPolicy_js_1 = require_tlsPolicy(); + var tracingPolicy_js_1 = require_tracingPolicy(); + function createPipelineFromOptions(options) { + var _a; + const pipeline = (0, pipeline_js_1.createEmptyPipeline)(); + if (core_util_1.isNodeLike) { + if (options.tlsOptions) { + pipeline.addPolicy((0, tlsPolicy_js_1.tlsPolicy)(options.tlsOptions)); + } + pipeline.addPolicy((0, proxyPolicy_js_1.proxyPolicy)(options.proxyOptions)); + pipeline.addPolicy((0, decompressResponsePolicy_js_1.decompressResponsePolicy)()); + } + pipeline.addPolicy((0, formDataPolicy_js_1.formDataPolicy)(), { beforePolicies: [multipartPolicy_js_1.multipartPolicyName] }); + pipeline.addPolicy((0, userAgentPolicy_js_1.userAgentPolicy)(options.userAgentOptions)); + pipeline.addPolicy((0, setClientRequestIdPolicy_js_1.setClientRequestIdPolicy)((_a = options.telemetryOptions) === null || _a === undefined ? undefined : _a.clientRequestIdHeaderName)); + pipeline.addPolicy((0, multipartPolicy_js_1.multipartPolicy)(), { afterPhase: "Deserialize" }); + pipeline.addPolicy((0, defaultRetryPolicy_js_1.defaultRetryPolicy)(options.retryOptions), { phase: "Retry" }); + pipeline.addPolicy((0, tracingPolicy_js_1.tracingPolicy)(Object.assign(Object.assign({}, options.userAgentOptions), options.loggingOptions)), { + afterPhase: "Retry" + }); + if (core_util_1.isNodeLike) { + pipeline.addPolicy((0, redirectPolicy_js_1.redirectPolicy)(options.redirectOptions), { afterPhase: "Retry" }); + } + pipeline.addPolicy((0, logPolicy_js_1.logPolicy)(options.loggingOptions), { afterPhase: "Sign" }); + return pipeline; + } +}); + +// node_modules/@azure/core-rest-pipeline/dist/commonjs/nodeHttpClient.js +var require_nodeHttpClient = __commonJS((exports2) => { + Object.defineProperty(exports2, "__esModule", { value: true }); + exports2.getBodyLength = getBodyLength; + exports2.createNodeHttpClient = createNodeHttpClient; + var tslib_1 = require_tslib(); + var http = tslib_1.__importStar(require("node:http")); + var https = tslib_1.__importStar(require("node:https")); + var zlib = tslib_1.__importStar(require("node:zlib")); + var node_stream_1 = require("node:stream"); + var abort_controller_1 = require_commonjs4(); + var httpHeaders_js_1 = require_httpHeaders(); + var restError_js_1 = require_restError(); + var log_js_1 = require_log2(); + var DEFAULT_TLS_SETTINGS = {}; + function isReadableStream(body) { + return body && typeof body.pipe === "function"; + } + function isStreamComplete(stream) { + return new Promise((resolve) => { + const handler = () => { + resolve(); + stream.removeListener("close", handler); + stream.removeListener("end", handler); + stream.removeListener("error", handler); + }; + stream.on("close", handler); + stream.on("end", handler); + stream.on("error", handler); + }); + } + function isArrayBuffer(body) { + return body && typeof body.byteLength === "number"; + } + + class ReportTransform extends node_stream_1.Transform { + _transform(chunk, _encoding, callback) { + this.push(chunk); + this.loadedBytes += chunk.length; + try { + this.progressCallback({ loadedBytes: this.loadedBytes }); + callback(); + } catch (e) { + callback(e); + } + } + constructor(progressCallback) { + super(); + this.loadedBytes = 0; + this.progressCallback = progressCallback; + } + } + + class NodeHttpClient { + constructor() { + this.cachedHttpsAgents = new WeakMap; + } + async sendRequest(request) { + var _a, _b, _c; + const abortController = new AbortController; + let abortListener; + if (request.abortSignal) { + if (request.abortSignal.aborted) { + throw new abort_controller_1.AbortError("The operation was aborted."); + } + abortListener = (event) => { + if (event.type === "abort") { + abortController.abort(); + } + }; + request.abortSignal.addEventListener("abort", abortListener); + } + if (request.timeout > 0) { + setTimeout(() => { + abortController.abort(); + }, request.timeout); + } + const acceptEncoding = request.headers.get("Accept-Encoding"); + const shouldDecompress = (acceptEncoding === null || acceptEncoding === undefined ? undefined : acceptEncoding.includes("gzip")) || (acceptEncoding === null || acceptEncoding === undefined ? undefined : acceptEncoding.includes("deflate")); + let body = typeof request.body === "function" ? request.body() : request.body; + if (body && !request.headers.has("Content-Length")) { + const bodyLength = getBodyLength(body); + if (bodyLength !== null) { + request.headers.set("Content-Length", bodyLength); + } + } + let responseStream; + try { + if (body && request.onUploadProgress) { + const onUploadProgress = request.onUploadProgress; + const uploadReportStream = new ReportTransform(onUploadProgress); + uploadReportStream.on("error", (e) => { + log_js_1.logger.error("Error in upload progress", e); + }); + if (isReadableStream(body)) { + body.pipe(uploadReportStream); + } else { + uploadReportStream.end(body); + } + body = uploadReportStream; + } + const res = await this.makeRequest(request, abortController, body); + const headers = getResponseHeaders(res); + const status = (_a = res.statusCode) !== null && _a !== undefined ? _a : 0; + const response = { + status, + headers, + request + }; + if (request.method === "HEAD") { + res.resume(); + return response; + } + responseStream = shouldDecompress ? getDecodedResponseStream(res, headers) : res; + const onDownloadProgress = request.onDownloadProgress; + if (onDownloadProgress) { + const downloadReportStream = new ReportTransform(onDownloadProgress); + downloadReportStream.on("error", (e) => { + log_js_1.logger.error("Error in download progress", e); + }); + responseStream.pipe(downloadReportStream); + responseStream = downloadReportStream; + } + if (((_b = request.streamResponseStatusCodes) === null || _b === undefined ? undefined : _b.has(Number.POSITIVE_INFINITY)) || ((_c = request.streamResponseStatusCodes) === null || _c === undefined ? undefined : _c.has(response.status))) { + response.readableStreamBody = responseStream; + } else { + response.bodyAsText = await streamToText(responseStream); + } + return response; + } finally { + if (request.abortSignal && abortListener) { + let uploadStreamDone = Promise.resolve(); + if (isReadableStream(body)) { + uploadStreamDone = isStreamComplete(body); + } + let downloadStreamDone = Promise.resolve(); + if (isReadableStream(responseStream)) { + downloadStreamDone = isStreamComplete(responseStream); + } + Promise.all([uploadStreamDone, downloadStreamDone]).then(() => { + var _a2; + if (abortListener) { + (_a2 = request.abortSignal) === null || _a2 === undefined || _a2.removeEventListener("abort", abortListener); + } + }).catch((e) => { + log_js_1.logger.warning("Error when cleaning up abortListener on httpRequest", e); + }); + } + } + } + makeRequest(request, abortController, body) { + var _a; + const url = new URL(request.url); + const isInsecure = url.protocol !== "https:"; + if (isInsecure && !request.allowInsecureConnection) { + throw new Error(`Cannot connect to ${request.url} while allowInsecureConnection is false.`); + } + const agent = (_a = request.agent) !== null && _a !== undefined ? _a : this.getOrCreateAgent(request, isInsecure); + const options = { + agent, + hostname: url.hostname, + path: `${url.pathname}${url.search}`, + port: url.port, + method: request.method, + headers: request.headers.toJSON({ preserveCase: true }) + }; + return new Promise((resolve, reject) => { + const req = isInsecure ? http.request(options, resolve) : https.request(options, resolve); + req.once("error", (err) => { + var _a2; + reject(new restError_js_1.RestError(err.message, { code: (_a2 = err.code) !== null && _a2 !== undefined ? _a2 : restError_js_1.RestError.REQUEST_SEND_ERROR, request })); + }); + abortController.signal.addEventListener("abort", () => { + const abortError = new abort_controller_1.AbortError("The operation was aborted."); + req.destroy(abortError); + reject(abortError); + }); + if (body && isReadableStream(body)) { + body.pipe(req); + } else if (body) { + if (typeof body === "string" || Buffer.isBuffer(body)) { + req.end(body); + } else if (isArrayBuffer(body)) { + req.end(ArrayBuffer.isView(body) ? Buffer.from(body.buffer) : Buffer.from(body)); + } else { + log_js_1.logger.error("Unrecognized body type", body); + reject(new restError_js_1.RestError("Unrecognized body type")); + } + } else { + req.end(); + } + }); + } + getOrCreateAgent(request, isInsecure) { + var _a; + const disableKeepAlive = request.disableKeepAlive; + if (isInsecure) { + if (disableKeepAlive) { + return http.globalAgent; + } + if (!this.cachedHttpAgent) { + this.cachedHttpAgent = new http.Agent({ keepAlive: true }); + } + return this.cachedHttpAgent; + } else { + if (disableKeepAlive && !request.tlsSettings) { + return https.globalAgent; + } + const tlsSettings = (_a = request.tlsSettings) !== null && _a !== undefined ? _a : DEFAULT_TLS_SETTINGS; + let agent = this.cachedHttpsAgents.get(tlsSettings); + if (agent && agent.options.keepAlive === !disableKeepAlive) { + return agent; + } + log_js_1.logger.info("No cached TLS Agent exist, creating a new Agent"); + agent = new https.Agent(Object.assign({ + keepAlive: !disableKeepAlive + }, tlsSettings)); + this.cachedHttpsAgents.set(tlsSettings, agent); + return agent; + } + } + } + function getResponseHeaders(res) { + const headers = (0, httpHeaders_js_1.createHttpHeaders)(); + for (const header of Object.keys(res.headers)) { + const value = res.headers[header]; + if (Array.isArray(value)) { + if (value.length > 0) { + headers.set(header, value[0]); + } + } else if (value) { + headers.set(header, value); + } + } + return headers; + } + function getDecodedResponseStream(stream, headers) { + const contentEncoding = headers.get("Content-Encoding"); + if (contentEncoding === "gzip") { + const unzip = zlib.createGunzip(); + stream.pipe(unzip); + return unzip; + } else if (contentEncoding === "deflate") { + const inflate = zlib.createInflate(); + stream.pipe(inflate); + return inflate; + } + return stream; + } + function streamToText(stream) { + return new Promise((resolve, reject) => { + const buffer = []; + stream.on("data", (chunk) => { + if (Buffer.isBuffer(chunk)) { + buffer.push(chunk); + } else { + buffer.push(Buffer.from(chunk)); + } + }); + stream.on("end", () => { + resolve(Buffer.concat(buffer).toString("utf8")); + }); + stream.on("error", (e) => { + if (e && (e === null || e === undefined ? undefined : e.name) === "AbortError") { + reject(e); + } else { + reject(new restError_js_1.RestError(`Error reading response as text: ${e.message}`, { + code: restError_js_1.RestError.PARSE_ERROR + })); + } + }); + }); + } + function getBodyLength(body) { + if (!body) { + return 0; + } else if (Buffer.isBuffer(body)) { + return body.length; + } else if (isReadableStream(body)) { + return null; + } else if (isArrayBuffer(body)) { + return body.byteLength; + } else if (typeof body === "string") { + return Buffer.from(body).length; + } else { + return null; + } + } + function createNodeHttpClient() { + return new NodeHttpClient; + } +}); + +// node_modules/@azure/core-rest-pipeline/dist/commonjs/defaultHttpClient.js +var require_defaultHttpClient = __commonJS((exports2) => { + Object.defineProperty(exports2, "__esModule", { value: true }); + exports2.createDefaultHttpClient = createDefaultHttpClient; + var nodeHttpClient_js_1 = require_nodeHttpClient(); + function createDefaultHttpClient() { + return (0, nodeHttpClient_js_1.createNodeHttpClient)(); + } +}); + +// node_modules/@azure/core-rest-pipeline/dist/commonjs/pipelineRequest.js +var require_pipelineRequest = __commonJS((exports2) => { + Object.defineProperty(exports2, "__esModule", { value: true }); + exports2.createPipelineRequest = createPipelineRequest; + var httpHeaders_js_1 = require_httpHeaders(); + var core_util_1 = require_commonjs5(); + + class PipelineRequestImpl { + constructor(options) { + var _a, _b, _c, _d, _e, _f, _g; + this.url = options.url; + this.body = options.body; + this.headers = (_a = options.headers) !== null && _a !== undefined ? _a : (0, httpHeaders_js_1.createHttpHeaders)(); + this.method = (_b = options.method) !== null && _b !== undefined ? _b : "GET"; + this.timeout = (_c = options.timeout) !== null && _c !== undefined ? _c : 0; + this.multipartBody = options.multipartBody; + this.formData = options.formData; + this.disableKeepAlive = (_d = options.disableKeepAlive) !== null && _d !== undefined ? _d : false; + this.proxySettings = options.proxySettings; + this.streamResponseStatusCodes = options.streamResponseStatusCodes; + this.withCredentials = (_e = options.withCredentials) !== null && _e !== undefined ? _e : false; + this.abortSignal = options.abortSignal; + this.tracingOptions = options.tracingOptions; + this.onUploadProgress = options.onUploadProgress; + this.onDownloadProgress = options.onDownloadProgress; + this.requestId = options.requestId || (0, core_util_1.randomUUID)(); + this.allowInsecureConnection = (_f = options.allowInsecureConnection) !== null && _f !== undefined ? _f : false; + this.enableBrowserStreams = (_g = options.enableBrowserStreams) !== null && _g !== undefined ? _g : false; + } + } + function createPipelineRequest(options) { + return new PipelineRequestImpl(options); + } +}); + +// node_modules/@azure/core-rest-pipeline/dist/commonjs/policies/exponentialRetryPolicy.js +var require_exponentialRetryPolicy = __commonJS((exports2) => { + Object.defineProperty(exports2, "__esModule", { value: true }); + exports2.exponentialRetryPolicyName = undefined; + exports2.exponentialRetryPolicy = exponentialRetryPolicy; + var exponentialRetryStrategy_js_1 = require_exponentialRetryStrategy(); + var retryPolicy_js_1 = require_retryPolicy(); + var constants_js_1 = require_constants6(); + exports2.exponentialRetryPolicyName = "exponentialRetryPolicy"; + function exponentialRetryPolicy(options = {}) { + var _a; + return (0, retryPolicy_js_1.retryPolicy)([ + (0, exponentialRetryStrategy_js_1.exponentialRetryStrategy)(Object.assign(Object.assign({}, options), { ignoreSystemErrors: true })) + ], { + maxRetries: (_a = options.maxRetries) !== null && _a !== undefined ? _a : constants_js_1.DEFAULT_RETRY_POLICY_COUNT + }); + } +}); + +// node_modules/@azure/core-rest-pipeline/dist/commonjs/policies/systemErrorRetryPolicy.js +var require_systemErrorRetryPolicy = __commonJS((exports2) => { + Object.defineProperty(exports2, "__esModule", { value: true }); + exports2.systemErrorRetryPolicyName = undefined; + exports2.systemErrorRetryPolicy = systemErrorRetryPolicy; + var exponentialRetryStrategy_js_1 = require_exponentialRetryStrategy(); + var retryPolicy_js_1 = require_retryPolicy(); + var constants_js_1 = require_constants6(); + exports2.systemErrorRetryPolicyName = "systemErrorRetryPolicy"; + function systemErrorRetryPolicy(options = {}) { + var _a; + return { + name: exports2.systemErrorRetryPolicyName, + sendRequest: (0, retryPolicy_js_1.retryPolicy)([ + (0, exponentialRetryStrategy_js_1.exponentialRetryStrategy)(Object.assign(Object.assign({}, options), { ignoreHttpStatusCodes: true })) + ], { + maxRetries: (_a = options.maxRetries) !== null && _a !== undefined ? _a : constants_js_1.DEFAULT_RETRY_POLICY_COUNT + }).sendRequest + }; + } +}); + +// node_modules/@azure/core-rest-pipeline/dist/commonjs/policies/throttlingRetryPolicy.js +var require_throttlingRetryPolicy = __commonJS((exports2) => { + Object.defineProperty(exports2, "__esModule", { value: true }); + exports2.throttlingRetryPolicyName = undefined; + exports2.throttlingRetryPolicy = throttlingRetryPolicy; + var throttlingRetryStrategy_js_1 = require_throttlingRetryStrategy(); + var retryPolicy_js_1 = require_retryPolicy(); + var constants_js_1 = require_constants6(); + exports2.throttlingRetryPolicyName = "throttlingRetryPolicy"; + function throttlingRetryPolicy(options = {}) { + var _a; + return { + name: exports2.throttlingRetryPolicyName, + sendRequest: (0, retryPolicy_js_1.retryPolicy)([(0, throttlingRetryStrategy_js_1.throttlingRetryStrategy)()], { + maxRetries: (_a = options.maxRetries) !== null && _a !== undefined ? _a : constants_js_1.DEFAULT_RETRY_POLICY_COUNT + }).sendRequest + }; + } +}); + +// node_modules/@azure/core-rest-pipeline/dist/commonjs/util/tokenCycler.js +var require_tokenCycler = __commonJS((exports2) => { + Object.defineProperty(exports2, "__esModule", { value: true }); + exports2.DEFAULT_CYCLER_OPTIONS = undefined; + exports2.createTokenCycler = createTokenCycler; + var helpers_js_1 = require_helpers(); + exports2.DEFAULT_CYCLER_OPTIONS = { + forcedRefreshWindowInMs: 1000, + retryIntervalInMs: 3000, + refreshWindowInMs: 1000 * 60 * 2 + }; + async function beginRefresh(getAccessToken, retryIntervalInMs, refreshTimeout) { + async function tryGetAccessToken() { + if (Date.now() < refreshTimeout) { + try { + return await getAccessToken(); + } catch (_a) { + return null; + } + } else { + const finalToken = await getAccessToken(); + if (finalToken === null) { + throw new Error("Failed to refresh access token."); + } + return finalToken; + } + } + let token = await tryGetAccessToken(); + while (token === null) { + await (0, helpers_js_1.delay)(retryIntervalInMs); + token = await tryGetAccessToken(); + } + return token; + } + function createTokenCycler(credential, tokenCyclerOptions) { + let refreshWorker = null; + let token = null; + let tenantId; + const options = Object.assign(Object.assign({}, exports2.DEFAULT_CYCLER_OPTIONS), tokenCyclerOptions); + const cycler = { + get isRefreshing() { + return refreshWorker !== null; + }, + get shouldRefresh() { + var _a; + if (cycler.isRefreshing) { + return false; + } + if ((token === null || token === undefined ? undefined : token.refreshAfterTimestamp) && token.refreshAfterTimestamp < Date.now()) { + return true; + } + return ((_a = token === null || token === undefined ? undefined : token.expiresOnTimestamp) !== null && _a !== undefined ? _a : 0) - options.refreshWindowInMs < Date.now(); + }, + get mustRefresh() { + return token === null || token.expiresOnTimestamp - options.forcedRefreshWindowInMs < Date.now(); + } + }; + function refresh(scopes, getTokenOptions) { + var _a; + if (!cycler.isRefreshing) { + const tryGetAccessToken = () => credential.getToken(scopes, getTokenOptions); + refreshWorker = beginRefresh(tryGetAccessToken, options.retryIntervalInMs, (_a = token === null || token === undefined ? undefined : token.expiresOnTimestamp) !== null && _a !== undefined ? _a : Date.now()).then((_token) => { + refreshWorker = null; + token = _token; + tenantId = getTokenOptions.tenantId; + return token; + }).catch((reason) => { + refreshWorker = null; + token = null; + tenantId = undefined; + throw reason; + }); + } + return refreshWorker; + } + return async (scopes, tokenOptions) => { + const hasClaimChallenge = Boolean(tokenOptions.claims); + const tenantIdChanged = tenantId !== tokenOptions.tenantId; + if (hasClaimChallenge) { + token = null; + } + const mustRefresh = tenantIdChanged || hasClaimChallenge || cycler.mustRefresh; + if (mustRefresh) { + return refresh(scopes, tokenOptions); + } + if (cycler.shouldRefresh) { + refresh(scopes, tokenOptions); + } + return token; + }; + } +}); + +// node_modules/@azure/core-rest-pipeline/dist/commonjs/policies/bearerTokenAuthenticationPolicy.js +var require_bearerTokenAuthenticationPolicy = __commonJS((exports2) => { + Object.defineProperty(exports2, "__esModule", { value: true }); + exports2.bearerTokenAuthenticationPolicyName = undefined; + exports2.bearerTokenAuthenticationPolicy = bearerTokenAuthenticationPolicy; + var tokenCycler_js_1 = require_tokenCycler(); + var log_js_1 = require_log2(); + exports2.bearerTokenAuthenticationPolicyName = "bearerTokenAuthenticationPolicy"; + async function defaultAuthorizeRequest(options) { + const { scopes, getAccessToken, request } = options; + const getTokenOptions = { + abortSignal: request.abortSignal, + tracingOptions: request.tracingOptions + }; + const accessToken = await getAccessToken(scopes, getTokenOptions); + if (accessToken) { + options.request.headers.set("Authorization", `Bearer ${accessToken.token}`); + } + } + function getChallenge(response) { + const challenge = response.headers.get("WWW-Authenticate"); + if (response.status === 401 && challenge) { + return challenge; + } + return; + } + function bearerTokenAuthenticationPolicy(options) { + var _a; + const { credential, scopes, challengeCallbacks } = options; + const logger = options.logger || log_js_1.logger; + const callbacks = Object.assign({ authorizeRequest: (_a = challengeCallbacks === null || challengeCallbacks === undefined ? undefined : challengeCallbacks.authorizeRequest) !== null && _a !== undefined ? _a : defaultAuthorizeRequest, authorizeRequestOnChallenge: challengeCallbacks === null || challengeCallbacks === undefined ? undefined : challengeCallbacks.authorizeRequestOnChallenge }, challengeCallbacks); + const getAccessToken = credential ? (0, tokenCycler_js_1.createTokenCycler)(credential) : () => Promise.resolve(null); + return { + name: exports2.bearerTokenAuthenticationPolicyName, + async sendRequest(request, next) { + if (!request.url.toLowerCase().startsWith("https://")) { + throw new Error("Bearer token authentication is not permitted for non-TLS protected (non-https) URLs."); + } + await callbacks.authorizeRequest({ + scopes: Array.isArray(scopes) ? scopes : [scopes], + request, + getAccessToken, + logger + }); + let response; + let error; + try { + response = await next(request); + } catch (err) { + error = err; + response = err.response; + } + if (callbacks.authorizeRequestOnChallenge && (response === null || response === undefined ? undefined : response.status) === 401 && getChallenge(response)) { + const shouldSendRequest = await callbacks.authorizeRequestOnChallenge({ + scopes: Array.isArray(scopes) ? scopes : [scopes], + request, + response, + getAccessToken, + logger + }); + if (shouldSendRequest) { + return next(request); + } + } + if (error) { + throw error; + } else { + return response; + } + } + }; + } +}); + +// node_modules/@azure/core-rest-pipeline/dist/commonjs/policies/ndJsonPolicy.js +var require_ndJsonPolicy = __commonJS((exports2) => { + Object.defineProperty(exports2, "__esModule", { value: true }); + exports2.ndJsonPolicyName = undefined; + exports2.ndJsonPolicy = ndJsonPolicy; + exports2.ndJsonPolicyName = "ndJsonPolicy"; + function ndJsonPolicy() { + return { + name: exports2.ndJsonPolicyName, + async sendRequest(request, next) { + if (typeof request.body === "string" && request.body.startsWith("[")) { + const body = JSON.parse(request.body); + if (Array.isArray(body)) { + request.body = body.map((item) => JSON.stringify(item) + "\n").join(""); + } + } + return next(request); + } + }; + } +}); + +// node_modules/@azure/core-rest-pipeline/dist/commonjs/policies/auxiliaryAuthenticationHeaderPolicy.js +var require_auxiliaryAuthenticationHeaderPolicy = __commonJS((exports2) => { + Object.defineProperty(exports2, "__esModule", { value: true }); + exports2.auxiliaryAuthenticationHeaderPolicyName = undefined; + exports2.auxiliaryAuthenticationHeaderPolicy = auxiliaryAuthenticationHeaderPolicy; + var tokenCycler_js_1 = require_tokenCycler(); + var log_js_1 = require_log2(); + exports2.auxiliaryAuthenticationHeaderPolicyName = "auxiliaryAuthenticationHeaderPolicy"; + var AUTHORIZATION_AUXILIARY_HEADER = "x-ms-authorization-auxiliary"; + async function sendAuthorizeRequest(options) { + var _a, _b; + const { scopes, getAccessToken, request } = options; + const getTokenOptions = { + abortSignal: request.abortSignal, + tracingOptions: request.tracingOptions + }; + return (_b = (_a = await getAccessToken(scopes, getTokenOptions)) === null || _a === undefined ? undefined : _a.token) !== null && _b !== undefined ? _b : ""; + } + function auxiliaryAuthenticationHeaderPolicy(options) { + const { credentials, scopes } = options; + const logger = options.logger || log_js_1.logger; + const tokenCyclerMap = new WeakMap; + return { + name: exports2.auxiliaryAuthenticationHeaderPolicyName, + async sendRequest(request, next) { + if (!request.url.toLowerCase().startsWith("https://")) { + throw new Error("Bearer token authentication for auxiliary header is not permitted for non-TLS protected (non-https) URLs."); + } + if (!credentials || credentials.length === 0) { + logger.info(`${exports2.auxiliaryAuthenticationHeaderPolicyName} header will not be set due to empty credentials.`); + return next(request); + } + const tokenPromises = []; + for (const credential of credentials) { + let getAccessToken = tokenCyclerMap.get(credential); + if (!getAccessToken) { + getAccessToken = (0, tokenCycler_js_1.createTokenCycler)(credential); + tokenCyclerMap.set(credential, getAccessToken); + } + tokenPromises.push(sendAuthorizeRequest({ + scopes: Array.isArray(scopes) ? scopes : [scopes], + request, + getAccessToken, + logger + })); + } + const auxiliaryTokens = (await Promise.all(tokenPromises)).filter((token) => Boolean(token)); + if (auxiliaryTokens.length === 0) { + logger.warning(`None of the auxiliary tokens are valid. ${AUTHORIZATION_AUXILIARY_HEADER} header will not be set.`); + return next(request); + } + request.headers.set(AUTHORIZATION_AUXILIARY_HEADER, auxiliaryTokens.map((token) => `Bearer ${token}`).join(", ")); + return next(request); + } + }; + } +}); + +// node_modules/@azure/core-rest-pipeline/dist/commonjs/index.js +var require_commonjs7 = __commonJS((exports2) => { + Object.defineProperty(exports2, "__esModule", { value: true }); + exports2.createFileFromStream = exports2.createFile = exports2.auxiliaryAuthenticationHeaderPolicyName = exports2.auxiliaryAuthenticationHeaderPolicy = exports2.ndJsonPolicyName = exports2.ndJsonPolicy = exports2.bearerTokenAuthenticationPolicyName = exports2.bearerTokenAuthenticationPolicy = exports2.formDataPolicyName = exports2.formDataPolicy = exports2.tlsPolicyName = exports2.tlsPolicy = exports2.userAgentPolicyName = exports2.userAgentPolicy = exports2.defaultRetryPolicy = exports2.tracingPolicyName = exports2.tracingPolicy = exports2.retryPolicy = exports2.throttlingRetryPolicyName = exports2.throttlingRetryPolicy = exports2.systemErrorRetryPolicyName = exports2.systemErrorRetryPolicy = exports2.redirectPolicyName = exports2.redirectPolicy = exports2.getDefaultProxySettings = exports2.proxyPolicyName = exports2.proxyPolicy = exports2.multipartPolicyName = exports2.multipartPolicy = exports2.logPolicyName = exports2.logPolicy = exports2.setClientRequestIdPolicyName = exports2.setClientRequestIdPolicy = exports2.exponentialRetryPolicyName = exports2.exponentialRetryPolicy = exports2.decompressResponsePolicyName = exports2.decompressResponsePolicy = exports2.isRestError = exports2.RestError = exports2.createPipelineRequest = exports2.createHttpHeaders = exports2.createDefaultHttpClient = exports2.createPipelineFromOptions = exports2.createEmptyPipeline = undefined; + var pipeline_js_1 = require_pipeline(); + Object.defineProperty(exports2, "createEmptyPipeline", { enumerable: true, get: function() { + return pipeline_js_1.createEmptyPipeline; + } }); + var createPipelineFromOptions_js_1 = require_createPipelineFromOptions(); + Object.defineProperty(exports2, "createPipelineFromOptions", { enumerable: true, get: function() { + return createPipelineFromOptions_js_1.createPipelineFromOptions; + } }); + var defaultHttpClient_js_1 = require_defaultHttpClient(); + Object.defineProperty(exports2, "createDefaultHttpClient", { enumerable: true, get: function() { + return defaultHttpClient_js_1.createDefaultHttpClient; + } }); + var httpHeaders_js_1 = require_httpHeaders(); + Object.defineProperty(exports2, "createHttpHeaders", { enumerable: true, get: function() { + return httpHeaders_js_1.createHttpHeaders; + } }); + var pipelineRequest_js_1 = require_pipelineRequest(); + Object.defineProperty(exports2, "createPipelineRequest", { enumerable: true, get: function() { + return pipelineRequest_js_1.createPipelineRequest; + } }); + var restError_js_1 = require_restError(); + Object.defineProperty(exports2, "RestError", { enumerable: true, get: function() { + return restError_js_1.RestError; + } }); + Object.defineProperty(exports2, "isRestError", { enumerable: true, get: function() { + return restError_js_1.isRestError; + } }); + var decompressResponsePolicy_js_1 = require_decompressResponsePolicy(); + Object.defineProperty(exports2, "decompressResponsePolicy", { enumerable: true, get: function() { + return decompressResponsePolicy_js_1.decompressResponsePolicy; + } }); + Object.defineProperty(exports2, "decompressResponsePolicyName", { enumerable: true, get: function() { + return decompressResponsePolicy_js_1.decompressResponsePolicyName; + } }); + var exponentialRetryPolicy_js_1 = require_exponentialRetryPolicy(); + Object.defineProperty(exports2, "exponentialRetryPolicy", { enumerable: true, get: function() { + return exponentialRetryPolicy_js_1.exponentialRetryPolicy; + } }); + Object.defineProperty(exports2, "exponentialRetryPolicyName", { enumerable: true, get: function() { + return exponentialRetryPolicy_js_1.exponentialRetryPolicyName; + } }); + var setClientRequestIdPolicy_js_1 = require_setClientRequestIdPolicy(); + Object.defineProperty(exports2, "setClientRequestIdPolicy", { enumerable: true, get: function() { + return setClientRequestIdPolicy_js_1.setClientRequestIdPolicy; + } }); + Object.defineProperty(exports2, "setClientRequestIdPolicyName", { enumerable: true, get: function() { + return setClientRequestIdPolicy_js_1.setClientRequestIdPolicyName; + } }); + var logPolicy_js_1 = require_logPolicy(); + Object.defineProperty(exports2, "logPolicy", { enumerable: true, get: function() { + return logPolicy_js_1.logPolicy; + } }); + Object.defineProperty(exports2, "logPolicyName", { enumerable: true, get: function() { + return logPolicy_js_1.logPolicyName; + } }); + var multipartPolicy_js_1 = require_multipartPolicy(); + Object.defineProperty(exports2, "multipartPolicy", { enumerable: true, get: function() { + return multipartPolicy_js_1.multipartPolicy; + } }); + Object.defineProperty(exports2, "multipartPolicyName", { enumerable: true, get: function() { + return multipartPolicy_js_1.multipartPolicyName; + } }); + var proxyPolicy_js_1 = require_proxyPolicy(); + Object.defineProperty(exports2, "proxyPolicy", { enumerable: true, get: function() { + return proxyPolicy_js_1.proxyPolicy; + } }); + Object.defineProperty(exports2, "proxyPolicyName", { enumerable: true, get: function() { + return proxyPolicy_js_1.proxyPolicyName; + } }); + Object.defineProperty(exports2, "getDefaultProxySettings", { enumerable: true, get: function() { + return proxyPolicy_js_1.getDefaultProxySettings; + } }); + var redirectPolicy_js_1 = require_redirectPolicy(); + Object.defineProperty(exports2, "redirectPolicy", { enumerable: true, get: function() { + return redirectPolicy_js_1.redirectPolicy; + } }); + Object.defineProperty(exports2, "redirectPolicyName", { enumerable: true, get: function() { + return redirectPolicy_js_1.redirectPolicyName; + } }); + var systemErrorRetryPolicy_js_1 = require_systemErrorRetryPolicy(); + Object.defineProperty(exports2, "systemErrorRetryPolicy", { enumerable: true, get: function() { + return systemErrorRetryPolicy_js_1.systemErrorRetryPolicy; + } }); + Object.defineProperty(exports2, "systemErrorRetryPolicyName", { enumerable: true, get: function() { + return systemErrorRetryPolicy_js_1.systemErrorRetryPolicyName; + } }); + var throttlingRetryPolicy_js_1 = require_throttlingRetryPolicy(); + Object.defineProperty(exports2, "throttlingRetryPolicy", { enumerable: true, get: function() { + return throttlingRetryPolicy_js_1.throttlingRetryPolicy; + } }); + Object.defineProperty(exports2, "throttlingRetryPolicyName", { enumerable: true, get: function() { + return throttlingRetryPolicy_js_1.throttlingRetryPolicyName; + } }); + var retryPolicy_js_1 = require_retryPolicy(); + Object.defineProperty(exports2, "retryPolicy", { enumerable: true, get: function() { + return retryPolicy_js_1.retryPolicy; + } }); + var tracingPolicy_js_1 = require_tracingPolicy(); + Object.defineProperty(exports2, "tracingPolicy", { enumerable: true, get: function() { + return tracingPolicy_js_1.tracingPolicy; + } }); + Object.defineProperty(exports2, "tracingPolicyName", { enumerable: true, get: function() { + return tracingPolicy_js_1.tracingPolicyName; + } }); + var defaultRetryPolicy_js_1 = require_defaultRetryPolicy(); + Object.defineProperty(exports2, "defaultRetryPolicy", { enumerable: true, get: function() { + return defaultRetryPolicy_js_1.defaultRetryPolicy; + } }); + var userAgentPolicy_js_1 = require_userAgentPolicy(); + Object.defineProperty(exports2, "userAgentPolicy", { enumerable: true, get: function() { + return userAgentPolicy_js_1.userAgentPolicy; + } }); + Object.defineProperty(exports2, "userAgentPolicyName", { enumerable: true, get: function() { + return userAgentPolicy_js_1.userAgentPolicyName; + } }); + var tlsPolicy_js_1 = require_tlsPolicy(); + Object.defineProperty(exports2, "tlsPolicy", { enumerable: true, get: function() { + return tlsPolicy_js_1.tlsPolicy; + } }); + Object.defineProperty(exports2, "tlsPolicyName", { enumerable: true, get: function() { + return tlsPolicy_js_1.tlsPolicyName; + } }); + var formDataPolicy_js_1 = require_formDataPolicy(); + Object.defineProperty(exports2, "formDataPolicy", { enumerable: true, get: function() { + return formDataPolicy_js_1.formDataPolicy; + } }); + Object.defineProperty(exports2, "formDataPolicyName", { enumerable: true, get: function() { + return formDataPolicy_js_1.formDataPolicyName; + } }); + var bearerTokenAuthenticationPolicy_js_1 = require_bearerTokenAuthenticationPolicy(); + Object.defineProperty(exports2, "bearerTokenAuthenticationPolicy", { enumerable: true, get: function() { + return bearerTokenAuthenticationPolicy_js_1.bearerTokenAuthenticationPolicy; + } }); + Object.defineProperty(exports2, "bearerTokenAuthenticationPolicyName", { enumerable: true, get: function() { + return bearerTokenAuthenticationPolicy_js_1.bearerTokenAuthenticationPolicyName; + } }); + var ndJsonPolicy_js_1 = require_ndJsonPolicy(); + Object.defineProperty(exports2, "ndJsonPolicy", { enumerable: true, get: function() { + return ndJsonPolicy_js_1.ndJsonPolicy; + } }); + Object.defineProperty(exports2, "ndJsonPolicyName", { enumerable: true, get: function() { + return ndJsonPolicy_js_1.ndJsonPolicyName; + } }); + var auxiliaryAuthenticationHeaderPolicy_js_1 = require_auxiliaryAuthenticationHeaderPolicy(); + Object.defineProperty(exports2, "auxiliaryAuthenticationHeaderPolicy", { enumerable: true, get: function() { + return auxiliaryAuthenticationHeaderPolicy_js_1.auxiliaryAuthenticationHeaderPolicy; + } }); + Object.defineProperty(exports2, "auxiliaryAuthenticationHeaderPolicyName", { enumerable: true, get: function() { + return auxiliaryAuthenticationHeaderPolicy_js_1.auxiliaryAuthenticationHeaderPolicyName; + } }); + var file_js_1 = require_file2(); + Object.defineProperty(exports2, "createFile", { enumerable: true, get: function() { + return file_js_1.createFile; + } }); + Object.defineProperty(exports2, "createFileFromStream", { enumerable: true, get: function() { + return file_js_1.createFileFromStream; + } }); +}); + +// node_modules/@azure/core-auth/dist/commonjs/azureKeyCredential.js +var require_azureKeyCredential = __commonJS((exports2) => { + Object.defineProperty(exports2, "__esModule", { value: true }); + exports2.AzureKeyCredential = undefined; + + class AzureKeyCredential { + get key() { + return this._key; + } + constructor(key) { + if (!key) { + throw new Error("key must be a non-empty string"); + } + this._key = key; + } + update(newKey) { + this._key = newKey; + } + } + exports2.AzureKeyCredential = AzureKeyCredential; +}); + +// node_modules/@azure/core-auth/dist/commonjs/keyCredential.js +var require_keyCredential = __commonJS((exports2) => { + Object.defineProperty(exports2, "__esModule", { value: true }); + exports2.isKeyCredential = isKeyCredential; + var core_util_1 = require_commonjs5(); + function isKeyCredential(credential) { + return (0, core_util_1.isObjectWithProperties)(credential, ["key"]) && typeof credential.key === "string"; + } +}); + +// node_modules/@azure/core-auth/dist/commonjs/azureNamedKeyCredential.js +var require_azureNamedKeyCredential = __commonJS((exports2) => { + Object.defineProperty(exports2, "__esModule", { value: true }); + exports2.AzureNamedKeyCredential = undefined; + exports2.isNamedKeyCredential = isNamedKeyCredential; + var core_util_1 = require_commonjs5(); + + class AzureNamedKeyCredential { + get key() { + return this._key; + } + get name() { + return this._name; + } + constructor(name, key) { + if (!name || !key) { + throw new TypeError("name and key must be non-empty strings"); + } + this._name = name; + this._key = key; + } + update(newName, newKey) { + if (!newName || !newKey) { + throw new TypeError("newName and newKey must be non-empty strings"); + } + this._name = newName; + this._key = newKey; + } + } + exports2.AzureNamedKeyCredential = AzureNamedKeyCredential; + function isNamedKeyCredential(credential) { + return (0, core_util_1.isObjectWithProperties)(credential, ["name", "key"]) && typeof credential.key === "string" && typeof credential.name === "string"; + } +}); + +// node_modules/@azure/core-auth/dist/commonjs/azureSASCredential.js +var require_azureSASCredential = __commonJS((exports2) => { + Object.defineProperty(exports2, "__esModule", { value: true }); + exports2.AzureSASCredential = undefined; + exports2.isSASCredential = isSASCredential; + var core_util_1 = require_commonjs5(); + + class AzureSASCredential { + get signature() { + return this._signature; + } + constructor(signature) { + if (!signature) { + throw new Error("shared access signature must be a non-empty string"); + } + this._signature = signature; + } + update(newSignature) { + if (!newSignature) { + throw new Error("shared access signature must be a non-empty string"); + } + this._signature = newSignature; + } + } + exports2.AzureSASCredential = AzureSASCredential; + function isSASCredential(credential) { + return (0, core_util_1.isObjectWithProperties)(credential, ["signature"]) && typeof credential.signature === "string"; + } +}); + +// node_modules/@azure/core-auth/dist/commonjs/tokenCredential.js +var require_tokenCredential = __commonJS((exports2) => { + Object.defineProperty(exports2, "__esModule", { value: true }); + exports2.isBearerToken = isBearerToken; + exports2.isPopToken = isPopToken; + exports2.isTokenCredential = isTokenCredential; + function isBearerToken(accessToken) { + return !accessToken.tokenType || accessToken.tokenType === "Bearer"; + } + function isPopToken(accessToken) { + return accessToken.tokenType === "pop"; + } + function isTokenCredential(credential) { + const castCredential = credential; + return castCredential && typeof castCredential.getToken === "function" && (castCredential.signRequest === undefined || castCredential.getToken.length > 0); + } +}); + +// node_modules/@azure/core-auth/dist/commonjs/index.js +var require_commonjs8 = __commonJS((exports2) => { + Object.defineProperty(exports2, "__esModule", { value: true }); + exports2.isTokenCredential = exports2.isSASCredential = exports2.AzureSASCredential = exports2.isNamedKeyCredential = exports2.AzureNamedKeyCredential = exports2.isKeyCredential = exports2.AzureKeyCredential = undefined; + var azureKeyCredential_js_1 = require_azureKeyCredential(); + Object.defineProperty(exports2, "AzureKeyCredential", { enumerable: true, get: function() { + return azureKeyCredential_js_1.AzureKeyCredential; + } }); + var keyCredential_js_1 = require_keyCredential(); + Object.defineProperty(exports2, "isKeyCredential", { enumerable: true, get: function() { + return keyCredential_js_1.isKeyCredential; + } }); + var azureNamedKeyCredential_js_1 = require_azureNamedKeyCredential(); + Object.defineProperty(exports2, "AzureNamedKeyCredential", { enumerable: true, get: function() { + return azureNamedKeyCredential_js_1.AzureNamedKeyCredential; + } }); + Object.defineProperty(exports2, "isNamedKeyCredential", { enumerable: true, get: function() { + return azureNamedKeyCredential_js_1.isNamedKeyCredential; + } }); + var azureSASCredential_js_1 = require_azureSASCredential(); + Object.defineProperty(exports2, "AzureSASCredential", { enumerable: true, get: function() { + return azureSASCredential_js_1.AzureSASCredential; + } }); + Object.defineProperty(exports2, "isSASCredential", { enumerable: true, get: function() { + return azureSASCredential_js_1.isSASCredential; + } }); + var tokenCredential_js_1 = require_tokenCredential(); + Object.defineProperty(exports2, "isTokenCredential", { enumerable: true, get: function() { + return tokenCredential_js_1.isTokenCredential; + } }); +}); + +// node_modules/@azure/core-http-compat/dist/commonjs/policies/disableKeepAlivePolicy.js +var require_disableKeepAlivePolicy = __commonJS((exports2) => { + Object.defineProperty(exports2, "__esModule", { value: true }); + exports2.pipelineContainsDisableKeepAlivePolicy = exports2.createDisableKeepAlivePolicy = exports2.disableKeepAlivePolicyName = undefined; + exports2.disableKeepAlivePolicyName = "DisableKeepAlivePolicy"; + function createDisableKeepAlivePolicy() { + return { + name: exports2.disableKeepAlivePolicyName, + async sendRequest(request, next) { + request.disableKeepAlive = true; + return next(request); + } + }; + } + exports2.createDisableKeepAlivePolicy = createDisableKeepAlivePolicy; + function pipelineContainsDisableKeepAlivePolicy(pipeline) { + return pipeline.getOrderedPolicies().some((policy) => policy.name === exports2.disableKeepAlivePolicyName); + } + exports2.pipelineContainsDisableKeepAlivePolicy = pipelineContainsDisableKeepAlivePolicy; +}); + +// node_modules/@azure/core-client/dist/commonjs/base64.js +var require_base642 = __commonJS((exports2) => { + Object.defineProperty(exports2, "__esModule", { value: true }); + exports2.decodeStringToString = exports2.decodeString = exports2.encodeByteArray = exports2.encodeString = undefined; + function encodeString(value) { + return Buffer.from(value).toString("base64"); + } + exports2.encodeString = encodeString; + function encodeByteArray(value) { + const bufferValue = value instanceof Buffer ? value : Buffer.from(value.buffer); + return bufferValue.toString("base64"); + } + exports2.encodeByteArray = encodeByteArray; + function decodeString(value) { + return Buffer.from(value, "base64"); + } + exports2.decodeString = decodeString; + function decodeStringToString(value) { + return Buffer.from(value, "base64").toString(); + } + exports2.decodeStringToString = decodeStringToString; +}); + +// node_modules/@azure/core-client/dist/commonjs/interfaces.js +var require_interfaces = __commonJS((exports2) => { + Object.defineProperty(exports2, "__esModule", { value: true }); + exports2.XML_CHARKEY = exports2.XML_ATTRKEY = undefined; + exports2.XML_ATTRKEY = "$"; + exports2.XML_CHARKEY = "_"; +}); + +// node_modules/@azure/core-client/dist/commonjs/utils.js +var require_utils5 = __commonJS((exports2) => { + Object.defineProperty(exports2, "__esModule", { value: true }); + exports2.flattenResponse = exports2.isValidUuid = exports2.isDuration = exports2.isPrimitiveBody = undefined; + function isPrimitiveBody(value, mapperTypeName) { + return mapperTypeName !== "Composite" && mapperTypeName !== "Dictionary" && (typeof value === "string" || typeof value === "number" || typeof value === "boolean" || (mapperTypeName === null || mapperTypeName === undefined ? undefined : mapperTypeName.match(/^(Date|DateTime|DateTimeRfc1123|UnixTime|ByteArray|Base64Url)$/i)) !== null || value === undefined || value === null); + } + exports2.isPrimitiveBody = isPrimitiveBody; + var validateISODuration = /^(-|\+)?P(?:([-+]?[0-9,.]*)Y)?(?:([-+]?[0-9,.]*)M)?(?:([-+]?[0-9,.]*)W)?(?:([-+]?[0-9,.]*)D)?(?:T(?:([-+]?[0-9,.]*)H)?(?:([-+]?[0-9,.]*)M)?(?:([-+]?[0-9,.]*)S)?)?$/; + function isDuration(value) { + return validateISODuration.test(value); + } + exports2.isDuration = isDuration; + var validUuidRegex = /^[0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12}$/i; + function isValidUuid(uuid) { + return validUuidRegex.test(uuid); + } + exports2.isValidUuid = isValidUuid; + function handleNullableResponseAndWrappableBody(responseObject) { + const combinedHeadersAndBody = Object.assign(Object.assign({}, responseObject.headers), responseObject.body); + if (responseObject.hasNullableType && Object.getOwnPropertyNames(combinedHeadersAndBody).length === 0) { + return responseObject.shouldWrapBody ? { body: null } : null; + } else { + return responseObject.shouldWrapBody ? Object.assign(Object.assign({}, responseObject.headers), { body: responseObject.body }) : combinedHeadersAndBody; + } + } + function flattenResponse(fullResponse, responseSpec) { + var _a, _b; + const parsedHeaders = fullResponse.parsedHeaders; + if (fullResponse.request.method === "HEAD") { + return Object.assign(Object.assign({}, parsedHeaders), { body: fullResponse.parsedBody }); + } + const bodyMapper = responseSpec && responseSpec.bodyMapper; + const isNullable = Boolean(bodyMapper === null || bodyMapper === undefined ? undefined : bodyMapper.nullable); + const expectedBodyTypeName = bodyMapper === null || bodyMapper === undefined ? undefined : bodyMapper.type.name; + if (expectedBodyTypeName === "Stream") { + return Object.assign(Object.assign({}, parsedHeaders), { blobBody: fullResponse.blobBody, readableStreamBody: fullResponse.readableStreamBody }); + } + const modelProperties = expectedBodyTypeName === "Composite" && bodyMapper.type.modelProperties || {}; + const isPageableResponse = Object.keys(modelProperties).some((k) => modelProperties[k].serializedName === ""); + if (expectedBodyTypeName === "Sequence" || isPageableResponse) { + const arrayResponse = (_a = fullResponse.parsedBody) !== null && _a !== undefined ? _a : []; + for (const key of Object.keys(modelProperties)) { + if (modelProperties[key].serializedName) { + arrayResponse[key] = (_b = fullResponse.parsedBody) === null || _b === undefined ? undefined : _b[key]; + } + } + if (parsedHeaders) { + for (const key of Object.keys(parsedHeaders)) { + arrayResponse[key] = parsedHeaders[key]; + } + } + return isNullable && !fullResponse.parsedBody && !parsedHeaders && Object.getOwnPropertyNames(modelProperties).length === 0 ? null : arrayResponse; + } + return handleNullableResponseAndWrappableBody({ + body: fullResponse.parsedBody, + headers: parsedHeaders, + hasNullableType: isNullable, + shouldWrapBody: isPrimitiveBody(fullResponse.parsedBody, expectedBodyTypeName) + }); + } + exports2.flattenResponse = flattenResponse; +}); + +// node_modules/@azure/core-client/dist/commonjs/serializer.js +var require_serializer = __commonJS((exports2) => { + Object.defineProperty(exports2, "__esModule", { value: true }); + exports2.MapperTypeNames = exports2.createSerializer = undefined; + var tslib_1 = require_tslib(); + var base64 = tslib_1.__importStar(require_base642()); + var interfaces_js_1 = require_interfaces(); + var utils_js_1 = require_utils5(); + + class SerializerImpl { + constructor(modelMappers = {}, isXML = false) { + this.modelMappers = modelMappers; + this.isXML = isXML; + } + validateConstraints(mapper, value, objectName) { + const failValidation = (constraintName, constraintValue) => { + throw new Error(`"${objectName}" with value "${value}" should satisfy the constraint "${constraintName}": ${constraintValue}.`); + }; + if (mapper.constraints && value !== undefined && value !== null) { + const { ExclusiveMaximum, ExclusiveMinimum, InclusiveMaximum, InclusiveMinimum, MaxItems, MaxLength, MinItems, MinLength, MultipleOf, Pattern, UniqueItems } = mapper.constraints; + if (ExclusiveMaximum !== undefined && value >= ExclusiveMaximum) { + failValidation("ExclusiveMaximum", ExclusiveMaximum); + } + if (ExclusiveMinimum !== undefined && value <= ExclusiveMinimum) { + failValidation("ExclusiveMinimum", ExclusiveMinimum); + } + if (InclusiveMaximum !== undefined && value > InclusiveMaximum) { + failValidation("InclusiveMaximum", InclusiveMaximum); + } + if (InclusiveMinimum !== undefined && value < InclusiveMinimum) { + failValidation("InclusiveMinimum", InclusiveMinimum); + } + if (MaxItems !== undefined && value.length > MaxItems) { + failValidation("MaxItems", MaxItems); + } + if (MaxLength !== undefined && value.length > MaxLength) { + failValidation("MaxLength", MaxLength); + } + if (MinItems !== undefined && value.length < MinItems) { + failValidation("MinItems", MinItems); + } + if (MinLength !== undefined && value.length < MinLength) { + failValidation("MinLength", MinLength); + } + if (MultipleOf !== undefined && value % MultipleOf !== 0) { + failValidation("MultipleOf", MultipleOf); + } + if (Pattern) { + const pattern = typeof Pattern === "string" ? new RegExp(Pattern) : Pattern; + if (typeof value !== "string" || value.match(pattern) === null) { + failValidation("Pattern", Pattern); + } + } + if (UniqueItems && value.some((item, i, ar) => ar.indexOf(item) !== i)) { + failValidation("UniqueItems", UniqueItems); + } + } + } + serialize(mapper, object, objectName, options = { xml: {} }) { + var _a, _b, _c; + const updatedOptions = { + xml: { + rootName: (_a = options.xml.rootName) !== null && _a !== undefined ? _a : "", + includeRoot: (_b = options.xml.includeRoot) !== null && _b !== undefined ? _b : false, + xmlCharKey: (_c = options.xml.xmlCharKey) !== null && _c !== undefined ? _c : interfaces_js_1.XML_CHARKEY + } + }; + let payload = {}; + const mapperType = mapper.type.name; + if (!objectName) { + objectName = mapper.serializedName; + } + if (mapperType.match(/^Sequence$/i) !== null) { + payload = []; + } + if (mapper.isConstant) { + object = mapper.defaultValue; + } + const { required, nullable } = mapper; + if (required && nullable && object === undefined) { + throw new Error(`${objectName} cannot be undefined.`); + } + if (required && !nullable && (object === undefined || object === null)) { + throw new Error(`${objectName} cannot be null or undefined.`); + } + if (!required && nullable === false && object === null) { + throw new Error(`${objectName} cannot be null.`); + } + if (object === undefined || object === null) { + payload = object; + } else { + if (mapperType.match(/^any$/i) !== null) { + payload = object; + } else if (mapperType.match(/^(Number|String|Boolean|Object|Stream|Uuid)$/i) !== null) { + payload = serializeBasicTypes(mapperType, objectName, object); + } else if (mapperType.match(/^Enum$/i) !== null) { + const enumMapper = mapper; + payload = serializeEnumType(objectName, enumMapper.type.allowedValues, object); + } else if (mapperType.match(/^(Date|DateTime|TimeSpan|DateTimeRfc1123|UnixTime)$/i) !== null) { + payload = serializeDateTypes(mapperType, object, objectName); + } else if (mapperType.match(/^ByteArray$/i) !== null) { + payload = serializeByteArrayType(objectName, object); + } else if (mapperType.match(/^Base64Url$/i) !== null) { + payload = serializeBase64UrlType(objectName, object); + } else if (mapperType.match(/^Sequence$/i) !== null) { + payload = serializeSequenceType(this, mapper, object, objectName, Boolean(this.isXML), updatedOptions); + } else if (mapperType.match(/^Dictionary$/i) !== null) { + payload = serializeDictionaryType(this, mapper, object, objectName, Boolean(this.isXML), updatedOptions); + } else if (mapperType.match(/^Composite$/i) !== null) { + payload = serializeCompositeType(this, mapper, object, objectName, Boolean(this.isXML), updatedOptions); + } + } + return payload; + } + deserialize(mapper, responseBody, objectName, options = { xml: {} }) { + var _a, _b, _c, _d; + const updatedOptions = { + xml: { + rootName: (_a = options.xml.rootName) !== null && _a !== undefined ? _a : "", + includeRoot: (_b = options.xml.includeRoot) !== null && _b !== undefined ? _b : false, + xmlCharKey: (_c = options.xml.xmlCharKey) !== null && _c !== undefined ? _c : interfaces_js_1.XML_CHARKEY + }, + ignoreUnknownProperties: (_d = options.ignoreUnknownProperties) !== null && _d !== undefined ? _d : false + }; + if (responseBody === undefined || responseBody === null) { + if (this.isXML && mapper.type.name === "Sequence" && !mapper.xmlIsWrapped) { + responseBody = []; + } + if (mapper.defaultValue !== undefined) { + responseBody = mapper.defaultValue; + } + return responseBody; + } + let payload; + const mapperType = mapper.type.name; + if (!objectName) { + objectName = mapper.serializedName; + } + if (mapperType.match(/^Composite$/i) !== null) { + payload = deserializeCompositeType(this, mapper, responseBody, objectName, updatedOptions); + } else { + if (this.isXML) { + const xmlCharKey = updatedOptions.xml.xmlCharKey; + if (responseBody[interfaces_js_1.XML_ATTRKEY] !== undefined && responseBody[xmlCharKey] !== undefined) { + responseBody = responseBody[xmlCharKey]; + } + } + if (mapperType.match(/^Number$/i) !== null) { + payload = parseFloat(responseBody); + if (isNaN(payload)) { + payload = responseBody; + } + } else if (mapperType.match(/^Boolean$/i) !== null) { + if (responseBody === "true") { + payload = true; + } else if (responseBody === "false") { + payload = false; + } else { + payload = responseBody; + } + } else if (mapperType.match(/^(String|Enum|Object|Stream|Uuid|TimeSpan|any)$/i) !== null) { + payload = responseBody; + } else if (mapperType.match(/^(Date|DateTime|DateTimeRfc1123)$/i) !== null) { + payload = new Date(responseBody); + } else if (mapperType.match(/^UnixTime$/i) !== null) { + payload = unixTimeToDate(responseBody); + } else if (mapperType.match(/^ByteArray$/i) !== null) { + payload = base64.decodeString(responseBody); + } else if (mapperType.match(/^Base64Url$/i) !== null) { + payload = base64UrlToByteArray(responseBody); + } else if (mapperType.match(/^Sequence$/i) !== null) { + payload = deserializeSequenceType(this, mapper, responseBody, objectName, updatedOptions); + } else if (mapperType.match(/^Dictionary$/i) !== null) { + payload = deserializeDictionaryType(this, mapper, responseBody, objectName, updatedOptions); + } + } + if (mapper.isConstant) { + payload = mapper.defaultValue; + } + return payload; + } + } + function createSerializer(modelMappers = {}, isXML = false) { + return new SerializerImpl(modelMappers, isXML); + } + exports2.createSerializer = createSerializer; + function trimEnd(str, ch) { + let len = str.length; + while (len - 1 >= 0 && str[len - 1] === ch) { + --len; + } + return str.substr(0, len); + } + function bufferToBase64Url(buffer) { + if (!buffer) { + return; + } + if (!(buffer instanceof Uint8Array)) { + throw new Error(`Please provide an input of type Uint8Array for converting to Base64Url.`); + } + const str = base64.encodeByteArray(buffer); + return trimEnd(str, "=").replace(/\+/g, "-").replace(/\//g, "_"); + } + function base64UrlToByteArray(str) { + if (!str) { + return; + } + if (str && typeof str.valueOf() !== "string") { + throw new Error("Please provide an input of type string for converting to Uint8Array"); + } + str = str.replace(/-/g, "+").replace(/_/g, "/"); + return base64.decodeString(str); + } + function splitSerializeName(prop) { + const classes = []; + let partialclass = ""; + if (prop) { + const subwords = prop.split("."); + for (const item of subwords) { + if (item.charAt(item.length - 1) === "\\") { + partialclass += item.substr(0, item.length - 1) + "."; + } else { + partialclass += item; + classes.push(partialclass); + partialclass = ""; + } + } + } + return classes; + } + function dateToUnixTime(d) { + if (!d) { + return; + } + if (typeof d.valueOf() === "string") { + d = new Date(d); + } + return Math.floor(d.getTime() / 1000); + } + function unixTimeToDate(n) { + if (!n) { + return; + } + return new Date(n * 1000); + } + function serializeBasicTypes(typeName, objectName, value) { + if (value !== null && value !== undefined) { + if (typeName.match(/^Number$/i) !== null) { + if (typeof value !== "number") { + throw new Error(`${objectName} with value ${value} must be of type number.`); + } + } else if (typeName.match(/^String$/i) !== null) { + if (typeof value.valueOf() !== "string") { + throw new Error(`${objectName} with value "${value}" must be of type string.`); + } + } else if (typeName.match(/^Uuid$/i) !== null) { + if (!(typeof value.valueOf() === "string" && (0, utils_js_1.isValidUuid)(value))) { + throw new Error(`${objectName} with value "${value}" must be of type string and a valid uuid.`); + } + } else if (typeName.match(/^Boolean$/i) !== null) { + if (typeof value !== "boolean") { + throw new Error(`${objectName} with value ${value} must be of type boolean.`); + } + } else if (typeName.match(/^Stream$/i) !== null) { + const objectType = typeof value; + if (objectType !== "string" && typeof value.pipe !== "function" && typeof value.tee !== "function" && !(value instanceof ArrayBuffer) && !ArrayBuffer.isView(value) && !((typeof Blob === "function" || typeof Blob === "object") && value instanceof Blob) && objectType !== "function") { + throw new Error(`${objectName} must be a string, Blob, ArrayBuffer, ArrayBufferView, ReadableStream, or () => ReadableStream.`); + } + } + } + return value; + } + function serializeEnumType(objectName, allowedValues, value) { + if (!allowedValues) { + throw new Error(`Please provide a set of allowedValues to validate ${objectName} as an Enum Type.`); + } + const isPresent = allowedValues.some((item) => { + if (typeof item.valueOf() === "string") { + return item.toLowerCase() === value.toLowerCase(); + } + return item === value; + }); + if (!isPresent) { + throw new Error(`${value} is not a valid value for ${objectName}. The valid values are: ${JSON.stringify(allowedValues)}.`); + } + return value; + } + function serializeByteArrayType(objectName, value) { + if (value !== undefined && value !== null) { + if (!(value instanceof Uint8Array)) { + throw new Error(`${objectName} must be of type Uint8Array.`); + } + value = base64.encodeByteArray(value); + } + return value; + } + function serializeBase64UrlType(objectName, value) { + if (value !== undefined && value !== null) { + if (!(value instanceof Uint8Array)) { + throw new Error(`${objectName} must be of type Uint8Array.`); + } + value = bufferToBase64Url(value); + } + return value; + } + function serializeDateTypes(typeName, value, objectName) { + if (value !== undefined && value !== null) { + if (typeName.match(/^Date$/i) !== null) { + if (!(value instanceof Date || typeof value.valueOf() === "string" && !isNaN(Date.parse(value)))) { + throw new Error(`${objectName} must be an instanceof Date or a string in ISO8601 format.`); + } + value = value instanceof Date ? value.toISOString().substring(0, 10) : new Date(value).toISOString().substring(0, 10); + } else if (typeName.match(/^DateTime$/i) !== null) { + if (!(value instanceof Date || typeof value.valueOf() === "string" && !isNaN(Date.parse(value)))) { + throw new Error(`${objectName} must be an instanceof Date or a string in ISO8601 format.`); + } + value = value instanceof Date ? value.toISOString() : new Date(value).toISOString(); + } else if (typeName.match(/^DateTimeRfc1123$/i) !== null) { + if (!(value instanceof Date || typeof value.valueOf() === "string" && !isNaN(Date.parse(value)))) { + throw new Error(`${objectName} must be an instanceof Date or a string in RFC-1123 format.`); + } + value = value instanceof Date ? value.toUTCString() : new Date(value).toUTCString(); + } else if (typeName.match(/^UnixTime$/i) !== null) { + if (!(value instanceof Date || typeof value.valueOf() === "string" && !isNaN(Date.parse(value)))) { + throw new Error(`${objectName} must be an instanceof Date or a string in RFC-1123/ISO8601 format ` + `for it to be serialized in UnixTime/Epoch format.`); + } + value = dateToUnixTime(value); + } else if (typeName.match(/^TimeSpan$/i) !== null) { + if (!(0, utils_js_1.isDuration)(value)) { + throw new Error(`${objectName} must be a string in ISO 8601 format. Instead was "${value}".`); + } + } + } + return value; + } + function serializeSequenceType(serializer, mapper, object, objectName, isXml, options) { + var _a; + if (!Array.isArray(object)) { + throw new Error(`${objectName} must be of type Array.`); + } + let elementType = mapper.type.element; + if (!elementType || typeof elementType !== "object") { + throw new Error(`element" metadata for an Array must be defined in the ` + `mapper and it must of type "object" in ${objectName}.`); + } + if (elementType.type.name === "Composite" && elementType.type.className) { + elementType = (_a = serializer.modelMappers[elementType.type.className]) !== null && _a !== undefined ? _a : elementType; + } + const tempArray = []; + for (let i = 0;i < object.length; i++) { + const serializedValue = serializer.serialize(elementType, object[i], objectName, options); + if (isXml && elementType.xmlNamespace) { + const xmlnsKey = elementType.xmlNamespacePrefix ? `xmlns:${elementType.xmlNamespacePrefix}` : "xmlns"; + if (elementType.type.name === "Composite") { + tempArray[i] = Object.assign({}, serializedValue); + tempArray[i][interfaces_js_1.XML_ATTRKEY] = { [xmlnsKey]: elementType.xmlNamespace }; + } else { + tempArray[i] = {}; + tempArray[i][options.xml.xmlCharKey] = serializedValue; + tempArray[i][interfaces_js_1.XML_ATTRKEY] = { [xmlnsKey]: elementType.xmlNamespace }; + } + } else { + tempArray[i] = serializedValue; + } + } + return tempArray; + } + function serializeDictionaryType(serializer, mapper, object, objectName, isXml, options) { + if (typeof object !== "object") { + throw new Error(`${objectName} must be of type object.`); + } + const valueType = mapper.type.value; + if (!valueType || typeof valueType !== "object") { + throw new Error(`"value" metadata for a Dictionary must be defined in the ` + `mapper and it must of type "object" in ${objectName}.`); + } + const tempDictionary = {}; + for (const key of Object.keys(object)) { + const serializedValue = serializer.serialize(valueType, object[key], objectName, options); + tempDictionary[key] = getXmlObjectValue(valueType, serializedValue, isXml, options); + } + if (isXml && mapper.xmlNamespace) { + const xmlnsKey = mapper.xmlNamespacePrefix ? `xmlns:${mapper.xmlNamespacePrefix}` : "xmlns"; + const result = tempDictionary; + result[interfaces_js_1.XML_ATTRKEY] = { [xmlnsKey]: mapper.xmlNamespace }; + return result; + } + return tempDictionary; + } + function resolveAdditionalProperties(serializer, mapper, objectName) { + const additionalProperties = mapper.type.additionalProperties; + if (!additionalProperties && mapper.type.className) { + const modelMapper = resolveReferencedMapper(serializer, mapper, objectName); + return modelMapper === null || modelMapper === undefined ? undefined : modelMapper.type.additionalProperties; + } + return additionalProperties; + } + function resolveReferencedMapper(serializer, mapper, objectName) { + const className = mapper.type.className; + if (!className) { + throw new Error(`Class name for model "${objectName}" is not provided in the mapper "${JSON.stringify(mapper, undefined, 2)}".`); + } + return serializer.modelMappers[className]; + } + function resolveModelProperties(serializer, mapper, objectName) { + let modelProps = mapper.type.modelProperties; + if (!modelProps) { + const modelMapper = resolveReferencedMapper(serializer, mapper, objectName); + if (!modelMapper) { + throw new Error(`mapper() cannot be null or undefined for model "${mapper.type.className}".`); + } + modelProps = modelMapper === null || modelMapper === undefined ? undefined : modelMapper.type.modelProperties; + if (!modelProps) { + throw new Error(`modelProperties cannot be null or undefined in the ` + `mapper "${JSON.stringify(modelMapper)}" of type "${mapper.type.className}" for object "${objectName}".`); + } + } + return modelProps; + } + function serializeCompositeType(serializer, mapper, object, objectName, isXml, options) { + if (getPolymorphicDiscriminatorRecursively(serializer, mapper)) { + mapper = getPolymorphicMapper(serializer, mapper, object, "clientName"); + } + if (object !== undefined && object !== null) { + const payload = {}; + const modelProps = resolveModelProperties(serializer, mapper, objectName); + for (const key of Object.keys(modelProps)) { + const propertyMapper = modelProps[key]; + if (propertyMapper.readOnly) { + continue; + } + let propName; + let parentObject = payload; + if (serializer.isXML) { + if (propertyMapper.xmlIsWrapped) { + propName = propertyMapper.xmlName; + } else { + propName = propertyMapper.xmlElementName || propertyMapper.xmlName; + } + } else { + const paths = splitSerializeName(propertyMapper.serializedName); + propName = paths.pop(); + for (const pathName of paths) { + const childObject = parentObject[pathName]; + if ((childObject === undefined || childObject === null) && (object[key] !== undefined && object[key] !== null || propertyMapper.defaultValue !== undefined)) { + parentObject[pathName] = {}; + } + parentObject = parentObject[pathName]; + } + } + if (parentObject !== undefined && parentObject !== null) { + if (isXml && mapper.xmlNamespace) { + const xmlnsKey = mapper.xmlNamespacePrefix ? `xmlns:${mapper.xmlNamespacePrefix}` : "xmlns"; + parentObject[interfaces_js_1.XML_ATTRKEY] = Object.assign(Object.assign({}, parentObject[interfaces_js_1.XML_ATTRKEY]), { [xmlnsKey]: mapper.xmlNamespace }); + } + const propertyObjectName = propertyMapper.serializedName !== "" ? objectName + "." + propertyMapper.serializedName : objectName; + let toSerialize = object[key]; + const polymorphicDiscriminator = getPolymorphicDiscriminatorRecursively(serializer, mapper); + if (polymorphicDiscriminator && polymorphicDiscriminator.clientName === key && (toSerialize === undefined || toSerialize === null)) { + toSerialize = mapper.serializedName; + } + const serializedValue = serializer.serialize(propertyMapper, toSerialize, propertyObjectName, options); + if (serializedValue !== undefined && propName !== undefined && propName !== null) { + const value = getXmlObjectValue(propertyMapper, serializedValue, isXml, options); + if (isXml && propertyMapper.xmlIsAttribute) { + parentObject[interfaces_js_1.XML_ATTRKEY] = parentObject[interfaces_js_1.XML_ATTRKEY] || {}; + parentObject[interfaces_js_1.XML_ATTRKEY][propName] = serializedValue; + } else if (isXml && propertyMapper.xmlIsWrapped) { + parentObject[propName] = { [propertyMapper.xmlElementName]: value }; + } else { + parentObject[propName] = value; + } + } + } + } + const additionalPropertiesMapper = resolveAdditionalProperties(serializer, mapper, objectName); + if (additionalPropertiesMapper) { + const propNames = Object.keys(modelProps); + for (const clientPropName in object) { + const isAdditionalProperty = propNames.every((pn) => pn !== clientPropName); + if (isAdditionalProperty) { + payload[clientPropName] = serializer.serialize(additionalPropertiesMapper, object[clientPropName], objectName + '["' + clientPropName + '"]', options); + } + } + } + return payload; + } + return object; + } + function getXmlObjectValue(propertyMapper, serializedValue, isXml, options) { + if (!isXml || !propertyMapper.xmlNamespace) { + return serializedValue; + } + const xmlnsKey = propertyMapper.xmlNamespacePrefix ? `xmlns:${propertyMapper.xmlNamespacePrefix}` : "xmlns"; + const xmlNamespace = { [xmlnsKey]: propertyMapper.xmlNamespace }; + if (["Composite"].includes(propertyMapper.type.name)) { + if (serializedValue[interfaces_js_1.XML_ATTRKEY]) { + return serializedValue; + } else { + const result2 = Object.assign({}, serializedValue); + result2[interfaces_js_1.XML_ATTRKEY] = xmlNamespace; + return result2; + } + } + const result = {}; + result[options.xml.xmlCharKey] = serializedValue; + result[interfaces_js_1.XML_ATTRKEY] = xmlNamespace; + return result; + } + function isSpecialXmlProperty(propertyName, options) { + return [interfaces_js_1.XML_ATTRKEY, options.xml.xmlCharKey].includes(propertyName); + } + function deserializeCompositeType(serializer, mapper, responseBody, objectName, options) { + var _a, _b; + const xmlCharKey = (_a = options.xml.xmlCharKey) !== null && _a !== undefined ? _a : interfaces_js_1.XML_CHARKEY; + if (getPolymorphicDiscriminatorRecursively(serializer, mapper)) { + mapper = getPolymorphicMapper(serializer, mapper, responseBody, "serializedName"); + } + const modelProps = resolveModelProperties(serializer, mapper, objectName); + let instance = {}; + const handledPropertyNames = []; + for (const key of Object.keys(modelProps)) { + const propertyMapper = modelProps[key]; + const paths = splitSerializeName(modelProps[key].serializedName); + handledPropertyNames.push(paths[0]); + const { serializedName, xmlName, xmlElementName } = propertyMapper; + let propertyObjectName = objectName; + if (serializedName !== "" && serializedName !== undefined) { + propertyObjectName = objectName + "." + serializedName; + } + const headerCollectionPrefix = propertyMapper.headerCollectionPrefix; + if (headerCollectionPrefix) { + const dictionary = {}; + for (const headerKey of Object.keys(responseBody)) { + if (headerKey.startsWith(headerCollectionPrefix)) { + dictionary[headerKey.substring(headerCollectionPrefix.length)] = serializer.deserialize(propertyMapper.type.value, responseBody[headerKey], propertyObjectName, options); + } + handledPropertyNames.push(headerKey); + } + instance[key] = dictionary; + } else if (serializer.isXML) { + if (propertyMapper.xmlIsAttribute && responseBody[interfaces_js_1.XML_ATTRKEY]) { + instance[key] = serializer.deserialize(propertyMapper, responseBody[interfaces_js_1.XML_ATTRKEY][xmlName], propertyObjectName, options); + } else if (propertyMapper.xmlIsMsText) { + if (responseBody[xmlCharKey] !== undefined) { + instance[key] = responseBody[xmlCharKey]; + } else if (typeof responseBody === "string") { + instance[key] = responseBody; + } + } else { + const propertyName = xmlElementName || xmlName || serializedName; + if (propertyMapper.xmlIsWrapped) { + const wrapped = responseBody[xmlName]; + const elementList = (_b = wrapped === null || wrapped === undefined ? undefined : wrapped[xmlElementName]) !== null && _b !== undefined ? _b : []; + instance[key] = serializer.deserialize(propertyMapper, elementList, propertyObjectName, options); + handledPropertyNames.push(xmlName); + } else { + const property = responseBody[propertyName]; + instance[key] = serializer.deserialize(propertyMapper, property, propertyObjectName, options); + handledPropertyNames.push(propertyName); + } + } + } else { + let propertyInstance; + let res = responseBody; + let steps = 0; + for (const item of paths) { + if (!res) + break; + steps++; + res = res[item]; + } + if (res === null && steps < paths.length) { + res = undefined; + } + propertyInstance = res; + const polymorphicDiscriminator = mapper.type.polymorphicDiscriminator; + if (polymorphicDiscriminator && key === polymorphicDiscriminator.clientName && (propertyInstance === undefined || propertyInstance === null)) { + propertyInstance = mapper.serializedName; + } + let serializedValue; + if (Array.isArray(responseBody[key]) && modelProps[key].serializedName === "") { + propertyInstance = responseBody[key]; + const arrayInstance = serializer.deserialize(propertyMapper, propertyInstance, propertyObjectName, options); + for (const [k, v] of Object.entries(instance)) { + if (!Object.prototype.hasOwnProperty.call(arrayInstance, k)) { + arrayInstance[k] = v; + } + } + instance = arrayInstance; + } else if (propertyInstance !== undefined || propertyMapper.defaultValue !== undefined) { + serializedValue = serializer.deserialize(propertyMapper, propertyInstance, propertyObjectName, options); + instance[key] = serializedValue; + } + } + } + const additionalPropertiesMapper = mapper.type.additionalProperties; + if (additionalPropertiesMapper) { + const isAdditionalProperty = (responsePropName) => { + for (const clientPropName in modelProps) { + const paths = splitSerializeName(modelProps[clientPropName].serializedName); + if (paths[0] === responsePropName) { + return false; + } + } + return true; + }; + for (const responsePropName in responseBody) { + if (isAdditionalProperty(responsePropName)) { + instance[responsePropName] = serializer.deserialize(additionalPropertiesMapper, responseBody[responsePropName], objectName + '["' + responsePropName + '"]', options); + } + } + } else if (responseBody && !options.ignoreUnknownProperties) { + for (const key of Object.keys(responseBody)) { + if (instance[key] === undefined && !handledPropertyNames.includes(key) && !isSpecialXmlProperty(key, options)) { + instance[key] = responseBody[key]; + } + } + } + return instance; + } + function deserializeDictionaryType(serializer, mapper, responseBody, objectName, options) { + const value = mapper.type.value; + if (!value || typeof value !== "object") { + throw new Error(`"value" metadata for a Dictionary must be defined in the ` + `mapper and it must of type "object" in ${objectName}`); + } + if (responseBody) { + const tempDictionary = {}; + for (const key of Object.keys(responseBody)) { + tempDictionary[key] = serializer.deserialize(value, responseBody[key], objectName, options); + } + return tempDictionary; + } + return responseBody; + } + function deserializeSequenceType(serializer, mapper, responseBody, objectName, options) { + var _a; + let element = mapper.type.element; + if (!element || typeof element !== "object") { + throw new Error(`element" metadata for an Array must be defined in the ` + `mapper and it must of type "object" in ${objectName}`); + } + if (responseBody) { + if (!Array.isArray(responseBody)) { + responseBody = [responseBody]; + } + if (element.type.name === "Composite" && element.type.className) { + element = (_a = serializer.modelMappers[element.type.className]) !== null && _a !== undefined ? _a : element; + } + const tempArray = []; + for (let i = 0;i < responseBody.length; i++) { + tempArray[i] = serializer.deserialize(element, responseBody[i], `${objectName}[${i}]`, options); + } + return tempArray; + } + return responseBody; + } + function getIndexDiscriminator(discriminators, discriminatorValue, typeName) { + const typeNamesToCheck = [typeName]; + while (typeNamesToCheck.length) { + const currentName = typeNamesToCheck.shift(); + const indexDiscriminator = discriminatorValue === currentName ? discriminatorValue : currentName + "." + discriminatorValue; + if (Object.prototype.hasOwnProperty.call(discriminators, indexDiscriminator)) { + return discriminators[indexDiscriminator]; + } else { + for (const [name, mapper] of Object.entries(discriminators)) { + if (name.startsWith(currentName + ".") && mapper.type.uberParent === currentName && mapper.type.className) { + typeNamesToCheck.push(mapper.type.className); + } + } + } + } + return; + } + function getPolymorphicMapper(serializer, mapper, object, polymorphicPropertyName) { + var _a; + const polymorphicDiscriminator = getPolymorphicDiscriminatorRecursively(serializer, mapper); + if (polymorphicDiscriminator) { + let discriminatorName = polymorphicDiscriminator[polymorphicPropertyName]; + if (discriminatorName) { + if (polymorphicPropertyName === "serializedName") { + discriminatorName = discriminatorName.replace(/\\/gi, ""); + } + const discriminatorValue = object[discriminatorName]; + const typeName = (_a = mapper.type.uberParent) !== null && _a !== undefined ? _a : mapper.type.className; + if (typeof discriminatorValue === "string" && typeName) { + const polymorphicMapper = getIndexDiscriminator(serializer.modelMappers.discriminators, discriminatorValue, typeName); + if (polymorphicMapper) { + mapper = polymorphicMapper; + } + } + } + } + return mapper; + } + function getPolymorphicDiscriminatorRecursively(serializer, mapper) { + return mapper.type.polymorphicDiscriminator || getPolymorphicDiscriminatorSafely(serializer, mapper.type.uberParent) || getPolymorphicDiscriminatorSafely(serializer, mapper.type.className); + } + function getPolymorphicDiscriminatorSafely(serializer, typeName) { + return typeName && serializer.modelMappers[typeName] && serializer.modelMappers[typeName].type.polymorphicDiscriminator; + } + exports2.MapperTypeNames = { + Base64Url: "Base64Url", + Boolean: "Boolean", + ByteArray: "ByteArray", + Composite: "Composite", + Date: "Date", + DateTime: "DateTime", + DateTimeRfc1123: "DateTimeRfc1123", + Dictionary: "Dictionary", + Enum: "Enum", + Number: "Number", + Object: "Object", + Sequence: "Sequence", + String: "String", + Stream: "Stream", + TimeSpan: "TimeSpan", + UnixTime: "UnixTime" + }; +}); + +// node_modules/@azure/core-client/dist/commonjs/state.js +var require_state2 = __commonJS((exports2) => { + Object.defineProperty(exports2, "__esModule", { value: true }); + exports2.state = undefined; + exports2.state = { + operationRequestMap: new WeakMap + }; +}); + +// node_modules/@azure/core-client/dist/commonjs/operationHelpers.js +var require_operationHelpers = __commonJS((exports2) => { + Object.defineProperty(exports2, "__esModule", { value: true }); + exports2.getOperationRequestInfo = exports2.getOperationArgumentValueFromParameter = undefined; + var state_js_1 = require_state2(); + function getOperationArgumentValueFromParameter(operationArguments, parameter, fallbackObject) { + let parameterPath = parameter.parameterPath; + const parameterMapper = parameter.mapper; + let value; + if (typeof parameterPath === "string") { + parameterPath = [parameterPath]; + } + if (Array.isArray(parameterPath)) { + if (parameterPath.length > 0) { + if (parameterMapper.isConstant) { + value = parameterMapper.defaultValue; + } else { + let propertySearchResult = getPropertyFromParameterPath(operationArguments, parameterPath); + if (!propertySearchResult.propertyFound && fallbackObject) { + propertySearchResult = getPropertyFromParameterPath(fallbackObject, parameterPath); + } + let useDefaultValue = false; + if (!propertySearchResult.propertyFound) { + useDefaultValue = parameterMapper.required || parameterPath[0] === "options" && parameterPath.length === 2; + } + value = useDefaultValue ? parameterMapper.defaultValue : propertySearchResult.propertyValue; + } + } + } else { + if (parameterMapper.required) { + value = {}; + } + for (const propertyName in parameterPath) { + const propertyMapper = parameterMapper.type.modelProperties[propertyName]; + const propertyPath = parameterPath[propertyName]; + const propertyValue = getOperationArgumentValueFromParameter(operationArguments, { + parameterPath: propertyPath, + mapper: propertyMapper + }, fallbackObject); + if (propertyValue !== undefined) { + if (!value) { + value = {}; + } + value[propertyName] = propertyValue; + } + } + } + return value; + } + exports2.getOperationArgumentValueFromParameter = getOperationArgumentValueFromParameter; + function getPropertyFromParameterPath(parent, parameterPath) { + const result = { propertyFound: false }; + let i = 0; + for (;i < parameterPath.length; ++i) { + const parameterPathPart = parameterPath[i]; + if (parent && parameterPathPart in parent) { + parent = parent[parameterPathPart]; + } else { + break; + } + } + if (i === parameterPath.length) { + result.propertyValue = parent; + result.propertyFound = true; + } + return result; + } + var originalRequestSymbol = Symbol.for("@azure/core-client original request"); + function hasOriginalRequest(request) { + return originalRequestSymbol in request; + } + function getOperationRequestInfo(request) { + if (hasOriginalRequest(request)) { + return getOperationRequestInfo(request[originalRequestSymbol]); + } + let info = state_js_1.state.operationRequestMap.get(request); + if (!info) { + info = {}; + state_js_1.state.operationRequestMap.set(request, info); + } + return info; + } + exports2.getOperationRequestInfo = getOperationRequestInfo; +}); + +// node_modules/@azure/core-client/dist/commonjs/deserializationPolicy.js +var require_deserializationPolicy = __commonJS((exports2) => { + Object.defineProperty(exports2, "__esModule", { value: true }); + exports2.deserializationPolicy = exports2.deserializationPolicyName = undefined; + var interfaces_js_1 = require_interfaces(); + var core_rest_pipeline_1 = require_commonjs7(); + var serializer_js_1 = require_serializer(); + var operationHelpers_js_1 = require_operationHelpers(); + var defaultJsonContentTypes = ["application/json", "text/json"]; + var defaultXmlContentTypes = ["application/xml", "application/atom+xml"]; + exports2.deserializationPolicyName = "deserializationPolicy"; + function deserializationPolicy(options = {}) { + var _a, _b, _c, _d, _e, _f, _g; + const jsonContentTypes = (_b = (_a = options.expectedContentTypes) === null || _a === undefined ? undefined : _a.json) !== null && _b !== undefined ? _b : defaultJsonContentTypes; + const xmlContentTypes = (_d = (_c = options.expectedContentTypes) === null || _c === undefined ? undefined : _c.xml) !== null && _d !== undefined ? _d : defaultXmlContentTypes; + const parseXML = options.parseXML; + const serializerOptions = options.serializerOptions; + const updatedOptions = { + xml: { + rootName: (_e = serializerOptions === null || serializerOptions === undefined ? undefined : serializerOptions.xml.rootName) !== null && _e !== undefined ? _e : "", + includeRoot: (_f = serializerOptions === null || serializerOptions === undefined ? undefined : serializerOptions.xml.includeRoot) !== null && _f !== undefined ? _f : false, + xmlCharKey: (_g = serializerOptions === null || serializerOptions === undefined ? undefined : serializerOptions.xml.xmlCharKey) !== null && _g !== undefined ? _g : interfaces_js_1.XML_CHARKEY + } + }; + return { + name: exports2.deserializationPolicyName, + async sendRequest(request, next) { + const response = await next(request); + return deserializeResponseBody(jsonContentTypes, xmlContentTypes, response, updatedOptions, parseXML); + } + }; + } + exports2.deserializationPolicy = deserializationPolicy; + function getOperationResponseMap(parsedResponse) { + let result; + const request = parsedResponse.request; + const operationInfo = (0, operationHelpers_js_1.getOperationRequestInfo)(request); + const operationSpec = operationInfo === null || operationInfo === undefined ? undefined : operationInfo.operationSpec; + if (operationSpec) { + if (!(operationInfo === null || operationInfo === undefined ? undefined : operationInfo.operationResponseGetter)) { + result = operationSpec.responses[parsedResponse.status]; + } else { + result = operationInfo === null || operationInfo === undefined ? undefined : operationInfo.operationResponseGetter(operationSpec, parsedResponse); + } + } + return result; + } + function shouldDeserializeResponse(parsedResponse) { + const request = parsedResponse.request; + const operationInfo = (0, operationHelpers_js_1.getOperationRequestInfo)(request); + const shouldDeserialize = operationInfo === null || operationInfo === undefined ? undefined : operationInfo.shouldDeserialize; + let result; + if (shouldDeserialize === undefined) { + result = true; + } else if (typeof shouldDeserialize === "boolean") { + result = shouldDeserialize; + } else { + result = shouldDeserialize(parsedResponse); + } + return result; + } + async function deserializeResponseBody(jsonContentTypes, xmlContentTypes, response, options, parseXML) { + const parsedResponse = await parse(jsonContentTypes, xmlContentTypes, response, options, parseXML); + if (!shouldDeserializeResponse(parsedResponse)) { + return parsedResponse; + } + const operationInfo = (0, operationHelpers_js_1.getOperationRequestInfo)(parsedResponse.request); + const operationSpec = operationInfo === null || operationInfo === undefined ? undefined : operationInfo.operationSpec; + if (!operationSpec || !operationSpec.responses) { + return parsedResponse; + } + const responseSpec = getOperationResponseMap(parsedResponse); + const { error, shouldReturnResponse } = handleErrorResponse(parsedResponse, operationSpec, responseSpec, options); + if (error) { + throw error; + } else if (shouldReturnResponse) { + return parsedResponse; + } + if (responseSpec) { + if (responseSpec.bodyMapper) { + let valueToDeserialize = parsedResponse.parsedBody; + if (operationSpec.isXML && responseSpec.bodyMapper.type.name === serializer_js_1.MapperTypeNames.Sequence) { + valueToDeserialize = typeof valueToDeserialize === "object" ? valueToDeserialize[responseSpec.bodyMapper.xmlElementName] : []; + } + try { + parsedResponse.parsedBody = operationSpec.serializer.deserialize(responseSpec.bodyMapper, valueToDeserialize, "operationRes.parsedBody", options); + } catch (deserializeError) { + const restError = new core_rest_pipeline_1.RestError(`Error ${deserializeError} occurred in deserializing the responseBody - ${parsedResponse.bodyAsText}`, { + statusCode: parsedResponse.status, + request: parsedResponse.request, + response: parsedResponse + }); + throw restError; + } + } else if (operationSpec.httpMethod === "HEAD") { + parsedResponse.parsedBody = response.status >= 200 && response.status < 300; + } + if (responseSpec.headersMapper) { + parsedResponse.parsedHeaders = operationSpec.serializer.deserialize(responseSpec.headersMapper, parsedResponse.headers.toJSON(), "operationRes.parsedHeaders", { xml: {}, ignoreUnknownProperties: true }); + } + } + return parsedResponse; + } + function isOperationSpecEmpty(operationSpec) { + const expectedStatusCodes = Object.keys(operationSpec.responses); + return expectedStatusCodes.length === 0 || expectedStatusCodes.length === 1 && expectedStatusCodes[0] === "default"; + } + function handleErrorResponse(parsedResponse, operationSpec, responseSpec, options) { + var _a; + const isSuccessByStatus = 200 <= parsedResponse.status && parsedResponse.status < 300; + const isExpectedStatusCode = isOperationSpecEmpty(operationSpec) ? isSuccessByStatus : !!responseSpec; + if (isExpectedStatusCode) { + if (responseSpec) { + if (!responseSpec.isError) { + return { error: null, shouldReturnResponse: false }; + } + } else { + return { error: null, shouldReturnResponse: false }; + } + } + const errorResponseSpec = responseSpec !== null && responseSpec !== undefined ? responseSpec : operationSpec.responses.default; + const initialErrorMessage = ((_a = parsedResponse.request.streamResponseStatusCodes) === null || _a === undefined ? undefined : _a.has(parsedResponse.status)) ? `Unexpected status code: ${parsedResponse.status}` : parsedResponse.bodyAsText; + const error = new core_rest_pipeline_1.RestError(initialErrorMessage, { + statusCode: parsedResponse.status, + request: parsedResponse.request, + response: parsedResponse + }); + if (!errorResponseSpec) { + throw error; + } + const defaultBodyMapper = errorResponseSpec.bodyMapper; + const defaultHeadersMapper = errorResponseSpec.headersMapper; + try { + if (parsedResponse.parsedBody) { + const parsedBody = parsedResponse.parsedBody; + let deserializedError; + if (defaultBodyMapper) { + let valueToDeserialize = parsedBody; + if (operationSpec.isXML && defaultBodyMapper.type.name === serializer_js_1.MapperTypeNames.Sequence) { + valueToDeserialize = []; + const elementName = defaultBodyMapper.xmlElementName; + if (typeof parsedBody === "object" && elementName) { + valueToDeserialize = parsedBody[elementName]; + } + } + deserializedError = operationSpec.serializer.deserialize(defaultBodyMapper, valueToDeserialize, "error.response.parsedBody", options); + } + const internalError = parsedBody.error || deserializedError || parsedBody; + error.code = internalError.code; + if (internalError.message) { + error.message = internalError.message; + } + if (defaultBodyMapper) { + error.response.parsedBody = deserializedError; + } + } + if (parsedResponse.headers && defaultHeadersMapper) { + error.response.parsedHeaders = operationSpec.serializer.deserialize(defaultHeadersMapper, parsedResponse.headers.toJSON(), "operationRes.parsedHeaders"); + } + } catch (defaultError) { + error.message = `Error "${defaultError.message}" occurred in deserializing the responseBody - "${parsedResponse.bodyAsText}" for the default response.`; + } + return { error, shouldReturnResponse: false }; + } + async function parse(jsonContentTypes, xmlContentTypes, operationResponse, opts, parseXML) { + var _a; + if (!((_a = operationResponse.request.streamResponseStatusCodes) === null || _a === undefined ? undefined : _a.has(operationResponse.status)) && operationResponse.bodyAsText) { + const text = operationResponse.bodyAsText; + const contentType = operationResponse.headers.get("Content-Type") || ""; + const contentComponents = !contentType ? [] : contentType.split(";").map((component) => component.toLowerCase()); + try { + if (contentComponents.length === 0 || contentComponents.some((component) => jsonContentTypes.indexOf(component) !== -1)) { + operationResponse.parsedBody = JSON.parse(text); + return operationResponse; + } else if (contentComponents.some((component) => xmlContentTypes.indexOf(component) !== -1)) { + if (!parseXML) { + throw new Error("Parsing XML not supported."); + } + const body = await parseXML(text, opts.xml); + operationResponse.parsedBody = body; + return operationResponse; + } + } catch (err) { + const msg = `Error "${err}" occurred while parsing the response body - ${operationResponse.bodyAsText}.`; + const errCode = err.code || core_rest_pipeline_1.RestError.PARSE_ERROR; + const e = new core_rest_pipeline_1.RestError(msg, { + code: errCode, + statusCode: operationResponse.status, + request: operationResponse.request, + response: operationResponse + }); + throw e; + } + } + return operationResponse; + } +}); + +// node_modules/@azure/core-client/dist/commonjs/interfaceHelpers.js +var require_interfaceHelpers = __commonJS((exports2) => { + Object.defineProperty(exports2, "__esModule", { value: true }); + exports2.getPathStringFromParameter = exports2.getStreamingResponseStatusCodes = undefined; + var serializer_js_1 = require_serializer(); + function getStreamingResponseStatusCodes(operationSpec) { + const result = new Set; + for (const statusCode in operationSpec.responses) { + const operationResponse = operationSpec.responses[statusCode]; + if (operationResponse.bodyMapper && operationResponse.bodyMapper.type.name === serializer_js_1.MapperTypeNames.Stream) { + result.add(Number(statusCode)); + } + } + return result; + } + exports2.getStreamingResponseStatusCodes = getStreamingResponseStatusCodes; + function getPathStringFromParameter(parameter) { + const { parameterPath, mapper } = parameter; + let result; + if (typeof parameterPath === "string") { + result = parameterPath; + } else if (Array.isArray(parameterPath)) { + result = parameterPath.join("."); + } else { + result = mapper.serializedName; + } + return result; + } + exports2.getPathStringFromParameter = getPathStringFromParameter; +}); + +// node_modules/@azure/core-client/dist/commonjs/serializationPolicy.js +var require_serializationPolicy = __commonJS((exports2) => { + Object.defineProperty(exports2, "__esModule", { value: true }); + exports2.serializeRequestBody = exports2.serializeHeaders = exports2.serializationPolicy = exports2.serializationPolicyName = undefined; + var interfaces_js_1 = require_interfaces(); + var operationHelpers_js_1 = require_operationHelpers(); + var serializer_js_1 = require_serializer(); + var interfaceHelpers_js_1 = require_interfaceHelpers(); + exports2.serializationPolicyName = "serializationPolicy"; + function serializationPolicy(options = {}) { + const stringifyXML = options.stringifyXML; + return { + name: exports2.serializationPolicyName, + async sendRequest(request, next) { + const operationInfo = (0, operationHelpers_js_1.getOperationRequestInfo)(request); + const operationSpec = operationInfo === null || operationInfo === undefined ? undefined : operationInfo.operationSpec; + const operationArguments = operationInfo === null || operationInfo === undefined ? undefined : operationInfo.operationArguments; + if (operationSpec && operationArguments) { + serializeHeaders(request, operationArguments, operationSpec); + serializeRequestBody(request, operationArguments, operationSpec, stringifyXML); + } + return next(request); + } + }; + } + exports2.serializationPolicy = serializationPolicy; + function serializeHeaders(request, operationArguments, operationSpec) { + var _a, _b; + if (operationSpec.headerParameters) { + for (const headerParameter of operationSpec.headerParameters) { + let headerValue = (0, operationHelpers_js_1.getOperationArgumentValueFromParameter)(operationArguments, headerParameter); + if (headerValue !== null && headerValue !== undefined || headerParameter.mapper.required) { + headerValue = operationSpec.serializer.serialize(headerParameter.mapper, headerValue, (0, interfaceHelpers_js_1.getPathStringFromParameter)(headerParameter)); + const headerCollectionPrefix = headerParameter.mapper.headerCollectionPrefix; + if (headerCollectionPrefix) { + for (const key of Object.keys(headerValue)) { + request.headers.set(headerCollectionPrefix + key, headerValue[key]); + } + } else { + request.headers.set(headerParameter.mapper.serializedName || (0, interfaceHelpers_js_1.getPathStringFromParameter)(headerParameter), headerValue); + } + } + } + } + const customHeaders = (_b = (_a = operationArguments.options) === null || _a === undefined ? undefined : _a.requestOptions) === null || _b === undefined ? undefined : _b.customHeaders; + if (customHeaders) { + for (const customHeaderName of Object.keys(customHeaders)) { + request.headers.set(customHeaderName, customHeaders[customHeaderName]); + } + } + } + exports2.serializeHeaders = serializeHeaders; + function serializeRequestBody(request, operationArguments, operationSpec, stringifyXML = function() { + throw new Error("XML serialization unsupported!"); + }) { + var _a, _b, _c, _d, _e; + const serializerOptions = (_a = operationArguments.options) === null || _a === undefined ? undefined : _a.serializerOptions; + const updatedOptions = { + xml: { + rootName: (_b = serializerOptions === null || serializerOptions === undefined ? undefined : serializerOptions.xml.rootName) !== null && _b !== undefined ? _b : "", + includeRoot: (_c = serializerOptions === null || serializerOptions === undefined ? undefined : serializerOptions.xml.includeRoot) !== null && _c !== undefined ? _c : false, + xmlCharKey: (_d = serializerOptions === null || serializerOptions === undefined ? undefined : serializerOptions.xml.xmlCharKey) !== null && _d !== undefined ? _d : interfaces_js_1.XML_CHARKEY + } + }; + const xmlCharKey = updatedOptions.xml.xmlCharKey; + if (operationSpec.requestBody && operationSpec.requestBody.mapper) { + request.body = (0, operationHelpers_js_1.getOperationArgumentValueFromParameter)(operationArguments, operationSpec.requestBody); + const bodyMapper = operationSpec.requestBody.mapper; + const { required, serializedName, xmlName, xmlElementName, xmlNamespace, xmlNamespacePrefix, nullable } = bodyMapper; + const typeName = bodyMapper.type.name; + try { + if (request.body !== undefined && request.body !== null || nullable && request.body === null || required) { + const requestBodyParameterPathString = (0, interfaceHelpers_js_1.getPathStringFromParameter)(operationSpec.requestBody); + request.body = operationSpec.serializer.serialize(bodyMapper, request.body, requestBodyParameterPathString, updatedOptions); + const isStream = typeName === serializer_js_1.MapperTypeNames.Stream; + if (operationSpec.isXML) { + const xmlnsKey = xmlNamespacePrefix ? `xmlns:${xmlNamespacePrefix}` : "xmlns"; + const value = getXmlValueWithNamespace(xmlNamespace, xmlnsKey, typeName, request.body, updatedOptions); + if (typeName === serializer_js_1.MapperTypeNames.Sequence) { + request.body = stringifyXML(prepareXMLRootList(value, xmlElementName || xmlName || serializedName, xmlnsKey, xmlNamespace), { rootName: xmlName || serializedName, xmlCharKey }); + } else if (!isStream) { + request.body = stringifyXML(value, { + rootName: xmlName || serializedName, + xmlCharKey + }); + } + } else if (typeName === serializer_js_1.MapperTypeNames.String && (((_e = operationSpec.contentType) === null || _e === undefined ? undefined : _e.match("text/plain")) || operationSpec.mediaType === "text")) { + return; + } else if (!isStream) { + request.body = JSON.stringify(request.body); + } + } + } catch (error) { + throw new Error(`Error "${error.message}" occurred in serializing the payload - ${JSON.stringify(serializedName, undefined, " ")}.`); + } + } else if (operationSpec.formDataParameters && operationSpec.formDataParameters.length > 0) { + request.formData = {}; + for (const formDataParameter of operationSpec.formDataParameters) { + const formDataParameterValue = (0, operationHelpers_js_1.getOperationArgumentValueFromParameter)(operationArguments, formDataParameter); + if (formDataParameterValue !== undefined && formDataParameterValue !== null) { + const formDataParameterPropertyName = formDataParameter.mapper.serializedName || (0, interfaceHelpers_js_1.getPathStringFromParameter)(formDataParameter); + request.formData[formDataParameterPropertyName] = operationSpec.serializer.serialize(formDataParameter.mapper, formDataParameterValue, (0, interfaceHelpers_js_1.getPathStringFromParameter)(formDataParameter), updatedOptions); + } + } + } + } + exports2.serializeRequestBody = serializeRequestBody; + function getXmlValueWithNamespace(xmlNamespace, xmlnsKey, typeName, serializedValue, options) { + if (xmlNamespace && !["Composite", "Sequence", "Dictionary"].includes(typeName)) { + const result = {}; + result[options.xml.xmlCharKey] = serializedValue; + result[interfaces_js_1.XML_ATTRKEY] = { [xmlnsKey]: xmlNamespace }; + return result; + } + return serializedValue; + } + function prepareXMLRootList(obj, elementName, xmlNamespaceKey, xmlNamespace) { + if (!Array.isArray(obj)) { + obj = [obj]; + } + if (!xmlNamespaceKey || !xmlNamespace) { + return { [elementName]: obj }; + } + const result = { [elementName]: obj }; + result[interfaces_js_1.XML_ATTRKEY] = { [xmlNamespaceKey]: xmlNamespace }; + return result; + } +}); + +// node_modules/@azure/core-client/dist/commonjs/pipeline.js +var require_pipeline2 = __commonJS((exports2) => { + Object.defineProperty(exports2, "__esModule", { value: true }); + exports2.createClientPipeline = undefined; + var deserializationPolicy_js_1 = require_deserializationPolicy(); + var core_rest_pipeline_1 = require_commonjs7(); + var serializationPolicy_js_1 = require_serializationPolicy(); + function createClientPipeline(options = {}) { + const pipeline = (0, core_rest_pipeline_1.createPipelineFromOptions)(options !== null && options !== undefined ? options : {}); + if (options.credentialOptions) { + pipeline.addPolicy((0, core_rest_pipeline_1.bearerTokenAuthenticationPolicy)({ + credential: options.credentialOptions.credential, + scopes: options.credentialOptions.credentialScopes + })); + } + pipeline.addPolicy((0, serializationPolicy_js_1.serializationPolicy)(options.serializationOptions), { phase: "Serialize" }); + pipeline.addPolicy((0, deserializationPolicy_js_1.deserializationPolicy)(options.deserializationOptions), { + phase: "Deserialize" + }); + return pipeline; + } + exports2.createClientPipeline = createClientPipeline; +}); + +// node_modules/@azure/core-client/dist/commonjs/httpClientCache.js +var require_httpClientCache = __commonJS((exports2) => { + Object.defineProperty(exports2, "__esModule", { value: true }); + exports2.getCachedDefaultHttpClient = undefined; + var core_rest_pipeline_1 = require_commonjs7(); + var cachedHttpClient; + function getCachedDefaultHttpClient() { + if (!cachedHttpClient) { + cachedHttpClient = (0, core_rest_pipeline_1.createDefaultHttpClient)(); + } + return cachedHttpClient; + } + exports2.getCachedDefaultHttpClient = getCachedDefaultHttpClient; +}); + +// node_modules/@azure/core-client/dist/commonjs/urlHelpers.js +var require_urlHelpers = __commonJS((exports2) => { + Object.defineProperty(exports2, "__esModule", { value: true }); + exports2.appendQueryParams = exports2.getRequestUrl = undefined; + var operationHelpers_js_1 = require_operationHelpers(); + var interfaceHelpers_js_1 = require_interfaceHelpers(); + var CollectionFormatToDelimiterMap = { + CSV: ",", + SSV: " ", + Multi: "Multi", + TSV: "\t", + Pipes: "|" + }; + function getRequestUrl(baseUri, operationSpec, operationArguments, fallbackObject) { + const urlReplacements = calculateUrlReplacements(operationSpec, operationArguments, fallbackObject); + let isAbsolutePath = false; + let requestUrl = replaceAll(baseUri, urlReplacements); + if (operationSpec.path) { + let path = replaceAll(operationSpec.path, urlReplacements); + if (operationSpec.path === "/{nextLink}" && path.startsWith("/")) { + path = path.substring(1); + } + if (isAbsoluteUrl(path)) { + requestUrl = path; + isAbsolutePath = true; + } else { + requestUrl = appendPath(requestUrl, path); + } + } + const { queryParams, sequenceParams } = calculateQueryParameters(operationSpec, operationArguments, fallbackObject); + requestUrl = appendQueryParams(requestUrl, queryParams, sequenceParams, isAbsolutePath); + return requestUrl; + } + exports2.getRequestUrl = getRequestUrl; + function replaceAll(input, replacements) { + let result = input; + for (const [searchValue, replaceValue] of replacements) { + result = result.split(searchValue).join(replaceValue); + } + return result; + } + function calculateUrlReplacements(operationSpec, operationArguments, fallbackObject) { + var _a; + const result = new Map; + if ((_a = operationSpec.urlParameters) === null || _a === undefined ? undefined : _a.length) { + for (const urlParameter of operationSpec.urlParameters) { + let urlParameterValue = (0, operationHelpers_js_1.getOperationArgumentValueFromParameter)(operationArguments, urlParameter, fallbackObject); + const parameterPathString = (0, interfaceHelpers_js_1.getPathStringFromParameter)(urlParameter); + urlParameterValue = operationSpec.serializer.serialize(urlParameter.mapper, urlParameterValue, parameterPathString); + if (!urlParameter.skipEncoding) { + urlParameterValue = encodeURIComponent(urlParameterValue); + } + result.set(`{${urlParameter.mapper.serializedName || parameterPathString}}`, urlParameterValue); + } + } + return result; + } + function isAbsoluteUrl(url) { + return url.includes("://"); + } + function appendPath(url, pathToAppend) { + if (!pathToAppend) { + return url; + } + const parsedUrl = new URL(url); + let newPath = parsedUrl.pathname; + if (!newPath.endsWith("/")) { + newPath = `${newPath}/`; + } + if (pathToAppend.startsWith("/")) { + pathToAppend = pathToAppend.substring(1); + } + const searchStart = pathToAppend.indexOf("?"); + if (searchStart !== -1) { + const path = pathToAppend.substring(0, searchStart); + const search = pathToAppend.substring(searchStart + 1); + newPath = newPath + path; + if (search) { + parsedUrl.search = parsedUrl.search ? `${parsedUrl.search}&${search}` : search; + } + } else { + newPath = newPath + pathToAppend; + } + parsedUrl.pathname = newPath; + return parsedUrl.toString(); + } + function calculateQueryParameters(operationSpec, operationArguments, fallbackObject) { + var _a; + const result = new Map; + const sequenceParams = new Set; + if ((_a = operationSpec.queryParameters) === null || _a === undefined ? undefined : _a.length) { + for (const queryParameter of operationSpec.queryParameters) { + if (queryParameter.mapper.type.name === "Sequence" && queryParameter.mapper.serializedName) { + sequenceParams.add(queryParameter.mapper.serializedName); + } + let queryParameterValue = (0, operationHelpers_js_1.getOperationArgumentValueFromParameter)(operationArguments, queryParameter, fallbackObject); + if (queryParameterValue !== undefined && queryParameterValue !== null || queryParameter.mapper.required) { + queryParameterValue = operationSpec.serializer.serialize(queryParameter.mapper, queryParameterValue, (0, interfaceHelpers_js_1.getPathStringFromParameter)(queryParameter)); + const delimiter = queryParameter.collectionFormat ? CollectionFormatToDelimiterMap[queryParameter.collectionFormat] : ""; + if (Array.isArray(queryParameterValue)) { + queryParameterValue = queryParameterValue.map((item) => { + if (item === null || item === undefined) { + return ""; + } + return item; + }); + } + if (queryParameter.collectionFormat === "Multi" && queryParameterValue.length === 0) { + continue; + } else if (Array.isArray(queryParameterValue) && (queryParameter.collectionFormat === "SSV" || queryParameter.collectionFormat === "TSV")) { + queryParameterValue = queryParameterValue.join(delimiter); + } + if (!queryParameter.skipEncoding) { + if (Array.isArray(queryParameterValue)) { + queryParameterValue = queryParameterValue.map((item) => { + return encodeURIComponent(item); + }); + } else { + queryParameterValue = encodeURIComponent(queryParameterValue); + } + } + if (Array.isArray(queryParameterValue) && (queryParameter.collectionFormat === "CSV" || queryParameter.collectionFormat === "Pipes")) { + queryParameterValue = queryParameterValue.join(delimiter); + } + result.set(queryParameter.mapper.serializedName || (0, interfaceHelpers_js_1.getPathStringFromParameter)(queryParameter), queryParameterValue); + } + } + } + return { + queryParams: result, + sequenceParams + }; + } + function simpleParseQueryParams(queryString) { + const result = new Map; + if (!queryString || queryString[0] !== "?") { + return result; + } + queryString = queryString.slice(1); + const pairs = queryString.split("&"); + for (const pair of pairs) { + const [name, value] = pair.split("=", 2); + const existingValue = result.get(name); + if (existingValue) { + if (Array.isArray(existingValue)) { + existingValue.push(value); + } else { + result.set(name, [existingValue, value]); + } + } else { + result.set(name, value); + } + } + return result; + } + function appendQueryParams(url, queryParams, sequenceParams, noOverwrite = false) { + if (queryParams.size === 0) { + return url; + } + const parsedUrl = new URL(url); + const combinedParams = simpleParseQueryParams(parsedUrl.search); + for (const [name, value] of queryParams) { + const existingValue = combinedParams.get(name); + if (Array.isArray(existingValue)) { + if (Array.isArray(value)) { + existingValue.push(...value); + const valueSet = new Set(existingValue); + combinedParams.set(name, Array.from(valueSet)); + } else { + existingValue.push(value); + } + } else if (existingValue) { + if (Array.isArray(value)) { + value.unshift(existingValue); + } else if (sequenceParams.has(name)) { + combinedParams.set(name, [existingValue, value]); + } + if (!noOverwrite) { + combinedParams.set(name, value); + } + } else { + combinedParams.set(name, value); + } + } + const searchPieces = []; + for (const [name, value] of combinedParams) { + if (typeof value === "string") { + searchPieces.push(`${name}=${value}`); + } else if (Array.isArray(value)) { + for (const subValue of value) { + searchPieces.push(`${name}=${subValue}`); + } + } else { + searchPieces.push(`${name}=${value}`); + } + } + parsedUrl.search = searchPieces.length ? `?${searchPieces.join("&")}` : ""; + return parsedUrl.toString(); + } + exports2.appendQueryParams = appendQueryParams; +}); + +// node_modules/@azure/core-client/dist/commonjs/log.js +var require_log3 = __commonJS((exports2) => { + Object.defineProperty(exports2, "__esModule", { value: true }); + exports2.logger = undefined; + var logger_1 = require_commonjs3(); + exports2.logger = (0, logger_1.createClientLogger)("core-client"); +}); + +// node_modules/@azure/core-client/dist/commonjs/serviceClient.js +var require_serviceClient = __commonJS((exports2) => { + Object.defineProperty(exports2, "__esModule", { value: true }); + exports2.ServiceClient = undefined; + var core_rest_pipeline_1 = require_commonjs7(); + var pipeline_js_1 = require_pipeline2(); + var utils_js_1 = require_utils5(); + var httpClientCache_js_1 = require_httpClientCache(); + var operationHelpers_js_1 = require_operationHelpers(); + var urlHelpers_js_1 = require_urlHelpers(); + var interfaceHelpers_js_1 = require_interfaceHelpers(); + var log_js_1 = require_log3(); + + class ServiceClient { + constructor(options = {}) { + var _a, _b; + this._requestContentType = options.requestContentType; + this._endpoint = (_a = options.endpoint) !== null && _a !== undefined ? _a : options.baseUri; + if (options.baseUri) { + log_js_1.logger.warning("The baseUri option for SDK Clients has been deprecated, please use endpoint instead."); + } + this._allowInsecureConnection = options.allowInsecureConnection; + this._httpClient = options.httpClient || (0, httpClientCache_js_1.getCachedDefaultHttpClient)(); + this.pipeline = options.pipeline || createDefaultPipeline(options); + if ((_b = options.additionalPolicies) === null || _b === undefined ? undefined : _b.length) { + for (const { policy, position } of options.additionalPolicies) { + const afterPhase = position === "perRetry" ? "Sign" : undefined; + this.pipeline.addPolicy(policy, { + afterPhase + }); + } + } + } + async sendRequest(request) { + return this.pipeline.sendRequest(this._httpClient, request); + } + async sendOperationRequest(operationArguments, operationSpec) { + const endpoint = operationSpec.baseUrl || this._endpoint; + if (!endpoint) { + throw new Error("If operationSpec.baseUrl is not specified, then the ServiceClient must have a endpoint string property that contains the base URL to use."); + } + const url = (0, urlHelpers_js_1.getRequestUrl)(endpoint, operationSpec, operationArguments, this); + const request = (0, core_rest_pipeline_1.createPipelineRequest)({ + url + }); + request.method = operationSpec.httpMethod; + const operationInfo = (0, operationHelpers_js_1.getOperationRequestInfo)(request); + operationInfo.operationSpec = operationSpec; + operationInfo.operationArguments = operationArguments; + const contentType = operationSpec.contentType || this._requestContentType; + if (contentType && operationSpec.requestBody) { + request.headers.set("Content-Type", contentType); + } + const options = operationArguments.options; + if (options) { + const requestOptions = options.requestOptions; + if (requestOptions) { + if (requestOptions.timeout) { + request.timeout = requestOptions.timeout; + } + if (requestOptions.onUploadProgress) { + request.onUploadProgress = requestOptions.onUploadProgress; + } + if (requestOptions.onDownloadProgress) { + request.onDownloadProgress = requestOptions.onDownloadProgress; + } + if (requestOptions.shouldDeserialize !== undefined) { + operationInfo.shouldDeserialize = requestOptions.shouldDeserialize; + } + if (requestOptions.allowInsecureConnection) { + request.allowInsecureConnection = true; + } + } + if (options.abortSignal) { + request.abortSignal = options.abortSignal; + } + if (options.tracingOptions) { + request.tracingOptions = options.tracingOptions; + } + } + if (this._allowInsecureConnection) { + request.allowInsecureConnection = true; + } + if (request.streamResponseStatusCodes === undefined) { + request.streamResponseStatusCodes = (0, interfaceHelpers_js_1.getStreamingResponseStatusCodes)(operationSpec); + } + try { + const rawResponse = await this.sendRequest(request); + const flatResponse = (0, utils_js_1.flattenResponse)(rawResponse, operationSpec.responses[rawResponse.status]); + if (options === null || options === undefined ? undefined : options.onResponse) { + options.onResponse(rawResponse, flatResponse); + } + return flatResponse; + } catch (error) { + if (typeof error === "object" && (error === null || error === undefined ? undefined : error.response)) { + const rawResponse = error.response; + const flatResponse = (0, utils_js_1.flattenResponse)(rawResponse, operationSpec.responses[error.statusCode] || operationSpec.responses["default"]); + error.details = flatResponse; + if (options === null || options === undefined ? undefined : options.onResponse) { + options.onResponse(rawResponse, flatResponse, error); + } + } + throw error; + } + } + } + exports2.ServiceClient = ServiceClient; + function createDefaultPipeline(options) { + const credentialScopes = getCredentialScopes(options); + const credentialOptions = options.credential && credentialScopes ? { credentialScopes, credential: options.credential } : undefined; + return (0, pipeline_js_1.createClientPipeline)(Object.assign(Object.assign({}, options), { credentialOptions })); + } + function getCredentialScopes(options) { + if (options.credentialScopes) { + return options.credentialScopes; + } + if (options.endpoint) { + return `${options.endpoint}/.default`; + } + if (options.baseUri) { + return `${options.baseUri}/.default`; + } + if (options.credential && !options.credentialScopes) { + throw new Error(`When using credentials, the ServiceClientOptions must contain either a endpoint or a credentialScopes. Unable to create a bearerTokenAuthenticationPolicy`); + } + return; + } +}); + +// node_modules/@azure/core-client/dist/commonjs/authorizeRequestOnClaimChallenge.js +var require_authorizeRequestOnClaimChallenge = __commonJS((exports2) => { + Object.defineProperty(exports2, "__esModule", { value: true }); + exports2.authorizeRequestOnClaimChallenge = exports2.parseCAEChallenge = undefined; + var log_js_1 = require_log3(); + var base64_js_1 = require_base642(); + function parseCAEChallenge(challenges) { + const bearerChallenges = `, ${challenges.trim()}`.split(", Bearer ").filter((x) => x); + return bearerChallenges.map((challenge) => { + const challengeParts = `${challenge.trim()}, `.split('", ').filter((x) => x); + const keyValuePairs = challengeParts.map((keyValue) => (([key, value]) => ({ [key]: value }))(keyValue.trim().split('="'))); + return keyValuePairs.reduce((a, b) => Object.assign(Object.assign({}, a), b), {}); + }); + } + exports2.parseCAEChallenge = parseCAEChallenge; + async function authorizeRequestOnClaimChallenge(onChallengeOptions) { + const { scopes, response } = onChallengeOptions; + const logger = onChallengeOptions.logger || log_js_1.logger; + const challenge = response.headers.get("WWW-Authenticate"); + if (!challenge) { + logger.info(`The WWW-Authenticate header was missing. Failed to perform the Continuous Access Evaluation authentication flow.`); + return false; + } + const challenges = parseCAEChallenge(challenge) || []; + const parsedChallenge = challenges.find((x) => x.claims); + if (!parsedChallenge) { + logger.info(`The WWW-Authenticate header was missing the necessary "claims" to perform the Continuous Access Evaluation authentication flow.`); + return false; + } + const accessToken = await onChallengeOptions.getAccessToken(parsedChallenge.scope ? [parsedChallenge.scope] : scopes, { + claims: (0, base64_js_1.decodeStringToString)(parsedChallenge.claims) + }); + if (!accessToken) { + return false; + } + onChallengeOptions.request.headers.set("Authorization", `Bearer ${accessToken.token}`); + return true; + } + exports2.authorizeRequestOnClaimChallenge = authorizeRequestOnClaimChallenge; +}); + +// node_modules/@azure/core-client/dist/commonjs/authorizeRequestOnTenantChallenge.js +var require_authorizeRequestOnTenantChallenge = __commonJS((exports2) => { + Object.defineProperty(exports2, "__esModule", { value: true }); + exports2.authorizeRequestOnTenantChallenge = undefined; + var Constants = { + DefaultScope: "/.default", + HeaderConstants: { + AUTHORIZATION: "authorization" + } + }; + function isUuid(text) { + return /^[0-9a-fA-F]{8}\b-[0-9a-fA-F]{4}\b-[0-9a-fA-F]{4}\b-[0-9a-fA-F]{4}\b-[0-9a-fA-F]{12}$/.test(text); + } + var authorizeRequestOnTenantChallenge = async (challengeOptions) => { + const requestOptions = requestToOptions(challengeOptions.request); + const challenge = getChallenge(challengeOptions.response); + if (challenge) { + const challengeInfo = parseChallenge(challenge); + const challengeScopes = buildScopes(challengeOptions, challengeInfo); + const tenantId = extractTenantId(challengeInfo); + if (!tenantId) { + return false; + } + const accessToken = await challengeOptions.getAccessToken(challengeScopes, Object.assign(Object.assign({}, requestOptions), { tenantId })); + if (!accessToken) { + return false; + } + challengeOptions.request.headers.set(Constants.HeaderConstants.AUTHORIZATION, `Bearer ${accessToken.token}`); + return true; + } + return false; + }; + exports2.authorizeRequestOnTenantChallenge = authorizeRequestOnTenantChallenge; + function extractTenantId(challengeInfo) { + const parsedAuthUri = new URL(challengeInfo.authorization_uri); + const pathSegments = parsedAuthUri.pathname.split("/"); + const tenantId = pathSegments[1]; + if (tenantId && isUuid(tenantId)) { + return tenantId; + } + return; + } + function buildScopes(challengeOptions, challengeInfo) { + if (!challengeInfo.resource_id) { + return challengeOptions.scopes; + } + const challengeScopes = new URL(challengeInfo.resource_id); + challengeScopes.pathname = Constants.DefaultScope; + let scope = challengeScopes.toString(); + if (scope === "https://disk.azure.com/.default") { + scope = "https://disk.azure.com//.default"; + } + return [scope]; + } + function getChallenge(response) { + const challenge = response.headers.get("WWW-Authenticate"); + if (response.status === 401 && challenge) { + return challenge; + } + return; + } + function parseChallenge(challenge) { + const bearerChallenge = challenge.slice("Bearer ".length); + const challengeParts = `${bearerChallenge.trim()} `.split(" ").filter((x) => x); + const keyValuePairs = challengeParts.map((keyValue) => (([key, value]) => ({ [key]: value }))(keyValue.trim().split("="))); + return keyValuePairs.reduce((a, b) => Object.assign(Object.assign({}, a), b), {}); + } + function requestToOptions(request) { + return { + abortSignal: request.abortSignal, + requestOptions: { + timeout: request.timeout + }, + tracingOptions: request.tracingOptions + }; + } +}); + +// node_modules/@azure/core-client/dist/commonjs/index.js +var require_commonjs9 = __commonJS((exports2) => { + Object.defineProperty(exports2, "__esModule", { value: true }); + exports2.authorizeRequestOnTenantChallenge = exports2.authorizeRequestOnClaimChallenge = exports2.serializationPolicyName = exports2.serializationPolicy = exports2.deserializationPolicyName = exports2.deserializationPolicy = exports2.XML_CHARKEY = exports2.XML_ATTRKEY = exports2.createClientPipeline = exports2.ServiceClient = exports2.MapperTypeNames = exports2.createSerializer = undefined; + var serializer_js_1 = require_serializer(); + Object.defineProperty(exports2, "createSerializer", { enumerable: true, get: function() { + return serializer_js_1.createSerializer; + } }); + Object.defineProperty(exports2, "MapperTypeNames", { enumerable: true, get: function() { + return serializer_js_1.MapperTypeNames; + } }); + var serviceClient_js_1 = require_serviceClient(); + Object.defineProperty(exports2, "ServiceClient", { enumerable: true, get: function() { + return serviceClient_js_1.ServiceClient; + } }); + var pipeline_js_1 = require_pipeline2(); + Object.defineProperty(exports2, "createClientPipeline", { enumerable: true, get: function() { + return pipeline_js_1.createClientPipeline; + } }); + var interfaces_js_1 = require_interfaces(); + Object.defineProperty(exports2, "XML_ATTRKEY", { enumerable: true, get: function() { + return interfaces_js_1.XML_ATTRKEY; + } }); + Object.defineProperty(exports2, "XML_CHARKEY", { enumerable: true, get: function() { + return interfaces_js_1.XML_CHARKEY; + } }); + var deserializationPolicy_js_1 = require_deserializationPolicy(); + Object.defineProperty(exports2, "deserializationPolicy", { enumerable: true, get: function() { + return deserializationPolicy_js_1.deserializationPolicy; + } }); + Object.defineProperty(exports2, "deserializationPolicyName", { enumerable: true, get: function() { + return deserializationPolicy_js_1.deserializationPolicyName; + } }); + var serializationPolicy_js_1 = require_serializationPolicy(); + Object.defineProperty(exports2, "serializationPolicy", { enumerable: true, get: function() { + return serializationPolicy_js_1.serializationPolicy; + } }); + Object.defineProperty(exports2, "serializationPolicyName", { enumerable: true, get: function() { + return serializationPolicy_js_1.serializationPolicyName; + } }); + var authorizeRequestOnClaimChallenge_js_1 = require_authorizeRequestOnClaimChallenge(); + Object.defineProperty(exports2, "authorizeRequestOnClaimChallenge", { enumerable: true, get: function() { + return authorizeRequestOnClaimChallenge_js_1.authorizeRequestOnClaimChallenge; + } }); + var authorizeRequestOnTenantChallenge_js_1 = require_authorizeRequestOnTenantChallenge(); + Object.defineProperty(exports2, "authorizeRequestOnTenantChallenge", { enumerable: true, get: function() { + return authorizeRequestOnTenantChallenge_js_1.authorizeRequestOnTenantChallenge; + } }); +}); + +// node_modules/@azure/core-http-compat/dist/commonjs/util.js +var require_util9 = __commonJS((exports2) => { + Object.defineProperty(exports2, "__esModule", { value: true }); + exports2.HttpHeaders = exports2.toHttpHeadersLike = exports2.toWebResourceLike = exports2.toPipelineRequest = undefined; + var core_rest_pipeline_1 = require_commonjs7(); + var originalRequestSymbol = Symbol("Original PipelineRequest"); + var originalClientRequestSymbol = Symbol.for("@azure/core-client original request"); + function toPipelineRequest(webResource, options = {}) { + const compatWebResource = webResource; + const request = compatWebResource[originalRequestSymbol]; + const headers = (0, core_rest_pipeline_1.createHttpHeaders)(webResource.headers.toJson({ preserveCase: true })); + if (request) { + request.headers = headers; + return request; + } else { + const newRequest = (0, core_rest_pipeline_1.createPipelineRequest)({ + url: webResource.url, + method: webResource.method, + headers, + withCredentials: webResource.withCredentials, + timeout: webResource.timeout, + requestId: webResource.requestId, + abortSignal: webResource.abortSignal, + body: webResource.body, + formData: webResource.formData, + disableKeepAlive: !!webResource.keepAlive, + onDownloadProgress: webResource.onDownloadProgress, + onUploadProgress: webResource.onUploadProgress, + proxySettings: webResource.proxySettings, + streamResponseStatusCodes: webResource.streamResponseStatusCodes + }); + if (options.originalRequest) { + newRequest[originalClientRequestSymbol] = options.originalRequest; + } + return newRequest; + } + } + exports2.toPipelineRequest = toPipelineRequest; + function toWebResourceLike(request, options) { + var _a; + const originalRequest = (_a = options === null || options === undefined ? undefined : options.originalRequest) !== null && _a !== undefined ? _a : request; + const webResource = { + url: request.url, + method: request.method, + headers: toHttpHeadersLike(request.headers), + withCredentials: request.withCredentials, + timeout: request.timeout, + requestId: request.headers.get("x-ms-client-request-id") || request.requestId, + abortSignal: request.abortSignal, + body: request.body, + formData: request.formData, + keepAlive: !!request.disableKeepAlive, + onDownloadProgress: request.onDownloadProgress, + onUploadProgress: request.onUploadProgress, + proxySettings: request.proxySettings, + streamResponseStatusCodes: request.streamResponseStatusCodes, + clone() { + throw new Error("Cannot clone a non-proxied WebResourceLike"); + }, + prepare() { + throw new Error("WebResourceLike.prepare() is not supported by @azure/core-http-compat"); + }, + validateRequestProperties() { + } + }; + if (options === null || options === undefined ? undefined : options.createProxy) { + return new Proxy(webResource, { + get(target, prop, receiver) { + if (prop === originalRequestSymbol) { + return request; + } else if (prop === "clone") { + return () => { + return toWebResourceLike(toPipelineRequest(webResource, { originalRequest }), { + createProxy: true, + originalRequest + }); + }; + } + return Reflect.get(target, prop, receiver); + }, + set(target, prop, value, receiver) { + if (prop === "keepAlive") { + request.disableKeepAlive = !value; + } + const passThroughProps = [ + "url", + "method", + "withCredentials", + "timeout", + "requestId", + "abortSignal", + "body", + "formData", + "onDownloadProgress", + "onUploadProgress", + "proxySettings", + "streamResponseStatusCodes" + ]; + if (typeof prop === "string" && passThroughProps.includes(prop)) { + request[prop] = value; + } + return Reflect.set(target, prop, value, receiver); + } + }); + } else { + return webResource; + } + } + exports2.toWebResourceLike = toWebResourceLike; + function toHttpHeadersLike(headers) { + return new HttpHeaders(headers.toJSON({ preserveCase: true })); + } + exports2.toHttpHeadersLike = toHttpHeadersLike; + function getHeaderKey(headerName) { + return headerName.toLowerCase(); + } + + class HttpHeaders { + constructor(rawHeaders) { + this._headersMap = {}; + if (rawHeaders) { + for (const headerName in rawHeaders) { + this.set(headerName, rawHeaders[headerName]); + } + } + } + set(headerName, headerValue) { + this._headersMap[getHeaderKey(headerName)] = { + name: headerName, + value: headerValue.toString() + }; + } + get(headerName) { + const header = this._headersMap[getHeaderKey(headerName)]; + return !header ? undefined : header.value; + } + contains(headerName) { + return !!this._headersMap[getHeaderKey(headerName)]; + } + remove(headerName) { + const result = this.contains(headerName); + delete this._headersMap[getHeaderKey(headerName)]; + return result; + } + rawHeaders() { + return this.toJson({ preserveCase: true }); + } + headersArray() { + const headers = []; + for (const headerKey in this._headersMap) { + headers.push(this._headersMap[headerKey]); + } + return headers; + } + headerNames() { + const headerNames = []; + const headers = this.headersArray(); + for (let i = 0;i < headers.length; ++i) { + headerNames.push(headers[i].name); + } + return headerNames; + } + headerValues() { + const headerValues = []; + const headers = this.headersArray(); + for (let i = 0;i < headers.length; ++i) { + headerValues.push(headers[i].value); + } + return headerValues; + } + toJson(options = {}) { + const result = {}; + if (options.preserveCase) { + for (const headerKey in this._headersMap) { + const header = this._headersMap[headerKey]; + result[header.name] = header.value; + } + } else { + for (const headerKey in this._headersMap) { + const header = this._headersMap[headerKey]; + result[getHeaderKey(header.name)] = header.value; + } + } + return result; + } + toString() { + return JSON.stringify(this.toJson({ preserveCase: true })); + } + clone() { + const resultPreservingCasing = {}; + for (const headerKey in this._headersMap) { + const header = this._headersMap[headerKey]; + resultPreservingCasing[header.name] = header.value; + } + return new HttpHeaders(resultPreservingCasing); + } + } + exports2.HttpHeaders = HttpHeaders; +}); + +// node_modules/@azure/core-http-compat/dist/commonjs/response.js +var require_response2 = __commonJS((exports2) => { + Object.defineProperty(exports2, "__esModule", { value: true }); + exports2.toPipelineResponse = exports2.toCompatResponse = undefined; + var core_rest_pipeline_1 = require_commonjs7(); + var util_js_1 = require_util9(); + var originalResponse = Symbol("Original FullOperationResponse"); + function toCompatResponse(response, options) { + let request = (0, util_js_1.toWebResourceLike)(response.request); + let headers = (0, util_js_1.toHttpHeadersLike)(response.headers); + if (options === null || options === undefined ? undefined : options.createProxy) { + return new Proxy(response, { + get(target, prop, receiver) { + if (prop === "headers") { + return headers; + } else if (prop === "request") { + return request; + } else if (prop === originalResponse) { + return response; + } + return Reflect.get(target, prop, receiver); + }, + set(target, prop, value, receiver) { + if (prop === "headers") { + headers = value; + } else if (prop === "request") { + request = value; + } + return Reflect.set(target, prop, value, receiver); + } + }); + } else { + return Object.assign(Object.assign({}, response), { + request, + headers + }); + } + } + exports2.toCompatResponse = toCompatResponse; + function toPipelineResponse(compatResponse) { + const extendedCompatResponse = compatResponse; + const response = extendedCompatResponse[originalResponse]; + const headers = (0, core_rest_pipeline_1.createHttpHeaders)(compatResponse.headers.toJson({ preserveCase: true })); + if (response) { + response.headers = headers; + return response; + } else { + return Object.assign(Object.assign({}, compatResponse), { headers, request: (0, util_js_1.toPipelineRequest)(compatResponse.request) }); + } + } + exports2.toPipelineResponse = toPipelineResponse; +}); + +// node_modules/@azure/core-http-compat/dist/commonjs/extendedClient.js +var require_extendedClient = __commonJS((exports2) => { + Object.defineProperty(exports2, "__esModule", { value: true }); + exports2.ExtendedServiceClient = undefined; + var disableKeepAlivePolicy_js_1 = require_disableKeepAlivePolicy(); + var core_rest_pipeline_1 = require_commonjs7(); + var core_client_1 = require_commonjs9(); + var response_js_1 = require_response2(); + + class ExtendedServiceClient extends core_client_1.ServiceClient { + constructor(options) { + var _a, _b; + super(options); + if (((_a = options.keepAliveOptions) === null || _a === undefined ? undefined : _a.enable) === false && !(0, disableKeepAlivePolicy_js_1.pipelineContainsDisableKeepAlivePolicy)(this.pipeline)) { + this.pipeline.addPolicy((0, disableKeepAlivePolicy_js_1.createDisableKeepAlivePolicy)()); + } + if (((_b = options.redirectOptions) === null || _b === undefined ? undefined : _b.handleRedirects) === false) { + this.pipeline.removePolicy({ + name: core_rest_pipeline_1.redirectPolicyName + }); + } + } + async sendOperationRequest(operationArguments, operationSpec) { + var _a; + const userProvidedCallBack = (_a = operationArguments === null || operationArguments === undefined ? undefined : operationArguments.options) === null || _a === undefined ? undefined : _a.onResponse; + let lastResponse; + function onResponse(rawResponse, flatResponse, error) { + lastResponse = rawResponse; + if (userProvidedCallBack) { + userProvidedCallBack(rawResponse, flatResponse, error); + } + } + operationArguments.options = Object.assign(Object.assign({}, operationArguments.options), { onResponse }); + const result = await super.sendOperationRequest(operationArguments, operationSpec); + if (lastResponse) { + Object.defineProperty(result, "_response", { + value: (0, response_js_1.toCompatResponse)(lastResponse) + }); + } + return result; + } + } + exports2.ExtendedServiceClient = ExtendedServiceClient; +}); + +// node_modules/@azure/core-http-compat/dist/commonjs/policies/requestPolicyFactoryPolicy.js +var require_requestPolicyFactoryPolicy = __commonJS((exports2) => { + Object.defineProperty(exports2, "__esModule", { value: true }); + exports2.createRequestPolicyFactoryPolicy = exports2.requestPolicyFactoryPolicyName = exports2.HttpPipelineLogLevel = undefined; + var util_js_1 = require_util9(); + var response_js_1 = require_response2(); + var HttpPipelineLogLevel; + (function(HttpPipelineLogLevel2) { + HttpPipelineLogLevel2[HttpPipelineLogLevel2["ERROR"] = 1] = "ERROR"; + HttpPipelineLogLevel2[HttpPipelineLogLevel2["INFO"] = 3] = "INFO"; + HttpPipelineLogLevel2[HttpPipelineLogLevel2["OFF"] = 0] = "OFF"; + HttpPipelineLogLevel2[HttpPipelineLogLevel2["WARNING"] = 2] = "WARNING"; + })(HttpPipelineLogLevel || (exports2.HttpPipelineLogLevel = HttpPipelineLogLevel = {})); + var mockRequestPolicyOptions = { + log(_logLevel, _message) { + }, + shouldLog(_logLevel) { + return false; + } + }; + exports2.requestPolicyFactoryPolicyName = "RequestPolicyFactoryPolicy"; + function createRequestPolicyFactoryPolicy(factories) { + const orderedFactories = factories.slice().reverse(); + return { + name: exports2.requestPolicyFactoryPolicyName, + async sendRequest(request, next) { + let httpPipeline = { + async sendRequest(httpRequest) { + const response2 = await next((0, util_js_1.toPipelineRequest)(httpRequest)); + return (0, response_js_1.toCompatResponse)(response2, { createProxy: true }); + } + }; + for (const factory of orderedFactories) { + httpPipeline = factory.create(httpPipeline, mockRequestPolicyOptions); + } + const webResourceLike = (0, util_js_1.toWebResourceLike)(request, { createProxy: true }); + const response = await httpPipeline.sendRequest(webResourceLike); + return (0, response_js_1.toPipelineResponse)(response); + } + }; + } + exports2.createRequestPolicyFactoryPolicy = createRequestPolicyFactoryPolicy; +}); + +// node_modules/@azure/core-http-compat/dist/commonjs/httpClientAdapter.js +var require_httpClientAdapter = __commonJS((exports2) => { + Object.defineProperty(exports2, "__esModule", { value: true }); + exports2.convertHttpClient = undefined; + var response_js_1 = require_response2(); + var util_js_1 = require_util9(); + function convertHttpClient(requestPolicyClient) { + return { + sendRequest: async (request) => { + const response = await requestPolicyClient.sendRequest((0, util_js_1.toWebResourceLike)(request, { createProxy: true })); + return (0, response_js_1.toPipelineResponse)(response); + } + }; + } + exports2.convertHttpClient = convertHttpClient; +}); + +// node_modules/@azure/core-http-compat/dist/commonjs/index.js +var require_commonjs10 = __commonJS((exports2) => { + Object.defineProperty(exports2, "__esModule", { value: true }); + exports2.toHttpHeadersLike = exports2.convertHttpClient = exports2.disableKeepAlivePolicyName = exports2.HttpPipelineLogLevel = exports2.createRequestPolicyFactoryPolicy = exports2.requestPolicyFactoryPolicyName = exports2.ExtendedServiceClient = undefined; + var extendedClient_js_1 = require_extendedClient(); + Object.defineProperty(exports2, "ExtendedServiceClient", { enumerable: true, get: function() { + return extendedClient_js_1.ExtendedServiceClient; + } }); + var requestPolicyFactoryPolicy_js_1 = require_requestPolicyFactoryPolicy(); + Object.defineProperty(exports2, "requestPolicyFactoryPolicyName", { enumerable: true, get: function() { + return requestPolicyFactoryPolicy_js_1.requestPolicyFactoryPolicyName; + } }); + Object.defineProperty(exports2, "createRequestPolicyFactoryPolicy", { enumerable: true, get: function() { + return requestPolicyFactoryPolicy_js_1.createRequestPolicyFactoryPolicy; + } }); + Object.defineProperty(exports2, "HttpPipelineLogLevel", { enumerable: true, get: function() { + return requestPolicyFactoryPolicy_js_1.HttpPipelineLogLevel; + } }); + var disableKeepAlivePolicy_js_1 = require_disableKeepAlivePolicy(); + Object.defineProperty(exports2, "disableKeepAlivePolicyName", { enumerable: true, get: function() { + return disableKeepAlivePolicy_js_1.disableKeepAlivePolicyName; + } }); + var httpClientAdapter_js_1 = require_httpClientAdapter(); + Object.defineProperty(exports2, "convertHttpClient", { enumerable: true, get: function() { + return httpClientAdapter_js_1.convertHttpClient; + } }); + var util_js_1 = require_util9(); + Object.defineProperty(exports2, "toHttpHeadersLike", { enumerable: true, get: function() { + return util_js_1.toHttpHeadersLike; + } }); +}); + +// node_modules/fast-xml-parser/src/util.js +var require_util10 = __commonJS((exports2) => { + var nameStartChar = ":A-Za-z_\\u00C0-\\u00D6\\u00D8-\\u00F6\\u00F8-\\u02FF\\u0370-\\u037D\\u037F-\\u1FFF\\u200C-\\u200D\\u2070-\\u218F\\u2C00-\\u2FEF\\u3001-\\uD7FF\\uF900-\\uFDCF\\uFDF0-\\uFFFD"; + var nameChar = nameStartChar + "\\-.\\d\\u00B7\\u0300-\\u036F\\u203F-\\u2040"; + var nameRegexp = "[" + nameStartChar + "][" + nameChar + "]*"; + var regexName = new RegExp("^" + nameRegexp + "$"); + var getAllMatches = function(string, regex) { + const matches = []; + let match = regex.exec(string); + while (match) { + const allmatches = []; + allmatches.startIndex = regex.lastIndex - match[0].length; + const len = match.length; + for (let index = 0;index < len; index++) { + allmatches.push(match[index]); + } + matches.push(allmatches); + match = regex.exec(string); + } + return matches; + }; + var isName = function(string) { + const match = regexName.exec(string); + return !(match === null || typeof match === "undefined"); + }; + exports2.isExist = function(v) { + return typeof v !== "undefined"; + }; + exports2.isEmptyObject = function(obj) { + return Object.keys(obj).length === 0; + }; + exports2.merge = function(target, a, arrayMode) { + if (a) { + const keys = Object.keys(a); + const len = keys.length; + for (let i = 0;i < len; i++) { + if (arrayMode === "strict") { + target[keys[i]] = [a[keys[i]]]; + } else { + target[keys[i]] = a[keys[i]]; + } + } + } + }; + exports2.getValue = function(v) { + if (exports2.isExist(v)) { + return v; + } else { + return ""; + } + }; + exports2.isName = isName; + exports2.getAllMatches = getAllMatches; + exports2.nameRegexp = nameRegexp; +}); + +// node_modules/fast-xml-parser/src/validator.js +var require_validator = __commonJS((exports2) => { + var util = require_util10(); + var defaultOptions = { + allowBooleanAttributes: false, + unpairedTags: [] + }; + exports2.validate = function(xmlData, options) { + options = Object.assign({}, defaultOptions, options); + const tags = []; + let tagFound = false; + let reachedRoot = false; + if (xmlData[0] === "\uFEFF") { + xmlData = xmlData.substr(1); + } + for (let i = 0;i < xmlData.length; i++) { + if (xmlData[i] === "<" && xmlData[i + 1] === "?") { + i += 2; + i = readPI(xmlData, i); + if (i.err) + return i; + } else if (xmlData[i] === "<") { + let tagStartPos = i; + i++; + if (xmlData[i] === "!") { + i = readCommentAndCDATA(xmlData, i); + continue; + } else { + let closingTag = false; + if (xmlData[i] === "/") { + closingTag = true; + i++; + } + let tagName = ""; + for (;i < xmlData.length && xmlData[i] !== ">" && xmlData[i] !== " " && xmlData[i] !== "\t" && xmlData[i] !== "\n" && xmlData[i] !== "\r"; i++) { + tagName += xmlData[i]; + } + tagName = tagName.trim(); + if (tagName[tagName.length - 1] === "/") { + tagName = tagName.substring(0, tagName.length - 1); + i--; + } + if (!validateTagName(tagName)) { + let msg; + if (tagName.trim().length === 0) { + msg = "Invalid space after '<'."; + } else { + msg = "Tag '" + tagName + "' is an invalid name."; + } + return getErrorObject("InvalidTag", msg, getLineNumberForPosition(xmlData, i)); + } + const result = readAttributeStr(xmlData, i); + if (result === false) { + return getErrorObject("InvalidAttr", "Attributes for '" + tagName + "' have open quote.", getLineNumberForPosition(xmlData, i)); + } + let attrStr = result.value; + i = result.index; + if (attrStr[attrStr.length - 1] === "/") { + const attrStrStart = i - attrStr.length; + attrStr = attrStr.substring(0, attrStr.length - 1); + const isValid = validateAttributeString(attrStr, options); + if (isValid === true) { + tagFound = true; + } else { + return getErrorObject(isValid.err.code, isValid.err.msg, getLineNumberForPosition(xmlData, attrStrStart + isValid.err.line)); + } + } else if (closingTag) { + if (!result.tagClosed) { + return getErrorObject("InvalidTag", "Closing tag '" + tagName + "' doesn't have proper closing.", getLineNumberForPosition(xmlData, i)); + } else if (attrStr.trim().length > 0) { + return getErrorObject("InvalidTag", "Closing tag '" + tagName + "' can't have attributes or invalid starting.", getLineNumberForPosition(xmlData, tagStartPos)); + } else if (tags.length === 0) { + return getErrorObject("InvalidTag", "Closing tag '" + tagName + "' has not been opened.", getLineNumberForPosition(xmlData, tagStartPos)); + } else { + const otg = tags.pop(); + if (tagName !== otg.tagName) { + let openPos = getLineNumberForPosition(xmlData, otg.tagStartPos); + return getErrorObject("InvalidTag", "Expected closing tag '" + otg.tagName + "' (opened in line " + openPos.line + ", col " + openPos.col + ") instead of closing tag '" + tagName + "'.", getLineNumberForPosition(xmlData, tagStartPos)); + } + if (tags.length == 0) { + reachedRoot = true; + } + } + } else { + const isValid = validateAttributeString(attrStr, options); + if (isValid !== true) { + return getErrorObject(isValid.err.code, isValid.err.msg, getLineNumberForPosition(xmlData, i - attrStr.length + isValid.err.line)); + } + if (reachedRoot === true) { + return getErrorObject("InvalidXml", "Multiple possible root nodes found.", getLineNumberForPosition(xmlData, i)); + } else if (options.unpairedTags.indexOf(tagName) !== -1) { + } else { + tags.push({ tagName, tagStartPos }); + } + tagFound = true; + } + for (i++;i < xmlData.length; i++) { + if (xmlData[i] === "<") { + if (xmlData[i + 1] === "!") { + i++; + i = readCommentAndCDATA(xmlData, i); + continue; + } else if (xmlData[i + 1] === "?") { + i = readPI(xmlData, ++i); + if (i.err) + return i; + } else { + break; + } + } else if (xmlData[i] === "&") { + const afterAmp = validateAmpersand(xmlData, i); + if (afterAmp == -1) + return getErrorObject("InvalidChar", "char '&' is not expected.", getLineNumberForPosition(xmlData, i)); + i = afterAmp; + } else { + if (reachedRoot === true && !isWhiteSpace(xmlData[i])) { + return getErrorObject("InvalidXml", "Extra text at the end", getLineNumberForPosition(xmlData, i)); + } + } + } + if (xmlData[i] === "<") { + i--; + } + } + } else { + if (isWhiteSpace(xmlData[i])) { + continue; + } + return getErrorObject("InvalidChar", "char '" + xmlData[i] + "' is not expected.", getLineNumberForPosition(xmlData, i)); + } + } + if (!tagFound) { + return getErrorObject("InvalidXml", "Start tag expected.", 1); + } else if (tags.length == 1) { + return getErrorObject("InvalidTag", "Unclosed tag '" + tags[0].tagName + "'.", getLineNumberForPosition(xmlData, tags[0].tagStartPos)); + } else if (tags.length > 0) { + return getErrorObject("InvalidXml", "Invalid '" + JSON.stringify(tags.map((t) => t.tagName), null, 4).replace(/\r?\n/g, "") + "' found.", { line: 1, col: 1 }); + } + return true; + }; + function isWhiteSpace(char) { + return char === " " || char === "\t" || char === "\n" || char === "\r"; + } + function readPI(xmlData, i) { + const start = i; + for (;i < xmlData.length; i++) { + if (xmlData[i] == "?" || xmlData[i] == " ") { + const tagname = xmlData.substr(start, i - start); + if (i > 5 && tagname === "xml") { + return getErrorObject("InvalidXml", "XML declaration allowed only at the start of the document.", getLineNumberForPosition(xmlData, i)); + } else if (xmlData[i] == "?" && xmlData[i + 1] == ">") { + i++; + break; + } else { + continue; + } + } + } + return i; + } + function readCommentAndCDATA(xmlData, i) { + if (xmlData.length > i + 5 && xmlData[i + 1] === "-" && xmlData[i + 2] === "-") { + for (i += 3;i < xmlData.length; i++) { + if (xmlData[i] === "-" && xmlData[i + 1] === "-" && xmlData[i + 2] === ">") { + i += 2; + break; + } + } + } else if (xmlData.length > i + 8 && xmlData[i + 1] === "D" && xmlData[i + 2] === "O" && xmlData[i + 3] === "C" && xmlData[i + 4] === "T" && xmlData[i + 5] === "Y" && xmlData[i + 6] === "P" && xmlData[i + 7] === "E") { + let angleBracketsCount = 1; + for (i += 8;i < xmlData.length; i++) { + if (xmlData[i] === "<") { + angleBracketsCount++; + } else if (xmlData[i] === ">") { + angleBracketsCount--; + if (angleBracketsCount === 0) { + break; + } + } + } + } else if (xmlData.length > i + 9 && xmlData[i + 1] === "[" && xmlData[i + 2] === "C" && xmlData[i + 3] === "D" && xmlData[i + 4] === "A" && xmlData[i + 5] === "T" && xmlData[i + 6] === "A" && xmlData[i + 7] === "[") { + for (i += 8;i < xmlData.length; i++) { + if (xmlData[i] === "]" && xmlData[i + 1] === "]" && xmlData[i + 2] === ">") { + i += 2; + break; + } + } + } + return i; + } + var doubleQuote = '"'; + var singleQuote = "'"; + function readAttributeStr(xmlData, i) { + let attrStr = ""; + let startChar = ""; + let tagClosed = false; + for (;i < xmlData.length; i++) { + if (xmlData[i] === doubleQuote || xmlData[i] === singleQuote) { + if (startChar === "") { + startChar = xmlData[i]; + } else if (startChar !== xmlData[i]) { + } else { + startChar = ""; + } + } else if (xmlData[i] === ">") { + if (startChar === "") { + tagClosed = true; + break; + } + } + attrStr += xmlData[i]; + } + if (startChar !== "") { + return false; + } + return { + value: attrStr, + index: i, + tagClosed + }; + } + var validAttrStrRegxp = new RegExp('(\\s*)([^\\s=]+)(\\s*=)?(\\s*([\'"])(([\\s\\S])*?)\\5)?', "g"); + function validateAttributeString(attrStr, options) { + const matches = util.getAllMatches(attrStr, validAttrStrRegxp); + const attrNames = {}; + for (let i = 0;i < matches.length; i++) { + if (matches[i][1].length === 0) { + return getErrorObject("InvalidAttr", "Attribute '" + matches[i][2] + "' has no space in starting.", getPositionFromMatch(matches[i])); + } else if (matches[i][3] !== undefined && matches[i][4] === undefined) { + return getErrorObject("InvalidAttr", "Attribute '" + matches[i][2] + "' is without value.", getPositionFromMatch(matches[i])); + } else if (matches[i][3] === undefined && !options.allowBooleanAttributes) { + return getErrorObject("InvalidAttr", "boolean attribute '" + matches[i][2] + "' is not allowed.", getPositionFromMatch(matches[i])); + } + const attrName = matches[i][2]; + if (!validateAttrName(attrName)) { + return getErrorObject("InvalidAttr", "Attribute '" + attrName + "' is an invalid name.", getPositionFromMatch(matches[i])); + } + if (!attrNames.hasOwnProperty(attrName)) { + attrNames[attrName] = 1; + } else { + return getErrorObject("InvalidAttr", "Attribute '" + attrName + "' is repeated.", getPositionFromMatch(matches[i])); + } + } + return true; + } + function validateNumberAmpersand(xmlData, i) { + let re = /\d/; + if (xmlData[i] === "x") { + i++; + re = /[\da-fA-F]/; + } + for (;i < xmlData.length; i++) { + if (xmlData[i] === ";") + return i; + if (!xmlData[i].match(re)) + break; + } + return -1; + } + function validateAmpersand(xmlData, i) { + i++; + if (xmlData[i] === ";") + return -1; + if (xmlData[i] === "#") { + i++; + return validateNumberAmpersand(xmlData, i); + } + let count = 0; + for (;i < xmlData.length; i++, count++) { + if (xmlData[i].match(/\w/) && count < 20) + continue; + if (xmlData[i] === ";") + break; + return -1; + } + return i; + } + function getErrorObject(code, message, lineNumber) { + return { + err: { + code, + msg: message, + line: lineNumber.line || lineNumber, + col: lineNumber.col + } + }; + } + function validateAttrName(attrName) { + return util.isName(attrName); + } + function validateTagName(tagname) { + return util.isName(tagname); + } + function getLineNumberForPosition(xmlData, index) { + const lines = xmlData.substring(0, index).split(/\r?\n/); + return { + line: lines.length, + col: lines[lines.length - 1].length + 1 + }; + } + function getPositionFromMatch(match) { + return match.startIndex + match[1].length; + } +}); + +// node_modules/fast-xml-parser/src/xmlparser/OptionsBuilder.js +var require_OptionsBuilder = __commonJS((exports2) => { + var defaultOptions = { + preserveOrder: false, + attributeNamePrefix: "@_", + attributesGroupName: false, + textNodeName: "#text", + ignoreAttributes: true, + removeNSPrefix: false, + allowBooleanAttributes: false, + parseTagValue: true, + parseAttributeValue: false, + trimValues: true, + cdataPropName: false, + numberParseOptions: { + hex: true, + leadingZeros: true, + eNotation: true + }, + tagValueProcessor: function(tagName, val2) { + return val2; + }, + attributeValueProcessor: function(attrName, val2) { + return val2; + }, + stopNodes: [], + alwaysCreateTextNode: false, + isArray: () => false, + commentPropName: false, + unpairedTags: [], + processEntities: true, + htmlEntities: false, + ignoreDeclaration: false, + ignorePiTags: false, + transformTagName: false, + transformAttributeName: false, + updateTag: function(tagName, jPath, attrs) { + return tagName; + } + }; + var buildOptions = function(options) { + return Object.assign({}, defaultOptions, options); + }; + exports2.buildOptions = buildOptions; + exports2.defaultOptions = defaultOptions; +}); + +// node_modules/fast-xml-parser/src/xmlparser/xmlNode.js +var require_xmlNode = __commonJS((exports2, module2) => { + class XmlNode { + constructor(tagname) { + this.tagname = tagname; + this.child = []; + this[":@"] = {}; + } + add(key, val2) { + if (key === "__proto__") + key = "#__proto__"; + this.child.push({ [key]: val2 }); + } + addChild(node) { + if (node.tagname === "__proto__") + node.tagname = "#__proto__"; + if (node[":@"] && Object.keys(node[":@"]).length > 0) { + this.child.push({ [node.tagname]: node.child, [":@"]: node[":@"] }); + } else { + this.child.push({ [node.tagname]: node.child }); + } + } + } + module2.exports = XmlNode; +}); + +// node_modules/fast-xml-parser/src/xmlparser/DocTypeReader.js +var require_DocTypeReader = __commonJS((exports2, module2) => { + var util = require_util10(); + function readDocType(xmlData, i) { + const entities = {}; + if (xmlData[i + 3] === "O" && xmlData[i + 4] === "C" && xmlData[i + 5] === "T" && xmlData[i + 6] === "Y" && xmlData[i + 7] === "P" && xmlData[i + 8] === "E") { + i = i + 9; + let angleBracketsCount = 1; + let hasBody = false, comment = false; + let exp = ""; + for (;i < xmlData.length; i++) { + if (xmlData[i] === "<" && !comment) { + if (hasBody && isEntity(xmlData, i)) { + i += 7; + [entityName, val, i] = readEntityExp(xmlData, i + 1); + if (val.indexOf("&") === -1) + entities[validateEntityName(entityName)] = { + regx: RegExp(`&${entityName};`, "g"), + val + }; + } else if (hasBody && isElement(xmlData, i)) + i += 8; + else if (hasBody && isAttlist(xmlData, i)) + i += 8; + else if (hasBody && isNotation(xmlData, i)) + i += 9; + else if (isComment) + comment = true; + else + throw new Error("Invalid DOCTYPE"); + angleBracketsCount++; + exp = ""; + } else if (xmlData[i] === ">") { + if (comment) { + if (xmlData[i - 1] === "-" && xmlData[i - 2] === "-") { + comment = false; + angleBracketsCount--; + } + } else { + angleBracketsCount--; + } + if (angleBracketsCount === 0) { + break; + } + } else if (xmlData[i] === "[") { + hasBody = true; + } else { + exp += xmlData[i]; + } + } + if (angleBracketsCount !== 0) { + throw new Error(`Unclosed DOCTYPE`); + } + } else { + throw new Error(`Invalid Tag instead of DOCTYPE`); + } + return { entities, i }; + } + function readEntityExp(xmlData, i) { + let entityName2 = ""; + for (;i < xmlData.length && (xmlData[i] !== "'" && xmlData[i] !== '"'); i++) { + entityName2 += xmlData[i]; + } + entityName2 = entityName2.trim(); + if (entityName2.indexOf(" ") !== -1) + throw new Error("External entites are not supported"); + const startChar = xmlData[i++]; + let val2 = ""; + for (;i < xmlData.length && xmlData[i] !== startChar; i++) { + val2 += xmlData[i]; + } + return [entityName2, val2, i]; + } + function isComment(xmlData, i) { + if (xmlData[i + 1] === "!" && xmlData[i + 2] === "-" && xmlData[i + 3] === "-") + return true; + return false; + } + function isEntity(xmlData, i) { + if (xmlData[i + 1] === "!" && xmlData[i + 2] === "E" && xmlData[i + 3] === "N" && xmlData[i + 4] === "T" && xmlData[i + 5] === "I" && xmlData[i + 6] === "T" && xmlData[i + 7] === "Y") + return true; + return false; + } + function isElement(xmlData, i) { + if (xmlData[i + 1] === "!" && xmlData[i + 2] === "E" && xmlData[i + 3] === "L" && xmlData[i + 4] === "E" && xmlData[i + 5] === "M" && xmlData[i + 6] === "E" && xmlData[i + 7] === "N" && xmlData[i + 8] === "T") + return true; + return false; + } + function isAttlist(xmlData, i) { + if (xmlData[i + 1] === "!" && xmlData[i + 2] === "A" && xmlData[i + 3] === "T" && xmlData[i + 4] === "T" && xmlData[i + 5] === "L" && xmlData[i + 6] === "I" && xmlData[i + 7] === "S" && xmlData[i + 8] === "T") + return true; + return false; + } + function isNotation(xmlData, i) { + if (xmlData[i + 1] === "!" && xmlData[i + 2] === "N" && xmlData[i + 3] === "O" && xmlData[i + 4] === "T" && xmlData[i + 5] === "A" && xmlData[i + 6] === "T" && xmlData[i + 7] === "I" && xmlData[i + 8] === "O" && xmlData[i + 9] === "N") + return true; + return false; + } + function validateEntityName(name) { + if (util.isName(name)) + return name; + else + throw new Error(`Invalid entity name ${name}`); + } + module2.exports = readDocType; +}); + +// node_modules/strnum/strnum.js +var require_strnum = __commonJS((exports2, module2) => { + var hexRegex = /^[-+]?0x[a-fA-F0-9]+$/; + var numRegex = /^([\-\+])?(0*)(\.[0-9]+([eE]\-?[0-9]+)?|[0-9]+(\.[0-9]+([eE]\-?[0-9]+)?)?)$/; + if (!Number.parseInt && window.parseInt) { + Number.parseInt = window.parseInt; + } + if (!Number.parseFloat && window.parseFloat) { + Number.parseFloat = window.parseFloat; + } + var consider = { + hex: true, + leadingZeros: true, + decimalPoint: ".", + eNotation: true + }; + function toNumber(str, options = {}) { + options = Object.assign({}, consider, options); + if (!str || typeof str !== "string") + return str; + let trimmedStr = str.trim(); + if (options.skipLike !== undefined && options.skipLike.test(trimmedStr)) + return str; + else if (options.hex && hexRegex.test(trimmedStr)) { + return Number.parseInt(trimmedStr, 16); + } else { + const match = numRegex.exec(trimmedStr); + if (match) { + const sign = match[1]; + const leadingZeros = match[2]; + let numTrimmedByZeros = trimZeros(match[3]); + const eNotation = match[4] || match[6]; + if (!options.leadingZeros && leadingZeros.length > 0 && sign && trimmedStr[2] !== ".") + return str; + else if (!options.leadingZeros && leadingZeros.length > 0 && !sign && trimmedStr[1] !== ".") + return str; + else { + const num = Number(trimmedStr); + const numStr = "" + num; + if (numStr.search(/[eE]/) !== -1) { + if (options.eNotation) + return num; + else + return str; + } else if (eNotation) { + if (options.eNotation) + return num; + else + return str; + } else if (trimmedStr.indexOf(".") !== -1) { + if (numStr === "0" && numTrimmedByZeros === "") + return num; + else if (numStr === numTrimmedByZeros) + return num; + else if (sign && numStr === "-" + numTrimmedByZeros) + return num; + else + return str; + } + if (leadingZeros) { + if (numTrimmedByZeros === numStr) + return num; + else if (sign + numTrimmedByZeros === numStr) + return num; + else + return str; + } + if (trimmedStr === numStr) + return num; + else if (trimmedStr === sign + numStr) + return num; + return str; + } + } else { + return str; + } + } + } + function trimZeros(numStr) { + if (numStr && numStr.indexOf(".") !== -1) { + numStr = numStr.replace(/0+$/, ""); + if (numStr === ".") + numStr = "0"; + else if (numStr[0] === ".") + numStr = "0" + numStr; + else if (numStr[numStr.length - 1] === ".") + numStr = numStr.substr(0, numStr.length - 1); + return numStr; + } + return numStr; + } + module2.exports = toNumber; +}); + +// node_modules/fast-xml-parser/src/ignoreAttributes.js +var require_ignoreAttributes = __commonJS((exports2, module2) => { + function getIgnoreAttributesFn(ignoreAttributes) { + if (typeof ignoreAttributes === "function") { + return ignoreAttributes; + } + if (Array.isArray(ignoreAttributes)) { + return (attrName) => { + for (const pattern of ignoreAttributes) { + if (typeof pattern === "string" && attrName === pattern) { + return true; + } + if (pattern instanceof RegExp && pattern.test(attrName)) { + return true; + } + } + }; + } + return () => false; + } + module2.exports = getIgnoreAttributesFn; +}); + +// node_modules/fast-xml-parser/src/xmlparser/OrderedObjParser.js +var require_OrderedObjParser = __commonJS((exports2, module2) => { + var util = require_util10(); + var xmlNode = require_xmlNode(); + var readDocType = require_DocTypeReader(); + var toNumber = require_strnum(); + var getIgnoreAttributesFn = require_ignoreAttributes(); + + class OrderedObjParser { + constructor(options) { + this.options = options; + this.currentNode = null; + this.tagsNodeStack = []; + this.docTypeEntities = {}; + this.lastEntities = { + apos: { regex: /&(apos|#39|#x27);/g, val: "'" }, + gt: { regex: /&(gt|#62|#x3E);/g, val: ">" }, + lt: { regex: /&(lt|#60|#x3C);/g, val: "<" }, + quot: { regex: /&(quot|#34|#x22);/g, val: "\"" } + }; + this.ampEntity = { regex: /&(amp|#38|#x26);/g, val: "&" }; + this.htmlEntities = { + space: { regex: /&(nbsp|#160);/g, val: " " }, + cent: { regex: /&(cent|#162);/g, val: "\xA2" }, + pound: { regex: /&(pound|#163);/g, val: "\xA3" }, + yen: { regex: /&(yen|#165);/g, val: "\xA5" }, + euro: { regex: /&(euro|#8364);/g, val: "\u20AC" }, + copyright: { regex: /&(copy|#169);/g, val: "\xA9" }, + reg: { regex: /&(reg|#174);/g, val: "\xAE" }, + inr: { regex: /&(inr|#8377);/g, val: "\u20B9" }, + num_dec: { regex: /&#([0-9]{1,7});/g, val: (_2, str) => String.fromCharCode(Number.parseInt(str, 10)) }, + num_hex: { regex: /&#x([0-9a-fA-F]{1,6});/g, val: (_2, str) => String.fromCharCode(Number.parseInt(str, 16)) } + }; + this.addExternalEntities = addExternalEntities; + this.parseXml = parseXml; + this.parseTextData = parseTextData; + this.resolveNameSpace = resolveNameSpace; + this.buildAttributesMap = buildAttributesMap; + this.isItStopNode = isItStopNode; + this.replaceEntitiesValue = replaceEntitiesValue; + this.readStopNodeData = readStopNodeData; + this.saveTextToParentTag = saveTextToParentTag; + this.addChild = addChild; + this.ignoreAttributesFn = getIgnoreAttributesFn(this.options.ignoreAttributes); + } + } + function addExternalEntities(externalEntities) { + const entKeys = Object.keys(externalEntities); + for (let i = 0;i < entKeys.length; i++) { + const ent = entKeys[i]; + this.lastEntities[ent] = { + regex: new RegExp("&" + ent + ";", "g"), + val: externalEntities[ent] + }; + } + } + function parseTextData(val2, tagName, jPath, dontTrim, hasAttributes, isLeafNode, escapeEntities) { + if (val2 !== undefined) { + if (this.options.trimValues && !dontTrim) { + val2 = val2.trim(); + } + if (val2.length > 0) { + if (!escapeEntities) + val2 = this.replaceEntitiesValue(val2); + const newval = this.options.tagValueProcessor(tagName, val2, jPath, hasAttributes, isLeafNode); + if (newval === null || newval === undefined) { + return val2; + } else if (typeof newval !== typeof val2 || newval !== val2) { + return newval; + } else if (this.options.trimValues) { + return parseValue(val2, this.options.parseTagValue, this.options.numberParseOptions); + } else { + const trimmedVal = val2.trim(); + if (trimmedVal === val2) { + return parseValue(val2, this.options.parseTagValue, this.options.numberParseOptions); + } else { + return val2; + } + } + } + } + } + function resolveNameSpace(tagname) { + if (this.options.removeNSPrefix) { + const tags = tagname.split(":"); + const prefix = tagname.charAt(0) === "/" ? "/" : ""; + if (tags[0] === "xmlns") { + return ""; + } + if (tags.length === 2) { + tagname = prefix + tags[1]; + } + } + return tagname; + } + var attrsRegx = new RegExp('([^\\s=]+)\\s*(=\\s*([\'"])([\\s\\S]*?)\\3)?', "gm"); + function buildAttributesMap(attrStr, jPath, tagName) { + if (this.options.ignoreAttributes !== true && typeof attrStr === "string") { + const matches = util.getAllMatches(attrStr, attrsRegx); + const len = matches.length; + const attrs = {}; + for (let i = 0;i < len; i++) { + const attrName = this.resolveNameSpace(matches[i][1]); + if (this.ignoreAttributesFn(attrName, jPath)) { + continue; + } + let oldVal = matches[i][4]; + let aName = this.options.attributeNamePrefix + attrName; + if (attrName.length) { + if (this.options.transformAttributeName) { + aName = this.options.transformAttributeName(aName); + } + if (aName === "__proto__") + aName = "#__proto__"; + if (oldVal !== undefined) { + if (this.options.trimValues) { + oldVal = oldVal.trim(); + } + oldVal = this.replaceEntitiesValue(oldVal); + const newVal = this.options.attributeValueProcessor(attrName, oldVal, jPath); + if (newVal === null || newVal === undefined) { + attrs[aName] = oldVal; + } else if (typeof newVal !== typeof oldVal || newVal !== oldVal) { + attrs[aName] = newVal; + } else { + attrs[aName] = parseValue(oldVal, this.options.parseAttributeValue, this.options.numberParseOptions); + } + } else if (this.options.allowBooleanAttributes) { + attrs[aName] = true; + } + } + } + if (!Object.keys(attrs).length) { + return; + } + if (this.options.attributesGroupName) { + const attrCollection = {}; + attrCollection[this.options.attributesGroupName] = attrs; + return attrCollection; + } + return attrs; + } + } + var parseXml = function(xmlData) { + xmlData = xmlData.replace(/\r\n?/g, "\n"); + const xmlObj = new xmlNode("!xml"); + let currentNode = xmlObj; + let textData = ""; + let jPath = ""; + for (let i = 0;i < xmlData.length; i++) { + const ch = xmlData[i]; + if (ch === "<") { + if (xmlData[i + 1] === "/") { + const closeIndex = findClosingIndex(xmlData, ">", i, "Closing Tag is not closed."); + let tagName = xmlData.substring(i + 2, closeIndex).trim(); + if (this.options.removeNSPrefix) { + const colonIndex = tagName.indexOf(":"); + if (colonIndex !== -1) { + tagName = tagName.substr(colonIndex + 1); + } + } + if (this.options.transformTagName) { + tagName = this.options.transformTagName(tagName); + } + if (currentNode) { + textData = this.saveTextToParentTag(textData, currentNode, jPath); + } + const lastTagName = jPath.substring(jPath.lastIndexOf(".") + 1); + if (tagName && this.options.unpairedTags.indexOf(tagName) !== -1) { + throw new Error(`Unpaired tag can not be used as closing tag: `); + } + let propIndex = 0; + if (lastTagName && this.options.unpairedTags.indexOf(lastTagName) !== -1) { + propIndex = jPath.lastIndexOf(".", jPath.lastIndexOf(".") - 1); + this.tagsNodeStack.pop(); + } else { + propIndex = jPath.lastIndexOf("."); + } + jPath = jPath.substring(0, propIndex); + currentNode = this.tagsNodeStack.pop(); + textData = ""; + i = closeIndex; + } else if (xmlData[i + 1] === "?") { + let tagData = readTagExp(xmlData, i, false, "?>"); + if (!tagData) + throw new Error("Pi Tag is not closed."); + textData = this.saveTextToParentTag(textData, currentNode, jPath); + if (this.options.ignoreDeclaration && tagData.tagName === "?xml" || this.options.ignorePiTags) { + } else { + const childNode = new xmlNode(tagData.tagName); + childNode.add(this.options.textNodeName, ""); + if (tagData.tagName !== tagData.tagExp && tagData.attrExpPresent) { + childNode[":@"] = this.buildAttributesMap(tagData.tagExp, jPath, tagData.tagName); + } + this.addChild(currentNode, childNode, jPath); + } + i = tagData.closeIndex + 1; + } else if (xmlData.substr(i + 1, 3) === "!--") { + const endIndex = findClosingIndex(xmlData, "-->", i + 4, "Comment is not closed."); + if (this.options.commentPropName) { + const comment = xmlData.substring(i + 4, endIndex - 2); + textData = this.saveTextToParentTag(textData, currentNode, jPath); + currentNode.add(this.options.commentPropName, [{ [this.options.textNodeName]: comment }]); + } + i = endIndex; + } else if (xmlData.substr(i + 1, 2) === "!D") { + const result = readDocType(xmlData, i); + this.docTypeEntities = result.entities; + i = result.i; + } else if (xmlData.substr(i + 1, 2) === "![") { + const closeIndex = findClosingIndex(xmlData, "]]>", i, "CDATA is not closed.") - 2; + const tagExp = xmlData.substring(i + 9, closeIndex); + textData = this.saveTextToParentTag(textData, currentNode, jPath); + let val2 = this.parseTextData(tagExp, currentNode.tagname, jPath, true, false, true, true); + if (val2 == undefined) + val2 = ""; + if (this.options.cdataPropName) { + currentNode.add(this.options.cdataPropName, [{ [this.options.textNodeName]: tagExp }]); + } else { + currentNode.add(this.options.textNodeName, val2); + } + i = closeIndex + 2; + } else { + let result = readTagExp(xmlData, i, this.options.removeNSPrefix); + let tagName = result.tagName; + const rawTagName = result.rawTagName; + let tagExp = result.tagExp; + let attrExpPresent = result.attrExpPresent; + let closeIndex = result.closeIndex; + if (this.options.transformTagName) { + tagName = this.options.transformTagName(tagName); + } + if (currentNode && textData) { + if (currentNode.tagname !== "!xml") { + textData = this.saveTextToParentTag(textData, currentNode, jPath, false); + } + } + const lastTag = currentNode; + if (lastTag && this.options.unpairedTags.indexOf(lastTag.tagname) !== -1) { + currentNode = this.tagsNodeStack.pop(); + jPath = jPath.substring(0, jPath.lastIndexOf(".")); + } + if (tagName !== xmlObj.tagname) { + jPath += jPath ? "." + tagName : tagName; + } + if (this.isItStopNode(this.options.stopNodes, jPath, tagName)) { + let tagContent = ""; + if (tagExp.length > 0 && tagExp.lastIndexOf("/") === tagExp.length - 1) { + if (tagName[tagName.length - 1] === "/") { + tagName = tagName.substr(0, tagName.length - 1); + jPath = jPath.substr(0, jPath.length - 1); + tagExp = tagName; + } else { + tagExp = tagExp.substr(0, tagExp.length - 1); + } + i = result.closeIndex; + } else if (this.options.unpairedTags.indexOf(tagName) !== -1) { + i = result.closeIndex; + } else { + const result2 = this.readStopNodeData(xmlData, rawTagName, closeIndex + 1); + if (!result2) + throw new Error(`Unexpected end of ${rawTagName}`); + i = result2.i; + tagContent = result2.tagContent; + } + const childNode = new xmlNode(tagName); + if (tagName !== tagExp && attrExpPresent) { + childNode[":@"] = this.buildAttributesMap(tagExp, jPath, tagName); + } + if (tagContent) { + tagContent = this.parseTextData(tagContent, tagName, jPath, true, attrExpPresent, true, true); + } + jPath = jPath.substr(0, jPath.lastIndexOf(".")); + childNode.add(this.options.textNodeName, tagContent); + this.addChild(currentNode, childNode, jPath); + } else { + if (tagExp.length > 0 && tagExp.lastIndexOf("/") === tagExp.length - 1) { + if (tagName[tagName.length - 1] === "/") { + tagName = tagName.substr(0, tagName.length - 1); + jPath = jPath.substr(0, jPath.length - 1); + tagExp = tagName; + } else { + tagExp = tagExp.substr(0, tagExp.length - 1); + } + if (this.options.transformTagName) { + tagName = this.options.transformTagName(tagName); + } + const childNode = new xmlNode(tagName); + if (tagName !== tagExp && attrExpPresent) { + childNode[":@"] = this.buildAttributesMap(tagExp, jPath, tagName); + } + this.addChild(currentNode, childNode, jPath); + jPath = jPath.substr(0, jPath.lastIndexOf(".")); + } else { + const childNode = new xmlNode(tagName); + this.tagsNodeStack.push(currentNode); + if (tagName !== tagExp && attrExpPresent) { + childNode[":@"] = this.buildAttributesMap(tagExp, jPath, tagName); + } + this.addChild(currentNode, childNode, jPath); + currentNode = childNode; + } + textData = ""; + i = closeIndex; + } + } + } else { + textData += xmlData[i]; + } + } + return xmlObj.child; + }; + function addChild(currentNode, childNode, jPath) { + const result = this.options.updateTag(childNode.tagname, jPath, childNode[":@"]); + if (result === false) { + } else if (typeof result === "string") { + childNode.tagname = result; + currentNode.addChild(childNode); + } else { + currentNode.addChild(childNode); + } + } + var replaceEntitiesValue = function(val2) { + if (this.options.processEntities) { + for (let entityName2 in this.docTypeEntities) { + const entity = this.docTypeEntities[entityName2]; + val2 = val2.replace(entity.regx, entity.val); + } + for (let entityName2 in this.lastEntities) { + const entity = this.lastEntities[entityName2]; + val2 = val2.replace(entity.regex, entity.val); + } + if (this.options.htmlEntities) { + for (let entityName2 in this.htmlEntities) { + const entity = this.htmlEntities[entityName2]; + val2 = val2.replace(entity.regex, entity.val); + } + } + val2 = val2.replace(this.ampEntity.regex, this.ampEntity.val); + } + return val2; + }; + function saveTextToParentTag(textData, currentNode, jPath, isLeafNode) { + if (textData) { + if (isLeafNode === undefined) + isLeafNode = Object.keys(currentNode.child).length === 0; + textData = this.parseTextData(textData, currentNode.tagname, jPath, false, currentNode[":@"] ? Object.keys(currentNode[":@"]).length !== 0 : false, isLeafNode); + if (textData !== undefined && textData !== "") + currentNode.add(this.options.textNodeName, textData); + textData = ""; + } + return textData; + } + function isItStopNode(stopNodes, jPath, currentTagName) { + const allNodesExp = "*." + currentTagName; + for (const stopNodePath in stopNodes) { + const stopNodeExp = stopNodes[stopNodePath]; + if (allNodesExp === stopNodeExp || jPath === stopNodeExp) + return true; + } + return false; + } + function tagExpWithClosingIndex(xmlData, i, closingChar = ">") { + let attrBoundary; + let tagExp = ""; + for (let index = i;index < xmlData.length; index++) { + let ch = xmlData[index]; + if (attrBoundary) { + if (ch === attrBoundary) + attrBoundary = ""; + } else if (ch === '"' || ch === "'") { + attrBoundary = ch; + } else if (ch === closingChar[0]) { + if (closingChar[1]) { + if (xmlData[index + 1] === closingChar[1]) { + return { + data: tagExp, + index + }; + } + } else { + return { + data: tagExp, + index + }; + } + } else if (ch === "\t") { + ch = " "; + } + tagExp += ch; + } + } + function findClosingIndex(xmlData, str, i, errMsg) { + const closingIndex = xmlData.indexOf(str, i); + if (closingIndex === -1) { + throw new Error(errMsg); + } else { + return closingIndex + str.length - 1; + } + } + function readTagExp(xmlData, i, removeNSPrefix, closingChar = ">") { + const result = tagExpWithClosingIndex(xmlData, i + 1, closingChar); + if (!result) + return; + let tagExp = result.data; + const closeIndex = result.index; + const separatorIndex = tagExp.search(/\s/); + let tagName = tagExp; + let attrExpPresent = true; + if (separatorIndex !== -1) { + tagName = tagExp.substring(0, separatorIndex); + tagExp = tagExp.substring(separatorIndex + 1).trimStart(); + } + const rawTagName = tagName; + if (removeNSPrefix) { + const colonIndex = tagName.indexOf(":"); + if (colonIndex !== -1) { + tagName = tagName.substr(colonIndex + 1); + attrExpPresent = tagName !== result.data.substr(colonIndex + 1); + } + } + return { + tagName, + tagExp, + closeIndex, + attrExpPresent, + rawTagName + }; + } + function readStopNodeData(xmlData, tagName, i) { + const startIndex = i; + let openTagCount = 1; + for (;i < xmlData.length; i++) { + if (xmlData[i] === "<") { + if (xmlData[i + 1] === "/") { + const closeIndex = findClosingIndex(xmlData, ">", i, `${tagName} is not closed`); + let closeTagName = xmlData.substring(i + 2, closeIndex).trim(); + if (closeTagName === tagName) { + openTagCount--; + if (openTagCount === 0) { + return { + tagContent: xmlData.substring(startIndex, i), + i: closeIndex + }; + } + } + i = closeIndex; + } else if (xmlData[i + 1] === "?") { + const closeIndex = findClosingIndex(xmlData, "?>", i + 1, "StopNode is not closed."); + i = closeIndex; + } else if (xmlData.substr(i + 1, 3) === "!--") { + const closeIndex = findClosingIndex(xmlData, "-->", i + 3, "StopNode is not closed."); + i = closeIndex; + } else if (xmlData.substr(i + 1, 2) === "![") { + const closeIndex = findClosingIndex(xmlData, "]]>", i, "StopNode is not closed.") - 2; + i = closeIndex; + } else { + const tagData = readTagExp(xmlData, i, ">"); + if (tagData) { + const openTagName = tagData && tagData.tagName; + if (openTagName === tagName && tagData.tagExp[tagData.tagExp.length - 1] !== "/") { + openTagCount++; + } + i = tagData.closeIndex; + } + } + } + } + } + function parseValue(val2, shouldParse, options) { + if (shouldParse && typeof val2 === "string") { + const newval = val2.trim(); + if (newval === "true") + return true; + else if (newval === "false") + return false; + else + return toNumber(val2, options); + } else { + if (util.isExist(val2)) { + return val2; + } else { + return ""; + } + } + } + module2.exports = OrderedObjParser; +}); + +// node_modules/fast-xml-parser/src/xmlparser/node2json.js +var require_node2json = __commonJS((exports2) => { + function prettify(node, options) { + return compress(node, options); + } + function compress(arr, options, jPath) { + let text; + const compressedObj = {}; + for (let i = 0;i < arr.length; i++) { + const tagObj = arr[i]; + const property = propName(tagObj); + let newJpath = ""; + if (jPath === undefined) + newJpath = property; + else + newJpath = jPath + "." + property; + if (property === options.textNodeName) { + if (text === undefined) + text = tagObj[property]; + else + text += "" + tagObj[property]; + } else if (property === undefined) { + continue; + } else if (tagObj[property]) { + let val2 = compress(tagObj[property], options, newJpath); + const isLeaf = isLeafTag(val2, options); + if (tagObj[":@"]) { + assignAttributes(val2, tagObj[":@"], newJpath, options); + } else if (Object.keys(val2).length === 1 && val2[options.textNodeName] !== undefined && !options.alwaysCreateTextNode) { + val2 = val2[options.textNodeName]; + } else if (Object.keys(val2).length === 0) { + if (options.alwaysCreateTextNode) + val2[options.textNodeName] = ""; + else + val2 = ""; + } + if (compressedObj[property] !== undefined && compressedObj.hasOwnProperty(property)) { + if (!Array.isArray(compressedObj[property])) { + compressedObj[property] = [compressedObj[property]]; + } + compressedObj[property].push(val2); + } else { + if (options.isArray(property, newJpath, isLeaf)) { + compressedObj[property] = [val2]; + } else { + compressedObj[property] = val2; + } + } + } + } + if (typeof text === "string") { + if (text.length > 0) + compressedObj[options.textNodeName] = text; + } else if (text !== undefined) + compressedObj[options.textNodeName] = text; + return compressedObj; + } + function propName(obj) { + const keys = Object.keys(obj); + for (let i = 0;i < keys.length; i++) { + const key = keys[i]; + if (key !== ":@") + return key; + } + } + function assignAttributes(obj, attrMap, jpath, options) { + if (attrMap) { + const keys = Object.keys(attrMap); + const len = keys.length; + for (let i = 0;i < len; i++) { + const atrrName = keys[i]; + if (options.isArray(atrrName, jpath + "." + atrrName, true, true)) { + obj[atrrName] = [attrMap[atrrName]]; + } else { + obj[atrrName] = attrMap[atrrName]; + } + } + } + } + function isLeafTag(obj, options) { + const { textNodeName } = options; + const propCount = Object.keys(obj).length; + if (propCount === 0) { + return true; + } + if (propCount === 1 && (obj[textNodeName] || typeof obj[textNodeName] === "boolean" || obj[textNodeName] === 0)) { + return true; + } + return false; + } + exports2.prettify = prettify; +}); + +// node_modules/fast-xml-parser/src/xmlparser/XMLParser.js +var require_XMLParser = __commonJS((exports2, module2) => { + var { buildOptions } = require_OptionsBuilder(); + var OrderedObjParser = require_OrderedObjParser(); + var { prettify } = require_node2json(); + var validator = require_validator(); + + class XMLParser { + constructor(options) { + this.externalEntities = {}; + this.options = buildOptions(options); + } + parse(xmlData, validationOption) { + if (typeof xmlData === "string") { + } else if (xmlData.toString) { + xmlData = xmlData.toString(); + } else { + throw new Error("XML data is accepted in String or Bytes[] form."); + } + if (validationOption) { + if (validationOption === true) + validationOption = {}; + const result = validator.validate(xmlData, validationOption); + if (result !== true) { + throw Error(`${result.err.msg}:${result.err.line}:${result.err.col}`); + } + } + const orderedObjParser = new OrderedObjParser(this.options); + orderedObjParser.addExternalEntities(this.externalEntities); + const orderedResult = orderedObjParser.parseXml(xmlData); + if (this.options.preserveOrder || orderedResult === undefined) + return orderedResult; + else + return prettify(orderedResult, this.options); + } + addEntity(key, value) { + if (value.indexOf("&") !== -1) { + throw new Error("Entity value can't have '&'"); + } else if (key.indexOf("&") !== -1 || key.indexOf(";") !== -1) { + throw new Error("An entity must be set without '&' and ';'. Eg. use '#xD' for ' '"); + } else if (value === "&") { + throw new Error("An entity with value '&' is not permitted"); + } else { + this.externalEntities[key] = value; + } + } + } + module2.exports = XMLParser; +}); + +// node_modules/fast-xml-parser/src/xmlbuilder/orderedJs2Xml.js +var require_orderedJs2Xml = __commonJS((exports2, module2) => { + var EOL = "\n"; + function toXml(jArray, options) { + let indentation = ""; + if (options.format && options.indentBy.length > 0) { + indentation = EOL; + } + return arrToStr(jArray, options, "", indentation); + } + function arrToStr(arr, options, jPath, indentation) { + let xmlStr = ""; + let isPreviousElementTag = false; + for (let i = 0;i < arr.length; i++) { + const tagObj = arr[i]; + const tagName = propName(tagObj); + if (tagName === undefined) + continue; + let newJPath = ""; + if (jPath.length === 0) + newJPath = tagName; + else + newJPath = `${jPath}.${tagName}`; + if (tagName === options.textNodeName) { + let tagText = tagObj[tagName]; + if (!isStopNode(newJPath, options)) { + tagText = options.tagValueProcessor(tagName, tagText); + tagText = replaceEntitiesValue(tagText, options); + } + if (isPreviousElementTag) { + xmlStr += indentation; + } + xmlStr += tagText; + isPreviousElementTag = false; + continue; + } else if (tagName === options.cdataPropName) { + if (isPreviousElementTag) { + xmlStr += indentation; + } + xmlStr += ``; + isPreviousElementTag = false; + continue; + } else if (tagName === options.commentPropName) { + xmlStr += indentation + ``; + isPreviousElementTag = true; + continue; + } else if (tagName[0] === "?") { + const attStr2 = attr_to_str(tagObj[":@"], options); + const tempInd = tagName === "?xml" ? "" : indentation; + let piTextNodeName = tagObj[tagName][0][options.textNodeName]; + piTextNodeName = piTextNodeName.length !== 0 ? " " + piTextNodeName : ""; + xmlStr += tempInd + `<${tagName}${piTextNodeName}${attStr2}?>`; + isPreviousElementTag = true; + continue; + } + let newIdentation = indentation; + if (newIdentation !== "") { + newIdentation += options.indentBy; + } + const attStr = attr_to_str(tagObj[":@"], options); + const tagStart = indentation + `<${tagName}${attStr}`; + const tagValue = arrToStr(tagObj[tagName], options, newJPath, newIdentation); + if (options.unpairedTags.indexOf(tagName) !== -1) { + if (options.suppressUnpairedNode) + xmlStr += tagStart + ">"; + else + xmlStr += tagStart + "/>"; + } else if ((!tagValue || tagValue.length === 0) && options.suppressEmptyNode) { + xmlStr += tagStart + "/>"; + } else if (tagValue && tagValue.endsWith(">")) { + xmlStr += tagStart + `>${tagValue}${indentation}`; + } else { + xmlStr += tagStart + ">"; + if (tagValue && indentation !== "" && (tagValue.includes("/>") || tagValue.includes("`; + } + isPreviousElementTag = true; + } + return xmlStr; + } + function propName(obj) { + const keys = Object.keys(obj); + for (let i = 0;i < keys.length; i++) { + const key = keys[i]; + if (!obj.hasOwnProperty(key)) + continue; + if (key !== ":@") + return key; + } + } + function attr_to_str(attrMap, options) { + let attrStr = ""; + if (attrMap && !options.ignoreAttributes) { + for (let attr in attrMap) { + if (!attrMap.hasOwnProperty(attr)) + continue; + let attrVal = options.attributeValueProcessor(attr, attrMap[attr]); + attrVal = replaceEntitiesValue(attrVal, options); + if (attrVal === true && options.suppressBooleanAttributes) { + attrStr += ` ${attr.substr(options.attributeNamePrefix.length)}`; + } else { + attrStr += ` ${attr.substr(options.attributeNamePrefix.length)}="${attrVal}"`; + } + } + } + return attrStr; + } + function isStopNode(jPath, options) { + jPath = jPath.substr(0, jPath.length - options.textNodeName.length - 1); + let tagName = jPath.substr(jPath.lastIndexOf(".") + 1); + for (let index in options.stopNodes) { + if (options.stopNodes[index] === jPath || options.stopNodes[index] === "*." + tagName) + return true; + } + return false; + } + function replaceEntitiesValue(textValue, options) { + if (textValue && textValue.length > 0 && options.processEntities) { + for (let i = 0;i < options.entities.length; i++) { + const entity = options.entities[i]; + textValue = textValue.replace(entity.regex, entity.val); + } + } + return textValue; + } + module2.exports = toXml; +}); + +// node_modules/fast-xml-parser/src/xmlbuilder/json2xml.js +var require_json2xml = __commonJS((exports2, module2) => { + var buildFromOrderedJs = require_orderedJs2Xml(); + var getIgnoreAttributesFn = require_ignoreAttributes(); + var defaultOptions = { + attributeNamePrefix: "@_", + attributesGroupName: false, + textNodeName: "#text", + ignoreAttributes: true, + cdataPropName: false, + format: false, + indentBy: " ", + suppressEmptyNode: false, + suppressUnpairedNode: true, + suppressBooleanAttributes: true, + tagValueProcessor: function(key, a) { + return a; + }, + attributeValueProcessor: function(attrName, a) { + return a; + }, + preserveOrder: false, + commentPropName: false, + unpairedTags: [], + entities: [ + { regex: new RegExp("&", "g"), val: "&" }, + { regex: new RegExp(">", "g"), val: ">" }, + { regex: new RegExp("<", "g"), val: "<" }, + { regex: new RegExp("\'", "g"), val: "'" }, + { regex: new RegExp("\"", "g"), val: """ } + ], + processEntities: true, + stopNodes: [], + oneListGroup: false + }; + function Builder(options) { + this.options = Object.assign({}, defaultOptions, options); + if (this.options.ignoreAttributes === true || this.options.attributesGroupName) { + this.isAttribute = function() { + return false; + }; + } else { + this.ignoreAttributesFn = getIgnoreAttributesFn(this.options.ignoreAttributes); + this.attrPrefixLen = this.options.attributeNamePrefix.length; + this.isAttribute = isAttribute; + } + this.processTextOrObjNode = processTextOrObjNode; + if (this.options.format) { + this.indentate = indentate; + this.tagEndChar = ">\n"; + this.newLine = "\n"; + } else { + this.indentate = function() { + return ""; + }; + this.tagEndChar = ">"; + this.newLine = ""; + } + } + Builder.prototype.build = function(jObj) { + if (this.options.preserveOrder) { + return buildFromOrderedJs(jObj, this.options); + } else { + if (Array.isArray(jObj) && this.options.arrayNodeName && this.options.arrayNodeName.length > 1) { + jObj = { + [this.options.arrayNodeName]: jObj + }; + } + return this.j2x(jObj, 0, []).val; + } + }; + Builder.prototype.j2x = function(jObj, level, ajPath) { + let attrStr = ""; + let val2 = ""; + const jPath = ajPath.join("."); + for (let key in jObj) { + if (!Object.prototype.hasOwnProperty.call(jObj, key)) + continue; + if (typeof jObj[key] === "undefined") { + if (this.isAttribute(key)) { + val2 += ""; + } + } else if (jObj[key] === null) { + if (this.isAttribute(key)) { + val2 += ""; + } else if (key[0] === "?") { + val2 += this.indentate(level) + "<" + key + "?" + this.tagEndChar; + } else { + val2 += this.indentate(level) + "<" + key + "/" + this.tagEndChar; + } + } else if (jObj[key] instanceof Date) { + val2 += this.buildTextValNode(jObj[key], key, "", level); + } else if (typeof jObj[key] !== "object") { + const attr = this.isAttribute(key); + if (attr && !this.ignoreAttributesFn(attr, jPath)) { + attrStr += this.buildAttrPairStr(attr, "" + jObj[key]); + } else if (!attr) { + if (key === this.options.textNodeName) { + let newval = this.options.tagValueProcessor(key, "" + jObj[key]); + val2 += this.replaceEntitiesValue(newval); + } else { + val2 += this.buildTextValNode(jObj[key], key, "", level); + } + } + } else if (Array.isArray(jObj[key])) { + const arrLen = jObj[key].length; + let listTagVal = ""; + let listTagAttr = ""; + for (let j = 0;j < arrLen; j++) { + const item = jObj[key][j]; + if (typeof item === "undefined") { + } else if (item === null) { + if (key[0] === "?") + val2 += this.indentate(level) + "<" + key + "?" + this.tagEndChar; + else + val2 += this.indentate(level) + "<" + key + "/" + this.tagEndChar; + } else if (typeof item === "object") { + if (this.options.oneListGroup) { + const result = this.j2x(item, level + 1, ajPath.concat(key)); + listTagVal += result.val; + if (this.options.attributesGroupName && item.hasOwnProperty(this.options.attributesGroupName)) { + listTagAttr += result.attrStr; + } + } else { + listTagVal += this.processTextOrObjNode(item, key, level, ajPath); + } + } else { + if (this.options.oneListGroup) { + let textValue = this.options.tagValueProcessor(key, item); + textValue = this.replaceEntitiesValue(textValue); + listTagVal += textValue; + } else { + listTagVal += this.buildTextValNode(item, key, "", level); + } + } + } + if (this.options.oneListGroup) { + listTagVal = this.buildObjectNode(listTagVal, key, listTagAttr, level); + } + val2 += listTagVal; + } else { + if (this.options.attributesGroupName && key === this.options.attributesGroupName) { + const Ks = Object.keys(jObj[key]); + const L = Ks.length; + for (let j = 0;j < L; j++) { + attrStr += this.buildAttrPairStr(Ks[j], "" + jObj[key][Ks[j]]); + } + } else { + val2 += this.processTextOrObjNode(jObj[key], key, level, ajPath); + } + } + } + return { attrStr, val: val2 }; + }; + Builder.prototype.buildAttrPairStr = function(attrName, val2) { + val2 = this.options.attributeValueProcessor(attrName, "" + val2); + val2 = this.replaceEntitiesValue(val2); + if (this.options.suppressBooleanAttributes && val2 === "true") { + return " " + attrName; + } else + return " " + attrName + '="' + val2 + '"'; + }; + function processTextOrObjNode(object, key, level, ajPath) { + const result = this.j2x(object, level + 1, ajPath.concat(key)); + if (object[this.options.textNodeName] !== undefined && Object.keys(object).length === 1) { + return this.buildTextValNode(object[this.options.textNodeName], key, result.attrStr, level); + } else { + return this.buildObjectNode(result.val, key, result.attrStr, level); + } + } + Builder.prototype.buildObjectNode = function(val2, key, attrStr, level) { + if (val2 === "") { + if (key[0] === "?") + return this.indentate(level) + "<" + key + attrStr + "?" + this.tagEndChar; + else { + return this.indentate(level) + "<" + key + attrStr + this.closeTag(key) + this.tagEndChar; + } + } else { + let tagEndExp = "" + val2 + tagEndExp; + } else if (this.options.commentPropName !== false && key === this.options.commentPropName && piClosingChar.length === 0) { + return this.indentate(level) + `` + this.newLine; + } else { + return this.indentate(level) + "<" + key + attrStr + piClosingChar + this.tagEndChar + val2 + this.indentate(level) + tagEndExp; + } + } + }; + Builder.prototype.closeTag = function(key) { + let closeTag = ""; + if (this.options.unpairedTags.indexOf(key) !== -1) { + if (!this.options.suppressUnpairedNode) + closeTag = "/"; + } else if (this.options.suppressEmptyNode) { + closeTag = "/"; + } else { + closeTag = `>` + this.newLine; + } else if (this.options.commentPropName !== false && key === this.options.commentPropName) { + return this.indentate(level) + `` + this.newLine; + } else if (key[0] === "?") { + return this.indentate(level) + "<" + key + attrStr + "?" + this.tagEndChar; + } else { + let textValue = this.options.tagValueProcessor(key, val2); + textValue = this.replaceEntitiesValue(textValue); + if (textValue === "") { + return this.indentate(level) + "<" + key + attrStr + this.closeTag(key) + this.tagEndChar; + } else { + return this.indentate(level) + "<" + key + attrStr + ">" + textValue + " 0 && this.options.processEntities) { + for (let i = 0;i < this.options.entities.length; i++) { + const entity = this.options.entities[i]; + textValue = textValue.replace(entity.regex, entity.val); + } + } + return textValue; + }; + function indentate(level) { + return this.options.indentBy.repeat(level); + } + function isAttribute(name) { + if (name.startsWith(this.options.attributeNamePrefix) && name !== this.options.textNodeName) { + return name.substr(this.attrPrefixLen); + } else { + return false; + } + } + module2.exports = Builder; +}); + +// node_modules/fast-xml-parser/src/fxp.js +var require_fxp = __commonJS((exports2, module2) => { + var validator = require_validator(); + var XMLParser = require_XMLParser(); + var XMLBuilder = require_json2xml(); + module2.exports = { + XMLParser, + XMLValidator: validator, + XMLBuilder + }; +}); + +// node_modules/@azure/core-xml/dist/commonjs/xml.common.js +var require_xml_common = __commonJS((exports2) => { + Object.defineProperty(exports2, "__esModule", { value: true }); + exports2.XML_CHARKEY = exports2.XML_ATTRKEY = undefined; + exports2.XML_ATTRKEY = "$"; + exports2.XML_CHARKEY = "_"; +}); + +// node_modules/@azure/core-xml/dist/commonjs/xml.js +var require_xml = __commonJS((exports2) => { + Object.defineProperty(exports2, "__esModule", { value: true }); + exports2.stringifyXML = stringifyXML; + exports2.parseXML = parseXML; + var fast_xml_parser_1 = require_fxp(); + var xml_common_js_1 = require_xml_common(); + function getCommonOptions(options) { + var _a; + return { + attributesGroupName: xml_common_js_1.XML_ATTRKEY, + textNodeName: (_a = options.xmlCharKey) !== null && _a !== undefined ? _a : xml_common_js_1.XML_CHARKEY, + ignoreAttributes: false, + suppressBooleanAttributes: false + }; + } + function getSerializerOptions(options = {}) { + var _a, _b; + return Object.assign(Object.assign({}, getCommonOptions(options)), { attributeNamePrefix: "@_", format: true, suppressEmptyNode: true, indentBy: "", rootNodeName: (_a = options.rootName) !== null && _a !== undefined ? _a : "root", cdataPropName: (_b = options.cdataPropName) !== null && _b !== undefined ? _b : "__cdata" }); + } + function getParserOptions(options = {}) { + return Object.assign(Object.assign({}, getCommonOptions(options)), { parseAttributeValue: false, parseTagValue: false, attributeNamePrefix: "", stopNodes: options.stopNodes, processEntities: true }); + } + function stringifyXML(obj, opts = {}) { + const parserOptions = getSerializerOptions(opts); + const j2x = new fast_xml_parser_1.XMLBuilder(parserOptions); + const node = { [parserOptions.rootNodeName]: obj }; + const xmlData = j2x.build(node); + return `${xmlData}`.replace(/\n/g, ""); + } + async function parseXML(str, opts = {}) { + if (!str) { + throw new Error("Document is empty"); + } + const validation = fast_xml_parser_1.XMLValidator.validate(str); + if (validation !== true) { + throw validation; + } + const parser = new fast_xml_parser_1.XMLParser(getParserOptions(opts)); + const parsedXml = parser.parse(str); + if (parsedXml["?xml"]) { + delete parsedXml["?xml"]; + } + if (!opts.includeRoot) { + for (const key of Object.keys(parsedXml)) { + const value = parsedXml[key]; + return typeof value === "object" ? Object.assign({}, value) : value; + } + } + return parsedXml; + } +}); + +// node_modules/@azure/core-xml/dist/commonjs/index.js +var require_commonjs11 = __commonJS((exports2) => { + Object.defineProperty(exports2, "__esModule", { value: true }); + exports2.XML_CHARKEY = exports2.XML_ATTRKEY = exports2.parseXML = exports2.stringifyXML = undefined; + var xml_js_1 = require_xml(); + Object.defineProperty(exports2, "stringifyXML", { enumerable: true, get: function() { + return xml_js_1.stringifyXML; + } }); + Object.defineProperty(exports2, "parseXML", { enumerable: true, get: function() { + return xml_js_1.parseXML; + } }); + var xml_common_js_1 = require_xml_common(); + Object.defineProperty(exports2, "XML_ATTRKEY", { enumerable: true, get: function() { + return xml_common_js_1.XML_ATTRKEY; + } }); + Object.defineProperty(exports2, "XML_CHARKEY", { enumerable: true, get: function() { + return xml_common_js_1.XML_CHARKEY; + } }); +}); + +// node_modules/@azure/core-lro/dist/commonjs/logger.js +var require_logger = __commonJS((exports2) => { + Object.defineProperty(exports2, "__esModule", { value: true }); + exports2.logger = undefined; + var logger_1 = require_commonjs3(); + exports2.logger = (0, logger_1.createClientLogger)("core-lro"); +}); + +// node_modules/@azure/core-lro/dist/commonjs/poller/constants.js +var require_constants7 = __commonJS((exports2) => { + Object.defineProperty(exports2, "__esModule", { value: true }); + exports2.terminalStates = exports2.POLL_INTERVAL_IN_MS = undefined; + exports2.POLL_INTERVAL_IN_MS = 2000; + exports2.terminalStates = ["succeeded", "canceled", "failed"]; +}); + +// node_modules/@azure/core-lro/dist/commonjs/poller/operation.js +var require_operation = __commonJS((exports2) => { + Object.defineProperty(exports2, "__esModule", { value: true }); + exports2.pollOperation = exports2.initOperation = exports2.deserializeState = undefined; + var logger_js_1 = require_logger(); + var constants_js_1 = require_constants7(); + function deserializeState(serializedState) { + try { + return JSON.parse(serializedState).state; + } catch (e) { + throw new Error(`Unable to deserialize input state: ${serializedState}`); + } + } + exports2.deserializeState = deserializeState; + function setStateError(inputs) { + const { state, stateProxy, isOperationError } = inputs; + return (error) => { + if (isOperationError(error)) { + stateProxy.setError(state, error); + stateProxy.setFailed(state); + } + throw error; + }; + } + function appendReadableErrorMessage(currentMessage, innerMessage) { + let message = currentMessage; + if (message.slice(-1) !== ".") { + message = message + "."; + } + return message + " " + innerMessage; + } + function simplifyError(err) { + let message = err.message; + let code = err.code; + let curErr = err; + while (curErr.innererror) { + curErr = curErr.innererror; + code = curErr.code; + message = appendReadableErrorMessage(message, curErr.message); + } + return { + code, + message + }; + } + function processOperationStatus(result) { + const { state, stateProxy, status, isDone, processResult, getError, response, setErrorAsResult } = result; + switch (status) { + case "succeeded": { + stateProxy.setSucceeded(state); + break; + } + case "failed": { + const err = getError === null || getError === undefined ? undefined : getError(response); + let postfix = ""; + if (err) { + const { code, message } = simplifyError(err); + postfix = `. ${code}. ${message}`; + } + const errStr = `The long-running operation has failed${postfix}`; + stateProxy.setError(state, new Error(errStr)); + stateProxy.setFailed(state); + logger_js_1.logger.warning(errStr); + break; + } + case "canceled": { + stateProxy.setCanceled(state); + break; + } + } + if ((isDone === null || isDone === undefined ? undefined : isDone(response, state)) || isDone === undefined && ["succeeded", "canceled"].concat(setErrorAsResult ? [] : ["failed"]).includes(status)) { + stateProxy.setResult(state, buildResult({ + response, + state, + processResult + })); + } + } + function buildResult(inputs) { + const { processResult, response, state } = inputs; + return processResult ? processResult(response, state) : response; + } + async function initOperation(inputs) { + const { init, stateProxy, processResult, getOperationStatus, withOperationLocation, setErrorAsResult } = inputs; + const { operationLocation, resourceLocation, metadata, response } = await init(); + if (operationLocation) + withOperationLocation === null || withOperationLocation === undefined || withOperationLocation(operationLocation, false); + const config = { + metadata, + operationLocation, + resourceLocation + }; + logger_js_1.logger.verbose(`LRO: Operation description:`, config); + const state = stateProxy.initState(config); + const status = getOperationStatus({ response, state, operationLocation }); + processOperationStatus({ state, status, stateProxy, response, setErrorAsResult, processResult }); + return state; + } + exports2.initOperation = initOperation; + async function pollOperationHelper(inputs) { + const { poll, state, stateProxy, operationLocation, getOperationStatus, getResourceLocation, isOperationError, options } = inputs; + const response = await poll(operationLocation, options).catch(setStateError({ + state, + stateProxy, + isOperationError + })); + const status = getOperationStatus(response, state); + logger_js_1.logger.verbose(`LRO: Status:\n\tPolling from: ${state.config.operationLocation}\n\tOperation status: ${status}\n\tPolling status: ${constants_js_1.terminalStates.includes(status) ? "Stopped" : "Running"}`); + if (status === "succeeded") { + const resourceLocation = getResourceLocation(response, state); + if (resourceLocation !== undefined) { + return { + response: await poll(resourceLocation).catch(setStateError({ state, stateProxy, isOperationError })), + status + }; + } + } + return { response, status }; + } + async function pollOperation(inputs) { + const { poll, state, stateProxy, options, getOperationStatus, getResourceLocation, getOperationLocation, isOperationError, withOperationLocation, getPollingInterval, processResult, getError, updateState, setDelay, isDone, setErrorAsResult } = inputs; + const { operationLocation } = state.config; + if (operationLocation !== undefined) { + const { response, status } = await pollOperationHelper({ + poll, + getOperationStatus, + state, + stateProxy, + operationLocation, + getResourceLocation, + isOperationError, + options + }); + processOperationStatus({ + status, + response, + state, + stateProxy, + isDone, + processResult, + getError, + setErrorAsResult + }); + if (!constants_js_1.terminalStates.includes(status)) { + const intervalInMs = getPollingInterval === null || getPollingInterval === undefined ? undefined : getPollingInterval(response); + if (intervalInMs) + setDelay(intervalInMs); + const location = getOperationLocation === null || getOperationLocation === undefined ? undefined : getOperationLocation(response, state); + if (location !== undefined) { + const isUpdated = operationLocation !== location; + state.config.operationLocation = location; + withOperationLocation === null || withOperationLocation === undefined || withOperationLocation(location, isUpdated); + } else + withOperationLocation === null || withOperationLocation === undefined || withOperationLocation(operationLocation, false); + } + updateState === null || updateState === undefined || updateState(state, response); + } + } + exports2.pollOperation = pollOperation; +}); + +// node_modules/@azure/core-lro/dist/commonjs/http/operation.js +var require_operation2 = __commonJS((exports2) => { + Object.defineProperty(exports2, "__esModule", { value: true }); + exports2.pollHttpOperation = exports2.isOperationError = exports2.getResourceLocation = exports2.getOperationStatus = exports2.getOperationLocation = exports2.initHttpOperation = exports2.getStatusFromInitialResponse = exports2.getErrorFromResponse = exports2.parseRetryAfter = exports2.inferLroMode = undefined; + var operation_js_1 = require_operation(); + var logger_js_1 = require_logger(); + function getOperationLocationPollingUrl(inputs) { + const { azureAsyncOperation, operationLocation } = inputs; + return operationLocation !== null && operationLocation !== undefined ? operationLocation : azureAsyncOperation; + } + function getLocationHeader(rawResponse) { + return rawResponse.headers["location"]; + } + function getOperationLocationHeader(rawResponse) { + return rawResponse.headers["operation-location"]; + } + function getAzureAsyncOperationHeader(rawResponse) { + return rawResponse.headers["azure-asyncoperation"]; + } + function findResourceLocation(inputs) { + var _a; + const { location, requestMethod, requestPath, resourceLocationConfig } = inputs; + switch (requestMethod) { + case "PUT": { + return requestPath; + } + case "DELETE": { + return; + } + case "PATCH": { + return (_a = getDefault()) !== null && _a !== undefined ? _a : requestPath; + } + default: { + return getDefault(); + } + } + function getDefault() { + switch (resourceLocationConfig) { + case "azure-async-operation": { + return; + } + case "original-uri": { + return requestPath; + } + case "location": + default: { + return location; + } + } + } + } + function inferLroMode(inputs) { + const { rawResponse, requestMethod, requestPath, resourceLocationConfig } = inputs; + const operationLocation = getOperationLocationHeader(rawResponse); + const azureAsyncOperation = getAzureAsyncOperationHeader(rawResponse); + const pollingUrl = getOperationLocationPollingUrl({ operationLocation, azureAsyncOperation }); + const location = getLocationHeader(rawResponse); + const normalizedRequestMethod = requestMethod === null || requestMethod === undefined ? undefined : requestMethod.toLocaleUpperCase(); + if (pollingUrl !== undefined) { + return { + mode: "OperationLocation", + operationLocation: pollingUrl, + resourceLocation: findResourceLocation({ + requestMethod: normalizedRequestMethod, + location, + requestPath, + resourceLocationConfig + }) + }; + } else if (location !== undefined) { + return { + mode: "ResourceLocation", + operationLocation: location + }; + } else if (normalizedRequestMethod === "PUT" && requestPath) { + return { + mode: "Body", + operationLocation: requestPath + }; + } else { + return; + } + } + exports2.inferLroMode = inferLroMode; + function transformStatus(inputs) { + const { status, statusCode } = inputs; + if (typeof status !== "string" && status !== undefined) { + throw new Error(`Polling was unsuccessful. Expected status to have a string value or no value but it has instead: ${status}. This doesn't necessarily indicate the operation has failed. Check your Azure subscription or resource status for more information.`); + } + switch (status === null || status === undefined ? undefined : status.toLocaleLowerCase()) { + case undefined: + return toOperationStatus(statusCode); + case "succeeded": + return "succeeded"; + case "failed": + return "failed"; + case "running": + case "accepted": + case "started": + case "canceling": + case "cancelling": + return "running"; + case "canceled": + case "cancelled": + return "canceled"; + default: { + logger_js_1.logger.verbose(`LRO: unrecognized operation status: ${status}`); + return status; + } + } + } + function getStatus(rawResponse) { + var _a; + const { status } = (_a = rawResponse.body) !== null && _a !== undefined ? _a : {}; + return transformStatus({ status, statusCode: rawResponse.statusCode }); + } + function getProvisioningState(rawResponse) { + var _a, _b; + const { properties, provisioningState } = (_a = rawResponse.body) !== null && _a !== undefined ? _a : {}; + const status = (_b = properties === null || properties === undefined ? undefined : properties.provisioningState) !== null && _b !== undefined ? _b : provisioningState; + return transformStatus({ status, statusCode: rawResponse.statusCode }); + } + function toOperationStatus(statusCode) { + if (statusCode === 202) { + return "running"; + } else if (statusCode < 300) { + return "succeeded"; + } else { + return "failed"; + } + } + function parseRetryAfter({ rawResponse }) { + const retryAfter = rawResponse.headers["retry-after"]; + if (retryAfter !== undefined) { + const retryAfterInSeconds = parseInt(retryAfter); + return isNaN(retryAfterInSeconds) ? calculatePollingIntervalFromDate(new Date(retryAfter)) : retryAfterInSeconds * 1000; + } + return; + } + exports2.parseRetryAfter = parseRetryAfter; + function getErrorFromResponse(response) { + const error = accessBodyProperty(response, "error"); + if (!error) { + logger_js_1.logger.warning(`The long-running operation failed but there is no error property in the response's body`); + return; + } + if (!error.code || !error.message) { + logger_js_1.logger.warning(`The long-running operation failed but the error property in the response's body doesn't contain code or message`); + return; + } + return error; + } + exports2.getErrorFromResponse = getErrorFromResponse; + function calculatePollingIntervalFromDate(retryAfterDate) { + const timeNow = Math.floor(new Date().getTime()); + const retryAfterTime = retryAfterDate.getTime(); + if (timeNow < retryAfterTime) { + return retryAfterTime - timeNow; + } + return; + } + function getStatusFromInitialResponse(inputs) { + const { response, state, operationLocation } = inputs; + function helper() { + var _a; + const mode = (_a = state.config.metadata) === null || _a === undefined ? undefined : _a["mode"]; + switch (mode) { + case undefined: + return toOperationStatus(response.rawResponse.statusCode); + case "Body": + return getOperationStatus(response, state); + default: + return "running"; + } + } + const status = helper(); + return status === "running" && operationLocation === undefined ? "succeeded" : status; + } + exports2.getStatusFromInitialResponse = getStatusFromInitialResponse; + async function initHttpOperation(inputs) { + const { stateProxy, resourceLocationConfig, processResult, lro, setErrorAsResult } = inputs; + return (0, operation_js_1.initOperation)({ + init: async () => { + const response = await lro.sendInitialRequest(); + const config = inferLroMode({ + rawResponse: response.rawResponse, + requestPath: lro.requestPath, + requestMethod: lro.requestMethod, + resourceLocationConfig + }); + return Object.assign({ response, operationLocation: config === null || config === undefined ? undefined : config.operationLocation, resourceLocation: config === null || config === undefined ? undefined : config.resourceLocation }, (config === null || config === undefined ? undefined : config.mode) ? { metadata: { mode: config.mode } } : {}); + }, + stateProxy, + processResult: processResult ? ({ flatResponse }, state) => processResult(flatResponse, state) : ({ flatResponse }) => flatResponse, + getOperationStatus: getStatusFromInitialResponse, + setErrorAsResult + }); + } + exports2.initHttpOperation = initHttpOperation; + function getOperationLocation({ rawResponse }, state) { + var _a; + const mode = (_a = state.config.metadata) === null || _a === undefined ? undefined : _a["mode"]; + switch (mode) { + case "OperationLocation": { + return getOperationLocationPollingUrl({ + operationLocation: getOperationLocationHeader(rawResponse), + azureAsyncOperation: getAzureAsyncOperationHeader(rawResponse) + }); + } + case "ResourceLocation": { + return getLocationHeader(rawResponse); + } + case "Body": + default: { + return; + } + } + } + exports2.getOperationLocation = getOperationLocation; + function getOperationStatus({ rawResponse }, state) { + var _a; + const mode = (_a = state.config.metadata) === null || _a === undefined ? undefined : _a["mode"]; + switch (mode) { + case "OperationLocation": { + return getStatus(rawResponse); + } + case "ResourceLocation": { + return toOperationStatus(rawResponse.statusCode); + } + case "Body": { + return getProvisioningState(rawResponse); + } + default: + throw new Error(`Internal error: Unexpected operation mode: ${mode}`); + } + } + exports2.getOperationStatus = getOperationStatus; + function accessBodyProperty({ flatResponse, rawResponse }, prop) { + var _a, _b; + return (_a = flatResponse === null || flatResponse === undefined ? undefined : flatResponse[prop]) !== null && _a !== undefined ? _a : (_b = rawResponse.body) === null || _b === undefined ? undefined : _b[prop]; + } + function getResourceLocation(res, state) { + const loc = accessBodyProperty(res, "resourceLocation"); + if (loc && typeof loc === "string") { + state.config.resourceLocation = loc; + } + return state.config.resourceLocation; + } + exports2.getResourceLocation = getResourceLocation; + function isOperationError(e) { + return e.name === "RestError"; + } + exports2.isOperationError = isOperationError; + async function pollHttpOperation(inputs) { + const { lro, stateProxy, options, processResult, updateState, setDelay, state, setErrorAsResult } = inputs; + return (0, operation_js_1.pollOperation)({ + state, + stateProxy, + setDelay, + processResult: processResult ? ({ flatResponse }, inputState) => processResult(flatResponse, inputState) : ({ flatResponse }) => flatResponse, + getError: getErrorFromResponse, + updateState, + getPollingInterval: parseRetryAfter, + getOperationLocation, + getOperationStatus, + isOperationError, + getResourceLocation, + options, + poll: async (location, inputOptions) => lro.sendPollRequest(location, inputOptions), + setErrorAsResult + }); + } + exports2.pollHttpOperation = pollHttpOperation; +}); + +// node_modules/@azure/core-lro/dist/commonjs/poller/poller.js +var require_poller = __commonJS((exports2) => { + Object.defineProperty(exports2, "__esModule", { value: true }); + exports2.buildCreatePoller = undefined; + var operation_js_1 = require_operation(); + var constants_js_1 = require_constants7(); + var core_util_1 = require_commonjs5(); + var createStateProxy = () => ({ + initState: (config) => ({ status: "running", config }), + setCanceled: (state) => state.status = "canceled", + setError: (state, error) => state.error = error, + setResult: (state, result) => state.result = result, + setRunning: (state) => state.status = "running", + setSucceeded: (state) => state.status = "succeeded", + setFailed: (state) => state.status = "failed", + getError: (state) => state.error, + getResult: (state) => state.result, + isCanceled: (state) => state.status === "canceled", + isFailed: (state) => state.status === "failed", + isRunning: (state) => state.status === "running", + isSucceeded: (state) => state.status === "succeeded" + }); + function buildCreatePoller(inputs) { + const { getOperationLocation, getStatusFromInitialResponse, getStatusFromPollResponse, isOperationError, getResourceLocation, getPollingInterval, getError, resolveOnUnsuccessful } = inputs; + return async ({ init, poll }, options) => { + const { processResult, updateState, withOperationLocation: withOperationLocationCallback, intervalInMs = constants_js_1.POLL_INTERVAL_IN_MS, restoreFrom } = options || {}; + const stateProxy = createStateProxy(); + const withOperationLocation = withOperationLocationCallback ? (() => { + let called = false; + return (operationLocation, isUpdated) => { + if (isUpdated) + withOperationLocationCallback(operationLocation); + else if (!called) + withOperationLocationCallback(operationLocation); + called = true; + }; + })() : undefined; + const state = restoreFrom ? (0, operation_js_1.deserializeState)(restoreFrom) : await (0, operation_js_1.initOperation)({ + init, + stateProxy, + processResult, + getOperationStatus: getStatusFromInitialResponse, + withOperationLocation, + setErrorAsResult: !resolveOnUnsuccessful + }); + let resultPromise; + const abortController = new AbortController; + const handlers = new Map; + const handleProgressEvents = async () => handlers.forEach((h) => h(state)); + const cancelErrMsg = "Operation was canceled"; + let currentPollIntervalInMs = intervalInMs; + const poller = { + getOperationState: () => state, + getResult: () => state.result, + isDone: () => ["succeeded", "failed", "canceled"].includes(state.status), + isStopped: () => resultPromise === undefined, + stopPolling: () => { + abortController.abort(); + }, + toString: () => JSON.stringify({ + state + }), + onProgress: (callback) => { + const s = Symbol(); + handlers.set(s, callback); + return () => handlers.delete(s); + }, + pollUntilDone: (pollOptions) => resultPromise !== null && resultPromise !== undefined ? resultPromise : resultPromise = (async () => { + const { abortSignal: inputAbortSignal } = pollOptions || {}; + function abortListener() { + abortController.abort(); + } + const abortSignal = abortController.signal; + if (inputAbortSignal === null || inputAbortSignal === undefined ? undefined : inputAbortSignal.aborted) { + abortController.abort(); + } else if (!abortSignal.aborted) { + inputAbortSignal === null || inputAbortSignal === undefined || inputAbortSignal.addEventListener("abort", abortListener, { once: true }); + } + try { + if (!poller.isDone()) { + await poller.poll({ abortSignal }); + while (!poller.isDone()) { + await (0, core_util_1.delay)(currentPollIntervalInMs, { abortSignal }); + await poller.poll({ abortSignal }); + } + } + } finally { + inputAbortSignal === null || inputAbortSignal === undefined || inputAbortSignal.removeEventListener("abort", abortListener); + } + if (resolveOnUnsuccessful) { + return poller.getResult(); + } else { + switch (state.status) { + case "succeeded": + return poller.getResult(); + case "canceled": + throw new Error(cancelErrMsg); + case "failed": + throw state.error; + case "notStarted": + case "running": + throw new Error(`Polling completed without succeeding or failing`); + } + } + })().finally(() => { + resultPromise = undefined; + }), + async poll(pollOptions) { + if (resolveOnUnsuccessful) { + if (poller.isDone()) + return; + } else { + switch (state.status) { + case "succeeded": + return; + case "canceled": + throw new Error(cancelErrMsg); + case "failed": + throw state.error; + } + } + await (0, operation_js_1.pollOperation)({ + poll, + state, + stateProxy, + getOperationLocation, + isOperationError, + withOperationLocation, + getPollingInterval, + getOperationStatus: getStatusFromPollResponse, + getResourceLocation, + processResult, + getError, + updateState, + options: pollOptions, + setDelay: (pollIntervalInMs) => { + currentPollIntervalInMs = pollIntervalInMs; + }, + setErrorAsResult: !resolveOnUnsuccessful + }); + await handleProgressEvents(); + if (!resolveOnUnsuccessful) { + switch (state.status) { + case "canceled": + throw new Error(cancelErrMsg); + case "failed": + throw state.error; + } + } + } + }; + return poller; + }; + } + exports2.buildCreatePoller = buildCreatePoller; +}); + +// node_modules/@azure/core-lro/dist/commonjs/http/poller.js +var require_poller2 = __commonJS((exports2) => { + Object.defineProperty(exports2, "__esModule", { value: true }); + exports2.createHttpPoller = undefined; + var operation_js_1 = require_operation2(); + var poller_js_1 = require_poller(); + async function createHttpPoller(lro, options) { + const { resourceLocationConfig, intervalInMs, processResult, restoreFrom, updateState, withOperationLocation, resolveOnUnsuccessful = false } = options || {}; + return (0, poller_js_1.buildCreatePoller)({ + getStatusFromInitialResponse: operation_js_1.getStatusFromInitialResponse, + getStatusFromPollResponse: operation_js_1.getOperationStatus, + isOperationError: operation_js_1.isOperationError, + getOperationLocation: operation_js_1.getOperationLocation, + getResourceLocation: operation_js_1.getResourceLocation, + getPollingInterval: operation_js_1.parseRetryAfter, + getError: operation_js_1.getErrorFromResponse, + resolveOnUnsuccessful + })({ + init: async () => { + const response = await lro.sendInitialRequest(); + const config = (0, operation_js_1.inferLroMode)({ + rawResponse: response.rawResponse, + requestPath: lro.requestPath, + requestMethod: lro.requestMethod, + resourceLocationConfig + }); + return Object.assign({ response, operationLocation: config === null || config === undefined ? undefined : config.operationLocation, resourceLocation: config === null || config === undefined ? undefined : config.resourceLocation }, (config === null || config === undefined ? undefined : config.mode) ? { metadata: { mode: config.mode } } : {}); + }, + poll: lro.sendPollRequest + }, { + intervalInMs, + withOperationLocation, + restoreFrom, + updateState, + processResult: processResult ? ({ flatResponse }, state) => processResult(flatResponse, state) : ({ flatResponse }) => flatResponse + }); + } + exports2.createHttpPoller = createHttpPoller; +}); + +// node_modules/@azure/core-lro/dist/commonjs/legacy/lroEngine/operation.js +var require_operation3 = __commonJS((exports2) => { + Object.defineProperty(exports2, "__esModule", { value: true }); + exports2.GenericPollOperation = undefined; + var operation_js_1 = require_operation2(); + var logger_js_1 = require_logger(); + var createStateProxy = () => ({ + initState: (config) => ({ config, isStarted: true }), + setCanceled: (state) => state.isCancelled = true, + setError: (state, error) => state.error = error, + setResult: (state, result) => state.result = result, + setRunning: (state) => state.isStarted = true, + setSucceeded: (state) => state.isCompleted = true, + setFailed: () => { + }, + getError: (state) => state.error, + getResult: (state) => state.result, + isCanceled: (state) => !!state.isCancelled, + isFailed: (state) => !!state.error, + isRunning: (state) => !!state.isStarted, + isSucceeded: (state) => Boolean(state.isCompleted && !state.isCancelled && !state.error) + }); + + class GenericPollOperation { + constructor(state, lro, setErrorAsResult, lroResourceLocationConfig, processResult, updateState, isDone) { + this.state = state; + this.lro = lro; + this.setErrorAsResult = setErrorAsResult; + this.lroResourceLocationConfig = lroResourceLocationConfig; + this.processResult = processResult; + this.updateState = updateState; + this.isDone = isDone; + } + setPollerConfig(pollerConfig) { + this.pollerConfig = pollerConfig; + } + async update(options) { + var _a; + const stateProxy = createStateProxy(); + if (!this.state.isStarted) { + this.state = Object.assign(Object.assign({}, this.state), await (0, operation_js_1.initHttpOperation)({ + lro: this.lro, + stateProxy, + resourceLocationConfig: this.lroResourceLocationConfig, + processResult: this.processResult, + setErrorAsResult: this.setErrorAsResult + })); + } + const updateState = this.updateState; + const isDone = this.isDone; + if (!this.state.isCompleted && this.state.error === undefined) { + await (0, operation_js_1.pollHttpOperation)({ + lro: this.lro, + state: this.state, + stateProxy, + processResult: this.processResult, + updateState: updateState ? (state, { rawResponse }) => updateState(state, rawResponse) : undefined, + isDone: isDone ? ({ flatResponse }, state) => isDone(flatResponse, state) : undefined, + options, + setDelay: (intervalInMs) => { + this.pollerConfig.intervalInMs = intervalInMs; + }, + setErrorAsResult: this.setErrorAsResult + }); + } + (_a = options === null || options === undefined ? undefined : options.fireProgress) === null || _a === undefined || _a.call(options, this.state); + return this; + } + async cancel() { + logger_js_1.logger.error("`cancelOperation` is deprecated because it wasn't implemented"); + return this; + } + toString() { + return JSON.stringify({ + state: this.state + }); + } + } + exports2.GenericPollOperation = GenericPollOperation; +}); + +// node_modules/@azure/core-lro/dist/commonjs/legacy/poller.js +var require_poller3 = __commonJS((exports2) => { + Object.defineProperty(exports2, "__esModule", { value: true }); + exports2.Poller = exports2.PollerCancelledError = exports2.PollerStoppedError = undefined; + + class PollerStoppedError extends Error { + constructor(message) { + super(message); + this.name = "PollerStoppedError"; + Object.setPrototypeOf(this, PollerStoppedError.prototype); + } + } + exports2.PollerStoppedError = PollerStoppedError; + + class PollerCancelledError extends Error { + constructor(message) { + super(message); + this.name = "PollerCancelledError"; + Object.setPrototypeOf(this, PollerCancelledError.prototype); + } + } + exports2.PollerCancelledError = PollerCancelledError; + + class Poller { + constructor(operation) { + this.resolveOnUnsuccessful = false; + this.stopped = true; + this.pollProgressCallbacks = []; + this.operation = operation; + this.promise = new Promise((resolve, reject) => { + this.resolve = resolve; + this.reject = reject; + }); + this.promise.catch(() => { + }); + } + async startPolling(pollOptions = {}) { + if (this.stopped) { + this.stopped = false; + } + while (!this.isStopped() && !this.isDone()) { + await this.poll(pollOptions); + await this.delay(); + } + } + async pollOnce(options = {}) { + if (!this.isDone()) { + this.operation = await this.operation.update({ + abortSignal: options.abortSignal, + fireProgress: this.fireProgress.bind(this) + }); + } + this.processUpdatedState(); + } + fireProgress(state) { + for (const callback of this.pollProgressCallbacks) { + callback(state); + } + } + async cancelOnce(options = {}) { + this.operation = await this.operation.cancel(options); + } + poll(options = {}) { + if (!this.pollOncePromise) { + this.pollOncePromise = this.pollOnce(options); + const clearPollOncePromise = () => { + this.pollOncePromise = undefined; + }; + this.pollOncePromise.then(clearPollOncePromise, clearPollOncePromise).catch(this.reject); + } + return this.pollOncePromise; + } + processUpdatedState() { + if (this.operation.state.error) { + this.stopped = true; + if (!this.resolveOnUnsuccessful) { + this.reject(this.operation.state.error); + throw this.operation.state.error; + } + } + if (this.operation.state.isCancelled) { + this.stopped = true; + if (!this.resolveOnUnsuccessful) { + const error = new PollerCancelledError("Operation was canceled"); + this.reject(error); + throw error; + } + } + if (this.isDone() && this.resolve) { + this.resolve(this.getResult()); + } + } + async pollUntilDone(pollOptions = {}) { + if (this.stopped) { + this.startPolling(pollOptions).catch(this.reject); + } + this.processUpdatedState(); + return this.promise; + } + onProgress(callback) { + this.pollProgressCallbacks.push(callback); + return () => { + this.pollProgressCallbacks = this.pollProgressCallbacks.filter((c) => c !== callback); + }; + } + isDone() { + const state = this.operation.state; + return Boolean(state.isCompleted || state.isCancelled || state.error); + } + stopPolling() { + if (!this.stopped) { + this.stopped = true; + if (this.reject) { + this.reject(new PollerStoppedError("This poller is already stopped")); + } + } + } + isStopped() { + return this.stopped; + } + cancelOperation(options = {}) { + if (!this.cancelPromise) { + this.cancelPromise = this.cancelOnce(options); + } else if (options.abortSignal) { + throw new Error("A cancel request is currently pending"); + } + return this.cancelPromise; + } + getOperationState() { + return this.operation.state; + } + getResult() { + const state = this.operation.state; + return state.result; + } + toString() { + return this.operation.toString(); + } + } + exports2.Poller = Poller; +}); + +// node_modules/@azure/core-lro/dist/commonjs/legacy/lroEngine/lroEngine.js +var require_lroEngine = __commonJS((exports2) => { + Object.defineProperty(exports2, "__esModule", { value: true }); + exports2.LroEngine = undefined; + var operation_js_1 = require_operation3(); + var constants_js_1 = require_constants7(); + var poller_js_1 = require_poller3(); + var operation_js_2 = require_operation(); + + class LroEngine extends poller_js_1.Poller { + constructor(lro, options) { + const { intervalInMs = constants_js_1.POLL_INTERVAL_IN_MS, resumeFrom, resolveOnUnsuccessful = false, isDone, lroResourceLocationConfig, processResult, updateState } = options || {}; + const state = resumeFrom ? (0, operation_js_2.deserializeState)(resumeFrom) : {}; + const operation = new operation_js_1.GenericPollOperation(state, lro, !resolveOnUnsuccessful, lroResourceLocationConfig, processResult, updateState, isDone); + super(operation); + this.resolveOnUnsuccessful = resolveOnUnsuccessful; + this.config = { intervalInMs }; + operation.setPollerConfig(this.config); + } + delay() { + return new Promise((resolve) => setTimeout(() => resolve(), this.config.intervalInMs)); + } + } + exports2.LroEngine = LroEngine; +}); + +// node_modules/@azure/core-lro/dist/commonjs/legacy/lroEngine/index.js +var require_lroEngine2 = __commonJS((exports2) => { + Object.defineProperty(exports2, "__esModule", { value: true }); + exports2.LroEngine = undefined; + var lroEngine_js_1 = require_lroEngine(); + Object.defineProperty(exports2, "LroEngine", { enumerable: true, get: function() { + return lroEngine_js_1.LroEngine; + } }); +}); + +// node_modules/@azure/core-lro/dist/commonjs/legacy/pollOperation.js +var require_pollOperation = __commonJS((exports2) => { + Object.defineProperty(exports2, "__esModule", { value: true }); +}); + +// node_modules/@azure/core-lro/dist/commonjs/index.js +var require_commonjs12 = __commonJS((exports2) => { + Object.defineProperty(exports2, "__esModule", { value: true }); + exports2.createHttpPoller = undefined; + var tslib_1 = require_tslib(); + var poller_js_1 = require_poller2(); + Object.defineProperty(exports2, "createHttpPoller", { enumerable: true, get: function() { + return poller_js_1.createHttpPoller; + } }); + tslib_1.__exportStar(require_lroEngine2(), exports2); + tslib_1.__exportStar(require_poller3(), exports2); + tslib_1.__exportStar(require_pollOperation(), exports2); +}); + +// node_modules/@azure/storage-blob/dist/index.js +var require_dist4 = __commonJS((exports2) => { + Object.defineProperty(exports2, "__esModule", { value: true }); + var coreRestPipeline = require_commonjs7(); + var tslib = require_tslib(); + var coreAuth = require_commonjs8(); + var coreUtil = require_commonjs5(); + var coreHttpCompat = require_commonjs10(); + var coreClient = require_commonjs9(); + var coreXml = require_commonjs11(); + var logger$1 = require_commonjs3(); + var abortController = require_commonjs4(); + var crypto = require("crypto"); + var coreTracing = require_commonjs6(); + var stream = require("stream"); + var coreLro = require_commonjs12(); + var events = require("events"); + var fs = require("fs"); + var util = require("util"); + var buffer = require("buffer"); + function _interopNamespaceDefault(e) { + var n = Object.create(null); + if (e) { + Object.keys(e).forEach(function(k) { + if (k !== "default") { + var d = Object.getOwnPropertyDescriptor(e, k); + Object.defineProperty(n, k, d.get ? d : { + enumerable: true, + get: function() { + return e[k]; + } + }); + } + }); + } + n.default = e; + return Object.freeze(n); + } + var coreHttpCompat__namespace = /* @__PURE__ */ _interopNamespaceDefault(coreHttpCompat); + var coreClient__namespace = /* @__PURE__ */ _interopNamespaceDefault(coreClient); + var fs__namespace = /* @__PURE__ */ _interopNamespaceDefault(fs); + var util__namespace = /* @__PURE__ */ _interopNamespaceDefault(util); + var logger = logger$1.createClientLogger("storage-blob"); + + class BaseRequestPolicy { + constructor(_nextPolicy, _options) { + this._nextPolicy = _nextPolicy; + this._options = _options; + } + shouldLog(logLevel) { + return this._options.shouldLog(logLevel); + } + log(logLevel, message) { + this._options.log(logLevel, message); + } + } + var SDK_VERSION = "12.25.0"; + var SERVICE_VERSION = "2024-11-04"; + var BLOCK_BLOB_MAX_UPLOAD_BLOB_BYTES = 256 * 1024 * 1024; + var BLOCK_BLOB_MAX_STAGE_BLOCK_BYTES = 4000 * 1024 * 1024; + var BLOCK_BLOB_MAX_BLOCKS = 50000; + var DEFAULT_BLOCK_BUFFER_SIZE_BYTES = 8 * 1024 * 1024; + var DEFAULT_BLOB_DOWNLOAD_BLOCK_BYTES = 4 * 1024 * 1024; + var DEFAULT_MAX_DOWNLOAD_RETRY_REQUESTS = 5; + var REQUEST_TIMEOUT = 100 * 1000; + var StorageOAuthScopes = "https://storage.azure.com/.default"; + var URLConstants = { + Parameters: { + FORCE_BROWSER_NO_CACHE: "_", + SIGNATURE: "sig", + SNAPSHOT: "snapshot", + VERSIONID: "versionid", + TIMEOUT: "timeout" + } + }; + var HTTPURLConnection = { + HTTP_ACCEPTED: 202, + HTTP_CONFLICT: 409, + HTTP_NOT_FOUND: 404, + HTTP_PRECON_FAILED: 412, + HTTP_RANGE_NOT_SATISFIABLE: 416 + }; + var HeaderConstants = { + AUTHORIZATION: "Authorization", + AUTHORIZATION_SCHEME: "Bearer", + CONTENT_ENCODING: "Content-Encoding", + CONTENT_ID: "Content-ID", + CONTENT_LANGUAGE: "Content-Language", + CONTENT_LENGTH: "Content-Length", + CONTENT_MD5: "Content-Md5", + CONTENT_TRANSFER_ENCODING: "Content-Transfer-Encoding", + CONTENT_TYPE: "Content-Type", + COOKIE: "Cookie", + DATE: "date", + IF_MATCH: "if-match", + IF_MODIFIED_SINCE: "if-modified-since", + IF_NONE_MATCH: "if-none-match", + IF_UNMODIFIED_SINCE: "if-unmodified-since", + PREFIX_FOR_STORAGE: "x-ms-", + RANGE: "Range", + USER_AGENT: "User-Agent", + X_MS_CLIENT_REQUEST_ID: "x-ms-client-request-id", + X_MS_COPY_SOURCE: "x-ms-copy-source", + X_MS_DATE: "x-ms-date", + X_MS_ERROR_CODE: "x-ms-error-code", + X_MS_VERSION: "x-ms-version", + X_MS_CopySourceErrorCode: "x-ms-copy-source-error-code" + }; + var ETagNone = ""; + var ETagAny = "*"; + var SIZE_1_MB = 1 * 1024 * 1024; + var BATCH_MAX_REQUEST = 256; + var BATCH_MAX_PAYLOAD_IN_BYTES = 4 * SIZE_1_MB; + var HTTP_LINE_ENDING = "\r\n"; + var HTTP_VERSION_1_1 = "HTTP/1.1"; + var EncryptionAlgorithmAES25 = "AES256"; + var DevelopmentConnectionString = `DefaultEndpointsProtocol=http;AccountName=devstoreaccount1;AccountKey=Eby8vdM02xNOcqFlqUwJPLlmEtlCDXJ1OUzFT50uSRZ6IFsuFq2UVErCz4I6tq/K1SZFPTOtr/KBHBeksoGMGw==;BlobEndpoint=http://127.0.0.1:10000/devstoreaccount1;`; + var StorageBlobLoggingAllowedHeaderNames = [ + "Access-Control-Allow-Origin", + "Cache-Control", + "Content-Length", + "Content-Type", + "Date", + "Request-Id", + "traceparent", + "Transfer-Encoding", + "User-Agent", + "x-ms-client-request-id", + "x-ms-date", + "x-ms-error-code", + "x-ms-request-id", + "x-ms-return-client-request-id", + "x-ms-version", + "Accept-Ranges", + "Content-Disposition", + "Content-Encoding", + "Content-Language", + "Content-MD5", + "Content-Range", + "ETag", + "Last-Modified", + "Server", + "Vary", + "x-ms-content-crc64", + "x-ms-copy-action", + "x-ms-copy-completion-time", + "x-ms-copy-id", + "x-ms-copy-progress", + "x-ms-copy-status", + "x-ms-has-immutability-policy", + "x-ms-has-legal-hold", + "x-ms-lease-state", + "x-ms-lease-status", + "x-ms-range", + "x-ms-request-server-encrypted", + "x-ms-server-encrypted", + "x-ms-snapshot", + "x-ms-source-range", + "If-Match", + "If-Modified-Since", + "If-None-Match", + "If-Unmodified-Since", + "x-ms-access-tier", + "x-ms-access-tier-change-time", + "x-ms-access-tier-inferred", + "x-ms-account-kind", + "x-ms-archive-status", + "x-ms-blob-append-offset", + "x-ms-blob-cache-control", + "x-ms-blob-committed-block-count", + "x-ms-blob-condition-appendpos", + "x-ms-blob-condition-maxsize", + "x-ms-blob-content-disposition", + "x-ms-blob-content-encoding", + "x-ms-blob-content-language", + "x-ms-blob-content-length", + "x-ms-blob-content-md5", + "x-ms-blob-content-type", + "x-ms-blob-public-access", + "x-ms-blob-sequence-number", + "x-ms-blob-type", + "x-ms-copy-destination-snapshot", + "x-ms-creation-time", + "x-ms-default-encryption-scope", + "x-ms-delete-snapshots", + "x-ms-delete-type-permanent", + "x-ms-deny-encryption-scope-override", + "x-ms-encryption-algorithm", + "x-ms-if-sequence-number-eq", + "x-ms-if-sequence-number-le", + "x-ms-if-sequence-number-lt", + "x-ms-incremental-copy", + "x-ms-lease-action", + "x-ms-lease-break-period", + "x-ms-lease-duration", + "x-ms-lease-id", + "x-ms-lease-time", + "x-ms-page-write", + "x-ms-proposed-lease-id", + "x-ms-range-get-content-md5", + "x-ms-rehydrate-priority", + "x-ms-sequence-number-action", + "x-ms-sku-name", + "x-ms-source-content-md5", + "x-ms-source-if-match", + "x-ms-source-if-modified-since", + "x-ms-source-if-none-match", + "x-ms-source-if-unmodified-since", + "x-ms-tag-count", + "x-ms-encryption-key-sha256", + "x-ms-copy-source-error-code", + "x-ms-copy-source-status-code", + "x-ms-if-tags", + "x-ms-source-if-tags" + ]; + var StorageBlobLoggingAllowedQueryParameters = [ + "comp", + "maxresults", + "rscc", + "rscd", + "rsce", + "rscl", + "rsct", + "se", + "si", + "sip", + "sp", + "spr", + "sr", + "srt", + "ss", + "st", + "sv", + "include", + "marker", + "prefix", + "copyid", + "restype", + "blockid", + "blocklisttype", + "delimiter", + "prevsnapshot", + "ske", + "skoid", + "sks", + "skt", + "sktid", + "skv", + "snapshot" + ]; + var BlobUsesCustomerSpecifiedEncryptionMsg = "BlobUsesCustomerSpecifiedEncryption"; + var BlobDoesNotUseCustomerSpecifiedEncryption = "BlobDoesNotUseCustomerSpecifiedEncryption"; + var PathStylePorts = [ + "10000", + "10001", + "10002", + "10003", + "10004", + "10100", + "10101", + "10102", + "10103", + "10104", + "11000", + "11001", + "11002", + "11003", + "11004", + "11100", + "11101", + "11102", + "11103", + "11104" + ]; + function escapeURLPath(url2) { + const urlParsed = new URL(url2); + let path = urlParsed.pathname; + path = path || "/"; + path = escape(path); + urlParsed.pathname = path; + return urlParsed.toString(); + } + function getProxyUriFromDevConnString(connectionString) { + let proxyUri = ""; + if (connectionString.search("DevelopmentStorageProxyUri=") !== -1) { + const matchCredentials = connectionString.split(";"); + for (const element of matchCredentials) { + if (element.trim().startsWith("DevelopmentStorageProxyUri=")) { + proxyUri = element.trim().match("DevelopmentStorageProxyUri=(.*)")[1]; + } + } + } + return proxyUri; + } + function getValueInConnString(connectionString, argument) { + const elements = connectionString.split(";"); + for (const element of elements) { + if (element.trim().startsWith(argument)) { + return element.trim().match(argument + "=(.*)")[1]; + } + } + return ""; + } + function extractConnectionStringParts(connectionString) { + let proxyUri = ""; + if (connectionString.startsWith("UseDevelopmentStorage=true")) { + proxyUri = getProxyUriFromDevConnString(connectionString); + connectionString = DevelopmentConnectionString; + } + let blobEndpoint = getValueInConnString(connectionString, "BlobEndpoint"); + blobEndpoint = blobEndpoint.endsWith("/") ? blobEndpoint.slice(0, -1) : blobEndpoint; + if (connectionString.search("DefaultEndpointsProtocol=") !== -1 && connectionString.search("AccountKey=") !== -1) { + let defaultEndpointsProtocol = ""; + let accountName = ""; + let accountKey = Buffer.from("accountKey", "base64"); + let endpointSuffix = ""; + accountName = getValueInConnString(connectionString, "AccountName"); + accountKey = Buffer.from(getValueInConnString(connectionString, "AccountKey"), "base64"); + if (!blobEndpoint) { + defaultEndpointsProtocol = getValueInConnString(connectionString, "DefaultEndpointsProtocol"); + const protocol = defaultEndpointsProtocol.toLowerCase(); + if (protocol !== "https" && protocol !== "http") { + throw new Error("Invalid DefaultEndpointsProtocol in the provided Connection String. Expecting 'https' or 'http'"); + } + endpointSuffix = getValueInConnString(connectionString, "EndpointSuffix"); + if (!endpointSuffix) { + throw new Error("Invalid EndpointSuffix in the provided Connection String"); + } + blobEndpoint = `${defaultEndpointsProtocol}://${accountName}.blob.${endpointSuffix}`; + } + if (!accountName) { + throw new Error("Invalid AccountName in the provided Connection String"); + } else if (accountKey.length === 0) { + throw new Error("Invalid AccountKey in the provided Connection String"); + } + return { + kind: "AccountConnString", + url: blobEndpoint, + accountName, + accountKey, + proxyUri + }; + } else { + let accountSas = getValueInConnString(connectionString, "SharedAccessSignature"); + let accountName = getValueInConnString(connectionString, "AccountName"); + if (!accountName) { + accountName = getAccountNameFromUrl(blobEndpoint); + } + if (!blobEndpoint) { + throw new Error("Invalid BlobEndpoint in the provided SAS Connection String"); + } else if (!accountSas) { + throw new Error("Invalid SharedAccessSignature in the provided SAS Connection String"); + } + if (accountSas.startsWith("?")) { + accountSas = accountSas.substring(1); + } + return { kind: "SASConnString", url: blobEndpoint, accountName, accountSas }; + } + } + function escape(text) { + return encodeURIComponent(text).replace(/%2F/g, "/").replace(/'/g, "%27").replace(/\+/g, "%20").replace(/%25/g, "%"); + } + function appendToURLPath(url2, name) { + const urlParsed = new URL(url2); + let path = urlParsed.pathname; + path = path ? path.endsWith("/") ? `${path}${name}` : `${path}/${name}` : name; + urlParsed.pathname = path; + return urlParsed.toString(); + } + function setURLParameter(url2, name, value) { + const urlParsed = new URL(url2); + const encodedName = encodeURIComponent(name); + const encodedValue = value ? encodeURIComponent(value) : undefined; + const searchString = urlParsed.search === "" ? "?" : urlParsed.search; + const searchPieces = []; + for (const pair of searchString.slice(1).split("&")) { + if (pair) { + const [key] = pair.split("=", 2); + if (key !== encodedName) { + searchPieces.push(pair); + } + } + } + if (encodedValue) { + searchPieces.push(`${encodedName}=${encodedValue}`); + } + urlParsed.search = searchPieces.length ? `?${searchPieces.join("&")}` : ""; + return urlParsed.toString(); + } + function getURLParameter(url2, name) { + var _a; + const urlParsed = new URL(url2); + return (_a = urlParsed.searchParams.get(name)) !== null && _a !== undefined ? _a : undefined; + } + function setURLHost(url2, host) { + const urlParsed = new URL(url2); + urlParsed.hostname = host; + return urlParsed.toString(); + } + function getURLPath(url2) { + try { + const urlParsed = new URL(url2); + return urlParsed.pathname; + } catch (e) { + return; + } + } + function getURLScheme(url2) { + try { + const urlParsed = new URL(url2); + return urlParsed.protocol.endsWith(":") ? urlParsed.protocol.slice(0, -1) : urlParsed.protocol; + } catch (e) { + return; + } + } + function getURLPathAndQuery(url2) { + const urlParsed = new URL(url2); + const pathString = urlParsed.pathname; + if (!pathString) { + throw new RangeError("Invalid url without valid path."); + } + let queryString = urlParsed.search || ""; + queryString = queryString.trim(); + if (queryString !== "") { + queryString = queryString.startsWith("?") ? queryString : `?${queryString}`; + } + return `${pathString}${queryString}`; + } + function getURLQueries(url2) { + let queryString = new URL(url2).search; + if (!queryString) { + return {}; + } + queryString = queryString.trim(); + queryString = queryString.startsWith("?") ? queryString.substring(1) : queryString; + let querySubStrings = queryString.split("&"); + querySubStrings = querySubStrings.filter((value) => { + const indexOfEqual = value.indexOf("="); + const lastIndexOfEqual = value.lastIndexOf("="); + return indexOfEqual > 0 && indexOfEqual === lastIndexOfEqual && lastIndexOfEqual < value.length - 1; + }); + const queries = {}; + for (const querySubString of querySubStrings) { + const splitResults = querySubString.split("="); + const key = splitResults[0]; + const value = splitResults[1]; + queries[key] = value; + } + return queries; + } + function appendToURLQuery(url2, queryParts) { + const urlParsed = new URL(url2); + let query = urlParsed.search; + if (query) { + query += "&" + queryParts; + } else { + query = queryParts; + } + urlParsed.search = query; + return urlParsed.toString(); + } + function truncatedISO8061Date(date, withMilliseconds = true) { + const dateString = date.toISOString(); + return withMilliseconds ? dateString.substring(0, dateString.length - 1) + "0000" + "Z" : dateString.substring(0, dateString.length - 5) + "Z"; + } + function base64encode(content) { + return !coreUtil.isNode ? btoa(content) : Buffer.from(content).toString("base64"); + } + function generateBlockID(blockIDPrefix, blockIndex) { + const maxSourceStringLength = 48; + const maxBlockIndexLength = 6; + const maxAllowedBlockIDPrefixLength = maxSourceStringLength - maxBlockIndexLength; + if (blockIDPrefix.length > maxAllowedBlockIDPrefixLength) { + blockIDPrefix = blockIDPrefix.slice(0, maxAllowedBlockIDPrefixLength); + } + const res = blockIDPrefix + padStart(blockIndex.toString(), maxSourceStringLength - blockIDPrefix.length, "0"); + return base64encode(res); + } + async function delay(timeInMs, aborter, abortError) { + return new Promise((resolve, reject) => { + let timeout; + const abortHandler = () => { + if (timeout !== undefined) { + clearTimeout(timeout); + } + reject(abortError); + }; + const resolveHandler = () => { + if (aborter !== undefined) { + aborter.removeEventListener("abort", abortHandler); + } + resolve(); + }; + timeout = setTimeout(resolveHandler, timeInMs); + if (aborter !== undefined) { + aborter.addEventListener("abort", abortHandler); + } + }); + } + function padStart(currentString, targetLength, padString = " ") { + if (String.prototype.padStart) { + return currentString.padStart(targetLength, padString); + } + padString = padString || " "; + if (currentString.length > targetLength) { + return currentString; + } else { + targetLength = targetLength - currentString.length; + if (targetLength > padString.length) { + padString += padString.repeat(targetLength / padString.length); + } + return padString.slice(0, targetLength) + currentString; + } + } + function iEqual(str1, str2) { + return str1.toLocaleLowerCase() === str2.toLocaleLowerCase(); + } + function getAccountNameFromUrl(url2) { + const parsedUrl = new URL(url2); + let accountName; + try { + if (parsedUrl.hostname.split(".")[1] === "blob") { + accountName = parsedUrl.hostname.split(".")[0]; + } else if (isIpEndpointStyle(parsedUrl)) { + accountName = parsedUrl.pathname.split("/")[1]; + } else { + accountName = ""; + } + return accountName; + } catch (error) { + throw new Error("Unable to extract accountName with provided information."); + } + } + function isIpEndpointStyle(parsedUrl) { + const host = parsedUrl.host; + return /^.*:.*:.*$|^(localhost|host.docker.internal)(:[0-9]+)?$|^(\d|[1-9]\d|1\d\d|2[0-4]\d|25[0-5])(\.(\d|[1-9]\d|1\d\d|2[0-4]\d|25[0-5])){3}(:[0-9]+)?$/.test(host) || Boolean(parsedUrl.port) && PathStylePorts.includes(parsedUrl.port); + } + function toBlobTagsString(tags2) { + if (tags2 === undefined) { + return; + } + const tagPairs = []; + for (const key in tags2) { + if (Object.prototype.hasOwnProperty.call(tags2, key)) { + const value = tags2[key]; + tagPairs.push(`${encodeURIComponent(key)}=${encodeURIComponent(value)}`); + } + } + return tagPairs.join("&"); + } + function toBlobTags(tags2) { + if (tags2 === undefined) { + return; + } + const res = { + blobTagSet: [] + }; + for (const key in tags2) { + if (Object.prototype.hasOwnProperty.call(tags2, key)) { + const value = tags2[key]; + res.blobTagSet.push({ + key, + value + }); + } + } + return res; + } + function toTags(tags2) { + if (tags2 === undefined) { + return; + } + const res = {}; + for (const blobTag of tags2.blobTagSet) { + res[blobTag.key] = blobTag.value; + } + return res; + } + function toQuerySerialization(textConfiguration) { + if (textConfiguration === undefined) { + return; + } + switch (textConfiguration.kind) { + case "csv": + return { + format: { + type: "delimited", + delimitedTextConfiguration: { + columnSeparator: textConfiguration.columnSeparator || ",", + fieldQuote: textConfiguration.fieldQuote || "", + recordSeparator: textConfiguration.recordSeparator, + escapeChar: textConfiguration.escapeCharacter || "", + headersPresent: textConfiguration.hasHeaders || false + } + } + }; + case "json": + return { + format: { + type: "json", + jsonTextConfiguration: { + recordSeparator: textConfiguration.recordSeparator + } + } + }; + case "arrow": + return { + format: { + type: "arrow", + arrowConfiguration: { + schema: textConfiguration.schema + } + } + }; + case "parquet": + return { + format: { + type: "parquet" + } + }; + default: + throw Error("Invalid BlobQueryTextConfiguration."); + } + } + function parseObjectReplicationRecord(objectReplicationRecord) { + if (!objectReplicationRecord) { + return; + } + if ("policy-id" in objectReplicationRecord) { + return; + } + const orProperties = []; + for (const key in objectReplicationRecord) { + const ids = key.split("_"); + const policyPrefix = "or-"; + if (ids[0].startsWith(policyPrefix)) { + ids[0] = ids[0].substring(policyPrefix.length); + } + const rule = { + ruleId: ids[1], + replicationStatus: objectReplicationRecord[key] + }; + const policyIndex = orProperties.findIndex((policy) => policy.policyId === ids[0]); + if (policyIndex > -1) { + orProperties[policyIndex].rules.push(rule); + } else { + orProperties.push({ + policyId: ids[0], + rules: [rule] + }); + } + } + return orProperties; + } + function httpAuthorizationToString(httpAuthorization) { + return httpAuthorization ? httpAuthorization.scheme + " " + httpAuthorization.value : undefined; + } + function BlobNameToString(name) { + if (name.encoded) { + return decodeURIComponent(name.content); + } else { + return name.content; + } + } + function ConvertInternalResponseOfListBlobFlat(internalResponse) { + return Object.assign(Object.assign({}, internalResponse), { segment: { + blobItems: internalResponse.segment.blobItems.map((blobItemInteral) => { + const blobItem = Object.assign(Object.assign({}, blobItemInteral), { name: BlobNameToString(blobItemInteral.name) }); + return blobItem; + }) + } }); + } + function ConvertInternalResponseOfListBlobHierarchy(internalResponse) { + var _a; + return Object.assign(Object.assign({}, internalResponse), { segment: { + blobPrefixes: (_a = internalResponse.segment.blobPrefixes) === null || _a === undefined ? undefined : _a.map((blobPrefixInternal) => { + const blobPrefix = Object.assign(Object.assign({}, blobPrefixInternal), { name: BlobNameToString(blobPrefixInternal.name) }); + return blobPrefix; + }), + blobItems: internalResponse.segment.blobItems.map((blobItemInteral) => { + const blobItem = Object.assign(Object.assign({}, blobItemInteral), { name: BlobNameToString(blobItemInteral.name) }); + return blobItem; + }) + } }); + } + function* ExtractPageRangeInfoItems(getPageRangesSegment) { + let pageRange = []; + let clearRange = []; + if (getPageRangesSegment.pageRange) + pageRange = getPageRangesSegment.pageRange; + if (getPageRangesSegment.clearRange) + clearRange = getPageRangesSegment.clearRange; + let pageRangeIndex = 0; + let clearRangeIndex = 0; + while (pageRangeIndex < pageRange.length && clearRangeIndex < clearRange.length) { + if (pageRange[pageRangeIndex].start < clearRange[clearRangeIndex].start) { + yield { + start: pageRange[pageRangeIndex].start, + end: pageRange[pageRangeIndex].end, + isClear: false + }; + ++pageRangeIndex; + } else { + yield { + start: clearRange[clearRangeIndex].start, + end: clearRange[clearRangeIndex].end, + isClear: true + }; + ++clearRangeIndex; + } + } + for (;pageRangeIndex < pageRange.length; ++pageRangeIndex) { + yield { + start: pageRange[pageRangeIndex].start, + end: pageRange[pageRangeIndex].end, + isClear: false + }; + } + for (;clearRangeIndex < clearRange.length; ++clearRangeIndex) { + yield { + start: clearRange[clearRangeIndex].start, + end: clearRange[clearRangeIndex].end, + isClear: true + }; + } + } + function EscapePath(blobName) { + const split = blobName.split("/"); + for (let i = 0;i < split.length; i++) { + split[i] = encodeURIComponent(split[i]); + } + return split.join("/"); + } + function assertResponse(response) { + if (`_response` in response) { + return response; + } + throw new TypeError(`Unexpected response object ${response}`); + } + exports2.StorageRetryPolicyType = undefined; + (function(StorageRetryPolicyType2) { + StorageRetryPolicyType2[StorageRetryPolicyType2["EXPONENTIAL"] = 0] = "EXPONENTIAL"; + StorageRetryPolicyType2[StorageRetryPolicyType2["FIXED"] = 1] = "FIXED"; + })(exports2.StorageRetryPolicyType || (exports2.StorageRetryPolicyType = {})); + var DEFAULT_RETRY_OPTIONS$1 = { + maxRetryDelayInMs: 120 * 1000, + maxTries: 4, + retryDelayInMs: 4 * 1000, + retryPolicyType: exports2.StorageRetryPolicyType.EXPONENTIAL, + secondaryHost: "", + tryTimeoutInMs: undefined + }; + var RETRY_ABORT_ERROR$1 = new abortController.AbortError("The operation was aborted."); + + class StorageRetryPolicy extends BaseRequestPolicy { + constructor(nextPolicy, options, retryOptions = DEFAULT_RETRY_OPTIONS$1) { + super(nextPolicy, options); + this.retryOptions = { + retryPolicyType: retryOptions.retryPolicyType ? retryOptions.retryPolicyType : DEFAULT_RETRY_OPTIONS$1.retryPolicyType, + maxTries: retryOptions.maxTries && retryOptions.maxTries >= 1 ? Math.floor(retryOptions.maxTries) : DEFAULT_RETRY_OPTIONS$1.maxTries, + tryTimeoutInMs: retryOptions.tryTimeoutInMs && retryOptions.tryTimeoutInMs >= 0 ? retryOptions.tryTimeoutInMs : DEFAULT_RETRY_OPTIONS$1.tryTimeoutInMs, + retryDelayInMs: retryOptions.retryDelayInMs && retryOptions.retryDelayInMs >= 0 ? Math.min(retryOptions.retryDelayInMs, retryOptions.maxRetryDelayInMs ? retryOptions.maxRetryDelayInMs : DEFAULT_RETRY_OPTIONS$1.maxRetryDelayInMs) : DEFAULT_RETRY_OPTIONS$1.retryDelayInMs, + maxRetryDelayInMs: retryOptions.maxRetryDelayInMs && retryOptions.maxRetryDelayInMs >= 0 ? retryOptions.maxRetryDelayInMs : DEFAULT_RETRY_OPTIONS$1.maxRetryDelayInMs, + secondaryHost: retryOptions.secondaryHost ? retryOptions.secondaryHost : DEFAULT_RETRY_OPTIONS$1.secondaryHost + }; + } + async sendRequest(request) { + return this.attemptSendRequest(request, false, 1); + } + async attemptSendRequest(request, secondaryHas404, attempt) { + const newRequest = request.clone(); + const isPrimaryRetry = secondaryHas404 || !this.retryOptions.secondaryHost || !(request.method === "GET" || request.method === "HEAD" || request.method === "OPTIONS") || attempt % 2 === 1; + if (!isPrimaryRetry) { + newRequest.url = setURLHost(newRequest.url, this.retryOptions.secondaryHost); + } + if (this.retryOptions.tryTimeoutInMs) { + newRequest.url = setURLParameter(newRequest.url, URLConstants.Parameters.TIMEOUT, Math.floor(this.retryOptions.tryTimeoutInMs / 1000).toString()); + } + let response; + try { + logger.info(`RetryPolicy: =====> Try=${attempt} ${isPrimaryRetry ? "Primary" : "Secondary"}`); + response = await this._nextPolicy.sendRequest(newRequest); + if (!this.shouldRetry(isPrimaryRetry, attempt, response)) { + return response; + } + secondaryHas404 = secondaryHas404 || !isPrimaryRetry && response.status === 404; + } catch (err) { + logger.error(`RetryPolicy: Caught error, message: ${err.message}, code: ${err.code}`); + if (!this.shouldRetry(isPrimaryRetry, attempt, response, err)) { + throw err; + } + } + await this.delay(isPrimaryRetry, attempt, request.abortSignal); + return this.attemptSendRequest(request, secondaryHas404, ++attempt); + } + shouldRetry(isPrimaryRetry, attempt, response, err) { + if (attempt >= this.retryOptions.maxTries) { + logger.info(`RetryPolicy: Attempt(s) ${attempt} >= maxTries ${this.retryOptions.maxTries}, no further try.`); + return false; + } + const retriableErrors2 = [ + "ETIMEDOUT", + "ESOCKETTIMEDOUT", + "ECONNREFUSED", + "ECONNRESET", + "ENOENT", + "ENOTFOUND", + "TIMEOUT", + "EPIPE", + "REQUEST_SEND_ERROR" + ]; + if (err) { + for (const retriableError of retriableErrors2) { + if (err.name.toUpperCase().includes(retriableError) || err.message.toUpperCase().includes(retriableError) || err.code && err.code.toString().toUpperCase() === retriableError) { + logger.info(`RetryPolicy: Network error ${retriableError} found, will retry.`); + return true; + } + } + } + if (response || err) { + const statusCode = response ? response.status : err ? err.statusCode : 0; + if (!isPrimaryRetry && statusCode === 404) { + logger.info(`RetryPolicy: Secondary access with 404, will retry.`); + return true; + } + if (statusCode === 503 || statusCode === 500) { + logger.info(`RetryPolicy: Will retry for status code ${statusCode}.`); + return true; + } + } + if ((err === null || err === undefined ? undefined : err.code) === "PARSE_ERROR" && (err === null || err === undefined ? undefined : err.message.startsWith(`Error "Error: Unclosed root tag`))) { + logger.info("RetryPolicy: Incomplete XML response likely due to service timeout, will retry."); + return true; + } + return false; + } + async delay(isPrimaryRetry, attempt, abortSignal) { + let delayTimeInMs = 0; + if (isPrimaryRetry) { + switch (this.retryOptions.retryPolicyType) { + case exports2.StorageRetryPolicyType.EXPONENTIAL: + delayTimeInMs = Math.min((Math.pow(2, attempt - 1) - 1) * this.retryOptions.retryDelayInMs, this.retryOptions.maxRetryDelayInMs); + break; + case exports2.StorageRetryPolicyType.FIXED: + delayTimeInMs = this.retryOptions.retryDelayInMs; + break; + } + } else { + delayTimeInMs = Math.random() * 1000; + } + logger.info(`RetryPolicy: Delay for ${delayTimeInMs}ms`); + return delay(delayTimeInMs, abortSignal, RETRY_ABORT_ERROR$1); + } + } + + class StorageRetryPolicyFactory { + constructor(retryOptions) { + this.retryOptions = retryOptions; + } + create(nextPolicy, options) { + return new StorageRetryPolicy(nextPolicy, options, this.retryOptions); + } + } + + class CredentialPolicy extends BaseRequestPolicy { + sendRequest(request) { + return this._nextPolicy.sendRequest(this.signRequest(request)); + } + signRequest(request) { + return request; + } + } + var table_lv0 = new Uint32Array([ + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1820, + 0, + 1823, + 1825, + 1827, + 1829, + 0, + 0, + 0, + 1837, + 2051, + 0, + 0, + 1843, + 0, + 3331, + 3354, + 3356, + 3358, + 3360, + 3362, + 3364, + 3366, + 3368, + 3370, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 3586, + 3593, + 3594, + 3610, + 3617, + 3619, + 3621, + 3628, + 3634, + 3637, + 3638, + 3656, + 3665, + 3696, + 3708, + 3710, + 3721, + 3722, + 3729, + 3737, + 3743, + 3746, + 3748, + 3750, + 3751, + 3753, + 0, + 0, + 0, + 1859, + 1860, + 1864, + 3586, + 3593, + 3594, + 3610, + 3617, + 3619, + 3621, + 3628, + 3634, + 3637, + 3638, + 3656, + 3665, + 3696, + 3708, + 3710, + 3721, + 3722, + 3729, + 3737, + 3743, + 3746, + 3748, + 3750, + 3751, + 3753, + 0, + 1868, + 0, + 1872, + 0 + ]); + var table_lv2 = new Uint32Array([ + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 18, + 18, + 18, + 18, + 18, + 18, + 18, + 18, + 18, + 18, + 18, + 18, + 18, + 18, + 18, + 18, + 18, + 18, + 18, + 18, + 18, + 18, + 18, + 18, + 18, + 18, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0 + ]); + var table_lv4 = new Uint32Array([ + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 32786, + 0, + 0, + 0, + 0, + 0, + 33298, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0 + ]); + function compareHeader(lhs, rhs) { + if (isLessThan(lhs, rhs)) + return -1; + return 1; + } + function isLessThan(lhs, rhs) { + const tables = [table_lv0, table_lv2, table_lv4]; + let curr_level = 0; + let i = 0; + let j = 0; + while (curr_level < tables.length) { + if (curr_level === tables.length - 1 && i !== j) { + return i > j; + } + const weight1 = i < lhs.length ? tables[curr_level][lhs[i].charCodeAt(0)] : 1; + const weight2 = j < rhs.length ? tables[curr_level][rhs[j].charCodeAt(0)] : 1; + if (weight1 === 1 && weight2 === 1) { + i = 0; + j = 0; + ++curr_level; + } else if (weight1 === weight2) { + ++i; + ++j; + } else if (weight1 === 0) { + ++i; + } else if (weight2 === 0) { + ++j; + } else { + return weight1 < weight2; + } + } + return false; + } + + class StorageSharedKeyCredentialPolicy extends CredentialPolicy { + constructor(nextPolicy, options, factory) { + super(nextPolicy, options); + this.factory = factory; + } + signRequest(request) { + request.headers.set(HeaderConstants.X_MS_DATE, new Date().toUTCString()); + if (request.body && (typeof request.body === "string" || request.body !== undefined) && request.body.length > 0) { + request.headers.set(HeaderConstants.CONTENT_LENGTH, Buffer.byteLength(request.body)); + } + const stringToSign = [ + request.method.toUpperCase(), + this.getHeaderValueToSign(request, HeaderConstants.CONTENT_LANGUAGE), + this.getHeaderValueToSign(request, HeaderConstants.CONTENT_ENCODING), + this.getHeaderValueToSign(request, HeaderConstants.CONTENT_LENGTH), + this.getHeaderValueToSign(request, HeaderConstants.CONTENT_MD5), + this.getHeaderValueToSign(request, HeaderConstants.CONTENT_TYPE), + this.getHeaderValueToSign(request, HeaderConstants.DATE), + this.getHeaderValueToSign(request, HeaderConstants.IF_MODIFIED_SINCE), + this.getHeaderValueToSign(request, HeaderConstants.IF_MATCH), + this.getHeaderValueToSign(request, HeaderConstants.IF_NONE_MATCH), + this.getHeaderValueToSign(request, HeaderConstants.IF_UNMODIFIED_SINCE), + this.getHeaderValueToSign(request, HeaderConstants.RANGE) + ].join("\n") + "\n" + this.getCanonicalizedHeadersString(request) + this.getCanonicalizedResourceString(request); + const signature = this.factory.computeHMACSHA256(stringToSign); + request.headers.set(HeaderConstants.AUTHORIZATION, `SharedKey ${this.factory.accountName}:${signature}`); + return request; + } + getHeaderValueToSign(request, headerName) { + const value = request.headers.get(headerName); + if (!value) { + return ""; + } + if (headerName === HeaderConstants.CONTENT_LENGTH && value === "0") { + return ""; + } + return value; + } + getCanonicalizedHeadersString(request) { + let headersArray = request.headers.headersArray().filter((value) => { + return value.name.toLowerCase().startsWith(HeaderConstants.PREFIX_FOR_STORAGE); + }); + headersArray.sort((a, b) => { + return compareHeader(a.name.toLowerCase(), b.name.toLowerCase()); + }); + headersArray = headersArray.filter((value, index, array) => { + if (index > 0 && value.name.toLowerCase() === array[index - 1].name.toLowerCase()) { + return false; + } + return true; + }); + let canonicalizedHeadersStringToSign = ""; + headersArray.forEach((header) => { + canonicalizedHeadersStringToSign += `${header.name.toLowerCase().trimRight()}:${header.value.trimLeft()}\n`; + }); + return canonicalizedHeadersStringToSign; + } + getCanonicalizedResourceString(request) { + const path = getURLPath(request.url) || "/"; + let canonicalizedResourceString = ""; + canonicalizedResourceString += `/${this.factory.accountName}${path}`; + const queries = getURLQueries(request.url); + const lowercaseQueries = {}; + if (queries) { + const queryKeys = []; + for (const key in queries) { + if (Object.prototype.hasOwnProperty.call(queries, key)) { + const lowercaseKey = key.toLowerCase(); + lowercaseQueries[lowercaseKey] = queries[key]; + queryKeys.push(lowercaseKey); + } + } + queryKeys.sort(); + for (const key of queryKeys) { + canonicalizedResourceString += `\n${key}:${decodeURIComponent(lowercaseQueries[key])}`; + } + } + return canonicalizedResourceString; + } + } + + class Credential { + create(_nextPolicy, _options) { + throw new Error("Method should be implemented in children classes."); + } + } + + class StorageSharedKeyCredential extends Credential { + constructor(accountName, accountKey) { + super(); + this.accountName = accountName; + this.accountKey = Buffer.from(accountKey, "base64"); + } + create(nextPolicy, options) { + return new StorageSharedKeyCredentialPolicy(nextPolicy, options, this); + } + computeHMACSHA256(stringToSign) { + return crypto.createHmac("sha256", this.accountKey).update(stringToSign, "utf8").digest("base64"); + } + } + + class AnonymousCredentialPolicy extends CredentialPolicy { + constructor(nextPolicy, options) { + super(nextPolicy, options); + } + } + + class AnonymousCredential extends Credential { + create(nextPolicy, options) { + return new AnonymousCredentialPolicy(nextPolicy, options); + } + } + var _defaultHttpClient; + function getCachedDefaultHttpClient() { + if (!_defaultHttpClient) { + _defaultHttpClient = coreRestPipeline.createDefaultHttpClient(); + } + return _defaultHttpClient; + } + var storageBrowserPolicyName = "storageBrowserPolicy"; + function storageBrowserPolicy() { + return { + name: storageBrowserPolicyName, + async sendRequest(request, next) { + if (coreUtil.isNode) { + return next(request); + } + if (request.method === "GET" || request.method === "HEAD") { + request.url = setURLParameter(request.url, URLConstants.Parameters.FORCE_BROWSER_NO_CACHE, new Date().getTime().toString()); + } + request.headers.delete(HeaderConstants.COOKIE); + request.headers.delete(HeaderConstants.CONTENT_LENGTH); + return next(request); + } + }; + } + var storageRetryPolicyName = "storageRetryPolicy"; + var StorageRetryPolicyType; + (function(StorageRetryPolicyType2) { + StorageRetryPolicyType2[StorageRetryPolicyType2["EXPONENTIAL"] = 0] = "EXPONENTIAL"; + StorageRetryPolicyType2[StorageRetryPolicyType2["FIXED"] = 1] = "FIXED"; + })(StorageRetryPolicyType || (StorageRetryPolicyType = {})); + var DEFAULT_RETRY_OPTIONS = { + maxRetryDelayInMs: 120 * 1000, + maxTries: 4, + retryDelayInMs: 4 * 1000, + retryPolicyType: StorageRetryPolicyType.EXPONENTIAL, + secondaryHost: "", + tryTimeoutInMs: undefined + }; + var retriableErrors = [ + "ETIMEDOUT", + "ESOCKETTIMEDOUT", + "ECONNREFUSED", + "ECONNRESET", + "ENOENT", + "ENOTFOUND", + "TIMEOUT", + "EPIPE", + "REQUEST_SEND_ERROR" + ]; + var RETRY_ABORT_ERROR = new abortController.AbortError("The operation was aborted."); + function storageRetryPolicy(options = {}) { + var _a, _b, _c, _d, _e, _f; + const retryPolicyType = (_a = options.retryPolicyType) !== null && _a !== undefined ? _a : DEFAULT_RETRY_OPTIONS.retryPolicyType; + const maxTries = (_b = options.maxTries) !== null && _b !== undefined ? _b : DEFAULT_RETRY_OPTIONS.maxTries; + const retryDelayInMs = (_c = options.retryDelayInMs) !== null && _c !== undefined ? _c : DEFAULT_RETRY_OPTIONS.retryDelayInMs; + const maxRetryDelayInMs = (_d = options.maxRetryDelayInMs) !== null && _d !== undefined ? _d : DEFAULT_RETRY_OPTIONS.maxRetryDelayInMs; + const secondaryHost = (_e = options.secondaryHost) !== null && _e !== undefined ? _e : DEFAULT_RETRY_OPTIONS.secondaryHost; + const tryTimeoutInMs = (_f = options.tryTimeoutInMs) !== null && _f !== undefined ? _f : DEFAULT_RETRY_OPTIONS.tryTimeoutInMs; + function shouldRetry({ isPrimaryRetry, attempt, response, error }) { + var _a2, _b2; + if (attempt >= maxTries) { + logger.info(`RetryPolicy: Attempt(s) ${attempt} >= maxTries ${maxTries}, no further try.`); + return false; + } + if (error) { + for (const retriableError of retriableErrors) { + if (error.name.toUpperCase().includes(retriableError) || error.message.toUpperCase().includes(retriableError) || error.code && error.code.toString().toUpperCase() === retriableError) { + logger.info(`RetryPolicy: Network error ${retriableError} found, will retry.`); + return true; + } + } + if ((error === null || error === undefined ? undefined : error.code) === "PARSE_ERROR" && (error === null || error === undefined ? undefined : error.message.startsWith(`Error "Error: Unclosed root tag`))) { + logger.info("RetryPolicy: Incomplete XML response likely due to service timeout, will retry."); + return true; + } + } + if (response || error) { + const statusCode = (_b2 = (_a2 = response === null || response === undefined ? undefined : response.status) !== null && _a2 !== undefined ? _a2 : error === null || error === undefined ? undefined : error.statusCode) !== null && _b2 !== undefined ? _b2 : 0; + if (!isPrimaryRetry && statusCode === 404) { + logger.info(`RetryPolicy: Secondary access with 404, will retry.`); + return true; + } + if (statusCode === 503 || statusCode === 500) { + logger.info(`RetryPolicy: Will retry for status code ${statusCode}.`); + return true; + } + } + return false; + } + function calculateDelay(isPrimaryRetry, attempt) { + let delayTimeInMs = 0; + if (isPrimaryRetry) { + switch (retryPolicyType) { + case StorageRetryPolicyType.EXPONENTIAL: + delayTimeInMs = Math.min((Math.pow(2, attempt - 1) - 1) * retryDelayInMs, maxRetryDelayInMs); + break; + case StorageRetryPolicyType.FIXED: + delayTimeInMs = retryDelayInMs; + break; + } + } else { + delayTimeInMs = Math.random() * 1000; + } + logger.info(`RetryPolicy: Delay for ${delayTimeInMs}ms`); + return delayTimeInMs; + } + return { + name: storageRetryPolicyName, + async sendRequest(request, next) { + if (tryTimeoutInMs) { + request.url = setURLParameter(request.url, URLConstants.Parameters.TIMEOUT, String(Math.floor(tryTimeoutInMs / 1000))); + } + const primaryUrl = request.url; + const secondaryUrl = secondaryHost ? setURLHost(request.url, secondaryHost) : undefined; + let secondaryHas404 = false; + let attempt = 1; + let retryAgain = true; + let response; + let error; + while (retryAgain) { + const isPrimaryRetry = secondaryHas404 || !secondaryUrl || !["GET", "HEAD", "OPTIONS"].includes(request.method) || attempt % 2 === 1; + request.url = isPrimaryRetry ? primaryUrl : secondaryUrl; + response = undefined; + error = undefined; + try { + logger.info(`RetryPolicy: =====> Try=${attempt} ${isPrimaryRetry ? "Primary" : "Secondary"}`); + response = await next(request); + secondaryHas404 = secondaryHas404 || !isPrimaryRetry && response.status === 404; + } catch (e) { + if (coreRestPipeline.isRestError(e)) { + logger.error(`RetryPolicy: Caught error, message: ${e.message}, code: ${e.code}`); + error = e; + } else { + logger.error(`RetryPolicy: Caught error, message: ${coreUtil.getErrorMessage(e)}`); + throw e; + } + } + retryAgain = shouldRetry({ isPrimaryRetry, attempt, response, error }); + if (retryAgain) { + await delay(calculateDelay(isPrimaryRetry, attempt), request.abortSignal, RETRY_ABORT_ERROR); + } + attempt++; + } + if (response) { + return response; + } + throw error !== null && error !== undefined ? error : new coreRestPipeline.RestError("RetryPolicy failed without known error."); + } + }; + } + var storageSharedKeyCredentialPolicyName = "storageSharedKeyCredentialPolicy"; + function storageSharedKeyCredentialPolicy(options) { + function signRequest(request) { + request.headers.set(HeaderConstants.X_MS_DATE, new Date().toUTCString()); + if (request.body && (typeof request.body === "string" || Buffer.isBuffer(request.body)) && request.body.length > 0) { + request.headers.set(HeaderConstants.CONTENT_LENGTH, Buffer.byteLength(request.body)); + } + const stringToSign = [ + request.method.toUpperCase(), + getHeaderValueToSign(request, HeaderConstants.CONTENT_LANGUAGE), + getHeaderValueToSign(request, HeaderConstants.CONTENT_ENCODING), + getHeaderValueToSign(request, HeaderConstants.CONTENT_LENGTH), + getHeaderValueToSign(request, HeaderConstants.CONTENT_MD5), + getHeaderValueToSign(request, HeaderConstants.CONTENT_TYPE), + getHeaderValueToSign(request, HeaderConstants.DATE), + getHeaderValueToSign(request, HeaderConstants.IF_MODIFIED_SINCE), + getHeaderValueToSign(request, HeaderConstants.IF_MATCH), + getHeaderValueToSign(request, HeaderConstants.IF_NONE_MATCH), + getHeaderValueToSign(request, HeaderConstants.IF_UNMODIFIED_SINCE), + getHeaderValueToSign(request, HeaderConstants.RANGE) + ].join("\n") + "\n" + getCanonicalizedHeadersString(request) + getCanonicalizedResourceString(request); + const signature = crypto.createHmac("sha256", options.accountKey).update(stringToSign, "utf8").digest("base64"); + request.headers.set(HeaderConstants.AUTHORIZATION, `SharedKey ${options.accountName}:${signature}`); + } + function getHeaderValueToSign(request, headerName) { + const value = request.headers.get(headerName); + if (!value) { + return ""; + } + if (headerName === HeaderConstants.CONTENT_LENGTH && value === "0") { + return ""; + } + return value; + } + function getCanonicalizedHeadersString(request) { + let headersArray = []; + for (const [name, value] of request.headers) { + if (name.toLowerCase().startsWith(HeaderConstants.PREFIX_FOR_STORAGE)) { + headersArray.push({ name, value }); + } + } + headersArray.sort((a, b) => { + return compareHeader(a.name.toLowerCase(), b.name.toLowerCase()); + }); + headersArray = headersArray.filter((value, index, array) => { + if (index > 0 && value.name.toLowerCase() === array[index - 1].name.toLowerCase()) { + return false; + } + return true; + }); + let canonicalizedHeadersStringToSign = ""; + headersArray.forEach((header) => { + canonicalizedHeadersStringToSign += `${header.name.toLowerCase().trimRight()}:${header.value.trimLeft()}\n`; + }); + return canonicalizedHeadersStringToSign; + } + function getCanonicalizedResourceString(request) { + const path = getURLPath(request.url) || "/"; + let canonicalizedResourceString = ""; + canonicalizedResourceString += `/${options.accountName}${path}`; + const queries = getURLQueries(request.url); + const lowercaseQueries = {}; + if (queries) { + const queryKeys = []; + for (const key in queries) { + if (Object.prototype.hasOwnProperty.call(queries, key)) { + const lowercaseKey = key.toLowerCase(); + lowercaseQueries[lowercaseKey] = queries[key]; + queryKeys.push(lowercaseKey); + } + } + queryKeys.sort(); + for (const key of queryKeys) { + canonicalizedResourceString += `\n${key}:${decodeURIComponent(lowercaseQueries[key])}`; + } + } + return canonicalizedResourceString; + } + return { + name: storageSharedKeyCredentialPolicyName, + async sendRequest(request, next) { + signRequest(request); + return next(request); + } + }; + } + + class StorageBrowserPolicy extends BaseRequestPolicy { + constructor(nextPolicy, options) { + super(nextPolicy, options); + } + async sendRequest(request) { + if (coreUtil.isNode) { + return this._nextPolicy.sendRequest(request); + } + if (request.method.toUpperCase() === "GET" || request.method.toUpperCase() === "HEAD") { + request.url = setURLParameter(request.url, URLConstants.Parameters.FORCE_BROWSER_NO_CACHE, new Date().getTime().toString()); + } + request.headers.remove(HeaderConstants.COOKIE); + request.headers.remove(HeaderConstants.CONTENT_LENGTH); + return this._nextPolicy.sendRequest(request); + } + } + + class StorageBrowserPolicyFactory { + create(nextPolicy, options) { + return new StorageBrowserPolicy(nextPolicy, options); + } + } + var storageCorrectContentLengthPolicyName = "StorageCorrectContentLengthPolicy"; + function storageCorrectContentLengthPolicy() { + function correctContentLength(request) { + if (request.body && (typeof request.body === "string" || Buffer.isBuffer(request.body)) && request.body.length > 0) { + request.headers.set(HeaderConstants.CONTENT_LENGTH, Buffer.byteLength(request.body)); + } + } + return { + name: storageCorrectContentLengthPolicyName, + async sendRequest(request, next) { + correctContentLength(request); + return next(request); + } + }; + } + function isPipelineLike(pipeline) { + if (!pipeline || typeof pipeline !== "object") { + return false; + } + const castPipeline = pipeline; + return Array.isArray(castPipeline.factories) && typeof castPipeline.options === "object" && typeof castPipeline.toServiceClientOptions === "function"; + } + + class Pipeline { + constructor(factories, options = {}) { + this.factories = factories; + this.options = options; + } + toServiceClientOptions() { + return { + httpClient: this.options.httpClient, + requestPolicyFactories: this.factories + }; + } + } + function newPipeline(credential, pipelineOptions = {}) { + if (!credential) { + credential = new AnonymousCredential; + } + const pipeline = new Pipeline([], pipelineOptions); + pipeline._credential = credential; + return pipeline; + } + function processDownlevelPipeline(pipeline) { + const knownFactoryFunctions = [ + isAnonymousCredential, + isStorageSharedKeyCredential, + isCoreHttpBearerTokenFactory, + isStorageBrowserPolicyFactory, + isStorageRetryPolicyFactory, + isStorageTelemetryPolicyFactory, + isCoreHttpPolicyFactory + ]; + if (pipeline.factories.length) { + const novelFactories = pipeline.factories.filter((factory) => { + return !knownFactoryFunctions.some((knownFactory) => knownFactory(factory)); + }); + if (novelFactories.length) { + const hasInjector = novelFactories.some((factory) => isInjectorPolicyFactory(factory)); + return { + wrappedPolicies: coreHttpCompat.createRequestPolicyFactoryPolicy(novelFactories), + afterRetry: hasInjector + }; + } + } + return; + } + function getCoreClientOptions(pipeline) { + var _a; + const _b = pipeline.options, { httpClient: v1Client } = _b, restOptions = tslib.__rest(_b, ["httpClient"]); + let httpClient = pipeline._coreHttpClient; + if (!httpClient) { + httpClient = v1Client ? coreHttpCompat.convertHttpClient(v1Client) : getCachedDefaultHttpClient(); + pipeline._coreHttpClient = httpClient; + } + let corePipeline = pipeline._corePipeline; + if (!corePipeline) { + const packageDetails = `azsdk-js-azure-storage-blob/${SDK_VERSION}`; + const userAgentPrefix = restOptions.userAgentOptions && restOptions.userAgentOptions.userAgentPrefix ? `${restOptions.userAgentOptions.userAgentPrefix} ${packageDetails}` : `${packageDetails}`; + corePipeline = coreClient.createClientPipeline(Object.assign(Object.assign({}, restOptions), { loggingOptions: { + additionalAllowedHeaderNames: StorageBlobLoggingAllowedHeaderNames, + additionalAllowedQueryParameters: StorageBlobLoggingAllowedQueryParameters, + logger: logger.info + }, userAgentOptions: { + userAgentPrefix + }, serializationOptions: { + stringifyXML: coreXml.stringifyXML, + serializerOptions: { + xml: { + xmlCharKey: "#" + } + } + }, deserializationOptions: { + parseXML: coreXml.parseXML, + serializerOptions: { + xml: { + xmlCharKey: "#" + } + } + } })); + corePipeline.removePolicy({ phase: "Retry" }); + corePipeline.removePolicy({ name: coreRestPipeline.decompressResponsePolicyName }); + corePipeline.addPolicy(storageCorrectContentLengthPolicy()); + corePipeline.addPolicy(storageRetryPolicy(restOptions.retryOptions), { phase: "Retry" }); + corePipeline.addPolicy(storageBrowserPolicy()); + const downlevelResults = processDownlevelPipeline(pipeline); + if (downlevelResults) { + corePipeline.addPolicy(downlevelResults.wrappedPolicies, downlevelResults.afterRetry ? { afterPhase: "Retry" } : undefined); + } + const credential = getCredentialFromPipeline(pipeline); + if (coreAuth.isTokenCredential(credential)) { + corePipeline.addPolicy(coreRestPipeline.bearerTokenAuthenticationPolicy({ + credential, + scopes: (_a = restOptions.audience) !== null && _a !== undefined ? _a : StorageOAuthScopes, + challengeCallbacks: { authorizeRequestOnChallenge: coreClient.authorizeRequestOnTenantChallenge } + }), { phase: "Sign" }); + } else if (credential instanceof StorageSharedKeyCredential) { + corePipeline.addPolicy(storageSharedKeyCredentialPolicy({ + accountName: credential.accountName, + accountKey: credential.accountKey + }), { phase: "Sign" }); + } + pipeline._corePipeline = corePipeline; + } + return Object.assign(Object.assign({}, restOptions), { allowInsecureConnection: true, httpClient, pipeline: corePipeline }); + } + function getCredentialFromPipeline(pipeline) { + if (pipeline._credential) { + return pipeline._credential; + } + let credential = new AnonymousCredential; + for (const factory of pipeline.factories) { + if (coreAuth.isTokenCredential(factory.credential)) { + credential = factory.credential; + } else if (isStorageSharedKeyCredential(factory)) { + return factory; + } + } + return credential; + } + function isStorageSharedKeyCredential(factory) { + if (factory instanceof StorageSharedKeyCredential) { + return true; + } + return factory.constructor.name === "StorageSharedKeyCredential"; + } + function isAnonymousCredential(factory) { + if (factory instanceof AnonymousCredential) { + return true; + } + return factory.constructor.name === "AnonymousCredential"; + } + function isCoreHttpBearerTokenFactory(factory) { + return coreAuth.isTokenCredential(factory.credential); + } + function isStorageBrowserPolicyFactory(factory) { + if (factory instanceof StorageBrowserPolicyFactory) { + return true; + } + return factory.constructor.name === "StorageBrowserPolicyFactory"; + } + function isStorageRetryPolicyFactory(factory) { + if (factory instanceof StorageRetryPolicyFactory) { + return true; + } + return factory.constructor.name === "StorageRetryPolicyFactory"; + } + function isStorageTelemetryPolicyFactory(factory) { + return factory.constructor.name === "TelemetryPolicyFactory"; + } + function isInjectorPolicyFactory(factory) { + return factory.constructor.name === "InjectorPolicyFactory"; + } + function isCoreHttpPolicyFactory(factory) { + const knownPolicies = [ + "GenerateClientRequestIdPolicy", + "TracingPolicy", + "LogPolicy", + "ProxyPolicy", + "DisableResponseDecompressionPolicy", + "KeepAlivePolicy", + "DeserializationPolicy" + ]; + const mockHttpClient = { + sendRequest: async (request) => { + return { + request, + headers: request.headers.clone(), + status: 500 + }; + } + }; + const mockRequestPolicyOptions = { + log(_logLevel, _message) { + }, + shouldLog(_logLevel) { + return false; + } + }; + const policyInstance = factory.create(mockHttpClient, mockRequestPolicyOptions); + const policyName = policyInstance.constructor.name; + return knownPolicies.some((knownPolicyName) => { + return policyName.startsWith(knownPolicyName); + }); + } + var BlobServiceProperties = { + serializedName: "BlobServiceProperties", + xmlName: "StorageServiceProperties", + type: { + name: "Composite", + className: "BlobServiceProperties", + modelProperties: { + blobAnalyticsLogging: { + serializedName: "Logging", + xmlName: "Logging", + type: { + name: "Composite", + className: "Logging" + } + }, + hourMetrics: { + serializedName: "HourMetrics", + xmlName: "HourMetrics", + type: { + name: "Composite", + className: "Metrics" + } + }, + minuteMetrics: { + serializedName: "MinuteMetrics", + xmlName: "MinuteMetrics", + type: { + name: "Composite", + className: "Metrics" + } + }, + cors: { + serializedName: "Cors", + xmlName: "Cors", + xmlIsWrapped: true, + xmlElementName: "CorsRule", + type: { + name: "Sequence", + element: { + type: { + name: "Composite", + className: "CorsRule" + } + } + } + }, + defaultServiceVersion: { + serializedName: "DefaultServiceVersion", + xmlName: "DefaultServiceVersion", + type: { + name: "String" + } + }, + deleteRetentionPolicy: { + serializedName: "DeleteRetentionPolicy", + xmlName: "DeleteRetentionPolicy", + type: { + name: "Composite", + className: "RetentionPolicy" + } + }, + staticWebsite: { + serializedName: "StaticWebsite", + xmlName: "StaticWebsite", + type: { + name: "Composite", + className: "StaticWebsite" + } + } + } + } + }; + var Logging = { + serializedName: "Logging", + type: { + name: "Composite", + className: "Logging", + modelProperties: { + version: { + serializedName: "Version", + required: true, + xmlName: "Version", + type: { + name: "String" + } + }, + deleteProperty: { + serializedName: "Delete", + required: true, + xmlName: "Delete", + type: { + name: "Boolean" + } + }, + read: { + serializedName: "Read", + required: true, + xmlName: "Read", + type: { + name: "Boolean" + } + }, + write: { + serializedName: "Write", + required: true, + xmlName: "Write", + type: { + name: "Boolean" + } + }, + retentionPolicy: { + serializedName: "RetentionPolicy", + xmlName: "RetentionPolicy", + type: { + name: "Composite", + className: "RetentionPolicy" + } + } + } + } + }; + var RetentionPolicy = { + serializedName: "RetentionPolicy", + type: { + name: "Composite", + className: "RetentionPolicy", + modelProperties: { + enabled: { + serializedName: "Enabled", + required: true, + xmlName: "Enabled", + type: { + name: "Boolean" + } + }, + days: { + constraints: { + InclusiveMinimum: 1 + }, + serializedName: "Days", + xmlName: "Days", + type: { + name: "Number" + } + } + } + } + }; + var Metrics = { + serializedName: "Metrics", + type: { + name: "Composite", + className: "Metrics", + modelProperties: { + version: { + serializedName: "Version", + xmlName: "Version", + type: { + name: "String" + } + }, + enabled: { + serializedName: "Enabled", + required: true, + xmlName: "Enabled", + type: { + name: "Boolean" + } + }, + includeAPIs: { + serializedName: "IncludeAPIs", + xmlName: "IncludeAPIs", + type: { + name: "Boolean" + } + }, + retentionPolicy: { + serializedName: "RetentionPolicy", + xmlName: "RetentionPolicy", + type: { + name: "Composite", + className: "RetentionPolicy" + } + } + } + } + }; + var CorsRule = { + serializedName: "CorsRule", + type: { + name: "Composite", + className: "CorsRule", + modelProperties: { + allowedOrigins: { + serializedName: "AllowedOrigins", + required: true, + xmlName: "AllowedOrigins", + type: { + name: "String" + } + }, + allowedMethods: { + serializedName: "AllowedMethods", + required: true, + xmlName: "AllowedMethods", + type: { + name: "String" + } + }, + allowedHeaders: { + serializedName: "AllowedHeaders", + required: true, + xmlName: "AllowedHeaders", + type: { + name: "String" + } + }, + exposedHeaders: { + serializedName: "ExposedHeaders", + required: true, + xmlName: "ExposedHeaders", + type: { + name: "String" + } + }, + maxAgeInSeconds: { + constraints: { + InclusiveMinimum: 0 + }, + serializedName: "MaxAgeInSeconds", + required: true, + xmlName: "MaxAgeInSeconds", + type: { + name: "Number" + } + } + } + } + }; + var StaticWebsite = { + serializedName: "StaticWebsite", + type: { + name: "Composite", + className: "StaticWebsite", + modelProperties: { + enabled: { + serializedName: "Enabled", + required: true, + xmlName: "Enabled", + type: { + name: "Boolean" + } + }, + indexDocument: { + serializedName: "IndexDocument", + xmlName: "IndexDocument", + type: { + name: "String" + } + }, + errorDocument404Path: { + serializedName: "ErrorDocument404Path", + xmlName: "ErrorDocument404Path", + type: { + name: "String" + } + }, + defaultIndexDocumentPath: { + serializedName: "DefaultIndexDocumentPath", + xmlName: "DefaultIndexDocumentPath", + type: { + name: "String" + } + } + } + } + }; + var StorageError = { + serializedName: "StorageError", + type: { + name: "Composite", + className: "StorageError", + modelProperties: { + message: { + serializedName: "Message", + xmlName: "Message", + type: { + name: "String" + } + }, + code: { + serializedName: "Code", + xmlName: "Code", + type: { + name: "String" + } + }, + authenticationErrorDetail: { + serializedName: "AuthenticationErrorDetail", + xmlName: "AuthenticationErrorDetail", + type: { + name: "String" + } + } + } + } + }; + var BlobServiceStatistics = { + serializedName: "BlobServiceStatistics", + xmlName: "StorageServiceStats", + type: { + name: "Composite", + className: "BlobServiceStatistics", + modelProperties: { + geoReplication: { + serializedName: "GeoReplication", + xmlName: "GeoReplication", + type: { + name: "Composite", + className: "GeoReplication" + } + } + } + } + }; + var GeoReplication = { + serializedName: "GeoReplication", + type: { + name: "Composite", + className: "GeoReplication", + modelProperties: { + status: { + serializedName: "Status", + required: true, + xmlName: "Status", + type: { + name: "Enum", + allowedValues: ["live", "bootstrap", "unavailable"] + } + }, + lastSyncOn: { + serializedName: "LastSyncTime", + required: true, + xmlName: "LastSyncTime", + type: { + name: "DateTimeRfc1123" + } + } + } + } + }; + var ListContainersSegmentResponse = { + serializedName: "ListContainersSegmentResponse", + xmlName: "EnumerationResults", + type: { + name: "Composite", + className: "ListContainersSegmentResponse", + modelProperties: { + serviceEndpoint: { + serializedName: "ServiceEndpoint", + required: true, + xmlName: "ServiceEndpoint", + xmlIsAttribute: true, + type: { + name: "String" + } + }, + prefix: { + serializedName: "Prefix", + xmlName: "Prefix", + type: { + name: "String" + } + }, + marker: { + serializedName: "Marker", + xmlName: "Marker", + type: { + name: "String" + } + }, + maxPageSize: { + serializedName: "MaxResults", + xmlName: "MaxResults", + type: { + name: "Number" + } + }, + containerItems: { + serializedName: "ContainerItems", + required: true, + xmlName: "Containers", + xmlIsWrapped: true, + xmlElementName: "Container", + type: { + name: "Sequence", + element: { + type: { + name: "Composite", + className: "ContainerItem" + } + } + } + }, + continuationToken: { + serializedName: "NextMarker", + xmlName: "NextMarker", + type: { + name: "String" + } + } + } + } + }; + var ContainerItem = { + serializedName: "ContainerItem", + xmlName: "Container", + type: { + name: "Composite", + className: "ContainerItem", + modelProperties: { + name: { + serializedName: "Name", + required: true, + xmlName: "Name", + type: { + name: "String" + } + }, + deleted: { + serializedName: "Deleted", + xmlName: "Deleted", + type: { + name: "Boolean" + } + }, + version: { + serializedName: "Version", + xmlName: "Version", + type: { + name: "String" + } + }, + properties: { + serializedName: "Properties", + xmlName: "Properties", + type: { + name: "Composite", + className: "ContainerProperties" + } + }, + metadata: { + serializedName: "Metadata", + xmlName: "Metadata", + type: { + name: "Dictionary", + value: { type: { name: "String" } } + } + } + } + } + }; + var ContainerProperties = { + serializedName: "ContainerProperties", + type: { + name: "Composite", + className: "ContainerProperties", + modelProperties: { + lastModified: { + serializedName: "Last-Modified", + required: true, + xmlName: "Last-Modified", + type: { + name: "DateTimeRfc1123" + } + }, + etag: { + serializedName: "Etag", + required: true, + xmlName: "Etag", + type: { + name: "String" + } + }, + leaseStatus: { + serializedName: "LeaseStatus", + xmlName: "LeaseStatus", + type: { + name: "Enum", + allowedValues: ["locked", "unlocked"] + } + }, + leaseState: { + serializedName: "LeaseState", + xmlName: "LeaseState", + type: { + name: "Enum", + allowedValues: [ + "available", + "leased", + "expired", + "breaking", + "broken" + ] + } + }, + leaseDuration: { + serializedName: "LeaseDuration", + xmlName: "LeaseDuration", + type: { + name: "Enum", + allowedValues: ["infinite", "fixed"] + } + }, + publicAccess: { + serializedName: "PublicAccess", + xmlName: "PublicAccess", + type: { + name: "Enum", + allowedValues: ["container", "blob"] + } + }, + hasImmutabilityPolicy: { + serializedName: "HasImmutabilityPolicy", + xmlName: "HasImmutabilityPolicy", + type: { + name: "Boolean" + } + }, + hasLegalHold: { + serializedName: "HasLegalHold", + xmlName: "HasLegalHold", + type: { + name: "Boolean" + } + }, + defaultEncryptionScope: { + serializedName: "DefaultEncryptionScope", + xmlName: "DefaultEncryptionScope", + type: { + name: "String" + } + }, + preventEncryptionScopeOverride: { + serializedName: "DenyEncryptionScopeOverride", + xmlName: "DenyEncryptionScopeOverride", + type: { + name: "Boolean" + } + }, + deletedOn: { + serializedName: "DeletedTime", + xmlName: "DeletedTime", + type: { + name: "DateTimeRfc1123" + } + }, + remainingRetentionDays: { + serializedName: "RemainingRetentionDays", + xmlName: "RemainingRetentionDays", + type: { + name: "Number" + } + }, + isImmutableStorageWithVersioningEnabled: { + serializedName: "ImmutableStorageWithVersioningEnabled", + xmlName: "ImmutableStorageWithVersioningEnabled", + type: { + name: "Boolean" + } + } + } + } + }; + var KeyInfo = { + serializedName: "KeyInfo", + type: { + name: "Composite", + className: "KeyInfo", + modelProperties: { + startsOn: { + serializedName: "Start", + required: true, + xmlName: "Start", + type: { + name: "String" + } + }, + expiresOn: { + serializedName: "Expiry", + required: true, + xmlName: "Expiry", + type: { + name: "String" + } + } + } + } + }; + var UserDelegationKey = { + serializedName: "UserDelegationKey", + type: { + name: "Composite", + className: "UserDelegationKey", + modelProperties: { + signedObjectId: { + serializedName: "SignedOid", + required: true, + xmlName: "SignedOid", + type: { + name: "String" + } + }, + signedTenantId: { + serializedName: "SignedTid", + required: true, + xmlName: "SignedTid", + type: { + name: "String" + } + }, + signedStartsOn: { + serializedName: "SignedStart", + required: true, + xmlName: "SignedStart", + type: { + name: "String" + } + }, + signedExpiresOn: { + serializedName: "SignedExpiry", + required: true, + xmlName: "SignedExpiry", + type: { + name: "String" + } + }, + signedService: { + serializedName: "SignedService", + required: true, + xmlName: "SignedService", + type: { + name: "String" + } + }, + signedVersion: { + serializedName: "SignedVersion", + required: true, + xmlName: "SignedVersion", + type: { + name: "String" + } + }, + value: { + serializedName: "Value", + required: true, + xmlName: "Value", + type: { + name: "String" + } + } + } + } + }; + var FilterBlobSegment = { + serializedName: "FilterBlobSegment", + xmlName: "EnumerationResults", + type: { + name: "Composite", + className: "FilterBlobSegment", + modelProperties: { + serviceEndpoint: { + serializedName: "ServiceEndpoint", + required: true, + xmlName: "ServiceEndpoint", + xmlIsAttribute: true, + type: { + name: "String" + } + }, + where: { + serializedName: "Where", + required: true, + xmlName: "Where", + type: { + name: "String" + } + }, + blobs: { + serializedName: "Blobs", + required: true, + xmlName: "Blobs", + xmlIsWrapped: true, + xmlElementName: "Blob", + type: { + name: "Sequence", + element: { + type: { + name: "Composite", + className: "FilterBlobItem" + } + } + } + }, + continuationToken: { + serializedName: "NextMarker", + xmlName: "NextMarker", + type: { + name: "String" + } + } + } + } + }; + var FilterBlobItem = { + serializedName: "FilterBlobItem", + xmlName: "Blob", + type: { + name: "Composite", + className: "FilterBlobItem", + modelProperties: { + name: { + serializedName: "Name", + required: true, + xmlName: "Name", + type: { + name: "String" + } + }, + containerName: { + serializedName: "ContainerName", + required: true, + xmlName: "ContainerName", + type: { + name: "String" + } + }, + tags: { + serializedName: "Tags", + xmlName: "Tags", + type: { + name: "Composite", + className: "BlobTags" + } + } + } + } + }; + var BlobTags = { + serializedName: "BlobTags", + xmlName: "Tags", + type: { + name: "Composite", + className: "BlobTags", + modelProperties: { + blobTagSet: { + serializedName: "BlobTagSet", + required: true, + xmlName: "TagSet", + xmlIsWrapped: true, + xmlElementName: "Tag", + type: { + name: "Sequence", + element: { + type: { + name: "Composite", + className: "BlobTag" + } + } + } + } + } + } + }; + var BlobTag = { + serializedName: "BlobTag", + xmlName: "Tag", + type: { + name: "Composite", + className: "BlobTag", + modelProperties: { + key: { + serializedName: "Key", + required: true, + xmlName: "Key", + type: { + name: "String" + } + }, + value: { + serializedName: "Value", + required: true, + xmlName: "Value", + type: { + name: "String" + } + } + } + } + }; + var SignedIdentifier = { + serializedName: "SignedIdentifier", + xmlName: "SignedIdentifier", + type: { + name: "Composite", + className: "SignedIdentifier", + modelProperties: { + id: { + serializedName: "Id", + required: true, + xmlName: "Id", + type: { + name: "String" + } + }, + accessPolicy: { + serializedName: "AccessPolicy", + xmlName: "AccessPolicy", + type: { + name: "Composite", + className: "AccessPolicy" + } + } + } + } + }; + var AccessPolicy = { + serializedName: "AccessPolicy", + type: { + name: "Composite", + className: "AccessPolicy", + modelProperties: { + startsOn: { + serializedName: "Start", + xmlName: "Start", + type: { + name: "String" + } + }, + expiresOn: { + serializedName: "Expiry", + xmlName: "Expiry", + type: { + name: "String" + } + }, + permissions: { + serializedName: "Permission", + xmlName: "Permission", + type: { + name: "String" + } + } + } + } + }; + var ListBlobsFlatSegmentResponse = { + serializedName: "ListBlobsFlatSegmentResponse", + xmlName: "EnumerationResults", + type: { + name: "Composite", + className: "ListBlobsFlatSegmentResponse", + modelProperties: { + serviceEndpoint: { + serializedName: "ServiceEndpoint", + required: true, + xmlName: "ServiceEndpoint", + xmlIsAttribute: true, + type: { + name: "String" + } + }, + containerName: { + serializedName: "ContainerName", + required: true, + xmlName: "ContainerName", + xmlIsAttribute: true, + type: { + name: "String" + } + }, + prefix: { + serializedName: "Prefix", + xmlName: "Prefix", + type: { + name: "String" + } + }, + marker: { + serializedName: "Marker", + xmlName: "Marker", + type: { + name: "String" + } + }, + maxPageSize: { + serializedName: "MaxResults", + xmlName: "MaxResults", + type: { + name: "Number" + } + }, + segment: { + serializedName: "Segment", + xmlName: "Blobs", + type: { + name: "Composite", + className: "BlobFlatListSegment" + } + }, + continuationToken: { + serializedName: "NextMarker", + xmlName: "NextMarker", + type: { + name: "String" + } + } + } + } + }; + var BlobFlatListSegment = { + serializedName: "BlobFlatListSegment", + xmlName: "Blobs", + type: { + name: "Composite", + className: "BlobFlatListSegment", + modelProperties: { + blobItems: { + serializedName: "BlobItems", + required: true, + xmlName: "BlobItems", + xmlElementName: "Blob", + type: { + name: "Sequence", + element: { + type: { + name: "Composite", + className: "BlobItemInternal" + } + } + } + } + } + } + }; + var BlobItemInternal = { + serializedName: "BlobItemInternal", + xmlName: "Blob", + type: { + name: "Composite", + className: "BlobItemInternal", + modelProperties: { + name: { + serializedName: "Name", + xmlName: "Name", + type: { + name: "Composite", + className: "BlobName" + } + }, + deleted: { + serializedName: "Deleted", + required: true, + xmlName: "Deleted", + type: { + name: "Boolean" + } + }, + snapshot: { + serializedName: "Snapshot", + required: true, + xmlName: "Snapshot", + type: { + name: "String" + } + }, + versionId: { + serializedName: "VersionId", + xmlName: "VersionId", + type: { + name: "String" + } + }, + isCurrentVersion: { + serializedName: "IsCurrentVersion", + xmlName: "IsCurrentVersion", + type: { + name: "Boolean" + } + }, + properties: { + serializedName: "Properties", + xmlName: "Properties", + type: { + name: "Composite", + className: "BlobPropertiesInternal" + } + }, + metadata: { + serializedName: "Metadata", + xmlName: "Metadata", + type: { + name: "Dictionary", + value: { type: { name: "String" } } + } + }, + blobTags: { + serializedName: "BlobTags", + xmlName: "Tags", + type: { + name: "Composite", + className: "BlobTags" + } + }, + objectReplicationMetadata: { + serializedName: "ObjectReplicationMetadata", + xmlName: "OrMetadata", + type: { + name: "Dictionary", + value: { type: { name: "String" } } + } + }, + hasVersionsOnly: { + serializedName: "HasVersionsOnly", + xmlName: "HasVersionsOnly", + type: { + name: "Boolean" + } + } + } + } + }; + var BlobName = { + serializedName: "BlobName", + type: { + name: "Composite", + className: "BlobName", + modelProperties: { + encoded: { + serializedName: "Encoded", + xmlName: "Encoded", + xmlIsAttribute: true, + type: { + name: "Boolean" + } + }, + content: { + serializedName: "content", + xmlName: "content", + xmlIsMsText: true, + type: { + name: "String" + } + } + } + } + }; + var BlobPropertiesInternal = { + serializedName: "BlobPropertiesInternal", + xmlName: "Properties", + type: { + name: "Composite", + className: "BlobPropertiesInternal", + modelProperties: { + createdOn: { + serializedName: "Creation-Time", + xmlName: "Creation-Time", + type: { + name: "DateTimeRfc1123" + } + }, + lastModified: { + serializedName: "Last-Modified", + required: true, + xmlName: "Last-Modified", + type: { + name: "DateTimeRfc1123" + } + }, + etag: { + serializedName: "Etag", + required: true, + xmlName: "Etag", + type: { + name: "String" + } + }, + contentLength: { + serializedName: "Content-Length", + xmlName: "Content-Length", + type: { + name: "Number" + } + }, + contentType: { + serializedName: "Content-Type", + xmlName: "Content-Type", + type: { + name: "String" + } + }, + contentEncoding: { + serializedName: "Content-Encoding", + xmlName: "Content-Encoding", + type: { + name: "String" + } + }, + contentLanguage: { + serializedName: "Content-Language", + xmlName: "Content-Language", + type: { + name: "String" + } + }, + contentMD5: { + serializedName: "Content-MD5", + xmlName: "Content-MD5", + type: { + name: "ByteArray" + } + }, + contentDisposition: { + serializedName: "Content-Disposition", + xmlName: "Content-Disposition", + type: { + name: "String" + } + }, + cacheControl: { + serializedName: "Cache-Control", + xmlName: "Cache-Control", + type: { + name: "String" + } + }, + blobSequenceNumber: { + serializedName: "x-ms-blob-sequence-number", + xmlName: "x-ms-blob-sequence-number", + type: { + name: "Number" + } + }, + blobType: { + serializedName: "BlobType", + xmlName: "BlobType", + type: { + name: "Enum", + allowedValues: ["BlockBlob", "PageBlob", "AppendBlob"] + } + }, + leaseStatus: { + serializedName: "LeaseStatus", + xmlName: "LeaseStatus", + type: { + name: "Enum", + allowedValues: ["locked", "unlocked"] + } + }, + leaseState: { + serializedName: "LeaseState", + xmlName: "LeaseState", + type: { + name: "Enum", + allowedValues: [ + "available", + "leased", + "expired", + "breaking", + "broken" + ] + } + }, + leaseDuration: { + serializedName: "LeaseDuration", + xmlName: "LeaseDuration", + type: { + name: "Enum", + allowedValues: ["infinite", "fixed"] + } + }, + copyId: { + serializedName: "CopyId", + xmlName: "CopyId", + type: { + name: "String" + } + }, + copyStatus: { + serializedName: "CopyStatus", + xmlName: "CopyStatus", + type: { + name: "Enum", + allowedValues: ["pending", "success", "aborted", "failed"] + } + }, + copySource: { + serializedName: "CopySource", + xmlName: "CopySource", + type: { + name: "String" + } + }, + copyProgress: { + serializedName: "CopyProgress", + xmlName: "CopyProgress", + type: { + name: "String" + } + }, + copyCompletedOn: { + serializedName: "CopyCompletionTime", + xmlName: "CopyCompletionTime", + type: { + name: "DateTimeRfc1123" + } + }, + copyStatusDescription: { + serializedName: "CopyStatusDescription", + xmlName: "CopyStatusDescription", + type: { + name: "String" + } + }, + serverEncrypted: { + serializedName: "ServerEncrypted", + xmlName: "ServerEncrypted", + type: { + name: "Boolean" + } + }, + incrementalCopy: { + serializedName: "IncrementalCopy", + xmlName: "IncrementalCopy", + type: { + name: "Boolean" + } + }, + destinationSnapshot: { + serializedName: "DestinationSnapshot", + xmlName: "DestinationSnapshot", + type: { + name: "String" + } + }, + deletedOn: { + serializedName: "DeletedTime", + xmlName: "DeletedTime", + type: { + name: "DateTimeRfc1123" + } + }, + remainingRetentionDays: { + serializedName: "RemainingRetentionDays", + xmlName: "RemainingRetentionDays", + type: { + name: "Number" + } + }, + accessTier: { + serializedName: "AccessTier", + xmlName: "AccessTier", + type: { + name: "Enum", + allowedValues: [ + "P4", + "P6", + "P10", + "P15", + "P20", + "P30", + "P40", + "P50", + "P60", + "P70", + "P80", + "Hot", + "Cool", + "Archive", + "Cold" + ] + } + }, + accessTierInferred: { + serializedName: "AccessTierInferred", + xmlName: "AccessTierInferred", + type: { + name: "Boolean" + } + }, + archiveStatus: { + serializedName: "ArchiveStatus", + xmlName: "ArchiveStatus", + type: { + name: "Enum", + allowedValues: [ + "rehydrate-pending-to-hot", + "rehydrate-pending-to-cool", + "rehydrate-pending-to-cold" + ] + } + }, + customerProvidedKeySha256: { + serializedName: "CustomerProvidedKeySha256", + xmlName: "CustomerProvidedKeySha256", + type: { + name: "String" + } + }, + encryptionScope: { + serializedName: "EncryptionScope", + xmlName: "EncryptionScope", + type: { + name: "String" + } + }, + accessTierChangedOn: { + serializedName: "AccessTierChangeTime", + xmlName: "AccessTierChangeTime", + type: { + name: "DateTimeRfc1123" + } + }, + tagCount: { + serializedName: "TagCount", + xmlName: "TagCount", + type: { + name: "Number" + } + }, + expiresOn: { + serializedName: "Expiry-Time", + xmlName: "Expiry-Time", + type: { + name: "DateTimeRfc1123" + } + }, + isSealed: { + serializedName: "Sealed", + xmlName: "Sealed", + type: { + name: "Boolean" + } + }, + rehydratePriority: { + serializedName: "RehydratePriority", + xmlName: "RehydratePriority", + type: { + name: "Enum", + allowedValues: ["High", "Standard"] + } + }, + lastAccessedOn: { + serializedName: "LastAccessTime", + xmlName: "LastAccessTime", + type: { + name: "DateTimeRfc1123" + } + }, + immutabilityPolicyExpiresOn: { + serializedName: "ImmutabilityPolicyUntilDate", + xmlName: "ImmutabilityPolicyUntilDate", + type: { + name: "DateTimeRfc1123" + } + }, + immutabilityPolicyMode: { + serializedName: "ImmutabilityPolicyMode", + xmlName: "ImmutabilityPolicyMode", + type: { + name: "Enum", + allowedValues: ["Mutable", "Unlocked", "Locked"] + } + }, + legalHold: { + serializedName: "LegalHold", + xmlName: "LegalHold", + type: { + name: "Boolean" + } + } + } + } + }; + var ListBlobsHierarchySegmentResponse = { + serializedName: "ListBlobsHierarchySegmentResponse", + xmlName: "EnumerationResults", + type: { + name: "Composite", + className: "ListBlobsHierarchySegmentResponse", + modelProperties: { + serviceEndpoint: { + serializedName: "ServiceEndpoint", + required: true, + xmlName: "ServiceEndpoint", + xmlIsAttribute: true, + type: { + name: "String" + } + }, + containerName: { + serializedName: "ContainerName", + required: true, + xmlName: "ContainerName", + xmlIsAttribute: true, + type: { + name: "String" + } + }, + prefix: { + serializedName: "Prefix", + xmlName: "Prefix", + type: { + name: "String" + } + }, + marker: { + serializedName: "Marker", + xmlName: "Marker", + type: { + name: "String" + } + }, + maxPageSize: { + serializedName: "MaxResults", + xmlName: "MaxResults", + type: { + name: "Number" + } + }, + delimiter: { + serializedName: "Delimiter", + xmlName: "Delimiter", + type: { + name: "String" + } + }, + segment: { + serializedName: "Segment", + xmlName: "Blobs", + type: { + name: "Composite", + className: "BlobHierarchyListSegment" + } + }, + continuationToken: { + serializedName: "NextMarker", + xmlName: "NextMarker", + type: { + name: "String" + } + } + } + } + }; + var BlobHierarchyListSegment = { + serializedName: "BlobHierarchyListSegment", + xmlName: "Blobs", + type: { + name: "Composite", + className: "BlobHierarchyListSegment", + modelProperties: { + blobPrefixes: { + serializedName: "BlobPrefixes", + xmlName: "BlobPrefixes", + xmlElementName: "BlobPrefix", + type: { + name: "Sequence", + element: { + type: { + name: "Composite", + className: "BlobPrefix" + } + } + } + }, + blobItems: { + serializedName: "BlobItems", + required: true, + xmlName: "BlobItems", + xmlElementName: "Blob", + type: { + name: "Sequence", + element: { + type: { + name: "Composite", + className: "BlobItemInternal" + } + } + } + } + } + } + }; + var BlobPrefix = { + serializedName: "BlobPrefix", + type: { + name: "Composite", + className: "BlobPrefix", + modelProperties: { + name: { + serializedName: "Name", + xmlName: "Name", + type: { + name: "Composite", + className: "BlobName" + } + } + } + } + }; + var BlockLookupList = { + serializedName: "BlockLookupList", + xmlName: "BlockList", + type: { + name: "Composite", + className: "BlockLookupList", + modelProperties: { + committed: { + serializedName: "Committed", + xmlName: "Committed", + xmlElementName: "Committed", + type: { + name: "Sequence", + element: { + type: { + name: "String" + } + } + } + }, + uncommitted: { + serializedName: "Uncommitted", + xmlName: "Uncommitted", + xmlElementName: "Uncommitted", + type: { + name: "Sequence", + element: { + type: { + name: "String" + } + } + } + }, + latest: { + serializedName: "Latest", + xmlName: "Latest", + xmlElementName: "Latest", + type: { + name: "Sequence", + element: { + type: { + name: "String" + } + } + } + } + } + } + }; + var BlockList = { + serializedName: "BlockList", + type: { + name: "Composite", + className: "BlockList", + modelProperties: { + committedBlocks: { + serializedName: "CommittedBlocks", + xmlName: "CommittedBlocks", + xmlIsWrapped: true, + xmlElementName: "Block", + type: { + name: "Sequence", + element: { + type: { + name: "Composite", + className: "Block" + } + } + } + }, + uncommittedBlocks: { + serializedName: "UncommittedBlocks", + xmlName: "UncommittedBlocks", + xmlIsWrapped: true, + xmlElementName: "Block", + type: { + name: "Sequence", + element: { + type: { + name: "Composite", + className: "Block" + } + } + } + } + } + } + }; + var Block = { + serializedName: "Block", + type: { + name: "Composite", + className: "Block", + modelProperties: { + name: { + serializedName: "Name", + required: true, + xmlName: "Name", + type: { + name: "String" + } + }, + size: { + serializedName: "Size", + required: true, + xmlName: "Size", + type: { + name: "Number" + } + } + } + } + }; + var PageList = { + serializedName: "PageList", + type: { + name: "Composite", + className: "PageList", + modelProperties: { + pageRange: { + serializedName: "PageRange", + xmlName: "PageRange", + xmlElementName: "PageRange", + type: { + name: "Sequence", + element: { + type: { + name: "Composite", + className: "PageRange" + } + } + } + }, + clearRange: { + serializedName: "ClearRange", + xmlName: "ClearRange", + xmlElementName: "ClearRange", + type: { + name: "Sequence", + element: { + type: { + name: "Composite", + className: "ClearRange" + } + } + } + }, + continuationToken: { + serializedName: "NextMarker", + xmlName: "NextMarker", + type: { + name: "String" + } + } + } + } + }; + var PageRange = { + serializedName: "PageRange", + xmlName: "PageRange", + type: { + name: "Composite", + className: "PageRange", + modelProperties: { + start: { + serializedName: "Start", + required: true, + xmlName: "Start", + type: { + name: "Number" + } + }, + end: { + serializedName: "End", + required: true, + xmlName: "End", + type: { + name: "Number" + } + } + } + } + }; + var ClearRange = { + serializedName: "ClearRange", + xmlName: "ClearRange", + type: { + name: "Composite", + className: "ClearRange", + modelProperties: { + start: { + serializedName: "Start", + required: true, + xmlName: "Start", + type: { + name: "Number" + } + }, + end: { + serializedName: "End", + required: true, + xmlName: "End", + type: { + name: "Number" + } + } + } + } + }; + var QueryRequest = { + serializedName: "QueryRequest", + xmlName: "QueryRequest", + type: { + name: "Composite", + className: "QueryRequest", + modelProperties: { + queryType: { + serializedName: "QueryType", + required: true, + xmlName: "QueryType", + type: { + name: "String" + } + }, + expression: { + serializedName: "Expression", + required: true, + xmlName: "Expression", + type: { + name: "String" + } + }, + inputSerialization: { + serializedName: "InputSerialization", + xmlName: "InputSerialization", + type: { + name: "Composite", + className: "QuerySerialization" + } + }, + outputSerialization: { + serializedName: "OutputSerialization", + xmlName: "OutputSerialization", + type: { + name: "Composite", + className: "QuerySerialization" + } + } + } + } + }; + var QuerySerialization = { + serializedName: "QuerySerialization", + type: { + name: "Composite", + className: "QuerySerialization", + modelProperties: { + format: { + serializedName: "Format", + xmlName: "Format", + type: { + name: "Composite", + className: "QueryFormat" + } + } + } + } + }; + var QueryFormat = { + serializedName: "QueryFormat", + type: { + name: "Composite", + className: "QueryFormat", + modelProperties: { + type: { + serializedName: "Type", + required: true, + xmlName: "Type", + type: { + name: "Enum", + allowedValues: ["delimited", "json", "arrow", "parquet"] + } + }, + delimitedTextConfiguration: { + serializedName: "DelimitedTextConfiguration", + xmlName: "DelimitedTextConfiguration", + type: { + name: "Composite", + className: "DelimitedTextConfiguration" + } + }, + jsonTextConfiguration: { + serializedName: "JsonTextConfiguration", + xmlName: "JsonTextConfiguration", + type: { + name: "Composite", + className: "JsonTextConfiguration" + } + }, + arrowConfiguration: { + serializedName: "ArrowConfiguration", + xmlName: "ArrowConfiguration", + type: { + name: "Composite", + className: "ArrowConfiguration" + } + }, + parquetTextConfiguration: { + serializedName: "ParquetTextConfiguration", + xmlName: "ParquetTextConfiguration", + type: { + name: "Dictionary", + value: { type: { name: "any" } } + } + } + } + } + }; + var DelimitedTextConfiguration = { + serializedName: "DelimitedTextConfiguration", + xmlName: "DelimitedTextConfiguration", + type: { + name: "Composite", + className: "DelimitedTextConfiguration", + modelProperties: { + columnSeparator: { + serializedName: "ColumnSeparator", + xmlName: "ColumnSeparator", + type: { + name: "String" + } + }, + fieldQuote: { + serializedName: "FieldQuote", + xmlName: "FieldQuote", + type: { + name: "String" + } + }, + recordSeparator: { + serializedName: "RecordSeparator", + xmlName: "RecordSeparator", + type: { + name: "String" + } + }, + escapeChar: { + serializedName: "EscapeChar", + xmlName: "EscapeChar", + type: { + name: "String" + } + }, + headersPresent: { + serializedName: "HeadersPresent", + xmlName: "HasHeaders", + type: { + name: "Boolean" + } + } + } + } + }; + var JsonTextConfiguration = { + serializedName: "JsonTextConfiguration", + xmlName: "JsonTextConfiguration", + type: { + name: "Composite", + className: "JsonTextConfiguration", + modelProperties: { + recordSeparator: { + serializedName: "RecordSeparator", + xmlName: "RecordSeparator", + type: { + name: "String" + } + } + } + } + }; + var ArrowConfiguration = { + serializedName: "ArrowConfiguration", + xmlName: "ArrowConfiguration", + type: { + name: "Composite", + className: "ArrowConfiguration", + modelProperties: { + schema: { + serializedName: "Schema", + required: true, + xmlName: "Schema", + xmlIsWrapped: true, + xmlElementName: "Field", + type: { + name: "Sequence", + element: { + type: { + name: "Composite", + className: "ArrowField" + } + } + } + } + } + } + }; + var ArrowField = { + serializedName: "ArrowField", + xmlName: "Field", + type: { + name: "Composite", + className: "ArrowField", + modelProperties: { + type: { + serializedName: "Type", + required: true, + xmlName: "Type", + type: { + name: "String" + } + }, + name: { + serializedName: "Name", + xmlName: "Name", + type: { + name: "String" + } + }, + precision: { + serializedName: "Precision", + xmlName: "Precision", + type: { + name: "Number" + } + }, + scale: { + serializedName: "Scale", + xmlName: "Scale", + type: { + name: "Number" + } + } + } + } + }; + var ServiceSetPropertiesHeaders = { + serializedName: "Service_setPropertiesHeaders", + type: { + name: "Composite", + className: "ServiceSetPropertiesHeaders", + modelProperties: { + clientRequestId: { + serializedName: "x-ms-client-request-id", + xmlName: "x-ms-client-request-id", + type: { + name: "String" + } + }, + requestId: { + serializedName: "x-ms-request-id", + xmlName: "x-ms-request-id", + type: { + name: "String" + } + }, + version: { + serializedName: "x-ms-version", + xmlName: "x-ms-version", + type: { + name: "String" + } + }, + errorCode: { + serializedName: "x-ms-error-code", + xmlName: "x-ms-error-code", + type: { + name: "String" + } + } + } + } + }; + var ServiceSetPropertiesExceptionHeaders = { + serializedName: "Service_setPropertiesExceptionHeaders", + type: { + name: "Composite", + className: "ServiceSetPropertiesExceptionHeaders", + modelProperties: { + errorCode: { + serializedName: "x-ms-error-code", + xmlName: "x-ms-error-code", + type: { + name: "String" + } + } + } + } + }; + var ServiceGetPropertiesHeaders = { + serializedName: "Service_getPropertiesHeaders", + type: { + name: "Composite", + className: "ServiceGetPropertiesHeaders", + modelProperties: { + clientRequestId: { + serializedName: "x-ms-client-request-id", + xmlName: "x-ms-client-request-id", + type: { + name: "String" + } + }, + requestId: { + serializedName: "x-ms-request-id", + xmlName: "x-ms-request-id", + type: { + name: "String" + } + }, + version: { + serializedName: "x-ms-version", + xmlName: "x-ms-version", + type: { + name: "String" + } + }, + errorCode: { + serializedName: "x-ms-error-code", + xmlName: "x-ms-error-code", + type: { + name: "String" + } + } + } + } + }; + var ServiceGetPropertiesExceptionHeaders = { + serializedName: "Service_getPropertiesExceptionHeaders", + type: { + name: "Composite", + className: "ServiceGetPropertiesExceptionHeaders", + modelProperties: { + errorCode: { + serializedName: "x-ms-error-code", + xmlName: "x-ms-error-code", + type: { + name: "String" + } + } + } + } + }; + var ServiceGetStatisticsHeaders = { + serializedName: "Service_getStatisticsHeaders", + type: { + name: "Composite", + className: "ServiceGetStatisticsHeaders", + modelProperties: { + clientRequestId: { + serializedName: "x-ms-client-request-id", + xmlName: "x-ms-client-request-id", + type: { + name: "String" + } + }, + requestId: { + serializedName: "x-ms-request-id", + xmlName: "x-ms-request-id", + type: { + name: "String" + } + }, + version: { + serializedName: "x-ms-version", + xmlName: "x-ms-version", + type: { + name: "String" + } + }, + date: { + serializedName: "date", + xmlName: "date", + type: { + name: "DateTimeRfc1123" + } + }, + errorCode: { + serializedName: "x-ms-error-code", + xmlName: "x-ms-error-code", + type: { + name: "String" + } + } + } + } + }; + var ServiceGetStatisticsExceptionHeaders = { + serializedName: "Service_getStatisticsExceptionHeaders", + type: { + name: "Composite", + className: "ServiceGetStatisticsExceptionHeaders", + modelProperties: { + errorCode: { + serializedName: "x-ms-error-code", + xmlName: "x-ms-error-code", + type: { + name: "String" + } + } + } + } + }; + var ServiceListContainersSegmentHeaders = { + serializedName: "Service_listContainersSegmentHeaders", + type: { + name: "Composite", + className: "ServiceListContainersSegmentHeaders", + modelProperties: { + clientRequestId: { + serializedName: "x-ms-client-request-id", + xmlName: "x-ms-client-request-id", + type: { + name: "String" + } + }, + requestId: { + serializedName: "x-ms-request-id", + xmlName: "x-ms-request-id", + type: { + name: "String" + } + }, + version: { + serializedName: "x-ms-version", + xmlName: "x-ms-version", + type: { + name: "String" + } + }, + errorCode: { + serializedName: "x-ms-error-code", + xmlName: "x-ms-error-code", + type: { + name: "String" + } + } + } + } + }; + var ServiceListContainersSegmentExceptionHeaders = { + serializedName: "Service_listContainersSegmentExceptionHeaders", + type: { + name: "Composite", + className: "ServiceListContainersSegmentExceptionHeaders", + modelProperties: { + errorCode: { + serializedName: "x-ms-error-code", + xmlName: "x-ms-error-code", + type: { + name: "String" + } + } + } + } + }; + var ServiceGetUserDelegationKeyHeaders = { + serializedName: "Service_getUserDelegationKeyHeaders", + type: { + name: "Composite", + className: "ServiceGetUserDelegationKeyHeaders", + modelProperties: { + clientRequestId: { + serializedName: "x-ms-client-request-id", + xmlName: "x-ms-client-request-id", + type: { + name: "String" + } + }, + requestId: { + serializedName: "x-ms-request-id", + xmlName: "x-ms-request-id", + type: { + name: "String" + } + }, + version: { + serializedName: "x-ms-version", + xmlName: "x-ms-version", + type: { + name: "String" + } + }, + date: { + serializedName: "date", + xmlName: "date", + type: { + name: "DateTimeRfc1123" + } + }, + errorCode: { + serializedName: "x-ms-error-code", + xmlName: "x-ms-error-code", + type: { + name: "String" + } + } + } + } + }; + var ServiceGetUserDelegationKeyExceptionHeaders = { + serializedName: "Service_getUserDelegationKeyExceptionHeaders", + type: { + name: "Composite", + className: "ServiceGetUserDelegationKeyExceptionHeaders", + modelProperties: { + errorCode: { + serializedName: "x-ms-error-code", + xmlName: "x-ms-error-code", + type: { + name: "String" + } + } + } + } + }; + var ServiceGetAccountInfoHeaders = { + serializedName: "Service_getAccountInfoHeaders", + type: { + name: "Composite", + className: "ServiceGetAccountInfoHeaders", + modelProperties: { + clientRequestId: { + serializedName: "x-ms-client-request-id", + xmlName: "x-ms-client-request-id", + type: { + name: "String" + } + }, + requestId: { + serializedName: "x-ms-request-id", + xmlName: "x-ms-request-id", + type: { + name: "String" + } + }, + version: { + serializedName: "x-ms-version", + xmlName: "x-ms-version", + type: { + name: "String" + } + }, + date: { + serializedName: "date", + xmlName: "date", + type: { + name: "DateTimeRfc1123" + } + }, + skuName: { + serializedName: "x-ms-sku-name", + xmlName: "x-ms-sku-name", + type: { + name: "Enum", + allowedValues: [ + "Standard_LRS", + "Standard_GRS", + "Standard_RAGRS", + "Standard_ZRS", + "Premium_LRS" + ] + } + }, + accountKind: { + serializedName: "x-ms-account-kind", + xmlName: "x-ms-account-kind", + type: { + name: "Enum", + allowedValues: [ + "Storage", + "BlobStorage", + "StorageV2", + "FileStorage", + "BlockBlobStorage" + ] + } + }, + isHierarchicalNamespaceEnabled: { + serializedName: "x-ms-is-hns-enabled", + xmlName: "x-ms-is-hns-enabled", + type: { + name: "Boolean" + } + }, + errorCode: { + serializedName: "x-ms-error-code", + xmlName: "x-ms-error-code", + type: { + name: "String" + } + } + } + } + }; + var ServiceGetAccountInfoExceptionHeaders = { + serializedName: "Service_getAccountInfoExceptionHeaders", + type: { + name: "Composite", + className: "ServiceGetAccountInfoExceptionHeaders", + modelProperties: { + errorCode: { + serializedName: "x-ms-error-code", + xmlName: "x-ms-error-code", + type: { + name: "String" + } + } + } + } + }; + var ServiceSubmitBatchHeaders = { + serializedName: "Service_submitBatchHeaders", + type: { + name: "Composite", + className: "ServiceSubmitBatchHeaders", + modelProperties: { + contentType: { + serializedName: "content-type", + xmlName: "content-type", + type: { + name: "String" + } + }, + requestId: { + serializedName: "x-ms-request-id", + xmlName: "x-ms-request-id", + type: { + name: "String" + } + }, + version: { + serializedName: "x-ms-version", + xmlName: "x-ms-version", + type: { + name: "String" + } + }, + clientRequestId: { + serializedName: "x-ms-client-request-id", + xmlName: "x-ms-client-request-id", + type: { + name: "String" + } + }, + errorCode: { + serializedName: "x-ms-error-code", + xmlName: "x-ms-error-code", + type: { + name: "String" + } + } + } + } + }; + var ServiceSubmitBatchExceptionHeaders = { + serializedName: "Service_submitBatchExceptionHeaders", + type: { + name: "Composite", + className: "ServiceSubmitBatchExceptionHeaders", + modelProperties: { + errorCode: { + serializedName: "x-ms-error-code", + xmlName: "x-ms-error-code", + type: { + name: "String" + } + } + } + } + }; + var ServiceFilterBlobsHeaders = { + serializedName: "Service_filterBlobsHeaders", + type: { + name: "Composite", + className: "ServiceFilterBlobsHeaders", + modelProperties: { + clientRequestId: { + serializedName: "x-ms-client-request-id", + xmlName: "x-ms-client-request-id", + type: { + name: "String" + } + }, + requestId: { + serializedName: "x-ms-request-id", + xmlName: "x-ms-request-id", + type: { + name: "String" + } + }, + version: { + serializedName: "x-ms-version", + xmlName: "x-ms-version", + type: { + name: "String" + } + }, + date: { + serializedName: "date", + xmlName: "date", + type: { + name: "DateTimeRfc1123" + } + }, + errorCode: { + serializedName: "x-ms-error-code", + xmlName: "x-ms-error-code", + type: { + name: "String" + } + } + } + } + }; + var ServiceFilterBlobsExceptionHeaders = { + serializedName: "Service_filterBlobsExceptionHeaders", + type: { + name: "Composite", + className: "ServiceFilterBlobsExceptionHeaders", + modelProperties: { + errorCode: { + serializedName: "x-ms-error-code", + xmlName: "x-ms-error-code", + type: { + name: "String" + } + } + } + } + }; + var ContainerCreateHeaders = { + serializedName: "Container_createHeaders", + type: { + name: "Composite", + className: "ContainerCreateHeaders", + modelProperties: { + etag: { + serializedName: "etag", + xmlName: "etag", + type: { + name: "String" + } + }, + lastModified: { + serializedName: "last-modified", + xmlName: "last-modified", + type: { + name: "DateTimeRfc1123" + } + }, + clientRequestId: { + serializedName: "x-ms-client-request-id", + xmlName: "x-ms-client-request-id", + type: { + name: "String" + } + }, + requestId: { + serializedName: "x-ms-request-id", + xmlName: "x-ms-request-id", + type: { + name: "String" + } + }, + version: { + serializedName: "x-ms-version", + xmlName: "x-ms-version", + type: { + name: "String" + } + }, + date: { + serializedName: "date", + xmlName: "date", + type: { + name: "DateTimeRfc1123" + } + }, + errorCode: { + serializedName: "x-ms-error-code", + xmlName: "x-ms-error-code", + type: { + name: "String" + } + } + } + } + }; + var ContainerCreateExceptionHeaders = { + serializedName: "Container_createExceptionHeaders", + type: { + name: "Composite", + className: "ContainerCreateExceptionHeaders", + modelProperties: { + errorCode: { + serializedName: "x-ms-error-code", + xmlName: "x-ms-error-code", + type: { + name: "String" + } + } + } + } + }; + var ContainerGetPropertiesHeaders = { + serializedName: "Container_getPropertiesHeaders", + type: { + name: "Composite", + className: "ContainerGetPropertiesHeaders", + modelProperties: { + metadata: { + serializedName: "x-ms-meta", + headerCollectionPrefix: "x-ms-meta-", + xmlName: "x-ms-meta", + type: { + name: "Dictionary", + value: { type: { name: "String" } } + } + }, + etag: { + serializedName: "etag", + xmlName: "etag", + type: { + name: "String" + } + }, + lastModified: { + serializedName: "last-modified", + xmlName: "last-modified", + type: { + name: "DateTimeRfc1123" + } + }, + leaseDuration: { + serializedName: "x-ms-lease-duration", + xmlName: "x-ms-lease-duration", + type: { + name: "Enum", + allowedValues: ["infinite", "fixed"] + } + }, + leaseState: { + serializedName: "x-ms-lease-state", + xmlName: "x-ms-lease-state", + type: { + name: "Enum", + allowedValues: [ + "available", + "leased", + "expired", + "breaking", + "broken" + ] + } + }, + leaseStatus: { + serializedName: "x-ms-lease-status", + xmlName: "x-ms-lease-status", + type: { + name: "Enum", + allowedValues: ["locked", "unlocked"] + } + }, + clientRequestId: { + serializedName: "x-ms-client-request-id", + xmlName: "x-ms-client-request-id", + type: { + name: "String" + } + }, + requestId: { + serializedName: "x-ms-request-id", + xmlName: "x-ms-request-id", + type: { + name: "String" + } + }, + version: { + serializedName: "x-ms-version", + xmlName: "x-ms-version", + type: { + name: "String" + } + }, + date: { + serializedName: "date", + xmlName: "date", + type: { + name: "DateTimeRfc1123" + } + }, + blobPublicAccess: { + serializedName: "x-ms-blob-public-access", + xmlName: "x-ms-blob-public-access", + type: { + name: "Enum", + allowedValues: ["container", "blob"] + } + }, + hasImmutabilityPolicy: { + serializedName: "x-ms-has-immutability-policy", + xmlName: "x-ms-has-immutability-policy", + type: { + name: "Boolean" + } + }, + hasLegalHold: { + serializedName: "x-ms-has-legal-hold", + xmlName: "x-ms-has-legal-hold", + type: { + name: "Boolean" + } + }, + defaultEncryptionScope: { + serializedName: "x-ms-default-encryption-scope", + xmlName: "x-ms-default-encryption-scope", + type: { + name: "String" + } + }, + denyEncryptionScopeOverride: { + serializedName: "x-ms-deny-encryption-scope-override", + xmlName: "x-ms-deny-encryption-scope-override", + type: { + name: "Boolean" + } + }, + isImmutableStorageWithVersioningEnabled: { + serializedName: "x-ms-immutable-storage-with-versioning-enabled", + xmlName: "x-ms-immutable-storage-with-versioning-enabled", + type: { + name: "Boolean" + } + }, + errorCode: { + serializedName: "x-ms-error-code", + xmlName: "x-ms-error-code", + type: { + name: "String" + } + } + } + } + }; + var ContainerGetPropertiesExceptionHeaders = { + serializedName: "Container_getPropertiesExceptionHeaders", + type: { + name: "Composite", + className: "ContainerGetPropertiesExceptionHeaders", + modelProperties: { + errorCode: { + serializedName: "x-ms-error-code", + xmlName: "x-ms-error-code", + type: { + name: "String" + } + } + } + } + }; + var ContainerDeleteHeaders = { + serializedName: "Container_deleteHeaders", + type: { + name: "Composite", + className: "ContainerDeleteHeaders", + modelProperties: { + clientRequestId: { + serializedName: "x-ms-client-request-id", + xmlName: "x-ms-client-request-id", + type: { + name: "String" + } + }, + requestId: { + serializedName: "x-ms-request-id", + xmlName: "x-ms-request-id", + type: { + name: "String" + } + }, + version: { + serializedName: "x-ms-version", + xmlName: "x-ms-version", + type: { + name: "String" + } + }, + date: { + serializedName: "date", + xmlName: "date", + type: { + name: "DateTimeRfc1123" + } + }, + errorCode: { + serializedName: "x-ms-error-code", + xmlName: "x-ms-error-code", + type: { + name: "String" + } + } + } + } + }; + var ContainerDeleteExceptionHeaders = { + serializedName: "Container_deleteExceptionHeaders", + type: { + name: "Composite", + className: "ContainerDeleteExceptionHeaders", + modelProperties: { + errorCode: { + serializedName: "x-ms-error-code", + xmlName: "x-ms-error-code", + type: { + name: "String" + } + } + } + } + }; + var ContainerSetMetadataHeaders = { + serializedName: "Container_setMetadataHeaders", + type: { + name: "Composite", + className: "ContainerSetMetadataHeaders", + modelProperties: { + etag: { + serializedName: "etag", + xmlName: "etag", + type: { + name: "String" + } + }, + lastModified: { + serializedName: "last-modified", + xmlName: "last-modified", + type: { + name: "DateTimeRfc1123" + } + }, + clientRequestId: { + serializedName: "x-ms-client-request-id", + xmlName: "x-ms-client-request-id", + type: { + name: "String" + } + }, + requestId: { + serializedName: "x-ms-request-id", + xmlName: "x-ms-request-id", + type: { + name: "String" + } + }, + version: { + serializedName: "x-ms-version", + xmlName: "x-ms-version", + type: { + name: "String" + } + }, + date: { + serializedName: "date", + xmlName: "date", + type: { + name: "DateTimeRfc1123" + } + }, + errorCode: { + serializedName: "x-ms-error-code", + xmlName: "x-ms-error-code", + type: { + name: "String" + } + } + } + } + }; + var ContainerSetMetadataExceptionHeaders = { + serializedName: "Container_setMetadataExceptionHeaders", + type: { + name: "Composite", + className: "ContainerSetMetadataExceptionHeaders", + modelProperties: { + errorCode: { + serializedName: "x-ms-error-code", + xmlName: "x-ms-error-code", + type: { + name: "String" + } + } + } + } + }; + var ContainerGetAccessPolicyHeaders = { + serializedName: "Container_getAccessPolicyHeaders", + type: { + name: "Composite", + className: "ContainerGetAccessPolicyHeaders", + modelProperties: { + blobPublicAccess: { + serializedName: "x-ms-blob-public-access", + xmlName: "x-ms-blob-public-access", + type: { + name: "Enum", + allowedValues: ["container", "blob"] + } + }, + etag: { + serializedName: "etag", + xmlName: "etag", + type: { + name: "String" + } + }, + lastModified: { + serializedName: "last-modified", + xmlName: "last-modified", + type: { + name: "DateTimeRfc1123" + } + }, + clientRequestId: { + serializedName: "x-ms-client-request-id", + xmlName: "x-ms-client-request-id", + type: { + name: "String" + } + }, + requestId: { + serializedName: "x-ms-request-id", + xmlName: "x-ms-request-id", + type: { + name: "String" + } + }, + version: { + serializedName: "x-ms-version", + xmlName: "x-ms-version", + type: { + name: "String" + } + }, + date: { + serializedName: "date", + xmlName: "date", + type: { + name: "DateTimeRfc1123" + } + }, + errorCode: { + serializedName: "x-ms-error-code", + xmlName: "x-ms-error-code", + type: { + name: "String" + } + } + } + } + }; + var ContainerGetAccessPolicyExceptionHeaders = { + serializedName: "Container_getAccessPolicyExceptionHeaders", + type: { + name: "Composite", + className: "ContainerGetAccessPolicyExceptionHeaders", + modelProperties: { + errorCode: { + serializedName: "x-ms-error-code", + xmlName: "x-ms-error-code", + type: { + name: "String" + } + } + } + } + }; + var ContainerSetAccessPolicyHeaders = { + serializedName: "Container_setAccessPolicyHeaders", + type: { + name: "Composite", + className: "ContainerSetAccessPolicyHeaders", + modelProperties: { + etag: { + serializedName: "etag", + xmlName: "etag", + type: { + name: "String" + } + }, + lastModified: { + serializedName: "last-modified", + xmlName: "last-modified", + type: { + name: "DateTimeRfc1123" + } + }, + clientRequestId: { + serializedName: "x-ms-client-request-id", + xmlName: "x-ms-client-request-id", + type: { + name: "String" + } + }, + requestId: { + serializedName: "x-ms-request-id", + xmlName: "x-ms-request-id", + type: { + name: "String" + } + }, + version: { + serializedName: "x-ms-version", + xmlName: "x-ms-version", + type: { + name: "String" + } + }, + date: { + serializedName: "date", + xmlName: "date", + type: { + name: "DateTimeRfc1123" + } + }, + errorCode: { + serializedName: "x-ms-error-code", + xmlName: "x-ms-error-code", + type: { + name: "String" + } + } + } + } + }; + var ContainerSetAccessPolicyExceptionHeaders = { + serializedName: "Container_setAccessPolicyExceptionHeaders", + type: { + name: "Composite", + className: "ContainerSetAccessPolicyExceptionHeaders", + modelProperties: { + errorCode: { + serializedName: "x-ms-error-code", + xmlName: "x-ms-error-code", + type: { + name: "String" + } + } + } + } + }; + var ContainerRestoreHeaders = { + serializedName: "Container_restoreHeaders", + type: { + name: "Composite", + className: "ContainerRestoreHeaders", + modelProperties: { + clientRequestId: { + serializedName: "x-ms-client-request-id", + xmlName: "x-ms-client-request-id", + type: { + name: "String" + } + }, + requestId: { + serializedName: "x-ms-request-id", + xmlName: "x-ms-request-id", + type: { + name: "String" + } + }, + version: { + serializedName: "x-ms-version", + xmlName: "x-ms-version", + type: { + name: "String" + } + }, + date: { + serializedName: "date", + xmlName: "date", + type: { + name: "DateTimeRfc1123" + } + }, + errorCode: { + serializedName: "x-ms-error-code", + xmlName: "x-ms-error-code", + type: { + name: "String" + } + } + } + } + }; + var ContainerRestoreExceptionHeaders = { + serializedName: "Container_restoreExceptionHeaders", + type: { + name: "Composite", + className: "ContainerRestoreExceptionHeaders", + modelProperties: { + errorCode: { + serializedName: "x-ms-error-code", + xmlName: "x-ms-error-code", + type: { + name: "String" + } + } + } + } + }; + var ContainerRenameHeaders = { + serializedName: "Container_renameHeaders", + type: { + name: "Composite", + className: "ContainerRenameHeaders", + modelProperties: { + clientRequestId: { + serializedName: "x-ms-client-request-id", + xmlName: "x-ms-client-request-id", + type: { + name: "String" + } + }, + requestId: { + serializedName: "x-ms-request-id", + xmlName: "x-ms-request-id", + type: { + name: "String" + } + }, + version: { + serializedName: "x-ms-version", + xmlName: "x-ms-version", + type: { + name: "String" + } + }, + date: { + serializedName: "date", + xmlName: "date", + type: { + name: "DateTimeRfc1123" + } + }, + errorCode: { + serializedName: "x-ms-error-code", + xmlName: "x-ms-error-code", + type: { + name: "String" + } + } + } + } + }; + var ContainerRenameExceptionHeaders = { + serializedName: "Container_renameExceptionHeaders", + type: { + name: "Composite", + className: "ContainerRenameExceptionHeaders", + modelProperties: { + errorCode: { + serializedName: "x-ms-error-code", + xmlName: "x-ms-error-code", + type: { + name: "String" + } + } + } + } + }; + var ContainerSubmitBatchHeaders = { + serializedName: "Container_submitBatchHeaders", + type: { + name: "Composite", + className: "ContainerSubmitBatchHeaders", + modelProperties: { + contentType: { + serializedName: "content-type", + xmlName: "content-type", + type: { + name: "String" + } + }, + requestId: { + serializedName: "x-ms-request-id", + xmlName: "x-ms-request-id", + type: { + name: "String" + } + }, + version: { + serializedName: "x-ms-version", + xmlName: "x-ms-version", + type: { + name: "String" + } + } + } + } + }; + var ContainerSubmitBatchExceptionHeaders = { + serializedName: "Container_submitBatchExceptionHeaders", + type: { + name: "Composite", + className: "ContainerSubmitBatchExceptionHeaders", + modelProperties: { + errorCode: { + serializedName: "x-ms-error-code", + xmlName: "x-ms-error-code", + type: { + name: "String" + } + } + } + } + }; + var ContainerFilterBlobsHeaders = { + serializedName: "Container_filterBlobsHeaders", + type: { + name: "Composite", + className: "ContainerFilterBlobsHeaders", + modelProperties: { + clientRequestId: { + serializedName: "x-ms-client-request-id", + xmlName: "x-ms-client-request-id", + type: { + name: "String" + } + }, + requestId: { + serializedName: "x-ms-request-id", + xmlName: "x-ms-request-id", + type: { + name: "String" + } + }, + version: { + serializedName: "x-ms-version", + xmlName: "x-ms-version", + type: { + name: "String" + } + }, + date: { + serializedName: "date", + xmlName: "date", + type: { + name: "DateTimeRfc1123" + } + } + } + } + }; + var ContainerFilterBlobsExceptionHeaders = { + serializedName: "Container_filterBlobsExceptionHeaders", + type: { + name: "Composite", + className: "ContainerFilterBlobsExceptionHeaders", + modelProperties: { + errorCode: { + serializedName: "x-ms-error-code", + xmlName: "x-ms-error-code", + type: { + name: "String" + } + } + } + } + }; + var ContainerAcquireLeaseHeaders = { + serializedName: "Container_acquireLeaseHeaders", + type: { + name: "Composite", + className: "ContainerAcquireLeaseHeaders", + modelProperties: { + etag: { + serializedName: "etag", + xmlName: "etag", + type: { + name: "String" + } + }, + lastModified: { + serializedName: "last-modified", + xmlName: "last-modified", + type: { + name: "DateTimeRfc1123" + } + }, + leaseId: { + serializedName: "x-ms-lease-id", + xmlName: "x-ms-lease-id", + type: { + name: "String" + } + }, + clientRequestId: { + serializedName: "x-ms-client-request-id", + xmlName: "x-ms-client-request-id", + type: { + name: "String" + } + }, + requestId: { + serializedName: "x-ms-request-id", + xmlName: "x-ms-request-id", + type: { + name: "String" + } + }, + version: { + serializedName: "x-ms-version", + xmlName: "x-ms-version", + type: { + name: "String" + } + }, + date: { + serializedName: "date", + xmlName: "date", + type: { + name: "DateTimeRfc1123" + } + } + } + } + }; + var ContainerAcquireLeaseExceptionHeaders = { + serializedName: "Container_acquireLeaseExceptionHeaders", + type: { + name: "Composite", + className: "ContainerAcquireLeaseExceptionHeaders", + modelProperties: { + errorCode: { + serializedName: "x-ms-error-code", + xmlName: "x-ms-error-code", + type: { + name: "String" + } + } + } + } + }; + var ContainerReleaseLeaseHeaders = { + serializedName: "Container_releaseLeaseHeaders", + type: { + name: "Composite", + className: "ContainerReleaseLeaseHeaders", + modelProperties: { + etag: { + serializedName: "etag", + xmlName: "etag", + type: { + name: "String" + } + }, + lastModified: { + serializedName: "last-modified", + xmlName: "last-modified", + type: { + name: "DateTimeRfc1123" + } + }, + clientRequestId: { + serializedName: "x-ms-client-request-id", + xmlName: "x-ms-client-request-id", + type: { + name: "String" + } + }, + requestId: { + serializedName: "x-ms-request-id", + xmlName: "x-ms-request-id", + type: { + name: "String" + } + }, + version: { + serializedName: "x-ms-version", + xmlName: "x-ms-version", + type: { + name: "String" + } + }, + date: { + serializedName: "date", + xmlName: "date", + type: { + name: "DateTimeRfc1123" + } + } + } + } + }; + var ContainerReleaseLeaseExceptionHeaders = { + serializedName: "Container_releaseLeaseExceptionHeaders", + type: { + name: "Composite", + className: "ContainerReleaseLeaseExceptionHeaders", + modelProperties: { + errorCode: { + serializedName: "x-ms-error-code", + xmlName: "x-ms-error-code", + type: { + name: "String" + } + } + } + } + }; + var ContainerRenewLeaseHeaders = { + serializedName: "Container_renewLeaseHeaders", + type: { + name: "Composite", + className: "ContainerRenewLeaseHeaders", + modelProperties: { + etag: { + serializedName: "etag", + xmlName: "etag", + type: { + name: "String" + } + }, + lastModified: { + serializedName: "last-modified", + xmlName: "last-modified", + type: { + name: "DateTimeRfc1123" + } + }, + leaseId: { + serializedName: "x-ms-lease-id", + xmlName: "x-ms-lease-id", + type: { + name: "String" + } + }, + clientRequestId: { + serializedName: "x-ms-client-request-id", + xmlName: "x-ms-client-request-id", + type: { + name: "String" + } + }, + requestId: { + serializedName: "x-ms-request-id", + xmlName: "x-ms-request-id", + type: { + name: "String" + } + }, + version: { + serializedName: "x-ms-version", + xmlName: "x-ms-version", + type: { + name: "String" + } + }, + date: { + serializedName: "date", + xmlName: "date", + type: { + name: "DateTimeRfc1123" + } + } + } + } + }; + var ContainerRenewLeaseExceptionHeaders = { + serializedName: "Container_renewLeaseExceptionHeaders", + type: { + name: "Composite", + className: "ContainerRenewLeaseExceptionHeaders", + modelProperties: { + errorCode: { + serializedName: "x-ms-error-code", + xmlName: "x-ms-error-code", + type: { + name: "String" + } + } + } + } + }; + var ContainerBreakLeaseHeaders = { + serializedName: "Container_breakLeaseHeaders", + type: { + name: "Composite", + className: "ContainerBreakLeaseHeaders", + modelProperties: { + etag: { + serializedName: "etag", + xmlName: "etag", + type: { + name: "String" + } + }, + lastModified: { + serializedName: "last-modified", + xmlName: "last-modified", + type: { + name: "DateTimeRfc1123" + } + }, + leaseTime: { + serializedName: "x-ms-lease-time", + xmlName: "x-ms-lease-time", + type: { + name: "Number" + } + }, + clientRequestId: { + serializedName: "x-ms-client-request-id", + xmlName: "x-ms-client-request-id", + type: { + name: "String" + } + }, + requestId: { + serializedName: "x-ms-request-id", + xmlName: "x-ms-request-id", + type: { + name: "String" + } + }, + version: { + serializedName: "x-ms-version", + xmlName: "x-ms-version", + type: { + name: "String" + } + }, + date: { + serializedName: "date", + xmlName: "date", + type: { + name: "DateTimeRfc1123" + } + } + } + } + }; + var ContainerBreakLeaseExceptionHeaders = { + serializedName: "Container_breakLeaseExceptionHeaders", + type: { + name: "Composite", + className: "ContainerBreakLeaseExceptionHeaders", + modelProperties: { + errorCode: { + serializedName: "x-ms-error-code", + xmlName: "x-ms-error-code", + type: { + name: "String" + } + } + } + } + }; + var ContainerChangeLeaseHeaders = { + serializedName: "Container_changeLeaseHeaders", + type: { + name: "Composite", + className: "ContainerChangeLeaseHeaders", + modelProperties: { + etag: { + serializedName: "etag", + xmlName: "etag", + type: { + name: "String" + } + }, + lastModified: { + serializedName: "last-modified", + xmlName: "last-modified", + type: { + name: "DateTimeRfc1123" + } + }, + leaseId: { + serializedName: "x-ms-lease-id", + xmlName: "x-ms-lease-id", + type: { + name: "String" + } + }, + clientRequestId: { + serializedName: "x-ms-client-request-id", + xmlName: "x-ms-client-request-id", + type: { + name: "String" + } + }, + requestId: { + serializedName: "x-ms-request-id", + xmlName: "x-ms-request-id", + type: { + name: "String" + } + }, + version: { + serializedName: "x-ms-version", + xmlName: "x-ms-version", + type: { + name: "String" + } + }, + date: { + serializedName: "date", + xmlName: "date", + type: { + name: "DateTimeRfc1123" + } + } + } + } + }; + var ContainerChangeLeaseExceptionHeaders = { + serializedName: "Container_changeLeaseExceptionHeaders", + type: { + name: "Composite", + className: "ContainerChangeLeaseExceptionHeaders", + modelProperties: { + errorCode: { + serializedName: "x-ms-error-code", + xmlName: "x-ms-error-code", + type: { + name: "String" + } + } + } + } + }; + var ContainerListBlobFlatSegmentHeaders = { + serializedName: "Container_listBlobFlatSegmentHeaders", + type: { + name: "Composite", + className: "ContainerListBlobFlatSegmentHeaders", + modelProperties: { + contentType: { + serializedName: "content-type", + xmlName: "content-type", + type: { + name: "String" + } + }, + clientRequestId: { + serializedName: "x-ms-client-request-id", + xmlName: "x-ms-client-request-id", + type: { + name: "String" + } + }, + requestId: { + serializedName: "x-ms-request-id", + xmlName: "x-ms-request-id", + type: { + name: "String" + } + }, + version: { + serializedName: "x-ms-version", + xmlName: "x-ms-version", + type: { + name: "String" + } + }, + date: { + serializedName: "date", + xmlName: "date", + type: { + name: "DateTimeRfc1123" + } + }, + errorCode: { + serializedName: "x-ms-error-code", + xmlName: "x-ms-error-code", + type: { + name: "String" + } + } + } + } + }; + var ContainerListBlobFlatSegmentExceptionHeaders = { + serializedName: "Container_listBlobFlatSegmentExceptionHeaders", + type: { + name: "Composite", + className: "ContainerListBlobFlatSegmentExceptionHeaders", + modelProperties: { + errorCode: { + serializedName: "x-ms-error-code", + xmlName: "x-ms-error-code", + type: { + name: "String" + } + } + } + } + }; + var ContainerListBlobHierarchySegmentHeaders = { + serializedName: "Container_listBlobHierarchySegmentHeaders", + type: { + name: "Composite", + className: "ContainerListBlobHierarchySegmentHeaders", + modelProperties: { + contentType: { + serializedName: "content-type", + xmlName: "content-type", + type: { + name: "String" + } + }, + clientRequestId: { + serializedName: "x-ms-client-request-id", + xmlName: "x-ms-client-request-id", + type: { + name: "String" + } + }, + requestId: { + serializedName: "x-ms-request-id", + xmlName: "x-ms-request-id", + type: { + name: "String" + } + }, + version: { + serializedName: "x-ms-version", + xmlName: "x-ms-version", + type: { + name: "String" + } + }, + date: { + serializedName: "date", + xmlName: "date", + type: { + name: "DateTimeRfc1123" + } + }, + errorCode: { + serializedName: "x-ms-error-code", + xmlName: "x-ms-error-code", + type: { + name: "String" + } + } + } + } + }; + var ContainerListBlobHierarchySegmentExceptionHeaders = { + serializedName: "Container_listBlobHierarchySegmentExceptionHeaders", + type: { + name: "Composite", + className: "ContainerListBlobHierarchySegmentExceptionHeaders", + modelProperties: { + errorCode: { + serializedName: "x-ms-error-code", + xmlName: "x-ms-error-code", + type: { + name: "String" + } + } + } + } + }; + var ContainerGetAccountInfoHeaders = { + serializedName: "Container_getAccountInfoHeaders", + type: { + name: "Composite", + className: "ContainerGetAccountInfoHeaders", + modelProperties: { + clientRequestId: { + serializedName: "x-ms-client-request-id", + xmlName: "x-ms-client-request-id", + type: { + name: "String" + } + }, + requestId: { + serializedName: "x-ms-request-id", + xmlName: "x-ms-request-id", + type: { + name: "String" + } + }, + version: { + serializedName: "x-ms-version", + xmlName: "x-ms-version", + type: { + name: "String" + } + }, + date: { + serializedName: "date", + xmlName: "date", + type: { + name: "DateTimeRfc1123" + } + }, + skuName: { + serializedName: "x-ms-sku-name", + xmlName: "x-ms-sku-name", + type: { + name: "Enum", + allowedValues: [ + "Standard_LRS", + "Standard_GRS", + "Standard_RAGRS", + "Standard_ZRS", + "Premium_LRS" + ] + } + }, + accountKind: { + serializedName: "x-ms-account-kind", + xmlName: "x-ms-account-kind", + type: { + name: "Enum", + allowedValues: [ + "Storage", + "BlobStorage", + "StorageV2", + "FileStorage", + "BlockBlobStorage" + ] + } + }, + isHierarchicalNamespaceEnabled: { + serializedName: "x-ms-is-hns-enabled", + xmlName: "x-ms-is-hns-enabled", + type: { + name: "Boolean" + } + } + } + } + }; + var ContainerGetAccountInfoExceptionHeaders = { + serializedName: "Container_getAccountInfoExceptionHeaders", + type: { + name: "Composite", + className: "ContainerGetAccountInfoExceptionHeaders", + modelProperties: { + errorCode: { + serializedName: "x-ms-error-code", + xmlName: "x-ms-error-code", + type: { + name: "String" + } + } + } + } + }; + var BlobDownloadHeaders = { + serializedName: "Blob_downloadHeaders", + type: { + name: "Composite", + className: "BlobDownloadHeaders", + modelProperties: { + lastModified: { + serializedName: "last-modified", + xmlName: "last-modified", + type: { + name: "DateTimeRfc1123" + } + }, + createdOn: { + serializedName: "x-ms-creation-time", + xmlName: "x-ms-creation-time", + type: { + name: "DateTimeRfc1123" + } + }, + metadata: { + serializedName: "x-ms-meta", + headerCollectionPrefix: "x-ms-meta-", + xmlName: "x-ms-meta", + type: { + name: "Dictionary", + value: { type: { name: "String" } } + } + }, + objectReplicationPolicyId: { + serializedName: "x-ms-or-policy-id", + xmlName: "x-ms-or-policy-id", + type: { + name: "String" + } + }, + objectReplicationRules: { + serializedName: "x-ms-or", + headerCollectionPrefix: "x-ms-or-", + xmlName: "x-ms-or", + type: { + name: "Dictionary", + value: { type: { name: "String" } } + } + }, + contentLength: { + serializedName: "content-length", + xmlName: "content-length", + type: { + name: "Number" + } + }, + contentType: { + serializedName: "content-type", + xmlName: "content-type", + type: { + name: "String" + } + }, + contentRange: { + serializedName: "content-range", + xmlName: "content-range", + type: { + name: "String" + } + }, + etag: { + serializedName: "etag", + xmlName: "etag", + type: { + name: "String" + } + }, + contentMD5: { + serializedName: "content-md5", + xmlName: "content-md5", + type: { + name: "ByteArray" + } + }, + contentEncoding: { + serializedName: "content-encoding", + xmlName: "content-encoding", + type: { + name: "String" + } + }, + cacheControl: { + serializedName: "cache-control", + xmlName: "cache-control", + type: { + name: "String" + } + }, + contentDisposition: { + serializedName: "content-disposition", + xmlName: "content-disposition", + type: { + name: "String" + } + }, + contentLanguage: { + serializedName: "content-language", + xmlName: "content-language", + type: { + name: "String" + } + }, + blobSequenceNumber: { + serializedName: "x-ms-blob-sequence-number", + xmlName: "x-ms-blob-sequence-number", + type: { + name: "Number" + } + }, + blobType: { + serializedName: "x-ms-blob-type", + xmlName: "x-ms-blob-type", + type: { + name: "Enum", + allowedValues: ["BlockBlob", "PageBlob", "AppendBlob"] + } + }, + copyCompletedOn: { + serializedName: "x-ms-copy-completion-time", + xmlName: "x-ms-copy-completion-time", + type: { + name: "DateTimeRfc1123" + } + }, + copyStatusDescription: { + serializedName: "x-ms-copy-status-description", + xmlName: "x-ms-copy-status-description", + type: { + name: "String" + } + }, + copyId: { + serializedName: "x-ms-copy-id", + xmlName: "x-ms-copy-id", + type: { + name: "String" + } + }, + copyProgress: { + serializedName: "x-ms-copy-progress", + xmlName: "x-ms-copy-progress", + type: { + name: "String" + } + }, + copySource: { + serializedName: "x-ms-copy-source", + xmlName: "x-ms-copy-source", + type: { + name: "String" + } + }, + copyStatus: { + serializedName: "x-ms-copy-status", + xmlName: "x-ms-copy-status", + type: { + name: "Enum", + allowedValues: ["pending", "success", "aborted", "failed"] + } + }, + leaseDuration: { + serializedName: "x-ms-lease-duration", + xmlName: "x-ms-lease-duration", + type: { + name: "Enum", + allowedValues: ["infinite", "fixed"] + } + }, + leaseState: { + serializedName: "x-ms-lease-state", + xmlName: "x-ms-lease-state", + type: { + name: "Enum", + allowedValues: [ + "available", + "leased", + "expired", + "breaking", + "broken" + ] + } + }, + leaseStatus: { + serializedName: "x-ms-lease-status", + xmlName: "x-ms-lease-status", + type: { + name: "Enum", + allowedValues: ["locked", "unlocked"] + } + }, + clientRequestId: { + serializedName: "x-ms-client-request-id", + xmlName: "x-ms-client-request-id", + type: { + name: "String" + } + }, + requestId: { + serializedName: "x-ms-request-id", + xmlName: "x-ms-request-id", + type: { + name: "String" + } + }, + version: { + serializedName: "x-ms-version", + xmlName: "x-ms-version", + type: { + name: "String" + } + }, + versionId: { + serializedName: "x-ms-version-id", + xmlName: "x-ms-version-id", + type: { + name: "String" + } + }, + isCurrentVersion: { + serializedName: "x-ms-is-current-version", + xmlName: "x-ms-is-current-version", + type: { + name: "Boolean" + } + }, + acceptRanges: { + serializedName: "accept-ranges", + xmlName: "accept-ranges", + type: { + name: "String" + } + }, + date: { + serializedName: "date", + xmlName: "date", + type: { + name: "DateTimeRfc1123" + } + }, + blobCommittedBlockCount: { + serializedName: "x-ms-blob-committed-block-count", + xmlName: "x-ms-blob-committed-block-count", + type: { + name: "Number" + } + }, + isServerEncrypted: { + serializedName: "x-ms-server-encrypted", + xmlName: "x-ms-server-encrypted", + type: { + name: "Boolean" + } + }, + encryptionKeySha256: { + serializedName: "x-ms-encryption-key-sha256", + xmlName: "x-ms-encryption-key-sha256", + type: { + name: "String" + } + }, + encryptionScope: { + serializedName: "x-ms-encryption-scope", + xmlName: "x-ms-encryption-scope", + type: { + name: "String" + } + }, + blobContentMD5: { + serializedName: "x-ms-blob-content-md5", + xmlName: "x-ms-blob-content-md5", + type: { + name: "ByteArray" + } + }, + tagCount: { + serializedName: "x-ms-tag-count", + xmlName: "x-ms-tag-count", + type: { + name: "Number" + } + }, + isSealed: { + serializedName: "x-ms-blob-sealed", + xmlName: "x-ms-blob-sealed", + type: { + name: "Boolean" + } + }, + lastAccessed: { + serializedName: "x-ms-last-access-time", + xmlName: "x-ms-last-access-time", + type: { + name: "DateTimeRfc1123" + } + }, + immutabilityPolicyExpiresOn: { + serializedName: "x-ms-immutability-policy-until-date", + xmlName: "x-ms-immutability-policy-until-date", + type: { + name: "DateTimeRfc1123" + } + }, + immutabilityPolicyMode: { + serializedName: "x-ms-immutability-policy-mode", + xmlName: "x-ms-immutability-policy-mode", + type: { + name: "Enum", + allowedValues: ["Mutable", "Unlocked", "Locked"] + } + }, + legalHold: { + serializedName: "x-ms-legal-hold", + xmlName: "x-ms-legal-hold", + type: { + name: "Boolean" + } + }, + errorCode: { + serializedName: "x-ms-error-code", + xmlName: "x-ms-error-code", + type: { + name: "String" + } + }, + contentCrc64: { + serializedName: "x-ms-content-crc64", + xmlName: "x-ms-content-crc64", + type: { + name: "ByteArray" + } + } + } + } + }; + var BlobDownloadExceptionHeaders = { + serializedName: "Blob_downloadExceptionHeaders", + type: { + name: "Composite", + className: "BlobDownloadExceptionHeaders", + modelProperties: { + errorCode: { + serializedName: "x-ms-error-code", + xmlName: "x-ms-error-code", + type: { + name: "String" + } + } + } + } + }; + var BlobGetPropertiesHeaders = { + serializedName: "Blob_getPropertiesHeaders", + type: { + name: "Composite", + className: "BlobGetPropertiesHeaders", + modelProperties: { + lastModified: { + serializedName: "last-modified", + xmlName: "last-modified", + type: { + name: "DateTimeRfc1123" + } + }, + createdOn: { + serializedName: "x-ms-creation-time", + xmlName: "x-ms-creation-time", + type: { + name: "DateTimeRfc1123" + } + }, + metadata: { + serializedName: "x-ms-meta", + headerCollectionPrefix: "x-ms-meta-", + xmlName: "x-ms-meta", + type: { + name: "Dictionary", + value: { type: { name: "String" } } + } + }, + objectReplicationPolicyId: { + serializedName: "x-ms-or-policy-id", + xmlName: "x-ms-or-policy-id", + type: { + name: "String" + } + }, + objectReplicationRules: { + serializedName: "x-ms-or", + headerCollectionPrefix: "x-ms-or-", + xmlName: "x-ms-or", + type: { + name: "Dictionary", + value: { type: { name: "String" } } + } + }, + blobType: { + serializedName: "x-ms-blob-type", + xmlName: "x-ms-blob-type", + type: { + name: "Enum", + allowedValues: ["BlockBlob", "PageBlob", "AppendBlob"] + } + }, + copyCompletedOn: { + serializedName: "x-ms-copy-completion-time", + xmlName: "x-ms-copy-completion-time", + type: { + name: "DateTimeRfc1123" + } + }, + copyStatusDescription: { + serializedName: "x-ms-copy-status-description", + xmlName: "x-ms-copy-status-description", + type: { + name: "String" + } + }, + copyId: { + serializedName: "x-ms-copy-id", + xmlName: "x-ms-copy-id", + type: { + name: "String" + } + }, + copyProgress: { + serializedName: "x-ms-copy-progress", + xmlName: "x-ms-copy-progress", + type: { + name: "String" + } + }, + copySource: { + serializedName: "x-ms-copy-source", + xmlName: "x-ms-copy-source", + type: { + name: "String" + } + }, + copyStatus: { + serializedName: "x-ms-copy-status", + xmlName: "x-ms-copy-status", + type: { + name: "Enum", + allowedValues: ["pending", "success", "aborted", "failed"] + } + }, + isIncrementalCopy: { + serializedName: "x-ms-incremental-copy", + xmlName: "x-ms-incremental-copy", + type: { + name: "Boolean" + } + }, + destinationSnapshot: { + serializedName: "x-ms-copy-destination-snapshot", + xmlName: "x-ms-copy-destination-snapshot", + type: { + name: "String" + } + }, + leaseDuration: { + serializedName: "x-ms-lease-duration", + xmlName: "x-ms-lease-duration", + type: { + name: "Enum", + allowedValues: ["infinite", "fixed"] + } + }, + leaseState: { + serializedName: "x-ms-lease-state", + xmlName: "x-ms-lease-state", + type: { + name: "Enum", + allowedValues: [ + "available", + "leased", + "expired", + "breaking", + "broken" + ] + } + }, + leaseStatus: { + serializedName: "x-ms-lease-status", + xmlName: "x-ms-lease-status", + type: { + name: "Enum", + allowedValues: ["locked", "unlocked"] + } + }, + contentLength: { + serializedName: "content-length", + xmlName: "content-length", + type: { + name: "Number" + } + }, + contentType: { + serializedName: "content-type", + xmlName: "content-type", + type: { + name: "String" + } + }, + etag: { + serializedName: "etag", + xmlName: "etag", + type: { + name: "String" + } + }, + contentMD5: { + serializedName: "content-md5", + xmlName: "content-md5", + type: { + name: "ByteArray" + } + }, + contentEncoding: { + serializedName: "content-encoding", + xmlName: "content-encoding", + type: { + name: "String" + } + }, + contentDisposition: { + serializedName: "content-disposition", + xmlName: "content-disposition", + type: { + name: "String" + } + }, + contentLanguage: { + serializedName: "content-language", + xmlName: "content-language", + type: { + name: "String" + } + }, + cacheControl: { + serializedName: "cache-control", + xmlName: "cache-control", + type: { + name: "String" + } + }, + blobSequenceNumber: { + serializedName: "x-ms-blob-sequence-number", + xmlName: "x-ms-blob-sequence-number", + type: { + name: "Number" + } + }, + clientRequestId: { + serializedName: "x-ms-client-request-id", + xmlName: "x-ms-client-request-id", + type: { + name: "String" + } + }, + requestId: { + serializedName: "x-ms-request-id", + xmlName: "x-ms-request-id", + type: { + name: "String" + } + }, + version: { + serializedName: "x-ms-version", + xmlName: "x-ms-version", + type: { + name: "String" + } + }, + date: { + serializedName: "date", + xmlName: "date", + type: { + name: "DateTimeRfc1123" + } + }, + acceptRanges: { + serializedName: "accept-ranges", + xmlName: "accept-ranges", + type: { + name: "String" + } + }, + blobCommittedBlockCount: { + serializedName: "x-ms-blob-committed-block-count", + xmlName: "x-ms-blob-committed-block-count", + type: { + name: "Number" + } + }, + isServerEncrypted: { + serializedName: "x-ms-server-encrypted", + xmlName: "x-ms-server-encrypted", + type: { + name: "Boolean" + } + }, + encryptionKeySha256: { + serializedName: "x-ms-encryption-key-sha256", + xmlName: "x-ms-encryption-key-sha256", + type: { + name: "String" + } + }, + encryptionScope: { + serializedName: "x-ms-encryption-scope", + xmlName: "x-ms-encryption-scope", + type: { + name: "String" + } + }, + accessTier: { + serializedName: "x-ms-access-tier", + xmlName: "x-ms-access-tier", + type: { + name: "String" + } + }, + accessTierInferred: { + serializedName: "x-ms-access-tier-inferred", + xmlName: "x-ms-access-tier-inferred", + type: { + name: "Boolean" + } + }, + archiveStatus: { + serializedName: "x-ms-archive-status", + xmlName: "x-ms-archive-status", + type: { + name: "String" + } + }, + accessTierChangedOn: { + serializedName: "x-ms-access-tier-change-time", + xmlName: "x-ms-access-tier-change-time", + type: { + name: "DateTimeRfc1123" + } + }, + versionId: { + serializedName: "x-ms-version-id", + xmlName: "x-ms-version-id", + type: { + name: "String" + } + }, + isCurrentVersion: { + serializedName: "x-ms-is-current-version", + xmlName: "x-ms-is-current-version", + type: { + name: "Boolean" + } + }, + tagCount: { + serializedName: "x-ms-tag-count", + xmlName: "x-ms-tag-count", + type: { + name: "Number" + } + }, + expiresOn: { + serializedName: "x-ms-expiry-time", + xmlName: "x-ms-expiry-time", + type: { + name: "DateTimeRfc1123" + } + }, + isSealed: { + serializedName: "x-ms-blob-sealed", + xmlName: "x-ms-blob-sealed", + type: { + name: "Boolean" + } + }, + rehydratePriority: { + serializedName: "x-ms-rehydrate-priority", + xmlName: "x-ms-rehydrate-priority", + type: { + name: "Enum", + allowedValues: ["High", "Standard"] + } + }, + lastAccessed: { + serializedName: "x-ms-last-access-time", + xmlName: "x-ms-last-access-time", + type: { + name: "DateTimeRfc1123" + } + }, + immutabilityPolicyExpiresOn: { + serializedName: "x-ms-immutability-policy-until-date", + xmlName: "x-ms-immutability-policy-until-date", + type: { + name: "DateTimeRfc1123" + } + }, + immutabilityPolicyMode: { + serializedName: "x-ms-immutability-policy-mode", + xmlName: "x-ms-immutability-policy-mode", + type: { + name: "Enum", + allowedValues: ["Mutable", "Unlocked", "Locked"] + } + }, + legalHold: { + serializedName: "x-ms-legal-hold", + xmlName: "x-ms-legal-hold", + type: { + name: "Boolean" + } + }, + errorCode: { + serializedName: "x-ms-error-code", + xmlName: "x-ms-error-code", + type: { + name: "String" + } + } + } + } + }; + var BlobGetPropertiesExceptionHeaders = { + serializedName: "Blob_getPropertiesExceptionHeaders", + type: { + name: "Composite", + className: "BlobGetPropertiesExceptionHeaders", + modelProperties: { + errorCode: { + serializedName: "x-ms-error-code", + xmlName: "x-ms-error-code", + type: { + name: "String" + } + } + } + } + }; + var BlobDeleteHeaders = { + serializedName: "Blob_deleteHeaders", + type: { + name: "Composite", + className: "BlobDeleteHeaders", + modelProperties: { + clientRequestId: { + serializedName: "x-ms-client-request-id", + xmlName: "x-ms-client-request-id", + type: { + name: "String" + } + }, + requestId: { + serializedName: "x-ms-request-id", + xmlName: "x-ms-request-id", + type: { + name: "String" + } + }, + version: { + serializedName: "x-ms-version", + xmlName: "x-ms-version", + type: { + name: "String" + } + }, + date: { + serializedName: "date", + xmlName: "date", + type: { + name: "DateTimeRfc1123" + } + }, + errorCode: { + serializedName: "x-ms-error-code", + xmlName: "x-ms-error-code", + type: { + name: "String" + } + } + } + } + }; + var BlobDeleteExceptionHeaders = { + serializedName: "Blob_deleteExceptionHeaders", + type: { + name: "Composite", + className: "BlobDeleteExceptionHeaders", + modelProperties: { + errorCode: { + serializedName: "x-ms-error-code", + xmlName: "x-ms-error-code", + type: { + name: "String" + } + } + } + } + }; + var BlobUndeleteHeaders = { + serializedName: "Blob_undeleteHeaders", + type: { + name: "Composite", + className: "BlobUndeleteHeaders", + modelProperties: { + clientRequestId: { + serializedName: "x-ms-client-request-id", + xmlName: "x-ms-client-request-id", + type: { + name: "String" + } + }, + requestId: { + serializedName: "x-ms-request-id", + xmlName: "x-ms-request-id", + type: { + name: "String" + } + }, + version: { + serializedName: "x-ms-version", + xmlName: "x-ms-version", + type: { + name: "String" + } + }, + date: { + serializedName: "date", + xmlName: "date", + type: { + name: "DateTimeRfc1123" + } + }, + errorCode: { + serializedName: "x-ms-error-code", + xmlName: "x-ms-error-code", + type: { + name: "String" + } + } + } + } + }; + var BlobUndeleteExceptionHeaders = { + serializedName: "Blob_undeleteExceptionHeaders", + type: { + name: "Composite", + className: "BlobUndeleteExceptionHeaders", + modelProperties: { + errorCode: { + serializedName: "x-ms-error-code", + xmlName: "x-ms-error-code", + type: { + name: "String" + } + } + } + } + }; + var BlobSetExpiryHeaders = { + serializedName: "Blob_setExpiryHeaders", + type: { + name: "Composite", + className: "BlobSetExpiryHeaders", + modelProperties: { + etag: { + serializedName: "etag", + xmlName: "etag", + type: { + name: "String" + } + }, + lastModified: { + serializedName: "last-modified", + xmlName: "last-modified", + type: { + name: "DateTimeRfc1123" + } + }, + clientRequestId: { + serializedName: "x-ms-client-request-id", + xmlName: "x-ms-client-request-id", + type: { + name: "String" + } + }, + requestId: { + serializedName: "x-ms-request-id", + xmlName: "x-ms-request-id", + type: { + name: "String" + } + }, + version: { + serializedName: "x-ms-version", + xmlName: "x-ms-version", + type: { + name: "String" + } + }, + date: { + serializedName: "date", + xmlName: "date", + type: { + name: "DateTimeRfc1123" + } + } + } + } + }; + var BlobSetExpiryExceptionHeaders = { + serializedName: "Blob_setExpiryExceptionHeaders", + type: { + name: "Composite", + className: "BlobSetExpiryExceptionHeaders", + modelProperties: { + errorCode: { + serializedName: "x-ms-error-code", + xmlName: "x-ms-error-code", + type: { + name: "String" + } + } + } + } + }; + var BlobSetHttpHeadersHeaders = { + serializedName: "Blob_setHttpHeadersHeaders", + type: { + name: "Composite", + className: "BlobSetHttpHeadersHeaders", + modelProperties: { + etag: { + serializedName: "etag", + xmlName: "etag", + type: { + name: "String" + } + }, + lastModified: { + serializedName: "last-modified", + xmlName: "last-modified", + type: { + name: "DateTimeRfc1123" + } + }, + blobSequenceNumber: { + serializedName: "x-ms-blob-sequence-number", + xmlName: "x-ms-blob-sequence-number", + type: { + name: "Number" + } + }, + clientRequestId: { + serializedName: "x-ms-client-request-id", + xmlName: "x-ms-client-request-id", + type: { + name: "String" + } + }, + requestId: { + serializedName: "x-ms-request-id", + xmlName: "x-ms-request-id", + type: { + name: "String" + } + }, + version: { + serializedName: "x-ms-version", + xmlName: "x-ms-version", + type: { + name: "String" + } + }, + date: { + serializedName: "date", + xmlName: "date", + type: { + name: "DateTimeRfc1123" + } + }, + errorCode: { + serializedName: "x-ms-error-code", + xmlName: "x-ms-error-code", + type: { + name: "String" + } + } + } + } + }; + var BlobSetHttpHeadersExceptionHeaders = { + serializedName: "Blob_setHttpHeadersExceptionHeaders", + type: { + name: "Composite", + className: "BlobSetHttpHeadersExceptionHeaders", + modelProperties: { + errorCode: { + serializedName: "x-ms-error-code", + xmlName: "x-ms-error-code", + type: { + name: "String" + } + } + } + } + }; + var BlobSetImmutabilityPolicyHeaders = { + serializedName: "Blob_setImmutabilityPolicyHeaders", + type: { + name: "Composite", + className: "BlobSetImmutabilityPolicyHeaders", + modelProperties: { + clientRequestId: { + serializedName: "x-ms-client-request-id", + xmlName: "x-ms-client-request-id", + type: { + name: "String" + } + }, + requestId: { + serializedName: "x-ms-request-id", + xmlName: "x-ms-request-id", + type: { + name: "String" + } + }, + version: { + serializedName: "x-ms-version", + xmlName: "x-ms-version", + type: { + name: "String" + } + }, + date: { + serializedName: "date", + xmlName: "date", + type: { + name: "DateTimeRfc1123" + } + }, + immutabilityPolicyExpiry: { + serializedName: "x-ms-immutability-policy-until-date", + xmlName: "x-ms-immutability-policy-until-date", + type: { + name: "DateTimeRfc1123" + } + }, + immutabilityPolicyMode: { + serializedName: "x-ms-immutability-policy-mode", + xmlName: "x-ms-immutability-policy-mode", + type: { + name: "Enum", + allowedValues: ["Mutable", "Unlocked", "Locked"] + } + } + } + } + }; + var BlobSetImmutabilityPolicyExceptionHeaders = { + serializedName: "Blob_setImmutabilityPolicyExceptionHeaders", + type: { + name: "Composite", + className: "BlobSetImmutabilityPolicyExceptionHeaders", + modelProperties: { + errorCode: { + serializedName: "x-ms-error-code", + xmlName: "x-ms-error-code", + type: { + name: "String" + } + } + } + } + }; + var BlobDeleteImmutabilityPolicyHeaders = { + serializedName: "Blob_deleteImmutabilityPolicyHeaders", + type: { + name: "Composite", + className: "BlobDeleteImmutabilityPolicyHeaders", + modelProperties: { + clientRequestId: { + serializedName: "x-ms-client-request-id", + xmlName: "x-ms-client-request-id", + type: { + name: "String" + } + }, + requestId: { + serializedName: "x-ms-request-id", + xmlName: "x-ms-request-id", + type: { + name: "String" + } + }, + version: { + serializedName: "x-ms-version", + xmlName: "x-ms-version", + type: { + name: "String" + } + }, + date: { + serializedName: "date", + xmlName: "date", + type: { + name: "DateTimeRfc1123" + } + } + } + } + }; + var BlobDeleteImmutabilityPolicyExceptionHeaders = { + serializedName: "Blob_deleteImmutabilityPolicyExceptionHeaders", + type: { + name: "Composite", + className: "BlobDeleteImmutabilityPolicyExceptionHeaders", + modelProperties: { + errorCode: { + serializedName: "x-ms-error-code", + xmlName: "x-ms-error-code", + type: { + name: "String" + } + } + } + } + }; + var BlobSetLegalHoldHeaders = { + serializedName: "Blob_setLegalHoldHeaders", + type: { + name: "Composite", + className: "BlobSetLegalHoldHeaders", + modelProperties: { + clientRequestId: { + serializedName: "x-ms-client-request-id", + xmlName: "x-ms-client-request-id", + type: { + name: "String" + } + }, + requestId: { + serializedName: "x-ms-request-id", + xmlName: "x-ms-request-id", + type: { + name: "String" + } + }, + version: { + serializedName: "x-ms-version", + xmlName: "x-ms-version", + type: { + name: "String" + } + }, + date: { + serializedName: "date", + xmlName: "date", + type: { + name: "DateTimeRfc1123" + } + }, + legalHold: { + serializedName: "x-ms-legal-hold", + xmlName: "x-ms-legal-hold", + type: { + name: "Boolean" + } + } + } + } + }; + var BlobSetLegalHoldExceptionHeaders = { + serializedName: "Blob_setLegalHoldExceptionHeaders", + type: { + name: "Composite", + className: "BlobSetLegalHoldExceptionHeaders", + modelProperties: { + errorCode: { + serializedName: "x-ms-error-code", + xmlName: "x-ms-error-code", + type: { + name: "String" + } + } + } + } + }; + var BlobSetMetadataHeaders = { + serializedName: "Blob_setMetadataHeaders", + type: { + name: "Composite", + className: "BlobSetMetadataHeaders", + modelProperties: { + etag: { + serializedName: "etag", + xmlName: "etag", + type: { + name: "String" + } + }, + lastModified: { + serializedName: "last-modified", + xmlName: "last-modified", + type: { + name: "DateTimeRfc1123" + } + }, + clientRequestId: { + serializedName: "x-ms-client-request-id", + xmlName: "x-ms-client-request-id", + type: { + name: "String" + } + }, + requestId: { + serializedName: "x-ms-request-id", + xmlName: "x-ms-request-id", + type: { + name: "String" + } + }, + version: { + serializedName: "x-ms-version", + xmlName: "x-ms-version", + type: { + name: "String" + } + }, + versionId: { + serializedName: "x-ms-version-id", + xmlName: "x-ms-version-id", + type: { + name: "String" + } + }, + date: { + serializedName: "date", + xmlName: "date", + type: { + name: "DateTimeRfc1123" + } + }, + isServerEncrypted: { + serializedName: "x-ms-request-server-encrypted", + xmlName: "x-ms-request-server-encrypted", + type: { + name: "Boolean" + } + }, + encryptionKeySha256: { + serializedName: "x-ms-encryption-key-sha256", + xmlName: "x-ms-encryption-key-sha256", + type: { + name: "String" + } + }, + encryptionScope: { + serializedName: "x-ms-encryption-scope", + xmlName: "x-ms-encryption-scope", + type: { + name: "String" + } + }, + errorCode: { + serializedName: "x-ms-error-code", + xmlName: "x-ms-error-code", + type: { + name: "String" + } + } + } + } + }; + var BlobSetMetadataExceptionHeaders = { + serializedName: "Blob_setMetadataExceptionHeaders", + type: { + name: "Composite", + className: "BlobSetMetadataExceptionHeaders", + modelProperties: { + errorCode: { + serializedName: "x-ms-error-code", + xmlName: "x-ms-error-code", + type: { + name: "String" + } + } + } + } + }; + var BlobAcquireLeaseHeaders = { + serializedName: "Blob_acquireLeaseHeaders", + type: { + name: "Composite", + className: "BlobAcquireLeaseHeaders", + modelProperties: { + etag: { + serializedName: "etag", + xmlName: "etag", + type: { + name: "String" + } + }, + lastModified: { + serializedName: "last-modified", + xmlName: "last-modified", + type: { + name: "DateTimeRfc1123" + } + }, + leaseId: { + serializedName: "x-ms-lease-id", + xmlName: "x-ms-lease-id", + type: { + name: "String" + } + }, + clientRequestId: { + serializedName: "x-ms-client-request-id", + xmlName: "x-ms-client-request-id", + type: { + name: "String" + } + }, + requestId: { + serializedName: "x-ms-request-id", + xmlName: "x-ms-request-id", + type: { + name: "String" + } + }, + version: { + serializedName: "x-ms-version", + xmlName: "x-ms-version", + type: { + name: "String" + } + }, + date: { + serializedName: "date", + xmlName: "date", + type: { + name: "DateTimeRfc1123" + } + } + } + } + }; + var BlobAcquireLeaseExceptionHeaders = { + serializedName: "Blob_acquireLeaseExceptionHeaders", + type: { + name: "Composite", + className: "BlobAcquireLeaseExceptionHeaders", + modelProperties: { + errorCode: { + serializedName: "x-ms-error-code", + xmlName: "x-ms-error-code", + type: { + name: "String" + } + } + } + } + }; + var BlobReleaseLeaseHeaders = { + serializedName: "Blob_releaseLeaseHeaders", + type: { + name: "Composite", + className: "BlobReleaseLeaseHeaders", + modelProperties: { + etag: { + serializedName: "etag", + xmlName: "etag", + type: { + name: "String" + } + }, + lastModified: { + serializedName: "last-modified", + xmlName: "last-modified", + type: { + name: "DateTimeRfc1123" + } + }, + clientRequestId: { + serializedName: "x-ms-client-request-id", + xmlName: "x-ms-client-request-id", + type: { + name: "String" + } + }, + requestId: { + serializedName: "x-ms-request-id", + xmlName: "x-ms-request-id", + type: { + name: "String" + } + }, + version: { + serializedName: "x-ms-version", + xmlName: "x-ms-version", + type: { + name: "String" + } + }, + date: { + serializedName: "date", + xmlName: "date", + type: { + name: "DateTimeRfc1123" + } + } + } + } + }; + var BlobReleaseLeaseExceptionHeaders = { + serializedName: "Blob_releaseLeaseExceptionHeaders", + type: { + name: "Composite", + className: "BlobReleaseLeaseExceptionHeaders", + modelProperties: { + errorCode: { + serializedName: "x-ms-error-code", + xmlName: "x-ms-error-code", + type: { + name: "String" + } + } + } + } + }; + var BlobRenewLeaseHeaders = { + serializedName: "Blob_renewLeaseHeaders", + type: { + name: "Composite", + className: "BlobRenewLeaseHeaders", + modelProperties: { + etag: { + serializedName: "etag", + xmlName: "etag", + type: { + name: "String" + } + }, + lastModified: { + serializedName: "last-modified", + xmlName: "last-modified", + type: { + name: "DateTimeRfc1123" + } + }, + leaseId: { + serializedName: "x-ms-lease-id", + xmlName: "x-ms-lease-id", + type: { + name: "String" + } + }, + clientRequestId: { + serializedName: "x-ms-client-request-id", + xmlName: "x-ms-client-request-id", + type: { + name: "String" + } + }, + requestId: { + serializedName: "x-ms-request-id", + xmlName: "x-ms-request-id", + type: { + name: "String" + } + }, + version: { + serializedName: "x-ms-version", + xmlName: "x-ms-version", + type: { + name: "String" + } + }, + date: { + serializedName: "date", + xmlName: "date", + type: { + name: "DateTimeRfc1123" + } + } + } + } + }; + var BlobRenewLeaseExceptionHeaders = { + serializedName: "Blob_renewLeaseExceptionHeaders", + type: { + name: "Composite", + className: "BlobRenewLeaseExceptionHeaders", + modelProperties: { + errorCode: { + serializedName: "x-ms-error-code", + xmlName: "x-ms-error-code", + type: { + name: "String" + } + } + } + } + }; + var BlobChangeLeaseHeaders = { + serializedName: "Blob_changeLeaseHeaders", + type: { + name: "Composite", + className: "BlobChangeLeaseHeaders", + modelProperties: { + etag: { + serializedName: "etag", + xmlName: "etag", + type: { + name: "String" + } + }, + lastModified: { + serializedName: "last-modified", + xmlName: "last-modified", + type: { + name: "DateTimeRfc1123" + } + }, + clientRequestId: { + serializedName: "x-ms-client-request-id", + xmlName: "x-ms-client-request-id", + type: { + name: "String" + } + }, + requestId: { + serializedName: "x-ms-request-id", + xmlName: "x-ms-request-id", + type: { + name: "String" + } + }, + leaseId: { + serializedName: "x-ms-lease-id", + xmlName: "x-ms-lease-id", + type: { + name: "String" + } + }, + version: { + serializedName: "x-ms-version", + xmlName: "x-ms-version", + type: { + name: "String" + } + }, + date: { + serializedName: "date", + xmlName: "date", + type: { + name: "DateTimeRfc1123" + } + } + } + } + }; + var BlobChangeLeaseExceptionHeaders = { + serializedName: "Blob_changeLeaseExceptionHeaders", + type: { + name: "Composite", + className: "BlobChangeLeaseExceptionHeaders", + modelProperties: { + errorCode: { + serializedName: "x-ms-error-code", + xmlName: "x-ms-error-code", + type: { + name: "String" + } + } + } + } + }; + var BlobBreakLeaseHeaders = { + serializedName: "Blob_breakLeaseHeaders", + type: { + name: "Composite", + className: "BlobBreakLeaseHeaders", + modelProperties: { + etag: { + serializedName: "etag", + xmlName: "etag", + type: { + name: "String" + } + }, + lastModified: { + serializedName: "last-modified", + xmlName: "last-modified", + type: { + name: "DateTimeRfc1123" + } + }, + leaseTime: { + serializedName: "x-ms-lease-time", + xmlName: "x-ms-lease-time", + type: { + name: "Number" + } + }, + clientRequestId: { + serializedName: "x-ms-client-request-id", + xmlName: "x-ms-client-request-id", + type: { + name: "String" + } + }, + requestId: { + serializedName: "x-ms-request-id", + xmlName: "x-ms-request-id", + type: { + name: "String" + } + }, + version: { + serializedName: "x-ms-version", + xmlName: "x-ms-version", + type: { + name: "String" + } + }, + date: { + serializedName: "date", + xmlName: "date", + type: { + name: "DateTimeRfc1123" + } + } + } + } + }; + var BlobBreakLeaseExceptionHeaders = { + serializedName: "Blob_breakLeaseExceptionHeaders", + type: { + name: "Composite", + className: "BlobBreakLeaseExceptionHeaders", + modelProperties: { + errorCode: { + serializedName: "x-ms-error-code", + xmlName: "x-ms-error-code", + type: { + name: "String" + } + } + } + } + }; + var BlobCreateSnapshotHeaders = { + serializedName: "Blob_createSnapshotHeaders", + type: { + name: "Composite", + className: "BlobCreateSnapshotHeaders", + modelProperties: { + snapshot: { + serializedName: "x-ms-snapshot", + xmlName: "x-ms-snapshot", + type: { + name: "String" + } + }, + etag: { + serializedName: "etag", + xmlName: "etag", + type: { + name: "String" + } + }, + lastModified: { + serializedName: "last-modified", + xmlName: "last-modified", + type: { + name: "DateTimeRfc1123" + } + }, + clientRequestId: { + serializedName: "x-ms-client-request-id", + xmlName: "x-ms-client-request-id", + type: { + name: "String" + } + }, + requestId: { + serializedName: "x-ms-request-id", + xmlName: "x-ms-request-id", + type: { + name: "String" + } + }, + version: { + serializedName: "x-ms-version", + xmlName: "x-ms-version", + type: { + name: "String" + } + }, + versionId: { + serializedName: "x-ms-version-id", + xmlName: "x-ms-version-id", + type: { + name: "String" + } + }, + date: { + serializedName: "date", + xmlName: "date", + type: { + name: "DateTimeRfc1123" + } + }, + isServerEncrypted: { + serializedName: "x-ms-request-server-encrypted", + xmlName: "x-ms-request-server-encrypted", + type: { + name: "Boolean" + } + }, + errorCode: { + serializedName: "x-ms-error-code", + xmlName: "x-ms-error-code", + type: { + name: "String" + } + } + } + } + }; + var BlobCreateSnapshotExceptionHeaders = { + serializedName: "Blob_createSnapshotExceptionHeaders", + type: { + name: "Composite", + className: "BlobCreateSnapshotExceptionHeaders", + modelProperties: { + errorCode: { + serializedName: "x-ms-error-code", + xmlName: "x-ms-error-code", + type: { + name: "String" + } + } + } + } + }; + var BlobStartCopyFromURLHeaders = { + serializedName: "Blob_startCopyFromURLHeaders", + type: { + name: "Composite", + className: "BlobStartCopyFromURLHeaders", + modelProperties: { + etag: { + serializedName: "etag", + xmlName: "etag", + type: { + name: "String" + } + }, + lastModified: { + serializedName: "last-modified", + xmlName: "last-modified", + type: { + name: "DateTimeRfc1123" + } + }, + clientRequestId: { + serializedName: "x-ms-client-request-id", + xmlName: "x-ms-client-request-id", + type: { + name: "String" + } + }, + requestId: { + serializedName: "x-ms-request-id", + xmlName: "x-ms-request-id", + type: { + name: "String" + } + }, + version: { + serializedName: "x-ms-version", + xmlName: "x-ms-version", + type: { + name: "String" + } + }, + versionId: { + serializedName: "x-ms-version-id", + xmlName: "x-ms-version-id", + type: { + name: "String" + } + }, + date: { + serializedName: "date", + xmlName: "date", + type: { + name: "DateTimeRfc1123" + } + }, + copyId: { + serializedName: "x-ms-copy-id", + xmlName: "x-ms-copy-id", + type: { + name: "String" + } + }, + copyStatus: { + serializedName: "x-ms-copy-status", + xmlName: "x-ms-copy-status", + type: { + name: "Enum", + allowedValues: ["pending", "success", "aborted", "failed"] + } + }, + errorCode: { + serializedName: "x-ms-error-code", + xmlName: "x-ms-error-code", + type: { + name: "String" + } + } + } + } + }; + var BlobStartCopyFromURLExceptionHeaders = { + serializedName: "Blob_startCopyFromURLExceptionHeaders", + type: { + name: "Composite", + className: "BlobStartCopyFromURLExceptionHeaders", + modelProperties: { + errorCode: { + serializedName: "x-ms-error-code", + xmlName: "x-ms-error-code", + type: { + name: "String" + } + } + } + } + }; + var BlobCopyFromURLHeaders = { + serializedName: "Blob_copyFromURLHeaders", + type: { + name: "Composite", + className: "BlobCopyFromURLHeaders", + modelProperties: { + etag: { + serializedName: "etag", + xmlName: "etag", + type: { + name: "String" + } + }, + lastModified: { + serializedName: "last-modified", + xmlName: "last-modified", + type: { + name: "DateTimeRfc1123" + } + }, + clientRequestId: { + serializedName: "x-ms-client-request-id", + xmlName: "x-ms-client-request-id", + type: { + name: "String" + } + }, + requestId: { + serializedName: "x-ms-request-id", + xmlName: "x-ms-request-id", + type: { + name: "String" + } + }, + version: { + serializedName: "x-ms-version", + xmlName: "x-ms-version", + type: { + name: "String" + } + }, + versionId: { + serializedName: "x-ms-version-id", + xmlName: "x-ms-version-id", + type: { + name: "String" + } + }, + date: { + serializedName: "date", + xmlName: "date", + type: { + name: "DateTimeRfc1123" + } + }, + copyId: { + serializedName: "x-ms-copy-id", + xmlName: "x-ms-copy-id", + type: { + name: "String" + } + }, + copyStatus: { + defaultValue: "success", + isConstant: true, + serializedName: "x-ms-copy-status", + type: { + name: "String" + } + }, + contentMD5: { + serializedName: "content-md5", + xmlName: "content-md5", + type: { + name: "ByteArray" + } + }, + xMsContentCrc64: { + serializedName: "x-ms-content-crc64", + xmlName: "x-ms-content-crc64", + type: { + name: "ByteArray" + } + }, + encryptionScope: { + serializedName: "x-ms-encryption-scope", + xmlName: "x-ms-encryption-scope", + type: { + name: "String" + } + }, + errorCode: { + serializedName: "x-ms-error-code", + xmlName: "x-ms-error-code", + type: { + name: "String" + } + } + } + } + }; + var BlobCopyFromURLExceptionHeaders = { + serializedName: "Blob_copyFromURLExceptionHeaders", + type: { + name: "Composite", + className: "BlobCopyFromURLExceptionHeaders", + modelProperties: { + errorCode: { + serializedName: "x-ms-error-code", + xmlName: "x-ms-error-code", + type: { + name: "String" + } + } + } + } + }; + var BlobAbortCopyFromURLHeaders = { + serializedName: "Blob_abortCopyFromURLHeaders", + type: { + name: "Composite", + className: "BlobAbortCopyFromURLHeaders", + modelProperties: { + clientRequestId: { + serializedName: "x-ms-client-request-id", + xmlName: "x-ms-client-request-id", + type: { + name: "String" + } + }, + requestId: { + serializedName: "x-ms-request-id", + xmlName: "x-ms-request-id", + type: { + name: "String" + } + }, + version: { + serializedName: "x-ms-version", + xmlName: "x-ms-version", + type: { + name: "String" + } + }, + date: { + serializedName: "date", + xmlName: "date", + type: { + name: "DateTimeRfc1123" + } + }, + errorCode: { + serializedName: "x-ms-error-code", + xmlName: "x-ms-error-code", + type: { + name: "String" + } + } + } + } + }; + var BlobAbortCopyFromURLExceptionHeaders = { + serializedName: "Blob_abortCopyFromURLExceptionHeaders", + type: { + name: "Composite", + className: "BlobAbortCopyFromURLExceptionHeaders", + modelProperties: { + errorCode: { + serializedName: "x-ms-error-code", + xmlName: "x-ms-error-code", + type: { + name: "String" + } + } + } + } + }; + var BlobSetTierHeaders = { + serializedName: "Blob_setTierHeaders", + type: { + name: "Composite", + className: "BlobSetTierHeaders", + modelProperties: { + clientRequestId: { + serializedName: "x-ms-client-request-id", + xmlName: "x-ms-client-request-id", + type: { + name: "String" + } + }, + requestId: { + serializedName: "x-ms-request-id", + xmlName: "x-ms-request-id", + type: { + name: "String" + } + }, + version: { + serializedName: "x-ms-version", + xmlName: "x-ms-version", + type: { + name: "String" + } + }, + errorCode: { + serializedName: "x-ms-error-code", + xmlName: "x-ms-error-code", + type: { + name: "String" + } + } + } + } + }; + var BlobSetTierExceptionHeaders = { + serializedName: "Blob_setTierExceptionHeaders", + type: { + name: "Composite", + className: "BlobSetTierExceptionHeaders", + modelProperties: { + errorCode: { + serializedName: "x-ms-error-code", + xmlName: "x-ms-error-code", + type: { + name: "String" + } + } + } + } + }; + var BlobGetAccountInfoHeaders = { + serializedName: "Blob_getAccountInfoHeaders", + type: { + name: "Composite", + className: "BlobGetAccountInfoHeaders", + modelProperties: { + clientRequestId: { + serializedName: "x-ms-client-request-id", + xmlName: "x-ms-client-request-id", + type: { + name: "String" + } + }, + requestId: { + serializedName: "x-ms-request-id", + xmlName: "x-ms-request-id", + type: { + name: "String" + } + }, + version: { + serializedName: "x-ms-version", + xmlName: "x-ms-version", + type: { + name: "String" + } + }, + date: { + serializedName: "date", + xmlName: "date", + type: { + name: "DateTimeRfc1123" + } + }, + skuName: { + serializedName: "x-ms-sku-name", + xmlName: "x-ms-sku-name", + type: { + name: "Enum", + allowedValues: [ + "Standard_LRS", + "Standard_GRS", + "Standard_RAGRS", + "Standard_ZRS", + "Premium_LRS" + ] + } + }, + accountKind: { + serializedName: "x-ms-account-kind", + xmlName: "x-ms-account-kind", + type: { + name: "Enum", + allowedValues: [ + "Storage", + "BlobStorage", + "StorageV2", + "FileStorage", + "BlockBlobStorage" + ] + } + }, + isHierarchicalNamespaceEnabled: { + serializedName: "x-ms-is-hns-enabled", + xmlName: "x-ms-is-hns-enabled", + type: { + name: "Boolean" + } + } + } + } + }; + var BlobGetAccountInfoExceptionHeaders = { + serializedName: "Blob_getAccountInfoExceptionHeaders", + type: { + name: "Composite", + className: "BlobGetAccountInfoExceptionHeaders", + modelProperties: { + errorCode: { + serializedName: "x-ms-error-code", + xmlName: "x-ms-error-code", + type: { + name: "String" + } + } + } + } + }; + var BlobQueryHeaders = { + serializedName: "Blob_queryHeaders", + type: { + name: "Composite", + className: "BlobQueryHeaders", + modelProperties: { + lastModified: { + serializedName: "last-modified", + xmlName: "last-modified", + type: { + name: "DateTimeRfc1123" + } + }, + metadata: { + serializedName: "x-ms-meta", + headerCollectionPrefix: "x-ms-meta-", + xmlName: "x-ms-meta", + type: { + name: "Dictionary", + value: { type: { name: "String" } } + } + }, + contentLength: { + serializedName: "content-length", + xmlName: "content-length", + type: { + name: "Number" + } + }, + contentType: { + serializedName: "content-type", + xmlName: "content-type", + type: { + name: "String" + } + }, + contentRange: { + serializedName: "content-range", + xmlName: "content-range", + type: { + name: "String" + } + }, + etag: { + serializedName: "etag", + xmlName: "etag", + type: { + name: "String" + } + }, + contentMD5: { + serializedName: "content-md5", + xmlName: "content-md5", + type: { + name: "ByteArray" + } + }, + contentEncoding: { + serializedName: "content-encoding", + xmlName: "content-encoding", + type: { + name: "String" + } + }, + cacheControl: { + serializedName: "cache-control", + xmlName: "cache-control", + type: { + name: "String" + } + }, + contentDisposition: { + serializedName: "content-disposition", + xmlName: "content-disposition", + type: { + name: "String" + } + }, + contentLanguage: { + serializedName: "content-language", + xmlName: "content-language", + type: { + name: "String" + } + }, + blobSequenceNumber: { + serializedName: "x-ms-blob-sequence-number", + xmlName: "x-ms-blob-sequence-number", + type: { + name: "Number" + } + }, + blobType: { + serializedName: "x-ms-blob-type", + xmlName: "x-ms-blob-type", + type: { + name: "Enum", + allowedValues: ["BlockBlob", "PageBlob", "AppendBlob"] + } + }, + copyCompletionTime: { + serializedName: "x-ms-copy-completion-time", + xmlName: "x-ms-copy-completion-time", + type: { + name: "DateTimeRfc1123" + } + }, + copyStatusDescription: { + serializedName: "x-ms-copy-status-description", + xmlName: "x-ms-copy-status-description", + type: { + name: "String" + } + }, + copyId: { + serializedName: "x-ms-copy-id", + xmlName: "x-ms-copy-id", + type: { + name: "String" + } + }, + copyProgress: { + serializedName: "x-ms-copy-progress", + xmlName: "x-ms-copy-progress", + type: { + name: "String" + } + }, + copySource: { + serializedName: "x-ms-copy-source", + xmlName: "x-ms-copy-source", + type: { + name: "String" + } + }, + copyStatus: { + serializedName: "x-ms-copy-status", + xmlName: "x-ms-copy-status", + type: { + name: "Enum", + allowedValues: ["pending", "success", "aborted", "failed"] + } + }, + leaseDuration: { + serializedName: "x-ms-lease-duration", + xmlName: "x-ms-lease-duration", + type: { + name: "Enum", + allowedValues: ["infinite", "fixed"] + } + }, + leaseState: { + serializedName: "x-ms-lease-state", + xmlName: "x-ms-lease-state", + type: { + name: "Enum", + allowedValues: [ + "available", + "leased", + "expired", + "breaking", + "broken" + ] + } + }, + leaseStatus: { + serializedName: "x-ms-lease-status", + xmlName: "x-ms-lease-status", + type: { + name: "Enum", + allowedValues: ["locked", "unlocked"] + } + }, + clientRequestId: { + serializedName: "x-ms-client-request-id", + xmlName: "x-ms-client-request-id", + type: { + name: "String" + } + }, + requestId: { + serializedName: "x-ms-request-id", + xmlName: "x-ms-request-id", + type: { + name: "String" + } + }, + version: { + serializedName: "x-ms-version", + xmlName: "x-ms-version", + type: { + name: "String" + } + }, + acceptRanges: { + serializedName: "accept-ranges", + xmlName: "accept-ranges", + type: { + name: "String" + } + }, + date: { + serializedName: "date", + xmlName: "date", + type: { + name: "DateTimeRfc1123" + } + }, + blobCommittedBlockCount: { + serializedName: "x-ms-blob-committed-block-count", + xmlName: "x-ms-blob-committed-block-count", + type: { + name: "Number" + } + }, + isServerEncrypted: { + serializedName: "x-ms-server-encrypted", + xmlName: "x-ms-server-encrypted", + type: { + name: "Boolean" + } + }, + encryptionKeySha256: { + serializedName: "x-ms-encryption-key-sha256", + xmlName: "x-ms-encryption-key-sha256", + type: { + name: "String" + } + }, + encryptionScope: { + serializedName: "x-ms-encryption-scope", + xmlName: "x-ms-encryption-scope", + type: { + name: "String" + } + }, + blobContentMD5: { + serializedName: "x-ms-blob-content-md5", + xmlName: "x-ms-blob-content-md5", + type: { + name: "ByteArray" + } + }, + errorCode: { + serializedName: "x-ms-error-code", + xmlName: "x-ms-error-code", + type: { + name: "String" + } + }, + contentCrc64: { + serializedName: "x-ms-content-crc64", + xmlName: "x-ms-content-crc64", + type: { + name: "ByteArray" + } + } + } + } + }; + var BlobQueryExceptionHeaders = { + serializedName: "Blob_queryExceptionHeaders", + type: { + name: "Composite", + className: "BlobQueryExceptionHeaders", + modelProperties: { + errorCode: { + serializedName: "x-ms-error-code", + xmlName: "x-ms-error-code", + type: { + name: "String" + } + } + } + } + }; + var BlobGetTagsHeaders = { + serializedName: "Blob_getTagsHeaders", + type: { + name: "Composite", + className: "BlobGetTagsHeaders", + modelProperties: { + clientRequestId: { + serializedName: "x-ms-client-request-id", + xmlName: "x-ms-client-request-id", + type: { + name: "String" + } + }, + requestId: { + serializedName: "x-ms-request-id", + xmlName: "x-ms-request-id", + type: { + name: "String" + } + }, + version: { + serializedName: "x-ms-version", + xmlName: "x-ms-version", + type: { + name: "String" + } + }, + date: { + serializedName: "date", + xmlName: "date", + type: { + name: "DateTimeRfc1123" + } + }, + errorCode: { + serializedName: "x-ms-error-code", + xmlName: "x-ms-error-code", + type: { + name: "String" + } + } + } + } + }; + var BlobGetTagsExceptionHeaders = { + serializedName: "Blob_getTagsExceptionHeaders", + type: { + name: "Composite", + className: "BlobGetTagsExceptionHeaders", + modelProperties: { + errorCode: { + serializedName: "x-ms-error-code", + xmlName: "x-ms-error-code", + type: { + name: "String" + } + } + } + } + }; + var BlobSetTagsHeaders = { + serializedName: "Blob_setTagsHeaders", + type: { + name: "Composite", + className: "BlobSetTagsHeaders", + modelProperties: { + clientRequestId: { + serializedName: "x-ms-client-request-id", + xmlName: "x-ms-client-request-id", + type: { + name: "String" + } + }, + requestId: { + serializedName: "x-ms-request-id", + xmlName: "x-ms-request-id", + type: { + name: "String" + } + }, + version: { + serializedName: "x-ms-version", + xmlName: "x-ms-version", + type: { + name: "String" + } + }, + date: { + serializedName: "date", + xmlName: "date", + type: { + name: "DateTimeRfc1123" + } + }, + errorCode: { + serializedName: "x-ms-error-code", + xmlName: "x-ms-error-code", + type: { + name: "String" + } + } + } + } + }; + var BlobSetTagsExceptionHeaders = { + serializedName: "Blob_setTagsExceptionHeaders", + type: { + name: "Composite", + className: "BlobSetTagsExceptionHeaders", + modelProperties: { + errorCode: { + serializedName: "x-ms-error-code", + xmlName: "x-ms-error-code", + type: { + name: "String" + } + } + } + } + }; + var PageBlobCreateHeaders = { + serializedName: "PageBlob_createHeaders", + type: { + name: "Composite", + className: "PageBlobCreateHeaders", + modelProperties: { + etag: { + serializedName: "etag", + xmlName: "etag", + type: { + name: "String" + } + }, + lastModified: { + serializedName: "last-modified", + xmlName: "last-modified", + type: { + name: "DateTimeRfc1123" + } + }, + contentMD5: { + serializedName: "content-md5", + xmlName: "content-md5", + type: { + name: "ByteArray" + } + }, + clientRequestId: { + serializedName: "x-ms-client-request-id", + xmlName: "x-ms-client-request-id", + type: { + name: "String" + } + }, + requestId: { + serializedName: "x-ms-request-id", + xmlName: "x-ms-request-id", + type: { + name: "String" + } + }, + version: { + serializedName: "x-ms-version", + xmlName: "x-ms-version", + type: { + name: "String" + } + }, + versionId: { + serializedName: "x-ms-version-id", + xmlName: "x-ms-version-id", + type: { + name: "String" + } + }, + date: { + serializedName: "date", + xmlName: "date", + type: { + name: "DateTimeRfc1123" + } + }, + isServerEncrypted: { + serializedName: "x-ms-request-server-encrypted", + xmlName: "x-ms-request-server-encrypted", + type: { + name: "Boolean" + } + }, + encryptionKeySha256: { + serializedName: "x-ms-encryption-key-sha256", + xmlName: "x-ms-encryption-key-sha256", + type: { + name: "String" + } + }, + encryptionScope: { + serializedName: "x-ms-encryption-scope", + xmlName: "x-ms-encryption-scope", + type: { + name: "String" + } + }, + errorCode: { + serializedName: "x-ms-error-code", + xmlName: "x-ms-error-code", + type: { + name: "String" + } + } + } + } + }; + var PageBlobCreateExceptionHeaders = { + serializedName: "PageBlob_createExceptionHeaders", + type: { + name: "Composite", + className: "PageBlobCreateExceptionHeaders", + modelProperties: { + errorCode: { + serializedName: "x-ms-error-code", + xmlName: "x-ms-error-code", + type: { + name: "String" + } + } + } + } + }; + var PageBlobUploadPagesHeaders = { + serializedName: "PageBlob_uploadPagesHeaders", + type: { + name: "Composite", + className: "PageBlobUploadPagesHeaders", + modelProperties: { + etag: { + serializedName: "etag", + xmlName: "etag", + type: { + name: "String" + } + }, + lastModified: { + serializedName: "last-modified", + xmlName: "last-modified", + type: { + name: "DateTimeRfc1123" + } + }, + contentMD5: { + serializedName: "content-md5", + xmlName: "content-md5", + type: { + name: "ByteArray" + } + }, + xMsContentCrc64: { + serializedName: "x-ms-content-crc64", + xmlName: "x-ms-content-crc64", + type: { + name: "ByteArray" + } + }, + blobSequenceNumber: { + serializedName: "x-ms-blob-sequence-number", + xmlName: "x-ms-blob-sequence-number", + type: { + name: "Number" + } + }, + clientRequestId: { + serializedName: "x-ms-client-request-id", + xmlName: "x-ms-client-request-id", + type: { + name: "String" + } + }, + requestId: { + serializedName: "x-ms-request-id", + xmlName: "x-ms-request-id", + type: { + name: "String" + } + }, + version: { + serializedName: "x-ms-version", + xmlName: "x-ms-version", + type: { + name: "String" + } + }, + date: { + serializedName: "date", + xmlName: "date", + type: { + name: "DateTimeRfc1123" + } + }, + isServerEncrypted: { + serializedName: "x-ms-request-server-encrypted", + xmlName: "x-ms-request-server-encrypted", + type: { + name: "Boolean" + } + }, + encryptionKeySha256: { + serializedName: "x-ms-encryption-key-sha256", + xmlName: "x-ms-encryption-key-sha256", + type: { + name: "String" + } + }, + encryptionScope: { + serializedName: "x-ms-encryption-scope", + xmlName: "x-ms-encryption-scope", + type: { + name: "String" + } + }, + errorCode: { + serializedName: "x-ms-error-code", + xmlName: "x-ms-error-code", + type: { + name: "String" + } + } + } + } + }; + var PageBlobUploadPagesExceptionHeaders = { + serializedName: "PageBlob_uploadPagesExceptionHeaders", + type: { + name: "Composite", + className: "PageBlobUploadPagesExceptionHeaders", + modelProperties: { + errorCode: { + serializedName: "x-ms-error-code", + xmlName: "x-ms-error-code", + type: { + name: "String" + } + } + } + } + }; + var PageBlobClearPagesHeaders = { + serializedName: "PageBlob_clearPagesHeaders", + type: { + name: "Composite", + className: "PageBlobClearPagesHeaders", + modelProperties: { + etag: { + serializedName: "etag", + xmlName: "etag", + type: { + name: "String" + } + }, + lastModified: { + serializedName: "last-modified", + xmlName: "last-modified", + type: { + name: "DateTimeRfc1123" + } + }, + contentMD5: { + serializedName: "content-md5", + xmlName: "content-md5", + type: { + name: "ByteArray" + } + }, + xMsContentCrc64: { + serializedName: "x-ms-content-crc64", + xmlName: "x-ms-content-crc64", + type: { + name: "ByteArray" + } + }, + blobSequenceNumber: { + serializedName: "x-ms-blob-sequence-number", + xmlName: "x-ms-blob-sequence-number", + type: { + name: "Number" + } + }, + clientRequestId: { + serializedName: "x-ms-client-request-id", + xmlName: "x-ms-client-request-id", + type: { + name: "String" + } + }, + requestId: { + serializedName: "x-ms-request-id", + xmlName: "x-ms-request-id", + type: { + name: "String" + } + }, + version: { + serializedName: "x-ms-version", + xmlName: "x-ms-version", + type: { + name: "String" + } + }, + date: { + serializedName: "date", + xmlName: "date", + type: { + name: "DateTimeRfc1123" + } + }, + errorCode: { + serializedName: "x-ms-error-code", + xmlName: "x-ms-error-code", + type: { + name: "String" + } + } + } + } + }; + var PageBlobClearPagesExceptionHeaders = { + serializedName: "PageBlob_clearPagesExceptionHeaders", + type: { + name: "Composite", + className: "PageBlobClearPagesExceptionHeaders", + modelProperties: { + errorCode: { + serializedName: "x-ms-error-code", + xmlName: "x-ms-error-code", + type: { + name: "String" + } + } + } + } + }; + var PageBlobUploadPagesFromURLHeaders = { + serializedName: "PageBlob_uploadPagesFromURLHeaders", + type: { + name: "Composite", + className: "PageBlobUploadPagesFromURLHeaders", + modelProperties: { + etag: { + serializedName: "etag", + xmlName: "etag", + type: { + name: "String" + } + }, + lastModified: { + serializedName: "last-modified", + xmlName: "last-modified", + type: { + name: "DateTimeRfc1123" + } + }, + contentMD5: { + serializedName: "content-md5", + xmlName: "content-md5", + type: { + name: "ByteArray" + } + }, + xMsContentCrc64: { + serializedName: "x-ms-content-crc64", + xmlName: "x-ms-content-crc64", + type: { + name: "ByteArray" + } + }, + blobSequenceNumber: { + serializedName: "x-ms-blob-sequence-number", + xmlName: "x-ms-blob-sequence-number", + type: { + name: "Number" + } + }, + requestId: { + serializedName: "x-ms-request-id", + xmlName: "x-ms-request-id", + type: { + name: "String" + } + }, + version: { + serializedName: "x-ms-version", + xmlName: "x-ms-version", + type: { + name: "String" + } + }, + date: { + serializedName: "date", + xmlName: "date", + type: { + name: "DateTimeRfc1123" + } + }, + isServerEncrypted: { + serializedName: "x-ms-request-server-encrypted", + xmlName: "x-ms-request-server-encrypted", + type: { + name: "Boolean" + } + }, + encryptionKeySha256: { + serializedName: "x-ms-encryption-key-sha256", + xmlName: "x-ms-encryption-key-sha256", + type: { + name: "String" + } + }, + encryptionScope: { + serializedName: "x-ms-encryption-scope", + xmlName: "x-ms-encryption-scope", + type: { + name: "String" + } + }, + errorCode: { + serializedName: "x-ms-error-code", + xmlName: "x-ms-error-code", + type: { + name: "String" + } + } + } + } + }; + var PageBlobUploadPagesFromURLExceptionHeaders = { + serializedName: "PageBlob_uploadPagesFromURLExceptionHeaders", + type: { + name: "Composite", + className: "PageBlobUploadPagesFromURLExceptionHeaders", + modelProperties: { + errorCode: { + serializedName: "x-ms-error-code", + xmlName: "x-ms-error-code", + type: { + name: "String" + } + } + } + } + }; + var PageBlobGetPageRangesHeaders = { + serializedName: "PageBlob_getPageRangesHeaders", + type: { + name: "Composite", + className: "PageBlobGetPageRangesHeaders", + modelProperties: { + lastModified: { + serializedName: "last-modified", + xmlName: "last-modified", + type: { + name: "DateTimeRfc1123" + } + }, + etag: { + serializedName: "etag", + xmlName: "etag", + type: { + name: "String" + } + }, + blobContentLength: { + serializedName: "x-ms-blob-content-length", + xmlName: "x-ms-blob-content-length", + type: { + name: "Number" + } + }, + clientRequestId: { + serializedName: "x-ms-client-request-id", + xmlName: "x-ms-client-request-id", + type: { + name: "String" + } + }, + requestId: { + serializedName: "x-ms-request-id", + xmlName: "x-ms-request-id", + type: { + name: "String" + } + }, + version: { + serializedName: "x-ms-version", + xmlName: "x-ms-version", + type: { + name: "String" + } + }, + date: { + serializedName: "date", + xmlName: "date", + type: { + name: "DateTimeRfc1123" + } + }, + errorCode: { + serializedName: "x-ms-error-code", + xmlName: "x-ms-error-code", + type: { + name: "String" + } + } + } + } + }; + var PageBlobGetPageRangesExceptionHeaders = { + serializedName: "PageBlob_getPageRangesExceptionHeaders", + type: { + name: "Composite", + className: "PageBlobGetPageRangesExceptionHeaders", + modelProperties: { + errorCode: { + serializedName: "x-ms-error-code", + xmlName: "x-ms-error-code", + type: { + name: "String" + } + } + } + } + }; + var PageBlobGetPageRangesDiffHeaders = { + serializedName: "PageBlob_getPageRangesDiffHeaders", + type: { + name: "Composite", + className: "PageBlobGetPageRangesDiffHeaders", + modelProperties: { + lastModified: { + serializedName: "last-modified", + xmlName: "last-modified", + type: { + name: "DateTimeRfc1123" + } + }, + etag: { + serializedName: "etag", + xmlName: "etag", + type: { + name: "String" + } + }, + blobContentLength: { + serializedName: "x-ms-blob-content-length", + xmlName: "x-ms-blob-content-length", + type: { + name: "Number" + } + }, + clientRequestId: { + serializedName: "x-ms-client-request-id", + xmlName: "x-ms-client-request-id", + type: { + name: "String" + } + }, + requestId: { + serializedName: "x-ms-request-id", + xmlName: "x-ms-request-id", + type: { + name: "String" + } + }, + version: { + serializedName: "x-ms-version", + xmlName: "x-ms-version", + type: { + name: "String" + } + }, + date: { + serializedName: "date", + xmlName: "date", + type: { + name: "DateTimeRfc1123" + } + }, + errorCode: { + serializedName: "x-ms-error-code", + xmlName: "x-ms-error-code", + type: { + name: "String" + } + } + } + } + }; + var PageBlobGetPageRangesDiffExceptionHeaders = { + serializedName: "PageBlob_getPageRangesDiffExceptionHeaders", + type: { + name: "Composite", + className: "PageBlobGetPageRangesDiffExceptionHeaders", + modelProperties: { + errorCode: { + serializedName: "x-ms-error-code", + xmlName: "x-ms-error-code", + type: { + name: "String" + } + } + } + } + }; + var PageBlobResizeHeaders = { + serializedName: "PageBlob_resizeHeaders", + type: { + name: "Composite", + className: "PageBlobResizeHeaders", + modelProperties: { + etag: { + serializedName: "etag", + xmlName: "etag", + type: { + name: "String" + } + }, + lastModified: { + serializedName: "last-modified", + xmlName: "last-modified", + type: { + name: "DateTimeRfc1123" + } + }, + blobSequenceNumber: { + serializedName: "x-ms-blob-sequence-number", + xmlName: "x-ms-blob-sequence-number", + type: { + name: "Number" + } + }, + clientRequestId: { + serializedName: "x-ms-client-request-id", + xmlName: "x-ms-client-request-id", + type: { + name: "String" + } + }, + requestId: { + serializedName: "x-ms-request-id", + xmlName: "x-ms-request-id", + type: { + name: "String" + } + }, + version: { + serializedName: "x-ms-version", + xmlName: "x-ms-version", + type: { + name: "String" + } + }, + date: { + serializedName: "date", + xmlName: "date", + type: { + name: "DateTimeRfc1123" + } + }, + errorCode: { + serializedName: "x-ms-error-code", + xmlName: "x-ms-error-code", + type: { + name: "String" + } + } + } + } + }; + var PageBlobResizeExceptionHeaders = { + serializedName: "PageBlob_resizeExceptionHeaders", + type: { + name: "Composite", + className: "PageBlobResizeExceptionHeaders", + modelProperties: { + errorCode: { + serializedName: "x-ms-error-code", + xmlName: "x-ms-error-code", + type: { + name: "String" + } + } + } + } + }; + var PageBlobUpdateSequenceNumberHeaders = { + serializedName: "PageBlob_updateSequenceNumberHeaders", + type: { + name: "Composite", + className: "PageBlobUpdateSequenceNumberHeaders", + modelProperties: { + etag: { + serializedName: "etag", + xmlName: "etag", + type: { + name: "String" + } + }, + lastModified: { + serializedName: "last-modified", + xmlName: "last-modified", + type: { + name: "DateTimeRfc1123" + } + }, + blobSequenceNumber: { + serializedName: "x-ms-blob-sequence-number", + xmlName: "x-ms-blob-sequence-number", + type: { + name: "Number" + } + }, + clientRequestId: { + serializedName: "x-ms-client-request-id", + xmlName: "x-ms-client-request-id", + type: { + name: "String" + } + }, + requestId: { + serializedName: "x-ms-request-id", + xmlName: "x-ms-request-id", + type: { + name: "String" + } + }, + version: { + serializedName: "x-ms-version", + xmlName: "x-ms-version", + type: { + name: "String" + } + }, + date: { + serializedName: "date", + xmlName: "date", + type: { + name: "DateTimeRfc1123" + } + }, + errorCode: { + serializedName: "x-ms-error-code", + xmlName: "x-ms-error-code", + type: { + name: "String" + } + } + } + } + }; + var PageBlobUpdateSequenceNumberExceptionHeaders = { + serializedName: "PageBlob_updateSequenceNumberExceptionHeaders", + type: { + name: "Composite", + className: "PageBlobUpdateSequenceNumberExceptionHeaders", + modelProperties: { + errorCode: { + serializedName: "x-ms-error-code", + xmlName: "x-ms-error-code", + type: { + name: "String" + } + } + } + } + }; + var PageBlobCopyIncrementalHeaders = { + serializedName: "PageBlob_copyIncrementalHeaders", + type: { + name: "Composite", + className: "PageBlobCopyIncrementalHeaders", + modelProperties: { + etag: { + serializedName: "etag", + xmlName: "etag", + type: { + name: "String" + } + }, + lastModified: { + serializedName: "last-modified", + xmlName: "last-modified", + type: { + name: "DateTimeRfc1123" + } + }, + clientRequestId: { + serializedName: "x-ms-client-request-id", + xmlName: "x-ms-client-request-id", + type: { + name: "String" + } + }, + requestId: { + serializedName: "x-ms-request-id", + xmlName: "x-ms-request-id", + type: { + name: "String" + } + }, + version: { + serializedName: "x-ms-version", + xmlName: "x-ms-version", + type: { + name: "String" + } + }, + date: { + serializedName: "date", + xmlName: "date", + type: { + name: "DateTimeRfc1123" + } + }, + copyId: { + serializedName: "x-ms-copy-id", + xmlName: "x-ms-copy-id", + type: { + name: "String" + } + }, + copyStatus: { + serializedName: "x-ms-copy-status", + xmlName: "x-ms-copy-status", + type: { + name: "Enum", + allowedValues: ["pending", "success", "aborted", "failed"] + } + }, + errorCode: { + serializedName: "x-ms-error-code", + xmlName: "x-ms-error-code", + type: { + name: "String" + } + } + } + } + }; + var PageBlobCopyIncrementalExceptionHeaders = { + serializedName: "PageBlob_copyIncrementalExceptionHeaders", + type: { + name: "Composite", + className: "PageBlobCopyIncrementalExceptionHeaders", + modelProperties: { + errorCode: { + serializedName: "x-ms-error-code", + xmlName: "x-ms-error-code", + type: { + name: "String" + } + } + } + } + }; + var AppendBlobCreateHeaders = { + serializedName: "AppendBlob_createHeaders", + type: { + name: "Composite", + className: "AppendBlobCreateHeaders", + modelProperties: { + etag: { + serializedName: "etag", + xmlName: "etag", + type: { + name: "String" + } + }, + lastModified: { + serializedName: "last-modified", + xmlName: "last-modified", + type: { + name: "DateTimeRfc1123" + } + }, + contentMD5: { + serializedName: "content-md5", + xmlName: "content-md5", + type: { + name: "ByteArray" + } + }, + clientRequestId: { + serializedName: "x-ms-client-request-id", + xmlName: "x-ms-client-request-id", + type: { + name: "String" + } + }, + requestId: { + serializedName: "x-ms-request-id", + xmlName: "x-ms-request-id", + type: { + name: "String" + } + }, + version: { + serializedName: "x-ms-version", + xmlName: "x-ms-version", + type: { + name: "String" + } + }, + versionId: { + serializedName: "x-ms-version-id", + xmlName: "x-ms-version-id", + type: { + name: "String" + } + }, + date: { + serializedName: "date", + xmlName: "date", + type: { + name: "DateTimeRfc1123" + } + }, + isServerEncrypted: { + serializedName: "x-ms-request-server-encrypted", + xmlName: "x-ms-request-server-encrypted", + type: { + name: "Boolean" + } + }, + encryptionKeySha256: { + serializedName: "x-ms-encryption-key-sha256", + xmlName: "x-ms-encryption-key-sha256", + type: { + name: "String" + } + }, + encryptionScope: { + serializedName: "x-ms-encryption-scope", + xmlName: "x-ms-encryption-scope", + type: { + name: "String" + } + }, + errorCode: { + serializedName: "x-ms-error-code", + xmlName: "x-ms-error-code", + type: { + name: "String" + } + } + } + } + }; + var AppendBlobCreateExceptionHeaders = { + serializedName: "AppendBlob_createExceptionHeaders", + type: { + name: "Composite", + className: "AppendBlobCreateExceptionHeaders", + modelProperties: { + errorCode: { + serializedName: "x-ms-error-code", + xmlName: "x-ms-error-code", + type: { + name: "String" + } + } + } + } + }; + var AppendBlobAppendBlockHeaders = { + serializedName: "AppendBlob_appendBlockHeaders", + type: { + name: "Composite", + className: "AppendBlobAppendBlockHeaders", + modelProperties: { + etag: { + serializedName: "etag", + xmlName: "etag", + type: { + name: "String" + } + }, + lastModified: { + serializedName: "last-modified", + xmlName: "last-modified", + type: { + name: "DateTimeRfc1123" + } + }, + contentMD5: { + serializedName: "content-md5", + xmlName: "content-md5", + type: { + name: "ByteArray" + } + }, + xMsContentCrc64: { + serializedName: "x-ms-content-crc64", + xmlName: "x-ms-content-crc64", + type: { + name: "ByteArray" + } + }, + clientRequestId: { + serializedName: "x-ms-client-request-id", + xmlName: "x-ms-client-request-id", + type: { + name: "String" + } + }, + requestId: { + serializedName: "x-ms-request-id", + xmlName: "x-ms-request-id", + type: { + name: "String" + } + }, + version: { + serializedName: "x-ms-version", + xmlName: "x-ms-version", + type: { + name: "String" + } + }, + date: { + serializedName: "date", + xmlName: "date", + type: { + name: "DateTimeRfc1123" + } + }, + blobAppendOffset: { + serializedName: "x-ms-blob-append-offset", + xmlName: "x-ms-blob-append-offset", + type: { + name: "String" + } + }, + blobCommittedBlockCount: { + serializedName: "x-ms-blob-committed-block-count", + xmlName: "x-ms-blob-committed-block-count", + type: { + name: "Number" + } + }, + isServerEncrypted: { + serializedName: "x-ms-request-server-encrypted", + xmlName: "x-ms-request-server-encrypted", + type: { + name: "Boolean" + } + }, + encryptionKeySha256: { + serializedName: "x-ms-encryption-key-sha256", + xmlName: "x-ms-encryption-key-sha256", + type: { + name: "String" + } + }, + encryptionScope: { + serializedName: "x-ms-encryption-scope", + xmlName: "x-ms-encryption-scope", + type: { + name: "String" + } + }, + errorCode: { + serializedName: "x-ms-error-code", + xmlName: "x-ms-error-code", + type: { + name: "String" + } + } + } + } + }; + var AppendBlobAppendBlockExceptionHeaders = { + serializedName: "AppendBlob_appendBlockExceptionHeaders", + type: { + name: "Composite", + className: "AppendBlobAppendBlockExceptionHeaders", + modelProperties: { + errorCode: { + serializedName: "x-ms-error-code", + xmlName: "x-ms-error-code", + type: { + name: "String" + } + } + } + } + }; + var AppendBlobAppendBlockFromUrlHeaders = { + serializedName: "AppendBlob_appendBlockFromUrlHeaders", + type: { + name: "Composite", + className: "AppendBlobAppendBlockFromUrlHeaders", + modelProperties: { + etag: { + serializedName: "etag", + xmlName: "etag", + type: { + name: "String" + } + }, + lastModified: { + serializedName: "last-modified", + xmlName: "last-modified", + type: { + name: "DateTimeRfc1123" + } + }, + contentMD5: { + serializedName: "content-md5", + xmlName: "content-md5", + type: { + name: "ByteArray" + } + }, + xMsContentCrc64: { + serializedName: "x-ms-content-crc64", + xmlName: "x-ms-content-crc64", + type: { + name: "ByteArray" + } + }, + requestId: { + serializedName: "x-ms-request-id", + xmlName: "x-ms-request-id", + type: { + name: "String" + } + }, + version: { + serializedName: "x-ms-version", + xmlName: "x-ms-version", + type: { + name: "String" + } + }, + date: { + serializedName: "date", + xmlName: "date", + type: { + name: "DateTimeRfc1123" + } + }, + blobAppendOffset: { + serializedName: "x-ms-blob-append-offset", + xmlName: "x-ms-blob-append-offset", + type: { + name: "String" + } + }, + blobCommittedBlockCount: { + serializedName: "x-ms-blob-committed-block-count", + xmlName: "x-ms-blob-committed-block-count", + type: { + name: "Number" + } + }, + encryptionKeySha256: { + serializedName: "x-ms-encryption-key-sha256", + xmlName: "x-ms-encryption-key-sha256", + type: { + name: "String" + } + }, + encryptionScope: { + serializedName: "x-ms-encryption-scope", + xmlName: "x-ms-encryption-scope", + type: { + name: "String" + } + }, + isServerEncrypted: { + serializedName: "x-ms-request-server-encrypted", + xmlName: "x-ms-request-server-encrypted", + type: { + name: "Boolean" + } + }, + errorCode: { + serializedName: "x-ms-error-code", + xmlName: "x-ms-error-code", + type: { + name: "String" + } + } + } + } + }; + var AppendBlobAppendBlockFromUrlExceptionHeaders = { + serializedName: "AppendBlob_appendBlockFromUrlExceptionHeaders", + type: { + name: "Composite", + className: "AppendBlobAppendBlockFromUrlExceptionHeaders", + modelProperties: { + errorCode: { + serializedName: "x-ms-error-code", + xmlName: "x-ms-error-code", + type: { + name: "String" + } + } + } + } + }; + var AppendBlobSealHeaders = { + serializedName: "AppendBlob_sealHeaders", + type: { + name: "Composite", + className: "AppendBlobSealHeaders", + modelProperties: { + etag: { + serializedName: "etag", + xmlName: "etag", + type: { + name: "String" + } + }, + lastModified: { + serializedName: "last-modified", + xmlName: "last-modified", + type: { + name: "DateTimeRfc1123" + } + }, + clientRequestId: { + serializedName: "x-ms-client-request-id", + xmlName: "x-ms-client-request-id", + type: { + name: "String" + } + }, + requestId: { + serializedName: "x-ms-request-id", + xmlName: "x-ms-request-id", + type: { + name: "String" + } + }, + version: { + serializedName: "x-ms-version", + xmlName: "x-ms-version", + type: { + name: "String" + } + }, + date: { + serializedName: "date", + xmlName: "date", + type: { + name: "DateTimeRfc1123" + } + }, + isSealed: { + serializedName: "x-ms-blob-sealed", + xmlName: "x-ms-blob-sealed", + type: { + name: "Boolean" + } + } + } + } + }; + var AppendBlobSealExceptionHeaders = { + serializedName: "AppendBlob_sealExceptionHeaders", + type: { + name: "Composite", + className: "AppendBlobSealExceptionHeaders", + modelProperties: { + errorCode: { + serializedName: "x-ms-error-code", + xmlName: "x-ms-error-code", + type: { + name: "String" + } + } + } + } + }; + var BlockBlobUploadHeaders = { + serializedName: "BlockBlob_uploadHeaders", + type: { + name: "Composite", + className: "BlockBlobUploadHeaders", + modelProperties: { + etag: { + serializedName: "etag", + xmlName: "etag", + type: { + name: "String" + } + }, + lastModified: { + serializedName: "last-modified", + xmlName: "last-modified", + type: { + name: "DateTimeRfc1123" + } + }, + contentMD5: { + serializedName: "content-md5", + xmlName: "content-md5", + type: { + name: "ByteArray" + } + }, + clientRequestId: { + serializedName: "x-ms-client-request-id", + xmlName: "x-ms-client-request-id", + type: { + name: "String" + } + }, + requestId: { + serializedName: "x-ms-request-id", + xmlName: "x-ms-request-id", + type: { + name: "String" + } + }, + version: { + serializedName: "x-ms-version", + xmlName: "x-ms-version", + type: { + name: "String" + } + }, + versionId: { + serializedName: "x-ms-version-id", + xmlName: "x-ms-version-id", + type: { + name: "String" + } + }, + date: { + serializedName: "date", + xmlName: "date", + type: { + name: "DateTimeRfc1123" + } + }, + isServerEncrypted: { + serializedName: "x-ms-request-server-encrypted", + xmlName: "x-ms-request-server-encrypted", + type: { + name: "Boolean" + } + }, + encryptionKeySha256: { + serializedName: "x-ms-encryption-key-sha256", + xmlName: "x-ms-encryption-key-sha256", + type: { + name: "String" + } + }, + encryptionScope: { + serializedName: "x-ms-encryption-scope", + xmlName: "x-ms-encryption-scope", + type: { + name: "String" + } + }, + errorCode: { + serializedName: "x-ms-error-code", + xmlName: "x-ms-error-code", + type: { + name: "String" + } + } + } + } + }; + var BlockBlobUploadExceptionHeaders = { + serializedName: "BlockBlob_uploadExceptionHeaders", + type: { + name: "Composite", + className: "BlockBlobUploadExceptionHeaders", + modelProperties: { + errorCode: { + serializedName: "x-ms-error-code", + xmlName: "x-ms-error-code", + type: { + name: "String" + } + } + } + } + }; + var BlockBlobPutBlobFromUrlHeaders = { + serializedName: "BlockBlob_putBlobFromUrlHeaders", + type: { + name: "Composite", + className: "BlockBlobPutBlobFromUrlHeaders", + modelProperties: { + etag: { + serializedName: "etag", + xmlName: "etag", + type: { + name: "String" + } + }, + lastModified: { + serializedName: "last-modified", + xmlName: "last-modified", + type: { + name: "DateTimeRfc1123" + } + }, + contentMD5: { + serializedName: "content-md5", + xmlName: "content-md5", + type: { + name: "ByteArray" + } + }, + clientRequestId: { + serializedName: "x-ms-client-request-id", + xmlName: "x-ms-client-request-id", + type: { + name: "String" + } + }, + requestId: { + serializedName: "x-ms-request-id", + xmlName: "x-ms-request-id", + type: { + name: "String" + } + }, + version: { + serializedName: "x-ms-version", + xmlName: "x-ms-version", + type: { + name: "String" + } + }, + versionId: { + serializedName: "x-ms-version-id", + xmlName: "x-ms-version-id", + type: { + name: "String" + } + }, + date: { + serializedName: "date", + xmlName: "date", + type: { + name: "DateTimeRfc1123" + } + }, + isServerEncrypted: { + serializedName: "x-ms-request-server-encrypted", + xmlName: "x-ms-request-server-encrypted", + type: { + name: "Boolean" + } + }, + encryptionKeySha256: { + serializedName: "x-ms-encryption-key-sha256", + xmlName: "x-ms-encryption-key-sha256", + type: { + name: "String" + } + }, + encryptionScope: { + serializedName: "x-ms-encryption-scope", + xmlName: "x-ms-encryption-scope", + type: { + name: "String" + } + }, + errorCode: { + serializedName: "x-ms-error-code", + xmlName: "x-ms-error-code", + type: { + name: "String" + } + } + } + } + }; + var BlockBlobPutBlobFromUrlExceptionHeaders = { + serializedName: "BlockBlob_putBlobFromUrlExceptionHeaders", + type: { + name: "Composite", + className: "BlockBlobPutBlobFromUrlExceptionHeaders", + modelProperties: { + errorCode: { + serializedName: "x-ms-error-code", + xmlName: "x-ms-error-code", + type: { + name: "String" + } + } + } + } + }; + var BlockBlobStageBlockHeaders = { + serializedName: "BlockBlob_stageBlockHeaders", + type: { + name: "Composite", + className: "BlockBlobStageBlockHeaders", + modelProperties: { + contentMD5: { + serializedName: "content-md5", + xmlName: "content-md5", + type: { + name: "ByteArray" + } + }, + clientRequestId: { + serializedName: "x-ms-client-request-id", + xmlName: "x-ms-client-request-id", + type: { + name: "String" + } + }, + requestId: { + serializedName: "x-ms-request-id", + xmlName: "x-ms-request-id", + type: { + name: "String" + } + }, + version: { + serializedName: "x-ms-version", + xmlName: "x-ms-version", + type: { + name: "String" + } + }, + date: { + serializedName: "date", + xmlName: "date", + type: { + name: "DateTimeRfc1123" + } + }, + xMsContentCrc64: { + serializedName: "x-ms-content-crc64", + xmlName: "x-ms-content-crc64", + type: { + name: "ByteArray" + } + }, + isServerEncrypted: { + serializedName: "x-ms-request-server-encrypted", + xmlName: "x-ms-request-server-encrypted", + type: { + name: "Boolean" + } + }, + encryptionKeySha256: { + serializedName: "x-ms-encryption-key-sha256", + xmlName: "x-ms-encryption-key-sha256", + type: { + name: "String" + } + }, + encryptionScope: { + serializedName: "x-ms-encryption-scope", + xmlName: "x-ms-encryption-scope", + type: { + name: "String" + } + }, + errorCode: { + serializedName: "x-ms-error-code", + xmlName: "x-ms-error-code", + type: { + name: "String" + } + } + } + } + }; + var BlockBlobStageBlockExceptionHeaders = { + serializedName: "BlockBlob_stageBlockExceptionHeaders", + type: { + name: "Composite", + className: "BlockBlobStageBlockExceptionHeaders", + modelProperties: { + errorCode: { + serializedName: "x-ms-error-code", + xmlName: "x-ms-error-code", + type: { + name: "String" + } + } + } + } + }; + var BlockBlobStageBlockFromURLHeaders = { + serializedName: "BlockBlob_stageBlockFromURLHeaders", + type: { + name: "Composite", + className: "BlockBlobStageBlockFromURLHeaders", + modelProperties: { + contentMD5: { + serializedName: "content-md5", + xmlName: "content-md5", + type: { + name: "ByteArray" + } + }, + xMsContentCrc64: { + serializedName: "x-ms-content-crc64", + xmlName: "x-ms-content-crc64", + type: { + name: "ByteArray" + } + }, + clientRequestId: { + serializedName: "x-ms-client-request-id", + xmlName: "x-ms-client-request-id", + type: { + name: "String" + } + }, + requestId: { + serializedName: "x-ms-request-id", + xmlName: "x-ms-request-id", + type: { + name: "String" + } + }, + version: { + serializedName: "x-ms-version", + xmlName: "x-ms-version", + type: { + name: "String" + } + }, + date: { + serializedName: "date", + xmlName: "date", + type: { + name: "DateTimeRfc1123" + } + }, + isServerEncrypted: { + serializedName: "x-ms-request-server-encrypted", + xmlName: "x-ms-request-server-encrypted", + type: { + name: "Boolean" + } + }, + encryptionKeySha256: { + serializedName: "x-ms-encryption-key-sha256", + xmlName: "x-ms-encryption-key-sha256", + type: { + name: "String" + } + }, + encryptionScope: { + serializedName: "x-ms-encryption-scope", + xmlName: "x-ms-encryption-scope", + type: { + name: "String" + } + }, + errorCode: { + serializedName: "x-ms-error-code", + xmlName: "x-ms-error-code", + type: { + name: "String" + } + } + } + } + }; + var BlockBlobStageBlockFromURLExceptionHeaders = { + serializedName: "BlockBlob_stageBlockFromURLExceptionHeaders", + type: { + name: "Composite", + className: "BlockBlobStageBlockFromURLExceptionHeaders", + modelProperties: { + errorCode: { + serializedName: "x-ms-error-code", + xmlName: "x-ms-error-code", + type: { + name: "String" + } + } + } + } + }; + var BlockBlobCommitBlockListHeaders = { + serializedName: "BlockBlob_commitBlockListHeaders", + type: { + name: "Composite", + className: "BlockBlobCommitBlockListHeaders", + modelProperties: { + etag: { + serializedName: "etag", + xmlName: "etag", + type: { + name: "String" + } + }, + lastModified: { + serializedName: "last-modified", + xmlName: "last-modified", + type: { + name: "DateTimeRfc1123" + } + }, + contentMD5: { + serializedName: "content-md5", + xmlName: "content-md5", + type: { + name: "ByteArray" + } + }, + xMsContentCrc64: { + serializedName: "x-ms-content-crc64", + xmlName: "x-ms-content-crc64", + type: { + name: "ByteArray" + } + }, + clientRequestId: { + serializedName: "x-ms-client-request-id", + xmlName: "x-ms-client-request-id", + type: { + name: "String" + } + }, + requestId: { + serializedName: "x-ms-request-id", + xmlName: "x-ms-request-id", + type: { + name: "String" + } + }, + version: { + serializedName: "x-ms-version", + xmlName: "x-ms-version", + type: { + name: "String" + } + }, + versionId: { + serializedName: "x-ms-version-id", + xmlName: "x-ms-version-id", + type: { + name: "String" + } + }, + date: { + serializedName: "date", + xmlName: "date", + type: { + name: "DateTimeRfc1123" + } + }, + isServerEncrypted: { + serializedName: "x-ms-request-server-encrypted", + xmlName: "x-ms-request-server-encrypted", + type: { + name: "Boolean" + } + }, + encryptionKeySha256: { + serializedName: "x-ms-encryption-key-sha256", + xmlName: "x-ms-encryption-key-sha256", + type: { + name: "String" + } + }, + encryptionScope: { + serializedName: "x-ms-encryption-scope", + xmlName: "x-ms-encryption-scope", + type: { + name: "String" + } + }, + errorCode: { + serializedName: "x-ms-error-code", + xmlName: "x-ms-error-code", + type: { + name: "String" + } + } + } + } + }; + var BlockBlobCommitBlockListExceptionHeaders = { + serializedName: "BlockBlob_commitBlockListExceptionHeaders", + type: { + name: "Composite", + className: "BlockBlobCommitBlockListExceptionHeaders", + modelProperties: { + errorCode: { + serializedName: "x-ms-error-code", + xmlName: "x-ms-error-code", + type: { + name: "String" + } + } + } + } + }; + var BlockBlobGetBlockListHeaders = { + serializedName: "BlockBlob_getBlockListHeaders", + type: { + name: "Composite", + className: "BlockBlobGetBlockListHeaders", + modelProperties: { + lastModified: { + serializedName: "last-modified", + xmlName: "last-modified", + type: { + name: "DateTimeRfc1123" + } + }, + etag: { + serializedName: "etag", + xmlName: "etag", + type: { + name: "String" + } + }, + contentType: { + serializedName: "content-type", + xmlName: "content-type", + type: { + name: "String" + } + }, + blobContentLength: { + serializedName: "x-ms-blob-content-length", + xmlName: "x-ms-blob-content-length", + type: { + name: "Number" + } + }, + clientRequestId: { + serializedName: "x-ms-client-request-id", + xmlName: "x-ms-client-request-id", + type: { + name: "String" + } + }, + requestId: { + serializedName: "x-ms-request-id", + xmlName: "x-ms-request-id", + type: { + name: "String" + } + }, + version: { + serializedName: "x-ms-version", + xmlName: "x-ms-version", + type: { + name: "String" + } + }, + date: { + serializedName: "date", + xmlName: "date", + type: { + name: "DateTimeRfc1123" + } + }, + errorCode: { + serializedName: "x-ms-error-code", + xmlName: "x-ms-error-code", + type: { + name: "String" + } + } + } + } + }; + var BlockBlobGetBlockListExceptionHeaders = { + serializedName: "BlockBlob_getBlockListExceptionHeaders", + type: { + name: "Composite", + className: "BlockBlobGetBlockListExceptionHeaders", + modelProperties: { + errorCode: { + serializedName: "x-ms-error-code", + xmlName: "x-ms-error-code", + type: { + name: "String" + } + } + } + } + }; + var Mappers = /* @__PURE__ */ Object.freeze({ + __proto__: null, + AccessPolicy, + AppendBlobAppendBlockExceptionHeaders, + AppendBlobAppendBlockFromUrlExceptionHeaders, + AppendBlobAppendBlockFromUrlHeaders, + AppendBlobAppendBlockHeaders, + AppendBlobCreateExceptionHeaders, + AppendBlobCreateHeaders, + AppendBlobSealExceptionHeaders, + AppendBlobSealHeaders, + ArrowConfiguration, + ArrowField, + BlobAbortCopyFromURLExceptionHeaders, + BlobAbortCopyFromURLHeaders, + BlobAcquireLeaseExceptionHeaders, + BlobAcquireLeaseHeaders, + BlobBreakLeaseExceptionHeaders, + BlobBreakLeaseHeaders, + BlobChangeLeaseExceptionHeaders, + BlobChangeLeaseHeaders, + BlobCopyFromURLExceptionHeaders, + BlobCopyFromURLHeaders, + BlobCreateSnapshotExceptionHeaders, + BlobCreateSnapshotHeaders, + BlobDeleteExceptionHeaders, + BlobDeleteHeaders, + BlobDeleteImmutabilityPolicyExceptionHeaders, + BlobDeleteImmutabilityPolicyHeaders, + BlobDownloadExceptionHeaders, + BlobDownloadHeaders, + BlobFlatListSegment, + BlobGetAccountInfoExceptionHeaders, + BlobGetAccountInfoHeaders, + BlobGetPropertiesExceptionHeaders, + BlobGetPropertiesHeaders, + BlobGetTagsExceptionHeaders, + BlobGetTagsHeaders, + BlobHierarchyListSegment, + BlobItemInternal, + BlobName, + BlobPrefix, + BlobPropertiesInternal, + BlobQueryExceptionHeaders, + BlobQueryHeaders, + BlobReleaseLeaseExceptionHeaders, + BlobReleaseLeaseHeaders, + BlobRenewLeaseExceptionHeaders, + BlobRenewLeaseHeaders, + BlobServiceProperties, + BlobServiceStatistics, + BlobSetExpiryExceptionHeaders, + BlobSetExpiryHeaders, + BlobSetHttpHeadersExceptionHeaders, + BlobSetHttpHeadersHeaders, + BlobSetImmutabilityPolicyExceptionHeaders, + BlobSetImmutabilityPolicyHeaders, + BlobSetLegalHoldExceptionHeaders, + BlobSetLegalHoldHeaders, + BlobSetMetadataExceptionHeaders, + BlobSetMetadataHeaders, + BlobSetTagsExceptionHeaders, + BlobSetTagsHeaders, + BlobSetTierExceptionHeaders, + BlobSetTierHeaders, + BlobStartCopyFromURLExceptionHeaders, + BlobStartCopyFromURLHeaders, + BlobTag, + BlobTags, + BlobUndeleteExceptionHeaders, + BlobUndeleteHeaders, + Block, + BlockBlobCommitBlockListExceptionHeaders, + BlockBlobCommitBlockListHeaders, + BlockBlobGetBlockListExceptionHeaders, + BlockBlobGetBlockListHeaders, + BlockBlobPutBlobFromUrlExceptionHeaders, + BlockBlobPutBlobFromUrlHeaders, + BlockBlobStageBlockExceptionHeaders, + BlockBlobStageBlockFromURLExceptionHeaders, + BlockBlobStageBlockFromURLHeaders, + BlockBlobStageBlockHeaders, + BlockBlobUploadExceptionHeaders, + BlockBlobUploadHeaders, + BlockList, + BlockLookupList, + ClearRange, + ContainerAcquireLeaseExceptionHeaders, + ContainerAcquireLeaseHeaders, + ContainerBreakLeaseExceptionHeaders, + ContainerBreakLeaseHeaders, + ContainerChangeLeaseExceptionHeaders, + ContainerChangeLeaseHeaders, + ContainerCreateExceptionHeaders, + ContainerCreateHeaders, + ContainerDeleteExceptionHeaders, + ContainerDeleteHeaders, + ContainerFilterBlobsExceptionHeaders, + ContainerFilterBlobsHeaders, + ContainerGetAccessPolicyExceptionHeaders, + ContainerGetAccessPolicyHeaders, + ContainerGetAccountInfoExceptionHeaders, + ContainerGetAccountInfoHeaders, + ContainerGetPropertiesExceptionHeaders, + ContainerGetPropertiesHeaders, + ContainerItem, + ContainerListBlobFlatSegmentExceptionHeaders, + ContainerListBlobFlatSegmentHeaders, + ContainerListBlobHierarchySegmentExceptionHeaders, + ContainerListBlobHierarchySegmentHeaders, + ContainerProperties, + ContainerReleaseLeaseExceptionHeaders, + ContainerReleaseLeaseHeaders, + ContainerRenameExceptionHeaders, + ContainerRenameHeaders, + ContainerRenewLeaseExceptionHeaders, + ContainerRenewLeaseHeaders, + ContainerRestoreExceptionHeaders, + ContainerRestoreHeaders, + ContainerSetAccessPolicyExceptionHeaders, + ContainerSetAccessPolicyHeaders, + ContainerSetMetadataExceptionHeaders, + ContainerSetMetadataHeaders, + ContainerSubmitBatchExceptionHeaders, + ContainerSubmitBatchHeaders, + CorsRule, + DelimitedTextConfiguration, + FilterBlobItem, + FilterBlobSegment, + GeoReplication, + JsonTextConfiguration, + KeyInfo, + ListBlobsFlatSegmentResponse, + ListBlobsHierarchySegmentResponse, + ListContainersSegmentResponse, + Logging, + Metrics, + PageBlobClearPagesExceptionHeaders, + PageBlobClearPagesHeaders, + PageBlobCopyIncrementalExceptionHeaders, + PageBlobCopyIncrementalHeaders, + PageBlobCreateExceptionHeaders, + PageBlobCreateHeaders, + PageBlobGetPageRangesDiffExceptionHeaders, + PageBlobGetPageRangesDiffHeaders, + PageBlobGetPageRangesExceptionHeaders, + PageBlobGetPageRangesHeaders, + PageBlobResizeExceptionHeaders, + PageBlobResizeHeaders, + PageBlobUpdateSequenceNumberExceptionHeaders, + PageBlobUpdateSequenceNumberHeaders, + PageBlobUploadPagesExceptionHeaders, + PageBlobUploadPagesFromURLExceptionHeaders, + PageBlobUploadPagesFromURLHeaders, + PageBlobUploadPagesHeaders, + PageList, + PageRange, + QueryFormat, + QueryRequest, + QuerySerialization, + RetentionPolicy, + ServiceFilterBlobsExceptionHeaders, + ServiceFilterBlobsHeaders, + ServiceGetAccountInfoExceptionHeaders, + ServiceGetAccountInfoHeaders, + ServiceGetPropertiesExceptionHeaders, + ServiceGetPropertiesHeaders, + ServiceGetStatisticsExceptionHeaders, + ServiceGetStatisticsHeaders, + ServiceGetUserDelegationKeyExceptionHeaders, + ServiceGetUserDelegationKeyHeaders, + ServiceListContainersSegmentExceptionHeaders, + ServiceListContainersSegmentHeaders, + ServiceSetPropertiesExceptionHeaders, + ServiceSetPropertiesHeaders, + ServiceSubmitBatchExceptionHeaders, + ServiceSubmitBatchHeaders, + SignedIdentifier, + StaticWebsite, + StorageError, + UserDelegationKey + }); + var contentType = { + parameterPath: ["options", "contentType"], + mapper: { + defaultValue: "application/xml", + isConstant: true, + serializedName: "Content-Type", + type: { + name: "String" + } + } + }; + var blobServiceProperties = { + parameterPath: "blobServiceProperties", + mapper: BlobServiceProperties + }; + var accept = { + parameterPath: "accept", + mapper: { + defaultValue: "application/xml", + isConstant: true, + serializedName: "Accept", + type: { + name: "String" + } + } + }; + var url = { + parameterPath: "url", + mapper: { + serializedName: "url", + required: true, + xmlName: "url", + type: { + name: "String" + } + }, + skipEncoding: true + }; + var restype = { + parameterPath: "restype", + mapper: { + defaultValue: "service", + isConstant: true, + serializedName: "restype", + type: { + name: "String" + } + } + }; + var comp = { + parameterPath: "comp", + mapper: { + defaultValue: "properties", + isConstant: true, + serializedName: "comp", + type: { + name: "String" + } + } + }; + var timeoutInSeconds = { + parameterPath: ["options", "timeoutInSeconds"], + mapper: { + constraints: { + InclusiveMinimum: 0 + }, + serializedName: "timeout", + xmlName: "timeout", + type: { + name: "Number" + } + } + }; + var version = { + parameterPath: "version", + mapper: { + defaultValue: "2024-11-04", + isConstant: true, + serializedName: "x-ms-version", + type: { + name: "String" + } + } + }; + var requestId = { + parameterPath: ["options", "requestId"], + mapper: { + serializedName: "x-ms-client-request-id", + xmlName: "x-ms-client-request-id", + type: { + name: "String" + } + } + }; + var accept1 = { + parameterPath: "accept", + mapper: { + defaultValue: "application/xml", + isConstant: true, + serializedName: "Accept", + type: { + name: "String" + } + } + }; + var comp1 = { + parameterPath: "comp", + mapper: { + defaultValue: "stats", + isConstant: true, + serializedName: "comp", + type: { + name: "String" + } + } + }; + var comp2 = { + parameterPath: "comp", + mapper: { + defaultValue: "list", + isConstant: true, + serializedName: "comp", + type: { + name: "String" + } + } + }; + var prefix = { + parameterPath: ["options", "prefix"], + mapper: { + serializedName: "prefix", + xmlName: "prefix", + type: { + name: "String" + } + } + }; + var marker = { + parameterPath: ["options", "marker"], + mapper: { + serializedName: "marker", + xmlName: "marker", + type: { + name: "String" + } + } + }; + var maxPageSize = { + parameterPath: ["options", "maxPageSize"], + mapper: { + constraints: { + InclusiveMinimum: 1 + }, + serializedName: "maxresults", + xmlName: "maxresults", + type: { + name: "Number" + } + } + }; + var include = { + parameterPath: ["options", "include"], + mapper: { + serializedName: "include", + xmlName: "include", + xmlElementName: "ListContainersIncludeType", + type: { + name: "Sequence", + element: { + type: { + name: "Enum", + allowedValues: ["metadata", "deleted", "system"] + } + } + } + }, + collectionFormat: "CSV" + }; + var keyInfo = { + parameterPath: "keyInfo", + mapper: KeyInfo + }; + var comp3 = { + parameterPath: "comp", + mapper: { + defaultValue: "userdelegationkey", + isConstant: true, + serializedName: "comp", + type: { + name: "String" + } + } + }; + var restype1 = { + parameterPath: "restype", + mapper: { + defaultValue: "account", + isConstant: true, + serializedName: "restype", + type: { + name: "String" + } + } + }; + var body = { + parameterPath: "body", + mapper: { + serializedName: "body", + required: true, + xmlName: "body", + type: { + name: "Stream" + } + } + }; + var comp4 = { + parameterPath: "comp", + mapper: { + defaultValue: "batch", + isConstant: true, + serializedName: "comp", + type: { + name: "String" + } + } + }; + var contentLength = { + parameterPath: "contentLength", + mapper: { + serializedName: "Content-Length", + required: true, + xmlName: "Content-Length", + type: { + name: "Number" + } + } + }; + var multipartContentType = { + parameterPath: "multipartContentType", + mapper: { + serializedName: "Content-Type", + required: true, + xmlName: "Content-Type", + type: { + name: "String" + } + } + }; + var comp5 = { + parameterPath: "comp", + mapper: { + defaultValue: "blobs", + isConstant: true, + serializedName: "comp", + type: { + name: "String" + } + } + }; + var where = { + parameterPath: ["options", "where"], + mapper: { + serializedName: "where", + xmlName: "where", + type: { + name: "String" + } + } + }; + var restype2 = { + parameterPath: "restype", + mapper: { + defaultValue: "container", + isConstant: true, + serializedName: "restype", + type: { + name: "String" + } + } + }; + var metadata = { + parameterPath: ["options", "metadata"], + mapper: { + serializedName: "x-ms-meta", + xmlName: "x-ms-meta", + headerCollectionPrefix: "x-ms-meta-", + type: { + name: "Dictionary", + value: { type: { name: "String" } } + } + } + }; + var access = { + parameterPath: ["options", "access"], + mapper: { + serializedName: "x-ms-blob-public-access", + xmlName: "x-ms-blob-public-access", + type: { + name: "Enum", + allowedValues: ["container", "blob"] + } + } + }; + var defaultEncryptionScope = { + parameterPath: [ + "options", + "containerEncryptionScope", + "defaultEncryptionScope" + ], + mapper: { + serializedName: "x-ms-default-encryption-scope", + xmlName: "x-ms-default-encryption-scope", + type: { + name: "String" + } + } + }; + var preventEncryptionScopeOverride = { + parameterPath: [ + "options", + "containerEncryptionScope", + "preventEncryptionScopeOverride" + ], + mapper: { + serializedName: "x-ms-deny-encryption-scope-override", + xmlName: "x-ms-deny-encryption-scope-override", + type: { + name: "Boolean" + } + } + }; + var leaseId = { + parameterPath: ["options", "leaseAccessConditions", "leaseId"], + mapper: { + serializedName: "x-ms-lease-id", + xmlName: "x-ms-lease-id", + type: { + name: "String" + } + } + }; + var ifModifiedSince = { + parameterPath: ["options", "modifiedAccessConditions", "ifModifiedSince"], + mapper: { + serializedName: "If-Modified-Since", + xmlName: "If-Modified-Since", + type: { + name: "DateTimeRfc1123" + } + } + }; + var ifUnmodifiedSince = { + parameterPath: ["options", "modifiedAccessConditions", "ifUnmodifiedSince"], + mapper: { + serializedName: "If-Unmodified-Since", + xmlName: "If-Unmodified-Since", + type: { + name: "DateTimeRfc1123" + } + } + }; + var comp6 = { + parameterPath: "comp", + mapper: { + defaultValue: "metadata", + isConstant: true, + serializedName: "comp", + type: { + name: "String" + } + } + }; + var comp7 = { + parameterPath: "comp", + mapper: { + defaultValue: "acl", + isConstant: true, + serializedName: "comp", + type: { + name: "String" + } + } + }; + var containerAcl = { + parameterPath: ["options", "containerAcl"], + mapper: { + serializedName: "containerAcl", + xmlName: "SignedIdentifiers", + xmlIsWrapped: true, + xmlElementName: "SignedIdentifier", + type: { + name: "Sequence", + element: { + type: { + name: "Composite", + className: "SignedIdentifier" + } + } + } + } + }; + var comp8 = { + parameterPath: "comp", + mapper: { + defaultValue: "undelete", + isConstant: true, + serializedName: "comp", + type: { + name: "String" + } + } + }; + var deletedContainerName = { + parameterPath: ["options", "deletedContainerName"], + mapper: { + serializedName: "x-ms-deleted-container-name", + xmlName: "x-ms-deleted-container-name", + type: { + name: "String" + } + } + }; + var deletedContainerVersion = { + parameterPath: ["options", "deletedContainerVersion"], + mapper: { + serializedName: "x-ms-deleted-container-version", + xmlName: "x-ms-deleted-container-version", + type: { + name: "String" + } + } + }; + var comp9 = { + parameterPath: "comp", + mapper: { + defaultValue: "rename", + isConstant: true, + serializedName: "comp", + type: { + name: "String" + } + } + }; + var sourceContainerName = { + parameterPath: "sourceContainerName", + mapper: { + serializedName: "x-ms-source-container-name", + required: true, + xmlName: "x-ms-source-container-name", + type: { + name: "String" + } + } + }; + var sourceLeaseId = { + parameterPath: ["options", "sourceLeaseId"], + mapper: { + serializedName: "x-ms-source-lease-id", + xmlName: "x-ms-source-lease-id", + type: { + name: "String" + } + } + }; + var comp10 = { + parameterPath: "comp", + mapper: { + defaultValue: "lease", + isConstant: true, + serializedName: "comp", + type: { + name: "String" + } + } + }; + var action = { + parameterPath: "action", + mapper: { + defaultValue: "acquire", + isConstant: true, + serializedName: "x-ms-lease-action", + type: { + name: "String" + } + } + }; + var duration = { + parameterPath: ["options", "duration"], + mapper: { + serializedName: "x-ms-lease-duration", + xmlName: "x-ms-lease-duration", + type: { + name: "Number" + } + } + }; + var proposedLeaseId = { + parameterPath: ["options", "proposedLeaseId"], + mapper: { + serializedName: "x-ms-proposed-lease-id", + xmlName: "x-ms-proposed-lease-id", + type: { + name: "String" + } + } + }; + var action1 = { + parameterPath: "action", + mapper: { + defaultValue: "release", + isConstant: true, + serializedName: "x-ms-lease-action", + type: { + name: "String" + } + } + }; + var leaseId1 = { + parameterPath: "leaseId", + mapper: { + serializedName: "x-ms-lease-id", + required: true, + xmlName: "x-ms-lease-id", + type: { + name: "String" + } + } + }; + var action2 = { + parameterPath: "action", + mapper: { + defaultValue: "renew", + isConstant: true, + serializedName: "x-ms-lease-action", + type: { + name: "String" + } + } + }; + var action3 = { + parameterPath: "action", + mapper: { + defaultValue: "break", + isConstant: true, + serializedName: "x-ms-lease-action", + type: { + name: "String" + } + } + }; + var breakPeriod = { + parameterPath: ["options", "breakPeriod"], + mapper: { + serializedName: "x-ms-lease-break-period", + xmlName: "x-ms-lease-break-period", + type: { + name: "Number" + } + } + }; + var action4 = { + parameterPath: "action", + mapper: { + defaultValue: "change", + isConstant: true, + serializedName: "x-ms-lease-action", + type: { + name: "String" + } + } + }; + var proposedLeaseId1 = { + parameterPath: "proposedLeaseId", + mapper: { + serializedName: "x-ms-proposed-lease-id", + required: true, + xmlName: "x-ms-proposed-lease-id", + type: { + name: "String" + } + } + }; + var include1 = { + parameterPath: ["options", "include"], + mapper: { + serializedName: "include", + xmlName: "include", + xmlElementName: "ListBlobsIncludeItem", + type: { + name: "Sequence", + element: { + type: { + name: "Enum", + allowedValues: [ + "copy", + "deleted", + "metadata", + "snapshots", + "uncommittedblobs", + "versions", + "tags", + "immutabilitypolicy", + "legalhold", + "deletedwithversions" + ] + } + } + } + }, + collectionFormat: "CSV" + }; + var delimiter = { + parameterPath: "delimiter", + mapper: { + serializedName: "delimiter", + required: true, + xmlName: "delimiter", + type: { + name: "String" + } + } + }; + var snapshot = { + parameterPath: ["options", "snapshot"], + mapper: { + serializedName: "snapshot", + xmlName: "snapshot", + type: { + name: "String" + } + } + }; + var versionId = { + parameterPath: ["options", "versionId"], + mapper: { + serializedName: "versionid", + xmlName: "versionid", + type: { + name: "String" + } + } + }; + var range = { + parameterPath: ["options", "range"], + mapper: { + serializedName: "x-ms-range", + xmlName: "x-ms-range", + type: { + name: "String" + } + } + }; + var rangeGetContentMD5 = { + parameterPath: ["options", "rangeGetContentMD5"], + mapper: { + serializedName: "x-ms-range-get-content-md5", + xmlName: "x-ms-range-get-content-md5", + type: { + name: "Boolean" + } + } + }; + var rangeGetContentCRC64 = { + parameterPath: ["options", "rangeGetContentCRC64"], + mapper: { + serializedName: "x-ms-range-get-content-crc64", + xmlName: "x-ms-range-get-content-crc64", + type: { + name: "Boolean" + } + } + }; + var encryptionKey = { + parameterPath: ["options", "cpkInfo", "encryptionKey"], + mapper: { + serializedName: "x-ms-encryption-key", + xmlName: "x-ms-encryption-key", + type: { + name: "String" + } + } + }; + var encryptionKeySha256 = { + parameterPath: ["options", "cpkInfo", "encryptionKeySha256"], + mapper: { + serializedName: "x-ms-encryption-key-sha256", + xmlName: "x-ms-encryption-key-sha256", + type: { + name: "String" + } + } + }; + var encryptionAlgorithm = { + parameterPath: ["options", "cpkInfo", "encryptionAlgorithm"], + mapper: { + serializedName: "x-ms-encryption-algorithm", + xmlName: "x-ms-encryption-algorithm", + type: { + name: "String" + } + } + }; + var ifMatch = { + parameterPath: ["options", "modifiedAccessConditions", "ifMatch"], + mapper: { + serializedName: "If-Match", + xmlName: "If-Match", + type: { + name: "String" + } + } + }; + var ifNoneMatch = { + parameterPath: ["options", "modifiedAccessConditions", "ifNoneMatch"], + mapper: { + serializedName: "If-None-Match", + xmlName: "If-None-Match", + type: { + name: "String" + } + } + }; + var ifTags = { + parameterPath: ["options", "modifiedAccessConditions", "ifTags"], + mapper: { + serializedName: "x-ms-if-tags", + xmlName: "x-ms-if-tags", + type: { + name: "String" + } + } + }; + var deleteSnapshots = { + parameterPath: ["options", "deleteSnapshots"], + mapper: { + serializedName: "x-ms-delete-snapshots", + xmlName: "x-ms-delete-snapshots", + type: { + name: "Enum", + allowedValues: ["include", "only"] + } + } + }; + var blobDeleteType = { + parameterPath: ["options", "blobDeleteType"], + mapper: { + serializedName: "deletetype", + xmlName: "deletetype", + type: { + name: "String" + } + } + }; + var comp11 = { + parameterPath: "comp", + mapper: { + defaultValue: "expiry", + isConstant: true, + serializedName: "comp", + type: { + name: "String" + } + } + }; + var expiryOptions = { + parameterPath: "expiryOptions", + mapper: { + serializedName: "x-ms-expiry-option", + required: true, + xmlName: "x-ms-expiry-option", + type: { + name: "String" + } + } + }; + var expiresOn = { + parameterPath: ["options", "expiresOn"], + mapper: { + serializedName: "x-ms-expiry-time", + xmlName: "x-ms-expiry-time", + type: { + name: "String" + } + } + }; + var blobCacheControl = { + parameterPath: ["options", "blobHttpHeaders", "blobCacheControl"], + mapper: { + serializedName: "x-ms-blob-cache-control", + xmlName: "x-ms-blob-cache-control", + type: { + name: "String" + } + } + }; + var blobContentType = { + parameterPath: ["options", "blobHttpHeaders", "blobContentType"], + mapper: { + serializedName: "x-ms-blob-content-type", + xmlName: "x-ms-blob-content-type", + type: { + name: "String" + } + } + }; + var blobContentMD5 = { + parameterPath: ["options", "blobHttpHeaders", "blobContentMD5"], + mapper: { + serializedName: "x-ms-blob-content-md5", + xmlName: "x-ms-blob-content-md5", + type: { + name: "ByteArray" + } + } + }; + var blobContentEncoding = { + parameterPath: ["options", "blobHttpHeaders", "blobContentEncoding"], + mapper: { + serializedName: "x-ms-blob-content-encoding", + xmlName: "x-ms-blob-content-encoding", + type: { + name: "String" + } + } + }; + var blobContentLanguage = { + parameterPath: ["options", "blobHttpHeaders", "blobContentLanguage"], + mapper: { + serializedName: "x-ms-blob-content-language", + xmlName: "x-ms-blob-content-language", + type: { + name: "String" + } + } + }; + var blobContentDisposition = { + parameterPath: ["options", "blobHttpHeaders", "blobContentDisposition"], + mapper: { + serializedName: "x-ms-blob-content-disposition", + xmlName: "x-ms-blob-content-disposition", + type: { + name: "String" + } + } + }; + var comp12 = { + parameterPath: "comp", + mapper: { + defaultValue: "immutabilityPolicies", + isConstant: true, + serializedName: "comp", + type: { + name: "String" + } + } + }; + var immutabilityPolicyExpiry = { + parameterPath: ["options", "immutabilityPolicyExpiry"], + mapper: { + serializedName: "x-ms-immutability-policy-until-date", + xmlName: "x-ms-immutability-policy-until-date", + type: { + name: "DateTimeRfc1123" + } + } + }; + var immutabilityPolicyMode = { + parameterPath: ["options", "immutabilityPolicyMode"], + mapper: { + serializedName: "x-ms-immutability-policy-mode", + xmlName: "x-ms-immutability-policy-mode", + type: { + name: "Enum", + allowedValues: ["Mutable", "Unlocked", "Locked"] + } + } + }; + var comp13 = { + parameterPath: "comp", + mapper: { + defaultValue: "legalhold", + isConstant: true, + serializedName: "comp", + type: { + name: "String" + } + } + }; + var legalHold = { + parameterPath: "legalHold", + mapper: { + serializedName: "x-ms-legal-hold", + required: true, + xmlName: "x-ms-legal-hold", + type: { + name: "Boolean" + } + } + }; + var encryptionScope = { + parameterPath: ["options", "encryptionScope"], + mapper: { + serializedName: "x-ms-encryption-scope", + xmlName: "x-ms-encryption-scope", + type: { + name: "String" + } + } + }; + var comp14 = { + parameterPath: "comp", + mapper: { + defaultValue: "snapshot", + isConstant: true, + serializedName: "comp", + type: { + name: "String" + } + } + }; + var tier = { + parameterPath: ["options", "tier"], + mapper: { + serializedName: "x-ms-access-tier", + xmlName: "x-ms-access-tier", + type: { + name: "Enum", + allowedValues: [ + "P4", + "P6", + "P10", + "P15", + "P20", + "P30", + "P40", + "P50", + "P60", + "P70", + "P80", + "Hot", + "Cool", + "Archive", + "Cold" + ] + } + } + }; + var rehydratePriority = { + parameterPath: ["options", "rehydratePriority"], + mapper: { + serializedName: "x-ms-rehydrate-priority", + xmlName: "x-ms-rehydrate-priority", + type: { + name: "Enum", + allowedValues: ["High", "Standard"] + } + } + }; + var sourceIfModifiedSince = { + parameterPath: [ + "options", + "sourceModifiedAccessConditions", + "sourceIfModifiedSince" + ], + mapper: { + serializedName: "x-ms-source-if-modified-since", + xmlName: "x-ms-source-if-modified-since", + type: { + name: "DateTimeRfc1123" + } + } + }; + var sourceIfUnmodifiedSince = { + parameterPath: [ + "options", + "sourceModifiedAccessConditions", + "sourceIfUnmodifiedSince" + ], + mapper: { + serializedName: "x-ms-source-if-unmodified-since", + xmlName: "x-ms-source-if-unmodified-since", + type: { + name: "DateTimeRfc1123" + } + } + }; + var sourceIfMatch = { + parameterPath: ["options", "sourceModifiedAccessConditions", "sourceIfMatch"], + mapper: { + serializedName: "x-ms-source-if-match", + xmlName: "x-ms-source-if-match", + type: { + name: "String" + } + } + }; + var sourceIfNoneMatch = { + parameterPath: [ + "options", + "sourceModifiedAccessConditions", + "sourceIfNoneMatch" + ], + mapper: { + serializedName: "x-ms-source-if-none-match", + xmlName: "x-ms-source-if-none-match", + type: { + name: "String" + } + } + }; + var sourceIfTags = { + parameterPath: ["options", "sourceModifiedAccessConditions", "sourceIfTags"], + mapper: { + serializedName: "x-ms-source-if-tags", + xmlName: "x-ms-source-if-tags", + type: { + name: "String" + } + } + }; + var copySource = { + parameterPath: "copySource", + mapper: { + serializedName: "x-ms-copy-source", + required: true, + xmlName: "x-ms-copy-source", + type: { + name: "String" + } + } + }; + var blobTagsString = { + parameterPath: ["options", "blobTagsString"], + mapper: { + serializedName: "x-ms-tags", + xmlName: "x-ms-tags", + type: { + name: "String" + } + } + }; + var sealBlob = { + parameterPath: ["options", "sealBlob"], + mapper: { + serializedName: "x-ms-seal-blob", + xmlName: "x-ms-seal-blob", + type: { + name: "Boolean" + } + } + }; + var legalHold1 = { + parameterPath: ["options", "legalHold"], + mapper: { + serializedName: "x-ms-legal-hold", + xmlName: "x-ms-legal-hold", + type: { + name: "Boolean" + } + } + }; + var xMsRequiresSync = { + parameterPath: "xMsRequiresSync", + mapper: { + defaultValue: "true", + isConstant: true, + serializedName: "x-ms-requires-sync", + type: { + name: "String" + } + } + }; + var sourceContentMD5 = { + parameterPath: ["options", "sourceContentMD5"], + mapper: { + serializedName: "x-ms-source-content-md5", + xmlName: "x-ms-source-content-md5", + type: { + name: "ByteArray" + } + } + }; + var copySourceAuthorization = { + parameterPath: ["options", "copySourceAuthorization"], + mapper: { + serializedName: "x-ms-copy-source-authorization", + xmlName: "x-ms-copy-source-authorization", + type: { + name: "String" + } + } + }; + var copySourceTags = { + parameterPath: ["options", "copySourceTags"], + mapper: { + serializedName: "x-ms-copy-source-tag-option", + xmlName: "x-ms-copy-source-tag-option", + type: { + name: "Enum", + allowedValues: ["REPLACE", "COPY"] + } + } + }; + var comp15 = { + parameterPath: "comp", + mapper: { + defaultValue: "copy", + isConstant: true, + serializedName: "comp", + type: { + name: "String" + } + } + }; + var copyActionAbortConstant = { + parameterPath: "copyActionAbortConstant", + mapper: { + defaultValue: "abort", + isConstant: true, + serializedName: "x-ms-copy-action", + type: { + name: "String" + } + } + }; + var copyId = { + parameterPath: "copyId", + mapper: { + serializedName: "copyid", + required: true, + xmlName: "copyid", + type: { + name: "String" + } + } + }; + var comp16 = { + parameterPath: "comp", + mapper: { + defaultValue: "tier", + isConstant: true, + serializedName: "comp", + type: { + name: "String" + } + } + }; + var tier1 = { + parameterPath: "tier", + mapper: { + serializedName: "x-ms-access-tier", + required: true, + xmlName: "x-ms-access-tier", + type: { + name: "Enum", + allowedValues: [ + "P4", + "P6", + "P10", + "P15", + "P20", + "P30", + "P40", + "P50", + "P60", + "P70", + "P80", + "Hot", + "Cool", + "Archive", + "Cold" + ] + } + } + }; + var queryRequest = { + parameterPath: ["options", "queryRequest"], + mapper: QueryRequest + }; + var comp17 = { + parameterPath: "comp", + mapper: { + defaultValue: "query", + isConstant: true, + serializedName: "comp", + type: { + name: "String" + } + } + }; + var comp18 = { + parameterPath: "comp", + mapper: { + defaultValue: "tags", + isConstant: true, + serializedName: "comp", + type: { + name: "String" + } + } + }; + var tags = { + parameterPath: ["options", "tags"], + mapper: BlobTags + }; + var transactionalContentMD5 = { + parameterPath: ["options", "transactionalContentMD5"], + mapper: { + serializedName: "Content-MD5", + xmlName: "Content-MD5", + type: { + name: "ByteArray" + } + } + }; + var transactionalContentCrc64 = { + parameterPath: ["options", "transactionalContentCrc64"], + mapper: { + serializedName: "x-ms-content-crc64", + xmlName: "x-ms-content-crc64", + type: { + name: "ByteArray" + } + } + }; + var blobType = { + parameterPath: "blobType", + mapper: { + defaultValue: "PageBlob", + isConstant: true, + serializedName: "x-ms-blob-type", + type: { + name: "String" + } + } + }; + var blobContentLength = { + parameterPath: "blobContentLength", + mapper: { + serializedName: "x-ms-blob-content-length", + required: true, + xmlName: "x-ms-blob-content-length", + type: { + name: "Number" + } + } + }; + var blobSequenceNumber = { + parameterPath: ["options", "blobSequenceNumber"], + mapper: { + defaultValue: 0, + serializedName: "x-ms-blob-sequence-number", + xmlName: "x-ms-blob-sequence-number", + type: { + name: "Number" + } + } + }; + var contentType1 = { + parameterPath: ["options", "contentType"], + mapper: { + defaultValue: "application/octet-stream", + isConstant: true, + serializedName: "Content-Type", + type: { + name: "String" + } + } + }; + var body1 = { + parameterPath: "body", + mapper: { + serializedName: "body", + required: true, + xmlName: "body", + type: { + name: "Stream" + } + } + }; + var accept2 = { + parameterPath: "accept", + mapper: { + defaultValue: "application/xml", + isConstant: true, + serializedName: "Accept", + type: { + name: "String" + } + } + }; + var comp19 = { + parameterPath: "comp", + mapper: { + defaultValue: "page", + isConstant: true, + serializedName: "comp", + type: { + name: "String" + } + } + }; + var pageWrite = { + parameterPath: "pageWrite", + mapper: { + defaultValue: "update", + isConstant: true, + serializedName: "x-ms-page-write", + type: { + name: "String" + } + } + }; + var ifSequenceNumberLessThanOrEqualTo = { + parameterPath: [ + "options", + "sequenceNumberAccessConditions", + "ifSequenceNumberLessThanOrEqualTo" + ], + mapper: { + serializedName: "x-ms-if-sequence-number-le", + xmlName: "x-ms-if-sequence-number-le", + type: { + name: "Number" + } + } + }; + var ifSequenceNumberLessThan = { + parameterPath: [ + "options", + "sequenceNumberAccessConditions", + "ifSequenceNumberLessThan" + ], + mapper: { + serializedName: "x-ms-if-sequence-number-lt", + xmlName: "x-ms-if-sequence-number-lt", + type: { + name: "Number" + } + } + }; + var ifSequenceNumberEqualTo = { + parameterPath: [ + "options", + "sequenceNumberAccessConditions", + "ifSequenceNumberEqualTo" + ], + mapper: { + serializedName: "x-ms-if-sequence-number-eq", + xmlName: "x-ms-if-sequence-number-eq", + type: { + name: "Number" + } + } + }; + var pageWrite1 = { + parameterPath: "pageWrite", + mapper: { + defaultValue: "clear", + isConstant: true, + serializedName: "x-ms-page-write", + type: { + name: "String" + } + } + }; + var sourceUrl = { + parameterPath: "sourceUrl", + mapper: { + serializedName: "x-ms-copy-source", + required: true, + xmlName: "x-ms-copy-source", + type: { + name: "String" + } + } + }; + var sourceRange = { + parameterPath: "sourceRange", + mapper: { + serializedName: "x-ms-source-range", + required: true, + xmlName: "x-ms-source-range", + type: { + name: "String" + } + } + }; + var sourceContentCrc64 = { + parameterPath: ["options", "sourceContentCrc64"], + mapper: { + serializedName: "x-ms-source-content-crc64", + xmlName: "x-ms-source-content-crc64", + type: { + name: "ByteArray" + } + } + }; + var range1 = { + parameterPath: "range", + mapper: { + serializedName: "x-ms-range", + required: true, + xmlName: "x-ms-range", + type: { + name: "String" + } + } + }; + var comp20 = { + parameterPath: "comp", + mapper: { + defaultValue: "pagelist", + isConstant: true, + serializedName: "comp", + type: { + name: "String" + } + } + }; + var prevsnapshot = { + parameterPath: ["options", "prevsnapshot"], + mapper: { + serializedName: "prevsnapshot", + xmlName: "prevsnapshot", + type: { + name: "String" + } + } + }; + var prevSnapshotUrl = { + parameterPath: ["options", "prevSnapshotUrl"], + mapper: { + serializedName: "x-ms-previous-snapshot-url", + xmlName: "x-ms-previous-snapshot-url", + type: { + name: "String" + } + } + }; + var sequenceNumberAction = { + parameterPath: "sequenceNumberAction", + mapper: { + serializedName: "x-ms-sequence-number-action", + required: true, + xmlName: "x-ms-sequence-number-action", + type: { + name: "Enum", + allowedValues: ["max", "update", "increment"] + } + } + }; + var comp21 = { + parameterPath: "comp", + mapper: { + defaultValue: "incrementalcopy", + isConstant: true, + serializedName: "comp", + type: { + name: "String" + } + } + }; + var blobType1 = { + parameterPath: "blobType", + mapper: { + defaultValue: "AppendBlob", + isConstant: true, + serializedName: "x-ms-blob-type", + type: { + name: "String" + } + } + }; + var comp22 = { + parameterPath: "comp", + mapper: { + defaultValue: "appendblock", + isConstant: true, + serializedName: "comp", + type: { + name: "String" + } + } + }; + var maxSize = { + parameterPath: ["options", "appendPositionAccessConditions", "maxSize"], + mapper: { + serializedName: "x-ms-blob-condition-maxsize", + xmlName: "x-ms-blob-condition-maxsize", + type: { + name: "Number" + } + } + }; + var appendPosition = { + parameterPath: [ + "options", + "appendPositionAccessConditions", + "appendPosition" + ], + mapper: { + serializedName: "x-ms-blob-condition-appendpos", + xmlName: "x-ms-blob-condition-appendpos", + type: { + name: "Number" + } + } + }; + var sourceRange1 = { + parameterPath: ["options", "sourceRange"], + mapper: { + serializedName: "x-ms-source-range", + xmlName: "x-ms-source-range", + type: { + name: "String" + } + } + }; + var comp23 = { + parameterPath: "comp", + mapper: { + defaultValue: "seal", + isConstant: true, + serializedName: "comp", + type: { + name: "String" + } + } + }; + var blobType2 = { + parameterPath: "blobType", + mapper: { + defaultValue: "BlockBlob", + isConstant: true, + serializedName: "x-ms-blob-type", + type: { + name: "String" + } + } + }; + var copySourceBlobProperties = { + parameterPath: ["options", "copySourceBlobProperties"], + mapper: { + serializedName: "x-ms-copy-source-blob-properties", + xmlName: "x-ms-copy-source-blob-properties", + type: { + name: "Boolean" + } + } + }; + var comp24 = { + parameterPath: "comp", + mapper: { + defaultValue: "block", + isConstant: true, + serializedName: "comp", + type: { + name: "String" + } + } + }; + var blockId = { + parameterPath: "blockId", + mapper: { + serializedName: "blockid", + required: true, + xmlName: "blockid", + type: { + name: "String" + } + } + }; + var blocks = { + parameterPath: "blocks", + mapper: BlockLookupList + }; + var comp25 = { + parameterPath: "comp", + mapper: { + defaultValue: "blocklist", + isConstant: true, + serializedName: "comp", + type: { + name: "String" + } + } + }; + var listType = { + parameterPath: "listType", + mapper: { + defaultValue: "committed", + serializedName: "blocklisttype", + required: true, + xmlName: "blocklisttype", + type: { + name: "Enum", + allowedValues: ["committed", "uncommitted", "all"] + } + } + }; + + class ServiceImpl { + constructor(client) { + this.client = client; + } + setProperties(blobServiceProperties2, options) { + return this.client.sendOperationRequest({ blobServiceProperties: blobServiceProperties2, options }, setPropertiesOperationSpec); + } + getProperties(options) { + return this.client.sendOperationRequest({ options }, getPropertiesOperationSpec$2); + } + getStatistics(options) { + return this.client.sendOperationRequest({ options }, getStatisticsOperationSpec); + } + listContainersSegment(options) { + return this.client.sendOperationRequest({ options }, listContainersSegmentOperationSpec); + } + getUserDelegationKey(keyInfo2, options) { + return this.client.sendOperationRequest({ keyInfo: keyInfo2, options }, getUserDelegationKeyOperationSpec); + } + getAccountInfo(options) { + return this.client.sendOperationRequest({ options }, getAccountInfoOperationSpec$2); + } + submitBatch(contentLength2, multipartContentType2, body2, options) { + return this.client.sendOperationRequest({ contentLength: contentLength2, multipartContentType: multipartContentType2, body: body2, options }, submitBatchOperationSpec$1); + } + filterBlobs(options) { + return this.client.sendOperationRequest({ options }, filterBlobsOperationSpec$1); + } + } + var xmlSerializer$5 = coreClient__namespace.createSerializer(Mappers, true); + var setPropertiesOperationSpec = { + path: "/", + httpMethod: "PUT", + responses: { + 202: { + headersMapper: ServiceSetPropertiesHeaders + }, + default: { + bodyMapper: StorageError, + headersMapper: ServiceSetPropertiesExceptionHeaders + } + }, + requestBody: blobServiceProperties, + queryParameters: [ + restype, + comp, + timeoutInSeconds + ], + urlParameters: [url], + headerParameters: [ + contentType, + accept, + version, + requestId + ], + isXML: true, + contentType: "application/xml; charset=utf-8", + mediaType: "xml", + serializer: xmlSerializer$5 + }; + var getPropertiesOperationSpec$2 = { + path: "/", + httpMethod: "GET", + responses: { + 200: { + bodyMapper: BlobServiceProperties, + headersMapper: ServiceGetPropertiesHeaders + }, + default: { + bodyMapper: StorageError, + headersMapper: ServiceGetPropertiesExceptionHeaders + } + }, + queryParameters: [ + restype, + comp, + timeoutInSeconds + ], + urlParameters: [url], + headerParameters: [ + version, + requestId, + accept1 + ], + isXML: true, + serializer: xmlSerializer$5 + }; + var getStatisticsOperationSpec = { + path: "/", + httpMethod: "GET", + responses: { + 200: { + bodyMapper: BlobServiceStatistics, + headersMapper: ServiceGetStatisticsHeaders + }, + default: { + bodyMapper: StorageError, + headersMapper: ServiceGetStatisticsExceptionHeaders + } + }, + queryParameters: [ + restype, + timeoutInSeconds, + comp1 + ], + urlParameters: [url], + headerParameters: [ + version, + requestId, + accept1 + ], + isXML: true, + serializer: xmlSerializer$5 + }; + var listContainersSegmentOperationSpec = { + path: "/", + httpMethod: "GET", + responses: { + 200: { + bodyMapper: ListContainersSegmentResponse, + headersMapper: ServiceListContainersSegmentHeaders + }, + default: { + bodyMapper: StorageError, + headersMapper: ServiceListContainersSegmentExceptionHeaders + } + }, + queryParameters: [ + timeoutInSeconds, + comp2, + prefix, + marker, + maxPageSize, + include + ], + urlParameters: [url], + headerParameters: [ + version, + requestId, + accept1 + ], + isXML: true, + serializer: xmlSerializer$5 + }; + var getUserDelegationKeyOperationSpec = { + path: "/", + httpMethod: "POST", + responses: { + 200: { + bodyMapper: UserDelegationKey, + headersMapper: ServiceGetUserDelegationKeyHeaders + }, + default: { + bodyMapper: StorageError, + headersMapper: ServiceGetUserDelegationKeyExceptionHeaders + } + }, + requestBody: keyInfo, + queryParameters: [ + restype, + timeoutInSeconds, + comp3 + ], + urlParameters: [url], + headerParameters: [ + contentType, + accept, + version, + requestId + ], + isXML: true, + contentType: "application/xml; charset=utf-8", + mediaType: "xml", + serializer: xmlSerializer$5 + }; + var getAccountInfoOperationSpec$2 = { + path: "/", + httpMethod: "GET", + responses: { + 200: { + headersMapper: ServiceGetAccountInfoHeaders + }, + default: { + bodyMapper: StorageError, + headersMapper: ServiceGetAccountInfoExceptionHeaders + } + }, + queryParameters: [ + comp, + timeoutInSeconds, + restype1 + ], + urlParameters: [url], + headerParameters: [ + version, + requestId, + accept1 + ], + isXML: true, + serializer: xmlSerializer$5 + }; + var submitBatchOperationSpec$1 = { + path: "/", + httpMethod: "POST", + responses: { + 202: { + bodyMapper: { + type: { name: "Stream" }, + serializedName: "parsedResponse" + }, + headersMapper: ServiceSubmitBatchHeaders + }, + default: { + bodyMapper: StorageError, + headersMapper: ServiceSubmitBatchExceptionHeaders + } + }, + requestBody: body, + queryParameters: [timeoutInSeconds, comp4], + urlParameters: [url], + headerParameters: [ + accept, + version, + requestId, + contentLength, + multipartContentType + ], + isXML: true, + contentType: "application/xml; charset=utf-8", + mediaType: "xml", + serializer: xmlSerializer$5 + }; + var filterBlobsOperationSpec$1 = { + path: "/", + httpMethod: "GET", + responses: { + 200: { + bodyMapper: FilterBlobSegment, + headersMapper: ServiceFilterBlobsHeaders + }, + default: { + bodyMapper: StorageError, + headersMapper: ServiceFilterBlobsExceptionHeaders + } + }, + queryParameters: [ + timeoutInSeconds, + marker, + maxPageSize, + comp5, + where + ], + urlParameters: [url], + headerParameters: [ + version, + requestId, + accept1 + ], + isXML: true, + serializer: xmlSerializer$5 + }; + + class ContainerImpl { + constructor(client) { + this.client = client; + } + create(options) { + return this.client.sendOperationRequest({ options }, createOperationSpec$2); + } + getProperties(options) { + return this.client.sendOperationRequest({ options }, getPropertiesOperationSpec$1); + } + delete(options) { + return this.client.sendOperationRequest({ options }, deleteOperationSpec$1); + } + setMetadata(options) { + return this.client.sendOperationRequest({ options }, setMetadataOperationSpec$1); + } + getAccessPolicy(options) { + return this.client.sendOperationRequest({ options }, getAccessPolicyOperationSpec); + } + setAccessPolicy(options) { + return this.client.sendOperationRequest({ options }, setAccessPolicyOperationSpec); + } + restore(options) { + return this.client.sendOperationRequest({ options }, restoreOperationSpec); + } + rename(sourceContainerName2, options) { + return this.client.sendOperationRequest({ sourceContainerName: sourceContainerName2, options }, renameOperationSpec); + } + submitBatch(contentLength2, multipartContentType2, body2, options) { + return this.client.sendOperationRequest({ contentLength: contentLength2, multipartContentType: multipartContentType2, body: body2, options }, submitBatchOperationSpec); + } + filterBlobs(options) { + return this.client.sendOperationRequest({ options }, filterBlobsOperationSpec); + } + acquireLease(options) { + return this.client.sendOperationRequest({ options }, acquireLeaseOperationSpec$1); + } + releaseLease(leaseId2, options) { + return this.client.sendOperationRequest({ leaseId: leaseId2, options }, releaseLeaseOperationSpec$1); + } + renewLease(leaseId2, options) { + return this.client.sendOperationRequest({ leaseId: leaseId2, options }, renewLeaseOperationSpec$1); + } + breakLease(options) { + return this.client.sendOperationRequest({ options }, breakLeaseOperationSpec$1); + } + changeLease(leaseId2, proposedLeaseId2, options) { + return this.client.sendOperationRequest({ leaseId: leaseId2, proposedLeaseId: proposedLeaseId2, options }, changeLeaseOperationSpec$1); + } + listBlobFlatSegment(options) { + return this.client.sendOperationRequest({ options }, listBlobFlatSegmentOperationSpec); + } + listBlobHierarchySegment(delimiter2, options) { + return this.client.sendOperationRequest({ delimiter: delimiter2, options }, listBlobHierarchySegmentOperationSpec); + } + getAccountInfo(options) { + return this.client.sendOperationRequest({ options }, getAccountInfoOperationSpec$1); + } + } + var xmlSerializer$4 = coreClient__namespace.createSerializer(Mappers, true); + var createOperationSpec$2 = { + path: "/{containerName}", + httpMethod: "PUT", + responses: { + 201: { + headersMapper: ContainerCreateHeaders + }, + default: { + bodyMapper: StorageError, + headersMapper: ContainerCreateExceptionHeaders + } + }, + queryParameters: [timeoutInSeconds, restype2], + urlParameters: [url], + headerParameters: [ + version, + requestId, + accept1, + metadata, + access, + defaultEncryptionScope, + preventEncryptionScopeOverride + ], + isXML: true, + serializer: xmlSerializer$4 + }; + var getPropertiesOperationSpec$1 = { + path: "/{containerName}", + httpMethod: "GET", + responses: { + 200: { + headersMapper: ContainerGetPropertiesHeaders + }, + default: { + bodyMapper: StorageError, + headersMapper: ContainerGetPropertiesExceptionHeaders + } + }, + queryParameters: [timeoutInSeconds, restype2], + urlParameters: [url], + headerParameters: [ + version, + requestId, + accept1, + leaseId + ], + isXML: true, + serializer: xmlSerializer$4 + }; + var deleteOperationSpec$1 = { + path: "/{containerName}", + httpMethod: "DELETE", + responses: { + 202: { + headersMapper: ContainerDeleteHeaders + }, + default: { + bodyMapper: StorageError, + headersMapper: ContainerDeleteExceptionHeaders + } + }, + queryParameters: [timeoutInSeconds, restype2], + urlParameters: [url], + headerParameters: [ + version, + requestId, + accept1, + leaseId, + ifModifiedSince, + ifUnmodifiedSince + ], + isXML: true, + serializer: xmlSerializer$4 + }; + var setMetadataOperationSpec$1 = { + path: "/{containerName}", + httpMethod: "PUT", + responses: { + 200: { + headersMapper: ContainerSetMetadataHeaders + }, + default: { + bodyMapper: StorageError, + headersMapper: ContainerSetMetadataExceptionHeaders + } + }, + queryParameters: [ + timeoutInSeconds, + restype2, + comp6 + ], + urlParameters: [url], + headerParameters: [ + version, + requestId, + accept1, + metadata, + leaseId, + ifModifiedSince + ], + isXML: true, + serializer: xmlSerializer$4 + }; + var getAccessPolicyOperationSpec = { + path: "/{containerName}", + httpMethod: "GET", + responses: { + 200: { + bodyMapper: { + type: { + name: "Sequence", + element: { + type: { name: "Composite", className: "SignedIdentifier" } + } + }, + serializedName: "SignedIdentifiers", + xmlName: "SignedIdentifiers", + xmlIsWrapped: true, + xmlElementName: "SignedIdentifier" + }, + headersMapper: ContainerGetAccessPolicyHeaders + }, + default: { + bodyMapper: StorageError, + headersMapper: ContainerGetAccessPolicyExceptionHeaders + } + }, + queryParameters: [ + timeoutInSeconds, + restype2, + comp7 + ], + urlParameters: [url], + headerParameters: [ + version, + requestId, + accept1, + leaseId + ], + isXML: true, + serializer: xmlSerializer$4 + }; + var setAccessPolicyOperationSpec = { + path: "/{containerName}", + httpMethod: "PUT", + responses: { + 200: { + headersMapper: ContainerSetAccessPolicyHeaders + }, + default: { + bodyMapper: StorageError, + headersMapper: ContainerSetAccessPolicyExceptionHeaders + } + }, + requestBody: containerAcl, + queryParameters: [ + timeoutInSeconds, + restype2, + comp7 + ], + urlParameters: [url], + headerParameters: [ + contentType, + accept, + version, + requestId, + access, + leaseId, + ifModifiedSince, + ifUnmodifiedSince + ], + isXML: true, + contentType: "application/xml; charset=utf-8", + mediaType: "xml", + serializer: xmlSerializer$4 + }; + var restoreOperationSpec = { + path: "/{containerName}", + httpMethod: "PUT", + responses: { + 201: { + headersMapper: ContainerRestoreHeaders + }, + default: { + bodyMapper: StorageError, + headersMapper: ContainerRestoreExceptionHeaders + } + }, + queryParameters: [ + timeoutInSeconds, + restype2, + comp8 + ], + urlParameters: [url], + headerParameters: [ + version, + requestId, + accept1, + deletedContainerName, + deletedContainerVersion + ], + isXML: true, + serializer: xmlSerializer$4 + }; + var renameOperationSpec = { + path: "/{containerName}", + httpMethod: "PUT", + responses: { + 200: { + headersMapper: ContainerRenameHeaders + }, + default: { + bodyMapper: StorageError, + headersMapper: ContainerRenameExceptionHeaders + } + }, + queryParameters: [ + timeoutInSeconds, + restype2, + comp9 + ], + urlParameters: [url], + headerParameters: [ + version, + requestId, + accept1, + sourceContainerName, + sourceLeaseId + ], + isXML: true, + serializer: xmlSerializer$4 + }; + var submitBatchOperationSpec = { + path: "/{containerName}", + httpMethod: "POST", + responses: { + 202: { + bodyMapper: { + type: { name: "Stream" }, + serializedName: "parsedResponse" + }, + headersMapper: ContainerSubmitBatchHeaders + }, + default: { + bodyMapper: StorageError, + headersMapper: ContainerSubmitBatchExceptionHeaders + } + }, + requestBody: body, + queryParameters: [ + timeoutInSeconds, + comp4, + restype2 + ], + urlParameters: [url], + headerParameters: [ + accept, + version, + requestId, + contentLength, + multipartContentType + ], + isXML: true, + contentType: "application/xml; charset=utf-8", + mediaType: "xml", + serializer: xmlSerializer$4 + }; + var filterBlobsOperationSpec = { + path: "/{containerName}", + httpMethod: "GET", + responses: { + 200: { + bodyMapper: FilterBlobSegment, + headersMapper: ContainerFilterBlobsHeaders + }, + default: { + bodyMapper: StorageError, + headersMapper: ContainerFilterBlobsExceptionHeaders + } + }, + queryParameters: [ + timeoutInSeconds, + marker, + maxPageSize, + comp5, + where, + restype2 + ], + urlParameters: [url], + headerParameters: [ + version, + requestId, + accept1 + ], + isXML: true, + serializer: xmlSerializer$4 + }; + var acquireLeaseOperationSpec$1 = { + path: "/{containerName}", + httpMethod: "PUT", + responses: { + 201: { + headersMapper: ContainerAcquireLeaseHeaders + }, + default: { + bodyMapper: StorageError, + headersMapper: ContainerAcquireLeaseExceptionHeaders + } + }, + queryParameters: [ + timeoutInSeconds, + restype2, + comp10 + ], + urlParameters: [url], + headerParameters: [ + version, + requestId, + accept1, + ifModifiedSince, + ifUnmodifiedSince, + action, + duration, + proposedLeaseId + ], + isXML: true, + serializer: xmlSerializer$4 + }; + var releaseLeaseOperationSpec$1 = { + path: "/{containerName}", + httpMethod: "PUT", + responses: { + 200: { + headersMapper: ContainerReleaseLeaseHeaders + }, + default: { + bodyMapper: StorageError, + headersMapper: ContainerReleaseLeaseExceptionHeaders + } + }, + queryParameters: [ + timeoutInSeconds, + restype2, + comp10 + ], + urlParameters: [url], + headerParameters: [ + version, + requestId, + accept1, + ifModifiedSince, + ifUnmodifiedSince, + action1, + leaseId1 + ], + isXML: true, + serializer: xmlSerializer$4 + }; + var renewLeaseOperationSpec$1 = { + path: "/{containerName}", + httpMethod: "PUT", + responses: { + 200: { + headersMapper: ContainerRenewLeaseHeaders + }, + default: { + bodyMapper: StorageError, + headersMapper: ContainerRenewLeaseExceptionHeaders + } + }, + queryParameters: [ + timeoutInSeconds, + restype2, + comp10 + ], + urlParameters: [url], + headerParameters: [ + version, + requestId, + accept1, + ifModifiedSince, + ifUnmodifiedSince, + leaseId1, + action2 + ], + isXML: true, + serializer: xmlSerializer$4 + }; + var breakLeaseOperationSpec$1 = { + path: "/{containerName}", + httpMethod: "PUT", + responses: { + 202: { + headersMapper: ContainerBreakLeaseHeaders + }, + default: { + bodyMapper: StorageError, + headersMapper: ContainerBreakLeaseExceptionHeaders + } + }, + queryParameters: [ + timeoutInSeconds, + restype2, + comp10 + ], + urlParameters: [url], + headerParameters: [ + version, + requestId, + accept1, + ifModifiedSince, + ifUnmodifiedSince, + action3, + breakPeriod + ], + isXML: true, + serializer: xmlSerializer$4 + }; + var changeLeaseOperationSpec$1 = { + path: "/{containerName}", + httpMethod: "PUT", + responses: { + 200: { + headersMapper: ContainerChangeLeaseHeaders + }, + default: { + bodyMapper: StorageError, + headersMapper: ContainerChangeLeaseExceptionHeaders + } + }, + queryParameters: [ + timeoutInSeconds, + restype2, + comp10 + ], + urlParameters: [url], + headerParameters: [ + version, + requestId, + accept1, + ifModifiedSince, + ifUnmodifiedSince, + leaseId1, + action4, + proposedLeaseId1 + ], + isXML: true, + serializer: xmlSerializer$4 + }; + var listBlobFlatSegmentOperationSpec = { + path: "/{containerName}", + httpMethod: "GET", + responses: { + 200: { + bodyMapper: ListBlobsFlatSegmentResponse, + headersMapper: ContainerListBlobFlatSegmentHeaders + }, + default: { + bodyMapper: StorageError, + headersMapper: ContainerListBlobFlatSegmentExceptionHeaders + } + }, + queryParameters: [ + timeoutInSeconds, + comp2, + prefix, + marker, + maxPageSize, + restype2, + include1 + ], + urlParameters: [url], + headerParameters: [ + version, + requestId, + accept1 + ], + isXML: true, + serializer: xmlSerializer$4 + }; + var listBlobHierarchySegmentOperationSpec = { + path: "/{containerName}", + httpMethod: "GET", + responses: { + 200: { + bodyMapper: ListBlobsHierarchySegmentResponse, + headersMapper: ContainerListBlobHierarchySegmentHeaders + }, + default: { + bodyMapper: StorageError, + headersMapper: ContainerListBlobHierarchySegmentExceptionHeaders + } + }, + queryParameters: [ + timeoutInSeconds, + comp2, + prefix, + marker, + maxPageSize, + restype2, + include1, + delimiter + ], + urlParameters: [url], + headerParameters: [ + version, + requestId, + accept1 + ], + isXML: true, + serializer: xmlSerializer$4 + }; + var getAccountInfoOperationSpec$1 = { + path: "/{containerName}", + httpMethod: "GET", + responses: { + 200: { + headersMapper: ContainerGetAccountInfoHeaders + }, + default: { + bodyMapper: StorageError, + headersMapper: ContainerGetAccountInfoExceptionHeaders + } + }, + queryParameters: [ + comp, + timeoutInSeconds, + restype1 + ], + urlParameters: [url], + headerParameters: [ + version, + requestId, + accept1 + ], + isXML: true, + serializer: xmlSerializer$4 + }; + + class BlobImpl { + constructor(client) { + this.client = client; + } + download(options) { + return this.client.sendOperationRequest({ options }, downloadOperationSpec); + } + getProperties(options) { + return this.client.sendOperationRequest({ options }, getPropertiesOperationSpec); + } + delete(options) { + return this.client.sendOperationRequest({ options }, deleteOperationSpec); + } + undelete(options) { + return this.client.sendOperationRequest({ options }, undeleteOperationSpec); + } + setExpiry(expiryOptions2, options) { + return this.client.sendOperationRequest({ expiryOptions: expiryOptions2, options }, setExpiryOperationSpec); + } + setHttpHeaders(options) { + return this.client.sendOperationRequest({ options }, setHttpHeadersOperationSpec); + } + setImmutabilityPolicy(options) { + return this.client.sendOperationRequest({ options }, setImmutabilityPolicyOperationSpec); + } + deleteImmutabilityPolicy(options) { + return this.client.sendOperationRequest({ options }, deleteImmutabilityPolicyOperationSpec); + } + setLegalHold(legalHold2, options) { + return this.client.sendOperationRequest({ legalHold: legalHold2, options }, setLegalHoldOperationSpec); + } + setMetadata(options) { + return this.client.sendOperationRequest({ options }, setMetadataOperationSpec); + } + acquireLease(options) { + return this.client.sendOperationRequest({ options }, acquireLeaseOperationSpec); + } + releaseLease(leaseId2, options) { + return this.client.sendOperationRequest({ leaseId: leaseId2, options }, releaseLeaseOperationSpec); + } + renewLease(leaseId2, options) { + return this.client.sendOperationRequest({ leaseId: leaseId2, options }, renewLeaseOperationSpec); + } + changeLease(leaseId2, proposedLeaseId2, options) { + return this.client.sendOperationRequest({ leaseId: leaseId2, proposedLeaseId: proposedLeaseId2, options }, changeLeaseOperationSpec); + } + breakLease(options) { + return this.client.sendOperationRequest({ options }, breakLeaseOperationSpec); + } + createSnapshot(options) { + return this.client.sendOperationRequest({ options }, createSnapshotOperationSpec); + } + startCopyFromURL(copySource2, options) { + return this.client.sendOperationRequest({ copySource: copySource2, options }, startCopyFromURLOperationSpec); + } + copyFromURL(copySource2, options) { + return this.client.sendOperationRequest({ copySource: copySource2, options }, copyFromURLOperationSpec); + } + abortCopyFromURL(copyId2, options) { + return this.client.sendOperationRequest({ copyId: copyId2, options }, abortCopyFromURLOperationSpec); + } + setTier(tier2, options) { + return this.client.sendOperationRequest({ tier: tier2, options }, setTierOperationSpec); + } + getAccountInfo(options) { + return this.client.sendOperationRequest({ options }, getAccountInfoOperationSpec); + } + query(options) { + return this.client.sendOperationRequest({ options }, queryOperationSpec); + } + getTags(options) { + return this.client.sendOperationRequest({ options }, getTagsOperationSpec); + } + setTags(options) { + return this.client.sendOperationRequest({ options }, setTagsOperationSpec); + } + } + var xmlSerializer$3 = coreClient__namespace.createSerializer(Mappers, true); + var downloadOperationSpec = { + path: "/{containerName}/{blob}", + httpMethod: "GET", + responses: { + 200: { + bodyMapper: { + type: { name: "Stream" }, + serializedName: "parsedResponse" + }, + headersMapper: BlobDownloadHeaders + }, + 206: { + bodyMapper: { + type: { name: "Stream" }, + serializedName: "parsedResponse" + }, + headersMapper: BlobDownloadHeaders + }, + default: { + bodyMapper: StorageError, + headersMapper: BlobDownloadExceptionHeaders + } + }, + queryParameters: [ + timeoutInSeconds, + snapshot, + versionId + ], + urlParameters: [url], + headerParameters: [ + version, + requestId, + accept1, + leaseId, + ifModifiedSince, + ifUnmodifiedSince, + range, + rangeGetContentMD5, + rangeGetContentCRC64, + encryptionKey, + encryptionKeySha256, + encryptionAlgorithm, + ifMatch, + ifNoneMatch, + ifTags + ], + isXML: true, + serializer: xmlSerializer$3 + }; + var getPropertiesOperationSpec = { + path: "/{containerName}/{blob}", + httpMethod: "HEAD", + responses: { + 200: { + headersMapper: BlobGetPropertiesHeaders + }, + default: { + bodyMapper: StorageError, + headersMapper: BlobGetPropertiesExceptionHeaders + } + }, + queryParameters: [ + timeoutInSeconds, + snapshot, + versionId + ], + urlParameters: [url], + headerParameters: [ + version, + requestId, + accept1, + leaseId, + ifModifiedSince, + ifUnmodifiedSince, + encryptionKey, + encryptionKeySha256, + encryptionAlgorithm, + ifMatch, + ifNoneMatch, + ifTags + ], + isXML: true, + serializer: xmlSerializer$3 + }; + var deleteOperationSpec = { + path: "/{containerName}/{blob}", + httpMethod: "DELETE", + responses: { + 202: { + headersMapper: BlobDeleteHeaders + }, + default: { + bodyMapper: StorageError, + headersMapper: BlobDeleteExceptionHeaders + } + }, + queryParameters: [ + timeoutInSeconds, + snapshot, + versionId, + blobDeleteType + ], + urlParameters: [url], + headerParameters: [ + version, + requestId, + accept1, + leaseId, + ifModifiedSince, + ifUnmodifiedSince, + ifMatch, + ifNoneMatch, + ifTags, + deleteSnapshots + ], + isXML: true, + serializer: xmlSerializer$3 + }; + var undeleteOperationSpec = { + path: "/{containerName}/{blob}", + httpMethod: "PUT", + responses: { + 200: { + headersMapper: BlobUndeleteHeaders + }, + default: { + bodyMapper: StorageError, + headersMapper: BlobUndeleteExceptionHeaders + } + }, + queryParameters: [timeoutInSeconds, comp8], + urlParameters: [url], + headerParameters: [ + version, + requestId, + accept1 + ], + isXML: true, + serializer: xmlSerializer$3 + }; + var setExpiryOperationSpec = { + path: "/{containerName}/{blob}", + httpMethod: "PUT", + responses: { + 200: { + headersMapper: BlobSetExpiryHeaders + }, + default: { + bodyMapper: StorageError, + headersMapper: BlobSetExpiryExceptionHeaders + } + }, + queryParameters: [timeoutInSeconds, comp11], + urlParameters: [url], + headerParameters: [ + version, + requestId, + accept1, + expiryOptions, + expiresOn + ], + isXML: true, + serializer: xmlSerializer$3 + }; + var setHttpHeadersOperationSpec = { + path: "/{containerName}/{blob}", + httpMethod: "PUT", + responses: { + 200: { + headersMapper: BlobSetHttpHeadersHeaders + }, + default: { + bodyMapper: StorageError, + headersMapper: BlobSetHttpHeadersExceptionHeaders + } + }, + queryParameters: [comp, timeoutInSeconds], + urlParameters: [url], + headerParameters: [ + version, + requestId, + accept1, + leaseId, + ifModifiedSince, + ifUnmodifiedSince, + ifMatch, + ifNoneMatch, + ifTags, + blobCacheControl, + blobContentType, + blobContentMD5, + blobContentEncoding, + blobContentLanguage, + blobContentDisposition + ], + isXML: true, + serializer: xmlSerializer$3 + }; + var setImmutabilityPolicyOperationSpec = { + path: "/{containerName}/{blob}", + httpMethod: "PUT", + responses: { + 200: { + headersMapper: BlobSetImmutabilityPolicyHeaders + }, + default: { + bodyMapper: StorageError, + headersMapper: BlobSetImmutabilityPolicyExceptionHeaders + } + }, + queryParameters: [timeoutInSeconds, comp12], + urlParameters: [url], + headerParameters: [ + version, + requestId, + accept1, + ifUnmodifiedSince, + immutabilityPolicyExpiry, + immutabilityPolicyMode + ], + isXML: true, + serializer: xmlSerializer$3 + }; + var deleteImmutabilityPolicyOperationSpec = { + path: "/{containerName}/{blob}", + httpMethod: "DELETE", + responses: { + 200: { + headersMapper: BlobDeleteImmutabilityPolicyHeaders + }, + default: { + bodyMapper: StorageError, + headersMapper: BlobDeleteImmutabilityPolicyExceptionHeaders + } + }, + queryParameters: [timeoutInSeconds, comp12], + urlParameters: [url], + headerParameters: [ + version, + requestId, + accept1 + ], + isXML: true, + serializer: xmlSerializer$3 + }; + var setLegalHoldOperationSpec = { + path: "/{containerName}/{blob}", + httpMethod: "PUT", + responses: { + 200: { + headersMapper: BlobSetLegalHoldHeaders + }, + default: { + bodyMapper: StorageError, + headersMapper: BlobSetLegalHoldExceptionHeaders + } + }, + queryParameters: [timeoutInSeconds, comp13], + urlParameters: [url], + headerParameters: [ + version, + requestId, + accept1, + legalHold + ], + isXML: true, + serializer: xmlSerializer$3 + }; + var setMetadataOperationSpec = { + path: "/{containerName}/{blob}", + httpMethod: "PUT", + responses: { + 200: { + headersMapper: BlobSetMetadataHeaders + }, + default: { + bodyMapper: StorageError, + headersMapper: BlobSetMetadataExceptionHeaders + } + }, + queryParameters: [timeoutInSeconds, comp6], + urlParameters: [url], + headerParameters: [ + version, + requestId, + accept1, + metadata, + leaseId, + ifModifiedSince, + ifUnmodifiedSince, + encryptionKey, + encryptionKeySha256, + encryptionAlgorithm, + ifMatch, + ifNoneMatch, + ifTags, + encryptionScope + ], + isXML: true, + serializer: xmlSerializer$3 + }; + var acquireLeaseOperationSpec = { + path: "/{containerName}/{blob}", + httpMethod: "PUT", + responses: { + 201: { + headersMapper: BlobAcquireLeaseHeaders + }, + default: { + bodyMapper: StorageError, + headersMapper: BlobAcquireLeaseExceptionHeaders + } + }, + queryParameters: [timeoutInSeconds, comp10], + urlParameters: [url], + headerParameters: [ + version, + requestId, + accept1, + ifModifiedSince, + ifUnmodifiedSince, + action, + duration, + proposedLeaseId, + ifMatch, + ifNoneMatch, + ifTags + ], + isXML: true, + serializer: xmlSerializer$3 + }; + var releaseLeaseOperationSpec = { + path: "/{containerName}/{blob}", + httpMethod: "PUT", + responses: { + 200: { + headersMapper: BlobReleaseLeaseHeaders + }, + default: { + bodyMapper: StorageError, + headersMapper: BlobReleaseLeaseExceptionHeaders + } + }, + queryParameters: [timeoutInSeconds, comp10], + urlParameters: [url], + headerParameters: [ + version, + requestId, + accept1, + ifModifiedSince, + ifUnmodifiedSince, + action1, + leaseId1, + ifMatch, + ifNoneMatch, + ifTags + ], + isXML: true, + serializer: xmlSerializer$3 + }; + var renewLeaseOperationSpec = { + path: "/{containerName}/{blob}", + httpMethod: "PUT", + responses: { + 200: { + headersMapper: BlobRenewLeaseHeaders + }, + default: { + bodyMapper: StorageError, + headersMapper: BlobRenewLeaseExceptionHeaders + } + }, + queryParameters: [timeoutInSeconds, comp10], + urlParameters: [url], + headerParameters: [ + version, + requestId, + accept1, + ifModifiedSince, + ifUnmodifiedSince, + leaseId1, + action2, + ifMatch, + ifNoneMatch, + ifTags + ], + isXML: true, + serializer: xmlSerializer$3 + }; + var changeLeaseOperationSpec = { + path: "/{containerName}/{blob}", + httpMethod: "PUT", + responses: { + 200: { + headersMapper: BlobChangeLeaseHeaders + }, + default: { + bodyMapper: StorageError, + headersMapper: BlobChangeLeaseExceptionHeaders + } + }, + queryParameters: [timeoutInSeconds, comp10], + urlParameters: [url], + headerParameters: [ + version, + requestId, + accept1, + ifModifiedSince, + ifUnmodifiedSince, + leaseId1, + action4, + proposedLeaseId1, + ifMatch, + ifNoneMatch, + ifTags + ], + isXML: true, + serializer: xmlSerializer$3 + }; + var breakLeaseOperationSpec = { + path: "/{containerName}/{blob}", + httpMethod: "PUT", + responses: { + 202: { + headersMapper: BlobBreakLeaseHeaders + }, + default: { + bodyMapper: StorageError, + headersMapper: BlobBreakLeaseExceptionHeaders + } + }, + queryParameters: [timeoutInSeconds, comp10], + urlParameters: [url], + headerParameters: [ + version, + requestId, + accept1, + ifModifiedSince, + ifUnmodifiedSince, + action3, + breakPeriod, + ifMatch, + ifNoneMatch, + ifTags + ], + isXML: true, + serializer: xmlSerializer$3 + }; + var createSnapshotOperationSpec = { + path: "/{containerName}/{blob}", + httpMethod: "PUT", + responses: { + 201: { + headersMapper: BlobCreateSnapshotHeaders + }, + default: { + bodyMapper: StorageError, + headersMapper: BlobCreateSnapshotExceptionHeaders + } + }, + queryParameters: [timeoutInSeconds, comp14], + urlParameters: [url], + headerParameters: [ + version, + requestId, + accept1, + metadata, + leaseId, + ifModifiedSince, + ifUnmodifiedSince, + encryptionKey, + encryptionKeySha256, + encryptionAlgorithm, + ifMatch, + ifNoneMatch, + ifTags, + encryptionScope + ], + isXML: true, + serializer: xmlSerializer$3 + }; + var startCopyFromURLOperationSpec = { + path: "/{containerName}/{blob}", + httpMethod: "PUT", + responses: { + 202: { + headersMapper: BlobStartCopyFromURLHeaders + }, + default: { + bodyMapper: StorageError, + headersMapper: BlobStartCopyFromURLExceptionHeaders + } + }, + queryParameters: [timeoutInSeconds], + urlParameters: [url], + headerParameters: [ + version, + requestId, + accept1, + metadata, + leaseId, + ifModifiedSince, + ifUnmodifiedSince, + ifMatch, + ifNoneMatch, + ifTags, + immutabilityPolicyExpiry, + immutabilityPolicyMode, + tier, + rehydratePriority, + sourceIfModifiedSince, + sourceIfUnmodifiedSince, + sourceIfMatch, + sourceIfNoneMatch, + sourceIfTags, + copySource, + blobTagsString, + sealBlob, + legalHold1 + ], + isXML: true, + serializer: xmlSerializer$3 + }; + var copyFromURLOperationSpec = { + path: "/{containerName}/{blob}", + httpMethod: "PUT", + responses: { + 202: { + headersMapper: BlobCopyFromURLHeaders + }, + default: { + bodyMapper: StorageError, + headersMapper: BlobCopyFromURLExceptionHeaders + } + }, + queryParameters: [timeoutInSeconds], + urlParameters: [url], + headerParameters: [ + version, + requestId, + accept1, + metadata, + leaseId, + ifModifiedSince, + ifUnmodifiedSince, + ifMatch, + ifNoneMatch, + ifTags, + immutabilityPolicyExpiry, + immutabilityPolicyMode, + encryptionScope, + tier, + sourceIfModifiedSince, + sourceIfUnmodifiedSince, + sourceIfMatch, + sourceIfNoneMatch, + copySource, + blobTagsString, + legalHold1, + xMsRequiresSync, + sourceContentMD5, + copySourceAuthorization, + copySourceTags + ], + isXML: true, + serializer: xmlSerializer$3 + }; + var abortCopyFromURLOperationSpec = { + path: "/{containerName}/{blob}", + httpMethod: "PUT", + responses: { + 204: { + headersMapper: BlobAbortCopyFromURLHeaders + }, + default: { + bodyMapper: StorageError, + headersMapper: BlobAbortCopyFromURLExceptionHeaders + } + }, + queryParameters: [ + timeoutInSeconds, + comp15, + copyId + ], + urlParameters: [url], + headerParameters: [ + version, + requestId, + accept1, + leaseId, + copyActionAbortConstant + ], + isXML: true, + serializer: xmlSerializer$3 + }; + var setTierOperationSpec = { + path: "/{containerName}/{blob}", + httpMethod: "PUT", + responses: { + 200: { + headersMapper: BlobSetTierHeaders + }, + 202: { + headersMapper: BlobSetTierHeaders + }, + default: { + bodyMapper: StorageError, + headersMapper: BlobSetTierExceptionHeaders + } + }, + queryParameters: [ + timeoutInSeconds, + snapshot, + versionId, + comp16 + ], + urlParameters: [url], + headerParameters: [ + version, + requestId, + accept1, + leaseId, + ifTags, + rehydratePriority, + tier1 + ], + isXML: true, + serializer: xmlSerializer$3 + }; + var getAccountInfoOperationSpec = { + path: "/{containerName}/{blob}", + httpMethod: "GET", + responses: { + 200: { + headersMapper: BlobGetAccountInfoHeaders + }, + default: { + bodyMapper: StorageError, + headersMapper: BlobGetAccountInfoExceptionHeaders + } + }, + queryParameters: [ + comp, + timeoutInSeconds, + restype1 + ], + urlParameters: [url], + headerParameters: [ + version, + requestId, + accept1 + ], + isXML: true, + serializer: xmlSerializer$3 + }; + var queryOperationSpec = { + path: "/{containerName}/{blob}", + httpMethod: "POST", + responses: { + 200: { + bodyMapper: { + type: { name: "Stream" }, + serializedName: "parsedResponse" + }, + headersMapper: BlobQueryHeaders + }, + 206: { + bodyMapper: { + type: { name: "Stream" }, + serializedName: "parsedResponse" + }, + headersMapper: BlobQueryHeaders + }, + default: { + bodyMapper: StorageError, + headersMapper: BlobQueryExceptionHeaders + } + }, + requestBody: queryRequest, + queryParameters: [ + timeoutInSeconds, + snapshot, + comp17 + ], + urlParameters: [url], + headerParameters: [ + contentType, + accept, + version, + requestId, + leaseId, + ifModifiedSince, + ifUnmodifiedSince, + encryptionKey, + encryptionKeySha256, + encryptionAlgorithm, + ifMatch, + ifNoneMatch, + ifTags + ], + isXML: true, + contentType: "application/xml; charset=utf-8", + mediaType: "xml", + serializer: xmlSerializer$3 + }; + var getTagsOperationSpec = { + path: "/{containerName}/{blob}", + httpMethod: "GET", + responses: { + 200: { + bodyMapper: BlobTags, + headersMapper: BlobGetTagsHeaders + }, + default: { + bodyMapper: StorageError, + headersMapper: BlobGetTagsExceptionHeaders + } + }, + queryParameters: [ + timeoutInSeconds, + snapshot, + versionId, + comp18 + ], + urlParameters: [url], + headerParameters: [ + version, + requestId, + accept1, + leaseId, + ifTags + ], + isXML: true, + serializer: xmlSerializer$3 + }; + var setTagsOperationSpec = { + path: "/{containerName}/{blob}", + httpMethod: "PUT", + responses: { + 204: { + headersMapper: BlobSetTagsHeaders + }, + default: { + bodyMapper: StorageError, + headersMapper: BlobSetTagsExceptionHeaders + } + }, + requestBody: tags, + queryParameters: [ + timeoutInSeconds, + versionId, + comp18 + ], + urlParameters: [url], + headerParameters: [ + contentType, + accept, + version, + requestId, + leaseId, + ifTags, + transactionalContentMD5, + transactionalContentCrc64 + ], + isXML: true, + contentType: "application/xml; charset=utf-8", + mediaType: "xml", + serializer: xmlSerializer$3 + }; + + class PageBlobImpl { + constructor(client) { + this.client = client; + } + create(contentLength2, blobContentLength2, options) { + return this.client.sendOperationRequest({ contentLength: contentLength2, blobContentLength: blobContentLength2, options }, createOperationSpec$1); + } + uploadPages(contentLength2, body2, options) { + return this.client.sendOperationRequest({ contentLength: contentLength2, body: body2, options }, uploadPagesOperationSpec); + } + clearPages(contentLength2, options) { + return this.client.sendOperationRequest({ contentLength: contentLength2, options }, clearPagesOperationSpec); + } + uploadPagesFromURL(sourceUrl2, sourceRange2, contentLength2, range2, options) { + return this.client.sendOperationRequest({ sourceUrl: sourceUrl2, sourceRange: sourceRange2, contentLength: contentLength2, range: range2, options }, uploadPagesFromURLOperationSpec); + } + getPageRanges(options) { + return this.client.sendOperationRequest({ options }, getPageRangesOperationSpec); + } + getPageRangesDiff(options) { + return this.client.sendOperationRequest({ options }, getPageRangesDiffOperationSpec); + } + resize(blobContentLength2, options) { + return this.client.sendOperationRequest({ blobContentLength: blobContentLength2, options }, resizeOperationSpec); + } + updateSequenceNumber(sequenceNumberAction2, options) { + return this.client.sendOperationRequest({ sequenceNumberAction: sequenceNumberAction2, options }, updateSequenceNumberOperationSpec); + } + copyIncremental(copySource2, options) { + return this.client.sendOperationRequest({ copySource: copySource2, options }, copyIncrementalOperationSpec); + } + } + var xmlSerializer$2 = coreClient__namespace.createSerializer(Mappers, true); + var createOperationSpec$1 = { + path: "/{containerName}/{blob}", + httpMethod: "PUT", + responses: { + 201: { + headersMapper: PageBlobCreateHeaders + }, + default: { + bodyMapper: StorageError, + headersMapper: PageBlobCreateExceptionHeaders + } + }, + queryParameters: [timeoutInSeconds], + urlParameters: [url], + headerParameters: [ + version, + requestId, + accept1, + contentLength, + metadata, + leaseId, + ifModifiedSince, + ifUnmodifiedSince, + encryptionKey, + encryptionKeySha256, + encryptionAlgorithm, + ifMatch, + ifNoneMatch, + ifTags, + blobCacheControl, + blobContentType, + blobContentMD5, + blobContentEncoding, + blobContentLanguage, + blobContentDisposition, + immutabilityPolicyExpiry, + immutabilityPolicyMode, + encryptionScope, + tier, + blobTagsString, + legalHold1, + blobType, + blobContentLength, + blobSequenceNumber + ], + isXML: true, + serializer: xmlSerializer$2 + }; + var uploadPagesOperationSpec = { + path: "/{containerName}/{blob}", + httpMethod: "PUT", + responses: { + 201: { + headersMapper: PageBlobUploadPagesHeaders + }, + default: { + bodyMapper: StorageError, + headersMapper: PageBlobUploadPagesExceptionHeaders + } + }, + requestBody: body1, + queryParameters: [timeoutInSeconds, comp19], + urlParameters: [url], + headerParameters: [ + version, + requestId, + contentLength, + leaseId, + ifModifiedSince, + ifUnmodifiedSince, + range, + encryptionKey, + encryptionKeySha256, + encryptionAlgorithm, + ifMatch, + ifNoneMatch, + ifTags, + encryptionScope, + transactionalContentMD5, + transactionalContentCrc64, + contentType1, + accept2, + pageWrite, + ifSequenceNumberLessThanOrEqualTo, + ifSequenceNumberLessThan, + ifSequenceNumberEqualTo + ], + isXML: true, + contentType: "application/xml; charset=utf-8", + mediaType: "binary", + serializer: xmlSerializer$2 + }; + var clearPagesOperationSpec = { + path: "/{containerName}/{blob}", + httpMethod: "PUT", + responses: { + 201: { + headersMapper: PageBlobClearPagesHeaders + }, + default: { + bodyMapper: StorageError, + headersMapper: PageBlobClearPagesExceptionHeaders + } + }, + queryParameters: [timeoutInSeconds, comp19], + urlParameters: [url], + headerParameters: [ + version, + requestId, + accept1, + contentLength, + leaseId, + ifModifiedSince, + ifUnmodifiedSince, + range, + encryptionKey, + encryptionKeySha256, + encryptionAlgorithm, + ifMatch, + ifNoneMatch, + ifTags, + encryptionScope, + ifSequenceNumberLessThanOrEqualTo, + ifSequenceNumberLessThan, + ifSequenceNumberEqualTo, + pageWrite1 + ], + isXML: true, + serializer: xmlSerializer$2 + }; + var uploadPagesFromURLOperationSpec = { + path: "/{containerName}/{blob}", + httpMethod: "PUT", + responses: { + 201: { + headersMapper: PageBlobUploadPagesFromURLHeaders + }, + default: { + bodyMapper: StorageError, + headersMapper: PageBlobUploadPagesFromURLExceptionHeaders + } + }, + queryParameters: [timeoutInSeconds, comp19], + urlParameters: [url], + headerParameters: [ + version, + requestId, + accept1, + contentLength, + leaseId, + ifModifiedSince, + ifUnmodifiedSince, + encryptionKey, + encryptionKeySha256, + encryptionAlgorithm, + ifMatch, + ifNoneMatch, + ifTags, + encryptionScope, + sourceIfModifiedSince, + sourceIfUnmodifiedSince, + sourceIfMatch, + sourceIfNoneMatch, + sourceContentMD5, + copySourceAuthorization, + pageWrite, + ifSequenceNumberLessThanOrEqualTo, + ifSequenceNumberLessThan, + ifSequenceNumberEqualTo, + sourceUrl, + sourceRange, + sourceContentCrc64, + range1 + ], + isXML: true, + serializer: xmlSerializer$2 + }; + var getPageRangesOperationSpec = { + path: "/{containerName}/{blob}", + httpMethod: "GET", + responses: { + 200: { + bodyMapper: PageList, + headersMapper: PageBlobGetPageRangesHeaders + }, + default: { + bodyMapper: StorageError, + headersMapper: PageBlobGetPageRangesExceptionHeaders + } + }, + queryParameters: [ + timeoutInSeconds, + marker, + maxPageSize, + snapshot, + comp20 + ], + urlParameters: [url], + headerParameters: [ + version, + requestId, + accept1, + leaseId, + ifModifiedSince, + ifUnmodifiedSince, + range, + ifMatch, + ifNoneMatch, + ifTags + ], + isXML: true, + serializer: xmlSerializer$2 + }; + var getPageRangesDiffOperationSpec = { + path: "/{containerName}/{blob}", + httpMethod: "GET", + responses: { + 200: { + bodyMapper: PageList, + headersMapper: PageBlobGetPageRangesDiffHeaders + }, + default: { + bodyMapper: StorageError, + headersMapper: PageBlobGetPageRangesDiffExceptionHeaders + } + }, + queryParameters: [ + timeoutInSeconds, + marker, + maxPageSize, + snapshot, + comp20, + prevsnapshot + ], + urlParameters: [url], + headerParameters: [ + version, + requestId, + accept1, + leaseId, + ifModifiedSince, + ifUnmodifiedSince, + range, + ifMatch, + ifNoneMatch, + ifTags, + prevSnapshotUrl + ], + isXML: true, + serializer: xmlSerializer$2 + }; + var resizeOperationSpec = { + path: "/{containerName}/{blob}", + httpMethod: "PUT", + responses: { + 200: { + headersMapper: PageBlobResizeHeaders + }, + default: { + bodyMapper: StorageError, + headersMapper: PageBlobResizeExceptionHeaders + } + }, + queryParameters: [comp, timeoutInSeconds], + urlParameters: [url], + headerParameters: [ + version, + requestId, + accept1, + leaseId, + ifModifiedSince, + ifUnmodifiedSince, + encryptionKey, + encryptionKeySha256, + encryptionAlgorithm, + ifMatch, + ifNoneMatch, + ifTags, + encryptionScope, + blobContentLength + ], + isXML: true, + serializer: xmlSerializer$2 + }; + var updateSequenceNumberOperationSpec = { + path: "/{containerName}/{blob}", + httpMethod: "PUT", + responses: { + 200: { + headersMapper: PageBlobUpdateSequenceNumberHeaders + }, + default: { + bodyMapper: StorageError, + headersMapper: PageBlobUpdateSequenceNumberExceptionHeaders + } + }, + queryParameters: [comp, timeoutInSeconds], + urlParameters: [url], + headerParameters: [ + version, + requestId, + accept1, + leaseId, + ifModifiedSince, + ifUnmodifiedSince, + ifMatch, + ifNoneMatch, + ifTags, + blobSequenceNumber, + sequenceNumberAction + ], + isXML: true, + serializer: xmlSerializer$2 + }; + var copyIncrementalOperationSpec = { + path: "/{containerName}/{blob}", + httpMethod: "PUT", + responses: { + 202: { + headersMapper: PageBlobCopyIncrementalHeaders + }, + default: { + bodyMapper: StorageError, + headersMapper: PageBlobCopyIncrementalExceptionHeaders + } + }, + queryParameters: [timeoutInSeconds, comp21], + urlParameters: [url], + headerParameters: [ + version, + requestId, + accept1, + ifModifiedSince, + ifUnmodifiedSince, + ifMatch, + ifNoneMatch, + ifTags, + copySource + ], + isXML: true, + serializer: xmlSerializer$2 + }; + + class AppendBlobImpl { + constructor(client) { + this.client = client; + } + create(contentLength2, options) { + return this.client.sendOperationRequest({ contentLength: contentLength2, options }, createOperationSpec); + } + appendBlock(contentLength2, body2, options) { + return this.client.sendOperationRequest({ contentLength: contentLength2, body: body2, options }, appendBlockOperationSpec); + } + appendBlockFromUrl(sourceUrl2, contentLength2, options) { + return this.client.sendOperationRequest({ sourceUrl: sourceUrl2, contentLength: contentLength2, options }, appendBlockFromUrlOperationSpec); + } + seal(options) { + return this.client.sendOperationRequest({ options }, sealOperationSpec); + } + } + var xmlSerializer$1 = coreClient__namespace.createSerializer(Mappers, true); + var createOperationSpec = { + path: "/{containerName}/{blob}", + httpMethod: "PUT", + responses: { + 201: { + headersMapper: AppendBlobCreateHeaders + }, + default: { + bodyMapper: StorageError, + headersMapper: AppendBlobCreateExceptionHeaders + } + }, + queryParameters: [timeoutInSeconds], + urlParameters: [url], + headerParameters: [ + version, + requestId, + accept1, + contentLength, + metadata, + leaseId, + ifModifiedSince, + ifUnmodifiedSince, + encryptionKey, + encryptionKeySha256, + encryptionAlgorithm, + ifMatch, + ifNoneMatch, + ifTags, + blobCacheControl, + blobContentType, + blobContentMD5, + blobContentEncoding, + blobContentLanguage, + blobContentDisposition, + immutabilityPolicyExpiry, + immutabilityPolicyMode, + encryptionScope, + blobTagsString, + legalHold1, + blobType1 + ], + isXML: true, + serializer: xmlSerializer$1 + }; + var appendBlockOperationSpec = { + path: "/{containerName}/{blob}", + httpMethod: "PUT", + responses: { + 201: { + headersMapper: AppendBlobAppendBlockHeaders + }, + default: { + bodyMapper: StorageError, + headersMapper: AppendBlobAppendBlockExceptionHeaders + } + }, + requestBody: body1, + queryParameters: [timeoutInSeconds, comp22], + urlParameters: [url], + headerParameters: [ + version, + requestId, + contentLength, + leaseId, + ifModifiedSince, + ifUnmodifiedSince, + encryptionKey, + encryptionKeySha256, + encryptionAlgorithm, + ifMatch, + ifNoneMatch, + ifTags, + encryptionScope, + transactionalContentMD5, + transactionalContentCrc64, + contentType1, + accept2, + maxSize, + appendPosition + ], + isXML: true, + contentType: "application/xml; charset=utf-8", + mediaType: "binary", + serializer: xmlSerializer$1 + }; + var appendBlockFromUrlOperationSpec = { + path: "/{containerName}/{blob}", + httpMethod: "PUT", + responses: { + 201: { + headersMapper: AppendBlobAppendBlockFromUrlHeaders + }, + default: { + bodyMapper: StorageError, + headersMapper: AppendBlobAppendBlockFromUrlExceptionHeaders + } + }, + queryParameters: [timeoutInSeconds, comp22], + urlParameters: [url], + headerParameters: [ + version, + requestId, + accept1, + contentLength, + leaseId, + ifModifiedSince, + ifUnmodifiedSince, + encryptionKey, + encryptionKeySha256, + encryptionAlgorithm, + ifMatch, + ifNoneMatch, + ifTags, + encryptionScope, + sourceIfModifiedSince, + sourceIfUnmodifiedSince, + sourceIfMatch, + sourceIfNoneMatch, + sourceContentMD5, + copySourceAuthorization, + transactionalContentMD5, + sourceUrl, + sourceContentCrc64, + maxSize, + appendPosition, + sourceRange1 + ], + isXML: true, + serializer: xmlSerializer$1 + }; + var sealOperationSpec = { + path: "/{containerName}/{blob}", + httpMethod: "PUT", + responses: { + 200: { + headersMapper: AppendBlobSealHeaders + }, + default: { + bodyMapper: StorageError, + headersMapper: AppendBlobSealExceptionHeaders + } + }, + queryParameters: [timeoutInSeconds, comp23], + urlParameters: [url], + headerParameters: [ + version, + requestId, + accept1, + leaseId, + ifModifiedSince, + ifUnmodifiedSince, + ifMatch, + ifNoneMatch, + appendPosition + ], + isXML: true, + serializer: xmlSerializer$1 + }; + + class BlockBlobImpl { + constructor(client) { + this.client = client; + } + upload(contentLength2, body2, options) { + return this.client.sendOperationRequest({ contentLength: contentLength2, body: body2, options }, uploadOperationSpec); + } + putBlobFromUrl(contentLength2, copySource2, options) { + return this.client.sendOperationRequest({ contentLength: contentLength2, copySource: copySource2, options }, putBlobFromUrlOperationSpec); + } + stageBlock(blockId2, contentLength2, body2, options) { + return this.client.sendOperationRequest({ blockId: blockId2, contentLength: contentLength2, body: body2, options }, stageBlockOperationSpec); + } + stageBlockFromURL(blockId2, contentLength2, sourceUrl2, options) { + return this.client.sendOperationRequest({ blockId: blockId2, contentLength: contentLength2, sourceUrl: sourceUrl2, options }, stageBlockFromURLOperationSpec); + } + commitBlockList(blocks2, options) { + return this.client.sendOperationRequest({ blocks: blocks2, options }, commitBlockListOperationSpec); + } + getBlockList(listType2, options) { + return this.client.sendOperationRequest({ listType: listType2, options }, getBlockListOperationSpec); + } + } + var xmlSerializer = coreClient__namespace.createSerializer(Mappers, true); + var uploadOperationSpec = { + path: "/{containerName}/{blob}", + httpMethod: "PUT", + responses: { + 201: { + headersMapper: BlockBlobUploadHeaders + }, + default: { + bodyMapper: StorageError, + headersMapper: BlockBlobUploadExceptionHeaders + } + }, + requestBody: body1, + queryParameters: [timeoutInSeconds], + urlParameters: [url], + headerParameters: [ + version, + requestId, + contentLength, + metadata, + leaseId, + ifModifiedSince, + ifUnmodifiedSince, + encryptionKey, + encryptionKeySha256, + encryptionAlgorithm, + ifMatch, + ifNoneMatch, + ifTags, + blobCacheControl, + blobContentType, + blobContentMD5, + blobContentEncoding, + blobContentLanguage, + blobContentDisposition, + immutabilityPolicyExpiry, + immutabilityPolicyMode, + encryptionScope, + tier, + blobTagsString, + legalHold1, + transactionalContentMD5, + transactionalContentCrc64, + contentType1, + accept2, + blobType2 + ], + isXML: true, + contentType: "application/xml; charset=utf-8", + mediaType: "binary", + serializer: xmlSerializer + }; + var putBlobFromUrlOperationSpec = { + path: "/{containerName}/{blob}", + httpMethod: "PUT", + responses: { + 201: { + headersMapper: BlockBlobPutBlobFromUrlHeaders + }, + default: { + bodyMapper: StorageError, + headersMapper: BlockBlobPutBlobFromUrlExceptionHeaders + } + }, + queryParameters: [timeoutInSeconds], + urlParameters: [url], + headerParameters: [ + version, + requestId, + accept1, + contentLength, + metadata, + leaseId, + ifModifiedSince, + ifUnmodifiedSince, + encryptionKey, + encryptionKeySha256, + encryptionAlgorithm, + ifMatch, + ifNoneMatch, + ifTags, + blobCacheControl, + blobContentType, + blobContentMD5, + blobContentEncoding, + blobContentLanguage, + blobContentDisposition, + encryptionScope, + tier, + sourceIfModifiedSince, + sourceIfUnmodifiedSince, + sourceIfMatch, + sourceIfNoneMatch, + sourceIfTags, + copySource, + blobTagsString, + sourceContentMD5, + copySourceAuthorization, + copySourceTags, + transactionalContentMD5, + blobType2, + copySourceBlobProperties + ], + isXML: true, + serializer: xmlSerializer + }; + var stageBlockOperationSpec = { + path: "/{containerName}/{blob}", + httpMethod: "PUT", + responses: { + 201: { + headersMapper: BlockBlobStageBlockHeaders + }, + default: { + bodyMapper: StorageError, + headersMapper: BlockBlobStageBlockExceptionHeaders + } + }, + requestBody: body1, + queryParameters: [ + timeoutInSeconds, + comp24, + blockId + ], + urlParameters: [url], + headerParameters: [ + version, + requestId, + contentLength, + leaseId, + encryptionKey, + encryptionKeySha256, + encryptionAlgorithm, + encryptionScope, + transactionalContentMD5, + transactionalContentCrc64, + contentType1, + accept2 + ], + isXML: true, + contentType: "application/xml; charset=utf-8", + mediaType: "binary", + serializer: xmlSerializer + }; + var stageBlockFromURLOperationSpec = { + path: "/{containerName}/{blob}", + httpMethod: "PUT", + responses: { + 201: { + headersMapper: BlockBlobStageBlockFromURLHeaders + }, + default: { + bodyMapper: StorageError, + headersMapper: BlockBlobStageBlockFromURLExceptionHeaders + } + }, + queryParameters: [ + timeoutInSeconds, + comp24, + blockId + ], + urlParameters: [url], + headerParameters: [ + version, + requestId, + accept1, + contentLength, + leaseId, + encryptionKey, + encryptionKeySha256, + encryptionAlgorithm, + encryptionScope, + sourceIfModifiedSince, + sourceIfUnmodifiedSince, + sourceIfMatch, + sourceIfNoneMatch, + sourceContentMD5, + copySourceAuthorization, + sourceUrl, + sourceContentCrc64, + sourceRange1 + ], + isXML: true, + serializer: xmlSerializer + }; + var commitBlockListOperationSpec = { + path: "/{containerName}/{blob}", + httpMethod: "PUT", + responses: { + 201: { + headersMapper: BlockBlobCommitBlockListHeaders + }, + default: { + bodyMapper: StorageError, + headersMapper: BlockBlobCommitBlockListExceptionHeaders + } + }, + requestBody: blocks, + queryParameters: [timeoutInSeconds, comp25], + urlParameters: [url], + headerParameters: [ + contentType, + accept, + version, + requestId, + metadata, + leaseId, + ifModifiedSince, + ifUnmodifiedSince, + encryptionKey, + encryptionKeySha256, + encryptionAlgorithm, + ifMatch, + ifNoneMatch, + ifTags, + blobCacheControl, + blobContentType, + blobContentMD5, + blobContentEncoding, + blobContentLanguage, + blobContentDisposition, + immutabilityPolicyExpiry, + immutabilityPolicyMode, + encryptionScope, + tier, + blobTagsString, + legalHold1, + transactionalContentMD5, + transactionalContentCrc64 + ], + isXML: true, + contentType: "application/xml; charset=utf-8", + mediaType: "xml", + serializer: xmlSerializer + }; + var getBlockListOperationSpec = { + path: "/{containerName}/{blob}", + httpMethod: "GET", + responses: { + 200: { + bodyMapper: BlockList, + headersMapper: BlockBlobGetBlockListHeaders + }, + default: { + bodyMapper: StorageError, + headersMapper: BlockBlobGetBlockListExceptionHeaders + } + }, + queryParameters: [ + timeoutInSeconds, + snapshot, + comp25, + listType + ], + urlParameters: [url], + headerParameters: [ + version, + requestId, + accept1, + leaseId, + ifTags + ], + isXML: true, + serializer: xmlSerializer + }; + var StorageClient$1 = class StorageClient2 extends coreHttpCompat__namespace.ExtendedServiceClient { + constructor(url2, options) { + var _a, _b; + if (url2 === undefined) { + throw new Error("'url' cannot be null"); + } + if (!options) { + options = {}; + } + const defaults = { + requestContentType: "application/json; charset=utf-8" + }; + const packageDetails = `azsdk-js-azure-storage-blob/12.25.0`; + const userAgentPrefix = options.userAgentOptions && options.userAgentOptions.userAgentPrefix ? `${options.userAgentOptions.userAgentPrefix} ${packageDetails}` : `${packageDetails}`; + const optionsWithDefaults = Object.assign(Object.assign(Object.assign({}, defaults), options), { userAgentOptions: { + userAgentPrefix + }, endpoint: (_b = (_a = options.endpoint) !== null && _a !== undefined ? _a : options.baseUri) !== null && _b !== undefined ? _b : "{url}" }); + super(optionsWithDefaults); + this.url = url2; + this.version = options.version || "2024-11-04"; + this.service = new ServiceImpl(this); + this.container = new ContainerImpl(this); + this.blob = new BlobImpl(this); + this.pageBlob = new PageBlobImpl(this); + this.appendBlob = new AppendBlobImpl(this); + this.blockBlob = new BlockBlobImpl(this); + } + }; + + class StorageContextClient extends StorageClient$1 { + async sendOperationRequest(operationArguments, operationSpec) { + const operationSpecToSend = Object.assign({}, operationSpec); + if (operationSpecToSend.path === "/{containerName}" || operationSpecToSend.path === "/{containerName}/{blob}") { + operationSpecToSend.path = ""; + } + return super.sendOperationRequest(operationArguments, operationSpecToSend); + } + } + + class StorageClient { + constructor(url2, pipeline) { + this.url = escapeURLPath(url2); + this.accountName = getAccountNameFromUrl(url2); + this.pipeline = pipeline; + this.storageClientContext = new StorageContextClient(this.url, getCoreClientOptions(pipeline)); + this.isHttps = iEqual(getURLScheme(this.url) || "", "https"); + this.credential = getCredentialFromPipeline(pipeline); + const storageClientContext = this.storageClientContext; + storageClientContext.requestContentType = undefined; + } + } + var tracingClient = coreTracing.createTracingClient({ + packageName: "@azure/storage-blob", + packageVersion: SDK_VERSION, + namespace: "Microsoft.Storage" + }); + + class BlobSASPermissions { + constructor() { + this.read = false; + this.add = false; + this.create = false; + this.write = false; + this.delete = false; + this.deleteVersion = false; + this.tag = false; + this.move = false; + this.execute = false; + this.setImmutabilityPolicy = false; + this.permanentDelete = false; + } + static parse(permissions) { + const blobSASPermissions = new BlobSASPermissions; + for (const char of permissions) { + switch (char) { + case "r": + blobSASPermissions.read = true; + break; + case "a": + blobSASPermissions.add = true; + break; + case "c": + blobSASPermissions.create = true; + break; + case "w": + blobSASPermissions.write = true; + break; + case "d": + blobSASPermissions.delete = true; + break; + case "x": + blobSASPermissions.deleteVersion = true; + break; + case "t": + blobSASPermissions.tag = true; + break; + case "m": + blobSASPermissions.move = true; + break; + case "e": + blobSASPermissions.execute = true; + break; + case "i": + blobSASPermissions.setImmutabilityPolicy = true; + break; + case "y": + blobSASPermissions.permanentDelete = true; + break; + default: + throw new RangeError(`Invalid permission: ${char}`); + } + } + return blobSASPermissions; + } + static from(permissionLike) { + const blobSASPermissions = new BlobSASPermissions; + if (permissionLike.read) { + blobSASPermissions.read = true; + } + if (permissionLike.add) { + blobSASPermissions.add = true; + } + if (permissionLike.create) { + blobSASPermissions.create = true; + } + if (permissionLike.write) { + blobSASPermissions.write = true; + } + if (permissionLike.delete) { + blobSASPermissions.delete = true; + } + if (permissionLike.deleteVersion) { + blobSASPermissions.deleteVersion = true; + } + if (permissionLike.tag) { + blobSASPermissions.tag = true; + } + if (permissionLike.move) { + blobSASPermissions.move = true; + } + if (permissionLike.execute) { + blobSASPermissions.execute = true; + } + if (permissionLike.setImmutabilityPolicy) { + blobSASPermissions.setImmutabilityPolicy = true; + } + if (permissionLike.permanentDelete) { + blobSASPermissions.permanentDelete = true; + } + return blobSASPermissions; + } + toString() { + const permissions = []; + if (this.read) { + permissions.push("r"); + } + if (this.add) { + permissions.push("a"); + } + if (this.create) { + permissions.push("c"); + } + if (this.write) { + permissions.push("w"); + } + if (this.delete) { + permissions.push("d"); + } + if (this.deleteVersion) { + permissions.push("x"); + } + if (this.tag) { + permissions.push("t"); + } + if (this.move) { + permissions.push("m"); + } + if (this.execute) { + permissions.push("e"); + } + if (this.setImmutabilityPolicy) { + permissions.push("i"); + } + if (this.permanentDelete) { + permissions.push("y"); + } + return permissions.join(""); + } + } + + class ContainerSASPermissions { + constructor() { + this.read = false; + this.add = false; + this.create = false; + this.write = false; + this.delete = false; + this.deleteVersion = false; + this.list = false; + this.tag = false; + this.move = false; + this.execute = false; + this.setImmutabilityPolicy = false; + this.permanentDelete = false; + this.filterByTags = false; + } + static parse(permissions) { + const containerSASPermissions = new ContainerSASPermissions; + for (const char of permissions) { + switch (char) { + case "r": + containerSASPermissions.read = true; + break; + case "a": + containerSASPermissions.add = true; + break; + case "c": + containerSASPermissions.create = true; + break; + case "w": + containerSASPermissions.write = true; + break; + case "d": + containerSASPermissions.delete = true; + break; + case "l": + containerSASPermissions.list = true; + break; + case "t": + containerSASPermissions.tag = true; + break; + case "x": + containerSASPermissions.deleteVersion = true; + break; + case "m": + containerSASPermissions.move = true; + break; + case "e": + containerSASPermissions.execute = true; + break; + case "i": + containerSASPermissions.setImmutabilityPolicy = true; + break; + case "y": + containerSASPermissions.permanentDelete = true; + break; + case "f": + containerSASPermissions.filterByTags = true; + break; + default: + throw new RangeError(`Invalid permission ${char}`); + } + } + return containerSASPermissions; + } + static from(permissionLike) { + const containerSASPermissions = new ContainerSASPermissions; + if (permissionLike.read) { + containerSASPermissions.read = true; + } + if (permissionLike.add) { + containerSASPermissions.add = true; + } + if (permissionLike.create) { + containerSASPermissions.create = true; + } + if (permissionLike.write) { + containerSASPermissions.write = true; + } + if (permissionLike.delete) { + containerSASPermissions.delete = true; + } + if (permissionLike.list) { + containerSASPermissions.list = true; + } + if (permissionLike.deleteVersion) { + containerSASPermissions.deleteVersion = true; + } + if (permissionLike.tag) { + containerSASPermissions.tag = true; + } + if (permissionLike.move) { + containerSASPermissions.move = true; + } + if (permissionLike.execute) { + containerSASPermissions.execute = true; + } + if (permissionLike.setImmutabilityPolicy) { + containerSASPermissions.setImmutabilityPolicy = true; + } + if (permissionLike.permanentDelete) { + containerSASPermissions.permanentDelete = true; + } + if (permissionLike.filterByTags) { + containerSASPermissions.filterByTags = true; + } + return containerSASPermissions; + } + toString() { + const permissions = []; + if (this.read) { + permissions.push("r"); + } + if (this.add) { + permissions.push("a"); + } + if (this.create) { + permissions.push("c"); + } + if (this.write) { + permissions.push("w"); + } + if (this.delete) { + permissions.push("d"); + } + if (this.deleteVersion) { + permissions.push("x"); + } + if (this.list) { + permissions.push("l"); + } + if (this.tag) { + permissions.push("t"); + } + if (this.move) { + permissions.push("m"); + } + if (this.execute) { + permissions.push("e"); + } + if (this.setImmutabilityPolicy) { + permissions.push("i"); + } + if (this.permanentDelete) { + permissions.push("y"); + } + if (this.filterByTags) { + permissions.push("f"); + } + return permissions.join(""); + } + } + + class UserDelegationKeyCredential { + constructor(accountName, userDelegationKey) { + this.accountName = accountName; + this.userDelegationKey = userDelegationKey; + this.key = Buffer.from(userDelegationKey.value, "base64"); + } + computeHMACSHA256(stringToSign) { + return crypto.createHmac("sha256", this.key).update(stringToSign, "utf8").digest("base64"); + } + } + function ipRangeToString(ipRange) { + return ipRange.end ? `${ipRange.start}-${ipRange.end}` : ipRange.start; + } + exports2.SASProtocol = undefined; + (function(SASProtocol) { + SASProtocol["Https"] = "https"; + SASProtocol["HttpsAndHttp"] = "https,http"; + })(exports2.SASProtocol || (exports2.SASProtocol = {})); + + class SASQueryParameters { + get ipRange() { + if (this.ipRangeInner) { + return { + end: this.ipRangeInner.end, + start: this.ipRangeInner.start + }; + } + return; + } + constructor(version2, signature, permissionsOrOptions, services, resourceTypes, protocol, startsOn, expiresOn2, ipRange, identifier, resource, cacheControl, contentDisposition, contentEncoding, contentLanguage, contentType2, userDelegationKey, preauthorizedAgentObjectId, correlationId, encryptionScope2) { + this.version = version2; + this.signature = signature; + if (permissionsOrOptions !== undefined && typeof permissionsOrOptions !== "string") { + this.permissions = permissionsOrOptions.permissions; + this.services = permissionsOrOptions.services; + this.resourceTypes = permissionsOrOptions.resourceTypes; + this.protocol = permissionsOrOptions.protocol; + this.startsOn = permissionsOrOptions.startsOn; + this.expiresOn = permissionsOrOptions.expiresOn; + this.ipRangeInner = permissionsOrOptions.ipRange; + this.identifier = permissionsOrOptions.identifier; + this.encryptionScope = permissionsOrOptions.encryptionScope; + this.resource = permissionsOrOptions.resource; + this.cacheControl = permissionsOrOptions.cacheControl; + this.contentDisposition = permissionsOrOptions.contentDisposition; + this.contentEncoding = permissionsOrOptions.contentEncoding; + this.contentLanguage = permissionsOrOptions.contentLanguage; + this.contentType = permissionsOrOptions.contentType; + if (permissionsOrOptions.userDelegationKey) { + this.signedOid = permissionsOrOptions.userDelegationKey.signedObjectId; + this.signedTenantId = permissionsOrOptions.userDelegationKey.signedTenantId; + this.signedStartsOn = permissionsOrOptions.userDelegationKey.signedStartsOn; + this.signedExpiresOn = permissionsOrOptions.userDelegationKey.signedExpiresOn; + this.signedService = permissionsOrOptions.userDelegationKey.signedService; + this.signedVersion = permissionsOrOptions.userDelegationKey.signedVersion; + this.preauthorizedAgentObjectId = permissionsOrOptions.preauthorizedAgentObjectId; + this.correlationId = permissionsOrOptions.correlationId; + } + } else { + this.services = services; + this.resourceTypes = resourceTypes; + this.expiresOn = expiresOn2; + this.permissions = permissionsOrOptions; + this.protocol = protocol; + this.startsOn = startsOn; + this.ipRangeInner = ipRange; + this.encryptionScope = encryptionScope2; + this.identifier = identifier; + this.resource = resource; + this.cacheControl = cacheControl; + this.contentDisposition = contentDisposition; + this.contentEncoding = contentEncoding; + this.contentLanguage = contentLanguage; + this.contentType = contentType2; + if (userDelegationKey) { + this.signedOid = userDelegationKey.signedObjectId; + this.signedTenantId = userDelegationKey.signedTenantId; + this.signedStartsOn = userDelegationKey.signedStartsOn; + this.signedExpiresOn = userDelegationKey.signedExpiresOn; + this.signedService = userDelegationKey.signedService; + this.signedVersion = userDelegationKey.signedVersion; + this.preauthorizedAgentObjectId = preauthorizedAgentObjectId; + this.correlationId = correlationId; + } + } + } + toString() { + const params = [ + "sv", + "ss", + "srt", + "spr", + "st", + "se", + "sip", + "si", + "ses", + "skoid", + "sktid", + "skt", + "ske", + "sks", + "skv", + "sr", + "sp", + "sig", + "rscc", + "rscd", + "rsce", + "rscl", + "rsct", + "saoid", + "scid" + ]; + const queries = []; + for (const param of params) { + switch (param) { + case "sv": + this.tryAppendQueryParameter(queries, param, this.version); + break; + case "ss": + this.tryAppendQueryParameter(queries, param, this.services); + break; + case "srt": + this.tryAppendQueryParameter(queries, param, this.resourceTypes); + break; + case "spr": + this.tryAppendQueryParameter(queries, param, this.protocol); + break; + case "st": + this.tryAppendQueryParameter(queries, param, this.startsOn ? truncatedISO8061Date(this.startsOn, false) : undefined); + break; + case "se": + this.tryAppendQueryParameter(queries, param, this.expiresOn ? truncatedISO8061Date(this.expiresOn, false) : undefined); + break; + case "sip": + this.tryAppendQueryParameter(queries, param, this.ipRange ? ipRangeToString(this.ipRange) : undefined); + break; + case "si": + this.tryAppendQueryParameter(queries, param, this.identifier); + break; + case "ses": + this.tryAppendQueryParameter(queries, param, this.encryptionScope); + break; + case "skoid": + this.tryAppendQueryParameter(queries, param, this.signedOid); + break; + case "sktid": + this.tryAppendQueryParameter(queries, param, this.signedTenantId); + break; + case "skt": + this.tryAppendQueryParameter(queries, param, this.signedStartsOn ? truncatedISO8061Date(this.signedStartsOn, false) : undefined); + break; + case "ske": + this.tryAppendQueryParameter(queries, param, this.signedExpiresOn ? truncatedISO8061Date(this.signedExpiresOn, false) : undefined); + break; + case "sks": + this.tryAppendQueryParameter(queries, param, this.signedService); + break; + case "skv": + this.tryAppendQueryParameter(queries, param, this.signedVersion); + break; + case "sr": + this.tryAppendQueryParameter(queries, param, this.resource); + break; + case "sp": + this.tryAppendQueryParameter(queries, param, this.permissions); + break; + case "sig": + this.tryAppendQueryParameter(queries, param, this.signature); + break; + case "rscc": + this.tryAppendQueryParameter(queries, param, this.cacheControl); + break; + case "rscd": + this.tryAppendQueryParameter(queries, param, this.contentDisposition); + break; + case "rsce": + this.tryAppendQueryParameter(queries, param, this.contentEncoding); + break; + case "rscl": + this.tryAppendQueryParameter(queries, param, this.contentLanguage); + break; + case "rsct": + this.tryAppendQueryParameter(queries, param, this.contentType); + break; + case "saoid": + this.tryAppendQueryParameter(queries, param, this.preauthorizedAgentObjectId); + break; + case "scid": + this.tryAppendQueryParameter(queries, param, this.correlationId); + break; + } + } + return queries.join("&"); + } + tryAppendQueryParameter(queries, key, value) { + if (!value) { + return; + } + key = encodeURIComponent(key); + value = encodeURIComponent(value); + if (key.length > 0 && value.length > 0) { + queries.push(`${key}=${value}`); + } + } + } + function generateBlobSASQueryParameters(blobSASSignatureValues, sharedKeyCredentialOrUserDelegationKey, accountName) { + return generateBlobSASQueryParametersInternal(blobSASSignatureValues, sharedKeyCredentialOrUserDelegationKey, accountName).sasQueryParameters; + } + function generateBlobSASQueryParametersInternal(blobSASSignatureValues, sharedKeyCredentialOrUserDelegationKey, accountName) { + const version2 = blobSASSignatureValues.version ? blobSASSignatureValues.version : SERVICE_VERSION; + const sharedKeyCredential = sharedKeyCredentialOrUserDelegationKey instanceof StorageSharedKeyCredential ? sharedKeyCredentialOrUserDelegationKey : undefined; + let userDelegationKeyCredential; + if (sharedKeyCredential === undefined && accountName !== undefined) { + userDelegationKeyCredential = new UserDelegationKeyCredential(accountName, sharedKeyCredentialOrUserDelegationKey); + } + if (sharedKeyCredential === undefined && userDelegationKeyCredential === undefined) { + throw TypeError("Invalid sharedKeyCredential, userDelegationKey or accountName."); + } + if (version2 >= "2020-12-06") { + if (sharedKeyCredential !== undefined) { + return generateBlobSASQueryParameters20201206(blobSASSignatureValues, sharedKeyCredential); + } else { + return generateBlobSASQueryParametersUDK20201206(blobSASSignatureValues, userDelegationKeyCredential); + } + } + if (version2 >= "2018-11-09") { + if (sharedKeyCredential !== undefined) { + return generateBlobSASQueryParameters20181109(blobSASSignatureValues, sharedKeyCredential); + } else { + if (version2 >= "2020-02-10") { + return generateBlobSASQueryParametersUDK20200210(blobSASSignatureValues, userDelegationKeyCredential); + } else { + return generateBlobSASQueryParametersUDK20181109(blobSASSignatureValues, userDelegationKeyCredential); + } + } + } + if (version2 >= "2015-04-05") { + if (sharedKeyCredential !== undefined) { + return generateBlobSASQueryParameters20150405(blobSASSignatureValues, sharedKeyCredential); + } else { + throw new RangeError("'version' must be >= '2018-11-09' when generating user delegation SAS using user delegation key."); + } + } + throw new RangeError("'version' must be >= '2015-04-05'."); + } + function generateBlobSASQueryParameters20150405(blobSASSignatureValues, sharedKeyCredential) { + blobSASSignatureValues = SASSignatureValuesSanityCheckAndAutofill(blobSASSignatureValues); + if (!blobSASSignatureValues.identifier && !(blobSASSignatureValues.permissions && blobSASSignatureValues.expiresOn)) { + throw new RangeError("Must provide 'permissions' and 'expiresOn' for Blob SAS generation when 'identifier' is not provided."); + } + let resource = "c"; + if (blobSASSignatureValues.blobName) { + resource = "b"; + } + let verifiedPermissions; + if (blobSASSignatureValues.permissions) { + if (blobSASSignatureValues.blobName) { + verifiedPermissions = BlobSASPermissions.parse(blobSASSignatureValues.permissions.toString()).toString(); + } else { + verifiedPermissions = ContainerSASPermissions.parse(blobSASSignatureValues.permissions.toString()).toString(); + } + } + const stringToSign = [ + verifiedPermissions ? verifiedPermissions : "", + blobSASSignatureValues.startsOn ? truncatedISO8061Date(blobSASSignatureValues.startsOn, false) : "", + blobSASSignatureValues.expiresOn ? truncatedISO8061Date(blobSASSignatureValues.expiresOn, false) : "", + getCanonicalName(sharedKeyCredential.accountName, blobSASSignatureValues.containerName, blobSASSignatureValues.blobName), + blobSASSignatureValues.identifier, + blobSASSignatureValues.ipRange ? ipRangeToString(blobSASSignatureValues.ipRange) : "", + blobSASSignatureValues.protocol ? blobSASSignatureValues.protocol : "", + blobSASSignatureValues.version, + blobSASSignatureValues.cacheControl ? blobSASSignatureValues.cacheControl : "", + blobSASSignatureValues.contentDisposition ? blobSASSignatureValues.contentDisposition : "", + blobSASSignatureValues.contentEncoding ? blobSASSignatureValues.contentEncoding : "", + blobSASSignatureValues.contentLanguage ? blobSASSignatureValues.contentLanguage : "", + blobSASSignatureValues.contentType ? blobSASSignatureValues.contentType : "" + ].join("\n"); + const signature = sharedKeyCredential.computeHMACSHA256(stringToSign); + return { + sasQueryParameters: new SASQueryParameters(blobSASSignatureValues.version, signature, verifiedPermissions, undefined, undefined, blobSASSignatureValues.protocol, blobSASSignatureValues.startsOn, blobSASSignatureValues.expiresOn, blobSASSignatureValues.ipRange, blobSASSignatureValues.identifier, resource, blobSASSignatureValues.cacheControl, blobSASSignatureValues.contentDisposition, blobSASSignatureValues.contentEncoding, blobSASSignatureValues.contentLanguage, blobSASSignatureValues.contentType), + stringToSign + }; + } + function generateBlobSASQueryParameters20181109(blobSASSignatureValues, sharedKeyCredential) { + blobSASSignatureValues = SASSignatureValuesSanityCheckAndAutofill(blobSASSignatureValues); + if (!blobSASSignatureValues.identifier && !(blobSASSignatureValues.permissions && blobSASSignatureValues.expiresOn)) { + throw new RangeError("Must provide 'permissions' and 'expiresOn' for Blob SAS generation when 'identifier' is not provided."); + } + let resource = "c"; + let timestamp = blobSASSignatureValues.snapshotTime; + if (blobSASSignatureValues.blobName) { + resource = "b"; + if (blobSASSignatureValues.snapshotTime) { + resource = "bs"; + } else if (blobSASSignatureValues.versionId) { + resource = "bv"; + timestamp = blobSASSignatureValues.versionId; + } + } + let verifiedPermissions; + if (blobSASSignatureValues.permissions) { + if (blobSASSignatureValues.blobName) { + verifiedPermissions = BlobSASPermissions.parse(blobSASSignatureValues.permissions.toString()).toString(); + } else { + verifiedPermissions = ContainerSASPermissions.parse(blobSASSignatureValues.permissions.toString()).toString(); + } + } + const stringToSign = [ + verifiedPermissions ? verifiedPermissions : "", + blobSASSignatureValues.startsOn ? truncatedISO8061Date(blobSASSignatureValues.startsOn, false) : "", + blobSASSignatureValues.expiresOn ? truncatedISO8061Date(blobSASSignatureValues.expiresOn, false) : "", + getCanonicalName(sharedKeyCredential.accountName, blobSASSignatureValues.containerName, blobSASSignatureValues.blobName), + blobSASSignatureValues.identifier, + blobSASSignatureValues.ipRange ? ipRangeToString(blobSASSignatureValues.ipRange) : "", + blobSASSignatureValues.protocol ? blobSASSignatureValues.protocol : "", + blobSASSignatureValues.version, + resource, + timestamp, + blobSASSignatureValues.cacheControl ? blobSASSignatureValues.cacheControl : "", + blobSASSignatureValues.contentDisposition ? blobSASSignatureValues.contentDisposition : "", + blobSASSignatureValues.contentEncoding ? blobSASSignatureValues.contentEncoding : "", + blobSASSignatureValues.contentLanguage ? blobSASSignatureValues.contentLanguage : "", + blobSASSignatureValues.contentType ? blobSASSignatureValues.contentType : "" + ].join("\n"); + const signature = sharedKeyCredential.computeHMACSHA256(stringToSign); + return { + sasQueryParameters: new SASQueryParameters(blobSASSignatureValues.version, signature, verifiedPermissions, undefined, undefined, blobSASSignatureValues.protocol, blobSASSignatureValues.startsOn, blobSASSignatureValues.expiresOn, blobSASSignatureValues.ipRange, blobSASSignatureValues.identifier, resource, blobSASSignatureValues.cacheControl, blobSASSignatureValues.contentDisposition, blobSASSignatureValues.contentEncoding, blobSASSignatureValues.contentLanguage, blobSASSignatureValues.contentType), + stringToSign + }; + } + function generateBlobSASQueryParameters20201206(blobSASSignatureValues, sharedKeyCredential) { + blobSASSignatureValues = SASSignatureValuesSanityCheckAndAutofill(blobSASSignatureValues); + if (!blobSASSignatureValues.identifier && !(blobSASSignatureValues.permissions && blobSASSignatureValues.expiresOn)) { + throw new RangeError("Must provide 'permissions' and 'expiresOn' for Blob SAS generation when 'identifier' is not provided."); + } + let resource = "c"; + let timestamp = blobSASSignatureValues.snapshotTime; + if (blobSASSignatureValues.blobName) { + resource = "b"; + if (blobSASSignatureValues.snapshotTime) { + resource = "bs"; + } else if (blobSASSignatureValues.versionId) { + resource = "bv"; + timestamp = blobSASSignatureValues.versionId; + } + } + let verifiedPermissions; + if (blobSASSignatureValues.permissions) { + if (blobSASSignatureValues.blobName) { + verifiedPermissions = BlobSASPermissions.parse(blobSASSignatureValues.permissions.toString()).toString(); + } else { + verifiedPermissions = ContainerSASPermissions.parse(blobSASSignatureValues.permissions.toString()).toString(); + } + } + const stringToSign = [ + verifiedPermissions ? verifiedPermissions : "", + blobSASSignatureValues.startsOn ? truncatedISO8061Date(blobSASSignatureValues.startsOn, false) : "", + blobSASSignatureValues.expiresOn ? truncatedISO8061Date(blobSASSignatureValues.expiresOn, false) : "", + getCanonicalName(sharedKeyCredential.accountName, blobSASSignatureValues.containerName, blobSASSignatureValues.blobName), + blobSASSignatureValues.identifier, + blobSASSignatureValues.ipRange ? ipRangeToString(blobSASSignatureValues.ipRange) : "", + blobSASSignatureValues.protocol ? blobSASSignatureValues.protocol : "", + blobSASSignatureValues.version, + resource, + timestamp, + blobSASSignatureValues.encryptionScope, + blobSASSignatureValues.cacheControl ? blobSASSignatureValues.cacheControl : "", + blobSASSignatureValues.contentDisposition ? blobSASSignatureValues.contentDisposition : "", + blobSASSignatureValues.contentEncoding ? blobSASSignatureValues.contentEncoding : "", + blobSASSignatureValues.contentLanguage ? blobSASSignatureValues.contentLanguage : "", + blobSASSignatureValues.contentType ? blobSASSignatureValues.contentType : "" + ].join("\n"); + const signature = sharedKeyCredential.computeHMACSHA256(stringToSign); + return { + sasQueryParameters: new SASQueryParameters(blobSASSignatureValues.version, signature, verifiedPermissions, undefined, undefined, blobSASSignatureValues.protocol, blobSASSignatureValues.startsOn, blobSASSignatureValues.expiresOn, blobSASSignatureValues.ipRange, blobSASSignatureValues.identifier, resource, blobSASSignatureValues.cacheControl, blobSASSignatureValues.contentDisposition, blobSASSignatureValues.contentEncoding, blobSASSignatureValues.contentLanguage, blobSASSignatureValues.contentType, undefined, undefined, undefined, blobSASSignatureValues.encryptionScope), + stringToSign + }; + } + function generateBlobSASQueryParametersUDK20181109(blobSASSignatureValues, userDelegationKeyCredential) { + blobSASSignatureValues = SASSignatureValuesSanityCheckAndAutofill(blobSASSignatureValues); + if (!blobSASSignatureValues.permissions || !blobSASSignatureValues.expiresOn) { + throw new RangeError("Must provide 'permissions' and 'expiresOn' for Blob SAS generation when generating user delegation SAS."); + } + let resource = "c"; + let timestamp = blobSASSignatureValues.snapshotTime; + if (blobSASSignatureValues.blobName) { + resource = "b"; + if (blobSASSignatureValues.snapshotTime) { + resource = "bs"; + } else if (blobSASSignatureValues.versionId) { + resource = "bv"; + timestamp = blobSASSignatureValues.versionId; + } + } + let verifiedPermissions; + if (blobSASSignatureValues.permissions) { + if (blobSASSignatureValues.blobName) { + verifiedPermissions = BlobSASPermissions.parse(blobSASSignatureValues.permissions.toString()).toString(); + } else { + verifiedPermissions = ContainerSASPermissions.parse(blobSASSignatureValues.permissions.toString()).toString(); + } + } + const stringToSign = [ + verifiedPermissions ? verifiedPermissions : "", + blobSASSignatureValues.startsOn ? truncatedISO8061Date(blobSASSignatureValues.startsOn, false) : "", + blobSASSignatureValues.expiresOn ? truncatedISO8061Date(blobSASSignatureValues.expiresOn, false) : "", + getCanonicalName(userDelegationKeyCredential.accountName, blobSASSignatureValues.containerName, blobSASSignatureValues.blobName), + userDelegationKeyCredential.userDelegationKey.signedObjectId, + userDelegationKeyCredential.userDelegationKey.signedTenantId, + userDelegationKeyCredential.userDelegationKey.signedStartsOn ? truncatedISO8061Date(userDelegationKeyCredential.userDelegationKey.signedStartsOn, false) : "", + userDelegationKeyCredential.userDelegationKey.signedExpiresOn ? truncatedISO8061Date(userDelegationKeyCredential.userDelegationKey.signedExpiresOn, false) : "", + userDelegationKeyCredential.userDelegationKey.signedService, + userDelegationKeyCredential.userDelegationKey.signedVersion, + blobSASSignatureValues.ipRange ? ipRangeToString(blobSASSignatureValues.ipRange) : "", + blobSASSignatureValues.protocol ? blobSASSignatureValues.protocol : "", + blobSASSignatureValues.version, + resource, + timestamp, + blobSASSignatureValues.cacheControl, + blobSASSignatureValues.contentDisposition, + blobSASSignatureValues.contentEncoding, + blobSASSignatureValues.contentLanguage, + blobSASSignatureValues.contentType + ].join("\n"); + const signature = userDelegationKeyCredential.computeHMACSHA256(stringToSign); + return { + sasQueryParameters: new SASQueryParameters(blobSASSignatureValues.version, signature, verifiedPermissions, undefined, undefined, blobSASSignatureValues.protocol, blobSASSignatureValues.startsOn, blobSASSignatureValues.expiresOn, blobSASSignatureValues.ipRange, blobSASSignatureValues.identifier, resource, blobSASSignatureValues.cacheControl, blobSASSignatureValues.contentDisposition, blobSASSignatureValues.contentEncoding, blobSASSignatureValues.contentLanguage, blobSASSignatureValues.contentType, userDelegationKeyCredential.userDelegationKey), + stringToSign + }; + } + function generateBlobSASQueryParametersUDK20200210(blobSASSignatureValues, userDelegationKeyCredential) { + blobSASSignatureValues = SASSignatureValuesSanityCheckAndAutofill(blobSASSignatureValues); + if (!blobSASSignatureValues.permissions || !blobSASSignatureValues.expiresOn) { + throw new RangeError("Must provide 'permissions' and 'expiresOn' for Blob SAS generation when generating user delegation SAS."); + } + let resource = "c"; + let timestamp = blobSASSignatureValues.snapshotTime; + if (blobSASSignatureValues.blobName) { + resource = "b"; + if (blobSASSignatureValues.snapshotTime) { + resource = "bs"; + } else if (blobSASSignatureValues.versionId) { + resource = "bv"; + timestamp = blobSASSignatureValues.versionId; + } + } + let verifiedPermissions; + if (blobSASSignatureValues.permissions) { + if (blobSASSignatureValues.blobName) { + verifiedPermissions = BlobSASPermissions.parse(blobSASSignatureValues.permissions.toString()).toString(); + } else { + verifiedPermissions = ContainerSASPermissions.parse(blobSASSignatureValues.permissions.toString()).toString(); + } + } + const stringToSign = [ + verifiedPermissions ? verifiedPermissions : "", + blobSASSignatureValues.startsOn ? truncatedISO8061Date(blobSASSignatureValues.startsOn, false) : "", + blobSASSignatureValues.expiresOn ? truncatedISO8061Date(blobSASSignatureValues.expiresOn, false) : "", + getCanonicalName(userDelegationKeyCredential.accountName, blobSASSignatureValues.containerName, blobSASSignatureValues.blobName), + userDelegationKeyCredential.userDelegationKey.signedObjectId, + userDelegationKeyCredential.userDelegationKey.signedTenantId, + userDelegationKeyCredential.userDelegationKey.signedStartsOn ? truncatedISO8061Date(userDelegationKeyCredential.userDelegationKey.signedStartsOn, false) : "", + userDelegationKeyCredential.userDelegationKey.signedExpiresOn ? truncatedISO8061Date(userDelegationKeyCredential.userDelegationKey.signedExpiresOn, false) : "", + userDelegationKeyCredential.userDelegationKey.signedService, + userDelegationKeyCredential.userDelegationKey.signedVersion, + blobSASSignatureValues.preauthorizedAgentObjectId, + undefined, + blobSASSignatureValues.correlationId, + blobSASSignatureValues.ipRange ? ipRangeToString(blobSASSignatureValues.ipRange) : "", + blobSASSignatureValues.protocol ? blobSASSignatureValues.protocol : "", + blobSASSignatureValues.version, + resource, + timestamp, + blobSASSignatureValues.cacheControl, + blobSASSignatureValues.contentDisposition, + blobSASSignatureValues.contentEncoding, + blobSASSignatureValues.contentLanguage, + blobSASSignatureValues.contentType + ].join("\n"); + const signature = userDelegationKeyCredential.computeHMACSHA256(stringToSign); + return { + sasQueryParameters: new SASQueryParameters(blobSASSignatureValues.version, signature, verifiedPermissions, undefined, undefined, blobSASSignatureValues.protocol, blobSASSignatureValues.startsOn, blobSASSignatureValues.expiresOn, blobSASSignatureValues.ipRange, blobSASSignatureValues.identifier, resource, blobSASSignatureValues.cacheControl, blobSASSignatureValues.contentDisposition, blobSASSignatureValues.contentEncoding, blobSASSignatureValues.contentLanguage, blobSASSignatureValues.contentType, userDelegationKeyCredential.userDelegationKey, blobSASSignatureValues.preauthorizedAgentObjectId, blobSASSignatureValues.correlationId), + stringToSign + }; + } + function generateBlobSASQueryParametersUDK20201206(blobSASSignatureValues, userDelegationKeyCredential) { + blobSASSignatureValues = SASSignatureValuesSanityCheckAndAutofill(blobSASSignatureValues); + if (!blobSASSignatureValues.permissions || !blobSASSignatureValues.expiresOn) { + throw new RangeError("Must provide 'permissions' and 'expiresOn' for Blob SAS generation when generating user delegation SAS."); + } + let resource = "c"; + let timestamp = blobSASSignatureValues.snapshotTime; + if (blobSASSignatureValues.blobName) { + resource = "b"; + if (blobSASSignatureValues.snapshotTime) { + resource = "bs"; + } else if (blobSASSignatureValues.versionId) { + resource = "bv"; + timestamp = blobSASSignatureValues.versionId; + } + } + let verifiedPermissions; + if (blobSASSignatureValues.permissions) { + if (blobSASSignatureValues.blobName) { + verifiedPermissions = BlobSASPermissions.parse(blobSASSignatureValues.permissions.toString()).toString(); + } else { + verifiedPermissions = ContainerSASPermissions.parse(blobSASSignatureValues.permissions.toString()).toString(); + } + } + const stringToSign = [ + verifiedPermissions ? verifiedPermissions : "", + blobSASSignatureValues.startsOn ? truncatedISO8061Date(blobSASSignatureValues.startsOn, false) : "", + blobSASSignatureValues.expiresOn ? truncatedISO8061Date(blobSASSignatureValues.expiresOn, false) : "", + getCanonicalName(userDelegationKeyCredential.accountName, blobSASSignatureValues.containerName, blobSASSignatureValues.blobName), + userDelegationKeyCredential.userDelegationKey.signedObjectId, + userDelegationKeyCredential.userDelegationKey.signedTenantId, + userDelegationKeyCredential.userDelegationKey.signedStartsOn ? truncatedISO8061Date(userDelegationKeyCredential.userDelegationKey.signedStartsOn, false) : "", + userDelegationKeyCredential.userDelegationKey.signedExpiresOn ? truncatedISO8061Date(userDelegationKeyCredential.userDelegationKey.signedExpiresOn, false) : "", + userDelegationKeyCredential.userDelegationKey.signedService, + userDelegationKeyCredential.userDelegationKey.signedVersion, + blobSASSignatureValues.preauthorizedAgentObjectId, + undefined, + blobSASSignatureValues.correlationId, + blobSASSignatureValues.ipRange ? ipRangeToString(blobSASSignatureValues.ipRange) : "", + blobSASSignatureValues.protocol ? blobSASSignatureValues.protocol : "", + blobSASSignatureValues.version, + resource, + timestamp, + blobSASSignatureValues.encryptionScope, + blobSASSignatureValues.cacheControl, + blobSASSignatureValues.contentDisposition, + blobSASSignatureValues.contentEncoding, + blobSASSignatureValues.contentLanguage, + blobSASSignatureValues.contentType + ].join("\n"); + const signature = userDelegationKeyCredential.computeHMACSHA256(stringToSign); + return { + sasQueryParameters: new SASQueryParameters(blobSASSignatureValues.version, signature, verifiedPermissions, undefined, undefined, blobSASSignatureValues.protocol, blobSASSignatureValues.startsOn, blobSASSignatureValues.expiresOn, blobSASSignatureValues.ipRange, blobSASSignatureValues.identifier, resource, blobSASSignatureValues.cacheControl, blobSASSignatureValues.contentDisposition, blobSASSignatureValues.contentEncoding, blobSASSignatureValues.contentLanguage, blobSASSignatureValues.contentType, userDelegationKeyCredential.userDelegationKey, blobSASSignatureValues.preauthorizedAgentObjectId, blobSASSignatureValues.correlationId, blobSASSignatureValues.encryptionScope), + stringToSign + }; + } + function getCanonicalName(accountName, containerName, blobName) { + const elements = [`/blob/${accountName}/${containerName}`]; + if (blobName) { + elements.push(`/${blobName}`); + } + return elements.join(""); + } + function SASSignatureValuesSanityCheckAndAutofill(blobSASSignatureValues) { + const version2 = blobSASSignatureValues.version ? blobSASSignatureValues.version : SERVICE_VERSION; + if (blobSASSignatureValues.snapshotTime && version2 < "2018-11-09") { + throw RangeError("'version' must be >= '2018-11-09' when providing 'snapshotTime'."); + } + if (blobSASSignatureValues.blobName === undefined && blobSASSignatureValues.snapshotTime) { + throw RangeError("Must provide 'blobName' when providing 'snapshotTime'."); + } + if (blobSASSignatureValues.versionId && version2 < "2019-10-10") { + throw RangeError("'version' must be >= '2019-10-10' when providing 'versionId'."); + } + if (blobSASSignatureValues.blobName === undefined && blobSASSignatureValues.versionId) { + throw RangeError("Must provide 'blobName' when providing 'versionId'."); + } + if (blobSASSignatureValues.permissions && blobSASSignatureValues.permissions.setImmutabilityPolicy && version2 < "2020-08-04") { + throw RangeError("'version' must be >= '2020-08-04' when provided 'i' permission."); + } + if (blobSASSignatureValues.permissions && blobSASSignatureValues.permissions.deleteVersion && version2 < "2019-10-10") { + throw RangeError("'version' must be >= '2019-10-10' when providing 'x' permission."); + } + if (blobSASSignatureValues.permissions && blobSASSignatureValues.permissions.permanentDelete && version2 < "2019-10-10") { + throw RangeError("'version' must be >= '2019-10-10' when providing 'y' permission."); + } + if (blobSASSignatureValues.permissions && blobSASSignatureValues.permissions.tag && version2 < "2019-12-12") { + throw RangeError("'version' must be >= '2019-12-12' when providing 't' permission."); + } + if (version2 < "2020-02-10" && blobSASSignatureValues.permissions && (blobSASSignatureValues.permissions.move || blobSASSignatureValues.permissions.execute)) { + throw RangeError("'version' must be >= '2020-02-10' when providing the 'm' or 'e' permission."); + } + if (version2 < "2021-04-10" && blobSASSignatureValues.permissions && blobSASSignatureValues.permissions.filterByTags) { + throw RangeError("'version' must be >= '2021-04-10' when providing the 'f' permission."); + } + if (version2 < "2020-02-10" && (blobSASSignatureValues.preauthorizedAgentObjectId || blobSASSignatureValues.correlationId)) { + throw RangeError("'version' must be >= '2020-02-10' when providing 'preauthorizedAgentObjectId' or 'correlationId'."); + } + if (blobSASSignatureValues.encryptionScope && version2 < "2020-12-06") { + throw RangeError("'version' must be >= '2020-12-06' when provided 'encryptionScope' in SAS."); + } + blobSASSignatureValues.version = version2; + return blobSASSignatureValues; + } + + class BlobLeaseClient { + get leaseId() { + return this._leaseId; + } + get url() { + return this._url; + } + constructor(client, leaseId2) { + const clientContext = client.storageClientContext; + this._url = client.url; + if (client.name === undefined) { + this._isContainer = true; + this._containerOrBlobOperation = clientContext.container; + } else { + this._isContainer = false; + this._containerOrBlobOperation = clientContext.blob; + } + if (!leaseId2) { + leaseId2 = coreUtil.randomUUID(); + } + this._leaseId = leaseId2; + } + async acquireLease(duration2, options = {}) { + var _a, _b, _c, _d, _e; + if (this._isContainer && (((_a = options.conditions) === null || _a === undefined ? undefined : _a.ifMatch) && ((_b = options.conditions) === null || _b === undefined ? undefined : _b.ifMatch) !== ETagNone || ((_c = options.conditions) === null || _c === undefined ? undefined : _c.ifNoneMatch) && ((_d = options.conditions) === null || _d === undefined ? undefined : _d.ifNoneMatch) !== ETagNone || ((_e = options.conditions) === null || _e === undefined ? undefined : _e.tagConditions))) { + throw new RangeError("The IfMatch, IfNoneMatch and tags access conditions are ignored by the service. Values other than undefined or their default values are not acceptable."); + } + return tracingClient.withSpan("BlobLeaseClient-acquireLease", options, async (updatedOptions) => { + var _a2; + return assertResponse(await this._containerOrBlobOperation.acquireLease({ + abortSignal: options.abortSignal, + duration: duration2, + modifiedAccessConditions: Object.assign(Object.assign({}, options.conditions), { ifTags: (_a2 = options.conditions) === null || _a2 === undefined ? undefined : _a2.tagConditions }), + proposedLeaseId: this._leaseId, + tracingOptions: updatedOptions.tracingOptions + })); + }); + } + async changeLease(proposedLeaseId2, options = {}) { + var _a, _b, _c, _d, _e; + if (this._isContainer && (((_a = options.conditions) === null || _a === undefined ? undefined : _a.ifMatch) && ((_b = options.conditions) === null || _b === undefined ? undefined : _b.ifMatch) !== ETagNone || ((_c = options.conditions) === null || _c === undefined ? undefined : _c.ifNoneMatch) && ((_d = options.conditions) === null || _d === undefined ? undefined : _d.ifNoneMatch) !== ETagNone || ((_e = options.conditions) === null || _e === undefined ? undefined : _e.tagConditions))) { + throw new RangeError("The IfMatch, IfNoneMatch and tags access conditions are ignored by the service. Values other than undefined or their default values are not acceptable."); + } + return tracingClient.withSpan("BlobLeaseClient-changeLease", options, async (updatedOptions) => { + var _a2; + const response = assertResponse(await this._containerOrBlobOperation.changeLease(this._leaseId, proposedLeaseId2, { + abortSignal: options.abortSignal, + modifiedAccessConditions: Object.assign(Object.assign({}, options.conditions), { ifTags: (_a2 = options.conditions) === null || _a2 === undefined ? undefined : _a2.tagConditions }), + tracingOptions: updatedOptions.tracingOptions + })); + this._leaseId = proposedLeaseId2; + return response; + }); + } + async releaseLease(options = {}) { + var _a, _b, _c, _d, _e; + if (this._isContainer && (((_a = options.conditions) === null || _a === undefined ? undefined : _a.ifMatch) && ((_b = options.conditions) === null || _b === undefined ? undefined : _b.ifMatch) !== ETagNone || ((_c = options.conditions) === null || _c === undefined ? undefined : _c.ifNoneMatch) && ((_d = options.conditions) === null || _d === undefined ? undefined : _d.ifNoneMatch) !== ETagNone || ((_e = options.conditions) === null || _e === undefined ? undefined : _e.tagConditions))) { + throw new RangeError("The IfMatch, IfNoneMatch and tags access conditions are ignored by the service. Values other than undefined or their default values are not acceptable."); + } + return tracingClient.withSpan("BlobLeaseClient-releaseLease", options, async (updatedOptions) => { + var _a2; + return assertResponse(await this._containerOrBlobOperation.releaseLease(this._leaseId, { + abortSignal: options.abortSignal, + modifiedAccessConditions: Object.assign(Object.assign({}, options.conditions), { ifTags: (_a2 = options.conditions) === null || _a2 === undefined ? undefined : _a2.tagConditions }), + tracingOptions: updatedOptions.tracingOptions + })); + }); + } + async renewLease(options = {}) { + var _a, _b, _c, _d, _e; + if (this._isContainer && (((_a = options.conditions) === null || _a === undefined ? undefined : _a.ifMatch) && ((_b = options.conditions) === null || _b === undefined ? undefined : _b.ifMatch) !== ETagNone || ((_c = options.conditions) === null || _c === undefined ? undefined : _c.ifNoneMatch) && ((_d = options.conditions) === null || _d === undefined ? undefined : _d.ifNoneMatch) !== ETagNone || ((_e = options.conditions) === null || _e === undefined ? undefined : _e.tagConditions))) { + throw new RangeError("The IfMatch, IfNoneMatch and tags access conditions are ignored by the service. Values other than undefined or their default values are not acceptable."); + } + return tracingClient.withSpan("BlobLeaseClient-renewLease", options, async (updatedOptions) => { + var _a2; + return this._containerOrBlobOperation.renewLease(this._leaseId, { + abortSignal: options.abortSignal, + modifiedAccessConditions: Object.assign(Object.assign({}, options.conditions), { ifTags: (_a2 = options.conditions) === null || _a2 === undefined ? undefined : _a2.tagConditions }), + tracingOptions: updatedOptions.tracingOptions + }); + }); + } + async breakLease(breakPeriod2, options = {}) { + var _a, _b, _c, _d, _e; + if (this._isContainer && (((_a = options.conditions) === null || _a === undefined ? undefined : _a.ifMatch) && ((_b = options.conditions) === null || _b === undefined ? undefined : _b.ifMatch) !== ETagNone || ((_c = options.conditions) === null || _c === undefined ? undefined : _c.ifNoneMatch) && ((_d = options.conditions) === null || _d === undefined ? undefined : _d.ifNoneMatch) !== ETagNone || ((_e = options.conditions) === null || _e === undefined ? undefined : _e.tagConditions))) { + throw new RangeError("The IfMatch, IfNoneMatch and tags access conditions are ignored by the service. Values other than undefined or their default values are not acceptable."); + } + return tracingClient.withSpan("BlobLeaseClient-breakLease", options, async (updatedOptions) => { + var _a2; + const operationOptions = { + abortSignal: options.abortSignal, + breakPeriod: breakPeriod2, + modifiedAccessConditions: Object.assign(Object.assign({}, options.conditions), { ifTags: (_a2 = options.conditions) === null || _a2 === undefined ? undefined : _a2.tagConditions }), + tracingOptions: updatedOptions.tracingOptions + }; + return assertResponse(await this._containerOrBlobOperation.breakLease(operationOptions)); + }); + } + } + + class RetriableReadableStream extends stream.Readable { + constructor(source, getter, offset, count, options = {}) { + super({ highWaterMark: options.highWaterMark }); + this.retries = 0; + this.sourceDataHandler = (data) => { + if (this.options.doInjectErrorOnce) { + this.options.doInjectErrorOnce = undefined; + this.source.pause(); + this.sourceErrorOrEndHandler(); + this.source.destroy(); + return; + } + this.offset += data.length; + if (this.onProgress) { + this.onProgress({ loadedBytes: this.offset - this.start }); + } + if (!this.push(data)) { + this.source.pause(); + } + }; + this.sourceAbortedHandler = () => { + const abortError = new abortController.AbortError("The operation was aborted."); + this.destroy(abortError); + }; + this.sourceErrorOrEndHandler = (err) => { + if (err && err.name === "AbortError") { + this.destroy(err); + return; + } + this.removeSourceEventHandlers(); + if (this.offset - 1 === this.end) { + this.push(null); + } else if (this.offset <= this.end) { + if (this.retries < this.maxRetryRequests) { + this.retries += 1; + this.getter(this.offset).then((newSource) => { + this.source = newSource; + this.setSourceEventHandlers(); + return; + }).catch((error) => { + this.destroy(error); + }); + } else { + this.destroy(new Error(`Data corruption failure: received less data than required and reached maxRetires limitation. Received data offset: ${this.offset - 1}, data needed offset: ${this.end}, retries: ${this.retries}, max retries: ${this.maxRetryRequests}`)); + } + } else { + this.destroy(new Error(`Data corruption failure: Received more data than original request, data needed offset is ${this.end}, received offset: ${this.offset - 1}`)); + } + }; + this.getter = getter; + this.source = source; + this.start = offset; + this.offset = offset; + this.end = offset + count - 1; + this.maxRetryRequests = options.maxRetryRequests && options.maxRetryRequests >= 0 ? options.maxRetryRequests : 0; + this.onProgress = options.onProgress; + this.options = options; + this.setSourceEventHandlers(); + } + _read() { + this.source.resume(); + } + setSourceEventHandlers() { + this.source.on("data", this.sourceDataHandler); + this.source.on("end", this.sourceErrorOrEndHandler); + this.source.on("error", this.sourceErrorOrEndHandler); + this.source.on("aborted", this.sourceAbortedHandler); + } + removeSourceEventHandlers() { + this.source.removeListener("data", this.sourceDataHandler); + this.source.removeListener("end", this.sourceErrorOrEndHandler); + this.source.removeListener("error", this.sourceErrorOrEndHandler); + this.source.removeListener("aborted", this.sourceAbortedHandler); + } + _destroy(error, callback) { + this.removeSourceEventHandlers(); + this.source.destroy(); + callback(error === null ? undefined : error); + } + } + + class BlobDownloadResponse { + get acceptRanges() { + return this.originalResponse.acceptRanges; + } + get cacheControl() { + return this.originalResponse.cacheControl; + } + get contentDisposition() { + return this.originalResponse.contentDisposition; + } + get contentEncoding() { + return this.originalResponse.contentEncoding; + } + get contentLanguage() { + return this.originalResponse.contentLanguage; + } + get blobSequenceNumber() { + return this.originalResponse.blobSequenceNumber; + } + get blobType() { + return this.originalResponse.blobType; + } + get contentLength() { + return this.originalResponse.contentLength; + } + get contentMD5() { + return this.originalResponse.contentMD5; + } + get contentRange() { + return this.originalResponse.contentRange; + } + get contentType() { + return this.originalResponse.contentType; + } + get copyCompletedOn() { + return this.originalResponse.copyCompletedOn; + } + get copyId() { + return this.originalResponse.copyId; + } + get copyProgress() { + return this.originalResponse.copyProgress; + } + get copySource() { + return this.originalResponse.copySource; + } + get copyStatus() { + return this.originalResponse.copyStatus; + } + get copyStatusDescription() { + return this.originalResponse.copyStatusDescription; + } + get leaseDuration() { + return this.originalResponse.leaseDuration; + } + get leaseState() { + return this.originalResponse.leaseState; + } + get leaseStatus() { + return this.originalResponse.leaseStatus; + } + get date() { + return this.originalResponse.date; + } + get blobCommittedBlockCount() { + return this.originalResponse.blobCommittedBlockCount; + } + get etag() { + return this.originalResponse.etag; + } + get tagCount() { + return this.originalResponse.tagCount; + } + get errorCode() { + return this.originalResponse.errorCode; + } + get isServerEncrypted() { + return this.originalResponse.isServerEncrypted; + } + get blobContentMD5() { + return this.originalResponse.blobContentMD5; + } + get lastModified() { + return this.originalResponse.lastModified; + } + get lastAccessed() { + return this.originalResponse.lastAccessed; + } + get createdOn() { + return this.originalResponse.createdOn; + } + get metadata() { + return this.originalResponse.metadata; + } + get requestId() { + return this.originalResponse.requestId; + } + get clientRequestId() { + return this.originalResponse.clientRequestId; + } + get version() { + return this.originalResponse.version; + } + get versionId() { + return this.originalResponse.versionId; + } + get isCurrentVersion() { + return this.originalResponse.isCurrentVersion; + } + get encryptionKeySha256() { + return this.originalResponse.encryptionKeySha256; + } + get contentCrc64() { + return this.originalResponse.contentCrc64; + } + get objectReplicationDestinationPolicyId() { + return this.originalResponse.objectReplicationDestinationPolicyId; + } + get objectReplicationSourceProperties() { + return this.originalResponse.objectReplicationSourceProperties; + } + get isSealed() { + return this.originalResponse.isSealed; + } + get immutabilityPolicyExpiresOn() { + return this.originalResponse.immutabilityPolicyExpiresOn; + } + get immutabilityPolicyMode() { + return this.originalResponse.immutabilityPolicyMode; + } + get legalHold() { + return this.originalResponse.legalHold; + } + get contentAsBlob() { + return this.originalResponse.blobBody; + } + get readableStreamBody() { + return coreUtil.isNode ? this.blobDownloadStream : undefined; + } + get _response() { + return this.originalResponse._response; + } + constructor(originalResponse, getter, offset, count, options = {}) { + this.originalResponse = originalResponse; + this.blobDownloadStream = new RetriableReadableStream(this.originalResponse.readableStreamBody, getter, offset, count, options); + } + } + var AVRO_SYNC_MARKER_SIZE = 16; + var AVRO_INIT_BYTES = new Uint8Array([79, 98, 106, 1]); + var AVRO_CODEC_KEY = "avro.codec"; + var AVRO_SCHEMA_KEY = "avro.schema"; + + class AvroParser { + static async readFixedBytes(stream2, length, options = {}) { + const bytes = await stream2.read(length, { abortSignal: options.abortSignal }); + if (bytes.length !== length) { + throw new Error("Hit stream end."); + } + return bytes; + } + static async readByte(stream2, options = {}) { + const buf = await AvroParser.readFixedBytes(stream2, 1, options); + return buf[0]; + } + static async readZigZagLong(stream2, options = {}) { + let zigZagEncoded = 0; + let significanceInBit = 0; + let byte, haveMoreByte, significanceInFloat; + do { + byte = await AvroParser.readByte(stream2, options); + haveMoreByte = byte & 128; + zigZagEncoded |= (byte & 127) << significanceInBit; + significanceInBit += 7; + } while (haveMoreByte && significanceInBit < 28); + if (haveMoreByte) { + zigZagEncoded = zigZagEncoded; + significanceInFloat = 268435456; + do { + byte = await AvroParser.readByte(stream2, options); + zigZagEncoded += (byte & 127) * significanceInFloat; + significanceInFloat *= 128; + } while (byte & 128); + const res = (zigZagEncoded % 2 ? -(zigZagEncoded + 1) : zigZagEncoded) / 2; + if (res < Number.MIN_SAFE_INTEGER || res > Number.MAX_SAFE_INTEGER) { + throw new Error("Integer overflow."); + } + return res; + } + return zigZagEncoded >> 1 ^ -(zigZagEncoded & 1); + } + static async readLong(stream2, options = {}) { + return AvroParser.readZigZagLong(stream2, options); + } + static async readInt(stream2, options = {}) { + return AvroParser.readZigZagLong(stream2, options); + } + static async readNull() { + return null; + } + static async readBoolean(stream2, options = {}) { + const b = await AvroParser.readByte(stream2, options); + if (b === 1) { + return true; + } else if (b === 0) { + return false; + } else { + throw new Error("Byte was not a boolean."); + } + } + static async readFloat(stream2, options = {}) { + const u8arr = await AvroParser.readFixedBytes(stream2, 4, options); + const view = new DataView(u8arr.buffer, u8arr.byteOffset, u8arr.byteLength); + return view.getFloat32(0, true); + } + static async readDouble(stream2, options = {}) { + const u8arr = await AvroParser.readFixedBytes(stream2, 8, options); + const view = new DataView(u8arr.buffer, u8arr.byteOffset, u8arr.byteLength); + return view.getFloat64(0, true); + } + static async readBytes(stream2, options = {}) { + const size = await AvroParser.readLong(stream2, options); + if (size < 0) { + throw new Error("Bytes size was negative."); + } + return stream2.read(size, { abortSignal: options.abortSignal }); + } + static async readString(stream2, options = {}) { + const u8arr = await AvroParser.readBytes(stream2, options); + const utf8decoder = new TextDecoder; + return utf8decoder.decode(u8arr); + } + static async readMapPair(stream2, readItemMethod, options = {}) { + const key = await AvroParser.readString(stream2, options); + const value = await readItemMethod(stream2, options); + return { key, value }; + } + static async readMap(stream2, readItemMethod, options = {}) { + const readPairMethod = (s, opts = {}) => { + return AvroParser.readMapPair(s, readItemMethod, opts); + }; + const pairs = await AvroParser.readArray(stream2, readPairMethod, options); + const dict = {}; + for (const pair of pairs) { + dict[pair.key] = pair.value; + } + return dict; + } + static async readArray(stream2, readItemMethod, options = {}) { + const items = []; + for (let count = await AvroParser.readLong(stream2, options);count !== 0; count = await AvroParser.readLong(stream2, options)) { + if (count < 0) { + await AvroParser.readLong(stream2, options); + count = -count; + } + while (count--) { + const item = await readItemMethod(stream2, options); + items.push(item); + } + } + return items; + } + } + var AvroComplex; + (function(AvroComplex2) { + AvroComplex2["RECORD"] = "record"; + AvroComplex2["ENUM"] = "enum"; + AvroComplex2["ARRAY"] = "array"; + AvroComplex2["MAP"] = "map"; + AvroComplex2["UNION"] = "union"; + AvroComplex2["FIXED"] = "fixed"; + })(AvroComplex || (AvroComplex = {})); + var AvroPrimitive; + (function(AvroPrimitive2) { + AvroPrimitive2["NULL"] = "null"; + AvroPrimitive2["BOOLEAN"] = "boolean"; + AvroPrimitive2["INT"] = "int"; + AvroPrimitive2["LONG"] = "long"; + AvroPrimitive2["FLOAT"] = "float"; + AvroPrimitive2["DOUBLE"] = "double"; + AvroPrimitive2["BYTES"] = "bytes"; + AvroPrimitive2["STRING"] = "string"; + })(AvroPrimitive || (AvroPrimitive = {})); + + class AvroType { + static fromSchema(schema) { + if (typeof schema === "string") { + return AvroType.fromStringSchema(schema); + } else if (Array.isArray(schema)) { + return AvroType.fromArraySchema(schema); + } else { + return AvroType.fromObjectSchema(schema); + } + } + static fromStringSchema(schema) { + switch (schema) { + case AvroPrimitive.NULL: + case AvroPrimitive.BOOLEAN: + case AvroPrimitive.INT: + case AvroPrimitive.LONG: + case AvroPrimitive.FLOAT: + case AvroPrimitive.DOUBLE: + case AvroPrimitive.BYTES: + case AvroPrimitive.STRING: + return new AvroPrimitiveType(schema); + default: + throw new Error(`Unexpected Avro type ${schema}`); + } + } + static fromArraySchema(schema) { + return new AvroUnionType(schema.map(AvroType.fromSchema)); + } + static fromObjectSchema(schema) { + const type = schema.type; + try { + return AvroType.fromStringSchema(type); + } catch (_a) { + } + switch (type) { + case AvroComplex.RECORD: + if (schema.aliases) { + throw new Error(`aliases currently is not supported, schema: ${schema}`); + } + if (!schema.name) { + throw new Error(`Required attribute 'name' doesn't exist on schema: ${schema}`); + } + const fields = {}; + if (!schema.fields) { + throw new Error(`Required attribute 'fields' doesn't exist on schema: ${schema}`); + } + for (const field of schema.fields) { + fields[field.name] = AvroType.fromSchema(field.type); + } + return new AvroRecordType(fields, schema.name); + case AvroComplex.ENUM: + if (schema.aliases) { + throw new Error(`aliases currently is not supported, schema: ${schema}`); + } + if (!schema.symbols) { + throw new Error(`Required attribute 'symbols' doesn't exist on schema: ${schema}`); + } + return new AvroEnumType(schema.symbols); + case AvroComplex.MAP: + if (!schema.values) { + throw new Error(`Required attribute 'values' doesn't exist on schema: ${schema}`); + } + return new AvroMapType(AvroType.fromSchema(schema.values)); + case AvroComplex.ARRAY: + case AvroComplex.FIXED: + default: + throw new Error(`Unexpected Avro type ${type} in ${schema}`); + } + } + } + + class AvroPrimitiveType extends AvroType { + constructor(primitive) { + super(); + this._primitive = primitive; + } + read(stream2, options = {}) { + switch (this._primitive) { + case AvroPrimitive.NULL: + return AvroParser.readNull(); + case AvroPrimitive.BOOLEAN: + return AvroParser.readBoolean(stream2, options); + case AvroPrimitive.INT: + return AvroParser.readInt(stream2, options); + case AvroPrimitive.LONG: + return AvroParser.readLong(stream2, options); + case AvroPrimitive.FLOAT: + return AvroParser.readFloat(stream2, options); + case AvroPrimitive.DOUBLE: + return AvroParser.readDouble(stream2, options); + case AvroPrimitive.BYTES: + return AvroParser.readBytes(stream2, options); + case AvroPrimitive.STRING: + return AvroParser.readString(stream2, options); + default: + throw new Error("Unknown Avro Primitive"); + } + } + } + + class AvroEnumType extends AvroType { + constructor(symbols) { + super(); + this._symbols = symbols; + } + async read(stream2, options = {}) { + const value = await AvroParser.readInt(stream2, options); + return this._symbols[value]; + } + } + + class AvroUnionType extends AvroType { + constructor(types) { + super(); + this._types = types; + } + async read(stream2, options = {}) { + const typeIndex = await AvroParser.readInt(stream2, options); + return this._types[typeIndex].read(stream2, options); + } + } + + class AvroMapType extends AvroType { + constructor(itemType) { + super(); + this._itemType = itemType; + } + read(stream2, options = {}) { + const readItemMethod = (s, opts) => { + return this._itemType.read(s, opts); + }; + return AvroParser.readMap(stream2, readItemMethod, options); + } + } + + class AvroRecordType extends AvroType { + constructor(fields, name) { + super(); + this._fields = fields; + this._name = name; + } + async read(stream2, options = {}) { + const record = {}; + record["$schema"] = this._name; + for (const key in this._fields) { + if (Object.prototype.hasOwnProperty.call(this._fields, key)) { + record[key] = await this._fields[key].read(stream2, options); + } + } + return record; + } + } + function arraysEqual(a, b) { + if (a === b) + return true; + if (a == null || b == null) + return false; + if (a.length !== b.length) + return false; + for (let i = 0;i < a.length; ++i) { + if (a[i] !== b[i]) + return false; + } + return true; + } + + class AvroReader { + get blockOffset() { + return this._blockOffset; + } + get objectIndex() { + return this._objectIndex; + } + constructor(dataStream, headerStream, currentBlockOffset, indexWithinCurrentBlock) { + this._dataStream = dataStream; + this._headerStream = headerStream || dataStream; + this._initialized = false; + this._blockOffset = currentBlockOffset || 0; + this._objectIndex = indexWithinCurrentBlock || 0; + this._initialBlockOffset = currentBlockOffset || 0; + } + async initialize(options = {}) { + const header = await AvroParser.readFixedBytes(this._headerStream, AVRO_INIT_BYTES.length, { + abortSignal: options.abortSignal + }); + if (!arraysEqual(header, AVRO_INIT_BYTES)) { + throw new Error("Stream is not an Avro file."); + } + this._metadata = await AvroParser.readMap(this._headerStream, AvroParser.readString, { + abortSignal: options.abortSignal + }); + const codec = this._metadata[AVRO_CODEC_KEY]; + if (!(codec === undefined || codec === null || codec === "null")) { + throw new Error("Codecs are not supported"); + } + this._syncMarker = await AvroParser.readFixedBytes(this._headerStream, AVRO_SYNC_MARKER_SIZE, { + abortSignal: options.abortSignal + }); + const schema = JSON.parse(this._metadata[AVRO_SCHEMA_KEY]); + this._itemType = AvroType.fromSchema(schema); + if (this._blockOffset === 0) { + this._blockOffset = this._initialBlockOffset + this._dataStream.position; + } + this._itemsRemainingInBlock = await AvroParser.readLong(this._dataStream, { + abortSignal: options.abortSignal + }); + await AvroParser.readLong(this._dataStream, { abortSignal: options.abortSignal }); + this._initialized = true; + if (this._objectIndex && this._objectIndex > 0) { + for (let i = 0;i < this._objectIndex; i++) { + await this._itemType.read(this._dataStream, { abortSignal: options.abortSignal }); + this._itemsRemainingInBlock--; + } + } + } + hasNext() { + return !this._initialized || this._itemsRemainingInBlock > 0; + } + parseObjects() { + return tslib.__asyncGenerator(this, arguments, function* parseObjects_1(options = {}) { + if (!this._initialized) { + yield tslib.__await(this.initialize(options)); + } + while (this.hasNext()) { + const result = yield tslib.__await(this._itemType.read(this._dataStream, { + abortSignal: options.abortSignal + })); + this._itemsRemainingInBlock--; + this._objectIndex++; + if (this._itemsRemainingInBlock === 0) { + const marker2 = yield tslib.__await(AvroParser.readFixedBytes(this._dataStream, AVRO_SYNC_MARKER_SIZE, { + abortSignal: options.abortSignal + })); + this._blockOffset = this._initialBlockOffset + this._dataStream.position; + this._objectIndex = 0; + if (!arraysEqual(this._syncMarker, marker2)) { + throw new Error("Stream is not a valid Avro file."); + } + try { + this._itemsRemainingInBlock = yield tslib.__await(AvroParser.readLong(this._dataStream, { + abortSignal: options.abortSignal + })); + } catch (_a) { + this._itemsRemainingInBlock = 0; + } + if (this._itemsRemainingInBlock > 0) { + yield tslib.__await(AvroParser.readLong(this._dataStream, { abortSignal: options.abortSignal })); + } + } + yield yield tslib.__await(result); + } + }); + } + } + + class AvroReadable { + } + var ABORT_ERROR = new abortController.AbortError("Reading from the avro stream was aborted."); + + class AvroReadableFromStream extends AvroReadable { + toUint8Array(data) { + if (typeof data === "string") { + return Buffer.from(data); + } + return data; + } + constructor(readable) { + super(); + this._readable = readable; + this._position = 0; + } + get position() { + return this._position; + } + async read(size, options = {}) { + var _a; + if ((_a = options.abortSignal) === null || _a === undefined ? undefined : _a.aborted) { + throw ABORT_ERROR; + } + if (size < 0) { + throw new Error(`size parameter should be positive: ${size}`); + } + if (size === 0) { + return new Uint8Array; + } + if (!this._readable.readable) { + throw new Error("Stream no longer readable."); + } + const chunk = this._readable.read(size); + if (chunk) { + this._position += chunk.length; + return this.toUint8Array(chunk); + } else { + return new Promise((resolve, reject) => { + const cleanUp = () => { + this._readable.removeListener("readable", readableCallback); + this._readable.removeListener("error", rejectCallback); + this._readable.removeListener("end", rejectCallback); + this._readable.removeListener("close", rejectCallback); + if (options.abortSignal) { + options.abortSignal.removeEventListener("abort", abortHandler); + } + }; + const readableCallback = () => { + const callbackChunk = this._readable.read(size); + if (callbackChunk) { + this._position += callbackChunk.length; + cleanUp(); + resolve(this.toUint8Array(callbackChunk)); + } + }; + const rejectCallback = () => { + cleanUp(); + reject(); + }; + const abortHandler = () => { + cleanUp(); + reject(ABORT_ERROR); + }; + this._readable.on("readable", readableCallback); + this._readable.once("error", rejectCallback); + this._readable.once("end", rejectCallback); + this._readable.once("close", rejectCallback); + if (options.abortSignal) { + options.abortSignal.addEventListener("abort", abortHandler); + } + }); + } + } + } + + class BlobQuickQueryStream extends stream.Readable { + constructor(source, options = {}) { + super(); + this.avroPaused = true; + this.source = source; + this.onProgress = options.onProgress; + this.onError = options.onError; + this.avroReader = new AvroReader(new AvroReadableFromStream(this.source)); + this.avroIter = this.avroReader.parseObjects({ abortSignal: options.abortSignal }); + } + _read() { + if (this.avroPaused) { + this.readInternal().catch((err) => { + this.emit("error", err); + }); + } + } + async readInternal() { + this.avroPaused = false; + let avroNext; + do { + avroNext = await this.avroIter.next(); + if (avroNext.done) { + break; + } + const obj = avroNext.value; + const schema = obj.$schema; + if (typeof schema !== "string") { + throw Error("Missing schema in avro record."); + } + switch (schema) { + case "com.microsoft.azure.storage.queryBlobContents.resultData": + { + const data = obj.data; + if (data instanceof Uint8Array === false) { + throw Error("Invalid data in avro result record."); + } + if (!this.push(Buffer.from(data))) { + this.avroPaused = true; + } + } + break; + case "com.microsoft.azure.storage.queryBlobContents.progress": + { + const bytesScanned = obj.bytesScanned; + if (typeof bytesScanned !== "number") { + throw Error("Invalid bytesScanned in avro progress record."); + } + if (this.onProgress) { + this.onProgress({ loadedBytes: bytesScanned }); + } + } + break; + case "com.microsoft.azure.storage.queryBlobContents.end": + if (this.onProgress) { + const totalBytes = obj.totalBytes; + if (typeof totalBytes !== "number") { + throw Error("Invalid totalBytes in avro end record."); + } + this.onProgress({ loadedBytes: totalBytes }); + } + this.push(null); + break; + case "com.microsoft.azure.storage.queryBlobContents.error": + if (this.onError) { + const fatal = obj.fatal; + if (typeof fatal !== "boolean") { + throw Error("Invalid fatal in avro error record."); + } + const name = obj.name; + if (typeof name !== "string") { + throw Error("Invalid name in avro error record."); + } + const description = obj.description; + if (typeof description !== "string") { + throw Error("Invalid description in avro error record."); + } + const position = obj.position; + if (typeof position !== "number") { + throw Error("Invalid position in avro error record."); + } + this.onError({ + position, + name, + isFatal: fatal, + description + }); + } + break; + default: + throw Error(`Unknown schema ${schema} in avro progress record.`); + } + } while (!avroNext.done && !this.avroPaused); + } + } + + class BlobQueryResponse { + get acceptRanges() { + return this.originalResponse.acceptRanges; + } + get cacheControl() { + return this.originalResponse.cacheControl; + } + get contentDisposition() { + return this.originalResponse.contentDisposition; + } + get contentEncoding() { + return this.originalResponse.contentEncoding; + } + get contentLanguage() { + return this.originalResponse.contentLanguage; + } + get blobSequenceNumber() { + return this.originalResponse.blobSequenceNumber; + } + get blobType() { + return this.originalResponse.blobType; + } + get contentLength() { + return this.originalResponse.contentLength; + } + get contentMD5() { + return this.originalResponse.contentMD5; + } + get contentRange() { + return this.originalResponse.contentRange; + } + get contentType() { + return this.originalResponse.contentType; + } + get copyCompletedOn() { + return; + } + get copyId() { + return this.originalResponse.copyId; + } + get copyProgress() { + return this.originalResponse.copyProgress; + } + get copySource() { + return this.originalResponse.copySource; + } + get copyStatus() { + return this.originalResponse.copyStatus; + } + get copyStatusDescription() { + return this.originalResponse.copyStatusDescription; + } + get leaseDuration() { + return this.originalResponse.leaseDuration; + } + get leaseState() { + return this.originalResponse.leaseState; + } + get leaseStatus() { + return this.originalResponse.leaseStatus; + } + get date() { + return this.originalResponse.date; + } + get blobCommittedBlockCount() { + return this.originalResponse.blobCommittedBlockCount; + } + get etag() { + return this.originalResponse.etag; + } + get errorCode() { + return this.originalResponse.errorCode; + } + get isServerEncrypted() { + return this.originalResponse.isServerEncrypted; + } + get blobContentMD5() { + return this.originalResponse.blobContentMD5; + } + get lastModified() { + return this.originalResponse.lastModified; + } + get metadata() { + return this.originalResponse.metadata; + } + get requestId() { + return this.originalResponse.requestId; + } + get clientRequestId() { + return this.originalResponse.clientRequestId; + } + get version() { + return this.originalResponse.version; + } + get encryptionKeySha256() { + return this.originalResponse.encryptionKeySha256; + } + get contentCrc64() { + return this.originalResponse.contentCrc64; + } + get blobBody() { + return; + } + get readableStreamBody() { + return coreUtil.isNode ? this.blobDownloadStream : undefined; + } + get _response() { + return this.originalResponse._response; + } + constructor(originalResponse, options = {}) { + this.originalResponse = originalResponse; + this.blobDownloadStream = new BlobQuickQueryStream(this.originalResponse.readableStreamBody, options); + } + } + exports2.BlockBlobTier = undefined; + (function(BlockBlobTier) { + BlockBlobTier["Hot"] = "Hot"; + BlockBlobTier["Cool"] = "Cool"; + BlockBlobTier["Cold"] = "Cold"; + BlockBlobTier["Archive"] = "Archive"; + })(exports2.BlockBlobTier || (exports2.BlockBlobTier = {})); + exports2.PremiumPageBlobTier = undefined; + (function(PremiumPageBlobTier) { + PremiumPageBlobTier["P4"] = "P4"; + PremiumPageBlobTier["P6"] = "P6"; + PremiumPageBlobTier["P10"] = "P10"; + PremiumPageBlobTier["P15"] = "P15"; + PremiumPageBlobTier["P20"] = "P20"; + PremiumPageBlobTier["P30"] = "P30"; + PremiumPageBlobTier["P40"] = "P40"; + PremiumPageBlobTier["P50"] = "P50"; + PremiumPageBlobTier["P60"] = "P60"; + PremiumPageBlobTier["P70"] = "P70"; + PremiumPageBlobTier["P80"] = "P80"; + })(exports2.PremiumPageBlobTier || (exports2.PremiumPageBlobTier = {})); + function toAccessTier(tier2) { + if (tier2 === undefined) { + return; + } + return tier2; + } + function ensureCpkIfSpecified(cpk, isHttps) { + if (cpk && !isHttps) { + throw new RangeError("Customer-provided encryption key must be used over HTTPS."); + } + if (cpk && !cpk.encryptionAlgorithm) { + cpk.encryptionAlgorithm = EncryptionAlgorithmAES25; + } + } + exports2.StorageBlobAudience = undefined; + (function(StorageBlobAudience) { + StorageBlobAudience["StorageOAuthScopes"] = "https://storage.azure.com/.default"; + StorageBlobAudience["DiskComputeOAuthScopes"] = "https://disk.compute.azure.com/.default"; + })(exports2.StorageBlobAudience || (exports2.StorageBlobAudience = {})); + function getBlobServiceAccountAudience(storageAccountName) { + return `https://${storageAccountName}.blob.core.windows.net/.default`; + } + function rangeResponseFromModel(response) { + const pageRange = (response._response.parsedBody.pageRange || []).map((x) => ({ + offset: x.start, + count: x.end - x.start + })); + const clearRange = (response._response.parsedBody.clearRange || []).map((x) => ({ + offset: x.start, + count: x.end - x.start + })); + return Object.assign(Object.assign({}, response), { + pageRange, + clearRange, + _response: Object.assign(Object.assign({}, response._response), { parsedBody: { + pageRange, + clearRange + } }) + }); + } + + class BlobBeginCopyFromUrlPoller extends coreLro.Poller { + constructor(options) { + const { blobClient, copySource: copySource2, intervalInMs = 15000, onProgress, resumeFrom, startCopyFromURLOptions } = options; + let state; + if (resumeFrom) { + state = JSON.parse(resumeFrom).state; + } + const operation = makeBlobBeginCopyFromURLPollOperation(Object.assign(Object.assign({}, state), { + blobClient, + copySource: copySource2, + startCopyFromURLOptions + })); + super(operation); + if (typeof onProgress === "function") { + this.onProgress(onProgress); + } + this.intervalInMs = intervalInMs; + } + delay() { + return coreUtil.delay(this.intervalInMs); + } + } + var cancel = async function cancel(options = {}) { + const state = this.state; + const { copyId: copyId2 } = state; + if (state.isCompleted) { + return makeBlobBeginCopyFromURLPollOperation(state); + } + if (!copyId2) { + state.isCancelled = true; + return makeBlobBeginCopyFromURLPollOperation(state); + } + await state.blobClient.abortCopyFromURL(copyId2, { + abortSignal: options.abortSignal + }); + state.isCancelled = true; + return makeBlobBeginCopyFromURLPollOperation(state); + }; + var update = async function update(options = {}) { + const state = this.state; + const { blobClient, copySource: copySource2, startCopyFromURLOptions } = state; + if (!state.isStarted) { + state.isStarted = true; + const result = await blobClient.startCopyFromURL(copySource2, startCopyFromURLOptions); + state.copyId = result.copyId; + if (result.copyStatus === "success") { + state.result = result; + state.isCompleted = true; + } + } else if (!state.isCompleted) { + try { + const result = await state.blobClient.getProperties({ abortSignal: options.abortSignal }); + const { copyStatus, copyProgress } = result; + const prevCopyProgress = state.copyProgress; + if (copyProgress) { + state.copyProgress = copyProgress; + } + if (copyStatus === "pending" && copyProgress !== prevCopyProgress && typeof options.fireProgress === "function") { + options.fireProgress(state); + } else if (copyStatus === "success") { + state.result = result; + state.isCompleted = true; + } else if (copyStatus === "failed") { + state.error = new Error(`Blob copy failed with reason: "${result.copyStatusDescription || "unknown"}"`); + state.isCompleted = true; + } + } catch (err) { + state.error = err; + state.isCompleted = true; + } + } + return makeBlobBeginCopyFromURLPollOperation(state); + }; + var toString = function toString() { + return JSON.stringify({ state: this.state }, (key, value) => { + if (key === "blobClient") { + return; + } + return value; + }); + }; + function makeBlobBeginCopyFromURLPollOperation(state) { + return { + state: Object.assign({}, state), + cancel, + toString, + update + }; + } + function rangeToString(iRange) { + if (iRange.offset < 0) { + throw new RangeError(`Range.offset cannot be smaller than 0.`); + } + if (iRange.count && iRange.count <= 0) { + throw new RangeError(`Range.count must be larger than 0. Leave it undefined if you want a range from offset to the end.`); + } + return iRange.count ? `bytes=${iRange.offset}-${iRange.offset + iRange.count - 1}` : `bytes=${iRange.offset}-`; + } + var BatchStates; + (function(BatchStates2) { + BatchStates2[BatchStates2["Good"] = 0] = "Good"; + BatchStates2[BatchStates2["Error"] = 1] = "Error"; + })(BatchStates || (BatchStates = {})); + + class Batch { + constructor(concurrency = 5) { + this.actives = 0; + this.completed = 0; + this.offset = 0; + this.operations = []; + this.state = BatchStates.Good; + if (concurrency < 1) { + throw new RangeError("concurrency must be larger than 0"); + } + this.concurrency = concurrency; + this.emitter = new events.EventEmitter; + } + addOperation(operation) { + this.operations.push(async () => { + try { + this.actives++; + await operation(); + this.actives--; + this.completed++; + this.parallelExecute(); + } catch (error) { + this.emitter.emit("error", error); + } + }); + } + async do() { + if (this.operations.length === 0) { + return Promise.resolve(); + } + this.parallelExecute(); + return new Promise((resolve, reject) => { + this.emitter.on("finish", resolve); + this.emitter.on("error", (error) => { + this.state = BatchStates.Error; + reject(error); + }); + }); + } + nextOperation() { + if (this.offset < this.operations.length) { + return this.operations[this.offset++]; + } + return null; + } + parallelExecute() { + if (this.state === BatchStates.Error) { + return; + } + if (this.completed >= this.operations.length) { + this.emitter.emit("finish"); + return; + } + while (this.actives < this.concurrency) { + const operation = this.nextOperation(); + if (operation) { + operation(); + } else { + return; + } + } + } + } + + class BuffersStream extends stream.Readable { + constructor(buffers, byteLength, options) { + super(options); + this.buffers = buffers; + this.byteLength = byteLength; + this.byteOffsetInCurrentBuffer = 0; + this.bufferIndex = 0; + this.pushedBytesLength = 0; + let buffersLength = 0; + for (const buf of this.buffers) { + buffersLength += buf.byteLength; + } + if (buffersLength < this.byteLength) { + throw new Error("Data size shouldn't be larger than the total length of buffers."); + } + } + _read(size) { + if (this.pushedBytesLength >= this.byteLength) { + this.push(null); + } + if (!size) { + size = this.readableHighWaterMark; + } + const outBuffers = []; + let i = 0; + while (i < size && this.pushedBytesLength < this.byteLength) { + const remainingDataInAllBuffers = this.byteLength - this.pushedBytesLength; + const remainingCapacityInThisBuffer = this.buffers[this.bufferIndex].byteLength - this.byteOffsetInCurrentBuffer; + const remaining = Math.min(remainingCapacityInThisBuffer, remainingDataInAllBuffers); + if (remaining > size - i) { + const end = this.byteOffsetInCurrentBuffer + size - i; + outBuffers.push(this.buffers[this.bufferIndex].slice(this.byteOffsetInCurrentBuffer, end)); + this.pushedBytesLength += size - i; + this.byteOffsetInCurrentBuffer = end; + i = size; + break; + } else { + const end = this.byteOffsetInCurrentBuffer + remaining; + outBuffers.push(this.buffers[this.bufferIndex].slice(this.byteOffsetInCurrentBuffer, end)); + if (remaining === remainingCapacityInThisBuffer) { + this.byteOffsetInCurrentBuffer = 0; + this.bufferIndex++; + } else { + this.byteOffsetInCurrentBuffer = end; + } + this.pushedBytesLength += remaining; + i += remaining; + } + } + if (outBuffers.length > 1) { + this.push(Buffer.concat(outBuffers)); + } else if (outBuffers.length === 1) { + this.push(outBuffers[0]); + } + } + } + var maxBufferLength = buffer.constants.MAX_LENGTH; + + class PooledBuffer { + get size() { + return this._size; + } + constructor(capacity, buffers, totalLength) { + this.buffers = []; + this.capacity = capacity; + this._size = 0; + const bufferNum = Math.ceil(capacity / maxBufferLength); + for (let i = 0;i < bufferNum; i++) { + let len = i === bufferNum - 1 ? capacity % maxBufferLength : maxBufferLength; + if (len === 0) { + len = maxBufferLength; + } + this.buffers.push(Buffer.allocUnsafe(len)); + } + if (buffers) { + this.fill(buffers, totalLength); + } + } + fill(buffers, totalLength) { + this._size = Math.min(this.capacity, totalLength); + let i = 0, j = 0, targetOffset = 0, sourceOffset = 0, totalCopiedNum = 0; + while (totalCopiedNum < this._size) { + const source = buffers[i]; + const target = this.buffers[j]; + const copiedNum = source.copy(target, targetOffset, sourceOffset); + totalCopiedNum += copiedNum; + sourceOffset += copiedNum; + targetOffset += copiedNum; + if (sourceOffset === source.length) { + i++; + sourceOffset = 0; + } + if (targetOffset === target.length) { + j++; + targetOffset = 0; + } + } + buffers.splice(0, i); + if (buffers.length > 0) { + buffers[0] = buffers[0].slice(sourceOffset); + } + } + getReadableStream() { + return new BuffersStream(this.buffers, this.size); + } + } + + class BufferScheduler { + constructor(readable, bufferSize, maxBuffers, outgoingHandler, concurrency, encoding) { + this.emitter = new events.EventEmitter; + this.offset = 0; + this.isStreamEnd = false; + this.isError = false; + this.executingOutgoingHandlers = 0; + this.numBuffers = 0; + this.unresolvedDataArray = []; + this.unresolvedLength = 0; + this.incoming = []; + this.outgoing = []; + if (bufferSize <= 0) { + throw new RangeError(`bufferSize must be larger than 0, current is ${bufferSize}`); + } + if (maxBuffers <= 0) { + throw new RangeError(`maxBuffers must be larger than 0, current is ${maxBuffers}`); + } + if (concurrency <= 0) { + throw new RangeError(`concurrency must be larger than 0, current is ${concurrency}`); + } + this.bufferSize = bufferSize; + this.maxBuffers = maxBuffers; + this.readable = readable; + this.outgoingHandler = outgoingHandler; + this.concurrency = concurrency; + this.encoding = encoding; + } + async do() { + return new Promise((resolve, reject) => { + this.readable.on("data", (data) => { + data = typeof data === "string" ? Buffer.from(data, this.encoding) : data; + this.appendUnresolvedData(data); + if (!this.resolveData()) { + this.readable.pause(); + } + }); + this.readable.on("error", (err) => { + this.emitter.emit("error", err); + }); + this.readable.on("end", () => { + this.isStreamEnd = true; + this.emitter.emit("checkEnd"); + }); + this.emitter.on("error", (err) => { + this.isError = true; + this.readable.pause(); + reject(err); + }); + this.emitter.on("checkEnd", () => { + if (this.outgoing.length > 0) { + this.triggerOutgoingHandlers(); + return; + } + if (this.isStreamEnd && this.executingOutgoingHandlers === 0) { + if (this.unresolvedLength > 0 && this.unresolvedLength < this.bufferSize) { + const buffer2 = this.shiftBufferFromUnresolvedDataArray(); + this.outgoingHandler(() => buffer2.getReadableStream(), buffer2.size, this.offset).then(resolve).catch(reject); + } else if (this.unresolvedLength >= this.bufferSize) { + return; + } else { + resolve(); + } + } + }); + }); + } + appendUnresolvedData(data) { + this.unresolvedDataArray.push(data); + this.unresolvedLength += data.length; + } + shiftBufferFromUnresolvedDataArray(buffer2) { + if (!buffer2) { + buffer2 = new PooledBuffer(this.bufferSize, this.unresolvedDataArray, this.unresolvedLength); + } else { + buffer2.fill(this.unresolvedDataArray, this.unresolvedLength); + } + this.unresolvedLength -= buffer2.size; + return buffer2; + } + resolveData() { + while (this.unresolvedLength >= this.bufferSize) { + let buffer2; + if (this.incoming.length > 0) { + buffer2 = this.incoming.shift(); + this.shiftBufferFromUnresolvedDataArray(buffer2); + } else { + if (this.numBuffers < this.maxBuffers) { + buffer2 = this.shiftBufferFromUnresolvedDataArray(); + this.numBuffers++; + } else { + return false; + } + } + this.outgoing.push(buffer2); + this.triggerOutgoingHandlers(); + } + return true; + } + async triggerOutgoingHandlers() { + let buffer2; + do { + if (this.executingOutgoingHandlers >= this.concurrency) { + return; + } + buffer2 = this.outgoing.shift(); + if (buffer2) { + this.triggerOutgoingHandler(buffer2); + } + } while (buffer2); + } + async triggerOutgoingHandler(buffer2) { + const bufferLength = buffer2.size; + this.executingOutgoingHandlers++; + this.offset += bufferLength; + try { + await this.outgoingHandler(() => buffer2.getReadableStream(), bufferLength, this.offset - bufferLength); + } catch (err) { + this.emitter.emit("error", err); + return; + } + this.executingOutgoingHandlers--; + this.reuseBuffer(buffer2); + this.emitter.emit("checkEnd"); + } + reuseBuffer(buffer2) { + this.incoming.push(buffer2); + if (!this.isError && this.resolveData() && !this.isStreamEnd) { + this.readable.resume(); + } + } + } + async function streamToBuffer(stream2, buffer2, offset, end, encoding) { + let pos = 0; + const count = end - offset; + return new Promise((resolve, reject) => { + const timeout = setTimeout(() => reject(new Error(`The operation cannot be completed in timeout.`)), REQUEST_TIMEOUT); + stream2.on("readable", () => { + if (pos >= count) { + clearTimeout(timeout); + resolve(); + return; + } + let chunk = stream2.read(); + if (!chunk) { + return; + } + if (typeof chunk === "string") { + chunk = Buffer.from(chunk, encoding); + } + const chunkLength = pos + chunk.length > count ? count - pos : chunk.length; + buffer2.fill(chunk.slice(0, chunkLength), offset + pos, offset + pos + chunkLength); + pos += chunkLength; + }); + stream2.on("end", () => { + clearTimeout(timeout); + if (pos < count) { + reject(new Error(`Stream drains before getting enough data needed. Data read: ${pos}, data need: ${count}`)); + } + resolve(); + }); + stream2.on("error", (msg) => { + clearTimeout(timeout); + reject(msg); + }); + }); + } + async function streamToBuffer2(stream2, buffer2, encoding) { + let pos = 0; + const bufferSize = buffer2.length; + return new Promise((resolve, reject) => { + stream2.on("readable", () => { + let chunk = stream2.read(); + if (!chunk) { + return; + } + if (typeof chunk === "string") { + chunk = Buffer.from(chunk, encoding); + } + if (pos + chunk.length > bufferSize) { + reject(new Error(`Stream exceeds buffer size. Buffer size: ${bufferSize}`)); + return; + } + buffer2.fill(chunk, pos, pos + chunk.length); + pos += chunk.length; + }); + stream2.on("end", () => { + resolve(pos); + }); + stream2.on("error", reject); + }); + } + async function readStreamToLocalFile(rs, file) { + return new Promise((resolve, reject) => { + const ws = fs__namespace.createWriteStream(file); + rs.on("error", (err) => { + reject(err); + }); + ws.on("error", (err) => { + reject(err); + }); + ws.on("close", resolve); + rs.pipe(ws); + }); + } + var fsStat = util__namespace.promisify(fs__namespace.stat); + var fsCreateReadStream = fs__namespace.createReadStream; + + class BlobClient extends StorageClient { + get name() { + return this._name; + } + get containerName() { + return this._containerName; + } + constructor(urlOrConnectionString, credentialOrPipelineOrContainerName, blobNameOrOptions, options) { + options = options || {}; + let pipeline; + let url2; + if (isPipelineLike(credentialOrPipelineOrContainerName)) { + url2 = urlOrConnectionString; + pipeline = credentialOrPipelineOrContainerName; + } else if (coreUtil.isNode && credentialOrPipelineOrContainerName instanceof StorageSharedKeyCredential || credentialOrPipelineOrContainerName instanceof AnonymousCredential || coreAuth.isTokenCredential(credentialOrPipelineOrContainerName)) { + url2 = urlOrConnectionString; + options = blobNameOrOptions; + pipeline = newPipeline(credentialOrPipelineOrContainerName, options); + } else if (!credentialOrPipelineOrContainerName && typeof credentialOrPipelineOrContainerName !== "string") { + url2 = urlOrConnectionString; + if (blobNameOrOptions && typeof blobNameOrOptions !== "string") { + options = blobNameOrOptions; + } + pipeline = newPipeline(new AnonymousCredential, options); + } else if (credentialOrPipelineOrContainerName && typeof credentialOrPipelineOrContainerName === "string" && blobNameOrOptions && typeof blobNameOrOptions === "string") { + const containerName = credentialOrPipelineOrContainerName; + const blobName = blobNameOrOptions; + const extractedCreds = extractConnectionStringParts(urlOrConnectionString); + if (extractedCreds.kind === "AccountConnString") { + if (coreUtil.isNode) { + const sharedKeyCredential = new StorageSharedKeyCredential(extractedCreds.accountName, extractedCreds.accountKey); + url2 = appendToURLPath(appendToURLPath(extractedCreds.url, encodeURIComponent(containerName)), encodeURIComponent(blobName)); + if (!options.proxyOptions) { + options.proxyOptions = coreRestPipeline.getDefaultProxySettings(extractedCreds.proxyUri); + } + pipeline = newPipeline(sharedKeyCredential, options); + } else { + throw new Error("Account connection string is only supported in Node.js environment"); + } + } else if (extractedCreds.kind === "SASConnString") { + url2 = appendToURLPath(appendToURLPath(extractedCreds.url, encodeURIComponent(containerName)), encodeURIComponent(blobName)) + "?" + extractedCreds.accountSas; + pipeline = newPipeline(new AnonymousCredential, options); + } else { + throw new Error("Connection string must be either an Account connection string or a SAS connection string"); + } + } else { + throw new Error("Expecting non-empty strings for containerName and blobName parameters"); + } + super(url2, pipeline); + ({ blobName: this._name, containerName: this._containerName } = this.getBlobAndContainerNamesFromUrl()); + this.blobContext = this.storageClientContext.blob; + this._snapshot = getURLParameter(this.url, URLConstants.Parameters.SNAPSHOT); + this._versionId = getURLParameter(this.url, URLConstants.Parameters.VERSIONID); + } + withSnapshot(snapshot2) { + return new BlobClient(setURLParameter(this.url, URLConstants.Parameters.SNAPSHOT, snapshot2.length === 0 ? undefined : snapshot2), this.pipeline); + } + withVersion(versionId2) { + return new BlobClient(setURLParameter(this.url, URLConstants.Parameters.VERSIONID, versionId2.length === 0 ? undefined : versionId2), this.pipeline); + } + getAppendBlobClient() { + return new AppendBlobClient(this.url, this.pipeline); + } + getBlockBlobClient() { + return new BlockBlobClient(this.url, this.pipeline); + } + getPageBlobClient() { + return new PageBlobClient(this.url, this.pipeline); + } + async download(offset = 0, count, options = {}) { + options.conditions = options.conditions || {}; + options.conditions = options.conditions || {}; + ensureCpkIfSpecified(options.customerProvidedKey, this.isHttps); + return tracingClient.withSpan("BlobClient-download", options, async (updatedOptions) => { + var _a; + const res = assertResponse(await this.blobContext.download({ + abortSignal: options.abortSignal, + leaseAccessConditions: options.conditions, + modifiedAccessConditions: Object.assign(Object.assign({}, options.conditions), { ifTags: (_a = options.conditions) === null || _a === undefined ? undefined : _a.tagConditions }), + requestOptions: { + onDownloadProgress: coreUtil.isNode ? undefined : options.onProgress + }, + range: offset === 0 && !count ? undefined : rangeToString({ offset, count }), + rangeGetContentMD5: options.rangeGetContentMD5, + rangeGetContentCRC64: options.rangeGetContentCrc64, + snapshot: options.snapshot, + cpkInfo: options.customerProvidedKey, + tracingOptions: updatedOptions.tracingOptions + })); + const wrappedRes = Object.assign(Object.assign({}, res), { _response: res._response, objectReplicationDestinationPolicyId: res.objectReplicationPolicyId, objectReplicationSourceProperties: parseObjectReplicationRecord(res.objectReplicationRules) }); + if (!coreUtil.isNode) { + return wrappedRes; + } + if (options.maxRetryRequests === undefined || options.maxRetryRequests < 0) { + options.maxRetryRequests = DEFAULT_MAX_DOWNLOAD_RETRY_REQUESTS; + } + if (res.contentLength === undefined) { + throw new RangeError(`File download response doesn't contain valid content length header`); + } + if (!res.etag) { + throw new RangeError(`File download response doesn't contain valid etag header`); + } + return new BlobDownloadResponse(wrappedRes, async (start) => { + var _a2; + const updatedDownloadOptions = { + leaseAccessConditions: options.conditions, + modifiedAccessConditions: { + ifMatch: options.conditions.ifMatch || res.etag, + ifModifiedSince: options.conditions.ifModifiedSince, + ifNoneMatch: options.conditions.ifNoneMatch, + ifUnmodifiedSince: options.conditions.ifUnmodifiedSince, + ifTags: (_a2 = options.conditions) === null || _a2 === undefined ? undefined : _a2.tagConditions + }, + range: rangeToString({ + count: offset + res.contentLength - start, + offset: start + }), + rangeGetContentMD5: options.rangeGetContentMD5, + rangeGetContentCRC64: options.rangeGetContentCrc64, + snapshot: options.snapshot, + cpkInfo: options.customerProvidedKey + }; + return (await this.blobContext.download(Object.assign({ abortSignal: options.abortSignal }, updatedDownloadOptions))).readableStreamBody; + }, offset, res.contentLength, { + maxRetryRequests: options.maxRetryRequests, + onProgress: options.onProgress + }); + }); + } + async exists(options = {}) { + return tracingClient.withSpan("BlobClient-exists", options, async (updatedOptions) => { + try { + ensureCpkIfSpecified(options.customerProvidedKey, this.isHttps); + await this.getProperties({ + abortSignal: options.abortSignal, + customerProvidedKey: options.customerProvidedKey, + conditions: options.conditions, + tracingOptions: updatedOptions.tracingOptions + }); + return true; + } catch (e) { + if (e.statusCode === 404) { + return false; + } else if (e.statusCode === 409 && (e.details.errorCode === BlobUsesCustomerSpecifiedEncryptionMsg || e.details.errorCode === BlobDoesNotUseCustomerSpecifiedEncryption)) { + return true; + } + throw e; + } + }); + } + async getProperties(options = {}) { + options.conditions = options.conditions || {}; + ensureCpkIfSpecified(options.customerProvidedKey, this.isHttps); + return tracingClient.withSpan("BlobClient-getProperties", options, async (updatedOptions) => { + var _a; + const res = assertResponse(await this.blobContext.getProperties({ + abortSignal: options.abortSignal, + leaseAccessConditions: options.conditions, + modifiedAccessConditions: Object.assign(Object.assign({}, options.conditions), { ifTags: (_a = options.conditions) === null || _a === undefined ? undefined : _a.tagConditions }), + cpkInfo: options.customerProvidedKey, + tracingOptions: updatedOptions.tracingOptions + })); + return Object.assign(Object.assign({}, res), { _response: res._response, objectReplicationDestinationPolicyId: res.objectReplicationPolicyId, objectReplicationSourceProperties: parseObjectReplicationRecord(res.objectReplicationRules) }); + }); + } + async delete(options = {}) { + options.conditions = options.conditions || {}; + return tracingClient.withSpan("BlobClient-delete", options, async (updatedOptions) => { + var _a; + return assertResponse(await this.blobContext.delete({ + abortSignal: options.abortSignal, + deleteSnapshots: options.deleteSnapshots, + leaseAccessConditions: options.conditions, + modifiedAccessConditions: Object.assign(Object.assign({}, options.conditions), { ifTags: (_a = options.conditions) === null || _a === undefined ? undefined : _a.tagConditions }), + tracingOptions: updatedOptions.tracingOptions + })); + }); + } + async deleteIfExists(options = {}) { + return tracingClient.withSpan("BlobClient-deleteIfExists", options, async (updatedOptions) => { + var _a, _b; + try { + const res = assertResponse(await this.delete(updatedOptions)); + return Object.assign(Object.assign({ succeeded: true }, res), { _response: res._response }); + } catch (e) { + if (((_a = e.details) === null || _a === undefined ? undefined : _a.errorCode) === "BlobNotFound") { + return Object.assign(Object.assign({ succeeded: false }, (_b = e.response) === null || _b === undefined ? undefined : _b.parsedHeaders), { _response: e.response }); + } + throw e; + } + }); + } + async undelete(options = {}) { + return tracingClient.withSpan("BlobClient-undelete", options, async (updatedOptions) => { + return assertResponse(await this.blobContext.undelete({ + abortSignal: options.abortSignal, + tracingOptions: updatedOptions.tracingOptions + })); + }); + } + async setHTTPHeaders(blobHTTPHeaders, options = {}) { + options.conditions = options.conditions || {}; + ensureCpkIfSpecified(options.customerProvidedKey, this.isHttps); + return tracingClient.withSpan("BlobClient-setHTTPHeaders", options, async (updatedOptions) => { + var _a; + return assertResponse(await this.blobContext.setHttpHeaders({ + abortSignal: options.abortSignal, + blobHttpHeaders: blobHTTPHeaders, + leaseAccessConditions: options.conditions, + modifiedAccessConditions: Object.assign(Object.assign({}, options.conditions), { ifTags: (_a = options.conditions) === null || _a === undefined ? undefined : _a.tagConditions }), + tracingOptions: updatedOptions.tracingOptions + })); + }); + } + async setMetadata(metadata2, options = {}) { + options.conditions = options.conditions || {}; + ensureCpkIfSpecified(options.customerProvidedKey, this.isHttps); + return tracingClient.withSpan("BlobClient-setMetadata", options, async (updatedOptions) => { + var _a; + return assertResponse(await this.blobContext.setMetadata({ + abortSignal: options.abortSignal, + leaseAccessConditions: options.conditions, + metadata: metadata2, + modifiedAccessConditions: Object.assign(Object.assign({}, options.conditions), { ifTags: (_a = options.conditions) === null || _a === undefined ? undefined : _a.tagConditions }), + cpkInfo: options.customerProvidedKey, + encryptionScope: options.encryptionScope, + tracingOptions: updatedOptions.tracingOptions + })); + }); + } + async setTags(tags2, options = {}) { + return tracingClient.withSpan("BlobClient-setTags", options, async (updatedOptions) => { + var _a; + return assertResponse(await this.blobContext.setTags({ + abortSignal: options.abortSignal, + leaseAccessConditions: options.conditions, + modifiedAccessConditions: Object.assign(Object.assign({}, options.conditions), { ifTags: (_a = options.conditions) === null || _a === undefined ? undefined : _a.tagConditions }), + tracingOptions: updatedOptions.tracingOptions, + tags: toBlobTags(tags2) + })); + }); + } + async getTags(options = {}) { + return tracingClient.withSpan("BlobClient-getTags", options, async (updatedOptions) => { + var _a; + const response = assertResponse(await this.blobContext.getTags({ + abortSignal: options.abortSignal, + leaseAccessConditions: options.conditions, + modifiedAccessConditions: Object.assign(Object.assign({}, options.conditions), { ifTags: (_a = options.conditions) === null || _a === undefined ? undefined : _a.tagConditions }), + tracingOptions: updatedOptions.tracingOptions + })); + const wrappedResponse = Object.assign(Object.assign({}, response), { _response: response._response, tags: toTags({ blobTagSet: response.blobTagSet }) || {} }); + return wrappedResponse; + }); + } + getBlobLeaseClient(proposeLeaseId) { + return new BlobLeaseClient(this, proposeLeaseId); + } + async createSnapshot(options = {}) { + options.conditions = options.conditions || {}; + ensureCpkIfSpecified(options.customerProvidedKey, this.isHttps); + return tracingClient.withSpan("BlobClient-createSnapshot", options, async (updatedOptions) => { + var _a; + return assertResponse(await this.blobContext.createSnapshot({ + abortSignal: options.abortSignal, + leaseAccessConditions: options.conditions, + metadata: options.metadata, + modifiedAccessConditions: Object.assign(Object.assign({}, options.conditions), { ifTags: (_a = options.conditions) === null || _a === undefined ? undefined : _a.tagConditions }), + cpkInfo: options.customerProvidedKey, + encryptionScope: options.encryptionScope, + tracingOptions: updatedOptions.tracingOptions + })); + }); + } + async beginCopyFromURL(copySource2, options = {}) { + const client = { + abortCopyFromURL: (...args) => this.abortCopyFromURL(...args), + getProperties: (...args) => this.getProperties(...args), + startCopyFromURL: (...args) => this.startCopyFromURL(...args) + }; + const poller = new BlobBeginCopyFromUrlPoller({ + blobClient: client, + copySource: copySource2, + intervalInMs: options.intervalInMs, + onProgress: options.onProgress, + resumeFrom: options.resumeFrom, + startCopyFromURLOptions: options + }); + await poller.poll(); + return poller; + } + async abortCopyFromURL(copyId2, options = {}) { + return tracingClient.withSpan("BlobClient-abortCopyFromURL", options, async (updatedOptions) => { + return assertResponse(await this.blobContext.abortCopyFromURL(copyId2, { + abortSignal: options.abortSignal, + leaseAccessConditions: options.conditions, + tracingOptions: updatedOptions.tracingOptions + })); + }); + } + async syncCopyFromURL(copySource2, options = {}) { + options.conditions = options.conditions || {}; + options.sourceConditions = options.sourceConditions || {}; + return tracingClient.withSpan("BlobClient-syncCopyFromURL", options, async (updatedOptions) => { + var _a, _b, _c, _d, _e, _f, _g; + return assertResponse(await this.blobContext.copyFromURL(copySource2, { + abortSignal: options.abortSignal, + metadata: options.metadata, + leaseAccessConditions: options.conditions, + modifiedAccessConditions: Object.assign(Object.assign({}, options.conditions), { ifTags: (_a = options.conditions) === null || _a === undefined ? undefined : _a.tagConditions }), + sourceModifiedAccessConditions: { + sourceIfMatch: (_b = options.sourceConditions) === null || _b === undefined ? undefined : _b.ifMatch, + sourceIfModifiedSince: (_c = options.sourceConditions) === null || _c === undefined ? undefined : _c.ifModifiedSince, + sourceIfNoneMatch: (_d = options.sourceConditions) === null || _d === undefined ? undefined : _d.ifNoneMatch, + sourceIfUnmodifiedSince: (_e = options.sourceConditions) === null || _e === undefined ? undefined : _e.ifUnmodifiedSince + }, + sourceContentMD5: options.sourceContentMD5, + copySourceAuthorization: httpAuthorizationToString(options.sourceAuthorization), + tier: toAccessTier(options.tier), + blobTagsString: toBlobTagsString(options.tags), + immutabilityPolicyExpiry: (_f = options.immutabilityPolicy) === null || _f === undefined ? undefined : _f.expiriesOn, + immutabilityPolicyMode: (_g = options.immutabilityPolicy) === null || _g === undefined ? undefined : _g.policyMode, + legalHold: options.legalHold, + encryptionScope: options.encryptionScope, + copySourceTags: options.copySourceTags, + tracingOptions: updatedOptions.tracingOptions + })); + }); + } + async setAccessTier(tier2, options = {}) { + return tracingClient.withSpan("BlobClient-setAccessTier", options, async (updatedOptions) => { + var _a; + return assertResponse(await this.blobContext.setTier(toAccessTier(tier2), { + abortSignal: options.abortSignal, + leaseAccessConditions: options.conditions, + modifiedAccessConditions: Object.assign(Object.assign({}, options.conditions), { ifTags: (_a = options.conditions) === null || _a === undefined ? undefined : _a.tagConditions }), + rehydratePriority: options.rehydratePriority, + tracingOptions: updatedOptions.tracingOptions + })); + }); + } + async downloadToBuffer(param1, param2, param3, param4 = {}) { + var _a; + let buffer2; + let offset = 0; + let count = 0; + let options = param4; + if (param1 instanceof Buffer) { + buffer2 = param1; + offset = param2 || 0; + count = typeof param3 === "number" ? param3 : 0; + } else { + offset = typeof param1 === "number" ? param1 : 0; + count = typeof param2 === "number" ? param2 : 0; + options = param3 || {}; + } + let blockSize = (_a = options.blockSize) !== null && _a !== undefined ? _a : 0; + if (blockSize < 0) { + throw new RangeError("blockSize option must be >= 0"); + } + if (blockSize === 0) { + blockSize = DEFAULT_BLOB_DOWNLOAD_BLOCK_BYTES; + } + if (offset < 0) { + throw new RangeError("offset option must be >= 0"); + } + if (count && count <= 0) { + throw new RangeError("count option must be greater than 0"); + } + if (!options.conditions) { + options.conditions = {}; + } + return tracingClient.withSpan("BlobClient-downloadToBuffer", options, async (updatedOptions) => { + if (!count) { + const response = await this.getProperties(Object.assign(Object.assign({}, options), { tracingOptions: updatedOptions.tracingOptions })); + count = response.contentLength - offset; + if (count < 0) { + throw new RangeError(`offset ${offset} shouldn't be larger than blob size ${response.contentLength}`); + } + } + if (!buffer2) { + try { + buffer2 = Buffer.alloc(count); + } catch (error) { + throw new Error(`Unable to allocate the buffer of size: ${count}(in bytes). Please try passing your own buffer to the "downloadToBuffer" method or try using other methods like "download" or "downloadToFile".\t ${error.message}`); + } + } + if (buffer2.length < count) { + throw new RangeError(`The buffer's size should be equal to or larger than the request count of bytes: ${count}`); + } + let transferProgress = 0; + const batch = new Batch(options.concurrency); + for (let off = offset;off < offset + count; off = off + blockSize) { + batch.addOperation(async () => { + let chunkEnd = offset + count; + if (off + blockSize < chunkEnd) { + chunkEnd = off + blockSize; + } + const response = await this.download(off, chunkEnd - off, { + abortSignal: options.abortSignal, + conditions: options.conditions, + maxRetryRequests: options.maxRetryRequestsPerBlock, + customerProvidedKey: options.customerProvidedKey, + tracingOptions: updatedOptions.tracingOptions + }); + const stream2 = response.readableStreamBody; + await streamToBuffer(stream2, buffer2, off - offset, chunkEnd - offset); + transferProgress += chunkEnd - off; + if (options.onProgress) { + options.onProgress({ loadedBytes: transferProgress }); + } + }); + } + await batch.do(); + return buffer2; + }); + } + async downloadToFile(filePath, offset = 0, count, options = {}) { + return tracingClient.withSpan("BlobClient-downloadToFile", options, async (updatedOptions) => { + const response = await this.download(offset, count, Object.assign(Object.assign({}, options), { tracingOptions: updatedOptions.tracingOptions })); + if (response.readableStreamBody) { + await readStreamToLocalFile(response.readableStreamBody, filePath); + } + response.blobDownloadStream = undefined; + return response; + }); + } + getBlobAndContainerNamesFromUrl() { + let containerName; + let blobName; + try { + const parsedUrl = new URL(this.url); + if (parsedUrl.host.split(".")[1] === "blob") { + const pathComponents = parsedUrl.pathname.match("/([^/]*)(/(.*))?"); + containerName = pathComponents[1]; + blobName = pathComponents[3]; + } else if (isIpEndpointStyle(parsedUrl)) { + const pathComponents = parsedUrl.pathname.match("/([^/]*)/([^/]*)(/(.*))?"); + containerName = pathComponents[2]; + blobName = pathComponents[4]; + } else { + const pathComponents = parsedUrl.pathname.match("/([^/]*)(/(.*))?"); + containerName = pathComponents[1]; + blobName = pathComponents[3]; + } + containerName = decodeURIComponent(containerName); + blobName = decodeURIComponent(blobName); + blobName = blobName.replace(/\\/g, "/"); + if (!containerName) { + throw new Error("Provided containerName is invalid."); + } + return { blobName, containerName }; + } catch (error) { + throw new Error("Unable to extract blobName and containerName with provided information."); + } + } + async startCopyFromURL(copySource2, options = {}) { + return tracingClient.withSpan("BlobClient-startCopyFromURL", options, async (updatedOptions) => { + var _a, _b, _c; + options.conditions = options.conditions || {}; + options.sourceConditions = options.sourceConditions || {}; + return assertResponse(await this.blobContext.startCopyFromURL(copySource2, { + abortSignal: options.abortSignal, + leaseAccessConditions: options.conditions, + metadata: options.metadata, + modifiedAccessConditions: Object.assign(Object.assign({}, options.conditions), { ifTags: (_a = options.conditions) === null || _a === undefined ? undefined : _a.tagConditions }), + sourceModifiedAccessConditions: { + sourceIfMatch: options.sourceConditions.ifMatch, + sourceIfModifiedSince: options.sourceConditions.ifModifiedSince, + sourceIfNoneMatch: options.sourceConditions.ifNoneMatch, + sourceIfUnmodifiedSince: options.sourceConditions.ifUnmodifiedSince, + sourceIfTags: options.sourceConditions.tagConditions + }, + immutabilityPolicyExpiry: (_b = options.immutabilityPolicy) === null || _b === undefined ? undefined : _b.expiriesOn, + immutabilityPolicyMode: (_c = options.immutabilityPolicy) === null || _c === undefined ? undefined : _c.policyMode, + legalHold: options.legalHold, + rehydratePriority: options.rehydratePriority, + tier: toAccessTier(options.tier), + blobTagsString: toBlobTagsString(options.tags), + sealBlob: options.sealBlob, + tracingOptions: updatedOptions.tracingOptions + })); + }); + } + generateSasUrl(options) { + return new Promise((resolve) => { + if (!(this.credential instanceof StorageSharedKeyCredential)) { + throw new RangeError("Can only generate the SAS when the client is initialized with a shared key credential"); + } + const sas = generateBlobSASQueryParameters(Object.assign({ containerName: this._containerName, blobName: this._name, snapshotTime: this._snapshot, versionId: this._versionId }, options), this.credential).toString(); + resolve(appendToURLQuery(this.url, sas)); + }); + } + generateSasStringToSign(options) { + if (!(this.credential instanceof StorageSharedKeyCredential)) { + throw new RangeError("Can only generate the SAS when the client is initialized with a shared key credential"); + } + return generateBlobSASQueryParametersInternal(Object.assign({ containerName: this._containerName, blobName: this._name, snapshotTime: this._snapshot, versionId: this._versionId }, options), this.credential).stringToSign; + } + async deleteImmutabilityPolicy(options = {}) { + return tracingClient.withSpan("BlobClient-deleteImmutabilityPolicy", options, async (updatedOptions) => { + return assertResponse(await this.blobContext.deleteImmutabilityPolicy({ + tracingOptions: updatedOptions.tracingOptions + })); + }); + } + async setImmutabilityPolicy(immutabilityPolicy, options = {}) { + return tracingClient.withSpan("BlobClient-setImmutabilityPolicy", options, async (updatedOptions) => { + return assertResponse(await this.blobContext.setImmutabilityPolicy({ + immutabilityPolicyExpiry: immutabilityPolicy.expiriesOn, + immutabilityPolicyMode: immutabilityPolicy.policyMode, + tracingOptions: updatedOptions.tracingOptions + })); + }); + } + async setLegalHold(legalHoldEnabled, options = {}) { + return tracingClient.withSpan("BlobClient-setLegalHold", options, async (updatedOptions) => { + return assertResponse(await this.blobContext.setLegalHold(legalHoldEnabled, { + tracingOptions: updatedOptions.tracingOptions + })); + }); + } + async getAccountInfo(options = {}) { + return tracingClient.withSpan("BlobClient-getAccountInfo", options, async (updatedOptions) => { + return assertResponse(await this.blobContext.getAccountInfo({ + abortSignal: options.abortSignal, + tracingOptions: updatedOptions.tracingOptions + })); + }); + } + } + + class AppendBlobClient extends BlobClient { + constructor(urlOrConnectionString, credentialOrPipelineOrContainerName, blobNameOrOptions, options) { + let pipeline; + let url2; + options = options || {}; + if (isPipelineLike(credentialOrPipelineOrContainerName)) { + url2 = urlOrConnectionString; + pipeline = credentialOrPipelineOrContainerName; + } else if (coreUtil.isNode && credentialOrPipelineOrContainerName instanceof StorageSharedKeyCredential || credentialOrPipelineOrContainerName instanceof AnonymousCredential || coreAuth.isTokenCredential(credentialOrPipelineOrContainerName)) { + url2 = urlOrConnectionString; + options = blobNameOrOptions; + pipeline = newPipeline(credentialOrPipelineOrContainerName, options); + } else if (!credentialOrPipelineOrContainerName && typeof credentialOrPipelineOrContainerName !== "string") { + url2 = urlOrConnectionString; + pipeline = newPipeline(new AnonymousCredential, options); + } else if (credentialOrPipelineOrContainerName && typeof credentialOrPipelineOrContainerName === "string" && blobNameOrOptions && typeof blobNameOrOptions === "string") { + const containerName = credentialOrPipelineOrContainerName; + const blobName = blobNameOrOptions; + const extractedCreds = extractConnectionStringParts(urlOrConnectionString); + if (extractedCreds.kind === "AccountConnString") { + if (coreUtil.isNode) { + const sharedKeyCredential = new StorageSharedKeyCredential(extractedCreds.accountName, extractedCreds.accountKey); + url2 = appendToURLPath(appendToURLPath(extractedCreds.url, encodeURIComponent(containerName)), encodeURIComponent(blobName)); + if (!options.proxyOptions) { + options.proxyOptions = coreRestPipeline.getDefaultProxySettings(extractedCreds.proxyUri); + } + pipeline = newPipeline(sharedKeyCredential, options); + } else { + throw new Error("Account connection string is only supported in Node.js environment"); + } + } else if (extractedCreds.kind === "SASConnString") { + url2 = appendToURLPath(appendToURLPath(extractedCreds.url, encodeURIComponent(containerName)), encodeURIComponent(blobName)) + "?" + extractedCreds.accountSas; + pipeline = newPipeline(new AnonymousCredential, options); + } else { + throw new Error("Connection string must be either an Account connection string or a SAS connection string"); + } + } else { + throw new Error("Expecting non-empty strings for containerName and blobName parameters"); + } + super(url2, pipeline); + this.appendBlobContext = this.storageClientContext.appendBlob; + } + withSnapshot(snapshot2) { + return new AppendBlobClient(setURLParameter(this.url, URLConstants.Parameters.SNAPSHOT, snapshot2.length === 0 ? undefined : snapshot2), this.pipeline); + } + async create(options = {}) { + options.conditions = options.conditions || {}; + ensureCpkIfSpecified(options.customerProvidedKey, this.isHttps); + return tracingClient.withSpan("AppendBlobClient-create", options, async (updatedOptions) => { + var _a, _b, _c; + return assertResponse(await this.appendBlobContext.create(0, { + abortSignal: options.abortSignal, + blobHttpHeaders: options.blobHTTPHeaders, + leaseAccessConditions: options.conditions, + metadata: options.metadata, + modifiedAccessConditions: Object.assign(Object.assign({}, options.conditions), { ifTags: (_a = options.conditions) === null || _a === undefined ? undefined : _a.tagConditions }), + cpkInfo: options.customerProvidedKey, + encryptionScope: options.encryptionScope, + immutabilityPolicyExpiry: (_b = options.immutabilityPolicy) === null || _b === undefined ? undefined : _b.expiriesOn, + immutabilityPolicyMode: (_c = options.immutabilityPolicy) === null || _c === undefined ? undefined : _c.policyMode, + legalHold: options.legalHold, + blobTagsString: toBlobTagsString(options.tags), + tracingOptions: updatedOptions.tracingOptions + })); + }); + } + async createIfNotExists(options = {}) { + const conditions = { ifNoneMatch: ETagAny }; + return tracingClient.withSpan("AppendBlobClient-createIfNotExists", options, async (updatedOptions) => { + var _a, _b; + try { + const res = assertResponse(await this.create(Object.assign(Object.assign({}, updatedOptions), { conditions }))); + return Object.assign(Object.assign({ succeeded: true }, res), { _response: res._response }); + } catch (e) { + if (((_a = e.details) === null || _a === undefined ? undefined : _a.errorCode) === "BlobAlreadyExists") { + return Object.assign(Object.assign({ succeeded: false }, (_b = e.response) === null || _b === undefined ? undefined : _b.parsedHeaders), { _response: e.response }); + } + throw e; + } + }); + } + async seal(options = {}) { + options.conditions = options.conditions || {}; + return tracingClient.withSpan("AppendBlobClient-seal", options, async (updatedOptions) => { + var _a; + return assertResponse(await this.appendBlobContext.seal({ + abortSignal: options.abortSignal, + appendPositionAccessConditions: options.conditions, + leaseAccessConditions: options.conditions, + modifiedAccessConditions: Object.assign(Object.assign({}, options.conditions), { ifTags: (_a = options.conditions) === null || _a === undefined ? undefined : _a.tagConditions }), + tracingOptions: updatedOptions.tracingOptions + })); + }); + } + async appendBlock(body2, contentLength2, options = {}) { + options.conditions = options.conditions || {}; + ensureCpkIfSpecified(options.customerProvidedKey, this.isHttps); + return tracingClient.withSpan("AppendBlobClient-appendBlock", options, async (updatedOptions) => { + var _a; + return assertResponse(await this.appendBlobContext.appendBlock(contentLength2, body2, { + abortSignal: options.abortSignal, + appendPositionAccessConditions: options.conditions, + leaseAccessConditions: options.conditions, + modifiedAccessConditions: Object.assign(Object.assign({}, options.conditions), { ifTags: (_a = options.conditions) === null || _a === undefined ? undefined : _a.tagConditions }), + requestOptions: { + onUploadProgress: options.onProgress + }, + transactionalContentMD5: options.transactionalContentMD5, + transactionalContentCrc64: options.transactionalContentCrc64, + cpkInfo: options.customerProvidedKey, + encryptionScope: options.encryptionScope, + tracingOptions: updatedOptions.tracingOptions + })); + }); + } + async appendBlockFromURL(sourceURL, sourceOffset, count, options = {}) { + options.conditions = options.conditions || {}; + options.sourceConditions = options.sourceConditions || {}; + ensureCpkIfSpecified(options.customerProvidedKey, this.isHttps); + return tracingClient.withSpan("AppendBlobClient-appendBlockFromURL", options, async (updatedOptions) => { + var _a, _b, _c, _d, _e; + return assertResponse(await this.appendBlobContext.appendBlockFromUrl(sourceURL, 0, { + abortSignal: options.abortSignal, + sourceRange: rangeToString({ offset: sourceOffset, count }), + sourceContentMD5: options.sourceContentMD5, + sourceContentCrc64: options.sourceContentCrc64, + leaseAccessConditions: options.conditions, + appendPositionAccessConditions: options.conditions, + modifiedAccessConditions: Object.assign(Object.assign({}, options.conditions), { ifTags: (_a = options.conditions) === null || _a === undefined ? undefined : _a.tagConditions }), + sourceModifiedAccessConditions: { + sourceIfMatch: (_b = options.sourceConditions) === null || _b === undefined ? undefined : _b.ifMatch, + sourceIfModifiedSince: (_c = options.sourceConditions) === null || _c === undefined ? undefined : _c.ifModifiedSince, + sourceIfNoneMatch: (_d = options.sourceConditions) === null || _d === undefined ? undefined : _d.ifNoneMatch, + sourceIfUnmodifiedSince: (_e = options.sourceConditions) === null || _e === undefined ? undefined : _e.ifUnmodifiedSince + }, + copySourceAuthorization: httpAuthorizationToString(options.sourceAuthorization), + cpkInfo: options.customerProvidedKey, + encryptionScope: options.encryptionScope, + tracingOptions: updatedOptions.tracingOptions + })); + }); + } + } + + class BlockBlobClient extends BlobClient { + constructor(urlOrConnectionString, credentialOrPipelineOrContainerName, blobNameOrOptions, options) { + let pipeline; + let url2; + options = options || {}; + if (isPipelineLike(credentialOrPipelineOrContainerName)) { + url2 = urlOrConnectionString; + pipeline = credentialOrPipelineOrContainerName; + } else if (coreUtil.isNode && credentialOrPipelineOrContainerName instanceof StorageSharedKeyCredential || credentialOrPipelineOrContainerName instanceof AnonymousCredential || coreAuth.isTokenCredential(credentialOrPipelineOrContainerName)) { + url2 = urlOrConnectionString; + options = blobNameOrOptions; + pipeline = newPipeline(credentialOrPipelineOrContainerName, options); + } else if (!credentialOrPipelineOrContainerName && typeof credentialOrPipelineOrContainerName !== "string") { + url2 = urlOrConnectionString; + if (blobNameOrOptions && typeof blobNameOrOptions !== "string") { + options = blobNameOrOptions; + } + pipeline = newPipeline(new AnonymousCredential, options); + } else if (credentialOrPipelineOrContainerName && typeof credentialOrPipelineOrContainerName === "string" && blobNameOrOptions && typeof blobNameOrOptions === "string") { + const containerName = credentialOrPipelineOrContainerName; + const blobName = blobNameOrOptions; + const extractedCreds = extractConnectionStringParts(urlOrConnectionString); + if (extractedCreds.kind === "AccountConnString") { + if (coreUtil.isNode) { + const sharedKeyCredential = new StorageSharedKeyCredential(extractedCreds.accountName, extractedCreds.accountKey); + url2 = appendToURLPath(appendToURLPath(extractedCreds.url, encodeURIComponent(containerName)), encodeURIComponent(blobName)); + if (!options.proxyOptions) { + options.proxyOptions = coreRestPipeline.getDefaultProxySettings(extractedCreds.proxyUri); + } + pipeline = newPipeline(sharedKeyCredential, options); + } else { + throw new Error("Account connection string is only supported in Node.js environment"); + } + } else if (extractedCreds.kind === "SASConnString") { + url2 = appendToURLPath(appendToURLPath(extractedCreds.url, encodeURIComponent(containerName)), encodeURIComponent(blobName)) + "?" + extractedCreds.accountSas; + pipeline = newPipeline(new AnonymousCredential, options); + } else { + throw new Error("Connection string must be either an Account connection string or a SAS connection string"); + } + } else { + throw new Error("Expecting non-empty strings for containerName and blobName parameters"); + } + super(url2, pipeline); + this.blockBlobContext = this.storageClientContext.blockBlob; + this._blobContext = this.storageClientContext.blob; + } + withSnapshot(snapshot2) { + return new BlockBlobClient(setURLParameter(this.url, URLConstants.Parameters.SNAPSHOT, snapshot2.length === 0 ? undefined : snapshot2), this.pipeline); + } + async query(query, options = {}) { + ensureCpkIfSpecified(options.customerProvidedKey, this.isHttps); + if (!coreUtil.isNode) { + throw new Error("This operation currently is only supported in Node.js."); + } + return tracingClient.withSpan("BlockBlobClient-query", options, async (updatedOptions) => { + var _a; + const response = assertResponse(await this._blobContext.query({ + abortSignal: options.abortSignal, + queryRequest: { + queryType: "SQL", + expression: query, + inputSerialization: toQuerySerialization(options.inputTextConfiguration), + outputSerialization: toQuerySerialization(options.outputTextConfiguration) + }, + leaseAccessConditions: options.conditions, + modifiedAccessConditions: Object.assign(Object.assign({}, options.conditions), { ifTags: (_a = options.conditions) === null || _a === undefined ? undefined : _a.tagConditions }), + cpkInfo: options.customerProvidedKey, + tracingOptions: updatedOptions.tracingOptions + })); + return new BlobQueryResponse(response, { + abortSignal: options.abortSignal, + onProgress: options.onProgress, + onError: options.onError + }); + }); + } + async upload(body2, contentLength2, options = {}) { + options.conditions = options.conditions || {}; + ensureCpkIfSpecified(options.customerProvidedKey, this.isHttps); + return tracingClient.withSpan("BlockBlobClient-upload", options, async (updatedOptions) => { + var _a, _b, _c; + return assertResponse(await this.blockBlobContext.upload(contentLength2, body2, { + abortSignal: options.abortSignal, + blobHttpHeaders: options.blobHTTPHeaders, + leaseAccessConditions: options.conditions, + metadata: options.metadata, + modifiedAccessConditions: Object.assign(Object.assign({}, options.conditions), { ifTags: (_a = options.conditions) === null || _a === undefined ? undefined : _a.tagConditions }), + requestOptions: { + onUploadProgress: options.onProgress + }, + cpkInfo: options.customerProvidedKey, + encryptionScope: options.encryptionScope, + immutabilityPolicyExpiry: (_b = options.immutabilityPolicy) === null || _b === undefined ? undefined : _b.expiriesOn, + immutabilityPolicyMode: (_c = options.immutabilityPolicy) === null || _c === undefined ? undefined : _c.policyMode, + legalHold: options.legalHold, + tier: toAccessTier(options.tier), + blobTagsString: toBlobTagsString(options.tags), + tracingOptions: updatedOptions.tracingOptions + })); + }); + } + async syncUploadFromURL(sourceURL, options = {}) { + options.conditions = options.conditions || {}; + ensureCpkIfSpecified(options.customerProvidedKey, this.isHttps); + return tracingClient.withSpan("BlockBlobClient-syncUploadFromURL", options, async (updatedOptions) => { + var _a, _b, _c, _d, _e, _f; + return assertResponse(await this.blockBlobContext.putBlobFromUrl(0, sourceURL, Object.assign(Object.assign({}, options), { blobHttpHeaders: options.blobHTTPHeaders, leaseAccessConditions: options.conditions, modifiedAccessConditions: Object.assign(Object.assign({}, options.conditions), { ifTags: (_a = options.conditions) === null || _a === undefined ? undefined : _a.tagConditions }), sourceModifiedAccessConditions: { + sourceIfMatch: (_b = options.sourceConditions) === null || _b === undefined ? undefined : _b.ifMatch, + sourceIfModifiedSince: (_c = options.sourceConditions) === null || _c === undefined ? undefined : _c.ifModifiedSince, + sourceIfNoneMatch: (_d = options.sourceConditions) === null || _d === undefined ? undefined : _d.ifNoneMatch, + sourceIfUnmodifiedSince: (_e = options.sourceConditions) === null || _e === undefined ? undefined : _e.ifUnmodifiedSince, + sourceIfTags: (_f = options.sourceConditions) === null || _f === undefined ? undefined : _f.tagConditions + }, cpkInfo: options.customerProvidedKey, copySourceAuthorization: httpAuthorizationToString(options.sourceAuthorization), tier: toAccessTier(options.tier), blobTagsString: toBlobTagsString(options.tags), copySourceTags: options.copySourceTags, tracingOptions: updatedOptions.tracingOptions }))); + }); + } + async stageBlock(blockId2, body2, contentLength2, options = {}) { + ensureCpkIfSpecified(options.customerProvidedKey, this.isHttps); + return tracingClient.withSpan("BlockBlobClient-stageBlock", options, async (updatedOptions) => { + return assertResponse(await this.blockBlobContext.stageBlock(blockId2, contentLength2, body2, { + abortSignal: options.abortSignal, + leaseAccessConditions: options.conditions, + requestOptions: { + onUploadProgress: options.onProgress + }, + transactionalContentMD5: options.transactionalContentMD5, + transactionalContentCrc64: options.transactionalContentCrc64, + cpkInfo: options.customerProvidedKey, + encryptionScope: options.encryptionScope, + tracingOptions: updatedOptions.tracingOptions + })); + }); + } + async stageBlockFromURL(blockId2, sourceURL, offset = 0, count, options = {}) { + ensureCpkIfSpecified(options.customerProvidedKey, this.isHttps); + return tracingClient.withSpan("BlockBlobClient-stageBlockFromURL", options, async (updatedOptions) => { + return assertResponse(await this.blockBlobContext.stageBlockFromURL(blockId2, 0, sourceURL, { + abortSignal: options.abortSignal, + leaseAccessConditions: options.conditions, + sourceContentMD5: options.sourceContentMD5, + sourceContentCrc64: options.sourceContentCrc64, + sourceRange: offset === 0 && !count ? undefined : rangeToString({ offset, count }), + cpkInfo: options.customerProvidedKey, + encryptionScope: options.encryptionScope, + copySourceAuthorization: httpAuthorizationToString(options.sourceAuthorization), + tracingOptions: updatedOptions.tracingOptions + })); + }); + } + async commitBlockList(blocks2, options = {}) { + options.conditions = options.conditions || {}; + ensureCpkIfSpecified(options.customerProvidedKey, this.isHttps); + return tracingClient.withSpan("BlockBlobClient-commitBlockList", options, async (updatedOptions) => { + var _a, _b, _c; + return assertResponse(await this.blockBlobContext.commitBlockList({ latest: blocks2 }, { + abortSignal: options.abortSignal, + blobHttpHeaders: options.blobHTTPHeaders, + leaseAccessConditions: options.conditions, + metadata: options.metadata, + modifiedAccessConditions: Object.assign(Object.assign({}, options.conditions), { ifTags: (_a = options.conditions) === null || _a === undefined ? undefined : _a.tagConditions }), + cpkInfo: options.customerProvidedKey, + encryptionScope: options.encryptionScope, + immutabilityPolicyExpiry: (_b = options.immutabilityPolicy) === null || _b === undefined ? undefined : _b.expiriesOn, + immutabilityPolicyMode: (_c = options.immutabilityPolicy) === null || _c === undefined ? undefined : _c.policyMode, + legalHold: options.legalHold, + tier: toAccessTier(options.tier), + blobTagsString: toBlobTagsString(options.tags), + tracingOptions: updatedOptions.tracingOptions + })); + }); + } + async getBlockList(listType2, options = {}) { + return tracingClient.withSpan("BlockBlobClient-getBlockList", options, async (updatedOptions) => { + var _a; + const res = assertResponse(await this.blockBlobContext.getBlockList(listType2, { + abortSignal: options.abortSignal, + leaseAccessConditions: options.conditions, + modifiedAccessConditions: Object.assign(Object.assign({}, options.conditions), { ifTags: (_a = options.conditions) === null || _a === undefined ? undefined : _a.tagConditions }), + tracingOptions: updatedOptions.tracingOptions + })); + if (!res.committedBlocks) { + res.committedBlocks = []; + } + if (!res.uncommittedBlocks) { + res.uncommittedBlocks = []; + } + return res; + }); + } + async uploadData(data, options = {}) { + return tracingClient.withSpan("BlockBlobClient-uploadData", options, async (updatedOptions) => { + if (coreUtil.isNode) { + let buffer2; + if (data instanceof Buffer) { + buffer2 = data; + } else if (data instanceof ArrayBuffer) { + buffer2 = Buffer.from(data); + } else { + data = data; + buffer2 = Buffer.from(data.buffer, data.byteOffset, data.byteLength); + } + return this.uploadSeekableInternal((offset, size) => buffer2.slice(offset, offset + size), buffer2.byteLength, updatedOptions); + } else { + const browserBlob = new Blob([data]); + return this.uploadSeekableInternal((offset, size) => browserBlob.slice(offset, offset + size), browserBlob.size, updatedOptions); + } + }); + } + async uploadBrowserData(browserData, options = {}) { + return tracingClient.withSpan("BlockBlobClient-uploadBrowserData", options, async (updatedOptions) => { + const browserBlob = new Blob([browserData]); + return this.uploadSeekableInternal((offset, size) => browserBlob.slice(offset, offset + size), browserBlob.size, updatedOptions); + }); + } + async uploadSeekableInternal(bodyFactory, size, options = {}) { + var _a, _b; + let blockSize = (_a = options.blockSize) !== null && _a !== undefined ? _a : 0; + if (blockSize < 0 || blockSize > BLOCK_BLOB_MAX_STAGE_BLOCK_BYTES) { + throw new RangeError(`blockSize option must be >= 0 and <= ${BLOCK_BLOB_MAX_STAGE_BLOCK_BYTES}`); + } + const maxSingleShotSize = (_b = options.maxSingleShotSize) !== null && _b !== undefined ? _b : BLOCK_BLOB_MAX_UPLOAD_BLOB_BYTES; + if (maxSingleShotSize < 0 || maxSingleShotSize > BLOCK_BLOB_MAX_UPLOAD_BLOB_BYTES) { + throw new RangeError(`maxSingleShotSize option must be >= 0 and <= ${BLOCK_BLOB_MAX_UPLOAD_BLOB_BYTES}`); + } + if (blockSize === 0) { + if (size > BLOCK_BLOB_MAX_STAGE_BLOCK_BYTES * BLOCK_BLOB_MAX_BLOCKS) { + throw new RangeError(`${size} is too larger to upload to a block blob.`); + } + if (size > maxSingleShotSize) { + blockSize = Math.ceil(size / BLOCK_BLOB_MAX_BLOCKS); + if (blockSize < DEFAULT_BLOB_DOWNLOAD_BLOCK_BYTES) { + blockSize = DEFAULT_BLOB_DOWNLOAD_BLOCK_BYTES; + } + } + } + if (!options.blobHTTPHeaders) { + options.blobHTTPHeaders = {}; + } + if (!options.conditions) { + options.conditions = {}; + } + return tracingClient.withSpan("BlockBlobClient-uploadSeekableInternal", options, async (updatedOptions) => { + if (size <= maxSingleShotSize) { + return assertResponse(await this.upload(bodyFactory(0, size), size, updatedOptions)); + } + const numBlocks = Math.floor((size - 1) / blockSize) + 1; + if (numBlocks > BLOCK_BLOB_MAX_BLOCKS) { + throw new RangeError(`The buffer's size is too big or the BlockSize is too small;` + `the number of blocks must be <= ${BLOCK_BLOB_MAX_BLOCKS}`); + } + const blockList = []; + const blockIDPrefix = coreUtil.randomUUID(); + let transferProgress = 0; + const batch = new Batch(options.concurrency); + for (let i = 0;i < numBlocks; i++) { + batch.addOperation(async () => { + const blockID = generateBlockID(blockIDPrefix, i); + const start = blockSize * i; + const end = i === numBlocks - 1 ? size : start + blockSize; + const contentLength2 = end - start; + blockList.push(blockID); + await this.stageBlock(blockID, bodyFactory(start, contentLength2), contentLength2, { + abortSignal: options.abortSignal, + conditions: options.conditions, + encryptionScope: options.encryptionScope, + tracingOptions: updatedOptions.tracingOptions + }); + transferProgress += contentLength2; + if (options.onProgress) { + options.onProgress({ + loadedBytes: transferProgress + }); + } + }); + } + await batch.do(); + return this.commitBlockList(blockList, updatedOptions); + }); + } + async uploadFile(filePath, options = {}) { + return tracingClient.withSpan("BlockBlobClient-uploadFile", options, async (updatedOptions) => { + const size = (await fsStat(filePath)).size; + return this.uploadSeekableInternal((offset, count) => { + return () => fsCreateReadStream(filePath, { + autoClose: true, + end: count ? offset + count - 1 : Infinity, + start: offset + }); + }, size, Object.assign(Object.assign({}, options), { tracingOptions: updatedOptions.tracingOptions })); + }); + } + async uploadStream(stream2, bufferSize = DEFAULT_BLOCK_BUFFER_SIZE_BYTES, maxConcurrency = 5, options = {}) { + if (!options.blobHTTPHeaders) { + options.blobHTTPHeaders = {}; + } + if (!options.conditions) { + options.conditions = {}; + } + return tracingClient.withSpan("BlockBlobClient-uploadStream", options, async (updatedOptions) => { + let blockNum = 0; + const blockIDPrefix = coreUtil.randomUUID(); + let transferProgress = 0; + const blockList = []; + const scheduler = new BufferScheduler(stream2, bufferSize, maxConcurrency, async (body2, length) => { + const blockID = generateBlockID(blockIDPrefix, blockNum); + blockList.push(blockID); + blockNum++; + await this.stageBlock(blockID, body2, length, { + customerProvidedKey: options.customerProvidedKey, + conditions: options.conditions, + encryptionScope: options.encryptionScope, + tracingOptions: updatedOptions.tracingOptions + }); + transferProgress += length; + if (options.onProgress) { + options.onProgress({ loadedBytes: transferProgress }); + } + }, Math.ceil(maxConcurrency / 4 * 3)); + await scheduler.do(); + return assertResponse(await this.commitBlockList(blockList, Object.assign(Object.assign({}, options), { tracingOptions: updatedOptions.tracingOptions }))); + }); + } + } + + class PageBlobClient extends BlobClient { + constructor(urlOrConnectionString, credentialOrPipelineOrContainerName, blobNameOrOptions, options) { + let pipeline; + let url2; + options = options || {}; + if (isPipelineLike(credentialOrPipelineOrContainerName)) { + url2 = urlOrConnectionString; + pipeline = credentialOrPipelineOrContainerName; + } else if (coreUtil.isNode && credentialOrPipelineOrContainerName instanceof StorageSharedKeyCredential || credentialOrPipelineOrContainerName instanceof AnonymousCredential || coreAuth.isTokenCredential(credentialOrPipelineOrContainerName)) { + url2 = urlOrConnectionString; + options = blobNameOrOptions; + pipeline = newPipeline(credentialOrPipelineOrContainerName, options); + } else if (!credentialOrPipelineOrContainerName && typeof credentialOrPipelineOrContainerName !== "string") { + url2 = urlOrConnectionString; + pipeline = newPipeline(new AnonymousCredential, options); + } else if (credentialOrPipelineOrContainerName && typeof credentialOrPipelineOrContainerName === "string" && blobNameOrOptions && typeof blobNameOrOptions === "string") { + const containerName = credentialOrPipelineOrContainerName; + const blobName = blobNameOrOptions; + const extractedCreds = extractConnectionStringParts(urlOrConnectionString); + if (extractedCreds.kind === "AccountConnString") { + if (coreUtil.isNode) { + const sharedKeyCredential = new StorageSharedKeyCredential(extractedCreds.accountName, extractedCreds.accountKey); + url2 = appendToURLPath(appendToURLPath(extractedCreds.url, encodeURIComponent(containerName)), encodeURIComponent(blobName)); + if (!options.proxyOptions) { + options.proxyOptions = coreRestPipeline.getDefaultProxySettings(extractedCreds.proxyUri); + } + pipeline = newPipeline(sharedKeyCredential, options); + } else { + throw new Error("Account connection string is only supported in Node.js environment"); + } + } else if (extractedCreds.kind === "SASConnString") { + url2 = appendToURLPath(appendToURLPath(extractedCreds.url, encodeURIComponent(containerName)), encodeURIComponent(blobName)) + "?" + extractedCreds.accountSas; + pipeline = newPipeline(new AnonymousCredential, options); + } else { + throw new Error("Connection string must be either an Account connection string or a SAS connection string"); + } + } else { + throw new Error("Expecting non-empty strings for containerName and blobName parameters"); + } + super(url2, pipeline); + this.pageBlobContext = this.storageClientContext.pageBlob; + } + withSnapshot(snapshot2) { + return new PageBlobClient(setURLParameter(this.url, URLConstants.Parameters.SNAPSHOT, snapshot2.length === 0 ? undefined : snapshot2), this.pipeline); + } + async create(size, options = {}) { + options.conditions = options.conditions || {}; + ensureCpkIfSpecified(options.customerProvidedKey, this.isHttps); + return tracingClient.withSpan("PageBlobClient-create", options, async (updatedOptions) => { + var _a, _b, _c; + return assertResponse(await this.pageBlobContext.create(0, size, { + abortSignal: options.abortSignal, + blobHttpHeaders: options.blobHTTPHeaders, + blobSequenceNumber: options.blobSequenceNumber, + leaseAccessConditions: options.conditions, + metadata: options.metadata, + modifiedAccessConditions: Object.assign(Object.assign({}, options.conditions), { ifTags: (_a = options.conditions) === null || _a === undefined ? undefined : _a.tagConditions }), + cpkInfo: options.customerProvidedKey, + encryptionScope: options.encryptionScope, + immutabilityPolicyExpiry: (_b = options.immutabilityPolicy) === null || _b === undefined ? undefined : _b.expiriesOn, + immutabilityPolicyMode: (_c = options.immutabilityPolicy) === null || _c === undefined ? undefined : _c.policyMode, + legalHold: options.legalHold, + tier: toAccessTier(options.tier), + blobTagsString: toBlobTagsString(options.tags), + tracingOptions: updatedOptions.tracingOptions + })); + }); + } + async createIfNotExists(size, options = {}) { + return tracingClient.withSpan("PageBlobClient-createIfNotExists", options, async (updatedOptions) => { + var _a, _b; + try { + const conditions = { ifNoneMatch: ETagAny }; + const res = assertResponse(await this.create(size, Object.assign(Object.assign({}, options), { conditions, tracingOptions: updatedOptions.tracingOptions }))); + return Object.assign(Object.assign({ succeeded: true }, res), { _response: res._response }); + } catch (e) { + if (((_a = e.details) === null || _a === undefined ? undefined : _a.errorCode) === "BlobAlreadyExists") { + return Object.assign(Object.assign({ succeeded: false }, (_b = e.response) === null || _b === undefined ? undefined : _b.parsedHeaders), { _response: e.response }); + } + throw e; + } + }); + } + async uploadPages(body2, offset, count, options = {}) { + options.conditions = options.conditions || {}; + ensureCpkIfSpecified(options.customerProvidedKey, this.isHttps); + return tracingClient.withSpan("PageBlobClient-uploadPages", options, async (updatedOptions) => { + var _a; + return assertResponse(await this.pageBlobContext.uploadPages(count, body2, { + abortSignal: options.abortSignal, + leaseAccessConditions: options.conditions, + modifiedAccessConditions: Object.assign(Object.assign({}, options.conditions), { ifTags: (_a = options.conditions) === null || _a === undefined ? undefined : _a.tagConditions }), + requestOptions: { + onUploadProgress: options.onProgress + }, + range: rangeToString({ offset, count }), + sequenceNumberAccessConditions: options.conditions, + transactionalContentMD5: options.transactionalContentMD5, + transactionalContentCrc64: options.transactionalContentCrc64, + cpkInfo: options.customerProvidedKey, + encryptionScope: options.encryptionScope, + tracingOptions: updatedOptions.tracingOptions + })); + }); + } + async uploadPagesFromURL(sourceURL, sourceOffset, destOffset, count, options = {}) { + options.conditions = options.conditions || {}; + options.sourceConditions = options.sourceConditions || {}; + ensureCpkIfSpecified(options.customerProvidedKey, this.isHttps); + return tracingClient.withSpan("PageBlobClient-uploadPagesFromURL", options, async (updatedOptions) => { + var _a, _b, _c, _d, _e; + return assertResponse(await this.pageBlobContext.uploadPagesFromURL(sourceURL, rangeToString({ offset: sourceOffset, count }), 0, rangeToString({ offset: destOffset, count }), { + abortSignal: options.abortSignal, + sourceContentMD5: options.sourceContentMD5, + sourceContentCrc64: options.sourceContentCrc64, + leaseAccessConditions: options.conditions, + sequenceNumberAccessConditions: options.conditions, + modifiedAccessConditions: Object.assign(Object.assign({}, options.conditions), { ifTags: (_a = options.conditions) === null || _a === undefined ? undefined : _a.tagConditions }), + sourceModifiedAccessConditions: { + sourceIfMatch: (_b = options.sourceConditions) === null || _b === undefined ? undefined : _b.ifMatch, + sourceIfModifiedSince: (_c = options.sourceConditions) === null || _c === undefined ? undefined : _c.ifModifiedSince, + sourceIfNoneMatch: (_d = options.sourceConditions) === null || _d === undefined ? undefined : _d.ifNoneMatch, + sourceIfUnmodifiedSince: (_e = options.sourceConditions) === null || _e === undefined ? undefined : _e.ifUnmodifiedSince + }, + cpkInfo: options.customerProvidedKey, + encryptionScope: options.encryptionScope, + copySourceAuthorization: httpAuthorizationToString(options.sourceAuthorization), + tracingOptions: updatedOptions.tracingOptions + })); + }); + } + async clearPages(offset = 0, count, options = {}) { + options.conditions = options.conditions || {}; + return tracingClient.withSpan("PageBlobClient-clearPages", options, async (updatedOptions) => { + var _a; + return assertResponse(await this.pageBlobContext.clearPages(0, { + abortSignal: options.abortSignal, + leaseAccessConditions: options.conditions, + modifiedAccessConditions: Object.assign(Object.assign({}, options.conditions), { ifTags: (_a = options.conditions) === null || _a === undefined ? undefined : _a.tagConditions }), + range: rangeToString({ offset, count }), + sequenceNumberAccessConditions: options.conditions, + cpkInfo: options.customerProvidedKey, + encryptionScope: options.encryptionScope, + tracingOptions: updatedOptions.tracingOptions + })); + }); + } + async getPageRanges(offset = 0, count, options = {}) { + options.conditions = options.conditions || {}; + return tracingClient.withSpan("PageBlobClient-getPageRanges", options, async (updatedOptions) => { + var _a; + const response = assertResponse(await this.pageBlobContext.getPageRanges({ + abortSignal: options.abortSignal, + leaseAccessConditions: options.conditions, + modifiedAccessConditions: Object.assign(Object.assign({}, options.conditions), { ifTags: (_a = options.conditions) === null || _a === undefined ? undefined : _a.tagConditions }), + range: rangeToString({ offset, count }), + tracingOptions: updatedOptions.tracingOptions + })); + return rangeResponseFromModel(response); + }); + } + async listPageRangesSegment(offset = 0, count, marker2, options = {}) { + return tracingClient.withSpan("PageBlobClient-getPageRangesSegment", options, async (updatedOptions) => { + var _a; + return assertResponse(await this.pageBlobContext.getPageRanges({ + abortSignal: options.abortSignal, + leaseAccessConditions: options.conditions, + modifiedAccessConditions: Object.assign(Object.assign({}, options.conditions), { ifTags: (_a = options.conditions) === null || _a === undefined ? undefined : _a.tagConditions }), + range: rangeToString({ offset, count }), + marker: marker2, + maxPageSize: options.maxPageSize, + tracingOptions: updatedOptions.tracingOptions + })); + }); + } + listPageRangeItemSegments() { + return tslib.__asyncGenerator(this, arguments, function* listPageRangeItemSegments_1(offset = 0, count, marker2, options = {}) { + let getPageRangeItemSegmentsResponse; + if (!!marker2 || marker2 === undefined) { + do { + getPageRangeItemSegmentsResponse = yield tslib.__await(this.listPageRangesSegment(offset, count, marker2, options)); + marker2 = getPageRangeItemSegmentsResponse.continuationToken; + yield yield tslib.__await(yield tslib.__await(getPageRangeItemSegmentsResponse)); + } while (marker2); + } + }); + } + listPageRangeItems() { + return tslib.__asyncGenerator(this, arguments, function* listPageRangeItems_1(offset = 0, count, options = {}) { + var _a, e_1, _b, _c; + let marker2; + try { + for (var _d = true, _e = tslib.__asyncValues(this.listPageRangeItemSegments(offset, count, marker2, options)), _f;_f = yield tslib.__await(_e.next()), _a = _f.done, !_a; _d = true) { + _c = _f.value; + _d = false; + const getPageRangesSegment = _c; + yield tslib.__await(yield* tslib.__asyncDelegator(tslib.__asyncValues(ExtractPageRangeInfoItems(getPageRangesSegment)))); + } + } catch (e_1_1) { + e_1 = { error: e_1_1 }; + } finally { + try { + if (!_d && !_a && (_b = _e.return)) + yield tslib.__await(_b.call(_e)); + } finally { + if (e_1) + throw e_1.error; + } + } + }); + } + listPageRanges(offset = 0, count, options = {}) { + options.conditions = options.conditions || {}; + const iter = this.listPageRangeItems(offset, count, options); + return { + next() { + return iter.next(); + }, + [Symbol.asyncIterator]() { + return this; + }, + byPage: (settings = {}) => { + return this.listPageRangeItemSegments(offset, count, settings.continuationToken, Object.assign({ maxPageSize: settings.maxPageSize }, options)); + } + }; + } + async getPageRangesDiff(offset, count, prevSnapshot, options = {}) { + options.conditions = options.conditions || {}; + return tracingClient.withSpan("PageBlobClient-getPageRangesDiff", options, async (updatedOptions) => { + var _a; + const result = assertResponse(await this.pageBlobContext.getPageRangesDiff({ + abortSignal: options.abortSignal, + leaseAccessConditions: options.conditions, + modifiedAccessConditions: Object.assign(Object.assign({}, options.conditions), { ifTags: (_a = options.conditions) === null || _a === undefined ? undefined : _a.tagConditions }), + prevsnapshot: prevSnapshot, + range: rangeToString({ offset, count }), + tracingOptions: updatedOptions.tracingOptions + })); + return rangeResponseFromModel(result); + }); + } + async listPageRangesDiffSegment(offset, count, prevSnapshotOrUrl, marker2, options = {}) { + return tracingClient.withSpan("PageBlobClient-getPageRangesDiffSegment", options, async (updatedOptions) => { + var _a; + return assertResponse(await this.pageBlobContext.getPageRangesDiff({ + abortSignal: options === null || options === undefined ? undefined : options.abortSignal, + leaseAccessConditions: options === null || options === undefined ? undefined : options.conditions, + modifiedAccessConditions: Object.assign(Object.assign({}, options === null || options === undefined ? undefined : options.conditions), { ifTags: (_a = options === null || options === undefined ? undefined : options.conditions) === null || _a === undefined ? undefined : _a.tagConditions }), + prevsnapshot: prevSnapshotOrUrl, + range: rangeToString({ + offset, + count + }), + marker: marker2, + maxPageSize: options === null || options === undefined ? undefined : options.maxPageSize, + tracingOptions: updatedOptions.tracingOptions + })); + }); + } + listPageRangeDiffItemSegments(offset, count, prevSnapshotOrUrl, marker2, options) { + return tslib.__asyncGenerator(this, arguments, function* listPageRangeDiffItemSegments_1() { + let getPageRangeItemSegmentsResponse; + if (!!marker2 || marker2 === undefined) { + do { + getPageRangeItemSegmentsResponse = yield tslib.__await(this.listPageRangesDiffSegment(offset, count, prevSnapshotOrUrl, marker2, options)); + marker2 = getPageRangeItemSegmentsResponse.continuationToken; + yield yield tslib.__await(yield tslib.__await(getPageRangeItemSegmentsResponse)); + } while (marker2); + } + }); + } + listPageRangeDiffItems(offset, count, prevSnapshotOrUrl, options) { + return tslib.__asyncGenerator(this, arguments, function* listPageRangeDiffItems_1() { + var _a, e_2, _b, _c; + let marker2; + try { + for (var _d = true, _e = tslib.__asyncValues(this.listPageRangeDiffItemSegments(offset, count, prevSnapshotOrUrl, marker2, options)), _f;_f = yield tslib.__await(_e.next()), _a = _f.done, !_a; _d = true) { + _c = _f.value; + _d = false; + const getPageRangesSegment = _c; + yield tslib.__await(yield* tslib.__asyncDelegator(tslib.__asyncValues(ExtractPageRangeInfoItems(getPageRangesSegment)))); + } + } catch (e_2_1) { + e_2 = { error: e_2_1 }; + } finally { + try { + if (!_d && !_a && (_b = _e.return)) + yield tslib.__await(_b.call(_e)); + } finally { + if (e_2) + throw e_2.error; + } + } + }); + } + listPageRangesDiff(offset, count, prevSnapshot, options = {}) { + options.conditions = options.conditions || {}; + const iter = this.listPageRangeDiffItems(offset, count, prevSnapshot, Object.assign({}, options)); + return { + next() { + return iter.next(); + }, + [Symbol.asyncIterator]() { + return this; + }, + byPage: (settings = {}) => { + return this.listPageRangeDiffItemSegments(offset, count, prevSnapshot, settings.continuationToken, Object.assign({ maxPageSize: settings.maxPageSize }, options)); + } + }; + } + async getPageRangesDiffForManagedDisks(offset, count, prevSnapshotUrl2, options = {}) { + options.conditions = options.conditions || {}; + return tracingClient.withSpan("PageBlobClient-GetPageRangesDiffForManagedDisks", options, async (updatedOptions) => { + var _a; + const response = assertResponse(await this.pageBlobContext.getPageRangesDiff({ + abortSignal: options.abortSignal, + leaseAccessConditions: options.conditions, + modifiedAccessConditions: Object.assign(Object.assign({}, options.conditions), { ifTags: (_a = options.conditions) === null || _a === undefined ? undefined : _a.tagConditions }), + prevSnapshotUrl: prevSnapshotUrl2, + range: rangeToString({ offset, count }), + tracingOptions: updatedOptions.tracingOptions + })); + return rangeResponseFromModel(response); + }); + } + async resize(size, options = {}) { + options.conditions = options.conditions || {}; + return tracingClient.withSpan("PageBlobClient-resize", options, async (updatedOptions) => { + var _a; + return assertResponse(await this.pageBlobContext.resize(size, { + abortSignal: options.abortSignal, + leaseAccessConditions: options.conditions, + modifiedAccessConditions: Object.assign(Object.assign({}, options.conditions), { ifTags: (_a = options.conditions) === null || _a === undefined ? undefined : _a.tagConditions }), + encryptionScope: options.encryptionScope, + tracingOptions: updatedOptions.tracingOptions + })); + }); + } + async updateSequenceNumber(sequenceNumberAction2, sequenceNumber, options = {}) { + options.conditions = options.conditions || {}; + return tracingClient.withSpan("PageBlobClient-updateSequenceNumber", options, async (updatedOptions) => { + var _a; + return assertResponse(await this.pageBlobContext.updateSequenceNumber(sequenceNumberAction2, { + abortSignal: options.abortSignal, + blobSequenceNumber: sequenceNumber, + leaseAccessConditions: options.conditions, + modifiedAccessConditions: Object.assign(Object.assign({}, options.conditions), { ifTags: (_a = options.conditions) === null || _a === undefined ? undefined : _a.tagConditions }), + tracingOptions: updatedOptions.tracingOptions + })); + }); + } + async startCopyIncremental(copySource2, options = {}) { + return tracingClient.withSpan("PageBlobClient-startCopyIncremental", options, async (updatedOptions) => { + var _a; + return assertResponse(await this.pageBlobContext.copyIncremental(copySource2, { + abortSignal: options.abortSignal, + modifiedAccessConditions: Object.assign(Object.assign({}, options.conditions), { ifTags: (_a = options.conditions) === null || _a === undefined ? undefined : _a.tagConditions }), + tracingOptions: updatedOptions.tracingOptions + })); + }); + } + } + async function getBodyAsText(batchResponse) { + let buffer2 = Buffer.alloc(BATCH_MAX_PAYLOAD_IN_BYTES); + const responseLength = await streamToBuffer2(batchResponse.readableStreamBody, buffer2); + buffer2 = buffer2.slice(0, responseLength); + return buffer2.toString(); + } + function utf8ByteLength(str) { + return Buffer.byteLength(str); + } + var HTTP_HEADER_DELIMITER = ": "; + var SPACE_DELIMITER = " "; + var NOT_FOUND = -1; + + class BatchResponseParser { + constructor(batchResponse, subRequests) { + if (!batchResponse || !batchResponse.contentType) { + throw new RangeError("batchResponse is malformed or doesn't contain valid content-type."); + } + if (!subRequests || subRequests.size === 0) { + throw new RangeError("Invalid state: subRequests is not provided or size is 0."); + } + this.batchResponse = batchResponse; + this.subRequests = subRequests; + this.responseBatchBoundary = this.batchResponse.contentType.split("=")[1]; + this.perResponsePrefix = `--${this.responseBatchBoundary}${HTTP_LINE_ENDING}`; + this.batchResponseEnding = `--${this.responseBatchBoundary}--`; + } + async parseBatchResponse() { + if (this.batchResponse._response.status !== HTTPURLConnection.HTTP_ACCEPTED) { + throw new Error(`Invalid state: batch request failed with status: '${this.batchResponse._response.status}'.`); + } + const responseBodyAsText = await getBodyAsText(this.batchResponse); + const subResponses = responseBodyAsText.split(this.batchResponseEnding)[0].split(this.perResponsePrefix).slice(1); + const subResponseCount = subResponses.length; + if (subResponseCount !== this.subRequests.size && subResponseCount !== 1) { + throw new Error("Invalid state: sub responses' count is not equal to sub requests' count."); + } + const deserializedSubResponses = new Array(subResponseCount); + let subResponsesSucceededCount = 0; + let subResponsesFailedCount = 0; + for (let index = 0;index < subResponseCount; index++) { + const subResponse = subResponses[index]; + const deserializedSubResponse = {}; + deserializedSubResponse.headers = coreHttpCompat.toHttpHeadersLike(coreRestPipeline.createHttpHeaders()); + const responseLines = subResponse.split(`${HTTP_LINE_ENDING}`); + let subRespHeaderStartFound = false; + let subRespHeaderEndFound = false; + let subRespFailed = false; + let contentId = NOT_FOUND; + for (const responseLine of responseLines) { + if (!subRespHeaderStartFound) { + if (responseLine.startsWith(HeaderConstants.CONTENT_ID)) { + contentId = parseInt(responseLine.split(HTTP_HEADER_DELIMITER)[1]); + } + if (responseLine.startsWith(HTTP_VERSION_1_1)) { + subRespHeaderStartFound = true; + const tokens = responseLine.split(SPACE_DELIMITER); + deserializedSubResponse.status = parseInt(tokens[1]); + deserializedSubResponse.statusMessage = tokens.slice(2).join(SPACE_DELIMITER); + } + continue; + } + if (responseLine.trim() === "") { + if (!subRespHeaderEndFound) { + subRespHeaderEndFound = true; + } + continue; + } + if (!subRespHeaderEndFound) { + if (responseLine.indexOf(HTTP_HEADER_DELIMITER) === -1) { + throw new Error(`Invalid state: find non-empty line '${responseLine}' without HTTP header delimiter '${HTTP_HEADER_DELIMITER}'.`); + } + const tokens = responseLine.split(HTTP_HEADER_DELIMITER); + deserializedSubResponse.headers.set(tokens[0], tokens[1]); + if (tokens[0] === HeaderConstants.X_MS_ERROR_CODE) { + deserializedSubResponse.errorCode = tokens[1]; + subRespFailed = true; + } + } else { + if (!deserializedSubResponse.bodyAsText) { + deserializedSubResponse.bodyAsText = ""; + } + deserializedSubResponse.bodyAsText += responseLine; + } + } + if (contentId !== NOT_FOUND && Number.isInteger(contentId) && contentId >= 0 && contentId < this.subRequests.size && deserializedSubResponses[contentId] === undefined) { + deserializedSubResponse._request = this.subRequests.get(contentId); + deserializedSubResponses[contentId] = deserializedSubResponse; + } else { + logger.error(`subResponses[${index}] is dropped as the Content-ID is not found or invalid, Content-ID: ${contentId}`); + } + if (subRespFailed) { + subResponsesFailedCount++; + } else { + subResponsesSucceededCount++; + } + } + return { + subResponses: deserializedSubResponses, + subResponsesSucceededCount, + subResponsesFailedCount + }; + } + } + var MutexLockStatus; + (function(MutexLockStatus2) { + MutexLockStatus2[MutexLockStatus2["LOCKED"] = 0] = "LOCKED"; + MutexLockStatus2[MutexLockStatus2["UNLOCKED"] = 1] = "UNLOCKED"; + })(MutexLockStatus || (MutexLockStatus = {})); + + class Mutex { + static async lock(key) { + return new Promise((resolve) => { + if (this.keys[key] === undefined || this.keys[key] === MutexLockStatus.UNLOCKED) { + this.keys[key] = MutexLockStatus.LOCKED; + resolve(); + } else { + this.onUnlockEvent(key, () => { + this.keys[key] = MutexLockStatus.LOCKED; + resolve(); + }); + } + }); + } + static async unlock(key) { + return new Promise((resolve) => { + if (this.keys[key] === MutexLockStatus.LOCKED) { + this.emitUnlockEvent(key); + } + delete this.keys[key]; + resolve(); + }); + } + static onUnlockEvent(key, handler) { + if (this.listeners[key] === undefined) { + this.listeners[key] = [handler]; + } else { + this.listeners[key].push(handler); + } + } + static emitUnlockEvent(key) { + if (this.listeners[key] !== undefined && this.listeners[key].length > 0) { + const handler = this.listeners[key].shift(); + setImmediate(() => { + handler.call(this); + }); + } + } + } + Mutex.keys = {}; + Mutex.listeners = {}; + + class BlobBatch { + constructor() { + this.batch = "batch"; + this.batchRequest = new InnerBatchRequest; + } + getMultiPartContentType() { + return this.batchRequest.getMultipartContentType(); + } + getHttpRequestBody() { + return this.batchRequest.getHttpRequestBody(); + } + getSubRequests() { + return this.batchRequest.getSubRequests(); + } + async addSubRequestInternal(subRequest, assembleSubRequestFunc) { + await Mutex.lock(this.batch); + try { + this.batchRequest.preAddSubRequest(subRequest); + await assembleSubRequestFunc(); + this.batchRequest.postAddSubRequest(subRequest); + } finally { + await Mutex.unlock(this.batch); + } + } + setBatchType(batchType) { + if (!this.batchType) { + this.batchType = batchType; + } + if (this.batchType !== batchType) { + throw new RangeError(`BlobBatch only supports one operation type per batch and it already is being used for ${this.batchType} operations.`); + } + } + async deleteBlob(urlOrBlobClient, credentialOrOptions, options) { + let url2; + let credential; + if (typeof urlOrBlobClient === "string" && (coreUtil.isNode && credentialOrOptions instanceof StorageSharedKeyCredential || credentialOrOptions instanceof AnonymousCredential || coreAuth.isTokenCredential(credentialOrOptions))) { + url2 = urlOrBlobClient; + credential = credentialOrOptions; + } else if (urlOrBlobClient instanceof BlobClient) { + url2 = urlOrBlobClient.url; + credential = urlOrBlobClient.credential; + options = credentialOrOptions; + } else { + throw new RangeError("Invalid arguments. Either url and credential, or BlobClient need be provided."); + } + if (!options) { + options = {}; + } + return tracingClient.withSpan("BatchDeleteRequest-addSubRequest", options, async (updatedOptions) => { + this.setBatchType("delete"); + await this.addSubRequestInternal({ + url: url2, + credential + }, async () => { + await new BlobClient(url2, this.batchRequest.createPipeline(credential)).delete(updatedOptions); + }); + }); + } + async setBlobAccessTier(urlOrBlobClient, credentialOrTier, tierOrOptions, options) { + let url2; + let credential; + let tier2; + if (typeof urlOrBlobClient === "string" && (coreUtil.isNode && credentialOrTier instanceof StorageSharedKeyCredential || credentialOrTier instanceof AnonymousCredential || coreAuth.isTokenCredential(credentialOrTier))) { + url2 = urlOrBlobClient; + credential = credentialOrTier; + tier2 = tierOrOptions; + } else if (urlOrBlobClient instanceof BlobClient) { + url2 = urlOrBlobClient.url; + credential = urlOrBlobClient.credential; + tier2 = credentialOrTier; + options = tierOrOptions; + } else { + throw new RangeError("Invalid arguments. Either url and credential, or BlobClient need be provided."); + } + if (!options) { + options = {}; + } + return tracingClient.withSpan("BatchSetTierRequest-addSubRequest", options, async (updatedOptions) => { + this.setBatchType("setAccessTier"); + await this.addSubRequestInternal({ + url: url2, + credential + }, async () => { + await new BlobClient(url2, this.batchRequest.createPipeline(credential)).setAccessTier(tier2, updatedOptions); + }); + }); + } + } + + class InnerBatchRequest { + constructor() { + this.operationCount = 0; + this.body = ""; + const tempGuid = coreUtil.randomUUID(); + this.boundary = `batch_${tempGuid}`; + this.subRequestPrefix = `--${this.boundary}${HTTP_LINE_ENDING}${HeaderConstants.CONTENT_TYPE}: application/http${HTTP_LINE_ENDING}${HeaderConstants.CONTENT_TRANSFER_ENCODING}: binary`; + this.multipartContentType = `multipart/mixed; boundary=${this.boundary}`; + this.batchRequestEnding = `--${this.boundary}--`; + this.subRequests = new Map; + } + createPipeline(credential) { + const corePipeline = coreRestPipeline.createEmptyPipeline(); + corePipeline.addPolicy(coreClient.serializationPolicy({ + stringifyXML: coreXml.stringifyXML, + serializerOptions: { + xml: { + xmlCharKey: "#" + } + } + }), { phase: "Serialize" }); + corePipeline.addPolicy(batchHeaderFilterPolicy()); + corePipeline.addPolicy(batchRequestAssemblePolicy(this), { afterPhase: "Sign" }); + if (coreAuth.isTokenCredential(credential)) { + corePipeline.addPolicy(coreRestPipeline.bearerTokenAuthenticationPolicy({ + credential, + scopes: StorageOAuthScopes, + challengeCallbacks: { authorizeRequestOnChallenge: coreClient.authorizeRequestOnTenantChallenge } + }), { phase: "Sign" }); + } else if (credential instanceof StorageSharedKeyCredential) { + corePipeline.addPolicy(storageSharedKeyCredentialPolicy({ + accountName: credential.accountName, + accountKey: credential.accountKey + }), { phase: "Sign" }); + } + const pipeline = new Pipeline([]); + pipeline._credential = credential; + pipeline._corePipeline = corePipeline; + return pipeline; + } + appendSubRequestToBody(request) { + this.body += [ + this.subRequestPrefix, + `${HeaderConstants.CONTENT_ID}: ${this.operationCount}`, + "", + `${request.method.toString()} ${getURLPathAndQuery(request.url)} ${HTTP_VERSION_1_1}${HTTP_LINE_ENDING}` + ].join(HTTP_LINE_ENDING); + for (const [name, value] of request.headers) { + this.body += `${name}: ${value}${HTTP_LINE_ENDING}`; + } + this.body += HTTP_LINE_ENDING; + } + preAddSubRequest(subRequest) { + if (this.operationCount >= BATCH_MAX_REQUEST) { + throw new RangeError(`Cannot exceed ${BATCH_MAX_REQUEST} sub requests in a single batch`); + } + const path = getURLPath(subRequest.url); + if (!path || path === "") { + throw new RangeError(`Invalid url for sub request: '${subRequest.url}'`); + } + } + postAddSubRequest(subRequest) { + this.subRequests.set(this.operationCount, subRequest); + this.operationCount++; + } + getHttpRequestBody() { + return `${this.body}${this.batchRequestEnding}${HTTP_LINE_ENDING}`; + } + getMultipartContentType() { + return this.multipartContentType; + } + getSubRequests() { + return this.subRequests; + } + } + function batchRequestAssemblePolicy(batchRequest) { + return { + name: "batchRequestAssemblePolicy", + async sendRequest(request) { + batchRequest.appendSubRequestToBody(request); + return { + request, + status: 200, + headers: coreRestPipeline.createHttpHeaders() + }; + } + }; + } + function batchHeaderFilterPolicy() { + return { + name: "batchHeaderFilterPolicy", + async sendRequest(request, next) { + let xMsHeaderName = ""; + for (const [name] of request.headers) { + if (iEqual(name, HeaderConstants.X_MS_VERSION)) { + xMsHeaderName = name; + } + } + if (xMsHeaderName !== "") { + request.headers.delete(xMsHeaderName); + } + return next(request); + } + }; + } + + class BlobBatchClient { + constructor(url2, credentialOrPipeline, options) { + let pipeline; + if (isPipelineLike(credentialOrPipeline)) { + pipeline = credentialOrPipeline; + } else if (!credentialOrPipeline) { + pipeline = newPipeline(new AnonymousCredential, options); + } else { + pipeline = newPipeline(credentialOrPipeline, options); + } + const storageClientContext = new StorageContextClient(url2, getCoreClientOptions(pipeline)); + const path = getURLPath(url2); + if (path && path !== "/") { + this.serviceOrContainerContext = storageClientContext.container; + } else { + this.serviceOrContainerContext = storageClientContext.service; + } + } + createBatch() { + return new BlobBatch; + } + async deleteBlobs(urlsOrBlobClients, credentialOrOptions, options) { + const batch = new BlobBatch; + for (const urlOrBlobClient of urlsOrBlobClients) { + if (typeof urlOrBlobClient === "string") { + await batch.deleteBlob(urlOrBlobClient, credentialOrOptions, options); + } else { + await batch.deleteBlob(urlOrBlobClient, credentialOrOptions); + } + } + return this.submitBatch(batch); + } + async setBlobsAccessTier(urlsOrBlobClients, credentialOrTier, tierOrOptions, options) { + const batch = new BlobBatch; + for (const urlOrBlobClient of urlsOrBlobClients) { + if (typeof urlOrBlobClient === "string") { + await batch.setBlobAccessTier(urlOrBlobClient, credentialOrTier, tierOrOptions, options); + } else { + await batch.setBlobAccessTier(urlOrBlobClient, credentialOrTier, tierOrOptions); + } + } + return this.submitBatch(batch); + } + async submitBatch(batchRequest, options = {}) { + if (!batchRequest || batchRequest.getSubRequests().size === 0) { + throw new RangeError("Batch request should contain one or more sub requests."); + } + return tracingClient.withSpan("BlobBatchClient-submitBatch", options, async (updatedOptions) => { + const batchRequestBody = batchRequest.getHttpRequestBody(); + const rawBatchResponse = assertResponse(await this.serviceOrContainerContext.submitBatch(utf8ByteLength(batchRequestBody), batchRequest.getMultiPartContentType(), batchRequestBody, Object.assign({}, updatedOptions))); + const batchResponseParser = new BatchResponseParser(rawBatchResponse, batchRequest.getSubRequests()); + const responseSummary = await batchResponseParser.parseBatchResponse(); + const res = { + _response: rawBatchResponse._response, + contentType: rawBatchResponse.contentType, + errorCode: rawBatchResponse.errorCode, + requestId: rawBatchResponse.requestId, + clientRequestId: rawBatchResponse.clientRequestId, + version: rawBatchResponse.version, + subResponses: responseSummary.subResponses, + subResponsesSucceededCount: responseSummary.subResponsesSucceededCount, + subResponsesFailedCount: responseSummary.subResponsesFailedCount + }; + return res; + }); + } + } + + class ContainerClient extends StorageClient { + get containerName() { + return this._containerName; + } + constructor(urlOrConnectionString, credentialOrPipelineOrContainerName, options) { + let pipeline; + let url2; + options = options || {}; + if (isPipelineLike(credentialOrPipelineOrContainerName)) { + url2 = urlOrConnectionString; + pipeline = credentialOrPipelineOrContainerName; + } else if (coreUtil.isNode && credentialOrPipelineOrContainerName instanceof StorageSharedKeyCredential || credentialOrPipelineOrContainerName instanceof AnonymousCredential || coreAuth.isTokenCredential(credentialOrPipelineOrContainerName)) { + url2 = urlOrConnectionString; + pipeline = newPipeline(credentialOrPipelineOrContainerName, options); + } else if (!credentialOrPipelineOrContainerName && typeof credentialOrPipelineOrContainerName !== "string") { + url2 = urlOrConnectionString; + pipeline = newPipeline(new AnonymousCredential, options); + } else if (credentialOrPipelineOrContainerName && typeof credentialOrPipelineOrContainerName === "string") { + const containerName = credentialOrPipelineOrContainerName; + const extractedCreds = extractConnectionStringParts(urlOrConnectionString); + if (extractedCreds.kind === "AccountConnString") { + if (coreUtil.isNode) { + const sharedKeyCredential = new StorageSharedKeyCredential(extractedCreds.accountName, extractedCreds.accountKey); + url2 = appendToURLPath(extractedCreds.url, encodeURIComponent(containerName)); + if (!options.proxyOptions) { + options.proxyOptions = coreRestPipeline.getDefaultProxySettings(extractedCreds.proxyUri); + } + pipeline = newPipeline(sharedKeyCredential, options); + } else { + throw new Error("Account connection string is only supported in Node.js environment"); + } + } else if (extractedCreds.kind === "SASConnString") { + url2 = appendToURLPath(extractedCreds.url, encodeURIComponent(containerName)) + "?" + extractedCreds.accountSas; + pipeline = newPipeline(new AnonymousCredential, options); + } else { + throw new Error("Connection string must be either an Account connection string or a SAS connection string"); + } + } else { + throw new Error("Expecting non-empty strings for containerName parameter"); + } + super(url2, pipeline); + this._containerName = this.getContainerNameFromUrl(); + this.containerContext = this.storageClientContext.container; + } + async create(options = {}) { + return tracingClient.withSpan("ContainerClient-create", options, async (updatedOptions) => { + return assertResponse(await this.containerContext.create(updatedOptions)); + }); + } + async createIfNotExists(options = {}) { + return tracingClient.withSpan("ContainerClient-createIfNotExists", options, async (updatedOptions) => { + var _a, _b; + try { + const res = await this.create(updatedOptions); + return Object.assign(Object.assign({ succeeded: true }, res), { _response: res._response }); + } catch (e) { + if (((_a = e.details) === null || _a === undefined ? undefined : _a.errorCode) === "ContainerAlreadyExists") { + return Object.assign(Object.assign({ succeeded: false }, (_b = e.response) === null || _b === undefined ? undefined : _b.parsedHeaders), { _response: e.response }); + } else { + throw e; + } + } + }); + } + async exists(options = {}) { + return tracingClient.withSpan("ContainerClient-exists", options, async (updatedOptions) => { + try { + await this.getProperties({ + abortSignal: options.abortSignal, + tracingOptions: updatedOptions.tracingOptions + }); + return true; + } catch (e) { + if (e.statusCode === 404) { + return false; + } + throw e; + } + }); + } + getBlobClient(blobName) { + return new BlobClient(appendToURLPath(this.url, EscapePath(blobName)), this.pipeline); + } + getAppendBlobClient(blobName) { + return new AppendBlobClient(appendToURLPath(this.url, EscapePath(blobName)), this.pipeline); + } + getBlockBlobClient(blobName) { + return new BlockBlobClient(appendToURLPath(this.url, EscapePath(blobName)), this.pipeline); + } + getPageBlobClient(blobName) { + return new PageBlobClient(appendToURLPath(this.url, EscapePath(blobName)), this.pipeline); + } + async getProperties(options = {}) { + if (!options.conditions) { + options.conditions = {}; + } + return tracingClient.withSpan("ContainerClient-getProperties", options, async (updatedOptions) => { + return assertResponse(await this.containerContext.getProperties(Object.assign(Object.assign({ abortSignal: options.abortSignal }, options.conditions), { tracingOptions: updatedOptions.tracingOptions }))); + }); + } + async delete(options = {}) { + if (!options.conditions) { + options.conditions = {}; + } + return tracingClient.withSpan("ContainerClient-delete", options, async (updatedOptions) => { + return assertResponse(await this.containerContext.delete({ + abortSignal: options.abortSignal, + leaseAccessConditions: options.conditions, + modifiedAccessConditions: options.conditions, + tracingOptions: updatedOptions.tracingOptions + })); + }); + } + async deleteIfExists(options = {}) { + return tracingClient.withSpan("ContainerClient-deleteIfExists", options, async (updatedOptions) => { + var _a, _b; + try { + const res = await this.delete(updatedOptions); + return Object.assign(Object.assign({ succeeded: true }, res), { _response: res._response }); + } catch (e) { + if (((_a = e.details) === null || _a === undefined ? undefined : _a.errorCode) === "ContainerNotFound") { + return Object.assign(Object.assign({ succeeded: false }, (_b = e.response) === null || _b === undefined ? undefined : _b.parsedHeaders), { _response: e.response }); + } + throw e; + } + }); + } + async setMetadata(metadata2, options = {}) { + if (!options.conditions) { + options.conditions = {}; + } + if (options.conditions.ifUnmodifiedSince) { + throw new RangeError("the IfUnmodifiedSince must have their default values because they are ignored by the blob service"); + } + return tracingClient.withSpan("ContainerClient-setMetadata", options, async (updatedOptions) => { + return assertResponse(await this.containerContext.setMetadata({ + abortSignal: options.abortSignal, + leaseAccessConditions: options.conditions, + metadata: metadata2, + modifiedAccessConditions: options.conditions, + tracingOptions: updatedOptions.tracingOptions + })); + }); + } + async getAccessPolicy(options = {}) { + if (!options.conditions) { + options.conditions = {}; + } + return tracingClient.withSpan("ContainerClient-getAccessPolicy", options, async (updatedOptions) => { + const response = assertResponse(await this.containerContext.getAccessPolicy({ + abortSignal: options.abortSignal, + leaseAccessConditions: options.conditions, + tracingOptions: updatedOptions.tracingOptions + })); + const res = { + _response: response._response, + blobPublicAccess: response.blobPublicAccess, + date: response.date, + etag: response.etag, + errorCode: response.errorCode, + lastModified: response.lastModified, + requestId: response.requestId, + clientRequestId: response.clientRequestId, + signedIdentifiers: [], + version: response.version + }; + for (const identifier of response) { + let accessPolicy = undefined; + if (identifier.accessPolicy) { + accessPolicy = { + permissions: identifier.accessPolicy.permissions + }; + if (identifier.accessPolicy.expiresOn) { + accessPolicy.expiresOn = new Date(identifier.accessPolicy.expiresOn); + } + if (identifier.accessPolicy.startsOn) { + accessPolicy.startsOn = new Date(identifier.accessPolicy.startsOn); + } + } + res.signedIdentifiers.push({ + accessPolicy, + id: identifier.id + }); + } + return res; + }); + } + async setAccessPolicy(access2, containerAcl2, options = {}) { + options.conditions = options.conditions || {}; + return tracingClient.withSpan("ContainerClient-setAccessPolicy", options, async (updatedOptions) => { + const acl = []; + for (const identifier of containerAcl2 || []) { + acl.push({ + accessPolicy: { + expiresOn: identifier.accessPolicy.expiresOn ? truncatedISO8061Date(identifier.accessPolicy.expiresOn) : "", + permissions: identifier.accessPolicy.permissions, + startsOn: identifier.accessPolicy.startsOn ? truncatedISO8061Date(identifier.accessPolicy.startsOn) : "" + }, + id: identifier.id + }); + } + return assertResponse(await this.containerContext.setAccessPolicy({ + abortSignal: options.abortSignal, + access: access2, + containerAcl: acl, + leaseAccessConditions: options.conditions, + modifiedAccessConditions: options.conditions, + tracingOptions: updatedOptions.tracingOptions + })); + }); + } + getBlobLeaseClient(proposeLeaseId) { + return new BlobLeaseClient(this, proposeLeaseId); + } + async uploadBlockBlob(blobName, body2, contentLength2, options = {}) { + return tracingClient.withSpan("ContainerClient-uploadBlockBlob", options, async (updatedOptions) => { + const blockBlobClient = this.getBlockBlobClient(blobName); + const response = await blockBlobClient.upload(body2, contentLength2, updatedOptions); + return { + blockBlobClient, + response + }; + }); + } + async deleteBlob(blobName, options = {}) { + return tracingClient.withSpan("ContainerClient-deleteBlob", options, async (updatedOptions) => { + let blobClient = this.getBlobClient(blobName); + if (options.versionId) { + blobClient = blobClient.withVersion(options.versionId); + } + return blobClient.delete(updatedOptions); + }); + } + async listBlobFlatSegment(marker2, options = {}) { + return tracingClient.withSpan("ContainerClient-listBlobFlatSegment", options, async (updatedOptions) => { + const response = assertResponse(await this.containerContext.listBlobFlatSegment(Object.assign(Object.assign({ marker: marker2 }, options), { tracingOptions: updatedOptions.tracingOptions }))); + const wrappedResponse = Object.assign(Object.assign({}, response), { _response: Object.assign(Object.assign({}, response._response), { parsedBody: ConvertInternalResponseOfListBlobFlat(response._response.parsedBody) }), segment: Object.assign(Object.assign({}, response.segment), { blobItems: response.segment.blobItems.map((blobItemInternal) => { + const blobItem = Object.assign(Object.assign({}, blobItemInternal), { name: BlobNameToString(blobItemInternal.name), tags: toTags(blobItemInternal.blobTags), objectReplicationSourceProperties: parseObjectReplicationRecord(blobItemInternal.objectReplicationMetadata) }); + return blobItem; + }) }) }); + return wrappedResponse; + }); + } + async listBlobHierarchySegment(delimiter2, marker2, options = {}) { + return tracingClient.withSpan("ContainerClient-listBlobHierarchySegment", options, async (updatedOptions) => { + var _a; + const response = assertResponse(await this.containerContext.listBlobHierarchySegment(delimiter2, Object.assign(Object.assign({ marker: marker2 }, options), { tracingOptions: updatedOptions.tracingOptions }))); + const wrappedResponse = Object.assign(Object.assign({}, response), { _response: Object.assign(Object.assign({}, response._response), { parsedBody: ConvertInternalResponseOfListBlobHierarchy(response._response.parsedBody) }), segment: Object.assign(Object.assign({}, response.segment), { blobItems: response.segment.blobItems.map((blobItemInternal) => { + const blobItem = Object.assign(Object.assign({}, blobItemInternal), { name: BlobNameToString(blobItemInternal.name), tags: toTags(blobItemInternal.blobTags), objectReplicationSourceProperties: parseObjectReplicationRecord(blobItemInternal.objectReplicationMetadata) }); + return blobItem; + }), blobPrefixes: (_a = response.segment.blobPrefixes) === null || _a === undefined ? undefined : _a.map((blobPrefixInternal) => { + const blobPrefix = Object.assign(Object.assign({}, blobPrefixInternal), { name: BlobNameToString(blobPrefixInternal.name) }); + return blobPrefix; + }) }) }); + return wrappedResponse; + }); + } + listSegments(marker_1) { + return tslib.__asyncGenerator(this, arguments, function* listSegments_1(marker2, options = {}) { + let listBlobsFlatSegmentResponse; + if (!!marker2 || marker2 === undefined) { + do { + listBlobsFlatSegmentResponse = yield tslib.__await(this.listBlobFlatSegment(marker2, options)); + marker2 = listBlobsFlatSegmentResponse.continuationToken; + yield yield tslib.__await(yield tslib.__await(listBlobsFlatSegmentResponse)); + } while (marker2); + } + }); + } + listItems() { + return tslib.__asyncGenerator(this, arguments, function* listItems_1(options = {}) { + var _a, e_1, _b, _c; + let marker2; + try { + for (var _d = true, _e = tslib.__asyncValues(this.listSegments(marker2, options)), _f;_f = yield tslib.__await(_e.next()), _a = _f.done, !_a; _d = true) { + _c = _f.value; + _d = false; + const listBlobsFlatSegmentResponse = _c; + yield tslib.__await(yield* tslib.__asyncDelegator(tslib.__asyncValues(listBlobsFlatSegmentResponse.segment.blobItems))); + } + } catch (e_1_1) { + e_1 = { error: e_1_1 }; + } finally { + try { + if (!_d && !_a && (_b = _e.return)) + yield tslib.__await(_b.call(_e)); + } finally { + if (e_1) + throw e_1.error; + } + } + }); + } + listBlobsFlat(options = {}) { + const include2 = []; + if (options.includeCopy) { + include2.push("copy"); + } + if (options.includeDeleted) { + include2.push("deleted"); + } + if (options.includeMetadata) { + include2.push("metadata"); + } + if (options.includeSnapshots) { + include2.push("snapshots"); + } + if (options.includeVersions) { + include2.push("versions"); + } + if (options.includeUncommitedBlobs) { + include2.push("uncommittedblobs"); + } + if (options.includeTags) { + include2.push("tags"); + } + if (options.includeDeletedWithVersions) { + include2.push("deletedwithversions"); + } + if (options.includeImmutabilityPolicy) { + include2.push("immutabilitypolicy"); + } + if (options.includeLegalHold) { + include2.push("legalhold"); + } + if (options.prefix === "") { + options.prefix = undefined; + } + const updatedOptions = Object.assign(Object.assign({}, options), include2.length > 0 ? { include: include2 } : {}); + const iter = this.listItems(updatedOptions); + return { + next() { + return iter.next(); + }, + [Symbol.asyncIterator]() { + return this; + }, + byPage: (settings = {}) => { + return this.listSegments(settings.continuationToken, Object.assign({ maxPageSize: settings.maxPageSize }, updatedOptions)); + } + }; + } + listHierarchySegments(delimiter_1, marker_1) { + return tslib.__asyncGenerator(this, arguments, function* listHierarchySegments_1(delimiter2, marker2, options = {}) { + let listBlobsHierarchySegmentResponse; + if (!!marker2 || marker2 === undefined) { + do { + listBlobsHierarchySegmentResponse = yield tslib.__await(this.listBlobHierarchySegment(delimiter2, marker2, options)); + marker2 = listBlobsHierarchySegmentResponse.continuationToken; + yield yield tslib.__await(yield tslib.__await(listBlobsHierarchySegmentResponse)); + } while (marker2); + } + }); + } + listItemsByHierarchy(delimiter_1) { + return tslib.__asyncGenerator(this, arguments, function* listItemsByHierarchy_1(delimiter2, options = {}) { + var _a, e_2, _b, _c; + let marker2; + try { + for (var _d = true, _e = tslib.__asyncValues(this.listHierarchySegments(delimiter2, marker2, options)), _f;_f = yield tslib.__await(_e.next()), _a = _f.done, !_a; _d = true) { + _c = _f.value; + _d = false; + const listBlobsHierarchySegmentResponse = _c; + const segment = listBlobsHierarchySegmentResponse.segment; + if (segment.blobPrefixes) { + for (const prefix2 of segment.blobPrefixes) { + yield yield tslib.__await(Object.assign({ kind: "prefix" }, prefix2)); + } + } + for (const blob of segment.blobItems) { + yield yield tslib.__await(Object.assign({ kind: "blob" }, blob)); + } + } + } catch (e_2_1) { + e_2 = { error: e_2_1 }; + } finally { + try { + if (!_d && !_a && (_b = _e.return)) + yield tslib.__await(_b.call(_e)); + } finally { + if (e_2) + throw e_2.error; + } + } + }); + } + listBlobsByHierarchy(delimiter2, options = {}) { + if (delimiter2 === "") { + throw new RangeError("delimiter should contain one or more characters"); + } + const include2 = []; + if (options.includeCopy) { + include2.push("copy"); + } + if (options.includeDeleted) { + include2.push("deleted"); + } + if (options.includeMetadata) { + include2.push("metadata"); + } + if (options.includeSnapshots) { + include2.push("snapshots"); + } + if (options.includeVersions) { + include2.push("versions"); + } + if (options.includeUncommitedBlobs) { + include2.push("uncommittedblobs"); + } + if (options.includeTags) { + include2.push("tags"); + } + if (options.includeDeletedWithVersions) { + include2.push("deletedwithversions"); + } + if (options.includeImmutabilityPolicy) { + include2.push("immutabilitypolicy"); + } + if (options.includeLegalHold) { + include2.push("legalhold"); + } + if (options.prefix === "") { + options.prefix = undefined; + } + const updatedOptions = Object.assign(Object.assign({}, options), include2.length > 0 ? { include: include2 } : {}); + const iter = this.listItemsByHierarchy(delimiter2, updatedOptions); + return { + async next() { + return iter.next(); + }, + [Symbol.asyncIterator]() { + return this; + }, + byPage: (settings = {}) => { + return this.listHierarchySegments(delimiter2, settings.continuationToken, Object.assign({ maxPageSize: settings.maxPageSize }, updatedOptions)); + } + }; + } + async findBlobsByTagsSegment(tagFilterSqlExpression, marker2, options = {}) { + return tracingClient.withSpan("ContainerClient-findBlobsByTagsSegment", options, async (updatedOptions) => { + const response = assertResponse(await this.containerContext.filterBlobs({ + abortSignal: options.abortSignal, + where: tagFilterSqlExpression, + marker: marker2, + maxPageSize: options.maxPageSize, + tracingOptions: updatedOptions.tracingOptions + })); + const wrappedResponse = Object.assign(Object.assign({}, response), { _response: response._response, blobs: response.blobs.map((blob) => { + var _a; + let tagValue = ""; + if (((_a = blob.tags) === null || _a === undefined ? undefined : _a.blobTagSet.length) === 1) { + tagValue = blob.tags.blobTagSet[0].value; + } + return Object.assign(Object.assign({}, blob), { tags: toTags(blob.tags), tagValue }); + }) }); + return wrappedResponse; + }); + } + findBlobsByTagsSegments(tagFilterSqlExpression_1, marker_1) { + return tslib.__asyncGenerator(this, arguments, function* findBlobsByTagsSegments_1(tagFilterSqlExpression, marker2, options = {}) { + let response; + if (!!marker2 || marker2 === undefined) { + do { + response = yield tslib.__await(this.findBlobsByTagsSegment(tagFilterSqlExpression, marker2, options)); + response.blobs = response.blobs || []; + marker2 = response.continuationToken; + yield yield tslib.__await(response); + } while (marker2); + } + }); + } + findBlobsByTagsItems(tagFilterSqlExpression_1) { + return tslib.__asyncGenerator(this, arguments, function* findBlobsByTagsItems_1(tagFilterSqlExpression, options = {}) { + var _a, e_3, _b, _c; + let marker2; + try { + for (var _d = true, _e = tslib.__asyncValues(this.findBlobsByTagsSegments(tagFilterSqlExpression, marker2, options)), _f;_f = yield tslib.__await(_e.next()), _a = _f.done, !_a; _d = true) { + _c = _f.value; + _d = false; + const segment = _c; + yield tslib.__await(yield* tslib.__asyncDelegator(tslib.__asyncValues(segment.blobs))); + } + } catch (e_3_1) { + e_3 = { error: e_3_1 }; + } finally { + try { + if (!_d && !_a && (_b = _e.return)) + yield tslib.__await(_b.call(_e)); + } finally { + if (e_3) + throw e_3.error; + } + } + }); + } + findBlobsByTags(tagFilterSqlExpression, options = {}) { + const listSegmentOptions = Object.assign({}, options); + const iter = this.findBlobsByTagsItems(tagFilterSqlExpression, listSegmentOptions); + return { + next() { + return iter.next(); + }, + [Symbol.asyncIterator]() { + return this; + }, + byPage: (settings = {}) => { + return this.findBlobsByTagsSegments(tagFilterSqlExpression, settings.continuationToken, Object.assign({ maxPageSize: settings.maxPageSize }, listSegmentOptions)); + } + }; + } + async getAccountInfo(options = {}) { + return tracingClient.withSpan("ContainerClient-getAccountInfo", options, async (updatedOptions) => { + return assertResponse(await this.containerContext.getAccountInfo({ + abortSignal: options.abortSignal, + tracingOptions: updatedOptions.tracingOptions + })); + }); + } + getContainerNameFromUrl() { + let containerName; + try { + const parsedUrl = new URL(this.url); + if (parsedUrl.hostname.split(".")[1] === "blob") { + containerName = parsedUrl.pathname.split("/")[1]; + } else if (isIpEndpointStyle(parsedUrl)) { + containerName = parsedUrl.pathname.split("/")[2]; + } else { + containerName = parsedUrl.pathname.split("/")[1]; + } + containerName = decodeURIComponent(containerName); + if (!containerName) { + throw new Error("Provided containerName is invalid."); + } + return containerName; + } catch (error) { + throw new Error("Unable to extract containerName with provided information."); + } + } + generateSasUrl(options) { + return new Promise((resolve) => { + if (!(this.credential instanceof StorageSharedKeyCredential)) { + throw new RangeError("Can only generate the SAS when the client is initialized with a shared key credential"); + } + const sas = generateBlobSASQueryParameters(Object.assign({ containerName: this._containerName }, options), this.credential).toString(); + resolve(appendToURLQuery(this.url, sas)); + }); + } + generateSasStringToSign(options) { + if (!(this.credential instanceof StorageSharedKeyCredential)) { + throw new RangeError("Can only generate the SAS when the client is initialized with a shared key credential"); + } + return generateBlobSASQueryParametersInternal(Object.assign({ containerName: this._containerName }, options), this.credential).stringToSign; + } + getBlobBatchClient() { + return new BlobBatchClient(this.url, this.pipeline); + } + } + + class AccountSASPermissions { + constructor() { + this.read = false; + this.write = false; + this.delete = false; + this.deleteVersion = false; + this.list = false; + this.add = false; + this.create = false; + this.update = false; + this.process = false; + this.tag = false; + this.filter = false; + this.setImmutabilityPolicy = false; + this.permanentDelete = false; + } + static parse(permissions) { + const accountSASPermissions = new AccountSASPermissions; + for (const c of permissions) { + switch (c) { + case "r": + accountSASPermissions.read = true; + break; + case "w": + accountSASPermissions.write = true; + break; + case "d": + accountSASPermissions.delete = true; + break; + case "x": + accountSASPermissions.deleteVersion = true; + break; + case "l": + accountSASPermissions.list = true; + break; + case "a": + accountSASPermissions.add = true; + break; + case "c": + accountSASPermissions.create = true; + break; + case "u": + accountSASPermissions.update = true; + break; + case "p": + accountSASPermissions.process = true; + break; + case "t": + accountSASPermissions.tag = true; + break; + case "f": + accountSASPermissions.filter = true; + break; + case "i": + accountSASPermissions.setImmutabilityPolicy = true; + break; + case "y": + accountSASPermissions.permanentDelete = true; + break; + default: + throw new RangeError(`Invalid permission character: ${c}`); + } + } + return accountSASPermissions; + } + static from(permissionLike) { + const accountSASPermissions = new AccountSASPermissions; + if (permissionLike.read) { + accountSASPermissions.read = true; + } + if (permissionLike.write) { + accountSASPermissions.write = true; + } + if (permissionLike.delete) { + accountSASPermissions.delete = true; + } + if (permissionLike.deleteVersion) { + accountSASPermissions.deleteVersion = true; + } + if (permissionLike.filter) { + accountSASPermissions.filter = true; + } + if (permissionLike.tag) { + accountSASPermissions.tag = true; + } + if (permissionLike.list) { + accountSASPermissions.list = true; + } + if (permissionLike.add) { + accountSASPermissions.add = true; + } + if (permissionLike.create) { + accountSASPermissions.create = true; + } + if (permissionLike.update) { + accountSASPermissions.update = true; + } + if (permissionLike.process) { + accountSASPermissions.process = true; + } + if (permissionLike.setImmutabilityPolicy) { + accountSASPermissions.setImmutabilityPolicy = true; + } + if (permissionLike.permanentDelete) { + accountSASPermissions.permanentDelete = true; + } + return accountSASPermissions; + } + toString() { + const permissions = []; + if (this.read) { + permissions.push("r"); + } + if (this.write) { + permissions.push("w"); + } + if (this.delete) { + permissions.push("d"); + } + if (this.deleteVersion) { + permissions.push("x"); + } + if (this.filter) { + permissions.push("f"); + } + if (this.tag) { + permissions.push("t"); + } + if (this.list) { + permissions.push("l"); + } + if (this.add) { + permissions.push("a"); + } + if (this.create) { + permissions.push("c"); + } + if (this.update) { + permissions.push("u"); + } + if (this.process) { + permissions.push("p"); + } + if (this.setImmutabilityPolicy) { + permissions.push("i"); + } + if (this.permanentDelete) { + permissions.push("y"); + } + return permissions.join(""); + } + } + + class AccountSASResourceTypes { + constructor() { + this.service = false; + this.container = false; + this.object = false; + } + static parse(resourceTypes) { + const accountSASResourceTypes = new AccountSASResourceTypes; + for (const c of resourceTypes) { + switch (c) { + case "s": + accountSASResourceTypes.service = true; + break; + case "c": + accountSASResourceTypes.container = true; + break; + case "o": + accountSASResourceTypes.object = true; + break; + default: + throw new RangeError(`Invalid resource type: ${c}`); + } + } + return accountSASResourceTypes; + } + toString() { + const resourceTypes = []; + if (this.service) { + resourceTypes.push("s"); + } + if (this.container) { + resourceTypes.push("c"); + } + if (this.object) { + resourceTypes.push("o"); + } + return resourceTypes.join(""); + } + } + + class AccountSASServices { + constructor() { + this.blob = false; + this.file = false; + this.queue = false; + this.table = false; + } + static parse(services) { + const accountSASServices = new AccountSASServices; + for (const c of services) { + switch (c) { + case "b": + accountSASServices.blob = true; + break; + case "f": + accountSASServices.file = true; + break; + case "q": + accountSASServices.queue = true; + break; + case "t": + accountSASServices.table = true; + break; + default: + throw new RangeError(`Invalid service character: ${c}`); + } + } + return accountSASServices; + } + toString() { + const services = []; + if (this.blob) { + services.push("b"); + } + if (this.table) { + services.push("t"); + } + if (this.queue) { + services.push("q"); + } + if (this.file) { + services.push("f"); + } + return services.join(""); + } + } + function generateAccountSASQueryParameters(accountSASSignatureValues, sharedKeyCredential) { + return generateAccountSASQueryParametersInternal(accountSASSignatureValues, sharedKeyCredential).sasQueryParameters; + } + function generateAccountSASQueryParametersInternal(accountSASSignatureValues, sharedKeyCredential) { + const version2 = accountSASSignatureValues.version ? accountSASSignatureValues.version : SERVICE_VERSION; + if (accountSASSignatureValues.permissions && accountSASSignatureValues.permissions.setImmutabilityPolicy && version2 < "2020-08-04") { + throw RangeError("'version' must be >= '2020-08-04' when provided 'i' permission."); + } + if (accountSASSignatureValues.permissions && accountSASSignatureValues.permissions.deleteVersion && version2 < "2019-10-10") { + throw RangeError("'version' must be >= '2019-10-10' when provided 'x' permission."); + } + if (accountSASSignatureValues.permissions && accountSASSignatureValues.permissions.permanentDelete && version2 < "2019-10-10") { + throw RangeError("'version' must be >= '2019-10-10' when provided 'y' permission."); + } + if (accountSASSignatureValues.permissions && accountSASSignatureValues.permissions.tag && version2 < "2019-12-12") { + throw RangeError("'version' must be >= '2019-12-12' when provided 't' permission."); + } + if (accountSASSignatureValues.permissions && accountSASSignatureValues.permissions.filter && version2 < "2019-12-12") { + throw RangeError("'version' must be >= '2019-12-12' when provided 'f' permission."); + } + if (accountSASSignatureValues.encryptionScope && version2 < "2020-12-06") { + throw RangeError("'version' must be >= '2020-12-06' when provided 'encryptionScope' in SAS."); + } + const parsedPermissions = AccountSASPermissions.parse(accountSASSignatureValues.permissions.toString()); + const parsedServices = AccountSASServices.parse(accountSASSignatureValues.services).toString(); + const parsedResourceTypes = AccountSASResourceTypes.parse(accountSASSignatureValues.resourceTypes).toString(); + let stringToSign; + if (version2 >= "2020-12-06") { + stringToSign = [ + sharedKeyCredential.accountName, + parsedPermissions, + parsedServices, + parsedResourceTypes, + accountSASSignatureValues.startsOn ? truncatedISO8061Date(accountSASSignatureValues.startsOn, false) : "", + truncatedISO8061Date(accountSASSignatureValues.expiresOn, false), + accountSASSignatureValues.ipRange ? ipRangeToString(accountSASSignatureValues.ipRange) : "", + accountSASSignatureValues.protocol ? accountSASSignatureValues.protocol : "", + version2, + accountSASSignatureValues.encryptionScope ? accountSASSignatureValues.encryptionScope : "", + "" + ].join("\n"); + } else { + stringToSign = [ + sharedKeyCredential.accountName, + parsedPermissions, + parsedServices, + parsedResourceTypes, + accountSASSignatureValues.startsOn ? truncatedISO8061Date(accountSASSignatureValues.startsOn, false) : "", + truncatedISO8061Date(accountSASSignatureValues.expiresOn, false), + accountSASSignatureValues.ipRange ? ipRangeToString(accountSASSignatureValues.ipRange) : "", + accountSASSignatureValues.protocol ? accountSASSignatureValues.protocol : "", + version2, + "" + ].join("\n"); + } + const signature = sharedKeyCredential.computeHMACSHA256(stringToSign); + return { + sasQueryParameters: new SASQueryParameters(version2, signature, parsedPermissions.toString(), parsedServices, parsedResourceTypes, accountSASSignatureValues.protocol, accountSASSignatureValues.startsOn, accountSASSignatureValues.expiresOn, accountSASSignatureValues.ipRange, undefined, undefined, undefined, undefined, undefined, undefined, undefined, undefined, undefined, undefined, accountSASSignatureValues.encryptionScope), + stringToSign + }; + } + + class BlobServiceClient extends StorageClient { + static fromConnectionString(connectionString, options) { + options = options || {}; + const extractedCreds = extractConnectionStringParts(connectionString); + if (extractedCreds.kind === "AccountConnString") { + if (coreUtil.isNode) { + const sharedKeyCredential = new StorageSharedKeyCredential(extractedCreds.accountName, extractedCreds.accountKey); + if (!options.proxyOptions) { + options.proxyOptions = coreRestPipeline.getDefaultProxySettings(extractedCreds.proxyUri); + } + const pipeline = newPipeline(sharedKeyCredential, options); + return new BlobServiceClient(extractedCreds.url, pipeline); + } else { + throw new Error("Account connection string is only supported in Node.js environment"); + } + } else if (extractedCreds.kind === "SASConnString") { + const pipeline = newPipeline(new AnonymousCredential, options); + return new BlobServiceClient(extractedCreds.url + "?" + extractedCreds.accountSas, pipeline); + } else { + throw new Error("Connection string must be either an Account connection string or a SAS connection string"); + } + } + constructor(url2, credentialOrPipeline, options) { + let pipeline; + if (isPipelineLike(credentialOrPipeline)) { + pipeline = credentialOrPipeline; + } else if (coreUtil.isNode && credentialOrPipeline instanceof StorageSharedKeyCredential || credentialOrPipeline instanceof AnonymousCredential || coreAuth.isTokenCredential(credentialOrPipeline)) { + pipeline = newPipeline(credentialOrPipeline, options); + } else { + pipeline = newPipeline(new AnonymousCredential, options); + } + super(url2, pipeline); + this.serviceContext = this.storageClientContext.service; + } + getContainerClient(containerName) { + return new ContainerClient(appendToURLPath(this.url, encodeURIComponent(containerName)), this.pipeline); + } + async createContainer(containerName, options = {}) { + return tracingClient.withSpan("BlobServiceClient-createContainer", options, async (updatedOptions) => { + const containerClient = this.getContainerClient(containerName); + const containerCreateResponse = await containerClient.create(updatedOptions); + return { + containerClient, + containerCreateResponse + }; + }); + } + async deleteContainer(containerName, options = {}) { + return tracingClient.withSpan("BlobServiceClient-deleteContainer", options, async (updatedOptions) => { + const containerClient = this.getContainerClient(containerName); + return containerClient.delete(updatedOptions); + }); + } + async undeleteContainer(deletedContainerName2, deletedContainerVersion2, options = {}) { + return tracingClient.withSpan("BlobServiceClient-undeleteContainer", options, async (updatedOptions) => { + const containerClient = this.getContainerClient(options.destinationContainerName || deletedContainerName2); + const containerContext = containerClient["storageClientContext"].container; + const containerUndeleteResponse = assertResponse(await containerContext.restore({ + deletedContainerName: deletedContainerName2, + deletedContainerVersion: deletedContainerVersion2, + tracingOptions: updatedOptions.tracingOptions + })); + return { containerClient, containerUndeleteResponse }; + }); + } + async renameContainer(sourceContainerName2, destinationContainerName, options = {}) { + return tracingClient.withSpan("BlobServiceClient-renameContainer", options, async (updatedOptions) => { + var _a; + const containerClient = this.getContainerClient(destinationContainerName); + const containerContext = containerClient["storageClientContext"].container; + const containerRenameResponse = assertResponse(await containerContext.rename(sourceContainerName2, Object.assign(Object.assign({}, updatedOptions), { sourceLeaseId: (_a = options.sourceCondition) === null || _a === undefined ? undefined : _a.leaseId }))); + return { containerClient, containerRenameResponse }; + }); + } + async getProperties(options = {}) { + return tracingClient.withSpan("BlobServiceClient-getProperties", options, async (updatedOptions) => { + return assertResponse(await this.serviceContext.getProperties({ + abortSignal: options.abortSignal, + tracingOptions: updatedOptions.tracingOptions + })); + }); + } + async setProperties(properties, options = {}) { + return tracingClient.withSpan("BlobServiceClient-setProperties", options, async (updatedOptions) => { + return assertResponse(await this.serviceContext.setProperties(properties, { + abortSignal: options.abortSignal, + tracingOptions: updatedOptions.tracingOptions + })); + }); + } + async getStatistics(options = {}) { + return tracingClient.withSpan("BlobServiceClient-getStatistics", options, async (updatedOptions) => { + return assertResponse(await this.serviceContext.getStatistics({ + abortSignal: options.abortSignal, + tracingOptions: updatedOptions.tracingOptions + })); + }); + } + async getAccountInfo(options = {}) { + return tracingClient.withSpan("BlobServiceClient-getAccountInfo", options, async (updatedOptions) => { + return assertResponse(await this.serviceContext.getAccountInfo({ + abortSignal: options.abortSignal, + tracingOptions: updatedOptions.tracingOptions + })); + }); + } + async listContainersSegment(marker2, options = {}) { + return tracingClient.withSpan("BlobServiceClient-listContainersSegment", options, async (updatedOptions) => { + return assertResponse(await this.serviceContext.listContainersSegment(Object.assign(Object.assign({ abortSignal: options.abortSignal, marker: marker2 }, options), { include: typeof options.include === "string" ? [options.include] : options.include, tracingOptions: updatedOptions.tracingOptions }))); + }); + } + async findBlobsByTagsSegment(tagFilterSqlExpression, marker2, options = {}) { + return tracingClient.withSpan("BlobServiceClient-findBlobsByTagsSegment", options, async (updatedOptions) => { + const response = assertResponse(await this.serviceContext.filterBlobs({ + abortSignal: options.abortSignal, + where: tagFilterSqlExpression, + marker: marker2, + maxPageSize: options.maxPageSize, + tracingOptions: updatedOptions.tracingOptions + })); + const wrappedResponse = Object.assign(Object.assign({}, response), { _response: response._response, blobs: response.blobs.map((blob) => { + var _a; + let tagValue = ""; + if (((_a = blob.tags) === null || _a === undefined ? undefined : _a.blobTagSet.length) === 1) { + tagValue = blob.tags.blobTagSet[0].value; + } + return Object.assign(Object.assign({}, blob), { tags: toTags(blob.tags), tagValue }); + }) }); + return wrappedResponse; + }); + } + findBlobsByTagsSegments(tagFilterSqlExpression_1, marker_1) { + return tslib.__asyncGenerator(this, arguments, function* findBlobsByTagsSegments_1(tagFilterSqlExpression, marker2, options = {}) { + let response; + if (!!marker2 || marker2 === undefined) { + do { + response = yield tslib.__await(this.findBlobsByTagsSegment(tagFilterSqlExpression, marker2, options)); + response.blobs = response.blobs || []; + marker2 = response.continuationToken; + yield yield tslib.__await(response); + } while (marker2); + } + }); + } + findBlobsByTagsItems(tagFilterSqlExpression_1) { + return tslib.__asyncGenerator(this, arguments, function* findBlobsByTagsItems_1(tagFilterSqlExpression, options = {}) { + var _a, e_1, _b, _c; + let marker2; + try { + for (var _d = true, _e = tslib.__asyncValues(this.findBlobsByTagsSegments(tagFilterSqlExpression, marker2, options)), _f;_f = yield tslib.__await(_e.next()), _a = _f.done, !_a; _d = true) { + _c = _f.value; + _d = false; + const segment = _c; + yield tslib.__await(yield* tslib.__asyncDelegator(tslib.__asyncValues(segment.blobs))); + } + } catch (e_1_1) { + e_1 = { error: e_1_1 }; + } finally { + try { + if (!_d && !_a && (_b = _e.return)) + yield tslib.__await(_b.call(_e)); + } finally { + if (e_1) + throw e_1.error; + } + } + }); + } + findBlobsByTags(tagFilterSqlExpression, options = {}) { + const listSegmentOptions = Object.assign({}, options); + const iter = this.findBlobsByTagsItems(tagFilterSqlExpression, listSegmentOptions); + return { + next() { + return iter.next(); + }, + [Symbol.asyncIterator]() { + return this; + }, + byPage: (settings = {}) => { + return this.findBlobsByTagsSegments(tagFilterSqlExpression, settings.continuationToken, Object.assign({ maxPageSize: settings.maxPageSize }, listSegmentOptions)); + } + }; + } + listSegments(marker_1) { + return tslib.__asyncGenerator(this, arguments, function* listSegments_1(marker2, options = {}) { + let listContainersSegmentResponse; + if (!!marker2 || marker2 === undefined) { + do { + listContainersSegmentResponse = yield tslib.__await(this.listContainersSegment(marker2, options)); + listContainersSegmentResponse.containerItems = listContainersSegmentResponse.containerItems || []; + marker2 = listContainersSegmentResponse.continuationToken; + yield yield tslib.__await(yield tslib.__await(listContainersSegmentResponse)); + } while (marker2); + } + }); + } + listItems() { + return tslib.__asyncGenerator(this, arguments, function* listItems_1(options = {}) { + var _a, e_2, _b, _c; + let marker2; + try { + for (var _d = true, _e = tslib.__asyncValues(this.listSegments(marker2, options)), _f;_f = yield tslib.__await(_e.next()), _a = _f.done, !_a; _d = true) { + _c = _f.value; + _d = false; + const segment = _c; + yield tslib.__await(yield* tslib.__asyncDelegator(tslib.__asyncValues(segment.containerItems))); + } + } catch (e_2_1) { + e_2 = { error: e_2_1 }; + } finally { + try { + if (!_d && !_a && (_b = _e.return)) + yield tslib.__await(_b.call(_e)); + } finally { + if (e_2) + throw e_2.error; + } + } + }); + } + listContainers(options = {}) { + if (options.prefix === "") { + options.prefix = undefined; + } + const include2 = []; + if (options.includeDeleted) { + include2.push("deleted"); + } + if (options.includeMetadata) { + include2.push("metadata"); + } + if (options.includeSystem) { + include2.push("system"); + } + const listSegmentOptions = Object.assign(Object.assign({}, options), include2.length > 0 ? { include: include2 } : {}); + const iter = this.listItems(listSegmentOptions); + return { + next() { + return iter.next(); + }, + [Symbol.asyncIterator]() { + return this; + }, + byPage: (settings = {}) => { + return this.listSegments(settings.continuationToken, Object.assign({ maxPageSize: settings.maxPageSize }, listSegmentOptions)); + } + }; + } + async getUserDelegationKey(startsOn, expiresOn2, options = {}) { + return tracingClient.withSpan("BlobServiceClient-getUserDelegationKey", options, async (updatedOptions) => { + const response = assertResponse(await this.serviceContext.getUserDelegationKey({ + startsOn: truncatedISO8061Date(startsOn, false), + expiresOn: truncatedISO8061Date(expiresOn2, false) + }, { + abortSignal: options.abortSignal, + tracingOptions: updatedOptions.tracingOptions + })); + const userDelegationKey = { + signedObjectId: response.signedObjectId, + signedTenantId: response.signedTenantId, + signedStartsOn: new Date(response.signedStartsOn), + signedExpiresOn: new Date(response.signedExpiresOn), + signedService: response.signedService, + signedVersion: response.signedVersion, + value: response.value + }; + const res = Object.assign({ _response: response._response, requestId: response.requestId, clientRequestId: response.clientRequestId, version: response.version, date: response.date, errorCode: response.errorCode }, userDelegationKey); + return res; + }); + } + getBlobBatchClient() { + return new BlobBatchClient(this.url, this.pipeline); + } + generateAccountSasUrl(expiresOn2, permissions = AccountSASPermissions.parse("r"), resourceTypes = "sco", options = {}) { + if (!(this.credential instanceof StorageSharedKeyCredential)) { + throw RangeError("Can only generate the account SAS when the client is initialized with a shared key credential"); + } + if (expiresOn2 === undefined) { + const now = new Date; + expiresOn2 = new Date(now.getTime() + 3600 * 1000); + } + const sas = generateAccountSASQueryParameters(Object.assign({ + permissions, + expiresOn: expiresOn2, + resourceTypes, + services: AccountSASServices.parse("b").toString() + }, options), this.credential).toString(); + return appendToURLQuery(this.url, sas); + } + generateSasStringToSign(expiresOn2, permissions = AccountSASPermissions.parse("r"), resourceTypes = "sco", options = {}) { + if (!(this.credential instanceof StorageSharedKeyCredential)) { + throw RangeError("Can only generate the account SAS when the client is initialized with a shared key credential"); + } + if (expiresOn2 === undefined) { + const now = new Date; + expiresOn2 = new Date(now.getTime() + 3600 * 1000); + } + return generateAccountSASQueryParametersInternal(Object.assign({ + permissions, + expiresOn: expiresOn2, + resourceTypes, + services: AccountSASServices.parse("b").toString() + }, options), this.credential).stringToSign; + } + } + exports2.KnownEncryptionAlgorithmType = undefined; + (function(KnownEncryptionAlgorithmType) { + KnownEncryptionAlgorithmType["AES256"] = "AES256"; + })(exports2.KnownEncryptionAlgorithmType || (exports2.KnownEncryptionAlgorithmType = {})); + Object.defineProperty(exports2, "RestError", { + enumerable: true, + get: function() { + return coreRestPipeline.RestError; + } + }); + exports2.AccountSASPermissions = AccountSASPermissions; + exports2.AccountSASResourceTypes = AccountSASResourceTypes; + exports2.AccountSASServices = AccountSASServices; + exports2.AnonymousCredential = AnonymousCredential; + exports2.AnonymousCredentialPolicy = AnonymousCredentialPolicy; + exports2.AppendBlobClient = AppendBlobClient; + exports2.BaseRequestPolicy = BaseRequestPolicy; + exports2.BlobBatch = BlobBatch; + exports2.BlobBatchClient = BlobBatchClient; + exports2.BlobClient = BlobClient; + exports2.BlobLeaseClient = BlobLeaseClient; + exports2.BlobSASPermissions = BlobSASPermissions; + exports2.BlobServiceClient = BlobServiceClient; + exports2.BlockBlobClient = BlockBlobClient; + exports2.ContainerClient = ContainerClient; + exports2.ContainerSASPermissions = ContainerSASPermissions; + exports2.Credential = Credential; + exports2.CredentialPolicy = CredentialPolicy; + exports2.PageBlobClient = PageBlobClient; + exports2.Pipeline = Pipeline; + exports2.SASQueryParameters = SASQueryParameters; + exports2.StorageBrowserPolicy = StorageBrowserPolicy; + exports2.StorageBrowserPolicyFactory = StorageBrowserPolicyFactory; + exports2.StorageOAuthScopes = StorageOAuthScopes; + exports2.StorageRetryPolicy = StorageRetryPolicy; + exports2.StorageRetryPolicyFactory = StorageRetryPolicyFactory; + exports2.StorageSharedKeyCredential = StorageSharedKeyCredential; + exports2.StorageSharedKeyCredentialPolicy = StorageSharedKeyCredentialPolicy; + exports2.generateAccountSASQueryParameters = generateAccountSASQueryParameters; + exports2.generateBlobSASQueryParameters = generateBlobSASQueryParameters; + exports2.getBlobServiceAccountAudience = getBlobServiceAccountAudience; + exports2.isPipelineLike = isPipelineLike; + exports2.logger = logger; + exports2.newPipeline = newPipeline; +}); + +// node_modules/@actions/artifact/lib/internal/upload/blob-upload.js +var require_blob_upload = __commonJS((exports2) => { + var __createBinding = exports2 && exports2.__createBinding || (Object.create ? function(o, m, k, k2) { + if (k2 === undefined) + k2 = k; + var desc = Object.getOwnPropertyDescriptor(m, k); + if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) { + desc = { enumerable: true, get: function() { + return m[k]; + } }; + } + Object.defineProperty(o, k2, desc); + } : function(o, m, k, k2) { + if (k2 === undefined) + k2 = k; + o[k2] = m[k]; + }); + var __setModuleDefault = exports2 && exports2.__setModuleDefault || (Object.create ? function(o, v) { + Object.defineProperty(o, "default", { enumerable: true, value: v }); + } : function(o, v) { + o["default"] = v; + }); + var __importStar = exports2 && exports2.__importStar || function(mod) { + if (mod && mod.__esModule) + return mod; + var result = {}; + if (mod != null) { + for (var k in mod) + if (k !== "default" && Object.prototype.hasOwnProperty.call(mod, k)) + __createBinding(result, mod, k); + } + __setModuleDefault(result, mod); + return result; + }; + var __awaiter = exports2 && exports2.__awaiter || function(thisArg, _arguments, P, generator) { + function adopt(value) { + return value instanceof P ? value : new P(function(resolve) { + resolve(value); + }); + } + return new (P || (P = Promise))(function(resolve, reject) { + function fulfilled(value) { + try { + step(generator.next(value)); + } catch (e) { + reject(e); + } + } + function rejected(value) { + try { + step(generator["throw"](value)); + } catch (e) { + reject(e); + } + } + function step(result) { + result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); + } + step((generator = generator.apply(thisArg, _arguments || [])).next()); + }); + }; + Object.defineProperty(exports2, "__esModule", { value: true }); + exports2.uploadZipToBlobStorage = undefined; + var storage_blob_1 = require_dist4(); + var config_1 = require_config(); + var core = __importStar(require_core()); + var crypto = __importStar(require("crypto")); + var stream = __importStar(require("stream")); + var errors_1 = require_errors3(); + function uploadZipToBlobStorage(authenticatedUploadURL, zipUploadStream) { + return __awaiter(this, undefined, undefined, function* () { + let uploadByteCount = 0; + let lastProgressTime = Date.now(); + const abortController = new AbortController; + const chunkTimer = (interval) => __awaiter(this, undefined, undefined, function* () { + return new Promise((resolve, reject) => { + const timer = setInterval(() => { + if (Date.now() - lastProgressTime > interval) { + reject(new Error("Upload progress stalled.")); + } + }, interval); + abortController.signal.addEventListener("abort", () => { + clearInterval(timer); + resolve(); + }); + }); + }); + const maxConcurrency = (0, config_1.getConcurrency)(); + const bufferSize = (0, config_1.getUploadChunkSize)(); + const blobClient = new storage_blob_1.BlobClient(authenticatedUploadURL); + const blockBlobClient = blobClient.getBlockBlobClient(); + core.debug(`Uploading artifact zip to blob storage with maxConcurrency: ${maxConcurrency}, bufferSize: ${bufferSize}`); + const uploadCallback = (progress) => { + core.info(`Uploaded bytes ${progress.loadedBytes}`); + uploadByteCount = progress.loadedBytes; + lastProgressTime = Date.now(); + }; + const options = { + blobHTTPHeaders: { blobContentType: "zip" }, + onProgress: uploadCallback, + abortSignal: abortController.signal + }; + let sha256Hash = undefined; + const uploadStream = new stream.PassThrough; + const hashStream = crypto.createHash("sha256"); + zipUploadStream.pipe(uploadStream); + zipUploadStream.pipe(hashStream).setEncoding("hex"); + core.info("Beginning upload of artifact content to blob storage"); + try { + yield Promise.race([ + blockBlobClient.uploadStream(uploadStream, bufferSize, maxConcurrency, options), + chunkTimer((0, config_1.getUploadChunkTimeout)()) + ]); + } catch (error) { + if (errors_1.NetworkError.isNetworkErrorCode(error === null || error === undefined ? undefined : error.code)) { + throw new errors_1.NetworkError(error === null || error === undefined ? undefined : error.code); + } + throw error; + } finally { + abortController.abort(); + } + core.info("Finished uploading artifact content to blob storage!"); + hashStream.end(); + sha256Hash = hashStream.read(); + core.info(`SHA256 hash of uploaded artifact zip is ${sha256Hash}`); + if (uploadByteCount === 0) { + core.warning(`No data was uploaded to blob storage. Reported upload byte count is 0.`); + } + return { + uploadSize: uploadByteCount, + sha256Hash + }; + }); + } + exports2.uploadZipToBlobStorage = uploadZipToBlobStorage; +}); + +// node_modules/minimatch/lib/path.js +var require_path = __commonJS((exports2, module2) => { + var isWindows = typeof process === "object" && process && process.platform === "win32"; + module2.exports = isWindows ? { sep: "\\" } : { sep: "/" }; +}); + +// node_modules/balanced-match/index.js +var require_balanced_match = __commonJS((exports2, module2) => { + module2.exports = balanced; + function balanced(a, b, str) { + if (a instanceof RegExp) + a = maybeMatch(a, str); + if (b instanceof RegExp) + b = maybeMatch(b, str); + var r = range(a, b, str); + return r && { + start: r[0], + end: r[1], + pre: str.slice(0, r[0]), + body: str.slice(r[0] + a.length, r[1]), + post: str.slice(r[1] + b.length) + }; + } + function maybeMatch(reg, str) { + var m = str.match(reg); + return m ? m[0] : null; + } + balanced.range = range; + function range(a, b, str) { + var begs, beg, left, right, result; + var ai = str.indexOf(a); + var bi = str.indexOf(b, ai + 1); + var i = ai; + if (ai >= 0 && bi > 0) { + if (a === b) { + return [ai, bi]; + } + begs = []; + left = str.length; + while (i >= 0 && !result) { + if (i == ai) { + begs.push(i); + ai = str.indexOf(a, i + 1); + } else if (begs.length == 1) { + result = [begs.pop(), bi]; + } else { + beg = begs.pop(); + if (beg < left) { + left = beg; + right = bi; + } + bi = str.indexOf(b, i + 1); + } + i = ai < bi && ai >= 0 ? ai : bi; + } + if (begs.length) { + result = [left, right]; + } + } + return result; + } +}); + +// node_modules/brace-expansion/index.js +var require_brace_expansion = __commonJS((exports2, module2) => { + var balanced = require_balanced_match(); + module2.exports = expandTop; + var escSlash = "\0SLASH" + Math.random() + "\0"; + var escOpen = "\0OPEN" + Math.random() + "\0"; + var escClose = "\0CLOSE" + Math.random() + "\0"; + var escComma = "\0COMMA" + Math.random() + "\0"; + var escPeriod = "\0PERIOD" + Math.random() + "\0"; + function numeric(str) { + return parseInt(str, 10) == str ? parseInt(str, 10) : str.charCodeAt(0); + } + function escapeBraces(str) { + return str.split("\\\\").join(escSlash).split("\\{").join(escOpen).split("\\}").join(escClose).split("\\,").join(escComma).split("\\.").join(escPeriod); + } + function unescapeBraces(str) { + return str.split(escSlash).join("\\").split(escOpen).join("{").split(escClose).join("}").split(escComma).join(",").split(escPeriod).join("."); + } + function parseCommaParts(str) { + if (!str) + return [""]; + var parts = []; + var m = balanced("{", "}", str); + if (!m) + return str.split(","); + var pre = m.pre; + var body = m.body; + var post = m.post; + var p = pre.split(","); + p[p.length - 1] += "{" + body + "}"; + var postParts = parseCommaParts(post); + if (post.length) { + p[p.length - 1] += postParts.shift(); + p.push.apply(p, postParts); + } + parts.push.apply(parts, p); + return parts; + } + function expandTop(str) { + if (!str) + return []; + if (str.substr(0, 2) === "{}") { + str = "\\{\\}" + str.substr(2); + } + return expand(escapeBraces(str), true).map(unescapeBraces); + } + function embrace(str) { + return "{" + str + "}"; + } + function isPadded(el) { + return /^-?0\d/.test(el); + } + function lte(i, y) { + return i <= y; + } + function gte(i, y) { + return i >= y; + } + function expand(str, isTop) { + var expansions = []; + var m = balanced("{", "}", str); + if (!m) + return [str]; + var pre = m.pre; + var post = m.post.length ? expand(m.post, false) : [""]; + if (/\$$/.test(m.pre)) { + for (var k = 0;k < post.length; k++) { + var expansion = pre + "{" + m.body + "}" + post[k]; + expansions.push(expansion); + } + } else { + var isNumericSequence = /^-?\d+\.\.-?\d+(?:\.\.-?\d+)?$/.test(m.body); + var isAlphaSequence = /^[a-zA-Z]\.\.[a-zA-Z](?:\.\.-?\d+)?$/.test(m.body); + var isSequence = isNumericSequence || isAlphaSequence; + var isOptions = m.body.indexOf(",") >= 0; + if (!isSequence && !isOptions) { + if (m.post.match(/,.*\}/)) { + str = m.pre + "{" + m.body + escClose + m.post; + return expand(str); + } + return [str]; + } + var n; + if (isSequence) { + n = m.body.split(/\.\./); + } else { + n = parseCommaParts(m.body); + if (n.length === 1) { + n = expand(n[0], false).map(embrace); + if (n.length === 1) { + return post.map(function(p) { + return m.pre + n[0] + p; + }); + } + } + } + var N; + if (isSequence) { + var x = numeric(n[0]); + var y = numeric(n[1]); + var width = Math.max(n[0].length, n[1].length); + var incr = n.length == 3 ? Math.abs(numeric(n[2])) : 1; + var test = lte; + var reverse = y < x; + if (reverse) { + incr *= -1; + test = gte; + } + var pad = n.some(isPadded); + N = []; + for (var i = x;test(i, y); i += incr) { + var c; + if (isAlphaSequence) { + c = String.fromCharCode(i); + if (c === "\\") + c = ""; + } else { + c = String(i); + if (pad) { + var need = width - c.length; + if (need > 0) { + var z = new Array(need + 1).join("0"); + if (i < 0) + c = "-" + z + c.slice(1); + else + c = z + c; + } + } + } + N.push(c); + } + } else { + N = []; + for (var j = 0;j < n.length; j++) { + N.push.apply(N, expand(n[j], false)); + } + } + for (var j = 0;j < N.length; j++) { + for (var k = 0;k < post.length; k++) { + var expansion = pre + N[j] + post[k]; + if (!isTop || isSequence || expansion) + expansions.push(expansion); + } + } + } + return expansions; + } +}); + +// node_modules/minimatch/minimatch.js +var require_minimatch = __commonJS((exports2, module2) => { + var minimatch = module2.exports = (p, pattern, options = {}) => { + assertValidPattern(pattern); + if (!options.nocomment && pattern.charAt(0) === "#") { + return false; + } + return new Minimatch(pattern, options).match(p); + }; + module2.exports = minimatch; + var path = require_path(); + minimatch.sep = path.sep; + var GLOBSTAR = Symbol("globstar **"); + minimatch.GLOBSTAR = GLOBSTAR; + var expand = require_brace_expansion(); + var plTypes = { + "!": { open: "(?:(?!(?:", close: "))[^/]*?)" }, + "?": { open: "(?:", close: ")?" }, + "+": { open: "(?:", close: ")+" }, + "*": { open: "(?:", close: ")*" }, + "@": { open: "(?:", close: ")" } + }; + var qmark = "[^/]"; + var star = qmark + "*?"; + var twoStarDot = "(?:(?!(?:\\/|^)(?:\\.{1,2})($|\\/)).)*?"; + var twoStarNoDot = "(?:(?!(?:\\/|^)\\.).)*?"; + var charSet = (s) => s.split("").reduce((set, c) => { + set[c] = true; + return set; + }, {}); + var reSpecials = charSet("().*{}+?[]^$\\!"); + var addPatternStartSet = charSet("[.("); + var slashSplit = /\/+/; + minimatch.filter = (pattern, options = {}) => (p, i, list) => minimatch(p, pattern, options); + var ext = (a, b = {}) => { + const t = {}; + Object.keys(a).forEach((k) => t[k] = a[k]); + Object.keys(b).forEach((k) => t[k] = b[k]); + return t; + }; + minimatch.defaults = (def) => { + if (!def || typeof def !== "object" || !Object.keys(def).length) { + return minimatch; + } + const orig = minimatch; + const m = (p, pattern, options) => orig(p, pattern, ext(def, options)); + m.Minimatch = class Minimatch2 extends orig.Minimatch { + constructor(pattern, options) { + super(pattern, ext(def, options)); + } + }; + m.Minimatch.defaults = (options) => orig.defaults(ext(def, options)).Minimatch; + m.filter = (pattern, options) => orig.filter(pattern, ext(def, options)); + m.defaults = (options) => orig.defaults(ext(def, options)); + m.makeRe = (pattern, options) => orig.makeRe(pattern, ext(def, options)); + m.braceExpand = (pattern, options) => orig.braceExpand(pattern, ext(def, options)); + m.match = (list, pattern, options) => orig.match(list, pattern, ext(def, options)); + return m; + }; + minimatch.braceExpand = (pattern, options) => braceExpand(pattern, options); + var braceExpand = (pattern, options = {}) => { + assertValidPattern(pattern); + if (options.nobrace || !/\{(?:(?!\{).)*\}/.test(pattern)) { + return [pattern]; + } + return expand(pattern); + }; + var MAX_PATTERN_LENGTH = 1024 * 64; + var assertValidPattern = (pattern) => { + if (typeof pattern !== "string") { + throw new TypeError("invalid pattern"); + } + if (pattern.length > MAX_PATTERN_LENGTH) { + throw new TypeError("pattern is too long"); + } + }; + var SUBPARSE = Symbol("subparse"); + minimatch.makeRe = (pattern, options) => new Minimatch(pattern, options || {}).makeRe(); + minimatch.match = (list, pattern, options = {}) => { + const mm = new Minimatch(pattern, options); + list = list.filter((f) => mm.match(f)); + if (mm.options.nonull && !list.length) { + list.push(pattern); + } + return list; + }; + var globUnescape = (s) => s.replace(/\\(.)/g, "$1"); + var charUnescape = (s) => s.replace(/\\([^-\]])/g, "$1"); + var regExpEscape = (s) => s.replace(/[-[\]{}()*+?.,\\^$|#\s]/g, "\\$&"); + var braExpEscape = (s) => s.replace(/[[\]\\]/g, "\\$&"); + + class Minimatch { + constructor(pattern, options) { + assertValidPattern(pattern); + if (!options) + options = {}; + this.options = options; + this.set = []; + this.pattern = pattern; + this.windowsPathsNoEscape = !!options.windowsPathsNoEscape || options.allowWindowsEscape === false; + if (this.windowsPathsNoEscape) { + this.pattern = this.pattern.replace(/\\/g, "/"); + } + this.regexp = null; + this.negate = false; + this.comment = false; + this.empty = false; + this.partial = !!options.partial; + this.make(); + } + debug() { + } + make() { + const pattern = this.pattern; + const options = this.options; + if (!options.nocomment && pattern.charAt(0) === "#") { + this.comment = true; + return; + } + if (!pattern) { + this.empty = true; + return; + } + this.parseNegate(); + let set = this.globSet = this.braceExpand(); + if (options.debug) + this.debug = (...args) => console.error(...args); + this.debug(this.pattern, set); + set = this.globParts = set.map((s) => s.split(slashSplit)); + this.debug(this.pattern, set); + set = set.map((s, si, set2) => s.map(this.parse, this)); + this.debug(this.pattern, set); + set = set.filter((s) => s.indexOf(false) === -1); + this.debug(this.pattern, set); + this.set = set; + } + parseNegate() { + if (this.options.nonegate) + return; + const pattern = this.pattern; + let negate = false; + let negateOffset = 0; + for (let i = 0;i < pattern.length && pattern.charAt(i) === "!"; i++) { + negate = !negate; + negateOffset++; + } + if (negateOffset) + this.pattern = pattern.slice(negateOffset); + this.negate = negate; + } + matchOne(file, pattern, partial) { + var options = this.options; + this.debug("matchOne", { this: this, file, pattern }); + this.debug("matchOne", file.length, pattern.length); + for (var fi = 0, pi = 0, fl = file.length, pl = pattern.length;fi < fl && pi < pl; fi++, pi++) { + this.debug("matchOne loop"); + var p = pattern[pi]; + var f = file[fi]; + this.debug(pattern, p, f); + if (p === false) + return false; + if (p === GLOBSTAR) { + this.debug("GLOBSTAR", [pattern, p, f]); + var fr = fi; + var pr = pi + 1; + if (pr === pl) { + this.debug("** at the end"); + for (;fi < fl; fi++) { + if (file[fi] === "." || file[fi] === ".." || !options.dot && file[fi].charAt(0) === ".") + return false; + } + return true; + } + while (fr < fl) { + var swallowee = file[fr]; + this.debug("\nglobstar while", file, fr, pattern, pr, swallowee); + if (this.matchOne(file.slice(fr), pattern.slice(pr), partial)) { + this.debug("globstar found match!", fr, fl, swallowee); + return true; + } else { + if (swallowee === "." || swallowee === ".." || !options.dot && swallowee.charAt(0) === ".") { + this.debug("dot detected!", file, fr, pattern, pr); + break; + } + this.debug("globstar swallow a segment, and continue"); + fr++; + } + } + if (partial) { + this.debug("\n>>> no match, partial?", file, fr, pattern, pr); + if (fr === fl) + return true; + } + return false; + } + var hit; + if (typeof p === "string") { + hit = f === p; + this.debug("string match", p, f, hit); + } else { + hit = f.match(p); + this.debug("pattern match", p, f, hit); + } + if (!hit) + return false; + } + if (fi === fl && pi === pl) { + return true; + } else if (fi === fl) { + return partial; + } else if (pi === pl) { + return fi === fl - 1 && file[fi] === ""; + } + throw new Error("wtf?"); + } + braceExpand() { + return braceExpand(this.pattern, this.options); + } + parse(pattern, isSub) { + assertValidPattern(pattern); + const options = this.options; + if (pattern === "**") { + if (!options.noglobstar) + return GLOBSTAR; + else + pattern = "*"; + } + if (pattern === "") + return ""; + let re = ""; + let hasMagic = false; + let escaping = false; + const patternListStack = []; + const negativeLists = []; + let stateChar; + let inClass = false; + let reClassStart = -1; + let classStart = -1; + let cs; + let pl; + let sp; + let dotTravAllowed = pattern.charAt(0) === "."; + let dotFileAllowed = options.dot || dotTravAllowed; + const patternStart = () => dotTravAllowed ? "" : dotFileAllowed ? "(?!(?:^|\\/)\\.{1,2}(?:$|\\/))" : "(?!\\.)"; + const subPatternStart = (p) => p.charAt(0) === "." ? "" : options.dot ? "(?!(?:^|\\/)\\.{1,2}(?:$|\\/))" : "(?!\\.)"; + const clearStateChar = () => { + if (stateChar) { + switch (stateChar) { + case "*": + re += star; + hasMagic = true; + break; + case "?": + re += qmark; + hasMagic = true; + break; + default: + re += "\\" + stateChar; + break; + } + this.debug("clearStateChar %j %j", stateChar, re); + stateChar = false; + } + }; + for (let i = 0, c;i < pattern.length && (c = pattern.charAt(i)); i++) { + this.debug("%s\t%s %s %j", pattern, i, re, c); + if (escaping) { + if (c === "/") { + return false; + } + if (reSpecials[c]) { + re += "\\"; + } + re += c; + escaping = false; + continue; + } + switch (c) { + case "/": { + return false; + } + case "\\": + if (inClass && pattern.charAt(i + 1) === "-") { + re += c; + continue; + } + clearStateChar(); + escaping = true; + continue; + case "?": + case "*": + case "+": + case "@": + case "!": + this.debug("%s\t%s %s %j <-- stateChar", pattern, i, re, c); + if (inClass) { + this.debug(" in class"); + if (c === "!" && i === classStart + 1) + c = "^"; + re += c; + continue; + } + this.debug("call clearStateChar %j", stateChar); + clearStateChar(); + stateChar = c; + if (options.noext) + clearStateChar(); + continue; + case "(": { + if (inClass) { + re += "("; + continue; + } + if (!stateChar) { + re += "\\("; + continue; + } + const plEntry = { + type: stateChar, + start: i - 1, + reStart: re.length, + open: plTypes[stateChar].open, + close: plTypes[stateChar].close + }; + this.debug(this.pattern, "\t", plEntry); + patternListStack.push(plEntry); + re += plEntry.open; + if (plEntry.start === 0 && plEntry.type !== "!") { + dotTravAllowed = true; + re += subPatternStart(pattern.slice(i + 1)); + } + this.debug("plType %j %j", stateChar, re); + stateChar = false; + continue; + } + case ")": { + const plEntry = patternListStack[patternListStack.length - 1]; + if (inClass || !plEntry) { + re += "\\)"; + continue; + } + patternListStack.pop(); + clearStateChar(); + hasMagic = true; + pl = plEntry; + re += pl.close; + if (pl.type === "!") { + negativeLists.push(Object.assign(pl, { reEnd: re.length })); + } + continue; + } + case "|": { + const plEntry = patternListStack[patternListStack.length - 1]; + if (inClass || !plEntry) { + re += "\\|"; + continue; + } + clearStateChar(); + re += "|"; + if (plEntry.start === 0 && plEntry.type !== "!") { + dotTravAllowed = true; + re += subPatternStart(pattern.slice(i + 1)); + } + continue; + } + case "[": + clearStateChar(); + if (inClass) { + re += "\\" + c; + continue; + } + inClass = true; + classStart = i; + reClassStart = re.length; + re += c; + continue; + case "]": + if (i === classStart + 1 || !inClass) { + re += "\\" + c; + continue; + } + cs = pattern.substring(classStart + 1, i); + try { + RegExp("[" + braExpEscape(charUnescape(cs)) + "]"); + re += c; + } catch (er) { + re = re.substring(0, reClassStart) + "(?:$.)"; + } + hasMagic = true; + inClass = false; + continue; + default: + clearStateChar(); + if (reSpecials[c] && !(c === "^" && inClass)) { + re += "\\"; + } + re += c; + break; + } + } + if (inClass) { + cs = pattern.slice(classStart + 1); + sp = this.parse(cs, SUBPARSE); + re = re.substring(0, reClassStart) + "\\[" + sp[0]; + hasMagic = hasMagic || sp[1]; + } + for (pl = patternListStack.pop();pl; pl = patternListStack.pop()) { + let tail; + tail = re.slice(pl.reStart + pl.open.length); + this.debug("setting tail", re, pl); + tail = tail.replace(/((?:\\{2}){0,64})(\\?)\|/g, (_2, $1, $2) => { + if (!$2) { + $2 = "\\"; + } + return $1 + $1 + $2 + "|"; + }); + this.debug("tail=%j\n %s", tail, tail, pl, re); + const t = pl.type === "*" ? star : pl.type === "?" ? qmark : "\\" + pl.type; + hasMagic = true; + re = re.slice(0, pl.reStart) + t + "\\(" + tail; + } + clearStateChar(); + if (escaping) { + re += "\\\\"; + } + const addPatternStart = addPatternStartSet[re.charAt(0)]; + for (let n = negativeLists.length - 1;n > -1; n--) { + const nl = negativeLists[n]; + const nlBefore = re.slice(0, nl.reStart); + const nlFirst = re.slice(nl.reStart, nl.reEnd - 8); + let nlAfter = re.slice(nl.reEnd); + const nlLast = re.slice(nl.reEnd - 8, nl.reEnd) + nlAfter; + const closeParensBefore = nlBefore.split(")").length; + const openParensBefore = nlBefore.split("(").length - closeParensBefore; + let cleanAfter = nlAfter; + for (let i = 0;i < openParensBefore; i++) { + cleanAfter = cleanAfter.replace(/\)[+*?]?/, ""); + } + nlAfter = cleanAfter; + const dollar = nlAfter === "" && isSub !== SUBPARSE ? "(?:$|\\/)" : ""; + re = nlBefore + nlFirst + nlAfter + dollar + nlLast; + } + if (re !== "" && hasMagic) { + re = "(?=.)" + re; + } + if (addPatternStart) { + re = patternStart() + re; + } + if (isSub === SUBPARSE) { + return [re, hasMagic]; + } + if (options.nocase && !hasMagic) { + hasMagic = pattern.toUpperCase() !== pattern.toLowerCase(); + } + if (!hasMagic) { + return globUnescape(pattern); + } + const flags = options.nocase ? "i" : ""; + try { + return Object.assign(new RegExp("^" + re + "$", flags), { + _glob: pattern, + _src: re + }); + } catch (er) { + return new RegExp("$."); + } + } + makeRe() { + if (this.regexp || this.regexp === false) + return this.regexp; + const set = this.set; + if (!set.length) { + this.regexp = false; + return this.regexp; + } + const options = this.options; + const twoStar = options.noglobstar ? star : options.dot ? twoStarDot : twoStarNoDot; + const flags = options.nocase ? "i" : ""; + let re = set.map((pattern) => { + pattern = pattern.map((p) => typeof p === "string" ? regExpEscape(p) : p === GLOBSTAR ? GLOBSTAR : p._src).reduce((set2, p) => { + if (!(set2[set2.length - 1] === GLOBSTAR && p === GLOBSTAR)) { + set2.push(p); + } + return set2; + }, []); + pattern.forEach((p, i) => { + if (p !== GLOBSTAR || pattern[i - 1] === GLOBSTAR) { + return; + } + if (i === 0) { + if (pattern.length > 1) { + pattern[i + 1] = "(?:\\/|" + twoStar + "\\/)?" + pattern[i + 1]; + } else { + pattern[i] = twoStar; + } + } else if (i === pattern.length - 1) { + pattern[i - 1] += "(?:\\/|" + twoStar + ")?"; + } else { + pattern[i - 1] += "(?:\\/|\\/" + twoStar + "\\/)" + pattern[i + 1]; + pattern[i + 1] = GLOBSTAR; + } + }); + return pattern.filter((p) => p !== GLOBSTAR).join("/"); + }).join("|"); + re = "^(?:" + re + ")$"; + if (this.negate) + re = "^(?!" + re + ").*$"; + try { + this.regexp = new RegExp(re, flags); + } catch (ex) { + this.regexp = false; + } + return this.regexp; + } + match(f, partial = this.partial) { + this.debug("match", f, this.pattern); + if (this.comment) + return false; + if (this.empty) + return f === ""; + if (f === "/" && partial) + return true; + const options = this.options; + if (path.sep !== "/") { + f = f.split(path.sep).join("/"); + } + f = f.split(slashSplit); + this.debug(this.pattern, "split", f); + const set = this.set; + this.debug(this.pattern, "set", set); + let filename; + for (let i = f.length - 1;i >= 0; i--) { + filename = f[i]; + if (filename) + break; + } + for (let i = 0;i < set.length; i++) { + const pattern = set[i]; + let file = f; + if (options.matchBase && pattern.length === 1) { + file = [filename]; + } + const hit = this.matchOne(file, pattern, partial); + if (hit) { + if (options.flipNegate) + return true; + return !this.negate; + } + } + if (options.flipNegate) + return false; + return this.negate; + } + static defaults(def) { + return minimatch.defaults(def).Minimatch; + } + } + minimatch.Minimatch = Minimatch; +}); + +// node_modules/readdir-glob/index.js +var require_readdir_glob = __commonJS((exports2, module2) => { + module2.exports = readdirGlob; + var fs = require("fs"); + var { EventEmitter } = require("events"); + var { Minimatch } = require_minimatch(); + var { resolve } = require("path"); + function readdir(dir, strict) { + return new Promise((resolve2, reject) => { + fs.readdir(dir, { withFileTypes: true }, (err, files) => { + if (err) { + switch (err.code) { + case "ENOTDIR": + if (strict) { + reject(err); + } else { + resolve2([]); + } + break; + case "ENOTSUP": + case "ENOENT": + case "ENAMETOOLONG": + case "UNKNOWN": + resolve2([]); + break; + case "ELOOP": + default: + reject(err); + break; + } + } else { + resolve2(files); + } + }); + }); + } + function stat(file, followSymlinks) { + return new Promise((resolve2, reject) => { + const statFunc = followSymlinks ? fs.stat : fs.lstat; + statFunc(file, (err, stats) => { + if (err) { + switch (err.code) { + case "ENOENT": + if (followSymlinks) { + resolve2(stat(file, false)); + } else { + resolve2(null); + } + break; + default: + resolve2(null); + break; + } + } else { + resolve2(stats); + } + }); + }); + } + async function* exploreWalkAsync(dir, path, followSymlinks, useStat, shouldSkip, strict) { + let files = await readdir(path + dir, strict); + for (const file of files) { + let name = file.name; + if (name === undefined) { + name = file; + useStat = true; + } + const filename = dir + "/" + name; + const relative = filename.slice(1); + const absolute = path + "/" + relative; + let stats = null; + if (useStat || followSymlinks) { + stats = await stat(absolute, followSymlinks); + } + if (!stats && file.name !== undefined) { + stats = file; + } + if (stats === null) { + stats = { isDirectory: () => false }; + } + if (stats.isDirectory()) { + if (!shouldSkip(relative)) { + yield { relative, absolute, stats }; + yield* exploreWalkAsync(filename, path, followSymlinks, useStat, shouldSkip, false); + } + } else { + yield { relative, absolute, stats }; + } + } + } + async function* explore(path, followSymlinks, useStat, shouldSkip) { + yield* exploreWalkAsync("", path, followSymlinks, useStat, shouldSkip, true); + } + function readOptions(options) { + return { + pattern: options.pattern, + dot: !!options.dot, + noglobstar: !!options.noglobstar, + matchBase: !!options.matchBase, + nocase: !!options.nocase, + ignore: options.ignore, + skip: options.skip, + follow: !!options.follow, + stat: !!options.stat, + nodir: !!options.nodir, + mark: !!options.mark, + silent: !!options.silent, + absolute: !!options.absolute + }; + } + + class ReaddirGlob extends EventEmitter { + constructor(cwd, options, cb) { + super(); + if (typeof options === "function") { + cb = options; + options = null; + } + this.options = readOptions(options || {}); + this.matchers = []; + if (this.options.pattern) { + const matchers = Array.isArray(this.options.pattern) ? this.options.pattern : [this.options.pattern]; + this.matchers = matchers.map((m) => new Minimatch(m, { + dot: this.options.dot, + noglobstar: this.options.noglobstar, + matchBase: this.options.matchBase, + nocase: this.options.nocase + })); + } + this.ignoreMatchers = []; + if (this.options.ignore) { + const ignorePatterns = Array.isArray(this.options.ignore) ? this.options.ignore : [this.options.ignore]; + this.ignoreMatchers = ignorePatterns.map((ignore) => new Minimatch(ignore, { dot: true })); + } + this.skipMatchers = []; + if (this.options.skip) { + const skipPatterns = Array.isArray(this.options.skip) ? this.options.skip : [this.options.skip]; + this.skipMatchers = skipPatterns.map((skip) => new Minimatch(skip, { dot: true })); + } + this.iterator = explore(resolve(cwd || "."), this.options.follow, this.options.stat, this._shouldSkipDirectory.bind(this)); + this.paused = false; + this.inactive = false; + this.aborted = false; + if (cb) { + this._matches = []; + this.on("match", (match) => this._matches.push(this.options.absolute ? match.absolute : match.relative)); + this.on("error", (err) => cb(err)); + this.on("end", () => cb(null, this._matches)); + } + setTimeout(() => this._next(), 0); + } + _shouldSkipDirectory(relative) { + return this.skipMatchers.some((m) => m.match(relative)); + } + _fileMatches(relative, isDirectory) { + const file = relative + (isDirectory ? "/" : ""); + return (this.matchers.length === 0 || this.matchers.some((m) => m.match(file))) && !this.ignoreMatchers.some((m) => m.match(file)) && (!this.options.nodir || !isDirectory); + } + _next() { + if (!this.paused && !this.aborted) { + this.iterator.next().then((obj) => { + if (!obj.done) { + const isDirectory = obj.value.stats.isDirectory(); + if (this._fileMatches(obj.value.relative, isDirectory)) { + let relative = obj.value.relative; + let absolute = obj.value.absolute; + if (this.options.mark && isDirectory) { + relative += "/"; + absolute += "/"; + } + if (this.options.stat) { + this.emit("match", { relative, absolute, stat: obj.value.stats }); + } else { + this.emit("match", { relative, absolute }); + } + } + this._next(this.iterator); + } else { + this.emit("end"); + } + }).catch((err) => { + this.abort(); + this.emit("error", err); + if (!err.code && !this.options.silent) { + console.error(err); + } + }); + } else { + this.inactive = true; + } + } + abort() { + this.aborted = true; + } + pause() { + this.paused = true; + } + resume() { + this.paused = false; + if (this.inactive) { + this.inactive = false; + this._next(); + } + } + } + function readdirGlob(pattern, options, cb) { + return new ReaddirGlob(pattern, options, cb); + } + readdirGlob.ReaddirGlob = ReaddirGlob; +}); + +// node_modules/async/dist/async.js +var require_async = __commonJS((exports2, module2) => { + (function(global2, factory) { + typeof exports2 === "object" && typeof module2 !== "undefined" ? factory(exports2) : typeof define === "function" && define.amd ? define(["exports"], factory) : (global2 = typeof globalThis !== "undefined" ? globalThis : global2 || self, factory(global2.async = {})); + })(exports2, function(exports3) { + function apply(fn, ...args) { + return (...callArgs) => fn(...args, ...callArgs); + } + function initialParams(fn) { + return function(...args) { + var callback = args.pop(); + return fn.call(this, args, callback); + }; + } + var hasQueueMicrotask = typeof queueMicrotask === "function" && queueMicrotask; + var hasSetImmediate = typeof setImmediate === "function" && setImmediate; + var hasNextTick = typeof process === "object" && typeof process.nextTick === "function"; + function fallback(fn) { + setTimeout(fn, 0); + } + function wrap(defer) { + return (fn, ...args) => defer(() => fn(...args)); + } + var _defer$1; + if (hasQueueMicrotask) { + _defer$1 = queueMicrotask; + } else if (hasSetImmediate) { + _defer$1 = setImmediate; + } else if (hasNextTick) { + _defer$1 = process.nextTick; + } else { + _defer$1 = fallback; + } + var setImmediate$1 = wrap(_defer$1); + function asyncify(func) { + if (isAsync(func)) { + return function(...args) { + const callback = args.pop(); + const promise = func.apply(this, args); + return handlePromise(promise, callback); + }; + } + return initialParams(function(args, callback) { + var result; + try { + result = func.apply(this, args); + } catch (e) { + return callback(e); + } + if (result && typeof result.then === "function") { + return handlePromise(result, callback); + } else { + callback(null, result); + } + }); + } + function handlePromise(promise, callback) { + return promise.then((value) => { + invokeCallback(callback, null, value); + }, (err) => { + invokeCallback(callback, err && (err instanceof Error || err.message) ? err : new Error(err)); + }); + } + function invokeCallback(callback, error, value) { + try { + callback(error, value); + } catch (err) { + setImmediate$1((e) => { + throw e; + }, err); + } + } + function isAsync(fn) { + return fn[Symbol.toStringTag] === "AsyncFunction"; + } + function isAsyncGenerator(fn) { + return fn[Symbol.toStringTag] === "AsyncGenerator"; + } + function isAsyncIterable(obj) { + return typeof obj[Symbol.asyncIterator] === "function"; + } + function wrapAsync(asyncFn) { + if (typeof asyncFn !== "function") + throw new Error("expected a function"); + return isAsync(asyncFn) ? asyncify(asyncFn) : asyncFn; + } + function awaitify(asyncFn, arity) { + if (!arity) + arity = asyncFn.length; + if (!arity) + throw new Error("arity is undefined"); + function awaitable(...args) { + if (typeof args[arity - 1] === "function") { + return asyncFn.apply(this, args); + } + return new Promise((resolve, reject2) => { + args[arity - 1] = (err, ...cbArgs) => { + if (err) + return reject2(err); + resolve(cbArgs.length > 1 ? cbArgs : cbArgs[0]); + }; + asyncFn.apply(this, args); + }); + } + return awaitable; + } + function applyEach$1(eachfn) { + return function applyEach(fns, ...callArgs) { + const go = awaitify(function(callback) { + var that = this; + return eachfn(fns, (fn, cb) => { + wrapAsync(fn).apply(that, callArgs.concat(cb)); + }, callback); + }); + return go; + }; + } + function _asyncMap(eachfn, arr, iteratee, callback) { + arr = arr || []; + var results = []; + var counter = 0; + var _iteratee = wrapAsync(iteratee); + return eachfn(arr, (value, _2, iterCb) => { + var index2 = counter++; + _iteratee(value, (err, v) => { + results[index2] = v; + iterCb(err); + }); + }, (err) => { + callback(err, results); + }); + } + function isArrayLike(value) { + return value && typeof value.length === "number" && value.length >= 0 && value.length % 1 === 0; + } + const breakLoop = {}; + function once(fn) { + function wrapper(...args) { + if (fn === null) + return; + var callFn = fn; + fn = null; + callFn.apply(this, args); + } + Object.assign(wrapper, fn); + return wrapper; + } + function getIterator(coll) { + return coll[Symbol.iterator] && coll[Symbol.iterator](); + } + function createArrayIterator(coll) { + var i = -1; + var len = coll.length; + return function next() { + return ++i < len ? { value: coll[i], key: i } : null; + }; + } + function createES2015Iterator(iterator) { + var i = -1; + return function next() { + var item = iterator.next(); + if (item.done) + return null; + i++; + return { value: item.value, key: i }; + }; + } + function createObjectIterator(obj) { + var okeys = obj ? Object.keys(obj) : []; + var i = -1; + var len = okeys.length; + return function next() { + var key = okeys[++i]; + if (key === "__proto__") { + return next(); + } + return i < len ? { value: obj[key], key } : null; + }; + } + function createIterator(coll) { + if (isArrayLike(coll)) { + return createArrayIterator(coll); + } + var iterator = getIterator(coll); + return iterator ? createES2015Iterator(iterator) : createObjectIterator(coll); + } + function onlyOnce(fn) { + return function(...args) { + if (fn === null) + throw new Error("Callback was already called."); + var callFn = fn; + fn = null; + callFn.apply(this, args); + }; + } + function asyncEachOfLimit(generator, limit, iteratee, callback) { + let done = false; + let canceled = false; + let awaiting = false; + let running = 0; + let idx = 0; + function replenish() { + if (running >= limit || awaiting || done) + return; + awaiting = true; + generator.next().then(({ value, done: iterDone }) => { + if (canceled || done) + return; + awaiting = false; + if (iterDone) { + done = true; + if (running <= 0) { + callback(null); + } + return; + } + running++; + iteratee(value, idx, iterateeCallback); + idx++; + replenish(); + }).catch(handleError); + } + function iterateeCallback(err, result) { + running -= 1; + if (canceled) + return; + if (err) + return handleError(err); + if (err === false) { + done = true; + canceled = true; + return; + } + if (result === breakLoop || done && running <= 0) { + done = true; + return callback(null); + } + replenish(); + } + function handleError(err) { + if (canceled) + return; + awaiting = false; + done = true; + callback(err); + } + replenish(); + } + var eachOfLimit$2 = (limit) => { + return (obj, iteratee, callback) => { + callback = once(callback); + if (limit <= 0) { + throw new RangeError("concurrency limit cannot be less than 1"); + } + if (!obj) { + return callback(null); + } + if (isAsyncGenerator(obj)) { + return asyncEachOfLimit(obj, limit, iteratee, callback); + } + if (isAsyncIterable(obj)) { + return asyncEachOfLimit(obj[Symbol.asyncIterator](), limit, iteratee, callback); + } + var nextElem = createIterator(obj); + var done = false; + var canceled = false; + var running = 0; + var looping = false; + function iterateeCallback(err, value) { + if (canceled) + return; + running -= 1; + if (err) { + done = true; + callback(err); + } else if (err === false) { + done = true; + canceled = true; + } else if (value === breakLoop || done && running <= 0) { + done = true; + return callback(null); + } else if (!looping) { + replenish(); + } + } + function replenish() { + looping = true; + while (running < limit && !done) { + var elem = nextElem(); + if (elem === null) { + done = true; + if (running <= 0) { + callback(null); + } + return; + } + running += 1; + iteratee(elem.value, elem.key, onlyOnce(iterateeCallback)); + } + looping = false; + } + replenish(); + }; + }; + function eachOfLimit(coll, limit, iteratee, callback) { + return eachOfLimit$2(limit)(coll, wrapAsync(iteratee), callback); + } + var eachOfLimit$1 = awaitify(eachOfLimit, 4); + function eachOfArrayLike(coll, iteratee, callback) { + callback = once(callback); + var index2 = 0, completed = 0, { length } = coll, canceled = false; + if (length === 0) { + callback(null); + } + function iteratorCallback(err, value) { + if (err === false) { + canceled = true; + } + if (canceled === true) + return; + if (err) { + callback(err); + } else if (++completed === length || value === breakLoop) { + callback(null); + } + } + for (;index2 < length; index2++) { + iteratee(coll[index2], index2, onlyOnce(iteratorCallback)); + } + } + function eachOfGeneric(coll, iteratee, callback) { + return eachOfLimit$1(coll, Infinity, iteratee, callback); + } + function eachOf(coll, iteratee, callback) { + var eachOfImplementation = isArrayLike(coll) ? eachOfArrayLike : eachOfGeneric; + return eachOfImplementation(coll, wrapAsync(iteratee), callback); + } + var eachOf$1 = awaitify(eachOf, 3); + function map(coll, iteratee, callback) { + return _asyncMap(eachOf$1, coll, iteratee, callback); + } + var map$1 = awaitify(map, 3); + var applyEach = applyEach$1(map$1); + function eachOfSeries(coll, iteratee, callback) { + return eachOfLimit$1(coll, 1, iteratee, callback); + } + var eachOfSeries$1 = awaitify(eachOfSeries, 3); + function mapSeries(coll, iteratee, callback) { + return _asyncMap(eachOfSeries$1, coll, iteratee, callback); + } + var mapSeries$1 = awaitify(mapSeries, 3); + var applyEachSeries = applyEach$1(mapSeries$1); + const PROMISE_SYMBOL = Symbol("promiseCallback"); + function promiseCallback() { + let resolve, reject2; + function callback(err, ...args) { + if (err) + return reject2(err); + resolve(args.length > 1 ? args : args[0]); + } + callback[PROMISE_SYMBOL] = new Promise((res, rej) => { + resolve = res, reject2 = rej; + }); + return callback; + } + function auto(tasks, concurrency, callback) { + if (typeof concurrency !== "number") { + callback = concurrency; + concurrency = null; + } + callback = once(callback || promiseCallback()); + var numTasks = Object.keys(tasks).length; + if (!numTasks) { + return callback(null); + } + if (!concurrency) { + concurrency = numTasks; + } + var results = {}; + var runningTasks = 0; + var canceled = false; + var hasError = false; + var listeners = Object.create(null); + var readyTasks = []; + var readyToCheck = []; + var uncheckedDependencies = {}; + Object.keys(tasks).forEach((key) => { + var task = tasks[key]; + if (!Array.isArray(task)) { + enqueueTask(key, [task]); + readyToCheck.push(key); + return; + } + var dependencies = task.slice(0, task.length - 1); + var remainingDependencies = dependencies.length; + if (remainingDependencies === 0) { + enqueueTask(key, task); + readyToCheck.push(key); + return; + } + uncheckedDependencies[key] = remainingDependencies; + dependencies.forEach((dependencyName) => { + if (!tasks[dependencyName]) { + throw new Error("async.auto task `" + key + "` has a non-existent dependency `" + dependencyName + "` in " + dependencies.join(", ")); + } + addListener(dependencyName, () => { + remainingDependencies--; + if (remainingDependencies === 0) { + enqueueTask(key, task); + } + }); + }); + }); + checkForDeadlocks(); + processQueue(); + function enqueueTask(key, task) { + readyTasks.push(() => runTask(key, task)); + } + function processQueue() { + if (canceled) + return; + if (readyTasks.length === 0 && runningTasks === 0) { + return callback(null, results); + } + while (readyTasks.length && runningTasks < concurrency) { + var run = readyTasks.shift(); + run(); + } + } + function addListener(taskName, fn) { + var taskListeners = listeners[taskName]; + if (!taskListeners) { + taskListeners = listeners[taskName] = []; + } + taskListeners.push(fn); + } + function taskComplete(taskName) { + var taskListeners = listeners[taskName] || []; + taskListeners.forEach((fn) => fn()); + processQueue(); + } + function runTask(key, task) { + if (hasError) + return; + var taskCallback = onlyOnce((err, ...result) => { + runningTasks--; + if (err === false) { + canceled = true; + return; + } + if (result.length < 2) { + [result] = result; + } + if (err) { + var safeResults = {}; + Object.keys(results).forEach((rkey) => { + safeResults[rkey] = results[rkey]; + }); + safeResults[key] = result; + hasError = true; + listeners = Object.create(null); + if (canceled) + return; + callback(err, safeResults); + } else { + results[key] = result; + taskComplete(key); + } + }); + runningTasks++; + var taskFn = wrapAsync(task[task.length - 1]); + if (task.length > 1) { + taskFn(results, taskCallback); + } else { + taskFn(taskCallback); + } + } + function checkForDeadlocks() { + var currentTask; + var counter = 0; + while (readyToCheck.length) { + currentTask = readyToCheck.pop(); + counter++; + getDependents(currentTask).forEach((dependent) => { + if (--uncheckedDependencies[dependent] === 0) { + readyToCheck.push(dependent); + } + }); + } + if (counter !== numTasks) { + throw new Error("async.auto cannot execute tasks due to a recursive dependency"); + } + } + function getDependents(taskName) { + var result = []; + Object.keys(tasks).forEach((key) => { + const task = tasks[key]; + if (Array.isArray(task) && task.indexOf(taskName) >= 0) { + result.push(key); + } + }); + return result; + } + return callback[PROMISE_SYMBOL]; + } + var FN_ARGS = /^(?:async\s)?(?:function)?\s*(?:\w+\s*)?\(([^)]+)\)(?:\s*{)/; + var ARROW_FN_ARGS = /^(?:async\s)?\s*(?:\(\s*)?((?:[^)=\s]\s*)*)(?:\)\s*)?=>/; + var FN_ARG_SPLIT = /,/; + var FN_ARG = /(=.+)?(\s*)$/; + function stripComments(string) { + let stripped = ""; + let index2 = 0; + let endBlockComment = string.indexOf("*/"); + while (index2 < string.length) { + if (string[index2] === "/" && string[index2 + 1] === "/") { + let endIndex = string.indexOf("\n", index2); + index2 = endIndex === -1 ? string.length : endIndex; + } else if (endBlockComment !== -1 && string[index2] === "/" && string[index2 + 1] === "*") { + let endIndex = string.indexOf("*/", index2); + if (endIndex !== -1) { + index2 = endIndex + 2; + endBlockComment = string.indexOf("*/", index2); + } else { + stripped += string[index2]; + index2++; + } + } else { + stripped += string[index2]; + index2++; + } + } + return stripped; + } + function parseParams(func) { + const src = stripComments(func.toString()); + let match = src.match(FN_ARGS); + if (!match) { + match = src.match(ARROW_FN_ARGS); + } + if (!match) + throw new Error("could not parse args in autoInject\nSource:\n" + src); + let [, args] = match; + return args.replace(/\s/g, "").split(FN_ARG_SPLIT).map((arg) => arg.replace(FN_ARG, "").trim()); + } + function autoInject(tasks, callback) { + var newTasks = {}; + Object.keys(tasks).forEach((key) => { + var taskFn = tasks[key]; + var params; + var fnIsAsync = isAsync(taskFn); + var hasNoDeps = !fnIsAsync && taskFn.length === 1 || fnIsAsync && taskFn.length === 0; + if (Array.isArray(taskFn)) { + params = [...taskFn]; + taskFn = params.pop(); + newTasks[key] = params.concat(params.length > 0 ? newTask : taskFn); + } else if (hasNoDeps) { + newTasks[key] = taskFn; + } else { + params = parseParams(taskFn); + if (taskFn.length === 0 && !fnIsAsync && params.length === 0) { + throw new Error("autoInject task functions require explicit parameters."); + } + if (!fnIsAsync) + params.pop(); + newTasks[key] = params.concat(newTask); + } + function newTask(results, taskCb) { + var newArgs = params.map((name) => results[name]); + newArgs.push(taskCb); + wrapAsync(taskFn)(...newArgs); + } + }); + return auto(newTasks, callback); + } + + class DLL { + constructor() { + this.head = this.tail = null; + this.length = 0; + } + removeLink(node) { + if (node.prev) + node.prev.next = node.next; + else + this.head = node.next; + if (node.next) + node.next.prev = node.prev; + else + this.tail = node.prev; + node.prev = node.next = null; + this.length -= 1; + return node; + } + empty() { + while (this.head) + this.shift(); + return this; + } + insertAfter(node, newNode) { + newNode.prev = node; + newNode.next = node.next; + if (node.next) + node.next.prev = newNode; + else + this.tail = newNode; + node.next = newNode; + this.length += 1; + } + insertBefore(node, newNode) { + newNode.prev = node.prev; + newNode.next = node; + if (node.prev) + node.prev.next = newNode; + else + this.head = newNode; + node.prev = newNode; + this.length += 1; + } + unshift(node) { + if (this.head) + this.insertBefore(this.head, node); + else + setInitial(this, node); + } + push(node) { + if (this.tail) + this.insertAfter(this.tail, node); + else + setInitial(this, node); + } + shift() { + return this.head && this.removeLink(this.head); + } + pop() { + return this.tail && this.removeLink(this.tail); + } + toArray() { + return [...this]; + } + *[Symbol.iterator]() { + var cur = this.head; + while (cur) { + yield cur.data; + cur = cur.next; + } + } + remove(testFn) { + var curr = this.head; + while (curr) { + var { next } = curr; + if (testFn(curr)) { + this.removeLink(curr); + } + curr = next; + } + return this; + } + } + function setInitial(dll, node) { + dll.length = 1; + dll.head = dll.tail = node; + } + function queue$1(worker, concurrency, payload) { + if (concurrency == null) { + concurrency = 1; + } else if (concurrency === 0) { + throw new RangeError("Concurrency must not be zero"); + } + var _worker = wrapAsync(worker); + var numRunning = 0; + var workersList = []; + const events = { + error: [], + drain: [], + saturated: [], + unsaturated: [], + empty: [] + }; + function on(event, handler) { + events[event].push(handler); + } + function once2(event, handler) { + const handleAndRemove = (...args) => { + off(event, handleAndRemove); + handler(...args); + }; + events[event].push(handleAndRemove); + } + function off(event, handler) { + if (!event) + return Object.keys(events).forEach((ev) => events[ev] = []); + if (!handler) + return events[event] = []; + events[event] = events[event].filter((ev) => ev !== handler); + } + function trigger(event, ...args) { + events[event].forEach((handler) => handler(...args)); + } + var processingScheduled = false; + function _insert(data, insertAtFront, rejectOnError, callback) { + if (callback != null && typeof callback !== "function") { + throw new Error("task callback must be a function"); + } + q.started = true; + var res, rej; + function promiseCallback2(err, ...args) { + if (err) + return rejectOnError ? rej(err) : res(); + if (args.length <= 1) + return res(args[0]); + res(args); + } + var item = q._createTaskItem(data, rejectOnError ? promiseCallback2 : callback || promiseCallback2); + if (insertAtFront) { + q._tasks.unshift(item); + } else { + q._tasks.push(item); + } + if (!processingScheduled) { + processingScheduled = true; + setImmediate$1(() => { + processingScheduled = false; + q.process(); + }); + } + if (rejectOnError || !callback) { + return new Promise((resolve, reject2) => { + res = resolve; + rej = reject2; + }); + } + } + function _createCB(tasks) { + return function(err, ...args) { + numRunning -= 1; + for (var i = 0, l = tasks.length;i < l; i++) { + var task = tasks[i]; + var index2 = workersList.indexOf(task); + if (index2 === 0) { + workersList.shift(); + } else if (index2 > 0) { + workersList.splice(index2, 1); + } + task.callback(err, ...args); + if (err != null) { + trigger("error", err, task.data); + } + } + if (numRunning <= q.concurrency - q.buffer) { + trigger("unsaturated"); + } + if (q.idle()) { + trigger("drain"); + } + q.process(); + }; + } + function _maybeDrain(data) { + if (data.length === 0 && q.idle()) { + setImmediate$1(() => trigger("drain")); + return true; + } + return false; + } + const eventMethod = (name) => (handler) => { + if (!handler) { + return new Promise((resolve, reject2) => { + once2(name, (err, data) => { + if (err) + return reject2(err); + resolve(data); + }); + }); + } + off(name); + on(name, handler); + }; + var isProcessing = false; + var q = { + _tasks: new DLL, + _createTaskItem(data, callback) { + return { + data, + callback + }; + }, + *[Symbol.iterator]() { + yield* q._tasks[Symbol.iterator](); + }, + concurrency, + payload, + buffer: concurrency / 4, + started: false, + paused: false, + push(data, callback) { + if (Array.isArray(data)) { + if (_maybeDrain(data)) + return; + return data.map((datum) => _insert(datum, false, false, callback)); + } + return _insert(data, false, false, callback); + }, + pushAsync(data, callback) { + if (Array.isArray(data)) { + if (_maybeDrain(data)) + return; + return data.map((datum) => _insert(datum, false, true, callback)); + } + return _insert(data, false, true, callback); + }, + kill() { + off(); + q._tasks.empty(); + }, + unshift(data, callback) { + if (Array.isArray(data)) { + if (_maybeDrain(data)) + return; + return data.map((datum) => _insert(datum, true, false, callback)); + } + return _insert(data, true, false, callback); + }, + unshiftAsync(data, callback) { + if (Array.isArray(data)) { + if (_maybeDrain(data)) + return; + return data.map((datum) => _insert(datum, true, true, callback)); + } + return _insert(data, true, true, callback); + }, + remove(testFn) { + q._tasks.remove(testFn); + }, + process() { + if (isProcessing) { + return; + } + isProcessing = true; + while (!q.paused && numRunning < q.concurrency && q._tasks.length) { + var tasks = [], data = []; + var l = q._tasks.length; + if (q.payload) + l = Math.min(l, q.payload); + for (var i = 0;i < l; i++) { + var node = q._tasks.shift(); + tasks.push(node); + workersList.push(node); + data.push(node.data); + } + numRunning += 1; + if (q._tasks.length === 0) { + trigger("empty"); + } + if (numRunning === q.concurrency) { + trigger("saturated"); + } + var cb = onlyOnce(_createCB(tasks)); + _worker(data, cb); + } + isProcessing = false; + }, + length() { + return q._tasks.length; + }, + running() { + return numRunning; + }, + workersList() { + return workersList; + }, + idle() { + return q._tasks.length + numRunning === 0; + }, + pause() { + q.paused = true; + }, + resume() { + if (q.paused === false) { + return; + } + q.paused = false; + setImmediate$1(q.process); + } + }; + Object.defineProperties(q, { + saturated: { + writable: false, + value: eventMethod("saturated") + }, + unsaturated: { + writable: false, + value: eventMethod("unsaturated") + }, + empty: { + writable: false, + value: eventMethod("empty") + }, + drain: { + writable: false, + value: eventMethod("drain") + }, + error: { + writable: false, + value: eventMethod("error") + } + }); + return q; + } + function cargo$1(worker, payload) { + return queue$1(worker, 1, payload); + } + function cargo(worker, concurrency, payload) { + return queue$1(worker, concurrency, payload); + } + function reduce(coll, memo, iteratee, callback) { + callback = once(callback); + var _iteratee = wrapAsync(iteratee); + return eachOfSeries$1(coll, (x, i, iterCb) => { + _iteratee(memo, x, (err, v) => { + memo = v; + iterCb(err); + }); + }, (err) => callback(err, memo)); + } + var reduce$1 = awaitify(reduce, 4); + function seq(...functions) { + var _functions = functions.map(wrapAsync); + return function(...args) { + var that = this; + var cb = args[args.length - 1]; + if (typeof cb == "function") { + args.pop(); + } else { + cb = promiseCallback(); + } + reduce$1(_functions, args, (newargs, fn, iterCb) => { + fn.apply(that, newargs.concat((err, ...nextargs) => { + iterCb(err, nextargs); + })); + }, (err, results) => cb(err, ...results)); + return cb[PROMISE_SYMBOL]; + }; + } + function compose(...args) { + return seq(...args.reverse()); + } + function mapLimit(coll, limit, iteratee, callback) { + return _asyncMap(eachOfLimit$2(limit), coll, iteratee, callback); + } + var mapLimit$1 = awaitify(mapLimit, 4); + function concatLimit(coll, limit, iteratee, callback) { + var _iteratee = wrapAsync(iteratee); + return mapLimit$1(coll, limit, (val2, iterCb) => { + _iteratee(val2, (err, ...args) => { + if (err) + return iterCb(err); + return iterCb(err, args); + }); + }, (err, mapResults) => { + var result = []; + for (var i = 0;i < mapResults.length; i++) { + if (mapResults[i]) { + result = result.concat(...mapResults[i]); + } + } + return callback(err, result); + }); + } + var concatLimit$1 = awaitify(concatLimit, 4); + function concat(coll, iteratee, callback) { + return concatLimit$1(coll, Infinity, iteratee, callback); + } + var concat$1 = awaitify(concat, 3); + function concatSeries(coll, iteratee, callback) { + return concatLimit$1(coll, 1, iteratee, callback); + } + var concatSeries$1 = awaitify(concatSeries, 3); + function constant$1(...args) { + return function(...ignoredArgs) { + var callback = ignoredArgs.pop(); + return callback(null, ...args); + }; + } + function _createTester(check, getResult) { + return (eachfn, arr, _iteratee, cb) => { + var testPassed = false; + var testResult; + const iteratee = wrapAsync(_iteratee); + eachfn(arr, (value, _2, callback) => { + iteratee(value, (err, result) => { + if (err || err === false) + return callback(err); + if (check(result) && !testResult) { + testPassed = true; + testResult = getResult(true, value); + return callback(null, breakLoop); + } + callback(); + }); + }, (err) => { + if (err) + return cb(err); + cb(null, testPassed ? testResult : getResult(false)); + }); + }; + } + function detect(coll, iteratee, callback) { + return _createTester((bool) => bool, (res, item) => item)(eachOf$1, coll, iteratee, callback); + } + var detect$1 = awaitify(detect, 3); + function detectLimit(coll, limit, iteratee, callback) { + return _createTester((bool) => bool, (res, item) => item)(eachOfLimit$2(limit), coll, iteratee, callback); + } + var detectLimit$1 = awaitify(detectLimit, 4); + function detectSeries(coll, iteratee, callback) { + return _createTester((bool) => bool, (res, item) => item)(eachOfLimit$2(1), coll, iteratee, callback); + } + var detectSeries$1 = awaitify(detectSeries, 3); + function consoleFunc(name) { + return (fn, ...args) => wrapAsync(fn)(...args, (err, ...resultArgs) => { + if (typeof console === "object") { + if (err) { + if (console.error) { + console.error(err); + } + } else if (console[name]) { + resultArgs.forEach((x) => console[name](x)); + } + } + }); + } + var dir = consoleFunc("dir"); + function doWhilst(iteratee, test, callback) { + callback = onlyOnce(callback); + var _fn = wrapAsync(iteratee); + var _test = wrapAsync(test); + var results; + function next(err, ...args) { + if (err) + return callback(err); + if (err === false) + return; + results = args; + _test(...args, check); + } + function check(err, truth) { + if (err) + return callback(err); + if (err === false) + return; + if (!truth) + return callback(null, ...results); + _fn(next); + } + return check(null, true); + } + var doWhilst$1 = awaitify(doWhilst, 3); + function doUntil(iteratee, test, callback) { + const _test = wrapAsync(test); + return doWhilst$1(iteratee, (...args) => { + const cb = args.pop(); + _test(...args, (err, truth) => cb(err, !truth)); + }, callback); + } + function _withoutIndex(iteratee) { + return (value, index2, callback) => iteratee(value, callback); + } + function eachLimit$2(coll, iteratee, callback) { + return eachOf$1(coll, _withoutIndex(wrapAsync(iteratee)), callback); + } + var each = awaitify(eachLimit$2, 3); + function eachLimit(coll, limit, iteratee, callback) { + return eachOfLimit$2(limit)(coll, _withoutIndex(wrapAsync(iteratee)), callback); + } + var eachLimit$1 = awaitify(eachLimit, 4); + function eachSeries(coll, iteratee, callback) { + return eachLimit$1(coll, 1, iteratee, callback); + } + var eachSeries$1 = awaitify(eachSeries, 3); + function ensureAsync(fn) { + if (isAsync(fn)) + return fn; + return function(...args) { + var callback = args.pop(); + var sync = true; + args.push((...innerArgs) => { + if (sync) { + setImmediate$1(() => callback(...innerArgs)); + } else { + callback(...innerArgs); + } + }); + fn.apply(this, args); + sync = false; + }; + } + function every(coll, iteratee, callback) { + return _createTester((bool) => !bool, (res) => !res)(eachOf$1, coll, iteratee, callback); + } + var every$1 = awaitify(every, 3); + function everyLimit(coll, limit, iteratee, callback) { + return _createTester((bool) => !bool, (res) => !res)(eachOfLimit$2(limit), coll, iteratee, callback); + } + var everyLimit$1 = awaitify(everyLimit, 4); + function everySeries(coll, iteratee, callback) { + return _createTester((bool) => !bool, (res) => !res)(eachOfSeries$1, coll, iteratee, callback); + } + var everySeries$1 = awaitify(everySeries, 3); + function filterArray(eachfn, arr, iteratee, callback) { + var truthValues = new Array(arr.length); + eachfn(arr, (x, index2, iterCb) => { + iteratee(x, (err, v) => { + truthValues[index2] = !!v; + iterCb(err); + }); + }, (err) => { + if (err) + return callback(err); + var results = []; + for (var i = 0;i < arr.length; i++) { + if (truthValues[i]) + results.push(arr[i]); + } + callback(null, results); + }); + } + function filterGeneric(eachfn, coll, iteratee, callback) { + var results = []; + eachfn(coll, (x, index2, iterCb) => { + iteratee(x, (err, v) => { + if (err) + return iterCb(err); + if (v) { + results.push({ index: index2, value: x }); + } + iterCb(err); + }); + }, (err) => { + if (err) + return callback(err); + callback(null, results.sort((a, b) => a.index - b.index).map((v) => v.value)); + }); + } + function _filter(eachfn, coll, iteratee, callback) { + var filter2 = isArrayLike(coll) ? filterArray : filterGeneric; + return filter2(eachfn, coll, wrapAsync(iteratee), callback); + } + function filter(coll, iteratee, callback) { + return _filter(eachOf$1, coll, iteratee, callback); + } + var filter$1 = awaitify(filter, 3); + function filterLimit(coll, limit, iteratee, callback) { + return _filter(eachOfLimit$2(limit), coll, iteratee, callback); + } + var filterLimit$1 = awaitify(filterLimit, 4); + function filterSeries(coll, iteratee, callback) { + return _filter(eachOfSeries$1, coll, iteratee, callback); + } + var filterSeries$1 = awaitify(filterSeries, 3); + function forever(fn, errback) { + var done = onlyOnce(errback); + var task = wrapAsync(ensureAsync(fn)); + function next(err) { + if (err) + return done(err); + if (err === false) + return; + task(next); + } + return next(); + } + var forever$1 = awaitify(forever, 2); + function groupByLimit(coll, limit, iteratee, callback) { + var _iteratee = wrapAsync(iteratee); + return mapLimit$1(coll, limit, (val2, iterCb) => { + _iteratee(val2, (err, key) => { + if (err) + return iterCb(err); + return iterCb(err, { key, val: val2 }); + }); + }, (err, mapResults) => { + var result = {}; + var { hasOwnProperty } = Object.prototype; + for (var i = 0;i < mapResults.length; i++) { + if (mapResults[i]) { + var { key } = mapResults[i]; + var { val: val2 } = mapResults[i]; + if (hasOwnProperty.call(result, key)) { + result[key].push(val2); + } else { + result[key] = [val2]; + } + } + } + return callback(err, result); + }); + } + var groupByLimit$1 = awaitify(groupByLimit, 4); + function groupBy(coll, iteratee, callback) { + return groupByLimit$1(coll, Infinity, iteratee, callback); + } + function groupBySeries(coll, iteratee, callback) { + return groupByLimit$1(coll, 1, iteratee, callback); + } + var log = consoleFunc("log"); + function mapValuesLimit(obj, limit, iteratee, callback) { + callback = once(callback); + var newObj = {}; + var _iteratee = wrapAsync(iteratee); + return eachOfLimit$2(limit)(obj, (val2, key, next) => { + _iteratee(val2, key, (err, result) => { + if (err) + return next(err); + newObj[key] = result; + next(err); + }); + }, (err) => callback(err, newObj)); + } + var mapValuesLimit$1 = awaitify(mapValuesLimit, 4); + function mapValues(obj, iteratee, callback) { + return mapValuesLimit$1(obj, Infinity, iteratee, callback); + } + function mapValuesSeries(obj, iteratee, callback) { + return mapValuesLimit$1(obj, 1, iteratee, callback); + } + function memoize(fn, hasher = (v) => v) { + var memo = Object.create(null); + var queues = Object.create(null); + var _fn = wrapAsync(fn); + var memoized = initialParams((args, callback) => { + var key = hasher(...args); + if (key in memo) { + setImmediate$1(() => callback(null, ...memo[key])); + } else if (key in queues) { + queues[key].push(callback); + } else { + queues[key] = [callback]; + _fn(...args, (err, ...resultArgs) => { + if (!err) { + memo[key] = resultArgs; + } + var q = queues[key]; + delete queues[key]; + for (var i = 0, l = q.length;i < l; i++) { + q[i](err, ...resultArgs); + } + }); + } + }); + memoized.memo = memo; + memoized.unmemoized = fn; + return memoized; + } + var _defer; + if (hasNextTick) { + _defer = process.nextTick; + } else if (hasSetImmediate) { + _defer = setImmediate; + } else { + _defer = fallback; + } + var nextTick = wrap(_defer); + var _parallel = awaitify((eachfn, tasks, callback) => { + var results = isArrayLike(tasks) ? [] : {}; + eachfn(tasks, (task, key, taskCb) => { + wrapAsync(task)((err, ...result) => { + if (result.length < 2) { + [result] = result; + } + results[key] = result; + taskCb(err); + }); + }, (err) => callback(err, results)); + }, 3); + function parallel(tasks, callback) { + return _parallel(eachOf$1, tasks, callback); + } + function parallelLimit(tasks, limit, callback) { + return _parallel(eachOfLimit$2(limit), tasks, callback); + } + function queue(worker, concurrency) { + var _worker = wrapAsync(worker); + return queue$1((items, cb) => { + _worker(items[0], cb); + }, concurrency, 1); + } + + class Heap { + constructor() { + this.heap = []; + this.pushCount = Number.MIN_SAFE_INTEGER; + } + get length() { + return this.heap.length; + } + empty() { + this.heap = []; + return this; + } + percUp(index2) { + let p; + while (index2 > 0 && smaller(this.heap[index2], this.heap[p = parent(index2)])) { + let t = this.heap[index2]; + this.heap[index2] = this.heap[p]; + this.heap[p] = t; + index2 = p; + } + } + percDown(index2) { + let l; + while ((l = leftChi(index2)) < this.heap.length) { + if (l + 1 < this.heap.length && smaller(this.heap[l + 1], this.heap[l])) { + l = l + 1; + } + if (smaller(this.heap[index2], this.heap[l])) { + break; + } + let t = this.heap[index2]; + this.heap[index2] = this.heap[l]; + this.heap[l] = t; + index2 = l; + } + } + push(node) { + node.pushCount = ++this.pushCount; + this.heap.push(node); + this.percUp(this.heap.length - 1); + } + unshift(node) { + return this.heap.push(node); + } + shift() { + let [top] = this.heap; + this.heap[0] = this.heap[this.heap.length - 1]; + this.heap.pop(); + this.percDown(0); + return top; + } + toArray() { + return [...this]; + } + *[Symbol.iterator]() { + for (let i = 0;i < this.heap.length; i++) { + yield this.heap[i].data; + } + } + remove(testFn) { + let j = 0; + for (let i = 0;i < this.heap.length; i++) { + if (!testFn(this.heap[i])) { + this.heap[j] = this.heap[i]; + j++; + } + } + this.heap.splice(j); + for (let i = parent(this.heap.length - 1);i >= 0; i--) { + this.percDown(i); + } + return this; + } + } + function leftChi(i) { + return (i << 1) + 1; + } + function parent(i) { + return (i + 1 >> 1) - 1; + } + function smaller(x, y) { + if (x.priority !== y.priority) { + return x.priority < y.priority; + } else { + return x.pushCount < y.pushCount; + } + } + function priorityQueue(worker, concurrency) { + var q = queue(worker, concurrency); + var { + push, + pushAsync + } = q; + q._tasks = new Heap; + q._createTaskItem = ({ data, priority }, callback) => { + return { + data, + priority, + callback + }; + }; + function createDataItems(tasks, priority) { + if (!Array.isArray(tasks)) { + return { data: tasks, priority }; + } + return tasks.map((data) => { + return { data, priority }; + }); + } + q.push = function(data, priority = 0, callback) { + return push(createDataItems(data, priority), callback); + }; + q.pushAsync = function(data, priority = 0, callback) { + return pushAsync(createDataItems(data, priority), callback); + }; + delete q.unshift; + delete q.unshiftAsync; + return q; + } + function race(tasks, callback) { + callback = once(callback); + if (!Array.isArray(tasks)) + return callback(new TypeError("First argument to race must be an array of functions")); + if (!tasks.length) + return callback(); + for (var i = 0, l = tasks.length;i < l; i++) { + wrapAsync(tasks[i])(callback); + } + } + var race$1 = awaitify(race, 2); + function reduceRight(array, memo, iteratee, callback) { + var reversed = [...array].reverse(); + return reduce$1(reversed, memo, iteratee, callback); + } + function reflect(fn) { + var _fn = wrapAsync(fn); + return initialParams(function reflectOn(args, reflectCallback) { + args.push((error, ...cbArgs) => { + let retVal = {}; + if (error) { + retVal.error = error; + } + if (cbArgs.length > 0) { + var value = cbArgs; + if (cbArgs.length <= 1) { + [value] = cbArgs; + } + retVal.value = value; + } + reflectCallback(null, retVal); + }); + return _fn.apply(this, args); + }); + } + function reflectAll(tasks) { + var results; + if (Array.isArray(tasks)) { + results = tasks.map(reflect); + } else { + results = {}; + Object.keys(tasks).forEach((key) => { + results[key] = reflect.call(this, tasks[key]); + }); + } + return results; + } + function reject$2(eachfn, arr, _iteratee, callback) { + const iteratee = wrapAsync(_iteratee); + return _filter(eachfn, arr, (value, cb) => { + iteratee(value, (err, v) => { + cb(err, !v); + }); + }, callback); + } + function reject(coll, iteratee, callback) { + return reject$2(eachOf$1, coll, iteratee, callback); + } + var reject$1 = awaitify(reject, 3); + function rejectLimit(coll, limit, iteratee, callback) { + return reject$2(eachOfLimit$2(limit), coll, iteratee, callback); + } + var rejectLimit$1 = awaitify(rejectLimit, 4); + function rejectSeries(coll, iteratee, callback) { + return reject$2(eachOfSeries$1, coll, iteratee, callback); + } + var rejectSeries$1 = awaitify(rejectSeries, 3); + function constant(value) { + return function() { + return value; + }; + } + const DEFAULT_TIMES = 5; + const DEFAULT_INTERVAL = 0; + function retry(opts, task, callback) { + var options = { + times: DEFAULT_TIMES, + intervalFunc: constant(DEFAULT_INTERVAL) + }; + if (arguments.length < 3 && typeof opts === "function") { + callback = task || promiseCallback(); + task = opts; + } else { + parseTimes(options, opts); + callback = callback || promiseCallback(); + } + if (typeof task !== "function") { + throw new Error("Invalid arguments for async.retry"); + } + var _task = wrapAsync(task); + var attempt = 1; + function retryAttempt() { + _task((err, ...args) => { + if (err === false) + return; + if (err && attempt++ < options.times && (typeof options.errorFilter != "function" || options.errorFilter(err))) { + setTimeout(retryAttempt, options.intervalFunc(attempt - 1)); + } else { + callback(err, ...args); + } + }); + } + retryAttempt(); + return callback[PROMISE_SYMBOL]; + } + function parseTimes(acc, t) { + if (typeof t === "object") { + acc.times = +t.times || DEFAULT_TIMES; + acc.intervalFunc = typeof t.interval === "function" ? t.interval : constant(+t.interval || DEFAULT_INTERVAL); + acc.errorFilter = t.errorFilter; + } else if (typeof t === "number" || typeof t === "string") { + acc.times = +t || DEFAULT_TIMES; + } else { + throw new Error("Invalid arguments for async.retry"); + } + } + function retryable(opts, task) { + if (!task) { + task = opts; + opts = null; + } + let arity = opts && opts.arity || task.length; + if (isAsync(task)) { + arity += 1; + } + var _task = wrapAsync(task); + return initialParams((args, callback) => { + if (args.length < arity - 1 || callback == null) { + args.push(callback); + callback = promiseCallback(); + } + function taskFn(cb) { + _task(...args, cb); + } + if (opts) + retry(opts, taskFn, callback); + else + retry(taskFn, callback); + return callback[PROMISE_SYMBOL]; + }); + } + function series(tasks, callback) { + return _parallel(eachOfSeries$1, tasks, callback); + } + function some(coll, iteratee, callback) { + return _createTester(Boolean, (res) => res)(eachOf$1, coll, iteratee, callback); + } + var some$1 = awaitify(some, 3); + function someLimit(coll, limit, iteratee, callback) { + return _createTester(Boolean, (res) => res)(eachOfLimit$2(limit), coll, iteratee, callback); + } + var someLimit$1 = awaitify(someLimit, 4); + function someSeries(coll, iteratee, callback) { + return _createTester(Boolean, (res) => res)(eachOfSeries$1, coll, iteratee, callback); + } + var someSeries$1 = awaitify(someSeries, 3); + function sortBy(coll, iteratee, callback) { + var _iteratee = wrapAsync(iteratee); + return map$1(coll, (x, iterCb) => { + _iteratee(x, (err, criteria) => { + if (err) + return iterCb(err); + iterCb(err, { value: x, criteria }); + }); + }, (err, results) => { + if (err) + return callback(err); + callback(null, results.sort(comparator).map((v) => v.value)); + }); + function comparator(left, right) { + var a = left.criteria, b = right.criteria; + return a < b ? -1 : a > b ? 1 : 0; + } + } + var sortBy$1 = awaitify(sortBy, 3); + function timeout(asyncFn, milliseconds, info) { + var fn = wrapAsync(asyncFn); + return initialParams((args, callback) => { + var timedOut = false; + var timer; + function timeoutCallback() { + var name = asyncFn.name || "anonymous"; + var error = new Error('Callback function "' + name + '" timed out.'); + error.code = "ETIMEDOUT"; + if (info) { + error.info = info; + } + timedOut = true; + callback(error); + } + args.push((...cbArgs) => { + if (!timedOut) { + callback(...cbArgs); + clearTimeout(timer); + } + }); + timer = setTimeout(timeoutCallback, milliseconds); + fn(...args); + }); + } + function range(size) { + var result = Array(size); + while (size--) { + result[size] = size; + } + return result; + } + function timesLimit(count, limit, iteratee, callback) { + var _iteratee = wrapAsync(iteratee); + return mapLimit$1(range(count), limit, _iteratee, callback); + } + function times(n, iteratee, callback) { + return timesLimit(n, Infinity, iteratee, callback); + } + function timesSeries(n, iteratee, callback) { + return timesLimit(n, 1, iteratee, callback); + } + function transform(coll, accumulator, iteratee, callback) { + if (arguments.length <= 3 && typeof accumulator === "function") { + callback = iteratee; + iteratee = accumulator; + accumulator = Array.isArray(coll) ? [] : {}; + } + callback = once(callback || promiseCallback()); + var _iteratee = wrapAsync(iteratee); + eachOf$1(coll, (v, k, cb) => { + _iteratee(accumulator, v, k, cb); + }, (err) => callback(err, accumulator)); + return callback[PROMISE_SYMBOL]; + } + function tryEach(tasks, callback) { + var error = null; + var result; + return eachSeries$1(tasks, (task, taskCb) => { + wrapAsync(task)((err, ...args) => { + if (err === false) + return taskCb(err); + if (args.length < 2) { + [result] = args; + } else { + result = args; + } + error = err; + taskCb(err ? null : {}); + }); + }, () => callback(error, result)); + } + var tryEach$1 = awaitify(tryEach); + function unmemoize(fn) { + return (...args) => { + return (fn.unmemoized || fn)(...args); + }; + } + function whilst(test, iteratee, callback) { + callback = onlyOnce(callback); + var _fn = wrapAsync(iteratee); + var _test = wrapAsync(test); + var results = []; + function next(err, ...rest) { + if (err) + return callback(err); + results = rest; + if (err === false) + return; + _test(check); + } + function check(err, truth) { + if (err) + return callback(err); + if (err === false) + return; + if (!truth) + return callback(null, ...results); + _fn(next); + } + return _test(check); + } + var whilst$1 = awaitify(whilst, 3); + function until(test, iteratee, callback) { + const _test = wrapAsync(test); + return whilst$1((cb) => _test((err, truth) => cb(err, !truth)), iteratee, callback); + } + function waterfall(tasks, callback) { + callback = once(callback); + if (!Array.isArray(tasks)) + return callback(new Error("First argument to waterfall must be an array of functions")); + if (!tasks.length) + return callback(); + var taskIndex = 0; + function nextTask(args) { + var task = wrapAsync(tasks[taskIndex++]); + task(...args, onlyOnce(next)); + } + function next(err, ...args) { + if (err === false) + return; + if (err || taskIndex === tasks.length) { + return callback(err, ...args); + } + nextTask(args); + } + nextTask([]); + } + var waterfall$1 = awaitify(waterfall); + var index = { + apply, + applyEach, + applyEachSeries, + asyncify, + auto, + autoInject, + cargo: cargo$1, + cargoQueue: cargo, + compose, + concat: concat$1, + concatLimit: concatLimit$1, + concatSeries: concatSeries$1, + constant: constant$1, + detect: detect$1, + detectLimit: detectLimit$1, + detectSeries: detectSeries$1, + dir, + doUntil, + doWhilst: doWhilst$1, + each, + eachLimit: eachLimit$1, + eachOf: eachOf$1, + eachOfLimit: eachOfLimit$1, + eachOfSeries: eachOfSeries$1, + eachSeries: eachSeries$1, + ensureAsync, + every: every$1, + everyLimit: everyLimit$1, + everySeries: everySeries$1, + filter: filter$1, + filterLimit: filterLimit$1, + filterSeries: filterSeries$1, + forever: forever$1, + groupBy, + groupByLimit: groupByLimit$1, + groupBySeries, + log, + map: map$1, + mapLimit: mapLimit$1, + mapSeries: mapSeries$1, + mapValues, + mapValuesLimit: mapValuesLimit$1, + mapValuesSeries, + memoize, + nextTick, + parallel, + parallelLimit, + priorityQueue, + queue, + race: race$1, + reduce: reduce$1, + reduceRight, + reflect, + reflectAll, + reject: reject$1, + rejectLimit: rejectLimit$1, + rejectSeries: rejectSeries$1, + retry, + retryable, + seq, + series, + setImmediate: setImmediate$1, + some: some$1, + someLimit: someLimit$1, + someSeries: someSeries$1, + sortBy: sortBy$1, + timeout, + times, + timesLimit, + timesSeries, + transform, + tryEach: tryEach$1, + unmemoize, + until, + waterfall: waterfall$1, + whilst: whilst$1, + all: every$1, + allLimit: everyLimit$1, + allSeries: everySeries$1, + any: some$1, + anyLimit: someLimit$1, + anySeries: someSeries$1, + find: detect$1, + findLimit: detectLimit$1, + findSeries: detectSeries$1, + flatMap: concat$1, + flatMapLimit: concatLimit$1, + flatMapSeries: concatSeries$1, + forEach: each, + forEachSeries: eachSeries$1, + forEachLimit: eachLimit$1, + forEachOf: eachOf$1, + forEachOfSeries: eachOfSeries$1, + forEachOfLimit: eachOfLimit$1, + inject: reduce$1, + foldl: reduce$1, + foldr: reduceRight, + select: filter$1, + selectLimit: filterLimit$1, + selectSeries: filterSeries$1, + wrapSync: asyncify, + during: whilst$1, + doDuring: doWhilst$1 + }; + exports3.all = every$1; + exports3.allLimit = everyLimit$1; + exports3.allSeries = everySeries$1; + exports3.any = some$1; + exports3.anyLimit = someLimit$1; + exports3.anySeries = someSeries$1; + exports3.apply = apply; + exports3.applyEach = applyEach; + exports3.applyEachSeries = applyEachSeries; + exports3.asyncify = asyncify; + exports3.auto = auto; + exports3.autoInject = autoInject; + exports3.cargo = cargo$1; + exports3.cargoQueue = cargo; + exports3.compose = compose; + exports3.concat = concat$1; + exports3.concatLimit = concatLimit$1; + exports3.concatSeries = concatSeries$1; + exports3.constant = constant$1; + exports3.default = index; + exports3.detect = detect$1; + exports3.detectLimit = detectLimit$1; + exports3.detectSeries = detectSeries$1; + exports3.dir = dir; + exports3.doDuring = doWhilst$1; + exports3.doUntil = doUntil; + exports3.doWhilst = doWhilst$1; + exports3.during = whilst$1; + exports3.each = each; + exports3.eachLimit = eachLimit$1; + exports3.eachOf = eachOf$1; + exports3.eachOfLimit = eachOfLimit$1; + exports3.eachOfSeries = eachOfSeries$1; + exports3.eachSeries = eachSeries$1; + exports3.ensureAsync = ensureAsync; + exports3.every = every$1; + exports3.everyLimit = everyLimit$1; + exports3.everySeries = everySeries$1; + exports3.filter = filter$1; + exports3.filterLimit = filterLimit$1; + exports3.filterSeries = filterSeries$1; + exports3.find = detect$1; + exports3.findLimit = detectLimit$1; + exports3.findSeries = detectSeries$1; + exports3.flatMap = concat$1; + exports3.flatMapLimit = concatLimit$1; + exports3.flatMapSeries = concatSeries$1; + exports3.foldl = reduce$1; + exports3.foldr = reduceRight; + exports3.forEach = each; + exports3.forEachLimit = eachLimit$1; + exports3.forEachOf = eachOf$1; + exports3.forEachOfLimit = eachOfLimit$1; + exports3.forEachOfSeries = eachOfSeries$1; + exports3.forEachSeries = eachSeries$1; + exports3.forever = forever$1; + exports3.groupBy = groupBy; + exports3.groupByLimit = groupByLimit$1; + exports3.groupBySeries = groupBySeries; + exports3.inject = reduce$1; + exports3.log = log; + exports3.map = map$1; + exports3.mapLimit = mapLimit$1; + exports3.mapSeries = mapSeries$1; + exports3.mapValues = mapValues; + exports3.mapValuesLimit = mapValuesLimit$1; + exports3.mapValuesSeries = mapValuesSeries; + exports3.memoize = memoize; + exports3.nextTick = nextTick; + exports3.parallel = parallel; + exports3.parallelLimit = parallelLimit; + exports3.priorityQueue = priorityQueue; + exports3.queue = queue; + exports3.race = race$1; + exports3.reduce = reduce$1; + exports3.reduceRight = reduceRight; + exports3.reflect = reflect; + exports3.reflectAll = reflectAll; + exports3.reject = reject$1; + exports3.rejectLimit = rejectLimit$1; + exports3.rejectSeries = rejectSeries$1; + exports3.retry = retry; + exports3.retryable = retryable; + exports3.select = filter$1; + exports3.selectLimit = filterLimit$1; + exports3.selectSeries = filterSeries$1; + exports3.seq = seq; + exports3.series = series; + exports3.setImmediate = setImmediate$1; + exports3.some = some$1; + exports3.someLimit = someLimit$1; + exports3.someSeries = someSeries$1; + exports3.sortBy = sortBy$1; + exports3.timeout = timeout; + exports3.times = times; + exports3.timesLimit = timesLimit; + exports3.timesSeries = timesSeries; + exports3.transform = transform; + exports3.tryEach = tryEach$1; + exports3.unmemoize = unmemoize; + exports3.until = until; + exports3.waterfall = waterfall$1; + exports3.whilst = whilst$1; + exports3.wrapSync = asyncify; + Object.defineProperty(exports3, "__esModule", { value: true }); + }); +}); + +// node_modules/graceful-fs/polyfills.js +var require_polyfills = __commonJS((exports2, module2) => { + var constants = require("constants"); + var origCwd = process.cwd; + var cwd = null; + var platform = process.env.GRACEFUL_FS_PLATFORM || process.platform; + process.cwd = function() { + if (!cwd) + cwd = origCwd.call(process); + return cwd; + }; + try { + process.cwd(); + } catch (er) { + } + if (typeof process.chdir === "function") { + chdir = process.chdir; + process.chdir = function(d) { + cwd = null; + chdir.call(process, d); + }; + if (Object.setPrototypeOf) + Object.setPrototypeOf(process.chdir, chdir); + } + var chdir; + module2.exports = patch; + function patch(fs) { + if (constants.hasOwnProperty("O_SYMLINK") && process.version.match(/^v0\.6\.[0-2]|^v0\.5\./)) { + patchLchmod(fs); + } + if (!fs.lutimes) { + patchLutimes(fs); + } + fs.chown = chownFix(fs.chown); + fs.fchown = chownFix(fs.fchown); + fs.lchown = chownFix(fs.lchown); + fs.chmod = chmodFix(fs.chmod); + fs.fchmod = chmodFix(fs.fchmod); + fs.lchmod = chmodFix(fs.lchmod); + fs.chownSync = chownFixSync(fs.chownSync); + fs.fchownSync = chownFixSync(fs.fchownSync); + fs.lchownSync = chownFixSync(fs.lchownSync); + fs.chmodSync = chmodFixSync(fs.chmodSync); + fs.fchmodSync = chmodFixSync(fs.fchmodSync); + fs.lchmodSync = chmodFixSync(fs.lchmodSync); + fs.stat = statFix(fs.stat); + fs.fstat = statFix(fs.fstat); + fs.lstat = statFix(fs.lstat); + fs.statSync = statFixSync(fs.statSync); + fs.fstatSync = statFixSync(fs.fstatSync); + fs.lstatSync = statFixSync(fs.lstatSync); + if (fs.chmod && !fs.lchmod) { + fs.lchmod = function(path, mode, cb) { + if (cb) + process.nextTick(cb); + }; + fs.lchmodSync = function() { + }; + } + if (fs.chown && !fs.lchown) { + fs.lchown = function(path, uid, gid, cb) { + if (cb) + process.nextTick(cb); + }; + fs.lchownSync = function() { + }; + } + if (platform === "win32") { + fs.rename = typeof fs.rename !== "function" ? fs.rename : function(fs$rename) { + function rename(from, to, cb) { + var start = Date.now(); + var backoff = 0; + fs$rename(from, to, function CB(er) { + if (er && (er.code === "EACCES" || er.code === "EPERM" || er.code === "EBUSY") && Date.now() - start < 60000) { + setTimeout(function() { + fs.stat(to, function(stater, st) { + if (stater && stater.code === "ENOENT") + fs$rename(from, to, CB); + else + cb(er); + }); + }, backoff); + if (backoff < 100) + backoff += 10; + return; + } + if (cb) + cb(er); + }); + } + if (Object.setPrototypeOf) + Object.setPrototypeOf(rename, fs$rename); + return rename; + }(fs.rename); + } + fs.read = typeof fs.read !== "function" ? fs.read : function(fs$read) { + function read(fd, buffer, offset, length, position, callback_) { + var callback; + if (callback_ && typeof callback_ === "function") { + var eagCounter = 0; + callback = function(er, _2, __) { + if (er && er.code === "EAGAIN" && eagCounter < 10) { + eagCounter++; + return fs$read.call(fs, fd, buffer, offset, length, position, callback); + } + callback_.apply(this, arguments); + }; + } + return fs$read.call(fs, fd, buffer, offset, length, position, callback); + } + if (Object.setPrototypeOf) + Object.setPrototypeOf(read, fs$read); + return read; + }(fs.read); + fs.readSync = typeof fs.readSync !== "function" ? fs.readSync : function(fs$readSync) { + return function(fd, buffer, offset, length, position) { + var eagCounter = 0; + while (true) { + try { + return fs$readSync.call(fs, fd, buffer, offset, length, position); + } catch (er) { + if (er.code === "EAGAIN" && eagCounter < 10) { + eagCounter++; + continue; + } + throw er; + } + } + }; + }(fs.readSync); + function patchLchmod(fs2) { + fs2.lchmod = function(path, mode, callback) { + fs2.open(path, constants.O_WRONLY | constants.O_SYMLINK, mode, function(err, fd) { + if (err) { + if (callback) + callback(err); + return; + } + fs2.fchmod(fd, mode, function(err2) { + fs2.close(fd, function(err22) { + if (callback) + callback(err2 || err22); + }); + }); + }); + }; + fs2.lchmodSync = function(path, mode) { + var fd = fs2.openSync(path, constants.O_WRONLY | constants.O_SYMLINK, mode); + var threw = true; + var ret; + try { + ret = fs2.fchmodSync(fd, mode); + threw = false; + } finally { + if (threw) { + try { + fs2.closeSync(fd); + } catch (er) { + } + } else { + fs2.closeSync(fd); + } + } + return ret; + }; + } + function patchLutimes(fs2) { + if (constants.hasOwnProperty("O_SYMLINK") && fs2.futimes) { + fs2.lutimes = function(path, at, mt, cb) { + fs2.open(path, constants.O_SYMLINK, function(er, fd) { + if (er) { + if (cb) + cb(er); + return; + } + fs2.futimes(fd, at, mt, function(er2) { + fs2.close(fd, function(er22) { + if (cb) + cb(er2 || er22); + }); + }); + }); + }; + fs2.lutimesSync = function(path, at, mt) { + var fd = fs2.openSync(path, constants.O_SYMLINK); + var ret; + var threw = true; + try { + ret = fs2.futimesSync(fd, at, mt); + threw = false; + } finally { + if (threw) { + try { + fs2.closeSync(fd); + } catch (er) { + } + } else { + fs2.closeSync(fd); + } + } + return ret; + }; + } else if (fs2.futimes) { + fs2.lutimes = function(_a, _b, _c, cb) { + if (cb) + process.nextTick(cb); + }; + fs2.lutimesSync = function() { + }; + } + } + function chmodFix(orig) { + if (!orig) + return orig; + return function(target, mode, cb) { + return orig.call(fs, target, mode, function(er) { + if (chownErOk(er)) + er = null; + if (cb) + cb.apply(this, arguments); + }); + }; + } + function chmodFixSync(orig) { + if (!orig) + return orig; + return function(target, mode) { + try { + return orig.call(fs, target, mode); + } catch (er) { + if (!chownErOk(er)) + throw er; + } + }; + } + function chownFix(orig) { + if (!orig) + return orig; + return function(target, uid, gid, cb) { + return orig.call(fs, target, uid, gid, function(er) { + if (chownErOk(er)) + er = null; + if (cb) + cb.apply(this, arguments); + }); + }; + } + function chownFixSync(orig) { + if (!orig) + return orig; + return function(target, uid, gid) { + try { + return orig.call(fs, target, uid, gid); + } catch (er) { + if (!chownErOk(er)) + throw er; + } + }; + } + function statFix(orig) { + if (!orig) + return orig; + return function(target, options, cb) { + if (typeof options === "function") { + cb = options; + options = null; + } + function callback(er, stats) { + if (stats) { + if (stats.uid < 0) + stats.uid += 4294967296; + if (stats.gid < 0) + stats.gid += 4294967296; + } + if (cb) + cb.apply(this, arguments); + } + return options ? orig.call(fs, target, options, callback) : orig.call(fs, target, callback); + }; + } + function statFixSync(orig) { + if (!orig) + return orig; + return function(target, options) { + var stats = options ? orig.call(fs, target, options) : orig.call(fs, target); + if (stats) { + if (stats.uid < 0) + stats.uid += 4294967296; + if (stats.gid < 0) + stats.gid += 4294967296; + } + return stats; + }; + } + function chownErOk(er) { + if (!er) + return true; + if (er.code === "ENOSYS") + return true; + var nonroot = !process.getuid || process.getuid() !== 0; + if (nonroot) { + if (er.code === "EINVAL" || er.code === "EPERM") + return true; + } + return false; + } + } +}); + +// node_modules/graceful-fs/legacy-streams.js +var require_legacy_streams = __commonJS((exports2, module2) => { + var Stream = require("stream").Stream; + module2.exports = legacy; + function legacy(fs) { + return { + ReadStream, + WriteStream + }; + function ReadStream(path, options) { + if (!(this instanceof ReadStream)) + return new ReadStream(path, options); + Stream.call(this); + var self2 = this; + this.path = path; + this.fd = null; + this.readable = true; + this.paused = false; + this.flags = "r"; + this.mode = 438; + this.bufferSize = 64 * 1024; + options = options || {}; + var keys = Object.keys(options); + for (var index = 0, length = keys.length;index < length; index++) { + var key = keys[index]; + this[key] = options[key]; + } + if (this.encoding) + this.setEncoding(this.encoding); + if (this.start !== undefined) { + if (typeof this.start !== "number") { + throw TypeError("start must be a Number"); + } + if (this.end === undefined) { + this.end = Infinity; + } else if (typeof this.end !== "number") { + throw TypeError("end must be a Number"); + } + if (this.start > this.end) { + throw new Error("start must be <= end"); + } + this.pos = this.start; + } + if (this.fd !== null) { + process.nextTick(function() { + self2._read(); + }); + return; + } + fs.open(this.path, this.flags, this.mode, function(err, fd) { + if (err) { + self2.emit("error", err); + self2.readable = false; + return; + } + self2.fd = fd; + self2.emit("open", fd); + self2._read(); + }); + } + function WriteStream(path, options) { + if (!(this instanceof WriteStream)) + return new WriteStream(path, options); + Stream.call(this); + this.path = path; + this.fd = null; + this.writable = true; + this.flags = "w"; + this.encoding = "binary"; + this.mode = 438; + this.bytesWritten = 0; + options = options || {}; + var keys = Object.keys(options); + for (var index = 0, length = keys.length;index < length; index++) { + var key = keys[index]; + this[key] = options[key]; + } + if (this.start !== undefined) { + if (typeof this.start !== "number") { + throw TypeError("start must be a Number"); + } + if (this.start < 0) { + throw new Error("start must be >= zero"); + } + this.pos = this.start; + } + this.busy = false; + this._queue = []; + if (this.fd === null) { + this._open = fs.open; + this._queue.push([this._open, this.path, this.flags, this.mode, undefined]); + this.flush(); + } + } + } +}); + +// node_modules/graceful-fs/clone.js +var require_clone = __commonJS((exports2, module2) => { + module2.exports = clone; + var getPrototypeOf = Object.getPrototypeOf || function(obj) { + return obj.__proto__; + }; + function clone(obj) { + if (obj === null || typeof obj !== "object") + return obj; + if (obj instanceof Object) + var copy = { __proto__: getPrototypeOf(obj) }; + else + var copy = Object.create(null); + Object.getOwnPropertyNames(obj).forEach(function(key) { + Object.defineProperty(copy, key, Object.getOwnPropertyDescriptor(obj, key)); + }); + return copy; + } +}); + +// node_modules/graceful-fs/graceful-fs.js +var require_graceful_fs = __commonJS((exports2, module2) => { + var fs = require("fs"); + var polyfills = require_polyfills(); + var legacy = require_legacy_streams(); + var clone = require_clone(); + var util = require("util"); + var gracefulQueue; + var previousSymbol; + if (typeof Symbol === "function" && typeof Symbol.for === "function") { + gracefulQueue = Symbol.for("graceful-fs.queue"); + previousSymbol = Symbol.for("graceful-fs.previous"); + } else { + gracefulQueue = "___graceful-fs.queue"; + previousSymbol = "___graceful-fs.previous"; + } + function noop() { + } + function publishQueue(context, queue2) { + Object.defineProperty(context, gracefulQueue, { + get: function() { + return queue2; + } + }); + } + var debug = noop; + if (util.debuglog) + debug = util.debuglog("gfs4"); + else if (/\bgfs4\b/i.test(process.env.NODE_DEBUG || "")) + debug = function() { + var m = util.format.apply(util, arguments); + m = "GFS4: " + m.split(/\n/).join("\nGFS4: "); + console.error(m); + }; + if (!fs[gracefulQueue]) { + queue = global[gracefulQueue] || []; + publishQueue(fs, queue); + fs.close = function(fs$close) { + function close(fd, cb) { + return fs$close.call(fs, fd, function(err) { + if (!err) { + resetQueue(); + } + if (typeof cb === "function") + cb.apply(this, arguments); + }); + } + Object.defineProperty(close, previousSymbol, { + value: fs$close + }); + return close; + }(fs.close); + fs.closeSync = function(fs$closeSync) { + function closeSync(fd) { + fs$closeSync.apply(fs, arguments); + resetQueue(); + } + Object.defineProperty(closeSync, previousSymbol, { + value: fs$closeSync + }); + return closeSync; + }(fs.closeSync); + if (/\bgfs4\b/i.test(process.env.NODE_DEBUG || "")) { + process.on("exit", function() { + debug(fs[gracefulQueue]); + require("assert").equal(fs[gracefulQueue].length, 0); + }); + } + } + var queue; + if (!global[gracefulQueue]) { + publishQueue(global, fs[gracefulQueue]); + } + module2.exports = patch(clone(fs)); + if (process.env.TEST_GRACEFUL_FS_GLOBAL_PATCH && !fs.__patched) { + module2.exports = patch(fs); + fs.__patched = true; + } + function patch(fs2) { + polyfills(fs2); + fs2.gracefulify = patch; + fs2.createReadStream = createReadStream; + fs2.createWriteStream = createWriteStream; + var fs$readFile = fs2.readFile; + fs2.readFile = readFile; + function readFile(path, options, cb) { + if (typeof options === "function") + cb = options, options = null; + return go$readFile(path, options, cb); + function go$readFile(path2, options2, cb2, startTime) { + return fs$readFile(path2, options2, function(err) { + if (err && (err.code === "EMFILE" || err.code === "ENFILE")) + enqueue([go$readFile, [path2, options2, cb2], err, startTime || Date.now(), Date.now()]); + else { + if (typeof cb2 === "function") + cb2.apply(this, arguments); + } + }); + } + } + var fs$writeFile = fs2.writeFile; + fs2.writeFile = writeFile; + function writeFile(path, data, options, cb) { + if (typeof options === "function") + cb = options, options = null; + return go$writeFile(path, data, options, cb); + function go$writeFile(path2, data2, options2, cb2, startTime) { + return fs$writeFile(path2, data2, options2, function(err) { + if (err && (err.code === "EMFILE" || err.code === "ENFILE")) + enqueue([go$writeFile, [path2, data2, options2, cb2], err, startTime || Date.now(), Date.now()]); + else { + if (typeof cb2 === "function") + cb2.apply(this, arguments); + } + }); + } + } + var fs$appendFile = fs2.appendFile; + if (fs$appendFile) + fs2.appendFile = appendFile; + function appendFile(path, data, options, cb) { + if (typeof options === "function") + cb = options, options = null; + return go$appendFile(path, data, options, cb); + function go$appendFile(path2, data2, options2, cb2, startTime) { + return fs$appendFile(path2, data2, options2, function(err) { + if (err && (err.code === "EMFILE" || err.code === "ENFILE")) + enqueue([go$appendFile, [path2, data2, options2, cb2], err, startTime || Date.now(), Date.now()]); + else { + if (typeof cb2 === "function") + cb2.apply(this, arguments); + } + }); + } + } + var fs$copyFile = fs2.copyFile; + if (fs$copyFile) + fs2.copyFile = copyFile; + function copyFile(src, dest, flags, cb) { + if (typeof flags === "function") { + cb = flags; + flags = 0; + } + return go$copyFile(src, dest, flags, cb); + function go$copyFile(src2, dest2, flags2, cb2, startTime) { + return fs$copyFile(src2, dest2, flags2, function(err) { + if (err && (err.code === "EMFILE" || err.code === "ENFILE")) + enqueue([go$copyFile, [src2, dest2, flags2, cb2], err, startTime || Date.now(), Date.now()]); + else { + if (typeof cb2 === "function") + cb2.apply(this, arguments); + } + }); + } + } + var fs$readdir = fs2.readdir; + fs2.readdir = readdir; + var noReaddirOptionVersions = /^v[0-5]\./; + function readdir(path, options, cb) { + if (typeof options === "function") + cb = options, options = null; + var go$readdir = noReaddirOptionVersions.test(process.version) ? function go$readdir(path2, options2, cb2, startTime) { + return fs$readdir(path2, fs$readdirCallback(path2, options2, cb2, startTime)); + } : function go$readdir(path2, options2, cb2, startTime) { + return fs$readdir(path2, options2, fs$readdirCallback(path2, options2, cb2, startTime)); + }; + return go$readdir(path, options, cb); + function fs$readdirCallback(path2, options2, cb2, startTime) { + return function(err, files) { + if (err && (err.code === "EMFILE" || err.code === "ENFILE")) + enqueue([ + go$readdir, + [path2, options2, cb2], + err, + startTime || Date.now(), + Date.now() + ]); + else { + if (files && files.sort) + files.sort(); + if (typeof cb2 === "function") + cb2.call(this, err, files); + } + }; + } + } + if (process.version.substr(0, 4) === "v0.8") { + var legStreams = legacy(fs2); + ReadStream = legStreams.ReadStream; + WriteStream = legStreams.WriteStream; + } + var fs$ReadStream = fs2.ReadStream; + if (fs$ReadStream) { + ReadStream.prototype = Object.create(fs$ReadStream.prototype); + ReadStream.prototype.open = ReadStream$open; + } + var fs$WriteStream = fs2.WriteStream; + if (fs$WriteStream) { + WriteStream.prototype = Object.create(fs$WriteStream.prototype); + WriteStream.prototype.open = WriteStream$open; + } + Object.defineProperty(fs2, "ReadStream", { + get: function() { + return ReadStream; + }, + set: function(val2) { + ReadStream = val2; + }, + enumerable: true, + configurable: true + }); + Object.defineProperty(fs2, "WriteStream", { + get: function() { + return WriteStream; + }, + set: function(val2) { + WriteStream = val2; + }, + enumerable: true, + configurable: true + }); + var FileReadStream = ReadStream; + Object.defineProperty(fs2, "FileReadStream", { + get: function() { + return FileReadStream; + }, + set: function(val2) { + FileReadStream = val2; + }, + enumerable: true, + configurable: true + }); + var FileWriteStream = WriteStream; + Object.defineProperty(fs2, "FileWriteStream", { + get: function() { + return FileWriteStream; + }, + set: function(val2) { + FileWriteStream = val2; + }, + enumerable: true, + configurable: true + }); + function ReadStream(path, options) { + if (this instanceof ReadStream) + return fs$ReadStream.apply(this, arguments), this; + else + return ReadStream.apply(Object.create(ReadStream.prototype), arguments); + } + function ReadStream$open() { + var that = this; + open(that.path, that.flags, that.mode, function(err, fd) { + if (err) { + if (that.autoClose) + that.destroy(); + that.emit("error", err); + } else { + that.fd = fd; + that.emit("open", fd); + that.read(); + } + }); + } + function WriteStream(path, options) { + if (this instanceof WriteStream) + return fs$WriteStream.apply(this, arguments), this; + else + return WriteStream.apply(Object.create(WriteStream.prototype), arguments); + } + function WriteStream$open() { + var that = this; + open(that.path, that.flags, that.mode, function(err, fd) { + if (err) { + that.destroy(); + that.emit("error", err); + } else { + that.fd = fd; + that.emit("open", fd); + } + }); + } + function createReadStream(path, options) { + return new fs2.ReadStream(path, options); + } + function createWriteStream(path, options) { + return new fs2.WriteStream(path, options); + } + var fs$open = fs2.open; + fs2.open = open; + function open(path, flags, mode, cb) { + if (typeof mode === "function") + cb = mode, mode = null; + return go$open(path, flags, mode, cb); + function go$open(path2, flags2, mode2, cb2, startTime) { + return fs$open(path2, flags2, mode2, function(err, fd) { + if (err && (err.code === "EMFILE" || err.code === "ENFILE")) + enqueue([go$open, [path2, flags2, mode2, cb2], err, startTime || Date.now(), Date.now()]); + else { + if (typeof cb2 === "function") + cb2.apply(this, arguments); + } + }); + } + } + return fs2; + } + function enqueue(elem) { + debug("ENQUEUE", elem[0].name, elem[1]); + fs[gracefulQueue].push(elem); + retry(); + } + var retryTimer; + function resetQueue() { + var now = Date.now(); + for (var i = 0;i < fs[gracefulQueue].length; ++i) { + if (fs[gracefulQueue][i].length > 2) { + fs[gracefulQueue][i][3] = now; + fs[gracefulQueue][i][4] = now; + } + } + retry(); + } + function retry() { + clearTimeout(retryTimer); + retryTimer = undefined; + if (fs[gracefulQueue].length === 0) + return; + var elem = fs[gracefulQueue].shift(); + var fn = elem[0]; + var args = elem[1]; + var err = elem[2]; + var startTime = elem[3]; + var lastTime = elem[4]; + if (startTime === undefined) { + debug("RETRY", fn.name, args); + fn.apply(null, args); + } else if (Date.now() - startTime >= 60000) { + debug("TIMEOUT", fn.name, args); + var cb = args.pop(); + if (typeof cb === "function") + cb.call(null, err); + } else { + var sinceAttempt = Date.now() - lastTime; + var sinceStart = Math.max(lastTime - startTime, 1); + var desiredDelay = Math.min(sinceStart * 1.2, 100); + if (sinceAttempt >= desiredDelay) { + debug("RETRY", fn.name, args); + fn.apply(null, args.concat([startTime])); + } else { + fs[gracefulQueue].push(elem); + } + } + if (retryTimer === undefined) { + retryTimer = setTimeout(retry, 0); + } + } +}); + +// node_modules/is-stream/index.js +var require_is_stream = __commonJS((exports2, module2) => { + var isStream = (stream) => stream !== null && typeof stream === "object" && typeof stream.pipe === "function"; + isStream.writable = (stream) => isStream(stream) && stream.writable !== false && typeof stream._write === "function" && typeof stream._writableState === "object"; + isStream.readable = (stream) => isStream(stream) && stream.readable !== false && typeof stream._read === "function" && typeof stream._readableState === "object"; + isStream.duplex = (stream) => isStream.writable(stream) && isStream.readable(stream); + isStream.transform = (stream) => isStream.duplex(stream) && typeof stream._transform === "function"; + module2.exports = isStream; +}); + +// node_modules/process-nextick-args/index.js +var require_process_nextick_args = __commonJS((exports2, module2) => { + if (typeof process === "undefined" || !process.version || process.version.indexOf("v0.") === 0 || process.version.indexOf("v1.") === 0 && process.version.indexOf("v1.8.") !== 0) { + module2.exports = { nextTick }; + } else { + module2.exports = process; + } + function nextTick(fn, arg1, arg2, arg3) { + if (typeof fn !== "function") { + throw new TypeError('"callback" argument must be a function'); + } + var len = arguments.length; + var args, i; + switch (len) { + case 0: + case 1: + return process.nextTick(fn); + case 2: + return process.nextTick(function afterTickOne() { + fn.call(null, arg1); + }); + case 3: + return process.nextTick(function afterTickTwo() { + fn.call(null, arg1, arg2); + }); + case 4: + return process.nextTick(function afterTickThree() { + fn.call(null, arg1, arg2, arg3); + }); + default: + args = new Array(len - 1); + i = 0; + while (i < args.length) { + args[i++] = arguments[i]; + } + return process.nextTick(function afterTick() { + fn.apply(null, args); + }); + } + } +}); + +// node_modules/isarray/index.js +var require_isarray = __commonJS((exports2, module2) => { + var toString = {}.toString; + module2.exports = Array.isArray || function(arr) { + return toString.call(arr) == "[object Array]"; + }; +}); + +// node_modules/lazystream/node_modules/readable-stream/lib/internal/streams/stream.js +var require_stream = __commonJS((exports2, module2) => { + module2.exports = require("stream"); +}); + +// node_modules/lazystream/node_modules/readable-stream/node_modules/safe-buffer/index.js +var require_safe_buffer = __commonJS((exports2, module2) => { + 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) { + module2.exports = buffer; + } else { + copyProps(buffer, exports2); + exports2.Buffer = SafeBuffer; + } + function SafeBuffer(arg, encodingOrOffset, length) { + return Buffer2(arg, encodingOrOffset, length); + } + 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 !== undefined) { + 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/core-util-is/lib/util.js +var require_util11 = __commonJS((exports2) => { + function isArray(arg) { + if (Array.isArray) { + return Array.isArray(arg); + } + return objectToString(arg) === "[object Array]"; + } + exports2.isArray = isArray; + function isBoolean(arg) { + return typeof arg === "boolean"; + } + exports2.isBoolean = isBoolean; + function isNull(arg) { + return arg === null; + } + exports2.isNull = isNull; + function isNullOrUndefined(arg) { + return arg == null; + } + exports2.isNullOrUndefined = isNullOrUndefined; + function isNumber(arg) { + return typeof arg === "number"; + } + exports2.isNumber = isNumber; + function isString(arg) { + return typeof arg === "string"; + } + exports2.isString = isString; + function isSymbol(arg) { + return typeof arg === "symbol"; + } + exports2.isSymbol = isSymbol; + function isUndefined(arg) { + return arg === undefined; + } + exports2.isUndefined = isUndefined; + function isRegExp(re) { + return objectToString(re) === "[object RegExp]"; + } + exports2.isRegExp = isRegExp; + function isObject(arg) { + return typeof arg === "object" && arg !== null; + } + exports2.isObject = isObject; + function isDate(d) { + return objectToString(d) === "[object Date]"; + } + exports2.isDate = isDate; + function isError(e) { + return objectToString(e) === "[object Error]" || e instanceof Error; + } + exports2.isError = isError; + function isFunction(arg) { + return typeof arg === "function"; + } + exports2.isFunction = isFunction; + function isPrimitive(arg) { + return arg === null || typeof arg === "boolean" || typeof arg === "number" || typeof arg === "string" || typeof arg === "symbol" || typeof arg === "undefined"; + } + exports2.isPrimitive = isPrimitive; + exports2.isBuffer = require("buffer").Buffer.isBuffer; + function objectToString(o) { + return Object.prototype.toString.call(o); + } +}); + +// node_modules/inherits/inherits_browser.js +var require_inherits_browser = __commonJS((exports2, module2) => { + if (typeof Object.create === "function") { + module2.exports = function inherits(ctor, superCtor) { + if (superCtor) { + ctor.super_ = superCtor; + ctor.prototype = Object.create(superCtor.prototype, { + constructor: { + value: ctor, + enumerable: false, + writable: true, + configurable: true + } + }); + } + }; + } else { + module2.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; + } + }; + } +}); + +// node_modules/inherits/inherits.js +var require_inherits = __commonJS((exports2, module2) => { + try { + util = require("util"); + if (typeof util.inherits !== "function") + throw ""; + module2.exports = util.inherits; + } catch (e) { + module2.exports = require_inherits_browser(); + } + var util; +}); + +// node_modules/lazystream/node_modules/readable-stream/lib/internal/streams/BufferList.js +var require_BufferList = __commonJS((exports2, module2) => { + function _classCallCheck(instance, Constructor) { + if (!(instance instanceof Constructor)) { + throw new TypeError("Cannot call a class as a function"); + } + } + var Buffer2 = require_safe_buffer().Buffer; + var util = require("util"); + function copyBuffer(src, target, offset) { + src.copy(target, offset); + } + module2.exports = function() { + function BufferList() { + _classCallCheck(this, BufferList); + this.head = null; + this.tail = null; + this.length = 0; + } + BufferList.prototype.push = function push(v) { + var entry = { data: v, next: null }; + if (this.length > 0) + this.tail.next = entry; + else + this.head = entry; + this.tail = entry; + ++this.length; + }; + BufferList.prototype.unshift = function unshift(v) { + var entry = { data: v, next: this.head }; + if (this.length === 0) + this.tail = entry; + this.head = entry; + ++this.length; + }; + BufferList.prototype.shift = function shift() { + if (this.length === 0) + return; + var ret = this.head.data; + if (this.length === 1) + this.head = this.tail = null; + else + this.head = this.head.next; + --this.length; + return ret; + }; + BufferList.prototype.clear = function clear() { + this.head = this.tail = null; + this.length = 0; + }; + BufferList.prototype.join = function join(s) { + if (this.length === 0) + return ""; + var p = this.head; + var ret = "" + p.data; + while (p = p.next) { + ret += s + p.data; + } + return ret; + }; + BufferList.prototype.concat = function concat(n) { + if (this.length === 0) + return Buffer2.alloc(0); + var ret = Buffer2.allocUnsafe(n >>> 0); + var p = this.head; + var i = 0; + while (p) { + copyBuffer(p.data, ret, i); + i += p.data.length; + p = p.next; + } + return ret; + }; + return BufferList; + }(); + if (util && util.inspect && util.inspect.custom) { + module2.exports.prototype[util.inspect.custom] = function() { + var obj = util.inspect({ length: this.length }); + return this.constructor.name + " " + obj; + }; + } +}); + +// node_modules/lazystream/node_modules/readable-stream/lib/internal/streams/destroy.js +var require_destroy = __commonJS((exports2, module2) => { + var pna = require_process_nextick_args(); + function destroy(err, cb) { + var _this = this; + var readableDestroyed = this._readableState && this._readableState.destroyed; + var writableDestroyed = this._writableState && this._writableState.destroyed; + if (readableDestroyed || writableDestroyed) { + if (cb) { + cb(err); + } else if (err) { + if (!this._writableState) { + pna.nextTick(emitErrorNT, this, err); + } else if (!this._writableState.errorEmitted) { + this._writableState.errorEmitted = true; + pna.nextTick(emitErrorNT, this, err); + } + } + return this; + } + if (this._readableState) { + this._readableState.destroyed = true; + } + if (this._writableState) { + this._writableState.destroyed = true; + } + this._destroy(err || null, function(err2) { + if (!cb && err2) { + if (!_this._writableState) { + pna.nextTick(emitErrorNT, _this, err2); + } else if (!_this._writableState.errorEmitted) { + _this._writableState.errorEmitted = true; + pna.nextTick(emitErrorNT, _this, err2); + } + } else if (cb) { + cb(err2); + } + }); + return this; + } + function undestroy() { + if (this._readableState) { + this._readableState.destroyed = false; + this._readableState.reading = false; + this._readableState.ended = false; + this._readableState.endEmitted = false; + } + if (this._writableState) { + this._writableState.destroyed = false; + this._writableState.ended = false; + this._writableState.ending = false; + this._writableState.finalCalled = false; + this._writableState.prefinished = false; + this._writableState.finished = false; + this._writableState.errorEmitted = false; + } + } + function emitErrorNT(self2, err) { + self2.emit("error", err); + } + module2.exports = { + destroy, + undestroy + }; +}); + +// node_modules/util-deprecate/node.js +var require_node2 = __commonJS((exports2, module2) => { + module2.exports = require("util").deprecate; +}); + +// node_modules/lazystream/node_modules/readable-stream/lib/_stream_writable.js +var require__stream_writable = __commonJS((exports2, module2) => { + var pna = require_process_nextick_args(); + module2.exports = Writable; + function CorkedRequest(state) { + var _this = this; + this.next = null; + this.entry = null; + this.finish = function() { + onCorkedFinish(_this, state); + }; + } + var asyncWrite = ["v0.10", "v0.9."].indexOf(process.version.slice(0, 5)) > -1 ? setImmediate : pna.nextTick; + var Duplex; + Writable.WritableState = WritableState; + var util = Object.create(require_util11()); + util.inherits = require_inherits(); + var internalUtil = { + deprecate: require_node2() + }; + var Stream = require_stream(); + var Buffer2 = require_safe_buffer().Buffer; + var OurUint8Array = (typeof global !== "undefined" ? global : typeof window !== "undefined" ? window : typeof self !== "undefined" ? self : {}).Uint8Array || function() { + }; + function _uint8ArrayToBuffer(chunk) { + return Buffer2.from(chunk); + } + function _isUint8Array(obj) { + return Buffer2.isBuffer(obj) || obj instanceof OurUint8Array; + } + var destroyImpl = require_destroy(); + util.inherits(Writable, Stream); + function nop() { + } + function WritableState(options, stream) { + Duplex = Duplex || require__stream_duplex(); + options = options || {}; + var isDuplex = stream instanceof Duplex; + this.objectMode = !!options.objectMode; + if (isDuplex) + this.objectMode = this.objectMode || !!options.writableObjectMode; + var hwm = options.highWaterMark; + var writableHwm = options.writableHighWaterMark; + var defaultHwm = this.objectMode ? 16 : 16 * 1024; + if (hwm || hwm === 0) + this.highWaterMark = hwm; + else if (isDuplex && (writableHwm || writableHwm === 0)) + this.highWaterMark = writableHwm; + else + this.highWaterMark = defaultHwm; + this.highWaterMark = Math.floor(this.highWaterMark); + this.finalCalled = false; + this.needDrain = false; + this.ending = false; + this.ended = false; + this.finished = false; + this.destroyed = false; + var noDecode = options.decodeStrings === false; + this.decodeStrings = !noDecode; + this.defaultEncoding = options.defaultEncoding || "utf8"; + this.length = 0; + this.writing = false; + this.corked = 0; + this.sync = true; + this.bufferProcessing = false; + this.onwrite = function(er) { + onwrite(stream, er); + }; + this.writecb = null; + this.writelen = 0; + this.bufferedRequest = null; + this.lastBufferedRequest = null; + this.pendingcb = 0; + this.prefinished = false; + this.errorEmitted = false; + this.bufferedRequestCount = 0; + this.corkedRequestsFree = new CorkedRequest(this); + } + WritableState.prototype.getBuffer = function getBuffer() { + var current = this.bufferedRequest; + var out = []; + while (current) { + out.push(current); + current = current.next; + } + return out; + }; + (function() { + try { + Object.defineProperty(WritableState.prototype, "buffer", { + get: internalUtil.deprecate(function() { + return this.getBuffer(); + }, "_writableState.buffer is deprecated. Use _writableState.getBuffer " + "instead.", "DEP0003") + }); + } catch (_2) { + } + })(); + var realHasInstance; + if (typeof Symbol === "function" && Symbol.hasInstance && typeof Function.prototype[Symbol.hasInstance] === "function") { + realHasInstance = Function.prototype[Symbol.hasInstance]; + Object.defineProperty(Writable, Symbol.hasInstance, { + value: function(object) { + if (realHasInstance.call(this, object)) + return true; + if (this !== Writable) + return false; + return object && object._writableState instanceof WritableState; + } + }); + } else { + realHasInstance = function(object) { + return object instanceof this; + }; + } + function Writable(options) { + Duplex = Duplex || require__stream_duplex(); + if (!realHasInstance.call(Writable, this) && !(this instanceof Duplex)) { + return new Writable(options); + } + this._writableState = new WritableState(options, this); + this.writable = true; + 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; + } + Stream.call(this); + } + Writable.prototype.pipe = function() { + this.emit("error", new Error("Cannot pipe, not readable")); + }; + function writeAfterEnd(stream, cb) { + var er = new Error("write after end"); + stream.emit("error", er); + pna.nextTick(cb, er); + } + function validChunk(stream, state, chunk, cb) { + var valid = true; + var er = false; + if (chunk === null) { + er = new TypeError("May not write null values to stream"); + } else if (typeof chunk !== "string" && chunk !== undefined && !state.objectMode) { + er = new TypeError("Invalid non-string/buffer chunk"); + } + if (er) { + stream.emit("error", er); + pna.nextTick(cb, er); + valid = false; + } + return valid; + } + Writable.prototype.write = function(chunk, encoding, cb) { + var state = this._writableState; + var ret = false; + var isBuf = !state.objectMode && _isUint8Array(chunk); + if (isBuf && !Buffer2.isBuffer(chunk)) { + chunk = _uint8ArrayToBuffer(chunk); + } + if (typeof encoding === "function") { + cb = encoding; + encoding = null; + } + if (isBuf) + encoding = "buffer"; + else if (!encoding) + encoding = state.defaultEncoding; + if (typeof cb !== "function") + cb = nop; + if (state.ended) + writeAfterEnd(this, cb); + else if (isBuf || validChunk(this, state, chunk, cb)) { + state.pendingcb++; + ret = writeOrBuffer(this, state, isBuf, chunk, encoding, cb); + } + return ret; + }; + Writable.prototype.cork = function() { + var state = this._writableState; + state.corked++; + }; + Writable.prototype.uncork = function() { + var state = this._writableState; + if (state.corked) { + state.corked--; + if (!state.writing && !state.corked && !state.bufferProcessing && state.bufferedRequest) + clearBuffer(this, state); + } + }; + Writable.prototype.setDefaultEncoding = function setDefaultEncoding(encoding) { + if (typeof encoding === "string") + encoding = encoding.toLowerCase(); + if (!(["hex", "utf8", "utf-8", "ascii", "binary", "base64", "ucs2", "ucs-2", "utf16le", "utf-16le", "raw"].indexOf((encoding + "").toLowerCase()) > -1)) + throw new TypeError("Unknown encoding: " + encoding); + this._writableState.defaultEncoding = encoding; + return this; + }; + function decodeChunk(state, chunk, encoding) { + if (!state.objectMode && state.decodeStrings !== false && typeof chunk === "string") { + chunk = Buffer2.from(chunk, encoding); + } + return chunk; + } + Object.defineProperty(Writable.prototype, "writableHighWaterMark", { + enumerable: false, + get: function() { + return this._writableState.highWaterMark; + } + }); + function writeOrBuffer(stream, state, isBuf, chunk, encoding, cb) { + if (!isBuf) { + var newChunk = decodeChunk(state, chunk, encoding); + if (chunk !== newChunk) { + isBuf = true; + encoding = "buffer"; + chunk = newChunk; + } + } + var len = state.objectMode ? 1 : chunk.length; + state.length += len; + var ret = state.length < state.highWaterMark; + if (!ret) + state.needDrain = true; + if (state.writing || state.corked) { + var last = state.lastBufferedRequest; + state.lastBufferedRequest = { + chunk, + encoding, + isBuf, + callback: cb, + next: null + }; + if (last) { + last.next = state.lastBufferedRequest; + } else { + state.bufferedRequest = state.lastBufferedRequest; + } + state.bufferedRequestCount += 1; + } else { + doWrite(stream, state, false, len, chunk, encoding, cb); + } + return ret; + } + function doWrite(stream, state, writev, len, chunk, encoding, cb) { + state.writelen = len; + state.writecb = cb; + state.writing = true; + state.sync = true; + if (writev) + stream._writev(chunk, state.onwrite); + else + stream._write(chunk, encoding, state.onwrite); + state.sync = false; + } + function onwriteError(stream, state, sync, er, cb) { + --state.pendingcb; + if (sync) { + pna.nextTick(cb, er); + pna.nextTick(finishMaybe, stream, state); + stream._writableState.errorEmitted = true; + stream.emit("error", er); + } else { + cb(er); + stream._writableState.errorEmitted = true; + stream.emit("error", er); + finishMaybe(stream, state); + } + } + function onwriteStateUpdate(state) { + state.writing = false; + state.writecb = null; + state.length -= state.writelen; + state.writelen = 0; + } + function onwrite(stream, er) { + var state = stream._writableState; + var sync = state.sync; + var cb = state.writecb; + onwriteStateUpdate(state); + if (er) + onwriteError(stream, state, sync, er, cb); + else { + var finished = needFinish(state); + if (!finished && !state.corked && !state.bufferProcessing && state.bufferedRequest) { + clearBuffer(stream, state); + } + if (sync) { + asyncWrite(afterWrite, stream, state, finished, cb); + } else { + afterWrite(stream, state, finished, cb); + } + } + } + function afterWrite(stream, state, finished, cb) { + if (!finished) + onwriteDrain(stream, state); + state.pendingcb--; + cb(); + finishMaybe(stream, state); + } + function onwriteDrain(stream, state) { + if (state.length === 0 && state.needDrain) { + state.needDrain = false; + stream.emit("drain"); + } + } + function clearBuffer(stream, state) { + state.bufferProcessing = true; + var entry = state.bufferedRequest; + if (stream._writev && entry && entry.next) { + var l = state.bufferedRequestCount; + var buffer = new Array(l); + var holder = state.corkedRequestsFree; + holder.entry = entry; + var count = 0; + var allBuffers = true; + while (entry) { + buffer[count] = entry; + if (!entry.isBuf) + allBuffers = false; + entry = entry.next; + count += 1; + } + buffer.allBuffers = allBuffers; + doWrite(stream, state, true, state.length, buffer, "", holder.finish); + state.pendingcb++; + state.lastBufferedRequest = null; + if (holder.next) { + state.corkedRequestsFree = holder.next; + holder.next = null; + } else { + state.corkedRequestsFree = new CorkedRequest(state); + } + state.bufferedRequestCount = 0; + } else { + while (entry) { + var chunk = entry.chunk; + var encoding = entry.encoding; + var cb = entry.callback; + var len = state.objectMode ? 1 : chunk.length; + doWrite(stream, state, false, len, chunk, encoding, cb); + entry = entry.next; + state.bufferedRequestCount--; + if (state.writing) { + break; + } + } + if (entry === null) + state.lastBufferedRequest = null; + } + state.bufferedRequest = entry; + state.bufferProcessing = false; + } + Writable.prototype._write = function(chunk, encoding, cb) { + cb(new Error("_write() is not implemented")); + }; + Writable.prototype._writev = null; + Writable.prototype.end = function(chunk, encoding, cb) { + var state = this._writableState; + if (typeof chunk === "function") { + cb = chunk; + chunk = null; + encoding = null; + } else if (typeof encoding === "function") { + cb = encoding; + encoding = null; + } + if (chunk !== null && chunk !== undefined) + this.write(chunk, encoding); + if (state.corked) { + state.corked = 1; + this.uncork(); + } + if (!state.ending) + endWritable(this, state, cb); + }; + function needFinish(state) { + return state.ending && state.length === 0 && state.bufferedRequest === null && !state.finished && !state.writing; + } + function callFinal(stream, state) { + stream._final(function(err) { + state.pendingcb--; + if (err) { + stream.emit("error", err); + } + state.prefinished = true; + stream.emit("prefinish"); + finishMaybe(stream, state); + }); + } + function prefinish(stream, state) { + if (!state.prefinished && !state.finalCalled) { + if (typeof stream._final === "function") { + state.pendingcb++; + state.finalCalled = true; + pna.nextTick(callFinal, stream, state); + } else { + state.prefinished = true; + stream.emit("prefinish"); + } + } + } + function finishMaybe(stream, state) { + var need = needFinish(state); + if (need) { + prefinish(stream, state); + if (state.pendingcb === 0) { + state.finished = true; + stream.emit("finish"); + } + } + return need; + } + function endWritable(stream, state, cb) { + state.ending = true; + finishMaybe(stream, state); + if (cb) { + if (state.finished) + pna.nextTick(cb); + else + stream.once("finish", cb); + } + state.ended = true; + stream.writable = false; + } + function onCorkedFinish(corkReq, state, err) { + var entry = corkReq.entry; + corkReq.entry = null; + while (entry) { + var cb = entry.callback; + state.pendingcb--; + cb(err); + entry = entry.next; + } + state.corkedRequestsFree.next = corkReq; + } + Object.defineProperty(Writable.prototype, "destroyed", { + get: function() { + if (this._writableState === undefined) { + return false; + } + return this._writableState.destroyed; + }, + set: function(value) { + if (!this._writableState) { + return; + } + this._writableState.destroyed = value; + } + }); + Writable.prototype.destroy = destroyImpl.destroy; + Writable.prototype._undestroy = destroyImpl.undestroy; + Writable.prototype._destroy = function(err, cb) { + this.end(); + cb(err); + }; +}); + +// node_modules/lazystream/node_modules/readable-stream/lib/_stream_duplex.js +var require__stream_duplex = __commonJS((exports2, module2) => { + var pna = require_process_nextick_args(); + var objectKeys = Object.keys || function(obj) { + var keys2 = []; + for (var key in obj) { + keys2.push(key); + } + return keys2; + }; + module2.exports = Duplex; + var util = Object.create(require_util11()); + util.inherits = require_inherits(); + var Readable = require__stream_readable(); + var Writable = require__stream_writable(); + util.inherits(Duplex, Readable); + { + keys = objectKeys(Writable.prototype); + for (v = 0;v < keys.length; v++) { + method = keys[v]; + if (!Duplex.prototype[method]) + Duplex.prototype[method] = Writable.prototype[method]; + } + } + var keys; + var method; + var v; + function Duplex(options) { + if (!(this instanceof Duplex)) + return new Duplex(options); + Readable.call(this, options); + Writable.call(this, options); + if (options && options.readable === false) + this.readable = false; + if (options && options.writable === false) + this.writable = false; + this.allowHalfOpen = true; + if (options && options.allowHalfOpen === false) + this.allowHalfOpen = false; + this.once("end", onend); + } + Object.defineProperty(Duplex.prototype, "writableHighWaterMark", { + enumerable: false, + get: function() { + return this._writableState.highWaterMark; + } + }); + function onend() { + if (this.allowHalfOpen || this._writableState.ended) + return; + pna.nextTick(onEndNT, this); + } + function onEndNT(self2) { + self2.end(); + } + Object.defineProperty(Duplex.prototype, "destroyed", { + get: function() { + if (this._readableState === undefined || this._writableState === undefined) { + return false; + } + return this._readableState.destroyed && this._writableState.destroyed; + }, + set: function(value) { + if (this._readableState === undefined || this._writableState === undefined) { + return; + } + this._readableState.destroyed = value; + this._writableState.destroyed = value; + } + }); + Duplex.prototype._destroy = function(err, cb) { + this.push(null); + this.end(); + pna.nextTick(cb, err); + }; +}); + +// node_modules/lazystream/node_modules/readable-stream/node_modules/string_decoder/lib/string_decoder.js +var require_string_decoder = __commonJS((exports2) => { + 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; + } + exports2.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 === undefined) + 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 !== undefined) + 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/lazystream/node_modules/readable-stream/lib/_stream_readable.js +var require__stream_readable = __commonJS((exports2, module2) => { + var pna = require_process_nextick_args(); + module2.exports = Readable; + var isArray = require_isarray(); + var Duplex; + Readable.ReadableState = ReadableState; + var EE = require("events").EventEmitter; + var EElistenerCount = function(emitter, type) { + return emitter.listeners(type).length; + }; + var Stream = require_stream(); + var Buffer2 = require_safe_buffer().Buffer; + var OurUint8Array = (typeof global !== "undefined" ? global : typeof window !== "undefined" ? window : typeof self !== "undefined" ? self : {}).Uint8Array || function() { + }; + function _uint8ArrayToBuffer(chunk) { + return Buffer2.from(chunk); + } + function _isUint8Array(obj) { + return Buffer2.isBuffer(obj) || obj instanceof OurUint8Array; + } + var util = Object.create(require_util11()); + util.inherits = require_inherits(); + var debugUtil = require("util"); + var debug = undefined; + if (debugUtil && debugUtil.debuglog) { + debug = debugUtil.debuglog("stream"); + } else { + debug = function() { + }; + } + var BufferList = require_BufferList(); + var destroyImpl = require_destroy(); + var StringDecoder; + util.inherits(Readable, Stream); + var kProxyEvents = ["error", "close", "destroy", "pause", "resume"]; + 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 (isArray(emitter._events[event])) + emitter._events[event].unshift(fn); + else + emitter._events[event] = [fn, emitter._events[event]]; + } + function ReadableState(options, stream) { + Duplex = Duplex || require__stream_duplex(); + options = options || {}; + var isDuplex = stream instanceof Duplex; + this.objectMode = !!options.objectMode; + if (isDuplex) + this.objectMode = this.objectMode || !!options.readableObjectMode; + var hwm = options.highWaterMark; + var readableHwm = options.readableHighWaterMark; + var defaultHwm = this.objectMode ? 16 : 16 * 1024; + if (hwm || hwm === 0) + this.highWaterMark = hwm; + else if (isDuplex && (readableHwm || readableHwm === 0)) + this.highWaterMark = readableHwm; + else + this.highWaterMark = defaultHwm; + this.highWaterMark = Math.floor(this.highWaterMark); + this.buffer = new BufferList; + this.length = 0; + this.pipes = null; + this.pipesCount = 0; + this.flowing = null; + this.ended = false; + this.endEmitted = false; + this.reading = false; + this.sync = true; + this.needReadable = false; + this.emittedReadable = false; + this.readableListening = false; + this.resumeScheduled = false; + this.destroyed = false; + this.defaultEncoding = options.defaultEncoding || "utf8"; + this.awaitDrain = 0; + this.readingMore = false; + this.decoder = null; + this.encoding = null; + if (options.encoding) { + if (!StringDecoder) + StringDecoder = require_string_decoder().StringDecoder; + this.decoder = new StringDecoder(options.encoding); + this.encoding = options.encoding; + } + } + function Readable(options) { + Duplex = Duplex || require__stream_duplex(); + if (!(this instanceof Readable)) + return new Readable(options); + this._readableState = new ReadableState(options, this); + this.readable = true; + if (options) { + if (typeof options.read === "function") + this._read = options.read; + if (typeof options.destroy === "function") + this._destroy = options.destroy; + } + Stream.call(this); + } + Object.defineProperty(Readable.prototype, "destroyed", { + get: function() { + if (this._readableState === undefined) { + return false; + } + return this._readableState.destroyed; + }, + set: function(value) { + if (!this._readableState) { + return; + } + this._readableState.destroyed = value; + } + }); + Readable.prototype.destroy = destroyImpl.destroy; + Readable.prototype._undestroy = destroyImpl.undestroy; + Readable.prototype._destroy = function(err, cb) { + this.push(null); + cb(err); + }; + Readable.prototype.push = function(chunk, encoding) { + var state = this._readableState; + var skipChunkCheck; + if (!state.objectMode) { + if (typeof chunk === "string") { + encoding = encoding || state.defaultEncoding; + if (encoding !== state.encoding) { + chunk = Buffer2.from(chunk, encoding); + encoding = ""; + } + skipChunkCheck = true; + } + } else { + skipChunkCheck = true; + } + return readableAddChunk(this, chunk, encoding, false, skipChunkCheck); + }; + Readable.prototype.unshift = function(chunk) { + return readableAddChunk(this, chunk, null, true, false); + }; + function readableAddChunk(stream, chunk, encoding, addToFront, skipChunkCheck) { + var state = stream._readableState; + if (chunk === null) { + state.reading = false; + onEofChunk(stream, state); + } else { + var er; + if (!skipChunkCheck) + er = chunkInvalid(state, chunk); + if (er) { + stream.emit("error", er); + } else if (state.objectMode || chunk && chunk.length > 0) { + if (typeof chunk !== "string" && !state.objectMode && Object.getPrototypeOf(chunk) !== Buffer2.prototype) { + chunk = _uint8ArrayToBuffer(chunk); + } + if (addToFront) { + if (state.endEmitted) + stream.emit("error", new Error("stream.unshift() after end event")); + else + addChunk(stream, state, chunk, true); + } else if (state.ended) { + stream.emit("error", new Error("stream.push() after EOF")); + } 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); + } + } + } else if (!addToFront) { + state.reading = false; + } + } + return needMoreData(state); + } + function addChunk(stream, state, chunk, addToFront) { + if (state.flowing && state.length === 0 && !state.sync) { + stream.emit("data", chunk); + stream.read(0); + } 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); + } + function chunkInvalid(state, chunk) { + var er; + if (!_isUint8Array(chunk) && typeof chunk !== "string" && chunk !== undefined && !state.objectMode) { + er = new TypeError("Invalid non-string/buffer chunk"); + } + return er; + } + function needMoreData(state) { + return !state.ended && (state.needReadable || state.length < state.highWaterMark || state.length === 0); + } + Readable.prototype.isPaused = function() { + return this._readableState.flowing === false; + }; + Readable.prototype.setEncoding = function(enc) { + if (!StringDecoder) + StringDecoder = require_string_decoder().StringDecoder; + this._readableState.decoder = new StringDecoder(enc); + this._readableState.encoding = enc; + return this; + }; + var MAX_HWM = 8388608; + function computeNewHighWaterMark(n) { + if (n >= MAX_HWM) { + n = MAX_HWM; + } 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 (n !== n) { + if (state.flowing && state.length) + return state.buffer.head.data.length; + else + return state.length; + } + if (n > state.highWaterMark) + state.highWaterMark = computeNewHighWaterMark(n); + if (n <= state.length) + return n; + if (!state.ended) { + state.needReadable = true; + return 0; + } + return state.length; + } + Readable.prototype.read = function(n) { + debug("read", n); + n = parseInt(n, 10); + var state = this._readableState; + var nOrig = n; + if (n !== 0) + state.emittedReadable = false; + if (n === 0 && state.needReadable && (state.length >= state.highWaterMark || 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; + } + var 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) { + doRead = false; + debug("reading or ended", doRead); + } else if (doRead) { + debug("do read"); + state.reading = true; + state.sync = true; + if (state.length === 0) + state.needReadable = true; + this._read(state.highWaterMark); + state.sync = false; + if (!state.reading) + n = howMuchToRead(nOrig, state); + } + var ret; + if (n > 0) + ret = fromList(n, state); + else + ret = null; + if (ret === null) { + state.needReadable = true; + n = 0; + } else { + state.length -= n; + } + if (state.length === 0) { + if (!state.ended) + state.needReadable = true; + if (nOrig !== n && state.ended) + endReadable(this); + } + if (ret !== null) + this.emit("data", ret); + return ret; + }; + function onEofChunk(stream, state) { + if (state.ended) + return; + if (state.decoder) { + var chunk = state.decoder.end(); + if (chunk && chunk.length) { + state.buffer.push(chunk); + state.length += state.objectMode ? 1 : chunk.length; + } + } + state.ended = true; + emitReadable(stream); + } + function emitReadable(stream) { + var state = stream._readableState; + state.needReadable = false; + if (!state.emittedReadable) { + debug("emitReadable", state.flowing); + state.emittedReadable = true; + if (state.sync) + pna.nextTick(emitReadable_, stream); + else + emitReadable_(stream); + } + } + function emitReadable_(stream) { + debug("emit readable"); + stream.emit("readable"); + flow(stream); + } + function maybeReadMore(stream, state) { + if (!state.readingMore) { + state.readingMore = true; + pna.nextTick(maybeReadMore_, stream, state); + } + } + function maybeReadMore_(stream, state) { + var len = state.length; + while (!state.reading && !state.flowing && !state.ended && state.length < state.highWaterMark) { + debug("maybeReadMore read 0"); + stream.read(0); + if (len === state.length) + break; + else + len = state.length; + } + state.readingMore = false; + } + Readable.prototype._read = function(n) { + this.emit("error", new Error("_read() is not implemented")); + }; + Readable.prototype.pipe = function(dest, pipeOpts) { + var src = this; + var state = this._readableState; + switch (state.pipesCount) { + case 0: + state.pipes = dest; + break; + case 1: + state.pipes = [state.pipes, dest]; + break; + default: + state.pipes.push(dest); + break; + } + state.pipesCount += 1; + debug("pipe count=%d opts=%j", state.pipesCount, pipeOpts); + var doEnd = (!pipeOpts || pipeOpts.end !== false) && dest !== process.stdout && dest !== process.stderr; + var endFn = doEnd ? onend : unpipe; + if (state.endEmitted) + pna.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(); + } + var ondrain = pipeOnDrain(src); + dest.on("drain", ondrain); + var cleanedUp = false; + function cleanup() { + debug("cleanup"); + dest.removeListener("close", onclose); + dest.removeListener("finish", onfinish); + 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 (state.awaitDrain && (!dest._writableState || dest._writableState.needDrain)) + ondrain(); + } + var increasedAwaitDrain = false; + src.on("data", ondata); + function ondata(chunk) { + debug("ondata"); + increasedAwaitDrain = false; + var ret = dest.write(chunk); + if (ret === false && !increasedAwaitDrain) { + if ((state.pipesCount === 1 && state.pipes === dest || state.pipesCount > 1 && indexOf(state.pipes, dest) !== -1) && !cleanedUp) { + debug("false write response, pause", state.awaitDrain); + state.awaitDrain++; + increasedAwaitDrain = true; + } + src.pause(); + } + } + function onerror(er) { + debug("onerror", er); + unpipe(); + dest.removeListener("error", onerror); + if (EElistenerCount(dest, "error") === 0) + 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 (!state.flowing) { + debug("pipe resume"); + src.resume(); + } + return dest; + }; + function pipeOnDrain(src) { + return function() { + var state = src._readableState; + debug("pipeOnDrain", state.awaitDrain); + if (state.awaitDrain) + state.awaitDrain--; + if (state.awaitDrain === 0 && EElistenerCount(src, "data")) { + state.flowing = true; + flow(src); + } + }; + } + Readable.prototype.unpipe = function(dest) { + var state = this._readableState; + var unpipeInfo = { hasUnpiped: false }; + if (state.pipesCount === 0) + return this; + if (state.pipesCount === 1) { + if (dest && dest !== state.pipes) + return this; + if (!dest) + dest = state.pipes; + state.pipes = null; + state.pipesCount = 0; + state.flowing = false; + if (dest) + dest.emit("unpipe", this, unpipeInfo); + return this; + } + if (!dest) { + var dests = state.pipes; + var len = state.pipesCount; + state.pipes = null; + state.pipesCount = 0; + state.flowing = false; + for (var i = 0;i < len; i++) { + dests[i].emit("unpipe", this, { hasUnpiped: false }); + } + return this; + } + var index = indexOf(state.pipes, dest); + if (index === -1) + return this; + state.pipes.splice(index, 1); + state.pipesCount -= 1; + if (state.pipesCount === 1) + state.pipes = state.pipes[0]; + dest.emit("unpipe", this, unpipeInfo); + return this; + }; + Readable.prototype.on = function(ev, fn) { + var res = Stream.prototype.on.call(this, ev, fn); + if (ev === "data") { + if (this._readableState.flowing !== false) + this.resume(); + } else if (ev === "readable") { + var state = this._readableState; + if (!state.endEmitted && !state.readableListening) { + state.readableListening = state.needReadable = true; + state.emittedReadable = false; + if (!state.reading) { + pna.nextTick(nReadingNextTick, this); + } else if (state.length) { + emitReadable(this); + } + } + } + return res; + }; + Readable.prototype.addListener = Readable.prototype.on; + function nReadingNextTick(self2) { + debug("readable nexttick read 0"); + self2.read(0); + } + Readable.prototype.resume = function() { + var state = this._readableState; + if (!state.flowing) { + debug("resume"); + state.flowing = true; + resume(this, state); + } + return this; + }; + function resume(stream, state) { + if (!state.resumeScheduled) { + state.resumeScheduled = true; + pna.nextTick(resume_, stream, state); + } + } + function resume_(stream, state) { + if (!state.reading) { + debug("resume read 0"); + stream.read(0); + } + state.resumeScheduled = false; + state.awaitDrain = 0; + 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"); + } + return this; + }; + function flow(stream) { + var state = stream._readableState; + debug("flow", state.flowing); + while (state.flowing && stream.read() !== null) { + } + } + Readable.prototype.wrap = function(stream) { + var _this = this; + var state = this._readableState; + var paused = false; + stream.on("end", function() { + debug("wrapped end"); + if (state.decoder && !state.ended) { + var chunk = state.decoder.end(); + if (chunk && chunk.length) + _this.push(chunk); + } + _this.push(null); + }); + stream.on("data", function(chunk) { + debug("wrapped data"); + if (state.decoder) + chunk = state.decoder.write(chunk); + if (state.objectMode && (chunk === null || chunk === undefined)) + return; + else if (!state.objectMode && (!chunk || !chunk.length)) + return; + var ret = _this.push(chunk); + if (!ret) { + paused = true; + stream.pause(); + } + }); + for (var i in stream) { + if (this[i] === undefined && typeof stream[i] === "function") { + this[i] = function(method) { + return function() { + return stream[method].apply(stream, arguments); + }; + }(i); + } + } + for (var n = 0;n < kProxyEvents.length; n++) { + stream.on(kProxyEvents[n], this.emit.bind(this, kProxyEvents[n])); + } + this._read = function(n2) { + debug("wrapped _read", n2); + if (paused) { + paused = false; + stream.resume(); + } + }; + return this; + }; + Object.defineProperty(Readable.prototype, "readableHighWaterMark", { + enumerable: false, + get: function() { + return this._readableState.highWaterMark; + } + }); + Readable._fromList = fromList; + function fromList(n, state) { + if (state.length === 0) + return null; + var 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.head.data; + else + ret = state.buffer.concat(state.length); + state.buffer.clear(); + } else { + ret = fromListPartial(n, state.buffer, state.decoder); + } + return ret; + } + function fromListPartial(n, list, hasStrings) { + var ret; + if (n < list.head.data.length) { + ret = list.head.data.slice(0, n); + list.head.data = list.head.data.slice(n); + } else if (n === list.head.data.length) { + ret = list.shift(); + } else { + ret = hasStrings ? copyFromBufferString(n, list) : copyFromBuffer(n, list); + } + return ret; + } + function copyFromBufferString(n, list) { + var p = list.head; + var c = 1; + var ret = p.data; + n -= ret.length; + while (p = p.next) { + var str = p.data; + var nb = n > str.length ? str.length : n; + if (nb === str.length) + ret += str; + else + ret += str.slice(0, n); + n -= nb; + if (n === 0) { + if (nb === str.length) { + ++c; + if (p.next) + list.head = p.next; + else + list.head = list.tail = null; + } else { + list.head = p; + p.data = str.slice(nb); + } + break; + } + ++c; + } + list.length -= c; + return ret; + } + function copyFromBuffer(n, list) { + var ret = Buffer2.allocUnsafe(n); + var p = list.head; + var c = 1; + p.data.copy(ret); + n -= p.data.length; + while (p = p.next) { + var buf = p.data; + var nb = n > buf.length ? buf.length : n; + buf.copy(ret, ret.length - n, 0, nb); + n -= nb; + if (n === 0) { + if (nb === buf.length) { + ++c; + if (p.next) + list.head = p.next; + else + list.head = list.tail = null; + } else { + list.head = p; + p.data = buf.slice(nb); + } + break; + } + ++c; + } + list.length -= c; + return ret; + } + function endReadable(stream) { + var state = stream._readableState; + if (state.length > 0) + throw new Error('"endReadable()" called on non-empty stream'); + if (!state.endEmitted) { + state.ended = true; + pna.nextTick(endReadableNT, state, stream); + } + } + function endReadableNT(state, stream) { + if (!state.endEmitted && state.length === 0) { + state.endEmitted = true; + stream.readable = false; + stream.emit("end"); + } + } + function indexOf(xs, x) { + for (var i = 0, l = xs.length;i < l; i++) { + if (xs[i] === x) + return i; + } + return -1; + } +}); + +// node_modules/lazystream/node_modules/readable-stream/lib/_stream_transform.js +var require__stream_transform = __commonJS((exports2, module2) => { + module2.exports = Transform; + var Duplex = require__stream_duplex(); + var util = Object.create(require_util11()); + util.inherits = require_inherits(); + util.inherits(Transform, Duplex); + function afterTransform(er, data) { + var ts = this._transformState; + ts.transforming = false; + var cb = ts.writecb; + if (!cb) { + return this.emit("error", new Error("write callback called multiple times")); + } + ts.writechunk = null; + ts.writecb = null; + if (data != null) + this.push(data); + cb(er); + var rs = this._readableState; + rs.reading = false; + if (rs.needReadable || rs.length < rs.highWaterMark) { + this._read(rs.highWaterMark); + } + } + function Transform(options) { + if (!(this instanceof Transform)) + return new Transform(options); + Duplex.call(this, options); + this._transformState = { + afterTransform: afterTransform.bind(this), + needTransform: false, + transforming: false, + writecb: null, + writechunk: null, + writeencoding: null + }; + this._readableState.needReadable = true; + this._readableState.sync = false; + 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 prefinish() { + var _this = this; + if (typeof this._flush === "function") { + this._flush(function(er, data) { + done(_this, er, data); + }); + } else { + done(this, null, null); + } + } + Transform.prototype.push = function(chunk, encoding) { + this._transformState.needTransform = false; + return Duplex.prototype.push.call(this, chunk, encoding); + }; + Transform.prototype._transform = function(chunk, encoding, cb) { + throw new Error("_transform() is not implemented"); + }; + Transform.prototype._write = function(chunk, encoding, cb) { + var ts = this._transformState; + ts.writecb = cb; + ts.writechunk = chunk; + ts.writeencoding = encoding; + if (!ts.transforming) { + var rs = this._readableState; + if (ts.needTransform || rs.needReadable || rs.length < rs.highWaterMark) + this._read(rs.highWaterMark); + } + }; + Transform.prototype._read = function(n) { + var ts = this._transformState; + if (ts.writechunk !== null && ts.writecb && !ts.transforming) { + ts.transforming = true; + this._transform(ts.writechunk, ts.writeencoding, ts.afterTransform); + } else { + ts.needTransform = true; + } + }; + Transform.prototype._destroy = function(err, cb) { + var _this2 = this; + Duplex.prototype._destroy.call(this, err, function(err2) { + cb(err2); + _this2.emit("close"); + }); + }; + function done(stream, er, data) { + if (er) + return stream.emit("error", er); + if (data != null) + stream.push(data); + if (stream._writableState.length) + throw new Error("Calling transform done when ws.length != 0"); + if (stream._transformState.transforming) + throw new Error("Calling transform done when still transforming"); + return stream.push(null); + } +}); + +// node_modules/lazystream/node_modules/readable-stream/lib/_stream_passthrough.js +var require__stream_passthrough = __commonJS((exports2, module2) => { + module2.exports = PassThrough; + var Transform = require__stream_transform(); + var util = Object.create(require_util11()); + util.inherits = require_inherits(); + util.inherits(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/lazystream/node_modules/readable-stream/readable.js +var require_readable2 = __commonJS((exports2, module2) => { + var Stream = require("stream"); + if (process.env.READABLE_STREAM === "disable" && Stream) { + module2.exports = Stream; + exports2 = module2.exports = Stream.Readable; + exports2.Readable = Stream.Readable; + exports2.Writable = Stream.Writable; + exports2.Duplex = Stream.Duplex; + exports2.Transform = Stream.Transform; + exports2.PassThrough = Stream.PassThrough; + exports2.Stream = Stream; + } else { + exports2 = module2.exports = require__stream_readable(); + exports2.Stream = Stream || exports2; + exports2.Readable = exports2; + exports2.Writable = require__stream_writable(); + exports2.Duplex = require__stream_duplex(); + exports2.Transform = require__stream_transform(); + exports2.PassThrough = require__stream_passthrough(); + } +}); + +// node_modules/lazystream/node_modules/readable-stream/passthrough.js +var require_passthrough = __commonJS((exports2, module2) => { + module2.exports = require_readable2().PassThrough; +}); + +// node_modules/lazystream/lib/lazystream.js +var require_lazystream = __commonJS((exports2, module2) => { + var util = require("util"); + var PassThrough = require_passthrough(); + module2.exports = { + Readable, + Writable + }; + util.inherits(Readable, PassThrough); + util.inherits(Writable, PassThrough); + function beforeFirstCall(instance, method, callback) { + instance[method] = function() { + delete instance[method]; + callback.apply(this, arguments); + return this[method].apply(this, arguments); + }; + } + function Readable(fn, options) { + if (!(this instanceof Readable)) + return new Readable(fn, options); + PassThrough.call(this, options); + beforeFirstCall(this, "_read", function() { + var source = fn.call(this, options); + var emit = this.emit.bind(this, "error"); + source.on("error", emit); + source.pipe(this); + }); + this.emit("readable"); + } + function Writable(fn, options) { + if (!(this instanceof Writable)) + return new Writable(fn, options); + PassThrough.call(this, options); + beforeFirstCall(this, "_write", function() { + var destination = fn.call(this, options); + var emit = this.emit.bind(this, "error"); + destination.on("error", emit); + this.pipe(destination); + }); + this.emit("writable"); + } +}); + +// node_modules/normalize-path/index.js +var require_normalize_path = __commonJS((exports2, module2) => { + /*! + * normalize-path + * + * Copyright (c) 2014-2018, Jon Schlinkert. + * Released under the MIT License. + */ + module2.exports = function(path, stripTrailing) { + if (typeof path !== "string") { + throw new TypeError("expected path to be a string"); + } + if (path === "\\" || path === "/") + return "/"; + var len = path.length; + if (len <= 1) + return path; + var prefix = ""; + if (len > 4 && path[3] === "\\") { + var ch = path[2]; + if ((ch === "?" || ch === ".") && path.slice(0, 2) === "\\\\") { + path = path.slice(2); + prefix = "//"; + } + } + var segs = path.split(/[/\\]+/); + if (stripTrailing !== false && segs[segs.length - 1] === "") { + segs.pop(); + } + return prefix + segs.join("/"); + }; +}); + +// node_modules/lodash/identity.js +var require_identity = __commonJS((exports2, module2) => { + function identity(value) { + return value; + } + module2.exports = identity; +}); + +// node_modules/lodash/_apply.js +var require__apply = __commonJS((exports2, module2) => { + function apply(func, thisArg, args) { + switch (args.length) { + case 0: + return func.call(thisArg); + case 1: + return func.call(thisArg, args[0]); + case 2: + return func.call(thisArg, args[0], args[1]); + case 3: + return func.call(thisArg, args[0], args[1], args[2]); + } + return func.apply(thisArg, args); + } + module2.exports = apply; +}); + +// node_modules/lodash/_overRest.js +var require__overRest = __commonJS((exports2, module2) => { + var apply = require__apply(); + var nativeMax = Math.max; + function overRest(func, start, transform) { + start = nativeMax(start === undefined ? func.length - 1 : start, 0); + return function() { + var args = arguments, index = -1, length = nativeMax(args.length - start, 0), array = Array(length); + while (++index < length) { + array[index] = args[start + index]; + } + index = -1; + var otherArgs = Array(start + 1); + while (++index < start) { + otherArgs[index] = args[index]; + } + otherArgs[start] = transform(array); + return apply(func, this, otherArgs); + }; + } + module2.exports = overRest; +}); + +// node_modules/lodash/constant.js +var require_constant = __commonJS((exports2, module2) => { + function constant(value) { + return function() { + return value; + }; + } + module2.exports = constant; +}); + +// node_modules/lodash/_freeGlobal.js +var require__freeGlobal = __commonJS((exports2, module2) => { + var freeGlobal = typeof global == "object" && global && global.Object === Object && global; + module2.exports = freeGlobal; +}); + +// node_modules/lodash/_root.js +var require__root = __commonJS((exports2, module2) => { + var freeGlobal = require__freeGlobal(); + var freeSelf = typeof self == "object" && self && self.Object === Object && self; + var root = freeGlobal || freeSelf || Function("return this")(); + module2.exports = root; +}); + +// node_modules/lodash/_Symbol.js +var require__Symbol = __commonJS((exports2, module2) => { + var root = require__root(); + var Symbol2 = root.Symbol; + module2.exports = Symbol2; +}); + +// node_modules/lodash/_getRawTag.js +var require__getRawTag = __commonJS((exports2, module2) => { + var Symbol2 = require__Symbol(); + var objectProto = Object.prototype; + var hasOwnProperty = objectProto.hasOwnProperty; + var nativeObjectToString = objectProto.toString; + var symToStringTag = Symbol2 ? Symbol2.toStringTag : undefined; + function getRawTag(value) { + var isOwn = hasOwnProperty.call(value, symToStringTag), tag = value[symToStringTag]; + try { + value[symToStringTag] = undefined; + var unmasked = true; + } catch (e) { + } + var result = nativeObjectToString.call(value); + if (unmasked) { + if (isOwn) { + value[symToStringTag] = tag; + } else { + delete value[symToStringTag]; + } + } + return result; + } + module2.exports = getRawTag; +}); + +// node_modules/lodash/_objectToString.js +var require__objectToString = __commonJS((exports2, module2) => { + var objectProto = Object.prototype; + var nativeObjectToString = objectProto.toString; + function objectToString(value) { + return nativeObjectToString.call(value); + } + module2.exports = objectToString; +}); + +// node_modules/lodash/_baseGetTag.js +var require__baseGetTag = __commonJS((exports2, module2) => { + var Symbol2 = require__Symbol(); + var getRawTag = require__getRawTag(); + var objectToString = require__objectToString(); + var nullTag = "[object Null]"; + var undefinedTag = "[object Undefined]"; + var symToStringTag = Symbol2 ? Symbol2.toStringTag : undefined; + function baseGetTag(value) { + if (value == null) { + return value === undefined ? undefinedTag : nullTag; + } + return symToStringTag && symToStringTag in Object(value) ? getRawTag(value) : objectToString(value); + } + module2.exports = baseGetTag; +}); + +// node_modules/lodash/isObject.js +var require_isObject = __commonJS((exports2, module2) => { + function isObject(value) { + var type = typeof value; + return value != null && (type == "object" || type == "function"); + } + module2.exports = isObject; +}); + +// node_modules/lodash/isFunction.js +var require_isFunction = __commonJS((exports2, module2) => { + var baseGetTag = require__baseGetTag(); + var isObject = require_isObject(); + var asyncTag = "[object AsyncFunction]"; + var funcTag = "[object Function]"; + var genTag = "[object GeneratorFunction]"; + var proxyTag = "[object Proxy]"; + function isFunction(value) { + if (!isObject(value)) { + return false; + } + var tag = baseGetTag(value); + return tag == funcTag || tag == genTag || tag == asyncTag || tag == proxyTag; + } + module2.exports = isFunction; +}); + +// node_modules/lodash/_coreJsData.js +var require__coreJsData = __commonJS((exports2, module2) => { + var root = require__root(); + var coreJsData = root["__core-js_shared__"]; + module2.exports = coreJsData; +}); + +// node_modules/lodash/_isMasked.js +var require__isMasked = __commonJS((exports2, module2) => { + var coreJsData = require__coreJsData(); + var maskSrcKey = function() { + var uid = /[^.]+$/.exec(coreJsData && coreJsData.keys && coreJsData.keys.IE_PROTO || ""); + return uid ? "Symbol(src)_1." + uid : ""; + }(); + function isMasked(func) { + return !!maskSrcKey && maskSrcKey in func; + } + module2.exports = isMasked; +}); + +// node_modules/lodash/_toSource.js +var require__toSource = __commonJS((exports2, module2) => { + var funcProto = Function.prototype; + var funcToString = funcProto.toString; + function toSource(func) { + if (func != null) { + try { + return funcToString.call(func); + } catch (e) { + } + try { + return func + ""; + } catch (e) { + } + } + return ""; + } + module2.exports = toSource; +}); + +// node_modules/lodash/_baseIsNative.js +var require__baseIsNative = __commonJS((exports2, module2) => { + var isFunction = require_isFunction(); + var isMasked = require__isMasked(); + var isObject = require_isObject(); + var toSource = require__toSource(); + var reRegExpChar = /[\\^$.*+?()[\]{}|]/g; + var reIsHostCtor = /^\[object .+?Constructor\]$/; + var funcProto = Function.prototype; + var objectProto = Object.prototype; + var funcToString = funcProto.toString; + var hasOwnProperty = objectProto.hasOwnProperty; + var reIsNative = RegExp("^" + funcToString.call(hasOwnProperty).replace(reRegExpChar, "\\$&").replace(/hasOwnProperty|(function).*?(?=\\\()| for .+?(?=\\\])/g, "$1.*?") + "$"); + function baseIsNative(value) { + if (!isObject(value) || isMasked(value)) { + return false; + } + var pattern = isFunction(value) ? reIsNative : reIsHostCtor; + return pattern.test(toSource(value)); + } + module2.exports = baseIsNative; +}); + +// node_modules/lodash/_getValue.js +var require__getValue = __commonJS((exports2, module2) => { + function getValue(object, key) { + return object == null ? undefined : object[key]; + } + module2.exports = getValue; +}); + +// node_modules/lodash/_getNative.js +var require__getNative = __commonJS((exports2, module2) => { + var baseIsNative = require__baseIsNative(); + var getValue = require__getValue(); + function getNative(object, key) { + var value = getValue(object, key); + return baseIsNative(value) ? value : undefined; + } + module2.exports = getNative; +}); + +// node_modules/lodash/_defineProperty.js +var require__defineProperty = __commonJS((exports2, module2) => { + var getNative = require__getNative(); + var defineProperty = function() { + try { + var func = getNative(Object, "defineProperty"); + func({}, "", {}); + return func; + } catch (e) { + } + }(); + module2.exports = defineProperty; +}); + +// node_modules/lodash/_baseSetToString.js +var require__baseSetToString = __commonJS((exports2, module2) => { + var constant = require_constant(); + var defineProperty = require__defineProperty(); + var identity = require_identity(); + var baseSetToString = !defineProperty ? identity : function(func, string) { + return defineProperty(func, "toString", { + configurable: true, + enumerable: false, + value: constant(string), + writable: true + }); + }; + module2.exports = baseSetToString; +}); + +// node_modules/lodash/_shortOut.js +var require__shortOut = __commonJS((exports2, module2) => { + var HOT_COUNT = 800; + var HOT_SPAN = 16; + var nativeNow = Date.now; + function shortOut(func) { + var count = 0, lastCalled = 0; + return function() { + var stamp = nativeNow(), remaining = HOT_SPAN - (stamp - lastCalled); + lastCalled = stamp; + if (remaining > 0) { + if (++count >= HOT_COUNT) { + return arguments[0]; + } + } else { + count = 0; + } + return func.apply(undefined, arguments); + }; + } + module2.exports = shortOut; +}); + +// node_modules/lodash/_setToString.js +var require__setToString = __commonJS((exports2, module2) => { + var baseSetToString = require__baseSetToString(); + var shortOut = require__shortOut(); + var setToString = shortOut(baseSetToString); + module2.exports = setToString; +}); + +// node_modules/lodash/_baseRest.js +var require__baseRest = __commonJS((exports2, module2) => { + var identity = require_identity(); + var overRest = require__overRest(); + var setToString = require__setToString(); + function baseRest(func, start) { + return setToString(overRest(func, start, identity), func + ""); + } + module2.exports = baseRest; +}); + +// node_modules/lodash/eq.js +var require_eq = __commonJS((exports2, module2) => { + function eq(value, other) { + return value === other || value !== value && other !== other; + } + module2.exports = eq; +}); + +// node_modules/lodash/isLength.js +var require_isLength = __commonJS((exports2, module2) => { + var MAX_SAFE_INTEGER = 9007199254740991; + function isLength(value) { + return typeof value == "number" && value > -1 && value % 1 == 0 && value <= MAX_SAFE_INTEGER; + } + module2.exports = isLength; +}); + +// node_modules/lodash/isArrayLike.js +var require_isArrayLike = __commonJS((exports2, module2) => { + var isFunction = require_isFunction(); + var isLength = require_isLength(); + function isArrayLike(value) { + return value != null && isLength(value.length) && !isFunction(value); + } + module2.exports = isArrayLike; +}); + +// node_modules/lodash/_isIndex.js +var require__isIndex = __commonJS((exports2, module2) => { + var MAX_SAFE_INTEGER = 9007199254740991; + var reIsUint = /^(?:0|[1-9]\d*)$/; + function isIndex(value, length) { + var type = typeof value; + length = length == null ? MAX_SAFE_INTEGER : length; + return !!length && (type == "number" || type != "symbol" && reIsUint.test(value)) && (value > -1 && value % 1 == 0 && value < length); + } + module2.exports = isIndex; +}); + +// node_modules/lodash/_isIterateeCall.js +var require__isIterateeCall = __commonJS((exports2, module2) => { + var eq = require_eq(); + var isArrayLike = require_isArrayLike(); + var isIndex = require__isIndex(); + var isObject = require_isObject(); + function isIterateeCall(value, index, object) { + if (!isObject(object)) { + return false; + } + var type = typeof index; + if (type == "number" ? isArrayLike(object) && isIndex(index, object.length) : type == "string" && (index in object)) { + return eq(object[index], value); + } + return false; + } + module2.exports = isIterateeCall; +}); + +// node_modules/lodash/_baseTimes.js +var require__baseTimes = __commonJS((exports2, module2) => { + function baseTimes(n, iteratee) { + var index = -1, result = Array(n); + while (++index < n) { + result[index] = iteratee(index); + } + return result; + } + module2.exports = baseTimes; +}); + +// node_modules/lodash/isObjectLike.js +var require_isObjectLike = __commonJS((exports2, module2) => { + function isObjectLike(value) { + return value != null && typeof value == "object"; + } + module2.exports = isObjectLike; +}); + +// node_modules/lodash/_baseIsArguments.js +var require__baseIsArguments = __commonJS((exports2, module2) => { + var baseGetTag = require__baseGetTag(); + var isObjectLike = require_isObjectLike(); + var argsTag = "[object Arguments]"; + function baseIsArguments(value) { + return isObjectLike(value) && baseGetTag(value) == argsTag; + } + module2.exports = baseIsArguments; +}); + +// node_modules/lodash/isArguments.js +var require_isArguments = __commonJS((exports2, module2) => { + var baseIsArguments = require__baseIsArguments(); + var isObjectLike = require_isObjectLike(); + var objectProto = Object.prototype; + var hasOwnProperty = objectProto.hasOwnProperty; + var propertyIsEnumerable = objectProto.propertyIsEnumerable; + var isArguments = baseIsArguments(function() { + return arguments; + }()) ? baseIsArguments : function(value) { + return isObjectLike(value) && hasOwnProperty.call(value, "callee") && !propertyIsEnumerable.call(value, "callee"); + }; + module2.exports = isArguments; +}); + +// node_modules/lodash/isArray.js +var require_isArray = __commonJS((exports2, module2) => { + var isArray = Array.isArray; + module2.exports = isArray; +}); + +// node_modules/lodash/stubFalse.js +var require_stubFalse = __commonJS((exports2, module2) => { + function stubFalse() { + return false; + } + module2.exports = stubFalse; +}); + +// node_modules/lodash/isBuffer.js +var require_isBuffer = __commonJS((exports2, module2) => { + var root = require__root(); + var stubFalse = require_stubFalse(); + var freeExports = typeof exports2 == "object" && exports2 && !exports2.nodeType && exports2; + var freeModule = freeExports && typeof module2 == "object" && module2 && !module2.nodeType && module2; + var moduleExports = freeModule && freeModule.exports === freeExports; + var Buffer2 = moduleExports ? root.Buffer : undefined; + var nativeIsBuffer = Buffer2 ? Buffer2.isBuffer : undefined; + var isBuffer = nativeIsBuffer || stubFalse; + module2.exports = isBuffer; +}); + +// node_modules/lodash/_baseIsTypedArray.js +var require__baseIsTypedArray = __commonJS((exports2, module2) => { + var baseGetTag = require__baseGetTag(); + var isLength = require_isLength(); + var isObjectLike = require_isObjectLike(); + var argsTag = "[object Arguments]"; + var arrayTag = "[object Array]"; + var boolTag = "[object Boolean]"; + var dateTag = "[object Date]"; + var errorTag = "[object Error]"; + var funcTag = "[object Function]"; + var mapTag = "[object Map]"; + var numberTag = "[object Number]"; + var objectTag = "[object Object]"; + var regexpTag = "[object RegExp]"; + var setTag = "[object Set]"; + var stringTag = "[object String]"; + var weakMapTag = "[object WeakMap]"; + var arrayBufferTag = "[object ArrayBuffer]"; + var dataViewTag = "[object DataView]"; + var float32Tag = "[object Float32Array]"; + var float64Tag = "[object Float64Array]"; + var int8Tag = "[object Int8Array]"; + var int16Tag = "[object Int16Array]"; + var int32Tag = "[object Int32Array]"; + var uint8Tag = "[object Uint8Array]"; + var uint8ClampedTag = "[object Uint8ClampedArray]"; + var uint16Tag = "[object Uint16Array]"; + var uint32Tag = "[object Uint32Array]"; + var typedArrayTags = {}; + typedArrayTags[float32Tag] = typedArrayTags[float64Tag] = typedArrayTags[int8Tag] = typedArrayTags[int16Tag] = typedArrayTags[int32Tag] = typedArrayTags[uint8Tag] = typedArrayTags[uint8ClampedTag] = typedArrayTags[uint16Tag] = typedArrayTags[uint32Tag] = true; + typedArrayTags[argsTag] = typedArrayTags[arrayTag] = typedArrayTags[arrayBufferTag] = typedArrayTags[boolTag] = typedArrayTags[dataViewTag] = typedArrayTags[dateTag] = typedArrayTags[errorTag] = typedArrayTags[funcTag] = typedArrayTags[mapTag] = typedArrayTags[numberTag] = typedArrayTags[objectTag] = typedArrayTags[regexpTag] = typedArrayTags[setTag] = typedArrayTags[stringTag] = typedArrayTags[weakMapTag] = false; + function baseIsTypedArray(value) { + return isObjectLike(value) && isLength(value.length) && !!typedArrayTags[baseGetTag(value)]; + } + module2.exports = baseIsTypedArray; +}); + +// node_modules/lodash/_baseUnary.js +var require__baseUnary = __commonJS((exports2, module2) => { + function baseUnary(func) { + return function(value) { + return func(value); + }; + } + module2.exports = baseUnary; +}); + +// node_modules/lodash/_nodeUtil.js +var require__nodeUtil = __commonJS((exports2, module2) => { + var freeGlobal = require__freeGlobal(); + var freeExports = typeof exports2 == "object" && exports2 && !exports2.nodeType && exports2; + var freeModule = freeExports && typeof module2 == "object" && module2 && !module2.nodeType && module2; + var moduleExports = freeModule && freeModule.exports === freeExports; + var freeProcess = moduleExports && freeGlobal.process; + var nodeUtil = function() { + try { + var types = freeModule && freeModule.require && freeModule.require("util").types; + if (types) { + return types; + } + return freeProcess && freeProcess.binding && freeProcess.binding("util"); + } catch (e) { + } + }(); + module2.exports = nodeUtil; +}); + +// node_modules/lodash/isTypedArray.js +var require_isTypedArray = __commonJS((exports2, module2) => { + var baseIsTypedArray = require__baseIsTypedArray(); + var baseUnary = require__baseUnary(); + var nodeUtil = require__nodeUtil(); + var nodeIsTypedArray = nodeUtil && nodeUtil.isTypedArray; + var isTypedArray = nodeIsTypedArray ? baseUnary(nodeIsTypedArray) : baseIsTypedArray; + module2.exports = isTypedArray; +}); + +// node_modules/lodash/_arrayLikeKeys.js +var require__arrayLikeKeys = __commonJS((exports2, module2) => { + var baseTimes = require__baseTimes(); + var isArguments = require_isArguments(); + var isArray = require_isArray(); + var isBuffer = require_isBuffer(); + var isIndex = require__isIndex(); + var isTypedArray = require_isTypedArray(); + var objectProto = Object.prototype; + var hasOwnProperty = objectProto.hasOwnProperty; + function arrayLikeKeys(value, inherited) { + var isArr = isArray(value), isArg = !isArr && isArguments(value), isBuff = !isArr && !isArg && isBuffer(value), isType = !isArr && !isArg && !isBuff && isTypedArray(value), skipIndexes = isArr || isArg || isBuff || isType, result = skipIndexes ? baseTimes(value.length, String) : [], length = result.length; + for (var key in value) { + if ((inherited || hasOwnProperty.call(value, key)) && !(skipIndexes && (key == "length" || isBuff && (key == "offset" || key == "parent") || isType && (key == "buffer" || key == "byteLength" || key == "byteOffset") || isIndex(key, length)))) { + result.push(key); + } + } + return result; + } + module2.exports = arrayLikeKeys; +}); + +// node_modules/lodash/_isPrototype.js +var require__isPrototype = __commonJS((exports2, module2) => { + var objectProto = Object.prototype; + function isPrototype(value) { + var Ctor = value && value.constructor, proto = typeof Ctor == "function" && Ctor.prototype || objectProto; + return value === proto; + } + module2.exports = isPrototype; +}); + +// node_modules/lodash/_nativeKeysIn.js +var require__nativeKeysIn = __commonJS((exports2, module2) => { + function nativeKeysIn(object) { + var result = []; + if (object != null) { + for (var key in Object(object)) { + result.push(key); + } + } + return result; + } + module2.exports = nativeKeysIn; +}); + +// node_modules/lodash/_baseKeysIn.js +var require__baseKeysIn = __commonJS((exports2, module2) => { + var isObject = require_isObject(); + var isPrototype = require__isPrototype(); + var nativeKeysIn = require__nativeKeysIn(); + var objectProto = Object.prototype; + var hasOwnProperty = objectProto.hasOwnProperty; + function baseKeysIn(object) { + if (!isObject(object)) { + return nativeKeysIn(object); + } + var isProto = isPrototype(object), result = []; + for (var key in object) { + if (!(key == "constructor" && (isProto || !hasOwnProperty.call(object, key)))) { + result.push(key); + } + } + return result; + } + module2.exports = baseKeysIn; +}); + +// node_modules/lodash/keysIn.js +var require_keysIn = __commonJS((exports2, module2) => { + var arrayLikeKeys = require__arrayLikeKeys(); + var baseKeysIn = require__baseKeysIn(); + var isArrayLike = require_isArrayLike(); + function keysIn(object) { + return isArrayLike(object) ? arrayLikeKeys(object, true) : baseKeysIn(object); + } + module2.exports = keysIn; +}); + +// node_modules/lodash/defaults.js +var require_defaults = __commonJS((exports2, module2) => { + var baseRest = require__baseRest(); + var eq = require_eq(); + var isIterateeCall = require__isIterateeCall(); + var keysIn = require_keysIn(); + var objectProto = Object.prototype; + var hasOwnProperty = objectProto.hasOwnProperty; + var defaults = baseRest(function(object, sources) { + object = Object(object); + var index = -1; + var length = sources.length; + var guard = length > 2 ? sources[2] : undefined; + if (guard && isIterateeCall(sources[0], sources[1], guard)) { + length = 1; + } + while (++index < length) { + var source = sources[index]; + var props = keysIn(source); + var propsIndex = -1; + var propsLength = props.length; + while (++propsIndex < propsLength) { + var key = props[propsIndex]; + var value = object[key]; + if (value === undefined || eq(value, objectProto[key]) && !hasOwnProperty.call(object, key)) { + object[key] = source[key]; + } + } + } + return object; + }); + module2.exports = defaults; +}); + +// node_modules/readable-stream/lib/ours/primordials.js +var require_primordials = __commonJS((exports2, module2) => { + module2.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); + }, + PromiseResolve(val2) { + return Promise.resolve(val2); + }, + 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, + SymbolFor: Symbol.for, + SymbolAsyncIterator: Symbol.asyncIterator, + SymbolHasInstance: Symbol.hasInstance, + SymbolIterator: Symbol.iterator, + SymbolDispose: Symbol.dispose || Symbol("Symbol.dispose"), + SymbolAsyncDispose: Symbol.asyncDispose || Symbol("Symbol.asyncDispose"), + TypedArrayPrototypeSet(self2, buf, len) { + return self2.set(buf, len); + }, + Boolean, + Uint8Array + }; +}); + +// node_modules/event-target-shim/dist/event-target-shim.js +var require_event_target_shim = __commonJS((exports2, module2) => { + Object.defineProperty(exports2, "__esModule", { value: true }); + var privateData = new WeakMap; + var wrappers = 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 Event2(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)); + } + } + } + Event2.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(Event2.prototype, "constructor", { + value: Event2, + configurable: true, + writable: true + }); + if (typeof window !== "undefined" && typeof window.Event !== "undefined") { + Object.setPrototypeOf(Event2.prototype, window.Event.prototype); + wrappers.set(window.Event.prototype, Event2); + } + 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 Event2; + } + 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 = 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() { + EventTarget2.call(this); + } + CustomEventTarget.prototype = Object.create(EventTarget2.prototype, { + constructor: { + value: CustomEventTarget, + configurable: true, + writable: true + } + }); + for (let i = 0;i < eventNames.length; ++i) { + defineEventAttribute(CustomEventTarget.prototype, eventNames[i]); + } + return CustomEventTarget; + } + function EventTarget2() { + if (this instanceof EventTarget2) { + listenersMap.set(this, 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"); + } + EventTarget2.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 === undefined) { + 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(EventTarget2.prototype, "constructor", { + value: EventTarget2, + configurable: true, + writable: true + }); + if (typeof window !== "undefined" && typeof window.EventTarget !== "undefined") { + Object.setPrototypeOf(EventTarget2.prototype, window.EventTarget.prototype); + } + exports2.defineEventAttribute = defineEventAttribute; + exports2.EventTarget = EventTarget2; + exports2.default = EventTarget2; + module2.exports = EventTarget2; + module2.exports.EventTarget = module2.exports["default"] = EventTarget2; + module2.exports.defineEventAttribute = defineEventAttribute; +}); + +// node_modules/abort-controller/dist/abort-controller.js +var require_abort_controller = __commonJS((exports2, module2) => { + Object.defineProperty(exports2, "__esModule", { value: true }); + var eventTargetShim = require_event_target_shim(); + + class AbortSignal2 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(AbortSignal2.prototype, "abort"); + function createAbortSignal() { + const signal = Object.create(AbortSignal2.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 = new WeakMap; + Object.defineProperties(AbortSignal2.prototype, { + aborted: { enumerable: true } + }); + if (typeof Symbol === "function" && typeof Symbol.toStringTag === "symbol") { + Object.defineProperty(AbortSignal2.prototype, Symbol.toStringTag, { + configurable: true, + value: "AbortSignal" + }); + } + + class AbortController2 { + constructor() { + signals.set(this, createAbortSignal()); + } + get signal() { + return getSignal(this); + } + abort() { + abortSignal(getSignal(this)); + } + } + var signals = 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(AbortController2.prototype, { + signal: { enumerable: true }, + abort: { enumerable: true } + }); + if (typeof Symbol === "function" && typeof Symbol.toStringTag === "symbol") { + Object.defineProperty(AbortController2.prototype, Symbol.toStringTag, { + configurable: true, + value: "AbortController" + }); + } + exports2.AbortController = AbortController2; + exports2.AbortSignal = AbortSignal2; + exports2.default = AbortController2; + module2.exports = AbortController2; + module2.exports.AbortController = module2.exports["default"] = AbortController2; + module2.exports.AbortSignal = AbortSignal2; +}); + +// node_modules/readable-stream/lib/ours/util.js +var require_util12 = __commonJS((exports2, module2) => { + var bufferModule = require("buffer"); + var { kResistStopPropagation, SymbolDispose } = require_primordials(); + var AbortSignal2 = globalThis.AbortSignal || require_abort_controller().AbortSignal; + var AbortController2 = globalThis.AbortController || require_abort_controller().AbortController; + var AsyncFunction = Object.getPrototypeOf(async function() { + }).constructor; + var Blob2 = globalThis.Blob || bufferModule.Blob; + var isBlob = typeof Blob2 !== "undefined" ? function isBlob(b) { + return b instanceof Blob2; + } : function isBlob(b) { + return false; + }; + var validateAbortSignal = (signal, name) => { + if (signal !== undefined && (signal === null || typeof signal !== "object" || !("aborted" in signal))) { + throw new ERR_INVALID_ARG_TYPE(name, "AbortSignal", signal); + } + }; + var validateFunction = (value, name) => { + if (typeof value !== "function") + throw new ERR_INVALID_ARG_TYPE(name, "Function", value); + }; + + class AggregateError 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}\n`; + } + super(message); + this.name = "AggregateError"; + this.errors = errors; + } + } + module2.exports = { + AggregateError, + kEmptyObject: Object.freeze({}), + 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, + deprecate(fn, message) { + return fn; + }, + addAbortListener: require("events").addAbortListener || function addAbortListener(signal, listener) { + if (signal === undefined) { + throw new ERR_INVALID_ARG_TYPE("signal", "AbortSignal", signal); + } + validateAbortSignal(signal, "signal"); + validateFunction(listener, "listener"); + let removeEventListener; + if (signal.aborted) { + queueMicrotask(() => listener()); + } else { + signal.addEventListener("abort", listener, { + __proto__: null, + once: true, + [kResistStopPropagation]: true + }); + removeEventListener = () => { + signal.removeEventListener("abort", listener); + }; + } + return { + __proto__: null, + [SymbolDispose]() { + var _removeEventListener; + (_removeEventListener = removeEventListener) === null || _removeEventListener === undefined || _removeEventListener(); + } + }; + }, + AbortSignalAny: AbortSignal2.any || function AbortSignalAny(signals) { + if (signals.length === 1) { + return signals[0]; + } + const ac = new AbortController2; + const abort = () => ac.abort(); + signals.forEach((signal) => { + validateAbortSignal(signal, "signals"); + signal.addEventListener("abort", abort, { + once: true + }); + }); + ac.signal.addEventListener("abort", () => { + signals.forEach((signal) => signal.removeEventListener("abort", abort)); + }, { + once: true + }); + return ac.signal; + } + }; + module2.exports.promisify.custom = Symbol.for("nodejs.util.promisify.custom"); +}); + +// node_modules/readable-stream/lib/ours/errors.js +var require_errors4 = __commonJS((exports2, module2) => { + var { format, inspect, AggregateError: CustomAggregateError } = require_util12(); + 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(val2) { + let res = ""; + let i = val2.length; + const start = val2[0] === "-" ? 1 : 0; + for (;i >= start + 4; i -= 3) { + res = `_${val2.slice(i - 3, i)}${res}`; + } + return `${val2.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}`; + } + } + Object.defineProperties(NodeError.prototype, { + name: { + value: Base.name, + writable: true, + enumerable: false, + configurable: true + }, + toString: { + value() { + return `${this.name} [${code}]: ${this.message}`; + }, + writable: true, + enumerable: false, + configurable: true + } + }); + NodeError.prototype.code = code; + NodeError.prototype[kIsNodeError] = true; + 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; + } + + class AbortError extends Error { + constructor(message = "The operation was aborted", options = undefined) { + if (options !== undefined && 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 !== undefined && _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 !== undefined && (_value$constructor = value.constructor) !== null && _value$constructor !== undefined && _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); + module2.exports = { + AbortError, + aggregateTwoErrors: hideStackFrames(aggregateTwoErrors), + hideStackFrames, + codes + }; +}); + +// node_modules/readable-stream/lib/internal/validators.js +var require_validators = __commonJS((exports2, module2) => { + var { + ArrayIsArray, + ArrayPrototypeIncludes, + ArrayPrototypeJoin, + ArrayPrototypeMap, + NumberIsInteger, + NumberIsNaN, + NumberMAX_SAFE_INTEGER, + NumberMIN_SAFE_INTEGER, + NumberParseInt, + ObjectPrototypeHasOwnProperty, + RegExpPrototypeExec, + String: String2, + StringPrototypeToUpperCase, + StringPrototypeTrim + } = require_primordials(); + var { + hideStackFrames, + codes: { ERR_SOCKET_BAD_PORT, ERR_INVALID_ARG_TYPE: ERR_INVALID_ARG_TYPE2, ERR_INVALID_ARG_VALUE, ERR_OUT_OF_RANGE, ERR_UNKNOWN_SIGNAL } + } = require_errors4(); + var { normalizeEncoding } = require_util12(); + var { isAsyncFunction, isArrayBufferView } = require_util12().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 (RegExpPrototypeExec(octalReg, value) === null) { + throw new ERR_INVALID_ARG_VALUE(name, value, modeDesc); + } + value = NumberParseInt(value, 8); + } + validateUint32(value, name); + return value; + } + var validateInteger = hideStackFrames((value, name, min = NumberMIN_SAFE_INTEGER, max = NumberMAX_SAFE_INTEGER) => { + if (typeof value !== "number") + throw new ERR_INVALID_ARG_TYPE2(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_TYPE2(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 validateUint32 = hideStackFrames((value, name, positive = false) => { + if (typeof value !== "number") { + throw new ERR_INVALID_ARG_TYPE2(name, "number", value); + } + if (!NumberIsInteger(value)) { + throw new ERR_OUT_OF_RANGE(name, "an integer", value); + } + const min = positive ? 1 : 0; + const max = 4294967295; + if (value < min || value > max) { + throw new ERR_OUT_OF_RANGE(name, `>= ${min} && <= ${max}`, value); + } + }); + function validateString(value, name) { + if (typeof value !== "string") + throw new ERR_INVALID_ARG_TYPE2(name, "string", value); + } + function validateNumber(value, name, min = undefined, max) { + if (typeof value !== "number") + throw new ERR_INVALID_ARG_TYPE2(name, "number", value); + if (min != null && value < min || max != null && value > max || (min != null || max != null) && NumberIsNaN(value)) { + throw new ERR_OUT_OF_RANGE(name, `${min != null ? `>= ${min}` : ""}${min != null && max != null ? " && " : ""}${max != null ? `<= ${max}` : ""}`, 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_TYPE2(name, "boolean", value); + } + function getOwnPropertyValueOrDefault(options, key, defaultValue) { + return options == null || !ObjectPrototypeHasOwnProperty(options, key) ? defaultValue : options[key]; + } + var validateObject = hideStackFrames((value, name, options = null) => { + const allowArray = getOwnPropertyValueOrDefault(options, "allowArray", false); + const allowFunction = getOwnPropertyValueOrDefault(options, "allowFunction", false); + const nullable = getOwnPropertyValueOrDefault(options, "nullable", false); + if (!nullable && value === null || !allowArray && ArrayIsArray(value) || typeof value !== "object" && (!allowFunction || typeof value !== "function")) { + throw new ERR_INVALID_ARG_TYPE2(name, "Object", value); + } + }); + var validateDictionary = hideStackFrames((value, name) => { + if (value != null && typeof value !== "object" && typeof value !== "function") { + throw new ERR_INVALID_ARG_TYPE2(name, "a dictionary", value); + } + }); + var validateArray = hideStackFrames((value, name, minLength = 0) => { + if (!ArrayIsArray(value)) { + throw new ERR_INVALID_ARG_TYPE2(name, "Array", value); + } + if (value.length < minLength) { + const reason = `must be longer than ${minLength}`; + throw new ERR_INVALID_ARG_VALUE(name, value, reason); + } + }); + function validateStringArray(value, name) { + validateArray(value, name); + for (let i = 0;i < value.length; i++) { + validateString(value[i], `${name}[${i}]`); + } + } + function validateBooleanArray(value, name) { + validateArray(value, name); + for (let i = 0;i < value.length; i++) { + validateBoolean(value[i], `${name}[${i}]`); + } + } + function validateAbortSignalArray(value, name) { + validateArray(value, name); + for (let i = 0;i < value.length; i++) { + const signal = value[i]; + const indexedName = `${name}[${i}]`; + if (signal == null) { + throw new ERR_INVALID_ARG_TYPE2(indexedName, "AbortSignal", signal); + } + validateAbortSignal(signal, indexedName); + } + } + function validateSignalName(signal, name = "signal") { + validateString(signal, name); + if (signals[signal] === undefined) { + if (signals[StringPrototypeToUpperCase(signal)] !== undefined) { + 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_TYPE2(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 !== undefined && (signal === null || typeof signal !== "object" || !("aborted" in signal))) { + throw new ERR_INVALID_ARG_TYPE2(name, "AbortSignal", signal); + } + }); + var validateFunction = hideStackFrames((value, name) => { + if (typeof value !== "function") + throw new ERR_INVALID_ARG_TYPE2(name, "Function", value); + }); + var validatePlainFunction = hideStackFrames((value, name) => { + if (typeof value !== "function" || isAsyncFunction(value)) + throw new ERR_INVALID_ARG_TYPE2(name, "Function", value); + }); + var validateUndefined = hideStackFrames((value, name) => { + if (value !== undefined) + throw new ERR_INVALID_ARG_TYPE2(name, "undefined", value); + }); + function validateUnion(value, name, union) { + if (!ArrayPrototypeIncludes(union, value)) { + throw new ERR_INVALID_ARG_TYPE2(name, `('${ArrayPrototypeJoin(union, "|")}')`, value); + } + } + var linkValueRegExp = /^(?:<[^>]*>)(?:\s*;\s*[^;"\s]+(?:=(")?[^;"\s]*\1)?)*$/; + function validateLinkHeaderFormat(value, name) { + if (typeof value === "undefined" || !RegExpPrototypeExec(linkValueRegExp, value)) { + throw new ERR_INVALID_ARG_VALUE(name, value, 'must be an array or string of format "; rel=preload; as=style"'); + } + } + function validateLinkHeaderValue(hints) { + if (typeof hints === "string") { + validateLinkHeaderFormat(hints, "hints"); + return hints; + } else if (ArrayIsArray(hints)) { + const hintsLength = hints.length; + let result = ""; + if (hintsLength === 0) { + return result; + } + for (let i = 0;i < hintsLength; i++) { + const link = hints[i]; + validateLinkHeaderFormat(link, "hints"); + result += link; + if (i !== hintsLength - 1) { + result += ", "; + } + } + return result; + } + throw new ERR_INVALID_ARG_VALUE("hints", hints, 'must be an array or string of format "; rel=preload; as=style"'); + } + module2.exports = { + isInt32, + isUint32, + parseFileMode, + validateArray, + validateStringArray, + validateBooleanArray, + validateAbortSignalArray, + validateBoolean, + validateBuffer, + validateDictionary, + validateEncoding, + validateFunction, + validateInt32, + validateInteger, + validateNumber, + validateObject, + validateOneOf, + validatePlainFunction, + validatePort, + validateSignalName, + validateString, + validateUint32, + validateUndefined, + validateUnion, + validateAbortSignal, + validateLinkHeaderValue + }; +}); + +// node_modules/process/index.js +var require_process = __commonJS((exports2, module2) => { + module2.exports = global.process; +}); + +// node_modules/readable-stream/lib/internal/streams/utils.js +var require_utils6 = __commonJS((exports2, module2) => { + var { SymbolAsyncIterator, SymbolIterator, SymbolFor } = require_primordials(); + var kIsDestroyed = SymbolFor("nodejs.stream.destroyed"); + var kIsErrored = SymbolFor("nodejs.stream.errored"); + var kIsReadable = SymbolFor("nodejs.stream.readable"); + var kIsWritable = SymbolFor("nodejs.stream.writable"); + var kIsDisturbed = SymbolFor("nodejs.stream.disturbed"); + var kIsClosedPromise = SymbolFor("nodejs.webstream.isClosedPromise"); + var kControllerErrorFunction = SymbolFor("nodejs.webstream.controllerErrorFunction"); + 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 === undefined ? undefined : _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 === undefined ? undefined : _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 isReadableStream(obj) { + return !!(obj && !isNodeStream(obj) && typeof obj.pipeThrough === "function" && typeof obj.getReader === "function" && typeof obj.cancel === "function"); + } + function isWritableStream(obj) { + return !!(obj && !isNodeStream(obj) && typeof obj.getWriter === "function" && typeof obj.abort === "function"); + } + function isTransformStream(obj) { + return !!(obj && !isNodeStream(obj) && typeof obj.readable === "object" && typeof obj.writable === "object"); + } + function isWebStream(obj) { + return isReadableStream(obj) || isWritableStream(obj) || isTransformStream(obj); + } + 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[kIsDestroyed] || state !== null && state !== undefined && state.destroyed); + } + function isWritableEnded(stream) { + if (!isWritableNodeStream(stream)) + return null; + if (stream.writableEnded === true) + return true; + const wState = stream._writableState; + if (wState !== null && wState !== undefined && wState.errored) + return false; + if (typeof (wState === null || wState === undefined ? undefined : 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 !== undefined && wState.errored) + return false; + if (typeof (wState === null || wState === undefined ? undefined : 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 === undefined ? undefined : 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 !== undefined && rState.errored) + return false; + if (typeof (rState === null || rState === undefined ? undefined : 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 === undefined ? undefined : stream.readable) !== "boolean") + return null; + if (isDestroyed(stream)) + return false; + return isReadableNodeStream(stream) && stream.readable && !isReadableFinished(stream); + } + function isWritable(stream) { + if (stream && stream[kIsWritable] != null) + return stream[kIsWritable]; + if (typeof (stream === null || stream === undefined ? undefined : 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 === undefined ? undefined : opts.readable) !== false && isReadable(stream)) { + return false; + } + if ((opts === null || opts === undefined ? undefined : 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 === undefined ? undefined : _stream$_writableStat2.errored) !== null && _stream$_writableStat !== undefined ? _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 === undefined ? undefined : _stream$_readableStat2.errored) !== null && _stream$_readableStat !== undefined ? _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 === undefined ? undefined : wState.closed) === "boolean" || typeof (rState === null || rState === undefined ? undefined : rState.closed) === "boolean") { + return (wState === null || wState === undefined ? undefined : wState.closed) || (rState === null || rState === undefined ? undefined : 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 === undefined ? undefined : _stream$req.upgradeOrConnect) === undefined; + } + 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 !== undefined ? _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 !== undefined ? _stream$kIsErrored : stream.readableErrored) !== null && _ref5 !== undefined ? _ref5 : stream.writableErrored) !== null && _ref4 !== undefined ? _ref4 : (_stream$_readableStat3 = stream._readableState) === null || _stream$_readableStat3 === undefined ? undefined : _stream$_readableStat3.errorEmitted) !== null && _ref3 !== undefined ? _ref3 : (_stream$_writableStat3 = stream._writableState) === null || _stream$_writableStat3 === undefined ? undefined : _stream$_writableStat3.errorEmitted) !== null && _ref2 !== undefined ? _ref2 : (_stream$_readableStat4 = stream._readableState) === null || _stream$_readableStat4 === undefined ? undefined : _stream$_readableStat4.errored) !== null && _ref !== undefined ? _ref : (_stream$_writableStat4 = stream._writableState) === null || _stream$_writableStat4 === undefined ? undefined : _stream$_writableStat4.errored)); + } + module2.exports = { + isDestroyed, + kIsDestroyed, + isDisturbed, + kIsDisturbed, + isErrored, + kIsErrored, + isReadable, + kIsReadable, + kIsClosedPromise, + kControllerErrorFunction, + kIsWritable, + isClosed, + isDuplexNodeStream, + isFinished, + isIterable, + isReadableNodeStream, + isReadableStream, + isReadableEnded, + isReadableFinished, + isReadableErrored, + isNodeStream, + isWebStream, + isWritable, + isWritableNodeStream, + isWritableStream, + isWritableEnded, + isWritableFinished, + isWritableErrored, + isServerRequest, + isServerResponse, + willEmitClose, + isTransformStream + }; +}); + +// node_modules/readable-stream/lib/internal/streams/end-of-stream.js +var require_end_of_stream = __commonJS((exports2, module2) => { + var process2 = require_process(); + var { AbortError, codes } = require_errors4(); + var { ERR_INVALID_ARG_TYPE: ERR_INVALID_ARG_TYPE2, ERR_STREAM_PREMATURE_CLOSE } = codes; + var { kEmptyObject, once } = require_util12(); + var { validateAbortSignal, validateFunction, validateObject, validateBoolean } = require_validators(); + var { Promise: Promise2, PromisePrototypeThen, SymbolDispose } = require_primordials(); + var { + isClosed, + isReadable, + isReadableNodeStream, + isReadableStream, + isReadableFinished, + isReadableErrored, + isWritable, + isWritableNodeStream, + isWritableStream, + isWritableFinished, + isWritableErrored, + isNodeStream, + willEmitClose: _willEmitClose, + kIsClosedPromise + } = require_utils6(); + var addAbortListener; + 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 = kEmptyObject; + } else if (options == null) { + options = kEmptyObject; + } else { + validateObject(options, "options"); + } + validateFunction(callback, "callback"); + validateAbortSignal(options.signal, "options.signal"); + callback = once(callback); + if (isReadableStream(stream) || isWritableStream(stream)) { + return eosWeb(stream, options, callback); + } + if (!isNodeStream(stream)) { + throw new ERR_INVALID_ARG_TYPE2("stream", ["ReadableStream", "WritableStream", "Stream"], stream); + } + const readable = (_options$readable = options.readable) !== null && _options$readable !== undefined ? _options$readable : isReadableNodeStream(stream); + const writable = (_options$writable = options.writable) !== null && _options$writable !== undefined ? _options$writable : isWritableNodeStream(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 onclosed = () => { + closed = true; + const errored = isWritableErrored(stream) || isReadableErrored(stream); + if (errored && typeof errored !== "boolean") { + return callback.call(stream, errored); + } + 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) { + process2.nextTick(onclose); + } else if (wState !== null && wState !== undefined && wState.errorEmitted || rState !== null && rState !== undefined && rState.errorEmitted) { + if (!willEmitClose) { + process2.nextTick(onclosed); + } + } else if (!readable && (!willEmitClose || isReadable(stream)) && (writableFinished || isWritable(stream) === false)) { + process2.nextTick(onclosed); + } else if (!writable && (!willEmitClose || isWritable(stream)) && (readableFinished || isReadable(stream) === false)) { + process2.nextTick(onclosed); + } else if (rState && stream.req && stream.aborted) { + process2.nextTick(onclosed); + } + 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(undefined, { + cause: options.signal.reason + })); + }; + if (options.signal.aborted) { + process2.nextTick(abort); + } else { + addAbortListener = addAbortListener || require_util12().addAbortListener; + const disposable = addAbortListener(options.signal, abort); + const originalCallback = callback; + callback = once((...args) => { + disposable[SymbolDispose](); + originalCallback.apply(stream, args); + }); + } + } + return cleanup; + } + function eosWeb(stream, options, callback) { + let isAborted = false; + let abort = nop; + if (options.signal) { + abort = () => { + isAborted = true; + callback.call(stream, new AbortError(undefined, { + cause: options.signal.reason + })); + }; + if (options.signal.aborted) { + process2.nextTick(abort); + } else { + addAbortListener = addAbortListener || require_util12().addAbortListener; + const disposable = addAbortListener(options.signal, abort); + const originalCallback = callback; + callback = once((...args) => { + disposable[SymbolDispose](); + originalCallback.apply(stream, args); + }); + } + } + const resolverFn = (...args) => { + if (!isAborted) { + process2.nextTick(() => callback.apply(stream, args)); + } + }; + PromisePrototypeThen(stream[kIsClosedPromise].promise, resolverFn, resolverFn); + return nop; + } + function finished(stream, opts) { + var _opts; + let autoCleanup = false; + if (opts === null) { + opts = kEmptyObject; + } + if ((_opts = opts) !== null && _opts !== undefined && _opts.cleanup) { + validateBoolean(opts.cleanup, "cleanup"); + autoCleanup = opts.cleanup; + } + return new Promise2((resolve, reject) => { + const cleanup = eos(stream, opts, (err) => { + if (autoCleanup) { + cleanup(); + } + if (err) { + reject(err); + } else { + resolve(); + } + }); + }); + } + module2.exports = eos; + module2.exports.finished = finished; +}); + +// node_modules/readable-stream/lib/internal/streams/destroy.js +var require_destroy2 = __commonJS((exports2, module2) => { + var process2 = require_process(); + var { + aggregateTwoErrors, + codes: { ERR_MULTIPLE_CALLBACK }, + AbortError + } = require_errors4(); + var { Symbol: Symbol2 } = require_primordials(); + var { kIsDestroyed, isDestroyed, isFinished, isServerRequest } = require_utils6(); + 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 !== null && w !== undefined && w.destroyed || r !== null && r !== undefined && 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) { + process2.nextTick(emitErrorCloseNT, self2, err2); + } else { + process2.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 !== null && w !== undefined && w.emitClose || r !== null && r !== undefined && r.emitClose) { + self2.emit("close"); + } + } + function emitErrorNT(self2, err) { + const r = self2._readableState; + const w = self2._writableState; + if (w !== null && w !== undefined && w.errorEmitted || r !== null && r !== undefined && 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 !== null && w !== undefined && w.destroyed || r !== null && r !== undefined && r.destroyed) { + return this; + } + if (r !== null && r !== undefined && r.autoDestroy || w !== null && w !== undefined && 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) { + process2.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; + } + process2.nextTick(constructNT, stream); + } + function constructNT(stream) { + let called = false; + function onConstruct(err) { + if (called) { + errorOrDestroy(stream, err !== null && err !== undefined ? 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 { + process2.nextTick(emitConstructNT, stream); + } + } + try { + stream._construct((err) => { + process2.nextTick(onConstruct, err); + }); + } catch (err) { + process2.nextTick(onConstruct, err); + } + } + function emitConstructNT(stream) { + stream.emit(kConstruct); + } + function isRequest(stream) { + return (stream === null || stream === undefined ? undefined : stream.setHeader) && typeof stream.abort === "function"; + } + function emitCloseLegacy(stream) { + stream.emit("close"); + } + function emitErrorCloseLegacy(stream, err) { + stream.emit("error", err); + process2.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) { + process2.nextTick(emitErrorCloseLegacy, stream, err); + } else { + process2.nextTick(emitCloseLegacy, stream); + } + if (!stream.destroyed) { + stream[kIsDestroyed] = true; + } + } + module2.exports = { + construct, + destroyer, + destroy, + undestroy, + errorOrDestroy + }; +}); + +// node_modules/readable-stream/lib/internal/streams/legacy.js +var require_legacy = __commonJS((exports2, module2) => { + 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]]; + } + module2.exports = { + Stream, + prependListener + }; +}); + +// node_modules/readable-stream/lib/internal/streams/add-abort-signal.js +var require_add_abort_signal = __commonJS((exports2, module2) => { + var { SymbolDispose } = require_primordials(); + var { AbortError, codes } = require_errors4(); + var { isNodeStream, isWebStream, kControllerErrorFunction } = require_utils6(); + var eos = require_end_of_stream(); + var { ERR_INVALID_ARG_TYPE: ERR_INVALID_ARG_TYPE2 } = codes; + var addAbortListener; + var validateAbortSignal = (signal, name) => { + if (typeof signal !== "object" || !("aborted" in signal)) { + throw new ERR_INVALID_ARG_TYPE2(name, "AbortSignal", signal); + } + }; + module2.exports.addAbortSignal = function addAbortSignal(signal, stream) { + validateAbortSignal(signal, "signal"); + if (!isNodeStream(stream) && !isWebStream(stream)) { + throw new ERR_INVALID_ARG_TYPE2("stream", ["ReadableStream", "WritableStream", "Stream"], stream); + } + return module2.exports.addAbortSignalNoValidate(signal, stream); + }; + module2.exports.addAbortSignalNoValidate = function(signal, stream) { + if (typeof signal !== "object" || !("aborted" in signal)) { + return stream; + } + const onAbort = isNodeStream(stream) ? () => { + stream.destroy(new AbortError(undefined, { + cause: signal.reason + })); + } : () => { + stream[kControllerErrorFunction](new AbortError(undefined, { + cause: signal.reason + })); + }; + if (signal.aborted) { + onAbort(); + } else { + addAbortListener = addAbortListener || require_util12().addAbortListener; + const disposable = addAbortListener(signal, onAbort); + eos(stream, disposable[SymbolDispose]); + } + return stream; + }; +}); + +// node_modules/readable-stream/lib/internal/streams/buffer_list.js +var require_buffer_list = __commonJS((exports2, module2) => { + var { StringPrototypeSlice, SymbolIterator, TypedArrayPrototypeSet, Uint8Array: Uint8Array2 } = require_primordials(); + var { Buffer: Buffer2 } = require("buffer"); + var { inspect } = require_util12(); + module2.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 Buffer2.alloc(0); + const ret = Buffer2.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 = Buffer2.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")](_2, options) { + return inspect(this, { + ...options, + depth: 0, + customInspect: false + }); + } + }; +}); + +// node_modules/readable-stream/lib/internal/streams/state.js +var require_state3 = __commonJS((exports2, module2) => { + var { MathFloor, NumberIsInteger } = require_primordials(); + var { validateInteger } = require_validators(); + var { ERR_INVALID_ARG_VALUE } = require_errors4().codes; + var defaultHighWaterMarkBytes = 16 * 1024; + var defaultHighWaterMarkObjectMode = 16; + function highWaterMarkFrom(options, isDuplex, duplexKey) { + return options.highWaterMark != null ? options.highWaterMark : isDuplex ? options[duplexKey] : null; + } + function getDefaultHighWaterMark(objectMode) { + return objectMode ? defaultHighWaterMarkObjectMode : defaultHighWaterMarkBytes; + } + function setDefaultHighWaterMark(objectMode, value) { + validateInteger(value, "value", 0); + if (objectMode) { + defaultHighWaterMarkObjectMode = value; + } else { + defaultHighWaterMarkBytes = value; + } + } + 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); + } + module2.exports = { + getHighWaterMark, + getDefaultHighWaterMark, + setDefaultHighWaterMark + }; +}); + +// node_modules/readable-stream/lib/internal/streams/from.js +var require_from = __commonJS((exports2, module2) => { + var process2 = require_process(); + var { PromisePrototypeThen, SymbolAsyncIterator, SymbolIterator } = require_primordials(); + var { Buffer: Buffer2 } = require("buffer"); + var { ERR_INVALID_ARG_TYPE: ERR_INVALID_ARG_TYPE2, ERR_STREAM_NULL_VALUES } = require_errors4().codes; + function from(Readable, iterable, opts) { + let iterator; + if (typeof iterable === "string" || iterable instanceof Buffer2) { + 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_TYPE2("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), () => process2.nextTick(cb, error), (e) => process2.nextTick(cb, e || error)); + }; + async function close(error) { + const hadError = error !== undefined && 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 { + reading = false; + } + } + } catch (err) { + readable.destroy(err); + } + break; + } + } + return readable; + } + module2.exports = from; +}); + +// node_modules/readable-stream/lib/internal/streams/readable.js +var require_readable3 = __commonJS((exports2, module2) => { + var process2 = require_process(); + var { + ArrayPrototypeIndexOf, + NumberIsInteger, + NumberIsNaN, + NumberParseInt, + ObjectDefineProperties, + ObjectKeys, + ObjectSetPrototypeOf, + Promise: Promise2, + SafeSet, + SymbolAsyncDispose, + SymbolAsyncIterator, + Symbol: Symbol2 + } = require_primordials(); + module2.exports = Readable; + Readable.ReadableState = ReadableState; + var { EventEmitter: EE } = require("events"); + var { Stream, prependListener } = require_legacy(); + var { Buffer: Buffer2 } = require("buffer"); + var { addAbortSignal } = require_add_abort_signal(); + var eos = require_end_of_stream(); + var debug = require_util12().debuglog("stream", (fn) => { + debug = fn; + }); + var BufferList = require_buffer_list(); + var destroyImpl = require_destroy2(); + var { getHighWaterMark, getDefaultHighWaterMark } = require_state3(); + var { + aggregateTwoErrors, + codes: { + ERR_INVALID_ARG_TYPE: ERR_INVALID_ARG_TYPE2, + ERR_METHOD_NOT_IMPLEMENTED, + ERR_OUT_OF_RANGE, + ERR_STREAM_PUSH_AFTER_EOF, + ERR_STREAM_UNSHIFT_AFTER_END_EVENT + }, + AbortError + } = require_errors4(); + 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; + var kObjectMode = 1 << 0; + var kEnded = 1 << 1; + var kEndEmitted = 1 << 2; + var kReading = 1 << 3; + var kConstructed = 1 << 4; + var kSync = 1 << 5; + var kNeedReadable = 1 << 6; + var kEmittedReadable = 1 << 7; + var kReadableListening = 1 << 8; + var kResumeScheduled = 1 << 9; + var kErrorEmitted = 1 << 10; + var kEmitClose = 1 << 11; + var kAutoDestroy = 1 << 12; + var kDestroyed = 1 << 13; + var kClosed = 1 << 14; + var kCloseEmitted = 1 << 15; + var kMultiAwaitDrain = 1 << 16; + var kReadingMore = 1 << 17; + var kDataEmitted = 1 << 18; + function makeBitMapDescriptor(bit) { + return { + enumerable: false, + get() { + return (this.state & bit) !== 0; + }, + set(value) { + if (value) + this.state |= bit; + else + this.state &= ~bit; + } + }; + } + ObjectDefineProperties(ReadableState.prototype, { + objectMode: makeBitMapDescriptor(kObjectMode), + ended: makeBitMapDescriptor(kEnded), + endEmitted: makeBitMapDescriptor(kEndEmitted), + reading: makeBitMapDescriptor(kReading), + constructed: makeBitMapDescriptor(kConstructed), + sync: makeBitMapDescriptor(kSync), + needReadable: makeBitMapDescriptor(kNeedReadable), + emittedReadable: makeBitMapDescriptor(kEmittedReadable), + readableListening: makeBitMapDescriptor(kReadableListening), + resumeScheduled: makeBitMapDescriptor(kResumeScheduled), + errorEmitted: makeBitMapDescriptor(kErrorEmitted), + emitClose: makeBitMapDescriptor(kEmitClose), + autoDestroy: makeBitMapDescriptor(kAutoDestroy), + destroyed: makeBitMapDescriptor(kDestroyed), + closed: makeBitMapDescriptor(kClosed), + closeEmitted: makeBitMapDescriptor(kCloseEmitted), + multiAwaitDrain: makeBitMapDescriptor(kMultiAwaitDrain), + readingMore: makeBitMapDescriptor(kReadingMore), + dataEmitted: makeBitMapDescriptor(kDataEmitted) + }); + function ReadableState(options, stream, isDuplex) { + if (typeof isDuplex !== "boolean") + isDuplex = stream instanceof require_duplex(); + this.state = kEmitClose | kAutoDestroy | kConstructed | kSync; + if (options && options.objectMode) + this.state |= kObjectMode; + if (isDuplex && options && options.readableObjectMode) + this.state |= kObjectMode; + this.highWaterMark = options ? getHighWaterMark(this, options, "readableHighWaterMark", isDuplex) : getDefaultHighWaterMark(false); + this.buffer = new BufferList; + this.length = 0; + this.pipes = []; + this.flowing = null; + this[kPaused] = null; + if (options && options.emitClose === false) + this.state &= ~kEmitClose; + if (options && options.autoDestroy === false) + this.state &= ~kAutoDestroy; + this.errored = null; + this.defaultEncoding = options && options.defaultEncoding || "utf8"; + this.awaitDrainWriters = null; + this.decoder = null; + this.encoding = null; + if (options && options.encoding) { + this.decoder = new StringDecoder(options.encoding); + this.encoding = options.encoding; + } + } + 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[SymbolAsyncDispose] = function() { + let error; + if (!this.destroyed) { + error = this.readableEnded ? null : new AbortError; + this.destroy(error); + } + return new Promise2((resolve, reject) => eos(this, (err) => err && err !== error ? reject(err) : resolve(null))); + }; + 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.state & kObjectMode) === 0) { + if (typeof chunk === "string") { + encoding = encoding || state.defaultEncoding; + if (state.encoding !== encoding) { + if (addToFront && state.encoding) { + chunk = Buffer2.from(chunk, encoding).toString(state.encoding); + } else { + chunk = Buffer2.from(chunk, encoding); + encoding = ""; + } + } + } else if (chunk instanceof Buffer2) { + encoding = ""; + } else if (Stream._isUint8Array(chunk)) { + chunk = Stream._uint8ArrayToBuffer(chunk); + encoding = ""; + } else if (chunk != null) { + err = new ERR_INVALID_ARG_TYPE2("chunk", ["string", "Buffer", "Uint8Array"], chunk); + } + } + if (err) { + errorOrDestroy(stream, err); + } else if (chunk === null) { + state.state &= ~kReading; + onEofChunk(stream, state); + } else if ((state.state & kObjectMode) !== 0 || chunk && chunk.length > 0) { + if (addToFront) { + if ((state.state & kEndEmitted) !== 0) + 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.state &= ~kReading; + 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); + } + } + } else if (!addToFront) { + state.state &= ~kReading; + 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.state & kMultiAwaitDrain) !== 0) { + 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.state & kNeedReadable) !== 0) + 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.state & kObjectMode) !== 0) + 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 === undefined) { + 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.state &= ~kEmittedReadable; + 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.state & kNeedReadable) !== 0; + 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.state |= kReading | kSync; + if (state.length === 0) + state.state |= kNeedReadable; + try { + this._read(state.highWaterMark); + } catch (err) { + errorOrDestroy(this, err); + } + state.state &= ~kSync; + 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; + process2.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; + process2.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 !== process2.stdout && dest !== process2.stderr; + const endFn = doEnd ? onend : unpipe; + if (state.endEmitted) + process2.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) { + 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) { + process2.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") { + process2.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 === undefined) { + process2.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; + process2.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] === undefined && 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 !== undefined) { + 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 === undefined ? undefined : options.destroyOnReturn) !== false) && (error === undefined || stream._readableState.autoDestroy)) { + destroyImpl.destroyer(stream, null); + } else { + stream.off("readable", next); + cleanup(); + } + } + } + ObjectDefineProperties(Readable.prototype, { + readable: { + __proto__: null, + get() { + const r = this._readableState; + return !!r && r.readable !== false && !r.destroyed && !r.errorEmitted && !r.endEmitted; + }, + set(val2) { + if (this._readableState) { + this._readableState.readable = !!val2; + } + } + }, + readableDidRead: { + __proto__: null, + enumerable: false, + get: function() { + return this._readableState.dataEmitted; + } + }, + readableAborted: { + __proto__: null, + enumerable: false, + get: function() { + return !!(this._readableState.readable !== false && (this._readableState.destroyed || this._readableState.errored) && !this._readableState.endEmitted); + } + }, + readableHighWaterMark: { + __proto__: null, + enumerable: false, + get: function() { + return this._readableState.highWaterMark; + } + }, + readableBuffer: { + __proto__: null, + enumerable: false, + get: function() { + return this._readableState && this._readableState.buffer; + } + }, + readableFlowing: { + __proto__: null, + enumerable: false, + get: function() { + return this._readableState.flowing; + }, + set: function(state) { + if (this._readableState) { + this._readableState.flowing = state; + } + } + }, + readableLength: { + __proto__: null, + enumerable: false, + get() { + return this._readableState.length; + } + }, + readableObjectMode: { + __proto__: null, + enumerable: false, + get() { + return this._readableState ? this._readableState.objectMode : false; + } + }, + readableEncoding: { + __proto__: null, + enumerable: false, + get() { + return this._readableState ? this._readableState.encoding : null; + } + }, + errored: { + __proto__: null, + enumerable: false, + get() { + return this._readableState ? this._readableState.errored : null; + } + }, + closed: { + __proto__: null, + get() { + return this._readableState ? this._readableState.closed : false; + } + }, + destroyed: { + __proto__: null, + enumerable: false, + get() { + return this._readableState ? this._readableState.destroyed : false; + }, + set(value) { + if (!this._readableState) { + return; + } + this._readableState.destroyed = value; + } + }, + readableEnded: { + __proto__: null, + enumerable: false, + get() { + return this._readableState ? this._readableState.endEmitted : false; + } + } + }); + ObjectDefineProperties(ReadableState.prototype, { + pipesCount: { + __proto__: null, + get() { + return this.pipes.length; + } + }, + paused: { + __proto__: null, + 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; + process2.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) { + process2.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 === undefined) + webStreamsAdapters = {}; + return webStreamsAdapters; + } + Readable.fromWeb = function(readableStream, options) { + return lazyWebStreams().newStreamReadableFromReadableStream(readableStream, options); + }; + Readable.toWeb = function(streamReadable, options) { + return lazyWebStreams().newReadableStreamFromStreamReadable(streamReadable, options); + }; + Readable.wrap = function(src, options) { + var _ref, _src$readableObjectMo; + return new Readable({ + objectMode: (_ref = (_src$readableObjectMo = src.readableObjectMode) !== null && _src$readableObjectMo !== undefined ? _src$readableObjectMo : src.objectMode) !== null && _ref !== undefined ? _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((exports2, module2) => { + var process2 = require_process(); + var { + ArrayPrototypeSlice, + Error: Error2, + FunctionPrototypeSymbolHasInstance, + ObjectDefineProperty, + ObjectDefineProperties, + ObjectSetPrototypeOf, + StringPrototypeToLowerCase, + Symbol: Symbol2, + SymbolHasInstance + } = require_primordials(); + module2.exports = Writable; + Writable.WritableState = WritableState; + var { EventEmitter: EE } = require("events"); + var Stream = require_legacy().Stream; + var { Buffer: Buffer2 } = require("buffer"); + var destroyImpl = require_destroy2(); + var { addAbortSignal } = require_add_abort_signal(); + var { getHighWaterMark, getDefaultHighWaterMark } = require_state3(); + var { + ERR_INVALID_ARG_TYPE: ERR_INVALID_ARG_TYPE2, + 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_errors4().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(undefined, 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", { + __proto__: null, + 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, { + __proto__: null, + 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" && !Buffer2.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 = Buffer2.from(chunk, encoding); + encoding = "buffer"; + } + } else if (chunk instanceof Buffer2) { + encoding = "buffer"; + } else if (Stream._isUint8Array(chunk)) { + chunk = Stream._uint8ArrayToBuffer(chunk); + encoding = "buffer"; + } else { + throw new ERR_INVALID_ARG_TYPE2("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) { + process2.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 (!Buffer2.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) { + process2.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 + }; + process2.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 !== undefined ? _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 !== undefined ? _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 !== undefined) { + 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) { + process2.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 !== undefined ? 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++; + process2.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++; + process2.nextTick((stream2, state2) => { + if (needFinish(state2)) { + finish(stream2, state2); + } else { + state2.pendingcb--; + } + }, 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: { + __proto__: null, + get() { + return this._writableState ? this._writableState.closed : false; + } + }, + destroyed: { + __proto__: null, + get() { + return this._writableState ? this._writableState.destroyed : false; + }, + set(value) { + if (this._writableState) { + this._writableState.destroyed = value; + } + } + }, + writable: { + __proto__: null, + get() { + const w = this._writableState; + return !!w && w.writable !== false && !w.destroyed && !w.errored && !w.ending && !w.ended; + }, + set(val2) { + if (this._writableState) { + this._writableState.writable = !!val2; + } + } + }, + writableFinished: { + __proto__: null, + get() { + return this._writableState ? this._writableState.finished : false; + } + }, + writableObjectMode: { + __proto__: null, + get() { + return this._writableState ? this._writableState.objectMode : false; + } + }, + writableBuffer: { + __proto__: null, + get() { + return this._writableState && this._writableState.getBuffer(); + } + }, + writableEnded: { + __proto__: null, + get() { + return this._writableState ? this._writableState.ending : false; + } + }, + writableNeedDrain: { + __proto__: null, + get() { + const wState = this._writableState; + if (!wState) + return false; + return !wState.destroyed && !wState.ending && wState.needDrain; + } + }, + writableHighWaterMark: { + __proto__: null, + get() { + return this._writableState && this._writableState.highWaterMark; + } + }, + writableCorked: { + __proto__: null, + get() { + return this._writableState ? this._writableState.corked : 0; + } + }, + writableLength: { + __proto__: null, + get() { + return this._writableState && this._writableState.length; + } + }, + errored: { + __proto__: null, + enumerable: false, + get() { + return this._writableState ? this._writableState.errored : null; + } + }, + writableAborted: { + __proto__: null, + 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)) { + process2.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 === undefined) + 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((exports2, module2) => { + var process2 = require_process(); + var bufferModule = require("buffer"); + var { + isReadable, + isWritable, + isIterable, + isNodeStream, + isReadableNodeStream, + isWritableNodeStream, + isDuplexNodeStream, + isReadableStream, + isWritableStream + } = require_utils6(); + var eos = require_end_of_stream(); + var { + AbortError, + codes: { ERR_INVALID_ARG_TYPE: ERR_INVALID_ARG_TYPE2, ERR_INVALID_RETURN_VALUE } + } = require_errors4(); + var { destroyer } = require_destroy2(); + var Duplex = require_duplex(); + var Readable = require_readable3(); + var Writable = require_writable(); + var { createDeferredPromise } = require_util12(); + var from = require_from(); + var Blob2 = globalThis.Blob || bufferModule.Blob; + var isBlob = typeof Blob2 !== "undefined" ? function isBlob(b) { + return b instanceof Blob2; + } : function isBlob(b) { + return false; + }; + var AbortController2 = globalThis.AbortController || require_abort_controller().AbortController; + var { FunctionPrototypeCall } = require_primordials(); + + class Duplexify extends Duplex { + constructor(options) { + super(options); + if ((options === null || options === undefined ? undefined : options.readable) === false) { + this._readableState.readable = false; + this._readableState.ended = true; + this._readableState.endEmitted = true; + } + if ((options === null || options === undefined ? undefined : options.writable) === false) { + this._writableState.writable = false; + this._writableState.ending = true; + this._writableState.ended = true; + this._writableState.finished = true; + } + } + } + module2.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 (isReadableStream(body)) { + return _duplexify({ + readable: Readable.fromWeb(body) + }); + } + if (isWritableStream(body)) { + return _duplexify({ + writable: Writable.fromWeb(body) + }); + } + if (typeof body === "function") { + const { value, write, final, destroy } = fromAsyncGen(body); + if (isIterable(value)) { + return from(Duplexify, value, { + objectMode: true, + write, + final, + destroy + }); + } + const then2 = value === null || value === undefined ? undefined : value.then; + if (typeof then2 === "function") { + let d; + const promise = FunctionPrototypeCall(then2, value, (val2) => { + if (val2 != null) { + throw new ERR_INVALID_RETURN_VALUE("nully", "body", val2); + } + }, (err) => { + destroyer(d, err); + }); + return d = new Duplexify({ + objectMode: true, + readable: false, + write, + final(cb) { + final(async () => { + try { + await promise; + process2.nextTick(cb, null); + } catch (err) { + process2.nextTick(cb, err); + } + }); + }, + 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 (isReadableStream(body === null || body === undefined ? undefined : body.readable) && isWritableStream(body === null || body === undefined ? undefined : body.writable)) { + return Duplexify.fromWeb(body); + } + if (typeof (body === null || body === undefined ? undefined : body.writable) === "object" || typeof (body === null || body === undefined ? undefined : body.readable) === "object") { + const readable = body !== null && body !== undefined && body.readable ? isReadableNodeStream(body === null || body === undefined ? undefined : body.readable) ? body === null || body === undefined ? undefined : body.readable : duplexify(body.readable) : undefined; + const writable = body !== null && body !== undefined && body.writable ? isWritableNodeStream(body === null || body === undefined ? undefined : body.writable) ? body === null || body === undefined ? undefined : body.writable : duplexify(body.writable) : undefined; + return _duplexify({ + readable, + writable + }); + } + const then = body === null || body === undefined ? undefined : body.then; + if (typeof then === "function") { + let d; + FunctionPrototypeCall(then, body, (val2) => { + if (val2 != null) { + d.push(val2); + } + d.push(null); + }, (err) => { + destroyer(d, err); + }); + return d = new Duplexify({ + objectMode: true, + writable: false, + read() { + } + }); + } + throw new ERR_INVALID_ARG_TYPE2(name, [ + "Blob", + "ReadableStream", + "WritableStream", + "Stream", + "Iterable", + "AsyncIterable", + "Function", + "{ readable, writable } pair", + "Promise" + ], body); + }; + function fromAsyncGen(fn) { + let { promise, resolve } = createDeferredPromise(); + const ac = new AbortController2; + const signal = ac.signal; + const value = fn(async function* () { + while (true) { + const _promise = promise; + promise = null; + const { chunk, done, cb } = await _promise; + process2.nextTick(cb); + if (done) + return; + if (signal.aborted) + throw new AbortError(undefined, { + cause: signal.reason + }); + ({ promise, resolve } = createDeferredPromise()); + yield chunk; + } + }(), { + signal + }); + return { + value, + write(chunk, encoding, cb) { + const _resolve = resolve; + resolve = null; + _resolve({ + chunk, + done: false, + cb + }); + }, + 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); + } + } + d = new Duplexify({ + readableObjectMode: !!(r !== null && r !== undefined && r.readableObjectMode), + writableObjectMode: !!(w !== null && w !== undefined && 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/readable-stream/lib/internal/streams/duplex.js +var require_duplex = __commonJS((exports2, module2) => { + var { + ObjectDefineProperties, + ObjectGetOwnPropertyDescriptor, + ObjectKeys, + ObjectSetPrototypeOf + } = require_primordials(); + module2.exports = Duplex; + var Readable = require_readable3(); + 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: { + __proto__: null, + ...ObjectGetOwnPropertyDescriptor(Writable.prototype, "writable") + }, + writableHighWaterMark: { + __proto__: null, + ...ObjectGetOwnPropertyDescriptor(Writable.prototype, "writableHighWaterMark") + }, + writableObjectMode: { + __proto__: null, + ...ObjectGetOwnPropertyDescriptor(Writable.prototype, "writableObjectMode") + }, + writableBuffer: { + __proto__: null, + ...ObjectGetOwnPropertyDescriptor(Writable.prototype, "writableBuffer") + }, + writableLength: { + __proto__: null, + ...ObjectGetOwnPropertyDescriptor(Writable.prototype, "writableLength") + }, + writableFinished: { + __proto__: null, + ...ObjectGetOwnPropertyDescriptor(Writable.prototype, "writableFinished") + }, + writableCorked: { + __proto__: null, + ...ObjectGetOwnPropertyDescriptor(Writable.prototype, "writableCorked") + }, + writableEnded: { + __proto__: null, + ...ObjectGetOwnPropertyDescriptor(Writable.prototype, "writableEnded") + }, + writableNeedDrain: { + __proto__: null, + ...ObjectGetOwnPropertyDescriptor(Writable.prototype, "writableNeedDrain") + }, + destroyed: { + __proto__: null, + get() { + if (this._readableState === undefined || this._writableState === undefined) { + 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 === undefined) + 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((exports2, module2) => { + var { ObjectSetPrototypeOf, Symbol: Symbol2 } = require_primordials(); + module2.exports = Transform; + var { ERR_METHOD_NOT_IMPLEMENTED } = require_errors4().codes; + var Duplex = require_duplex(); + var { getHighWaterMark } = require_state3(); + ObjectSetPrototypeOf(Transform.prototype, Duplex.prototype); + ObjectSetPrototypeOf(Transform, Duplex); + var kCallback = Symbol2("kCallback"); + function Transform(options) { + if (!(this instanceof Transform)) + return new Transform(options); + const readableHighWaterMark = options ? getHighWaterMark(this, options, "readableHighWaterMark", true) : null; + if (readableHighWaterMark === 0) { + options = { + ...options, + highWaterMark: null, + readableHighWaterMark, + writableHighWaterMark: options.writableHighWaterMark || 0 + }; + } + 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; + } + if (data != null) { + this.push(data); + } + this.push(null); + if (cb) { + cb(); + } + }); + } 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, val2) => { + if (err) { + callback(err); + return; + } + if (val2 != null) { + this.push(val2); + } + if (wState.ended || length === rState.length || rState.length < rState.highWaterMark) { + 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_passthrough2 = __commonJS((exports2, module2) => { + var { ObjectSetPrototypeOf } = require_primordials(); + module2.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_pipeline3 = __commonJS((exports2, module2) => { + var process2 = require_process(); + var { ArrayIsArray, Promise: Promise2, SymbolAsyncIterator, SymbolDispose } = require_primordials(); + var eos = require_end_of_stream(); + var { once } = require_util12(); + var destroyImpl = require_destroy2(); + var Duplex = require_duplex(); + var { + aggregateTwoErrors, + codes: { + ERR_INVALID_ARG_TYPE: ERR_INVALID_ARG_TYPE2, + ERR_INVALID_RETURN_VALUE, + ERR_MISSING_ARGS, + ERR_STREAM_DESTROYED, + ERR_STREAM_PREMATURE_CLOSE + }, + AbortError + } = require_errors4(); + var { validateFunction, validateAbortSignal } = require_validators(); + var { + isIterable, + isReadable, + isReadableNodeStream, + isNodeStream, + isTransformStream, + isWebStream, + isReadableStream, + isReadableFinished + } = require_utils6(); + var AbortController2 = globalThis.AbortController || require_abort_controller().AbortController; + var PassThrough; + var Readable; + var addAbortListener; + 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(val2) { + if (isIterable(val2)) { + return val2; + } else if (isReadableNodeStream(val2)) { + return fromReadable(val2); + } + throw new ERR_INVALID_ARG_TYPE2("val", ["Readable", "Iterable", "AsyncIterable"], val2); + } + async function* fromReadable(val2) { + if (!Readable) { + Readable = require_readable3(); + } + yield* Readable.prototype[SymbolAsyncIterator].call(val2); + } + async function pumpToNode(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); + } + } + async function pumpToWeb(readable, writable, finish, { end }) { + if (isTransformStream(writable)) { + writable = writable.writable; + } + const writer = writable.getWriter(); + try { + for await (const chunk of readable) { + await writer.ready; + writer.write(chunk).catch(() => { + }); + } + await writer.ready; + if (end) { + await writer.close(); + } + finish(); + } catch (err) { + try { + await writer.abort(err); + finish(err); + } catch (err2) { + finish(err2); + } + } + } + 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 AbortController2; + const signal = ac.signal; + const outerSignal = opts === null || opts === undefined ? undefined : opts.signal; + const lastStreamCleanup = []; + validateAbortSignal(outerSignal, "options.signal"); + function abort() { + finishImpl(new AbortError); + } + addAbortListener = addAbortListener || require_util12().addAbortListener; + let disposable; + if (outerSignal) { + disposable = addAbortListener(outerSignal, abort); + } + let error; + let value; + const destroys = []; + let finishCount = 0; + function finish(err) { + finishImpl(err, --finishCount === 0); + } + function finishImpl(err, final) { + var _disposable; + if (err && (!error || error.code === "ERR_STREAM_PREMATURE_CLOSE")) { + error = err; + } + if (!error && !final) { + return; + } + while (destroys.length) { + destroys.shift()(error); + } + (_disposable = disposable) === null || _disposable === undefined || _disposable[SymbolDispose](); + ac.abort(); + if (final) { + if (!error) { + lastStreamCleanup.forEach((fn) => fn()); + } + process2.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 === undefined ? undefined : opts.end) !== false; + const isLastStream = i === streams.length - 1; + if (isNodeStream(stream)) { + let onError2 = function(err) { + if (err && err.name !== "AbortError" && err.code !== "ERR_STREAM_PREMATURE_CLOSE") { + finish(err); + } + }; + var onError = onError2; + if (end) { + const { destroy, cleanup } = destroyer(stream, reading, writing); + destroys.push(destroy); + if (isReadable(stream) && isLastStream) { + lastStreamCleanup.push(cleanup); + } + } + stream.on("error", onError2); + if (isReadable(stream) && isLastStream) { + lastStreamCleanup.push(() => { + stream.removeListener("error", onError2); + }); + } + } + 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) || isTransformStream(stream)) { + ret = stream; + } else { + ret = Duplex.from(stream); + } + } else if (typeof stream === "function") { + if (isTransformStream(ret)) { + var _ret; + ret = makeAsyncIterable((_ret = ret) === null || _ret === undefined ? undefined : _ret.readable); + } else { + ret = makeAsyncIterable(ret); + } + ret = stream(ret, { + signal + }); + if (reading) { + if (!isIterable(ret, true)) { + throw new ERR_INVALID_RETURN_VALUE("AsyncIterable", `transform[${i - 1}]`, ret); + } + } else { + var _ret2; + if (!PassThrough) { + PassThrough = require_passthrough2(); + } + const pt = new PassThrough({ + objectMode: true + }); + const then = (_ret2 = ret) === null || _ret2 === undefined ? undefined : _ret2.then; + if (typeof then === "function") { + finishCount++; + then.call(ret, (val2) => { + value = val2; + if (val2 != null) { + pt.write(val2); + } + if (end) { + pt.end(); + } + process2.nextTick(finish); + }, (err) => { + pt.destroy(err); + process2.nextTick(finish, err); + }); + } else if (isIterable(ret, true)) { + finishCount++; + pumpToNode(ret, pt, finish, { + end + }); + } else if (isReadableStream(ret) || isTransformStream(ret)) { + const toRead = ret.readable || ret; + finishCount++; + pumpToNode(toRead, pt, finish, { + end + }); + } 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 (isTransformStream(ret) || isReadableStream(ret)) { + const toRead = ret.readable || ret; + finishCount++; + pumpToNode(toRead, stream, finish, { + end + }); + } else if (isIterable(ret)) { + finishCount++; + pumpToNode(ret, stream, finish, { + end + }); + } else { + throw new ERR_INVALID_ARG_TYPE2("val", ["Readable", "Iterable", "AsyncIterable", "ReadableStream", "TransformStream"], ret); + } + ret = stream; + } else if (isWebStream(stream)) { + if (isReadableNodeStream(ret)) { + finishCount++; + pumpToWeb(makeAsyncIterable(ret), stream, finish, { + end + }); + } else if (isReadableStream(ret) || isIterable(ret)) { + finishCount++; + pumpToWeb(ret, stream, finish, { + end + }); + } else if (isTransformStream(ret)) { + finishCount++; + pumpToWeb(ret.readable, stream, finish, { + end + }); + } else { + throw new ERR_INVALID_ARG_TYPE2("val", ["Readable", "Iterable", "AsyncIterable", "ReadableStream", "TransformStream"], ret); + } + ret = stream; + } else { + ret = Duplex.from(stream); + } + } + if (signal !== null && signal !== undefined && signal.aborted || outerSignal !== null && outerSignal !== undefined && outerSignal.aborted) { + process2.nextTick(abort); + } + return ret; + } + function pipe(src, dst, finish, { end }) { + let ended = false; + dst.on("close", () => { + if (!ended) { + finish(new ERR_STREAM_PREMATURE_CLOSE); + } + }); + src.pipe(dst, { + end: false + }); + if (end) { + let endFn2 = function() { + ended = true; + dst.end(); + }; + var endFn = endFn2; + if (isReadableFinished(src)) { + process2.nextTick(endFn2); + } else { + src.once("end", endFn2); + } + } 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); + } + module2.exports = { + pipelineImpl, + pipeline + }; +}); + +// node_modules/readable-stream/lib/internal/streams/compose.js +var require_compose = __commonJS((exports2, module2) => { + var { pipeline } = require_pipeline3(); + var Duplex = require_duplex(); + var { destroyer } = require_destroy2(); + var { + isNodeStream, + isReadable, + isWritable, + isWebStream, + isTransformStream, + isWritableStream, + isReadableStream + } = require_utils6(); + var { + AbortError, + codes: { ERR_INVALID_ARG_VALUE, ERR_MISSING_ARGS } + } = require_errors4(); + var eos = require_end_of_stream(); + module2.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]) && !isWebStream(streams[n])) { + continue; + } + if (n < streams.length - 1 && !(isReadable(streams[n]) || isReadableStream(streams[n]) || isTransformStream(streams[n]))) { + throw new ERR_INVALID_ARG_VALUE(`streams[${n}]`, orgStreams[n], "must be readable"); + } + if (n > 0 && !(isWritable(streams[n]) || isWritableStream(streams[n]) || isTransformStream(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) || isWritableStream(head) || isTransformStream(head)); + const readable = !!(isReadable(tail) || isReadableStream(tail) || isTransformStream(tail)); + d = new Duplex({ + writableObjectMode: !!(head !== null && head !== undefined && head.writableObjectMode), + readableObjectMode: !!(tail !== null && tail !== undefined && tail.readableObjectMode), + writable, + readable + }); + if (writable) { + if (isNodeStream(head)) { + 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(); + } + }); + } else if (isWebStream(head)) { + const writable2 = isTransformStream(head) ? head.writable : head; + const writer = writable2.getWriter(); + d._write = async function(chunk, encoding, callback) { + try { + await writer.ready; + writer.write(chunk).catch(() => { + }); + callback(); + } catch (err) { + callback(err); + } + }; + d._final = async function(callback) { + try { + await writer.ready; + writer.close().catch(() => { + }); + onfinish = callback; + } catch (err) { + callback(err); + } + }; + } + const toRead = isTransformStream(tail) ? tail.readable : tail; + eos(toRead, () => { + if (onfinish) { + const cb = onfinish; + onfinish = null; + cb(); + } + }); + } + if (readable) { + if (isNodeStream(tail)) { + 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; + } + } + }; + } else if (isWebStream(tail)) { + const readable2 = isTransformStream(tail) ? tail.readable : tail; + const reader = readable2.getReader(); + d._read = async function() { + while (true) { + try { + const { value, done } = await reader.read(); + if (!d.push(value)) { + return; + } + if (done) { + d.push(null); + return; + } + } catch { + 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; + if (isNodeStream(tail)) { + destroyer(tail, err); + } + } + }; + return d; + }; +}); + +// node_modules/readable-stream/lib/internal/streams/operators.js +var require_operators = __commonJS((exports2, module2) => { + var AbortController2 = globalThis.AbortController || require_abort_controller().AbortController; + var { + codes: { ERR_INVALID_ARG_VALUE, ERR_INVALID_ARG_TYPE: ERR_INVALID_ARG_TYPE2, ERR_MISSING_ARGS, ERR_OUT_OF_RANGE }, + AbortError + } = require_errors4(); + var { validateAbortSignal, validateInteger, validateObject } = require_validators(); + var kWeakHandler = require_primordials().Symbol("kWeak"); + var kResistStopPropagation = require_primordials().Symbol("kResistStopPropagation"); + var { finished } = require_end_of_stream(); + var staticCompose = require_compose(); + var { addAbortSignalNoValidate } = require_add_abort_signal(); + var { isWritable, isNodeStream } = require_utils6(); + var { deprecate } = require_util12(); + var { + ArrayPrototypePush, + Boolean: Boolean2, + MathFloor, + Number: Number2, + NumberIsNaN, + Promise: Promise2, + PromiseReject, + PromiseResolve, + PromisePrototypeThen, + Symbol: Symbol2 + } = require_primordials(); + var kEmpty = Symbol2("kEmpty"); + var kEof = Symbol2("kEof"); + function compose(stream, options) { + if (options != null) { + validateObject(options, "options"); + } + if ((options === null || options === undefined ? undefined : options.signal) != null) { + validateAbortSignal(options.signal, "options.signal"); + } + if (isNodeStream(stream) && !isWritable(stream)) { + throw new ERR_INVALID_ARG_VALUE("stream", stream, "must be writable"); + } + const composedStream = staticCompose(this, stream); + if (options !== null && options !== undefined && options.signal) { + addAbortSignalNoValidate(options.signal, composedStream); + } + return composedStream; + } + function map(fn, options) { + if (typeof fn !== "function") { + throw new ERR_INVALID_ARG_TYPE2("fn", ["Function", "AsyncFunction"], fn); + } + if (options != null) { + validateObject(options, "options"); + } + if ((options === null || options === undefined ? undefined : options.signal) != null) { + validateAbortSignal(options.signal, "options.signal"); + } + let concurrency = 1; + if ((options === null || options === undefined ? undefined : options.concurrency) != null) { + concurrency = MathFloor(options.concurrency); + } + let highWaterMark = concurrency - 1; + if ((options === null || options === undefined ? undefined : options.highWaterMark) != null) { + highWaterMark = MathFloor(options.highWaterMark); + } + validateInteger(concurrency, "options.concurrency", 1); + validateInteger(highWaterMark, "options.highWaterMark", 0); + highWaterMark += concurrency; + return async function* map() { + const signal = require_util12().AbortSignalAny([options === null || options === undefined ? undefined : options.signal].filter(Boolean2)); + const stream = this; + const queue = []; + const signalOpt = { + signal + }; + let next; + let resume; + let done = false; + let cnt = 0; + function onCatch() { + done = true; + afterItemProcessed(); + } + function afterItemProcessed() { + cnt -= 1; + maybeResume(); + } + function maybeResume() { + if (resume && !done && cnt < concurrency && queue.length < highWaterMark) { + resume(); + resume = null; + } + } + async function pump() { + try { + for await (let val2 of stream) { + if (done) { + return; + } + if (signal.aborted) { + throw new AbortError; + } + try { + val2 = fn(val2, signalOpt); + if (val2 === kEmpty) { + continue; + } + val2 = PromiseResolve(val2); + } catch (err) { + val2 = PromiseReject(err); + } + cnt += 1; + PromisePrototypeThen(val2, afterItemProcessed, onCatch); + queue.push(val2); + if (next) { + next(); + next = null; + } + if (!done && (queue.length >= highWaterMark || cnt >= concurrency)) { + await new Promise2((resolve) => { + resume = resolve; + }); + } + } + queue.push(kEof); + } catch (err) { + const val2 = PromiseReject(err); + PromisePrototypeThen(val2, afterItemProcessed, onCatch); + queue.push(val2); + } finally { + done = true; + if (next) { + next(); + next = null; + } + } + } + pump(); + try { + while (true) { + while (queue.length > 0) { + const val2 = await queue[0]; + if (val2 === kEof) { + return; + } + if (signal.aborted) { + throw new AbortError; + } + if (val2 !== kEmpty) { + yield val2; + } + queue.shift(); + maybeResume(); + } + await new Promise2((resolve) => { + next = resolve; + }); + } + } finally { + done = true; + if (resume) { + resume(); + resume = null; + } + } + }.call(this); + } + function asIndexedPairs(options = undefined) { + if (options != null) { + validateObject(options, "options"); + } + if ((options === null || options === undefined ? undefined : options.signal) != null) { + validateAbortSignal(options.signal, "options.signal"); + } + return async function* asIndexedPairs() { + let index = 0; + for await (const val2 of this) { + var _options$signal; + if (options !== null && options !== undefined && (_options$signal = options.signal) !== null && _options$signal !== undefined && _options$signal.aborted) { + throw new AbortError({ + cause: options.signal.reason + }); + } + yield [index++, val2]; + } + }.call(this); + } + async function some(fn, options = undefined) { + for await (const unused of filter.call(this, fn, options)) { + return true; + } + return false; + } + async function every(fn, options = undefined) { + if (typeof fn !== "function") { + throw new ERR_INVALID_ARG_TYPE2("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; + } + async function forEach(fn, options) { + if (typeof fn !== "function") { + throw new ERR_INVALID_ARG_TYPE2("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_TYPE2("fn", ["Function", "AsyncFunction"], fn); + } + async function filterFn(value, options2) { + if (await fn(value, options2)) { + return value; + } + return kEmpty; + } + return map.call(this, filterFn, options); + } + + class ReduceAwareErrMissingArgs 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$signal2; + if (typeof reducer !== "function") { + throw new ERR_INVALID_ARG_TYPE2("reducer", ["Function", "AsyncFunction"], reducer); + } + if (options != null) { + validateObject(options, "options"); + } + if ((options === null || options === undefined ? undefined : options.signal) != null) { + validateAbortSignal(options.signal, "options.signal"); + } + let hasInitialValue = arguments.length > 1; + if (options !== null && options !== undefined && (_options$signal2 = options.signal) !== null && _options$signal2 !== undefined && _options$signal2.aborted) { + const err = new AbortError(undefined, { + cause: options.signal.reason + }); + this.once("error", () => { + }); + await finished(this.destroy(err)); + throw err; + } + const ac = new AbortController2; + const signal = ac.signal; + if (options !== null && options !== undefined && options.signal) { + const opts = { + once: true, + [kWeakHandler]: this, + [kResistStopPropagation]: true + }; + options.signal.addEventListener("abort", () => ac.abort(), opts); + } + let gotAnyItemFromStream = false; + try { + for await (const value of this) { + var _options$signal3; + gotAnyItemFromStream = true; + if (options !== null && options !== undefined && (_options$signal3 = options.signal) !== null && _options$signal3 !== undefined && _options$signal3.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 === undefined ? undefined : options.signal) != null) { + validateAbortSignal(options.signal, "options.signal"); + } + const result = []; + for await (const val2 of this) { + var _options$signal4; + if (options !== null && options !== undefined && (_options$signal4 = options.signal) !== null && _options$signal4 !== undefined && _options$signal4.aborted) { + throw new AbortError(undefined, { + cause: options.signal.reason + }); + } + ArrayPrototypePush(result, val2); + } + return result; + } + function flatMap(fn, options) { + const values = map.call(this, fn, options); + return async function* flatMap() { + for await (const val2 of values) { + yield* val2; + } + }.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 = undefined) { + if (options != null) { + validateObject(options, "options"); + } + if ((options === null || options === undefined ? undefined : options.signal) != null) { + validateAbortSignal(options.signal, "options.signal"); + } + number = toIntegerOrInfinity(number); + return async function* drop() { + var _options$signal5; + if (options !== null && options !== undefined && (_options$signal5 = options.signal) !== null && _options$signal5 !== undefined && _options$signal5.aborted) { + throw new AbortError; + } + for await (const val2 of this) { + var _options$signal6; + if (options !== null && options !== undefined && (_options$signal6 = options.signal) !== null && _options$signal6 !== undefined && _options$signal6.aborted) { + throw new AbortError; + } + if (number-- <= 0) { + yield val2; + } + } + }.call(this); + } + function take(number, options = undefined) { + if (options != null) { + validateObject(options, "options"); + } + if ((options === null || options === undefined ? undefined : options.signal) != null) { + validateAbortSignal(options.signal, "options.signal"); + } + number = toIntegerOrInfinity(number); + return async function* take() { + var _options$signal7; + if (options !== null && options !== undefined && (_options$signal7 = options.signal) !== null && _options$signal7 !== undefined && _options$signal7.aborted) { + throw new AbortError; + } + for await (const val2 of this) { + var _options$signal8; + if (options !== null && options !== undefined && (_options$signal8 = options.signal) !== null && _options$signal8 !== undefined && _options$signal8.aborted) { + throw new AbortError; + } + if (number-- > 0) { + yield val2; + } + if (number <= 0) { + return; + } + } + }.call(this); + } + module2.exports.streamReturningOperators = { + asIndexedPairs: deprecate(asIndexedPairs, "readable.asIndexedPairs will be removed in a future version."), + drop, + filter, + flatMap, + map, + take, + compose + }; + module2.exports.promiseReturningOperators = { + every, + forEach, + reduce, + toArray, + some, + find + }; +}); + +// node_modules/readable-stream/lib/stream/promises.js +var require_promises = __commonJS((exports2, module2) => { + var { ArrayPrototypePop, Promise: Promise2 } = require_primordials(); + var { isIterable, isNodeStream, isWebStream } = require_utils6(); + var { pipelineImpl: pl } = require_pipeline3(); + var { finished } = require_end_of_stream(); + require_stream2(); + 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) && !isWebStream(lastArg)) { + const options = ArrayPrototypePop(streams); + signal = options.signal; + end = options.end; + } + pl(streams, (err, value) => { + if (err) { + reject(err); + } else { + resolve(value); + } + }, { + signal, + end + }); + }); + } + module2.exports = { + finished, + pipeline + }; +}); + +// node_modules/readable-stream/lib/stream.js +var require_stream2 = __commonJS((exports2, module2) => { + var { Buffer: Buffer2 } = require("buffer"); + var { ObjectDefineProperty, ObjectKeys, ReflectApply } = require_primordials(); + var { + promisify: { custom: customPromisify } + } = require_util12(); + var { streamReturningOperators, promiseReturningOperators } = require_operators(); + var { + codes: { ERR_ILLEGAL_CONSTRUCTOR } + } = require_errors4(); + var compose = require_compose(); + var { setDefaultHighWaterMark, getDefaultHighWaterMark } = require_state3(); + var { pipeline } = require_pipeline3(); + var { destroyer } = require_destroy2(); + var eos = require_end_of_stream(); + var promises = require_promises(); + var utils = require_utils6(); + var Stream = module2.exports = require_legacy().Stream; + Stream.isDestroyed = utils.isDestroyed; + Stream.isDisturbed = utils.isDisturbed; + Stream.isErrored = utils.isErrored; + Stream.isReadable = utils.isReadable; + Stream.isWritable = utils.isWritable; + Stream.Readable = require_readable3(); + for (const key of ObjectKeys(streamReturningOperators)) { + let fn2 = function(...args) { + if (new.target) { + throw ERR_ILLEGAL_CONSTRUCTOR(); + } + return Stream.Readable.from(ReflectApply(op, this, args)); + }; + fn = fn2; + const op = streamReturningOperators[key]; + ObjectDefineProperty(fn2, "name", { + __proto__: null, + value: op.name + }); + ObjectDefineProperty(fn2, "length", { + __proto__: null, + value: op.length + }); + ObjectDefineProperty(Stream.Readable.prototype, key, { + __proto__: null, + value: fn2, + enumerable: false, + configurable: true, + writable: true + }); + } + var fn; + for (const key of ObjectKeys(promiseReturningOperators)) { + let fn2 = function(...args) { + if (new.target) { + throw ERR_ILLEGAL_CONSTRUCTOR(); + } + return ReflectApply(op, this, args); + }; + fn = fn2; + const op = promiseReturningOperators[key]; + ObjectDefineProperty(fn2, "name", { + __proto__: null, + value: op.name + }); + ObjectDefineProperty(fn2, "length", { + __proto__: null, + value: op.length + }); + ObjectDefineProperty(Stream.Readable.prototype, key, { + __proto__: null, + value: fn2, + enumerable: false, + configurable: true, + writable: true + }); + } + var fn; + Stream.Writable = require_writable(); + Stream.Duplex = require_duplex(); + Stream.Transform = require_transform(); + Stream.PassThrough = require_passthrough2(); + Stream.pipeline = pipeline; + var { addAbortSignal } = require_add_abort_signal(); + Stream.addAbortSignal = addAbortSignal; + Stream.finished = eos; + Stream.destroy = destroyer; + Stream.compose = compose; + Stream.setDefaultHighWaterMark = setDefaultHighWaterMark; + Stream.getDefaultHighWaterMark = getDefaultHighWaterMark; + ObjectDefineProperty(Stream, "promises", { + __proto__: null, + configurable: true, + enumerable: true, + get() { + return promises; + } + }); + ObjectDefineProperty(pipeline, customPromisify, { + __proto__: null, + enumerable: true, + get() { + return promises.pipeline; + } + }); + ObjectDefineProperty(eos, customPromisify, { + __proto__: null, + enumerable: true, + get() { + return promises.finished; + } + }); + Stream.Stream = Stream; + Stream._isUint8Array = function isUint8Array(value) { + return value instanceof Uint8Array; + }; + Stream._uint8ArrayToBuffer = function _uint8ArrayToBuffer(chunk) { + return Buffer2.from(chunk.buffer, chunk.byteOffset, chunk.byteLength); + }; +}); + +// node_modules/readable-stream/lib/ours/index.js +var require_ours = __commonJS((exports2, module2) => { + var Stream = require("stream"); + if (Stream && process.env.READABLE_STREAM === "disable") { + const promises = Stream.promises; + module2.exports._uint8ArrayToBuffer = Stream._uint8ArrayToBuffer; + module2.exports._isUint8Array = Stream._isUint8Array; + module2.exports.isDisturbed = Stream.isDisturbed; + module2.exports.isErrored = Stream.isErrored; + module2.exports.isReadable = Stream.isReadable; + module2.exports.Readable = Stream.Readable; + module2.exports.Writable = Stream.Writable; + module2.exports.Duplex = Stream.Duplex; + module2.exports.Transform = Stream.Transform; + module2.exports.PassThrough = Stream.PassThrough; + module2.exports.addAbortSignal = Stream.addAbortSignal; + module2.exports.finished = Stream.finished; + module2.exports.destroy = Stream.destroy; + module2.exports.pipeline = Stream.pipeline; + module2.exports.compose = Stream.compose; + Object.defineProperty(Stream, "promises", { + configurable: true, + enumerable: true, + get() { + return promises; + } + }); + module2.exports.Stream = Stream.Stream; + } else { + const CustomStream = require_stream2(); + const promises = require_promises(); + const originalDestroy = CustomStream.Readable.destroy; + module2.exports = CustomStream.Readable; + module2.exports._uint8ArrayToBuffer = CustomStream._uint8ArrayToBuffer; + module2.exports._isUint8Array = CustomStream._isUint8Array; + module2.exports.isDisturbed = CustomStream.isDisturbed; + module2.exports.isErrored = CustomStream.isErrored; + module2.exports.isReadable = CustomStream.isReadable; + module2.exports.Readable = CustomStream.Readable; + module2.exports.Writable = CustomStream.Writable; + module2.exports.Duplex = CustomStream.Duplex; + module2.exports.Transform = CustomStream.Transform; + module2.exports.PassThrough = CustomStream.PassThrough; + module2.exports.addAbortSignal = CustomStream.addAbortSignal; + module2.exports.finished = CustomStream.finished; + module2.exports.destroy = CustomStream.destroy; + module2.exports.destroy = originalDestroy; + module2.exports.pipeline = CustomStream.pipeline; + module2.exports.compose = CustomStream.compose; + Object.defineProperty(CustomStream, "promises", { + configurable: true, + enumerable: true, + get() { + return promises; + } + }); + module2.exports.Stream = CustomStream.Stream; + } + module2.exports.default = module2.exports; +}); + +// node_modules/lodash/_arrayPush.js +var require__arrayPush = __commonJS((exports2, module2) => { + function arrayPush(array, values) { + var index = -1, length = values.length, offset = array.length; + while (++index < length) { + array[offset + index] = values[index]; + } + return array; + } + module2.exports = arrayPush; +}); + +// node_modules/lodash/_isFlattenable.js +var require__isFlattenable = __commonJS((exports2, module2) => { + var Symbol2 = require__Symbol(); + var isArguments = require_isArguments(); + var isArray = require_isArray(); + var spreadableSymbol = Symbol2 ? Symbol2.isConcatSpreadable : undefined; + function isFlattenable(value) { + return isArray(value) || isArguments(value) || !!(spreadableSymbol && value && value[spreadableSymbol]); + } + module2.exports = isFlattenable; +}); + +// node_modules/lodash/_baseFlatten.js +var require__baseFlatten = __commonJS((exports2, module2) => { + var arrayPush = require__arrayPush(); + var isFlattenable = require__isFlattenable(); + function baseFlatten(array, depth, predicate, isStrict, result) { + var index = -1, length = array.length; + predicate || (predicate = isFlattenable); + result || (result = []); + while (++index < length) { + var value = array[index]; + if (depth > 0 && predicate(value)) { + if (depth > 1) { + baseFlatten(value, depth - 1, predicate, isStrict, result); + } else { + arrayPush(result, value); + } + } else if (!isStrict) { + result[result.length] = value; + } + } + return result; + } + module2.exports = baseFlatten; +}); + +// node_modules/lodash/flatten.js +var require_flatten = __commonJS((exports2, module2) => { + var baseFlatten = require__baseFlatten(); + function flatten(array) { + var length = array == null ? 0 : array.length; + return length ? baseFlatten(array, 1) : []; + } + module2.exports = flatten; +}); + +// node_modules/lodash/_nativeCreate.js +var require__nativeCreate = __commonJS((exports2, module2) => { + var getNative = require__getNative(); + var nativeCreate = getNative(Object, "create"); + module2.exports = nativeCreate; +}); + +// node_modules/lodash/_hashClear.js +var require__hashClear = __commonJS((exports2, module2) => { + var nativeCreate = require__nativeCreate(); + function hashClear() { + this.__data__ = nativeCreate ? nativeCreate(null) : {}; + this.size = 0; + } + module2.exports = hashClear; +}); + +// node_modules/lodash/_hashDelete.js +var require__hashDelete = __commonJS((exports2, module2) => { + function hashDelete(key) { + var result = this.has(key) && delete this.__data__[key]; + this.size -= result ? 1 : 0; + return result; + } + module2.exports = hashDelete; +}); + +// node_modules/lodash/_hashGet.js +var require__hashGet = __commonJS((exports2, module2) => { + var nativeCreate = require__nativeCreate(); + var HASH_UNDEFINED = "__lodash_hash_undefined__"; + var objectProto = Object.prototype; + var hasOwnProperty = objectProto.hasOwnProperty; + function hashGet(key) { + var data = this.__data__; + if (nativeCreate) { + var result = data[key]; + return result === HASH_UNDEFINED ? undefined : result; + } + return hasOwnProperty.call(data, key) ? data[key] : undefined; + } + module2.exports = hashGet; +}); + +// node_modules/lodash/_hashHas.js +var require__hashHas = __commonJS((exports2, module2) => { + var nativeCreate = require__nativeCreate(); + var objectProto = Object.prototype; + var hasOwnProperty = objectProto.hasOwnProperty; + function hashHas(key) { + var data = this.__data__; + return nativeCreate ? data[key] !== undefined : hasOwnProperty.call(data, key); + } + module2.exports = hashHas; +}); + +// node_modules/lodash/_hashSet.js +var require__hashSet = __commonJS((exports2, module2) => { + var nativeCreate = require__nativeCreate(); + var HASH_UNDEFINED = "__lodash_hash_undefined__"; + function hashSet(key, value) { + var data = this.__data__; + this.size += this.has(key) ? 0 : 1; + data[key] = nativeCreate && value === undefined ? HASH_UNDEFINED : value; + return this; + } + module2.exports = hashSet; +}); + +// node_modules/lodash/_Hash.js +var require__Hash = __commonJS((exports2, module2) => { + var hashClear = require__hashClear(); + var hashDelete = require__hashDelete(); + var hashGet = require__hashGet(); + var hashHas = require__hashHas(); + var hashSet = require__hashSet(); + function Hash(entries) { + var index = -1, length = entries == null ? 0 : entries.length; + this.clear(); + while (++index < length) { + var entry = entries[index]; + this.set(entry[0], entry[1]); + } + } + Hash.prototype.clear = hashClear; + Hash.prototype["delete"] = hashDelete; + Hash.prototype.get = hashGet; + Hash.prototype.has = hashHas; + Hash.prototype.set = hashSet; + module2.exports = Hash; +}); + +// node_modules/lodash/_listCacheClear.js +var require__listCacheClear = __commonJS((exports2, module2) => { + function listCacheClear() { + this.__data__ = []; + this.size = 0; + } + module2.exports = listCacheClear; +}); + +// node_modules/lodash/_assocIndexOf.js +var require__assocIndexOf = __commonJS((exports2, module2) => { + var eq = require_eq(); + function assocIndexOf(array, key) { + var length = array.length; + while (length--) { + if (eq(array[length][0], key)) { + return length; + } + } + return -1; + } + module2.exports = assocIndexOf; +}); + +// node_modules/lodash/_listCacheDelete.js +var require__listCacheDelete = __commonJS((exports2, module2) => { + var assocIndexOf = require__assocIndexOf(); + var arrayProto = Array.prototype; + var splice = arrayProto.splice; + function listCacheDelete(key) { + var data = this.__data__, index = assocIndexOf(data, key); + if (index < 0) { + return false; + } + var lastIndex = data.length - 1; + if (index == lastIndex) { + data.pop(); + } else { + splice.call(data, index, 1); + } + --this.size; + return true; + } + module2.exports = listCacheDelete; +}); + +// node_modules/lodash/_listCacheGet.js +var require__listCacheGet = __commonJS((exports2, module2) => { + var assocIndexOf = require__assocIndexOf(); + function listCacheGet(key) { + var data = this.__data__, index = assocIndexOf(data, key); + return index < 0 ? undefined : data[index][1]; + } + module2.exports = listCacheGet; +}); + +// node_modules/lodash/_listCacheHas.js +var require__listCacheHas = __commonJS((exports2, module2) => { + var assocIndexOf = require__assocIndexOf(); + function listCacheHas(key) { + return assocIndexOf(this.__data__, key) > -1; + } + module2.exports = listCacheHas; +}); + +// node_modules/lodash/_listCacheSet.js +var require__listCacheSet = __commonJS((exports2, module2) => { + var assocIndexOf = require__assocIndexOf(); + function listCacheSet(key, value) { + var data = this.__data__, index = assocIndexOf(data, key); + if (index < 0) { + ++this.size; + data.push([key, value]); + } else { + data[index][1] = value; + } + return this; + } + module2.exports = listCacheSet; +}); + +// node_modules/lodash/_ListCache.js +var require__ListCache = __commonJS((exports2, module2) => { + var listCacheClear = require__listCacheClear(); + var listCacheDelete = require__listCacheDelete(); + var listCacheGet = require__listCacheGet(); + var listCacheHas = require__listCacheHas(); + var listCacheSet = require__listCacheSet(); + function ListCache(entries) { + var index = -1, length = entries == null ? 0 : entries.length; + this.clear(); + while (++index < length) { + var entry = entries[index]; + this.set(entry[0], entry[1]); + } + } + ListCache.prototype.clear = listCacheClear; + ListCache.prototype["delete"] = listCacheDelete; + ListCache.prototype.get = listCacheGet; + ListCache.prototype.has = listCacheHas; + ListCache.prototype.set = listCacheSet; + module2.exports = ListCache; +}); + +// node_modules/lodash/_Map.js +var require__Map = __commonJS((exports2, module2) => { + var getNative = require__getNative(); + var root = require__root(); + var Map2 = getNative(root, "Map"); + module2.exports = Map2; +}); + +// node_modules/lodash/_mapCacheClear.js +var require__mapCacheClear = __commonJS((exports2, module2) => { + var Hash = require__Hash(); + var ListCache = require__ListCache(); + var Map2 = require__Map(); + function mapCacheClear() { + this.size = 0; + this.__data__ = { + hash: new Hash, + map: new (Map2 || ListCache), + string: new Hash + }; + } + module2.exports = mapCacheClear; +}); + +// node_modules/lodash/_isKeyable.js +var require__isKeyable = __commonJS((exports2, module2) => { + function isKeyable(value) { + var type = typeof value; + return type == "string" || type == "number" || type == "symbol" || type == "boolean" ? value !== "__proto__" : value === null; + } + module2.exports = isKeyable; +}); + +// node_modules/lodash/_getMapData.js +var require__getMapData = __commonJS((exports2, module2) => { + var isKeyable = require__isKeyable(); + function getMapData(map, key) { + var data = map.__data__; + return isKeyable(key) ? data[typeof key == "string" ? "string" : "hash"] : data.map; + } + module2.exports = getMapData; +}); + +// node_modules/lodash/_mapCacheDelete.js +var require__mapCacheDelete = __commonJS((exports2, module2) => { + var getMapData = require__getMapData(); + function mapCacheDelete(key) { + var result = getMapData(this, key)["delete"](key); + this.size -= result ? 1 : 0; + return result; + } + module2.exports = mapCacheDelete; +}); + +// node_modules/lodash/_mapCacheGet.js +var require__mapCacheGet = __commonJS((exports2, module2) => { + var getMapData = require__getMapData(); + function mapCacheGet(key) { + return getMapData(this, key).get(key); + } + module2.exports = mapCacheGet; +}); + +// node_modules/lodash/_mapCacheHas.js +var require__mapCacheHas = __commonJS((exports2, module2) => { + var getMapData = require__getMapData(); + function mapCacheHas(key) { + return getMapData(this, key).has(key); + } + module2.exports = mapCacheHas; +}); + +// node_modules/lodash/_mapCacheSet.js +var require__mapCacheSet = __commonJS((exports2, module2) => { + var getMapData = require__getMapData(); + function mapCacheSet(key, value) { + var data = getMapData(this, key), size = data.size; + data.set(key, value); + this.size += data.size == size ? 0 : 1; + return this; + } + module2.exports = mapCacheSet; +}); + +// node_modules/lodash/_MapCache.js +var require__MapCache = __commonJS((exports2, module2) => { + var mapCacheClear = require__mapCacheClear(); + var mapCacheDelete = require__mapCacheDelete(); + var mapCacheGet = require__mapCacheGet(); + var mapCacheHas = require__mapCacheHas(); + var mapCacheSet = require__mapCacheSet(); + function MapCache(entries) { + var index = -1, length = entries == null ? 0 : entries.length; + this.clear(); + while (++index < length) { + var entry = entries[index]; + this.set(entry[0], entry[1]); + } + } + MapCache.prototype.clear = mapCacheClear; + MapCache.prototype["delete"] = mapCacheDelete; + MapCache.prototype.get = mapCacheGet; + MapCache.prototype.has = mapCacheHas; + MapCache.prototype.set = mapCacheSet; + module2.exports = MapCache; +}); + +// node_modules/lodash/_setCacheAdd.js +var require__setCacheAdd = __commonJS((exports2, module2) => { + var HASH_UNDEFINED = "__lodash_hash_undefined__"; + function setCacheAdd(value) { + this.__data__.set(value, HASH_UNDEFINED); + return this; + } + module2.exports = setCacheAdd; +}); + +// node_modules/lodash/_setCacheHas.js +var require__setCacheHas = __commonJS((exports2, module2) => { + function setCacheHas(value) { + return this.__data__.has(value); + } + module2.exports = setCacheHas; +}); + +// node_modules/lodash/_SetCache.js +var require__SetCache = __commonJS((exports2, module2) => { + var MapCache = require__MapCache(); + var setCacheAdd = require__setCacheAdd(); + var setCacheHas = require__setCacheHas(); + function SetCache(values) { + var index = -1, length = values == null ? 0 : values.length; + this.__data__ = new MapCache; + while (++index < length) { + this.add(values[index]); + } + } + SetCache.prototype.add = SetCache.prototype.push = setCacheAdd; + SetCache.prototype.has = setCacheHas; + module2.exports = SetCache; +}); + +// node_modules/lodash/_baseFindIndex.js +var require__baseFindIndex = __commonJS((exports2, module2) => { + function baseFindIndex(array, predicate, fromIndex, fromRight) { + var length = array.length, index = fromIndex + (fromRight ? 1 : -1); + while (fromRight ? index-- : ++index < length) { + if (predicate(array[index], index, array)) { + return index; + } + } + return -1; + } + module2.exports = baseFindIndex; +}); + +// node_modules/lodash/_baseIsNaN.js +var require__baseIsNaN = __commonJS((exports2, module2) => { + function baseIsNaN(value) { + return value !== value; + } + module2.exports = baseIsNaN; +}); + +// node_modules/lodash/_strictIndexOf.js +var require__strictIndexOf = __commonJS((exports2, module2) => { + function strictIndexOf(array, value, fromIndex) { + var index = fromIndex - 1, length = array.length; + while (++index < length) { + if (array[index] === value) { + return index; + } + } + return -1; + } + module2.exports = strictIndexOf; +}); + +// node_modules/lodash/_baseIndexOf.js +var require__baseIndexOf = __commonJS((exports2, module2) => { + var baseFindIndex = require__baseFindIndex(); + var baseIsNaN = require__baseIsNaN(); + var strictIndexOf = require__strictIndexOf(); + function baseIndexOf(array, value, fromIndex) { + return value === value ? strictIndexOf(array, value, fromIndex) : baseFindIndex(array, baseIsNaN, fromIndex); + } + module2.exports = baseIndexOf; +}); + +// node_modules/lodash/_arrayIncludes.js +var require__arrayIncludes = __commonJS((exports2, module2) => { + var baseIndexOf = require__baseIndexOf(); + function arrayIncludes(array, value) { + var length = array == null ? 0 : array.length; + return !!length && baseIndexOf(array, value, 0) > -1; + } + module2.exports = arrayIncludes; +}); + +// node_modules/lodash/_arrayIncludesWith.js +var require__arrayIncludesWith = __commonJS((exports2, module2) => { + function arrayIncludesWith(array, value, comparator) { + var index = -1, length = array == null ? 0 : array.length; + while (++index < length) { + if (comparator(value, array[index])) { + return true; + } + } + return false; + } + module2.exports = arrayIncludesWith; +}); + +// node_modules/lodash/_arrayMap.js +var require__arrayMap = __commonJS((exports2, module2) => { + function arrayMap(array, iteratee) { + var index = -1, length = array == null ? 0 : array.length, result = Array(length); + while (++index < length) { + result[index] = iteratee(array[index], index, array); + } + return result; + } + module2.exports = arrayMap; +}); + +// node_modules/lodash/_cacheHas.js +var require__cacheHas = __commonJS((exports2, module2) => { + function cacheHas(cache, key) { + return cache.has(key); + } + module2.exports = cacheHas; +}); + +// node_modules/lodash/_baseDifference.js +var require__baseDifference = __commonJS((exports2, module2) => { + var SetCache = require__SetCache(); + var arrayIncludes = require__arrayIncludes(); + var arrayIncludesWith = require__arrayIncludesWith(); + var arrayMap = require__arrayMap(); + var baseUnary = require__baseUnary(); + var cacheHas = require__cacheHas(); + var LARGE_ARRAY_SIZE = 200; + function baseDifference(array, values, iteratee, comparator) { + var index = -1, includes = arrayIncludes, isCommon = true, length = array.length, result = [], valuesLength = values.length; + if (!length) { + return result; + } + if (iteratee) { + values = arrayMap(values, baseUnary(iteratee)); + } + if (comparator) { + includes = arrayIncludesWith; + isCommon = false; + } else if (values.length >= LARGE_ARRAY_SIZE) { + includes = cacheHas; + isCommon = false; + values = new SetCache(values); + } + outer: + while (++index < length) { + var value = array[index], computed = iteratee == null ? value : iteratee(value); + value = comparator || value !== 0 ? value : 0; + if (isCommon && computed === computed) { + var valuesIndex = valuesLength; + while (valuesIndex--) { + if (values[valuesIndex] === computed) { + continue outer; + } + } + result.push(value); + } else if (!includes(values, computed, comparator)) { + result.push(value); + } + } + return result; + } + module2.exports = baseDifference; +}); + +// node_modules/lodash/isArrayLikeObject.js +var require_isArrayLikeObject = __commonJS((exports2, module2) => { + var isArrayLike = require_isArrayLike(); + var isObjectLike = require_isObjectLike(); + function isArrayLikeObject(value) { + return isObjectLike(value) && isArrayLike(value); + } + module2.exports = isArrayLikeObject; +}); + +// node_modules/lodash/difference.js +var require_difference = __commonJS((exports2, module2) => { + var baseDifference = require__baseDifference(); + var baseFlatten = require__baseFlatten(); + var baseRest = require__baseRest(); + var isArrayLikeObject = require_isArrayLikeObject(); + var difference = baseRest(function(array, values) { + return isArrayLikeObject(array) ? baseDifference(array, baseFlatten(values, 1, isArrayLikeObject, true)) : []; + }); + module2.exports = difference; +}); + +// node_modules/lodash/_Set.js +var require__Set = __commonJS((exports2, module2) => { + var getNative = require__getNative(); + var root = require__root(); + var Set2 = getNative(root, "Set"); + module2.exports = Set2; +}); + +// node_modules/lodash/noop.js +var require_noop = __commonJS((exports2, module2) => { + function noop() { + } + module2.exports = noop; +}); + +// node_modules/lodash/_setToArray.js +var require__setToArray = __commonJS((exports2, module2) => { + function setToArray(set) { + var index = -1, result = Array(set.size); + set.forEach(function(value) { + result[++index] = value; + }); + return result; + } + module2.exports = setToArray; +}); + +// node_modules/lodash/_createSet.js +var require__createSet = __commonJS((exports2, module2) => { + var Set2 = require__Set(); + var noop = require_noop(); + var setToArray = require__setToArray(); + var INFINITY = 1 / 0; + var createSet = !(Set2 && 1 / setToArray(new Set2([, -0]))[1] == INFINITY) ? noop : function(values) { + return new Set2(values); + }; + module2.exports = createSet; +}); + +// node_modules/lodash/_baseUniq.js +var require__baseUniq = __commonJS((exports2, module2) => { + var SetCache = require__SetCache(); + var arrayIncludes = require__arrayIncludes(); + var arrayIncludesWith = require__arrayIncludesWith(); + var cacheHas = require__cacheHas(); + var createSet = require__createSet(); + var setToArray = require__setToArray(); + var LARGE_ARRAY_SIZE = 200; + function baseUniq(array, iteratee, comparator) { + var index = -1, includes = arrayIncludes, length = array.length, isCommon = true, result = [], seen = result; + if (comparator) { + isCommon = false; + includes = arrayIncludesWith; + } else if (length >= LARGE_ARRAY_SIZE) { + var set = iteratee ? null : createSet(array); + if (set) { + return setToArray(set); + } + isCommon = false; + includes = cacheHas; + seen = new SetCache; + } else { + seen = iteratee ? [] : result; + } + outer: + while (++index < length) { + var value = array[index], computed = iteratee ? iteratee(value) : value; + value = comparator || value !== 0 ? value : 0; + if (isCommon && computed === computed) { + var seenIndex = seen.length; + while (seenIndex--) { + if (seen[seenIndex] === computed) { + continue outer; + } + } + if (iteratee) { + seen.push(computed); + } + result.push(value); + } else if (!includes(seen, computed, comparator)) { + if (seen !== result) { + seen.push(computed); + } + result.push(value); + } + } + return result; + } + module2.exports = baseUniq; +}); + +// node_modules/lodash/union.js +var require_union = __commonJS((exports2, module2) => { + var baseFlatten = require__baseFlatten(); + var baseRest = require__baseRest(); + var baseUniq = require__baseUniq(); + var isArrayLikeObject = require_isArrayLikeObject(); + var union = baseRest(function(arrays) { + return baseUniq(baseFlatten(arrays, 1, isArrayLikeObject, true)); + }); + module2.exports = union; +}); + +// node_modules/lodash/_overArg.js +var require__overArg = __commonJS((exports2, module2) => { + function overArg(func, transform) { + return function(arg) { + return func(transform(arg)); + }; + } + module2.exports = overArg; +}); + +// node_modules/lodash/_getPrototype.js +var require__getPrototype = __commonJS((exports2, module2) => { + var overArg = require__overArg(); + var getPrototype = overArg(Object.getPrototypeOf, Object); + module2.exports = getPrototype; +}); + +// node_modules/lodash/isPlainObject.js +var require_isPlainObject = __commonJS((exports2, module2) => { + var baseGetTag = require__baseGetTag(); + var getPrototype = require__getPrototype(); + var isObjectLike = require_isObjectLike(); + var objectTag = "[object Object]"; + var funcProto = Function.prototype; + var objectProto = Object.prototype; + var funcToString = funcProto.toString; + var hasOwnProperty = objectProto.hasOwnProperty; + var objectCtorString = funcToString.call(Object); + function isPlainObject(value) { + if (!isObjectLike(value) || baseGetTag(value) != objectTag) { + return false; + } + var proto = getPrototype(value); + if (proto === null) { + return true; + } + var Ctor = hasOwnProperty.call(proto, "constructor") && proto.constructor; + return typeof Ctor == "function" && Ctor instanceof Ctor && funcToString.call(Ctor) == objectCtorString; + } + module2.exports = isPlainObject; +}); + +// node_modules/glob/node_modules/minimatch/dist/commonjs/assert-valid-pattern.js +var require_assert_valid_pattern = __commonJS((exports2) => { + Object.defineProperty(exports2, "__esModule", { value: true }); + exports2.assertValidPattern = undefined; + var MAX_PATTERN_LENGTH = 1024 * 64; + var assertValidPattern = (pattern) => { + if (typeof pattern !== "string") { + throw new TypeError("invalid pattern"); + } + if (pattern.length > MAX_PATTERN_LENGTH) { + throw new TypeError("pattern is too long"); + } + }; + exports2.assertValidPattern = assertValidPattern; +}); + +// node_modules/glob/node_modules/minimatch/dist/commonjs/brace-expressions.js +var require_brace_expressions = __commonJS((exports2) => { + Object.defineProperty(exports2, "__esModule", { value: true }); + exports2.parseClass = undefined; + var posixClasses = { + "[:alnum:]": ["\\p{L}\\p{Nl}\\p{Nd}", true], + "[:alpha:]": ["\\p{L}\\p{Nl}", true], + "[:ascii:]": ["\\x" + "00-\\x" + "7f", false], + "[:blank:]": ["\\p{Zs}\\t", true], + "[:cntrl:]": ["\\p{Cc}", true], + "[:digit:]": ["\\p{Nd}", true], + "[:graph:]": ["\\p{Z}\\p{C}", true, true], + "[:lower:]": ["\\p{Ll}", true], + "[:print:]": ["\\p{C}", true], + "[:punct:]": ["\\p{P}", true], + "[:space:]": ["\\p{Z}\\t\\r\\n\\v\\f", true], + "[:upper:]": ["\\p{Lu}", true], + "[:word:]": ["\\p{L}\\p{Nl}\\p{Nd}\\p{Pc}", true], + "[:xdigit:]": ["A-Fa-f0-9", false] + }; + var braceEscape = (s) => s.replace(/[[\]\\-]/g, "\\$&"); + var regexpEscape = (s) => s.replace(/[-[\]{}()*+?.,\\^$|#\s]/g, "\\$&"); + var rangesToString = (ranges) => ranges.join(""); + var parseClass = (glob, position) => { + const pos = position; + if (glob.charAt(pos) !== "[") { + throw new Error("not in a brace expression"); + } + const ranges = []; + const negs = []; + let i = pos + 1; + let sawStart = false; + let uflag = false; + let escaping = false; + let negate = false; + let endPos = pos; + let rangeStart = ""; + WHILE: + while (i < glob.length) { + const c = glob.charAt(i); + if ((c === "!" || c === "^") && i === pos + 1) { + negate = true; + i++; + continue; + } + if (c === "]" && sawStart && !escaping) { + endPos = i + 1; + break; + } + sawStart = true; + if (c === "\\") { + if (!escaping) { + escaping = true; + i++; + continue; + } + } + if (c === "[" && !escaping) { + for (const [cls, [unip, u, neg]] of Object.entries(posixClasses)) { + if (glob.startsWith(cls, i)) { + if (rangeStart) { + return ["$.", false, glob.length - pos, true]; + } + i += cls.length; + if (neg) + negs.push(unip); + else + ranges.push(unip); + uflag = uflag || u; + continue WHILE; + } + } + } + escaping = false; + if (rangeStart) { + if (c > rangeStart) { + ranges.push(braceEscape(rangeStart) + "-" + braceEscape(c)); + } else if (c === rangeStart) { + ranges.push(braceEscape(c)); + } + rangeStart = ""; + i++; + continue; + } + if (glob.startsWith("-]", i + 1)) { + ranges.push(braceEscape(c + "-")); + i += 2; + continue; + } + if (glob.startsWith("-", i + 1)) { + rangeStart = c; + i += 2; + continue; + } + ranges.push(braceEscape(c)); + i++; + } + if (endPos < i) { + return ["", false, 0, false]; + } + if (!ranges.length && !negs.length) { + return ["$.", false, glob.length - pos, true]; + } + if (negs.length === 0 && ranges.length === 1 && /^\\?.$/.test(ranges[0]) && !negate) { + const r = ranges[0].length === 2 ? ranges[0].slice(-1) : ranges[0]; + return [regexpEscape(r), false, endPos - pos, false]; + } + const sranges = "[" + (negate ? "^" : "") + rangesToString(ranges) + "]"; + const snegs = "[" + (negate ? "" : "^") + rangesToString(negs) + "]"; + const comb = ranges.length && negs.length ? "(" + sranges + "|" + snegs + ")" : ranges.length ? sranges : snegs; + return [comb, uflag, endPos - pos, true]; + }; + exports2.parseClass = parseClass; +}); + +// node_modules/glob/node_modules/minimatch/dist/commonjs/unescape.js +var require_unescape = __commonJS((exports2) => { + Object.defineProperty(exports2, "__esModule", { value: true }); + exports2.unescape = undefined; + var unescape = (s, { windowsPathsNoEscape = false } = {}) => { + return windowsPathsNoEscape ? s.replace(/\[([^\/\\])\]/g, "$1") : s.replace(/((?!\\).|^)\[([^\/\\])\]/g, "$1$2").replace(/\\([^\/])/g, "$1"); + }; + exports2.unescape = unescape; +}); + +// node_modules/glob/node_modules/minimatch/dist/commonjs/ast.js +var require_ast = __commonJS((exports2) => { + Object.defineProperty(exports2, "__esModule", { value: true }); + exports2.AST = undefined; + var brace_expressions_js_1 = require_brace_expressions(); + var unescape_js_1 = require_unescape(); + var types = new Set(["!", "?", "+", "*", "@"]); + var isExtglobType = (c) => types.has(c); + var startNoTraversal = "(?!(?:^|/)\\.\\.?(?:$|/))"; + var startNoDot = "(?!\\.)"; + var addPatternStart = new Set(["[", "."]); + var justDots = new Set(["..", "."]); + var reSpecials = new Set("().*{}+?[]^$\\!"); + var regExpEscape = (s) => s.replace(/[-[\]{}()*+?.,\\^$|#\s]/g, "\\$&"); + var qmark = "[^/]"; + var star = qmark + "*?"; + var starNoEmpty = qmark + "+?"; + + class AST { + type; + #root; + #hasMagic; + #uflag = false; + #parts = []; + #parent; + #parentIndex; + #negs; + #filledNegs = false; + #options; + #toString; + #emptyExt = false; + constructor(type, parent, options = {}) { + this.type = type; + if (type) + this.#hasMagic = true; + this.#parent = parent; + this.#root = this.#parent ? this.#parent.#root : this; + this.#options = this.#root === this ? options : this.#root.#options; + this.#negs = this.#root === this ? [] : this.#root.#negs; + if (type === "!" && !this.#root.#filledNegs) + this.#negs.push(this); + this.#parentIndex = this.#parent ? this.#parent.#parts.length : 0; + } + get hasMagic() { + if (this.#hasMagic !== undefined) + return this.#hasMagic; + for (const p of this.#parts) { + if (typeof p === "string") + continue; + if (p.type || p.hasMagic) + return this.#hasMagic = true; + } + return this.#hasMagic; + } + toString() { + if (this.#toString !== undefined) + return this.#toString; + if (!this.type) { + return this.#toString = this.#parts.map((p) => String(p)).join(""); + } else { + return this.#toString = this.type + "(" + this.#parts.map((p) => String(p)).join("|") + ")"; + } + } + #fillNegs() { + if (this !== this.#root) + throw new Error("should only call on root"); + if (this.#filledNegs) + return this; + this.toString(); + this.#filledNegs = true; + let n; + while (n = this.#negs.pop()) { + if (n.type !== "!") + continue; + let p = n; + let pp = p.#parent; + while (pp) { + for (let i = p.#parentIndex + 1;!pp.type && i < pp.#parts.length; i++) { + for (const part of n.#parts) { + if (typeof part === "string") { + throw new Error("string part in extglob AST??"); + } + part.copyIn(pp.#parts[i]); + } + } + p = pp; + pp = p.#parent; + } + } + return this; + } + push(...parts) { + for (const p of parts) { + if (p === "") + continue; + if (typeof p !== "string" && !(p instanceof AST && p.#parent === this)) { + throw new Error("invalid part: " + p); + } + this.#parts.push(p); + } + } + toJSON() { + const ret = this.type === null ? this.#parts.slice().map((p) => typeof p === "string" ? p : p.toJSON()) : [this.type, ...this.#parts.map((p) => p.toJSON())]; + if (this.isStart() && !this.type) + ret.unshift([]); + if (this.isEnd() && (this === this.#root || this.#root.#filledNegs && this.#parent?.type === "!")) { + ret.push({}); + } + return ret; + } + isStart() { + if (this.#root === this) + return true; + if (!this.#parent?.isStart()) + return false; + if (this.#parentIndex === 0) + return true; + const p = this.#parent; + for (let i = 0;i < this.#parentIndex; i++) { + const pp = p.#parts[i]; + if (!(pp instanceof AST && pp.type === "!")) { + return false; + } + } + return true; + } + isEnd() { + if (this.#root === this) + return true; + if (this.#parent?.type === "!") + return true; + if (!this.#parent?.isEnd()) + return false; + if (!this.type) + return this.#parent?.isEnd(); + const pl = this.#parent ? this.#parent.#parts.length : 0; + return this.#parentIndex === pl - 1; + } + copyIn(part) { + if (typeof part === "string") + this.push(part); + else + this.push(part.clone(this)); + } + clone(parent) { + const c = new AST(this.type, parent); + for (const p of this.#parts) { + c.copyIn(p); + } + return c; + } + static #parseAST(str, ast, pos, opt) { + let escaping = false; + let inBrace = false; + let braceStart = -1; + let braceNeg = false; + if (ast.type === null) { + let i2 = pos; + let acc2 = ""; + while (i2 < str.length) { + const c = str.charAt(i2++); + if (escaping || c === "\\") { + escaping = !escaping; + acc2 += c; + continue; + } + if (inBrace) { + if (i2 === braceStart + 1) { + if (c === "^" || c === "!") { + braceNeg = true; + } + } else if (c === "]" && !(i2 === braceStart + 2 && braceNeg)) { + inBrace = false; + } + acc2 += c; + continue; + } else if (c === "[") { + inBrace = true; + braceStart = i2; + braceNeg = false; + acc2 += c; + continue; + } + if (!opt.noext && isExtglobType(c) && str.charAt(i2) === "(") { + ast.push(acc2); + acc2 = ""; + const ext = new AST(c, ast); + i2 = AST.#parseAST(str, ext, i2, opt); + ast.push(ext); + continue; + } + acc2 += c; + } + ast.push(acc2); + return i2; + } + let i = pos + 1; + let part = new AST(null, ast); + const parts = []; + let acc = ""; + while (i < str.length) { + const c = str.charAt(i++); + if (escaping || c === "\\") { + escaping = !escaping; + acc += c; + continue; + } + if (inBrace) { + if (i === braceStart + 1) { + if (c === "^" || c === "!") { + braceNeg = true; + } + } else if (c === "]" && !(i === braceStart + 2 && braceNeg)) { + inBrace = false; + } + acc += c; + continue; + } else if (c === "[") { + inBrace = true; + braceStart = i; + braceNeg = false; + acc += c; + continue; + } + if (isExtglobType(c) && str.charAt(i) === "(") { + part.push(acc); + acc = ""; + const ext = new AST(c, part); + part.push(ext); + i = AST.#parseAST(str, ext, i, opt); + continue; + } + if (c === "|") { + part.push(acc); + acc = ""; + parts.push(part); + part = new AST(null, ast); + continue; + } + if (c === ")") { + if (acc === "" && ast.#parts.length === 0) { + ast.#emptyExt = true; + } + part.push(acc); + acc = ""; + ast.push(...parts, part); + return i; + } + acc += c; + } + ast.type = null; + ast.#hasMagic = undefined; + ast.#parts = [str.substring(pos - 1)]; + return i; + } + static fromGlob(pattern, options = {}) { + const ast = new AST(null, undefined, options); + AST.#parseAST(pattern, ast, 0, options); + return ast; + } + toMMPattern() { + if (this !== this.#root) + return this.#root.toMMPattern(); + const glob = this.toString(); + const [re, body, hasMagic, uflag] = this.toRegExpSource(); + const anyMagic = hasMagic || this.#hasMagic || this.#options.nocase && !this.#options.nocaseMagicOnly && glob.toUpperCase() !== glob.toLowerCase(); + if (!anyMagic) { + return body; + } + const flags = (this.#options.nocase ? "i" : "") + (uflag ? "u" : ""); + return Object.assign(new RegExp(`^${re}\$`, flags), { + _src: re, + _glob: glob + }); + } + get options() { + return this.#options; + } + toRegExpSource(allowDot) { + const dot = allowDot ?? !!this.#options.dot; + if (this.#root === this) + this.#fillNegs(); + if (!this.type) { + const noEmpty = this.isStart() && this.isEnd(); + const src = this.#parts.map((p) => { + const [re, _2, hasMagic, uflag] = typeof p === "string" ? AST.#parseGlob(p, this.#hasMagic, noEmpty) : p.toRegExpSource(allowDot); + this.#hasMagic = this.#hasMagic || hasMagic; + this.#uflag = this.#uflag || uflag; + return re; + }).join(""); + let start2 = ""; + if (this.isStart()) { + if (typeof this.#parts[0] === "string") { + const dotTravAllowed = this.#parts.length === 1 && justDots.has(this.#parts[0]); + if (!dotTravAllowed) { + const aps = addPatternStart; + const needNoTrav = dot && aps.has(src.charAt(0)) || src.startsWith("\\.") && aps.has(src.charAt(2)) || src.startsWith("\\.\\.") && aps.has(src.charAt(4)); + const needNoDot = !dot && !allowDot && aps.has(src.charAt(0)); + start2 = needNoTrav ? startNoTraversal : needNoDot ? startNoDot : ""; + } + } + } + let end = ""; + if (this.isEnd() && this.#root.#filledNegs && this.#parent?.type === "!") { + end = "(?:$|\\/)"; + } + const final2 = start2 + src + end; + return [ + final2, + (0, unescape_js_1.unescape)(src), + this.#hasMagic = !!this.#hasMagic, + this.#uflag + ]; + } + const repeated = this.type === "*" || this.type === "+"; + const start = this.type === "!" ? "(?:(?!(?:" : "(?:"; + let body = this.#partsToRegExp(dot); + if (this.isStart() && this.isEnd() && !body && this.type !== "!") { + const s = this.toString(); + this.#parts = [s]; + this.type = null; + this.#hasMagic = undefined; + return [s, (0, unescape_js_1.unescape)(this.toString()), false, false]; + } + let bodyDotAllowed = !repeated || allowDot || dot || !startNoDot ? "" : this.#partsToRegExp(true); + if (bodyDotAllowed === body) { + bodyDotAllowed = ""; + } + if (bodyDotAllowed) { + body = `(?:${body})(?:${bodyDotAllowed})*?`; + } + let final = ""; + if (this.type === "!" && this.#emptyExt) { + final = (this.isStart() && !dot ? startNoDot : "") + starNoEmpty; + } else { + const close = this.type === "!" ? "))" + (this.isStart() && !dot && !allowDot ? startNoDot : "") + star + ")" : this.type === "@" ? ")" : this.type === "?" ? ")?" : this.type === "+" && bodyDotAllowed ? ")" : this.type === "*" && bodyDotAllowed ? `)?` : `)${this.type}`; + final = start + body + close; + } + return [ + final, + (0, unescape_js_1.unescape)(body), + this.#hasMagic = !!this.#hasMagic, + this.#uflag + ]; + } + #partsToRegExp(dot) { + return this.#parts.map((p) => { + if (typeof p === "string") { + throw new Error("string type in extglob ast??"); + } + const [re, _2, _hasMagic, uflag] = p.toRegExpSource(dot); + this.#uflag = this.#uflag || uflag; + return re; + }).filter((p) => !(this.isStart() && this.isEnd()) || !!p).join("|"); + } + static #parseGlob(glob, hasMagic, noEmpty = false) { + let escaping = false; + let re = ""; + let uflag = false; + for (let i = 0;i < glob.length; i++) { + const c = glob.charAt(i); + if (escaping) { + escaping = false; + re += (reSpecials.has(c) ? "\\" : "") + c; + continue; + } + if (c === "\\") { + if (i === glob.length - 1) { + re += "\\\\"; + } else { + escaping = true; + } + continue; + } + if (c === "[") { + const [src, needUflag, consumed, magic] = (0, brace_expressions_js_1.parseClass)(glob, i); + if (consumed) { + re += src; + uflag = uflag || needUflag; + i += consumed - 1; + hasMagic = hasMagic || magic; + continue; + } + } + if (c === "*") { + if (noEmpty && glob === "*") + re += starNoEmpty; + else + re += star; + hasMagic = true; + continue; + } + if (c === "?") { + re += qmark; + hasMagic = true; + continue; + } + re += regExpEscape(c); + } + return [re, (0, unescape_js_1.unescape)(glob), !!hasMagic, uflag]; + } + } + exports2.AST = AST; +}); + +// node_modules/glob/node_modules/minimatch/dist/commonjs/escape.js +var require_escape = __commonJS((exports2) => { + Object.defineProperty(exports2, "__esModule", { value: true }); + exports2.escape = undefined; + var escape = (s, { windowsPathsNoEscape = false } = {}) => { + return windowsPathsNoEscape ? s.replace(/[?*()[\]]/g, "[$&]") : s.replace(/[?*()[\]\\]/g, "\\$&"); + }; + exports2.escape = escape; +}); + +// node_modules/glob/node_modules/minimatch/dist/commonjs/index.js +var require_commonjs13 = __commonJS((exports2) => { + var __importDefault = exports2 && exports2.__importDefault || function(mod) { + return mod && mod.__esModule ? mod : { default: mod }; + }; + Object.defineProperty(exports2, "__esModule", { value: true }); + exports2.unescape = exports2.escape = exports2.AST = exports2.Minimatch = exports2.match = exports2.makeRe = exports2.braceExpand = exports2.defaults = exports2.filter = exports2.GLOBSTAR = exports2.sep = exports2.minimatch = undefined; + var brace_expansion_1 = __importDefault(require_brace_expansion()); + var assert_valid_pattern_js_1 = require_assert_valid_pattern(); + var ast_js_1 = require_ast(); + var escape_js_1 = require_escape(); + var unescape_js_1 = require_unescape(); + var minimatch = (p, pattern, options = {}) => { + (0, assert_valid_pattern_js_1.assertValidPattern)(pattern); + if (!options.nocomment && pattern.charAt(0) === "#") { + return false; + } + return new Minimatch(pattern, options).match(p); + }; + exports2.minimatch = minimatch; + var starDotExtRE = /^\*+([^+@!?\*\[\(]*)$/; + var starDotExtTest = (ext2) => (f) => !f.startsWith(".") && f.endsWith(ext2); + var starDotExtTestDot = (ext2) => (f) => f.endsWith(ext2); + var starDotExtTestNocase = (ext2) => { + ext2 = ext2.toLowerCase(); + return (f) => !f.startsWith(".") && f.toLowerCase().endsWith(ext2); + }; + var starDotExtTestNocaseDot = (ext2) => { + ext2 = ext2.toLowerCase(); + return (f) => f.toLowerCase().endsWith(ext2); + }; + var starDotStarRE = /^\*+\.\*+$/; + var starDotStarTest = (f) => !f.startsWith(".") && f.includes("."); + var starDotStarTestDot = (f) => f !== "." && f !== ".." && f.includes("."); + var dotStarRE = /^\.\*+$/; + var dotStarTest = (f) => f !== "." && f !== ".." && f.startsWith("."); + var starRE = /^\*+$/; + var starTest = (f) => f.length !== 0 && !f.startsWith("."); + var starTestDot = (f) => f.length !== 0 && f !== "." && f !== ".."; + var qmarksRE = /^\?+([^+@!?\*\[\(]*)?$/; + var qmarksTestNocase = ([$0, ext2 = ""]) => { + const noext = qmarksTestNoExt([$0]); + if (!ext2) + return noext; + ext2 = ext2.toLowerCase(); + return (f) => noext(f) && f.toLowerCase().endsWith(ext2); + }; + var qmarksTestNocaseDot = ([$0, ext2 = ""]) => { + const noext = qmarksTestNoExtDot([$0]); + if (!ext2) + return noext; + ext2 = ext2.toLowerCase(); + return (f) => noext(f) && f.toLowerCase().endsWith(ext2); + }; + var qmarksTestDot = ([$0, ext2 = ""]) => { + const noext = qmarksTestNoExtDot([$0]); + return !ext2 ? noext : (f) => noext(f) && f.endsWith(ext2); + }; + var qmarksTest = ([$0, ext2 = ""]) => { + const noext = qmarksTestNoExt([$0]); + return !ext2 ? noext : (f) => noext(f) && f.endsWith(ext2); + }; + var qmarksTestNoExt = ([$0]) => { + const len = $0.length; + return (f) => f.length === len && !f.startsWith("."); + }; + var qmarksTestNoExtDot = ([$0]) => { + const len = $0.length; + return (f) => f.length === len && f !== "." && f !== ".."; + }; + var defaultPlatform = typeof process === "object" && process ? typeof process.env === "object" && process.env && process.env.__MINIMATCH_TESTING_PLATFORM__ || process.platform : "posix"; + var path = { + win32: { sep: "\\" }, + posix: { sep: "/" } + }; + exports2.sep = defaultPlatform === "win32" ? path.win32.sep : path.posix.sep; + exports2.minimatch.sep = exports2.sep; + exports2.GLOBSTAR = Symbol("globstar **"); + exports2.minimatch.GLOBSTAR = exports2.GLOBSTAR; + var qmark = "[^/]"; + var star = qmark + "*?"; + var twoStarDot = "(?:(?!(?:\\/|^)(?:\\.{1,2})($|\\/)).)*?"; + var twoStarNoDot = "(?:(?!(?:\\/|^)\\.).)*?"; + var filter = (pattern, options = {}) => (p) => (0, exports2.minimatch)(p, pattern, options); + exports2.filter = filter; + exports2.minimatch.filter = exports2.filter; + var ext = (a, b = {}) => Object.assign({}, a, b); + var defaults = (def) => { + if (!def || typeof def !== "object" || !Object.keys(def).length) { + return exports2.minimatch; + } + const orig = exports2.minimatch; + const m = (p, pattern, options = {}) => orig(p, pattern, ext(def, options)); + return Object.assign(m, { + Minimatch: class Minimatch2 extends orig.Minimatch { + constructor(pattern, options = {}) { + super(pattern, ext(def, options)); + } + static defaults(options) { + return orig.defaults(ext(def, options)).Minimatch; + } + }, + AST: class AST extends orig.AST { + constructor(type, parent, options = {}) { + super(type, parent, ext(def, options)); + } + static fromGlob(pattern, options = {}) { + return orig.AST.fromGlob(pattern, ext(def, options)); + } + }, + unescape: (s, options = {}) => orig.unescape(s, ext(def, options)), + escape: (s, options = {}) => orig.escape(s, ext(def, options)), + filter: (pattern, options = {}) => orig.filter(pattern, ext(def, options)), + defaults: (options) => orig.defaults(ext(def, options)), + makeRe: (pattern, options = {}) => orig.makeRe(pattern, ext(def, options)), + braceExpand: (pattern, options = {}) => orig.braceExpand(pattern, ext(def, options)), + match: (list, pattern, options = {}) => orig.match(list, pattern, ext(def, options)), + sep: orig.sep, + GLOBSTAR: exports2.GLOBSTAR + }); + }; + exports2.defaults = defaults; + exports2.minimatch.defaults = exports2.defaults; + var braceExpand = (pattern, options = {}) => { + (0, assert_valid_pattern_js_1.assertValidPattern)(pattern); + if (options.nobrace || !/\{(?:(?!\{).)*\}/.test(pattern)) { + return [pattern]; + } + return (0, brace_expansion_1.default)(pattern); + }; + exports2.braceExpand = braceExpand; + exports2.minimatch.braceExpand = exports2.braceExpand; + var makeRe = (pattern, options = {}) => new Minimatch(pattern, options).makeRe(); + exports2.makeRe = makeRe; + exports2.minimatch.makeRe = exports2.makeRe; + var match = (list, pattern, options = {}) => { + const mm = new Minimatch(pattern, options); + list = list.filter((f) => mm.match(f)); + if (mm.options.nonull && !list.length) { + list.push(pattern); + } + return list; + }; + exports2.match = match; + exports2.minimatch.match = exports2.match; + var globMagic = /[?*]|[+@!]\(.*?\)|\[|\]/; + var regExpEscape = (s) => s.replace(/[-[\]{}()*+?.,\\^$|#\s]/g, "\\$&"); + + class Minimatch { + options; + set; + pattern; + windowsPathsNoEscape; + nonegate; + negate; + comment; + empty; + preserveMultipleSlashes; + partial; + globSet; + globParts; + nocase; + isWindows; + platform; + windowsNoMagicRoot; + regexp; + constructor(pattern, options = {}) { + (0, assert_valid_pattern_js_1.assertValidPattern)(pattern); + options = options || {}; + this.options = options; + this.pattern = pattern; + this.platform = options.platform || defaultPlatform; + this.isWindows = this.platform === "win32"; + this.windowsPathsNoEscape = !!options.windowsPathsNoEscape || options.allowWindowsEscape === false; + if (this.windowsPathsNoEscape) { + this.pattern = this.pattern.replace(/\\/g, "/"); + } + this.preserveMultipleSlashes = !!options.preserveMultipleSlashes; + this.regexp = null; + this.negate = false; + this.nonegate = !!options.nonegate; + this.comment = false; + this.empty = false; + this.partial = !!options.partial; + this.nocase = !!this.options.nocase; + this.windowsNoMagicRoot = options.windowsNoMagicRoot !== undefined ? options.windowsNoMagicRoot : !!(this.isWindows && this.nocase); + this.globSet = []; + this.globParts = []; + this.set = []; + this.make(); + } + hasMagic() { + if (this.options.magicalBraces && this.set.length > 1) { + return true; + } + for (const pattern of this.set) { + for (const part of pattern) { + if (typeof part !== "string") + return true; + } + } + return false; + } + debug(..._2) { + } + make() { + const pattern = this.pattern; + const options = this.options; + if (!options.nocomment && pattern.charAt(0) === "#") { + this.comment = true; + return; + } + if (!pattern) { + this.empty = true; + return; + } + this.parseNegate(); + this.globSet = [...new Set(this.braceExpand())]; + if (options.debug) { + this.debug = (...args) => console.error(...args); + } + this.debug(this.pattern, this.globSet); + const rawGlobParts = this.globSet.map((s) => this.slashSplit(s)); + this.globParts = this.preprocess(rawGlobParts); + this.debug(this.pattern, this.globParts); + let set = this.globParts.map((s, _2, __) => { + if (this.isWindows && this.windowsNoMagicRoot) { + const isUNC = s[0] === "" && s[1] === "" && (s[2] === "?" || !globMagic.test(s[2])) && !globMagic.test(s[3]); + const isDrive = /^[a-z]:/i.test(s[0]); + if (isUNC) { + return [...s.slice(0, 4), ...s.slice(4).map((ss) => this.parse(ss))]; + } else if (isDrive) { + return [s[0], ...s.slice(1).map((ss) => this.parse(ss))]; + } + } + return s.map((ss) => this.parse(ss)); + }); + this.debug(this.pattern, set); + this.set = set.filter((s) => s.indexOf(false) === -1); + if (this.isWindows) { + for (let i = 0;i < this.set.length; i++) { + const p = this.set[i]; + if (p[0] === "" && p[1] === "" && this.globParts[i][2] === "?" && typeof p[3] === "string" && /^[a-z]:$/i.test(p[3])) { + p[2] = "?"; + } + } + } + this.debug(this.pattern, this.set); + } + preprocess(globParts) { + if (this.options.noglobstar) { + for (let i = 0;i < globParts.length; i++) { + for (let j = 0;j < globParts[i].length; j++) { + if (globParts[i][j] === "**") { + globParts[i][j] = "*"; + } + } + } + } + const { optimizationLevel = 1 } = this.options; + if (optimizationLevel >= 2) { + globParts = this.firstPhasePreProcess(globParts); + globParts = this.secondPhasePreProcess(globParts); + } else if (optimizationLevel >= 1) { + globParts = this.levelOneOptimize(globParts); + } else { + globParts = this.adjascentGlobstarOptimize(globParts); + } + return globParts; + } + adjascentGlobstarOptimize(globParts) { + return globParts.map((parts) => { + let gs = -1; + while ((gs = parts.indexOf("**", gs + 1)) !== -1) { + let i = gs; + while (parts[i + 1] === "**") { + i++; + } + if (i !== gs) { + parts.splice(gs, i - gs); + } + } + return parts; + }); + } + levelOneOptimize(globParts) { + return globParts.map((parts) => { + parts = parts.reduce((set, part) => { + const prev = set[set.length - 1]; + if (part === "**" && prev === "**") { + return set; + } + if (part === "..") { + if (prev && prev !== ".." && prev !== "." && prev !== "**") { + set.pop(); + return set; + } + } + set.push(part); + return set; + }, []); + return parts.length === 0 ? [""] : parts; + }); + } + levelTwoFileOptimize(parts) { + if (!Array.isArray(parts)) { + parts = this.slashSplit(parts); + } + let didSomething = false; + do { + didSomething = false; + if (!this.preserveMultipleSlashes) { + for (let i = 1;i < parts.length - 1; i++) { + const p = parts[i]; + if (i === 1 && p === "" && parts[0] === "") + continue; + if (p === "." || p === "") { + didSomething = true; + parts.splice(i, 1); + i--; + } + } + if (parts[0] === "." && parts.length === 2 && (parts[1] === "." || parts[1] === "")) { + didSomething = true; + parts.pop(); + } + } + let dd = 0; + while ((dd = parts.indexOf("..", dd + 1)) !== -1) { + const p = parts[dd - 1]; + if (p && p !== "." && p !== ".." && p !== "**") { + didSomething = true; + parts.splice(dd - 1, 2); + dd -= 2; + } + } + } while (didSomething); + return parts.length === 0 ? [""] : parts; + } + firstPhasePreProcess(globParts) { + let didSomething = false; + do { + didSomething = false; + for (let parts of globParts) { + let gs = -1; + while ((gs = parts.indexOf("**", gs + 1)) !== -1) { + let gss = gs; + while (parts[gss + 1] === "**") { + gss++; + } + if (gss > gs) { + parts.splice(gs + 1, gss - gs); + } + let next = parts[gs + 1]; + const p = parts[gs + 2]; + const p2 = parts[gs + 3]; + if (next !== "..") + continue; + if (!p || p === "." || p === ".." || !p2 || p2 === "." || p2 === "..") { + continue; + } + didSomething = true; + parts.splice(gs, 1); + const other = parts.slice(0); + other[gs] = "**"; + globParts.push(other); + gs--; + } + if (!this.preserveMultipleSlashes) { + for (let i = 1;i < parts.length - 1; i++) { + const p = parts[i]; + if (i === 1 && p === "" && parts[0] === "") + continue; + if (p === "." || p === "") { + didSomething = true; + parts.splice(i, 1); + i--; + } + } + if (parts[0] === "." && parts.length === 2 && (parts[1] === "." || parts[1] === "")) { + didSomething = true; + parts.pop(); + } + } + let dd = 0; + while ((dd = parts.indexOf("..", dd + 1)) !== -1) { + const p = parts[dd - 1]; + if (p && p !== "." && p !== ".." && p !== "**") { + didSomething = true; + const needDot = dd === 1 && parts[dd + 1] === "**"; + const splin = needDot ? ["."] : []; + parts.splice(dd - 1, 2, ...splin); + if (parts.length === 0) + parts.push(""); + dd -= 2; + } + } + } + } while (didSomething); + return globParts; + } + secondPhasePreProcess(globParts) { + for (let i = 0;i < globParts.length - 1; i++) { + for (let j = i + 1;j < globParts.length; j++) { + const matched = this.partsMatch(globParts[i], globParts[j], !this.preserveMultipleSlashes); + if (matched) { + globParts[i] = []; + globParts[j] = matched; + break; + } + } + } + return globParts.filter((gs) => gs.length); + } + partsMatch(a, b, emptyGSMatch = false) { + let ai = 0; + let bi = 0; + let result = []; + let which = ""; + while (ai < a.length && bi < b.length) { + if (a[ai] === b[bi]) { + result.push(which === "b" ? b[bi] : a[ai]); + ai++; + bi++; + } else if (emptyGSMatch && a[ai] === "**" && b[bi] === a[ai + 1]) { + result.push(a[ai]); + ai++; + } else if (emptyGSMatch && b[bi] === "**" && a[ai] === b[bi + 1]) { + result.push(b[bi]); + bi++; + } else if (a[ai] === "*" && b[bi] && (this.options.dot || !b[bi].startsWith(".")) && b[bi] !== "**") { + if (which === "b") + return false; + which = "a"; + result.push(a[ai]); + ai++; + bi++; + } else if (b[bi] === "*" && a[ai] && (this.options.dot || !a[ai].startsWith(".")) && a[ai] !== "**") { + if (which === "a") + return false; + which = "b"; + result.push(b[bi]); + ai++; + bi++; + } else { + return false; + } + } + return a.length === b.length && result; + } + parseNegate() { + if (this.nonegate) + return; + const pattern = this.pattern; + let negate = false; + let negateOffset = 0; + for (let i = 0;i < pattern.length && pattern.charAt(i) === "!"; i++) { + negate = !negate; + negateOffset++; + } + if (negateOffset) + this.pattern = pattern.slice(negateOffset); + this.negate = negate; + } + matchOne(file, pattern, partial = false) { + const options = this.options; + if (this.isWindows) { + const fileDrive = typeof file[0] === "string" && /^[a-z]:$/i.test(file[0]); + const fileUNC = !fileDrive && file[0] === "" && file[1] === "" && file[2] === "?" && /^[a-z]:$/i.test(file[3]); + const patternDrive = typeof pattern[0] === "string" && /^[a-z]:$/i.test(pattern[0]); + const patternUNC = !patternDrive && pattern[0] === "" && pattern[1] === "" && pattern[2] === "?" && typeof pattern[3] === "string" && /^[a-z]:$/i.test(pattern[3]); + const fdi = fileUNC ? 3 : fileDrive ? 0 : undefined; + const pdi = patternUNC ? 3 : patternDrive ? 0 : undefined; + if (typeof fdi === "number" && typeof pdi === "number") { + const [fd, pd] = [file[fdi], pattern[pdi]]; + if (fd.toLowerCase() === pd.toLowerCase()) { + pattern[pdi] = fd; + if (pdi > fdi) { + pattern = pattern.slice(pdi); + } else if (fdi > pdi) { + file = file.slice(fdi); + } + } + } + } + const { optimizationLevel = 1 } = this.options; + if (optimizationLevel >= 2) { + file = this.levelTwoFileOptimize(file); + } + this.debug("matchOne", this, { file, pattern }); + this.debug("matchOne", file.length, pattern.length); + for (var fi = 0, pi = 0, fl = file.length, pl = pattern.length;fi < fl && pi < pl; fi++, pi++) { + this.debug("matchOne loop"); + var p = pattern[pi]; + var f = file[fi]; + this.debug(pattern, p, f); + if (p === false) { + return false; + } + if (p === exports2.GLOBSTAR) { + this.debug("GLOBSTAR", [pattern, p, f]); + var fr = fi; + var pr = pi + 1; + if (pr === pl) { + this.debug("** at the end"); + for (;fi < fl; fi++) { + if (file[fi] === "." || file[fi] === ".." || !options.dot && file[fi].charAt(0) === ".") + return false; + } + return true; + } + while (fr < fl) { + var swallowee = file[fr]; + this.debug("\nglobstar while", file, fr, pattern, pr, swallowee); + if (this.matchOne(file.slice(fr), pattern.slice(pr), partial)) { + this.debug("globstar found match!", fr, fl, swallowee); + return true; + } else { + if (swallowee === "." || swallowee === ".." || !options.dot && swallowee.charAt(0) === ".") { + this.debug("dot detected!", file, fr, pattern, pr); + break; + } + this.debug("globstar swallow a segment, and continue"); + fr++; + } + } + if (partial) { + this.debug("\n>>> no match, partial?", file, fr, pattern, pr); + if (fr === fl) { + return true; + } + } + return false; + } + let hit; + if (typeof p === "string") { + hit = f === p; + this.debug("string match", p, f, hit); + } else { + hit = p.test(f); + this.debug("pattern match", p, f, hit); + } + if (!hit) + return false; + } + if (fi === fl && pi === pl) { + return true; + } else if (fi === fl) { + return partial; + } else if (pi === pl) { + return fi === fl - 1 && file[fi] === ""; + } else { + throw new Error("wtf?"); + } + } + braceExpand() { + return (0, exports2.braceExpand)(this.pattern, this.options); + } + parse(pattern) { + (0, assert_valid_pattern_js_1.assertValidPattern)(pattern); + const options = this.options; + if (pattern === "**") + return exports2.GLOBSTAR; + if (pattern === "") + return ""; + let m; + let fastTest = null; + if (m = pattern.match(starRE)) { + fastTest = options.dot ? starTestDot : starTest; + } else if (m = pattern.match(starDotExtRE)) { + fastTest = (options.nocase ? options.dot ? starDotExtTestNocaseDot : starDotExtTestNocase : options.dot ? starDotExtTestDot : starDotExtTest)(m[1]); + } else if (m = pattern.match(qmarksRE)) { + fastTest = (options.nocase ? options.dot ? qmarksTestNocaseDot : qmarksTestNocase : options.dot ? qmarksTestDot : qmarksTest)(m); + } else if (m = pattern.match(starDotStarRE)) { + fastTest = options.dot ? starDotStarTestDot : starDotStarTest; + } else if (m = pattern.match(dotStarRE)) { + fastTest = dotStarTest; + } + const re = ast_js_1.AST.fromGlob(pattern, this.options).toMMPattern(); + if (fastTest && typeof re === "object") { + Reflect.defineProperty(re, "test", { value: fastTest }); + } + return re; + } + makeRe() { + if (this.regexp || this.regexp === false) + return this.regexp; + const set = this.set; + if (!set.length) { + this.regexp = false; + return this.regexp; + } + const options = this.options; + const twoStar = options.noglobstar ? star : options.dot ? twoStarDot : twoStarNoDot; + const flags = new Set(options.nocase ? ["i"] : []); + let re = set.map((pattern) => { + const pp = pattern.map((p) => { + if (p instanceof RegExp) { + for (const f of p.flags.split("")) + flags.add(f); + } + return typeof p === "string" ? regExpEscape(p) : p === exports2.GLOBSTAR ? exports2.GLOBSTAR : p._src; + }); + pp.forEach((p, i) => { + const next = pp[i + 1]; + const prev = pp[i - 1]; + if (p !== exports2.GLOBSTAR || prev === exports2.GLOBSTAR) { + return; + } + if (prev === undefined) { + if (next !== undefined && next !== exports2.GLOBSTAR) { + pp[i + 1] = "(?:\\/|" + twoStar + "\\/)?" + next; + } else { + pp[i] = twoStar; + } + } else if (next === undefined) { + pp[i - 1] = prev + "(?:\\/|" + twoStar + ")?"; + } else if (next !== exports2.GLOBSTAR) { + pp[i - 1] = prev + "(?:\\/|\\/" + twoStar + "\\/)" + next; + pp[i + 1] = exports2.GLOBSTAR; + } + }); + return pp.filter((p) => p !== exports2.GLOBSTAR).join("/"); + }).join("|"); + const [open, close] = set.length > 1 ? ["(?:", ")"] : ["", ""]; + re = "^" + open + re + close + "$"; + if (this.negate) + re = "^(?!" + re + ").+$"; + try { + this.regexp = new RegExp(re, [...flags].join("")); + } catch (ex) { + this.regexp = false; + } + return this.regexp; + } + slashSplit(p) { + if (this.preserveMultipleSlashes) { + return p.split("/"); + } else if (this.isWindows && /^\/\/[^\/]+/.test(p)) { + return ["", ...p.split(/\/+/)]; + } else { + return p.split(/\/+/); + } + } + match(f, partial = this.partial) { + this.debug("match", f, this.pattern); + if (this.comment) { + return false; + } + if (this.empty) { + return f === ""; + } + if (f === "/" && partial) { + return true; + } + const options = this.options; + if (this.isWindows) { + f = f.split("\\").join("/"); + } + const ff = this.slashSplit(f); + this.debug(this.pattern, "split", ff); + const set = this.set; + this.debug(this.pattern, "set", set); + let filename = ff[ff.length - 1]; + if (!filename) { + for (let i = ff.length - 2;!filename && i >= 0; i--) { + filename = ff[i]; + } + } + for (let i = 0;i < set.length; i++) { + const pattern = set[i]; + let file = ff; + if (options.matchBase && pattern.length === 1) { + file = [filename]; + } + const hit = this.matchOne(file, pattern, partial); + if (hit) { + if (options.flipNegate) { + return true; + } + return !this.negate; + } + } + if (options.flipNegate) { + return false; + } + return this.negate; + } + static defaults(def) { + return exports2.minimatch.defaults(def).Minimatch; + } + } + exports2.Minimatch = Minimatch; + var ast_js_2 = require_ast(); + Object.defineProperty(exports2, "AST", { enumerable: true, get: function() { + return ast_js_2.AST; + } }); + var escape_js_2 = require_escape(); + Object.defineProperty(exports2, "escape", { enumerable: true, get: function() { + return escape_js_2.escape; + } }); + var unescape_js_2 = require_unescape(); + Object.defineProperty(exports2, "unescape", { enumerable: true, get: function() { + return unescape_js_2.unescape; + } }); + exports2.minimatch.AST = ast_js_1.AST; + exports2.minimatch.Minimatch = Minimatch; + exports2.minimatch.escape = escape_js_1.escape; + exports2.minimatch.unescape = unescape_js_1.unescape; +}); + +// node_modules/lru-cache/dist/commonjs/index.js +var require_commonjs14 = __commonJS((exports2) => { + Object.defineProperty(exports2, "__esModule", { value: true }); + exports2.LRUCache = undefined; + var perf = typeof performance === "object" && performance && typeof performance.now === "function" ? performance : Date; + var warned = new Set; + var PROCESS = typeof process === "object" && !!process ? process : {}; + var emitWarning = (msg, type, code, fn) => { + typeof PROCESS.emitWarning === "function" ? PROCESS.emitWarning(msg, type, code, fn) : console.error(`[${code}] ${type}: ${msg}`); + }; + var AC = globalThis.AbortController; + var AS = globalThis.AbortSignal; + if (typeof AC === "undefined") { + AS = class AbortSignal2 { + onabort; + _onabort = []; + reason; + aborted = false; + addEventListener(_2, fn) { + this._onabort.push(fn); + } + }; + AC = class AbortController2 { + constructor() { + warnACPolyfill(); + } + signal = new AS; + abort(reason) { + if (this.signal.aborted) + return; + this.signal.reason = reason; + this.signal.aborted = true; + for (const fn of this.signal._onabort) { + fn(reason); + } + this.signal.onabort?.(reason); + } + }; + let printACPolyfillWarning = PROCESS.env?.LRU_CACHE_IGNORE_AC_WARNING !== "1"; + const warnACPolyfill = () => { + if (!printACPolyfillWarning) + return; + printACPolyfillWarning = false; + emitWarning("AbortController is not defined. If using lru-cache in " + "node 14, load an AbortController polyfill from the " + "`node-abort-controller` package. A minimal polyfill is " + "provided for use by LRUCache.fetch(), but it should not be " + "relied upon in other contexts (eg, passing it to other APIs that " + "use AbortController/AbortSignal might have undesirable effects). " + "You may disable this with LRU_CACHE_IGNORE_AC_WARNING=1 in the env.", "NO_ABORT_CONTROLLER", "ENOTSUP", warnACPolyfill); + }; + } + var shouldWarn = (code) => !warned.has(code); + var TYPE = Symbol("type"); + var isPosInt = (n) => n && n === Math.floor(n) && n > 0 && isFinite(n); + var getUintArray = (max) => !isPosInt(max) ? null : max <= Math.pow(2, 8) ? Uint8Array : max <= Math.pow(2, 16) ? Uint16Array : max <= Math.pow(2, 32) ? Uint32Array : max <= Number.MAX_SAFE_INTEGER ? ZeroArray : null; + + class ZeroArray extends Array { + constructor(size) { + super(size); + this.fill(0); + } + } + + class Stack { + heap; + length; + static #constructing = false; + static create(max) { + const HeapCls = getUintArray(max); + if (!HeapCls) + return []; + Stack.#constructing = true; + const s = new Stack(max, HeapCls); + Stack.#constructing = false; + return s; + } + constructor(max, HeapCls) { + if (!Stack.#constructing) { + throw new TypeError("instantiate Stack using Stack.create(n)"); + } + this.heap = new HeapCls(max); + this.length = 0; + } + push(n) { + this.heap[this.length++] = n; + } + pop() { + return this.heap[--this.length]; + } + } + + class LRUCache { + #max; + #maxSize; + #dispose; + #disposeAfter; + #fetchMethod; + #memoMethod; + ttl; + ttlResolution; + ttlAutopurge; + updateAgeOnGet; + updateAgeOnHas; + allowStale; + noDisposeOnSet; + noUpdateTTL; + maxEntrySize; + sizeCalculation; + noDeleteOnFetchRejection; + noDeleteOnStaleGet; + allowStaleOnFetchAbort; + allowStaleOnFetchRejection; + ignoreFetchAbort; + #size; + #calculatedSize; + #keyMap; + #keyList; + #valList; + #next; + #prev; + #head; + #tail; + #free; + #disposed; + #sizes; + #starts; + #ttls; + #hasDispose; + #hasFetchMethod; + #hasDisposeAfter; + static unsafeExposeInternals(c) { + return { + starts: c.#starts, + ttls: c.#ttls, + sizes: c.#sizes, + keyMap: c.#keyMap, + keyList: c.#keyList, + valList: c.#valList, + next: c.#next, + prev: c.#prev, + get head() { + return c.#head; + }, + get tail() { + return c.#tail; + }, + free: c.#free, + isBackgroundFetch: (p) => c.#isBackgroundFetch(p), + backgroundFetch: (k, index, options, context) => c.#backgroundFetch(k, index, options, context), + moveToTail: (index) => c.#moveToTail(index), + indexes: (options) => c.#indexes(options), + rindexes: (options) => c.#rindexes(options), + isStale: (index) => c.#isStale(index) + }; + } + get max() { + return this.#max; + } + get maxSize() { + return this.#maxSize; + } + get calculatedSize() { + return this.#calculatedSize; + } + get size() { + return this.#size; + } + get fetchMethod() { + return this.#fetchMethod; + } + get memoMethod() { + return this.#memoMethod; + } + get dispose() { + return this.#dispose; + } + get disposeAfter() { + return this.#disposeAfter; + } + constructor(options) { + const { max = 0, ttl, ttlResolution = 1, ttlAutopurge, updateAgeOnGet, updateAgeOnHas, allowStale, dispose, disposeAfter, noDisposeOnSet, noUpdateTTL, maxSize = 0, maxEntrySize = 0, sizeCalculation, fetchMethod, memoMethod, noDeleteOnFetchRejection, noDeleteOnStaleGet, allowStaleOnFetchRejection, allowStaleOnFetchAbort, ignoreFetchAbort } = options; + if (max !== 0 && !isPosInt(max)) { + throw new TypeError("max option must be a nonnegative integer"); + } + const UintArray = max ? getUintArray(max) : Array; + if (!UintArray) { + throw new Error("invalid max value: " + max); + } + this.#max = max; + this.#maxSize = maxSize; + this.maxEntrySize = maxEntrySize || this.#maxSize; + this.sizeCalculation = sizeCalculation; + if (this.sizeCalculation) { + if (!this.#maxSize && !this.maxEntrySize) { + throw new TypeError("cannot set sizeCalculation without setting maxSize or maxEntrySize"); + } + if (typeof this.sizeCalculation !== "function") { + throw new TypeError("sizeCalculation set to non-function"); + } + } + if (memoMethod !== undefined && typeof memoMethod !== "function") { + throw new TypeError("memoMethod must be a function if defined"); + } + this.#memoMethod = memoMethod; + if (fetchMethod !== undefined && typeof fetchMethod !== "function") { + throw new TypeError("fetchMethod must be a function if specified"); + } + this.#fetchMethod = fetchMethod; + this.#hasFetchMethod = !!fetchMethod; + this.#keyMap = new Map; + this.#keyList = new Array(max).fill(undefined); + this.#valList = new Array(max).fill(undefined); + this.#next = new UintArray(max); + this.#prev = new UintArray(max); + this.#head = 0; + this.#tail = 0; + this.#free = Stack.create(max); + this.#size = 0; + this.#calculatedSize = 0; + if (typeof dispose === "function") { + this.#dispose = dispose; + } + if (typeof disposeAfter === "function") { + this.#disposeAfter = disposeAfter; + this.#disposed = []; + } else { + this.#disposeAfter = undefined; + this.#disposed = undefined; + } + this.#hasDispose = !!this.#dispose; + this.#hasDisposeAfter = !!this.#disposeAfter; + this.noDisposeOnSet = !!noDisposeOnSet; + this.noUpdateTTL = !!noUpdateTTL; + this.noDeleteOnFetchRejection = !!noDeleteOnFetchRejection; + this.allowStaleOnFetchRejection = !!allowStaleOnFetchRejection; + this.allowStaleOnFetchAbort = !!allowStaleOnFetchAbort; + this.ignoreFetchAbort = !!ignoreFetchAbort; + if (this.maxEntrySize !== 0) { + if (this.#maxSize !== 0) { + if (!isPosInt(this.#maxSize)) { + throw new TypeError("maxSize must be a positive integer if specified"); + } + } + if (!isPosInt(this.maxEntrySize)) { + throw new TypeError("maxEntrySize must be a positive integer if specified"); + } + this.#initializeSizeTracking(); + } + this.allowStale = !!allowStale; + this.noDeleteOnStaleGet = !!noDeleteOnStaleGet; + this.updateAgeOnGet = !!updateAgeOnGet; + this.updateAgeOnHas = !!updateAgeOnHas; + this.ttlResolution = isPosInt(ttlResolution) || ttlResolution === 0 ? ttlResolution : 1; + this.ttlAutopurge = !!ttlAutopurge; + this.ttl = ttl || 0; + if (this.ttl) { + if (!isPosInt(this.ttl)) { + throw new TypeError("ttl must be a positive integer if specified"); + } + this.#initializeTTLTracking(); + } + if (this.#max === 0 && this.ttl === 0 && this.#maxSize === 0) { + throw new TypeError("At least one of max, maxSize, or ttl is required"); + } + if (!this.ttlAutopurge && !this.#max && !this.#maxSize) { + const code = "LRU_CACHE_UNBOUNDED"; + if (shouldWarn(code)) { + warned.add(code); + const msg = "TTL caching without ttlAutopurge, max, or maxSize can " + "result in unbounded memory consumption."; + emitWarning(msg, "UnboundedCacheWarning", code, LRUCache); + } + } + } + getRemainingTTL(key) { + return this.#keyMap.has(key) ? Infinity : 0; + } + #initializeTTLTracking() { + const ttls = new ZeroArray(this.#max); + const starts = new ZeroArray(this.#max); + this.#ttls = ttls; + this.#starts = starts; + this.#setItemTTL = (index, ttl, start = perf.now()) => { + starts[index] = ttl !== 0 ? start : 0; + ttls[index] = ttl; + if (ttl !== 0 && this.ttlAutopurge) { + const t = setTimeout(() => { + if (this.#isStale(index)) { + this.#delete(this.#keyList[index], "expire"); + } + }, ttl + 1); + if (t.unref) { + t.unref(); + } + } + }; + this.#updateItemAge = (index) => { + starts[index] = ttls[index] !== 0 ? perf.now() : 0; + }; + this.#statusTTL = (status, index) => { + if (ttls[index]) { + const ttl = ttls[index]; + const start = starts[index]; + if (!ttl || !start) + return; + status.ttl = ttl; + status.start = start; + status.now = cachedNow || getNow(); + const age = status.now - start; + status.remainingTTL = ttl - age; + } + }; + let cachedNow = 0; + const getNow = () => { + const n = perf.now(); + if (this.ttlResolution > 0) { + cachedNow = n; + const t = setTimeout(() => cachedNow = 0, this.ttlResolution); + if (t.unref) { + t.unref(); + } + } + return n; + }; + this.getRemainingTTL = (key) => { + const index = this.#keyMap.get(key); + if (index === undefined) { + return 0; + } + const ttl = ttls[index]; + const start = starts[index]; + if (!ttl || !start) { + return Infinity; + } + const age = (cachedNow || getNow()) - start; + return ttl - age; + }; + this.#isStale = (index) => { + const s = starts[index]; + const t = ttls[index]; + return !!t && !!s && (cachedNow || getNow()) - s > t; + }; + } + #updateItemAge = () => { + }; + #statusTTL = () => { + }; + #setItemTTL = () => { + }; + #isStale = () => false; + #initializeSizeTracking() { + const sizes = new ZeroArray(this.#max); + this.#calculatedSize = 0; + this.#sizes = sizes; + this.#removeItemSize = (index) => { + this.#calculatedSize -= sizes[index]; + sizes[index] = 0; + }; + this.#requireSize = (k, v, size, sizeCalculation) => { + if (this.#isBackgroundFetch(v)) { + return 0; + } + if (!isPosInt(size)) { + if (sizeCalculation) { + if (typeof sizeCalculation !== "function") { + throw new TypeError("sizeCalculation must be a function"); + } + size = sizeCalculation(v, k); + if (!isPosInt(size)) { + throw new TypeError("sizeCalculation return invalid (expect positive integer)"); + } + } else { + throw new TypeError("invalid size value (must be positive integer). " + "When maxSize or maxEntrySize is used, sizeCalculation " + "or size must be set."); + } + } + return size; + }; + this.#addItemSize = (index, size, status) => { + sizes[index] = size; + if (this.#maxSize) { + const maxSize = this.#maxSize - sizes[index]; + while (this.#calculatedSize > maxSize) { + this.#evict(true); + } + } + this.#calculatedSize += sizes[index]; + if (status) { + status.entrySize = size; + status.totalCalculatedSize = this.#calculatedSize; + } + }; + } + #removeItemSize = (_i) => { + }; + #addItemSize = (_i, _s, _st) => { + }; + #requireSize = (_k, _v, size, sizeCalculation) => { + if (size || sizeCalculation) { + throw new TypeError("cannot set size without setting maxSize or maxEntrySize on cache"); + } + return 0; + }; + *#indexes({ allowStale = this.allowStale } = {}) { + if (this.#size) { + for (let i = this.#tail;; ) { + if (!this.#isValidIndex(i)) { + break; + } + if (allowStale || !this.#isStale(i)) { + yield i; + } + if (i === this.#head) { + break; + } else { + i = this.#prev[i]; + } + } + } + } + *#rindexes({ allowStale = this.allowStale } = {}) { + if (this.#size) { + for (let i = this.#head;; ) { + if (!this.#isValidIndex(i)) { + break; + } + if (allowStale || !this.#isStale(i)) { + yield i; + } + if (i === this.#tail) { + break; + } else { + i = this.#next[i]; + } + } + } + } + #isValidIndex(index) { + return index !== undefined && this.#keyMap.get(this.#keyList[index]) === index; + } + *entries() { + for (const i of this.#indexes()) { + if (this.#valList[i] !== undefined && this.#keyList[i] !== undefined && !this.#isBackgroundFetch(this.#valList[i])) { + yield [this.#keyList[i], this.#valList[i]]; + } + } + } + *rentries() { + for (const i of this.#rindexes()) { + if (this.#valList[i] !== undefined && this.#keyList[i] !== undefined && !this.#isBackgroundFetch(this.#valList[i])) { + yield [this.#keyList[i], this.#valList[i]]; + } + } + } + *keys() { + for (const i of this.#indexes()) { + const k = this.#keyList[i]; + if (k !== undefined && !this.#isBackgroundFetch(this.#valList[i])) { + yield k; + } + } + } + *rkeys() { + for (const i of this.#rindexes()) { + const k = this.#keyList[i]; + if (k !== undefined && !this.#isBackgroundFetch(this.#valList[i])) { + yield k; + } + } + } + *values() { + for (const i of this.#indexes()) { + const v = this.#valList[i]; + if (v !== undefined && !this.#isBackgroundFetch(this.#valList[i])) { + yield this.#valList[i]; + } + } + } + *rvalues() { + for (const i of this.#rindexes()) { + const v = this.#valList[i]; + if (v !== undefined && !this.#isBackgroundFetch(this.#valList[i])) { + yield this.#valList[i]; + } + } + } + [Symbol.iterator]() { + return this.entries(); + } + [Symbol.toStringTag] = "LRUCache"; + find(fn, getOptions = {}) { + for (const i of this.#indexes()) { + const v = this.#valList[i]; + const value = this.#isBackgroundFetch(v) ? v.__staleWhileFetching : v; + if (value === undefined) + continue; + if (fn(value, this.#keyList[i], this)) { + return this.get(this.#keyList[i], getOptions); + } + } + } + forEach(fn, thisp = this) { + for (const i of this.#indexes()) { + const v = this.#valList[i]; + const value = this.#isBackgroundFetch(v) ? v.__staleWhileFetching : v; + if (value === undefined) + continue; + fn.call(thisp, value, this.#keyList[i], this); + } + } + rforEach(fn, thisp = this) { + for (const i of this.#rindexes()) { + const v = this.#valList[i]; + const value = this.#isBackgroundFetch(v) ? v.__staleWhileFetching : v; + if (value === undefined) + continue; + fn.call(thisp, value, this.#keyList[i], this); + } + } + purgeStale() { + let deleted = false; + for (const i of this.#rindexes({ allowStale: true })) { + if (this.#isStale(i)) { + this.#delete(this.#keyList[i], "expire"); + deleted = true; + } + } + return deleted; + } + info(key) { + const i = this.#keyMap.get(key); + if (i === undefined) + return; + const v = this.#valList[i]; + const value = this.#isBackgroundFetch(v) ? v.__staleWhileFetching : v; + if (value === undefined) + return; + const entry = { value }; + if (this.#ttls && this.#starts) { + const ttl = this.#ttls[i]; + const start = this.#starts[i]; + if (ttl && start) { + const remain = ttl - (perf.now() - start); + entry.ttl = remain; + entry.start = Date.now(); + } + } + if (this.#sizes) { + entry.size = this.#sizes[i]; + } + return entry; + } + dump() { + const arr = []; + for (const i of this.#indexes({ allowStale: true })) { + const key = this.#keyList[i]; + const v = this.#valList[i]; + const value = this.#isBackgroundFetch(v) ? v.__staleWhileFetching : v; + if (value === undefined || key === undefined) + continue; + const entry = { value }; + if (this.#ttls && this.#starts) { + entry.ttl = this.#ttls[i]; + const age = perf.now() - this.#starts[i]; + entry.start = Math.floor(Date.now() - age); + } + if (this.#sizes) { + entry.size = this.#sizes[i]; + } + arr.unshift([key, entry]); + } + return arr; + } + load(arr) { + this.clear(); + for (const [key, entry] of arr) { + if (entry.start) { + const age = Date.now() - entry.start; + entry.start = perf.now() - age; + } + this.set(key, entry.value, entry); + } + } + set(k, v, setOptions = {}) { + if (v === undefined) { + this.delete(k); + return this; + } + const { ttl = this.ttl, start, noDisposeOnSet = this.noDisposeOnSet, sizeCalculation = this.sizeCalculation, status } = setOptions; + let { noUpdateTTL = this.noUpdateTTL } = setOptions; + const size = this.#requireSize(k, v, setOptions.size || 0, sizeCalculation); + if (this.maxEntrySize && size > this.maxEntrySize) { + if (status) { + status.set = "miss"; + status.maxEntrySizeExceeded = true; + } + this.#delete(k, "set"); + return this; + } + let index = this.#size === 0 ? undefined : this.#keyMap.get(k); + if (index === undefined) { + index = this.#size === 0 ? this.#tail : this.#free.length !== 0 ? this.#free.pop() : this.#size === this.#max ? this.#evict(false) : this.#size; + this.#keyList[index] = k; + this.#valList[index] = v; + this.#keyMap.set(k, index); + this.#next[this.#tail] = index; + this.#prev[index] = this.#tail; + this.#tail = index; + this.#size++; + this.#addItemSize(index, size, status); + if (status) + status.set = "add"; + noUpdateTTL = false; + } else { + this.#moveToTail(index); + const oldVal = this.#valList[index]; + if (v !== oldVal) { + if (this.#hasFetchMethod && this.#isBackgroundFetch(oldVal)) { + oldVal.__abortController.abort(new Error("replaced")); + const { __staleWhileFetching: s } = oldVal; + if (s !== undefined && !noDisposeOnSet) { + if (this.#hasDispose) { + this.#dispose?.(s, k, "set"); + } + if (this.#hasDisposeAfter) { + this.#disposed?.push([s, k, "set"]); + } + } + } else if (!noDisposeOnSet) { + if (this.#hasDispose) { + this.#dispose?.(oldVal, k, "set"); + } + if (this.#hasDisposeAfter) { + this.#disposed?.push([oldVal, k, "set"]); + } + } + this.#removeItemSize(index); + this.#addItemSize(index, size, status); + this.#valList[index] = v; + if (status) { + status.set = "replace"; + const oldValue = oldVal && this.#isBackgroundFetch(oldVal) ? oldVal.__staleWhileFetching : oldVal; + if (oldValue !== undefined) + status.oldValue = oldValue; + } + } else if (status) { + status.set = "update"; + } + } + if (ttl !== 0 && !this.#ttls) { + this.#initializeTTLTracking(); + } + if (this.#ttls) { + if (!noUpdateTTL) { + this.#setItemTTL(index, ttl, start); + } + if (status) + this.#statusTTL(status, index); + } + if (!noDisposeOnSet && this.#hasDisposeAfter && this.#disposed) { + const dt = this.#disposed; + let task; + while (task = dt?.shift()) { + this.#disposeAfter?.(...task); + } + } + return this; + } + pop() { + try { + while (this.#size) { + const val2 = this.#valList[this.#head]; + this.#evict(true); + if (this.#isBackgroundFetch(val2)) { + if (val2.__staleWhileFetching) { + return val2.__staleWhileFetching; + } + } else if (val2 !== undefined) { + return val2; + } + } + } finally { + if (this.#hasDisposeAfter && this.#disposed) { + const dt = this.#disposed; + let task; + while (task = dt?.shift()) { + this.#disposeAfter?.(...task); + } + } + } + } + #evict(free) { + const head = this.#head; + const k = this.#keyList[head]; + const v = this.#valList[head]; + if (this.#hasFetchMethod && this.#isBackgroundFetch(v)) { + v.__abortController.abort(new Error("evicted")); + } else if (this.#hasDispose || this.#hasDisposeAfter) { + if (this.#hasDispose) { + this.#dispose?.(v, k, "evict"); + } + if (this.#hasDisposeAfter) { + this.#disposed?.push([v, k, "evict"]); + } + } + this.#removeItemSize(head); + if (free) { + this.#keyList[head] = undefined; + this.#valList[head] = undefined; + this.#free.push(head); + } + if (this.#size === 1) { + this.#head = this.#tail = 0; + this.#free.length = 0; + } else { + this.#head = this.#next[head]; + } + this.#keyMap.delete(k); + this.#size--; + return head; + } + has(k, hasOptions = {}) { + const { updateAgeOnHas = this.updateAgeOnHas, status } = hasOptions; + const index = this.#keyMap.get(k); + if (index !== undefined) { + const v = this.#valList[index]; + if (this.#isBackgroundFetch(v) && v.__staleWhileFetching === undefined) { + return false; + } + if (!this.#isStale(index)) { + if (updateAgeOnHas) { + this.#updateItemAge(index); + } + if (status) { + status.has = "hit"; + this.#statusTTL(status, index); + } + return true; + } else if (status) { + status.has = "stale"; + this.#statusTTL(status, index); + } + } else if (status) { + status.has = "miss"; + } + return false; + } + peek(k, peekOptions = {}) { + const { allowStale = this.allowStale } = peekOptions; + const index = this.#keyMap.get(k); + if (index === undefined || !allowStale && this.#isStale(index)) { + return; + } + const v = this.#valList[index]; + return this.#isBackgroundFetch(v) ? v.__staleWhileFetching : v; + } + #backgroundFetch(k, index, options, context) { + const v = index === undefined ? undefined : this.#valList[index]; + if (this.#isBackgroundFetch(v)) { + return v; + } + const ac = new AC; + const { signal } = options; + signal?.addEventListener("abort", () => ac.abort(signal.reason), { + signal: ac.signal + }); + const fetchOpts = { + signal: ac.signal, + options, + context + }; + const cb = (v2, updateCache = false) => { + const { aborted } = ac.signal; + const ignoreAbort = options.ignoreFetchAbort && v2 !== undefined; + if (options.status) { + if (aborted && !updateCache) { + options.status.fetchAborted = true; + options.status.fetchError = ac.signal.reason; + if (ignoreAbort) + options.status.fetchAbortIgnored = true; + } else { + options.status.fetchResolved = true; + } + } + if (aborted && !ignoreAbort && !updateCache) { + return fetchFail(ac.signal.reason); + } + const bf2 = p; + if (this.#valList[index] === p) { + if (v2 === undefined) { + if (bf2.__staleWhileFetching) { + this.#valList[index] = bf2.__staleWhileFetching; + } else { + this.#delete(k, "fetch"); + } + } else { + if (options.status) + options.status.fetchUpdated = true; + this.set(k, v2, fetchOpts.options); + } + } + return v2; + }; + const eb = (er) => { + if (options.status) { + options.status.fetchRejected = true; + options.status.fetchError = er; + } + return fetchFail(er); + }; + const fetchFail = (er) => { + const { aborted } = ac.signal; + const allowStaleAborted = aborted && options.allowStaleOnFetchAbort; + const allowStale = allowStaleAborted || options.allowStaleOnFetchRejection; + const noDelete = allowStale || options.noDeleteOnFetchRejection; + const bf2 = p; + if (this.#valList[index] === p) { + const del = !noDelete || bf2.__staleWhileFetching === undefined; + if (del) { + this.#delete(k, "fetch"); + } else if (!allowStaleAborted) { + this.#valList[index] = bf2.__staleWhileFetching; + } + } + if (allowStale) { + if (options.status && bf2.__staleWhileFetching !== undefined) { + options.status.returnedStale = true; + } + return bf2.__staleWhileFetching; + } else if (bf2.__returned === bf2) { + throw er; + } + }; + const pcall = (res, rej) => { + const fmp = this.#fetchMethod?.(k, v, fetchOpts); + if (fmp && fmp instanceof Promise) { + fmp.then((v2) => res(v2 === undefined ? undefined : v2), rej); + } + ac.signal.addEventListener("abort", () => { + if (!options.ignoreFetchAbort || options.allowStaleOnFetchAbort) { + res(undefined); + if (options.allowStaleOnFetchAbort) { + res = (v2) => cb(v2, true); + } + } + }); + }; + if (options.status) + options.status.fetchDispatched = true; + const p = new Promise(pcall).then(cb, eb); + const bf = Object.assign(p, { + __abortController: ac, + __staleWhileFetching: v, + __returned: undefined + }); + if (index === undefined) { + this.set(k, bf, { ...fetchOpts.options, status: undefined }); + index = this.#keyMap.get(k); + } else { + this.#valList[index] = bf; + } + return bf; + } + #isBackgroundFetch(p) { + if (!this.#hasFetchMethod) + return false; + const b = p; + return !!b && b instanceof Promise && b.hasOwnProperty("__staleWhileFetching") && b.__abortController instanceof AC; + } + async fetch(k, fetchOptions = {}) { + const { + allowStale = this.allowStale, + updateAgeOnGet = this.updateAgeOnGet, + noDeleteOnStaleGet = this.noDeleteOnStaleGet, + ttl = this.ttl, + noDisposeOnSet = this.noDisposeOnSet, + size = 0, + sizeCalculation = this.sizeCalculation, + noUpdateTTL = this.noUpdateTTL, + noDeleteOnFetchRejection = this.noDeleteOnFetchRejection, + allowStaleOnFetchRejection = this.allowStaleOnFetchRejection, + ignoreFetchAbort = this.ignoreFetchAbort, + allowStaleOnFetchAbort = this.allowStaleOnFetchAbort, + context, + forceRefresh = false, + status, + signal + } = fetchOptions; + if (!this.#hasFetchMethod) { + if (status) + status.fetch = "get"; + return this.get(k, { + allowStale, + updateAgeOnGet, + noDeleteOnStaleGet, + status + }); + } + const options = { + allowStale, + updateAgeOnGet, + noDeleteOnStaleGet, + ttl, + noDisposeOnSet, + size, + sizeCalculation, + noUpdateTTL, + noDeleteOnFetchRejection, + allowStaleOnFetchRejection, + allowStaleOnFetchAbort, + ignoreFetchAbort, + status, + signal + }; + let index = this.#keyMap.get(k); + if (index === undefined) { + if (status) + status.fetch = "miss"; + const p = this.#backgroundFetch(k, index, options, context); + return p.__returned = p; + } else { + const v = this.#valList[index]; + if (this.#isBackgroundFetch(v)) { + const stale = allowStale && v.__staleWhileFetching !== undefined; + if (status) { + status.fetch = "inflight"; + if (stale) + status.returnedStale = true; + } + return stale ? v.__staleWhileFetching : v.__returned = v; + } + const isStale = this.#isStale(index); + if (!forceRefresh && !isStale) { + if (status) + status.fetch = "hit"; + this.#moveToTail(index); + if (updateAgeOnGet) { + this.#updateItemAge(index); + } + if (status) + this.#statusTTL(status, index); + return v; + } + const p = this.#backgroundFetch(k, index, options, context); + const hasStale = p.__staleWhileFetching !== undefined; + const staleVal = hasStale && allowStale; + if (status) { + status.fetch = isStale ? "stale" : "refresh"; + if (staleVal && isStale) + status.returnedStale = true; + } + return staleVal ? p.__staleWhileFetching : p.__returned = p; + } + } + async forceFetch(k, fetchOptions = {}) { + const v = await this.fetch(k, fetchOptions); + if (v === undefined) + throw new Error("fetch() returned undefined"); + return v; + } + memo(k, memoOptions = {}) { + const memoMethod = this.#memoMethod; + if (!memoMethod) { + throw new Error("no memoMethod provided to constructor"); + } + const { context, forceRefresh, ...options } = memoOptions; + const v = this.get(k, options); + if (!forceRefresh && v !== undefined) + return v; + const vv = memoMethod(k, v, { + options, + context + }); + this.set(k, vv, options); + return vv; + } + get(k, getOptions = {}) { + const { allowStale = this.allowStale, updateAgeOnGet = this.updateAgeOnGet, noDeleteOnStaleGet = this.noDeleteOnStaleGet, status } = getOptions; + const index = this.#keyMap.get(k); + if (index !== undefined) { + const value = this.#valList[index]; + const fetching = this.#isBackgroundFetch(value); + if (status) + this.#statusTTL(status, index); + if (this.#isStale(index)) { + if (status) + status.get = "stale"; + if (!fetching) { + if (!noDeleteOnStaleGet) { + this.#delete(k, "expire"); + } + if (status && allowStale) + status.returnedStale = true; + return allowStale ? value : undefined; + } else { + if (status && allowStale && value.__staleWhileFetching !== undefined) { + status.returnedStale = true; + } + return allowStale ? value.__staleWhileFetching : undefined; + } + } else { + if (status) + status.get = "hit"; + if (fetching) { + return value.__staleWhileFetching; + } + this.#moveToTail(index); + if (updateAgeOnGet) { + this.#updateItemAge(index); + } + return value; + } + } else if (status) { + status.get = "miss"; + } + } + #connect(p, n) { + this.#prev[n] = p; + this.#next[p] = n; + } + #moveToTail(index) { + if (index !== this.#tail) { + if (index === this.#head) { + this.#head = this.#next[index]; + } else { + this.#connect(this.#prev[index], this.#next[index]); + } + this.#connect(this.#tail, index); + this.#tail = index; + } + } + delete(k) { + return this.#delete(k, "delete"); + } + #delete(k, reason) { + let deleted = false; + if (this.#size !== 0) { + const index = this.#keyMap.get(k); + if (index !== undefined) { + deleted = true; + if (this.#size === 1) { + this.#clear(reason); + } else { + this.#removeItemSize(index); + const v = this.#valList[index]; + if (this.#isBackgroundFetch(v)) { + v.__abortController.abort(new Error("deleted")); + } else if (this.#hasDispose || this.#hasDisposeAfter) { + if (this.#hasDispose) { + this.#dispose?.(v, k, reason); + } + if (this.#hasDisposeAfter) { + this.#disposed?.push([v, k, reason]); + } + } + this.#keyMap.delete(k); + this.#keyList[index] = undefined; + this.#valList[index] = undefined; + if (index === this.#tail) { + this.#tail = this.#prev[index]; + } else if (index === this.#head) { + this.#head = this.#next[index]; + } else { + const pi = this.#prev[index]; + this.#next[pi] = this.#next[index]; + const ni = this.#next[index]; + this.#prev[ni] = this.#prev[index]; + } + this.#size--; + this.#free.push(index); + } + } + } + if (this.#hasDisposeAfter && this.#disposed?.length) { + const dt = this.#disposed; + let task; + while (task = dt?.shift()) { + this.#disposeAfter?.(...task); + } + } + return deleted; + } + clear() { + return this.#clear("delete"); + } + #clear(reason) { + for (const index of this.#rindexes({ allowStale: true })) { + const v = this.#valList[index]; + if (this.#isBackgroundFetch(v)) { + v.__abortController.abort(new Error("deleted")); + } else { + const k = this.#keyList[index]; + if (this.#hasDispose) { + this.#dispose?.(v, k, reason); + } + if (this.#hasDisposeAfter) { + this.#disposed?.push([v, k, reason]); + } + } + } + this.#keyMap.clear(); + this.#valList.fill(undefined); + this.#keyList.fill(undefined); + if (this.#ttls && this.#starts) { + this.#ttls.fill(0); + this.#starts.fill(0); + } + if (this.#sizes) { + this.#sizes.fill(0); + } + this.#head = 0; + this.#tail = 0; + this.#free.length = 0; + this.#calculatedSize = 0; + this.#size = 0; + if (this.#hasDisposeAfter && this.#disposed) { + const dt = this.#disposed; + let task; + while (task = dt?.shift()) { + this.#disposeAfter?.(...task); + } + } + } + } + exports2.LRUCache = LRUCache; +}); + +// node_modules/minipass/dist/commonjs/index.js +var require_commonjs15 = __commonJS((exports2) => { + var __importDefault = exports2 && exports2.__importDefault || function(mod) { + return mod && mod.__esModule ? mod : { default: mod }; + }; + Object.defineProperty(exports2, "__esModule", { value: true }); + exports2.Minipass = exports2.isWritable = exports2.isReadable = exports2.isStream = undefined; + var proc = typeof process === "object" && process ? process : { + stdout: null, + stderr: null + }; + var node_events_1 = require("node:events"); + var node_stream_1 = __importDefault(require("node:stream")); + var node_string_decoder_1 = require("node:string_decoder"); + var isStream = (s) => !!s && typeof s === "object" && (s instanceof Minipass || s instanceof node_stream_1.default || (0, exports2.isReadable)(s) || (0, exports2.isWritable)(s)); + exports2.isStream = isStream; + var isReadable = (s) => !!s && typeof s === "object" && s instanceof node_events_1.EventEmitter && typeof s.pipe === "function" && s.pipe !== node_stream_1.default.Writable.prototype.pipe; + exports2.isReadable = isReadable; + var isWritable = (s) => !!s && typeof s === "object" && s instanceof node_events_1.EventEmitter && typeof s.write === "function" && typeof s.end === "function"; + exports2.isWritable = isWritable; + var EOF = Symbol("EOF"); + var MAYBE_EMIT_END = Symbol("maybeEmitEnd"); + var EMITTED_END = Symbol("emittedEnd"); + var EMITTING_END = Symbol("emittingEnd"); + var EMITTED_ERROR = Symbol("emittedError"); + var CLOSED = Symbol("closed"); + var READ = Symbol("read"); + var FLUSH = Symbol("flush"); + var FLUSHCHUNK = Symbol("flushChunk"); + var ENCODING = Symbol("encoding"); + var DECODER = Symbol("decoder"); + var FLOWING = Symbol("flowing"); + var PAUSED = Symbol("paused"); + var RESUME = Symbol("resume"); + var BUFFER = Symbol("buffer"); + var PIPES = Symbol("pipes"); + var BUFFERLENGTH = Symbol("bufferLength"); + var BUFFERPUSH = Symbol("bufferPush"); + var BUFFERSHIFT = Symbol("bufferShift"); + var OBJECTMODE = Symbol("objectMode"); + var DESTROYED = Symbol("destroyed"); + var ERROR = Symbol("error"); + var EMITDATA = Symbol("emitData"); + var EMITEND = Symbol("emitEnd"); + var EMITEND2 = Symbol("emitEnd2"); + var ASYNC = Symbol("async"); + var ABORT = Symbol("abort"); + var ABORTED = Symbol("aborted"); + var SIGNAL = Symbol("signal"); + var DATALISTENERS = Symbol("dataListeners"); + var DISCARDED = Symbol("discarded"); + var defer = (fn) => Promise.resolve().then(fn); + var nodefer = (fn) => fn(); + var isEndish = (ev) => ev === "end" || ev === "finish" || ev === "prefinish"; + var isArrayBufferLike = (b) => b instanceof ArrayBuffer || !!b && typeof b === "object" && b.constructor && b.constructor.name === "ArrayBuffer" && b.byteLength >= 0; + var isArrayBufferView = (b) => !Buffer.isBuffer(b) && ArrayBuffer.isView(b); + + class Pipe { + src; + dest; + opts; + ondrain; + constructor(src, dest, opts) { + this.src = src; + this.dest = dest; + this.opts = opts; + this.ondrain = () => src[RESUME](); + this.dest.on("drain", this.ondrain); + } + unpipe() { + this.dest.removeListener("drain", this.ondrain); + } + proxyErrors(_er) { + } + end() { + this.unpipe(); + if (this.opts.end) + this.dest.end(); + } + } + + class PipeProxyErrors extends Pipe { + unpipe() { + this.src.removeListener("error", this.proxyErrors); + super.unpipe(); + } + constructor(src, dest, opts) { + super(src, dest, opts); + this.proxyErrors = (er) => dest.emit("error", er); + src.on("error", this.proxyErrors); + } + } + var isObjectModeOptions = (o) => !!o.objectMode; + var isEncodingOptions = (o) => !o.objectMode && !!o.encoding && o.encoding !== "buffer"; + + class Minipass extends node_events_1.EventEmitter { + [FLOWING] = false; + [PAUSED] = false; + [PIPES] = []; + [BUFFER] = []; + [OBJECTMODE]; + [ENCODING]; + [ASYNC]; + [DECODER]; + [EOF] = false; + [EMITTED_END] = false; + [EMITTING_END] = false; + [CLOSED] = false; + [EMITTED_ERROR] = null; + [BUFFERLENGTH] = 0; + [DESTROYED] = false; + [SIGNAL]; + [ABORTED] = false; + [DATALISTENERS] = 0; + [DISCARDED] = false; + writable = true; + readable = true; + constructor(...args) { + const options = args[0] || {}; + super(); + if (options.objectMode && typeof options.encoding === "string") { + throw new TypeError("Encoding and objectMode may not be used together"); + } + if (isObjectModeOptions(options)) { + this[OBJECTMODE] = true; + this[ENCODING] = null; + } else if (isEncodingOptions(options)) { + this[ENCODING] = options.encoding; + this[OBJECTMODE] = false; + } else { + this[OBJECTMODE] = false; + this[ENCODING] = null; + } + this[ASYNC] = !!options.async; + this[DECODER] = this[ENCODING] ? new node_string_decoder_1.StringDecoder(this[ENCODING]) : null; + if (options && options.debugExposeBuffer === true) { + Object.defineProperty(this, "buffer", { get: () => this[BUFFER] }); + } + if (options && options.debugExposePipes === true) { + Object.defineProperty(this, "pipes", { get: () => this[PIPES] }); + } + const { signal } = options; + if (signal) { + this[SIGNAL] = signal; + if (signal.aborted) { + this[ABORT](); + } else { + signal.addEventListener("abort", () => this[ABORT]()); + } + } + } + get bufferLength() { + return this[BUFFERLENGTH]; + } + get encoding() { + return this[ENCODING]; + } + set encoding(_enc) { + throw new Error("Encoding must be set at instantiation time"); + } + setEncoding(_enc) { + throw new Error("Encoding must be set at instantiation time"); + } + get objectMode() { + return this[OBJECTMODE]; + } + set objectMode(_om) { + throw new Error("objectMode must be set at instantiation time"); + } + get ["async"]() { + return this[ASYNC]; + } + set ["async"](a) { + this[ASYNC] = this[ASYNC] || !!a; + } + [ABORT]() { + this[ABORTED] = true; + this.emit("abort", this[SIGNAL]?.reason); + this.destroy(this[SIGNAL]?.reason); + } + get aborted() { + return this[ABORTED]; + } + set aborted(_2) { + } + write(chunk, encoding, cb) { + if (this[ABORTED]) + return false; + if (this[EOF]) + throw new Error("write after end"); + if (this[DESTROYED]) { + this.emit("error", Object.assign(new Error("Cannot call write after a stream was destroyed"), { code: "ERR_STREAM_DESTROYED" })); + return true; + } + if (typeof encoding === "function") { + cb = encoding; + encoding = "utf8"; + } + if (!encoding) + encoding = "utf8"; + const fn = this[ASYNC] ? defer : nodefer; + if (!this[OBJECTMODE] && !Buffer.isBuffer(chunk)) { + if (isArrayBufferView(chunk)) { + chunk = Buffer.from(chunk.buffer, chunk.byteOffset, chunk.byteLength); + } else if (isArrayBufferLike(chunk)) { + chunk = Buffer.from(chunk); + } else if (typeof chunk !== "string") { + throw new Error("Non-contiguous data written to non-objectMode stream"); + } + } + if (this[OBJECTMODE]) { + if (this[FLOWING] && this[BUFFERLENGTH] !== 0) + this[FLUSH](true); + if (this[FLOWING]) + this.emit("data", chunk); + else + this[BUFFERPUSH](chunk); + if (this[BUFFERLENGTH] !== 0) + this.emit("readable"); + if (cb) + fn(cb); + return this[FLOWING]; + } + if (!chunk.length) { + if (this[BUFFERLENGTH] !== 0) + this.emit("readable"); + if (cb) + fn(cb); + return this[FLOWING]; + } + if (typeof chunk === "string" && !(encoding === this[ENCODING] && !this[DECODER]?.lastNeed)) { + chunk = Buffer.from(chunk, encoding); + } + if (Buffer.isBuffer(chunk) && this[ENCODING]) { + chunk = this[DECODER].write(chunk); + } + if (this[FLOWING] && this[BUFFERLENGTH] !== 0) + this[FLUSH](true); + if (this[FLOWING]) + this.emit("data", chunk); + else + this[BUFFERPUSH](chunk); + if (this[BUFFERLENGTH] !== 0) + this.emit("readable"); + if (cb) + fn(cb); + return this[FLOWING]; + } + read(n) { + if (this[DESTROYED]) + return null; + this[DISCARDED] = false; + if (this[BUFFERLENGTH] === 0 || n === 0 || n && n > this[BUFFERLENGTH]) { + this[MAYBE_EMIT_END](); + return null; + } + if (this[OBJECTMODE]) + n = null; + if (this[BUFFER].length > 1 && !this[OBJECTMODE]) { + this[BUFFER] = [ + this[ENCODING] ? this[BUFFER].join("") : Buffer.concat(this[BUFFER], this[BUFFERLENGTH]) + ]; + } + const ret = this[READ](n || null, this[BUFFER][0]); + this[MAYBE_EMIT_END](); + return ret; + } + [READ](n, chunk) { + if (this[OBJECTMODE]) + this[BUFFERSHIFT](); + else { + const c = chunk; + if (n === c.length || n === null) + this[BUFFERSHIFT](); + else if (typeof c === "string") { + this[BUFFER][0] = c.slice(n); + chunk = c.slice(0, n); + this[BUFFERLENGTH] -= n; + } else { + this[BUFFER][0] = c.subarray(n); + chunk = c.subarray(0, n); + this[BUFFERLENGTH] -= n; + } + } + this.emit("data", chunk); + if (!this[BUFFER].length && !this[EOF]) + this.emit("drain"); + return chunk; + } + end(chunk, encoding, cb) { + if (typeof chunk === "function") { + cb = chunk; + chunk = undefined; + } + if (typeof encoding === "function") { + cb = encoding; + encoding = "utf8"; + } + if (chunk !== undefined) + this.write(chunk, encoding); + if (cb) + this.once("end", cb); + this[EOF] = true; + this.writable = false; + if (this[FLOWING] || !this[PAUSED]) + this[MAYBE_EMIT_END](); + return this; + } + [RESUME]() { + if (this[DESTROYED]) + return; + if (!this[DATALISTENERS] && !this[PIPES].length) { + this[DISCARDED] = true; + } + this[PAUSED] = false; + this[FLOWING] = true; + this.emit("resume"); + if (this[BUFFER].length) + this[FLUSH](); + else if (this[EOF]) + this[MAYBE_EMIT_END](); + else + this.emit("drain"); + } + resume() { + return this[RESUME](); + } + pause() { + this[FLOWING] = false; + this[PAUSED] = true; + this[DISCARDED] = false; + } + get destroyed() { + return this[DESTROYED]; + } + get flowing() { + return this[FLOWING]; + } + get paused() { + return this[PAUSED]; + } + [BUFFERPUSH](chunk) { + if (this[OBJECTMODE]) + this[BUFFERLENGTH] += 1; + else + this[BUFFERLENGTH] += chunk.length; + this[BUFFER].push(chunk); + } + [BUFFERSHIFT]() { + if (this[OBJECTMODE]) + this[BUFFERLENGTH] -= 1; + else + this[BUFFERLENGTH] -= this[BUFFER][0].length; + return this[BUFFER].shift(); + } + [FLUSH](noDrain = false) { + do { + } while (this[FLUSHCHUNK](this[BUFFERSHIFT]()) && this[BUFFER].length); + if (!noDrain && !this[BUFFER].length && !this[EOF]) + this.emit("drain"); + } + [FLUSHCHUNK](chunk) { + this.emit("data", chunk); + return this[FLOWING]; + } + pipe(dest, opts) { + if (this[DESTROYED]) + return dest; + this[DISCARDED] = false; + const ended = this[EMITTED_END]; + opts = opts || {}; + if (dest === proc.stdout || dest === proc.stderr) + opts.end = false; + else + opts.end = opts.end !== false; + opts.proxyErrors = !!opts.proxyErrors; + if (ended) { + if (opts.end) + dest.end(); + } else { + this[PIPES].push(!opts.proxyErrors ? new Pipe(this, dest, opts) : new PipeProxyErrors(this, dest, opts)); + if (this[ASYNC]) + defer(() => this[RESUME]()); + else + this[RESUME](); + } + return dest; + } + unpipe(dest) { + const p = this[PIPES].find((p2) => p2.dest === dest); + if (p) { + if (this[PIPES].length === 1) { + if (this[FLOWING] && this[DATALISTENERS] === 0) { + this[FLOWING] = false; + } + this[PIPES] = []; + } else + this[PIPES].splice(this[PIPES].indexOf(p), 1); + p.unpipe(); + } + } + addListener(ev, handler) { + return this.on(ev, handler); + } + on(ev, handler) { + const ret = super.on(ev, handler); + if (ev === "data") { + this[DISCARDED] = false; + this[DATALISTENERS]++; + if (!this[PIPES].length && !this[FLOWING]) { + this[RESUME](); + } + } else if (ev === "readable" && this[BUFFERLENGTH] !== 0) { + super.emit("readable"); + } else if (isEndish(ev) && this[EMITTED_END]) { + super.emit(ev); + this.removeAllListeners(ev); + } else if (ev === "error" && this[EMITTED_ERROR]) { + const h = handler; + if (this[ASYNC]) + defer(() => h.call(this, this[EMITTED_ERROR])); + else + h.call(this, this[EMITTED_ERROR]); + } + return ret; + } + removeListener(ev, handler) { + return this.off(ev, handler); + } + off(ev, handler) { + const ret = super.off(ev, handler); + if (ev === "data") { + this[DATALISTENERS] = this.listeners("data").length; + if (this[DATALISTENERS] === 0 && !this[DISCARDED] && !this[PIPES].length) { + this[FLOWING] = false; + } + } + return ret; + } + removeAllListeners(ev) { + const ret = super.removeAllListeners(ev); + if (ev === "data" || ev === undefined) { + this[DATALISTENERS] = 0; + if (!this[DISCARDED] && !this[PIPES].length) { + this[FLOWING] = false; + } + } + return ret; + } + get emittedEnd() { + return this[EMITTED_END]; + } + [MAYBE_EMIT_END]() { + if (!this[EMITTING_END] && !this[EMITTED_END] && !this[DESTROYED] && this[BUFFER].length === 0 && this[EOF]) { + this[EMITTING_END] = true; + this.emit("end"); + this.emit("prefinish"); + this.emit("finish"); + if (this[CLOSED]) + this.emit("close"); + this[EMITTING_END] = false; + } + } + emit(ev, ...args) { + const data = args[0]; + if (ev !== "error" && ev !== "close" && ev !== DESTROYED && this[DESTROYED]) { + return false; + } else if (ev === "data") { + return !this[OBJECTMODE] && !data ? false : this[ASYNC] ? (defer(() => this[EMITDATA](data)), true) : this[EMITDATA](data); + } else if (ev === "end") { + return this[EMITEND](); + } else if (ev === "close") { + this[CLOSED] = true; + if (!this[EMITTED_END] && !this[DESTROYED]) + return false; + const ret2 = super.emit("close"); + this.removeAllListeners("close"); + return ret2; + } else if (ev === "error") { + this[EMITTED_ERROR] = data; + super.emit(ERROR, data); + const ret2 = !this[SIGNAL] || this.listeners("error").length ? super.emit("error", data) : false; + this[MAYBE_EMIT_END](); + return ret2; + } else if (ev === "resume") { + const ret2 = super.emit("resume"); + this[MAYBE_EMIT_END](); + return ret2; + } else if (ev === "finish" || ev === "prefinish") { + const ret2 = super.emit(ev); + this.removeAllListeners(ev); + return ret2; + } + const ret = super.emit(ev, ...args); + this[MAYBE_EMIT_END](); + return ret; + } + [EMITDATA](data) { + for (const p of this[PIPES]) { + if (p.dest.write(data) === false) + this.pause(); + } + const ret = this[DISCARDED] ? false : super.emit("data", data); + this[MAYBE_EMIT_END](); + return ret; + } + [EMITEND]() { + if (this[EMITTED_END]) + return false; + this[EMITTED_END] = true; + this.readable = false; + return this[ASYNC] ? (defer(() => this[EMITEND2]()), true) : this[EMITEND2](); + } + [EMITEND2]() { + if (this[DECODER]) { + const data = this[DECODER].end(); + if (data) { + for (const p of this[PIPES]) { + p.dest.write(data); + } + if (!this[DISCARDED]) + super.emit("data", data); + } + } + for (const p of this[PIPES]) { + p.end(); + } + const ret = super.emit("end"); + this.removeAllListeners("end"); + return ret; + } + async collect() { + const buf = Object.assign([], { + dataLength: 0 + }); + if (!this[OBJECTMODE]) + buf.dataLength = 0; + const p = this.promise(); + this.on("data", (c) => { + buf.push(c); + if (!this[OBJECTMODE]) + buf.dataLength += c.length; + }); + await p; + return buf; + } + async concat() { + if (this[OBJECTMODE]) { + throw new Error("cannot concat in objectMode"); + } + const buf = await this.collect(); + return this[ENCODING] ? buf.join("") : Buffer.concat(buf, buf.dataLength); + } + async promise() { + return new Promise((resolve, reject) => { + this.on(DESTROYED, () => reject(new Error("stream destroyed"))); + this.on("error", (er) => reject(er)); + this.on("end", () => resolve()); + }); + } + [Symbol.asyncIterator]() { + this[DISCARDED] = false; + let stopped = false; + const stop = async () => { + this.pause(); + stopped = true; + return { value: undefined, done: true }; + }; + const next = () => { + if (stopped) + return stop(); + const res = this.read(); + if (res !== null) + return Promise.resolve({ done: false, value: res }); + if (this[EOF]) + return stop(); + let resolve; + let reject; + const onerr = (er) => { + this.off("data", ondata); + this.off("end", onend); + this.off(DESTROYED, ondestroy); + stop(); + reject(er); + }; + const ondata = (value) => { + this.off("error", onerr); + this.off("end", onend); + this.off(DESTROYED, ondestroy); + this.pause(); + resolve({ value, done: !!this[EOF] }); + }; + const onend = () => { + this.off("error", onerr); + this.off("data", ondata); + this.off(DESTROYED, ondestroy); + stop(); + resolve({ done: true, value: undefined }); + }; + const ondestroy = () => onerr(new Error("stream destroyed")); + return new Promise((res2, rej) => { + reject = rej; + resolve = res2; + this.once(DESTROYED, ondestroy); + this.once("error", onerr); + this.once("end", onend); + this.once("data", ondata); + }); + }; + return { + next, + throw: stop, + return: stop, + [Symbol.asyncIterator]() { + return this; + } + }; + } + [Symbol.iterator]() { + this[DISCARDED] = false; + let stopped = false; + const stop = () => { + this.pause(); + this.off(ERROR, stop); + this.off(DESTROYED, stop); + this.off("end", stop); + stopped = true; + return { done: true, value: undefined }; + }; + const next = () => { + if (stopped) + return stop(); + const value = this.read(); + return value === null ? stop() : { done: false, value }; + }; + this.once("end", stop); + this.once(ERROR, stop); + this.once(DESTROYED, stop); + return { + next, + throw: stop, + return: stop, + [Symbol.iterator]() { + return this; + } + }; + } + destroy(er) { + if (this[DESTROYED]) { + if (er) + this.emit("error", er); + else + this.emit(DESTROYED); + return this; + } + this[DESTROYED] = true; + this[DISCARDED] = true; + this[BUFFER].length = 0; + this[BUFFERLENGTH] = 0; + const wc = this; + if (typeof wc.close === "function" && !this[CLOSED]) + wc.close(); + if (er) + this.emit("error", er); + else + this.emit(DESTROYED); + return this; + } + static get isStream() { + return exports2.isStream; + } + } + exports2.Minipass = Minipass; +}); + +// node_modules/path-scurry/dist/commonjs/index.js +var require_commonjs16 = __commonJS((exports2) => { + var __createBinding = exports2 && exports2.__createBinding || (Object.create ? function(o, m, k, k2) { + if (k2 === undefined) + k2 = k; + var desc = Object.getOwnPropertyDescriptor(m, k); + if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) { + desc = { enumerable: true, get: function() { + return m[k]; + } }; + } + Object.defineProperty(o, k2, desc); + } : function(o, m, k, k2) { + if (k2 === undefined) + k2 = k; + o[k2] = m[k]; + }); + var __setModuleDefault = exports2 && exports2.__setModuleDefault || (Object.create ? function(o, v) { + Object.defineProperty(o, "default", { enumerable: true, value: v }); + } : function(o, v) { + o["default"] = v; + }); + var __importStar = exports2 && exports2.__importStar || function(mod) { + if (mod && mod.__esModule) + return mod; + var result = {}; + if (mod != null) { + for (var k in mod) + if (k !== "default" && Object.prototype.hasOwnProperty.call(mod, k)) + __createBinding(result, mod, k); + } + __setModuleDefault(result, mod); + return result; + }; + Object.defineProperty(exports2, "__esModule", { value: true }); + exports2.PathScurry = exports2.Path = exports2.PathScurryDarwin = exports2.PathScurryPosix = exports2.PathScurryWin32 = exports2.PathScurryBase = exports2.PathPosix = exports2.PathWin32 = exports2.PathBase = exports2.ChildrenCache = exports2.ResolveCache = undefined; + var lru_cache_1 = require_commonjs14(); + var node_path_1 = require("node:path"); + var node_url_1 = require("node:url"); + var fs_1 = require("fs"); + var actualFS = __importStar(require("node:fs")); + var realpathSync = fs_1.realpathSync.native; + var promises_1 = require("node:fs/promises"); + var minipass_1 = require_commonjs15(); + var defaultFS = { + lstatSync: fs_1.lstatSync, + readdir: fs_1.readdir, + readdirSync: fs_1.readdirSync, + readlinkSync: fs_1.readlinkSync, + realpathSync, + promises: { + lstat: promises_1.lstat, + readdir: promises_1.readdir, + readlink: promises_1.readlink, + realpath: promises_1.realpath + } + }; + var fsFromOption = (fsOption) => !fsOption || fsOption === defaultFS || fsOption === actualFS ? defaultFS : { + ...defaultFS, + ...fsOption, + promises: { + ...defaultFS.promises, + ...fsOption.promises || {} + } + }; + var uncDriveRegexp = /^\\\\\?\\([a-z]:)\\?$/i; + var uncToDrive = (rootPath) => rootPath.replace(/\//g, "\\").replace(uncDriveRegexp, "$1\\"); + var eitherSep = /[\\\/]/; + var UNKNOWN = 0; + var IFIFO = 1; + var IFCHR = 2; + var IFDIR = 4; + var IFBLK = 6; + var IFREG = 8; + var IFLNK = 10; + var IFSOCK = 12; + var IFMT = 15; + var IFMT_UNKNOWN = ~IFMT; + var READDIR_CALLED = 16; + var LSTAT_CALLED = 32; + var ENOTDIR = 64; + var ENOENT = 128; + var ENOREADLINK = 256; + var ENOREALPATH = 512; + var ENOCHILD = ENOTDIR | ENOENT | ENOREALPATH; + var TYPEMASK = 1023; + var entToType = (s) => s.isFile() ? IFREG : s.isDirectory() ? IFDIR : s.isSymbolicLink() ? IFLNK : s.isCharacterDevice() ? IFCHR : s.isBlockDevice() ? IFBLK : s.isSocket() ? IFSOCK : s.isFIFO() ? IFIFO : UNKNOWN; + var normalizeCache = new Map; + var normalize = (s) => { + const c = normalizeCache.get(s); + if (c) + return c; + const n = s.normalize("NFKD"); + normalizeCache.set(s, n); + return n; + }; + var normalizeNocaseCache = new Map; + var normalizeNocase = (s) => { + const c = normalizeNocaseCache.get(s); + if (c) + return c; + const n = normalize(s.toLowerCase()); + normalizeNocaseCache.set(s, n); + return n; + }; + + class ResolveCache extends lru_cache_1.LRUCache { + constructor() { + super({ max: 256 }); + } + } + exports2.ResolveCache = ResolveCache; + + class ChildrenCache extends lru_cache_1.LRUCache { + constructor(maxSize = 16 * 1024) { + super({ + maxSize, + sizeCalculation: (a) => a.length + 1 + }); + } + } + exports2.ChildrenCache = ChildrenCache; + var setAsCwd = Symbol("PathScurry setAsCwd"); + + class PathBase { + name; + root; + roots; + parent; + nocase; + isCWD = false; + #fs; + #dev; + get dev() { + return this.#dev; + } + #mode; + get mode() { + return this.#mode; + } + #nlink; + get nlink() { + return this.#nlink; + } + #uid; + get uid() { + return this.#uid; + } + #gid; + get gid() { + return this.#gid; + } + #rdev; + get rdev() { + return this.#rdev; + } + #blksize; + get blksize() { + return this.#blksize; + } + #ino; + get ino() { + return this.#ino; + } + #size; + get size() { + return this.#size; + } + #blocks; + get blocks() { + return this.#blocks; + } + #atimeMs; + get atimeMs() { + return this.#atimeMs; + } + #mtimeMs; + get mtimeMs() { + return this.#mtimeMs; + } + #ctimeMs; + get ctimeMs() { + return this.#ctimeMs; + } + #birthtimeMs; + get birthtimeMs() { + return this.#birthtimeMs; + } + #atime; + get atime() { + return this.#atime; + } + #mtime; + get mtime() { + return this.#mtime; + } + #ctime; + get ctime() { + return this.#ctime; + } + #birthtime; + get birthtime() { + return this.#birthtime; + } + #matchName; + #depth; + #fullpath; + #fullpathPosix; + #relative; + #relativePosix; + #type; + #children; + #linkTarget; + #realpath; + get parentPath() { + return (this.parent || this).fullpath(); + } + get path() { + return this.parentPath; + } + constructor(name, type = UNKNOWN, root, roots, nocase, children, opts) { + this.name = name; + this.#matchName = nocase ? normalizeNocase(name) : normalize(name); + this.#type = type & TYPEMASK; + this.nocase = nocase; + this.roots = roots; + this.root = root || this; + this.#children = children; + this.#fullpath = opts.fullpath; + this.#relative = opts.relative; + this.#relativePosix = opts.relativePosix; + this.parent = opts.parent; + if (this.parent) { + this.#fs = this.parent.#fs; + } else { + this.#fs = fsFromOption(opts.fs); + } + } + depth() { + if (this.#depth !== undefined) + return this.#depth; + if (!this.parent) + return this.#depth = 0; + return this.#depth = this.parent.depth() + 1; + } + childrenCache() { + return this.#children; + } + resolve(path) { + if (!path) { + return this; + } + const rootPath = this.getRootString(path); + const dir = path.substring(rootPath.length); + const dirParts = dir.split(this.splitSep); + const result = rootPath ? this.getRoot(rootPath).#resolveParts(dirParts) : this.#resolveParts(dirParts); + return result; + } + #resolveParts(dirParts) { + let p = this; + for (const part of dirParts) { + p = p.child(part); + } + return p; + } + children() { + const cached = this.#children.get(this); + if (cached) { + return cached; + } + const children = Object.assign([], { provisional: 0 }); + this.#children.set(this, children); + this.#type &= ~READDIR_CALLED; + return children; + } + child(pathPart, opts) { + if (pathPart === "" || pathPart === ".") { + return this; + } + if (pathPart === "..") { + return this.parent || this; + } + const children = this.children(); + const name = this.nocase ? normalizeNocase(pathPart) : normalize(pathPart); + for (const p of children) { + if (p.#matchName === name) { + return p; + } + } + const s = this.parent ? this.sep : ""; + const fullpath = this.#fullpath ? this.#fullpath + s + pathPart : undefined; + const pchild = this.newChild(pathPart, UNKNOWN, { + ...opts, + parent: this, + fullpath + }); + if (!this.canReaddir()) { + pchild.#type |= ENOENT; + } + children.push(pchild); + return pchild; + } + relative() { + if (this.isCWD) + return ""; + if (this.#relative !== undefined) { + return this.#relative; + } + const name = this.name; + const p = this.parent; + if (!p) { + return this.#relative = this.name; + } + const pv = p.relative(); + return pv + (!pv || !p.parent ? "" : this.sep) + name; + } + relativePosix() { + if (this.sep === "/") + return this.relative(); + if (this.isCWD) + return ""; + if (this.#relativePosix !== undefined) + return this.#relativePosix; + const name = this.name; + const p = this.parent; + if (!p) { + return this.#relativePosix = this.fullpathPosix(); + } + const pv = p.relativePosix(); + return pv + (!pv || !p.parent ? "" : "/") + name; + } + fullpath() { + if (this.#fullpath !== undefined) { + return this.#fullpath; + } + const name = this.name; + const p = this.parent; + if (!p) { + return this.#fullpath = this.name; + } + const pv = p.fullpath(); + const fp = pv + (!p.parent ? "" : this.sep) + name; + return this.#fullpath = fp; + } + fullpathPosix() { + if (this.#fullpathPosix !== undefined) + return this.#fullpathPosix; + if (this.sep === "/") + return this.#fullpathPosix = this.fullpath(); + if (!this.parent) { + const p2 = this.fullpath().replace(/\\/g, "/"); + if (/^[a-z]:\//i.test(p2)) { + return this.#fullpathPosix = `//?/${p2}`; + } else { + return this.#fullpathPosix = p2; + } + } + const p = this.parent; + const pfpp = p.fullpathPosix(); + const fpp = pfpp + (!pfpp || !p.parent ? "" : "/") + this.name; + return this.#fullpathPosix = fpp; + } + isUnknown() { + return (this.#type & IFMT) === UNKNOWN; + } + isType(type) { + return this[`is${type}`](); + } + getType() { + return this.isUnknown() ? "Unknown" : this.isDirectory() ? "Directory" : this.isFile() ? "File" : this.isSymbolicLink() ? "SymbolicLink" : this.isFIFO() ? "FIFO" : this.isCharacterDevice() ? "CharacterDevice" : this.isBlockDevice() ? "BlockDevice" : this.isSocket() ? "Socket" : "Unknown"; + } + isFile() { + return (this.#type & IFMT) === IFREG; + } + isDirectory() { + return (this.#type & IFMT) === IFDIR; + } + isCharacterDevice() { + return (this.#type & IFMT) === IFCHR; + } + isBlockDevice() { + return (this.#type & IFMT) === IFBLK; + } + isFIFO() { + return (this.#type & IFMT) === IFIFO; + } + isSocket() { + return (this.#type & IFMT) === IFSOCK; + } + isSymbolicLink() { + return (this.#type & IFLNK) === IFLNK; + } + lstatCached() { + return this.#type & LSTAT_CALLED ? this : undefined; + } + readlinkCached() { + return this.#linkTarget; + } + realpathCached() { + return this.#realpath; + } + readdirCached() { + const children = this.children(); + return children.slice(0, children.provisional); + } + canReadlink() { + if (this.#linkTarget) + return true; + if (!this.parent) + return false; + const ifmt = this.#type & IFMT; + return !(ifmt !== UNKNOWN && ifmt !== IFLNK || this.#type & ENOREADLINK || this.#type & ENOENT); + } + calledReaddir() { + return !!(this.#type & READDIR_CALLED); + } + isENOENT() { + return !!(this.#type & ENOENT); + } + isNamed(n) { + return !this.nocase ? this.#matchName === normalize(n) : this.#matchName === normalizeNocase(n); + } + async readlink() { + const target = this.#linkTarget; + if (target) { + return target; + } + if (!this.canReadlink()) { + return; + } + if (!this.parent) { + return; + } + try { + const read = await this.#fs.promises.readlink(this.fullpath()); + const linkTarget = (await this.parent.realpath())?.resolve(read); + if (linkTarget) { + return this.#linkTarget = linkTarget; + } + } catch (er) { + this.#readlinkFail(er.code); + return; + } + } + readlinkSync() { + const target = this.#linkTarget; + if (target) { + return target; + } + if (!this.canReadlink()) { + return; + } + if (!this.parent) { + return; + } + try { + const read = this.#fs.readlinkSync(this.fullpath()); + const linkTarget = this.parent.realpathSync()?.resolve(read); + if (linkTarget) { + return this.#linkTarget = linkTarget; + } + } catch (er) { + this.#readlinkFail(er.code); + return; + } + } + #readdirSuccess(children) { + this.#type |= READDIR_CALLED; + for (let p = children.provisional;p < children.length; p++) { + const c = children[p]; + if (c) + c.#markENOENT(); + } + } + #markENOENT() { + if (this.#type & ENOENT) + return; + this.#type = (this.#type | ENOENT) & IFMT_UNKNOWN; + this.#markChildrenENOENT(); + } + #markChildrenENOENT() { + const children = this.children(); + children.provisional = 0; + for (const p of children) { + p.#markENOENT(); + } + } + #markENOREALPATH() { + this.#type |= ENOREALPATH; + this.#markENOTDIR(); + } + #markENOTDIR() { + if (this.#type & ENOTDIR) + return; + let t = this.#type; + if ((t & IFMT) === IFDIR) + t &= IFMT_UNKNOWN; + this.#type = t | ENOTDIR; + this.#markChildrenENOENT(); + } + #readdirFail(code = "") { + if (code === "ENOTDIR" || code === "EPERM") { + this.#markENOTDIR(); + } else if (code === "ENOENT") { + this.#markENOENT(); + } else { + this.children().provisional = 0; + } + } + #lstatFail(code = "") { + if (code === "ENOTDIR") { + const p = this.parent; + p.#markENOTDIR(); + } else if (code === "ENOENT") { + this.#markENOENT(); + } + } + #readlinkFail(code = "") { + let ter = this.#type; + ter |= ENOREADLINK; + if (code === "ENOENT") + ter |= ENOENT; + if (code === "EINVAL" || code === "UNKNOWN") { + ter &= IFMT_UNKNOWN; + } + this.#type = ter; + if (code === "ENOTDIR" && this.parent) { + this.parent.#markENOTDIR(); + } + } + #readdirAddChild(e, c) { + return this.#readdirMaybePromoteChild(e, c) || this.#readdirAddNewChild(e, c); + } + #readdirAddNewChild(e, c) { + const type = entToType(e); + const child = this.newChild(e.name, type, { parent: this }); + const ifmt = child.#type & IFMT; + if (ifmt !== IFDIR && ifmt !== IFLNK && ifmt !== UNKNOWN) { + child.#type |= ENOTDIR; + } + c.unshift(child); + c.provisional++; + return child; + } + #readdirMaybePromoteChild(e, c) { + for (let p = c.provisional;p < c.length; p++) { + const pchild = c[p]; + const name = this.nocase ? normalizeNocase(e.name) : normalize(e.name); + if (name !== pchild.#matchName) { + continue; + } + return this.#readdirPromoteChild(e, pchild, p, c); + } + } + #readdirPromoteChild(e, p, index, c) { + const v = p.name; + p.#type = p.#type & IFMT_UNKNOWN | entToType(e); + if (v !== e.name) + p.name = e.name; + if (index !== c.provisional) { + if (index === c.length - 1) + c.pop(); + else + c.splice(index, 1); + c.unshift(p); + } + c.provisional++; + return p; + } + async lstat() { + if ((this.#type & ENOENT) === 0) { + try { + this.#applyStat(await this.#fs.promises.lstat(this.fullpath())); + return this; + } catch (er) { + this.#lstatFail(er.code); + } + } + } + lstatSync() { + if ((this.#type & ENOENT) === 0) { + try { + this.#applyStat(this.#fs.lstatSync(this.fullpath())); + return this; + } catch (er) { + this.#lstatFail(er.code); + } + } + } + #applyStat(st) { + const { atime, atimeMs, birthtime, birthtimeMs, blksize, blocks, ctime, ctimeMs, dev, gid, ino, mode, mtime, mtimeMs, nlink, rdev, size, uid } = st; + this.#atime = atime; + this.#atimeMs = atimeMs; + this.#birthtime = birthtime; + this.#birthtimeMs = birthtimeMs; + this.#blksize = blksize; + this.#blocks = blocks; + this.#ctime = ctime; + this.#ctimeMs = ctimeMs; + this.#dev = dev; + this.#gid = gid; + this.#ino = ino; + this.#mode = mode; + this.#mtime = mtime; + this.#mtimeMs = mtimeMs; + this.#nlink = nlink; + this.#rdev = rdev; + this.#size = size; + this.#uid = uid; + const ifmt = entToType(st); + this.#type = this.#type & IFMT_UNKNOWN | ifmt | LSTAT_CALLED; + if (ifmt !== UNKNOWN && ifmt !== IFDIR && ifmt !== IFLNK) { + this.#type |= ENOTDIR; + } + } + #onReaddirCB = []; + #readdirCBInFlight = false; + #callOnReaddirCB(children) { + this.#readdirCBInFlight = false; + const cbs = this.#onReaddirCB.slice(); + this.#onReaddirCB.length = 0; + cbs.forEach((cb) => cb(null, children)); + } + readdirCB(cb, allowZalgo = false) { + if (!this.canReaddir()) { + if (allowZalgo) + cb(null, []); + else + queueMicrotask(() => cb(null, [])); + return; + } + const children = this.children(); + if (this.calledReaddir()) { + const c = children.slice(0, children.provisional); + if (allowZalgo) + cb(null, c); + else + queueMicrotask(() => cb(null, c)); + return; + } + this.#onReaddirCB.push(cb); + if (this.#readdirCBInFlight) { + return; + } + this.#readdirCBInFlight = true; + const fullpath = this.fullpath(); + this.#fs.readdir(fullpath, { withFileTypes: true }, (er, entries) => { + if (er) { + this.#readdirFail(er.code); + children.provisional = 0; + } else { + for (const e of entries) { + this.#readdirAddChild(e, children); + } + this.#readdirSuccess(children); + } + this.#callOnReaddirCB(children.slice(0, children.provisional)); + return; + }); + } + #asyncReaddirInFlight; + async readdir() { + if (!this.canReaddir()) { + return []; + } + const children = this.children(); + if (this.calledReaddir()) { + return children.slice(0, children.provisional); + } + const fullpath = this.fullpath(); + if (this.#asyncReaddirInFlight) { + await this.#asyncReaddirInFlight; + } else { + let resolve = () => { + }; + this.#asyncReaddirInFlight = new Promise((res) => resolve = res); + try { + for (const e of await this.#fs.promises.readdir(fullpath, { + withFileTypes: true + })) { + this.#readdirAddChild(e, children); + } + this.#readdirSuccess(children); + } catch (er) { + this.#readdirFail(er.code); + children.provisional = 0; + } + this.#asyncReaddirInFlight = undefined; + resolve(); + } + return children.slice(0, children.provisional); + } + readdirSync() { + if (!this.canReaddir()) { + return []; + } + const children = this.children(); + if (this.calledReaddir()) { + return children.slice(0, children.provisional); + } + const fullpath = this.fullpath(); + try { + for (const e of this.#fs.readdirSync(fullpath, { + withFileTypes: true + })) { + this.#readdirAddChild(e, children); + } + this.#readdirSuccess(children); + } catch (er) { + this.#readdirFail(er.code); + children.provisional = 0; + } + return children.slice(0, children.provisional); + } + canReaddir() { + if (this.#type & ENOCHILD) + return false; + const ifmt = IFMT & this.#type; + if (!(ifmt === UNKNOWN || ifmt === IFDIR || ifmt === IFLNK)) { + return false; + } + return true; + } + shouldWalk(dirs, walkFilter) { + return (this.#type & IFDIR) === IFDIR && !(this.#type & ENOCHILD) && !dirs.has(this) && (!walkFilter || walkFilter(this)); + } + async realpath() { + if (this.#realpath) + return this.#realpath; + if ((ENOREALPATH | ENOREADLINK | ENOENT) & this.#type) + return; + try { + const rp = await this.#fs.promises.realpath(this.fullpath()); + return this.#realpath = this.resolve(rp); + } catch (_2) { + this.#markENOREALPATH(); + } + } + realpathSync() { + if (this.#realpath) + return this.#realpath; + if ((ENOREALPATH | ENOREADLINK | ENOENT) & this.#type) + return; + try { + const rp = this.#fs.realpathSync(this.fullpath()); + return this.#realpath = this.resolve(rp); + } catch (_2) { + this.#markENOREALPATH(); + } + } + [setAsCwd](oldCwd) { + if (oldCwd === this) + return; + oldCwd.isCWD = false; + this.isCWD = true; + const changed = new Set([]); + let rp = []; + let p = this; + while (p && p.parent) { + changed.add(p); + p.#relative = rp.join(this.sep); + p.#relativePosix = rp.join("/"); + p = p.parent; + rp.push(".."); + } + p = oldCwd; + while (p && p.parent && !changed.has(p)) { + p.#relative = undefined; + p.#relativePosix = undefined; + p = p.parent; + } + } + } + exports2.PathBase = PathBase; + + class PathWin32 extends PathBase { + sep = "\\"; + splitSep = eitherSep; + constructor(name, type = UNKNOWN, root, roots, nocase, children, opts) { + super(name, type, root, roots, nocase, children, opts); + } + newChild(name, type = UNKNOWN, opts = {}) { + return new PathWin32(name, type, this.root, this.roots, this.nocase, this.childrenCache(), opts); + } + getRootString(path) { + return node_path_1.win32.parse(path).root; + } + getRoot(rootPath) { + rootPath = uncToDrive(rootPath.toUpperCase()); + if (rootPath === this.root.name) { + return this.root; + } + for (const [compare, root] of Object.entries(this.roots)) { + if (this.sameRoot(rootPath, compare)) { + return this.roots[rootPath] = root; + } + } + return this.roots[rootPath] = new PathScurryWin32(rootPath, this).root; + } + sameRoot(rootPath, compare = this.root.name) { + rootPath = rootPath.toUpperCase().replace(/\//g, "\\").replace(uncDriveRegexp, "$1\\"); + return rootPath === compare; + } + } + exports2.PathWin32 = PathWin32; + + class PathPosix extends PathBase { + splitSep = "/"; + sep = "/"; + constructor(name, type = UNKNOWN, root, roots, nocase, children, opts) { + super(name, type, root, roots, nocase, children, opts); + } + getRootString(path) { + return path.startsWith("/") ? "/" : ""; + } + getRoot(_rootPath) { + return this.root; + } + newChild(name, type = UNKNOWN, opts = {}) { + return new PathPosix(name, type, this.root, this.roots, this.nocase, this.childrenCache(), opts); + } + } + exports2.PathPosix = PathPosix; + + class PathScurryBase { + root; + rootPath; + roots; + cwd; + #resolveCache; + #resolvePosixCache; + #children; + nocase; + #fs; + constructor(cwd = process.cwd(), pathImpl, sep, { nocase, childrenCacheSize = 16 * 1024, fs = defaultFS } = {}) { + this.#fs = fsFromOption(fs); + if (cwd instanceof URL || cwd.startsWith("file://")) { + cwd = (0, node_url_1.fileURLToPath)(cwd); + } + const cwdPath = pathImpl.resolve(cwd); + this.roots = Object.create(null); + this.rootPath = this.parseRootPath(cwdPath); + this.#resolveCache = new ResolveCache; + this.#resolvePosixCache = new ResolveCache; + this.#children = new ChildrenCache(childrenCacheSize); + const split = cwdPath.substring(this.rootPath.length).split(sep); + if (split.length === 1 && !split[0]) { + split.pop(); + } + if (nocase === undefined) { + throw new TypeError("must provide nocase setting to PathScurryBase ctor"); + } + this.nocase = nocase; + this.root = this.newRoot(this.#fs); + this.roots[this.rootPath] = this.root; + let prev = this.root; + let len = split.length - 1; + const joinSep = pathImpl.sep; + let abs = this.rootPath; + let sawFirst = false; + for (const part of split) { + const l = len--; + prev = prev.child(part, { + relative: new Array(l).fill("..").join(joinSep), + relativePosix: new Array(l).fill("..").join("/"), + fullpath: abs += (sawFirst ? "" : joinSep) + part + }); + sawFirst = true; + } + this.cwd = prev; + } + depth(path = this.cwd) { + if (typeof path === "string") { + path = this.cwd.resolve(path); + } + return path.depth(); + } + childrenCache() { + return this.#children; + } + resolve(...paths) { + let r = ""; + for (let i = paths.length - 1;i >= 0; i--) { + const p = paths[i]; + if (!p || p === ".") + continue; + r = r ? `${p}/${r}` : p; + if (this.isAbsolute(p)) { + break; + } + } + const cached = this.#resolveCache.get(r); + if (cached !== undefined) { + return cached; + } + const result = this.cwd.resolve(r).fullpath(); + this.#resolveCache.set(r, result); + return result; + } + resolvePosix(...paths) { + let r = ""; + for (let i = paths.length - 1;i >= 0; i--) { + const p = paths[i]; + if (!p || p === ".") + continue; + r = r ? `${p}/${r}` : p; + if (this.isAbsolute(p)) { + break; + } + } + const cached = this.#resolvePosixCache.get(r); + if (cached !== undefined) { + return cached; + } + const result = this.cwd.resolve(r).fullpathPosix(); + this.#resolvePosixCache.set(r, result); + return result; + } + relative(entry = this.cwd) { + if (typeof entry === "string") { + entry = this.cwd.resolve(entry); + } + return entry.relative(); + } + relativePosix(entry = this.cwd) { + if (typeof entry === "string") { + entry = this.cwd.resolve(entry); + } + return entry.relativePosix(); + } + basename(entry = this.cwd) { + if (typeof entry === "string") { + entry = this.cwd.resolve(entry); + } + return entry.name; + } + dirname(entry = this.cwd) { + if (typeof entry === "string") { + entry = this.cwd.resolve(entry); + } + return (entry.parent || entry).fullpath(); + } + async readdir(entry = this.cwd, opts = { + withFileTypes: true + }) { + if (typeof entry === "string") { + entry = this.cwd.resolve(entry); + } else if (!(entry instanceof PathBase)) { + opts = entry; + entry = this.cwd; + } + const { withFileTypes } = opts; + if (!entry.canReaddir()) { + return []; + } else { + const p = await entry.readdir(); + return withFileTypes ? p : p.map((e) => e.name); + } + } + readdirSync(entry = this.cwd, opts = { + withFileTypes: true + }) { + if (typeof entry === "string") { + entry = this.cwd.resolve(entry); + } else if (!(entry instanceof PathBase)) { + opts = entry; + entry = this.cwd; + } + const { withFileTypes = true } = opts; + if (!entry.canReaddir()) { + return []; + } else if (withFileTypes) { + return entry.readdirSync(); + } else { + return entry.readdirSync().map((e) => e.name); + } + } + async lstat(entry = this.cwd) { + if (typeof entry === "string") { + entry = this.cwd.resolve(entry); + } + return entry.lstat(); + } + lstatSync(entry = this.cwd) { + if (typeof entry === "string") { + entry = this.cwd.resolve(entry); + } + return entry.lstatSync(); + } + async readlink(entry = this.cwd, { withFileTypes } = { + withFileTypes: false + }) { + if (typeof entry === "string") { + entry = this.cwd.resolve(entry); + } else if (!(entry instanceof PathBase)) { + withFileTypes = entry.withFileTypes; + entry = this.cwd; + } + const e = await entry.readlink(); + return withFileTypes ? e : e?.fullpath(); + } + readlinkSync(entry = this.cwd, { withFileTypes } = { + withFileTypes: false + }) { + if (typeof entry === "string") { + entry = this.cwd.resolve(entry); + } else if (!(entry instanceof PathBase)) { + withFileTypes = entry.withFileTypes; + entry = this.cwd; + } + const e = entry.readlinkSync(); + return withFileTypes ? e : e?.fullpath(); + } + async realpath(entry = this.cwd, { withFileTypes } = { + withFileTypes: false + }) { + if (typeof entry === "string") { + entry = this.cwd.resolve(entry); + } else if (!(entry instanceof PathBase)) { + withFileTypes = entry.withFileTypes; + entry = this.cwd; + } + const e = await entry.realpath(); + return withFileTypes ? e : e?.fullpath(); + } + realpathSync(entry = this.cwd, { withFileTypes } = { + withFileTypes: false + }) { + if (typeof entry === "string") { + entry = this.cwd.resolve(entry); + } else if (!(entry instanceof PathBase)) { + withFileTypes = entry.withFileTypes; + entry = this.cwd; + } + const e = entry.realpathSync(); + return withFileTypes ? e : e?.fullpath(); + } + async walk(entry = this.cwd, opts = {}) { + if (typeof entry === "string") { + entry = this.cwd.resolve(entry); + } else if (!(entry instanceof PathBase)) { + opts = entry; + entry = this.cwd; + } + const { withFileTypes = true, follow = false, filter, walkFilter } = opts; + const results = []; + if (!filter || filter(entry)) { + results.push(withFileTypes ? entry : entry.fullpath()); + } + const dirs = new Set; + const walk = (dir, cb) => { + dirs.add(dir); + dir.readdirCB((er, entries) => { + if (er) { + return cb(er); + } + let len = entries.length; + if (!len) + return cb(); + const next = () => { + if (--len === 0) { + cb(); + } + }; + for (const e of entries) { + if (!filter || filter(e)) { + results.push(withFileTypes ? e : e.fullpath()); + } + if (follow && e.isSymbolicLink()) { + e.realpath().then((r) => r?.isUnknown() ? r.lstat() : r).then((r) => r?.shouldWalk(dirs, walkFilter) ? walk(r, next) : next()); + } else { + if (e.shouldWalk(dirs, walkFilter)) { + walk(e, next); + } else { + next(); + } + } + } + }, true); + }; + const start = entry; + return new Promise((res, rej) => { + walk(start, (er) => { + if (er) + return rej(er); + res(results); + }); + }); + } + walkSync(entry = this.cwd, opts = {}) { + if (typeof entry === "string") { + entry = this.cwd.resolve(entry); + } else if (!(entry instanceof PathBase)) { + opts = entry; + entry = this.cwd; + } + const { withFileTypes = true, follow = false, filter, walkFilter } = opts; + const results = []; + if (!filter || filter(entry)) { + results.push(withFileTypes ? entry : entry.fullpath()); + } + const dirs = new Set([entry]); + for (const dir of dirs) { + const entries = dir.readdirSync(); + for (const e of entries) { + if (!filter || filter(e)) { + results.push(withFileTypes ? e : e.fullpath()); + } + let r = e; + if (e.isSymbolicLink()) { + if (!(follow && (r = e.realpathSync()))) + continue; + if (r.isUnknown()) + r.lstatSync(); + } + if (r.shouldWalk(dirs, walkFilter)) { + dirs.add(r); + } + } + } + return results; + } + [Symbol.asyncIterator]() { + return this.iterate(); + } + iterate(entry = this.cwd, options = {}) { + if (typeof entry === "string") { + entry = this.cwd.resolve(entry); + } else if (!(entry instanceof PathBase)) { + options = entry; + entry = this.cwd; + } + return this.stream(entry, options)[Symbol.asyncIterator](); + } + [Symbol.iterator]() { + return this.iterateSync(); + } + *iterateSync(entry = this.cwd, opts = {}) { + if (typeof entry === "string") { + entry = this.cwd.resolve(entry); + } else if (!(entry instanceof PathBase)) { + opts = entry; + entry = this.cwd; + } + const { withFileTypes = true, follow = false, filter, walkFilter } = opts; + if (!filter || filter(entry)) { + yield withFileTypes ? entry : entry.fullpath(); + } + const dirs = new Set([entry]); + for (const dir of dirs) { + const entries = dir.readdirSync(); + for (const e of entries) { + if (!filter || filter(e)) { + yield withFileTypes ? e : e.fullpath(); + } + let r = e; + if (e.isSymbolicLink()) { + if (!(follow && (r = e.realpathSync()))) + continue; + if (r.isUnknown()) + r.lstatSync(); + } + if (r.shouldWalk(dirs, walkFilter)) { + dirs.add(r); + } + } + } + } + stream(entry = this.cwd, opts = {}) { + if (typeof entry === "string") { + entry = this.cwd.resolve(entry); + } else if (!(entry instanceof PathBase)) { + opts = entry; + entry = this.cwd; + } + const { withFileTypes = true, follow = false, filter, walkFilter } = opts; + const results = new minipass_1.Minipass({ objectMode: true }); + if (!filter || filter(entry)) { + results.write(withFileTypes ? entry : entry.fullpath()); + } + const dirs = new Set; + const queue = [entry]; + let processing = 0; + const process2 = () => { + let paused = false; + while (!paused) { + const dir = queue.shift(); + if (!dir) { + if (processing === 0) + results.end(); + return; + } + processing++; + dirs.add(dir); + const onReaddir = (er, entries, didRealpaths = false) => { + if (er) + return results.emit("error", er); + if (follow && !didRealpaths) { + const promises = []; + for (const e of entries) { + if (e.isSymbolicLink()) { + promises.push(e.realpath().then((r) => r?.isUnknown() ? r.lstat() : r)); + } + } + if (promises.length) { + Promise.all(promises).then(() => onReaddir(null, entries, true)); + return; + } + } + for (const e of entries) { + if (e && (!filter || filter(e))) { + if (!results.write(withFileTypes ? e : e.fullpath())) { + paused = true; + } + } + } + processing--; + for (const e of entries) { + const r = e.realpathCached() || e; + if (r.shouldWalk(dirs, walkFilter)) { + queue.push(r); + } + } + if (paused && !results.flowing) { + results.once("drain", process2); + } else if (!sync) { + process2(); + } + }; + let sync = true; + dir.readdirCB(onReaddir, true); + sync = false; + } + }; + process2(); + return results; + } + streamSync(entry = this.cwd, opts = {}) { + if (typeof entry === "string") { + entry = this.cwd.resolve(entry); + } else if (!(entry instanceof PathBase)) { + opts = entry; + entry = this.cwd; + } + const { withFileTypes = true, follow = false, filter, walkFilter } = opts; + const results = new minipass_1.Minipass({ objectMode: true }); + const dirs = new Set; + if (!filter || filter(entry)) { + results.write(withFileTypes ? entry : entry.fullpath()); + } + const queue = [entry]; + let processing = 0; + const process2 = () => { + let paused = false; + while (!paused) { + const dir = queue.shift(); + if (!dir) { + if (processing === 0) + results.end(); + return; + } + processing++; + dirs.add(dir); + const entries = dir.readdirSync(); + for (const e of entries) { + if (!filter || filter(e)) { + if (!results.write(withFileTypes ? e : e.fullpath())) { + paused = true; + } + } + } + processing--; + for (const e of entries) { + let r = e; + if (e.isSymbolicLink()) { + if (!(follow && (r = e.realpathSync()))) + continue; + if (r.isUnknown()) + r.lstatSync(); + } + if (r.shouldWalk(dirs, walkFilter)) { + queue.push(r); + } + } + } + if (paused && !results.flowing) + results.once("drain", process2); + }; + process2(); + return results; + } + chdir(path = this.cwd) { + const oldCwd = this.cwd; + this.cwd = typeof path === "string" ? this.cwd.resolve(path) : path; + this.cwd[setAsCwd](oldCwd); + } + } + exports2.PathScurryBase = PathScurryBase; + + class PathScurryWin32 extends PathScurryBase { + sep = "\\"; + constructor(cwd = process.cwd(), opts = {}) { + const { nocase = true } = opts; + super(cwd, node_path_1.win32, "\\", { ...opts, nocase }); + this.nocase = nocase; + for (let p = this.cwd;p; p = p.parent) { + p.nocase = this.nocase; + } + } + parseRootPath(dir) { + return node_path_1.win32.parse(dir).root.toUpperCase(); + } + newRoot(fs) { + return new PathWin32(this.rootPath, IFDIR, undefined, this.roots, this.nocase, this.childrenCache(), { fs }); + } + isAbsolute(p) { + return p.startsWith("/") || p.startsWith("\\") || /^[a-z]:(\/|\\)/i.test(p); + } + } + exports2.PathScurryWin32 = PathScurryWin32; + + class PathScurryPosix extends PathScurryBase { + sep = "/"; + constructor(cwd = process.cwd(), opts = {}) { + const { nocase = false } = opts; + super(cwd, node_path_1.posix, "/", { ...opts, nocase }); + this.nocase = nocase; + } + parseRootPath(_dir) { + return "/"; + } + newRoot(fs) { + return new PathPosix(this.rootPath, IFDIR, undefined, this.roots, this.nocase, this.childrenCache(), { fs }); + } + isAbsolute(p) { + return p.startsWith("/"); + } + } + exports2.PathScurryPosix = PathScurryPosix; + + class PathScurryDarwin extends PathScurryPosix { + constructor(cwd = process.cwd(), opts = {}) { + const { nocase = true } = opts; + super(cwd, { ...opts, nocase }); + } + } + exports2.PathScurryDarwin = PathScurryDarwin; + exports2.Path = process.platform === "win32" ? PathWin32 : PathPosix; + exports2.PathScurry = process.platform === "win32" ? PathScurryWin32 : process.platform === "darwin" ? PathScurryDarwin : PathScurryPosix; +}); + +// node_modules/glob/dist/commonjs/pattern.js +var require_pattern = __commonJS((exports2) => { + Object.defineProperty(exports2, "__esModule", { value: true }); + exports2.Pattern = undefined; + var minimatch_1 = require_commonjs13(); + var isPatternList = (pl) => pl.length >= 1; + var isGlobList = (gl) => gl.length >= 1; + + class Pattern { + #patternList; + #globList; + #index; + length; + #platform; + #rest; + #globString; + #isDrive; + #isUNC; + #isAbsolute; + #followGlobstar = true; + constructor(patternList, globList, index, platform) { + if (!isPatternList(patternList)) { + throw new TypeError("empty pattern list"); + } + if (!isGlobList(globList)) { + throw new TypeError("empty glob list"); + } + if (globList.length !== patternList.length) { + throw new TypeError("mismatched pattern list and glob list lengths"); + } + this.length = patternList.length; + if (index < 0 || index >= this.length) { + throw new TypeError("index out of range"); + } + this.#patternList = patternList; + this.#globList = globList; + this.#index = index; + this.#platform = platform; + if (this.#index === 0) { + if (this.isUNC()) { + const [p0, p1, p2, p3, ...prest] = this.#patternList; + const [g0, g1, g2, g3, ...grest] = this.#globList; + if (prest[0] === "") { + prest.shift(); + grest.shift(); + } + const p = [p0, p1, p2, p3, ""].join("/"); + const g = [g0, g1, g2, g3, ""].join("/"); + this.#patternList = [p, ...prest]; + this.#globList = [g, ...grest]; + this.length = this.#patternList.length; + } else if (this.isDrive() || this.isAbsolute()) { + const [p1, ...prest] = this.#patternList; + const [g1, ...grest] = this.#globList; + if (prest[0] === "") { + prest.shift(); + grest.shift(); + } + const p = p1 + "/"; + const g = g1 + "/"; + this.#patternList = [p, ...prest]; + this.#globList = [g, ...grest]; + this.length = this.#patternList.length; + } + } + } + pattern() { + return this.#patternList[this.#index]; + } + isString() { + return typeof this.#patternList[this.#index] === "string"; + } + isGlobstar() { + return this.#patternList[this.#index] === minimatch_1.GLOBSTAR; + } + isRegExp() { + return this.#patternList[this.#index] instanceof RegExp; + } + globString() { + return this.#globString = this.#globString || (this.#index === 0 ? this.isAbsolute() ? this.#globList[0] + this.#globList.slice(1).join("/") : this.#globList.join("/") : this.#globList.slice(this.#index).join("/")); + } + hasMore() { + return this.length > this.#index + 1; + } + rest() { + if (this.#rest !== undefined) + return this.#rest; + if (!this.hasMore()) + return this.#rest = null; + this.#rest = new Pattern(this.#patternList, this.#globList, this.#index + 1, this.#platform); + this.#rest.#isAbsolute = this.#isAbsolute; + this.#rest.#isUNC = this.#isUNC; + this.#rest.#isDrive = this.#isDrive; + return this.#rest; + } + isUNC() { + const pl = this.#patternList; + return this.#isUNC !== undefined ? this.#isUNC : this.#isUNC = this.#platform === "win32" && this.#index === 0 && pl[0] === "" && pl[1] === "" && typeof pl[2] === "string" && !!pl[2] && typeof pl[3] === "string" && !!pl[3]; + } + isDrive() { + const pl = this.#patternList; + return this.#isDrive !== undefined ? this.#isDrive : this.#isDrive = this.#platform === "win32" && this.#index === 0 && this.length > 1 && typeof pl[0] === "string" && /^[a-z]:$/i.test(pl[0]); + } + isAbsolute() { + const pl = this.#patternList; + return this.#isAbsolute !== undefined ? this.#isAbsolute : this.#isAbsolute = pl[0] === "" && pl.length > 1 || this.isDrive() || this.isUNC(); + } + root() { + const p = this.#patternList[0]; + return typeof p === "string" && this.isAbsolute() && this.#index === 0 ? p : ""; + } + checkFollowGlobstar() { + return !(this.#index === 0 || !this.isGlobstar() || !this.#followGlobstar); + } + markFollowGlobstar() { + if (this.#index === 0 || !this.isGlobstar() || !this.#followGlobstar) + return false; + this.#followGlobstar = false; + return true; + } + } + exports2.Pattern = Pattern; +}); + +// node_modules/glob/dist/commonjs/ignore.js +var require_ignore = __commonJS((exports2) => { + Object.defineProperty(exports2, "__esModule", { value: true }); + exports2.Ignore = undefined; + var minimatch_1 = require_commonjs13(); + var pattern_js_1 = require_pattern(); + var defaultPlatform = typeof process === "object" && process && typeof process.platform === "string" ? process.platform : "linux"; + + class Ignore { + relative; + relativeChildren; + absolute; + absoluteChildren; + platform; + mmopts; + constructor(ignored, { nobrace, nocase, noext, noglobstar, platform = defaultPlatform }) { + this.relative = []; + this.absolute = []; + this.relativeChildren = []; + this.absoluteChildren = []; + this.platform = platform; + this.mmopts = { + dot: true, + nobrace, + nocase, + noext, + noglobstar, + optimizationLevel: 2, + platform, + nocomment: true, + nonegate: true + }; + for (const ign of ignored) + this.add(ign); + } + add(ign) { + const mm = new minimatch_1.Minimatch(ign, this.mmopts); + for (let i = 0;i < mm.set.length; i++) { + const parsed = mm.set[i]; + const globParts = mm.globParts[i]; + if (!parsed || !globParts) { + throw new Error("invalid pattern object"); + } + while (parsed[0] === "." && globParts[0] === ".") { + parsed.shift(); + globParts.shift(); + } + const p = new pattern_js_1.Pattern(parsed, globParts, 0, this.platform); + const m = new minimatch_1.Minimatch(p.globString(), this.mmopts); + const children = globParts[globParts.length - 1] === "**"; + const absolute = p.isAbsolute(); + if (absolute) + this.absolute.push(m); + else + this.relative.push(m); + if (children) { + if (absolute) + this.absoluteChildren.push(m); + else + this.relativeChildren.push(m); + } + } + } + ignored(p) { + const fullpath = p.fullpath(); + const fullpaths = `${fullpath}/`; + const relative = p.relative() || "."; + const relatives = `${relative}/`; + for (const m of this.relative) { + if (m.match(relative) || m.match(relatives)) + return true; + } + for (const m of this.absolute) { + if (m.match(fullpath) || m.match(fullpaths)) + return true; + } + return false; + } + childrenIgnored(p) { + const fullpath = p.fullpath() + "/"; + const relative = (p.relative() || ".") + "/"; + for (const m of this.relativeChildren) { + if (m.match(relative)) + return true; + } + for (const m of this.absoluteChildren) { + if (m.match(fullpath)) + return true; + } + return false; + } + } + exports2.Ignore = Ignore; +}); + +// node_modules/glob/dist/commonjs/processor.js +var require_processor = __commonJS((exports2) => { + Object.defineProperty(exports2, "__esModule", { value: true }); + exports2.Processor = exports2.SubWalks = exports2.MatchRecord = exports2.HasWalkedCache = undefined; + var minimatch_1 = require_commonjs13(); + + class HasWalkedCache { + store; + constructor(store = new Map) { + this.store = store; + } + copy() { + return new HasWalkedCache(new Map(this.store)); + } + hasWalked(target, pattern) { + return this.store.get(target.fullpath())?.has(pattern.globString()); + } + storeWalked(target, pattern) { + const fullpath = target.fullpath(); + const cached = this.store.get(fullpath); + if (cached) + cached.add(pattern.globString()); + else + this.store.set(fullpath, new Set([pattern.globString()])); + } + } + exports2.HasWalkedCache = HasWalkedCache; + + class MatchRecord { + store = new Map; + add(target, absolute, ifDir) { + const n = (absolute ? 2 : 0) | (ifDir ? 1 : 0); + const current = this.store.get(target); + this.store.set(target, current === undefined ? n : n & current); + } + entries() { + return [...this.store.entries()].map(([path, n]) => [ + path, + !!(n & 2), + !!(n & 1) + ]); + } + } + exports2.MatchRecord = MatchRecord; + + class SubWalks { + store = new Map; + add(target, pattern) { + if (!target.canReaddir()) { + return; + } + const subs = this.store.get(target); + if (subs) { + if (!subs.find((p) => p.globString() === pattern.globString())) { + subs.push(pattern); + } + } else + this.store.set(target, [pattern]); + } + get(target) { + const subs = this.store.get(target); + if (!subs) { + throw new Error("attempting to walk unknown path"); + } + return subs; + } + entries() { + return this.keys().map((k) => [k, this.store.get(k)]); + } + keys() { + return [...this.store.keys()].filter((t) => t.canReaddir()); + } + } + exports2.SubWalks = SubWalks; + + class Processor { + hasWalkedCache; + matches = new MatchRecord; + subwalks = new SubWalks; + patterns; + follow; + dot; + opts; + constructor(opts, hasWalkedCache) { + this.opts = opts; + this.follow = !!opts.follow; + this.dot = !!opts.dot; + this.hasWalkedCache = hasWalkedCache ? hasWalkedCache.copy() : new HasWalkedCache; + } + processPatterns(target, patterns) { + this.patterns = patterns; + const processingSet = patterns.map((p) => [target, p]); + for (let [t, pattern] of processingSet) { + this.hasWalkedCache.storeWalked(t, pattern); + const root = pattern.root(); + const absolute = pattern.isAbsolute() && this.opts.absolute !== false; + if (root) { + t = t.resolve(root === "/" && this.opts.root !== undefined ? this.opts.root : root); + const rest2 = pattern.rest(); + if (!rest2) { + this.matches.add(t, true, false); + continue; + } else { + pattern = rest2; + } + } + if (t.isENOENT()) + continue; + let p; + let rest; + let changed = false; + while (typeof (p = pattern.pattern()) === "string" && (rest = pattern.rest())) { + const c = t.resolve(p); + t = c; + pattern = rest; + changed = true; + } + p = pattern.pattern(); + rest = pattern.rest(); + if (changed) { + if (this.hasWalkedCache.hasWalked(t, pattern)) + continue; + this.hasWalkedCache.storeWalked(t, pattern); + } + if (typeof p === "string") { + const ifDir = p === ".." || p === "" || p === "."; + this.matches.add(t.resolve(p), absolute, ifDir); + continue; + } else if (p === minimatch_1.GLOBSTAR) { + if (!t.isSymbolicLink() || this.follow || pattern.checkFollowGlobstar()) { + this.subwalks.add(t, pattern); + } + const rp = rest?.pattern(); + const rrest = rest?.rest(); + if (!rest || (rp === "" || rp === ".") && !rrest) { + this.matches.add(t, absolute, rp === "" || rp === "."); + } else { + if (rp === "..") { + const tp = t.parent || t; + if (!rrest) + this.matches.add(tp, absolute, true); + else if (!this.hasWalkedCache.hasWalked(tp, rrest)) { + this.subwalks.add(tp, rrest); + } + } + } + } else if (p instanceof RegExp) { + this.subwalks.add(t, pattern); + } + } + return this; + } + subwalkTargets() { + return this.subwalks.keys(); + } + child() { + return new Processor(this.opts, this.hasWalkedCache); + } + filterEntries(parent, entries) { + const patterns = this.subwalks.get(parent); + const results = this.child(); + for (const e of entries) { + for (const pattern of patterns) { + const absolute = pattern.isAbsolute(); + const p = pattern.pattern(); + const rest = pattern.rest(); + if (p === minimatch_1.GLOBSTAR) { + results.testGlobstar(e, pattern, rest, absolute); + } else if (p instanceof RegExp) { + results.testRegExp(e, p, rest, absolute); + } else { + results.testString(e, p, rest, absolute); + } + } + } + return results; + } + testGlobstar(e, pattern, rest, absolute) { + if (this.dot || !e.name.startsWith(".")) { + if (!pattern.hasMore()) { + this.matches.add(e, absolute, false); + } + if (e.canReaddir()) { + if (this.follow || !e.isSymbolicLink()) { + this.subwalks.add(e, pattern); + } else if (e.isSymbolicLink()) { + if (rest && pattern.checkFollowGlobstar()) { + this.subwalks.add(e, rest); + } else if (pattern.markFollowGlobstar()) { + this.subwalks.add(e, pattern); + } + } + } + } + if (rest) { + const rp = rest.pattern(); + if (typeof rp === "string" && rp !== ".." && rp !== "" && rp !== ".") { + this.testString(e, rp, rest.rest(), absolute); + } else if (rp === "..") { + const ep = e.parent || e; + this.subwalks.add(ep, rest); + } else if (rp instanceof RegExp) { + this.testRegExp(e, rp, rest.rest(), absolute); + } + } + } + testRegExp(e, p, rest, absolute) { + if (!p.test(e.name)) + return; + if (!rest) { + this.matches.add(e, absolute, false); + } else { + this.subwalks.add(e, rest); + } + } + testString(e, p, rest, absolute) { + if (!e.isNamed(p)) + return; + if (!rest) { + this.matches.add(e, absolute, false); + } else { + this.subwalks.add(e, rest); + } + } + } + exports2.Processor = Processor; +}); + +// node_modules/glob/dist/commonjs/walker.js +var require_walker = __commonJS((exports2) => { + Object.defineProperty(exports2, "__esModule", { value: true }); + exports2.GlobStream = exports2.GlobWalker = exports2.GlobUtil = undefined; + var minipass_1 = require_commonjs15(); + var ignore_js_1 = require_ignore(); + var processor_js_1 = require_processor(); + var makeIgnore = (ignore, opts) => typeof ignore === "string" ? new ignore_js_1.Ignore([ignore], opts) : Array.isArray(ignore) ? new ignore_js_1.Ignore(ignore, opts) : ignore; + + class GlobUtil { + path; + patterns; + opts; + seen = new Set; + paused = false; + aborted = false; + #onResume = []; + #ignore; + #sep; + signal; + maxDepth; + includeChildMatches; + constructor(patterns, path, opts) { + this.patterns = patterns; + this.path = path; + this.opts = opts; + this.#sep = !opts.posix && opts.platform === "win32" ? "\\" : "/"; + this.includeChildMatches = opts.includeChildMatches !== false; + if (opts.ignore || !this.includeChildMatches) { + this.#ignore = makeIgnore(opts.ignore ?? [], opts); + if (!this.includeChildMatches && typeof this.#ignore.add !== "function") { + const m = "cannot ignore child matches, ignore lacks add() method."; + throw new Error(m); + } + } + this.maxDepth = opts.maxDepth || Infinity; + if (opts.signal) { + this.signal = opts.signal; + this.signal.addEventListener("abort", () => { + this.#onResume.length = 0; + }); + } + } + #ignored(path) { + return this.seen.has(path) || !!this.#ignore?.ignored?.(path); + } + #childrenIgnored(path) { + return !!this.#ignore?.childrenIgnored?.(path); + } + pause() { + this.paused = true; + } + resume() { + if (this.signal?.aborted) + return; + this.paused = false; + let fn = undefined; + while (!this.paused && (fn = this.#onResume.shift())) { + fn(); + } + } + onResume(fn) { + if (this.signal?.aborted) + return; + if (!this.paused) { + fn(); + } else { + this.#onResume.push(fn); + } + } + async matchCheck(e, ifDir) { + if (ifDir && this.opts.nodir) + return; + let rpc; + if (this.opts.realpath) { + rpc = e.realpathCached() || await e.realpath(); + if (!rpc) + return; + e = rpc; + } + const needStat = e.isUnknown() || this.opts.stat; + const s = needStat ? await e.lstat() : e; + if (this.opts.follow && this.opts.nodir && s?.isSymbolicLink()) { + const target = await s.realpath(); + if (target && (target.isUnknown() || this.opts.stat)) { + await target.lstat(); + } + } + return this.matchCheckTest(s, ifDir); + } + matchCheckTest(e, ifDir) { + return e && (this.maxDepth === Infinity || e.depth() <= this.maxDepth) && (!ifDir || e.canReaddir()) && (!this.opts.nodir || !e.isDirectory()) && (!this.opts.nodir || !this.opts.follow || !e.isSymbolicLink() || !e.realpathCached()?.isDirectory()) && !this.#ignored(e) ? e : undefined; + } + matchCheckSync(e, ifDir) { + if (ifDir && this.opts.nodir) + return; + let rpc; + if (this.opts.realpath) { + rpc = e.realpathCached() || e.realpathSync(); + if (!rpc) + return; + e = rpc; + } + const needStat = e.isUnknown() || this.opts.stat; + const s = needStat ? e.lstatSync() : e; + if (this.opts.follow && this.opts.nodir && s?.isSymbolicLink()) { + const target = s.realpathSync(); + if (target && (target?.isUnknown() || this.opts.stat)) { + target.lstatSync(); + } + } + return this.matchCheckTest(s, ifDir); + } + matchFinish(e, absolute) { + if (this.#ignored(e)) + return; + if (!this.includeChildMatches && this.#ignore?.add) { + const ign = `${e.relativePosix()}/**`; + this.#ignore.add(ign); + } + const abs = this.opts.absolute === undefined ? absolute : this.opts.absolute; + this.seen.add(e); + const mark = this.opts.mark && e.isDirectory() ? this.#sep : ""; + if (this.opts.withFileTypes) { + this.matchEmit(e); + } else if (abs) { + const abs2 = this.opts.posix ? e.fullpathPosix() : e.fullpath(); + this.matchEmit(abs2 + mark); + } else { + const rel = this.opts.posix ? e.relativePosix() : e.relative(); + const pre = this.opts.dotRelative && !rel.startsWith(".." + this.#sep) ? "." + this.#sep : ""; + this.matchEmit(!rel ? "." + mark : pre + rel + mark); + } + } + async match(e, absolute, ifDir) { + const p = await this.matchCheck(e, ifDir); + if (p) + this.matchFinish(p, absolute); + } + matchSync(e, absolute, ifDir) { + const p = this.matchCheckSync(e, ifDir); + if (p) + this.matchFinish(p, absolute); + } + walkCB(target, patterns, cb) { + if (this.signal?.aborted) + cb(); + this.walkCB2(target, patterns, new processor_js_1.Processor(this.opts), cb); + } + walkCB2(target, patterns, processor, cb) { + if (this.#childrenIgnored(target)) + return cb(); + if (this.signal?.aborted) + cb(); + if (this.paused) { + this.onResume(() => this.walkCB2(target, patterns, processor, cb)); + return; + } + processor.processPatterns(target, patterns); + let tasks = 1; + const next = () => { + if (--tasks === 0) + cb(); + }; + for (const [m, absolute, ifDir] of processor.matches.entries()) { + if (this.#ignored(m)) + continue; + tasks++; + this.match(m, absolute, ifDir).then(() => next()); + } + for (const t of processor.subwalkTargets()) { + if (this.maxDepth !== Infinity && t.depth() >= this.maxDepth) { + continue; + } + tasks++; + const childrenCached = t.readdirCached(); + if (t.calledReaddir()) + this.walkCB3(t, childrenCached, processor, next); + else { + t.readdirCB((_2, entries) => this.walkCB3(t, entries, processor, next), true); + } + } + next(); + } + walkCB3(target, entries, processor, cb) { + processor = processor.filterEntries(target, entries); + let tasks = 1; + const next = () => { + if (--tasks === 0) + cb(); + }; + for (const [m, absolute, ifDir] of processor.matches.entries()) { + if (this.#ignored(m)) + continue; + tasks++; + this.match(m, absolute, ifDir).then(() => next()); + } + for (const [target2, patterns] of processor.subwalks.entries()) { + tasks++; + this.walkCB2(target2, patterns, processor.child(), next); + } + next(); + } + walkCBSync(target, patterns, cb) { + if (this.signal?.aborted) + cb(); + this.walkCB2Sync(target, patterns, new processor_js_1.Processor(this.opts), cb); + } + walkCB2Sync(target, patterns, processor, cb) { + if (this.#childrenIgnored(target)) + return cb(); + if (this.signal?.aborted) + cb(); + if (this.paused) { + this.onResume(() => this.walkCB2Sync(target, patterns, processor, cb)); + return; + } + processor.processPatterns(target, patterns); + let tasks = 1; + const next = () => { + if (--tasks === 0) + cb(); + }; + for (const [m, absolute, ifDir] of processor.matches.entries()) { + if (this.#ignored(m)) + continue; + this.matchSync(m, absolute, ifDir); + } + for (const t of processor.subwalkTargets()) { + if (this.maxDepth !== Infinity && t.depth() >= this.maxDepth) { + continue; + } + tasks++; + const children = t.readdirSync(); + this.walkCB3Sync(t, children, processor, next); + } + next(); + } + walkCB3Sync(target, entries, processor, cb) { + processor = processor.filterEntries(target, entries); + let tasks = 1; + const next = () => { + if (--tasks === 0) + cb(); + }; + for (const [m, absolute, ifDir] of processor.matches.entries()) { + if (this.#ignored(m)) + continue; + this.matchSync(m, absolute, ifDir); + } + for (const [target2, patterns] of processor.subwalks.entries()) { + tasks++; + this.walkCB2Sync(target2, patterns, processor.child(), next); + } + next(); + } + } + exports2.GlobUtil = GlobUtil; + + class GlobWalker extends GlobUtil { + matches = new Set; + constructor(patterns, path, opts) { + super(patterns, path, opts); + } + matchEmit(e) { + this.matches.add(e); + } + async walk() { + if (this.signal?.aborted) + throw this.signal.reason; + if (this.path.isUnknown()) { + await this.path.lstat(); + } + await new Promise((res, rej) => { + this.walkCB(this.path, this.patterns, () => { + if (this.signal?.aborted) { + rej(this.signal.reason); + } else { + res(this.matches); + } + }); + }); + return this.matches; + } + walkSync() { + if (this.signal?.aborted) + throw this.signal.reason; + if (this.path.isUnknown()) { + this.path.lstatSync(); + } + this.walkCBSync(this.path, this.patterns, () => { + if (this.signal?.aborted) + throw this.signal.reason; + }); + return this.matches; + } + } + exports2.GlobWalker = GlobWalker; + + class GlobStream extends GlobUtil { + results; + constructor(patterns, path, opts) { + super(patterns, path, opts); + this.results = new minipass_1.Minipass({ + signal: this.signal, + objectMode: true + }); + this.results.on("drain", () => this.resume()); + this.results.on("resume", () => this.resume()); + } + matchEmit(e) { + this.results.write(e); + if (!this.results.flowing) + this.pause(); + } + stream() { + const target = this.path; + if (target.isUnknown()) { + target.lstat().then(() => { + this.walkCB(target, this.patterns, () => this.results.end()); + }); + } else { + this.walkCB(target, this.patterns, () => this.results.end()); + } + return this.results; + } + streamSync() { + if (this.path.isUnknown()) { + this.path.lstatSync(); + } + this.walkCBSync(this.path, this.patterns, () => this.results.end()); + return this.results; + } + } + exports2.GlobStream = GlobStream; +}); + +// node_modules/glob/dist/commonjs/glob.js +var require_glob = __commonJS((exports2) => { + Object.defineProperty(exports2, "__esModule", { value: true }); + exports2.Glob = undefined; + var minimatch_1 = require_commonjs13(); + var node_url_1 = require("node:url"); + var path_scurry_1 = require_commonjs16(); + var pattern_js_1 = require_pattern(); + var walker_js_1 = require_walker(); + var defaultPlatform = typeof process === "object" && process && typeof process.platform === "string" ? process.platform : "linux"; + + class Glob { + absolute; + cwd; + root; + dot; + dotRelative; + follow; + ignore; + magicalBraces; + mark; + matchBase; + maxDepth; + nobrace; + nocase; + nodir; + noext; + noglobstar; + pattern; + platform; + realpath; + scurry; + stat; + signal; + windowsPathsNoEscape; + withFileTypes; + includeChildMatches; + opts; + patterns; + constructor(pattern, opts) { + if (!opts) + throw new TypeError("glob options required"); + this.withFileTypes = !!opts.withFileTypes; + this.signal = opts.signal; + this.follow = !!opts.follow; + this.dot = !!opts.dot; + this.dotRelative = !!opts.dotRelative; + this.nodir = !!opts.nodir; + this.mark = !!opts.mark; + if (!opts.cwd) { + this.cwd = ""; + } else if (opts.cwd instanceof URL || opts.cwd.startsWith("file://")) { + opts.cwd = (0, node_url_1.fileURLToPath)(opts.cwd); + } + this.cwd = opts.cwd || ""; + this.root = opts.root; + this.magicalBraces = !!opts.magicalBraces; + this.nobrace = !!opts.nobrace; + this.noext = !!opts.noext; + this.realpath = !!opts.realpath; + this.absolute = opts.absolute; + this.includeChildMatches = opts.includeChildMatches !== false; + this.noglobstar = !!opts.noglobstar; + this.matchBase = !!opts.matchBase; + this.maxDepth = typeof opts.maxDepth === "number" ? opts.maxDepth : Infinity; + this.stat = !!opts.stat; + this.ignore = opts.ignore; + if (this.withFileTypes && this.absolute !== undefined) { + throw new Error("cannot set absolute and withFileTypes:true"); + } + if (typeof pattern === "string") { + pattern = [pattern]; + } + this.windowsPathsNoEscape = !!opts.windowsPathsNoEscape || opts.allowWindowsEscape === false; + if (this.windowsPathsNoEscape) { + pattern = pattern.map((p) => p.replace(/\\/g, "/")); + } + if (this.matchBase) { + if (opts.noglobstar) { + throw new TypeError("base matching requires globstar"); + } + pattern = pattern.map((p) => p.includes("/") ? p : `./**/${p}`); + } + this.pattern = pattern; + this.platform = opts.platform || defaultPlatform; + this.opts = { ...opts, platform: this.platform }; + if (opts.scurry) { + this.scurry = opts.scurry; + if (opts.nocase !== undefined && opts.nocase !== opts.scurry.nocase) { + throw new Error("nocase option contradicts provided scurry option"); + } + } else { + const Scurry = opts.platform === "win32" ? path_scurry_1.PathScurryWin32 : opts.platform === "darwin" ? path_scurry_1.PathScurryDarwin : opts.platform ? path_scurry_1.PathScurryPosix : path_scurry_1.PathScurry; + this.scurry = new Scurry(this.cwd, { + nocase: opts.nocase, + fs: opts.fs + }); + } + this.nocase = this.scurry.nocase; + const nocaseMagicOnly = this.platform === "darwin" || this.platform === "win32"; + const mmo = { + ...opts, + dot: this.dot, + matchBase: this.matchBase, + nobrace: this.nobrace, + nocase: this.nocase, + nocaseMagicOnly, + nocomment: true, + noext: this.noext, + nonegate: true, + optimizationLevel: 2, + platform: this.platform, + windowsPathsNoEscape: this.windowsPathsNoEscape, + debug: !!this.opts.debug + }; + const mms = this.pattern.map((p) => new minimatch_1.Minimatch(p, mmo)); + const [matchSet, globParts] = mms.reduce((set, m) => { + set[0].push(...m.set); + set[1].push(...m.globParts); + return set; + }, [[], []]); + this.patterns = matchSet.map((set, i) => { + const g = globParts[i]; + if (!g) + throw new Error("invalid pattern object"); + return new pattern_js_1.Pattern(set, g, 0, this.platform); + }); + } + async walk() { + return [ + ...await new walker_js_1.GlobWalker(this.patterns, this.scurry.cwd, { + ...this.opts, + maxDepth: this.maxDepth !== Infinity ? this.maxDepth + this.scurry.cwd.depth() : Infinity, + platform: this.platform, + nocase: this.nocase, + includeChildMatches: this.includeChildMatches + }).walk() + ]; + } + walkSync() { + return [ + ...new walker_js_1.GlobWalker(this.patterns, this.scurry.cwd, { + ...this.opts, + maxDepth: this.maxDepth !== Infinity ? this.maxDepth + this.scurry.cwd.depth() : Infinity, + platform: this.platform, + nocase: this.nocase, + includeChildMatches: this.includeChildMatches + }).walkSync() + ]; + } + stream() { + return new walker_js_1.GlobStream(this.patterns, this.scurry.cwd, { + ...this.opts, + maxDepth: this.maxDepth !== Infinity ? this.maxDepth + this.scurry.cwd.depth() : Infinity, + platform: this.platform, + nocase: this.nocase, + includeChildMatches: this.includeChildMatches + }).stream(); + } + streamSync() { + return new walker_js_1.GlobStream(this.patterns, this.scurry.cwd, { + ...this.opts, + maxDepth: this.maxDepth !== Infinity ? this.maxDepth + this.scurry.cwd.depth() : Infinity, + platform: this.platform, + nocase: this.nocase, + includeChildMatches: this.includeChildMatches + }).streamSync(); + } + iterateSync() { + return this.streamSync()[Symbol.iterator](); + } + [Symbol.iterator]() { + return this.iterateSync(); + } + iterate() { + return this.stream()[Symbol.asyncIterator](); + } + [Symbol.asyncIterator]() { + return this.iterate(); + } + } + exports2.Glob = Glob; +}); + +// node_modules/glob/dist/commonjs/has-magic.js +var require_has_magic = __commonJS((exports2) => { + Object.defineProperty(exports2, "__esModule", { value: true }); + exports2.hasMagic = undefined; + var minimatch_1 = require_commonjs13(); + var hasMagic = (pattern, options = {}) => { + if (!Array.isArray(pattern)) { + pattern = [pattern]; + } + for (const p of pattern) { + if (new minimatch_1.Minimatch(p, options).hasMagic()) + return true; + } + return false; + }; + exports2.hasMagic = hasMagic; +}); + +// node_modules/glob/dist/commonjs/index.js +var require_commonjs17 = __commonJS((exports2) => { + Object.defineProperty(exports2, "__esModule", { value: true }); + exports2.glob = exports2.sync = exports2.iterate = exports2.iterateSync = exports2.stream = exports2.streamSync = exports2.Ignore = exports2.hasMagic = exports2.Glob = exports2.unescape = exports2.escape = undefined; + exports2.globStreamSync = globStreamSync; + exports2.globStream = globStream; + exports2.globSync = globSync; + exports2.globIterateSync = globIterateSync; + exports2.globIterate = globIterate; + var minimatch_1 = require_commonjs13(); + var glob_js_1 = require_glob(); + var has_magic_js_1 = require_has_magic(); + var minimatch_2 = require_commonjs13(); + Object.defineProperty(exports2, "escape", { enumerable: true, get: function() { + return minimatch_2.escape; + } }); + Object.defineProperty(exports2, "unescape", { enumerable: true, get: function() { + return minimatch_2.unescape; + } }); + var glob_js_2 = require_glob(); + Object.defineProperty(exports2, "Glob", { enumerable: true, get: function() { + return glob_js_2.Glob; + } }); + var has_magic_js_2 = require_has_magic(); + Object.defineProperty(exports2, "hasMagic", { enumerable: true, get: function() { + return has_magic_js_2.hasMagic; + } }); + var ignore_js_1 = require_ignore(); + Object.defineProperty(exports2, "Ignore", { enumerable: true, get: function() { + return ignore_js_1.Ignore; + } }); + function globStreamSync(pattern, options = {}) { + return new glob_js_1.Glob(pattern, options).streamSync(); + } + function globStream(pattern, options = {}) { + return new glob_js_1.Glob(pattern, options).stream(); + } + function globSync(pattern, options = {}) { + return new glob_js_1.Glob(pattern, options).walkSync(); + } + async function glob_(pattern, options = {}) { + return new glob_js_1.Glob(pattern, options).walk(); + } + function globIterateSync(pattern, options = {}) { + return new glob_js_1.Glob(pattern, options).iterateSync(); + } + function globIterate(pattern, options = {}) { + return new glob_js_1.Glob(pattern, options).iterate(); + } + exports2.streamSync = globStreamSync; + exports2.stream = Object.assign(globStream, { sync: globStreamSync }); + exports2.iterateSync = globIterateSync; + exports2.iterate = Object.assign(globIterate, { + sync: globIterateSync + }); + exports2.sync = Object.assign(globSync, { + stream: globStreamSync, + iterate: globIterateSync + }); + exports2.glob = Object.assign(glob_, { + glob: glob_, + globSync, + sync: exports2.sync, + globStream, + stream: exports2.stream, + globStreamSync, + streamSync: exports2.streamSync, + globIterate, + iterate: exports2.iterate, + globIterateSync, + iterateSync: exports2.iterateSync, + Glob: glob_js_1.Glob, + hasMagic: has_magic_js_1.hasMagic, + escape: minimatch_1.escape, + unescape: minimatch_1.unescape + }); + exports2.glob.glob = exports2.glob; +}); + +// node_modules/archiver-utils/file.js +var require_file3 = __commonJS((exports2, module2) => { + var fs = require_graceful_fs(); + var path = require("path"); + var flatten = require_flatten(); + var difference = require_difference(); + var union = require_union(); + var isPlainObject = require_isPlainObject(); + var glob = require_commonjs17(); + var file = module2.exports = {}; + var pathSeparatorRe = /[\/\\]/g; + var processPatterns = function(patterns, fn) { + var result = []; + flatten(patterns).forEach(function(pattern) { + var exclusion = pattern.indexOf("!") === 0; + if (exclusion) { + pattern = pattern.slice(1); + } + var matches = fn(pattern); + if (exclusion) { + result = difference(result, matches); + } else { + result = union(result, matches); + } + }); + return result; + }; + file.exists = function() { + var filepath = path.join.apply(path, arguments); + return fs.existsSync(filepath); + }; + file.expand = function(...args) { + var options = isPlainObject(args[0]) ? args.shift() : {}; + var patterns = Array.isArray(args[0]) ? args[0] : args; + if (patterns.length === 0) { + return []; + } + var matches = processPatterns(patterns, function(pattern) { + return glob.sync(pattern, options); + }); + if (options.filter) { + matches = matches.filter(function(filepath) { + filepath = path.join(options.cwd || "", filepath); + try { + if (typeof options.filter === "function") { + return options.filter(filepath); + } else { + return fs.statSync(filepath)[options.filter](); + } + } catch (e) { + return false; + } + }); + } + return matches; + }; + file.expandMapping = function(patterns, destBase, options) { + options = Object.assign({ + rename: function(destBase2, destPath) { + return path.join(destBase2 || "", destPath); + } + }, options); + var files = []; + var fileByDest = {}; + file.expand(options, patterns).forEach(function(src) { + var destPath = src; + if (options.flatten) { + destPath = path.basename(destPath); + } + if (options.ext) { + destPath = destPath.replace(/(\.[^\/]*)?$/, options.ext); + } + var dest = options.rename(destBase, destPath, options); + if (options.cwd) { + src = path.join(options.cwd, src); + } + dest = dest.replace(pathSeparatorRe, "/"); + src = src.replace(pathSeparatorRe, "/"); + if (fileByDest[dest]) { + fileByDest[dest].src.push(src); + } else { + files.push({ + src: [src], + dest + }); + fileByDest[dest] = files[files.length - 1]; + } + }); + return files; + }; + file.normalizeFilesArray = function(data) { + var files = []; + data.forEach(function(obj) { + var prop; + if ("src" in obj || "dest" in obj) { + files.push(obj); + } + }); + if (files.length === 0) { + return []; + } + files = _(files).chain().forEach(function(obj) { + if (!("src" in obj) || !obj.src) { + return; + } + if (Array.isArray(obj.src)) { + obj.src = flatten(obj.src); + } else { + obj.src = [obj.src]; + } + }).map(function(obj) { + var expandOptions = Object.assign({}, obj); + delete expandOptions.src; + delete expandOptions.dest; + if (obj.expand) { + return file.expandMapping(obj.src, obj.dest, expandOptions).map(function(mapObj) { + var result2 = Object.assign({}, obj); + result2.orig = Object.assign({}, obj); + result2.src = mapObj.src; + result2.dest = mapObj.dest; + ["expand", "cwd", "flatten", "rename", "ext"].forEach(function(prop) { + delete result2[prop]; + }); + return result2; + }); + } + var result = Object.assign({}, obj); + result.orig = Object.assign({}, obj); + if ("src" in result) { + Object.defineProperty(result, "src", { + enumerable: true, + get: function fn() { + var src; + if (!("result" in fn)) { + src = obj.src; + src = Array.isArray(src) ? flatten(src) : [src]; + fn.result = file.expand(expandOptions, src); + } + return fn.result; + } + }); + } + if ("dest" in result) { + result.dest = obj.dest; + } + return result; + }).flatten().value(); + return files; + }; +}); + +// node_modules/archiver-utils/index.js +var require_archiver_utils = __commonJS((exports2, module2) => { + var fs = require_graceful_fs(); + var path = require("path"); + var isStream = require_is_stream(); + var lazystream = require_lazystream(); + var normalizePath = require_normalize_path(); + var defaults = require_defaults(); + var Stream = require("stream").Stream; + var PassThrough = require_ours().PassThrough; + var utils = module2.exports = {}; + utils.file = require_file3(); + utils.collectStream = function(source, callback) { + var collection = []; + var size = 0; + source.on("error", callback); + source.on("data", function(chunk) { + collection.push(chunk); + size += chunk.length; + }); + source.on("end", function() { + var buf = Buffer.alloc(size); + var offset = 0; + collection.forEach(function(data) { + data.copy(buf, offset); + offset += data.length; + }); + callback(null, buf); + }); + }; + utils.dateify = function(dateish) { + dateish = dateish || new Date; + if (dateish instanceof Date) { + dateish = dateish; + } else if (typeof dateish === "string") { + dateish = new Date(dateish); + } else { + dateish = new Date; + } + return dateish; + }; + utils.defaults = function(object, source, guard) { + var args = arguments; + args[0] = args[0] || {}; + return defaults(...args); + }; + utils.isStream = function(source) { + return isStream(source); + }; + utils.lazyReadStream = function(filepath) { + return new lazystream.Readable(function() { + return fs.createReadStream(filepath); + }); + }; + utils.normalizeInputSource = function(source) { + if (source === null) { + return Buffer.alloc(0); + } else if (typeof source === "string") { + return Buffer.from(source); + } else if (utils.isStream(source)) { + return source.pipe(new PassThrough); + } + return source; + }; + utils.sanitizePath = function(filepath) { + return normalizePath(filepath, false).replace(/^\w+:/, "").replace(/^(\.\.\/|\/)+/, ""); + }; + utils.trailingSlashIt = function(str) { + return str.slice(-1) !== "/" ? str + "/" : str; + }; + utils.unixifyPath = function(filepath) { + return normalizePath(filepath, false).replace(/^\w+:/, ""); + }; + utils.walkdir = function(dirpath, base, callback) { + var results = []; + if (typeof base === "function") { + callback = base; + base = dirpath; + } + fs.readdir(dirpath, function(err, list) { + var i = 0; + var file; + var filepath; + if (err) { + return callback(err); + } + (function next() { + file = list[i++]; + if (!file) { + return callback(null, results); + } + filepath = path.join(dirpath, file); + fs.stat(filepath, function(err2, stats) { + results.push({ + path: filepath, + relative: path.relative(base, filepath).replace(/\\/g, "/"), + stats + }); + if (stats && stats.isDirectory()) { + utils.walkdir(filepath, base, function(err3, res) { + if (err3) { + return callback(err3); + } + res.forEach(function(dirEntry) { + results.push(dirEntry); + }); + next(); + }); + } else { + next(); + } + }); + })(); + }); + }; +}); + +// node_modules/archiver/lib/error.js +var require_error2 = __commonJS((exports2, module2) => { + var util = require("util"); + var ERROR_CODES = { + ABORTED: "archive was aborted", + DIRECTORYDIRPATHREQUIRED: "diretory dirpath argument must be a non-empty string value", + DIRECTORYFUNCTIONINVALIDDATA: "invalid data returned by directory custom data function", + ENTRYNAMEREQUIRED: "entry name must be a non-empty string value", + FILEFILEPATHREQUIRED: "file filepath argument must be a non-empty string value", + FINALIZING: "archive already finalizing", + QUEUECLOSED: "queue closed", + NOENDMETHOD: "no suitable finalize/end method defined by module", + DIRECTORYNOTSUPPORTED: "support for directory entries not defined by module", + FORMATSET: "archive format already set", + INPUTSTEAMBUFFERREQUIRED: "input source must be valid Stream or Buffer instance", + MODULESET: "module already set", + SYMLINKNOTSUPPORTED: "support for symlink entries not defined by module", + SYMLINKFILEPATHREQUIRED: "symlink filepath argument must be a non-empty string value", + SYMLINKTARGETREQUIRED: "symlink target argument must be a non-empty string value", + ENTRYNOTSUPPORTED: "entry not supported" + }; + function ArchiverError(code, data) { + Error.captureStackTrace(this, this.constructor); + this.message = ERROR_CODES[code] || code; + this.code = code; + this.data = data; + } + util.inherits(ArchiverError, Error); + exports2 = module2.exports = ArchiverError; +}); + +// node_modules/archiver/lib/core.js +var require_core2 = __commonJS((exports2, module2) => { + var fs = require("fs"); + var glob = require_readdir_glob(); + var async = require_async(); + var path = require("path"); + var util = require_archiver_utils(); + var inherits = require("util").inherits; + var ArchiverError = require_error2(); + var Transform = require_ours().Transform; + var win32 = process.platform === "win32"; + var Archiver = function(format, options) { + if (!(this instanceof Archiver)) { + return new Archiver(format, options); + } + if (typeof format !== "string") { + options = format; + format = "zip"; + } + options = this.options = util.defaults(options, { + highWaterMark: 1024 * 1024, + statConcurrency: 4 + }); + Transform.call(this, options); + this._format = false; + this._module = false; + this._pending = 0; + this._pointer = 0; + this._entriesCount = 0; + this._entriesProcessedCount = 0; + this._fsEntriesTotalBytes = 0; + this._fsEntriesProcessedBytes = 0; + this._queue = async.queue(this._onQueueTask.bind(this), 1); + this._queue.drain(this._onQueueDrain.bind(this)); + this._statQueue = async.queue(this._onStatQueueTask.bind(this), options.statConcurrency); + this._statQueue.drain(this._onQueueDrain.bind(this)); + this._state = { + aborted: false, + finalize: false, + finalizing: false, + finalized: false, + modulePiped: false + }; + this._streams = []; + }; + inherits(Archiver, Transform); + Archiver.prototype._abort = function() { + this._state.aborted = true; + this._queue.kill(); + this._statQueue.kill(); + if (this._queue.idle()) { + this._shutdown(); + } + }; + Archiver.prototype._append = function(filepath, data) { + data = data || {}; + var task = { + source: null, + filepath + }; + if (!data.name) { + data.name = filepath; + } + data.sourcePath = filepath; + task.data = data; + this._entriesCount++; + if (data.stats && data.stats instanceof fs.Stats) { + task = this._updateQueueTaskWithStats(task, data.stats); + if (task) { + if (data.stats.size) { + this._fsEntriesTotalBytes += data.stats.size; + } + this._queue.push(task); + } + } else { + this._statQueue.push(task); + } + }; + Archiver.prototype._finalize = function() { + if (this._state.finalizing || this._state.finalized || this._state.aborted) { + return; + } + this._state.finalizing = true; + this._moduleFinalize(); + this._state.finalizing = false; + this._state.finalized = true; + }; + Archiver.prototype._maybeFinalize = function() { + if (this._state.finalizing || this._state.finalized || this._state.aborted) { + return false; + } + if (this._state.finalize && this._pending === 0 && this._queue.idle() && this._statQueue.idle()) { + this._finalize(); + return true; + } + return false; + }; + Archiver.prototype._moduleAppend = function(source, data, callback) { + if (this._state.aborted) { + callback(); + return; + } + this._module.append(source, data, function(err) { + this._task = null; + if (this._state.aborted) { + this._shutdown(); + return; + } + if (err) { + this.emit("error", err); + setImmediate(callback); + return; + } + this.emit("entry", data); + this._entriesProcessedCount++; + if (data.stats && data.stats.size) { + this._fsEntriesProcessedBytes += data.stats.size; + } + this.emit("progress", { + entries: { + total: this._entriesCount, + processed: this._entriesProcessedCount + }, + fs: { + totalBytes: this._fsEntriesTotalBytes, + processedBytes: this._fsEntriesProcessedBytes + } + }); + setImmediate(callback); + }.bind(this)); + }; + Archiver.prototype._moduleFinalize = function() { + if (typeof this._module.finalize === "function") { + this._module.finalize(); + } else if (typeof this._module.end === "function") { + this._module.end(); + } else { + this.emit("error", new ArchiverError("NOENDMETHOD")); + } + }; + Archiver.prototype._modulePipe = function() { + this._module.on("error", this._onModuleError.bind(this)); + this._module.pipe(this); + this._state.modulePiped = true; + }; + Archiver.prototype._moduleSupports = function(key) { + if (!this._module.supports || !this._module.supports[key]) { + return false; + } + return this._module.supports[key]; + }; + Archiver.prototype._moduleUnpipe = function() { + this._module.unpipe(this); + this._state.modulePiped = false; + }; + Archiver.prototype._normalizeEntryData = function(data, stats) { + data = util.defaults(data, { + type: "file", + name: null, + date: null, + mode: null, + prefix: null, + sourcePath: null, + stats: false + }); + if (stats && data.stats === false) { + data.stats = stats; + } + var isDir = data.type === "directory"; + if (data.name) { + if (typeof data.prefix === "string" && data.prefix !== "") { + data.name = data.prefix + "/" + data.name; + data.prefix = null; + } + data.name = util.sanitizePath(data.name); + if (data.type !== "symlink" && data.name.slice(-1) === "/") { + isDir = true; + data.type = "directory"; + } else if (isDir) { + data.name += "/"; + } + } + if (typeof data.mode === "number") { + if (win32) { + data.mode &= 511; + } else { + data.mode &= 4095; + } + } else if (data.stats && data.mode === null) { + if (win32) { + data.mode = data.stats.mode & 511; + } else { + data.mode = data.stats.mode & 4095; + } + if (win32 && isDir) { + data.mode = 493; + } + } else if (data.mode === null) { + data.mode = isDir ? 493 : 420; + } + if (data.stats && data.date === null) { + data.date = data.stats.mtime; + } else { + data.date = util.dateify(data.date); + } + return data; + }; + Archiver.prototype._onModuleError = function(err) { + this.emit("error", err); + }; + Archiver.prototype._onQueueDrain = function() { + if (this._state.finalizing || this._state.finalized || this._state.aborted) { + return; + } + if (this._state.finalize && this._pending === 0 && this._queue.idle() && this._statQueue.idle()) { + this._finalize(); + } + }; + Archiver.prototype._onQueueTask = function(task, callback) { + var fullCallback = () => { + if (task.data.callback) { + task.data.callback(); + } + callback(); + }; + if (this._state.finalizing || this._state.finalized || this._state.aborted) { + fullCallback(); + return; + } + this._task = task; + this._moduleAppend(task.source, task.data, fullCallback); + }; + Archiver.prototype._onStatQueueTask = function(task, callback) { + if (this._state.finalizing || this._state.finalized || this._state.aborted) { + callback(); + return; + } + fs.lstat(task.filepath, function(err, stats) { + if (this._state.aborted) { + setImmediate(callback); + return; + } + if (err) { + this._entriesCount--; + this.emit("warning", err); + setImmediate(callback); + return; + } + task = this._updateQueueTaskWithStats(task, stats); + if (task) { + if (stats.size) { + this._fsEntriesTotalBytes += stats.size; + } + this._queue.push(task); + } + setImmediate(callback); + }.bind(this)); + }; + Archiver.prototype._shutdown = function() { + this._moduleUnpipe(); + this.end(); + }; + Archiver.prototype._transform = function(chunk, encoding, callback) { + if (chunk) { + this._pointer += chunk.length; + } + callback(null, chunk); + }; + Archiver.prototype._updateQueueTaskWithStats = function(task, stats) { + if (stats.isFile()) { + task.data.type = "file"; + task.data.sourceType = "stream"; + task.source = util.lazyReadStream(task.filepath); + } else if (stats.isDirectory() && this._moduleSupports("directory")) { + task.data.name = util.trailingSlashIt(task.data.name); + task.data.type = "directory"; + task.data.sourcePath = util.trailingSlashIt(task.filepath); + task.data.sourceType = "buffer"; + task.source = Buffer.concat([]); + } else if (stats.isSymbolicLink() && this._moduleSupports("symlink")) { + var linkPath = fs.readlinkSync(task.filepath); + var dirName = path.dirname(task.filepath); + task.data.type = "symlink"; + task.data.linkname = path.relative(dirName, path.resolve(dirName, linkPath)); + task.data.sourceType = "buffer"; + task.source = Buffer.concat([]); + } else { + if (stats.isDirectory()) { + this.emit("warning", new ArchiverError("DIRECTORYNOTSUPPORTED", task.data)); + } else if (stats.isSymbolicLink()) { + this.emit("warning", new ArchiverError("SYMLINKNOTSUPPORTED", task.data)); + } else { + this.emit("warning", new ArchiverError("ENTRYNOTSUPPORTED", task.data)); + } + return null; + } + task.data = this._normalizeEntryData(task.data, stats); + return task; + }; + Archiver.prototype.abort = function() { + if (this._state.aborted || this._state.finalized) { + return this; + } + this._abort(); + return this; + }; + Archiver.prototype.append = function(source, data) { + if (this._state.finalize || this._state.aborted) { + this.emit("error", new ArchiverError("QUEUECLOSED")); + return this; + } + data = this._normalizeEntryData(data); + if (typeof data.name !== "string" || data.name.length === 0) { + this.emit("error", new ArchiverError("ENTRYNAMEREQUIRED")); + return this; + } + if (data.type === "directory" && !this._moduleSupports("directory")) { + this.emit("error", new ArchiverError("DIRECTORYNOTSUPPORTED", { name: data.name })); + return this; + } + source = util.normalizeInputSource(source); + if (Buffer.isBuffer(source)) { + data.sourceType = "buffer"; + } else if (util.isStream(source)) { + data.sourceType = "stream"; + } else { + this.emit("error", new ArchiverError("INPUTSTEAMBUFFERREQUIRED", { name: data.name })); + return this; + } + this._entriesCount++; + this._queue.push({ + data, + source + }); + return this; + }; + Archiver.prototype.directory = function(dirpath, destpath, data) { + if (this._state.finalize || this._state.aborted) { + this.emit("error", new ArchiverError("QUEUECLOSED")); + return this; + } + if (typeof dirpath !== "string" || dirpath.length === 0) { + this.emit("error", new ArchiverError("DIRECTORYDIRPATHREQUIRED")); + return this; + } + this._pending++; + if (destpath === false) { + destpath = ""; + } else if (typeof destpath !== "string") { + destpath = dirpath; + } + var dataFunction = false; + if (typeof data === "function") { + dataFunction = data; + data = {}; + } else if (typeof data !== "object") { + data = {}; + } + var globOptions = { + stat: true, + dot: true + }; + function onGlobEnd() { + this._pending--; + this._maybeFinalize(); + } + function onGlobError(err) { + this.emit("error", err); + } + function onGlobMatch(match) { + globber.pause(); + var ignoreMatch = false; + var entryData = Object.assign({}, data); + entryData.name = match.relative; + entryData.prefix = destpath; + entryData.stats = match.stat; + entryData.callback = globber.resume.bind(globber); + try { + if (dataFunction) { + entryData = dataFunction(entryData); + if (entryData === false) { + ignoreMatch = true; + } else if (typeof entryData !== "object") { + throw new ArchiverError("DIRECTORYFUNCTIONINVALIDDATA", { dirpath }); + } + } + } catch (e) { + this.emit("error", e); + return; + } + if (ignoreMatch) { + globber.resume(); + return; + } + this._append(match.absolute, entryData); + } + var globber = glob(dirpath, globOptions); + globber.on("error", onGlobError.bind(this)); + globber.on("match", onGlobMatch.bind(this)); + globber.on("end", onGlobEnd.bind(this)); + return this; + }; + Archiver.prototype.file = function(filepath, data) { + if (this._state.finalize || this._state.aborted) { + this.emit("error", new ArchiverError("QUEUECLOSED")); + return this; + } + if (typeof filepath !== "string" || filepath.length === 0) { + this.emit("error", new ArchiverError("FILEFILEPATHREQUIRED")); + return this; + } + this._append(filepath, data); + return this; + }; + Archiver.prototype.glob = function(pattern, options, data) { + this._pending++; + options = util.defaults(options, { + stat: true, + pattern + }); + function onGlobEnd() { + this._pending--; + this._maybeFinalize(); + } + function onGlobError(err) { + this.emit("error", err); + } + function onGlobMatch(match) { + globber.pause(); + var entryData = Object.assign({}, data); + entryData.callback = globber.resume.bind(globber); + entryData.stats = match.stat; + entryData.name = match.relative; + this._append(match.absolute, entryData); + } + var globber = glob(options.cwd || ".", options); + globber.on("error", onGlobError.bind(this)); + globber.on("match", onGlobMatch.bind(this)); + globber.on("end", onGlobEnd.bind(this)); + return this; + }; + Archiver.prototype.finalize = function() { + if (this._state.aborted) { + var abortedError = new ArchiverError("ABORTED"); + this.emit("error", abortedError); + return Promise.reject(abortedError); + } + if (this._state.finalize) { + var finalizingError = new ArchiverError("FINALIZING"); + this.emit("error", finalizingError); + return Promise.reject(finalizingError); + } + this._state.finalize = true; + if (this._pending === 0 && this._queue.idle() && this._statQueue.idle()) { + this._finalize(); + } + var self2 = this; + return new Promise(function(resolve, reject) { + var errored; + self2._module.on("end", function() { + if (!errored) { + resolve(); + } + }); + self2._module.on("error", function(err) { + errored = true; + reject(err); + }); + }); + }; + Archiver.prototype.setFormat = function(format) { + if (this._format) { + this.emit("error", new ArchiverError("FORMATSET")); + return this; + } + this._format = format; + return this; + }; + Archiver.prototype.setModule = function(module3) { + if (this._state.aborted) { + this.emit("error", new ArchiverError("ABORTED")); + return this; + } + if (this._state.module) { + this.emit("error", new ArchiverError("MODULESET")); + return this; + } + this._module = module3; + this._modulePipe(); + return this; + }; + Archiver.prototype.symlink = function(filepath, target, mode) { + if (this._state.finalize || this._state.aborted) { + this.emit("error", new ArchiverError("QUEUECLOSED")); + return this; + } + if (typeof filepath !== "string" || filepath.length === 0) { + this.emit("error", new ArchiverError("SYMLINKFILEPATHREQUIRED")); + return this; + } + if (typeof target !== "string" || target.length === 0) { + this.emit("error", new ArchiverError("SYMLINKTARGETREQUIRED", { filepath })); + return this; + } + if (!this._moduleSupports("symlink")) { + this.emit("error", new ArchiverError("SYMLINKNOTSUPPORTED", { filepath })); + return this; + } + var data = {}; + data.type = "symlink"; + data.name = filepath.replace(/\\/g, "/"); + data.linkname = target.replace(/\\/g, "/"); + data.sourceType = "buffer"; + if (typeof mode === "number") { + data.mode = mode; + } + this._entriesCount++; + this._queue.push({ + data, + source: Buffer.concat([]) + }); + return this; + }; + Archiver.prototype.pointer = function() { + return this._pointer; + }; + Archiver.prototype.use = function(plugin) { + this._streams.push(plugin); + return this; + }; + module2.exports = Archiver; +}); + +// node_modules/compress-commons/lib/archivers/archive-entry.js +var require_archive_entry = __commonJS((exports2, module2) => { + var ArchiveEntry = module2.exports = function() { + }; + ArchiveEntry.prototype.getName = function() { + }; + ArchiveEntry.prototype.getSize = function() { + }; + ArchiveEntry.prototype.getLastModifiedDate = function() { + }; + ArchiveEntry.prototype.isDirectory = function() { + }; +}); + +// node_modules/compress-commons/lib/archivers/zip/util.js +var require_util13 = __commonJS((exports2, module2) => { + var util = module2.exports = {}; + util.dateToDos = function(d, forceLocalTime) { + forceLocalTime = forceLocalTime || false; + var year = forceLocalTime ? d.getFullYear() : d.getUTCFullYear(); + if (year < 1980) { + return 2162688; + } else if (year >= 2044) { + return 2141175677; + } + var val2 = { + year, + month: forceLocalTime ? d.getMonth() : d.getUTCMonth(), + date: forceLocalTime ? d.getDate() : d.getUTCDate(), + hours: forceLocalTime ? d.getHours() : d.getUTCHours(), + minutes: forceLocalTime ? d.getMinutes() : d.getUTCMinutes(), + seconds: forceLocalTime ? d.getSeconds() : d.getUTCSeconds() + }; + return val2.year - 1980 << 25 | val2.month + 1 << 21 | val2.date << 16 | val2.hours << 11 | val2.minutes << 5 | val2.seconds / 2; + }; + util.dosToDate = function(dos) { + return new Date((dos >> 25 & 127) + 1980, (dos >> 21 & 15) - 1, dos >> 16 & 31, dos >> 11 & 31, dos >> 5 & 63, (dos & 31) << 1); + }; + util.fromDosTime = function(buf) { + return util.dosToDate(buf.readUInt32LE(0)); + }; + util.getEightBytes = function(v) { + var buf = Buffer.alloc(8); + buf.writeUInt32LE(v % 4294967296, 0); + buf.writeUInt32LE(v / 4294967296 | 0, 4); + return buf; + }; + util.getShortBytes = function(v) { + var buf = Buffer.alloc(2); + buf.writeUInt16LE((v & 65535) >>> 0, 0); + return buf; + }; + util.getShortBytesValue = function(buf, offset) { + return buf.readUInt16LE(offset); + }; + util.getLongBytes = function(v) { + var buf = Buffer.alloc(4); + buf.writeUInt32LE((v & 4294967295) >>> 0, 0); + return buf; + }; + util.getLongBytesValue = function(buf, offset) { + return buf.readUInt32LE(offset); + }; + util.toDosTime = function(d) { + return util.getLongBytes(util.dateToDos(d)); + }; +}); + +// node_modules/compress-commons/lib/archivers/zip/general-purpose-bit.js +var require_general_purpose_bit = __commonJS((exports2, module2) => { + var zipUtil = require_util13(); + var DATA_DESCRIPTOR_FLAG = 1 << 3; + var ENCRYPTION_FLAG = 1 << 0; + var NUMBER_OF_SHANNON_FANO_TREES_FLAG = 1 << 2; + var SLIDING_DICTIONARY_SIZE_FLAG = 1 << 1; + var STRONG_ENCRYPTION_FLAG = 1 << 6; + var UFT8_NAMES_FLAG = 1 << 11; + var GeneralPurposeBit = module2.exports = function() { + if (!(this instanceof GeneralPurposeBit)) { + return new GeneralPurposeBit; + } + this.descriptor = false; + this.encryption = false; + this.utf8 = false; + this.numberOfShannonFanoTrees = 0; + this.strongEncryption = false; + this.slidingDictionarySize = 0; + return this; + }; + GeneralPurposeBit.prototype.encode = function() { + return zipUtil.getShortBytes((this.descriptor ? DATA_DESCRIPTOR_FLAG : 0) | (this.utf8 ? UFT8_NAMES_FLAG : 0) | (this.encryption ? ENCRYPTION_FLAG : 0) | (this.strongEncryption ? STRONG_ENCRYPTION_FLAG : 0)); + }; + GeneralPurposeBit.prototype.parse = function(buf, offset) { + var flag = zipUtil.getShortBytesValue(buf, offset); + var gbp = new GeneralPurposeBit; + gbp.useDataDescriptor((flag & DATA_DESCRIPTOR_FLAG) !== 0); + gbp.useUTF8ForNames((flag & UFT8_NAMES_FLAG) !== 0); + gbp.useStrongEncryption((flag & STRONG_ENCRYPTION_FLAG) !== 0); + gbp.useEncryption((flag & ENCRYPTION_FLAG) !== 0); + gbp.setSlidingDictionarySize((flag & SLIDING_DICTIONARY_SIZE_FLAG) !== 0 ? 8192 : 4096); + gbp.setNumberOfShannonFanoTrees((flag & NUMBER_OF_SHANNON_FANO_TREES_FLAG) !== 0 ? 3 : 2); + return gbp; + }; + GeneralPurposeBit.prototype.setNumberOfShannonFanoTrees = function(n) { + this.numberOfShannonFanoTrees = n; + }; + GeneralPurposeBit.prototype.getNumberOfShannonFanoTrees = function() { + return this.numberOfShannonFanoTrees; + }; + GeneralPurposeBit.prototype.setSlidingDictionarySize = function(n) { + this.slidingDictionarySize = n; + }; + GeneralPurposeBit.prototype.getSlidingDictionarySize = function() { + return this.slidingDictionarySize; + }; + GeneralPurposeBit.prototype.useDataDescriptor = function(b) { + this.descriptor = b; + }; + GeneralPurposeBit.prototype.usesDataDescriptor = function() { + return this.descriptor; + }; + GeneralPurposeBit.prototype.useEncryption = function(b) { + this.encryption = b; + }; + GeneralPurposeBit.prototype.usesEncryption = function() { + return this.encryption; + }; + GeneralPurposeBit.prototype.useStrongEncryption = function(b) { + this.strongEncryption = b; + }; + GeneralPurposeBit.prototype.usesStrongEncryption = function() { + return this.strongEncryption; + }; + GeneralPurposeBit.prototype.useUTF8ForNames = function(b) { + this.utf8 = b; + }; + GeneralPurposeBit.prototype.usesUTF8ForNames = function() { + return this.utf8; + }; +}); + +// node_modules/compress-commons/lib/archivers/zip/unix-stat.js +var require_unix_stat = __commonJS((exports2, module2) => { + module2.exports = { + PERM_MASK: 4095, + FILE_TYPE_FLAG: 61440, + LINK_FLAG: 40960, + FILE_FLAG: 32768, + DIR_FLAG: 16384, + DEFAULT_LINK_PERM: 511, + DEFAULT_DIR_PERM: 493, + DEFAULT_FILE_PERM: 420 + }; +}); + +// node_modules/compress-commons/lib/archivers/zip/constants.js +var require_constants8 = __commonJS((exports2, module2) => { + module2.exports = { + WORD: 4, + DWORD: 8, + EMPTY: Buffer.alloc(0), + SHORT: 2, + SHORT_MASK: 65535, + SHORT_SHIFT: 16, + SHORT_ZERO: Buffer.from(Array(2)), + LONG: 4, + LONG_ZERO: Buffer.from(Array(4)), + MIN_VERSION_INITIAL: 10, + MIN_VERSION_DATA_DESCRIPTOR: 20, + MIN_VERSION_ZIP64: 45, + VERSION_MADEBY: 45, + METHOD_STORED: 0, + METHOD_DEFLATED: 8, + PLATFORM_UNIX: 3, + PLATFORM_FAT: 0, + SIG_LFH: 67324752, + SIG_DD: 134695760, + SIG_CFH: 33639248, + SIG_EOCD: 101010256, + SIG_ZIP64_EOCD: 101075792, + SIG_ZIP64_EOCD_LOC: 117853008, + ZIP64_MAGIC_SHORT: 65535, + ZIP64_MAGIC: 4294967295, + ZIP64_EXTRA_ID: 1, + ZLIB_NO_COMPRESSION: 0, + ZLIB_BEST_SPEED: 1, + ZLIB_BEST_COMPRESSION: 9, + ZLIB_DEFAULT_COMPRESSION: -1, + MODE_MASK: 4095, + DEFAULT_FILE_MODE: 33188, + DEFAULT_DIR_MODE: 16877, + EXT_FILE_ATTR_DIR: 1106051088, + EXT_FILE_ATTR_FILE: 2175008800, + S_IFMT: 61440, + S_IFIFO: 4096, + S_IFCHR: 8192, + S_IFDIR: 16384, + S_IFBLK: 24576, + S_IFREG: 32768, + S_IFLNK: 40960, + S_IFSOCK: 49152, + S_DOS_A: 32, + S_DOS_D: 16, + S_DOS_V: 8, + S_DOS_S: 4, + S_DOS_H: 2, + S_DOS_R: 1 + }; +}); + +// node_modules/compress-commons/lib/archivers/zip/zip-archive-entry.js +var require_zip_archive_entry = __commonJS((exports2, module2) => { + var inherits = require("util").inherits; + var normalizePath = require_normalize_path(); + var ArchiveEntry = require_archive_entry(); + var GeneralPurposeBit = require_general_purpose_bit(); + var UnixStat = require_unix_stat(); + var constants = require_constants8(); + var zipUtil = require_util13(); + var ZipArchiveEntry = module2.exports = function(name) { + if (!(this instanceof ZipArchiveEntry)) { + return new ZipArchiveEntry(name); + } + ArchiveEntry.call(this); + this.platform = constants.PLATFORM_FAT; + this.method = -1; + this.name = null; + this.size = 0; + this.csize = 0; + this.gpb = new GeneralPurposeBit; + this.crc = 0; + this.time = -1; + this.minver = constants.MIN_VERSION_INITIAL; + this.mode = -1; + this.extra = null; + this.exattr = 0; + this.inattr = 0; + this.comment = null; + if (name) { + this.setName(name); + } + }; + inherits(ZipArchiveEntry, ArchiveEntry); + ZipArchiveEntry.prototype.getCentralDirectoryExtra = function() { + return this.getExtra(); + }; + ZipArchiveEntry.prototype.getComment = function() { + return this.comment !== null ? this.comment : ""; + }; + ZipArchiveEntry.prototype.getCompressedSize = function() { + return this.csize; + }; + ZipArchiveEntry.prototype.getCrc = function() { + return this.crc; + }; + ZipArchiveEntry.prototype.getExternalAttributes = function() { + return this.exattr; + }; + ZipArchiveEntry.prototype.getExtra = function() { + return this.extra !== null ? this.extra : constants.EMPTY; + }; + ZipArchiveEntry.prototype.getGeneralPurposeBit = function() { + return this.gpb; + }; + ZipArchiveEntry.prototype.getInternalAttributes = function() { + return this.inattr; + }; + ZipArchiveEntry.prototype.getLastModifiedDate = function() { + return this.getTime(); + }; + ZipArchiveEntry.prototype.getLocalFileDataExtra = function() { + return this.getExtra(); + }; + ZipArchiveEntry.prototype.getMethod = function() { + return this.method; + }; + ZipArchiveEntry.prototype.getName = function() { + return this.name; + }; + ZipArchiveEntry.prototype.getPlatform = function() { + return this.platform; + }; + ZipArchiveEntry.prototype.getSize = function() { + return this.size; + }; + ZipArchiveEntry.prototype.getTime = function() { + return this.time !== -1 ? zipUtil.dosToDate(this.time) : -1; + }; + ZipArchiveEntry.prototype.getTimeDos = function() { + return this.time !== -1 ? this.time : 0; + }; + ZipArchiveEntry.prototype.getUnixMode = function() { + return this.platform !== constants.PLATFORM_UNIX ? 0 : this.getExternalAttributes() >> constants.SHORT_SHIFT & constants.SHORT_MASK; + }; + ZipArchiveEntry.prototype.getVersionNeededToExtract = function() { + return this.minver; + }; + ZipArchiveEntry.prototype.setComment = function(comment) { + if (Buffer.byteLength(comment) !== comment.length) { + this.getGeneralPurposeBit().useUTF8ForNames(true); + } + this.comment = comment; + }; + ZipArchiveEntry.prototype.setCompressedSize = function(size) { + if (size < 0) { + throw new Error("invalid entry compressed size"); + } + this.csize = size; + }; + ZipArchiveEntry.prototype.setCrc = function(crc) { + if (crc < 0) { + throw new Error("invalid entry crc32"); + } + this.crc = crc; + }; + ZipArchiveEntry.prototype.setExternalAttributes = function(attr) { + this.exattr = attr >>> 0; + }; + ZipArchiveEntry.prototype.setExtra = function(extra) { + this.extra = extra; + }; + ZipArchiveEntry.prototype.setGeneralPurposeBit = function(gpb) { + if (!(gpb instanceof GeneralPurposeBit)) { + throw new Error("invalid entry GeneralPurposeBit"); + } + this.gpb = gpb; + }; + ZipArchiveEntry.prototype.setInternalAttributes = function(attr) { + this.inattr = attr; + }; + ZipArchiveEntry.prototype.setMethod = function(method) { + if (method < 0) { + throw new Error("invalid entry compression method"); + } + this.method = method; + }; + ZipArchiveEntry.prototype.setName = function(name, prependSlash = false) { + name = normalizePath(name, false).replace(/^\w+:/, "").replace(/^(\.\.\/|\/)+/, ""); + if (prependSlash) { + name = `/${name}`; + } + if (Buffer.byteLength(name) !== name.length) { + this.getGeneralPurposeBit().useUTF8ForNames(true); + } + this.name = name; + }; + ZipArchiveEntry.prototype.setPlatform = function(platform) { + this.platform = platform; + }; + ZipArchiveEntry.prototype.setSize = function(size) { + if (size < 0) { + throw new Error("invalid entry size"); + } + this.size = size; + }; + ZipArchiveEntry.prototype.setTime = function(time, forceLocalTime) { + if (!(time instanceof Date)) { + throw new Error("invalid entry time"); + } + this.time = zipUtil.dateToDos(time, forceLocalTime); + }; + ZipArchiveEntry.prototype.setUnixMode = function(mode) { + mode |= this.isDirectory() ? constants.S_IFDIR : constants.S_IFREG; + var extattr = 0; + extattr |= mode << constants.SHORT_SHIFT | (this.isDirectory() ? constants.S_DOS_D : constants.S_DOS_A); + this.setExternalAttributes(extattr); + this.mode = mode & constants.MODE_MASK; + this.platform = constants.PLATFORM_UNIX; + }; + ZipArchiveEntry.prototype.setVersionNeededToExtract = function(minver) { + this.minver = minver; + }; + ZipArchiveEntry.prototype.isDirectory = function() { + return this.getName().slice(-1) === "/"; + }; + ZipArchiveEntry.prototype.isUnixSymlink = function() { + return (this.getUnixMode() & UnixStat.FILE_TYPE_FLAG) === UnixStat.LINK_FLAG; + }; + ZipArchiveEntry.prototype.isZip64 = function() { + return this.csize > constants.ZIP64_MAGIC || this.size > constants.ZIP64_MAGIC; + }; +}); + +// node_modules/compress-commons/lib/util/index.js +var require_util14 = __commonJS((exports2, module2) => { + var Stream = require("stream").Stream; + var PassThrough = require_ours().PassThrough; + var isStream = require_is_stream(); + var util = module2.exports = {}; + util.normalizeInputSource = function(source) { + if (source === null) { + return Buffer.alloc(0); + } else if (typeof source === "string") { + return Buffer.from(source); + } else if (isStream(source) && !source._readableState) { + var normalized = new PassThrough; + source.pipe(normalized); + return normalized; + } + return source; + }; +}); + +// node_modules/compress-commons/lib/archivers/archive-output-stream.js +var require_archive_output_stream = __commonJS((exports2, module2) => { + var inherits = require("util").inherits; + var isStream = require_is_stream(); + var Transform = require_ours().Transform; + var ArchiveEntry = require_archive_entry(); + var util = require_util14(); + var ArchiveOutputStream = module2.exports = function(options) { + if (!(this instanceof ArchiveOutputStream)) { + return new ArchiveOutputStream(options); + } + Transform.call(this, options); + this.offset = 0; + this._archive = { + finish: false, + finished: false, + processing: false + }; + }; + inherits(ArchiveOutputStream, Transform); + ArchiveOutputStream.prototype._appendBuffer = function(zae, source, callback) { + }; + ArchiveOutputStream.prototype._appendStream = function(zae, source, callback) { + }; + ArchiveOutputStream.prototype._emitErrorCallback = function(err) { + if (err) { + this.emit("error", err); + } + }; + ArchiveOutputStream.prototype._finish = function(ae) { + }; + ArchiveOutputStream.prototype._normalizeEntry = function(ae) { + }; + ArchiveOutputStream.prototype._transform = function(chunk, encoding, callback) { + callback(null, chunk); + }; + ArchiveOutputStream.prototype.entry = function(ae, source, callback) { + source = source || null; + if (typeof callback !== "function") { + callback = this._emitErrorCallback.bind(this); + } + if (!(ae instanceof ArchiveEntry)) { + callback(new Error("not a valid instance of ArchiveEntry")); + return; + } + if (this._archive.finish || this._archive.finished) { + callback(new Error("unacceptable entry after finish")); + return; + } + if (this._archive.processing) { + callback(new Error("already processing an entry")); + return; + } + this._archive.processing = true; + this._normalizeEntry(ae); + this._entry = ae; + source = util.normalizeInputSource(source); + if (Buffer.isBuffer(source)) { + this._appendBuffer(ae, source, callback); + } else if (isStream(source)) { + this._appendStream(ae, source, callback); + } else { + this._archive.processing = false; + callback(new Error("input source must be valid Stream or Buffer instance")); + return; + } + return this; + }; + ArchiveOutputStream.prototype.finish = function() { + if (this._archive.processing) { + this._archive.finish = true; + return; + } + this._finish(); + }; + ArchiveOutputStream.prototype.getBytesWritten = function() { + return this.offset; + }; + ArchiveOutputStream.prototype.write = function(chunk, cb) { + if (chunk) { + this.offset += chunk.length; + } + return Transform.prototype.write.call(this, chunk, cb); + }; +}); + +// node_modules/crc-32/crc32.js +var require_crc32 = __commonJS((exports2) => { + /*! crc32.js (C) 2014-present SheetJS -- http://sheetjs.com */ + var CRC32; + (function(factory) { + if (typeof DO_NOT_EXPORT_CRC === "undefined") { + if (typeof exports2 === "object") { + factory(exports2); + } else if (typeof define === "function" && define.amd) { + define(function() { + var module3 = {}; + factory(module3); + return module3; + }); + } else { + factory(CRC32 = {}); + } + } else { + factory(CRC32 = {}); + } + })(function(CRC322) { + CRC322.version = "1.2.2"; + function signed_crc_table() { + var c = 0, table = new Array(256); + for (var n = 0;n != 256; ++n) { + c = n; + c = c & 1 ? -306674912 ^ c >>> 1 : c >>> 1; + c = c & 1 ? -306674912 ^ c >>> 1 : c >>> 1; + c = c & 1 ? -306674912 ^ c >>> 1 : c >>> 1; + c = c & 1 ? -306674912 ^ c >>> 1 : c >>> 1; + c = c & 1 ? -306674912 ^ c >>> 1 : c >>> 1; + c = c & 1 ? -306674912 ^ c >>> 1 : c >>> 1; + c = c & 1 ? -306674912 ^ c >>> 1 : c >>> 1; + c = c & 1 ? -306674912 ^ c >>> 1 : c >>> 1; + table[n] = c; + } + return typeof Int32Array !== "undefined" ? new Int32Array(table) : table; + } + var T0 = signed_crc_table(); + function slice_by_16_tables(T) { + var c = 0, v = 0, n = 0, table = typeof Int32Array !== "undefined" ? new Int32Array(4096) : new Array(4096); + for (n = 0;n != 256; ++n) + table[n] = T[n]; + for (n = 0;n != 256; ++n) { + v = T[n]; + for (c = 256 + n;c < 4096; c += 256) + v = table[c] = v >>> 8 ^ T[v & 255]; + } + var out = []; + for (n = 1;n != 16; ++n) + out[n - 1] = typeof Int32Array !== "undefined" ? table.subarray(n * 256, n * 256 + 256) : table.slice(n * 256, n * 256 + 256); + return out; + } + var TT = slice_by_16_tables(T0); + var T1 = TT[0], T2 = TT[1], T3 = TT[2], T4 = TT[3], T5 = TT[4]; + var T6 = TT[5], T7 = TT[6], T8 = TT[7], T9 = TT[8], Ta = TT[9]; + var Tb = TT[10], Tc = TT[11], Td = TT[12], Te = TT[13], Tf = TT[14]; + function crc32_bstr(bstr, seed) { + var C = seed ^ -1; + for (var i = 0, L = bstr.length;i < L; ) + C = C >>> 8 ^ T0[(C ^ bstr.charCodeAt(i++)) & 255]; + return ~C; + } + function crc32_buf(B, seed) { + var C = seed ^ -1, L = B.length - 15, i = 0; + for (;i < L; ) + C = Tf[B[i++] ^ C & 255] ^ Te[B[i++] ^ C >> 8 & 255] ^ Td[B[i++] ^ C >> 16 & 255] ^ Tc[B[i++] ^ C >>> 24] ^ Tb[B[i++]] ^ Ta[B[i++]] ^ T9[B[i++]] ^ T8[B[i++]] ^ T7[B[i++]] ^ T6[B[i++]] ^ T5[B[i++]] ^ T4[B[i++]] ^ T3[B[i++]] ^ T2[B[i++]] ^ T1[B[i++]] ^ T0[B[i++]]; + L += 15; + while (i < L) + C = C >>> 8 ^ T0[(C ^ B[i++]) & 255]; + return ~C; + } + function crc32_str(str, seed) { + var C = seed ^ -1; + for (var i = 0, L = str.length, c = 0, d = 0;i < L; ) { + c = str.charCodeAt(i++); + if (c < 128) { + C = C >>> 8 ^ T0[(C ^ c) & 255]; + } else if (c < 2048) { + C = C >>> 8 ^ T0[(C ^ (192 | c >> 6 & 31)) & 255]; + C = C >>> 8 ^ T0[(C ^ (128 | c & 63)) & 255]; + } else if (c >= 55296 && c < 57344) { + c = (c & 1023) + 64; + d = str.charCodeAt(i++) & 1023; + C = C >>> 8 ^ T0[(C ^ (240 | c >> 8 & 7)) & 255]; + C = C >>> 8 ^ T0[(C ^ (128 | c >> 2 & 63)) & 255]; + C = C >>> 8 ^ T0[(C ^ (128 | d >> 6 & 15 | (c & 3) << 4)) & 255]; + C = C >>> 8 ^ T0[(C ^ (128 | d & 63)) & 255]; + } else { + C = C >>> 8 ^ T0[(C ^ (224 | c >> 12 & 15)) & 255]; + C = C >>> 8 ^ T0[(C ^ (128 | c >> 6 & 63)) & 255]; + C = C >>> 8 ^ T0[(C ^ (128 | c & 63)) & 255]; + } + } + return ~C; + } + CRC322.table = T0; + CRC322.bstr = crc32_bstr; + CRC322.buf = crc32_buf; + CRC322.str = crc32_str; + }); +}); + +// node_modules/crc32-stream/lib/crc32-stream.js +var require_crc32_stream = __commonJS((exports2, module2) => { + var { Transform } = require_ours(); + var crc32 = require_crc32(); + + class CRC32Stream extends Transform { + constructor(options) { + super(options); + this.checksum = Buffer.allocUnsafe(4); + this.checksum.writeInt32BE(0, 0); + this.rawSize = 0; + } + _transform(chunk, encoding, callback) { + if (chunk) { + this.checksum = crc32.buf(chunk, this.checksum) >>> 0; + this.rawSize += chunk.length; + } + callback(null, chunk); + } + digest(encoding) { + const checksum = Buffer.allocUnsafe(4); + checksum.writeUInt32BE(this.checksum >>> 0, 0); + return encoding ? checksum.toString(encoding) : checksum; + } + hex() { + return this.digest("hex").toUpperCase(); + } + size() { + return this.rawSize; + } + } + module2.exports = CRC32Stream; +}); + +// node_modules/crc32-stream/lib/deflate-crc32-stream.js +var require_deflate_crc32_stream = __commonJS((exports2, module2) => { + var { DeflateRaw } = require("zlib"); + var crc32 = require_crc32(); + + class DeflateCRC32Stream extends DeflateRaw { + constructor(options) { + super(options); + this.checksum = Buffer.allocUnsafe(4); + this.checksum.writeInt32BE(0, 0); + this.rawSize = 0; + this.compressedSize = 0; + } + push(chunk, encoding) { + if (chunk) { + this.compressedSize += chunk.length; + } + return super.push(chunk, encoding); + } + _transform(chunk, encoding, callback) { + if (chunk) { + this.checksum = crc32.buf(chunk, this.checksum) >>> 0; + this.rawSize += chunk.length; + } + super._transform(chunk, encoding, callback); + } + digest(encoding) { + const checksum = Buffer.allocUnsafe(4); + checksum.writeUInt32BE(this.checksum >>> 0, 0); + return encoding ? checksum.toString(encoding) : checksum; + } + hex() { + return this.digest("hex").toUpperCase(); + } + size(compressed = false) { + if (compressed) { + return this.compressedSize; + } else { + return this.rawSize; + } + } + } + module2.exports = DeflateCRC32Stream; +}); + +// node_modules/crc32-stream/lib/index.js +var require_lib2 = __commonJS((exports2, module2) => { + module2.exports = { + CRC32Stream: require_crc32_stream(), + DeflateCRC32Stream: require_deflate_crc32_stream() + }; +}); + +// node_modules/compress-commons/lib/archivers/zip/zip-archive-output-stream.js +var require_zip_archive_output_stream = __commonJS((exports2, module2) => { + var inherits = require("util").inherits; + var crc32 = require_crc32(); + var { CRC32Stream } = require_lib2(); + var { DeflateCRC32Stream } = require_lib2(); + var ArchiveOutputStream = require_archive_output_stream(); + var ZipArchiveEntry = require_zip_archive_entry(); + var GeneralPurposeBit = require_general_purpose_bit(); + var constants = require_constants8(); + var util = require_util14(); + var zipUtil = require_util13(); + var ZipArchiveOutputStream = module2.exports = function(options) { + if (!(this instanceof ZipArchiveOutputStream)) { + return new ZipArchiveOutputStream(options); + } + options = this.options = this._defaults(options); + ArchiveOutputStream.call(this, options); + this._entry = null; + this._entries = []; + this._archive = { + centralLength: 0, + centralOffset: 0, + comment: "", + finish: false, + finished: false, + processing: false, + forceZip64: options.forceZip64, + forceLocalTime: options.forceLocalTime + }; + }; + inherits(ZipArchiveOutputStream, ArchiveOutputStream); + ZipArchiveOutputStream.prototype._afterAppend = function(ae) { + this._entries.push(ae); + if (ae.getGeneralPurposeBit().usesDataDescriptor()) { + this._writeDataDescriptor(ae); + } + this._archive.processing = false; + this._entry = null; + if (this._archive.finish && !this._archive.finished) { + this._finish(); + } + }; + ZipArchiveOutputStream.prototype._appendBuffer = function(ae, source, callback) { + if (source.length === 0) { + ae.setMethod(constants.METHOD_STORED); + } + var method = ae.getMethod(); + if (method === constants.METHOD_STORED) { + ae.setSize(source.length); + ae.setCompressedSize(source.length); + ae.setCrc(crc32.buf(source) >>> 0); + } + this._writeLocalFileHeader(ae); + if (method === constants.METHOD_STORED) { + this.write(source); + this._afterAppend(ae); + callback(null, ae); + return; + } else if (method === constants.METHOD_DEFLATED) { + this._smartStream(ae, callback).end(source); + return; + } else { + callback(new Error("compression method " + method + " not implemented")); + return; + } + }; + ZipArchiveOutputStream.prototype._appendStream = function(ae, source, callback) { + ae.getGeneralPurposeBit().useDataDescriptor(true); + ae.setVersionNeededToExtract(constants.MIN_VERSION_DATA_DESCRIPTOR); + this._writeLocalFileHeader(ae); + var smart = this._smartStream(ae, callback); + source.once("error", function(err) { + smart.emit("error", err); + smart.end(); + }); + source.pipe(smart); + }; + ZipArchiveOutputStream.prototype._defaults = function(o) { + if (typeof o !== "object") { + o = {}; + } + if (typeof o.zlib !== "object") { + o.zlib = {}; + } + if (typeof o.zlib.level !== "number") { + o.zlib.level = constants.ZLIB_BEST_SPEED; + } + o.forceZip64 = !!o.forceZip64; + o.forceLocalTime = !!o.forceLocalTime; + return o; + }; + ZipArchiveOutputStream.prototype._finish = function() { + this._archive.centralOffset = this.offset; + this._entries.forEach(function(ae) { + this._writeCentralFileHeader(ae); + }.bind(this)); + this._archive.centralLength = this.offset - this._archive.centralOffset; + if (this.isZip64()) { + this._writeCentralDirectoryZip64(); + } + this._writeCentralDirectoryEnd(); + this._archive.processing = false; + this._archive.finish = true; + this._archive.finished = true; + this.end(); + }; + ZipArchiveOutputStream.prototype._normalizeEntry = function(ae) { + if (ae.getMethod() === -1) { + ae.setMethod(constants.METHOD_DEFLATED); + } + if (ae.getMethod() === constants.METHOD_DEFLATED) { + ae.getGeneralPurposeBit().useDataDescriptor(true); + ae.setVersionNeededToExtract(constants.MIN_VERSION_DATA_DESCRIPTOR); + } + if (ae.getTime() === -1) { + ae.setTime(new Date, this._archive.forceLocalTime); + } + ae._offsets = { + file: 0, + data: 0, + contents: 0 + }; + }; + ZipArchiveOutputStream.prototype._smartStream = function(ae, callback) { + var deflate = ae.getMethod() === constants.METHOD_DEFLATED; + var process2 = deflate ? new DeflateCRC32Stream(this.options.zlib) : new CRC32Stream; + var error = null; + function handleStuff() { + var digest = process2.digest().readUInt32BE(0); + ae.setCrc(digest); + ae.setSize(process2.size()); + ae.setCompressedSize(process2.size(true)); + this._afterAppend(ae); + callback(error, ae); + } + process2.once("end", handleStuff.bind(this)); + process2.once("error", function(err) { + error = err; + }); + process2.pipe(this, { end: false }); + return process2; + }; + ZipArchiveOutputStream.prototype._writeCentralDirectoryEnd = function() { + var records = this._entries.length; + var size = this._archive.centralLength; + var offset = this._archive.centralOffset; + if (this.isZip64()) { + records = constants.ZIP64_MAGIC_SHORT; + size = constants.ZIP64_MAGIC; + offset = constants.ZIP64_MAGIC; + } + this.write(zipUtil.getLongBytes(constants.SIG_EOCD)); + this.write(constants.SHORT_ZERO); + this.write(constants.SHORT_ZERO); + this.write(zipUtil.getShortBytes(records)); + this.write(zipUtil.getShortBytes(records)); + this.write(zipUtil.getLongBytes(size)); + this.write(zipUtil.getLongBytes(offset)); + var comment = this.getComment(); + var commentLength = Buffer.byteLength(comment); + this.write(zipUtil.getShortBytes(commentLength)); + this.write(comment); + }; + ZipArchiveOutputStream.prototype._writeCentralDirectoryZip64 = function() { + this.write(zipUtil.getLongBytes(constants.SIG_ZIP64_EOCD)); + this.write(zipUtil.getEightBytes(44)); + this.write(zipUtil.getShortBytes(constants.MIN_VERSION_ZIP64)); + this.write(zipUtil.getShortBytes(constants.MIN_VERSION_ZIP64)); + this.write(constants.LONG_ZERO); + this.write(constants.LONG_ZERO); + this.write(zipUtil.getEightBytes(this._entries.length)); + this.write(zipUtil.getEightBytes(this._entries.length)); + this.write(zipUtil.getEightBytes(this._archive.centralLength)); + this.write(zipUtil.getEightBytes(this._archive.centralOffset)); + this.write(zipUtil.getLongBytes(constants.SIG_ZIP64_EOCD_LOC)); + this.write(constants.LONG_ZERO); + this.write(zipUtil.getEightBytes(this._archive.centralOffset + this._archive.centralLength)); + this.write(zipUtil.getLongBytes(1)); + }; + ZipArchiveOutputStream.prototype._writeCentralFileHeader = function(ae) { + var gpb = ae.getGeneralPurposeBit(); + var method = ae.getMethod(); + var fileOffset = ae._offsets.file; + var size = ae.getSize(); + var compressedSize = ae.getCompressedSize(); + if (ae.isZip64() || fileOffset > constants.ZIP64_MAGIC) { + size = constants.ZIP64_MAGIC; + compressedSize = constants.ZIP64_MAGIC; + fileOffset = constants.ZIP64_MAGIC; + ae.setVersionNeededToExtract(constants.MIN_VERSION_ZIP64); + var extraBuf = Buffer.concat([ + zipUtil.getShortBytes(constants.ZIP64_EXTRA_ID), + zipUtil.getShortBytes(24), + zipUtil.getEightBytes(ae.getSize()), + zipUtil.getEightBytes(ae.getCompressedSize()), + zipUtil.getEightBytes(ae._offsets.file) + ], 28); + ae.setExtra(extraBuf); + } + this.write(zipUtil.getLongBytes(constants.SIG_CFH)); + this.write(zipUtil.getShortBytes(ae.getPlatform() << 8 | constants.VERSION_MADEBY)); + this.write(zipUtil.getShortBytes(ae.getVersionNeededToExtract())); + this.write(gpb.encode()); + this.write(zipUtil.getShortBytes(method)); + this.write(zipUtil.getLongBytes(ae.getTimeDos())); + this.write(zipUtil.getLongBytes(ae.getCrc())); + this.write(zipUtil.getLongBytes(compressedSize)); + this.write(zipUtil.getLongBytes(size)); + var name = ae.getName(); + var comment = ae.getComment(); + var extra = ae.getCentralDirectoryExtra(); + if (gpb.usesUTF8ForNames()) { + name = Buffer.from(name); + comment = Buffer.from(comment); + } + this.write(zipUtil.getShortBytes(name.length)); + this.write(zipUtil.getShortBytes(extra.length)); + this.write(zipUtil.getShortBytes(comment.length)); + this.write(constants.SHORT_ZERO); + this.write(zipUtil.getShortBytes(ae.getInternalAttributes())); + this.write(zipUtil.getLongBytes(ae.getExternalAttributes())); + this.write(zipUtil.getLongBytes(fileOffset)); + this.write(name); + this.write(extra); + this.write(comment); + }; + ZipArchiveOutputStream.prototype._writeDataDescriptor = function(ae) { + this.write(zipUtil.getLongBytes(constants.SIG_DD)); + this.write(zipUtil.getLongBytes(ae.getCrc())); + if (ae.isZip64()) { + this.write(zipUtil.getEightBytes(ae.getCompressedSize())); + this.write(zipUtil.getEightBytes(ae.getSize())); + } else { + this.write(zipUtil.getLongBytes(ae.getCompressedSize())); + this.write(zipUtil.getLongBytes(ae.getSize())); + } + }; + ZipArchiveOutputStream.prototype._writeLocalFileHeader = function(ae) { + var gpb = ae.getGeneralPurposeBit(); + var method = ae.getMethod(); + var name = ae.getName(); + var extra = ae.getLocalFileDataExtra(); + if (ae.isZip64()) { + gpb.useDataDescriptor(true); + ae.setVersionNeededToExtract(constants.MIN_VERSION_ZIP64); + } + if (gpb.usesUTF8ForNames()) { + name = Buffer.from(name); + } + ae._offsets.file = this.offset; + this.write(zipUtil.getLongBytes(constants.SIG_LFH)); + this.write(zipUtil.getShortBytes(ae.getVersionNeededToExtract())); + this.write(gpb.encode()); + this.write(zipUtil.getShortBytes(method)); + this.write(zipUtil.getLongBytes(ae.getTimeDos())); + ae._offsets.data = this.offset; + if (gpb.usesDataDescriptor()) { + this.write(constants.LONG_ZERO); + this.write(constants.LONG_ZERO); + this.write(constants.LONG_ZERO); + } else { + this.write(zipUtil.getLongBytes(ae.getCrc())); + this.write(zipUtil.getLongBytes(ae.getCompressedSize())); + this.write(zipUtil.getLongBytes(ae.getSize())); + } + this.write(zipUtil.getShortBytes(name.length)); + this.write(zipUtil.getShortBytes(extra.length)); + this.write(name); + this.write(extra); + ae._offsets.contents = this.offset; + }; + ZipArchiveOutputStream.prototype.getComment = function(comment) { + return this._archive.comment !== null ? this._archive.comment : ""; + }; + ZipArchiveOutputStream.prototype.isZip64 = function() { + return this._archive.forceZip64 || this._entries.length > constants.ZIP64_MAGIC_SHORT || this._archive.centralLength > constants.ZIP64_MAGIC || this._archive.centralOffset > constants.ZIP64_MAGIC; + }; + ZipArchiveOutputStream.prototype.setComment = function(comment) { + this._archive.comment = comment; + }; +}); + +// node_modules/compress-commons/lib/compress-commons.js +var require_compress_commons = __commonJS((exports2, module2) => { + module2.exports = { + ArchiveEntry: require_archive_entry(), + ZipArchiveEntry: require_zip_archive_entry(), + ArchiveOutputStream: require_archive_output_stream(), + ZipArchiveOutputStream: require_zip_archive_output_stream() + }; +}); + +// node_modules/zip-stream/index.js +var require_zip_stream = __commonJS((exports2, module2) => { + var inherits = require("util").inherits; + var ZipArchiveOutputStream = require_compress_commons().ZipArchiveOutputStream; + var ZipArchiveEntry = require_compress_commons().ZipArchiveEntry; + var util = require_archiver_utils(); + var ZipStream = module2.exports = function(options) { + if (!(this instanceof ZipStream)) { + return new ZipStream(options); + } + options = this.options = options || {}; + options.zlib = options.zlib || {}; + ZipArchiveOutputStream.call(this, options); + if (typeof options.level === "number" && options.level >= 0) { + options.zlib.level = options.level; + delete options.level; + } + if (!options.forceZip64 && typeof options.zlib.level === "number" && options.zlib.level === 0) { + options.store = true; + } + options.namePrependSlash = options.namePrependSlash || false; + if (options.comment && options.comment.length > 0) { + this.setComment(options.comment); + } + }; + inherits(ZipStream, ZipArchiveOutputStream); + ZipStream.prototype._normalizeFileData = function(data) { + data = util.defaults(data, { + type: "file", + name: null, + namePrependSlash: this.options.namePrependSlash, + linkname: null, + date: null, + mode: null, + store: this.options.store, + comment: "" + }); + var isDir = data.type === "directory"; + var isSymlink = data.type === "symlink"; + if (data.name) { + data.name = util.sanitizePath(data.name); + if (!isSymlink && data.name.slice(-1) === "/") { + isDir = true; + data.type = "directory"; + } else if (isDir) { + data.name += "/"; + } + } + if (isDir || isSymlink) { + data.store = true; + } + data.date = util.dateify(data.date); + return data; + }; + ZipStream.prototype.entry = function(source, data, callback) { + if (typeof callback !== "function") { + callback = this._emitErrorCallback.bind(this); + } + data = this._normalizeFileData(data); + if (data.type !== "file" && data.type !== "directory" && data.type !== "symlink") { + callback(new Error(data.type + " entries not currently supported")); + return; + } + if (typeof data.name !== "string" || data.name.length === 0) { + callback(new Error("entry name must be a non-empty string value")); + return; + } + if (data.type === "symlink" && typeof data.linkname !== "string") { + callback(new Error("entry linkname must be a non-empty string value when type equals symlink")); + return; + } + var entry = new ZipArchiveEntry(data.name); + entry.setTime(data.date, this.options.forceLocalTime); + if (data.namePrependSlash) { + entry.setName(data.name, true); + } + if (data.store) { + entry.setMethod(0); + } + if (data.comment.length > 0) { + entry.setComment(data.comment); + } + if (data.type === "symlink" && typeof data.mode !== "number") { + data.mode = 40960; + } + if (typeof data.mode === "number") { + if (data.type === "symlink") { + data.mode |= 40960; + } + entry.setUnixMode(data.mode); + } + if (data.type === "symlink" && typeof data.linkname === "string") { + source = Buffer.from(data.linkname); + } + return ZipArchiveOutputStream.prototype.entry.call(this, entry, source, callback); + }; + ZipStream.prototype.finalize = function() { + this.finish(); + }; +}); + +// node_modules/archiver/lib/plugins/zip.js +var require_zip = __commonJS((exports2, module2) => { + var engine = require_zip_stream(); + var util = require_archiver_utils(); + var Zip = function(options) { + if (!(this instanceof Zip)) { + return new Zip(options); + } + options = this.options = util.defaults(options, { + comment: "", + forceUTC: false, + namePrependSlash: false, + store: false + }); + this.supports = { + directory: true, + symlink: true + }; + this.engine = new engine(options); + }; + Zip.prototype.append = function(source, data, callback) { + this.engine.entry(source, data, callback); + }; + Zip.prototype.finalize = function() { + this.engine.finalize(); + }; + Zip.prototype.on = function() { + return this.engine.on.apply(this.engine, arguments); + }; + Zip.prototype.pipe = function() { + return this.engine.pipe.apply(this.engine, arguments); + }; + Zip.prototype.unpipe = function() { + return this.engine.unpipe.apply(this.engine, arguments); + }; + module2.exports = Zip; +}); + +// node_modules/queue-tick/queue-microtask.js +var require_queue_microtask = __commonJS((exports2, module2) => { + module2.exports = typeof queueMicrotask === "function" ? queueMicrotask : (fn) => Promise.resolve().then(fn); +}); + +// node_modules/queue-tick/process-next-tick.js +var require_process_next_tick = __commonJS((exports2, module2) => { + module2.exports = typeof process !== "undefined" && typeof process.nextTick === "function" ? process.nextTick.bind(process) : require_queue_microtask(); +}); + +// node_modules/fast-fifo/fixed-size.js +var require_fixed_size = __commonJS((exports2, module2) => { + module2.exports = class FixedFIFO { + constructor(hwm) { + if (!(hwm > 0) || (hwm - 1 & hwm) !== 0) + throw new Error("Max size for a FixedFIFO should be a power of two"); + this.buffer = new Array(hwm); + this.mask = hwm - 1; + this.top = 0; + this.btm = 0; + this.next = null; + } + clear() { + this.top = this.btm = 0; + this.next = null; + this.buffer.fill(undefined); + } + push(data) { + if (this.buffer[this.top] !== undefined) + return false; + this.buffer[this.top] = data; + this.top = this.top + 1 & this.mask; + return true; + } + shift() { + const last = this.buffer[this.btm]; + if (last === undefined) + return; + this.buffer[this.btm] = undefined; + this.btm = this.btm + 1 & this.mask; + return last; + } + peek() { + return this.buffer[this.btm]; + } + isEmpty() { + return this.buffer[this.btm] === undefined; + } + }; +}); + +// node_modules/fast-fifo/index.js +var require_fast_fifo = __commonJS((exports2, module2) => { + var FixedFIFO = require_fixed_size(); + module2.exports = class FastFIFO { + constructor(hwm) { + this.hwm = hwm || 16; + this.head = new FixedFIFO(this.hwm); + this.tail = this.head; + this.length = 0; + } + clear() { + this.head = this.tail; + this.head.clear(); + this.length = 0; + } + push(val2) { + this.length++; + if (!this.head.push(val2)) { + const prev = this.head; + this.head = prev.next = new FixedFIFO(2 * this.head.buffer.length); + this.head.push(val2); + } + } + shift() { + if (this.length !== 0) + this.length--; + const val2 = this.tail.shift(); + if (val2 === undefined && this.tail.next) { + const next = this.tail.next; + this.tail.next = null; + this.tail = next; + return this.tail.shift(); + } + return val2; + } + peek() { + const val2 = this.tail.peek(); + if (val2 === undefined && this.tail.next) + return this.tail.next.peek(); + return val2; + } + isEmpty() { + return this.length === 0; + } + }; +}); + +// node_modules/text-decoder/lib/pass-through-decoder.js +var require_pass_through_decoder = __commonJS((exports2, module2) => { + module2.exports = class PassThroughDecoder { + constructor(encoding) { + this.encoding = encoding; + } + get remaining() { + return 0; + } + decode(tail) { + return tail.toString(this.encoding); + } + flush() { + return ""; + } + }; +}); + +// node_modules/text-decoder/lib/utf8-decoder.js +var require_utf8_decoder = __commonJS((exports2, module2) => { + module2.exports = class UTF8Decoder { + constructor() { + this.codePoint = 0; + this.bytesSeen = 0; + this.bytesNeeded = 0; + this.lowerBoundary = 128; + this.upperBoundary = 191; + } + get remaining() { + return this.bytesSeen; + } + decode(data) { + if (this.bytesNeeded === 0) { + let isBoundary = true; + for (let i = Math.max(0, data.byteLength - 4), n = data.byteLength;i < n && isBoundary; i++) { + isBoundary = data[i] <= 127; + } + if (isBoundary) + return data.toString(); + } + let result = ""; + for (let i = 0, n = data.byteLength;i < n; i++) { + const byte = data[i]; + if (this.bytesNeeded === 0) { + if (byte <= 127) { + result += String.fromCharCode(byte); + } else { + this.bytesSeen = 1; + if (byte >= 194 && byte <= 223) { + this.bytesNeeded = 2; + this.codePoint = byte & 31; + } else if (byte >= 224 && byte <= 239) { + if (byte === 224) + this.lowerBoundary = 160; + else if (byte === 237) + this.upperBoundary = 159; + this.bytesNeeded = 3; + this.codePoint = byte & 15; + } else if (byte >= 240 && byte <= 244) { + if (byte === 240) + this.lowerBoundary = 144; + if (byte === 244) + this.upperBoundary = 143; + this.bytesNeeded = 4; + this.codePoint = byte & 7; + } else { + result += "\uFFFD"; + } + } + continue; + } + if (byte < this.lowerBoundary || byte > this.upperBoundary) { + this.codePoint = 0; + this.bytesNeeded = 0; + this.bytesSeen = 0; + this.lowerBoundary = 128; + this.upperBoundary = 191; + result += "\uFFFD"; + continue; + } + this.lowerBoundary = 128; + this.upperBoundary = 191; + this.codePoint = this.codePoint << 6 | byte & 63; + this.bytesSeen++; + if (this.bytesSeen !== this.bytesNeeded) + continue; + result += String.fromCodePoint(this.codePoint); + this.codePoint = 0; + this.bytesNeeded = 0; + this.bytesSeen = 0; + } + return result; + } + flush() { + const result = this.bytesNeeded > 0 ? "\uFFFD" : ""; + this.codePoint = 0; + this.bytesNeeded = 0; + this.bytesSeen = 0; + this.lowerBoundary = 128; + this.upperBoundary = 191; + return result; + } + }; +}); + +// node_modules/text-decoder/index.js +var require_text_decoder = __commonJS((exports2, module2) => { + var PassThroughDecoder = require_pass_through_decoder(); + var UTF8Decoder = require_utf8_decoder(); + module2.exports = class TextDecoder2 { + constructor(encoding = "utf8") { + this.encoding = normalizeEncoding(encoding); + switch (this.encoding) { + case "utf8": + this.decoder = new UTF8Decoder; + break; + case "utf16le": + case "base64": + throw new Error("Unsupported encoding: " + this.encoding); + default: + this.decoder = new PassThroughDecoder(this.encoding); + } + } + get remaining() { + return this.decoder.remaining; + } + push(data) { + if (typeof data === "string") + return data; + return this.decoder.decode(data); + } + write(data) { + return this.push(data); + } + end(data) { + let result = ""; + if (data) + result = this.push(data); + result += this.decoder.flush(); + return result; + } + }; + function normalizeEncoding(encoding) { + encoding = encoding.toLowerCase(); + switch (encoding) { + 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 encoding; + default: + throw new Error("Unknown encoding: " + encoding); + } + } +}); + +// node_modules/streamx/index.js +var require_streamx = __commonJS((exports2, module2) => { + var { EventEmitter } = require("events"); + var STREAM_DESTROYED = new Error("Stream was destroyed"); + var PREMATURE_CLOSE = new Error("Premature close"); + var queueTick = require_process_next_tick(); + var FIFO = require_fast_fifo(); + var TextDecoder2 = require_text_decoder(); + var MAX = (1 << 29) - 1; + var OPENING = 1; + var PREDESTROYING = 2; + var DESTROYING = 4; + var DESTROYED = 8; + var NOT_OPENING = MAX ^ OPENING; + var NOT_PREDESTROYING = MAX ^ PREDESTROYING; + var READ_ACTIVE = 1 << 4; + var READ_UPDATING = 2 << 4; + var READ_PRIMARY = 4 << 4; + var READ_QUEUED = 8 << 4; + var READ_RESUMED = 16 << 4; + var READ_PIPE_DRAINED = 32 << 4; + var READ_ENDING = 64 << 4; + var READ_EMIT_DATA = 128 << 4; + var READ_EMIT_READABLE = 256 << 4; + var READ_EMITTED_READABLE = 512 << 4; + var READ_DONE = 1024 << 4; + var READ_NEXT_TICK = 2048 << 4; + var READ_NEEDS_PUSH = 4096 << 4; + var READ_READ_AHEAD = 8192 << 4; + var READ_FLOWING = READ_RESUMED | READ_PIPE_DRAINED; + var READ_ACTIVE_AND_NEEDS_PUSH = READ_ACTIVE | READ_NEEDS_PUSH; + var READ_PRIMARY_AND_ACTIVE = READ_PRIMARY | READ_ACTIVE; + var READ_EMIT_READABLE_AND_QUEUED = READ_EMIT_READABLE | READ_QUEUED; + var READ_RESUMED_READ_AHEAD = READ_RESUMED | READ_READ_AHEAD; + var READ_NOT_ACTIVE = MAX ^ READ_ACTIVE; + var READ_NON_PRIMARY = MAX ^ READ_PRIMARY; + var READ_NON_PRIMARY_AND_PUSHED = MAX ^ (READ_PRIMARY | READ_NEEDS_PUSH); + var READ_PUSHED = MAX ^ READ_NEEDS_PUSH; + var READ_PAUSED = MAX ^ READ_RESUMED; + var READ_NOT_QUEUED = MAX ^ (READ_QUEUED | READ_EMITTED_READABLE); + var READ_NOT_ENDING = MAX ^ READ_ENDING; + var READ_PIPE_NOT_DRAINED = MAX ^ READ_FLOWING; + var READ_NOT_NEXT_TICK = MAX ^ READ_NEXT_TICK; + var READ_NOT_UPDATING = MAX ^ READ_UPDATING; + var READ_NO_READ_AHEAD = MAX ^ READ_READ_AHEAD; + var READ_PAUSED_NO_READ_AHEAD = MAX ^ READ_RESUMED_READ_AHEAD; + var WRITE_ACTIVE = 1 << 18; + var WRITE_UPDATING = 2 << 18; + var WRITE_PRIMARY = 4 << 18; + var WRITE_QUEUED = 8 << 18; + var WRITE_UNDRAINED = 16 << 18; + var WRITE_DONE = 32 << 18; + var WRITE_EMIT_DRAIN = 64 << 18; + var WRITE_NEXT_TICK = 128 << 18; + var WRITE_WRITING = 256 << 18; + var WRITE_FINISHING = 512 << 18; + var WRITE_CORKED = 1024 << 18; + var WRITE_NOT_ACTIVE = MAX ^ (WRITE_ACTIVE | WRITE_WRITING); + var WRITE_NON_PRIMARY = MAX ^ WRITE_PRIMARY; + var WRITE_NOT_FINISHING = MAX ^ WRITE_FINISHING; + var WRITE_DRAINED = MAX ^ WRITE_UNDRAINED; + var WRITE_NOT_QUEUED = MAX ^ WRITE_QUEUED; + var WRITE_NOT_NEXT_TICK = MAX ^ WRITE_NEXT_TICK; + var WRITE_NOT_UPDATING = MAX ^ WRITE_UPDATING; + var WRITE_NOT_CORKED = MAX ^ WRITE_CORKED; + var ACTIVE = READ_ACTIVE | WRITE_ACTIVE; + var NOT_ACTIVE = MAX ^ ACTIVE; + var DONE = READ_DONE | WRITE_DONE; + var DESTROY_STATUS = DESTROYING | DESTROYED | PREDESTROYING; + var OPEN_STATUS = DESTROY_STATUS | OPENING; + var AUTO_DESTROY = DESTROY_STATUS | DONE; + var NON_PRIMARY = WRITE_NON_PRIMARY & READ_NON_PRIMARY; + var ACTIVE_OR_TICKING = WRITE_NEXT_TICK | READ_NEXT_TICK; + var TICKING = ACTIVE_OR_TICKING & NOT_ACTIVE; + var IS_OPENING = OPEN_STATUS | TICKING; + var READ_PRIMARY_STATUS = OPEN_STATUS | READ_ENDING | READ_DONE; + var READ_STATUS = OPEN_STATUS | READ_DONE | READ_QUEUED; + var READ_ENDING_STATUS = OPEN_STATUS | READ_ENDING | READ_QUEUED; + var READ_READABLE_STATUS = OPEN_STATUS | READ_EMIT_READABLE | READ_QUEUED | READ_EMITTED_READABLE; + var SHOULD_NOT_READ = OPEN_STATUS | READ_ACTIVE | READ_ENDING | READ_DONE | READ_NEEDS_PUSH | READ_READ_AHEAD; + var READ_BACKPRESSURE_STATUS = DESTROY_STATUS | READ_ENDING | READ_DONE; + var READ_UPDATE_SYNC_STATUS = READ_UPDATING | OPEN_STATUS | READ_NEXT_TICK | READ_PRIMARY; + var WRITE_PRIMARY_STATUS = OPEN_STATUS | WRITE_FINISHING | WRITE_DONE; + var WRITE_QUEUED_AND_UNDRAINED = WRITE_QUEUED | WRITE_UNDRAINED; + var WRITE_QUEUED_AND_ACTIVE = WRITE_QUEUED | WRITE_ACTIVE; + var WRITE_DRAIN_STATUS = WRITE_QUEUED | WRITE_UNDRAINED | OPEN_STATUS | WRITE_ACTIVE; + var WRITE_STATUS = OPEN_STATUS | WRITE_ACTIVE | WRITE_QUEUED | WRITE_CORKED; + var WRITE_PRIMARY_AND_ACTIVE = WRITE_PRIMARY | WRITE_ACTIVE; + var WRITE_ACTIVE_AND_WRITING = WRITE_ACTIVE | WRITE_WRITING; + var WRITE_FINISHING_STATUS = OPEN_STATUS | WRITE_FINISHING | WRITE_QUEUED_AND_ACTIVE | WRITE_DONE; + var WRITE_BACKPRESSURE_STATUS = WRITE_UNDRAINED | DESTROY_STATUS | WRITE_FINISHING | WRITE_DONE; + var WRITE_UPDATE_SYNC_STATUS = WRITE_UPDATING | OPEN_STATUS | WRITE_NEXT_TICK | WRITE_PRIMARY; + var asyncIterator = Symbol.asyncIterator || Symbol("asyncIterator"); + + class WritableState { + constructor(stream, { highWaterMark = 16384, map = null, mapWritable, byteLength, byteLengthWritable } = {}) { + this.stream = stream; + this.queue = new FIFO; + this.highWaterMark = highWaterMark; + this.buffered = 0; + this.error = null; + this.pipeline = null; + this.drains = null; + this.byteLength = byteLengthWritable || byteLength || defaultByteLength; + this.map = mapWritable || map; + this.afterWrite = afterWrite.bind(this); + this.afterUpdateNextTick = updateWriteNT.bind(this); + } + get ended() { + return (this.stream._duplexState & WRITE_DONE) !== 0; + } + push(data) { + if (this.map !== null) + data = this.map(data); + this.buffered += this.byteLength(data); + this.queue.push(data); + if (this.buffered < this.highWaterMark) { + this.stream._duplexState |= WRITE_QUEUED; + return true; + } + this.stream._duplexState |= WRITE_QUEUED_AND_UNDRAINED; + return false; + } + shift() { + const data = this.queue.shift(); + this.buffered -= this.byteLength(data); + if (this.buffered === 0) + this.stream._duplexState &= WRITE_NOT_QUEUED; + return data; + } + end(data) { + if (typeof data === "function") + this.stream.once("finish", data); + else if (data !== undefined && data !== null) + this.push(data); + this.stream._duplexState = (this.stream._duplexState | WRITE_FINISHING) & WRITE_NON_PRIMARY; + } + autoBatch(data, cb) { + const buffer = []; + const stream = this.stream; + buffer.push(data); + while ((stream._duplexState & WRITE_STATUS) === WRITE_QUEUED_AND_ACTIVE) { + buffer.push(stream._writableState.shift()); + } + if ((stream._duplexState & OPEN_STATUS) !== 0) + return cb(null); + stream._writev(buffer, cb); + } + update() { + const stream = this.stream; + stream._duplexState |= WRITE_UPDATING; + do { + while ((stream._duplexState & WRITE_STATUS) === WRITE_QUEUED) { + const data = this.shift(); + stream._duplexState |= WRITE_ACTIVE_AND_WRITING; + stream._write(data, this.afterWrite); + } + if ((stream._duplexState & WRITE_PRIMARY_AND_ACTIVE) === 0) + this.updateNonPrimary(); + } while (this.continueUpdate() === true); + stream._duplexState &= WRITE_NOT_UPDATING; + } + updateNonPrimary() { + const stream = this.stream; + if ((stream._duplexState & WRITE_FINISHING_STATUS) === WRITE_FINISHING) { + stream._duplexState = (stream._duplexState | WRITE_ACTIVE) & WRITE_NOT_FINISHING; + stream._final(afterFinal.bind(this)); + return; + } + if ((stream._duplexState & DESTROY_STATUS) === DESTROYING) { + if ((stream._duplexState & ACTIVE_OR_TICKING) === 0) { + stream._duplexState |= ACTIVE; + stream._destroy(afterDestroy.bind(this)); + } + return; + } + if ((stream._duplexState & IS_OPENING) === OPENING) { + stream._duplexState = (stream._duplexState | ACTIVE) & NOT_OPENING; + stream._open(afterOpen.bind(this)); + } + } + continueUpdate() { + if ((this.stream._duplexState & WRITE_NEXT_TICK) === 0) + return false; + this.stream._duplexState &= WRITE_NOT_NEXT_TICK; + return true; + } + updateCallback() { + if ((this.stream._duplexState & WRITE_UPDATE_SYNC_STATUS) === WRITE_PRIMARY) + this.update(); + else + this.updateNextTick(); + } + updateNextTick() { + if ((this.stream._duplexState & WRITE_NEXT_TICK) !== 0) + return; + this.stream._duplexState |= WRITE_NEXT_TICK; + if ((this.stream._duplexState & WRITE_UPDATING) === 0) + queueTick(this.afterUpdateNextTick); + } + } + + class ReadableState { + constructor(stream, { highWaterMark = 16384, map = null, mapReadable, byteLength, byteLengthReadable } = {}) { + this.stream = stream; + this.queue = new FIFO; + this.highWaterMark = highWaterMark === 0 ? 1 : highWaterMark; + this.buffered = 0; + this.readAhead = highWaterMark > 0; + this.error = null; + this.pipeline = null; + this.byteLength = byteLengthReadable || byteLength || defaultByteLength; + this.map = mapReadable || map; + this.pipeTo = null; + this.afterRead = afterRead.bind(this); + this.afterUpdateNextTick = updateReadNT.bind(this); + } + get ended() { + return (this.stream._duplexState & READ_DONE) !== 0; + } + pipe(pipeTo, cb) { + if (this.pipeTo !== null) + throw new Error("Can only pipe to one destination"); + if (typeof cb !== "function") + cb = null; + this.stream._duplexState |= READ_PIPE_DRAINED; + this.pipeTo = pipeTo; + this.pipeline = new Pipeline(this.stream, pipeTo, cb); + if (cb) + this.stream.on("error", noop); + if (isStreamx(pipeTo)) { + pipeTo._writableState.pipeline = this.pipeline; + if (cb) + pipeTo.on("error", noop); + pipeTo.on("finish", this.pipeline.finished.bind(this.pipeline)); + } else { + const onerror = this.pipeline.done.bind(this.pipeline, pipeTo); + const onclose = this.pipeline.done.bind(this.pipeline, pipeTo, null); + pipeTo.on("error", onerror); + pipeTo.on("close", onclose); + pipeTo.on("finish", this.pipeline.finished.bind(this.pipeline)); + } + pipeTo.on("drain", afterDrain.bind(this)); + this.stream.emit("piping", pipeTo); + pipeTo.emit("pipe", this.stream); + } + push(data) { + const stream = this.stream; + if (data === null) { + this.highWaterMark = 0; + stream._duplexState = (stream._duplexState | READ_ENDING) & READ_NON_PRIMARY_AND_PUSHED; + return false; + } + if (this.map !== null) { + data = this.map(data); + if (data === null) { + stream._duplexState &= READ_PUSHED; + return this.buffered < this.highWaterMark; + } + } + this.buffered += this.byteLength(data); + this.queue.push(data); + stream._duplexState = (stream._duplexState | READ_QUEUED) & READ_PUSHED; + return this.buffered < this.highWaterMark; + } + shift() { + const data = this.queue.shift(); + this.buffered -= this.byteLength(data); + if (this.buffered === 0) + this.stream._duplexState &= READ_NOT_QUEUED; + return data; + } + unshift(data) { + const pending = [this.map !== null ? this.map(data) : data]; + while (this.buffered > 0) + pending.push(this.shift()); + for (let i = 0;i < pending.length - 1; i++) { + const data2 = pending[i]; + this.buffered += this.byteLength(data2); + this.queue.push(data2); + } + this.push(pending[pending.length - 1]); + } + read() { + const stream = this.stream; + if ((stream._duplexState & READ_STATUS) === READ_QUEUED) { + const data = this.shift(); + if (this.pipeTo !== null && this.pipeTo.write(data) === false) + stream._duplexState &= READ_PIPE_NOT_DRAINED; + if ((stream._duplexState & READ_EMIT_DATA) !== 0) + stream.emit("data", data); + return data; + } + if (this.readAhead === false) { + stream._duplexState |= READ_READ_AHEAD; + this.updateNextTick(); + } + return null; + } + drain() { + const stream = this.stream; + while ((stream._duplexState & READ_STATUS) === READ_QUEUED && (stream._duplexState & READ_FLOWING) !== 0) { + const data = this.shift(); + if (this.pipeTo !== null && this.pipeTo.write(data) === false) + stream._duplexState &= READ_PIPE_NOT_DRAINED; + if ((stream._duplexState & READ_EMIT_DATA) !== 0) + stream.emit("data", data); + } + } + update() { + const stream = this.stream; + stream._duplexState |= READ_UPDATING; + do { + this.drain(); + while (this.buffered < this.highWaterMark && (stream._duplexState & SHOULD_NOT_READ) === READ_READ_AHEAD) { + stream._duplexState |= READ_ACTIVE_AND_NEEDS_PUSH; + stream._read(this.afterRead); + this.drain(); + } + if ((stream._duplexState & READ_READABLE_STATUS) === READ_EMIT_READABLE_AND_QUEUED) { + stream._duplexState |= READ_EMITTED_READABLE; + stream.emit("readable"); + } + if ((stream._duplexState & READ_PRIMARY_AND_ACTIVE) === 0) + this.updateNonPrimary(); + } while (this.continueUpdate() === true); + stream._duplexState &= READ_NOT_UPDATING; + } + updateNonPrimary() { + const stream = this.stream; + if ((stream._duplexState & READ_ENDING_STATUS) === READ_ENDING) { + stream._duplexState = (stream._duplexState | READ_DONE) & READ_NOT_ENDING; + stream.emit("end"); + if ((stream._duplexState & AUTO_DESTROY) === DONE) + stream._duplexState |= DESTROYING; + if (this.pipeTo !== null) + this.pipeTo.end(); + } + if ((stream._duplexState & DESTROY_STATUS) === DESTROYING) { + if ((stream._duplexState & ACTIVE_OR_TICKING) === 0) { + stream._duplexState |= ACTIVE; + stream._destroy(afterDestroy.bind(this)); + } + return; + } + if ((stream._duplexState & IS_OPENING) === OPENING) { + stream._duplexState = (stream._duplexState | ACTIVE) & NOT_OPENING; + stream._open(afterOpen.bind(this)); + } + } + continueUpdate() { + if ((this.stream._duplexState & READ_NEXT_TICK) === 0) + return false; + this.stream._duplexState &= READ_NOT_NEXT_TICK; + return true; + } + updateCallback() { + if ((this.stream._duplexState & READ_UPDATE_SYNC_STATUS) === READ_PRIMARY) + this.update(); + else + this.updateNextTick(); + } + updateNextTick() { + if ((this.stream._duplexState & READ_NEXT_TICK) !== 0) + return; + this.stream._duplexState |= READ_NEXT_TICK; + if ((this.stream._duplexState & READ_UPDATING) === 0) + queueTick(this.afterUpdateNextTick); + } + } + + class TransformState { + constructor(stream) { + this.data = null; + this.afterTransform = afterTransform.bind(stream); + this.afterFinal = null; + } + } + + class Pipeline { + constructor(src, dst, cb) { + this.from = src; + this.to = dst; + this.afterPipe = cb; + this.error = null; + this.pipeToFinished = false; + } + finished() { + this.pipeToFinished = true; + } + done(stream, err) { + if (err) + this.error = err; + if (stream === this.to) { + this.to = null; + if (this.from !== null) { + if ((this.from._duplexState & READ_DONE) === 0 || !this.pipeToFinished) { + this.from.destroy(this.error || new Error("Writable stream closed prematurely")); + } + return; + } + } + if (stream === this.from) { + this.from = null; + if (this.to !== null) { + if ((stream._duplexState & READ_DONE) === 0) { + this.to.destroy(this.error || new Error("Readable stream closed before ending")); + } + return; + } + } + if (this.afterPipe !== null) + this.afterPipe(this.error); + this.to = this.from = this.afterPipe = null; + } + } + function afterDrain() { + this.stream._duplexState |= READ_PIPE_DRAINED; + this.updateCallback(); + } + function afterFinal(err) { + const stream = this.stream; + if (err) + stream.destroy(err); + if ((stream._duplexState & DESTROY_STATUS) === 0) { + stream._duplexState |= WRITE_DONE; + stream.emit("finish"); + } + if ((stream._duplexState & AUTO_DESTROY) === DONE) { + stream._duplexState |= DESTROYING; + } + stream._duplexState &= WRITE_NOT_ACTIVE; + if ((stream._duplexState & WRITE_UPDATING) === 0) + this.update(); + else + this.updateNextTick(); + } + function afterDestroy(err) { + const stream = this.stream; + if (!err && this.error !== STREAM_DESTROYED) + err = this.error; + if (err) + stream.emit("error", err); + stream._duplexState |= DESTROYED; + stream.emit("close"); + const rs = stream._readableState; + const ws = stream._writableState; + if (rs !== null && rs.pipeline !== null) + rs.pipeline.done(stream, err); + if (ws !== null) { + while (ws.drains !== null && ws.drains.length > 0) + ws.drains.shift().resolve(false); + if (ws.pipeline !== null) + ws.pipeline.done(stream, err); + } + } + function afterWrite(err) { + const stream = this.stream; + if (err) + stream.destroy(err); + stream._duplexState &= WRITE_NOT_ACTIVE; + if (this.drains !== null) + tickDrains(this.drains); + if ((stream._duplexState & WRITE_DRAIN_STATUS) === WRITE_UNDRAINED) { + stream._duplexState &= WRITE_DRAINED; + if ((stream._duplexState & WRITE_EMIT_DRAIN) === WRITE_EMIT_DRAIN) { + stream.emit("drain"); + } + } + this.updateCallback(); + } + function afterRead(err) { + if (err) + this.stream.destroy(err); + this.stream._duplexState &= READ_NOT_ACTIVE; + if (this.readAhead === false && (this.stream._duplexState & READ_RESUMED) === 0) + this.stream._duplexState &= READ_NO_READ_AHEAD; + this.updateCallback(); + } + function updateReadNT() { + if ((this.stream._duplexState & READ_UPDATING) === 0) { + this.stream._duplexState &= READ_NOT_NEXT_TICK; + this.update(); + } + } + function updateWriteNT() { + if ((this.stream._duplexState & WRITE_UPDATING) === 0) { + this.stream._duplexState &= WRITE_NOT_NEXT_TICK; + this.update(); + } + } + function tickDrains(drains) { + for (let i = 0;i < drains.length; i++) { + if (--drains[i].writes === 0) { + drains.shift().resolve(true); + i--; + } + } + } + function afterOpen(err) { + const stream = this.stream; + if (err) + stream.destroy(err); + if ((stream._duplexState & DESTROYING) === 0) { + if ((stream._duplexState & READ_PRIMARY_STATUS) === 0) + stream._duplexState |= READ_PRIMARY; + if ((stream._duplexState & WRITE_PRIMARY_STATUS) === 0) + stream._duplexState |= WRITE_PRIMARY; + stream.emit("open"); + } + stream._duplexState &= NOT_ACTIVE; + if (stream._writableState !== null) { + stream._writableState.updateCallback(); + } + if (stream._readableState !== null) { + stream._readableState.updateCallback(); + } + } + function afterTransform(err, data) { + if (data !== undefined && data !== null) + this.push(data); + this._writableState.afterWrite(err); + } + function newListener(name) { + if (this._readableState !== null) { + if (name === "data") { + this._duplexState |= READ_EMIT_DATA | READ_RESUMED_READ_AHEAD; + this._readableState.updateNextTick(); + } + if (name === "readable") { + this._duplexState |= READ_EMIT_READABLE; + this._readableState.updateNextTick(); + } + } + if (this._writableState !== null) { + if (name === "drain") { + this._duplexState |= WRITE_EMIT_DRAIN; + this._writableState.updateNextTick(); + } + } + } + + class Stream extends EventEmitter { + constructor(opts) { + super(); + this._duplexState = 0; + this._readableState = null; + this._writableState = null; + if (opts) { + if (opts.open) + this._open = opts.open; + if (opts.destroy) + this._destroy = opts.destroy; + if (opts.predestroy) + this._predestroy = opts.predestroy; + if (opts.signal) { + opts.signal.addEventListener("abort", abort.bind(this)); + } + } + this.on("newListener", newListener); + } + _open(cb) { + cb(null); + } + _destroy(cb) { + cb(null); + } + _predestroy() { + } + get readable() { + return this._readableState !== null ? true : undefined; + } + get writable() { + return this._writableState !== null ? true : undefined; + } + get destroyed() { + return (this._duplexState & DESTROYED) !== 0; + } + get destroying() { + return (this._duplexState & DESTROY_STATUS) !== 0; + } + destroy(err) { + if ((this._duplexState & DESTROY_STATUS) === 0) { + if (!err) + err = STREAM_DESTROYED; + this._duplexState = (this._duplexState | DESTROYING) & NON_PRIMARY; + if (this._readableState !== null) { + this._readableState.highWaterMark = 0; + this._readableState.error = err; + } + if (this._writableState !== null) { + this._writableState.highWaterMark = 0; + this._writableState.error = err; + } + this._duplexState |= PREDESTROYING; + this._predestroy(); + this._duplexState &= NOT_PREDESTROYING; + if (this._readableState !== null) + this._readableState.updateNextTick(); + if (this._writableState !== null) + this._writableState.updateNextTick(); + } + } + } + + class Readable extends Stream { + constructor(opts) { + super(opts); + this._duplexState |= OPENING | WRITE_DONE | READ_READ_AHEAD; + this._readableState = new ReadableState(this, opts); + if (opts) { + if (this._readableState.readAhead === false) + this._duplexState &= READ_NO_READ_AHEAD; + if (opts.read) + this._read = opts.read; + if (opts.eagerOpen) + this._readableState.updateNextTick(); + if (opts.encoding) + this.setEncoding(opts.encoding); + } + } + setEncoding(encoding) { + const dec = new TextDecoder2(encoding); + const map = this._readableState.map || echo; + this._readableState.map = mapOrSkip; + return this; + function mapOrSkip(data) { + const next = dec.push(data); + return next === "" && (data.byteLength !== 0 || dec.remaining > 0) ? null : map(next); + } + } + _read(cb) { + cb(null); + } + pipe(dest, cb) { + this._readableState.updateNextTick(); + this._readableState.pipe(dest, cb); + return dest; + } + read() { + this._readableState.updateNextTick(); + return this._readableState.read(); + } + push(data) { + this._readableState.updateNextTick(); + return this._readableState.push(data); + } + unshift(data) { + this._readableState.updateNextTick(); + return this._readableState.unshift(data); + } + resume() { + this._duplexState |= READ_RESUMED_READ_AHEAD; + this._readableState.updateNextTick(); + return this; + } + pause() { + this._duplexState &= this._readableState.readAhead === false ? READ_PAUSED_NO_READ_AHEAD : READ_PAUSED; + return this; + } + static _fromAsyncIterator(ite, opts) { + let destroy; + const rs = new Readable({ + ...opts, + read(cb) { + ite.next().then(push).then(cb.bind(null, null)).catch(cb); + }, + predestroy() { + destroy = ite.return(); + }, + destroy(cb) { + if (!destroy) + return cb(null); + destroy.then(cb.bind(null, null)).catch(cb); + } + }); + return rs; + function push(data) { + if (data.done) + rs.push(null); + else + rs.push(data.value); + } + } + static from(data, opts) { + if (isReadStreamx(data)) + return data; + if (data[asyncIterator]) + return this._fromAsyncIterator(data[asyncIterator](), opts); + if (!Array.isArray(data)) + data = data === undefined ? [] : [data]; + let i = 0; + return new Readable({ + ...opts, + read(cb) { + this.push(i === data.length ? null : data[i++]); + cb(null); + } + }); + } + static isBackpressured(rs) { + return (rs._duplexState & READ_BACKPRESSURE_STATUS) !== 0 || rs._readableState.buffered >= rs._readableState.highWaterMark; + } + static isPaused(rs) { + return (rs._duplexState & READ_RESUMED) === 0; + } + [asyncIterator]() { + const stream = this; + let error = null; + let promiseResolve = null; + let promiseReject = null; + this.on("error", (err) => { + error = err; + }); + this.on("readable", onreadable); + this.on("close", onclose); + return { + [asyncIterator]() { + return this; + }, + next() { + return new Promise(function(resolve, reject) { + promiseResolve = resolve; + promiseReject = reject; + const data = stream.read(); + if (data !== null) + ondata(data); + else if ((stream._duplexState & DESTROYED) !== 0) + ondata(null); + }); + }, + return() { + return destroy(null); + }, + throw(err) { + return destroy(err); + } + }; + function onreadable() { + if (promiseResolve !== null) + ondata(stream.read()); + } + function onclose() { + if (promiseResolve !== null) + ondata(null); + } + function ondata(data) { + if (promiseReject === null) + return; + if (error) + promiseReject(error); + else if (data === null && (stream._duplexState & READ_DONE) === 0) + promiseReject(STREAM_DESTROYED); + else + promiseResolve({ value: data, done: data === null }); + promiseReject = promiseResolve = null; + } + function destroy(err) { + stream.destroy(err); + return new Promise((resolve, reject) => { + if (stream._duplexState & DESTROYED) + return resolve({ value: undefined, done: true }); + stream.once("close", function() { + if (err) + reject(err); + else + resolve({ value: undefined, done: true }); + }); + }); + } + } + } + + class Writable extends Stream { + constructor(opts) { + super(opts); + this._duplexState |= OPENING | READ_DONE; + this._writableState = new WritableState(this, opts); + if (opts) { + if (opts.writev) + this._writev = opts.writev; + if (opts.write) + this._write = opts.write; + if (opts.final) + this._final = opts.final; + if (opts.eagerOpen) + this._writableState.updateNextTick(); + } + } + cork() { + this._duplexState |= WRITE_CORKED; + } + uncork() { + this._duplexState &= WRITE_NOT_CORKED; + this._writableState.updateNextTick(); + } + _writev(batch, cb) { + cb(null); + } + _write(data, cb) { + this._writableState.autoBatch(data, cb); + } + _final(cb) { + cb(null); + } + static isBackpressured(ws) { + return (ws._duplexState & WRITE_BACKPRESSURE_STATUS) !== 0; + } + static drained(ws) { + if (ws.destroyed) + return Promise.resolve(false); + const state = ws._writableState; + const pending = isWritev(ws) ? Math.min(1, state.queue.length) : state.queue.length; + const writes = pending + (ws._duplexState & WRITE_WRITING ? 1 : 0); + if (writes === 0) + return Promise.resolve(true); + if (state.drains === null) + state.drains = []; + return new Promise((resolve) => { + state.drains.push({ writes, resolve }); + }); + } + write(data) { + this._writableState.updateNextTick(); + return this._writableState.push(data); + } + end(data) { + this._writableState.updateNextTick(); + this._writableState.end(data); + return this; + } + } + + class Duplex extends Readable { + constructor(opts) { + super(opts); + this._duplexState = OPENING | this._duplexState & READ_READ_AHEAD; + this._writableState = new WritableState(this, opts); + if (opts) { + if (opts.writev) + this._writev = opts.writev; + if (opts.write) + this._write = opts.write; + if (opts.final) + this._final = opts.final; + } + } + cork() { + this._duplexState |= WRITE_CORKED; + } + uncork() { + this._duplexState &= WRITE_NOT_CORKED; + this._writableState.updateNextTick(); + } + _writev(batch, cb) { + cb(null); + } + _write(data, cb) { + this._writableState.autoBatch(data, cb); + } + _final(cb) { + cb(null); + } + write(data) { + this._writableState.updateNextTick(); + return this._writableState.push(data); + } + end(data) { + this._writableState.updateNextTick(); + this._writableState.end(data); + return this; + } + } + + class Transform extends Duplex { + constructor(opts) { + super(opts); + this._transformState = new TransformState(this); + if (opts) { + if (opts.transform) + this._transform = opts.transform; + if (opts.flush) + this._flush = opts.flush; + } + } + _write(data, cb) { + if (this._readableState.buffered >= this._readableState.highWaterMark) { + this._transformState.data = data; + } else { + this._transform(data, this._transformState.afterTransform); + } + } + _read(cb) { + if (this._transformState.data !== null) { + const data = this._transformState.data; + this._transformState.data = null; + cb(null); + this._transform(data, this._transformState.afterTransform); + } else { + cb(null); + } + } + destroy(err) { + super.destroy(err); + if (this._transformState.data !== null) { + this._transformState.data = null; + this._transformState.afterTransform(); + } + } + _transform(data, cb) { + cb(null, data); + } + _flush(cb) { + cb(null); + } + _final(cb) { + this._transformState.afterFinal = cb; + this._flush(transformAfterFlush.bind(this)); + } + } + + class PassThrough extends Transform { + } + function transformAfterFlush(err, data) { + const cb = this._transformState.afterFinal; + if (err) + return cb(err); + if (data !== null && data !== undefined) + this.push(data); + this.push(null); + cb(null); + } + function pipelinePromise(...streams) { + return new Promise((resolve, reject) => { + return pipeline(...streams, (err) => { + if (err) + return reject(err); + resolve(); + }); + }); + } + function pipeline(stream, ...streams) { + const all = Array.isArray(stream) ? [...stream, ...streams] : [stream, ...streams]; + const done = all.length && typeof all[all.length - 1] === "function" ? all.pop() : null; + if (all.length < 2) + throw new Error("Pipeline requires at least 2 streams"); + let src = all[0]; + let dest = null; + let error = null; + for (let i = 1;i < all.length; i++) { + dest = all[i]; + if (isStreamx(src)) { + src.pipe(dest, onerror); + } else { + errorHandle(src, true, i > 1, onerror); + src.pipe(dest); + } + src = dest; + } + if (done) { + let fin = false; + const autoDestroy = isStreamx(dest) || !!(dest._writableState && dest._writableState.autoDestroy); + dest.on("error", (err) => { + if (error === null) + error = err; + }); + dest.on("finish", () => { + fin = true; + if (!autoDestroy) + done(error); + }); + if (autoDestroy) { + dest.on("close", () => done(error || (fin ? null : PREMATURE_CLOSE))); + } + } + return dest; + function errorHandle(s, rd, wr, onerror2) { + s.on("error", onerror2); + s.on("close", onclose); + function onclose() { + if (rd && s._readableState && !s._readableState.ended) + return onerror2(PREMATURE_CLOSE); + if (wr && s._writableState && !s._writableState.ended) + return onerror2(PREMATURE_CLOSE); + } + } + function onerror(err) { + if (!err || error) + return; + error = err; + for (const s of all) { + s.destroy(err); + } + } + } + function echo(s) { + return s; + } + function isStream(stream) { + return !!stream._readableState || !!stream._writableState; + } + function isStreamx(stream) { + return typeof stream._duplexState === "number" && isStream(stream); + } + function isEnded(stream) { + return !!stream._readableState && stream._readableState.ended; + } + function isFinished(stream) { + return !!stream._writableState && stream._writableState.ended; + } + function getStreamError(stream, opts = {}) { + const err = stream._readableState && stream._readableState.error || stream._writableState && stream._writableState.error; + return !opts.all && err === STREAM_DESTROYED ? null : err; + } + function isReadStreamx(stream) { + return isStreamx(stream) && stream.readable; + } + function isTypedArray(data) { + return typeof data === "object" && data !== null && typeof data.byteLength === "number"; + } + function defaultByteLength(data) { + return isTypedArray(data) ? data.byteLength : 1024; + } + function noop() { + } + function abort() { + this.destroy(new Error("Stream aborted.")); + } + function isWritev(s) { + return s._writev !== Writable.prototype._writev && s._writev !== Duplex.prototype._writev; + } + module2.exports = { + pipeline, + pipelinePromise, + isStream, + isStreamx, + isEnded, + isFinished, + getStreamError, + Stream, + Writable, + Readable, + Duplex, + Transform, + PassThrough + }; +}); + +// node_modules/b4a/index.js +var require_b4a = __commonJS((exports2, module2) => { + function isBuffer(value) { + return Buffer.isBuffer(value) || value instanceof Uint8Array; + } + function isEncoding(encoding) { + return Buffer.isEncoding(encoding); + } + function alloc(size, fill2, encoding) { + return Buffer.alloc(size, fill2, encoding); + } + function allocUnsafe(size) { + return Buffer.allocUnsafe(size); + } + function allocUnsafeSlow(size) { + return Buffer.allocUnsafeSlow(size); + } + function byteLength(string, encoding) { + return Buffer.byteLength(string, encoding); + } + function compare(a, b) { + return Buffer.compare(a, b); + } + function concat(buffers, totalLength) { + return Buffer.concat(buffers, totalLength); + } + function copy(source, target, targetStart, start, end) { + return toBuffer(source).copy(target, targetStart, start, end); + } + function equals(a, b) { + return toBuffer(a).equals(b); + } + function fill(buffer, value, offset, end, encoding) { + return toBuffer(buffer).fill(value, offset, end, encoding); + } + function from(value, encodingOrOffset, length) { + return Buffer.from(value, encodingOrOffset, length); + } + function includes(buffer, value, byteOffset, encoding) { + return toBuffer(buffer).includes(value, byteOffset, encoding); + } + function indexOf(buffer, value, byfeOffset, encoding) { + return toBuffer(buffer).indexOf(value, byfeOffset, encoding); + } + function lastIndexOf(buffer, value, byteOffset, encoding) { + return toBuffer(buffer).lastIndexOf(value, byteOffset, encoding); + } + function swap16(buffer) { + return toBuffer(buffer).swap16(); + } + function swap32(buffer) { + return toBuffer(buffer).swap32(); + } + function swap64(buffer) { + return toBuffer(buffer).swap64(); + } + function toBuffer(buffer) { + if (Buffer.isBuffer(buffer)) + return buffer; + return Buffer.from(buffer.buffer, buffer.byteOffset, buffer.byteLength); + } + function toString(buffer, encoding, start, end) { + return toBuffer(buffer).toString(encoding, start, end); + } + function write(buffer, string, offset, length, encoding) { + return toBuffer(buffer).write(string, offset, length, encoding); + } + function writeDoubleLE(buffer, value, offset) { + return toBuffer(buffer).writeDoubleLE(value, offset); + } + function writeFloatLE(buffer, value, offset) { + return toBuffer(buffer).writeFloatLE(value, offset); + } + function writeUInt32LE(buffer, value, offset) { + return toBuffer(buffer).writeUInt32LE(value, offset); + } + function writeInt32LE(buffer, value, offset) { + return toBuffer(buffer).writeInt32LE(value, offset); + } + function readDoubleLE(buffer, offset) { + return toBuffer(buffer).readDoubleLE(offset); + } + function readFloatLE(buffer, offset) { + return toBuffer(buffer).readFloatLE(offset); + } + function readUInt32LE(buffer, offset) { + return toBuffer(buffer).readUInt32LE(offset); + } + function readInt32LE(buffer, offset) { + return toBuffer(buffer).readInt32LE(offset); + } + function writeDoubleBE(buffer, value, offset) { + return toBuffer(buffer).writeDoubleBE(value, offset); + } + function writeFloatBE(buffer, value, offset) { + return toBuffer(buffer).writeFloatBE(value, offset); + } + function writeUInt32BE(buffer, value, offset) { + return toBuffer(buffer).writeUInt32BE(value, offset); + } + function writeInt32BE(buffer, value, offset) { + return toBuffer(buffer).writeInt32BE(value, offset); + } + function readDoubleBE(buffer, offset) { + return toBuffer(buffer).readDoubleBE(offset); + } + function readFloatBE(buffer, offset) { + return toBuffer(buffer).readFloatBE(offset); + } + function readUInt32BE(buffer, offset) { + return toBuffer(buffer).readUInt32BE(offset); + } + function readInt32BE(buffer, offset) { + return toBuffer(buffer).readInt32BE(offset); + } + module2.exports = { + isBuffer, + isEncoding, + alloc, + allocUnsafe, + allocUnsafeSlow, + byteLength, + compare, + concat, + copy, + equals, + fill, + from, + includes, + indexOf, + lastIndexOf, + swap16, + swap32, + swap64, + toBuffer, + toString, + write, + writeDoubleLE, + writeFloatLE, + writeUInt32LE, + writeInt32LE, + readDoubleLE, + readFloatLE, + readUInt32LE, + readInt32LE, + writeDoubleBE, + writeFloatBE, + writeUInt32BE, + writeInt32BE, + readDoubleBE, + readFloatBE, + readUInt32BE, + readInt32BE + }; +}); + +// node_modules/tar-stream/headers.js +var require_headers2 = __commonJS((exports2) => { + var b4a = require_b4a(); + var ZEROS = "0000000000000000000"; + var SEVENS = "7777777777777777777"; + var ZERO_OFFSET = "0".charCodeAt(0); + var USTAR_MAGIC = b4a.from([117, 115, 116, 97, 114, 0]); + var USTAR_VER = b4a.from([ZERO_OFFSET, ZERO_OFFSET]); + var GNU_MAGIC = b4a.from([117, 115, 116, 97, 114, 32]); + var GNU_VER = b4a.from([32, 0]); + var MASK = 4095; + var MAGIC_OFFSET = 257; + var VERSION_OFFSET = 263; + exports2.decodeLongPath = function decodeLongPath(buf, encoding) { + return decodeStr(buf, 0, buf.length, encoding); + }; + exports2.encodePax = function encodePax(opts) { + let result = ""; + if (opts.name) + result += addLength(" path=" + opts.name + "\n"); + if (opts.linkname) + result += addLength(" linkpath=" + opts.linkname + "\n"); + const pax = opts.pax; + if (pax) { + for (const key in pax) { + result += addLength(" " + key + "=" + pax[key] + "\n"); + } + } + return b4a.from(result); + }; + exports2.decodePax = function decodePax(buf) { + const result = {}; + while (buf.length) { + let i = 0; + while (i < buf.length && buf[i] !== 32) + i++; + const len = parseInt(b4a.toString(buf.subarray(0, i)), 10); + if (!len) + return result; + const b = b4a.toString(buf.subarray(i + 1, len - 1)); + const keyIndex = b.indexOf("="); + if (keyIndex === -1) + return result; + result[b.slice(0, keyIndex)] = b.slice(keyIndex + 1); + buf = buf.subarray(len); + } + return result; + }; + exports2.encode = function encode(opts) { + const buf = b4a.alloc(512); + let name = opts.name; + let prefix = ""; + if (opts.typeflag === 5 && name[name.length - 1] !== "/") + name += "/"; + if (b4a.byteLength(name) !== name.length) + return null; + while (b4a.byteLength(name) > 100) { + const i = name.indexOf("/"); + if (i === -1) + return null; + prefix += prefix ? "/" + name.slice(0, i) : name.slice(0, i); + name = name.slice(i + 1); + } + if (b4a.byteLength(name) > 100 || b4a.byteLength(prefix) > 155) + return null; + if (opts.linkname && b4a.byteLength(opts.linkname) > 100) + return null; + b4a.write(buf, name); + b4a.write(buf, encodeOct(opts.mode & MASK, 6), 100); + b4a.write(buf, encodeOct(opts.uid, 6), 108); + b4a.write(buf, encodeOct(opts.gid, 6), 116); + encodeSize(opts.size, buf, 124); + b4a.write(buf, encodeOct(opts.mtime.getTime() / 1000 | 0, 11), 136); + buf[156] = ZERO_OFFSET + toTypeflag(opts.type); + if (opts.linkname) + b4a.write(buf, opts.linkname, 157); + b4a.copy(USTAR_MAGIC, buf, MAGIC_OFFSET); + b4a.copy(USTAR_VER, buf, VERSION_OFFSET); + if (opts.uname) + b4a.write(buf, opts.uname, 265); + if (opts.gname) + b4a.write(buf, opts.gname, 297); + b4a.write(buf, encodeOct(opts.devmajor || 0, 6), 329); + b4a.write(buf, encodeOct(opts.devminor || 0, 6), 337); + if (prefix) + b4a.write(buf, prefix, 345); + b4a.write(buf, encodeOct(cksum(buf), 6), 148); + return buf; + }; + exports2.decode = function decode(buf, filenameEncoding, allowUnknownFormat) { + let typeflag = buf[156] === 0 ? 0 : buf[156] - ZERO_OFFSET; + let name = decodeStr(buf, 0, 100, filenameEncoding); + const mode = decodeOct(buf, 100, 8); + const uid = decodeOct(buf, 108, 8); + const gid = decodeOct(buf, 116, 8); + const size = decodeOct(buf, 124, 12); + const mtime = decodeOct(buf, 136, 12); + const type = toType(typeflag); + const linkname = buf[157] === 0 ? null : decodeStr(buf, 157, 100, filenameEncoding); + const uname = decodeStr(buf, 265, 32); + const gname = decodeStr(buf, 297, 32); + const devmajor = decodeOct(buf, 329, 8); + const devminor = decodeOct(buf, 337, 8); + const c = cksum(buf); + if (c === 8 * 32) + return null; + if (c !== decodeOct(buf, 148, 8)) + throw new Error("Invalid tar header. Maybe the tar is corrupted or it needs to be gunzipped?"); + if (isUSTAR(buf)) { + if (buf[345]) + name = decodeStr(buf, 345, 155, filenameEncoding) + "/" + name; + } else if (isGNU(buf)) { + } else { + if (!allowUnknownFormat) { + throw new Error("Invalid tar header: unknown format."); + } + } + if (typeflag === 0 && name && name[name.length - 1] === "/") + typeflag = 5; + return { + name, + mode, + uid, + gid, + size, + mtime: new Date(1000 * mtime), + type, + linkname, + uname, + gname, + devmajor, + devminor, + pax: null + }; + }; + function isUSTAR(buf) { + return b4a.equals(USTAR_MAGIC, buf.subarray(MAGIC_OFFSET, MAGIC_OFFSET + 6)); + } + function isGNU(buf) { + return b4a.equals(GNU_MAGIC, buf.subarray(MAGIC_OFFSET, MAGIC_OFFSET + 6)) && b4a.equals(GNU_VER, buf.subarray(VERSION_OFFSET, VERSION_OFFSET + 2)); + } + function clamp(index, len, defaultValue) { + if (typeof index !== "number") + return defaultValue; + index = ~~index; + if (index >= len) + return len; + if (index >= 0) + return index; + index += len; + if (index >= 0) + return index; + return 0; + } + function toType(flag) { + switch (flag) { + case 0: + return "file"; + case 1: + return "link"; + case 2: + return "symlink"; + case 3: + return "character-device"; + case 4: + return "block-device"; + case 5: + return "directory"; + case 6: + return "fifo"; + case 7: + return "contiguous-file"; + case 72: + return "pax-header"; + case 55: + return "pax-global-header"; + case 27: + return "gnu-long-link-path"; + case 28: + case 30: + return "gnu-long-path"; + } + return null; + } + function toTypeflag(flag) { + switch (flag) { + case "file": + return 0; + case "link": + return 1; + case "symlink": + return 2; + case "character-device": + return 3; + case "block-device": + return 4; + case "directory": + return 5; + case "fifo": + return 6; + case "contiguous-file": + return 7; + case "pax-header": + return 72; + } + return 0; + } + function indexOf(block, num, offset, end) { + for (;offset < end; offset++) { + if (block[offset] === num) + return offset; + } + return end; + } + function cksum(block) { + let sum = 8 * 32; + for (let i = 0;i < 148; i++) + sum += block[i]; + for (let j = 156;j < 512; j++) + sum += block[j]; + return sum; + } + function encodeOct(val2, n) { + val2 = val2.toString(8); + if (val2.length > n) + return SEVENS.slice(0, n) + " "; + return ZEROS.slice(0, n - val2.length) + val2 + " "; + } + function encodeSizeBin(num, buf, off) { + buf[off] = 128; + for (let i = 11;i > 0; i--) { + buf[off + i] = num & 255; + num = Math.floor(num / 256); + } + } + function encodeSize(num, buf, off) { + if (num.toString(8).length > 11) { + encodeSizeBin(num, buf, off); + } else { + b4a.write(buf, encodeOct(num, 11), off); + } + } + function parse256(buf) { + let positive; + if (buf[0] === 128) + positive = true; + else if (buf[0] === 255) + positive = false; + else + return null; + const tuple = []; + let i; + for (i = buf.length - 1;i > 0; i--) { + const byte = buf[i]; + if (positive) + tuple.push(byte); + else + tuple.push(255 - byte); + } + let sum = 0; + const l = tuple.length; + for (i = 0;i < l; i++) { + sum += tuple[i] * Math.pow(256, i); + } + return positive ? sum : -1 * sum; + } + function decodeOct(val2, offset, length) { + val2 = val2.subarray(offset, offset + length); + offset = 0; + if (val2[offset] & 128) { + return parse256(val2); + } else { + while (offset < val2.length && val2[offset] === 32) + offset++; + const end = clamp(indexOf(val2, 32, offset, val2.length), val2.length, val2.length); + while (offset < end && val2[offset] === 0) + offset++; + if (end === offset) + return 0; + return parseInt(b4a.toString(val2.subarray(offset, end)), 8); + } + } + function decodeStr(val2, offset, length, encoding) { + return b4a.toString(val2.subarray(offset, indexOf(val2, 0, offset, offset + length)), encoding); + } + function addLength(str) { + const len = b4a.byteLength(str); + let digits = Math.floor(Math.log(len) / Math.log(10)) + 1; + if (len + digits >= Math.pow(10, digits)) + digits++; + return len + digits + str; + } +}); + +// node_modules/tar-stream/extract.js +var require_extract = __commonJS((exports2, module2) => { + var { Writable, Readable, getStreamError } = require_streamx(); + var FIFO = require_fast_fifo(); + var b4a = require_b4a(); + var headers = require_headers2(); + var EMPTY = b4a.alloc(0); + + class BufferList { + constructor() { + this.buffered = 0; + this.shifted = 0; + this.queue = new FIFO; + this._offset = 0; + } + push(buffer) { + this.buffered += buffer.byteLength; + this.queue.push(buffer); + } + shiftFirst(size) { + return this._buffered === 0 ? null : this._next(size); + } + shift(size) { + if (size > this.buffered) + return null; + if (size === 0) + return EMPTY; + let chunk = this._next(size); + if (size === chunk.byteLength) + return chunk; + const chunks = [chunk]; + while ((size -= chunk.byteLength) > 0) { + chunk = this._next(size); + chunks.push(chunk); + } + return b4a.concat(chunks); + } + _next(size) { + const buf = this.queue.peek(); + const rem = buf.byteLength - this._offset; + if (size >= rem) { + const sub = this._offset ? buf.subarray(this._offset, buf.byteLength) : buf; + this.queue.shift(); + this._offset = 0; + this.buffered -= rem; + this.shifted += rem; + return sub; + } + this.buffered -= size; + this.shifted += size; + return buf.subarray(this._offset, this._offset += size); + } + } + + class Source extends Readable { + constructor(self2, header, offset) { + super(); + this.header = header; + this.offset = offset; + this._parent = self2; + } + _read(cb) { + if (this.header.size === 0) { + this.push(null); + } + if (this._parent._stream === this) { + this._parent._update(); + } + cb(null); + } + _predestroy() { + this._parent.destroy(getStreamError(this)); + } + _detach() { + if (this._parent._stream === this) { + this._parent._stream = null; + this._parent._missing = overflow(this.header.size); + this._parent._update(); + } + } + _destroy(cb) { + this._detach(); + cb(null); + } + } + + class Extract extends Writable { + constructor(opts) { + super(opts); + if (!opts) + opts = {}; + this._buffer = new BufferList; + this._offset = 0; + this._header = null; + this._stream = null; + this._missing = 0; + this._longHeader = false; + this._callback = noop; + this._locked = false; + this._finished = false; + this._pax = null; + this._paxGlobal = null; + this._gnuLongPath = null; + this._gnuLongLinkPath = null; + this._filenameEncoding = opts.filenameEncoding || "utf-8"; + this._allowUnknownFormat = !!opts.allowUnknownFormat; + this._unlockBound = this._unlock.bind(this); + } + _unlock(err) { + this._locked = false; + if (err) { + this.destroy(err); + this._continueWrite(err); + return; + } + this._update(); + } + _consumeHeader() { + if (this._locked) + return false; + this._offset = this._buffer.shifted; + try { + this._header = headers.decode(this._buffer.shift(512), this._filenameEncoding, this._allowUnknownFormat); + } catch (err) { + this._continueWrite(err); + return false; + } + if (!this._header) + return true; + switch (this._header.type) { + case "gnu-long-path": + case "gnu-long-link-path": + case "pax-global-header": + case "pax-header": + this._longHeader = true; + this._missing = this._header.size; + return true; + } + this._locked = true; + this._applyLongHeaders(); + if (this._header.size === 0 || this._header.type === "directory") { + this.emit("entry", this._header, this._createStream(), this._unlockBound); + return true; + } + this._stream = this._createStream(); + this._missing = this._header.size; + this.emit("entry", this._header, this._stream, this._unlockBound); + return true; + } + _applyLongHeaders() { + if (this._gnuLongPath) { + this._header.name = this._gnuLongPath; + this._gnuLongPath = null; + } + if (this._gnuLongLinkPath) { + this._header.linkname = this._gnuLongLinkPath; + this._gnuLongLinkPath = null; + } + if (this._pax) { + if (this._pax.path) + this._header.name = this._pax.path; + if (this._pax.linkpath) + this._header.linkname = this._pax.linkpath; + if (this._pax.size) + this._header.size = parseInt(this._pax.size, 10); + this._header.pax = this._pax; + this._pax = null; + } + } + _decodeLongHeader(buf) { + switch (this._header.type) { + case "gnu-long-path": + this._gnuLongPath = headers.decodeLongPath(buf, this._filenameEncoding); + break; + case "gnu-long-link-path": + this._gnuLongLinkPath = headers.decodeLongPath(buf, this._filenameEncoding); + break; + case "pax-global-header": + this._paxGlobal = headers.decodePax(buf); + break; + case "pax-header": + this._pax = this._paxGlobal === null ? headers.decodePax(buf) : Object.assign({}, this._paxGlobal, headers.decodePax(buf)); + break; + } + } + _consumeLongHeader() { + this._longHeader = false; + this._missing = overflow(this._header.size); + const buf = this._buffer.shift(this._header.size); + try { + this._decodeLongHeader(buf); + } catch (err) { + this._continueWrite(err); + return false; + } + return true; + } + _consumeStream() { + const buf = this._buffer.shiftFirst(this._missing); + if (buf === null) + return false; + this._missing -= buf.byteLength; + const drained = this._stream.push(buf); + if (this._missing === 0) { + this._stream.push(null); + if (drained) + this._stream._detach(); + return drained && this._locked === false; + } + return drained; + } + _createStream() { + return new Source(this, this._header, this._offset); + } + _update() { + while (this._buffer.buffered > 0 && !this.destroying) { + if (this._missing > 0) { + if (this._stream !== null) { + if (this._consumeStream() === false) + return; + continue; + } + if (this._longHeader === true) { + if (this._missing > this._buffer.buffered) + break; + if (this._consumeLongHeader() === false) + return false; + continue; + } + const ignore = this._buffer.shiftFirst(this._missing); + if (ignore !== null) + this._missing -= ignore.byteLength; + continue; + } + if (this._buffer.buffered < 512) + break; + if (this._stream !== null || this._consumeHeader() === false) + return; + } + this._continueWrite(null); + } + _continueWrite(err) { + const cb = this._callback; + this._callback = noop; + cb(err); + } + _write(data, cb) { + this._callback = cb; + this._buffer.push(data); + this._update(); + } + _final(cb) { + this._finished = this._missing === 0 && this._buffer.buffered === 0; + cb(this._finished ? null : new Error("Unexpected end of data")); + } + _predestroy() { + this._continueWrite(null); + } + _destroy(cb) { + if (this._stream) + this._stream.destroy(getStreamError(this)); + cb(null); + } + [Symbol.asyncIterator]() { + let error = null; + let promiseResolve = null; + let promiseReject = null; + let entryStream = null; + let entryCallback = null; + const extract = this; + this.on("entry", onentry); + this.on("error", (err) => { + error = err; + }); + this.on("close", onclose); + return { + [Symbol.asyncIterator]() { + return this; + }, + next() { + return new Promise(onnext); + }, + return() { + return destroy(null); + }, + throw(err) { + return destroy(err); + } + }; + function consumeCallback(err) { + if (!entryCallback) + return; + const cb = entryCallback; + entryCallback = null; + cb(err); + } + function onnext(resolve, reject) { + if (error) { + return reject(error); + } + if (entryStream) { + resolve({ value: entryStream, done: false }); + entryStream = null; + return; + } + promiseResolve = resolve; + promiseReject = reject; + consumeCallback(null); + if (extract._finished && promiseResolve) { + promiseResolve({ value: undefined, done: true }); + promiseResolve = promiseReject = null; + } + } + function onentry(header, stream, callback) { + entryCallback = callback; + stream.on("error", noop); + if (promiseResolve) { + promiseResolve({ value: stream, done: false }); + promiseResolve = promiseReject = null; + } else { + entryStream = stream; + } + } + function onclose() { + consumeCallback(error); + if (!promiseResolve) + return; + if (error) + promiseReject(error); + else + promiseResolve({ value: undefined, done: true }); + promiseResolve = promiseReject = null; + } + function destroy(err) { + extract.destroy(err); + consumeCallback(err); + return new Promise((resolve, reject) => { + if (extract.destroyed) + return resolve({ value: undefined, done: true }); + extract.once("close", function() { + if (err) + reject(err); + else + resolve({ value: undefined, done: true }); + }); + }); + } + } + } + module2.exports = function extract(opts) { + return new Extract(opts); + }; + function noop() { + } + function overflow(size) { + size &= 511; + return size && 512 - size; + } +}); + +// node_modules/tar-stream/constants.js +var require_constants9 = __commonJS((exports2, module2) => { + var constants = { + S_IFMT: 61440, + S_IFDIR: 16384, + S_IFCHR: 8192, + S_IFBLK: 24576, + S_IFIFO: 4096, + S_IFLNK: 40960 + }; + try { + module2.exports = require("fs").constants || constants; + } catch { + module2.exports = constants; + } +}); + +// node_modules/tar-stream/pack.js +var require_pack = __commonJS((exports2, module2) => { + var { Readable, Writable, getStreamError } = require_streamx(); + var b4a = require_b4a(); + var constants = require_constants9(); + var headers = require_headers2(); + var DMODE = 493; + var FMODE = 420; + var END_OF_TAR = b4a.alloc(1024); + + class Sink extends Writable { + constructor(pack, header, callback) { + super({ mapWritable, eagerOpen: true }); + this.written = 0; + this.header = header; + this._callback = callback; + this._linkname = null; + this._isLinkname = header.type === "symlink" && !header.linkname; + this._isVoid = header.type !== "file" && header.type !== "contiguous-file"; + this._finished = false; + this._pack = pack; + this._openCallback = null; + if (this._pack._stream === null) + this._pack._stream = this; + else + this._pack._pending.push(this); + } + _open(cb) { + this._openCallback = cb; + if (this._pack._stream === this) + this._continueOpen(); + } + _continuePack(err) { + if (this._callback === null) + return; + const callback = this._callback; + this._callback = null; + callback(err); + } + _continueOpen() { + if (this._pack._stream === null) + this._pack._stream = this; + const cb = this._openCallback; + this._openCallback = null; + if (cb === null) + return; + if (this._pack.destroying) + return cb(new Error("pack stream destroyed")); + if (this._pack._finalized) + return cb(new Error("pack stream is already finalized")); + this._pack._stream = this; + if (!this._isLinkname) { + this._pack._encode(this.header); + } + if (this._isVoid) { + this._finish(); + this._continuePack(null); + } + cb(null); + } + _write(data, cb) { + if (this._isLinkname) { + this._linkname = this._linkname ? b4a.concat([this._linkname, data]) : data; + return cb(null); + } + if (this._isVoid) { + if (data.byteLength > 0) { + return cb(new Error("No body allowed for this entry")); + } + return cb(); + } + this.written += data.byteLength; + if (this._pack.push(data)) + return cb(); + this._pack._drain = cb; + } + _finish() { + if (this._finished) + return; + this._finished = true; + if (this._isLinkname) { + this.header.linkname = this._linkname ? b4a.toString(this._linkname, "utf-8") : ""; + this._pack._encode(this.header); + } + overflow(this._pack, this.header.size); + this._pack._done(this); + } + _final(cb) { + if (this.written !== this.header.size) { + return cb(new Error("Size mismatch")); + } + this._finish(); + cb(null); + } + _getError() { + return getStreamError(this) || new Error("tar entry destroyed"); + } + _predestroy() { + this._pack.destroy(this._getError()); + } + _destroy(cb) { + this._pack._done(this); + this._continuePack(this._finished ? null : this._getError()); + cb(); + } + } + + class Pack extends Readable { + constructor(opts) { + super(opts); + this._drain = noop; + this._finalized = false; + this._finalizing = false; + this._pending = []; + this._stream = null; + } + entry(header, buffer, callback) { + if (this._finalized || this.destroying) + throw new Error("already finalized or destroyed"); + if (typeof buffer === "function") { + callback = buffer; + buffer = null; + } + if (!callback) + callback = noop; + if (!header.size || header.type === "symlink") + header.size = 0; + if (!header.type) + header.type = modeToType(header.mode); + if (!header.mode) + header.mode = header.type === "directory" ? DMODE : FMODE; + if (!header.uid) + header.uid = 0; + if (!header.gid) + header.gid = 0; + if (!header.mtime) + header.mtime = new Date; + if (typeof buffer === "string") + buffer = b4a.from(buffer); + const sink = new Sink(this, header, callback); + if (b4a.isBuffer(buffer)) { + header.size = buffer.byteLength; + sink.write(buffer); + sink.end(); + return sink; + } + if (sink._isVoid) { + return sink; + } + return sink; + } + finalize() { + if (this._stream || this._pending.length > 0) { + this._finalizing = true; + return; + } + if (this._finalized) + return; + this._finalized = true; + this.push(END_OF_TAR); + this.push(null); + } + _done(stream) { + if (stream !== this._stream) + return; + this._stream = null; + if (this._finalizing) + this.finalize(); + if (this._pending.length) + this._pending.shift()._continueOpen(); + } + _encode(header) { + if (!header.pax) { + const buf = headers.encode(header); + if (buf) { + this.push(buf); + return; + } + } + this._encodePax(header); + } + _encodePax(header) { + const paxHeader = headers.encodePax({ + name: header.name, + linkname: header.linkname, + pax: header.pax + }); + const newHeader = { + name: "PaxHeader", + mode: header.mode, + uid: header.uid, + gid: header.gid, + size: paxHeader.byteLength, + mtime: header.mtime, + type: "pax-header", + linkname: header.linkname && "PaxHeader", + uname: header.uname, + gname: header.gname, + devmajor: header.devmajor, + devminor: header.devminor + }; + this.push(headers.encode(newHeader)); + this.push(paxHeader); + overflow(this, paxHeader.byteLength); + newHeader.size = header.size; + newHeader.type = header.type; + this.push(headers.encode(newHeader)); + } + _doDrain() { + const drain = this._drain; + this._drain = noop; + drain(); + } + _predestroy() { + const err = getStreamError(this); + if (this._stream) + this._stream.destroy(err); + while (this._pending.length) { + const stream = this._pending.shift(); + stream.destroy(err); + stream._continueOpen(); + } + this._doDrain(); + } + _read(cb) { + this._doDrain(); + cb(); + } + } + module2.exports = function pack(opts) { + return new Pack(opts); + }; + function modeToType(mode) { + switch (mode & constants.S_IFMT) { + case constants.S_IFBLK: + return "block-device"; + case constants.S_IFCHR: + return "character-device"; + case constants.S_IFDIR: + return "directory"; + case constants.S_IFIFO: + return "fifo"; + case constants.S_IFLNK: + return "symlink"; + } + return "file"; + } + function noop() { + } + function overflow(self2, size) { + size &= 511; + if (size) + self2.push(END_OF_TAR.subarray(0, 512 - size)); + } + function mapWritable(buf) { + return b4a.isBuffer(buf) ? buf : b4a.from(buf); + } +}); + +// node_modules/tar-stream/index.js +var require_tar_stream = __commonJS((exports2) => { + exports2.extract = require_extract(); + exports2.pack = require_pack(); +}); + +// node_modules/archiver/lib/plugins/tar.js +var require_tar = __commonJS((exports2, module2) => { + var zlib = require("zlib"); + var engine = require_tar_stream(); + var util = require_archiver_utils(); + var Tar = function(options) { + if (!(this instanceof Tar)) { + return new Tar(options); + } + options = this.options = util.defaults(options, { + gzip: false + }); + if (typeof options.gzipOptions !== "object") { + options.gzipOptions = {}; + } + this.supports = { + directory: true, + symlink: true + }; + this.engine = engine.pack(options); + this.compressor = false; + if (options.gzip) { + this.compressor = zlib.createGzip(options.gzipOptions); + this.compressor.on("error", this._onCompressorError.bind(this)); + } + }; + Tar.prototype._onCompressorError = function(err) { + this.engine.emit("error", err); + }; + Tar.prototype.append = function(source, data, callback) { + var self2 = this; + data.mtime = data.date; + function append(err, sourceBuffer) { + if (err) { + callback(err); + return; + } + self2.engine.entry(data, sourceBuffer, function(err2) { + callback(err2, data); + }); + } + if (data.sourceType === "buffer") { + append(null, source); + } else if (data.sourceType === "stream" && data.stats) { + data.size = data.stats.size; + var entry = self2.engine.entry(data, function(err) { + callback(err, data); + }); + source.pipe(entry); + } else if (data.sourceType === "stream") { + util.collectStream(source, append); + } + }; + Tar.prototype.finalize = function() { + this.engine.finalize(); + }; + Tar.prototype.on = function() { + return this.engine.on.apply(this.engine, arguments); + }; + Tar.prototype.pipe = function(destination, options) { + if (this.compressor) { + return this.engine.pipe.apply(this.engine, [this.compressor]).pipe(destination, options); + } else { + return this.engine.pipe.apply(this.engine, arguments); + } + }; + Tar.prototype.unpipe = function() { + if (this.compressor) { + return this.compressor.unpipe.apply(this.compressor, arguments); + } else { + return this.engine.unpipe.apply(this.engine, arguments); + } + }; + module2.exports = Tar; +}); + +// node_modules/buffer-crc32/dist/index.cjs +var require_dist5 = __commonJS((exports2, module2) => { + function getDefaultExportFromCjs(x) { + return x && x.__esModule && Object.prototype.hasOwnProperty.call(x, "default") ? x["default"] : x; + } + var CRC_TABLE = new Int32Array([ + 0, + 1996959894, + 3993919788, + 2567524794, + 124634137, + 1886057615, + 3915621685, + 2657392035, + 249268274, + 2044508324, + 3772115230, + 2547177864, + 162941995, + 2125561021, + 3887607047, + 2428444049, + 498536548, + 1789927666, + 4089016648, + 2227061214, + 450548861, + 1843258603, + 4107580753, + 2211677639, + 325883990, + 1684777152, + 4251122042, + 2321926636, + 335633487, + 1661365465, + 4195302755, + 2366115317, + 997073096, + 1281953886, + 3579855332, + 2724688242, + 1006888145, + 1258607687, + 3524101629, + 2768942443, + 901097722, + 1119000684, + 3686517206, + 2898065728, + 853044451, + 1172266101, + 3705015759, + 2882616665, + 651767980, + 1373503546, + 3369554304, + 3218104598, + 565507253, + 1454621731, + 3485111705, + 3099436303, + 671266974, + 1594198024, + 3322730930, + 2970347812, + 795835527, + 1483230225, + 3244367275, + 3060149565, + 1994146192, + 31158534, + 2563907772, + 4023717930, + 1907459465, + 112637215, + 2680153253, + 3904427059, + 2013776290, + 251722036, + 2517215374, + 3775830040, + 2137656763, + 141376813, + 2439277719, + 3865271297, + 1802195444, + 476864866, + 2238001368, + 4066508878, + 1812370925, + 453092731, + 2181625025, + 4111451223, + 1706088902, + 314042704, + 2344532202, + 4240017532, + 1658658271, + 366619977, + 2362670323, + 4224994405, + 1303535960, + 984961486, + 2747007092, + 3569037538, + 1256170817, + 1037604311, + 2765210733, + 3554079995, + 1131014506, + 879679996, + 2909243462, + 3663771856, + 1141124467, + 855842277, + 2852801631, + 3708648649, + 1342533948, + 654459306, + 3188396048, + 3373015174, + 1466479909, + 544179635, + 3110523913, + 3462522015, + 1591671054, + 702138776, + 2966460450, + 3352799412, + 1504918807, + 783551873, + 3082640443, + 3233442989, + 3988292384, + 2596254646, + 62317068, + 1957810842, + 3939845945, + 2647816111, + 81470997, + 1943803523, + 3814918930, + 2489596804, + 225274430, + 2053790376, + 3826175755, + 2466906013, + 167816743, + 2097651377, + 4027552580, + 2265490386, + 503444072, + 1762050814, + 4150417245, + 2154129355, + 426522225, + 1852507879, + 4275313526, + 2312317920, + 282753626, + 1742555852, + 4189708143, + 2394877945, + 397917763, + 1622183637, + 3604390888, + 2714866558, + 953729732, + 1340076626, + 3518719985, + 2797360999, + 1068828381, + 1219638859, + 3624741850, + 2936675148, + 906185462, + 1090812512, + 3747672003, + 2825379669, + 829329135, + 1181335161, + 3412177804, + 3160834842, + 628085408, + 1382605366, + 3423369109, + 3138078467, + 570562233, + 1426400815, + 3317316542, + 2998733608, + 733239954, + 1555261956, + 3268935591, + 3050360625, + 752459403, + 1541320221, + 2607071920, + 3965973030, + 1969922972, + 40735498, + 2617837225, + 3943577151, + 1913087877, + 83908371, + 2512341634, + 3803740692, + 2075208622, + 213261112, + 2463272603, + 3855990285, + 2094854071, + 198958881, + 2262029012, + 4057260610, + 1759359992, + 534414190, + 2176718541, + 4139329115, + 1873836001, + 414664567, + 2282248934, + 4279200368, + 1711684554, + 285281116, + 2405801727, + 4167216745, + 1634467795, + 376229701, + 2685067896, + 3608007406, + 1308918612, + 956543938, + 2808555105, + 3495958263, + 1231636301, + 1047427035, + 2932959818, + 3654703836, + 1088359270, + 936918000, + 2847714899, + 3736837829, + 1202900863, + 817233897, + 3183342108, + 3401237130, + 1404277552, + 615818150, + 3134207493, + 3453421203, + 1423857449, + 601450431, + 3009837614, + 3294710456, + 1567103746, + 711928724, + 3020668471, + 3272380065, + 1510334235, + 755167117 + ]); + function ensureBuffer(input) { + if (Buffer.isBuffer(input)) { + return input; + } + if (typeof input === "number") { + return Buffer.alloc(input); + } else if (typeof input === "string") { + return Buffer.from(input); + } else { + throw new Error("input must be buffer, number, or string, received " + typeof input); + } + } + function bufferizeInt(num) { + const tmp = ensureBuffer(4); + tmp.writeInt32BE(num, 0); + return tmp; + } + function _crc32(buf, previous) { + buf = ensureBuffer(buf); + if (Buffer.isBuffer(previous)) { + previous = previous.readUInt32BE(0); + } + let crc = ~~previous ^ -1; + for (var n = 0;n < buf.length; n++) { + crc = CRC_TABLE[(crc ^ buf[n]) & 255] ^ crc >>> 8; + } + return crc ^ -1; + } + function crc32() { + return bufferizeInt(_crc32.apply(null, arguments)); + } + crc32.signed = function() { + return _crc32.apply(null, arguments); + }; + crc32.unsigned = function() { + return _crc32.apply(null, arguments) >>> 0; + }; + var bufferCrc32 = crc32; + var index = /* @__PURE__ */ getDefaultExportFromCjs(bufferCrc32); + module2.exports = index; +}); + +// node_modules/archiver/lib/plugins/json.js +var require_json = __commonJS((exports2, module2) => { + var inherits = require("util").inherits; + var Transform = require_ours().Transform; + var crc32 = require_dist5(); + var util = require_archiver_utils(); + var Json = function(options) { + if (!(this instanceof Json)) { + return new Json(options); + } + options = this.options = util.defaults(options, {}); + Transform.call(this, options); + this.supports = { + directory: true, + symlink: true + }; + this.files = []; + }; + inherits(Json, Transform); + Json.prototype._transform = function(chunk, encoding, callback) { + callback(null, chunk); + }; + Json.prototype._writeStringified = function() { + var fileString = JSON.stringify(this.files); + this.write(fileString); + }; + Json.prototype.append = function(source, data, callback) { + var self2 = this; + data.crc32 = 0; + function onend(err, sourceBuffer) { + if (err) { + callback(err); + return; + } + data.size = sourceBuffer.length || 0; + data.crc32 = crc32.unsigned(sourceBuffer); + self2.files.push(data); + callback(null, data); + } + if (data.sourceType === "buffer") { + onend(null, source); + } else if (data.sourceType === "stream") { + util.collectStream(source, onend); + } + }; + Json.prototype.finalize = function() { + this._writeStringified(); + this.end(); + }; + module2.exports = Json; +}); + +// node_modules/archiver/index.js +var require_archiver = __commonJS((exports2, module2) => { + var Archiver = require_core2(); + var formats = {}; + var vending = function(format, options) { + return vending.create(format, options); + }; + vending.create = function(format, options) { + if (formats[format]) { + var instance = new Archiver(format, options); + instance.setFormat(format); + instance.setModule(new formats[format](options)); + return instance; + } else { + throw new Error("create(" + format + "): format not registered"); + } + }; + vending.registerFormat = function(format, module3) { + if (formats[format]) { + throw new Error("register(" + format + "): format already registered"); + } + if (typeof module3 !== "function") { + throw new Error("register(" + format + "): format module invalid"); + } + if (typeof module3.prototype.append !== "function" || typeof module3.prototype.finalize !== "function") { + throw new Error("register(" + format + "): format module missing methods"); + } + formats[format] = module3; + }; + vending.isRegisteredFormat = function(format) { + if (formats[format]) { + return true; + } + return false; + }; + vending.registerFormat("zip", require_zip()); + vending.registerFormat("tar", require_tar()); + vending.registerFormat("json", require_json()); + module2.exports = vending; +}); + +// node_modules/@actions/artifact/lib/internal/upload/zip.js +var require_zip2 = __commonJS((exports2) => { + var __createBinding = exports2 && exports2.__createBinding || (Object.create ? function(o, m, k, k2) { + if (k2 === undefined) + k2 = k; + var desc = Object.getOwnPropertyDescriptor(m, k); + if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) { + desc = { enumerable: true, get: function() { + return m[k]; + } }; + } + Object.defineProperty(o, k2, desc); + } : function(o, m, k, k2) { + if (k2 === undefined) + k2 = k; + o[k2] = m[k]; + }); + var __setModuleDefault = exports2 && exports2.__setModuleDefault || (Object.create ? function(o, v) { + Object.defineProperty(o, "default", { enumerable: true, value: v }); + } : function(o, v) { + o["default"] = v; + }); + var __importStar = exports2 && exports2.__importStar || function(mod) { + if (mod && mod.__esModule) + return mod; + var result = {}; + if (mod != null) { + for (var k in mod) + if (k !== "default" && Object.prototype.hasOwnProperty.call(mod, k)) + __createBinding(result, mod, k); + } + __setModuleDefault(result, mod); + return result; + }; + var __awaiter = exports2 && exports2.__awaiter || function(thisArg, _arguments, P, generator) { + function adopt(value) { + return value instanceof P ? value : new P(function(resolve) { + resolve(value); + }); + } + return new (P || (P = Promise))(function(resolve, reject) { + function fulfilled(value) { + try { + step(generator.next(value)); + } catch (e) { + reject(e); + } + } + function rejected(value) { + try { + step(generator["throw"](value)); + } catch (e) { + reject(e); + } + } + function step(result) { + result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); + } + step((generator = generator.apply(thisArg, _arguments || [])).next()); + }); + }; + Object.defineProperty(exports2, "__esModule", { value: true }); + exports2.createZipUploadStream = exports2.ZipUploadStream = exports2.DEFAULT_COMPRESSION_LEVEL = undefined; + var stream = __importStar(require("stream")); + var promises_1 = require("fs/promises"); + var archiver = __importStar(require_archiver()); + var core = __importStar(require_core()); + var config_1 = require_config(); + exports2.DEFAULT_COMPRESSION_LEVEL = 6; + + class ZipUploadStream extends stream.Transform { + constructor(bufferSize) { + super({ + highWaterMark: bufferSize + }); + } + _transform(chunk, enc, cb) { + cb(null, chunk); + } + } + exports2.ZipUploadStream = ZipUploadStream; + function createZipUploadStream(uploadSpecification, compressionLevel = exports2.DEFAULT_COMPRESSION_LEVEL) { + return __awaiter(this, undefined, undefined, function* () { + core.debug(`Creating Artifact archive with compressionLevel: ${compressionLevel}`); + const zip = archiver.create("zip", { + highWaterMark: (0, config_1.getUploadChunkSize)(), + zlib: { level: compressionLevel } + }); + zip.on("error", zipErrorCallback); + zip.on("warning", zipWarningCallback); + zip.on("finish", zipFinishCallback); + zip.on("end", zipEndCallback); + for (const file of uploadSpecification) { + if (file.sourcePath !== null) { + let sourcePath = file.sourcePath; + if (file.stats.isSymbolicLink()) { + sourcePath = yield (0, promises_1.realpath)(file.sourcePath); + } + zip.file(sourcePath, { + name: file.destinationPath + }); + } else { + zip.append("", { name: file.destinationPath }); + } + } + const bufferSize = (0, config_1.getUploadChunkSize)(); + const zipUploadStream = new ZipUploadStream(bufferSize); + core.debug(`Zip write high watermark value ${zipUploadStream.writableHighWaterMark}`); + core.debug(`Zip read high watermark value ${zipUploadStream.readableHighWaterMark}`); + zip.pipe(zipUploadStream); + zip.finalize(); + return zipUploadStream; + }); + } + exports2.createZipUploadStream = createZipUploadStream; + var zipErrorCallback = (error) => { + core.error("An error has occurred while creating the zip file for upload"); + core.info(error); + throw new Error("An error has occurred during zip creation for the artifact"); + }; + var zipWarningCallback = (error) => { + if (error.code === "ENOENT") { + core.warning("ENOENT warning during artifact zip creation. No such file or directory"); + core.info(error); + } else { + core.warning(`A non-blocking warning has occurred during artifact zip creation: ${error.code}`); + core.info(error); + } + }; + var zipFinishCallback = () => { + core.debug("Zip stream for upload has finished."); + }; + var zipEndCallback = () => { + core.debug("Zip stream for upload has ended."); + }; +}); + +// node_modules/@actions/artifact/lib/internal/upload/upload-artifact.js +var require_upload_artifact = __commonJS((exports2) => { + var __createBinding = exports2 && exports2.__createBinding || (Object.create ? function(o, m, k, k2) { + if (k2 === undefined) + k2 = k; + var desc = Object.getOwnPropertyDescriptor(m, k); + if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) { + desc = { enumerable: true, get: function() { + return m[k]; + } }; + } + Object.defineProperty(o, k2, desc); + } : function(o, m, k, k2) { + if (k2 === undefined) + k2 = k; + o[k2] = m[k]; + }); + var __setModuleDefault = exports2 && exports2.__setModuleDefault || (Object.create ? function(o, v) { + Object.defineProperty(o, "default", { enumerable: true, value: v }); + } : function(o, v) { + o["default"] = v; + }); + var __importStar = exports2 && exports2.__importStar || function(mod) { + if (mod && mod.__esModule) + return mod; + var result = {}; + if (mod != null) { + for (var k in mod) + if (k !== "default" && Object.prototype.hasOwnProperty.call(mod, k)) + __createBinding(result, mod, k); + } + __setModuleDefault(result, mod); + return result; + }; + var __awaiter = exports2 && exports2.__awaiter || function(thisArg, _arguments, P, generator) { + function adopt(value) { + return value instanceof P ? value : new P(function(resolve) { + resolve(value); + }); + } + return new (P || (P = Promise))(function(resolve, reject) { + function fulfilled(value) { + try { + step(generator.next(value)); + } catch (e) { + reject(e); + } + } + function rejected(value) { + try { + step(generator["throw"](value)); + } catch (e) { + reject(e); + } + } + function step(result) { + result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); + } + step((generator = generator.apply(thisArg, _arguments || [])).next()); + }); + }; + Object.defineProperty(exports2, "__esModule", { value: true }); + exports2.uploadArtifact = undefined; + var core = __importStar(require_core()); + var retention_1 = require_retention(); + var path_and_artifact_name_validation_1 = require_path_and_artifact_name_validation(); + var artifact_twirp_client_1 = require_artifact_twirp_client(); + var upload_zip_specification_1 = require_upload_zip_specification(); + var util_1 = require_util8(); + var blob_upload_1 = require_blob_upload(); + var zip_1 = require_zip2(); + var generated_1 = require_generated(); + var errors_1 = require_errors3(); + function uploadArtifact(name, files, rootDirectory, options) { + return __awaiter(this, undefined, undefined, function* () { + (0, path_and_artifact_name_validation_1.validateArtifactName)(name); + (0, upload_zip_specification_1.validateRootDirectory)(rootDirectory); + const zipSpecification = (0, upload_zip_specification_1.getUploadZipSpecification)(files, rootDirectory); + if (zipSpecification.length === 0) { + throw new errors_1.FilesNotFoundError(zipSpecification.flatMap((s) => s.sourcePath ? [s.sourcePath] : [])); + } + const backendIds = (0, util_1.getBackendIdsFromToken)(); + const artifactClient = (0, artifact_twirp_client_1.internalArtifactTwirpClient)(); + const createArtifactReq = { + workflowRunBackendId: backendIds.workflowRunBackendId, + workflowJobRunBackendId: backendIds.workflowJobRunBackendId, + name, + version: 4 + }; + const expiresAt = (0, retention_1.getExpiration)(options === null || options === undefined ? undefined : options.retentionDays); + if (expiresAt) { + createArtifactReq.expiresAt = expiresAt; + } + const createArtifactResp = yield artifactClient.CreateArtifact(createArtifactReq); + if (!createArtifactResp.ok) { + throw new errors_1.InvalidResponseError("CreateArtifact: response from backend was not ok"); + } + const zipUploadStream = yield (0, zip_1.createZipUploadStream)(zipSpecification, options === null || options === undefined ? undefined : options.compressionLevel); + const uploadResult = yield (0, blob_upload_1.uploadZipToBlobStorage)(createArtifactResp.signedUploadUrl, zipUploadStream); + const finalizeArtifactReq = { + workflowRunBackendId: backendIds.workflowRunBackendId, + workflowJobRunBackendId: backendIds.workflowJobRunBackendId, + name, + size: uploadResult.uploadSize ? uploadResult.uploadSize.toString() : "0" + }; + if (uploadResult.sha256Hash) { + finalizeArtifactReq.hash = generated_1.StringValue.create({ + value: `sha256:${uploadResult.sha256Hash}` + }); + } + core.info(`Finalizing artifact upload`); + const finalizeArtifactResp = yield artifactClient.FinalizeArtifact(finalizeArtifactReq); + if (!finalizeArtifactResp.ok) { + throw new errors_1.InvalidResponseError("FinalizeArtifact: response from backend was not ok"); + } + const artifactId = BigInt(finalizeArtifactResp.artifactId); + core.info(`Artifact ${name}.zip successfully finalized. Artifact ID ${artifactId}`); + return { + size: uploadResult.uploadSize, + id: Number(artifactId) + }; + }); + } + exports2.uploadArtifact = uploadArtifact; +}); + +// node_modules/@actions/artifact/node_modules/@actions/github/lib/context.js +var require_context3 = __commonJS((exports2) => { + Object.defineProperty(exports2, "__esModule", { value: true }); + exports2.Context = undefined; + var fs_1 = require("fs"); + var os_1 = require("os"); + + class Context { + constructor() { + var _a, _b, _c; + this.payload = {}; + if (process.env.GITHUB_EVENT_PATH) { + if (fs_1.existsSync(process.env.GITHUB_EVENT_PATH)) { + this.payload = JSON.parse(fs_1.readFileSync(process.env.GITHUB_EVENT_PATH, { encoding: "utf8" })); + } else { + const path = process.env.GITHUB_EVENT_PATH; + process.stdout.write(`GITHUB_EVENT_PATH ${path} does not exist${os_1.EOL}`); + } + } + this.eventName = process.env.GITHUB_EVENT_NAME; + this.sha = process.env.GITHUB_SHA; + this.ref = process.env.GITHUB_REF; + this.workflow = process.env.GITHUB_WORKFLOW; + this.action = process.env.GITHUB_ACTION; + this.actor = process.env.GITHUB_ACTOR; + this.job = process.env.GITHUB_JOB; + this.runNumber = parseInt(process.env.GITHUB_RUN_NUMBER, 10); + this.runId = parseInt(process.env.GITHUB_RUN_ID, 10); + this.apiUrl = (_a = process.env.GITHUB_API_URL) !== null && _a !== undefined ? _a : `https://api.github.com`; + this.serverUrl = (_b = process.env.GITHUB_SERVER_URL) !== null && _b !== undefined ? _b : `https://github.com`; + this.graphqlUrl = (_c = process.env.GITHUB_GRAPHQL_URL) !== null && _c !== undefined ? _c : `https://api.github.com/graphql`; + } + get issue() { + const payload = this.payload; + return Object.assign(Object.assign({}, this.repo), { number: (payload.issue || payload.pull_request || payload).number }); + } + get repo() { + if (process.env.GITHUB_REPOSITORY) { + const [owner, repo] = process.env.GITHUB_REPOSITORY.split("/"); + return { owner, repo }; + } + if (this.payload.repository) { + return { + owner: this.payload.repository.owner.login, + repo: this.payload.repository.name + }; + } + throw new Error("context.repo requires a GITHUB_REPOSITORY environment variable like 'owner/repo'"); + } + } + exports2.Context = Context; +}); + +// node_modules/@actions/artifact/node_modules/@actions/github/lib/internal/utils.js +var require_utils7 = __commonJS((exports2) => { + var __createBinding = exports2 && exports2.__createBinding || (Object.create ? function(o, m, k, k2) { + if (k2 === undefined) + k2 = k; + Object.defineProperty(o, k2, { enumerable: true, get: function() { + return m[k]; + } }); + } : function(o, m, k, k2) { + if (k2 === undefined) + k2 = k; + o[k2] = m[k]; + }); + var __setModuleDefault = exports2 && exports2.__setModuleDefault || (Object.create ? function(o, v) { + Object.defineProperty(o, "default", { enumerable: true, value: v }); + } : function(o, v) { + o["default"] = v; + }); + var __importStar = exports2 && exports2.__importStar || function(mod) { + if (mod && mod.__esModule) + return mod; + var result = {}; + if (mod != null) { + for (var k in mod) + if (k !== "default" && Object.hasOwnProperty.call(mod, k)) + __createBinding(result, mod, k); + } + __setModuleDefault(result, mod); + return result; + }; + Object.defineProperty(exports2, "__esModule", { value: true }); + exports2.getApiBaseUrl = exports2.getProxyAgent = exports2.getAuthString = undefined; + var httpClient = __importStar(require_lib()); + function getAuthString(token, options) { + if (!token && !options.auth) { + throw new Error("Parameter token or opts.auth is required"); + } else if (token && options.auth) { + throw new Error("Parameters token and opts.auth may not both be specified"); + } + return typeof options.auth === "string" ? options.auth : `token ${token}`; + } + exports2.getAuthString = getAuthString; + function getProxyAgent(destinationUrl) { + const hc = new httpClient.HttpClient; + return hc.getAgent(destinationUrl); + } + exports2.getProxyAgent = getProxyAgent; + function getApiBaseUrl() { + return process.env["GITHUB_API_URL"] || "https://api.github.com"; + } + exports2.getApiBaseUrl = getApiBaseUrl; +}); + +// node_modules/is-plain-object/dist/is-plain-object.js +var require_is_plain_object = __commonJS((exports2) => { + Object.defineProperty(exports2, "__esModule", { value: true }); + /*! + * is-plain-object + * + * Copyright (c) 2014-2017, Jon Schlinkert. + * Released under the MIT License. + */ + function isObject(o) { + return Object.prototype.toString.call(o) === "[object Object]"; + } + function isPlainObject(o) { + var ctor, prot; + if (isObject(o) === false) + return false; + ctor = o.constructor; + if (ctor === undefined) + return true; + prot = ctor.prototype; + if (isObject(prot) === false) + return false; + if (prot.hasOwnProperty("isPrototypeOf") === false) { + return false; + } + return true; + } + exports2.isPlainObject = isPlainObject; +}); + +// node_modules/@octokit/endpoint/dist-node/index.js +var require_dist_node11 = __commonJS((exports2) => { + Object.defineProperty(exports2, "__esModule", { value: true }); + var isPlainObject = require_is_plain_object(); + var universalUserAgent = require_dist_node(); + function lowercaseKeys(object) { + if (!object) { + return {}; + } + return Object.keys(object).reduce((newObj, key) => { + newObj[key.toLowerCase()] = object[key]; + return newObj; + }, {}); + } + function mergeDeep(defaults, options) { + const result = Object.assign({}, defaults); + Object.keys(options).forEach((key) => { + if (isPlainObject.isPlainObject(options[key])) { + if (!(key in defaults)) + Object.assign(result, { + [key]: options[key] + }); + else + result[key] = mergeDeep(defaults[key], options[key]); + } else { + Object.assign(result, { + [key]: options[key] + }); + } + }); + return result; + } + function removeUndefinedProperties(obj) { + for (const key in obj) { + if (obj[key] === undefined) { + delete obj[key]; + } + } + return obj; + } + function merge(defaults, route, options) { + if (typeof route === "string") { + let [method, url] = route.split(" "); + options = Object.assign(url ? { + method, + url + } : { + url: method + }, options); + } else { + options = Object.assign({}, route); + } + options.headers = lowercaseKeys(options.headers); + removeUndefinedProperties(options); + removeUndefinedProperties(options.headers); + const mergedOptions = mergeDeep(defaults || {}, options); + if (defaults && defaults.mediaType.previews.length) { + mergedOptions.mediaType.previews = defaults.mediaType.previews.filter((preview) => !mergedOptions.mediaType.previews.includes(preview)).concat(mergedOptions.mediaType.previews); + } + mergedOptions.mediaType.previews = mergedOptions.mediaType.previews.map((preview) => preview.replace(/-preview/, "")); + return mergedOptions; + } + function addQueryParameters(url, parameters) { + const separator = /\?/.test(url) ? "&" : "?"; + const names = Object.keys(parameters); + if (names.length === 0) { + return url; + } + return url + separator + names.map((name) => { + if (name === "q") { + return "q=" + parameters.q.split("+").map(encodeURIComponent).join("+"); + } + return `${name}=${encodeURIComponent(parameters[name])}`; + }).join("&"); + } + var urlVariableRegex = /\{[^}]+\}/g; + function removeNonChars(variableName) { + return variableName.replace(/^\W+|\W+$/g, "").split(/,/); + } + function extractUrlVariableNames(url) { + const matches = url.match(urlVariableRegex); + if (!matches) { + return []; + } + return matches.map(removeNonChars).reduce((a, b) => a.concat(b), []); + } + function omit(object, keysToOmit) { + return Object.keys(object).filter((option) => !keysToOmit.includes(option)).reduce((obj, key) => { + obj[key] = object[key]; + return obj; + }, {}); + } + function encodeReserved(str) { + return str.split(/(%[0-9A-Fa-f]{2})/g).map(function(part) { + if (!/%[0-9A-Fa-f]/.test(part)) { + part = encodeURI(part).replace(/%5B/g, "[").replace(/%5D/g, "]"); + } + return part; + }).join(""); + } + function encodeUnreserved(str) { + return encodeURIComponent(str).replace(/[!'()*]/g, function(c) { + return "%" + c.charCodeAt(0).toString(16).toUpperCase(); + }); + } + function encodeValue(operator, value, key) { + value = operator === "+" || operator === "#" ? encodeReserved(value) : encodeUnreserved(value); + if (key) { + return encodeUnreserved(key) + "=" + value; + } else { + return value; + } + } + function isDefined(value) { + return value !== undefined && value !== null; + } + function isKeyOperator(operator) { + return operator === ";" || operator === "&" || operator === "?"; + } + function getValues(context, operator, key, modifier) { + var value = context[key], result = []; + if (isDefined(value) && value !== "") { + if (typeof value === "string" || typeof value === "number" || typeof value === "boolean") { + value = value.toString(); + if (modifier && modifier !== "*") { + value = value.substring(0, parseInt(modifier, 10)); + } + result.push(encodeValue(operator, value, isKeyOperator(operator) ? key : "")); + } else { + if (modifier === "*") { + if (Array.isArray(value)) { + value.filter(isDefined).forEach(function(value2) { + result.push(encodeValue(operator, value2, isKeyOperator(operator) ? key : "")); + }); + } else { + Object.keys(value).forEach(function(k) { + if (isDefined(value[k])) { + result.push(encodeValue(operator, value[k], k)); + } + }); + } + } else { + const tmp = []; + if (Array.isArray(value)) { + value.filter(isDefined).forEach(function(value2) { + tmp.push(encodeValue(operator, value2)); + }); + } else { + Object.keys(value).forEach(function(k) { + if (isDefined(value[k])) { + tmp.push(encodeUnreserved(k)); + tmp.push(encodeValue(operator, value[k].toString())); + } + }); + } + if (isKeyOperator(operator)) { + result.push(encodeUnreserved(key) + "=" + tmp.join(",")); + } else if (tmp.length !== 0) { + result.push(tmp.join(",")); + } + } + } + } else { + if (operator === ";") { + if (isDefined(value)) { + result.push(encodeUnreserved(key)); + } + } else if (value === "" && (operator === "&" || operator === "?")) { + result.push(encodeUnreserved(key) + "="); + } else if (value === "") { + result.push(""); + } + } + return result; + } + function parseUrl(template) { + return { + expand: expand.bind(null, template) + }; + } + function expand(template, context) { + var operators = ["+", "#", ".", "/", ";", "?", "&"]; + return template.replace(/\{([^\{\}]+)\}|([^\{\}]+)/g, function(_2, expression, literal) { + if (expression) { + let operator = ""; + const values = []; + if (operators.indexOf(expression.charAt(0)) !== -1) { + operator = expression.charAt(0); + expression = expression.substr(1); + } + expression.split(/,/g).forEach(function(variable) { + var tmp = /([^:\*]*)(?::(\d+)|(\*))?/.exec(variable); + values.push(getValues(context, operator, tmp[1], tmp[2] || tmp[3])); + }); + if (operator && operator !== "+") { + var separator = ","; + if (operator === "?") { + separator = "&"; + } else if (operator !== "#") { + separator = operator; + } + return (values.length !== 0 ? operator : "") + values.join(separator); + } else { + return values.join(","); + } + } else { + return encodeReserved(literal); + } + }); + } + function parse(options) { + let method = options.method.toUpperCase(); + let url = (options.url || "/").replace(/:([a-z]\w+)/g, "{$1}"); + let headers = Object.assign({}, options.headers); + let body; + let parameters = omit(options, ["method", "baseUrl", "url", "headers", "request", "mediaType"]); + const urlVariableNames = extractUrlVariableNames(url); + url = parseUrl(url).expand(parameters); + if (!/^http/.test(url)) { + url = options.baseUrl + url; + } + const omittedParameters = Object.keys(options).filter((option) => urlVariableNames.includes(option)).concat("baseUrl"); + const remainingParameters = omit(parameters, omittedParameters); + const isBinaryRequest = /application\/octet-stream/i.test(headers.accept); + if (!isBinaryRequest) { + if (options.mediaType.format) { + headers.accept = headers.accept.split(/,/).map((preview) => preview.replace(/application\/vnd(\.\w+)(\.v3)?(\.\w+)?(\+json)?$/, `application/vnd\$1\$2.${options.mediaType.format}`)).join(","); + } + if (options.mediaType.previews.length) { + const previewsFromAcceptHeader = headers.accept.match(/[\w-]+(?=-preview)/g) || []; + headers.accept = previewsFromAcceptHeader.concat(options.mediaType.previews).map((preview) => { + const format = options.mediaType.format ? `.${options.mediaType.format}` : "+json"; + return `application/vnd.github.${preview}-preview${format}`; + }).join(","); + } + } + if (["GET", "HEAD"].includes(method)) { + url = addQueryParameters(url, remainingParameters); + } else { + if ("data" in remainingParameters) { + body = remainingParameters.data; + } else { + if (Object.keys(remainingParameters).length) { + body = remainingParameters; + } else { + headers["content-length"] = 0; + } + } + } + if (!headers["content-type"] && typeof body !== "undefined") { + headers["content-type"] = "application/json; charset=utf-8"; + } + if (["PATCH", "PUT"].includes(method) && typeof body === "undefined") { + body = ""; + } + return Object.assign({ + method, + url, + headers + }, typeof body !== "undefined" ? { + body + } : null, options.request ? { + request: options.request + } : null); + } + function endpointWithDefaults(defaults, route, options) { + return parse(merge(defaults, route, options)); + } + function withDefaults(oldDefaults, newDefaults) { + const DEFAULTS2 = merge(oldDefaults, newDefaults); + const endpoint2 = endpointWithDefaults.bind(null, DEFAULTS2); + return Object.assign(endpoint2, { + DEFAULTS: DEFAULTS2, + defaults: withDefaults.bind(null, DEFAULTS2), + merge: merge.bind(null, DEFAULTS2), + parse + }); + } + var VERSION = "6.0.12"; + var userAgent = `octokit-endpoint.js/${VERSION} ${universalUserAgent.getUserAgent()}`; + var DEFAULTS = { + method: "GET", + baseUrl: "https://api.github.com", + headers: { + accept: "application/vnd.github.v3+json", + "user-agent": userAgent + }, + mediaType: { + format: "", + previews: [] + } + }; + var endpoint = withDefaults(null, DEFAULTS); + exports2.endpoint = endpoint; +}); + +// node_modules/webidl-conversions/lib/index.js +var require_lib3 = __commonJS((exports2, module2) => { + var conversions = {}; + module2.exports = conversions; + function sign(x) { + return x < 0 ? -1 : 1; + } + function evenRound(x) { + if (x % 1 === 0.5 && (x & 1) === 0) { + return Math.floor(x); + } else { + return Math.round(x); + } + } + function createNumberConversion(bitLength, typeOpts) { + if (!typeOpts.unsigned) { + --bitLength; + } + const lowerBound = typeOpts.unsigned ? 0 : -Math.pow(2, bitLength); + const upperBound = Math.pow(2, bitLength) - 1; + const moduloVal = typeOpts.moduloBitLength ? Math.pow(2, typeOpts.moduloBitLength) : Math.pow(2, bitLength); + const moduloBound = typeOpts.moduloBitLength ? Math.pow(2, typeOpts.moduloBitLength - 1) : Math.pow(2, bitLength - 1); + return function(V, opts) { + if (!opts) + opts = {}; + let x = +V; + if (opts.enforceRange) { + if (!Number.isFinite(x)) { + throw new TypeError("Argument is not a finite number"); + } + x = sign(x) * Math.floor(Math.abs(x)); + if (x < lowerBound || x > upperBound) { + throw new TypeError("Argument is not in byte range"); + } + return x; + } + if (!isNaN(x) && opts.clamp) { + x = evenRound(x); + if (x < lowerBound) + x = lowerBound; + if (x > upperBound) + x = upperBound; + return x; + } + if (!Number.isFinite(x) || x === 0) { + return 0; + } + x = sign(x) * Math.floor(Math.abs(x)); + x = x % moduloVal; + if (!typeOpts.unsigned && x >= moduloBound) { + return x - moduloVal; + } else if (typeOpts.unsigned) { + if (x < 0) { + x += moduloVal; + } else if (x === -0) { + return 0; + } + } + return x; + }; + } + conversions["void"] = function() { + return; + }; + conversions["boolean"] = function(val2) { + return !!val2; + }; + conversions["byte"] = createNumberConversion(8, { unsigned: false }); + conversions["octet"] = createNumberConversion(8, { unsigned: true }); + conversions["short"] = createNumberConversion(16, { unsigned: false }); + conversions["unsigned short"] = createNumberConversion(16, { unsigned: true }); + conversions["long"] = createNumberConversion(32, { unsigned: false }); + conversions["unsigned long"] = createNumberConversion(32, { unsigned: true }); + conversions["long long"] = createNumberConversion(32, { unsigned: false, moduloBitLength: 64 }); + conversions["unsigned long long"] = createNumberConversion(32, { unsigned: true, moduloBitLength: 64 }); + conversions["double"] = function(V) { + const x = +V; + if (!Number.isFinite(x)) { + throw new TypeError("Argument is not a finite floating-point value"); + } + return x; + }; + conversions["unrestricted double"] = function(V) { + const x = +V; + if (isNaN(x)) { + throw new TypeError("Argument is NaN"); + } + return x; + }; + conversions["float"] = conversions["double"]; + conversions["unrestricted float"] = conversions["unrestricted double"]; + conversions["DOMString"] = function(V, opts) { + if (!opts) + opts = {}; + if (opts.treatNullAsEmptyString && V === null) { + return ""; + } + return String(V); + }; + conversions["ByteString"] = function(V, opts) { + const x = String(V); + let c = undefined; + for (let i = 0;(c = x.codePointAt(i)) !== undefined; ++i) { + if (c > 255) { + throw new TypeError("Argument is not a valid bytestring"); + } + } + return x; + }; + conversions["USVString"] = function(V) { + const S = String(V); + const n = S.length; + const U = []; + for (let i = 0;i < n; ++i) { + const c = S.charCodeAt(i); + if (c < 55296 || c > 57343) { + U.push(String.fromCodePoint(c)); + } else if (56320 <= c && c <= 57343) { + U.push(String.fromCodePoint(65533)); + } else { + if (i === n - 1) { + U.push(String.fromCodePoint(65533)); + } else { + const d = S.charCodeAt(i + 1); + if (56320 <= d && d <= 57343) { + const a = c & 1023; + const b = d & 1023; + U.push(String.fromCodePoint((2 << 15) + (2 << 9) * a + b)); + ++i; + } else { + U.push(String.fromCodePoint(65533)); + } + } + } + } + return U.join(""); + }; + conversions["Date"] = function(V, opts) { + if (!(V instanceof Date)) { + throw new TypeError("Argument is not a Date object"); + } + if (isNaN(V)) { + return; + } + return V; + }; + conversions["RegExp"] = function(V, opts) { + if (!(V instanceof RegExp)) { + V = new RegExp(V); + } + return V; + }; +}); + +// node_modules/whatwg-url/lib/utils.js +var require_utils8 = __commonJS((exports2, module2) => { + module2.exports.mixin = function mixin(target, source) { + const keys = Object.getOwnPropertyNames(source); + for (let i = 0;i < keys.length; ++i) { + Object.defineProperty(target, keys[i], Object.getOwnPropertyDescriptor(source, keys[i])); + } + }; + module2.exports.wrapperSymbol = Symbol("wrapper"); + module2.exports.implSymbol = Symbol("impl"); + module2.exports.wrapperForImpl = function(impl) { + return impl[module2.exports.wrapperSymbol]; + }; + module2.exports.implForWrapper = function(wrapper) { + return wrapper[module2.exports.implSymbol]; + }; +}); + +// node_modules/tr46/lib/mappingTable.json +var require_mappingTable = __commonJS((exports2, module2) => { + module2.exports = [[[0, 44], "disallowed_STD3_valid"], [[45, 46], "valid"], [[47, 47], "disallowed_STD3_valid"], [[48, 57], "valid"], [[58, 64], "disallowed_STD3_valid"], [[65, 65], "mapped", [97]], [[66, 66], "mapped", [98]], [[67, 67], "mapped", [99]], [[68, 68], "mapped", [100]], [[69, 69], "mapped", [101]], [[70, 70], "mapped", [102]], [[71, 71], "mapped", [103]], [[72, 72], "mapped", [104]], [[73, 73], "mapped", [105]], [[74, 74], "mapped", [106]], [[75, 75], "mapped", [107]], [[76, 76], "mapped", [108]], [[77, 77], "mapped", [109]], [[78, 78], "mapped", [110]], [[79, 79], "mapped", [111]], [[80, 80], "mapped", [112]], [[81, 81], "mapped", [113]], [[82, 82], "mapped", [114]], [[83, 83], "mapped", [115]], [[84, 84], "mapped", [116]], [[85, 85], "mapped", [117]], [[86, 86], "mapped", [118]], [[87, 87], "mapped", [119]], [[88, 88], "mapped", [120]], [[89, 89], "mapped", [121]], [[90, 90], "mapped", [122]], [[91, 96], "disallowed_STD3_valid"], [[97, 122], "valid"], [[123, 127], "disallowed_STD3_valid"], [[128, 159], "disallowed"], [[160, 160], "disallowed_STD3_mapped", [32]], [[161, 167], "valid", [], "NV8"], [[168, 168], "disallowed_STD3_mapped", [32, 776]], [[169, 169], "valid", [], "NV8"], [[170, 170], "mapped", [97]], [[171, 172], "valid", [], "NV8"], [[173, 173], "ignored"], [[174, 174], "valid", [], "NV8"], [[175, 175], "disallowed_STD3_mapped", [32, 772]], [[176, 177], "valid", [], "NV8"], [[178, 178], "mapped", [50]], [[179, 179], "mapped", [51]], [[180, 180], "disallowed_STD3_mapped", [32, 769]], [[181, 181], "mapped", [956]], [[182, 182], "valid", [], "NV8"], [[183, 183], "valid"], [[184, 184], "disallowed_STD3_mapped", [32, 807]], [[185, 185], "mapped", [49]], [[186, 186], "mapped", [111]], [[187, 187], "valid", [], "NV8"], [[188, 188], "mapped", [49, 8260, 52]], [[189, 189], "mapped", [49, 8260, 50]], [[190, 190], "mapped", [51, 8260, 52]], [[191, 191], "valid", [], "NV8"], [[192, 192], "mapped", [224]], [[193, 193], "mapped", [225]], [[194, 194], "mapped", [226]], [[195, 195], "mapped", [227]], [[196, 196], "mapped", [228]], [[197, 197], "mapped", [229]], [[198, 198], "mapped", [230]], [[199, 199], "mapped", [231]], [[200, 200], "mapped", [232]], [[201, 201], "mapped", [233]], [[202, 202], "mapped", [234]], [[203, 203], "mapped", [235]], [[204, 204], "mapped", [236]], [[205, 205], "mapped", [237]], [[206, 206], "mapped", [238]], [[207, 207], "mapped", [239]], [[208, 208], "mapped", [240]], [[209, 209], "mapped", [241]], [[210, 210], "mapped", [242]], [[211, 211], "mapped", [243]], [[212, 212], "mapped", [244]], [[213, 213], "mapped", [245]], [[214, 214], "mapped", [246]], [[215, 215], "valid", [], "NV8"], [[216, 216], "mapped", [248]], [[217, 217], "mapped", [249]], [[218, 218], "mapped", [250]], [[219, 219], "mapped", [251]], [[220, 220], "mapped", [252]], [[221, 221], "mapped", [253]], [[222, 222], "mapped", [254]], [[223, 223], "deviation", [115, 115]], [[224, 246], "valid"], [[247, 247], "valid", [], "NV8"], [[248, 255], "valid"], [[256, 256], "mapped", [257]], [[257, 257], "valid"], [[258, 258], "mapped", [259]], [[259, 259], "valid"], [[260, 260], "mapped", [261]], [[261, 261], "valid"], [[262, 262], "mapped", [263]], [[263, 263], "valid"], [[264, 264], "mapped", [265]], [[265, 265], "valid"], [[266, 266], "mapped", [267]], [[267, 267], "valid"], [[268, 268], "mapped", [269]], [[269, 269], "valid"], [[270, 270], "mapped", [271]], [[271, 271], "valid"], [[272, 272], "mapped", [273]], [[273, 273], "valid"], [[274, 274], "mapped", [275]], [[275, 275], "valid"], [[276, 276], "mapped", [277]], [[277, 277], "valid"], [[278, 278], "mapped", [279]], [[279, 279], "valid"], [[280, 280], "mapped", [281]], [[281, 281], "valid"], [[282, 282], "mapped", [283]], [[283, 283], "valid"], [[284, 284], "mapped", [285]], [[285, 285], "valid"], [[286, 286], "mapped", [287]], [[287, 287], "valid"], [[288, 288], "mapped", [289]], [[289, 289], "valid"], [[290, 290], "mapped", [291]], [[291, 291], "valid"], [[292, 292], "mapped", [293]], [[293, 293], "valid"], [[294, 294], "mapped", [295]], [[295, 295], "valid"], [[296, 296], "mapped", [297]], [[297, 297], "valid"], [[298, 298], "mapped", [299]], [[299, 299], "valid"], [[300, 300], "mapped", [301]], [[301, 301], "valid"], [[302, 302], "mapped", [303]], [[303, 303], "valid"], [[304, 304], "mapped", [105, 775]], [[305, 305], "valid"], [[306, 307], "mapped", [105, 106]], [[308, 308], "mapped", [309]], [[309, 309], "valid"], [[310, 310], "mapped", [311]], [[311, 312], "valid"], [[313, 313], "mapped", [314]], [[314, 314], "valid"], [[315, 315], "mapped", [316]], [[316, 316], "valid"], [[317, 317], "mapped", [318]], [[318, 318], "valid"], [[319, 320], "mapped", [108, 183]], [[321, 321], "mapped", [322]], [[322, 322], "valid"], [[323, 323], "mapped", [324]], [[324, 324], "valid"], [[325, 325], "mapped", [326]], [[326, 326], "valid"], [[327, 327], "mapped", [328]], [[328, 328], "valid"], [[329, 329], "mapped", [700, 110]], [[330, 330], "mapped", [331]], [[331, 331], "valid"], [[332, 332], "mapped", [333]], [[333, 333], "valid"], [[334, 334], "mapped", [335]], [[335, 335], "valid"], [[336, 336], "mapped", [337]], [[337, 337], "valid"], [[338, 338], "mapped", [339]], [[339, 339], "valid"], [[340, 340], "mapped", [341]], [[341, 341], "valid"], [[342, 342], "mapped", [343]], [[343, 343], "valid"], [[344, 344], "mapped", [345]], [[345, 345], "valid"], [[346, 346], "mapped", [347]], [[347, 347], "valid"], [[348, 348], "mapped", [349]], [[349, 349], "valid"], [[350, 350], "mapped", [351]], [[351, 351], "valid"], [[352, 352], "mapped", [353]], [[353, 353], "valid"], [[354, 354], "mapped", [355]], [[355, 355], "valid"], [[356, 356], "mapped", [357]], [[357, 357], "valid"], [[358, 358], "mapped", [359]], [[359, 359], "valid"], [[360, 360], "mapped", [361]], [[361, 361], "valid"], [[362, 362], "mapped", [363]], [[363, 363], "valid"], [[364, 364], "mapped", [365]], [[365, 365], "valid"], [[366, 366], "mapped", [367]], [[367, 367], "valid"], [[368, 368], "mapped", [369]], [[369, 369], "valid"], [[370, 370], "mapped", [371]], [[371, 371], "valid"], [[372, 372], "mapped", [373]], [[373, 373], "valid"], [[374, 374], "mapped", [375]], [[375, 375], "valid"], [[376, 376], "mapped", [255]], [[377, 377], "mapped", [378]], [[378, 378], "valid"], [[379, 379], "mapped", [380]], [[380, 380], "valid"], [[381, 381], "mapped", [382]], [[382, 382], "valid"], [[383, 383], "mapped", [115]], [[384, 384], "valid"], [[385, 385], "mapped", [595]], [[386, 386], "mapped", [387]], [[387, 387], "valid"], [[388, 388], "mapped", [389]], [[389, 389], "valid"], [[390, 390], "mapped", [596]], [[391, 391], "mapped", [392]], [[392, 392], "valid"], [[393, 393], "mapped", [598]], [[394, 394], "mapped", [599]], [[395, 395], "mapped", [396]], [[396, 397], "valid"], [[398, 398], "mapped", [477]], [[399, 399], "mapped", [601]], [[400, 400], "mapped", [603]], [[401, 401], "mapped", [402]], [[402, 402], "valid"], [[403, 403], "mapped", [608]], [[404, 404], "mapped", [611]], [[405, 405], "valid"], [[406, 406], "mapped", [617]], [[407, 407], "mapped", [616]], [[408, 408], "mapped", [409]], [[409, 411], "valid"], [[412, 412], "mapped", [623]], [[413, 413], "mapped", [626]], [[414, 414], "valid"], [[415, 415], "mapped", [629]], [[416, 416], "mapped", [417]], [[417, 417], "valid"], [[418, 418], "mapped", [419]], [[419, 419], "valid"], [[420, 420], "mapped", [421]], [[421, 421], "valid"], [[422, 422], "mapped", [640]], [[423, 423], "mapped", [424]], [[424, 424], "valid"], [[425, 425], "mapped", [643]], [[426, 427], "valid"], [[428, 428], "mapped", [429]], [[429, 429], "valid"], [[430, 430], "mapped", [648]], [[431, 431], "mapped", [432]], [[432, 432], "valid"], [[433, 433], "mapped", [650]], [[434, 434], "mapped", [651]], [[435, 435], "mapped", [436]], [[436, 436], "valid"], [[437, 437], "mapped", [438]], [[438, 438], "valid"], [[439, 439], "mapped", [658]], [[440, 440], "mapped", [441]], [[441, 443], "valid"], [[444, 444], "mapped", [445]], [[445, 451], "valid"], [[452, 454], "mapped", [100, 382]], [[455, 457], "mapped", [108, 106]], [[458, 460], "mapped", [110, 106]], [[461, 461], "mapped", [462]], [[462, 462], "valid"], [[463, 463], "mapped", [464]], [[464, 464], "valid"], [[465, 465], "mapped", [466]], [[466, 466], "valid"], [[467, 467], "mapped", [468]], [[468, 468], "valid"], [[469, 469], "mapped", [470]], [[470, 470], "valid"], [[471, 471], "mapped", [472]], [[472, 472], "valid"], [[473, 473], "mapped", [474]], [[474, 474], "valid"], [[475, 475], "mapped", [476]], [[476, 477], "valid"], [[478, 478], "mapped", [479]], [[479, 479], "valid"], [[480, 480], "mapped", [481]], [[481, 481], "valid"], [[482, 482], "mapped", [483]], [[483, 483], "valid"], [[484, 484], "mapped", [485]], [[485, 485], "valid"], [[486, 486], "mapped", [487]], [[487, 487], "valid"], [[488, 488], "mapped", [489]], [[489, 489], "valid"], [[490, 490], "mapped", [491]], [[491, 491], "valid"], [[492, 492], "mapped", [493]], [[493, 493], "valid"], [[494, 494], "mapped", [495]], [[495, 496], "valid"], [[497, 499], "mapped", [100, 122]], [[500, 500], "mapped", [501]], [[501, 501], "valid"], [[502, 502], "mapped", [405]], [[503, 503], "mapped", [447]], [[504, 504], "mapped", [505]], [[505, 505], "valid"], [[506, 506], "mapped", [507]], [[507, 507], "valid"], [[508, 508], "mapped", [509]], [[509, 509], "valid"], [[510, 510], "mapped", [511]], [[511, 511], "valid"], [[512, 512], "mapped", [513]], [[513, 513], "valid"], [[514, 514], "mapped", [515]], [[515, 515], "valid"], [[516, 516], "mapped", [517]], [[517, 517], "valid"], [[518, 518], "mapped", [519]], [[519, 519], "valid"], [[520, 520], "mapped", [521]], [[521, 521], "valid"], [[522, 522], "mapped", [523]], [[523, 523], "valid"], [[524, 524], "mapped", [525]], [[525, 525], "valid"], [[526, 526], "mapped", [527]], [[527, 527], "valid"], [[528, 528], "mapped", [529]], [[529, 529], "valid"], [[530, 530], "mapped", [531]], [[531, 531], "valid"], [[532, 532], "mapped", [533]], [[533, 533], "valid"], [[534, 534], "mapped", [535]], [[535, 535], "valid"], [[536, 536], "mapped", [537]], [[537, 537], "valid"], [[538, 538], "mapped", [539]], [[539, 539], "valid"], [[540, 540], "mapped", [541]], [[541, 541], "valid"], [[542, 542], "mapped", [543]], [[543, 543], "valid"], [[544, 544], "mapped", [414]], [[545, 545], "valid"], [[546, 546], "mapped", [547]], [[547, 547], "valid"], [[548, 548], "mapped", [549]], [[549, 549], "valid"], [[550, 550], "mapped", [551]], [[551, 551], "valid"], [[552, 552], "mapped", [553]], [[553, 553], "valid"], [[554, 554], "mapped", [555]], [[555, 555], "valid"], [[556, 556], "mapped", [557]], [[557, 557], "valid"], [[558, 558], "mapped", [559]], [[559, 559], "valid"], [[560, 560], "mapped", [561]], [[561, 561], "valid"], [[562, 562], "mapped", [563]], [[563, 563], "valid"], [[564, 566], "valid"], [[567, 569], "valid"], [[570, 570], "mapped", [11365]], [[571, 571], "mapped", [572]], [[572, 572], "valid"], [[573, 573], "mapped", [410]], [[574, 574], "mapped", [11366]], [[575, 576], "valid"], [[577, 577], "mapped", [578]], [[578, 578], "valid"], [[579, 579], "mapped", [384]], [[580, 580], "mapped", [649]], [[581, 581], "mapped", [652]], [[582, 582], "mapped", [583]], [[583, 583], "valid"], [[584, 584], "mapped", [585]], [[585, 585], "valid"], [[586, 586], "mapped", [587]], [[587, 587], "valid"], [[588, 588], "mapped", [589]], [[589, 589], "valid"], [[590, 590], "mapped", [591]], [[591, 591], "valid"], [[592, 680], "valid"], [[681, 685], "valid"], [[686, 687], "valid"], [[688, 688], "mapped", [104]], [[689, 689], "mapped", [614]], [[690, 690], "mapped", [106]], [[691, 691], "mapped", [114]], [[692, 692], "mapped", [633]], [[693, 693], "mapped", [635]], [[694, 694], "mapped", [641]], [[695, 695], "mapped", [119]], [[696, 696], "mapped", [121]], [[697, 705], "valid"], [[706, 709], "valid", [], "NV8"], [[710, 721], "valid"], [[722, 727], "valid", [], "NV8"], [[728, 728], "disallowed_STD3_mapped", [32, 774]], [[729, 729], "disallowed_STD3_mapped", [32, 775]], [[730, 730], "disallowed_STD3_mapped", [32, 778]], [[731, 731], "disallowed_STD3_mapped", [32, 808]], [[732, 732], "disallowed_STD3_mapped", [32, 771]], [[733, 733], "disallowed_STD3_mapped", [32, 779]], [[734, 734], "valid", [], "NV8"], [[735, 735], "valid", [], "NV8"], [[736, 736], "mapped", [611]], [[737, 737], "mapped", [108]], [[738, 738], "mapped", [115]], [[739, 739], "mapped", [120]], [[740, 740], "mapped", [661]], [[741, 745], "valid", [], "NV8"], [[746, 747], "valid", [], "NV8"], [[748, 748], "valid"], [[749, 749], "valid", [], "NV8"], [[750, 750], "valid"], [[751, 767], "valid", [], "NV8"], [[768, 831], "valid"], [[832, 832], "mapped", [768]], [[833, 833], "mapped", [769]], [[834, 834], "valid"], [[835, 835], "mapped", [787]], [[836, 836], "mapped", [776, 769]], [[837, 837], "mapped", [953]], [[838, 846], "valid"], [[847, 847], "ignored"], [[848, 855], "valid"], [[856, 860], "valid"], [[861, 863], "valid"], [[864, 865], "valid"], [[866, 866], "valid"], [[867, 879], "valid"], [[880, 880], "mapped", [881]], [[881, 881], "valid"], [[882, 882], "mapped", [883]], [[883, 883], "valid"], [[884, 884], "mapped", [697]], [[885, 885], "valid"], [[886, 886], "mapped", [887]], [[887, 887], "valid"], [[888, 889], "disallowed"], [[890, 890], "disallowed_STD3_mapped", [32, 953]], [[891, 893], "valid"], [[894, 894], "disallowed_STD3_mapped", [59]], [[895, 895], "mapped", [1011]], [[896, 899], "disallowed"], [[900, 900], "disallowed_STD3_mapped", [32, 769]], [[901, 901], "disallowed_STD3_mapped", [32, 776, 769]], [[902, 902], "mapped", [940]], [[903, 903], "mapped", [183]], [[904, 904], "mapped", [941]], [[905, 905], "mapped", [942]], [[906, 906], "mapped", [943]], [[907, 907], "disallowed"], [[908, 908], "mapped", [972]], [[909, 909], "disallowed"], [[910, 910], "mapped", [973]], [[911, 911], "mapped", [974]], [[912, 912], "valid"], [[913, 913], "mapped", [945]], [[914, 914], "mapped", [946]], [[915, 915], "mapped", [947]], [[916, 916], "mapped", [948]], [[917, 917], "mapped", [949]], [[918, 918], "mapped", [950]], [[919, 919], "mapped", [951]], [[920, 920], "mapped", [952]], [[921, 921], "mapped", [953]], [[922, 922], "mapped", [954]], [[923, 923], "mapped", [955]], [[924, 924], "mapped", [956]], [[925, 925], "mapped", [957]], [[926, 926], "mapped", [958]], [[927, 927], "mapped", [959]], [[928, 928], "mapped", [960]], [[929, 929], "mapped", [961]], [[930, 930], "disallowed"], [[931, 931], "mapped", [963]], [[932, 932], "mapped", [964]], [[933, 933], "mapped", [965]], [[934, 934], "mapped", [966]], [[935, 935], "mapped", [967]], [[936, 936], "mapped", [968]], [[937, 937], "mapped", [969]], [[938, 938], "mapped", [970]], [[939, 939], "mapped", [971]], [[940, 961], "valid"], [[962, 962], "deviation", [963]], [[963, 974], "valid"], [[975, 975], "mapped", [983]], [[976, 976], "mapped", [946]], [[977, 977], "mapped", [952]], [[978, 978], "mapped", [965]], [[979, 979], "mapped", [973]], [[980, 980], "mapped", [971]], [[981, 981], "mapped", [966]], [[982, 982], "mapped", [960]], [[983, 983], "valid"], [[984, 984], "mapped", [985]], [[985, 985], "valid"], [[986, 986], "mapped", [987]], [[987, 987], "valid"], [[988, 988], "mapped", [989]], [[989, 989], "valid"], [[990, 990], "mapped", [991]], [[991, 991], "valid"], [[992, 992], "mapped", [993]], [[993, 993], "valid"], [[994, 994], "mapped", [995]], [[995, 995], "valid"], [[996, 996], "mapped", [997]], [[997, 997], "valid"], [[998, 998], "mapped", [999]], [[999, 999], "valid"], [[1000, 1000], "mapped", [1001]], [[1001, 1001], "valid"], [[1002, 1002], "mapped", [1003]], [[1003, 1003], "valid"], [[1004, 1004], "mapped", [1005]], [[1005, 1005], "valid"], [[1006, 1006], "mapped", [1007]], [[1007, 1007], "valid"], [[1008, 1008], "mapped", [954]], [[1009, 1009], "mapped", [961]], [[1010, 1010], "mapped", [963]], [[1011, 1011], "valid"], [[1012, 1012], "mapped", [952]], [[1013, 1013], "mapped", [949]], [[1014, 1014], "valid", [], "NV8"], [[1015, 1015], "mapped", [1016]], [[1016, 1016], "valid"], [[1017, 1017], "mapped", [963]], [[1018, 1018], "mapped", [1019]], [[1019, 1019], "valid"], [[1020, 1020], "valid"], [[1021, 1021], "mapped", [891]], [[1022, 1022], "mapped", [892]], [[1023, 1023], "mapped", [893]], [[1024, 1024], "mapped", [1104]], [[1025, 1025], "mapped", [1105]], [[1026, 1026], "mapped", [1106]], [[1027, 1027], "mapped", [1107]], [[1028, 1028], "mapped", [1108]], [[1029, 1029], "mapped", [1109]], [[1030, 1030], "mapped", [1110]], [[1031, 1031], "mapped", [1111]], [[1032, 1032], "mapped", [1112]], [[1033, 1033], "mapped", [1113]], [[1034, 1034], "mapped", [1114]], [[1035, 1035], "mapped", [1115]], [[1036, 1036], "mapped", [1116]], [[1037, 1037], "mapped", [1117]], [[1038, 1038], "mapped", [1118]], [[1039, 1039], "mapped", [1119]], [[1040, 1040], "mapped", [1072]], [[1041, 1041], "mapped", [1073]], [[1042, 1042], "mapped", [1074]], [[1043, 1043], "mapped", [1075]], [[1044, 1044], "mapped", [1076]], [[1045, 1045], "mapped", [1077]], [[1046, 1046], "mapped", [1078]], [[1047, 1047], "mapped", [1079]], [[1048, 1048], "mapped", [1080]], [[1049, 1049], "mapped", [1081]], [[1050, 1050], "mapped", [1082]], [[1051, 1051], "mapped", [1083]], [[1052, 1052], "mapped", [1084]], [[1053, 1053], "mapped", [1085]], [[1054, 1054], "mapped", [1086]], [[1055, 1055], "mapped", [1087]], [[1056, 1056], "mapped", [1088]], [[1057, 1057], "mapped", [1089]], [[1058, 1058], "mapped", [1090]], [[1059, 1059], "mapped", [1091]], [[1060, 1060], "mapped", [1092]], [[1061, 1061], "mapped", [1093]], [[1062, 1062], "mapped", [1094]], [[1063, 1063], "mapped", [1095]], [[1064, 1064], "mapped", [1096]], [[1065, 1065], "mapped", [1097]], [[1066, 1066], "mapped", [1098]], [[1067, 1067], "mapped", [1099]], [[1068, 1068], "mapped", [1100]], [[1069, 1069], "mapped", [1101]], [[1070, 1070], "mapped", [1102]], [[1071, 1071], "mapped", [1103]], [[1072, 1103], "valid"], [[1104, 1104], "valid"], [[1105, 1116], "valid"], [[1117, 1117], "valid"], [[1118, 1119], "valid"], [[1120, 1120], "mapped", [1121]], [[1121, 1121], "valid"], [[1122, 1122], "mapped", [1123]], [[1123, 1123], "valid"], [[1124, 1124], "mapped", [1125]], [[1125, 1125], "valid"], [[1126, 1126], "mapped", [1127]], [[1127, 1127], "valid"], [[1128, 1128], "mapped", [1129]], [[1129, 1129], "valid"], [[1130, 1130], "mapped", [1131]], [[1131, 1131], "valid"], [[1132, 1132], "mapped", [1133]], [[1133, 1133], "valid"], [[1134, 1134], "mapped", [1135]], [[1135, 1135], "valid"], [[1136, 1136], "mapped", [1137]], [[1137, 1137], "valid"], [[1138, 1138], "mapped", [1139]], [[1139, 1139], "valid"], [[1140, 1140], "mapped", [1141]], [[1141, 1141], "valid"], [[1142, 1142], "mapped", [1143]], [[1143, 1143], "valid"], [[1144, 1144], "mapped", [1145]], [[1145, 1145], "valid"], [[1146, 1146], "mapped", [1147]], [[1147, 1147], "valid"], [[1148, 1148], "mapped", [1149]], [[1149, 1149], "valid"], [[1150, 1150], "mapped", [1151]], [[1151, 1151], "valid"], [[1152, 1152], "mapped", [1153]], [[1153, 1153], "valid"], [[1154, 1154], "valid", [], "NV8"], [[1155, 1158], "valid"], [[1159, 1159], "valid"], [[1160, 1161], "valid", [], "NV8"], [[1162, 1162], "mapped", [1163]], [[1163, 1163], "valid"], [[1164, 1164], "mapped", [1165]], [[1165, 1165], "valid"], [[1166, 1166], "mapped", [1167]], [[1167, 1167], "valid"], [[1168, 1168], "mapped", [1169]], [[1169, 1169], "valid"], [[1170, 1170], "mapped", [1171]], [[1171, 1171], "valid"], [[1172, 1172], "mapped", [1173]], [[1173, 1173], "valid"], [[1174, 1174], "mapped", [1175]], [[1175, 1175], "valid"], [[1176, 1176], "mapped", [1177]], [[1177, 1177], "valid"], [[1178, 1178], "mapped", [1179]], [[1179, 1179], "valid"], [[1180, 1180], "mapped", [1181]], [[1181, 1181], "valid"], [[1182, 1182], "mapped", [1183]], [[1183, 1183], "valid"], [[1184, 1184], "mapped", [1185]], [[1185, 1185], "valid"], [[1186, 1186], "mapped", [1187]], [[1187, 1187], "valid"], [[1188, 1188], "mapped", [1189]], [[1189, 1189], "valid"], [[1190, 1190], "mapped", [1191]], [[1191, 1191], "valid"], [[1192, 1192], "mapped", [1193]], [[1193, 1193], "valid"], [[1194, 1194], "mapped", [1195]], [[1195, 1195], "valid"], [[1196, 1196], "mapped", [1197]], [[1197, 1197], "valid"], [[1198, 1198], "mapped", [1199]], [[1199, 1199], "valid"], [[1200, 1200], "mapped", [1201]], [[1201, 1201], "valid"], [[1202, 1202], "mapped", [1203]], [[1203, 1203], "valid"], [[1204, 1204], "mapped", [1205]], [[1205, 1205], "valid"], [[1206, 1206], "mapped", [1207]], [[1207, 1207], "valid"], [[1208, 1208], "mapped", [1209]], [[1209, 1209], "valid"], [[1210, 1210], "mapped", [1211]], [[1211, 1211], "valid"], [[1212, 1212], "mapped", [1213]], [[1213, 1213], "valid"], [[1214, 1214], "mapped", [1215]], [[1215, 1215], "valid"], [[1216, 1216], "disallowed"], [[1217, 1217], "mapped", [1218]], [[1218, 1218], "valid"], [[1219, 1219], "mapped", [1220]], [[1220, 1220], "valid"], [[1221, 1221], "mapped", [1222]], [[1222, 1222], "valid"], [[1223, 1223], "mapped", [1224]], [[1224, 1224], "valid"], [[1225, 1225], "mapped", [1226]], [[1226, 1226], "valid"], [[1227, 1227], "mapped", [1228]], [[1228, 1228], "valid"], [[1229, 1229], "mapped", [1230]], [[1230, 1230], "valid"], [[1231, 1231], "valid"], [[1232, 1232], "mapped", [1233]], [[1233, 1233], "valid"], [[1234, 1234], "mapped", [1235]], [[1235, 1235], "valid"], [[1236, 1236], "mapped", [1237]], [[1237, 1237], "valid"], [[1238, 1238], "mapped", [1239]], [[1239, 1239], "valid"], [[1240, 1240], "mapped", [1241]], [[1241, 1241], "valid"], [[1242, 1242], "mapped", [1243]], [[1243, 1243], "valid"], [[1244, 1244], "mapped", [1245]], [[1245, 1245], "valid"], [[1246, 1246], "mapped", [1247]], [[1247, 1247], "valid"], [[1248, 1248], "mapped", [1249]], [[1249, 1249], "valid"], [[1250, 1250], "mapped", [1251]], [[1251, 1251], "valid"], [[1252, 1252], "mapped", [1253]], [[1253, 1253], "valid"], [[1254, 1254], "mapped", [1255]], [[1255, 1255], "valid"], [[1256, 1256], "mapped", [1257]], [[1257, 1257], "valid"], [[1258, 1258], "mapped", [1259]], [[1259, 1259], "valid"], [[1260, 1260], "mapped", [1261]], [[1261, 1261], "valid"], [[1262, 1262], "mapped", [1263]], [[1263, 1263], "valid"], [[1264, 1264], "mapped", [1265]], [[1265, 1265], "valid"], [[1266, 1266], "mapped", [1267]], [[1267, 1267], "valid"], [[1268, 1268], "mapped", [1269]], [[1269, 1269], "valid"], [[1270, 1270], "mapped", [1271]], [[1271, 1271], "valid"], [[1272, 1272], "mapped", [1273]], [[1273, 1273], "valid"], [[1274, 1274], "mapped", [1275]], [[1275, 1275], "valid"], [[1276, 1276], "mapped", [1277]], [[1277, 1277], "valid"], [[1278, 1278], "mapped", [1279]], [[1279, 1279], "valid"], [[1280, 1280], "mapped", [1281]], [[1281, 1281], "valid"], [[1282, 1282], "mapped", [1283]], [[1283, 1283], "valid"], [[1284, 1284], "mapped", [1285]], [[1285, 1285], "valid"], [[1286, 1286], "mapped", [1287]], [[1287, 1287], "valid"], [[1288, 1288], "mapped", [1289]], [[1289, 1289], "valid"], [[1290, 1290], "mapped", [1291]], [[1291, 1291], "valid"], [[1292, 1292], "mapped", [1293]], [[1293, 1293], "valid"], [[1294, 1294], "mapped", [1295]], [[1295, 1295], "valid"], [[1296, 1296], "mapped", [1297]], [[1297, 1297], "valid"], [[1298, 1298], "mapped", [1299]], [[1299, 1299], "valid"], [[1300, 1300], "mapped", [1301]], [[1301, 1301], "valid"], [[1302, 1302], "mapped", [1303]], [[1303, 1303], "valid"], [[1304, 1304], "mapped", [1305]], [[1305, 1305], "valid"], [[1306, 1306], "mapped", [1307]], [[1307, 1307], "valid"], [[1308, 1308], "mapped", [1309]], [[1309, 1309], "valid"], [[1310, 1310], "mapped", [1311]], [[1311, 1311], "valid"], [[1312, 1312], "mapped", [1313]], [[1313, 1313], "valid"], [[1314, 1314], "mapped", [1315]], [[1315, 1315], "valid"], [[1316, 1316], "mapped", [1317]], [[1317, 1317], "valid"], [[1318, 1318], "mapped", [1319]], [[1319, 1319], "valid"], [[1320, 1320], "mapped", [1321]], [[1321, 1321], "valid"], [[1322, 1322], "mapped", [1323]], [[1323, 1323], "valid"], [[1324, 1324], "mapped", [1325]], [[1325, 1325], "valid"], [[1326, 1326], "mapped", [1327]], [[1327, 1327], "valid"], [[1328, 1328], "disallowed"], [[1329, 1329], "mapped", [1377]], [[1330, 1330], "mapped", [1378]], [[1331, 1331], "mapped", [1379]], [[1332, 1332], "mapped", [1380]], [[1333, 1333], "mapped", [1381]], [[1334, 1334], "mapped", [1382]], [[1335, 1335], "mapped", [1383]], [[1336, 1336], "mapped", [1384]], [[1337, 1337], "mapped", [1385]], [[1338, 1338], "mapped", [1386]], [[1339, 1339], "mapped", [1387]], [[1340, 1340], "mapped", [1388]], [[1341, 1341], "mapped", [1389]], [[1342, 1342], "mapped", [1390]], [[1343, 1343], "mapped", [1391]], [[1344, 1344], "mapped", [1392]], [[1345, 1345], "mapped", [1393]], [[1346, 1346], "mapped", [1394]], [[1347, 1347], "mapped", [1395]], [[1348, 1348], "mapped", [1396]], [[1349, 1349], "mapped", [1397]], [[1350, 1350], "mapped", [1398]], [[1351, 1351], "mapped", [1399]], [[1352, 1352], "mapped", [1400]], [[1353, 1353], "mapped", [1401]], [[1354, 1354], "mapped", [1402]], [[1355, 1355], "mapped", [1403]], [[1356, 1356], "mapped", [1404]], [[1357, 1357], "mapped", [1405]], [[1358, 1358], "mapped", [1406]], [[1359, 1359], "mapped", [1407]], [[1360, 1360], "mapped", [1408]], [[1361, 1361], "mapped", [1409]], [[1362, 1362], "mapped", [1410]], [[1363, 1363], "mapped", [1411]], [[1364, 1364], "mapped", [1412]], [[1365, 1365], "mapped", [1413]], [[1366, 1366], "mapped", [1414]], [[1367, 1368], "disallowed"], [[1369, 1369], "valid"], [[1370, 1375], "valid", [], "NV8"], [[1376, 1376], "disallowed"], [[1377, 1414], "valid"], [[1415, 1415], "mapped", [1381, 1410]], [[1416, 1416], "disallowed"], [[1417, 1417], "valid", [], "NV8"], [[1418, 1418], "valid", [], "NV8"], [[1419, 1420], "disallowed"], [[1421, 1422], "valid", [], "NV8"], [[1423, 1423], "valid", [], "NV8"], [[1424, 1424], "disallowed"], [[1425, 1441], "valid"], [[1442, 1442], "valid"], [[1443, 1455], "valid"], [[1456, 1465], "valid"], [[1466, 1466], "valid"], [[1467, 1469], "valid"], [[1470, 1470], "valid", [], "NV8"], [[1471, 1471], "valid"], [[1472, 1472], "valid", [], "NV8"], [[1473, 1474], "valid"], [[1475, 1475], "valid", [], "NV8"], [[1476, 1476], "valid"], [[1477, 1477], "valid"], [[1478, 1478], "valid", [], "NV8"], [[1479, 1479], "valid"], [[1480, 1487], "disallowed"], [[1488, 1514], "valid"], [[1515, 1519], "disallowed"], [[1520, 1524], "valid"], [[1525, 1535], "disallowed"], [[1536, 1539], "disallowed"], [[1540, 1540], "disallowed"], [[1541, 1541], "disallowed"], [[1542, 1546], "valid", [], "NV8"], [[1547, 1547], "valid", [], "NV8"], [[1548, 1548], "valid", [], "NV8"], [[1549, 1551], "valid", [], "NV8"], [[1552, 1557], "valid"], [[1558, 1562], "valid"], [[1563, 1563], "valid", [], "NV8"], [[1564, 1564], "disallowed"], [[1565, 1565], "disallowed"], [[1566, 1566], "valid", [], "NV8"], [[1567, 1567], "valid", [], "NV8"], [[1568, 1568], "valid"], [[1569, 1594], "valid"], [[1595, 1599], "valid"], [[1600, 1600], "valid", [], "NV8"], [[1601, 1618], "valid"], [[1619, 1621], "valid"], [[1622, 1624], "valid"], [[1625, 1630], "valid"], [[1631, 1631], "valid"], [[1632, 1641], "valid"], [[1642, 1645], "valid", [], "NV8"], [[1646, 1647], "valid"], [[1648, 1652], "valid"], [[1653, 1653], "mapped", [1575, 1652]], [[1654, 1654], "mapped", [1608, 1652]], [[1655, 1655], "mapped", [1735, 1652]], [[1656, 1656], "mapped", [1610, 1652]], [[1657, 1719], "valid"], [[1720, 1721], "valid"], [[1722, 1726], "valid"], [[1727, 1727], "valid"], [[1728, 1742], "valid"], [[1743, 1743], "valid"], [[1744, 1747], "valid"], [[1748, 1748], "valid", [], "NV8"], [[1749, 1756], "valid"], [[1757, 1757], "disallowed"], [[1758, 1758], "valid", [], "NV8"], [[1759, 1768], "valid"], [[1769, 1769], "valid", [], "NV8"], [[1770, 1773], "valid"], [[1774, 1775], "valid"], [[1776, 1785], "valid"], [[1786, 1790], "valid"], [[1791, 1791], "valid"], [[1792, 1805], "valid", [], "NV8"], [[1806, 1806], "disallowed"], [[1807, 1807], "disallowed"], [[1808, 1836], "valid"], [[1837, 1839], "valid"], [[1840, 1866], "valid"], [[1867, 1868], "disallowed"], [[1869, 1871], "valid"], [[1872, 1901], "valid"], [[1902, 1919], "valid"], [[1920, 1968], "valid"], [[1969, 1969], "valid"], [[1970, 1983], "disallowed"], [[1984, 2037], "valid"], [[2038, 2042], "valid", [], "NV8"], [[2043, 2047], "disallowed"], [[2048, 2093], "valid"], [[2094, 2095], "disallowed"], [[2096, 2110], "valid", [], "NV8"], [[2111, 2111], "disallowed"], [[2112, 2139], "valid"], [[2140, 2141], "disallowed"], [[2142, 2142], "valid", [], "NV8"], [[2143, 2207], "disallowed"], [[2208, 2208], "valid"], [[2209, 2209], "valid"], [[2210, 2220], "valid"], [[2221, 2226], "valid"], [[2227, 2228], "valid"], [[2229, 2274], "disallowed"], [[2275, 2275], "valid"], [[2276, 2302], "valid"], [[2303, 2303], "valid"], [[2304, 2304], "valid"], [[2305, 2307], "valid"], [[2308, 2308], "valid"], [[2309, 2361], "valid"], [[2362, 2363], "valid"], [[2364, 2381], "valid"], [[2382, 2382], "valid"], [[2383, 2383], "valid"], [[2384, 2388], "valid"], [[2389, 2389], "valid"], [[2390, 2391], "valid"], [[2392, 2392], "mapped", [2325, 2364]], [[2393, 2393], "mapped", [2326, 2364]], [[2394, 2394], "mapped", [2327, 2364]], [[2395, 2395], "mapped", [2332, 2364]], [[2396, 2396], "mapped", [2337, 2364]], [[2397, 2397], "mapped", [2338, 2364]], [[2398, 2398], "mapped", [2347, 2364]], [[2399, 2399], "mapped", [2351, 2364]], [[2400, 2403], "valid"], [[2404, 2405], "valid", [], "NV8"], [[2406, 2415], "valid"], [[2416, 2416], "valid", [], "NV8"], [[2417, 2418], "valid"], [[2419, 2423], "valid"], [[2424, 2424], "valid"], [[2425, 2426], "valid"], [[2427, 2428], "valid"], [[2429, 2429], "valid"], [[2430, 2431], "valid"], [[2432, 2432], "valid"], [[2433, 2435], "valid"], [[2436, 2436], "disallowed"], [[2437, 2444], "valid"], [[2445, 2446], "disallowed"], [[2447, 2448], "valid"], [[2449, 2450], "disallowed"], [[2451, 2472], "valid"], [[2473, 2473], "disallowed"], [[2474, 2480], "valid"], [[2481, 2481], "disallowed"], [[2482, 2482], "valid"], [[2483, 2485], "disallowed"], [[2486, 2489], "valid"], [[2490, 2491], "disallowed"], [[2492, 2492], "valid"], [[2493, 2493], "valid"], [[2494, 2500], "valid"], [[2501, 2502], "disallowed"], [[2503, 2504], "valid"], [[2505, 2506], "disallowed"], [[2507, 2509], "valid"], [[2510, 2510], "valid"], [[2511, 2518], "disallowed"], [[2519, 2519], "valid"], [[2520, 2523], "disallowed"], [[2524, 2524], "mapped", [2465, 2492]], [[2525, 2525], "mapped", [2466, 2492]], [[2526, 2526], "disallowed"], [[2527, 2527], "mapped", [2479, 2492]], [[2528, 2531], "valid"], [[2532, 2533], "disallowed"], [[2534, 2545], "valid"], [[2546, 2554], "valid", [], "NV8"], [[2555, 2555], "valid", [], "NV8"], [[2556, 2560], "disallowed"], [[2561, 2561], "valid"], [[2562, 2562], "valid"], [[2563, 2563], "valid"], [[2564, 2564], "disallowed"], [[2565, 2570], "valid"], [[2571, 2574], "disallowed"], [[2575, 2576], "valid"], [[2577, 2578], "disallowed"], [[2579, 2600], "valid"], [[2601, 2601], "disallowed"], [[2602, 2608], "valid"], [[2609, 2609], "disallowed"], [[2610, 2610], "valid"], [[2611, 2611], "mapped", [2610, 2620]], [[2612, 2612], "disallowed"], [[2613, 2613], "valid"], [[2614, 2614], "mapped", [2616, 2620]], [[2615, 2615], "disallowed"], [[2616, 2617], "valid"], [[2618, 2619], "disallowed"], [[2620, 2620], "valid"], [[2621, 2621], "disallowed"], [[2622, 2626], "valid"], [[2627, 2630], "disallowed"], [[2631, 2632], "valid"], [[2633, 2634], "disallowed"], [[2635, 2637], "valid"], [[2638, 2640], "disallowed"], [[2641, 2641], "valid"], [[2642, 2648], "disallowed"], [[2649, 2649], "mapped", [2582, 2620]], [[2650, 2650], "mapped", [2583, 2620]], [[2651, 2651], "mapped", [2588, 2620]], [[2652, 2652], "valid"], [[2653, 2653], "disallowed"], [[2654, 2654], "mapped", [2603, 2620]], [[2655, 2661], "disallowed"], [[2662, 2676], "valid"], [[2677, 2677], "valid"], [[2678, 2688], "disallowed"], [[2689, 2691], "valid"], [[2692, 2692], "disallowed"], [[2693, 2699], "valid"], [[2700, 2700], "valid"], [[2701, 2701], "valid"], [[2702, 2702], "disallowed"], [[2703, 2705], "valid"], [[2706, 2706], "disallowed"], [[2707, 2728], "valid"], [[2729, 2729], "disallowed"], [[2730, 2736], "valid"], [[2737, 2737], "disallowed"], [[2738, 2739], "valid"], [[2740, 2740], "disallowed"], [[2741, 2745], "valid"], [[2746, 2747], "disallowed"], [[2748, 2757], "valid"], [[2758, 2758], "disallowed"], [[2759, 2761], "valid"], [[2762, 2762], "disallowed"], [[2763, 2765], "valid"], [[2766, 2767], "disallowed"], [[2768, 2768], "valid"], [[2769, 2783], "disallowed"], [[2784, 2784], "valid"], [[2785, 2787], "valid"], [[2788, 2789], "disallowed"], [[2790, 2799], "valid"], [[2800, 2800], "valid", [], "NV8"], [[2801, 2801], "valid", [], "NV8"], [[2802, 2808], "disallowed"], [[2809, 2809], "valid"], [[2810, 2816], "disallowed"], [[2817, 2819], "valid"], [[2820, 2820], "disallowed"], [[2821, 2828], "valid"], [[2829, 2830], "disallowed"], [[2831, 2832], "valid"], [[2833, 2834], "disallowed"], [[2835, 2856], "valid"], [[2857, 2857], "disallowed"], [[2858, 2864], "valid"], [[2865, 2865], "disallowed"], [[2866, 2867], "valid"], [[2868, 2868], "disallowed"], [[2869, 2869], "valid"], [[2870, 2873], "valid"], [[2874, 2875], "disallowed"], [[2876, 2883], "valid"], [[2884, 2884], "valid"], [[2885, 2886], "disallowed"], [[2887, 2888], "valid"], [[2889, 2890], "disallowed"], [[2891, 2893], "valid"], [[2894, 2901], "disallowed"], [[2902, 2903], "valid"], [[2904, 2907], "disallowed"], [[2908, 2908], "mapped", [2849, 2876]], [[2909, 2909], "mapped", [2850, 2876]], [[2910, 2910], "disallowed"], [[2911, 2913], "valid"], [[2914, 2915], "valid"], [[2916, 2917], "disallowed"], [[2918, 2927], "valid"], [[2928, 2928], "valid", [], "NV8"], [[2929, 2929], "valid"], [[2930, 2935], "valid", [], "NV8"], [[2936, 2945], "disallowed"], [[2946, 2947], "valid"], [[2948, 2948], "disallowed"], [[2949, 2954], "valid"], [[2955, 2957], "disallowed"], [[2958, 2960], "valid"], [[2961, 2961], "disallowed"], [[2962, 2965], "valid"], [[2966, 2968], "disallowed"], [[2969, 2970], "valid"], [[2971, 2971], "disallowed"], [[2972, 2972], "valid"], [[2973, 2973], "disallowed"], [[2974, 2975], "valid"], [[2976, 2978], "disallowed"], [[2979, 2980], "valid"], [[2981, 2983], "disallowed"], [[2984, 2986], "valid"], [[2987, 2989], "disallowed"], [[2990, 2997], "valid"], [[2998, 2998], "valid"], [[2999, 3001], "valid"], [[3002, 3005], "disallowed"], [[3006, 3010], "valid"], [[3011, 3013], "disallowed"], [[3014, 3016], "valid"], [[3017, 3017], "disallowed"], [[3018, 3021], "valid"], [[3022, 3023], "disallowed"], [[3024, 3024], "valid"], [[3025, 3030], "disallowed"], [[3031, 3031], "valid"], [[3032, 3045], "disallowed"], [[3046, 3046], "valid"], [[3047, 3055], "valid"], [[3056, 3058], "valid", [], "NV8"], [[3059, 3066], "valid", [], "NV8"], [[3067, 3071], "disallowed"], [[3072, 3072], "valid"], [[3073, 3075], "valid"], [[3076, 3076], "disallowed"], [[3077, 3084], "valid"], [[3085, 3085], "disallowed"], [[3086, 3088], "valid"], [[3089, 3089], "disallowed"], [[3090, 3112], "valid"], [[3113, 3113], "disallowed"], [[3114, 3123], "valid"], [[3124, 3124], "valid"], [[3125, 3129], "valid"], [[3130, 3132], "disallowed"], [[3133, 3133], "valid"], [[3134, 3140], "valid"], [[3141, 3141], "disallowed"], [[3142, 3144], "valid"], [[3145, 3145], "disallowed"], [[3146, 3149], "valid"], [[3150, 3156], "disallowed"], [[3157, 3158], "valid"], [[3159, 3159], "disallowed"], [[3160, 3161], "valid"], [[3162, 3162], "valid"], [[3163, 3167], "disallowed"], [[3168, 3169], "valid"], [[3170, 3171], "valid"], [[3172, 3173], "disallowed"], [[3174, 3183], "valid"], [[3184, 3191], "disallowed"], [[3192, 3199], "valid", [], "NV8"], [[3200, 3200], "disallowed"], [[3201, 3201], "valid"], [[3202, 3203], "valid"], [[3204, 3204], "disallowed"], [[3205, 3212], "valid"], [[3213, 3213], "disallowed"], [[3214, 3216], "valid"], [[3217, 3217], "disallowed"], [[3218, 3240], "valid"], [[3241, 3241], "disallowed"], [[3242, 3251], "valid"], [[3252, 3252], "disallowed"], [[3253, 3257], "valid"], [[3258, 3259], "disallowed"], [[3260, 3261], "valid"], [[3262, 3268], "valid"], [[3269, 3269], "disallowed"], [[3270, 3272], "valid"], [[3273, 3273], "disallowed"], [[3274, 3277], "valid"], [[3278, 3284], "disallowed"], [[3285, 3286], "valid"], [[3287, 3293], "disallowed"], [[3294, 3294], "valid"], [[3295, 3295], "disallowed"], [[3296, 3297], "valid"], [[3298, 3299], "valid"], [[3300, 3301], "disallowed"], [[3302, 3311], "valid"], [[3312, 3312], "disallowed"], [[3313, 3314], "valid"], [[3315, 3328], "disallowed"], [[3329, 3329], "valid"], [[3330, 3331], "valid"], [[3332, 3332], "disallowed"], [[3333, 3340], "valid"], [[3341, 3341], "disallowed"], [[3342, 3344], "valid"], [[3345, 3345], "disallowed"], [[3346, 3368], "valid"], [[3369, 3369], "valid"], [[3370, 3385], "valid"], [[3386, 3386], "valid"], [[3387, 3388], "disallowed"], [[3389, 3389], "valid"], [[3390, 3395], "valid"], [[3396, 3396], "valid"], [[3397, 3397], "disallowed"], [[3398, 3400], "valid"], [[3401, 3401], "disallowed"], [[3402, 3405], "valid"], [[3406, 3406], "valid"], [[3407, 3414], "disallowed"], [[3415, 3415], "valid"], [[3416, 3422], "disallowed"], [[3423, 3423], "valid"], [[3424, 3425], "valid"], [[3426, 3427], "valid"], [[3428, 3429], "disallowed"], [[3430, 3439], "valid"], [[3440, 3445], "valid", [], "NV8"], [[3446, 3448], "disallowed"], [[3449, 3449], "valid", [], "NV8"], [[3450, 3455], "valid"], [[3456, 3457], "disallowed"], [[3458, 3459], "valid"], [[3460, 3460], "disallowed"], [[3461, 3478], "valid"], [[3479, 3481], "disallowed"], [[3482, 3505], "valid"], [[3506, 3506], "disallowed"], [[3507, 3515], "valid"], [[3516, 3516], "disallowed"], [[3517, 3517], "valid"], [[3518, 3519], "disallowed"], [[3520, 3526], "valid"], [[3527, 3529], "disallowed"], [[3530, 3530], "valid"], [[3531, 3534], "disallowed"], [[3535, 3540], "valid"], [[3541, 3541], "disallowed"], [[3542, 3542], "valid"], [[3543, 3543], "disallowed"], [[3544, 3551], "valid"], [[3552, 3557], "disallowed"], [[3558, 3567], "valid"], [[3568, 3569], "disallowed"], [[3570, 3571], "valid"], [[3572, 3572], "valid", [], "NV8"], [[3573, 3584], "disallowed"], [[3585, 3634], "valid"], [[3635, 3635], "mapped", [3661, 3634]], [[3636, 3642], "valid"], [[3643, 3646], "disallowed"], [[3647, 3647], "valid", [], "NV8"], [[3648, 3662], "valid"], [[3663, 3663], "valid", [], "NV8"], [[3664, 3673], "valid"], [[3674, 3675], "valid", [], "NV8"], [[3676, 3712], "disallowed"], [[3713, 3714], "valid"], [[3715, 3715], "disallowed"], [[3716, 3716], "valid"], [[3717, 3718], "disallowed"], [[3719, 3720], "valid"], [[3721, 3721], "disallowed"], [[3722, 3722], "valid"], [[3723, 3724], "disallowed"], [[3725, 3725], "valid"], [[3726, 3731], "disallowed"], [[3732, 3735], "valid"], [[3736, 3736], "disallowed"], [[3737, 3743], "valid"], [[3744, 3744], "disallowed"], [[3745, 3747], "valid"], [[3748, 3748], "disallowed"], [[3749, 3749], "valid"], [[3750, 3750], "disallowed"], [[3751, 3751], "valid"], [[3752, 3753], "disallowed"], [[3754, 3755], "valid"], [[3756, 3756], "disallowed"], [[3757, 3762], "valid"], [[3763, 3763], "mapped", [3789, 3762]], [[3764, 3769], "valid"], [[3770, 3770], "disallowed"], [[3771, 3773], "valid"], [[3774, 3775], "disallowed"], [[3776, 3780], "valid"], [[3781, 3781], "disallowed"], [[3782, 3782], "valid"], [[3783, 3783], "disallowed"], [[3784, 3789], "valid"], [[3790, 3791], "disallowed"], [[3792, 3801], "valid"], [[3802, 3803], "disallowed"], [[3804, 3804], "mapped", [3755, 3737]], [[3805, 3805], "mapped", [3755, 3745]], [[3806, 3807], "valid"], [[3808, 3839], "disallowed"], [[3840, 3840], "valid"], [[3841, 3850], "valid", [], "NV8"], [[3851, 3851], "valid"], [[3852, 3852], "mapped", [3851]], [[3853, 3863], "valid", [], "NV8"], [[3864, 3865], "valid"], [[3866, 3871], "valid", [], "NV8"], [[3872, 3881], "valid"], [[3882, 3892], "valid", [], "NV8"], [[3893, 3893], "valid"], [[3894, 3894], "valid", [], "NV8"], [[3895, 3895], "valid"], [[3896, 3896], "valid", [], "NV8"], [[3897, 3897], "valid"], [[3898, 3901], "valid", [], "NV8"], [[3902, 3906], "valid"], [[3907, 3907], "mapped", [3906, 4023]], [[3908, 3911], "valid"], [[3912, 3912], "disallowed"], [[3913, 3916], "valid"], [[3917, 3917], "mapped", [3916, 4023]], [[3918, 3921], "valid"], [[3922, 3922], "mapped", [3921, 4023]], [[3923, 3926], "valid"], [[3927, 3927], "mapped", [3926, 4023]], [[3928, 3931], "valid"], [[3932, 3932], "mapped", [3931, 4023]], [[3933, 3944], "valid"], [[3945, 3945], "mapped", [3904, 4021]], [[3946, 3946], "valid"], [[3947, 3948], "valid"], [[3949, 3952], "disallowed"], [[3953, 3954], "valid"], [[3955, 3955], "mapped", [3953, 3954]], [[3956, 3956], "valid"], [[3957, 3957], "mapped", [3953, 3956]], [[3958, 3958], "mapped", [4018, 3968]], [[3959, 3959], "mapped", [4018, 3953, 3968]], [[3960, 3960], "mapped", [4019, 3968]], [[3961, 3961], "mapped", [4019, 3953, 3968]], [[3962, 3968], "valid"], [[3969, 3969], "mapped", [3953, 3968]], [[3970, 3972], "valid"], [[3973, 3973], "valid", [], "NV8"], [[3974, 3979], "valid"], [[3980, 3983], "valid"], [[3984, 3986], "valid"], [[3987, 3987], "mapped", [3986, 4023]], [[3988, 3989], "valid"], [[3990, 3990], "valid"], [[3991, 3991], "valid"], [[3992, 3992], "disallowed"], [[3993, 3996], "valid"], [[3997, 3997], "mapped", [3996, 4023]], [[3998, 4001], "valid"], [[4002, 4002], "mapped", [4001, 4023]], [[4003, 4006], "valid"], [[4007, 4007], "mapped", [4006, 4023]], [[4008, 4011], "valid"], [[4012, 4012], "mapped", [4011, 4023]], [[4013, 4013], "valid"], [[4014, 4016], "valid"], [[4017, 4023], "valid"], [[4024, 4024], "valid"], [[4025, 4025], "mapped", [3984, 4021]], [[4026, 4028], "valid"], [[4029, 4029], "disallowed"], [[4030, 4037], "valid", [], "NV8"], [[4038, 4038], "valid"], [[4039, 4044], "valid", [], "NV8"], [[4045, 4045], "disallowed"], [[4046, 4046], "valid", [], "NV8"], [[4047, 4047], "valid", [], "NV8"], [[4048, 4049], "valid", [], "NV8"], [[4050, 4052], "valid", [], "NV8"], [[4053, 4056], "valid", [], "NV8"], [[4057, 4058], "valid", [], "NV8"], [[4059, 4095], "disallowed"], [[4096, 4129], "valid"], [[4130, 4130], "valid"], [[4131, 4135], "valid"], [[4136, 4136], "valid"], [[4137, 4138], "valid"], [[4139, 4139], "valid"], [[4140, 4146], "valid"], [[4147, 4149], "valid"], [[4150, 4153], "valid"], [[4154, 4159], "valid"], [[4160, 4169], "valid"], [[4170, 4175], "valid", [], "NV8"], [[4176, 4185], "valid"], [[4186, 4249], "valid"], [[4250, 4253], "valid"], [[4254, 4255], "valid", [], "NV8"], [[4256, 4293], "disallowed"], [[4294, 4294], "disallowed"], [[4295, 4295], "mapped", [11559]], [[4296, 4300], "disallowed"], [[4301, 4301], "mapped", [11565]], [[4302, 4303], "disallowed"], [[4304, 4342], "valid"], [[4343, 4344], "valid"], [[4345, 4346], "valid"], [[4347, 4347], "valid", [], "NV8"], [[4348, 4348], "mapped", [4316]], [[4349, 4351], "valid"], [[4352, 4441], "valid", [], "NV8"], [[4442, 4446], "valid", [], "NV8"], [[4447, 4448], "disallowed"], [[4449, 4514], "valid", [], "NV8"], [[4515, 4519], "valid", [], "NV8"], [[4520, 4601], "valid", [], "NV8"], [[4602, 4607], "valid", [], "NV8"], [[4608, 4614], "valid"], [[4615, 4615], "valid"], [[4616, 4678], "valid"], [[4679, 4679], "valid"], [[4680, 4680], "valid"], [[4681, 4681], "disallowed"], [[4682, 4685], "valid"], [[4686, 4687], "disallowed"], [[4688, 4694], "valid"], [[4695, 4695], "disallowed"], [[4696, 4696], "valid"], [[4697, 4697], "disallowed"], [[4698, 4701], "valid"], [[4702, 4703], "disallowed"], [[4704, 4742], "valid"], [[4743, 4743], "valid"], [[4744, 4744], "valid"], [[4745, 4745], "disallowed"], [[4746, 4749], "valid"], [[4750, 4751], "disallowed"], [[4752, 4782], "valid"], [[4783, 4783], "valid"], [[4784, 4784], "valid"], [[4785, 4785], "disallowed"], [[4786, 4789], "valid"], [[4790, 4791], "disallowed"], [[4792, 4798], "valid"], [[4799, 4799], "disallowed"], [[4800, 4800], "valid"], [[4801, 4801], "disallowed"], [[4802, 4805], "valid"], [[4806, 4807], "disallowed"], [[4808, 4814], "valid"], [[4815, 4815], "valid"], [[4816, 4822], "valid"], [[4823, 4823], "disallowed"], [[4824, 4846], "valid"], [[4847, 4847], "valid"], [[4848, 4878], "valid"], [[4879, 4879], "valid"], [[4880, 4880], "valid"], [[4881, 4881], "disallowed"], [[4882, 4885], "valid"], [[4886, 4887], "disallowed"], [[4888, 4894], "valid"], [[4895, 4895], "valid"], [[4896, 4934], "valid"], [[4935, 4935], "valid"], [[4936, 4954], "valid"], [[4955, 4956], "disallowed"], [[4957, 4958], "valid"], [[4959, 4959], "valid"], [[4960, 4960], "valid", [], "NV8"], [[4961, 4988], "valid", [], "NV8"], [[4989, 4991], "disallowed"], [[4992, 5007], "valid"], [[5008, 5017], "valid", [], "NV8"], [[5018, 5023], "disallowed"], [[5024, 5108], "valid"], [[5109, 5109], "valid"], [[5110, 5111], "disallowed"], [[5112, 5112], "mapped", [5104]], [[5113, 5113], "mapped", [5105]], [[5114, 5114], "mapped", [5106]], [[5115, 5115], "mapped", [5107]], [[5116, 5116], "mapped", [5108]], [[5117, 5117], "mapped", [5109]], [[5118, 5119], "disallowed"], [[5120, 5120], "valid", [], "NV8"], [[5121, 5740], "valid"], [[5741, 5742], "valid", [], "NV8"], [[5743, 5750], "valid"], [[5751, 5759], "valid"], [[5760, 5760], "disallowed"], [[5761, 5786], "valid"], [[5787, 5788], "valid", [], "NV8"], [[5789, 5791], "disallowed"], [[5792, 5866], "valid"], [[5867, 5872], "valid", [], "NV8"], [[5873, 5880], "valid"], [[5881, 5887], "disallowed"], [[5888, 5900], "valid"], [[5901, 5901], "disallowed"], [[5902, 5908], "valid"], [[5909, 5919], "disallowed"], [[5920, 5940], "valid"], [[5941, 5942], "valid", [], "NV8"], [[5943, 5951], "disallowed"], [[5952, 5971], "valid"], [[5972, 5983], "disallowed"], [[5984, 5996], "valid"], [[5997, 5997], "disallowed"], [[5998, 6000], "valid"], [[6001, 6001], "disallowed"], [[6002, 6003], "valid"], [[6004, 6015], "disallowed"], [[6016, 6067], "valid"], [[6068, 6069], "disallowed"], [[6070, 6099], "valid"], [[6100, 6102], "valid", [], "NV8"], [[6103, 6103], "valid"], [[6104, 6107], "valid", [], "NV8"], [[6108, 6108], "valid"], [[6109, 6109], "valid"], [[6110, 6111], "disallowed"], [[6112, 6121], "valid"], [[6122, 6127], "disallowed"], [[6128, 6137], "valid", [], "NV8"], [[6138, 6143], "disallowed"], [[6144, 6149], "valid", [], "NV8"], [[6150, 6150], "disallowed"], [[6151, 6154], "valid", [], "NV8"], [[6155, 6157], "ignored"], [[6158, 6158], "disallowed"], [[6159, 6159], "disallowed"], [[6160, 6169], "valid"], [[6170, 6175], "disallowed"], [[6176, 6263], "valid"], [[6264, 6271], "disallowed"], [[6272, 6313], "valid"], [[6314, 6314], "valid"], [[6315, 6319], "disallowed"], [[6320, 6389], "valid"], [[6390, 6399], "disallowed"], [[6400, 6428], "valid"], [[6429, 6430], "valid"], [[6431, 6431], "disallowed"], [[6432, 6443], "valid"], [[6444, 6447], "disallowed"], [[6448, 6459], "valid"], [[6460, 6463], "disallowed"], [[6464, 6464], "valid", [], "NV8"], [[6465, 6467], "disallowed"], [[6468, 6469], "valid", [], "NV8"], [[6470, 6509], "valid"], [[6510, 6511], "disallowed"], [[6512, 6516], "valid"], [[6517, 6527], "disallowed"], [[6528, 6569], "valid"], [[6570, 6571], "valid"], [[6572, 6575], "disallowed"], [[6576, 6601], "valid"], [[6602, 6607], "disallowed"], [[6608, 6617], "valid"], [[6618, 6618], "valid", [], "XV8"], [[6619, 6621], "disallowed"], [[6622, 6623], "valid", [], "NV8"], [[6624, 6655], "valid", [], "NV8"], [[6656, 6683], "valid"], [[6684, 6685], "disallowed"], [[6686, 6687], "valid", [], "NV8"], [[6688, 6750], "valid"], [[6751, 6751], "disallowed"], [[6752, 6780], "valid"], [[6781, 6782], "disallowed"], [[6783, 6793], "valid"], [[6794, 6799], "disallowed"], [[6800, 6809], "valid"], [[6810, 6815], "disallowed"], [[6816, 6822], "valid", [], "NV8"], [[6823, 6823], "valid"], [[6824, 6829], "valid", [], "NV8"], [[6830, 6831], "disallowed"], [[6832, 6845], "valid"], [[6846, 6846], "valid", [], "NV8"], [[6847, 6911], "disallowed"], [[6912, 6987], "valid"], [[6988, 6991], "disallowed"], [[6992, 7001], "valid"], [[7002, 7018], "valid", [], "NV8"], [[7019, 7027], "valid"], [[7028, 7036], "valid", [], "NV8"], [[7037, 7039], "disallowed"], [[7040, 7082], "valid"], [[7083, 7085], "valid"], [[7086, 7097], "valid"], [[7098, 7103], "valid"], [[7104, 7155], "valid"], [[7156, 7163], "disallowed"], [[7164, 7167], "valid", [], "NV8"], [[7168, 7223], "valid"], [[7224, 7226], "disallowed"], [[7227, 7231], "valid", [], "NV8"], [[7232, 7241], "valid"], [[7242, 7244], "disallowed"], [[7245, 7293], "valid"], [[7294, 7295], "valid", [], "NV8"], [[7296, 7359], "disallowed"], [[7360, 7367], "valid", [], "NV8"], [[7368, 7375], "disallowed"], [[7376, 7378], "valid"], [[7379, 7379], "valid", [], "NV8"], [[7380, 7410], "valid"], [[7411, 7414], "valid"], [[7415, 7415], "disallowed"], [[7416, 7417], "valid"], [[7418, 7423], "disallowed"], [[7424, 7467], "valid"], [[7468, 7468], "mapped", [97]], [[7469, 7469], "mapped", [230]], [[7470, 7470], "mapped", [98]], [[7471, 7471], "valid"], [[7472, 7472], "mapped", [100]], [[7473, 7473], "mapped", [101]], [[7474, 7474], "mapped", [477]], [[7475, 7475], "mapped", [103]], [[7476, 7476], "mapped", [104]], [[7477, 7477], "mapped", [105]], [[7478, 7478], "mapped", [106]], [[7479, 7479], "mapped", [107]], [[7480, 7480], "mapped", [108]], [[7481, 7481], "mapped", [109]], [[7482, 7482], "mapped", [110]], [[7483, 7483], "valid"], [[7484, 7484], "mapped", [111]], [[7485, 7485], "mapped", [547]], [[7486, 7486], "mapped", [112]], [[7487, 7487], "mapped", [114]], [[7488, 7488], "mapped", [116]], [[7489, 7489], "mapped", [117]], [[7490, 7490], "mapped", [119]], [[7491, 7491], "mapped", [97]], [[7492, 7492], "mapped", [592]], [[7493, 7493], "mapped", [593]], [[7494, 7494], "mapped", [7426]], [[7495, 7495], "mapped", [98]], [[7496, 7496], "mapped", [100]], [[7497, 7497], "mapped", [101]], [[7498, 7498], "mapped", [601]], [[7499, 7499], "mapped", [603]], [[7500, 7500], "mapped", [604]], [[7501, 7501], "mapped", [103]], [[7502, 7502], "valid"], [[7503, 7503], "mapped", [107]], [[7504, 7504], "mapped", [109]], [[7505, 7505], "mapped", [331]], [[7506, 7506], "mapped", [111]], [[7507, 7507], "mapped", [596]], [[7508, 7508], "mapped", [7446]], [[7509, 7509], "mapped", [7447]], [[7510, 7510], "mapped", [112]], [[7511, 7511], "mapped", [116]], [[7512, 7512], "mapped", [117]], [[7513, 7513], "mapped", [7453]], [[7514, 7514], "mapped", [623]], [[7515, 7515], "mapped", [118]], [[7516, 7516], "mapped", [7461]], [[7517, 7517], "mapped", [946]], [[7518, 7518], "mapped", [947]], [[7519, 7519], "mapped", [948]], [[7520, 7520], "mapped", [966]], [[7521, 7521], "mapped", [967]], [[7522, 7522], "mapped", [105]], [[7523, 7523], "mapped", [114]], [[7524, 7524], "mapped", [117]], [[7525, 7525], "mapped", [118]], [[7526, 7526], "mapped", [946]], [[7527, 7527], "mapped", [947]], [[7528, 7528], "mapped", [961]], [[7529, 7529], "mapped", [966]], [[7530, 7530], "mapped", [967]], [[7531, 7531], "valid"], [[7532, 7543], "valid"], [[7544, 7544], "mapped", [1085]], [[7545, 7578], "valid"], [[7579, 7579], "mapped", [594]], [[7580, 7580], "mapped", [99]], [[7581, 7581], "mapped", [597]], [[7582, 7582], "mapped", [240]], [[7583, 7583], "mapped", [604]], [[7584, 7584], "mapped", [102]], [[7585, 7585], "mapped", [607]], [[7586, 7586], "mapped", [609]], [[7587, 7587], "mapped", [613]], [[7588, 7588], "mapped", [616]], [[7589, 7589], "mapped", [617]], [[7590, 7590], "mapped", [618]], [[7591, 7591], "mapped", [7547]], [[7592, 7592], "mapped", [669]], [[7593, 7593], "mapped", [621]], [[7594, 7594], "mapped", [7557]], [[7595, 7595], "mapped", [671]], [[7596, 7596], "mapped", [625]], [[7597, 7597], "mapped", [624]], [[7598, 7598], "mapped", [626]], [[7599, 7599], "mapped", [627]], [[7600, 7600], "mapped", [628]], [[7601, 7601], "mapped", [629]], [[7602, 7602], "mapped", [632]], [[7603, 7603], "mapped", [642]], [[7604, 7604], "mapped", [643]], [[7605, 7605], "mapped", [427]], [[7606, 7606], "mapped", [649]], [[7607, 7607], "mapped", [650]], [[7608, 7608], "mapped", [7452]], [[7609, 7609], "mapped", [651]], [[7610, 7610], "mapped", [652]], [[7611, 7611], "mapped", [122]], [[7612, 7612], "mapped", [656]], [[7613, 7613], "mapped", [657]], [[7614, 7614], "mapped", [658]], [[7615, 7615], "mapped", [952]], [[7616, 7619], "valid"], [[7620, 7626], "valid"], [[7627, 7654], "valid"], [[7655, 7669], "valid"], [[7670, 7675], "disallowed"], [[7676, 7676], "valid"], [[7677, 7677], "valid"], [[7678, 7679], "valid"], [[7680, 7680], "mapped", [7681]], [[7681, 7681], "valid"], [[7682, 7682], "mapped", [7683]], [[7683, 7683], "valid"], [[7684, 7684], "mapped", [7685]], [[7685, 7685], "valid"], [[7686, 7686], "mapped", [7687]], [[7687, 7687], "valid"], [[7688, 7688], "mapped", [7689]], [[7689, 7689], "valid"], [[7690, 7690], "mapped", [7691]], [[7691, 7691], "valid"], [[7692, 7692], "mapped", [7693]], [[7693, 7693], "valid"], [[7694, 7694], "mapped", [7695]], [[7695, 7695], "valid"], [[7696, 7696], "mapped", [7697]], [[7697, 7697], "valid"], [[7698, 7698], "mapped", [7699]], [[7699, 7699], "valid"], [[7700, 7700], "mapped", [7701]], [[7701, 7701], "valid"], [[7702, 7702], "mapped", [7703]], [[7703, 7703], "valid"], [[7704, 7704], "mapped", [7705]], [[7705, 7705], "valid"], [[7706, 7706], "mapped", [7707]], [[7707, 7707], "valid"], [[7708, 7708], "mapped", [7709]], [[7709, 7709], "valid"], [[7710, 7710], "mapped", [7711]], [[7711, 7711], "valid"], [[7712, 7712], "mapped", [7713]], [[7713, 7713], "valid"], [[7714, 7714], "mapped", [7715]], [[7715, 7715], "valid"], [[7716, 7716], "mapped", [7717]], [[7717, 7717], "valid"], [[7718, 7718], "mapped", [7719]], [[7719, 7719], "valid"], [[7720, 7720], "mapped", [7721]], [[7721, 7721], "valid"], [[7722, 7722], "mapped", [7723]], [[7723, 7723], "valid"], [[7724, 7724], "mapped", [7725]], [[7725, 7725], "valid"], [[7726, 7726], "mapped", [7727]], [[7727, 7727], "valid"], [[7728, 7728], "mapped", [7729]], [[7729, 7729], "valid"], [[7730, 7730], "mapped", [7731]], [[7731, 7731], "valid"], [[7732, 7732], "mapped", [7733]], [[7733, 7733], "valid"], [[7734, 7734], "mapped", [7735]], [[7735, 7735], "valid"], [[7736, 7736], "mapped", [7737]], [[7737, 7737], "valid"], [[7738, 7738], "mapped", [7739]], [[7739, 7739], "valid"], [[7740, 7740], "mapped", [7741]], [[7741, 7741], "valid"], [[7742, 7742], "mapped", [7743]], [[7743, 7743], "valid"], [[7744, 7744], "mapped", [7745]], [[7745, 7745], "valid"], [[7746, 7746], "mapped", [7747]], [[7747, 7747], "valid"], [[7748, 7748], "mapped", [7749]], [[7749, 7749], "valid"], [[7750, 7750], "mapped", [7751]], [[7751, 7751], "valid"], [[7752, 7752], "mapped", [7753]], [[7753, 7753], "valid"], [[7754, 7754], "mapped", [7755]], [[7755, 7755], "valid"], [[7756, 7756], "mapped", [7757]], [[7757, 7757], "valid"], [[7758, 7758], "mapped", [7759]], [[7759, 7759], "valid"], [[7760, 7760], "mapped", [7761]], [[7761, 7761], "valid"], [[7762, 7762], "mapped", [7763]], [[7763, 7763], "valid"], [[7764, 7764], "mapped", [7765]], [[7765, 7765], "valid"], [[7766, 7766], "mapped", [7767]], [[7767, 7767], "valid"], [[7768, 7768], "mapped", [7769]], [[7769, 7769], "valid"], [[7770, 7770], "mapped", [7771]], [[7771, 7771], "valid"], [[7772, 7772], "mapped", [7773]], [[7773, 7773], "valid"], [[7774, 7774], "mapped", [7775]], [[7775, 7775], "valid"], [[7776, 7776], "mapped", [7777]], [[7777, 7777], "valid"], [[7778, 7778], "mapped", [7779]], [[7779, 7779], "valid"], [[7780, 7780], "mapped", [7781]], [[7781, 7781], "valid"], [[7782, 7782], "mapped", [7783]], [[7783, 7783], "valid"], [[7784, 7784], "mapped", [7785]], [[7785, 7785], "valid"], [[7786, 7786], "mapped", [7787]], [[7787, 7787], "valid"], [[7788, 7788], "mapped", [7789]], [[7789, 7789], "valid"], [[7790, 7790], "mapped", [7791]], [[7791, 7791], "valid"], [[7792, 7792], "mapped", [7793]], [[7793, 7793], "valid"], [[7794, 7794], "mapped", [7795]], [[7795, 7795], "valid"], [[7796, 7796], "mapped", [7797]], [[7797, 7797], "valid"], [[7798, 7798], "mapped", [7799]], [[7799, 7799], "valid"], [[7800, 7800], "mapped", [7801]], [[7801, 7801], "valid"], [[7802, 7802], "mapped", [7803]], [[7803, 7803], "valid"], [[7804, 7804], "mapped", [7805]], [[7805, 7805], "valid"], [[7806, 7806], "mapped", [7807]], [[7807, 7807], "valid"], [[7808, 7808], "mapped", [7809]], [[7809, 7809], "valid"], [[7810, 7810], "mapped", [7811]], [[7811, 7811], "valid"], [[7812, 7812], "mapped", [7813]], [[7813, 7813], "valid"], [[7814, 7814], "mapped", [7815]], [[7815, 7815], "valid"], [[7816, 7816], "mapped", [7817]], [[7817, 7817], "valid"], [[7818, 7818], "mapped", [7819]], [[7819, 7819], "valid"], [[7820, 7820], "mapped", [7821]], [[7821, 7821], "valid"], [[7822, 7822], "mapped", [7823]], [[7823, 7823], "valid"], [[7824, 7824], "mapped", [7825]], [[7825, 7825], "valid"], [[7826, 7826], "mapped", [7827]], [[7827, 7827], "valid"], [[7828, 7828], "mapped", [7829]], [[7829, 7833], "valid"], [[7834, 7834], "mapped", [97, 702]], [[7835, 7835], "mapped", [7777]], [[7836, 7837], "valid"], [[7838, 7838], "mapped", [115, 115]], [[7839, 7839], "valid"], [[7840, 7840], "mapped", [7841]], [[7841, 7841], "valid"], [[7842, 7842], "mapped", [7843]], [[7843, 7843], "valid"], [[7844, 7844], "mapped", [7845]], [[7845, 7845], "valid"], [[7846, 7846], "mapped", [7847]], [[7847, 7847], "valid"], [[7848, 7848], "mapped", [7849]], [[7849, 7849], "valid"], [[7850, 7850], "mapped", [7851]], [[7851, 7851], "valid"], [[7852, 7852], "mapped", [7853]], [[7853, 7853], "valid"], [[7854, 7854], "mapped", [7855]], [[7855, 7855], "valid"], [[7856, 7856], "mapped", [7857]], [[7857, 7857], "valid"], [[7858, 7858], "mapped", [7859]], [[7859, 7859], "valid"], [[7860, 7860], "mapped", [7861]], [[7861, 7861], "valid"], [[7862, 7862], "mapped", [7863]], [[7863, 7863], "valid"], [[7864, 7864], "mapped", [7865]], [[7865, 7865], "valid"], [[7866, 7866], "mapped", [7867]], [[7867, 7867], "valid"], [[7868, 7868], "mapped", [7869]], [[7869, 7869], "valid"], [[7870, 7870], "mapped", [7871]], [[7871, 7871], "valid"], [[7872, 7872], "mapped", [7873]], [[7873, 7873], "valid"], [[7874, 7874], "mapped", [7875]], [[7875, 7875], "valid"], [[7876, 7876], "mapped", [7877]], [[7877, 7877], "valid"], [[7878, 7878], "mapped", [7879]], [[7879, 7879], "valid"], [[7880, 7880], "mapped", [7881]], [[7881, 7881], "valid"], [[7882, 7882], "mapped", [7883]], [[7883, 7883], "valid"], [[7884, 7884], "mapped", [7885]], [[7885, 7885], "valid"], [[7886, 7886], "mapped", [7887]], [[7887, 7887], "valid"], [[7888, 7888], "mapped", [7889]], [[7889, 7889], "valid"], [[7890, 7890], "mapped", [7891]], [[7891, 7891], "valid"], [[7892, 7892], "mapped", [7893]], [[7893, 7893], "valid"], [[7894, 7894], "mapped", [7895]], [[7895, 7895], "valid"], [[7896, 7896], "mapped", [7897]], [[7897, 7897], "valid"], [[7898, 7898], "mapped", [7899]], [[7899, 7899], "valid"], [[7900, 7900], "mapped", [7901]], [[7901, 7901], "valid"], [[7902, 7902], "mapped", [7903]], [[7903, 7903], "valid"], [[7904, 7904], "mapped", [7905]], [[7905, 7905], "valid"], [[7906, 7906], "mapped", [7907]], [[7907, 7907], "valid"], [[7908, 7908], "mapped", [7909]], [[7909, 7909], "valid"], [[7910, 7910], "mapped", [7911]], [[7911, 7911], "valid"], [[7912, 7912], "mapped", [7913]], [[7913, 7913], "valid"], [[7914, 7914], "mapped", [7915]], [[7915, 7915], "valid"], [[7916, 7916], "mapped", [7917]], [[7917, 7917], "valid"], [[7918, 7918], "mapped", [7919]], [[7919, 7919], "valid"], [[7920, 7920], "mapped", [7921]], [[7921, 7921], "valid"], [[7922, 7922], "mapped", [7923]], [[7923, 7923], "valid"], [[7924, 7924], "mapped", [7925]], [[7925, 7925], "valid"], [[7926, 7926], "mapped", [7927]], [[7927, 7927], "valid"], [[7928, 7928], "mapped", [7929]], [[7929, 7929], "valid"], [[7930, 7930], "mapped", [7931]], [[7931, 7931], "valid"], [[7932, 7932], "mapped", [7933]], [[7933, 7933], "valid"], [[7934, 7934], "mapped", [7935]], [[7935, 7935], "valid"], [[7936, 7943], "valid"], [[7944, 7944], "mapped", [7936]], [[7945, 7945], "mapped", [7937]], [[7946, 7946], "mapped", [7938]], [[7947, 7947], "mapped", [7939]], [[7948, 7948], "mapped", [7940]], [[7949, 7949], "mapped", [7941]], [[7950, 7950], "mapped", [7942]], [[7951, 7951], "mapped", [7943]], [[7952, 7957], "valid"], [[7958, 7959], "disallowed"], [[7960, 7960], "mapped", [7952]], [[7961, 7961], "mapped", [7953]], [[7962, 7962], "mapped", [7954]], [[7963, 7963], "mapped", [7955]], [[7964, 7964], "mapped", [7956]], [[7965, 7965], "mapped", [7957]], [[7966, 7967], "disallowed"], [[7968, 7975], "valid"], [[7976, 7976], "mapped", [7968]], [[7977, 7977], "mapped", [7969]], [[7978, 7978], "mapped", [7970]], [[7979, 7979], "mapped", [7971]], [[7980, 7980], "mapped", [7972]], [[7981, 7981], "mapped", [7973]], [[7982, 7982], "mapped", [7974]], [[7983, 7983], "mapped", [7975]], [[7984, 7991], "valid"], [[7992, 7992], "mapped", [7984]], [[7993, 7993], "mapped", [7985]], [[7994, 7994], "mapped", [7986]], [[7995, 7995], "mapped", [7987]], [[7996, 7996], "mapped", [7988]], [[7997, 7997], "mapped", [7989]], [[7998, 7998], "mapped", [7990]], [[7999, 7999], "mapped", [7991]], [[8000, 8005], "valid"], [[8006, 8007], "disallowed"], [[8008, 8008], "mapped", [8000]], [[8009, 8009], "mapped", [8001]], [[8010, 8010], "mapped", [8002]], [[8011, 8011], "mapped", [8003]], [[8012, 8012], "mapped", [8004]], [[8013, 8013], "mapped", [8005]], [[8014, 8015], "disallowed"], [[8016, 8023], "valid"], [[8024, 8024], "disallowed"], [[8025, 8025], "mapped", [8017]], [[8026, 8026], "disallowed"], [[8027, 8027], "mapped", [8019]], [[8028, 8028], "disallowed"], [[8029, 8029], "mapped", [8021]], [[8030, 8030], "disallowed"], [[8031, 8031], "mapped", [8023]], [[8032, 8039], "valid"], [[8040, 8040], "mapped", [8032]], [[8041, 8041], "mapped", [8033]], [[8042, 8042], "mapped", [8034]], [[8043, 8043], "mapped", [8035]], [[8044, 8044], "mapped", [8036]], [[8045, 8045], "mapped", [8037]], [[8046, 8046], "mapped", [8038]], [[8047, 8047], "mapped", [8039]], [[8048, 8048], "valid"], [[8049, 8049], "mapped", [940]], [[8050, 8050], "valid"], [[8051, 8051], "mapped", [941]], [[8052, 8052], "valid"], [[8053, 8053], "mapped", [942]], [[8054, 8054], "valid"], [[8055, 8055], "mapped", [943]], [[8056, 8056], "valid"], [[8057, 8057], "mapped", [972]], [[8058, 8058], "valid"], [[8059, 8059], "mapped", [973]], [[8060, 8060], "valid"], [[8061, 8061], "mapped", [974]], [[8062, 8063], "disallowed"], [[8064, 8064], "mapped", [7936, 953]], [[8065, 8065], "mapped", [7937, 953]], [[8066, 8066], "mapped", [7938, 953]], [[8067, 8067], "mapped", [7939, 953]], [[8068, 8068], "mapped", [7940, 953]], [[8069, 8069], "mapped", [7941, 953]], [[8070, 8070], "mapped", [7942, 953]], [[8071, 8071], "mapped", [7943, 953]], [[8072, 8072], "mapped", [7936, 953]], [[8073, 8073], "mapped", [7937, 953]], [[8074, 8074], "mapped", [7938, 953]], [[8075, 8075], "mapped", [7939, 953]], [[8076, 8076], "mapped", [7940, 953]], [[8077, 8077], "mapped", [7941, 953]], [[8078, 8078], "mapped", [7942, 953]], [[8079, 8079], "mapped", [7943, 953]], [[8080, 8080], "mapped", [7968, 953]], [[8081, 8081], "mapped", [7969, 953]], [[8082, 8082], "mapped", [7970, 953]], [[8083, 8083], "mapped", [7971, 953]], [[8084, 8084], "mapped", [7972, 953]], [[8085, 8085], "mapped", [7973, 953]], [[8086, 8086], "mapped", [7974, 953]], [[8087, 8087], "mapped", [7975, 953]], [[8088, 8088], "mapped", [7968, 953]], [[8089, 8089], "mapped", [7969, 953]], [[8090, 8090], "mapped", [7970, 953]], [[8091, 8091], "mapped", [7971, 953]], [[8092, 8092], "mapped", [7972, 953]], [[8093, 8093], "mapped", [7973, 953]], [[8094, 8094], "mapped", [7974, 953]], [[8095, 8095], "mapped", [7975, 953]], [[8096, 8096], "mapped", [8032, 953]], [[8097, 8097], "mapped", [8033, 953]], [[8098, 8098], "mapped", [8034, 953]], [[8099, 8099], "mapped", [8035, 953]], [[8100, 8100], "mapped", [8036, 953]], [[8101, 8101], "mapped", [8037, 953]], [[8102, 8102], "mapped", [8038, 953]], [[8103, 8103], "mapped", [8039, 953]], [[8104, 8104], "mapped", [8032, 953]], [[8105, 8105], "mapped", [8033, 953]], [[8106, 8106], "mapped", [8034, 953]], [[8107, 8107], "mapped", [8035, 953]], [[8108, 8108], "mapped", [8036, 953]], [[8109, 8109], "mapped", [8037, 953]], [[8110, 8110], "mapped", [8038, 953]], [[8111, 8111], "mapped", [8039, 953]], [[8112, 8113], "valid"], [[8114, 8114], "mapped", [8048, 953]], [[8115, 8115], "mapped", [945, 953]], [[8116, 8116], "mapped", [940, 953]], [[8117, 8117], "disallowed"], [[8118, 8118], "valid"], [[8119, 8119], "mapped", [8118, 953]], [[8120, 8120], "mapped", [8112]], [[8121, 8121], "mapped", [8113]], [[8122, 8122], "mapped", [8048]], [[8123, 8123], "mapped", [940]], [[8124, 8124], "mapped", [945, 953]], [[8125, 8125], "disallowed_STD3_mapped", [32, 787]], [[8126, 8126], "mapped", [953]], [[8127, 8127], "disallowed_STD3_mapped", [32, 787]], [[8128, 8128], "disallowed_STD3_mapped", [32, 834]], [[8129, 8129], "disallowed_STD3_mapped", [32, 776, 834]], [[8130, 8130], "mapped", [8052, 953]], [[8131, 8131], "mapped", [951, 953]], [[8132, 8132], "mapped", [942, 953]], [[8133, 8133], "disallowed"], [[8134, 8134], "valid"], [[8135, 8135], "mapped", [8134, 953]], [[8136, 8136], "mapped", [8050]], [[8137, 8137], "mapped", [941]], [[8138, 8138], "mapped", [8052]], [[8139, 8139], "mapped", [942]], [[8140, 8140], "mapped", [951, 953]], [[8141, 8141], "disallowed_STD3_mapped", [32, 787, 768]], [[8142, 8142], "disallowed_STD3_mapped", [32, 787, 769]], [[8143, 8143], "disallowed_STD3_mapped", [32, 787, 834]], [[8144, 8146], "valid"], [[8147, 8147], "mapped", [912]], [[8148, 8149], "disallowed"], [[8150, 8151], "valid"], [[8152, 8152], "mapped", [8144]], [[8153, 8153], "mapped", [8145]], [[8154, 8154], "mapped", [8054]], [[8155, 8155], "mapped", [943]], [[8156, 8156], "disallowed"], [[8157, 8157], "disallowed_STD3_mapped", [32, 788, 768]], [[8158, 8158], "disallowed_STD3_mapped", [32, 788, 769]], [[8159, 8159], "disallowed_STD3_mapped", [32, 788, 834]], [[8160, 8162], "valid"], [[8163, 8163], "mapped", [944]], [[8164, 8167], "valid"], [[8168, 8168], "mapped", [8160]], [[8169, 8169], "mapped", [8161]], [[8170, 8170], "mapped", [8058]], [[8171, 8171], "mapped", [973]], [[8172, 8172], "mapped", [8165]], [[8173, 8173], "disallowed_STD3_mapped", [32, 776, 768]], [[8174, 8174], "disallowed_STD3_mapped", [32, 776, 769]], [[8175, 8175], "disallowed_STD3_mapped", [96]], [[8176, 8177], "disallowed"], [[8178, 8178], "mapped", [8060, 953]], [[8179, 8179], "mapped", [969, 953]], [[8180, 8180], "mapped", [974, 953]], [[8181, 8181], "disallowed"], [[8182, 8182], "valid"], [[8183, 8183], "mapped", [8182, 953]], [[8184, 8184], "mapped", [8056]], [[8185, 8185], "mapped", [972]], [[8186, 8186], "mapped", [8060]], [[8187, 8187], "mapped", [974]], [[8188, 8188], "mapped", [969, 953]], [[8189, 8189], "disallowed_STD3_mapped", [32, 769]], [[8190, 8190], "disallowed_STD3_mapped", [32, 788]], [[8191, 8191], "disallowed"], [[8192, 8202], "disallowed_STD3_mapped", [32]], [[8203, 8203], "ignored"], [[8204, 8205], "deviation", []], [[8206, 8207], "disallowed"], [[8208, 8208], "valid", [], "NV8"], [[8209, 8209], "mapped", [8208]], [[8210, 8214], "valid", [], "NV8"], [[8215, 8215], "disallowed_STD3_mapped", [32, 819]], [[8216, 8227], "valid", [], "NV8"], [[8228, 8230], "disallowed"], [[8231, 8231], "valid", [], "NV8"], [[8232, 8238], "disallowed"], [[8239, 8239], "disallowed_STD3_mapped", [32]], [[8240, 8242], "valid", [], "NV8"], [[8243, 8243], "mapped", [8242, 8242]], [[8244, 8244], "mapped", [8242, 8242, 8242]], [[8245, 8245], "valid", [], "NV8"], [[8246, 8246], "mapped", [8245, 8245]], [[8247, 8247], "mapped", [8245, 8245, 8245]], [[8248, 8251], "valid", [], "NV8"], [[8252, 8252], "disallowed_STD3_mapped", [33, 33]], [[8253, 8253], "valid", [], "NV8"], [[8254, 8254], "disallowed_STD3_mapped", [32, 773]], [[8255, 8262], "valid", [], "NV8"], [[8263, 8263], "disallowed_STD3_mapped", [63, 63]], [[8264, 8264], "disallowed_STD3_mapped", [63, 33]], [[8265, 8265], "disallowed_STD3_mapped", [33, 63]], [[8266, 8269], "valid", [], "NV8"], [[8270, 8274], "valid", [], "NV8"], [[8275, 8276], "valid", [], "NV8"], [[8277, 8278], "valid", [], "NV8"], [[8279, 8279], "mapped", [8242, 8242, 8242, 8242]], [[8280, 8286], "valid", [], "NV8"], [[8287, 8287], "disallowed_STD3_mapped", [32]], [[8288, 8288], "ignored"], [[8289, 8291], "disallowed"], [[8292, 8292], "ignored"], [[8293, 8293], "disallowed"], [[8294, 8297], "disallowed"], [[8298, 8303], "disallowed"], [[8304, 8304], "mapped", [48]], [[8305, 8305], "mapped", [105]], [[8306, 8307], "disallowed"], [[8308, 8308], "mapped", [52]], [[8309, 8309], "mapped", [53]], [[8310, 8310], "mapped", [54]], [[8311, 8311], "mapped", [55]], [[8312, 8312], "mapped", [56]], [[8313, 8313], "mapped", [57]], [[8314, 8314], "disallowed_STD3_mapped", [43]], [[8315, 8315], "mapped", [8722]], [[8316, 8316], "disallowed_STD3_mapped", [61]], [[8317, 8317], "disallowed_STD3_mapped", [40]], [[8318, 8318], "disallowed_STD3_mapped", [41]], [[8319, 8319], "mapped", [110]], [[8320, 8320], "mapped", [48]], [[8321, 8321], "mapped", [49]], [[8322, 8322], "mapped", [50]], [[8323, 8323], "mapped", [51]], [[8324, 8324], "mapped", [52]], [[8325, 8325], "mapped", [53]], [[8326, 8326], "mapped", [54]], [[8327, 8327], "mapped", [55]], [[8328, 8328], "mapped", [56]], [[8329, 8329], "mapped", [57]], [[8330, 8330], "disallowed_STD3_mapped", [43]], [[8331, 8331], "mapped", [8722]], [[8332, 8332], "disallowed_STD3_mapped", [61]], [[8333, 8333], "disallowed_STD3_mapped", [40]], [[8334, 8334], "disallowed_STD3_mapped", [41]], [[8335, 8335], "disallowed"], [[8336, 8336], "mapped", [97]], [[8337, 8337], "mapped", [101]], [[8338, 8338], "mapped", [111]], [[8339, 8339], "mapped", [120]], [[8340, 8340], "mapped", [601]], [[8341, 8341], "mapped", [104]], [[8342, 8342], "mapped", [107]], [[8343, 8343], "mapped", [108]], [[8344, 8344], "mapped", [109]], [[8345, 8345], "mapped", [110]], [[8346, 8346], "mapped", [112]], [[8347, 8347], "mapped", [115]], [[8348, 8348], "mapped", [116]], [[8349, 8351], "disallowed"], [[8352, 8359], "valid", [], "NV8"], [[8360, 8360], "mapped", [114, 115]], [[8361, 8362], "valid", [], "NV8"], [[8363, 8363], "valid", [], "NV8"], [[8364, 8364], "valid", [], "NV8"], [[8365, 8367], "valid", [], "NV8"], [[8368, 8369], "valid", [], "NV8"], [[8370, 8373], "valid", [], "NV8"], [[8374, 8376], "valid", [], "NV8"], [[8377, 8377], "valid", [], "NV8"], [[8378, 8378], "valid", [], "NV8"], [[8379, 8381], "valid", [], "NV8"], [[8382, 8382], "valid", [], "NV8"], [[8383, 8399], "disallowed"], [[8400, 8417], "valid", [], "NV8"], [[8418, 8419], "valid", [], "NV8"], [[8420, 8426], "valid", [], "NV8"], [[8427, 8427], "valid", [], "NV8"], [[8428, 8431], "valid", [], "NV8"], [[8432, 8432], "valid", [], "NV8"], [[8433, 8447], "disallowed"], [[8448, 8448], "disallowed_STD3_mapped", [97, 47, 99]], [[8449, 8449], "disallowed_STD3_mapped", [97, 47, 115]], [[8450, 8450], "mapped", [99]], [[8451, 8451], "mapped", [176, 99]], [[8452, 8452], "valid", [], "NV8"], [[8453, 8453], "disallowed_STD3_mapped", [99, 47, 111]], [[8454, 8454], "disallowed_STD3_mapped", [99, 47, 117]], [[8455, 8455], "mapped", [603]], [[8456, 8456], "valid", [], "NV8"], [[8457, 8457], "mapped", [176, 102]], [[8458, 8458], "mapped", [103]], [[8459, 8462], "mapped", [104]], [[8463, 8463], "mapped", [295]], [[8464, 8465], "mapped", [105]], [[8466, 8467], "mapped", [108]], [[8468, 8468], "valid", [], "NV8"], [[8469, 8469], "mapped", [110]], [[8470, 8470], "mapped", [110, 111]], [[8471, 8472], "valid", [], "NV8"], [[8473, 8473], "mapped", [112]], [[8474, 8474], "mapped", [113]], [[8475, 8477], "mapped", [114]], [[8478, 8479], "valid", [], "NV8"], [[8480, 8480], "mapped", [115, 109]], [[8481, 8481], "mapped", [116, 101, 108]], [[8482, 8482], "mapped", [116, 109]], [[8483, 8483], "valid", [], "NV8"], [[8484, 8484], "mapped", [122]], [[8485, 8485], "valid", [], "NV8"], [[8486, 8486], "mapped", [969]], [[8487, 8487], "valid", [], "NV8"], [[8488, 8488], "mapped", [122]], [[8489, 8489], "valid", [], "NV8"], [[8490, 8490], "mapped", [107]], [[8491, 8491], "mapped", [229]], [[8492, 8492], "mapped", [98]], [[8493, 8493], "mapped", [99]], [[8494, 8494], "valid", [], "NV8"], [[8495, 8496], "mapped", [101]], [[8497, 8497], "mapped", [102]], [[8498, 8498], "disallowed"], [[8499, 8499], "mapped", [109]], [[8500, 8500], "mapped", [111]], [[8501, 8501], "mapped", [1488]], [[8502, 8502], "mapped", [1489]], [[8503, 8503], "mapped", [1490]], [[8504, 8504], "mapped", [1491]], [[8505, 8505], "mapped", [105]], [[8506, 8506], "valid", [], "NV8"], [[8507, 8507], "mapped", [102, 97, 120]], [[8508, 8508], "mapped", [960]], [[8509, 8510], "mapped", [947]], [[8511, 8511], "mapped", [960]], [[8512, 8512], "mapped", [8721]], [[8513, 8516], "valid", [], "NV8"], [[8517, 8518], "mapped", [100]], [[8519, 8519], "mapped", [101]], [[8520, 8520], "mapped", [105]], [[8521, 8521], "mapped", [106]], [[8522, 8523], "valid", [], "NV8"], [[8524, 8524], "valid", [], "NV8"], [[8525, 8525], "valid", [], "NV8"], [[8526, 8526], "valid"], [[8527, 8527], "valid", [], "NV8"], [[8528, 8528], "mapped", [49, 8260, 55]], [[8529, 8529], "mapped", [49, 8260, 57]], [[8530, 8530], "mapped", [49, 8260, 49, 48]], [[8531, 8531], "mapped", [49, 8260, 51]], [[8532, 8532], "mapped", [50, 8260, 51]], [[8533, 8533], "mapped", [49, 8260, 53]], [[8534, 8534], "mapped", [50, 8260, 53]], [[8535, 8535], "mapped", [51, 8260, 53]], [[8536, 8536], "mapped", [52, 8260, 53]], [[8537, 8537], "mapped", [49, 8260, 54]], [[8538, 8538], "mapped", [53, 8260, 54]], [[8539, 8539], "mapped", [49, 8260, 56]], [[8540, 8540], "mapped", [51, 8260, 56]], [[8541, 8541], "mapped", [53, 8260, 56]], [[8542, 8542], "mapped", [55, 8260, 56]], [[8543, 8543], "mapped", [49, 8260]], [[8544, 8544], "mapped", [105]], [[8545, 8545], "mapped", [105, 105]], [[8546, 8546], "mapped", [105, 105, 105]], [[8547, 8547], "mapped", [105, 118]], [[8548, 8548], "mapped", [118]], [[8549, 8549], "mapped", [118, 105]], [[8550, 8550], "mapped", [118, 105, 105]], [[8551, 8551], "mapped", [118, 105, 105, 105]], [[8552, 8552], "mapped", [105, 120]], [[8553, 8553], "mapped", [120]], [[8554, 8554], "mapped", [120, 105]], [[8555, 8555], "mapped", [120, 105, 105]], [[8556, 8556], "mapped", [108]], [[8557, 8557], "mapped", [99]], [[8558, 8558], "mapped", [100]], [[8559, 8559], "mapped", [109]], [[8560, 8560], "mapped", [105]], [[8561, 8561], "mapped", [105, 105]], [[8562, 8562], "mapped", [105, 105, 105]], [[8563, 8563], "mapped", [105, 118]], [[8564, 8564], "mapped", [118]], [[8565, 8565], "mapped", [118, 105]], [[8566, 8566], "mapped", [118, 105, 105]], [[8567, 8567], "mapped", [118, 105, 105, 105]], [[8568, 8568], "mapped", [105, 120]], [[8569, 8569], "mapped", [120]], [[8570, 8570], "mapped", [120, 105]], [[8571, 8571], "mapped", [120, 105, 105]], [[8572, 8572], "mapped", [108]], [[8573, 8573], "mapped", [99]], [[8574, 8574], "mapped", [100]], [[8575, 8575], "mapped", [109]], [[8576, 8578], "valid", [], "NV8"], [[8579, 8579], "disallowed"], [[8580, 8580], "valid"], [[8581, 8584], "valid", [], "NV8"], [[8585, 8585], "mapped", [48, 8260, 51]], [[8586, 8587], "valid", [], "NV8"], [[8588, 8591], "disallowed"], [[8592, 8682], "valid", [], "NV8"], [[8683, 8691], "valid", [], "NV8"], [[8692, 8703], "valid", [], "NV8"], [[8704, 8747], "valid", [], "NV8"], [[8748, 8748], "mapped", [8747, 8747]], [[8749, 8749], "mapped", [8747, 8747, 8747]], [[8750, 8750], "valid", [], "NV8"], [[8751, 8751], "mapped", [8750, 8750]], [[8752, 8752], "mapped", [8750, 8750, 8750]], [[8753, 8799], "valid", [], "NV8"], [[8800, 8800], "disallowed_STD3_valid"], [[8801, 8813], "valid", [], "NV8"], [[8814, 8815], "disallowed_STD3_valid"], [[8816, 8945], "valid", [], "NV8"], [[8946, 8959], "valid", [], "NV8"], [[8960, 8960], "valid", [], "NV8"], [[8961, 8961], "valid", [], "NV8"], [[8962, 9000], "valid", [], "NV8"], [[9001, 9001], "mapped", [12296]], [[9002, 9002], "mapped", [12297]], [[9003, 9082], "valid", [], "NV8"], [[9083, 9083], "valid", [], "NV8"], [[9084, 9084], "valid", [], "NV8"], [[9085, 9114], "valid", [], "NV8"], [[9115, 9166], "valid", [], "NV8"], [[9167, 9168], "valid", [], "NV8"], [[9169, 9179], "valid", [], "NV8"], [[9180, 9191], "valid", [], "NV8"], [[9192, 9192], "valid", [], "NV8"], [[9193, 9203], "valid", [], "NV8"], [[9204, 9210], "valid", [], "NV8"], [[9211, 9215], "disallowed"], [[9216, 9252], "valid", [], "NV8"], [[9253, 9254], "valid", [], "NV8"], [[9255, 9279], "disallowed"], [[9280, 9290], "valid", [], "NV8"], [[9291, 9311], "disallowed"], [[9312, 9312], "mapped", [49]], [[9313, 9313], "mapped", [50]], [[9314, 9314], "mapped", [51]], [[9315, 9315], "mapped", [52]], [[9316, 9316], "mapped", [53]], [[9317, 9317], "mapped", [54]], [[9318, 9318], "mapped", [55]], [[9319, 9319], "mapped", [56]], [[9320, 9320], "mapped", [57]], [[9321, 9321], "mapped", [49, 48]], [[9322, 9322], "mapped", [49, 49]], [[9323, 9323], "mapped", [49, 50]], [[9324, 9324], "mapped", [49, 51]], [[9325, 9325], "mapped", [49, 52]], [[9326, 9326], "mapped", [49, 53]], [[9327, 9327], "mapped", [49, 54]], [[9328, 9328], "mapped", [49, 55]], [[9329, 9329], "mapped", [49, 56]], [[9330, 9330], "mapped", [49, 57]], [[9331, 9331], "mapped", [50, 48]], [[9332, 9332], "disallowed_STD3_mapped", [40, 49, 41]], [[9333, 9333], "disallowed_STD3_mapped", [40, 50, 41]], [[9334, 9334], "disallowed_STD3_mapped", [40, 51, 41]], [[9335, 9335], "disallowed_STD3_mapped", [40, 52, 41]], [[9336, 9336], "disallowed_STD3_mapped", [40, 53, 41]], [[9337, 9337], "disallowed_STD3_mapped", [40, 54, 41]], [[9338, 9338], "disallowed_STD3_mapped", [40, 55, 41]], [[9339, 9339], "disallowed_STD3_mapped", [40, 56, 41]], [[9340, 9340], "disallowed_STD3_mapped", [40, 57, 41]], [[9341, 9341], "disallowed_STD3_mapped", [40, 49, 48, 41]], [[9342, 9342], "disallowed_STD3_mapped", [40, 49, 49, 41]], [[9343, 9343], "disallowed_STD3_mapped", [40, 49, 50, 41]], [[9344, 9344], "disallowed_STD3_mapped", [40, 49, 51, 41]], [[9345, 9345], "disallowed_STD3_mapped", [40, 49, 52, 41]], [[9346, 9346], "disallowed_STD3_mapped", [40, 49, 53, 41]], [[9347, 9347], "disallowed_STD3_mapped", [40, 49, 54, 41]], [[9348, 9348], "disallowed_STD3_mapped", [40, 49, 55, 41]], [[9349, 9349], "disallowed_STD3_mapped", [40, 49, 56, 41]], [[9350, 9350], "disallowed_STD3_mapped", [40, 49, 57, 41]], [[9351, 9351], "disallowed_STD3_mapped", [40, 50, 48, 41]], [[9352, 9371], "disallowed"], [[9372, 9372], "disallowed_STD3_mapped", [40, 97, 41]], [[9373, 9373], "disallowed_STD3_mapped", [40, 98, 41]], [[9374, 9374], "disallowed_STD3_mapped", [40, 99, 41]], [[9375, 9375], "disallowed_STD3_mapped", [40, 100, 41]], [[9376, 9376], "disallowed_STD3_mapped", [40, 101, 41]], [[9377, 9377], "disallowed_STD3_mapped", [40, 102, 41]], [[9378, 9378], "disallowed_STD3_mapped", [40, 103, 41]], [[9379, 9379], "disallowed_STD3_mapped", [40, 104, 41]], [[9380, 9380], "disallowed_STD3_mapped", [40, 105, 41]], [[9381, 9381], "disallowed_STD3_mapped", [40, 106, 41]], [[9382, 9382], "disallowed_STD3_mapped", [40, 107, 41]], [[9383, 9383], "disallowed_STD3_mapped", [40, 108, 41]], [[9384, 9384], "disallowed_STD3_mapped", [40, 109, 41]], [[9385, 9385], "disallowed_STD3_mapped", [40, 110, 41]], [[9386, 9386], "disallowed_STD3_mapped", [40, 111, 41]], [[9387, 9387], "disallowed_STD3_mapped", [40, 112, 41]], [[9388, 9388], "disallowed_STD3_mapped", [40, 113, 41]], [[9389, 9389], "disallowed_STD3_mapped", [40, 114, 41]], [[9390, 9390], "disallowed_STD3_mapped", [40, 115, 41]], [[9391, 9391], "disallowed_STD3_mapped", [40, 116, 41]], [[9392, 9392], "disallowed_STD3_mapped", [40, 117, 41]], [[9393, 9393], "disallowed_STD3_mapped", [40, 118, 41]], [[9394, 9394], "disallowed_STD3_mapped", [40, 119, 41]], [[9395, 9395], "disallowed_STD3_mapped", [40, 120, 41]], [[9396, 9396], "disallowed_STD3_mapped", [40, 121, 41]], [[9397, 9397], "disallowed_STD3_mapped", [40, 122, 41]], [[9398, 9398], "mapped", [97]], [[9399, 9399], "mapped", [98]], [[9400, 9400], "mapped", [99]], [[9401, 9401], "mapped", [100]], [[9402, 9402], "mapped", [101]], [[9403, 9403], "mapped", [102]], [[9404, 9404], "mapped", [103]], [[9405, 9405], "mapped", [104]], [[9406, 9406], "mapped", [105]], [[9407, 9407], "mapped", [106]], [[9408, 9408], "mapped", [107]], [[9409, 9409], "mapped", [108]], [[9410, 9410], "mapped", [109]], [[9411, 9411], "mapped", [110]], [[9412, 9412], "mapped", [111]], [[9413, 9413], "mapped", [112]], [[9414, 9414], "mapped", [113]], [[9415, 9415], "mapped", [114]], [[9416, 9416], "mapped", [115]], [[9417, 9417], "mapped", [116]], [[9418, 9418], "mapped", [117]], [[9419, 9419], "mapped", [118]], [[9420, 9420], "mapped", [119]], [[9421, 9421], "mapped", [120]], [[9422, 9422], "mapped", [121]], [[9423, 9423], "mapped", [122]], [[9424, 9424], "mapped", [97]], [[9425, 9425], "mapped", [98]], [[9426, 9426], "mapped", [99]], [[9427, 9427], "mapped", [100]], [[9428, 9428], "mapped", [101]], [[9429, 9429], "mapped", [102]], [[9430, 9430], "mapped", [103]], [[9431, 9431], "mapped", [104]], [[9432, 9432], "mapped", [105]], [[9433, 9433], "mapped", [106]], [[9434, 9434], "mapped", [107]], [[9435, 9435], "mapped", [108]], [[9436, 9436], "mapped", [109]], [[9437, 9437], "mapped", [110]], [[9438, 9438], "mapped", [111]], [[9439, 9439], "mapped", [112]], [[9440, 9440], "mapped", [113]], [[9441, 9441], "mapped", [114]], [[9442, 9442], "mapped", [115]], [[9443, 9443], "mapped", [116]], [[9444, 9444], "mapped", [117]], [[9445, 9445], "mapped", [118]], [[9446, 9446], "mapped", [119]], [[9447, 9447], "mapped", [120]], [[9448, 9448], "mapped", [121]], [[9449, 9449], "mapped", [122]], [[9450, 9450], "mapped", [48]], [[9451, 9470], "valid", [], "NV8"], [[9471, 9471], "valid", [], "NV8"], [[9472, 9621], "valid", [], "NV8"], [[9622, 9631], "valid", [], "NV8"], [[9632, 9711], "valid", [], "NV8"], [[9712, 9719], "valid", [], "NV8"], [[9720, 9727], "valid", [], "NV8"], [[9728, 9747], "valid", [], "NV8"], [[9748, 9749], "valid", [], "NV8"], [[9750, 9751], "valid", [], "NV8"], [[9752, 9752], "valid", [], "NV8"], [[9753, 9753], "valid", [], "NV8"], [[9754, 9839], "valid", [], "NV8"], [[9840, 9841], "valid", [], "NV8"], [[9842, 9853], "valid", [], "NV8"], [[9854, 9855], "valid", [], "NV8"], [[9856, 9865], "valid", [], "NV8"], [[9866, 9873], "valid", [], "NV8"], [[9874, 9884], "valid", [], "NV8"], [[9885, 9885], "valid", [], "NV8"], [[9886, 9887], "valid", [], "NV8"], [[9888, 9889], "valid", [], "NV8"], [[9890, 9905], "valid", [], "NV8"], [[9906, 9906], "valid", [], "NV8"], [[9907, 9916], "valid", [], "NV8"], [[9917, 9919], "valid", [], "NV8"], [[9920, 9923], "valid", [], "NV8"], [[9924, 9933], "valid", [], "NV8"], [[9934, 9934], "valid", [], "NV8"], [[9935, 9953], "valid", [], "NV8"], [[9954, 9954], "valid", [], "NV8"], [[9955, 9955], "valid", [], "NV8"], [[9956, 9959], "valid", [], "NV8"], [[9960, 9983], "valid", [], "NV8"], [[9984, 9984], "valid", [], "NV8"], [[9985, 9988], "valid", [], "NV8"], [[9989, 9989], "valid", [], "NV8"], [[9990, 9993], "valid", [], "NV8"], [[9994, 9995], "valid", [], "NV8"], [[9996, 10023], "valid", [], "NV8"], [[10024, 10024], "valid", [], "NV8"], [[10025, 10059], "valid", [], "NV8"], [[10060, 10060], "valid", [], "NV8"], [[10061, 10061], "valid", [], "NV8"], [[10062, 10062], "valid", [], "NV8"], [[10063, 10066], "valid", [], "NV8"], [[10067, 10069], "valid", [], "NV8"], [[10070, 10070], "valid", [], "NV8"], [[10071, 10071], "valid", [], "NV8"], [[10072, 10078], "valid", [], "NV8"], [[10079, 10080], "valid", [], "NV8"], [[10081, 10087], "valid", [], "NV8"], [[10088, 10101], "valid", [], "NV8"], [[10102, 10132], "valid", [], "NV8"], [[10133, 10135], "valid", [], "NV8"], [[10136, 10159], "valid", [], "NV8"], [[10160, 10160], "valid", [], "NV8"], [[10161, 10174], "valid", [], "NV8"], [[10175, 10175], "valid", [], "NV8"], [[10176, 10182], "valid", [], "NV8"], [[10183, 10186], "valid", [], "NV8"], [[10187, 10187], "valid", [], "NV8"], [[10188, 10188], "valid", [], "NV8"], [[10189, 10189], "valid", [], "NV8"], [[10190, 10191], "valid", [], "NV8"], [[10192, 10219], "valid", [], "NV8"], [[10220, 10223], "valid", [], "NV8"], [[10224, 10239], "valid", [], "NV8"], [[10240, 10495], "valid", [], "NV8"], [[10496, 10763], "valid", [], "NV8"], [[10764, 10764], "mapped", [8747, 8747, 8747, 8747]], [[10765, 10867], "valid", [], "NV8"], [[10868, 10868], "disallowed_STD3_mapped", [58, 58, 61]], [[10869, 10869], "disallowed_STD3_mapped", [61, 61]], [[10870, 10870], "disallowed_STD3_mapped", [61, 61, 61]], [[10871, 10971], "valid", [], "NV8"], [[10972, 10972], "mapped", [10973, 824]], [[10973, 11007], "valid", [], "NV8"], [[11008, 11021], "valid", [], "NV8"], [[11022, 11027], "valid", [], "NV8"], [[11028, 11034], "valid", [], "NV8"], [[11035, 11039], "valid", [], "NV8"], [[11040, 11043], "valid", [], "NV8"], [[11044, 11084], "valid", [], "NV8"], [[11085, 11087], "valid", [], "NV8"], [[11088, 11092], "valid", [], "NV8"], [[11093, 11097], "valid", [], "NV8"], [[11098, 11123], "valid", [], "NV8"], [[11124, 11125], "disallowed"], [[11126, 11157], "valid", [], "NV8"], [[11158, 11159], "disallowed"], [[11160, 11193], "valid", [], "NV8"], [[11194, 11196], "disallowed"], [[11197, 11208], "valid", [], "NV8"], [[11209, 11209], "disallowed"], [[11210, 11217], "valid", [], "NV8"], [[11218, 11243], "disallowed"], [[11244, 11247], "valid", [], "NV8"], [[11248, 11263], "disallowed"], [[11264, 11264], "mapped", [11312]], [[11265, 11265], "mapped", [11313]], [[11266, 11266], "mapped", [11314]], [[11267, 11267], "mapped", [11315]], [[11268, 11268], "mapped", [11316]], [[11269, 11269], "mapped", [11317]], [[11270, 11270], "mapped", [11318]], [[11271, 11271], "mapped", [11319]], [[11272, 11272], "mapped", [11320]], [[11273, 11273], "mapped", [11321]], [[11274, 11274], "mapped", [11322]], [[11275, 11275], "mapped", [11323]], [[11276, 11276], "mapped", [11324]], [[11277, 11277], "mapped", [11325]], [[11278, 11278], "mapped", [11326]], [[11279, 11279], "mapped", [11327]], [[11280, 11280], "mapped", [11328]], [[11281, 11281], "mapped", [11329]], [[11282, 11282], "mapped", [11330]], [[11283, 11283], "mapped", [11331]], [[11284, 11284], "mapped", [11332]], [[11285, 11285], "mapped", [11333]], [[11286, 11286], "mapped", [11334]], [[11287, 11287], "mapped", [11335]], [[11288, 11288], "mapped", [11336]], [[11289, 11289], "mapped", [11337]], [[11290, 11290], "mapped", [11338]], [[11291, 11291], "mapped", [11339]], [[11292, 11292], "mapped", [11340]], [[11293, 11293], "mapped", [11341]], [[11294, 11294], "mapped", [11342]], [[11295, 11295], "mapped", [11343]], [[11296, 11296], "mapped", [11344]], [[11297, 11297], "mapped", [11345]], [[11298, 11298], "mapped", [11346]], [[11299, 11299], "mapped", [11347]], [[11300, 11300], "mapped", [11348]], [[11301, 11301], "mapped", [11349]], [[11302, 11302], "mapped", [11350]], [[11303, 11303], "mapped", [11351]], [[11304, 11304], "mapped", [11352]], [[11305, 11305], "mapped", [11353]], [[11306, 11306], "mapped", [11354]], [[11307, 11307], "mapped", [11355]], [[11308, 11308], "mapped", [11356]], [[11309, 11309], "mapped", [11357]], [[11310, 11310], "mapped", [11358]], [[11311, 11311], "disallowed"], [[11312, 11358], "valid"], [[11359, 11359], "disallowed"], [[11360, 11360], "mapped", [11361]], [[11361, 11361], "valid"], [[11362, 11362], "mapped", [619]], [[11363, 11363], "mapped", [7549]], [[11364, 11364], "mapped", [637]], [[11365, 11366], "valid"], [[11367, 11367], "mapped", [11368]], [[11368, 11368], "valid"], [[11369, 11369], "mapped", [11370]], [[11370, 11370], "valid"], [[11371, 11371], "mapped", [11372]], [[11372, 11372], "valid"], [[11373, 11373], "mapped", [593]], [[11374, 11374], "mapped", [625]], [[11375, 11375], "mapped", [592]], [[11376, 11376], "mapped", [594]], [[11377, 11377], "valid"], [[11378, 11378], "mapped", [11379]], [[11379, 11379], "valid"], [[11380, 11380], "valid"], [[11381, 11381], "mapped", [11382]], [[11382, 11383], "valid"], [[11384, 11387], "valid"], [[11388, 11388], "mapped", [106]], [[11389, 11389], "mapped", [118]], [[11390, 11390], "mapped", [575]], [[11391, 11391], "mapped", [576]], [[11392, 11392], "mapped", [11393]], [[11393, 11393], "valid"], [[11394, 11394], "mapped", [11395]], [[11395, 11395], "valid"], [[11396, 11396], "mapped", [11397]], [[11397, 11397], "valid"], [[11398, 11398], "mapped", [11399]], [[11399, 11399], "valid"], [[11400, 11400], "mapped", [11401]], [[11401, 11401], "valid"], [[11402, 11402], "mapped", [11403]], [[11403, 11403], "valid"], [[11404, 11404], "mapped", [11405]], [[11405, 11405], "valid"], [[11406, 11406], "mapped", [11407]], [[11407, 11407], "valid"], [[11408, 11408], "mapped", [11409]], [[11409, 11409], "valid"], [[11410, 11410], "mapped", [11411]], [[11411, 11411], "valid"], [[11412, 11412], "mapped", [11413]], [[11413, 11413], "valid"], [[11414, 11414], "mapped", [11415]], [[11415, 11415], "valid"], [[11416, 11416], "mapped", [11417]], [[11417, 11417], "valid"], [[11418, 11418], "mapped", [11419]], [[11419, 11419], "valid"], [[11420, 11420], "mapped", [11421]], [[11421, 11421], "valid"], [[11422, 11422], "mapped", [11423]], [[11423, 11423], "valid"], [[11424, 11424], "mapped", [11425]], [[11425, 11425], "valid"], [[11426, 11426], "mapped", [11427]], [[11427, 11427], "valid"], [[11428, 11428], "mapped", [11429]], [[11429, 11429], "valid"], [[11430, 11430], "mapped", [11431]], [[11431, 11431], "valid"], [[11432, 11432], "mapped", [11433]], [[11433, 11433], "valid"], [[11434, 11434], "mapped", [11435]], [[11435, 11435], "valid"], [[11436, 11436], "mapped", [11437]], [[11437, 11437], "valid"], [[11438, 11438], "mapped", [11439]], [[11439, 11439], "valid"], [[11440, 11440], "mapped", [11441]], [[11441, 11441], "valid"], [[11442, 11442], "mapped", [11443]], [[11443, 11443], "valid"], [[11444, 11444], "mapped", [11445]], [[11445, 11445], "valid"], [[11446, 11446], "mapped", [11447]], [[11447, 11447], "valid"], [[11448, 11448], "mapped", [11449]], [[11449, 11449], "valid"], [[11450, 11450], "mapped", [11451]], [[11451, 11451], "valid"], [[11452, 11452], "mapped", [11453]], [[11453, 11453], "valid"], [[11454, 11454], "mapped", [11455]], [[11455, 11455], "valid"], [[11456, 11456], "mapped", [11457]], [[11457, 11457], "valid"], [[11458, 11458], "mapped", [11459]], [[11459, 11459], "valid"], [[11460, 11460], "mapped", [11461]], [[11461, 11461], "valid"], [[11462, 11462], "mapped", [11463]], [[11463, 11463], "valid"], [[11464, 11464], "mapped", [11465]], [[11465, 11465], "valid"], [[11466, 11466], "mapped", [11467]], [[11467, 11467], "valid"], [[11468, 11468], "mapped", [11469]], [[11469, 11469], "valid"], [[11470, 11470], "mapped", [11471]], [[11471, 11471], "valid"], [[11472, 11472], "mapped", [11473]], [[11473, 11473], "valid"], [[11474, 11474], "mapped", [11475]], [[11475, 11475], "valid"], [[11476, 11476], "mapped", [11477]], [[11477, 11477], "valid"], [[11478, 11478], "mapped", [11479]], [[11479, 11479], "valid"], [[11480, 11480], "mapped", [11481]], [[11481, 11481], "valid"], [[11482, 11482], "mapped", [11483]], [[11483, 11483], "valid"], [[11484, 11484], "mapped", [11485]], [[11485, 11485], "valid"], [[11486, 11486], "mapped", [11487]], [[11487, 11487], "valid"], [[11488, 11488], "mapped", [11489]], [[11489, 11489], "valid"], [[11490, 11490], "mapped", [11491]], [[11491, 11492], "valid"], [[11493, 11498], "valid", [], "NV8"], [[11499, 11499], "mapped", [11500]], [[11500, 11500], "valid"], [[11501, 11501], "mapped", [11502]], [[11502, 11505], "valid"], [[11506, 11506], "mapped", [11507]], [[11507, 11507], "valid"], [[11508, 11512], "disallowed"], [[11513, 11519], "valid", [], "NV8"], [[11520, 11557], "valid"], [[11558, 11558], "disallowed"], [[11559, 11559], "valid"], [[11560, 11564], "disallowed"], [[11565, 11565], "valid"], [[11566, 11567], "disallowed"], [[11568, 11621], "valid"], [[11622, 11623], "valid"], [[11624, 11630], "disallowed"], [[11631, 11631], "mapped", [11617]], [[11632, 11632], "valid", [], "NV8"], [[11633, 11646], "disallowed"], [[11647, 11647], "valid"], [[11648, 11670], "valid"], [[11671, 11679], "disallowed"], [[11680, 11686], "valid"], [[11687, 11687], "disallowed"], [[11688, 11694], "valid"], [[11695, 11695], "disallowed"], [[11696, 11702], "valid"], [[11703, 11703], "disallowed"], [[11704, 11710], "valid"], [[11711, 11711], "disallowed"], [[11712, 11718], "valid"], [[11719, 11719], "disallowed"], [[11720, 11726], "valid"], [[11727, 11727], "disallowed"], [[11728, 11734], "valid"], [[11735, 11735], "disallowed"], [[11736, 11742], "valid"], [[11743, 11743], "disallowed"], [[11744, 11775], "valid"], [[11776, 11799], "valid", [], "NV8"], [[11800, 11803], "valid", [], "NV8"], [[11804, 11805], "valid", [], "NV8"], [[11806, 11822], "valid", [], "NV8"], [[11823, 11823], "valid"], [[11824, 11824], "valid", [], "NV8"], [[11825, 11825], "valid", [], "NV8"], [[11826, 11835], "valid", [], "NV8"], [[11836, 11842], "valid", [], "NV8"], [[11843, 11903], "disallowed"], [[11904, 11929], "valid", [], "NV8"], [[11930, 11930], "disallowed"], [[11931, 11934], "valid", [], "NV8"], [[11935, 11935], "mapped", [27597]], [[11936, 12018], "valid", [], "NV8"], [[12019, 12019], "mapped", [40863]], [[12020, 12031], "disallowed"], [[12032, 12032], "mapped", [19968]], [[12033, 12033], "mapped", [20008]], [[12034, 12034], "mapped", [20022]], [[12035, 12035], "mapped", [20031]], [[12036, 12036], "mapped", [20057]], [[12037, 12037], "mapped", [20101]], [[12038, 12038], "mapped", [20108]], [[12039, 12039], "mapped", [20128]], [[12040, 12040], "mapped", [20154]], [[12041, 12041], "mapped", [20799]], [[12042, 12042], "mapped", [20837]], [[12043, 12043], "mapped", [20843]], [[12044, 12044], "mapped", [20866]], [[12045, 12045], "mapped", [20886]], [[12046, 12046], "mapped", [20907]], [[12047, 12047], "mapped", [20960]], [[12048, 12048], "mapped", [20981]], [[12049, 12049], "mapped", [20992]], [[12050, 12050], "mapped", [21147]], [[12051, 12051], "mapped", [21241]], [[12052, 12052], "mapped", [21269]], [[12053, 12053], "mapped", [21274]], [[12054, 12054], "mapped", [21304]], [[12055, 12055], "mapped", [21313]], [[12056, 12056], "mapped", [21340]], [[12057, 12057], "mapped", [21353]], [[12058, 12058], "mapped", [21378]], [[12059, 12059], "mapped", [21430]], [[12060, 12060], "mapped", [21448]], [[12061, 12061], "mapped", [21475]], [[12062, 12062], "mapped", [22231]], [[12063, 12063], "mapped", [22303]], [[12064, 12064], "mapped", [22763]], [[12065, 12065], "mapped", [22786]], [[12066, 12066], "mapped", [22794]], [[12067, 12067], "mapped", [22805]], [[12068, 12068], "mapped", [22823]], [[12069, 12069], "mapped", [22899]], [[12070, 12070], "mapped", [23376]], [[12071, 12071], "mapped", [23424]], [[12072, 12072], "mapped", [23544]], [[12073, 12073], "mapped", [23567]], [[12074, 12074], "mapped", [23586]], [[12075, 12075], "mapped", [23608]], [[12076, 12076], "mapped", [23662]], [[12077, 12077], "mapped", [23665]], [[12078, 12078], "mapped", [24027]], [[12079, 12079], "mapped", [24037]], [[12080, 12080], "mapped", [24049]], [[12081, 12081], "mapped", [24062]], [[12082, 12082], "mapped", [24178]], [[12083, 12083], "mapped", [24186]], [[12084, 12084], "mapped", [24191]], [[12085, 12085], "mapped", [24308]], [[12086, 12086], "mapped", [24318]], [[12087, 12087], "mapped", [24331]], [[12088, 12088], "mapped", [24339]], [[12089, 12089], "mapped", [24400]], [[12090, 12090], "mapped", [24417]], [[12091, 12091], "mapped", [24435]], [[12092, 12092], "mapped", [24515]], [[12093, 12093], "mapped", [25096]], [[12094, 12094], "mapped", [25142]], [[12095, 12095], "mapped", [25163]], [[12096, 12096], "mapped", [25903]], [[12097, 12097], "mapped", [25908]], [[12098, 12098], "mapped", [25991]], [[12099, 12099], "mapped", [26007]], [[12100, 12100], "mapped", [26020]], [[12101, 12101], "mapped", [26041]], [[12102, 12102], "mapped", [26080]], [[12103, 12103], "mapped", [26085]], [[12104, 12104], "mapped", [26352]], [[12105, 12105], "mapped", [26376]], [[12106, 12106], "mapped", [26408]], [[12107, 12107], "mapped", [27424]], [[12108, 12108], "mapped", [27490]], [[12109, 12109], "mapped", [27513]], [[12110, 12110], "mapped", [27571]], [[12111, 12111], "mapped", [27595]], [[12112, 12112], "mapped", [27604]], [[12113, 12113], "mapped", [27611]], [[12114, 12114], "mapped", [27663]], [[12115, 12115], "mapped", [27668]], [[12116, 12116], "mapped", [27700]], [[12117, 12117], "mapped", [28779]], [[12118, 12118], "mapped", [29226]], [[12119, 12119], "mapped", [29238]], [[12120, 12120], "mapped", [29243]], [[12121, 12121], "mapped", [29247]], [[12122, 12122], "mapped", [29255]], [[12123, 12123], "mapped", [29273]], [[12124, 12124], "mapped", [29275]], [[12125, 12125], "mapped", [29356]], [[12126, 12126], "mapped", [29572]], [[12127, 12127], "mapped", [29577]], [[12128, 12128], "mapped", [29916]], [[12129, 12129], "mapped", [29926]], [[12130, 12130], "mapped", [29976]], [[12131, 12131], "mapped", [29983]], [[12132, 12132], "mapped", [29992]], [[12133, 12133], "mapped", [30000]], [[12134, 12134], "mapped", [30091]], [[12135, 12135], "mapped", [30098]], [[12136, 12136], "mapped", [30326]], [[12137, 12137], "mapped", [30333]], [[12138, 12138], "mapped", [30382]], [[12139, 12139], "mapped", [30399]], [[12140, 12140], "mapped", [30446]], [[12141, 12141], "mapped", [30683]], [[12142, 12142], "mapped", [30690]], [[12143, 12143], "mapped", [30707]], [[12144, 12144], "mapped", [31034]], [[12145, 12145], "mapped", [31160]], [[12146, 12146], "mapped", [31166]], [[12147, 12147], "mapped", [31348]], [[12148, 12148], "mapped", [31435]], [[12149, 12149], "mapped", [31481]], [[12150, 12150], "mapped", [31859]], [[12151, 12151], "mapped", [31992]], [[12152, 12152], "mapped", [32566]], [[12153, 12153], "mapped", [32593]], [[12154, 12154], "mapped", [32650]], [[12155, 12155], "mapped", [32701]], [[12156, 12156], "mapped", [32769]], [[12157, 12157], "mapped", [32780]], [[12158, 12158], "mapped", [32786]], [[12159, 12159], "mapped", [32819]], [[12160, 12160], "mapped", [32895]], [[12161, 12161], "mapped", [32905]], [[12162, 12162], "mapped", [33251]], [[12163, 12163], "mapped", [33258]], [[12164, 12164], "mapped", [33267]], [[12165, 12165], "mapped", [33276]], [[12166, 12166], "mapped", [33292]], [[12167, 12167], "mapped", [33307]], [[12168, 12168], "mapped", [33311]], [[12169, 12169], "mapped", [33390]], [[12170, 12170], "mapped", [33394]], [[12171, 12171], "mapped", [33400]], [[12172, 12172], "mapped", [34381]], [[12173, 12173], "mapped", [34411]], [[12174, 12174], "mapped", [34880]], [[12175, 12175], "mapped", [34892]], [[12176, 12176], "mapped", [34915]], [[12177, 12177], "mapped", [35198]], [[12178, 12178], "mapped", [35211]], [[12179, 12179], "mapped", [35282]], [[12180, 12180], "mapped", [35328]], [[12181, 12181], "mapped", [35895]], [[12182, 12182], "mapped", [35910]], [[12183, 12183], "mapped", [35925]], [[12184, 12184], "mapped", [35960]], [[12185, 12185], "mapped", [35997]], [[12186, 12186], "mapped", [36196]], [[12187, 12187], "mapped", [36208]], [[12188, 12188], "mapped", [36275]], [[12189, 12189], "mapped", [36523]], [[12190, 12190], "mapped", [36554]], [[12191, 12191], "mapped", [36763]], [[12192, 12192], "mapped", [36784]], [[12193, 12193], "mapped", [36789]], [[12194, 12194], "mapped", [37009]], [[12195, 12195], "mapped", [37193]], [[12196, 12196], "mapped", [37318]], [[12197, 12197], "mapped", [37324]], [[12198, 12198], "mapped", [37329]], [[12199, 12199], "mapped", [38263]], [[12200, 12200], "mapped", [38272]], [[12201, 12201], "mapped", [38428]], [[12202, 12202], "mapped", [38582]], [[12203, 12203], "mapped", [38585]], [[12204, 12204], "mapped", [38632]], [[12205, 12205], "mapped", [38737]], [[12206, 12206], "mapped", [38750]], [[12207, 12207], "mapped", [38754]], [[12208, 12208], "mapped", [38761]], [[12209, 12209], "mapped", [38859]], [[12210, 12210], "mapped", [38893]], [[12211, 12211], "mapped", [38899]], [[12212, 12212], "mapped", [38913]], [[12213, 12213], "mapped", [39080]], [[12214, 12214], "mapped", [39131]], [[12215, 12215], "mapped", [39135]], [[12216, 12216], "mapped", [39318]], [[12217, 12217], "mapped", [39321]], [[12218, 12218], "mapped", [39340]], [[12219, 12219], "mapped", [39592]], [[12220, 12220], "mapped", [39640]], [[12221, 12221], "mapped", [39647]], [[12222, 12222], "mapped", [39717]], [[12223, 12223], "mapped", [39727]], [[12224, 12224], "mapped", [39730]], [[12225, 12225], "mapped", [39740]], [[12226, 12226], "mapped", [39770]], [[12227, 12227], "mapped", [40165]], [[12228, 12228], "mapped", [40565]], [[12229, 12229], "mapped", [40575]], [[12230, 12230], "mapped", [40613]], [[12231, 12231], "mapped", [40635]], [[12232, 12232], "mapped", [40643]], [[12233, 12233], "mapped", [40653]], [[12234, 12234], "mapped", [40657]], [[12235, 12235], "mapped", [40697]], [[12236, 12236], "mapped", [40701]], [[12237, 12237], "mapped", [40718]], [[12238, 12238], "mapped", [40723]], [[12239, 12239], "mapped", [40736]], [[12240, 12240], "mapped", [40763]], [[12241, 12241], "mapped", [40778]], [[12242, 12242], "mapped", [40786]], [[12243, 12243], "mapped", [40845]], [[12244, 12244], "mapped", [40860]], [[12245, 12245], "mapped", [40864]], [[12246, 12271], "disallowed"], [[12272, 12283], "disallowed"], [[12284, 12287], "disallowed"], [[12288, 12288], "disallowed_STD3_mapped", [32]], [[12289, 12289], "valid", [], "NV8"], [[12290, 12290], "mapped", [46]], [[12291, 12292], "valid", [], "NV8"], [[12293, 12295], "valid"], [[12296, 12329], "valid", [], "NV8"], [[12330, 12333], "valid"], [[12334, 12341], "valid", [], "NV8"], [[12342, 12342], "mapped", [12306]], [[12343, 12343], "valid", [], "NV8"], [[12344, 12344], "mapped", [21313]], [[12345, 12345], "mapped", [21316]], [[12346, 12346], "mapped", [21317]], [[12347, 12347], "valid", [], "NV8"], [[12348, 12348], "valid"], [[12349, 12349], "valid", [], "NV8"], [[12350, 12350], "valid", [], "NV8"], [[12351, 12351], "valid", [], "NV8"], [[12352, 12352], "disallowed"], [[12353, 12436], "valid"], [[12437, 12438], "valid"], [[12439, 12440], "disallowed"], [[12441, 12442], "valid"], [[12443, 12443], "disallowed_STD3_mapped", [32, 12441]], [[12444, 12444], "disallowed_STD3_mapped", [32, 12442]], [[12445, 12446], "valid"], [[12447, 12447], "mapped", [12424, 12426]], [[12448, 12448], "valid", [], "NV8"], [[12449, 12542], "valid"], [[12543, 12543], "mapped", [12467, 12488]], [[12544, 12548], "disallowed"], [[12549, 12588], "valid"], [[12589, 12589], "valid"], [[12590, 12592], "disallowed"], [[12593, 12593], "mapped", [4352]], [[12594, 12594], "mapped", [4353]], [[12595, 12595], "mapped", [4522]], [[12596, 12596], "mapped", [4354]], [[12597, 12597], "mapped", [4524]], [[12598, 12598], "mapped", [4525]], [[12599, 12599], "mapped", [4355]], [[12600, 12600], "mapped", [4356]], [[12601, 12601], "mapped", [4357]], [[12602, 12602], "mapped", [4528]], [[12603, 12603], "mapped", [4529]], [[12604, 12604], "mapped", [4530]], [[12605, 12605], "mapped", [4531]], [[12606, 12606], "mapped", [4532]], [[12607, 12607], "mapped", [4533]], [[12608, 12608], "mapped", [4378]], [[12609, 12609], "mapped", [4358]], [[12610, 12610], "mapped", [4359]], [[12611, 12611], "mapped", [4360]], [[12612, 12612], "mapped", [4385]], [[12613, 12613], "mapped", [4361]], [[12614, 12614], "mapped", [4362]], [[12615, 12615], "mapped", [4363]], [[12616, 12616], "mapped", [4364]], [[12617, 12617], "mapped", [4365]], [[12618, 12618], "mapped", [4366]], [[12619, 12619], "mapped", [4367]], [[12620, 12620], "mapped", [4368]], [[12621, 12621], "mapped", [4369]], [[12622, 12622], "mapped", [4370]], [[12623, 12623], "mapped", [4449]], [[12624, 12624], "mapped", [4450]], [[12625, 12625], "mapped", [4451]], [[12626, 12626], "mapped", [4452]], [[12627, 12627], "mapped", [4453]], [[12628, 12628], "mapped", [4454]], [[12629, 12629], "mapped", [4455]], [[12630, 12630], "mapped", [4456]], [[12631, 12631], "mapped", [4457]], [[12632, 12632], "mapped", [4458]], [[12633, 12633], "mapped", [4459]], [[12634, 12634], "mapped", [4460]], [[12635, 12635], "mapped", [4461]], [[12636, 12636], "mapped", [4462]], [[12637, 12637], "mapped", [4463]], [[12638, 12638], "mapped", [4464]], [[12639, 12639], "mapped", [4465]], [[12640, 12640], "mapped", [4466]], [[12641, 12641], "mapped", [4467]], [[12642, 12642], "mapped", [4468]], [[12643, 12643], "mapped", [4469]], [[12644, 12644], "disallowed"], [[12645, 12645], "mapped", [4372]], [[12646, 12646], "mapped", [4373]], [[12647, 12647], "mapped", [4551]], [[12648, 12648], "mapped", [4552]], [[12649, 12649], "mapped", [4556]], [[12650, 12650], "mapped", [4558]], [[12651, 12651], "mapped", [4563]], [[12652, 12652], "mapped", [4567]], [[12653, 12653], "mapped", [4569]], [[12654, 12654], "mapped", [4380]], [[12655, 12655], "mapped", [4573]], [[12656, 12656], "mapped", [4575]], [[12657, 12657], "mapped", [4381]], [[12658, 12658], "mapped", [4382]], [[12659, 12659], "mapped", [4384]], [[12660, 12660], "mapped", [4386]], [[12661, 12661], "mapped", [4387]], [[12662, 12662], "mapped", [4391]], [[12663, 12663], "mapped", [4393]], [[12664, 12664], "mapped", [4395]], [[12665, 12665], "mapped", [4396]], [[12666, 12666], "mapped", [4397]], [[12667, 12667], "mapped", [4398]], [[12668, 12668], "mapped", [4399]], [[12669, 12669], "mapped", [4402]], [[12670, 12670], "mapped", [4406]], [[12671, 12671], "mapped", [4416]], [[12672, 12672], "mapped", [4423]], [[12673, 12673], "mapped", [4428]], [[12674, 12674], "mapped", [4593]], [[12675, 12675], "mapped", [4594]], [[12676, 12676], "mapped", [4439]], [[12677, 12677], "mapped", [4440]], [[12678, 12678], "mapped", [4441]], [[12679, 12679], "mapped", [4484]], [[12680, 12680], "mapped", [4485]], [[12681, 12681], "mapped", [4488]], [[12682, 12682], "mapped", [4497]], [[12683, 12683], "mapped", [4498]], [[12684, 12684], "mapped", [4500]], [[12685, 12685], "mapped", [4510]], [[12686, 12686], "mapped", [4513]], [[12687, 12687], "disallowed"], [[12688, 12689], "valid", [], "NV8"], [[12690, 12690], "mapped", [19968]], [[12691, 12691], "mapped", [20108]], [[12692, 12692], "mapped", [19977]], [[12693, 12693], "mapped", [22235]], [[12694, 12694], "mapped", [19978]], [[12695, 12695], "mapped", [20013]], [[12696, 12696], "mapped", [19979]], [[12697, 12697], "mapped", [30002]], [[12698, 12698], "mapped", [20057]], [[12699, 12699], "mapped", [19993]], [[12700, 12700], "mapped", [19969]], [[12701, 12701], "mapped", [22825]], [[12702, 12702], "mapped", [22320]], [[12703, 12703], "mapped", [20154]], [[12704, 12727], "valid"], [[12728, 12730], "valid"], [[12731, 12735], "disallowed"], [[12736, 12751], "valid", [], "NV8"], [[12752, 12771], "valid", [], "NV8"], [[12772, 12783], "disallowed"], [[12784, 12799], "valid"], [[12800, 12800], "disallowed_STD3_mapped", [40, 4352, 41]], [[12801, 12801], "disallowed_STD3_mapped", [40, 4354, 41]], [[12802, 12802], "disallowed_STD3_mapped", [40, 4355, 41]], [[12803, 12803], "disallowed_STD3_mapped", [40, 4357, 41]], [[12804, 12804], "disallowed_STD3_mapped", [40, 4358, 41]], [[12805, 12805], "disallowed_STD3_mapped", [40, 4359, 41]], [[12806, 12806], "disallowed_STD3_mapped", [40, 4361, 41]], [[12807, 12807], "disallowed_STD3_mapped", [40, 4363, 41]], [[12808, 12808], "disallowed_STD3_mapped", [40, 4364, 41]], [[12809, 12809], "disallowed_STD3_mapped", [40, 4366, 41]], [[12810, 12810], "disallowed_STD3_mapped", [40, 4367, 41]], [[12811, 12811], "disallowed_STD3_mapped", [40, 4368, 41]], [[12812, 12812], "disallowed_STD3_mapped", [40, 4369, 41]], [[12813, 12813], "disallowed_STD3_mapped", [40, 4370, 41]], [[12814, 12814], "disallowed_STD3_mapped", [40, 44032, 41]], [[12815, 12815], "disallowed_STD3_mapped", [40, 45208, 41]], [[12816, 12816], "disallowed_STD3_mapped", [40, 45796, 41]], [[12817, 12817], "disallowed_STD3_mapped", [40, 46972, 41]], [[12818, 12818], "disallowed_STD3_mapped", [40, 47560, 41]], [[12819, 12819], "disallowed_STD3_mapped", [40, 48148, 41]], [[12820, 12820], "disallowed_STD3_mapped", [40, 49324, 41]], [[12821, 12821], "disallowed_STD3_mapped", [40, 50500, 41]], [[12822, 12822], "disallowed_STD3_mapped", [40, 51088, 41]], [[12823, 12823], "disallowed_STD3_mapped", [40, 52264, 41]], [[12824, 12824], "disallowed_STD3_mapped", [40, 52852, 41]], [[12825, 12825], "disallowed_STD3_mapped", [40, 53440, 41]], [[12826, 12826], "disallowed_STD3_mapped", [40, 54028, 41]], [[12827, 12827], "disallowed_STD3_mapped", [40, 54616, 41]], [[12828, 12828], "disallowed_STD3_mapped", [40, 51452, 41]], [[12829, 12829], "disallowed_STD3_mapped", [40, 50724, 51204, 41]], [[12830, 12830], "disallowed_STD3_mapped", [40, 50724, 54980, 41]], [[12831, 12831], "disallowed"], [[12832, 12832], "disallowed_STD3_mapped", [40, 19968, 41]], [[12833, 12833], "disallowed_STD3_mapped", [40, 20108, 41]], [[12834, 12834], "disallowed_STD3_mapped", [40, 19977, 41]], [[12835, 12835], "disallowed_STD3_mapped", [40, 22235, 41]], [[12836, 12836], "disallowed_STD3_mapped", [40, 20116, 41]], [[12837, 12837], "disallowed_STD3_mapped", [40, 20845, 41]], [[12838, 12838], "disallowed_STD3_mapped", [40, 19971, 41]], [[12839, 12839], "disallowed_STD3_mapped", [40, 20843, 41]], [[12840, 12840], "disallowed_STD3_mapped", [40, 20061, 41]], [[12841, 12841], "disallowed_STD3_mapped", [40, 21313, 41]], [[12842, 12842], "disallowed_STD3_mapped", [40, 26376, 41]], [[12843, 12843], "disallowed_STD3_mapped", [40, 28779, 41]], [[12844, 12844], "disallowed_STD3_mapped", [40, 27700, 41]], [[12845, 12845], "disallowed_STD3_mapped", [40, 26408, 41]], [[12846, 12846], "disallowed_STD3_mapped", [40, 37329, 41]], [[12847, 12847], "disallowed_STD3_mapped", [40, 22303, 41]], [[12848, 12848], "disallowed_STD3_mapped", [40, 26085, 41]], [[12849, 12849], "disallowed_STD3_mapped", [40, 26666, 41]], [[12850, 12850], "disallowed_STD3_mapped", [40, 26377, 41]], [[12851, 12851], "disallowed_STD3_mapped", [40, 31038, 41]], [[12852, 12852], "disallowed_STD3_mapped", [40, 21517, 41]], [[12853, 12853], "disallowed_STD3_mapped", [40, 29305, 41]], [[12854, 12854], "disallowed_STD3_mapped", [40, 36001, 41]], [[12855, 12855], "disallowed_STD3_mapped", [40, 31069, 41]], [[12856, 12856], "disallowed_STD3_mapped", [40, 21172, 41]], [[12857, 12857], "disallowed_STD3_mapped", [40, 20195, 41]], [[12858, 12858], "disallowed_STD3_mapped", [40, 21628, 41]], [[12859, 12859], "disallowed_STD3_mapped", [40, 23398, 41]], [[12860, 12860], "disallowed_STD3_mapped", [40, 30435, 41]], [[12861, 12861], "disallowed_STD3_mapped", [40, 20225, 41]], [[12862, 12862], "disallowed_STD3_mapped", [40, 36039, 41]], [[12863, 12863], "disallowed_STD3_mapped", [40, 21332, 41]], [[12864, 12864], "disallowed_STD3_mapped", [40, 31085, 41]], [[12865, 12865], "disallowed_STD3_mapped", [40, 20241, 41]], [[12866, 12866], "disallowed_STD3_mapped", [40, 33258, 41]], [[12867, 12867], "disallowed_STD3_mapped", [40, 33267, 41]], [[12868, 12868], "mapped", [21839]], [[12869, 12869], "mapped", [24188]], [[12870, 12870], "mapped", [25991]], [[12871, 12871], "mapped", [31631]], [[12872, 12879], "valid", [], "NV8"], [[12880, 12880], "mapped", [112, 116, 101]], [[12881, 12881], "mapped", [50, 49]], [[12882, 12882], "mapped", [50, 50]], [[12883, 12883], "mapped", [50, 51]], [[12884, 12884], "mapped", [50, 52]], [[12885, 12885], "mapped", [50, 53]], [[12886, 12886], "mapped", [50, 54]], [[12887, 12887], "mapped", [50, 55]], [[12888, 12888], "mapped", [50, 56]], [[12889, 12889], "mapped", [50, 57]], [[12890, 12890], "mapped", [51, 48]], [[12891, 12891], "mapped", [51, 49]], [[12892, 12892], "mapped", [51, 50]], [[12893, 12893], "mapped", [51, 51]], [[12894, 12894], "mapped", [51, 52]], [[12895, 12895], "mapped", [51, 53]], [[12896, 12896], "mapped", [4352]], [[12897, 12897], "mapped", [4354]], [[12898, 12898], "mapped", [4355]], [[12899, 12899], "mapped", [4357]], [[12900, 12900], "mapped", [4358]], [[12901, 12901], "mapped", [4359]], [[12902, 12902], "mapped", [4361]], [[12903, 12903], "mapped", [4363]], [[12904, 12904], "mapped", [4364]], [[12905, 12905], "mapped", [4366]], [[12906, 12906], "mapped", [4367]], [[12907, 12907], "mapped", [4368]], [[12908, 12908], "mapped", [4369]], [[12909, 12909], "mapped", [4370]], [[12910, 12910], "mapped", [44032]], [[12911, 12911], "mapped", [45208]], [[12912, 12912], "mapped", [45796]], [[12913, 12913], "mapped", [46972]], [[12914, 12914], "mapped", [47560]], [[12915, 12915], "mapped", [48148]], [[12916, 12916], "mapped", [49324]], [[12917, 12917], "mapped", [50500]], [[12918, 12918], "mapped", [51088]], [[12919, 12919], "mapped", [52264]], [[12920, 12920], "mapped", [52852]], [[12921, 12921], "mapped", [53440]], [[12922, 12922], "mapped", [54028]], [[12923, 12923], "mapped", [54616]], [[12924, 12924], "mapped", [52280, 44256]], [[12925, 12925], "mapped", [51452, 51032]], [[12926, 12926], "mapped", [50864]], [[12927, 12927], "valid", [], "NV8"], [[12928, 12928], "mapped", [19968]], [[12929, 12929], "mapped", [20108]], [[12930, 12930], "mapped", [19977]], [[12931, 12931], "mapped", [22235]], [[12932, 12932], "mapped", [20116]], [[12933, 12933], "mapped", [20845]], [[12934, 12934], "mapped", [19971]], [[12935, 12935], "mapped", [20843]], [[12936, 12936], "mapped", [20061]], [[12937, 12937], "mapped", [21313]], [[12938, 12938], "mapped", [26376]], [[12939, 12939], "mapped", [28779]], [[12940, 12940], "mapped", [27700]], [[12941, 12941], "mapped", [26408]], [[12942, 12942], "mapped", [37329]], [[12943, 12943], "mapped", [22303]], [[12944, 12944], "mapped", [26085]], [[12945, 12945], "mapped", [26666]], [[12946, 12946], "mapped", [26377]], [[12947, 12947], "mapped", [31038]], [[12948, 12948], "mapped", [21517]], [[12949, 12949], "mapped", [29305]], [[12950, 12950], "mapped", [36001]], [[12951, 12951], "mapped", [31069]], [[12952, 12952], "mapped", [21172]], [[12953, 12953], "mapped", [31192]], [[12954, 12954], "mapped", [30007]], [[12955, 12955], "mapped", [22899]], [[12956, 12956], "mapped", [36969]], [[12957, 12957], "mapped", [20778]], [[12958, 12958], "mapped", [21360]], [[12959, 12959], "mapped", [27880]], [[12960, 12960], "mapped", [38917]], [[12961, 12961], "mapped", [20241]], [[12962, 12962], "mapped", [20889]], [[12963, 12963], "mapped", [27491]], [[12964, 12964], "mapped", [19978]], [[12965, 12965], "mapped", [20013]], [[12966, 12966], "mapped", [19979]], [[12967, 12967], "mapped", [24038]], [[12968, 12968], "mapped", [21491]], [[12969, 12969], "mapped", [21307]], [[12970, 12970], "mapped", [23447]], [[12971, 12971], "mapped", [23398]], [[12972, 12972], "mapped", [30435]], [[12973, 12973], "mapped", [20225]], [[12974, 12974], "mapped", [36039]], [[12975, 12975], "mapped", [21332]], [[12976, 12976], "mapped", [22812]], [[12977, 12977], "mapped", [51, 54]], [[12978, 12978], "mapped", [51, 55]], [[12979, 12979], "mapped", [51, 56]], [[12980, 12980], "mapped", [51, 57]], [[12981, 12981], "mapped", [52, 48]], [[12982, 12982], "mapped", [52, 49]], [[12983, 12983], "mapped", [52, 50]], [[12984, 12984], "mapped", [52, 51]], [[12985, 12985], "mapped", [52, 52]], [[12986, 12986], "mapped", [52, 53]], [[12987, 12987], "mapped", [52, 54]], [[12988, 12988], "mapped", [52, 55]], [[12989, 12989], "mapped", [52, 56]], [[12990, 12990], "mapped", [52, 57]], [[12991, 12991], "mapped", [53, 48]], [[12992, 12992], "mapped", [49, 26376]], [[12993, 12993], "mapped", [50, 26376]], [[12994, 12994], "mapped", [51, 26376]], [[12995, 12995], "mapped", [52, 26376]], [[12996, 12996], "mapped", [53, 26376]], [[12997, 12997], "mapped", [54, 26376]], [[12998, 12998], "mapped", [55, 26376]], [[12999, 12999], "mapped", [56, 26376]], [[13000, 13000], "mapped", [57, 26376]], [[13001, 13001], "mapped", [49, 48, 26376]], [[13002, 13002], "mapped", [49, 49, 26376]], [[13003, 13003], "mapped", [49, 50, 26376]], [[13004, 13004], "mapped", [104, 103]], [[13005, 13005], "mapped", [101, 114, 103]], [[13006, 13006], "mapped", [101, 118]], [[13007, 13007], "mapped", [108, 116, 100]], [[13008, 13008], "mapped", [12450]], [[13009, 13009], "mapped", [12452]], [[13010, 13010], "mapped", [12454]], [[13011, 13011], "mapped", [12456]], [[13012, 13012], "mapped", [12458]], [[13013, 13013], "mapped", [12459]], [[13014, 13014], "mapped", [12461]], [[13015, 13015], "mapped", [12463]], [[13016, 13016], "mapped", [12465]], [[13017, 13017], "mapped", [12467]], [[13018, 13018], "mapped", [12469]], [[13019, 13019], "mapped", [12471]], [[13020, 13020], "mapped", [12473]], [[13021, 13021], "mapped", [12475]], [[13022, 13022], "mapped", [12477]], [[13023, 13023], "mapped", [12479]], [[13024, 13024], "mapped", [12481]], [[13025, 13025], "mapped", [12484]], [[13026, 13026], "mapped", [12486]], [[13027, 13027], "mapped", [12488]], [[13028, 13028], "mapped", [12490]], [[13029, 13029], "mapped", [12491]], [[13030, 13030], "mapped", [12492]], [[13031, 13031], "mapped", [12493]], [[13032, 13032], "mapped", [12494]], [[13033, 13033], "mapped", [12495]], [[13034, 13034], "mapped", [12498]], [[13035, 13035], "mapped", [12501]], [[13036, 13036], "mapped", [12504]], [[13037, 13037], "mapped", [12507]], [[13038, 13038], "mapped", [12510]], [[13039, 13039], "mapped", [12511]], [[13040, 13040], "mapped", [12512]], [[13041, 13041], "mapped", [12513]], [[13042, 13042], "mapped", [12514]], [[13043, 13043], "mapped", [12516]], [[13044, 13044], "mapped", [12518]], [[13045, 13045], "mapped", [12520]], [[13046, 13046], "mapped", [12521]], [[13047, 13047], "mapped", [12522]], [[13048, 13048], "mapped", [12523]], [[13049, 13049], "mapped", [12524]], [[13050, 13050], "mapped", [12525]], [[13051, 13051], "mapped", [12527]], [[13052, 13052], "mapped", [12528]], [[13053, 13053], "mapped", [12529]], [[13054, 13054], "mapped", [12530]], [[13055, 13055], "disallowed"], [[13056, 13056], "mapped", [12450, 12497, 12540, 12488]], [[13057, 13057], "mapped", [12450, 12523, 12501, 12449]], [[13058, 13058], "mapped", [12450, 12531, 12506, 12450]], [[13059, 13059], "mapped", [12450, 12540, 12523]], [[13060, 13060], "mapped", [12452, 12491, 12531, 12464]], [[13061, 13061], "mapped", [12452, 12531, 12481]], [[13062, 13062], "mapped", [12454, 12457, 12531]], [[13063, 13063], "mapped", [12456, 12473, 12463, 12540, 12489]], [[13064, 13064], "mapped", [12456, 12540, 12459, 12540]], [[13065, 13065], "mapped", [12458, 12531, 12473]], [[13066, 13066], "mapped", [12458, 12540, 12512]], [[13067, 13067], "mapped", [12459, 12452, 12522]], [[13068, 13068], "mapped", [12459, 12521, 12483, 12488]], [[13069, 13069], "mapped", [12459, 12525, 12522, 12540]], [[13070, 13070], "mapped", [12460, 12525, 12531]], [[13071, 13071], "mapped", [12460, 12531, 12510]], [[13072, 13072], "mapped", [12462, 12460]], [[13073, 13073], "mapped", [12462, 12491, 12540]], [[13074, 13074], "mapped", [12461, 12517, 12522, 12540]], [[13075, 13075], "mapped", [12462, 12523, 12480, 12540]], [[13076, 13076], "mapped", [12461, 12525]], [[13077, 13077], "mapped", [12461, 12525, 12464, 12521, 12512]], [[13078, 13078], "mapped", [12461, 12525, 12513, 12540, 12488, 12523]], [[13079, 13079], "mapped", [12461, 12525, 12527, 12483, 12488]], [[13080, 13080], "mapped", [12464, 12521, 12512]], [[13081, 13081], "mapped", [12464, 12521, 12512, 12488, 12531]], [[13082, 13082], "mapped", [12463, 12523, 12476, 12452, 12525]], [[13083, 13083], "mapped", [12463, 12525, 12540, 12493]], [[13084, 13084], "mapped", [12465, 12540, 12473]], [[13085, 13085], "mapped", [12467, 12523, 12490]], [[13086, 13086], "mapped", [12467, 12540, 12509]], [[13087, 13087], "mapped", [12469, 12452, 12463, 12523]], [[13088, 13088], "mapped", [12469, 12531, 12481, 12540, 12512]], [[13089, 13089], "mapped", [12471, 12522, 12531, 12464]], [[13090, 13090], "mapped", [12475, 12531, 12481]], [[13091, 13091], "mapped", [12475, 12531, 12488]], [[13092, 13092], "mapped", [12480, 12540, 12473]], [[13093, 13093], "mapped", [12487, 12471]], [[13094, 13094], "mapped", [12489, 12523]], [[13095, 13095], "mapped", [12488, 12531]], [[13096, 13096], "mapped", [12490, 12494]], [[13097, 13097], "mapped", [12494, 12483, 12488]], [[13098, 13098], "mapped", [12495, 12452, 12484]], [[13099, 13099], "mapped", [12497, 12540, 12475, 12531, 12488]], [[13100, 13100], "mapped", [12497, 12540, 12484]], [[13101, 13101], "mapped", [12496, 12540, 12524, 12523]], [[13102, 13102], "mapped", [12500, 12450, 12473, 12488, 12523]], [[13103, 13103], "mapped", [12500, 12463, 12523]], [[13104, 13104], "mapped", [12500, 12467]], [[13105, 13105], "mapped", [12499, 12523]], [[13106, 13106], "mapped", [12501, 12449, 12521, 12483, 12489]], [[13107, 13107], "mapped", [12501, 12451, 12540, 12488]], [[13108, 13108], "mapped", [12502, 12483, 12471, 12455, 12523]], [[13109, 13109], "mapped", [12501, 12521, 12531]], [[13110, 13110], "mapped", [12504, 12463, 12479, 12540, 12523]], [[13111, 13111], "mapped", [12506, 12477]], [[13112, 13112], "mapped", [12506, 12491, 12498]], [[13113, 13113], "mapped", [12504, 12523, 12484]], [[13114, 13114], "mapped", [12506, 12531, 12473]], [[13115, 13115], "mapped", [12506, 12540, 12472]], [[13116, 13116], "mapped", [12505, 12540, 12479]], [[13117, 13117], "mapped", [12509, 12452, 12531, 12488]], [[13118, 13118], "mapped", [12508, 12523, 12488]], [[13119, 13119], "mapped", [12507, 12531]], [[13120, 13120], "mapped", [12509, 12531, 12489]], [[13121, 13121], "mapped", [12507, 12540, 12523]], [[13122, 13122], "mapped", [12507, 12540, 12531]], [[13123, 13123], "mapped", [12510, 12452, 12463, 12525]], [[13124, 13124], "mapped", [12510, 12452, 12523]], [[13125, 13125], "mapped", [12510, 12483, 12495]], [[13126, 13126], "mapped", [12510, 12523, 12463]], [[13127, 13127], "mapped", [12510, 12531, 12471, 12519, 12531]], [[13128, 13128], "mapped", [12511, 12463, 12525, 12531]], [[13129, 13129], "mapped", [12511, 12522]], [[13130, 13130], "mapped", [12511, 12522, 12496, 12540, 12523]], [[13131, 13131], "mapped", [12513, 12460]], [[13132, 13132], "mapped", [12513, 12460, 12488, 12531]], [[13133, 13133], "mapped", [12513, 12540, 12488, 12523]], [[13134, 13134], "mapped", [12516, 12540, 12489]], [[13135, 13135], "mapped", [12516, 12540, 12523]], [[13136, 13136], "mapped", [12518, 12450, 12531]], [[13137, 13137], "mapped", [12522, 12483, 12488, 12523]], [[13138, 13138], "mapped", [12522, 12521]], [[13139, 13139], "mapped", [12523, 12500, 12540]], [[13140, 13140], "mapped", [12523, 12540, 12502, 12523]], [[13141, 13141], "mapped", [12524, 12512]], [[13142, 13142], "mapped", [12524, 12531, 12488, 12466, 12531]], [[13143, 13143], "mapped", [12527, 12483, 12488]], [[13144, 13144], "mapped", [48, 28857]], [[13145, 13145], "mapped", [49, 28857]], [[13146, 13146], "mapped", [50, 28857]], [[13147, 13147], "mapped", [51, 28857]], [[13148, 13148], "mapped", [52, 28857]], [[13149, 13149], "mapped", [53, 28857]], [[13150, 13150], "mapped", [54, 28857]], [[13151, 13151], "mapped", [55, 28857]], [[13152, 13152], "mapped", [56, 28857]], [[13153, 13153], "mapped", [57, 28857]], [[13154, 13154], "mapped", [49, 48, 28857]], [[13155, 13155], "mapped", [49, 49, 28857]], [[13156, 13156], "mapped", [49, 50, 28857]], [[13157, 13157], "mapped", [49, 51, 28857]], [[13158, 13158], "mapped", [49, 52, 28857]], [[13159, 13159], "mapped", [49, 53, 28857]], [[13160, 13160], "mapped", [49, 54, 28857]], [[13161, 13161], "mapped", [49, 55, 28857]], [[13162, 13162], "mapped", [49, 56, 28857]], [[13163, 13163], "mapped", [49, 57, 28857]], [[13164, 13164], "mapped", [50, 48, 28857]], [[13165, 13165], "mapped", [50, 49, 28857]], [[13166, 13166], "mapped", [50, 50, 28857]], [[13167, 13167], "mapped", [50, 51, 28857]], [[13168, 13168], "mapped", [50, 52, 28857]], [[13169, 13169], "mapped", [104, 112, 97]], [[13170, 13170], "mapped", [100, 97]], [[13171, 13171], "mapped", [97, 117]], [[13172, 13172], "mapped", [98, 97, 114]], [[13173, 13173], "mapped", [111, 118]], [[13174, 13174], "mapped", [112, 99]], [[13175, 13175], "mapped", [100, 109]], [[13176, 13176], "mapped", [100, 109, 50]], [[13177, 13177], "mapped", [100, 109, 51]], [[13178, 13178], "mapped", [105, 117]], [[13179, 13179], "mapped", [24179, 25104]], [[13180, 13180], "mapped", [26157, 21644]], [[13181, 13181], "mapped", [22823, 27491]], [[13182, 13182], "mapped", [26126, 27835]], [[13183, 13183], "mapped", [26666, 24335, 20250, 31038]], [[13184, 13184], "mapped", [112, 97]], [[13185, 13185], "mapped", [110, 97]], [[13186, 13186], "mapped", [956, 97]], [[13187, 13187], "mapped", [109, 97]], [[13188, 13188], "mapped", [107, 97]], [[13189, 13189], "mapped", [107, 98]], [[13190, 13190], "mapped", [109, 98]], [[13191, 13191], "mapped", [103, 98]], [[13192, 13192], "mapped", [99, 97, 108]], [[13193, 13193], "mapped", [107, 99, 97, 108]], [[13194, 13194], "mapped", [112, 102]], [[13195, 13195], "mapped", [110, 102]], [[13196, 13196], "mapped", [956, 102]], [[13197, 13197], "mapped", [956, 103]], [[13198, 13198], "mapped", [109, 103]], [[13199, 13199], "mapped", [107, 103]], [[13200, 13200], "mapped", [104, 122]], [[13201, 13201], "mapped", [107, 104, 122]], [[13202, 13202], "mapped", [109, 104, 122]], [[13203, 13203], "mapped", [103, 104, 122]], [[13204, 13204], "mapped", [116, 104, 122]], [[13205, 13205], "mapped", [956, 108]], [[13206, 13206], "mapped", [109, 108]], [[13207, 13207], "mapped", [100, 108]], [[13208, 13208], "mapped", [107, 108]], [[13209, 13209], "mapped", [102, 109]], [[13210, 13210], "mapped", [110, 109]], [[13211, 13211], "mapped", [956, 109]], [[13212, 13212], "mapped", [109, 109]], [[13213, 13213], "mapped", [99, 109]], [[13214, 13214], "mapped", [107, 109]], [[13215, 13215], "mapped", [109, 109, 50]], [[13216, 13216], "mapped", [99, 109, 50]], [[13217, 13217], "mapped", [109, 50]], [[13218, 13218], "mapped", [107, 109, 50]], [[13219, 13219], "mapped", [109, 109, 51]], [[13220, 13220], "mapped", [99, 109, 51]], [[13221, 13221], "mapped", [109, 51]], [[13222, 13222], "mapped", [107, 109, 51]], [[13223, 13223], "mapped", [109, 8725, 115]], [[13224, 13224], "mapped", [109, 8725, 115, 50]], [[13225, 13225], "mapped", [112, 97]], [[13226, 13226], "mapped", [107, 112, 97]], [[13227, 13227], "mapped", [109, 112, 97]], [[13228, 13228], "mapped", [103, 112, 97]], [[13229, 13229], "mapped", [114, 97, 100]], [[13230, 13230], "mapped", [114, 97, 100, 8725, 115]], [[13231, 13231], "mapped", [114, 97, 100, 8725, 115, 50]], [[13232, 13232], "mapped", [112, 115]], [[13233, 13233], "mapped", [110, 115]], [[13234, 13234], "mapped", [956, 115]], [[13235, 13235], "mapped", [109, 115]], [[13236, 13236], "mapped", [112, 118]], [[13237, 13237], "mapped", [110, 118]], [[13238, 13238], "mapped", [956, 118]], [[13239, 13239], "mapped", [109, 118]], [[13240, 13240], "mapped", [107, 118]], [[13241, 13241], "mapped", [109, 118]], [[13242, 13242], "mapped", [112, 119]], [[13243, 13243], "mapped", [110, 119]], [[13244, 13244], "mapped", [956, 119]], [[13245, 13245], "mapped", [109, 119]], [[13246, 13246], "mapped", [107, 119]], [[13247, 13247], "mapped", [109, 119]], [[13248, 13248], "mapped", [107, 969]], [[13249, 13249], "mapped", [109, 969]], [[13250, 13250], "disallowed"], [[13251, 13251], "mapped", [98, 113]], [[13252, 13252], "mapped", [99, 99]], [[13253, 13253], "mapped", [99, 100]], [[13254, 13254], "mapped", [99, 8725, 107, 103]], [[13255, 13255], "disallowed"], [[13256, 13256], "mapped", [100, 98]], [[13257, 13257], "mapped", [103, 121]], [[13258, 13258], "mapped", [104, 97]], [[13259, 13259], "mapped", [104, 112]], [[13260, 13260], "mapped", [105, 110]], [[13261, 13261], "mapped", [107, 107]], [[13262, 13262], "mapped", [107, 109]], [[13263, 13263], "mapped", [107, 116]], [[13264, 13264], "mapped", [108, 109]], [[13265, 13265], "mapped", [108, 110]], [[13266, 13266], "mapped", [108, 111, 103]], [[13267, 13267], "mapped", [108, 120]], [[13268, 13268], "mapped", [109, 98]], [[13269, 13269], "mapped", [109, 105, 108]], [[13270, 13270], "mapped", [109, 111, 108]], [[13271, 13271], "mapped", [112, 104]], [[13272, 13272], "disallowed"], [[13273, 13273], "mapped", [112, 112, 109]], [[13274, 13274], "mapped", [112, 114]], [[13275, 13275], "mapped", [115, 114]], [[13276, 13276], "mapped", [115, 118]], [[13277, 13277], "mapped", [119, 98]], [[13278, 13278], "mapped", [118, 8725, 109]], [[13279, 13279], "mapped", [97, 8725, 109]], [[13280, 13280], "mapped", [49, 26085]], [[13281, 13281], "mapped", [50, 26085]], [[13282, 13282], "mapped", [51, 26085]], [[13283, 13283], "mapped", [52, 26085]], [[13284, 13284], "mapped", [53, 26085]], [[13285, 13285], "mapped", [54, 26085]], [[13286, 13286], "mapped", [55, 26085]], [[13287, 13287], "mapped", [56, 26085]], [[13288, 13288], "mapped", [57, 26085]], [[13289, 13289], "mapped", [49, 48, 26085]], [[13290, 13290], "mapped", [49, 49, 26085]], [[13291, 13291], "mapped", [49, 50, 26085]], [[13292, 13292], "mapped", [49, 51, 26085]], [[13293, 13293], "mapped", [49, 52, 26085]], [[13294, 13294], "mapped", [49, 53, 26085]], [[13295, 13295], "mapped", [49, 54, 26085]], [[13296, 13296], "mapped", [49, 55, 26085]], [[13297, 13297], "mapped", [49, 56, 26085]], [[13298, 13298], "mapped", [49, 57, 26085]], [[13299, 13299], "mapped", [50, 48, 26085]], [[13300, 13300], "mapped", [50, 49, 26085]], [[13301, 13301], "mapped", [50, 50, 26085]], [[13302, 13302], "mapped", [50, 51, 26085]], [[13303, 13303], "mapped", [50, 52, 26085]], [[13304, 13304], "mapped", [50, 53, 26085]], [[13305, 13305], "mapped", [50, 54, 26085]], [[13306, 13306], "mapped", [50, 55, 26085]], [[13307, 13307], "mapped", [50, 56, 26085]], [[13308, 13308], "mapped", [50, 57, 26085]], [[13309, 13309], "mapped", [51, 48, 26085]], [[13310, 13310], "mapped", [51, 49, 26085]], [[13311, 13311], "mapped", [103, 97, 108]], [[13312, 19893], "valid"], [[19894, 19903], "disallowed"], [[19904, 19967], "valid", [], "NV8"], [[19968, 40869], "valid"], [[40870, 40891], "valid"], [[40892, 40899], "valid"], [[40900, 40907], "valid"], [[40908, 40908], "valid"], [[40909, 40917], "valid"], [[40918, 40959], "disallowed"], [[40960, 42124], "valid"], [[42125, 42127], "disallowed"], [[42128, 42145], "valid", [], "NV8"], [[42146, 42147], "valid", [], "NV8"], [[42148, 42163], "valid", [], "NV8"], [[42164, 42164], "valid", [], "NV8"], [[42165, 42176], "valid", [], "NV8"], [[42177, 42177], "valid", [], "NV8"], [[42178, 42180], "valid", [], "NV8"], [[42181, 42181], "valid", [], "NV8"], [[42182, 42182], "valid", [], "NV8"], [[42183, 42191], "disallowed"], [[42192, 42237], "valid"], [[42238, 42239], "valid", [], "NV8"], [[42240, 42508], "valid"], [[42509, 42511], "valid", [], "NV8"], [[42512, 42539], "valid"], [[42540, 42559], "disallowed"], [[42560, 42560], "mapped", [42561]], [[42561, 42561], "valid"], [[42562, 42562], "mapped", [42563]], [[42563, 42563], "valid"], [[42564, 42564], "mapped", [42565]], [[42565, 42565], "valid"], [[42566, 42566], "mapped", [42567]], [[42567, 42567], "valid"], [[42568, 42568], "mapped", [42569]], [[42569, 42569], "valid"], [[42570, 42570], "mapped", [42571]], [[42571, 42571], "valid"], [[42572, 42572], "mapped", [42573]], [[42573, 42573], "valid"], [[42574, 42574], "mapped", [42575]], [[42575, 42575], "valid"], [[42576, 42576], "mapped", [42577]], [[42577, 42577], "valid"], [[42578, 42578], "mapped", [42579]], [[42579, 42579], "valid"], [[42580, 42580], "mapped", [42581]], [[42581, 42581], "valid"], [[42582, 42582], "mapped", [42583]], [[42583, 42583], "valid"], [[42584, 42584], "mapped", [42585]], [[42585, 42585], "valid"], [[42586, 42586], "mapped", [42587]], [[42587, 42587], "valid"], [[42588, 42588], "mapped", [42589]], [[42589, 42589], "valid"], [[42590, 42590], "mapped", [42591]], [[42591, 42591], "valid"], [[42592, 42592], "mapped", [42593]], [[42593, 42593], "valid"], [[42594, 42594], "mapped", [42595]], [[42595, 42595], "valid"], [[42596, 42596], "mapped", [42597]], [[42597, 42597], "valid"], [[42598, 42598], "mapped", [42599]], [[42599, 42599], "valid"], [[42600, 42600], "mapped", [42601]], [[42601, 42601], "valid"], [[42602, 42602], "mapped", [42603]], [[42603, 42603], "valid"], [[42604, 42604], "mapped", [42605]], [[42605, 42607], "valid"], [[42608, 42611], "valid", [], "NV8"], [[42612, 42619], "valid"], [[42620, 42621], "valid"], [[42622, 42622], "valid", [], "NV8"], [[42623, 42623], "valid"], [[42624, 42624], "mapped", [42625]], [[42625, 42625], "valid"], [[42626, 42626], "mapped", [42627]], [[42627, 42627], "valid"], [[42628, 42628], "mapped", [42629]], [[42629, 42629], "valid"], [[42630, 42630], "mapped", [42631]], [[42631, 42631], "valid"], [[42632, 42632], "mapped", [42633]], [[42633, 42633], "valid"], [[42634, 42634], "mapped", [42635]], [[42635, 42635], "valid"], [[42636, 42636], "mapped", [42637]], [[42637, 42637], "valid"], [[42638, 42638], "mapped", [42639]], [[42639, 42639], "valid"], [[42640, 42640], "mapped", [42641]], [[42641, 42641], "valid"], [[42642, 42642], "mapped", [42643]], [[42643, 42643], "valid"], [[42644, 42644], "mapped", [42645]], [[42645, 42645], "valid"], [[42646, 42646], "mapped", [42647]], [[42647, 42647], "valid"], [[42648, 42648], "mapped", [42649]], [[42649, 42649], "valid"], [[42650, 42650], "mapped", [42651]], [[42651, 42651], "valid"], [[42652, 42652], "mapped", [1098]], [[42653, 42653], "mapped", [1100]], [[42654, 42654], "valid"], [[42655, 42655], "valid"], [[42656, 42725], "valid"], [[42726, 42735], "valid", [], "NV8"], [[42736, 42737], "valid"], [[42738, 42743], "valid", [], "NV8"], [[42744, 42751], "disallowed"], [[42752, 42774], "valid", [], "NV8"], [[42775, 42778], "valid"], [[42779, 42783], "valid"], [[42784, 42785], "valid", [], "NV8"], [[42786, 42786], "mapped", [42787]], [[42787, 42787], "valid"], [[42788, 42788], "mapped", [42789]], [[42789, 42789], "valid"], [[42790, 42790], "mapped", [42791]], [[42791, 42791], "valid"], [[42792, 42792], "mapped", [42793]], [[42793, 42793], "valid"], [[42794, 42794], "mapped", [42795]], [[42795, 42795], "valid"], [[42796, 42796], "mapped", [42797]], [[42797, 42797], "valid"], [[42798, 42798], "mapped", [42799]], [[42799, 42801], "valid"], [[42802, 42802], "mapped", [42803]], [[42803, 42803], "valid"], [[42804, 42804], "mapped", [42805]], [[42805, 42805], "valid"], [[42806, 42806], "mapped", [42807]], [[42807, 42807], "valid"], [[42808, 42808], "mapped", [42809]], [[42809, 42809], "valid"], [[42810, 42810], "mapped", [42811]], [[42811, 42811], "valid"], [[42812, 42812], "mapped", [42813]], [[42813, 42813], "valid"], [[42814, 42814], "mapped", [42815]], [[42815, 42815], "valid"], [[42816, 42816], "mapped", [42817]], [[42817, 42817], "valid"], [[42818, 42818], "mapped", [42819]], [[42819, 42819], "valid"], [[42820, 42820], "mapped", [42821]], [[42821, 42821], "valid"], [[42822, 42822], "mapped", [42823]], [[42823, 42823], "valid"], [[42824, 42824], "mapped", [42825]], [[42825, 42825], "valid"], [[42826, 42826], "mapped", [42827]], [[42827, 42827], "valid"], [[42828, 42828], "mapped", [42829]], [[42829, 42829], "valid"], [[42830, 42830], "mapped", [42831]], [[42831, 42831], "valid"], [[42832, 42832], "mapped", [42833]], [[42833, 42833], "valid"], [[42834, 42834], "mapped", [42835]], [[42835, 42835], "valid"], [[42836, 42836], "mapped", [42837]], [[42837, 42837], "valid"], [[42838, 42838], "mapped", [42839]], [[42839, 42839], "valid"], [[42840, 42840], "mapped", [42841]], [[42841, 42841], "valid"], [[42842, 42842], "mapped", [42843]], [[42843, 42843], "valid"], [[42844, 42844], "mapped", [42845]], [[42845, 42845], "valid"], [[42846, 42846], "mapped", [42847]], [[42847, 42847], "valid"], [[42848, 42848], "mapped", [42849]], [[42849, 42849], "valid"], [[42850, 42850], "mapped", [42851]], [[42851, 42851], "valid"], [[42852, 42852], "mapped", [42853]], [[42853, 42853], "valid"], [[42854, 42854], "mapped", [42855]], [[42855, 42855], "valid"], [[42856, 42856], "mapped", [42857]], [[42857, 42857], "valid"], [[42858, 42858], "mapped", [42859]], [[42859, 42859], "valid"], [[42860, 42860], "mapped", [42861]], [[42861, 42861], "valid"], [[42862, 42862], "mapped", [42863]], [[42863, 42863], "valid"], [[42864, 42864], "mapped", [42863]], [[42865, 42872], "valid"], [[42873, 42873], "mapped", [42874]], [[42874, 42874], "valid"], [[42875, 42875], "mapped", [42876]], [[42876, 42876], "valid"], [[42877, 42877], "mapped", [7545]], [[42878, 42878], "mapped", [42879]], [[42879, 42879], "valid"], [[42880, 42880], "mapped", [42881]], [[42881, 42881], "valid"], [[42882, 42882], "mapped", [42883]], [[42883, 42883], "valid"], [[42884, 42884], "mapped", [42885]], [[42885, 42885], "valid"], [[42886, 42886], "mapped", [42887]], [[42887, 42888], "valid"], [[42889, 42890], "valid", [], "NV8"], [[42891, 42891], "mapped", [42892]], [[42892, 42892], "valid"], [[42893, 42893], "mapped", [613]], [[42894, 42894], "valid"], [[42895, 42895], "valid"], [[42896, 42896], "mapped", [42897]], [[42897, 42897], "valid"], [[42898, 42898], "mapped", [42899]], [[42899, 42899], "valid"], [[42900, 42901], "valid"], [[42902, 42902], "mapped", [42903]], [[42903, 42903], "valid"], [[42904, 42904], "mapped", [42905]], [[42905, 42905], "valid"], [[42906, 42906], "mapped", [42907]], [[42907, 42907], "valid"], [[42908, 42908], "mapped", [42909]], [[42909, 42909], "valid"], [[42910, 42910], "mapped", [42911]], [[42911, 42911], "valid"], [[42912, 42912], "mapped", [42913]], [[42913, 42913], "valid"], [[42914, 42914], "mapped", [42915]], [[42915, 42915], "valid"], [[42916, 42916], "mapped", [42917]], [[42917, 42917], "valid"], [[42918, 42918], "mapped", [42919]], [[42919, 42919], "valid"], [[42920, 42920], "mapped", [42921]], [[42921, 42921], "valid"], [[42922, 42922], "mapped", [614]], [[42923, 42923], "mapped", [604]], [[42924, 42924], "mapped", [609]], [[42925, 42925], "mapped", [620]], [[42926, 42927], "disallowed"], [[42928, 42928], "mapped", [670]], [[42929, 42929], "mapped", [647]], [[42930, 42930], "mapped", [669]], [[42931, 42931], "mapped", [43859]], [[42932, 42932], "mapped", [42933]], [[42933, 42933], "valid"], [[42934, 42934], "mapped", [42935]], [[42935, 42935], "valid"], [[42936, 42998], "disallowed"], [[42999, 42999], "valid"], [[43000, 43000], "mapped", [295]], [[43001, 43001], "mapped", [339]], [[43002, 43002], "valid"], [[43003, 43007], "valid"], [[43008, 43047], "valid"], [[43048, 43051], "valid", [], "NV8"], [[43052, 43055], "disallowed"], [[43056, 43065], "valid", [], "NV8"], [[43066, 43071], "disallowed"], [[43072, 43123], "valid"], [[43124, 43127], "valid", [], "NV8"], [[43128, 43135], "disallowed"], [[43136, 43204], "valid"], [[43205, 43213], "disallowed"], [[43214, 43215], "valid", [], "NV8"], [[43216, 43225], "valid"], [[43226, 43231], "disallowed"], [[43232, 43255], "valid"], [[43256, 43258], "valid", [], "NV8"], [[43259, 43259], "valid"], [[43260, 43260], "valid", [], "NV8"], [[43261, 43261], "valid"], [[43262, 43263], "disallowed"], [[43264, 43309], "valid"], [[43310, 43311], "valid", [], "NV8"], [[43312, 43347], "valid"], [[43348, 43358], "disallowed"], [[43359, 43359], "valid", [], "NV8"], [[43360, 43388], "valid", [], "NV8"], [[43389, 43391], "disallowed"], [[43392, 43456], "valid"], [[43457, 43469], "valid", [], "NV8"], [[43470, 43470], "disallowed"], [[43471, 43481], "valid"], [[43482, 43485], "disallowed"], [[43486, 43487], "valid", [], "NV8"], [[43488, 43518], "valid"], [[43519, 43519], "disallowed"], [[43520, 43574], "valid"], [[43575, 43583], "disallowed"], [[43584, 43597], "valid"], [[43598, 43599], "disallowed"], [[43600, 43609], "valid"], [[43610, 43611], "disallowed"], [[43612, 43615], "valid", [], "NV8"], [[43616, 43638], "valid"], [[43639, 43641], "valid", [], "NV8"], [[43642, 43643], "valid"], [[43644, 43647], "valid"], [[43648, 43714], "valid"], [[43715, 43738], "disallowed"], [[43739, 43741], "valid"], [[43742, 43743], "valid", [], "NV8"], [[43744, 43759], "valid"], [[43760, 43761], "valid", [], "NV8"], [[43762, 43766], "valid"], [[43767, 43776], "disallowed"], [[43777, 43782], "valid"], [[43783, 43784], "disallowed"], [[43785, 43790], "valid"], [[43791, 43792], "disallowed"], [[43793, 43798], "valid"], [[43799, 43807], "disallowed"], [[43808, 43814], "valid"], [[43815, 43815], "disallowed"], [[43816, 43822], "valid"], [[43823, 43823], "disallowed"], [[43824, 43866], "valid"], [[43867, 43867], "valid", [], "NV8"], [[43868, 43868], "mapped", [42791]], [[43869, 43869], "mapped", [43831]], [[43870, 43870], "mapped", [619]], [[43871, 43871], "mapped", [43858]], [[43872, 43875], "valid"], [[43876, 43877], "valid"], [[43878, 43887], "disallowed"], [[43888, 43888], "mapped", [5024]], [[43889, 43889], "mapped", [5025]], [[43890, 43890], "mapped", [5026]], [[43891, 43891], "mapped", [5027]], [[43892, 43892], "mapped", [5028]], [[43893, 43893], "mapped", [5029]], [[43894, 43894], "mapped", [5030]], [[43895, 43895], "mapped", [5031]], [[43896, 43896], "mapped", [5032]], [[43897, 43897], "mapped", [5033]], [[43898, 43898], "mapped", [5034]], [[43899, 43899], "mapped", [5035]], [[43900, 43900], "mapped", [5036]], [[43901, 43901], "mapped", [5037]], [[43902, 43902], "mapped", [5038]], [[43903, 43903], "mapped", [5039]], [[43904, 43904], "mapped", [5040]], [[43905, 43905], "mapped", [5041]], [[43906, 43906], "mapped", [5042]], [[43907, 43907], "mapped", [5043]], [[43908, 43908], "mapped", [5044]], [[43909, 43909], "mapped", [5045]], [[43910, 43910], "mapped", [5046]], [[43911, 43911], "mapped", [5047]], [[43912, 43912], "mapped", [5048]], [[43913, 43913], "mapped", [5049]], [[43914, 43914], "mapped", [5050]], [[43915, 43915], "mapped", [5051]], [[43916, 43916], "mapped", [5052]], [[43917, 43917], "mapped", [5053]], [[43918, 43918], "mapped", [5054]], [[43919, 43919], "mapped", [5055]], [[43920, 43920], "mapped", [5056]], [[43921, 43921], "mapped", [5057]], [[43922, 43922], "mapped", [5058]], [[43923, 43923], "mapped", [5059]], [[43924, 43924], "mapped", [5060]], [[43925, 43925], "mapped", [5061]], [[43926, 43926], "mapped", [5062]], [[43927, 43927], "mapped", [5063]], [[43928, 43928], "mapped", [5064]], [[43929, 43929], "mapped", [5065]], [[43930, 43930], "mapped", [5066]], [[43931, 43931], "mapped", [5067]], [[43932, 43932], "mapped", [5068]], [[43933, 43933], "mapped", [5069]], [[43934, 43934], "mapped", [5070]], [[43935, 43935], "mapped", [5071]], [[43936, 43936], "mapped", [5072]], [[43937, 43937], "mapped", [5073]], [[43938, 43938], "mapped", [5074]], [[43939, 43939], "mapped", [5075]], [[43940, 43940], "mapped", [5076]], [[43941, 43941], "mapped", [5077]], [[43942, 43942], "mapped", [5078]], [[43943, 43943], "mapped", [5079]], [[43944, 43944], "mapped", [5080]], [[43945, 43945], "mapped", [5081]], [[43946, 43946], "mapped", [5082]], [[43947, 43947], "mapped", [5083]], [[43948, 43948], "mapped", [5084]], [[43949, 43949], "mapped", [5085]], [[43950, 43950], "mapped", [5086]], [[43951, 43951], "mapped", [5087]], [[43952, 43952], "mapped", [5088]], [[43953, 43953], "mapped", [5089]], [[43954, 43954], "mapped", [5090]], [[43955, 43955], "mapped", [5091]], [[43956, 43956], "mapped", [5092]], [[43957, 43957], "mapped", [5093]], [[43958, 43958], "mapped", [5094]], [[43959, 43959], "mapped", [5095]], [[43960, 43960], "mapped", [5096]], [[43961, 43961], "mapped", [5097]], [[43962, 43962], "mapped", [5098]], [[43963, 43963], "mapped", [5099]], [[43964, 43964], "mapped", [5100]], [[43965, 43965], "mapped", [5101]], [[43966, 43966], "mapped", [5102]], [[43967, 43967], "mapped", [5103]], [[43968, 44010], "valid"], [[44011, 44011], "valid", [], "NV8"], [[44012, 44013], "valid"], [[44014, 44015], "disallowed"], [[44016, 44025], "valid"], [[44026, 44031], "disallowed"], [[44032, 55203], "valid"], [[55204, 55215], "disallowed"], [[55216, 55238], "valid", [], "NV8"], [[55239, 55242], "disallowed"], [[55243, 55291], "valid", [], "NV8"], [[55292, 55295], "disallowed"], [[55296, 57343], "disallowed"], [[57344, 63743], "disallowed"], [[63744, 63744], "mapped", [35912]], [[63745, 63745], "mapped", [26356]], [[63746, 63746], "mapped", [36554]], [[63747, 63747], "mapped", [36040]], [[63748, 63748], "mapped", [28369]], [[63749, 63749], "mapped", [20018]], [[63750, 63750], "mapped", [21477]], [[63751, 63752], "mapped", [40860]], [[63753, 63753], "mapped", [22865]], [[63754, 63754], "mapped", [37329]], [[63755, 63755], "mapped", [21895]], [[63756, 63756], "mapped", [22856]], [[63757, 63757], "mapped", [25078]], [[63758, 63758], "mapped", [30313]], [[63759, 63759], "mapped", [32645]], [[63760, 63760], "mapped", [34367]], [[63761, 63761], "mapped", [34746]], [[63762, 63762], "mapped", [35064]], [[63763, 63763], "mapped", [37007]], [[63764, 63764], "mapped", [27138]], [[63765, 63765], "mapped", [27931]], [[63766, 63766], "mapped", [28889]], [[63767, 63767], "mapped", [29662]], [[63768, 63768], "mapped", [33853]], [[63769, 63769], "mapped", [37226]], [[63770, 63770], "mapped", [39409]], [[63771, 63771], "mapped", [20098]], [[63772, 63772], "mapped", [21365]], [[63773, 63773], "mapped", [27396]], [[63774, 63774], "mapped", [29211]], [[63775, 63775], "mapped", [34349]], [[63776, 63776], "mapped", [40478]], [[63777, 63777], "mapped", [23888]], [[63778, 63778], "mapped", [28651]], [[63779, 63779], "mapped", [34253]], [[63780, 63780], "mapped", [35172]], [[63781, 63781], "mapped", [25289]], [[63782, 63782], "mapped", [33240]], [[63783, 63783], "mapped", [34847]], [[63784, 63784], "mapped", [24266]], [[63785, 63785], "mapped", [26391]], [[63786, 63786], "mapped", [28010]], [[63787, 63787], "mapped", [29436]], [[63788, 63788], "mapped", [37070]], [[63789, 63789], "mapped", [20358]], [[63790, 63790], "mapped", [20919]], [[63791, 63791], "mapped", [21214]], [[63792, 63792], "mapped", [25796]], [[63793, 63793], "mapped", [27347]], [[63794, 63794], "mapped", [29200]], [[63795, 63795], "mapped", [30439]], [[63796, 63796], "mapped", [32769]], [[63797, 63797], "mapped", [34310]], [[63798, 63798], "mapped", [34396]], [[63799, 63799], "mapped", [36335]], [[63800, 63800], "mapped", [38706]], [[63801, 63801], "mapped", [39791]], [[63802, 63802], "mapped", [40442]], [[63803, 63803], "mapped", [30860]], [[63804, 63804], "mapped", [31103]], [[63805, 63805], "mapped", [32160]], [[63806, 63806], "mapped", [33737]], [[63807, 63807], "mapped", [37636]], [[63808, 63808], "mapped", [40575]], [[63809, 63809], "mapped", [35542]], [[63810, 63810], "mapped", [22751]], [[63811, 63811], "mapped", [24324]], [[63812, 63812], "mapped", [31840]], [[63813, 63813], "mapped", [32894]], [[63814, 63814], "mapped", [29282]], [[63815, 63815], "mapped", [30922]], [[63816, 63816], "mapped", [36034]], [[63817, 63817], "mapped", [38647]], [[63818, 63818], "mapped", [22744]], [[63819, 63819], "mapped", [23650]], [[63820, 63820], "mapped", [27155]], [[63821, 63821], "mapped", [28122]], [[63822, 63822], "mapped", [28431]], [[63823, 63823], "mapped", [32047]], [[63824, 63824], "mapped", [32311]], [[63825, 63825], "mapped", [38475]], [[63826, 63826], "mapped", [21202]], [[63827, 63827], "mapped", [32907]], [[63828, 63828], "mapped", [20956]], [[63829, 63829], "mapped", [20940]], [[63830, 63830], "mapped", [31260]], [[63831, 63831], "mapped", [32190]], [[63832, 63832], "mapped", [33777]], [[63833, 63833], "mapped", [38517]], [[63834, 63834], "mapped", [35712]], [[63835, 63835], "mapped", [25295]], [[63836, 63836], "mapped", [27138]], [[63837, 63837], "mapped", [35582]], [[63838, 63838], "mapped", [20025]], [[63839, 63839], "mapped", [23527]], [[63840, 63840], "mapped", [24594]], [[63841, 63841], "mapped", [29575]], [[63842, 63842], "mapped", [30064]], [[63843, 63843], "mapped", [21271]], [[63844, 63844], "mapped", [30971]], [[63845, 63845], "mapped", [20415]], [[63846, 63846], "mapped", [24489]], [[63847, 63847], "mapped", [19981]], [[63848, 63848], "mapped", [27852]], [[63849, 63849], "mapped", [25976]], [[63850, 63850], "mapped", [32034]], [[63851, 63851], "mapped", [21443]], [[63852, 63852], "mapped", [22622]], [[63853, 63853], "mapped", [30465]], [[63854, 63854], "mapped", [33865]], [[63855, 63855], "mapped", [35498]], [[63856, 63856], "mapped", [27578]], [[63857, 63857], "mapped", [36784]], [[63858, 63858], "mapped", [27784]], [[63859, 63859], "mapped", [25342]], [[63860, 63860], "mapped", [33509]], [[63861, 63861], "mapped", [25504]], [[63862, 63862], "mapped", [30053]], [[63863, 63863], "mapped", [20142]], [[63864, 63864], "mapped", [20841]], [[63865, 63865], "mapped", [20937]], [[63866, 63866], "mapped", [26753]], [[63867, 63867], "mapped", [31975]], [[63868, 63868], "mapped", [33391]], [[63869, 63869], "mapped", [35538]], [[63870, 63870], "mapped", [37327]], [[63871, 63871], "mapped", [21237]], [[63872, 63872], "mapped", [21570]], [[63873, 63873], "mapped", [22899]], [[63874, 63874], "mapped", [24300]], [[63875, 63875], "mapped", [26053]], [[63876, 63876], "mapped", [28670]], [[63877, 63877], "mapped", [31018]], [[63878, 63878], "mapped", [38317]], [[63879, 63879], "mapped", [39530]], [[63880, 63880], "mapped", [40599]], [[63881, 63881], "mapped", [40654]], [[63882, 63882], "mapped", [21147]], [[63883, 63883], "mapped", [26310]], [[63884, 63884], "mapped", [27511]], [[63885, 63885], "mapped", [36706]], [[63886, 63886], "mapped", [24180]], [[63887, 63887], "mapped", [24976]], [[63888, 63888], "mapped", [25088]], [[63889, 63889], "mapped", [25754]], [[63890, 63890], "mapped", [28451]], [[63891, 63891], "mapped", [29001]], [[63892, 63892], "mapped", [29833]], [[63893, 63893], "mapped", [31178]], [[63894, 63894], "mapped", [32244]], [[63895, 63895], "mapped", [32879]], [[63896, 63896], "mapped", [36646]], [[63897, 63897], "mapped", [34030]], [[63898, 63898], "mapped", [36899]], [[63899, 63899], "mapped", [37706]], [[63900, 63900], "mapped", [21015]], [[63901, 63901], "mapped", [21155]], [[63902, 63902], "mapped", [21693]], [[63903, 63903], "mapped", [28872]], [[63904, 63904], "mapped", [35010]], [[63905, 63905], "mapped", [35498]], [[63906, 63906], "mapped", [24265]], [[63907, 63907], "mapped", [24565]], [[63908, 63908], "mapped", [25467]], [[63909, 63909], "mapped", [27566]], [[63910, 63910], "mapped", [31806]], [[63911, 63911], "mapped", [29557]], [[63912, 63912], "mapped", [20196]], [[63913, 63913], "mapped", [22265]], [[63914, 63914], "mapped", [23527]], [[63915, 63915], "mapped", [23994]], [[63916, 63916], "mapped", [24604]], [[63917, 63917], "mapped", [29618]], [[63918, 63918], "mapped", [29801]], [[63919, 63919], "mapped", [32666]], [[63920, 63920], "mapped", [32838]], [[63921, 63921], "mapped", [37428]], [[63922, 63922], "mapped", [38646]], [[63923, 63923], "mapped", [38728]], [[63924, 63924], "mapped", [38936]], [[63925, 63925], "mapped", [20363]], [[63926, 63926], "mapped", [31150]], [[63927, 63927], "mapped", [37300]], [[63928, 63928], "mapped", [38584]], [[63929, 63929], "mapped", [24801]], [[63930, 63930], "mapped", [20102]], [[63931, 63931], "mapped", [20698]], [[63932, 63932], "mapped", [23534]], [[63933, 63933], "mapped", [23615]], [[63934, 63934], "mapped", [26009]], [[63935, 63935], "mapped", [27138]], [[63936, 63936], "mapped", [29134]], [[63937, 63937], "mapped", [30274]], [[63938, 63938], "mapped", [34044]], [[63939, 63939], "mapped", [36988]], [[63940, 63940], "mapped", [40845]], [[63941, 63941], "mapped", [26248]], [[63942, 63942], "mapped", [38446]], [[63943, 63943], "mapped", [21129]], [[63944, 63944], "mapped", [26491]], [[63945, 63945], "mapped", [26611]], [[63946, 63946], "mapped", [27969]], [[63947, 63947], "mapped", [28316]], [[63948, 63948], "mapped", [29705]], [[63949, 63949], "mapped", [30041]], [[63950, 63950], "mapped", [30827]], [[63951, 63951], "mapped", [32016]], [[63952, 63952], "mapped", [39006]], [[63953, 63953], "mapped", [20845]], [[63954, 63954], "mapped", [25134]], [[63955, 63955], "mapped", [38520]], [[63956, 63956], "mapped", [20523]], [[63957, 63957], "mapped", [23833]], [[63958, 63958], "mapped", [28138]], [[63959, 63959], "mapped", [36650]], [[63960, 63960], "mapped", [24459]], [[63961, 63961], "mapped", [24900]], [[63962, 63962], "mapped", [26647]], [[63963, 63963], "mapped", [29575]], [[63964, 63964], "mapped", [38534]], [[63965, 63965], "mapped", [21033]], [[63966, 63966], "mapped", [21519]], [[63967, 63967], "mapped", [23653]], [[63968, 63968], "mapped", [26131]], [[63969, 63969], "mapped", [26446]], [[63970, 63970], "mapped", [26792]], [[63971, 63971], "mapped", [27877]], [[63972, 63972], "mapped", [29702]], [[63973, 63973], "mapped", [30178]], [[63974, 63974], "mapped", [32633]], [[63975, 63975], "mapped", [35023]], [[63976, 63976], "mapped", [35041]], [[63977, 63977], "mapped", [37324]], [[63978, 63978], "mapped", [38626]], [[63979, 63979], "mapped", [21311]], [[63980, 63980], "mapped", [28346]], [[63981, 63981], "mapped", [21533]], [[63982, 63982], "mapped", [29136]], [[63983, 63983], "mapped", [29848]], [[63984, 63984], "mapped", [34298]], [[63985, 63985], "mapped", [38563]], [[63986, 63986], "mapped", [40023]], [[63987, 63987], "mapped", [40607]], [[63988, 63988], "mapped", [26519]], [[63989, 63989], "mapped", [28107]], [[63990, 63990], "mapped", [33256]], [[63991, 63991], "mapped", [31435]], [[63992, 63992], "mapped", [31520]], [[63993, 63993], "mapped", [31890]], [[63994, 63994], "mapped", [29376]], [[63995, 63995], "mapped", [28825]], [[63996, 63996], "mapped", [35672]], [[63997, 63997], "mapped", [20160]], [[63998, 63998], "mapped", [33590]], [[63999, 63999], "mapped", [21050]], [[64000, 64000], "mapped", [20999]], [[64001, 64001], "mapped", [24230]], [[64002, 64002], "mapped", [25299]], [[64003, 64003], "mapped", [31958]], [[64004, 64004], "mapped", [23429]], [[64005, 64005], "mapped", [27934]], [[64006, 64006], "mapped", [26292]], [[64007, 64007], "mapped", [36667]], [[64008, 64008], "mapped", [34892]], [[64009, 64009], "mapped", [38477]], [[64010, 64010], "mapped", [35211]], [[64011, 64011], "mapped", [24275]], [[64012, 64012], "mapped", [20800]], [[64013, 64013], "mapped", [21952]], [[64014, 64015], "valid"], [[64016, 64016], "mapped", [22618]], [[64017, 64017], "valid"], [[64018, 64018], "mapped", [26228]], [[64019, 64020], "valid"], [[64021, 64021], "mapped", [20958]], [[64022, 64022], "mapped", [29482]], [[64023, 64023], "mapped", [30410]], [[64024, 64024], "mapped", [31036]], [[64025, 64025], "mapped", [31070]], [[64026, 64026], "mapped", [31077]], [[64027, 64027], "mapped", [31119]], [[64028, 64028], "mapped", [38742]], [[64029, 64029], "mapped", [31934]], [[64030, 64030], "mapped", [32701]], [[64031, 64031], "valid"], [[64032, 64032], "mapped", [34322]], [[64033, 64033], "valid"], [[64034, 64034], "mapped", [35576]], [[64035, 64036], "valid"], [[64037, 64037], "mapped", [36920]], [[64038, 64038], "mapped", [37117]], [[64039, 64041], "valid"], [[64042, 64042], "mapped", [39151]], [[64043, 64043], "mapped", [39164]], [[64044, 64044], "mapped", [39208]], [[64045, 64045], "mapped", [40372]], [[64046, 64046], "mapped", [37086]], [[64047, 64047], "mapped", [38583]], [[64048, 64048], "mapped", [20398]], [[64049, 64049], "mapped", [20711]], [[64050, 64050], "mapped", [20813]], [[64051, 64051], "mapped", [21193]], [[64052, 64052], "mapped", [21220]], [[64053, 64053], "mapped", [21329]], [[64054, 64054], "mapped", [21917]], [[64055, 64055], "mapped", [22022]], [[64056, 64056], "mapped", [22120]], [[64057, 64057], "mapped", [22592]], [[64058, 64058], "mapped", [22696]], [[64059, 64059], "mapped", [23652]], [[64060, 64060], "mapped", [23662]], [[64061, 64061], "mapped", [24724]], [[64062, 64062], "mapped", [24936]], [[64063, 64063], "mapped", [24974]], [[64064, 64064], "mapped", [25074]], [[64065, 64065], "mapped", [25935]], [[64066, 64066], "mapped", [26082]], [[64067, 64067], "mapped", [26257]], [[64068, 64068], "mapped", [26757]], [[64069, 64069], "mapped", [28023]], [[64070, 64070], "mapped", [28186]], [[64071, 64071], "mapped", [28450]], [[64072, 64072], "mapped", [29038]], [[64073, 64073], "mapped", [29227]], [[64074, 64074], "mapped", [29730]], [[64075, 64075], "mapped", [30865]], [[64076, 64076], "mapped", [31038]], [[64077, 64077], "mapped", [31049]], [[64078, 64078], "mapped", [31048]], [[64079, 64079], "mapped", [31056]], [[64080, 64080], "mapped", [31062]], [[64081, 64081], "mapped", [31069]], [[64082, 64082], "mapped", [31117]], [[64083, 64083], "mapped", [31118]], [[64084, 64084], "mapped", [31296]], [[64085, 64085], "mapped", [31361]], [[64086, 64086], "mapped", [31680]], [[64087, 64087], "mapped", [32244]], [[64088, 64088], "mapped", [32265]], [[64089, 64089], "mapped", [32321]], [[64090, 64090], "mapped", [32626]], [[64091, 64091], "mapped", [32773]], [[64092, 64092], "mapped", [33261]], [[64093, 64094], "mapped", [33401]], [[64095, 64095], "mapped", [33879]], [[64096, 64096], "mapped", [35088]], [[64097, 64097], "mapped", [35222]], [[64098, 64098], "mapped", [35585]], [[64099, 64099], "mapped", [35641]], [[64100, 64100], "mapped", [36051]], [[64101, 64101], "mapped", [36104]], [[64102, 64102], "mapped", [36790]], [[64103, 64103], "mapped", [36920]], [[64104, 64104], "mapped", [38627]], [[64105, 64105], "mapped", [38911]], [[64106, 64106], "mapped", [38971]], [[64107, 64107], "mapped", [24693]], [[64108, 64108], "mapped", [148206]], [[64109, 64109], "mapped", [33304]], [[64110, 64111], "disallowed"], [[64112, 64112], "mapped", [20006]], [[64113, 64113], "mapped", [20917]], [[64114, 64114], "mapped", [20840]], [[64115, 64115], "mapped", [20352]], [[64116, 64116], "mapped", [20805]], [[64117, 64117], "mapped", [20864]], [[64118, 64118], "mapped", [21191]], [[64119, 64119], "mapped", [21242]], [[64120, 64120], "mapped", [21917]], [[64121, 64121], "mapped", [21845]], [[64122, 64122], "mapped", [21913]], [[64123, 64123], "mapped", [21986]], [[64124, 64124], "mapped", [22618]], [[64125, 64125], "mapped", [22707]], [[64126, 64126], "mapped", [22852]], [[64127, 64127], "mapped", [22868]], [[64128, 64128], "mapped", [23138]], [[64129, 64129], "mapped", [23336]], [[64130, 64130], "mapped", [24274]], [[64131, 64131], "mapped", [24281]], [[64132, 64132], "mapped", [24425]], [[64133, 64133], "mapped", [24493]], [[64134, 64134], "mapped", [24792]], [[64135, 64135], "mapped", [24910]], [[64136, 64136], "mapped", [24840]], [[64137, 64137], "mapped", [24974]], [[64138, 64138], "mapped", [24928]], [[64139, 64139], "mapped", [25074]], [[64140, 64140], "mapped", [25140]], [[64141, 64141], "mapped", [25540]], [[64142, 64142], "mapped", [25628]], [[64143, 64143], "mapped", [25682]], [[64144, 64144], "mapped", [25942]], [[64145, 64145], "mapped", [26228]], [[64146, 64146], "mapped", [26391]], [[64147, 64147], "mapped", [26395]], [[64148, 64148], "mapped", [26454]], [[64149, 64149], "mapped", [27513]], [[64150, 64150], "mapped", [27578]], [[64151, 64151], "mapped", [27969]], [[64152, 64152], "mapped", [28379]], [[64153, 64153], "mapped", [28363]], [[64154, 64154], "mapped", [28450]], [[64155, 64155], "mapped", [28702]], [[64156, 64156], "mapped", [29038]], [[64157, 64157], "mapped", [30631]], [[64158, 64158], "mapped", [29237]], [[64159, 64159], "mapped", [29359]], [[64160, 64160], "mapped", [29482]], [[64161, 64161], "mapped", [29809]], [[64162, 64162], "mapped", [29958]], [[64163, 64163], "mapped", [30011]], [[64164, 64164], "mapped", [30237]], [[64165, 64165], "mapped", [30239]], [[64166, 64166], "mapped", [30410]], [[64167, 64167], "mapped", [30427]], [[64168, 64168], "mapped", [30452]], [[64169, 64169], "mapped", [30538]], [[64170, 64170], "mapped", [30528]], [[64171, 64171], "mapped", [30924]], [[64172, 64172], "mapped", [31409]], [[64173, 64173], "mapped", [31680]], [[64174, 64174], "mapped", [31867]], [[64175, 64175], "mapped", [32091]], [[64176, 64176], "mapped", [32244]], [[64177, 64177], "mapped", [32574]], [[64178, 64178], "mapped", [32773]], [[64179, 64179], "mapped", [33618]], [[64180, 64180], "mapped", [33775]], [[64181, 64181], "mapped", [34681]], [[64182, 64182], "mapped", [35137]], [[64183, 64183], "mapped", [35206]], [[64184, 64184], "mapped", [35222]], [[64185, 64185], "mapped", [35519]], [[64186, 64186], "mapped", [35576]], [[64187, 64187], "mapped", [35531]], [[64188, 64188], "mapped", [35585]], [[64189, 64189], "mapped", [35582]], [[64190, 64190], "mapped", [35565]], [[64191, 64191], "mapped", [35641]], [[64192, 64192], "mapped", [35722]], [[64193, 64193], "mapped", [36104]], [[64194, 64194], "mapped", [36664]], [[64195, 64195], "mapped", [36978]], [[64196, 64196], "mapped", [37273]], [[64197, 64197], "mapped", [37494]], [[64198, 64198], "mapped", [38524]], [[64199, 64199], "mapped", [38627]], [[64200, 64200], "mapped", [38742]], [[64201, 64201], "mapped", [38875]], [[64202, 64202], "mapped", [38911]], [[64203, 64203], "mapped", [38923]], [[64204, 64204], "mapped", [38971]], [[64205, 64205], "mapped", [39698]], [[64206, 64206], "mapped", [40860]], [[64207, 64207], "mapped", [141386]], [[64208, 64208], "mapped", [141380]], [[64209, 64209], "mapped", [144341]], [[64210, 64210], "mapped", [15261]], [[64211, 64211], "mapped", [16408]], [[64212, 64212], "mapped", [16441]], [[64213, 64213], "mapped", [152137]], [[64214, 64214], "mapped", [154832]], [[64215, 64215], "mapped", [163539]], [[64216, 64216], "mapped", [40771]], [[64217, 64217], "mapped", [40846]], [[64218, 64255], "disallowed"], [[64256, 64256], "mapped", [102, 102]], [[64257, 64257], "mapped", [102, 105]], [[64258, 64258], "mapped", [102, 108]], [[64259, 64259], "mapped", [102, 102, 105]], [[64260, 64260], "mapped", [102, 102, 108]], [[64261, 64262], "mapped", [115, 116]], [[64263, 64274], "disallowed"], [[64275, 64275], "mapped", [1396, 1398]], [[64276, 64276], "mapped", [1396, 1381]], [[64277, 64277], "mapped", [1396, 1387]], [[64278, 64278], "mapped", [1406, 1398]], [[64279, 64279], "mapped", [1396, 1389]], [[64280, 64284], "disallowed"], [[64285, 64285], "mapped", [1497, 1460]], [[64286, 64286], "valid"], [[64287, 64287], "mapped", [1522, 1463]], [[64288, 64288], "mapped", [1506]], [[64289, 64289], "mapped", [1488]], [[64290, 64290], "mapped", [1491]], [[64291, 64291], "mapped", [1492]], [[64292, 64292], "mapped", [1499]], [[64293, 64293], "mapped", [1500]], [[64294, 64294], "mapped", [1501]], [[64295, 64295], "mapped", [1512]], [[64296, 64296], "mapped", [1514]], [[64297, 64297], "disallowed_STD3_mapped", [43]], [[64298, 64298], "mapped", [1513, 1473]], [[64299, 64299], "mapped", [1513, 1474]], [[64300, 64300], "mapped", [1513, 1468, 1473]], [[64301, 64301], "mapped", [1513, 1468, 1474]], [[64302, 64302], "mapped", [1488, 1463]], [[64303, 64303], "mapped", [1488, 1464]], [[64304, 64304], "mapped", [1488, 1468]], [[64305, 64305], "mapped", [1489, 1468]], [[64306, 64306], "mapped", [1490, 1468]], [[64307, 64307], "mapped", [1491, 1468]], [[64308, 64308], "mapped", [1492, 1468]], [[64309, 64309], "mapped", [1493, 1468]], [[64310, 64310], "mapped", [1494, 1468]], [[64311, 64311], "disallowed"], [[64312, 64312], "mapped", [1496, 1468]], [[64313, 64313], "mapped", [1497, 1468]], [[64314, 64314], "mapped", [1498, 1468]], [[64315, 64315], "mapped", [1499, 1468]], [[64316, 64316], "mapped", [1500, 1468]], [[64317, 64317], "disallowed"], [[64318, 64318], "mapped", [1502, 1468]], [[64319, 64319], "disallowed"], [[64320, 64320], "mapped", [1504, 1468]], [[64321, 64321], "mapped", [1505, 1468]], [[64322, 64322], "disallowed"], [[64323, 64323], "mapped", [1507, 1468]], [[64324, 64324], "mapped", [1508, 1468]], [[64325, 64325], "disallowed"], [[64326, 64326], "mapped", [1510, 1468]], [[64327, 64327], "mapped", [1511, 1468]], [[64328, 64328], "mapped", [1512, 1468]], [[64329, 64329], "mapped", [1513, 1468]], [[64330, 64330], "mapped", [1514, 1468]], [[64331, 64331], "mapped", [1493, 1465]], [[64332, 64332], "mapped", [1489, 1471]], [[64333, 64333], "mapped", [1499, 1471]], [[64334, 64334], "mapped", [1508, 1471]], [[64335, 64335], "mapped", [1488, 1500]], [[64336, 64337], "mapped", [1649]], [[64338, 64341], "mapped", [1659]], [[64342, 64345], "mapped", [1662]], [[64346, 64349], "mapped", [1664]], [[64350, 64353], "mapped", [1658]], [[64354, 64357], "mapped", [1663]], [[64358, 64361], "mapped", [1657]], [[64362, 64365], "mapped", [1700]], [[64366, 64369], "mapped", [1702]], [[64370, 64373], "mapped", [1668]], [[64374, 64377], "mapped", [1667]], [[64378, 64381], "mapped", [1670]], [[64382, 64385], "mapped", [1671]], [[64386, 64387], "mapped", [1677]], [[64388, 64389], "mapped", [1676]], [[64390, 64391], "mapped", [1678]], [[64392, 64393], "mapped", [1672]], [[64394, 64395], "mapped", [1688]], [[64396, 64397], "mapped", [1681]], [[64398, 64401], "mapped", [1705]], [[64402, 64405], "mapped", [1711]], [[64406, 64409], "mapped", [1715]], [[64410, 64413], "mapped", [1713]], [[64414, 64415], "mapped", [1722]], [[64416, 64419], "mapped", [1723]], [[64420, 64421], "mapped", [1728]], [[64422, 64425], "mapped", [1729]], [[64426, 64429], "mapped", [1726]], [[64430, 64431], "mapped", [1746]], [[64432, 64433], "mapped", [1747]], [[64434, 64449], "valid", [], "NV8"], [[64450, 64466], "disallowed"], [[64467, 64470], "mapped", [1709]], [[64471, 64472], "mapped", [1735]], [[64473, 64474], "mapped", [1734]], [[64475, 64476], "mapped", [1736]], [[64477, 64477], "mapped", [1735, 1652]], [[64478, 64479], "mapped", [1739]], [[64480, 64481], "mapped", [1733]], [[64482, 64483], "mapped", [1737]], [[64484, 64487], "mapped", [1744]], [[64488, 64489], "mapped", [1609]], [[64490, 64491], "mapped", [1574, 1575]], [[64492, 64493], "mapped", [1574, 1749]], [[64494, 64495], "mapped", [1574, 1608]], [[64496, 64497], "mapped", [1574, 1735]], [[64498, 64499], "mapped", [1574, 1734]], [[64500, 64501], "mapped", [1574, 1736]], [[64502, 64504], "mapped", [1574, 1744]], [[64505, 64507], "mapped", [1574, 1609]], [[64508, 64511], "mapped", [1740]], [[64512, 64512], "mapped", [1574, 1580]], [[64513, 64513], "mapped", [1574, 1581]], [[64514, 64514], "mapped", [1574, 1605]], [[64515, 64515], "mapped", [1574, 1609]], [[64516, 64516], "mapped", [1574, 1610]], [[64517, 64517], "mapped", [1576, 1580]], [[64518, 64518], "mapped", [1576, 1581]], [[64519, 64519], "mapped", [1576, 1582]], [[64520, 64520], "mapped", [1576, 1605]], [[64521, 64521], "mapped", [1576, 1609]], [[64522, 64522], "mapped", [1576, 1610]], [[64523, 64523], "mapped", [1578, 1580]], [[64524, 64524], "mapped", [1578, 1581]], [[64525, 64525], "mapped", [1578, 1582]], [[64526, 64526], "mapped", [1578, 1605]], [[64527, 64527], "mapped", [1578, 1609]], [[64528, 64528], "mapped", [1578, 1610]], [[64529, 64529], "mapped", [1579, 1580]], [[64530, 64530], "mapped", [1579, 1605]], [[64531, 64531], "mapped", [1579, 1609]], [[64532, 64532], "mapped", [1579, 1610]], [[64533, 64533], "mapped", [1580, 1581]], [[64534, 64534], "mapped", [1580, 1605]], [[64535, 64535], "mapped", [1581, 1580]], [[64536, 64536], "mapped", [1581, 1605]], [[64537, 64537], "mapped", [1582, 1580]], [[64538, 64538], "mapped", [1582, 1581]], [[64539, 64539], "mapped", [1582, 1605]], [[64540, 64540], "mapped", [1587, 1580]], [[64541, 64541], "mapped", [1587, 1581]], [[64542, 64542], "mapped", [1587, 1582]], [[64543, 64543], "mapped", [1587, 1605]], [[64544, 64544], "mapped", [1589, 1581]], [[64545, 64545], "mapped", [1589, 1605]], [[64546, 64546], "mapped", [1590, 1580]], [[64547, 64547], "mapped", [1590, 1581]], [[64548, 64548], "mapped", [1590, 1582]], [[64549, 64549], "mapped", [1590, 1605]], [[64550, 64550], "mapped", [1591, 1581]], [[64551, 64551], "mapped", [1591, 1605]], [[64552, 64552], "mapped", [1592, 1605]], [[64553, 64553], "mapped", [1593, 1580]], [[64554, 64554], "mapped", [1593, 1605]], [[64555, 64555], "mapped", [1594, 1580]], [[64556, 64556], "mapped", [1594, 1605]], [[64557, 64557], "mapped", [1601, 1580]], [[64558, 64558], "mapped", [1601, 1581]], [[64559, 64559], "mapped", [1601, 1582]], [[64560, 64560], "mapped", [1601, 1605]], [[64561, 64561], "mapped", [1601, 1609]], [[64562, 64562], "mapped", [1601, 1610]], [[64563, 64563], "mapped", [1602, 1581]], [[64564, 64564], "mapped", [1602, 1605]], [[64565, 64565], "mapped", [1602, 1609]], [[64566, 64566], "mapped", [1602, 1610]], [[64567, 64567], "mapped", [1603, 1575]], [[64568, 64568], "mapped", [1603, 1580]], [[64569, 64569], "mapped", [1603, 1581]], [[64570, 64570], "mapped", [1603, 1582]], [[64571, 64571], "mapped", [1603, 1604]], [[64572, 64572], "mapped", [1603, 1605]], [[64573, 64573], "mapped", [1603, 1609]], [[64574, 64574], "mapped", [1603, 1610]], [[64575, 64575], "mapped", [1604, 1580]], [[64576, 64576], "mapped", [1604, 1581]], [[64577, 64577], "mapped", [1604, 1582]], [[64578, 64578], "mapped", [1604, 1605]], [[64579, 64579], "mapped", [1604, 1609]], [[64580, 64580], "mapped", [1604, 1610]], [[64581, 64581], "mapped", [1605, 1580]], [[64582, 64582], "mapped", [1605, 1581]], [[64583, 64583], "mapped", [1605, 1582]], [[64584, 64584], "mapped", [1605, 1605]], [[64585, 64585], "mapped", [1605, 1609]], [[64586, 64586], "mapped", [1605, 1610]], [[64587, 64587], "mapped", [1606, 1580]], [[64588, 64588], "mapped", [1606, 1581]], [[64589, 64589], "mapped", [1606, 1582]], [[64590, 64590], "mapped", [1606, 1605]], [[64591, 64591], "mapped", [1606, 1609]], [[64592, 64592], "mapped", [1606, 1610]], [[64593, 64593], "mapped", [1607, 1580]], [[64594, 64594], "mapped", [1607, 1605]], [[64595, 64595], "mapped", [1607, 1609]], [[64596, 64596], "mapped", [1607, 1610]], [[64597, 64597], "mapped", [1610, 1580]], [[64598, 64598], "mapped", [1610, 1581]], [[64599, 64599], "mapped", [1610, 1582]], [[64600, 64600], "mapped", [1610, 1605]], [[64601, 64601], "mapped", [1610, 1609]], [[64602, 64602], "mapped", [1610, 1610]], [[64603, 64603], "mapped", [1584, 1648]], [[64604, 64604], "mapped", [1585, 1648]], [[64605, 64605], "mapped", [1609, 1648]], [[64606, 64606], "disallowed_STD3_mapped", [32, 1612, 1617]], [[64607, 64607], "disallowed_STD3_mapped", [32, 1613, 1617]], [[64608, 64608], "disallowed_STD3_mapped", [32, 1614, 1617]], [[64609, 64609], "disallowed_STD3_mapped", [32, 1615, 1617]], [[64610, 64610], "disallowed_STD3_mapped", [32, 1616, 1617]], [[64611, 64611], "disallowed_STD3_mapped", [32, 1617, 1648]], [[64612, 64612], "mapped", [1574, 1585]], [[64613, 64613], "mapped", [1574, 1586]], [[64614, 64614], "mapped", [1574, 1605]], [[64615, 64615], "mapped", [1574, 1606]], [[64616, 64616], "mapped", [1574, 1609]], [[64617, 64617], "mapped", [1574, 1610]], [[64618, 64618], "mapped", [1576, 1585]], [[64619, 64619], "mapped", [1576, 1586]], [[64620, 64620], "mapped", [1576, 1605]], [[64621, 64621], "mapped", [1576, 1606]], [[64622, 64622], "mapped", [1576, 1609]], [[64623, 64623], "mapped", [1576, 1610]], [[64624, 64624], "mapped", [1578, 1585]], [[64625, 64625], "mapped", [1578, 1586]], [[64626, 64626], "mapped", [1578, 1605]], [[64627, 64627], "mapped", [1578, 1606]], [[64628, 64628], "mapped", [1578, 1609]], [[64629, 64629], "mapped", [1578, 1610]], [[64630, 64630], "mapped", [1579, 1585]], [[64631, 64631], "mapped", [1579, 1586]], [[64632, 64632], "mapped", [1579, 1605]], [[64633, 64633], "mapped", [1579, 1606]], [[64634, 64634], "mapped", [1579, 1609]], [[64635, 64635], "mapped", [1579, 1610]], [[64636, 64636], "mapped", [1601, 1609]], [[64637, 64637], "mapped", [1601, 1610]], [[64638, 64638], "mapped", [1602, 1609]], [[64639, 64639], "mapped", [1602, 1610]], [[64640, 64640], "mapped", [1603, 1575]], [[64641, 64641], "mapped", [1603, 1604]], [[64642, 64642], "mapped", [1603, 1605]], [[64643, 64643], "mapped", [1603, 1609]], [[64644, 64644], "mapped", [1603, 1610]], [[64645, 64645], "mapped", [1604, 1605]], [[64646, 64646], "mapped", [1604, 1609]], [[64647, 64647], "mapped", [1604, 1610]], [[64648, 64648], "mapped", [1605, 1575]], [[64649, 64649], "mapped", [1605, 1605]], [[64650, 64650], "mapped", [1606, 1585]], [[64651, 64651], "mapped", [1606, 1586]], [[64652, 64652], "mapped", [1606, 1605]], [[64653, 64653], "mapped", [1606, 1606]], [[64654, 64654], "mapped", [1606, 1609]], [[64655, 64655], "mapped", [1606, 1610]], [[64656, 64656], "mapped", [1609, 1648]], [[64657, 64657], "mapped", [1610, 1585]], [[64658, 64658], "mapped", [1610, 1586]], [[64659, 64659], "mapped", [1610, 1605]], [[64660, 64660], "mapped", [1610, 1606]], [[64661, 64661], "mapped", [1610, 1609]], [[64662, 64662], "mapped", [1610, 1610]], [[64663, 64663], "mapped", [1574, 1580]], [[64664, 64664], "mapped", [1574, 1581]], [[64665, 64665], "mapped", [1574, 1582]], [[64666, 64666], "mapped", [1574, 1605]], [[64667, 64667], "mapped", [1574, 1607]], [[64668, 64668], "mapped", [1576, 1580]], [[64669, 64669], "mapped", [1576, 1581]], [[64670, 64670], "mapped", [1576, 1582]], [[64671, 64671], "mapped", [1576, 1605]], [[64672, 64672], "mapped", [1576, 1607]], [[64673, 64673], "mapped", [1578, 1580]], [[64674, 64674], "mapped", [1578, 1581]], [[64675, 64675], "mapped", [1578, 1582]], [[64676, 64676], "mapped", [1578, 1605]], [[64677, 64677], "mapped", [1578, 1607]], [[64678, 64678], "mapped", [1579, 1605]], [[64679, 64679], "mapped", [1580, 1581]], [[64680, 64680], "mapped", [1580, 1605]], [[64681, 64681], "mapped", [1581, 1580]], [[64682, 64682], "mapped", [1581, 1605]], [[64683, 64683], "mapped", [1582, 1580]], [[64684, 64684], "mapped", [1582, 1605]], [[64685, 64685], "mapped", [1587, 1580]], [[64686, 64686], "mapped", [1587, 1581]], [[64687, 64687], "mapped", [1587, 1582]], [[64688, 64688], "mapped", [1587, 1605]], [[64689, 64689], "mapped", [1589, 1581]], [[64690, 64690], "mapped", [1589, 1582]], [[64691, 64691], "mapped", [1589, 1605]], [[64692, 64692], "mapped", [1590, 1580]], [[64693, 64693], "mapped", [1590, 1581]], [[64694, 64694], "mapped", [1590, 1582]], [[64695, 64695], "mapped", [1590, 1605]], [[64696, 64696], "mapped", [1591, 1581]], [[64697, 64697], "mapped", [1592, 1605]], [[64698, 64698], "mapped", [1593, 1580]], [[64699, 64699], "mapped", [1593, 1605]], [[64700, 64700], "mapped", [1594, 1580]], [[64701, 64701], "mapped", [1594, 1605]], [[64702, 64702], "mapped", [1601, 1580]], [[64703, 64703], "mapped", [1601, 1581]], [[64704, 64704], "mapped", [1601, 1582]], [[64705, 64705], "mapped", [1601, 1605]], [[64706, 64706], "mapped", [1602, 1581]], [[64707, 64707], "mapped", [1602, 1605]], [[64708, 64708], "mapped", [1603, 1580]], [[64709, 64709], "mapped", [1603, 1581]], [[64710, 64710], "mapped", [1603, 1582]], [[64711, 64711], "mapped", [1603, 1604]], [[64712, 64712], "mapped", [1603, 1605]], [[64713, 64713], "mapped", [1604, 1580]], [[64714, 64714], "mapped", [1604, 1581]], [[64715, 64715], "mapped", [1604, 1582]], [[64716, 64716], "mapped", [1604, 1605]], [[64717, 64717], "mapped", [1604, 1607]], [[64718, 64718], "mapped", [1605, 1580]], [[64719, 64719], "mapped", [1605, 1581]], [[64720, 64720], "mapped", [1605, 1582]], [[64721, 64721], "mapped", [1605, 1605]], [[64722, 64722], "mapped", [1606, 1580]], [[64723, 64723], "mapped", [1606, 1581]], [[64724, 64724], "mapped", [1606, 1582]], [[64725, 64725], "mapped", [1606, 1605]], [[64726, 64726], "mapped", [1606, 1607]], [[64727, 64727], "mapped", [1607, 1580]], [[64728, 64728], "mapped", [1607, 1605]], [[64729, 64729], "mapped", [1607, 1648]], [[64730, 64730], "mapped", [1610, 1580]], [[64731, 64731], "mapped", [1610, 1581]], [[64732, 64732], "mapped", [1610, 1582]], [[64733, 64733], "mapped", [1610, 1605]], [[64734, 64734], "mapped", [1610, 1607]], [[64735, 64735], "mapped", [1574, 1605]], [[64736, 64736], "mapped", [1574, 1607]], [[64737, 64737], "mapped", [1576, 1605]], [[64738, 64738], "mapped", [1576, 1607]], [[64739, 64739], "mapped", [1578, 1605]], [[64740, 64740], "mapped", [1578, 1607]], [[64741, 64741], "mapped", [1579, 1605]], [[64742, 64742], "mapped", [1579, 1607]], [[64743, 64743], "mapped", [1587, 1605]], [[64744, 64744], "mapped", [1587, 1607]], [[64745, 64745], "mapped", [1588, 1605]], [[64746, 64746], "mapped", [1588, 1607]], [[64747, 64747], "mapped", [1603, 1604]], [[64748, 64748], "mapped", [1603, 1605]], [[64749, 64749], "mapped", [1604, 1605]], [[64750, 64750], "mapped", [1606, 1605]], [[64751, 64751], "mapped", [1606, 1607]], [[64752, 64752], "mapped", [1610, 1605]], [[64753, 64753], "mapped", [1610, 1607]], [[64754, 64754], "mapped", [1600, 1614, 1617]], [[64755, 64755], "mapped", [1600, 1615, 1617]], [[64756, 64756], "mapped", [1600, 1616, 1617]], [[64757, 64757], "mapped", [1591, 1609]], [[64758, 64758], "mapped", [1591, 1610]], [[64759, 64759], "mapped", [1593, 1609]], [[64760, 64760], "mapped", [1593, 1610]], [[64761, 64761], "mapped", [1594, 1609]], [[64762, 64762], "mapped", [1594, 1610]], [[64763, 64763], "mapped", [1587, 1609]], [[64764, 64764], "mapped", [1587, 1610]], [[64765, 64765], "mapped", [1588, 1609]], [[64766, 64766], "mapped", [1588, 1610]], [[64767, 64767], "mapped", [1581, 1609]], [[64768, 64768], "mapped", [1581, 1610]], [[64769, 64769], "mapped", [1580, 1609]], [[64770, 64770], "mapped", [1580, 1610]], [[64771, 64771], "mapped", [1582, 1609]], [[64772, 64772], "mapped", [1582, 1610]], [[64773, 64773], "mapped", [1589, 1609]], [[64774, 64774], "mapped", [1589, 1610]], [[64775, 64775], "mapped", [1590, 1609]], [[64776, 64776], "mapped", [1590, 1610]], [[64777, 64777], "mapped", [1588, 1580]], [[64778, 64778], "mapped", [1588, 1581]], [[64779, 64779], "mapped", [1588, 1582]], [[64780, 64780], "mapped", [1588, 1605]], [[64781, 64781], "mapped", [1588, 1585]], [[64782, 64782], "mapped", [1587, 1585]], [[64783, 64783], "mapped", [1589, 1585]], [[64784, 64784], "mapped", [1590, 1585]], [[64785, 64785], "mapped", [1591, 1609]], [[64786, 64786], "mapped", [1591, 1610]], [[64787, 64787], "mapped", [1593, 1609]], [[64788, 64788], "mapped", [1593, 1610]], [[64789, 64789], "mapped", [1594, 1609]], [[64790, 64790], "mapped", [1594, 1610]], [[64791, 64791], "mapped", [1587, 1609]], [[64792, 64792], "mapped", [1587, 1610]], [[64793, 64793], "mapped", [1588, 1609]], [[64794, 64794], "mapped", [1588, 1610]], [[64795, 64795], "mapped", [1581, 1609]], [[64796, 64796], "mapped", [1581, 1610]], [[64797, 64797], "mapped", [1580, 1609]], [[64798, 64798], "mapped", [1580, 1610]], [[64799, 64799], "mapped", [1582, 1609]], [[64800, 64800], "mapped", [1582, 1610]], [[64801, 64801], "mapped", [1589, 1609]], [[64802, 64802], "mapped", [1589, 1610]], [[64803, 64803], "mapped", [1590, 1609]], [[64804, 64804], "mapped", [1590, 1610]], [[64805, 64805], "mapped", [1588, 1580]], [[64806, 64806], "mapped", [1588, 1581]], [[64807, 64807], "mapped", [1588, 1582]], [[64808, 64808], "mapped", [1588, 1605]], [[64809, 64809], "mapped", [1588, 1585]], [[64810, 64810], "mapped", [1587, 1585]], [[64811, 64811], "mapped", [1589, 1585]], [[64812, 64812], "mapped", [1590, 1585]], [[64813, 64813], "mapped", [1588, 1580]], [[64814, 64814], "mapped", [1588, 1581]], [[64815, 64815], "mapped", [1588, 1582]], [[64816, 64816], "mapped", [1588, 1605]], [[64817, 64817], "mapped", [1587, 1607]], [[64818, 64818], "mapped", [1588, 1607]], [[64819, 64819], "mapped", [1591, 1605]], [[64820, 64820], "mapped", [1587, 1580]], [[64821, 64821], "mapped", [1587, 1581]], [[64822, 64822], "mapped", [1587, 1582]], [[64823, 64823], "mapped", [1588, 1580]], [[64824, 64824], "mapped", [1588, 1581]], [[64825, 64825], "mapped", [1588, 1582]], [[64826, 64826], "mapped", [1591, 1605]], [[64827, 64827], "mapped", [1592, 1605]], [[64828, 64829], "mapped", [1575, 1611]], [[64830, 64831], "valid", [], "NV8"], [[64832, 64847], "disallowed"], [[64848, 64848], "mapped", [1578, 1580, 1605]], [[64849, 64850], "mapped", [1578, 1581, 1580]], [[64851, 64851], "mapped", [1578, 1581, 1605]], [[64852, 64852], "mapped", [1578, 1582, 1605]], [[64853, 64853], "mapped", [1578, 1605, 1580]], [[64854, 64854], "mapped", [1578, 1605, 1581]], [[64855, 64855], "mapped", [1578, 1605, 1582]], [[64856, 64857], "mapped", [1580, 1605, 1581]], [[64858, 64858], "mapped", [1581, 1605, 1610]], [[64859, 64859], "mapped", [1581, 1605, 1609]], [[64860, 64860], "mapped", [1587, 1581, 1580]], [[64861, 64861], "mapped", [1587, 1580, 1581]], [[64862, 64862], "mapped", [1587, 1580, 1609]], [[64863, 64864], "mapped", [1587, 1605, 1581]], [[64865, 64865], "mapped", [1587, 1605, 1580]], [[64866, 64867], "mapped", [1587, 1605, 1605]], [[64868, 64869], "mapped", [1589, 1581, 1581]], [[64870, 64870], "mapped", [1589, 1605, 1605]], [[64871, 64872], "mapped", [1588, 1581, 1605]], [[64873, 64873], "mapped", [1588, 1580, 1610]], [[64874, 64875], "mapped", [1588, 1605, 1582]], [[64876, 64877], "mapped", [1588, 1605, 1605]], [[64878, 64878], "mapped", [1590, 1581, 1609]], [[64879, 64880], "mapped", [1590, 1582, 1605]], [[64881, 64882], "mapped", [1591, 1605, 1581]], [[64883, 64883], "mapped", [1591, 1605, 1605]], [[64884, 64884], "mapped", [1591, 1605, 1610]], [[64885, 64885], "mapped", [1593, 1580, 1605]], [[64886, 64887], "mapped", [1593, 1605, 1605]], [[64888, 64888], "mapped", [1593, 1605, 1609]], [[64889, 64889], "mapped", [1594, 1605, 1605]], [[64890, 64890], "mapped", [1594, 1605, 1610]], [[64891, 64891], "mapped", [1594, 1605, 1609]], [[64892, 64893], "mapped", [1601, 1582, 1605]], [[64894, 64894], "mapped", [1602, 1605, 1581]], [[64895, 64895], "mapped", [1602, 1605, 1605]], [[64896, 64896], "mapped", [1604, 1581, 1605]], [[64897, 64897], "mapped", [1604, 1581, 1610]], [[64898, 64898], "mapped", [1604, 1581, 1609]], [[64899, 64900], "mapped", [1604, 1580, 1580]], [[64901, 64902], "mapped", [1604, 1582, 1605]], [[64903, 64904], "mapped", [1604, 1605, 1581]], [[64905, 64905], "mapped", [1605, 1581, 1580]], [[64906, 64906], "mapped", [1605, 1581, 1605]], [[64907, 64907], "mapped", [1605, 1581, 1610]], [[64908, 64908], "mapped", [1605, 1580, 1581]], [[64909, 64909], "mapped", [1605, 1580, 1605]], [[64910, 64910], "mapped", [1605, 1582, 1580]], [[64911, 64911], "mapped", [1605, 1582, 1605]], [[64912, 64913], "disallowed"], [[64914, 64914], "mapped", [1605, 1580, 1582]], [[64915, 64915], "mapped", [1607, 1605, 1580]], [[64916, 64916], "mapped", [1607, 1605, 1605]], [[64917, 64917], "mapped", [1606, 1581, 1605]], [[64918, 64918], "mapped", [1606, 1581, 1609]], [[64919, 64920], "mapped", [1606, 1580, 1605]], [[64921, 64921], "mapped", [1606, 1580, 1609]], [[64922, 64922], "mapped", [1606, 1605, 1610]], [[64923, 64923], "mapped", [1606, 1605, 1609]], [[64924, 64925], "mapped", [1610, 1605, 1605]], [[64926, 64926], "mapped", [1576, 1582, 1610]], [[64927, 64927], "mapped", [1578, 1580, 1610]], [[64928, 64928], "mapped", [1578, 1580, 1609]], [[64929, 64929], "mapped", [1578, 1582, 1610]], [[64930, 64930], "mapped", [1578, 1582, 1609]], [[64931, 64931], "mapped", [1578, 1605, 1610]], [[64932, 64932], "mapped", [1578, 1605, 1609]], [[64933, 64933], "mapped", [1580, 1605, 1610]], [[64934, 64934], "mapped", [1580, 1581, 1609]], [[64935, 64935], "mapped", [1580, 1605, 1609]], [[64936, 64936], "mapped", [1587, 1582, 1609]], [[64937, 64937], "mapped", [1589, 1581, 1610]], [[64938, 64938], "mapped", [1588, 1581, 1610]], [[64939, 64939], "mapped", [1590, 1581, 1610]], [[64940, 64940], "mapped", [1604, 1580, 1610]], [[64941, 64941], "mapped", [1604, 1605, 1610]], [[64942, 64942], "mapped", [1610, 1581, 1610]], [[64943, 64943], "mapped", [1610, 1580, 1610]], [[64944, 64944], "mapped", [1610, 1605, 1610]], [[64945, 64945], "mapped", [1605, 1605, 1610]], [[64946, 64946], "mapped", [1602, 1605, 1610]], [[64947, 64947], "mapped", [1606, 1581, 1610]], [[64948, 64948], "mapped", [1602, 1605, 1581]], [[64949, 64949], "mapped", [1604, 1581, 1605]], [[64950, 64950], "mapped", [1593, 1605, 1610]], [[64951, 64951], "mapped", [1603, 1605, 1610]], [[64952, 64952], "mapped", [1606, 1580, 1581]], [[64953, 64953], "mapped", [1605, 1582, 1610]], [[64954, 64954], "mapped", [1604, 1580, 1605]], [[64955, 64955], "mapped", [1603, 1605, 1605]], [[64956, 64956], "mapped", [1604, 1580, 1605]], [[64957, 64957], "mapped", [1606, 1580, 1581]], [[64958, 64958], "mapped", [1580, 1581, 1610]], [[64959, 64959], "mapped", [1581, 1580, 1610]], [[64960, 64960], "mapped", [1605, 1580, 1610]], [[64961, 64961], "mapped", [1601, 1605, 1610]], [[64962, 64962], "mapped", [1576, 1581, 1610]], [[64963, 64963], "mapped", [1603, 1605, 1605]], [[64964, 64964], "mapped", [1593, 1580, 1605]], [[64965, 64965], "mapped", [1589, 1605, 1605]], [[64966, 64966], "mapped", [1587, 1582, 1610]], [[64967, 64967], "mapped", [1606, 1580, 1610]], [[64968, 64975], "disallowed"], [[64976, 65007], "disallowed"], [[65008, 65008], "mapped", [1589, 1604, 1746]], [[65009, 65009], "mapped", [1602, 1604, 1746]], [[65010, 65010], "mapped", [1575, 1604, 1604, 1607]], [[65011, 65011], "mapped", [1575, 1603, 1576, 1585]], [[65012, 65012], "mapped", [1605, 1581, 1605, 1583]], [[65013, 65013], "mapped", [1589, 1604, 1593, 1605]], [[65014, 65014], "mapped", [1585, 1587, 1608, 1604]], [[65015, 65015], "mapped", [1593, 1604, 1610, 1607]], [[65016, 65016], "mapped", [1608, 1587, 1604, 1605]], [[65017, 65017], "mapped", [1589, 1604, 1609]], [[65018, 65018], "disallowed_STD3_mapped", [1589, 1604, 1609, 32, 1575, 1604, 1604, 1607, 32, 1593, 1604, 1610, 1607, 32, 1608, 1587, 1604, 1605]], [[65019, 65019], "disallowed_STD3_mapped", [1580, 1604, 32, 1580, 1604, 1575, 1604, 1607]], [[65020, 65020], "mapped", [1585, 1740, 1575, 1604]], [[65021, 65021], "valid", [], "NV8"], [[65022, 65023], "disallowed"], [[65024, 65039], "ignored"], [[65040, 65040], "disallowed_STD3_mapped", [44]], [[65041, 65041], "mapped", [12289]], [[65042, 65042], "disallowed"], [[65043, 65043], "disallowed_STD3_mapped", [58]], [[65044, 65044], "disallowed_STD3_mapped", [59]], [[65045, 65045], "disallowed_STD3_mapped", [33]], [[65046, 65046], "disallowed_STD3_mapped", [63]], [[65047, 65047], "mapped", [12310]], [[65048, 65048], "mapped", [12311]], [[65049, 65049], "disallowed"], [[65050, 65055], "disallowed"], [[65056, 65059], "valid"], [[65060, 65062], "valid"], [[65063, 65069], "valid"], [[65070, 65071], "valid"], [[65072, 65072], "disallowed"], [[65073, 65073], "mapped", [8212]], [[65074, 65074], "mapped", [8211]], [[65075, 65076], "disallowed_STD3_mapped", [95]], [[65077, 65077], "disallowed_STD3_mapped", [40]], [[65078, 65078], "disallowed_STD3_mapped", [41]], [[65079, 65079], "disallowed_STD3_mapped", [123]], [[65080, 65080], "disallowed_STD3_mapped", [125]], [[65081, 65081], "mapped", [12308]], [[65082, 65082], "mapped", [12309]], [[65083, 65083], "mapped", [12304]], [[65084, 65084], "mapped", [12305]], [[65085, 65085], "mapped", [12298]], [[65086, 65086], "mapped", [12299]], [[65087, 65087], "mapped", [12296]], [[65088, 65088], "mapped", [12297]], [[65089, 65089], "mapped", [12300]], [[65090, 65090], "mapped", [12301]], [[65091, 65091], "mapped", [12302]], [[65092, 65092], "mapped", [12303]], [[65093, 65094], "valid", [], "NV8"], [[65095, 65095], "disallowed_STD3_mapped", [91]], [[65096, 65096], "disallowed_STD3_mapped", [93]], [[65097, 65100], "disallowed_STD3_mapped", [32, 773]], [[65101, 65103], "disallowed_STD3_mapped", [95]], [[65104, 65104], "disallowed_STD3_mapped", [44]], [[65105, 65105], "mapped", [12289]], [[65106, 65106], "disallowed"], [[65107, 65107], "disallowed"], [[65108, 65108], "disallowed_STD3_mapped", [59]], [[65109, 65109], "disallowed_STD3_mapped", [58]], [[65110, 65110], "disallowed_STD3_mapped", [63]], [[65111, 65111], "disallowed_STD3_mapped", [33]], [[65112, 65112], "mapped", [8212]], [[65113, 65113], "disallowed_STD3_mapped", [40]], [[65114, 65114], "disallowed_STD3_mapped", [41]], [[65115, 65115], "disallowed_STD3_mapped", [123]], [[65116, 65116], "disallowed_STD3_mapped", [125]], [[65117, 65117], "mapped", [12308]], [[65118, 65118], "mapped", [12309]], [[65119, 65119], "disallowed_STD3_mapped", [35]], [[65120, 65120], "disallowed_STD3_mapped", [38]], [[65121, 65121], "disallowed_STD3_mapped", [42]], [[65122, 65122], "disallowed_STD3_mapped", [43]], [[65123, 65123], "mapped", [45]], [[65124, 65124], "disallowed_STD3_mapped", [60]], [[65125, 65125], "disallowed_STD3_mapped", [62]], [[65126, 65126], "disallowed_STD3_mapped", [61]], [[65127, 65127], "disallowed"], [[65128, 65128], "disallowed_STD3_mapped", [92]], [[65129, 65129], "disallowed_STD3_mapped", [36]], [[65130, 65130], "disallowed_STD3_mapped", [37]], [[65131, 65131], "disallowed_STD3_mapped", [64]], [[65132, 65135], "disallowed"], [[65136, 65136], "disallowed_STD3_mapped", [32, 1611]], [[65137, 65137], "mapped", [1600, 1611]], [[65138, 65138], "disallowed_STD3_mapped", [32, 1612]], [[65139, 65139], "valid"], [[65140, 65140], "disallowed_STD3_mapped", [32, 1613]], [[65141, 65141], "disallowed"], [[65142, 65142], "disallowed_STD3_mapped", [32, 1614]], [[65143, 65143], "mapped", [1600, 1614]], [[65144, 65144], "disallowed_STD3_mapped", [32, 1615]], [[65145, 65145], "mapped", [1600, 1615]], [[65146, 65146], "disallowed_STD3_mapped", [32, 1616]], [[65147, 65147], "mapped", [1600, 1616]], [[65148, 65148], "disallowed_STD3_mapped", [32, 1617]], [[65149, 65149], "mapped", [1600, 1617]], [[65150, 65150], "disallowed_STD3_mapped", [32, 1618]], [[65151, 65151], "mapped", [1600, 1618]], [[65152, 65152], "mapped", [1569]], [[65153, 65154], "mapped", [1570]], [[65155, 65156], "mapped", [1571]], [[65157, 65158], "mapped", [1572]], [[65159, 65160], "mapped", [1573]], [[65161, 65164], "mapped", [1574]], [[65165, 65166], "mapped", [1575]], [[65167, 65170], "mapped", [1576]], [[65171, 65172], "mapped", [1577]], [[65173, 65176], "mapped", [1578]], [[65177, 65180], "mapped", [1579]], [[65181, 65184], "mapped", [1580]], [[65185, 65188], "mapped", [1581]], [[65189, 65192], "mapped", [1582]], [[65193, 65194], "mapped", [1583]], [[65195, 65196], "mapped", [1584]], [[65197, 65198], "mapped", [1585]], [[65199, 65200], "mapped", [1586]], [[65201, 65204], "mapped", [1587]], [[65205, 65208], "mapped", [1588]], [[65209, 65212], "mapped", [1589]], [[65213, 65216], "mapped", [1590]], [[65217, 65220], "mapped", [1591]], [[65221, 65224], "mapped", [1592]], [[65225, 65228], "mapped", [1593]], [[65229, 65232], "mapped", [1594]], [[65233, 65236], "mapped", [1601]], [[65237, 65240], "mapped", [1602]], [[65241, 65244], "mapped", [1603]], [[65245, 65248], "mapped", [1604]], [[65249, 65252], "mapped", [1605]], [[65253, 65256], "mapped", [1606]], [[65257, 65260], "mapped", [1607]], [[65261, 65262], "mapped", [1608]], [[65263, 65264], "mapped", [1609]], [[65265, 65268], "mapped", [1610]], [[65269, 65270], "mapped", [1604, 1570]], [[65271, 65272], "mapped", [1604, 1571]], [[65273, 65274], "mapped", [1604, 1573]], [[65275, 65276], "mapped", [1604, 1575]], [[65277, 65278], "disallowed"], [[65279, 65279], "ignored"], [[65280, 65280], "disallowed"], [[65281, 65281], "disallowed_STD3_mapped", [33]], [[65282, 65282], "disallowed_STD3_mapped", [34]], [[65283, 65283], "disallowed_STD3_mapped", [35]], [[65284, 65284], "disallowed_STD3_mapped", [36]], [[65285, 65285], "disallowed_STD3_mapped", [37]], [[65286, 65286], "disallowed_STD3_mapped", [38]], [[65287, 65287], "disallowed_STD3_mapped", [39]], [[65288, 65288], "disallowed_STD3_mapped", [40]], [[65289, 65289], "disallowed_STD3_mapped", [41]], [[65290, 65290], "disallowed_STD3_mapped", [42]], [[65291, 65291], "disallowed_STD3_mapped", [43]], [[65292, 65292], "disallowed_STD3_mapped", [44]], [[65293, 65293], "mapped", [45]], [[65294, 65294], "mapped", [46]], [[65295, 65295], "disallowed_STD3_mapped", [47]], [[65296, 65296], "mapped", [48]], [[65297, 65297], "mapped", [49]], [[65298, 65298], "mapped", [50]], [[65299, 65299], "mapped", [51]], [[65300, 65300], "mapped", [52]], [[65301, 65301], "mapped", [53]], [[65302, 65302], "mapped", [54]], [[65303, 65303], "mapped", [55]], [[65304, 65304], "mapped", [56]], [[65305, 65305], "mapped", [57]], [[65306, 65306], "disallowed_STD3_mapped", [58]], [[65307, 65307], "disallowed_STD3_mapped", [59]], [[65308, 65308], "disallowed_STD3_mapped", [60]], [[65309, 65309], "disallowed_STD3_mapped", [61]], [[65310, 65310], "disallowed_STD3_mapped", [62]], [[65311, 65311], "disallowed_STD3_mapped", [63]], [[65312, 65312], "disallowed_STD3_mapped", [64]], [[65313, 65313], "mapped", [97]], [[65314, 65314], "mapped", [98]], [[65315, 65315], "mapped", [99]], [[65316, 65316], "mapped", [100]], [[65317, 65317], "mapped", [101]], [[65318, 65318], "mapped", [102]], [[65319, 65319], "mapped", [103]], [[65320, 65320], "mapped", [104]], [[65321, 65321], "mapped", [105]], [[65322, 65322], "mapped", [106]], [[65323, 65323], "mapped", [107]], [[65324, 65324], "mapped", [108]], [[65325, 65325], "mapped", [109]], [[65326, 65326], "mapped", [110]], [[65327, 65327], "mapped", [111]], [[65328, 65328], "mapped", [112]], [[65329, 65329], "mapped", [113]], [[65330, 65330], "mapped", [114]], [[65331, 65331], "mapped", [115]], [[65332, 65332], "mapped", [116]], [[65333, 65333], "mapped", [117]], [[65334, 65334], "mapped", [118]], [[65335, 65335], "mapped", [119]], [[65336, 65336], "mapped", [120]], [[65337, 65337], "mapped", [121]], [[65338, 65338], "mapped", [122]], [[65339, 65339], "disallowed_STD3_mapped", [91]], [[65340, 65340], "disallowed_STD3_mapped", [92]], [[65341, 65341], "disallowed_STD3_mapped", [93]], [[65342, 65342], "disallowed_STD3_mapped", [94]], [[65343, 65343], "disallowed_STD3_mapped", [95]], [[65344, 65344], "disallowed_STD3_mapped", [96]], [[65345, 65345], "mapped", [97]], [[65346, 65346], "mapped", [98]], [[65347, 65347], "mapped", [99]], [[65348, 65348], "mapped", [100]], [[65349, 65349], "mapped", [101]], [[65350, 65350], "mapped", [102]], [[65351, 65351], "mapped", [103]], [[65352, 65352], "mapped", [104]], [[65353, 65353], "mapped", [105]], [[65354, 65354], "mapped", [106]], [[65355, 65355], "mapped", [107]], [[65356, 65356], "mapped", [108]], [[65357, 65357], "mapped", [109]], [[65358, 65358], "mapped", [110]], [[65359, 65359], "mapped", [111]], [[65360, 65360], "mapped", [112]], [[65361, 65361], "mapped", [113]], [[65362, 65362], "mapped", [114]], [[65363, 65363], "mapped", [115]], [[65364, 65364], "mapped", [116]], [[65365, 65365], "mapped", [117]], [[65366, 65366], "mapped", [118]], [[65367, 65367], "mapped", [119]], [[65368, 65368], "mapped", [120]], [[65369, 65369], "mapped", [121]], [[65370, 65370], "mapped", [122]], [[65371, 65371], "disallowed_STD3_mapped", [123]], [[65372, 65372], "disallowed_STD3_mapped", [124]], [[65373, 65373], "disallowed_STD3_mapped", [125]], [[65374, 65374], "disallowed_STD3_mapped", [126]], [[65375, 65375], "mapped", [10629]], [[65376, 65376], "mapped", [10630]], [[65377, 65377], "mapped", [46]], [[65378, 65378], "mapped", [12300]], [[65379, 65379], "mapped", [12301]], [[65380, 65380], "mapped", [12289]], [[65381, 65381], "mapped", [12539]], [[65382, 65382], "mapped", [12530]], [[65383, 65383], "mapped", [12449]], [[65384, 65384], "mapped", [12451]], [[65385, 65385], "mapped", [12453]], [[65386, 65386], "mapped", [12455]], [[65387, 65387], "mapped", [12457]], [[65388, 65388], "mapped", [12515]], [[65389, 65389], "mapped", [12517]], [[65390, 65390], "mapped", [12519]], [[65391, 65391], "mapped", [12483]], [[65392, 65392], "mapped", [12540]], [[65393, 65393], "mapped", [12450]], [[65394, 65394], "mapped", [12452]], [[65395, 65395], "mapped", [12454]], [[65396, 65396], "mapped", [12456]], [[65397, 65397], "mapped", [12458]], [[65398, 65398], "mapped", [12459]], [[65399, 65399], "mapped", [12461]], [[65400, 65400], "mapped", [12463]], [[65401, 65401], "mapped", [12465]], [[65402, 65402], "mapped", [12467]], [[65403, 65403], "mapped", [12469]], [[65404, 65404], "mapped", [12471]], [[65405, 65405], "mapped", [12473]], [[65406, 65406], "mapped", [12475]], [[65407, 65407], "mapped", [12477]], [[65408, 65408], "mapped", [12479]], [[65409, 65409], "mapped", [12481]], [[65410, 65410], "mapped", [12484]], [[65411, 65411], "mapped", [12486]], [[65412, 65412], "mapped", [12488]], [[65413, 65413], "mapped", [12490]], [[65414, 65414], "mapped", [12491]], [[65415, 65415], "mapped", [12492]], [[65416, 65416], "mapped", [12493]], [[65417, 65417], "mapped", [12494]], [[65418, 65418], "mapped", [12495]], [[65419, 65419], "mapped", [12498]], [[65420, 65420], "mapped", [12501]], [[65421, 65421], "mapped", [12504]], [[65422, 65422], "mapped", [12507]], [[65423, 65423], "mapped", [12510]], [[65424, 65424], "mapped", [12511]], [[65425, 65425], "mapped", [12512]], [[65426, 65426], "mapped", [12513]], [[65427, 65427], "mapped", [12514]], [[65428, 65428], "mapped", [12516]], [[65429, 65429], "mapped", [12518]], [[65430, 65430], "mapped", [12520]], [[65431, 65431], "mapped", [12521]], [[65432, 65432], "mapped", [12522]], [[65433, 65433], "mapped", [12523]], [[65434, 65434], "mapped", [12524]], [[65435, 65435], "mapped", [12525]], [[65436, 65436], "mapped", [12527]], [[65437, 65437], "mapped", [12531]], [[65438, 65438], "mapped", [12441]], [[65439, 65439], "mapped", [12442]], [[65440, 65440], "disallowed"], [[65441, 65441], "mapped", [4352]], [[65442, 65442], "mapped", [4353]], [[65443, 65443], "mapped", [4522]], [[65444, 65444], "mapped", [4354]], [[65445, 65445], "mapped", [4524]], [[65446, 65446], "mapped", [4525]], [[65447, 65447], "mapped", [4355]], [[65448, 65448], "mapped", [4356]], [[65449, 65449], "mapped", [4357]], [[65450, 65450], "mapped", [4528]], [[65451, 65451], "mapped", [4529]], [[65452, 65452], "mapped", [4530]], [[65453, 65453], "mapped", [4531]], [[65454, 65454], "mapped", [4532]], [[65455, 65455], "mapped", [4533]], [[65456, 65456], "mapped", [4378]], [[65457, 65457], "mapped", [4358]], [[65458, 65458], "mapped", [4359]], [[65459, 65459], "mapped", [4360]], [[65460, 65460], "mapped", [4385]], [[65461, 65461], "mapped", [4361]], [[65462, 65462], "mapped", [4362]], [[65463, 65463], "mapped", [4363]], [[65464, 65464], "mapped", [4364]], [[65465, 65465], "mapped", [4365]], [[65466, 65466], "mapped", [4366]], [[65467, 65467], "mapped", [4367]], [[65468, 65468], "mapped", [4368]], [[65469, 65469], "mapped", [4369]], [[65470, 65470], "mapped", [4370]], [[65471, 65473], "disallowed"], [[65474, 65474], "mapped", [4449]], [[65475, 65475], "mapped", [4450]], [[65476, 65476], "mapped", [4451]], [[65477, 65477], "mapped", [4452]], [[65478, 65478], "mapped", [4453]], [[65479, 65479], "mapped", [4454]], [[65480, 65481], "disallowed"], [[65482, 65482], "mapped", [4455]], [[65483, 65483], "mapped", [4456]], [[65484, 65484], "mapped", [4457]], [[65485, 65485], "mapped", [4458]], [[65486, 65486], "mapped", [4459]], [[65487, 65487], "mapped", [4460]], [[65488, 65489], "disallowed"], [[65490, 65490], "mapped", [4461]], [[65491, 65491], "mapped", [4462]], [[65492, 65492], "mapped", [4463]], [[65493, 65493], "mapped", [4464]], [[65494, 65494], "mapped", [4465]], [[65495, 65495], "mapped", [4466]], [[65496, 65497], "disallowed"], [[65498, 65498], "mapped", [4467]], [[65499, 65499], "mapped", [4468]], [[65500, 65500], "mapped", [4469]], [[65501, 65503], "disallowed"], [[65504, 65504], "mapped", [162]], [[65505, 65505], "mapped", [163]], [[65506, 65506], "mapped", [172]], [[65507, 65507], "disallowed_STD3_mapped", [32, 772]], [[65508, 65508], "mapped", [166]], [[65509, 65509], "mapped", [165]], [[65510, 65510], "mapped", [8361]], [[65511, 65511], "disallowed"], [[65512, 65512], "mapped", [9474]], [[65513, 65513], "mapped", [8592]], [[65514, 65514], "mapped", [8593]], [[65515, 65515], "mapped", [8594]], [[65516, 65516], "mapped", [8595]], [[65517, 65517], "mapped", [9632]], [[65518, 65518], "mapped", [9675]], [[65519, 65528], "disallowed"], [[65529, 65531], "disallowed"], [[65532, 65532], "disallowed"], [[65533, 65533], "disallowed"], [[65534, 65535], "disallowed"], [[65536, 65547], "valid"], [[65548, 65548], "disallowed"], [[65549, 65574], "valid"], [[65575, 65575], "disallowed"], [[65576, 65594], "valid"], [[65595, 65595], "disallowed"], [[65596, 65597], "valid"], [[65598, 65598], "disallowed"], [[65599, 65613], "valid"], [[65614, 65615], "disallowed"], [[65616, 65629], "valid"], [[65630, 65663], "disallowed"], [[65664, 65786], "valid"], [[65787, 65791], "disallowed"], [[65792, 65794], "valid", [], "NV8"], [[65795, 65798], "disallowed"], [[65799, 65843], "valid", [], "NV8"], [[65844, 65846], "disallowed"], [[65847, 65855], "valid", [], "NV8"], [[65856, 65930], "valid", [], "NV8"], [[65931, 65932], "valid", [], "NV8"], [[65933, 65935], "disallowed"], [[65936, 65947], "valid", [], "NV8"], [[65948, 65951], "disallowed"], [[65952, 65952], "valid", [], "NV8"], [[65953, 65999], "disallowed"], [[66000, 66044], "valid", [], "NV8"], [[66045, 66045], "valid"], [[66046, 66175], "disallowed"], [[66176, 66204], "valid"], [[66205, 66207], "disallowed"], [[66208, 66256], "valid"], [[66257, 66271], "disallowed"], [[66272, 66272], "valid"], [[66273, 66299], "valid", [], "NV8"], [[66300, 66303], "disallowed"], [[66304, 66334], "valid"], [[66335, 66335], "valid"], [[66336, 66339], "valid", [], "NV8"], [[66340, 66351], "disallowed"], [[66352, 66368], "valid"], [[66369, 66369], "valid", [], "NV8"], [[66370, 66377], "valid"], [[66378, 66378], "valid", [], "NV8"], [[66379, 66383], "disallowed"], [[66384, 66426], "valid"], [[66427, 66431], "disallowed"], [[66432, 66461], "valid"], [[66462, 66462], "disallowed"], [[66463, 66463], "valid", [], "NV8"], [[66464, 66499], "valid"], [[66500, 66503], "disallowed"], [[66504, 66511], "valid"], [[66512, 66517], "valid", [], "NV8"], [[66518, 66559], "disallowed"], [[66560, 66560], "mapped", [66600]], [[66561, 66561], "mapped", [66601]], [[66562, 66562], "mapped", [66602]], [[66563, 66563], "mapped", [66603]], [[66564, 66564], "mapped", [66604]], [[66565, 66565], "mapped", [66605]], [[66566, 66566], "mapped", [66606]], [[66567, 66567], "mapped", [66607]], [[66568, 66568], "mapped", [66608]], [[66569, 66569], "mapped", [66609]], [[66570, 66570], "mapped", [66610]], [[66571, 66571], "mapped", [66611]], [[66572, 66572], "mapped", [66612]], [[66573, 66573], "mapped", [66613]], [[66574, 66574], "mapped", [66614]], [[66575, 66575], "mapped", [66615]], [[66576, 66576], "mapped", [66616]], [[66577, 66577], "mapped", [66617]], [[66578, 66578], "mapped", [66618]], [[66579, 66579], "mapped", [66619]], [[66580, 66580], "mapped", [66620]], [[66581, 66581], "mapped", [66621]], [[66582, 66582], "mapped", [66622]], [[66583, 66583], "mapped", [66623]], [[66584, 66584], "mapped", [66624]], [[66585, 66585], "mapped", [66625]], [[66586, 66586], "mapped", [66626]], [[66587, 66587], "mapped", [66627]], [[66588, 66588], "mapped", [66628]], [[66589, 66589], "mapped", [66629]], [[66590, 66590], "mapped", [66630]], [[66591, 66591], "mapped", [66631]], [[66592, 66592], "mapped", [66632]], [[66593, 66593], "mapped", [66633]], [[66594, 66594], "mapped", [66634]], [[66595, 66595], "mapped", [66635]], [[66596, 66596], "mapped", [66636]], [[66597, 66597], "mapped", [66637]], [[66598, 66598], "mapped", [66638]], [[66599, 66599], "mapped", [66639]], [[66600, 66637], "valid"], [[66638, 66717], "valid"], [[66718, 66719], "disallowed"], [[66720, 66729], "valid"], [[66730, 66815], "disallowed"], [[66816, 66855], "valid"], [[66856, 66863], "disallowed"], [[66864, 66915], "valid"], [[66916, 66926], "disallowed"], [[66927, 66927], "valid", [], "NV8"], [[66928, 67071], "disallowed"], [[67072, 67382], "valid"], [[67383, 67391], "disallowed"], [[67392, 67413], "valid"], [[67414, 67423], "disallowed"], [[67424, 67431], "valid"], [[67432, 67583], "disallowed"], [[67584, 67589], "valid"], [[67590, 67591], "disallowed"], [[67592, 67592], "valid"], [[67593, 67593], "disallowed"], [[67594, 67637], "valid"], [[67638, 67638], "disallowed"], [[67639, 67640], "valid"], [[67641, 67643], "disallowed"], [[67644, 67644], "valid"], [[67645, 67646], "disallowed"], [[67647, 67647], "valid"], [[67648, 67669], "valid"], [[67670, 67670], "disallowed"], [[67671, 67679], "valid", [], "NV8"], [[67680, 67702], "valid"], [[67703, 67711], "valid", [], "NV8"], [[67712, 67742], "valid"], [[67743, 67750], "disallowed"], [[67751, 67759], "valid", [], "NV8"], [[67760, 67807], "disallowed"], [[67808, 67826], "valid"], [[67827, 67827], "disallowed"], [[67828, 67829], "valid"], [[67830, 67834], "disallowed"], [[67835, 67839], "valid", [], "NV8"], [[67840, 67861], "valid"], [[67862, 67865], "valid", [], "NV8"], [[67866, 67867], "valid", [], "NV8"], [[67868, 67870], "disallowed"], [[67871, 67871], "valid", [], "NV8"], [[67872, 67897], "valid"], [[67898, 67902], "disallowed"], [[67903, 67903], "valid", [], "NV8"], [[67904, 67967], "disallowed"], [[67968, 68023], "valid"], [[68024, 68027], "disallowed"], [[68028, 68029], "valid", [], "NV8"], [[68030, 68031], "valid"], [[68032, 68047], "valid", [], "NV8"], [[68048, 68049], "disallowed"], [[68050, 68095], "valid", [], "NV8"], [[68096, 68099], "valid"], [[68100, 68100], "disallowed"], [[68101, 68102], "valid"], [[68103, 68107], "disallowed"], [[68108, 68115], "valid"], [[68116, 68116], "disallowed"], [[68117, 68119], "valid"], [[68120, 68120], "disallowed"], [[68121, 68147], "valid"], [[68148, 68151], "disallowed"], [[68152, 68154], "valid"], [[68155, 68158], "disallowed"], [[68159, 68159], "valid"], [[68160, 68167], "valid", [], "NV8"], [[68168, 68175], "disallowed"], [[68176, 68184], "valid", [], "NV8"], [[68185, 68191], "disallowed"], [[68192, 68220], "valid"], [[68221, 68223], "valid", [], "NV8"], [[68224, 68252], "valid"], [[68253, 68255], "valid", [], "NV8"], [[68256, 68287], "disallowed"], [[68288, 68295], "valid"], [[68296, 68296], "valid", [], "NV8"], [[68297, 68326], "valid"], [[68327, 68330], "disallowed"], [[68331, 68342], "valid", [], "NV8"], [[68343, 68351], "disallowed"], [[68352, 68405], "valid"], [[68406, 68408], "disallowed"], [[68409, 68415], "valid", [], "NV8"], [[68416, 68437], "valid"], [[68438, 68439], "disallowed"], [[68440, 68447], "valid", [], "NV8"], [[68448, 68466], "valid"], [[68467, 68471], "disallowed"], [[68472, 68479], "valid", [], "NV8"], [[68480, 68497], "valid"], [[68498, 68504], "disallowed"], [[68505, 68508], "valid", [], "NV8"], [[68509, 68520], "disallowed"], [[68521, 68527], "valid", [], "NV8"], [[68528, 68607], "disallowed"], [[68608, 68680], "valid"], [[68681, 68735], "disallowed"], [[68736, 68736], "mapped", [68800]], [[68737, 68737], "mapped", [68801]], [[68738, 68738], "mapped", [68802]], [[68739, 68739], "mapped", [68803]], [[68740, 68740], "mapped", [68804]], [[68741, 68741], "mapped", [68805]], [[68742, 68742], "mapped", [68806]], [[68743, 68743], "mapped", [68807]], [[68744, 68744], "mapped", [68808]], [[68745, 68745], "mapped", [68809]], [[68746, 68746], "mapped", [68810]], [[68747, 68747], "mapped", [68811]], [[68748, 68748], "mapped", [68812]], [[68749, 68749], "mapped", [68813]], [[68750, 68750], "mapped", [68814]], [[68751, 68751], "mapped", [68815]], [[68752, 68752], "mapped", [68816]], [[68753, 68753], "mapped", [68817]], [[68754, 68754], "mapped", [68818]], [[68755, 68755], "mapped", [68819]], [[68756, 68756], "mapped", [68820]], [[68757, 68757], "mapped", [68821]], [[68758, 68758], "mapped", [68822]], [[68759, 68759], "mapped", [68823]], [[68760, 68760], "mapped", [68824]], [[68761, 68761], "mapped", [68825]], [[68762, 68762], "mapped", [68826]], [[68763, 68763], "mapped", [68827]], [[68764, 68764], "mapped", [68828]], [[68765, 68765], "mapped", [68829]], [[68766, 68766], "mapped", [68830]], [[68767, 68767], "mapped", [68831]], [[68768, 68768], "mapped", [68832]], [[68769, 68769], "mapped", [68833]], [[68770, 68770], "mapped", [68834]], [[68771, 68771], "mapped", [68835]], [[68772, 68772], "mapped", [68836]], [[68773, 68773], "mapped", [68837]], [[68774, 68774], "mapped", [68838]], [[68775, 68775], "mapped", [68839]], [[68776, 68776], "mapped", [68840]], [[68777, 68777], "mapped", [68841]], [[68778, 68778], "mapped", [68842]], [[68779, 68779], "mapped", [68843]], [[68780, 68780], "mapped", [68844]], [[68781, 68781], "mapped", [68845]], [[68782, 68782], "mapped", [68846]], [[68783, 68783], "mapped", [68847]], [[68784, 68784], "mapped", [68848]], [[68785, 68785], "mapped", [68849]], [[68786, 68786], "mapped", [68850]], [[68787, 68799], "disallowed"], [[68800, 68850], "valid"], [[68851, 68857], "disallowed"], [[68858, 68863], "valid", [], "NV8"], [[68864, 69215], "disallowed"], [[69216, 69246], "valid", [], "NV8"], [[69247, 69631], "disallowed"], [[69632, 69702], "valid"], [[69703, 69709], "valid", [], "NV8"], [[69710, 69713], "disallowed"], [[69714, 69733], "valid", [], "NV8"], [[69734, 69743], "valid"], [[69744, 69758], "disallowed"], [[69759, 69759], "valid"], [[69760, 69818], "valid"], [[69819, 69820], "valid", [], "NV8"], [[69821, 69821], "disallowed"], [[69822, 69825], "valid", [], "NV8"], [[69826, 69839], "disallowed"], [[69840, 69864], "valid"], [[69865, 69871], "disallowed"], [[69872, 69881], "valid"], [[69882, 69887], "disallowed"], [[69888, 69940], "valid"], [[69941, 69941], "disallowed"], [[69942, 69951], "valid"], [[69952, 69955], "valid", [], "NV8"], [[69956, 69967], "disallowed"], [[69968, 70003], "valid"], [[70004, 70005], "valid", [], "NV8"], [[70006, 70006], "valid"], [[70007, 70015], "disallowed"], [[70016, 70084], "valid"], [[70085, 70088], "valid", [], "NV8"], [[70089, 70089], "valid", [], "NV8"], [[70090, 70092], "valid"], [[70093, 70093], "valid", [], "NV8"], [[70094, 70095], "disallowed"], [[70096, 70105], "valid"], [[70106, 70106], "valid"], [[70107, 70107], "valid", [], "NV8"], [[70108, 70108], "valid"], [[70109, 70111], "valid", [], "NV8"], [[70112, 70112], "disallowed"], [[70113, 70132], "valid", [], "NV8"], [[70133, 70143], "disallowed"], [[70144, 70161], "valid"], [[70162, 70162], "disallowed"], [[70163, 70199], "valid"], [[70200, 70205], "valid", [], "NV8"], [[70206, 70271], "disallowed"], [[70272, 70278], "valid"], [[70279, 70279], "disallowed"], [[70280, 70280], "valid"], [[70281, 70281], "disallowed"], [[70282, 70285], "valid"], [[70286, 70286], "disallowed"], [[70287, 70301], "valid"], [[70302, 70302], "disallowed"], [[70303, 70312], "valid"], [[70313, 70313], "valid", [], "NV8"], [[70314, 70319], "disallowed"], [[70320, 70378], "valid"], [[70379, 70383], "disallowed"], [[70384, 70393], "valid"], [[70394, 70399], "disallowed"], [[70400, 70400], "valid"], [[70401, 70403], "valid"], [[70404, 70404], "disallowed"], [[70405, 70412], "valid"], [[70413, 70414], "disallowed"], [[70415, 70416], "valid"], [[70417, 70418], "disallowed"], [[70419, 70440], "valid"], [[70441, 70441], "disallowed"], [[70442, 70448], "valid"], [[70449, 70449], "disallowed"], [[70450, 70451], "valid"], [[70452, 70452], "disallowed"], [[70453, 70457], "valid"], [[70458, 70459], "disallowed"], [[70460, 70468], "valid"], [[70469, 70470], "disallowed"], [[70471, 70472], "valid"], [[70473, 70474], "disallowed"], [[70475, 70477], "valid"], [[70478, 70479], "disallowed"], [[70480, 70480], "valid"], [[70481, 70486], "disallowed"], [[70487, 70487], "valid"], [[70488, 70492], "disallowed"], [[70493, 70499], "valid"], [[70500, 70501], "disallowed"], [[70502, 70508], "valid"], [[70509, 70511], "disallowed"], [[70512, 70516], "valid"], [[70517, 70783], "disallowed"], [[70784, 70853], "valid"], [[70854, 70854], "valid", [], "NV8"], [[70855, 70855], "valid"], [[70856, 70863], "disallowed"], [[70864, 70873], "valid"], [[70874, 71039], "disallowed"], [[71040, 71093], "valid"], [[71094, 71095], "disallowed"], [[71096, 71104], "valid"], [[71105, 71113], "valid", [], "NV8"], [[71114, 71127], "valid", [], "NV8"], [[71128, 71133], "valid"], [[71134, 71167], "disallowed"], [[71168, 71232], "valid"], [[71233, 71235], "valid", [], "NV8"], [[71236, 71236], "valid"], [[71237, 71247], "disallowed"], [[71248, 71257], "valid"], [[71258, 71295], "disallowed"], [[71296, 71351], "valid"], [[71352, 71359], "disallowed"], [[71360, 71369], "valid"], [[71370, 71423], "disallowed"], [[71424, 71449], "valid"], [[71450, 71452], "disallowed"], [[71453, 71467], "valid"], [[71468, 71471], "disallowed"], [[71472, 71481], "valid"], [[71482, 71487], "valid", [], "NV8"], [[71488, 71839], "disallowed"], [[71840, 71840], "mapped", [71872]], [[71841, 71841], "mapped", [71873]], [[71842, 71842], "mapped", [71874]], [[71843, 71843], "mapped", [71875]], [[71844, 71844], "mapped", [71876]], [[71845, 71845], "mapped", [71877]], [[71846, 71846], "mapped", [71878]], [[71847, 71847], "mapped", [71879]], [[71848, 71848], "mapped", [71880]], [[71849, 71849], "mapped", [71881]], [[71850, 71850], "mapped", [71882]], [[71851, 71851], "mapped", [71883]], [[71852, 71852], "mapped", [71884]], [[71853, 71853], "mapped", [71885]], [[71854, 71854], "mapped", [71886]], [[71855, 71855], "mapped", [71887]], [[71856, 71856], "mapped", [71888]], [[71857, 71857], "mapped", [71889]], [[71858, 71858], "mapped", [71890]], [[71859, 71859], "mapped", [71891]], [[71860, 71860], "mapped", [71892]], [[71861, 71861], "mapped", [71893]], [[71862, 71862], "mapped", [71894]], [[71863, 71863], "mapped", [71895]], [[71864, 71864], "mapped", [71896]], [[71865, 71865], "mapped", [71897]], [[71866, 71866], "mapped", [71898]], [[71867, 71867], "mapped", [71899]], [[71868, 71868], "mapped", [71900]], [[71869, 71869], "mapped", [71901]], [[71870, 71870], "mapped", [71902]], [[71871, 71871], "mapped", [71903]], [[71872, 71913], "valid"], [[71914, 71922], "valid", [], "NV8"], [[71923, 71934], "disallowed"], [[71935, 71935], "valid"], [[71936, 72383], "disallowed"], [[72384, 72440], "valid"], [[72441, 73727], "disallowed"], [[73728, 74606], "valid"], [[74607, 74648], "valid"], [[74649, 74649], "valid"], [[74650, 74751], "disallowed"], [[74752, 74850], "valid", [], "NV8"], [[74851, 74862], "valid", [], "NV8"], [[74863, 74863], "disallowed"], [[74864, 74867], "valid", [], "NV8"], [[74868, 74868], "valid", [], "NV8"], [[74869, 74879], "disallowed"], [[74880, 75075], "valid"], [[75076, 77823], "disallowed"], [[77824, 78894], "valid"], [[78895, 82943], "disallowed"], [[82944, 83526], "valid"], [[83527, 92159], "disallowed"], [[92160, 92728], "valid"], [[92729, 92735], "disallowed"], [[92736, 92766], "valid"], [[92767, 92767], "disallowed"], [[92768, 92777], "valid"], [[92778, 92781], "disallowed"], [[92782, 92783], "valid", [], "NV8"], [[92784, 92879], "disallowed"], [[92880, 92909], "valid"], [[92910, 92911], "disallowed"], [[92912, 92916], "valid"], [[92917, 92917], "valid", [], "NV8"], [[92918, 92927], "disallowed"], [[92928, 92982], "valid"], [[92983, 92991], "valid", [], "NV8"], [[92992, 92995], "valid"], [[92996, 92997], "valid", [], "NV8"], [[92998, 93007], "disallowed"], [[93008, 93017], "valid"], [[93018, 93018], "disallowed"], [[93019, 93025], "valid", [], "NV8"], [[93026, 93026], "disallowed"], [[93027, 93047], "valid"], [[93048, 93052], "disallowed"], [[93053, 93071], "valid"], [[93072, 93951], "disallowed"], [[93952, 94020], "valid"], [[94021, 94031], "disallowed"], [[94032, 94078], "valid"], [[94079, 94094], "disallowed"], [[94095, 94111], "valid"], [[94112, 110591], "disallowed"], [[110592, 110593], "valid"], [[110594, 113663], "disallowed"], [[113664, 113770], "valid"], [[113771, 113775], "disallowed"], [[113776, 113788], "valid"], [[113789, 113791], "disallowed"], [[113792, 113800], "valid"], [[113801, 113807], "disallowed"], [[113808, 113817], "valid"], [[113818, 113819], "disallowed"], [[113820, 113820], "valid", [], "NV8"], [[113821, 113822], "valid"], [[113823, 113823], "valid", [], "NV8"], [[113824, 113827], "ignored"], [[113828, 118783], "disallowed"], [[118784, 119029], "valid", [], "NV8"], [[119030, 119039], "disallowed"], [[119040, 119078], "valid", [], "NV8"], [[119079, 119080], "disallowed"], [[119081, 119081], "valid", [], "NV8"], [[119082, 119133], "valid", [], "NV8"], [[119134, 119134], "mapped", [119127, 119141]], [[119135, 119135], "mapped", [119128, 119141]], [[119136, 119136], "mapped", [119128, 119141, 119150]], [[119137, 119137], "mapped", [119128, 119141, 119151]], [[119138, 119138], "mapped", [119128, 119141, 119152]], [[119139, 119139], "mapped", [119128, 119141, 119153]], [[119140, 119140], "mapped", [119128, 119141, 119154]], [[119141, 119154], "valid", [], "NV8"], [[119155, 119162], "disallowed"], [[119163, 119226], "valid", [], "NV8"], [[119227, 119227], "mapped", [119225, 119141]], [[119228, 119228], "mapped", [119226, 119141]], [[119229, 119229], "mapped", [119225, 119141, 119150]], [[119230, 119230], "mapped", [119226, 119141, 119150]], [[119231, 119231], "mapped", [119225, 119141, 119151]], [[119232, 119232], "mapped", [119226, 119141, 119151]], [[119233, 119261], "valid", [], "NV8"], [[119262, 119272], "valid", [], "NV8"], [[119273, 119295], "disallowed"], [[119296, 119365], "valid", [], "NV8"], [[119366, 119551], "disallowed"], [[119552, 119638], "valid", [], "NV8"], [[119639, 119647], "disallowed"], [[119648, 119665], "valid", [], "NV8"], [[119666, 119807], "disallowed"], [[119808, 119808], "mapped", [97]], [[119809, 119809], "mapped", [98]], [[119810, 119810], "mapped", [99]], [[119811, 119811], "mapped", [100]], [[119812, 119812], "mapped", [101]], [[119813, 119813], "mapped", [102]], [[119814, 119814], "mapped", [103]], [[119815, 119815], "mapped", [104]], [[119816, 119816], "mapped", [105]], [[119817, 119817], "mapped", [106]], [[119818, 119818], "mapped", [107]], [[119819, 119819], "mapped", [108]], [[119820, 119820], "mapped", [109]], [[119821, 119821], "mapped", [110]], [[119822, 119822], "mapped", [111]], [[119823, 119823], "mapped", [112]], [[119824, 119824], "mapped", [113]], [[119825, 119825], "mapped", [114]], [[119826, 119826], "mapped", [115]], [[119827, 119827], "mapped", [116]], [[119828, 119828], "mapped", [117]], [[119829, 119829], "mapped", [118]], [[119830, 119830], "mapped", [119]], [[119831, 119831], "mapped", [120]], [[119832, 119832], "mapped", [121]], [[119833, 119833], "mapped", [122]], [[119834, 119834], "mapped", [97]], [[119835, 119835], "mapped", [98]], [[119836, 119836], "mapped", [99]], [[119837, 119837], "mapped", [100]], [[119838, 119838], "mapped", [101]], [[119839, 119839], "mapped", [102]], [[119840, 119840], "mapped", [103]], [[119841, 119841], "mapped", [104]], [[119842, 119842], "mapped", [105]], [[119843, 119843], "mapped", [106]], [[119844, 119844], "mapped", [107]], [[119845, 119845], "mapped", [108]], [[119846, 119846], "mapped", [109]], [[119847, 119847], "mapped", [110]], [[119848, 119848], "mapped", [111]], [[119849, 119849], "mapped", [112]], [[119850, 119850], "mapped", [113]], [[119851, 119851], "mapped", [114]], [[119852, 119852], "mapped", [115]], [[119853, 119853], "mapped", [116]], [[119854, 119854], "mapped", [117]], [[119855, 119855], "mapped", [118]], [[119856, 119856], "mapped", [119]], [[119857, 119857], "mapped", [120]], [[119858, 119858], "mapped", [121]], [[119859, 119859], "mapped", [122]], [[119860, 119860], "mapped", [97]], [[119861, 119861], "mapped", [98]], [[119862, 119862], "mapped", [99]], [[119863, 119863], "mapped", [100]], [[119864, 119864], "mapped", [101]], [[119865, 119865], "mapped", [102]], [[119866, 119866], "mapped", [103]], [[119867, 119867], "mapped", [104]], [[119868, 119868], "mapped", [105]], [[119869, 119869], "mapped", [106]], [[119870, 119870], "mapped", [107]], [[119871, 119871], "mapped", [108]], [[119872, 119872], "mapped", [109]], [[119873, 119873], "mapped", [110]], [[119874, 119874], "mapped", [111]], [[119875, 119875], "mapped", [112]], [[119876, 119876], "mapped", [113]], [[119877, 119877], "mapped", [114]], [[119878, 119878], "mapped", [115]], [[119879, 119879], "mapped", [116]], [[119880, 119880], "mapped", [117]], [[119881, 119881], "mapped", [118]], [[119882, 119882], "mapped", [119]], [[119883, 119883], "mapped", [120]], [[119884, 119884], "mapped", [121]], [[119885, 119885], "mapped", [122]], [[119886, 119886], "mapped", [97]], [[119887, 119887], "mapped", [98]], [[119888, 119888], "mapped", [99]], [[119889, 119889], "mapped", [100]], [[119890, 119890], "mapped", [101]], [[119891, 119891], "mapped", [102]], [[119892, 119892], "mapped", [103]], [[119893, 119893], "disallowed"], [[119894, 119894], "mapped", [105]], [[119895, 119895], "mapped", [106]], [[119896, 119896], "mapped", [107]], [[119897, 119897], "mapped", [108]], [[119898, 119898], "mapped", [109]], [[119899, 119899], "mapped", [110]], [[119900, 119900], "mapped", [111]], [[119901, 119901], "mapped", [112]], [[119902, 119902], "mapped", [113]], [[119903, 119903], "mapped", [114]], [[119904, 119904], "mapped", [115]], [[119905, 119905], "mapped", [116]], [[119906, 119906], "mapped", [117]], [[119907, 119907], "mapped", [118]], [[119908, 119908], "mapped", [119]], [[119909, 119909], "mapped", [120]], [[119910, 119910], "mapped", [121]], [[119911, 119911], "mapped", [122]], [[119912, 119912], "mapped", [97]], [[119913, 119913], "mapped", [98]], [[119914, 119914], "mapped", [99]], [[119915, 119915], "mapped", [100]], [[119916, 119916], "mapped", [101]], [[119917, 119917], "mapped", [102]], [[119918, 119918], "mapped", [103]], [[119919, 119919], "mapped", [104]], [[119920, 119920], "mapped", [105]], [[119921, 119921], "mapped", [106]], [[119922, 119922], "mapped", [107]], [[119923, 119923], "mapped", [108]], [[119924, 119924], "mapped", [109]], [[119925, 119925], "mapped", [110]], [[119926, 119926], "mapped", [111]], [[119927, 119927], "mapped", [112]], [[119928, 119928], "mapped", [113]], [[119929, 119929], "mapped", [114]], [[119930, 119930], "mapped", [115]], [[119931, 119931], "mapped", [116]], [[119932, 119932], "mapped", [117]], [[119933, 119933], "mapped", [118]], [[119934, 119934], "mapped", [119]], [[119935, 119935], "mapped", [120]], [[119936, 119936], "mapped", [121]], [[119937, 119937], "mapped", [122]], [[119938, 119938], "mapped", [97]], [[119939, 119939], "mapped", [98]], [[119940, 119940], "mapped", [99]], [[119941, 119941], "mapped", [100]], [[119942, 119942], "mapped", [101]], [[119943, 119943], "mapped", [102]], [[119944, 119944], "mapped", [103]], [[119945, 119945], "mapped", [104]], [[119946, 119946], "mapped", [105]], [[119947, 119947], "mapped", [106]], [[119948, 119948], "mapped", [107]], [[119949, 119949], "mapped", [108]], [[119950, 119950], "mapped", [109]], [[119951, 119951], "mapped", [110]], [[119952, 119952], "mapped", [111]], [[119953, 119953], "mapped", [112]], [[119954, 119954], "mapped", [113]], [[119955, 119955], "mapped", [114]], [[119956, 119956], "mapped", [115]], [[119957, 119957], "mapped", [116]], [[119958, 119958], "mapped", [117]], [[119959, 119959], "mapped", [118]], [[119960, 119960], "mapped", [119]], [[119961, 119961], "mapped", [120]], [[119962, 119962], "mapped", [121]], [[119963, 119963], "mapped", [122]], [[119964, 119964], "mapped", [97]], [[119965, 119965], "disallowed"], [[119966, 119966], "mapped", [99]], [[119967, 119967], "mapped", [100]], [[119968, 119969], "disallowed"], [[119970, 119970], "mapped", [103]], [[119971, 119972], "disallowed"], [[119973, 119973], "mapped", [106]], [[119974, 119974], "mapped", [107]], [[119975, 119976], "disallowed"], [[119977, 119977], "mapped", [110]], [[119978, 119978], "mapped", [111]], [[119979, 119979], "mapped", [112]], [[119980, 119980], "mapped", [113]], [[119981, 119981], "disallowed"], [[119982, 119982], "mapped", [115]], [[119983, 119983], "mapped", [116]], [[119984, 119984], "mapped", [117]], [[119985, 119985], "mapped", [118]], [[119986, 119986], "mapped", [119]], [[119987, 119987], "mapped", [120]], [[119988, 119988], "mapped", [121]], [[119989, 119989], "mapped", [122]], [[119990, 119990], "mapped", [97]], [[119991, 119991], "mapped", [98]], [[119992, 119992], "mapped", [99]], [[119993, 119993], "mapped", [100]], [[119994, 119994], "disallowed"], [[119995, 119995], "mapped", [102]], [[119996, 119996], "disallowed"], [[119997, 119997], "mapped", [104]], [[119998, 119998], "mapped", [105]], [[119999, 119999], "mapped", [106]], [[120000, 120000], "mapped", [107]], [[120001, 120001], "mapped", [108]], [[120002, 120002], "mapped", [109]], [[120003, 120003], "mapped", [110]], [[120004, 120004], "disallowed"], [[120005, 120005], "mapped", [112]], [[120006, 120006], "mapped", [113]], [[120007, 120007], "mapped", [114]], [[120008, 120008], "mapped", [115]], [[120009, 120009], "mapped", [116]], [[120010, 120010], "mapped", [117]], [[120011, 120011], "mapped", [118]], [[120012, 120012], "mapped", [119]], [[120013, 120013], "mapped", [120]], [[120014, 120014], "mapped", [121]], [[120015, 120015], "mapped", [122]], [[120016, 120016], "mapped", [97]], [[120017, 120017], "mapped", [98]], [[120018, 120018], "mapped", [99]], [[120019, 120019], "mapped", [100]], [[120020, 120020], "mapped", [101]], [[120021, 120021], "mapped", [102]], [[120022, 120022], "mapped", [103]], [[120023, 120023], "mapped", [104]], [[120024, 120024], "mapped", [105]], [[120025, 120025], "mapped", [106]], [[120026, 120026], "mapped", [107]], [[120027, 120027], "mapped", [108]], [[120028, 120028], "mapped", [109]], [[120029, 120029], "mapped", [110]], [[120030, 120030], "mapped", [111]], [[120031, 120031], "mapped", [112]], [[120032, 120032], "mapped", [113]], [[120033, 120033], "mapped", [114]], [[120034, 120034], "mapped", [115]], [[120035, 120035], "mapped", [116]], [[120036, 120036], "mapped", [117]], [[120037, 120037], "mapped", [118]], [[120038, 120038], "mapped", [119]], [[120039, 120039], "mapped", [120]], [[120040, 120040], "mapped", [121]], [[120041, 120041], "mapped", [122]], [[120042, 120042], "mapped", [97]], [[120043, 120043], "mapped", [98]], [[120044, 120044], "mapped", [99]], [[120045, 120045], "mapped", [100]], [[120046, 120046], "mapped", [101]], [[120047, 120047], "mapped", [102]], [[120048, 120048], "mapped", [103]], [[120049, 120049], "mapped", [104]], [[120050, 120050], "mapped", [105]], [[120051, 120051], "mapped", [106]], [[120052, 120052], "mapped", [107]], [[120053, 120053], "mapped", [108]], [[120054, 120054], "mapped", [109]], [[120055, 120055], "mapped", [110]], [[120056, 120056], "mapped", [111]], [[120057, 120057], "mapped", [112]], [[120058, 120058], "mapped", [113]], [[120059, 120059], "mapped", [114]], [[120060, 120060], "mapped", [115]], [[120061, 120061], "mapped", [116]], [[120062, 120062], "mapped", [117]], [[120063, 120063], "mapped", [118]], [[120064, 120064], "mapped", [119]], [[120065, 120065], "mapped", [120]], [[120066, 120066], "mapped", [121]], [[120067, 120067], "mapped", [122]], [[120068, 120068], "mapped", [97]], [[120069, 120069], "mapped", [98]], [[120070, 120070], "disallowed"], [[120071, 120071], "mapped", [100]], [[120072, 120072], "mapped", [101]], [[120073, 120073], "mapped", [102]], [[120074, 120074], "mapped", [103]], [[120075, 120076], "disallowed"], [[120077, 120077], "mapped", [106]], [[120078, 120078], "mapped", [107]], [[120079, 120079], "mapped", [108]], [[120080, 120080], "mapped", [109]], [[120081, 120081], "mapped", [110]], [[120082, 120082], "mapped", [111]], [[120083, 120083], "mapped", [112]], [[120084, 120084], "mapped", [113]], [[120085, 120085], "disallowed"], [[120086, 120086], "mapped", [115]], [[120087, 120087], "mapped", [116]], [[120088, 120088], "mapped", [117]], [[120089, 120089], "mapped", [118]], [[120090, 120090], "mapped", [119]], [[120091, 120091], "mapped", [120]], [[120092, 120092], "mapped", [121]], [[120093, 120093], "disallowed"], [[120094, 120094], "mapped", [97]], [[120095, 120095], "mapped", [98]], [[120096, 120096], "mapped", [99]], [[120097, 120097], "mapped", [100]], [[120098, 120098], "mapped", [101]], [[120099, 120099], "mapped", [102]], [[120100, 120100], "mapped", [103]], [[120101, 120101], "mapped", [104]], [[120102, 120102], "mapped", [105]], [[120103, 120103], "mapped", [106]], [[120104, 120104], "mapped", [107]], [[120105, 120105], "mapped", [108]], [[120106, 120106], "mapped", [109]], [[120107, 120107], "mapped", [110]], [[120108, 120108], "mapped", [111]], [[120109, 120109], "mapped", [112]], [[120110, 120110], "mapped", [113]], [[120111, 120111], "mapped", [114]], [[120112, 120112], "mapped", [115]], [[120113, 120113], "mapped", [116]], [[120114, 120114], "mapped", [117]], [[120115, 120115], "mapped", [118]], [[120116, 120116], "mapped", [119]], [[120117, 120117], "mapped", [120]], [[120118, 120118], "mapped", [121]], [[120119, 120119], "mapped", [122]], [[120120, 120120], "mapped", [97]], [[120121, 120121], "mapped", [98]], [[120122, 120122], "disallowed"], [[120123, 120123], "mapped", [100]], [[120124, 120124], "mapped", [101]], [[120125, 120125], "mapped", [102]], [[120126, 120126], "mapped", [103]], [[120127, 120127], "disallowed"], [[120128, 120128], "mapped", [105]], [[120129, 120129], "mapped", [106]], [[120130, 120130], "mapped", [107]], [[120131, 120131], "mapped", [108]], [[120132, 120132], "mapped", [109]], [[120133, 120133], "disallowed"], [[120134, 120134], "mapped", [111]], [[120135, 120137], "disallowed"], [[120138, 120138], "mapped", [115]], [[120139, 120139], "mapped", [116]], [[120140, 120140], "mapped", [117]], [[120141, 120141], "mapped", [118]], [[120142, 120142], "mapped", [119]], [[120143, 120143], "mapped", [120]], [[120144, 120144], "mapped", [121]], [[120145, 120145], "disallowed"], [[120146, 120146], "mapped", [97]], [[120147, 120147], "mapped", [98]], [[120148, 120148], "mapped", [99]], [[120149, 120149], "mapped", [100]], [[120150, 120150], "mapped", [101]], [[120151, 120151], "mapped", [102]], [[120152, 120152], "mapped", [103]], [[120153, 120153], "mapped", [104]], [[120154, 120154], "mapped", [105]], [[120155, 120155], "mapped", [106]], [[120156, 120156], "mapped", [107]], [[120157, 120157], "mapped", [108]], [[120158, 120158], "mapped", [109]], [[120159, 120159], "mapped", [110]], [[120160, 120160], "mapped", [111]], [[120161, 120161], "mapped", [112]], [[120162, 120162], "mapped", [113]], [[120163, 120163], "mapped", [114]], [[120164, 120164], "mapped", [115]], [[120165, 120165], "mapped", [116]], [[120166, 120166], "mapped", [117]], [[120167, 120167], "mapped", [118]], [[120168, 120168], "mapped", [119]], [[120169, 120169], "mapped", [120]], [[120170, 120170], "mapped", [121]], [[120171, 120171], "mapped", [122]], [[120172, 120172], "mapped", [97]], [[120173, 120173], "mapped", [98]], [[120174, 120174], "mapped", [99]], [[120175, 120175], "mapped", [100]], [[120176, 120176], "mapped", [101]], [[120177, 120177], "mapped", [102]], [[120178, 120178], "mapped", [103]], [[120179, 120179], "mapped", [104]], [[120180, 120180], "mapped", [105]], [[120181, 120181], "mapped", [106]], [[120182, 120182], "mapped", [107]], [[120183, 120183], "mapped", [108]], [[120184, 120184], "mapped", [109]], [[120185, 120185], "mapped", [110]], [[120186, 120186], "mapped", [111]], [[120187, 120187], "mapped", [112]], [[120188, 120188], "mapped", [113]], [[120189, 120189], "mapped", [114]], [[120190, 120190], "mapped", [115]], [[120191, 120191], "mapped", [116]], [[120192, 120192], "mapped", [117]], [[120193, 120193], "mapped", [118]], [[120194, 120194], "mapped", [119]], [[120195, 120195], "mapped", [120]], [[120196, 120196], "mapped", [121]], [[120197, 120197], "mapped", [122]], [[120198, 120198], "mapped", [97]], [[120199, 120199], "mapped", [98]], [[120200, 120200], "mapped", [99]], [[120201, 120201], "mapped", [100]], [[120202, 120202], "mapped", [101]], [[120203, 120203], "mapped", [102]], [[120204, 120204], "mapped", [103]], [[120205, 120205], "mapped", [104]], [[120206, 120206], "mapped", [105]], [[120207, 120207], "mapped", [106]], [[120208, 120208], "mapped", [107]], [[120209, 120209], "mapped", [108]], [[120210, 120210], "mapped", [109]], [[120211, 120211], "mapped", [110]], [[120212, 120212], "mapped", [111]], [[120213, 120213], "mapped", [112]], [[120214, 120214], "mapped", [113]], [[120215, 120215], "mapped", [114]], [[120216, 120216], "mapped", [115]], [[120217, 120217], "mapped", [116]], [[120218, 120218], "mapped", [117]], [[120219, 120219], "mapped", [118]], [[120220, 120220], "mapped", [119]], [[120221, 120221], "mapped", [120]], [[120222, 120222], "mapped", [121]], [[120223, 120223], "mapped", [122]], [[120224, 120224], "mapped", [97]], [[120225, 120225], "mapped", [98]], [[120226, 120226], "mapped", [99]], [[120227, 120227], "mapped", [100]], [[120228, 120228], "mapped", [101]], [[120229, 120229], "mapped", [102]], [[120230, 120230], "mapped", [103]], [[120231, 120231], "mapped", [104]], [[120232, 120232], "mapped", [105]], [[120233, 120233], "mapped", [106]], [[120234, 120234], "mapped", [107]], [[120235, 120235], "mapped", [108]], [[120236, 120236], "mapped", [109]], [[120237, 120237], "mapped", [110]], [[120238, 120238], "mapped", [111]], [[120239, 120239], "mapped", [112]], [[120240, 120240], "mapped", [113]], [[120241, 120241], "mapped", [114]], [[120242, 120242], "mapped", [115]], [[120243, 120243], "mapped", [116]], [[120244, 120244], "mapped", [117]], [[120245, 120245], "mapped", [118]], [[120246, 120246], "mapped", [119]], [[120247, 120247], "mapped", [120]], [[120248, 120248], "mapped", [121]], [[120249, 120249], "mapped", [122]], [[120250, 120250], "mapped", [97]], [[120251, 120251], "mapped", [98]], [[120252, 120252], "mapped", [99]], [[120253, 120253], "mapped", [100]], [[120254, 120254], "mapped", [101]], [[120255, 120255], "mapped", [102]], [[120256, 120256], "mapped", [103]], [[120257, 120257], "mapped", [104]], [[120258, 120258], "mapped", [105]], [[120259, 120259], "mapped", [106]], [[120260, 120260], "mapped", [107]], [[120261, 120261], "mapped", [108]], [[120262, 120262], "mapped", [109]], [[120263, 120263], "mapped", [110]], [[120264, 120264], "mapped", [111]], [[120265, 120265], "mapped", [112]], [[120266, 120266], "mapped", [113]], [[120267, 120267], "mapped", [114]], [[120268, 120268], "mapped", [115]], [[120269, 120269], "mapped", [116]], [[120270, 120270], "mapped", [117]], [[120271, 120271], "mapped", [118]], [[120272, 120272], "mapped", [119]], [[120273, 120273], "mapped", [120]], [[120274, 120274], "mapped", [121]], [[120275, 120275], "mapped", [122]], [[120276, 120276], "mapped", [97]], [[120277, 120277], "mapped", [98]], [[120278, 120278], "mapped", [99]], [[120279, 120279], "mapped", [100]], [[120280, 120280], "mapped", [101]], [[120281, 120281], "mapped", [102]], [[120282, 120282], "mapped", [103]], [[120283, 120283], "mapped", [104]], [[120284, 120284], "mapped", [105]], [[120285, 120285], "mapped", [106]], [[120286, 120286], "mapped", [107]], [[120287, 120287], "mapped", [108]], [[120288, 120288], "mapped", [109]], [[120289, 120289], "mapped", [110]], [[120290, 120290], "mapped", [111]], [[120291, 120291], "mapped", [112]], [[120292, 120292], "mapped", [113]], [[120293, 120293], "mapped", [114]], [[120294, 120294], "mapped", [115]], [[120295, 120295], "mapped", [116]], [[120296, 120296], "mapped", [117]], [[120297, 120297], "mapped", [118]], [[120298, 120298], "mapped", [119]], [[120299, 120299], "mapped", [120]], [[120300, 120300], "mapped", [121]], [[120301, 120301], "mapped", [122]], [[120302, 120302], "mapped", [97]], [[120303, 120303], "mapped", [98]], [[120304, 120304], "mapped", [99]], [[120305, 120305], "mapped", [100]], [[120306, 120306], "mapped", [101]], [[120307, 120307], "mapped", [102]], [[120308, 120308], "mapped", [103]], [[120309, 120309], "mapped", [104]], [[120310, 120310], "mapped", [105]], [[120311, 120311], "mapped", [106]], [[120312, 120312], "mapped", [107]], [[120313, 120313], "mapped", [108]], [[120314, 120314], "mapped", [109]], [[120315, 120315], "mapped", [110]], [[120316, 120316], "mapped", [111]], [[120317, 120317], "mapped", [112]], [[120318, 120318], "mapped", [113]], [[120319, 120319], "mapped", [114]], [[120320, 120320], "mapped", [115]], [[120321, 120321], "mapped", [116]], [[120322, 120322], "mapped", [117]], [[120323, 120323], "mapped", [118]], [[120324, 120324], "mapped", [119]], [[120325, 120325], "mapped", [120]], [[120326, 120326], "mapped", [121]], [[120327, 120327], "mapped", [122]], [[120328, 120328], "mapped", [97]], [[120329, 120329], "mapped", [98]], [[120330, 120330], "mapped", [99]], [[120331, 120331], "mapped", [100]], [[120332, 120332], "mapped", [101]], [[120333, 120333], "mapped", [102]], [[120334, 120334], "mapped", [103]], [[120335, 120335], "mapped", [104]], [[120336, 120336], "mapped", [105]], [[120337, 120337], "mapped", [106]], [[120338, 120338], "mapped", [107]], [[120339, 120339], "mapped", [108]], [[120340, 120340], "mapped", [109]], [[120341, 120341], "mapped", [110]], [[120342, 120342], "mapped", [111]], [[120343, 120343], "mapped", [112]], [[120344, 120344], "mapped", [113]], [[120345, 120345], "mapped", [114]], [[120346, 120346], "mapped", [115]], [[120347, 120347], "mapped", [116]], [[120348, 120348], "mapped", [117]], [[120349, 120349], "mapped", [118]], [[120350, 120350], "mapped", [119]], [[120351, 120351], "mapped", [120]], [[120352, 120352], "mapped", [121]], [[120353, 120353], "mapped", [122]], [[120354, 120354], "mapped", [97]], [[120355, 120355], "mapped", [98]], [[120356, 120356], "mapped", [99]], [[120357, 120357], "mapped", [100]], [[120358, 120358], "mapped", [101]], [[120359, 120359], "mapped", [102]], [[120360, 120360], "mapped", [103]], [[120361, 120361], "mapped", [104]], [[120362, 120362], "mapped", [105]], [[120363, 120363], "mapped", [106]], [[120364, 120364], "mapped", [107]], [[120365, 120365], "mapped", [108]], [[120366, 120366], "mapped", [109]], [[120367, 120367], "mapped", [110]], [[120368, 120368], "mapped", [111]], [[120369, 120369], "mapped", [112]], [[120370, 120370], "mapped", [113]], [[120371, 120371], "mapped", [114]], [[120372, 120372], "mapped", [115]], [[120373, 120373], "mapped", [116]], [[120374, 120374], "mapped", [117]], [[120375, 120375], "mapped", [118]], [[120376, 120376], "mapped", [119]], [[120377, 120377], "mapped", [120]], [[120378, 120378], "mapped", [121]], [[120379, 120379], "mapped", [122]], [[120380, 120380], "mapped", [97]], [[120381, 120381], "mapped", [98]], [[120382, 120382], "mapped", [99]], [[120383, 120383], "mapped", [100]], [[120384, 120384], "mapped", [101]], [[120385, 120385], "mapped", [102]], [[120386, 120386], "mapped", [103]], [[120387, 120387], "mapped", [104]], [[120388, 120388], "mapped", [105]], [[120389, 120389], "mapped", [106]], [[120390, 120390], "mapped", [107]], [[120391, 120391], "mapped", [108]], [[120392, 120392], "mapped", [109]], [[120393, 120393], "mapped", [110]], [[120394, 120394], "mapped", [111]], [[120395, 120395], "mapped", [112]], [[120396, 120396], "mapped", [113]], [[120397, 120397], "mapped", [114]], [[120398, 120398], "mapped", [115]], [[120399, 120399], "mapped", [116]], [[120400, 120400], "mapped", [117]], [[120401, 120401], "mapped", [118]], [[120402, 120402], "mapped", [119]], [[120403, 120403], "mapped", [120]], [[120404, 120404], "mapped", [121]], [[120405, 120405], "mapped", [122]], [[120406, 120406], "mapped", [97]], [[120407, 120407], "mapped", [98]], [[120408, 120408], "mapped", [99]], [[120409, 120409], "mapped", [100]], [[120410, 120410], "mapped", [101]], [[120411, 120411], "mapped", [102]], [[120412, 120412], "mapped", [103]], [[120413, 120413], "mapped", [104]], [[120414, 120414], "mapped", [105]], [[120415, 120415], "mapped", [106]], [[120416, 120416], "mapped", [107]], [[120417, 120417], "mapped", [108]], [[120418, 120418], "mapped", [109]], [[120419, 120419], "mapped", [110]], [[120420, 120420], "mapped", [111]], [[120421, 120421], "mapped", [112]], [[120422, 120422], "mapped", [113]], [[120423, 120423], "mapped", [114]], [[120424, 120424], "mapped", [115]], [[120425, 120425], "mapped", [116]], [[120426, 120426], "mapped", [117]], [[120427, 120427], "mapped", [118]], [[120428, 120428], "mapped", [119]], [[120429, 120429], "mapped", [120]], [[120430, 120430], "mapped", [121]], [[120431, 120431], "mapped", [122]], [[120432, 120432], "mapped", [97]], [[120433, 120433], "mapped", [98]], [[120434, 120434], "mapped", [99]], [[120435, 120435], "mapped", [100]], [[120436, 120436], "mapped", [101]], [[120437, 120437], "mapped", [102]], [[120438, 120438], "mapped", [103]], [[120439, 120439], "mapped", [104]], [[120440, 120440], "mapped", [105]], [[120441, 120441], "mapped", [106]], [[120442, 120442], "mapped", [107]], [[120443, 120443], "mapped", [108]], [[120444, 120444], "mapped", [109]], [[120445, 120445], "mapped", [110]], [[120446, 120446], "mapped", [111]], [[120447, 120447], "mapped", [112]], [[120448, 120448], "mapped", [113]], [[120449, 120449], "mapped", [114]], [[120450, 120450], "mapped", [115]], [[120451, 120451], "mapped", [116]], [[120452, 120452], "mapped", [117]], [[120453, 120453], "mapped", [118]], [[120454, 120454], "mapped", [119]], [[120455, 120455], "mapped", [120]], [[120456, 120456], "mapped", [121]], [[120457, 120457], "mapped", [122]], [[120458, 120458], "mapped", [97]], [[120459, 120459], "mapped", [98]], [[120460, 120460], "mapped", [99]], [[120461, 120461], "mapped", [100]], [[120462, 120462], "mapped", [101]], [[120463, 120463], "mapped", [102]], [[120464, 120464], "mapped", [103]], [[120465, 120465], "mapped", [104]], [[120466, 120466], "mapped", [105]], [[120467, 120467], "mapped", [106]], [[120468, 120468], "mapped", [107]], [[120469, 120469], "mapped", [108]], [[120470, 120470], "mapped", [109]], [[120471, 120471], "mapped", [110]], [[120472, 120472], "mapped", [111]], [[120473, 120473], "mapped", [112]], [[120474, 120474], "mapped", [113]], [[120475, 120475], "mapped", [114]], [[120476, 120476], "mapped", [115]], [[120477, 120477], "mapped", [116]], [[120478, 120478], "mapped", [117]], [[120479, 120479], "mapped", [118]], [[120480, 120480], "mapped", [119]], [[120481, 120481], "mapped", [120]], [[120482, 120482], "mapped", [121]], [[120483, 120483], "mapped", [122]], [[120484, 120484], "mapped", [305]], [[120485, 120485], "mapped", [567]], [[120486, 120487], "disallowed"], [[120488, 120488], "mapped", [945]], [[120489, 120489], "mapped", [946]], [[120490, 120490], "mapped", [947]], [[120491, 120491], "mapped", [948]], [[120492, 120492], "mapped", [949]], [[120493, 120493], "mapped", [950]], [[120494, 120494], "mapped", [951]], [[120495, 120495], "mapped", [952]], [[120496, 120496], "mapped", [953]], [[120497, 120497], "mapped", [954]], [[120498, 120498], "mapped", [955]], [[120499, 120499], "mapped", [956]], [[120500, 120500], "mapped", [957]], [[120501, 120501], "mapped", [958]], [[120502, 120502], "mapped", [959]], [[120503, 120503], "mapped", [960]], [[120504, 120504], "mapped", [961]], [[120505, 120505], "mapped", [952]], [[120506, 120506], "mapped", [963]], [[120507, 120507], "mapped", [964]], [[120508, 120508], "mapped", [965]], [[120509, 120509], "mapped", [966]], [[120510, 120510], "mapped", [967]], [[120511, 120511], "mapped", [968]], [[120512, 120512], "mapped", [969]], [[120513, 120513], "mapped", [8711]], [[120514, 120514], "mapped", [945]], [[120515, 120515], "mapped", [946]], [[120516, 120516], "mapped", [947]], [[120517, 120517], "mapped", [948]], [[120518, 120518], "mapped", [949]], [[120519, 120519], "mapped", [950]], [[120520, 120520], "mapped", [951]], [[120521, 120521], "mapped", [952]], [[120522, 120522], "mapped", [953]], [[120523, 120523], "mapped", [954]], [[120524, 120524], "mapped", [955]], [[120525, 120525], "mapped", [956]], [[120526, 120526], "mapped", [957]], [[120527, 120527], "mapped", [958]], [[120528, 120528], "mapped", [959]], [[120529, 120529], "mapped", [960]], [[120530, 120530], "mapped", [961]], [[120531, 120532], "mapped", [963]], [[120533, 120533], "mapped", [964]], [[120534, 120534], "mapped", [965]], [[120535, 120535], "mapped", [966]], [[120536, 120536], "mapped", [967]], [[120537, 120537], "mapped", [968]], [[120538, 120538], "mapped", [969]], [[120539, 120539], "mapped", [8706]], [[120540, 120540], "mapped", [949]], [[120541, 120541], "mapped", [952]], [[120542, 120542], "mapped", [954]], [[120543, 120543], "mapped", [966]], [[120544, 120544], "mapped", [961]], [[120545, 120545], "mapped", [960]], [[120546, 120546], "mapped", [945]], [[120547, 120547], "mapped", [946]], [[120548, 120548], "mapped", [947]], [[120549, 120549], "mapped", [948]], [[120550, 120550], "mapped", [949]], [[120551, 120551], "mapped", [950]], [[120552, 120552], "mapped", [951]], [[120553, 120553], "mapped", [952]], [[120554, 120554], "mapped", [953]], [[120555, 120555], "mapped", [954]], [[120556, 120556], "mapped", [955]], [[120557, 120557], "mapped", [956]], [[120558, 120558], "mapped", [957]], [[120559, 120559], "mapped", [958]], [[120560, 120560], "mapped", [959]], [[120561, 120561], "mapped", [960]], [[120562, 120562], "mapped", [961]], [[120563, 120563], "mapped", [952]], [[120564, 120564], "mapped", [963]], [[120565, 120565], "mapped", [964]], [[120566, 120566], "mapped", [965]], [[120567, 120567], "mapped", [966]], [[120568, 120568], "mapped", [967]], [[120569, 120569], "mapped", [968]], [[120570, 120570], "mapped", [969]], [[120571, 120571], "mapped", [8711]], [[120572, 120572], "mapped", [945]], [[120573, 120573], "mapped", [946]], [[120574, 120574], "mapped", [947]], [[120575, 120575], "mapped", [948]], [[120576, 120576], "mapped", [949]], [[120577, 120577], "mapped", [950]], [[120578, 120578], "mapped", [951]], [[120579, 120579], "mapped", [952]], [[120580, 120580], "mapped", [953]], [[120581, 120581], "mapped", [954]], [[120582, 120582], "mapped", [955]], [[120583, 120583], "mapped", [956]], [[120584, 120584], "mapped", [957]], [[120585, 120585], "mapped", [958]], [[120586, 120586], "mapped", [959]], [[120587, 120587], "mapped", [960]], [[120588, 120588], "mapped", [961]], [[120589, 120590], "mapped", [963]], [[120591, 120591], "mapped", [964]], [[120592, 120592], "mapped", [965]], [[120593, 120593], "mapped", [966]], [[120594, 120594], "mapped", [967]], [[120595, 120595], "mapped", [968]], [[120596, 120596], "mapped", [969]], [[120597, 120597], "mapped", [8706]], [[120598, 120598], "mapped", [949]], [[120599, 120599], "mapped", [952]], [[120600, 120600], "mapped", [954]], [[120601, 120601], "mapped", [966]], [[120602, 120602], "mapped", [961]], [[120603, 120603], "mapped", [960]], [[120604, 120604], "mapped", [945]], [[120605, 120605], "mapped", [946]], [[120606, 120606], "mapped", [947]], [[120607, 120607], "mapped", [948]], [[120608, 120608], "mapped", [949]], [[120609, 120609], "mapped", [950]], [[120610, 120610], "mapped", [951]], [[120611, 120611], "mapped", [952]], [[120612, 120612], "mapped", [953]], [[120613, 120613], "mapped", [954]], [[120614, 120614], "mapped", [955]], [[120615, 120615], "mapped", [956]], [[120616, 120616], "mapped", [957]], [[120617, 120617], "mapped", [958]], [[120618, 120618], "mapped", [959]], [[120619, 120619], "mapped", [960]], [[120620, 120620], "mapped", [961]], [[120621, 120621], "mapped", [952]], [[120622, 120622], "mapped", [963]], [[120623, 120623], "mapped", [964]], [[120624, 120624], "mapped", [965]], [[120625, 120625], "mapped", [966]], [[120626, 120626], "mapped", [967]], [[120627, 120627], "mapped", [968]], [[120628, 120628], "mapped", [969]], [[120629, 120629], "mapped", [8711]], [[120630, 120630], "mapped", [945]], [[120631, 120631], "mapped", [946]], [[120632, 120632], "mapped", [947]], [[120633, 120633], "mapped", [948]], [[120634, 120634], "mapped", [949]], [[120635, 120635], "mapped", [950]], [[120636, 120636], "mapped", [951]], [[120637, 120637], "mapped", [952]], [[120638, 120638], "mapped", [953]], [[120639, 120639], "mapped", [954]], [[120640, 120640], "mapped", [955]], [[120641, 120641], "mapped", [956]], [[120642, 120642], "mapped", [957]], [[120643, 120643], "mapped", [958]], [[120644, 120644], "mapped", [959]], [[120645, 120645], "mapped", [960]], [[120646, 120646], "mapped", [961]], [[120647, 120648], "mapped", [963]], [[120649, 120649], "mapped", [964]], [[120650, 120650], "mapped", [965]], [[120651, 120651], "mapped", [966]], [[120652, 120652], "mapped", [967]], [[120653, 120653], "mapped", [968]], [[120654, 120654], "mapped", [969]], [[120655, 120655], "mapped", [8706]], [[120656, 120656], "mapped", [949]], [[120657, 120657], "mapped", [952]], [[120658, 120658], "mapped", [954]], [[120659, 120659], "mapped", [966]], [[120660, 120660], "mapped", [961]], [[120661, 120661], "mapped", [960]], [[120662, 120662], "mapped", [945]], [[120663, 120663], "mapped", [946]], [[120664, 120664], "mapped", [947]], [[120665, 120665], "mapped", [948]], [[120666, 120666], "mapped", [949]], [[120667, 120667], "mapped", [950]], [[120668, 120668], "mapped", [951]], [[120669, 120669], "mapped", [952]], [[120670, 120670], "mapped", [953]], [[120671, 120671], "mapped", [954]], [[120672, 120672], "mapped", [955]], [[120673, 120673], "mapped", [956]], [[120674, 120674], "mapped", [957]], [[120675, 120675], "mapped", [958]], [[120676, 120676], "mapped", [959]], [[120677, 120677], "mapped", [960]], [[120678, 120678], "mapped", [961]], [[120679, 120679], "mapped", [952]], [[120680, 120680], "mapped", [963]], [[120681, 120681], "mapped", [964]], [[120682, 120682], "mapped", [965]], [[120683, 120683], "mapped", [966]], [[120684, 120684], "mapped", [967]], [[120685, 120685], "mapped", [968]], [[120686, 120686], "mapped", [969]], [[120687, 120687], "mapped", [8711]], [[120688, 120688], "mapped", [945]], [[120689, 120689], "mapped", [946]], [[120690, 120690], "mapped", [947]], [[120691, 120691], "mapped", [948]], [[120692, 120692], "mapped", [949]], [[120693, 120693], "mapped", [950]], [[120694, 120694], "mapped", [951]], [[120695, 120695], "mapped", [952]], [[120696, 120696], "mapped", [953]], [[120697, 120697], "mapped", [954]], [[120698, 120698], "mapped", [955]], [[120699, 120699], "mapped", [956]], [[120700, 120700], "mapped", [957]], [[120701, 120701], "mapped", [958]], [[120702, 120702], "mapped", [959]], [[120703, 120703], "mapped", [960]], [[120704, 120704], "mapped", [961]], [[120705, 120706], "mapped", [963]], [[120707, 120707], "mapped", [964]], [[120708, 120708], "mapped", [965]], [[120709, 120709], "mapped", [966]], [[120710, 120710], "mapped", [967]], [[120711, 120711], "mapped", [968]], [[120712, 120712], "mapped", [969]], [[120713, 120713], "mapped", [8706]], [[120714, 120714], "mapped", [949]], [[120715, 120715], "mapped", [952]], [[120716, 120716], "mapped", [954]], [[120717, 120717], "mapped", [966]], [[120718, 120718], "mapped", [961]], [[120719, 120719], "mapped", [960]], [[120720, 120720], "mapped", [945]], [[120721, 120721], "mapped", [946]], [[120722, 120722], "mapped", [947]], [[120723, 120723], "mapped", [948]], [[120724, 120724], "mapped", [949]], [[120725, 120725], "mapped", [950]], [[120726, 120726], "mapped", [951]], [[120727, 120727], "mapped", [952]], [[120728, 120728], "mapped", [953]], [[120729, 120729], "mapped", [954]], [[120730, 120730], "mapped", [955]], [[120731, 120731], "mapped", [956]], [[120732, 120732], "mapped", [957]], [[120733, 120733], "mapped", [958]], [[120734, 120734], "mapped", [959]], [[120735, 120735], "mapped", [960]], [[120736, 120736], "mapped", [961]], [[120737, 120737], "mapped", [952]], [[120738, 120738], "mapped", [963]], [[120739, 120739], "mapped", [964]], [[120740, 120740], "mapped", [965]], [[120741, 120741], "mapped", [966]], [[120742, 120742], "mapped", [967]], [[120743, 120743], "mapped", [968]], [[120744, 120744], "mapped", [969]], [[120745, 120745], "mapped", [8711]], [[120746, 120746], "mapped", [945]], [[120747, 120747], "mapped", [946]], [[120748, 120748], "mapped", [947]], [[120749, 120749], "mapped", [948]], [[120750, 120750], "mapped", [949]], [[120751, 120751], "mapped", [950]], [[120752, 120752], "mapped", [951]], [[120753, 120753], "mapped", [952]], [[120754, 120754], "mapped", [953]], [[120755, 120755], "mapped", [954]], [[120756, 120756], "mapped", [955]], [[120757, 120757], "mapped", [956]], [[120758, 120758], "mapped", [957]], [[120759, 120759], "mapped", [958]], [[120760, 120760], "mapped", [959]], [[120761, 120761], "mapped", [960]], [[120762, 120762], "mapped", [961]], [[120763, 120764], "mapped", [963]], [[120765, 120765], "mapped", [964]], [[120766, 120766], "mapped", [965]], [[120767, 120767], "mapped", [966]], [[120768, 120768], "mapped", [967]], [[120769, 120769], "mapped", [968]], [[120770, 120770], "mapped", [969]], [[120771, 120771], "mapped", [8706]], [[120772, 120772], "mapped", [949]], [[120773, 120773], "mapped", [952]], [[120774, 120774], "mapped", [954]], [[120775, 120775], "mapped", [966]], [[120776, 120776], "mapped", [961]], [[120777, 120777], "mapped", [960]], [[120778, 120779], "mapped", [989]], [[120780, 120781], "disallowed"], [[120782, 120782], "mapped", [48]], [[120783, 120783], "mapped", [49]], [[120784, 120784], "mapped", [50]], [[120785, 120785], "mapped", [51]], [[120786, 120786], "mapped", [52]], [[120787, 120787], "mapped", [53]], [[120788, 120788], "mapped", [54]], [[120789, 120789], "mapped", [55]], [[120790, 120790], "mapped", [56]], [[120791, 120791], "mapped", [57]], [[120792, 120792], "mapped", [48]], [[120793, 120793], "mapped", [49]], [[120794, 120794], "mapped", [50]], [[120795, 120795], "mapped", [51]], [[120796, 120796], "mapped", [52]], [[120797, 120797], "mapped", [53]], [[120798, 120798], "mapped", [54]], [[120799, 120799], "mapped", [55]], [[120800, 120800], "mapped", [56]], [[120801, 120801], "mapped", [57]], [[120802, 120802], "mapped", [48]], [[120803, 120803], "mapped", [49]], [[120804, 120804], "mapped", [50]], [[120805, 120805], "mapped", [51]], [[120806, 120806], "mapped", [52]], [[120807, 120807], "mapped", [53]], [[120808, 120808], "mapped", [54]], [[120809, 120809], "mapped", [55]], [[120810, 120810], "mapped", [56]], [[120811, 120811], "mapped", [57]], [[120812, 120812], "mapped", [48]], [[120813, 120813], "mapped", [49]], [[120814, 120814], "mapped", [50]], [[120815, 120815], "mapped", [51]], [[120816, 120816], "mapped", [52]], [[120817, 120817], "mapped", [53]], [[120818, 120818], "mapped", [54]], [[120819, 120819], "mapped", [55]], [[120820, 120820], "mapped", [56]], [[120821, 120821], "mapped", [57]], [[120822, 120822], "mapped", [48]], [[120823, 120823], "mapped", [49]], [[120824, 120824], "mapped", [50]], [[120825, 120825], "mapped", [51]], [[120826, 120826], "mapped", [52]], [[120827, 120827], "mapped", [53]], [[120828, 120828], "mapped", [54]], [[120829, 120829], "mapped", [55]], [[120830, 120830], "mapped", [56]], [[120831, 120831], "mapped", [57]], [[120832, 121343], "valid", [], "NV8"], [[121344, 121398], "valid"], [[121399, 121402], "valid", [], "NV8"], [[121403, 121452], "valid"], [[121453, 121460], "valid", [], "NV8"], [[121461, 121461], "valid"], [[121462, 121475], "valid", [], "NV8"], [[121476, 121476], "valid"], [[121477, 121483], "valid", [], "NV8"], [[121484, 121498], "disallowed"], [[121499, 121503], "valid"], [[121504, 121504], "disallowed"], [[121505, 121519], "valid"], [[121520, 124927], "disallowed"], [[124928, 125124], "valid"], [[125125, 125126], "disallowed"], [[125127, 125135], "valid", [], "NV8"], [[125136, 125142], "valid"], [[125143, 126463], "disallowed"], [[126464, 126464], "mapped", [1575]], [[126465, 126465], "mapped", [1576]], [[126466, 126466], "mapped", [1580]], [[126467, 126467], "mapped", [1583]], [[126468, 126468], "disallowed"], [[126469, 126469], "mapped", [1608]], [[126470, 126470], "mapped", [1586]], [[126471, 126471], "mapped", [1581]], [[126472, 126472], "mapped", [1591]], [[126473, 126473], "mapped", [1610]], [[126474, 126474], "mapped", [1603]], [[126475, 126475], "mapped", [1604]], [[126476, 126476], "mapped", [1605]], [[126477, 126477], "mapped", [1606]], [[126478, 126478], "mapped", [1587]], [[126479, 126479], "mapped", [1593]], [[126480, 126480], "mapped", [1601]], [[126481, 126481], "mapped", [1589]], [[126482, 126482], "mapped", [1602]], [[126483, 126483], "mapped", [1585]], [[126484, 126484], "mapped", [1588]], [[126485, 126485], "mapped", [1578]], [[126486, 126486], "mapped", [1579]], [[126487, 126487], "mapped", [1582]], [[126488, 126488], "mapped", [1584]], [[126489, 126489], "mapped", [1590]], [[126490, 126490], "mapped", [1592]], [[126491, 126491], "mapped", [1594]], [[126492, 126492], "mapped", [1646]], [[126493, 126493], "mapped", [1722]], [[126494, 126494], "mapped", [1697]], [[126495, 126495], "mapped", [1647]], [[126496, 126496], "disallowed"], [[126497, 126497], "mapped", [1576]], [[126498, 126498], "mapped", [1580]], [[126499, 126499], "disallowed"], [[126500, 126500], "mapped", [1607]], [[126501, 126502], "disallowed"], [[126503, 126503], "mapped", [1581]], [[126504, 126504], "disallowed"], [[126505, 126505], "mapped", [1610]], [[126506, 126506], "mapped", [1603]], [[126507, 126507], "mapped", [1604]], [[126508, 126508], "mapped", [1605]], [[126509, 126509], "mapped", [1606]], [[126510, 126510], "mapped", [1587]], [[126511, 126511], "mapped", [1593]], [[126512, 126512], "mapped", [1601]], [[126513, 126513], "mapped", [1589]], [[126514, 126514], "mapped", [1602]], [[126515, 126515], "disallowed"], [[126516, 126516], "mapped", [1588]], [[126517, 126517], "mapped", [1578]], [[126518, 126518], "mapped", [1579]], [[126519, 126519], "mapped", [1582]], [[126520, 126520], "disallowed"], [[126521, 126521], "mapped", [1590]], [[126522, 126522], "disallowed"], [[126523, 126523], "mapped", [1594]], [[126524, 126529], "disallowed"], [[126530, 126530], "mapped", [1580]], [[126531, 126534], "disallowed"], [[126535, 126535], "mapped", [1581]], [[126536, 126536], "disallowed"], [[126537, 126537], "mapped", [1610]], [[126538, 126538], "disallowed"], [[126539, 126539], "mapped", [1604]], [[126540, 126540], "disallowed"], [[126541, 126541], "mapped", [1606]], [[126542, 126542], "mapped", [1587]], [[126543, 126543], "mapped", [1593]], [[126544, 126544], "disallowed"], [[126545, 126545], "mapped", [1589]], [[126546, 126546], "mapped", [1602]], [[126547, 126547], "disallowed"], [[126548, 126548], "mapped", [1588]], [[126549, 126550], "disallowed"], [[126551, 126551], "mapped", [1582]], [[126552, 126552], "disallowed"], [[126553, 126553], "mapped", [1590]], [[126554, 126554], "disallowed"], [[126555, 126555], "mapped", [1594]], [[126556, 126556], "disallowed"], [[126557, 126557], "mapped", [1722]], [[126558, 126558], "disallowed"], [[126559, 126559], "mapped", [1647]], [[126560, 126560], "disallowed"], [[126561, 126561], "mapped", [1576]], [[126562, 126562], "mapped", [1580]], [[126563, 126563], "disallowed"], [[126564, 126564], "mapped", [1607]], [[126565, 126566], "disallowed"], [[126567, 126567], "mapped", [1581]], [[126568, 126568], "mapped", [1591]], [[126569, 126569], "mapped", [1610]], [[126570, 126570], "mapped", [1603]], [[126571, 126571], "disallowed"], [[126572, 126572], "mapped", [1605]], [[126573, 126573], "mapped", [1606]], [[126574, 126574], "mapped", [1587]], [[126575, 126575], "mapped", [1593]], [[126576, 126576], "mapped", [1601]], [[126577, 126577], "mapped", [1589]], [[126578, 126578], "mapped", [1602]], [[126579, 126579], "disallowed"], [[126580, 126580], "mapped", [1588]], [[126581, 126581], "mapped", [1578]], [[126582, 126582], "mapped", [1579]], [[126583, 126583], "mapped", [1582]], [[126584, 126584], "disallowed"], [[126585, 126585], "mapped", [1590]], [[126586, 126586], "mapped", [1592]], [[126587, 126587], "mapped", [1594]], [[126588, 126588], "mapped", [1646]], [[126589, 126589], "disallowed"], [[126590, 126590], "mapped", [1697]], [[126591, 126591], "disallowed"], [[126592, 126592], "mapped", [1575]], [[126593, 126593], "mapped", [1576]], [[126594, 126594], "mapped", [1580]], [[126595, 126595], "mapped", [1583]], [[126596, 126596], "mapped", [1607]], [[126597, 126597], "mapped", [1608]], [[126598, 126598], "mapped", [1586]], [[126599, 126599], "mapped", [1581]], [[126600, 126600], "mapped", [1591]], [[126601, 126601], "mapped", [1610]], [[126602, 126602], "disallowed"], [[126603, 126603], "mapped", [1604]], [[126604, 126604], "mapped", [1605]], [[126605, 126605], "mapped", [1606]], [[126606, 126606], "mapped", [1587]], [[126607, 126607], "mapped", [1593]], [[126608, 126608], "mapped", [1601]], [[126609, 126609], "mapped", [1589]], [[126610, 126610], "mapped", [1602]], [[126611, 126611], "mapped", [1585]], [[126612, 126612], "mapped", [1588]], [[126613, 126613], "mapped", [1578]], [[126614, 126614], "mapped", [1579]], [[126615, 126615], "mapped", [1582]], [[126616, 126616], "mapped", [1584]], [[126617, 126617], "mapped", [1590]], [[126618, 126618], "mapped", [1592]], [[126619, 126619], "mapped", [1594]], [[126620, 126624], "disallowed"], [[126625, 126625], "mapped", [1576]], [[126626, 126626], "mapped", [1580]], [[126627, 126627], "mapped", [1583]], [[126628, 126628], "disallowed"], [[126629, 126629], "mapped", [1608]], [[126630, 126630], "mapped", [1586]], [[126631, 126631], "mapped", [1581]], [[126632, 126632], "mapped", [1591]], [[126633, 126633], "mapped", [1610]], [[126634, 126634], "disallowed"], [[126635, 126635], "mapped", [1604]], [[126636, 126636], "mapped", [1605]], [[126637, 126637], "mapped", [1606]], [[126638, 126638], "mapped", [1587]], [[126639, 126639], "mapped", [1593]], [[126640, 126640], "mapped", [1601]], [[126641, 126641], "mapped", [1589]], [[126642, 126642], "mapped", [1602]], [[126643, 126643], "mapped", [1585]], [[126644, 126644], "mapped", [1588]], [[126645, 126645], "mapped", [1578]], [[126646, 126646], "mapped", [1579]], [[126647, 126647], "mapped", [1582]], [[126648, 126648], "mapped", [1584]], [[126649, 126649], "mapped", [1590]], [[126650, 126650], "mapped", [1592]], [[126651, 126651], "mapped", [1594]], [[126652, 126703], "disallowed"], [[126704, 126705], "valid", [], "NV8"], [[126706, 126975], "disallowed"], [[126976, 127019], "valid", [], "NV8"], [[127020, 127023], "disallowed"], [[127024, 127123], "valid", [], "NV8"], [[127124, 127135], "disallowed"], [[127136, 127150], "valid", [], "NV8"], [[127151, 127152], "disallowed"], [[127153, 127166], "valid", [], "NV8"], [[127167, 127167], "valid", [], "NV8"], [[127168, 127168], "disallowed"], [[127169, 127183], "valid", [], "NV8"], [[127184, 127184], "disallowed"], [[127185, 127199], "valid", [], "NV8"], [[127200, 127221], "valid", [], "NV8"], [[127222, 127231], "disallowed"], [[127232, 127232], "disallowed"], [[127233, 127233], "disallowed_STD3_mapped", [48, 44]], [[127234, 127234], "disallowed_STD3_mapped", [49, 44]], [[127235, 127235], "disallowed_STD3_mapped", [50, 44]], [[127236, 127236], "disallowed_STD3_mapped", [51, 44]], [[127237, 127237], "disallowed_STD3_mapped", [52, 44]], [[127238, 127238], "disallowed_STD3_mapped", [53, 44]], [[127239, 127239], "disallowed_STD3_mapped", [54, 44]], [[127240, 127240], "disallowed_STD3_mapped", [55, 44]], [[127241, 127241], "disallowed_STD3_mapped", [56, 44]], [[127242, 127242], "disallowed_STD3_mapped", [57, 44]], [[127243, 127244], "valid", [], "NV8"], [[127245, 127247], "disallowed"], [[127248, 127248], "disallowed_STD3_mapped", [40, 97, 41]], [[127249, 127249], "disallowed_STD3_mapped", [40, 98, 41]], [[127250, 127250], "disallowed_STD3_mapped", [40, 99, 41]], [[127251, 127251], "disallowed_STD3_mapped", [40, 100, 41]], [[127252, 127252], "disallowed_STD3_mapped", [40, 101, 41]], [[127253, 127253], "disallowed_STD3_mapped", [40, 102, 41]], [[127254, 127254], "disallowed_STD3_mapped", [40, 103, 41]], [[127255, 127255], "disallowed_STD3_mapped", [40, 104, 41]], [[127256, 127256], "disallowed_STD3_mapped", [40, 105, 41]], [[127257, 127257], "disallowed_STD3_mapped", [40, 106, 41]], [[127258, 127258], "disallowed_STD3_mapped", [40, 107, 41]], [[127259, 127259], "disallowed_STD3_mapped", [40, 108, 41]], [[127260, 127260], "disallowed_STD3_mapped", [40, 109, 41]], [[127261, 127261], "disallowed_STD3_mapped", [40, 110, 41]], [[127262, 127262], "disallowed_STD3_mapped", [40, 111, 41]], [[127263, 127263], "disallowed_STD3_mapped", [40, 112, 41]], [[127264, 127264], "disallowed_STD3_mapped", [40, 113, 41]], [[127265, 127265], "disallowed_STD3_mapped", [40, 114, 41]], [[127266, 127266], "disallowed_STD3_mapped", [40, 115, 41]], [[127267, 127267], "disallowed_STD3_mapped", [40, 116, 41]], [[127268, 127268], "disallowed_STD3_mapped", [40, 117, 41]], [[127269, 127269], "disallowed_STD3_mapped", [40, 118, 41]], [[127270, 127270], "disallowed_STD3_mapped", [40, 119, 41]], [[127271, 127271], "disallowed_STD3_mapped", [40, 120, 41]], [[127272, 127272], "disallowed_STD3_mapped", [40, 121, 41]], [[127273, 127273], "disallowed_STD3_mapped", [40, 122, 41]], [[127274, 127274], "mapped", [12308, 115, 12309]], [[127275, 127275], "mapped", [99]], [[127276, 127276], "mapped", [114]], [[127277, 127277], "mapped", [99, 100]], [[127278, 127278], "mapped", [119, 122]], [[127279, 127279], "disallowed"], [[127280, 127280], "mapped", [97]], [[127281, 127281], "mapped", [98]], [[127282, 127282], "mapped", [99]], [[127283, 127283], "mapped", [100]], [[127284, 127284], "mapped", [101]], [[127285, 127285], "mapped", [102]], [[127286, 127286], "mapped", [103]], [[127287, 127287], "mapped", [104]], [[127288, 127288], "mapped", [105]], [[127289, 127289], "mapped", [106]], [[127290, 127290], "mapped", [107]], [[127291, 127291], "mapped", [108]], [[127292, 127292], "mapped", [109]], [[127293, 127293], "mapped", [110]], [[127294, 127294], "mapped", [111]], [[127295, 127295], "mapped", [112]], [[127296, 127296], "mapped", [113]], [[127297, 127297], "mapped", [114]], [[127298, 127298], "mapped", [115]], [[127299, 127299], "mapped", [116]], [[127300, 127300], "mapped", [117]], [[127301, 127301], "mapped", [118]], [[127302, 127302], "mapped", [119]], [[127303, 127303], "mapped", [120]], [[127304, 127304], "mapped", [121]], [[127305, 127305], "mapped", [122]], [[127306, 127306], "mapped", [104, 118]], [[127307, 127307], "mapped", [109, 118]], [[127308, 127308], "mapped", [115, 100]], [[127309, 127309], "mapped", [115, 115]], [[127310, 127310], "mapped", [112, 112, 118]], [[127311, 127311], "mapped", [119, 99]], [[127312, 127318], "valid", [], "NV8"], [[127319, 127319], "valid", [], "NV8"], [[127320, 127326], "valid", [], "NV8"], [[127327, 127327], "valid", [], "NV8"], [[127328, 127337], "valid", [], "NV8"], [[127338, 127338], "mapped", [109, 99]], [[127339, 127339], "mapped", [109, 100]], [[127340, 127343], "disallowed"], [[127344, 127352], "valid", [], "NV8"], [[127353, 127353], "valid", [], "NV8"], [[127354, 127354], "valid", [], "NV8"], [[127355, 127356], "valid", [], "NV8"], [[127357, 127358], "valid", [], "NV8"], [[127359, 127359], "valid", [], "NV8"], [[127360, 127369], "valid", [], "NV8"], [[127370, 127373], "valid", [], "NV8"], [[127374, 127375], "valid", [], "NV8"], [[127376, 127376], "mapped", [100, 106]], [[127377, 127386], "valid", [], "NV8"], [[127387, 127461], "disallowed"], [[127462, 127487], "valid", [], "NV8"], [[127488, 127488], "mapped", [12411, 12363]], [[127489, 127489], "mapped", [12467, 12467]], [[127490, 127490], "mapped", [12469]], [[127491, 127503], "disallowed"], [[127504, 127504], "mapped", [25163]], [[127505, 127505], "mapped", [23383]], [[127506, 127506], "mapped", [21452]], [[127507, 127507], "mapped", [12487]], [[127508, 127508], "mapped", [20108]], [[127509, 127509], "mapped", [22810]], [[127510, 127510], "mapped", [35299]], [[127511, 127511], "mapped", [22825]], [[127512, 127512], "mapped", [20132]], [[127513, 127513], "mapped", [26144]], [[127514, 127514], "mapped", [28961]], [[127515, 127515], "mapped", [26009]], [[127516, 127516], "mapped", [21069]], [[127517, 127517], "mapped", [24460]], [[127518, 127518], "mapped", [20877]], [[127519, 127519], "mapped", [26032]], [[127520, 127520], "mapped", [21021]], [[127521, 127521], "mapped", [32066]], [[127522, 127522], "mapped", [29983]], [[127523, 127523], "mapped", [36009]], [[127524, 127524], "mapped", [22768]], [[127525, 127525], "mapped", [21561]], [[127526, 127526], "mapped", [28436]], [[127527, 127527], "mapped", [25237]], [[127528, 127528], "mapped", [25429]], [[127529, 127529], "mapped", [19968]], [[127530, 127530], "mapped", [19977]], [[127531, 127531], "mapped", [36938]], [[127532, 127532], "mapped", [24038]], [[127533, 127533], "mapped", [20013]], [[127534, 127534], "mapped", [21491]], [[127535, 127535], "mapped", [25351]], [[127536, 127536], "mapped", [36208]], [[127537, 127537], "mapped", [25171]], [[127538, 127538], "mapped", [31105]], [[127539, 127539], "mapped", [31354]], [[127540, 127540], "mapped", [21512]], [[127541, 127541], "mapped", [28288]], [[127542, 127542], "mapped", [26377]], [[127543, 127543], "mapped", [26376]], [[127544, 127544], "mapped", [30003]], [[127545, 127545], "mapped", [21106]], [[127546, 127546], "mapped", [21942]], [[127547, 127551], "disallowed"], [[127552, 127552], "mapped", [12308, 26412, 12309]], [[127553, 127553], "mapped", [12308, 19977, 12309]], [[127554, 127554], "mapped", [12308, 20108, 12309]], [[127555, 127555], "mapped", [12308, 23433, 12309]], [[127556, 127556], "mapped", [12308, 28857, 12309]], [[127557, 127557], "mapped", [12308, 25171, 12309]], [[127558, 127558], "mapped", [12308, 30423, 12309]], [[127559, 127559], "mapped", [12308, 21213, 12309]], [[127560, 127560], "mapped", [12308, 25943, 12309]], [[127561, 127567], "disallowed"], [[127568, 127568], "mapped", [24471]], [[127569, 127569], "mapped", [21487]], [[127570, 127743], "disallowed"], [[127744, 127776], "valid", [], "NV8"], [[127777, 127788], "valid", [], "NV8"], [[127789, 127791], "valid", [], "NV8"], [[127792, 127797], "valid", [], "NV8"], [[127798, 127798], "valid", [], "NV8"], [[127799, 127868], "valid", [], "NV8"], [[127869, 127869], "valid", [], "NV8"], [[127870, 127871], "valid", [], "NV8"], [[127872, 127891], "valid", [], "NV8"], [[127892, 127903], "valid", [], "NV8"], [[127904, 127940], "valid", [], "NV8"], [[127941, 127941], "valid", [], "NV8"], [[127942, 127946], "valid", [], "NV8"], [[127947, 127950], "valid", [], "NV8"], [[127951, 127955], "valid", [], "NV8"], [[127956, 127967], "valid", [], "NV8"], [[127968, 127984], "valid", [], "NV8"], [[127985, 127991], "valid", [], "NV8"], [[127992, 127999], "valid", [], "NV8"], [[128000, 128062], "valid", [], "NV8"], [[128063, 128063], "valid", [], "NV8"], [[128064, 128064], "valid", [], "NV8"], [[128065, 128065], "valid", [], "NV8"], [[128066, 128247], "valid", [], "NV8"], [[128248, 128248], "valid", [], "NV8"], [[128249, 128252], "valid", [], "NV8"], [[128253, 128254], "valid", [], "NV8"], [[128255, 128255], "valid", [], "NV8"], [[128256, 128317], "valid", [], "NV8"], [[128318, 128319], "valid", [], "NV8"], [[128320, 128323], "valid", [], "NV8"], [[128324, 128330], "valid", [], "NV8"], [[128331, 128335], "valid", [], "NV8"], [[128336, 128359], "valid", [], "NV8"], [[128360, 128377], "valid", [], "NV8"], [[128378, 128378], "disallowed"], [[128379, 128419], "valid", [], "NV8"], [[128420, 128420], "disallowed"], [[128421, 128506], "valid", [], "NV8"], [[128507, 128511], "valid", [], "NV8"], [[128512, 128512], "valid", [], "NV8"], [[128513, 128528], "valid", [], "NV8"], [[128529, 128529], "valid", [], "NV8"], [[128530, 128532], "valid", [], "NV8"], [[128533, 128533], "valid", [], "NV8"], [[128534, 128534], "valid", [], "NV8"], [[128535, 128535], "valid", [], "NV8"], [[128536, 128536], "valid", [], "NV8"], [[128537, 128537], "valid", [], "NV8"], [[128538, 128538], "valid", [], "NV8"], [[128539, 128539], "valid", [], "NV8"], [[128540, 128542], "valid", [], "NV8"], [[128543, 128543], "valid", [], "NV8"], [[128544, 128549], "valid", [], "NV8"], [[128550, 128551], "valid", [], "NV8"], [[128552, 128555], "valid", [], "NV8"], [[128556, 128556], "valid", [], "NV8"], [[128557, 128557], "valid", [], "NV8"], [[128558, 128559], "valid", [], "NV8"], [[128560, 128563], "valid", [], "NV8"], [[128564, 128564], "valid", [], "NV8"], [[128565, 128576], "valid", [], "NV8"], [[128577, 128578], "valid", [], "NV8"], [[128579, 128580], "valid", [], "NV8"], [[128581, 128591], "valid", [], "NV8"], [[128592, 128639], "valid", [], "NV8"], [[128640, 128709], "valid", [], "NV8"], [[128710, 128719], "valid", [], "NV8"], [[128720, 128720], "valid", [], "NV8"], [[128721, 128735], "disallowed"], [[128736, 128748], "valid", [], "NV8"], [[128749, 128751], "disallowed"], [[128752, 128755], "valid", [], "NV8"], [[128756, 128767], "disallowed"], [[128768, 128883], "valid", [], "NV8"], [[128884, 128895], "disallowed"], [[128896, 128980], "valid", [], "NV8"], [[128981, 129023], "disallowed"], [[129024, 129035], "valid", [], "NV8"], [[129036, 129039], "disallowed"], [[129040, 129095], "valid", [], "NV8"], [[129096, 129103], "disallowed"], [[129104, 129113], "valid", [], "NV8"], [[129114, 129119], "disallowed"], [[129120, 129159], "valid", [], "NV8"], [[129160, 129167], "disallowed"], [[129168, 129197], "valid", [], "NV8"], [[129198, 129295], "disallowed"], [[129296, 129304], "valid", [], "NV8"], [[129305, 129407], "disallowed"], [[129408, 129412], "valid", [], "NV8"], [[129413, 129471], "disallowed"], [[129472, 129472], "valid", [], "NV8"], [[129473, 131069], "disallowed"], [[131070, 131071], "disallowed"], [[131072, 173782], "valid"], [[173783, 173823], "disallowed"], [[173824, 177972], "valid"], [[177973, 177983], "disallowed"], [[177984, 178205], "valid"], [[178206, 178207], "disallowed"], [[178208, 183969], "valid"], [[183970, 194559], "disallowed"], [[194560, 194560], "mapped", [20029]], [[194561, 194561], "mapped", [20024]], [[194562, 194562], "mapped", [20033]], [[194563, 194563], "mapped", [131362]], [[194564, 194564], "mapped", [20320]], [[194565, 194565], "mapped", [20398]], [[194566, 194566], "mapped", [20411]], [[194567, 194567], "mapped", [20482]], [[194568, 194568], "mapped", [20602]], [[194569, 194569], "mapped", [20633]], [[194570, 194570], "mapped", [20711]], [[194571, 194571], "mapped", [20687]], [[194572, 194572], "mapped", [13470]], [[194573, 194573], "mapped", [132666]], [[194574, 194574], "mapped", [20813]], [[194575, 194575], "mapped", [20820]], [[194576, 194576], "mapped", [20836]], [[194577, 194577], "mapped", [20855]], [[194578, 194578], "mapped", [132380]], [[194579, 194579], "mapped", [13497]], [[194580, 194580], "mapped", [20839]], [[194581, 194581], "mapped", [20877]], [[194582, 194582], "mapped", [132427]], [[194583, 194583], "mapped", [20887]], [[194584, 194584], "mapped", [20900]], [[194585, 194585], "mapped", [20172]], [[194586, 194586], "mapped", [20908]], [[194587, 194587], "mapped", [20917]], [[194588, 194588], "mapped", [168415]], [[194589, 194589], "mapped", [20981]], [[194590, 194590], "mapped", [20995]], [[194591, 194591], "mapped", [13535]], [[194592, 194592], "mapped", [21051]], [[194593, 194593], "mapped", [21062]], [[194594, 194594], "mapped", [21106]], [[194595, 194595], "mapped", [21111]], [[194596, 194596], "mapped", [13589]], [[194597, 194597], "mapped", [21191]], [[194598, 194598], "mapped", [21193]], [[194599, 194599], "mapped", [21220]], [[194600, 194600], "mapped", [21242]], [[194601, 194601], "mapped", [21253]], [[194602, 194602], "mapped", [21254]], [[194603, 194603], "mapped", [21271]], [[194604, 194604], "mapped", [21321]], [[194605, 194605], "mapped", [21329]], [[194606, 194606], "mapped", [21338]], [[194607, 194607], "mapped", [21363]], [[194608, 194608], "mapped", [21373]], [[194609, 194611], "mapped", [21375]], [[194612, 194612], "mapped", [133676]], [[194613, 194613], "mapped", [28784]], [[194614, 194614], "mapped", [21450]], [[194615, 194615], "mapped", [21471]], [[194616, 194616], "mapped", [133987]], [[194617, 194617], "mapped", [21483]], [[194618, 194618], "mapped", [21489]], [[194619, 194619], "mapped", [21510]], [[194620, 194620], "mapped", [21662]], [[194621, 194621], "mapped", [21560]], [[194622, 194622], "mapped", [21576]], [[194623, 194623], "mapped", [21608]], [[194624, 194624], "mapped", [21666]], [[194625, 194625], "mapped", [21750]], [[194626, 194626], "mapped", [21776]], [[194627, 194627], "mapped", [21843]], [[194628, 194628], "mapped", [21859]], [[194629, 194630], "mapped", [21892]], [[194631, 194631], "mapped", [21913]], [[194632, 194632], "mapped", [21931]], [[194633, 194633], "mapped", [21939]], [[194634, 194634], "mapped", [21954]], [[194635, 194635], "mapped", [22294]], [[194636, 194636], "mapped", [22022]], [[194637, 194637], "mapped", [22295]], [[194638, 194638], "mapped", [22097]], [[194639, 194639], "mapped", [22132]], [[194640, 194640], "mapped", [20999]], [[194641, 194641], "mapped", [22766]], [[194642, 194642], "mapped", [22478]], [[194643, 194643], "mapped", [22516]], [[194644, 194644], "mapped", [22541]], [[194645, 194645], "mapped", [22411]], [[194646, 194646], "mapped", [22578]], [[194647, 194647], "mapped", [22577]], [[194648, 194648], "mapped", [22700]], [[194649, 194649], "mapped", [136420]], [[194650, 194650], "mapped", [22770]], [[194651, 194651], "mapped", [22775]], [[194652, 194652], "mapped", [22790]], [[194653, 194653], "mapped", [22810]], [[194654, 194654], "mapped", [22818]], [[194655, 194655], "mapped", [22882]], [[194656, 194656], "mapped", [136872]], [[194657, 194657], "mapped", [136938]], [[194658, 194658], "mapped", [23020]], [[194659, 194659], "mapped", [23067]], [[194660, 194660], "mapped", [23079]], [[194661, 194661], "mapped", [23000]], [[194662, 194662], "mapped", [23142]], [[194663, 194663], "mapped", [14062]], [[194664, 194664], "disallowed"], [[194665, 194665], "mapped", [23304]], [[194666, 194667], "mapped", [23358]], [[194668, 194668], "mapped", [137672]], [[194669, 194669], "mapped", [23491]], [[194670, 194670], "mapped", [23512]], [[194671, 194671], "mapped", [23527]], [[194672, 194672], "mapped", [23539]], [[194673, 194673], "mapped", [138008]], [[194674, 194674], "mapped", [23551]], [[194675, 194675], "mapped", [23558]], [[194676, 194676], "disallowed"], [[194677, 194677], "mapped", [23586]], [[194678, 194678], "mapped", [14209]], [[194679, 194679], "mapped", [23648]], [[194680, 194680], "mapped", [23662]], [[194681, 194681], "mapped", [23744]], [[194682, 194682], "mapped", [23693]], [[194683, 194683], "mapped", [138724]], [[194684, 194684], "mapped", [23875]], [[194685, 194685], "mapped", [138726]], [[194686, 194686], "mapped", [23918]], [[194687, 194687], "mapped", [23915]], [[194688, 194688], "mapped", [23932]], [[194689, 194689], "mapped", [24033]], [[194690, 194690], "mapped", [24034]], [[194691, 194691], "mapped", [14383]], [[194692, 194692], "mapped", [24061]], [[194693, 194693], "mapped", [24104]], [[194694, 194694], "mapped", [24125]], [[194695, 194695], "mapped", [24169]], [[194696, 194696], "mapped", [14434]], [[194697, 194697], "mapped", [139651]], [[194698, 194698], "mapped", [14460]], [[194699, 194699], "mapped", [24240]], [[194700, 194700], "mapped", [24243]], [[194701, 194701], "mapped", [24246]], [[194702, 194702], "mapped", [24266]], [[194703, 194703], "mapped", [172946]], [[194704, 194704], "mapped", [24318]], [[194705, 194706], "mapped", [140081]], [[194707, 194707], "mapped", [33281]], [[194708, 194709], "mapped", [24354]], [[194710, 194710], "mapped", [14535]], [[194711, 194711], "mapped", [144056]], [[194712, 194712], "mapped", [156122]], [[194713, 194713], "mapped", [24418]], [[194714, 194714], "mapped", [24427]], [[194715, 194715], "mapped", [14563]], [[194716, 194716], "mapped", [24474]], [[194717, 194717], "mapped", [24525]], [[194718, 194718], "mapped", [24535]], [[194719, 194719], "mapped", [24569]], [[194720, 194720], "mapped", [24705]], [[194721, 194721], "mapped", [14650]], [[194722, 194722], "mapped", [14620]], [[194723, 194723], "mapped", [24724]], [[194724, 194724], "mapped", [141012]], [[194725, 194725], "mapped", [24775]], [[194726, 194726], "mapped", [24904]], [[194727, 194727], "mapped", [24908]], [[194728, 194728], "mapped", [24910]], [[194729, 194729], "mapped", [24908]], [[194730, 194730], "mapped", [24954]], [[194731, 194731], "mapped", [24974]], [[194732, 194732], "mapped", [25010]], [[194733, 194733], "mapped", [24996]], [[194734, 194734], "mapped", [25007]], [[194735, 194735], "mapped", [25054]], [[194736, 194736], "mapped", [25074]], [[194737, 194737], "mapped", [25078]], [[194738, 194738], "mapped", [25104]], [[194739, 194739], "mapped", [25115]], [[194740, 194740], "mapped", [25181]], [[194741, 194741], "mapped", [25265]], [[194742, 194742], "mapped", [25300]], [[194743, 194743], "mapped", [25424]], [[194744, 194744], "mapped", [142092]], [[194745, 194745], "mapped", [25405]], [[194746, 194746], "mapped", [25340]], [[194747, 194747], "mapped", [25448]], [[194748, 194748], "mapped", [25475]], [[194749, 194749], "mapped", [25572]], [[194750, 194750], "mapped", [142321]], [[194751, 194751], "mapped", [25634]], [[194752, 194752], "mapped", [25541]], [[194753, 194753], "mapped", [25513]], [[194754, 194754], "mapped", [14894]], [[194755, 194755], "mapped", [25705]], [[194756, 194756], "mapped", [25726]], [[194757, 194757], "mapped", [25757]], [[194758, 194758], "mapped", [25719]], [[194759, 194759], "mapped", [14956]], [[194760, 194760], "mapped", [25935]], [[194761, 194761], "mapped", [25964]], [[194762, 194762], "mapped", [143370]], [[194763, 194763], "mapped", [26083]], [[194764, 194764], "mapped", [26360]], [[194765, 194765], "mapped", [26185]], [[194766, 194766], "mapped", [15129]], [[194767, 194767], "mapped", [26257]], [[194768, 194768], "mapped", [15112]], [[194769, 194769], "mapped", [15076]], [[194770, 194770], "mapped", [20882]], [[194771, 194771], "mapped", [20885]], [[194772, 194772], "mapped", [26368]], [[194773, 194773], "mapped", [26268]], [[194774, 194774], "mapped", [32941]], [[194775, 194775], "mapped", [17369]], [[194776, 194776], "mapped", [26391]], [[194777, 194777], "mapped", [26395]], [[194778, 194778], "mapped", [26401]], [[194779, 194779], "mapped", [26462]], [[194780, 194780], "mapped", [26451]], [[194781, 194781], "mapped", [144323]], [[194782, 194782], "mapped", [15177]], [[194783, 194783], "mapped", [26618]], [[194784, 194784], "mapped", [26501]], [[194785, 194785], "mapped", [26706]], [[194786, 194786], "mapped", [26757]], [[194787, 194787], "mapped", [144493]], [[194788, 194788], "mapped", [26766]], [[194789, 194789], "mapped", [26655]], [[194790, 194790], "mapped", [26900]], [[194791, 194791], "mapped", [15261]], [[194792, 194792], "mapped", [26946]], [[194793, 194793], "mapped", [27043]], [[194794, 194794], "mapped", [27114]], [[194795, 194795], "mapped", [27304]], [[194796, 194796], "mapped", [145059]], [[194797, 194797], "mapped", [27355]], [[194798, 194798], "mapped", [15384]], [[194799, 194799], "mapped", [27425]], [[194800, 194800], "mapped", [145575]], [[194801, 194801], "mapped", [27476]], [[194802, 194802], "mapped", [15438]], [[194803, 194803], "mapped", [27506]], [[194804, 194804], "mapped", [27551]], [[194805, 194805], "mapped", [27578]], [[194806, 194806], "mapped", [27579]], [[194807, 194807], "mapped", [146061]], [[194808, 194808], "mapped", [138507]], [[194809, 194809], "mapped", [146170]], [[194810, 194810], "mapped", [27726]], [[194811, 194811], "mapped", [146620]], [[194812, 194812], "mapped", [27839]], [[194813, 194813], "mapped", [27853]], [[194814, 194814], "mapped", [27751]], [[194815, 194815], "mapped", [27926]], [[194816, 194816], "mapped", [27966]], [[194817, 194817], "mapped", [28023]], [[194818, 194818], "mapped", [27969]], [[194819, 194819], "mapped", [28009]], [[194820, 194820], "mapped", [28024]], [[194821, 194821], "mapped", [28037]], [[194822, 194822], "mapped", [146718]], [[194823, 194823], "mapped", [27956]], [[194824, 194824], "mapped", [28207]], [[194825, 194825], "mapped", [28270]], [[194826, 194826], "mapped", [15667]], [[194827, 194827], "mapped", [28363]], [[194828, 194828], "mapped", [28359]], [[194829, 194829], "mapped", [147153]], [[194830, 194830], "mapped", [28153]], [[194831, 194831], "mapped", [28526]], [[194832, 194832], "mapped", [147294]], [[194833, 194833], "mapped", [147342]], [[194834, 194834], "mapped", [28614]], [[194835, 194835], "mapped", [28729]], [[194836, 194836], "mapped", [28702]], [[194837, 194837], "mapped", [28699]], [[194838, 194838], "mapped", [15766]], [[194839, 194839], "mapped", [28746]], [[194840, 194840], "mapped", [28797]], [[194841, 194841], "mapped", [28791]], [[194842, 194842], "mapped", [28845]], [[194843, 194843], "mapped", [132389]], [[194844, 194844], "mapped", [28997]], [[194845, 194845], "mapped", [148067]], [[194846, 194846], "mapped", [29084]], [[194847, 194847], "disallowed"], [[194848, 194848], "mapped", [29224]], [[194849, 194849], "mapped", [29237]], [[194850, 194850], "mapped", [29264]], [[194851, 194851], "mapped", [149000]], [[194852, 194852], "mapped", [29312]], [[194853, 194853], "mapped", [29333]], [[194854, 194854], "mapped", [149301]], [[194855, 194855], "mapped", [149524]], [[194856, 194856], "mapped", [29562]], [[194857, 194857], "mapped", [29579]], [[194858, 194858], "mapped", [16044]], [[194859, 194859], "mapped", [29605]], [[194860, 194861], "mapped", [16056]], [[194862, 194862], "mapped", [29767]], [[194863, 194863], "mapped", [29788]], [[194864, 194864], "mapped", [29809]], [[194865, 194865], "mapped", [29829]], [[194866, 194866], "mapped", [29898]], [[194867, 194867], "mapped", [16155]], [[194868, 194868], "mapped", [29988]], [[194869, 194869], "mapped", [150582]], [[194870, 194870], "mapped", [30014]], [[194871, 194871], "mapped", [150674]], [[194872, 194872], "mapped", [30064]], [[194873, 194873], "mapped", [139679]], [[194874, 194874], "mapped", [30224]], [[194875, 194875], "mapped", [151457]], [[194876, 194876], "mapped", [151480]], [[194877, 194877], "mapped", [151620]], [[194878, 194878], "mapped", [16380]], [[194879, 194879], "mapped", [16392]], [[194880, 194880], "mapped", [30452]], [[194881, 194881], "mapped", [151795]], [[194882, 194882], "mapped", [151794]], [[194883, 194883], "mapped", [151833]], [[194884, 194884], "mapped", [151859]], [[194885, 194885], "mapped", [30494]], [[194886, 194887], "mapped", [30495]], [[194888, 194888], "mapped", [30538]], [[194889, 194889], "mapped", [16441]], [[194890, 194890], "mapped", [30603]], [[194891, 194891], "mapped", [16454]], [[194892, 194892], "mapped", [16534]], [[194893, 194893], "mapped", [152605]], [[194894, 194894], "mapped", [30798]], [[194895, 194895], "mapped", [30860]], [[194896, 194896], "mapped", [30924]], [[194897, 194897], "mapped", [16611]], [[194898, 194898], "mapped", [153126]], [[194899, 194899], "mapped", [31062]], [[194900, 194900], "mapped", [153242]], [[194901, 194901], "mapped", [153285]], [[194902, 194902], "mapped", [31119]], [[194903, 194903], "mapped", [31211]], [[194904, 194904], "mapped", [16687]], [[194905, 194905], "mapped", [31296]], [[194906, 194906], "mapped", [31306]], [[194907, 194907], "mapped", [31311]], [[194908, 194908], "mapped", [153980]], [[194909, 194910], "mapped", [154279]], [[194911, 194911], "disallowed"], [[194912, 194912], "mapped", [16898]], [[194913, 194913], "mapped", [154539]], [[194914, 194914], "mapped", [31686]], [[194915, 194915], "mapped", [31689]], [[194916, 194916], "mapped", [16935]], [[194917, 194917], "mapped", [154752]], [[194918, 194918], "mapped", [31954]], [[194919, 194919], "mapped", [17056]], [[194920, 194920], "mapped", [31976]], [[194921, 194921], "mapped", [31971]], [[194922, 194922], "mapped", [32000]], [[194923, 194923], "mapped", [155526]], [[194924, 194924], "mapped", [32099]], [[194925, 194925], "mapped", [17153]], [[194926, 194926], "mapped", [32199]], [[194927, 194927], "mapped", [32258]], [[194928, 194928], "mapped", [32325]], [[194929, 194929], "mapped", [17204]], [[194930, 194930], "mapped", [156200]], [[194931, 194931], "mapped", [156231]], [[194932, 194932], "mapped", [17241]], [[194933, 194933], "mapped", [156377]], [[194934, 194934], "mapped", [32634]], [[194935, 194935], "mapped", [156478]], [[194936, 194936], "mapped", [32661]], [[194937, 194937], "mapped", [32762]], [[194938, 194938], "mapped", [32773]], [[194939, 194939], "mapped", [156890]], [[194940, 194940], "mapped", [156963]], [[194941, 194941], "mapped", [32864]], [[194942, 194942], "mapped", [157096]], [[194943, 194943], "mapped", [32880]], [[194944, 194944], "mapped", [144223]], [[194945, 194945], "mapped", [17365]], [[194946, 194946], "mapped", [32946]], [[194947, 194947], "mapped", [33027]], [[194948, 194948], "mapped", [17419]], [[194949, 194949], "mapped", [33086]], [[194950, 194950], "mapped", [23221]], [[194951, 194951], "mapped", [157607]], [[194952, 194952], "mapped", [157621]], [[194953, 194953], "mapped", [144275]], [[194954, 194954], "mapped", [144284]], [[194955, 194955], "mapped", [33281]], [[194956, 194956], "mapped", [33284]], [[194957, 194957], "mapped", [36766]], [[194958, 194958], "mapped", [17515]], [[194959, 194959], "mapped", [33425]], [[194960, 194960], "mapped", [33419]], [[194961, 194961], "mapped", [33437]], [[194962, 194962], "mapped", [21171]], [[194963, 194963], "mapped", [33457]], [[194964, 194964], "mapped", [33459]], [[194965, 194965], "mapped", [33469]], [[194966, 194966], "mapped", [33510]], [[194967, 194967], "mapped", [158524]], [[194968, 194968], "mapped", [33509]], [[194969, 194969], "mapped", [33565]], [[194970, 194970], "mapped", [33635]], [[194971, 194971], "mapped", [33709]], [[194972, 194972], "mapped", [33571]], [[194973, 194973], "mapped", [33725]], [[194974, 194974], "mapped", [33767]], [[194975, 194975], "mapped", [33879]], [[194976, 194976], "mapped", [33619]], [[194977, 194977], "mapped", [33738]], [[194978, 194978], "mapped", [33740]], [[194979, 194979], "mapped", [33756]], [[194980, 194980], "mapped", [158774]], [[194981, 194981], "mapped", [159083]], [[194982, 194982], "mapped", [158933]], [[194983, 194983], "mapped", [17707]], [[194984, 194984], "mapped", [34033]], [[194985, 194985], "mapped", [34035]], [[194986, 194986], "mapped", [34070]], [[194987, 194987], "mapped", [160714]], [[194988, 194988], "mapped", [34148]], [[194989, 194989], "mapped", [159532]], [[194990, 194990], "mapped", [17757]], [[194991, 194991], "mapped", [17761]], [[194992, 194992], "mapped", [159665]], [[194993, 194993], "mapped", [159954]], [[194994, 194994], "mapped", [17771]], [[194995, 194995], "mapped", [34384]], [[194996, 194996], "mapped", [34396]], [[194997, 194997], "mapped", [34407]], [[194998, 194998], "mapped", [34409]], [[194999, 194999], "mapped", [34473]], [[195000, 195000], "mapped", [34440]], [[195001, 195001], "mapped", [34574]], [[195002, 195002], "mapped", [34530]], [[195003, 195003], "mapped", [34681]], [[195004, 195004], "mapped", [34600]], [[195005, 195005], "mapped", [34667]], [[195006, 195006], "mapped", [34694]], [[195007, 195007], "disallowed"], [[195008, 195008], "mapped", [34785]], [[195009, 195009], "mapped", [34817]], [[195010, 195010], "mapped", [17913]], [[195011, 195011], "mapped", [34912]], [[195012, 195012], "mapped", [34915]], [[195013, 195013], "mapped", [161383]], [[195014, 195014], "mapped", [35031]], [[195015, 195015], "mapped", [35038]], [[195016, 195016], "mapped", [17973]], [[195017, 195017], "mapped", [35066]], [[195018, 195018], "mapped", [13499]], [[195019, 195019], "mapped", [161966]], [[195020, 195020], "mapped", [162150]], [[195021, 195021], "mapped", [18110]], [[195022, 195022], "mapped", [18119]], [[195023, 195023], "mapped", [35488]], [[195024, 195024], "mapped", [35565]], [[195025, 195025], "mapped", [35722]], [[195026, 195026], "mapped", [35925]], [[195027, 195027], "mapped", [162984]], [[195028, 195028], "mapped", [36011]], [[195029, 195029], "mapped", [36033]], [[195030, 195030], "mapped", [36123]], [[195031, 195031], "mapped", [36215]], [[195032, 195032], "mapped", [163631]], [[195033, 195033], "mapped", [133124]], [[195034, 195034], "mapped", [36299]], [[195035, 195035], "mapped", [36284]], [[195036, 195036], "mapped", [36336]], [[195037, 195037], "mapped", [133342]], [[195038, 195038], "mapped", [36564]], [[195039, 195039], "mapped", [36664]], [[195040, 195040], "mapped", [165330]], [[195041, 195041], "mapped", [165357]], [[195042, 195042], "mapped", [37012]], [[195043, 195043], "mapped", [37105]], [[195044, 195044], "mapped", [37137]], [[195045, 195045], "mapped", [165678]], [[195046, 195046], "mapped", [37147]], [[195047, 195047], "mapped", [37432]], [[195048, 195048], "mapped", [37591]], [[195049, 195049], "mapped", [37592]], [[195050, 195050], "mapped", [37500]], [[195051, 195051], "mapped", [37881]], [[195052, 195052], "mapped", [37909]], [[195053, 195053], "mapped", [166906]], [[195054, 195054], "mapped", [38283]], [[195055, 195055], "mapped", [18837]], [[195056, 195056], "mapped", [38327]], [[195057, 195057], "mapped", [167287]], [[195058, 195058], "mapped", [18918]], [[195059, 195059], "mapped", [38595]], [[195060, 195060], "mapped", [23986]], [[195061, 195061], "mapped", [38691]], [[195062, 195062], "mapped", [168261]], [[195063, 195063], "mapped", [168474]], [[195064, 195064], "mapped", [19054]], [[195065, 195065], "mapped", [19062]], [[195066, 195066], "mapped", [38880]], [[195067, 195067], "mapped", [168970]], [[195068, 195068], "mapped", [19122]], [[195069, 195069], "mapped", [169110]], [[195070, 195071], "mapped", [38923]], [[195072, 195072], "mapped", [38953]], [[195073, 195073], "mapped", [169398]], [[195074, 195074], "mapped", [39138]], [[195075, 195075], "mapped", [19251]], [[195076, 195076], "mapped", [39209]], [[195077, 195077], "mapped", [39335]], [[195078, 195078], "mapped", [39362]], [[195079, 195079], "mapped", [39422]], [[195080, 195080], "mapped", [19406]], [[195081, 195081], "mapped", [170800]], [[195082, 195082], "mapped", [39698]], [[195083, 195083], "mapped", [40000]], [[195084, 195084], "mapped", [40189]], [[195085, 195085], "mapped", [19662]], [[195086, 195086], "mapped", [19693]], [[195087, 195087], "mapped", [40295]], [[195088, 195088], "mapped", [172238]], [[195089, 195089], "mapped", [19704]], [[195090, 195090], "mapped", [172293]], [[195091, 195091], "mapped", [172558]], [[195092, 195092], "mapped", [172689]], [[195093, 195093], "mapped", [40635]], [[195094, 195094], "mapped", [19798]], [[195095, 195095], "mapped", [40697]], [[195096, 195096], "mapped", [40702]], [[195097, 195097], "mapped", [40709]], [[195098, 195098], "mapped", [40719]], [[195099, 195099], "mapped", [40726]], [[195100, 195100], "mapped", [40763]], [[195101, 195101], "mapped", [173568]], [[195102, 196605], "disallowed"], [[196606, 196607], "disallowed"], [[196608, 262141], "disallowed"], [[262142, 262143], "disallowed"], [[262144, 327677], "disallowed"], [[327678, 327679], "disallowed"], [[327680, 393213], "disallowed"], [[393214, 393215], "disallowed"], [[393216, 458749], "disallowed"], [[458750, 458751], "disallowed"], [[458752, 524285], "disallowed"], [[524286, 524287], "disallowed"], [[524288, 589821], "disallowed"], [[589822, 589823], "disallowed"], [[589824, 655357], "disallowed"], [[655358, 655359], "disallowed"], [[655360, 720893], "disallowed"], [[720894, 720895], "disallowed"], [[720896, 786429], "disallowed"], [[786430, 786431], "disallowed"], [[786432, 851965], "disallowed"], [[851966, 851967], "disallowed"], [[851968, 917501], "disallowed"], [[917502, 917503], "disallowed"], [[917504, 917504], "disallowed"], [[917505, 917505], "disallowed"], [[917506, 917535], "disallowed"], [[917536, 917631], "disallowed"], [[917632, 917759], "disallowed"], [[917760, 917999], "ignored"], [[918000, 983037], "disallowed"], [[983038, 983039], "disallowed"], [[983040, 1048573], "disallowed"], [[1048574, 1048575], "disallowed"], [[1048576, 1114109], "disallowed"], [[1114110, 1114111], "disallowed"]]; +}); + +// node_modules/tr46/index.js +var require_tr46 = __commonJS((exports2, module2) => { + var punycode = require("punycode"); + var mappingTable = require_mappingTable(); + var PROCESSING_OPTIONS = { + TRANSITIONAL: 0, + NONTRANSITIONAL: 1 + }; + function normalize(str) { + return str.split("\0").map(function(s) { + return s.normalize("NFC"); + }).join("\0"); + } + function findStatus(val2) { + var start = 0; + var end = mappingTable.length - 1; + while (start <= end) { + var mid = Math.floor((start + end) / 2); + var target = mappingTable[mid]; + if (target[0][0] <= val2 && target[0][1] >= val2) { + return target; + } else if (target[0][0] > val2) { + end = mid - 1; + } else { + start = mid + 1; + } + } + return null; + } + var regexAstralSymbols = /[\uD800-\uDBFF][\uDC00-\uDFFF]/g; + function countSymbols(string) { + return string.replace(regexAstralSymbols, "_").length; + } + function mapChars(domain_name, useSTD3, processing_option) { + var hasError = false; + var processed = ""; + var len = countSymbols(domain_name); + for (var i = 0;i < len; ++i) { + var codePoint = domain_name.codePointAt(i); + var status = findStatus(codePoint); + switch (status[1]) { + case "disallowed": + hasError = true; + processed += String.fromCodePoint(codePoint); + break; + case "ignored": + break; + case "mapped": + processed += String.fromCodePoint.apply(String, status[2]); + break; + case "deviation": + if (processing_option === PROCESSING_OPTIONS.TRANSITIONAL) { + processed += String.fromCodePoint.apply(String, status[2]); + } else { + processed += String.fromCodePoint(codePoint); + } + break; + case "valid": + processed += String.fromCodePoint(codePoint); + break; + case "disallowed_STD3_mapped": + if (useSTD3) { + hasError = true; + processed += String.fromCodePoint(codePoint); + } else { + processed += String.fromCodePoint.apply(String, status[2]); + } + break; + case "disallowed_STD3_valid": + if (useSTD3) { + hasError = true; + } + processed += String.fromCodePoint(codePoint); + break; + } + } + return { + string: processed, + error: hasError + }; + } + var combiningMarksRegex = /[\u0300-\u036F\u0483-\u0489\u0591-\u05BD\u05BF\u05C1\u05C2\u05C4\u05C5\u05C7\u0610-\u061A\u064B-\u065F\u0670\u06D6-\u06DC\u06DF-\u06E4\u06E7\u06E8\u06EA-\u06ED\u0711\u0730-\u074A\u07A6-\u07B0\u07EB-\u07F3\u0816-\u0819\u081B-\u0823\u0825-\u0827\u0829-\u082D\u0859-\u085B\u08E4-\u0903\u093A-\u093C\u093E-\u094F\u0951-\u0957\u0962\u0963\u0981-\u0983\u09BC\u09BE-\u09C4\u09C7\u09C8\u09CB-\u09CD\u09D7\u09E2\u09E3\u0A01-\u0A03\u0A3C\u0A3E-\u0A42\u0A47\u0A48\u0A4B-\u0A4D\u0A51\u0A70\u0A71\u0A75\u0A81-\u0A83\u0ABC\u0ABE-\u0AC5\u0AC7-\u0AC9\u0ACB-\u0ACD\u0AE2\u0AE3\u0B01-\u0B03\u0B3C\u0B3E-\u0B44\u0B47\u0B48\u0B4B-\u0B4D\u0B56\u0B57\u0B62\u0B63\u0B82\u0BBE-\u0BC2\u0BC6-\u0BC8\u0BCA-\u0BCD\u0BD7\u0C00-\u0C03\u0C3E-\u0C44\u0C46-\u0C48\u0C4A-\u0C4D\u0C55\u0C56\u0C62\u0C63\u0C81-\u0C83\u0CBC\u0CBE-\u0CC4\u0CC6-\u0CC8\u0CCA-\u0CCD\u0CD5\u0CD6\u0CE2\u0CE3\u0D01-\u0D03\u0D3E-\u0D44\u0D46-\u0D48\u0D4A-\u0D4D\u0D57\u0D62\u0D63\u0D82\u0D83\u0DCA\u0DCF-\u0DD4\u0DD6\u0DD8-\u0DDF\u0DF2\u0DF3\u0E31\u0E34-\u0E3A\u0E47-\u0E4E\u0EB1\u0EB4-\u0EB9\u0EBB\u0EBC\u0EC8-\u0ECD\u0F18\u0F19\u0F35\u0F37\u0F39\u0F3E\u0F3F\u0F71-\u0F84\u0F86\u0F87\u0F8D-\u0F97\u0F99-\u0FBC\u0FC6\u102B-\u103E\u1056-\u1059\u105E-\u1060\u1062-\u1064\u1067-\u106D\u1071-\u1074\u1082-\u108D\u108F\u109A-\u109D\u135D-\u135F\u1712-\u1714\u1732-\u1734\u1752\u1753\u1772\u1773\u17B4-\u17D3\u17DD\u180B-\u180D\u18A9\u1920-\u192B\u1930-\u193B\u19B0-\u19C0\u19C8\u19C9\u1A17-\u1A1B\u1A55-\u1A5E\u1A60-\u1A7C\u1A7F\u1AB0-\u1ABE\u1B00-\u1B04\u1B34-\u1B44\u1B6B-\u1B73\u1B80-\u1B82\u1BA1-\u1BAD\u1BE6-\u1BF3\u1C24-\u1C37\u1CD0-\u1CD2\u1CD4-\u1CE8\u1CED\u1CF2-\u1CF4\u1CF8\u1CF9\u1DC0-\u1DF5\u1DFC-\u1DFF\u20D0-\u20F0\u2CEF-\u2CF1\u2D7F\u2DE0-\u2DFF\u302A-\u302F\u3099\u309A\uA66F-\uA672\uA674-\uA67D\uA69F\uA6F0\uA6F1\uA802\uA806\uA80B\uA823-\uA827\uA880\uA881\uA8B4-\uA8C4\uA8E0-\uA8F1\uA926-\uA92D\uA947-\uA953\uA980-\uA983\uA9B3-\uA9C0\uA9E5\uAA29-\uAA36\uAA43\uAA4C\uAA4D\uAA7B-\uAA7D\uAAB0\uAAB2-\uAAB4\uAAB7\uAAB8\uAABE\uAABF\uAAC1\uAAEB-\uAAEF\uAAF5\uAAF6\uABE3-\uABEA\uABEC\uABED\uFB1E\uFE00-\uFE0F\uFE20-\uFE2D]|\uD800[\uDDFD\uDEE0\uDF76-\uDF7A]|\uD802[\uDE01-\uDE03\uDE05\uDE06\uDE0C-\uDE0F\uDE38-\uDE3A\uDE3F\uDEE5\uDEE6]|\uD804[\uDC00-\uDC02\uDC38-\uDC46\uDC7F-\uDC82\uDCB0-\uDCBA\uDD00-\uDD02\uDD27-\uDD34\uDD73\uDD80-\uDD82\uDDB3-\uDDC0\uDE2C-\uDE37\uDEDF-\uDEEA\uDF01-\uDF03\uDF3C\uDF3E-\uDF44\uDF47\uDF48\uDF4B-\uDF4D\uDF57\uDF62\uDF63\uDF66-\uDF6C\uDF70-\uDF74]|\uD805[\uDCB0-\uDCC3\uDDAF-\uDDB5\uDDB8-\uDDC0\uDE30-\uDE40\uDEAB-\uDEB7]|\uD81A[\uDEF0-\uDEF4\uDF30-\uDF36]|\uD81B[\uDF51-\uDF7E\uDF8F-\uDF92]|\uD82F[\uDC9D\uDC9E]|\uD834[\uDD65-\uDD69\uDD6D-\uDD72\uDD7B-\uDD82\uDD85-\uDD8B\uDDAA-\uDDAD\uDE42-\uDE44]|\uD83A[\uDCD0-\uDCD6]|\uDB40[\uDD00-\uDDEF]/; + function validateLabel(label, processing_option) { + if (label.substr(0, 4) === "xn--") { + label = punycode.toUnicode(label); + processing_option = PROCESSING_OPTIONS.NONTRANSITIONAL; + } + var error = false; + if (normalize(label) !== label || label[3] === "-" && label[4] === "-" || label[0] === "-" || label[label.length - 1] === "-" || label.indexOf(".") !== -1 || label.search(combiningMarksRegex) === 0) { + error = true; + } + var len = countSymbols(label); + for (var i = 0;i < len; ++i) { + var status = findStatus(label.codePointAt(i)); + if (processing === PROCESSING_OPTIONS.TRANSITIONAL && status[1] !== "valid" || processing === PROCESSING_OPTIONS.NONTRANSITIONAL && status[1] !== "valid" && status[1] !== "deviation") { + error = true; + break; + } + } + return { + label, + error + }; + } + function processing(domain_name, useSTD3, processing_option) { + var result = mapChars(domain_name, useSTD3, processing_option); + result.string = normalize(result.string); + var labels = result.string.split("."); + for (var i = 0;i < labels.length; ++i) { + try { + var validation = validateLabel(labels[i]); + labels[i] = validation.label; + result.error = result.error || validation.error; + } catch (e) { + result.error = true; + } + } + return { + string: labels.join("."), + error: result.error + }; + } + module2.exports.toASCII = function(domain_name, useSTD3, processing_option, verifyDnsLength) { + var result = processing(domain_name, useSTD3, processing_option); + var labels = result.string.split("."); + labels = labels.map(function(l) { + try { + return punycode.toASCII(l); + } catch (e) { + result.error = true; + return l; + } + }); + if (verifyDnsLength) { + var total = labels.slice(0, labels.length - 1).join(".").length; + if (total.length > 253 || total.length === 0) { + result.error = true; + } + for (var i = 0;i < labels.length; ++i) { + if (labels.length > 63 || labels.length === 0) { + result.error = true; + break; + } + } + } + if (result.error) + return null; + return labels.join("."); + }; + module2.exports.toUnicode = function(domain_name, useSTD3) { + var result = processing(domain_name, useSTD3, PROCESSING_OPTIONS.NONTRANSITIONAL); + return { + domain: result.string, + error: result.error + }; + }; + module2.exports.PROCESSING_OPTIONS = PROCESSING_OPTIONS; +}); + +// node_modules/whatwg-url/lib/url-state-machine.js +var require_url_state_machine = __commonJS((exports2, module2) => { + var punycode = require("punycode"); + var tr46 = require_tr46(); + var specialSchemes = { + ftp: 21, + file: null, + gopher: 70, + http: 80, + https: 443, + ws: 80, + wss: 443 + }; + var failure = Symbol("failure"); + function countSymbols(str) { + return punycode.ucs2.decode(str).length; + } + function at(input, idx) { + const c = input[idx]; + return isNaN(c) ? undefined : String.fromCodePoint(c); + } + function isASCIIDigit(c) { + return c >= 48 && c <= 57; + } + function isASCIIAlpha(c) { + return c >= 65 && c <= 90 || c >= 97 && c <= 122; + } + function isASCIIAlphanumeric(c) { + return isASCIIAlpha(c) || isASCIIDigit(c); + } + function isASCIIHex(c) { + return isASCIIDigit(c) || c >= 65 && c <= 70 || c >= 97 && c <= 102; + } + function isSingleDot(buffer) { + return buffer === "." || buffer.toLowerCase() === "%2e"; + } + function isDoubleDot(buffer) { + buffer = buffer.toLowerCase(); + return buffer === ".." || buffer === "%2e." || buffer === ".%2e" || buffer === "%2e%2e"; + } + function isWindowsDriveLetterCodePoints(cp1, cp2) { + return isASCIIAlpha(cp1) && (cp2 === 58 || cp2 === 124); + } + function isWindowsDriveLetterString(string) { + return string.length === 2 && isASCIIAlpha(string.codePointAt(0)) && (string[1] === ":" || string[1] === "|"); + } + function isNormalizedWindowsDriveLetterString(string) { + return string.length === 2 && isASCIIAlpha(string.codePointAt(0)) && string[1] === ":"; + } + function containsForbiddenHostCodePoint(string) { + return string.search(/\u0000|\u0009|\u000A|\u000D|\u0020|#|%|\/|:|\?|@|\[|\\|\]/) !== -1; + } + function containsForbiddenHostCodePointExcludingPercent(string) { + return string.search(/\u0000|\u0009|\u000A|\u000D|\u0020|#|\/|:|\?|@|\[|\\|\]/) !== -1; + } + function isSpecialScheme(scheme) { + return specialSchemes[scheme] !== undefined; + } + function isSpecial(url) { + return isSpecialScheme(url.scheme); + } + function defaultPort(scheme) { + return specialSchemes[scheme]; + } + function percentEncode(c) { + let hex = c.toString(16).toUpperCase(); + if (hex.length === 1) { + hex = "0" + hex; + } + return "%" + hex; + } + function utf8PercentEncode(c) { + const buf = new Buffer(c); + let str = ""; + for (let i = 0;i < buf.length; ++i) { + str += percentEncode(buf[i]); + } + return str; + } + function utf8PercentDecode(str) { + const input = new Buffer(str); + const output = []; + for (let i = 0;i < input.length; ++i) { + if (input[i] !== 37) { + output.push(input[i]); + } else if (input[i] === 37 && isASCIIHex(input[i + 1]) && isASCIIHex(input[i + 2])) { + output.push(parseInt(input.slice(i + 1, i + 3).toString(), 16)); + i += 2; + } else { + output.push(input[i]); + } + } + return new Buffer(output).toString(); + } + function isC0ControlPercentEncode(c) { + return c <= 31 || c > 126; + } + var extraPathPercentEncodeSet = new Set([32, 34, 35, 60, 62, 63, 96, 123, 125]); + function isPathPercentEncode(c) { + return isC0ControlPercentEncode(c) || extraPathPercentEncodeSet.has(c); + } + var extraUserinfoPercentEncodeSet = new Set([47, 58, 59, 61, 64, 91, 92, 93, 94, 124]); + function isUserinfoPercentEncode(c) { + return isPathPercentEncode(c) || extraUserinfoPercentEncodeSet.has(c); + } + function percentEncodeChar(c, encodeSetPredicate) { + const cStr = String.fromCodePoint(c); + if (encodeSetPredicate(c)) { + return utf8PercentEncode(cStr); + } + return cStr; + } + function parseIPv4Number(input) { + let R = 10; + if (input.length >= 2 && input.charAt(0) === "0" && input.charAt(1).toLowerCase() === "x") { + input = input.substring(2); + R = 16; + } else if (input.length >= 2 && input.charAt(0) === "0") { + input = input.substring(1); + R = 8; + } + if (input === "") { + return 0; + } + const regex = R === 10 ? /[^0-9]/ : R === 16 ? /[^0-9A-Fa-f]/ : /[^0-7]/; + if (regex.test(input)) { + return failure; + } + return parseInt(input, R); + } + function parseIPv4(input) { + const parts = input.split("."); + if (parts[parts.length - 1] === "") { + if (parts.length > 1) { + parts.pop(); + } + } + if (parts.length > 4) { + return input; + } + const numbers = []; + for (const part of parts) { + if (part === "") { + return input; + } + const n = parseIPv4Number(part); + if (n === failure) { + return input; + } + numbers.push(n); + } + for (let i = 0;i < numbers.length - 1; ++i) { + if (numbers[i] > 255) { + return failure; + } + } + if (numbers[numbers.length - 1] >= Math.pow(256, 5 - numbers.length)) { + return failure; + } + let ipv4 = numbers.pop(); + let counter = 0; + for (const n of numbers) { + ipv4 += n * Math.pow(256, 3 - counter); + ++counter; + } + return ipv4; + } + function serializeIPv4(address) { + let output = ""; + let n = address; + for (let i = 1;i <= 4; ++i) { + output = String(n % 256) + output; + if (i !== 4) { + output = "." + output; + } + n = Math.floor(n / 256); + } + return output; + } + function parseIPv6(input) { + const address = [0, 0, 0, 0, 0, 0, 0, 0]; + let pieceIndex = 0; + let compress = null; + let pointer = 0; + input = punycode.ucs2.decode(input); + if (input[pointer] === 58) { + if (input[pointer + 1] !== 58) { + return failure; + } + pointer += 2; + ++pieceIndex; + compress = pieceIndex; + } + while (pointer < input.length) { + if (pieceIndex === 8) { + return failure; + } + if (input[pointer] === 58) { + if (compress !== null) { + return failure; + } + ++pointer; + ++pieceIndex; + compress = pieceIndex; + continue; + } + let value = 0; + let length = 0; + while (length < 4 && isASCIIHex(input[pointer])) { + value = value * 16 + parseInt(at(input, pointer), 16); + ++pointer; + ++length; + } + if (input[pointer] === 46) { + if (length === 0) { + return failure; + } + pointer -= length; + if (pieceIndex > 6) { + return failure; + } + let numbersSeen = 0; + while (input[pointer] !== undefined) { + let ipv4Piece = null; + if (numbersSeen > 0) { + if (input[pointer] === 46 && numbersSeen < 4) { + ++pointer; + } else { + return failure; + } + } + if (!isASCIIDigit(input[pointer])) { + return failure; + } + while (isASCIIDigit(input[pointer])) { + const number = parseInt(at(input, pointer)); + if (ipv4Piece === null) { + ipv4Piece = number; + } else if (ipv4Piece === 0) { + return failure; + } else { + ipv4Piece = ipv4Piece * 10 + number; + } + if (ipv4Piece > 255) { + return failure; + } + ++pointer; + } + address[pieceIndex] = address[pieceIndex] * 256 + ipv4Piece; + ++numbersSeen; + if (numbersSeen === 2 || numbersSeen === 4) { + ++pieceIndex; + } + } + if (numbersSeen !== 4) { + return failure; + } + break; + } else if (input[pointer] === 58) { + ++pointer; + if (input[pointer] === undefined) { + return failure; + } + } else if (input[pointer] !== undefined) { + return failure; + } + address[pieceIndex] = value; + ++pieceIndex; + } + if (compress !== null) { + let swaps = pieceIndex - compress; + pieceIndex = 7; + while (pieceIndex !== 0 && swaps > 0) { + const temp = address[compress + swaps - 1]; + address[compress + swaps - 1] = address[pieceIndex]; + address[pieceIndex] = temp; + --pieceIndex; + --swaps; + } + } else if (compress === null && pieceIndex !== 8) { + return failure; + } + return address; + } + function serializeIPv6(address) { + let output = ""; + const seqResult = findLongestZeroSequence(address); + const compress = seqResult.idx; + let ignore0 = false; + for (let pieceIndex = 0;pieceIndex <= 7; ++pieceIndex) { + if (ignore0 && address[pieceIndex] === 0) { + continue; + } else if (ignore0) { + ignore0 = false; + } + if (compress === pieceIndex) { + const separator = pieceIndex === 0 ? "::" : ":"; + output += separator; + ignore0 = true; + continue; + } + output += address[pieceIndex].toString(16); + if (pieceIndex !== 7) { + output += ":"; + } + } + return output; + } + function parseHost(input, isSpecialArg) { + if (input[0] === "[") { + if (input[input.length - 1] !== "]") { + return failure; + } + return parseIPv6(input.substring(1, input.length - 1)); + } + if (!isSpecialArg) { + return parseOpaqueHost(input); + } + const domain = utf8PercentDecode(input); + const asciiDomain = tr46.toASCII(domain, false, tr46.PROCESSING_OPTIONS.NONTRANSITIONAL, false); + if (asciiDomain === null) { + return failure; + } + if (containsForbiddenHostCodePoint(asciiDomain)) { + return failure; + } + const ipv4Host = parseIPv4(asciiDomain); + if (typeof ipv4Host === "number" || ipv4Host === failure) { + return ipv4Host; + } + return asciiDomain; + } + function parseOpaqueHost(input) { + if (containsForbiddenHostCodePointExcludingPercent(input)) { + return failure; + } + let output = ""; + const decoded = punycode.ucs2.decode(input); + for (let i = 0;i < decoded.length; ++i) { + output += percentEncodeChar(decoded[i], isC0ControlPercentEncode); + } + return output; + } + function findLongestZeroSequence(arr) { + let maxIdx = null; + let maxLen = 1; + let currStart = null; + let currLen = 0; + for (let i = 0;i < arr.length; ++i) { + if (arr[i] !== 0) { + if (currLen > maxLen) { + maxIdx = currStart; + maxLen = currLen; + } + currStart = null; + currLen = 0; + } else { + if (currStart === null) { + currStart = i; + } + ++currLen; + } + } + if (currLen > maxLen) { + maxIdx = currStart; + maxLen = currLen; + } + return { + idx: maxIdx, + len: maxLen + }; + } + function serializeHost(host) { + if (typeof host === "number") { + return serializeIPv4(host); + } + if (host instanceof Array) { + return "[" + serializeIPv6(host) + "]"; + } + return host; + } + function trimControlChars(url) { + return url.replace(/^[\u0000-\u001F\u0020]+|[\u0000-\u001F\u0020]+$/g, ""); + } + function trimTabAndNewline(url) { + return url.replace(/\u0009|\u000A|\u000D/g, ""); + } + function shortenPath(url) { + const path = url.path; + if (path.length === 0) { + return; + } + if (url.scheme === "file" && path.length === 1 && isNormalizedWindowsDriveLetter(path[0])) { + return; + } + path.pop(); + } + function includesCredentials(url) { + return url.username !== "" || url.password !== ""; + } + function cannotHaveAUsernamePasswordPort(url) { + return url.host === null || url.host === "" || url.cannotBeABaseURL || url.scheme === "file"; + } + function isNormalizedWindowsDriveLetter(string) { + return /^[A-Za-z]:$/.test(string); + } + function URLStateMachine(input, base, encodingOverride, url, stateOverride) { + this.pointer = 0; + this.input = input; + this.base = base || null; + this.encodingOverride = encodingOverride || "utf-8"; + this.stateOverride = stateOverride; + this.url = url; + this.failure = false; + this.parseError = false; + if (!this.url) { + this.url = { + scheme: "", + username: "", + password: "", + host: null, + port: null, + path: [], + query: null, + fragment: null, + cannotBeABaseURL: false + }; + const res2 = trimControlChars(this.input); + if (res2 !== this.input) { + this.parseError = true; + } + this.input = res2; + } + const res = trimTabAndNewline(this.input); + if (res !== this.input) { + this.parseError = true; + } + this.input = res; + this.state = stateOverride || "scheme start"; + this.buffer = ""; + this.atFlag = false; + this.arrFlag = false; + this.passwordTokenSeenFlag = false; + this.input = punycode.ucs2.decode(this.input); + for (;this.pointer <= this.input.length; ++this.pointer) { + const c = this.input[this.pointer]; + const cStr = isNaN(c) ? undefined : String.fromCodePoint(c); + const ret = this["parse " + this.state](c, cStr); + if (!ret) { + break; + } else if (ret === failure) { + this.failure = true; + break; + } + } + } + URLStateMachine.prototype["parse scheme start"] = function parseSchemeStart(c, cStr) { + if (isASCIIAlpha(c)) { + this.buffer += cStr.toLowerCase(); + this.state = "scheme"; + } else if (!this.stateOverride) { + this.state = "no scheme"; + --this.pointer; + } else { + this.parseError = true; + return failure; + } + return true; + }; + URLStateMachine.prototype["parse scheme"] = function parseScheme(c, cStr) { + if (isASCIIAlphanumeric(c) || c === 43 || c === 45 || c === 46) { + this.buffer += cStr.toLowerCase(); + } else if (c === 58) { + if (this.stateOverride) { + if (isSpecial(this.url) && !isSpecialScheme(this.buffer)) { + return false; + } + if (!isSpecial(this.url) && isSpecialScheme(this.buffer)) { + return false; + } + if ((includesCredentials(this.url) || this.url.port !== null) && this.buffer === "file") { + return false; + } + if (this.url.scheme === "file" && (this.url.host === "" || this.url.host === null)) { + return false; + } + } + this.url.scheme = this.buffer; + this.buffer = ""; + if (this.stateOverride) { + return false; + } + if (this.url.scheme === "file") { + if (this.input[this.pointer + 1] !== 47 || this.input[this.pointer + 2] !== 47) { + this.parseError = true; + } + this.state = "file"; + } else if (isSpecial(this.url) && this.base !== null && this.base.scheme === this.url.scheme) { + this.state = "special relative or authority"; + } else if (isSpecial(this.url)) { + this.state = "special authority slashes"; + } else if (this.input[this.pointer + 1] === 47) { + this.state = "path or authority"; + ++this.pointer; + } else { + this.url.cannotBeABaseURL = true; + this.url.path.push(""); + this.state = "cannot-be-a-base-URL path"; + } + } else if (!this.stateOverride) { + this.buffer = ""; + this.state = "no scheme"; + this.pointer = -1; + } else { + this.parseError = true; + return failure; + } + return true; + }; + URLStateMachine.prototype["parse no scheme"] = function parseNoScheme(c) { + if (this.base === null || this.base.cannotBeABaseURL && c !== 35) { + return failure; + } else if (this.base.cannotBeABaseURL && c === 35) { + this.url.scheme = this.base.scheme; + this.url.path = this.base.path.slice(); + this.url.query = this.base.query; + this.url.fragment = ""; + this.url.cannotBeABaseURL = true; + this.state = "fragment"; + } else if (this.base.scheme === "file") { + this.state = "file"; + --this.pointer; + } else { + this.state = "relative"; + --this.pointer; + } + return true; + }; + URLStateMachine.prototype["parse special relative or authority"] = function parseSpecialRelativeOrAuthority(c) { + if (c === 47 && this.input[this.pointer + 1] === 47) { + this.state = "special authority ignore slashes"; + ++this.pointer; + } else { + this.parseError = true; + this.state = "relative"; + --this.pointer; + } + return true; + }; + URLStateMachine.prototype["parse path or authority"] = function parsePathOrAuthority(c) { + if (c === 47) { + this.state = "authority"; + } else { + this.state = "path"; + --this.pointer; + } + return true; + }; + URLStateMachine.prototype["parse relative"] = function parseRelative(c) { + this.url.scheme = this.base.scheme; + if (isNaN(c)) { + this.url.username = this.base.username; + this.url.password = this.base.password; + this.url.host = this.base.host; + this.url.port = this.base.port; + this.url.path = this.base.path.slice(); + this.url.query = this.base.query; + } else if (c === 47) { + this.state = "relative slash"; + } else if (c === 63) { + this.url.username = this.base.username; + this.url.password = this.base.password; + this.url.host = this.base.host; + this.url.port = this.base.port; + this.url.path = this.base.path.slice(); + this.url.query = ""; + this.state = "query"; + } else if (c === 35) { + this.url.username = this.base.username; + this.url.password = this.base.password; + this.url.host = this.base.host; + this.url.port = this.base.port; + this.url.path = this.base.path.slice(); + this.url.query = this.base.query; + this.url.fragment = ""; + this.state = "fragment"; + } else if (isSpecial(this.url) && c === 92) { + this.parseError = true; + this.state = "relative slash"; + } else { + this.url.username = this.base.username; + this.url.password = this.base.password; + this.url.host = this.base.host; + this.url.port = this.base.port; + this.url.path = this.base.path.slice(0, this.base.path.length - 1); + this.state = "path"; + --this.pointer; + } + return true; + }; + URLStateMachine.prototype["parse relative slash"] = function parseRelativeSlash(c) { + if (isSpecial(this.url) && (c === 47 || c === 92)) { + if (c === 92) { + this.parseError = true; + } + this.state = "special authority ignore slashes"; + } else if (c === 47) { + this.state = "authority"; + } else { + this.url.username = this.base.username; + this.url.password = this.base.password; + this.url.host = this.base.host; + this.url.port = this.base.port; + this.state = "path"; + --this.pointer; + } + return true; + }; + URLStateMachine.prototype["parse special authority slashes"] = function parseSpecialAuthoritySlashes(c) { + if (c === 47 && this.input[this.pointer + 1] === 47) { + this.state = "special authority ignore slashes"; + ++this.pointer; + } else { + this.parseError = true; + this.state = "special authority ignore slashes"; + --this.pointer; + } + return true; + }; + URLStateMachine.prototype["parse special authority ignore slashes"] = function parseSpecialAuthorityIgnoreSlashes(c) { + if (c !== 47 && c !== 92) { + this.state = "authority"; + --this.pointer; + } else { + this.parseError = true; + } + return true; + }; + URLStateMachine.prototype["parse authority"] = function parseAuthority(c, cStr) { + if (c === 64) { + this.parseError = true; + if (this.atFlag) { + this.buffer = "%40" + this.buffer; + } + this.atFlag = true; + const len = countSymbols(this.buffer); + for (let pointer = 0;pointer < len; ++pointer) { + const codePoint = this.buffer.codePointAt(pointer); + if (codePoint === 58 && !this.passwordTokenSeenFlag) { + this.passwordTokenSeenFlag = true; + continue; + } + const encodedCodePoints = percentEncodeChar(codePoint, isUserinfoPercentEncode); + if (this.passwordTokenSeenFlag) { + this.url.password += encodedCodePoints; + } else { + this.url.username += encodedCodePoints; + } + } + this.buffer = ""; + } else if (isNaN(c) || c === 47 || c === 63 || c === 35 || isSpecial(this.url) && c === 92) { + if (this.atFlag && this.buffer === "") { + this.parseError = true; + return failure; + } + this.pointer -= countSymbols(this.buffer) + 1; + this.buffer = ""; + this.state = "host"; + } else { + this.buffer += cStr; + } + return true; + }; + URLStateMachine.prototype["parse hostname"] = URLStateMachine.prototype["parse host"] = function parseHostName(c, cStr) { + if (this.stateOverride && this.url.scheme === "file") { + --this.pointer; + this.state = "file host"; + } else if (c === 58 && !this.arrFlag) { + if (this.buffer === "") { + this.parseError = true; + return failure; + } + const host = parseHost(this.buffer, isSpecial(this.url)); + if (host === failure) { + return failure; + } + this.url.host = host; + this.buffer = ""; + this.state = "port"; + if (this.stateOverride === "hostname") { + return false; + } + } else if (isNaN(c) || c === 47 || c === 63 || c === 35 || isSpecial(this.url) && c === 92) { + --this.pointer; + if (isSpecial(this.url) && this.buffer === "") { + this.parseError = true; + return failure; + } else if (this.stateOverride && this.buffer === "" && (includesCredentials(this.url) || this.url.port !== null)) { + this.parseError = true; + return false; + } + const host = parseHost(this.buffer, isSpecial(this.url)); + if (host === failure) { + return failure; + } + this.url.host = host; + this.buffer = ""; + this.state = "path start"; + if (this.stateOverride) { + return false; + } + } else { + if (c === 91) { + this.arrFlag = true; + } else if (c === 93) { + this.arrFlag = false; + } + this.buffer += cStr; + } + return true; + }; + URLStateMachine.prototype["parse port"] = function parsePort(c, cStr) { + if (isASCIIDigit(c)) { + this.buffer += cStr; + } else if (isNaN(c) || c === 47 || c === 63 || c === 35 || isSpecial(this.url) && c === 92 || this.stateOverride) { + if (this.buffer !== "") { + const port = parseInt(this.buffer); + if (port > Math.pow(2, 16) - 1) { + this.parseError = true; + return failure; + } + this.url.port = port === defaultPort(this.url.scheme) ? null : port; + this.buffer = ""; + } + if (this.stateOverride) { + return false; + } + this.state = "path start"; + --this.pointer; + } else { + this.parseError = true; + return failure; + } + return true; + }; + var fileOtherwiseCodePoints = new Set([47, 92, 63, 35]); + URLStateMachine.prototype["parse file"] = function parseFile(c) { + this.url.scheme = "file"; + if (c === 47 || c === 92) { + if (c === 92) { + this.parseError = true; + } + this.state = "file slash"; + } else if (this.base !== null && this.base.scheme === "file") { + if (isNaN(c)) { + this.url.host = this.base.host; + this.url.path = this.base.path.slice(); + this.url.query = this.base.query; + } else if (c === 63) { + this.url.host = this.base.host; + this.url.path = this.base.path.slice(); + this.url.query = ""; + this.state = "query"; + } else if (c === 35) { + this.url.host = this.base.host; + this.url.path = this.base.path.slice(); + this.url.query = this.base.query; + this.url.fragment = ""; + this.state = "fragment"; + } else { + if (this.input.length - this.pointer - 1 === 0 || !isWindowsDriveLetterCodePoints(c, this.input[this.pointer + 1]) || this.input.length - this.pointer - 1 >= 2 && !fileOtherwiseCodePoints.has(this.input[this.pointer + 2])) { + this.url.host = this.base.host; + this.url.path = this.base.path.slice(); + shortenPath(this.url); + } else { + this.parseError = true; + } + this.state = "path"; + --this.pointer; + } + } else { + this.state = "path"; + --this.pointer; + } + return true; + }; + URLStateMachine.prototype["parse file slash"] = function parseFileSlash(c) { + if (c === 47 || c === 92) { + if (c === 92) { + this.parseError = true; + } + this.state = "file host"; + } else { + if (this.base !== null && this.base.scheme === "file") { + if (isNormalizedWindowsDriveLetterString(this.base.path[0])) { + this.url.path.push(this.base.path[0]); + } else { + this.url.host = this.base.host; + } + } + this.state = "path"; + --this.pointer; + } + return true; + }; + URLStateMachine.prototype["parse file host"] = function parseFileHost(c, cStr) { + if (isNaN(c) || c === 47 || c === 92 || c === 63 || c === 35) { + --this.pointer; + if (!this.stateOverride && isWindowsDriveLetterString(this.buffer)) { + this.parseError = true; + this.state = "path"; + } else if (this.buffer === "") { + this.url.host = ""; + if (this.stateOverride) { + return false; + } + this.state = "path start"; + } else { + let host = parseHost(this.buffer, isSpecial(this.url)); + if (host === failure) { + return failure; + } + if (host === "localhost") { + host = ""; + } + this.url.host = host; + if (this.stateOverride) { + return false; + } + this.buffer = ""; + this.state = "path start"; + } + } else { + this.buffer += cStr; + } + return true; + }; + URLStateMachine.prototype["parse path start"] = function parsePathStart(c) { + if (isSpecial(this.url)) { + if (c === 92) { + this.parseError = true; + } + this.state = "path"; + if (c !== 47 && c !== 92) { + --this.pointer; + } + } else if (!this.stateOverride && c === 63) { + this.url.query = ""; + this.state = "query"; + } else if (!this.stateOverride && c === 35) { + this.url.fragment = ""; + this.state = "fragment"; + } else if (c !== undefined) { + this.state = "path"; + if (c !== 47) { + --this.pointer; + } + } + return true; + }; + URLStateMachine.prototype["parse path"] = function parsePath(c) { + if (isNaN(c) || c === 47 || isSpecial(this.url) && c === 92 || !this.stateOverride && (c === 63 || c === 35)) { + if (isSpecial(this.url) && c === 92) { + this.parseError = true; + } + if (isDoubleDot(this.buffer)) { + shortenPath(this.url); + if (c !== 47 && !(isSpecial(this.url) && c === 92)) { + this.url.path.push(""); + } + } else if (isSingleDot(this.buffer) && c !== 47 && !(isSpecial(this.url) && c === 92)) { + this.url.path.push(""); + } else if (!isSingleDot(this.buffer)) { + if (this.url.scheme === "file" && this.url.path.length === 0 && isWindowsDriveLetterString(this.buffer)) { + if (this.url.host !== "" && this.url.host !== null) { + this.parseError = true; + this.url.host = ""; + } + this.buffer = this.buffer[0] + ":"; + } + this.url.path.push(this.buffer); + } + this.buffer = ""; + if (this.url.scheme === "file" && (c === undefined || c === 63 || c === 35)) { + while (this.url.path.length > 1 && this.url.path[0] === "") { + this.parseError = true; + this.url.path.shift(); + } + } + if (c === 63) { + this.url.query = ""; + this.state = "query"; + } + if (c === 35) { + this.url.fragment = ""; + this.state = "fragment"; + } + } else { + if (c === 37 && (!isASCIIHex(this.input[this.pointer + 1]) || !isASCIIHex(this.input[this.pointer + 2]))) { + this.parseError = true; + } + this.buffer += percentEncodeChar(c, isPathPercentEncode); + } + return true; + }; + URLStateMachine.prototype["parse cannot-be-a-base-URL path"] = function parseCannotBeABaseURLPath(c) { + if (c === 63) { + this.url.query = ""; + this.state = "query"; + } else if (c === 35) { + this.url.fragment = ""; + this.state = "fragment"; + } else { + if (!isNaN(c) && c !== 37) { + this.parseError = true; + } + if (c === 37 && (!isASCIIHex(this.input[this.pointer + 1]) || !isASCIIHex(this.input[this.pointer + 2]))) { + this.parseError = true; + } + if (!isNaN(c)) { + this.url.path[0] = this.url.path[0] + percentEncodeChar(c, isC0ControlPercentEncode); + } + } + return true; + }; + URLStateMachine.prototype["parse query"] = function parseQuery(c, cStr) { + if (isNaN(c) || !this.stateOverride && c === 35) { + if (!isSpecial(this.url) || this.url.scheme === "ws" || this.url.scheme === "wss") { + this.encodingOverride = "utf-8"; + } + const buffer = new Buffer(this.buffer); + for (let i = 0;i < buffer.length; ++i) { + if (buffer[i] < 33 || buffer[i] > 126 || buffer[i] === 34 || buffer[i] === 35 || buffer[i] === 60 || buffer[i] === 62) { + this.url.query += percentEncode(buffer[i]); + } else { + this.url.query += String.fromCodePoint(buffer[i]); + } + } + this.buffer = ""; + if (c === 35) { + this.url.fragment = ""; + this.state = "fragment"; + } + } else { + if (c === 37 && (!isASCIIHex(this.input[this.pointer + 1]) || !isASCIIHex(this.input[this.pointer + 2]))) { + this.parseError = true; + } + this.buffer += cStr; + } + return true; + }; + URLStateMachine.prototype["parse fragment"] = function parseFragment(c) { + if (isNaN(c)) { + } else if (c === 0) { + this.parseError = true; + } else { + if (c === 37 && (!isASCIIHex(this.input[this.pointer + 1]) || !isASCIIHex(this.input[this.pointer + 2]))) { + this.parseError = true; + } + this.url.fragment += percentEncodeChar(c, isC0ControlPercentEncode); + } + return true; + }; + function serializeURL(url, excludeFragment) { + let output = url.scheme + ":"; + if (url.host !== null) { + output += "//"; + if (url.username !== "" || url.password !== "") { + output += url.username; + if (url.password !== "") { + output += ":" + url.password; + } + output += "@"; + } + output += serializeHost(url.host); + if (url.port !== null) { + output += ":" + url.port; + } + } else if (url.host === null && url.scheme === "file") { + output += "//"; + } + if (url.cannotBeABaseURL) { + output += url.path[0]; + } else { + for (const string of url.path) { + output += "/" + string; + } + } + if (url.query !== null) { + output += "?" + url.query; + } + if (!excludeFragment && url.fragment !== null) { + output += "#" + url.fragment; + } + return output; + } + function serializeOrigin(tuple) { + let result = tuple.scheme + "://"; + result += serializeHost(tuple.host); + if (tuple.port !== null) { + result += ":" + tuple.port; + } + return result; + } + module2.exports.serializeURL = serializeURL; + module2.exports.serializeURLOrigin = function(url) { + switch (url.scheme) { + case "blob": + try { + return module2.exports.serializeURLOrigin(module2.exports.parseURL(url.path[0])); + } catch (e) { + return "null"; + } + case "ftp": + case "gopher": + case "http": + case "https": + case "ws": + case "wss": + return serializeOrigin({ + scheme: url.scheme, + host: url.host, + port: url.port + }); + case "file": + return "file://"; + default: + return "null"; + } + }; + module2.exports.basicURLParse = function(input, options) { + if (options === undefined) { + options = {}; + } + const usm = new URLStateMachine(input, options.baseURL, options.encodingOverride, options.url, options.stateOverride); + if (usm.failure) { + return "failure"; + } + return usm.url; + }; + module2.exports.setTheUsername = function(url, username) { + url.username = ""; + const decoded = punycode.ucs2.decode(username); + for (let i = 0;i < decoded.length; ++i) { + url.username += percentEncodeChar(decoded[i], isUserinfoPercentEncode); + } + }; + module2.exports.setThePassword = function(url, password) { + url.password = ""; + const decoded = punycode.ucs2.decode(password); + for (let i = 0;i < decoded.length; ++i) { + url.password += percentEncodeChar(decoded[i], isUserinfoPercentEncode); + } + }; + module2.exports.serializeHost = serializeHost; + module2.exports.cannotHaveAUsernamePasswordPort = cannotHaveAUsernamePasswordPort; + module2.exports.serializeInteger = function(integer) { + return String(integer); + }; + module2.exports.parseURL = function(input, options) { + if (options === undefined) { + options = {}; + } + return module2.exports.basicURLParse(input, { baseURL: options.baseURL, encodingOverride: options.encodingOverride }); + }; +}); + +// node_modules/whatwg-url/lib/URL-impl.js +var require_URL_impl = __commonJS((exports2) => { + var usm = require_url_state_machine(); + exports2.implementation = class URLImpl { + constructor(constructorArgs) { + const url = constructorArgs[0]; + const base = constructorArgs[1]; + let parsedBase = null; + if (base !== undefined) { + parsedBase = usm.basicURLParse(base); + if (parsedBase === "failure") { + throw new TypeError("Invalid base URL"); + } + } + const parsedURL = usm.basicURLParse(url, { baseURL: parsedBase }); + if (parsedURL === "failure") { + throw new TypeError("Invalid URL"); + } + this._url = parsedURL; + } + get href() { + return usm.serializeURL(this._url); + } + set href(v) { + const parsedURL = usm.basicURLParse(v); + if (parsedURL === "failure") { + throw new TypeError("Invalid URL"); + } + this._url = parsedURL; + } + get origin() { + return usm.serializeURLOrigin(this._url); + } + get protocol() { + return this._url.scheme + ":"; + } + set protocol(v) { + usm.basicURLParse(v + ":", { url: this._url, stateOverride: "scheme start" }); + } + get username() { + return this._url.username; + } + set username(v) { + if (usm.cannotHaveAUsernamePasswordPort(this._url)) { + return; + } + usm.setTheUsername(this._url, v); + } + get password() { + return this._url.password; + } + set password(v) { + if (usm.cannotHaveAUsernamePasswordPort(this._url)) { + return; + } + usm.setThePassword(this._url, v); + } + get host() { + const url = this._url; + if (url.host === null) { + return ""; + } + if (url.port === null) { + return usm.serializeHost(url.host); + } + return usm.serializeHost(url.host) + ":" + usm.serializeInteger(url.port); + } + set host(v) { + if (this._url.cannotBeABaseURL) { + return; + } + usm.basicURLParse(v, { url: this._url, stateOverride: "host" }); + } + get hostname() { + if (this._url.host === null) { + return ""; + } + return usm.serializeHost(this._url.host); + } + set hostname(v) { + if (this._url.cannotBeABaseURL) { + return; + } + usm.basicURLParse(v, { url: this._url, stateOverride: "hostname" }); + } + get port() { + if (this._url.port === null) { + return ""; + } + return usm.serializeInteger(this._url.port); + } + set port(v) { + if (usm.cannotHaveAUsernamePasswordPort(this._url)) { + return; + } + if (v === "") { + this._url.port = null; + } else { + usm.basicURLParse(v, { url: this._url, stateOverride: "port" }); + } + } + get pathname() { + if (this._url.cannotBeABaseURL) { + return this._url.path[0]; + } + if (this._url.path.length === 0) { + return ""; + } + return "/" + this._url.path.join("/"); + } + set pathname(v) { + if (this._url.cannotBeABaseURL) { + return; + } + this._url.path = []; + usm.basicURLParse(v, { url: this._url, stateOverride: "path start" }); + } + get search() { + if (this._url.query === null || this._url.query === "") { + return ""; + } + return "?" + this._url.query; + } + set search(v) { + const url = this._url; + if (v === "") { + url.query = null; + return; + } + const input = v[0] === "?" ? v.substring(1) : v; + url.query = ""; + usm.basicURLParse(input, { url, stateOverride: "query" }); + } + get hash() { + if (this._url.fragment === null || this._url.fragment === "") { + return ""; + } + return "#" + this._url.fragment; + } + set hash(v) { + if (v === "") { + this._url.fragment = null; + return; + } + const input = v[0] === "#" ? v.substring(1) : v; + this._url.fragment = ""; + usm.basicURLParse(input, { url: this._url, stateOverride: "fragment" }); + } + toJSON() { + return this.href; + } + }; +}); + +// node_modules/whatwg-url/lib/URL.js +var require_URL = __commonJS((exports2, module2) => { + var conversions = require_lib3(); + var utils = require_utils8(); + var Impl = require_URL_impl(); + var impl = utils.implSymbol; + function URL2(url) { + if (!this || this[impl] || !(this instanceof URL2)) { + throw new TypeError("Failed to construct 'URL': Please use the 'new' operator, this DOM object constructor cannot be called as a function."); + } + if (arguments.length < 1) { + throw new TypeError("Failed to construct 'URL': 1 argument required, but only " + arguments.length + " present."); + } + const args = []; + for (let i = 0;i < arguments.length && i < 2; ++i) { + args[i] = arguments[i]; + } + args[0] = conversions["USVString"](args[0]); + if (args[1] !== undefined) { + args[1] = conversions["USVString"](args[1]); + } + module2.exports.setup(this, args); + } + URL2.prototype.toJSON = function toJSON() { + if (!this || !module2.exports.is(this)) { + throw new TypeError("Illegal invocation"); + } + const args = []; + for (let i = 0;i < arguments.length && i < 0; ++i) { + args[i] = arguments[i]; + } + return this[impl].toJSON.apply(this[impl], args); + }; + Object.defineProperty(URL2.prototype, "href", { + get() { + return this[impl].href; + }, + set(V) { + V = conversions["USVString"](V); + this[impl].href = V; + }, + enumerable: true, + configurable: true + }); + URL2.prototype.toString = function() { + if (!this || !module2.exports.is(this)) { + throw new TypeError("Illegal invocation"); + } + return this.href; + }; + Object.defineProperty(URL2.prototype, "origin", { + get() { + return this[impl].origin; + }, + enumerable: true, + configurable: true + }); + Object.defineProperty(URL2.prototype, "protocol", { + get() { + return this[impl].protocol; + }, + set(V) { + V = conversions["USVString"](V); + this[impl].protocol = V; + }, + enumerable: true, + configurable: true + }); + Object.defineProperty(URL2.prototype, "username", { + get() { + return this[impl].username; + }, + set(V) { + V = conversions["USVString"](V); + this[impl].username = V; + }, + enumerable: true, + configurable: true + }); + Object.defineProperty(URL2.prototype, "password", { + get() { + return this[impl].password; + }, + set(V) { + V = conversions["USVString"](V); + this[impl].password = V; + }, + enumerable: true, + configurable: true + }); + Object.defineProperty(URL2.prototype, "host", { + get() { + return this[impl].host; + }, + set(V) { + V = conversions["USVString"](V); + this[impl].host = V; + }, + enumerable: true, + configurable: true + }); + Object.defineProperty(URL2.prototype, "hostname", { + get() { + return this[impl].hostname; + }, + set(V) { + V = conversions["USVString"](V); + this[impl].hostname = V; + }, + enumerable: true, + configurable: true + }); + Object.defineProperty(URL2.prototype, "port", { + get() { + return this[impl].port; + }, + set(V) { + V = conversions["USVString"](V); + this[impl].port = V; + }, + enumerable: true, + configurable: true + }); + Object.defineProperty(URL2.prototype, "pathname", { + get() { + return this[impl].pathname; + }, + set(V) { + V = conversions["USVString"](V); + this[impl].pathname = V; + }, + enumerable: true, + configurable: true + }); + Object.defineProperty(URL2.prototype, "search", { + get() { + return this[impl].search; + }, + set(V) { + V = conversions["USVString"](V); + this[impl].search = V; + }, + enumerable: true, + configurable: true + }); + Object.defineProperty(URL2.prototype, "hash", { + get() { + return this[impl].hash; + }, + set(V) { + V = conversions["USVString"](V); + this[impl].hash = V; + }, + enumerable: true, + configurable: true + }); + module2.exports = { + is(obj) { + return !!obj && obj[impl] instanceof Impl.implementation; + }, + create(constructorArgs, privateData) { + let obj = Object.create(URL2.prototype); + this.setup(obj, constructorArgs, privateData); + return obj; + }, + setup(obj, constructorArgs, privateData) { + if (!privateData) + privateData = {}; + privateData.wrapper = obj; + obj[impl] = new Impl.implementation(constructorArgs, privateData); + obj[impl][utils.wrapperSymbol] = obj; + }, + interface: URL2, + expose: { + Window: { URL: URL2 }, + Worker: { URL: URL2 } + } + }; +}); + +// node_modules/whatwg-url/lib/public-api.js +var require_public_api = __commonJS((exports2) => { + exports2.URL = require_URL().interface; + exports2.serializeURL = require_url_state_machine().serializeURL; + exports2.serializeURLOrigin = require_url_state_machine().serializeURLOrigin; + exports2.basicURLParse = require_url_state_machine().basicURLParse; + exports2.setTheUsername = require_url_state_machine().setTheUsername; + exports2.setThePassword = require_url_state_machine().setThePassword; + exports2.serializeHost = require_url_state_machine().serializeHost; + exports2.serializeInteger = require_url_state_machine().serializeInteger; + exports2.parseURL = require_url_state_machine().parseURL; +}); + +// node_modules/node-fetch/lib/index.js +var require_lib4 = __commonJS((exports2, module2) => { + Object.defineProperty(exports2, "__esModule", { value: true }); + function _interopDefault(ex) { + return ex && typeof ex === "object" && "default" in ex ? ex["default"] : ex; + } + var Stream = _interopDefault(require("stream")); + var http = _interopDefault(require("http")); + var Url = _interopDefault(require("url")); + var whatwgUrl = _interopDefault(require_public_api()); + var https = _interopDefault(require("https")); + var zlib = _interopDefault(require("zlib")); + var Readable = Stream.Readable; + var BUFFER = Symbol("buffer"); + var TYPE = Symbol("type"); + + class Blob2 { + constructor() { + this[TYPE] = ""; + const blobParts = arguments[0]; + const options = arguments[1]; + const buffers = []; + let size = 0; + if (blobParts) { + const a = blobParts; + const length = Number(a.length); + for (let i = 0;i < length; i++) { + const element = a[i]; + let buffer; + if (element instanceof Buffer) { + buffer = element; + } else if (ArrayBuffer.isView(element)) { + buffer = Buffer.from(element.buffer, element.byteOffset, element.byteLength); + } else if (element instanceof ArrayBuffer) { + buffer = Buffer.from(element); + } else if (element instanceof Blob2) { + buffer = element[BUFFER]; + } else { + buffer = Buffer.from(typeof element === "string" ? element : String(element)); + } + size += buffer.length; + buffers.push(buffer); + } + } + this[BUFFER] = Buffer.concat(buffers); + let type = options && options.type !== undefined && String(options.type).toLowerCase(); + if (type && !/[^\u0020-\u007E]/.test(type)) { + this[TYPE] = type; + } + } + get size() { + return this[BUFFER].length; + } + get type() { + return this[TYPE]; + } + text() { + return Promise.resolve(this[BUFFER].toString()); + } + arrayBuffer() { + const buf = this[BUFFER]; + const ab = buf.buffer.slice(buf.byteOffset, buf.byteOffset + buf.byteLength); + return Promise.resolve(ab); + } + stream() { + const readable = new Readable; + readable._read = function() { + }; + readable.push(this[BUFFER]); + readable.push(null); + return readable; + } + toString() { + return "[object Blob]"; + } + slice() { + const size = this.size; + const start = arguments[0]; + const end = arguments[1]; + let relativeStart, relativeEnd; + if (start === undefined) { + relativeStart = 0; + } else if (start < 0) { + relativeStart = Math.max(size + start, 0); + } else { + relativeStart = Math.min(start, size); + } + if (end === undefined) { + relativeEnd = size; + } else if (end < 0) { + relativeEnd = Math.max(size + end, 0); + } else { + relativeEnd = Math.min(end, size); + } + const span = Math.max(relativeEnd - relativeStart, 0); + const buffer = this[BUFFER]; + const slicedBuffer = buffer.slice(relativeStart, relativeStart + span); + const blob = new Blob2([], { type: arguments[2] }); + blob[BUFFER] = slicedBuffer; + return blob; + } + } + Object.defineProperties(Blob2.prototype, { + size: { enumerable: true }, + type: { enumerable: true }, + slice: { enumerable: true } + }); + Object.defineProperty(Blob2.prototype, Symbol.toStringTag, { + value: "Blob", + writable: false, + enumerable: false, + configurable: true + }); + function FetchError(message, type, systemError) { + Error.call(this, message); + this.message = message; + this.type = type; + if (systemError) { + this.code = this.errno = systemError.code; + } + Error.captureStackTrace(this, this.constructor); + } + FetchError.prototype = Object.create(Error.prototype); + FetchError.prototype.constructor = FetchError; + FetchError.prototype.name = "FetchError"; + var convert; + try { + convert = (()=>{throw new Error(`Cannot require module "encoding"`);})().convert; + } catch (e) { + } + var INTERNALS = Symbol("Body internals"); + var PassThrough = Stream.PassThrough; + function Body(body) { + var _this = this; + var _ref = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {}, _ref$size = _ref.size; + let size = _ref$size === undefined ? 0 : _ref$size; + var _ref$timeout = _ref.timeout; + let timeout = _ref$timeout === undefined ? 0 : _ref$timeout; + if (body == null) { + body = null; + } else if (isURLSearchParams(body)) { + body = Buffer.from(body.toString()); + } else if (isBlob(body)) + ; + else if (Buffer.isBuffer(body)) + ; + else if (Object.prototype.toString.call(body) === "[object ArrayBuffer]") { + body = Buffer.from(body); + } else if (ArrayBuffer.isView(body)) { + body = Buffer.from(body.buffer, body.byteOffset, body.byteLength); + } else if (body instanceof Stream) + ; + else { + body = Buffer.from(String(body)); + } + this[INTERNALS] = { + body, + disturbed: false, + error: null + }; + this.size = size; + this.timeout = timeout; + if (body instanceof Stream) { + body.on("error", function(err) { + const error = err.name === "AbortError" ? err : new FetchError(`Invalid response body while trying to fetch ${_this.url}: ${err.message}`, "system", err); + _this[INTERNALS].error = error; + }); + } + } + Body.prototype = { + get body() { + return this[INTERNALS].body; + }, + get bodyUsed() { + return this[INTERNALS].disturbed; + }, + arrayBuffer() { + return consumeBody.call(this).then(function(buf) { + return buf.buffer.slice(buf.byteOffset, buf.byteOffset + buf.byteLength); + }); + }, + blob() { + let ct = this.headers && this.headers.get("content-type") || ""; + return consumeBody.call(this).then(function(buf) { + return Object.assign(new Blob2([], { + type: ct.toLowerCase() + }), { + [BUFFER]: buf + }); + }); + }, + json() { + var _this2 = this; + return consumeBody.call(this).then(function(buffer) { + try { + return JSON.parse(buffer.toString()); + } catch (err) { + return Body.Promise.reject(new FetchError(`invalid json response body at ${_this2.url} reason: ${err.message}`, "invalid-json")); + } + }); + }, + text() { + return consumeBody.call(this).then(function(buffer) { + return buffer.toString(); + }); + }, + buffer() { + return consumeBody.call(this); + }, + textConverted() { + var _this3 = this; + return consumeBody.call(this).then(function(buffer) { + return convertBody(buffer, _this3.headers); + }); + } + }; + Object.defineProperties(Body.prototype, { + body: { enumerable: true }, + bodyUsed: { enumerable: true }, + arrayBuffer: { enumerable: true }, + blob: { enumerable: true }, + json: { enumerable: true }, + text: { enumerable: true } + }); + Body.mixIn = function(proto) { + for (const name of Object.getOwnPropertyNames(Body.prototype)) { + if (!(name in proto)) { + const desc = Object.getOwnPropertyDescriptor(Body.prototype, name); + Object.defineProperty(proto, name, desc); + } + } + }; + function consumeBody() { + var _this4 = this; + if (this[INTERNALS].disturbed) { + return Body.Promise.reject(new TypeError(`body used already for: ${this.url}`)); + } + this[INTERNALS].disturbed = true; + if (this[INTERNALS].error) { + return Body.Promise.reject(this[INTERNALS].error); + } + let body = this.body; + if (body === null) { + return Body.Promise.resolve(Buffer.alloc(0)); + } + if (isBlob(body)) { + body = body.stream(); + } + if (Buffer.isBuffer(body)) { + return Body.Promise.resolve(body); + } + if (!(body instanceof Stream)) { + return Body.Promise.resolve(Buffer.alloc(0)); + } + let accum = []; + let accumBytes = 0; + let abort = false; + return new Body.Promise(function(resolve, reject) { + let resTimeout; + if (_this4.timeout) { + resTimeout = setTimeout(function() { + abort = true; + reject(new FetchError(`Response timeout while trying to fetch ${_this4.url} (over ${_this4.timeout}ms)`, "body-timeout")); + }, _this4.timeout); + } + body.on("error", function(err) { + if (err.name === "AbortError") { + abort = true; + reject(err); + } else { + reject(new FetchError(`Invalid response body while trying to fetch ${_this4.url}: ${err.message}`, "system", err)); + } + }); + body.on("data", function(chunk) { + if (abort || chunk === null) { + return; + } + if (_this4.size && accumBytes + chunk.length > _this4.size) { + abort = true; + reject(new FetchError(`content size at ${_this4.url} over limit: ${_this4.size}`, "max-size")); + return; + } + accumBytes += chunk.length; + accum.push(chunk); + }); + body.on("end", function() { + if (abort) { + return; + } + clearTimeout(resTimeout); + try { + resolve(Buffer.concat(accum, accumBytes)); + } catch (err) { + reject(new FetchError(`Could not create Buffer from response body for ${_this4.url}: ${err.message}`, "system", err)); + } + }); + }); + } + function convertBody(buffer, headers) { + if (typeof convert !== "function") { + throw new Error("The package `encoding` must be installed to use the textConverted() function"); + } + const ct = headers.get("content-type"); + let charset = "utf-8"; + let res, str; + if (ct) { + res = /charset=([^;]*)/i.exec(ct); + } + str = buffer.slice(0, 1024).toString(); + if (!res && str) { + res = / 0 && arguments[0] !== undefined ? arguments[0] : undefined; + this[MAP] = Object.create(null); + if (init instanceof Headers2) { + const rawHeaders = init.raw(); + const headerNames = Object.keys(rawHeaders); + for (const headerName of headerNames) { + for (const value of rawHeaders[headerName]) { + this.append(headerName, value); + } + } + return; + } + if (init == null) + ; + else if (typeof init === "object") { + const method = init[Symbol.iterator]; + if (method != null) { + if (typeof method !== "function") { + throw new TypeError("Header pairs must be iterable"); + } + const pairs = []; + for (const pair of init) { + if (typeof pair !== "object" || typeof pair[Symbol.iterator] !== "function") { + throw new TypeError("Each header pair must be iterable"); + } + pairs.push(Array.from(pair)); + } + for (const pair of pairs) { + if (pair.length !== 2) { + throw new TypeError("Each header pair must be a name/value tuple"); + } + this.append(pair[0], pair[1]); + } + } else { + for (const key of Object.keys(init)) { + const value = init[key]; + this.append(key, value); + } + } + } else { + throw new TypeError("Provided initializer must be an object"); + } + } + get(name) { + name = `${name}`; + validateName(name); + const key = find(this[MAP], name); + if (key === undefined) { + return null; + } + return this[MAP][key].join(", "); + } + forEach(callback) { + let thisArg = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : undefined; + let pairs = getHeaders(this); + let i = 0; + while (i < pairs.length) { + var _pairs$i = pairs[i]; + const name = _pairs$i[0], value = _pairs$i[1]; + callback.call(thisArg, value, name, this); + pairs = getHeaders(this); + i++; + } + } + set(name, value) { + name = `${name}`; + value = `${value}`; + validateName(name); + validateValue(value); + const key = find(this[MAP], name); + this[MAP][key !== undefined ? key : name] = [value]; + } + append(name, value) { + name = `${name}`; + value = `${value}`; + validateName(name); + validateValue(value); + const key = find(this[MAP], name); + if (key !== undefined) { + this[MAP][key].push(value); + } else { + this[MAP][name] = [value]; + } + } + has(name) { + name = `${name}`; + validateName(name); + return find(this[MAP], name) !== undefined; + } + delete(name) { + name = `${name}`; + validateName(name); + const key = find(this[MAP], name); + if (key !== undefined) { + delete this[MAP][key]; + } + } + raw() { + return this[MAP]; + } + keys() { + return createHeadersIterator(this, "key"); + } + values() { + return createHeadersIterator(this, "value"); + } + [Symbol.iterator]() { + return createHeadersIterator(this, "key+value"); + } + } + Headers2.prototype.entries = Headers2.prototype[Symbol.iterator]; + Object.defineProperty(Headers2.prototype, Symbol.toStringTag, { + value: "Headers", + writable: false, + enumerable: false, + configurable: true + }); + Object.defineProperties(Headers2.prototype, { + get: { enumerable: true }, + forEach: { enumerable: true }, + set: { enumerable: true }, + append: { enumerable: true }, + has: { enumerable: true }, + delete: { enumerable: true }, + keys: { enumerable: true }, + values: { enumerable: true }, + entries: { enumerable: true } + }); + function getHeaders(headers) { + let kind = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : "key+value"; + const keys = Object.keys(headers[MAP]).sort(); + return keys.map(kind === "key" ? function(k) { + return k.toLowerCase(); + } : kind === "value" ? function(k) { + return headers[MAP][k].join(", "); + } : function(k) { + return [k.toLowerCase(), headers[MAP][k].join(", ")]; + }); + } + var INTERNAL = Symbol("internal"); + function createHeadersIterator(target, kind) { + const iterator = Object.create(HeadersIteratorPrototype); + iterator[INTERNAL] = { + target, + kind, + index: 0 + }; + return iterator; + } + var HeadersIteratorPrototype = Object.setPrototypeOf({ + next() { + if (!this || Object.getPrototypeOf(this) !== HeadersIteratorPrototype) { + throw new TypeError("Value of `this` is not a HeadersIterator"); + } + var _INTERNAL = this[INTERNAL]; + const { target, kind, index } = _INTERNAL; + const values = getHeaders(target, kind); + const len = values.length; + if (index >= len) { + return { + value: undefined, + done: true + }; + } + this[INTERNAL].index = index + 1; + return { + value: values[index], + done: false + }; + } + }, Object.getPrototypeOf(Object.getPrototypeOf([][Symbol.iterator]()))); + Object.defineProperty(HeadersIteratorPrototype, Symbol.toStringTag, { + value: "HeadersIterator", + writable: false, + enumerable: false, + configurable: true + }); + function exportNodeCompatibleHeaders(headers) { + const obj = Object.assign({ __proto__: null }, headers[MAP]); + const hostHeaderKey = find(headers[MAP], "Host"); + if (hostHeaderKey !== undefined) { + obj[hostHeaderKey] = obj[hostHeaderKey][0]; + } + return obj; + } + function createHeadersLenient(obj) { + const headers = new Headers2; + for (const name of Object.keys(obj)) { + if (invalidTokenRegex.test(name)) { + continue; + } + if (Array.isArray(obj[name])) { + for (const val2 of obj[name]) { + if (invalidHeaderCharRegex.test(val2)) { + continue; + } + if (headers[MAP][name] === undefined) { + headers[MAP][name] = [val2]; + } else { + headers[MAP][name].push(val2); + } + } + } else if (!invalidHeaderCharRegex.test(obj[name])) { + headers[MAP][name] = [obj[name]]; + } + } + return headers; + } + var INTERNALS$1 = Symbol("Response internals"); + var STATUS_CODES = http.STATUS_CODES; + + class Response { + constructor() { + let body = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : null; + let opts = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {}; + Body.call(this, body, opts); + const status = opts.status || 200; + const headers = new Headers2(opts.headers); + if (body != null && !headers.has("Content-Type")) { + const contentType = extractContentType(body); + if (contentType) { + headers.append("Content-Type", contentType); + } + } + this[INTERNALS$1] = { + url: opts.url, + status, + statusText: opts.statusText || STATUS_CODES[status], + headers, + counter: opts.counter + }; + } + get url() { + return this[INTERNALS$1].url || ""; + } + get status() { + return this[INTERNALS$1].status; + } + get ok() { + return this[INTERNALS$1].status >= 200 && this[INTERNALS$1].status < 300; + } + get redirected() { + return this[INTERNALS$1].counter > 0; + } + get statusText() { + return this[INTERNALS$1].statusText; + } + get headers() { + return this[INTERNALS$1].headers; + } + clone() { + return new Response(clone(this), { + url: this.url, + status: this.status, + statusText: this.statusText, + headers: this.headers, + ok: this.ok, + redirected: this.redirected + }); + } + } + Body.mixIn(Response.prototype); + Object.defineProperties(Response.prototype, { + url: { enumerable: true }, + status: { enumerable: true }, + ok: { enumerable: true }, + redirected: { enumerable: true }, + statusText: { enumerable: true }, + headers: { enumerable: true }, + clone: { enumerable: true } + }); + Object.defineProperty(Response.prototype, Symbol.toStringTag, { + value: "Response", + writable: false, + enumerable: false, + configurable: true + }); + var INTERNALS$2 = Symbol("Request internals"); + var URL2 = Url.URL || whatwgUrl.URL; + var parse_url = Url.parse; + var format_url = Url.format; + function parseURL(urlStr) { + if (/^[a-zA-Z][a-zA-Z\d+\-.]*:/.exec(urlStr)) { + urlStr = new URL2(urlStr).toString(); + } + return parse_url(urlStr); + } + var streamDestructionSupported = "destroy" in Stream.Readable.prototype; + function isRequest(input) { + return typeof input === "object" && typeof input[INTERNALS$2] === "object"; + } + function isAbortSignal(signal) { + const proto = signal && typeof signal === "object" && Object.getPrototypeOf(signal); + return !!(proto && proto.constructor.name === "AbortSignal"); + } + + class Request { + constructor(input) { + let init = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {}; + let parsedURL; + if (!isRequest(input)) { + if (input && input.href) { + parsedURL = parseURL(input.href); + } else { + parsedURL = parseURL(`${input}`); + } + input = {}; + } else { + parsedURL = parseURL(input.url); + } + let method = init.method || input.method || "GET"; + method = method.toUpperCase(); + if ((init.body != null || isRequest(input) && input.body !== null) && (method === "GET" || method === "HEAD")) { + throw new TypeError("Request with GET/HEAD method cannot have body"); + } + let inputBody = init.body != null ? init.body : isRequest(input) && input.body !== null ? clone(input) : null; + Body.call(this, inputBody, { + timeout: init.timeout || input.timeout || 0, + size: init.size || input.size || 0 + }); + const headers = new Headers2(init.headers || input.headers || {}); + if (inputBody != null && !headers.has("Content-Type")) { + const contentType = extractContentType(inputBody); + if (contentType) { + headers.append("Content-Type", contentType); + } + } + let signal = isRequest(input) ? input.signal : null; + if ("signal" in init) + signal = init.signal; + if (signal != null && !isAbortSignal(signal)) { + throw new TypeError("Expected signal to be an instanceof AbortSignal"); + } + this[INTERNALS$2] = { + method, + redirect: init.redirect || input.redirect || "follow", + headers, + parsedURL, + signal + }; + this.follow = init.follow !== undefined ? init.follow : input.follow !== undefined ? input.follow : 20; + this.compress = init.compress !== undefined ? init.compress : input.compress !== undefined ? input.compress : true; + this.counter = init.counter || input.counter || 0; + this.agent = init.agent || input.agent; + } + get method() { + return this[INTERNALS$2].method; + } + get url() { + return format_url(this[INTERNALS$2].parsedURL); + } + get headers() { + return this[INTERNALS$2].headers; + } + get redirect() { + return this[INTERNALS$2].redirect; + } + get signal() { + return this[INTERNALS$2].signal; + } + clone() { + return new Request(this); + } + } + Body.mixIn(Request.prototype); + Object.defineProperty(Request.prototype, Symbol.toStringTag, { + value: "Request", + writable: false, + enumerable: false, + configurable: true + }); + Object.defineProperties(Request.prototype, { + method: { enumerable: true }, + url: { enumerable: true }, + headers: { enumerable: true }, + redirect: { enumerable: true }, + clone: { enumerable: true }, + signal: { enumerable: true } + }); + function getNodeRequestOptions(request) { + const parsedURL = request[INTERNALS$2].parsedURL; + const headers = new Headers2(request[INTERNALS$2].headers); + if (!headers.has("Accept")) { + headers.set("Accept", "*/*"); + } + if (!parsedURL.protocol || !parsedURL.hostname) { + throw new TypeError("Only absolute URLs are supported"); + } + if (!/^https?:$/.test(parsedURL.protocol)) { + throw new TypeError("Only HTTP(S) protocols are supported"); + } + if (request.signal && request.body instanceof Stream.Readable && !streamDestructionSupported) { + throw new Error("Cancellation of streamed requests with AbortSignal is not supported in node < 8"); + } + let contentLengthValue = null; + if (request.body == null && /^(POST|PUT)$/i.test(request.method)) { + contentLengthValue = "0"; + } + if (request.body != null) { + const totalBytes = getTotalBytes(request); + if (typeof totalBytes === "number") { + contentLengthValue = String(totalBytes); + } + } + if (contentLengthValue) { + headers.set("Content-Length", contentLengthValue); + } + if (!headers.has("User-Agent")) { + headers.set("User-Agent", "node-fetch/1.0 (+https://github.com/bitinn/node-fetch)"); + } + if (request.compress && !headers.has("Accept-Encoding")) { + headers.set("Accept-Encoding", "gzip,deflate"); + } + let agent = request.agent; + if (typeof agent === "function") { + agent = agent(parsedURL); + } + return Object.assign({}, parsedURL, { + method: request.method, + headers: exportNodeCompatibleHeaders(headers), + agent + }); + } + function AbortError(message) { + Error.call(this, message); + this.type = "aborted"; + this.message = message; + Error.captureStackTrace(this, this.constructor); + } + AbortError.prototype = Object.create(Error.prototype); + AbortError.prototype.constructor = AbortError; + AbortError.prototype.name = "AbortError"; + var URL$1 = Url.URL || whatwgUrl.URL; + var PassThrough$1 = Stream.PassThrough; + var isDomainOrSubdomain = function isDomainOrSubdomain(destination, original) { + const orig = new URL$1(original).hostname; + const dest = new URL$1(destination).hostname; + return orig === dest || orig[orig.length - dest.length - 1] === "." && orig.endsWith(dest); + }; + var isSameProtocol = function isSameProtocol(destination, original) { + const orig = new URL$1(original).protocol; + const dest = new URL$1(destination).protocol; + return orig === dest; + }; + function fetch2(url, opts) { + if (!fetch2.Promise) { + throw new Error("native promise missing, set fetch.Promise to your favorite alternative"); + } + Body.Promise = fetch2.Promise; + return new fetch2.Promise(function(resolve, reject) { + const request = new Request(url, opts); + const options = getNodeRequestOptions(request); + const send = (options.protocol === "https:" ? https : http).request; + const signal = request.signal; + let response = null; + const abort = function abort() { + let error = new AbortError("The user aborted a request."); + reject(error); + if (request.body && request.body instanceof Stream.Readable) { + destroyStream(request.body, error); + } + if (!response || !response.body) + return; + response.body.emit("error", error); + }; + if (signal && signal.aborted) { + abort(); + return; + } + const abortAndFinalize = function abortAndFinalize() { + abort(); + finalize(); + }; + const req = send(options); + let reqTimeout; + if (signal) { + signal.addEventListener("abort", abortAndFinalize); + } + function finalize() { + req.abort(); + if (signal) + signal.removeEventListener("abort", abortAndFinalize); + clearTimeout(reqTimeout); + } + if (request.timeout) { + req.once("socket", function(socket) { + reqTimeout = setTimeout(function() { + reject(new FetchError(`network timeout at: ${request.url}`, "request-timeout")); + finalize(); + }, request.timeout); + }); + } + req.on("error", function(err) { + reject(new FetchError(`request to ${request.url} failed, reason: ${err.message}`, "system", err)); + if (response && response.body) { + destroyStream(response.body, err); + } + finalize(); + }); + fixResponseChunkedTransferBadEnding(req, function(err) { + if (signal && signal.aborted) { + return; + } + if (response && response.body) { + destroyStream(response.body, err); + } + }); + if (parseInt(process.version.substring(1)) < 14) { + req.on("socket", function(s) { + s.addListener("close", function(hadError) { + const hasDataListener = s.listenerCount("data") > 0; + if (response && hasDataListener && !hadError && !(signal && signal.aborted)) { + const err = new Error("Premature close"); + err.code = "ERR_STREAM_PREMATURE_CLOSE"; + response.body.emit("error", err); + } + }); + }); + } + req.on("response", function(res) { + clearTimeout(reqTimeout); + const headers = createHeadersLenient(res.headers); + if (fetch2.isRedirect(res.statusCode)) { + const location = headers.get("Location"); + let locationURL = null; + try { + locationURL = location === null ? null : new URL$1(location, request.url).toString(); + } catch (err) { + if (request.redirect !== "manual") { + reject(new FetchError(`uri requested responds with an invalid redirect URL: ${location}`, "invalid-redirect")); + finalize(); + return; + } + } + switch (request.redirect) { + case "error": + reject(new FetchError(`uri requested responds with a redirect, redirect mode is set to error: ${request.url}`, "no-redirect")); + finalize(); + return; + case "manual": + if (locationURL !== null) { + try { + headers.set("Location", locationURL); + } catch (err) { + reject(err); + } + } + break; + case "follow": + if (locationURL === null) { + break; + } + if (request.counter >= request.follow) { + reject(new FetchError(`maximum redirect reached at: ${request.url}`, "max-redirect")); + finalize(); + return; + } + const requestOpts = { + headers: new Headers2(request.headers), + follow: request.follow, + counter: request.counter + 1, + agent: request.agent, + compress: request.compress, + method: request.method, + body: request.body, + signal: request.signal, + timeout: request.timeout, + size: request.size + }; + if (!isDomainOrSubdomain(request.url, locationURL) || !isSameProtocol(request.url, locationURL)) { + for (const name of ["authorization", "www-authenticate", "cookie", "cookie2"]) { + requestOpts.headers.delete(name); + } + } + if (res.statusCode !== 303 && request.body && getTotalBytes(request) === null) { + reject(new FetchError("Cannot follow redirect with body being a readable stream", "unsupported-redirect")); + finalize(); + return; + } + if (res.statusCode === 303 || (res.statusCode === 301 || res.statusCode === 302) && request.method === "POST") { + requestOpts.method = "GET"; + requestOpts.body = undefined; + requestOpts.headers.delete("content-length"); + } + resolve(fetch2(new Request(locationURL, requestOpts))); + finalize(); + return; + } + } + res.once("end", function() { + if (signal) + signal.removeEventListener("abort", abortAndFinalize); + }); + let body = res.pipe(new PassThrough$1); + const response_options = { + url: request.url, + status: res.statusCode, + statusText: res.statusMessage, + headers, + size: request.size, + timeout: request.timeout, + counter: request.counter + }; + const codings = headers.get("Content-Encoding"); + if (!request.compress || request.method === "HEAD" || codings === null || res.statusCode === 204 || res.statusCode === 304) { + response = new Response(body, response_options); + resolve(response); + return; + } + const zlibOptions = { + flush: zlib.Z_SYNC_FLUSH, + finishFlush: zlib.Z_SYNC_FLUSH + }; + if (codings == "gzip" || codings == "x-gzip") { + body = body.pipe(zlib.createGunzip(zlibOptions)); + response = new Response(body, response_options); + resolve(response); + return; + } + if (codings == "deflate" || codings == "x-deflate") { + const raw = res.pipe(new PassThrough$1); + raw.once("data", function(chunk) { + if ((chunk[0] & 15) === 8) { + body = body.pipe(zlib.createInflate()); + } else { + body = body.pipe(zlib.createInflateRaw()); + } + response = new Response(body, response_options); + resolve(response); + }); + raw.on("end", function() { + if (!response) { + response = new Response(body, response_options); + resolve(response); + } + }); + return; + } + if (codings == "br" && typeof zlib.createBrotliDecompress === "function") { + body = body.pipe(zlib.createBrotliDecompress()); + response = new Response(body, response_options); + resolve(response); + return; + } + response = new Response(body, response_options); + resolve(response); + }); + writeToStream(req, request); + }); + } + function fixResponseChunkedTransferBadEnding(request, errorCallback) { + let socket; + request.on("socket", function(s) { + socket = s; + }); + request.on("response", function(response) { + const headers = response.headers; + if (headers["transfer-encoding"] === "chunked" && !headers["content-length"]) { + response.once("close", function(hadError) { + const hasDataListener = socket && socket.listenerCount("data") > 0; + if (hasDataListener && !hadError) { + const err = new Error("Premature close"); + err.code = "ERR_STREAM_PREMATURE_CLOSE"; + errorCallback(err); + } + }); + } + }); + } + function destroyStream(stream, err) { + if (stream.destroy) { + stream.destroy(err); + } else { + stream.emit("error", err); + stream.end(); + } + } + fetch2.isRedirect = function(code) { + return code === 301 || code === 302 || code === 303 || code === 307 || code === 308; + }; + fetch2.Promise = global.Promise; + module2.exports = exports2 = fetch2; + Object.defineProperty(exports2, "__esModule", { value: true }); + exports2.default = exports2; + exports2.Headers = Headers2; + exports2.Request = Request; + exports2.Response = Response; + exports2.FetchError = FetchError; + exports2.AbortError = AbortError; +}); + +// node_modules/@octokit/request/node_modules/@octokit/request-error/dist-node/index.js +var require_dist_node12 = __commonJS((exports2) => { + Object.defineProperty(exports2, "__esModule", { value: true }); + function _interopDefault(ex) { + return ex && typeof ex === "object" && "default" in ex ? ex["default"] : ex; + } + var deprecation = require_dist_node3(); + var once = _interopDefault(require_once()); + var logOnceCode = once((deprecation2) => console.warn(deprecation2)); + var logOnceHeaders = once((deprecation2) => console.warn(deprecation2)); + + class RequestError extends Error { + constructor(message, statusCode, options) { + super(message); + if (Error.captureStackTrace) { + Error.captureStackTrace(this, this.constructor); + } + this.name = "HttpError"; + this.status = statusCode; + let headers; + if ("headers" in options && typeof options.headers !== "undefined") { + headers = options.headers; + } + if ("response" in options) { + this.response = options.response; + headers = options.response.headers; + } + const requestCopy = Object.assign({}, options.request); + if (options.request.headers.authorization) { + requestCopy.headers = Object.assign({}, options.request.headers, { + authorization: options.request.headers.authorization.replace(/ .*$/, " [REDACTED]") + }); + } + requestCopy.url = requestCopy.url.replace(/\bclient_secret=\w+/g, "client_secret=[REDACTED]").replace(/\baccess_token=\w+/g, "access_token=[REDACTED]"); + this.request = requestCopy; + Object.defineProperty(this, "code", { + get() { + logOnceCode(new deprecation.Deprecation("[@octokit/request-error] `error.code` is deprecated, use `error.status`.")); + return statusCode; + } + }); + Object.defineProperty(this, "headers", { + get() { + logOnceHeaders(new deprecation.Deprecation("[@octokit/request-error] `error.headers` is deprecated, use `error.response.headers`.")); + return headers || {}; + } + }); + } + } + exports2.RequestError = RequestError; +}); + +// node_modules/@octokit/request/dist-node/index.js +var require_dist_node13 = __commonJS((exports2) => { + Object.defineProperty(exports2, "__esModule", { value: true }); + function _interopDefault(ex) { + return ex && typeof ex === "object" && "default" in ex ? ex["default"] : ex; + } + var endpoint = require_dist_node11(); + var universalUserAgent = require_dist_node(); + var isPlainObject = require_is_plain_object(); + var nodeFetch = _interopDefault(require_lib4()); + var requestError = require_dist_node12(); + var VERSION = "5.6.3"; + function getBufferResponse(response) { + return response.arrayBuffer(); + } + function fetchWrapper(requestOptions) { + const log = requestOptions.request && requestOptions.request.log ? requestOptions.request.log : console; + if (isPlainObject.isPlainObject(requestOptions.body) || Array.isArray(requestOptions.body)) { + requestOptions.body = JSON.stringify(requestOptions.body); + } + let headers = {}; + let status; + let url; + const fetch2 = requestOptions.request && requestOptions.request.fetch || nodeFetch; + return fetch2(requestOptions.url, Object.assign({ + method: requestOptions.method, + body: requestOptions.body, + headers: requestOptions.headers, + redirect: requestOptions.redirect + }, requestOptions.request)).then(async (response) => { + url = response.url; + status = response.status; + for (const keyAndValue of response.headers) { + headers[keyAndValue[0]] = keyAndValue[1]; + } + if ("deprecation" in headers) { + const matches = headers.link && headers.link.match(/<([^>]+)>; rel="deprecation"/); + const deprecationLink = matches && matches.pop(); + log.warn(`[@octokit/request] "${requestOptions.method} ${requestOptions.url}" is deprecated. It is scheduled to be removed on ${headers.sunset}${deprecationLink ? `. See ${deprecationLink}` : ""}`); + } + if (status === 204 || status === 205) { + return; + } + if (requestOptions.method === "HEAD") { + if (status < 400) { + return; + } + throw new requestError.RequestError(response.statusText, status, { + response: { + url, + status, + headers, + data: undefined + }, + request: requestOptions + }); + } + if (status === 304) { + throw new requestError.RequestError("Not modified", status, { + response: { + url, + status, + headers, + data: await getResponseData(response) + }, + request: requestOptions + }); + } + if (status >= 400) { + const data = await getResponseData(response); + const error = new requestError.RequestError(toErrorMessage(data), status, { + response: { + url, + status, + headers, + data + }, + request: requestOptions + }); + throw error; + } + return getResponseData(response); + }).then((data) => { + return { + status, + url, + headers, + data + }; + }).catch((error) => { + if (error instanceof requestError.RequestError) + throw error; + throw new requestError.RequestError(error.message, 500, { + request: requestOptions + }); + }); + } + async function getResponseData(response) { + const contentType = response.headers.get("content-type"); + if (/application\/json/.test(contentType)) { + return response.json(); + } + if (!contentType || /^text\/|charset=utf-8$/.test(contentType)) { + return response.text(); + } + return getBufferResponse(response); + } + function toErrorMessage(data) { + if (typeof data === "string") + return data; + if ("message" in data) { + if (Array.isArray(data.errors)) { + return `${data.message}: ${data.errors.map(JSON.stringify).join(", ")}`; + } + return data.message; + } + return `Unknown error: ${JSON.stringify(data)}`; + } + function withDefaults(oldEndpoint, newDefaults) { + const endpoint2 = oldEndpoint.defaults(newDefaults); + const newApi = function(route, parameters) { + const endpointOptions = endpoint2.merge(route, parameters); + if (!endpointOptions.request || !endpointOptions.request.hook) { + return fetchWrapper(endpoint2.parse(endpointOptions)); + } + const request2 = (route2, parameters2) => { + return fetchWrapper(endpoint2.parse(endpoint2.merge(route2, parameters2))); + }; + Object.assign(request2, { + endpoint: endpoint2, + defaults: withDefaults.bind(null, endpoint2) + }); + return endpointOptions.request.hook(request2, endpointOptions); + }; + return Object.assign(newApi, { + endpoint: endpoint2, + defaults: withDefaults.bind(null, endpoint2) + }); + } + var request = withDefaults(endpoint.endpoint, { + headers: { + "user-agent": `octokit-request.js/${VERSION} ${universalUserAgent.getUserAgent()}` + } + }); + exports2.request = request; +}); + +// node_modules/@octokit/graphql/dist-node/index.js +var require_dist_node14 = __commonJS((exports2) => { + Object.defineProperty(exports2, "__esModule", { value: true }); + var request = require_dist_node13(); + var universalUserAgent = require_dist_node(); + var VERSION = "4.8.0"; + function _buildMessageForResponseErrors(data) { + return `Request failed due to following response errors:\n` + data.errors.map((e) => ` - ${e.message}`).join("\n"); + } + + class GraphqlResponseError extends Error { + constructor(request2, headers, response) { + super(_buildMessageForResponseErrors(response)); + this.request = request2; + this.headers = headers; + this.response = response; + this.name = "GraphqlResponseError"; + this.errors = response.errors; + this.data = response.data; + if (Error.captureStackTrace) { + Error.captureStackTrace(this, this.constructor); + } + } + } + var NON_VARIABLE_OPTIONS = ["method", "baseUrl", "url", "headers", "request", "query", "mediaType"]; + var FORBIDDEN_VARIABLE_OPTIONS = ["query", "method", "url"]; + var GHES_V3_SUFFIX_REGEX = /\/api\/v3\/?$/; + function graphql(request2, query, options) { + if (options) { + if (typeof query === "string" && "query" in options) { + return Promise.reject(new Error(`[@octokit/graphql] "query" cannot be used as variable name`)); + } + for (const key in options) { + if (!FORBIDDEN_VARIABLE_OPTIONS.includes(key)) + continue; + return Promise.reject(new Error(`[@octokit/graphql] "${key}" cannot be used as variable name`)); + } + } + const parsedOptions = typeof query === "string" ? Object.assign({ + query + }, options) : query; + const requestOptions = Object.keys(parsedOptions).reduce((result, key) => { + if (NON_VARIABLE_OPTIONS.includes(key)) { + result[key] = parsedOptions[key]; + return result; + } + if (!result.variables) { + result.variables = {}; + } + result.variables[key] = parsedOptions[key]; + return result; + }, {}); + const baseUrl = parsedOptions.baseUrl || request2.endpoint.DEFAULTS.baseUrl; + if (GHES_V3_SUFFIX_REGEX.test(baseUrl)) { + requestOptions.url = baseUrl.replace(GHES_V3_SUFFIX_REGEX, "/api/graphql"); + } + return request2(requestOptions).then((response) => { + if (response.data.errors) { + const headers = {}; + for (const key of Object.keys(response.headers)) { + headers[key] = response.headers[key]; + } + throw new GraphqlResponseError(requestOptions, headers, response.data); + } + return response.data.data; + }); + } + function withDefaults(request$1, newDefaults) { + const newRequest = request$1.defaults(newDefaults); + const newApi = (query, options) => { + return graphql(newRequest, query, options); + }; + return Object.assign(newApi, { + defaults: withDefaults.bind(null, newRequest), + endpoint: request.request.endpoint + }); + } + var graphql$1 = withDefaults(request.request, { + headers: { + "user-agent": `octokit-graphql.js/${VERSION} ${universalUserAgent.getUserAgent()}` + }, + method: "POST", + url: "/graphql" + }); + function withCustomRequest(customRequest) { + return withDefaults(customRequest, { + method: "POST", + url: "/graphql" + }); + } + exports2.GraphqlResponseError = GraphqlResponseError; + exports2.graphql = graphql$1; + exports2.withCustomRequest = withCustomRequest; +}); + +// node_modules/@octokit/auth-token/dist-node/index.js +var require_dist_node15 = __commonJS((exports2) => { + Object.defineProperty(exports2, "__esModule", { value: true }); + var REGEX_IS_INSTALLATION_LEGACY = /^v1\./; + var REGEX_IS_INSTALLATION = /^ghs_/; + var REGEX_IS_USER_TO_SERVER = /^ghu_/; + async function auth(token) { + const isApp = token.split(/\./).length === 3; + const isInstallation = REGEX_IS_INSTALLATION_LEGACY.test(token) || REGEX_IS_INSTALLATION.test(token); + const isUserToServer = REGEX_IS_USER_TO_SERVER.test(token); + const tokenType = isApp ? "app" : isInstallation ? "installation" : isUserToServer ? "user-to-server" : "oauth"; + return { + type: "token", + token, + tokenType + }; + } + function withAuthorizationPrefix(token) { + if (token.split(/\./).length === 3) { + return `bearer ${token}`; + } + return `token ${token}`; + } + async function hook(token, request, route, parameters) { + const endpoint = request.endpoint.merge(route, parameters); + endpoint.headers.authorization = withAuthorizationPrefix(token); + return request(endpoint); + } + var createTokenAuth = function createTokenAuth(token) { + if (!token) { + throw new Error("[@octokit/auth-token] No token passed to createTokenAuth"); + } + if (typeof token !== "string") { + throw new Error("[@octokit/auth-token] Token passed to createTokenAuth is not a string"); + } + token = token.replace(/^(token|bearer) +/i, ""); + return Object.assign(auth.bind(null, token), { + hook: hook.bind(null, token) + }); + }; + exports2.createTokenAuth = createTokenAuth; +}); + +// node_modules/@octokit/core/dist-node/index.js +var require_dist_node16 = __commonJS((exports2) => { + Object.defineProperty(exports2, "__esModule", { value: true }); + var universalUserAgent = require_dist_node(); + var beforeAfterHook = require_before_after_hook(); + var request = require_dist_node13(); + var graphql = require_dist_node14(); + var authToken = require_dist_node15(); + function _objectWithoutPropertiesLoose(source, excluded) { + if (source == null) + return {}; + var target = {}; + var sourceKeys = Object.keys(source); + var key, i; + for (i = 0;i < sourceKeys.length; i++) { + key = sourceKeys[i]; + if (excluded.indexOf(key) >= 0) + continue; + target[key] = source[key]; + } + return target; + } + function _objectWithoutProperties(source, excluded) { + if (source == null) + return {}; + var target = _objectWithoutPropertiesLoose(source, excluded); + var key, i; + if (Object.getOwnPropertySymbols) { + var sourceSymbolKeys = Object.getOwnPropertySymbols(source); + for (i = 0;i < sourceSymbolKeys.length; i++) { + key = sourceSymbolKeys[i]; + if (excluded.indexOf(key) >= 0) + continue; + if (!Object.prototype.propertyIsEnumerable.call(source, key)) + continue; + target[key] = source[key]; + } + } + return target; + } + var VERSION = "3.6.0"; + var _excluded = ["authStrategy"]; + + class Octokit { + constructor(options = {}) { + const hook = new beforeAfterHook.Collection; + const requestDefaults = { + baseUrl: request.request.endpoint.DEFAULTS.baseUrl, + headers: {}, + request: Object.assign({}, options.request, { + hook: hook.bind(null, "request") + }), + mediaType: { + previews: [], + format: "" + } + }; + requestDefaults.headers["user-agent"] = [options.userAgent, `octokit-core.js/${VERSION} ${universalUserAgent.getUserAgent()}`].filter(Boolean).join(" "); + if (options.baseUrl) { + requestDefaults.baseUrl = options.baseUrl; + } + if (options.previews) { + requestDefaults.mediaType.previews = options.previews; + } + if (options.timeZone) { + requestDefaults.headers["time-zone"] = options.timeZone; + } + this.request = request.request.defaults(requestDefaults); + this.graphql = graphql.withCustomRequest(this.request).defaults(requestDefaults); + this.log = Object.assign({ + debug: () => { + }, + info: () => { + }, + warn: console.warn.bind(console), + error: console.error.bind(console) + }, options.log); + this.hook = hook; + if (!options.authStrategy) { + if (!options.auth) { + this.auth = async () => ({ + type: "unauthenticated" + }); + } else { + const auth = authToken.createTokenAuth(options.auth); + hook.wrap("request", auth.hook); + this.auth = auth; + } + } else { + const { + authStrategy + } = options, otherOptions = _objectWithoutProperties(options, _excluded); + const auth = authStrategy(Object.assign({ + request: this.request, + log: this.log, + octokit: this, + octokitOptions: otherOptions + }, options.auth)); + hook.wrap("request", auth.hook); + this.auth = auth; + } + const classConstructor = this.constructor; + classConstructor.plugins.forEach((plugin) => { + Object.assign(this, plugin(this, options)); + }); + } + static defaults(defaults) { + const OctokitWithDefaults = class extends this { + constructor(...args) { + const options = args[0] || {}; + if (typeof defaults === "function") { + super(defaults(options)); + return; + } + super(Object.assign({}, defaults, options, options.userAgent && defaults.userAgent ? { + userAgent: `${options.userAgent} ${defaults.userAgent}` + } : null)); + } + }; + return OctokitWithDefaults; + } + static plugin(...newPlugins) { + var _a; + const currentPlugins = this.plugins; + const NewOctokit = (_a = class extends this { + }, _a.plugins = currentPlugins.concat(newPlugins.filter((plugin) => !currentPlugins.includes(plugin))), _a); + return NewOctokit; + } + } + Octokit.VERSION = VERSION; + Octokit.plugins = []; + exports2.Octokit = Octokit; +}); + +// node_modules/@actions/artifact/node_modules/@actions/github/node_modules/@octokit/plugin-rest-endpoint-methods/dist-node/index.js +var require_dist_node17 = __commonJS((exports2) => { + Object.defineProperty(exports2, "__esModule", { value: true }); + function ownKeys(object, enumerableOnly) { + var keys = Object.keys(object); + if (Object.getOwnPropertySymbols) { + var symbols = Object.getOwnPropertySymbols(object); + if (enumerableOnly) { + symbols = symbols.filter(function(sym) { + return Object.getOwnPropertyDescriptor(object, sym).enumerable; + }); + } + keys.push.apply(keys, symbols); + } + return keys; + } + function _objectSpread2(target) { + for (var i = 1;i < arguments.length; i++) { + var source = arguments[i] != null ? arguments[i] : {}; + if (i % 2) { + ownKeys(Object(source), true).forEach(function(key) { + _defineProperty(target, key, source[key]); + }); + } else if (Object.getOwnPropertyDescriptors) { + Object.defineProperties(target, Object.getOwnPropertyDescriptors(source)); + } else { + ownKeys(Object(source)).forEach(function(key) { + Object.defineProperty(target, key, Object.getOwnPropertyDescriptor(source, key)); + }); + } + } + return target; + } + function _defineProperty(obj, key, value) { + if (key in obj) { + Object.defineProperty(obj, key, { + value, + enumerable: true, + configurable: true, + writable: true + }); + } else { + obj[key] = value; + } + return obj; + } + var Endpoints = { + actions: { + addCustomLabelsToSelfHostedRunnerForOrg: ["POST /orgs/{org}/actions/runners/{runner_id}/labels"], + addCustomLabelsToSelfHostedRunnerForRepo: ["POST /repos/{owner}/{repo}/actions/runners/{runner_id}/labels"], + addSelectedRepoToOrgSecret: ["PUT /orgs/{org}/actions/secrets/{secret_name}/repositories/{repository_id}"], + approveWorkflowRun: ["POST /repos/{owner}/{repo}/actions/runs/{run_id}/approve"], + cancelWorkflowRun: ["POST /repos/{owner}/{repo}/actions/runs/{run_id}/cancel"], + createOrUpdateEnvironmentSecret: ["PUT /repositories/{repository_id}/environments/{environment_name}/secrets/{secret_name}"], + createOrUpdateOrgSecret: ["PUT /orgs/{org}/actions/secrets/{secret_name}"], + createOrUpdateRepoSecret: ["PUT /repos/{owner}/{repo}/actions/secrets/{secret_name}"], + createRegistrationTokenForOrg: ["POST /orgs/{org}/actions/runners/registration-token"], + createRegistrationTokenForRepo: ["POST /repos/{owner}/{repo}/actions/runners/registration-token"], + createRemoveTokenForOrg: ["POST /orgs/{org}/actions/runners/remove-token"], + createRemoveTokenForRepo: ["POST /repos/{owner}/{repo}/actions/runners/remove-token"], + createWorkflowDispatch: ["POST /repos/{owner}/{repo}/actions/workflows/{workflow_id}/dispatches"], + deleteActionsCacheById: ["DELETE /repos/{owner}/{repo}/actions/caches/{cache_id}"], + deleteActionsCacheByKey: ["DELETE /repos/{owner}/{repo}/actions/caches{?key,ref}"], + deleteArtifact: ["DELETE /repos/{owner}/{repo}/actions/artifacts/{artifact_id}"], + deleteEnvironmentSecret: ["DELETE /repositories/{repository_id}/environments/{environment_name}/secrets/{secret_name}"], + deleteOrgSecret: ["DELETE /orgs/{org}/actions/secrets/{secret_name}"], + deleteRepoSecret: ["DELETE /repos/{owner}/{repo}/actions/secrets/{secret_name}"], + deleteSelfHostedRunnerFromOrg: ["DELETE /orgs/{org}/actions/runners/{runner_id}"], + deleteSelfHostedRunnerFromRepo: ["DELETE /repos/{owner}/{repo}/actions/runners/{runner_id}"], + deleteWorkflowRun: ["DELETE /repos/{owner}/{repo}/actions/runs/{run_id}"], + deleteWorkflowRunLogs: ["DELETE /repos/{owner}/{repo}/actions/runs/{run_id}/logs"], + disableSelectedRepositoryGithubActionsOrganization: ["DELETE /orgs/{org}/actions/permissions/repositories/{repository_id}"], + disableWorkflow: ["PUT /repos/{owner}/{repo}/actions/workflows/{workflow_id}/disable"], + downloadArtifact: ["GET /repos/{owner}/{repo}/actions/artifacts/{artifact_id}/{archive_format}"], + downloadJobLogsForWorkflowRun: ["GET /repos/{owner}/{repo}/actions/jobs/{job_id}/logs"], + downloadWorkflowRunAttemptLogs: ["GET /repos/{owner}/{repo}/actions/runs/{run_id}/attempts/{attempt_number}/logs"], + downloadWorkflowRunLogs: ["GET /repos/{owner}/{repo}/actions/runs/{run_id}/logs"], + enableSelectedRepositoryGithubActionsOrganization: ["PUT /orgs/{org}/actions/permissions/repositories/{repository_id}"], + enableWorkflow: ["PUT /repos/{owner}/{repo}/actions/workflows/{workflow_id}/enable"], + getActionsCacheList: ["GET /repos/{owner}/{repo}/actions/caches"], + getActionsCacheUsage: ["GET /repos/{owner}/{repo}/actions/cache/usage"], + getActionsCacheUsageByRepoForOrg: ["GET /orgs/{org}/actions/cache/usage-by-repository"], + getActionsCacheUsageForEnterprise: ["GET /enterprises/{enterprise}/actions/cache/usage"], + getActionsCacheUsageForOrg: ["GET /orgs/{org}/actions/cache/usage"], + getAllowedActionsOrganization: ["GET /orgs/{org}/actions/permissions/selected-actions"], + getAllowedActionsRepository: ["GET /repos/{owner}/{repo}/actions/permissions/selected-actions"], + getArtifact: ["GET /repos/{owner}/{repo}/actions/artifacts/{artifact_id}"], + getEnvironmentPublicKey: ["GET /repositories/{repository_id}/environments/{environment_name}/secrets/public-key"], + getEnvironmentSecret: ["GET /repositories/{repository_id}/environments/{environment_name}/secrets/{secret_name}"], + getGithubActionsDefaultWorkflowPermissionsEnterprise: ["GET /enterprises/{enterprise}/actions/permissions/workflow"], + getGithubActionsDefaultWorkflowPermissionsOrganization: ["GET /orgs/{org}/actions/permissions/workflow"], + getGithubActionsDefaultWorkflowPermissionsRepository: ["GET /repos/{owner}/{repo}/actions/permissions/workflow"], + getGithubActionsPermissionsOrganization: ["GET /orgs/{org}/actions/permissions"], + getGithubActionsPermissionsRepository: ["GET /repos/{owner}/{repo}/actions/permissions"], + getJobForWorkflowRun: ["GET /repos/{owner}/{repo}/actions/jobs/{job_id}"], + getOrgPublicKey: ["GET /orgs/{org}/actions/secrets/public-key"], + getOrgSecret: ["GET /orgs/{org}/actions/secrets/{secret_name}"], + getPendingDeploymentsForRun: ["GET /repos/{owner}/{repo}/actions/runs/{run_id}/pending_deployments"], + getRepoPermissions: ["GET /repos/{owner}/{repo}/actions/permissions", {}, { + renamed: ["actions", "getGithubActionsPermissionsRepository"] + }], + getRepoPublicKey: ["GET /repos/{owner}/{repo}/actions/secrets/public-key"], + getRepoSecret: ["GET /repos/{owner}/{repo}/actions/secrets/{secret_name}"], + getReviewsForRun: ["GET /repos/{owner}/{repo}/actions/runs/{run_id}/approvals"], + getSelfHostedRunnerForOrg: ["GET /orgs/{org}/actions/runners/{runner_id}"], + getSelfHostedRunnerForRepo: ["GET /repos/{owner}/{repo}/actions/runners/{runner_id}"], + getWorkflow: ["GET /repos/{owner}/{repo}/actions/workflows/{workflow_id}"], + getWorkflowAccessToRepository: ["GET /repos/{owner}/{repo}/actions/permissions/access"], + getWorkflowRun: ["GET /repos/{owner}/{repo}/actions/runs/{run_id}"], + getWorkflowRunAttempt: ["GET /repos/{owner}/{repo}/actions/runs/{run_id}/attempts/{attempt_number}"], + getWorkflowRunUsage: ["GET /repos/{owner}/{repo}/actions/runs/{run_id}/timing"], + getWorkflowUsage: ["GET /repos/{owner}/{repo}/actions/workflows/{workflow_id}/timing"], + listArtifactsForRepo: ["GET /repos/{owner}/{repo}/actions/artifacts"], + listEnvironmentSecrets: ["GET /repositories/{repository_id}/environments/{environment_name}/secrets"], + listJobsForWorkflowRun: ["GET /repos/{owner}/{repo}/actions/runs/{run_id}/jobs"], + listJobsForWorkflowRunAttempt: ["GET /repos/{owner}/{repo}/actions/runs/{run_id}/attempts/{attempt_number}/jobs"], + listLabelsForSelfHostedRunnerForOrg: ["GET /orgs/{org}/actions/runners/{runner_id}/labels"], + listLabelsForSelfHostedRunnerForRepo: ["GET /repos/{owner}/{repo}/actions/runners/{runner_id}/labels"], + listOrgSecrets: ["GET /orgs/{org}/actions/secrets"], + listRepoSecrets: ["GET /repos/{owner}/{repo}/actions/secrets"], + listRepoWorkflows: ["GET /repos/{owner}/{repo}/actions/workflows"], + listRunnerApplicationsForOrg: ["GET /orgs/{org}/actions/runners/downloads"], + listRunnerApplicationsForRepo: ["GET /repos/{owner}/{repo}/actions/runners/downloads"], + listSelectedReposForOrgSecret: ["GET /orgs/{org}/actions/secrets/{secret_name}/repositories"], + listSelectedRepositoriesEnabledGithubActionsOrganization: ["GET /orgs/{org}/actions/permissions/repositories"], + listSelfHostedRunnersForOrg: ["GET /orgs/{org}/actions/runners"], + listSelfHostedRunnersForRepo: ["GET /repos/{owner}/{repo}/actions/runners"], + listWorkflowRunArtifacts: ["GET /repos/{owner}/{repo}/actions/runs/{run_id}/artifacts"], + listWorkflowRuns: ["GET /repos/{owner}/{repo}/actions/workflows/{workflow_id}/runs"], + listWorkflowRunsForRepo: ["GET /repos/{owner}/{repo}/actions/runs"], + reRunJobForWorkflowRun: ["POST /repos/{owner}/{repo}/actions/jobs/{job_id}/rerun"], + reRunWorkflow: ["POST /repos/{owner}/{repo}/actions/runs/{run_id}/rerun"], + reRunWorkflowFailedJobs: ["POST /repos/{owner}/{repo}/actions/runs/{run_id}/rerun-failed-jobs"], + removeAllCustomLabelsFromSelfHostedRunnerForOrg: ["DELETE /orgs/{org}/actions/runners/{runner_id}/labels"], + removeAllCustomLabelsFromSelfHostedRunnerForRepo: ["DELETE /repos/{owner}/{repo}/actions/runners/{runner_id}/labels"], + removeCustomLabelFromSelfHostedRunnerForOrg: ["DELETE /orgs/{org}/actions/runners/{runner_id}/labels/{name}"], + removeCustomLabelFromSelfHostedRunnerForRepo: ["DELETE /repos/{owner}/{repo}/actions/runners/{runner_id}/labels/{name}"], + removeSelectedRepoFromOrgSecret: ["DELETE /orgs/{org}/actions/secrets/{secret_name}/repositories/{repository_id}"], + reviewPendingDeploymentsForRun: ["POST /repos/{owner}/{repo}/actions/runs/{run_id}/pending_deployments"], + setAllowedActionsOrganization: ["PUT /orgs/{org}/actions/permissions/selected-actions"], + setAllowedActionsRepository: ["PUT /repos/{owner}/{repo}/actions/permissions/selected-actions"], + setCustomLabelsForSelfHostedRunnerForOrg: ["PUT /orgs/{org}/actions/runners/{runner_id}/labels"], + setCustomLabelsForSelfHostedRunnerForRepo: ["PUT /repos/{owner}/{repo}/actions/runners/{runner_id}/labels"], + setGithubActionsDefaultWorkflowPermissionsEnterprise: ["PUT /enterprises/{enterprise}/actions/permissions/workflow"], + setGithubActionsDefaultWorkflowPermissionsOrganization: ["PUT /orgs/{org}/actions/permissions/workflow"], + setGithubActionsDefaultWorkflowPermissionsRepository: ["PUT /repos/{owner}/{repo}/actions/permissions/workflow"], + setGithubActionsPermissionsOrganization: ["PUT /orgs/{org}/actions/permissions"], + setGithubActionsPermissionsRepository: ["PUT /repos/{owner}/{repo}/actions/permissions"], + setSelectedReposForOrgSecret: ["PUT /orgs/{org}/actions/secrets/{secret_name}/repositories"], + setSelectedRepositoriesEnabledGithubActionsOrganization: ["PUT /orgs/{org}/actions/permissions/repositories"], + setWorkflowAccessToRepository: ["PUT /repos/{owner}/{repo}/actions/permissions/access"] + }, + activity: { + checkRepoIsStarredByAuthenticatedUser: ["GET /user/starred/{owner}/{repo}"], + deleteRepoSubscription: ["DELETE /repos/{owner}/{repo}/subscription"], + deleteThreadSubscription: ["DELETE /notifications/threads/{thread_id}/subscription"], + getFeeds: ["GET /feeds"], + getRepoSubscription: ["GET /repos/{owner}/{repo}/subscription"], + getThread: ["GET /notifications/threads/{thread_id}"], + getThreadSubscriptionForAuthenticatedUser: ["GET /notifications/threads/{thread_id}/subscription"], + listEventsForAuthenticatedUser: ["GET /users/{username}/events"], + listNotificationsForAuthenticatedUser: ["GET /notifications"], + listOrgEventsForAuthenticatedUser: ["GET /users/{username}/events/orgs/{org}"], + listPublicEvents: ["GET /events"], + listPublicEventsForRepoNetwork: ["GET /networks/{owner}/{repo}/events"], + listPublicEventsForUser: ["GET /users/{username}/events/public"], + listPublicOrgEvents: ["GET /orgs/{org}/events"], + listReceivedEventsForUser: ["GET /users/{username}/received_events"], + listReceivedPublicEventsForUser: ["GET /users/{username}/received_events/public"], + listRepoEvents: ["GET /repos/{owner}/{repo}/events"], + listRepoNotificationsForAuthenticatedUser: ["GET /repos/{owner}/{repo}/notifications"], + listReposStarredByAuthenticatedUser: ["GET /user/starred"], + listReposStarredByUser: ["GET /users/{username}/starred"], + listReposWatchedByUser: ["GET /users/{username}/subscriptions"], + listStargazersForRepo: ["GET /repos/{owner}/{repo}/stargazers"], + listWatchedReposForAuthenticatedUser: ["GET /user/subscriptions"], + listWatchersForRepo: ["GET /repos/{owner}/{repo}/subscribers"], + markNotificationsAsRead: ["PUT /notifications"], + markRepoNotificationsAsRead: ["PUT /repos/{owner}/{repo}/notifications"], + markThreadAsRead: ["PATCH /notifications/threads/{thread_id}"], + setRepoSubscription: ["PUT /repos/{owner}/{repo}/subscription"], + setThreadSubscription: ["PUT /notifications/threads/{thread_id}/subscription"], + starRepoForAuthenticatedUser: ["PUT /user/starred/{owner}/{repo}"], + unstarRepoForAuthenticatedUser: ["DELETE /user/starred/{owner}/{repo}"] + }, + apps: { + addRepoToInstallation: ["PUT /user/installations/{installation_id}/repositories/{repository_id}", {}, { + renamed: ["apps", "addRepoToInstallationForAuthenticatedUser"] + }], + addRepoToInstallationForAuthenticatedUser: ["PUT /user/installations/{installation_id}/repositories/{repository_id}"], + checkToken: ["POST /applications/{client_id}/token"], + createFromManifest: ["POST /app-manifests/{code}/conversions"], + createInstallationAccessToken: ["POST /app/installations/{installation_id}/access_tokens"], + deleteAuthorization: ["DELETE /applications/{client_id}/grant"], + deleteInstallation: ["DELETE /app/installations/{installation_id}"], + deleteToken: ["DELETE /applications/{client_id}/token"], + getAuthenticated: ["GET /app"], + getBySlug: ["GET /apps/{app_slug}"], + getInstallation: ["GET /app/installations/{installation_id}"], + getOrgInstallation: ["GET /orgs/{org}/installation"], + getRepoInstallation: ["GET /repos/{owner}/{repo}/installation"], + getSubscriptionPlanForAccount: ["GET /marketplace_listing/accounts/{account_id}"], + getSubscriptionPlanForAccountStubbed: ["GET /marketplace_listing/stubbed/accounts/{account_id}"], + getUserInstallation: ["GET /users/{username}/installation"], + getWebhookConfigForApp: ["GET /app/hook/config"], + getWebhookDelivery: ["GET /app/hook/deliveries/{delivery_id}"], + listAccountsForPlan: ["GET /marketplace_listing/plans/{plan_id}/accounts"], + listAccountsForPlanStubbed: ["GET /marketplace_listing/stubbed/plans/{plan_id}/accounts"], + listInstallationReposForAuthenticatedUser: ["GET /user/installations/{installation_id}/repositories"], + listInstallations: ["GET /app/installations"], + listInstallationsForAuthenticatedUser: ["GET /user/installations"], + listPlans: ["GET /marketplace_listing/plans"], + listPlansStubbed: ["GET /marketplace_listing/stubbed/plans"], + listReposAccessibleToInstallation: ["GET /installation/repositories"], + listSubscriptionsForAuthenticatedUser: ["GET /user/marketplace_purchases"], + listSubscriptionsForAuthenticatedUserStubbed: ["GET /user/marketplace_purchases/stubbed"], + listWebhookDeliveries: ["GET /app/hook/deliveries"], + redeliverWebhookDelivery: ["POST /app/hook/deliveries/{delivery_id}/attempts"], + removeRepoFromInstallation: ["DELETE /user/installations/{installation_id}/repositories/{repository_id}", {}, { + renamed: ["apps", "removeRepoFromInstallationForAuthenticatedUser"] + }], + removeRepoFromInstallationForAuthenticatedUser: ["DELETE /user/installations/{installation_id}/repositories/{repository_id}"], + resetToken: ["PATCH /applications/{client_id}/token"], + revokeInstallationAccessToken: ["DELETE /installation/token"], + scopeToken: ["POST /applications/{client_id}/token/scoped"], + suspendInstallation: ["PUT /app/installations/{installation_id}/suspended"], + unsuspendInstallation: ["DELETE /app/installations/{installation_id}/suspended"], + updateWebhookConfigForApp: ["PATCH /app/hook/config"] + }, + billing: { + getGithubActionsBillingOrg: ["GET /orgs/{org}/settings/billing/actions"], + getGithubActionsBillingUser: ["GET /users/{username}/settings/billing/actions"], + getGithubAdvancedSecurityBillingGhe: ["GET /enterprises/{enterprise}/settings/billing/advanced-security"], + getGithubAdvancedSecurityBillingOrg: ["GET /orgs/{org}/settings/billing/advanced-security"], + getGithubPackagesBillingOrg: ["GET /orgs/{org}/settings/billing/packages"], + getGithubPackagesBillingUser: ["GET /users/{username}/settings/billing/packages"], + getSharedStorageBillingOrg: ["GET /orgs/{org}/settings/billing/shared-storage"], + getSharedStorageBillingUser: ["GET /users/{username}/settings/billing/shared-storage"] + }, + checks: { + create: ["POST /repos/{owner}/{repo}/check-runs"], + createSuite: ["POST /repos/{owner}/{repo}/check-suites"], + get: ["GET /repos/{owner}/{repo}/check-runs/{check_run_id}"], + getSuite: ["GET /repos/{owner}/{repo}/check-suites/{check_suite_id}"], + listAnnotations: ["GET /repos/{owner}/{repo}/check-runs/{check_run_id}/annotations"], + listForRef: ["GET /repos/{owner}/{repo}/commits/{ref}/check-runs"], + listForSuite: ["GET /repos/{owner}/{repo}/check-suites/{check_suite_id}/check-runs"], + listSuitesForRef: ["GET /repos/{owner}/{repo}/commits/{ref}/check-suites"], + rerequestRun: ["POST /repos/{owner}/{repo}/check-runs/{check_run_id}/rerequest"], + rerequestSuite: ["POST /repos/{owner}/{repo}/check-suites/{check_suite_id}/rerequest"], + setSuitesPreferences: ["PATCH /repos/{owner}/{repo}/check-suites/preferences"], + update: ["PATCH /repos/{owner}/{repo}/check-runs/{check_run_id}"] + }, + codeScanning: { + deleteAnalysis: ["DELETE /repos/{owner}/{repo}/code-scanning/analyses/{analysis_id}{?confirm_delete}"], + getAlert: ["GET /repos/{owner}/{repo}/code-scanning/alerts/{alert_number}", {}, { + renamedParameters: { + alert_id: "alert_number" + } + }], + getAnalysis: ["GET /repos/{owner}/{repo}/code-scanning/analyses/{analysis_id}"], + getSarif: ["GET /repos/{owner}/{repo}/code-scanning/sarifs/{sarif_id}"], + listAlertInstances: ["GET /repos/{owner}/{repo}/code-scanning/alerts/{alert_number}/instances"], + listAlertsForOrg: ["GET /orgs/{org}/code-scanning/alerts"], + listAlertsForRepo: ["GET /repos/{owner}/{repo}/code-scanning/alerts"], + listAlertsInstances: ["GET /repos/{owner}/{repo}/code-scanning/alerts/{alert_number}/instances", {}, { + renamed: ["codeScanning", "listAlertInstances"] + }], + listRecentAnalyses: ["GET /repos/{owner}/{repo}/code-scanning/analyses"], + updateAlert: ["PATCH /repos/{owner}/{repo}/code-scanning/alerts/{alert_number}"], + uploadSarif: ["POST /repos/{owner}/{repo}/code-scanning/sarifs"] + }, + codesOfConduct: { + getAllCodesOfConduct: ["GET /codes_of_conduct"], + getConductCode: ["GET /codes_of_conduct/{key}"] + }, + codespaces: { + addRepositoryForSecretForAuthenticatedUser: ["PUT /user/codespaces/secrets/{secret_name}/repositories/{repository_id}"], + codespaceMachinesForAuthenticatedUser: ["GET /user/codespaces/{codespace_name}/machines"], + createForAuthenticatedUser: ["POST /user/codespaces"], + createOrUpdateRepoSecret: ["PUT /repos/{owner}/{repo}/codespaces/secrets/{secret_name}"], + createOrUpdateSecretForAuthenticatedUser: ["PUT /user/codespaces/secrets/{secret_name}"], + createWithPrForAuthenticatedUser: ["POST /repos/{owner}/{repo}/pulls/{pull_number}/codespaces"], + createWithRepoForAuthenticatedUser: ["POST /repos/{owner}/{repo}/codespaces"], + deleteForAuthenticatedUser: ["DELETE /user/codespaces/{codespace_name}"], + deleteFromOrganization: ["DELETE /orgs/{org}/members/{username}/codespaces/{codespace_name}"], + deleteRepoSecret: ["DELETE /repos/{owner}/{repo}/codespaces/secrets/{secret_name}"], + deleteSecretForAuthenticatedUser: ["DELETE /user/codespaces/secrets/{secret_name}"], + exportForAuthenticatedUser: ["POST /user/codespaces/{codespace_name}/exports"], + getExportDetailsForAuthenticatedUser: ["GET /user/codespaces/{codespace_name}/exports/{export_id}"], + getForAuthenticatedUser: ["GET /user/codespaces/{codespace_name}"], + getPublicKeyForAuthenticatedUser: ["GET /user/codespaces/secrets/public-key"], + getRepoPublicKey: ["GET /repos/{owner}/{repo}/codespaces/secrets/public-key"], + getRepoSecret: ["GET /repos/{owner}/{repo}/codespaces/secrets/{secret_name}"], + getSecretForAuthenticatedUser: ["GET /user/codespaces/secrets/{secret_name}"], + listDevcontainersInRepositoryForAuthenticatedUser: ["GET /repos/{owner}/{repo}/codespaces/devcontainers"], + listForAuthenticatedUser: ["GET /user/codespaces"], + listInOrganization: ["GET /orgs/{org}/codespaces", {}, { + renamedParameters: { + org_id: "org" + } + }], + listInRepositoryForAuthenticatedUser: ["GET /repos/{owner}/{repo}/codespaces"], + listRepoSecrets: ["GET /repos/{owner}/{repo}/codespaces/secrets"], + listRepositoriesForSecretForAuthenticatedUser: ["GET /user/codespaces/secrets/{secret_name}/repositories"], + listSecretsForAuthenticatedUser: ["GET /user/codespaces/secrets"], + removeRepositoryForSecretForAuthenticatedUser: ["DELETE /user/codespaces/secrets/{secret_name}/repositories/{repository_id}"], + repoMachinesForAuthenticatedUser: ["GET /repos/{owner}/{repo}/codespaces/machines"], + setRepositoriesForSecretForAuthenticatedUser: ["PUT /user/codespaces/secrets/{secret_name}/repositories"], + startForAuthenticatedUser: ["POST /user/codespaces/{codespace_name}/start"], + stopForAuthenticatedUser: ["POST /user/codespaces/{codespace_name}/stop"], + stopInOrganization: ["POST /orgs/{org}/members/{username}/codespaces/{codespace_name}/stop"], + updateForAuthenticatedUser: ["PATCH /user/codespaces/{codespace_name}"] + }, + dependabot: { + addSelectedRepoToOrgSecret: ["PUT /orgs/{org}/dependabot/secrets/{secret_name}/repositories/{repository_id}"], + createOrUpdateOrgSecret: ["PUT /orgs/{org}/dependabot/secrets/{secret_name}"], + createOrUpdateRepoSecret: ["PUT /repos/{owner}/{repo}/dependabot/secrets/{secret_name}"], + deleteOrgSecret: ["DELETE /orgs/{org}/dependabot/secrets/{secret_name}"], + deleteRepoSecret: ["DELETE /repos/{owner}/{repo}/dependabot/secrets/{secret_name}"], + getOrgPublicKey: ["GET /orgs/{org}/dependabot/secrets/public-key"], + getOrgSecret: ["GET /orgs/{org}/dependabot/secrets/{secret_name}"], + getRepoPublicKey: ["GET /repos/{owner}/{repo}/dependabot/secrets/public-key"], + getRepoSecret: ["GET /repos/{owner}/{repo}/dependabot/secrets/{secret_name}"], + listOrgSecrets: ["GET /orgs/{org}/dependabot/secrets"], + listRepoSecrets: ["GET /repos/{owner}/{repo}/dependabot/secrets"], + listSelectedReposForOrgSecret: ["GET /orgs/{org}/dependabot/secrets/{secret_name}/repositories"], + removeSelectedRepoFromOrgSecret: ["DELETE /orgs/{org}/dependabot/secrets/{secret_name}/repositories/{repository_id}"], + setSelectedReposForOrgSecret: ["PUT /orgs/{org}/dependabot/secrets/{secret_name}/repositories"] + }, + dependencyGraph: { + createRepositorySnapshot: ["POST /repos/{owner}/{repo}/dependency-graph/snapshots"], + diffRange: ["GET /repos/{owner}/{repo}/dependency-graph/compare/{basehead}"] + }, + emojis: { + get: ["GET /emojis"] + }, + enterpriseAdmin: { + addCustomLabelsToSelfHostedRunnerForEnterprise: ["POST /enterprises/{enterprise}/actions/runners/{runner_id}/labels"], + disableSelectedOrganizationGithubActionsEnterprise: ["DELETE /enterprises/{enterprise}/actions/permissions/organizations/{org_id}"], + enableSelectedOrganizationGithubActionsEnterprise: ["PUT /enterprises/{enterprise}/actions/permissions/organizations/{org_id}"], + getAllowedActionsEnterprise: ["GET /enterprises/{enterprise}/actions/permissions/selected-actions"], + getGithubActionsPermissionsEnterprise: ["GET /enterprises/{enterprise}/actions/permissions"], + getServerStatistics: ["GET /enterprise-installation/{enterprise_or_org}/server-statistics"], + listLabelsForSelfHostedRunnerForEnterprise: ["GET /enterprises/{enterprise}/actions/runners/{runner_id}/labels"], + listSelectedOrganizationsEnabledGithubActionsEnterprise: ["GET /enterprises/{enterprise}/actions/permissions/organizations"], + removeAllCustomLabelsFromSelfHostedRunnerForEnterprise: ["DELETE /enterprises/{enterprise}/actions/runners/{runner_id}/labels"], + removeCustomLabelFromSelfHostedRunnerForEnterprise: ["DELETE /enterprises/{enterprise}/actions/runners/{runner_id}/labels/{name}"], + setAllowedActionsEnterprise: ["PUT /enterprises/{enterprise}/actions/permissions/selected-actions"], + setCustomLabelsForSelfHostedRunnerForEnterprise: ["PUT /enterprises/{enterprise}/actions/runners/{runner_id}/labels"], + setGithubActionsPermissionsEnterprise: ["PUT /enterprises/{enterprise}/actions/permissions"], + setSelectedOrganizationsEnabledGithubActionsEnterprise: ["PUT /enterprises/{enterprise}/actions/permissions/organizations"] + }, + gists: { + checkIsStarred: ["GET /gists/{gist_id}/star"], + create: ["POST /gists"], + createComment: ["POST /gists/{gist_id}/comments"], + delete: ["DELETE /gists/{gist_id}"], + deleteComment: ["DELETE /gists/{gist_id}/comments/{comment_id}"], + fork: ["POST /gists/{gist_id}/forks"], + get: ["GET /gists/{gist_id}"], + getComment: ["GET /gists/{gist_id}/comments/{comment_id}"], + getRevision: ["GET /gists/{gist_id}/{sha}"], + list: ["GET /gists"], + listComments: ["GET /gists/{gist_id}/comments"], + listCommits: ["GET /gists/{gist_id}/commits"], + listForUser: ["GET /users/{username}/gists"], + listForks: ["GET /gists/{gist_id}/forks"], + listPublic: ["GET /gists/public"], + listStarred: ["GET /gists/starred"], + star: ["PUT /gists/{gist_id}/star"], + unstar: ["DELETE /gists/{gist_id}/star"], + update: ["PATCH /gists/{gist_id}"], + updateComment: ["PATCH /gists/{gist_id}/comments/{comment_id}"] + }, + git: { + createBlob: ["POST /repos/{owner}/{repo}/git/blobs"], + createCommit: ["POST /repos/{owner}/{repo}/git/commits"], + createRef: ["POST /repos/{owner}/{repo}/git/refs"], + createTag: ["POST /repos/{owner}/{repo}/git/tags"], + createTree: ["POST /repos/{owner}/{repo}/git/trees"], + deleteRef: ["DELETE /repos/{owner}/{repo}/git/refs/{ref}"], + getBlob: ["GET /repos/{owner}/{repo}/git/blobs/{file_sha}"], + getCommit: ["GET /repos/{owner}/{repo}/git/commits/{commit_sha}"], + getRef: ["GET /repos/{owner}/{repo}/git/ref/{ref}"], + getTag: ["GET /repos/{owner}/{repo}/git/tags/{tag_sha}"], + getTree: ["GET /repos/{owner}/{repo}/git/trees/{tree_sha}"], + listMatchingRefs: ["GET /repos/{owner}/{repo}/git/matching-refs/{ref}"], + updateRef: ["PATCH /repos/{owner}/{repo}/git/refs/{ref}"] + }, + gitignore: { + getAllTemplates: ["GET /gitignore/templates"], + getTemplate: ["GET /gitignore/templates/{name}"] + }, + interactions: { + getRestrictionsForAuthenticatedUser: ["GET /user/interaction-limits"], + getRestrictionsForOrg: ["GET /orgs/{org}/interaction-limits"], + getRestrictionsForRepo: ["GET /repos/{owner}/{repo}/interaction-limits"], + getRestrictionsForYourPublicRepos: ["GET /user/interaction-limits", {}, { + renamed: ["interactions", "getRestrictionsForAuthenticatedUser"] + }], + removeRestrictionsForAuthenticatedUser: ["DELETE /user/interaction-limits"], + removeRestrictionsForOrg: ["DELETE /orgs/{org}/interaction-limits"], + removeRestrictionsForRepo: ["DELETE /repos/{owner}/{repo}/interaction-limits"], + removeRestrictionsForYourPublicRepos: ["DELETE /user/interaction-limits", {}, { + renamed: ["interactions", "removeRestrictionsForAuthenticatedUser"] + }], + setRestrictionsForAuthenticatedUser: ["PUT /user/interaction-limits"], + setRestrictionsForOrg: ["PUT /orgs/{org}/interaction-limits"], + setRestrictionsForRepo: ["PUT /repos/{owner}/{repo}/interaction-limits"], + setRestrictionsForYourPublicRepos: ["PUT /user/interaction-limits", {}, { + renamed: ["interactions", "setRestrictionsForAuthenticatedUser"] + }] + }, + issues: { + addAssignees: ["POST /repos/{owner}/{repo}/issues/{issue_number}/assignees"], + addLabels: ["POST /repos/{owner}/{repo}/issues/{issue_number}/labels"], + checkUserCanBeAssigned: ["GET /repos/{owner}/{repo}/assignees/{assignee}"], + create: ["POST /repos/{owner}/{repo}/issues"], + createComment: ["POST /repos/{owner}/{repo}/issues/{issue_number}/comments"], + createLabel: ["POST /repos/{owner}/{repo}/labels"], + createMilestone: ["POST /repos/{owner}/{repo}/milestones"], + deleteComment: ["DELETE /repos/{owner}/{repo}/issues/comments/{comment_id}"], + deleteLabel: ["DELETE /repos/{owner}/{repo}/labels/{name}"], + deleteMilestone: ["DELETE /repos/{owner}/{repo}/milestones/{milestone_number}"], + get: ["GET /repos/{owner}/{repo}/issues/{issue_number}"], + getComment: ["GET /repos/{owner}/{repo}/issues/comments/{comment_id}"], + getEvent: ["GET /repos/{owner}/{repo}/issues/events/{event_id}"], + getLabel: ["GET /repos/{owner}/{repo}/labels/{name}"], + getMilestone: ["GET /repos/{owner}/{repo}/milestones/{milestone_number}"], + list: ["GET /issues"], + listAssignees: ["GET /repos/{owner}/{repo}/assignees"], + listComments: ["GET /repos/{owner}/{repo}/issues/{issue_number}/comments"], + listCommentsForRepo: ["GET /repos/{owner}/{repo}/issues/comments"], + listEvents: ["GET /repos/{owner}/{repo}/issues/{issue_number}/events"], + listEventsForRepo: ["GET /repos/{owner}/{repo}/issues/events"], + listEventsForTimeline: ["GET /repos/{owner}/{repo}/issues/{issue_number}/timeline"], + listForAuthenticatedUser: ["GET /user/issues"], + listForOrg: ["GET /orgs/{org}/issues"], + listForRepo: ["GET /repos/{owner}/{repo}/issues"], + listLabelsForMilestone: ["GET /repos/{owner}/{repo}/milestones/{milestone_number}/labels"], + listLabelsForRepo: ["GET /repos/{owner}/{repo}/labels"], + listLabelsOnIssue: ["GET /repos/{owner}/{repo}/issues/{issue_number}/labels"], + listMilestones: ["GET /repos/{owner}/{repo}/milestones"], + lock: ["PUT /repos/{owner}/{repo}/issues/{issue_number}/lock"], + removeAllLabels: ["DELETE /repos/{owner}/{repo}/issues/{issue_number}/labels"], + removeAssignees: ["DELETE /repos/{owner}/{repo}/issues/{issue_number}/assignees"], + removeLabel: ["DELETE /repos/{owner}/{repo}/issues/{issue_number}/labels/{name}"], + setLabels: ["PUT /repos/{owner}/{repo}/issues/{issue_number}/labels"], + unlock: ["DELETE /repos/{owner}/{repo}/issues/{issue_number}/lock"], + update: ["PATCH /repos/{owner}/{repo}/issues/{issue_number}"], + updateComment: ["PATCH /repos/{owner}/{repo}/issues/comments/{comment_id}"], + updateLabel: ["PATCH /repos/{owner}/{repo}/labels/{name}"], + updateMilestone: ["PATCH /repos/{owner}/{repo}/milestones/{milestone_number}"] + }, + licenses: { + get: ["GET /licenses/{license}"], + getAllCommonlyUsed: ["GET /licenses"], + getForRepo: ["GET /repos/{owner}/{repo}/license"] + }, + markdown: { + render: ["POST /markdown"], + renderRaw: ["POST /markdown/raw", { + headers: { + "content-type": "text/plain; charset=utf-8" + } + }] + }, + meta: { + get: ["GET /meta"], + getOctocat: ["GET /octocat"], + getZen: ["GET /zen"], + root: ["GET /"] + }, + migrations: { + cancelImport: ["DELETE /repos/{owner}/{repo}/import"], + deleteArchiveForAuthenticatedUser: ["DELETE /user/migrations/{migration_id}/archive"], + deleteArchiveForOrg: ["DELETE /orgs/{org}/migrations/{migration_id}/archive"], + downloadArchiveForOrg: ["GET /orgs/{org}/migrations/{migration_id}/archive"], + getArchiveForAuthenticatedUser: ["GET /user/migrations/{migration_id}/archive"], + getCommitAuthors: ["GET /repos/{owner}/{repo}/import/authors"], + getImportStatus: ["GET /repos/{owner}/{repo}/import"], + getLargeFiles: ["GET /repos/{owner}/{repo}/import/large_files"], + getStatusForAuthenticatedUser: ["GET /user/migrations/{migration_id}"], + getStatusForOrg: ["GET /orgs/{org}/migrations/{migration_id}"], + listForAuthenticatedUser: ["GET /user/migrations"], + listForOrg: ["GET /orgs/{org}/migrations"], + listReposForAuthenticatedUser: ["GET /user/migrations/{migration_id}/repositories"], + listReposForOrg: ["GET /orgs/{org}/migrations/{migration_id}/repositories"], + listReposForUser: ["GET /user/migrations/{migration_id}/repositories", {}, { + renamed: ["migrations", "listReposForAuthenticatedUser"] + }], + mapCommitAuthor: ["PATCH /repos/{owner}/{repo}/import/authors/{author_id}"], + setLfsPreference: ["PATCH /repos/{owner}/{repo}/import/lfs"], + startForAuthenticatedUser: ["POST /user/migrations"], + startForOrg: ["POST /orgs/{org}/migrations"], + startImport: ["PUT /repos/{owner}/{repo}/import"], + unlockRepoForAuthenticatedUser: ["DELETE /user/migrations/{migration_id}/repos/{repo_name}/lock"], + unlockRepoForOrg: ["DELETE /orgs/{org}/migrations/{migration_id}/repos/{repo_name}/lock"], + updateImport: ["PATCH /repos/{owner}/{repo}/import"] + }, + orgs: { + blockUser: ["PUT /orgs/{org}/blocks/{username}"], + cancelInvitation: ["DELETE /orgs/{org}/invitations/{invitation_id}"], + checkBlockedUser: ["GET /orgs/{org}/blocks/{username}"], + checkMembershipForUser: ["GET /orgs/{org}/members/{username}"], + checkPublicMembershipForUser: ["GET /orgs/{org}/public_members/{username}"], + convertMemberToOutsideCollaborator: ["PUT /orgs/{org}/outside_collaborators/{username}"], + createInvitation: ["POST /orgs/{org}/invitations"], + createWebhook: ["POST /orgs/{org}/hooks"], + deleteWebhook: ["DELETE /orgs/{org}/hooks/{hook_id}"], + get: ["GET /orgs/{org}"], + getMembershipForAuthenticatedUser: ["GET /user/memberships/orgs/{org}"], + getMembershipForUser: ["GET /orgs/{org}/memberships/{username}"], + getWebhook: ["GET /orgs/{org}/hooks/{hook_id}"], + getWebhookConfigForOrg: ["GET /orgs/{org}/hooks/{hook_id}/config"], + getWebhookDelivery: ["GET /orgs/{org}/hooks/{hook_id}/deliveries/{delivery_id}"], + list: ["GET /organizations"], + listAppInstallations: ["GET /orgs/{org}/installations"], + listBlockedUsers: ["GET /orgs/{org}/blocks"], + listCustomRoles: ["GET /organizations/{organization_id}/custom_roles"], + listFailedInvitations: ["GET /orgs/{org}/failed_invitations"], + listForAuthenticatedUser: ["GET /user/orgs"], + listForUser: ["GET /users/{username}/orgs"], + listInvitationTeams: ["GET /orgs/{org}/invitations/{invitation_id}/teams"], + listMembers: ["GET /orgs/{org}/members"], + listMembershipsForAuthenticatedUser: ["GET /user/memberships/orgs"], + listOutsideCollaborators: ["GET /orgs/{org}/outside_collaborators"], + listPendingInvitations: ["GET /orgs/{org}/invitations"], + listPublicMembers: ["GET /orgs/{org}/public_members"], + listWebhookDeliveries: ["GET /orgs/{org}/hooks/{hook_id}/deliveries"], + listWebhooks: ["GET /orgs/{org}/hooks"], + pingWebhook: ["POST /orgs/{org}/hooks/{hook_id}/pings"], + redeliverWebhookDelivery: ["POST /orgs/{org}/hooks/{hook_id}/deliveries/{delivery_id}/attempts"], + removeMember: ["DELETE /orgs/{org}/members/{username}"], + removeMembershipForUser: ["DELETE /orgs/{org}/memberships/{username}"], + removeOutsideCollaborator: ["DELETE /orgs/{org}/outside_collaborators/{username}"], + removePublicMembershipForAuthenticatedUser: ["DELETE /orgs/{org}/public_members/{username}"], + setMembershipForUser: ["PUT /orgs/{org}/memberships/{username}"], + setPublicMembershipForAuthenticatedUser: ["PUT /orgs/{org}/public_members/{username}"], + unblockUser: ["DELETE /orgs/{org}/blocks/{username}"], + update: ["PATCH /orgs/{org}"], + updateMembershipForAuthenticatedUser: ["PATCH /user/memberships/orgs/{org}"], + updateWebhook: ["PATCH /orgs/{org}/hooks/{hook_id}"], + updateWebhookConfigForOrg: ["PATCH /orgs/{org}/hooks/{hook_id}/config"] + }, + packages: { + deletePackageForAuthenticatedUser: ["DELETE /user/packages/{package_type}/{package_name}"], + deletePackageForOrg: ["DELETE /orgs/{org}/packages/{package_type}/{package_name}"], + deletePackageForUser: ["DELETE /users/{username}/packages/{package_type}/{package_name}"], + deletePackageVersionForAuthenticatedUser: ["DELETE /user/packages/{package_type}/{package_name}/versions/{package_version_id}"], + deletePackageVersionForOrg: ["DELETE /orgs/{org}/packages/{package_type}/{package_name}/versions/{package_version_id}"], + deletePackageVersionForUser: ["DELETE /users/{username}/packages/{package_type}/{package_name}/versions/{package_version_id}"], + getAllPackageVersionsForAPackageOwnedByAnOrg: ["GET /orgs/{org}/packages/{package_type}/{package_name}/versions", {}, { + renamed: ["packages", "getAllPackageVersionsForPackageOwnedByOrg"] + }], + getAllPackageVersionsForAPackageOwnedByTheAuthenticatedUser: ["GET /user/packages/{package_type}/{package_name}/versions", {}, { + renamed: ["packages", "getAllPackageVersionsForPackageOwnedByAuthenticatedUser"] + }], + getAllPackageVersionsForPackageOwnedByAuthenticatedUser: ["GET /user/packages/{package_type}/{package_name}/versions"], + getAllPackageVersionsForPackageOwnedByOrg: ["GET /orgs/{org}/packages/{package_type}/{package_name}/versions"], + getAllPackageVersionsForPackageOwnedByUser: ["GET /users/{username}/packages/{package_type}/{package_name}/versions"], + getPackageForAuthenticatedUser: ["GET /user/packages/{package_type}/{package_name}"], + getPackageForOrganization: ["GET /orgs/{org}/packages/{package_type}/{package_name}"], + getPackageForUser: ["GET /users/{username}/packages/{package_type}/{package_name}"], + getPackageVersionForAuthenticatedUser: ["GET /user/packages/{package_type}/{package_name}/versions/{package_version_id}"], + getPackageVersionForOrganization: ["GET /orgs/{org}/packages/{package_type}/{package_name}/versions/{package_version_id}"], + getPackageVersionForUser: ["GET /users/{username}/packages/{package_type}/{package_name}/versions/{package_version_id}"], + listPackagesForAuthenticatedUser: ["GET /user/packages"], + listPackagesForOrganization: ["GET /orgs/{org}/packages"], + listPackagesForUser: ["GET /users/{username}/packages"], + restorePackageForAuthenticatedUser: ["POST /user/packages/{package_type}/{package_name}/restore{?token}"], + restorePackageForOrg: ["POST /orgs/{org}/packages/{package_type}/{package_name}/restore{?token}"], + restorePackageForUser: ["POST /users/{username}/packages/{package_type}/{package_name}/restore{?token}"], + restorePackageVersionForAuthenticatedUser: ["POST /user/packages/{package_type}/{package_name}/versions/{package_version_id}/restore"], + restorePackageVersionForOrg: ["POST /orgs/{org}/packages/{package_type}/{package_name}/versions/{package_version_id}/restore"], + restorePackageVersionForUser: ["POST /users/{username}/packages/{package_type}/{package_name}/versions/{package_version_id}/restore"] + }, + projects: { + addCollaborator: ["PUT /projects/{project_id}/collaborators/{username}"], + createCard: ["POST /projects/columns/{column_id}/cards"], + createColumn: ["POST /projects/{project_id}/columns"], + createForAuthenticatedUser: ["POST /user/projects"], + createForOrg: ["POST /orgs/{org}/projects"], + createForRepo: ["POST /repos/{owner}/{repo}/projects"], + delete: ["DELETE /projects/{project_id}"], + deleteCard: ["DELETE /projects/columns/cards/{card_id}"], + deleteColumn: ["DELETE /projects/columns/{column_id}"], + get: ["GET /projects/{project_id}"], + getCard: ["GET /projects/columns/cards/{card_id}"], + getColumn: ["GET /projects/columns/{column_id}"], + getPermissionForUser: ["GET /projects/{project_id}/collaborators/{username}/permission"], + listCards: ["GET /projects/columns/{column_id}/cards"], + listCollaborators: ["GET /projects/{project_id}/collaborators"], + listColumns: ["GET /projects/{project_id}/columns"], + listForOrg: ["GET /orgs/{org}/projects"], + listForRepo: ["GET /repos/{owner}/{repo}/projects"], + listForUser: ["GET /users/{username}/projects"], + moveCard: ["POST /projects/columns/cards/{card_id}/moves"], + moveColumn: ["POST /projects/columns/{column_id}/moves"], + removeCollaborator: ["DELETE /projects/{project_id}/collaborators/{username}"], + update: ["PATCH /projects/{project_id}"], + updateCard: ["PATCH /projects/columns/cards/{card_id}"], + updateColumn: ["PATCH /projects/columns/{column_id}"] + }, + pulls: { + checkIfMerged: ["GET /repos/{owner}/{repo}/pulls/{pull_number}/merge"], + create: ["POST /repos/{owner}/{repo}/pulls"], + createReplyForReviewComment: ["POST /repos/{owner}/{repo}/pulls/{pull_number}/comments/{comment_id}/replies"], + createReview: ["POST /repos/{owner}/{repo}/pulls/{pull_number}/reviews"], + createReviewComment: ["POST /repos/{owner}/{repo}/pulls/{pull_number}/comments"], + deletePendingReview: ["DELETE /repos/{owner}/{repo}/pulls/{pull_number}/reviews/{review_id}"], + deleteReviewComment: ["DELETE /repos/{owner}/{repo}/pulls/comments/{comment_id}"], + dismissReview: ["PUT /repos/{owner}/{repo}/pulls/{pull_number}/reviews/{review_id}/dismissals"], + get: ["GET /repos/{owner}/{repo}/pulls/{pull_number}"], + getReview: ["GET /repos/{owner}/{repo}/pulls/{pull_number}/reviews/{review_id}"], + getReviewComment: ["GET /repos/{owner}/{repo}/pulls/comments/{comment_id}"], + list: ["GET /repos/{owner}/{repo}/pulls"], + listCommentsForReview: ["GET /repos/{owner}/{repo}/pulls/{pull_number}/reviews/{review_id}/comments"], + listCommits: ["GET /repos/{owner}/{repo}/pulls/{pull_number}/commits"], + listFiles: ["GET /repos/{owner}/{repo}/pulls/{pull_number}/files"], + listRequestedReviewers: ["GET /repos/{owner}/{repo}/pulls/{pull_number}/requested_reviewers"], + listReviewComments: ["GET /repos/{owner}/{repo}/pulls/{pull_number}/comments"], + listReviewCommentsForRepo: ["GET /repos/{owner}/{repo}/pulls/comments"], + listReviews: ["GET /repos/{owner}/{repo}/pulls/{pull_number}/reviews"], + merge: ["PUT /repos/{owner}/{repo}/pulls/{pull_number}/merge"], + removeRequestedReviewers: ["DELETE /repos/{owner}/{repo}/pulls/{pull_number}/requested_reviewers"], + requestReviewers: ["POST /repos/{owner}/{repo}/pulls/{pull_number}/requested_reviewers"], + submitReview: ["POST /repos/{owner}/{repo}/pulls/{pull_number}/reviews/{review_id}/events"], + update: ["PATCH /repos/{owner}/{repo}/pulls/{pull_number}"], + updateBranch: ["PUT /repos/{owner}/{repo}/pulls/{pull_number}/update-branch"], + updateReview: ["PUT /repos/{owner}/{repo}/pulls/{pull_number}/reviews/{review_id}"], + updateReviewComment: ["PATCH /repos/{owner}/{repo}/pulls/comments/{comment_id}"] + }, + rateLimit: { + get: ["GET /rate_limit"] + }, + reactions: { + createForCommitComment: ["POST /repos/{owner}/{repo}/comments/{comment_id}/reactions"], + createForIssue: ["POST /repos/{owner}/{repo}/issues/{issue_number}/reactions"], + createForIssueComment: ["POST /repos/{owner}/{repo}/issues/comments/{comment_id}/reactions"], + createForPullRequestReviewComment: ["POST /repos/{owner}/{repo}/pulls/comments/{comment_id}/reactions"], + createForRelease: ["POST /repos/{owner}/{repo}/releases/{release_id}/reactions"], + createForTeamDiscussionCommentInOrg: ["POST /orgs/{org}/teams/{team_slug}/discussions/{discussion_number}/comments/{comment_number}/reactions"], + createForTeamDiscussionInOrg: ["POST /orgs/{org}/teams/{team_slug}/discussions/{discussion_number}/reactions"], + deleteForCommitComment: ["DELETE /repos/{owner}/{repo}/comments/{comment_id}/reactions/{reaction_id}"], + deleteForIssue: ["DELETE /repos/{owner}/{repo}/issues/{issue_number}/reactions/{reaction_id}"], + deleteForIssueComment: ["DELETE /repos/{owner}/{repo}/issues/comments/{comment_id}/reactions/{reaction_id}"], + deleteForPullRequestComment: ["DELETE /repos/{owner}/{repo}/pulls/comments/{comment_id}/reactions/{reaction_id}"], + deleteForRelease: ["DELETE /repos/{owner}/{repo}/releases/{release_id}/reactions/{reaction_id}"], + deleteForTeamDiscussion: ["DELETE /orgs/{org}/teams/{team_slug}/discussions/{discussion_number}/reactions/{reaction_id}"], + deleteForTeamDiscussionComment: ["DELETE /orgs/{org}/teams/{team_slug}/discussions/{discussion_number}/comments/{comment_number}/reactions/{reaction_id}"], + listForCommitComment: ["GET /repos/{owner}/{repo}/comments/{comment_id}/reactions"], + listForIssue: ["GET /repos/{owner}/{repo}/issues/{issue_number}/reactions"], + listForIssueComment: ["GET /repos/{owner}/{repo}/issues/comments/{comment_id}/reactions"], + listForPullRequestReviewComment: ["GET /repos/{owner}/{repo}/pulls/comments/{comment_id}/reactions"], + listForRelease: ["GET /repos/{owner}/{repo}/releases/{release_id}/reactions"], + listForTeamDiscussionCommentInOrg: ["GET /orgs/{org}/teams/{team_slug}/discussions/{discussion_number}/comments/{comment_number}/reactions"], + listForTeamDiscussionInOrg: ["GET /orgs/{org}/teams/{team_slug}/discussions/{discussion_number}/reactions"] + }, + repos: { + acceptInvitation: ["PATCH /user/repository_invitations/{invitation_id}", {}, { + renamed: ["repos", "acceptInvitationForAuthenticatedUser"] + }], + acceptInvitationForAuthenticatedUser: ["PATCH /user/repository_invitations/{invitation_id}"], + addAppAccessRestrictions: ["POST /repos/{owner}/{repo}/branches/{branch}/protection/restrictions/apps", {}, { + mapToData: "apps" + }], + addCollaborator: ["PUT /repos/{owner}/{repo}/collaborators/{username}"], + addStatusCheckContexts: ["POST /repos/{owner}/{repo}/branches/{branch}/protection/required_status_checks/contexts", {}, { + mapToData: "contexts" + }], + addTeamAccessRestrictions: ["POST /repos/{owner}/{repo}/branches/{branch}/protection/restrictions/teams", {}, { + mapToData: "teams" + }], + addUserAccessRestrictions: ["POST /repos/{owner}/{repo}/branches/{branch}/protection/restrictions/users", {}, { + mapToData: "users" + }], + checkCollaborator: ["GET /repos/{owner}/{repo}/collaborators/{username}"], + checkVulnerabilityAlerts: ["GET /repos/{owner}/{repo}/vulnerability-alerts"], + codeownersErrors: ["GET /repos/{owner}/{repo}/codeowners/errors"], + compareCommits: ["GET /repos/{owner}/{repo}/compare/{base}...{head}"], + compareCommitsWithBasehead: ["GET /repos/{owner}/{repo}/compare/{basehead}"], + createAutolink: ["POST /repos/{owner}/{repo}/autolinks"], + createCommitComment: ["POST /repos/{owner}/{repo}/commits/{commit_sha}/comments"], + createCommitSignatureProtection: ["POST /repos/{owner}/{repo}/branches/{branch}/protection/required_signatures"], + createCommitStatus: ["POST /repos/{owner}/{repo}/statuses/{sha}"], + createDeployKey: ["POST /repos/{owner}/{repo}/keys"], + createDeployment: ["POST /repos/{owner}/{repo}/deployments"], + createDeploymentStatus: ["POST /repos/{owner}/{repo}/deployments/{deployment_id}/statuses"], + createDispatchEvent: ["POST /repos/{owner}/{repo}/dispatches"], + createForAuthenticatedUser: ["POST /user/repos"], + createFork: ["POST /repos/{owner}/{repo}/forks"], + createInOrg: ["POST /orgs/{org}/repos"], + createOrUpdateEnvironment: ["PUT /repos/{owner}/{repo}/environments/{environment_name}"], + createOrUpdateFileContents: ["PUT /repos/{owner}/{repo}/contents/{path}"], + createPagesSite: ["POST /repos/{owner}/{repo}/pages"], + createRelease: ["POST /repos/{owner}/{repo}/releases"], + createTagProtection: ["POST /repos/{owner}/{repo}/tags/protection"], + createUsingTemplate: ["POST /repos/{template_owner}/{template_repo}/generate"], + createWebhook: ["POST /repos/{owner}/{repo}/hooks"], + declineInvitation: ["DELETE /user/repository_invitations/{invitation_id}", {}, { + renamed: ["repos", "declineInvitationForAuthenticatedUser"] + }], + declineInvitationForAuthenticatedUser: ["DELETE /user/repository_invitations/{invitation_id}"], + delete: ["DELETE /repos/{owner}/{repo}"], + deleteAccessRestrictions: ["DELETE /repos/{owner}/{repo}/branches/{branch}/protection/restrictions"], + deleteAdminBranchProtection: ["DELETE /repos/{owner}/{repo}/branches/{branch}/protection/enforce_admins"], + deleteAnEnvironment: ["DELETE /repos/{owner}/{repo}/environments/{environment_name}"], + deleteAutolink: ["DELETE /repos/{owner}/{repo}/autolinks/{autolink_id}"], + deleteBranchProtection: ["DELETE /repos/{owner}/{repo}/branches/{branch}/protection"], + deleteCommitComment: ["DELETE /repos/{owner}/{repo}/comments/{comment_id}"], + deleteCommitSignatureProtection: ["DELETE /repos/{owner}/{repo}/branches/{branch}/protection/required_signatures"], + deleteDeployKey: ["DELETE /repos/{owner}/{repo}/keys/{key_id}"], + deleteDeployment: ["DELETE /repos/{owner}/{repo}/deployments/{deployment_id}"], + deleteFile: ["DELETE /repos/{owner}/{repo}/contents/{path}"], + deleteInvitation: ["DELETE /repos/{owner}/{repo}/invitations/{invitation_id}"], + deletePagesSite: ["DELETE /repos/{owner}/{repo}/pages"], + deletePullRequestReviewProtection: ["DELETE /repos/{owner}/{repo}/branches/{branch}/protection/required_pull_request_reviews"], + deleteRelease: ["DELETE /repos/{owner}/{repo}/releases/{release_id}"], + deleteReleaseAsset: ["DELETE /repos/{owner}/{repo}/releases/assets/{asset_id}"], + deleteTagProtection: ["DELETE /repos/{owner}/{repo}/tags/protection/{tag_protection_id}"], + deleteWebhook: ["DELETE /repos/{owner}/{repo}/hooks/{hook_id}"], + disableAutomatedSecurityFixes: ["DELETE /repos/{owner}/{repo}/automated-security-fixes"], + disableLfsForRepo: ["DELETE /repos/{owner}/{repo}/lfs"], + disableVulnerabilityAlerts: ["DELETE /repos/{owner}/{repo}/vulnerability-alerts"], + downloadArchive: ["GET /repos/{owner}/{repo}/zipball/{ref}", {}, { + renamed: ["repos", "downloadZipballArchive"] + }], + downloadTarballArchive: ["GET /repos/{owner}/{repo}/tarball/{ref}"], + downloadZipballArchive: ["GET /repos/{owner}/{repo}/zipball/{ref}"], + enableAutomatedSecurityFixes: ["PUT /repos/{owner}/{repo}/automated-security-fixes"], + enableLfsForRepo: ["PUT /repos/{owner}/{repo}/lfs"], + enableVulnerabilityAlerts: ["PUT /repos/{owner}/{repo}/vulnerability-alerts"], + generateReleaseNotes: ["POST /repos/{owner}/{repo}/releases/generate-notes"], + get: ["GET /repos/{owner}/{repo}"], + getAccessRestrictions: ["GET /repos/{owner}/{repo}/branches/{branch}/protection/restrictions"], + getAdminBranchProtection: ["GET /repos/{owner}/{repo}/branches/{branch}/protection/enforce_admins"], + getAllEnvironments: ["GET /repos/{owner}/{repo}/environments"], + getAllStatusCheckContexts: ["GET /repos/{owner}/{repo}/branches/{branch}/protection/required_status_checks/contexts"], + getAllTopics: ["GET /repos/{owner}/{repo}/topics"], + getAppsWithAccessToProtectedBranch: ["GET /repos/{owner}/{repo}/branches/{branch}/protection/restrictions/apps"], + getAutolink: ["GET /repos/{owner}/{repo}/autolinks/{autolink_id}"], + getBranch: ["GET /repos/{owner}/{repo}/branches/{branch}"], + getBranchProtection: ["GET /repos/{owner}/{repo}/branches/{branch}/protection"], + getClones: ["GET /repos/{owner}/{repo}/traffic/clones"], + getCodeFrequencyStats: ["GET /repos/{owner}/{repo}/stats/code_frequency"], + getCollaboratorPermissionLevel: ["GET /repos/{owner}/{repo}/collaborators/{username}/permission"], + getCombinedStatusForRef: ["GET /repos/{owner}/{repo}/commits/{ref}/status"], + getCommit: ["GET /repos/{owner}/{repo}/commits/{ref}"], + getCommitActivityStats: ["GET /repos/{owner}/{repo}/stats/commit_activity"], + getCommitComment: ["GET /repos/{owner}/{repo}/comments/{comment_id}"], + getCommitSignatureProtection: ["GET /repos/{owner}/{repo}/branches/{branch}/protection/required_signatures"], + getCommunityProfileMetrics: ["GET /repos/{owner}/{repo}/community/profile"], + getContent: ["GET /repos/{owner}/{repo}/contents/{path}"], + getContributorsStats: ["GET /repos/{owner}/{repo}/stats/contributors"], + getDeployKey: ["GET /repos/{owner}/{repo}/keys/{key_id}"], + getDeployment: ["GET /repos/{owner}/{repo}/deployments/{deployment_id}"], + getDeploymentStatus: ["GET /repos/{owner}/{repo}/deployments/{deployment_id}/statuses/{status_id}"], + getEnvironment: ["GET /repos/{owner}/{repo}/environments/{environment_name}"], + getLatestPagesBuild: ["GET /repos/{owner}/{repo}/pages/builds/latest"], + getLatestRelease: ["GET /repos/{owner}/{repo}/releases/latest"], + getPages: ["GET /repos/{owner}/{repo}/pages"], + getPagesBuild: ["GET /repos/{owner}/{repo}/pages/builds/{build_id}"], + getPagesHealthCheck: ["GET /repos/{owner}/{repo}/pages/health"], + getParticipationStats: ["GET /repos/{owner}/{repo}/stats/participation"], + getPullRequestReviewProtection: ["GET /repos/{owner}/{repo}/branches/{branch}/protection/required_pull_request_reviews"], + getPunchCardStats: ["GET /repos/{owner}/{repo}/stats/punch_card"], + getReadme: ["GET /repos/{owner}/{repo}/readme"], + getReadmeInDirectory: ["GET /repos/{owner}/{repo}/readme/{dir}"], + getRelease: ["GET /repos/{owner}/{repo}/releases/{release_id}"], + getReleaseAsset: ["GET /repos/{owner}/{repo}/releases/assets/{asset_id}"], + getReleaseByTag: ["GET /repos/{owner}/{repo}/releases/tags/{tag}"], + getStatusChecksProtection: ["GET /repos/{owner}/{repo}/branches/{branch}/protection/required_status_checks"], + getTeamsWithAccessToProtectedBranch: ["GET /repos/{owner}/{repo}/branches/{branch}/protection/restrictions/teams"], + getTopPaths: ["GET /repos/{owner}/{repo}/traffic/popular/paths"], + getTopReferrers: ["GET /repos/{owner}/{repo}/traffic/popular/referrers"], + getUsersWithAccessToProtectedBranch: ["GET /repos/{owner}/{repo}/branches/{branch}/protection/restrictions/users"], + getViews: ["GET /repos/{owner}/{repo}/traffic/views"], + getWebhook: ["GET /repos/{owner}/{repo}/hooks/{hook_id}"], + getWebhookConfigForRepo: ["GET /repos/{owner}/{repo}/hooks/{hook_id}/config"], + getWebhookDelivery: ["GET /repos/{owner}/{repo}/hooks/{hook_id}/deliveries/{delivery_id}"], + listAutolinks: ["GET /repos/{owner}/{repo}/autolinks"], + listBranches: ["GET /repos/{owner}/{repo}/branches"], + listBranchesForHeadCommit: ["GET /repos/{owner}/{repo}/commits/{commit_sha}/branches-where-head"], + listCollaborators: ["GET /repos/{owner}/{repo}/collaborators"], + listCommentsForCommit: ["GET /repos/{owner}/{repo}/commits/{commit_sha}/comments"], + listCommitCommentsForRepo: ["GET /repos/{owner}/{repo}/comments"], + listCommitStatusesForRef: ["GET /repos/{owner}/{repo}/commits/{ref}/statuses"], + listCommits: ["GET /repos/{owner}/{repo}/commits"], + listContributors: ["GET /repos/{owner}/{repo}/contributors"], + listDeployKeys: ["GET /repos/{owner}/{repo}/keys"], + listDeploymentStatuses: ["GET /repos/{owner}/{repo}/deployments/{deployment_id}/statuses"], + listDeployments: ["GET /repos/{owner}/{repo}/deployments"], + listForAuthenticatedUser: ["GET /user/repos"], + listForOrg: ["GET /orgs/{org}/repos"], + listForUser: ["GET /users/{username}/repos"], + listForks: ["GET /repos/{owner}/{repo}/forks"], + listInvitations: ["GET /repos/{owner}/{repo}/invitations"], + listInvitationsForAuthenticatedUser: ["GET /user/repository_invitations"], + listLanguages: ["GET /repos/{owner}/{repo}/languages"], + listPagesBuilds: ["GET /repos/{owner}/{repo}/pages/builds"], + listPublic: ["GET /repositories"], + listPullRequestsAssociatedWithCommit: ["GET /repos/{owner}/{repo}/commits/{commit_sha}/pulls"], + listReleaseAssets: ["GET /repos/{owner}/{repo}/releases/{release_id}/assets"], + listReleases: ["GET /repos/{owner}/{repo}/releases"], + listTagProtection: ["GET /repos/{owner}/{repo}/tags/protection"], + listTags: ["GET /repos/{owner}/{repo}/tags"], + listTeams: ["GET /repos/{owner}/{repo}/teams"], + listWebhookDeliveries: ["GET /repos/{owner}/{repo}/hooks/{hook_id}/deliveries"], + listWebhooks: ["GET /repos/{owner}/{repo}/hooks"], + merge: ["POST /repos/{owner}/{repo}/merges"], + mergeUpstream: ["POST /repos/{owner}/{repo}/merge-upstream"], + pingWebhook: ["POST /repos/{owner}/{repo}/hooks/{hook_id}/pings"], + redeliverWebhookDelivery: ["POST /repos/{owner}/{repo}/hooks/{hook_id}/deliveries/{delivery_id}/attempts"], + removeAppAccessRestrictions: ["DELETE /repos/{owner}/{repo}/branches/{branch}/protection/restrictions/apps", {}, { + mapToData: "apps" + }], + removeCollaborator: ["DELETE /repos/{owner}/{repo}/collaborators/{username}"], + removeStatusCheckContexts: ["DELETE /repos/{owner}/{repo}/branches/{branch}/protection/required_status_checks/contexts", {}, { + mapToData: "contexts" + }], + removeStatusCheckProtection: ["DELETE /repos/{owner}/{repo}/branches/{branch}/protection/required_status_checks"], + removeTeamAccessRestrictions: ["DELETE /repos/{owner}/{repo}/branches/{branch}/protection/restrictions/teams", {}, { + mapToData: "teams" + }], + removeUserAccessRestrictions: ["DELETE /repos/{owner}/{repo}/branches/{branch}/protection/restrictions/users", {}, { + mapToData: "users" + }], + renameBranch: ["POST /repos/{owner}/{repo}/branches/{branch}/rename"], + replaceAllTopics: ["PUT /repos/{owner}/{repo}/topics"], + requestPagesBuild: ["POST /repos/{owner}/{repo}/pages/builds"], + setAdminBranchProtection: ["POST /repos/{owner}/{repo}/branches/{branch}/protection/enforce_admins"], + setAppAccessRestrictions: ["PUT /repos/{owner}/{repo}/branches/{branch}/protection/restrictions/apps", {}, { + mapToData: "apps" + }], + setStatusCheckContexts: ["PUT /repos/{owner}/{repo}/branches/{branch}/protection/required_status_checks/contexts", {}, { + mapToData: "contexts" + }], + setTeamAccessRestrictions: ["PUT /repos/{owner}/{repo}/branches/{branch}/protection/restrictions/teams", {}, { + mapToData: "teams" + }], + setUserAccessRestrictions: ["PUT /repos/{owner}/{repo}/branches/{branch}/protection/restrictions/users", {}, { + mapToData: "users" + }], + testPushWebhook: ["POST /repos/{owner}/{repo}/hooks/{hook_id}/tests"], + transfer: ["POST /repos/{owner}/{repo}/transfer"], + update: ["PATCH /repos/{owner}/{repo}"], + updateBranchProtection: ["PUT /repos/{owner}/{repo}/branches/{branch}/protection"], + updateCommitComment: ["PATCH /repos/{owner}/{repo}/comments/{comment_id}"], + updateInformationAboutPagesSite: ["PUT /repos/{owner}/{repo}/pages"], + updateInvitation: ["PATCH /repos/{owner}/{repo}/invitations/{invitation_id}"], + updatePullRequestReviewProtection: ["PATCH /repos/{owner}/{repo}/branches/{branch}/protection/required_pull_request_reviews"], + updateRelease: ["PATCH /repos/{owner}/{repo}/releases/{release_id}"], + updateReleaseAsset: ["PATCH /repos/{owner}/{repo}/releases/assets/{asset_id}"], + updateStatusCheckPotection: ["PATCH /repos/{owner}/{repo}/branches/{branch}/protection/required_status_checks", {}, { + renamed: ["repos", "updateStatusCheckProtection"] + }], + updateStatusCheckProtection: ["PATCH /repos/{owner}/{repo}/branches/{branch}/protection/required_status_checks"], + updateWebhook: ["PATCH /repos/{owner}/{repo}/hooks/{hook_id}"], + updateWebhookConfigForRepo: ["PATCH /repos/{owner}/{repo}/hooks/{hook_id}/config"], + uploadReleaseAsset: ["POST /repos/{owner}/{repo}/releases/{release_id}/assets{?name,label}", { + baseUrl: "https://uploads.github.com" + }] + }, + search: { + code: ["GET /search/code"], + commits: ["GET /search/commits"], + issuesAndPullRequests: ["GET /search/issues"], + labels: ["GET /search/labels"], + repos: ["GET /search/repositories"], + topics: ["GET /search/topics"], + users: ["GET /search/users"] + }, + secretScanning: { + getAlert: ["GET /repos/{owner}/{repo}/secret-scanning/alerts/{alert_number}"], + listAlertsForEnterprise: ["GET /enterprises/{enterprise}/secret-scanning/alerts"], + listAlertsForOrg: ["GET /orgs/{org}/secret-scanning/alerts"], + listAlertsForRepo: ["GET /repos/{owner}/{repo}/secret-scanning/alerts"], + listLocationsForAlert: ["GET /repos/{owner}/{repo}/secret-scanning/alerts/{alert_number}/locations"], + updateAlert: ["PATCH /repos/{owner}/{repo}/secret-scanning/alerts/{alert_number}"] + }, + teams: { + addOrUpdateMembershipForUserInOrg: ["PUT /orgs/{org}/teams/{team_slug}/memberships/{username}"], + addOrUpdateProjectPermissionsInOrg: ["PUT /orgs/{org}/teams/{team_slug}/projects/{project_id}"], + addOrUpdateRepoPermissionsInOrg: ["PUT /orgs/{org}/teams/{team_slug}/repos/{owner}/{repo}"], + checkPermissionsForProjectInOrg: ["GET /orgs/{org}/teams/{team_slug}/projects/{project_id}"], + checkPermissionsForRepoInOrg: ["GET /orgs/{org}/teams/{team_slug}/repos/{owner}/{repo}"], + create: ["POST /orgs/{org}/teams"], + createDiscussionCommentInOrg: ["POST /orgs/{org}/teams/{team_slug}/discussions/{discussion_number}/comments"], + createDiscussionInOrg: ["POST /orgs/{org}/teams/{team_slug}/discussions"], + deleteDiscussionCommentInOrg: ["DELETE /orgs/{org}/teams/{team_slug}/discussions/{discussion_number}/comments/{comment_number}"], + deleteDiscussionInOrg: ["DELETE /orgs/{org}/teams/{team_slug}/discussions/{discussion_number}"], + deleteInOrg: ["DELETE /orgs/{org}/teams/{team_slug}"], + getByName: ["GET /orgs/{org}/teams/{team_slug}"], + getDiscussionCommentInOrg: ["GET /orgs/{org}/teams/{team_slug}/discussions/{discussion_number}/comments/{comment_number}"], + getDiscussionInOrg: ["GET /orgs/{org}/teams/{team_slug}/discussions/{discussion_number}"], + getMembershipForUserInOrg: ["GET /orgs/{org}/teams/{team_slug}/memberships/{username}"], + list: ["GET /orgs/{org}/teams"], + listChildInOrg: ["GET /orgs/{org}/teams/{team_slug}/teams"], + listDiscussionCommentsInOrg: ["GET /orgs/{org}/teams/{team_slug}/discussions/{discussion_number}/comments"], + listDiscussionsInOrg: ["GET /orgs/{org}/teams/{team_slug}/discussions"], + listForAuthenticatedUser: ["GET /user/teams"], + listMembersInOrg: ["GET /orgs/{org}/teams/{team_slug}/members"], + listPendingInvitationsInOrg: ["GET /orgs/{org}/teams/{team_slug}/invitations"], + listProjectsInOrg: ["GET /orgs/{org}/teams/{team_slug}/projects"], + listReposInOrg: ["GET /orgs/{org}/teams/{team_slug}/repos"], + removeMembershipForUserInOrg: ["DELETE /orgs/{org}/teams/{team_slug}/memberships/{username}"], + removeProjectInOrg: ["DELETE /orgs/{org}/teams/{team_slug}/projects/{project_id}"], + removeRepoInOrg: ["DELETE /orgs/{org}/teams/{team_slug}/repos/{owner}/{repo}"], + updateDiscussionCommentInOrg: ["PATCH /orgs/{org}/teams/{team_slug}/discussions/{discussion_number}/comments/{comment_number}"], + updateDiscussionInOrg: ["PATCH /orgs/{org}/teams/{team_slug}/discussions/{discussion_number}"], + updateInOrg: ["PATCH /orgs/{org}/teams/{team_slug}"] + }, + users: { + addEmailForAuthenticated: ["POST /user/emails", {}, { + renamed: ["users", "addEmailForAuthenticatedUser"] + }], + addEmailForAuthenticatedUser: ["POST /user/emails"], + block: ["PUT /user/blocks/{username}"], + checkBlocked: ["GET /user/blocks/{username}"], + checkFollowingForUser: ["GET /users/{username}/following/{target_user}"], + checkPersonIsFollowedByAuthenticated: ["GET /user/following/{username}"], + createGpgKeyForAuthenticated: ["POST /user/gpg_keys", {}, { + renamed: ["users", "createGpgKeyForAuthenticatedUser"] + }], + createGpgKeyForAuthenticatedUser: ["POST /user/gpg_keys"], + createPublicSshKeyForAuthenticated: ["POST /user/keys", {}, { + renamed: ["users", "createPublicSshKeyForAuthenticatedUser"] + }], + createPublicSshKeyForAuthenticatedUser: ["POST /user/keys"], + deleteEmailForAuthenticated: ["DELETE /user/emails", {}, { + renamed: ["users", "deleteEmailForAuthenticatedUser"] + }], + deleteEmailForAuthenticatedUser: ["DELETE /user/emails"], + deleteGpgKeyForAuthenticated: ["DELETE /user/gpg_keys/{gpg_key_id}", {}, { + renamed: ["users", "deleteGpgKeyForAuthenticatedUser"] + }], + deleteGpgKeyForAuthenticatedUser: ["DELETE /user/gpg_keys/{gpg_key_id}"], + deletePublicSshKeyForAuthenticated: ["DELETE /user/keys/{key_id}", {}, { + renamed: ["users", "deletePublicSshKeyForAuthenticatedUser"] + }], + deletePublicSshKeyForAuthenticatedUser: ["DELETE /user/keys/{key_id}"], + follow: ["PUT /user/following/{username}"], + getAuthenticated: ["GET /user"], + getByUsername: ["GET /users/{username}"], + getContextForUser: ["GET /users/{username}/hovercard"], + getGpgKeyForAuthenticated: ["GET /user/gpg_keys/{gpg_key_id}", {}, { + renamed: ["users", "getGpgKeyForAuthenticatedUser"] + }], + getGpgKeyForAuthenticatedUser: ["GET /user/gpg_keys/{gpg_key_id}"], + getPublicSshKeyForAuthenticated: ["GET /user/keys/{key_id}", {}, { + renamed: ["users", "getPublicSshKeyForAuthenticatedUser"] + }], + getPublicSshKeyForAuthenticatedUser: ["GET /user/keys/{key_id}"], + list: ["GET /users"], + listBlockedByAuthenticated: ["GET /user/blocks", {}, { + renamed: ["users", "listBlockedByAuthenticatedUser"] + }], + listBlockedByAuthenticatedUser: ["GET /user/blocks"], + listEmailsForAuthenticated: ["GET /user/emails", {}, { + renamed: ["users", "listEmailsForAuthenticatedUser"] + }], + listEmailsForAuthenticatedUser: ["GET /user/emails"], + listFollowedByAuthenticated: ["GET /user/following", {}, { + renamed: ["users", "listFollowedByAuthenticatedUser"] + }], + listFollowedByAuthenticatedUser: ["GET /user/following"], + listFollowersForAuthenticatedUser: ["GET /user/followers"], + listFollowersForUser: ["GET /users/{username}/followers"], + listFollowingForUser: ["GET /users/{username}/following"], + listGpgKeysForAuthenticated: ["GET /user/gpg_keys", {}, { + renamed: ["users", "listGpgKeysForAuthenticatedUser"] + }], + listGpgKeysForAuthenticatedUser: ["GET /user/gpg_keys"], + listGpgKeysForUser: ["GET /users/{username}/gpg_keys"], + listPublicEmailsForAuthenticated: ["GET /user/public_emails", {}, { + renamed: ["users", "listPublicEmailsForAuthenticatedUser"] + }], + listPublicEmailsForAuthenticatedUser: ["GET /user/public_emails"], + listPublicKeysForUser: ["GET /users/{username}/keys"], + listPublicSshKeysForAuthenticated: ["GET /user/keys", {}, { + renamed: ["users", "listPublicSshKeysForAuthenticatedUser"] + }], + listPublicSshKeysForAuthenticatedUser: ["GET /user/keys"], + setPrimaryEmailVisibilityForAuthenticated: ["PATCH /user/email/visibility", {}, { + renamed: ["users", "setPrimaryEmailVisibilityForAuthenticatedUser"] + }], + setPrimaryEmailVisibilityForAuthenticatedUser: ["PATCH /user/email/visibility"], + unblock: ["DELETE /user/blocks/{username}"], + unfollow: ["DELETE /user/following/{username}"], + updateAuthenticated: ["PATCH /user"] + } + }; + var VERSION = "5.16.2"; + function endpointsToMethods(octokit, endpointsMap) { + const newMethods = {}; + for (const [scope, endpoints] of Object.entries(endpointsMap)) { + for (const [methodName, endpoint] of Object.entries(endpoints)) { + const [route, defaults, decorations] = endpoint; + const [method, url] = route.split(/ /); + const endpointDefaults = Object.assign({ + method, + url + }, defaults); + if (!newMethods[scope]) { + newMethods[scope] = {}; + } + const scopeMethods = newMethods[scope]; + if (decorations) { + scopeMethods[methodName] = decorate(octokit, scope, methodName, endpointDefaults, decorations); + continue; + } + scopeMethods[methodName] = octokit.request.defaults(endpointDefaults); + } + } + return newMethods; + } + function decorate(octokit, scope, methodName, defaults, decorations) { + const requestWithDefaults = octokit.request.defaults(defaults); + function withDecorations(...args) { + let options = requestWithDefaults.endpoint.merge(...args); + if (decorations.mapToData) { + options = Object.assign({}, options, { + data: options[decorations.mapToData], + [decorations.mapToData]: undefined + }); + return requestWithDefaults(options); + } + if (decorations.renamed) { + const [newScope, newMethodName] = decorations.renamed; + octokit.log.warn(`octokit.${scope}.${methodName}() has been renamed to octokit.${newScope}.${newMethodName}()`); + } + if (decorations.deprecated) { + octokit.log.warn(decorations.deprecated); + } + if (decorations.renamedParameters) { + const options2 = requestWithDefaults.endpoint.merge(...args); + for (const [name, alias] of Object.entries(decorations.renamedParameters)) { + if (name in options2) { + octokit.log.warn(`"${name}" parameter is deprecated for "octokit.${scope}.${methodName}()". Use "${alias}" instead`); + if (!(alias in options2)) { + options2[alias] = options2[name]; + } + delete options2[name]; + } + } + return requestWithDefaults(options2); + } + return requestWithDefaults(...args); + } + return Object.assign(withDecorations, requestWithDefaults); + } + function restEndpointMethods(octokit) { + const api = endpointsToMethods(octokit, Endpoints); + return { + rest: api + }; + } + restEndpointMethods.VERSION = VERSION; + function legacyRestEndpointMethods(octokit) { + const api = endpointsToMethods(octokit, Endpoints); + return _objectSpread2(_objectSpread2({}, api), {}, { + rest: api + }); + } + legacyRestEndpointMethods.VERSION = VERSION; + exports2.legacyRestEndpointMethods = legacyRestEndpointMethods; + exports2.restEndpointMethods = restEndpointMethods; +}); + +// node_modules/@actions/artifact/node_modules/@actions/github/node_modules/@octokit/plugin-paginate-rest/dist-node/index.js +var require_dist_node18 = __commonJS((exports2) => { + Object.defineProperty(exports2, "__esModule", { value: true }); + var VERSION = "2.21.3"; + function ownKeys(object, enumerableOnly) { + var keys = Object.keys(object); + if (Object.getOwnPropertySymbols) { + var symbols = Object.getOwnPropertySymbols(object); + enumerableOnly && (symbols = symbols.filter(function(sym) { + return Object.getOwnPropertyDescriptor(object, sym).enumerable; + })), keys.push.apply(keys, symbols); + } + return keys; + } + function _objectSpread2(target) { + for (var i = 1;i < arguments.length; i++) { + var source = arguments[i] != null ? arguments[i] : {}; + i % 2 ? ownKeys(Object(source), true).forEach(function(key) { + _defineProperty(target, key, source[key]); + }) : Object.getOwnPropertyDescriptors ? Object.defineProperties(target, Object.getOwnPropertyDescriptors(source)) : ownKeys(Object(source)).forEach(function(key) { + Object.defineProperty(target, key, Object.getOwnPropertyDescriptor(source, key)); + }); + } + return target; + } + function _defineProperty(obj, key, value) { + if (key in obj) { + Object.defineProperty(obj, key, { + value, + enumerable: true, + configurable: true, + writable: true + }); + } else { + obj[key] = value; + } + return obj; + } + function normalizePaginatedListResponse(response) { + if (!response.data) { + return _objectSpread2(_objectSpread2({}, response), {}, { + data: [] + }); + } + const responseNeedsNormalization = "total_count" in response.data && !("url" in response.data); + if (!responseNeedsNormalization) + return response; + const incompleteResults = response.data.incomplete_results; + const repositorySelection = response.data.repository_selection; + const totalCount = response.data.total_count; + delete response.data.incomplete_results; + delete response.data.repository_selection; + delete response.data.total_count; + const namespaceKey = Object.keys(response.data)[0]; + const data = response.data[namespaceKey]; + response.data = data; + if (typeof incompleteResults !== "undefined") { + response.data.incomplete_results = incompleteResults; + } + if (typeof repositorySelection !== "undefined") { + response.data.repository_selection = repositorySelection; + } + response.data.total_count = totalCount; + return response; + } + function iterator(octokit, route, parameters) { + const options = typeof route === "function" ? route.endpoint(parameters) : octokit.request.endpoint(route, parameters); + const requestMethod = typeof route === "function" ? route : octokit.request; + const method = options.method; + const headers = options.headers; + let url = options.url; + return { + [Symbol.asyncIterator]: () => ({ + async next() { + if (!url) + return { + done: true + }; + try { + const response = await requestMethod({ + method, + url, + headers + }); + const normalizedResponse = normalizePaginatedListResponse(response); + url = ((normalizedResponse.headers.link || "").match(/<([^>]+)>;\s*rel="next"/) || [])[1]; + return { + value: normalizedResponse + }; + } catch (error) { + if (error.status !== 409) + throw error; + url = ""; + return { + value: { + status: 200, + headers: {}, + data: [] + } + }; + } + } + }) + }; + } + function paginate(octokit, route, parameters, mapFn) { + if (typeof parameters === "function") { + mapFn = parameters; + parameters = undefined; + } + return gather(octokit, [], iterator(octokit, route, parameters)[Symbol.asyncIterator](), mapFn); + } + function gather(octokit, results, iterator2, mapFn) { + return iterator2.next().then((result) => { + if (result.done) { + return results; + } + let earlyExit = false; + function done() { + earlyExit = true; + } + results = results.concat(mapFn ? mapFn(result.value, done) : result.value.data); + if (earlyExit) { + return results; + } + return gather(octokit, results, iterator2, mapFn); + }); + } + var composePaginateRest = Object.assign(paginate, { + iterator + }); + var paginatingEndpoints = ["GET /app/hook/deliveries", "GET /app/installations", "GET /applications/grants", "GET /authorizations", "GET /enterprises/{enterprise}/actions/permissions/organizations", "GET /enterprises/{enterprise}/actions/runner-groups", "GET /enterprises/{enterprise}/actions/runner-groups/{runner_group_id}/organizations", "GET /enterprises/{enterprise}/actions/runner-groups/{runner_group_id}/runners", "GET /enterprises/{enterprise}/actions/runners", "GET /enterprises/{enterprise}/audit-log", "GET /enterprises/{enterprise}/secret-scanning/alerts", "GET /enterprises/{enterprise}/settings/billing/advanced-security", "GET /events", "GET /gists", "GET /gists/public", "GET /gists/starred", "GET /gists/{gist_id}/comments", "GET /gists/{gist_id}/commits", "GET /gists/{gist_id}/forks", "GET /installation/repositories", "GET /issues", "GET /licenses", "GET /marketplace_listing/plans", "GET /marketplace_listing/plans/{plan_id}/accounts", "GET /marketplace_listing/stubbed/plans", "GET /marketplace_listing/stubbed/plans/{plan_id}/accounts", "GET /networks/{owner}/{repo}/events", "GET /notifications", "GET /organizations", "GET /orgs/{org}/actions/cache/usage-by-repository", "GET /orgs/{org}/actions/permissions/repositories", "GET /orgs/{org}/actions/runner-groups", "GET /orgs/{org}/actions/runner-groups/{runner_group_id}/repositories", "GET /orgs/{org}/actions/runner-groups/{runner_group_id}/runners", "GET /orgs/{org}/actions/runners", "GET /orgs/{org}/actions/secrets", "GET /orgs/{org}/actions/secrets/{secret_name}/repositories", "GET /orgs/{org}/audit-log", "GET /orgs/{org}/blocks", "GET /orgs/{org}/code-scanning/alerts", "GET /orgs/{org}/codespaces", "GET /orgs/{org}/credential-authorizations", "GET /orgs/{org}/dependabot/secrets", "GET /orgs/{org}/dependabot/secrets/{secret_name}/repositories", "GET /orgs/{org}/events", "GET /orgs/{org}/external-groups", "GET /orgs/{org}/failed_invitations", "GET /orgs/{org}/hooks", "GET /orgs/{org}/hooks/{hook_id}/deliveries", "GET /orgs/{org}/installations", "GET /orgs/{org}/invitations", "GET /orgs/{org}/invitations/{invitation_id}/teams", "GET /orgs/{org}/issues", "GET /orgs/{org}/members", "GET /orgs/{org}/migrations", "GET /orgs/{org}/migrations/{migration_id}/repositories", "GET /orgs/{org}/outside_collaborators", "GET /orgs/{org}/packages", "GET /orgs/{org}/packages/{package_type}/{package_name}/versions", "GET /orgs/{org}/projects", "GET /orgs/{org}/public_members", "GET /orgs/{org}/repos", "GET /orgs/{org}/secret-scanning/alerts", "GET /orgs/{org}/settings/billing/advanced-security", "GET /orgs/{org}/team-sync/groups", "GET /orgs/{org}/teams", "GET /orgs/{org}/teams/{team_slug}/discussions", "GET /orgs/{org}/teams/{team_slug}/discussions/{discussion_number}/comments", "GET /orgs/{org}/teams/{team_slug}/discussions/{discussion_number}/comments/{comment_number}/reactions", "GET /orgs/{org}/teams/{team_slug}/discussions/{discussion_number}/reactions", "GET /orgs/{org}/teams/{team_slug}/invitations", "GET /orgs/{org}/teams/{team_slug}/members", "GET /orgs/{org}/teams/{team_slug}/projects", "GET /orgs/{org}/teams/{team_slug}/repos", "GET /orgs/{org}/teams/{team_slug}/teams", "GET /projects/columns/{column_id}/cards", "GET /projects/{project_id}/collaborators", "GET /projects/{project_id}/columns", "GET /repos/{owner}/{repo}/actions/artifacts", "GET /repos/{owner}/{repo}/actions/caches", "GET /repos/{owner}/{repo}/actions/runners", "GET /repos/{owner}/{repo}/actions/runs", "GET /repos/{owner}/{repo}/actions/runs/{run_id}/artifacts", "GET /repos/{owner}/{repo}/actions/runs/{run_id}/attempts/{attempt_number}/jobs", "GET /repos/{owner}/{repo}/actions/runs/{run_id}/jobs", "GET /repos/{owner}/{repo}/actions/secrets", "GET /repos/{owner}/{repo}/actions/workflows", "GET /repos/{owner}/{repo}/actions/workflows/{workflow_id}/runs", "GET /repos/{owner}/{repo}/assignees", "GET /repos/{owner}/{repo}/branches", "GET /repos/{owner}/{repo}/check-runs/{check_run_id}/annotations", "GET /repos/{owner}/{repo}/check-suites/{check_suite_id}/check-runs", "GET /repos/{owner}/{repo}/code-scanning/alerts", "GET /repos/{owner}/{repo}/code-scanning/alerts/{alert_number}/instances", "GET /repos/{owner}/{repo}/code-scanning/analyses", "GET /repos/{owner}/{repo}/codespaces", "GET /repos/{owner}/{repo}/codespaces/devcontainers", "GET /repos/{owner}/{repo}/codespaces/secrets", "GET /repos/{owner}/{repo}/collaborators", "GET /repos/{owner}/{repo}/comments", "GET /repos/{owner}/{repo}/comments/{comment_id}/reactions", "GET /repos/{owner}/{repo}/commits", "GET /repos/{owner}/{repo}/commits/{commit_sha}/comments", "GET /repos/{owner}/{repo}/commits/{commit_sha}/pulls", "GET /repos/{owner}/{repo}/commits/{ref}/check-runs", "GET /repos/{owner}/{repo}/commits/{ref}/check-suites", "GET /repos/{owner}/{repo}/commits/{ref}/status", "GET /repos/{owner}/{repo}/commits/{ref}/statuses", "GET /repos/{owner}/{repo}/contributors", "GET /repos/{owner}/{repo}/dependabot/secrets", "GET /repos/{owner}/{repo}/deployments", "GET /repos/{owner}/{repo}/deployments/{deployment_id}/statuses", "GET /repos/{owner}/{repo}/environments", "GET /repos/{owner}/{repo}/events", "GET /repos/{owner}/{repo}/forks", "GET /repos/{owner}/{repo}/git/matching-refs/{ref}", "GET /repos/{owner}/{repo}/hooks", "GET /repos/{owner}/{repo}/hooks/{hook_id}/deliveries", "GET /repos/{owner}/{repo}/invitations", "GET /repos/{owner}/{repo}/issues", "GET /repos/{owner}/{repo}/issues/comments", "GET /repos/{owner}/{repo}/issues/comments/{comment_id}/reactions", "GET /repos/{owner}/{repo}/issues/events", "GET /repos/{owner}/{repo}/issues/{issue_number}/comments", "GET /repos/{owner}/{repo}/issues/{issue_number}/events", "GET /repos/{owner}/{repo}/issues/{issue_number}/labels", "GET /repos/{owner}/{repo}/issues/{issue_number}/reactions", "GET /repos/{owner}/{repo}/issues/{issue_number}/timeline", "GET /repos/{owner}/{repo}/keys", "GET /repos/{owner}/{repo}/labels", "GET /repos/{owner}/{repo}/milestones", "GET /repos/{owner}/{repo}/milestones/{milestone_number}/labels", "GET /repos/{owner}/{repo}/notifications", "GET /repos/{owner}/{repo}/pages/builds", "GET /repos/{owner}/{repo}/projects", "GET /repos/{owner}/{repo}/pulls", "GET /repos/{owner}/{repo}/pulls/comments", "GET /repos/{owner}/{repo}/pulls/comments/{comment_id}/reactions", "GET /repos/{owner}/{repo}/pulls/{pull_number}/comments", "GET /repos/{owner}/{repo}/pulls/{pull_number}/commits", "GET /repos/{owner}/{repo}/pulls/{pull_number}/files", "GET /repos/{owner}/{repo}/pulls/{pull_number}/requested_reviewers", "GET /repos/{owner}/{repo}/pulls/{pull_number}/reviews", "GET /repos/{owner}/{repo}/pulls/{pull_number}/reviews/{review_id}/comments", "GET /repos/{owner}/{repo}/releases", "GET /repos/{owner}/{repo}/releases/{release_id}/assets", "GET /repos/{owner}/{repo}/releases/{release_id}/reactions", "GET /repos/{owner}/{repo}/secret-scanning/alerts", "GET /repos/{owner}/{repo}/secret-scanning/alerts/{alert_number}/locations", "GET /repos/{owner}/{repo}/stargazers", "GET /repos/{owner}/{repo}/subscribers", "GET /repos/{owner}/{repo}/tags", "GET /repos/{owner}/{repo}/teams", "GET /repos/{owner}/{repo}/topics", "GET /repositories", "GET /repositories/{repository_id}/environments/{environment_name}/secrets", "GET /search/code", "GET /search/commits", "GET /search/issues", "GET /search/labels", "GET /search/repositories", "GET /search/topics", "GET /search/users", "GET /teams/{team_id}/discussions", "GET /teams/{team_id}/discussions/{discussion_number}/comments", "GET /teams/{team_id}/discussions/{discussion_number}/comments/{comment_number}/reactions", "GET /teams/{team_id}/discussions/{discussion_number}/reactions", "GET /teams/{team_id}/invitations", "GET /teams/{team_id}/members", "GET /teams/{team_id}/projects", "GET /teams/{team_id}/repos", "GET /teams/{team_id}/teams", "GET /user/blocks", "GET /user/codespaces", "GET /user/codespaces/secrets", "GET /user/emails", "GET /user/followers", "GET /user/following", "GET /user/gpg_keys", "GET /user/installations", "GET /user/installations/{installation_id}/repositories", "GET /user/issues", "GET /user/keys", "GET /user/marketplace_purchases", "GET /user/marketplace_purchases/stubbed", "GET /user/memberships/orgs", "GET /user/migrations", "GET /user/migrations/{migration_id}/repositories", "GET /user/orgs", "GET /user/packages", "GET /user/packages/{package_type}/{package_name}/versions", "GET /user/public_emails", "GET /user/repos", "GET /user/repository_invitations", "GET /user/starred", "GET /user/subscriptions", "GET /user/teams", "GET /users", "GET /users/{username}/events", "GET /users/{username}/events/orgs/{org}", "GET /users/{username}/events/public", "GET /users/{username}/followers", "GET /users/{username}/following", "GET /users/{username}/gists", "GET /users/{username}/gpg_keys", "GET /users/{username}/keys", "GET /users/{username}/orgs", "GET /users/{username}/packages", "GET /users/{username}/projects", "GET /users/{username}/received_events", "GET /users/{username}/received_events/public", "GET /users/{username}/repos", "GET /users/{username}/starred", "GET /users/{username}/subscriptions"]; + function isPaginatingEndpoint(arg) { + if (typeof arg === "string") { + return paginatingEndpoints.includes(arg); + } else { + return false; + } + } + function paginateRest(octokit) { + return { + paginate: Object.assign(paginate.bind(null, octokit), { + iterator: iterator.bind(null, octokit) + }) + }; + } + paginateRest.VERSION = VERSION; + exports2.composePaginateRest = composePaginateRest; + exports2.isPaginatingEndpoint = isPaginatingEndpoint; + exports2.paginateRest = paginateRest; + exports2.paginatingEndpoints = paginatingEndpoints; +}); + +// node_modules/@actions/artifact/node_modules/@actions/github/lib/utils.js +var require_utils9 = __commonJS((exports2) => { + var __createBinding = exports2 && exports2.__createBinding || (Object.create ? function(o, m, k, k2) { + if (k2 === undefined) + k2 = k; + Object.defineProperty(o, k2, { enumerable: true, get: function() { + return m[k]; + } }); + } : function(o, m, k, k2) { + if (k2 === undefined) + k2 = k; + o[k2] = m[k]; + }); + var __setModuleDefault = exports2 && exports2.__setModuleDefault || (Object.create ? function(o, v) { + Object.defineProperty(o, "default", { enumerable: true, value: v }); + } : function(o, v) { + o["default"] = v; + }); + var __importStar = exports2 && exports2.__importStar || function(mod) { + if (mod && mod.__esModule) + return mod; + var result = {}; + if (mod != null) { + for (var k in mod) + if (k !== "default" && Object.hasOwnProperty.call(mod, k)) + __createBinding(result, mod, k); + } + __setModuleDefault(result, mod); + return result; + }; + Object.defineProperty(exports2, "__esModule", { value: true }); + exports2.getOctokitOptions = exports2.GitHub = exports2.defaults = exports2.context = undefined; + var Context = __importStar(require_context3()); + var Utils = __importStar(require_utils7()); + var core_1 = require_dist_node16(); + var plugin_rest_endpoint_methods_1 = require_dist_node17(); + var plugin_paginate_rest_1 = require_dist_node18(); + exports2.context = new Context.Context; + var baseUrl = Utils.getApiBaseUrl(); + exports2.defaults = { + baseUrl, + request: { + agent: Utils.getProxyAgent(baseUrl) + } + }; + exports2.GitHub = core_1.Octokit.plugin(plugin_rest_endpoint_methods_1.restEndpointMethods, plugin_paginate_rest_1.paginateRest).defaults(exports2.defaults); + function getOctokitOptions(token, options) { + const opts = Object.assign({}, options || {}); + const auth = Utils.getAuthString(token, opts); + if (auth) { + opts.auth = auth; + } + return opts; + } + exports2.getOctokitOptions = getOctokitOptions; +}); + +// node_modules/@actions/artifact/node_modules/@actions/github/lib/github.js +var require_github2 = __commonJS((exports2) => { + var __createBinding = exports2 && exports2.__createBinding || (Object.create ? function(o, m, k, k2) { + if (k2 === undefined) + k2 = k; + Object.defineProperty(o, k2, { enumerable: true, get: function() { + return m[k]; + } }); + } : function(o, m, k, k2) { + if (k2 === undefined) + k2 = k; + o[k2] = m[k]; + }); + var __setModuleDefault = exports2 && exports2.__setModuleDefault || (Object.create ? function(o, v) { + Object.defineProperty(o, "default", { enumerable: true, value: v }); + } : function(o, v) { + o["default"] = v; + }); + var __importStar = exports2 && exports2.__importStar || function(mod) { + if (mod && mod.__esModule) + return mod; + var result = {}; + if (mod != null) { + for (var k in mod) + if (k !== "default" && Object.hasOwnProperty.call(mod, k)) + __createBinding(result, mod, k); + } + __setModuleDefault(result, mod); + return result; + }; + Object.defineProperty(exports2, "__esModule", { value: true }); + exports2.getOctokit = exports2.context = undefined; + var Context = __importStar(require_context3()); + var utils_1 = require_utils9(); + exports2.context = new Context.Context; + function getOctokit(token, options, ...additionalPlugins) { + const GitHubWithPlugins = utils_1.GitHub.plugin(...additionalPlugins); + return new GitHubWithPlugins(utils_1.getOctokitOptions(token, options)); + } + exports2.getOctokit = getOctokit; +}); + +// node_modules/traverse/index.js +var require_traverse = __commonJS((exports2, module2) => { + module2.exports = Traverse; + function Traverse(obj) { + if (!(this instanceof Traverse)) + return new Traverse(obj); + this.value = obj; + } + Traverse.prototype.get = function(ps) { + var node = this.value; + for (var i = 0;i < ps.length; i++) { + var key = ps[i]; + if (!Object.hasOwnProperty.call(node, key)) { + node = undefined; + break; + } + node = node[key]; + } + return node; + }; + Traverse.prototype.set = function(ps, value) { + var node = this.value; + for (var i = 0;i < ps.length - 1; i++) { + var key = ps[i]; + if (!Object.hasOwnProperty.call(node, key)) + node[key] = {}; + node = node[key]; + } + node[ps[i]] = value; + return value; + }; + Traverse.prototype.map = function(cb) { + return walk(this.value, cb, true); + }; + Traverse.prototype.forEach = function(cb) { + this.value = walk(this.value, cb, false); + return this.value; + }; + Traverse.prototype.reduce = function(cb, init) { + var skip = arguments.length === 1; + var acc = skip ? this.value : init; + this.forEach(function(x) { + if (!this.isRoot || !skip) { + acc = cb.call(this, acc, x); + } + }); + return acc; + }; + Traverse.prototype.deepEqual = function(obj) { + if (arguments.length !== 1) { + throw new Error("deepEqual requires exactly one object to compare against"); + } + var equal = true; + var node = obj; + this.forEach(function(y) { + var notEqual = function() { + equal = false; + return; + }.bind(this); + if (!this.isRoot) { + if (typeof node !== "object") + return notEqual(); + node = node[this.key]; + } + var x = node; + this.post(function() { + node = x; + }); + var toS = function(o) { + return Object.prototype.toString.call(o); + }; + if (this.circular) { + if (Traverse(obj).get(this.circular.path) !== x) + notEqual(); + } else if (typeof x !== typeof y) { + notEqual(); + } else if (x === null || y === null || x === undefined || y === undefined) { + if (x !== y) + notEqual(); + } else if (x.__proto__ !== y.__proto__) { + notEqual(); + } else if (x === y) { + } else if (typeof x === "function") { + if (x instanceof RegExp) { + if (x.toString() != y.toString()) + notEqual(); + } else if (x !== y) + notEqual(); + } else if (typeof x === "object") { + if (toS(y) === "[object Arguments]" || toS(x) === "[object Arguments]") { + if (toS(x) !== toS(y)) { + notEqual(); + } + } else if (x instanceof Date || y instanceof Date) { + if (!(x instanceof Date) || !(y instanceof Date) || x.getTime() !== y.getTime()) { + notEqual(); + } + } else { + var kx = Object.keys(x); + var ky = Object.keys(y); + if (kx.length !== ky.length) + return notEqual(); + for (var i = 0;i < kx.length; i++) { + var k = kx[i]; + if (!Object.hasOwnProperty.call(y, k)) { + notEqual(); + } + } + } + } + }); + return equal; + }; + Traverse.prototype.paths = function() { + var acc = []; + this.forEach(function(x) { + acc.push(this.path); + }); + return acc; + }; + Traverse.prototype.nodes = function() { + var acc = []; + this.forEach(function(x) { + acc.push(this.node); + }); + return acc; + }; + Traverse.prototype.clone = function() { + var parents = [], nodes = []; + return function clone(src) { + for (var i = 0;i < parents.length; i++) { + if (parents[i] === src) { + return nodes[i]; + } + } + if (typeof src === "object" && src !== null) { + var dst = copy(src); + parents.push(src); + nodes.push(dst); + Object.keys(src).forEach(function(key) { + dst[key] = clone(src[key]); + }); + parents.pop(); + nodes.pop(); + return dst; + } else { + return src; + } + }(this.value); + }; + function walk(root, cb, immutable) { + var path = []; + var parents = []; + var alive = true; + return function walker(node_) { + var node = immutable ? copy(node_) : node_; + var modifiers = {}; + var state = { + node, + node_, + path: [].concat(path), + parent: parents.slice(-1)[0], + key: path.slice(-1)[0], + isRoot: path.length === 0, + level: path.length, + circular: null, + update: function(x) { + if (!state.isRoot) { + state.parent.node[state.key] = x; + } + state.node = x; + }, + delete: function() { + delete state.parent.node[state.key]; + }, + remove: function() { + if (Array.isArray(state.parent.node)) { + state.parent.node.splice(state.key, 1); + } else { + delete state.parent.node[state.key]; + } + }, + before: function(f) { + modifiers.before = f; + }, + after: function(f) { + modifiers.after = f; + }, + pre: function(f) { + modifiers.pre = f; + }, + post: function(f) { + modifiers.post = f; + }, + stop: function() { + alive = false; + } + }; + if (!alive) + return state; + if (typeof node === "object" && node !== null) { + state.isLeaf = Object.keys(node).length == 0; + for (var i = 0;i < parents.length; i++) { + if (parents[i].node_ === node_) { + state.circular = parents[i]; + break; + } + } + } else { + state.isLeaf = true; + } + state.notLeaf = !state.isLeaf; + state.notRoot = !state.isRoot; + var ret = cb.call(state, state.node); + if (ret !== undefined && state.update) + state.update(ret); + if (modifiers.before) + modifiers.before.call(state, state.node); + if (typeof state.node == "object" && state.node !== null && !state.circular) { + parents.push(state); + var keys = Object.keys(state.node); + keys.forEach(function(key, i2) { + path.push(key); + if (modifiers.pre) + modifiers.pre.call(state, state.node[key], key); + var child = walker(state.node[key]); + if (immutable && Object.hasOwnProperty.call(state.node, key)) { + state.node[key] = child.node; + } + child.isLast = i2 == keys.length - 1; + child.isFirst = i2 == 0; + if (modifiers.post) + modifiers.post.call(state, child); + path.pop(); + }); + parents.pop(); + } + if (modifiers.after) + modifiers.after.call(state, state.node); + return state; + }(root).node; + } + Object.keys(Traverse.prototype).forEach(function(key) { + Traverse[key] = function(obj) { + var args = [].slice.call(arguments, 1); + var t = Traverse(obj); + return t[key].apply(t, args); + }; + }); + function copy(src) { + if (typeof src === "object" && src !== null) { + var dst; + if (Array.isArray(src)) { + dst = []; + } else if (src instanceof Date) { + dst = new Date(src); + } else if (src instanceof Boolean) { + dst = new Boolean(src); + } else if (src instanceof Number) { + dst = new Number(src); + } else if (src instanceof String) { + dst = new String(src); + } else { + dst = Object.create(Object.getPrototypeOf(src)); + } + Object.keys(src).forEach(function(key) { + dst[key] = src[key]; + }); + return dst; + } else + return src; + } +}); + +// node_modules/chainsaw/index.js +var require_chainsaw = __commonJS((exports2, module2) => { + var Traverse = require_traverse(); + var EventEmitter = require("events").EventEmitter; + module2.exports = Chainsaw; + function Chainsaw(builder) { + var saw = Chainsaw.saw(builder, {}); + var r = builder.call(saw.handlers, saw); + if (r !== undefined) + saw.handlers = r; + saw.record(); + return saw.chain(); + } + Chainsaw.light = function ChainsawLight(builder) { + var saw = Chainsaw.saw(builder, {}); + var r = builder.call(saw.handlers, saw); + if (r !== undefined) + saw.handlers = r; + return saw.chain(); + }; + Chainsaw.saw = function(builder, handlers) { + var saw = new EventEmitter; + saw.handlers = handlers; + saw.actions = []; + saw.chain = function() { + var ch = Traverse(saw.handlers).map(function(node) { + if (this.isRoot) + return node; + var ps = this.path; + if (typeof node === "function") { + this.update(function() { + saw.actions.push({ + path: ps, + args: [].slice.call(arguments) + }); + return ch; + }); + } + }); + process.nextTick(function() { + saw.emit("begin"); + saw.next(); + }); + return ch; + }; + saw.pop = function() { + return saw.actions.shift(); + }; + saw.next = function() { + var action = saw.pop(); + if (!action) { + saw.emit("end"); + } else if (!action.trap) { + var node = saw.handlers; + action.path.forEach(function(key) { + node = node[key]; + }); + node.apply(saw.handlers, action.args); + } + }; + saw.nest = function(cb) { + var args = [].slice.call(arguments, 1); + var autonext = true; + if (typeof cb === "boolean") { + var autonext = cb; + cb = args.shift(); + } + var s = Chainsaw.saw(builder, {}); + var r = builder.call(s.handlers, s); + if (r !== undefined) + s.handlers = r; + if (typeof saw.step !== "undefined") { + s.record(); + } + cb.apply(s.chain(), args); + if (autonext !== false) + s.on("end", saw.next); + }; + saw.record = function() { + upgradeChainsaw(saw); + }; + ["trap", "down", "jump"].forEach(function(method) { + saw[method] = function() { + throw new Error("To use the trap, down and jump features, please " + "call record() first to start recording actions."); + }; + }); + return saw; + }; + function upgradeChainsaw(saw) { + saw.step = 0; + saw.pop = function() { + return saw.actions[saw.step++]; + }; + saw.trap = function(name, cb) { + var ps = Array.isArray(name) ? name : [name]; + saw.actions.push({ + path: ps, + step: saw.step, + cb, + trap: true + }); + }; + saw.down = function(name) { + var ps = (Array.isArray(name) ? name : [name]).join("/"); + var i = saw.actions.slice(saw.step).map(function(x) { + if (x.trap && x.step <= saw.step) + return false; + return x.path.join("/") == ps; + }).indexOf(true); + if (i >= 0) + saw.step += i; + else + saw.step = saw.actions.length; + var act = saw.actions[saw.step - 1]; + if (act && act.trap) { + saw.step = act.step; + act.cb(); + } else + saw.next(); + }; + saw.jump = function(step) { + saw.step = step; + saw.next(); + }; + } +}); + +// node_modules/buffers/index.js +var require_buffers = __commonJS((exports2, module2) => { + module2.exports = Buffers; + function Buffers(bufs) { + if (!(this instanceof Buffers)) + return new Buffers(bufs); + this.buffers = bufs || []; + this.length = this.buffers.reduce(function(size, buf) { + return size + buf.length; + }, 0); + } + Buffers.prototype.push = function() { + for (var i = 0;i < arguments.length; i++) { + if (!Buffer.isBuffer(arguments[i])) { + throw new TypeError("Tried to push a non-buffer"); + } + } + for (var i = 0;i < arguments.length; i++) { + var buf = arguments[i]; + this.buffers.push(buf); + this.length += buf.length; + } + return this.length; + }; + Buffers.prototype.unshift = function() { + for (var i = 0;i < arguments.length; i++) { + if (!Buffer.isBuffer(arguments[i])) { + throw new TypeError("Tried to unshift a non-buffer"); + } + } + for (var i = 0;i < arguments.length; i++) { + var buf = arguments[i]; + this.buffers.unshift(buf); + this.length += buf.length; + } + return this.length; + }; + Buffers.prototype.copy = function(dst, dStart, start, end) { + return this.slice(start, end).copy(dst, dStart, 0, end - start); + }; + Buffers.prototype.splice = function(i, howMany) { + var buffers = this.buffers; + var index = i >= 0 ? i : this.length - i; + var reps = [].slice.call(arguments, 2); + if (howMany === undefined) { + howMany = this.length - index; + } else if (howMany > this.length - index) { + howMany = this.length - index; + } + for (var i = 0;i < reps.length; i++) { + this.length += reps[i].length; + } + var removed = new Buffers; + var bytes = 0; + var startBytes = 0; + for (var ii = 0;ii < buffers.length && startBytes + buffers[ii].length < index; ii++) { + startBytes += buffers[ii].length; + } + if (index - startBytes > 0) { + var start = index - startBytes; + if (start + howMany < buffers[ii].length) { + removed.push(buffers[ii].slice(start, start + howMany)); + var orig = buffers[ii]; + var buf0 = new Buffer(start); + for (var i = 0;i < start; i++) { + buf0[i] = orig[i]; + } + var buf1 = new Buffer(orig.length - start - howMany); + for (var i = start + howMany;i < orig.length; i++) { + buf1[i - howMany - start] = orig[i]; + } + if (reps.length > 0) { + var reps_ = reps.slice(); + reps_.unshift(buf0); + reps_.push(buf1); + buffers.splice.apply(buffers, [ii, 1].concat(reps_)); + ii += reps_.length; + reps = []; + } else { + buffers.splice(ii, 1, buf0, buf1); + ii += 2; + } + } else { + removed.push(buffers[ii].slice(start)); + buffers[ii] = buffers[ii].slice(0, start); + ii++; + } + } + if (reps.length > 0) { + buffers.splice.apply(buffers, [ii, 0].concat(reps)); + ii += reps.length; + } + while (removed.length < howMany) { + var buf = buffers[ii]; + var len = buf.length; + var take = Math.min(len, howMany - removed.length); + if (take === len) { + removed.push(buf); + buffers.splice(ii, 1); + } else { + removed.push(buf.slice(0, take)); + buffers[ii] = buffers[ii].slice(take); + } + } + this.length -= removed.length; + return removed; + }; + Buffers.prototype.slice = function(i, j) { + var buffers = this.buffers; + if (j === undefined) + j = this.length; + if (i === undefined) + i = 0; + if (j > this.length) + j = this.length; + var startBytes = 0; + for (var si = 0;si < buffers.length && startBytes + buffers[si].length <= i; si++) { + startBytes += buffers[si].length; + } + var target = new Buffer(j - i); + var ti = 0; + for (var ii = si;ti < j - i && ii < buffers.length; ii++) { + var len = buffers[ii].length; + var start = ti === 0 ? i - startBytes : 0; + var end = ti + len >= j - i ? Math.min(start + (j - i) - ti, len) : len; + buffers[ii].copy(target, ti, start, end); + ti += end - start; + } + return target; + }; + Buffers.prototype.pos = function(i) { + if (i < 0 || i >= this.length) + throw new Error("oob"); + var l = i, bi = 0, bu = null; + for (;; ) { + bu = this.buffers[bi]; + if (l < bu.length) { + return { buf: bi, offset: l }; + } else { + l -= bu.length; + } + bi++; + } + }; + Buffers.prototype.get = function get(i) { + var pos = this.pos(i); + return this.buffers[pos.buf].get(pos.offset); + }; + Buffers.prototype.set = function set(i, b) { + var pos = this.pos(i); + return this.buffers[pos.buf].set(pos.offset, b); + }; + Buffers.prototype.indexOf = function(needle, offset) { + if (typeof needle === "string") { + needle = new Buffer(needle); + } else if (needle instanceof Buffer) { + } else { + throw new Error("Invalid type for a search string"); + } + if (!needle.length) { + return 0; + } + if (!this.length) { + return -1; + } + var i = 0, j = 0, match = 0, mstart, pos = 0; + if (offset) { + var p = this.pos(offset); + i = p.buf; + j = p.offset; + pos = offset; + } + for (;; ) { + while (j >= this.buffers[i].length) { + j = 0; + i++; + if (i >= this.buffers.length) { + return -1; + } + } + var char = this.buffers[i][j]; + if (char == needle[match]) { + if (match == 0) { + mstart = { + i, + j, + pos + }; + } + match++; + if (match == needle.length) { + return mstart.pos; + } + } else if (match != 0) { + i = mstart.i; + j = mstart.j; + pos = mstart.pos; + match = 0; + } + j++; + pos++; + } + }; + Buffers.prototype.toBuffer = function() { + return this.slice(); + }; + Buffers.prototype.toString = function(encoding, start, end) { + return this.slice(start, end).toString(encoding); + }; +}); + +// node_modules/binary/lib/vars.js +var require_vars = __commonJS((exports2, module2) => { + module2.exports = function(store) { + function getset(name, value) { + var node = vars.store; + var keys = name.split("."); + keys.slice(0, -1).forEach(function(k) { + if (node[k] === undefined) + node[k] = {}; + node = node[k]; + }); + var key = keys[keys.length - 1]; + if (arguments.length == 1) { + return node[key]; + } else { + return node[key] = value; + } + } + var vars = { + get: function(name) { + return getset(name); + }, + set: function(name, value) { + return getset(name, value); + }, + store: store || {} + }; + return vars; + }; +}); + +// node_modules/binary/index.js +var require_binary = __commonJS((exports2, module2) => { + var Chainsaw = require_chainsaw(); + var EventEmitter = require("events").EventEmitter; + var Buffers = require_buffers(); + var Vars = require_vars(); + var Stream = require("stream").Stream; + exports2 = module2.exports = function(bufOrEm, eventName) { + if (Buffer.isBuffer(bufOrEm)) { + return exports2.parse(bufOrEm); + } + var s = exports2.stream(); + if (bufOrEm && bufOrEm.pipe) { + bufOrEm.pipe(s); + } else if (bufOrEm) { + bufOrEm.on(eventName || "data", function(buf) { + s.write(buf); + }); + bufOrEm.on("end", function() { + s.end(); + }); + } + return s; + }; + exports2.stream = function(input) { + if (input) + return exports2.apply(null, arguments); + var pending = null; + function getBytes(bytes, cb, skip) { + pending = { + bytes, + skip, + cb: function(buf) { + pending = null; + cb(buf); + } + }; + dispatch(); + } + var offset = null; + function dispatch() { + if (!pending) { + if (caughtEnd) + done = true; + return; + } + if (typeof pending === "function") { + pending(); + } else { + var bytes = offset + pending.bytes; + if (buffers.length >= bytes) { + var buf; + if (offset == null) { + buf = buffers.splice(0, bytes); + if (!pending.skip) { + buf = buf.slice(); + } + } else { + if (!pending.skip) { + buf = buffers.slice(offset, bytes); + } + offset = bytes; + } + if (pending.skip) { + pending.cb(); + } else { + pending.cb(buf); + } + } + } + } + function builder(saw) { + function next() { + if (!done) + saw.next(); + } + var self2 = words(function(bytes, cb) { + return function(name) { + getBytes(bytes, function(buf) { + vars.set(name, cb(buf)); + next(); + }); + }; + }); + self2.tap = function(cb) { + saw.nest(cb, vars.store); + }; + self2.into = function(key, cb) { + if (!vars.get(key)) + vars.set(key, {}); + var parent = vars; + vars = Vars(parent.get(key)); + saw.nest(function() { + cb.apply(this, arguments); + this.tap(function() { + vars = parent; + }); + }, vars.store); + }; + self2.flush = function() { + vars.store = {}; + next(); + }; + self2.loop = function(cb) { + var end = false; + saw.nest(false, function loop() { + this.vars = vars.store; + cb.call(this, function() { + end = true; + next(); + }, vars.store); + this.tap(function() { + if (end) + saw.next(); + else + loop.call(this); + }.bind(this)); + }, vars.store); + }; + self2.buffer = function(name, bytes) { + if (typeof bytes === "string") { + bytes = vars.get(bytes); + } + getBytes(bytes, function(buf) { + vars.set(name, buf); + next(); + }); + }; + self2.skip = function(bytes) { + if (typeof bytes === "string") { + bytes = vars.get(bytes); + } + getBytes(bytes, function() { + next(); + }); + }; + self2.scan = function find(name, search) { + if (typeof search === "string") { + search = new Buffer(search); + } else if (!Buffer.isBuffer(search)) { + throw new Error("search must be a Buffer or a string"); + } + var taken = 0; + pending = function() { + var pos = buffers.indexOf(search, offset + taken); + var i = pos - offset - taken; + if (pos !== -1) { + pending = null; + if (offset != null) { + vars.set(name, buffers.slice(offset, offset + taken + i)); + offset += taken + i + search.length; + } else { + vars.set(name, buffers.slice(0, taken + i)); + buffers.splice(0, taken + i + search.length); + } + next(); + dispatch(); + } else { + i = Math.max(buffers.length - search.length - offset - taken, 0); + } + taken += i; + }; + dispatch(); + }; + self2.peek = function(cb) { + offset = 0; + saw.nest(function() { + cb.call(this, vars.store); + this.tap(function() { + offset = null; + }); + }); + }; + return self2; + } + var stream = Chainsaw.light(builder); + stream.writable = true; + var buffers = Buffers(); + stream.write = function(buf) { + buffers.push(buf); + dispatch(); + }; + var vars = Vars(); + var done = false, caughtEnd = false; + stream.end = function() { + caughtEnd = true; + }; + stream.pipe = Stream.prototype.pipe; + Object.getOwnPropertyNames(EventEmitter.prototype).forEach(function(name) { + stream[name] = EventEmitter.prototype[name]; + }); + return stream; + }; + exports2.parse = function parse(buffer) { + var self2 = words(function(bytes, cb) { + return function(name) { + if (offset + bytes <= buffer.length) { + var buf = buffer.slice(offset, offset + bytes); + offset += bytes; + vars.set(name, cb(buf)); + } else { + vars.set(name, null); + } + return self2; + }; + }); + var offset = 0; + var vars = Vars(); + self2.vars = vars.store; + self2.tap = function(cb) { + cb.call(self2, vars.store); + return self2; + }; + self2.into = function(key, cb) { + if (!vars.get(key)) { + vars.set(key, {}); + } + var parent = vars; + vars = Vars(parent.get(key)); + cb.call(self2, vars.store); + vars = parent; + return self2; + }; + self2.loop = function(cb) { + var end = false; + var ender = function() { + end = true; + }; + while (end === false) { + cb.call(self2, ender, vars.store); + } + return self2; + }; + self2.buffer = function(name, size) { + if (typeof size === "string") { + size = vars.get(size); + } + var buf = buffer.slice(offset, Math.min(buffer.length, offset + size)); + offset += size; + vars.set(name, buf); + return self2; + }; + self2.skip = function(bytes) { + if (typeof bytes === "string") { + bytes = vars.get(bytes); + } + offset += bytes; + return self2; + }; + self2.scan = function(name, search) { + if (typeof search === "string") { + search = new Buffer(search); + } else if (!Buffer.isBuffer(search)) { + throw new Error("search must be a Buffer or a string"); + } + vars.set(name, null); + for (var i = 0;i + offset <= buffer.length - search.length + 1; i++) { + for (var j = 0;j < search.length && buffer[offset + i + j] === search[j]; j++) + ; + if (j === search.length) + break; + } + vars.set(name, buffer.slice(offset, offset + i)); + offset += i + search.length; + return self2; + }; + self2.peek = function(cb) { + var was = offset; + cb.call(self2, vars.store); + offset = was; + return self2; + }; + self2.flush = function() { + vars.store = {}; + return self2; + }; + self2.eof = function() { + return offset >= buffer.length; + }; + return self2; + }; + function decodeLEu(bytes) { + var acc = 0; + for (var i = 0;i < bytes.length; i++) { + acc += Math.pow(256, i) * bytes[i]; + } + return acc; + } + function decodeBEu(bytes) { + var acc = 0; + for (var i = 0;i < bytes.length; i++) { + acc += Math.pow(256, bytes.length - i - 1) * bytes[i]; + } + return acc; + } + function decodeBEs(bytes) { + var val2 = decodeBEu(bytes); + if ((bytes[0] & 128) == 128) { + val2 -= Math.pow(256, bytes.length); + } + return val2; + } + function decodeLEs(bytes) { + var val2 = decodeLEu(bytes); + if ((bytes[bytes.length - 1] & 128) == 128) { + val2 -= Math.pow(256, bytes.length); + } + return val2; + } + function words(decode) { + var self2 = {}; + [1, 2, 4, 8].forEach(function(bytes) { + var bits = bytes * 8; + self2["word" + bits + "le"] = self2["word" + bits + "lu"] = decode(bytes, decodeLEu); + self2["word" + bits + "ls"] = decode(bytes, decodeLEs); + self2["word" + bits + "be"] = self2["word" + bits + "bu"] = decode(bytes, decodeBEu); + self2["word" + bits + "bs"] = decode(bytes, decodeBEs); + }); + self2.word8 = self2.word8u = self2.word8be; + self2.word8s = self2.word8bs; + return self2; + } +}); + +// node_modules/unzip-stream/lib/matcher-stream.js +var require_matcher_stream = __commonJS((exports2, module2) => { + var Transform = require("stream").Transform; + var util = require("util"); + function MatcherStream(patternDesc, matchFn) { + if (!(this instanceof MatcherStream)) { + return new MatcherStream; + } + Transform.call(this); + var p = typeof patternDesc === "object" ? patternDesc.pattern : patternDesc; + this.pattern = Buffer.isBuffer(p) ? p : Buffer.from(p); + this.requiredLength = this.pattern.length; + if (patternDesc.requiredExtraSize) + this.requiredLength += patternDesc.requiredExtraSize; + this.data = new Buffer(""); + this.bytesSoFar = 0; + this.matchFn = matchFn; + } + util.inherits(MatcherStream, Transform); + MatcherStream.prototype.checkDataChunk = function(ignoreMatchZero) { + var enoughData = this.data.length >= this.requiredLength; + if (!enoughData) { + return; + } + var matchIndex = this.data.indexOf(this.pattern, ignoreMatchZero ? 1 : 0); + if (matchIndex >= 0 && matchIndex + this.requiredLength > this.data.length) { + if (matchIndex > 0) { + var packet = this.data.slice(0, matchIndex); + this.push(packet); + this.bytesSoFar += matchIndex; + this.data = this.data.slice(matchIndex); + } + return; + } + if (matchIndex === -1) { + var packetLen = this.data.length - this.requiredLength + 1; + var packet = this.data.slice(0, packetLen); + this.push(packet); + this.bytesSoFar += packetLen; + this.data = this.data.slice(packetLen); + return; + } + if (matchIndex > 0) { + var packet = this.data.slice(0, matchIndex); + this.data = this.data.slice(matchIndex); + this.push(packet); + this.bytesSoFar += matchIndex; + } + var finished = this.matchFn ? this.matchFn(this.data, this.bytesSoFar) : true; + if (finished) { + this.data = new Buffer(""); + return; + } + return true; + }; + MatcherStream.prototype._transform = function(chunk, encoding, cb) { + this.data = Buffer.concat([this.data, chunk]); + var firstIteration = true; + while (this.checkDataChunk(!firstIteration)) { + firstIteration = false; + } + cb(); + }; + MatcherStream.prototype._flush = function(cb) { + if (this.data.length > 0) { + var firstIteration = true; + while (this.checkDataChunk(!firstIteration)) { + firstIteration = false; + } + } + if (this.data.length > 0) { + this.push(this.data); + this.data = null; + } + cb(); + }; + module2.exports = MatcherStream; +}); + +// node_modules/unzip-stream/lib/entry.js +var require_entry = __commonJS((exports2, module2) => { + var stream = require("stream"); + var inherits = require("util").inherits; + function Entry() { + if (!(this instanceof Entry)) { + return new Entry; + } + stream.PassThrough.call(this); + this.path = null; + this.type = null; + this.isDirectory = false; + } + inherits(Entry, stream.PassThrough); + Entry.prototype.autodrain = function() { + return this.pipe(new stream.Transform({ transform: function(d, e, cb) { + cb(); + } })); + }; + module2.exports = Entry; +}); + +// node_modules/unzip-stream/lib/unzip-stream.js +var require_unzip_stream = __commonJS((exports2, module2) => { + var binary = require_binary(); + var stream = require("stream"); + var util = require("util"); + var zlib = require("zlib"); + var MatcherStream = require_matcher_stream(); + var Entry = require_entry(); + var states = { + STREAM_START: 0, + START: 1, + LOCAL_FILE_HEADER: 2, + LOCAL_FILE_HEADER_SUFFIX: 3, + FILE_DATA: 4, + FILE_DATA_END: 5, + DATA_DESCRIPTOR: 6, + CENTRAL_DIRECTORY_FILE_HEADER: 7, + CENTRAL_DIRECTORY_FILE_HEADER_SUFFIX: 8, + CDIR64_END: 9, + CDIR64_END_DATA_SECTOR: 10, + CDIR64_LOCATOR: 11, + CENTRAL_DIRECTORY_END: 12, + CENTRAL_DIRECTORY_END_COMMENT: 13, + TRAILING_JUNK: 14, + ERROR: 99 + }; + var FOUR_GIGS = 4294967296; + var SIG_LOCAL_FILE_HEADER = 67324752; + var SIG_DATA_DESCRIPTOR = 134695760; + var SIG_CDIR_RECORD = 33639248; + var SIG_CDIR64_RECORD_END = 101075792; + var SIG_CDIR64_LOCATOR_END = 117853008; + var SIG_CDIR_RECORD_END = 101010256; + function UnzipStream(options) { + if (!(this instanceof UnzipStream)) { + return new UnzipStream(options); + } + stream.Transform.call(this); + this.options = options || {}; + this.data = new Buffer(""); + this.state = states.STREAM_START; + this.skippedBytes = 0; + this.parsedEntity = null; + this.outStreamInfo = {}; + } + util.inherits(UnzipStream, stream.Transform); + UnzipStream.prototype.processDataChunk = function(chunk) { + var requiredLength; + switch (this.state) { + case states.STREAM_START: + case states.START: + requiredLength = 4; + break; + case states.LOCAL_FILE_HEADER: + requiredLength = 26; + break; + case states.LOCAL_FILE_HEADER_SUFFIX: + requiredLength = this.parsedEntity.fileNameLength + this.parsedEntity.extraFieldLength; + break; + case states.DATA_DESCRIPTOR: + requiredLength = 12; + break; + case states.CENTRAL_DIRECTORY_FILE_HEADER: + requiredLength = 42; + break; + case states.CENTRAL_DIRECTORY_FILE_HEADER_SUFFIX: + requiredLength = this.parsedEntity.fileNameLength + this.parsedEntity.extraFieldLength + this.parsedEntity.fileCommentLength; + break; + case states.CDIR64_END: + requiredLength = 52; + break; + case states.CDIR64_END_DATA_SECTOR: + requiredLength = this.parsedEntity.centralDirectoryRecordSize - 44; + break; + case states.CDIR64_LOCATOR: + requiredLength = 16; + break; + case states.CENTRAL_DIRECTORY_END: + requiredLength = 18; + break; + case states.CENTRAL_DIRECTORY_END_COMMENT: + requiredLength = this.parsedEntity.commentLength; + break; + case states.FILE_DATA: + return 0; + case states.FILE_DATA_END: + return 0; + case states.TRAILING_JUNK: + if (this.options.debug) + console.log("found", chunk.length, "bytes of TRAILING_JUNK"); + return chunk.length; + default: + return chunk.length; + } + var chunkLength = chunk.length; + if (chunkLength < requiredLength) { + return 0; + } + switch (this.state) { + case states.STREAM_START: + case states.START: + var signature = chunk.readUInt32LE(0); + switch (signature) { + case SIG_LOCAL_FILE_HEADER: + this.state = states.LOCAL_FILE_HEADER; + break; + case SIG_CDIR_RECORD: + this.state = states.CENTRAL_DIRECTORY_FILE_HEADER; + break; + case SIG_CDIR64_RECORD_END: + this.state = states.CDIR64_END; + break; + case SIG_CDIR64_LOCATOR_END: + this.state = states.CDIR64_LOCATOR; + break; + case SIG_CDIR_RECORD_END: + this.state = states.CENTRAL_DIRECTORY_END; + break; + default: + var isStreamStart = this.state === states.STREAM_START; + if (!isStreamStart && (signature & 65535) !== 19280 && this.skippedBytes < 26) { + var remaining = signature; + var toSkip = 4; + for (var i = 1;i < 4 && remaining !== 0; i++) { + remaining = remaining >>> 8; + if ((remaining & 255) === 80) { + toSkip = i; + break; + } + } + this.skippedBytes += toSkip; + if (this.options.debug) + console.log("Skipped", this.skippedBytes, "bytes"); + return toSkip; + } + this.state = states.ERROR; + var errMsg = isStreamStart ? "Not a valid zip file" : "Invalid signature in zip file"; + if (this.options.debug) { + var sig = chunk.readUInt32LE(0); + var asString; + try { + asString = chunk.slice(0, 4).toString(); + } catch (e) { + } + console.log("Unexpected signature in zip file: 0x" + sig.toString(16), '"' + asString + '", skipped', this.skippedBytes, "bytes"); + } + this.emit("error", new Error(errMsg)); + return chunk.length; + } + this.skippedBytes = 0; + return requiredLength; + case states.LOCAL_FILE_HEADER: + this.parsedEntity = this._readFile(chunk); + this.state = states.LOCAL_FILE_HEADER_SUFFIX; + return requiredLength; + case states.LOCAL_FILE_HEADER_SUFFIX: + var entry = new Entry; + var isUtf8 = (this.parsedEntity.flags & 2048) !== 0; + entry.path = this._decodeString(chunk.slice(0, this.parsedEntity.fileNameLength), isUtf8); + var extraDataBuffer = chunk.slice(this.parsedEntity.fileNameLength, this.parsedEntity.fileNameLength + this.parsedEntity.extraFieldLength); + var extra = this._readExtraFields(extraDataBuffer); + if (extra && extra.parsed) { + if (extra.parsed.path && !isUtf8) { + entry.path = extra.parsed.path; + } + if (Number.isFinite(extra.parsed.uncompressedSize) && this.parsedEntity.uncompressedSize === FOUR_GIGS - 1) { + this.parsedEntity.uncompressedSize = extra.parsed.uncompressedSize; + } + if (Number.isFinite(extra.parsed.compressedSize) && this.parsedEntity.compressedSize === FOUR_GIGS - 1) { + this.parsedEntity.compressedSize = extra.parsed.compressedSize; + } + } + this.parsedEntity.extra = extra.parsed || {}; + if (this.options.debug) { + const debugObj = Object.assign({}, this.parsedEntity, { + path: entry.path, + flags: "0x" + this.parsedEntity.flags.toString(16), + extraFields: extra && extra.debug + }); + console.log("decoded LOCAL_FILE_HEADER:", JSON.stringify(debugObj, null, 2)); + } + this._prepareOutStream(this.parsedEntity, entry); + this.emit("entry", entry); + this.state = states.FILE_DATA; + return requiredLength; + case states.CENTRAL_DIRECTORY_FILE_HEADER: + this.parsedEntity = this._readCentralDirectoryEntry(chunk); + this.state = states.CENTRAL_DIRECTORY_FILE_HEADER_SUFFIX; + return requiredLength; + case states.CENTRAL_DIRECTORY_FILE_HEADER_SUFFIX: + var isUtf8 = (this.parsedEntity.flags & 2048) !== 0; + var path = this._decodeString(chunk.slice(0, this.parsedEntity.fileNameLength), isUtf8); + var extraDataBuffer = chunk.slice(this.parsedEntity.fileNameLength, this.parsedEntity.fileNameLength + this.parsedEntity.extraFieldLength); + var extra = this._readExtraFields(extraDataBuffer); + if (extra && extra.parsed && extra.parsed.path && !isUtf8) { + path = extra.parsed.path; + } + this.parsedEntity.extra = extra.parsed; + var isUnix = (this.parsedEntity.versionMadeBy & 65280) >> 8 === 3; + var unixAttrs, isSymlink; + if (isUnix) { + unixAttrs = this.parsedEntity.externalFileAttributes >>> 16; + var fileType = unixAttrs >>> 12; + isSymlink = (fileType & 10) === 10; + } + if (this.options.debug) { + const debugObj = Object.assign({}, this.parsedEntity, { + path, + flags: "0x" + this.parsedEntity.flags.toString(16), + unixAttrs: unixAttrs && "0" + unixAttrs.toString(8), + isSymlink, + extraFields: extra.debug + }); + console.log("decoded CENTRAL_DIRECTORY_FILE_HEADER:", JSON.stringify(debugObj, null, 2)); + } + this.state = states.START; + return requiredLength; + case states.CDIR64_END: + this.parsedEntity = this._readEndOfCentralDirectory64(chunk); + if (this.options.debug) { + console.log("decoded CDIR64_END_RECORD:", this.parsedEntity); + } + this.state = states.CDIR64_END_DATA_SECTOR; + return requiredLength; + case states.CDIR64_END_DATA_SECTOR: + this.state = states.START; + return requiredLength; + case states.CDIR64_LOCATOR: + this.state = states.START; + return requiredLength; + case states.CENTRAL_DIRECTORY_END: + this.parsedEntity = this._readEndOfCentralDirectory(chunk); + if (this.options.debug) { + console.log("decoded CENTRAL_DIRECTORY_END:", this.parsedEntity); + } + this.state = states.CENTRAL_DIRECTORY_END_COMMENT; + return requiredLength; + case states.CENTRAL_DIRECTORY_END_COMMENT: + if (this.options.debug) { + console.log("decoded CENTRAL_DIRECTORY_END_COMMENT:", chunk.slice(0, requiredLength).toString()); + } + this.state = states.TRAILING_JUNK; + return requiredLength; + case states.ERROR: + return chunk.length; + default: + console.log("didn't handle state #", this.state, "discarding"); + return chunk.length; + } + }; + UnzipStream.prototype._prepareOutStream = function(vars, entry) { + var self2 = this; + var isDirectory = vars.uncompressedSize === 0 && /[\/\\]$/.test(entry.path); + entry.path = entry.path.replace(/(?<=^|[/\\]+)[.][.]+(?=[/\\]+|$)/g, "."); + entry.type = isDirectory ? "Directory" : "File"; + entry.isDirectory = isDirectory; + var fileSizeKnown = !(vars.flags & 8); + if (fileSizeKnown) { + entry.size = vars.uncompressedSize; + } + var isVersionSupported = vars.versionsNeededToExtract <= 45; + this.outStreamInfo = { + stream: null, + limit: fileSizeKnown ? vars.compressedSize : -1, + written: 0 + }; + if (!fileSizeKnown) { + var pattern = new Buffer(4); + pattern.writeUInt32LE(SIG_DATA_DESCRIPTOR, 0); + var zip64Mode = vars.extra.zip64Mode; + var extraSize = zip64Mode ? 20 : 12; + var searchPattern = { + pattern, + requiredExtraSize: extraSize + }; + var matcherStream = new MatcherStream(searchPattern, function(matchedChunk, sizeSoFar) { + var vars2 = self2._readDataDescriptor(matchedChunk, zip64Mode); + var compressedSizeMatches = vars2.compressedSize === sizeSoFar; + if (!zip64Mode && !compressedSizeMatches && sizeSoFar >= FOUR_GIGS) { + var overflown = sizeSoFar - FOUR_GIGS; + while (overflown >= 0) { + compressedSizeMatches = vars2.compressedSize === overflown; + if (compressedSizeMatches) + break; + overflown -= FOUR_GIGS; + } + } + if (!compressedSizeMatches) { + return; + } + self2.state = states.FILE_DATA_END; + var sliceOffset = zip64Mode ? 24 : 16; + if (self2.data.length > 0) { + self2.data = Buffer.concat([matchedChunk.slice(sliceOffset), self2.data]); + } else { + self2.data = matchedChunk.slice(sliceOffset); + } + return true; + }); + this.outStreamInfo.stream = matcherStream; + } else { + this.outStreamInfo.stream = new stream.PassThrough; + } + var isEncrypted = vars.flags & 1 || vars.flags & 64; + if (isEncrypted || !isVersionSupported) { + var message = isEncrypted ? "Encrypted files are not supported!" : "Zip version " + Math.floor(vars.versionsNeededToExtract / 10) + "." + vars.versionsNeededToExtract % 10 + " is not supported"; + entry.skip = true; + setImmediate(() => { + self2.emit("error", new Error(message)); + }); + this.outStreamInfo.stream.pipe(new Entry().autodrain()); + return; + } + var isCompressed = vars.compressionMethod > 0; + if (isCompressed) { + var inflater = zlib.createInflateRaw(); + inflater.on("error", function(err) { + self2.state = states.ERROR; + self2.emit("error", err); + }); + this.outStreamInfo.stream.pipe(inflater).pipe(entry); + } else { + this.outStreamInfo.stream.pipe(entry); + } + if (this._drainAllEntries) { + entry.autodrain(); + } + }; + UnzipStream.prototype._readFile = function(data) { + var vars = binary.parse(data).word16lu("versionsNeededToExtract").word16lu("flags").word16lu("compressionMethod").word16lu("lastModifiedTime").word16lu("lastModifiedDate").word32lu("crc32").word32lu("compressedSize").word32lu("uncompressedSize").word16lu("fileNameLength").word16lu("extraFieldLength").vars; + return vars; + }; + UnzipStream.prototype._readExtraFields = function(data) { + var extra = {}; + var result = { parsed: extra }; + if (this.options.debug) { + result.debug = []; + } + var index = 0; + while (index < data.length) { + var vars = binary.parse(data).skip(index).word16lu("extraId").word16lu("extraSize").vars; + index += 4; + var fieldType = undefined; + switch (vars.extraId) { + case 1: + fieldType = "Zip64 extended information extra field"; + var z64vars = binary.parse(data.slice(index, index + vars.extraSize)).word64lu("uncompressedSize").word64lu("compressedSize").word64lu("offsetToLocalHeader").word32lu("diskStartNumber").vars; + if (z64vars.uncompressedSize !== null) { + extra.uncompressedSize = z64vars.uncompressedSize; + } + if (z64vars.compressedSize !== null) { + extra.compressedSize = z64vars.compressedSize; + } + extra.zip64Mode = true; + break; + case 10: + fieldType = "NTFS extra field"; + break; + case 21589: + fieldType = "extended timestamp"; + var timestampFields = data.readUInt8(index); + var offset = 1; + if (vars.extraSize >= offset + 4 && timestampFields & 1) { + extra.mtime = new Date(data.readUInt32LE(index + offset) * 1000); + offset += 4; + } + if (vars.extraSize >= offset + 4 && timestampFields & 2) { + extra.atime = new Date(data.readUInt32LE(index + offset) * 1000); + offset += 4; + } + if (vars.extraSize >= offset + 4 && timestampFields & 4) { + extra.ctime = new Date(data.readUInt32LE(index + offset) * 1000); + } + break; + case 28789: + fieldType = "Info-ZIP Unicode Path Extra Field"; + var fieldVer = data.readUInt8(index); + if (fieldVer === 1) { + var offset = 1; + var nameCrc32 = data.readUInt32LE(index + offset); + offset += 4; + var pathBuffer = data.slice(index + offset); + extra.path = pathBuffer.toString(); + } + break; + case 13: + case 22613: + fieldType = vars.extraId === 13 ? "PKWARE Unix" : "Info-ZIP UNIX (type 1)"; + var offset = 0; + if (vars.extraSize >= 8) { + var atime = new Date(data.readUInt32LE(index + offset) * 1000); + offset += 4; + var mtime = new Date(data.readUInt32LE(index + offset) * 1000); + offset += 4; + extra.atime = atime; + extra.mtime = mtime; + if (vars.extraSize >= 12) { + var uid = data.readUInt16LE(index + offset); + offset += 2; + var gid = data.readUInt16LE(index + offset); + offset += 2; + extra.uid = uid; + extra.gid = gid; + } + } + break; + case 30805: + fieldType = "Info-ZIP UNIX (type 2)"; + var offset = 0; + if (vars.extraSize >= 4) { + var uid = data.readUInt16LE(index + offset); + offset += 2; + var gid = data.readUInt16LE(index + offset); + offset += 2; + extra.uid = uid; + extra.gid = gid; + } + break; + case 30837: + fieldType = "Info-ZIP New Unix"; + var offset = 0; + var extraVer = data.readUInt8(index); + offset += 1; + if (extraVer === 1) { + var uidSize = data.readUInt8(index + offset); + offset += 1; + if (uidSize <= 6) { + extra.uid = data.readUIntLE(index + offset, uidSize); + } + offset += uidSize; + var gidSize = data.readUInt8(index + offset); + offset += 1; + if (gidSize <= 6) { + extra.gid = data.readUIntLE(index + offset, gidSize); + } + } + break; + case 30062: + fieldType = "ASi Unix"; + var offset = 0; + if (vars.extraSize >= 14) { + var crc = data.readUInt32LE(index + offset); + offset += 4; + var mode = data.readUInt16LE(index + offset); + offset += 2; + var sizdev = data.readUInt32LE(index + offset); + offset += 4; + var uid = data.readUInt16LE(index + offset); + offset += 2; + var gid = data.readUInt16LE(index + offset); + offset += 2; + extra.mode = mode; + extra.uid = uid; + extra.gid = gid; + if (vars.extraSize > 14) { + var start = index + offset; + var end = index + vars.extraSize - 14; + var symlinkName = this._decodeString(data.slice(start, end)); + extra.symlink = symlinkName; + } + } + break; + } + if (this.options.debug) { + result.debug.push({ + extraId: "0x" + vars.extraId.toString(16), + description: fieldType, + data: data.slice(index, index + vars.extraSize).inspect() + }); + } + index += vars.extraSize; + } + return result; + }; + UnzipStream.prototype._readDataDescriptor = function(data, zip64Mode) { + if (zip64Mode) { + var vars = binary.parse(data).word32lu("dataDescriptorSignature").word32lu("crc32").word64lu("compressedSize").word64lu("uncompressedSize").vars; + return vars; + } + var vars = binary.parse(data).word32lu("dataDescriptorSignature").word32lu("crc32").word32lu("compressedSize").word32lu("uncompressedSize").vars; + return vars; + }; + UnzipStream.prototype._readCentralDirectoryEntry = function(data) { + var vars = binary.parse(data).word16lu("versionMadeBy").word16lu("versionsNeededToExtract").word16lu("flags").word16lu("compressionMethod").word16lu("lastModifiedTime").word16lu("lastModifiedDate").word32lu("crc32").word32lu("compressedSize").word32lu("uncompressedSize").word16lu("fileNameLength").word16lu("extraFieldLength").word16lu("fileCommentLength").word16lu("diskNumber").word16lu("internalFileAttributes").word32lu("externalFileAttributes").word32lu("offsetToLocalFileHeader").vars; + return vars; + }; + UnzipStream.prototype._readEndOfCentralDirectory64 = function(data) { + var vars = binary.parse(data).word64lu("centralDirectoryRecordSize").word16lu("versionMadeBy").word16lu("versionsNeededToExtract").word32lu("diskNumber").word32lu("diskNumberWithCentralDirectoryStart").word64lu("centralDirectoryEntries").word64lu("totalCentralDirectoryEntries").word64lu("sizeOfCentralDirectory").word64lu("offsetToStartOfCentralDirectory").vars; + return vars; + }; + UnzipStream.prototype._readEndOfCentralDirectory = function(data) { + var vars = binary.parse(data).word16lu("diskNumber").word16lu("diskStart").word16lu("centralDirectoryEntries").word16lu("totalCentralDirectoryEntries").word32lu("sizeOfCentralDirectory").word32lu("offsetToStartOfCentralDirectory").word16lu("commentLength").vars; + return vars; + }; + var cp437 = "\0\u263A\u263B\u2665\u2666\u2663\u2660\u2022\u25D8\u25CB\u25D9\u2642\u2640\u266A\u266B\u263C\u25BA\u25C4\u2195\u203C\xB6\xA7\u25AC\u21A8\u2191\u2193\u2192\u2190\u221F\u2194\u25B2\u25BC !\"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\\]^_`abcdefghijklmnopqrstuvwxyz{|}~\u2302\xC7\xFC\xE9\xE2\xE4\xE0\xE5\xE7\xEA\xEB\xE8\xEF\xEE\xEC\xC4\xC5\xC9\xE6\xC6\xF4\xF6\xF2\xFB\xF9\xFF\xD6\xDC\xA2\xA3\xA5\u20A7\u0192\xE1\xED\xF3\xFA\xF1\xD1\xAA\xBA\xBF\u2310\xAC\xBD\xBC\xA1\xAB\xBB\u2591\u2592\u2593\u2502\u2524\u2561\u2562\u2556\u2555\u2563\u2551\u2557\u255D\u255C\u255B\u2510\u2514\u2534\u252C\u251C\u2500\u253C\u255E\u255F\u255A\u2554\u2569\u2566\u2560\u2550\u256C\u2567\u2568\u2564\u2565\u2559\u2558\u2552\u2553\u256B\u256A\u2518\u250C\u2588\u2584\u258C\u2590\u2580\u03B1\xDF\u0393\u03C0\u03A3\u03C3\xB5\u03C4\u03A6\u0398\u03A9\u03B4\u221E\u03C6\u03B5\u2229\u2261\xB1\u2265\u2264\u2320\u2321\xF7\u2248\xB0\u2219\xB7\u221A\u207F\xB2\u25A0 "; + UnzipStream.prototype._decodeString = function(buffer, isUtf8) { + if (isUtf8) { + return buffer.toString("utf8"); + } + if (this.options.decodeString) { + return this.options.decodeString(buffer); + } + let result = ""; + for (var i = 0;i < buffer.length; i++) { + result += cp437[buffer[i]]; + } + return result; + }; + UnzipStream.prototype._parseOrOutput = function(encoding, cb) { + var consume; + while ((consume = this.processDataChunk(this.data)) > 0) { + this.data = this.data.slice(consume); + if (this.data.length === 0) + break; + } + if (this.state === states.FILE_DATA) { + if (this.outStreamInfo.limit >= 0) { + var remaining = this.outStreamInfo.limit - this.outStreamInfo.written; + var packet; + if (remaining < this.data.length) { + packet = this.data.slice(0, remaining); + this.data = this.data.slice(remaining); + } else { + packet = this.data; + this.data = new Buffer(""); + } + this.outStreamInfo.written += packet.length; + if (this.outStreamInfo.limit === this.outStreamInfo.written) { + this.state = states.START; + this.outStreamInfo.stream.end(packet, encoding, cb); + } else { + this.outStreamInfo.stream.write(packet, encoding, cb); + } + } else { + var packet = this.data; + this.data = new Buffer(""); + this.outStreamInfo.written += packet.length; + var outputStream = this.outStreamInfo.stream; + outputStream.write(packet, encoding, () => { + if (this.state === states.FILE_DATA_END) { + this.state = states.START; + return outputStream.end(cb); + } + cb(); + }); + } + return; + } + cb(); + }; + UnzipStream.prototype.drainAll = function() { + this._drainAllEntries = true; + }; + UnzipStream.prototype._transform = function(chunk, encoding, cb) { + var self2 = this; + if (self2.data.length > 0) { + self2.data = Buffer.concat([self2.data, chunk]); + } else { + self2.data = chunk; + } + var startDataLength = self2.data.length; + var done = function() { + if (self2.data.length > 0 && self2.data.length < startDataLength) { + startDataLength = self2.data.length; + self2._parseOrOutput(encoding, done); + return; + } + cb(); + }; + self2._parseOrOutput(encoding, done); + }; + UnzipStream.prototype._flush = function(cb) { + var self2 = this; + if (self2.data.length > 0) { + self2._parseOrOutput("buffer", function() { + if (self2.data.length > 0) + return setImmediate(function() { + self2._flush(cb); + }); + cb(); + }); + return; + } + if (self2.state === states.FILE_DATA) { + return cb(new Error("Stream finished in an invalid state, uncompression failed")); + } + setImmediate(cb); + }; + module2.exports = UnzipStream; +}); + +// node_modules/unzip-stream/lib/parser-stream.js +var require_parser_stream = __commonJS((exports2, module2) => { + var Transform = require("stream").Transform; + var util = require("util"); + var UnzipStream = require_unzip_stream(); + function ParserStream(opts) { + if (!(this instanceof ParserStream)) { + return new ParserStream(opts); + } + var transformOpts = opts || {}; + Transform.call(this, { readableObjectMode: true }); + this.opts = opts || {}; + this.unzipStream = new UnzipStream(this.opts); + var self2 = this; + this.unzipStream.on("entry", function(entry) { + self2.push(entry); + }); + this.unzipStream.on("error", function(error) { + self2.emit("error", error); + }); + } + util.inherits(ParserStream, Transform); + ParserStream.prototype._transform = function(chunk, encoding, cb) { + this.unzipStream.write(chunk, encoding, cb); + }; + ParserStream.prototype._flush = function(cb) { + var self2 = this; + this.unzipStream.end(function() { + process.nextTick(function() { + self2.emit("close"); + }); + cb(); + }); + }; + ParserStream.prototype.on = function(eventName, fn) { + if (eventName === "entry") { + return Transform.prototype.on.call(this, "data", fn); + } + return Transform.prototype.on.call(this, eventName, fn); + }; + ParserStream.prototype.drainAll = function() { + this.unzipStream.drainAll(); + return this.pipe(new Transform({ objectMode: true, transform: function(d, e, cb) { + cb(); + } })); + }; + module2.exports = ParserStream; +}); + +// node_modules/mkdirp/index.js +var require_mkdirp = __commonJS((exports2, module2) => { + var path = require("path"); + var fs = require("fs"); + var _0777 = parseInt("0777", 8); + module2.exports = mkdirP.mkdirp = mkdirP.mkdirP = mkdirP; + function mkdirP(p, opts, f, made) { + if (typeof opts === "function") { + f = opts; + opts = {}; + } else if (!opts || typeof opts !== "object") { + opts = { mode: opts }; + } + var mode = opts.mode; + var xfs = opts.fs || fs; + if (mode === undefined) { + mode = _0777; + } + if (!made) + made = null; + var cb = f || function() { + }; + p = path.resolve(p); + xfs.mkdir(p, mode, function(er) { + if (!er) { + made = made || p; + return cb(null, made); + } + switch (er.code) { + case "ENOENT": + if (path.dirname(p) === p) + return cb(er); + mkdirP(path.dirname(p), opts, function(er2, made2) { + if (er2) + cb(er2, made2); + else + mkdirP(p, opts, cb, made2); + }); + break; + default: + xfs.stat(p, function(er2, stat) { + if (er2 || !stat.isDirectory()) + cb(er, made); + else + cb(null, made); + }); + break; + } + }); + } + mkdirP.sync = function sync(p, opts, made) { + if (!opts || typeof opts !== "object") { + opts = { mode: opts }; + } + var mode = opts.mode; + var xfs = opts.fs || fs; + if (mode === undefined) { + mode = _0777; + } + if (!made) + made = null; + p = path.resolve(p); + try { + xfs.mkdirSync(p, mode); + made = made || p; + } catch (err0) { + switch (err0.code) { + case "ENOENT": + made = sync(path.dirname(p), opts, made); + sync(p, opts, made); + break; + default: + var stat; + try { + stat = xfs.statSync(p); + } catch (err1) { + throw err0; + } + if (!stat.isDirectory()) + throw err0; + break; + } + } + return made; + }; +}); + +// node_modules/unzip-stream/lib/extract.js +var require_extract2 = __commonJS((exports2, module2) => { + var fs = require("fs"); + var path = require("path"); + var util = require("util"); + var mkdirp = require_mkdirp(); + var Transform = require("stream").Transform; + var UnzipStream = require_unzip_stream(); + function Extract(opts) { + if (!(this instanceof Extract)) + return new Extract(opts); + Transform.call(this); + this.opts = opts || {}; + this.unzipStream = new UnzipStream(this.opts); + this.unfinishedEntries = 0; + this.afterFlushWait = false; + this.createdDirectories = {}; + var self2 = this; + this.unzipStream.on("entry", this._processEntry.bind(this)); + this.unzipStream.on("error", function(error) { + self2.emit("error", error); + }); + } + util.inherits(Extract, Transform); + Extract.prototype._transform = function(chunk, encoding, cb) { + this.unzipStream.write(chunk, encoding, cb); + }; + Extract.prototype._flush = function(cb) { + var self2 = this; + var allDone = function() { + process.nextTick(function() { + self2.emit("close"); + }); + cb(); + }; + this.unzipStream.end(function() { + if (self2.unfinishedEntries > 0) { + self2.afterFlushWait = true; + return self2.on("await-finished", allDone); + } + allDone(); + }); + }; + Extract.prototype._processEntry = function(entry) { + var self2 = this; + var destPath = path.join(this.opts.path, entry.path); + var directory = entry.isDirectory ? destPath : path.dirname(destPath); + this.unfinishedEntries++; + var writeFileFn = function() { + var pipedStream = fs.createWriteStream(destPath); + pipedStream.on("close", function() { + self2.unfinishedEntries--; + self2._notifyAwaiter(); + }); + pipedStream.on("error", function(error) { + self2.emit("error", error); + }); + entry.pipe(pipedStream); + }; + if (this.createdDirectories[directory] || directory === ".") { + return writeFileFn(); + } + mkdirp(directory, function(err) { + if (err) + return self2.emit("error", err); + self2.createdDirectories[directory] = true; + if (entry.isDirectory) { + self2.unfinishedEntries--; + self2._notifyAwaiter(); + return; + } + writeFileFn(); + }); + }; + Extract.prototype._notifyAwaiter = function() { + if (this.afterFlushWait && this.unfinishedEntries === 0) { + this.emit("await-finished"); + this.afterFlushWait = false; + } + }; + module2.exports = Extract; +}); + +// node_modules/unzip-stream/unzip.js +var require_unzip = __commonJS((exports2) => { + exports2.Parse = require_parser_stream(); + exports2.Extract = require_extract2(); +}); + +// node_modules/@actions/artifact/lib/internal/download/download-artifact.js +var require_download_artifact = __commonJS((exports2) => { + var __createBinding = exports2 && exports2.__createBinding || (Object.create ? function(o, m, k, k2) { + if (k2 === undefined) + k2 = k; + var desc = Object.getOwnPropertyDescriptor(m, k); + if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) { + desc = { enumerable: true, get: function() { + return m[k]; + } }; + } + Object.defineProperty(o, k2, desc); + } : function(o, m, k, k2) { + if (k2 === undefined) + k2 = k; + o[k2] = m[k]; + }); + var __setModuleDefault = exports2 && exports2.__setModuleDefault || (Object.create ? function(o, v) { + Object.defineProperty(o, "default", { enumerable: true, value: v }); + } : function(o, v) { + o["default"] = v; + }); + var __importStar = exports2 && exports2.__importStar || function(mod) { + if (mod && mod.__esModule) + return mod; + var result = {}; + if (mod != null) { + for (var k in mod) + if (k !== "default" && Object.prototype.hasOwnProperty.call(mod, k)) + __createBinding(result, mod, k); + } + __setModuleDefault(result, mod); + return result; + }; + var __awaiter = exports2 && exports2.__awaiter || function(thisArg, _arguments, P, generator) { + function adopt(value) { + return value instanceof P ? value : new P(function(resolve) { + resolve(value); + }); + } + return new (P || (P = Promise))(function(resolve, reject) { + function fulfilled(value) { + try { + step(generator.next(value)); + } catch (e) { + reject(e); + } + } + function rejected(value) { + try { + step(generator["throw"](value)); + } catch (e) { + reject(e); + } + } + function step(result) { + result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); + } + step((generator = generator.apply(thisArg, _arguments || [])).next()); + }); + }; + var __importDefault = exports2 && exports2.__importDefault || function(mod) { + return mod && mod.__esModule ? mod : { default: mod }; + }; + Object.defineProperty(exports2, "__esModule", { value: true }); + exports2.downloadArtifactInternal = exports2.downloadArtifactPublic = exports2.streamExtractExternal = undefined; + var promises_1 = __importDefault(require("fs/promises")); + var github = __importStar(require_github2()); + var core = __importStar(require_core()); + var httpClient = __importStar(require_lib()); + var unzip_stream_1 = __importDefault(require_unzip()); + var user_agent_1 = require_user_agent(); + var config_1 = require_config(); + var artifact_twirp_client_1 = require_artifact_twirp_client(); + var generated_1 = require_generated(); + var util_1 = require_util8(); + var errors_1 = require_errors3(); + var scrubQueryParameters = (url) => { + const parsed = new URL(url); + parsed.search = ""; + return parsed.toString(); + }; + function exists(path) { + return __awaiter(this, undefined, undefined, function* () { + try { + yield promises_1.default.access(path); + return true; + } catch (error) { + if (error.code === "ENOENT") { + return false; + } else { + throw error; + } + } + }); + } + function streamExtract(url, directory) { + return __awaiter(this, undefined, undefined, function* () { + let retryCount = 0; + while (retryCount < 5) { + try { + yield streamExtractExternal(url, directory); + return; + } catch (error) { + retryCount++; + core.debug(`Failed to download artifact after ${retryCount} retries due to ${error.message}. Retrying in 5 seconds...`); + yield new Promise((resolve) => setTimeout(resolve, 5000)); + } + } + throw new Error(`Artifact download failed after ${retryCount} retries.`); + }); + } + function streamExtractExternal(url, directory) { + return __awaiter(this, undefined, undefined, function* () { + const client = new httpClient.HttpClient((0, user_agent_1.getUserAgentString)()); + const response = yield client.get(url); + if (response.message.statusCode !== 200) { + throw new Error(`Unexpected HTTP response from blob storage: ${response.message.statusCode} ${response.message.statusMessage}`); + } + const timeout = 30 * 1000; + return new Promise((resolve, reject) => { + const timerFn = () => { + response.message.destroy(new Error(`Blob storage chunk did not respond in ${timeout}ms`)); + }; + const timer = setTimeout(timerFn, timeout); + response.message.on("data", () => { + timer.refresh(); + }).on("error", (error) => { + core.debug(`response.message: Artifact download failed: ${error.message}`); + clearTimeout(timer); + reject(error); + }).pipe(unzip_stream_1.default.Extract({ path: directory })).on("close", () => { + clearTimeout(timer); + resolve(); + }).on("error", (error) => { + reject(error); + }); + }); + }); + } + exports2.streamExtractExternal = streamExtractExternal; + function downloadArtifactPublic(artifactId, repositoryOwner, repositoryName, token, options) { + return __awaiter(this, undefined, undefined, function* () { + const downloadPath = yield resolveOrCreateDirectory(options === null || options === undefined ? undefined : options.path); + const api = github.getOctokit(token); + core.info(`Downloading artifact '${artifactId}' from '${repositoryOwner}/${repositoryName}'`); + const { headers, status } = yield api.rest.actions.downloadArtifact({ + owner: repositoryOwner, + repo: repositoryName, + artifact_id: artifactId, + archive_format: "zip", + request: { + redirect: "manual" + } + }); + if (status !== 302) { + throw new Error(`Unable to download artifact. Unexpected status: ${status}`); + } + const { location } = headers; + if (!location) { + throw new Error(`Unable to redirect to artifact download url`); + } + core.info(`Redirecting to blob download url: ${scrubQueryParameters(location)}`); + try { + core.info(`Starting download of artifact to: ${downloadPath}`); + yield streamExtract(location, downloadPath); + core.info(`Artifact download completed successfully.`); + } catch (error) { + throw new Error(`Unable to download and extract artifact: ${error.message}`); + } + return { downloadPath }; + }); + } + exports2.downloadArtifactPublic = downloadArtifactPublic; + function downloadArtifactInternal(artifactId, options) { + return __awaiter(this, undefined, undefined, function* () { + const downloadPath = yield resolveOrCreateDirectory(options === null || options === undefined ? undefined : options.path); + const artifactClient = (0, artifact_twirp_client_1.internalArtifactTwirpClient)(); + const { workflowRunBackendId, workflowJobRunBackendId } = (0, util_1.getBackendIdsFromToken)(); + const listReq = { + workflowRunBackendId, + workflowJobRunBackendId, + idFilter: generated_1.Int64Value.create({ value: artifactId.toString() }) + }; + const { artifacts } = yield artifactClient.ListArtifacts(listReq); + if (artifacts.length === 0) { + throw new errors_1.ArtifactNotFoundError(`No artifacts found for ID: ${artifactId}\nAre you trying to download from a different run? Try specifying a github-token with \`actions:read\` scope.`); + } + if (artifacts.length > 1) { + core.warning("Multiple artifacts found, defaulting to first."); + } + const signedReq = { + workflowRunBackendId: artifacts[0].workflowRunBackendId, + workflowJobRunBackendId: artifacts[0].workflowJobRunBackendId, + name: artifacts[0].name + }; + const { signedUrl } = yield artifactClient.GetSignedArtifactURL(signedReq); + core.info(`Redirecting to blob download url: ${scrubQueryParameters(signedUrl)}`); + try { + core.info(`Starting download of artifact to: ${downloadPath}`); + yield streamExtract(signedUrl, downloadPath); + core.info(`Artifact download completed successfully.`); + } catch (error) { + throw new Error(`Unable to download and extract artifact: ${error.message}`); + } + return { downloadPath }; + }); + } + exports2.downloadArtifactInternal = downloadArtifactInternal; + function resolveOrCreateDirectory(downloadPath = (0, config_1.getGitHubWorkspaceDir)()) { + return __awaiter(this, undefined, undefined, function* () { + if (!(yield exists(downloadPath))) { + core.debug(`Artifact destination folder does not exist, creating: ${downloadPath}`); + yield promises_1.default.mkdir(downloadPath, { recursive: true }); + } else { + core.debug(`Artifact destination folder already exists: ${downloadPath}`); + } + return downloadPath; + }); + } +}); + +// node_modules/@actions/artifact/lib/internal/find/retry-options.js +var require_retry_options = __commonJS((exports2) => { + var __createBinding = exports2 && exports2.__createBinding || (Object.create ? function(o, m, k, k2) { + if (k2 === undefined) + k2 = k; + var desc = Object.getOwnPropertyDescriptor(m, k); + if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) { + desc = { enumerable: true, get: function() { + return m[k]; + } }; + } + Object.defineProperty(o, k2, desc); + } : function(o, m, k, k2) { + if (k2 === undefined) + k2 = k; + o[k2] = m[k]; + }); + var __setModuleDefault = exports2 && exports2.__setModuleDefault || (Object.create ? function(o, v) { + Object.defineProperty(o, "default", { enumerable: true, value: v }); + } : function(o, v) { + o["default"] = v; + }); + var __importStar = exports2 && exports2.__importStar || function(mod) { + if (mod && mod.__esModule) + return mod; + var result = {}; + if (mod != null) { + for (var k in mod) + if (k !== "default" && Object.prototype.hasOwnProperty.call(mod, k)) + __createBinding(result, mod, k); + } + __setModuleDefault(result, mod); + return result; + }; + Object.defineProperty(exports2, "__esModule", { value: true }); + exports2.getRetryOptions = undefined; + var core = __importStar(require_core()); + var defaultMaxRetryNumber = 5; + var defaultExemptStatusCodes = [400, 401, 403, 404, 422]; + function getRetryOptions(defaultOptions, retries = defaultMaxRetryNumber, exemptStatusCodes = defaultExemptStatusCodes) { + var _a; + if (retries <= 0) { + return [{ enabled: false }, defaultOptions.request]; + } + const retryOptions = { + enabled: true + }; + if (exemptStatusCodes.length > 0) { + retryOptions.doNotRetry = exemptStatusCodes; + } + const requestOptions = Object.assign(Object.assign({}, defaultOptions.request), { retries }); + core.debug(`GitHub client configured with: (retries: ${requestOptions.retries}, retry-exempt-status-code: ${(_a = retryOptions.doNotRetry) !== null && _a !== undefined ? _a : "octokit default: [400, 401, 403, 404, 422]"})`); + return [retryOptions, requestOptions]; + } + exports2.getRetryOptions = getRetryOptions; +}); + +// node_modules/@octokit/plugin-request-log/dist-node/index.js +var require_dist_node19 = __commonJS((exports2) => { + Object.defineProperty(exports2, "__esModule", { value: true }); + var VERSION = "1.0.4"; + function requestLog(octokit) { + octokit.hook.wrap("request", (request, options) => { + octokit.log.debug("request", options); + const start = Date.now(); + const requestOptions = octokit.request.endpoint.parse(options); + const path = requestOptions.url.replace(options.baseUrl, ""); + return request(options).then((response) => { + octokit.log.info(`${requestOptions.method} ${path} - ${response.status} in ${Date.now() - start}ms`); + return response; + }).catch((error) => { + octokit.log.info(`${requestOptions.method} ${path} - ${error.status} in ${Date.now() - start}ms`); + throw error; + }); + }); + } + requestLog.VERSION = VERSION; + exports2.requestLog = requestLog; +}); + +// node_modules/bottleneck/light.js +var require_light = __commonJS((exports2, module2) => { + (function(global2, factory) { + typeof exports2 === "object" && typeof module2 !== "undefined" ? module2.exports = factory() : typeof define === "function" && define.amd ? define(factory) : global2.Bottleneck = factory(); + })(exports2, function() { + var commonjsGlobal = typeof globalThis !== "undefined" ? globalThis : typeof window !== "undefined" ? window : typeof global !== "undefined" ? global : typeof self !== "undefined" ? self : {}; + function getCjsExportFromNamespace(n) { + return n && n["default"] || n; + } + var load = function(received, defaults, onto = {}) { + var k, ref, v; + for (k in defaults) { + v = defaults[k]; + onto[k] = (ref = received[k]) != null ? ref : v; + } + return onto; + }; + var overwrite = function(received, defaults, onto = {}) { + var k, v; + for (k in received) { + v = received[k]; + if (defaults[k] !== undefined) { + onto[k] = v; + } + } + return onto; + }; + var parser = { + load, + overwrite + }; + var DLList; + DLList = class DLList2 { + constructor(incr, decr) { + this.incr = incr; + this.decr = decr; + this._first = null; + this._last = null; + this.length = 0; + } + push(value) { + var node; + this.length++; + if (typeof this.incr === "function") { + this.incr(); + } + node = { + value, + prev: this._last, + next: null + }; + if (this._last != null) { + this._last.next = node; + this._last = node; + } else { + this._first = this._last = node; + } + return; + } + shift() { + var value; + if (this._first == null) { + return; + } else { + this.length--; + if (typeof this.decr === "function") { + this.decr(); + } + } + value = this._first.value; + if ((this._first = this._first.next) != null) { + this._first.prev = null; + } else { + this._last = null; + } + return value; + } + first() { + if (this._first != null) { + return this._first.value; + } + } + getArray() { + var node, ref, results; + node = this._first; + results = []; + while (node != null) { + results.push((ref = node, node = node.next, ref.value)); + } + return results; + } + forEachShift(cb) { + var node; + node = this.shift(); + while (node != null) { + cb(node), node = this.shift(); + } + return; + } + debug() { + var node, ref, ref1, ref2, results; + node = this._first; + results = []; + while (node != null) { + results.push((ref = node, node = node.next, { + value: ref.value, + prev: (ref1 = ref.prev) != null ? ref1.value : undefined, + next: (ref2 = ref.next) != null ? ref2.value : undefined + })); + } + return results; + } + }; + var DLList_1 = DLList; + var Events; + Events = class Events2 { + constructor(instance) { + this.instance = instance; + this._events = {}; + if (this.instance.on != null || this.instance.once != null || this.instance.removeAllListeners != null) { + throw new Error("An Emitter already exists for this object"); + } + this.instance.on = (name, cb) => { + return this._addListener(name, "many", cb); + }; + this.instance.once = (name, cb) => { + return this._addListener(name, "once", cb); + }; + this.instance.removeAllListeners = (name = null) => { + if (name != null) { + return delete this._events[name]; + } else { + return this._events = {}; + } + }; + } + _addListener(name, status, cb) { + var base; + if ((base = this._events)[name] == null) { + base[name] = []; + } + this._events[name].push({ cb, status }); + return this.instance; + } + listenerCount(name) { + if (this._events[name] != null) { + return this._events[name].length; + } else { + return 0; + } + } + async trigger(name, ...args) { + var e, promises; + try { + if (name !== "debug") { + this.trigger("debug", `Event triggered: ${name}`, args); + } + if (this._events[name] == null) { + return; + } + this._events[name] = this._events[name].filter(function(listener) { + return listener.status !== "none"; + }); + promises = this._events[name].map(async (listener) => { + var e2, returned; + if (listener.status === "none") { + return; + } + if (listener.status === "once") { + listener.status = "none"; + } + try { + returned = typeof listener.cb === "function" ? listener.cb(...args) : undefined; + if (typeof (returned != null ? returned.then : undefined) === "function") { + return await returned; + } else { + return returned; + } + } catch (error) { + e2 = error; + { + this.trigger("error", e2); + } + return null; + } + }); + return (await Promise.all(promises)).find(function(x) { + return x != null; + }); + } catch (error) { + e = error; + { + this.trigger("error", e); + } + return null; + } + } + }; + var Events_1 = Events; + var DLList$1, Events$1, Queues; + DLList$1 = DLList_1; + Events$1 = Events_1; + Queues = class Queues2 { + constructor(num_priorities) { + var i; + this.Events = new Events$1(this); + this._length = 0; + this._lists = function() { + var j, ref, results; + results = []; + for (i = j = 1, ref = num_priorities;1 <= ref ? j <= ref : j >= ref; i = 1 <= ref ? ++j : --j) { + results.push(new DLList$1(() => { + return this.incr(); + }, () => { + return this.decr(); + })); + } + return results; + }.call(this); + } + incr() { + if (this._length++ === 0) { + return this.Events.trigger("leftzero"); + } + } + decr() { + if (--this._length === 0) { + return this.Events.trigger("zero"); + } + } + push(job) { + return this._lists[job.options.priority].push(job); + } + queued(priority) { + if (priority != null) { + return this._lists[priority].length; + } else { + return this._length; + } + } + shiftAll(fn) { + return this._lists.forEach(function(list) { + return list.forEachShift(fn); + }); + } + getFirst(arr = this._lists) { + var j, len, list; + for (j = 0, len = arr.length;j < len; j++) { + list = arr[j]; + if (list.length > 0) { + return list; + } + } + return []; + } + shiftLastFrom(priority) { + return this.getFirst(this._lists.slice(priority).reverse()).shift(); + } + }; + var Queues_1 = Queues; + var BottleneckError; + BottleneckError = class BottleneckError2 extends Error { + }; + var BottleneckError_1 = BottleneckError; + var BottleneckError$1, DEFAULT_PRIORITY, Job, NUM_PRIORITIES, parser$1; + NUM_PRIORITIES = 10; + DEFAULT_PRIORITY = 5; + parser$1 = parser; + BottleneckError$1 = BottleneckError_1; + Job = class Job2 { + constructor(task, args, options, jobDefaults, rejectOnDrop, Events2, _states, Promise2) { + this.task = task; + this.args = args; + this.rejectOnDrop = rejectOnDrop; + this.Events = Events2; + this._states = _states; + this.Promise = Promise2; + this.options = parser$1.load(options, jobDefaults); + this.options.priority = this._sanitizePriority(this.options.priority); + if (this.options.id === jobDefaults.id) { + this.options.id = `${this.options.id}-${this._randomIndex()}`; + } + this.promise = new this.Promise((_resolve, _reject) => { + this._resolve = _resolve; + this._reject = _reject; + }); + this.retryCount = 0; + } + _sanitizePriority(priority) { + var sProperty; + sProperty = ~~priority !== priority ? DEFAULT_PRIORITY : priority; + if (sProperty < 0) { + return 0; + } else if (sProperty > NUM_PRIORITIES - 1) { + return NUM_PRIORITIES - 1; + } else { + return sProperty; + } + } + _randomIndex() { + return Math.random().toString(36).slice(2); + } + doDrop({ error, message = "This job has been dropped by Bottleneck" } = {}) { + if (this._states.remove(this.options.id)) { + if (this.rejectOnDrop) { + this._reject(error != null ? error : new BottleneckError$1(message)); + } + this.Events.trigger("dropped", { args: this.args, options: this.options, task: this.task, promise: this.promise }); + return true; + } else { + return false; + } + } + _assertStatus(expected) { + var status; + status = this._states.jobStatus(this.options.id); + if (!(status === expected || expected === "DONE" && status === null)) { + throw new BottleneckError$1(`Invalid job status ${status}, expected ${expected}. Please open an issue at https://github.com/SGrondin/bottleneck/issues`); + } + } + doReceive() { + this._states.start(this.options.id); + return this.Events.trigger("received", { args: this.args, options: this.options }); + } + doQueue(reachedHWM, blocked) { + this._assertStatus("RECEIVED"); + this._states.next(this.options.id); + return this.Events.trigger("queued", { args: this.args, options: this.options, reachedHWM, blocked }); + } + doRun() { + if (this.retryCount === 0) { + this._assertStatus("QUEUED"); + this._states.next(this.options.id); + } else { + this._assertStatus("EXECUTING"); + } + return this.Events.trigger("scheduled", { args: this.args, options: this.options }); + } + async doExecute(chained, clearGlobalState, run, free) { + var error, eventInfo, passed; + if (this.retryCount === 0) { + this._assertStatus("RUNNING"); + this._states.next(this.options.id); + } else { + this._assertStatus("EXECUTING"); + } + eventInfo = { args: this.args, options: this.options, retryCount: this.retryCount }; + this.Events.trigger("executing", eventInfo); + try { + passed = await (chained != null ? chained.schedule(this.options, this.task, ...this.args) : this.task(...this.args)); + if (clearGlobalState()) { + this.doDone(eventInfo); + await free(this.options, eventInfo); + this._assertStatus("DONE"); + return this._resolve(passed); + } + } catch (error1) { + error = error1; + return this._onFailure(error, eventInfo, clearGlobalState, run, free); + } + } + doExpire(clearGlobalState, run, free) { + var error, eventInfo; + if (this._states.jobStatus(this.options.id === "RUNNING")) { + this._states.next(this.options.id); + } + this._assertStatus("EXECUTING"); + eventInfo = { args: this.args, options: this.options, retryCount: this.retryCount }; + error = new BottleneckError$1(`This job timed out after ${this.options.expiration} ms.`); + return this._onFailure(error, eventInfo, clearGlobalState, run, free); + } + async _onFailure(error, eventInfo, clearGlobalState, run, free) { + var retry, retryAfter; + if (clearGlobalState()) { + retry = await this.Events.trigger("failed", error, eventInfo); + if (retry != null) { + retryAfter = ~~retry; + this.Events.trigger("retry", `Retrying ${this.options.id} after ${retryAfter} ms`, eventInfo); + this.retryCount++; + return run(retryAfter); + } else { + this.doDone(eventInfo); + await free(this.options, eventInfo); + this._assertStatus("DONE"); + return this._reject(error); + } + } + } + doDone(eventInfo) { + this._assertStatus("EXECUTING"); + this._states.next(this.options.id); + return this.Events.trigger("done", eventInfo); + } + }; + var Job_1 = Job; + var BottleneckError$2, LocalDatastore, parser$2; + parser$2 = parser; + BottleneckError$2 = BottleneckError_1; + LocalDatastore = class LocalDatastore2 { + constructor(instance, storeOptions, storeInstanceOptions) { + this.instance = instance; + this.storeOptions = storeOptions; + this.clientId = this.instance._randomIndex(); + parser$2.load(storeInstanceOptions, storeInstanceOptions, this); + this._nextRequest = this._lastReservoirRefresh = this._lastReservoirIncrease = Date.now(); + this._running = 0; + this._done = 0; + this._unblockTime = 0; + this.ready = this.Promise.resolve(); + this.clients = {}; + this._startHeartbeat(); + } + _startHeartbeat() { + var base; + if (this.heartbeat == null && (this.storeOptions.reservoirRefreshInterval != null && this.storeOptions.reservoirRefreshAmount != null || this.storeOptions.reservoirIncreaseInterval != null && this.storeOptions.reservoirIncreaseAmount != null)) { + return typeof (base = this.heartbeat = setInterval(() => { + var amount, incr, maximum, now, reservoir; + now = Date.now(); + if (this.storeOptions.reservoirRefreshInterval != null && now >= this._lastReservoirRefresh + this.storeOptions.reservoirRefreshInterval) { + this._lastReservoirRefresh = now; + this.storeOptions.reservoir = this.storeOptions.reservoirRefreshAmount; + this.instance._drainAll(this.computeCapacity()); + } + if (this.storeOptions.reservoirIncreaseInterval != null && now >= this._lastReservoirIncrease + this.storeOptions.reservoirIncreaseInterval) { + ({ + reservoirIncreaseAmount: amount, + reservoirIncreaseMaximum: maximum, + reservoir + } = this.storeOptions); + this._lastReservoirIncrease = now; + incr = maximum != null ? Math.min(amount, maximum - reservoir) : amount; + if (incr > 0) { + this.storeOptions.reservoir += incr; + return this.instance._drainAll(this.computeCapacity()); + } + } + }, this.heartbeatInterval)).unref === "function" ? base.unref() : undefined; + } else { + return clearInterval(this.heartbeat); + } + } + async __publish__(message) { + await this.yieldLoop(); + return this.instance.Events.trigger("message", message.toString()); + } + async __disconnect__(flush) { + await this.yieldLoop(); + clearInterval(this.heartbeat); + return this.Promise.resolve(); + } + yieldLoop(t = 0) { + return new this.Promise(function(resolve, reject) { + return setTimeout(resolve, t); + }); + } + computePenalty() { + var ref; + return (ref = this.storeOptions.penalty) != null ? ref : 15 * this.storeOptions.minTime || 5000; + } + async __updateSettings__(options) { + await this.yieldLoop(); + parser$2.overwrite(options, options, this.storeOptions); + this._startHeartbeat(); + this.instance._drainAll(this.computeCapacity()); + return true; + } + async __running__() { + await this.yieldLoop(); + return this._running; + } + async __queued__() { + await this.yieldLoop(); + return this.instance.queued(); + } + async __done__() { + await this.yieldLoop(); + return this._done; + } + async __groupCheck__(time) { + await this.yieldLoop(); + return this._nextRequest + this.timeout < time; + } + computeCapacity() { + var maxConcurrent, reservoir; + ({ maxConcurrent, reservoir } = this.storeOptions); + if (maxConcurrent != null && reservoir != null) { + return Math.min(maxConcurrent - this._running, reservoir); + } else if (maxConcurrent != null) { + return maxConcurrent - this._running; + } else if (reservoir != null) { + return reservoir; + } else { + return null; + } + } + conditionsCheck(weight) { + var capacity; + capacity = this.computeCapacity(); + return capacity == null || weight <= capacity; + } + async __incrementReservoir__(incr) { + var reservoir; + await this.yieldLoop(); + reservoir = this.storeOptions.reservoir += incr; + this.instance._drainAll(this.computeCapacity()); + return reservoir; + } + async __currentReservoir__() { + await this.yieldLoop(); + return this.storeOptions.reservoir; + } + isBlocked(now) { + return this._unblockTime >= now; + } + check(weight, now) { + return this.conditionsCheck(weight) && this._nextRequest - now <= 0; + } + async __check__(weight) { + var now; + await this.yieldLoop(); + now = Date.now(); + return this.check(weight, now); + } + async __register__(index, weight, expiration) { + var now, wait; + await this.yieldLoop(); + now = Date.now(); + if (this.conditionsCheck(weight)) { + this._running += weight; + if (this.storeOptions.reservoir != null) { + this.storeOptions.reservoir -= weight; + } + wait = Math.max(this._nextRequest - now, 0); + this._nextRequest = now + wait + this.storeOptions.minTime; + return { + success: true, + wait, + reservoir: this.storeOptions.reservoir + }; + } else { + return { + success: false + }; + } + } + strategyIsBlock() { + return this.storeOptions.strategy === 3; + } + async __submit__(queueLength, weight) { + var blocked, now, reachedHWM; + await this.yieldLoop(); + if (this.storeOptions.maxConcurrent != null && weight > this.storeOptions.maxConcurrent) { + throw new BottleneckError$2(`Impossible to add a job having a weight of ${weight} to a limiter having a maxConcurrent setting of ${this.storeOptions.maxConcurrent}`); + } + now = Date.now(); + reachedHWM = this.storeOptions.highWater != null && queueLength === this.storeOptions.highWater && !this.check(weight, now); + blocked = this.strategyIsBlock() && (reachedHWM || this.isBlocked(now)); + if (blocked) { + this._unblockTime = now + this.computePenalty(); + this._nextRequest = this._unblockTime + this.storeOptions.minTime; + this.instance._dropAllQueued(); + } + return { + reachedHWM, + blocked, + strategy: this.storeOptions.strategy + }; + } + async __free__(index, weight) { + await this.yieldLoop(); + this._running -= weight; + this._done += weight; + this.instance._drainAll(this.computeCapacity()); + return { + running: this._running + }; + } + }; + var LocalDatastore_1 = LocalDatastore; + var BottleneckError$3, States; + BottleneckError$3 = BottleneckError_1; + States = class States2 { + constructor(status1) { + this.status = status1; + this._jobs = {}; + this.counts = this.status.map(function() { + return 0; + }); + } + next(id) { + var current, next; + current = this._jobs[id]; + next = current + 1; + if (current != null && next < this.status.length) { + this.counts[current]--; + this.counts[next]++; + return this._jobs[id]++; + } else if (current != null) { + this.counts[current]--; + return delete this._jobs[id]; + } + } + start(id) { + var initial; + initial = 0; + this._jobs[id] = initial; + return this.counts[initial]++; + } + remove(id) { + var current; + current = this._jobs[id]; + if (current != null) { + this.counts[current]--; + delete this._jobs[id]; + } + return current != null; + } + jobStatus(id) { + var ref; + return (ref = this.status[this._jobs[id]]) != null ? ref : null; + } + statusJobs(status) { + var k, pos, ref, results, v; + if (status != null) { + pos = this.status.indexOf(status); + if (pos < 0) { + throw new BottleneckError$3(`status must be one of ${this.status.join(", ")}`); + } + ref = this._jobs; + results = []; + for (k in ref) { + v = ref[k]; + if (v === pos) { + results.push(k); + } + } + return results; + } else { + return Object.keys(this._jobs); + } + } + statusCounts() { + return this.counts.reduce((acc, v, i) => { + acc[this.status[i]] = v; + return acc; + }, {}); + } + }; + var States_1 = States; + var DLList$2, Sync; + DLList$2 = DLList_1; + Sync = class Sync2 { + constructor(name, Promise2) { + this.schedule = this.schedule.bind(this); + this.name = name; + this.Promise = Promise2; + this._running = 0; + this._queue = new DLList$2; + } + isEmpty() { + return this._queue.length === 0; + } + async _tryToRun() { + var args, cb, error, reject, resolve, returned, task; + if (this._running < 1 && this._queue.length > 0) { + this._running++; + ({ task, args, resolve, reject } = this._queue.shift()); + cb = await async function() { + try { + returned = await task(...args); + return function() { + return resolve(returned); + }; + } catch (error1) { + error = error1; + return function() { + return reject(error); + }; + } + }(); + this._running--; + this._tryToRun(); + return cb(); + } + } + schedule(task, ...args) { + var promise, reject, resolve; + resolve = reject = null; + promise = new this.Promise(function(_resolve, _reject) { + resolve = _resolve; + return reject = _reject; + }); + this._queue.push({ task, args, resolve, reject }); + this._tryToRun(); + return promise; + } + }; + var Sync_1 = Sync; + var version = "2.19.5"; + var version$1 = { + version + }; + var version$2 = /* @__PURE__ */ Object.freeze({ + version, + default: version$1 + }); + var require$$2 = () => console.log("You must import the full version of Bottleneck in order to use this feature."); + var require$$3 = () => console.log("You must import the full version of Bottleneck in order to use this feature."); + var require$$4 = () => console.log("You must import the full version of Bottleneck in order to use this feature."); + var Events$2, Group, IORedisConnection$1, RedisConnection$1, Scripts$1, parser$3; + parser$3 = parser; + Events$2 = Events_1; + RedisConnection$1 = require$$2; + IORedisConnection$1 = require$$3; + Scripts$1 = require$$4; + Group = function() { + + class Group2 { + constructor(limiterOptions = {}) { + this.deleteKey = this.deleteKey.bind(this); + this.limiterOptions = limiterOptions; + parser$3.load(this.limiterOptions, this.defaults, this); + this.Events = new Events$2(this); + this.instances = {}; + this.Bottleneck = Bottleneck_1; + this._startAutoCleanup(); + this.sharedConnection = this.connection != null; + if (this.connection == null) { + if (this.limiterOptions.datastore === "redis") { + this.connection = new RedisConnection$1(Object.assign({}, this.limiterOptions, { Events: this.Events })); + } else if (this.limiterOptions.datastore === "ioredis") { + this.connection = new IORedisConnection$1(Object.assign({}, this.limiterOptions, { Events: this.Events })); + } + } + } + key(key = "") { + var ref; + return (ref = this.instances[key]) != null ? ref : (() => { + var limiter; + limiter = this.instances[key] = new this.Bottleneck(Object.assign(this.limiterOptions, { + id: `${this.id}-${key}`, + timeout: this.timeout, + connection: this.connection + })); + this.Events.trigger("created", limiter, key); + return limiter; + })(); + } + async deleteKey(key = "") { + var deleted, instance; + instance = this.instances[key]; + if (this.connection) { + deleted = await this.connection.__runCommand__(["del", ...Scripts$1.allKeys(`${this.id}-${key}`)]); + } + if (instance != null) { + delete this.instances[key]; + await instance.disconnect(); + } + return instance != null || deleted > 0; + } + limiters() { + var k, ref, results, v; + ref = this.instances; + results = []; + for (k in ref) { + v = ref[k]; + results.push({ + key: k, + limiter: v + }); + } + return results; + } + keys() { + return Object.keys(this.instances); + } + async clusterKeys() { + var cursor, end, found, i, k, keys, len, next, start; + if (this.connection == null) { + return this.Promise.resolve(this.keys()); + } + keys = []; + cursor = null; + start = `b_${this.id}-`.length; + end = "_settings".length; + while (cursor !== 0) { + [next, found] = await this.connection.__runCommand__(["scan", cursor != null ? cursor : 0, "match", `b_${this.id}-*_settings`, "count", 1e4]); + cursor = ~~next; + for (i = 0, len = found.length;i < len; i++) { + k = found[i]; + keys.push(k.slice(start, -end)); + } + } + return keys; + } + _startAutoCleanup() { + var base; + clearInterval(this.interval); + return typeof (base = this.interval = setInterval(async () => { + var e, k, ref, results, time, v; + time = Date.now(); + ref = this.instances; + results = []; + for (k in ref) { + v = ref[k]; + try { + if (await v._store.__groupCheck__(time)) { + results.push(this.deleteKey(k)); + } else { + results.push(undefined); + } + } catch (error) { + e = error; + results.push(v.Events.trigger("error", e)); + } + } + return results; + }, this.timeout / 2)).unref === "function" ? base.unref() : undefined; + } + updateSettings(options = {}) { + parser$3.overwrite(options, this.defaults, this); + parser$3.overwrite(options, options, this.limiterOptions); + if (options.timeout != null) { + return this._startAutoCleanup(); + } + } + disconnect(flush = true) { + var ref; + if (!this.sharedConnection) { + return (ref = this.connection) != null ? ref.disconnect(flush) : undefined; + } + } + } + Group2.prototype.defaults = { + timeout: 1000 * 60 * 5, + connection: null, + Promise, + id: "group-key" + }; + return Group2; + }.call(commonjsGlobal); + var Group_1 = Group; + var Batcher, Events$3, parser$4; + parser$4 = parser; + Events$3 = Events_1; + Batcher = function() { + + class Batcher2 { + constructor(options = {}) { + this.options = options; + parser$4.load(this.options, this.defaults, this); + this.Events = new Events$3(this); + this._arr = []; + this._resetPromise(); + this._lastFlush = Date.now(); + } + _resetPromise() { + return this._promise = new this.Promise((res, rej) => { + return this._resolve = res; + }); + } + _flush() { + clearTimeout(this._timeout); + this._lastFlush = Date.now(); + this._resolve(); + this.Events.trigger("batch", this._arr); + this._arr = []; + return this._resetPromise(); + } + add(data) { + var ret; + this._arr.push(data); + ret = this._promise; + if (this._arr.length === this.maxSize) { + this._flush(); + } else if (this.maxTime != null && this._arr.length === 1) { + this._timeout = setTimeout(() => { + return this._flush(); + }, this.maxTime); + } + return ret; + } + } + Batcher2.prototype.defaults = { + maxTime: null, + maxSize: null, + Promise + }; + return Batcher2; + }.call(commonjsGlobal); + var Batcher_1 = Batcher; + var require$$4$1 = () => console.log("You must import the full version of Bottleneck in order to use this feature."); + var require$$8 = getCjsExportFromNamespace(version$2); + var Bottleneck, DEFAULT_PRIORITY$1, Events$4, Job$1, LocalDatastore$1, NUM_PRIORITIES$1, Queues$1, RedisDatastore$1, States$1, Sync$1, parser$5, splice = [].splice; + NUM_PRIORITIES$1 = 10; + DEFAULT_PRIORITY$1 = 5; + parser$5 = parser; + Queues$1 = Queues_1; + Job$1 = Job_1; + LocalDatastore$1 = LocalDatastore_1; + RedisDatastore$1 = require$$4$1; + Events$4 = Events_1; + States$1 = States_1; + Sync$1 = Sync_1; + Bottleneck = function() { + + class Bottleneck2 { + constructor(options = {}, ...invalid) { + var storeInstanceOptions, storeOptions; + this._addToQueue = this._addToQueue.bind(this); + this._validateOptions(options, invalid); + parser$5.load(options, this.instanceDefaults, this); + this._queues = new Queues$1(NUM_PRIORITIES$1); + this._scheduled = {}; + this._states = new States$1(["RECEIVED", "QUEUED", "RUNNING", "EXECUTING"].concat(this.trackDoneStatus ? ["DONE"] : [])); + this._limiter = null; + this.Events = new Events$4(this); + this._submitLock = new Sync$1("submit", this.Promise); + this._registerLock = new Sync$1("register", this.Promise); + storeOptions = parser$5.load(options, this.storeDefaults, {}); + this._store = function() { + if (this.datastore === "redis" || this.datastore === "ioredis" || this.connection != null) { + storeInstanceOptions = parser$5.load(options, this.redisStoreDefaults, {}); + return new RedisDatastore$1(this, storeOptions, storeInstanceOptions); + } else if (this.datastore === "local") { + storeInstanceOptions = parser$5.load(options, this.localStoreDefaults, {}); + return new LocalDatastore$1(this, storeOptions, storeInstanceOptions); + } else { + throw new Bottleneck2.prototype.BottleneckError(`Invalid datastore type: ${this.datastore}`); + } + }.call(this); + this._queues.on("leftzero", () => { + var ref; + return (ref = this._store.heartbeat) != null ? typeof ref.ref === "function" ? ref.ref() : undefined : undefined; + }); + this._queues.on("zero", () => { + var ref; + return (ref = this._store.heartbeat) != null ? typeof ref.unref === "function" ? ref.unref() : undefined : undefined; + }); + } + _validateOptions(options, invalid) { + if (!(options != null && typeof options === "object" && invalid.length === 0)) { + throw new Bottleneck2.prototype.BottleneckError("Bottleneck v2 takes a single object argument. Refer to https://github.com/SGrondin/bottleneck#upgrading-to-v2 if you're upgrading from Bottleneck v1."); + } + } + ready() { + return this._store.ready; + } + clients() { + return this._store.clients; + } + channel() { + return `b_${this.id}`; + } + channel_client() { + return `b_${this.id}_${this._store.clientId}`; + } + publish(message) { + return this._store.__publish__(message); + } + disconnect(flush = true) { + return this._store.__disconnect__(flush); + } + chain(_limiter) { + this._limiter = _limiter; + return this; + } + queued(priority) { + return this._queues.queued(priority); + } + clusterQueued() { + return this._store.__queued__(); + } + empty() { + return this.queued() === 0 && this._submitLock.isEmpty(); + } + running() { + return this._store.__running__(); + } + done() { + return this._store.__done__(); + } + jobStatus(id) { + return this._states.jobStatus(id); + } + jobs(status) { + return this._states.statusJobs(status); + } + counts() { + return this._states.statusCounts(); + } + _randomIndex() { + return Math.random().toString(36).slice(2); + } + check(weight = 1) { + return this._store.__check__(weight); + } + _clearGlobalState(index) { + if (this._scheduled[index] != null) { + clearTimeout(this._scheduled[index].expiration); + delete this._scheduled[index]; + return true; + } else { + return false; + } + } + async _free(index, job, options, eventInfo) { + var e, running; + try { + ({ running } = await this._store.__free__(index, options.weight)); + this.Events.trigger("debug", `Freed ${options.id}`, eventInfo); + if (running === 0 && this.empty()) { + return this.Events.trigger("idle"); + } + } catch (error1) { + e = error1; + return this.Events.trigger("error", e); + } + } + _run(index, job, wait) { + var clearGlobalState, free, run; + job.doRun(); + clearGlobalState = this._clearGlobalState.bind(this, index); + run = this._run.bind(this, index, job); + free = this._free.bind(this, index, job); + return this._scheduled[index] = { + timeout: setTimeout(() => { + return job.doExecute(this._limiter, clearGlobalState, run, free); + }, wait), + expiration: job.options.expiration != null ? setTimeout(function() { + return job.doExpire(clearGlobalState, run, free); + }, wait + job.options.expiration) : undefined, + job + }; + } + _drainOne(capacity) { + return this._registerLock.schedule(() => { + var args, index, next, options, queue; + if (this.queued() === 0) { + return this.Promise.resolve(null); + } + queue = this._queues.getFirst(); + ({ options, args } = next = queue.first()); + if (capacity != null && options.weight > capacity) { + return this.Promise.resolve(null); + } + this.Events.trigger("debug", `Draining ${options.id}`, { args, options }); + index = this._randomIndex(); + return this._store.__register__(index, options.weight, options.expiration).then(({ success, wait, reservoir }) => { + var empty; + this.Events.trigger("debug", `Drained ${options.id}`, { success, args, options }); + if (success) { + queue.shift(); + empty = this.empty(); + if (empty) { + this.Events.trigger("empty"); + } + if (reservoir === 0) { + this.Events.trigger("depleted", empty); + } + this._run(index, next, wait); + return this.Promise.resolve(options.weight); + } else { + return this.Promise.resolve(null); + } + }); + }); + } + _drainAll(capacity, total = 0) { + return this._drainOne(capacity).then((drained) => { + var newCapacity; + if (drained != null) { + newCapacity = capacity != null ? capacity - drained : capacity; + return this._drainAll(newCapacity, total + drained); + } else { + return this.Promise.resolve(total); + } + }).catch((e) => { + return this.Events.trigger("error", e); + }); + } + _dropAllQueued(message) { + return this._queues.shiftAll(function(job) { + return job.doDrop({ message }); + }); + } + stop(options = {}) { + var done, waitForExecuting; + options = parser$5.load(options, this.stopDefaults); + waitForExecuting = (at) => { + var finished; + finished = () => { + var counts; + counts = this._states.counts; + return counts[0] + counts[1] + counts[2] + counts[3] === at; + }; + return new this.Promise((resolve, reject) => { + if (finished()) { + return resolve(); + } else { + return this.on("done", () => { + if (finished()) { + this.removeAllListeners("done"); + return resolve(); + } + }); + } + }); + }; + done = options.dropWaitingJobs ? (this._run = function(index, next) { + return next.doDrop({ + message: options.dropErrorMessage + }); + }, this._drainOne = () => { + return this.Promise.resolve(null); + }, this._registerLock.schedule(() => { + return this._submitLock.schedule(() => { + var k, ref, v; + ref = this._scheduled; + for (k in ref) { + v = ref[k]; + if (this.jobStatus(v.job.options.id) === "RUNNING") { + clearTimeout(v.timeout); + clearTimeout(v.expiration); + v.job.doDrop({ + message: options.dropErrorMessage + }); + } + } + this._dropAllQueued(options.dropErrorMessage); + return waitForExecuting(0); + }); + })) : this.schedule({ + priority: NUM_PRIORITIES$1 - 1, + weight: 0 + }, () => { + return waitForExecuting(1); + }); + this._receive = function(job) { + return job._reject(new Bottleneck2.prototype.BottleneckError(options.enqueueErrorMessage)); + }; + this.stop = () => { + return this.Promise.reject(new Bottleneck2.prototype.BottleneckError("stop() has already been called")); + }; + return done; + } + async _addToQueue(job) { + var args, blocked, error, options, reachedHWM, shifted, strategy; + ({ args, options } = job); + try { + ({ reachedHWM, blocked, strategy } = await this._store.__submit__(this.queued(), options.weight)); + } catch (error1) { + error = error1; + this.Events.trigger("debug", `Could not queue ${options.id}`, { args, options, error }); + job.doDrop({ error }); + return false; + } + if (blocked) { + job.doDrop(); + return true; + } else if (reachedHWM) { + shifted = strategy === Bottleneck2.prototype.strategy.LEAK ? this._queues.shiftLastFrom(options.priority) : strategy === Bottleneck2.prototype.strategy.OVERFLOW_PRIORITY ? this._queues.shiftLastFrom(options.priority + 1) : strategy === Bottleneck2.prototype.strategy.OVERFLOW ? job : undefined; + if (shifted != null) { + shifted.doDrop(); + } + if (shifted == null || strategy === Bottleneck2.prototype.strategy.OVERFLOW) { + if (shifted == null) { + job.doDrop(); + } + return reachedHWM; + } + } + job.doQueue(reachedHWM, blocked); + this._queues.push(job); + await this._drainAll(); + return reachedHWM; + } + _receive(job) { + if (this._states.jobStatus(job.options.id) != null) { + job._reject(new Bottleneck2.prototype.BottleneckError(`A job with the same id already exists (id=${job.options.id})`)); + return false; + } else { + job.doReceive(); + return this._submitLock.schedule(this._addToQueue, job); + } + } + submit(...args) { + var cb, fn, job, options, ref, ref1, task; + if (typeof args[0] === "function") { + ref = args, [fn, ...args] = ref, [cb] = splice.call(args, -1); + options = parser$5.load({}, this.jobDefaults); + } else { + ref1 = args, [options, fn, ...args] = ref1, [cb] = splice.call(args, -1); + options = parser$5.load(options, this.jobDefaults); + } + task = (...args2) => { + return new this.Promise(function(resolve, reject) { + return fn(...args2, function(...args3) { + return (args3[0] != null ? reject : resolve)(args3); + }); + }); + }; + job = new Job$1(task, args, options, this.jobDefaults, this.rejectOnDrop, this.Events, this._states, this.Promise); + job.promise.then(function(args2) { + return typeof cb === "function" ? cb(...args2) : undefined; + }).catch(function(args2) { + if (Array.isArray(args2)) { + return typeof cb === "function" ? cb(...args2) : undefined; + } else { + return typeof cb === "function" ? cb(args2) : undefined; + } + }); + return this._receive(job); + } + schedule(...args) { + var job, options, task; + if (typeof args[0] === "function") { + [task, ...args] = args; + options = {}; + } else { + [options, task, ...args] = args; + } + job = new Job$1(task, args, options, this.jobDefaults, this.rejectOnDrop, this.Events, this._states, this.Promise); + this._receive(job); + return job.promise; + } + wrap(fn) { + var schedule, wrapped; + schedule = this.schedule.bind(this); + wrapped = function(...args) { + return schedule(fn.bind(this), ...args); + }; + wrapped.withOptions = function(options, ...args) { + return schedule(options, fn, ...args); + }; + return wrapped; + } + async updateSettings(options = {}) { + await this._store.__updateSettings__(parser$5.overwrite(options, this.storeDefaults)); + parser$5.overwrite(options, this.instanceDefaults, this); + return this; + } + currentReservoir() { + return this._store.__currentReservoir__(); + } + incrementReservoir(incr = 0) { + return this._store.__incrementReservoir__(incr); + } + } + Bottleneck2.default = Bottleneck2; + Bottleneck2.Events = Events$4; + Bottleneck2.version = Bottleneck2.prototype.version = require$$8.version; + Bottleneck2.strategy = Bottleneck2.prototype.strategy = { + LEAK: 1, + OVERFLOW: 2, + OVERFLOW_PRIORITY: 4, + BLOCK: 3 + }; + Bottleneck2.BottleneckError = Bottleneck2.prototype.BottleneckError = BottleneckError_1; + Bottleneck2.Group = Bottleneck2.prototype.Group = Group_1; + Bottleneck2.RedisConnection = Bottleneck2.prototype.RedisConnection = require$$2; + Bottleneck2.IORedisConnection = Bottleneck2.prototype.IORedisConnection = require$$3; + Bottleneck2.Batcher = Bottleneck2.prototype.Batcher = Batcher_1; + Bottleneck2.prototype.jobDefaults = { + priority: DEFAULT_PRIORITY$1, + weight: 1, + expiration: null, + id: "" + }; + Bottleneck2.prototype.storeDefaults = { + maxConcurrent: null, + minTime: 0, + highWater: null, + strategy: Bottleneck2.prototype.strategy.LEAK, + penalty: null, + reservoir: null, + reservoirRefreshInterval: null, + reservoirRefreshAmount: null, + reservoirIncreaseInterval: null, + reservoirIncreaseAmount: null, + reservoirIncreaseMaximum: null + }; + Bottleneck2.prototype.localStoreDefaults = { + Promise, + timeout: null, + heartbeatInterval: 250 + }; + Bottleneck2.prototype.redisStoreDefaults = { + Promise, + timeout: null, + heartbeatInterval: 5000, + clientTimeout: 1e4, + Redis: null, + clientOptions: {}, + clusterNodes: null, + clearDatastore: false, + connection: null + }; + Bottleneck2.prototype.instanceDefaults = { + datastore: "local", + connection: null, + id: "", + rejectOnDrop: true, + trackDoneStatus: false, + Promise + }; + Bottleneck2.prototype.stopDefaults = { + enqueueErrorMessage: "This limiter has been stopped and cannot accept new jobs.", + dropWaitingJobs: true, + dropErrorMessage: "This limiter has been stopped." + }; + return Bottleneck2; + }.call(commonjsGlobal); + var Bottleneck_1 = Bottleneck; + var lib = Bottleneck_1; + return lib; + }); +}); + +// node_modules/@octokit/plugin-retry/dist-node/index.js +var require_dist_node20 = __commonJS((exports2) => { + Object.defineProperty(exports2, "__esModule", { value: true }); + function _interopDefault(ex) { + return ex && typeof ex === "object" && "default" in ex ? ex["default"] : ex; + } + var Bottleneck = _interopDefault(require_light()); + async function errorRequest(octokit, state, error, options) { + if (!error.request || !error.request.request) { + throw error; + } + if (error.status >= 400 && !state.doNotRetry.includes(error.status)) { + const retries = options.request.retries != null ? options.request.retries : state.retries; + const retryAfter = Math.pow((options.request.retryCount || 0) + 1, 2); + throw octokit.retry.retryRequest(error, retries, retryAfter); + } + throw error; + } + async function wrapRequest(state, request, options) { + const limiter = new Bottleneck; + limiter.on("failed", function(error, info) { + const maxRetries = ~~error.request.request.retries; + const after = ~~error.request.request.retryAfter; + options.request.retryCount = info.retryCount + 1; + if (maxRetries > info.retryCount) { + return after * state.retryAfterBaseValue; + } + }); + return limiter.schedule(request, options); + } + var VERSION = "3.0.9"; + function retry(octokit, octokitOptions) { + const state = Object.assign({ + enabled: true, + retryAfterBaseValue: 1000, + doNotRetry: [400, 401, 403, 404, 422], + retries: 3 + }, octokitOptions.retry); + if (state.enabled) { + octokit.hook.error("request", errorRequest.bind(null, octokit, state)); + octokit.hook.wrap("request", wrapRequest.bind(null, state)); + } + return { + retry: { + retryRequest: (error, retries, retryAfter) => { + error.request.request = Object.assign({}, error.request.request, { + retries, + retryAfter + }); + return error; + } + } + }; + } + retry.VERSION = VERSION; + exports2.VERSION = VERSION; + exports2.retry = retry; +}); + +// node_modules/@actions/artifact/lib/internal/find/get-artifact.js +var require_get_artifact = __commonJS((exports2) => { + var __createBinding = exports2 && exports2.__createBinding || (Object.create ? function(o, m, k, k2) { + if (k2 === undefined) + k2 = k; + var desc = Object.getOwnPropertyDescriptor(m, k); + if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) { + desc = { enumerable: true, get: function() { + return m[k]; + } }; + } + Object.defineProperty(o, k2, desc); + } : function(o, m, k, k2) { + if (k2 === undefined) + k2 = k; + o[k2] = m[k]; + }); + var __setModuleDefault = exports2 && exports2.__setModuleDefault || (Object.create ? function(o, v) { + Object.defineProperty(o, "default", { enumerable: true, value: v }); + } : function(o, v) { + o["default"] = v; + }); + var __importStar = exports2 && exports2.__importStar || function(mod) { + if (mod && mod.__esModule) + return mod; + var result = {}; + if (mod != null) { + for (var k in mod) + if (k !== "default" && Object.prototype.hasOwnProperty.call(mod, k)) + __createBinding(result, mod, k); + } + __setModuleDefault(result, mod); + return result; + }; + var __awaiter = exports2 && exports2.__awaiter || function(thisArg, _arguments, P, generator) { + function adopt(value) { + return value instanceof P ? value : new P(function(resolve) { + resolve(value); + }); + } + return new (P || (P = Promise))(function(resolve, reject) { + function fulfilled(value) { + try { + step(generator.next(value)); + } catch (e) { + reject(e); + } + } + function rejected(value) { + try { + step(generator["throw"](value)); + } catch (e) { + reject(e); + } + } + function step(result) { + result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); + } + step((generator = generator.apply(thisArg, _arguments || [])).next()); + }); + }; + Object.defineProperty(exports2, "__esModule", { value: true }); + exports2.getArtifactInternal = exports2.getArtifactPublic = undefined; + var github_1 = require_github2(); + var plugin_retry_1 = require_dist_node20(); + var core = __importStar(require_core()); + var utils_1 = require_utils9(); + var retry_options_1 = require_retry_options(); + var plugin_request_log_1 = require_dist_node19(); + var util_1 = require_util8(); + var user_agent_1 = require_user_agent(); + var artifact_twirp_client_1 = require_artifact_twirp_client(); + var generated_1 = require_generated(); + var errors_1 = require_errors3(); + function getArtifactPublic(artifactName, workflowRunId, repositoryOwner, repositoryName, token) { + var _a; + return __awaiter(this, undefined, undefined, function* () { + const [retryOpts, requestOpts] = (0, retry_options_1.getRetryOptions)(utils_1.defaults); + const opts = { + log: undefined, + userAgent: (0, user_agent_1.getUserAgentString)(), + previews: undefined, + retry: retryOpts, + request: requestOpts + }; + const github = (0, github_1.getOctokit)(token, opts, plugin_retry_1.retry, plugin_request_log_1.requestLog); + const getArtifactResp = yield github.request("GET /repos/{owner}/{repo}/actions/runs/{run_id}/artifacts{?name}", { + owner: repositoryOwner, + repo: repositoryName, + run_id: workflowRunId, + name: artifactName + }); + if (getArtifactResp.status !== 200) { + throw new errors_1.InvalidResponseError(`Invalid response from GitHub API: ${getArtifactResp.status} (${(_a = getArtifactResp === null || getArtifactResp === undefined ? undefined : getArtifactResp.headers) === null || _a === undefined ? undefined : _a["x-github-request-id"]})`); + } + if (getArtifactResp.data.artifacts.length === 0) { + throw new errors_1.ArtifactNotFoundError(`Artifact not found for name: ${artifactName} + Please ensure that your artifact is not expired and the artifact was uploaded using a compatible version of toolkit/upload-artifact. + For more information, visit the GitHub Artifacts FAQ: https://github.com/actions/toolkit/blob/main/packages/artifact/docs/faq.md`); + } + let artifact = getArtifactResp.data.artifacts[0]; + if (getArtifactResp.data.artifacts.length > 1) { + artifact = getArtifactResp.data.artifacts.sort((a, b) => b.id - a.id)[0]; + core.debug(`More than one artifact found for a single name, returning newest (id: ${artifact.id})`); + } + return { + artifact: { + name: artifact.name, + id: artifact.id, + size: artifact.size_in_bytes, + createdAt: artifact.created_at ? new Date(artifact.created_at) : undefined + } + }; + }); + } + exports2.getArtifactPublic = getArtifactPublic; + function getArtifactInternal(artifactName) { + return __awaiter(this, undefined, undefined, function* () { + const artifactClient = (0, artifact_twirp_client_1.internalArtifactTwirpClient)(); + const { workflowRunBackendId, workflowJobRunBackendId } = (0, util_1.getBackendIdsFromToken)(); + const req = { + workflowRunBackendId, + workflowJobRunBackendId, + nameFilter: generated_1.StringValue.create({ value: artifactName }) + }; + const res = yield artifactClient.ListArtifacts(req); + if (res.artifacts.length === 0) { + throw new errors_1.ArtifactNotFoundError(`Artifact not found for name: ${artifactName} + Please ensure that your artifact is not expired and the artifact was uploaded using a compatible version of toolkit/upload-artifact. + For more information, visit the GitHub Artifacts FAQ: https://github.com/actions/toolkit/blob/main/packages/artifact/docs/faq.md`); + } + let artifact = res.artifacts[0]; + if (res.artifacts.length > 1) { + artifact = res.artifacts.sort((a, b) => Number(b.databaseId) - Number(a.databaseId))[0]; + core.debug(`More than one artifact found for a single name, returning newest (id: ${artifact.databaseId})`); + } + return { + artifact: { + name: artifact.name, + id: Number(artifact.databaseId), + size: Number(artifact.size), + createdAt: artifact.createdAt ? generated_1.Timestamp.toDate(artifact.createdAt) : undefined + } + }; + }); + } + exports2.getArtifactInternal = getArtifactInternal; +}); + +// node_modules/@actions/artifact/lib/internal/delete/delete-artifact.js +var require_delete_artifact = __commonJS((exports2) => { + var __awaiter = exports2 && exports2.__awaiter || function(thisArg, _arguments, P, generator) { + function adopt(value) { + return value instanceof P ? value : new P(function(resolve) { + resolve(value); + }); + } + return new (P || (P = Promise))(function(resolve, reject) { + function fulfilled(value) { + try { + step(generator.next(value)); + } catch (e) { + reject(e); + } + } + function rejected(value) { + try { + step(generator["throw"](value)); + } catch (e) { + reject(e); + } + } + function step(result) { + result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); + } + step((generator = generator.apply(thisArg, _arguments || [])).next()); + }); + }; + Object.defineProperty(exports2, "__esModule", { value: true }); + exports2.deleteArtifactInternal = exports2.deleteArtifactPublic = undefined; + var core_1 = require_core(); + var github_1 = require_github2(); + var user_agent_1 = require_user_agent(); + var retry_options_1 = require_retry_options(); + var utils_1 = require_utils9(); + var plugin_request_log_1 = require_dist_node19(); + var plugin_retry_1 = require_dist_node20(); + var artifact_twirp_client_1 = require_artifact_twirp_client(); + var util_1 = require_util8(); + var generated_1 = require_generated(); + var get_artifact_1 = require_get_artifact(); + var errors_1 = require_errors3(); + function deleteArtifactPublic(artifactName, workflowRunId, repositoryOwner, repositoryName, token) { + var _a; + return __awaiter(this, undefined, undefined, function* () { + const [retryOpts, requestOpts] = (0, retry_options_1.getRetryOptions)(utils_1.defaults); + const opts = { + log: undefined, + userAgent: (0, user_agent_1.getUserAgentString)(), + previews: undefined, + retry: retryOpts, + request: requestOpts + }; + const github = (0, github_1.getOctokit)(token, opts, plugin_retry_1.retry, plugin_request_log_1.requestLog); + const getArtifactResp = yield (0, get_artifact_1.getArtifactPublic)(artifactName, workflowRunId, repositoryOwner, repositoryName, token); + const deleteArtifactResp = yield github.rest.actions.deleteArtifact({ + owner: repositoryOwner, + repo: repositoryName, + artifact_id: getArtifactResp.artifact.id + }); + if (deleteArtifactResp.status !== 204) { + throw new errors_1.InvalidResponseError(`Invalid response from GitHub API: ${deleteArtifactResp.status} (${(_a = deleteArtifactResp === null || deleteArtifactResp === undefined ? undefined : deleteArtifactResp.headers) === null || _a === undefined ? undefined : _a["x-github-request-id"]})`); + } + return { + id: getArtifactResp.artifact.id + }; + }); + } + exports2.deleteArtifactPublic = deleteArtifactPublic; + function deleteArtifactInternal(artifactName) { + return __awaiter(this, undefined, undefined, function* () { + const artifactClient = (0, artifact_twirp_client_1.internalArtifactTwirpClient)(); + const { workflowRunBackendId, workflowJobRunBackendId } = (0, util_1.getBackendIdsFromToken)(); + const listReq = { + workflowRunBackendId, + workflowJobRunBackendId, + nameFilter: generated_1.StringValue.create({ value: artifactName }) + }; + const listRes = yield artifactClient.ListArtifacts(listReq); + if (listRes.artifacts.length === 0) { + throw new errors_1.ArtifactNotFoundError(`Artifact not found for name: ${artifactName}`); + } + let artifact = listRes.artifacts[0]; + if (listRes.artifacts.length > 1) { + artifact = listRes.artifacts.sort((a, b) => Number(b.databaseId) - Number(a.databaseId))[0]; + (0, core_1.debug)(`More than one artifact found for a single name, returning newest (id: ${artifact.databaseId})`); + } + const req = { + workflowRunBackendId: artifact.workflowRunBackendId, + workflowJobRunBackendId: artifact.workflowJobRunBackendId, + name: artifact.name + }; + const res = yield artifactClient.DeleteArtifact(req); + (0, core_1.info)(`Artifact '${artifactName}' (ID: ${res.artifactId}) deleted`); + return { + id: Number(res.artifactId) + }; + }); + } + exports2.deleteArtifactInternal = deleteArtifactInternal; +}); + +// node_modules/@actions/artifact/lib/internal/find/list-artifacts.js +var require_list_artifacts = __commonJS((exports2) => { + var __awaiter = exports2 && exports2.__awaiter || function(thisArg, _arguments, P, generator) { + function adopt(value) { + return value instanceof P ? value : new P(function(resolve) { + resolve(value); + }); + } + return new (P || (P = Promise))(function(resolve, reject) { + function fulfilled(value) { + try { + step(generator.next(value)); + } catch (e) { + reject(e); + } + } + function rejected(value) { + try { + step(generator["throw"](value)); + } catch (e) { + reject(e); + } + } + function step(result) { + result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); + } + step((generator = generator.apply(thisArg, _arguments || [])).next()); + }); + }; + Object.defineProperty(exports2, "__esModule", { value: true }); + exports2.listArtifactsInternal = exports2.listArtifactsPublic = undefined; + var core_1 = require_core(); + var github_1 = require_github2(); + var user_agent_1 = require_user_agent(); + var retry_options_1 = require_retry_options(); + var utils_1 = require_utils9(); + var plugin_request_log_1 = require_dist_node19(); + var plugin_retry_1 = require_dist_node20(); + var artifact_twirp_client_1 = require_artifact_twirp_client(); + var util_1 = require_util8(); + var generated_1 = require_generated(); + var maximumArtifactCount = 1000; + var paginationCount = 100; + var maxNumberOfPages = maximumArtifactCount / paginationCount; + function listArtifactsPublic(workflowRunId, repositoryOwner, repositoryName, token, latest = false) { + return __awaiter(this, undefined, undefined, function* () { + (0, core_1.info)(`Fetching artifact list for workflow run ${workflowRunId} in repository ${repositoryOwner}/${repositoryName}`); + let artifacts = []; + const [retryOpts, requestOpts] = (0, retry_options_1.getRetryOptions)(utils_1.defaults); + const opts = { + log: undefined, + userAgent: (0, user_agent_1.getUserAgentString)(), + previews: undefined, + retry: retryOpts, + request: requestOpts + }; + const github = (0, github_1.getOctokit)(token, opts, plugin_retry_1.retry, plugin_request_log_1.requestLog); + let currentPageNumber = 1; + const { data: listArtifactResponse } = yield github.rest.actions.listWorkflowRunArtifacts({ + owner: repositoryOwner, + repo: repositoryName, + run_id: workflowRunId, + per_page: paginationCount, + page: currentPageNumber + }); + let numberOfPages = Math.ceil(listArtifactResponse.total_count / paginationCount); + const totalArtifactCount = listArtifactResponse.total_count; + if (totalArtifactCount > maximumArtifactCount) { + (0, core_1.warning)(`Workflow run ${workflowRunId} has more than 1000 artifacts. Results will be incomplete as only the first ${maximumArtifactCount} artifacts will be returned`); + numberOfPages = maxNumberOfPages; + } + for (const artifact of listArtifactResponse.artifacts) { + artifacts.push({ + name: artifact.name, + id: artifact.id, + size: artifact.size_in_bytes, + createdAt: artifact.created_at ? new Date(artifact.created_at) : undefined + }); + } + for (currentPageNumber;currentPageNumber < numberOfPages; currentPageNumber++) { + currentPageNumber++; + (0, core_1.debug)(`Fetching page ${currentPageNumber} of artifact list`); + const { data: listArtifactResponse2 } = yield github.rest.actions.listWorkflowRunArtifacts({ + owner: repositoryOwner, + repo: repositoryName, + run_id: workflowRunId, + per_page: paginationCount, + page: currentPageNumber + }); + for (const artifact of listArtifactResponse2.artifacts) { + artifacts.push({ + name: artifact.name, + id: artifact.id, + size: artifact.size_in_bytes, + createdAt: artifact.created_at ? new Date(artifact.created_at) : undefined + }); + } + } + if (latest) { + artifacts = filterLatest(artifacts); + } + (0, core_1.info)(`Found ${artifacts.length} artifact(s)`); + return { + artifacts + }; + }); + } + exports2.listArtifactsPublic = listArtifactsPublic; + function listArtifactsInternal(latest = false) { + return __awaiter(this, undefined, undefined, function* () { + const artifactClient = (0, artifact_twirp_client_1.internalArtifactTwirpClient)(); + const { workflowRunBackendId, workflowJobRunBackendId } = (0, util_1.getBackendIdsFromToken)(); + const req = { + workflowRunBackendId, + workflowJobRunBackendId + }; + const res = yield artifactClient.ListArtifacts(req); + let artifacts = res.artifacts.map((artifact) => ({ + name: artifact.name, + id: Number(artifact.databaseId), + size: Number(artifact.size), + createdAt: artifact.createdAt ? generated_1.Timestamp.toDate(artifact.createdAt) : undefined + })); + if (latest) { + artifacts = filterLatest(artifacts); + } + (0, core_1.info)(`Found ${artifacts.length} artifact(s)`); + return { + artifacts + }; + }); + } + exports2.listArtifactsInternal = listArtifactsInternal; + function filterLatest(artifacts) { + artifacts.sort((a, b) => b.id - a.id); + const latestArtifacts = []; + const seenArtifactNames = new Set; + for (const artifact of artifacts) { + if (!seenArtifactNames.has(artifact.name)) { + latestArtifacts.push(artifact); + seenArtifactNames.add(artifact.name); + } + } + return latestArtifacts; + } +}); + +// node_modules/@actions/artifact/lib/internal/client.js +var require_client2 = __commonJS((exports2) => { + var __awaiter = exports2 && exports2.__awaiter || function(thisArg, _arguments, P, generator) { + function adopt(value) { + return value instanceof P ? value : new P(function(resolve) { + resolve(value); + }); + } + return new (P || (P = Promise))(function(resolve, reject) { + function fulfilled(value) { + try { + step(generator.next(value)); + } catch (e) { + reject(e); + } + } + function rejected(value) { + try { + step(generator["throw"](value)); + } catch (e) { + reject(e); + } + } + function step(result) { + result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); + } + step((generator = generator.apply(thisArg, _arguments || [])).next()); + }); + }; + var __rest = exports2 && exports2.__rest || function(s, e) { + var t = {}; + for (var p in s) + if (Object.prototype.hasOwnProperty.call(s, p) && e.indexOf(p) < 0) + t[p] = s[p]; + if (s != null && typeof Object.getOwnPropertySymbols === "function") + for (var i = 0, p = Object.getOwnPropertySymbols(s);i < p.length; i++) { + if (e.indexOf(p[i]) < 0 && Object.prototype.propertyIsEnumerable.call(s, p[i])) + t[p[i]] = s[p[i]]; + } + return t; + }; + Object.defineProperty(exports2, "__esModule", { value: true }); + exports2.DefaultArtifactClient = undefined; + var core_1 = require_core(); + var config_1 = require_config(); + var upload_artifact_1 = require_upload_artifact(); + var download_artifact_1 = require_download_artifact(); + var delete_artifact_1 = require_delete_artifact(); + var get_artifact_1 = require_get_artifact(); + var list_artifacts_1 = require_list_artifacts(); + var errors_1 = require_errors3(); + + class DefaultArtifactClient { + uploadArtifact(name, files, rootDirectory, options) { + return __awaiter(this, undefined, undefined, function* () { + try { + if ((0, config_1.isGhes)()) { + throw new errors_1.GHESNotSupportedError; + } + return (0, upload_artifact_1.uploadArtifact)(name, files, rootDirectory, options); + } catch (error) { + (0, core_1.warning)(`Artifact upload failed with error: ${error}. + +Errors can be temporary, so please try again and optionally run the action with debug mode enabled for more information. + +If the error persists, please check whether Actions is operating normally at [https://githubstatus.com](https://www.githubstatus.com).`); + throw error; + } + }); + } + downloadArtifact(artifactId, options) { + return __awaiter(this, undefined, undefined, function* () { + try { + if ((0, config_1.isGhes)()) { + throw new errors_1.GHESNotSupportedError; + } + if (options === null || options === undefined ? undefined : options.findBy) { + const { findBy: { repositoryOwner, repositoryName, token } } = options, downloadOptions = __rest(options, ["findBy"]); + return (0, download_artifact_1.downloadArtifactPublic)(artifactId, repositoryOwner, repositoryName, token, downloadOptions); + } + return (0, download_artifact_1.downloadArtifactInternal)(artifactId, options); + } catch (error) { + (0, core_1.warning)(`Download Artifact failed with error: ${error}. + +Errors can be temporary, so please try again and optionally run the action with debug mode enabled for more information. + +If the error persists, please check whether Actions and API requests are operating normally at [https://githubstatus.com](https://www.githubstatus.com).`); + throw error; + } + }); + } + listArtifacts(options) { + return __awaiter(this, undefined, undefined, function* () { + try { + if ((0, config_1.isGhes)()) { + throw new errors_1.GHESNotSupportedError; + } + if (options === null || options === undefined ? undefined : options.findBy) { + const { findBy: { workflowRunId, repositoryOwner, repositoryName, token } } = options; + return (0, list_artifacts_1.listArtifactsPublic)(workflowRunId, repositoryOwner, repositoryName, token, options === null || options === undefined ? undefined : options.latest); + } + return (0, list_artifacts_1.listArtifactsInternal)(options === null || options === undefined ? undefined : options.latest); + } catch (error) { + (0, core_1.warning)(`Listing Artifacts failed with error: ${error}. + +Errors can be temporary, so please try again and optionally run the action with debug mode enabled for more information. + +If the error persists, please check whether Actions and API requests are operating normally at [https://githubstatus.com](https://www.githubstatus.com).`); + throw error; + } + }); + } + getArtifact(artifactName, options) { + return __awaiter(this, undefined, undefined, function* () { + try { + if ((0, config_1.isGhes)()) { + throw new errors_1.GHESNotSupportedError; + } + if (options === null || options === undefined ? undefined : options.findBy) { + const { findBy: { workflowRunId, repositoryOwner, repositoryName, token } } = options; + return (0, get_artifact_1.getArtifactPublic)(artifactName, workflowRunId, repositoryOwner, repositoryName, token); + } + return (0, get_artifact_1.getArtifactInternal)(artifactName); + } catch (error) { + (0, core_1.warning)(`Get Artifact failed with error: ${error}. + +Errors can be temporary, so please try again and optionally run the action with debug mode enabled for more information. + +If the error persists, please check whether Actions and API requests are operating normally at [https://githubstatus.com](https://www.githubstatus.com).`); + throw error; + } + }); + } + deleteArtifact(artifactName, options) { + return __awaiter(this, undefined, undefined, function* () { + try { + if ((0, config_1.isGhes)()) { + throw new errors_1.GHESNotSupportedError; + } + if (options === null || options === undefined ? undefined : options.findBy) { + const { findBy: { repositoryOwner, repositoryName, workflowRunId, token } } = options; + return (0, delete_artifact_1.deleteArtifactPublic)(artifactName, workflowRunId, repositoryOwner, repositoryName, token); + } + return (0, delete_artifact_1.deleteArtifactInternal)(artifactName); + } catch (error) { + (0, core_1.warning)(`Delete Artifact failed with error: ${error}. + +Errors can be temporary, so please try again and optionally run the action with debug mode enabled for more information. + +If the error persists, please check whether Actions and API requests are operating normally at [https://githubstatus.com](https://www.githubstatus.com).`); + throw error; + } + }); + } + } + exports2.DefaultArtifactClient = DefaultArtifactClient; +}); + +// node_modules/@actions/artifact/lib/internal/shared/interfaces.js +var require_interfaces2 = __commonJS((exports2) => { + Object.defineProperty(exports2, "__esModule", { value: true }); +}); + +// node_modules/@actions/artifact/lib/artifact.js +var require_artifact2 = __commonJS((exports2) => { + var __createBinding = exports2 && exports2.__createBinding || (Object.create ? function(o, m, k, k2) { + if (k2 === undefined) + k2 = k; + var desc = Object.getOwnPropertyDescriptor(m, k); + if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) { + desc = { enumerable: true, get: function() { + return m[k]; + } }; + } + Object.defineProperty(o, k2, desc); + } : function(o, m, k, k2) { + if (k2 === undefined) + k2 = k; + o[k2] = m[k]; + }); + var __exportStar = exports2 && exports2.__exportStar || function(m, exports3) { + for (var p in m) + if (p !== "default" && !Object.prototype.hasOwnProperty.call(exports3, p)) + __createBinding(exports3, m, p); + }; + Object.defineProperty(exports2, "__esModule", { value: true }); + var client_1 = require_client2(); + __exportStar(require_interfaces2(), exports2); + __exportStar(require_errors3(), exports2); + __exportStar(require_client2(), exports2); + var client = new client_1.DefaultArtifactClient; + exports2.default = client; +}); + +// src/main.ts +var import_node_path2 = require("node:path"); +var import_node_child_process = require("node:child_process"); +var import_node_util = require("node:util"); +var import_promises2 = require("node:fs/promises"); +var import_core = __toESM(require_core()); +var import_github = __toESM(require_github()); +var import_artifact = __toESM(require_artifact2()); + +// src/deploy.ts +var import_promises = __toESM(require("node:fs/promises")); +var import_node_path = __toESM(require("node:path")); + +// src/constants.ts +var YDB_GRPC_PORT = 2135; +var YDB_MON_PORT = 8765; +var YDB_IC_PORT = 19001; +var YDB_TENANT = "/Root/testdb"; +var YDB_ENDPOINT = `grpc://localhost:${YDB_GRPC_PORT}`; +var YBD_CONNECTION_STRING = `${YDB_ENDPOINT}${YDB_TENANT}`; +var PROMETHEUS_URL = "http://localhost:9090"; +var PROMETHEUS_PUSHGATEWAY_URL = "http://localhost:9091"; + +// src/configs/ydb.yaml +var ydb_default = "actor_system_config:\n cpu_count: 1\n node_type: STORAGE\n use_auto_config: true\nblob_storage_config:\n service_set:\n groups:\n - erasure_species: none\n rings:\n - fail_domains:\n - vdisk_locations:\n - node_id: 1\n path: SectorMap:1:64\n pdisk_category: SSD\nchannel_profile_config:\n profile:\n - channel:\n - erasure_species: none\n pdisk_category: 0\n storage_pool_kind: ssd\n - erasure_species: none\n pdisk_category: 0\n storage_pool_kind: ssd\n - erasure_species: none\n pdisk_category: 0\n storage_pool_kind: ssd\n profile_id: 0\ndomains_config:\n domain:\n - name: Root\n storage_pool_types:\n - kind: ssd\n pool_config:\n box_id: 1\n erasure_species: none\n kind: ssd\n pdisk_filter:\n - property:\n - type: SSD\n vdisk_kind: Default\n state_storage:\n - ring:\n node:\n - 1\n nto_select: 1\n ssid: 1\ngrpc_config:\n port: 2135\nhost_configs:\n - drive:\n - path: SectorMap:1:64\n type: SSD\n host_config_id: 1\nhosts:\n - host: localhost\n host_config_id: 1\n node_id: 1\n port: 19001\n walle_location:\n body: 1\n data_center: az-1\n rack: \"0\"\nstatic_erasure: none\n"; + +// src/configs/prometheus.yaml +var prometheus_default = "global:\n scrape_interval: 1s\n evaluation_interval: 1s\n\nscrape_configs:\n - job_name: 'pushgateway'\n static_configs:\n - targets: ['localhost:9091']\n"; + +// src/deploy.ts +var generateStaticNode = () => ` + static-0: + <<: *ydb-common + container_name: ydb-static-0 + command: + - /opt/ydb/bin/ydbd + - server + - --grpc-port + - "${YDB_GRPC_PORT}" + - --mon-port + - "${YDB_MON_PORT}" + - --ic-port + - "${YDB_IC_PORT}" + - --yaml-config + - /opt/ydb/cfg/config.yaml + - --node + - static + - --label + - deployment=docker + ports: + - ${YDB_GRPC_PORT}:${YDB_GRPC_PORT} + - ${YDB_MON_PORT}:${YDB_MON_PORT} + - ${YDB_IC_PORT}:${YDB_IC_PORT} + healthcheck: + test: bash -c "exec 6<> /dev/tcp/localhost/${YDB_GRPC_PORT}" + interval: 10s + timeout: 1s + retries: 3 + start_period: 30s + deploy: + <<: *ydb-deploy + + static-init: + <<: *ydb-common + restart: on-failure + container_name: ydb-static-init + command: + - /opt/ydb/bin/ydbd + - -s + - ${YDB_ENDPOINT} + - admin + - blobstorage + - config + - init + - --yaml-file + - /opt/ydb/cfg/config.yaml + depends_on: + static-0: + condition: service_healthy + + tenant-init: + <<: *ydb-common + restart: on-failure + container_name: ydb-tenant-init + command: + - /opt/ydb/bin/ydbd + - -s + - ${YDB_ENDPOINT} + - admin + - database + - ${YDB_TENANT} + - create + - ssd:1 + depends_on: + static-init: + condition: service_completed_successfully +`.slice(1); +var generateDynamicNode = (idx) => ` + dynamic-${idx}: + <<: *ydb-common + container_name: ydb-dynamic-${idx} + command: + - /opt/ydb/bin/ydbd + - server + - --grpc-port + - "${YDB_GRPC_PORT + idx}" + - --mon-port + - "${YDB_MON_PORT + idx}" + - --ic-port + - "${YDB_IC_PORT + idx}" + - --yaml-config + - /opt/ydb/cfg/config.yaml + - --tenant + - ${YDB_TENANT} + - --node-broker + - ${YDB_ENDPOINT} + - --label + - deployment=docker + ports: + - ${YDB_GRPC_PORT + idx}:${YDB_GRPC_PORT + idx} + - ${YDB_MON_PORT + idx}:${YDB_MON_PORT + idx} + - ${YDB_IC_PORT + idx}:${YDB_IC_PORT + idx} + healthcheck: + test: bash -c "exec 6<> /dev/tcp/localhost/${YDB_GRPC_PORT + idx}" + interval: 10s + timeout: 1s + retries: 3 + start_period: 30s + depends_on: + static-0: + condition: service_healthy + static-init: + condition: service_completed_successfully + tenant-init: + condition: service_completed_successfully + deploy: + <<: *ydb-deploy +`.slice(1); +var generateMonitoring = () => ` + prometheus: + image: prom/prometheus + restart: unless-stopped + <<: *runtime + ports: + - "9090:9090" + volumes: + - ./prometheus.yml:/etc/prometheus/prometheus.yml + deploy: &monitoring-deploy + resources: + limits: + cpus: '0.1' + memory: 1000M + reservations: + cpus: '0.001' + memory: 50M + + prometheus-pushgateway: + image: prom/pushgateway + restart: unless-stopped + <<: *runtime + ports: + - "9091:9091" + network_mode: host + deploy: + <<: *monitoring-deploy +`.slice(1); +var generateComposeFile = (ydbDatabaseNodeCount) => `# Code generated by Github Action; DO NOT EDIT. + +x-runtime: &runtime + platform: linux/amd64 + privileged: true + network_mode: host + +x-node: &ydb-common + image: cr.yandex/crptqonuodf51kdj7a7d/ydb:24.2.7 + restart: always + hostname: localhost + <<: *runtime + volumes: + - ./ydb.yaml:/opt/ydb/cfg/config.yaml + +x-deploy: &ydb-deploy + restart_policy: + condition: any + resources: + limits: + cpus: '1' + memory: 1000M + reservations: + cpus: '0.1' + memory: 250M + +name: ydb + +services: +${generateStaticNode()} +${Array.from({ length: ydbDatabaseNodeCount }, (_2, i) => i + 1).map(generateDynamicNode).join("\n")} +${generateMonitoring()} +`; +async function prepareDeployConfigs(tmpDir, ydbDatabaseNodeCount = 3) { + await import_promises.default.writeFile(import_node_path.default.join(tmpDir, "ydb.yaml"), ydb_default); + await import_promises.default.writeFile(import_node_path.default.join(tmpDir, "prometheus.yml"), prometheus_default); + await import_promises.default.writeFile(import_node_path.default.join(tmpDir, "compose.yaml"), generateComposeFile(ydbDatabaseNodeCount)); + return import_node_path.default.join(tmpDir, "compose.yaml"); +} +if (false) { +} + +// src/prometheus.ts +function queryRange(query, start, end) { + let url = new URL("/api/v1/query_range", PROMETHEUS_URL); + url.searchParams.set("query", query); + url.searchParams.set("start", Math.ceil(start.getTime() / 1000).toString()); + url.searchParams.set("end", Math.floor(end.getTime() / 1000).toString()); + url.searchParams.set("step", "1"); + return fetch(url).then((r) => r.json()); +} +var AVAILABILITY = (op) => `100 * sum by (ref) (increase(sdk_operations_success_total{operation_type="${op}"}[2s])) / sum by (ref) (increase(sdk_operations_total{operation_type="${op}"}[2s]))`; +var THROUGHPUT = (op) => `sum by (ref) (rate(sdk_operations_total{operation_type="${op}"}[2s]))`; +var LATENCY = (op) => `1000 * histogram_quantile(0.95, sum by(ref, le) (rate(sdk_operation_latency_seconds_bucket{operation_type="${op}"}[2s])))`; +async function collectPrometheus(start, end) { + const availabilityRead = await queryRange(AVAILABILITY("read" /* read */), start, end); + const availabilityWrite = await queryRange(AVAILABILITY("write" /* write */), start, end); + const throughputRead = await queryRange(THROUGHPUT("read" /* read */), start, end); + const throughputWrite = await queryRange(THROUGHPUT("write" /* write */), start, end); + const latencyRead = await queryRange(LATENCY("read" /* read */), start, end); + const latencyWrite = await queryRange(LATENCY("write" /* write */), start, end); + return { + availabilityRead: availabilityRead.data.result[0], + availabilityWrite: availabilityWrite.data.result[0], + throughputRead: throughputRead.data.result[0], + throughputWrite: throughputWrite.data.result[0], + latencyRead: latencyRead.data.result[0], + latencyWrite: latencyWrite.data.result[0] + }; +} + +// src/colors.ts +var palette = [ + "#2CA02C", + "#1F77B4", + "#D62728", + "#FF7F0E", + "#9467BD", + "#8C564B", + "#E377C2", + "#7F7F7F", + "#BCBD22", + "#17BECF" +]; + +// src/chart.ts +function renderChart(title, chart, palette2 = palette) { + let minLength = Number.POSITIVE_INFINITY; + for (const metric of chart) { + metric.values = metric.values.filter((v) => v[1] != "0"); + if (metric.values.length < minLength) + minLength = metric.values.length; + } + for (const metric of chart) { + metric.values = metric.values.slice(-1 * minLength); + } + let min = Number.POSITIVE_INFINITY; + let max = Number.NEGATIVE_INFINITY; + let lines = []; + for (const series of chart) { + let line = []; + for (let [, value] of series.values) { + let v = Math.round(parseFloat(value) * 1000) / 1000; + if (isNaN(v)) { + v = 0; + } + line.push(v); + if (v < min) + min = v; + if (v > max) + max = v; + } + lines.push(`line "${series.metric["ref"]}" [${line.join()}]`); + } + return `\`\`\`mermaid +--- +config: + xyChart: + width: 1200 + height: 400 + themeVariables: + xyChart: + titleColor: "#222" + backgroundColor: "#fff" + xAxisLineColor: "#222" + yAxisLineColor: "#222" + plotColorPalette: "${palette2.join()}" +--- +xychart-beta + title "${title}" + x-axis 0 --> 10 + y-axis ${Math.floor(min * 0.9)} --> ${Math.floor(max * 1.1)} + ${lines.join("\n ")} +\`\`\` +`; +} + +// src/report.ts +async function createReport(charts) { + return `# SLO Testing + +
Operation Success Rate +${renderChart("operation_type=read", charts.availabilityRead)} + +${renderChart("operation_type=write", charts.availabilityWrite)} +
+ +
Operations Per Second +${renderChart("operation_type=read", charts.throughputRead)} + +${renderChart("operation_type=write", charts.throughputWrite)} +
+ +
95th Percentile Latency +${renderChart("operation_type=read", charts.latencyRead)} + +${renderChart("operation_type=write", charts.latencyWrite)} +
+`; +} + +// src/main.ts +async function run() { + let head = import_core.getInput("GITHUB_HEAD_REF"); + let base = import_core.getInput("GITHUB_BASE_REF", { required: true }).replace(/^refs\/heads\//, ""); + let isMain = base === "main" || base === "master"; + let tmpDir = process.env["RUNNER_TEMP"]; + let composeFilePath = await prepareDeployConfigs(tmpDir, parseInt(import_core.getInput("YDB_DATABASE_NODE_COUNT"))); + await import_node_util.promisify(import_node_child_process.exec)(`docker compose -f ${composeFilePath} up --quiet-pull -d`); + let start = new Date; + const signal = AbortSignal.timeout(1000 * 60 * 15); + try { + const env = { + ["YDB_CONNECTION_STRING"]: YBD_CONNECTION_STRING, + ["PROMETHEUS_PUSHGATEWAY_URL"]: PROMETHEUS_PUSHGATEWAY_URL + }; + await Promise.race([ + import_node_util.promisify(import_node_child_process.exec)(import_core.getInput("WORKLOAD_RUNNER"), { signal, env }).then(({ stderr }) => { + import_core.error(stderr, { title: "Error during workload run" }); + }).catch(import_core.error), + import_node_util.promisify(import_node_child_process.exec)(import_core.getInput("CHAOS_TEST_RUNNER"), { signal, env }).then(({ stderr }) => { + import_core.error(stderr, { title: "Error during chaos test run" }); + }).catch(import_core.error) + ]); + AbortSignal.abort(); + } catch (err) { + if (err != signal.reason) { + import_core.setFailed(err); + } + } + let end = new Date; + let baseMetrics = undefined; + let headMetrics = undefined; + if (head) { + headMetrics = await collectPrometheus(start, end); + } else { + baseMetrics = await collectPrometheus(start, end); + } + let artifact = new import_artifact.DefaultArtifactClient; + let artifactPath = import_node_path2.join(tmpDir, "metrics.json"); + await import_promises2.writeFile(artifactPath, JSON.stringify(headMetrics || baseMetrics), { encoding: "utf-8" }); + await artifact.uploadArtifact(`slo-${head || base}`, [artifactPath], tmpDir, { retentionDays: isMain ? 7 : 1 }); + await import_node_util.promisify(import_node_child_process.exec)(`docker compose -f ${composeFilePath} down`); + if (!head) { + return; + } + let { artifact: baseArtifact } = await artifact.getArtifact(`slo-${base}`, { + findBy: { + token: import_core.getInput("GITHUB_TOKEN"), + workflowRunId: import_github.context.runId, + repositoryOwner: import_github.context.repo.owner, + repositoryName: import_github.context.repo.repo + } + }); + console.log({ baseArtifact }); + if (baseArtifact) { + let { downloadPath } = await artifact.downloadArtifact(baseArtifact.id, { + path: tmpDir, + findBy: { + token: import_core.getInput("GITHUB_TOKEN"), + workflowRunId: import_github.context.runId, + repositoryOwner: import_github.context.repo.owner, + repositoryName: import_github.context.repo.repo + } + }); + console.log({ downloadPath }); + baseMetrics = JSON.parse(await import_promises2.readFile(downloadPath, "utf8")); + } + let charts = { + availabilityRead: [], + availabilityWrite: [], + throughputRead: [], + throughputWrite: [], + latencyRead: [], + latencyWrite: [] + }; + if (headMetrics) { + charts.availabilityRead.push(headMetrics.availabilityRead); + charts.availabilityWrite.push(headMetrics.availabilityWrite); + charts.throughputRead.push(headMetrics.throughputRead); + charts.throughputWrite.push(headMetrics.throughputWrite); + charts.latencyRead.push(headMetrics.latencyRead); + charts.latencyWrite.push(headMetrics.latencyWrite); + } + if (baseMetrics) { + charts.availabilityRead.push(baseMetrics.availabilityRead); + charts.availabilityWrite.push(baseMetrics.availabilityWrite); + charts.throughputRead.push(baseMetrics.throughputRead); + charts.throughputWrite.push(baseMetrics.throughputWrite); + charts.latencyRead.push(baseMetrics.latencyRead); + charts.latencyWrite.push(baseMetrics.latencyWrite); + } + let { data } = await import_github.getOctokit(import_core.getInput("GITHUB_TOKEN")).rest.repos.listPullRequestsAssociatedWithCommit({ + commit_sha: import_github.context.sha, + owner: import_github.context.repo.owner, + repo: import_github.context.repo.repo + }); + for (let { number } of data) { + const pr = await import_github.getOctokit(import_core.getInput("GITHUB_TOKEN")).rest.pulls.get({ + owner: import_github.context.repo.owner, + repo: import_github.context.repo.repo, + pull_number: number + }).then((R) => R.data); + await import_github.getOctokit(import_core.getInput("GITHUB_TOKEN")).rest.issues.createComment({ + owner: import_github.context.repo.owner, + repo: import_github.context.repo.repo, + issue_number: pr.number, + body: await createReport(charts) + }); + } +} + +// src/index.ts +run(); + +//# debugId=8FDAC8BE295B739664756E2164756E21 +//# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsibm9kZV9tb2R1bGVzL0BhY3Rpb25zL2NvcmUvbGliL3V0aWxzLmpzIiwgIm5vZGVfbW9kdWxlcy9AYWN0aW9ucy9jb3JlL2xpYi9jb21tYW5kLmpzIiwgIm5vZGVfbW9kdWxlcy9AYWN0aW9ucy9jb3JlL2xpYi9maWxlLWNvbW1hbmQuanMiLCAibm9kZV9tb2R1bGVzL0BhY3Rpb25zL2h0dHAtY2xpZW50L2xpYi9wcm94eS5qcyIsICJub2RlX21vZHVsZXMvdHVubmVsL2xpYi90dW5uZWwuanMiLCAibm9kZV9tb2R1bGVzL3R1bm5lbC9pbmRleC5qcyIsICJub2RlX21vZHVsZXMvdW5kaWNpL2xpYi9jb3JlL3N5bWJvbHMuanMiLCAibm9kZV9tb2R1bGVzL3VuZGljaS9saWIvY29yZS9lcnJvcnMuanMiLCAibm9kZV9tb2R1bGVzL3VuZGljaS9saWIvY29yZS9jb25zdGFudHMuanMiLCAibm9kZV9tb2R1bGVzL3VuZGljaS9saWIvY29yZS91dGlsLmpzIiwgIm5vZGVfbW9kdWxlcy91bmRpY2kvbGliL3RpbWVycy5qcyIsICJub2RlX21vZHVsZXMvQGZhc3RpZnkvYnVzYm95L2RlcHMvc3RyZWFtc2VhcmNoL3NibWguanMiLCAibm9kZV9tb2R1bGVzL0BmYXN0aWZ5L2J1c2JveS9kZXBzL2RpY2VyL2xpYi9QYXJ0U3RyZWFtLmpzIiwgIm5vZGVfbW9kdWxlcy9AZmFzdGlmeS9idXNib3kvbGliL3V0aWxzL2dldExpbWl0LmpzIiwgIm5vZGVfbW9kdWxlcy9AZmFzdGlmeS9idXNib3kvZGVwcy9kaWNlci9saWIvSGVhZGVyUGFyc2VyLmpzIiwgIm5vZGVfbW9kdWxlcy9AZmFzdGlmeS9idXNib3kvZGVwcy9kaWNlci9saWIvRGljZXIuanMiLCAibm9kZV9tb2R1bGVzL0BmYXN0aWZ5L2J1c2JveS9saWIvdXRpbHMvZGVjb2RlVGV4dC5qcyIsICJub2RlX21vZHVsZXMvQGZhc3RpZnkvYnVzYm95L2xpYi91dGlscy9wYXJzZVBhcmFtcy5qcyIsICJub2RlX21vZHVsZXMvQGZhc3RpZnkvYnVzYm95L2xpYi91dGlscy9iYXNlbmFtZS5qcyIsICJub2RlX21vZHVsZXMvQGZhc3RpZnkvYnVzYm95L2xpYi90eXBlcy9tdWx0aXBhcnQuanMiLCAibm9kZV9tb2R1bGVzL0BmYXN0aWZ5L2J1c2JveS9saWIvdXRpbHMvRGVjb2Rlci5qcyIsICJub2RlX21vZHVsZXMvQGZhc3RpZnkvYnVzYm95L2xpYi90eXBlcy91cmxlbmNvZGVkLmpzIiwgIm5vZGVfbW9kdWxlcy9AZmFzdGlmeS9idXNib3kvbGliL21haW4uanMiLCAibm9kZV9tb2R1bGVzL3VuZGljaS9saWIvZmV0Y2gvY29uc3RhbnRzLmpzIiwgIm5vZGVfbW9kdWxlcy91bmRpY2kvbGliL2ZldGNoL2dsb2JhbC5qcyIsICJub2RlX21vZHVsZXMvdW5kaWNpL2xpYi9mZXRjaC91dGlsLmpzIiwgIm5vZGVfbW9kdWxlcy91bmRpY2kvbGliL2ZldGNoL3N5bWJvbHMuanMiLCAibm9kZV9tb2R1bGVzL3VuZGljaS9saWIvZmV0Y2gvd2ViaWRsLmpzIiwgIm5vZGVfbW9kdWxlcy91bmRpY2kvbGliL2ZldGNoL2RhdGFVUkwuanMiLCAibm9kZV9tb2R1bGVzL3VuZGljaS9saWIvZmV0Y2gvZmlsZS5qcyIsICJub2RlX21vZHVsZXMvdW5kaWNpL2xpYi9mZXRjaC9mb3JtZGF0YS5qcyIsICJub2RlX21vZHVsZXMvdW5kaWNpL2xpYi9mZXRjaC9ib2R5LmpzIiwgIm5vZGVfbW9kdWxlcy91bmRpY2kvbGliL2NvcmUvcmVxdWVzdC5qcyIsICJub2RlX21vZHVsZXMvdW5kaWNpL2xpYi9kaXNwYXRjaGVyLmpzIiwgIm5vZGVfbW9kdWxlcy91bmRpY2kvbGliL2Rpc3BhdGNoZXItYmFzZS5qcyIsICJub2RlX21vZHVsZXMvdW5kaWNpL2xpYi9jb3JlL2Nvbm5lY3QuanMiLCAibm9kZV9tb2R1bGVzL3VuZGljaS9saWIvbGxodHRwL3V0aWxzLmpzIiwgIm5vZGVfbW9kdWxlcy91bmRpY2kvbGliL2xsaHR0cC9jb25zdGFudHMuanMiLCAibm9kZV9tb2R1bGVzL3VuZGljaS9saWIvaGFuZGxlci9SZWRpcmVjdEhhbmRsZXIuanMiLCAibm9kZV9tb2R1bGVzL3VuZGljaS9saWIvaW50ZXJjZXB0b3IvcmVkaXJlY3RJbnRlcmNlcHRvci5qcyIsICJub2RlX21vZHVsZXMvdW5kaWNpL2xpYi9sbGh0dHAvbGxodHRwLXdhc20uanMiLCAibm9kZV9tb2R1bGVzL3VuZGljaS9saWIvbGxodHRwL2xsaHR0cF9zaW1kLXdhc20uanMiLCAibm9kZV9tb2R1bGVzL3VuZGljaS9saWIvY2xpZW50LmpzIiwgIm5vZGVfbW9kdWxlcy91bmRpY2kvbGliL25vZGUvZml4ZWQtcXVldWUuanMiLCAibm9kZV9tb2R1bGVzL3VuZGljaS9saWIvcG9vbC1zdGF0cy5qcyIsICJub2RlX21vZHVsZXMvdW5kaWNpL2xpYi9wb29sLWJhc2UuanMiLCAibm9kZV9tb2R1bGVzL3VuZGljaS9saWIvcG9vbC5qcyIsICJub2RlX21vZHVsZXMvdW5kaWNpL2xpYi9iYWxhbmNlZC1wb29sLmpzIiwgIm5vZGVfbW9kdWxlcy91bmRpY2kvbGliL2NvbXBhdC9kaXNwYXRjaGVyLXdlYWtyZWYuanMiLCAibm9kZV9tb2R1bGVzL3VuZGljaS9saWIvYWdlbnQuanMiLCAibm9kZV9tb2R1bGVzL3VuZGljaS9saWIvYXBpL3JlYWRhYmxlLmpzIiwgIm5vZGVfbW9kdWxlcy91bmRpY2kvbGliL2FwaS91dGlsLmpzIiwgIm5vZGVfbW9kdWxlcy91bmRpY2kvbGliL2FwaS9hYm9ydC1zaWduYWwuanMiLCAibm9kZV9tb2R1bGVzL3VuZGljaS9saWIvYXBpL2FwaS1yZXF1ZXN0LmpzIiwgIm5vZGVfbW9kdWxlcy91bmRpY2kvbGliL2FwaS9hcGktc3RyZWFtLmpzIiwgIm5vZGVfbW9kdWxlcy91bmRpY2kvbGliL2FwaS9hcGktcGlwZWxpbmUuanMiLCAibm9kZV9tb2R1bGVzL3VuZGljaS9saWIvYXBpL2FwaS11cGdyYWRlLmpzIiwgIm5vZGVfbW9kdWxlcy91bmRpY2kvbGliL2FwaS9hcGktY29ubmVjdC5qcyIsICJub2RlX21vZHVsZXMvdW5kaWNpL2xpYi9hcGkvaW5kZXguanMiLCAibm9kZV9tb2R1bGVzL3VuZGljaS9saWIvbW9jay9tb2NrLWVycm9ycy5qcyIsICJub2RlX21vZHVsZXMvdW5kaWNpL2xpYi9tb2NrL21vY2stc3ltYm9scy5qcyIsICJub2RlX21vZHVsZXMvdW5kaWNpL2xpYi9tb2NrL21vY2stdXRpbHMuanMiLCAibm9kZV9tb2R1bGVzL3VuZGljaS9saWIvbW9jay9tb2NrLWludGVyY2VwdG9yLmpzIiwgIm5vZGVfbW9kdWxlcy91bmRpY2kvbGliL21vY2svbW9jay1jbGllbnQuanMiLCAibm9kZV9tb2R1bGVzL3VuZGljaS9saWIvbW9jay9tb2NrLXBvb2wuanMiLCAibm9kZV9tb2R1bGVzL3VuZGljaS9saWIvbW9jay9wbHVyYWxpemVyLmpzIiwgIm5vZGVfbW9kdWxlcy91bmRpY2kvbGliL21vY2svcGVuZGluZy1pbnRlcmNlcHRvcnMtZm9ybWF0dGVyLmpzIiwgIm5vZGVfbW9kdWxlcy91bmRpY2kvbGliL21vY2svbW9jay1hZ2VudC5qcyIsICJub2RlX21vZHVsZXMvdW5kaWNpL2xpYi9wcm94eS1hZ2VudC5qcyIsICJub2RlX21vZHVsZXMvdW5kaWNpL2xpYi9oYW5kbGVyL1JldHJ5SGFuZGxlci5qcyIsICJub2RlX21vZHVsZXMvdW5kaWNpL2xpYi9nbG9iYWwuanMiLCAibm9kZV9tb2R1bGVzL3VuZGljaS9saWIvaGFuZGxlci9EZWNvcmF0b3JIYW5kbGVyLmpzIiwgIm5vZGVfbW9kdWxlcy91bmRpY2kvbGliL2ZldGNoL2hlYWRlcnMuanMiLCAibm9kZV9tb2R1bGVzL3VuZGljaS9saWIvZmV0Y2gvcmVzcG9uc2UuanMiLCAibm9kZV9tb2R1bGVzL3VuZGljaS9saWIvZmV0Y2gvcmVxdWVzdC5qcyIsICJub2RlX21vZHVsZXMvdW5kaWNpL2xpYi9mZXRjaC9pbmRleC5qcyIsICJub2RlX21vZHVsZXMvdW5kaWNpL2xpYi9maWxlYXBpL3N5bWJvbHMuanMiLCAibm9kZV9tb2R1bGVzL3VuZGljaS9saWIvZmlsZWFwaS9wcm9ncmVzc2V2ZW50LmpzIiwgIm5vZGVfbW9kdWxlcy91bmRpY2kvbGliL2ZpbGVhcGkvZW5jb2RpbmcuanMiLCAibm9kZV9tb2R1bGVzL3VuZGljaS9saWIvZmlsZWFwaS91dGlsLmpzIiwgIm5vZGVfbW9kdWxlcy91bmRpY2kvbGliL2ZpbGVhcGkvZmlsZXJlYWRlci5qcyIsICJub2RlX21vZHVsZXMvdW5kaWNpL2xpYi9jYWNoZS9zeW1ib2xzLmpzIiwgIm5vZGVfbW9kdWxlcy91bmRpY2kvbGliL2NhY2hlL3V0aWwuanMiLCAibm9kZV9tb2R1bGVzL3VuZGljaS9saWIvY2FjaGUvY2FjaGUuanMiLCAibm9kZV9tb2R1bGVzL3VuZGljaS9saWIvY2FjaGUvY2FjaGVzdG9yYWdlLmpzIiwgIm5vZGVfbW9kdWxlcy91bmRpY2kvbGliL2Nvb2tpZXMvY29uc3RhbnRzLmpzIiwgIm5vZGVfbW9kdWxlcy91bmRpY2kvbGliL2Nvb2tpZXMvdXRpbC5qcyIsICJub2RlX21vZHVsZXMvdW5kaWNpL2xpYi9jb29raWVzL3BhcnNlLmpzIiwgIm5vZGVfbW9kdWxlcy91bmRpY2kvbGliL2Nvb2tpZXMvaW5kZXguanMiLCAibm9kZV9tb2R1bGVzL3VuZGljaS9saWIvd2Vic29ja2V0L2NvbnN0YW50cy5qcyIsICJub2RlX21vZHVsZXMvdW5kaWNpL2xpYi93ZWJzb2NrZXQvc3ltYm9scy5qcyIsICJub2RlX21vZHVsZXMvdW5kaWNpL2xpYi93ZWJzb2NrZXQvZXZlbnRzLmpzIiwgIm5vZGVfbW9kdWxlcy91bmRpY2kvbGliL3dlYnNvY2tldC91dGlsLmpzIiwgIm5vZGVfbW9kdWxlcy91bmRpY2kvbGliL3dlYnNvY2tldC9jb25uZWN0aW9uLmpzIiwgIm5vZGVfbW9kdWxlcy91bmRpY2kvbGliL3dlYnNvY2tldC9mcmFtZS5qcyIsICJub2RlX21vZHVsZXMvdW5kaWNpL2xpYi93ZWJzb2NrZXQvcmVjZWl2ZXIuanMiLCAibm9kZV9tb2R1bGVzL3VuZGljaS9saWIvd2Vic29ja2V0L3dlYnNvY2tldC5qcyIsICJub2RlX21vZHVsZXMvdW5kaWNpL2luZGV4LmpzIiwgIm5vZGVfbW9kdWxlcy9AYWN0aW9ucy9odHRwLWNsaWVudC9saWIvaW5kZXguanMiLCAibm9kZV9tb2R1bGVzL0BhY3Rpb25zL2h0dHAtY2xpZW50L2xpYi9hdXRoLmpzIiwgIm5vZGVfbW9kdWxlcy9AYWN0aW9ucy9jb3JlL2xpYi9vaWRjLXV0aWxzLmpzIiwgIm5vZGVfbW9kdWxlcy9AYWN0aW9ucy9jb3JlL2xpYi9zdW1tYXJ5LmpzIiwgIm5vZGVfbW9kdWxlcy9AYWN0aW9ucy9jb3JlL2xpYi9wYXRoLXV0aWxzLmpzIiwgIm5vZGVfbW9kdWxlcy9AYWN0aW9ucy9pby9saWIvaW8tdXRpbC5qcyIsICJub2RlX21vZHVsZXMvQGFjdGlvbnMvaW8vbGliL2lvLmpzIiwgIm5vZGVfbW9kdWxlcy9AYWN0aW9ucy9leGVjL2xpYi90b29scnVubmVyLmpzIiwgIm5vZGVfbW9kdWxlcy9AYWN0aW9ucy9leGVjL2xpYi9leGVjLmpzIiwgIm5vZGVfbW9kdWxlcy9AYWN0aW9ucy9jb3JlL2xpYi9wbGF0Zm9ybS5qcyIsICJub2RlX21vZHVsZXMvQGFjdGlvbnMvY29yZS9saWIvY29yZS5qcyIsICJub2RlX21vZHVsZXMvQGFjdGlvbnMvZ2l0aHViL2xpYi9jb250ZXh0LmpzIiwgIm5vZGVfbW9kdWxlcy9AYWN0aW9ucy9naXRodWIvbGliL2ludGVybmFsL3V0aWxzLmpzIiwgIm5vZGVfbW9kdWxlcy91bml2ZXJzYWwtdXNlci1hZ2VudC9kaXN0LW5vZGUvaW5kZXguanMiLCAibm9kZV9tb2R1bGVzL2JlZm9yZS1hZnRlci1ob29rL2xpYi9yZWdpc3Rlci5qcyIsICJub2RlX21vZHVsZXMvYmVmb3JlLWFmdGVyLWhvb2svbGliL2FkZC5qcyIsICJub2RlX21vZHVsZXMvYmVmb3JlLWFmdGVyLWhvb2svbGliL3JlbW92ZS5qcyIsICJub2RlX21vZHVsZXMvYmVmb3JlLWFmdGVyLWhvb2svaW5kZXguanMiLCAibm9kZV9tb2R1bGVzL0BhY3Rpb25zL2dpdGh1Yi9ub2RlX21vZHVsZXMvQG9jdG9raXQvY29yZS9ub2RlX21vZHVsZXMvQG9jdG9raXQvcmVxdWVzdC9ub2RlX21vZHVsZXMvQG9jdG9raXQvZW5kcG9pbnQvZGlzdC1ub2RlL2luZGV4LmpzIiwgIm5vZGVfbW9kdWxlcy9kZXByZWNhdGlvbi9kaXN0LW5vZGUvaW5kZXguanMiLCAibm9kZV9tb2R1bGVzL3dyYXBweS93cmFwcHkuanMiLCAibm9kZV9tb2R1bGVzL29uY2Uvb25jZS5qcyIsICJub2RlX21vZHVsZXMvQG9jdG9raXQvcmVxdWVzdC1lcnJvci9kaXN0LW5vZGUvaW5kZXguanMiLCAibm9kZV9tb2R1bGVzL0BhY3Rpb25zL2dpdGh1Yi9ub2RlX21vZHVsZXMvQG9jdG9raXQvY29yZS9ub2RlX21vZHVsZXMvQG9jdG9raXQvcmVxdWVzdC9kaXN0LW5vZGUvaW5kZXguanMiLCAibm9kZV9tb2R1bGVzL0BhY3Rpb25zL2dpdGh1Yi9ub2RlX21vZHVsZXMvQG9jdG9raXQvY29yZS9ub2RlX21vZHVsZXMvQG9jdG9raXQvZ3JhcGhxbC9kaXN0LW5vZGUvaW5kZXguanMiLCAibm9kZV9tb2R1bGVzL0BhY3Rpb25zL2dpdGh1Yi9ub2RlX21vZHVsZXMvQG9jdG9raXQvY29yZS9ub2RlX21vZHVsZXMvQG9jdG9raXQvYXV0aC10b2tlbi9kaXN0LW5vZGUvaW5kZXguanMiLCAibm9kZV9tb2R1bGVzL0BhY3Rpb25zL2dpdGh1Yi9ub2RlX21vZHVsZXMvQG9jdG9raXQvY29yZS9kaXN0LW5vZGUvaW5kZXguanMiLCAibm9kZV9tb2R1bGVzL0BvY3Rva2l0L3BsdWdpbi1yZXN0LWVuZHBvaW50LW1ldGhvZHMvZGlzdC1ub2RlL2luZGV4LmpzIiwgIm5vZGVfbW9kdWxlcy9Ab2N0b2tpdC9wbHVnaW4tcGFnaW5hdGUtcmVzdC9kaXN0LW5vZGUvaW5kZXguanMiLCAibm9kZV9tb2R1bGVzL0BhY3Rpb25zL2dpdGh1Yi9saWIvdXRpbHMuanMiLCAibm9kZV9tb2R1bGVzL0BhY3Rpb25zL2dpdGh1Yi9saWIvZ2l0aHViLmpzIiwgIm5vZGVfbW9kdWxlcy9AYWN0aW9ucy9hcnRpZmFjdC9saWIvaW50ZXJuYWwvc2hhcmVkL2NvbmZpZy5qcyIsICJub2RlX21vZHVsZXMvQHByb3RvYnVmLXRzL3J1bnRpbWUvYnVpbGQvY29tbW9uanMvanNvbi10eXBpbmdzLmpzIiwgIm5vZGVfbW9kdWxlcy9AcHJvdG9idWYtdHMvcnVudGltZS9idWlsZC9jb21tb25qcy9iYXNlNjQuanMiLCAibm9kZV9tb2R1bGVzL0Bwcm90b2J1Zi10cy9ydW50aW1lL2J1aWxkL2NvbW1vbmpzL3Byb3RvYnVmanMtdXRmOC5qcyIsICJub2RlX21vZHVsZXMvQHByb3RvYnVmLXRzL3J1bnRpbWUvYnVpbGQvY29tbW9uanMvYmluYXJ5LWZvcm1hdC1jb250cmFjdC5qcyIsICJub2RlX21vZHVsZXMvQHByb3RvYnVmLXRzL3J1bnRpbWUvYnVpbGQvY29tbW9uanMvZ29vZy12YXJpbnQuanMiLCAibm9kZV9tb2R1bGVzL0Bwcm90b2J1Zi10cy9ydW50aW1lL2J1aWxkL2NvbW1vbmpzL3BiLWxvbmcuanMiLCAibm9kZV9tb2R1bGVzL0Bwcm90b2J1Zi10cy9ydW50aW1lL2J1aWxkL2NvbW1vbmpzL2JpbmFyeS1yZWFkZXIuanMiLCAibm9kZV9tb2R1bGVzL0Bwcm90b2J1Zi10cy9ydW50aW1lL2J1aWxkL2NvbW1vbmpzL2Fzc2VydC5qcyIsICJub2RlX21vZHVsZXMvQHByb3RvYnVmLXRzL3J1bnRpbWUvYnVpbGQvY29tbW9uanMvYmluYXJ5LXdyaXRlci5qcyIsICJub2RlX21vZHVsZXMvQHByb3RvYnVmLXRzL3J1bnRpbWUvYnVpbGQvY29tbW9uanMvanNvbi1mb3JtYXQtY29udHJhY3QuanMiLCAibm9kZV9tb2R1bGVzL0Bwcm90b2J1Zi10cy9ydW50aW1lL2J1aWxkL2NvbW1vbmpzL21lc3NhZ2UtdHlwZS1jb250cmFjdC5qcyIsICJub2RlX21vZHVsZXMvQHByb3RvYnVmLXRzL3J1bnRpbWUvYnVpbGQvY29tbW9uanMvbG93ZXItY2FtZWwtY2FzZS5qcyIsICJub2RlX21vZHVsZXMvQHByb3RvYnVmLXRzL3J1bnRpbWUvYnVpbGQvY29tbW9uanMvcmVmbGVjdGlvbi1pbmZvLmpzIiwgIm5vZGVfbW9kdWxlcy9AcHJvdG9idWYtdHMvcnVudGltZS9idWlsZC9jb21tb25qcy9vbmVvZi5qcyIsICJub2RlX21vZHVsZXMvQHByb3RvYnVmLXRzL3J1bnRpbWUvYnVpbGQvY29tbW9uanMvcmVmbGVjdGlvbi10eXBlLWNoZWNrLmpzIiwgIm5vZGVfbW9kdWxlcy9AcHJvdG9idWYtdHMvcnVudGltZS9idWlsZC9jb21tb25qcy9yZWZsZWN0aW9uLWxvbmctY29udmVydC5qcyIsICJub2RlX21vZHVsZXMvQHByb3RvYnVmLXRzL3J1bnRpbWUvYnVpbGQvY29tbW9uanMvcmVmbGVjdGlvbi1qc29uLXJlYWRlci5qcyIsICJub2RlX21vZHVsZXMvQHByb3RvYnVmLXRzL3J1bnRpbWUvYnVpbGQvY29tbW9uanMvcmVmbGVjdGlvbi1qc29uLXdyaXRlci5qcyIsICJub2RlX21vZHVsZXMvQHByb3RvYnVmLXRzL3J1bnRpbWUvYnVpbGQvY29tbW9uanMvcmVmbGVjdGlvbi1zY2FsYXItZGVmYXVsdC5qcyIsICJub2RlX21vZHVsZXMvQHByb3RvYnVmLXRzL3J1bnRpbWUvYnVpbGQvY29tbW9uanMvcmVmbGVjdGlvbi1iaW5hcnktcmVhZGVyLmpzIiwgIm5vZGVfbW9kdWxlcy9AcHJvdG9idWYtdHMvcnVudGltZS9idWlsZC9jb21tb25qcy9yZWZsZWN0aW9uLWJpbmFyeS13cml0ZXIuanMiLCAibm9kZV9tb2R1bGVzL0Bwcm90b2J1Zi10cy9ydW50aW1lL2J1aWxkL2NvbW1vbmpzL3JlZmxlY3Rpb24tY3JlYXRlLmpzIiwgIm5vZGVfbW9kdWxlcy9AcHJvdG9idWYtdHMvcnVudGltZS9idWlsZC9jb21tb25qcy9yZWZsZWN0aW9uLW1lcmdlLXBhcnRpYWwuanMiLCAibm9kZV9tb2R1bGVzL0Bwcm90b2J1Zi10cy9ydW50aW1lL2J1aWxkL2NvbW1vbmpzL3JlZmxlY3Rpb24tZXF1YWxzLmpzIiwgIm5vZGVfbW9kdWxlcy9AcHJvdG9idWYtdHMvcnVudGltZS9idWlsZC9jb21tb25qcy9tZXNzYWdlLXR5cGUuanMiLCAibm9kZV9tb2R1bGVzL0Bwcm90b2J1Zi10cy9ydW50aW1lL2J1aWxkL2NvbW1vbmpzL3JlZmxlY3Rpb24tY29udGFpbnMtbWVzc2FnZS10eXBlLmpzIiwgIm5vZGVfbW9kdWxlcy9AcHJvdG9idWYtdHMvcnVudGltZS9idWlsZC9jb21tb25qcy9lbnVtLW9iamVjdC5qcyIsICJub2RlX21vZHVsZXMvQHByb3RvYnVmLXRzL3J1bnRpbWUvYnVpbGQvY29tbW9uanMvaW5kZXguanMiLCAibm9kZV9tb2R1bGVzL0BhY3Rpb25zL2FydGlmYWN0L2xpYi9nZW5lcmF0ZWQvZ29vZ2xlL3Byb3RvYnVmL3RpbWVzdGFtcC5qcyIsICJub2RlX21vZHVsZXMvQGFjdGlvbnMvYXJ0aWZhY3QvbGliL2dlbmVyYXRlZC9nb29nbGUvcHJvdG9idWYvd3JhcHBlcnMuanMiLCAibm9kZV9tb2R1bGVzL0Bwcm90b2J1Zi10cy9ydW50aW1lLXJwYy9idWlsZC9jb21tb25qcy9yZWZsZWN0aW9uLWluZm8uanMiLCAibm9kZV9tb2R1bGVzL0Bwcm90b2J1Zi10cy9ydW50aW1lLXJwYy9idWlsZC9jb21tb25qcy9zZXJ2aWNlLXR5cGUuanMiLCAibm9kZV9tb2R1bGVzL0Bwcm90b2J1Zi10cy9ydW50aW1lLXJwYy9idWlsZC9jb21tb25qcy9ycGMtZXJyb3IuanMiLCAibm9kZV9tb2R1bGVzL0Bwcm90b2J1Zi10cy9ydW50aW1lLXJwYy9idWlsZC9jb21tb25qcy9ycGMtb3B0aW9ucy5qcyIsICJub2RlX21vZHVsZXMvQHByb3RvYnVmLXRzL3J1bnRpbWUtcnBjL2J1aWxkL2NvbW1vbmpzL2RlZmVycmVkLmpzIiwgIm5vZGVfbW9kdWxlcy9AcHJvdG9idWYtdHMvcnVudGltZS1ycGMvYnVpbGQvY29tbW9uanMvcnBjLW91dHB1dC1zdHJlYW0uanMiLCAibm9kZV9tb2R1bGVzL0Bwcm90b2J1Zi10cy9ydW50aW1lLXJwYy9idWlsZC9jb21tb25qcy91bmFyeS1jYWxsLmpzIiwgIm5vZGVfbW9kdWxlcy9AcHJvdG9idWYtdHMvcnVudGltZS1ycGMvYnVpbGQvY29tbW9uanMvc2VydmVyLXN0cmVhbWluZy1jYWxsLmpzIiwgIm5vZGVfbW9kdWxlcy9AcHJvdG9idWYtdHMvcnVudGltZS1ycGMvYnVpbGQvY29tbW9uanMvY2xpZW50LXN0cmVhbWluZy1jYWxsLmpzIiwgIm5vZGVfbW9kdWxlcy9AcHJvdG9idWYtdHMvcnVudGltZS1ycGMvYnVpbGQvY29tbW9uanMvZHVwbGV4LXN0cmVhbWluZy1jYWxsLmpzIiwgIm5vZGVfbW9kdWxlcy9AcHJvdG9idWYtdHMvcnVudGltZS1ycGMvYnVpbGQvY29tbW9uanMvdGVzdC10cmFuc3BvcnQuanMiLCAibm9kZV9tb2R1bGVzL0Bwcm90b2J1Zi10cy9ydW50aW1lLXJwYy9idWlsZC9jb21tb25qcy9ycGMtaW50ZXJjZXB0b3IuanMiLCAibm9kZV9tb2R1bGVzL0Bwcm90b2J1Zi10cy9ydW50aW1lLXJwYy9idWlsZC9jb21tb25qcy9zZXJ2ZXItY2FsbC1jb250ZXh0LmpzIiwgIm5vZGVfbW9kdWxlcy9AcHJvdG9idWYtdHMvcnVudGltZS1ycGMvYnVpbGQvY29tbW9uanMvaW5kZXguanMiLCAibm9kZV9tb2R1bGVzL0BhY3Rpb25zL2FydGlmYWN0L2xpYi9nZW5lcmF0ZWQvcmVzdWx0cy9hcGkvdjEvYXJ0aWZhY3QuanMiLCAibm9kZV9tb2R1bGVzL3R3aXJwLXRzL2J1aWxkL3R3aXJwL2NvbnRleHQuanMiLCAibm9kZV9tb2R1bGVzL3R3aXJwLXRzL2J1aWxkL3R3aXJwL2hvb2tzLmpzIiwgIm5vZGVfbW9kdWxlcy90d2lycC10cy9idWlsZC90d2lycC9lcnJvcnMuanMiLCAibm9kZV9tb2R1bGVzL3R3aXJwLXRzL2J1aWxkL3R3aXJwL3JlcXVlc3QuanMiLCAibm9kZV9tb2R1bGVzL3R3aXJwLXRzL2J1aWxkL3R3aXJwL3NlcnZlci5qcyIsICJub2RlX21vZHVsZXMvdHdpcnAtdHMvYnVpbGQvdHdpcnAvaW50ZXJjZXB0b3JzLmpzIiwgIm5vZGVfbW9kdWxlcy9kb3Qtb2JqZWN0L2luZGV4LmpzIiwgIm5vZGVfbW9kdWxlcy90d2lycC10cy9idWlsZC90d2lycC9odHRwLmNsaWVudC5qcyIsICJub2RlX21vZHVsZXMvdHdpcnAtdHMvYnVpbGQvdHdpcnAvZ2F0ZXdheS5qcyIsICJub2RlX21vZHVsZXMvdHdpcnAtdHMvYnVpbGQvdHdpcnAvaW5kZXguanMiLCAibm9kZV9tb2R1bGVzL0BhY3Rpb25zL2FydGlmYWN0L2xpYi9nZW5lcmF0ZWQvcmVzdWx0cy9hcGkvdjEvYXJ0aWZhY3QudHdpcnAuanMiLCAibm9kZV9tb2R1bGVzL0BhY3Rpb25zL2FydGlmYWN0L2xpYi9nZW5lcmF0ZWQvaW5kZXguanMiLCAibm9kZV9tb2R1bGVzL0BhY3Rpb25zL2FydGlmYWN0L2xpYi9pbnRlcm5hbC91cGxvYWQvcmV0ZW50aW9uLmpzIiwgIm5vZGVfbW9kdWxlcy9AYWN0aW9ucy9hcnRpZmFjdC9saWIvaW50ZXJuYWwvdXBsb2FkL3BhdGgtYW5kLWFydGlmYWN0LW5hbWUtdmFsaWRhdGlvbi5qcyIsICJub2RlX21vZHVsZXMvQGFjdGlvbnMvYXJ0aWZhY3QvbGliL2ludGVybmFsL3NoYXJlZC91c2VyLWFnZW50LmpzIiwgIm5vZGVfbW9kdWxlcy9AYWN0aW9ucy9hcnRpZmFjdC9saWIvaW50ZXJuYWwvc2hhcmVkL2Vycm9ycy5qcyIsICJub2RlX21vZHVsZXMvQGFjdGlvbnMvYXJ0aWZhY3QvbGliL2ludGVybmFsL3NoYXJlZC9hcnRpZmFjdC10d2lycC1jbGllbnQuanMiLCAibm9kZV9tb2R1bGVzL0BhY3Rpb25zL2FydGlmYWN0L2xpYi9pbnRlcm5hbC91cGxvYWQvdXBsb2FkLXppcC1zcGVjaWZpY2F0aW9uLmpzIiwgIm5vZGVfbW9kdWxlcy9qd3QtZGVjb2RlL2J1aWxkL2p3dC1kZWNvZGUuY2pzLmpzIiwgIm5vZGVfbW9kdWxlcy9AYWN0aW9ucy9hcnRpZmFjdC9saWIvaW50ZXJuYWwvc2hhcmVkL3V0aWwuanMiLCAibm9kZV9tb2R1bGVzL0BhenVyZS9jb3JlLXJlc3QtcGlwZWxpbmUvZGlzdC9jb21tb25qcy9waXBlbGluZS5qcyIsICJub2RlX21vZHVsZXMvdHNsaWIvdHNsaWIuanMiLCAibm9kZV9tb2R1bGVzL0BhenVyZS9sb2dnZXIvZGlzdC9jb21tb25qcy9sb2cuanMiLCAibm9kZV9tb2R1bGVzL0BhenVyZS9sb2dnZXIvZGlzdC9jb21tb25qcy9kZWJ1Zy5qcyIsICJub2RlX21vZHVsZXMvQGF6dXJlL2xvZ2dlci9kaXN0L2NvbW1vbmpzL2luZGV4LmpzIiwgIm5vZGVfbW9kdWxlcy9AYXp1cmUvY29yZS1yZXN0LXBpcGVsaW5lL2Rpc3QvY29tbW9uanMvbG9nLmpzIiwgIm5vZGVfbW9kdWxlcy9AYXp1cmUvYWJvcnQtY29udHJvbGxlci9kaXN0L2NvbW1vbmpzL0Fib3J0RXJyb3IuanMiLCAibm9kZV9tb2R1bGVzL0BhenVyZS9hYm9ydC1jb250cm9sbGVyL2Rpc3QvY29tbW9uanMvaW5kZXguanMiLCAibm9kZV9tb2R1bGVzL0BhenVyZS9jb3JlLXV0aWwvZGlzdC9jb21tb25qcy9jcmVhdGVBYm9ydGFibGVQcm9taXNlLmpzIiwgIm5vZGVfbW9kdWxlcy9AYXp1cmUvY29yZS11dGlsL2Rpc3QvY29tbW9uanMvcmFuZG9tLmpzIiwgIm5vZGVfbW9kdWxlcy9AYXp1cmUvY29yZS11dGlsL2Rpc3QvY29tbW9uanMvZGVsYXkuanMiLCAibm9kZV9tb2R1bGVzL0BhenVyZS9jb3JlLXV0aWwvZGlzdC9jb21tb25qcy9hYm9ydGVyVXRpbHMuanMiLCAibm9kZV9tb2R1bGVzL0BhenVyZS9jb3JlLXV0aWwvZGlzdC9jb21tb25qcy9vYmplY3QuanMiLCAibm9kZV9tb2R1bGVzL0BhenVyZS9jb3JlLXV0aWwvZGlzdC9jb21tb25qcy9lcnJvci5qcyIsICJub2RlX21vZHVsZXMvQGF6dXJlL2NvcmUtdXRpbC9kaXN0L2NvbW1vbmpzL3NoYTI1Ni5qcyIsICJub2RlX21vZHVsZXMvQGF6dXJlL2NvcmUtdXRpbC9kaXN0L2NvbW1vbmpzL3R5cGVHdWFyZHMuanMiLCAibm9kZV9tb2R1bGVzL0BhenVyZS9jb3JlLXV0aWwvZGlzdC9jb21tb25qcy91dWlkVXRpbHMuanMiLCAibm9kZV9tb2R1bGVzL0BhenVyZS9jb3JlLXV0aWwvZGlzdC9jb21tb25qcy9jaGVja0Vudmlyb25tZW50LmpzIiwgIm5vZGVfbW9kdWxlcy9AYXp1cmUvY29yZS11dGlsL2Rpc3QvY29tbW9uanMvYnl0ZXNFbmNvZGluZy5qcyIsICJub2RlX21vZHVsZXMvQGF6dXJlL2NvcmUtdXRpbC9kaXN0L2NvbW1vbmpzL2luZGV4LmpzIiwgIm5vZGVfbW9kdWxlcy9AYXp1cmUvY29yZS1yZXN0LXBpcGVsaW5lL2Rpc3QvY29tbW9uanMvdXRpbC9zYW5pdGl6ZXIuanMiLCAibm9kZV9tb2R1bGVzL0BhenVyZS9jb3JlLXJlc3QtcGlwZWxpbmUvZGlzdC9jb21tb25qcy9wb2xpY2llcy9sb2dQb2xpY3kuanMiLCAibm9kZV9tb2R1bGVzL0BhenVyZS9jb3JlLXJlc3QtcGlwZWxpbmUvZGlzdC9jb21tb25qcy9wb2xpY2llcy9yZWRpcmVjdFBvbGljeS5qcyIsICJub2RlX21vZHVsZXMvQGF6dXJlL2NvcmUtcmVzdC1waXBlbGluZS9kaXN0L2NvbW1vbmpzL3V0aWwvdXNlckFnZW50UGxhdGZvcm0uanMiLCAibm9kZV9tb2R1bGVzL0BhenVyZS9jb3JlLXJlc3QtcGlwZWxpbmUvZGlzdC9jb21tb25qcy9jb25zdGFudHMuanMiLCAibm9kZV9tb2R1bGVzL0BhenVyZS9jb3JlLXJlc3QtcGlwZWxpbmUvZGlzdC9jb21tb25qcy91dGlsL3VzZXJBZ2VudC5qcyIsICJub2RlX21vZHVsZXMvQGF6dXJlL2NvcmUtcmVzdC1waXBlbGluZS9kaXN0L2NvbW1vbmpzL3BvbGljaWVzL3VzZXJBZ2VudFBvbGljeS5qcyIsICJub2RlX21vZHVsZXMvQGF6dXJlL2NvcmUtcmVzdC1waXBlbGluZS9kaXN0L2NvbW1vbmpzL3V0aWwvdHlwZUd1YXJkcy5qcyIsICJub2RlX21vZHVsZXMvQGF6dXJlL2NvcmUtcmVzdC1waXBlbGluZS9kaXN0L2NvbW1vbmpzL3V0aWwvZmlsZS5qcyIsICJub2RlX21vZHVsZXMvQGF6dXJlL2NvcmUtcmVzdC1waXBlbGluZS9kaXN0L2NvbW1vbmpzL3V0aWwvY29uY2F0LmpzIiwgIm5vZGVfbW9kdWxlcy9AYXp1cmUvY29yZS1yZXN0LXBpcGVsaW5lL2Rpc3QvY29tbW9uanMvcG9saWNpZXMvbXVsdGlwYXJ0UG9saWN5LmpzIiwgIm5vZGVfbW9kdWxlcy9AYXp1cmUvY29yZS1yZXN0LXBpcGVsaW5lL2Rpc3QvY29tbW9uanMvcG9saWNpZXMvZGVjb21wcmVzc1Jlc3BvbnNlUG9saWN5LmpzIiwgIm5vZGVfbW9kdWxlcy9AYXp1cmUvY29yZS1yZXN0LXBpcGVsaW5lL2Rpc3QvY29tbW9uanMvdXRpbC9oZWxwZXJzLmpzIiwgIm5vZGVfbW9kdWxlcy9AYXp1cmUvY29yZS1yZXN0LXBpcGVsaW5lL2Rpc3QvY29tbW9uanMvcmV0cnlTdHJhdGVnaWVzL3Rocm90dGxpbmdSZXRyeVN0cmF0ZWd5LmpzIiwgIm5vZGVfbW9kdWxlcy9AYXp1cmUvY29yZS1yZXN0LXBpcGVsaW5lL2Rpc3QvY29tbW9uanMvcmV0cnlTdHJhdGVnaWVzL2V4cG9uZW50aWFsUmV0cnlTdHJhdGVneS5qcyIsICJub2RlX21vZHVsZXMvQGF6dXJlL2NvcmUtcmVzdC1waXBlbGluZS9kaXN0L2NvbW1vbmpzL3BvbGljaWVzL3JldHJ5UG9saWN5LmpzIiwgIm5vZGVfbW9kdWxlcy9AYXp1cmUvY29yZS1yZXN0LXBpcGVsaW5lL2Rpc3QvY29tbW9uanMvcG9saWNpZXMvZGVmYXVsdFJldHJ5UG9saWN5LmpzIiwgIm5vZGVfbW9kdWxlcy9AYXp1cmUvY29yZS1yZXN0LXBpcGVsaW5lL2Rpc3QvY29tbW9uanMvaHR0cEhlYWRlcnMuanMiLCAibm9kZV9tb2R1bGVzL0BhenVyZS9jb3JlLXJlc3QtcGlwZWxpbmUvZGlzdC9jb21tb25qcy9wb2xpY2llcy9mb3JtRGF0YVBvbGljeS5qcyIsICJub2RlX21vZHVsZXMvbXMvaW5kZXguanMiLCAibm9kZV9tb2R1bGVzL2RlYnVnL3NyYy9jb21tb24uanMiLCAibm9kZV9tb2R1bGVzL2RlYnVnL3NyYy9icm93c2VyLmpzIiwgIm5vZGVfbW9kdWxlcy9kZWJ1Zy9zcmMvbm9kZS5qcyIsICJub2RlX21vZHVsZXMvZGVidWcvc3JjL2luZGV4LmpzIiwgIm5vZGVfbW9kdWxlcy9hZ2VudC1iYXNlL2Rpc3QvaGVscGVycy5qcyIsICJub2RlX21vZHVsZXMvYWdlbnQtYmFzZS9kaXN0L2luZGV4LmpzIiwgIm5vZGVfbW9kdWxlcy9odHRwcy1wcm94eS1hZ2VudC9kaXN0L3BhcnNlLXByb3h5LXJlc3BvbnNlLmpzIiwgIm5vZGVfbW9kdWxlcy9odHRwcy1wcm94eS1hZ2VudC9kaXN0L2luZGV4LmpzIiwgIm5vZGVfbW9kdWxlcy9odHRwLXByb3h5LWFnZW50L2Rpc3QvaW5kZXguanMiLCAibm9kZV9tb2R1bGVzL0BhenVyZS9jb3JlLXJlc3QtcGlwZWxpbmUvZGlzdC9jb21tb25qcy9wb2xpY2llcy9wcm94eVBvbGljeS5qcyIsICJub2RlX21vZHVsZXMvQGF6dXJlL2NvcmUtcmVzdC1waXBlbGluZS9kaXN0L2NvbW1vbmpzL3BvbGljaWVzL3NldENsaWVudFJlcXVlc3RJZFBvbGljeS5qcyIsICJub2RlX21vZHVsZXMvQGF6dXJlL2NvcmUtcmVzdC1waXBlbGluZS9kaXN0L2NvbW1vbmpzL3BvbGljaWVzL3Rsc1BvbGljeS5qcyIsICJub2RlX21vZHVsZXMvQGF6dXJlL2NvcmUtdHJhY2luZy9kaXN0L2NvbW1vbmpzL3RyYWNpbmdDb250ZXh0LmpzIiwgIm5vZGVfbW9kdWxlcy9AYXp1cmUvY29yZS10cmFjaW5nL2Rpc3QvY29tbW9uanMvc3RhdGUuanMiLCAibm9kZV9tb2R1bGVzL0BhenVyZS9jb3JlLXRyYWNpbmcvZGlzdC9jb21tb25qcy9pbnN0cnVtZW50ZXIuanMiLCAibm9kZV9tb2R1bGVzL0BhenVyZS9jb3JlLXRyYWNpbmcvZGlzdC9jb21tb25qcy90cmFjaW5nQ2xpZW50LmpzIiwgIm5vZGVfbW9kdWxlcy9AYXp1cmUvY29yZS10cmFjaW5nL2Rpc3QvY29tbW9uanMvaW5kZXguanMiLCAibm9kZV9tb2R1bGVzL0BhenVyZS9jb3JlLXJlc3QtcGlwZWxpbmUvZGlzdC9jb21tb25qcy91dGlsL2luc3BlY3QuanMiLCAibm9kZV9tb2R1bGVzL0BhenVyZS9jb3JlLXJlc3QtcGlwZWxpbmUvZGlzdC9jb21tb25qcy9yZXN0RXJyb3IuanMiLCAibm9kZV9tb2R1bGVzL0BhenVyZS9jb3JlLXJlc3QtcGlwZWxpbmUvZGlzdC9jb21tb25qcy9wb2xpY2llcy90cmFjaW5nUG9saWN5LmpzIiwgIm5vZGVfbW9kdWxlcy9AYXp1cmUvY29yZS1yZXN0LXBpcGVsaW5lL2Rpc3QvY29tbW9uanMvY3JlYXRlUGlwZWxpbmVGcm9tT3B0aW9ucy5qcyIsICJub2RlX21vZHVsZXMvQGF6dXJlL2NvcmUtcmVzdC1waXBlbGluZS9kaXN0L2NvbW1vbmpzL25vZGVIdHRwQ2xpZW50LmpzIiwgIm5vZGVfbW9kdWxlcy9AYXp1cmUvY29yZS1yZXN0LXBpcGVsaW5lL2Rpc3QvY29tbW9uanMvZGVmYXVsdEh0dHBDbGllbnQuanMiLCAibm9kZV9tb2R1bGVzL0BhenVyZS9jb3JlLXJlc3QtcGlwZWxpbmUvZGlzdC9jb21tb25qcy9waXBlbGluZVJlcXVlc3QuanMiLCAibm9kZV9tb2R1bGVzL0BhenVyZS9jb3JlLXJlc3QtcGlwZWxpbmUvZGlzdC9jb21tb25qcy9wb2xpY2llcy9leHBvbmVudGlhbFJldHJ5UG9saWN5LmpzIiwgIm5vZGVfbW9kdWxlcy9AYXp1cmUvY29yZS1yZXN0LXBpcGVsaW5lL2Rpc3QvY29tbW9uanMvcG9saWNpZXMvc3lzdGVtRXJyb3JSZXRyeVBvbGljeS5qcyIsICJub2RlX21vZHVsZXMvQGF6dXJlL2NvcmUtcmVzdC1waXBlbGluZS9kaXN0L2NvbW1vbmpzL3BvbGljaWVzL3Rocm90dGxpbmdSZXRyeVBvbGljeS5qcyIsICJub2RlX21vZHVsZXMvQGF6dXJlL2NvcmUtcmVzdC1waXBlbGluZS9kaXN0L2NvbW1vbmpzL3V0aWwvdG9rZW5DeWNsZXIuanMiLCAibm9kZV9tb2R1bGVzL0BhenVyZS9jb3JlLXJlc3QtcGlwZWxpbmUvZGlzdC9jb21tb25qcy9wb2xpY2llcy9iZWFyZXJUb2tlbkF1dGhlbnRpY2F0aW9uUG9saWN5LmpzIiwgIm5vZGVfbW9kdWxlcy9AYXp1cmUvY29yZS1yZXN0LXBpcGVsaW5lL2Rpc3QvY29tbW9uanMvcG9saWNpZXMvbmRKc29uUG9saWN5LmpzIiwgIm5vZGVfbW9kdWxlcy9AYXp1cmUvY29yZS1yZXN0LXBpcGVsaW5lL2Rpc3QvY29tbW9uanMvcG9saWNpZXMvYXV4aWxpYXJ5QXV0aGVudGljYXRpb25IZWFkZXJQb2xpY3kuanMiLCAibm9kZV9tb2R1bGVzL0BhenVyZS9jb3JlLXJlc3QtcGlwZWxpbmUvZGlzdC9jb21tb25qcy9pbmRleC5qcyIsICJub2RlX21vZHVsZXMvQGF6dXJlL2NvcmUtYXV0aC9kaXN0L2NvbW1vbmpzL2F6dXJlS2V5Q3JlZGVudGlhbC5qcyIsICJub2RlX21vZHVsZXMvQGF6dXJlL2NvcmUtYXV0aC9kaXN0L2NvbW1vbmpzL2tleUNyZWRlbnRpYWwuanMiLCAibm9kZV9tb2R1bGVzL0BhenVyZS9jb3JlLWF1dGgvZGlzdC9jb21tb25qcy9henVyZU5hbWVkS2V5Q3JlZGVudGlhbC5qcyIsICJub2RlX21vZHVsZXMvQGF6dXJlL2NvcmUtYXV0aC9kaXN0L2NvbW1vbmpzL2F6dXJlU0FTQ3JlZGVudGlhbC5qcyIsICJub2RlX21vZHVsZXMvQGF6dXJlL2NvcmUtYXV0aC9kaXN0L2NvbW1vbmpzL3Rva2VuQ3JlZGVudGlhbC5qcyIsICJub2RlX21vZHVsZXMvQGF6dXJlL2NvcmUtYXV0aC9kaXN0L2NvbW1vbmpzL2luZGV4LmpzIiwgIm5vZGVfbW9kdWxlcy9AYXp1cmUvY29yZS1odHRwLWNvbXBhdC9kaXN0L2NvbW1vbmpzL3BvbGljaWVzL2Rpc2FibGVLZWVwQWxpdmVQb2xpY3kuanMiLCAibm9kZV9tb2R1bGVzL0BhenVyZS9jb3JlLWNsaWVudC9kaXN0L2NvbW1vbmpzL2Jhc2U2NC5qcyIsICJub2RlX21vZHVsZXMvQGF6dXJlL2NvcmUtY2xpZW50L2Rpc3QvY29tbW9uanMvaW50ZXJmYWNlcy5qcyIsICJub2RlX21vZHVsZXMvQGF6dXJlL2NvcmUtY2xpZW50L2Rpc3QvY29tbW9uanMvdXRpbHMuanMiLCAibm9kZV9tb2R1bGVzL0BhenVyZS9jb3JlLWNsaWVudC9kaXN0L2NvbW1vbmpzL3NlcmlhbGl6ZXIuanMiLCAibm9kZV9tb2R1bGVzL0BhenVyZS9jb3JlLWNsaWVudC9kaXN0L2NvbW1vbmpzL3N0YXRlLmpzIiwgIm5vZGVfbW9kdWxlcy9AYXp1cmUvY29yZS1jbGllbnQvZGlzdC9jb21tb25qcy9vcGVyYXRpb25IZWxwZXJzLmpzIiwgIm5vZGVfbW9kdWxlcy9AYXp1cmUvY29yZS1jbGllbnQvZGlzdC9jb21tb25qcy9kZXNlcmlhbGl6YXRpb25Qb2xpY3kuanMiLCAibm9kZV9tb2R1bGVzL0BhenVyZS9jb3JlLWNsaWVudC9kaXN0L2NvbW1vbmpzL2ludGVyZmFjZUhlbHBlcnMuanMiLCAibm9kZV9tb2R1bGVzL0BhenVyZS9jb3JlLWNsaWVudC9kaXN0L2NvbW1vbmpzL3NlcmlhbGl6YXRpb25Qb2xpY3kuanMiLCAibm9kZV9tb2R1bGVzL0BhenVyZS9jb3JlLWNsaWVudC9kaXN0L2NvbW1vbmpzL3BpcGVsaW5lLmpzIiwgIm5vZGVfbW9kdWxlcy9AYXp1cmUvY29yZS1jbGllbnQvZGlzdC9jb21tb25qcy9odHRwQ2xpZW50Q2FjaGUuanMiLCAibm9kZV9tb2R1bGVzL0BhenVyZS9jb3JlLWNsaWVudC9kaXN0L2NvbW1vbmpzL3VybEhlbHBlcnMuanMiLCAibm9kZV9tb2R1bGVzL0BhenVyZS9jb3JlLWNsaWVudC9kaXN0L2NvbW1vbmpzL2xvZy5qcyIsICJub2RlX21vZHVsZXMvQGF6dXJlL2NvcmUtY2xpZW50L2Rpc3QvY29tbW9uanMvc2VydmljZUNsaWVudC5qcyIsICJub2RlX21vZHVsZXMvQGF6dXJlL2NvcmUtY2xpZW50L2Rpc3QvY29tbW9uanMvYXV0aG9yaXplUmVxdWVzdE9uQ2xhaW1DaGFsbGVuZ2UuanMiLCAibm9kZV9tb2R1bGVzL0BhenVyZS9jb3JlLWNsaWVudC9kaXN0L2NvbW1vbmpzL2F1dGhvcml6ZVJlcXVlc3RPblRlbmFudENoYWxsZW5nZS5qcyIsICJub2RlX21vZHVsZXMvQGF6dXJlL2NvcmUtY2xpZW50L2Rpc3QvY29tbW9uanMvaW5kZXguanMiLCAibm9kZV9tb2R1bGVzL0BhenVyZS9jb3JlLWh0dHAtY29tcGF0L2Rpc3QvY29tbW9uanMvdXRpbC5qcyIsICJub2RlX21vZHVsZXMvQGF6dXJlL2NvcmUtaHR0cC1jb21wYXQvZGlzdC9jb21tb25qcy9yZXNwb25zZS5qcyIsICJub2RlX21vZHVsZXMvQGF6dXJlL2NvcmUtaHR0cC1jb21wYXQvZGlzdC9jb21tb25qcy9leHRlbmRlZENsaWVudC5qcyIsICJub2RlX21vZHVsZXMvQGF6dXJlL2NvcmUtaHR0cC1jb21wYXQvZGlzdC9jb21tb25qcy9wb2xpY2llcy9yZXF1ZXN0UG9saWN5RmFjdG9yeVBvbGljeS5qcyIsICJub2RlX21vZHVsZXMvQGF6dXJlL2NvcmUtaHR0cC1jb21wYXQvZGlzdC9jb21tb25qcy9odHRwQ2xpZW50QWRhcHRlci5qcyIsICJub2RlX21vZHVsZXMvQGF6dXJlL2NvcmUtaHR0cC1jb21wYXQvZGlzdC9jb21tb25qcy9pbmRleC5qcyIsICJub2RlX21vZHVsZXMvZmFzdC14bWwtcGFyc2VyL3NyYy91dGlsLmpzIiwgIm5vZGVfbW9kdWxlcy9mYXN0LXhtbC1wYXJzZXIvc3JjL3ZhbGlkYXRvci5qcyIsICJub2RlX21vZHVsZXMvZmFzdC14bWwtcGFyc2VyL3NyYy94bWxwYXJzZXIvT3B0aW9uc0J1aWxkZXIuanMiLCAibm9kZV9tb2R1bGVzL2Zhc3QteG1sLXBhcnNlci9zcmMveG1scGFyc2VyL3htbE5vZGUuanMiLCAibm9kZV9tb2R1bGVzL2Zhc3QteG1sLXBhcnNlci9zcmMveG1scGFyc2VyL0RvY1R5cGVSZWFkZXIuanMiLCAibm9kZV9tb2R1bGVzL3N0cm51bS9zdHJudW0uanMiLCAibm9kZV9tb2R1bGVzL2Zhc3QteG1sLXBhcnNlci9zcmMvaWdub3JlQXR0cmlidXRlcy5qcyIsICJub2RlX21vZHVsZXMvZmFzdC14bWwtcGFyc2VyL3NyYy94bWxwYXJzZXIvT3JkZXJlZE9ialBhcnNlci5qcyIsICJub2RlX21vZHVsZXMvZmFzdC14bWwtcGFyc2VyL3NyYy94bWxwYXJzZXIvbm9kZTJqc29uLmpzIiwgIm5vZGVfbW9kdWxlcy9mYXN0LXhtbC1wYXJzZXIvc3JjL3htbHBhcnNlci9YTUxQYXJzZXIuanMiLCAibm9kZV9tb2R1bGVzL2Zhc3QteG1sLXBhcnNlci9zcmMveG1sYnVpbGRlci9vcmRlcmVkSnMyWG1sLmpzIiwgIm5vZGVfbW9kdWxlcy9mYXN0LXhtbC1wYXJzZXIvc3JjL3htbGJ1aWxkZXIvanNvbjJ4bWwuanMiLCAibm9kZV9tb2R1bGVzL2Zhc3QteG1sLXBhcnNlci9zcmMvZnhwLmpzIiwgIm5vZGVfbW9kdWxlcy9AYXp1cmUvY29yZS14bWwvZGlzdC9jb21tb25qcy94bWwuY29tbW9uLmpzIiwgIm5vZGVfbW9kdWxlcy9AYXp1cmUvY29yZS14bWwvZGlzdC9jb21tb25qcy94bWwuanMiLCAibm9kZV9tb2R1bGVzL0BhenVyZS9jb3JlLXhtbC9kaXN0L2NvbW1vbmpzL2luZGV4LmpzIiwgIm5vZGVfbW9kdWxlcy9AYXp1cmUvY29yZS1scm8vZGlzdC9jb21tb25qcy9sb2dnZXIuanMiLCAibm9kZV9tb2R1bGVzL0BhenVyZS9jb3JlLWxyby9kaXN0L2NvbW1vbmpzL3BvbGxlci9jb25zdGFudHMuanMiLCAibm9kZV9tb2R1bGVzL0BhenVyZS9jb3JlLWxyby9kaXN0L2NvbW1vbmpzL3BvbGxlci9vcGVyYXRpb24uanMiLCAibm9kZV9tb2R1bGVzL0BhenVyZS9jb3JlLWxyby9kaXN0L2NvbW1vbmpzL2h0dHAvb3BlcmF0aW9uLmpzIiwgIm5vZGVfbW9kdWxlcy9AYXp1cmUvY29yZS1scm8vZGlzdC9jb21tb25qcy9wb2xsZXIvcG9sbGVyLmpzIiwgIm5vZGVfbW9kdWxlcy9AYXp1cmUvY29yZS1scm8vZGlzdC9jb21tb25qcy9odHRwL3BvbGxlci5qcyIsICJub2RlX21vZHVsZXMvQGF6dXJlL2NvcmUtbHJvL2Rpc3QvY29tbW9uanMvbGVnYWN5L2xyb0VuZ2luZS9vcGVyYXRpb24uanMiLCAibm9kZV9tb2R1bGVzL0BhenVyZS9jb3JlLWxyby9kaXN0L2NvbW1vbmpzL2xlZ2FjeS9wb2xsZXIuanMiLCAibm9kZV9tb2R1bGVzL0BhenVyZS9jb3JlLWxyby9kaXN0L2NvbW1vbmpzL2xlZ2FjeS9scm9FbmdpbmUvbHJvRW5naW5lLmpzIiwgIm5vZGVfbW9kdWxlcy9AYXp1cmUvY29yZS1scm8vZGlzdC9jb21tb25qcy9sZWdhY3kvbHJvRW5naW5lL2luZGV4LmpzIiwgIm5vZGVfbW9kdWxlcy9AYXp1cmUvY29yZS1scm8vZGlzdC9jb21tb25qcy9sZWdhY3kvcG9sbE9wZXJhdGlvbi5qcyIsICJub2RlX21vZHVsZXMvQGF6dXJlL2NvcmUtbHJvL2Rpc3QvY29tbW9uanMvaW5kZXguanMiLCAibm9kZV9tb2R1bGVzL0BhenVyZS9zdG9yYWdlLWJsb2IvZGlzdC9pbmRleC5qcyIsICJub2RlX21vZHVsZXMvQGFjdGlvbnMvYXJ0aWZhY3QvbGliL2ludGVybmFsL3VwbG9hZC9ibG9iLXVwbG9hZC5qcyIsICJub2RlX21vZHVsZXMvbWluaW1hdGNoL2xpYi9wYXRoLmpzIiwgIm5vZGVfbW9kdWxlcy9iYWxhbmNlZC1tYXRjaC9pbmRleC5qcyIsICJub2RlX21vZHVsZXMvYnJhY2UtZXhwYW5zaW9uL2luZGV4LmpzIiwgIm5vZGVfbW9kdWxlcy9taW5pbWF0Y2gvbWluaW1hdGNoLmpzIiwgIm5vZGVfbW9kdWxlcy9yZWFkZGlyLWdsb2IvaW5kZXguanMiLCAibm9kZV9tb2R1bGVzL2FzeW5jL2Rpc3QvYXN5bmMuanMiLCAibm9kZV9tb2R1bGVzL2dyYWNlZnVsLWZzL3BvbHlmaWxscy5qcyIsICJub2RlX21vZHVsZXMvZ3JhY2VmdWwtZnMvbGVnYWN5LXN0cmVhbXMuanMiLCAibm9kZV9tb2R1bGVzL2dyYWNlZnVsLWZzL2Nsb25lLmpzIiwgIm5vZGVfbW9kdWxlcy9ncmFjZWZ1bC1mcy9ncmFjZWZ1bC1mcy5qcyIsICJub2RlX21vZHVsZXMvaXMtc3RyZWFtL2luZGV4LmpzIiwgIm5vZGVfbW9kdWxlcy9wcm9jZXNzLW5leHRpY2stYXJncy9pbmRleC5qcyIsICJub2RlX21vZHVsZXMvaXNhcnJheS9pbmRleC5qcyIsICJub2RlX21vZHVsZXMvbGF6eXN0cmVhbS9ub2RlX21vZHVsZXMvcmVhZGFibGUtc3RyZWFtL2xpYi9pbnRlcm5hbC9zdHJlYW1zL3N0cmVhbS5qcyIsICJub2RlX21vZHVsZXMvbGF6eXN0cmVhbS9ub2RlX21vZHVsZXMvcmVhZGFibGUtc3RyZWFtL25vZGVfbW9kdWxlcy9zYWZlLWJ1ZmZlci9pbmRleC5qcyIsICJub2RlX21vZHVsZXMvY29yZS11dGlsLWlzL2xpYi91dGlsLmpzIiwgIm5vZGVfbW9kdWxlcy9pbmhlcml0cy9pbmhlcml0c19icm93c2VyLmpzIiwgIm5vZGVfbW9kdWxlcy9pbmhlcml0cy9pbmhlcml0cy5qcyIsICJub2RlX21vZHVsZXMvbGF6eXN0cmVhbS9ub2RlX21vZHVsZXMvcmVhZGFibGUtc3RyZWFtL2xpYi9pbnRlcm5hbC9zdHJlYW1zL0J1ZmZlckxpc3QuanMiLCAibm9kZV9tb2R1bGVzL2xhenlzdHJlYW0vbm9kZV9tb2R1bGVzL3JlYWRhYmxlLXN0cmVhbS9saWIvaW50ZXJuYWwvc3RyZWFtcy9kZXN0cm95LmpzIiwgIm5vZGVfbW9kdWxlcy91dGlsLWRlcHJlY2F0ZS9ub2RlLmpzIiwgIm5vZGVfbW9kdWxlcy9sYXp5c3RyZWFtL25vZGVfbW9kdWxlcy9yZWFkYWJsZS1zdHJlYW0vbGliL19zdHJlYW1fd3JpdGFibGUuanMiLCAibm9kZV9tb2R1bGVzL2xhenlzdHJlYW0vbm9kZV9tb2R1bGVzL3JlYWRhYmxlLXN0cmVhbS9saWIvX3N0cmVhbV9kdXBsZXguanMiLCAibm9kZV9tb2R1bGVzL2xhenlzdHJlYW0vbm9kZV9tb2R1bGVzL3JlYWRhYmxlLXN0cmVhbS9ub2RlX21vZHVsZXMvc3RyaW5nX2RlY29kZXIvbGliL3N0cmluZ19kZWNvZGVyLmpzIiwgIm5vZGVfbW9kdWxlcy9sYXp5c3RyZWFtL25vZGVfbW9kdWxlcy9yZWFkYWJsZS1zdHJlYW0vbGliL19zdHJlYW1fcmVhZGFibGUuanMiLCAibm9kZV9tb2R1bGVzL2xhenlzdHJlYW0vbm9kZV9tb2R1bGVzL3JlYWRhYmxlLXN0cmVhbS9saWIvX3N0cmVhbV90cmFuc2Zvcm0uanMiLCAibm9kZV9tb2R1bGVzL2xhenlzdHJlYW0vbm9kZV9tb2R1bGVzL3JlYWRhYmxlLXN0cmVhbS9saWIvX3N0cmVhbV9wYXNzdGhyb3VnaC5qcyIsICJub2RlX21vZHVsZXMvbGF6eXN0cmVhbS9ub2RlX21vZHVsZXMvcmVhZGFibGUtc3RyZWFtL3JlYWRhYmxlLmpzIiwgIm5vZGVfbW9kdWxlcy9sYXp5c3RyZWFtL25vZGVfbW9kdWxlcy9yZWFkYWJsZS1zdHJlYW0vcGFzc3Rocm91Z2guanMiLCAibm9kZV9tb2R1bGVzL2xhenlzdHJlYW0vbGliL2xhenlzdHJlYW0uanMiLCAibm9kZV9tb2R1bGVzL25vcm1hbGl6ZS1wYXRoL2luZGV4LmpzIiwgIm5vZGVfbW9kdWxlcy9sb2Rhc2gvaWRlbnRpdHkuanMiLCAibm9kZV9tb2R1bGVzL2xvZGFzaC9fYXBwbHkuanMiLCAibm9kZV9tb2R1bGVzL2xvZGFzaC9fb3ZlclJlc3QuanMiLCAibm9kZV9tb2R1bGVzL2xvZGFzaC9jb25zdGFudC5qcyIsICJub2RlX21vZHVsZXMvbG9kYXNoL19mcmVlR2xvYmFsLmpzIiwgIm5vZGVfbW9kdWxlcy9sb2Rhc2gvX3Jvb3QuanMiLCAibm9kZV9tb2R1bGVzL2xvZGFzaC9fU3ltYm9sLmpzIiwgIm5vZGVfbW9kdWxlcy9sb2Rhc2gvX2dldFJhd1RhZy5qcyIsICJub2RlX21vZHVsZXMvbG9kYXNoL19vYmplY3RUb1N0cmluZy5qcyIsICJub2RlX21vZHVsZXMvbG9kYXNoL19iYXNlR2V0VGFnLmpzIiwgIm5vZGVfbW9kdWxlcy9sb2Rhc2gvaXNPYmplY3QuanMiLCAibm9kZV9tb2R1bGVzL2xvZGFzaC9pc0Z1bmN0aW9uLmpzIiwgIm5vZGVfbW9kdWxlcy9sb2Rhc2gvX2NvcmVKc0RhdGEuanMiLCAibm9kZV9tb2R1bGVzL2xvZGFzaC9faXNNYXNrZWQuanMiLCAibm9kZV9tb2R1bGVzL2xvZGFzaC9fdG9Tb3VyY2UuanMiLCAibm9kZV9tb2R1bGVzL2xvZGFzaC9fYmFzZUlzTmF0aXZlLmpzIiwgIm5vZGVfbW9kdWxlcy9sb2Rhc2gvX2dldFZhbHVlLmpzIiwgIm5vZGVfbW9kdWxlcy9sb2Rhc2gvX2dldE5hdGl2ZS5qcyIsICJub2RlX21vZHVsZXMvbG9kYXNoL19kZWZpbmVQcm9wZXJ0eS5qcyIsICJub2RlX21vZHVsZXMvbG9kYXNoL19iYXNlU2V0VG9TdHJpbmcuanMiLCAibm9kZV9tb2R1bGVzL2xvZGFzaC9fc2hvcnRPdXQuanMiLCAibm9kZV9tb2R1bGVzL2xvZGFzaC9fc2V0VG9TdHJpbmcuanMiLCAibm9kZV9tb2R1bGVzL2xvZGFzaC9fYmFzZVJlc3QuanMiLCAibm9kZV9tb2R1bGVzL2xvZGFzaC9lcS5qcyIsICJub2RlX21vZHVsZXMvbG9kYXNoL2lzTGVuZ3RoLmpzIiwgIm5vZGVfbW9kdWxlcy9sb2Rhc2gvaXNBcnJheUxpa2UuanMiLCAibm9kZV9tb2R1bGVzL2xvZGFzaC9faXNJbmRleC5qcyIsICJub2RlX21vZHVsZXMvbG9kYXNoL19pc0l0ZXJhdGVlQ2FsbC5qcyIsICJub2RlX21vZHVsZXMvbG9kYXNoL19iYXNlVGltZXMuanMiLCAibm9kZV9tb2R1bGVzL2xvZGFzaC9pc09iamVjdExpa2UuanMiLCAibm9kZV9tb2R1bGVzL2xvZGFzaC9fYmFzZUlzQXJndW1lbnRzLmpzIiwgIm5vZGVfbW9kdWxlcy9sb2Rhc2gvaXNBcmd1bWVudHMuanMiLCAibm9kZV9tb2R1bGVzL2xvZGFzaC9pc0FycmF5LmpzIiwgIm5vZGVfbW9kdWxlcy9sb2Rhc2gvc3R1YkZhbHNlLmpzIiwgIm5vZGVfbW9kdWxlcy9sb2Rhc2gvaXNCdWZmZXIuanMiLCAibm9kZV9tb2R1bGVzL2xvZGFzaC9fYmFzZUlzVHlwZWRBcnJheS5qcyIsICJub2RlX21vZHVsZXMvbG9kYXNoL19iYXNlVW5hcnkuanMiLCAibm9kZV9tb2R1bGVzL2xvZGFzaC9fbm9kZVV0aWwuanMiLCAibm9kZV9tb2R1bGVzL2xvZGFzaC9pc1R5cGVkQXJyYXkuanMiLCAibm9kZV9tb2R1bGVzL2xvZGFzaC9fYXJyYXlMaWtlS2V5cy5qcyIsICJub2RlX21vZHVsZXMvbG9kYXNoL19pc1Byb3RvdHlwZS5qcyIsICJub2RlX21vZHVsZXMvbG9kYXNoL19uYXRpdmVLZXlzSW4uanMiLCAibm9kZV9tb2R1bGVzL2xvZGFzaC9fYmFzZUtleXNJbi5qcyIsICJub2RlX21vZHVsZXMvbG9kYXNoL2tleXNJbi5qcyIsICJub2RlX21vZHVsZXMvbG9kYXNoL2RlZmF1bHRzLmpzIiwgIm5vZGVfbW9kdWxlcy9yZWFkYWJsZS1zdHJlYW0vbGliL291cnMvcHJpbW9yZGlhbHMuanMiLCAibm9kZV9tb2R1bGVzL2V2ZW50LXRhcmdldC1zaGltL2Rpc3QvZXZlbnQtdGFyZ2V0LXNoaW0uanMiLCAibm9kZV9tb2R1bGVzL2Fib3J0LWNvbnRyb2xsZXIvZGlzdC9hYm9ydC1jb250cm9sbGVyLmpzIiwgIm5vZGVfbW9kdWxlcy9yZWFkYWJsZS1zdHJlYW0vbGliL291cnMvdXRpbC5qcyIsICJub2RlX21vZHVsZXMvcmVhZGFibGUtc3RyZWFtL2xpYi9vdXJzL2Vycm9ycy5qcyIsICJub2RlX21vZHVsZXMvcmVhZGFibGUtc3RyZWFtL2xpYi9pbnRlcm5hbC92YWxpZGF0b3JzLmpzIiwgIm5vZGVfbW9kdWxlcy9wcm9jZXNzL2luZGV4LmpzIiwgIm5vZGVfbW9kdWxlcy9yZWFkYWJsZS1zdHJlYW0vbGliL2ludGVybmFsL3N0cmVhbXMvdXRpbHMuanMiLCAibm9kZV9tb2R1bGVzL3JlYWRhYmxlLXN0cmVhbS9saWIvaW50ZXJuYWwvc3RyZWFtcy9lbmQtb2Ytc3RyZWFtLmpzIiwgIm5vZGVfbW9kdWxlcy9yZWFkYWJsZS1zdHJlYW0vbGliL2ludGVybmFsL3N0cmVhbXMvZGVzdHJveS5qcyIsICJub2RlX21vZHVsZXMvcmVhZGFibGUtc3RyZWFtL2xpYi9pbnRlcm5hbC9zdHJlYW1zL2xlZ2FjeS5qcyIsICJub2RlX21vZHVsZXMvcmVhZGFibGUtc3RyZWFtL2xpYi9pbnRlcm5hbC9zdHJlYW1zL2FkZC1hYm9ydC1zaWduYWwuanMiLCAibm9kZV9tb2R1bGVzL3JlYWRhYmxlLXN0cmVhbS9saWIvaW50ZXJuYWwvc3RyZWFtcy9idWZmZXJfbGlzdC5qcyIsICJub2RlX21vZHVsZXMvcmVhZGFibGUtc3RyZWFtL2xpYi9pbnRlcm5hbC9zdHJlYW1zL3N0YXRlLmpzIiwgIm5vZGVfbW9kdWxlcy9yZWFkYWJsZS1zdHJlYW0vbGliL2ludGVybmFsL3N0cmVhbXMvZnJvbS5qcyIsICJub2RlX21vZHVsZXMvcmVhZGFibGUtc3RyZWFtL2xpYi9pbnRlcm5hbC9zdHJlYW1zL3JlYWRhYmxlLmpzIiwgIm5vZGVfbW9kdWxlcy9yZWFkYWJsZS1zdHJlYW0vbGliL2ludGVybmFsL3N0cmVhbXMvd3JpdGFibGUuanMiLCAibm9kZV9tb2R1bGVzL3JlYWRhYmxlLXN0cmVhbS9saWIvaW50ZXJuYWwvc3RyZWFtcy9kdXBsZXhpZnkuanMiLCAibm9kZV9tb2R1bGVzL3JlYWRhYmxlLXN0cmVhbS9saWIvaW50ZXJuYWwvc3RyZWFtcy9kdXBsZXguanMiLCAibm9kZV9tb2R1bGVzL3JlYWRhYmxlLXN0cmVhbS9saWIvaW50ZXJuYWwvc3RyZWFtcy90cmFuc2Zvcm0uanMiLCAibm9kZV9tb2R1bGVzL3JlYWRhYmxlLXN0cmVhbS9saWIvaW50ZXJuYWwvc3RyZWFtcy9wYXNzdGhyb3VnaC5qcyIsICJub2RlX21vZHVsZXMvcmVhZGFibGUtc3RyZWFtL2xpYi9pbnRlcm5hbC9zdHJlYW1zL3BpcGVsaW5lLmpzIiwgIm5vZGVfbW9kdWxlcy9yZWFkYWJsZS1zdHJlYW0vbGliL2ludGVybmFsL3N0cmVhbXMvY29tcG9zZS5qcyIsICJub2RlX21vZHVsZXMvcmVhZGFibGUtc3RyZWFtL2xpYi9pbnRlcm5hbC9zdHJlYW1zL29wZXJhdG9ycy5qcyIsICJub2RlX21vZHVsZXMvcmVhZGFibGUtc3RyZWFtL2xpYi9zdHJlYW0vcHJvbWlzZXMuanMiLCAibm9kZV9tb2R1bGVzL3JlYWRhYmxlLXN0cmVhbS9saWIvc3RyZWFtLmpzIiwgIm5vZGVfbW9kdWxlcy9yZWFkYWJsZS1zdHJlYW0vbGliL291cnMvaW5kZXguanMiLCAibm9kZV9tb2R1bGVzL2xvZGFzaC9fYXJyYXlQdXNoLmpzIiwgIm5vZGVfbW9kdWxlcy9sb2Rhc2gvX2lzRmxhdHRlbmFibGUuanMiLCAibm9kZV9tb2R1bGVzL2xvZGFzaC9fYmFzZUZsYXR0ZW4uanMiLCAibm9kZV9tb2R1bGVzL2xvZGFzaC9mbGF0dGVuLmpzIiwgIm5vZGVfbW9kdWxlcy9sb2Rhc2gvX25hdGl2ZUNyZWF0ZS5qcyIsICJub2RlX21vZHVsZXMvbG9kYXNoL19oYXNoQ2xlYXIuanMiLCAibm9kZV9tb2R1bGVzL2xvZGFzaC9faGFzaERlbGV0ZS5qcyIsICJub2RlX21vZHVsZXMvbG9kYXNoL19oYXNoR2V0LmpzIiwgIm5vZGVfbW9kdWxlcy9sb2Rhc2gvX2hhc2hIYXMuanMiLCAibm9kZV9tb2R1bGVzL2xvZGFzaC9faGFzaFNldC5qcyIsICJub2RlX21vZHVsZXMvbG9kYXNoL19IYXNoLmpzIiwgIm5vZGVfbW9kdWxlcy9sb2Rhc2gvX2xpc3RDYWNoZUNsZWFyLmpzIiwgIm5vZGVfbW9kdWxlcy9sb2Rhc2gvX2Fzc29jSW5kZXhPZi5qcyIsICJub2RlX21vZHVsZXMvbG9kYXNoL19saXN0Q2FjaGVEZWxldGUuanMiLCAibm9kZV9tb2R1bGVzL2xvZGFzaC9fbGlzdENhY2hlR2V0LmpzIiwgIm5vZGVfbW9kdWxlcy9sb2Rhc2gvX2xpc3RDYWNoZUhhcy5qcyIsICJub2RlX21vZHVsZXMvbG9kYXNoL19saXN0Q2FjaGVTZXQuanMiLCAibm9kZV9tb2R1bGVzL2xvZGFzaC9fTGlzdENhY2hlLmpzIiwgIm5vZGVfbW9kdWxlcy9sb2Rhc2gvX01hcC5qcyIsICJub2RlX21vZHVsZXMvbG9kYXNoL19tYXBDYWNoZUNsZWFyLmpzIiwgIm5vZGVfbW9kdWxlcy9sb2Rhc2gvX2lzS2V5YWJsZS5qcyIsICJub2RlX21vZHVsZXMvbG9kYXNoL19nZXRNYXBEYXRhLmpzIiwgIm5vZGVfbW9kdWxlcy9sb2Rhc2gvX21hcENhY2hlRGVsZXRlLmpzIiwgIm5vZGVfbW9kdWxlcy9sb2Rhc2gvX21hcENhY2hlR2V0LmpzIiwgIm5vZGVfbW9kdWxlcy9sb2Rhc2gvX21hcENhY2hlSGFzLmpzIiwgIm5vZGVfbW9kdWxlcy9sb2Rhc2gvX21hcENhY2hlU2V0LmpzIiwgIm5vZGVfbW9kdWxlcy9sb2Rhc2gvX01hcENhY2hlLmpzIiwgIm5vZGVfbW9kdWxlcy9sb2Rhc2gvX3NldENhY2hlQWRkLmpzIiwgIm5vZGVfbW9kdWxlcy9sb2Rhc2gvX3NldENhY2hlSGFzLmpzIiwgIm5vZGVfbW9kdWxlcy9sb2Rhc2gvX1NldENhY2hlLmpzIiwgIm5vZGVfbW9kdWxlcy9sb2Rhc2gvX2Jhc2VGaW5kSW5kZXguanMiLCAibm9kZV9tb2R1bGVzL2xvZGFzaC9fYmFzZUlzTmFOLmpzIiwgIm5vZGVfbW9kdWxlcy9sb2Rhc2gvX3N0cmljdEluZGV4T2YuanMiLCAibm9kZV9tb2R1bGVzL2xvZGFzaC9fYmFzZUluZGV4T2YuanMiLCAibm9kZV9tb2R1bGVzL2xvZGFzaC9fYXJyYXlJbmNsdWRlcy5qcyIsICJub2RlX21vZHVsZXMvbG9kYXNoL19hcnJheUluY2x1ZGVzV2l0aC5qcyIsICJub2RlX21vZHVsZXMvbG9kYXNoL19hcnJheU1hcC5qcyIsICJub2RlX21vZHVsZXMvbG9kYXNoL19jYWNoZUhhcy5qcyIsICJub2RlX21vZHVsZXMvbG9kYXNoL19iYXNlRGlmZmVyZW5jZS5qcyIsICJub2RlX21vZHVsZXMvbG9kYXNoL2lzQXJyYXlMaWtlT2JqZWN0LmpzIiwgIm5vZGVfbW9kdWxlcy9sb2Rhc2gvZGlmZmVyZW5jZS5qcyIsICJub2RlX21vZHVsZXMvbG9kYXNoL19TZXQuanMiLCAibm9kZV9tb2R1bGVzL2xvZGFzaC9ub29wLmpzIiwgIm5vZGVfbW9kdWxlcy9sb2Rhc2gvX3NldFRvQXJyYXkuanMiLCAibm9kZV9tb2R1bGVzL2xvZGFzaC9fY3JlYXRlU2V0LmpzIiwgIm5vZGVfbW9kdWxlcy9sb2Rhc2gvX2Jhc2VVbmlxLmpzIiwgIm5vZGVfbW9kdWxlcy9sb2Rhc2gvdW5pb24uanMiLCAibm9kZV9tb2R1bGVzL2xvZGFzaC9fb3ZlckFyZy5qcyIsICJub2RlX21vZHVsZXMvbG9kYXNoL19nZXRQcm90b3R5cGUuanMiLCAibm9kZV9tb2R1bGVzL2xvZGFzaC9pc1BsYWluT2JqZWN0LmpzIiwgIm5vZGVfbW9kdWxlcy9nbG9iL25vZGVfbW9kdWxlcy9taW5pbWF0Y2gvZGlzdC9jb21tb25qcy9hc3NlcnQtdmFsaWQtcGF0dGVybi5qcyIsICJub2RlX21vZHVsZXMvZ2xvYi9ub2RlX21vZHVsZXMvbWluaW1hdGNoL2Rpc3QvY29tbW9uanMvYnJhY2UtZXhwcmVzc2lvbnMuanMiLCAibm9kZV9tb2R1bGVzL2dsb2Ivbm9kZV9tb2R1bGVzL21pbmltYXRjaC9kaXN0L2NvbW1vbmpzL3VuZXNjYXBlLmpzIiwgIm5vZGVfbW9kdWxlcy9nbG9iL25vZGVfbW9kdWxlcy9taW5pbWF0Y2gvZGlzdC9jb21tb25qcy9hc3QuanMiLCAibm9kZV9tb2R1bGVzL2dsb2Ivbm9kZV9tb2R1bGVzL21pbmltYXRjaC9kaXN0L2NvbW1vbmpzL2VzY2FwZS5qcyIsICJub2RlX21vZHVsZXMvZ2xvYi9ub2RlX21vZHVsZXMvbWluaW1hdGNoL2Rpc3QvY29tbW9uanMvaW5kZXguanMiLCAibm9kZV9tb2R1bGVzL2xydS1jYWNoZS9kaXN0L2NvbW1vbmpzL2luZGV4LmpzIiwgIm5vZGVfbW9kdWxlcy9taW5pcGFzcy9kaXN0L2NvbW1vbmpzL2luZGV4LmpzIiwgIm5vZGVfbW9kdWxlcy9wYXRoLXNjdXJyeS9kaXN0L2NvbW1vbmpzL2luZGV4LmpzIiwgIm5vZGVfbW9kdWxlcy9nbG9iL2Rpc3QvY29tbW9uanMvcGF0dGVybi5qcyIsICJub2RlX21vZHVsZXMvZ2xvYi9kaXN0L2NvbW1vbmpzL2lnbm9yZS5qcyIsICJub2RlX21vZHVsZXMvZ2xvYi9kaXN0L2NvbW1vbmpzL3Byb2Nlc3Nvci5qcyIsICJub2RlX21vZHVsZXMvZ2xvYi9kaXN0L2NvbW1vbmpzL3dhbGtlci5qcyIsICJub2RlX21vZHVsZXMvZ2xvYi9kaXN0L2NvbW1vbmpzL2dsb2IuanMiLCAibm9kZV9tb2R1bGVzL2dsb2IvZGlzdC9jb21tb25qcy9oYXMtbWFnaWMuanMiLCAibm9kZV9tb2R1bGVzL2dsb2IvZGlzdC9jb21tb25qcy9pbmRleC5qcyIsICJub2RlX21vZHVsZXMvYXJjaGl2ZXItdXRpbHMvZmlsZS5qcyIsICJub2RlX21vZHVsZXMvYXJjaGl2ZXItdXRpbHMvaW5kZXguanMiLCAibm9kZV9tb2R1bGVzL2FyY2hpdmVyL2xpYi9lcnJvci5qcyIsICJub2RlX21vZHVsZXMvYXJjaGl2ZXIvbGliL2NvcmUuanMiLCAibm9kZV9tb2R1bGVzL2NvbXByZXNzLWNvbW1vbnMvbGliL2FyY2hpdmVycy9hcmNoaXZlLWVudHJ5LmpzIiwgIm5vZGVfbW9kdWxlcy9jb21wcmVzcy1jb21tb25zL2xpYi9hcmNoaXZlcnMvemlwL3V0aWwuanMiLCAibm9kZV9tb2R1bGVzL2NvbXByZXNzLWNvbW1vbnMvbGliL2FyY2hpdmVycy96aXAvZ2VuZXJhbC1wdXJwb3NlLWJpdC5qcyIsICJub2RlX21vZHVsZXMvY29tcHJlc3MtY29tbW9ucy9saWIvYXJjaGl2ZXJzL3ppcC91bml4LXN0YXQuanMiLCAibm9kZV9tb2R1bGVzL2NvbXByZXNzLWNvbW1vbnMvbGliL2FyY2hpdmVycy96aXAvY29uc3RhbnRzLmpzIiwgIm5vZGVfbW9kdWxlcy9jb21wcmVzcy1jb21tb25zL2xpYi9hcmNoaXZlcnMvemlwL3ppcC1hcmNoaXZlLWVudHJ5LmpzIiwgIm5vZGVfbW9kdWxlcy9jb21wcmVzcy1jb21tb25zL2xpYi91dGlsL2luZGV4LmpzIiwgIm5vZGVfbW9kdWxlcy9jb21wcmVzcy1jb21tb25zL2xpYi9hcmNoaXZlcnMvYXJjaGl2ZS1vdXRwdXQtc3RyZWFtLmpzIiwgIm5vZGVfbW9kdWxlcy9jcmMtMzIvY3JjMzIuanMiLCAibm9kZV9tb2R1bGVzL2NyYzMyLXN0cmVhbS9saWIvY3JjMzItc3RyZWFtLmpzIiwgIm5vZGVfbW9kdWxlcy9jcmMzMi1zdHJlYW0vbGliL2RlZmxhdGUtY3JjMzItc3RyZWFtLmpzIiwgIm5vZGVfbW9kdWxlcy9jcmMzMi1zdHJlYW0vbGliL2luZGV4LmpzIiwgIm5vZGVfbW9kdWxlcy9jb21wcmVzcy1jb21tb25zL2xpYi9hcmNoaXZlcnMvemlwL3ppcC1hcmNoaXZlLW91dHB1dC1zdHJlYW0uanMiLCAibm9kZV9tb2R1bGVzL2NvbXByZXNzLWNvbW1vbnMvbGliL2NvbXByZXNzLWNvbW1vbnMuanMiLCAibm9kZV9tb2R1bGVzL3ppcC1zdHJlYW0vaW5kZXguanMiLCAibm9kZV9tb2R1bGVzL2FyY2hpdmVyL2xpYi9wbHVnaW5zL3ppcC5qcyIsICJub2RlX21vZHVsZXMvcXVldWUtdGljay9xdWV1ZS1taWNyb3Rhc2suanMiLCAibm9kZV9tb2R1bGVzL3F1ZXVlLXRpY2svcHJvY2Vzcy1uZXh0LXRpY2suanMiLCAibm9kZV9tb2R1bGVzL2Zhc3QtZmlmby9maXhlZC1zaXplLmpzIiwgIm5vZGVfbW9kdWxlcy9mYXN0LWZpZm8vaW5kZXguanMiLCAibm9kZV9tb2R1bGVzL3RleHQtZGVjb2Rlci9saWIvcGFzcy10aHJvdWdoLWRlY29kZXIuanMiLCAibm9kZV9tb2R1bGVzL3RleHQtZGVjb2Rlci9saWIvdXRmOC1kZWNvZGVyLmpzIiwgIm5vZGVfbW9kdWxlcy90ZXh0LWRlY29kZXIvaW5kZXguanMiLCAibm9kZV9tb2R1bGVzL3N0cmVhbXgvaW5kZXguanMiLCAibm9kZV9tb2R1bGVzL2I0YS9pbmRleC5qcyIsICJub2RlX21vZHVsZXMvdGFyLXN0cmVhbS9oZWFkZXJzLmpzIiwgIm5vZGVfbW9kdWxlcy90YXItc3RyZWFtL2V4dHJhY3QuanMiLCAibm9kZV9tb2R1bGVzL3Rhci1zdHJlYW0vY29uc3RhbnRzLmpzIiwgIm5vZGVfbW9kdWxlcy90YXItc3RyZWFtL3BhY2suanMiLCAibm9kZV9tb2R1bGVzL3Rhci1zdHJlYW0vaW5kZXguanMiLCAibm9kZV9tb2R1bGVzL2FyY2hpdmVyL2xpYi9wbHVnaW5zL3Rhci5qcyIsICJub2RlX21vZHVsZXMvYnVmZmVyLWNyYzMyL2Rpc3QvaW5kZXguY2pzIiwgIm5vZGVfbW9kdWxlcy9hcmNoaXZlci9saWIvcGx1Z2lucy9qc29uLmpzIiwgIm5vZGVfbW9kdWxlcy9hcmNoaXZlci9pbmRleC5qcyIsICJub2RlX21vZHVsZXMvQGFjdGlvbnMvYXJ0aWZhY3QvbGliL2ludGVybmFsL3VwbG9hZC96aXAuanMiLCAibm9kZV9tb2R1bGVzL0BhY3Rpb25zL2FydGlmYWN0L2xpYi9pbnRlcm5hbC91cGxvYWQvdXBsb2FkLWFydGlmYWN0LmpzIiwgIm5vZGVfbW9kdWxlcy9AYWN0aW9ucy9hcnRpZmFjdC9ub2RlX21vZHVsZXMvQGFjdGlvbnMvZ2l0aHViL2xpYi9jb250ZXh0LmpzIiwgIm5vZGVfbW9kdWxlcy9AYWN0aW9ucy9hcnRpZmFjdC9ub2RlX21vZHVsZXMvQGFjdGlvbnMvZ2l0aHViL2xpYi9pbnRlcm5hbC91dGlscy5qcyIsICJub2RlX21vZHVsZXMvaXMtcGxhaW4tb2JqZWN0L2Rpc3QvaXMtcGxhaW4tb2JqZWN0LmpzIiwgIm5vZGVfbW9kdWxlcy9Ab2N0b2tpdC9lbmRwb2ludC9kaXN0LW5vZGUvaW5kZXguanMiLCAibm9kZV9tb2R1bGVzL3dlYmlkbC1jb252ZXJzaW9ucy9saWIvaW5kZXguanMiLCAibm9kZV9tb2R1bGVzL3doYXR3Zy11cmwvbGliL3V0aWxzLmpzIiwgIm5vZGVfbW9kdWxlcy90cjQ2L2luZGV4LmpzIiwgIm5vZGVfbW9kdWxlcy93aGF0d2ctdXJsL2xpYi91cmwtc3RhdGUtbWFjaGluZS5qcyIsICJub2RlX21vZHVsZXMvd2hhdHdnLXVybC9saWIvVVJMLWltcGwuanMiLCAibm9kZV9tb2R1bGVzL3doYXR3Zy11cmwvbGliL1VSTC5qcyIsICJub2RlX21vZHVsZXMvd2hhdHdnLXVybC9saWIvcHVibGljLWFwaS5qcyIsICJub2RlX21vZHVsZXMvbm9kZS1mZXRjaC9saWIvaW5kZXguanMiLCAibm9kZV9tb2R1bGVzL0BvY3Rva2l0L3JlcXVlc3Qvbm9kZV9tb2R1bGVzL0BvY3Rva2l0L3JlcXVlc3QtZXJyb3IvZGlzdC1ub2RlL2luZGV4LmpzIiwgIm5vZGVfbW9kdWxlcy9Ab2N0b2tpdC9yZXF1ZXN0L2Rpc3Qtbm9kZS9pbmRleC5qcyIsICJub2RlX21vZHVsZXMvQG9jdG9raXQvZ3JhcGhxbC9kaXN0LW5vZGUvaW5kZXguanMiLCAibm9kZV9tb2R1bGVzL0BvY3Rva2l0L2F1dGgtdG9rZW4vZGlzdC1ub2RlL2luZGV4LmpzIiwgIm5vZGVfbW9kdWxlcy9Ab2N0b2tpdC9jb3JlL2Rpc3Qtbm9kZS9pbmRleC5qcyIsICJub2RlX21vZHVsZXMvQGFjdGlvbnMvYXJ0aWZhY3Qvbm9kZV9tb2R1bGVzL0BhY3Rpb25zL2dpdGh1Yi9ub2RlX21vZHVsZXMvQG9jdG9raXQvcGx1Z2luLXJlc3QtZW5kcG9pbnQtbWV0aG9kcy9kaXN0LW5vZGUvaW5kZXguanMiLCAibm9kZV9tb2R1bGVzL0BhY3Rpb25zL2FydGlmYWN0L25vZGVfbW9kdWxlcy9AYWN0aW9ucy9naXRodWIvbm9kZV9tb2R1bGVzL0BvY3Rva2l0L3BsdWdpbi1wYWdpbmF0ZS1yZXN0L2Rpc3Qtbm9kZS9pbmRleC5qcyIsICJub2RlX21vZHVsZXMvQGFjdGlvbnMvYXJ0aWZhY3Qvbm9kZV9tb2R1bGVzL0BhY3Rpb25zL2dpdGh1Yi9saWIvdXRpbHMuanMiLCAibm9kZV9tb2R1bGVzL0BhY3Rpb25zL2FydGlmYWN0L25vZGVfbW9kdWxlcy9AYWN0aW9ucy9naXRodWIvbGliL2dpdGh1Yi5qcyIsICJub2RlX21vZHVsZXMvdHJhdmVyc2UvaW5kZXguanMiLCAibm9kZV9tb2R1bGVzL2NoYWluc2F3L2luZGV4LmpzIiwgIm5vZGVfbW9kdWxlcy9idWZmZXJzL2luZGV4LmpzIiwgIm5vZGVfbW9kdWxlcy9iaW5hcnkvbGliL3ZhcnMuanMiLCAibm9kZV9tb2R1bGVzL2JpbmFyeS9pbmRleC5qcyIsICJub2RlX21vZHVsZXMvdW56aXAtc3RyZWFtL2xpYi9tYXRjaGVyLXN0cmVhbS5qcyIsICJub2RlX21vZHVsZXMvdW56aXAtc3RyZWFtL2xpYi9lbnRyeS5qcyIsICJub2RlX21vZHVsZXMvdW56aXAtc3RyZWFtL2xpYi91bnppcC1zdHJlYW0uanMiLCAibm9kZV9tb2R1bGVzL3VuemlwLXN0cmVhbS9saWIvcGFyc2VyLXN0cmVhbS5qcyIsICJub2RlX21vZHVsZXMvbWtkaXJwL2luZGV4LmpzIiwgIm5vZGVfbW9kdWxlcy91bnppcC1zdHJlYW0vbGliL2V4dHJhY3QuanMiLCAibm9kZV9tb2R1bGVzL3VuemlwLXN0cmVhbS91bnppcC5qcyIsICJub2RlX21vZHVsZXMvQGFjdGlvbnMvYXJ0aWZhY3QvbGliL2ludGVybmFsL2Rvd25sb2FkL2Rvd25sb2FkLWFydGlmYWN0LmpzIiwgIm5vZGVfbW9kdWxlcy9AYWN0aW9ucy9hcnRpZmFjdC9saWIvaW50ZXJuYWwvZmluZC9yZXRyeS1vcHRpb25zLmpzIiwgIm5vZGVfbW9kdWxlcy9Ab2N0b2tpdC9wbHVnaW4tcmVxdWVzdC1sb2cvZGlzdC1ub2RlL2luZGV4LmpzIiwgIm5vZGVfbW9kdWxlcy9ib3R0bGVuZWNrL2xpZ2h0LmpzIiwgIm5vZGVfbW9kdWxlcy9Ab2N0b2tpdC9wbHVnaW4tcmV0cnkvZGlzdC1ub2RlL2luZGV4LmpzIiwgIm5vZGVfbW9kdWxlcy9AYWN0aW9ucy9hcnRpZmFjdC9saWIvaW50ZXJuYWwvZmluZC9nZXQtYXJ0aWZhY3QuanMiLCAibm9kZV9tb2R1bGVzL0BhY3Rpb25zL2FydGlmYWN0L2xpYi9pbnRlcm5hbC9kZWxldGUvZGVsZXRlLWFydGlmYWN0LmpzIiwgIm5vZGVfbW9kdWxlcy9AYWN0aW9ucy9hcnRpZmFjdC9saWIvaW50ZXJuYWwvZmluZC9saXN0LWFydGlmYWN0cy5qcyIsICJub2RlX21vZHVsZXMvQGFjdGlvbnMvYXJ0aWZhY3QvbGliL2ludGVybmFsL2NsaWVudC5qcyIsICJub2RlX21vZHVsZXMvQGFjdGlvbnMvYXJ0aWZhY3QvbGliL2ludGVybmFsL3NoYXJlZC9pbnRlcmZhY2VzLmpzIiwgIm5vZGVfbW9kdWxlcy9AYWN0aW9ucy9hcnRpZmFjdC9saWIvYXJ0aWZhY3QuanMiLCAic3JjL21haW4udHMiLCAic3JjL2RlcGxveS50cyIsICJzcmMvY29uc3RhbnRzLnRzIiwgInNyYy9wcm9tZXRoZXVzLnRzIiwgInNyYy9jb2xvcnMudHMiLCAic3JjL2NoYXJ0LnRzIiwgInNyYy9yZXBvcnQudHMiLCAic3JjL2luZGV4LnRzIl0sCiAgInNvdXJjZXNDb250ZW50IjogWwogICAgIlwidXNlIHN0cmljdFwiO1xuLy8gV2UgdXNlIGFueSBhcyBhIHZhbGlkIGlucHV0IHR5cGVcbi8qIGVzbGludC1kaXNhYmxlIEB0eXBlc2NyaXB0LWVzbGludC9uby1leHBsaWNpdC1hbnkgKi9cbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIl9fZXNNb2R1bGVcIiwgeyB2YWx1ZTogdHJ1ZSB9KTtcbmV4cG9ydHMudG9Db21tYW5kUHJvcGVydGllcyA9IGV4cG9ydHMudG9Db21tYW5kVmFsdWUgPSB2b2lkIDA7XG4vKipcbiAqIFNhbml0aXplcyBhbiBpbnB1dCBpbnRvIGEgc3RyaW5nIHNvIGl0IGNhbiBiZSBwYXNzZWQgaW50byBpc3N1ZUNvbW1hbmQgc2FmZWx5XG4gKiBAcGFyYW0gaW5wdXQgaW5wdXQgdG8gc2FuaXRpemUgaW50byBhIHN0cmluZ1xuICovXG5mdW5jdGlvbiB0b0NvbW1hbmRWYWx1ZShpbnB1dCkge1xuICAgIGlmIChpbnB1dCA9PT0gbnVsbCB8fCBpbnB1dCA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgIHJldHVybiAnJztcbiAgICB9XG4gICAgZWxzZSBpZiAodHlwZW9mIGlucHV0ID09PSAnc3RyaW5nJyB8fCBpbnB1dCBpbnN0YW5jZW9mIFN0cmluZykge1xuICAgICAgICByZXR1cm4gaW5wdXQ7XG4gICAgfVxuICAgIHJldHVybiBKU09OLnN0cmluZ2lmeShpbnB1dCk7XG59XG5leHBvcnRzLnRvQ29tbWFuZFZhbHVlID0gdG9Db21tYW5kVmFsdWU7XG4vKipcbiAqXG4gKiBAcGFyYW0gYW5ub3RhdGlvblByb3BlcnRpZXNcbiAqIEByZXR1cm5zIFRoZSBjb21tYW5kIHByb3BlcnRpZXMgdG8gc2VuZCB3aXRoIHRoZSBhY3R1YWwgYW5ub3RhdGlvbiBjb21tYW5kXG4gKiBTZWUgSXNzdWVDb21tYW5kUHJvcGVydGllczogaHR0cHM6Ly9naXRodWIuY29tL2FjdGlvbnMvcnVubmVyL2Jsb2IvbWFpbi9zcmMvUnVubmVyLldvcmtlci9BY3Rpb25Db21tYW5kTWFuYWdlci5jcyNMNjQ2XG4gKi9cbmZ1bmN0aW9uIHRvQ29tbWFuZFByb3BlcnRpZXMoYW5ub3RhdGlvblByb3BlcnRpZXMpIHtcbiAgICBpZiAoIU9iamVjdC5rZXlzKGFubm90YXRpb25Qcm9wZXJ0aWVzKS5sZW5ndGgpIHtcbiAgICAgICAgcmV0dXJuIHt9O1xuICAgIH1cbiAgICByZXR1cm4ge1xuICAgICAgICB0aXRsZTogYW5ub3RhdGlvblByb3BlcnRpZXMudGl0bGUsXG4gICAgICAgIGZpbGU6IGFubm90YXRpb25Qcm9wZXJ0aWVzLmZpbGUsXG4gICAgICAgIGxpbmU6IGFubm90YXRpb25Qcm9wZXJ0aWVzLnN0YXJ0TGluZSxcbiAgICAgICAgZW5kTGluZTogYW5ub3RhdGlvblByb3BlcnRpZXMuZW5kTGluZSxcbiAgICAgICAgY29sOiBhbm5vdGF0aW9uUHJvcGVydGllcy5zdGFydENvbHVtbixcbiAgICAgICAgZW5kQ29sdW1uOiBhbm5vdGF0aW9uUHJvcGVydGllcy5lbmRDb2x1bW5cbiAgICB9O1xufVxuZXhwb3J0cy50b0NvbW1hbmRQcm9wZXJ0aWVzID0gdG9Db21tYW5kUHJvcGVydGllcztcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPXV0aWxzLmpzLm1hcCIsCiAgICAiXCJ1c2Ugc3RyaWN0XCI7XG52YXIgX19jcmVhdGVCaW5kaW5nID0gKHRoaXMgJiYgdGhpcy5fX2NyZWF0ZUJpbmRpbmcpIHx8IChPYmplY3QuY3JlYXRlID8gKGZ1bmN0aW9uKG8sIG0sIGssIGsyKSB7XG4gICAgaWYgKGsyID09PSB1bmRlZmluZWQpIGsyID0gaztcbiAgICB2YXIgZGVzYyA9IE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IobSwgayk7XG4gICAgaWYgKCFkZXNjIHx8IChcImdldFwiIGluIGRlc2MgPyAhbS5fX2VzTW9kdWxlIDogZGVzYy53cml0YWJsZSB8fCBkZXNjLmNvbmZpZ3VyYWJsZSkpIHtcbiAgICAgIGRlc2MgPSB7IGVudW1lcmFibGU6IHRydWUsIGdldDogZnVuY3Rpb24oKSB7IHJldHVybiBtW2tdOyB9IH07XG4gICAgfVxuICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShvLCBrMiwgZGVzYyk7XG59KSA6IChmdW5jdGlvbihvLCBtLCBrLCBrMikge1xuICAgIGlmIChrMiA9PT0gdW5kZWZpbmVkKSBrMiA9IGs7XG4gICAgb1trMl0gPSBtW2tdO1xufSkpO1xudmFyIF9fc2V0TW9kdWxlRGVmYXVsdCA9ICh0aGlzICYmIHRoaXMuX19zZXRNb2R1bGVEZWZhdWx0KSB8fCAoT2JqZWN0LmNyZWF0ZSA/IChmdW5jdGlvbihvLCB2KSB7XG4gICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KG8sIFwiZGVmYXVsdFwiLCB7IGVudW1lcmFibGU6IHRydWUsIHZhbHVlOiB2IH0pO1xufSkgOiBmdW5jdGlvbihvLCB2KSB7XG4gICAgb1tcImRlZmF1bHRcIl0gPSB2O1xufSk7XG52YXIgX19pbXBvcnRTdGFyID0gKHRoaXMgJiYgdGhpcy5fX2ltcG9ydFN0YXIpIHx8IGZ1bmN0aW9uIChtb2QpIHtcbiAgICBpZiAobW9kICYmIG1vZC5fX2VzTW9kdWxlKSByZXR1cm4gbW9kO1xuICAgIHZhciByZXN1bHQgPSB7fTtcbiAgICBpZiAobW9kICE9IG51bGwpIGZvciAodmFyIGsgaW4gbW9kKSBpZiAoayAhPT0gXCJkZWZhdWx0XCIgJiYgT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKG1vZCwgaykpIF9fY3JlYXRlQmluZGluZyhyZXN1bHQsIG1vZCwgayk7XG4gICAgX19zZXRNb2R1bGVEZWZhdWx0KHJlc3VsdCwgbW9kKTtcbiAgICByZXR1cm4gcmVzdWx0O1xufTtcbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIl9fZXNNb2R1bGVcIiwgeyB2YWx1ZTogdHJ1ZSB9KTtcbmV4cG9ydHMuaXNzdWUgPSBleHBvcnRzLmlzc3VlQ29tbWFuZCA9IHZvaWQgMDtcbmNvbnN0IG9zID0gX19pbXBvcnRTdGFyKHJlcXVpcmUoXCJvc1wiKSk7XG5jb25zdCB1dGlsc18xID0gcmVxdWlyZShcIi4vdXRpbHNcIik7XG4vKipcbiAqIENvbW1hbmRzXG4gKlxuICogQ29tbWFuZCBGb3JtYXQ6XG4gKiAgIDo6bmFtZSBrZXk9dmFsdWUsa2V5PXZhbHVlOjptZXNzYWdlXG4gKlxuICogRXhhbXBsZXM6XG4gKiAgIDo6d2FybmluZzo6VGhpcyBpcyB0aGUgbWVzc2FnZVxuICogICA6OnNldC1lbnYgbmFtZT1NWV9WQVI6OnNvbWUgdmFsdWVcbiAqL1xuZnVuY3Rpb24gaXNzdWVDb21tYW5kKGNvbW1hbmQsIHByb3BlcnRpZXMsIG1lc3NhZ2UpIHtcbiAgICBjb25zdCBjbWQgPSBuZXcgQ29tbWFuZChjb21tYW5kLCBwcm9wZXJ0aWVzLCBtZXNzYWdlKTtcbiAgICBwcm9jZXNzLnN0ZG91dC53cml0ZShjbWQudG9TdHJpbmcoKSArIG9zLkVPTCk7XG59XG5leHBvcnRzLmlzc3VlQ29tbWFuZCA9IGlzc3VlQ29tbWFuZDtcbmZ1bmN0aW9uIGlzc3VlKG5hbWUsIG1lc3NhZ2UgPSAnJykge1xuICAgIGlzc3VlQ29tbWFuZChuYW1lLCB7fSwgbWVzc2FnZSk7XG59XG5leHBvcnRzLmlzc3VlID0gaXNzdWU7XG5jb25zdCBDTURfU1RSSU5HID0gJzo6JztcbmNsYXNzIENvbW1hbmQge1xuICAgIGNvbnN0cnVjdG9yKGNvbW1hbmQsIHByb3BlcnRpZXMsIG1lc3NhZ2UpIHtcbiAgICAgICAgaWYgKCFjb21tYW5kKSB7XG4gICAgICAgICAgICBjb21tYW5kID0gJ21pc3NpbmcuY29tbWFuZCc7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5jb21tYW5kID0gY29tbWFuZDtcbiAgICAgICAgdGhpcy5wcm9wZXJ0aWVzID0gcHJvcGVydGllcztcbiAgICAgICAgdGhpcy5tZXNzYWdlID0gbWVzc2FnZTtcbiAgICB9XG4gICAgdG9TdHJpbmcoKSB7XG4gICAgICAgIGxldCBjbWRTdHIgPSBDTURfU1RSSU5HICsgdGhpcy5jb21tYW5kO1xuICAgICAgICBpZiAodGhpcy5wcm9wZXJ0aWVzICYmIE9iamVjdC5rZXlzKHRoaXMucHJvcGVydGllcykubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgY21kU3RyICs9ICcgJztcbiAgICAgICAgICAgIGxldCBmaXJzdCA9IHRydWU7XG4gICAgICAgICAgICBmb3IgKGNvbnN0IGtleSBpbiB0aGlzLnByb3BlcnRpZXMpIHtcbiAgICAgICAgICAgICAgICBpZiAodGhpcy5wcm9wZXJ0aWVzLmhhc093blByb3BlcnR5KGtleSkpIHtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgdmFsID0gdGhpcy5wcm9wZXJ0aWVzW2tleV07XG4gICAgICAgICAgICAgICAgICAgIGlmICh2YWwpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChmaXJzdCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpcnN0ID0gZmFsc2U7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbWRTdHIgKz0gJywnO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgY21kU3RyICs9IGAke2tleX09JHtlc2NhcGVQcm9wZXJ0eSh2YWwpfWA7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgY21kU3RyICs9IGAke0NNRF9TVFJJTkd9JHtlc2NhcGVEYXRhKHRoaXMubWVzc2FnZSl9YDtcbiAgICAgICAgcmV0dXJuIGNtZFN0cjtcbiAgICB9XG59XG5mdW5jdGlvbiBlc2NhcGVEYXRhKHMpIHtcbiAgICByZXR1cm4gKDAsIHV0aWxzXzEudG9Db21tYW5kVmFsdWUpKHMpXG4gICAgICAgIC5yZXBsYWNlKC8lL2csICclMjUnKVxuICAgICAgICAucmVwbGFjZSgvXFxyL2csICclMEQnKVxuICAgICAgICAucmVwbGFjZSgvXFxuL2csICclMEEnKTtcbn1cbmZ1bmN0aW9uIGVzY2FwZVByb3BlcnR5KHMpIHtcbiAgICByZXR1cm4gKDAsIHV0aWxzXzEudG9Db21tYW5kVmFsdWUpKHMpXG4gICAgICAgIC5yZXBsYWNlKC8lL2csICclMjUnKVxuICAgICAgICAucmVwbGFjZSgvXFxyL2csICclMEQnKVxuICAgICAgICAucmVwbGFjZSgvXFxuL2csICclMEEnKVxuICAgICAgICAucmVwbGFjZSgvOi9nLCAnJTNBJylcbiAgICAgICAgLnJlcGxhY2UoLywvZywgJyUyQycpO1xufVxuLy8jIHNvdXJjZU1hcHBpbmdVUkw9Y29tbWFuZC5qcy5tYXAiLAogICAgIlwidXNlIHN0cmljdFwiO1xuLy8gRm9yIGludGVybmFsIHVzZSwgc3ViamVjdCB0byBjaGFuZ2UuXG52YXIgX19jcmVhdGVCaW5kaW5nID0gKHRoaXMgJiYgdGhpcy5fX2NyZWF0ZUJpbmRpbmcpIHx8IChPYmplY3QuY3JlYXRlID8gKGZ1bmN0aW9uKG8sIG0sIGssIGsyKSB7XG4gICAgaWYgKGsyID09PSB1bmRlZmluZWQpIGsyID0gaztcbiAgICB2YXIgZGVzYyA9IE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IobSwgayk7XG4gICAgaWYgKCFkZXNjIHx8IChcImdldFwiIGluIGRlc2MgPyAhbS5fX2VzTW9kdWxlIDogZGVzYy53cml0YWJsZSB8fCBkZXNjLmNvbmZpZ3VyYWJsZSkpIHtcbiAgICAgIGRlc2MgPSB7IGVudW1lcmFibGU6IHRydWUsIGdldDogZnVuY3Rpb24oKSB7IHJldHVybiBtW2tdOyB9IH07XG4gICAgfVxuICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShvLCBrMiwgZGVzYyk7XG59KSA6IChmdW5jdGlvbihvLCBtLCBrLCBrMikge1xuICAgIGlmIChrMiA9PT0gdW5kZWZpbmVkKSBrMiA9IGs7XG4gICAgb1trMl0gPSBtW2tdO1xufSkpO1xudmFyIF9fc2V0TW9kdWxlRGVmYXVsdCA9ICh0aGlzICYmIHRoaXMuX19zZXRNb2R1bGVEZWZhdWx0KSB8fCAoT2JqZWN0LmNyZWF0ZSA/IChmdW5jdGlvbihvLCB2KSB7XG4gICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KG8sIFwiZGVmYXVsdFwiLCB7IGVudW1lcmFibGU6IHRydWUsIHZhbHVlOiB2IH0pO1xufSkgOiBmdW5jdGlvbihvLCB2KSB7XG4gICAgb1tcImRlZmF1bHRcIl0gPSB2O1xufSk7XG52YXIgX19pbXBvcnRTdGFyID0gKHRoaXMgJiYgdGhpcy5fX2ltcG9ydFN0YXIpIHx8IGZ1bmN0aW9uIChtb2QpIHtcbiAgICBpZiAobW9kICYmIG1vZC5fX2VzTW9kdWxlKSByZXR1cm4gbW9kO1xuICAgIHZhciByZXN1bHQgPSB7fTtcbiAgICBpZiAobW9kICE9IG51bGwpIGZvciAodmFyIGsgaW4gbW9kKSBpZiAoayAhPT0gXCJkZWZhdWx0XCIgJiYgT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKG1vZCwgaykpIF9fY3JlYXRlQmluZGluZyhyZXN1bHQsIG1vZCwgayk7XG4gICAgX19zZXRNb2R1bGVEZWZhdWx0KHJlc3VsdCwgbW9kKTtcbiAgICByZXR1cm4gcmVzdWx0O1xufTtcbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIl9fZXNNb2R1bGVcIiwgeyB2YWx1ZTogdHJ1ZSB9KTtcbmV4cG9ydHMucHJlcGFyZUtleVZhbHVlTWVzc2FnZSA9IGV4cG9ydHMuaXNzdWVGaWxlQ29tbWFuZCA9IHZvaWQgMDtcbi8vIFdlIHVzZSBhbnkgYXMgYSB2YWxpZCBpbnB1dCB0eXBlXG4vKiBlc2xpbnQtZGlzYWJsZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tZXhwbGljaXQtYW55ICovXG5jb25zdCBjcnlwdG8gPSBfX2ltcG9ydFN0YXIocmVxdWlyZShcImNyeXB0b1wiKSk7XG5jb25zdCBmcyA9IF9faW1wb3J0U3RhcihyZXF1aXJlKFwiZnNcIikpO1xuY29uc3Qgb3MgPSBfX2ltcG9ydFN0YXIocmVxdWlyZShcIm9zXCIpKTtcbmNvbnN0IHV0aWxzXzEgPSByZXF1aXJlKFwiLi91dGlsc1wiKTtcbmZ1bmN0aW9uIGlzc3VlRmlsZUNvbW1hbmQoY29tbWFuZCwgbWVzc2FnZSkge1xuICAgIGNvbnN0IGZpbGVQYXRoID0gcHJvY2Vzcy5lbnZbYEdJVEhVQl8ke2NvbW1hbmR9YF07XG4gICAgaWYgKCFmaWxlUGF0aCkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYFVuYWJsZSB0byBmaW5kIGVudmlyb25tZW50IHZhcmlhYmxlIGZvciBmaWxlIGNvbW1hbmQgJHtjb21tYW5kfWApO1xuICAgIH1cbiAgICBpZiAoIWZzLmV4aXN0c1N5bmMoZmlsZVBhdGgpKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihgTWlzc2luZyBmaWxlIGF0IHBhdGg6ICR7ZmlsZVBhdGh9YCk7XG4gICAgfVxuICAgIGZzLmFwcGVuZEZpbGVTeW5jKGZpbGVQYXRoLCBgJHsoMCwgdXRpbHNfMS50b0NvbW1hbmRWYWx1ZSkobWVzc2FnZSl9JHtvcy5FT0x9YCwge1xuICAgICAgICBlbmNvZGluZzogJ3V0ZjgnXG4gICAgfSk7XG59XG5leHBvcnRzLmlzc3VlRmlsZUNvbW1hbmQgPSBpc3N1ZUZpbGVDb21tYW5kO1xuZnVuY3Rpb24gcHJlcGFyZUtleVZhbHVlTWVzc2FnZShrZXksIHZhbHVlKSB7XG4gICAgY29uc3QgZGVsaW1pdGVyID0gYGdoYWRlbGltaXRlcl8ke2NyeXB0by5yYW5kb21VVUlEKCl9YDtcbiAgICBjb25zdCBjb252ZXJ0ZWRWYWx1ZSA9ICgwLCB1dGlsc18xLnRvQ29tbWFuZFZhbHVlKSh2YWx1ZSk7XG4gICAgLy8gVGhlc2Ugc2hvdWxkIHJlYWxpc3RpY2FsbHkgbmV2ZXIgaGFwcGVuLCBidXQganVzdCBpbiBjYXNlIHNvbWVvbmUgZmluZHMgYVxuICAgIC8vIHdheSB0byBleHBsb2l0IHV1aWQgZ2VuZXJhdGlvbiBsZXQncyBub3QgYWxsb3cga2V5cyBvciB2YWx1ZXMgdGhhdCBjb250YWluXG4gICAgLy8gdGhlIGRlbGltaXRlci5cbiAgICBpZiAoa2V5LmluY2x1ZGVzKGRlbGltaXRlcikpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBVbmV4cGVjdGVkIGlucHV0OiBuYW1lIHNob3VsZCBub3QgY29udGFpbiB0aGUgZGVsaW1pdGVyIFwiJHtkZWxpbWl0ZXJ9XCJgKTtcbiAgICB9XG4gICAgaWYgKGNvbnZlcnRlZFZhbHVlLmluY2x1ZGVzKGRlbGltaXRlcikpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBVbmV4cGVjdGVkIGlucHV0OiB2YWx1ZSBzaG91bGQgbm90IGNvbnRhaW4gdGhlIGRlbGltaXRlciBcIiR7ZGVsaW1pdGVyfVwiYCk7XG4gICAgfVxuICAgIHJldHVybiBgJHtrZXl9PDwke2RlbGltaXRlcn0ke29zLkVPTH0ke2NvbnZlcnRlZFZhbHVlfSR7b3MuRU9MfSR7ZGVsaW1pdGVyfWA7XG59XG5leHBvcnRzLnByZXBhcmVLZXlWYWx1ZU1lc3NhZ2UgPSBwcmVwYXJlS2V5VmFsdWVNZXNzYWdlO1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9ZmlsZS1jb21tYW5kLmpzLm1hcCIsCiAgICAiXCJ1c2Ugc3RyaWN0XCI7XG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJfX2VzTW9kdWxlXCIsIHsgdmFsdWU6IHRydWUgfSk7XG5leHBvcnRzLmNoZWNrQnlwYXNzID0gZXhwb3J0cy5nZXRQcm94eVVybCA9IHZvaWQgMDtcbmZ1bmN0aW9uIGdldFByb3h5VXJsKHJlcVVybCkge1xuICAgIGNvbnN0IHVzaW5nU3NsID0gcmVxVXJsLnByb3RvY29sID09PSAnaHR0cHM6JztcbiAgICBpZiAoY2hlY2tCeXBhc3MocmVxVXJsKSkge1xuICAgICAgICByZXR1cm4gdW5kZWZpbmVkO1xuICAgIH1cbiAgICBjb25zdCBwcm94eVZhciA9ICgoKSA9PiB7XG4gICAgICAgIGlmICh1c2luZ1NzbCkge1xuICAgICAgICAgICAgcmV0dXJuIHByb2Nlc3MuZW52WydodHRwc19wcm94eSddIHx8IHByb2Nlc3MuZW52WydIVFRQU19QUk9YWSddO1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgcmV0dXJuIHByb2Nlc3MuZW52WydodHRwX3Byb3h5J10gfHwgcHJvY2Vzcy5lbnZbJ0hUVFBfUFJPWFknXTtcbiAgICAgICAgfVxuICAgIH0pKCk7XG4gICAgaWYgKHByb3h5VmFyKSB7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgICByZXR1cm4gbmV3IERlY29kZWRVUkwocHJveHlWYXIpO1xuICAgICAgICB9XG4gICAgICAgIGNhdGNoIChfYSkge1xuICAgICAgICAgICAgaWYgKCFwcm94eVZhci5zdGFydHNXaXRoKCdodHRwOi8vJykgJiYgIXByb3h5VmFyLnN0YXJ0c1dpdGgoJ2h0dHBzOi8vJykpXG4gICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBEZWNvZGVkVVJMKGBodHRwOi8vJHtwcm94eVZhcn1gKTtcbiAgICAgICAgfVxuICAgIH1cbiAgICBlbHNlIHtcbiAgICAgICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICB9XG59XG5leHBvcnRzLmdldFByb3h5VXJsID0gZ2V0UHJveHlVcmw7XG5mdW5jdGlvbiBjaGVja0J5cGFzcyhyZXFVcmwpIHtcbiAgICBpZiAoIXJlcVVybC5ob3N0bmFtZSkge1xuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuICAgIGNvbnN0IHJlcUhvc3QgPSByZXFVcmwuaG9zdG5hbWU7XG4gICAgaWYgKGlzTG9vcGJhY2tBZGRyZXNzKHJlcUhvc3QpKSB7XG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cbiAgICBjb25zdCBub1Byb3h5ID0gcHJvY2Vzcy5lbnZbJ25vX3Byb3h5J10gfHwgcHJvY2Vzcy5lbnZbJ05PX1BST1hZJ10gfHwgJyc7XG4gICAgaWYgKCFub1Byb3h5KSB7XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gICAgLy8gRGV0ZXJtaW5lIHRoZSByZXF1ZXN0IHBvcnRcbiAgICBsZXQgcmVxUG9ydDtcbiAgICBpZiAocmVxVXJsLnBvcnQpIHtcbiAgICAgICAgcmVxUG9ydCA9IE51bWJlcihyZXFVcmwucG9ydCk7XG4gICAgfVxuICAgIGVsc2UgaWYgKHJlcVVybC5wcm90b2NvbCA9PT0gJ2h0dHA6Jykge1xuICAgICAgICByZXFQb3J0ID0gODA7XG4gICAgfVxuICAgIGVsc2UgaWYgKHJlcVVybC5wcm90b2NvbCA9PT0gJ2h0dHBzOicpIHtcbiAgICAgICAgcmVxUG9ydCA9IDQ0MztcbiAgICB9XG4gICAgLy8gRm9ybWF0IHRoZSByZXF1ZXN0IGhvc3RuYW1lIGFuZCBob3N0bmFtZSB3aXRoIHBvcnRcbiAgICBjb25zdCB1cHBlclJlcUhvc3RzID0gW3JlcVVybC5ob3N0bmFtZS50b1VwcGVyQ2FzZSgpXTtcbiAgICBpZiAodHlwZW9mIHJlcVBvcnQgPT09ICdudW1iZXInKSB7XG4gICAgICAgIHVwcGVyUmVxSG9zdHMucHVzaChgJHt1cHBlclJlcUhvc3RzWzBdfToke3JlcVBvcnR9YCk7XG4gICAgfVxuICAgIC8vIENvbXBhcmUgcmVxdWVzdCBob3N0IGFnYWluc3Qgbm9wcm94eVxuICAgIGZvciAoY29uc3QgdXBwZXJOb1Byb3h5SXRlbSBvZiBub1Byb3h5XG4gICAgICAgIC5zcGxpdCgnLCcpXG4gICAgICAgIC5tYXAoeCA9PiB4LnRyaW0oKS50b1VwcGVyQ2FzZSgpKVxuICAgICAgICAuZmlsdGVyKHggPT4geCkpIHtcbiAgICAgICAgaWYgKHVwcGVyTm9Qcm94eUl0ZW0gPT09ICcqJyB8fFxuICAgICAgICAgICAgdXBwZXJSZXFIb3N0cy5zb21lKHggPT4geCA9PT0gdXBwZXJOb1Byb3h5SXRlbSB8fFxuICAgICAgICAgICAgICAgIHguZW5kc1dpdGgoYC4ke3VwcGVyTm9Qcm94eUl0ZW19YCkgfHxcbiAgICAgICAgICAgICAgICAodXBwZXJOb1Byb3h5SXRlbS5zdGFydHNXaXRoKCcuJykgJiZcbiAgICAgICAgICAgICAgICAgICAgeC5lbmRzV2l0aChgJHt1cHBlck5vUHJveHlJdGVtfWApKSkpIHtcbiAgICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICB9XG4gICAgfVxuICAgIHJldHVybiBmYWxzZTtcbn1cbmV4cG9ydHMuY2hlY2tCeXBhc3MgPSBjaGVja0J5cGFzcztcbmZ1bmN0aW9uIGlzTG9vcGJhY2tBZGRyZXNzKGhvc3QpIHtcbiAgICBjb25zdCBob3N0TG93ZXIgPSBob3N0LnRvTG93ZXJDYXNlKCk7XG4gICAgcmV0dXJuIChob3N0TG93ZXIgPT09ICdsb2NhbGhvc3QnIHx8XG4gICAgICAgIGhvc3RMb3dlci5zdGFydHNXaXRoKCcxMjcuJykgfHxcbiAgICAgICAgaG9zdExvd2VyLnN0YXJ0c1dpdGgoJ1s6OjFdJykgfHxcbiAgICAgICAgaG9zdExvd2VyLnN0YXJ0c1dpdGgoJ1swOjA6MDowOjA6MDowOjFdJykpO1xufVxuY2xhc3MgRGVjb2RlZFVSTCBleHRlbmRzIFVSTCB7XG4gICAgY29uc3RydWN0b3IodXJsLCBiYXNlKSB7XG4gICAgICAgIHN1cGVyKHVybCwgYmFzZSk7XG4gICAgICAgIHRoaXMuX2RlY29kZWRVc2VybmFtZSA9IGRlY29kZVVSSUNvbXBvbmVudChzdXBlci51c2VybmFtZSk7XG4gICAgICAgIHRoaXMuX2RlY29kZWRQYXNzd29yZCA9IGRlY29kZVVSSUNvbXBvbmVudChzdXBlci5wYXNzd29yZCk7XG4gICAgfVxuICAgIGdldCB1c2VybmFtZSgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX2RlY29kZWRVc2VybmFtZTtcbiAgICB9XG4gICAgZ2V0IHBhc3N3b3JkKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5fZGVjb2RlZFBhc3N3b3JkO1xuICAgIH1cbn1cbi8vIyBzb3VyY2VNYXBwaW5nVVJMPXByb3h5LmpzLm1hcCIsCiAgICAiJ3VzZSBzdHJpY3QnO1xuXG52YXIgbmV0ID0gcmVxdWlyZSgnbmV0Jyk7XG52YXIgdGxzID0gcmVxdWlyZSgndGxzJyk7XG52YXIgaHR0cCA9IHJlcXVpcmUoJ2h0dHAnKTtcbnZhciBodHRwcyA9IHJlcXVpcmUoJ2h0dHBzJyk7XG52YXIgZXZlbnRzID0gcmVxdWlyZSgnZXZlbnRzJyk7XG52YXIgYXNzZXJ0ID0gcmVxdWlyZSgnYXNzZXJ0Jyk7XG52YXIgdXRpbCA9IHJlcXVpcmUoJ3V0aWwnKTtcblxuXG5leHBvcnRzLmh0dHBPdmVySHR0cCA9IGh0dHBPdmVySHR0cDtcbmV4cG9ydHMuaHR0cHNPdmVySHR0cCA9IGh0dHBzT3Zlckh0dHA7XG5leHBvcnRzLmh0dHBPdmVySHR0cHMgPSBodHRwT3Zlckh0dHBzO1xuZXhwb3J0cy5odHRwc092ZXJIdHRwcyA9IGh0dHBzT3Zlckh0dHBzO1xuXG5cbmZ1bmN0aW9uIGh0dHBPdmVySHR0cChvcHRpb25zKSB7XG4gIHZhciBhZ2VudCA9IG5ldyBUdW5uZWxpbmdBZ2VudChvcHRpb25zKTtcbiAgYWdlbnQucmVxdWVzdCA9IGh0dHAucmVxdWVzdDtcbiAgcmV0dXJuIGFnZW50O1xufVxuXG5mdW5jdGlvbiBodHRwc092ZXJIdHRwKG9wdGlvbnMpIHtcbiAgdmFyIGFnZW50ID0gbmV3IFR1bm5lbGluZ0FnZW50KG9wdGlvbnMpO1xuICBhZ2VudC5yZXF1ZXN0ID0gaHR0cC5yZXF1ZXN0O1xuICBhZ2VudC5jcmVhdGVTb2NrZXQgPSBjcmVhdGVTZWN1cmVTb2NrZXQ7XG4gIGFnZW50LmRlZmF1bHRQb3J0ID0gNDQzO1xuICByZXR1cm4gYWdlbnQ7XG59XG5cbmZ1bmN0aW9uIGh0dHBPdmVySHR0cHMob3B0aW9ucykge1xuICB2YXIgYWdlbnQgPSBuZXcgVHVubmVsaW5nQWdlbnQob3B0aW9ucyk7XG4gIGFnZW50LnJlcXVlc3QgPSBodHRwcy5yZXF1ZXN0O1xuICByZXR1cm4gYWdlbnQ7XG59XG5cbmZ1bmN0aW9uIGh0dHBzT3Zlckh0dHBzKG9wdGlvbnMpIHtcbiAgdmFyIGFnZW50ID0gbmV3IFR1bm5lbGluZ0FnZW50KG9wdGlvbnMpO1xuICBhZ2VudC5yZXF1ZXN0ID0gaHR0cHMucmVxdWVzdDtcbiAgYWdlbnQuY3JlYXRlU29ja2V0ID0gY3JlYXRlU2VjdXJlU29ja2V0O1xuICBhZ2VudC5kZWZhdWx0UG9ydCA9IDQ0MztcbiAgcmV0dXJuIGFnZW50O1xufVxuXG5cbmZ1bmN0aW9uIFR1bm5lbGluZ0FnZW50KG9wdGlvbnMpIHtcbiAgdmFyIHNlbGYgPSB0aGlzO1xuICBzZWxmLm9wdGlvbnMgPSBvcHRpb25zIHx8IHt9O1xuICBzZWxmLnByb3h5T3B0aW9ucyA9IHNlbGYub3B0aW9ucy5wcm94eSB8fCB7fTtcbiAgc2VsZi5tYXhTb2NrZXRzID0gc2VsZi5vcHRpb25zLm1heFNvY2tldHMgfHwgaHR0cC5BZ2VudC5kZWZhdWx0TWF4U29ja2V0cztcbiAgc2VsZi5yZXF1ZXN0cyA9IFtdO1xuICBzZWxmLnNvY2tldHMgPSBbXTtcblxuICBzZWxmLm9uKCdmcmVlJywgZnVuY3Rpb24gb25GcmVlKHNvY2tldCwgaG9zdCwgcG9ydCwgbG9jYWxBZGRyZXNzKSB7XG4gICAgdmFyIG9wdGlvbnMgPSB0b09wdGlvbnMoaG9zdCwgcG9ydCwgbG9jYWxBZGRyZXNzKTtcbiAgICBmb3IgKHZhciBpID0gMCwgbGVuID0gc2VsZi5yZXF1ZXN0cy5sZW5ndGg7IGkgPCBsZW47ICsraSkge1xuICAgICAgdmFyIHBlbmRpbmcgPSBzZWxmLnJlcXVlc3RzW2ldO1xuICAgICAgaWYgKHBlbmRpbmcuaG9zdCA9PT0gb3B0aW9ucy5ob3N0ICYmIHBlbmRpbmcucG9ydCA9PT0gb3B0aW9ucy5wb3J0KSB7XG4gICAgICAgIC8vIERldGVjdCB0aGUgcmVxdWVzdCB0byBjb25uZWN0IHNhbWUgb3JpZ2luIHNlcnZlcixcbiAgICAgICAgLy8gcmV1c2UgdGhlIGNvbm5lY3Rpb24uXG4gICAgICAgIHNlbGYucmVxdWVzdHMuc3BsaWNlKGksIDEpO1xuICAgICAgICBwZW5kaW5nLnJlcXVlc3Qub25Tb2NrZXQoc29ja2V0KTtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuICAgIH1cbiAgICBzb2NrZXQuZGVzdHJveSgpO1xuICAgIHNlbGYucmVtb3ZlU29ja2V0KHNvY2tldCk7XG4gIH0pO1xufVxudXRpbC5pbmhlcml0cyhUdW5uZWxpbmdBZ2VudCwgZXZlbnRzLkV2ZW50RW1pdHRlcik7XG5cblR1bm5lbGluZ0FnZW50LnByb3RvdHlwZS5hZGRSZXF1ZXN0ID0gZnVuY3Rpb24gYWRkUmVxdWVzdChyZXEsIGhvc3QsIHBvcnQsIGxvY2FsQWRkcmVzcykge1xuICB2YXIgc2VsZiA9IHRoaXM7XG4gIHZhciBvcHRpb25zID0gbWVyZ2VPcHRpb25zKHtyZXF1ZXN0OiByZXF9LCBzZWxmLm9wdGlvbnMsIHRvT3B0aW9ucyhob3N0LCBwb3J0LCBsb2NhbEFkZHJlc3MpKTtcblxuICBpZiAoc2VsZi5zb2NrZXRzLmxlbmd0aCA+PSB0aGlzLm1heFNvY2tldHMpIHtcbiAgICAvLyBXZSBhcmUgb3ZlciBsaW1pdCBzbyB3ZSdsbCBhZGQgaXQgdG8gdGhlIHF1ZXVlLlxuICAgIHNlbGYucmVxdWVzdHMucHVzaChvcHRpb25zKTtcbiAgICByZXR1cm47XG4gIH1cblxuICAvLyBJZiB3ZSBhcmUgdW5kZXIgbWF4U29ja2V0cyBjcmVhdGUgYSBuZXcgb25lLlxuICBzZWxmLmNyZWF0ZVNvY2tldChvcHRpb25zLCBmdW5jdGlvbihzb2NrZXQpIHtcbiAgICBzb2NrZXQub24oJ2ZyZWUnLCBvbkZyZWUpO1xuICAgIHNvY2tldC5vbignY2xvc2UnLCBvbkNsb3NlT3JSZW1vdmUpO1xuICAgIHNvY2tldC5vbignYWdlbnRSZW1vdmUnLCBvbkNsb3NlT3JSZW1vdmUpO1xuICAgIHJlcS5vblNvY2tldChzb2NrZXQpO1xuXG4gICAgZnVuY3Rpb24gb25GcmVlKCkge1xuICAgICAgc2VsZi5lbWl0KCdmcmVlJywgc29ja2V0LCBvcHRpb25zKTtcbiAgICB9XG5cbiAgICBmdW5jdGlvbiBvbkNsb3NlT3JSZW1vdmUoZXJyKSB7XG4gICAgICBzZWxmLnJlbW92ZVNvY2tldChzb2NrZXQpO1xuICAgICAgc29ja2V0LnJlbW92ZUxpc3RlbmVyKCdmcmVlJywgb25GcmVlKTtcbiAgICAgIHNvY2tldC5yZW1vdmVMaXN0ZW5lcignY2xvc2UnLCBvbkNsb3NlT3JSZW1vdmUpO1xuICAgICAgc29ja2V0LnJlbW92ZUxpc3RlbmVyKCdhZ2VudFJlbW92ZScsIG9uQ2xvc2VPclJlbW92ZSk7XG4gICAgfVxuICB9KTtcbn07XG5cblR1bm5lbGluZ0FnZW50LnByb3RvdHlwZS5jcmVhdGVTb2NrZXQgPSBmdW5jdGlvbiBjcmVhdGVTb2NrZXQob3B0aW9ucywgY2IpIHtcbiAgdmFyIHNlbGYgPSB0aGlzO1xuICB2YXIgcGxhY2Vob2xkZXIgPSB7fTtcbiAgc2VsZi5zb2NrZXRzLnB1c2gocGxhY2Vob2xkZXIpO1xuXG4gIHZhciBjb25uZWN0T3B0aW9ucyA9IG1lcmdlT3B0aW9ucyh7fSwgc2VsZi5wcm94eU9wdGlvbnMsIHtcbiAgICBtZXRob2Q6ICdDT05ORUNUJyxcbiAgICBwYXRoOiBvcHRpb25zLmhvc3QgKyAnOicgKyBvcHRpb25zLnBvcnQsXG4gICAgYWdlbnQ6IGZhbHNlLFxuICAgIGhlYWRlcnM6IHtcbiAgICAgIGhvc3Q6IG9wdGlvbnMuaG9zdCArICc6JyArIG9wdGlvbnMucG9ydFxuICAgIH1cbiAgfSk7XG4gIGlmIChvcHRpb25zLmxvY2FsQWRkcmVzcykge1xuICAgIGNvbm5lY3RPcHRpb25zLmxvY2FsQWRkcmVzcyA9IG9wdGlvbnMubG9jYWxBZGRyZXNzO1xuICB9XG4gIGlmIChjb25uZWN0T3B0aW9ucy5wcm94eUF1dGgpIHtcbiAgICBjb25uZWN0T3B0aW9ucy5oZWFkZXJzID0gY29ubmVjdE9wdGlvbnMuaGVhZGVycyB8fCB7fTtcbiAgICBjb25uZWN0T3B0aW9ucy5oZWFkZXJzWydQcm94eS1BdXRob3JpemF0aW9uJ10gPSAnQmFzaWMgJyArXG4gICAgICAgIG5ldyBCdWZmZXIoY29ubmVjdE9wdGlvbnMucHJveHlBdXRoKS50b1N0cmluZygnYmFzZTY0Jyk7XG4gIH1cblxuICBkZWJ1ZygnbWFraW5nIENPTk5FQ1QgcmVxdWVzdCcpO1xuICB2YXIgY29ubmVjdFJlcSA9IHNlbGYucmVxdWVzdChjb25uZWN0T3B0aW9ucyk7XG4gIGNvbm5lY3RSZXEudXNlQ2h1bmtlZEVuY29kaW5nQnlEZWZhdWx0ID0gZmFsc2U7IC8vIGZvciB2MC42XG4gIGNvbm5lY3RSZXEub25jZSgncmVzcG9uc2UnLCBvblJlc3BvbnNlKTsgLy8gZm9yIHYwLjZcbiAgY29ubmVjdFJlcS5vbmNlKCd1cGdyYWRlJywgb25VcGdyYWRlKTsgICAvLyBmb3IgdjAuNlxuICBjb25uZWN0UmVxLm9uY2UoJ2Nvbm5lY3QnLCBvbkNvbm5lY3QpOyAgIC8vIGZvciB2MC43IG9yIGxhdGVyXG4gIGNvbm5lY3RSZXEub25jZSgnZXJyb3InLCBvbkVycm9yKTtcbiAgY29ubmVjdFJlcS5lbmQoKTtcblxuICBmdW5jdGlvbiBvblJlc3BvbnNlKHJlcykge1xuICAgIC8vIFZlcnkgaGFja3kuIFRoaXMgaXMgbmVjZXNzYXJ5IHRvIGF2b2lkIGh0dHAtcGFyc2VyIGxlYWtzLlxuICAgIHJlcy51cGdyYWRlID0gdHJ1ZTtcbiAgfVxuXG4gIGZ1bmN0aW9uIG9uVXBncmFkZShyZXMsIHNvY2tldCwgaGVhZCkge1xuICAgIC8vIEhhY2t5LlxuICAgIHByb2Nlc3MubmV4dFRpY2soZnVuY3Rpb24oKSB7XG4gICAgICBvbkNvbm5lY3QocmVzLCBzb2NrZXQsIGhlYWQpO1xuICAgIH0pO1xuICB9XG5cbiAgZnVuY3Rpb24gb25Db25uZWN0KHJlcywgc29ja2V0LCBoZWFkKSB7XG4gICAgY29ubmVjdFJlcS5yZW1vdmVBbGxMaXN0ZW5lcnMoKTtcbiAgICBzb2NrZXQucmVtb3ZlQWxsTGlzdGVuZXJzKCk7XG5cbiAgICBpZiAocmVzLnN0YXR1c0NvZGUgIT09IDIwMCkge1xuICAgICAgZGVidWcoJ3R1bm5lbGluZyBzb2NrZXQgY291bGQgbm90IGJlIGVzdGFibGlzaGVkLCBzdGF0dXNDb2RlPSVkJyxcbiAgICAgICAgcmVzLnN0YXR1c0NvZGUpO1xuICAgICAgc29ja2V0LmRlc3Ryb3koKTtcbiAgICAgIHZhciBlcnJvciA9IG5ldyBFcnJvcigndHVubmVsaW5nIHNvY2tldCBjb3VsZCBub3QgYmUgZXN0YWJsaXNoZWQsICcgK1xuICAgICAgICAnc3RhdHVzQ29kZT0nICsgcmVzLnN0YXR1c0NvZGUpO1xuICAgICAgZXJyb3IuY29kZSA9ICdFQ09OTlJFU0VUJztcbiAgICAgIG9wdGlvbnMucmVxdWVzdC5lbWl0KCdlcnJvcicsIGVycm9yKTtcbiAgICAgIHNlbGYucmVtb3ZlU29ja2V0KHBsYWNlaG9sZGVyKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgaWYgKGhlYWQubGVuZ3RoID4gMCkge1xuICAgICAgZGVidWcoJ2dvdCBpbGxlZ2FsIHJlc3BvbnNlIGJvZHkgZnJvbSBwcm94eScpO1xuICAgICAgc29ja2V0LmRlc3Ryb3koKTtcbiAgICAgIHZhciBlcnJvciA9IG5ldyBFcnJvcignZ290IGlsbGVnYWwgcmVzcG9uc2UgYm9keSBmcm9tIHByb3h5Jyk7XG4gICAgICBlcnJvci5jb2RlID0gJ0VDT05OUkVTRVQnO1xuICAgICAgb3B0aW9ucy5yZXF1ZXN0LmVtaXQoJ2Vycm9yJywgZXJyb3IpO1xuICAgICAgc2VsZi5yZW1vdmVTb2NrZXQocGxhY2Vob2xkZXIpO1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBkZWJ1ZygndHVubmVsaW5nIGNvbm5lY3Rpb24gaGFzIGVzdGFibGlzaGVkJyk7XG4gICAgc2VsZi5zb2NrZXRzW3NlbGYuc29ja2V0cy5pbmRleE9mKHBsYWNlaG9sZGVyKV0gPSBzb2NrZXQ7XG4gICAgcmV0dXJuIGNiKHNvY2tldCk7XG4gIH1cblxuICBmdW5jdGlvbiBvbkVycm9yKGNhdXNlKSB7XG4gICAgY29ubmVjdFJlcS5yZW1vdmVBbGxMaXN0ZW5lcnMoKTtcblxuICAgIGRlYnVnKCd0dW5uZWxpbmcgc29ja2V0IGNvdWxkIG5vdCBiZSBlc3RhYmxpc2hlZCwgY2F1c2U9JXNcXG4nLFxuICAgICAgICAgIGNhdXNlLm1lc3NhZ2UsIGNhdXNlLnN0YWNrKTtcbiAgICB2YXIgZXJyb3IgPSBuZXcgRXJyb3IoJ3R1bm5lbGluZyBzb2NrZXQgY291bGQgbm90IGJlIGVzdGFibGlzaGVkLCAnICtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgJ2NhdXNlPScgKyBjYXVzZS5tZXNzYWdlKTtcbiAgICBlcnJvci5jb2RlID0gJ0VDT05OUkVTRVQnO1xuICAgIG9wdGlvbnMucmVxdWVzdC5lbWl0KCdlcnJvcicsIGVycm9yKTtcbiAgICBzZWxmLnJlbW92ZVNvY2tldChwbGFjZWhvbGRlcik7XG4gIH1cbn07XG5cblR1bm5lbGluZ0FnZW50LnByb3RvdHlwZS5yZW1vdmVTb2NrZXQgPSBmdW5jdGlvbiByZW1vdmVTb2NrZXQoc29ja2V0KSB7XG4gIHZhciBwb3MgPSB0aGlzLnNvY2tldHMuaW5kZXhPZihzb2NrZXQpXG4gIGlmIChwb3MgPT09IC0xKSB7XG4gICAgcmV0dXJuO1xuICB9XG4gIHRoaXMuc29ja2V0cy5zcGxpY2UocG9zLCAxKTtcblxuICB2YXIgcGVuZGluZyA9IHRoaXMucmVxdWVzdHMuc2hpZnQoKTtcbiAgaWYgKHBlbmRpbmcpIHtcbiAgICAvLyBJZiB3ZSBoYXZlIHBlbmRpbmcgcmVxdWVzdHMgYW5kIGEgc29ja2V0IGdldHMgY2xvc2VkIGEgbmV3IG9uZVxuICAgIC8vIG5lZWRzIHRvIGJlIGNyZWF0ZWQgdG8gdGFrZSBvdmVyIGluIHRoZSBwb29sIGZvciB0aGUgb25lIHRoYXQgY2xvc2VkLlxuICAgIHRoaXMuY3JlYXRlU29ja2V0KHBlbmRpbmcsIGZ1bmN0aW9uKHNvY2tldCkge1xuICAgICAgcGVuZGluZy5yZXF1ZXN0Lm9uU29ja2V0KHNvY2tldCk7XG4gICAgfSk7XG4gIH1cbn07XG5cbmZ1bmN0aW9uIGNyZWF0ZVNlY3VyZVNvY2tldChvcHRpb25zLCBjYikge1xuICB2YXIgc2VsZiA9IHRoaXM7XG4gIFR1bm5lbGluZ0FnZW50LnByb3RvdHlwZS5jcmVhdGVTb2NrZXQuY2FsbChzZWxmLCBvcHRpb25zLCBmdW5jdGlvbihzb2NrZXQpIHtcbiAgICB2YXIgaG9zdEhlYWRlciA9IG9wdGlvbnMucmVxdWVzdC5nZXRIZWFkZXIoJ2hvc3QnKTtcbiAgICB2YXIgdGxzT3B0aW9ucyA9IG1lcmdlT3B0aW9ucyh7fSwgc2VsZi5vcHRpb25zLCB7XG4gICAgICBzb2NrZXQ6IHNvY2tldCxcbiAgICAgIHNlcnZlcm5hbWU6IGhvc3RIZWFkZXIgPyBob3N0SGVhZGVyLnJlcGxhY2UoLzouKiQvLCAnJykgOiBvcHRpb25zLmhvc3RcbiAgICB9KTtcblxuICAgIC8vIDAgaXMgZHVtbXkgcG9ydCBmb3IgdjAuNlxuICAgIHZhciBzZWN1cmVTb2NrZXQgPSB0bHMuY29ubmVjdCgwLCB0bHNPcHRpb25zKTtcbiAgICBzZWxmLnNvY2tldHNbc2VsZi5zb2NrZXRzLmluZGV4T2Yoc29ja2V0KV0gPSBzZWN1cmVTb2NrZXQ7XG4gICAgY2Ioc2VjdXJlU29ja2V0KTtcbiAgfSk7XG59XG5cblxuZnVuY3Rpb24gdG9PcHRpb25zKGhvc3QsIHBvcnQsIGxvY2FsQWRkcmVzcykge1xuICBpZiAodHlwZW9mIGhvc3QgPT09ICdzdHJpbmcnKSB7IC8vIHNpbmNlIHYwLjEwXG4gICAgcmV0dXJuIHtcbiAgICAgIGhvc3Q6IGhvc3QsXG4gICAgICBwb3J0OiBwb3J0LFxuICAgICAgbG9jYWxBZGRyZXNzOiBsb2NhbEFkZHJlc3NcbiAgICB9O1xuICB9XG4gIHJldHVybiBob3N0OyAvLyBmb3IgdjAuMTEgb3IgbGF0ZXJcbn1cblxuZnVuY3Rpb24gbWVyZ2VPcHRpb25zKHRhcmdldCkge1xuICBmb3IgKHZhciBpID0gMSwgbGVuID0gYXJndW1lbnRzLmxlbmd0aDsgaSA8IGxlbjsgKytpKSB7XG4gICAgdmFyIG92ZXJyaWRlcyA9IGFyZ3VtZW50c1tpXTtcbiAgICBpZiAodHlwZW9mIG92ZXJyaWRlcyA9PT0gJ29iamVjdCcpIHtcbiAgICAgIHZhciBrZXlzID0gT2JqZWN0LmtleXMob3ZlcnJpZGVzKTtcbiAgICAgIGZvciAodmFyIGogPSAwLCBrZXlMZW4gPSBrZXlzLmxlbmd0aDsgaiA8IGtleUxlbjsgKytqKSB7XG4gICAgICAgIHZhciBrID0ga2V5c1tqXTtcbiAgICAgICAgaWYgKG92ZXJyaWRlc1trXSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgdGFyZ2V0W2tdID0gb3ZlcnJpZGVzW2tdO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICB9XG4gIHJldHVybiB0YXJnZXQ7XG59XG5cblxudmFyIGRlYnVnO1xuaWYgKHByb2Nlc3MuZW52Lk5PREVfREVCVUcgJiYgL1xcYnR1bm5lbFxcYi8udGVzdChwcm9jZXNzLmVudi5OT0RFX0RFQlVHKSkge1xuICBkZWJ1ZyA9IGZ1bmN0aW9uKCkge1xuICAgIHZhciBhcmdzID0gQXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTtcbiAgICBpZiAodHlwZW9mIGFyZ3NbMF0gPT09ICdzdHJpbmcnKSB7XG4gICAgICBhcmdzWzBdID0gJ1RVTk5FTDogJyArIGFyZ3NbMF07XG4gICAgfSBlbHNlIHtcbiAgICAgIGFyZ3MudW5zaGlmdCgnVFVOTkVMOicpO1xuICAgIH1cbiAgICBjb25zb2xlLmVycm9yLmFwcGx5KGNvbnNvbGUsIGFyZ3MpO1xuICB9XG59IGVsc2Uge1xuICBkZWJ1ZyA9IGZ1bmN0aW9uKCkge307XG59XG5leHBvcnRzLmRlYnVnID0gZGVidWc7IC8vIGZvciB0ZXN0XG4iLAogICAgIm1vZHVsZS5leHBvcnRzID0gcmVxdWlyZSgnLi9saWIvdHVubmVsJyk7XG4iLAogICAgIm1vZHVsZS5leHBvcnRzID0ge1xuICBrQ2xvc2U6IFN5bWJvbCgnY2xvc2UnKSxcbiAga0Rlc3Ryb3k6IFN5bWJvbCgnZGVzdHJveScpLFxuICBrRGlzcGF0Y2g6IFN5bWJvbCgnZGlzcGF0Y2gnKSxcbiAga1VybDogU3ltYm9sKCd1cmwnKSxcbiAga1dyaXRpbmc6IFN5bWJvbCgnd3JpdGluZycpLFxuICBrUmVzdW1pbmc6IFN5bWJvbCgncmVzdW1pbmcnKSxcbiAga1F1ZXVlOiBTeW1ib2woJ3F1ZXVlJyksXG4gIGtDb25uZWN0OiBTeW1ib2woJ2Nvbm5lY3QnKSxcbiAga0Nvbm5lY3Rpbmc6IFN5bWJvbCgnY29ubmVjdGluZycpLFxuICBrSGVhZGVyc0xpc3Q6IFN5bWJvbCgnaGVhZGVycyBsaXN0JyksXG4gIGtLZWVwQWxpdmVEZWZhdWx0VGltZW91dDogU3ltYm9sKCdkZWZhdWx0IGtlZXAgYWxpdmUgdGltZW91dCcpLFxuICBrS2VlcEFsaXZlTWF4VGltZW91dDogU3ltYm9sKCdtYXgga2VlcCBhbGl2ZSB0aW1lb3V0JyksXG4gIGtLZWVwQWxpdmVUaW1lb3V0VGhyZXNob2xkOiBTeW1ib2woJ2tlZXAgYWxpdmUgdGltZW91dCB0aHJlc2hvbGQnKSxcbiAga0tlZXBBbGl2ZVRpbWVvdXRWYWx1ZTogU3ltYm9sKCdrZWVwIGFsaXZlIHRpbWVvdXQnKSxcbiAga0tlZXBBbGl2ZTogU3ltYm9sKCdrZWVwIGFsaXZlJyksXG4gIGtIZWFkZXJzVGltZW91dDogU3ltYm9sKCdoZWFkZXJzIHRpbWVvdXQnKSxcbiAga0JvZHlUaW1lb3V0OiBTeW1ib2woJ2JvZHkgdGltZW91dCcpLFxuICBrU2VydmVyTmFtZTogU3ltYm9sKCdzZXJ2ZXIgbmFtZScpLFxuICBrTG9jYWxBZGRyZXNzOiBTeW1ib2woJ2xvY2FsIGFkZHJlc3MnKSxcbiAga0hvc3Q6IFN5bWJvbCgnaG9zdCcpLFxuICBrTm9SZWY6IFN5bWJvbCgnbm8gcmVmJyksXG4gIGtCb2R5VXNlZDogU3ltYm9sKCd1c2VkJyksXG4gIGtSdW5uaW5nOiBTeW1ib2woJ3J1bm5pbmcnKSxcbiAga0Jsb2NraW5nOiBTeW1ib2woJ2Jsb2NraW5nJyksXG4gIGtQZW5kaW5nOiBTeW1ib2woJ3BlbmRpbmcnKSxcbiAga1NpemU6IFN5bWJvbCgnc2l6ZScpLFxuICBrQnVzeTogU3ltYm9sKCdidXN5JyksXG4gIGtRdWV1ZWQ6IFN5bWJvbCgncXVldWVkJyksXG4gIGtGcmVlOiBTeW1ib2woJ2ZyZWUnKSxcbiAga0Nvbm5lY3RlZDogU3ltYm9sKCdjb25uZWN0ZWQnKSxcbiAga0Nsb3NlZDogU3ltYm9sKCdjbG9zZWQnKSxcbiAga05lZWREcmFpbjogU3ltYm9sKCduZWVkIGRyYWluJyksXG4gIGtSZXNldDogU3ltYm9sKCdyZXNldCcpLFxuICBrRGVzdHJveWVkOiBTeW1ib2wuZm9yKCdub2RlanMuc3RyZWFtLmRlc3Ryb3llZCcpLFxuICBrTWF4SGVhZGVyc1NpemU6IFN5bWJvbCgnbWF4IGhlYWRlcnMgc2l6ZScpLFxuICBrUnVubmluZ0lkeDogU3ltYm9sKCdydW5uaW5nIGluZGV4JyksXG4gIGtQZW5kaW5nSWR4OiBTeW1ib2woJ3BlbmRpbmcgaW5kZXgnKSxcbiAga0Vycm9yOiBTeW1ib2woJ2Vycm9yJyksXG4gIGtDbGllbnRzOiBTeW1ib2woJ2NsaWVudHMnKSxcbiAga0NsaWVudDogU3ltYm9sKCdjbGllbnQnKSxcbiAga1BhcnNlcjogU3ltYm9sKCdwYXJzZXInKSxcbiAga09uRGVzdHJveWVkOiBTeW1ib2woJ2Rlc3Ryb3kgY2FsbGJhY2tzJyksXG4gIGtQaXBlbGluaW5nOiBTeW1ib2woJ3BpcGVsaW5pbmcnKSxcbiAga1NvY2tldDogU3ltYm9sKCdzb2NrZXQnKSxcbiAga0hvc3RIZWFkZXI6IFN5bWJvbCgnaG9zdCBoZWFkZXInKSxcbiAga0Nvbm5lY3RvcjogU3ltYm9sKCdjb25uZWN0b3InKSxcbiAga1N0cmljdENvbnRlbnRMZW5ndGg6IFN5bWJvbCgnc3RyaWN0IGNvbnRlbnQgbGVuZ3RoJyksXG4gIGtNYXhSZWRpcmVjdGlvbnM6IFN5bWJvbCgnbWF4UmVkaXJlY3Rpb25zJyksXG4gIGtNYXhSZXF1ZXN0czogU3ltYm9sKCdtYXhSZXF1ZXN0c1BlckNsaWVudCcpLFxuICBrUHJveHk6IFN5bWJvbCgncHJveHkgYWdlbnQgb3B0aW9ucycpLFxuICBrQ291bnRlcjogU3ltYm9sKCdzb2NrZXQgcmVxdWVzdCBjb3VudGVyJyksXG4gIGtJbnRlcmNlcHRvcnM6IFN5bWJvbCgnZGlzcGF0Y2ggaW50ZXJjZXB0b3JzJyksXG4gIGtNYXhSZXNwb25zZVNpemU6IFN5bWJvbCgnbWF4IHJlc3BvbnNlIHNpemUnKSxcbiAga0hUVFAyU2Vzc2lvbjogU3ltYm9sKCdodHRwMlNlc3Npb24nKSxcbiAga0hUVFAyU2Vzc2lvblN0YXRlOiBTeW1ib2woJ2h0dHAyU2Vzc2lvbiBzdGF0ZScpLFxuICBrSFRUUDJCdWlsZFJlcXVlc3Q6IFN5bWJvbCgnaHR0cDIgYnVpbGQgcmVxdWVzdCcpLFxuICBrSFRUUDFCdWlsZFJlcXVlc3Q6IFN5bWJvbCgnaHR0cDEgYnVpbGQgcmVxdWVzdCcpLFxuICBrSFRUUDJDb3B5SGVhZGVyczogU3ltYm9sKCdodHRwMiBjb3B5IGhlYWRlcnMnKSxcbiAga0hUVFBDb25uVmVyc2lvbjogU3ltYm9sKCdodHRwIGNvbm5lY3Rpb24gdmVyc2lvbicpLFxuICBrUmV0cnlIYW5kbGVyRGVmYXVsdFJldHJ5OiBTeW1ib2woJ3JldHJ5IGFnZW50IGRlZmF1bHQgcmV0cnknKSxcbiAga0NvbnN0cnVjdDogU3ltYm9sKCdjb25zdHJ1Y3RhYmxlJylcbn1cbiIsCiAgICAiJ3VzZSBzdHJpY3QnXG5cbmNsYXNzIFVuZGljaUVycm9yIGV4dGVuZHMgRXJyb3Ige1xuICBjb25zdHJ1Y3RvciAobWVzc2FnZSkge1xuICAgIHN1cGVyKG1lc3NhZ2UpXG4gICAgdGhpcy5uYW1lID0gJ1VuZGljaUVycm9yJ1xuICAgIHRoaXMuY29kZSA9ICdVTkRfRVJSJ1xuICB9XG59XG5cbmNsYXNzIENvbm5lY3RUaW1lb3V0RXJyb3IgZXh0ZW5kcyBVbmRpY2lFcnJvciB7XG4gIGNvbnN0cnVjdG9yIChtZXNzYWdlKSB7XG4gICAgc3VwZXIobWVzc2FnZSlcbiAgICBFcnJvci5jYXB0dXJlU3RhY2tUcmFjZSh0aGlzLCBDb25uZWN0VGltZW91dEVycm9yKVxuICAgIHRoaXMubmFtZSA9ICdDb25uZWN0VGltZW91dEVycm9yJ1xuICAgIHRoaXMubWVzc2FnZSA9IG1lc3NhZ2UgfHwgJ0Nvbm5lY3QgVGltZW91dCBFcnJvcidcbiAgICB0aGlzLmNvZGUgPSAnVU5EX0VSUl9DT05ORUNUX1RJTUVPVVQnXG4gIH1cbn1cblxuY2xhc3MgSGVhZGVyc1RpbWVvdXRFcnJvciBleHRlbmRzIFVuZGljaUVycm9yIHtcbiAgY29uc3RydWN0b3IgKG1lc3NhZ2UpIHtcbiAgICBzdXBlcihtZXNzYWdlKVxuICAgIEVycm9yLmNhcHR1cmVTdGFja1RyYWNlKHRoaXMsIEhlYWRlcnNUaW1lb3V0RXJyb3IpXG4gICAgdGhpcy5uYW1lID0gJ0hlYWRlcnNUaW1lb3V0RXJyb3InXG4gICAgdGhpcy5tZXNzYWdlID0gbWVzc2FnZSB8fCAnSGVhZGVycyBUaW1lb3V0IEVycm9yJ1xuICAgIHRoaXMuY29kZSA9ICdVTkRfRVJSX0hFQURFUlNfVElNRU9VVCdcbiAgfVxufVxuXG5jbGFzcyBIZWFkZXJzT3ZlcmZsb3dFcnJvciBleHRlbmRzIFVuZGljaUVycm9yIHtcbiAgY29uc3RydWN0b3IgKG1lc3NhZ2UpIHtcbiAgICBzdXBlcihtZXNzYWdlKVxuICAgIEVycm9yLmNhcHR1cmVTdGFja1RyYWNlKHRoaXMsIEhlYWRlcnNPdmVyZmxvd0Vycm9yKVxuICAgIHRoaXMubmFtZSA9ICdIZWFkZXJzT3ZlcmZsb3dFcnJvcidcbiAgICB0aGlzLm1lc3NhZ2UgPSBtZXNzYWdlIHx8ICdIZWFkZXJzIE92ZXJmbG93IEVycm9yJ1xuICAgIHRoaXMuY29kZSA9ICdVTkRfRVJSX0hFQURFUlNfT1ZFUkZMT1cnXG4gIH1cbn1cblxuY2xhc3MgQm9keVRpbWVvdXRFcnJvciBleHRlbmRzIFVuZGljaUVycm9yIHtcbiAgY29uc3RydWN0b3IgKG1lc3NhZ2UpIHtcbiAgICBzdXBlcihtZXNzYWdlKVxuICAgIEVycm9yLmNhcHR1cmVTdGFja1RyYWNlKHRoaXMsIEJvZHlUaW1lb3V0RXJyb3IpXG4gICAgdGhpcy5uYW1lID0gJ0JvZHlUaW1lb3V0RXJyb3InXG4gICAgdGhpcy5tZXNzYWdlID0gbWVzc2FnZSB8fCAnQm9keSBUaW1lb3V0IEVycm9yJ1xuICAgIHRoaXMuY29kZSA9ICdVTkRfRVJSX0JPRFlfVElNRU9VVCdcbiAgfVxufVxuXG5jbGFzcyBSZXNwb25zZVN0YXR1c0NvZGVFcnJvciBleHRlbmRzIFVuZGljaUVycm9yIHtcbiAgY29uc3RydWN0b3IgKG1lc3NhZ2UsIHN0YXR1c0NvZGUsIGhlYWRlcnMsIGJvZHkpIHtcbiAgICBzdXBlcihtZXNzYWdlKVxuICAgIEVycm9yLmNhcHR1cmVTdGFja1RyYWNlKHRoaXMsIFJlc3BvbnNlU3RhdHVzQ29kZUVycm9yKVxuICAgIHRoaXMubmFtZSA9ICdSZXNwb25zZVN0YXR1c0NvZGVFcnJvcidcbiAgICB0aGlzLm1lc3NhZ2UgPSBtZXNzYWdlIHx8ICdSZXNwb25zZSBTdGF0dXMgQ29kZSBFcnJvcidcbiAgICB0aGlzLmNvZGUgPSAnVU5EX0VSUl9SRVNQT05TRV9TVEFUVVNfQ09ERSdcbiAgICB0aGlzLmJvZHkgPSBib2R5XG4gICAgdGhpcy5zdGF0dXMgPSBzdGF0dXNDb2RlXG4gICAgdGhpcy5zdGF0dXNDb2RlID0gc3RhdHVzQ29kZVxuICAgIHRoaXMuaGVhZGVycyA9IGhlYWRlcnNcbiAgfVxufVxuXG5jbGFzcyBJbnZhbGlkQXJndW1lbnRFcnJvciBleHRlbmRzIFVuZGljaUVycm9yIHtcbiAgY29uc3RydWN0b3IgKG1lc3NhZ2UpIHtcbiAgICBzdXBlcihtZXNzYWdlKVxuICAgIEVycm9yLmNhcHR1cmVTdGFja1RyYWNlKHRoaXMsIEludmFsaWRBcmd1bWVudEVycm9yKVxuICAgIHRoaXMubmFtZSA9ICdJbnZhbGlkQXJndW1lbnRFcnJvcidcbiAgICB0aGlzLm1lc3NhZ2UgPSBtZXNzYWdlIHx8ICdJbnZhbGlkIEFyZ3VtZW50IEVycm9yJ1xuICAgIHRoaXMuY29kZSA9ICdVTkRfRVJSX0lOVkFMSURfQVJHJ1xuICB9XG59XG5cbmNsYXNzIEludmFsaWRSZXR1cm5WYWx1ZUVycm9yIGV4dGVuZHMgVW5kaWNpRXJyb3Ige1xuICBjb25zdHJ1Y3RvciAobWVzc2FnZSkge1xuICAgIHN1cGVyKG1lc3NhZ2UpXG4gICAgRXJyb3IuY2FwdHVyZVN0YWNrVHJhY2UodGhpcywgSW52YWxpZFJldHVyblZhbHVlRXJyb3IpXG4gICAgdGhpcy5uYW1lID0gJ0ludmFsaWRSZXR1cm5WYWx1ZUVycm9yJ1xuICAgIHRoaXMubWVzc2FnZSA9IG1lc3NhZ2UgfHwgJ0ludmFsaWQgUmV0dXJuIFZhbHVlIEVycm9yJ1xuICAgIHRoaXMuY29kZSA9ICdVTkRfRVJSX0lOVkFMSURfUkVUVVJOX1ZBTFVFJ1xuICB9XG59XG5cbmNsYXNzIFJlcXVlc3RBYm9ydGVkRXJyb3IgZXh0ZW5kcyBVbmRpY2lFcnJvciB7XG4gIGNvbnN0cnVjdG9yIChtZXNzYWdlKSB7XG4gICAgc3VwZXIobWVzc2FnZSlcbiAgICBFcnJvci5jYXB0dXJlU3RhY2tUcmFjZSh0aGlzLCBSZXF1ZXN0QWJvcnRlZEVycm9yKVxuICAgIHRoaXMubmFtZSA9ICdBYm9ydEVycm9yJ1xuICAgIHRoaXMubWVzc2FnZSA9IG1lc3NhZ2UgfHwgJ1JlcXVlc3QgYWJvcnRlZCdcbiAgICB0aGlzLmNvZGUgPSAnVU5EX0VSUl9BQk9SVEVEJ1xuICB9XG59XG5cbmNsYXNzIEluZm9ybWF0aW9uYWxFcnJvciBleHRlbmRzIFVuZGljaUVycm9yIHtcbiAgY29uc3RydWN0b3IgKG1lc3NhZ2UpIHtcbiAgICBzdXBlcihtZXNzYWdlKVxuICAgIEVycm9yLmNhcHR1cmVTdGFja1RyYWNlKHRoaXMsIEluZm9ybWF0aW9uYWxFcnJvcilcbiAgICB0aGlzLm5hbWUgPSAnSW5mb3JtYXRpb25hbEVycm9yJ1xuICAgIHRoaXMubWVzc2FnZSA9IG1lc3NhZ2UgfHwgJ1JlcXVlc3QgaW5mb3JtYXRpb24nXG4gICAgdGhpcy5jb2RlID0gJ1VORF9FUlJfSU5GTydcbiAgfVxufVxuXG5jbGFzcyBSZXF1ZXN0Q29udGVudExlbmd0aE1pc21hdGNoRXJyb3IgZXh0ZW5kcyBVbmRpY2lFcnJvciB7XG4gIGNvbnN0cnVjdG9yIChtZXNzYWdlKSB7XG4gICAgc3VwZXIobWVzc2FnZSlcbiAgICBFcnJvci5jYXB0dXJlU3RhY2tUcmFjZSh0aGlzLCBSZXF1ZXN0Q29udGVudExlbmd0aE1pc21hdGNoRXJyb3IpXG4gICAgdGhpcy5uYW1lID0gJ1JlcXVlc3RDb250ZW50TGVuZ3RoTWlzbWF0Y2hFcnJvcidcbiAgICB0aGlzLm1lc3NhZ2UgPSBtZXNzYWdlIHx8ICdSZXF1ZXN0IGJvZHkgbGVuZ3RoIGRvZXMgbm90IG1hdGNoIGNvbnRlbnQtbGVuZ3RoIGhlYWRlcidcbiAgICB0aGlzLmNvZGUgPSAnVU5EX0VSUl9SRVFfQ09OVEVOVF9MRU5HVEhfTUlTTUFUQ0gnXG4gIH1cbn1cblxuY2xhc3MgUmVzcG9uc2VDb250ZW50TGVuZ3RoTWlzbWF0Y2hFcnJvciBleHRlbmRzIFVuZGljaUVycm9yIHtcbiAgY29uc3RydWN0b3IgKG1lc3NhZ2UpIHtcbiAgICBzdXBlcihtZXNzYWdlKVxuICAgIEVycm9yLmNhcHR1cmVTdGFja1RyYWNlKHRoaXMsIFJlc3BvbnNlQ29udGVudExlbmd0aE1pc21hdGNoRXJyb3IpXG4gICAgdGhpcy5uYW1lID0gJ1Jlc3BvbnNlQ29udGVudExlbmd0aE1pc21hdGNoRXJyb3InXG4gICAgdGhpcy5tZXNzYWdlID0gbWVzc2FnZSB8fCAnUmVzcG9uc2UgYm9keSBsZW5ndGggZG9lcyBub3QgbWF0Y2ggY29udGVudC1sZW5ndGggaGVhZGVyJ1xuICAgIHRoaXMuY29kZSA9ICdVTkRfRVJSX1JFU19DT05URU5UX0xFTkdUSF9NSVNNQVRDSCdcbiAgfVxufVxuXG5jbGFzcyBDbGllbnREZXN0cm95ZWRFcnJvciBleHRlbmRzIFVuZGljaUVycm9yIHtcbiAgY29uc3RydWN0b3IgKG1lc3NhZ2UpIHtcbiAgICBzdXBlcihtZXNzYWdlKVxuICAgIEVycm9yLmNhcHR1cmVTdGFja1RyYWNlKHRoaXMsIENsaWVudERlc3Ryb3llZEVycm9yKVxuICAgIHRoaXMubmFtZSA9ICdDbGllbnREZXN0cm95ZWRFcnJvcidcbiAgICB0aGlzLm1lc3NhZ2UgPSBtZXNzYWdlIHx8ICdUaGUgY2xpZW50IGlzIGRlc3Ryb3llZCdcbiAgICB0aGlzLmNvZGUgPSAnVU5EX0VSUl9ERVNUUk9ZRUQnXG4gIH1cbn1cblxuY2xhc3MgQ2xpZW50Q2xvc2VkRXJyb3IgZXh0ZW5kcyBVbmRpY2lFcnJvciB7XG4gIGNvbnN0cnVjdG9yIChtZXNzYWdlKSB7XG4gICAgc3VwZXIobWVzc2FnZSlcbiAgICBFcnJvci5jYXB0dXJlU3RhY2tUcmFjZSh0aGlzLCBDbGllbnRDbG9zZWRFcnJvcilcbiAgICB0aGlzLm5hbWUgPSAnQ2xpZW50Q2xvc2VkRXJyb3InXG4gICAgdGhpcy5tZXNzYWdlID0gbWVzc2FnZSB8fCAnVGhlIGNsaWVudCBpcyBjbG9zZWQnXG4gICAgdGhpcy5jb2RlID0gJ1VORF9FUlJfQ0xPU0VEJ1xuICB9XG59XG5cbmNsYXNzIFNvY2tldEVycm9yIGV4dGVuZHMgVW5kaWNpRXJyb3Ige1xuICBjb25zdHJ1Y3RvciAobWVzc2FnZSwgc29ja2V0KSB7XG4gICAgc3VwZXIobWVzc2FnZSlcbiAgICBFcnJvci5jYXB0dXJlU3RhY2tUcmFjZSh0aGlzLCBTb2NrZXRFcnJvcilcbiAgICB0aGlzLm5hbWUgPSAnU29ja2V0RXJyb3InXG4gICAgdGhpcy5tZXNzYWdlID0gbWVzc2FnZSB8fCAnU29ja2V0IGVycm9yJ1xuICAgIHRoaXMuY29kZSA9ICdVTkRfRVJSX1NPQ0tFVCdcbiAgICB0aGlzLnNvY2tldCA9IHNvY2tldFxuICB9XG59XG5cbmNsYXNzIE5vdFN1cHBvcnRlZEVycm9yIGV4dGVuZHMgVW5kaWNpRXJyb3Ige1xuICBjb25zdHJ1Y3RvciAobWVzc2FnZSkge1xuICAgIHN1cGVyKG1lc3NhZ2UpXG4gICAgRXJyb3IuY2FwdHVyZVN0YWNrVHJhY2UodGhpcywgTm90U3VwcG9ydGVkRXJyb3IpXG4gICAgdGhpcy5uYW1lID0gJ05vdFN1cHBvcnRlZEVycm9yJ1xuICAgIHRoaXMubWVzc2FnZSA9IG1lc3NhZ2UgfHwgJ05vdCBzdXBwb3J0ZWQgZXJyb3InXG4gICAgdGhpcy5jb2RlID0gJ1VORF9FUlJfTk9UX1NVUFBPUlRFRCdcbiAgfVxufVxuXG5jbGFzcyBCYWxhbmNlZFBvb2xNaXNzaW5nVXBzdHJlYW1FcnJvciBleHRlbmRzIFVuZGljaUVycm9yIHtcbiAgY29uc3RydWN0b3IgKG1lc3NhZ2UpIHtcbiAgICBzdXBlcihtZXNzYWdlKVxuICAgIEVycm9yLmNhcHR1cmVTdGFja1RyYWNlKHRoaXMsIE5vdFN1cHBvcnRlZEVycm9yKVxuICAgIHRoaXMubmFtZSA9ICdNaXNzaW5nVXBzdHJlYW1FcnJvcidcbiAgICB0aGlzLm1lc3NhZ2UgPSBtZXNzYWdlIHx8ICdObyB1cHN0cmVhbSBoYXMgYmVlbiBhZGRlZCB0byB0aGUgQmFsYW5jZWRQb29sJ1xuICAgIHRoaXMuY29kZSA9ICdVTkRfRVJSX0JQTF9NSVNTSU5HX1VQU1RSRUFNJ1xuICB9XG59XG5cbmNsYXNzIEhUVFBQYXJzZXJFcnJvciBleHRlbmRzIEVycm9yIHtcbiAgY29uc3RydWN0b3IgKG1lc3NhZ2UsIGNvZGUsIGRhdGEpIHtcbiAgICBzdXBlcihtZXNzYWdlKVxuICAgIEVycm9yLmNhcHR1cmVTdGFja1RyYWNlKHRoaXMsIEhUVFBQYXJzZXJFcnJvcilcbiAgICB0aGlzLm5hbWUgPSAnSFRUUFBhcnNlckVycm9yJ1xuICAgIHRoaXMuY29kZSA9IGNvZGUgPyBgSFBFXyR7Y29kZX1gIDogdW5kZWZpbmVkXG4gICAgdGhpcy5kYXRhID0gZGF0YSA/IGRhdGEudG9TdHJpbmcoKSA6IHVuZGVmaW5lZFxuICB9XG59XG5cbmNsYXNzIFJlc3BvbnNlRXhjZWVkZWRNYXhTaXplRXJyb3IgZXh0ZW5kcyBVbmRpY2lFcnJvciB7XG4gIGNvbnN0cnVjdG9yIChtZXNzYWdlKSB7XG4gICAgc3VwZXIobWVzc2FnZSlcbiAgICBFcnJvci5jYXB0dXJlU3RhY2tUcmFjZSh0aGlzLCBSZXNwb25zZUV4Y2VlZGVkTWF4U2l6ZUVycm9yKVxuICAgIHRoaXMubmFtZSA9ICdSZXNwb25zZUV4Y2VlZGVkTWF4U2l6ZUVycm9yJ1xuICAgIHRoaXMubWVzc2FnZSA9IG1lc3NhZ2UgfHwgJ1Jlc3BvbnNlIGNvbnRlbnQgZXhjZWVkZWQgbWF4IHNpemUnXG4gICAgdGhpcy5jb2RlID0gJ1VORF9FUlJfUkVTX0VYQ0VFREVEX01BWF9TSVpFJ1xuICB9XG59XG5cbmNsYXNzIFJlcXVlc3RSZXRyeUVycm9yIGV4dGVuZHMgVW5kaWNpRXJyb3Ige1xuICBjb25zdHJ1Y3RvciAobWVzc2FnZSwgY29kZSwgeyBoZWFkZXJzLCBkYXRhIH0pIHtcbiAgICBzdXBlcihtZXNzYWdlKVxuICAgIEVycm9yLmNhcHR1cmVTdGFja1RyYWNlKHRoaXMsIFJlcXVlc3RSZXRyeUVycm9yKVxuICAgIHRoaXMubmFtZSA9ICdSZXF1ZXN0UmV0cnlFcnJvcidcbiAgICB0aGlzLm1lc3NhZ2UgPSBtZXNzYWdlIHx8ICdSZXF1ZXN0IHJldHJ5IGVycm9yJ1xuICAgIHRoaXMuY29kZSA9ICdVTkRfRVJSX1JFUV9SRVRSWSdcbiAgICB0aGlzLnN0YXR1c0NvZGUgPSBjb2RlXG4gICAgdGhpcy5kYXRhID0gZGF0YVxuICAgIHRoaXMuaGVhZGVycyA9IGhlYWRlcnNcbiAgfVxufVxuXG5tb2R1bGUuZXhwb3J0cyA9IHtcbiAgSFRUUFBhcnNlckVycm9yLFxuICBVbmRpY2lFcnJvcixcbiAgSGVhZGVyc1RpbWVvdXRFcnJvcixcbiAgSGVhZGVyc092ZXJmbG93RXJyb3IsXG4gIEJvZHlUaW1lb3V0RXJyb3IsXG4gIFJlcXVlc3RDb250ZW50TGVuZ3RoTWlzbWF0Y2hFcnJvcixcbiAgQ29ubmVjdFRpbWVvdXRFcnJvcixcbiAgUmVzcG9uc2VTdGF0dXNDb2RlRXJyb3IsXG4gIEludmFsaWRBcmd1bWVudEVycm9yLFxuICBJbnZhbGlkUmV0dXJuVmFsdWVFcnJvcixcbiAgUmVxdWVzdEFib3J0ZWRFcnJvcixcbiAgQ2xpZW50RGVzdHJveWVkRXJyb3IsXG4gIENsaWVudENsb3NlZEVycm9yLFxuICBJbmZvcm1hdGlvbmFsRXJyb3IsXG4gIFNvY2tldEVycm9yLFxuICBOb3RTdXBwb3J0ZWRFcnJvcixcbiAgUmVzcG9uc2VDb250ZW50TGVuZ3RoTWlzbWF0Y2hFcnJvcixcbiAgQmFsYW5jZWRQb29sTWlzc2luZ1Vwc3RyZWFtRXJyb3IsXG4gIFJlc3BvbnNlRXhjZWVkZWRNYXhTaXplRXJyb3IsXG4gIFJlcXVlc3RSZXRyeUVycm9yXG59XG4iLAogICAgIid1c2Ugc3RyaWN0J1xuXG4vKiogQHR5cGUge1JlY29yZDxzdHJpbmcsIHN0cmluZyB8IHVuZGVmaW5lZD59ICovXG5jb25zdCBoZWFkZXJOYW1lTG93ZXJDYXNlZFJlY29yZCA9IHt9XG5cbi8vIGh0dHBzOi8vZGV2ZWxvcGVyLm1vemlsbGEub3JnL2RvY3MvV2ViL0hUVFAvSGVhZGVyc1xuY29uc3Qgd2VsbGtub3duSGVhZGVyTmFtZXMgPSBbXG4gICdBY2NlcHQnLFxuICAnQWNjZXB0LUVuY29kaW5nJyxcbiAgJ0FjY2VwdC1MYW5ndWFnZScsXG4gICdBY2NlcHQtUmFuZ2VzJyxcbiAgJ0FjY2Vzcy1Db250cm9sLUFsbG93LUNyZWRlbnRpYWxzJyxcbiAgJ0FjY2Vzcy1Db250cm9sLUFsbG93LUhlYWRlcnMnLFxuICAnQWNjZXNzLUNvbnRyb2wtQWxsb3ctTWV0aG9kcycsXG4gICdBY2Nlc3MtQ29udHJvbC1BbGxvdy1PcmlnaW4nLFxuICAnQWNjZXNzLUNvbnRyb2wtRXhwb3NlLUhlYWRlcnMnLFxuICAnQWNjZXNzLUNvbnRyb2wtTWF4LUFnZScsXG4gICdBY2Nlc3MtQ29udHJvbC1SZXF1ZXN0LUhlYWRlcnMnLFxuICAnQWNjZXNzLUNvbnRyb2wtUmVxdWVzdC1NZXRob2QnLFxuICAnQWdlJyxcbiAgJ0FsbG93JyxcbiAgJ0FsdC1TdmMnLFxuICAnQWx0LVVzZWQnLFxuICAnQXV0aG9yaXphdGlvbicsXG4gICdDYWNoZS1Db250cm9sJyxcbiAgJ0NsZWFyLVNpdGUtRGF0YScsXG4gICdDb25uZWN0aW9uJyxcbiAgJ0NvbnRlbnQtRGlzcG9zaXRpb24nLFxuICAnQ29udGVudC1FbmNvZGluZycsXG4gICdDb250ZW50LUxhbmd1YWdlJyxcbiAgJ0NvbnRlbnQtTGVuZ3RoJyxcbiAgJ0NvbnRlbnQtTG9jYXRpb24nLFxuICAnQ29udGVudC1SYW5nZScsXG4gICdDb250ZW50LVNlY3VyaXR5LVBvbGljeScsXG4gICdDb250ZW50LVNlY3VyaXR5LVBvbGljeS1SZXBvcnQtT25seScsXG4gICdDb250ZW50LVR5cGUnLFxuICAnQ29va2llJyxcbiAgJ0Nyb3NzLU9yaWdpbi1FbWJlZGRlci1Qb2xpY3knLFxuICAnQ3Jvc3MtT3JpZ2luLU9wZW5lci1Qb2xpY3knLFxuICAnQ3Jvc3MtT3JpZ2luLVJlc291cmNlLVBvbGljeScsXG4gICdEYXRlJyxcbiAgJ0RldmljZS1NZW1vcnknLFxuICAnRG93bmxpbmsnLFxuICAnRUNUJyxcbiAgJ0VUYWcnLFxuICAnRXhwZWN0JyxcbiAgJ0V4cGVjdC1DVCcsXG4gICdFeHBpcmVzJyxcbiAgJ0ZvcndhcmRlZCcsXG4gICdGcm9tJyxcbiAgJ0hvc3QnLFxuICAnSWYtTWF0Y2gnLFxuICAnSWYtTW9kaWZpZWQtU2luY2UnLFxuICAnSWYtTm9uZS1NYXRjaCcsXG4gICdJZi1SYW5nZScsXG4gICdJZi1Vbm1vZGlmaWVkLVNpbmNlJyxcbiAgJ0tlZXAtQWxpdmUnLFxuICAnTGFzdC1Nb2RpZmllZCcsXG4gICdMaW5rJyxcbiAgJ0xvY2F0aW9uJyxcbiAgJ01heC1Gb3J3YXJkcycsXG4gICdPcmlnaW4nLFxuICAnUGVybWlzc2lvbnMtUG9saWN5JyxcbiAgJ1ByYWdtYScsXG4gICdQcm94eS1BdXRoZW50aWNhdGUnLFxuICAnUHJveHktQXV0aG9yaXphdGlvbicsXG4gICdSVFQnLFxuICAnUmFuZ2UnLFxuICAnUmVmZXJlcicsXG4gICdSZWZlcnJlci1Qb2xpY3knLFxuICAnUmVmcmVzaCcsXG4gICdSZXRyeS1BZnRlcicsXG4gICdTZWMtV2ViU29ja2V0LUFjY2VwdCcsXG4gICdTZWMtV2ViU29ja2V0LUV4dGVuc2lvbnMnLFxuICAnU2VjLVdlYlNvY2tldC1LZXknLFxuICAnU2VjLVdlYlNvY2tldC1Qcm90b2NvbCcsXG4gICdTZWMtV2ViU29ja2V0LVZlcnNpb24nLFxuICAnU2VydmVyJyxcbiAgJ1NlcnZlci1UaW1pbmcnLFxuICAnU2VydmljZS1Xb3JrZXItQWxsb3dlZCcsXG4gICdTZXJ2aWNlLVdvcmtlci1OYXZpZ2F0aW9uLVByZWxvYWQnLFxuICAnU2V0LUNvb2tpZScsXG4gICdTb3VyY2VNYXAnLFxuICAnU3RyaWN0LVRyYW5zcG9ydC1TZWN1cml0eScsXG4gICdTdXBwb3J0cy1Mb2FkaW5nLU1vZGUnLFxuICAnVEUnLFxuICAnVGltaW5nLUFsbG93LU9yaWdpbicsXG4gICdUcmFpbGVyJyxcbiAgJ1RyYW5zZmVyLUVuY29kaW5nJyxcbiAgJ1VwZ3JhZGUnLFxuICAnVXBncmFkZS1JbnNlY3VyZS1SZXF1ZXN0cycsXG4gICdVc2VyLUFnZW50JyxcbiAgJ1ZhcnknLFxuICAnVmlhJyxcbiAgJ1dXVy1BdXRoZW50aWNhdGUnLFxuICAnWC1Db250ZW50LVR5cGUtT3B0aW9ucycsXG4gICdYLUROUy1QcmVmZXRjaC1Db250cm9sJyxcbiAgJ1gtRnJhbWUtT3B0aW9ucycsXG4gICdYLVBlcm1pdHRlZC1Dcm9zcy1Eb21haW4tUG9saWNpZXMnLFxuICAnWC1Qb3dlcmVkLUJ5JyxcbiAgJ1gtUmVxdWVzdGVkLVdpdGgnLFxuICAnWC1YU1MtUHJvdGVjdGlvbidcbl1cblxuZm9yIChsZXQgaSA9IDA7IGkgPCB3ZWxsa25vd25IZWFkZXJOYW1lcy5sZW5ndGg7ICsraSkge1xuICBjb25zdCBrZXkgPSB3ZWxsa25vd25IZWFkZXJOYW1lc1tpXVxuICBjb25zdCBsb3dlckNhc2VkS2V5ID0ga2V5LnRvTG93ZXJDYXNlKClcbiAgaGVhZGVyTmFtZUxvd2VyQ2FzZWRSZWNvcmRba2V5XSA9IGhlYWRlck5hbWVMb3dlckNhc2VkUmVjb3JkW2xvd2VyQ2FzZWRLZXldID1cbiAgICBsb3dlckNhc2VkS2V5XG59XG5cbi8vIE5vdGU6IG9iamVjdCBwcm90b3R5cGVzIHNob3VsZCBub3QgYmUgYWJsZSB0byBiZSByZWZlcmVuY2VkLiBlLmcuIGBPYmplY3QjaGFzT3duUHJvcGVydHlgLlxuT2JqZWN0LnNldFByb3RvdHlwZU9mKGhlYWRlck5hbWVMb3dlckNhc2VkUmVjb3JkLCBudWxsKVxuXG5tb2R1bGUuZXhwb3J0cyA9IHtcbiAgd2VsbGtub3duSGVhZGVyTmFtZXMsXG4gIGhlYWRlck5hbWVMb3dlckNhc2VkUmVjb3JkXG59XG4iLAogICAgIid1c2Ugc3RyaWN0J1xuXG5jb25zdCBhc3NlcnQgPSByZXF1aXJlKCdhc3NlcnQnKVxuY29uc3QgeyBrRGVzdHJveWVkLCBrQm9keVVzZWQgfSA9IHJlcXVpcmUoJy4vc3ltYm9scycpXG5jb25zdCB7IEluY29taW5nTWVzc2FnZSB9ID0gcmVxdWlyZSgnaHR0cCcpXG5jb25zdCBzdHJlYW0gPSByZXF1aXJlKCdzdHJlYW0nKVxuY29uc3QgbmV0ID0gcmVxdWlyZSgnbmV0JylcbmNvbnN0IHsgSW52YWxpZEFyZ3VtZW50RXJyb3IgfSA9IHJlcXVpcmUoJy4vZXJyb3JzJylcbmNvbnN0IHsgQmxvYiB9ID0gcmVxdWlyZSgnYnVmZmVyJylcbmNvbnN0IG5vZGVVdGlsID0gcmVxdWlyZSgndXRpbCcpXG5jb25zdCB7IHN0cmluZ2lmeSB9ID0gcmVxdWlyZSgncXVlcnlzdHJpbmcnKVxuY29uc3QgeyBoZWFkZXJOYW1lTG93ZXJDYXNlZFJlY29yZCB9ID0gcmVxdWlyZSgnLi9jb25zdGFudHMnKVxuXG5jb25zdCBbbm9kZU1ham9yLCBub2RlTWlub3JdID0gcHJvY2Vzcy52ZXJzaW9ucy5ub2RlLnNwbGl0KCcuJykubWFwKHYgPT4gTnVtYmVyKHYpKVxuXG5mdW5jdGlvbiBub3AgKCkge31cblxuZnVuY3Rpb24gaXNTdHJlYW0gKG9iaikge1xuICByZXR1cm4gb2JqICYmIHR5cGVvZiBvYmogPT09ICdvYmplY3QnICYmIHR5cGVvZiBvYmoucGlwZSA9PT0gJ2Z1bmN0aW9uJyAmJiB0eXBlb2Ygb2JqLm9uID09PSAnZnVuY3Rpb24nXG59XG5cbi8vIGJhc2VkIG9uIGh0dHBzOi8vZ2l0aHViLmNvbS9ub2RlLWZldGNoL2ZldGNoLWJsb2IvYmxvYi84YWI1ODdkMzQwODBkZTk0MTQwYjU0ZjA3MTY4NDUxZTdkMGI2NTVlL2luZGV4LmpzI0wyMjktTDI0MSAoTUlUIExpY2Vuc2UpXG5mdW5jdGlvbiBpc0Jsb2JMaWtlIChvYmplY3QpIHtcbiAgcmV0dXJuIChCbG9iICYmIG9iamVjdCBpbnN0YW5jZW9mIEJsb2IpIHx8IChcbiAgICBvYmplY3QgJiZcbiAgICB0eXBlb2Ygb2JqZWN0ID09PSAnb2JqZWN0JyAmJlxuICAgICh0eXBlb2Ygb2JqZWN0LnN0cmVhbSA9PT0gJ2Z1bmN0aW9uJyB8fFxuICAgICAgdHlwZW9mIG9iamVjdC5hcnJheUJ1ZmZlciA9PT0gJ2Z1bmN0aW9uJykgJiZcbiAgICAvXihCbG9ifEZpbGUpJC8udGVzdChvYmplY3RbU3ltYm9sLnRvU3RyaW5nVGFnXSlcbiAgKVxufVxuXG5mdW5jdGlvbiBidWlsZFVSTCAodXJsLCBxdWVyeVBhcmFtcykge1xuICBpZiAodXJsLmluY2x1ZGVzKCc/JykgfHwgdXJsLmluY2x1ZGVzKCcjJykpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoJ1F1ZXJ5IHBhcmFtcyBjYW5ub3QgYmUgcGFzc2VkIHdoZW4gdXJsIGFscmVhZHkgY29udGFpbnMgXCI/XCIgb3IgXCIjXCIuJylcbiAgfVxuXG4gIGNvbnN0IHN0cmluZ2lmaWVkID0gc3RyaW5naWZ5KHF1ZXJ5UGFyYW1zKVxuXG4gIGlmIChzdHJpbmdpZmllZCkge1xuICAgIHVybCArPSAnPycgKyBzdHJpbmdpZmllZFxuICB9XG5cbiAgcmV0dXJuIHVybFxufVxuXG5mdW5jdGlvbiBwYXJzZVVSTCAodXJsKSB7XG4gIGlmICh0eXBlb2YgdXJsID09PSAnc3RyaW5nJykge1xuICAgIHVybCA9IG5ldyBVUkwodXJsKVxuXG4gICAgaWYgKCEvXmh0dHBzPzovLnRlc3QodXJsLm9yaWdpbiB8fCB1cmwucHJvdG9jb2wpKSB7XG4gICAgICB0aHJvdyBuZXcgSW52YWxpZEFyZ3VtZW50RXJyb3IoJ0ludmFsaWQgVVJMIHByb3RvY29sOiB0aGUgVVJMIG11c3Qgc3RhcnQgd2l0aCBgaHR0cDpgIG9yIGBodHRwczpgLicpXG4gICAgfVxuXG4gICAgcmV0dXJuIHVybFxuICB9XG5cbiAgaWYgKCF1cmwgfHwgdHlwZW9mIHVybCAhPT0gJ29iamVjdCcpIHtcbiAgICB0aHJvdyBuZXcgSW52YWxpZEFyZ3VtZW50RXJyb3IoJ0ludmFsaWQgVVJMOiBUaGUgVVJMIGFyZ3VtZW50IG11c3QgYmUgYSBub24tbnVsbCBvYmplY3QuJylcbiAgfVxuXG4gIGlmICghL15odHRwcz86Ly50ZXN0KHVybC5vcmlnaW4gfHwgdXJsLnByb3RvY29sKSkge1xuICAgIHRocm93IG5ldyBJbnZhbGlkQXJndW1lbnRFcnJvcignSW52YWxpZCBVUkwgcHJvdG9jb2w6IHRoZSBVUkwgbXVzdCBzdGFydCB3aXRoIGBodHRwOmAgb3IgYGh0dHBzOmAuJylcbiAgfVxuXG4gIGlmICghKHVybCBpbnN0YW5jZW9mIFVSTCkpIHtcbiAgICBpZiAodXJsLnBvcnQgIT0gbnVsbCAmJiB1cmwucG9ydCAhPT0gJycgJiYgIU51bWJlci5pc0Zpbml0ZShwYXJzZUludCh1cmwucG9ydCkpKSB7XG4gICAgICB0aHJvdyBuZXcgSW52YWxpZEFyZ3VtZW50RXJyb3IoJ0ludmFsaWQgVVJMOiBwb3J0IG11c3QgYmUgYSB2YWxpZCBpbnRlZ2VyIG9yIGEgc3RyaW5nIHJlcHJlc2VudGF0aW9uIG9mIGFuIGludGVnZXIuJylcbiAgICB9XG5cbiAgICBpZiAodXJsLnBhdGggIT0gbnVsbCAmJiB0eXBlb2YgdXJsLnBhdGggIT09ICdzdHJpbmcnKSB7XG4gICAgICB0aHJvdyBuZXcgSW52YWxpZEFyZ3VtZW50RXJyb3IoJ0ludmFsaWQgVVJMIHBhdGg6IHRoZSBwYXRoIG11c3QgYmUgYSBzdHJpbmcgb3IgbnVsbC91bmRlZmluZWQuJylcbiAgICB9XG5cbiAgICBpZiAodXJsLnBhdGhuYW1lICE9IG51bGwgJiYgdHlwZW9mIHVybC5wYXRobmFtZSAhPT0gJ3N0cmluZycpIHtcbiAgICAgIHRocm93IG5ldyBJbnZhbGlkQXJndW1lbnRFcnJvcignSW52YWxpZCBVUkwgcGF0aG5hbWU6IHRoZSBwYXRobmFtZSBtdXN0IGJlIGEgc3RyaW5nIG9yIG51bGwvdW5kZWZpbmVkLicpXG4gICAgfVxuXG4gICAgaWYgKHVybC5ob3N0bmFtZSAhPSBudWxsICYmIHR5cGVvZiB1cmwuaG9zdG5hbWUgIT09ICdzdHJpbmcnKSB7XG4gICAgICB0aHJvdyBuZXcgSW52YWxpZEFyZ3VtZW50RXJyb3IoJ0ludmFsaWQgVVJMIGhvc3RuYW1lOiB0aGUgaG9zdG5hbWUgbXVzdCBiZSBhIHN0cmluZyBvciBudWxsL3VuZGVmaW5lZC4nKVxuICAgIH1cblxuICAgIGlmICh1cmwub3JpZ2luICE9IG51bGwgJiYgdHlwZW9mIHVybC5vcmlnaW4gIT09ICdzdHJpbmcnKSB7XG4gICAgICB0aHJvdyBuZXcgSW52YWxpZEFyZ3VtZW50RXJyb3IoJ0ludmFsaWQgVVJMIG9yaWdpbjogdGhlIG9yaWdpbiBtdXN0IGJlIGEgc3RyaW5nIG9yIG51bGwvdW5kZWZpbmVkLicpXG4gICAgfVxuXG4gICAgY29uc3QgcG9ydCA9IHVybC5wb3J0ICE9IG51bGxcbiAgICAgID8gdXJsLnBvcnRcbiAgICAgIDogKHVybC5wcm90b2NvbCA9PT0gJ2h0dHBzOicgPyA0NDMgOiA4MClcbiAgICBsZXQgb3JpZ2luID0gdXJsLm9yaWdpbiAhPSBudWxsXG4gICAgICA/IHVybC5vcmlnaW5cbiAgICAgIDogYCR7dXJsLnByb3RvY29sfS8vJHt1cmwuaG9zdG5hbWV9OiR7cG9ydH1gXG4gICAgbGV0IHBhdGggPSB1cmwucGF0aCAhPSBudWxsXG4gICAgICA/IHVybC5wYXRoXG4gICAgICA6IGAke3VybC5wYXRobmFtZSB8fCAnJ30ke3VybC5zZWFyY2ggfHwgJyd9YFxuXG4gICAgaWYgKG9yaWdpbi5lbmRzV2l0aCgnLycpKSB7XG4gICAgICBvcmlnaW4gPSBvcmlnaW4uc3Vic3RyaW5nKDAsIG9yaWdpbi5sZW5ndGggLSAxKVxuICAgIH1cblxuICAgIGlmIChwYXRoICYmICFwYXRoLnN0YXJ0c1dpdGgoJy8nKSkge1xuICAgICAgcGF0aCA9IGAvJHtwYXRofWBcbiAgICB9XG4gICAgLy8gbmV3IFVSTChwYXRoLCBvcmlnaW4pIGlzIHVuc2FmZSB3aGVuIGBwYXRoYCBjb250YWlucyBhbiBhYnNvbHV0ZSBVUkxcbiAgICAvLyBGcm9tIGh0dHBzOi8vZGV2ZWxvcGVyLm1vemlsbGEub3JnL2VuLVVTL2RvY3MvV2ViL0FQSS9VUkwvVVJMOlxuICAgIC8vIElmIGZpcnN0IHBhcmFtZXRlciBpcyBhIHJlbGF0aXZlIFVSTCwgc2Vjb25kIHBhcmFtIGlzIHJlcXVpcmVkLCBhbmQgd2lsbCBiZSB1c2VkIGFzIHRoZSBiYXNlIFVSTC5cbiAgICAvLyBJZiBmaXJzdCBwYXJhbWV0ZXIgaXMgYW4gYWJzb2x1dGUgVVJMLCBhIGdpdmVuIHNlY29uZCBwYXJhbSB3aWxsIGJlIGlnbm9yZWQuXG4gICAgdXJsID0gbmV3IFVSTChvcmlnaW4gKyBwYXRoKVxuICB9XG5cbiAgcmV0dXJuIHVybFxufVxuXG5mdW5jdGlvbiBwYXJzZU9yaWdpbiAodXJsKSB7XG4gIHVybCA9IHBhcnNlVVJMKHVybClcblxuICBpZiAodXJsLnBhdGhuYW1lICE9PSAnLycgfHwgdXJsLnNlYXJjaCB8fCB1cmwuaGFzaCkge1xuICAgIHRocm93IG5ldyBJbnZhbGlkQXJndW1lbnRFcnJvcignaW52YWxpZCB1cmwnKVxuICB9XG5cbiAgcmV0dXJuIHVybFxufVxuXG5mdW5jdGlvbiBnZXRIb3N0bmFtZSAoaG9zdCkge1xuICBpZiAoaG9zdFswXSA9PT0gJ1snKSB7XG4gICAgY29uc3QgaWR4ID0gaG9zdC5pbmRleE9mKCddJylcblxuICAgIGFzc2VydChpZHggIT09IC0xKVxuICAgIHJldHVybiBob3N0LnN1YnN0cmluZygxLCBpZHgpXG4gIH1cblxuICBjb25zdCBpZHggPSBob3N0LmluZGV4T2YoJzonKVxuICBpZiAoaWR4ID09PSAtMSkgcmV0dXJuIGhvc3RcblxuICByZXR1cm4gaG9zdC5zdWJzdHJpbmcoMCwgaWR4KVxufVxuXG4vLyBJUCBhZGRyZXNzZXMgYXJlIG5vdCB2YWxpZCBzZXJ2ZXIgbmFtZXMgcGVyIFJGQzYwNjZcbi8vID4gQ3VycmVudGx5LCB0aGUgb25seSBzZXJ2ZXIgbmFtZXMgc3VwcG9ydGVkIGFyZSBETlMgaG9zdG5hbWVzXG5mdW5jdGlvbiBnZXRTZXJ2ZXJOYW1lIChob3N0KSB7XG4gIGlmICghaG9zdCkge1xuICAgIHJldHVybiBudWxsXG4gIH1cblxuICBhc3NlcnQuc3RyaWN0RXF1YWwodHlwZW9mIGhvc3QsICdzdHJpbmcnKVxuXG4gIGNvbnN0IHNlcnZlcm5hbWUgPSBnZXRIb3N0bmFtZShob3N0KVxuICBpZiAobmV0LmlzSVAoc2VydmVybmFtZSkpIHtcbiAgICByZXR1cm4gJydcbiAgfVxuXG4gIHJldHVybiBzZXJ2ZXJuYW1lXG59XG5cbmZ1bmN0aW9uIGRlZXBDbG9uZSAob2JqKSB7XG4gIHJldHVybiBKU09OLnBhcnNlKEpTT04uc3RyaW5naWZ5KG9iaikpXG59XG5cbmZ1bmN0aW9uIGlzQXN5bmNJdGVyYWJsZSAob2JqKSB7XG4gIHJldHVybiAhIShvYmogIT0gbnVsbCAmJiB0eXBlb2Ygb2JqW1N5bWJvbC5hc3luY0l0ZXJhdG9yXSA9PT0gJ2Z1bmN0aW9uJylcbn1cblxuZnVuY3Rpb24gaXNJdGVyYWJsZSAob2JqKSB7XG4gIHJldHVybiAhIShvYmogIT0gbnVsbCAmJiAodHlwZW9mIG9ialtTeW1ib2wuaXRlcmF0b3JdID09PSAnZnVuY3Rpb24nIHx8IHR5cGVvZiBvYmpbU3ltYm9sLmFzeW5jSXRlcmF0b3JdID09PSAnZnVuY3Rpb24nKSlcbn1cblxuZnVuY3Rpb24gYm9keUxlbmd0aCAoYm9keSkge1xuICBpZiAoYm9keSA9PSBudWxsKSB7XG4gICAgcmV0dXJuIDBcbiAgfSBlbHNlIGlmIChpc1N0cmVhbShib2R5KSkge1xuICAgIGNvbnN0IHN0YXRlID0gYm9keS5fcmVhZGFibGVTdGF0ZVxuICAgIHJldHVybiBzdGF0ZSAmJiBzdGF0ZS5vYmplY3RNb2RlID09PSBmYWxzZSAmJiBzdGF0ZS5lbmRlZCA9PT0gdHJ1ZSAmJiBOdW1iZXIuaXNGaW5pdGUoc3RhdGUubGVuZ3RoKVxuICAgICAgPyBzdGF0ZS5sZW5ndGhcbiAgICAgIDogbnVsbFxuICB9IGVsc2UgaWYgKGlzQmxvYkxpa2UoYm9keSkpIHtcbiAgICByZXR1cm4gYm9keS5zaXplICE9IG51bGwgPyBib2R5LnNpemUgOiBudWxsXG4gIH0gZWxzZSBpZiAoaXNCdWZmZXIoYm9keSkpIHtcbiAgICByZXR1cm4gYm9keS5ieXRlTGVuZ3RoXG4gIH1cblxuICByZXR1cm4gbnVsbFxufVxuXG5mdW5jdGlvbiBpc0Rlc3Ryb3llZCAoc3RyZWFtKSB7XG4gIHJldHVybiAhc3RyZWFtIHx8ICEhKHN0cmVhbS5kZXN0cm95ZWQgfHwgc3RyZWFtW2tEZXN0cm95ZWRdKVxufVxuXG5mdW5jdGlvbiBpc1JlYWRhYmxlQWJvcnRlZCAoc3RyZWFtKSB7XG4gIGNvbnN0IHN0YXRlID0gc3RyZWFtICYmIHN0cmVhbS5fcmVhZGFibGVTdGF0ZVxuICByZXR1cm4gaXNEZXN0cm95ZWQoc3RyZWFtKSAmJiBzdGF0ZSAmJiAhc3RhdGUuZW5kRW1pdHRlZFxufVxuXG5mdW5jdGlvbiBkZXN0cm95IChzdHJlYW0sIGVycikge1xuICBpZiAoc3RyZWFtID09IG51bGwgfHwgIWlzU3RyZWFtKHN0cmVhbSkgfHwgaXNEZXN0cm95ZWQoc3RyZWFtKSkge1xuICAgIHJldHVyblxuICB9XG5cbiAgaWYgKHR5cGVvZiBzdHJlYW0uZGVzdHJveSA9PT0gJ2Z1bmN0aW9uJykge1xuICAgIGlmIChPYmplY3QuZ2V0UHJvdG90eXBlT2Yoc3RyZWFtKS5jb25zdHJ1Y3RvciA9PT0gSW5jb21pbmdNZXNzYWdlKSB7XG4gICAgICAvLyBTZWU6IGh0dHBzOi8vZ2l0aHViLmNvbS9ub2RlanMvbm9kZS9wdWxsLzM4NTA1L2ZpbGVzXG4gICAgICBzdHJlYW0uc29ja2V0ID0gbnVsbFxuICAgIH1cblxuICAgIHN0cmVhbS5kZXN0cm95KGVycilcbiAgfSBlbHNlIGlmIChlcnIpIHtcbiAgICBwcm9jZXNzLm5leHRUaWNrKChzdHJlYW0sIGVycikgPT4ge1xuICAgICAgc3RyZWFtLmVtaXQoJ2Vycm9yJywgZXJyKVxuICAgIH0sIHN0cmVhbSwgZXJyKVxuICB9XG5cbiAgaWYgKHN0cmVhbS5kZXN0cm95ZWQgIT09IHRydWUpIHtcbiAgICBzdHJlYW1ba0Rlc3Ryb3llZF0gPSB0cnVlXG4gIH1cbn1cblxuY29uc3QgS0VFUEFMSVZFX1RJTUVPVVRfRVhQUiA9IC90aW1lb3V0PShcXGQrKS9cbmZ1bmN0aW9uIHBhcnNlS2VlcEFsaXZlVGltZW91dCAodmFsKSB7XG4gIGNvbnN0IG0gPSB2YWwudG9TdHJpbmcoKS5tYXRjaChLRUVQQUxJVkVfVElNRU9VVF9FWFBSKVxuICByZXR1cm4gbSA/IHBhcnNlSW50KG1bMV0sIDEwKSAqIDEwMDAgOiBudWxsXG59XG5cbi8qKlxuICogUmV0cmlldmVzIGEgaGVhZGVyIG5hbWUgYW5kIHJldHVybnMgaXRzIGxvd2VyY2FzZSB2YWx1ZS5cbiAqIEBwYXJhbSB7c3RyaW5nIHwgQnVmZmVyfSB2YWx1ZSBIZWFkZXIgbmFtZVxuICogQHJldHVybnMge3N0cmluZ31cbiAqL1xuZnVuY3Rpb24gaGVhZGVyTmFtZVRvU3RyaW5nICh2YWx1ZSkge1xuICByZXR1cm4gaGVhZGVyTmFtZUxvd2VyQ2FzZWRSZWNvcmRbdmFsdWVdIHx8IHZhbHVlLnRvTG93ZXJDYXNlKClcbn1cblxuZnVuY3Rpb24gcGFyc2VIZWFkZXJzIChoZWFkZXJzLCBvYmogPSB7fSkge1xuICAvLyBGb3IgSDIgc3VwcG9ydFxuICBpZiAoIUFycmF5LmlzQXJyYXkoaGVhZGVycykpIHJldHVybiBoZWFkZXJzXG5cbiAgZm9yIChsZXQgaSA9IDA7IGkgPCBoZWFkZXJzLmxlbmd0aDsgaSArPSAyKSB7XG4gICAgY29uc3Qga2V5ID0gaGVhZGVyc1tpXS50b1N0cmluZygpLnRvTG93ZXJDYXNlKClcbiAgICBsZXQgdmFsID0gb2JqW2tleV1cblxuICAgIGlmICghdmFsKSB7XG4gICAgICBpZiAoQXJyYXkuaXNBcnJheShoZWFkZXJzW2kgKyAxXSkpIHtcbiAgICAgICAgb2JqW2tleV0gPSBoZWFkZXJzW2kgKyAxXS5tYXAoeCA9PiB4LnRvU3RyaW5nKCd1dGY4JykpXG4gICAgICB9IGVsc2Uge1xuICAgICAgICBvYmpba2V5XSA9IGhlYWRlcnNbaSArIDFdLnRvU3RyaW5nKCd1dGY4JylcbiAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAgaWYgKCFBcnJheS5pc0FycmF5KHZhbCkpIHtcbiAgICAgICAgdmFsID0gW3ZhbF1cbiAgICAgICAgb2JqW2tleV0gPSB2YWxcbiAgICAgIH1cbiAgICAgIHZhbC5wdXNoKGhlYWRlcnNbaSArIDFdLnRvU3RyaW5nKCd1dGY4JykpXG4gICAgfVxuICB9XG5cbiAgLy8gU2VlIGh0dHBzOi8vZ2l0aHViLmNvbS9ub2RlanMvbm9kZS9wdWxsLzQ2NTI4XG4gIGlmICgnY29udGVudC1sZW5ndGgnIGluIG9iaiAmJiAnY29udGVudC1kaXNwb3NpdGlvbicgaW4gb2JqKSB7XG4gICAgb2JqWydjb250ZW50LWRpc3Bvc2l0aW9uJ10gPSBCdWZmZXIuZnJvbShvYmpbJ2NvbnRlbnQtZGlzcG9zaXRpb24nXSkudG9TdHJpbmcoJ2xhdGluMScpXG4gIH1cblxuICByZXR1cm4gb2JqXG59XG5cbmZ1bmN0aW9uIHBhcnNlUmF3SGVhZGVycyAoaGVhZGVycykge1xuICBjb25zdCByZXQgPSBbXVxuICBsZXQgaGFzQ29udGVudExlbmd0aCA9IGZhbHNlXG4gIGxldCBjb250ZW50RGlzcG9zaXRpb25JZHggPSAtMVxuXG4gIGZvciAobGV0IG4gPSAwOyBuIDwgaGVhZGVycy5sZW5ndGg7IG4gKz0gMikge1xuICAgIGNvbnN0IGtleSA9IGhlYWRlcnNbbiArIDBdLnRvU3RyaW5nKClcbiAgICBjb25zdCB2YWwgPSBoZWFkZXJzW24gKyAxXS50b1N0cmluZygndXRmOCcpXG5cbiAgICBpZiAoa2V5Lmxlbmd0aCA9PT0gMTQgJiYgKGtleSA9PT0gJ2NvbnRlbnQtbGVuZ3RoJyB8fCBrZXkudG9Mb3dlckNhc2UoKSA9PT0gJ2NvbnRlbnQtbGVuZ3RoJykpIHtcbiAgICAgIHJldC5wdXNoKGtleSwgdmFsKVxuICAgICAgaGFzQ29udGVudExlbmd0aCA9IHRydWVcbiAgICB9IGVsc2UgaWYgKGtleS5sZW5ndGggPT09IDE5ICYmIChrZXkgPT09ICdjb250ZW50LWRpc3Bvc2l0aW9uJyB8fCBrZXkudG9Mb3dlckNhc2UoKSA9PT0gJ2NvbnRlbnQtZGlzcG9zaXRpb24nKSkge1xuICAgICAgY29udGVudERpc3Bvc2l0aW9uSWR4ID0gcmV0LnB1c2goa2V5LCB2YWwpIC0gMVxuICAgIH0gZWxzZSB7XG4gICAgICByZXQucHVzaChrZXksIHZhbClcbiAgICB9XG4gIH1cblxuICAvLyBTZWUgaHR0cHM6Ly9naXRodWIuY29tL25vZGVqcy9ub2RlL3B1bGwvNDY1MjhcbiAgaWYgKGhhc0NvbnRlbnRMZW5ndGggJiYgY29udGVudERpc3Bvc2l0aW9uSWR4ICE9PSAtMSkge1xuICAgIHJldFtjb250ZW50RGlzcG9zaXRpb25JZHhdID0gQnVmZmVyLmZyb20ocmV0W2NvbnRlbnREaXNwb3NpdGlvbklkeF0pLnRvU3RyaW5nKCdsYXRpbjEnKVxuICB9XG5cbiAgcmV0dXJuIHJldFxufVxuXG5mdW5jdGlvbiBpc0J1ZmZlciAoYnVmZmVyKSB7XG4gIC8vIFNlZSwgaHR0cHM6Ly9naXRodWIuY29tL21jb2xsaW5hL3VuZGljaS9wdWxsLzMxOVxuICByZXR1cm4gYnVmZmVyIGluc3RhbmNlb2YgVWludDhBcnJheSB8fCBCdWZmZXIuaXNCdWZmZXIoYnVmZmVyKVxufVxuXG5mdW5jdGlvbiB2YWxpZGF0ZUhhbmRsZXIgKGhhbmRsZXIsIG1ldGhvZCwgdXBncmFkZSkge1xuICBpZiAoIWhhbmRsZXIgfHwgdHlwZW9mIGhhbmRsZXIgIT09ICdvYmplY3QnKSB7XG4gICAgdGhyb3cgbmV3IEludmFsaWRBcmd1bWVudEVycm9yKCdoYW5kbGVyIG11c3QgYmUgYW4gb2JqZWN0JylcbiAgfVxuXG4gIGlmICh0eXBlb2YgaGFuZGxlci5vbkNvbm5lY3QgIT09ICdmdW5jdGlvbicpIHtcbiAgICB0aHJvdyBuZXcgSW52YWxpZEFyZ3VtZW50RXJyb3IoJ2ludmFsaWQgb25Db25uZWN0IG1ldGhvZCcpXG4gIH1cblxuICBpZiAodHlwZW9mIGhhbmRsZXIub25FcnJvciAhPT0gJ2Z1bmN0aW9uJykge1xuICAgIHRocm93IG5ldyBJbnZhbGlkQXJndW1lbnRFcnJvcignaW52YWxpZCBvbkVycm9yIG1ldGhvZCcpXG4gIH1cblxuICBpZiAodHlwZW9mIGhhbmRsZXIub25Cb2R5U2VudCAhPT0gJ2Z1bmN0aW9uJyAmJiBoYW5kbGVyLm9uQm9keVNlbnQgIT09IHVuZGVmaW5lZCkge1xuICAgIHRocm93IG5ldyBJbnZhbGlkQXJndW1lbnRFcnJvcignaW52YWxpZCBvbkJvZHlTZW50IG1ldGhvZCcpXG4gIH1cblxuICBpZiAodXBncmFkZSB8fCBtZXRob2QgPT09ICdDT05ORUNUJykge1xuICAgIGlmICh0eXBlb2YgaGFuZGxlci5vblVwZ3JhZGUgIT09ICdmdW5jdGlvbicpIHtcbiAgICAgIHRocm93IG5ldyBJbnZhbGlkQXJndW1lbnRFcnJvcignaW52YWxpZCBvblVwZ3JhZGUgbWV0aG9kJylcbiAgICB9XG4gIH0gZWxzZSB7XG4gICAgaWYgKHR5cGVvZiBoYW5kbGVyLm9uSGVhZGVycyAhPT0gJ2Z1bmN0aW9uJykge1xuICAgICAgdGhyb3cgbmV3IEludmFsaWRBcmd1bWVudEVycm9yKCdpbnZhbGlkIG9uSGVhZGVycyBtZXRob2QnKVxuICAgIH1cblxuICAgIGlmICh0eXBlb2YgaGFuZGxlci5vbkRhdGEgIT09ICdmdW5jdGlvbicpIHtcbiAgICAgIHRocm93IG5ldyBJbnZhbGlkQXJndW1lbnRFcnJvcignaW52YWxpZCBvbkRhdGEgbWV0aG9kJylcbiAgICB9XG5cbiAgICBpZiAodHlwZW9mIGhhbmRsZXIub25Db21wbGV0ZSAhPT0gJ2Z1bmN0aW9uJykge1xuICAgICAgdGhyb3cgbmV3IEludmFsaWRBcmd1bWVudEVycm9yKCdpbnZhbGlkIG9uQ29tcGxldGUgbWV0aG9kJylcbiAgICB9XG4gIH1cbn1cblxuLy8gQSBib2R5IGlzIGRpc3R1cmJlZCBpZiBpdCBoYXMgYmVlbiByZWFkIGZyb20gYW5kIGl0IGNhbm5vdFxuLy8gYmUgcmUtdXNlZCB3aXRob3V0IGxvc2luZyBzdGF0ZSBvciBkYXRhLlxuZnVuY3Rpb24gaXNEaXN0dXJiZWQgKGJvZHkpIHtcbiAgcmV0dXJuICEhKGJvZHkgJiYgKFxuICAgIHN0cmVhbS5pc0Rpc3R1cmJlZFxuICAgICAgPyBzdHJlYW0uaXNEaXN0dXJiZWQoYm9keSkgfHwgYm9keVtrQm9keVVzZWRdIC8vIFRPRE8gKGZpeCk6IFdoeSBpcyBib2R5W2tCb2R5VXNlZF0gbmVlZGVkP1xuICAgICAgOiBib2R5W2tCb2R5VXNlZF0gfHxcbiAgICAgICAgYm9keS5yZWFkYWJsZURpZFJlYWQgfHxcbiAgICAgICAgKGJvZHkuX3JlYWRhYmxlU3RhdGUgJiYgYm9keS5fcmVhZGFibGVTdGF0ZS5kYXRhRW1pdHRlZCkgfHxcbiAgICAgICAgaXNSZWFkYWJsZUFib3J0ZWQoYm9keSlcbiAgKSlcbn1cblxuZnVuY3Rpb24gaXNFcnJvcmVkIChib2R5KSB7XG4gIHJldHVybiAhIShib2R5ICYmIChcbiAgICBzdHJlYW0uaXNFcnJvcmVkXG4gICAgICA/IHN0cmVhbS5pc0Vycm9yZWQoYm9keSlcbiAgICAgIDogL3N0YXRlOiAnZXJyb3JlZCcvLnRlc3Qobm9kZVV0aWwuaW5zcGVjdChib2R5KVxuICAgICAgKSkpXG59XG5cbmZ1bmN0aW9uIGlzUmVhZGFibGUgKGJvZHkpIHtcbiAgcmV0dXJuICEhKGJvZHkgJiYgKFxuICAgIHN0cmVhbS5pc1JlYWRhYmxlXG4gICAgICA/IHN0cmVhbS5pc1JlYWRhYmxlKGJvZHkpXG4gICAgICA6IC9zdGF0ZTogJ3JlYWRhYmxlJy8udGVzdChub2RlVXRpbC5pbnNwZWN0KGJvZHkpXG4gICAgICApKSlcbn1cblxuZnVuY3Rpb24gZ2V0U29ja2V0SW5mbyAoc29ja2V0KSB7XG4gIHJldHVybiB7XG4gICAgbG9jYWxBZGRyZXNzOiBzb2NrZXQubG9jYWxBZGRyZXNzLFxuICAgIGxvY2FsUG9ydDogc29ja2V0LmxvY2FsUG9ydCxcbiAgICByZW1vdGVBZGRyZXNzOiBzb2NrZXQucmVtb3RlQWRkcmVzcyxcbiAgICByZW1vdGVQb3J0OiBzb2NrZXQucmVtb3RlUG9ydCxcbiAgICByZW1vdGVGYW1pbHk6IHNvY2tldC5yZW1vdGVGYW1pbHksXG4gICAgdGltZW91dDogc29ja2V0LnRpbWVvdXQsXG4gICAgYnl0ZXNXcml0dGVuOiBzb2NrZXQuYnl0ZXNXcml0dGVuLFxuICAgIGJ5dGVzUmVhZDogc29ja2V0LmJ5dGVzUmVhZFxuICB9XG59XG5cbmFzeW5jIGZ1bmN0aW9uICogY29udmVydEl0ZXJhYmxlVG9CdWZmZXIgKGl0ZXJhYmxlKSB7XG4gIGZvciBhd2FpdCAoY29uc3QgY2h1bmsgb2YgaXRlcmFibGUpIHtcbiAgICB5aWVsZCBCdWZmZXIuaXNCdWZmZXIoY2h1bmspID8gY2h1bmsgOiBCdWZmZXIuZnJvbShjaHVuaylcbiAgfVxufVxuXG5sZXQgUmVhZGFibGVTdHJlYW1cbmZ1bmN0aW9uIFJlYWRhYmxlU3RyZWFtRnJvbSAoaXRlcmFibGUpIHtcbiAgaWYgKCFSZWFkYWJsZVN0cmVhbSkge1xuICAgIFJlYWRhYmxlU3RyZWFtID0gcmVxdWlyZSgnc3RyZWFtL3dlYicpLlJlYWRhYmxlU3RyZWFtXG4gIH1cblxuICBpZiAoUmVhZGFibGVTdHJlYW0uZnJvbSkge1xuICAgIHJldHVybiBSZWFkYWJsZVN0cmVhbS5mcm9tKGNvbnZlcnRJdGVyYWJsZVRvQnVmZmVyKGl0ZXJhYmxlKSlcbiAgfVxuXG4gIGxldCBpdGVyYXRvclxuICByZXR1cm4gbmV3IFJlYWRhYmxlU3RyZWFtKFxuICAgIHtcbiAgICAgIGFzeW5jIHN0YXJ0ICgpIHtcbiAgICAgICAgaXRlcmF0b3IgPSBpdGVyYWJsZVtTeW1ib2wuYXN5bmNJdGVyYXRvcl0oKVxuICAgICAgfSxcbiAgICAgIGFzeW5jIHB1bGwgKGNvbnRyb2xsZXIpIHtcbiAgICAgICAgY29uc3QgeyBkb25lLCB2YWx1ZSB9ID0gYXdhaXQgaXRlcmF0b3IubmV4dCgpXG4gICAgICAgIGlmIChkb25lKSB7XG4gICAgICAgICAgcXVldWVNaWNyb3Rhc2soKCkgPT4ge1xuICAgICAgICAgICAgY29udHJvbGxlci5jbG9zZSgpXG4gICAgICAgICAgfSlcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBjb25zdCBidWYgPSBCdWZmZXIuaXNCdWZmZXIodmFsdWUpID8gdmFsdWUgOiBCdWZmZXIuZnJvbSh2YWx1ZSlcbiAgICAgICAgICBjb250cm9sbGVyLmVucXVldWUobmV3IFVpbnQ4QXJyYXkoYnVmKSlcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gY29udHJvbGxlci5kZXNpcmVkU2l6ZSA+IDBcbiAgICAgIH0sXG4gICAgICBhc3luYyBjYW5jZWwgKHJlYXNvbikge1xuICAgICAgICBhd2FpdCBpdGVyYXRvci5yZXR1cm4oKVxuICAgICAgfVxuICAgIH0sXG4gICAgMFxuICApXG59XG5cbi8vIFRoZSBjaHVuayBzaG91bGQgYmUgYSBGb3JtRGF0YSBpbnN0YW5jZSBhbmQgY29udGFpbnNcbi8vIGFsbCB0aGUgcmVxdWlyZWQgbWV0aG9kcy5cbmZ1bmN0aW9uIGlzRm9ybURhdGFMaWtlIChvYmplY3QpIHtcbiAgcmV0dXJuIChcbiAgICBvYmplY3QgJiZcbiAgICB0eXBlb2Ygb2JqZWN0ID09PSAnb2JqZWN0JyAmJlxuICAgIHR5cGVvZiBvYmplY3QuYXBwZW5kID09PSAnZnVuY3Rpb24nICYmXG4gICAgdHlwZW9mIG9iamVjdC5kZWxldGUgPT09ICdmdW5jdGlvbicgJiZcbiAgICB0eXBlb2Ygb2JqZWN0LmdldCA9PT0gJ2Z1bmN0aW9uJyAmJlxuICAgIHR5cGVvZiBvYmplY3QuZ2V0QWxsID09PSAnZnVuY3Rpb24nICYmXG4gICAgdHlwZW9mIG9iamVjdC5oYXMgPT09ICdmdW5jdGlvbicgJiZcbiAgICB0eXBlb2Ygb2JqZWN0LnNldCA9PT0gJ2Z1bmN0aW9uJyAmJlxuICAgIG9iamVjdFtTeW1ib2wudG9TdHJpbmdUYWddID09PSAnRm9ybURhdGEnXG4gIClcbn1cblxuZnVuY3Rpb24gdGhyb3dJZkFib3J0ZWQgKHNpZ25hbCkge1xuICBpZiAoIXNpZ25hbCkgeyByZXR1cm4gfVxuICBpZiAodHlwZW9mIHNpZ25hbC50aHJvd0lmQWJvcnRlZCA9PT0gJ2Z1bmN0aW9uJykge1xuICAgIHNpZ25hbC50aHJvd0lmQWJvcnRlZCgpXG4gIH0gZWxzZSB7XG4gICAgaWYgKHNpZ25hbC5hYm9ydGVkKSB7XG4gICAgICAvLyBET01FeGNlcHRpb24gbm90IGF2YWlsYWJsZSA8IHYxNy4wLjBcbiAgICAgIGNvbnN0IGVyciA9IG5ldyBFcnJvcignVGhlIG9wZXJhdGlvbiB3YXMgYWJvcnRlZCcpXG4gICAgICBlcnIubmFtZSA9ICdBYm9ydEVycm9yJ1xuICAgICAgdGhyb3cgZXJyXG4gICAgfVxuICB9XG59XG5cbmZ1bmN0aW9uIGFkZEFib3J0TGlzdGVuZXIgKHNpZ25hbCwgbGlzdGVuZXIpIHtcbiAgaWYgKCdhZGRFdmVudExpc3RlbmVyJyBpbiBzaWduYWwpIHtcbiAgICBzaWduYWwuYWRkRXZlbnRMaXN0ZW5lcignYWJvcnQnLCBsaXN0ZW5lciwgeyBvbmNlOiB0cnVlIH0pXG4gICAgcmV0dXJuICgpID0+IHNpZ25hbC5yZW1vdmVFdmVudExpc3RlbmVyKCdhYm9ydCcsIGxpc3RlbmVyKVxuICB9XG4gIHNpZ25hbC5hZGRMaXN0ZW5lcignYWJvcnQnLCBsaXN0ZW5lcilcbiAgcmV0dXJuICgpID0+IHNpZ25hbC5yZW1vdmVMaXN0ZW5lcignYWJvcnQnLCBsaXN0ZW5lcilcbn1cblxuY29uc3QgaGFzVG9XZWxsRm9ybWVkID0gISFTdHJpbmcucHJvdG90eXBlLnRvV2VsbEZvcm1lZFxuXG4vKipcbiAqIEBwYXJhbSB7c3RyaW5nfSB2YWxcbiAqL1xuZnVuY3Rpb24gdG9VU1ZTdHJpbmcgKHZhbCkge1xuICBpZiAoaGFzVG9XZWxsRm9ybWVkKSB7XG4gICAgcmV0dXJuIGAke3ZhbH1gLnRvV2VsbEZvcm1lZCgpXG4gIH0gZWxzZSBpZiAobm9kZVV0aWwudG9VU1ZTdHJpbmcpIHtcbiAgICByZXR1cm4gbm9kZVV0aWwudG9VU1ZTdHJpbmcodmFsKVxuICB9XG5cbiAgcmV0dXJuIGAke3ZhbH1gXG59XG5cbi8vIFBhcnNlZCBhY2NvcmRpbmdseSB0byBSRkMgOTExMFxuLy8gaHR0cHM6Ly93d3cucmZjLWVkaXRvci5vcmcvcmZjL3JmYzkxMTAjZmllbGQuY29udGVudC1yYW5nZVxuZnVuY3Rpb24gcGFyc2VSYW5nZUhlYWRlciAocmFuZ2UpIHtcbiAgaWYgKHJhbmdlID09IG51bGwgfHwgcmFuZ2UgPT09ICcnKSByZXR1cm4geyBzdGFydDogMCwgZW5kOiBudWxsLCBzaXplOiBudWxsIH1cblxuICBjb25zdCBtID0gcmFuZ2UgPyByYW5nZS5tYXRjaCgvXmJ5dGVzIChcXGQrKS0oXFxkKylcXC8oXFxkKyk/JC8pIDogbnVsbFxuICByZXR1cm4gbVxuICAgID8ge1xuICAgICAgICBzdGFydDogcGFyc2VJbnQobVsxXSksXG4gICAgICAgIGVuZDogbVsyXSA/IHBhcnNlSW50KG1bMl0pIDogbnVsbCxcbiAgICAgICAgc2l6ZTogbVszXSA/IHBhcnNlSW50KG1bM10pIDogbnVsbFxuICAgICAgfVxuICAgIDogbnVsbFxufVxuXG5jb25zdCBrRW51bWVyYWJsZVByb3BlcnR5ID0gT2JqZWN0LmNyZWF0ZShudWxsKVxua0VudW1lcmFibGVQcm9wZXJ0eS5lbnVtZXJhYmxlID0gdHJ1ZVxuXG5tb2R1bGUuZXhwb3J0cyA9IHtcbiAga0VudW1lcmFibGVQcm9wZXJ0eSxcbiAgbm9wLFxuICBpc0Rpc3R1cmJlZCxcbiAgaXNFcnJvcmVkLFxuICBpc1JlYWRhYmxlLFxuICB0b1VTVlN0cmluZyxcbiAgaXNSZWFkYWJsZUFib3J0ZWQsXG4gIGlzQmxvYkxpa2UsXG4gIHBhcnNlT3JpZ2luLFxuICBwYXJzZVVSTCxcbiAgZ2V0U2VydmVyTmFtZSxcbiAgaXNTdHJlYW0sXG4gIGlzSXRlcmFibGUsXG4gIGlzQXN5bmNJdGVyYWJsZSxcbiAgaXNEZXN0cm95ZWQsXG4gIGhlYWRlck5hbWVUb1N0cmluZyxcbiAgcGFyc2VSYXdIZWFkZXJzLFxuICBwYXJzZUhlYWRlcnMsXG4gIHBhcnNlS2VlcEFsaXZlVGltZW91dCxcbiAgZGVzdHJveSxcbiAgYm9keUxlbmd0aCxcbiAgZGVlcENsb25lLFxuICBSZWFkYWJsZVN0cmVhbUZyb20sXG4gIGlzQnVmZmVyLFxuICB2YWxpZGF0ZUhhbmRsZXIsXG4gIGdldFNvY2tldEluZm8sXG4gIGlzRm9ybURhdGFMaWtlLFxuICBidWlsZFVSTCxcbiAgdGhyb3dJZkFib3J0ZWQsXG4gIGFkZEFib3J0TGlzdGVuZXIsXG4gIHBhcnNlUmFuZ2VIZWFkZXIsXG4gIG5vZGVNYWpvcixcbiAgbm9kZU1pbm9yLFxuICBub2RlSGFzQXV0b1NlbGVjdEZhbWlseTogbm9kZU1ham9yID4gMTggfHwgKG5vZGVNYWpvciA9PT0gMTggJiYgbm9kZU1pbm9yID49IDEzKSxcbiAgc2FmZUhUVFBNZXRob2RzOiBbJ0dFVCcsICdIRUFEJywgJ09QVElPTlMnLCAnVFJBQ0UnXVxufVxuIiwKICAgICIndXNlIHN0cmljdCdcblxubGV0IGZhc3ROb3cgPSBEYXRlLm5vdygpXG5sZXQgZmFzdE5vd1RpbWVvdXRcblxuY29uc3QgZmFzdFRpbWVycyA9IFtdXG5cbmZ1bmN0aW9uIG9uVGltZW91dCAoKSB7XG4gIGZhc3ROb3cgPSBEYXRlLm5vdygpXG5cbiAgbGV0IGxlbiA9IGZhc3RUaW1lcnMubGVuZ3RoXG4gIGxldCBpZHggPSAwXG4gIHdoaWxlIChpZHggPCBsZW4pIHtcbiAgICBjb25zdCB0aW1lciA9IGZhc3RUaW1lcnNbaWR4XVxuXG4gICAgaWYgKHRpbWVyLnN0YXRlID09PSAwKSB7XG4gICAgICB0aW1lci5zdGF0ZSA9IGZhc3ROb3cgKyB0aW1lci5kZWxheVxuICAgIH0gZWxzZSBpZiAodGltZXIuc3RhdGUgPiAwICYmIGZhc3ROb3cgPj0gdGltZXIuc3RhdGUpIHtcbiAgICAgIHRpbWVyLnN0YXRlID0gLTFcbiAgICAgIHRpbWVyLmNhbGxiYWNrKHRpbWVyLm9wYXF1ZSlcbiAgICB9XG5cbiAgICBpZiAodGltZXIuc3RhdGUgPT09IC0xKSB7XG4gICAgICB0aW1lci5zdGF0ZSA9IC0yXG4gICAgICBpZiAoaWR4ICE9PSBsZW4gLSAxKSB7XG4gICAgICAgIGZhc3RUaW1lcnNbaWR4XSA9IGZhc3RUaW1lcnMucG9wKClcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGZhc3RUaW1lcnMucG9wKClcbiAgICAgIH1cbiAgICAgIGxlbiAtPSAxXG4gICAgfSBlbHNlIHtcbiAgICAgIGlkeCArPSAxXG4gICAgfVxuICB9XG5cbiAgaWYgKGZhc3RUaW1lcnMubGVuZ3RoID4gMCkge1xuICAgIHJlZnJlc2hUaW1lb3V0KClcbiAgfVxufVxuXG5mdW5jdGlvbiByZWZyZXNoVGltZW91dCAoKSB7XG4gIGlmIChmYXN0Tm93VGltZW91dCAmJiBmYXN0Tm93VGltZW91dC5yZWZyZXNoKSB7XG4gICAgZmFzdE5vd1RpbWVvdXQucmVmcmVzaCgpXG4gIH0gZWxzZSB7XG4gICAgY2xlYXJUaW1lb3V0KGZhc3ROb3dUaW1lb3V0KVxuICAgIGZhc3ROb3dUaW1lb3V0ID0gc2V0VGltZW91dChvblRpbWVvdXQsIDFlMylcbiAgICBpZiAoZmFzdE5vd1RpbWVvdXQudW5yZWYpIHtcbiAgICAgIGZhc3ROb3dUaW1lb3V0LnVucmVmKClcbiAgICB9XG4gIH1cbn1cblxuY2xhc3MgVGltZW91dCB7XG4gIGNvbnN0cnVjdG9yIChjYWxsYmFjaywgZGVsYXksIG9wYXF1ZSkge1xuICAgIHRoaXMuY2FsbGJhY2sgPSBjYWxsYmFja1xuICAgIHRoaXMuZGVsYXkgPSBkZWxheVxuICAgIHRoaXMub3BhcXVlID0gb3BhcXVlXG5cbiAgICAvLyAgLTIgbm90IGluIHRpbWVyIGxpc3RcbiAgICAvLyAgLTEgaW4gdGltZXIgbGlzdCBidXQgaW5hY3RpdmVcbiAgICAvLyAgIDAgaW4gdGltZXIgbGlzdCB3YWl0aW5nIGZvciB0aW1lXG4gICAgLy8gPiAwIGluIHRpbWVyIGxpc3Qgd2FpdGluZyBmb3IgdGltZSB0byBleHBpcmVcbiAgICB0aGlzLnN0YXRlID0gLTJcblxuICAgIHRoaXMucmVmcmVzaCgpXG4gIH1cblxuICByZWZyZXNoICgpIHtcbiAgICBpZiAodGhpcy5zdGF0ZSA9PT0gLTIpIHtcbiAgICAgIGZhc3RUaW1lcnMucHVzaCh0aGlzKVxuICAgICAgaWYgKCFmYXN0Tm93VGltZW91dCB8fCBmYXN0VGltZXJzLmxlbmd0aCA9PT0gMSkge1xuICAgICAgICByZWZyZXNoVGltZW91dCgpXG4gICAgICB9XG4gICAgfVxuXG4gICAgdGhpcy5zdGF0ZSA9IDBcbiAgfVxuXG4gIGNsZWFyICgpIHtcbiAgICB0aGlzLnN0YXRlID0gLTFcbiAgfVxufVxuXG5tb2R1bGUuZXhwb3J0cyA9IHtcbiAgc2V0VGltZW91dCAoY2FsbGJhY2ssIGRlbGF5LCBvcGFxdWUpIHtcbiAgICByZXR1cm4gZGVsYXkgPCAxZTNcbiAgICAgID8gc2V0VGltZW91dChjYWxsYmFjaywgZGVsYXksIG9wYXF1ZSlcbiAgICAgIDogbmV3IFRpbWVvdXQoY2FsbGJhY2ssIGRlbGF5LCBvcGFxdWUpXG4gIH0sXG4gIGNsZWFyVGltZW91dCAodGltZW91dCkge1xuICAgIGlmICh0aW1lb3V0IGluc3RhbmNlb2YgVGltZW91dCkge1xuICAgICAgdGltZW91dC5jbGVhcigpXG4gICAgfSBlbHNlIHtcbiAgICAgIGNsZWFyVGltZW91dCh0aW1lb3V0KVxuICAgIH1cbiAgfVxufVxuIiwKICAgICIndXNlIHN0cmljdCdcblxuLyoqXG4gKiBDb3B5cmlnaHQgQnJpYW4gV2hpdGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuXG4gKlxuICogQHNlZSBodHRwczovL2dpdGh1Yi5jb20vbXNjZGV4L3N0cmVhbXNlYXJjaFxuICpcbiAqIFBlcm1pc3Npb24gaXMgaGVyZWJ5IGdyYW50ZWQsIGZyZWUgb2YgY2hhcmdlLCB0byBhbnkgcGVyc29uIG9idGFpbmluZyBhIGNvcHlcbiAqIG9mIHRoaXMgc29mdHdhcmUgYW5kIGFzc29jaWF0ZWQgZG9jdW1lbnRhdGlvbiBmaWxlcyAodGhlIFwiU29mdHdhcmVcIiksIHRvXG4gKiBkZWFsIGluIHRoZSBTb2Z0d2FyZSB3aXRob3V0IHJlc3RyaWN0aW9uLCBpbmNsdWRpbmcgd2l0aG91dCBsaW1pdGF0aW9uIHRoZVxuICogcmlnaHRzIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBtZXJnZSwgcHVibGlzaCwgZGlzdHJpYnV0ZSwgc3VibGljZW5zZSwgYW5kL29yXG4gKiBzZWxsIGNvcGllcyBvZiB0aGUgU29mdHdhcmUsIGFuZCB0byBwZXJtaXQgcGVyc29ucyB0byB3aG9tIHRoZSBTb2Z0d2FyZSBpc1xuICogZnVybmlzaGVkIHRvIGRvIHNvLCBzdWJqZWN0IHRvIHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczpcbiAqXG4gKiBUaGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBzaGFsbCBiZSBpbmNsdWRlZCBpblxuICogYWxsIGNvcGllcyBvciBzdWJzdGFudGlhbCBwb3J0aW9ucyBvZiB0aGUgU29mdHdhcmUuXG4gKlxuICogVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEIFwiQVMgSVNcIiwgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwgRVhQUkVTUyBPUlxuICogSU1QTElFRCwgSU5DTFVESU5HIEJVVCBOT1QgTElNSVRFRCBUTyBUSEUgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFksXG4gKiBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBTkQgTk9OSU5GUklOR0VNRU5ULiBJTiBOTyBFVkVOVCBTSEFMTCBUSEVcbiAqIEFVVEhPUlMgT1IgQ09QWVJJR0hUIEhPTERFUlMgQkUgTElBQkxFIEZPUiBBTlkgQ0xBSU0sIERBTUFHRVMgT1IgT1RIRVJcbiAqIExJQUJJTElUWSwgV0hFVEhFUiBJTiBBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsIFRPUlQgT1IgT1RIRVJXSVNFLCBBUklTSU5HXG4gKiBGUk9NLCBPVVQgT0YgT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBTT0ZUV0FSRSBPUiBUSEUgVVNFIE9SIE9USEVSIERFQUxJTkdTXG4gKiBJTiBUSEUgU09GVFdBUkUuXG4gKlxuICogQmFzZWQgaGVhdmlseSBvbiB0aGUgU3RyZWFtaW5nIEJveWVyLU1vb3JlLUhvcnNwb29sIEMrKyBpbXBsZW1lbnRhdGlvblxuICogYnkgSG9uZ2xpIExhaSBhdDogaHR0cHM6Ly9naXRodWIuY29tL0Zvb0JhcldpZGdldC9ib3llci1tb29yZS1ob3JzcG9vbFxuICovXG5jb25zdCBFdmVudEVtaXR0ZXIgPSByZXF1aXJlKCdub2RlOmV2ZW50cycpLkV2ZW50RW1pdHRlclxuY29uc3QgaW5oZXJpdHMgPSByZXF1aXJlKCdub2RlOnV0aWwnKS5pbmhlcml0c1xuXG5mdW5jdGlvbiBTQk1IIChuZWVkbGUpIHtcbiAgaWYgKHR5cGVvZiBuZWVkbGUgPT09ICdzdHJpbmcnKSB7XG4gICAgbmVlZGxlID0gQnVmZmVyLmZyb20obmVlZGxlKVxuICB9XG5cbiAgaWYgKCFCdWZmZXIuaXNCdWZmZXIobmVlZGxlKSkge1xuICAgIHRocm93IG5ldyBUeXBlRXJyb3IoJ1RoZSBuZWVkbGUgaGFzIHRvIGJlIGEgU3RyaW5nIG9yIGEgQnVmZmVyLicpXG4gIH1cblxuICBjb25zdCBuZWVkbGVMZW5ndGggPSBuZWVkbGUubGVuZ3RoXG5cbiAgaWYgKG5lZWRsZUxlbmd0aCA9PT0gMCkge1xuICAgIHRocm93IG5ldyBFcnJvcignVGhlIG5lZWRsZSBjYW5ub3QgYmUgYW4gZW1wdHkgU3RyaW5nL0J1ZmZlci4nKVxuICB9XG5cbiAgaWYgKG5lZWRsZUxlbmd0aCA+IDI1Nikge1xuICAgIHRocm93IG5ldyBFcnJvcignVGhlIG5lZWRsZSBjYW5ub3QgaGF2ZSBhIGxlbmd0aCBiaWdnZXIgdGhhbiAyNTYuJylcbiAgfVxuXG4gIHRoaXMubWF4TWF0Y2hlcyA9IEluZmluaXR5XG4gIHRoaXMubWF0Y2hlcyA9IDBcblxuICB0aGlzLl9vY2MgPSBuZXcgQXJyYXkoMjU2KVxuICAgIC5maWxsKG5lZWRsZUxlbmd0aCkgLy8gSW5pdGlhbGl6ZSBvY2N1cnJlbmNlIHRhYmxlLlxuICB0aGlzLl9sb29rYmVoaW5kX3NpemUgPSAwXG4gIHRoaXMuX25lZWRsZSA9IG5lZWRsZVxuICB0aGlzLl9idWZwb3MgPSAwXG5cbiAgdGhpcy5fbG9va2JlaGluZCA9IEJ1ZmZlci5hbGxvYyhuZWVkbGVMZW5ndGgpXG5cbiAgLy8gUG9wdWxhdGUgb2NjdXJyZW5jZSB0YWJsZSB3aXRoIGFuYWx5c2lzIG9mIHRoZSBuZWVkbGUsXG4gIC8vIGlnbm9yaW5nIGxhc3QgbGV0dGVyLlxuICBmb3IgKHZhciBpID0gMDsgaSA8IG5lZWRsZUxlbmd0aCAtIDE7ICsraSkgeyAvLyBlc2xpbnQtZGlzYWJsZS1saW5lIG5vLXZhclxuICAgIHRoaXMuX29jY1tuZWVkbGVbaV1dID0gbmVlZGxlTGVuZ3RoIC0gMSAtIGlcbiAgfVxufVxuaW5oZXJpdHMoU0JNSCwgRXZlbnRFbWl0dGVyKVxuXG5TQk1ILnByb3RvdHlwZS5yZXNldCA9IGZ1bmN0aW9uICgpIHtcbiAgdGhpcy5fbG9va2JlaGluZF9zaXplID0gMFxuICB0aGlzLm1hdGNoZXMgPSAwXG4gIHRoaXMuX2J1ZnBvcyA9IDBcbn1cblxuU0JNSC5wcm90b3R5cGUucHVzaCA9IGZ1bmN0aW9uIChjaHVuaywgcG9zKSB7XG4gIGlmICghQnVmZmVyLmlzQnVmZmVyKGNodW5rKSkge1xuICAgIGNodW5rID0gQnVmZmVyLmZyb20oY2h1bmssICdiaW5hcnknKVxuICB9XG4gIGNvbnN0IGNobGVuID0gY2h1bmsubGVuZ3RoXG4gIHRoaXMuX2J1ZnBvcyA9IHBvcyB8fCAwXG4gIGxldCByXG4gIHdoaWxlIChyICE9PSBjaGxlbiAmJiB0aGlzLm1hdGNoZXMgPCB0aGlzLm1heE1hdGNoZXMpIHsgciA9IHRoaXMuX3NibWhfZmVlZChjaHVuaykgfVxuICByZXR1cm4gclxufVxuXG5TQk1ILnByb3RvdHlwZS5fc2JtaF9mZWVkID0gZnVuY3Rpb24gKGRhdGEpIHtcbiAgY29uc3QgbGVuID0gZGF0YS5sZW5ndGhcbiAgY29uc3QgbmVlZGxlID0gdGhpcy5fbmVlZGxlXG4gIGNvbnN0IG5lZWRsZUxlbmd0aCA9IG5lZWRsZS5sZW5ndGhcbiAgY29uc3QgbGFzdE5lZWRsZUNoYXIgPSBuZWVkbGVbbmVlZGxlTGVuZ3RoIC0gMV1cblxuICAvLyBQb3NpdGl2ZTogcG9pbnRzIHRvIGEgcG9zaXRpb24gaW4gYGRhdGFgXG4gIC8vICAgICAgICAgICBwb3MgPT0gMyBwb2ludHMgdG8gZGF0YVszXVxuICAvLyBOZWdhdGl2ZTogcG9pbnRzIHRvIGEgcG9zaXRpb24gaW4gdGhlIGxvb2tiZWhpbmQgYnVmZmVyXG4gIC8vICAgICAgICAgICBwb3MgPT0gLTIgcG9pbnRzIHRvIGxvb2tiZWhpbmRbbG9va2JlaGluZF9zaXplIC0gMl1cbiAgbGV0IHBvcyA9IC10aGlzLl9sb29rYmVoaW5kX3NpemVcbiAgbGV0IGNoXG5cbiAgaWYgKHBvcyA8IDApIHtcbiAgICAvLyBMb29rYmVoaW5kIGJ1ZmZlciBpcyBub3QgZW1wdHkuIFBlcmZvcm0gQm95ZXItTW9vcmUtSG9yc3Bvb2xcbiAgICAvLyBzZWFyY2ggd2l0aCBjaGFyYWN0ZXIgbG9va3VwIGNvZGUgdGhhdCBjb25zaWRlcnMgYm90aCB0aGVcbiAgICAvLyBsb29rYmVoaW5kIGJ1ZmZlciBhbmQgdGhlIGN1cnJlbnQgcm91bmQncyBoYXlzdGFjayBkYXRhLlxuICAgIC8vXG4gICAgLy8gTG9vcCB1bnRpbFxuICAgIC8vICAgdGhlcmUgaXMgYSBtYXRjaC5cbiAgICAvLyBvciB1bnRpbFxuICAgIC8vICAgd2UndmUgbW92ZWQgcGFzdCB0aGUgcG9zaXRpb24gdGhhdCByZXF1aXJlcyB0aGVcbiAgICAvLyAgIGxvb2tiZWhpbmQgYnVmZmVyLiBJbiB0aGlzIGNhc2Ugd2Ugc3dpdGNoIHRvIHRoZVxuICAgIC8vICAgb3B0aW1pemVkIGxvb3AuXG4gICAgLy8gb3IgdW50aWxcbiAgICAvLyAgIHRoZSBjaGFyYWN0ZXIgdG8gbG9vayBhdCBsaWVzIG91dHNpZGUgdGhlIGhheXN0YWNrLlxuICAgIHdoaWxlIChwb3MgPCAwICYmIHBvcyA8PSBsZW4gLSBuZWVkbGVMZW5ndGgpIHtcbiAgICAgIGNoID0gdGhpcy5fc2JtaF9sb29rdXBfY2hhcihkYXRhLCBwb3MgKyBuZWVkbGVMZW5ndGggLSAxKVxuXG4gICAgICBpZiAoXG4gICAgICAgIGNoID09PSBsYXN0TmVlZGxlQ2hhciAmJlxuICAgICAgICB0aGlzLl9zYm1oX21lbWNtcChkYXRhLCBwb3MsIG5lZWRsZUxlbmd0aCAtIDEpXG4gICAgICApIHtcbiAgICAgICAgdGhpcy5fbG9va2JlaGluZF9zaXplID0gMFxuICAgICAgICArK3RoaXMubWF0Y2hlc1xuICAgICAgICB0aGlzLmVtaXQoJ2luZm8nLCB0cnVlKVxuXG4gICAgICAgIHJldHVybiAodGhpcy5fYnVmcG9zID0gcG9zICsgbmVlZGxlTGVuZ3RoKVxuICAgICAgfVxuICAgICAgcG9zICs9IHRoaXMuX29jY1tjaF1cbiAgICB9XG5cbiAgICAvLyBObyBtYXRjaC5cblxuICAgIGlmIChwb3MgPCAwKSB7XG4gICAgICAvLyBUaGVyZSdzIHRvbyBmZXcgZGF0YSBmb3IgQm95ZXItTW9vcmUtSG9yc3Bvb2wgdG8gcnVuLFxuICAgICAgLy8gc28gbGV0J3MgdXNlIGEgZGlmZmVyZW50IGFsZ29yaXRobSB0byBza2lwIGFzIG11Y2ggYXNcbiAgICAgIC8vIHdlIGNhbi5cbiAgICAgIC8vIEZvcndhcmQgcG9zIHVudGlsXG4gICAgICAvLyAgIHRoZSB0cmFpbGluZyBwYXJ0IG9mIGxvb2tiZWhpbmQgKyBkYXRhXG4gICAgICAvLyAgIGxvb2tzIGxpa2UgdGhlIGJlZ2lubmluZyBvZiB0aGUgbmVlZGxlXG4gICAgICAvLyBvciB1bnRpbFxuICAgICAgLy8gICBwb3MgPT0gMFxuICAgICAgd2hpbGUgKHBvcyA8IDAgJiYgIXRoaXMuX3NibWhfbWVtY21wKGRhdGEsIHBvcywgbGVuIC0gcG9zKSkgeyArK3BvcyB9XG4gICAgfVxuXG4gICAgaWYgKHBvcyA+PSAwKSB7XG4gICAgICAvLyBEaXNjYXJkIGxvb2tiZWhpbmQgYnVmZmVyLlxuICAgICAgdGhpcy5lbWl0KCdpbmZvJywgZmFsc2UsIHRoaXMuX2xvb2tiZWhpbmQsIDAsIHRoaXMuX2xvb2tiZWhpbmRfc2l6ZSlcbiAgICAgIHRoaXMuX2xvb2tiZWhpbmRfc2l6ZSA9IDBcbiAgICB9IGVsc2Uge1xuICAgICAgLy8gQ3V0IG9mZiBwYXJ0IG9mIHRoZSBsb29rYmVoaW5kIGJ1ZmZlciB0aGF0IGhhc1xuICAgICAgLy8gYmVlbiBwcm9jZXNzZWQgYW5kIGFwcGVuZCB0aGUgZW50aXJlIGhheXN0YWNrXG4gICAgICAvLyBpbnRvIGl0LlxuICAgICAgY29uc3QgYnl0ZXNUb0N1dE9mZiA9IHRoaXMuX2xvb2tiZWhpbmRfc2l6ZSArIHBvc1xuICAgICAgaWYgKGJ5dGVzVG9DdXRPZmYgPiAwKSB7XG4gICAgICAgIC8vIFRoZSBjdXQgb2ZmIGRhdGEgaXMgZ3VhcmFudGVlZCBub3QgdG8gY29udGFpbiB0aGUgbmVlZGxlLlxuICAgICAgICB0aGlzLmVtaXQoJ2luZm8nLCBmYWxzZSwgdGhpcy5fbG9va2JlaGluZCwgMCwgYnl0ZXNUb0N1dE9mZilcbiAgICAgIH1cblxuICAgICAgdGhpcy5fbG9va2JlaGluZC5jb3B5KHRoaXMuX2xvb2tiZWhpbmQsIDAsIGJ5dGVzVG9DdXRPZmYsXG4gICAgICAgIHRoaXMuX2xvb2tiZWhpbmRfc2l6ZSAtIGJ5dGVzVG9DdXRPZmYpXG4gICAgICB0aGlzLl9sb29rYmVoaW5kX3NpemUgLT0gYnl0ZXNUb0N1dE9mZlxuXG4gICAgICBkYXRhLmNvcHkodGhpcy5fbG9va2JlaGluZCwgdGhpcy5fbG9va2JlaGluZF9zaXplKVxuICAgICAgdGhpcy5fbG9va2JlaGluZF9zaXplICs9IGxlblxuXG4gICAgICB0aGlzLl9idWZwb3MgPSBsZW5cbiAgICAgIHJldHVybiBsZW5cbiAgICB9XG4gIH1cblxuICBwb3MgKz0gKHBvcyA+PSAwKSAqIHRoaXMuX2J1ZnBvc1xuXG4gIC8vIExvb2tiZWhpbmQgYnVmZmVyIGlzIG5vdyBlbXB0eS4gV2Ugb25seSBuZWVkIHRvIGNoZWNrIGlmIHRoZVxuICAvLyBuZWVkbGUgaXMgaW4gdGhlIGhheXN0YWNrLlxuICBpZiAoZGF0YS5pbmRleE9mKG5lZWRsZSwgcG9zKSAhPT0gLTEpIHtcbiAgICBwb3MgPSBkYXRhLmluZGV4T2YobmVlZGxlLCBwb3MpXG4gICAgKyt0aGlzLm1hdGNoZXNcbiAgICBpZiAocG9zID4gMCkgeyB0aGlzLmVtaXQoJ2luZm8nLCB0cnVlLCBkYXRhLCB0aGlzLl9idWZwb3MsIHBvcykgfSBlbHNlIHsgdGhpcy5lbWl0KCdpbmZvJywgdHJ1ZSkgfVxuXG4gICAgcmV0dXJuICh0aGlzLl9idWZwb3MgPSBwb3MgKyBuZWVkbGVMZW5ndGgpXG4gIH0gZWxzZSB7XG4gICAgcG9zID0gbGVuIC0gbmVlZGxlTGVuZ3RoXG4gIH1cblxuICAvLyBUaGVyZSB3YXMgbm8gbWF0Y2guIElmIHRoZXJlJ3MgdHJhaWxpbmcgaGF5c3RhY2sgZGF0YSB0aGF0IHdlIGNhbm5vdFxuICAvLyBtYXRjaCB5ZXQgdXNpbmcgdGhlIEJveWVyLU1vb3JlLUhvcnNwb29sIGFsZ29yaXRobSAoYmVjYXVzZSB0aGUgdHJhaWxpbmdcbiAgLy8gZGF0YSBpcyBsZXNzIHRoYW4gdGhlIG5lZWRsZSBzaXplKSB0aGVuIG1hdGNoIHVzaW5nIGEgbW9kaWZpZWRcbiAgLy8gYWxnb3JpdGhtIHRoYXQgc3RhcnRzIG1hdGNoaW5nIGZyb20gdGhlIGJlZ2lubmluZyBpbnN0ZWFkIG9mIHRoZSBlbmQuXG4gIC8vIFdoYXRldmVyIHRyYWlsaW5nIGRhdGEgaXMgbGVmdCBhZnRlciBydW5uaW5nIHRoaXMgYWxnb3JpdGhtIGlzIGFkZGVkIHRvXG4gIC8vIHRoZSBsb29rYmVoaW5kIGJ1ZmZlci5cbiAgd2hpbGUgKFxuICAgIHBvcyA8IGxlbiAmJlxuICAgIChcbiAgICAgIGRhdGFbcG9zXSAhPT0gbmVlZGxlWzBdIHx8XG4gICAgICAoXG4gICAgICAgIChCdWZmZXIuY29tcGFyZShcbiAgICAgICAgICBkYXRhLnN1YmFycmF5KHBvcywgcG9zICsgbGVuIC0gcG9zKSxcbiAgICAgICAgICBuZWVkbGUuc3ViYXJyYXkoMCwgbGVuIC0gcG9zKVxuICAgICAgICApICE9PSAwKVxuICAgICAgKVxuICAgIClcbiAgKSB7XG4gICAgKytwb3NcbiAgfVxuICBpZiAocG9zIDwgbGVuKSB7XG4gICAgZGF0YS5jb3B5KHRoaXMuX2xvb2tiZWhpbmQsIDAsIHBvcywgcG9zICsgKGxlbiAtIHBvcykpXG4gICAgdGhpcy5fbG9va2JlaGluZF9zaXplID0gbGVuIC0gcG9zXG4gIH1cblxuICAvLyBFdmVyeXRoaW5nIHVudGlsIHBvcyBpcyBndWFyYW50ZWVkIG5vdCB0byBjb250YWluIG5lZWRsZSBkYXRhLlxuICBpZiAocG9zID4gMCkgeyB0aGlzLmVtaXQoJ2luZm8nLCBmYWxzZSwgZGF0YSwgdGhpcy5fYnVmcG9zLCBwb3MgPCBsZW4gPyBwb3MgOiBsZW4pIH1cblxuICB0aGlzLl9idWZwb3MgPSBsZW5cbiAgcmV0dXJuIGxlblxufVxuXG5TQk1ILnByb3RvdHlwZS5fc2JtaF9sb29rdXBfY2hhciA9IGZ1bmN0aW9uIChkYXRhLCBwb3MpIHtcbiAgcmV0dXJuIChwb3MgPCAwKVxuICAgID8gdGhpcy5fbG9va2JlaGluZFt0aGlzLl9sb29rYmVoaW5kX3NpemUgKyBwb3NdXG4gICAgOiBkYXRhW3Bvc11cbn1cblxuU0JNSC5wcm90b3R5cGUuX3NibWhfbWVtY21wID0gZnVuY3Rpb24gKGRhdGEsIHBvcywgbGVuKSB7XG4gIGZvciAodmFyIGkgPSAwOyBpIDwgbGVuOyArK2kpIHsgLy8gZXNsaW50LWRpc2FibGUtbGluZSBuby12YXJcbiAgICBpZiAodGhpcy5fc2JtaF9sb29rdXBfY2hhcihkYXRhLCBwb3MgKyBpKSAhPT0gdGhpcy5fbmVlZGxlW2ldKSB7IHJldHVybiBmYWxzZSB9XG4gIH1cbiAgcmV0dXJuIHRydWVcbn1cblxubW9kdWxlLmV4cG9ydHMgPSBTQk1IXG4iLAogICAgIid1c2Ugc3RyaWN0J1xuXG5jb25zdCBpbmhlcml0cyA9IHJlcXVpcmUoJ25vZGU6dXRpbCcpLmluaGVyaXRzXG5jb25zdCBSZWFkYWJsZVN0cmVhbSA9IHJlcXVpcmUoJ25vZGU6c3RyZWFtJykuUmVhZGFibGVcblxuZnVuY3Rpb24gUGFydFN0cmVhbSAob3B0cykge1xuICBSZWFkYWJsZVN0cmVhbS5jYWxsKHRoaXMsIG9wdHMpXG59XG5pbmhlcml0cyhQYXJ0U3RyZWFtLCBSZWFkYWJsZVN0cmVhbSlcblxuUGFydFN0cmVhbS5wcm90b3R5cGUuX3JlYWQgPSBmdW5jdGlvbiAobikge31cblxubW9kdWxlLmV4cG9ydHMgPSBQYXJ0U3RyZWFtXG4iLAogICAgIid1c2Ugc3RyaWN0J1xuXG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIGdldExpbWl0IChsaW1pdHMsIG5hbWUsIGRlZmF1bHRMaW1pdCkge1xuICBpZiAoXG4gICAgIWxpbWl0cyB8fFxuICAgIGxpbWl0c1tuYW1lXSA9PT0gdW5kZWZpbmVkIHx8XG4gICAgbGltaXRzW25hbWVdID09PSBudWxsXG4gICkgeyByZXR1cm4gZGVmYXVsdExpbWl0IH1cblxuICBpZiAoXG4gICAgdHlwZW9mIGxpbWl0c1tuYW1lXSAhPT0gJ251bWJlcicgfHxcbiAgICBpc05hTihsaW1pdHNbbmFtZV0pXG4gICkgeyB0aHJvdyBuZXcgVHlwZUVycm9yKCdMaW1pdCAnICsgbmFtZSArICcgaXMgbm90IGEgdmFsaWQgbnVtYmVyJykgfVxuXG4gIHJldHVybiBsaW1pdHNbbmFtZV1cbn1cbiIsCiAgICAiJ3VzZSBzdHJpY3QnXG5cbmNvbnN0IEV2ZW50RW1pdHRlciA9IHJlcXVpcmUoJ25vZGU6ZXZlbnRzJykuRXZlbnRFbWl0dGVyXG5jb25zdCBpbmhlcml0cyA9IHJlcXVpcmUoJ25vZGU6dXRpbCcpLmluaGVyaXRzXG5jb25zdCBnZXRMaW1pdCA9IHJlcXVpcmUoJy4uLy4uLy4uL2xpYi91dGlscy9nZXRMaW1pdCcpXG5cbmNvbnN0IFN0cmVhbVNlYXJjaCA9IHJlcXVpcmUoJy4uLy4uL3N0cmVhbXNlYXJjaC9zYm1oJylcblxuY29uc3QgQl9EQ1JMRiA9IEJ1ZmZlci5mcm9tKCdcXHJcXG5cXHJcXG4nKVxuY29uc3QgUkVfQ1JMRiA9IC9cXHJcXG4vZ1xuY29uc3QgUkVfSERSID0gL14oW146XSspOlsgXFx0XT8oW1xceDAwLVxceEZGXSspPyQvIC8vIGVzbGludC1kaXNhYmxlLWxpbmUgbm8tY29udHJvbC1yZWdleFxuXG5mdW5jdGlvbiBIZWFkZXJQYXJzZXIgKGNmZykge1xuICBFdmVudEVtaXR0ZXIuY2FsbCh0aGlzKVxuXG4gIGNmZyA9IGNmZyB8fCB7fVxuICBjb25zdCBzZWxmID0gdGhpc1xuICB0aGlzLm5yZWFkID0gMFxuICB0aGlzLm1heGVkID0gZmFsc2VcbiAgdGhpcy5ucGFpcnMgPSAwXG4gIHRoaXMubWF4SGVhZGVyUGFpcnMgPSBnZXRMaW1pdChjZmcsICdtYXhIZWFkZXJQYWlycycsIDIwMDApXG4gIHRoaXMubWF4SGVhZGVyU2l6ZSA9IGdldExpbWl0KGNmZywgJ21heEhlYWRlclNpemUnLCA4MCAqIDEwMjQpXG4gIHRoaXMuYnVmZmVyID0gJydcbiAgdGhpcy5oZWFkZXIgPSB7fVxuICB0aGlzLmZpbmlzaGVkID0gZmFsc2VcbiAgdGhpcy5zcyA9IG5ldyBTdHJlYW1TZWFyY2goQl9EQ1JMRilcbiAgdGhpcy5zcy5vbignaW5mbycsIGZ1bmN0aW9uIChpc01hdGNoLCBkYXRhLCBzdGFydCwgZW5kKSB7XG4gICAgaWYgKGRhdGEgJiYgIXNlbGYubWF4ZWQpIHtcbiAgICAgIGlmIChzZWxmLm5yZWFkICsgZW5kIC0gc3RhcnQgPj0gc2VsZi5tYXhIZWFkZXJTaXplKSB7XG4gICAgICAgIGVuZCA9IHNlbGYubWF4SGVhZGVyU2l6ZSAtIHNlbGYubnJlYWQgKyBzdGFydFxuICAgICAgICBzZWxmLm5yZWFkID0gc2VsZi5tYXhIZWFkZXJTaXplXG4gICAgICAgIHNlbGYubWF4ZWQgPSB0cnVlXG4gICAgICB9IGVsc2UgeyBzZWxmLm5yZWFkICs9IChlbmQgLSBzdGFydCkgfVxuXG4gICAgICBzZWxmLmJ1ZmZlciArPSBkYXRhLnRvU3RyaW5nKCdiaW5hcnknLCBzdGFydCwgZW5kKVxuICAgIH1cbiAgICBpZiAoaXNNYXRjaCkgeyBzZWxmLl9maW5pc2goKSB9XG4gIH0pXG59XG5pbmhlcml0cyhIZWFkZXJQYXJzZXIsIEV2ZW50RW1pdHRlcilcblxuSGVhZGVyUGFyc2VyLnByb3RvdHlwZS5wdXNoID0gZnVuY3Rpb24gKGRhdGEpIHtcbiAgY29uc3QgciA9IHRoaXMuc3MucHVzaChkYXRhKVxuICBpZiAodGhpcy5maW5pc2hlZCkgeyByZXR1cm4gciB9XG59XG5cbkhlYWRlclBhcnNlci5wcm90b3R5cGUucmVzZXQgPSBmdW5jdGlvbiAoKSB7XG4gIHRoaXMuZmluaXNoZWQgPSBmYWxzZVxuICB0aGlzLmJ1ZmZlciA9ICcnXG4gIHRoaXMuaGVhZGVyID0ge31cbiAgdGhpcy5zcy5yZXNldCgpXG59XG5cbkhlYWRlclBhcnNlci5wcm90b3R5cGUuX2ZpbmlzaCA9IGZ1bmN0aW9uICgpIHtcbiAgaWYgKHRoaXMuYnVmZmVyKSB7IHRoaXMuX3BhcnNlSGVhZGVyKCkgfVxuICB0aGlzLnNzLm1hdGNoZXMgPSB0aGlzLnNzLm1heE1hdGNoZXNcbiAgY29uc3QgaGVhZGVyID0gdGhpcy5oZWFkZXJcbiAgdGhpcy5oZWFkZXIgPSB7fVxuICB0aGlzLmJ1ZmZlciA9ICcnXG4gIHRoaXMuZmluaXNoZWQgPSB0cnVlXG4gIHRoaXMubnJlYWQgPSB0aGlzLm5wYWlycyA9IDBcbiAgdGhpcy5tYXhlZCA9IGZhbHNlXG4gIHRoaXMuZW1pdCgnaGVhZGVyJywgaGVhZGVyKVxufVxuXG5IZWFkZXJQYXJzZXIucHJvdG90eXBlLl9wYXJzZUhlYWRlciA9IGZ1bmN0aW9uICgpIHtcbiAgaWYgKHRoaXMubnBhaXJzID09PSB0aGlzLm1heEhlYWRlclBhaXJzKSB7IHJldHVybiB9XG5cbiAgY29uc3QgbGluZXMgPSB0aGlzLmJ1ZmZlci5zcGxpdChSRV9DUkxGKVxuICBjb25zdCBsZW4gPSBsaW5lcy5sZW5ndGhcbiAgbGV0IG0sIGhcblxuICBmb3IgKHZhciBpID0gMDsgaSA8IGxlbjsgKytpKSB7IC8vIGVzbGludC1kaXNhYmxlLWxpbmUgbm8tdmFyXG4gICAgaWYgKGxpbmVzW2ldLmxlbmd0aCA9PT0gMCkgeyBjb250aW51ZSB9XG4gICAgaWYgKGxpbmVzW2ldWzBdID09PSAnXFx0JyB8fCBsaW5lc1tpXVswXSA9PT0gJyAnKSB7XG4gICAgICAvLyBmb2xkZWQgaGVhZGVyIGNvbnRlbnRcbiAgICAgIC8vIFJGQzI4MjIgc2F5cyB0byBqdXN0IHJlbW92ZSB0aGUgQ1JMRiBhbmQgbm90IHRoZSB3aGl0ZXNwYWNlIGZvbGxvd2luZ1xuICAgICAgLy8gaXQsIHNvIHdlIGZvbGxvdyB0aGUgUkZDIGFuZCBpbmNsdWRlIHRoZSBsZWFkaW5nIHdoaXRlc3BhY2UgLi4uXG4gICAgICBpZiAoaCkge1xuICAgICAgICB0aGlzLmhlYWRlcltoXVt0aGlzLmhlYWRlcltoXS5sZW5ndGggLSAxXSArPSBsaW5lc1tpXVxuICAgICAgICBjb250aW51ZVxuICAgICAgfVxuICAgIH1cblxuICAgIGNvbnN0IHBvc0NvbG9uID0gbGluZXNbaV0uaW5kZXhPZignOicpXG4gICAgaWYgKFxuICAgICAgcG9zQ29sb24gPT09IC0xIHx8XG4gICAgICBwb3NDb2xvbiA9PT0gMFxuICAgICkge1xuICAgICAgcmV0dXJuXG4gICAgfVxuICAgIG0gPSBSRV9IRFIuZXhlYyhsaW5lc1tpXSlcbiAgICBoID0gbVsxXS50b0xvd2VyQ2FzZSgpXG4gICAgdGhpcy5oZWFkZXJbaF0gPSB0aGlzLmhlYWRlcltoXSB8fCBbXVxuICAgIHRoaXMuaGVhZGVyW2hdLnB1c2goKG1bMl0gfHwgJycpKVxuICAgIGlmICgrK3RoaXMubnBhaXJzID09PSB0aGlzLm1heEhlYWRlclBhaXJzKSB7IGJyZWFrIH1cbiAgfVxufVxuXG5tb2R1bGUuZXhwb3J0cyA9IEhlYWRlclBhcnNlclxuIiwKICAgICIndXNlIHN0cmljdCdcblxuY29uc3QgV3JpdGFibGVTdHJlYW0gPSByZXF1aXJlKCdub2RlOnN0cmVhbScpLldyaXRhYmxlXG5jb25zdCBpbmhlcml0cyA9IHJlcXVpcmUoJ25vZGU6dXRpbCcpLmluaGVyaXRzXG5cbmNvbnN0IFN0cmVhbVNlYXJjaCA9IHJlcXVpcmUoJy4uLy4uL3N0cmVhbXNlYXJjaC9zYm1oJylcblxuY29uc3QgUGFydFN0cmVhbSA9IHJlcXVpcmUoJy4vUGFydFN0cmVhbScpXG5jb25zdCBIZWFkZXJQYXJzZXIgPSByZXF1aXJlKCcuL0hlYWRlclBhcnNlcicpXG5cbmNvbnN0IERBU0ggPSA0NVxuY29uc3QgQl9PTkVEQVNIID0gQnVmZmVyLmZyb20oJy0nKVxuY29uc3QgQl9DUkxGID0gQnVmZmVyLmZyb20oJ1xcclxcbicpXG5jb25zdCBFTVBUWV9GTiA9IGZ1bmN0aW9uICgpIHt9XG5cbmZ1bmN0aW9uIERpY2VyIChjZmcpIHtcbiAgaWYgKCEodGhpcyBpbnN0YW5jZW9mIERpY2VyKSkgeyByZXR1cm4gbmV3IERpY2VyKGNmZykgfVxuICBXcml0YWJsZVN0cmVhbS5jYWxsKHRoaXMsIGNmZylcblxuICBpZiAoIWNmZyB8fCAoIWNmZy5oZWFkZXJGaXJzdCAmJiB0eXBlb2YgY2ZnLmJvdW5kYXJ5ICE9PSAnc3RyaW5nJykpIHsgdGhyb3cgbmV3IFR5cGVFcnJvcignQm91bmRhcnkgcmVxdWlyZWQnKSB9XG5cbiAgaWYgKHR5cGVvZiBjZmcuYm91bmRhcnkgPT09ICdzdHJpbmcnKSB7IHRoaXMuc2V0Qm91bmRhcnkoY2ZnLmJvdW5kYXJ5KSB9IGVsc2UgeyB0aGlzLl9icGFyc2VyID0gdW5kZWZpbmVkIH1cblxuICB0aGlzLl9oZWFkZXJGaXJzdCA9IGNmZy5oZWFkZXJGaXJzdFxuXG4gIHRoaXMuX2Rhc2hlcyA9IDBcbiAgdGhpcy5fcGFydHMgPSAwXG4gIHRoaXMuX2ZpbmlzaGVkID0gZmFsc2VcbiAgdGhpcy5fcmVhbEZpbmlzaCA9IGZhbHNlXG4gIHRoaXMuX2lzUHJlYW1ibGUgPSB0cnVlXG4gIHRoaXMuX2p1c3RNYXRjaGVkID0gZmFsc2VcbiAgdGhpcy5fZmlyc3RXcml0ZSA9IHRydWVcbiAgdGhpcy5faW5IZWFkZXIgPSB0cnVlXG4gIHRoaXMuX3BhcnQgPSB1bmRlZmluZWRcbiAgdGhpcy5fY2IgPSB1bmRlZmluZWRcbiAgdGhpcy5faWdub3JlRGF0YSA9IGZhbHNlXG4gIHRoaXMuX3BhcnRPcHRzID0geyBoaWdoV2F0ZXJNYXJrOiBjZmcucGFydEh3bSB9XG4gIHRoaXMuX3BhdXNlID0gZmFsc2VcblxuICBjb25zdCBzZWxmID0gdGhpc1xuICB0aGlzLl9ocGFyc2VyID0gbmV3IEhlYWRlclBhcnNlcihjZmcpXG4gIHRoaXMuX2hwYXJzZXIub24oJ2hlYWRlcicsIGZ1bmN0aW9uIChoZWFkZXIpIHtcbiAgICBzZWxmLl9pbkhlYWRlciA9IGZhbHNlXG4gICAgc2VsZi5fcGFydC5lbWl0KCdoZWFkZXInLCBoZWFkZXIpXG4gIH0pXG59XG5pbmhlcml0cyhEaWNlciwgV3JpdGFibGVTdHJlYW0pXG5cbkRpY2VyLnByb3RvdHlwZS5lbWl0ID0gZnVuY3Rpb24gKGV2KSB7XG4gIGlmIChldiA9PT0gJ2ZpbmlzaCcgJiYgIXRoaXMuX3JlYWxGaW5pc2gpIHtcbiAgICBpZiAoIXRoaXMuX2ZpbmlzaGVkKSB7XG4gICAgICBjb25zdCBzZWxmID0gdGhpc1xuICAgICAgcHJvY2Vzcy5uZXh0VGljayhmdW5jdGlvbiAoKSB7XG4gICAgICAgIHNlbGYuZW1pdCgnZXJyb3InLCBuZXcgRXJyb3IoJ1VuZXhwZWN0ZWQgZW5kIG9mIG11bHRpcGFydCBkYXRhJykpXG4gICAgICAgIGlmIChzZWxmLl9wYXJ0ICYmICFzZWxmLl9pZ25vcmVEYXRhKSB7XG4gICAgICAgICAgY29uc3QgdHlwZSA9IChzZWxmLl9pc1ByZWFtYmxlID8gJ1ByZWFtYmxlJyA6ICdQYXJ0JylcbiAgICAgICAgICBzZWxmLl9wYXJ0LmVtaXQoJ2Vycm9yJywgbmV3IEVycm9yKHR5cGUgKyAnIHRlcm1pbmF0ZWQgZWFybHkgZHVlIHRvIHVuZXhwZWN0ZWQgZW5kIG9mIG11bHRpcGFydCBkYXRhJykpXG4gICAgICAgICAgc2VsZi5fcGFydC5wdXNoKG51bGwpXG4gICAgICAgICAgcHJvY2Vzcy5uZXh0VGljayhmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICBzZWxmLl9yZWFsRmluaXNoID0gdHJ1ZVxuICAgICAgICAgICAgc2VsZi5lbWl0KCdmaW5pc2gnKVxuICAgICAgICAgICAgc2VsZi5fcmVhbEZpbmlzaCA9IGZhbHNlXG4gICAgICAgICAgfSlcbiAgICAgICAgICByZXR1cm5cbiAgICAgICAgfVxuICAgICAgICBzZWxmLl9yZWFsRmluaXNoID0gdHJ1ZVxuICAgICAgICBzZWxmLmVtaXQoJ2ZpbmlzaCcpXG4gICAgICAgIHNlbGYuX3JlYWxGaW5pc2ggPSBmYWxzZVxuICAgICAgfSlcbiAgICB9XG4gIH0gZWxzZSB7IFdyaXRhYmxlU3RyZWFtLnByb3RvdHlwZS5lbWl0LmFwcGx5KHRoaXMsIGFyZ3VtZW50cykgfVxufVxuXG5EaWNlci5wcm90b3R5cGUuX3dyaXRlID0gZnVuY3Rpb24gKGRhdGEsIGVuY29kaW5nLCBjYikge1xuICAvLyBpZ25vcmUgdW5leHBlY3RlZCBkYXRhIChlLmcuIGV4dHJhIHRyYWlsZXIgZGF0YSBhZnRlciBmaW5pc2hlZClcbiAgaWYgKCF0aGlzLl9ocGFyc2VyICYmICF0aGlzLl9icGFyc2VyKSB7IHJldHVybiBjYigpIH1cblxuICBpZiAodGhpcy5faGVhZGVyRmlyc3QgJiYgdGhpcy5faXNQcmVhbWJsZSkge1xuICAgIGlmICghdGhpcy5fcGFydCkge1xuICAgICAgdGhpcy5fcGFydCA9IG5ldyBQYXJ0U3RyZWFtKHRoaXMuX3BhcnRPcHRzKVxuICAgICAgaWYgKHRoaXMubGlzdGVuZXJDb3VudCgncHJlYW1ibGUnKSAhPT0gMCkgeyB0aGlzLmVtaXQoJ3ByZWFtYmxlJywgdGhpcy5fcGFydCkgfSBlbHNlIHsgdGhpcy5faWdub3JlKCkgfVxuICAgIH1cbiAgICBjb25zdCByID0gdGhpcy5faHBhcnNlci5wdXNoKGRhdGEpXG4gICAgaWYgKCF0aGlzLl9pbkhlYWRlciAmJiByICE9PSB1bmRlZmluZWQgJiYgciA8IGRhdGEubGVuZ3RoKSB7IGRhdGEgPSBkYXRhLnNsaWNlKHIpIH0gZWxzZSB7IHJldHVybiBjYigpIH1cbiAgfVxuXG4gIC8vIGFsbG93cyBmb3IgXCJlYXNpZXJcIiB0ZXN0aW5nXG4gIGlmICh0aGlzLl9maXJzdFdyaXRlKSB7XG4gICAgdGhpcy5fYnBhcnNlci5wdXNoKEJfQ1JMRilcbiAgICB0aGlzLl9maXJzdFdyaXRlID0gZmFsc2VcbiAgfVxuXG4gIHRoaXMuX2JwYXJzZXIucHVzaChkYXRhKVxuXG4gIGlmICh0aGlzLl9wYXVzZSkgeyB0aGlzLl9jYiA9IGNiIH0gZWxzZSB7IGNiKCkgfVxufVxuXG5EaWNlci5wcm90b3R5cGUucmVzZXQgPSBmdW5jdGlvbiAoKSB7XG4gIHRoaXMuX3BhcnQgPSB1bmRlZmluZWRcbiAgdGhpcy5fYnBhcnNlciA9IHVuZGVmaW5lZFxuICB0aGlzLl9ocGFyc2VyID0gdW5kZWZpbmVkXG59XG5cbkRpY2VyLnByb3RvdHlwZS5zZXRCb3VuZGFyeSA9IGZ1bmN0aW9uIChib3VuZGFyeSkge1xuICBjb25zdCBzZWxmID0gdGhpc1xuICB0aGlzLl9icGFyc2VyID0gbmV3IFN0cmVhbVNlYXJjaCgnXFxyXFxuLS0nICsgYm91bmRhcnkpXG4gIHRoaXMuX2JwYXJzZXIub24oJ2luZm8nLCBmdW5jdGlvbiAoaXNNYXRjaCwgZGF0YSwgc3RhcnQsIGVuZCkge1xuICAgIHNlbGYuX29uaW5mbyhpc01hdGNoLCBkYXRhLCBzdGFydCwgZW5kKVxuICB9KVxufVxuXG5EaWNlci5wcm90b3R5cGUuX2lnbm9yZSA9IGZ1bmN0aW9uICgpIHtcbiAgaWYgKHRoaXMuX3BhcnQgJiYgIXRoaXMuX2lnbm9yZURhdGEpIHtcbiAgICB0aGlzLl9pZ25vcmVEYXRhID0gdHJ1ZVxuICAgIHRoaXMuX3BhcnQub24oJ2Vycm9yJywgRU1QVFlfRk4pXG4gICAgLy8gd2UgbXVzdCBwZXJmb3JtIHNvbWUga2luZCBvZiByZWFkIG9uIHRoZSBzdHJlYW0gZXZlbiB0aG91Z2ggd2UgYXJlXG4gICAgLy8gaWdub3JpbmcgdGhlIGRhdGEsIG90aGVyd2lzZSBub2RlJ3MgUmVhZGFibGUgc3RyZWFtIHdpbGwgbm90IGVtaXQgJ2VuZCdcbiAgICAvLyBhZnRlciBwdXNoaW5nIG51bGwgdG8gdGhlIHN0cmVhbVxuICAgIHRoaXMuX3BhcnQucmVzdW1lKClcbiAgfVxufVxuXG5EaWNlci5wcm90b3R5cGUuX29uaW5mbyA9IGZ1bmN0aW9uIChpc01hdGNoLCBkYXRhLCBzdGFydCwgZW5kKSB7XG4gIGxldCBidWY7IGNvbnN0IHNlbGYgPSB0aGlzOyBsZXQgaSA9IDA7IGxldCByOyBsZXQgc2hvdWxkV3JpdGVNb3JlID0gdHJ1ZVxuXG4gIGlmICghdGhpcy5fcGFydCAmJiB0aGlzLl9qdXN0TWF0Y2hlZCAmJiBkYXRhKSB7XG4gICAgd2hpbGUgKHRoaXMuX2Rhc2hlcyA8IDIgJiYgKHN0YXJ0ICsgaSkgPCBlbmQpIHtcbiAgICAgIGlmIChkYXRhW3N0YXJ0ICsgaV0gPT09IERBU0gpIHtcbiAgICAgICAgKytpXG4gICAgICAgICsrdGhpcy5fZGFzaGVzXG4gICAgICB9IGVsc2Uge1xuICAgICAgICBpZiAodGhpcy5fZGFzaGVzKSB7IGJ1ZiA9IEJfT05FREFTSCB9XG4gICAgICAgIHRoaXMuX2Rhc2hlcyA9IDBcbiAgICAgICAgYnJlYWtcbiAgICAgIH1cbiAgICB9XG4gICAgaWYgKHRoaXMuX2Rhc2hlcyA9PT0gMikge1xuICAgICAgaWYgKChzdGFydCArIGkpIDwgZW5kICYmIHRoaXMubGlzdGVuZXJDb3VudCgndHJhaWxlcicpICE9PSAwKSB7IHRoaXMuZW1pdCgndHJhaWxlcicsIGRhdGEuc2xpY2Uoc3RhcnQgKyBpLCBlbmQpKSB9XG4gICAgICB0aGlzLnJlc2V0KClcbiAgICAgIHRoaXMuX2ZpbmlzaGVkID0gdHJ1ZVxuICAgICAgLy8gbm8gbW9yZSBwYXJ0cyB3aWxsIGJlIGFkZGVkXG4gICAgICBpZiAoc2VsZi5fcGFydHMgPT09IDApIHtcbiAgICAgICAgc2VsZi5fcmVhbEZpbmlzaCA9IHRydWVcbiAgICAgICAgc2VsZi5lbWl0KCdmaW5pc2gnKVxuICAgICAgICBzZWxmLl9yZWFsRmluaXNoID0gZmFsc2VcbiAgICAgIH1cbiAgICB9XG4gICAgaWYgKHRoaXMuX2Rhc2hlcykgeyByZXR1cm4gfVxuICB9XG4gIGlmICh0aGlzLl9qdXN0TWF0Y2hlZCkgeyB0aGlzLl9qdXN0TWF0Y2hlZCA9IGZhbHNlIH1cbiAgaWYgKCF0aGlzLl9wYXJ0KSB7XG4gICAgdGhpcy5fcGFydCA9IG5ldyBQYXJ0U3RyZWFtKHRoaXMuX3BhcnRPcHRzKVxuICAgIHRoaXMuX3BhcnQuX3JlYWQgPSBmdW5jdGlvbiAobikge1xuICAgICAgc2VsZi5fdW5wYXVzZSgpXG4gICAgfVxuICAgIGlmICh0aGlzLl9pc1ByZWFtYmxlICYmIHRoaXMubGlzdGVuZXJDb3VudCgncHJlYW1ibGUnKSAhPT0gMCkge1xuICAgICAgdGhpcy5lbWl0KCdwcmVhbWJsZScsIHRoaXMuX3BhcnQpXG4gICAgfSBlbHNlIGlmICh0aGlzLl9pc1ByZWFtYmxlICE9PSB0cnVlICYmIHRoaXMubGlzdGVuZXJDb3VudCgncGFydCcpICE9PSAwKSB7XG4gICAgICB0aGlzLmVtaXQoJ3BhcnQnLCB0aGlzLl9wYXJ0KVxuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLl9pZ25vcmUoKVxuICAgIH1cbiAgICBpZiAoIXRoaXMuX2lzUHJlYW1ibGUpIHsgdGhpcy5faW5IZWFkZXIgPSB0cnVlIH1cbiAgfVxuICBpZiAoZGF0YSAmJiBzdGFydCA8IGVuZCAmJiAhdGhpcy5faWdub3JlRGF0YSkge1xuICAgIGlmICh0aGlzLl9pc1ByZWFtYmxlIHx8ICF0aGlzLl9pbkhlYWRlcikge1xuICAgICAgaWYgKGJ1ZikgeyBzaG91bGRXcml0ZU1vcmUgPSB0aGlzLl9wYXJ0LnB1c2goYnVmKSB9XG4gICAgICBzaG91bGRXcml0ZU1vcmUgPSB0aGlzLl9wYXJ0LnB1c2goZGF0YS5zbGljZShzdGFydCwgZW5kKSlcbiAgICAgIGlmICghc2hvdWxkV3JpdGVNb3JlKSB7IHRoaXMuX3BhdXNlID0gdHJ1ZSB9XG4gICAgfSBlbHNlIGlmICghdGhpcy5faXNQcmVhbWJsZSAmJiB0aGlzLl9pbkhlYWRlcikge1xuICAgICAgaWYgKGJ1ZikgeyB0aGlzLl9ocGFyc2VyLnB1c2goYnVmKSB9XG4gICAgICByID0gdGhpcy5faHBhcnNlci5wdXNoKGRhdGEuc2xpY2Uoc3RhcnQsIGVuZCkpXG4gICAgICBpZiAoIXRoaXMuX2luSGVhZGVyICYmIHIgIT09IHVuZGVmaW5lZCAmJiByIDwgZW5kKSB7IHRoaXMuX29uaW5mbyhmYWxzZSwgZGF0YSwgc3RhcnQgKyByLCBlbmQpIH1cbiAgICB9XG4gIH1cbiAgaWYgKGlzTWF0Y2gpIHtcbiAgICB0aGlzLl9ocGFyc2VyLnJlc2V0KClcbiAgICBpZiAodGhpcy5faXNQcmVhbWJsZSkgeyB0aGlzLl9pc1ByZWFtYmxlID0gZmFsc2UgfSBlbHNlIHtcbiAgICAgIGlmIChzdGFydCAhPT0gZW5kKSB7XG4gICAgICAgICsrdGhpcy5fcGFydHNcbiAgICAgICAgdGhpcy5fcGFydC5vbignZW5kJywgZnVuY3Rpb24gKCkge1xuICAgICAgICAgIGlmICgtLXNlbGYuX3BhcnRzID09PSAwKSB7XG4gICAgICAgICAgICBpZiAoc2VsZi5fZmluaXNoZWQpIHtcbiAgICAgICAgICAgICAgc2VsZi5fcmVhbEZpbmlzaCA9IHRydWVcbiAgICAgICAgICAgICAgc2VsZi5lbWl0KCdmaW5pc2gnKVxuICAgICAgICAgICAgICBzZWxmLl9yZWFsRmluaXNoID0gZmFsc2VcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgIHNlbGYuX3VucGF1c2UoKVxuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgfSlcbiAgICAgIH1cbiAgICB9XG4gICAgdGhpcy5fcGFydC5wdXNoKG51bGwpXG4gICAgdGhpcy5fcGFydCA9IHVuZGVmaW5lZFxuICAgIHRoaXMuX2lnbm9yZURhdGEgPSBmYWxzZVxuICAgIHRoaXMuX2p1c3RNYXRjaGVkID0gdHJ1ZVxuICAgIHRoaXMuX2Rhc2hlcyA9IDBcbiAgfVxufVxuXG5EaWNlci5wcm90b3R5cGUuX3VucGF1c2UgPSBmdW5jdGlvbiAoKSB7XG4gIGlmICghdGhpcy5fcGF1c2UpIHsgcmV0dXJuIH1cblxuICB0aGlzLl9wYXVzZSA9IGZhbHNlXG4gIGlmICh0aGlzLl9jYikge1xuICAgIGNvbnN0IGNiID0gdGhpcy5fY2JcbiAgICB0aGlzLl9jYiA9IHVuZGVmaW5lZFxuICAgIGNiKClcbiAgfVxufVxuXG5tb2R1bGUuZXhwb3J0cyA9IERpY2VyXG4iLAogICAgIid1c2Ugc3RyaWN0J1xuXG4vLyBOb2RlIGhhcyBhbHdheXMgdXRmLThcbmNvbnN0IHV0ZjhEZWNvZGVyID0gbmV3IFRleHREZWNvZGVyKCd1dGYtOCcpXG5jb25zdCB0ZXh0RGVjb2RlcnMgPSBuZXcgTWFwKFtcbiAgWyd1dGYtOCcsIHV0ZjhEZWNvZGVyXSxcbiAgWyd1dGY4JywgdXRmOERlY29kZXJdXG5dKVxuXG5mdW5jdGlvbiBnZXREZWNvZGVyIChjaGFyc2V0KSB7XG4gIGxldCBsY1xuICB3aGlsZSAodHJ1ZSkge1xuICAgIHN3aXRjaCAoY2hhcnNldCkge1xuICAgICAgY2FzZSAndXRmLTgnOlxuICAgICAgY2FzZSAndXRmOCc6XG4gICAgICAgIHJldHVybiBkZWNvZGVycy51dGY4XG4gICAgICBjYXNlICdsYXRpbjEnOlxuICAgICAgY2FzZSAnYXNjaWknOiAvLyBUT0RPOiBNYWtlIHRoZXNlIGEgc2VwYXJhdGUsIHN0cmljdCBkZWNvZGVyP1xuICAgICAgY2FzZSAndXMtYXNjaWknOlxuICAgICAgY2FzZSAnaXNvLTg4NTktMSc6XG4gICAgICBjYXNlICdpc284ODU5LTEnOlxuICAgICAgY2FzZSAnaXNvODg1OTEnOlxuICAgICAgY2FzZSAnaXNvXzg4NTktMSc6XG4gICAgICBjYXNlICd3aW5kb3dzLTEyNTInOlxuICAgICAgY2FzZSAnaXNvXzg4NTktMToxOTg3JzpcbiAgICAgIGNhc2UgJ2NwMTI1Mic6XG4gICAgICBjYXNlICd4LWNwMTI1Mic6XG4gICAgICAgIHJldHVybiBkZWNvZGVycy5sYXRpbjFcbiAgICAgIGNhc2UgJ3V0ZjE2bGUnOlxuICAgICAgY2FzZSAndXRmLTE2bGUnOlxuICAgICAgY2FzZSAndWNzMic6XG4gICAgICBjYXNlICd1Y3MtMic6XG4gICAgICAgIHJldHVybiBkZWNvZGVycy51dGYxNmxlXG4gICAgICBjYXNlICdiYXNlNjQnOlxuICAgICAgICByZXR1cm4gZGVjb2RlcnMuYmFzZTY0XG4gICAgICBkZWZhdWx0OlxuICAgICAgICBpZiAobGMgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgIGxjID0gdHJ1ZVxuICAgICAgICAgIGNoYXJzZXQgPSBjaGFyc2V0LnRvTG93ZXJDYXNlKClcbiAgICAgICAgICBjb250aW51ZVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiBkZWNvZGVycy5vdGhlci5iaW5kKGNoYXJzZXQpXG4gICAgfVxuICB9XG59XG5cbmNvbnN0IGRlY29kZXJzID0ge1xuICB1dGY4OiAoZGF0YSwgc291cmNlRW5jb2RpbmcpID0+IHtcbiAgICBpZiAoZGF0YS5sZW5ndGggPT09IDApIHtcbiAgICAgIHJldHVybiAnJ1xuICAgIH1cbiAgICBpZiAodHlwZW9mIGRhdGEgPT09ICdzdHJpbmcnKSB7XG4gICAgICBkYXRhID0gQnVmZmVyLmZyb20oZGF0YSwgc291cmNlRW5jb2RpbmcpXG4gICAgfVxuICAgIHJldHVybiBkYXRhLnV0ZjhTbGljZSgwLCBkYXRhLmxlbmd0aClcbiAgfSxcblxuICBsYXRpbjE6IChkYXRhLCBzb3VyY2VFbmNvZGluZykgPT4ge1xuICAgIGlmIChkYXRhLmxlbmd0aCA9PT0gMCkge1xuICAgICAgcmV0dXJuICcnXG4gICAgfVxuICAgIGlmICh0eXBlb2YgZGF0YSA9PT0gJ3N0cmluZycpIHtcbiAgICAgIHJldHVybiBkYXRhXG4gICAgfVxuICAgIHJldHVybiBkYXRhLmxhdGluMVNsaWNlKDAsIGRhdGEubGVuZ3RoKVxuICB9LFxuXG4gIHV0ZjE2bGU6IChkYXRhLCBzb3VyY2VFbmNvZGluZykgPT4ge1xuICAgIGlmIChkYXRhLmxlbmd0aCA9PT0gMCkge1xuICAgICAgcmV0dXJuICcnXG4gICAgfVxuICAgIGlmICh0eXBlb2YgZGF0YSA9PT0gJ3N0cmluZycpIHtcbiAgICAgIGRhdGEgPSBCdWZmZXIuZnJvbShkYXRhLCBzb3VyY2VFbmNvZGluZylcbiAgICB9XG4gICAgcmV0dXJuIGRhdGEudWNzMlNsaWNlKDAsIGRhdGEubGVuZ3RoKVxuICB9LFxuXG4gIGJhc2U2NDogKGRhdGEsIHNvdXJjZUVuY29kaW5nKSA9PiB7XG4gICAgaWYgKGRhdGEubGVuZ3RoID09PSAwKSB7XG4gICAgICByZXR1cm4gJydcbiAgICB9XG4gICAgaWYgKHR5cGVvZiBkYXRhID09PSAnc3RyaW5nJykge1xuICAgICAgZGF0YSA9IEJ1ZmZlci5mcm9tKGRhdGEsIHNvdXJjZUVuY29kaW5nKVxuICAgIH1cbiAgICByZXR1cm4gZGF0YS5iYXNlNjRTbGljZSgwLCBkYXRhLmxlbmd0aClcbiAgfSxcblxuICBvdGhlcjogKGRhdGEsIHNvdXJjZUVuY29kaW5nKSA9PiB7XG4gICAgaWYgKGRhdGEubGVuZ3RoID09PSAwKSB7XG4gICAgICByZXR1cm4gJydcbiAgICB9XG4gICAgaWYgKHR5cGVvZiBkYXRhID09PSAnc3RyaW5nJykge1xuICAgICAgZGF0YSA9IEJ1ZmZlci5mcm9tKGRhdGEsIHNvdXJjZUVuY29kaW5nKVxuICAgIH1cblxuICAgIGlmICh0ZXh0RGVjb2RlcnMuaGFzKHRoaXMudG9TdHJpbmcoKSkpIHtcbiAgICAgIHRyeSB7XG4gICAgICAgIHJldHVybiB0ZXh0RGVjb2RlcnMuZ2V0KHRoaXMpLmRlY29kZShkYXRhKVxuICAgICAgfSBjYXRjaCB7fVxuICAgIH1cbiAgICByZXR1cm4gdHlwZW9mIGRhdGEgPT09ICdzdHJpbmcnXG4gICAgICA/IGRhdGFcbiAgICAgIDogZGF0YS50b1N0cmluZygpXG4gIH1cbn1cblxuZnVuY3Rpb24gZGVjb2RlVGV4dCAodGV4dCwgc291cmNlRW5jb2RpbmcsIGRlc3RFbmNvZGluZykge1xuICBpZiAodGV4dCkge1xuICAgIHJldHVybiBnZXREZWNvZGVyKGRlc3RFbmNvZGluZykodGV4dCwgc291cmNlRW5jb2RpbmcpXG4gIH1cbiAgcmV0dXJuIHRleHRcbn1cblxubW9kdWxlLmV4cG9ydHMgPSBkZWNvZGVUZXh0XG4iLAogICAgIi8qIGVzbGludC1kaXNhYmxlIG9iamVjdC1wcm9wZXJ0eS1uZXdsaW5lICovXG4ndXNlIHN0cmljdCdcblxuY29uc3QgZGVjb2RlVGV4dCA9IHJlcXVpcmUoJy4vZGVjb2RlVGV4dCcpXG5cbmNvbnN0IFJFX0VOQ09ERUQgPSAvJVthLWZBLUYwLTldW2EtZkEtRjAtOV0vZ1xuXG5jb25zdCBFbmNvZGVkTG9va3VwID0ge1xuICAnJTAwJzogJ1xceDAwJywgJyUwMSc6ICdcXHgwMScsICclMDInOiAnXFx4MDInLCAnJTAzJzogJ1xceDAzJywgJyUwNCc6ICdcXHgwNCcsXG4gICclMDUnOiAnXFx4MDUnLCAnJTA2JzogJ1xceDA2JywgJyUwNyc6ICdcXHgwNycsICclMDgnOiAnXFx4MDgnLCAnJTA5JzogJ1xceDA5JyxcbiAgJyUwYSc6ICdcXHgwYScsICclMEEnOiAnXFx4MGEnLCAnJTBiJzogJ1xceDBiJywgJyUwQic6ICdcXHgwYicsICclMGMnOiAnXFx4MGMnLFxuICAnJTBDJzogJ1xceDBjJywgJyUwZCc6ICdcXHgwZCcsICclMEQnOiAnXFx4MGQnLCAnJTBlJzogJ1xceDBlJywgJyUwRSc6ICdcXHgwZScsXG4gICclMGYnOiAnXFx4MGYnLCAnJTBGJzogJ1xceDBmJywgJyUxMCc6ICdcXHgxMCcsICclMTEnOiAnXFx4MTEnLCAnJTEyJzogJ1xceDEyJyxcbiAgJyUxMyc6ICdcXHgxMycsICclMTQnOiAnXFx4MTQnLCAnJTE1JzogJ1xceDE1JywgJyUxNic6ICdcXHgxNicsICclMTcnOiAnXFx4MTcnLFxuICAnJTE4JzogJ1xceDE4JywgJyUxOSc6ICdcXHgxOScsICclMWEnOiAnXFx4MWEnLCAnJTFBJzogJ1xceDFhJywgJyUxYic6ICdcXHgxYicsXG4gICclMUInOiAnXFx4MWInLCAnJTFjJzogJ1xceDFjJywgJyUxQyc6ICdcXHgxYycsICclMWQnOiAnXFx4MWQnLCAnJTFEJzogJ1xceDFkJyxcbiAgJyUxZSc6ICdcXHgxZScsICclMUUnOiAnXFx4MWUnLCAnJTFmJzogJ1xceDFmJywgJyUxRic6ICdcXHgxZicsICclMjAnOiAnXFx4MjAnLFxuICAnJTIxJzogJ1xceDIxJywgJyUyMic6ICdcXHgyMicsICclMjMnOiAnXFx4MjMnLCAnJTI0JzogJ1xceDI0JywgJyUyNSc6ICdcXHgyNScsXG4gICclMjYnOiAnXFx4MjYnLCAnJTI3JzogJ1xceDI3JywgJyUyOCc6ICdcXHgyOCcsICclMjknOiAnXFx4MjknLCAnJTJhJzogJ1xceDJhJyxcbiAgJyUyQSc6ICdcXHgyYScsICclMmInOiAnXFx4MmInLCAnJTJCJzogJ1xceDJiJywgJyUyYyc6ICdcXHgyYycsICclMkMnOiAnXFx4MmMnLFxuICAnJTJkJzogJ1xceDJkJywgJyUyRCc6ICdcXHgyZCcsICclMmUnOiAnXFx4MmUnLCAnJTJFJzogJ1xceDJlJywgJyUyZic6ICdcXHgyZicsXG4gICclMkYnOiAnXFx4MmYnLCAnJTMwJzogJ1xceDMwJywgJyUzMSc6ICdcXHgzMScsICclMzInOiAnXFx4MzInLCAnJTMzJzogJ1xceDMzJyxcbiAgJyUzNCc6ICdcXHgzNCcsICclMzUnOiAnXFx4MzUnLCAnJTM2JzogJ1xceDM2JywgJyUzNyc6ICdcXHgzNycsICclMzgnOiAnXFx4MzgnLFxuICAnJTM5JzogJ1xceDM5JywgJyUzYSc6ICdcXHgzYScsICclM0EnOiAnXFx4M2EnLCAnJTNiJzogJ1xceDNiJywgJyUzQic6ICdcXHgzYicsXG4gICclM2MnOiAnXFx4M2MnLCAnJTNDJzogJ1xceDNjJywgJyUzZCc6ICdcXHgzZCcsICclM0QnOiAnXFx4M2QnLCAnJTNlJzogJ1xceDNlJyxcbiAgJyUzRSc6ICdcXHgzZScsICclM2YnOiAnXFx4M2YnLCAnJTNGJzogJ1xceDNmJywgJyU0MCc6ICdcXHg0MCcsICclNDEnOiAnXFx4NDEnLFxuICAnJTQyJzogJ1xceDQyJywgJyU0Myc6ICdcXHg0MycsICclNDQnOiAnXFx4NDQnLCAnJTQ1JzogJ1xceDQ1JywgJyU0Nic6ICdcXHg0NicsXG4gICclNDcnOiAnXFx4NDcnLCAnJTQ4JzogJ1xceDQ4JywgJyU0OSc6ICdcXHg0OScsICclNGEnOiAnXFx4NGEnLCAnJTRBJzogJ1xceDRhJyxcbiAgJyU0Yic6ICdcXHg0YicsICclNEInOiAnXFx4NGInLCAnJTRjJzogJ1xceDRjJywgJyU0Qyc6ICdcXHg0YycsICclNGQnOiAnXFx4NGQnLFxuICAnJTREJzogJ1xceDRkJywgJyU0ZSc6ICdcXHg0ZScsICclNEUnOiAnXFx4NGUnLCAnJTRmJzogJ1xceDRmJywgJyU0Ric6ICdcXHg0ZicsXG4gICclNTAnOiAnXFx4NTAnLCAnJTUxJzogJ1xceDUxJywgJyU1Mic6ICdcXHg1MicsICclNTMnOiAnXFx4NTMnLCAnJTU0JzogJ1xceDU0JyxcbiAgJyU1NSc6ICdcXHg1NScsICclNTYnOiAnXFx4NTYnLCAnJTU3JzogJ1xceDU3JywgJyU1OCc6ICdcXHg1OCcsICclNTknOiAnXFx4NTknLFxuICAnJTVhJzogJ1xceDVhJywgJyU1QSc6ICdcXHg1YScsICclNWInOiAnXFx4NWInLCAnJTVCJzogJ1xceDViJywgJyU1Yyc6ICdcXHg1YycsXG4gICclNUMnOiAnXFx4NWMnLCAnJTVkJzogJ1xceDVkJywgJyU1RCc6ICdcXHg1ZCcsICclNWUnOiAnXFx4NWUnLCAnJTVFJzogJ1xceDVlJyxcbiAgJyU1Zic6ICdcXHg1ZicsICclNUYnOiAnXFx4NWYnLCAnJTYwJzogJ1xceDYwJywgJyU2MSc6ICdcXHg2MScsICclNjInOiAnXFx4NjInLFxuICAnJTYzJzogJ1xceDYzJywgJyU2NCc6ICdcXHg2NCcsICclNjUnOiAnXFx4NjUnLCAnJTY2JzogJ1xceDY2JywgJyU2Nyc6ICdcXHg2NycsXG4gICclNjgnOiAnXFx4NjgnLCAnJTY5JzogJ1xceDY5JywgJyU2YSc6ICdcXHg2YScsICclNkEnOiAnXFx4NmEnLCAnJTZiJzogJ1xceDZiJyxcbiAgJyU2Qic6ICdcXHg2YicsICclNmMnOiAnXFx4NmMnLCAnJTZDJzogJ1xceDZjJywgJyU2ZCc6ICdcXHg2ZCcsICclNkQnOiAnXFx4NmQnLFxuICAnJTZlJzogJ1xceDZlJywgJyU2RSc6ICdcXHg2ZScsICclNmYnOiAnXFx4NmYnLCAnJTZGJzogJ1xceDZmJywgJyU3MCc6ICdcXHg3MCcsXG4gICclNzEnOiAnXFx4NzEnLCAnJTcyJzogJ1xceDcyJywgJyU3Myc6ICdcXHg3MycsICclNzQnOiAnXFx4NzQnLCAnJTc1JzogJ1xceDc1JyxcbiAgJyU3Nic6ICdcXHg3NicsICclNzcnOiAnXFx4NzcnLCAnJTc4JzogJ1xceDc4JywgJyU3OSc6ICdcXHg3OScsICclN2EnOiAnXFx4N2EnLFxuICAnJTdBJzogJ1xceDdhJywgJyU3Yic6ICdcXHg3YicsICclN0InOiAnXFx4N2InLCAnJTdjJzogJ1xceDdjJywgJyU3Qyc6ICdcXHg3YycsXG4gICclN2QnOiAnXFx4N2QnLCAnJTdEJzogJ1xceDdkJywgJyU3ZSc6ICdcXHg3ZScsICclN0UnOiAnXFx4N2UnLCAnJTdmJzogJ1xceDdmJyxcbiAgJyU3Ric6ICdcXHg3ZicsICclODAnOiAnXFx4ODAnLCAnJTgxJzogJ1xceDgxJywgJyU4Mic6ICdcXHg4MicsICclODMnOiAnXFx4ODMnLFxuICAnJTg0JzogJ1xceDg0JywgJyU4NSc6ICdcXHg4NScsICclODYnOiAnXFx4ODYnLCAnJTg3JzogJ1xceDg3JywgJyU4OCc6ICdcXHg4OCcsXG4gICclODknOiAnXFx4ODknLCAnJThhJzogJ1xceDhhJywgJyU4QSc6ICdcXHg4YScsICclOGInOiAnXFx4OGInLCAnJThCJzogJ1xceDhiJyxcbiAgJyU4Yyc6ICdcXHg4YycsICclOEMnOiAnXFx4OGMnLCAnJThkJzogJ1xceDhkJywgJyU4RCc6ICdcXHg4ZCcsICclOGUnOiAnXFx4OGUnLFxuICAnJThFJzogJ1xceDhlJywgJyU4Zic6ICdcXHg4ZicsICclOEYnOiAnXFx4OGYnLCAnJTkwJzogJ1xceDkwJywgJyU5MSc6ICdcXHg5MScsXG4gICclOTInOiAnXFx4OTInLCAnJTkzJzogJ1xceDkzJywgJyU5NCc6ICdcXHg5NCcsICclOTUnOiAnXFx4OTUnLCAnJTk2JzogJ1xceDk2JyxcbiAgJyU5Nyc6ICdcXHg5NycsICclOTgnOiAnXFx4OTgnLCAnJTk5JzogJ1xceDk5JywgJyU5YSc6ICdcXHg5YScsICclOUEnOiAnXFx4OWEnLFxuICAnJTliJzogJ1xceDliJywgJyU5Qic6ICdcXHg5YicsICclOWMnOiAnXFx4OWMnLCAnJTlDJzogJ1xceDljJywgJyU5ZCc6ICdcXHg5ZCcsXG4gICclOUQnOiAnXFx4OWQnLCAnJTllJzogJ1xceDllJywgJyU5RSc6ICdcXHg5ZScsICclOWYnOiAnXFx4OWYnLCAnJTlGJzogJ1xceDlmJyxcbiAgJyVhMCc6ICdcXHhhMCcsICclQTAnOiAnXFx4YTAnLCAnJWExJzogJ1xceGExJywgJyVBMSc6ICdcXHhhMScsICclYTInOiAnXFx4YTInLFxuICAnJUEyJzogJ1xceGEyJywgJyVhMyc6ICdcXHhhMycsICclQTMnOiAnXFx4YTMnLCAnJWE0JzogJ1xceGE0JywgJyVBNCc6ICdcXHhhNCcsXG4gICclYTUnOiAnXFx4YTUnLCAnJUE1JzogJ1xceGE1JywgJyVhNic6ICdcXHhhNicsICclQTYnOiAnXFx4YTYnLCAnJWE3JzogJ1xceGE3JyxcbiAgJyVBNyc6ICdcXHhhNycsICclYTgnOiAnXFx4YTgnLCAnJUE4JzogJ1xceGE4JywgJyVhOSc6ICdcXHhhOScsICclQTknOiAnXFx4YTknLFxuICAnJWFhJzogJ1xceGFhJywgJyVBYSc6ICdcXHhhYScsICclYUEnOiAnXFx4YWEnLCAnJUFBJzogJ1xceGFhJywgJyVhYic6ICdcXHhhYicsXG4gICclQWInOiAnXFx4YWInLCAnJWFCJzogJ1xceGFiJywgJyVBQic6ICdcXHhhYicsICclYWMnOiAnXFx4YWMnLCAnJUFjJzogJ1xceGFjJyxcbiAgJyVhQyc6ICdcXHhhYycsICclQUMnOiAnXFx4YWMnLCAnJWFkJzogJ1xceGFkJywgJyVBZCc6ICdcXHhhZCcsICclYUQnOiAnXFx4YWQnLFxuICAnJUFEJzogJ1xceGFkJywgJyVhZSc6ICdcXHhhZScsICclQWUnOiAnXFx4YWUnLCAnJWFFJzogJ1xceGFlJywgJyVBRSc6ICdcXHhhZScsXG4gICclYWYnOiAnXFx4YWYnLCAnJUFmJzogJ1xceGFmJywgJyVhRic6ICdcXHhhZicsICclQUYnOiAnXFx4YWYnLCAnJWIwJzogJ1xceGIwJyxcbiAgJyVCMCc6ICdcXHhiMCcsICclYjEnOiAnXFx4YjEnLCAnJUIxJzogJ1xceGIxJywgJyViMic6ICdcXHhiMicsICclQjInOiAnXFx4YjInLFxuICAnJWIzJzogJ1xceGIzJywgJyVCMyc6ICdcXHhiMycsICclYjQnOiAnXFx4YjQnLCAnJUI0JzogJ1xceGI0JywgJyViNSc6ICdcXHhiNScsXG4gICclQjUnOiAnXFx4YjUnLCAnJWI2JzogJ1xceGI2JywgJyVCNic6ICdcXHhiNicsICclYjcnOiAnXFx4YjcnLCAnJUI3JzogJ1xceGI3JyxcbiAgJyViOCc6ICdcXHhiOCcsICclQjgnOiAnXFx4YjgnLCAnJWI5JzogJ1xceGI5JywgJyVCOSc6ICdcXHhiOScsICclYmEnOiAnXFx4YmEnLFxuICAnJUJhJzogJ1xceGJhJywgJyViQSc6ICdcXHhiYScsICclQkEnOiAnXFx4YmEnLCAnJWJiJzogJ1xceGJiJywgJyVCYic6ICdcXHhiYicsXG4gICclYkInOiAnXFx4YmInLCAnJUJCJzogJ1xceGJiJywgJyViYyc6ICdcXHhiYycsICclQmMnOiAnXFx4YmMnLCAnJWJDJzogJ1xceGJjJyxcbiAgJyVCQyc6ICdcXHhiYycsICclYmQnOiAnXFx4YmQnLCAnJUJkJzogJ1xceGJkJywgJyViRCc6ICdcXHhiZCcsICclQkQnOiAnXFx4YmQnLFxuICAnJWJlJzogJ1xceGJlJywgJyVCZSc6ICdcXHhiZScsICclYkUnOiAnXFx4YmUnLCAnJUJFJzogJ1xceGJlJywgJyViZic6ICdcXHhiZicsXG4gICclQmYnOiAnXFx4YmYnLCAnJWJGJzogJ1xceGJmJywgJyVCRic6ICdcXHhiZicsICclYzAnOiAnXFx4YzAnLCAnJUMwJzogJ1xceGMwJyxcbiAgJyVjMSc6ICdcXHhjMScsICclQzEnOiAnXFx4YzEnLCAnJWMyJzogJ1xceGMyJywgJyVDMic6ICdcXHhjMicsICclYzMnOiAnXFx4YzMnLFxuICAnJUMzJzogJ1xceGMzJywgJyVjNCc6ICdcXHhjNCcsICclQzQnOiAnXFx4YzQnLCAnJWM1JzogJ1xceGM1JywgJyVDNSc6ICdcXHhjNScsXG4gICclYzYnOiAnXFx4YzYnLCAnJUM2JzogJ1xceGM2JywgJyVjNyc6ICdcXHhjNycsICclQzcnOiAnXFx4YzcnLCAnJWM4JzogJ1xceGM4JyxcbiAgJyVDOCc6ICdcXHhjOCcsICclYzknOiAnXFx4YzknLCAnJUM5JzogJ1xceGM5JywgJyVjYSc6ICdcXHhjYScsICclQ2EnOiAnXFx4Y2EnLFxuICAnJWNBJzogJ1xceGNhJywgJyVDQSc6ICdcXHhjYScsICclY2InOiAnXFx4Y2InLCAnJUNiJzogJ1xceGNiJywgJyVjQic6ICdcXHhjYicsXG4gICclQ0InOiAnXFx4Y2InLCAnJWNjJzogJ1xceGNjJywgJyVDYyc6ICdcXHhjYycsICclY0MnOiAnXFx4Y2MnLCAnJUNDJzogJ1xceGNjJyxcbiAgJyVjZCc6ICdcXHhjZCcsICclQ2QnOiAnXFx4Y2QnLCAnJWNEJzogJ1xceGNkJywgJyVDRCc6ICdcXHhjZCcsICclY2UnOiAnXFx4Y2UnLFxuICAnJUNlJzogJ1xceGNlJywgJyVjRSc6ICdcXHhjZScsICclQ0UnOiAnXFx4Y2UnLCAnJWNmJzogJ1xceGNmJywgJyVDZic6ICdcXHhjZicsXG4gICclY0YnOiAnXFx4Y2YnLCAnJUNGJzogJ1xceGNmJywgJyVkMCc6ICdcXHhkMCcsICclRDAnOiAnXFx4ZDAnLCAnJWQxJzogJ1xceGQxJyxcbiAgJyVEMSc6ICdcXHhkMScsICclZDInOiAnXFx4ZDInLCAnJUQyJzogJ1xceGQyJywgJyVkMyc6ICdcXHhkMycsICclRDMnOiAnXFx4ZDMnLFxuICAnJWQ0JzogJ1xceGQ0JywgJyVENCc6ICdcXHhkNCcsICclZDUnOiAnXFx4ZDUnLCAnJUQ1JzogJ1xceGQ1JywgJyVkNic6ICdcXHhkNicsXG4gICclRDYnOiAnXFx4ZDYnLCAnJWQ3JzogJ1xceGQ3JywgJyVENyc6ICdcXHhkNycsICclZDgnOiAnXFx4ZDgnLCAnJUQ4JzogJ1xceGQ4JyxcbiAgJyVkOSc6ICdcXHhkOScsICclRDknOiAnXFx4ZDknLCAnJWRhJzogJ1xceGRhJywgJyVEYSc6ICdcXHhkYScsICclZEEnOiAnXFx4ZGEnLFxuICAnJURBJzogJ1xceGRhJywgJyVkYic6ICdcXHhkYicsICclRGInOiAnXFx4ZGInLCAnJWRCJzogJ1xceGRiJywgJyVEQic6ICdcXHhkYicsXG4gICclZGMnOiAnXFx4ZGMnLCAnJURjJzogJ1xceGRjJywgJyVkQyc6ICdcXHhkYycsICclREMnOiAnXFx4ZGMnLCAnJWRkJzogJ1xceGRkJyxcbiAgJyVEZCc6ICdcXHhkZCcsICclZEQnOiAnXFx4ZGQnLCAnJUREJzogJ1xceGRkJywgJyVkZSc6ICdcXHhkZScsICclRGUnOiAnXFx4ZGUnLFxuICAnJWRFJzogJ1xceGRlJywgJyVERSc6ICdcXHhkZScsICclZGYnOiAnXFx4ZGYnLCAnJURmJzogJ1xceGRmJywgJyVkRic6ICdcXHhkZicsXG4gICclREYnOiAnXFx4ZGYnLCAnJWUwJzogJ1xceGUwJywgJyVFMCc6ICdcXHhlMCcsICclZTEnOiAnXFx4ZTEnLCAnJUUxJzogJ1xceGUxJyxcbiAgJyVlMic6ICdcXHhlMicsICclRTInOiAnXFx4ZTInLCAnJWUzJzogJ1xceGUzJywgJyVFMyc6ICdcXHhlMycsICclZTQnOiAnXFx4ZTQnLFxuICAnJUU0JzogJ1xceGU0JywgJyVlNSc6ICdcXHhlNScsICclRTUnOiAnXFx4ZTUnLCAnJWU2JzogJ1xceGU2JywgJyVFNic6ICdcXHhlNicsXG4gICclZTcnOiAnXFx4ZTcnLCAnJUU3JzogJ1xceGU3JywgJyVlOCc6ICdcXHhlOCcsICclRTgnOiAnXFx4ZTgnLCAnJWU5JzogJ1xceGU5JyxcbiAgJyVFOSc6ICdcXHhlOScsICclZWEnOiAnXFx4ZWEnLCAnJUVhJzogJ1xceGVhJywgJyVlQSc6ICdcXHhlYScsICclRUEnOiAnXFx4ZWEnLFxuICAnJWViJzogJ1xceGViJywgJyVFYic6ICdcXHhlYicsICclZUInOiAnXFx4ZWInLCAnJUVCJzogJ1xceGViJywgJyVlYyc6ICdcXHhlYycsXG4gICclRWMnOiAnXFx4ZWMnLCAnJWVDJzogJ1xceGVjJywgJyVFQyc6ICdcXHhlYycsICclZWQnOiAnXFx4ZWQnLCAnJUVkJzogJ1xceGVkJyxcbiAgJyVlRCc6ICdcXHhlZCcsICclRUQnOiAnXFx4ZWQnLCAnJWVlJzogJ1xceGVlJywgJyVFZSc6ICdcXHhlZScsICclZUUnOiAnXFx4ZWUnLFxuICAnJUVFJzogJ1xceGVlJywgJyVlZic6ICdcXHhlZicsICclRWYnOiAnXFx4ZWYnLCAnJWVGJzogJ1xceGVmJywgJyVFRic6ICdcXHhlZicsXG4gICclZjAnOiAnXFx4ZjAnLCAnJUYwJzogJ1xceGYwJywgJyVmMSc6ICdcXHhmMScsICclRjEnOiAnXFx4ZjEnLCAnJWYyJzogJ1xceGYyJyxcbiAgJyVGMic6ICdcXHhmMicsICclZjMnOiAnXFx4ZjMnLCAnJUYzJzogJ1xceGYzJywgJyVmNCc6ICdcXHhmNCcsICclRjQnOiAnXFx4ZjQnLFxuICAnJWY1JzogJ1xceGY1JywgJyVGNSc6ICdcXHhmNScsICclZjYnOiAnXFx4ZjYnLCAnJUY2JzogJ1xceGY2JywgJyVmNyc6ICdcXHhmNycsXG4gICclRjcnOiAnXFx4ZjcnLCAnJWY4JzogJ1xceGY4JywgJyVGOCc6ICdcXHhmOCcsICclZjknOiAnXFx4ZjknLCAnJUY5JzogJ1xceGY5JyxcbiAgJyVmYSc6ICdcXHhmYScsICclRmEnOiAnXFx4ZmEnLCAnJWZBJzogJ1xceGZhJywgJyVGQSc6ICdcXHhmYScsICclZmInOiAnXFx4ZmInLFxuICAnJUZiJzogJ1xceGZiJywgJyVmQic6ICdcXHhmYicsICclRkInOiAnXFx4ZmInLCAnJWZjJzogJ1xceGZjJywgJyVGYyc6ICdcXHhmYycsXG4gICclZkMnOiAnXFx4ZmMnLCAnJUZDJzogJ1xceGZjJywgJyVmZCc6ICdcXHhmZCcsICclRmQnOiAnXFx4ZmQnLCAnJWZEJzogJ1xceGZkJyxcbiAgJyVGRCc6ICdcXHhmZCcsICclZmUnOiAnXFx4ZmUnLCAnJUZlJzogJ1xceGZlJywgJyVmRSc6ICdcXHhmZScsICclRkUnOiAnXFx4ZmUnLFxuICAnJWZmJzogJ1xceGZmJywgJyVGZic6ICdcXHhmZicsICclZkYnOiAnXFx4ZmYnLCAnJUZGJzogJ1xceGZmJ1xufVxuXG5mdW5jdGlvbiBlbmNvZGVkUmVwbGFjZXIgKG1hdGNoKSB7XG4gIHJldHVybiBFbmNvZGVkTG9va3VwW21hdGNoXVxufVxuXG5jb25zdCBTVEFURV9LRVkgPSAwXG5jb25zdCBTVEFURV9WQUxVRSA9IDFcbmNvbnN0IFNUQVRFX0NIQVJTRVQgPSAyXG5jb25zdCBTVEFURV9MQU5HID0gM1xuXG5mdW5jdGlvbiBwYXJzZVBhcmFtcyAoc3RyKSB7XG4gIGNvbnN0IHJlcyA9IFtdXG4gIGxldCBzdGF0ZSA9IFNUQVRFX0tFWVxuICBsZXQgY2hhcnNldCA9ICcnXG4gIGxldCBpbnF1b3RlID0gZmFsc2VcbiAgbGV0IGVzY2FwaW5nID0gZmFsc2VcbiAgbGV0IHAgPSAwXG4gIGxldCB0bXAgPSAnJ1xuICBjb25zdCBsZW4gPSBzdHIubGVuZ3RoXG5cbiAgZm9yICh2YXIgaSA9IDA7IGkgPCBsZW47ICsraSkgeyAvLyBlc2xpbnQtZGlzYWJsZS1saW5lIG5vLXZhclxuICAgIGNvbnN0IGNoYXIgPSBzdHJbaV1cbiAgICBpZiAoY2hhciA9PT0gJ1xcXFwnICYmIGlucXVvdGUpIHtcbiAgICAgIGlmIChlc2NhcGluZykgeyBlc2NhcGluZyA9IGZhbHNlIH0gZWxzZSB7XG4gICAgICAgIGVzY2FwaW5nID0gdHJ1ZVxuICAgICAgICBjb250aW51ZVxuICAgICAgfVxuICAgIH0gZWxzZSBpZiAoY2hhciA9PT0gJ1wiJykge1xuICAgICAgaWYgKCFlc2NhcGluZykge1xuICAgICAgICBpZiAoaW5xdW90ZSkge1xuICAgICAgICAgIGlucXVvdGUgPSBmYWxzZVxuICAgICAgICAgIHN0YXRlID0gU1RBVEVfS0VZXG4gICAgICAgIH0gZWxzZSB7IGlucXVvdGUgPSB0cnVlIH1cbiAgICAgICAgY29udGludWVcbiAgICAgIH0gZWxzZSB7IGVzY2FwaW5nID0gZmFsc2UgfVxuICAgIH0gZWxzZSB7XG4gICAgICBpZiAoZXNjYXBpbmcgJiYgaW5xdW90ZSkgeyB0bXAgKz0gJ1xcXFwnIH1cbiAgICAgIGVzY2FwaW5nID0gZmFsc2VcbiAgICAgIGlmICgoc3RhdGUgPT09IFNUQVRFX0NIQVJTRVQgfHwgc3RhdGUgPT09IFNUQVRFX0xBTkcpICYmIGNoYXIgPT09IFwiJ1wiKSB7XG4gICAgICAgIGlmIChzdGF0ZSA9PT0gU1RBVEVfQ0hBUlNFVCkge1xuICAgICAgICAgIHN0YXRlID0gU1RBVEVfTEFOR1xuICAgICAgICAgIGNoYXJzZXQgPSB0bXAuc3Vic3RyaW5nKDEpXG4gICAgICAgIH0gZWxzZSB7IHN0YXRlID0gU1RBVEVfVkFMVUUgfVxuICAgICAgICB0bXAgPSAnJ1xuICAgICAgICBjb250aW51ZVxuICAgICAgfSBlbHNlIGlmIChzdGF0ZSA9PT0gU1RBVEVfS0VZICYmXG4gICAgICAgIChjaGFyID09PSAnKicgfHwgY2hhciA9PT0gJz0nKSAmJlxuICAgICAgICByZXMubGVuZ3RoKSB7XG4gICAgICAgIHN0YXRlID0gY2hhciA9PT0gJyonXG4gICAgICAgICAgPyBTVEFURV9DSEFSU0VUXG4gICAgICAgICAgOiBTVEFURV9WQUxVRVxuICAgICAgICByZXNbcF0gPSBbdG1wLCB1bmRlZmluZWRdXG4gICAgICAgIHRtcCA9ICcnXG4gICAgICAgIGNvbnRpbnVlXG4gICAgICB9IGVsc2UgaWYgKCFpbnF1b3RlICYmIGNoYXIgPT09ICc7Jykge1xuICAgICAgICBzdGF0ZSA9IFNUQVRFX0tFWVxuICAgICAgICBpZiAoY2hhcnNldCkge1xuICAgICAgICAgIGlmICh0bXAubGVuZ3RoKSB7XG4gICAgICAgICAgICB0bXAgPSBkZWNvZGVUZXh0KHRtcC5yZXBsYWNlKFJFX0VOQ09ERUQsIGVuY29kZWRSZXBsYWNlciksXG4gICAgICAgICAgICAgICdiaW5hcnknLFxuICAgICAgICAgICAgICBjaGFyc2V0KVxuICAgICAgICAgIH1cbiAgICAgICAgICBjaGFyc2V0ID0gJydcbiAgICAgICAgfSBlbHNlIGlmICh0bXAubGVuZ3RoKSB7XG4gICAgICAgICAgdG1wID0gZGVjb2RlVGV4dCh0bXAsICdiaW5hcnknLCAndXRmOCcpXG4gICAgICAgIH1cbiAgICAgICAgaWYgKHJlc1twXSA9PT0gdW5kZWZpbmVkKSB7IHJlc1twXSA9IHRtcCB9IGVsc2UgeyByZXNbcF1bMV0gPSB0bXAgfVxuICAgICAgICB0bXAgPSAnJ1xuICAgICAgICArK3BcbiAgICAgICAgY29udGludWVcbiAgICAgIH0gZWxzZSBpZiAoIWlucXVvdGUgJiYgKGNoYXIgPT09ICcgJyB8fCBjaGFyID09PSAnXFx0JykpIHsgY29udGludWUgfVxuICAgIH1cbiAgICB0bXAgKz0gY2hhclxuICB9XG4gIGlmIChjaGFyc2V0ICYmIHRtcC5sZW5ndGgpIHtcbiAgICB0bXAgPSBkZWNvZGVUZXh0KHRtcC5yZXBsYWNlKFJFX0VOQ09ERUQsIGVuY29kZWRSZXBsYWNlciksXG4gICAgICAnYmluYXJ5JyxcbiAgICAgIGNoYXJzZXQpXG4gIH0gZWxzZSBpZiAodG1wKSB7XG4gICAgdG1wID0gZGVjb2RlVGV4dCh0bXAsICdiaW5hcnknLCAndXRmOCcpXG4gIH1cblxuICBpZiAocmVzW3BdID09PSB1bmRlZmluZWQpIHtcbiAgICBpZiAodG1wKSB7IHJlc1twXSA9IHRtcCB9XG4gIH0gZWxzZSB7IHJlc1twXVsxXSA9IHRtcCB9XG5cbiAgcmV0dXJuIHJlc1xufVxuXG5tb2R1bGUuZXhwb3J0cyA9IHBhcnNlUGFyYW1zXG4iLAogICAgIid1c2Ugc3RyaWN0J1xuXG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIGJhc2VuYW1lIChwYXRoKSB7XG4gIGlmICh0eXBlb2YgcGF0aCAhPT0gJ3N0cmluZycpIHsgcmV0dXJuICcnIH1cbiAgZm9yICh2YXIgaSA9IHBhdGgubGVuZ3RoIC0gMTsgaSA+PSAwOyAtLWkpIHsgLy8gZXNsaW50LWRpc2FibGUtbGluZSBuby12YXJcbiAgICBzd2l0Y2ggKHBhdGguY2hhckNvZGVBdChpKSkge1xuICAgICAgY2FzZSAweDJGOiAvLyAnLydcbiAgICAgIGNhc2UgMHg1QzogLy8gJ1xcJ1xuICAgICAgICBwYXRoID0gcGF0aC5zbGljZShpICsgMSlcbiAgICAgICAgcmV0dXJuIChwYXRoID09PSAnLi4nIHx8IHBhdGggPT09ICcuJyA/ICcnIDogcGF0aClcbiAgICB9XG4gIH1cbiAgcmV0dXJuIChwYXRoID09PSAnLi4nIHx8IHBhdGggPT09ICcuJyA/ICcnIDogcGF0aClcbn1cbiIsCiAgICAiJ3VzZSBzdHJpY3QnXG5cbi8vIFRPRE86XG4vLyAgKiBzdXBwb3J0IDEgbmVzdGVkIG11bHRpcGFydCBsZXZlbFxuLy8gICAgKHNlZSBzZWNvbmQgbXVsdGlwYXJ0IGV4YW1wbGUgaGVyZTpcbi8vICAgICBodHRwOi8vd3d3LnczLm9yZy9UUi9odG1sNDAxL2ludGVyYWN0L2Zvcm1zLmh0bWwjZGlkeC1tdWx0aXBhcnRmb3JtLWRhdGEpXG4vLyAgKiBzdXBwb3J0IGxpbWl0cy5maWVsZE5hbWVTaXplXG4vLyAgICAgLS0gdGhpcyB3aWxsIHJlcXVpcmUgbW9kaWZpY2F0aW9ucyB0byB1dGlscy5wYXJzZVBhcmFtc1xuXG5jb25zdCB7IFJlYWRhYmxlIH0gPSByZXF1aXJlKCdub2RlOnN0cmVhbScpXG5jb25zdCB7IGluaGVyaXRzIH0gPSByZXF1aXJlKCdub2RlOnV0aWwnKVxuXG5jb25zdCBEaWNlciA9IHJlcXVpcmUoJy4uLy4uL2RlcHMvZGljZXIvbGliL0RpY2VyJylcblxuY29uc3QgcGFyc2VQYXJhbXMgPSByZXF1aXJlKCcuLi91dGlscy9wYXJzZVBhcmFtcycpXG5jb25zdCBkZWNvZGVUZXh0ID0gcmVxdWlyZSgnLi4vdXRpbHMvZGVjb2RlVGV4dCcpXG5jb25zdCBiYXNlbmFtZSA9IHJlcXVpcmUoJy4uL3V0aWxzL2Jhc2VuYW1lJylcbmNvbnN0IGdldExpbWl0ID0gcmVxdWlyZSgnLi4vdXRpbHMvZ2V0TGltaXQnKVxuXG5jb25zdCBSRV9CT1VOREFSWSA9IC9eYm91bmRhcnkkL2lcbmNvbnN0IFJFX0ZJRUxEID0gL15mb3JtLWRhdGEkL2lcbmNvbnN0IFJFX0NIQVJTRVQgPSAvXmNoYXJzZXQkL2lcbmNvbnN0IFJFX0ZJTEVOQU1FID0gL15maWxlbmFtZSQvaVxuY29uc3QgUkVfTkFNRSA9IC9ebmFtZSQvaVxuXG5NdWx0aXBhcnQuZGV0ZWN0ID0gL15tdWx0aXBhcnRcXC9mb3JtLWRhdGEvaVxuZnVuY3Rpb24gTXVsdGlwYXJ0IChib3ksIGNmZykge1xuICBsZXQgaVxuICBsZXQgbGVuXG4gIGNvbnN0IHNlbGYgPSB0aGlzXG4gIGxldCBib3VuZGFyeVxuICBjb25zdCBsaW1pdHMgPSBjZmcubGltaXRzXG4gIGNvbnN0IGlzUGFydEFGaWxlID0gY2ZnLmlzUGFydEFGaWxlIHx8ICgoZmllbGROYW1lLCBjb250ZW50VHlwZSwgZmlsZU5hbWUpID0+IChjb250ZW50VHlwZSA9PT0gJ2FwcGxpY2F0aW9uL29jdGV0LXN0cmVhbScgfHwgZmlsZU5hbWUgIT09IHVuZGVmaW5lZCkpXG4gIGNvbnN0IHBhcnNlZENvblR5cGUgPSBjZmcucGFyc2VkQ29uVHlwZSB8fCBbXVxuICBjb25zdCBkZWZDaGFyc2V0ID0gY2ZnLmRlZkNoYXJzZXQgfHwgJ3V0ZjgnXG4gIGNvbnN0IHByZXNlcnZlUGF0aCA9IGNmZy5wcmVzZXJ2ZVBhdGhcbiAgY29uc3QgZmlsZU9wdHMgPSB7IGhpZ2hXYXRlck1hcms6IGNmZy5maWxlSHdtIH1cblxuICBmb3IgKGkgPSAwLCBsZW4gPSBwYXJzZWRDb25UeXBlLmxlbmd0aDsgaSA8IGxlbjsgKytpKSB7XG4gICAgaWYgKEFycmF5LmlzQXJyYXkocGFyc2VkQ29uVHlwZVtpXSkgJiZcbiAgICAgIFJFX0JPVU5EQVJZLnRlc3QocGFyc2VkQ29uVHlwZVtpXVswXSkpIHtcbiAgICAgIGJvdW5kYXJ5ID0gcGFyc2VkQ29uVHlwZVtpXVsxXVxuICAgICAgYnJlYWtcbiAgICB9XG4gIH1cblxuICBmdW5jdGlvbiBjaGVja0ZpbmlzaGVkICgpIHtcbiAgICBpZiAobmVuZHMgPT09IDAgJiYgZmluaXNoZWQgJiYgIWJveS5fZG9uZSkge1xuICAgICAgZmluaXNoZWQgPSBmYWxzZVxuICAgICAgc2VsZi5lbmQoKVxuICAgIH1cbiAgfVxuXG4gIGlmICh0eXBlb2YgYm91bmRhcnkgIT09ICdzdHJpbmcnKSB7IHRocm93IG5ldyBFcnJvcignTXVsdGlwYXJ0OiBCb3VuZGFyeSBub3QgZm91bmQnKSB9XG5cbiAgY29uc3QgZmllbGRTaXplTGltaXQgPSBnZXRMaW1pdChsaW1pdHMsICdmaWVsZFNpemUnLCAxICogMTAyNCAqIDEwMjQpXG4gIGNvbnN0IGZpbGVTaXplTGltaXQgPSBnZXRMaW1pdChsaW1pdHMsICdmaWxlU2l6ZScsIEluZmluaXR5KVxuICBjb25zdCBmaWxlc0xpbWl0ID0gZ2V0TGltaXQobGltaXRzLCAnZmlsZXMnLCBJbmZpbml0eSlcbiAgY29uc3QgZmllbGRzTGltaXQgPSBnZXRMaW1pdChsaW1pdHMsICdmaWVsZHMnLCBJbmZpbml0eSlcbiAgY29uc3QgcGFydHNMaW1pdCA9IGdldExpbWl0KGxpbWl0cywgJ3BhcnRzJywgSW5maW5pdHkpXG4gIGNvbnN0IGhlYWRlclBhaXJzTGltaXQgPSBnZXRMaW1pdChsaW1pdHMsICdoZWFkZXJQYWlycycsIDIwMDApXG4gIGNvbnN0IGhlYWRlclNpemVMaW1pdCA9IGdldExpbWl0KGxpbWl0cywgJ2hlYWRlclNpemUnLCA4MCAqIDEwMjQpXG5cbiAgbGV0IG5maWxlcyA9IDBcbiAgbGV0IG5maWVsZHMgPSAwXG4gIGxldCBuZW5kcyA9IDBcbiAgbGV0IGN1ckZpbGVcbiAgbGV0IGN1ckZpZWxkXG4gIGxldCBmaW5pc2hlZCA9IGZhbHNlXG5cbiAgdGhpcy5fbmVlZERyYWluID0gZmFsc2VcbiAgdGhpcy5fcGF1c2UgPSBmYWxzZVxuICB0aGlzLl9jYiA9IHVuZGVmaW5lZFxuICB0aGlzLl9ucGFydHMgPSAwXG4gIHRoaXMuX2JveSA9IGJveVxuXG4gIGNvbnN0IHBhcnNlckNmZyA9IHtcbiAgICBib3VuZGFyeSxcbiAgICBtYXhIZWFkZXJQYWlyczogaGVhZGVyUGFpcnNMaW1pdCxcbiAgICBtYXhIZWFkZXJTaXplOiBoZWFkZXJTaXplTGltaXQsXG4gICAgcGFydEh3bTogZmlsZU9wdHMuaGlnaFdhdGVyTWFyayxcbiAgICBoaWdoV2F0ZXJNYXJrOiBjZmcuaGlnaFdhdGVyTWFya1xuICB9XG5cbiAgdGhpcy5wYXJzZXIgPSBuZXcgRGljZXIocGFyc2VyQ2ZnKVxuICB0aGlzLnBhcnNlci5vbignZHJhaW4nLCBmdW5jdGlvbiAoKSB7XG4gICAgc2VsZi5fbmVlZERyYWluID0gZmFsc2VcbiAgICBpZiAoc2VsZi5fY2IgJiYgIXNlbGYuX3BhdXNlKSB7XG4gICAgICBjb25zdCBjYiA9IHNlbGYuX2NiXG4gICAgICBzZWxmLl9jYiA9IHVuZGVmaW5lZFxuICAgICAgY2IoKVxuICAgIH1cbiAgfSkub24oJ3BhcnQnLCBmdW5jdGlvbiBvblBhcnQgKHBhcnQpIHtcbiAgICBpZiAoKytzZWxmLl9ucGFydHMgPiBwYXJ0c0xpbWl0KSB7XG4gICAgICBzZWxmLnBhcnNlci5yZW1vdmVMaXN0ZW5lcigncGFydCcsIG9uUGFydClcbiAgICAgIHNlbGYucGFyc2VyLm9uKCdwYXJ0Jywgc2tpcFBhcnQpXG4gICAgICBib3kuaGl0UGFydHNMaW1pdCA9IHRydWVcbiAgICAgIGJveS5lbWl0KCdwYXJ0c0xpbWl0JylcbiAgICAgIHJldHVybiBza2lwUGFydChwYXJ0KVxuICAgIH1cblxuICAgIC8vIGhhY2sgYmVjYXVzZSBzdHJlYW1zMiBfYWx3YXlzXyBkb2Vzbid0IGVtaXQgJ2VuZCcgdW50aWwgbmV4dFRpY2ssIHNvIGxldFxuICAgIC8vIHVzIGVtaXQgJ2VuZCcgZWFybHkgc2luY2Ugd2Uga25vdyB0aGUgcGFydCBoYXMgZW5kZWQgaWYgd2UgYXJlIGFscmVhZHlcbiAgICAvLyBzZWVpbmcgdGhlIG5leHQgcGFydFxuICAgIGlmIChjdXJGaWVsZCkge1xuICAgICAgY29uc3QgZmllbGQgPSBjdXJGaWVsZFxuICAgICAgZmllbGQuZW1pdCgnZW5kJylcbiAgICAgIGZpZWxkLnJlbW92ZUFsbExpc3RlbmVycygnZW5kJylcbiAgICB9XG5cbiAgICBwYXJ0Lm9uKCdoZWFkZXInLCBmdW5jdGlvbiAoaGVhZGVyKSB7XG4gICAgICBsZXQgY29udHlwZVxuICAgICAgbGV0IGZpZWxkbmFtZVxuICAgICAgbGV0IHBhcnNlZFxuICAgICAgbGV0IGNoYXJzZXRcbiAgICAgIGxldCBlbmNvZGluZ1xuICAgICAgbGV0IGZpbGVuYW1lXG4gICAgICBsZXQgbnNpemUgPSAwXG5cbiAgICAgIGlmIChoZWFkZXJbJ2NvbnRlbnQtdHlwZSddKSB7XG4gICAgICAgIHBhcnNlZCA9IHBhcnNlUGFyYW1zKGhlYWRlclsnY29udGVudC10eXBlJ11bMF0pXG4gICAgICAgIGlmIChwYXJzZWRbMF0pIHtcbiAgICAgICAgICBjb250eXBlID0gcGFyc2VkWzBdLnRvTG93ZXJDYXNlKClcbiAgICAgICAgICBmb3IgKGkgPSAwLCBsZW4gPSBwYXJzZWQubGVuZ3RoOyBpIDwgbGVuOyArK2kpIHtcbiAgICAgICAgICAgIGlmIChSRV9DSEFSU0VULnRlc3QocGFyc2VkW2ldWzBdKSkge1xuICAgICAgICAgICAgICBjaGFyc2V0ID0gcGFyc2VkW2ldWzFdLnRvTG93ZXJDYXNlKClcbiAgICAgICAgICAgICAgYnJlYWtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgaWYgKGNvbnR5cGUgPT09IHVuZGVmaW5lZCkgeyBjb250eXBlID0gJ3RleHQvcGxhaW4nIH1cbiAgICAgIGlmIChjaGFyc2V0ID09PSB1bmRlZmluZWQpIHsgY2hhcnNldCA9IGRlZkNoYXJzZXQgfVxuXG4gICAgICBpZiAoaGVhZGVyWydjb250ZW50LWRpc3Bvc2l0aW9uJ10pIHtcbiAgICAgICAgcGFyc2VkID0gcGFyc2VQYXJhbXMoaGVhZGVyWydjb250ZW50LWRpc3Bvc2l0aW9uJ11bMF0pXG4gICAgICAgIGlmICghUkVfRklFTEQudGVzdChwYXJzZWRbMF0pKSB7IHJldHVybiBza2lwUGFydChwYXJ0KSB9XG4gICAgICAgIGZvciAoaSA9IDAsIGxlbiA9IHBhcnNlZC5sZW5ndGg7IGkgPCBsZW47ICsraSkge1xuICAgICAgICAgIGlmIChSRV9OQU1FLnRlc3QocGFyc2VkW2ldWzBdKSkge1xuICAgICAgICAgICAgZmllbGRuYW1lID0gcGFyc2VkW2ldWzFdXG4gICAgICAgICAgfSBlbHNlIGlmIChSRV9GSUxFTkFNRS50ZXN0KHBhcnNlZFtpXVswXSkpIHtcbiAgICAgICAgICAgIGZpbGVuYW1lID0gcGFyc2VkW2ldWzFdXG4gICAgICAgICAgICBpZiAoIXByZXNlcnZlUGF0aCkgeyBmaWxlbmFtZSA9IGJhc2VuYW1lKGZpbGVuYW1lKSB9XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9IGVsc2UgeyByZXR1cm4gc2tpcFBhcnQocGFydCkgfVxuXG4gICAgICBpZiAoaGVhZGVyWydjb250ZW50LXRyYW5zZmVyLWVuY29kaW5nJ10pIHsgZW5jb2RpbmcgPSBoZWFkZXJbJ2NvbnRlbnQtdHJhbnNmZXItZW5jb2RpbmcnXVswXS50b0xvd2VyQ2FzZSgpIH0gZWxzZSB7IGVuY29kaW5nID0gJzdiaXQnIH1cblxuICAgICAgbGV0IG9uRGF0YSxcbiAgICAgICAgb25FbmRcblxuICAgICAgaWYgKGlzUGFydEFGaWxlKGZpZWxkbmFtZSwgY29udHlwZSwgZmlsZW5hbWUpKSB7XG4gICAgICAgIC8vIGZpbGUvYmluYXJ5IGZpZWxkXG4gICAgICAgIGlmIChuZmlsZXMgPT09IGZpbGVzTGltaXQpIHtcbiAgICAgICAgICBpZiAoIWJveS5oaXRGaWxlc0xpbWl0KSB7XG4gICAgICAgICAgICBib3kuaGl0RmlsZXNMaW1pdCA9IHRydWVcbiAgICAgICAgICAgIGJveS5lbWl0KCdmaWxlc0xpbWl0JylcbiAgICAgICAgICB9XG4gICAgICAgICAgcmV0dXJuIHNraXBQYXJ0KHBhcnQpXG4gICAgICAgIH1cblxuICAgICAgICArK25maWxlc1xuXG4gICAgICAgIGlmIChib3kubGlzdGVuZXJDb3VudCgnZmlsZScpID09PSAwKSB7XG4gICAgICAgICAgc2VsZi5wYXJzZXIuX2lnbm9yZSgpXG4gICAgICAgICAgcmV0dXJuXG4gICAgICAgIH1cblxuICAgICAgICArK25lbmRzXG4gICAgICAgIGNvbnN0IGZpbGUgPSBuZXcgRmlsZVN0cmVhbShmaWxlT3B0cylcbiAgICAgICAgY3VyRmlsZSA9IGZpbGVcbiAgICAgICAgZmlsZS5vbignZW5kJywgZnVuY3Rpb24gKCkge1xuICAgICAgICAgIC0tbmVuZHNcbiAgICAgICAgICBzZWxmLl9wYXVzZSA9IGZhbHNlXG4gICAgICAgICAgY2hlY2tGaW5pc2hlZCgpXG4gICAgICAgICAgaWYgKHNlbGYuX2NiICYmICFzZWxmLl9uZWVkRHJhaW4pIHtcbiAgICAgICAgICAgIGNvbnN0IGNiID0gc2VsZi5fY2JcbiAgICAgICAgICAgIHNlbGYuX2NiID0gdW5kZWZpbmVkXG4gICAgICAgICAgICBjYigpXG4gICAgICAgICAgfVxuICAgICAgICB9KVxuICAgICAgICBmaWxlLl9yZWFkID0gZnVuY3Rpb24gKG4pIHtcbiAgICAgICAgICBpZiAoIXNlbGYuX3BhdXNlKSB7IHJldHVybiB9XG4gICAgICAgICAgc2VsZi5fcGF1c2UgPSBmYWxzZVxuICAgICAgICAgIGlmIChzZWxmLl9jYiAmJiAhc2VsZi5fbmVlZERyYWluKSB7XG4gICAgICAgICAgICBjb25zdCBjYiA9IHNlbGYuX2NiXG4gICAgICAgICAgICBzZWxmLl9jYiA9IHVuZGVmaW5lZFxuICAgICAgICAgICAgY2IoKVxuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBib3kuZW1pdCgnZmlsZScsIGZpZWxkbmFtZSwgZmlsZSwgZmlsZW5hbWUsIGVuY29kaW5nLCBjb250eXBlKVxuXG4gICAgICAgIG9uRGF0YSA9IGZ1bmN0aW9uIChkYXRhKSB7XG4gICAgICAgICAgaWYgKChuc2l6ZSArPSBkYXRhLmxlbmd0aCkgPiBmaWxlU2l6ZUxpbWl0KSB7XG4gICAgICAgICAgICBjb25zdCBleHRyYWxlbiA9IGZpbGVTaXplTGltaXQgLSBuc2l6ZSArIGRhdGEubGVuZ3RoXG4gICAgICAgICAgICBpZiAoZXh0cmFsZW4gPiAwKSB7IGZpbGUucHVzaChkYXRhLnNsaWNlKDAsIGV4dHJhbGVuKSkgfVxuICAgICAgICAgICAgZmlsZS50cnVuY2F0ZWQgPSB0cnVlXG4gICAgICAgICAgICBmaWxlLmJ5dGVzUmVhZCA9IGZpbGVTaXplTGltaXRcbiAgICAgICAgICAgIHBhcnQucmVtb3ZlQWxsTGlzdGVuZXJzKCdkYXRhJylcbiAgICAgICAgICAgIGZpbGUuZW1pdCgnbGltaXQnKVxuICAgICAgICAgICAgcmV0dXJuXG4gICAgICAgICAgfSBlbHNlIGlmICghZmlsZS5wdXNoKGRhdGEpKSB7IHNlbGYuX3BhdXNlID0gdHJ1ZSB9XG5cbiAgICAgICAgICBmaWxlLmJ5dGVzUmVhZCA9IG5zaXplXG4gICAgICAgIH1cblxuICAgICAgICBvbkVuZCA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICBjdXJGaWxlID0gdW5kZWZpbmVkXG4gICAgICAgICAgZmlsZS5wdXNoKG51bGwpXG4gICAgICAgIH1cbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIC8vIG5vbi1maWxlIGZpZWxkXG4gICAgICAgIGlmIChuZmllbGRzID09PSBmaWVsZHNMaW1pdCkge1xuICAgICAgICAgIGlmICghYm95LmhpdEZpZWxkc0xpbWl0KSB7XG4gICAgICAgICAgICBib3kuaGl0RmllbGRzTGltaXQgPSB0cnVlXG4gICAgICAgICAgICBib3kuZW1pdCgnZmllbGRzTGltaXQnKVxuICAgICAgICAgIH1cbiAgICAgICAgICByZXR1cm4gc2tpcFBhcnQocGFydClcbiAgICAgICAgfVxuXG4gICAgICAgICsrbmZpZWxkc1xuICAgICAgICArK25lbmRzXG4gICAgICAgIGxldCBidWZmZXIgPSAnJ1xuICAgICAgICBsZXQgdHJ1bmNhdGVkID0gZmFsc2VcbiAgICAgICAgY3VyRmllbGQgPSBwYXJ0XG5cbiAgICAgICAgb25EYXRhID0gZnVuY3Rpb24gKGRhdGEpIHtcbiAgICAgICAgICBpZiAoKG5zaXplICs9IGRhdGEubGVuZ3RoKSA+IGZpZWxkU2l6ZUxpbWl0KSB7XG4gICAgICAgICAgICBjb25zdCBleHRyYWxlbiA9IChmaWVsZFNpemVMaW1pdCAtIChuc2l6ZSAtIGRhdGEubGVuZ3RoKSlcbiAgICAgICAgICAgIGJ1ZmZlciArPSBkYXRhLnRvU3RyaW5nKCdiaW5hcnknLCAwLCBleHRyYWxlbilcbiAgICAgICAgICAgIHRydW5jYXRlZCA9IHRydWVcbiAgICAgICAgICAgIHBhcnQucmVtb3ZlQWxsTGlzdGVuZXJzKCdkYXRhJylcbiAgICAgICAgICB9IGVsc2UgeyBidWZmZXIgKz0gZGF0YS50b1N0cmluZygnYmluYXJ5JykgfVxuICAgICAgICB9XG5cbiAgICAgICAgb25FbmQgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgY3VyRmllbGQgPSB1bmRlZmluZWRcbiAgICAgICAgICBpZiAoYnVmZmVyLmxlbmd0aCkgeyBidWZmZXIgPSBkZWNvZGVUZXh0KGJ1ZmZlciwgJ2JpbmFyeScsIGNoYXJzZXQpIH1cbiAgICAgICAgICBib3kuZW1pdCgnZmllbGQnLCBmaWVsZG5hbWUsIGJ1ZmZlciwgZmFsc2UsIHRydW5jYXRlZCwgZW5jb2RpbmcsIGNvbnR5cGUpXG4gICAgICAgICAgLS1uZW5kc1xuICAgICAgICAgIGNoZWNrRmluaXNoZWQoKVxuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIC8qIEFzIG9mIG5vZGVAMmVmZTRhYjc2MTY2NiAodjAuMTAuMjkrL3YwLjExLjE0KyksIGJ1c2JveSBoYWQgYmVjb21lXG4gICAgICAgICBicm9rZW4uIFN0cmVhbXMyL3N0cmVhbXMzIGlzIGEgaHVnZSBibGFjayBib3ggb2YgY29uZnVzaW9uLCBidXRcbiAgICAgICAgIHNvbWVob3cgb3ZlcnJpZGluZyB0aGUgc3luYyBzdGF0ZSBzZWVtcyB0byBmaXggdGhpbmdzIGFnYWluIChhbmQgc3RpbGxcbiAgICAgICAgIHNlZW1zIHRvIHdvcmsgZm9yIHByZXZpb3VzIG5vZGUgdmVyc2lvbnMpLlxuICAgICAgKi9cbiAgICAgIHBhcnQuX3JlYWRhYmxlU3RhdGUuc3luYyA9IGZhbHNlXG5cbiAgICAgIHBhcnQub24oJ2RhdGEnLCBvbkRhdGEpXG4gICAgICBwYXJ0Lm9uKCdlbmQnLCBvbkVuZClcbiAgICB9KS5vbignZXJyb3InLCBmdW5jdGlvbiAoZXJyKSB7XG4gICAgICBpZiAoY3VyRmlsZSkgeyBjdXJGaWxlLmVtaXQoJ2Vycm9yJywgZXJyKSB9XG4gICAgfSlcbiAgfSkub24oJ2Vycm9yJywgZnVuY3Rpb24gKGVycikge1xuICAgIGJveS5lbWl0KCdlcnJvcicsIGVycilcbiAgfSkub24oJ2ZpbmlzaCcsIGZ1bmN0aW9uICgpIHtcbiAgICBmaW5pc2hlZCA9IHRydWVcbiAgICBjaGVja0ZpbmlzaGVkKClcbiAgfSlcbn1cblxuTXVsdGlwYXJ0LnByb3RvdHlwZS53cml0ZSA9IGZ1bmN0aW9uIChjaHVuaywgY2IpIHtcbiAgY29uc3QgciA9IHRoaXMucGFyc2VyLndyaXRlKGNodW5rKVxuICBpZiAociAmJiAhdGhpcy5fcGF1c2UpIHtcbiAgICBjYigpXG4gIH0gZWxzZSB7XG4gICAgdGhpcy5fbmVlZERyYWluID0gIXJcbiAgICB0aGlzLl9jYiA9IGNiXG4gIH1cbn1cblxuTXVsdGlwYXJ0LnByb3RvdHlwZS5lbmQgPSBmdW5jdGlvbiAoKSB7XG4gIGNvbnN0IHNlbGYgPSB0aGlzXG5cbiAgaWYgKHNlbGYucGFyc2VyLndyaXRhYmxlKSB7XG4gICAgc2VsZi5wYXJzZXIuZW5kKClcbiAgfSBlbHNlIGlmICghc2VsZi5fYm95Ll9kb25lKSB7XG4gICAgcHJvY2Vzcy5uZXh0VGljayhmdW5jdGlvbiAoKSB7XG4gICAgICBzZWxmLl9ib3kuX2RvbmUgPSB0cnVlXG4gICAgICBzZWxmLl9ib3kuZW1pdCgnZmluaXNoJylcbiAgICB9KVxuICB9XG59XG5cbmZ1bmN0aW9uIHNraXBQYXJ0IChwYXJ0KSB7XG4gIHBhcnQucmVzdW1lKClcbn1cblxuZnVuY3Rpb24gRmlsZVN0cmVhbSAob3B0cykge1xuICBSZWFkYWJsZS5jYWxsKHRoaXMsIG9wdHMpXG5cbiAgdGhpcy5ieXRlc1JlYWQgPSAwXG5cbiAgdGhpcy50cnVuY2F0ZWQgPSBmYWxzZVxufVxuXG5pbmhlcml0cyhGaWxlU3RyZWFtLCBSZWFkYWJsZSlcblxuRmlsZVN0cmVhbS5wcm90b3R5cGUuX3JlYWQgPSBmdW5jdGlvbiAobikge31cblxubW9kdWxlLmV4cG9ydHMgPSBNdWx0aXBhcnRcbiIsCiAgICAiJ3VzZSBzdHJpY3QnXG5cbmNvbnN0IFJFX1BMVVMgPSAvXFwrL2dcblxuY29uc3QgSEVYID0gW1xuICAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLFxuICAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLFxuICAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLFxuICAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAwLCAwLCAwLCAwLCAwLCAwLFxuICAwLCAxLCAxLCAxLCAxLCAxLCAxLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLFxuICAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLFxuICAwLCAxLCAxLCAxLCAxLCAxLCAxLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLFxuICAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwXG5dXG5cbmZ1bmN0aW9uIERlY29kZXIgKCkge1xuICB0aGlzLmJ1ZmZlciA9IHVuZGVmaW5lZFxufVxuRGVjb2Rlci5wcm90b3R5cGUud3JpdGUgPSBmdW5jdGlvbiAoc3RyKSB7XG4gIC8vIFJlcGxhY2UgJysnIHdpdGggJyAnIGJlZm9yZSBkZWNvZGluZ1xuICBzdHIgPSBzdHIucmVwbGFjZShSRV9QTFVTLCAnICcpXG4gIGxldCByZXMgPSAnJ1xuICBsZXQgaSA9IDA7IGxldCBwID0gMDsgY29uc3QgbGVuID0gc3RyLmxlbmd0aFxuICBmb3IgKDsgaSA8IGxlbjsgKytpKSB7XG4gICAgaWYgKHRoaXMuYnVmZmVyICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIGlmICghSEVYW3N0ci5jaGFyQ29kZUF0KGkpXSkge1xuICAgICAgICByZXMgKz0gJyUnICsgdGhpcy5idWZmZXJcbiAgICAgICAgdGhpcy5idWZmZXIgPSB1bmRlZmluZWRcbiAgICAgICAgLS1pIC8vIHJldHJ5IGNoYXJhY3RlclxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdGhpcy5idWZmZXIgKz0gc3RyW2ldXG4gICAgICAgICsrcFxuICAgICAgICBpZiAodGhpcy5idWZmZXIubGVuZ3RoID09PSAyKSB7XG4gICAgICAgICAgcmVzICs9IFN0cmluZy5mcm9tQ2hhckNvZGUocGFyc2VJbnQodGhpcy5idWZmZXIsIDE2KSlcbiAgICAgICAgICB0aGlzLmJ1ZmZlciA9IHVuZGVmaW5lZFxuICAgICAgICB9XG4gICAgICB9XG4gICAgfSBlbHNlIGlmIChzdHJbaV0gPT09ICclJykge1xuICAgICAgaWYgKGkgPiBwKSB7XG4gICAgICAgIHJlcyArPSBzdHIuc3Vic3RyaW5nKHAsIGkpXG4gICAgICAgIHAgPSBpXG4gICAgICB9XG4gICAgICB0aGlzLmJ1ZmZlciA9ICcnXG4gICAgICArK3BcbiAgICB9XG4gIH1cbiAgaWYgKHAgPCBsZW4gJiYgdGhpcy5idWZmZXIgPT09IHVuZGVmaW5lZCkgeyByZXMgKz0gc3RyLnN1YnN0cmluZyhwKSB9XG4gIHJldHVybiByZXNcbn1cbkRlY29kZXIucHJvdG90eXBlLnJlc2V0ID0gZnVuY3Rpb24gKCkge1xuICB0aGlzLmJ1ZmZlciA9IHVuZGVmaW5lZFxufVxuXG5tb2R1bGUuZXhwb3J0cyA9IERlY29kZXJcbiIsCiAgICAiJ3VzZSBzdHJpY3QnXG5cbmNvbnN0IERlY29kZXIgPSByZXF1aXJlKCcuLi91dGlscy9EZWNvZGVyJylcbmNvbnN0IGRlY29kZVRleHQgPSByZXF1aXJlKCcuLi91dGlscy9kZWNvZGVUZXh0JylcbmNvbnN0IGdldExpbWl0ID0gcmVxdWlyZSgnLi4vdXRpbHMvZ2V0TGltaXQnKVxuXG5jb25zdCBSRV9DSEFSU0VUID0gL15jaGFyc2V0JC9pXG5cblVybEVuY29kZWQuZGV0ZWN0ID0gL15hcHBsaWNhdGlvblxcL3gtd3d3LWZvcm0tdXJsZW5jb2RlZC9pXG5mdW5jdGlvbiBVcmxFbmNvZGVkIChib3ksIGNmZykge1xuICBjb25zdCBsaW1pdHMgPSBjZmcubGltaXRzXG4gIGNvbnN0IHBhcnNlZENvblR5cGUgPSBjZmcucGFyc2VkQ29uVHlwZVxuICB0aGlzLmJveSA9IGJveVxuXG4gIHRoaXMuZmllbGRTaXplTGltaXQgPSBnZXRMaW1pdChsaW1pdHMsICdmaWVsZFNpemUnLCAxICogMTAyNCAqIDEwMjQpXG4gIHRoaXMuZmllbGROYW1lU2l6ZUxpbWl0ID0gZ2V0TGltaXQobGltaXRzLCAnZmllbGROYW1lU2l6ZScsIDEwMClcbiAgdGhpcy5maWVsZHNMaW1pdCA9IGdldExpbWl0KGxpbWl0cywgJ2ZpZWxkcycsIEluZmluaXR5KVxuXG4gIGxldCBjaGFyc2V0XG4gIGZvciAodmFyIGkgPSAwLCBsZW4gPSBwYXJzZWRDb25UeXBlLmxlbmd0aDsgaSA8IGxlbjsgKytpKSB7IC8vIGVzbGludC1kaXNhYmxlLWxpbmUgbm8tdmFyXG4gICAgaWYgKEFycmF5LmlzQXJyYXkocGFyc2VkQ29uVHlwZVtpXSkgJiZcbiAgICAgICAgUkVfQ0hBUlNFVC50ZXN0KHBhcnNlZENvblR5cGVbaV1bMF0pKSB7XG4gICAgICBjaGFyc2V0ID0gcGFyc2VkQ29uVHlwZVtpXVsxXS50b0xvd2VyQ2FzZSgpXG4gICAgICBicmVha1xuICAgIH1cbiAgfVxuXG4gIGlmIChjaGFyc2V0ID09PSB1bmRlZmluZWQpIHsgY2hhcnNldCA9IGNmZy5kZWZDaGFyc2V0IHx8ICd1dGY4JyB9XG5cbiAgdGhpcy5kZWNvZGVyID0gbmV3IERlY29kZXIoKVxuICB0aGlzLmNoYXJzZXQgPSBjaGFyc2V0XG4gIHRoaXMuX2ZpZWxkcyA9IDBcbiAgdGhpcy5fc3RhdGUgPSAna2V5J1xuICB0aGlzLl9jaGVja2luZ0J5dGVzID0gdHJ1ZVxuICB0aGlzLl9ieXRlc0tleSA9IDBcbiAgdGhpcy5fYnl0ZXNWYWwgPSAwXG4gIHRoaXMuX2tleSA9ICcnXG4gIHRoaXMuX3ZhbCA9ICcnXG4gIHRoaXMuX2tleVRydW5jID0gZmFsc2VcbiAgdGhpcy5fdmFsVHJ1bmMgPSBmYWxzZVxuICB0aGlzLl9oaXRMaW1pdCA9IGZhbHNlXG59XG5cblVybEVuY29kZWQucHJvdG90eXBlLndyaXRlID0gZnVuY3Rpb24gKGRhdGEsIGNiKSB7XG4gIGlmICh0aGlzLl9maWVsZHMgPT09IHRoaXMuZmllbGRzTGltaXQpIHtcbiAgICBpZiAoIXRoaXMuYm95LmhpdEZpZWxkc0xpbWl0KSB7XG4gICAgICB0aGlzLmJveS5oaXRGaWVsZHNMaW1pdCA9IHRydWVcbiAgICAgIHRoaXMuYm95LmVtaXQoJ2ZpZWxkc0xpbWl0JylcbiAgICB9XG4gICAgcmV0dXJuIGNiKClcbiAgfVxuXG4gIGxldCBpZHhlcTsgbGV0IGlkeGFtcDsgbGV0IGk7IGxldCBwID0gMDsgY29uc3QgbGVuID0gZGF0YS5sZW5ndGhcblxuICB3aGlsZSAocCA8IGxlbikge1xuICAgIGlmICh0aGlzLl9zdGF0ZSA9PT0gJ2tleScpIHtcbiAgICAgIGlkeGVxID0gaWR4YW1wID0gdW5kZWZpbmVkXG4gICAgICBmb3IgKGkgPSBwOyBpIDwgbGVuOyArK2kpIHtcbiAgICAgICAgaWYgKCF0aGlzLl9jaGVja2luZ0J5dGVzKSB7ICsrcCB9XG4gICAgICAgIGlmIChkYXRhW2ldID09PSAweDNELyogPSAqLykge1xuICAgICAgICAgIGlkeGVxID0gaVxuICAgICAgICAgIGJyZWFrXG4gICAgICAgIH0gZWxzZSBpZiAoZGF0YVtpXSA9PT0gMHgyNi8qICYgKi8pIHtcbiAgICAgICAgICBpZHhhbXAgPSBpXG4gICAgICAgICAgYnJlYWtcbiAgICAgICAgfVxuICAgICAgICBpZiAodGhpcy5fY2hlY2tpbmdCeXRlcyAmJiB0aGlzLl9ieXRlc0tleSA9PT0gdGhpcy5maWVsZE5hbWVTaXplTGltaXQpIHtcbiAgICAgICAgICB0aGlzLl9oaXRMaW1pdCA9IHRydWVcbiAgICAgICAgICBicmVha1xuICAgICAgICB9IGVsc2UgaWYgKHRoaXMuX2NoZWNraW5nQnl0ZXMpIHsgKyt0aGlzLl9ieXRlc0tleSB9XG4gICAgICB9XG5cbiAgICAgIGlmIChpZHhlcSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgIC8vIGtleSB3aXRoIGFzc2lnbm1lbnRcbiAgICAgICAgaWYgKGlkeGVxID4gcCkgeyB0aGlzLl9rZXkgKz0gdGhpcy5kZWNvZGVyLndyaXRlKGRhdGEudG9TdHJpbmcoJ2JpbmFyeScsIHAsIGlkeGVxKSkgfVxuICAgICAgICB0aGlzLl9zdGF0ZSA9ICd2YWwnXG5cbiAgICAgICAgdGhpcy5faGl0TGltaXQgPSBmYWxzZVxuICAgICAgICB0aGlzLl9jaGVja2luZ0J5dGVzID0gdHJ1ZVxuICAgICAgICB0aGlzLl92YWwgPSAnJ1xuICAgICAgICB0aGlzLl9ieXRlc1ZhbCA9IDBcbiAgICAgICAgdGhpcy5fdmFsVHJ1bmMgPSBmYWxzZVxuICAgICAgICB0aGlzLmRlY29kZXIucmVzZXQoKVxuXG4gICAgICAgIHAgPSBpZHhlcSArIDFcbiAgICAgIH0gZWxzZSBpZiAoaWR4YW1wICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgLy8ga2V5IHdpdGggbm8gYXNzaWdubWVudFxuICAgICAgICArK3RoaXMuX2ZpZWxkc1xuICAgICAgICBsZXQga2V5OyBjb25zdCBrZXlUcnVuYyA9IHRoaXMuX2tleVRydW5jXG4gICAgICAgIGlmIChpZHhhbXAgPiBwKSB7IGtleSA9ICh0aGlzLl9rZXkgKz0gdGhpcy5kZWNvZGVyLndyaXRlKGRhdGEudG9TdHJpbmcoJ2JpbmFyeScsIHAsIGlkeGFtcCkpKSB9IGVsc2UgeyBrZXkgPSB0aGlzLl9rZXkgfVxuXG4gICAgICAgIHRoaXMuX2hpdExpbWl0ID0gZmFsc2VcbiAgICAgICAgdGhpcy5fY2hlY2tpbmdCeXRlcyA9IHRydWVcbiAgICAgICAgdGhpcy5fa2V5ID0gJydcbiAgICAgICAgdGhpcy5fYnl0ZXNLZXkgPSAwXG4gICAgICAgIHRoaXMuX2tleVRydW5jID0gZmFsc2VcbiAgICAgICAgdGhpcy5kZWNvZGVyLnJlc2V0KClcblxuICAgICAgICBpZiAoa2V5Lmxlbmd0aCkge1xuICAgICAgICAgIHRoaXMuYm95LmVtaXQoJ2ZpZWxkJywgZGVjb2RlVGV4dChrZXksICdiaW5hcnknLCB0aGlzLmNoYXJzZXQpLFxuICAgICAgICAgICAgJycsXG4gICAgICAgICAgICBrZXlUcnVuYyxcbiAgICAgICAgICAgIGZhbHNlKVxuICAgICAgICB9XG5cbiAgICAgICAgcCA9IGlkeGFtcCArIDFcbiAgICAgICAgaWYgKHRoaXMuX2ZpZWxkcyA9PT0gdGhpcy5maWVsZHNMaW1pdCkgeyByZXR1cm4gY2IoKSB9XG4gICAgICB9IGVsc2UgaWYgKHRoaXMuX2hpdExpbWl0KSB7XG4gICAgICAgIC8vIHdlIG1heSBub3QgaGF2ZSBoaXQgdGhlIGFjdHVhbCBsaW1pdCBpZiB0aGVyZSBhcmUgZW5jb2RlZCBieXRlcy4uLlxuICAgICAgICBpZiAoaSA+IHApIHsgdGhpcy5fa2V5ICs9IHRoaXMuZGVjb2Rlci53cml0ZShkYXRhLnRvU3RyaW5nKCdiaW5hcnknLCBwLCBpKSkgfVxuICAgICAgICBwID0gaVxuICAgICAgICBpZiAoKHRoaXMuX2J5dGVzS2V5ID0gdGhpcy5fa2V5Lmxlbmd0aCkgPT09IHRoaXMuZmllbGROYW1lU2l6ZUxpbWl0KSB7XG4gICAgICAgICAgLy8geWVwLCB3ZSBhY3R1YWxseSBkaWQgaGl0IHRoZSBsaW1pdFxuICAgICAgICAgIHRoaXMuX2NoZWNraW5nQnl0ZXMgPSBmYWxzZVxuICAgICAgICAgIHRoaXMuX2tleVRydW5jID0gdHJ1ZVxuICAgICAgICB9XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBpZiAocCA8IGxlbikgeyB0aGlzLl9rZXkgKz0gdGhpcy5kZWNvZGVyLndyaXRlKGRhdGEudG9TdHJpbmcoJ2JpbmFyeScsIHApKSB9XG4gICAgICAgIHAgPSBsZW5cbiAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAgaWR4YW1wID0gdW5kZWZpbmVkXG4gICAgICBmb3IgKGkgPSBwOyBpIDwgbGVuOyArK2kpIHtcbiAgICAgICAgaWYgKCF0aGlzLl9jaGVja2luZ0J5dGVzKSB7ICsrcCB9XG4gICAgICAgIGlmIChkYXRhW2ldID09PSAweDI2LyogJiAqLykge1xuICAgICAgICAgIGlkeGFtcCA9IGlcbiAgICAgICAgICBicmVha1xuICAgICAgICB9XG4gICAgICAgIGlmICh0aGlzLl9jaGVja2luZ0J5dGVzICYmIHRoaXMuX2J5dGVzVmFsID09PSB0aGlzLmZpZWxkU2l6ZUxpbWl0KSB7XG4gICAgICAgICAgdGhpcy5faGl0TGltaXQgPSB0cnVlXG4gICAgICAgICAgYnJlYWtcbiAgICAgICAgfSBlbHNlIGlmICh0aGlzLl9jaGVja2luZ0J5dGVzKSB7ICsrdGhpcy5fYnl0ZXNWYWwgfVxuICAgICAgfVxuXG4gICAgICBpZiAoaWR4YW1wICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgKyt0aGlzLl9maWVsZHNcbiAgICAgICAgaWYgKGlkeGFtcCA+IHApIHsgdGhpcy5fdmFsICs9IHRoaXMuZGVjb2Rlci53cml0ZShkYXRhLnRvU3RyaW5nKCdiaW5hcnknLCBwLCBpZHhhbXApKSB9XG4gICAgICAgIHRoaXMuYm95LmVtaXQoJ2ZpZWxkJywgZGVjb2RlVGV4dCh0aGlzLl9rZXksICdiaW5hcnknLCB0aGlzLmNoYXJzZXQpLFxuICAgICAgICAgIGRlY29kZVRleHQodGhpcy5fdmFsLCAnYmluYXJ5JywgdGhpcy5jaGFyc2V0KSxcbiAgICAgICAgICB0aGlzLl9rZXlUcnVuYyxcbiAgICAgICAgICB0aGlzLl92YWxUcnVuYylcbiAgICAgICAgdGhpcy5fc3RhdGUgPSAna2V5J1xuXG4gICAgICAgIHRoaXMuX2hpdExpbWl0ID0gZmFsc2VcbiAgICAgICAgdGhpcy5fY2hlY2tpbmdCeXRlcyA9IHRydWVcbiAgICAgICAgdGhpcy5fa2V5ID0gJydcbiAgICAgICAgdGhpcy5fYnl0ZXNLZXkgPSAwXG4gICAgICAgIHRoaXMuX2tleVRydW5jID0gZmFsc2VcbiAgICAgICAgdGhpcy5kZWNvZGVyLnJlc2V0KClcblxuICAgICAgICBwID0gaWR4YW1wICsgMVxuICAgICAgICBpZiAodGhpcy5fZmllbGRzID09PSB0aGlzLmZpZWxkc0xpbWl0KSB7IHJldHVybiBjYigpIH1cbiAgICAgIH0gZWxzZSBpZiAodGhpcy5faGl0TGltaXQpIHtcbiAgICAgICAgLy8gd2UgbWF5IG5vdCBoYXZlIGhpdCB0aGUgYWN0dWFsIGxpbWl0IGlmIHRoZXJlIGFyZSBlbmNvZGVkIGJ5dGVzLi4uXG4gICAgICAgIGlmIChpID4gcCkgeyB0aGlzLl92YWwgKz0gdGhpcy5kZWNvZGVyLndyaXRlKGRhdGEudG9TdHJpbmcoJ2JpbmFyeScsIHAsIGkpKSB9XG4gICAgICAgIHAgPSBpXG4gICAgICAgIGlmICgodGhpcy5fdmFsID09PSAnJyAmJiB0aGlzLmZpZWxkU2l6ZUxpbWl0ID09PSAwKSB8fFxuICAgICAgICAgICAgKHRoaXMuX2J5dGVzVmFsID0gdGhpcy5fdmFsLmxlbmd0aCkgPT09IHRoaXMuZmllbGRTaXplTGltaXQpIHtcbiAgICAgICAgICAvLyB5ZXAsIHdlIGFjdHVhbGx5IGRpZCBoaXQgdGhlIGxpbWl0XG4gICAgICAgICAgdGhpcy5fY2hlY2tpbmdCeXRlcyA9IGZhbHNlXG4gICAgICAgICAgdGhpcy5fdmFsVHJ1bmMgPSB0cnVlXG4gICAgICAgIH1cbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGlmIChwIDwgbGVuKSB7IHRoaXMuX3ZhbCArPSB0aGlzLmRlY29kZXIud3JpdGUoZGF0YS50b1N0cmluZygnYmluYXJ5JywgcCkpIH1cbiAgICAgICAgcCA9IGxlblxuICAgICAgfVxuICAgIH1cbiAgfVxuICBjYigpXG59XG5cblVybEVuY29kZWQucHJvdG90eXBlLmVuZCA9IGZ1bmN0aW9uICgpIHtcbiAgaWYgKHRoaXMuYm95Ll9kb25lKSB7IHJldHVybiB9XG5cbiAgaWYgKHRoaXMuX3N0YXRlID09PSAna2V5JyAmJiB0aGlzLl9rZXkubGVuZ3RoID4gMCkge1xuICAgIHRoaXMuYm95LmVtaXQoJ2ZpZWxkJywgZGVjb2RlVGV4dCh0aGlzLl9rZXksICdiaW5hcnknLCB0aGlzLmNoYXJzZXQpLFxuICAgICAgJycsXG4gICAgICB0aGlzLl9rZXlUcnVuYyxcbiAgICAgIGZhbHNlKVxuICB9IGVsc2UgaWYgKHRoaXMuX3N0YXRlID09PSAndmFsJykge1xuICAgIHRoaXMuYm95LmVtaXQoJ2ZpZWxkJywgZGVjb2RlVGV4dCh0aGlzLl9rZXksICdiaW5hcnknLCB0aGlzLmNoYXJzZXQpLFxuICAgICAgZGVjb2RlVGV4dCh0aGlzLl92YWwsICdiaW5hcnknLCB0aGlzLmNoYXJzZXQpLFxuICAgICAgdGhpcy5fa2V5VHJ1bmMsXG4gICAgICB0aGlzLl92YWxUcnVuYylcbiAgfVxuICB0aGlzLmJveS5fZG9uZSA9IHRydWVcbiAgdGhpcy5ib3kuZW1pdCgnZmluaXNoJylcbn1cblxubW9kdWxlLmV4cG9ydHMgPSBVcmxFbmNvZGVkXG4iLAogICAgIid1c2Ugc3RyaWN0J1xuXG5jb25zdCBXcml0YWJsZVN0cmVhbSA9IHJlcXVpcmUoJ25vZGU6c3RyZWFtJykuV3JpdGFibGVcbmNvbnN0IHsgaW5oZXJpdHMgfSA9IHJlcXVpcmUoJ25vZGU6dXRpbCcpXG5jb25zdCBEaWNlciA9IHJlcXVpcmUoJy4uL2RlcHMvZGljZXIvbGliL0RpY2VyJylcblxuY29uc3QgTXVsdGlwYXJ0UGFyc2VyID0gcmVxdWlyZSgnLi90eXBlcy9tdWx0aXBhcnQnKVxuY29uc3QgVXJsZW5jb2RlZFBhcnNlciA9IHJlcXVpcmUoJy4vdHlwZXMvdXJsZW5jb2RlZCcpXG5jb25zdCBwYXJzZVBhcmFtcyA9IHJlcXVpcmUoJy4vdXRpbHMvcGFyc2VQYXJhbXMnKVxuXG5mdW5jdGlvbiBCdXNib3kgKG9wdHMpIHtcbiAgaWYgKCEodGhpcyBpbnN0YW5jZW9mIEJ1c2JveSkpIHsgcmV0dXJuIG5ldyBCdXNib3kob3B0cykgfVxuXG4gIGlmICh0eXBlb2Ygb3B0cyAhPT0gJ29iamVjdCcpIHtcbiAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCdCdXNib3kgZXhwZWN0ZWQgYW4gb3B0aW9ucy1PYmplY3QuJylcbiAgfVxuICBpZiAodHlwZW9mIG9wdHMuaGVhZGVycyAhPT0gJ29iamVjdCcpIHtcbiAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCdCdXNib3kgZXhwZWN0ZWQgYW4gb3B0aW9ucy1PYmplY3Qgd2l0aCBoZWFkZXJzLWF0dHJpYnV0ZS4nKVxuICB9XG4gIGlmICh0eXBlb2Ygb3B0cy5oZWFkZXJzWydjb250ZW50LXR5cGUnXSAhPT0gJ3N0cmluZycpIHtcbiAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCdNaXNzaW5nIENvbnRlbnQtVHlwZS1oZWFkZXIuJylcbiAgfVxuXG4gIGNvbnN0IHtcbiAgICBoZWFkZXJzLFxuICAgIC4uLnN0cmVhbU9wdGlvbnNcbiAgfSA9IG9wdHNcblxuICB0aGlzLm9wdHMgPSB7XG4gICAgYXV0b0Rlc3Ryb3k6IGZhbHNlLFxuICAgIC4uLnN0cmVhbU9wdGlvbnNcbiAgfVxuICBXcml0YWJsZVN0cmVhbS5jYWxsKHRoaXMsIHRoaXMub3B0cylcblxuICB0aGlzLl9kb25lID0gZmFsc2VcbiAgdGhpcy5fcGFyc2VyID0gdGhpcy5nZXRQYXJzZXJCeUhlYWRlcnMoaGVhZGVycylcbiAgdGhpcy5fZmluaXNoZWQgPSBmYWxzZVxufVxuaW5oZXJpdHMoQnVzYm95LCBXcml0YWJsZVN0cmVhbSlcblxuQnVzYm95LnByb3RvdHlwZS5lbWl0ID0gZnVuY3Rpb24gKGV2KSB7XG4gIGlmIChldiA9PT0gJ2ZpbmlzaCcpIHtcbiAgICBpZiAoIXRoaXMuX2RvbmUpIHtcbiAgICAgIHRoaXMuX3BhcnNlcj8uZW5kKClcbiAgICAgIHJldHVyblxuICAgIH0gZWxzZSBpZiAodGhpcy5fZmluaXNoZWQpIHtcbiAgICAgIHJldHVyblxuICAgIH1cbiAgICB0aGlzLl9maW5pc2hlZCA9IHRydWVcbiAgfVxuICBXcml0YWJsZVN0cmVhbS5wcm90b3R5cGUuZW1pdC5hcHBseSh0aGlzLCBhcmd1bWVudHMpXG59XG5cbkJ1c2JveS5wcm90b3R5cGUuZ2V0UGFyc2VyQnlIZWFkZXJzID0gZnVuY3Rpb24gKGhlYWRlcnMpIHtcbiAgY29uc3QgcGFyc2VkID0gcGFyc2VQYXJhbXMoaGVhZGVyc1snY29udGVudC10eXBlJ10pXG5cbiAgY29uc3QgY2ZnID0ge1xuICAgIGRlZkNoYXJzZXQ6IHRoaXMub3B0cy5kZWZDaGFyc2V0LFxuICAgIGZpbGVId206IHRoaXMub3B0cy5maWxlSHdtLFxuICAgIGhlYWRlcnMsXG4gICAgaGlnaFdhdGVyTWFyazogdGhpcy5vcHRzLmhpZ2hXYXRlck1hcmssXG4gICAgaXNQYXJ0QUZpbGU6IHRoaXMub3B0cy5pc1BhcnRBRmlsZSxcbiAgICBsaW1pdHM6IHRoaXMub3B0cy5saW1pdHMsXG4gICAgcGFyc2VkQ29uVHlwZTogcGFyc2VkLFxuICAgIHByZXNlcnZlUGF0aDogdGhpcy5vcHRzLnByZXNlcnZlUGF0aFxuICB9XG5cbiAgaWYgKE11bHRpcGFydFBhcnNlci5kZXRlY3QudGVzdChwYXJzZWRbMF0pKSB7XG4gICAgcmV0dXJuIG5ldyBNdWx0aXBhcnRQYXJzZXIodGhpcywgY2ZnKVxuICB9XG4gIGlmIChVcmxlbmNvZGVkUGFyc2VyLmRldGVjdC50ZXN0KHBhcnNlZFswXSkpIHtcbiAgICByZXR1cm4gbmV3IFVybGVuY29kZWRQYXJzZXIodGhpcywgY2ZnKVxuICB9XG4gIHRocm93IG5ldyBFcnJvcignVW5zdXBwb3J0ZWQgQ29udGVudC1UeXBlLicpXG59XG5cbkJ1c2JveS5wcm90b3R5cGUuX3dyaXRlID0gZnVuY3Rpb24gKGNodW5rLCBlbmNvZGluZywgY2IpIHtcbiAgdGhpcy5fcGFyc2VyLndyaXRlKGNodW5rLCBjYilcbn1cblxubW9kdWxlLmV4cG9ydHMgPSBCdXNib3lcbm1vZHVsZS5leHBvcnRzLmRlZmF1bHQgPSBCdXNib3lcbm1vZHVsZS5leHBvcnRzLkJ1c2JveSA9IEJ1c2JveVxuXG5tb2R1bGUuZXhwb3J0cy5EaWNlciA9IERpY2VyXG4iLAogICAgIid1c2Ugc3RyaWN0J1xuXG5jb25zdCB7IE1lc3NhZ2VDaGFubmVsLCByZWNlaXZlTWVzc2FnZU9uUG9ydCB9ID0gcmVxdWlyZSgnd29ya2VyX3RocmVhZHMnKVxuXG5jb25zdCBjb3JzU2FmZUxpc3RlZE1ldGhvZHMgPSBbJ0dFVCcsICdIRUFEJywgJ1BPU1QnXVxuY29uc3QgY29yc1NhZmVMaXN0ZWRNZXRob2RzU2V0ID0gbmV3IFNldChjb3JzU2FmZUxpc3RlZE1ldGhvZHMpXG5cbmNvbnN0IG51bGxCb2R5U3RhdHVzID0gWzEwMSwgMjA0LCAyMDUsIDMwNF1cblxuY29uc3QgcmVkaXJlY3RTdGF0dXMgPSBbMzAxLCAzMDIsIDMwMywgMzA3LCAzMDhdXG5jb25zdCByZWRpcmVjdFN0YXR1c1NldCA9IG5ldyBTZXQocmVkaXJlY3RTdGF0dXMpXG5cbi8vIGh0dHBzOi8vZmV0Y2guc3BlYy53aGF0d2cub3JnLyNibG9jay1iYWQtcG9ydFxuY29uc3QgYmFkUG9ydHMgPSBbXG4gICcxJywgJzcnLCAnOScsICcxMScsICcxMycsICcxNScsICcxNycsICcxOScsICcyMCcsICcyMScsICcyMicsICcyMycsICcyNScsICczNycsICc0MicsICc0MycsICc1MycsICc2OScsICc3NycsICc3OScsXG4gICc4NycsICc5NScsICcxMDEnLCAnMTAyJywgJzEwMycsICcxMDQnLCAnMTA5JywgJzExMCcsICcxMTEnLCAnMTEzJywgJzExNScsICcxMTcnLCAnMTE5JywgJzEyMycsICcxMzUnLCAnMTM3JyxcbiAgJzEzOScsICcxNDMnLCAnMTYxJywgJzE3OScsICczODknLCAnNDI3JywgJzQ2NScsICc1MTInLCAnNTEzJywgJzUxNCcsICc1MTUnLCAnNTI2JywgJzUzMCcsICc1MzEnLCAnNTMyJyxcbiAgJzU0MCcsICc1NDgnLCAnNTU0JywgJzU1NicsICc1NjMnLCAnNTg3JywgJzYwMScsICc2MzYnLCAnOTg5JywgJzk5MCcsICc5OTMnLCAnOTk1JywgJzE3MTknLCAnMTcyMCcsICcxNzIzJyxcbiAgJzIwNDknLCAnMzY1OScsICc0MDQ1JywgJzUwNjAnLCAnNTA2MScsICc2MDAwJywgJzY1NjYnLCAnNjY2NScsICc2NjY2JywgJzY2NjcnLCAnNjY2OCcsICc2NjY5JywgJzY2OTcnLFxuICAnMTAwODAnXG5dXG5cbmNvbnN0IGJhZFBvcnRzU2V0ID0gbmV3IFNldChiYWRQb3J0cylcblxuLy8gaHR0cHM6Ly93M2MuZ2l0aHViLmlvL3dlYmFwcHNlYy1yZWZlcnJlci1wb2xpY3kvI3JlZmVycmVyLXBvbGljaWVzXG5jb25zdCByZWZlcnJlclBvbGljeSA9IFtcbiAgJycsXG4gICduby1yZWZlcnJlcicsXG4gICduby1yZWZlcnJlci13aGVuLWRvd25ncmFkZScsXG4gICdzYW1lLW9yaWdpbicsXG4gICdvcmlnaW4nLFxuICAnc3RyaWN0LW9yaWdpbicsXG4gICdvcmlnaW4td2hlbi1jcm9zcy1vcmlnaW4nLFxuICAnc3RyaWN0LW9yaWdpbi13aGVuLWNyb3NzLW9yaWdpbicsXG4gICd1bnNhZmUtdXJsJ1xuXVxuY29uc3QgcmVmZXJyZXJQb2xpY3lTZXQgPSBuZXcgU2V0KHJlZmVycmVyUG9saWN5KVxuXG5jb25zdCByZXF1ZXN0UmVkaXJlY3QgPSBbJ2ZvbGxvdycsICdtYW51YWwnLCAnZXJyb3InXVxuXG5jb25zdCBzYWZlTWV0aG9kcyA9IFsnR0VUJywgJ0hFQUQnLCAnT1BUSU9OUycsICdUUkFDRSddXG5jb25zdCBzYWZlTWV0aG9kc1NldCA9IG5ldyBTZXQoc2FmZU1ldGhvZHMpXG5cbmNvbnN0IHJlcXVlc3RNb2RlID0gWyduYXZpZ2F0ZScsICdzYW1lLW9yaWdpbicsICduby1jb3JzJywgJ2NvcnMnXVxuXG5jb25zdCByZXF1ZXN0Q3JlZGVudGlhbHMgPSBbJ29taXQnLCAnc2FtZS1vcmlnaW4nLCAnaW5jbHVkZSddXG5cbmNvbnN0IHJlcXVlc3RDYWNoZSA9IFtcbiAgJ2RlZmF1bHQnLFxuICAnbm8tc3RvcmUnLFxuICAncmVsb2FkJyxcbiAgJ25vLWNhY2hlJyxcbiAgJ2ZvcmNlLWNhY2hlJyxcbiAgJ29ubHktaWYtY2FjaGVkJ1xuXVxuXG4vLyBodHRwczovL2ZldGNoLnNwZWMud2hhdHdnLm9yZy8jcmVxdWVzdC1ib2R5LWhlYWRlci1uYW1lXG5jb25zdCByZXF1ZXN0Qm9keUhlYWRlciA9IFtcbiAgJ2NvbnRlbnQtZW5jb2RpbmcnLFxuICAnY29udGVudC1sYW5ndWFnZScsXG4gICdjb250ZW50LWxvY2F0aW9uJyxcbiAgJ2NvbnRlbnQtdHlwZScsXG4gIC8vIFNlZSBodHRwczovL2dpdGh1Yi5jb20vbm9kZWpzL3VuZGljaS9pc3N1ZXMvMjAyMVxuICAvLyAnQ29udGVudC1MZW5ndGgnIGlzIGEgZm9yYmlkZGVuIGhlYWRlciBuYW1lLCB3aGljaCBpcyB0eXBpY2FsbHlcbiAgLy8gcmVtb3ZlZCBpbiB0aGUgSGVhZGVycyBpbXBsZW1lbnRhdGlvbi4gSG93ZXZlciwgdW5kaWNpIGRvZXNuJ3RcbiAgLy8gZmlsdGVyIG91dCBoZWFkZXJzLCBzbyB3ZSBhZGQgaXQgaGVyZS5cbiAgJ2NvbnRlbnQtbGVuZ3RoJ1xuXVxuXG4vLyBodHRwczovL2ZldGNoLnNwZWMud2hhdHdnLm9yZy8jZW51bWRlZi1yZXF1ZXN0ZHVwbGV4XG5jb25zdCByZXF1ZXN0RHVwbGV4ID0gW1xuICAnaGFsZidcbl1cblxuLy8gaHR0cDovL2ZldGNoLnNwZWMud2hhdHdnLm9yZy8jZm9yYmlkZGVuLW1ldGhvZFxuY29uc3QgZm9yYmlkZGVuTWV0aG9kcyA9IFsnQ09OTkVDVCcsICdUUkFDRScsICdUUkFDSyddXG5jb25zdCBmb3JiaWRkZW5NZXRob2RzU2V0ID0gbmV3IFNldChmb3JiaWRkZW5NZXRob2RzKVxuXG5jb25zdCBzdWJyZXNvdXJjZSA9IFtcbiAgJ2F1ZGlvJyxcbiAgJ2F1ZGlvd29ya2xldCcsXG4gICdmb250JyxcbiAgJ2ltYWdlJyxcbiAgJ21hbmlmZXN0JyxcbiAgJ3BhaW50d29ya2xldCcsXG4gICdzY3JpcHQnLFxuICAnc3R5bGUnLFxuICAndHJhY2snLFxuICAndmlkZW8nLFxuICAneHNsdCcsXG4gICcnXG5dXG5jb25zdCBzdWJyZXNvdXJjZVNldCA9IG5ldyBTZXQoc3VicmVzb3VyY2UpXG5cbi8qKiBAdHlwZSB7Z2xvYmFsVGhpc1snRE9NRXhjZXB0aW9uJ119ICovXG5jb25zdCBET01FeGNlcHRpb24gPSBnbG9iYWxUaGlzLkRPTUV4Y2VwdGlvbiA/PyAoKCkgPT4ge1xuICAvLyBET01FeGNlcHRpb24gd2FzIG9ubHkgbWFkZSBhIGdsb2JhbCBpbiBOb2RlIHYxNy4wLjAsXG4gIC8vIGJ1dCBmZXRjaCBzdXBwb3J0cyA+PSB2MTYuOC5cbiAgdHJ5IHtcbiAgICBhdG9iKCd+JylcbiAgfSBjYXRjaCAoZXJyKSB7XG4gICAgcmV0dXJuIE9iamVjdC5nZXRQcm90b3R5cGVPZihlcnIpLmNvbnN0cnVjdG9yXG4gIH1cbn0pKClcblxubGV0IGNoYW5uZWxcblxuLyoqIEB0eXBlIHtnbG9iYWxUaGlzWydzdHJ1Y3R1cmVkQ2xvbmUnXX0gKi9cbmNvbnN0IHN0cnVjdHVyZWRDbG9uZSA9XG4gIGdsb2JhbFRoaXMuc3RydWN0dXJlZENsb25lID8/XG4gIC8vIGh0dHBzOi8vZ2l0aHViLmNvbS9ub2RlanMvbm9kZS9ibG9iL2IyN2FlMjRkY2M0MjUxYmFkNzI2ZDlkODRiYWY2NzhkMWY3MDdmZWQvbGliL2ludGVybmFsL3N0cnVjdHVyZWRfY2xvbmUuanNcbiAgLy8gc3RydWN0dXJlZENsb25lIHdhcyBhZGRlZCBpbiB2MTcuMC4wLCBidXQgZmV0Y2ggc3VwcG9ydHMgdjE2LjhcbiAgZnVuY3Rpb24gc3RydWN0dXJlZENsb25lICh2YWx1ZSwgb3B0aW9ucyA9IHVuZGVmaW5lZCkge1xuICAgIGlmIChhcmd1bWVudHMubGVuZ3RoID09PSAwKSB7XG4gICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCdtaXNzaW5nIGFyZ3VtZW50JylcbiAgICB9XG5cbiAgICBpZiAoIWNoYW5uZWwpIHtcbiAgICAgIGNoYW5uZWwgPSBuZXcgTWVzc2FnZUNoYW5uZWwoKVxuICAgIH1cbiAgICBjaGFubmVsLnBvcnQxLnVucmVmKClcbiAgICBjaGFubmVsLnBvcnQyLnVucmVmKClcbiAgICBjaGFubmVsLnBvcnQxLnBvc3RNZXNzYWdlKHZhbHVlLCBvcHRpb25zPy50cmFuc2ZlcilcbiAgICByZXR1cm4gcmVjZWl2ZU1lc3NhZ2VPblBvcnQoY2hhbm5lbC5wb3J0MikubWVzc2FnZVxuICB9XG5cbm1vZHVsZS5leHBvcnRzID0ge1xuICBET01FeGNlcHRpb24sXG4gIHN0cnVjdHVyZWRDbG9uZSxcbiAgc3VicmVzb3VyY2UsXG4gIGZvcmJpZGRlbk1ldGhvZHMsXG4gIHJlcXVlc3RCb2R5SGVhZGVyLFxuICByZWZlcnJlclBvbGljeSxcbiAgcmVxdWVzdFJlZGlyZWN0LFxuICByZXF1ZXN0TW9kZSxcbiAgcmVxdWVzdENyZWRlbnRpYWxzLFxuICByZXF1ZXN0Q2FjaGUsXG4gIHJlZGlyZWN0U3RhdHVzLFxuICBjb3JzU2FmZUxpc3RlZE1ldGhvZHMsXG4gIG51bGxCb2R5U3RhdHVzLFxuICBzYWZlTWV0aG9kcyxcbiAgYmFkUG9ydHMsXG4gIHJlcXVlc3REdXBsZXgsXG4gIHN1YnJlc291cmNlU2V0LFxuICBiYWRQb3J0c1NldCxcbiAgcmVkaXJlY3RTdGF0dXNTZXQsXG4gIGNvcnNTYWZlTGlzdGVkTWV0aG9kc1NldCxcbiAgc2FmZU1ldGhvZHNTZXQsXG4gIGZvcmJpZGRlbk1ldGhvZHNTZXQsXG4gIHJlZmVycmVyUG9saWN5U2V0XG59XG4iLAogICAgIid1c2Ugc3RyaWN0J1xuXG4vLyBJbiBjYXNlIG9mIGJyZWFraW5nIGNoYW5nZXMsIGluY3JlYXNlIHRoZSB2ZXJzaW9uXG4vLyBudW1iZXIgdG8gYXZvaWQgY29uZmxpY3RzLlxuY29uc3QgZ2xvYmFsT3JpZ2luID0gU3ltYm9sLmZvcigndW5kaWNpLmdsb2JhbE9yaWdpbi4xJylcblxuZnVuY3Rpb24gZ2V0R2xvYmFsT3JpZ2luICgpIHtcbiAgcmV0dXJuIGdsb2JhbFRoaXNbZ2xvYmFsT3JpZ2luXVxufVxuXG5mdW5jdGlvbiBzZXRHbG9iYWxPcmlnaW4gKG5ld09yaWdpbikge1xuICBpZiAobmV3T3JpZ2luID09PSB1bmRlZmluZWQpIHtcbiAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkoZ2xvYmFsVGhpcywgZ2xvYmFsT3JpZ2luLCB7XG4gICAgICB2YWx1ZTogdW5kZWZpbmVkLFxuICAgICAgd3JpdGFibGU6IHRydWUsXG4gICAgICBlbnVtZXJhYmxlOiBmYWxzZSxcbiAgICAgIGNvbmZpZ3VyYWJsZTogZmFsc2VcbiAgICB9KVxuXG4gICAgcmV0dXJuXG4gIH1cblxuICBjb25zdCBwYXJzZWRVUkwgPSBuZXcgVVJMKG5ld09yaWdpbilcblxuICBpZiAocGFyc2VkVVJMLnByb3RvY29sICE9PSAnaHR0cDonICYmIHBhcnNlZFVSTC5wcm90b2NvbCAhPT0gJ2h0dHBzOicpIHtcbiAgICB0aHJvdyBuZXcgVHlwZUVycm9yKGBPbmx5IGh0dHAgJiBodHRwcyB1cmxzIGFyZSBhbGxvd2VkLCByZWNlaXZlZCAke3BhcnNlZFVSTC5wcm90b2NvbH1gKVxuICB9XG5cbiAgT2JqZWN0LmRlZmluZVByb3BlcnR5KGdsb2JhbFRoaXMsIGdsb2JhbE9yaWdpbiwge1xuICAgIHZhbHVlOiBwYXJzZWRVUkwsXG4gICAgd3JpdGFibGU6IHRydWUsXG4gICAgZW51bWVyYWJsZTogZmFsc2UsXG4gICAgY29uZmlndXJhYmxlOiBmYWxzZVxuICB9KVxufVxuXG5tb2R1bGUuZXhwb3J0cyA9IHtcbiAgZ2V0R2xvYmFsT3JpZ2luLFxuICBzZXRHbG9iYWxPcmlnaW5cbn1cbiIsCiAgICAiJ3VzZSBzdHJpY3QnXG5cbmNvbnN0IHsgcmVkaXJlY3RTdGF0dXNTZXQsIHJlZmVycmVyUG9saWN5U2V0OiByZWZlcnJlclBvbGljeVRva2VucywgYmFkUG9ydHNTZXQgfSA9IHJlcXVpcmUoJy4vY29uc3RhbnRzJylcbmNvbnN0IHsgZ2V0R2xvYmFsT3JpZ2luIH0gPSByZXF1aXJlKCcuL2dsb2JhbCcpXG5jb25zdCB7IHBlcmZvcm1hbmNlIH0gPSByZXF1aXJlKCdwZXJmX2hvb2tzJylcbmNvbnN0IHsgaXNCbG9iTGlrZSwgdG9VU1ZTdHJpbmcsIFJlYWRhYmxlU3RyZWFtRnJvbSB9ID0gcmVxdWlyZSgnLi4vY29yZS91dGlsJylcbmNvbnN0IGFzc2VydCA9IHJlcXVpcmUoJ2Fzc2VydCcpXG5jb25zdCB7IGlzVWludDhBcnJheSB9ID0gcmVxdWlyZSgndXRpbC90eXBlcycpXG5cbmxldCBzdXBwb3J0ZWRIYXNoZXMgPSBbXVxuXG4vLyBodHRwczovL25vZGVqcy5vcmcvYXBpL2NyeXB0by5odG1sI2RldGVybWluaW5nLWlmLWNyeXB0by1zdXBwb3J0LWlzLXVuYXZhaWxhYmxlXG4vKiogQHR5cGUge2ltcG9ydCgnY3J5cHRvJyl8dW5kZWZpbmVkfSAqL1xubGV0IGNyeXB0b1xuXG50cnkge1xuICBjcnlwdG8gPSByZXF1aXJlKCdjcnlwdG8nKVxuICBjb25zdCBwb3NzaWJsZVJlbGV2YW50SGFzaGVzID0gWydzaGEyNTYnLCAnc2hhMzg0JywgJ3NoYTUxMiddXG4gIHN1cHBvcnRlZEhhc2hlcyA9IGNyeXB0by5nZXRIYXNoZXMoKS5maWx0ZXIoKGhhc2gpID0+IHBvc3NpYmxlUmVsZXZhbnRIYXNoZXMuaW5jbHVkZXMoaGFzaCkpXG4vKiBjOCBpZ25vcmUgbmV4dCAzICovXG59IGNhdGNoIHtcbn1cblxuZnVuY3Rpb24gcmVzcG9uc2VVUkwgKHJlc3BvbnNlKSB7XG4gIC8vIGh0dHBzOi8vZmV0Y2guc3BlYy53aGF0d2cub3JnLyNyZXNwb25zZXNcbiAgLy8gQSByZXNwb25zZSBoYXMgYW4gYXNzb2NpYXRlZCBVUkwuIEl0IGlzIGEgcG9pbnRlciB0byB0aGUgbGFzdCBVUkxcbiAgLy8gaW4gcmVzcG9uc2XigJlzIFVSTCBsaXN0IGFuZCBudWxsIGlmIHJlc3BvbnNl4oCZcyBVUkwgbGlzdCBpcyBlbXB0eS5cbiAgY29uc3QgdXJsTGlzdCA9IHJlc3BvbnNlLnVybExpc3RcbiAgY29uc3QgbGVuZ3RoID0gdXJsTGlzdC5sZW5ndGhcbiAgcmV0dXJuIGxlbmd0aCA9PT0gMCA/IG51bGwgOiB1cmxMaXN0W2xlbmd0aCAtIDFdLnRvU3RyaW5nKClcbn1cblxuLy8gaHR0cHM6Ly9mZXRjaC5zcGVjLndoYXR3Zy5vcmcvI2NvbmNlcHQtcmVzcG9uc2UtbG9jYXRpb24tdXJsXG5mdW5jdGlvbiByZXNwb25zZUxvY2F0aW9uVVJMIChyZXNwb25zZSwgcmVxdWVzdEZyYWdtZW50KSB7XG4gIC8vIDEuIElmIHJlc3BvbnNl4oCZcyBzdGF0dXMgaXMgbm90IGEgcmVkaXJlY3Qgc3RhdHVzLCB0aGVuIHJldHVybiBudWxsLlxuICBpZiAoIXJlZGlyZWN0U3RhdHVzU2V0LmhhcyhyZXNwb25zZS5zdGF0dXMpKSB7XG4gICAgcmV0dXJuIG51bGxcbiAgfVxuXG4gIC8vIDIuIExldCBsb2NhdGlvbiBiZSB0aGUgcmVzdWx0IG9mIGV4dHJhY3RpbmcgaGVhZGVyIGxpc3QgdmFsdWVzIGdpdmVuXG4gIC8vIGBMb2NhdGlvbmAgYW5kIHJlc3BvbnNl4oCZcyBoZWFkZXIgbGlzdC5cbiAgbGV0IGxvY2F0aW9uID0gcmVzcG9uc2UuaGVhZGVyc0xpc3QuZ2V0KCdsb2NhdGlvbicpXG5cbiAgLy8gMy4gSWYgbG9jYXRpb24gaXMgYSBoZWFkZXIgdmFsdWUsIHRoZW4gc2V0IGxvY2F0aW9uIHRvIHRoZSByZXN1bHQgb2ZcbiAgLy8gICAgcGFyc2luZyBsb2NhdGlvbiB3aXRoIHJlc3BvbnNl4oCZcyBVUkwuXG4gIGlmIChsb2NhdGlvbiAhPT0gbnVsbCAmJiBpc1ZhbGlkSGVhZGVyVmFsdWUobG9jYXRpb24pKSB7XG4gICAgbG9jYXRpb24gPSBuZXcgVVJMKGxvY2F0aW9uLCByZXNwb25zZVVSTChyZXNwb25zZSkpXG4gIH1cblxuICAvLyA0LiBJZiBsb2NhdGlvbiBpcyBhIFVSTCB3aG9zZSBmcmFnbWVudCBpcyBudWxsLCB0aGVuIHNldCBsb2NhdGlvbuKAmXNcbiAgLy8gZnJhZ21lbnQgdG8gcmVxdWVzdEZyYWdtZW50LlxuICBpZiAobG9jYXRpb24gJiYgIWxvY2F0aW9uLmhhc2gpIHtcbiAgICBsb2NhdGlvbi5oYXNoID0gcmVxdWVzdEZyYWdtZW50XG4gIH1cblxuICAvLyA1LiBSZXR1cm4gbG9jYXRpb24uXG4gIHJldHVybiBsb2NhdGlvblxufVxuXG4vKiogQHJldHVybnMge1VSTH0gKi9cbmZ1bmN0aW9uIHJlcXVlc3RDdXJyZW50VVJMIChyZXF1ZXN0KSB7XG4gIHJldHVybiByZXF1ZXN0LnVybExpc3RbcmVxdWVzdC51cmxMaXN0Lmxlbmd0aCAtIDFdXG59XG5cbmZ1bmN0aW9uIHJlcXVlc3RCYWRQb3J0IChyZXF1ZXN0KSB7XG4gIC8vIDEuIExldCB1cmwgYmUgcmVxdWVzdOKAmXMgY3VycmVudCBVUkwuXG4gIGNvbnN0IHVybCA9IHJlcXVlc3RDdXJyZW50VVJMKHJlcXVlc3QpXG5cbiAgLy8gMi4gSWYgdXJs4oCZcyBzY2hlbWUgaXMgYW4gSFRUUChTKSBzY2hlbWUgYW5kIHVybOKAmXMgcG9ydCBpcyBhIGJhZCBwb3J0LFxuICAvLyB0aGVuIHJldHVybiBibG9ja2VkLlxuICBpZiAodXJsSXNIdHRwSHR0cHNTY2hlbWUodXJsKSAmJiBiYWRQb3J0c1NldC5oYXModXJsLnBvcnQpKSB7XG4gICAgcmV0dXJuICdibG9ja2VkJ1xuICB9XG5cbiAgLy8gMy4gUmV0dXJuIGFsbG93ZWQuXG4gIHJldHVybiAnYWxsb3dlZCdcbn1cblxuZnVuY3Rpb24gaXNFcnJvckxpa2UgKG9iamVjdCkge1xuICByZXR1cm4gb2JqZWN0IGluc3RhbmNlb2YgRXJyb3IgfHwgKFxuICAgIG9iamVjdD8uY29uc3RydWN0b3I/Lm5hbWUgPT09ICdFcnJvcicgfHxcbiAgICBvYmplY3Q/LmNvbnN0cnVjdG9yPy5uYW1lID09PSAnRE9NRXhjZXB0aW9uJ1xuICApXG59XG5cbi8vIENoZWNrIHdoZXRoZXIgfHN0YXR1c1RleHR8IGlzIGEgQnl0ZVN0cmluZyBhbmRcbi8vIG1hdGNoZXMgdGhlIFJlYXNvbi1QaHJhc2UgdG9rZW4gcHJvZHVjdGlvbi5cbi8vIFJGQyAyNjE2OiBodHRwczovL3Rvb2xzLmlldGYub3JnL2h0bWwvcmZjMjYxNlxuLy8gUkZDIDcyMzA6IGh0dHBzOi8vdG9vbHMuaWV0Zi5vcmcvaHRtbC9yZmM3MjMwXG4vLyBcInJlYXNvbi1waHJhc2UgPSAqKCBIVEFCIC8gU1AgLyBWQ0hBUiAvIG9icy10ZXh0IClcIlxuLy8gaHR0cHM6Ly9naXRodWIuY29tL2Nocm9taXVtL2Nocm9taXVtL2Jsb2IvOTQuMC40NjA0LjEvdGhpcmRfcGFydHkvYmxpbmsvcmVuZGVyZXIvY29yZS9mZXRjaC9yZXNwb25zZS5jYyNMMTE2XG5mdW5jdGlvbiBpc1ZhbGlkUmVhc29uUGhyYXNlIChzdGF0dXNUZXh0KSB7XG4gIGZvciAobGV0IGkgPSAwOyBpIDwgc3RhdHVzVGV4dC5sZW5ndGg7ICsraSkge1xuICAgIGNvbnN0IGMgPSBzdGF0dXNUZXh0LmNoYXJDb2RlQXQoaSlcbiAgICBpZiAoXG4gICAgICAhKFxuICAgICAgICAoXG4gICAgICAgICAgYyA9PT0gMHgwOSB8fCAvLyBIVEFCXG4gICAgICAgICAgKGMgPj0gMHgyMCAmJiBjIDw9IDB4N2UpIHx8IC8vIFNQIC8gVkNIQVJcbiAgICAgICAgICAoYyA+PSAweDgwICYmIGMgPD0gMHhmZilcbiAgICAgICAgKSAvLyBvYnMtdGV4dFxuICAgICAgKVxuICAgICkge1xuICAgICAgcmV0dXJuIGZhbHNlXG4gICAgfVxuICB9XG4gIHJldHVybiB0cnVlXG59XG5cbi8qKlxuICogQHNlZSBodHRwczovL3Rvb2xzLmlldGYub3JnL2h0bWwvcmZjNzIzMCNzZWN0aW9uLTMuMi42XG4gKiBAcGFyYW0ge251bWJlcn0gY1xuICovXG5mdW5jdGlvbiBpc1Rva2VuQ2hhckNvZGUgKGMpIHtcbiAgc3dpdGNoIChjKSB7XG4gICAgY2FzZSAweDIyOlxuICAgIGNhc2UgMHgyODpcbiAgICBjYXNlIDB4Mjk6XG4gICAgY2FzZSAweDJjOlxuICAgIGNhc2UgMHgyZjpcbiAgICBjYXNlIDB4M2E6XG4gICAgY2FzZSAweDNiOlxuICAgIGNhc2UgMHgzYzpcbiAgICBjYXNlIDB4M2Q6XG4gICAgY2FzZSAweDNlOlxuICAgIGNhc2UgMHgzZjpcbiAgICBjYXNlIDB4NDA6XG4gICAgY2FzZSAweDViOlxuICAgIGNhc2UgMHg1YzpcbiAgICBjYXNlIDB4NWQ6XG4gICAgY2FzZSAweDdiOlxuICAgIGNhc2UgMHg3ZDpcbiAgICAgIC8vIERRVU9URSBhbmQgXCIoKSwvOjs8PT4/QFtcXF17fVwiXG4gICAgICByZXR1cm4gZmFsc2VcbiAgICBkZWZhdWx0OlxuICAgICAgLy8gVkNIQVIgJXgyMS03RVxuICAgICAgcmV0dXJuIGMgPj0gMHgyMSAmJiBjIDw9IDB4N2VcbiAgfVxufVxuXG4vKipcbiAqIEBwYXJhbSB7c3RyaW5nfSBjaGFyYWN0ZXJzXG4gKi9cbmZ1bmN0aW9uIGlzVmFsaWRIVFRQVG9rZW4gKGNoYXJhY3RlcnMpIHtcbiAgaWYgKGNoYXJhY3RlcnMubGVuZ3RoID09PSAwKSB7XG4gICAgcmV0dXJuIGZhbHNlXG4gIH1cbiAgZm9yIChsZXQgaSA9IDA7IGkgPCBjaGFyYWN0ZXJzLmxlbmd0aDsgKytpKSB7XG4gICAgaWYgKCFpc1Rva2VuQ2hhckNvZGUoY2hhcmFjdGVycy5jaGFyQ29kZUF0KGkpKSkge1xuICAgICAgcmV0dXJuIGZhbHNlXG4gICAgfVxuICB9XG4gIHJldHVybiB0cnVlXG59XG5cbi8qKlxuICogQHNlZSBodHRwczovL2ZldGNoLnNwZWMud2hhdHdnLm9yZy8jaGVhZGVyLW5hbWVcbiAqIEBwYXJhbSB7c3RyaW5nfSBwb3RlbnRpYWxWYWx1ZVxuICovXG5mdW5jdGlvbiBpc1ZhbGlkSGVhZGVyTmFtZSAocG90ZW50aWFsVmFsdWUpIHtcbiAgcmV0dXJuIGlzVmFsaWRIVFRQVG9rZW4ocG90ZW50aWFsVmFsdWUpXG59XG5cbi8qKlxuICogQHNlZSBodHRwczovL2ZldGNoLnNwZWMud2hhdHdnLm9yZy8jaGVhZGVyLXZhbHVlXG4gKiBAcGFyYW0ge3N0cmluZ30gcG90ZW50aWFsVmFsdWVcbiAqL1xuZnVuY3Rpb24gaXNWYWxpZEhlYWRlclZhbHVlIChwb3RlbnRpYWxWYWx1ZSkge1xuICAvLyAtIEhhcyBubyBsZWFkaW5nIG9yIHRyYWlsaW5nIEhUVFAgdGFiIG9yIHNwYWNlIGJ5dGVzLlxuICAvLyAtIENvbnRhaW5zIG5vIDB4MDAgKE5VTCkgb3IgSFRUUCBuZXdsaW5lIGJ5dGVzLlxuICBpZiAoXG4gICAgcG90ZW50aWFsVmFsdWUuc3RhcnRzV2l0aCgnXFx0JykgfHxcbiAgICBwb3RlbnRpYWxWYWx1ZS5zdGFydHNXaXRoKCcgJykgfHxcbiAgICBwb3RlbnRpYWxWYWx1ZS5lbmRzV2l0aCgnXFx0JykgfHxcbiAgICBwb3RlbnRpYWxWYWx1ZS5lbmRzV2l0aCgnICcpXG4gICkge1xuICAgIHJldHVybiBmYWxzZVxuICB9XG5cbiAgaWYgKFxuICAgIHBvdGVudGlhbFZhbHVlLmluY2x1ZGVzKCdcXDAnKSB8fFxuICAgIHBvdGVudGlhbFZhbHVlLmluY2x1ZGVzKCdcXHInKSB8fFxuICAgIHBvdGVudGlhbFZhbHVlLmluY2x1ZGVzKCdcXG4nKVxuICApIHtcbiAgICByZXR1cm4gZmFsc2VcbiAgfVxuXG4gIHJldHVybiB0cnVlXG59XG5cbi8vIGh0dHBzOi8vdzNjLmdpdGh1Yi5pby93ZWJhcHBzZWMtcmVmZXJyZXItcG9saWN5LyNzZXQtcmVxdWVzdHMtcmVmZXJyZXItcG9saWN5LW9uLXJlZGlyZWN0XG5mdW5jdGlvbiBzZXRSZXF1ZXN0UmVmZXJyZXJQb2xpY3lPblJlZGlyZWN0IChyZXF1ZXN0LCBhY3R1YWxSZXNwb25zZSkge1xuICAvLyAgR2l2ZW4gYSByZXF1ZXN0IHJlcXVlc3QgYW5kIGEgcmVzcG9uc2UgYWN0dWFsUmVzcG9uc2UsIHRoaXMgYWxnb3JpdGhtXG4gIC8vICB1cGRhdGVzIHJlcXVlc3TigJlzIHJlZmVycmVyIHBvbGljeSBhY2NvcmRpbmcgdG8gdGhlIFJlZmVycmVyLVBvbGljeVxuICAvLyAgaGVhZGVyIChpZiBhbnkpIGluIGFjdHVhbFJlc3BvbnNlLlxuXG4gIC8vIDEuIExldCBwb2xpY3kgYmUgdGhlIHJlc3VsdCBvZiBleGVjdXRpbmcgwqcgOC4xIFBhcnNlIGEgcmVmZXJyZXIgcG9saWN5XG4gIC8vIGZyb20gYSBSZWZlcnJlci1Qb2xpY3kgaGVhZGVyIG9uIGFjdHVhbFJlc3BvbnNlLlxuXG4gIC8vIDguMSBQYXJzZSBhIHJlZmVycmVyIHBvbGljeSBmcm9tIGEgUmVmZXJyZXItUG9saWN5IGhlYWRlclxuICAvLyAxLiBMZXQgcG9saWN5LXRva2VucyBiZSB0aGUgcmVzdWx0IG9mIGV4dHJhY3RpbmcgaGVhZGVyIGxpc3QgdmFsdWVzIGdpdmVuIGBSZWZlcnJlci1Qb2xpY3lgIGFuZCByZXNwb25zZeKAmXMgaGVhZGVyIGxpc3QuXG4gIGNvbnN0IHsgaGVhZGVyc0xpc3QgfSA9IGFjdHVhbFJlc3BvbnNlXG4gIC8vIDIuIExldCBwb2xpY3kgYmUgdGhlIGVtcHR5IHN0cmluZy5cbiAgLy8gMy4gRm9yIGVhY2ggdG9rZW4gaW4gcG9saWN5LXRva2VucywgaWYgdG9rZW4gaXMgYSByZWZlcnJlciBwb2xpY3kgYW5kIHRva2VuIGlzIG5vdCB0aGUgZW1wdHkgc3RyaW5nLCB0aGVuIHNldCBwb2xpY3kgdG8gdG9rZW4uXG4gIC8vIDQuIFJldHVybiBwb2xpY3kuXG4gIGNvbnN0IHBvbGljeUhlYWRlciA9IChoZWFkZXJzTGlzdC5nZXQoJ3JlZmVycmVyLXBvbGljeScpID8/ICcnKS5zcGxpdCgnLCcpXG5cbiAgLy8gTm90ZTogQXMgdGhlIHJlZmVycmVyLXBvbGljeSBjYW4gY29udGFpbiBtdWx0aXBsZSBwb2xpY2llc1xuICAvLyBzZXBhcmF0ZWQgYnkgY29tbWEsIHdlIG5lZWQgdG8gbG9vcCB0aHJvdWdoIGFsbCBvZiB0aGVtXG4gIC8vIGFuZCBwaWNrIHRoZSBmaXJzdCB2YWxpZCBvbmUuXG4gIC8vIFJlZjogaHR0cHM6Ly9kZXZlbG9wZXIubW96aWxsYS5vcmcvZW4tVVMvZG9jcy9XZWIvSFRUUC9IZWFkZXJzL1JlZmVycmVyLVBvbGljeSNzcGVjaWZ5X2FfZmFsbGJhY2tfcG9saWN5XG4gIGxldCBwb2xpY3kgPSAnJ1xuICBpZiAocG9saWN5SGVhZGVyLmxlbmd0aCA+IDApIHtcbiAgICAvLyBUaGUgcmlnaHQtbW9zdCBwb2xpY3kgdGFrZXMgcHJlY2VkZW5jZS5cbiAgICAvLyBUaGUgbGVmdC1tb3N0IHBvbGljeSBpcyB0aGUgZmFsbGJhY2suXG4gICAgZm9yIChsZXQgaSA9IHBvbGljeUhlYWRlci5sZW5ndGg7IGkgIT09IDA7IGktLSkge1xuICAgICAgY29uc3QgdG9rZW4gPSBwb2xpY3lIZWFkZXJbaSAtIDFdLnRyaW0oKVxuICAgICAgaWYgKHJlZmVycmVyUG9saWN5VG9rZW5zLmhhcyh0b2tlbikpIHtcbiAgICAgICAgcG9saWN5ID0gdG9rZW5cbiAgICAgICAgYnJlYWtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICAvLyAyLiBJZiBwb2xpY3kgaXMgbm90IHRoZSBlbXB0eSBzdHJpbmcsIHRoZW4gc2V0IHJlcXVlc3TigJlzIHJlZmVycmVyIHBvbGljeSB0byBwb2xpY3kuXG4gIGlmIChwb2xpY3kgIT09ICcnKSB7XG4gICAgcmVxdWVzdC5yZWZlcnJlclBvbGljeSA9IHBvbGljeVxuICB9XG59XG5cbi8vIGh0dHBzOi8vZmV0Y2guc3BlYy53aGF0d2cub3JnLyNjcm9zcy1vcmlnaW4tcmVzb3VyY2UtcG9saWN5LWNoZWNrXG5mdW5jdGlvbiBjcm9zc09yaWdpblJlc291cmNlUG9saWN5Q2hlY2sgKCkge1xuICAvLyBUT0RPXG4gIHJldHVybiAnYWxsb3dlZCdcbn1cblxuLy8gaHR0cHM6Ly9mZXRjaC5zcGVjLndoYXR3Zy5vcmcvI2NvbmNlcHQtY29ycy1jaGVja1xuZnVuY3Rpb24gY29yc0NoZWNrICgpIHtcbiAgLy8gVE9ET1xuICByZXR1cm4gJ3N1Y2Nlc3MnXG59XG5cbi8vIGh0dHBzOi8vZmV0Y2guc3BlYy53aGF0d2cub3JnLyNjb25jZXB0LXRhby1jaGVja1xuZnVuY3Rpb24gVEFPQ2hlY2sgKCkge1xuICAvLyBUT0RPXG4gIHJldHVybiAnc3VjY2Vzcydcbn1cblxuZnVuY3Rpb24gYXBwZW5kRmV0Y2hNZXRhZGF0YSAoaHR0cFJlcXVlc3QpIHtcbiAgLy8gIGh0dHBzOi8vdzNjLmdpdGh1Yi5pby93ZWJhcHBzZWMtZmV0Y2gtbWV0YWRhdGEvI3NlYy1mZXRjaC1kZXN0LWhlYWRlclxuICAvLyAgVE9ET1xuXG4gIC8vICBodHRwczovL3czYy5naXRodWIuaW8vd2ViYXBwc2VjLWZldGNoLW1ldGFkYXRhLyNzZWMtZmV0Y2gtbW9kZS1oZWFkZXJcblxuICAvLyAgMS4gQXNzZXJ0OiBy4oCZcyB1cmwgaXMgYSBwb3RlbnRpYWxseSB0cnVzdHdvcnRoeSBVUkwuXG4gIC8vICBUT0RPXG5cbiAgLy8gIDIuIExldCBoZWFkZXIgYmUgYSBTdHJ1Y3R1cmVkIEhlYWRlciB3aG9zZSB2YWx1ZSBpcyBhIHRva2VuLlxuICBsZXQgaGVhZGVyID0gbnVsbFxuXG4gIC8vICAzLiBTZXQgaGVhZGVy4oCZcyB2YWx1ZSB0byBy4oCZcyBtb2RlLlxuICBoZWFkZXIgPSBodHRwUmVxdWVzdC5tb2RlXG5cbiAgLy8gIDQuIFNldCBhIHN0cnVjdHVyZWQgZmllbGQgdmFsdWUgYFNlYy1GZXRjaC1Nb2RlYC9oZWFkZXIgaW4gcuKAmXMgaGVhZGVyIGxpc3QuXG4gIGh0dHBSZXF1ZXN0LmhlYWRlcnNMaXN0LnNldCgnc2VjLWZldGNoLW1vZGUnLCBoZWFkZXIpXG5cbiAgLy8gIGh0dHBzOi8vdzNjLmdpdGh1Yi5pby93ZWJhcHBzZWMtZmV0Y2gtbWV0YWRhdGEvI3NlYy1mZXRjaC1zaXRlLWhlYWRlclxuICAvLyAgVE9ET1xuXG4gIC8vICBodHRwczovL3czYy5naXRodWIuaW8vd2ViYXBwc2VjLWZldGNoLW1ldGFkYXRhLyNzZWMtZmV0Y2gtdXNlci1oZWFkZXJcbiAgLy8gIFRPRE9cbn1cblxuLy8gaHR0cHM6Ly9mZXRjaC5zcGVjLndoYXR3Zy5vcmcvI2FwcGVuZC1hLXJlcXVlc3Qtb3JpZ2luLWhlYWRlclxuZnVuY3Rpb24gYXBwZW5kUmVxdWVzdE9yaWdpbkhlYWRlciAocmVxdWVzdCkge1xuICAvLyAxLiBMZXQgc2VyaWFsaXplZE9yaWdpbiBiZSB0aGUgcmVzdWx0IG9mIGJ5dGUtc2VyaWFsaXppbmcgYSByZXF1ZXN0IG9yaWdpbiB3aXRoIHJlcXVlc3QuXG4gIGxldCBzZXJpYWxpemVkT3JpZ2luID0gcmVxdWVzdC5vcmlnaW5cblxuICAvLyAyLiBJZiByZXF1ZXN04oCZcyByZXNwb25zZSB0YWludGluZyBpcyBcImNvcnNcIiBvciByZXF1ZXN04oCZcyBtb2RlIGlzIFwid2Vic29ja2V0XCIsIHRoZW4gYXBwZW5kIChgT3JpZ2luYCwgc2VyaWFsaXplZE9yaWdpbikgdG8gcmVxdWVzdOKAmXMgaGVhZGVyIGxpc3QuXG4gIGlmIChyZXF1ZXN0LnJlc3BvbnNlVGFpbnRpbmcgPT09ICdjb3JzJyB8fCByZXF1ZXN0Lm1vZGUgPT09ICd3ZWJzb2NrZXQnKSB7XG4gICAgaWYgKHNlcmlhbGl6ZWRPcmlnaW4pIHtcbiAgICAgIHJlcXVlc3QuaGVhZGVyc0xpc3QuYXBwZW5kKCdvcmlnaW4nLCBzZXJpYWxpemVkT3JpZ2luKVxuICAgIH1cblxuICAvLyAzLiBPdGhlcndpc2UsIGlmIHJlcXVlc3TigJlzIG1ldGhvZCBpcyBuZWl0aGVyIGBHRVRgIG5vciBgSEVBRGAsIHRoZW46XG4gIH0gZWxzZSBpZiAocmVxdWVzdC5tZXRob2QgIT09ICdHRVQnICYmIHJlcXVlc3QubWV0aG9kICE9PSAnSEVBRCcpIHtcbiAgICAvLyAxLiBTd2l0Y2ggb24gcmVxdWVzdOKAmXMgcmVmZXJyZXIgcG9saWN5OlxuICAgIHN3aXRjaCAocmVxdWVzdC5yZWZlcnJlclBvbGljeSkge1xuICAgICAgY2FzZSAnbm8tcmVmZXJyZXInOlxuICAgICAgICAvLyBTZXQgc2VyaWFsaXplZE9yaWdpbiB0byBgbnVsbGAuXG4gICAgICAgIHNlcmlhbGl6ZWRPcmlnaW4gPSBudWxsXG4gICAgICAgIGJyZWFrXG4gICAgICBjYXNlICduby1yZWZlcnJlci13aGVuLWRvd25ncmFkZSc6XG4gICAgICBjYXNlICdzdHJpY3Qtb3JpZ2luJzpcbiAgICAgIGNhc2UgJ3N0cmljdC1vcmlnaW4td2hlbi1jcm9zcy1vcmlnaW4nOlxuICAgICAgICAvLyBJZiByZXF1ZXN04oCZcyBvcmlnaW4gaXMgYSB0dXBsZSBvcmlnaW4sIGl0cyBzY2hlbWUgaXMgXCJodHRwc1wiLCBhbmQgcmVxdWVzdOKAmXMgY3VycmVudCBVUkzigJlzIHNjaGVtZSBpcyBub3QgXCJodHRwc1wiLCB0aGVuIHNldCBzZXJpYWxpemVkT3JpZ2luIHRvIGBudWxsYC5cbiAgICAgICAgaWYgKHJlcXVlc3Qub3JpZ2luICYmIHVybEhhc0h0dHBzU2NoZW1lKHJlcXVlc3Qub3JpZ2luKSAmJiAhdXJsSGFzSHR0cHNTY2hlbWUocmVxdWVzdEN1cnJlbnRVUkwocmVxdWVzdCkpKSB7XG4gICAgICAgICAgc2VyaWFsaXplZE9yaWdpbiA9IG51bGxcbiAgICAgICAgfVxuICAgICAgICBicmVha1xuICAgICAgY2FzZSAnc2FtZS1vcmlnaW4nOlxuICAgICAgICAvLyBJZiByZXF1ZXN04oCZcyBvcmlnaW4gaXMgbm90IHNhbWUgb3JpZ2luIHdpdGggcmVxdWVzdOKAmXMgY3VycmVudCBVUkzigJlzIG9yaWdpbiwgdGhlbiBzZXQgc2VyaWFsaXplZE9yaWdpbiB0byBgbnVsbGAuXG4gICAgICAgIGlmICghc2FtZU9yaWdpbihyZXF1ZXN0LCByZXF1ZXN0Q3VycmVudFVSTChyZXF1ZXN0KSkpIHtcbiAgICAgICAgICBzZXJpYWxpemVkT3JpZ2luID0gbnVsbFxuICAgICAgICB9XG4gICAgICAgIGJyZWFrXG4gICAgICBkZWZhdWx0OlxuICAgICAgICAvLyBEbyBub3RoaW5nLlxuICAgIH1cblxuICAgIGlmIChzZXJpYWxpemVkT3JpZ2luKSB7XG4gICAgICAvLyAyLiBBcHBlbmQgKGBPcmlnaW5gLCBzZXJpYWxpemVkT3JpZ2luKSB0byByZXF1ZXN04oCZcyBoZWFkZXIgbGlzdC5cbiAgICAgIHJlcXVlc3QuaGVhZGVyc0xpc3QuYXBwZW5kKCdvcmlnaW4nLCBzZXJpYWxpemVkT3JpZ2luKVxuICAgIH1cbiAgfVxufVxuXG5mdW5jdGlvbiBjb2Fyc2VuZWRTaGFyZWRDdXJyZW50VGltZSAoY3Jvc3NPcmlnaW5Jc29sYXRlZENhcGFiaWxpdHkpIHtcbiAgLy8gVE9ET1xuICByZXR1cm4gcGVyZm9ybWFuY2Uubm93KClcbn1cblxuLy8gaHR0cHM6Ly9mZXRjaC5zcGVjLndoYXR3Zy5vcmcvI2NyZWF0ZS1hbi1vcGFxdWUtdGltaW5nLWluZm9cbmZ1bmN0aW9uIGNyZWF0ZU9wYXF1ZVRpbWluZ0luZm8gKHRpbWluZ0luZm8pIHtcbiAgcmV0dXJuIHtcbiAgICBzdGFydFRpbWU6IHRpbWluZ0luZm8uc3RhcnRUaW1lID8/IDAsXG4gICAgcmVkaXJlY3RTdGFydFRpbWU6IDAsXG4gICAgcmVkaXJlY3RFbmRUaW1lOiAwLFxuICAgIHBvc3RSZWRpcmVjdFN0YXJ0VGltZTogdGltaW5nSW5mby5zdGFydFRpbWUgPz8gMCxcbiAgICBmaW5hbFNlcnZpY2VXb3JrZXJTdGFydFRpbWU6IDAsXG4gICAgZmluYWxOZXR3b3JrUmVzcG9uc2VTdGFydFRpbWU6IDAsXG4gICAgZmluYWxOZXR3b3JrUmVxdWVzdFN0YXJ0VGltZTogMCxcbiAgICBlbmRUaW1lOiAwLFxuICAgIGVuY29kZWRCb2R5U2l6ZTogMCxcbiAgICBkZWNvZGVkQm9keVNpemU6IDAsXG4gICAgZmluYWxDb25uZWN0aW9uVGltaW5nSW5mbzogbnVsbFxuICB9XG59XG5cbi8vIGh0dHBzOi8vaHRtbC5zcGVjLndoYXR3Zy5vcmcvbXVsdGlwYWdlL29yaWdpbi5odG1sI3BvbGljeS1jb250YWluZXJcbmZ1bmN0aW9uIG1ha2VQb2xpY3lDb250YWluZXIgKCkge1xuICAvLyBOb3RlOiB0aGUgZmV0Y2ggc3BlYyBkb2Vzbid0IG1ha2UgdXNlIG9mIGVtYmVkZGVyIHBvbGljeSBvciBDU1AgbGlzdFxuICByZXR1cm4ge1xuICAgIHJlZmVycmVyUG9saWN5OiAnc3RyaWN0LW9yaWdpbi13aGVuLWNyb3NzLW9yaWdpbidcbiAgfVxufVxuXG4vLyBodHRwczovL2h0bWwuc3BlYy53aGF0d2cub3JnL211bHRpcGFnZS9vcmlnaW4uaHRtbCNjbG9uZS1hLXBvbGljeS1jb250YWluZXJcbmZ1bmN0aW9uIGNsb25lUG9saWN5Q29udGFpbmVyIChwb2xpY3lDb250YWluZXIpIHtcbiAgcmV0dXJuIHtcbiAgICByZWZlcnJlclBvbGljeTogcG9saWN5Q29udGFpbmVyLnJlZmVycmVyUG9saWN5XG4gIH1cbn1cblxuLy8gaHR0cHM6Ly93M2MuZ2l0aHViLmlvL3dlYmFwcHNlYy1yZWZlcnJlci1wb2xpY3kvI2RldGVybWluZS1yZXF1ZXN0cy1yZWZlcnJlclxuZnVuY3Rpb24gZGV0ZXJtaW5lUmVxdWVzdHNSZWZlcnJlciAocmVxdWVzdCkge1xuICAvLyAxLiBMZXQgcG9saWN5IGJlIHJlcXVlc3QncyByZWZlcnJlciBwb2xpY3kuXG4gIGNvbnN0IHBvbGljeSA9IHJlcXVlc3QucmVmZXJyZXJQb2xpY3lcblxuICAvLyBOb3RlOiBwb2xpY3kgY2Fubm90IChzaG91bGRuJ3QpIGJlIG51bGwgb3IgYW4gZW1wdHkgc3RyaW5nLlxuICBhc3NlcnQocG9saWN5KVxuXG4gIC8vIDIuIExldCBlbnZpcm9ubWVudCBiZSByZXF1ZXN04oCZcyBjbGllbnQuXG5cbiAgbGV0IHJlZmVycmVyU291cmNlID0gbnVsbFxuXG4gIC8vIDMuIFN3aXRjaCBvbiByZXF1ZXN04oCZcyByZWZlcnJlcjpcbiAgaWYgKHJlcXVlc3QucmVmZXJyZXIgPT09ICdjbGllbnQnKSB7XG4gICAgLy8gTm90ZTogbm9kZSBpc24ndCBhIGJyb3dzZXIgYW5kIGRvZXNuJ3QgaW1wbGVtZW50IGRvY3VtZW50L2lmcmFtZXMsXG4gICAgLy8gc28gd2UgYnlwYXNzIHRoaXMgc3RlcCBhbmQgcmVwbGFjZSBpdCB3aXRoIG91ciBvd24uXG5cbiAgICBjb25zdCBnbG9iYWxPcmlnaW4gPSBnZXRHbG9iYWxPcmlnaW4oKVxuXG4gICAgaWYgKCFnbG9iYWxPcmlnaW4gfHwgZ2xvYmFsT3JpZ2luLm9yaWdpbiA9PT0gJ251bGwnKSB7XG4gICAgICByZXR1cm4gJ25vLXJlZmVycmVyJ1xuICAgIH1cblxuICAgIC8vIG5vdGU6IHdlIG5lZWQgdG8gY2xvbmUgaXQgYXMgaXQncyBtdXRhdGVkXG4gICAgcmVmZXJyZXJTb3VyY2UgPSBuZXcgVVJMKGdsb2JhbE9yaWdpbilcbiAgfSBlbHNlIGlmIChyZXF1ZXN0LnJlZmVycmVyIGluc3RhbmNlb2YgVVJMKSB7XG4gICAgLy8gTGV0IHJlZmVycmVyU291cmNlIGJlIHJlcXVlc3TigJlzIHJlZmVycmVyLlxuICAgIHJlZmVycmVyU291cmNlID0gcmVxdWVzdC5yZWZlcnJlclxuICB9XG5cbiAgLy8gNC4gTGV0IHJlcXVlc3TigJlzIHJlZmVycmVyVVJMIGJlIHRoZSByZXN1bHQgb2Ygc3RyaXBwaW5nIHJlZmVycmVyU291cmNlIGZvclxuICAvLyAgICB1c2UgYXMgYSByZWZlcnJlci5cbiAgbGV0IHJlZmVycmVyVVJMID0gc3RyaXBVUkxGb3JSZWZlcnJlcihyZWZlcnJlclNvdXJjZSlcblxuICAvLyA1LiBMZXQgcmVmZXJyZXJPcmlnaW4gYmUgdGhlIHJlc3VsdCBvZiBzdHJpcHBpbmcgcmVmZXJyZXJTb3VyY2UgZm9yIHVzZSBhc1xuICAvLyAgICBhIHJlZmVycmVyLCB3aXRoIHRoZSBvcmlnaW4tb25seSBmbGFnIHNldCB0byB0cnVlLlxuICBjb25zdCByZWZlcnJlck9yaWdpbiA9IHN0cmlwVVJMRm9yUmVmZXJyZXIocmVmZXJyZXJTb3VyY2UsIHRydWUpXG5cbiAgLy8gNi4gSWYgdGhlIHJlc3VsdCBvZiBzZXJpYWxpemluZyByZWZlcnJlclVSTCBpcyBhIHN0cmluZyB3aG9zZSBsZW5ndGggaXNcbiAgLy8gICAgZ3JlYXRlciB0aGFuIDQwOTYsIHNldCByZWZlcnJlclVSTCB0byByZWZlcnJlck9yaWdpbi5cbiAgaWYgKHJlZmVycmVyVVJMLnRvU3RyaW5nKCkubGVuZ3RoID4gNDA5Nikge1xuICAgIHJlZmVycmVyVVJMID0gcmVmZXJyZXJPcmlnaW5cbiAgfVxuXG4gIGNvbnN0IGFyZVNhbWVPcmlnaW4gPSBzYW1lT3JpZ2luKHJlcXVlc3QsIHJlZmVycmVyVVJMKVxuICBjb25zdCBpc05vblBvdGVudGlhbGx5VHJ1c3RXb3J0aHkgPSBpc1VSTFBvdGVudGlhbGx5VHJ1c3R3b3J0aHkocmVmZXJyZXJVUkwpICYmXG4gICAgIWlzVVJMUG90ZW50aWFsbHlUcnVzdHdvcnRoeShyZXF1ZXN0LnVybClcblxuICAvLyA4LiBFeGVjdXRlIHRoZSBzd2l0Y2ggc3RhdGVtZW50cyBjb3JyZXNwb25kaW5nIHRvIHRoZSB2YWx1ZSBvZiBwb2xpY3k6XG4gIHN3aXRjaCAocG9saWN5KSB7XG4gICAgY2FzZSAnb3JpZ2luJzogcmV0dXJuIHJlZmVycmVyT3JpZ2luICE9IG51bGwgPyByZWZlcnJlck9yaWdpbiA6IHN0cmlwVVJMRm9yUmVmZXJyZXIocmVmZXJyZXJTb3VyY2UsIHRydWUpXG4gICAgY2FzZSAndW5zYWZlLXVybCc6IHJldHVybiByZWZlcnJlclVSTFxuICAgIGNhc2UgJ3NhbWUtb3JpZ2luJzpcbiAgICAgIHJldHVybiBhcmVTYW1lT3JpZ2luID8gcmVmZXJyZXJPcmlnaW4gOiAnbm8tcmVmZXJyZXInXG4gICAgY2FzZSAnb3JpZ2luLXdoZW4tY3Jvc3Mtb3JpZ2luJzpcbiAgICAgIHJldHVybiBhcmVTYW1lT3JpZ2luID8gcmVmZXJyZXJVUkwgOiByZWZlcnJlck9yaWdpblxuICAgIGNhc2UgJ3N0cmljdC1vcmlnaW4td2hlbi1jcm9zcy1vcmlnaW4nOiB7XG4gICAgICBjb25zdCBjdXJyZW50VVJMID0gcmVxdWVzdEN1cnJlbnRVUkwocmVxdWVzdClcblxuICAgICAgLy8gMS4gSWYgdGhlIG9yaWdpbiBvZiByZWZlcnJlclVSTCBhbmQgdGhlIG9yaWdpbiBvZiByZXF1ZXN04oCZcyBjdXJyZW50XG4gICAgICAvLyAgICBVUkwgYXJlIHRoZSBzYW1lLCB0aGVuIHJldHVybiByZWZlcnJlclVSTC5cbiAgICAgIGlmIChzYW1lT3JpZ2luKHJlZmVycmVyVVJMLCBjdXJyZW50VVJMKSkge1xuICAgICAgICByZXR1cm4gcmVmZXJyZXJVUkxcbiAgICAgIH1cblxuICAgICAgLy8gMi4gSWYgcmVmZXJyZXJVUkwgaXMgYSBwb3RlbnRpYWxseSB0cnVzdHdvcnRoeSBVUkwgYW5kIHJlcXVlc3TigJlzXG4gICAgICAvLyAgICBjdXJyZW50IFVSTCBpcyBub3QgYSBwb3RlbnRpYWxseSB0cnVzdHdvcnRoeSBVUkwsIHRoZW4gcmV0dXJuIG5vXG4gICAgICAvLyAgICByZWZlcnJlci5cbiAgICAgIGlmIChpc1VSTFBvdGVudGlhbGx5VHJ1c3R3b3J0aHkocmVmZXJyZXJVUkwpICYmICFpc1VSTFBvdGVudGlhbGx5VHJ1c3R3b3J0aHkoY3VycmVudFVSTCkpIHtcbiAgICAgICAgcmV0dXJuICduby1yZWZlcnJlcidcbiAgICAgIH1cblxuICAgICAgLy8gMy4gUmV0dXJuIHJlZmVycmVyT3JpZ2luLlxuICAgICAgcmV0dXJuIHJlZmVycmVyT3JpZ2luXG4gICAgfVxuICAgIGNhc2UgJ3N0cmljdC1vcmlnaW4nOiAvLyBlc2xpbnQtZGlzYWJsZS1saW5lXG4gICAgICAvKipcbiAgICAgICAgICogMS4gSWYgcmVmZXJyZXJVUkwgaXMgYSBwb3RlbnRpYWxseSB0cnVzdHdvcnRoeSBVUkwgYW5kXG4gICAgICAgICAqIHJlcXVlc3TigJlzIGN1cnJlbnQgVVJMIGlzIG5vdCBhIHBvdGVudGlhbGx5IHRydXN0d29ydGh5IFVSTCxcbiAgICAgICAgICogdGhlbiByZXR1cm4gbm8gcmVmZXJyZXIuXG4gICAgICAgICAqIDIuIFJldHVybiByZWZlcnJlck9yaWdpblxuICAgICAgICAqL1xuICAgIGNhc2UgJ25vLXJlZmVycmVyLXdoZW4tZG93bmdyYWRlJzogLy8gZXNsaW50LWRpc2FibGUtbGluZVxuICAgICAgLyoqXG4gICAgICAgKiAxLiBJZiByZWZlcnJlclVSTCBpcyBhIHBvdGVudGlhbGx5IHRydXN0d29ydGh5IFVSTCBhbmRcbiAgICAgICAqIHJlcXVlc3TigJlzIGN1cnJlbnQgVVJMIGlzIG5vdCBhIHBvdGVudGlhbGx5IHRydXN0d29ydGh5IFVSTCxcbiAgICAgICAqIHRoZW4gcmV0dXJuIG5vIHJlZmVycmVyLlxuICAgICAgICogMi4gUmV0dXJuIHJlZmVycmVyT3JpZ2luXG4gICAgICAqL1xuXG4gICAgZGVmYXVsdDogLy8gZXNsaW50LWRpc2FibGUtbGluZVxuICAgICAgcmV0dXJuIGlzTm9uUG90ZW50aWFsbHlUcnVzdFdvcnRoeSA/ICduby1yZWZlcnJlcicgOiByZWZlcnJlck9yaWdpblxuICB9XG59XG5cbi8qKlxuICogQHNlZSBodHRwczovL3czYy5naXRodWIuaW8vd2ViYXBwc2VjLXJlZmVycmVyLXBvbGljeS8jc3RyaXAtdXJsXG4gKiBAcGFyYW0ge1VSTH0gdXJsXG4gKiBAcGFyYW0ge2Jvb2xlYW58dW5kZWZpbmVkfSBvcmlnaW5Pbmx5XG4gKi9cbmZ1bmN0aW9uIHN0cmlwVVJMRm9yUmVmZXJyZXIgKHVybCwgb3JpZ2luT25seSkge1xuICAvLyAxLiBBc3NlcnQ6IHVybCBpcyBhIFVSTC5cbiAgYXNzZXJ0KHVybCBpbnN0YW5jZW9mIFVSTClcblxuICAvLyAyLiBJZiB1cmzigJlzIHNjaGVtZSBpcyBhIGxvY2FsIHNjaGVtZSwgdGhlbiByZXR1cm4gbm8gcmVmZXJyZXIuXG4gIGlmICh1cmwucHJvdG9jb2wgPT09ICdmaWxlOicgfHwgdXJsLnByb3RvY29sID09PSAnYWJvdXQ6JyB8fCB1cmwucHJvdG9jb2wgPT09ICdibGFuazonKSB7XG4gICAgcmV0dXJuICduby1yZWZlcnJlcidcbiAgfVxuXG4gIC8vIDMuIFNldCB1cmzigJlzIHVzZXJuYW1lIHRvIHRoZSBlbXB0eSBzdHJpbmcuXG4gIHVybC51c2VybmFtZSA9ICcnXG5cbiAgLy8gNC4gU2V0IHVybOKAmXMgcGFzc3dvcmQgdG8gdGhlIGVtcHR5IHN0cmluZy5cbiAgdXJsLnBhc3N3b3JkID0gJydcblxuICAvLyA1LiBTZXQgdXJs4oCZcyBmcmFnbWVudCB0byBudWxsLlxuICB1cmwuaGFzaCA9ICcnXG5cbiAgLy8gNi4gSWYgdGhlIG9yaWdpbi1vbmx5IGZsYWcgaXMgdHJ1ZSwgdGhlbjpcbiAgaWYgKG9yaWdpbk9ubHkpIHtcbiAgICAvLyAxLiBTZXQgdXJs4oCZcyBwYXRoIHRvIMKrIHRoZSBlbXB0eSBzdHJpbmcgwrsuXG4gICAgdXJsLnBhdGhuYW1lID0gJydcblxuICAgIC8vIDIuIFNldCB1cmzigJlzIHF1ZXJ5IHRvIG51bGwuXG4gICAgdXJsLnNlYXJjaCA9ICcnXG4gIH1cblxuICAvLyA3LiBSZXR1cm4gdXJsLlxuICByZXR1cm4gdXJsXG59XG5cbmZ1bmN0aW9uIGlzVVJMUG90ZW50aWFsbHlUcnVzdHdvcnRoeSAodXJsKSB7XG4gIGlmICghKHVybCBpbnN0YW5jZW9mIFVSTCkpIHtcbiAgICByZXR1cm4gZmFsc2VcbiAgfVxuXG4gIC8vIElmIGNoaWxkIG9mIGFib3V0LCByZXR1cm4gdHJ1ZVxuICBpZiAodXJsLmhyZWYgPT09ICdhYm91dDpibGFuaycgfHwgdXJsLmhyZWYgPT09ICdhYm91dDpzcmNkb2MnKSB7XG4gICAgcmV0dXJuIHRydWVcbiAgfVxuXG4gIC8vIElmIHNjaGVtZSBpcyBkYXRhLCByZXR1cm4gdHJ1ZVxuICBpZiAodXJsLnByb3RvY29sID09PSAnZGF0YTonKSByZXR1cm4gdHJ1ZVxuXG4gIC8vIElmIGZpbGUsIHJldHVybiB0cnVlXG4gIGlmICh1cmwucHJvdG9jb2wgPT09ICdmaWxlOicpIHJldHVybiB0cnVlXG5cbiAgcmV0dXJuIGlzT3JpZ2luUG90ZW50aWFsbHlUcnVzdHdvcnRoeSh1cmwub3JpZ2luKVxuXG4gIGZ1bmN0aW9uIGlzT3JpZ2luUG90ZW50aWFsbHlUcnVzdHdvcnRoeSAob3JpZ2luKSB7XG4gICAgLy8gSWYgb3JpZ2luIGlzIGV4cGxpY2l0bHkgbnVsbCwgcmV0dXJuIGZhbHNlXG4gICAgaWYgKG9yaWdpbiA9PSBudWxsIHx8IG9yaWdpbiA9PT0gJ251bGwnKSByZXR1cm4gZmFsc2VcblxuICAgIGNvbnN0IG9yaWdpbkFzVVJMID0gbmV3IFVSTChvcmlnaW4pXG5cbiAgICAvLyBJZiBzZWN1cmUsIHJldHVybiB0cnVlXG4gICAgaWYgKG9yaWdpbkFzVVJMLnByb3RvY29sID09PSAnaHR0cHM6JyB8fCBvcmlnaW5Bc1VSTC5wcm90b2NvbCA9PT0gJ3dzczonKSB7XG4gICAgICByZXR1cm4gdHJ1ZVxuICAgIH1cblxuICAgIC8vIElmIGxvY2FsaG9zdCBvciB2YXJpYW50cywgcmV0dXJuIHRydWVcbiAgICBpZiAoL14xMjcoPzpcXC5bMC05XSspezAsMn1cXC5bMC05XSskfF5cXFsoPzowKjopKj86PzAqMVxcXSQvLnRlc3Qob3JpZ2luQXNVUkwuaG9zdG5hbWUpIHx8XG4gICAgIChvcmlnaW5Bc1VSTC5ob3N0bmFtZSA9PT0gJ2xvY2FsaG9zdCcgfHwgb3JpZ2luQXNVUkwuaG9zdG5hbWUuaW5jbHVkZXMoJ2xvY2FsaG9zdC4nKSkgfHxcbiAgICAgKG9yaWdpbkFzVVJMLmhvc3RuYW1lLmVuZHNXaXRoKCcubG9jYWxob3N0JykpKSB7XG4gICAgICByZXR1cm4gdHJ1ZVxuICAgIH1cblxuICAgIC8vIElmIGFueSBvdGhlciwgcmV0dXJuIGZhbHNlXG4gICAgcmV0dXJuIGZhbHNlXG4gIH1cbn1cblxuLyoqXG4gKiBAc2VlIGh0dHBzOi8vdzNjLmdpdGh1Yi5pby93ZWJhcHBzZWMtc3VicmVzb3VyY2UtaW50ZWdyaXR5LyNkb2VzLXJlc3BvbnNlLW1hdGNoLW1ldGFkYXRhbGlzdFxuICogQHBhcmFtIHtVaW50OEFycmF5fSBieXRlc1xuICogQHBhcmFtIHtzdHJpbmd9IG1ldGFkYXRhTGlzdFxuICovXG5mdW5jdGlvbiBieXRlc01hdGNoIChieXRlcywgbWV0YWRhdGFMaXN0KSB7XG4gIC8vIElmIG5vZGUgaXMgbm90IGJ1aWx0IHdpdGggT3BlblNTTCBzdXBwb3J0LCB3ZSBjYW5ub3QgY2hlY2tcbiAgLy8gYSByZXF1ZXN0J3MgaW50ZWdyaXR5LCBzbyBhbGxvdyBpdCBieSBkZWZhdWx0ICh0aGUgc3BlYyB3aWxsXG4gIC8vIGFsbG93IHJlcXVlc3RzIGlmIGFuIGludmFsaWQgaGFzaCBpcyBnaXZlbiwgYXMgcHJlY2VkZW5jZSkuXG4gIC8qIGlzdGFuYnVsIGlnbm9yZSBpZjogb25seSBpZiBub2RlIGlzIGJ1aWx0IHdpdGggLS13aXRob3V0LXNzbCAqL1xuICBpZiAoY3J5cHRvID09PSB1bmRlZmluZWQpIHtcbiAgICByZXR1cm4gdHJ1ZVxuICB9XG5cbiAgLy8gMS4gTGV0IHBhcnNlZE1ldGFkYXRhIGJlIHRoZSByZXN1bHQgb2YgcGFyc2luZyBtZXRhZGF0YUxpc3QuXG4gIGNvbnN0IHBhcnNlZE1ldGFkYXRhID0gcGFyc2VNZXRhZGF0YShtZXRhZGF0YUxpc3QpXG5cbiAgLy8gMi4gSWYgcGFyc2VkTWV0YWRhdGEgaXMgbm8gbWV0YWRhdGEsIHJldHVybiB0cnVlLlxuICBpZiAocGFyc2VkTWV0YWRhdGEgPT09ICdubyBtZXRhZGF0YScpIHtcbiAgICByZXR1cm4gdHJ1ZVxuICB9XG5cbiAgLy8gMy4gSWYgcmVzcG9uc2UgaXMgbm90IGVsaWdpYmxlIGZvciBpbnRlZ3JpdHkgdmFsaWRhdGlvbiwgcmV0dXJuIGZhbHNlLlxuICAvLyBUT0RPXG5cbiAgLy8gNC4gSWYgcGFyc2VkTWV0YWRhdGEgaXMgdGhlIGVtcHR5IHNldCwgcmV0dXJuIHRydWUuXG4gIGlmIChwYXJzZWRNZXRhZGF0YS5sZW5ndGggPT09IDApIHtcbiAgICByZXR1cm4gdHJ1ZVxuICB9XG5cbiAgLy8gNS4gTGV0IG1ldGFkYXRhIGJlIHRoZSByZXN1bHQgb2YgZ2V0dGluZyB0aGUgc3Ryb25nZXN0XG4gIC8vICAgIG1ldGFkYXRhIGZyb20gcGFyc2VkTWV0YWRhdGEuXG4gIGNvbnN0IHN0cm9uZ2VzdCA9IGdldFN0cm9uZ2VzdE1ldGFkYXRhKHBhcnNlZE1ldGFkYXRhKVxuICBjb25zdCBtZXRhZGF0YSA9IGZpbHRlck1ldGFkYXRhTGlzdEJ5QWxnb3JpdGhtKHBhcnNlZE1ldGFkYXRhLCBzdHJvbmdlc3QpXG5cbiAgLy8gNi4gRm9yIGVhY2ggaXRlbSBpbiBtZXRhZGF0YTpcbiAgZm9yIChjb25zdCBpdGVtIG9mIG1ldGFkYXRhKSB7XG4gICAgLy8gMS4gTGV0IGFsZ29yaXRobSBiZSB0aGUgYWxnIGNvbXBvbmVudCBvZiBpdGVtLlxuICAgIGNvbnN0IGFsZ29yaXRobSA9IGl0ZW0uYWxnb1xuXG4gICAgLy8gMi4gTGV0IGV4cGVjdGVkVmFsdWUgYmUgdGhlIHZhbCBjb21wb25lbnQgb2YgaXRlbS5cbiAgICBjb25zdCBleHBlY3RlZFZhbHVlID0gaXRlbS5oYXNoXG5cbiAgICAvLyBTZWUgaHR0cHM6Ly9naXRodWIuY29tL3dlYi1wbGF0Zm9ybS10ZXN0cy93cHQvY29tbWl0L2U0YzVjYzdhNWU0ODA5MzIyMDUyOGRmZGQxYzQwMTJkYzM4MzdhMGVcbiAgICAvLyBcImJlIGxpYmVyYWwgd2l0aCBwYWRkaW5nXCIuIFRoaXMgaXMgYW5ub3lpbmcsIGFuZCBpdCdzIG5vdCBldmVuIGluIHRoZSBzcGVjLlxuXG4gICAgLy8gMy4gTGV0IGFjdHVhbFZhbHVlIGJlIHRoZSByZXN1bHQgb2YgYXBwbHlpbmcgYWxnb3JpdGhtIHRvIGJ5dGVzLlxuICAgIGxldCBhY3R1YWxWYWx1ZSA9IGNyeXB0by5jcmVhdGVIYXNoKGFsZ29yaXRobSkudXBkYXRlKGJ5dGVzKS5kaWdlc3QoJ2Jhc2U2NCcpXG5cbiAgICBpZiAoYWN0dWFsVmFsdWVbYWN0dWFsVmFsdWUubGVuZ3RoIC0gMV0gPT09ICc9Jykge1xuICAgICAgaWYgKGFjdHVhbFZhbHVlW2FjdHVhbFZhbHVlLmxlbmd0aCAtIDJdID09PSAnPScpIHtcbiAgICAgICAgYWN0dWFsVmFsdWUgPSBhY3R1YWxWYWx1ZS5zbGljZSgwLCAtMilcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGFjdHVhbFZhbHVlID0gYWN0dWFsVmFsdWUuc2xpY2UoMCwgLTEpXG4gICAgICB9XG4gICAgfVxuXG4gICAgLy8gNC4gSWYgYWN0dWFsVmFsdWUgaXMgYSBjYXNlLXNlbnNpdGl2ZSBtYXRjaCBmb3IgZXhwZWN0ZWRWYWx1ZSxcbiAgICAvLyAgICByZXR1cm4gdHJ1ZS5cbiAgICBpZiAoY29tcGFyZUJhc2U2NE1peGVkKGFjdHVhbFZhbHVlLCBleHBlY3RlZFZhbHVlKSkge1xuICAgICAgcmV0dXJuIHRydWVcbiAgICB9XG4gIH1cblxuICAvLyA3LiBSZXR1cm4gZmFsc2UuXG4gIHJldHVybiBmYWxzZVxufVxuXG4vLyBodHRwczovL3czYy5naXRodWIuaW8vd2ViYXBwc2VjLXN1YnJlc291cmNlLWludGVncml0eS8jZ3JhbW1hcmRlZi1oYXNoLXdpdGgtb3B0aW9uc1xuLy8gaHR0cHM6Ly93d3cudzMub3JnL1RSL0NTUDIvI3NvdXJjZS1saXN0LXN5bnRheFxuLy8gaHR0cHM6Ly93d3cucmZjLWVkaXRvci5vcmcvcmZjL3JmYzUyMzQjYXBwZW5kaXgtQi4xXG5jb25zdCBwYXJzZUhhc2hXaXRoT3B0aW9ucyA9IC8oPzxhbGdvPnNoYTI1NnxzaGEzODR8c2hhNTEyKS0oKD88aGFzaD5bQS1aYS16MC05Ky9dK3xbQS1aYS16MC05Xy1dKyk9ezAsMn0oPzpcXHN8JCkoICtbIS1+XSopPyk/L2lcblxuLyoqXG4gKiBAc2VlIGh0dHBzOi8vdzNjLmdpdGh1Yi5pby93ZWJhcHBzZWMtc3VicmVzb3VyY2UtaW50ZWdyaXR5LyNwYXJzZS1tZXRhZGF0YVxuICogQHBhcmFtIHtzdHJpbmd9IG1ldGFkYXRhXG4gKi9cbmZ1bmN0aW9uIHBhcnNlTWV0YWRhdGEgKG1ldGFkYXRhKSB7XG4gIC8vIDEuIExldCByZXN1bHQgYmUgdGhlIGVtcHR5IHNldC5cbiAgLyoqIEB0eXBlIHt7IGFsZ286IHN0cmluZywgaGFzaDogc3RyaW5nIH1bXX0gKi9cbiAgY29uc3QgcmVzdWx0ID0gW11cblxuICAvLyAyLiBMZXQgZW1wdHkgYmUgZXF1YWwgdG8gdHJ1ZS5cbiAgbGV0IGVtcHR5ID0gdHJ1ZVxuXG4gIC8vIDMuIEZvciBlYWNoIHRva2VuIHJldHVybmVkIGJ5IHNwbGl0dGluZyBtZXRhZGF0YSBvbiBzcGFjZXM6XG4gIGZvciAoY29uc3QgdG9rZW4gb2YgbWV0YWRhdGEuc3BsaXQoJyAnKSkge1xuICAgIC8vIDEuIFNldCBlbXB0eSB0byBmYWxzZS5cbiAgICBlbXB0eSA9IGZhbHNlXG5cbiAgICAvLyAyLiBQYXJzZSB0b2tlbiBhcyBhIGhhc2gtd2l0aC1vcHRpb25zLlxuICAgIGNvbnN0IHBhcnNlZFRva2VuID0gcGFyc2VIYXNoV2l0aE9wdGlvbnMuZXhlYyh0b2tlbilcblxuICAgIC8vIDMuIElmIHRva2VuIGRvZXMgbm90IHBhcnNlLCBjb250aW51ZSB0byB0aGUgbmV4dCB0b2tlbi5cbiAgICBpZiAoXG4gICAgICBwYXJzZWRUb2tlbiA9PT0gbnVsbCB8fFxuICAgICAgcGFyc2VkVG9rZW4uZ3JvdXBzID09PSB1bmRlZmluZWQgfHxcbiAgICAgIHBhcnNlZFRva2VuLmdyb3Vwcy5hbGdvID09PSB1bmRlZmluZWRcbiAgICApIHtcbiAgICAgIC8vIE5vdGU6IENocm9taXVtIGJsb2NrcyB0aGUgcmVxdWVzdCBhdCB0aGlzIHBvaW50LCBidXQgRmlyZWZveFxuICAgICAgLy8gZ2l2ZXMgYSB3YXJuaW5nIHRoYXQgYW4gaW52YWxpZCBpbnRlZ3JpdHkgd2FzIGdpdmVuLiBUaGVcbiAgICAgIC8vIGNvcnJlY3QgYmVoYXZpb3IgaXMgdG8gaWdub3JlIHRoZXNlLCBhbmQgc3Vic2VxdWVudGx5IG5vdFxuICAgICAgLy8gY2hlY2sgdGhlIGludGVncml0eSBvZiB0aGUgcmVzb3VyY2UuXG4gICAgICBjb250aW51ZVxuICAgIH1cblxuICAgIC8vIDQuIExldCBhbGdvcml0aG0gYmUgdGhlIGhhc2gtYWxnbyBjb21wb25lbnQgb2YgdG9rZW4uXG4gICAgY29uc3QgYWxnb3JpdGhtID0gcGFyc2VkVG9rZW4uZ3JvdXBzLmFsZ28udG9Mb3dlckNhc2UoKVxuXG4gICAgLy8gNS4gSWYgYWxnb3JpdGhtIGlzIGEgaGFzaCBmdW5jdGlvbiByZWNvZ25pemVkIGJ5IHRoZSB1c2VyXG4gICAgLy8gICAgYWdlbnQsIGFkZCB0aGUgcGFyc2VkIHRva2VuIHRvIHJlc3VsdC5cbiAgICBpZiAoc3VwcG9ydGVkSGFzaGVzLmluY2x1ZGVzKGFsZ29yaXRobSkpIHtcbiAgICAgIHJlc3VsdC5wdXNoKHBhcnNlZFRva2VuLmdyb3VwcylcbiAgICB9XG4gIH1cblxuICAvLyA0LiBSZXR1cm4gbm8gbWV0YWRhdGEgaWYgZW1wdHkgaXMgdHJ1ZSwgb3RoZXJ3aXNlIHJldHVybiByZXN1bHQuXG4gIGlmIChlbXB0eSA9PT0gdHJ1ZSkge1xuICAgIHJldHVybiAnbm8gbWV0YWRhdGEnXG4gIH1cblxuICByZXR1cm4gcmVzdWx0XG59XG5cbi8qKlxuICogQHBhcmFtIHt7IGFsZ286ICdzaGEyNTYnIHwgJ3NoYTM4NCcgfCAnc2hhNTEyJyB9W119IG1ldGFkYXRhTGlzdFxuICovXG5mdW5jdGlvbiBnZXRTdHJvbmdlc3RNZXRhZGF0YSAobWV0YWRhdGFMaXN0KSB7XG4gIC8vIExldCBhbGdvcml0aG0gYmUgdGhlIGFsZ28gY29tcG9uZW50IG9mIHRoZSBmaXJzdCBpdGVtIGluIG1ldGFkYXRhTGlzdC5cbiAgLy8gQ2FuIGJlIHNoYTI1NlxuICBsZXQgYWxnb3JpdGhtID0gbWV0YWRhdGFMaXN0WzBdLmFsZ29cbiAgLy8gSWYgdGhlIGFsZ29yaXRobSBpcyBzaGE1MTIsIHRoZW4gaXQgaXMgdGhlIHN0cm9uZ2VzdFxuICAvLyBhbmQgd2UgY2FuIHJldHVybiBpbW1lZGlhdGVseVxuICBpZiAoYWxnb3JpdGhtWzNdID09PSAnNScpIHtcbiAgICByZXR1cm4gYWxnb3JpdGhtXG4gIH1cblxuICBmb3IgKGxldCBpID0gMTsgaSA8IG1ldGFkYXRhTGlzdC5sZW5ndGg7ICsraSkge1xuICAgIGNvbnN0IG1ldGFkYXRhID0gbWV0YWRhdGFMaXN0W2ldXG4gICAgLy8gSWYgdGhlIGFsZ29yaXRobSBpcyBzaGE1MTIsIHRoZW4gaXQgaXMgdGhlIHN0cm9uZ2VzdFxuICAgIC8vIGFuZCB3ZSBjYW4gYnJlYWsgdGhlIGxvb3AgaW1tZWRpYXRlbHlcbiAgICBpZiAobWV0YWRhdGEuYWxnb1szXSA9PT0gJzUnKSB7XG4gICAgICBhbGdvcml0aG0gPSAnc2hhNTEyJ1xuICAgICAgYnJlYWtcbiAgICAvLyBJZiB0aGUgYWxnb3JpdGhtIGlzIHNoYTM4NCwgdGhlbiBhIHBvdGVudGlhbCBzaGEyNTYgb3Igc2hhMzg0IGlzIGlnbm9yZWRcbiAgICB9IGVsc2UgaWYgKGFsZ29yaXRobVszXSA9PT0gJzMnKSB7XG4gICAgICBjb250aW51ZVxuICAgIC8vIGFsZ29yaXRobSBpcyBzaGEyNTYsIGNoZWNrIGlmIGFsZ29yaXRobSBpcyBzaGEzODQgYW5kIGlmIHNvLCBzZXQgaXQgYXNcbiAgICAvLyB0aGUgc3Ryb25nZXN0XG4gICAgfSBlbHNlIGlmIChtZXRhZGF0YS5hbGdvWzNdID09PSAnMycpIHtcbiAgICAgIGFsZ29yaXRobSA9ICdzaGEzODQnXG4gICAgfVxuICB9XG4gIHJldHVybiBhbGdvcml0aG1cbn1cblxuZnVuY3Rpb24gZmlsdGVyTWV0YWRhdGFMaXN0QnlBbGdvcml0aG0gKG1ldGFkYXRhTGlzdCwgYWxnb3JpdGhtKSB7XG4gIGlmIChtZXRhZGF0YUxpc3QubGVuZ3RoID09PSAxKSB7XG4gICAgcmV0dXJuIG1ldGFkYXRhTGlzdFxuICB9XG5cbiAgbGV0IHBvcyA9IDBcbiAgZm9yIChsZXQgaSA9IDA7IGkgPCBtZXRhZGF0YUxpc3QubGVuZ3RoOyArK2kpIHtcbiAgICBpZiAobWV0YWRhdGFMaXN0W2ldLmFsZ28gPT09IGFsZ29yaXRobSkge1xuICAgICAgbWV0YWRhdGFMaXN0W3BvcysrXSA9IG1ldGFkYXRhTGlzdFtpXVxuICAgIH1cbiAgfVxuXG4gIG1ldGFkYXRhTGlzdC5sZW5ndGggPSBwb3NcblxuICByZXR1cm4gbWV0YWRhdGFMaXN0XG59XG5cbi8qKlxuICogQ29tcGFyZXMgdHdvIGJhc2U2NCBzdHJpbmdzLCBhbGxvd2luZyBmb3IgYmFzZTY0dXJsXG4gKiBpbiB0aGUgc2Vjb25kIHN0cmluZy5cbiAqXG4qIEBwYXJhbSB7c3RyaW5nfSBhY3R1YWxWYWx1ZSBhbHdheXMgYmFzZTY0XG4gKiBAcGFyYW0ge3N0cmluZ30gZXhwZWN0ZWRWYWx1ZSBiYXNlNjQgb3IgYmFzZTY0dXJsXG4gKiBAcmV0dXJucyB7Ym9vbGVhbn1cbiAqL1xuZnVuY3Rpb24gY29tcGFyZUJhc2U2NE1peGVkIChhY3R1YWxWYWx1ZSwgZXhwZWN0ZWRWYWx1ZSkge1xuICBpZiAoYWN0dWFsVmFsdWUubGVuZ3RoICE9PSBleHBlY3RlZFZhbHVlLmxlbmd0aCkge1xuICAgIHJldHVybiBmYWxzZVxuICB9XG4gIGZvciAobGV0IGkgPSAwOyBpIDwgYWN0dWFsVmFsdWUubGVuZ3RoOyArK2kpIHtcbiAgICBpZiAoYWN0dWFsVmFsdWVbaV0gIT09IGV4cGVjdGVkVmFsdWVbaV0pIHtcbiAgICAgIGlmIChcbiAgICAgICAgKGFjdHVhbFZhbHVlW2ldID09PSAnKycgJiYgZXhwZWN0ZWRWYWx1ZVtpXSA9PT0gJy0nKSB8fFxuICAgICAgICAoYWN0dWFsVmFsdWVbaV0gPT09ICcvJyAmJiBleHBlY3RlZFZhbHVlW2ldID09PSAnXycpXG4gICAgICApIHtcbiAgICAgICAgY29udGludWVcbiAgICAgIH1cbiAgICAgIHJldHVybiBmYWxzZVxuICAgIH1cbiAgfVxuXG4gIHJldHVybiB0cnVlXG59XG5cbi8vIGh0dHBzOi8vdzNjLmdpdGh1Yi5pby93ZWJhcHBzZWMtdXBncmFkZS1pbnNlY3VyZS1yZXF1ZXN0cy8jdXBncmFkZS1yZXF1ZXN0XG5mdW5jdGlvbiB0cnlVcGdyYWRlUmVxdWVzdFRvQVBvdGVudGlhbGx5VHJ1c3R3b3J0aHlVUkwgKHJlcXVlc3QpIHtcbiAgLy8gVE9ET1xufVxuXG4vKipcbiAqIEBsaW5rIHtodHRwczovL2h0bWwuc3BlYy53aGF0d2cub3JnL211bHRpcGFnZS9vcmlnaW4uaHRtbCNzYW1lLW9yaWdpbn1cbiAqIEBwYXJhbSB7VVJMfSBBXG4gKiBAcGFyYW0ge1VSTH0gQlxuICovXG5mdW5jdGlvbiBzYW1lT3JpZ2luIChBLCBCKSB7XG4gIC8vIDEuIElmIEEgYW5kIEIgYXJlIHRoZSBzYW1lIG9wYXF1ZSBvcmlnaW4sIHRoZW4gcmV0dXJuIHRydWUuXG4gIGlmIChBLm9yaWdpbiA9PT0gQi5vcmlnaW4gJiYgQS5vcmlnaW4gPT09ICdudWxsJykge1xuICAgIHJldHVybiB0cnVlXG4gIH1cblxuICAvLyAyLiBJZiBBIGFuZCBCIGFyZSBib3RoIHR1cGxlIG9yaWdpbnMgYW5kIHRoZWlyIHNjaGVtZXMsXG4gIC8vICAgIGhvc3RzLCBhbmQgcG9ydCBhcmUgaWRlbnRpY2FsLCB0aGVuIHJldHVybiB0cnVlLlxuICBpZiAoQS5wcm90b2NvbCA9PT0gQi5wcm90b2NvbCAmJiBBLmhvc3RuYW1lID09PSBCLmhvc3RuYW1lICYmIEEucG9ydCA9PT0gQi5wb3J0KSB7XG4gICAgcmV0dXJuIHRydWVcbiAgfVxuXG4gIC8vIDMuIFJldHVybiBmYWxzZS5cbiAgcmV0dXJuIGZhbHNlXG59XG5cbmZ1bmN0aW9uIGNyZWF0ZURlZmVycmVkUHJvbWlzZSAoKSB7XG4gIGxldCByZXNcbiAgbGV0IHJlalxuICBjb25zdCBwcm9taXNlID0gbmV3IFByb21pc2UoKHJlc29sdmUsIHJlamVjdCkgPT4ge1xuICAgIHJlcyA9IHJlc29sdmVcbiAgICByZWogPSByZWplY3RcbiAgfSlcblxuICByZXR1cm4geyBwcm9taXNlLCByZXNvbHZlOiByZXMsIHJlamVjdDogcmVqIH1cbn1cblxuZnVuY3Rpb24gaXNBYm9ydGVkIChmZXRjaFBhcmFtcykge1xuICByZXR1cm4gZmV0Y2hQYXJhbXMuY29udHJvbGxlci5zdGF0ZSA9PT0gJ2Fib3J0ZWQnXG59XG5cbmZ1bmN0aW9uIGlzQ2FuY2VsbGVkIChmZXRjaFBhcmFtcykge1xuICByZXR1cm4gZmV0Y2hQYXJhbXMuY29udHJvbGxlci5zdGF0ZSA9PT0gJ2Fib3J0ZWQnIHx8XG4gICAgZmV0Y2hQYXJhbXMuY29udHJvbGxlci5zdGF0ZSA9PT0gJ3Rlcm1pbmF0ZWQnXG59XG5cbmNvbnN0IG5vcm1hbGl6ZU1ldGhvZFJlY29yZCA9IHtcbiAgZGVsZXRlOiAnREVMRVRFJyxcbiAgREVMRVRFOiAnREVMRVRFJyxcbiAgZ2V0OiAnR0VUJyxcbiAgR0VUOiAnR0VUJyxcbiAgaGVhZDogJ0hFQUQnLFxuICBIRUFEOiAnSEVBRCcsXG4gIG9wdGlvbnM6ICdPUFRJT05TJyxcbiAgT1BUSU9OUzogJ09QVElPTlMnLFxuICBwb3N0OiAnUE9TVCcsXG4gIFBPU1Q6ICdQT1NUJyxcbiAgcHV0OiAnUFVUJyxcbiAgUFVUOiAnUFVUJ1xufVxuXG4vLyBOb3RlOiBvYmplY3QgcHJvdG90eXBlcyBzaG91bGQgbm90IGJlIGFibGUgdG8gYmUgcmVmZXJlbmNlZC4gZS5nLiBgT2JqZWN0I2hhc093blByb3BlcnR5YC5cbk9iamVjdC5zZXRQcm90b3R5cGVPZihub3JtYWxpemVNZXRob2RSZWNvcmQsIG51bGwpXG5cbi8qKlxuICogQHNlZSBodHRwczovL2ZldGNoLnNwZWMud2hhdHdnLm9yZy8jY29uY2VwdC1tZXRob2Qtbm9ybWFsaXplXG4gKiBAcGFyYW0ge3N0cmluZ30gbWV0aG9kXG4gKi9cbmZ1bmN0aW9uIG5vcm1hbGl6ZU1ldGhvZCAobWV0aG9kKSB7XG4gIHJldHVybiBub3JtYWxpemVNZXRob2RSZWNvcmRbbWV0aG9kLnRvTG93ZXJDYXNlKCldID8/IG1ldGhvZFxufVxuXG4vLyBodHRwczovL2luZnJhLnNwZWMud2hhdHdnLm9yZy8jc2VyaWFsaXplLWEtamF2YXNjcmlwdC12YWx1ZS10by1hLWpzb24tc3RyaW5nXG5mdW5jdGlvbiBzZXJpYWxpemVKYXZhc2NyaXB0VmFsdWVUb0pTT05TdHJpbmcgKHZhbHVlKSB7XG4gIC8vIDEuIExldCByZXN1bHQgYmUgPyBDYWxsKCVKU09OLnN0cmluZ2lmeSUsIHVuZGVmaW5lZCwgwqsgdmFsdWUgwrspLlxuICBjb25zdCByZXN1bHQgPSBKU09OLnN0cmluZ2lmeSh2YWx1ZSlcblxuICAvLyAyLiBJZiByZXN1bHQgaXMgdW5kZWZpbmVkLCB0aGVuIHRocm93IGEgVHlwZUVycm9yLlxuICBpZiAocmVzdWx0ID09PSB1bmRlZmluZWQpIHtcbiAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCdWYWx1ZSBpcyBub3QgSlNPTiBzZXJpYWxpemFibGUnKVxuICB9XG5cbiAgLy8gMy4gQXNzZXJ0OiByZXN1bHQgaXMgYSBzdHJpbmcuXG4gIGFzc2VydCh0eXBlb2YgcmVzdWx0ID09PSAnc3RyaW5nJylcblxuICAvLyA0LiBSZXR1cm4gcmVzdWx0LlxuICByZXR1cm4gcmVzdWx0XG59XG5cbi8vIGh0dHBzOi8vdGMzOS5lcy9lY21hMjYyLyNzZWMtJTI1aXRlcmF0b3Jwcm90b3R5cGUlMjUtb2JqZWN0XG5jb25zdCBlc0l0ZXJhdG9yUHJvdG90eXBlID0gT2JqZWN0LmdldFByb3RvdHlwZU9mKE9iamVjdC5nZXRQcm90b3R5cGVPZihbXVtTeW1ib2wuaXRlcmF0b3JdKCkpKVxuXG4vKipcbiAqIEBzZWUgaHR0cHM6Ly93ZWJpZGwuc3BlYy53aGF0d2cub3JnLyNkZm4taXRlcmF0b3ItcHJvdG90eXBlLW9iamVjdFxuICogQHBhcmFtIHsoKSA9PiB1bmtub3duW119IGl0ZXJhdG9yXG4gKiBAcGFyYW0ge3N0cmluZ30gbmFtZSBuYW1lIG9mIHRoZSBpbnN0YW5jZVxuICogQHBhcmFtIHsna2V5J3wndmFsdWUnfCdrZXkrdmFsdWUnfSBraW5kXG4gKi9cbmZ1bmN0aW9uIG1ha2VJdGVyYXRvciAoaXRlcmF0b3IsIG5hbWUsIGtpbmQpIHtcbiAgY29uc3Qgb2JqZWN0ID0ge1xuICAgIGluZGV4OiAwLFxuICAgIGtpbmQsXG4gICAgdGFyZ2V0OiBpdGVyYXRvclxuICB9XG5cbiAgY29uc3QgaSA9IHtcbiAgICBuZXh0ICgpIHtcbiAgICAgIC8vIDEuIExldCBpbnRlcmZhY2UgYmUgdGhlIGludGVyZmFjZSBmb3Igd2hpY2ggdGhlIGl0ZXJhdG9yIHByb3RvdHlwZSBvYmplY3QgZXhpc3RzLlxuXG4gICAgICAvLyAyLiBMZXQgdGhpc1ZhbHVlIGJlIHRoZSB0aGlzIHZhbHVlLlxuXG4gICAgICAvLyAzLiBMZXQgb2JqZWN0IGJlID8gVG9PYmplY3QodGhpc1ZhbHVlKS5cblxuICAgICAgLy8gNC4gSWYgb2JqZWN0IGlzIGEgcGxhdGZvcm0gb2JqZWN0LCB0aGVuIHBlcmZvcm0gYSBzZWN1cml0eVxuICAgICAgLy8gICAgY2hlY2ssIHBhc3Npbmc6XG5cbiAgICAgIC8vIDUuIElmIG9iamVjdCBpcyBub3QgYSBkZWZhdWx0IGl0ZXJhdG9yIG9iamVjdCBmb3IgaW50ZXJmYWNlLFxuICAgICAgLy8gICAgdGhlbiB0aHJvdyBhIFR5cGVFcnJvci5cbiAgICAgIGlmIChPYmplY3QuZ2V0UHJvdG90eXBlT2YodGhpcykgIT09IGkpIHtcbiAgICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcihcbiAgICAgICAgICBgJ25leHQnIGNhbGxlZCBvbiBhbiBvYmplY3QgdGhhdCBkb2VzIG5vdCBpbXBsZW1lbnQgaW50ZXJmYWNlICR7bmFtZX0gSXRlcmF0b3IuYFxuICAgICAgICApXG4gICAgICB9XG5cbiAgICAgIC8vIDYuIExldCBpbmRleCBiZSBvYmplY3TigJlzIGluZGV4LlxuICAgICAgLy8gNy4gTGV0IGtpbmQgYmUgb2JqZWN04oCZcyBraW5kLlxuICAgICAgLy8gOC4gTGV0IHZhbHVlcyBiZSBvYmplY3TigJlzIHRhcmdldCdzIHZhbHVlIHBhaXJzIHRvIGl0ZXJhdGUgb3Zlci5cbiAgICAgIGNvbnN0IHsgaW5kZXgsIGtpbmQsIHRhcmdldCB9ID0gb2JqZWN0XG4gICAgICBjb25zdCB2YWx1ZXMgPSB0YXJnZXQoKVxuXG4gICAgICAvLyA5LiBMZXQgbGVuIGJlIHRoZSBsZW5ndGggb2YgdmFsdWVzLlxuICAgICAgY29uc3QgbGVuID0gdmFsdWVzLmxlbmd0aFxuXG4gICAgICAvLyAxMC4gSWYgaW5kZXggaXMgZ3JlYXRlciB0aGFuIG9yIGVxdWFsIHRvIGxlbiwgdGhlbiByZXR1cm5cbiAgICAgIC8vICAgICBDcmVhdGVJdGVyUmVzdWx0T2JqZWN0KHVuZGVmaW5lZCwgdHJ1ZSkuXG4gICAgICBpZiAoaW5kZXggPj0gbGVuKSB7XG4gICAgICAgIHJldHVybiB7IHZhbHVlOiB1bmRlZmluZWQsIGRvbmU6IHRydWUgfVxuICAgICAgfVxuXG4gICAgICAvLyAxMS4gTGV0IHBhaXIgYmUgdGhlIGVudHJ5IGluIHZhbHVlcyBhdCBpbmRleCBpbmRleC5cbiAgICAgIGNvbnN0IHBhaXIgPSB2YWx1ZXNbaW5kZXhdXG5cbiAgICAgIC8vIDEyLiBTZXQgb2JqZWN04oCZcyBpbmRleCB0byBpbmRleCArIDEuXG4gICAgICBvYmplY3QuaW5kZXggPSBpbmRleCArIDFcblxuICAgICAgLy8gMTMuIFJldHVybiB0aGUgaXRlcmF0b3IgcmVzdWx0IGZvciBwYWlyIGFuZCBraW5kLlxuICAgICAgcmV0dXJuIGl0ZXJhdG9yUmVzdWx0KHBhaXIsIGtpbmQpXG4gICAgfSxcbiAgICAvLyBUaGUgY2xhc3Mgc3RyaW5nIG9mIGFuIGl0ZXJhdG9yIHByb3RvdHlwZSBvYmplY3QgZm9yIGEgZ2l2ZW4gaW50ZXJmYWNlIGlzIHRoZVxuICAgIC8vIHJlc3VsdCBvZiBjb25jYXRlbmF0aW5nIHRoZSBpZGVudGlmaWVyIG9mIHRoZSBpbnRlcmZhY2UgYW5kIHRoZSBzdHJpbmcgXCIgSXRlcmF0b3JcIi5cbiAgICBbU3ltYm9sLnRvU3RyaW5nVGFnXTogYCR7bmFtZX0gSXRlcmF0b3JgXG4gIH1cblxuICAvLyBUaGUgW1tQcm90b3R5cGVdXSBpbnRlcm5hbCBzbG90IG9mIGFuIGl0ZXJhdG9yIHByb3RvdHlwZSBvYmplY3QgbXVzdCBiZSAlSXRlcmF0b3JQcm90b3R5cGUlLlxuICBPYmplY3Quc2V0UHJvdG90eXBlT2YoaSwgZXNJdGVyYXRvclByb3RvdHlwZSlcbiAgLy8gZXNJdGVyYXRvclByb3RvdHlwZSBuZWVkcyB0byBiZSB0aGUgcHJvdG90eXBlIG9mIGlcbiAgLy8gd2hpY2ggaXMgdGhlIHByb3RvdHlwZSBvZiBhbiBlbXB0eSBvYmplY3QuIFllcywgaXQncyBjb25mdXNpbmcuXG4gIHJldHVybiBPYmplY3Quc2V0UHJvdG90eXBlT2Yoe30sIGkpXG59XG5cbi8vIGh0dHBzOi8vd2ViaWRsLnNwZWMud2hhdHdnLm9yZy8jaXRlcmF0b3ItcmVzdWx0XG5mdW5jdGlvbiBpdGVyYXRvclJlc3VsdCAocGFpciwga2luZCkge1xuICBsZXQgcmVzdWx0XG5cbiAgLy8gMS4gTGV0IHJlc3VsdCBiZSBhIHZhbHVlIGRldGVybWluZWQgYnkgdGhlIHZhbHVlIG9mIGtpbmQ6XG4gIHN3aXRjaCAoa2luZCkge1xuICAgIGNhc2UgJ2tleSc6IHtcbiAgICAgIC8vIDEuIExldCBpZGxLZXkgYmUgcGFpcuKAmXMga2V5LlxuICAgICAgLy8gMi4gTGV0IGtleSBiZSB0aGUgcmVzdWx0IG9mIGNvbnZlcnRpbmcgaWRsS2V5IHRvIGFuXG4gICAgICAvLyAgICBFQ01BU2NyaXB0IHZhbHVlLlxuICAgICAgLy8gMy4gcmVzdWx0IGlzIGtleS5cbiAgICAgIHJlc3VsdCA9IHBhaXJbMF1cbiAgICAgIGJyZWFrXG4gICAgfVxuICAgIGNhc2UgJ3ZhbHVlJzoge1xuICAgICAgLy8gMS4gTGV0IGlkbFZhbHVlIGJlIHBhaXLigJlzIHZhbHVlLlxuICAgICAgLy8gMi4gTGV0IHZhbHVlIGJlIHRoZSByZXN1bHQgb2YgY29udmVydGluZyBpZGxWYWx1ZSB0b1xuICAgICAgLy8gICAgYW4gRUNNQVNjcmlwdCB2YWx1ZS5cbiAgICAgIC8vIDMuIHJlc3VsdCBpcyB2YWx1ZS5cbiAgICAgIHJlc3VsdCA9IHBhaXJbMV1cbiAgICAgIGJyZWFrXG4gICAgfVxuICAgIGNhc2UgJ2tleSt2YWx1ZSc6IHtcbiAgICAgIC8vIDEuIExldCBpZGxLZXkgYmUgcGFpcuKAmXMga2V5LlxuICAgICAgLy8gMi4gTGV0IGlkbFZhbHVlIGJlIHBhaXLigJlzIHZhbHVlLlxuICAgICAgLy8gMy4gTGV0IGtleSBiZSB0aGUgcmVzdWx0IG9mIGNvbnZlcnRpbmcgaWRsS2V5IHRvIGFuXG4gICAgICAvLyAgICBFQ01BU2NyaXB0IHZhbHVlLlxuICAgICAgLy8gNC4gTGV0IHZhbHVlIGJlIHRoZSByZXN1bHQgb2YgY29udmVydGluZyBpZGxWYWx1ZSB0b1xuICAgICAgLy8gICAgYW4gRUNNQVNjcmlwdCB2YWx1ZS5cbiAgICAgIC8vIDUuIExldCBhcnJheSBiZSAhIEFycmF5Q3JlYXRlKDIpLlxuICAgICAgLy8gNi4gQ2FsbCAhIENyZWF0ZURhdGFQcm9wZXJ0eShhcnJheSwgXCIwXCIsIGtleSkuXG4gICAgICAvLyA3LiBDYWxsICEgQ3JlYXRlRGF0YVByb3BlcnR5KGFycmF5LCBcIjFcIiwgdmFsdWUpLlxuICAgICAgLy8gOC4gcmVzdWx0IGlzIGFycmF5LlxuICAgICAgcmVzdWx0ID0gcGFpclxuICAgICAgYnJlYWtcbiAgICB9XG4gIH1cblxuICAvLyAyLiBSZXR1cm4gQ3JlYXRlSXRlclJlc3VsdE9iamVjdChyZXN1bHQsIGZhbHNlKS5cbiAgcmV0dXJuIHsgdmFsdWU6IHJlc3VsdCwgZG9uZTogZmFsc2UgfVxufVxuXG4vKipcbiAqIEBzZWUgaHR0cHM6Ly9mZXRjaC5zcGVjLndoYXR3Zy5vcmcvI2JvZHktZnVsbHktcmVhZFxuICovXG5hc3luYyBmdW5jdGlvbiBmdWxseVJlYWRCb2R5IChib2R5LCBwcm9jZXNzQm9keSwgcHJvY2Vzc0JvZHlFcnJvcikge1xuICAvLyAxLiBJZiB0YXNrRGVzdGluYXRpb24gaXMgbnVsbCwgdGhlbiBzZXQgdGFza0Rlc3RpbmF0aW9uIHRvXG4gIC8vICAgIHRoZSByZXN1bHQgb2Ygc3RhcnRpbmcgYSBuZXcgcGFyYWxsZWwgcXVldWUuXG5cbiAgLy8gMi4gTGV0IHN1Y2Nlc3NTdGVwcyBnaXZlbiBhIGJ5dGUgc2VxdWVuY2UgYnl0ZXMgYmUgdG8gcXVldWUgYVxuICAvLyAgICBmZXRjaCB0YXNrIHRvIHJ1biBwcm9jZXNzQm9keSBnaXZlbiBieXRlcywgd2l0aCB0YXNrRGVzdGluYXRpb24uXG4gIGNvbnN0IHN1Y2Nlc3NTdGVwcyA9IHByb2Nlc3NCb2R5XG5cbiAgLy8gMy4gTGV0IGVycm9yU3RlcHMgYmUgdG8gcXVldWUgYSBmZXRjaCB0YXNrIHRvIHJ1biBwcm9jZXNzQm9keUVycm9yLFxuICAvLyAgICB3aXRoIHRhc2tEZXN0aW5hdGlvbi5cbiAgY29uc3QgZXJyb3JTdGVwcyA9IHByb2Nlc3NCb2R5RXJyb3JcblxuICAvLyA0LiBMZXQgcmVhZGVyIGJlIHRoZSByZXN1bHQgb2YgZ2V0dGluZyBhIHJlYWRlciBmb3IgYm9keeKAmXMgc3RyZWFtLlxuICAvLyAgICBJZiB0aGF0IHRocmV3IGFuIGV4Y2VwdGlvbiwgdGhlbiBydW4gZXJyb3JTdGVwcyB3aXRoIHRoYXRcbiAgLy8gICAgZXhjZXB0aW9uIGFuZCByZXR1cm4uXG4gIGxldCByZWFkZXJcblxuICB0cnkge1xuICAgIHJlYWRlciA9IGJvZHkuc3RyZWFtLmdldFJlYWRlcigpXG4gIH0gY2F0Y2ggKGUpIHtcbiAgICBlcnJvclN0ZXBzKGUpXG4gICAgcmV0dXJuXG4gIH1cblxuICAvLyA1LiBSZWFkIGFsbCBieXRlcyBmcm9tIHJlYWRlciwgZ2l2ZW4gc3VjY2Vzc1N0ZXBzIGFuZCBlcnJvclN0ZXBzLlxuICB0cnkge1xuICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IHJlYWRBbGxCeXRlcyhyZWFkZXIpXG4gICAgc3VjY2Vzc1N0ZXBzKHJlc3VsdClcbiAgfSBjYXRjaCAoZSkge1xuICAgIGVycm9yU3RlcHMoZSlcbiAgfVxufVxuXG4vKiogQHR5cGUge1JlYWRhYmxlU3RyZWFtfSAqL1xubGV0IFJlYWRhYmxlU3RyZWFtID0gZ2xvYmFsVGhpcy5SZWFkYWJsZVN0cmVhbVxuXG5mdW5jdGlvbiBpc1JlYWRhYmxlU3RyZWFtTGlrZSAoc3RyZWFtKSB7XG4gIGlmICghUmVhZGFibGVTdHJlYW0pIHtcbiAgICBSZWFkYWJsZVN0cmVhbSA9IHJlcXVpcmUoJ3N0cmVhbS93ZWInKS5SZWFkYWJsZVN0cmVhbVxuICB9XG5cbiAgcmV0dXJuIHN0cmVhbSBpbnN0YW5jZW9mIFJlYWRhYmxlU3RyZWFtIHx8IChcbiAgICBzdHJlYW1bU3ltYm9sLnRvU3RyaW5nVGFnXSA9PT0gJ1JlYWRhYmxlU3RyZWFtJyAmJlxuICAgIHR5cGVvZiBzdHJlYW0udGVlID09PSAnZnVuY3Rpb24nXG4gIClcbn1cblxuY29uc3QgTUFYSU1VTV9BUkdVTUVOVF9MRU5HVEggPSA2NTUzNVxuXG4vKipcbiAqIEBzZWUgaHR0cHM6Ly9pbmZyYS5zcGVjLndoYXR3Zy5vcmcvI2lzb21vcnBoaWMtZGVjb2RlXG4gKiBAcGFyYW0ge251bWJlcltdfFVpbnQ4QXJyYXl9IGlucHV0XG4gKi9cbmZ1bmN0aW9uIGlzb21vcnBoaWNEZWNvZGUgKGlucHV0KSB7XG4gIC8vIDEuIFRvIGlzb21vcnBoaWMgZGVjb2RlIGEgYnl0ZSBzZXF1ZW5jZSBpbnB1dCwgcmV0dXJuIGEgc3RyaW5nIHdob3NlIGNvZGUgcG9pbnRcbiAgLy8gICAgbGVuZ3RoIGlzIGVxdWFsIHRvIGlucHV04oCZcyBsZW5ndGggYW5kIHdob3NlIGNvZGUgcG9pbnRzIGhhdmUgdGhlIHNhbWUgdmFsdWVzXG4gIC8vICAgIGFzIHRoZSB2YWx1ZXMgb2YgaW5wdXTigJlzIGJ5dGVzLCBpbiB0aGUgc2FtZSBvcmRlci5cblxuICBpZiAoaW5wdXQubGVuZ3RoIDwgTUFYSU1VTV9BUkdVTUVOVF9MRU5HVEgpIHtcbiAgICByZXR1cm4gU3RyaW5nLmZyb21DaGFyQ29kZSguLi5pbnB1dClcbiAgfVxuXG4gIHJldHVybiBpbnB1dC5yZWR1Y2UoKHByZXZpb3VzLCBjdXJyZW50KSA9PiBwcmV2aW91cyArIFN0cmluZy5mcm9tQ2hhckNvZGUoY3VycmVudCksICcnKVxufVxuXG4vKipcbiAqIEBwYXJhbSB7UmVhZGFibGVTdHJlYW1Db250cm9sbGVyPFVpbnQ4QXJyYXk+fSBjb250cm9sbGVyXG4gKi9cbmZ1bmN0aW9uIHJlYWRhYmxlU3RyZWFtQ2xvc2UgKGNvbnRyb2xsZXIpIHtcbiAgdHJ5IHtcbiAgICBjb250cm9sbGVyLmNsb3NlKClcbiAgfSBjYXRjaCAoZXJyKSB7XG4gICAgLy8gVE9ETzogYWRkIGNvbW1lbnQgZXhwbGFpbmluZyB3aHkgdGhpcyBlcnJvciBvY2N1cnMuXG4gICAgaWYgKCFlcnIubWVzc2FnZS5pbmNsdWRlcygnQ29udHJvbGxlciBpcyBhbHJlYWR5IGNsb3NlZCcpKSB7XG4gICAgICB0aHJvdyBlcnJcbiAgICB9XG4gIH1cbn1cblxuLyoqXG4gKiBAc2VlIGh0dHBzOi8vaW5mcmEuc3BlYy53aGF0d2cub3JnLyNpc29tb3JwaGljLWVuY29kZVxuICogQHBhcmFtIHtzdHJpbmd9IGlucHV0XG4gKi9cbmZ1bmN0aW9uIGlzb21vcnBoaWNFbmNvZGUgKGlucHV0KSB7XG4gIC8vIDEuIEFzc2VydDogaW5wdXQgY29udGFpbnMgbm8gY29kZSBwb2ludHMgZ3JlYXRlciB0aGFuIFUrMDBGRi5cbiAgZm9yIChsZXQgaSA9IDA7IGkgPCBpbnB1dC5sZW5ndGg7IGkrKykge1xuICAgIGFzc2VydChpbnB1dC5jaGFyQ29kZUF0KGkpIDw9IDB4RkYpXG4gIH1cblxuICAvLyAyLiBSZXR1cm4gYSBieXRlIHNlcXVlbmNlIHdob3NlIGxlbmd0aCBpcyBlcXVhbCB0byBpbnB1dOKAmXMgY29kZVxuICAvLyAgICBwb2ludCBsZW5ndGggYW5kIHdob3NlIGJ5dGVzIGhhdmUgdGhlIHNhbWUgdmFsdWVzIGFzIHRoZVxuICAvLyAgICB2YWx1ZXMgb2YgaW5wdXTigJlzIGNvZGUgcG9pbnRzLCBpbiB0aGUgc2FtZSBvcmRlclxuICByZXR1cm4gaW5wdXRcbn1cblxuLyoqXG4gKiBAc2VlIGh0dHBzOi8vc3RyZWFtcy5zcGVjLndoYXR3Zy5vcmcvI3JlYWRhYmxlc3RyZWFtZGVmYXVsdHJlYWRlci1yZWFkLWFsbC1ieXRlc1xuICogQHNlZSBodHRwczovL3N0cmVhbXMuc3BlYy53aGF0d2cub3JnLyNyZWFkLWxvb3BcbiAqIEBwYXJhbSB7UmVhZGFibGVTdHJlYW1EZWZhdWx0UmVhZGVyfSByZWFkZXJcbiAqL1xuYXN5bmMgZnVuY3Rpb24gcmVhZEFsbEJ5dGVzIChyZWFkZXIpIHtcbiAgY29uc3QgYnl0ZXMgPSBbXVxuICBsZXQgYnl0ZUxlbmd0aCA9IDBcblxuICB3aGlsZSAodHJ1ZSkge1xuICAgIGNvbnN0IHsgZG9uZSwgdmFsdWU6IGNodW5rIH0gPSBhd2FpdCByZWFkZXIucmVhZCgpXG5cbiAgICBpZiAoZG9uZSkge1xuICAgICAgLy8gMS4gQ2FsbCBzdWNjZXNzU3RlcHMgd2l0aCBieXRlcy5cbiAgICAgIHJldHVybiBCdWZmZXIuY29uY2F0KGJ5dGVzLCBieXRlTGVuZ3RoKVxuICAgIH1cblxuICAgIC8vIDEuIElmIGNodW5rIGlzIG5vdCBhIFVpbnQ4QXJyYXkgb2JqZWN0LCBjYWxsIGZhaWx1cmVTdGVwc1xuICAgIC8vICAgIHdpdGggYSBUeXBlRXJyb3IgYW5kIGFib3J0IHRoZXNlIHN0ZXBzLlxuICAgIGlmICghaXNVaW50OEFycmF5KGNodW5rKSkge1xuICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcignUmVjZWl2ZWQgbm9uLVVpbnQ4QXJyYXkgY2h1bmsnKVxuICAgIH1cblxuICAgIC8vIDIuIEFwcGVuZCB0aGUgYnl0ZXMgcmVwcmVzZW50ZWQgYnkgY2h1bmsgdG8gYnl0ZXMuXG4gICAgYnl0ZXMucHVzaChjaHVuaylcbiAgICBieXRlTGVuZ3RoICs9IGNodW5rLmxlbmd0aFxuXG4gICAgLy8gMy4gUmVhZC1sb29wIGdpdmVuIHJlYWRlciwgYnl0ZXMsIHN1Y2Nlc3NTdGVwcywgYW5kIGZhaWx1cmVTdGVwcy5cbiAgfVxufVxuXG4vKipcbiAqIEBzZWUgaHR0cHM6Ly9mZXRjaC5zcGVjLndoYXR3Zy5vcmcvI2lzLWxvY2FsXG4gKiBAcGFyYW0ge1VSTH0gdXJsXG4gKi9cbmZ1bmN0aW9uIHVybElzTG9jYWwgKHVybCkge1xuICBhc3NlcnQoJ3Byb3RvY29sJyBpbiB1cmwpIC8vIGVuc3VyZSBpdCdzIGEgdXJsIG9iamVjdFxuXG4gIGNvbnN0IHByb3RvY29sID0gdXJsLnByb3RvY29sXG5cbiAgcmV0dXJuIHByb3RvY29sID09PSAnYWJvdXQ6JyB8fCBwcm90b2NvbCA9PT0gJ2Jsb2I6JyB8fCBwcm90b2NvbCA9PT0gJ2RhdGE6J1xufVxuXG4vKipcbiAqIEBwYXJhbSB7c3RyaW5nfFVSTH0gdXJsXG4gKi9cbmZ1bmN0aW9uIHVybEhhc0h0dHBzU2NoZW1lICh1cmwpIHtcbiAgaWYgKHR5cGVvZiB1cmwgPT09ICdzdHJpbmcnKSB7XG4gICAgcmV0dXJuIHVybC5zdGFydHNXaXRoKCdodHRwczonKVxuICB9XG5cbiAgcmV0dXJuIHVybC5wcm90b2NvbCA9PT0gJ2h0dHBzOidcbn1cblxuLyoqXG4gKiBAc2VlIGh0dHBzOi8vZmV0Y2guc3BlYy53aGF0d2cub3JnLyNodHRwLXNjaGVtZVxuICogQHBhcmFtIHtVUkx9IHVybFxuICovXG5mdW5jdGlvbiB1cmxJc0h0dHBIdHRwc1NjaGVtZSAodXJsKSB7XG4gIGFzc2VydCgncHJvdG9jb2wnIGluIHVybCkgLy8gZW5zdXJlIGl0J3MgYSB1cmwgb2JqZWN0XG5cbiAgY29uc3QgcHJvdG9jb2wgPSB1cmwucHJvdG9jb2xcblxuICByZXR1cm4gcHJvdG9jb2wgPT09ICdodHRwOicgfHwgcHJvdG9jb2wgPT09ICdodHRwczonXG59XG5cbi8qKlxuICogRmV0Y2ggc3VwcG9ydHMgbm9kZSA+PSAxNi44LjAsIGJ1dCBPYmplY3QuaGFzT3duIHdhcyBhZGRlZCBpbiB2MTYuOS4wLlxuICovXG5jb25zdCBoYXNPd24gPSBPYmplY3QuaGFzT3duIHx8ICgoZGljdCwga2V5KSA9PiBPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwoZGljdCwga2V5KSlcblxubW9kdWxlLmV4cG9ydHMgPSB7XG4gIGlzQWJvcnRlZCxcbiAgaXNDYW5jZWxsZWQsXG4gIGNyZWF0ZURlZmVycmVkUHJvbWlzZSxcbiAgUmVhZGFibGVTdHJlYW1Gcm9tLFxuICB0b1VTVlN0cmluZyxcbiAgdHJ5VXBncmFkZVJlcXVlc3RUb0FQb3RlbnRpYWxseVRydXN0d29ydGh5VVJMLFxuICBjb2Fyc2VuZWRTaGFyZWRDdXJyZW50VGltZSxcbiAgZGV0ZXJtaW5lUmVxdWVzdHNSZWZlcnJlcixcbiAgbWFrZVBvbGljeUNvbnRhaW5lcixcbiAgY2xvbmVQb2xpY3lDb250YWluZXIsXG4gIGFwcGVuZEZldGNoTWV0YWRhdGEsXG4gIGFwcGVuZFJlcXVlc3RPcmlnaW5IZWFkZXIsXG4gIFRBT0NoZWNrLFxuICBjb3JzQ2hlY2ssXG4gIGNyb3NzT3JpZ2luUmVzb3VyY2VQb2xpY3lDaGVjayxcbiAgY3JlYXRlT3BhcXVlVGltaW5nSW5mbyxcbiAgc2V0UmVxdWVzdFJlZmVycmVyUG9saWN5T25SZWRpcmVjdCxcbiAgaXNWYWxpZEhUVFBUb2tlbixcbiAgcmVxdWVzdEJhZFBvcnQsXG4gIHJlcXVlc3RDdXJyZW50VVJMLFxuICByZXNwb25zZVVSTCxcbiAgcmVzcG9uc2VMb2NhdGlvblVSTCxcbiAgaXNCbG9iTGlrZSxcbiAgaXNVUkxQb3RlbnRpYWxseVRydXN0d29ydGh5LFxuICBpc1ZhbGlkUmVhc29uUGhyYXNlLFxuICBzYW1lT3JpZ2luLFxuICBub3JtYWxpemVNZXRob2QsXG4gIHNlcmlhbGl6ZUphdmFzY3JpcHRWYWx1ZVRvSlNPTlN0cmluZyxcbiAgbWFrZUl0ZXJhdG9yLFxuICBpc1ZhbGlkSGVhZGVyTmFtZSxcbiAgaXNWYWxpZEhlYWRlclZhbHVlLFxuICBoYXNPd24sXG4gIGlzRXJyb3JMaWtlLFxuICBmdWxseVJlYWRCb2R5LFxuICBieXRlc01hdGNoLFxuICBpc1JlYWRhYmxlU3RyZWFtTGlrZSxcbiAgcmVhZGFibGVTdHJlYW1DbG9zZSxcbiAgaXNvbW9ycGhpY0VuY29kZSxcbiAgaXNvbW9ycGhpY0RlY29kZSxcbiAgdXJsSXNMb2NhbCxcbiAgdXJsSGFzSHR0cHNTY2hlbWUsXG4gIHVybElzSHR0cEh0dHBzU2NoZW1lLFxuICByZWFkQWxsQnl0ZXMsXG4gIG5vcm1hbGl6ZU1ldGhvZFJlY29yZCxcbiAgcGFyc2VNZXRhZGF0YVxufVxuIiwKICAgICIndXNlIHN0cmljdCdcblxubW9kdWxlLmV4cG9ydHMgPSB7XG4gIGtVcmw6IFN5bWJvbCgndXJsJyksXG4gIGtIZWFkZXJzOiBTeW1ib2woJ2hlYWRlcnMnKSxcbiAga1NpZ25hbDogU3ltYm9sKCdzaWduYWwnKSxcbiAga1N0YXRlOiBTeW1ib2woJ3N0YXRlJyksXG4gIGtHdWFyZDogU3ltYm9sKCdndWFyZCcpLFxuICBrUmVhbG06IFN5bWJvbCgncmVhbG0nKVxufVxuIiwKICAgICIndXNlIHN0cmljdCdcblxuY29uc3QgeyB0eXBlcyB9ID0gcmVxdWlyZSgndXRpbCcpXG5jb25zdCB7IGhhc093biwgdG9VU1ZTdHJpbmcgfSA9IHJlcXVpcmUoJy4vdXRpbCcpXG5cbi8qKiBAdHlwZSB7aW1wb3J0KCcuLi8uLi90eXBlcy93ZWJpZGwnKS5XZWJpZGx9ICovXG5jb25zdCB3ZWJpZGwgPSB7fVxud2ViaWRsLmNvbnZlcnRlcnMgPSB7fVxud2ViaWRsLnV0aWwgPSB7fVxud2ViaWRsLmVycm9ycyA9IHt9XG5cbndlYmlkbC5lcnJvcnMuZXhjZXB0aW9uID0gZnVuY3Rpb24gKG1lc3NhZ2UpIHtcbiAgcmV0dXJuIG5ldyBUeXBlRXJyb3IoYCR7bWVzc2FnZS5oZWFkZXJ9OiAke21lc3NhZ2UubWVzc2FnZX1gKVxufVxuXG53ZWJpZGwuZXJyb3JzLmNvbnZlcnNpb25GYWlsZWQgPSBmdW5jdGlvbiAoY29udGV4dCkge1xuICBjb25zdCBwbHVyYWwgPSBjb250ZXh0LnR5cGVzLmxlbmd0aCA9PT0gMSA/ICcnIDogJyBvbmUgb2YnXG4gIGNvbnN0IG1lc3NhZ2UgPVxuICAgIGAke2NvbnRleHQuYXJndW1lbnR9IGNvdWxkIG5vdCBiZSBjb252ZXJ0ZWQgdG9gICtcbiAgICBgJHtwbHVyYWx9OiAke2NvbnRleHQudHlwZXMuam9pbignLCAnKX0uYFxuXG4gIHJldHVybiB3ZWJpZGwuZXJyb3JzLmV4Y2VwdGlvbih7XG4gICAgaGVhZGVyOiBjb250ZXh0LnByZWZpeCxcbiAgICBtZXNzYWdlXG4gIH0pXG59XG5cbndlYmlkbC5lcnJvcnMuaW52YWxpZEFyZ3VtZW50ID0gZnVuY3Rpb24gKGNvbnRleHQpIHtcbiAgcmV0dXJuIHdlYmlkbC5lcnJvcnMuZXhjZXB0aW9uKHtcbiAgICBoZWFkZXI6IGNvbnRleHQucHJlZml4LFxuICAgIG1lc3NhZ2U6IGBcIiR7Y29udGV4dC52YWx1ZX1cIiBpcyBhbiBpbnZhbGlkICR7Y29udGV4dC50eXBlfS5gXG4gIH0pXG59XG5cbi8vIGh0dHBzOi8vd2ViaWRsLnNwZWMud2hhdHdnLm9yZy8jaW1wbGVtZW50c1xud2ViaWRsLmJyYW5kQ2hlY2sgPSBmdW5jdGlvbiAoViwgSSwgb3B0cyA9IHVuZGVmaW5lZCkge1xuICBpZiAob3B0cz8uc3RyaWN0ICE9PSBmYWxzZSAmJiAhKFYgaW5zdGFuY2VvZiBJKSkge1xuICAgIHRocm93IG5ldyBUeXBlRXJyb3IoJ0lsbGVnYWwgaW52b2NhdGlvbicpXG4gIH0gZWxzZSB7XG4gICAgcmV0dXJuIFY/LltTeW1ib2wudG9TdHJpbmdUYWddID09PSBJLnByb3RvdHlwZVtTeW1ib2wudG9TdHJpbmdUYWddXG4gIH1cbn1cblxud2ViaWRsLmFyZ3VtZW50TGVuZ3RoQ2hlY2sgPSBmdW5jdGlvbiAoeyBsZW5ndGggfSwgbWluLCBjdHgpIHtcbiAgaWYgKGxlbmd0aCA8IG1pbikge1xuICAgIHRocm93IHdlYmlkbC5lcnJvcnMuZXhjZXB0aW9uKHtcbiAgICAgIG1lc3NhZ2U6IGAke21pbn0gYXJndW1lbnQke21pbiAhPT0gMSA/ICdzJyA6ICcnfSByZXF1aXJlZCwgYCArXG4gICAgICAgICAgICAgICBgYnV0JHtsZW5ndGggPyAnIG9ubHknIDogJyd9ICR7bGVuZ3RofSBmb3VuZC5gLFxuICAgICAgLi4uY3R4XG4gICAgfSlcbiAgfVxufVxuXG53ZWJpZGwuaWxsZWdhbENvbnN0cnVjdG9yID0gZnVuY3Rpb24gKCkge1xuICB0aHJvdyB3ZWJpZGwuZXJyb3JzLmV4Y2VwdGlvbih7XG4gICAgaGVhZGVyOiAnVHlwZUVycm9yJyxcbiAgICBtZXNzYWdlOiAnSWxsZWdhbCBjb25zdHJ1Y3RvcidcbiAgfSlcbn1cblxuLy8gaHR0cHM6Ly90YzM5LmVzL2VjbWEyNjIvI3NlYy1lY21hc2NyaXB0LWRhdGEtdHlwZXMtYW5kLXZhbHVlc1xud2ViaWRsLnV0aWwuVHlwZSA9IGZ1bmN0aW9uIChWKSB7XG4gIHN3aXRjaCAodHlwZW9mIFYpIHtcbiAgICBjYXNlICd1bmRlZmluZWQnOiByZXR1cm4gJ1VuZGVmaW5lZCdcbiAgICBjYXNlICdib29sZWFuJzogcmV0dXJuICdCb29sZWFuJ1xuICAgIGNhc2UgJ3N0cmluZyc6IHJldHVybiAnU3RyaW5nJ1xuICAgIGNhc2UgJ3N5bWJvbCc6IHJldHVybiAnU3ltYm9sJ1xuICAgIGNhc2UgJ251bWJlcic6IHJldHVybiAnTnVtYmVyJ1xuICAgIGNhc2UgJ2JpZ2ludCc6IHJldHVybiAnQmlnSW50J1xuICAgIGNhc2UgJ2Z1bmN0aW9uJzpcbiAgICBjYXNlICdvYmplY3QnOiB7XG4gICAgICBpZiAoViA9PT0gbnVsbCkge1xuICAgICAgICByZXR1cm4gJ051bGwnXG4gICAgICB9XG5cbiAgICAgIHJldHVybiAnT2JqZWN0J1xuICAgIH1cbiAgfVxufVxuXG4vLyBodHRwczovL3dlYmlkbC5zcGVjLndoYXR3Zy5vcmcvI2Fic3RyYWN0LW9wZGVmLWNvbnZlcnR0b2ludFxud2ViaWRsLnV0aWwuQ29udmVydFRvSW50ID0gZnVuY3Rpb24gKFYsIGJpdExlbmd0aCwgc2lnbmVkbmVzcywgb3B0cyA9IHt9KSB7XG4gIGxldCB1cHBlckJvdW5kXG4gIGxldCBsb3dlckJvdW5kXG5cbiAgLy8gMS4gSWYgYml0TGVuZ3RoIGlzIDY0LCB0aGVuOlxuICBpZiAoYml0TGVuZ3RoID09PSA2NCkge1xuICAgIC8vIDEuIExldCB1cHBlckJvdW5kIGJlIDJeNTMg4oiSIDEuXG4gICAgdXBwZXJCb3VuZCA9IE1hdGgucG93KDIsIDUzKSAtIDFcblxuICAgIC8vIDIuIElmIHNpZ25lZG5lc3MgaXMgXCJ1bnNpZ25lZFwiLCB0aGVuIGxldCBsb3dlckJvdW5kIGJlIDAuXG4gICAgaWYgKHNpZ25lZG5lc3MgPT09ICd1bnNpZ25lZCcpIHtcbiAgICAgIGxvd2VyQm91bmQgPSAwXG4gICAgfSBlbHNlIHtcbiAgICAgIC8vIDMuIE90aGVyd2lzZSBsZXQgbG93ZXJCb3VuZCBiZSDiiJIyXjUzICsgMS5cbiAgICAgIGxvd2VyQm91bmQgPSBNYXRoLnBvdygtMiwgNTMpICsgMVxuICAgIH1cbiAgfSBlbHNlIGlmIChzaWduZWRuZXNzID09PSAndW5zaWduZWQnKSB7XG4gICAgLy8gMi4gT3RoZXJ3aXNlLCBpZiBzaWduZWRuZXNzIGlzIFwidW5zaWduZWRcIiwgdGhlbjpcblxuICAgIC8vIDEuIExldCBsb3dlckJvdW5kIGJlIDAuXG4gICAgbG93ZXJCb3VuZCA9IDBcblxuICAgIC8vIDIuIExldCB1cHBlckJvdW5kIGJlIDJeYml0TGVuZ3RoIOKIkiAxLlxuICAgIHVwcGVyQm91bmQgPSBNYXRoLnBvdygyLCBiaXRMZW5ndGgpIC0gMVxuICB9IGVsc2Uge1xuICAgIC8vIDMuIE90aGVyd2lzZTpcblxuICAgIC8vIDEuIExldCBsb3dlckJvdW5kIGJlIC0yXmJpdExlbmd0aCDiiJIgMS5cbiAgICBsb3dlckJvdW5kID0gTWF0aC5wb3coLTIsIGJpdExlbmd0aCkgLSAxXG5cbiAgICAvLyAyLiBMZXQgdXBwZXJCb3VuZCBiZSAyXmJpdExlbmd0aCDiiJIgMSDiiJIgMS5cbiAgICB1cHBlckJvdW5kID0gTWF0aC5wb3coMiwgYml0TGVuZ3RoIC0gMSkgLSAxXG4gIH1cblxuICAvLyA0LiBMZXQgeCBiZSA/IFRvTnVtYmVyKFYpLlxuICBsZXQgeCA9IE51bWJlcihWKVxuXG4gIC8vIDUuIElmIHggaXMg4oiSMCwgdGhlbiBzZXQgeCB0byArMC5cbiAgaWYgKHggPT09IDApIHtcbiAgICB4ID0gMFxuICB9XG5cbiAgLy8gNi4gSWYgdGhlIGNvbnZlcnNpb24gaXMgdG8gYW4gSURMIHR5cGUgYXNzb2NpYXRlZFxuICAvLyAgICB3aXRoIHRoZSBbRW5mb3JjZVJhbmdlXSBleHRlbmRlZCBhdHRyaWJ1dGUsIHRoZW46XG4gIGlmIChvcHRzLmVuZm9yY2VSYW5nZSA9PT0gdHJ1ZSkge1xuICAgIC8vIDEuIElmIHggaXMgTmFOLCAr4oieLCBvciDiiJLiiJ4sIHRoZW4gdGhyb3cgYSBUeXBlRXJyb3IuXG4gICAgaWYgKFxuICAgICAgTnVtYmVyLmlzTmFOKHgpIHx8XG4gICAgICB4ID09PSBOdW1iZXIuUE9TSVRJVkVfSU5GSU5JVFkgfHxcbiAgICAgIHggPT09IE51bWJlci5ORUdBVElWRV9JTkZJTklUWVxuICAgICkge1xuICAgICAgdGhyb3cgd2ViaWRsLmVycm9ycy5leGNlcHRpb24oe1xuICAgICAgICBoZWFkZXI6ICdJbnRlZ2VyIGNvbnZlcnNpb24nLFxuICAgICAgICBtZXNzYWdlOiBgQ291bGQgbm90IGNvbnZlcnQgJHtWfSB0byBhbiBpbnRlZ2VyLmBcbiAgICAgIH0pXG4gICAgfVxuXG4gICAgLy8gMi4gU2V0IHggdG8gSW50ZWdlclBhcnQoeCkuXG4gICAgeCA9IHdlYmlkbC51dGlsLkludGVnZXJQYXJ0KHgpXG5cbiAgICAvLyAzLiBJZiB4IDwgbG93ZXJCb3VuZCBvciB4ID4gdXBwZXJCb3VuZCwgdGhlblxuICAgIC8vICAgIHRocm93IGEgVHlwZUVycm9yLlxuICAgIGlmICh4IDwgbG93ZXJCb3VuZCB8fCB4ID4gdXBwZXJCb3VuZCkge1xuICAgICAgdGhyb3cgd2ViaWRsLmVycm9ycy5leGNlcHRpb24oe1xuICAgICAgICBoZWFkZXI6ICdJbnRlZ2VyIGNvbnZlcnNpb24nLFxuICAgICAgICBtZXNzYWdlOiBgVmFsdWUgbXVzdCBiZSBiZXR3ZWVuICR7bG93ZXJCb3VuZH0tJHt1cHBlckJvdW5kfSwgZ290ICR7eH0uYFxuICAgICAgfSlcbiAgICB9XG5cbiAgICAvLyA0LiBSZXR1cm4geC5cbiAgICByZXR1cm4geFxuICB9XG5cbiAgLy8gNy4gSWYgeCBpcyBub3QgTmFOIGFuZCB0aGUgY29udmVyc2lvbiBpcyB0byBhbiBJRExcbiAgLy8gICAgdHlwZSBhc3NvY2lhdGVkIHdpdGggdGhlIFtDbGFtcF0gZXh0ZW5kZWRcbiAgLy8gICAgYXR0cmlidXRlLCB0aGVuOlxuICBpZiAoIU51bWJlci5pc05hTih4KSAmJiBvcHRzLmNsYW1wID09PSB0cnVlKSB7XG4gICAgLy8gMS4gU2V0IHggdG8gbWluKG1heCh4LCBsb3dlckJvdW5kKSwgdXBwZXJCb3VuZCkuXG4gICAgeCA9IE1hdGgubWluKE1hdGgubWF4KHgsIGxvd2VyQm91bmQpLCB1cHBlckJvdW5kKVxuXG4gICAgLy8gMi4gUm91bmQgeCB0byB0aGUgbmVhcmVzdCBpbnRlZ2VyLCBjaG9vc2luZyB0aGVcbiAgICAvLyAgICBldmVuIGludGVnZXIgaWYgaXQgbGllcyBoYWxmd2F5IGJldHdlZW4gdHdvLFxuICAgIC8vICAgIGFuZCBjaG9vc2luZyArMCByYXRoZXIgdGhhbiDiiJIwLlxuICAgIGlmIChNYXRoLmZsb29yKHgpICUgMiA9PT0gMCkge1xuICAgICAgeCA9IE1hdGguZmxvb3IoeClcbiAgICB9IGVsc2Uge1xuICAgICAgeCA9IE1hdGguY2VpbCh4KVxuICAgIH1cblxuICAgIC8vIDMuIFJldHVybiB4LlxuICAgIHJldHVybiB4XG4gIH1cblxuICAvLyA4LiBJZiB4IGlzIE5hTiwgKzAsICviiJ4sIG9yIOKIkuKIniwgdGhlbiByZXR1cm4gKzAuXG4gIGlmIChcbiAgICBOdW1iZXIuaXNOYU4oeCkgfHxcbiAgICAoeCA9PT0gMCAmJiBPYmplY3QuaXMoMCwgeCkpIHx8XG4gICAgeCA9PT0gTnVtYmVyLlBPU0lUSVZFX0lORklOSVRZIHx8XG4gICAgeCA9PT0gTnVtYmVyLk5FR0FUSVZFX0lORklOSVRZXG4gICkge1xuICAgIHJldHVybiAwXG4gIH1cblxuICAvLyA5LiBTZXQgeCB0byBJbnRlZ2VyUGFydCh4KS5cbiAgeCA9IHdlYmlkbC51dGlsLkludGVnZXJQYXJ0KHgpXG5cbiAgLy8gMTAuIFNldCB4IHRvIHggbW9kdWxvIDJeYml0TGVuZ3RoLlxuICB4ID0geCAlIE1hdGgucG93KDIsIGJpdExlbmd0aClcblxuICAvLyAxMS4gSWYgc2lnbmVkbmVzcyBpcyBcInNpZ25lZFwiIGFuZCB4IOKJpSAyXmJpdExlbmd0aCDiiJIgMSxcbiAgLy8gICAgdGhlbiByZXR1cm4geCDiiJIgMl5iaXRMZW5ndGguXG4gIGlmIChzaWduZWRuZXNzID09PSAnc2lnbmVkJyAmJiB4ID49IE1hdGgucG93KDIsIGJpdExlbmd0aCkgLSAxKSB7XG4gICAgcmV0dXJuIHggLSBNYXRoLnBvdygyLCBiaXRMZW5ndGgpXG4gIH1cblxuICAvLyAxMi4gT3RoZXJ3aXNlLCByZXR1cm4geC5cbiAgcmV0dXJuIHhcbn1cblxuLy8gaHR0cHM6Ly93ZWJpZGwuc3BlYy53aGF0d2cub3JnLyNhYnN0cmFjdC1vcGRlZi1pbnRlZ2VycGFydFxud2ViaWRsLnV0aWwuSW50ZWdlclBhcnQgPSBmdW5jdGlvbiAobikge1xuICAvLyAxLiBMZXQgciBiZSBmbG9vcihhYnMobikpLlxuICBjb25zdCByID0gTWF0aC5mbG9vcihNYXRoLmFicyhuKSlcblxuICAvLyAyLiBJZiBuIDwgMCwgdGhlbiByZXR1cm4gLTEgw5cgci5cbiAgaWYgKG4gPCAwKSB7XG4gICAgcmV0dXJuIC0xICogclxuICB9XG5cbiAgLy8gMy4gT3RoZXJ3aXNlLCByZXR1cm4gci5cbiAgcmV0dXJuIHJcbn1cblxuLy8gaHR0cHM6Ly93ZWJpZGwuc3BlYy53aGF0d2cub3JnLyNlcy1zZXF1ZW5jZVxud2ViaWRsLnNlcXVlbmNlQ29udmVydGVyID0gZnVuY3Rpb24gKGNvbnZlcnRlcikge1xuICByZXR1cm4gKFYpID0+IHtcbiAgICAvLyAxLiBJZiBUeXBlKFYpIGlzIG5vdCBPYmplY3QsIHRocm93IGEgVHlwZUVycm9yLlxuICAgIGlmICh3ZWJpZGwudXRpbC5UeXBlKFYpICE9PSAnT2JqZWN0Jykge1xuICAgICAgdGhyb3cgd2ViaWRsLmVycm9ycy5leGNlcHRpb24oe1xuICAgICAgICBoZWFkZXI6ICdTZXF1ZW5jZScsXG4gICAgICAgIG1lc3NhZ2U6IGBWYWx1ZSBvZiB0eXBlICR7d2ViaWRsLnV0aWwuVHlwZShWKX0gaXMgbm90IGFuIE9iamVjdC5gXG4gICAgICB9KVxuICAgIH1cblxuICAgIC8vIDIuIExldCBtZXRob2QgYmUgPyBHZXRNZXRob2QoViwgQEBpdGVyYXRvcikuXG4gICAgLyoqIEB0eXBlIHtHZW5lcmF0b3J9ICovXG4gICAgY29uc3QgbWV0aG9kID0gVj8uW1N5bWJvbC5pdGVyYXRvcl0/LigpXG4gICAgY29uc3Qgc2VxID0gW11cblxuICAgIC8vIDMuIElmIG1ldGhvZCBpcyB1bmRlZmluZWQsIHRocm93IGEgVHlwZUVycm9yLlxuICAgIGlmIChcbiAgICAgIG1ldGhvZCA9PT0gdW5kZWZpbmVkIHx8XG4gICAgICB0eXBlb2YgbWV0aG9kLm5leHQgIT09ICdmdW5jdGlvbidcbiAgICApIHtcbiAgICAgIHRocm93IHdlYmlkbC5lcnJvcnMuZXhjZXB0aW9uKHtcbiAgICAgICAgaGVhZGVyOiAnU2VxdWVuY2UnLFxuICAgICAgICBtZXNzYWdlOiAnT2JqZWN0IGlzIG5vdCBhbiBpdGVyYXRvci4nXG4gICAgICB9KVxuICAgIH1cblxuICAgIC8vIGh0dHBzOi8vd2ViaWRsLnNwZWMud2hhdHdnLm9yZy8jY3JlYXRlLXNlcXVlbmNlLWZyb20taXRlcmFibGVcbiAgICB3aGlsZSAodHJ1ZSkge1xuICAgICAgY29uc3QgeyBkb25lLCB2YWx1ZSB9ID0gbWV0aG9kLm5leHQoKVxuXG4gICAgICBpZiAoZG9uZSkge1xuICAgICAgICBicmVha1xuICAgICAgfVxuXG4gICAgICBzZXEucHVzaChjb252ZXJ0ZXIodmFsdWUpKVxuICAgIH1cblxuICAgIHJldHVybiBzZXFcbiAgfVxufVxuXG4vLyBodHRwczovL3dlYmlkbC5zcGVjLndoYXR3Zy5vcmcvI2VzLXRvLXJlY29yZFxud2ViaWRsLnJlY29yZENvbnZlcnRlciA9IGZ1bmN0aW9uIChrZXlDb252ZXJ0ZXIsIHZhbHVlQ29udmVydGVyKSB7XG4gIHJldHVybiAoTykgPT4ge1xuICAgIC8vIDEuIElmIFR5cGUoTykgaXMgbm90IE9iamVjdCwgdGhyb3cgYSBUeXBlRXJyb3IuXG4gICAgaWYgKHdlYmlkbC51dGlsLlR5cGUoTykgIT09ICdPYmplY3QnKSB7XG4gICAgICB0aHJvdyB3ZWJpZGwuZXJyb3JzLmV4Y2VwdGlvbih7XG4gICAgICAgIGhlYWRlcjogJ1JlY29yZCcsXG4gICAgICAgIG1lc3NhZ2U6IGBWYWx1ZSBvZiB0eXBlICR7d2ViaWRsLnV0aWwuVHlwZShPKX0gaXMgbm90IGFuIE9iamVjdC5gXG4gICAgICB9KVxuICAgIH1cblxuICAgIC8vIDIuIExldCByZXN1bHQgYmUgYSBuZXcgZW1wdHkgaW5zdGFuY2Ugb2YgcmVjb3JkPEssIFY+LlxuICAgIGNvbnN0IHJlc3VsdCA9IHt9XG5cbiAgICBpZiAoIXR5cGVzLmlzUHJveHkoTykpIHtcbiAgICAgIC8vIE9iamVjdC5rZXlzIG9ubHkgcmV0dXJucyBlbnVtZXJhYmxlIHByb3BlcnRpZXNcbiAgICAgIGNvbnN0IGtleXMgPSBPYmplY3Qua2V5cyhPKVxuXG4gICAgICBmb3IgKGNvbnN0IGtleSBvZiBrZXlzKSB7XG4gICAgICAgIC8vIDEuIExldCB0eXBlZEtleSBiZSBrZXkgY29udmVydGVkIHRvIGFuIElETCB2YWx1ZSBvZiB0eXBlIEsuXG4gICAgICAgIGNvbnN0IHR5cGVkS2V5ID0ga2V5Q29udmVydGVyKGtleSlcblxuICAgICAgICAvLyAyLiBMZXQgdmFsdWUgYmUgPyBHZXQoTywga2V5KS5cbiAgICAgICAgLy8gMy4gTGV0IHR5cGVkVmFsdWUgYmUgdmFsdWUgY29udmVydGVkIHRvIGFuIElETCB2YWx1ZSBvZiB0eXBlIFYuXG4gICAgICAgIGNvbnN0IHR5cGVkVmFsdWUgPSB2YWx1ZUNvbnZlcnRlcihPW2tleV0pXG5cbiAgICAgICAgLy8gNC4gU2V0IHJlc3VsdFt0eXBlZEtleV0gdG8gdHlwZWRWYWx1ZS5cbiAgICAgICAgcmVzdWx0W3R5cGVkS2V5XSA9IHR5cGVkVmFsdWVcbiAgICAgIH1cblxuICAgICAgLy8gNS4gUmV0dXJuIHJlc3VsdC5cbiAgICAgIHJldHVybiByZXN1bHRcbiAgICB9XG5cbiAgICAvLyAzLiBMZXQga2V5cyBiZSA/IE8uW1tPd25Qcm9wZXJ0eUtleXNdXSgpLlxuICAgIGNvbnN0IGtleXMgPSBSZWZsZWN0Lm93bktleXMoTylcblxuICAgIC8vIDQuIEZvciBlYWNoIGtleSBvZiBrZXlzLlxuICAgIGZvciAoY29uc3Qga2V5IG9mIGtleXMpIHtcbiAgICAgIC8vIDEuIExldCBkZXNjIGJlID8gTy5bW0dldE93blByb3BlcnR5XV0oa2V5KS5cbiAgICAgIGNvbnN0IGRlc2MgPSBSZWZsZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcihPLCBrZXkpXG5cbiAgICAgIC8vIDIuIElmIGRlc2MgaXMgbm90IHVuZGVmaW5lZCBhbmQgZGVzYy5bW0VudW1lcmFibGVdXSBpcyB0cnVlOlxuICAgICAgaWYgKGRlc2M/LmVudW1lcmFibGUpIHtcbiAgICAgICAgLy8gMS4gTGV0IHR5cGVkS2V5IGJlIGtleSBjb252ZXJ0ZWQgdG8gYW4gSURMIHZhbHVlIG9mIHR5cGUgSy5cbiAgICAgICAgY29uc3QgdHlwZWRLZXkgPSBrZXlDb252ZXJ0ZXIoa2V5KVxuXG4gICAgICAgIC8vIDIuIExldCB2YWx1ZSBiZSA/IEdldChPLCBrZXkpLlxuICAgICAgICAvLyAzLiBMZXQgdHlwZWRWYWx1ZSBiZSB2YWx1ZSBjb252ZXJ0ZWQgdG8gYW4gSURMIHZhbHVlIG9mIHR5cGUgVi5cbiAgICAgICAgY29uc3QgdHlwZWRWYWx1ZSA9IHZhbHVlQ29udmVydGVyKE9ba2V5XSlcblxuICAgICAgICAvLyA0LiBTZXQgcmVzdWx0W3R5cGVkS2V5XSB0byB0eXBlZFZhbHVlLlxuICAgICAgICByZXN1bHRbdHlwZWRLZXldID0gdHlwZWRWYWx1ZVxuICAgICAgfVxuICAgIH1cblxuICAgIC8vIDUuIFJldHVybiByZXN1bHQuXG4gICAgcmV0dXJuIHJlc3VsdFxuICB9XG59XG5cbndlYmlkbC5pbnRlcmZhY2VDb252ZXJ0ZXIgPSBmdW5jdGlvbiAoaSkge1xuICByZXR1cm4gKFYsIG9wdHMgPSB7fSkgPT4ge1xuICAgIGlmIChvcHRzLnN0cmljdCAhPT0gZmFsc2UgJiYgIShWIGluc3RhbmNlb2YgaSkpIHtcbiAgICAgIHRocm93IHdlYmlkbC5lcnJvcnMuZXhjZXB0aW9uKHtcbiAgICAgICAgaGVhZGVyOiBpLm5hbWUsXG4gICAgICAgIG1lc3NhZ2U6IGBFeHBlY3RlZCAke1Z9IHRvIGJlIGFuIGluc3RhbmNlIG9mICR7aS5uYW1lfS5gXG4gICAgICB9KVxuICAgIH1cblxuICAgIHJldHVybiBWXG4gIH1cbn1cblxud2ViaWRsLmRpY3Rpb25hcnlDb252ZXJ0ZXIgPSBmdW5jdGlvbiAoY29udmVydGVycykge1xuICByZXR1cm4gKGRpY3Rpb25hcnkpID0+IHtcbiAgICBjb25zdCB0eXBlID0gd2ViaWRsLnV0aWwuVHlwZShkaWN0aW9uYXJ5KVxuICAgIGNvbnN0IGRpY3QgPSB7fVxuXG4gICAgaWYgKHR5cGUgPT09ICdOdWxsJyB8fCB0eXBlID09PSAnVW5kZWZpbmVkJykge1xuICAgICAgcmV0dXJuIGRpY3RcbiAgICB9IGVsc2UgaWYgKHR5cGUgIT09ICdPYmplY3QnKSB7XG4gICAgICB0aHJvdyB3ZWJpZGwuZXJyb3JzLmV4Y2VwdGlvbih7XG4gICAgICAgIGhlYWRlcjogJ0RpY3Rpb25hcnknLFxuICAgICAgICBtZXNzYWdlOiBgRXhwZWN0ZWQgJHtkaWN0aW9uYXJ5fSB0byBiZSBvbmUgb2Y6IE51bGwsIFVuZGVmaW5lZCwgT2JqZWN0LmBcbiAgICAgIH0pXG4gICAgfVxuXG4gICAgZm9yIChjb25zdCBvcHRpb25zIG9mIGNvbnZlcnRlcnMpIHtcbiAgICAgIGNvbnN0IHsga2V5LCBkZWZhdWx0VmFsdWUsIHJlcXVpcmVkLCBjb252ZXJ0ZXIgfSA9IG9wdGlvbnNcblxuICAgICAgaWYgKHJlcXVpcmVkID09PSB0cnVlKSB7XG4gICAgICAgIGlmICghaGFzT3duKGRpY3Rpb25hcnksIGtleSkpIHtcbiAgICAgICAgICB0aHJvdyB3ZWJpZGwuZXJyb3JzLmV4Y2VwdGlvbih7XG4gICAgICAgICAgICBoZWFkZXI6ICdEaWN0aW9uYXJ5JyxcbiAgICAgICAgICAgIG1lc3NhZ2U6IGBNaXNzaW5nIHJlcXVpcmVkIGtleSBcIiR7a2V5fVwiLmBcbiAgICAgICAgICB9KVxuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIGxldCB2YWx1ZSA9IGRpY3Rpb25hcnlba2V5XVxuICAgICAgY29uc3QgaGFzRGVmYXVsdCA9IGhhc093bihvcHRpb25zLCAnZGVmYXVsdFZhbHVlJylcblxuICAgICAgLy8gT25seSB1c2UgZGVmYXVsdFZhbHVlIGlmIHZhbHVlIGlzIHVuZGVmaW5lZCBhbmRcbiAgICAgIC8vIGEgZGVmYXVsdFZhbHVlIG9wdGlvbnMgd2FzIHByb3ZpZGVkLlxuICAgICAgaWYgKGhhc0RlZmF1bHQgJiYgdmFsdWUgIT09IG51bGwpIHtcbiAgICAgICAgdmFsdWUgPSB2YWx1ZSA/PyBkZWZhdWx0VmFsdWVcbiAgICAgIH1cblxuICAgICAgLy8gQSBrZXkgY2FuIGJlIG9wdGlvbmFsIGFuZCBoYXZlIG5vIGRlZmF1bHQgdmFsdWUuXG4gICAgICAvLyBXaGVuIHRoaXMgaGFwcGVucywgZG8gbm90IHBlcmZvcm0gYSBjb252ZXJzaW9uLFxuICAgICAgLy8gYW5kIGRvIG5vdCBhc3NpZ24gdGhlIGtleSBhIHZhbHVlLlxuICAgICAgaWYgKHJlcXVpcmVkIHx8IGhhc0RlZmF1bHQgfHwgdmFsdWUgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICB2YWx1ZSA9IGNvbnZlcnRlcih2YWx1ZSlcblxuICAgICAgICBpZiAoXG4gICAgICAgICAgb3B0aW9ucy5hbGxvd2VkVmFsdWVzICYmXG4gICAgICAgICAgIW9wdGlvbnMuYWxsb3dlZFZhbHVlcy5pbmNsdWRlcyh2YWx1ZSlcbiAgICAgICAgKSB7XG4gICAgICAgICAgdGhyb3cgd2ViaWRsLmVycm9ycy5leGNlcHRpb24oe1xuICAgICAgICAgICAgaGVhZGVyOiAnRGljdGlvbmFyeScsXG4gICAgICAgICAgICBtZXNzYWdlOiBgJHt2YWx1ZX0gaXMgbm90IGFuIGFjY2VwdGVkIHR5cGUuIEV4cGVjdGVkIG9uZSBvZiAke29wdGlvbnMuYWxsb3dlZFZhbHVlcy5qb2luKCcsICcpfS5gXG4gICAgICAgICAgfSlcbiAgICAgICAgfVxuXG4gICAgICAgIGRpY3Rba2V5XSA9IHZhbHVlXG4gICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuIGRpY3RcbiAgfVxufVxuXG53ZWJpZGwubnVsbGFibGVDb252ZXJ0ZXIgPSBmdW5jdGlvbiAoY29udmVydGVyKSB7XG4gIHJldHVybiAoVikgPT4ge1xuICAgIGlmIChWID09PSBudWxsKSB7XG4gICAgICByZXR1cm4gVlxuICAgIH1cblxuICAgIHJldHVybiBjb252ZXJ0ZXIoVilcbiAgfVxufVxuXG4vLyBodHRwczovL3dlYmlkbC5zcGVjLndoYXR3Zy5vcmcvI2VzLURPTVN0cmluZ1xud2ViaWRsLmNvbnZlcnRlcnMuRE9NU3RyaW5nID0gZnVuY3Rpb24gKFYsIG9wdHMgPSB7fSkge1xuICAvLyAxLiBJZiBWIGlzIG51bGwgYW5kIHRoZSBjb252ZXJzaW9uIGlzIHRvIGFuIElETCB0eXBlXG4gIC8vICAgIGFzc29jaWF0ZWQgd2l0aCB0aGUgW0xlZ2FjeU51bGxUb0VtcHR5U3RyaW5nXVxuICAvLyAgICBleHRlbmRlZCBhdHRyaWJ1dGUsIHRoZW4gcmV0dXJuIHRoZSBET01TdHJpbmcgdmFsdWVcbiAgLy8gICAgdGhhdCByZXByZXNlbnRzIHRoZSBlbXB0eSBzdHJpbmcuXG4gIGlmIChWID09PSBudWxsICYmIG9wdHMubGVnYWN5TnVsbFRvRW1wdHlTdHJpbmcpIHtcbiAgICByZXR1cm4gJydcbiAgfVxuXG4gIC8vIDIuIExldCB4IGJlID8gVG9TdHJpbmcoVikuXG4gIGlmICh0eXBlb2YgViA9PT0gJ3N5bWJvbCcpIHtcbiAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCdDb3VsZCBub3QgY29udmVydCBhcmd1bWVudCBvZiB0eXBlIHN5bWJvbCB0byBzdHJpbmcuJylcbiAgfVxuXG4gIC8vIDMuIFJldHVybiB0aGUgSURMIERPTVN0cmluZyB2YWx1ZSB0aGF0IHJlcHJlc2VudHMgdGhlXG4gIC8vICAgIHNhbWUgc2VxdWVuY2Ugb2YgY29kZSB1bml0cyBhcyB0aGUgb25lIHRoZVxuICAvLyAgICBFQ01BU2NyaXB0IFN0cmluZyB2YWx1ZSB4IHJlcHJlc2VudHMuXG4gIHJldHVybiBTdHJpbmcoVilcbn1cblxuLy8gaHR0cHM6Ly93ZWJpZGwuc3BlYy53aGF0d2cub3JnLyNlcy1CeXRlU3RyaW5nXG53ZWJpZGwuY29udmVydGVycy5CeXRlU3RyaW5nID0gZnVuY3Rpb24gKFYpIHtcbiAgLy8gMS4gTGV0IHggYmUgPyBUb1N0cmluZyhWKS5cbiAgLy8gTm90ZTogRE9NU3RyaW5nIGNvbnZlcnRlciBwZXJmb3JtID8gVG9TdHJpbmcoVilcbiAgY29uc3QgeCA9IHdlYmlkbC5jb252ZXJ0ZXJzLkRPTVN0cmluZyhWKVxuXG4gIC8vIDIuIElmIHRoZSB2YWx1ZSBvZiBhbnkgZWxlbWVudCBvZiB4IGlzIGdyZWF0ZXIgdGhhblxuICAvLyAgICAyNTUsIHRoZW4gdGhyb3cgYSBUeXBlRXJyb3IuXG4gIGZvciAobGV0IGluZGV4ID0gMDsgaW5kZXggPCB4Lmxlbmd0aDsgaW5kZXgrKykge1xuICAgIGlmICh4LmNoYXJDb2RlQXQoaW5kZXgpID4gMjU1KSB7XG4gICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKFxuICAgICAgICAnQ2Fubm90IGNvbnZlcnQgYXJndW1lbnQgdG8gYSBCeXRlU3RyaW5nIGJlY2F1c2UgdGhlIGNoYXJhY3RlciBhdCAnICtcbiAgICAgICAgYGluZGV4ICR7aW5kZXh9IGhhcyBhIHZhbHVlIG9mICR7eC5jaGFyQ29kZUF0KGluZGV4KX0gd2hpY2ggaXMgZ3JlYXRlciB0aGFuIDI1NS5gXG4gICAgICApXG4gICAgfVxuICB9XG5cbiAgLy8gMy4gUmV0dXJuIGFuIElETCBCeXRlU3RyaW5nIHZhbHVlIHdob3NlIGxlbmd0aCBpcyB0aGVcbiAgLy8gICAgbGVuZ3RoIG9mIHgsIGFuZCB3aGVyZSB0aGUgdmFsdWUgb2YgZWFjaCBlbGVtZW50IGlzXG4gIC8vICAgIHRoZSB2YWx1ZSBvZiB0aGUgY29ycmVzcG9uZGluZyBlbGVtZW50IG9mIHguXG4gIHJldHVybiB4XG59XG5cbi8vIGh0dHBzOi8vd2ViaWRsLnNwZWMud2hhdHdnLm9yZy8jZXMtVVNWU3RyaW5nXG53ZWJpZGwuY29udmVydGVycy5VU1ZTdHJpbmcgPSB0b1VTVlN0cmluZ1xuXG4vLyBodHRwczovL3dlYmlkbC5zcGVjLndoYXR3Zy5vcmcvI2VzLWJvb2xlYW5cbndlYmlkbC5jb252ZXJ0ZXJzLmJvb2xlYW4gPSBmdW5jdGlvbiAoVikge1xuICAvLyAxLiBMZXQgeCBiZSB0aGUgcmVzdWx0IG9mIGNvbXB1dGluZyBUb0Jvb2xlYW4oVikuXG4gIGNvbnN0IHggPSBCb29sZWFuKFYpXG5cbiAgLy8gMi4gUmV0dXJuIHRoZSBJREwgYm9vbGVhbiB2YWx1ZSB0aGF0IGlzIHRoZSBvbmUgdGhhdCByZXByZXNlbnRzXG4gIC8vICAgIHRoZSBzYW1lIHRydXRoIHZhbHVlIGFzIHRoZSBFQ01BU2NyaXB0IEJvb2xlYW4gdmFsdWUgeC5cbiAgcmV0dXJuIHhcbn1cblxuLy8gaHR0cHM6Ly93ZWJpZGwuc3BlYy53aGF0d2cub3JnLyNlcy1hbnlcbndlYmlkbC5jb252ZXJ0ZXJzLmFueSA9IGZ1bmN0aW9uIChWKSB7XG4gIHJldHVybiBWXG59XG5cbi8vIGh0dHBzOi8vd2ViaWRsLnNwZWMud2hhdHdnLm9yZy8jZXMtbG9uZy1sb25nXG53ZWJpZGwuY29udmVydGVyc1snbG9uZyBsb25nJ10gPSBmdW5jdGlvbiAoVikge1xuICAvLyAxLiBMZXQgeCBiZSA/IENvbnZlcnRUb0ludChWLCA2NCwgXCJzaWduZWRcIikuXG4gIGNvbnN0IHggPSB3ZWJpZGwudXRpbC5Db252ZXJ0VG9JbnQoViwgNjQsICdzaWduZWQnKVxuXG4gIC8vIDIuIFJldHVybiB0aGUgSURMIGxvbmcgbG9uZyB2YWx1ZSB0aGF0IHJlcHJlc2VudHNcbiAgLy8gICAgdGhlIHNhbWUgbnVtZXJpYyB2YWx1ZSBhcyB4LlxuICByZXR1cm4geFxufVxuXG4vLyBodHRwczovL3dlYmlkbC5zcGVjLndoYXR3Zy5vcmcvI2VzLXVuc2lnbmVkLWxvbmctbG9uZ1xud2ViaWRsLmNvbnZlcnRlcnNbJ3Vuc2lnbmVkIGxvbmcgbG9uZyddID0gZnVuY3Rpb24gKFYpIHtcbiAgLy8gMS4gTGV0IHggYmUgPyBDb252ZXJ0VG9JbnQoViwgNjQsIFwidW5zaWduZWRcIikuXG4gIGNvbnN0IHggPSB3ZWJpZGwudXRpbC5Db252ZXJ0VG9JbnQoViwgNjQsICd1bnNpZ25lZCcpXG5cbiAgLy8gMi4gUmV0dXJuIHRoZSBJREwgdW5zaWduZWQgbG9uZyBsb25nIHZhbHVlIHRoYXRcbiAgLy8gICAgcmVwcmVzZW50cyB0aGUgc2FtZSBudW1lcmljIHZhbHVlIGFzIHguXG4gIHJldHVybiB4XG59XG5cbi8vIGh0dHBzOi8vd2ViaWRsLnNwZWMud2hhdHdnLm9yZy8jZXMtdW5zaWduZWQtbG9uZ1xud2ViaWRsLmNvbnZlcnRlcnNbJ3Vuc2lnbmVkIGxvbmcnXSA9IGZ1bmN0aW9uIChWKSB7XG4gIC8vIDEuIExldCB4IGJlID8gQ29udmVydFRvSW50KFYsIDMyLCBcInVuc2lnbmVkXCIpLlxuICBjb25zdCB4ID0gd2ViaWRsLnV0aWwuQ29udmVydFRvSW50KFYsIDMyLCAndW5zaWduZWQnKVxuXG4gIC8vIDIuIFJldHVybiB0aGUgSURMIHVuc2lnbmVkIGxvbmcgdmFsdWUgdGhhdFxuICAvLyAgICByZXByZXNlbnRzIHRoZSBzYW1lIG51bWVyaWMgdmFsdWUgYXMgeC5cbiAgcmV0dXJuIHhcbn1cblxuLy8gaHR0cHM6Ly93ZWJpZGwuc3BlYy53aGF0d2cub3JnLyNlcy11bnNpZ25lZC1zaG9ydFxud2ViaWRsLmNvbnZlcnRlcnNbJ3Vuc2lnbmVkIHNob3J0J10gPSBmdW5jdGlvbiAoViwgb3B0cykge1xuICAvLyAxLiBMZXQgeCBiZSA/IENvbnZlcnRUb0ludChWLCAxNiwgXCJ1bnNpZ25lZFwiKS5cbiAgY29uc3QgeCA9IHdlYmlkbC51dGlsLkNvbnZlcnRUb0ludChWLCAxNiwgJ3Vuc2lnbmVkJywgb3B0cylcblxuICAvLyAyLiBSZXR1cm4gdGhlIElETCB1bnNpZ25lZCBzaG9ydCB2YWx1ZSB0aGF0IHJlcHJlc2VudHNcbiAgLy8gICAgdGhlIHNhbWUgbnVtZXJpYyB2YWx1ZSBhcyB4LlxuICByZXR1cm4geFxufVxuXG4vLyBodHRwczovL3dlYmlkbC5zcGVjLndoYXR3Zy5vcmcvI2lkbC1BcnJheUJ1ZmZlclxud2ViaWRsLmNvbnZlcnRlcnMuQXJyYXlCdWZmZXIgPSBmdW5jdGlvbiAoViwgb3B0cyA9IHt9KSB7XG4gIC8vIDEuIElmIFR5cGUoVikgaXMgbm90IE9iamVjdCwgb3IgViBkb2VzIG5vdCBoYXZlIGFuXG4gIC8vICAgIFtbQXJyYXlCdWZmZXJEYXRhXV0gaW50ZXJuYWwgc2xvdCwgdGhlbiB0aHJvdyBhXG4gIC8vICAgIFR5cGVFcnJvci5cbiAgLy8gc2VlOiBodHRwczovL3RjMzkuZXMvZWNtYTI2Mi8jc2VjLXByb3BlcnRpZXMtb2YtdGhlLWFycmF5YnVmZmVyLWluc3RhbmNlc1xuICAvLyBzZWU6IGh0dHBzOi8vdGMzOS5lcy9lY21hMjYyLyNzZWMtcHJvcGVydGllcy1vZi10aGUtc2hhcmVkYXJyYXlidWZmZXItaW5zdGFuY2VzXG4gIGlmIChcbiAgICB3ZWJpZGwudXRpbC5UeXBlKFYpICE9PSAnT2JqZWN0JyB8fFxuICAgICF0eXBlcy5pc0FueUFycmF5QnVmZmVyKFYpXG4gICkge1xuICAgIHRocm93IHdlYmlkbC5lcnJvcnMuY29udmVyc2lvbkZhaWxlZCh7XG4gICAgICBwcmVmaXg6IGAke1Z9YCxcbiAgICAgIGFyZ3VtZW50OiBgJHtWfWAsXG4gICAgICB0eXBlczogWydBcnJheUJ1ZmZlciddXG4gICAgfSlcbiAgfVxuXG4gIC8vIDIuIElmIHRoZSBjb252ZXJzaW9uIGlzIG5vdCB0byBhbiBJREwgdHlwZSBhc3NvY2lhdGVkXG4gIC8vICAgIHdpdGggdGhlIFtBbGxvd1NoYXJlZF0gZXh0ZW5kZWQgYXR0cmlidXRlLCBhbmRcbiAgLy8gICAgSXNTaGFyZWRBcnJheUJ1ZmZlcihWKSBpcyB0cnVlLCB0aGVuIHRocm93IGFcbiAgLy8gICAgVHlwZUVycm9yLlxuICBpZiAob3B0cy5hbGxvd1NoYXJlZCA9PT0gZmFsc2UgJiYgdHlwZXMuaXNTaGFyZWRBcnJheUJ1ZmZlcihWKSkge1xuICAgIHRocm93IHdlYmlkbC5lcnJvcnMuZXhjZXB0aW9uKHtcbiAgICAgIGhlYWRlcjogJ0FycmF5QnVmZmVyJyxcbiAgICAgIG1lc3NhZ2U6ICdTaGFyZWRBcnJheUJ1ZmZlciBpcyBub3QgYWxsb3dlZC4nXG4gICAgfSlcbiAgfVxuXG4gIC8vIDMuIElmIHRoZSBjb252ZXJzaW9uIGlzIG5vdCB0byBhbiBJREwgdHlwZSBhc3NvY2lhdGVkXG4gIC8vICAgIHdpdGggdGhlIFtBbGxvd1Jlc2l6YWJsZV0gZXh0ZW5kZWQgYXR0cmlidXRlLCBhbmRcbiAgLy8gICAgSXNSZXNpemFibGVBcnJheUJ1ZmZlcihWKSBpcyB0cnVlLCB0aGVuIHRocm93IGFcbiAgLy8gICAgVHlwZUVycm9yLlxuICAvLyBOb3RlOiByZXNpemFibGUgQXJyYXlCdWZmZXJzIGFyZSBjdXJyZW50bHkgYSBwcm9wb3NhbC5cblxuICAvLyA0LiBSZXR1cm4gdGhlIElETCBBcnJheUJ1ZmZlciB2YWx1ZSB0aGF0IGlzIGFcbiAgLy8gICAgcmVmZXJlbmNlIHRvIHRoZSBzYW1lIG9iamVjdCBhcyBWLlxuICByZXR1cm4gVlxufVxuXG53ZWJpZGwuY29udmVydGVycy5UeXBlZEFycmF5ID0gZnVuY3Rpb24gKFYsIFQsIG9wdHMgPSB7fSkge1xuICAvLyAxLiBMZXQgVCBiZSB0aGUgSURMIHR5cGUgViBpcyBiZWluZyBjb252ZXJ0ZWQgdG8uXG5cbiAgLy8gMi4gSWYgVHlwZShWKSBpcyBub3QgT2JqZWN0LCBvciBWIGRvZXMgbm90IGhhdmUgYVxuICAvLyAgICBbW1R5cGVkQXJyYXlOYW1lXV0gaW50ZXJuYWwgc2xvdCB3aXRoIGEgdmFsdWVcbiAgLy8gICAgZXF1YWwgdG8gVOKAmXMgbmFtZSwgdGhlbiB0aHJvdyBhIFR5cGVFcnJvci5cbiAgaWYgKFxuICAgIHdlYmlkbC51dGlsLlR5cGUoVikgIT09ICdPYmplY3QnIHx8XG4gICAgIXR5cGVzLmlzVHlwZWRBcnJheShWKSB8fFxuICAgIFYuY29uc3RydWN0b3IubmFtZSAhPT0gVC5uYW1lXG4gICkge1xuICAgIHRocm93IHdlYmlkbC5lcnJvcnMuY29udmVyc2lvbkZhaWxlZCh7XG4gICAgICBwcmVmaXg6IGAke1QubmFtZX1gLFxuICAgICAgYXJndW1lbnQ6IGAke1Z9YCxcbiAgICAgIHR5cGVzOiBbVC5uYW1lXVxuICAgIH0pXG4gIH1cblxuICAvLyAzLiBJZiB0aGUgY29udmVyc2lvbiBpcyBub3QgdG8gYW4gSURMIHR5cGUgYXNzb2NpYXRlZFxuICAvLyAgICB3aXRoIHRoZSBbQWxsb3dTaGFyZWRdIGV4dGVuZGVkIGF0dHJpYnV0ZSwgYW5kXG4gIC8vICAgIElzU2hhcmVkQXJyYXlCdWZmZXIoVi5bW1ZpZXdlZEFycmF5QnVmZmVyXV0pIGlzXG4gIC8vICAgIHRydWUsIHRoZW4gdGhyb3cgYSBUeXBlRXJyb3IuXG4gIGlmIChvcHRzLmFsbG93U2hhcmVkID09PSBmYWxzZSAmJiB0eXBlcy5pc1NoYXJlZEFycmF5QnVmZmVyKFYuYnVmZmVyKSkge1xuICAgIHRocm93IHdlYmlkbC5lcnJvcnMuZXhjZXB0aW9uKHtcbiAgICAgIGhlYWRlcjogJ0FycmF5QnVmZmVyJyxcbiAgICAgIG1lc3NhZ2U6ICdTaGFyZWRBcnJheUJ1ZmZlciBpcyBub3QgYWxsb3dlZC4nXG4gICAgfSlcbiAgfVxuXG4gIC8vIDQuIElmIHRoZSBjb252ZXJzaW9uIGlzIG5vdCB0byBhbiBJREwgdHlwZSBhc3NvY2lhdGVkXG4gIC8vICAgIHdpdGggdGhlIFtBbGxvd1Jlc2l6YWJsZV0gZXh0ZW5kZWQgYXR0cmlidXRlLCBhbmRcbiAgLy8gICAgSXNSZXNpemFibGVBcnJheUJ1ZmZlcihWLltbVmlld2VkQXJyYXlCdWZmZXJdXSkgaXNcbiAgLy8gICAgdHJ1ZSwgdGhlbiB0aHJvdyBhIFR5cGVFcnJvci5cbiAgLy8gTm90ZTogcmVzaXphYmxlIGFycmF5IGJ1ZmZlcnMgYXJlIGN1cnJlbnRseSBhIHByb3Bvc2FsXG5cbiAgLy8gNS4gUmV0dXJuIHRoZSBJREwgdmFsdWUgb2YgdHlwZSBUIHRoYXQgaXMgYSByZWZlcmVuY2VcbiAgLy8gICAgdG8gdGhlIHNhbWUgb2JqZWN0IGFzIFYuXG4gIHJldHVybiBWXG59XG5cbndlYmlkbC5jb252ZXJ0ZXJzLkRhdGFWaWV3ID0gZnVuY3Rpb24gKFYsIG9wdHMgPSB7fSkge1xuICAvLyAxLiBJZiBUeXBlKFYpIGlzIG5vdCBPYmplY3QsIG9yIFYgZG9lcyBub3QgaGF2ZSBhXG4gIC8vICAgIFtbRGF0YVZpZXddXSBpbnRlcm5hbCBzbG90LCB0aGVuIHRocm93IGEgVHlwZUVycm9yLlxuICBpZiAod2ViaWRsLnV0aWwuVHlwZShWKSAhPT0gJ09iamVjdCcgfHwgIXR5cGVzLmlzRGF0YVZpZXcoVikpIHtcbiAgICB0aHJvdyB3ZWJpZGwuZXJyb3JzLmV4Y2VwdGlvbih7XG4gICAgICBoZWFkZXI6ICdEYXRhVmlldycsXG4gICAgICBtZXNzYWdlOiAnT2JqZWN0IGlzIG5vdCBhIERhdGFWaWV3LidcbiAgICB9KVxuICB9XG5cbiAgLy8gMi4gSWYgdGhlIGNvbnZlcnNpb24gaXMgbm90IHRvIGFuIElETCB0eXBlIGFzc29jaWF0ZWRcbiAgLy8gICAgd2l0aCB0aGUgW0FsbG93U2hhcmVkXSBleHRlbmRlZCBhdHRyaWJ1dGUsIGFuZFxuICAvLyAgICBJc1NoYXJlZEFycmF5QnVmZmVyKFYuW1tWaWV3ZWRBcnJheUJ1ZmZlcl1dKSBpcyB0cnVlLFxuICAvLyAgICB0aGVuIHRocm93IGEgVHlwZUVycm9yLlxuICBpZiAob3B0cy5hbGxvd1NoYXJlZCA9PT0gZmFsc2UgJiYgdHlwZXMuaXNTaGFyZWRBcnJheUJ1ZmZlcihWLmJ1ZmZlcikpIHtcbiAgICB0aHJvdyB3ZWJpZGwuZXJyb3JzLmV4Y2VwdGlvbih7XG4gICAgICBoZWFkZXI6ICdBcnJheUJ1ZmZlcicsXG4gICAgICBtZXNzYWdlOiAnU2hhcmVkQXJyYXlCdWZmZXIgaXMgbm90IGFsbG93ZWQuJ1xuICAgIH0pXG4gIH1cblxuICAvLyAzLiBJZiB0aGUgY29udmVyc2lvbiBpcyBub3QgdG8gYW4gSURMIHR5cGUgYXNzb2NpYXRlZFxuICAvLyAgICB3aXRoIHRoZSBbQWxsb3dSZXNpemFibGVdIGV4dGVuZGVkIGF0dHJpYnV0ZSwgYW5kXG4gIC8vICAgIElzUmVzaXphYmxlQXJyYXlCdWZmZXIoVi5bW1ZpZXdlZEFycmF5QnVmZmVyXV0pIGlzXG4gIC8vICAgIHRydWUsIHRoZW4gdGhyb3cgYSBUeXBlRXJyb3IuXG4gIC8vIE5vdGU6IHJlc2l6YWJsZSBBcnJheUJ1ZmZlcnMgYXJlIGN1cnJlbnRseSBhIHByb3Bvc2FsXG5cbiAgLy8gNC4gUmV0dXJuIHRoZSBJREwgRGF0YVZpZXcgdmFsdWUgdGhhdCBpcyBhIHJlZmVyZW5jZVxuICAvLyAgICB0byB0aGUgc2FtZSBvYmplY3QgYXMgVi5cbiAgcmV0dXJuIFZcbn1cblxuLy8gaHR0cHM6Ly93ZWJpZGwuc3BlYy53aGF0d2cub3JnLyNCdWZmZXJTb3VyY2VcbndlYmlkbC5jb252ZXJ0ZXJzLkJ1ZmZlclNvdXJjZSA9IGZ1bmN0aW9uIChWLCBvcHRzID0ge30pIHtcbiAgaWYgKHR5cGVzLmlzQW55QXJyYXlCdWZmZXIoVikpIHtcbiAgICByZXR1cm4gd2ViaWRsLmNvbnZlcnRlcnMuQXJyYXlCdWZmZXIoViwgb3B0cylcbiAgfVxuXG4gIGlmICh0eXBlcy5pc1R5cGVkQXJyYXkoVikpIHtcbiAgICByZXR1cm4gd2ViaWRsLmNvbnZlcnRlcnMuVHlwZWRBcnJheShWLCBWLmNvbnN0cnVjdG9yKVxuICB9XG5cbiAgaWYgKHR5cGVzLmlzRGF0YVZpZXcoVikpIHtcbiAgICByZXR1cm4gd2ViaWRsLmNvbnZlcnRlcnMuRGF0YVZpZXcoViwgb3B0cylcbiAgfVxuXG4gIHRocm93IG5ldyBUeXBlRXJyb3IoYENvdWxkIG5vdCBjb252ZXJ0ICR7Vn0gdG8gYSBCdWZmZXJTb3VyY2UuYClcbn1cblxud2ViaWRsLmNvbnZlcnRlcnNbJ3NlcXVlbmNlPEJ5dGVTdHJpbmc+J10gPSB3ZWJpZGwuc2VxdWVuY2VDb252ZXJ0ZXIoXG4gIHdlYmlkbC5jb252ZXJ0ZXJzLkJ5dGVTdHJpbmdcbilcblxud2ViaWRsLmNvbnZlcnRlcnNbJ3NlcXVlbmNlPHNlcXVlbmNlPEJ5dGVTdHJpbmc+PiddID0gd2ViaWRsLnNlcXVlbmNlQ29udmVydGVyKFxuICB3ZWJpZGwuY29udmVydGVyc1snc2VxdWVuY2U8Qnl0ZVN0cmluZz4nXVxuKVxuXG53ZWJpZGwuY29udmVydGVyc1sncmVjb3JkPEJ5dGVTdHJpbmcsIEJ5dGVTdHJpbmc+J10gPSB3ZWJpZGwucmVjb3JkQ29udmVydGVyKFxuICB3ZWJpZGwuY29udmVydGVycy5CeXRlU3RyaW5nLFxuICB3ZWJpZGwuY29udmVydGVycy5CeXRlU3RyaW5nXG4pXG5cbm1vZHVsZS5leHBvcnRzID0ge1xuICB3ZWJpZGxcbn1cbiIsCiAgICAiY29uc3QgYXNzZXJ0ID0gcmVxdWlyZSgnYXNzZXJ0JylcbmNvbnN0IHsgYXRvYiB9ID0gcmVxdWlyZSgnYnVmZmVyJylcbmNvbnN0IHsgaXNvbW9ycGhpY0RlY29kZSB9ID0gcmVxdWlyZSgnLi91dGlsJylcblxuY29uc3QgZW5jb2RlciA9IG5ldyBUZXh0RW5jb2RlcigpXG5cbi8qKlxuICogQHNlZSBodHRwczovL21pbWVzbmlmZi5zcGVjLndoYXR3Zy5vcmcvI2h0dHAtdG9rZW4tY29kZS1wb2ludFxuICovXG5jb25zdCBIVFRQX1RPS0VOX0NPREVQT0lOVFMgPSAvXlshIyQlJicqKy0uXl98fkEtWmEtejAtOV0rJC9cbmNvbnN0IEhUVFBfV0hJVEVTUEFDRV9SRUdFWCA9IC8oXFx1MDAwQXxcXHUwMDBEfFxcdTAwMDl8XFx1MDAyMCkvIC8vIGVzbGludC1kaXNhYmxlLWxpbmVcbi8qKlxuICogQHNlZSBodHRwczovL21pbWVzbmlmZi5zcGVjLndoYXR3Zy5vcmcvI2h0dHAtcXVvdGVkLXN0cmluZy10b2tlbi1jb2RlLXBvaW50XG4gKi9cbmNvbnN0IEhUVFBfUVVPVEVEX1NUUklOR19UT0tFTlMgPSAvW1xcdTAwMDl8XFx1MDAyMC1cXHUwMDdFfFxcdTAwODAtXFx1MDBGRl0vIC8vIGVzbGludC1kaXNhYmxlLWxpbmVcblxuLy8gaHR0cHM6Ly9mZXRjaC5zcGVjLndoYXR3Zy5vcmcvI2RhdGEtdXJsLXByb2Nlc3NvclxuLyoqIEBwYXJhbSB7VVJMfSBkYXRhVVJMICovXG5mdW5jdGlvbiBkYXRhVVJMUHJvY2Vzc29yIChkYXRhVVJMKSB7XG4gIC8vIDEuIEFzc2VydDogZGF0YVVSTOKAmXMgc2NoZW1lIGlzIFwiZGF0YVwiLlxuICBhc3NlcnQoZGF0YVVSTC5wcm90b2NvbCA9PT0gJ2RhdGE6JylcblxuICAvLyAyLiBMZXQgaW5wdXQgYmUgdGhlIHJlc3VsdCBvZiBydW5uaW5nIHRoZSBVUkxcbiAgLy8gc2VyaWFsaXplciBvbiBkYXRhVVJMIHdpdGggZXhjbHVkZSBmcmFnbWVudFxuICAvLyBzZXQgdG8gdHJ1ZS5cbiAgbGV0IGlucHV0ID0gVVJMU2VyaWFsaXplcihkYXRhVVJMLCB0cnVlKVxuXG4gIC8vIDMuIFJlbW92ZSB0aGUgbGVhZGluZyBcImRhdGE6XCIgc3RyaW5nIGZyb20gaW5wdXQuXG4gIGlucHV0ID0gaW5wdXQuc2xpY2UoNSlcblxuICAvLyA0LiBMZXQgcG9zaXRpb24gcG9pbnQgYXQgdGhlIHN0YXJ0IG9mIGlucHV0LlxuICBjb25zdCBwb3NpdGlvbiA9IHsgcG9zaXRpb246IDAgfVxuXG4gIC8vIDUuIExldCBtaW1lVHlwZSBiZSB0aGUgcmVzdWx0IG9mIGNvbGxlY3RpbmcgYVxuICAvLyBzZXF1ZW5jZSBvZiBjb2RlIHBvaW50cyB0aGF0IGFyZSBub3QgZXF1YWxcbiAgLy8gdG8gVSswMDJDICgsKSwgZ2l2ZW4gcG9zaXRpb24uXG4gIGxldCBtaW1lVHlwZSA9IGNvbGxlY3RBU2VxdWVuY2VPZkNvZGVQb2ludHNGYXN0KFxuICAgICcsJyxcbiAgICBpbnB1dCxcbiAgICBwb3NpdGlvblxuICApXG5cbiAgLy8gNi4gU3RyaXAgbGVhZGluZyBhbmQgdHJhaWxpbmcgQVNDSUkgd2hpdGVzcGFjZVxuICAvLyBmcm9tIG1pbWVUeXBlLlxuICAvLyBVbmRpY2kgaW1wbGVtZW50YXRpb24gbm90ZTogd2UgbmVlZCB0byBzdG9yZSB0aGVcbiAgLy8gbGVuZ3RoIGJlY2F1c2UgaWYgdGhlIG1pbWV0eXBlIGhhcyBzcGFjZXMgcmVtb3ZlZCxcbiAgLy8gdGhlIHdyb25nIGFtb3VudCB3aWxsIGJlIHNsaWNlZCBmcm9tIHRoZSBpbnB1dCBpblxuICAvLyBzdGVwICM5XG4gIGNvbnN0IG1pbWVUeXBlTGVuZ3RoID0gbWltZVR5cGUubGVuZ3RoXG4gIG1pbWVUeXBlID0gcmVtb3ZlQVNDSUlXaGl0ZXNwYWNlKG1pbWVUeXBlLCB0cnVlLCB0cnVlKVxuXG4gIC8vIDcuIElmIHBvc2l0aW9uIGlzIHBhc3QgdGhlIGVuZCBvZiBpbnB1dCwgdGhlblxuICAvLyByZXR1cm4gZmFpbHVyZVxuICBpZiAocG9zaXRpb24ucG9zaXRpb24gPj0gaW5wdXQubGVuZ3RoKSB7XG4gICAgcmV0dXJuICdmYWlsdXJlJ1xuICB9XG5cbiAgLy8gOC4gQWR2YW5jZSBwb3NpdGlvbiBieSAxLlxuICBwb3NpdGlvbi5wb3NpdGlvbisrXG5cbiAgLy8gOS4gTGV0IGVuY29kZWRCb2R5IGJlIHRoZSByZW1haW5kZXIgb2YgaW5wdXQuXG4gIGNvbnN0IGVuY29kZWRCb2R5ID0gaW5wdXQuc2xpY2UobWltZVR5cGVMZW5ndGggKyAxKVxuXG4gIC8vIDEwLiBMZXQgYm9keSBiZSB0aGUgcGVyY2VudC1kZWNvZGluZyBvZiBlbmNvZGVkQm9keS5cbiAgbGV0IGJvZHkgPSBzdHJpbmdQZXJjZW50RGVjb2RlKGVuY29kZWRCb2R5KVxuXG4gIC8vIDExLiBJZiBtaW1lVHlwZSBlbmRzIHdpdGggVSswMDNCICg7KSwgZm9sbG93ZWQgYnlcbiAgLy8gemVybyBvciBtb3JlIFUrMDAyMCBTUEFDRSwgZm9sbG93ZWQgYnkgYW4gQVNDSUlcbiAgLy8gY2FzZS1pbnNlbnNpdGl2ZSBtYXRjaCBmb3IgXCJiYXNlNjRcIiwgdGhlbjpcbiAgaWYgKC87KFxcdTAwMjApezAsfWJhc2U2NCQvaS50ZXN0KG1pbWVUeXBlKSkge1xuICAgIC8vIDEuIExldCBzdHJpbmdCb2R5IGJlIHRoZSBpc29tb3JwaGljIGRlY29kZSBvZiBib2R5LlxuICAgIGNvbnN0IHN0cmluZ0JvZHkgPSBpc29tb3JwaGljRGVjb2RlKGJvZHkpXG5cbiAgICAvLyAyLiBTZXQgYm9keSB0byB0aGUgZm9yZ2l2aW5nLWJhc2U2NCBkZWNvZGUgb2ZcbiAgICAvLyBzdHJpbmdCb2R5LlxuICAgIGJvZHkgPSBmb3JnaXZpbmdCYXNlNjQoc3RyaW5nQm9keSlcblxuICAgIC8vIDMuIElmIGJvZHkgaXMgZmFpbHVyZSwgdGhlbiByZXR1cm4gZmFpbHVyZS5cbiAgICBpZiAoYm9keSA9PT0gJ2ZhaWx1cmUnKSB7XG4gICAgICByZXR1cm4gJ2ZhaWx1cmUnXG4gICAgfVxuXG4gICAgLy8gNC4gUmVtb3ZlIHRoZSBsYXN0IDYgY29kZSBwb2ludHMgZnJvbSBtaW1lVHlwZS5cbiAgICBtaW1lVHlwZSA9IG1pbWVUeXBlLnNsaWNlKDAsIC02KVxuXG4gICAgLy8gNS4gUmVtb3ZlIHRyYWlsaW5nIFUrMDAyMCBTUEFDRSBjb2RlIHBvaW50cyBmcm9tIG1pbWVUeXBlLFxuICAgIC8vIGlmIGFueS5cbiAgICBtaW1lVHlwZSA9IG1pbWVUeXBlLnJlcGxhY2UoLyhcXHUwMDIwKSskLywgJycpXG5cbiAgICAvLyA2LiBSZW1vdmUgdGhlIGxhc3QgVSswMDNCICg7KSBjb2RlIHBvaW50IGZyb20gbWltZVR5cGUuXG4gICAgbWltZVR5cGUgPSBtaW1lVHlwZS5zbGljZSgwLCAtMSlcbiAgfVxuXG4gIC8vIDEyLiBJZiBtaW1lVHlwZSBzdGFydHMgd2l0aCBVKzAwM0IgKDspLCB0aGVuIHByZXBlbmRcbiAgLy8gXCJ0ZXh0L3BsYWluXCIgdG8gbWltZVR5cGUuXG4gIGlmIChtaW1lVHlwZS5zdGFydHNXaXRoKCc7JykpIHtcbiAgICBtaW1lVHlwZSA9ICd0ZXh0L3BsYWluJyArIG1pbWVUeXBlXG4gIH1cblxuICAvLyAxMy4gTGV0IG1pbWVUeXBlUmVjb3JkIGJlIHRoZSByZXN1bHQgb2YgcGFyc2luZ1xuICAvLyBtaW1lVHlwZS5cbiAgbGV0IG1pbWVUeXBlUmVjb3JkID0gcGFyc2VNSU1FVHlwZShtaW1lVHlwZSlcblxuICAvLyAxNC4gSWYgbWltZVR5cGVSZWNvcmQgaXMgZmFpbHVyZSwgdGhlbiBzZXRcbiAgLy8gbWltZVR5cGVSZWNvcmQgdG8gdGV4dC9wbGFpbjtjaGFyc2V0PVVTLUFTQ0lJLlxuICBpZiAobWltZVR5cGVSZWNvcmQgPT09ICdmYWlsdXJlJykge1xuICAgIG1pbWVUeXBlUmVjb3JkID0gcGFyc2VNSU1FVHlwZSgndGV4dC9wbGFpbjtjaGFyc2V0PVVTLUFTQ0lJJylcbiAgfVxuXG4gIC8vIDE1LiBSZXR1cm4gYSBuZXcgZGF0YTogVVJMIHN0cnVjdCB3aG9zZSBNSU1FXG4gIC8vIHR5cGUgaXMgbWltZVR5cGVSZWNvcmQgYW5kIGJvZHkgaXMgYm9keS5cbiAgLy8gaHR0cHM6Ly9mZXRjaC5zcGVjLndoYXR3Zy5vcmcvI2RhdGEtdXJsLXN0cnVjdFxuICByZXR1cm4geyBtaW1lVHlwZTogbWltZVR5cGVSZWNvcmQsIGJvZHkgfVxufVxuXG4vLyBodHRwczovL3VybC5zcGVjLndoYXR3Zy5vcmcvI2NvbmNlcHQtdXJsLXNlcmlhbGl6ZXJcbi8qKlxuICogQHBhcmFtIHtVUkx9IHVybFxuICogQHBhcmFtIHtib29sZWFufSBleGNsdWRlRnJhZ21lbnRcbiAqL1xuZnVuY3Rpb24gVVJMU2VyaWFsaXplciAodXJsLCBleGNsdWRlRnJhZ21lbnQgPSBmYWxzZSkge1xuICBpZiAoIWV4Y2x1ZGVGcmFnbWVudCkge1xuICAgIHJldHVybiB1cmwuaHJlZlxuICB9XG5cbiAgY29uc3QgaHJlZiA9IHVybC5ocmVmXG4gIGNvbnN0IGhhc2hMZW5ndGggPSB1cmwuaGFzaC5sZW5ndGhcblxuICByZXR1cm4gaGFzaExlbmd0aCA9PT0gMCA/IGhyZWYgOiBocmVmLnN1YnN0cmluZygwLCBocmVmLmxlbmd0aCAtIGhhc2hMZW5ndGgpXG59XG5cbi8vIGh0dHBzOi8vaW5mcmEuc3BlYy53aGF0d2cub3JnLyNjb2xsZWN0LWEtc2VxdWVuY2Utb2YtY29kZS1wb2ludHNcbi8qKlxuICogQHBhcmFtIHsoY2hhcjogc3RyaW5nKSA9PiBib29sZWFufSBjb25kaXRpb25cbiAqIEBwYXJhbSB7c3RyaW5nfSBpbnB1dFxuICogQHBhcmFtIHt7IHBvc2l0aW9uOiBudW1iZXIgfX0gcG9zaXRpb25cbiAqL1xuZnVuY3Rpb24gY29sbGVjdEFTZXF1ZW5jZU9mQ29kZVBvaW50cyAoY29uZGl0aW9uLCBpbnB1dCwgcG9zaXRpb24pIHtcbiAgLy8gMS4gTGV0IHJlc3VsdCBiZSB0aGUgZW1wdHkgc3RyaW5nLlxuICBsZXQgcmVzdWx0ID0gJydcblxuICAvLyAyLiBXaGlsZSBwb3NpdGlvbiBkb2VzbuKAmXQgcG9pbnQgcGFzdCB0aGUgZW5kIG9mIGlucHV0IGFuZCB0aGVcbiAgLy8gY29kZSBwb2ludCBhdCBwb3NpdGlvbiB3aXRoaW4gaW5wdXQgbWVldHMgdGhlIGNvbmRpdGlvbiBjb25kaXRpb246XG4gIHdoaWxlIChwb3NpdGlvbi5wb3NpdGlvbiA8IGlucHV0Lmxlbmd0aCAmJiBjb25kaXRpb24oaW5wdXRbcG9zaXRpb24ucG9zaXRpb25dKSkge1xuICAgIC8vIDEuIEFwcGVuZCB0aGF0IGNvZGUgcG9pbnQgdG8gdGhlIGVuZCBvZiByZXN1bHQuXG4gICAgcmVzdWx0ICs9IGlucHV0W3Bvc2l0aW9uLnBvc2l0aW9uXVxuXG4gICAgLy8gMi4gQWR2YW5jZSBwb3NpdGlvbiBieSAxLlxuICAgIHBvc2l0aW9uLnBvc2l0aW9uKytcbiAgfVxuXG4gIC8vIDMuIFJldHVybiByZXN1bHQuXG4gIHJldHVybiByZXN1bHRcbn1cblxuLyoqXG4gKiBBIGZhc3RlciBjb2xsZWN0QVNlcXVlbmNlT2ZDb2RlUG9pbnRzIHRoYXQgb25seSB3b3JrcyB3aGVuIGNvbXBhcmluZyBhIHNpbmdsZSBjaGFyYWN0ZXIuXG4gKiBAcGFyYW0ge3N0cmluZ30gY2hhclxuICogQHBhcmFtIHtzdHJpbmd9IGlucHV0XG4gKiBAcGFyYW0ge3sgcG9zaXRpb246IG51bWJlciB9fSBwb3NpdGlvblxuICovXG5mdW5jdGlvbiBjb2xsZWN0QVNlcXVlbmNlT2ZDb2RlUG9pbnRzRmFzdCAoY2hhciwgaW5wdXQsIHBvc2l0aW9uKSB7XG4gIGNvbnN0IGlkeCA9IGlucHV0LmluZGV4T2YoY2hhciwgcG9zaXRpb24ucG9zaXRpb24pXG4gIGNvbnN0IHN0YXJ0ID0gcG9zaXRpb24ucG9zaXRpb25cblxuICBpZiAoaWR4ID09PSAtMSkge1xuICAgIHBvc2l0aW9uLnBvc2l0aW9uID0gaW5wdXQubGVuZ3RoXG4gICAgcmV0dXJuIGlucHV0LnNsaWNlKHN0YXJ0KVxuICB9XG5cbiAgcG9zaXRpb24ucG9zaXRpb24gPSBpZHhcbiAgcmV0dXJuIGlucHV0LnNsaWNlKHN0YXJ0LCBwb3NpdGlvbi5wb3NpdGlvbilcbn1cblxuLy8gaHR0cHM6Ly91cmwuc3BlYy53aGF0d2cub3JnLyNzdHJpbmctcGVyY2VudC1kZWNvZGVcbi8qKiBAcGFyYW0ge3N0cmluZ30gaW5wdXQgKi9cbmZ1bmN0aW9uIHN0cmluZ1BlcmNlbnREZWNvZGUgKGlucHV0KSB7XG4gIC8vIDEuIExldCBieXRlcyBiZSB0aGUgVVRGLTggZW5jb2Rpbmcgb2YgaW5wdXQuXG4gIGNvbnN0IGJ5dGVzID0gZW5jb2Rlci5lbmNvZGUoaW5wdXQpXG5cbiAgLy8gMi4gUmV0dXJuIHRoZSBwZXJjZW50LWRlY29kaW5nIG9mIGJ5dGVzLlxuICByZXR1cm4gcGVyY2VudERlY29kZShieXRlcylcbn1cblxuLy8gaHR0cHM6Ly91cmwuc3BlYy53aGF0d2cub3JnLyNwZXJjZW50LWRlY29kZVxuLyoqIEBwYXJhbSB7VWludDhBcnJheX0gaW5wdXQgKi9cbmZ1bmN0aW9uIHBlcmNlbnREZWNvZGUgKGlucHV0KSB7XG4gIC8vIDEuIExldCBvdXRwdXQgYmUgYW4gZW1wdHkgYnl0ZSBzZXF1ZW5jZS5cbiAgLyoqIEB0eXBlIHtudW1iZXJbXX0gKi9cbiAgY29uc3Qgb3V0cHV0ID0gW11cblxuICAvLyAyLiBGb3IgZWFjaCBieXRlIGJ5dGUgaW4gaW5wdXQ6XG4gIGZvciAobGV0IGkgPSAwOyBpIDwgaW5wdXQubGVuZ3RoOyBpKyspIHtcbiAgICBjb25zdCBieXRlID0gaW5wdXRbaV1cblxuICAgIC8vIDEuIElmIGJ5dGUgaXMgbm90IDB4MjUgKCUpLCB0aGVuIGFwcGVuZCBieXRlIHRvIG91dHB1dC5cbiAgICBpZiAoYnl0ZSAhPT0gMHgyNSkge1xuICAgICAgb3V0cHV0LnB1c2goYnl0ZSlcblxuICAgIC8vIDIuIE90aGVyd2lzZSwgaWYgYnl0ZSBpcyAweDI1ICglKSBhbmQgdGhlIG5leHQgdHdvIGJ5dGVzXG4gICAgLy8gYWZ0ZXIgYnl0ZSBpbiBpbnB1dCBhcmUgbm90IGluIHRoZSByYW5nZXNcbiAgICAvLyAweDMwICgwKSB0byAweDM5ICg5KSwgMHg0MSAoQSkgdG8gMHg0NiAoRiksXG4gICAgLy8gYW5kIDB4NjEgKGEpIHRvIDB4NjYgKGYpLCBhbGwgaW5jbHVzaXZlLCBhcHBlbmQgYnl0ZVxuICAgIC8vIHRvIG91dHB1dC5cbiAgICB9IGVsc2UgaWYgKFxuICAgICAgYnl0ZSA9PT0gMHgyNSAmJlxuICAgICAgIS9eWzAtOUEtRmEtZl17Mn0kL2kudGVzdChTdHJpbmcuZnJvbUNoYXJDb2RlKGlucHV0W2kgKyAxXSwgaW5wdXRbaSArIDJdKSlcbiAgICApIHtcbiAgICAgIG91dHB1dC5wdXNoKDB4MjUpXG5cbiAgICAvLyAzLiBPdGhlcndpc2U6XG4gICAgfSBlbHNlIHtcbiAgICAgIC8vIDEuIExldCBieXRlUG9pbnQgYmUgdGhlIHR3byBieXRlcyBhZnRlciBieXRlIGluIGlucHV0LFxuICAgICAgLy8gZGVjb2RlZCwgYW5kIHRoZW4gaW50ZXJwcmV0ZWQgYXMgaGV4YWRlY2ltYWwgbnVtYmVyLlxuICAgICAgY29uc3QgbmV4dFR3b0J5dGVzID0gU3RyaW5nLmZyb21DaGFyQ29kZShpbnB1dFtpICsgMV0sIGlucHV0W2kgKyAyXSlcbiAgICAgIGNvbnN0IGJ5dGVQb2ludCA9IE51bWJlci5wYXJzZUludChuZXh0VHdvQnl0ZXMsIDE2KVxuXG4gICAgICAvLyAyLiBBcHBlbmQgYSBieXRlIHdob3NlIHZhbHVlIGlzIGJ5dGVQb2ludCB0byBvdXRwdXQuXG4gICAgICBvdXRwdXQucHVzaChieXRlUG9pbnQpXG5cbiAgICAgIC8vIDMuIFNraXAgdGhlIG5leHQgdHdvIGJ5dGVzIGluIGlucHV0LlxuICAgICAgaSArPSAyXG4gICAgfVxuICB9XG5cbiAgLy8gMy4gUmV0dXJuIG91dHB1dC5cbiAgcmV0dXJuIFVpbnQ4QXJyYXkuZnJvbShvdXRwdXQpXG59XG5cbi8vIGh0dHBzOi8vbWltZXNuaWZmLnNwZWMud2hhdHdnLm9yZy8jcGFyc2UtYS1taW1lLXR5cGVcbi8qKiBAcGFyYW0ge3N0cmluZ30gaW5wdXQgKi9cbmZ1bmN0aW9uIHBhcnNlTUlNRVR5cGUgKGlucHV0KSB7XG4gIC8vIDEuIFJlbW92ZSBhbnkgbGVhZGluZyBhbmQgdHJhaWxpbmcgSFRUUCB3aGl0ZXNwYWNlXG4gIC8vIGZyb20gaW5wdXQuXG4gIGlucHV0ID0gcmVtb3ZlSFRUUFdoaXRlc3BhY2UoaW5wdXQsIHRydWUsIHRydWUpXG5cbiAgLy8gMi4gTGV0IHBvc2l0aW9uIGJlIGEgcG9zaXRpb24gdmFyaWFibGUgZm9yIGlucHV0LFxuICAvLyBpbml0aWFsbHkgcG9pbnRpbmcgYXQgdGhlIHN0YXJ0IG9mIGlucHV0LlxuICBjb25zdCBwb3NpdGlvbiA9IHsgcG9zaXRpb246IDAgfVxuXG4gIC8vIDMuIExldCB0eXBlIGJlIHRoZSByZXN1bHQgb2YgY29sbGVjdGluZyBhIHNlcXVlbmNlXG4gIC8vIG9mIGNvZGUgcG9pbnRzIHRoYXQgYXJlIG5vdCBVKzAwMkYgKC8pIGZyb21cbiAgLy8gaW5wdXQsIGdpdmVuIHBvc2l0aW9uLlxuICBjb25zdCB0eXBlID0gY29sbGVjdEFTZXF1ZW5jZU9mQ29kZVBvaW50c0Zhc3QoXG4gICAgJy8nLFxuICAgIGlucHV0LFxuICAgIHBvc2l0aW9uXG4gIClcblxuICAvLyA0LiBJZiB0eXBlIGlzIHRoZSBlbXB0eSBzdHJpbmcgb3IgZG9lcyBub3Qgc29sZWx5XG4gIC8vIGNvbnRhaW4gSFRUUCB0b2tlbiBjb2RlIHBvaW50cywgdGhlbiByZXR1cm4gZmFpbHVyZS5cbiAgLy8gaHR0cHM6Ly9taW1lc25pZmYuc3BlYy53aGF0d2cub3JnLyNodHRwLXRva2VuLWNvZGUtcG9pbnRcbiAgaWYgKHR5cGUubGVuZ3RoID09PSAwIHx8ICFIVFRQX1RPS0VOX0NPREVQT0lOVFMudGVzdCh0eXBlKSkge1xuICAgIHJldHVybiAnZmFpbHVyZSdcbiAgfVxuXG4gIC8vIDUuIElmIHBvc2l0aW9uIGlzIHBhc3QgdGhlIGVuZCBvZiBpbnB1dCwgdGhlbiByZXR1cm5cbiAgLy8gZmFpbHVyZVxuICBpZiAocG9zaXRpb24ucG9zaXRpb24gPiBpbnB1dC5sZW5ndGgpIHtcbiAgICByZXR1cm4gJ2ZhaWx1cmUnXG4gIH1cblxuICAvLyA2LiBBZHZhbmNlIHBvc2l0aW9uIGJ5IDEuIChUaGlzIHNraXBzIHBhc3QgVSswMDJGICgvKS4pXG4gIHBvc2l0aW9uLnBvc2l0aW9uKytcblxuICAvLyA3LiBMZXQgc3VidHlwZSBiZSB0aGUgcmVzdWx0IG9mIGNvbGxlY3RpbmcgYSBzZXF1ZW5jZSBvZlxuICAvLyBjb2RlIHBvaW50cyB0aGF0IGFyZSBub3QgVSswMDNCICg7KSBmcm9tIGlucHV0LCBnaXZlblxuICAvLyBwb3NpdGlvbi5cbiAgbGV0IHN1YnR5cGUgPSBjb2xsZWN0QVNlcXVlbmNlT2ZDb2RlUG9pbnRzRmFzdChcbiAgICAnOycsXG4gICAgaW5wdXQsXG4gICAgcG9zaXRpb25cbiAgKVxuXG4gIC8vIDguIFJlbW92ZSBhbnkgdHJhaWxpbmcgSFRUUCB3aGl0ZXNwYWNlIGZyb20gc3VidHlwZS5cbiAgc3VidHlwZSA9IHJlbW92ZUhUVFBXaGl0ZXNwYWNlKHN1YnR5cGUsIGZhbHNlLCB0cnVlKVxuXG4gIC8vIDkuIElmIHN1YnR5cGUgaXMgdGhlIGVtcHR5IHN0cmluZyBvciBkb2VzIG5vdCBzb2xlbHlcbiAgLy8gY29udGFpbiBIVFRQIHRva2VuIGNvZGUgcG9pbnRzLCB0aGVuIHJldHVybiBmYWlsdXJlLlxuICBpZiAoc3VidHlwZS5sZW5ndGggPT09IDAgfHwgIUhUVFBfVE9LRU5fQ09ERVBPSU5UUy50ZXN0KHN1YnR5cGUpKSB7XG4gICAgcmV0dXJuICdmYWlsdXJlJ1xuICB9XG5cbiAgY29uc3QgdHlwZUxvd2VyY2FzZSA9IHR5cGUudG9Mb3dlckNhc2UoKVxuICBjb25zdCBzdWJ0eXBlTG93ZXJjYXNlID0gc3VidHlwZS50b0xvd2VyQ2FzZSgpXG5cbiAgLy8gMTAuIExldCBtaW1lVHlwZSBiZSBhIG5ldyBNSU1FIHR5cGUgcmVjb3JkIHdob3NlIHR5cGVcbiAgLy8gaXMgdHlwZSwgaW4gQVNDSUkgbG93ZXJjYXNlLCBhbmQgc3VidHlwZSBpcyBzdWJ0eXBlLFxuICAvLyBpbiBBU0NJSSBsb3dlcmNhc2UuXG4gIC8vIGh0dHBzOi8vbWltZXNuaWZmLnNwZWMud2hhdHdnLm9yZy8jbWltZS10eXBlXG4gIGNvbnN0IG1pbWVUeXBlID0ge1xuICAgIHR5cGU6IHR5cGVMb3dlcmNhc2UsXG4gICAgc3VidHlwZTogc3VidHlwZUxvd2VyY2FzZSxcbiAgICAvKiogQHR5cGUge01hcDxzdHJpbmcsIHN0cmluZz59ICovXG4gICAgcGFyYW1ldGVyczogbmV3IE1hcCgpLFxuICAgIC8vIGh0dHBzOi8vbWltZXNuaWZmLnNwZWMud2hhdHdnLm9yZy8jbWltZS10eXBlLWVzc2VuY2VcbiAgICBlc3NlbmNlOiBgJHt0eXBlTG93ZXJjYXNlfS8ke3N1YnR5cGVMb3dlcmNhc2V9YFxuICB9XG5cbiAgLy8gMTEuIFdoaWxlIHBvc2l0aW9uIGlzIG5vdCBwYXN0IHRoZSBlbmQgb2YgaW5wdXQ6XG4gIHdoaWxlIChwb3NpdGlvbi5wb3NpdGlvbiA8IGlucHV0Lmxlbmd0aCkge1xuICAgIC8vIDEuIEFkdmFuY2UgcG9zaXRpb24gYnkgMS4gKFRoaXMgc2tpcHMgcGFzdCBVKzAwM0IgKDspLilcbiAgICBwb3NpdGlvbi5wb3NpdGlvbisrXG5cbiAgICAvLyAyLiBDb2xsZWN0IGEgc2VxdWVuY2Ugb2YgY29kZSBwb2ludHMgdGhhdCBhcmUgSFRUUFxuICAgIC8vIHdoaXRlc3BhY2UgZnJvbSBpbnB1dCBnaXZlbiBwb3NpdGlvbi5cbiAgICBjb2xsZWN0QVNlcXVlbmNlT2ZDb2RlUG9pbnRzKFxuICAgICAgLy8gaHR0cHM6Ly9mZXRjaC5zcGVjLndoYXR3Zy5vcmcvI2h0dHAtd2hpdGVzcGFjZVxuICAgICAgY2hhciA9PiBIVFRQX1dISVRFU1BBQ0VfUkVHRVgudGVzdChjaGFyKSxcbiAgICAgIGlucHV0LFxuICAgICAgcG9zaXRpb25cbiAgICApXG5cbiAgICAvLyAzLiBMZXQgcGFyYW1ldGVyTmFtZSBiZSB0aGUgcmVzdWx0IG9mIGNvbGxlY3RpbmcgYVxuICAgIC8vIHNlcXVlbmNlIG9mIGNvZGUgcG9pbnRzIHRoYXQgYXJlIG5vdCBVKzAwM0IgKDspXG4gICAgLy8gb3IgVSswMDNEICg9KSBmcm9tIGlucHV0LCBnaXZlbiBwb3NpdGlvbi5cbiAgICBsZXQgcGFyYW1ldGVyTmFtZSA9IGNvbGxlY3RBU2VxdWVuY2VPZkNvZGVQb2ludHMoXG4gICAgICAoY2hhcikgPT4gY2hhciAhPT0gJzsnICYmIGNoYXIgIT09ICc9JyxcbiAgICAgIGlucHV0LFxuICAgICAgcG9zaXRpb25cbiAgICApXG5cbiAgICAvLyA0LiBTZXQgcGFyYW1ldGVyTmFtZSB0byBwYXJhbWV0ZXJOYW1lLCBpbiBBU0NJSVxuICAgIC8vIGxvd2VyY2FzZS5cbiAgICBwYXJhbWV0ZXJOYW1lID0gcGFyYW1ldGVyTmFtZS50b0xvd2VyQ2FzZSgpXG5cbiAgICAvLyA1LiBJZiBwb3NpdGlvbiBpcyBub3QgcGFzdCB0aGUgZW5kIG9mIGlucHV0LCB0aGVuOlxuICAgIGlmIChwb3NpdGlvbi5wb3NpdGlvbiA8IGlucHV0Lmxlbmd0aCkge1xuICAgICAgLy8gMS4gSWYgdGhlIGNvZGUgcG9pbnQgYXQgcG9zaXRpb24gd2l0aGluIGlucHV0IGlzXG4gICAgICAvLyBVKzAwM0IgKDspLCB0aGVuIGNvbnRpbnVlLlxuICAgICAgaWYgKGlucHV0W3Bvc2l0aW9uLnBvc2l0aW9uXSA9PT0gJzsnKSB7XG4gICAgICAgIGNvbnRpbnVlXG4gICAgICB9XG5cbiAgICAgIC8vIDIuIEFkdmFuY2UgcG9zaXRpb24gYnkgMS4gKFRoaXMgc2tpcHMgcGFzdCBVKzAwM0QgKD0pLilcbiAgICAgIHBvc2l0aW9uLnBvc2l0aW9uKytcbiAgICB9XG5cbiAgICAvLyA2LiBJZiBwb3NpdGlvbiBpcyBwYXN0IHRoZSBlbmQgb2YgaW5wdXQsIHRoZW4gYnJlYWsuXG4gICAgaWYgKHBvc2l0aW9uLnBvc2l0aW9uID4gaW5wdXQubGVuZ3RoKSB7XG4gICAgICBicmVha1xuICAgIH1cblxuICAgIC8vIDcuIExldCBwYXJhbWV0ZXJWYWx1ZSBiZSBudWxsLlxuICAgIGxldCBwYXJhbWV0ZXJWYWx1ZSA9IG51bGxcblxuICAgIC8vIDguIElmIHRoZSBjb2RlIHBvaW50IGF0IHBvc2l0aW9uIHdpdGhpbiBpbnB1dCBpc1xuICAgIC8vIFUrMDAyMiAoXCIpLCB0aGVuOlxuICAgIGlmIChpbnB1dFtwb3NpdGlvbi5wb3NpdGlvbl0gPT09ICdcIicpIHtcbiAgICAgIC8vIDEuIFNldCBwYXJhbWV0ZXJWYWx1ZSB0byB0aGUgcmVzdWx0IG9mIGNvbGxlY3RpbmdcbiAgICAgIC8vIGFuIEhUVFAgcXVvdGVkIHN0cmluZyBmcm9tIGlucHV0LCBnaXZlbiBwb3NpdGlvblxuICAgICAgLy8gYW5kIHRoZSBleHRyYWN0LXZhbHVlIGZsYWcuXG4gICAgICBwYXJhbWV0ZXJWYWx1ZSA9IGNvbGxlY3RBbkhUVFBRdW90ZWRTdHJpbmcoaW5wdXQsIHBvc2l0aW9uLCB0cnVlKVxuXG4gICAgICAvLyAyLiBDb2xsZWN0IGEgc2VxdWVuY2Ugb2YgY29kZSBwb2ludHMgdGhhdCBhcmUgbm90XG4gICAgICAvLyBVKzAwM0IgKDspIGZyb20gaW5wdXQsIGdpdmVuIHBvc2l0aW9uLlxuICAgICAgY29sbGVjdEFTZXF1ZW5jZU9mQ29kZVBvaW50c0Zhc3QoXG4gICAgICAgICc7JyxcbiAgICAgICAgaW5wdXQsXG4gICAgICAgIHBvc2l0aW9uXG4gICAgICApXG5cbiAgICAvLyA5LiBPdGhlcndpc2U6XG4gICAgfSBlbHNlIHtcbiAgICAgIC8vIDEuIFNldCBwYXJhbWV0ZXJWYWx1ZSB0byB0aGUgcmVzdWx0IG9mIGNvbGxlY3RpbmdcbiAgICAgIC8vIGEgc2VxdWVuY2Ugb2YgY29kZSBwb2ludHMgdGhhdCBhcmUgbm90IFUrMDAzQiAoOylcbiAgICAgIC8vIGZyb20gaW5wdXQsIGdpdmVuIHBvc2l0aW9uLlxuICAgICAgcGFyYW1ldGVyVmFsdWUgPSBjb2xsZWN0QVNlcXVlbmNlT2ZDb2RlUG9pbnRzRmFzdChcbiAgICAgICAgJzsnLFxuICAgICAgICBpbnB1dCxcbiAgICAgICAgcG9zaXRpb25cbiAgICAgIClcblxuICAgICAgLy8gMi4gUmVtb3ZlIGFueSB0cmFpbGluZyBIVFRQIHdoaXRlc3BhY2UgZnJvbSBwYXJhbWV0ZXJWYWx1ZS5cbiAgICAgIHBhcmFtZXRlclZhbHVlID0gcmVtb3ZlSFRUUFdoaXRlc3BhY2UocGFyYW1ldGVyVmFsdWUsIGZhbHNlLCB0cnVlKVxuXG4gICAgICAvLyAzLiBJZiBwYXJhbWV0ZXJWYWx1ZSBpcyB0aGUgZW1wdHkgc3RyaW5nLCB0aGVuIGNvbnRpbnVlLlxuICAgICAgaWYgKHBhcmFtZXRlclZhbHVlLmxlbmd0aCA9PT0gMCkge1xuICAgICAgICBjb250aW51ZVxuICAgICAgfVxuICAgIH1cblxuICAgIC8vIDEwLiBJZiBhbGwgb2YgdGhlIGZvbGxvd2luZyBhcmUgdHJ1ZVxuICAgIC8vIC0gcGFyYW1ldGVyTmFtZSBpcyBub3QgdGhlIGVtcHR5IHN0cmluZ1xuICAgIC8vIC0gcGFyYW1ldGVyTmFtZSBzb2xlbHkgY29udGFpbnMgSFRUUCB0b2tlbiBjb2RlIHBvaW50c1xuICAgIC8vIC0gcGFyYW1ldGVyVmFsdWUgc29sZWx5IGNvbnRhaW5zIEhUVFAgcXVvdGVkLXN0cmluZyB0b2tlbiBjb2RlIHBvaW50c1xuICAgIC8vIC0gbWltZVR5cGXigJlzIHBhcmFtZXRlcnNbcGFyYW1ldGVyTmFtZV0gZG9lcyBub3QgZXhpc3RcbiAgICAvLyB0aGVuIHNldCBtaW1lVHlwZeKAmXMgcGFyYW1ldGVyc1twYXJhbWV0ZXJOYW1lXSB0byBwYXJhbWV0ZXJWYWx1ZS5cbiAgICBpZiAoXG4gICAgICBwYXJhbWV0ZXJOYW1lLmxlbmd0aCAhPT0gMCAmJlxuICAgICAgSFRUUF9UT0tFTl9DT0RFUE9JTlRTLnRlc3QocGFyYW1ldGVyTmFtZSkgJiZcbiAgICAgIChwYXJhbWV0ZXJWYWx1ZS5sZW5ndGggPT09IDAgfHwgSFRUUF9RVU9URURfU1RSSU5HX1RPS0VOUy50ZXN0KHBhcmFtZXRlclZhbHVlKSkgJiZcbiAgICAgICFtaW1lVHlwZS5wYXJhbWV0ZXJzLmhhcyhwYXJhbWV0ZXJOYW1lKVxuICAgICkge1xuICAgICAgbWltZVR5cGUucGFyYW1ldGVycy5zZXQocGFyYW1ldGVyTmFtZSwgcGFyYW1ldGVyVmFsdWUpXG4gICAgfVxuICB9XG5cbiAgLy8gMTIuIFJldHVybiBtaW1lVHlwZS5cbiAgcmV0dXJuIG1pbWVUeXBlXG59XG5cbi8vIGh0dHBzOi8vaW5mcmEuc3BlYy53aGF0d2cub3JnLyNmb3JnaXZpbmctYmFzZTY0LWRlY29kZVxuLyoqIEBwYXJhbSB7c3RyaW5nfSBkYXRhICovXG5mdW5jdGlvbiBmb3JnaXZpbmdCYXNlNjQgKGRhdGEpIHtcbiAgLy8gMS4gUmVtb3ZlIGFsbCBBU0NJSSB3aGl0ZXNwYWNlIGZyb20gZGF0YS5cbiAgZGF0YSA9IGRhdGEucmVwbGFjZSgvW1xcdTAwMDlcXHUwMDBBXFx1MDAwQ1xcdTAwMERcXHUwMDIwXS9nLCAnJykgIC8vIGVzbGludC1kaXNhYmxlLWxpbmVcblxuICAvLyAyLiBJZiBkYXRh4oCZcyBjb2RlIHBvaW50IGxlbmd0aCBkaXZpZGVzIGJ5IDQgbGVhdmluZ1xuICAvLyBubyByZW1haW5kZXIsIHRoZW46XG4gIGlmIChkYXRhLmxlbmd0aCAlIDQgPT09IDApIHtcbiAgICAvLyAxLiBJZiBkYXRhIGVuZHMgd2l0aCBvbmUgb3IgdHdvIFUrMDAzRCAoPSkgY29kZSBwb2ludHMsXG4gICAgLy8gdGhlbiByZW1vdmUgdGhlbSBmcm9tIGRhdGEuXG4gICAgZGF0YSA9IGRhdGEucmVwbGFjZSgvPT89JC8sICcnKVxuICB9XG5cbiAgLy8gMy4gSWYgZGF0YeKAmXMgY29kZSBwb2ludCBsZW5ndGggZGl2aWRlcyBieSA0IGxlYXZpbmdcbiAgLy8gYSByZW1haW5kZXIgb2YgMSwgdGhlbiByZXR1cm4gZmFpbHVyZS5cbiAgaWYgKGRhdGEubGVuZ3RoICUgNCA9PT0gMSkge1xuICAgIHJldHVybiAnZmFpbHVyZSdcbiAgfVxuXG4gIC8vIDQuIElmIGRhdGEgY29udGFpbnMgYSBjb2RlIHBvaW50IHRoYXQgaXMgbm90IG9uZSBvZlxuICAvLyAgVSswMDJCICgrKVxuICAvLyAgVSswMDJGICgvKVxuICAvLyAgQVNDSUkgYWxwaGFudW1lcmljXG4gIC8vIHRoZW4gcmV0dXJuIGZhaWx1cmUuXG4gIGlmICgvW14rLzAtOUEtWmEtel0vLnRlc3QoZGF0YSkpIHtcbiAgICByZXR1cm4gJ2ZhaWx1cmUnXG4gIH1cblxuICBjb25zdCBiaW5hcnkgPSBhdG9iKGRhdGEpXG4gIGNvbnN0IGJ5dGVzID0gbmV3IFVpbnQ4QXJyYXkoYmluYXJ5Lmxlbmd0aClcblxuICBmb3IgKGxldCBieXRlID0gMDsgYnl0ZSA8IGJpbmFyeS5sZW5ndGg7IGJ5dGUrKykge1xuICAgIGJ5dGVzW2J5dGVdID0gYmluYXJ5LmNoYXJDb2RlQXQoYnl0ZSlcbiAgfVxuXG4gIHJldHVybiBieXRlc1xufVxuXG4vLyBodHRwczovL2ZldGNoLnNwZWMud2hhdHdnLm9yZy8jY29sbGVjdC1hbi1odHRwLXF1b3RlZC1zdHJpbmdcbi8vIHRlc3RzOiBodHRwczovL2ZldGNoLnNwZWMud2hhdHdnLm9yZy8jZXhhbXBsZS1odHRwLXF1b3RlZC1zdHJpbmdcbi8qKlxuICogQHBhcmFtIHtzdHJpbmd9IGlucHV0XG4gKiBAcGFyYW0ge3sgcG9zaXRpb246IG51bWJlciB9fSBwb3NpdGlvblxuICogQHBhcmFtIHtib29sZWFuP30gZXh0cmFjdFZhbHVlXG4gKi9cbmZ1bmN0aW9uIGNvbGxlY3RBbkhUVFBRdW90ZWRTdHJpbmcgKGlucHV0LCBwb3NpdGlvbiwgZXh0cmFjdFZhbHVlKSB7XG4gIC8vIDEuIExldCBwb3NpdGlvblN0YXJ0IGJlIHBvc2l0aW9uLlxuICBjb25zdCBwb3NpdGlvblN0YXJ0ID0gcG9zaXRpb24ucG9zaXRpb25cblxuICAvLyAyLiBMZXQgdmFsdWUgYmUgdGhlIGVtcHR5IHN0cmluZy5cbiAgbGV0IHZhbHVlID0gJydcblxuICAvLyAzLiBBc3NlcnQ6IHRoZSBjb2RlIHBvaW50IGF0IHBvc2l0aW9uIHdpdGhpbiBpbnB1dFxuICAvLyBpcyBVKzAwMjIgKFwiKS5cbiAgYXNzZXJ0KGlucHV0W3Bvc2l0aW9uLnBvc2l0aW9uXSA9PT0gJ1wiJylcblxuICAvLyA0LiBBZHZhbmNlIHBvc2l0aW9uIGJ5IDEuXG4gIHBvc2l0aW9uLnBvc2l0aW9uKytcblxuICAvLyA1LiBXaGlsZSB0cnVlOlxuICB3aGlsZSAodHJ1ZSkge1xuICAgIC8vIDEuIEFwcGVuZCB0aGUgcmVzdWx0IG9mIGNvbGxlY3RpbmcgYSBzZXF1ZW5jZSBvZiBjb2RlIHBvaW50c1xuICAgIC8vIHRoYXQgYXJlIG5vdCBVKzAwMjIgKFwiKSBvciBVKzAwNUMgKFxcKSBmcm9tIGlucHV0LCBnaXZlblxuICAgIC8vIHBvc2l0aW9uLCB0byB2YWx1ZS5cbiAgICB2YWx1ZSArPSBjb2xsZWN0QVNlcXVlbmNlT2ZDb2RlUG9pbnRzKFxuICAgICAgKGNoYXIpID0+IGNoYXIgIT09ICdcIicgJiYgY2hhciAhPT0gJ1xcXFwnLFxuICAgICAgaW5wdXQsXG4gICAgICBwb3NpdGlvblxuICAgIClcblxuICAgIC8vIDIuIElmIHBvc2l0aW9uIGlzIHBhc3QgdGhlIGVuZCBvZiBpbnB1dCwgdGhlbiBicmVhay5cbiAgICBpZiAocG9zaXRpb24ucG9zaXRpb24gPj0gaW5wdXQubGVuZ3RoKSB7XG4gICAgICBicmVha1xuICAgIH1cblxuICAgIC8vIDMuIExldCBxdW90ZU9yQmFja3NsYXNoIGJlIHRoZSBjb2RlIHBvaW50IGF0IHBvc2l0aW9uIHdpdGhpblxuICAgIC8vIGlucHV0LlxuICAgIGNvbnN0IHF1b3RlT3JCYWNrc2xhc2ggPSBpbnB1dFtwb3NpdGlvbi5wb3NpdGlvbl1cblxuICAgIC8vIDQuIEFkdmFuY2UgcG9zaXRpb24gYnkgMS5cbiAgICBwb3NpdGlvbi5wb3NpdGlvbisrXG5cbiAgICAvLyA1LiBJZiBxdW90ZU9yQmFja3NsYXNoIGlzIFUrMDA1QyAoXFwpLCB0aGVuOlxuICAgIGlmIChxdW90ZU9yQmFja3NsYXNoID09PSAnXFxcXCcpIHtcbiAgICAgIC8vIDEuIElmIHBvc2l0aW9uIGlzIHBhc3QgdGhlIGVuZCBvZiBpbnB1dCwgdGhlbiBhcHBlbmRcbiAgICAgIC8vIFUrMDA1QyAoXFwpIHRvIHZhbHVlIGFuZCBicmVhay5cbiAgICAgIGlmIChwb3NpdGlvbi5wb3NpdGlvbiA+PSBpbnB1dC5sZW5ndGgpIHtcbiAgICAgICAgdmFsdWUgKz0gJ1xcXFwnXG4gICAgICAgIGJyZWFrXG4gICAgICB9XG5cbiAgICAgIC8vIDIuIEFwcGVuZCB0aGUgY29kZSBwb2ludCBhdCBwb3NpdGlvbiB3aXRoaW4gaW5wdXQgdG8gdmFsdWUuXG4gICAgICB2YWx1ZSArPSBpbnB1dFtwb3NpdGlvbi5wb3NpdGlvbl1cblxuICAgICAgLy8gMy4gQWR2YW5jZSBwb3NpdGlvbiBieSAxLlxuICAgICAgcG9zaXRpb24ucG9zaXRpb24rK1xuXG4gICAgLy8gNi4gT3RoZXJ3aXNlOlxuICAgIH0gZWxzZSB7XG4gICAgICAvLyAxLiBBc3NlcnQ6IHF1b3RlT3JCYWNrc2xhc2ggaXMgVSswMDIyIChcIikuXG4gICAgICBhc3NlcnQocXVvdGVPckJhY2tzbGFzaCA9PT0gJ1wiJylcblxuICAgICAgLy8gMi4gQnJlYWsuXG4gICAgICBicmVha1xuICAgIH1cbiAgfVxuXG4gIC8vIDYuIElmIHRoZSBleHRyYWN0LXZhbHVlIGZsYWcgaXMgc2V0LCB0aGVuIHJldHVybiB2YWx1ZS5cbiAgaWYgKGV4dHJhY3RWYWx1ZSkge1xuICAgIHJldHVybiB2YWx1ZVxuICB9XG5cbiAgLy8gNy4gUmV0dXJuIHRoZSBjb2RlIHBvaW50cyBmcm9tIHBvc2l0aW9uU3RhcnQgdG8gcG9zaXRpb24sXG4gIC8vIGluY2x1c2l2ZSwgd2l0aGluIGlucHV0LlxuICByZXR1cm4gaW5wdXQuc2xpY2UocG9zaXRpb25TdGFydCwgcG9zaXRpb24ucG9zaXRpb24pXG59XG5cbi8qKlxuICogQHNlZSBodHRwczovL21pbWVzbmlmZi5zcGVjLndoYXR3Zy5vcmcvI3NlcmlhbGl6ZS1hLW1pbWUtdHlwZVxuICovXG5mdW5jdGlvbiBzZXJpYWxpemVBTWltZVR5cGUgKG1pbWVUeXBlKSB7XG4gIGFzc2VydChtaW1lVHlwZSAhPT0gJ2ZhaWx1cmUnKVxuICBjb25zdCB7IHBhcmFtZXRlcnMsIGVzc2VuY2UgfSA9IG1pbWVUeXBlXG5cbiAgLy8gMS4gTGV0IHNlcmlhbGl6YXRpb24gYmUgdGhlIGNvbmNhdGVuYXRpb24gb2YgbWltZVR5cGXigJlzXG4gIC8vICAgIHR5cGUsIFUrMDAyRiAoLyksIGFuZCBtaW1lVHlwZeKAmXMgc3VidHlwZS5cbiAgbGV0IHNlcmlhbGl6YXRpb24gPSBlc3NlbmNlXG5cbiAgLy8gMi4gRm9yIGVhY2ggbmFtZSDihpIgdmFsdWUgb2YgbWltZVR5cGXigJlzIHBhcmFtZXRlcnM6XG4gIGZvciAobGV0IFtuYW1lLCB2YWx1ZV0gb2YgcGFyYW1ldGVycy5lbnRyaWVzKCkpIHtcbiAgICAvLyAxLiBBcHBlbmQgVSswMDNCICg7KSB0byBzZXJpYWxpemF0aW9uLlxuICAgIHNlcmlhbGl6YXRpb24gKz0gJzsnXG5cbiAgICAvLyAyLiBBcHBlbmQgbmFtZSB0byBzZXJpYWxpemF0aW9uLlxuICAgIHNlcmlhbGl6YXRpb24gKz0gbmFtZVxuXG4gICAgLy8gMy4gQXBwZW5kIFUrMDAzRCAoPSkgdG8gc2VyaWFsaXphdGlvbi5cbiAgICBzZXJpYWxpemF0aW9uICs9ICc9J1xuXG4gICAgLy8gNC4gSWYgdmFsdWUgZG9lcyBub3Qgc29sZWx5IGNvbnRhaW4gSFRUUCB0b2tlbiBjb2RlXG4gICAgLy8gICAgcG9pbnRzIG9yIHZhbHVlIGlzIHRoZSBlbXB0eSBzdHJpbmcsIHRoZW46XG4gICAgaWYgKCFIVFRQX1RPS0VOX0NPREVQT0lOVFMudGVzdCh2YWx1ZSkpIHtcbiAgICAgIC8vIDEuIFByZWNlZGUgZWFjaCBvY2N1cmVuY2Ugb2YgVSswMDIyIChcIikgb3JcbiAgICAgIC8vICAgIFUrMDA1QyAoXFwpIGluIHZhbHVlIHdpdGggVSswMDVDIChcXCkuXG4gICAgICB2YWx1ZSA9IHZhbHVlLnJlcGxhY2UoLyhcXFxcfFwiKS9nLCAnXFxcXCQxJylcblxuICAgICAgLy8gMi4gUHJlcGVuZCBVKzAwMjIgKFwiKSB0byB2YWx1ZS5cbiAgICAgIHZhbHVlID0gJ1wiJyArIHZhbHVlXG5cbiAgICAgIC8vIDMuIEFwcGVuZCBVKzAwMjIgKFwiKSB0byB2YWx1ZS5cbiAgICAgIHZhbHVlICs9ICdcIidcbiAgICB9XG5cbiAgICAvLyA1LiBBcHBlbmQgdmFsdWUgdG8gc2VyaWFsaXphdGlvbi5cbiAgICBzZXJpYWxpemF0aW9uICs9IHZhbHVlXG4gIH1cblxuICAvLyAzLiBSZXR1cm4gc2VyaWFsaXphdGlvbi5cbiAgcmV0dXJuIHNlcmlhbGl6YXRpb25cbn1cblxuLyoqXG4gKiBAc2VlIGh0dHBzOi8vZmV0Y2guc3BlYy53aGF0d2cub3JnLyNodHRwLXdoaXRlc3BhY2VcbiAqIEBwYXJhbSB7c3RyaW5nfSBjaGFyXG4gKi9cbmZ1bmN0aW9uIGlzSFRUUFdoaXRlU3BhY2UgKGNoYXIpIHtcbiAgcmV0dXJuIGNoYXIgPT09ICdcXHInIHx8IGNoYXIgPT09ICdcXG4nIHx8IGNoYXIgPT09ICdcXHQnIHx8IGNoYXIgPT09ICcgJ1xufVxuXG4vKipcbiAqIEBzZWUgaHR0cHM6Ly9mZXRjaC5zcGVjLndoYXR3Zy5vcmcvI2h0dHAtd2hpdGVzcGFjZVxuICogQHBhcmFtIHtzdHJpbmd9IHN0clxuICovXG5mdW5jdGlvbiByZW1vdmVIVFRQV2hpdGVzcGFjZSAoc3RyLCBsZWFkaW5nID0gdHJ1ZSwgdHJhaWxpbmcgPSB0cnVlKSB7XG4gIGxldCBsZWFkID0gMFxuICBsZXQgdHJhaWwgPSBzdHIubGVuZ3RoIC0gMVxuXG4gIGlmIChsZWFkaW5nKSB7XG4gICAgZm9yICg7IGxlYWQgPCBzdHIubGVuZ3RoICYmIGlzSFRUUFdoaXRlU3BhY2Uoc3RyW2xlYWRdKTsgbGVhZCsrKTtcbiAgfVxuXG4gIGlmICh0cmFpbGluZykge1xuICAgIGZvciAoOyB0cmFpbCA+IDAgJiYgaXNIVFRQV2hpdGVTcGFjZShzdHJbdHJhaWxdKTsgdHJhaWwtLSk7XG4gIH1cblxuICByZXR1cm4gc3RyLnNsaWNlKGxlYWQsIHRyYWlsICsgMSlcbn1cblxuLyoqXG4gKiBAc2VlIGh0dHBzOi8vaW5mcmEuc3BlYy53aGF0d2cub3JnLyNhc2NpaS13aGl0ZXNwYWNlXG4gKiBAcGFyYW0ge3N0cmluZ30gY2hhclxuICovXG5mdW5jdGlvbiBpc0FTQ0lJV2hpdGVzcGFjZSAoY2hhcikge1xuICByZXR1cm4gY2hhciA9PT0gJ1xccicgfHwgY2hhciA9PT0gJ1xcbicgfHwgY2hhciA9PT0gJ1xcdCcgfHwgY2hhciA9PT0gJ1xcZicgfHwgY2hhciA9PT0gJyAnXG59XG5cbi8qKlxuICogQHNlZSBodHRwczovL2luZnJhLnNwZWMud2hhdHdnLm9yZy8jc3RyaXAtbGVhZGluZy1hbmQtdHJhaWxpbmctYXNjaWktd2hpdGVzcGFjZVxuICovXG5mdW5jdGlvbiByZW1vdmVBU0NJSVdoaXRlc3BhY2UgKHN0ciwgbGVhZGluZyA9IHRydWUsIHRyYWlsaW5nID0gdHJ1ZSkge1xuICBsZXQgbGVhZCA9IDBcbiAgbGV0IHRyYWlsID0gc3RyLmxlbmd0aCAtIDFcblxuICBpZiAobGVhZGluZykge1xuICAgIGZvciAoOyBsZWFkIDwgc3RyLmxlbmd0aCAmJiBpc0FTQ0lJV2hpdGVzcGFjZShzdHJbbGVhZF0pOyBsZWFkKyspO1xuICB9XG5cbiAgaWYgKHRyYWlsaW5nKSB7XG4gICAgZm9yICg7IHRyYWlsID4gMCAmJiBpc0FTQ0lJV2hpdGVzcGFjZShzdHJbdHJhaWxdKTsgdHJhaWwtLSk7XG4gIH1cblxuICByZXR1cm4gc3RyLnNsaWNlKGxlYWQsIHRyYWlsICsgMSlcbn1cblxubW9kdWxlLmV4cG9ydHMgPSB7XG4gIGRhdGFVUkxQcm9jZXNzb3IsXG4gIFVSTFNlcmlhbGl6ZXIsXG4gIGNvbGxlY3RBU2VxdWVuY2VPZkNvZGVQb2ludHMsXG4gIGNvbGxlY3RBU2VxdWVuY2VPZkNvZGVQb2ludHNGYXN0LFxuICBzdHJpbmdQZXJjZW50RGVjb2RlLFxuICBwYXJzZU1JTUVUeXBlLFxuICBjb2xsZWN0QW5IVFRQUXVvdGVkU3RyaW5nLFxuICBzZXJpYWxpemVBTWltZVR5cGVcbn1cbiIsCiAgICAiJ3VzZSBzdHJpY3QnXG5cbmNvbnN0IHsgQmxvYiwgRmlsZTogTmF0aXZlRmlsZSB9ID0gcmVxdWlyZSgnYnVmZmVyJylcbmNvbnN0IHsgdHlwZXMgfSA9IHJlcXVpcmUoJ3V0aWwnKVxuY29uc3QgeyBrU3RhdGUgfSA9IHJlcXVpcmUoJy4vc3ltYm9scycpXG5jb25zdCB7IGlzQmxvYkxpa2UgfSA9IHJlcXVpcmUoJy4vdXRpbCcpXG5jb25zdCB7IHdlYmlkbCB9ID0gcmVxdWlyZSgnLi93ZWJpZGwnKVxuY29uc3QgeyBwYXJzZU1JTUVUeXBlLCBzZXJpYWxpemVBTWltZVR5cGUgfSA9IHJlcXVpcmUoJy4vZGF0YVVSTCcpXG5jb25zdCB7IGtFbnVtZXJhYmxlUHJvcGVydHkgfSA9IHJlcXVpcmUoJy4uL2NvcmUvdXRpbCcpXG5jb25zdCBlbmNvZGVyID0gbmV3IFRleHRFbmNvZGVyKClcblxuY2xhc3MgRmlsZSBleHRlbmRzIEJsb2Ige1xuICBjb25zdHJ1Y3RvciAoZmlsZUJpdHMsIGZpbGVOYW1lLCBvcHRpb25zID0ge30pIHtcbiAgICAvLyBUaGUgRmlsZSBjb25zdHJ1Y3RvciBpcyBpbnZva2VkIHdpdGggdHdvIG9yIHRocmVlIHBhcmFtZXRlcnMsIGRlcGVuZGluZ1xuICAgIC8vIG9uIHdoZXRoZXIgdGhlIG9wdGlvbmFsIGRpY3Rpb25hcnkgcGFyYW1ldGVyIGlzIHVzZWQuIFdoZW4gdGhlIEZpbGUoKVxuICAgIC8vIGNvbnN0cnVjdG9yIGlzIGludm9rZWQsIHVzZXIgYWdlbnRzIG11c3QgcnVuIHRoZSBmb2xsb3dpbmcgc3RlcHM6XG4gICAgd2ViaWRsLmFyZ3VtZW50TGVuZ3RoQ2hlY2soYXJndW1lbnRzLCAyLCB7IGhlYWRlcjogJ0ZpbGUgY29uc3RydWN0b3InIH0pXG5cbiAgICBmaWxlQml0cyA9IHdlYmlkbC5jb252ZXJ0ZXJzWydzZXF1ZW5jZTxCbG9iUGFydD4nXShmaWxlQml0cylcbiAgICBmaWxlTmFtZSA9IHdlYmlkbC5jb252ZXJ0ZXJzLlVTVlN0cmluZyhmaWxlTmFtZSlcbiAgICBvcHRpb25zID0gd2ViaWRsLmNvbnZlcnRlcnMuRmlsZVByb3BlcnR5QmFnKG9wdGlvbnMpXG5cbiAgICAvLyAxLiBMZXQgYnl0ZXMgYmUgdGhlIHJlc3VsdCBvZiBwcm9jZXNzaW5nIGJsb2IgcGFydHMgZ2l2ZW4gZmlsZUJpdHMgYW5kXG4gICAgLy8gb3B0aW9ucy5cbiAgICAvLyBOb3RlOiBCbG9iIGhhbmRsZXMgdGhpcyBmb3IgdXNcblxuICAgIC8vIDIuIExldCBuIGJlIHRoZSBmaWxlTmFtZSBhcmd1bWVudCB0byB0aGUgY29uc3RydWN0b3IuXG4gICAgY29uc3QgbiA9IGZpbGVOYW1lXG5cbiAgICAvLyAzLiBQcm9jZXNzIEZpbGVQcm9wZXJ0eUJhZyBkaWN0aW9uYXJ5IGFyZ3VtZW50IGJ5IHJ1bm5pbmcgdGhlIGZvbGxvd2luZ1xuICAgIC8vIHN1YnN0ZXBzOlxuXG4gICAgLy8gICAgMS4gSWYgdGhlIHR5cGUgbWVtYmVyIGlzIHByb3ZpZGVkIGFuZCBpcyBub3QgdGhlIGVtcHR5IHN0cmluZywgbGV0IHRcbiAgICAvLyAgICBiZSBzZXQgdG8gdGhlIHR5cGUgZGljdGlvbmFyeSBtZW1iZXIuIElmIHQgY29udGFpbnMgYW55IGNoYXJhY3RlcnNcbiAgICAvLyAgICBvdXRzaWRlIHRoZSByYW5nZSBVKzAwMjAgdG8gVSswMDdFLCB0aGVuIHNldCB0IHRvIHRoZSBlbXB0eSBzdHJpbmdcbiAgICAvLyAgICBhbmQgcmV0dXJuIGZyb20gdGhlc2Ugc3Vic3RlcHMuXG4gICAgLy8gICAgMi4gQ29udmVydCBldmVyeSBjaGFyYWN0ZXIgaW4gdCB0byBBU0NJSSBsb3dlcmNhc2UuXG4gICAgbGV0IHQgPSBvcHRpb25zLnR5cGVcbiAgICBsZXQgZFxuXG4gICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLWxhYmVsc1xuICAgIHN1YnN0ZXA6IHtcbiAgICAgIGlmICh0KSB7XG4gICAgICAgIHQgPSBwYXJzZU1JTUVUeXBlKHQpXG5cbiAgICAgICAgaWYgKHQgPT09ICdmYWlsdXJlJykge1xuICAgICAgICAgIHQgPSAnJ1xuICAgICAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby1sYWJlbHNcbiAgICAgICAgICBicmVhayBzdWJzdGVwXG4gICAgICAgIH1cblxuICAgICAgICB0ID0gc2VyaWFsaXplQU1pbWVUeXBlKHQpLnRvTG93ZXJDYXNlKClcbiAgICAgIH1cblxuICAgICAgLy8gICAgMy4gSWYgdGhlIGxhc3RNb2RpZmllZCBtZW1iZXIgaXMgcHJvdmlkZWQsIGxldCBkIGJlIHNldCB0byB0aGVcbiAgICAgIC8vICAgIGxhc3RNb2RpZmllZCBkaWN0aW9uYXJ5IG1lbWJlci4gSWYgaXQgaXMgbm90IHByb3ZpZGVkLCBzZXQgZCB0byB0aGVcbiAgICAgIC8vICAgIGN1cnJlbnQgZGF0ZSBhbmQgdGltZSByZXByZXNlbnRlZCBhcyB0aGUgbnVtYmVyIG9mIG1pbGxpc2Vjb25kcyBzaW5jZVxuICAgICAgLy8gICAgdGhlIFVuaXggRXBvY2ggKHdoaWNoIGlzIHRoZSBlcXVpdmFsZW50IG9mIERhdGUubm93KCkgW0VDTUEtMjYyXSkuXG4gICAgICBkID0gb3B0aW9ucy5sYXN0TW9kaWZpZWRcbiAgICB9XG5cbiAgICAvLyA0LiBSZXR1cm4gYSBuZXcgRmlsZSBvYmplY3QgRiBzdWNoIHRoYXQ6XG4gICAgLy8gRiByZWZlcnMgdG8gdGhlIGJ5dGVzIGJ5dGUgc2VxdWVuY2UuXG4gICAgLy8gRi5zaXplIGlzIHNldCB0byB0aGUgbnVtYmVyIG9mIHRvdGFsIGJ5dGVzIGluIGJ5dGVzLlxuICAgIC8vIEYubmFtZSBpcyBzZXQgdG8gbi5cbiAgICAvLyBGLnR5cGUgaXMgc2V0IHRvIHQuXG4gICAgLy8gRi5sYXN0TW9kaWZpZWQgaXMgc2V0IHRvIGQuXG5cbiAgICBzdXBlcihwcm9jZXNzQmxvYlBhcnRzKGZpbGVCaXRzLCBvcHRpb25zKSwgeyB0eXBlOiB0IH0pXG4gICAgdGhpc1trU3RhdGVdID0ge1xuICAgICAgbmFtZTogbixcbiAgICAgIGxhc3RNb2RpZmllZDogZCxcbiAgICAgIHR5cGU6IHRcbiAgICB9XG4gIH1cblxuICBnZXQgbmFtZSAoKSB7XG4gICAgd2ViaWRsLmJyYW5kQ2hlY2sodGhpcywgRmlsZSlcblxuICAgIHJldHVybiB0aGlzW2tTdGF0ZV0ubmFtZVxuICB9XG5cbiAgZ2V0IGxhc3RNb2RpZmllZCAoKSB7XG4gICAgd2ViaWRsLmJyYW5kQ2hlY2sodGhpcywgRmlsZSlcblxuICAgIHJldHVybiB0aGlzW2tTdGF0ZV0ubGFzdE1vZGlmaWVkXG4gIH1cblxuICBnZXQgdHlwZSAoKSB7XG4gICAgd2ViaWRsLmJyYW5kQ2hlY2sodGhpcywgRmlsZSlcblxuICAgIHJldHVybiB0aGlzW2tTdGF0ZV0udHlwZVxuICB9XG59XG5cbmNsYXNzIEZpbGVMaWtlIHtcbiAgY29uc3RydWN0b3IgKGJsb2JMaWtlLCBmaWxlTmFtZSwgb3B0aW9ucyA9IHt9KSB7XG4gICAgLy8gVE9ETzogYXJndW1lbnQgaWRsIHR5cGUgY2hlY2tcblxuICAgIC8vIFRoZSBGaWxlIGNvbnN0cnVjdG9yIGlzIGludm9rZWQgd2l0aCB0d28gb3IgdGhyZWUgcGFyYW1ldGVycywgZGVwZW5kaW5nXG4gICAgLy8gb24gd2hldGhlciB0aGUgb3B0aW9uYWwgZGljdGlvbmFyeSBwYXJhbWV0ZXIgaXMgdXNlZC4gV2hlbiB0aGUgRmlsZSgpXG4gICAgLy8gY29uc3RydWN0b3IgaXMgaW52b2tlZCwgdXNlciBhZ2VudHMgbXVzdCBydW4gdGhlIGZvbGxvd2luZyBzdGVwczpcblxuICAgIC8vIDEuIExldCBieXRlcyBiZSB0aGUgcmVzdWx0IG9mIHByb2Nlc3NpbmcgYmxvYiBwYXJ0cyBnaXZlbiBmaWxlQml0cyBhbmRcbiAgICAvLyBvcHRpb25zLlxuXG4gICAgLy8gMi4gTGV0IG4gYmUgdGhlIGZpbGVOYW1lIGFyZ3VtZW50IHRvIHRoZSBjb25zdHJ1Y3Rvci5cbiAgICBjb25zdCBuID0gZmlsZU5hbWVcblxuICAgIC8vIDMuIFByb2Nlc3MgRmlsZVByb3BlcnR5QmFnIGRpY3Rpb25hcnkgYXJndW1lbnQgYnkgcnVubmluZyB0aGUgZm9sbG93aW5nXG4gICAgLy8gc3Vic3RlcHM6XG5cbiAgICAvLyAgICAxLiBJZiB0aGUgdHlwZSBtZW1iZXIgaXMgcHJvdmlkZWQgYW5kIGlzIG5vdCB0aGUgZW1wdHkgc3RyaW5nLCBsZXQgdFxuICAgIC8vICAgIGJlIHNldCB0byB0aGUgdHlwZSBkaWN0aW9uYXJ5IG1lbWJlci4gSWYgdCBjb250YWlucyBhbnkgY2hhcmFjdGVyc1xuICAgIC8vICAgIG91dHNpZGUgdGhlIHJhbmdlIFUrMDAyMCB0byBVKzAwN0UsIHRoZW4gc2V0IHQgdG8gdGhlIGVtcHR5IHN0cmluZ1xuICAgIC8vICAgIGFuZCByZXR1cm4gZnJvbSB0aGVzZSBzdWJzdGVwcy5cbiAgICAvLyAgICBUT0RPXG4gICAgY29uc3QgdCA9IG9wdGlvbnMudHlwZVxuXG4gICAgLy8gICAgMi4gQ29udmVydCBldmVyeSBjaGFyYWN0ZXIgaW4gdCB0byBBU0NJSSBsb3dlcmNhc2UuXG4gICAgLy8gICAgVE9ET1xuXG4gICAgLy8gICAgMy4gSWYgdGhlIGxhc3RNb2RpZmllZCBtZW1iZXIgaXMgcHJvdmlkZWQsIGxldCBkIGJlIHNldCB0byB0aGVcbiAgICAvLyAgICBsYXN0TW9kaWZpZWQgZGljdGlvbmFyeSBtZW1iZXIuIElmIGl0IGlzIG5vdCBwcm92aWRlZCwgc2V0IGQgdG8gdGhlXG4gICAgLy8gICAgY3VycmVudCBkYXRlIGFuZCB0aW1lIHJlcHJlc2VudGVkIGFzIHRoZSBudW1iZXIgb2YgbWlsbGlzZWNvbmRzIHNpbmNlXG4gICAgLy8gICAgdGhlIFVuaXggRXBvY2ggKHdoaWNoIGlzIHRoZSBlcXVpdmFsZW50IG9mIERhdGUubm93KCkgW0VDTUEtMjYyXSkuXG4gICAgY29uc3QgZCA9IG9wdGlvbnMubGFzdE1vZGlmaWVkID8/IERhdGUubm93KClcblxuICAgIC8vIDQuIFJldHVybiBhIG5ldyBGaWxlIG9iamVjdCBGIHN1Y2ggdGhhdDpcbiAgICAvLyBGIHJlZmVycyB0byB0aGUgYnl0ZXMgYnl0ZSBzZXF1ZW5jZS5cbiAgICAvLyBGLnNpemUgaXMgc2V0IHRvIHRoZSBudW1iZXIgb2YgdG90YWwgYnl0ZXMgaW4gYnl0ZXMuXG4gICAgLy8gRi5uYW1lIGlzIHNldCB0byBuLlxuICAgIC8vIEYudHlwZSBpcyBzZXQgdG8gdC5cbiAgICAvLyBGLmxhc3RNb2RpZmllZCBpcyBzZXQgdG8gZC5cblxuICAgIHRoaXNba1N0YXRlXSA9IHtcbiAgICAgIGJsb2JMaWtlLFxuICAgICAgbmFtZTogbixcbiAgICAgIHR5cGU6IHQsXG4gICAgICBsYXN0TW9kaWZpZWQ6IGRcbiAgICB9XG4gIH1cblxuICBzdHJlYW0gKC4uLmFyZ3MpIHtcbiAgICB3ZWJpZGwuYnJhbmRDaGVjayh0aGlzLCBGaWxlTGlrZSlcblxuICAgIHJldHVybiB0aGlzW2tTdGF0ZV0uYmxvYkxpa2Uuc3RyZWFtKC4uLmFyZ3MpXG4gIH1cblxuICBhcnJheUJ1ZmZlciAoLi4uYXJncykge1xuICAgIHdlYmlkbC5icmFuZENoZWNrKHRoaXMsIEZpbGVMaWtlKVxuXG4gICAgcmV0dXJuIHRoaXNba1N0YXRlXS5ibG9iTGlrZS5hcnJheUJ1ZmZlciguLi5hcmdzKVxuICB9XG5cbiAgc2xpY2UgKC4uLmFyZ3MpIHtcbiAgICB3ZWJpZGwuYnJhbmRDaGVjayh0aGlzLCBGaWxlTGlrZSlcblxuICAgIHJldHVybiB0aGlzW2tTdGF0ZV0uYmxvYkxpa2Uuc2xpY2UoLi4uYXJncylcbiAgfVxuXG4gIHRleHQgKC4uLmFyZ3MpIHtcbiAgICB3ZWJpZGwuYnJhbmRDaGVjayh0aGlzLCBGaWxlTGlrZSlcblxuICAgIHJldHVybiB0aGlzW2tTdGF0ZV0uYmxvYkxpa2UudGV4dCguLi5hcmdzKVxuICB9XG5cbiAgZ2V0IHNpemUgKCkge1xuICAgIHdlYmlkbC5icmFuZENoZWNrKHRoaXMsIEZpbGVMaWtlKVxuXG4gICAgcmV0dXJuIHRoaXNba1N0YXRlXS5ibG9iTGlrZS5zaXplXG4gIH1cblxuICBnZXQgdHlwZSAoKSB7XG4gICAgd2ViaWRsLmJyYW5kQ2hlY2sodGhpcywgRmlsZUxpa2UpXG5cbiAgICByZXR1cm4gdGhpc1trU3RhdGVdLmJsb2JMaWtlLnR5cGVcbiAgfVxuXG4gIGdldCBuYW1lICgpIHtcbiAgICB3ZWJpZGwuYnJhbmRDaGVjayh0aGlzLCBGaWxlTGlrZSlcblxuICAgIHJldHVybiB0aGlzW2tTdGF0ZV0ubmFtZVxuICB9XG5cbiAgZ2V0IGxhc3RNb2RpZmllZCAoKSB7XG4gICAgd2ViaWRsLmJyYW5kQ2hlY2sodGhpcywgRmlsZUxpa2UpXG5cbiAgICByZXR1cm4gdGhpc1trU3RhdGVdLmxhc3RNb2RpZmllZFxuICB9XG5cbiAgZ2V0IFtTeW1ib2wudG9TdHJpbmdUYWddICgpIHtcbiAgICByZXR1cm4gJ0ZpbGUnXG4gIH1cbn1cblxuT2JqZWN0LmRlZmluZVByb3BlcnRpZXMoRmlsZS5wcm90b3R5cGUsIHtcbiAgW1N5bWJvbC50b1N0cmluZ1RhZ106IHtcbiAgICB2YWx1ZTogJ0ZpbGUnLFxuICAgIGNvbmZpZ3VyYWJsZTogdHJ1ZVxuICB9LFxuICBuYW1lOiBrRW51bWVyYWJsZVByb3BlcnR5LFxuICBsYXN0TW9kaWZpZWQ6IGtFbnVtZXJhYmxlUHJvcGVydHlcbn0pXG5cbndlYmlkbC5jb252ZXJ0ZXJzLkJsb2IgPSB3ZWJpZGwuaW50ZXJmYWNlQ29udmVydGVyKEJsb2IpXG5cbndlYmlkbC5jb252ZXJ0ZXJzLkJsb2JQYXJ0ID0gZnVuY3Rpb24gKFYsIG9wdHMpIHtcbiAgaWYgKHdlYmlkbC51dGlsLlR5cGUoVikgPT09ICdPYmplY3QnKSB7XG4gICAgaWYgKGlzQmxvYkxpa2UoVikpIHtcbiAgICAgIHJldHVybiB3ZWJpZGwuY29udmVydGVycy5CbG9iKFYsIHsgc3RyaWN0OiBmYWxzZSB9KVxuICAgIH1cblxuICAgIGlmIChcbiAgICAgIEFycmF5QnVmZmVyLmlzVmlldyhWKSB8fFxuICAgICAgdHlwZXMuaXNBbnlBcnJheUJ1ZmZlcihWKVxuICAgICkge1xuICAgICAgcmV0dXJuIHdlYmlkbC5jb252ZXJ0ZXJzLkJ1ZmZlclNvdXJjZShWLCBvcHRzKVxuICAgIH1cbiAgfVxuXG4gIHJldHVybiB3ZWJpZGwuY29udmVydGVycy5VU1ZTdHJpbmcoViwgb3B0cylcbn1cblxud2ViaWRsLmNvbnZlcnRlcnNbJ3NlcXVlbmNlPEJsb2JQYXJ0PiddID0gd2ViaWRsLnNlcXVlbmNlQ29udmVydGVyKFxuICB3ZWJpZGwuY29udmVydGVycy5CbG9iUGFydFxuKVxuXG4vLyBodHRwczovL3d3dy53My5vcmcvVFIvRmlsZUFQSS8jZGZuLUZpbGVQcm9wZXJ0eUJhZ1xud2ViaWRsLmNvbnZlcnRlcnMuRmlsZVByb3BlcnR5QmFnID0gd2ViaWRsLmRpY3Rpb25hcnlDb252ZXJ0ZXIoW1xuICB7XG4gICAga2V5OiAnbGFzdE1vZGlmaWVkJyxcbiAgICBjb252ZXJ0ZXI6IHdlYmlkbC5jb252ZXJ0ZXJzWydsb25nIGxvbmcnXSxcbiAgICBnZXQgZGVmYXVsdFZhbHVlICgpIHtcbiAgICAgIHJldHVybiBEYXRlLm5vdygpXG4gICAgfVxuICB9LFxuICB7XG4gICAga2V5OiAndHlwZScsXG4gICAgY29udmVydGVyOiB3ZWJpZGwuY29udmVydGVycy5ET01TdHJpbmcsXG4gICAgZGVmYXVsdFZhbHVlOiAnJ1xuICB9LFxuICB7XG4gICAga2V5OiAnZW5kaW5ncycsXG4gICAgY29udmVydGVyOiAodmFsdWUpID0+IHtcbiAgICAgIHZhbHVlID0gd2ViaWRsLmNvbnZlcnRlcnMuRE9NU3RyaW5nKHZhbHVlKVxuICAgICAgdmFsdWUgPSB2YWx1ZS50b0xvd2VyQ2FzZSgpXG5cbiAgICAgIGlmICh2YWx1ZSAhPT0gJ25hdGl2ZScpIHtcbiAgICAgICAgdmFsdWUgPSAndHJhbnNwYXJlbnQnXG4gICAgICB9XG5cbiAgICAgIHJldHVybiB2YWx1ZVxuICAgIH0sXG4gICAgZGVmYXVsdFZhbHVlOiAndHJhbnNwYXJlbnQnXG4gIH1cbl0pXG5cbi8qKlxuICogQHNlZSBodHRwczovL3d3dy53My5vcmcvVFIvRmlsZUFQSS8jcHJvY2Vzcy1ibG9iLXBhcnRzXG4gKiBAcGFyYW0geyhOb2RlSlMuVHlwZWRBcnJheXxCbG9ifHN0cmluZylbXX0gcGFydHNcbiAqIEBwYXJhbSB7eyB0eXBlOiBzdHJpbmcsIGVuZGluZ3M6IHN0cmluZyB9fSBvcHRpb25zXG4gKi9cbmZ1bmN0aW9uIHByb2Nlc3NCbG9iUGFydHMgKHBhcnRzLCBvcHRpb25zKSB7XG4gIC8vIDEuIExldCBieXRlcyBiZSBhbiBlbXB0eSBzZXF1ZW5jZSBvZiBieXRlcy5cbiAgLyoqIEB0eXBlIHtOb2RlSlMuVHlwZWRBcnJheVtdfSAqL1xuICBjb25zdCBieXRlcyA9IFtdXG5cbiAgLy8gMi4gRm9yIGVhY2ggZWxlbWVudCBpbiBwYXJ0czpcbiAgZm9yIChjb25zdCBlbGVtZW50IG9mIHBhcnRzKSB7XG4gICAgLy8gMS4gSWYgZWxlbWVudCBpcyBhIFVTVlN0cmluZywgcnVuIHRoZSBmb2xsb3dpbmcgc3Vic3RlcHM6XG4gICAgaWYgKHR5cGVvZiBlbGVtZW50ID09PSAnc3RyaW5nJykge1xuICAgICAgLy8gMS4gTGV0IHMgYmUgZWxlbWVudC5cbiAgICAgIGxldCBzID0gZWxlbWVudFxuXG4gICAgICAvLyAyLiBJZiB0aGUgZW5kaW5ncyBtZW1iZXIgb2Ygb3B0aW9ucyBpcyBcIm5hdGl2ZVwiLCBzZXQgc1xuICAgICAgLy8gICAgdG8gdGhlIHJlc3VsdCBvZiBjb252ZXJ0aW5nIGxpbmUgZW5kaW5ncyB0byBuYXRpdmVcbiAgICAgIC8vICAgIG9mIGVsZW1lbnQuXG4gICAgICBpZiAob3B0aW9ucy5lbmRpbmdzID09PSAnbmF0aXZlJykge1xuICAgICAgICBzID0gY29udmVydExpbmVFbmRpbmdzTmF0aXZlKHMpXG4gICAgICB9XG5cbiAgICAgIC8vIDMuIEFwcGVuZCB0aGUgcmVzdWx0IG9mIFVURi04IGVuY29kaW5nIHMgdG8gYnl0ZXMuXG4gICAgICBieXRlcy5wdXNoKGVuY29kZXIuZW5jb2RlKHMpKVxuICAgIH0gZWxzZSBpZiAoXG4gICAgICB0eXBlcy5pc0FueUFycmF5QnVmZmVyKGVsZW1lbnQpIHx8XG4gICAgICB0eXBlcy5pc1R5cGVkQXJyYXkoZWxlbWVudClcbiAgICApIHtcbiAgICAgIC8vIDIuIElmIGVsZW1lbnQgaXMgYSBCdWZmZXJTb3VyY2UsIGdldCBhIGNvcHkgb2YgdGhlXG4gICAgICAvLyAgICBieXRlcyBoZWxkIGJ5IHRoZSBidWZmZXIgc291cmNlLCBhbmQgYXBwZW5kIHRob3NlXG4gICAgICAvLyAgICBieXRlcyB0byBieXRlcy5cbiAgICAgIGlmICghZWxlbWVudC5idWZmZXIpIHsgLy8gQXJyYXlCdWZmZXJcbiAgICAgICAgYnl0ZXMucHVzaChuZXcgVWludDhBcnJheShlbGVtZW50KSlcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGJ5dGVzLnB1c2goXG4gICAgICAgICAgbmV3IFVpbnQ4QXJyYXkoZWxlbWVudC5idWZmZXIsIGVsZW1lbnQuYnl0ZU9mZnNldCwgZWxlbWVudC5ieXRlTGVuZ3RoKVxuICAgICAgICApXG4gICAgICB9XG4gICAgfSBlbHNlIGlmIChpc0Jsb2JMaWtlKGVsZW1lbnQpKSB7XG4gICAgICAvLyAzLiBJZiBlbGVtZW50IGlzIGEgQmxvYiwgYXBwZW5kIHRoZSBieXRlcyBpdCByZXByZXNlbnRzXG4gICAgICAvLyAgICB0byBieXRlcy5cbiAgICAgIGJ5dGVzLnB1c2goZWxlbWVudClcbiAgICB9XG4gIH1cblxuICAvLyAzLiBSZXR1cm4gYnl0ZXMuXG4gIHJldHVybiBieXRlc1xufVxuXG4vKipcbiAqIEBzZWUgaHR0cHM6Ly93d3cudzMub3JnL1RSL0ZpbGVBUEkvI2NvbnZlcnQtbGluZS1lbmRpbmdzLXRvLW5hdGl2ZVxuICogQHBhcmFtIHtzdHJpbmd9IHNcbiAqL1xuZnVuY3Rpb24gY29udmVydExpbmVFbmRpbmdzTmF0aXZlIChzKSB7XG4gIC8vIDEuIExldCBuYXRpdmUgbGluZSBlbmRpbmcgYmUgYmUgdGhlIGNvZGUgcG9pbnQgVSswMDBBIExGLlxuICBsZXQgbmF0aXZlTGluZUVuZGluZyA9ICdcXG4nXG5cbiAgLy8gMi4gSWYgdGhlIHVuZGVybHlpbmcgcGxhdGZvcm3igJlzIGNvbnZlbnRpb25zIGFyZSB0b1xuICAvLyAgICByZXByZXNlbnQgbmV3bGluZXMgYXMgYSBjYXJyaWFnZSByZXR1cm4gYW5kIGxpbmUgZmVlZFxuICAvLyAgICBzZXF1ZW5jZSwgc2V0IG5hdGl2ZSBsaW5lIGVuZGluZyB0byB0aGUgY29kZSBwb2ludFxuICAvLyAgICBVKzAwMEQgQ1IgZm9sbG93ZWQgYnkgdGhlIGNvZGUgcG9pbnQgVSswMDBBIExGLlxuICBpZiAocHJvY2Vzcy5wbGF0Zm9ybSA9PT0gJ3dpbjMyJykge1xuICAgIG5hdGl2ZUxpbmVFbmRpbmcgPSAnXFxyXFxuJ1xuICB9XG5cbiAgcmV0dXJuIHMucmVwbGFjZSgvXFxyP1xcbi9nLCBuYXRpdmVMaW5lRW5kaW5nKVxufVxuXG4vLyBJZiB0aGlzIGZ1bmN0aW9uIGlzIG1vdmVkIHRvIC4vdXRpbC5qcywgc29tZSB0b29scyAoc3VjaCBhc1xuLy8gcm9sbHVwKSB3aWxsIHdhcm4gYWJvdXQgY2lyY3VsYXIgZGVwZW5kZW5jaWVzLiBTZWU6XG4vLyBodHRwczovL2dpdGh1Yi5jb20vbm9kZWpzL3VuZGljaS9pc3N1ZXMvMTYyOVxuZnVuY3Rpb24gaXNGaWxlTGlrZSAob2JqZWN0KSB7XG4gIHJldHVybiAoXG4gICAgKE5hdGl2ZUZpbGUgJiYgb2JqZWN0IGluc3RhbmNlb2YgTmF0aXZlRmlsZSkgfHxcbiAgICBvYmplY3QgaW5zdGFuY2VvZiBGaWxlIHx8IChcbiAgICAgIG9iamVjdCAmJlxuICAgICAgKHR5cGVvZiBvYmplY3Quc3RyZWFtID09PSAnZnVuY3Rpb24nIHx8XG4gICAgICB0eXBlb2Ygb2JqZWN0LmFycmF5QnVmZmVyID09PSAnZnVuY3Rpb24nKSAmJlxuICAgICAgb2JqZWN0W1N5bWJvbC50b1N0cmluZ1RhZ10gPT09ICdGaWxlJ1xuICAgIClcbiAgKVxufVxuXG5tb2R1bGUuZXhwb3J0cyA9IHsgRmlsZSwgRmlsZUxpa2UsIGlzRmlsZUxpa2UgfVxuIiwKICAgICIndXNlIHN0cmljdCdcblxuY29uc3QgeyBpc0Jsb2JMaWtlLCB0b1VTVlN0cmluZywgbWFrZUl0ZXJhdG9yIH0gPSByZXF1aXJlKCcuL3V0aWwnKVxuY29uc3QgeyBrU3RhdGUgfSA9IHJlcXVpcmUoJy4vc3ltYm9scycpXG5jb25zdCB7IEZpbGU6IFVuZGljaUZpbGUsIEZpbGVMaWtlLCBpc0ZpbGVMaWtlIH0gPSByZXF1aXJlKCcuL2ZpbGUnKVxuY29uc3QgeyB3ZWJpZGwgfSA9IHJlcXVpcmUoJy4vd2ViaWRsJylcbmNvbnN0IHsgQmxvYiwgRmlsZTogTmF0aXZlRmlsZSB9ID0gcmVxdWlyZSgnYnVmZmVyJylcblxuLyoqIEB0eXBlIHtnbG9iYWxUaGlzWydGaWxlJ119ICovXG5jb25zdCBGaWxlID0gTmF0aXZlRmlsZSA/PyBVbmRpY2lGaWxlXG5cbi8vIGh0dHBzOi8veGhyLnNwZWMud2hhdHdnLm9yZy8jZm9ybWRhdGFcbmNsYXNzIEZvcm1EYXRhIHtcbiAgY29uc3RydWN0b3IgKGZvcm0pIHtcbiAgICBpZiAoZm9ybSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICB0aHJvdyB3ZWJpZGwuZXJyb3JzLmNvbnZlcnNpb25GYWlsZWQoe1xuICAgICAgICBwcmVmaXg6ICdGb3JtRGF0YSBjb25zdHJ1Y3RvcicsXG4gICAgICAgIGFyZ3VtZW50OiAnQXJndW1lbnQgMScsXG4gICAgICAgIHR5cGVzOiBbJ3VuZGVmaW5lZCddXG4gICAgICB9KVxuICAgIH1cblxuICAgIHRoaXNba1N0YXRlXSA9IFtdXG4gIH1cblxuICBhcHBlbmQgKG5hbWUsIHZhbHVlLCBmaWxlbmFtZSA9IHVuZGVmaW5lZCkge1xuICAgIHdlYmlkbC5icmFuZENoZWNrKHRoaXMsIEZvcm1EYXRhKVxuXG4gICAgd2ViaWRsLmFyZ3VtZW50TGVuZ3RoQ2hlY2soYXJndW1lbnRzLCAyLCB7IGhlYWRlcjogJ0Zvcm1EYXRhLmFwcGVuZCcgfSlcblxuICAgIGlmIChhcmd1bWVudHMubGVuZ3RoID09PSAzICYmICFpc0Jsb2JMaWtlKHZhbHVlKSkge1xuICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcihcbiAgICAgICAgXCJGYWlsZWQgdG8gZXhlY3V0ZSAnYXBwZW5kJyBvbiAnRm9ybURhdGEnOiBwYXJhbWV0ZXIgMiBpcyBub3Qgb2YgdHlwZSAnQmxvYidcIlxuICAgICAgKVxuICAgIH1cblxuICAgIC8vIDEuIExldCB2YWx1ZSBiZSB2YWx1ZSBpZiBnaXZlbjsgb3RoZXJ3aXNlIGJsb2JWYWx1ZS5cblxuICAgIG5hbWUgPSB3ZWJpZGwuY29udmVydGVycy5VU1ZTdHJpbmcobmFtZSlcbiAgICB2YWx1ZSA9IGlzQmxvYkxpa2UodmFsdWUpXG4gICAgICA/IHdlYmlkbC5jb252ZXJ0ZXJzLkJsb2IodmFsdWUsIHsgc3RyaWN0OiBmYWxzZSB9KVxuICAgICAgOiB3ZWJpZGwuY29udmVydGVycy5VU1ZTdHJpbmcodmFsdWUpXG4gICAgZmlsZW5hbWUgPSBhcmd1bWVudHMubGVuZ3RoID09PSAzXG4gICAgICA/IHdlYmlkbC5jb252ZXJ0ZXJzLlVTVlN0cmluZyhmaWxlbmFtZSlcbiAgICAgIDogdW5kZWZpbmVkXG5cbiAgICAvLyAyLiBMZXQgZW50cnkgYmUgdGhlIHJlc3VsdCBvZiBjcmVhdGluZyBhbiBlbnRyeSB3aXRoXG4gICAgLy8gbmFtZSwgdmFsdWUsIGFuZCBmaWxlbmFtZSBpZiBnaXZlbi5cbiAgICBjb25zdCBlbnRyeSA9IG1ha2VFbnRyeShuYW1lLCB2YWx1ZSwgZmlsZW5hbWUpXG5cbiAgICAvLyAzLiBBcHBlbmQgZW50cnkgdG8gdGhpc+KAmXMgZW50cnkgbGlzdC5cbiAgICB0aGlzW2tTdGF0ZV0ucHVzaChlbnRyeSlcbiAgfVxuXG4gIGRlbGV0ZSAobmFtZSkge1xuICAgIHdlYmlkbC5icmFuZENoZWNrKHRoaXMsIEZvcm1EYXRhKVxuXG4gICAgd2ViaWRsLmFyZ3VtZW50TGVuZ3RoQ2hlY2soYXJndW1lbnRzLCAxLCB7IGhlYWRlcjogJ0Zvcm1EYXRhLmRlbGV0ZScgfSlcblxuICAgIG5hbWUgPSB3ZWJpZGwuY29udmVydGVycy5VU1ZTdHJpbmcobmFtZSlcblxuICAgIC8vIFRoZSBkZWxldGUobmFtZSkgbWV0aG9kIHN0ZXBzIGFyZSB0byByZW1vdmUgYWxsIGVudHJpZXMgd2hvc2UgbmFtZVxuICAgIC8vIGlzIG5hbWUgZnJvbSB0aGlz4oCZcyBlbnRyeSBsaXN0LlxuICAgIHRoaXNba1N0YXRlXSA9IHRoaXNba1N0YXRlXS5maWx0ZXIoZW50cnkgPT4gZW50cnkubmFtZSAhPT0gbmFtZSlcbiAgfVxuXG4gIGdldCAobmFtZSkge1xuICAgIHdlYmlkbC5icmFuZENoZWNrKHRoaXMsIEZvcm1EYXRhKVxuXG4gICAgd2ViaWRsLmFyZ3VtZW50TGVuZ3RoQ2hlY2soYXJndW1lbnRzLCAxLCB7IGhlYWRlcjogJ0Zvcm1EYXRhLmdldCcgfSlcblxuICAgIG5hbWUgPSB3ZWJpZGwuY29udmVydGVycy5VU1ZTdHJpbmcobmFtZSlcblxuICAgIC8vIDEuIElmIHRoZXJlIGlzIG5vIGVudHJ5IHdob3NlIG5hbWUgaXMgbmFtZSBpbiB0aGlz4oCZcyBlbnRyeSBsaXN0LFxuICAgIC8vIHRoZW4gcmV0dXJuIG51bGwuXG4gICAgY29uc3QgaWR4ID0gdGhpc1trU3RhdGVdLmZpbmRJbmRleCgoZW50cnkpID0+IGVudHJ5Lm5hbWUgPT09IG5hbWUpXG4gICAgaWYgKGlkeCA9PT0gLTEpIHtcbiAgICAgIHJldHVybiBudWxsXG4gICAgfVxuXG4gICAgLy8gMi4gUmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgZmlyc3QgZW50cnkgd2hvc2UgbmFtZSBpcyBuYW1lIGZyb21cbiAgICAvLyB0aGlz4oCZcyBlbnRyeSBsaXN0LlxuICAgIHJldHVybiB0aGlzW2tTdGF0ZV1baWR4XS52YWx1ZVxuICB9XG5cbiAgZ2V0QWxsIChuYW1lKSB7XG4gICAgd2ViaWRsLmJyYW5kQ2hlY2sodGhpcywgRm9ybURhdGEpXG5cbiAgICB3ZWJpZGwuYXJndW1lbnRMZW5ndGhDaGVjayhhcmd1bWVudHMsIDEsIHsgaGVhZGVyOiAnRm9ybURhdGEuZ2V0QWxsJyB9KVxuXG4gICAgbmFtZSA9IHdlYmlkbC5jb252ZXJ0ZXJzLlVTVlN0cmluZyhuYW1lKVxuXG4gICAgLy8gMS4gSWYgdGhlcmUgaXMgbm8gZW50cnkgd2hvc2UgbmFtZSBpcyBuYW1lIGluIHRoaXPigJlzIGVudHJ5IGxpc3QsXG4gICAgLy8gdGhlbiByZXR1cm4gdGhlIGVtcHR5IGxpc3QuXG4gICAgLy8gMi4gUmV0dXJuIHRoZSB2YWx1ZXMgb2YgYWxsIGVudHJpZXMgd2hvc2UgbmFtZSBpcyBuYW1lLCBpbiBvcmRlcixcbiAgICAvLyBmcm9tIHRoaXPigJlzIGVudHJ5IGxpc3QuXG4gICAgcmV0dXJuIHRoaXNba1N0YXRlXVxuICAgICAgLmZpbHRlcigoZW50cnkpID0+IGVudHJ5Lm5hbWUgPT09IG5hbWUpXG4gICAgICAubWFwKChlbnRyeSkgPT4gZW50cnkudmFsdWUpXG4gIH1cblxuICBoYXMgKG5hbWUpIHtcbiAgICB3ZWJpZGwuYnJhbmRDaGVjayh0aGlzLCBGb3JtRGF0YSlcblxuICAgIHdlYmlkbC5hcmd1bWVudExlbmd0aENoZWNrKGFyZ3VtZW50cywgMSwgeyBoZWFkZXI6ICdGb3JtRGF0YS5oYXMnIH0pXG5cbiAgICBuYW1lID0gd2ViaWRsLmNvbnZlcnRlcnMuVVNWU3RyaW5nKG5hbWUpXG5cbiAgICAvLyBUaGUgaGFzKG5hbWUpIG1ldGhvZCBzdGVwcyBhcmUgdG8gcmV0dXJuIHRydWUgaWYgdGhlcmUgaXMgYW4gZW50cnlcbiAgICAvLyB3aG9zZSBuYW1lIGlzIG5hbWUgaW4gdGhpc+KAmXMgZW50cnkgbGlzdDsgb3RoZXJ3aXNlIGZhbHNlLlxuICAgIHJldHVybiB0aGlzW2tTdGF0ZV0uZmluZEluZGV4KChlbnRyeSkgPT4gZW50cnkubmFtZSA9PT0gbmFtZSkgIT09IC0xXG4gIH1cblxuICBzZXQgKG5hbWUsIHZhbHVlLCBmaWxlbmFtZSA9IHVuZGVmaW5lZCkge1xuICAgIHdlYmlkbC5icmFuZENoZWNrKHRoaXMsIEZvcm1EYXRhKVxuXG4gICAgd2ViaWRsLmFyZ3VtZW50TGVuZ3RoQ2hlY2soYXJndW1lbnRzLCAyLCB7IGhlYWRlcjogJ0Zvcm1EYXRhLnNldCcgfSlcblxuICAgIGlmIChhcmd1bWVudHMubGVuZ3RoID09PSAzICYmICFpc0Jsb2JMaWtlKHZhbHVlKSkge1xuICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcihcbiAgICAgICAgXCJGYWlsZWQgdG8gZXhlY3V0ZSAnc2V0JyBvbiAnRm9ybURhdGEnOiBwYXJhbWV0ZXIgMiBpcyBub3Qgb2YgdHlwZSAnQmxvYidcIlxuICAgICAgKVxuICAgIH1cblxuICAgIC8vIFRoZSBzZXQobmFtZSwgdmFsdWUpIGFuZCBzZXQobmFtZSwgYmxvYlZhbHVlLCBmaWxlbmFtZSkgbWV0aG9kIHN0ZXBzXG4gICAgLy8gYXJlOlxuXG4gICAgLy8gMS4gTGV0IHZhbHVlIGJlIHZhbHVlIGlmIGdpdmVuOyBvdGhlcndpc2UgYmxvYlZhbHVlLlxuXG4gICAgbmFtZSA9IHdlYmlkbC5jb252ZXJ0ZXJzLlVTVlN0cmluZyhuYW1lKVxuICAgIHZhbHVlID0gaXNCbG9iTGlrZSh2YWx1ZSlcbiAgICAgID8gd2ViaWRsLmNvbnZlcnRlcnMuQmxvYih2YWx1ZSwgeyBzdHJpY3Q6IGZhbHNlIH0pXG4gICAgICA6IHdlYmlkbC5jb252ZXJ0ZXJzLlVTVlN0cmluZyh2YWx1ZSlcbiAgICBmaWxlbmFtZSA9IGFyZ3VtZW50cy5sZW5ndGggPT09IDNcbiAgICAgID8gdG9VU1ZTdHJpbmcoZmlsZW5hbWUpXG4gICAgICA6IHVuZGVmaW5lZFxuXG4gICAgLy8gMi4gTGV0IGVudHJ5IGJlIHRoZSByZXN1bHQgb2YgY3JlYXRpbmcgYW4gZW50cnkgd2l0aCBuYW1lLCB2YWx1ZSwgYW5kXG4gICAgLy8gZmlsZW5hbWUgaWYgZ2l2ZW4uXG4gICAgY29uc3QgZW50cnkgPSBtYWtlRW50cnkobmFtZSwgdmFsdWUsIGZpbGVuYW1lKVxuXG4gICAgLy8gMy4gSWYgdGhlcmUgYXJlIGVudHJpZXMgaW4gdGhpc+KAmXMgZW50cnkgbGlzdCB3aG9zZSBuYW1lIGlzIG5hbWUsIHRoZW5cbiAgICAvLyByZXBsYWNlIHRoZSBmaXJzdCBzdWNoIGVudHJ5IHdpdGggZW50cnkgYW5kIHJlbW92ZSB0aGUgb3RoZXJzLlxuICAgIGNvbnN0IGlkeCA9IHRoaXNba1N0YXRlXS5maW5kSW5kZXgoKGVudHJ5KSA9PiBlbnRyeS5uYW1lID09PSBuYW1lKVxuICAgIGlmIChpZHggIT09IC0xKSB7XG4gICAgICB0aGlzW2tTdGF0ZV0gPSBbXG4gICAgICAgIC4uLnRoaXNba1N0YXRlXS5zbGljZSgwLCBpZHgpLFxuICAgICAgICBlbnRyeSxcbiAgICAgICAgLi4udGhpc1trU3RhdGVdLnNsaWNlKGlkeCArIDEpLmZpbHRlcigoZW50cnkpID0+IGVudHJ5Lm5hbWUgIT09IG5hbWUpXG4gICAgICBdXG4gICAgfSBlbHNlIHtcbiAgICAgIC8vIDQuIE90aGVyd2lzZSwgYXBwZW5kIGVudHJ5IHRvIHRoaXPigJlzIGVudHJ5IGxpc3QuXG4gICAgICB0aGlzW2tTdGF0ZV0ucHVzaChlbnRyeSlcbiAgICB9XG4gIH1cblxuICBlbnRyaWVzICgpIHtcbiAgICB3ZWJpZGwuYnJhbmRDaGVjayh0aGlzLCBGb3JtRGF0YSlcblxuICAgIHJldHVybiBtYWtlSXRlcmF0b3IoXG4gICAgICAoKSA9PiB0aGlzW2tTdGF0ZV0ubWFwKHBhaXIgPT4gW3BhaXIubmFtZSwgcGFpci52YWx1ZV0pLFxuICAgICAgJ0Zvcm1EYXRhJyxcbiAgICAgICdrZXkrdmFsdWUnXG4gICAgKVxuICB9XG5cbiAga2V5cyAoKSB7XG4gICAgd2ViaWRsLmJyYW5kQ2hlY2sodGhpcywgRm9ybURhdGEpXG5cbiAgICByZXR1cm4gbWFrZUl0ZXJhdG9yKFxuICAgICAgKCkgPT4gdGhpc1trU3RhdGVdLm1hcChwYWlyID0+IFtwYWlyLm5hbWUsIHBhaXIudmFsdWVdKSxcbiAgICAgICdGb3JtRGF0YScsXG4gICAgICAna2V5J1xuICAgIClcbiAgfVxuXG4gIHZhbHVlcyAoKSB7XG4gICAgd2ViaWRsLmJyYW5kQ2hlY2sodGhpcywgRm9ybURhdGEpXG5cbiAgICByZXR1cm4gbWFrZUl0ZXJhdG9yKFxuICAgICAgKCkgPT4gdGhpc1trU3RhdGVdLm1hcChwYWlyID0+IFtwYWlyLm5hbWUsIHBhaXIudmFsdWVdKSxcbiAgICAgICdGb3JtRGF0YScsXG4gICAgICAndmFsdWUnXG4gICAgKVxuICB9XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7KHZhbHVlOiBzdHJpbmcsIGtleTogc3RyaW5nLCBzZWxmOiBGb3JtRGF0YSkgPT4gdm9pZH0gY2FsbGJhY2tGblxuICAgKiBAcGFyYW0ge3Vua25vd259IHRoaXNBcmdcbiAgICovXG4gIGZvckVhY2ggKGNhbGxiYWNrRm4sIHRoaXNBcmcgPSBnbG9iYWxUaGlzKSB7XG4gICAgd2ViaWRsLmJyYW5kQ2hlY2sodGhpcywgRm9ybURhdGEpXG5cbiAgICB3ZWJpZGwuYXJndW1lbnRMZW5ndGhDaGVjayhhcmd1bWVudHMsIDEsIHsgaGVhZGVyOiAnRm9ybURhdGEuZm9yRWFjaCcgfSlcblxuICAgIGlmICh0eXBlb2YgY2FsbGJhY2tGbiAhPT0gJ2Z1bmN0aW9uJykge1xuICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcihcbiAgICAgICAgXCJGYWlsZWQgdG8gZXhlY3V0ZSAnZm9yRWFjaCcgb24gJ0Zvcm1EYXRhJzogcGFyYW1ldGVyIDEgaXMgbm90IG9mIHR5cGUgJ0Z1bmN0aW9uJy5cIlxuICAgICAgKVxuICAgIH1cblxuICAgIGZvciAoY29uc3QgW2tleSwgdmFsdWVdIG9mIHRoaXMpIHtcbiAgICAgIGNhbGxiYWNrRm4uYXBwbHkodGhpc0FyZywgW3ZhbHVlLCBrZXksIHRoaXNdKVxuICAgIH1cbiAgfVxufVxuXG5Gb3JtRGF0YS5wcm90b3R5cGVbU3ltYm9sLml0ZXJhdG9yXSA9IEZvcm1EYXRhLnByb3RvdHlwZS5lbnRyaWVzXG5cbk9iamVjdC5kZWZpbmVQcm9wZXJ0aWVzKEZvcm1EYXRhLnByb3RvdHlwZSwge1xuICBbU3ltYm9sLnRvU3RyaW5nVGFnXToge1xuICAgIHZhbHVlOiAnRm9ybURhdGEnLFxuICAgIGNvbmZpZ3VyYWJsZTogdHJ1ZVxuICB9XG59KVxuXG4vKipcbiAqIEBzZWUgaHR0cHM6Ly9odG1sLnNwZWMud2hhdHdnLm9yZy9tdWx0aXBhZ2UvZm9ybS1jb250cm9sLWluZnJhc3RydWN0dXJlLmh0bWwjY3JlYXRlLWFuLWVudHJ5XG4gKiBAcGFyYW0ge3N0cmluZ30gbmFtZVxuICogQHBhcmFtIHtzdHJpbmd8QmxvYn0gdmFsdWVcbiAqIEBwYXJhbSB7P3N0cmluZ30gZmlsZW5hbWVcbiAqIEByZXR1cm5zXG4gKi9cbmZ1bmN0aW9uIG1ha2VFbnRyeSAobmFtZSwgdmFsdWUsIGZpbGVuYW1lKSB7XG4gIC8vIDEuIFNldCBuYW1lIHRvIHRoZSByZXN1bHQgb2YgY29udmVydGluZyBuYW1lIGludG8gYSBzY2FsYXIgdmFsdWUgc3RyaW5nLlxuICAvLyBcIlRvIGNvbnZlcnQgYSBzdHJpbmcgaW50byBhIHNjYWxhciB2YWx1ZSBzdHJpbmcsIHJlcGxhY2UgYW55IHN1cnJvZ2F0ZXNcbiAgLy8gIHdpdGggVStGRkZELlwiXG4gIC8vIHNlZTogaHR0cHM6Ly9ub2RlanMub3JnL2Rpc3QvbGF0ZXN0LXYxOC54L2RvY3MvYXBpL2J1ZmZlci5odG1sI2J1ZnRvc3RyaW5nZW5jb2Rpbmctc3RhcnQtZW5kXG4gIG5hbWUgPSBCdWZmZXIuZnJvbShuYW1lKS50b1N0cmluZygndXRmOCcpXG5cbiAgLy8gMi4gSWYgdmFsdWUgaXMgYSBzdHJpbmcsIHRoZW4gc2V0IHZhbHVlIHRvIHRoZSByZXN1bHQgb2YgY29udmVydGluZ1xuICAvLyAgICB2YWx1ZSBpbnRvIGEgc2NhbGFyIHZhbHVlIHN0cmluZy5cbiAgaWYgKHR5cGVvZiB2YWx1ZSA9PT0gJ3N0cmluZycpIHtcbiAgICB2YWx1ZSA9IEJ1ZmZlci5mcm9tKHZhbHVlKS50b1N0cmluZygndXRmOCcpXG4gIH0gZWxzZSB7XG4gICAgLy8gMy4gT3RoZXJ3aXNlOlxuXG4gICAgLy8gMS4gSWYgdmFsdWUgaXMgbm90IGEgRmlsZSBvYmplY3QsIHRoZW4gc2V0IHZhbHVlIHRvIGEgbmV3IEZpbGUgb2JqZWN0LFxuICAgIC8vICAgIHJlcHJlc2VudGluZyB0aGUgc2FtZSBieXRlcywgd2hvc2UgbmFtZSBhdHRyaWJ1dGUgdmFsdWUgaXMgXCJibG9iXCJcbiAgICBpZiAoIWlzRmlsZUxpa2UodmFsdWUpKSB7XG4gICAgICB2YWx1ZSA9IHZhbHVlIGluc3RhbmNlb2YgQmxvYlxuICAgICAgICA/IG5ldyBGaWxlKFt2YWx1ZV0sICdibG9iJywgeyB0eXBlOiB2YWx1ZS50eXBlIH0pXG4gICAgICAgIDogbmV3IEZpbGVMaWtlKHZhbHVlLCAnYmxvYicsIHsgdHlwZTogdmFsdWUudHlwZSB9KVxuICAgIH1cblxuICAgIC8vIDIuIElmIGZpbGVuYW1lIGlzIGdpdmVuLCB0aGVuIHNldCB2YWx1ZSB0byBhIG5ldyBGaWxlIG9iamVjdCxcbiAgICAvLyAgICByZXByZXNlbnRpbmcgdGhlIHNhbWUgYnl0ZXMsIHdob3NlIG5hbWUgYXR0cmlidXRlIGlzIGZpbGVuYW1lLlxuICAgIGlmIChmaWxlbmFtZSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAvKiogQHR5cGUge0ZpbGVQcm9wZXJ0eUJhZ30gKi9cbiAgICAgIGNvbnN0IG9wdGlvbnMgPSB7XG4gICAgICAgIHR5cGU6IHZhbHVlLnR5cGUsXG4gICAgICAgIGxhc3RNb2RpZmllZDogdmFsdWUubGFzdE1vZGlmaWVkXG4gICAgICB9XG5cbiAgICAgIHZhbHVlID0gKE5hdGl2ZUZpbGUgJiYgdmFsdWUgaW5zdGFuY2VvZiBOYXRpdmVGaWxlKSB8fCB2YWx1ZSBpbnN0YW5jZW9mIFVuZGljaUZpbGVcbiAgICAgICAgPyBuZXcgRmlsZShbdmFsdWVdLCBmaWxlbmFtZSwgb3B0aW9ucylcbiAgICAgICAgOiBuZXcgRmlsZUxpa2UodmFsdWUsIGZpbGVuYW1lLCBvcHRpb25zKVxuICAgIH1cbiAgfVxuXG4gIC8vIDQuIFJldHVybiBhbiBlbnRyeSB3aG9zZSBuYW1lIGlzIG5hbWUgYW5kIHdob3NlIHZhbHVlIGlzIHZhbHVlLlxuICByZXR1cm4geyBuYW1lLCB2YWx1ZSB9XG59XG5cbm1vZHVsZS5leHBvcnRzID0geyBGb3JtRGF0YSB9XG4iLAogICAgIid1c2Ugc3RyaWN0J1xuXG5jb25zdCBCdXNib3kgPSByZXF1aXJlKCdAZmFzdGlmeS9idXNib3knKVxuY29uc3QgdXRpbCA9IHJlcXVpcmUoJy4uL2NvcmUvdXRpbCcpXG5jb25zdCB7XG4gIFJlYWRhYmxlU3RyZWFtRnJvbSxcbiAgaXNCbG9iTGlrZSxcbiAgaXNSZWFkYWJsZVN0cmVhbUxpa2UsXG4gIHJlYWRhYmxlU3RyZWFtQ2xvc2UsXG4gIGNyZWF0ZURlZmVycmVkUHJvbWlzZSxcbiAgZnVsbHlSZWFkQm9keVxufSA9IHJlcXVpcmUoJy4vdXRpbCcpXG5jb25zdCB7IEZvcm1EYXRhIH0gPSByZXF1aXJlKCcuL2Zvcm1kYXRhJylcbmNvbnN0IHsga1N0YXRlIH0gPSByZXF1aXJlKCcuL3N5bWJvbHMnKVxuY29uc3QgeyB3ZWJpZGwgfSA9IHJlcXVpcmUoJy4vd2ViaWRsJylcbmNvbnN0IHsgRE9NRXhjZXB0aW9uLCBzdHJ1Y3R1cmVkQ2xvbmUgfSA9IHJlcXVpcmUoJy4vY29uc3RhbnRzJylcbmNvbnN0IHsgQmxvYiwgRmlsZTogTmF0aXZlRmlsZSB9ID0gcmVxdWlyZSgnYnVmZmVyJylcbmNvbnN0IHsga0JvZHlVc2VkIH0gPSByZXF1aXJlKCcuLi9jb3JlL3N5bWJvbHMnKVxuY29uc3QgYXNzZXJ0ID0gcmVxdWlyZSgnYXNzZXJ0JylcbmNvbnN0IHsgaXNFcnJvcmVkIH0gPSByZXF1aXJlKCcuLi9jb3JlL3V0aWwnKVxuY29uc3QgeyBpc1VpbnQ4QXJyYXksIGlzQXJyYXlCdWZmZXIgfSA9IHJlcXVpcmUoJ3V0aWwvdHlwZXMnKVxuY29uc3QgeyBGaWxlOiBVbmRpY2lGaWxlIH0gPSByZXF1aXJlKCcuL2ZpbGUnKVxuY29uc3QgeyBwYXJzZU1JTUVUeXBlLCBzZXJpYWxpemVBTWltZVR5cGUgfSA9IHJlcXVpcmUoJy4vZGF0YVVSTCcpXG5cbmxldCBSZWFkYWJsZVN0cmVhbSA9IGdsb2JhbFRoaXMuUmVhZGFibGVTdHJlYW1cblxuLyoqIEB0eXBlIHtnbG9iYWxUaGlzWydGaWxlJ119ICovXG5jb25zdCBGaWxlID0gTmF0aXZlRmlsZSA/PyBVbmRpY2lGaWxlXG5jb25zdCB0ZXh0RW5jb2RlciA9IG5ldyBUZXh0RW5jb2RlcigpXG5jb25zdCB0ZXh0RGVjb2RlciA9IG5ldyBUZXh0RGVjb2RlcigpXG5cbi8vIGh0dHBzOi8vZmV0Y2guc3BlYy53aGF0d2cub3JnLyNjb25jZXB0LWJvZHlpbml0LWV4dHJhY3RcbmZ1bmN0aW9uIGV4dHJhY3RCb2R5IChvYmplY3QsIGtlZXBhbGl2ZSA9IGZhbHNlKSB7XG4gIGlmICghUmVhZGFibGVTdHJlYW0pIHtcbiAgICBSZWFkYWJsZVN0cmVhbSA9IHJlcXVpcmUoJ3N0cmVhbS93ZWInKS5SZWFkYWJsZVN0cmVhbVxuICB9XG5cbiAgLy8gMS4gTGV0IHN0cmVhbSBiZSBudWxsLlxuICBsZXQgc3RyZWFtID0gbnVsbFxuXG4gIC8vIDIuIElmIG9iamVjdCBpcyBhIFJlYWRhYmxlU3RyZWFtIG9iamVjdCwgdGhlbiBzZXQgc3RyZWFtIHRvIG9iamVjdC5cbiAgaWYgKG9iamVjdCBpbnN0YW5jZW9mIFJlYWRhYmxlU3RyZWFtKSB7XG4gICAgc3RyZWFtID0gb2JqZWN0XG4gIH0gZWxzZSBpZiAoaXNCbG9iTGlrZShvYmplY3QpKSB7XG4gICAgLy8gMy4gT3RoZXJ3aXNlLCBpZiBvYmplY3QgaXMgYSBCbG9iIG9iamVjdCwgc2V0IHN0cmVhbSB0byB0aGVcbiAgICAvLyAgICByZXN1bHQgb2YgcnVubmluZyBvYmplY3TigJlzIGdldCBzdHJlYW0uXG4gICAgc3RyZWFtID0gb2JqZWN0LnN0cmVhbSgpXG4gIH0gZWxzZSB7XG4gICAgLy8gNC4gT3RoZXJ3aXNlLCBzZXQgc3RyZWFtIHRvIGEgbmV3IFJlYWRhYmxlU3RyZWFtIG9iamVjdCwgYW5kIHNldFxuICAgIC8vICAgIHVwIHN0cmVhbS5cbiAgICBzdHJlYW0gPSBuZXcgUmVhZGFibGVTdHJlYW0oe1xuICAgICAgYXN5bmMgcHVsbCAoY29udHJvbGxlcikge1xuICAgICAgICBjb250cm9sbGVyLmVucXVldWUoXG4gICAgICAgICAgdHlwZW9mIHNvdXJjZSA9PT0gJ3N0cmluZycgPyB0ZXh0RW5jb2Rlci5lbmNvZGUoc291cmNlKSA6IHNvdXJjZVxuICAgICAgICApXG4gICAgICAgIHF1ZXVlTWljcm90YXNrKCgpID0+IHJlYWRhYmxlU3RyZWFtQ2xvc2UoY29udHJvbGxlcikpXG4gICAgICB9LFxuICAgICAgc3RhcnQgKCkge30sXG4gICAgICB0eXBlOiB1bmRlZmluZWRcbiAgICB9KVxuICB9XG5cbiAgLy8gNS4gQXNzZXJ0OiBzdHJlYW0gaXMgYSBSZWFkYWJsZVN0cmVhbSBvYmplY3QuXG4gIGFzc2VydChpc1JlYWRhYmxlU3RyZWFtTGlrZShzdHJlYW0pKVxuXG4gIC8vIDYuIExldCBhY3Rpb24gYmUgbnVsbC5cbiAgbGV0IGFjdGlvbiA9IG51bGxcblxuICAvLyA3LiBMZXQgc291cmNlIGJlIG51bGwuXG4gIGxldCBzb3VyY2UgPSBudWxsXG5cbiAgLy8gOC4gTGV0IGxlbmd0aCBiZSBudWxsLlxuICBsZXQgbGVuZ3RoID0gbnVsbFxuXG4gIC8vIDkuIExldCB0eXBlIGJlIG51bGwuXG4gIGxldCB0eXBlID0gbnVsbFxuXG4gIC8vIDEwLiBTd2l0Y2ggb24gb2JqZWN0OlxuICBpZiAodHlwZW9mIG9iamVjdCA9PT0gJ3N0cmluZycpIHtcbiAgICAvLyBTZXQgc291cmNlIHRvIHRoZSBVVEYtOCBlbmNvZGluZyBvZiBvYmplY3QuXG4gICAgLy8gTm90ZTogc2V0dGluZyBzb3VyY2UgdG8gYSBVaW50OEFycmF5IGhlcmUgYnJlYWtzIHNvbWUgbW9ja2luZyBhc3N1bXB0aW9ucy5cbiAgICBzb3VyY2UgPSBvYmplY3RcblxuICAgIC8vIFNldCB0eXBlIHRvIGB0ZXh0L3BsYWluO2NoYXJzZXQ9VVRGLThgLlxuICAgIHR5cGUgPSAndGV4dC9wbGFpbjtjaGFyc2V0PVVURi04J1xuICB9IGVsc2UgaWYgKG9iamVjdCBpbnN0YW5jZW9mIFVSTFNlYXJjaFBhcmFtcykge1xuICAgIC8vIFVSTFNlYXJjaFBhcmFtc1xuXG4gICAgLy8gc3BlYyBzYXlzIHRvIHJ1biBhcHBsaWNhdGlvbi94LXd3dy1mb3JtLXVybGVuY29kZWQgb24gYm9keS5saXN0XG4gICAgLy8gdGhpcyBpcyBpbXBsZW1lbnRlZCBpbiBOb2RlLmpzIGFzIGFwYXJ0IG9mIGFuIFVSTFNlYXJjaFBhcmFtcyBpbnN0YW5jZSB0b1N0cmluZyBtZXRob2RcbiAgICAvLyBTZWU6IGh0dHBzOi8vZ2l0aHViLmNvbS9ub2RlanMvbm9kZS9ibG9iL2U0NmM2ODBiZjJiMjExYmJkNTJjZjk1OWNhMTdlZTk4YzdmNjU3ZjUvbGliL2ludGVybmFsL3VybC5qcyNMNDkwXG4gICAgLy8gYW5kIGh0dHBzOi8vZ2l0aHViLmNvbS9ub2RlanMvbm9kZS9ibG9iL2U0NmM2ODBiZjJiMjExYmJkNTJjZjk1OWNhMTdlZTk4YzdmNjU3ZjUvbGliL2ludGVybmFsL3VybC5qcyNMMTEwMFxuXG4gICAgLy8gU2V0IHNvdXJjZSB0byB0aGUgcmVzdWx0IG9mIHJ1bm5pbmcgdGhlIGFwcGxpY2F0aW9uL3gtd3d3LWZvcm0tdXJsZW5jb2RlZCBzZXJpYWxpemVyIHdpdGggb2JqZWN04oCZcyBsaXN0LlxuICAgIHNvdXJjZSA9IG9iamVjdC50b1N0cmluZygpXG5cbiAgICAvLyBTZXQgdHlwZSB0byBgYXBwbGljYXRpb24veC13d3ctZm9ybS11cmxlbmNvZGVkO2NoYXJzZXQ9VVRGLThgLlxuICAgIHR5cGUgPSAnYXBwbGljYXRpb24veC13d3ctZm9ybS11cmxlbmNvZGVkO2NoYXJzZXQ9VVRGLTgnXG4gIH0gZWxzZSBpZiAoaXNBcnJheUJ1ZmZlcihvYmplY3QpKSB7XG4gICAgLy8gQnVmZmVyU291cmNlL0FycmF5QnVmZmVyXG5cbiAgICAvLyBTZXQgc291cmNlIHRvIGEgY29weSBvZiB0aGUgYnl0ZXMgaGVsZCBieSBvYmplY3QuXG4gICAgc291cmNlID0gbmV3IFVpbnQ4QXJyYXkob2JqZWN0LnNsaWNlKCkpXG4gIH0gZWxzZSBpZiAoQXJyYXlCdWZmZXIuaXNWaWV3KG9iamVjdCkpIHtcbiAgICAvLyBCdWZmZXJTb3VyY2UvQXJyYXlCdWZmZXJWaWV3XG5cbiAgICAvLyBTZXQgc291cmNlIHRvIGEgY29weSBvZiB0aGUgYnl0ZXMgaGVsZCBieSBvYmplY3QuXG4gICAgc291cmNlID0gbmV3IFVpbnQ4QXJyYXkob2JqZWN0LmJ1ZmZlci5zbGljZShvYmplY3QuYnl0ZU9mZnNldCwgb2JqZWN0LmJ5dGVPZmZzZXQgKyBvYmplY3QuYnl0ZUxlbmd0aCkpXG4gIH0gZWxzZSBpZiAodXRpbC5pc0Zvcm1EYXRhTGlrZShvYmplY3QpKSB7XG4gICAgY29uc3QgYm91bmRhcnkgPSBgLS0tLWZvcm1kYXRhLXVuZGljaS0wJHtgJHtNYXRoLmZsb29yKE1hdGgucmFuZG9tKCkgKiAxZTExKX1gLnBhZFN0YXJ0KDExLCAnMCcpfWBcbiAgICBjb25zdCBwcmVmaXggPSBgLS0ke2JvdW5kYXJ5fVxcclxcbkNvbnRlbnQtRGlzcG9zaXRpb246IGZvcm0tZGF0YWBcblxuICAgIC8qISBmb3JtZGF0YS1wb2x5ZmlsbC4gTUlUIExpY2Vuc2UuIEppbW15IFfDpHJ0aW5nIDxodHRwczovL2ppbW15LndhcnRpbmcuc2Uvb3BlbnNvdXJjZT4gKi9cbiAgICBjb25zdCBlc2NhcGUgPSAoc3RyKSA9PlxuICAgICAgc3RyLnJlcGxhY2UoL1xcbi9nLCAnJTBBJykucmVwbGFjZSgvXFxyL2csICclMEQnKS5yZXBsYWNlKC9cIi9nLCAnJTIyJylcbiAgICBjb25zdCBub3JtYWxpemVMaW5lZmVlZHMgPSAodmFsdWUpID0+IHZhbHVlLnJlcGxhY2UoL1xccj9cXG58XFxyL2csICdcXHJcXG4nKVxuXG4gICAgLy8gU2V0IGFjdGlvbiB0byB0aGlzIHN0ZXA6IHJ1biB0aGUgbXVsdGlwYXJ0L2Zvcm0tZGF0YVxuICAgIC8vIGVuY29kaW5nIGFsZ29yaXRobSwgd2l0aCBvYmplY3TigJlzIGVudHJ5IGxpc3QgYW5kIFVURi04LlxuICAgIC8vIC0gVGhpcyBlbnN1cmVzIHRoYXQgdGhlIGJvZHkgaXMgaW1tdXRhYmxlIGFuZCBjYW4ndCBiZSBjaGFuZ2VkIGFmdGVyd29yZHNcbiAgICAvLyAtIFRoYXQgdGhlIGNvbnRlbnQtbGVuZ3RoIGlzIGNhbGN1bGF0ZWQgaW4gYWR2YW5jZS5cbiAgICAvLyAtIEFuZCB0aGF0IGFsbCBwYXJ0cyBhcmUgcHJlLWVuY29kZWQgYW5kIHJlYWR5IHRvIGJlIHNlbnQuXG5cbiAgICBjb25zdCBibG9iUGFydHMgPSBbXVxuICAgIGNvbnN0IHJuID0gbmV3IFVpbnQ4QXJyYXkoWzEzLCAxMF0pIC8vICdcXHJcXG4nXG4gICAgbGVuZ3RoID0gMFxuICAgIGxldCBoYXNVbmtub3duU2l6ZVZhbHVlID0gZmFsc2VcblxuICAgIGZvciAoY29uc3QgW25hbWUsIHZhbHVlXSBvZiBvYmplY3QpIHtcbiAgICAgIGlmICh0eXBlb2YgdmFsdWUgPT09ICdzdHJpbmcnKSB7XG4gICAgICAgIGNvbnN0IGNodW5rID0gdGV4dEVuY29kZXIuZW5jb2RlKHByZWZpeCArXG4gICAgICAgICAgYDsgbmFtZT1cIiR7ZXNjYXBlKG5vcm1hbGl6ZUxpbmVmZWVkcyhuYW1lKSl9XCJgICtcbiAgICAgICAgICBgXFxyXFxuXFxyXFxuJHtub3JtYWxpemVMaW5lZmVlZHModmFsdWUpfVxcclxcbmApXG4gICAgICAgIGJsb2JQYXJ0cy5wdXNoKGNodW5rKVxuICAgICAgICBsZW5ndGggKz0gY2h1bmsuYnl0ZUxlbmd0aFxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgY29uc3QgY2h1bmsgPSB0ZXh0RW5jb2Rlci5lbmNvZGUoYCR7cHJlZml4fTsgbmFtZT1cIiR7ZXNjYXBlKG5vcm1hbGl6ZUxpbmVmZWVkcyhuYW1lKSl9XCJgICtcbiAgICAgICAgICAodmFsdWUubmFtZSA/IGA7IGZpbGVuYW1lPVwiJHtlc2NhcGUodmFsdWUubmFtZSl9XCJgIDogJycpICsgJ1xcclxcbicgK1xuICAgICAgICAgIGBDb250ZW50LVR5cGU6ICR7XG4gICAgICAgICAgICB2YWx1ZS50eXBlIHx8ICdhcHBsaWNhdGlvbi9vY3RldC1zdHJlYW0nXG4gICAgICAgICAgfVxcclxcblxcclxcbmApXG4gICAgICAgIGJsb2JQYXJ0cy5wdXNoKGNodW5rLCB2YWx1ZSwgcm4pXG4gICAgICAgIGlmICh0eXBlb2YgdmFsdWUuc2l6ZSA9PT0gJ251bWJlcicpIHtcbiAgICAgICAgICBsZW5ndGggKz0gY2h1bmsuYnl0ZUxlbmd0aCArIHZhbHVlLnNpemUgKyBybi5ieXRlTGVuZ3RoXG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgaGFzVW5rbm93blNpemVWYWx1ZSA9IHRydWVcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cblxuICAgIGNvbnN0IGNodW5rID0gdGV4dEVuY29kZXIuZW5jb2RlKGAtLSR7Ym91bmRhcnl9LS1gKVxuICAgIGJsb2JQYXJ0cy5wdXNoKGNodW5rKVxuICAgIGxlbmd0aCArPSBjaHVuay5ieXRlTGVuZ3RoXG4gICAgaWYgKGhhc1Vua25vd25TaXplVmFsdWUpIHtcbiAgICAgIGxlbmd0aCA9IG51bGxcbiAgICB9XG5cbiAgICAvLyBTZXQgc291cmNlIHRvIG9iamVjdC5cbiAgICBzb3VyY2UgPSBvYmplY3RcblxuICAgIGFjdGlvbiA9IGFzeW5jIGZ1bmN0aW9uICogKCkge1xuICAgICAgZm9yIChjb25zdCBwYXJ0IG9mIGJsb2JQYXJ0cykge1xuICAgICAgICBpZiAocGFydC5zdHJlYW0pIHtcbiAgICAgICAgICB5aWVsZCAqIHBhcnQuc3RyZWFtKClcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICB5aWVsZCBwYXJ0XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG5cbiAgICAvLyBTZXQgdHlwZSB0byBgbXVsdGlwYXJ0L2Zvcm0tZGF0YTsgYm91bmRhcnk9YCxcbiAgICAvLyBmb2xsb3dlZCBieSB0aGUgbXVsdGlwYXJ0L2Zvcm0tZGF0YSBib3VuZGFyeSBzdHJpbmcgZ2VuZXJhdGVkXG4gICAgLy8gYnkgdGhlIG11bHRpcGFydC9mb3JtLWRhdGEgZW5jb2RpbmcgYWxnb3JpdGhtLlxuICAgIHR5cGUgPSAnbXVsdGlwYXJ0L2Zvcm0tZGF0YTsgYm91bmRhcnk9JyArIGJvdW5kYXJ5XG4gIH0gZWxzZSBpZiAoaXNCbG9iTGlrZShvYmplY3QpKSB7XG4gICAgLy8gQmxvYlxuXG4gICAgLy8gU2V0IHNvdXJjZSB0byBvYmplY3QuXG4gICAgc291cmNlID0gb2JqZWN0XG5cbiAgICAvLyBTZXQgbGVuZ3RoIHRvIG9iamVjdOKAmXMgc2l6ZS5cbiAgICBsZW5ndGggPSBvYmplY3Quc2l6ZVxuXG4gICAgLy8gSWYgb2JqZWN04oCZcyB0eXBlIGF0dHJpYnV0ZSBpcyBub3QgdGhlIGVtcHR5IGJ5dGUgc2VxdWVuY2UsIHNldFxuICAgIC8vIHR5cGUgdG8gaXRzIHZhbHVlLlxuICAgIGlmIChvYmplY3QudHlwZSkge1xuICAgICAgdHlwZSA9IG9iamVjdC50eXBlXG4gICAgfVxuICB9IGVsc2UgaWYgKHR5cGVvZiBvYmplY3RbU3ltYm9sLmFzeW5jSXRlcmF0b3JdID09PSAnZnVuY3Rpb24nKSB7XG4gICAgLy8gSWYga2VlcGFsaXZlIGlzIHRydWUsIHRoZW4gdGhyb3cgYSBUeXBlRXJyb3IuXG4gICAgaWYgKGtlZXBhbGl2ZSkge1xuICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcigna2VlcGFsaXZlJylcbiAgICB9XG5cbiAgICAvLyBJZiBvYmplY3QgaXMgZGlzdHVyYmVkIG9yIGxvY2tlZCwgdGhlbiB0aHJvdyBhIFR5cGVFcnJvci5cbiAgICBpZiAodXRpbC5pc0Rpc3R1cmJlZChvYmplY3QpIHx8IG9iamVjdC5sb2NrZWQpIHtcbiAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoXG4gICAgICAgICdSZXNwb25zZSBib2R5IG9iamVjdCBzaG91bGQgbm90IGJlIGRpc3R1cmJlZCBvciBsb2NrZWQnXG4gICAgICApXG4gICAgfVxuXG4gICAgc3RyZWFtID1cbiAgICAgIG9iamVjdCBpbnN0YW5jZW9mIFJlYWRhYmxlU3RyZWFtID8gb2JqZWN0IDogUmVhZGFibGVTdHJlYW1Gcm9tKG9iamVjdClcbiAgfVxuXG4gIC8vIDExLiBJZiBzb3VyY2UgaXMgYSBieXRlIHNlcXVlbmNlLCB0aGVuIHNldCBhY3Rpb24gdG8gYVxuICAvLyBzdGVwIHRoYXQgcmV0dXJucyBzb3VyY2UgYW5kIGxlbmd0aCB0byBzb3VyY2XigJlzIGxlbmd0aC5cbiAgaWYgKHR5cGVvZiBzb3VyY2UgPT09ICdzdHJpbmcnIHx8IHV0aWwuaXNCdWZmZXIoc291cmNlKSkge1xuICAgIGxlbmd0aCA9IEJ1ZmZlci5ieXRlTGVuZ3RoKHNvdXJjZSlcbiAgfVxuXG4gIC8vIDEyLiBJZiBhY3Rpb24gaXMgbm9uLW51bGwsIHRoZW4gcnVuIHRoZXNlIHN0ZXBzIGluIGluIHBhcmFsbGVsOlxuICBpZiAoYWN0aW9uICE9IG51bGwpIHtcbiAgICAvLyBSdW4gYWN0aW9uLlxuICAgIGxldCBpdGVyYXRvclxuICAgIHN0cmVhbSA9IG5ldyBSZWFkYWJsZVN0cmVhbSh7XG4gICAgICBhc3luYyBzdGFydCAoKSB7XG4gICAgICAgIGl0ZXJhdG9yID0gYWN0aW9uKG9iamVjdClbU3ltYm9sLmFzeW5jSXRlcmF0b3JdKClcbiAgICAgIH0sXG4gICAgICBhc3luYyBwdWxsIChjb250cm9sbGVyKSB7XG4gICAgICAgIGNvbnN0IHsgdmFsdWUsIGRvbmUgfSA9IGF3YWl0IGl0ZXJhdG9yLm5leHQoKVxuICAgICAgICBpZiAoZG9uZSkge1xuICAgICAgICAgIC8vIFdoZW4gcnVubmluZyBhY3Rpb24gaXMgZG9uZSwgY2xvc2Ugc3RyZWFtLlxuICAgICAgICAgIHF1ZXVlTWljcm90YXNrKCgpID0+IHtcbiAgICAgICAgICAgIGNvbnRyb2xsZXIuY2xvc2UoKVxuICAgICAgICAgIH0pXG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgLy8gV2hlbmV2ZXIgb25lIG9yIG1vcmUgYnl0ZXMgYXJlIGF2YWlsYWJsZSBhbmQgc3RyZWFtIGlzIG5vdCBlcnJvcmVkLFxuICAgICAgICAgIC8vIGVucXVldWUgYSBVaW50OEFycmF5IHdyYXBwaW5nIGFuIEFycmF5QnVmZmVyIGNvbnRhaW5pbmcgdGhlIGF2YWlsYWJsZVxuICAgICAgICAgIC8vIGJ5dGVzIGludG8gc3RyZWFtLlxuICAgICAgICAgIGlmICghaXNFcnJvcmVkKHN0cmVhbSkpIHtcbiAgICAgICAgICAgIGNvbnRyb2xsZXIuZW5xdWV1ZShuZXcgVWludDhBcnJheSh2YWx1ZSkpXG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiBjb250cm9sbGVyLmRlc2lyZWRTaXplID4gMFxuICAgICAgfSxcbiAgICAgIGFzeW5jIGNhbmNlbCAocmVhc29uKSB7XG4gICAgICAgIGF3YWl0IGl0ZXJhdG9yLnJldHVybigpXG4gICAgICB9LFxuICAgICAgdHlwZTogdW5kZWZpbmVkXG4gICAgfSlcbiAgfVxuXG4gIC8vIDEzLiBMZXQgYm9keSBiZSBhIGJvZHkgd2hvc2Ugc3RyZWFtIGlzIHN0cmVhbSwgc291cmNlIGlzIHNvdXJjZSxcbiAgLy8gYW5kIGxlbmd0aCBpcyBsZW5ndGguXG4gIGNvbnN0IGJvZHkgPSB7IHN0cmVhbSwgc291cmNlLCBsZW5ndGggfVxuXG4gIC8vIDE0LiBSZXR1cm4gKGJvZHksIHR5cGUpLlxuICByZXR1cm4gW2JvZHksIHR5cGVdXG59XG5cbi8vIGh0dHBzOi8vZmV0Y2guc3BlYy53aGF0d2cub3JnLyNib2R5aW5pdC1zYWZlbHktZXh0cmFjdFxuZnVuY3Rpb24gc2FmZWx5RXh0cmFjdEJvZHkgKG9iamVjdCwga2VlcGFsaXZlID0gZmFsc2UpIHtcbiAgaWYgKCFSZWFkYWJsZVN0cmVhbSkge1xuICAgIC8vIGlzdGFuYnVsIGlnbm9yZSBuZXh0XG4gICAgUmVhZGFibGVTdHJlYW0gPSByZXF1aXJlKCdzdHJlYW0vd2ViJykuUmVhZGFibGVTdHJlYW1cbiAgfVxuXG4gIC8vIFRvIHNhZmVseSBleHRyYWN0IGEgYm9keSBhbmQgYSBgQ29udGVudC1UeXBlYCB2YWx1ZSBmcm9tXG4gIC8vIGEgYnl0ZSBzZXF1ZW5jZSBvciBCb2R5SW5pdCBvYmplY3Qgb2JqZWN0LCBydW4gdGhlc2Ugc3RlcHM6XG5cbiAgLy8gMS4gSWYgb2JqZWN0IGlzIGEgUmVhZGFibGVTdHJlYW0gb2JqZWN0LCB0aGVuOlxuICBpZiAob2JqZWN0IGluc3RhbmNlb2YgUmVhZGFibGVTdHJlYW0pIHtcbiAgICAvLyBBc3NlcnQ6IG9iamVjdCBpcyBuZWl0aGVyIGRpc3R1cmJlZCBub3IgbG9ja2VkLlxuICAgIC8vIGlzdGFuYnVsIGlnbm9yZSBuZXh0XG4gICAgYXNzZXJ0KCF1dGlsLmlzRGlzdHVyYmVkKG9iamVjdCksICdUaGUgYm9keSBoYXMgYWxyZWFkeSBiZWVuIGNvbnN1bWVkLicpXG4gICAgLy8gaXN0YW5idWwgaWdub3JlIG5leHRcbiAgICBhc3NlcnQoIW9iamVjdC5sb2NrZWQsICdUaGUgc3RyZWFtIGlzIGxvY2tlZC4nKVxuICB9XG5cbiAgLy8gMi4gUmV0dXJuIHRoZSByZXN1bHRzIG9mIGV4dHJhY3Rpbmcgb2JqZWN0LlxuICByZXR1cm4gZXh0cmFjdEJvZHkob2JqZWN0LCBrZWVwYWxpdmUpXG59XG5cbmZ1bmN0aW9uIGNsb25lQm9keSAoYm9keSkge1xuICAvLyBUbyBjbG9uZSBhIGJvZHkgYm9keSwgcnVuIHRoZXNlIHN0ZXBzOlxuXG4gIC8vIGh0dHBzOi8vZmV0Y2guc3BlYy53aGF0d2cub3JnLyNjb25jZXB0LWJvZHktY2xvbmVcblxuICAvLyAxLiBMZXQgwqsgb3V0MSwgb3V0MiDCuyBiZSB0aGUgcmVzdWx0IG9mIHRlZWluZyBib2R54oCZcyBzdHJlYW0uXG4gIGNvbnN0IFtvdXQxLCBvdXQyXSA9IGJvZHkuc3RyZWFtLnRlZSgpXG4gIGNvbnN0IG91dDJDbG9uZSA9IHN0cnVjdHVyZWRDbG9uZShvdXQyLCB7IHRyYW5zZmVyOiBbb3V0Ml0gfSlcbiAgLy8gVGhpcywgZm9yIHdoYXRldmVyIHJlYXNvbnMsIHVucmVmcyBvdXQyQ2xvbmUgd2hpY2ggYWxsb3dzXG4gIC8vIHRoZSBwcm9jZXNzIHRvIGV4aXQgYnkgaXRzZWxmLlxuICBjb25zdCBbLCBmaW5hbENsb25lXSA9IG91dDJDbG9uZS50ZWUoKVxuXG4gIC8vIDIuIFNldCBib2R54oCZcyBzdHJlYW0gdG8gb3V0MS5cbiAgYm9keS5zdHJlYW0gPSBvdXQxXG5cbiAgLy8gMy4gUmV0dXJuIGEgYm9keSB3aG9zZSBzdHJlYW0gaXMgb3V0MiBhbmQgb3RoZXIgbWVtYmVycyBhcmUgY29waWVkIGZyb20gYm9keS5cbiAgcmV0dXJuIHtcbiAgICBzdHJlYW06IGZpbmFsQ2xvbmUsXG4gICAgbGVuZ3RoOiBib2R5Lmxlbmd0aCxcbiAgICBzb3VyY2U6IGJvZHkuc291cmNlXG4gIH1cbn1cblxuYXN5bmMgZnVuY3Rpb24gKiBjb25zdW1lQm9keSAoYm9keSkge1xuICBpZiAoYm9keSkge1xuICAgIGlmIChpc1VpbnQ4QXJyYXkoYm9keSkpIHtcbiAgICAgIHlpZWxkIGJvZHlcbiAgICB9IGVsc2Uge1xuICAgICAgY29uc3Qgc3RyZWFtID0gYm9keS5zdHJlYW1cblxuICAgICAgaWYgKHV0aWwuaXNEaXN0dXJiZWQoc3RyZWFtKSkge1xuICAgICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCdUaGUgYm9keSBoYXMgYWxyZWFkeSBiZWVuIGNvbnN1bWVkLicpXG4gICAgICB9XG5cbiAgICAgIGlmIChzdHJlYW0ubG9ja2VkKSB7XG4gICAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoJ1RoZSBzdHJlYW0gaXMgbG9ja2VkLicpXG4gICAgICB9XG5cbiAgICAgIC8vIENvbXBhdC5cbiAgICAgIHN0cmVhbVtrQm9keVVzZWRdID0gdHJ1ZVxuXG4gICAgICB5aWVsZCAqIHN0cmVhbVxuICAgIH1cbiAgfVxufVxuXG5mdW5jdGlvbiB0aHJvd0lmQWJvcnRlZCAoc3RhdGUpIHtcbiAgaWYgKHN0YXRlLmFib3J0ZWQpIHtcbiAgICB0aHJvdyBuZXcgRE9NRXhjZXB0aW9uKCdUaGUgb3BlcmF0aW9uIHdhcyBhYm9ydGVkLicsICdBYm9ydEVycm9yJylcbiAgfVxufVxuXG5mdW5jdGlvbiBib2R5TWl4aW5NZXRob2RzIChpbnN0YW5jZSkge1xuICBjb25zdCBtZXRob2RzID0ge1xuICAgIGJsb2IgKCkge1xuICAgICAgLy8gVGhlIGJsb2IoKSBtZXRob2Qgc3RlcHMgYXJlIHRvIHJldHVybiB0aGUgcmVzdWx0IG9mXG4gICAgICAvLyBydW5uaW5nIGNvbnN1bWUgYm9keSB3aXRoIHRoaXMgYW5kIHRoZSBmb2xsb3dpbmcgc3RlcFxuICAgICAgLy8gZ2l2ZW4gYSBieXRlIHNlcXVlbmNlIGJ5dGVzOiByZXR1cm4gYSBCbG9iIHdob3NlXG4gICAgICAvLyBjb250ZW50cyBhcmUgYnl0ZXMgYW5kIHdob3NlIHR5cGUgYXR0cmlidXRlIGlzIHRoaXPigJlzXG4gICAgICAvLyBNSU1FIHR5cGUuXG4gICAgICByZXR1cm4gc3BlY0NvbnN1bWVCb2R5KHRoaXMsIChieXRlcykgPT4ge1xuICAgICAgICBsZXQgbWltZVR5cGUgPSBib2R5TWltZVR5cGUodGhpcylcblxuICAgICAgICBpZiAobWltZVR5cGUgPT09ICdmYWlsdXJlJykge1xuICAgICAgICAgIG1pbWVUeXBlID0gJydcbiAgICAgICAgfSBlbHNlIGlmIChtaW1lVHlwZSkge1xuICAgICAgICAgIG1pbWVUeXBlID0gc2VyaWFsaXplQU1pbWVUeXBlKG1pbWVUeXBlKVxuICAgICAgICB9XG5cbiAgICAgICAgLy8gUmV0dXJuIGEgQmxvYiB3aG9zZSBjb250ZW50cyBhcmUgYnl0ZXMgYW5kIHR5cGUgYXR0cmlidXRlXG4gICAgICAgIC8vIGlzIG1pbWVUeXBlLlxuICAgICAgICByZXR1cm4gbmV3IEJsb2IoW2J5dGVzXSwgeyB0eXBlOiBtaW1lVHlwZSB9KVxuICAgICAgfSwgaW5zdGFuY2UpXG4gICAgfSxcblxuICAgIGFycmF5QnVmZmVyICgpIHtcbiAgICAgIC8vIFRoZSBhcnJheUJ1ZmZlcigpIG1ldGhvZCBzdGVwcyBhcmUgdG8gcmV0dXJuIHRoZSByZXN1bHRcbiAgICAgIC8vIG9mIHJ1bm5pbmcgY29uc3VtZSBib2R5IHdpdGggdGhpcyBhbmQgdGhlIGZvbGxvd2luZyBzdGVwXG4gICAgICAvLyBnaXZlbiBhIGJ5dGUgc2VxdWVuY2UgYnl0ZXM6IHJldHVybiBhIG5ldyBBcnJheUJ1ZmZlclxuICAgICAgLy8gd2hvc2UgY29udGVudHMgYXJlIGJ5dGVzLlxuICAgICAgcmV0dXJuIHNwZWNDb25zdW1lQm9keSh0aGlzLCAoYnl0ZXMpID0+IHtcbiAgICAgICAgcmV0dXJuIG5ldyBVaW50OEFycmF5KGJ5dGVzKS5idWZmZXJcbiAgICAgIH0sIGluc3RhbmNlKVxuICAgIH0sXG5cbiAgICB0ZXh0ICgpIHtcbiAgICAgIC8vIFRoZSB0ZXh0KCkgbWV0aG9kIHN0ZXBzIGFyZSB0byByZXR1cm4gdGhlIHJlc3VsdCBvZiBydW5uaW5nXG4gICAgICAvLyBjb25zdW1lIGJvZHkgd2l0aCB0aGlzIGFuZCBVVEYtOCBkZWNvZGUuXG4gICAgICByZXR1cm4gc3BlY0NvbnN1bWVCb2R5KHRoaXMsIHV0ZjhEZWNvZGVCeXRlcywgaW5zdGFuY2UpXG4gICAgfSxcblxuICAgIGpzb24gKCkge1xuICAgICAgLy8gVGhlIGpzb24oKSBtZXRob2Qgc3RlcHMgYXJlIHRvIHJldHVybiB0aGUgcmVzdWx0IG9mIHJ1bm5pbmdcbiAgICAgIC8vIGNvbnN1bWUgYm9keSB3aXRoIHRoaXMgYW5kIHBhcnNlIEpTT04gZnJvbSBieXRlcy5cbiAgICAgIHJldHVybiBzcGVjQ29uc3VtZUJvZHkodGhpcywgcGFyc2VKU09ORnJvbUJ5dGVzLCBpbnN0YW5jZSlcbiAgICB9LFxuXG4gICAgYXN5bmMgZm9ybURhdGEgKCkge1xuICAgICAgd2ViaWRsLmJyYW5kQ2hlY2sodGhpcywgaW5zdGFuY2UpXG5cbiAgICAgIHRocm93SWZBYm9ydGVkKHRoaXNba1N0YXRlXSlcblxuICAgICAgY29uc3QgY29udGVudFR5cGUgPSB0aGlzLmhlYWRlcnMuZ2V0KCdDb250ZW50LVR5cGUnKVxuXG4gICAgICAvLyBJZiBtaW1lVHlwZeKAmXMgZXNzZW5jZSBpcyBcIm11bHRpcGFydC9mb3JtLWRhdGFcIiwgdGhlbjpcbiAgICAgIGlmICgvbXVsdGlwYXJ0XFwvZm9ybS1kYXRhLy50ZXN0KGNvbnRlbnRUeXBlKSkge1xuICAgICAgICBjb25zdCBoZWFkZXJzID0ge31cbiAgICAgICAgZm9yIChjb25zdCBba2V5LCB2YWx1ZV0gb2YgdGhpcy5oZWFkZXJzKSBoZWFkZXJzW2tleS50b0xvd2VyQ2FzZSgpXSA9IHZhbHVlXG5cbiAgICAgICAgY29uc3QgcmVzcG9uc2VGb3JtRGF0YSA9IG5ldyBGb3JtRGF0YSgpXG5cbiAgICAgICAgbGV0IGJ1c2JveVxuXG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgYnVzYm95ID0gbmV3IEJ1c2JveSh7XG4gICAgICAgICAgICBoZWFkZXJzLFxuICAgICAgICAgICAgcHJlc2VydmVQYXRoOiB0cnVlXG4gICAgICAgICAgfSlcbiAgICAgICAgfSBjYXRjaCAoZXJyKSB7XG4gICAgICAgICAgdGhyb3cgbmV3IERPTUV4Y2VwdGlvbihgJHtlcnJ9YCwgJ0Fib3J0RXJyb3InKVxuICAgICAgICB9XG5cbiAgICAgICAgYnVzYm95Lm9uKCdmaWVsZCcsIChuYW1lLCB2YWx1ZSkgPT4ge1xuICAgICAgICAgIHJlc3BvbnNlRm9ybURhdGEuYXBwZW5kKG5hbWUsIHZhbHVlKVxuICAgICAgICB9KVxuICAgICAgICBidXNib3kub24oJ2ZpbGUnLCAobmFtZSwgdmFsdWUsIGZpbGVuYW1lLCBlbmNvZGluZywgbWltZVR5cGUpID0+IHtcbiAgICAgICAgICBjb25zdCBjaHVua3MgPSBbXVxuXG4gICAgICAgICAgaWYgKGVuY29kaW5nID09PSAnYmFzZTY0JyB8fCBlbmNvZGluZy50b0xvd2VyQ2FzZSgpID09PSAnYmFzZTY0Jykge1xuICAgICAgICAgICAgbGV0IGJhc2U2NGNodW5rID0gJydcblxuICAgICAgICAgICAgdmFsdWUub24oJ2RhdGEnLCAoY2h1bmspID0+IHtcbiAgICAgICAgICAgICAgYmFzZTY0Y2h1bmsgKz0gY2h1bmsudG9TdHJpbmcoKS5yZXBsYWNlKC9bXFxyXFxuXS9nbSwgJycpXG5cbiAgICAgICAgICAgICAgY29uc3QgZW5kID0gYmFzZTY0Y2h1bmsubGVuZ3RoIC0gYmFzZTY0Y2h1bmsubGVuZ3RoICUgNFxuICAgICAgICAgICAgICBjaHVua3MucHVzaChCdWZmZXIuZnJvbShiYXNlNjRjaHVuay5zbGljZSgwLCBlbmQpLCAnYmFzZTY0JykpXG5cbiAgICAgICAgICAgICAgYmFzZTY0Y2h1bmsgPSBiYXNlNjRjaHVuay5zbGljZShlbmQpXG4gICAgICAgICAgICB9KVxuICAgICAgICAgICAgdmFsdWUub24oJ2VuZCcsICgpID0+IHtcbiAgICAgICAgICAgICAgY2h1bmtzLnB1c2goQnVmZmVyLmZyb20oYmFzZTY0Y2h1bmssICdiYXNlNjQnKSlcbiAgICAgICAgICAgICAgcmVzcG9uc2VGb3JtRGF0YS5hcHBlbmQobmFtZSwgbmV3IEZpbGUoY2h1bmtzLCBmaWxlbmFtZSwgeyB0eXBlOiBtaW1lVHlwZSB9KSlcbiAgICAgICAgICAgIH0pXG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHZhbHVlLm9uKCdkYXRhJywgKGNodW5rKSA9PiB7XG4gICAgICAgICAgICAgIGNodW5rcy5wdXNoKGNodW5rKVxuICAgICAgICAgICAgfSlcbiAgICAgICAgICAgIHZhbHVlLm9uKCdlbmQnLCAoKSA9PiB7XG4gICAgICAgICAgICAgIHJlc3BvbnNlRm9ybURhdGEuYXBwZW5kKG5hbWUsIG5ldyBGaWxlKGNodW5rcywgZmlsZW5hbWUsIHsgdHlwZTogbWltZVR5cGUgfSkpXG4gICAgICAgICAgICB9KVxuICAgICAgICAgIH1cbiAgICAgICAgfSlcblxuICAgICAgICBjb25zdCBidXNib3lSZXNvbHZlID0gbmV3IFByb21pc2UoKHJlc29sdmUsIHJlamVjdCkgPT4ge1xuICAgICAgICAgIGJ1c2JveS5vbignZmluaXNoJywgcmVzb2x2ZSlcbiAgICAgICAgICBidXNib3kub24oJ2Vycm9yJywgKGVycikgPT4gcmVqZWN0KG5ldyBUeXBlRXJyb3IoZXJyKSkpXG4gICAgICAgIH0pXG5cbiAgICAgICAgaWYgKHRoaXMuYm9keSAhPT0gbnVsbCkgZm9yIGF3YWl0IChjb25zdCBjaHVuayBvZiBjb25zdW1lQm9keSh0aGlzW2tTdGF0ZV0uYm9keSkpIGJ1c2JveS53cml0ZShjaHVuaylcbiAgICAgICAgYnVzYm95LmVuZCgpXG4gICAgICAgIGF3YWl0IGJ1c2JveVJlc29sdmVcblxuICAgICAgICByZXR1cm4gcmVzcG9uc2VGb3JtRGF0YVxuICAgICAgfSBlbHNlIGlmICgvYXBwbGljYXRpb25cXC94LXd3dy1mb3JtLXVybGVuY29kZWQvLnRlc3QoY29udGVudFR5cGUpKSB7XG4gICAgICAgIC8vIE90aGVyd2lzZSwgaWYgbWltZVR5cGXigJlzIGVzc2VuY2UgaXMgXCJhcHBsaWNhdGlvbi94LXd3dy1mb3JtLXVybGVuY29kZWRcIiwgdGhlbjpcblxuICAgICAgICAvLyAxLiBMZXQgZW50cmllcyBiZSB0aGUgcmVzdWx0IG9mIHBhcnNpbmcgYnl0ZXMuXG4gICAgICAgIGxldCBlbnRyaWVzXG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgbGV0IHRleHQgPSAnJ1xuICAgICAgICAgIC8vIGFwcGxpY2F0aW9uL3gtd3d3LWZvcm0tdXJsZW5jb2RlZCBwYXJzZXIgd2lsbCBrZWVwIHRoZSBCT00uXG4gICAgICAgICAgLy8gaHR0cHM6Ly91cmwuc3BlYy53aGF0d2cub3JnLyNjb25jZXB0LXVybGVuY29kZWQtcGFyc2VyXG4gICAgICAgICAgLy8gTm90ZSB0aGF0IHN0cmVhbWluZyBkZWNvZGVyIGlzIHN0YXRlZnVsIGFuZCBjYW5ub3QgYmUgcmV1c2VkXG4gICAgICAgICAgY29uc3Qgc3RyZWFtaW5nRGVjb2RlciA9IG5ldyBUZXh0RGVjb2RlcigndXRmLTgnLCB7IGlnbm9yZUJPTTogdHJ1ZSB9KVxuXG4gICAgICAgICAgZm9yIGF3YWl0IChjb25zdCBjaHVuayBvZiBjb25zdW1lQm9keSh0aGlzW2tTdGF0ZV0uYm9keSkpIHtcbiAgICAgICAgICAgIGlmICghaXNVaW50OEFycmF5KGNodW5rKSkge1xuICAgICAgICAgICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCdFeHBlY3RlZCBVaW50OEFycmF5IGNodW5rJylcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHRleHQgKz0gc3RyZWFtaW5nRGVjb2Rlci5kZWNvZGUoY2h1bmssIHsgc3RyZWFtOiB0cnVlIH0pXG4gICAgICAgICAgfVxuICAgICAgICAgIHRleHQgKz0gc3RyZWFtaW5nRGVjb2Rlci5kZWNvZGUoKVxuICAgICAgICAgIGVudHJpZXMgPSBuZXcgVVJMU2VhcmNoUGFyYW1zKHRleHQpXG4gICAgICAgIH0gY2F0Y2ggKGVycikge1xuICAgICAgICAgIC8vIGlzdGFuYnVsIGlnbm9yZSBuZXh0OiBVbmNsZWFyIHdoZW4gbmV3IFVSTFNlYXJjaFBhcmFtcyBjYW4gZmFpbCBvbiBhIHN0cmluZy5cbiAgICAgICAgICAvLyAyLiBJZiBlbnRyaWVzIGlzIGZhaWx1cmUsIHRoZW4gdGhyb3cgYSBUeXBlRXJyb3IuXG4gICAgICAgICAgdGhyb3cgT2JqZWN0LmFzc2lnbihuZXcgVHlwZUVycm9yKCksIHsgY2F1c2U6IGVyciB9KVxuICAgICAgICB9XG5cbiAgICAgICAgLy8gMy4gUmV0dXJuIGEgbmV3IEZvcm1EYXRhIG9iamVjdCB3aG9zZSBlbnRyaWVzIGFyZSBlbnRyaWVzLlxuICAgICAgICBjb25zdCBmb3JtRGF0YSA9IG5ldyBGb3JtRGF0YSgpXG4gICAgICAgIGZvciAoY29uc3QgW25hbWUsIHZhbHVlXSBvZiBlbnRyaWVzKSB7XG4gICAgICAgICAgZm9ybURhdGEuYXBwZW5kKG5hbWUsIHZhbHVlKVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiBmb3JtRGF0YVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgLy8gV2FpdCBhIHRpY2sgYmVmb3JlIGNoZWNraW5nIGlmIHRoZSByZXF1ZXN0IGhhcyBiZWVuIGFib3J0ZWQuXG4gICAgICAgIC8vIE90aGVyd2lzZSwgYSBUeXBlRXJyb3IgY2FuIGJlIHRocm93biB3aGVuIGFuIEFib3J0RXJyb3Igc2hvdWxkLlxuICAgICAgICBhd2FpdCBQcm9taXNlLnJlc29sdmUoKVxuXG4gICAgICAgIHRocm93SWZBYm9ydGVkKHRoaXNba1N0YXRlXSlcblxuICAgICAgICAvLyBPdGhlcndpc2UsIHRocm93IGEgVHlwZUVycm9yLlxuICAgICAgICB0aHJvdyB3ZWJpZGwuZXJyb3JzLmV4Y2VwdGlvbih7XG4gICAgICAgICAgaGVhZGVyOiBgJHtpbnN0YW5jZS5uYW1lfS5mb3JtRGF0YWAsXG4gICAgICAgICAgbWVzc2FnZTogJ0NvdWxkIG5vdCBwYXJzZSBjb250ZW50IGFzIEZvcm1EYXRhLidcbiAgICAgICAgfSlcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICByZXR1cm4gbWV0aG9kc1xufVxuXG5mdW5jdGlvbiBtaXhpbkJvZHkgKHByb3RvdHlwZSkge1xuICBPYmplY3QuYXNzaWduKHByb3RvdHlwZS5wcm90b3R5cGUsIGJvZHlNaXhpbk1ldGhvZHMocHJvdG90eXBlKSlcbn1cblxuLyoqXG4gKiBAc2VlIGh0dHBzOi8vZmV0Y2guc3BlYy53aGF0d2cub3JnLyNjb25jZXB0LWJvZHktY29uc3VtZS1ib2R5XG4gKiBAcGFyYW0ge1Jlc3BvbnNlfFJlcXVlc3R9IG9iamVjdFxuICogQHBhcmFtIHsodmFsdWU6IHVua25vd24pID0+IHVua25vd259IGNvbnZlcnRCeXRlc1RvSlNWYWx1ZVxuICogQHBhcmFtIHtSZXNwb25zZXxSZXF1ZXN0fSBpbnN0YW5jZVxuICovXG5hc3luYyBmdW5jdGlvbiBzcGVjQ29uc3VtZUJvZHkgKG9iamVjdCwgY29udmVydEJ5dGVzVG9KU1ZhbHVlLCBpbnN0YW5jZSkge1xuICB3ZWJpZGwuYnJhbmRDaGVjayhvYmplY3QsIGluc3RhbmNlKVxuXG4gIHRocm93SWZBYm9ydGVkKG9iamVjdFtrU3RhdGVdKVxuXG4gIC8vIDEuIElmIG9iamVjdCBpcyB1bnVzYWJsZSwgdGhlbiByZXR1cm4gYSBwcm9taXNlIHJlamVjdGVkXG4gIC8vICAgIHdpdGggYSBUeXBlRXJyb3IuXG4gIGlmIChib2R5VW51c2FibGUob2JqZWN0W2tTdGF0ZV0uYm9keSkpIHtcbiAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCdCb2R5IGlzIHVudXNhYmxlJylcbiAgfVxuXG4gIC8vIDIuIExldCBwcm9taXNlIGJlIGEgbmV3IHByb21pc2UuXG4gIGNvbnN0IHByb21pc2UgPSBjcmVhdGVEZWZlcnJlZFByb21pc2UoKVxuXG4gIC8vIDMuIExldCBlcnJvclN0ZXBzIGdpdmVuIGVycm9yIGJlIHRvIHJlamVjdCBwcm9taXNlIHdpdGggZXJyb3IuXG4gIGNvbnN0IGVycm9yU3RlcHMgPSAoZXJyb3IpID0+IHByb21pc2UucmVqZWN0KGVycm9yKVxuXG4gIC8vIDQuIExldCBzdWNjZXNzU3RlcHMgZ2l2ZW4gYSBieXRlIHNlcXVlbmNlIGRhdGEgYmUgdG8gcmVzb2x2ZVxuICAvLyAgICBwcm9taXNlIHdpdGggdGhlIHJlc3VsdCBvZiBydW5uaW5nIGNvbnZlcnRCeXRlc1RvSlNWYWx1ZVxuICAvLyAgICB3aXRoIGRhdGEuIElmIHRoYXQgdGhyZXcgYW4gZXhjZXB0aW9uLCB0aGVuIHJ1biBlcnJvclN0ZXBzXG4gIC8vICAgIHdpdGggdGhhdCBleGNlcHRpb24uXG4gIGNvbnN0IHN1Y2Nlc3NTdGVwcyA9IChkYXRhKSA9PiB7XG4gICAgdHJ5IHtcbiAgICAgIHByb21pc2UucmVzb2x2ZShjb252ZXJ0Qnl0ZXNUb0pTVmFsdWUoZGF0YSkpXG4gICAgfSBjYXRjaCAoZSkge1xuICAgICAgZXJyb3JTdGVwcyhlKVxuICAgIH1cbiAgfVxuXG4gIC8vIDUuIElmIG9iamVjdOKAmXMgYm9keSBpcyBudWxsLCB0aGVuIHJ1biBzdWNjZXNzU3RlcHMgd2l0aCBhblxuICAvLyAgICBlbXB0eSBieXRlIHNlcXVlbmNlLlxuICBpZiAob2JqZWN0W2tTdGF0ZV0uYm9keSA9PSBudWxsKSB7XG4gICAgc3VjY2Vzc1N0ZXBzKG5ldyBVaW50OEFycmF5KCkpXG4gICAgcmV0dXJuIHByb21pc2UucHJvbWlzZVxuICB9XG5cbiAgLy8gNi4gT3RoZXJ3aXNlLCBmdWxseSByZWFkIG9iamVjdOKAmXMgYm9keSBnaXZlbiBzdWNjZXNzU3RlcHMsXG4gIC8vICAgIGVycm9yU3RlcHMsIGFuZCBvYmplY3TigJlzIHJlbGV2YW50IGdsb2JhbCBvYmplY3QuXG4gIGF3YWl0IGZ1bGx5UmVhZEJvZHkob2JqZWN0W2tTdGF0ZV0uYm9keSwgc3VjY2Vzc1N0ZXBzLCBlcnJvclN0ZXBzKVxuXG4gIC8vIDcuIFJldHVybiBwcm9taXNlLlxuICByZXR1cm4gcHJvbWlzZS5wcm9taXNlXG59XG5cbi8vIGh0dHBzOi8vZmV0Y2guc3BlYy53aGF0d2cub3JnLyNib2R5LXVudXNhYmxlXG5mdW5jdGlvbiBib2R5VW51c2FibGUgKGJvZHkpIHtcbiAgLy8gQW4gb2JqZWN0IGluY2x1ZGluZyB0aGUgQm9keSBpbnRlcmZhY2UgbWl4aW4gaXNcbiAgLy8gc2FpZCB0byBiZSB1bnVzYWJsZSBpZiBpdHMgYm9keSBpcyBub24tbnVsbCBhbmRcbiAgLy8gaXRzIGJvZHnigJlzIHN0cmVhbSBpcyBkaXN0dXJiZWQgb3IgbG9ja2VkLlxuICByZXR1cm4gYm9keSAhPSBudWxsICYmIChib2R5LnN0cmVhbS5sb2NrZWQgfHwgdXRpbC5pc0Rpc3R1cmJlZChib2R5LnN0cmVhbSkpXG59XG5cbi8qKlxuICogQHNlZSBodHRwczovL2VuY29kaW5nLnNwZWMud2hhdHdnLm9yZy8jdXRmLTgtZGVjb2RlXG4gKiBAcGFyYW0ge0J1ZmZlcn0gYnVmZmVyXG4gKi9cbmZ1bmN0aW9uIHV0ZjhEZWNvZGVCeXRlcyAoYnVmZmVyKSB7XG4gIGlmIChidWZmZXIubGVuZ3RoID09PSAwKSB7XG4gICAgcmV0dXJuICcnXG4gIH1cblxuICAvLyAxLiBMZXQgYnVmZmVyIGJlIHRoZSByZXN1bHQgb2YgcGVla2luZyB0aHJlZSBieXRlcyBmcm9tXG4gIC8vICAgIGlvUXVldWUsIGNvbnZlcnRlZCB0byBhIGJ5dGUgc2VxdWVuY2UuXG5cbiAgLy8gMi4gSWYgYnVmZmVyIGlzIDB4RUYgMHhCQiAweEJGLCB0aGVuIHJlYWQgdGhyZWVcbiAgLy8gICAgYnl0ZXMgZnJvbSBpb1F1ZXVlLiAoRG8gbm90aGluZyB3aXRoIHRob3NlIGJ5dGVzLilcbiAgaWYgKGJ1ZmZlclswXSA9PT0gMHhFRiAmJiBidWZmZXJbMV0gPT09IDB4QkIgJiYgYnVmZmVyWzJdID09PSAweEJGKSB7XG4gICAgYnVmZmVyID0gYnVmZmVyLnN1YmFycmF5KDMpXG4gIH1cblxuICAvLyAzLiBQcm9jZXNzIGEgcXVldWUgd2l0aCBhbiBpbnN0YW5jZSBvZiBVVEYtOOKAmXNcbiAgLy8gICAgZGVjb2RlciwgaW9RdWV1ZSwgb3V0cHV0LCBhbmQgXCJyZXBsYWNlbWVudFwiLlxuICBjb25zdCBvdXRwdXQgPSB0ZXh0RGVjb2Rlci5kZWNvZGUoYnVmZmVyKVxuXG4gIC8vIDQuIFJldHVybiBvdXRwdXQuXG4gIHJldHVybiBvdXRwdXRcbn1cblxuLyoqXG4gKiBAc2VlIGh0dHBzOi8vaW5mcmEuc3BlYy53aGF0d2cub3JnLyNwYXJzZS1qc29uLWJ5dGVzLXRvLWEtamF2YXNjcmlwdC12YWx1ZVxuICogQHBhcmFtIHtVaW50OEFycmF5fSBieXRlc1xuICovXG5mdW5jdGlvbiBwYXJzZUpTT05Gcm9tQnl0ZXMgKGJ5dGVzKSB7XG4gIHJldHVybiBKU09OLnBhcnNlKHV0ZjhEZWNvZGVCeXRlcyhieXRlcykpXG59XG5cbi8qKlxuICogQHNlZSBodHRwczovL2ZldGNoLnNwZWMud2hhdHdnLm9yZy8jY29uY2VwdC1ib2R5LW1pbWUtdHlwZVxuICogQHBhcmFtIHtpbXBvcnQoJy4vcmVzcG9uc2UnKS5SZXNwb25zZXxpbXBvcnQoJy4vcmVxdWVzdCcpLlJlcXVlc3R9IG9iamVjdFxuICovXG5mdW5jdGlvbiBib2R5TWltZVR5cGUgKG9iamVjdCkge1xuICBjb25zdCB7IGhlYWRlcnNMaXN0IH0gPSBvYmplY3Rba1N0YXRlXVxuICBjb25zdCBjb250ZW50VHlwZSA9IGhlYWRlcnNMaXN0LmdldCgnY29udGVudC10eXBlJylcblxuICBpZiAoY29udGVudFR5cGUgPT09IG51bGwpIHtcbiAgICByZXR1cm4gJ2ZhaWx1cmUnXG4gIH1cblxuICByZXR1cm4gcGFyc2VNSU1FVHlwZShjb250ZW50VHlwZSlcbn1cblxubW9kdWxlLmV4cG9ydHMgPSB7XG4gIGV4dHJhY3RCb2R5LFxuICBzYWZlbHlFeHRyYWN0Qm9keSxcbiAgY2xvbmVCb2R5LFxuICBtaXhpbkJvZHlcbn1cbiIsCiAgICAiJ3VzZSBzdHJpY3QnXG5cbmNvbnN0IHtcbiAgSW52YWxpZEFyZ3VtZW50RXJyb3IsXG4gIE5vdFN1cHBvcnRlZEVycm9yXG59ID0gcmVxdWlyZSgnLi9lcnJvcnMnKVxuY29uc3QgYXNzZXJ0ID0gcmVxdWlyZSgnYXNzZXJ0JylcbmNvbnN0IHsga0hUVFAyQnVpbGRSZXF1ZXN0LCBrSFRUUDJDb3B5SGVhZGVycywga0hUVFAxQnVpbGRSZXF1ZXN0IH0gPSByZXF1aXJlKCcuL3N5bWJvbHMnKVxuY29uc3QgdXRpbCA9IHJlcXVpcmUoJy4vdXRpbCcpXG5cbi8vIHRva2VuUmVnRXhwIGFuZCBoZWFkZXJDaGFyUmVnZXggaGF2ZSBiZWVuIGxpZnRlZCBmcm9tXG4vLyBodHRwczovL2dpdGh1Yi5jb20vbm9kZWpzL25vZGUvYmxvYi9tYWluL2xpYi9faHR0cF9jb21tb24uanNcblxuLyoqXG4gKiBWZXJpZmllcyB0aGF0IHRoZSBnaXZlbiB2YWwgaXMgYSB2YWxpZCBIVFRQIHRva2VuXG4gKiBwZXIgdGhlIHJ1bGVzIGRlZmluZWQgaW4gUkZDIDcyMzBcbiAqIFNlZSBodHRwczovL3Rvb2xzLmlldGYub3JnL2h0bWwvcmZjNzIzMCNzZWN0aW9uLTMuMi42XG4gKi9cbmNvbnN0IHRva2VuUmVnRXhwID0gL15bXFxeX2BhLXpBLVpcXC0wLTkhIyQlJicqKy58fl0rJC9cblxuLyoqXG4gKiBNYXRjaGVzIGlmIHZhbCBjb250YWlucyBhbiBpbnZhbGlkIGZpZWxkLXZjaGFyXG4gKiAgZmllbGQtdmFsdWUgICAgPSAqKCBmaWVsZC1jb250ZW50IC8gb2JzLWZvbGQgKVxuICogIGZpZWxkLWNvbnRlbnQgID0gZmllbGQtdmNoYXIgWyAxKiggU1AgLyBIVEFCICkgZmllbGQtdmNoYXIgXVxuICogIGZpZWxkLXZjaGFyICAgID0gVkNIQVIgLyBvYnMtdGV4dFxuICovXG5jb25zdCBoZWFkZXJDaGFyUmVnZXggPSAvW15cXHRcXHgyMC1cXHg3ZVxceDgwLVxceGZmXS9cblxuLy8gVmVyaWZpZXMgdGhhdCBhIGdpdmVuIHBhdGggaXMgdmFsaWQgZG9lcyBub3QgY29udGFpbiBjb250cm9sIGNoYXJzIFxceDAwIHRvIFxceDIwXG5jb25zdCBpbnZhbGlkUGF0aFJlZ2V4ID0gL1teXFx1MDAyMS1cXHUwMGZmXS9cblxuY29uc3Qga0hhbmRsZXIgPSBTeW1ib2woJ2hhbmRsZXInKVxuXG5jb25zdCBjaGFubmVscyA9IHt9XG5cbmxldCBleHRyYWN0Qm9keVxuXG50cnkge1xuICBjb25zdCBkaWFnbm9zdGljc0NoYW5uZWwgPSByZXF1aXJlKCdkaWFnbm9zdGljc19jaGFubmVsJylcbiAgY2hhbm5lbHMuY3JlYXRlID0gZGlhZ25vc3RpY3NDaGFubmVsLmNoYW5uZWwoJ3VuZGljaTpyZXF1ZXN0OmNyZWF0ZScpXG4gIGNoYW5uZWxzLmJvZHlTZW50ID0gZGlhZ25vc3RpY3NDaGFubmVsLmNoYW5uZWwoJ3VuZGljaTpyZXF1ZXN0OmJvZHlTZW50JylcbiAgY2hhbm5lbHMuaGVhZGVycyA9IGRpYWdub3N0aWNzQ2hhbm5lbC5jaGFubmVsKCd1bmRpY2k6cmVxdWVzdDpoZWFkZXJzJylcbiAgY2hhbm5lbHMudHJhaWxlcnMgPSBkaWFnbm9zdGljc0NoYW5uZWwuY2hhbm5lbCgndW5kaWNpOnJlcXVlc3Q6dHJhaWxlcnMnKVxuICBjaGFubmVscy5lcnJvciA9IGRpYWdub3N0aWNzQ2hhbm5lbC5jaGFubmVsKCd1bmRpY2k6cmVxdWVzdDplcnJvcicpXG59IGNhdGNoIHtcbiAgY2hhbm5lbHMuY3JlYXRlID0geyBoYXNTdWJzY3JpYmVyczogZmFsc2UgfVxuICBjaGFubmVscy5ib2R5U2VudCA9IHsgaGFzU3Vic2NyaWJlcnM6IGZhbHNlIH1cbiAgY2hhbm5lbHMuaGVhZGVycyA9IHsgaGFzU3Vic2NyaWJlcnM6IGZhbHNlIH1cbiAgY2hhbm5lbHMudHJhaWxlcnMgPSB7IGhhc1N1YnNjcmliZXJzOiBmYWxzZSB9XG4gIGNoYW5uZWxzLmVycm9yID0geyBoYXNTdWJzY3JpYmVyczogZmFsc2UgfVxufVxuXG5jbGFzcyBSZXF1ZXN0IHtcbiAgY29uc3RydWN0b3IgKG9yaWdpbiwge1xuICAgIHBhdGgsXG4gICAgbWV0aG9kLFxuICAgIGJvZHksXG4gICAgaGVhZGVycyxcbiAgICBxdWVyeSxcbiAgICBpZGVtcG90ZW50LFxuICAgIGJsb2NraW5nLFxuICAgIHVwZ3JhZGUsXG4gICAgaGVhZGVyc1RpbWVvdXQsXG4gICAgYm9keVRpbWVvdXQsXG4gICAgcmVzZXQsXG4gICAgdGhyb3dPbkVycm9yLFxuICAgIGV4cGVjdENvbnRpbnVlXG4gIH0sIGhhbmRsZXIpIHtcbiAgICBpZiAodHlwZW9mIHBhdGggIT09ICdzdHJpbmcnKSB7XG4gICAgICB0aHJvdyBuZXcgSW52YWxpZEFyZ3VtZW50RXJyb3IoJ3BhdGggbXVzdCBiZSBhIHN0cmluZycpXG4gICAgfSBlbHNlIGlmIChcbiAgICAgIHBhdGhbMF0gIT09ICcvJyAmJlxuICAgICAgIShwYXRoLnN0YXJ0c1dpdGgoJ2h0dHA6Ly8nKSB8fCBwYXRoLnN0YXJ0c1dpdGgoJ2h0dHBzOi8vJykpICYmXG4gICAgICBtZXRob2QgIT09ICdDT05ORUNUJ1xuICAgICkge1xuICAgICAgdGhyb3cgbmV3IEludmFsaWRBcmd1bWVudEVycm9yKCdwYXRoIG11c3QgYmUgYW4gYWJzb2x1dGUgVVJMIG9yIHN0YXJ0IHdpdGggYSBzbGFzaCcpXG4gICAgfSBlbHNlIGlmIChpbnZhbGlkUGF0aFJlZ2V4LmV4ZWMocGF0aCkgIT09IG51bGwpIHtcbiAgICAgIHRocm93IG5ldyBJbnZhbGlkQXJndW1lbnRFcnJvcignaW52YWxpZCByZXF1ZXN0IHBhdGgnKVxuICAgIH1cblxuICAgIGlmICh0eXBlb2YgbWV0aG9kICE9PSAnc3RyaW5nJykge1xuICAgICAgdGhyb3cgbmV3IEludmFsaWRBcmd1bWVudEVycm9yKCdtZXRob2QgbXVzdCBiZSBhIHN0cmluZycpXG4gICAgfSBlbHNlIGlmICh0b2tlblJlZ0V4cC5leGVjKG1ldGhvZCkgPT09IG51bGwpIHtcbiAgICAgIHRocm93IG5ldyBJbnZhbGlkQXJndW1lbnRFcnJvcignaW52YWxpZCByZXF1ZXN0IG1ldGhvZCcpXG4gICAgfVxuXG4gICAgaWYgKHVwZ3JhZGUgJiYgdHlwZW9mIHVwZ3JhZGUgIT09ICdzdHJpbmcnKSB7XG4gICAgICB0aHJvdyBuZXcgSW52YWxpZEFyZ3VtZW50RXJyb3IoJ3VwZ3JhZGUgbXVzdCBiZSBhIHN0cmluZycpXG4gICAgfVxuXG4gICAgaWYgKGhlYWRlcnNUaW1lb3V0ICE9IG51bGwgJiYgKCFOdW1iZXIuaXNGaW5pdGUoaGVhZGVyc1RpbWVvdXQpIHx8IGhlYWRlcnNUaW1lb3V0IDwgMCkpIHtcbiAgICAgIHRocm93IG5ldyBJbnZhbGlkQXJndW1lbnRFcnJvcignaW52YWxpZCBoZWFkZXJzVGltZW91dCcpXG4gICAgfVxuXG4gICAgaWYgKGJvZHlUaW1lb3V0ICE9IG51bGwgJiYgKCFOdW1iZXIuaXNGaW5pdGUoYm9keVRpbWVvdXQpIHx8IGJvZHlUaW1lb3V0IDwgMCkpIHtcbiAgICAgIHRocm93IG5ldyBJbnZhbGlkQXJndW1lbnRFcnJvcignaW52YWxpZCBib2R5VGltZW91dCcpXG4gICAgfVxuXG4gICAgaWYgKHJlc2V0ICE9IG51bGwgJiYgdHlwZW9mIHJlc2V0ICE9PSAnYm9vbGVhbicpIHtcbiAgICAgIHRocm93IG5ldyBJbnZhbGlkQXJndW1lbnRFcnJvcignaW52YWxpZCByZXNldCcpXG4gICAgfVxuXG4gICAgaWYgKGV4cGVjdENvbnRpbnVlICE9IG51bGwgJiYgdHlwZW9mIGV4cGVjdENvbnRpbnVlICE9PSAnYm9vbGVhbicpIHtcbiAgICAgIHRocm93IG5ldyBJbnZhbGlkQXJndW1lbnRFcnJvcignaW52YWxpZCBleHBlY3RDb250aW51ZScpXG4gICAgfVxuXG4gICAgdGhpcy5oZWFkZXJzVGltZW91dCA9IGhlYWRlcnNUaW1lb3V0XG5cbiAgICB0aGlzLmJvZHlUaW1lb3V0ID0gYm9keVRpbWVvdXRcblxuICAgIHRoaXMudGhyb3dPbkVycm9yID0gdGhyb3dPbkVycm9yID09PSB0cnVlXG5cbiAgICB0aGlzLm1ldGhvZCA9IG1ldGhvZFxuXG4gICAgdGhpcy5hYm9ydCA9IG51bGxcblxuICAgIGlmIChib2R5ID09IG51bGwpIHtcbiAgICAgIHRoaXMuYm9keSA9IG51bGxcbiAgICB9IGVsc2UgaWYgKHV0aWwuaXNTdHJlYW0oYm9keSkpIHtcbiAgICAgIHRoaXMuYm9keSA9IGJvZHlcblxuICAgICAgY29uc3QgclN0YXRlID0gdGhpcy5ib2R5Ll9yZWFkYWJsZVN0YXRlXG4gICAgICBpZiAoIXJTdGF0ZSB8fCAhclN0YXRlLmF1dG9EZXN0cm95KSB7XG4gICAgICAgIHRoaXMuZW5kSGFuZGxlciA9IGZ1bmN0aW9uIGF1dG9EZXN0cm95ICgpIHtcbiAgICAgICAgICB1dGlsLmRlc3Ryb3kodGhpcylcbiAgICAgICAgfVxuICAgICAgICB0aGlzLmJvZHkub24oJ2VuZCcsIHRoaXMuZW5kSGFuZGxlcilcbiAgICAgIH1cblxuICAgICAgdGhpcy5lcnJvckhhbmRsZXIgPSBlcnIgPT4ge1xuICAgICAgICBpZiAodGhpcy5hYm9ydCkge1xuICAgICAgICAgIHRoaXMuYWJvcnQoZXJyKVxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHRoaXMuZXJyb3IgPSBlcnJcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgdGhpcy5ib2R5Lm9uKCdlcnJvcicsIHRoaXMuZXJyb3JIYW5kbGVyKVxuICAgIH0gZWxzZSBpZiAodXRpbC5pc0J1ZmZlcihib2R5KSkge1xuICAgICAgdGhpcy5ib2R5ID0gYm9keS5ieXRlTGVuZ3RoID8gYm9keSA6IG51bGxcbiAgICB9IGVsc2UgaWYgKEFycmF5QnVmZmVyLmlzVmlldyhib2R5KSkge1xuICAgICAgdGhpcy5ib2R5ID0gYm9keS5idWZmZXIuYnl0ZUxlbmd0aCA/IEJ1ZmZlci5mcm9tKGJvZHkuYnVmZmVyLCBib2R5LmJ5dGVPZmZzZXQsIGJvZHkuYnl0ZUxlbmd0aCkgOiBudWxsXG4gICAgfSBlbHNlIGlmIChib2R5IGluc3RhbmNlb2YgQXJyYXlCdWZmZXIpIHtcbiAgICAgIHRoaXMuYm9keSA9IGJvZHkuYnl0ZUxlbmd0aCA/IEJ1ZmZlci5mcm9tKGJvZHkpIDogbnVsbFxuICAgIH0gZWxzZSBpZiAodHlwZW9mIGJvZHkgPT09ICdzdHJpbmcnKSB7XG4gICAgICB0aGlzLmJvZHkgPSBib2R5Lmxlbmd0aCA/IEJ1ZmZlci5mcm9tKGJvZHkpIDogbnVsbFxuICAgIH0gZWxzZSBpZiAodXRpbC5pc0Zvcm1EYXRhTGlrZShib2R5KSB8fCB1dGlsLmlzSXRlcmFibGUoYm9keSkgfHwgdXRpbC5pc0Jsb2JMaWtlKGJvZHkpKSB7XG4gICAgICB0aGlzLmJvZHkgPSBib2R5XG4gICAgfSBlbHNlIHtcbiAgICAgIHRocm93IG5ldyBJbnZhbGlkQXJndW1lbnRFcnJvcignYm9keSBtdXN0IGJlIGEgc3RyaW5nLCBhIEJ1ZmZlciwgYSBSZWFkYWJsZSBzdHJlYW0sIGFuIGl0ZXJhYmxlLCBvciBhbiBhc3luYyBpdGVyYWJsZScpXG4gICAgfVxuXG4gICAgdGhpcy5jb21wbGV0ZWQgPSBmYWxzZVxuXG4gICAgdGhpcy5hYm9ydGVkID0gZmFsc2VcblxuICAgIHRoaXMudXBncmFkZSA9IHVwZ3JhZGUgfHwgbnVsbFxuXG4gICAgdGhpcy5wYXRoID0gcXVlcnkgPyB1dGlsLmJ1aWxkVVJMKHBhdGgsIHF1ZXJ5KSA6IHBhdGhcblxuICAgIHRoaXMub3JpZ2luID0gb3JpZ2luXG5cbiAgICB0aGlzLmlkZW1wb3RlbnQgPSBpZGVtcG90ZW50ID09IG51bGxcbiAgICAgID8gbWV0aG9kID09PSAnSEVBRCcgfHwgbWV0aG9kID09PSAnR0VUJ1xuICAgICAgOiBpZGVtcG90ZW50XG5cbiAgICB0aGlzLmJsb2NraW5nID0gYmxvY2tpbmcgPT0gbnVsbCA/IGZhbHNlIDogYmxvY2tpbmdcblxuICAgIHRoaXMucmVzZXQgPSByZXNldCA9PSBudWxsID8gbnVsbCA6IHJlc2V0XG5cbiAgICB0aGlzLmhvc3QgPSBudWxsXG5cbiAgICB0aGlzLmNvbnRlbnRMZW5ndGggPSBudWxsXG5cbiAgICB0aGlzLmNvbnRlbnRUeXBlID0gbnVsbFxuXG4gICAgdGhpcy5oZWFkZXJzID0gJydcblxuICAgIC8vIE9ubHkgZm9yIEgyXG4gICAgdGhpcy5leHBlY3RDb250aW51ZSA9IGV4cGVjdENvbnRpbnVlICE9IG51bGwgPyBleHBlY3RDb250aW51ZSA6IGZhbHNlXG5cbiAgICBpZiAoQXJyYXkuaXNBcnJheShoZWFkZXJzKSkge1xuICAgICAgaWYgKGhlYWRlcnMubGVuZ3RoICUgMiAhPT0gMCkge1xuICAgICAgICB0aHJvdyBuZXcgSW52YWxpZEFyZ3VtZW50RXJyb3IoJ2hlYWRlcnMgYXJyYXkgbXVzdCBiZSBldmVuJylcbiAgICAgIH1cbiAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgaGVhZGVycy5sZW5ndGg7IGkgKz0gMikge1xuICAgICAgICBwcm9jZXNzSGVhZGVyKHRoaXMsIGhlYWRlcnNbaV0sIGhlYWRlcnNbaSArIDFdKVxuICAgICAgfVxuICAgIH0gZWxzZSBpZiAoaGVhZGVycyAmJiB0eXBlb2YgaGVhZGVycyA9PT0gJ29iamVjdCcpIHtcbiAgICAgIGNvbnN0IGtleXMgPSBPYmplY3Qua2V5cyhoZWFkZXJzKVxuICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBrZXlzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgIGNvbnN0IGtleSA9IGtleXNbaV1cbiAgICAgICAgcHJvY2Vzc0hlYWRlcih0aGlzLCBrZXksIGhlYWRlcnNba2V5XSlcbiAgICAgIH1cbiAgICB9IGVsc2UgaWYgKGhlYWRlcnMgIT0gbnVsbCkge1xuICAgICAgdGhyb3cgbmV3IEludmFsaWRBcmd1bWVudEVycm9yKCdoZWFkZXJzIG11c3QgYmUgYW4gb2JqZWN0IG9yIGFuIGFycmF5JylcbiAgICB9XG5cbiAgICBpZiAodXRpbC5pc0Zvcm1EYXRhTGlrZSh0aGlzLmJvZHkpKSB7XG4gICAgICBpZiAodXRpbC5ub2RlTWFqb3IgPCAxNiB8fCAodXRpbC5ub2RlTWFqb3IgPT09IDE2ICYmIHV0aWwubm9kZU1pbm9yIDwgOCkpIHtcbiAgICAgICAgdGhyb3cgbmV3IEludmFsaWRBcmd1bWVudEVycm9yKCdGb3JtLURhdGEgYm9kaWVzIGFyZSBvbmx5IHN1cHBvcnRlZCBpbiBub2RlIHYxNi44IGFuZCBuZXdlci4nKVxuICAgICAgfVxuXG4gICAgICBpZiAoIWV4dHJhY3RCb2R5KSB7XG4gICAgICAgIGV4dHJhY3RCb2R5ID0gcmVxdWlyZSgnLi4vZmV0Y2gvYm9keS5qcycpLmV4dHJhY3RCb2R5XG4gICAgICB9XG5cbiAgICAgIGNvbnN0IFtib2R5U3RyZWFtLCBjb250ZW50VHlwZV0gPSBleHRyYWN0Qm9keShib2R5KVxuICAgICAgaWYgKHRoaXMuY29udGVudFR5cGUgPT0gbnVsbCkge1xuICAgICAgICB0aGlzLmNvbnRlbnRUeXBlID0gY29udGVudFR5cGVcbiAgICAgICAgdGhpcy5oZWFkZXJzICs9IGBjb250ZW50LXR5cGU6ICR7Y29udGVudFR5cGV9XFxyXFxuYFxuICAgICAgfVxuICAgICAgdGhpcy5ib2R5ID0gYm9keVN0cmVhbS5zdHJlYW1cbiAgICAgIHRoaXMuY29udGVudExlbmd0aCA9IGJvZHlTdHJlYW0ubGVuZ3RoXG4gICAgfSBlbHNlIGlmICh1dGlsLmlzQmxvYkxpa2UoYm9keSkgJiYgdGhpcy5jb250ZW50VHlwZSA9PSBudWxsICYmIGJvZHkudHlwZSkge1xuICAgICAgdGhpcy5jb250ZW50VHlwZSA9IGJvZHkudHlwZVxuICAgICAgdGhpcy5oZWFkZXJzICs9IGBjb250ZW50LXR5cGU6ICR7Ym9keS50eXBlfVxcclxcbmBcbiAgICB9XG5cbiAgICB1dGlsLnZhbGlkYXRlSGFuZGxlcihoYW5kbGVyLCBtZXRob2QsIHVwZ3JhZGUpXG5cbiAgICB0aGlzLnNlcnZlcm5hbWUgPSB1dGlsLmdldFNlcnZlck5hbWUodGhpcy5ob3N0KVxuXG4gICAgdGhpc1trSGFuZGxlcl0gPSBoYW5kbGVyXG5cbiAgICBpZiAoY2hhbm5lbHMuY3JlYXRlLmhhc1N1YnNjcmliZXJzKSB7XG4gICAgICBjaGFubmVscy5jcmVhdGUucHVibGlzaCh7IHJlcXVlc3Q6IHRoaXMgfSlcbiAgICB9XG4gIH1cblxuICBvbkJvZHlTZW50IChjaHVuaykge1xuICAgIGlmICh0aGlzW2tIYW5kbGVyXS5vbkJvZHlTZW50KSB7XG4gICAgICB0cnkge1xuICAgICAgICByZXR1cm4gdGhpc1trSGFuZGxlcl0ub25Cb2R5U2VudChjaHVuaylcbiAgICAgIH0gY2F0Y2ggKGVycikge1xuICAgICAgICB0aGlzLmFib3J0KGVycilcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICBvblJlcXVlc3RTZW50ICgpIHtcbiAgICBpZiAoY2hhbm5lbHMuYm9keVNlbnQuaGFzU3Vic2NyaWJlcnMpIHtcbiAgICAgIGNoYW5uZWxzLmJvZHlTZW50LnB1Ymxpc2goeyByZXF1ZXN0OiB0aGlzIH0pXG4gICAgfVxuXG4gICAgaWYgKHRoaXNba0hhbmRsZXJdLm9uUmVxdWVzdFNlbnQpIHtcbiAgICAgIHRyeSB7XG4gICAgICAgIHJldHVybiB0aGlzW2tIYW5kbGVyXS5vblJlcXVlc3RTZW50KClcbiAgICAgIH0gY2F0Y2ggKGVycikge1xuICAgICAgICB0aGlzLmFib3J0KGVycilcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICBvbkNvbm5lY3QgKGFib3J0KSB7XG4gICAgYXNzZXJ0KCF0aGlzLmFib3J0ZWQpXG4gICAgYXNzZXJ0KCF0aGlzLmNvbXBsZXRlZClcblxuICAgIGlmICh0aGlzLmVycm9yKSB7XG4gICAgICBhYm9ydCh0aGlzLmVycm9yKVxuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLmFib3J0ID0gYWJvcnRcbiAgICAgIHJldHVybiB0aGlzW2tIYW5kbGVyXS5vbkNvbm5lY3QoYWJvcnQpXG4gICAgfVxuICB9XG5cbiAgb25IZWFkZXJzIChzdGF0dXNDb2RlLCBoZWFkZXJzLCByZXN1bWUsIHN0YXR1c1RleHQpIHtcbiAgICBhc3NlcnQoIXRoaXMuYWJvcnRlZClcbiAgICBhc3NlcnQoIXRoaXMuY29tcGxldGVkKVxuXG4gICAgaWYgKGNoYW5uZWxzLmhlYWRlcnMuaGFzU3Vic2NyaWJlcnMpIHtcbiAgICAgIGNoYW5uZWxzLmhlYWRlcnMucHVibGlzaCh7IHJlcXVlc3Q6IHRoaXMsIHJlc3BvbnNlOiB7IHN0YXR1c0NvZGUsIGhlYWRlcnMsIHN0YXR1c1RleHQgfSB9KVxuICAgIH1cblxuICAgIHRyeSB7XG4gICAgICByZXR1cm4gdGhpc1trSGFuZGxlcl0ub25IZWFkZXJzKHN0YXR1c0NvZGUsIGhlYWRlcnMsIHJlc3VtZSwgc3RhdHVzVGV4dClcbiAgICB9IGNhdGNoIChlcnIpIHtcbiAgICAgIHRoaXMuYWJvcnQoZXJyKVxuICAgIH1cbiAgfVxuXG4gIG9uRGF0YSAoY2h1bmspIHtcbiAgICBhc3NlcnQoIXRoaXMuYWJvcnRlZClcbiAgICBhc3NlcnQoIXRoaXMuY29tcGxldGVkKVxuXG4gICAgdHJ5IHtcbiAgICAgIHJldHVybiB0aGlzW2tIYW5kbGVyXS5vbkRhdGEoY2h1bmspXG4gICAgfSBjYXRjaCAoZXJyKSB7XG4gICAgICB0aGlzLmFib3J0KGVycilcbiAgICAgIHJldHVybiBmYWxzZVxuICAgIH1cbiAgfVxuXG4gIG9uVXBncmFkZSAoc3RhdHVzQ29kZSwgaGVhZGVycywgc29ja2V0KSB7XG4gICAgYXNzZXJ0KCF0aGlzLmFib3J0ZWQpXG4gICAgYXNzZXJ0KCF0aGlzLmNvbXBsZXRlZClcblxuICAgIHJldHVybiB0aGlzW2tIYW5kbGVyXS5vblVwZ3JhZGUoc3RhdHVzQ29kZSwgaGVhZGVycywgc29ja2V0KVxuICB9XG5cbiAgb25Db21wbGV0ZSAodHJhaWxlcnMpIHtcbiAgICB0aGlzLm9uRmluYWxseSgpXG5cbiAgICBhc3NlcnQoIXRoaXMuYWJvcnRlZClcblxuICAgIHRoaXMuY29tcGxldGVkID0gdHJ1ZVxuICAgIGlmIChjaGFubmVscy50cmFpbGVycy5oYXNTdWJzY3JpYmVycykge1xuICAgICAgY2hhbm5lbHMudHJhaWxlcnMucHVibGlzaCh7IHJlcXVlc3Q6IHRoaXMsIHRyYWlsZXJzIH0pXG4gICAgfVxuXG4gICAgdHJ5IHtcbiAgICAgIHJldHVybiB0aGlzW2tIYW5kbGVyXS5vbkNvbXBsZXRlKHRyYWlsZXJzKVxuICAgIH0gY2F0Y2ggKGVycikge1xuICAgICAgLy8gVE9ETyAoZml4KTogVGhpcyBtaWdodCBiZSBhIGJhZCBpZGVhP1xuICAgICAgdGhpcy5vbkVycm9yKGVycilcbiAgICB9XG4gIH1cblxuICBvbkVycm9yIChlcnJvcikge1xuICAgIHRoaXMub25GaW5hbGx5KClcblxuICAgIGlmIChjaGFubmVscy5lcnJvci5oYXNTdWJzY3JpYmVycykge1xuICAgICAgY2hhbm5lbHMuZXJyb3IucHVibGlzaCh7IHJlcXVlc3Q6IHRoaXMsIGVycm9yIH0pXG4gICAgfVxuXG4gICAgaWYgKHRoaXMuYWJvcnRlZCkge1xuICAgICAgcmV0dXJuXG4gICAgfVxuICAgIHRoaXMuYWJvcnRlZCA9IHRydWVcblxuICAgIHJldHVybiB0aGlzW2tIYW5kbGVyXS5vbkVycm9yKGVycm9yKVxuICB9XG5cbiAgb25GaW5hbGx5ICgpIHtcbiAgICBpZiAodGhpcy5lcnJvckhhbmRsZXIpIHtcbiAgICAgIHRoaXMuYm9keS5vZmYoJ2Vycm9yJywgdGhpcy5lcnJvckhhbmRsZXIpXG4gICAgICB0aGlzLmVycm9ySGFuZGxlciA9IG51bGxcbiAgICB9XG5cbiAgICBpZiAodGhpcy5lbmRIYW5kbGVyKSB7XG4gICAgICB0aGlzLmJvZHkub2ZmKCdlbmQnLCB0aGlzLmVuZEhhbmRsZXIpXG4gICAgICB0aGlzLmVuZEhhbmRsZXIgPSBudWxsXG4gICAgfVxuICB9XG5cbiAgLy8gVE9ETzogYWRqdXN0IHRvIHN1cHBvcnQgSDJcbiAgYWRkSGVhZGVyIChrZXksIHZhbHVlKSB7XG4gICAgcHJvY2Vzc0hlYWRlcih0aGlzLCBrZXksIHZhbHVlKVxuICAgIHJldHVybiB0aGlzXG4gIH1cblxuICBzdGF0aWMgW2tIVFRQMUJ1aWxkUmVxdWVzdF0gKG9yaWdpbiwgb3B0cywgaGFuZGxlcikge1xuICAgIC8vIFRPRE86IE1pZ3JhdGUgaGVhZGVyIHBhcnNpbmcgaGVyZSwgdG8gbWFrZSBSZXF1ZXN0c1xuICAgIC8vIEhUVFAgYWdub3N0aWNcbiAgICByZXR1cm4gbmV3IFJlcXVlc3Qob3JpZ2luLCBvcHRzLCBoYW5kbGVyKVxuICB9XG5cbiAgc3RhdGljIFtrSFRUUDJCdWlsZFJlcXVlc3RdIChvcmlnaW4sIG9wdHMsIGhhbmRsZXIpIHtcbiAgICBjb25zdCBoZWFkZXJzID0gb3B0cy5oZWFkZXJzXG4gICAgb3B0cyA9IHsgLi4ub3B0cywgaGVhZGVyczogbnVsbCB9XG5cbiAgICBjb25zdCByZXF1ZXN0ID0gbmV3IFJlcXVlc3Qob3JpZ2luLCBvcHRzLCBoYW5kbGVyKVxuXG4gICAgcmVxdWVzdC5oZWFkZXJzID0ge31cblxuICAgIGlmIChBcnJheS5pc0FycmF5KGhlYWRlcnMpKSB7XG4gICAgICBpZiAoaGVhZGVycy5sZW5ndGggJSAyICE9PSAwKSB7XG4gICAgICAgIHRocm93IG5ldyBJbnZhbGlkQXJndW1lbnRFcnJvcignaGVhZGVycyBhcnJheSBtdXN0IGJlIGV2ZW4nKVxuICAgICAgfVxuICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBoZWFkZXJzLmxlbmd0aDsgaSArPSAyKSB7XG4gICAgICAgIHByb2Nlc3NIZWFkZXIocmVxdWVzdCwgaGVhZGVyc1tpXSwgaGVhZGVyc1tpICsgMV0sIHRydWUpXG4gICAgICB9XG4gICAgfSBlbHNlIGlmIChoZWFkZXJzICYmIHR5cGVvZiBoZWFkZXJzID09PSAnb2JqZWN0Jykge1xuICAgICAgY29uc3Qga2V5cyA9IE9iamVjdC5rZXlzKGhlYWRlcnMpXG4gICAgICBmb3IgKGxldCBpID0gMDsgaSA8IGtleXMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgY29uc3Qga2V5ID0ga2V5c1tpXVxuICAgICAgICBwcm9jZXNzSGVhZGVyKHJlcXVlc3QsIGtleSwgaGVhZGVyc1trZXldLCB0cnVlKVxuICAgICAgfVxuICAgIH0gZWxzZSBpZiAoaGVhZGVycyAhPSBudWxsKSB7XG4gICAgICB0aHJvdyBuZXcgSW52YWxpZEFyZ3VtZW50RXJyb3IoJ2hlYWRlcnMgbXVzdCBiZSBhbiBvYmplY3Qgb3IgYW4gYXJyYXknKVxuICAgIH1cblxuICAgIHJldHVybiByZXF1ZXN0XG4gIH1cblxuICBzdGF0aWMgW2tIVFRQMkNvcHlIZWFkZXJzXSAocmF3KSB7XG4gICAgY29uc3QgcmF3SGVhZGVycyA9IHJhdy5zcGxpdCgnXFxyXFxuJylcbiAgICBjb25zdCBoZWFkZXJzID0ge31cblxuICAgIGZvciAoY29uc3QgaGVhZGVyIG9mIHJhd0hlYWRlcnMpIHtcbiAgICAgIGNvbnN0IFtrZXksIHZhbHVlXSA9IGhlYWRlci5zcGxpdCgnOiAnKVxuXG4gICAgICBpZiAodmFsdWUgPT0gbnVsbCB8fCB2YWx1ZS5sZW5ndGggPT09IDApIGNvbnRpbnVlXG5cbiAgICAgIGlmIChoZWFkZXJzW2tleV0pIGhlYWRlcnNba2V5XSArPSBgLCR7dmFsdWV9YFxuICAgICAgZWxzZSBoZWFkZXJzW2tleV0gPSB2YWx1ZVxuICAgIH1cblxuICAgIHJldHVybiBoZWFkZXJzXG4gIH1cbn1cblxuZnVuY3Rpb24gcHJvY2Vzc0hlYWRlclZhbHVlIChrZXksIHZhbCwgc2tpcEFwcGVuZCkge1xuICBpZiAodmFsICYmIHR5cGVvZiB2YWwgPT09ICdvYmplY3QnKSB7XG4gICAgdGhyb3cgbmV3IEludmFsaWRBcmd1bWVudEVycm9yKGBpbnZhbGlkICR7a2V5fSBoZWFkZXJgKVxuICB9XG5cbiAgdmFsID0gdmFsICE9IG51bGwgPyBgJHt2YWx9YCA6ICcnXG5cbiAgaWYgKGhlYWRlckNoYXJSZWdleC5leGVjKHZhbCkgIT09IG51bGwpIHtcbiAgICB0aHJvdyBuZXcgSW52YWxpZEFyZ3VtZW50RXJyb3IoYGludmFsaWQgJHtrZXl9IGhlYWRlcmApXG4gIH1cblxuICByZXR1cm4gc2tpcEFwcGVuZCA/IHZhbCA6IGAke2tleX06ICR7dmFsfVxcclxcbmBcbn1cblxuZnVuY3Rpb24gcHJvY2Vzc0hlYWRlciAocmVxdWVzdCwga2V5LCB2YWwsIHNraXBBcHBlbmQgPSBmYWxzZSkge1xuICBpZiAodmFsICYmICh0eXBlb2YgdmFsID09PSAnb2JqZWN0JyAmJiAhQXJyYXkuaXNBcnJheSh2YWwpKSkge1xuICAgIHRocm93IG5ldyBJbnZhbGlkQXJndW1lbnRFcnJvcihgaW52YWxpZCAke2tleX0gaGVhZGVyYClcbiAgfSBlbHNlIGlmICh2YWwgPT09IHVuZGVmaW5lZCkge1xuICAgIHJldHVyblxuICB9XG5cbiAgaWYgKFxuICAgIHJlcXVlc3QuaG9zdCA9PT0gbnVsbCAmJlxuICAgIGtleS5sZW5ndGggPT09IDQgJiZcbiAgICBrZXkudG9Mb3dlckNhc2UoKSA9PT0gJ2hvc3QnXG4gICkge1xuICAgIGlmIChoZWFkZXJDaGFyUmVnZXguZXhlYyh2YWwpICE9PSBudWxsKSB7XG4gICAgICB0aHJvdyBuZXcgSW52YWxpZEFyZ3VtZW50RXJyb3IoYGludmFsaWQgJHtrZXl9IGhlYWRlcmApXG4gICAgfVxuICAgIC8vIENvbnN1bWVkIGJ5IENsaWVudFxuICAgIHJlcXVlc3QuaG9zdCA9IHZhbFxuICB9IGVsc2UgaWYgKFxuICAgIHJlcXVlc3QuY29udGVudExlbmd0aCA9PT0gbnVsbCAmJlxuICAgIGtleS5sZW5ndGggPT09IDE0ICYmXG4gICAga2V5LnRvTG93ZXJDYXNlKCkgPT09ICdjb250ZW50LWxlbmd0aCdcbiAgKSB7XG4gICAgcmVxdWVzdC5jb250ZW50TGVuZ3RoID0gcGFyc2VJbnQodmFsLCAxMClcbiAgICBpZiAoIU51bWJlci5pc0Zpbml0ZShyZXF1ZXN0LmNvbnRlbnRMZW5ndGgpKSB7XG4gICAgICB0aHJvdyBuZXcgSW52YWxpZEFyZ3VtZW50RXJyb3IoJ2ludmFsaWQgY29udGVudC1sZW5ndGggaGVhZGVyJylcbiAgICB9XG4gIH0gZWxzZSBpZiAoXG4gICAgcmVxdWVzdC5jb250ZW50VHlwZSA9PT0gbnVsbCAmJlxuICAgIGtleS5sZW5ndGggPT09IDEyICYmXG4gICAga2V5LnRvTG93ZXJDYXNlKCkgPT09ICdjb250ZW50LXR5cGUnXG4gICkge1xuICAgIHJlcXVlc3QuY29udGVudFR5cGUgPSB2YWxcbiAgICBpZiAoc2tpcEFwcGVuZCkgcmVxdWVzdC5oZWFkZXJzW2tleV0gPSBwcm9jZXNzSGVhZGVyVmFsdWUoa2V5LCB2YWwsIHNraXBBcHBlbmQpXG4gICAgZWxzZSByZXF1ZXN0LmhlYWRlcnMgKz0gcHJvY2Vzc0hlYWRlclZhbHVlKGtleSwgdmFsKVxuICB9IGVsc2UgaWYgKFxuICAgIGtleS5sZW5ndGggPT09IDE3ICYmXG4gICAga2V5LnRvTG93ZXJDYXNlKCkgPT09ICd0cmFuc2Zlci1lbmNvZGluZydcbiAgKSB7XG4gICAgdGhyb3cgbmV3IEludmFsaWRBcmd1bWVudEVycm9yKCdpbnZhbGlkIHRyYW5zZmVyLWVuY29kaW5nIGhlYWRlcicpXG4gIH0gZWxzZSBpZiAoXG4gICAga2V5Lmxlbmd0aCA9PT0gMTAgJiZcbiAgICBrZXkudG9Mb3dlckNhc2UoKSA9PT0gJ2Nvbm5lY3Rpb24nXG4gICkge1xuICAgIGNvbnN0IHZhbHVlID0gdHlwZW9mIHZhbCA9PT0gJ3N0cmluZycgPyB2YWwudG9Mb3dlckNhc2UoKSA6IG51bGxcbiAgICBpZiAodmFsdWUgIT09ICdjbG9zZScgJiYgdmFsdWUgIT09ICdrZWVwLWFsaXZlJykge1xuICAgICAgdGhyb3cgbmV3IEludmFsaWRBcmd1bWVudEVycm9yKCdpbnZhbGlkIGNvbm5lY3Rpb24gaGVhZGVyJylcbiAgICB9IGVsc2UgaWYgKHZhbHVlID09PSAnY2xvc2UnKSB7XG4gICAgICByZXF1ZXN0LnJlc2V0ID0gdHJ1ZVxuICAgIH1cbiAgfSBlbHNlIGlmIChcbiAgICBrZXkubGVuZ3RoID09PSAxMCAmJlxuICAgIGtleS50b0xvd2VyQ2FzZSgpID09PSAna2VlcC1hbGl2ZSdcbiAgKSB7XG4gICAgdGhyb3cgbmV3IEludmFsaWRBcmd1bWVudEVycm9yKCdpbnZhbGlkIGtlZXAtYWxpdmUgaGVhZGVyJylcbiAgfSBlbHNlIGlmIChcbiAgICBrZXkubGVuZ3RoID09PSA3ICYmXG4gICAga2V5LnRvTG93ZXJDYXNlKCkgPT09ICd1cGdyYWRlJ1xuICApIHtcbiAgICB0aHJvdyBuZXcgSW52YWxpZEFyZ3VtZW50RXJyb3IoJ2ludmFsaWQgdXBncmFkZSBoZWFkZXInKVxuICB9IGVsc2UgaWYgKFxuICAgIGtleS5sZW5ndGggPT09IDYgJiZcbiAgICBrZXkudG9Mb3dlckNhc2UoKSA9PT0gJ2V4cGVjdCdcbiAgKSB7XG4gICAgdGhyb3cgbmV3IE5vdFN1cHBvcnRlZEVycm9yKCdleHBlY3QgaGVhZGVyIG5vdCBzdXBwb3J0ZWQnKVxuICB9IGVsc2UgaWYgKHRva2VuUmVnRXhwLmV4ZWMoa2V5KSA9PT0gbnVsbCkge1xuICAgIHRocm93IG5ldyBJbnZhbGlkQXJndW1lbnRFcnJvcignaW52YWxpZCBoZWFkZXIga2V5JylcbiAgfSBlbHNlIHtcbiAgICBpZiAoQXJyYXkuaXNBcnJheSh2YWwpKSB7XG4gICAgICBmb3IgKGxldCBpID0gMDsgaSA8IHZhbC5sZW5ndGg7IGkrKykge1xuICAgICAgICBpZiAoc2tpcEFwcGVuZCkge1xuICAgICAgICAgIGlmIChyZXF1ZXN0LmhlYWRlcnNba2V5XSkgcmVxdWVzdC5oZWFkZXJzW2tleV0gKz0gYCwke3Byb2Nlc3NIZWFkZXJWYWx1ZShrZXksIHZhbFtpXSwgc2tpcEFwcGVuZCl9YFxuICAgICAgICAgIGVsc2UgcmVxdWVzdC5oZWFkZXJzW2tleV0gPSBwcm9jZXNzSGVhZGVyVmFsdWUoa2V5LCB2YWxbaV0sIHNraXBBcHBlbmQpXG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgcmVxdWVzdC5oZWFkZXJzICs9IHByb2Nlc3NIZWFkZXJWYWx1ZShrZXksIHZhbFtpXSlcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICBpZiAoc2tpcEFwcGVuZCkgcmVxdWVzdC5oZWFkZXJzW2tleV0gPSBwcm9jZXNzSGVhZGVyVmFsdWUoa2V5LCB2YWwsIHNraXBBcHBlbmQpXG4gICAgICBlbHNlIHJlcXVlc3QuaGVhZGVycyArPSBwcm9jZXNzSGVhZGVyVmFsdWUoa2V5LCB2YWwpXG4gICAgfVxuICB9XG59XG5cbm1vZHVsZS5leHBvcnRzID0gUmVxdWVzdFxuIiwKICAgICIndXNlIHN0cmljdCdcblxuY29uc3QgRXZlbnRFbWl0dGVyID0gcmVxdWlyZSgnZXZlbnRzJylcblxuY2xhc3MgRGlzcGF0Y2hlciBleHRlbmRzIEV2ZW50RW1pdHRlciB7XG4gIGRpc3BhdGNoICgpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoJ25vdCBpbXBsZW1lbnRlZCcpXG4gIH1cblxuICBjbG9zZSAoKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKCdub3QgaW1wbGVtZW50ZWQnKVxuICB9XG5cbiAgZGVzdHJveSAoKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKCdub3QgaW1wbGVtZW50ZWQnKVxuICB9XG59XG5cbm1vZHVsZS5leHBvcnRzID0gRGlzcGF0Y2hlclxuIiwKICAgICIndXNlIHN0cmljdCdcblxuY29uc3QgRGlzcGF0Y2hlciA9IHJlcXVpcmUoJy4vZGlzcGF0Y2hlcicpXG5jb25zdCB7XG4gIENsaWVudERlc3Ryb3llZEVycm9yLFxuICBDbGllbnRDbG9zZWRFcnJvcixcbiAgSW52YWxpZEFyZ3VtZW50RXJyb3Jcbn0gPSByZXF1aXJlKCcuL2NvcmUvZXJyb3JzJylcbmNvbnN0IHsga0Rlc3Ryb3ksIGtDbG9zZSwga0Rpc3BhdGNoLCBrSW50ZXJjZXB0b3JzIH0gPSByZXF1aXJlKCcuL2NvcmUvc3ltYm9scycpXG5cbmNvbnN0IGtEZXN0cm95ZWQgPSBTeW1ib2woJ2Rlc3Ryb3llZCcpXG5jb25zdCBrQ2xvc2VkID0gU3ltYm9sKCdjbG9zZWQnKVxuY29uc3Qga09uRGVzdHJveWVkID0gU3ltYm9sKCdvbkRlc3Ryb3llZCcpXG5jb25zdCBrT25DbG9zZWQgPSBTeW1ib2woJ29uQ2xvc2VkJylcbmNvbnN0IGtJbnRlcmNlcHRlZERpc3BhdGNoID0gU3ltYm9sKCdJbnRlcmNlcHRlZCBEaXNwYXRjaCcpXG5cbmNsYXNzIERpc3BhdGNoZXJCYXNlIGV4dGVuZHMgRGlzcGF0Y2hlciB7XG4gIGNvbnN0cnVjdG9yICgpIHtcbiAgICBzdXBlcigpXG5cbiAgICB0aGlzW2tEZXN0cm95ZWRdID0gZmFsc2VcbiAgICB0aGlzW2tPbkRlc3Ryb3llZF0gPSBudWxsXG4gICAgdGhpc1trQ2xvc2VkXSA9IGZhbHNlXG4gICAgdGhpc1trT25DbG9zZWRdID0gW11cbiAgfVxuXG4gIGdldCBkZXN0cm95ZWQgKCkge1xuICAgIHJldHVybiB0aGlzW2tEZXN0cm95ZWRdXG4gIH1cblxuICBnZXQgY2xvc2VkICgpIHtcbiAgICByZXR1cm4gdGhpc1trQ2xvc2VkXVxuICB9XG5cbiAgZ2V0IGludGVyY2VwdG9ycyAoKSB7XG4gICAgcmV0dXJuIHRoaXNba0ludGVyY2VwdG9yc11cbiAgfVxuXG4gIHNldCBpbnRlcmNlcHRvcnMgKG5ld0ludGVyY2VwdG9ycykge1xuICAgIGlmIChuZXdJbnRlcmNlcHRvcnMpIHtcbiAgICAgIGZvciAobGV0IGkgPSBuZXdJbnRlcmNlcHRvcnMubGVuZ3RoIC0gMTsgaSA+PSAwOyBpLS0pIHtcbiAgICAgICAgY29uc3QgaW50ZXJjZXB0b3IgPSB0aGlzW2tJbnRlcmNlcHRvcnNdW2ldXG4gICAgICAgIGlmICh0eXBlb2YgaW50ZXJjZXB0b3IgIT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgICB0aHJvdyBuZXcgSW52YWxpZEFyZ3VtZW50RXJyb3IoJ2ludGVyY2VwdG9yIG11c3QgYmUgYW4gZnVuY3Rpb24nKVxuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuXG4gICAgdGhpc1trSW50ZXJjZXB0b3JzXSA9IG5ld0ludGVyY2VwdG9yc1xuICB9XG5cbiAgY2xvc2UgKGNhbGxiYWNrKSB7XG4gICAgaWYgKGNhbGxiYWNrID09PSB1bmRlZmluZWQpIHtcbiAgICAgIHJldHVybiBuZXcgUHJvbWlzZSgocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XG4gICAgICAgIHRoaXMuY2xvc2UoKGVyciwgZGF0YSkgPT4ge1xuICAgICAgICAgIHJldHVybiBlcnIgPyByZWplY3QoZXJyKSA6IHJlc29sdmUoZGF0YSlcbiAgICAgICAgfSlcbiAgICAgIH0pXG4gICAgfVxuXG4gICAgaWYgKHR5cGVvZiBjYWxsYmFjayAhPT0gJ2Z1bmN0aW9uJykge1xuICAgICAgdGhyb3cgbmV3IEludmFsaWRBcmd1bWVudEVycm9yKCdpbnZhbGlkIGNhbGxiYWNrJylcbiAgICB9XG5cbiAgICBpZiAodGhpc1trRGVzdHJveWVkXSkge1xuICAgICAgcXVldWVNaWNyb3Rhc2soKCkgPT4gY2FsbGJhY2sobmV3IENsaWVudERlc3Ryb3llZEVycm9yKCksIG51bGwpKVxuICAgICAgcmV0dXJuXG4gICAgfVxuXG4gICAgaWYgKHRoaXNba0Nsb3NlZF0pIHtcbiAgICAgIGlmICh0aGlzW2tPbkNsb3NlZF0pIHtcbiAgICAgICAgdGhpc1trT25DbG9zZWRdLnB1c2goY2FsbGJhY2spXG4gICAgICB9IGVsc2Uge1xuICAgICAgICBxdWV1ZU1pY3JvdGFzaygoKSA9PiBjYWxsYmFjayhudWxsLCBudWxsKSlcbiAgICAgIH1cbiAgICAgIHJldHVyblxuICAgIH1cblxuICAgIHRoaXNba0Nsb3NlZF0gPSB0cnVlXG4gICAgdGhpc1trT25DbG9zZWRdLnB1c2goY2FsbGJhY2spXG5cbiAgICBjb25zdCBvbkNsb3NlZCA9ICgpID0+IHtcbiAgICAgIGNvbnN0IGNhbGxiYWNrcyA9IHRoaXNba09uQ2xvc2VkXVxuICAgICAgdGhpc1trT25DbG9zZWRdID0gbnVsbFxuICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBjYWxsYmFja3MubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgY2FsbGJhY2tzW2ldKG51bGwsIG51bGwpXG4gICAgICB9XG4gICAgfVxuXG4gICAgLy8gU2hvdWxkIG5vdCBlcnJvci5cbiAgICB0aGlzW2tDbG9zZV0oKVxuICAgICAgLnRoZW4oKCkgPT4gdGhpcy5kZXN0cm95KCkpXG4gICAgICAudGhlbigoKSA9PiB7XG4gICAgICAgIHF1ZXVlTWljcm90YXNrKG9uQ2xvc2VkKVxuICAgICAgfSlcbiAgfVxuXG4gIGRlc3Ryb3kgKGVyciwgY2FsbGJhY2spIHtcbiAgICBpZiAodHlwZW9mIGVyciA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgY2FsbGJhY2sgPSBlcnJcbiAgICAgIGVyciA9IG51bGxcbiAgICB9XG5cbiAgICBpZiAoY2FsbGJhY2sgPT09IHVuZGVmaW5lZCkge1xuICAgICAgcmV0dXJuIG5ldyBQcm9taXNlKChyZXNvbHZlLCByZWplY3QpID0+IHtcbiAgICAgICAgdGhpcy5kZXN0cm95KGVyciwgKGVyciwgZGF0YSkgPT4ge1xuICAgICAgICAgIHJldHVybiBlcnIgPyAvKiBpc3RhbmJ1bCBpZ25vcmUgbmV4dDogc2hvdWxkIG5ldmVyIGVycm9yICovIHJlamVjdChlcnIpIDogcmVzb2x2ZShkYXRhKVxuICAgICAgICB9KVxuICAgICAgfSlcbiAgICB9XG5cbiAgICBpZiAodHlwZW9mIGNhbGxiYWNrICE9PSAnZnVuY3Rpb24nKSB7XG4gICAgICB0aHJvdyBuZXcgSW52YWxpZEFyZ3VtZW50RXJyb3IoJ2ludmFsaWQgY2FsbGJhY2snKVxuICAgIH1cblxuICAgIGlmICh0aGlzW2tEZXN0cm95ZWRdKSB7XG4gICAgICBpZiAodGhpc1trT25EZXN0cm95ZWRdKSB7XG4gICAgICAgIHRoaXNba09uRGVzdHJveWVkXS5wdXNoKGNhbGxiYWNrKVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgcXVldWVNaWNyb3Rhc2soKCkgPT4gY2FsbGJhY2sobnVsbCwgbnVsbCkpXG4gICAgICB9XG4gICAgICByZXR1cm5cbiAgICB9XG5cbiAgICBpZiAoIWVycikge1xuICAgICAgZXJyID0gbmV3IENsaWVudERlc3Ryb3llZEVycm9yKClcbiAgICB9XG5cbiAgICB0aGlzW2tEZXN0cm95ZWRdID0gdHJ1ZVxuICAgIHRoaXNba09uRGVzdHJveWVkXSA9IHRoaXNba09uRGVzdHJveWVkXSB8fCBbXVxuICAgIHRoaXNba09uRGVzdHJveWVkXS5wdXNoKGNhbGxiYWNrKVxuXG4gICAgY29uc3Qgb25EZXN0cm95ZWQgPSAoKSA9PiB7XG4gICAgICBjb25zdCBjYWxsYmFja3MgPSB0aGlzW2tPbkRlc3Ryb3llZF1cbiAgICAgIHRoaXNba09uRGVzdHJveWVkXSA9IG51bGxcbiAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgY2FsbGJhY2tzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgIGNhbGxiYWNrc1tpXShudWxsLCBudWxsKVxuICAgICAgfVxuICAgIH1cblxuICAgIC8vIFNob3VsZCBub3QgZXJyb3IuXG4gICAgdGhpc1trRGVzdHJveV0oZXJyKS50aGVuKCgpID0+IHtcbiAgICAgIHF1ZXVlTWljcm90YXNrKG9uRGVzdHJveWVkKVxuICAgIH0pXG4gIH1cblxuICBba0ludGVyY2VwdGVkRGlzcGF0Y2hdIChvcHRzLCBoYW5kbGVyKSB7XG4gICAgaWYgKCF0aGlzW2tJbnRlcmNlcHRvcnNdIHx8IHRoaXNba0ludGVyY2VwdG9yc10ubGVuZ3RoID09PSAwKSB7XG4gICAgICB0aGlzW2tJbnRlcmNlcHRlZERpc3BhdGNoXSA9IHRoaXNba0Rpc3BhdGNoXVxuICAgICAgcmV0dXJuIHRoaXNba0Rpc3BhdGNoXShvcHRzLCBoYW5kbGVyKVxuICAgIH1cblxuICAgIGxldCBkaXNwYXRjaCA9IHRoaXNba0Rpc3BhdGNoXS5iaW5kKHRoaXMpXG4gICAgZm9yIChsZXQgaSA9IHRoaXNba0ludGVyY2VwdG9yc10ubGVuZ3RoIC0gMTsgaSA+PSAwOyBpLS0pIHtcbiAgICAgIGRpc3BhdGNoID0gdGhpc1trSW50ZXJjZXB0b3JzXVtpXShkaXNwYXRjaClcbiAgICB9XG4gICAgdGhpc1trSW50ZXJjZXB0ZWREaXNwYXRjaF0gPSBkaXNwYXRjaFxuICAgIHJldHVybiBkaXNwYXRjaChvcHRzLCBoYW5kbGVyKVxuICB9XG5cbiAgZGlzcGF0Y2ggKG9wdHMsIGhhbmRsZXIpIHtcbiAgICBpZiAoIWhhbmRsZXIgfHwgdHlwZW9mIGhhbmRsZXIgIT09ICdvYmplY3QnKSB7XG4gICAgICB0aHJvdyBuZXcgSW52YWxpZEFyZ3VtZW50RXJyb3IoJ2hhbmRsZXIgbXVzdCBiZSBhbiBvYmplY3QnKVxuICAgIH1cblxuICAgIHRyeSB7XG4gICAgICBpZiAoIW9wdHMgfHwgdHlwZW9mIG9wdHMgIT09ICdvYmplY3QnKSB7XG4gICAgICAgIHRocm93IG5ldyBJbnZhbGlkQXJndW1lbnRFcnJvcignb3B0cyBtdXN0IGJlIGFuIG9iamVjdC4nKVxuICAgICAgfVxuXG4gICAgICBpZiAodGhpc1trRGVzdHJveWVkXSB8fCB0aGlzW2tPbkRlc3Ryb3llZF0pIHtcbiAgICAgICAgdGhyb3cgbmV3IENsaWVudERlc3Ryb3llZEVycm9yKClcbiAgICAgIH1cblxuICAgICAgaWYgKHRoaXNba0Nsb3NlZF0pIHtcbiAgICAgICAgdGhyb3cgbmV3IENsaWVudENsb3NlZEVycm9yKClcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIHRoaXNba0ludGVyY2VwdGVkRGlzcGF0Y2hdKG9wdHMsIGhhbmRsZXIpXG4gICAgfSBjYXRjaCAoZXJyKSB7XG4gICAgICBpZiAodHlwZW9mIGhhbmRsZXIub25FcnJvciAhPT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICB0aHJvdyBuZXcgSW52YWxpZEFyZ3VtZW50RXJyb3IoJ2ludmFsaWQgb25FcnJvciBtZXRob2QnKVxuICAgICAgfVxuXG4gICAgICBoYW5kbGVyLm9uRXJyb3IoZXJyKVxuXG4gICAgICByZXR1cm4gZmFsc2VcbiAgICB9XG4gIH1cbn1cblxubW9kdWxlLmV4cG9ydHMgPSBEaXNwYXRjaGVyQmFzZVxuIiwKICAgICIndXNlIHN0cmljdCdcblxuY29uc3QgbmV0ID0gcmVxdWlyZSgnbmV0JylcbmNvbnN0IGFzc2VydCA9IHJlcXVpcmUoJ2Fzc2VydCcpXG5jb25zdCB1dGlsID0gcmVxdWlyZSgnLi91dGlsJylcbmNvbnN0IHsgSW52YWxpZEFyZ3VtZW50RXJyb3IsIENvbm5lY3RUaW1lb3V0RXJyb3IgfSA9IHJlcXVpcmUoJy4vZXJyb3JzJylcblxubGV0IHRscyAvLyBpbmNsdWRlIHRscyBjb25kaXRpb25hbGx5IHNpbmNlIGl0IGlzIG5vdCBhbHdheXMgYXZhaWxhYmxlXG5cbi8vIFRPRE86IHNlc3Npb24gcmUtdXNlIGRvZXMgbm90IHdhaXQgZm9yIHRoZSBmaXJzdFxuLy8gY29ubmVjdGlvbiB0byByZXNvbHZlIHRoZSBzZXNzaW9uIGFuZCBtaWdodCB0aGVyZWZvcmVcbi8vIHJlc29sdmUgdGhlIHNhbWUgc2VydmVybmFtZSBtdWx0aXBsZSB0aW1lcyBldmVuIHdoZW5cbi8vIHJlLXVzZSBpcyBlbmFibGVkLlxuXG5sZXQgU2Vzc2lvbkNhY2hlXG4vLyBGSVhNRTogcmVtb3ZlIHdvcmthcm91bmQgd2hlbiB0aGUgTm9kZSBidWcgaXMgZml4ZWRcbi8vIGh0dHBzOi8vZ2l0aHViLmNvbS9ub2RlanMvbm9kZS9pc3N1ZXMvNDkzNDQjaXNzdWVjb21tZW50LTE3NDE3NzYzMDhcbmlmIChnbG9iYWwuRmluYWxpemF0aW9uUmVnaXN0cnkgJiYgIXByb2Nlc3MuZW52Lk5PREVfVjhfQ09WRVJBR0UpIHtcbiAgU2Vzc2lvbkNhY2hlID0gY2xhc3MgV2Vha1Nlc3Npb25DYWNoZSB7XG4gICAgY29uc3RydWN0b3IgKG1heENhY2hlZFNlc3Npb25zKSB7XG4gICAgICB0aGlzLl9tYXhDYWNoZWRTZXNzaW9ucyA9IG1heENhY2hlZFNlc3Npb25zXG4gICAgICB0aGlzLl9zZXNzaW9uQ2FjaGUgPSBuZXcgTWFwKClcbiAgICAgIHRoaXMuX3Nlc3Npb25SZWdpc3RyeSA9IG5ldyBnbG9iYWwuRmluYWxpemF0aW9uUmVnaXN0cnkoKGtleSkgPT4ge1xuICAgICAgICBpZiAodGhpcy5fc2Vzc2lvbkNhY2hlLnNpemUgPCB0aGlzLl9tYXhDYWNoZWRTZXNzaW9ucykge1xuICAgICAgICAgIHJldHVyblxuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgcmVmID0gdGhpcy5fc2Vzc2lvbkNhY2hlLmdldChrZXkpXG4gICAgICAgIGlmIChyZWYgIT09IHVuZGVmaW5lZCAmJiByZWYuZGVyZWYoKSA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgdGhpcy5fc2Vzc2lvbkNhY2hlLmRlbGV0ZShrZXkpXG4gICAgICAgIH1cbiAgICAgIH0pXG4gICAgfVxuXG4gICAgZ2V0IChzZXNzaW9uS2V5KSB7XG4gICAgICBjb25zdCByZWYgPSB0aGlzLl9zZXNzaW9uQ2FjaGUuZ2V0KHNlc3Npb25LZXkpXG4gICAgICByZXR1cm4gcmVmID8gcmVmLmRlcmVmKCkgOiBudWxsXG4gICAgfVxuXG4gICAgc2V0IChzZXNzaW9uS2V5LCBzZXNzaW9uKSB7XG4gICAgICBpZiAodGhpcy5fbWF4Q2FjaGVkU2Vzc2lvbnMgPT09IDApIHtcbiAgICAgICAgcmV0dXJuXG4gICAgICB9XG5cbiAgICAgIHRoaXMuX3Nlc3Npb25DYWNoZS5zZXQoc2Vzc2lvbktleSwgbmV3IFdlYWtSZWYoc2Vzc2lvbikpXG4gICAgICB0aGlzLl9zZXNzaW9uUmVnaXN0cnkucmVnaXN0ZXIoc2Vzc2lvbiwgc2Vzc2lvbktleSlcbiAgICB9XG4gIH1cbn0gZWxzZSB7XG4gIFNlc3Npb25DYWNoZSA9IGNsYXNzIFNpbXBsZVNlc3Npb25DYWNoZSB7XG4gICAgY29uc3RydWN0b3IgKG1heENhY2hlZFNlc3Npb25zKSB7XG4gICAgICB0aGlzLl9tYXhDYWNoZWRTZXNzaW9ucyA9IG1heENhY2hlZFNlc3Npb25zXG4gICAgICB0aGlzLl9zZXNzaW9uQ2FjaGUgPSBuZXcgTWFwKClcbiAgICB9XG5cbiAgICBnZXQgKHNlc3Npb25LZXkpIHtcbiAgICAgIHJldHVybiB0aGlzLl9zZXNzaW9uQ2FjaGUuZ2V0KHNlc3Npb25LZXkpXG4gICAgfVxuXG4gICAgc2V0IChzZXNzaW9uS2V5LCBzZXNzaW9uKSB7XG4gICAgICBpZiAodGhpcy5fbWF4Q2FjaGVkU2Vzc2lvbnMgPT09IDApIHtcbiAgICAgICAgcmV0dXJuXG4gICAgICB9XG5cbiAgICAgIGlmICh0aGlzLl9zZXNzaW9uQ2FjaGUuc2l6ZSA+PSB0aGlzLl9tYXhDYWNoZWRTZXNzaW9ucykge1xuICAgICAgICAvLyByZW1vdmUgdGhlIG9sZGVzdCBzZXNzaW9uXG4gICAgICAgIGNvbnN0IHsgdmFsdWU6IG9sZGVzdEtleSB9ID0gdGhpcy5fc2Vzc2lvbkNhY2hlLmtleXMoKS5uZXh0KClcbiAgICAgICAgdGhpcy5fc2Vzc2lvbkNhY2hlLmRlbGV0ZShvbGRlc3RLZXkpXG4gICAgICB9XG5cbiAgICAgIHRoaXMuX3Nlc3Npb25DYWNoZS5zZXQoc2Vzc2lvbktleSwgc2Vzc2lvbilcbiAgICB9XG4gIH1cbn1cblxuZnVuY3Rpb24gYnVpbGRDb25uZWN0b3IgKHsgYWxsb3dIMiwgbWF4Q2FjaGVkU2Vzc2lvbnMsIHNvY2tldFBhdGgsIHRpbWVvdXQsIC4uLm9wdHMgfSkge1xuICBpZiAobWF4Q2FjaGVkU2Vzc2lvbnMgIT0gbnVsbCAmJiAoIU51bWJlci5pc0ludGVnZXIobWF4Q2FjaGVkU2Vzc2lvbnMpIHx8IG1heENhY2hlZFNlc3Npb25zIDwgMCkpIHtcbiAgICB0aHJvdyBuZXcgSW52YWxpZEFyZ3VtZW50RXJyb3IoJ21heENhY2hlZFNlc3Npb25zIG11c3QgYmUgYSBwb3NpdGl2ZSBpbnRlZ2VyIG9yIHplcm8nKVxuICB9XG5cbiAgY29uc3Qgb3B0aW9ucyA9IHsgcGF0aDogc29ja2V0UGF0aCwgLi4ub3B0cyB9XG4gIGNvbnN0IHNlc3Npb25DYWNoZSA9IG5ldyBTZXNzaW9uQ2FjaGUobWF4Q2FjaGVkU2Vzc2lvbnMgPT0gbnVsbCA/IDEwMCA6IG1heENhY2hlZFNlc3Npb25zKVxuICB0aW1lb3V0ID0gdGltZW91dCA9PSBudWxsID8gMTBlMyA6IHRpbWVvdXRcbiAgYWxsb3dIMiA9IGFsbG93SDIgIT0gbnVsbCA/IGFsbG93SDIgOiBmYWxzZVxuICByZXR1cm4gZnVuY3Rpb24gY29ubmVjdCAoeyBob3N0bmFtZSwgaG9zdCwgcHJvdG9jb2wsIHBvcnQsIHNlcnZlcm5hbWUsIGxvY2FsQWRkcmVzcywgaHR0cFNvY2tldCB9LCBjYWxsYmFjaykge1xuICAgIGxldCBzb2NrZXRcbiAgICBpZiAocHJvdG9jb2wgPT09ICdodHRwczonKSB7XG4gICAgICBpZiAoIXRscykge1xuICAgICAgICB0bHMgPSByZXF1aXJlKCd0bHMnKVxuICAgICAgfVxuICAgICAgc2VydmVybmFtZSA9IHNlcnZlcm5hbWUgfHwgb3B0aW9ucy5zZXJ2ZXJuYW1lIHx8IHV0aWwuZ2V0U2VydmVyTmFtZShob3N0KSB8fCBudWxsXG5cbiAgICAgIGNvbnN0IHNlc3Npb25LZXkgPSBzZXJ2ZXJuYW1lIHx8IGhvc3RuYW1lXG4gICAgICBjb25zdCBzZXNzaW9uID0gc2Vzc2lvbkNhY2hlLmdldChzZXNzaW9uS2V5KSB8fCBudWxsXG5cbiAgICAgIGFzc2VydChzZXNzaW9uS2V5KVxuXG4gICAgICBzb2NrZXQgPSB0bHMuY29ubmVjdCh7XG4gICAgICAgIGhpZ2hXYXRlck1hcms6IDE2Mzg0LCAvLyBUTFMgaW4gbm9kZSBjYW4ndCBoYXZlIGJpZ2dlciBIV00gYW55d2F5Li4uXG4gICAgICAgIC4uLm9wdGlvbnMsXG4gICAgICAgIHNlcnZlcm5hbWUsXG4gICAgICAgIHNlc3Npb24sXG4gICAgICAgIGxvY2FsQWRkcmVzcyxcbiAgICAgICAgLy8gVE9ETyhIVFRQLzIpOiBBZGQgc3VwcG9ydCBmb3IgaDJjXG4gICAgICAgIEFMUE5Qcm90b2NvbHM6IGFsbG93SDIgPyBbJ2h0dHAvMS4xJywgJ2gyJ10gOiBbJ2h0dHAvMS4xJ10sXG4gICAgICAgIHNvY2tldDogaHR0cFNvY2tldCwgLy8gdXBncmFkZSBzb2NrZXQgY29ubmVjdGlvblxuICAgICAgICBwb3J0OiBwb3J0IHx8IDQ0MyxcbiAgICAgICAgaG9zdDogaG9zdG5hbWVcbiAgICAgIH0pXG5cbiAgICAgIHNvY2tldFxuICAgICAgICAub24oJ3Nlc3Npb24nLCBmdW5jdGlvbiAoc2Vzc2lvbikge1xuICAgICAgICAgIC8vIFRPRE8gKGZpeCk6IENhbiBhIHNlc3Npb24gYmVjb21lIGludmFsaWQgb25jZSBlc3RhYmxpc2hlZD8gRG9uJ3QgdGhpbmsgc28/XG4gICAgICAgICAgc2Vzc2lvbkNhY2hlLnNldChzZXNzaW9uS2V5LCBzZXNzaW9uKVxuICAgICAgICB9KVxuICAgIH0gZWxzZSB7XG4gICAgICBhc3NlcnQoIWh0dHBTb2NrZXQsICdodHRwU29ja2V0IGNhbiBvbmx5IGJlIHNlbnQgb24gVExTIHVwZGF0ZScpXG4gICAgICBzb2NrZXQgPSBuZXQuY29ubmVjdCh7XG4gICAgICAgIGhpZ2hXYXRlck1hcms6IDY0ICogMTAyNCwgLy8gU2FtZSBhcyBub2RlanMgZnMgc3RyZWFtcy5cbiAgICAgICAgLi4ub3B0aW9ucyxcbiAgICAgICAgbG9jYWxBZGRyZXNzLFxuICAgICAgICBwb3J0OiBwb3J0IHx8IDgwLFxuICAgICAgICBob3N0OiBob3N0bmFtZVxuICAgICAgfSlcbiAgICB9XG5cbiAgICAvLyBTZXQgVENQIGtlZXAgYWxpdmUgb3B0aW9ucyBvbiB0aGUgc29ja2V0IGhlcmUgaW5zdGVhZCBvZiBpbiBjb25uZWN0KCkgZm9yIHRoZSBjYXNlIG9mIGFzc2lnbmluZyB0aGUgc29ja2V0XG4gICAgaWYgKG9wdGlvbnMua2VlcEFsaXZlID09IG51bGwgfHwgb3B0aW9ucy5rZWVwQWxpdmUpIHtcbiAgICAgIGNvbnN0IGtlZXBBbGl2ZUluaXRpYWxEZWxheSA9IG9wdGlvbnMua2VlcEFsaXZlSW5pdGlhbERlbGF5ID09PSB1bmRlZmluZWQgPyA2MGUzIDogb3B0aW9ucy5rZWVwQWxpdmVJbml0aWFsRGVsYXlcbiAgICAgIHNvY2tldC5zZXRLZWVwQWxpdmUodHJ1ZSwga2VlcEFsaXZlSW5pdGlhbERlbGF5KVxuICAgIH1cblxuICAgIGNvbnN0IGNhbmNlbFRpbWVvdXQgPSBzZXR1cFRpbWVvdXQoKCkgPT4gb25Db25uZWN0VGltZW91dChzb2NrZXQpLCB0aW1lb3V0KVxuXG4gICAgc29ja2V0XG4gICAgICAuc2V0Tm9EZWxheSh0cnVlKVxuICAgICAgLm9uY2UocHJvdG9jb2wgPT09ICdodHRwczonID8gJ3NlY3VyZUNvbm5lY3QnIDogJ2Nvbm5lY3QnLCBmdW5jdGlvbiAoKSB7XG4gICAgICAgIGNhbmNlbFRpbWVvdXQoKVxuXG4gICAgICAgIGlmIChjYWxsYmFjaykge1xuICAgICAgICAgIGNvbnN0IGNiID0gY2FsbGJhY2tcbiAgICAgICAgICBjYWxsYmFjayA9IG51bGxcbiAgICAgICAgICBjYihudWxsLCB0aGlzKVxuICAgICAgICB9XG4gICAgICB9KVxuICAgICAgLm9uKCdlcnJvcicsIGZ1bmN0aW9uIChlcnIpIHtcbiAgICAgICAgY2FuY2VsVGltZW91dCgpXG5cbiAgICAgICAgaWYgKGNhbGxiYWNrKSB7XG4gICAgICAgICAgY29uc3QgY2IgPSBjYWxsYmFja1xuICAgICAgICAgIGNhbGxiYWNrID0gbnVsbFxuICAgICAgICAgIGNiKGVycilcbiAgICAgICAgfVxuICAgICAgfSlcblxuICAgIHJldHVybiBzb2NrZXRcbiAgfVxufVxuXG5mdW5jdGlvbiBzZXR1cFRpbWVvdXQgKG9uQ29ubmVjdFRpbWVvdXQsIHRpbWVvdXQpIHtcbiAgaWYgKCF0aW1lb3V0KSB7XG4gICAgcmV0dXJuICgpID0+IHt9XG4gIH1cblxuICBsZXQgczEgPSBudWxsXG4gIGxldCBzMiA9IG51bGxcbiAgY29uc3QgdGltZW91dElkID0gc2V0VGltZW91dCgoKSA9PiB7XG4gICAgLy8gc2V0SW1tZWRpYXRlIGlzIGFkZGVkIHRvIG1ha2Ugc3VyZSB0aGF0IHdlIHByaW90b3Jpc2Ugc29ja2V0IGVycm9yIGV2ZW50cyBvdmVyIHRpbWVvdXRzXG4gICAgczEgPSBzZXRJbW1lZGlhdGUoKCkgPT4ge1xuICAgICAgaWYgKHByb2Nlc3MucGxhdGZvcm0gPT09ICd3aW4zMicpIHtcbiAgICAgICAgLy8gV2luZG93cyBuZWVkcyBhbiBleHRyYSBzZXRJbW1lZGlhdGUgcHJvYmFibHkgZHVlIHRvIGltcGxlbWVudGF0aW9uIGRpZmZlcmVuY2VzIGluIHRoZSBzb2NrZXQgbG9naWNcbiAgICAgICAgczIgPSBzZXRJbW1lZGlhdGUoKCkgPT4gb25Db25uZWN0VGltZW91dCgpKVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgb25Db25uZWN0VGltZW91dCgpXG4gICAgICB9XG4gICAgfSlcbiAgfSwgdGltZW91dClcbiAgcmV0dXJuICgpID0+IHtcbiAgICBjbGVhclRpbWVvdXQodGltZW91dElkKVxuICAgIGNsZWFySW1tZWRpYXRlKHMxKVxuICAgIGNsZWFySW1tZWRpYXRlKHMyKVxuICB9XG59XG5cbmZ1bmN0aW9uIG9uQ29ubmVjdFRpbWVvdXQgKHNvY2tldCkge1xuICB1dGlsLmRlc3Ryb3koc29ja2V0LCBuZXcgQ29ubmVjdFRpbWVvdXRFcnJvcigpKVxufVxuXG5tb2R1bGUuZXhwb3J0cyA9IGJ1aWxkQ29ubmVjdG9yXG4iLAogICAgIlwidXNlIHN0cmljdFwiO1xuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiX19lc01vZHVsZVwiLCB7IHZhbHVlOiB0cnVlIH0pO1xuZXhwb3J0cy5lbnVtVG9NYXAgPSB2b2lkIDA7XG5mdW5jdGlvbiBlbnVtVG9NYXAob2JqKSB7XG4gICAgY29uc3QgcmVzID0ge307XG4gICAgT2JqZWN0LmtleXMob2JqKS5mb3JFYWNoKChrZXkpID0+IHtcbiAgICAgICAgY29uc3QgdmFsdWUgPSBvYmpba2V5XTtcbiAgICAgICAgaWYgKHR5cGVvZiB2YWx1ZSA9PT0gJ251bWJlcicpIHtcbiAgICAgICAgICAgIHJlc1trZXldID0gdmFsdWU7XG4gICAgICAgIH1cbiAgICB9KTtcbiAgICByZXR1cm4gcmVzO1xufVxuZXhwb3J0cy5lbnVtVG9NYXAgPSBlbnVtVG9NYXA7XG4vLyMgc291cmNlTWFwcGluZ1VSTD11dGlscy5qcy5tYXAiLAogICAgIlwidXNlIHN0cmljdFwiO1xuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiX19lc01vZHVsZVwiLCB7IHZhbHVlOiB0cnVlIH0pO1xuZXhwb3J0cy5TUEVDSUFMX0hFQURFUlMgPSBleHBvcnRzLkhFQURFUl9TVEFURSA9IGV4cG9ydHMuTUlOT1IgPSBleHBvcnRzLk1BSk9SID0gZXhwb3J0cy5DT05ORUNUSU9OX1RPS0VOX0NIQVJTID0gZXhwb3J0cy5IRUFERVJfQ0hBUlMgPSBleHBvcnRzLlRPS0VOID0gZXhwb3J0cy5TVFJJQ1RfVE9LRU4gPSBleHBvcnRzLkhFWCA9IGV4cG9ydHMuVVJMX0NIQVIgPSBleHBvcnRzLlNUUklDVF9VUkxfQ0hBUiA9IGV4cG9ydHMuVVNFUklORk9fQ0hBUlMgPSBleHBvcnRzLk1BUksgPSBleHBvcnRzLkFMUEhBTlVNID0gZXhwb3J0cy5OVU0gPSBleHBvcnRzLkhFWF9NQVAgPSBleHBvcnRzLk5VTV9NQVAgPSBleHBvcnRzLkFMUEhBID0gZXhwb3J0cy5GSU5JU0ggPSBleHBvcnRzLkhfTUVUSE9EX01BUCA9IGV4cG9ydHMuTUVUSE9EX01BUCA9IGV4cG9ydHMuTUVUSE9EU19SVFNQID0gZXhwb3J0cy5NRVRIT0RTX0lDRSA9IGV4cG9ydHMuTUVUSE9EU19IVFRQID0gZXhwb3J0cy5NRVRIT0RTID0gZXhwb3J0cy5MRU5JRU5UX0ZMQUdTID0gZXhwb3J0cy5GTEFHUyA9IGV4cG9ydHMuVFlQRSA9IGV4cG9ydHMuRVJST1IgPSB2b2lkIDA7XG5jb25zdCB1dGlsc18xID0gcmVxdWlyZShcIi4vdXRpbHNcIik7XG4vLyBDIGhlYWRlcnNcbnZhciBFUlJPUjtcbihmdW5jdGlvbiAoRVJST1IpIHtcbiAgICBFUlJPUltFUlJPUltcIk9LXCJdID0gMF0gPSBcIk9LXCI7XG4gICAgRVJST1JbRVJST1JbXCJJTlRFUk5BTFwiXSA9IDFdID0gXCJJTlRFUk5BTFwiO1xuICAgIEVSUk9SW0VSUk9SW1wiU1RSSUNUXCJdID0gMl0gPSBcIlNUUklDVFwiO1xuICAgIEVSUk9SW0VSUk9SW1wiTEZfRVhQRUNURURcIl0gPSAzXSA9IFwiTEZfRVhQRUNURURcIjtcbiAgICBFUlJPUltFUlJPUltcIlVORVhQRUNURURfQ09OVEVOVF9MRU5HVEhcIl0gPSA0XSA9IFwiVU5FWFBFQ1RFRF9DT05URU5UX0xFTkdUSFwiO1xuICAgIEVSUk9SW0VSUk9SW1wiQ0xPU0VEX0NPTk5FQ1RJT05cIl0gPSA1XSA9IFwiQ0xPU0VEX0NPTk5FQ1RJT05cIjtcbiAgICBFUlJPUltFUlJPUltcIklOVkFMSURfTUVUSE9EXCJdID0gNl0gPSBcIklOVkFMSURfTUVUSE9EXCI7XG4gICAgRVJST1JbRVJST1JbXCJJTlZBTElEX1VSTFwiXSA9IDddID0gXCJJTlZBTElEX1VSTFwiO1xuICAgIEVSUk9SW0VSUk9SW1wiSU5WQUxJRF9DT05TVEFOVFwiXSA9IDhdID0gXCJJTlZBTElEX0NPTlNUQU5UXCI7XG4gICAgRVJST1JbRVJST1JbXCJJTlZBTElEX1ZFUlNJT05cIl0gPSA5XSA9IFwiSU5WQUxJRF9WRVJTSU9OXCI7XG4gICAgRVJST1JbRVJST1JbXCJJTlZBTElEX0hFQURFUl9UT0tFTlwiXSA9IDEwXSA9IFwiSU5WQUxJRF9IRUFERVJfVE9LRU5cIjtcbiAgICBFUlJPUltFUlJPUltcIklOVkFMSURfQ09OVEVOVF9MRU5HVEhcIl0gPSAxMV0gPSBcIklOVkFMSURfQ09OVEVOVF9MRU5HVEhcIjtcbiAgICBFUlJPUltFUlJPUltcIklOVkFMSURfQ0hVTktfU0laRVwiXSA9IDEyXSA9IFwiSU5WQUxJRF9DSFVOS19TSVpFXCI7XG4gICAgRVJST1JbRVJST1JbXCJJTlZBTElEX1NUQVRVU1wiXSA9IDEzXSA9IFwiSU5WQUxJRF9TVEFUVVNcIjtcbiAgICBFUlJPUltFUlJPUltcIklOVkFMSURfRU9GX1NUQVRFXCJdID0gMTRdID0gXCJJTlZBTElEX0VPRl9TVEFURVwiO1xuICAgIEVSUk9SW0VSUk9SW1wiSU5WQUxJRF9UUkFOU0ZFUl9FTkNPRElOR1wiXSA9IDE1XSA9IFwiSU5WQUxJRF9UUkFOU0ZFUl9FTkNPRElOR1wiO1xuICAgIEVSUk9SW0VSUk9SW1wiQ0JfTUVTU0FHRV9CRUdJTlwiXSA9IDE2XSA9IFwiQ0JfTUVTU0FHRV9CRUdJTlwiO1xuICAgIEVSUk9SW0VSUk9SW1wiQ0JfSEVBREVSU19DT01QTEVURVwiXSA9IDE3XSA9IFwiQ0JfSEVBREVSU19DT01QTEVURVwiO1xuICAgIEVSUk9SW0VSUk9SW1wiQ0JfTUVTU0FHRV9DT01QTEVURVwiXSA9IDE4XSA9IFwiQ0JfTUVTU0FHRV9DT01QTEVURVwiO1xuICAgIEVSUk9SW0VSUk9SW1wiQ0JfQ0hVTktfSEVBREVSXCJdID0gMTldID0gXCJDQl9DSFVOS19IRUFERVJcIjtcbiAgICBFUlJPUltFUlJPUltcIkNCX0NIVU5LX0NPTVBMRVRFXCJdID0gMjBdID0gXCJDQl9DSFVOS19DT01QTEVURVwiO1xuICAgIEVSUk9SW0VSUk9SW1wiUEFVU0VEXCJdID0gMjFdID0gXCJQQVVTRURcIjtcbiAgICBFUlJPUltFUlJPUltcIlBBVVNFRF9VUEdSQURFXCJdID0gMjJdID0gXCJQQVVTRURfVVBHUkFERVwiO1xuICAgIEVSUk9SW0VSUk9SW1wiUEFVU0VEX0gyX1VQR1JBREVcIl0gPSAyM10gPSBcIlBBVVNFRF9IMl9VUEdSQURFXCI7XG4gICAgRVJST1JbRVJST1JbXCJVU0VSXCJdID0gMjRdID0gXCJVU0VSXCI7XG59KShFUlJPUiA9IGV4cG9ydHMuRVJST1IgfHwgKGV4cG9ydHMuRVJST1IgPSB7fSkpO1xudmFyIFRZUEU7XG4oZnVuY3Rpb24gKFRZUEUpIHtcbiAgICBUWVBFW1RZUEVbXCJCT1RIXCJdID0gMF0gPSBcIkJPVEhcIjtcbiAgICBUWVBFW1RZUEVbXCJSRVFVRVNUXCJdID0gMV0gPSBcIlJFUVVFU1RcIjtcbiAgICBUWVBFW1RZUEVbXCJSRVNQT05TRVwiXSA9IDJdID0gXCJSRVNQT05TRVwiO1xufSkoVFlQRSA9IGV4cG9ydHMuVFlQRSB8fCAoZXhwb3J0cy5UWVBFID0ge30pKTtcbnZhciBGTEFHUztcbihmdW5jdGlvbiAoRkxBR1MpIHtcbiAgICBGTEFHU1tGTEFHU1tcIkNPTk5FQ1RJT05fS0VFUF9BTElWRVwiXSA9IDFdID0gXCJDT05ORUNUSU9OX0tFRVBfQUxJVkVcIjtcbiAgICBGTEFHU1tGTEFHU1tcIkNPTk5FQ1RJT05fQ0xPU0VcIl0gPSAyXSA9IFwiQ09OTkVDVElPTl9DTE9TRVwiO1xuICAgIEZMQUdTW0ZMQUdTW1wiQ09OTkVDVElPTl9VUEdSQURFXCJdID0gNF0gPSBcIkNPTk5FQ1RJT05fVVBHUkFERVwiO1xuICAgIEZMQUdTW0ZMQUdTW1wiQ0hVTktFRFwiXSA9IDhdID0gXCJDSFVOS0VEXCI7XG4gICAgRkxBR1NbRkxBR1NbXCJVUEdSQURFXCJdID0gMTZdID0gXCJVUEdSQURFXCI7XG4gICAgRkxBR1NbRkxBR1NbXCJDT05URU5UX0xFTkdUSFwiXSA9IDMyXSA9IFwiQ09OVEVOVF9MRU5HVEhcIjtcbiAgICBGTEFHU1tGTEFHU1tcIlNLSVBCT0RZXCJdID0gNjRdID0gXCJTS0lQQk9EWVwiO1xuICAgIEZMQUdTW0ZMQUdTW1wiVFJBSUxJTkdcIl0gPSAxMjhdID0gXCJUUkFJTElOR1wiO1xuICAgIC8vIDEgPDwgOCBpcyB1bnVzZWRcbiAgICBGTEFHU1tGTEFHU1tcIlRSQU5TRkVSX0VOQ09ESU5HXCJdID0gNTEyXSA9IFwiVFJBTlNGRVJfRU5DT0RJTkdcIjtcbn0pKEZMQUdTID0gZXhwb3J0cy5GTEFHUyB8fCAoZXhwb3J0cy5GTEFHUyA9IHt9KSk7XG52YXIgTEVOSUVOVF9GTEFHUztcbihmdW5jdGlvbiAoTEVOSUVOVF9GTEFHUykge1xuICAgIExFTklFTlRfRkxBR1NbTEVOSUVOVF9GTEFHU1tcIkhFQURFUlNcIl0gPSAxXSA9IFwiSEVBREVSU1wiO1xuICAgIExFTklFTlRfRkxBR1NbTEVOSUVOVF9GTEFHU1tcIkNIVU5LRURfTEVOR1RIXCJdID0gMl0gPSBcIkNIVU5LRURfTEVOR1RIXCI7XG4gICAgTEVOSUVOVF9GTEFHU1tMRU5JRU5UX0ZMQUdTW1wiS0VFUF9BTElWRVwiXSA9IDRdID0gXCJLRUVQX0FMSVZFXCI7XG59KShMRU5JRU5UX0ZMQUdTID0gZXhwb3J0cy5MRU5JRU5UX0ZMQUdTIHx8IChleHBvcnRzLkxFTklFTlRfRkxBR1MgPSB7fSkpO1xudmFyIE1FVEhPRFM7XG4oZnVuY3Rpb24gKE1FVEhPRFMpIHtcbiAgICBNRVRIT0RTW01FVEhPRFNbXCJERUxFVEVcIl0gPSAwXSA9IFwiREVMRVRFXCI7XG4gICAgTUVUSE9EU1tNRVRIT0RTW1wiR0VUXCJdID0gMV0gPSBcIkdFVFwiO1xuICAgIE1FVEhPRFNbTUVUSE9EU1tcIkhFQURcIl0gPSAyXSA9IFwiSEVBRFwiO1xuICAgIE1FVEhPRFNbTUVUSE9EU1tcIlBPU1RcIl0gPSAzXSA9IFwiUE9TVFwiO1xuICAgIE1FVEhPRFNbTUVUSE9EU1tcIlBVVFwiXSA9IDRdID0gXCJQVVRcIjtcbiAgICAvKiBwYXRob2xvZ2ljYWwgKi9cbiAgICBNRVRIT0RTW01FVEhPRFNbXCJDT05ORUNUXCJdID0gNV0gPSBcIkNPTk5FQ1RcIjtcbiAgICBNRVRIT0RTW01FVEhPRFNbXCJPUFRJT05TXCJdID0gNl0gPSBcIk9QVElPTlNcIjtcbiAgICBNRVRIT0RTW01FVEhPRFNbXCJUUkFDRVwiXSA9IDddID0gXCJUUkFDRVwiO1xuICAgIC8qIFdlYkRBViAqL1xuICAgIE1FVEhPRFNbTUVUSE9EU1tcIkNPUFlcIl0gPSA4XSA9IFwiQ09QWVwiO1xuICAgIE1FVEhPRFNbTUVUSE9EU1tcIkxPQ0tcIl0gPSA5XSA9IFwiTE9DS1wiO1xuICAgIE1FVEhPRFNbTUVUSE9EU1tcIk1LQ09MXCJdID0gMTBdID0gXCJNS0NPTFwiO1xuICAgIE1FVEhPRFNbTUVUSE9EU1tcIk1PVkVcIl0gPSAxMV0gPSBcIk1PVkVcIjtcbiAgICBNRVRIT0RTW01FVEhPRFNbXCJQUk9QRklORFwiXSA9IDEyXSA9IFwiUFJPUEZJTkRcIjtcbiAgICBNRVRIT0RTW01FVEhPRFNbXCJQUk9QUEFUQ0hcIl0gPSAxM10gPSBcIlBST1BQQVRDSFwiO1xuICAgIE1FVEhPRFNbTUVUSE9EU1tcIlNFQVJDSFwiXSA9IDE0XSA9IFwiU0VBUkNIXCI7XG4gICAgTUVUSE9EU1tNRVRIT0RTW1wiVU5MT0NLXCJdID0gMTVdID0gXCJVTkxPQ0tcIjtcbiAgICBNRVRIT0RTW01FVEhPRFNbXCJCSU5EXCJdID0gMTZdID0gXCJCSU5EXCI7XG4gICAgTUVUSE9EU1tNRVRIT0RTW1wiUkVCSU5EXCJdID0gMTddID0gXCJSRUJJTkRcIjtcbiAgICBNRVRIT0RTW01FVEhPRFNbXCJVTkJJTkRcIl0gPSAxOF0gPSBcIlVOQklORFwiO1xuICAgIE1FVEhPRFNbTUVUSE9EU1tcIkFDTFwiXSA9IDE5XSA9IFwiQUNMXCI7XG4gICAgLyogc3VidmVyc2lvbiAqL1xuICAgIE1FVEhPRFNbTUVUSE9EU1tcIlJFUE9SVFwiXSA9IDIwXSA9IFwiUkVQT1JUXCI7XG4gICAgTUVUSE9EU1tNRVRIT0RTW1wiTUtBQ1RJVklUWVwiXSA9IDIxXSA9IFwiTUtBQ1RJVklUWVwiO1xuICAgIE1FVEhPRFNbTUVUSE9EU1tcIkNIRUNLT1VUXCJdID0gMjJdID0gXCJDSEVDS09VVFwiO1xuICAgIE1FVEhPRFNbTUVUSE9EU1tcIk1FUkdFXCJdID0gMjNdID0gXCJNRVJHRVwiO1xuICAgIC8qIHVwbnAgKi9cbiAgICBNRVRIT0RTW01FVEhPRFNbXCJNLVNFQVJDSFwiXSA9IDI0XSA9IFwiTS1TRUFSQ0hcIjtcbiAgICBNRVRIT0RTW01FVEhPRFNbXCJOT1RJRllcIl0gPSAyNV0gPSBcIk5PVElGWVwiO1xuICAgIE1FVEhPRFNbTUVUSE9EU1tcIlNVQlNDUklCRVwiXSA9IDI2XSA9IFwiU1VCU0NSSUJFXCI7XG4gICAgTUVUSE9EU1tNRVRIT0RTW1wiVU5TVUJTQ1JJQkVcIl0gPSAyN10gPSBcIlVOU1VCU0NSSUJFXCI7XG4gICAgLyogUkZDLTU3ODkgKi9cbiAgICBNRVRIT0RTW01FVEhPRFNbXCJQQVRDSFwiXSA9IDI4XSA9IFwiUEFUQ0hcIjtcbiAgICBNRVRIT0RTW01FVEhPRFNbXCJQVVJHRVwiXSA9IDI5XSA9IFwiUFVSR0VcIjtcbiAgICAvKiBDYWxEQVYgKi9cbiAgICBNRVRIT0RTW01FVEhPRFNbXCJNS0NBTEVOREFSXCJdID0gMzBdID0gXCJNS0NBTEVOREFSXCI7XG4gICAgLyogUkZDLTIwNjgsIHNlY3Rpb24gMTkuNi4xLjIgKi9cbiAgICBNRVRIT0RTW01FVEhPRFNbXCJMSU5LXCJdID0gMzFdID0gXCJMSU5LXCI7XG4gICAgTUVUSE9EU1tNRVRIT0RTW1wiVU5MSU5LXCJdID0gMzJdID0gXCJVTkxJTktcIjtcbiAgICAvKiBpY2VjYXN0ICovXG4gICAgTUVUSE9EU1tNRVRIT0RTW1wiU09VUkNFXCJdID0gMzNdID0gXCJTT1VSQ0VcIjtcbiAgICAvKiBSRkMtNzU0MCwgc2VjdGlvbiAxMS42ICovXG4gICAgTUVUSE9EU1tNRVRIT0RTW1wiUFJJXCJdID0gMzRdID0gXCJQUklcIjtcbiAgICAvKiBSRkMtMjMyNiBSVFNQICovXG4gICAgTUVUSE9EU1tNRVRIT0RTW1wiREVTQ1JJQkVcIl0gPSAzNV0gPSBcIkRFU0NSSUJFXCI7XG4gICAgTUVUSE9EU1tNRVRIT0RTW1wiQU5OT1VOQ0VcIl0gPSAzNl0gPSBcIkFOTk9VTkNFXCI7XG4gICAgTUVUSE9EU1tNRVRIT0RTW1wiU0VUVVBcIl0gPSAzN10gPSBcIlNFVFVQXCI7XG4gICAgTUVUSE9EU1tNRVRIT0RTW1wiUExBWVwiXSA9IDM4XSA9IFwiUExBWVwiO1xuICAgIE1FVEhPRFNbTUVUSE9EU1tcIlBBVVNFXCJdID0gMzldID0gXCJQQVVTRVwiO1xuICAgIE1FVEhPRFNbTUVUSE9EU1tcIlRFQVJET1dOXCJdID0gNDBdID0gXCJURUFSRE9XTlwiO1xuICAgIE1FVEhPRFNbTUVUSE9EU1tcIkdFVF9QQVJBTUVURVJcIl0gPSA0MV0gPSBcIkdFVF9QQVJBTUVURVJcIjtcbiAgICBNRVRIT0RTW01FVEhPRFNbXCJTRVRfUEFSQU1FVEVSXCJdID0gNDJdID0gXCJTRVRfUEFSQU1FVEVSXCI7XG4gICAgTUVUSE9EU1tNRVRIT0RTW1wiUkVESVJFQ1RcIl0gPSA0M10gPSBcIlJFRElSRUNUXCI7XG4gICAgTUVUSE9EU1tNRVRIT0RTW1wiUkVDT1JEXCJdID0gNDRdID0gXCJSRUNPUkRcIjtcbiAgICAvKiBSQU9QICovXG4gICAgTUVUSE9EU1tNRVRIT0RTW1wiRkxVU0hcIl0gPSA0NV0gPSBcIkZMVVNIXCI7XG59KShNRVRIT0RTID0gZXhwb3J0cy5NRVRIT0RTIHx8IChleHBvcnRzLk1FVEhPRFMgPSB7fSkpO1xuZXhwb3J0cy5NRVRIT0RTX0hUVFAgPSBbXG4gICAgTUVUSE9EUy5ERUxFVEUsXG4gICAgTUVUSE9EUy5HRVQsXG4gICAgTUVUSE9EUy5IRUFELFxuICAgIE1FVEhPRFMuUE9TVCxcbiAgICBNRVRIT0RTLlBVVCxcbiAgICBNRVRIT0RTLkNPTk5FQ1QsXG4gICAgTUVUSE9EUy5PUFRJT05TLFxuICAgIE1FVEhPRFMuVFJBQ0UsXG4gICAgTUVUSE9EUy5DT1BZLFxuICAgIE1FVEhPRFMuTE9DSyxcbiAgICBNRVRIT0RTLk1LQ09MLFxuICAgIE1FVEhPRFMuTU9WRSxcbiAgICBNRVRIT0RTLlBST1BGSU5ELFxuICAgIE1FVEhPRFMuUFJPUFBBVENILFxuICAgIE1FVEhPRFMuU0VBUkNILFxuICAgIE1FVEhPRFMuVU5MT0NLLFxuICAgIE1FVEhPRFMuQklORCxcbiAgICBNRVRIT0RTLlJFQklORCxcbiAgICBNRVRIT0RTLlVOQklORCxcbiAgICBNRVRIT0RTLkFDTCxcbiAgICBNRVRIT0RTLlJFUE9SVCxcbiAgICBNRVRIT0RTLk1LQUNUSVZJVFksXG4gICAgTUVUSE9EUy5DSEVDS09VVCxcbiAgICBNRVRIT0RTLk1FUkdFLFxuICAgIE1FVEhPRFNbJ00tU0VBUkNIJ10sXG4gICAgTUVUSE9EUy5OT1RJRlksXG4gICAgTUVUSE9EUy5TVUJTQ1JJQkUsXG4gICAgTUVUSE9EUy5VTlNVQlNDUklCRSxcbiAgICBNRVRIT0RTLlBBVENILFxuICAgIE1FVEhPRFMuUFVSR0UsXG4gICAgTUVUSE9EUy5NS0NBTEVOREFSLFxuICAgIE1FVEhPRFMuTElOSyxcbiAgICBNRVRIT0RTLlVOTElOSyxcbiAgICBNRVRIT0RTLlBSSSxcbiAgICAvLyBUT0RPKGluZHV0bnkpOiBzaG91bGQgd2UgYWxsb3cgaXQgd2l0aCBIVFRQP1xuICAgIE1FVEhPRFMuU09VUkNFLFxuXTtcbmV4cG9ydHMuTUVUSE9EU19JQ0UgPSBbXG4gICAgTUVUSE9EUy5TT1VSQ0UsXG5dO1xuZXhwb3J0cy5NRVRIT0RTX1JUU1AgPSBbXG4gICAgTUVUSE9EUy5PUFRJT05TLFxuICAgIE1FVEhPRFMuREVTQ1JJQkUsXG4gICAgTUVUSE9EUy5BTk5PVU5DRSxcbiAgICBNRVRIT0RTLlNFVFVQLFxuICAgIE1FVEhPRFMuUExBWSxcbiAgICBNRVRIT0RTLlBBVVNFLFxuICAgIE1FVEhPRFMuVEVBUkRPV04sXG4gICAgTUVUSE9EUy5HRVRfUEFSQU1FVEVSLFxuICAgIE1FVEhPRFMuU0VUX1BBUkFNRVRFUixcbiAgICBNRVRIT0RTLlJFRElSRUNULFxuICAgIE1FVEhPRFMuUkVDT1JELFxuICAgIE1FVEhPRFMuRkxVU0gsXG4gICAgLy8gRm9yIEFpclBsYXlcbiAgICBNRVRIT0RTLkdFVCxcbiAgICBNRVRIT0RTLlBPU1QsXG5dO1xuZXhwb3J0cy5NRVRIT0RfTUFQID0gdXRpbHNfMS5lbnVtVG9NYXAoTUVUSE9EUyk7XG5leHBvcnRzLkhfTUVUSE9EX01BUCA9IHt9O1xuT2JqZWN0LmtleXMoZXhwb3J0cy5NRVRIT0RfTUFQKS5mb3JFYWNoKChrZXkpID0+IHtcbiAgICBpZiAoL15ILy50ZXN0KGtleSkpIHtcbiAgICAgICAgZXhwb3J0cy5IX01FVEhPRF9NQVBba2V5XSA9IGV4cG9ydHMuTUVUSE9EX01BUFtrZXldO1xuICAgIH1cbn0pO1xudmFyIEZJTklTSDtcbihmdW5jdGlvbiAoRklOSVNIKSB7XG4gICAgRklOSVNIW0ZJTklTSFtcIlNBRkVcIl0gPSAwXSA9IFwiU0FGRVwiO1xuICAgIEZJTklTSFtGSU5JU0hbXCJTQUZFX1dJVEhfQ0JcIl0gPSAxXSA9IFwiU0FGRV9XSVRIX0NCXCI7XG4gICAgRklOSVNIW0ZJTklTSFtcIlVOU0FGRVwiXSA9IDJdID0gXCJVTlNBRkVcIjtcbn0pKEZJTklTSCA9IGV4cG9ydHMuRklOSVNIIHx8IChleHBvcnRzLkZJTklTSCA9IHt9KSk7XG5leHBvcnRzLkFMUEhBID0gW107XG5mb3IgKGxldCBpID0gJ0EnLmNoYXJDb2RlQXQoMCk7IGkgPD0gJ1onLmNoYXJDb2RlQXQoMCk7IGkrKykge1xuICAgIC8vIFVwcGVyIGNhc2VcbiAgICBleHBvcnRzLkFMUEhBLnB1c2goU3RyaW5nLmZyb21DaGFyQ29kZShpKSk7XG4gICAgLy8gTG93ZXIgY2FzZVxuICAgIGV4cG9ydHMuQUxQSEEucHVzaChTdHJpbmcuZnJvbUNoYXJDb2RlKGkgKyAweDIwKSk7XG59XG5leHBvcnRzLk5VTV9NQVAgPSB7XG4gICAgMDogMCwgMTogMSwgMjogMiwgMzogMywgNDogNCxcbiAgICA1OiA1LCA2OiA2LCA3OiA3LCA4OiA4LCA5OiA5LFxufTtcbmV4cG9ydHMuSEVYX01BUCA9IHtcbiAgICAwOiAwLCAxOiAxLCAyOiAyLCAzOiAzLCA0OiA0LFxuICAgIDU6IDUsIDY6IDYsIDc6IDcsIDg6IDgsIDk6IDksXG4gICAgQTogMFhBLCBCOiAwWEIsIEM6IDBYQywgRDogMFhELCBFOiAwWEUsIEY6IDBYRixcbiAgICBhOiAweGEsIGI6IDB4YiwgYzogMHhjLCBkOiAweGQsIGU6IDB4ZSwgZjogMHhmLFxufTtcbmV4cG9ydHMuTlVNID0gW1xuICAgICcwJywgJzEnLCAnMicsICczJywgJzQnLCAnNScsICc2JywgJzcnLCAnOCcsICc5Jyxcbl07XG5leHBvcnRzLkFMUEhBTlVNID0gZXhwb3J0cy5BTFBIQS5jb25jYXQoZXhwb3J0cy5OVU0pO1xuZXhwb3J0cy5NQVJLID0gWyctJywgJ18nLCAnLicsICchJywgJ34nLCAnKicsICdcXCcnLCAnKCcsICcpJ107XG5leHBvcnRzLlVTRVJJTkZPX0NIQVJTID0gZXhwb3J0cy5BTFBIQU5VTVxuICAgIC5jb25jYXQoZXhwb3J0cy5NQVJLKVxuICAgIC5jb25jYXQoWyclJywgJzsnLCAnOicsICcmJywgJz0nLCAnKycsICckJywgJywnXSk7XG4vLyBUT0RPKGluZHV0bnkpOiB1c2UgUkZDXG5leHBvcnRzLlNUUklDVF9VUkxfQ0hBUiA9IFtcbiAgICAnIScsICdcIicsICckJywgJyUnLCAnJicsICdcXCcnLFxuICAgICcoJywgJyknLCAnKicsICcrJywgJywnLCAnLScsICcuJywgJy8nLFxuICAgICc6JywgJzsnLCAnPCcsICc9JywgJz4nLFxuICAgICdAJywgJ1snLCAnXFxcXCcsICddJywgJ14nLCAnXycsXG4gICAgJ2AnLFxuICAgICd7JywgJ3wnLCAnfScsICd+Jyxcbl0uY29uY2F0KGV4cG9ydHMuQUxQSEFOVU0pO1xuZXhwb3J0cy5VUkxfQ0hBUiA9IGV4cG9ydHMuU1RSSUNUX1VSTF9DSEFSXG4gICAgLmNvbmNhdChbJ1xcdCcsICdcXGYnXSk7XG4vLyBBbGwgY2hhcmFjdGVycyB3aXRoIDB4ODAgYml0IHNldCB0byAxXG5mb3IgKGxldCBpID0gMHg4MDsgaSA8PSAweGZmOyBpKyspIHtcbiAgICBleHBvcnRzLlVSTF9DSEFSLnB1c2goaSk7XG59XG5leHBvcnRzLkhFWCA9IGV4cG9ydHMuTlVNLmNvbmNhdChbJ2EnLCAnYicsICdjJywgJ2QnLCAnZScsICdmJywgJ0EnLCAnQicsICdDJywgJ0QnLCAnRScsICdGJ10pO1xuLyogVG9rZW5zIGFzIGRlZmluZWQgYnkgcmZjIDI2MTYuIEFsc28gbG93ZXJjYXNlcyB0aGVtLlxuICogICAgICAgIHRva2VuICAgICAgID0gMSo8YW55IENIQVIgZXhjZXB0IENUTHMgb3Igc2VwYXJhdG9ycz5cbiAqICAgICBzZXBhcmF0b3JzICAgICA9IFwiKFwiIHwgXCIpXCIgfCBcIjxcIiB8IFwiPlwiIHwgXCJAXCJcbiAqICAgICAgICAgICAgICAgICAgICB8IFwiLFwiIHwgXCI7XCIgfCBcIjpcIiB8IFwiXFxcIiB8IDxcIj5cbiAqICAgICAgICAgICAgICAgICAgICB8IFwiL1wiIHwgXCJbXCIgfCBcIl1cIiB8IFwiP1wiIHwgXCI9XCJcbiAqICAgICAgICAgICAgICAgICAgICB8IFwie1wiIHwgXCJ9XCIgfCBTUCB8IEhUXG4gKi9cbmV4cG9ydHMuU1RSSUNUX1RPS0VOID0gW1xuICAgICchJywgJyMnLCAnJCcsICclJywgJyYnLCAnXFwnJyxcbiAgICAnKicsICcrJywgJy0nLCAnLicsXG4gICAgJ14nLCAnXycsICdgJyxcbiAgICAnfCcsICd+Jyxcbl0uY29uY2F0KGV4cG9ydHMuQUxQSEFOVU0pO1xuZXhwb3J0cy5UT0tFTiA9IGV4cG9ydHMuU1RSSUNUX1RPS0VOLmNvbmNhdChbJyAnXSk7XG4vKlxuICogVmVyaWZ5IHRoYXQgYSBjaGFyIGlzIGEgdmFsaWQgdmlzaWJsZSAocHJpbnRhYmxlKSBVUy1BU0NJSVxuICogY2hhcmFjdGVyIG9yICV4ODAtRkZcbiAqL1xuZXhwb3J0cy5IRUFERVJfQ0hBUlMgPSBbJ1xcdCddO1xuZm9yIChsZXQgaSA9IDMyOyBpIDw9IDI1NTsgaSsrKSB7XG4gICAgaWYgKGkgIT09IDEyNykge1xuICAgICAgICBleHBvcnRzLkhFQURFUl9DSEFSUy5wdXNoKGkpO1xuICAgIH1cbn1cbi8vICcsJyA9IFxceDQ0XG5leHBvcnRzLkNPTk5FQ1RJT05fVE9LRU5fQ0hBUlMgPSBleHBvcnRzLkhFQURFUl9DSEFSUy5maWx0ZXIoKGMpID0+IGMgIT09IDQ0KTtcbmV4cG9ydHMuTUFKT1IgPSBleHBvcnRzLk5VTV9NQVA7XG5leHBvcnRzLk1JTk9SID0gZXhwb3J0cy5NQUpPUjtcbnZhciBIRUFERVJfU1RBVEU7XG4oZnVuY3Rpb24gKEhFQURFUl9TVEFURSkge1xuICAgIEhFQURFUl9TVEFURVtIRUFERVJfU1RBVEVbXCJHRU5FUkFMXCJdID0gMF0gPSBcIkdFTkVSQUxcIjtcbiAgICBIRUFERVJfU1RBVEVbSEVBREVSX1NUQVRFW1wiQ09OTkVDVElPTlwiXSA9IDFdID0gXCJDT05ORUNUSU9OXCI7XG4gICAgSEVBREVSX1NUQVRFW0hFQURFUl9TVEFURVtcIkNPTlRFTlRfTEVOR1RIXCJdID0gMl0gPSBcIkNPTlRFTlRfTEVOR1RIXCI7XG4gICAgSEVBREVSX1NUQVRFW0hFQURFUl9TVEFURVtcIlRSQU5TRkVSX0VOQ09ESU5HXCJdID0gM10gPSBcIlRSQU5TRkVSX0VOQ09ESU5HXCI7XG4gICAgSEVBREVSX1NUQVRFW0hFQURFUl9TVEFURVtcIlVQR1JBREVcIl0gPSA0XSA9IFwiVVBHUkFERVwiO1xuICAgIEhFQURFUl9TVEFURVtIRUFERVJfU1RBVEVbXCJDT05ORUNUSU9OX0tFRVBfQUxJVkVcIl0gPSA1XSA9IFwiQ09OTkVDVElPTl9LRUVQX0FMSVZFXCI7XG4gICAgSEVBREVSX1NUQVRFW0hFQURFUl9TVEFURVtcIkNPTk5FQ1RJT05fQ0xPU0VcIl0gPSA2XSA9IFwiQ09OTkVDVElPTl9DTE9TRVwiO1xuICAgIEhFQURFUl9TVEFURVtIRUFERVJfU1RBVEVbXCJDT05ORUNUSU9OX1VQR1JBREVcIl0gPSA3XSA9IFwiQ09OTkVDVElPTl9VUEdSQURFXCI7XG4gICAgSEVBREVSX1NUQVRFW0hFQURFUl9TVEFURVtcIlRSQU5TRkVSX0VOQ09ESU5HX0NIVU5LRURcIl0gPSA4XSA9IFwiVFJBTlNGRVJfRU5DT0RJTkdfQ0hVTktFRFwiO1xufSkoSEVBREVSX1NUQVRFID0gZXhwb3J0cy5IRUFERVJfU1RBVEUgfHwgKGV4cG9ydHMuSEVBREVSX1NUQVRFID0ge30pKTtcbmV4cG9ydHMuU1BFQ0lBTF9IRUFERVJTID0ge1xuICAgICdjb25uZWN0aW9uJzogSEVBREVSX1NUQVRFLkNPTk5FQ1RJT04sXG4gICAgJ2NvbnRlbnQtbGVuZ3RoJzogSEVBREVSX1NUQVRFLkNPTlRFTlRfTEVOR1RILFxuICAgICdwcm94eS1jb25uZWN0aW9uJzogSEVBREVSX1NUQVRFLkNPTk5FQ1RJT04sXG4gICAgJ3RyYW5zZmVyLWVuY29kaW5nJzogSEVBREVSX1NUQVRFLlRSQU5TRkVSX0VOQ09ESU5HLFxuICAgICd1cGdyYWRlJzogSEVBREVSX1NUQVRFLlVQR1JBREUsXG59O1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9Y29uc3RhbnRzLmpzLm1hcCIsCiAgICAiJ3VzZSBzdHJpY3QnXG5cbmNvbnN0IHV0aWwgPSByZXF1aXJlKCcuLi9jb3JlL3V0aWwnKVxuY29uc3QgeyBrQm9keVVzZWQgfSA9IHJlcXVpcmUoJy4uL2NvcmUvc3ltYm9scycpXG5jb25zdCBhc3NlcnQgPSByZXF1aXJlKCdhc3NlcnQnKVxuY29uc3QgeyBJbnZhbGlkQXJndW1lbnRFcnJvciB9ID0gcmVxdWlyZSgnLi4vY29yZS9lcnJvcnMnKVxuY29uc3QgRUUgPSByZXF1aXJlKCdldmVudHMnKVxuXG5jb25zdCByZWRpcmVjdGFibGVTdGF0dXNDb2RlcyA9IFszMDAsIDMwMSwgMzAyLCAzMDMsIDMwNywgMzA4XVxuXG5jb25zdCBrQm9keSA9IFN5bWJvbCgnYm9keScpXG5cbmNsYXNzIEJvZHlBc3luY0l0ZXJhYmxlIHtcbiAgY29uc3RydWN0b3IgKGJvZHkpIHtcbiAgICB0aGlzW2tCb2R5XSA9IGJvZHlcbiAgICB0aGlzW2tCb2R5VXNlZF0gPSBmYWxzZVxuICB9XG5cbiAgYXN5bmMgKiBbU3ltYm9sLmFzeW5jSXRlcmF0b3JdICgpIHtcbiAgICBhc3NlcnQoIXRoaXNba0JvZHlVc2VkXSwgJ2Rpc3R1cmJlZCcpXG4gICAgdGhpc1trQm9keVVzZWRdID0gdHJ1ZVxuICAgIHlpZWxkICogdGhpc1trQm9keV1cbiAgfVxufVxuXG5jbGFzcyBSZWRpcmVjdEhhbmRsZXIge1xuICBjb25zdHJ1Y3RvciAoZGlzcGF0Y2gsIG1heFJlZGlyZWN0aW9ucywgb3B0cywgaGFuZGxlcikge1xuICAgIGlmIChtYXhSZWRpcmVjdGlvbnMgIT0gbnVsbCAmJiAoIU51bWJlci5pc0ludGVnZXIobWF4UmVkaXJlY3Rpb25zKSB8fCBtYXhSZWRpcmVjdGlvbnMgPCAwKSkge1xuICAgICAgdGhyb3cgbmV3IEludmFsaWRBcmd1bWVudEVycm9yKCdtYXhSZWRpcmVjdGlvbnMgbXVzdCBiZSBhIHBvc2l0aXZlIG51bWJlcicpXG4gICAgfVxuXG4gICAgdXRpbC52YWxpZGF0ZUhhbmRsZXIoaGFuZGxlciwgb3B0cy5tZXRob2QsIG9wdHMudXBncmFkZSlcblxuICAgIHRoaXMuZGlzcGF0Y2ggPSBkaXNwYXRjaFxuICAgIHRoaXMubG9jYXRpb24gPSBudWxsXG4gICAgdGhpcy5hYm9ydCA9IG51bGxcbiAgICB0aGlzLm9wdHMgPSB7IC4uLm9wdHMsIG1heFJlZGlyZWN0aW9uczogMCB9IC8vIG9wdHMgbXVzdCBiZSBhIGNvcHlcbiAgICB0aGlzLm1heFJlZGlyZWN0aW9ucyA9IG1heFJlZGlyZWN0aW9uc1xuICAgIHRoaXMuaGFuZGxlciA9IGhhbmRsZXJcbiAgICB0aGlzLmhpc3RvcnkgPSBbXVxuXG4gICAgaWYgKHV0aWwuaXNTdHJlYW0odGhpcy5vcHRzLmJvZHkpKSB7XG4gICAgICAvLyBUT0RPIChmaXgpOiBQcm92aWRlIHNvbWUgd2F5IGZvciB0aGUgdXNlciB0byBjYWNoZSB0aGUgZmlsZSB0byBlLmcuIC90bXBcbiAgICAgIC8vIHNvIHRoYXQgaXQgY2FuIGJlIGRpc3BhdGNoZWQgYWdhaW4/XG4gICAgICAvLyBUT0RPIChmaXgpOiBEbyB3ZSBuZWVkIDEwMC1leHBlY3Qgc3VwcG9ydCB0byBwcm92aWRlIGEgd2F5IHRvIGRvIHRoaXMgcHJvcGVybHk/XG4gICAgICBpZiAodXRpbC5ib2R5TGVuZ3RoKHRoaXMub3B0cy5ib2R5KSA9PT0gMCkge1xuICAgICAgICB0aGlzLm9wdHMuYm9keVxuICAgICAgICAgIC5vbignZGF0YScsIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgIGFzc2VydChmYWxzZSlcbiAgICAgICAgICB9KVxuICAgICAgfVxuXG4gICAgICBpZiAodHlwZW9mIHRoaXMub3B0cy5ib2R5LnJlYWRhYmxlRGlkUmVhZCAhPT0gJ2Jvb2xlYW4nKSB7XG4gICAgICAgIHRoaXMub3B0cy5ib2R5W2tCb2R5VXNlZF0gPSBmYWxzZVxuICAgICAgICBFRS5wcm90b3R5cGUub24uY2FsbCh0aGlzLm9wdHMuYm9keSwgJ2RhdGEnLCBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgdGhpc1trQm9keVVzZWRdID0gdHJ1ZVxuICAgICAgICB9KVxuICAgICAgfVxuICAgIH0gZWxzZSBpZiAodGhpcy5vcHRzLmJvZHkgJiYgdHlwZW9mIHRoaXMub3B0cy5ib2R5LnBpcGVUbyA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgLy8gVE9ETyAoZml4KTogV2UgY2FuJ3QgYWNjZXNzIFJlYWRhYmxlU3RyZWFtIGludGVybmFsIHN0YXRlXG4gICAgICAvLyB0byBkZXRlcm1pbmUgd2hldGhlciBvciBub3QgaXQgaGFzIGJlZW4gZGlzdHVyYmVkLiBUaGlzIGlzIGp1c3RcbiAgICAgIC8vIGEgd29ya2Fyb3VuZC5cbiAgICAgIHRoaXMub3B0cy5ib2R5ID0gbmV3IEJvZHlBc3luY0l0ZXJhYmxlKHRoaXMub3B0cy5ib2R5KVxuICAgIH0gZWxzZSBpZiAoXG4gICAgICB0aGlzLm9wdHMuYm9keSAmJlxuICAgICAgdHlwZW9mIHRoaXMub3B0cy5ib2R5ICE9PSAnc3RyaW5nJyAmJlxuICAgICAgIUFycmF5QnVmZmVyLmlzVmlldyh0aGlzLm9wdHMuYm9keSkgJiZcbiAgICAgIHV0aWwuaXNJdGVyYWJsZSh0aGlzLm9wdHMuYm9keSlcbiAgICApIHtcbiAgICAgIC8vIFRPRE86IFNob3VsZCB3ZSBhbGxvdyByZS11c2luZyBpdGVyYWJsZSBpZiAhdGhpcy5vcHRzLmlkZW1wb3RlbnRcbiAgICAgIC8vIG9yIHRocm91Z2ggc29tZSBvdGhlciBmbGFnP1xuICAgICAgdGhpcy5vcHRzLmJvZHkgPSBuZXcgQm9keUFzeW5jSXRlcmFibGUodGhpcy5vcHRzLmJvZHkpXG4gICAgfVxuICB9XG5cbiAgb25Db25uZWN0IChhYm9ydCkge1xuICAgIHRoaXMuYWJvcnQgPSBhYm9ydFxuICAgIHRoaXMuaGFuZGxlci5vbkNvbm5lY3QoYWJvcnQsIHsgaGlzdG9yeTogdGhpcy5oaXN0b3J5IH0pXG4gIH1cblxuICBvblVwZ3JhZGUgKHN0YXR1c0NvZGUsIGhlYWRlcnMsIHNvY2tldCkge1xuICAgIHRoaXMuaGFuZGxlci5vblVwZ3JhZGUoc3RhdHVzQ29kZSwgaGVhZGVycywgc29ja2V0KVxuICB9XG5cbiAgb25FcnJvciAoZXJyb3IpIHtcbiAgICB0aGlzLmhhbmRsZXIub25FcnJvcihlcnJvcilcbiAgfVxuXG4gIG9uSGVhZGVycyAoc3RhdHVzQ29kZSwgaGVhZGVycywgcmVzdW1lLCBzdGF0dXNUZXh0KSB7XG4gICAgdGhpcy5sb2NhdGlvbiA9IHRoaXMuaGlzdG9yeS5sZW5ndGggPj0gdGhpcy5tYXhSZWRpcmVjdGlvbnMgfHwgdXRpbC5pc0Rpc3R1cmJlZCh0aGlzLm9wdHMuYm9keSlcbiAgICAgID8gbnVsbFxuICAgICAgOiBwYXJzZUxvY2F0aW9uKHN0YXR1c0NvZGUsIGhlYWRlcnMpXG5cbiAgICBpZiAodGhpcy5vcHRzLm9yaWdpbikge1xuICAgICAgdGhpcy5oaXN0b3J5LnB1c2gobmV3IFVSTCh0aGlzLm9wdHMucGF0aCwgdGhpcy5vcHRzLm9yaWdpbikpXG4gICAgfVxuXG4gICAgaWYgKCF0aGlzLmxvY2F0aW9uKSB7XG4gICAgICByZXR1cm4gdGhpcy5oYW5kbGVyLm9uSGVhZGVycyhzdGF0dXNDb2RlLCBoZWFkZXJzLCByZXN1bWUsIHN0YXR1c1RleHQpXG4gICAgfVxuXG4gICAgY29uc3QgeyBvcmlnaW4sIHBhdGhuYW1lLCBzZWFyY2ggfSA9IHV0aWwucGFyc2VVUkwobmV3IFVSTCh0aGlzLmxvY2F0aW9uLCB0aGlzLm9wdHMub3JpZ2luICYmIG5ldyBVUkwodGhpcy5vcHRzLnBhdGgsIHRoaXMub3B0cy5vcmlnaW4pKSlcbiAgICBjb25zdCBwYXRoID0gc2VhcmNoID8gYCR7cGF0aG5hbWV9JHtzZWFyY2h9YCA6IHBhdGhuYW1lXG5cbiAgICAvLyBSZW1vdmUgaGVhZGVycyByZWZlcnJpbmcgdG8gdGhlIG9yaWdpbmFsIFVSTC5cbiAgICAvLyBCeSBkZWZhdWx0IGl0IGlzIEhvc3Qgb25seSwgdW5sZXNzIGl0J3MgYSAzMDMgKHNlZSBiZWxvdyksIHdoaWNoIHJlbW92ZXMgYWxzbyBhbGwgQ29udGVudC0qIGhlYWRlcnMuXG4gICAgLy8gaHR0cHM6Ly90b29scy5pZXRmLm9yZy9odG1sL3JmYzcyMzEjc2VjdGlvbi02LjRcbiAgICB0aGlzLm9wdHMuaGVhZGVycyA9IGNsZWFuUmVxdWVzdEhlYWRlcnModGhpcy5vcHRzLmhlYWRlcnMsIHN0YXR1c0NvZGUgPT09IDMwMywgdGhpcy5vcHRzLm9yaWdpbiAhPT0gb3JpZ2luKVxuICAgIHRoaXMub3B0cy5wYXRoID0gcGF0aFxuICAgIHRoaXMub3B0cy5vcmlnaW4gPSBvcmlnaW5cbiAgICB0aGlzLm9wdHMubWF4UmVkaXJlY3Rpb25zID0gMFxuICAgIHRoaXMub3B0cy5xdWVyeSA9IG51bGxcblxuICAgIC8vIGh0dHBzOi8vdG9vbHMuaWV0Zi5vcmcvaHRtbC9yZmM3MjMxI3NlY3Rpb24tNi40LjRcbiAgICAvLyBJbiBjYXNlIG9mIEhUVFAgMzAzLCBhbHdheXMgcmVwbGFjZSBtZXRob2QgdG8gYmUgZWl0aGVyIEhFQUQgb3IgR0VUXG4gICAgaWYgKHN0YXR1c0NvZGUgPT09IDMwMyAmJiB0aGlzLm9wdHMubWV0aG9kICE9PSAnSEVBRCcpIHtcbiAgICAgIHRoaXMub3B0cy5tZXRob2QgPSAnR0VUJ1xuICAgICAgdGhpcy5vcHRzLmJvZHkgPSBudWxsXG4gICAgfVxuICB9XG5cbiAgb25EYXRhIChjaHVuaykge1xuICAgIGlmICh0aGlzLmxvY2F0aW9uKSB7XG4gICAgICAvKlxuICAgICAgICBodHRwczovL3Rvb2xzLmlldGYub3JnL2h0bWwvcmZjNzIzMSNzZWN0aW9uLTYuNFxuXG4gICAgICAgIFRMRFI6IHVuZGljaSBhbHdheXMgaWdub3JlcyAzeHggcmVzcG9uc2UgYm9kaWVzLlxuXG4gICAgICAgIFJlZGlyZWN0aW9uIGlzIHVzZWQgdG8gc2VydmUgdGhlIHJlcXVlc3RlZCByZXNvdXJjZSBmcm9tIGFub3RoZXIgVVJMLCBzbyBpdCBpcyBhc3N1bWVzIHRoYXRcbiAgICAgICAgbm8gYm9keSBpcyBnZW5lcmF0ZWQgKGFuZCB0aHVzIGNhbiBiZSBpZ25vcmVkKS4gRXZlbiB0aG91Z2ggZ2VuZXJhdGluZyBhIGJvZHkgaXMgbm90IHByb2hpYml0ZWQuXG5cbiAgICAgICAgRm9yIHN0YXR1cyAzMDEsIDMwMiwgMzAzLCAzMDcgYW5kIDMwOCAodGhlIGxhdHRlciBmcm9tIFJGQyA3MjM4KSwgdGhlIHNwZWNzIG1lbnRpb24gdGhhdCB0aGUgYm9keSB1c3VhbGx5XG4gICAgICAgICh3aGljaCBtZWFucyBpdCdzIG9wdGlvbmFsIGFuZCBub3QgbWFuZGF0ZWQpIGNvbnRhaW4ganVzdCBhbiBoeXBlcmxpbmsgdG8gdGhlIHZhbHVlIG9mXG4gICAgICAgIHRoZSBMb2NhdGlvbiByZXNwb25zZSBoZWFkZXIsIHNvIHRoZSBib2R5IGNhbiBiZSBpZ25vcmVkIHNhZmVseS5cblxuICAgICAgICBGb3Igc3RhdHVzIDMwMCwgd2hpY2ggaXMgXCJNdWx0aXBsZSBDaG9pY2VzXCIsIHRoZSBzcGVjIG1lbnRpb25zIGJvdGggZ2VuZXJhdGluZyBhIExvY2F0aW9uXG4gICAgICAgIHJlc3BvbnNlIGhlYWRlciBBTkQgYSByZXNwb25zZSBib2R5IHdpdGggdGhlIG90aGVyIHBvc3NpYmxlIGxvY2F0aW9uIHRvIGZvbGxvdy5cbiAgICAgICAgU2luY2UgdGhlIHNwZWMgZXhwbGljaXRpbHkgY2hvb3NlcyBub3QgdG8gc3BlY2lmeSBhIGZvcm1hdCBmb3Igc3VjaCBib2R5IGFuZCBsZWF2ZSBpdCB0b1xuICAgICAgICBzZXJ2ZXJzIGFuZCBicm93c2VycyBpbXBsZW1lbnRvcnMsIHdlIGlnbm9yZSB0aGUgYm9keSBhcyB0aGVyZSBpcyBubyBzcGVjaWZpZWQgd2F5IHRvIGV2ZW50dWFsbHkgcGFyc2UgaXQuXG4gICAgICAqL1xuICAgIH0gZWxzZSB7XG4gICAgICByZXR1cm4gdGhpcy5oYW5kbGVyLm9uRGF0YShjaHVuaylcbiAgICB9XG4gIH1cblxuICBvbkNvbXBsZXRlICh0cmFpbGVycykge1xuICAgIGlmICh0aGlzLmxvY2F0aW9uKSB7XG4gICAgICAvKlxuICAgICAgICBodHRwczovL3Rvb2xzLmlldGYub3JnL2h0bWwvcmZjNzIzMSNzZWN0aW9uLTYuNFxuXG4gICAgICAgIFRMRFI6IHVuZGljaSBhbHdheXMgaWdub3JlcyAzeHggcmVzcG9uc2UgdHJhaWxlcnMgYXMgdGhleSBhcmUgbm90IGV4cGVjdGVkIGluIGNhc2Ugb2YgcmVkaXJlY3Rpb25zXG4gICAgICAgIGFuZCBuZWl0aGVyIGFyZSB1c2VmdWwgaWYgcHJlc2VudC5cblxuICAgICAgICBTZWUgY29tbWVudCBvbiBvbkRhdGEgbWV0aG9kIGFib3ZlIGZvciBtb3JlIGRldGFpbGVkIGluZm9ybWF0aW9ucy5cbiAgICAgICovXG5cbiAgICAgIHRoaXMubG9jYXRpb24gPSBudWxsXG4gICAgICB0aGlzLmFib3J0ID0gbnVsbFxuXG4gICAgICB0aGlzLmRpc3BhdGNoKHRoaXMub3B0cywgdGhpcylcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5oYW5kbGVyLm9uQ29tcGxldGUodHJhaWxlcnMpXG4gICAgfVxuICB9XG5cbiAgb25Cb2R5U2VudCAoY2h1bmspIHtcbiAgICBpZiAodGhpcy5oYW5kbGVyLm9uQm9keVNlbnQpIHtcbiAgICAgIHRoaXMuaGFuZGxlci5vbkJvZHlTZW50KGNodW5rKVxuICAgIH1cbiAgfVxufVxuXG5mdW5jdGlvbiBwYXJzZUxvY2F0aW9uIChzdGF0dXNDb2RlLCBoZWFkZXJzKSB7XG4gIGlmIChyZWRpcmVjdGFibGVTdGF0dXNDb2Rlcy5pbmRleE9mKHN0YXR1c0NvZGUpID09PSAtMSkge1xuICAgIHJldHVybiBudWxsXG4gIH1cblxuICBmb3IgKGxldCBpID0gMDsgaSA8IGhlYWRlcnMubGVuZ3RoOyBpICs9IDIpIHtcbiAgICBpZiAoaGVhZGVyc1tpXS50b1N0cmluZygpLnRvTG93ZXJDYXNlKCkgPT09ICdsb2NhdGlvbicpIHtcbiAgICAgIHJldHVybiBoZWFkZXJzW2kgKyAxXVxuICAgIH1cbiAgfVxufVxuXG4vLyBodHRwczovL3Rvb2xzLmlldGYub3JnL2h0bWwvcmZjNzIzMSNzZWN0aW9uLTYuNC40XG5mdW5jdGlvbiBzaG91bGRSZW1vdmVIZWFkZXIgKGhlYWRlciwgcmVtb3ZlQ29udGVudCwgdW5rbm93bk9yaWdpbikge1xuICBpZiAoaGVhZGVyLmxlbmd0aCA9PT0gNCkge1xuICAgIHJldHVybiB1dGlsLmhlYWRlck5hbWVUb1N0cmluZyhoZWFkZXIpID09PSAnaG9zdCdcbiAgfVxuICBpZiAocmVtb3ZlQ29udGVudCAmJiB1dGlsLmhlYWRlck5hbWVUb1N0cmluZyhoZWFkZXIpLnN0YXJ0c1dpdGgoJ2NvbnRlbnQtJykpIHtcbiAgICByZXR1cm4gdHJ1ZVxuICB9XG4gIGlmICh1bmtub3duT3JpZ2luICYmIChoZWFkZXIubGVuZ3RoID09PSAxMyB8fCBoZWFkZXIubGVuZ3RoID09PSA2IHx8IGhlYWRlci5sZW5ndGggPT09IDE5KSkge1xuICAgIGNvbnN0IG5hbWUgPSB1dGlsLmhlYWRlck5hbWVUb1N0cmluZyhoZWFkZXIpXG4gICAgcmV0dXJuIG5hbWUgPT09ICdhdXRob3JpemF0aW9uJyB8fCBuYW1lID09PSAnY29va2llJyB8fCBuYW1lID09PSAncHJveHktYXV0aG9yaXphdGlvbidcbiAgfVxuICByZXR1cm4gZmFsc2Vcbn1cblxuLy8gaHR0cHM6Ly90b29scy5pZXRmLm9yZy9odG1sL3JmYzcyMzEjc2VjdGlvbi02LjRcbmZ1bmN0aW9uIGNsZWFuUmVxdWVzdEhlYWRlcnMgKGhlYWRlcnMsIHJlbW92ZUNvbnRlbnQsIHVua25vd25PcmlnaW4pIHtcbiAgY29uc3QgcmV0ID0gW11cbiAgaWYgKEFycmF5LmlzQXJyYXkoaGVhZGVycykpIHtcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IGhlYWRlcnMubGVuZ3RoOyBpICs9IDIpIHtcbiAgICAgIGlmICghc2hvdWxkUmVtb3ZlSGVhZGVyKGhlYWRlcnNbaV0sIHJlbW92ZUNvbnRlbnQsIHVua25vd25PcmlnaW4pKSB7XG4gICAgICAgIHJldC5wdXNoKGhlYWRlcnNbaV0sIGhlYWRlcnNbaSArIDFdKVxuICAgICAgfVxuICAgIH1cbiAgfSBlbHNlIGlmIChoZWFkZXJzICYmIHR5cGVvZiBoZWFkZXJzID09PSAnb2JqZWN0Jykge1xuICAgIGZvciAoY29uc3Qga2V5IG9mIE9iamVjdC5rZXlzKGhlYWRlcnMpKSB7XG4gICAgICBpZiAoIXNob3VsZFJlbW92ZUhlYWRlcihrZXksIHJlbW92ZUNvbnRlbnQsIHVua25vd25PcmlnaW4pKSB7XG4gICAgICAgIHJldC5wdXNoKGtleSwgaGVhZGVyc1trZXldKVxuICAgICAgfVxuICAgIH1cbiAgfSBlbHNlIHtcbiAgICBhc3NlcnQoaGVhZGVycyA9PSBudWxsLCAnaGVhZGVycyBtdXN0IGJlIGFuIG9iamVjdCBvciBhbiBhcnJheScpXG4gIH1cbiAgcmV0dXJuIHJldFxufVxuXG5tb2R1bGUuZXhwb3J0cyA9IFJlZGlyZWN0SGFuZGxlclxuIiwKICAgICIndXNlIHN0cmljdCdcblxuY29uc3QgUmVkaXJlY3RIYW5kbGVyID0gcmVxdWlyZSgnLi4vaGFuZGxlci9SZWRpcmVjdEhhbmRsZXInKVxuXG5mdW5jdGlvbiBjcmVhdGVSZWRpcmVjdEludGVyY2VwdG9yICh7IG1heFJlZGlyZWN0aW9uczogZGVmYXVsdE1heFJlZGlyZWN0aW9ucyB9KSB7XG4gIHJldHVybiAoZGlzcGF0Y2gpID0+IHtcbiAgICByZXR1cm4gZnVuY3Rpb24gSW50ZXJjZXB0IChvcHRzLCBoYW5kbGVyKSB7XG4gICAgICBjb25zdCB7IG1heFJlZGlyZWN0aW9ucyA9IGRlZmF1bHRNYXhSZWRpcmVjdGlvbnMgfSA9IG9wdHNcblxuICAgICAgaWYgKCFtYXhSZWRpcmVjdGlvbnMpIHtcbiAgICAgICAgcmV0dXJuIGRpc3BhdGNoKG9wdHMsIGhhbmRsZXIpXG4gICAgICB9XG5cbiAgICAgIGNvbnN0IHJlZGlyZWN0SGFuZGxlciA9IG5ldyBSZWRpcmVjdEhhbmRsZXIoZGlzcGF0Y2gsIG1heFJlZGlyZWN0aW9ucywgb3B0cywgaGFuZGxlcilcbiAgICAgIG9wdHMgPSB7IC4uLm9wdHMsIG1heFJlZGlyZWN0aW9uczogMCB9IC8vIFN0b3Agc3ViIGRpc3BhdGNoZXIgZnJvbSBhbHNvIHJlZGlyZWN0aW5nLlxuICAgICAgcmV0dXJuIGRpc3BhdGNoKG9wdHMsIHJlZGlyZWN0SGFuZGxlcilcbiAgICB9XG4gIH1cbn1cblxubW9kdWxlLmV4cG9ydHMgPSBjcmVhdGVSZWRpcmVjdEludGVyY2VwdG9yXG4iLAogICAgIm1vZHVsZS5leHBvcnRzID0gJ0FHRnpiUUVBQUFBQk1BaGdBWDhCZjJBRGYzOS9BWDlnQkg5L2YzOEJmMkFBQUdBRGYzOS9BR0FCZndCZ0FuOS9BR0FHZjM5L2YzOS9BQUxMQVFnRFpXNTJHSGRoYzIxZmIyNWZhR1ZoWkdWeWMxOWpiMjF3YkdWMFpRQUNBMlZ1ZGhWM1lYTnRYMjl1WDIxbGMzTmhaMlZmWW1WbmFXNEFBQU5sYm5ZTGQyRnpiVjl2Ymw5MWNtd0FBUU5sYm5ZT2QyRnpiVjl2Ymw5emRHRjBkWE1BQVFObGJuWVVkMkZ6YlY5dmJsOW9aV0ZrWlhKZlptbGxiR1FBQVFObGJuWVVkMkZ6YlY5dmJsOW9aV0ZrWlhKZmRtRnNkV1VBQVFObGJuWU1kMkZ6YlY5dmJsOWliMlI1QUFFRFpXNTJHSGRoYzIxZmIyNWZiV1Z6YzJGblpWOWpiMjF3YkdWMFpRQUFBMFpGQXdNRUFBQUZBQUFBQUFBQUJRRUZBQVVGQlFBQUJnQUFBQUFHQmdZR0FRRUJBUUVCQVFFQkFRRUJBUUVCQVFFQkFRRUJBUUVCQVFBQkFBQUJBUWNBQUFVRkF3QUJCQVVCY0FFU0VnVURBUUFDQmdnQmZ3RkJnTlFFQ3dmUkJTSUdiV1Z0YjNKNUFnQUxYMmx1YVhScFlXeHBlbVVBQ1JsZlgybHVaR2x5WldOMFgyWjFibU4wYVc5dVgzUmhZbXhsQVFBTGJHeG9kSFJ3WDJsdWFYUUFDaGhzYkdoMGRIQmZjMmh2ZFd4a1gydGxaWEJmWVd4cGRtVUFRUXhzYkdoMGRIQmZZV3hzYjJNQURBWnRZV3hzYjJNQVJndHNiR2gwZEhCZlpuSmxaUUFOQkdaeVpXVUFTQTlzYkdoMGRIQmZaMlYwWDNSNWNHVUFEaFZzYkdoMGRIQmZaMlYwWDJoMGRIQmZiV0ZxYjNJQUR4VnNiR2gwZEhCZloyVjBYMmgwZEhCZmJXbHViM0lBRUJGc2JHaDBkSEJmWjJWMFgyMWxkR2h2WkFBUkZteHNhSFIwY0Y5blpYUmZjM1JoZEhWelgyTnZaR1VBRWhKc2JHaDBkSEJmWjJWMFgzVndaM0poWkdVQUV3eHNiR2gwZEhCZmNtVnpaWFFBRkE1c2JHaDBkSEJmWlhobFkzVjBaUUFWRkd4c2FIUjBjRjl6WlhSMGFXNW5jMTlwYm1sMEFCWU5iR3hvZEhSd1gyWnBibWx6YUFBWERHeHNhSFIwY0Y5d1lYVnpaUUFZRFd4c2FIUjBjRjl5WlhOMWJXVUFHUnRzYkdoMGRIQmZjbVZ6ZFcxbFgyRm1kR1Z5WDNWd1ozSmhaR1VBR2hCc2JHaDBkSEJmWjJWMFgyVnljbTV2QUJzWGJHeG9kSFJ3WDJkbGRGOWxjbkp2Y2w5eVpXRnpiMjRBSEJkc2JHaDBkSEJmYzJWMFgyVnljbTl5WDNKbFlYTnZiZ0FkRkd4c2FIUjBjRjluWlhSZlpYSnliM0pmY0c5ekFCNFJiR3hvZEhSd1gyVnljbTV2WDI1aGJXVUFIeEpzYkdoMGRIQmZiV1YwYUc5a1gyNWhiV1VBSUJKc2JHaDBkSEJmYzNSaGRIVnpYMjVoYldVQUlScHNiR2gwZEhCZmMyVjBYMnhsYm1sbGJuUmZhR1ZoWkdWeWN3QWlJV3hzYUhSMGNGOXpaWFJmYkdWdWFXVnVkRjlqYUhWdWEyVmtYMnhsYm1kMGFBQWpIV3hzYUhSMGNGOXpaWFJmYkdWdWFXVnVkRjlyWldWd1gyRnNhWFpsQUNRa2JHeG9kSFJ3WDNObGRGOXNaVzVwWlc1MFgzUnlZVzV6Wm1WeVgyVnVZMjlrYVc1bkFDVVliR3hvZEhSd1gyMWxjM05oWjJWZmJtVmxaSE5mWlc5bUFEOEpGd0VBUVFFTEVRRUNBd1FGQ3dZSE5UazNNUzh0SnlzcENzTGdBa1VDQUFzSUFCQ0lnSUNBQUFzWkFDQUFFTUtBZ0lBQUdpQUFJQUkyQWpnZ0FDQUJPZ0FvQ3h3QUlBQWdBQzhCTWlBQUxRQXVJQUFRd1lDQWdBQVFnSUNBZ0FBTEtnRUJmMEhBQUJER2dJQ0FBQ0lCRU1LQWdJQUFHaUFCUVlDSWdJQUFOZ0k0SUFFZ0FEb0FLQ0FCQ3dvQUlBQVF5SUNBZ0FBTEJ3QWdBQzBBS0FzSEFDQUFMUUFxQ3djQUlBQXRBQ3NMQndBZ0FDMEFLUXNIQUNBQUx3RXlDd2NBSUFBdEFDNExSUUVFZnlBQUtBSVlJUUVnQUMwQUxTRUNJQUF0QUNnaEF5QUFLQUk0SVFRZ0FCRENnSUNBQUJvZ0FDQUVOZ0k0SUFBZ0F6b0FLQ0FBSUFJNkFDMGdBQ0FCTmdJWUN4RUFJQUFnQVNBQklBSnFFTU9BZ0lBQUN4QUFJQUJCQUVIY0FCRE1nSUNBQUJvTFp3RUJmMEVBSVFFQ1FDQUFLQUlNRFFBQ1FBSkFBa0FDUUNBQUxRQXZEZ01CQUFNQ0N5QUFLQUk0SWdGRkRRQWdBU2dDTENJQlJRMEFJQUFnQVJHQWdJQ0FBQUFpQVEwREMwRUFEd3NReW9DQWdBQUFDeUFBUWNPV2dJQUFOZ0lRUVE0aEFRc2dBUXNlQUFKQUlBQW9BZ3dOQUNBQVFkR2JnSUFBTmdJUUlBQkJGVFlDREFzTEZnQUNRQ0FBS0FJTVFSVkhEUUFnQUVFQU5nSU1Dd3NXQUFKQUlBQW9BZ3hCRmtjTkFDQUFRUUEyQWd3TEN3Y0FJQUFvQWd3TEJ3QWdBQ2dDRUFzSkFDQUFJQUUyQWhBTEJ3QWdBQ2dDRkFzaUFBSkFJQUJCSkVrTkFCREtnSUNBQUFBTElBQkJBblJCb0xPQWdBQnFLQUlBQ3lJQUFrQWdBRUV1U1EwQUVNcUFnSUFBQUFzZ0FFRUNkRUd3dElDQUFHb29BZ0FMN2dzQkFYOUI2NmlBZ0FBaEFRSkFBa0FDUUFKQUFrQUNRQUpBQWtBQ1FBSkFBa0FDUUFKQUFrQUNRQUpBQWtBQ1FBSkFBa0FDUUFKQUFrQUNRQUpBQWtBQ1FBSkFBa0FDUUFKQUFrQUNRQUpBQWtBQ1FBSkFBa0FDUUFKQUFrQUNRQUpBQWtBQ1FBSkFBa0FDUUFKQUFrQUNRQUpBQWtBQ1FBSkFBa0FDUUFKQUFrQUNRQUpBQWtBQ1FBSkFBa0FDUUFKQUFrQUNRQUpBQWtBQ1FBSkFBa0FDUUFKQUFrQUNRQUpBQWtBQ1FBSkFBa0FDUUFKQUFrQUNRQUpBQWtBQ1FBSkFBa0FDUUFKQUFrQUNRQUpBQWtBQ1FBSkFJQUJCbkg5cUR2UURZMklBQVdGaFlXRmhZUUlEQkFWaFlXRmhZV0ZoWVdGaFlXRmhZV0ZoWVdGaFlXRmhZV0ZoWVdGaFlXRmhZV0ZoWVdGaFlXRmhZV0ZoWVdGaFlXRmhZV0ZoWVdGaFlXRmhZV0ZoWVdGaFlXRmhZV0ZoWVdGaFlXRmhZV0ZoWVdGaFlXRmhCZ2NJQ1FvTERBME9EMkZoWVdGaEVHRmhZV0ZoWVdGaFlXRmhFV0ZoWVdGaFlXRmhZV0ZoWVdGaFlXRmhZV0ZoWVdGaFlXRmhZV0ZoWVdGaFlXRmhZV0ZoWVdGaFlXRmhZV0ZoWVdGaFlXRmhZV0ZoWVdGaFlXRmhZV0ZoWVdGaFlXRmhZUklURkJVV0Z4Z1pHaHRoWVdGaFlXRmhZV0ZoWVdGaFlXRmhZV0ZoWVdGaFlXRmhZV0ZoWVdGaFlXRmhZV0ZoWVdGaFlXRmhZV0ZoWVdGaFlXRmhZV0ZoWVdGaFlXRmhZV0ZoWVdGaFlXRmhZV0ZoWVdGaFlXRmhZV0ZoWVdGaFlXRmhZV0ZoSEIwZUh5QWhJaU1rSlNZbktDa3FLeXd0TGk4d01USXpORFUyWVRjNE9UcGhZV0ZoWVdGaFlUdGhZV0U4WVdGaFlUMCtQMkZoWVdGaFlXRmhRR0ZoUVdGaFlXRmhZV0ZoWVdGaFlXRmhZV0ZoWVdGaFlXRmhZV0ZoWVdGaFlVSkRSRVZHUjBoSlNrdE1UVTVQVUZGU1UyRmhZV0ZoWVdGaFZGVldWMWhaV2x0aFhGMWhZV0ZoWVdGaFlXRmhZV0ZoWVdGaFlXRmhZV0ZoWVdGaFlXRmhZV0ZlWVdGaFlXRmhZV0ZoWVdGaFlXRmhZV0ZoWVdGaFlXRmhZV0ZoWVdGaFlXRmhZV0ZoWDJCaEMwSGhwNENBQUE4TFFhU2hnSUFBRHd0Qnk2eUFnQUFQQzBIK3NZQ0FBQThMUWNDa2dJQUFEd3RCcTZTQWdBQVBDMEdOcUlDQUFBOExRZUttZ0lBQUR3dEJnTENBZ0FBUEMwRzVyNENBQUE4TFFkZWtnSUFBRHd0Qjc1K0FnQUFQQzBIaG40Q0FBQThMUWZxZmdJQUFEd3RCOHFDQWdBQVBDMEdvcjRDQUFBOExRYTZ5Z0lBQUR3dEJpTENBZ0FBUEMwSHNwNENBQUE4TFFZS2lnSUFBRHd0QmpwMkFnQUFQQzBIUXJvQ0FBQThMUWNxamdJQUFEd3RCeGJLQWdBQVBDMEhmbklDQUFBOExRZEtjZ0lBQUR3dEJ4S0NBZ0FBUEMwSFhvSUNBQUE4TFFhS2ZnSUFBRHd0QjdhNkFnQUFQQzBHcnNJQ0FBQThMUWRTbGdJQUFEd3RCeks2QWdBQVBDMEg2cm9DQUFBOExRZnlyZ0lBQUR3dEIwckNBZ0FBUEMwSHhuWUNBQUE4TFFidWdnSUFBRHd0Qjk2dUFnQUFQQzBHUXNZQ0FBQThMUWRleGdJQUFEd3RCb3EyQWdBQVBDMEhVcDRDQUFBOExRZUNyZ0lBQUR3dEJuNnlBZ0FBUEMwSHJzWUNBQUE4TFFkV2ZnSUFBRHd0QnlyR0FnQUFQQzBIZXBZQ0FBQThMUWRTZWdJQUFEd3RCOUp5QWdBQVBDMEduc29DQUFBOExRYkdkZ0lBQUR3dEJvSjJBZ0FBUEMwRzVzWUNBQUE4TFFieXdnSUFBRHd0QmtxR0FnQUFQQzBHenBvQ0FBQThMUWVtc2dJQUFEd3RCcko2QWdBQVBDMEhVcTRDQUFBOExRZmVtZ0lBQUR3dEJnS2FBZ0FBUEMwR3dvWUNBQUE4TFFmNmVnSUFBRHd0QmphT0FnQUFQQzBHSnJZQ0FBQThMUWZlaWdJQUFEd3RCb0xHQWdBQVBDMEd1bjRDQUFBOExRY2FsZ0lBQUR3dEI2SjZBZ0FBUEMwR1Rvb0NBQUE4TFFjS3ZnSUFBRHd0Qnc1MkFnQUFQQzBHTHJJQ0FBQThMUWVHZGdJQUFEd3RCamErQWdBQVBDMEhxb1lDQUFBOExRYlN0Z0lBQUR3dEIwcStBZ0FBUEMwSGZzb0NBQUE4TFFkS3lnSUFBRHd0QjhMQ0FnQUFQQzBHcG9vQ0FBQThMUWZtamdJQUFEd3RCbVo2QWdBQVBDMEcxcklDQUFBOExRWnV3Z0lBQUR3dEJrcktBZ0FBUEMwRzJxNENBQUE4TFFjS2lnSUFBRHd0QitMS0FnQUFQQzBHZXBZQ0FBQThMUWRDaWdJQUFEd3RCdXA2QWdBQVBDMEdCbm9DQUFBOExFTXFBZ0lBQUFBdEIxcUdBZ0FBaEFRc2dBUXNXQUNBQUlBQXRBQzFCL2dGeElBRkJBRWR5T2dBdEN4a0FJQUFnQUMwQUxVSDlBWEVnQVVFQVIwRUJkSEk2QUMwTEdRQWdBQ0FBTFFBdFFmc0JjU0FCUVFCSFFRSjBjam9BTFFzWkFDQUFJQUF0QUMxQjl3RnhJQUZCQUVkQkEzUnlPZ0F0Q3k0QkFuOUJBQ0VEQWtBZ0FDZ0NPQ0lFUlEwQUlBUW9BZ0FpQkVVTkFDQUFJQVFSZ0lDQWdBQUFJUU1MSUFNTFNRRUNmMEVBSVFNQ1FDQUFLQUk0SWdSRkRRQWdCQ2dDQkNJRVJRMEFJQUFnQVNBQ0lBRnJJQVFSZ1lDQWdBQUFJZ05CZjBjTkFDQUFRY2FSZ0lBQU5nSVFRUmdoQXdzZ0F3c3VBUUovUVFBaEF3SkFJQUFvQWpnaUJFVU5BQ0FFS0FJd0lnUkZEUUFnQUNBRUVZQ0FnSUFBQUNFREN5QURDMGtCQW45QkFDRURBa0FnQUNnQ09DSUVSUTBBSUFRb0FnZ2lCRVVOQUNBQUlBRWdBaUFCYXlBRUVZR0FnSUFBQUNJRFFYOUhEUUFnQUVIMmlvQ0FBRFlDRUVFWUlRTUxJQU1MTGdFQ2YwRUFJUU1DUUNBQUtBSTRJZ1JGRFFBZ0JDZ0NOQ0lFUlEwQUlBQWdCQkdBZ0lDQUFBQWhBd3NnQXd0SkFRSi9RUUFoQXdKQUlBQW9BamdpQkVVTkFDQUVLQUlNSWdSRkRRQWdBQ0FCSUFJZ0FXc2dCQkdCZ0lDQUFBQWlBMEYvUncwQUlBQkI3WnFBZ0FBMkFoQkJHQ0VEQ3lBREN5NEJBbjlCQUNFREFrQWdBQ2dDT0NJRVJRMEFJQVFvQWpnaUJFVU5BQ0FBSUFRUmdJQ0FnQUFBSVFNTElBTUxTUUVDZjBFQUlRTUNRQ0FBS0FJNElnUkZEUUFnQkNnQ0VDSUVSUTBBSUFBZ0FTQUNJQUZySUFRUmdZQ0FnQUFBSWdOQmYwY05BQ0FBUVpXUWdJQUFOZ0lRUVJnaEF3c2dBd3N1QVFKL1FRQWhBd0pBSUFBb0FqZ2lCRVVOQUNBRUtBSThJZ1JGRFFBZ0FDQUVFWUNBZ0lBQUFDRURDeUFEQzBrQkFuOUJBQ0VEQWtBZ0FDZ0NPQ0lFUlEwQUlBUW9BaFFpQkVVTkFDQUFJQUVnQWlBQmF5QUVFWUdBZ0lBQUFDSURRWDlIRFFBZ0FFR3FtNENBQURZQ0VFRVlJUU1MSUFNTExnRUNmMEVBSVFNQ1FDQUFLQUk0SWdSRkRRQWdCQ2dDUUNJRVJRMEFJQUFnQkJHQWdJQ0FBQUFoQXdzZ0F3dEpBUUovUVFBaEF3SkFJQUFvQWpnaUJFVU5BQ0FFS0FJWUlnUkZEUUFnQUNBQklBSWdBV3NnQkJHQmdJQ0FBQUFpQTBGL1J3MEFJQUJCN1pPQWdBQTJBaEJCR0NFREN5QURDeTRCQW45QkFDRURBa0FnQUNnQ09DSUVSUTBBSUFRb0FrUWlCRVVOQUNBQUlBUVJnSUNBZ0FBQUlRTUxJQU1MTGdFQ2YwRUFJUU1DUUNBQUtBSTRJZ1JGRFFBZ0JDZ0NKQ0lFUlEwQUlBQWdCQkdBZ0lDQUFBQWhBd3NnQXdzdUFRSi9RUUFoQXdKQUlBQW9BamdpQkVVTkFDQUVLQUlzSWdSRkRRQWdBQ0FFRVlDQWdJQUFBQ0VEQ3lBREMwa0JBbjlCQUNFREFrQWdBQ2dDT0NJRVJRMEFJQVFvQWlnaUJFVU5BQ0FBSUFFZ0FpQUJheUFFRVlHQWdJQUFBQ0lEUVg5SERRQWdBRUgyaUlDQUFEWUNFRUVZSVFNTElBTUxMZ0VDZjBFQUlRTUNRQ0FBS0FJNElnUkZEUUFnQkNnQ1VDSUVSUTBBSUFBZ0JCR0FnSUNBQUFBaEF3c2dBd3RKQVFKL1FRQWhBd0pBSUFBb0FqZ2lCRVVOQUNBRUtBSWNJZ1JGRFFBZ0FDQUJJQUlnQVdzZ0JCR0JnSUNBQUFBaUEwRi9SdzBBSUFCQndwbUFnQUEyQWhCQkdDRURDeUFEQ3k0QkFuOUJBQ0VEQWtBZ0FDZ0NPQ0lFUlEwQUlBUW9Ba2dpQkVVTkFDQUFJQVFSZ0lDQWdBQUFJUU1MSUFNTFNRRUNmMEVBSVFNQ1FDQUFLQUk0SWdSRkRRQWdCQ2dDSUNJRVJRMEFJQUFnQVNBQ0lBRnJJQVFSZ1lDQWdBQUFJZ05CZjBjTkFDQUFRWlNVZ0lBQU5nSVFRUmdoQXdzZ0F3c3VBUUovUVFBaEF3SkFJQUFvQWpnaUJFVU5BQ0FFS0FKTUlnUkZEUUFnQUNBRUVZQ0FnSUFBQUNFREN5QURDeTRCQW45QkFDRURBa0FnQUNnQ09DSUVSUTBBSUFRb0FsUWlCRVVOQUNBQUlBUVJnSUNBZ0FBQUlRTUxJQU1MTGdFQ2YwRUFJUU1DUUNBQUtBSTRJZ1JGRFFBZ0JDZ0NXQ0lFUlEwQUlBQWdCQkdBZ0lDQUFBQWhBd3NnQXd0RkFRRi9Ba0FDUUNBQUx3RXdRUlJ4UVJSSERRQkJBU0VESUFBdEFDaEJBVVlOQVNBQUx3RXlRZVVBUmlFRERBRUxJQUF0QUNsQkJVWWhBd3NnQUNBRE9nQXVRUUFML2dFQkEzOUJBU0VEQWtBZ0FDOEJNQ0lFUVFoeERRQWdBQ2tESUVJQVVpRURDd0pBQWtBZ0FDMEFMa1VOQUVFQklRVWdBQzBBS1VFRlJnMEJRUUVoQlNBRVFjQUFjVVVnQTNGQkFVY05BUXRCQUNFRklBUkJ3QUJ4RFFCQkFpRUZJQVJCLy84RGNTSURRUWh4RFFBQ1FDQURRWUFFY1VVTkFBSkFJQUF0QUNoQkFVY05BQ0FBTFFBdFFRcHhEUUJCQlE4TFFRUVBDd0pBSUFOQklIRU5BQUpBSUFBdEFDaEJBVVlOQUNBQUx3RXlRZi8vQTNFaUFFR2NmMnBCNUFCSkRRQWdBRUhNQVVZTkFDQUFRYkFDUmcwQVFRUWhCU0FFUVNoeFJRMENJQU5CaUFSeFFZQUVSZzBDQzBFQUR3dEJBRUVESUFBcEF5QlFHeUVGQ3lBRkMySUJBbjlCQUNFQkFrQWdBQzBBS0VFQlJnMEFJQUF2QVRKQi8vOERjU0lDUVp4L2FrSGtBRWtOQUNBQ1Fjd0JSZzBBSUFKQnNBSkdEUUFnQUM4Qk1DSUFRY0FBY1EwQVFRRWhBU0FBUVlnRWNVR0FCRVlOQUNBQVFTaHhSU0VCQ3lBQkM2Y0JBUU4vQWtBQ1FBSkFJQUF0QUNwRkRRQWdBQzBBSzBVTkFFRUFJUU1nQUM4Qk1DSUVRUUp4UlEwQkRBSUxRUUFoQXlBQUx3RXdJZ1JCQVhGRkRRRUxRUUVoQXlBQUxRQW9RUUZHRFFBZ0FDOEJNa0gvL3dOeElnVkJuSDlxUWVRQVNRMEFJQVZCekFGR0RRQWdCVUd3QWtZTkFDQUVRY0FBY1EwQVFRQWhBeUFFUVlnRWNVR0FCRVlOQUNBRVFTaHhRUUJISVFNTElBQkJBRHNCTUNBQVFRQTZBQzhnQXd1WkFRRUNmd0pBQWtBQ1FDQUFMUUFxUlEwQUlBQXRBQ3RGRFFCQkFDRUJJQUF2QVRBaUFrRUNjVVVOQVF3Q0MwRUFJUUVnQUM4Qk1DSUNRUUZ4UlEwQkMwRUJJUUVnQUMwQUtFRUJSZzBBSUFBdkFUSkIvLzhEY1NJQVFaeC9ha0hrQUVrTkFDQUFRY3dCUmcwQUlBQkJzQUpHRFFBZ0FrSEFBSEVOQUVFQUlRRWdBa0dJQkhGQmdBUkdEUUFnQWtFb2NVRUFSeUVCQ3lBQkMxa0FJQUJCR0dwQ0FEY0RBQ0FBUWdBM0F3QWdBRUU0YWtJQU53TUFJQUJCTUdwQ0FEY0RBQ0FBUVNocVFnQTNBd0FnQUVFZ2FrSUFOd01BSUFCQkVHcENBRGNEQUNBQVFRaHFRZ0EzQXdBZ0FFSGRBVFlDSEVFQUMzc0JBWDhDUUNBQUtBSU1JZ01OQUFKQUlBQW9BZ1JGRFFBZ0FDQUJOZ0lFQ3dKQUlBQWdBU0FDRU1TQWdJQUFJZ01OQUNBQUtBSU1Ed3NnQUNBRE5nSWNRUUFoQXlBQUtBSUVJZ0ZGRFFBZ0FDQUJJQUlnQUNnQ0NCR0JnSUNBQUFBaUFVVU5BQ0FBSUFJMkFoUWdBQ0FCTmdJTUlBRWhBd3NnQXd2azh3RUREbjhEZmdSL0k0Q0FnSUFBUVJCcklnTWtnSUNBZ0FBZ0FTRUVJQUVoQlNBQklRWWdBU0VISUFFaENDQUJJUWtnQVNFS0lBRWhDeUFCSVF3Z0FTRU5JQUVoRGlBQklROENRQUpBQWtBQ1FBSkFBa0FDUUFKQUFrQUNRQUpBQWtBQ1FBSkFBa0FDUUFKQUFrQUNRQUpBQWtBQ1FBSkFBa0FDUUFKQUFrQUNRQUpBQWtBQ1FBSkFBa0FDUUFKQUFrQUNRQUpBQWtBQ1FBSkFBa0FDUUFKQUFrQUNRQUpBQWtBQ1FBSkFBa0FDUUFKQUFrQUNRQUpBQWtBQ1FBSkFBa0FDUUFKQUFrQUNRQUpBQWtBQ1FBSkFBa0FDUUFKQUFrQUNRQUpBQWtBQ1FBSkFBa0FDUUFKQUFrQUNRQUpBQWtBQ1FBSkFBa0FDUUFKQUFrQUNRQUpBQWtBQ1FBSkFBa0FDUUFKQUFrQUNRQUpBQWtBQ1FBSkFBa0FDUUFKQUFrQUNRQUpBQWtBQ1FBSkFBa0FDUUFKQUFrQUNRQUpBQWtBQ1FBSkFBa0FDUUFKQUFrQUNRQUpBQWtBQ1FBSkFBa0FDUUFKQUFrQUNRQUpBQWtBQ1FBSkFBa0FDUUFKQUFrQUNRQUpBQWtBQ1FBSkFBa0FDUUFKQUFrQUNRQUpBQWtBQ1FBSkFBa0FDUUFKQUFrQUNRQUpBQWtBQ1FBSkFBa0FDUUFKQUFrQUNRQUpBQWtBQ1FBSkFBa0FDUUFKQUFrQUNRQUpBQWtBQ1FBSkFBa0FDUUFKQUFrQUNRQUpBQWtBQ1FBSkFBa0FDUUFKQUFrQUNRQUpBQWtBQ1FBSkFBa0FDUUFKQUFrQUNRQUpBQWtBQ1FBSkFBa0FDUUFKQUFrQUNRQUpBQWtBQ1FBSkFBa0FDUUFKQUFrQWdBQ2dDSENJUVFYOXFEdDBCMmdFQjJRRUNBd1FGQmdjSUNRb0xEQTBPMkFFUEVOY0JFUkxXQVJNVUZSWVhHQmthRytBQjN3RWNIUjdWQVI4Z0lTSWpKQ1hVQVNZbktDa3FLeXpUQWRJQkxTN1JBZEFCTHpBeE1qTTBOVFkzT0RrNk96dzlQajlBUVVKRFJFVkcyd0ZIU0VsS3p3SE9BVXZOQVV6TUFVMU9UMUJSVWxOVVZWWlhXRmxhVzF4ZFhsOWdZV0pqWkdWbVoyaHBhbXRzYlc1dmNIRnljM1IxZG5kNGVYcDdmSDErZjRBQmdRR0NBWU1CaEFHRkFZWUJod0dJQVlrQmlnR0xBWXdCalFHT0FZOEJrQUdSQVpJQmt3R1VBWlVCbGdHWEFaZ0JtUUdhQVpzQm5BR2RBWjRCbndHZ0FhRUJvZ0dqQWFRQnBRR21BYWNCcUFHcEFhb0Jxd0dzQWEwQnJnR3ZBYkFCc1FHeUFiTUJ0QUcxQWJZQnR3SExBY29CdUFISkFia0J5QUc2QWJzQnZBRzlBYjRCdndIQUFjRUJ3Z0hEQWNRQnhRSEdBUURjQVF0QkFDRVFETVlCQzBFT0lSQU14UUVMUVEwaEVBekVBUXRCRHlFUURNTUJDMEVRSVJBTXdnRUxRUk1oRUF6QkFRdEJGQ0VRRE1BQkMwRVZJUkFNdndFTFFSWWhFQXkrQVF0QkZ5RVFETDBCQzBFWUlSQU12QUVMUVJraEVBeTdBUXRCR2lFUURMb0JDMEViSVJBTXVRRUxRUndoRUF5NEFRdEJDQ0VRRExjQkMwRWRJUkFNdGdFTFFTQWhFQXkxQVF0Qkh5RVFETFFCQzBFSElSQU1zd0VMUVNFaEVBeXlBUXRCSWlFUURMRUJDMEVlSVJBTXNBRUxRU01oRUF5dkFRdEJFaUVRREs0QkMwRVJJUkFNclFFTFFTUWhFQXlzQVF0QkpTRVFES3NCQzBFbUlSQU1xZ0VMUVNjaEVBeXBBUXRCd3dFaEVBeW9BUXRCS1NFUURLY0JDMEVySVJBTXBnRUxRU3doRUF5bEFRdEJMU0VRREtRQkMwRXVJUkFNb3dFTFFTOGhFQXlpQVF0QnhBRWhFQXloQVF0Qk1DRVFES0FCQzBFMElSQU1ud0VMUVF3aEVBeWVBUXRCTVNFUURKMEJDMEV5SVJBTW5BRUxRVE1oRUF5YkFRdEJPU0VRREpvQkMwRTFJUkFNbVFFTFFjVUJJUkFNbUFFTFFRc2hFQXlYQVF0Qk9pRVFESllCQzBFMklSQU1sUUVMUVFvaEVBeVVBUXRCTnlFUURKTUJDMEU0SVJBTWtnRUxRVHdoRUF5UkFRdEJPeUVRREpBQkMwRTlJUkFNandFTFFRa2hFQXlPQVF0QktDRVFESTBCQzBFK0lSQU1qQUVMUVQ4aEVBeUxBUXRCd0FBaEVBeUtBUXRCd1FBaEVBeUpBUXRCd2dBaEVBeUlBUXRCd3dBaEVBeUhBUXRCeEFBaEVBeUdBUXRCeFFBaEVBeUZBUXRCeGdBaEVBeUVBUXRCS2lFUURJTUJDMEhIQUNFUURJSUJDMEhJQUNFUURJRUJDMEhKQUNFUURJQUJDMEhLQUNFUURIOExRY3NBSVJBTWZndEJ6UUFoRUF4OUMwSE1BQ0VRREh3TFFjNEFJUkFNZXd0Qnp3QWhFQXg2QzBIUUFDRVFESGtMUWRFQUlSQU1lQXRCMGdBaEVBeDNDMEhUQUNFUURIWUxRZFFBSVJBTWRRdEIxZ0FoRUF4MEMwSFZBQ0VRREhNTFFRWWhFQXh5QzBIWEFDRVFESEVMUVFVaEVBeHdDMEhZQUNFUURHOExRUVFoRUF4dUMwSFpBQ0VRREcwTFFkb0FJUkFNYkF0QjJ3QWhFQXhyQzBIY0FDRVFER29MUVFNaEVBeHBDMEhkQUNFUURHZ0xRZDRBSVJBTVp3dEIzd0FoRUF4bUMwSGhBQ0VRREdVTFFlQUFJUkFNWkF0QjRnQWhFQXhqQzBIakFDRVFER0lMUVFJaEVBeGhDMEhrQUNFUURHQUxRZVVBSVJBTVh3dEI1Z0FoRUF4ZUMwSG5BQ0VRREYwTFFlZ0FJUkFNWEF0QjZRQWhFQXhiQzBIcUFDRVFERm9MUWVzQUlSQU1XUXRCN0FBaEVBeFlDMEh0QUNFUURGY0xRZTRBSVJBTVZndEI3d0FoRUF4VkMwSHdBQ0VRREZRTFFmRUFJUkFNVXd0QjhnQWhFQXhTQzBIekFDRVFERkVMUWZRQUlSQU1VQXRCOVFBaEVBeFBDMEgyQUNFUURFNExRZmNBSVJBTVRRdEIrQUFoRUF4TUMwSDVBQ0VRREVzTFFmb0FJUkFNU2d0Qit3QWhFQXhKQzBIOEFDRVFERWdMUWYwQUlSQU1Sd3RCL2dBaEVBeEdDMEgvQUNFUURFVUxRWUFCSVJBTVJBdEJnUUVoRUF4REMwR0NBU0VRREVJTFFZTUJJUkFNUVF0QmhBRWhFQXhBQzBHRkFTRVFERDhMUVlZQklSQU1QZ3RCaHdFaEVBdzlDMEdJQVNFUUREd0xRWWtCSVJBTU93dEJpZ0VoRUF3NkMwR0xBU0VRRERrTFFZd0JJUkFNT0F0QmpRRWhFQXczQzBHT0FTRVFERFlMUVk4QklSQU1OUXRCa0FFaEVBdzBDMEdSQVNFUURETUxRWklCSVJBTU1ndEJrd0VoRUF3eEMwR1VBU0VRRERBTFFaVUJJUkFNTHd0QmxnRWhFQXd1QzBHWEFTRVFEQzBMUVpnQklSQU1MQXRCbVFFaEVBd3JDMEdhQVNFUURDb0xRWnNCSVJBTUtRdEJuQUVoRUF3b0MwR2RBU0VRRENjTFFaNEJJUkFNSmd0Qm53RWhFQXdsQzBHZ0FTRVFEQ1FMUWFFQklSQU1Jd3RCb2dFaEVBd2lDMEdqQVNFUURDRUxRYVFCSVJBTUlBdEJwUUVoRUF3ZkMwR21BU0VRREI0TFFhY0JJUkFNSFF0QnFBRWhFQXdjQzBHcEFTRVFEQnNMUWFvQklSQU1HZ3RCcXdFaEVBd1pDMEdzQVNFUURCZ0xRYTBCSVJBTUZ3dEJyZ0VoRUF3V0MwRUJJUkFNRlF0QnJ3RWhFQXdVQzBHd0FTRVFEQk1MUWJFQklSQU1FZ3RCc3dFaEVBd1JDMEd5QVNFUURCQUxRYlFCSVJBTUR3dEJ0UUVoRUF3T0MwRzJBU0VRREEwTFFiY0JJUkFNREF0QnVBRWhFQXdMQzBHNUFTRVFEQW9MUWJvQklSQU1DUXRCdXdFaEVBd0lDMEhHQVNFUURBY0xRYndCSVJBTUJndEJ2UUVoRUF3RkMwRytBU0VRREFRTFFiOEJJUkFNQXd0QndBRWhFQXdDQzBIQ0FTRVFEQUVMUWNFQklSQUxBMEFDUUFKQUFrQUNRQUpBQWtBQ1FBSkFBa0FDUUFKQUFrQUNRQUpBQWtBQ1FBSkFBa0FDUUFKQUFrQUNRQUpBQWtBQ1FBSkFBa0FDUUFKQUFrQUNRQUpBQWtBQ1FBSkFBa0FDUUFKQUFrQUNRQUpBQWtBQ1FBSkFBa0FDUUFKQUFrQUNRQUpBQWtBQ1FBSkFBa0FDUUFKQUFrQUNRQUpBQWtBQ1FBSkFBa0FDUUFKQUFrQUNRQUpBQWtBQ1FBSkFBa0FDUUFKQUFrQUNRQUpBQWtBQ1FBSkFBa0FDUUFKQUFrQUNRQUpBQWtBQ1FBSkFBa0FDUUFKQUFrQUNRQUpBQWtBQ1FBSkFBa0FDUUFKQUFrQUNRQUpBQWtBQ1FBSkFBa0FDUUFKQUFrQUNRQUpBQWtBQ1FBSkFBa0FDUUFKQUFrQUNRQUpBQWtBQ1FBSkFBa0FDUUFKQUFrQUNRQUpBQWtBQ1FBSkFBa0FDUUFKQUFrQUNRQUpBQWtBQ1FBSkFBa0FDUUFKQUFrQUNRQUpBQWtBQ1FBSkFBa0FDUUFKQUFrQUNRQUpBQWtBQ1FBSkFBa0FDUUFKQUFrQUNRQUpBQWtBQ1FBSkFBa0FDUUFKQUFrQUNRQUpBQWtBQ1FBSkFBa0FDUUFKQUFrQUNRQUpBQWtBQ1FBSkFBa0FDUUFKQUFrQUNRQUpBQWtBQ1FBSkFBa0FDUUFKQUFrQUNRQUpBQWtBQ1FBSkFBa0FDUUFKQUFrQUNRQUpBQWtBQ1FBSkFBa0FDUUFKQUFrQUNRQUpBQWtBQ1FBSkFBa0FDUUFKQUFrQUNRQUpBQWtBQ1FBSkFBa0FDUUFKQUFrQUNRQUpBQWtBQ1FBSkFBa0FDUUFKQUFrQUNRQUpBQWtBQ1FBSkFBa0FDUUFKQUFrQUNRQUpBQWtBQ1FBSkFBa0FDUUFKQUFrQUNRQUpBQWtBQ1FBSkFBa0FDUUFKQUFrQUNRQUpBQWtBQ1FBSkFBa0FDUUFKQUFrQUNRQUpBQWtBQ1FBSkFBa0FDUUFKQUFrQUNRQUpBQWtBQ1FBSkFBa0FDUUFKQUFrQUNRQUpBQWtBQ1FBSkFBa0FDUUFKQUFrQUNRQUpBQWtBQ1FBSkFBa0FDUUFKQUFrQUNRQUpBQWtBQ1FBSkFBa0FDUUFKQUFrQUNRQUpBQWtBQ1FBSkFBa0FDUUFKQUFrQUNRQUpBQWtBQ1FBSkFBa0FDUUFKQUFrQUNRQUpBQWtBQ1FBSkFBa0FDUUFKQUFrQUNRQUpBQWtBQ1FBSkFBa0FDUUFKQUFrQUNRQUpBQWtBQ1FBSkFBa0FDUUFKQUFrQUNRQUpBQWtBQ1FBSkFBa0FDUUFKQUFrQUNRQUpBQWtBQ1FBSkFBa0FDUUFKQUFrQUNRQUpBQWtBQ1FBSkFBa0FDUUFKQUFrQUNRQUpBQWtBQ1FBSkFBa0FDUUFKQUFrQUNRQUpBQWtBQ1FBSkFBa0FDUUFKQUFrQUNRQUpBQWtBQ1FBSkFBa0FDUUFKQUFrQUNRQUpBQWtBQ1FBSkFBa0FDUUFKQUFrQUNRQUpBQWtBQ1FBSkFBa0FDUUFKQUFrQUNRQUpBQWtBQ1FBSkFBa0FDUUFKQUFrQUNRQUpBQWtBQ1FBSkFBa0FDUUFKQUFrQUNRQUpBQWtBQ1FBSkFBa0FDUUFKQUFrQUNRQUpBQWtBQ1FBSkFBa0FDUUFKQUFrQUNRQUpBQWtBQ1FBSkFBa0FDUUNBUURzY0JBQUVDQXdRRkJnY0lDUW9MREEwT0R4QVJFaE1VRlJZWEdCa2FHeHdlSHlBaEl5VW9QMEJCUkVWR1IwaEpTa3RNVFU5UVVWSlQzZ05YV1Z0Y1hXQmlaV1puYUdscWEyeHRiM0J4Y25OMGRYWjNlSGw2ZTN4OWZvQUJnZ0dGQVlZQmh3R0pBWXNCakFHTkFZNEJqd0dRQVpFQmxBR1ZBWllCbHdHWUFaa0JtZ0diQVp3Qm5RR2VBWjhCb0FHaEFhSUJvd0drQWFVQnBnR25BYWdCcVFHcUFhc0JyQUd0QWE0QnJ3R3dBYkVCc2dHekFiUUJ0UUcyQWJjQnVBRzVBYm9CdXdHOEFiMEJ2Z0cvQWNBQndRSENBY01CeEFIRkFjWUJ4d0hJQWNrQnlnSExBY3dCelFIT0FjOEIwQUhSQWRJQjB3SFVBZFVCMWdIWEFkZ0IyUUhhQWRzQjNBSGRBZDRCNEFIaEFlSUI0d0hrQWVVQjVnSG5BZWdCNlFIcUFlc0I3QUh0QWU0Qjd3SHdBZkVCOGdIekFaa0NwQUt3QXY0Qy9nSUxJQUVpQkNBQ1J3M3pBVUhkQVNFUURQOERDeUFCSWhBZ0FrY04zUUZCd3dFaEVBeitBd3NnQVNJQklBSkhEWkFCUWZjQUlSQU0vUU1MSUFFaUFTQUNSdzJHQVVIdkFDRVFEUHdEQ3lBQklnRWdBa2NOZjBIcUFDRVFEUHNEQ3lBQklnRWdBa2NOZTBIb0FDRVFEUG9EQ3lBQklnRWdBa2NOZUVIbUFDRVFEUGtEQ3lBQklnRWdBa2NOR2tFWUlSQU0rQU1MSUFFaUFTQUNSdzBVUVJJaEVBejNBd3NnQVNJQklBSkhEVmxCeFFBaEVBejJBd3NnQVNJQklBSkhEVXBCUHlFUURQVURDeUFCSWdFZ0FrY05TRUU4SVJBTTlBTUxJQUVpQVNBQ1J3MUJRVEVoRUF6ekF3c2dBQzBBTGtFQlJnM3JBd3lIQWdzZ0FDQUJJZ0VnQWhEQWdJQ0FBRUVCUnczbUFTQUFRZ0EzQXlBTTV3RUxJQUFnQVNJQklBSVF0SUNBZ0FBaUVBM25BU0FCSVFFTTlRSUxBa0FnQVNJQklBSkhEUUJCQmlFUURQQURDeUFBSUFGQkFXb2lBU0FDRUx1QWdJQUFJaEFONkFFZ0FTRUJEREVMSUFCQ0FEY0RJRUVTSVJBTTFRTUxJQUVpRUNBQ1J3MHJRUjBoRUF6dEF3c0NRQ0FCSWdFZ0FrWU5BQ0FCUVFGcUlRRkJFQ0VRRE5RREMwRUhJUkFNN0FNTElBQkNBQ0FBS1FNZ0loRWdBaUFCSWhCcnJTSVNmU0lUSUJNZ0VWWWJOd01nSUJFZ0VsWWlGRVVONVFGQkNDRVFET3NEQ3dKQUlBRWlBU0FDUmcwQUlBQkJpWUNBZ0FBMkFnZ2dBQ0FCTmdJRUlBRWhBVUVVSVJBTTBnTUxRUWtoRUF6cUF3c2dBU0VCSUFBcEF5QlFEZVFCSUFFaEFRenlBZ3NDUUNBQklnRWdBa2NOQUVFTElSQU02UU1MSUFBZ0FVRUJhaUlCSUFJUXRvQ0FnQUFpRUEzbEFTQUJJUUVNOGdJTElBQWdBU0lCSUFJUXVJQ0FnQUFpRUEzbEFTQUJJUUVNOGdJTElBQWdBU0lCSUFJUXVJQ0FnQUFpRUEzbUFTQUJJUUVNRFFzZ0FDQUJJZ0VnQWhDNmdJQ0FBQ0lRRGVjQklBRWhBUXp3QWdzQ1FDQUJJZ0VnQWtjTkFFRVBJUkFNNVFNTElBRXRBQUFpRUVFN1JnMElJQkJCRFVjTjZBRWdBVUVCYWlFQkRPOENDeUFBSUFFaUFTQUNFTHFBZ0lBQUloQU42QUVnQVNFQkRQSUNDd05BQWtBZ0FTMEFBRUh3dFlDQUFHb3RBQUFpRUVFQlJnMEFJQkJCQWtjTjZ3RWdBQ2dDQkNFUUlBQkJBRFlDQkNBQUlCQWdBVUVCYWlJQkVMbUFnSUFBSWhBTjZnRWdBU0VCRFBRQ0N5QUJRUUZxSWdFZ0FrY05BQXRCRWlFUURPSURDeUFBSUFFaUFTQUNFTHFBZ0lBQUloQU42UUVnQVNFQkRBb0xJQUVpQVNBQ1J3MEdRUnNoRUF6Z0F3c0NRQ0FCSWdFZ0FrY05BRUVXSVJBTTRBTUxJQUJCaW9DQWdBQTJBZ2dnQUNBQk5nSUVJQUFnQVNBQ0VMaUFnSUFBSWhBTjZnRWdBU0VCUVNBaEVBekdBd3NDUUNBQklnRWdBa1lOQUFOQUFrQWdBUzBBQUVId3Q0Q0FBR290QUFBaUVFRUNSZzBBQWtBZ0VFRi9hZzRFNVFIc0FRRHJBZXdCQ3lBQlFRRnFJUUZCQ0NFUURNZ0RDeUFCUVFGcUlnRWdBa2NOQUF0QkZTRVFETjhEQzBFVklSQU0zZ01MQTBBQ1FDQUJMUUFBUWZDNWdJQUFhaTBBQUNJUVFRSkdEUUFnRUVGL2FnNEUzZ0hzQWVBQjZ3SHNBUXNnQVVFQmFpSUJJQUpIRFFBTFFSZ2hFQXpkQXdzQ1FDQUJJZ0VnQWtZTkFDQUFRWXVBZ0lBQU5nSUlJQUFnQVRZQ0JDQUJJUUZCQnlFUURNUURDMEVaSVJBTTNBTUxJQUZCQVdvaEFRd0NDd0pBSUFFaUZDQUNSdzBBUVJvaEVBemJBd3NnRkNFQkFrQWdGQzBBQUVGemFnNFUzUUx1QXU0QzdnTHVBdTRDN2dMdUF1NEM3Z0x1QXU0QzdnTHVBdTRDN2dMdUF1NEM3Z0lBN2dJTFFRQWhFQ0FBUVFBMkFod2dBRUd2aTRDQUFEWUNFQ0FBUVFJMkFnd2dBQ0FVUVFGcU5nSVVETm9EQ3dKQUlBRXRBQUFpRUVFN1JnMEFJQkJCRFVjTjZBRWdBVUVCYWlFQkRPVUNDeUFCUVFGcUlRRUxRU0loRUF5L0F3c0NRQ0FCSWhBZ0FrY05BRUVjSVJBTTJBTUxRZ0FoRVNBUUlRRWdFQzBBQUVGUWFnNDM1d0htQVFFQ0F3UUZCZ2NJQUFBQUFBQUFBQWtLQ3d3TkRnQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUR4QVJFaE1VQUF0QkhpRVFETDBEQzBJQ0lSRU01UUVMUWdNaEVRemtBUXRDQkNFUkRPTUJDMElGSVJFTTRnRUxRZ1loRVF6aEFRdENCeUVSRE9BQkMwSUlJUkVNM3dFTFFna2hFUXplQVF0Q0NpRVJETjBCQzBJTElSRU0zQUVMUWd3aEVRemJBUXRDRFNFUkROb0JDMElPSVJFTTJRRUxRZzhoRVF6WUFRdENDaUVSRE5jQkMwSUxJUkVNMWdFTFFnd2hFUXpWQVF0Q0RTRVJETlFCQzBJT0lSRU0wd0VMUWc4aEVRelNBUXRDQUNFUkFrQUNRQUpBQWtBQ1FBSkFBa0FDUUFKQUFrQUNRQUpBQWtBQ1FBSkFBa0FDUUFKQUFrQUNRQ0FRTFFBQVFWQnFEamZsQWVRQkFBRUNBd1FGQmdmbUFlWUI1Z0htQWVZQjVnSG1BUWdKQ2dzTURlWUI1Z0htQWVZQjVnSG1BZVlCNWdIbUFlWUI1Z0htQWVZQjVnSG1BZVlCNWdIbUFlWUI1Z0htQWVZQjVnSG1BZVlCNWdFT0R4QVJFaFBtQVF0Q0FpRVJET1FCQzBJRElSRU00d0VMUWdRaEVRemlBUXRDQlNFUkRPRUJDMElHSVJFTTRBRUxRZ2NoRVF6ZkFRdENDQ0VSRE40QkMwSUpJUkVNM1FFTFFnb2hFUXpjQVF0Q0N5RVJETnNCQzBJTUlSRU0yZ0VMUWcwaEVRelpBUXRDRGlFUkROZ0JDMElQSVJFTTF3RUxRZ29oRVF6V0FRdENDeUVSRE5VQkMwSU1JUkVNMUFFTFFnMGhFUXpUQVF0Q0RpRVJETklCQzBJUElSRU0wUUVMSUFCQ0FDQUFLUU1nSWhFZ0FpQUJJaEJyclNJU2ZTSVRJQk1nRVZZYk53TWdJQkVnRWxZaUZFVU4wZ0ZCSHlFUURNQURDd0pBSUFFaUFTQUNSZzBBSUFCQmlZQ0FnQUEyQWdnZ0FDQUJOZ0lFSUFFaEFVRWtJUkFNcHdNTFFTQWhFQXkvQXdzZ0FDQUJJaEFnQWhDK2dJQ0FBRUYvYWc0RnRnRUF4UUlCMFFIU0FRdEJFU0VRREtRREN5QUFRUUU2QUM4Z0VDRUJETHNEQ3lBQklnRWdBa2NOMGdGQkpDRVFETHNEQ3lBQklnMGdBa2NOSGtIR0FDRVFETG9EQ3lBQUlBRWlBU0FDRUxLQWdJQUFJaEFOMUFFZ0FTRUJETFVCQ3lBQkloQWdBa2NOSmtIUUFDRVFETGdEQ3dKQUlBRWlBU0FDUncwQVFTZ2hFQXk0QXdzZ0FFRUFOZ0lFSUFCQmpJQ0FnQUEyQWdnZ0FDQUJJQUVRc1lDQWdBQWlFQTNUQVNBQklRRU0yQUVMQWtBZ0FTSVFJQUpIRFFCQktTRVFETGNEQ3lBUUxRQUFJZ0ZCSUVZTkZDQUJRUWxIRGRNQklCQkJBV29oQVF3VkN3SkFJQUVpQVNBQ1JnMEFJQUZCQVdvaEFRd1hDMEVxSVJBTXRRTUxBa0FnQVNJUUlBSkhEUUJCS3lFUURMVURDd0pBSUJBdEFBQWlBVUVKUmcwQUlBRkJJRWNOMVFFTElBQXRBQ3hCQ0VZTjB3RWdFQ0VCREpFREN3SkFJQUVpQVNBQ1J3MEFRU3doRUF5MEF3c2dBUzBBQUVFS1J3M1ZBU0FCUVFGcUlRRU15UUlMSUFFaURpQUNSdzNWQVVFdklSQU1zZ01MQTBBQ1FDQUJMUUFBSWhCQklFWU5BQUpBSUJCQmRtb09CQURjQWR3QkFOb0JDeUFCSVFFTTRBRUxJQUZCQVdvaUFTQUNSdzBBQzBFeElSQU1zUU1MUVRJaEVDQUJJaFFnQWtZTnNBTWdBaUFVYXlBQUtBSUFJZ0ZxSVJVZ0ZDQUJhMEVEYWlFV0FrQURRQ0FVTFFBQUloZEJJSElnRnlBWFFiOS9ha0gvQVhGQkdra2JRZjhCY1NBQlFmQzdnSUFBYWkwQUFFY05BUUpBSUFGQkEwY05BRUVHSVFFTWxnTUxJQUZCQVdvaEFTQVVRUUZxSWhRZ0FrY05BQXNnQUNBVk5nSUFETEVEQ3lBQVFRQTJBZ0FnRkNFQkROa0JDMEV6SVJBZ0FTSVVJQUpHRGE4RElBSWdGR3NnQUNnQ0FDSUJhaUVWSUJRZ0FXdEJDR29oRmdKQUEwQWdGQzBBQUNJWFFTQnlJQmNnRjBHL2YycEIvd0Z4UVJwSkcwSC9BWEVnQVVIMHU0Q0FBR290QUFCSERRRUNRQ0FCUVFoSERRQkJCU0VCREpVREN5QUJRUUZxSVFFZ0ZFRUJhaUlVSUFKSERRQUxJQUFnRlRZQ0FBeXdBd3NnQUVFQU5nSUFJQlFoQVF6WUFRdEJOQ0VRSUFFaUZDQUNSZzJ1QXlBQ0lCUnJJQUFvQWdBaUFXb2hGU0FVSUFGclFRVnFJUllDUUFOQUlCUXRBQUFpRjBFZ2NpQVhJQmRCdjM5cVFmOEJjVUVhU1J0Qi93RnhJQUZCME1LQWdBQnFMUUFBUncwQkFrQWdBVUVGUncwQVFRY2hBUXlVQXdzZ0FVRUJhaUVCSUJSQkFXb2lGQ0FDUncwQUN5QUFJQlUyQWdBTXJ3TUxJQUJCQURZQ0FDQVVJUUVNMXdFTEFrQWdBU0lCSUFKR0RRQURRQUpBSUFFdEFBQkJnTDZBZ0FCcUxRQUFJaEJCQVVZTkFDQVFRUUpHRFFvZ0FTRUJETjBCQ3lBQlFRRnFJZ0VnQWtjTkFBdEJNQ0VRREs0REMwRXdJUkFNclFNTEFrQWdBU0lCSUFKR0RRQURRQUpBSUFFdEFBQWlFRUVnUmcwQUlCQkJkbW9PQk5rQjJnSGFBZGtCMmdFTElBRkJBV29pQVNBQ1J3MEFDMEU0SVJBTXJRTUxRVGdoRUF5c0F3c0RRQUpBSUFFdEFBQWlFRUVnUmcwQUlCQkJDVWNOQXdzZ0FVRUJhaUlCSUFKSERRQUxRVHdoRUF5ckF3c0RRQUpBSUFFdEFBQWlFRUVnUmcwQUFrQUNRQ0FRUVhacURnVGFBUUVCMmdFQUN5QVFRU3hHRGRzQkN5QUJJUUVNQkFzZ0FVRUJhaUlCSUFKSERRQUxRVDhoRUF5cUF3c2dBU0VCRE5zQkMwSEFBQ0VRSUFFaUZDQUNSZzJvQXlBQ0lCUnJJQUFvQWdBaUFXb2hGaUFVSUFGclFRWnFJUmNDUUFOQUlCUXRBQUJCSUhJZ0FVR0F3SUNBQUdvdEFBQkhEUUVnQVVFR1JnMk9BeUFCUVFGcUlRRWdGRUVCYWlJVUlBSkhEUUFMSUFBZ0ZqWUNBQXlwQXdzZ0FFRUFOZ0lBSUJRaEFRdEJOaUVRREk0REN3SkFJQUVpRHlBQ1J3MEFRY0VBSVJBTXB3TUxJQUJCaklDQWdBQTJBZ2dnQUNBUE5nSUVJQThoQVNBQUxRQXNRWDlxRGdUTkFkVUIxd0haQVljREN5QUJRUUZxSVFFTXpBRUxBa0FnQVNJQklBSkdEUUFEUUFKQUlBRXRBQUFpRUVFZ2NpQVFJQkJCdjM5cVFmOEJjVUVhU1J0Qi93RnhJaEJCQ1VZTkFDQVFRU0JHRFFBQ1FBSkFBa0FDUUNBUVFaMS9hZzRUQUFNREF3TURBd01CQXdNREF3TURBd01EQWdNTElBRkJBV29oQVVFeElSQU1rUU1MSUFGQkFXb2hBVUV5SVJBTWtBTUxJQUZCQVdvaEFVRXpJUkFNandNTElBRWhBUXpRQVFzZ0FVRUJhaUlCSUFKSERRQUxRVFVoRUF5bEF3dEJOU0VRREtRREN3SkFJQUVpQVNBQ1JnMEFBMEFDUUNBQkxRQUFRWUM4Z0lBQWFpMEFBRUVCUmcwQUlBRWhBUXpUQVFzZ0FVRUJhaUlCSUFKSERRQUxRVDBoRUF5a0F3dEJQU0VRREtNREN5QUFJQUVpQVNBQ0VMQ0FnSUFBSWhBTjFnRWdBU0VCREFFTElCQkJBV29oQVF0QlBDRVFESWNEQ3dKQUlBRWlBU0FDUncwQVFjSUFJUkFNb0FNTEFrQURRQUpBSUFFdEFBQkJkMm9PR0FBQy9nTCtBb1FEL2dMK0F2NEMvZ0wrQXY0Qy9nTCtBdjRDL2dMK0F2NEMvZ0wrQXY0Qy9nTCtBdjRDQVA0Q0N5QUJRUUZxSWdFZ0FrY05BQXRCd2dBaEVBeWdBd3NnQVVFQmFpRUJJQUF0QUMxQkFYRkZEYjBCSUFFaEFRdEJMQ0VRRElVREN5QUJJZ0VnQWtjTjB3RkJ4QUFoRUF5ZEF3c0RRQUpBSUFFdEFBQkJrTUNBZ0FCcUxRQUFRUUZHRFFBZ0FTRUJETGNDQ3lBQlFRRnFJZ0VnQWtjTkFBdEJ4UUFoRUF5Y0F3c2dEUzBBQUNJUVFTQkdEYk1CSUJCQk9rY05nUU1nQUNnQ0JDRUJJQUJCQURZQ0JDQUFJQUVnRFJDdmdJQ0FBQ0lCRGRBQklBMUJBV29oQVF5ekFndEJ4d0FoRUNBQklnMGdBa1lObWdNZ0FpQU5heUFBS0FJQUlnRnFJUllnRFNBQmEwRUZhaUVYQTBBZ0RTMEFBQ0lVUVNCeUlCUWdGRUcvZjJwQi93RnhRUnBKRzBIL0FYRWdBVUdRd29DQUFHb3RBQUJIRFlBRElBRkJCVVlOOUFJZ0FVRUJhaUVCSUExQkFXb2lEU0FDUncwQUN5QUFJQlkyQWdBTW1nTUxRY2dBSVJBZ0FTSU5JQUpHRFprRElBSWdEV3NnQUNnQ0FDSUJhaUVXSUEwZ0FXdEJDV29oRndOQUlBMHRBQUFpRkVFZ2NpQVVJQlJCdjM5cVFmOEJjVUVhU1J0Qi93RnhJQUZCbHNLQWdBQnFMUUFBUnczL0FnSkFJQUZCQ1VjTkFFRUNJUUVNOVFJTElBRkJBV29oQVNBTlFRRnFJZzBnQWtjTkFBc2dBQ0FXTmdJQURKa0RDd0pBSUFFaURTQUNSdzBBUWNrQUlSQU1tUU1MQWtBQ1FDQU5MUUFBSWdGQklISWdBU0FCUWI5L2FrSC9BWEZCR2trYlFmOEJjVUdTZjJvT0J3Q0FBNEFEZ0FPQUE0QURBWUFEQ3lBTlFRRnFJUUZCUGlFUURJQURDeUFOUVFGcUlRRkJQeUVRRFA4Q0MwSEtBQ0VRSUFFaURTQUNSZzJYQXlBQ0lBMXJJQUFvQWdBaUFXb2hGaUFOSUFGclFRRnFJUmNEUUNBTkxRQUFJaFJCSUhJZ0ZDQVVRYjkvYWtIL0FYRkJHa2tiUWY4QmNTQUJRYURDZ0lBQWFpMEFBRWNOL1FJZ0FVRUJSZzN3QWlBQlFRRnFJUUVnRFVFQmFpSU5JQUpIRFFBTElBQWdGallDQUF5WEF3dEJ5d0FoRUNBQklnMGdBa1lObGdNZ0FpQU5heUFBS0FJQUlnRnFJUllnRFNBQmEwRU9haUVYQTBBZ0RTMEFBQ0lVUVNCeUlCUWdGRUcvZjJwQi93RnhRUnBKRzBIL0FYRWdBVUdpd29DQUFHb3RBQUJIRGZ3Q0lBRkJEa1lOOEFJZ0FVRUJhaUVCSUExQkFXb2lEU0FDUncwQUN5QUFJQlkyQWdBTWxnTUxRY3dBSVJBZ0FTSU5JQUpHRFpVRElBSWdEV3NnQUNnQ0FDSUJhaUVXSUEwZ0FXdEJEMm9oRndOQUlBMHRBQUFpRkVFZ2NpQVVJQlJCdjM5cVFmOEJjVUVhU1J0Qi93RnhJQUZCd01LQWdBQnFMUUFBUnczN0FnSkFJQUZCRDBjTkFFRURJUUVNOFFJTElBRkJBV29oQVNBTlFRRnFJZzBnQWtjTkFBc2dBQ0FXTmdJQURKVURDMEhOQUNFUUlBRWlEU0FDUmcyVUF5QUNJQTFySUFBb0FnQWlBV29oRmlBTklBRnJRUVZxSVJjRFFDQU5MUUFBSWhSQklISWdGQ0FVUWI5L2FrSC9BWEZCR2trYlFmOEJjU0FCUWREQ2dJQUFhaTBBQUVjTitnSUNRQ0FCUVFWSERRQkJCQ0VCRFBBQ0N5QUJRUUZxSVFFZ0RVRUJhaUlOSUFKSERRQUxJQUFnRmpZQ0FBeVVBd3NDUUNBQklnMGdBa2NOQUVIT0FDRVFESlFEQ3dKQUFrQUNRQUpBSUEwdEFBQWlBVUVnY2lBQklBRkJ2MzlxUWY4QmNVRWFTUnRCL3dGeFFaMS9hZzRUQVAwQy9RTDlBdjBDL1FMOUF2MEMvUUw5QXYwQy9RTDlBZ0g5QXYwQy9RSUNBLzBDQ3lBTlFRRnFJUUZCd1FBaEVBejlBZ3NnRFVFQmFpRUJRY0lBSVJBTS9BSUxJQTFCQVdvaEFVSERBQ0VRRFBzQ0N5QU5RUUZxSVFGQnhBQWhFQXo2QWdzQ1FDQUJJZ0VnQWtZTkFDQUFRWTJBZ0lBQU5nSUlJQUFnQVRZQ0JDQUJJUUZCeFFBaEVBejZBZ3RCendBaEVBeVNBd3NnRUNFQkFrQUNRQ0FRTFFBQVFYWnFEZ1FCcUFLb0FnQ29BZ3NnRUVFQmFpRUJDMEVuSVJBTStBSUxBa0FnQVNJQklBSkhEUUJCMFFBaEVBeVJBd3NDUUNBQkxRQUFRU0JHRFFBZ0FTRUJESTBCQ3lBQlFRRnFJUUVnQUMwQUxVRUJjVVVOeHdFZ0FTRUJESXdCQ3lBQkloY2dBa2NOeUFGQjBnQWhFQXlQQXd0QjB3QWhFQ0FCSWhRZ0FrWU5qZ01nQWlBVWF5QUFLQUlBSWdGcUlSWWdGQ0FCYTBFQmFpRVhBMEFnRkMwQUFDQUJRZGJDZ0lBQWFpMEFBRWNOekFFZ0FVRUJSZzNIQVNBQlFRRnFJUUVnRkVFQmFpSVVJQUpIRFFBTElBQWdGallDQUF5T0F3c0NRQ0FCSWdFZ0FrY05BRUhWQUNFUURJNERDeUFCTFFBQVFRcEhEY3dCSUFGQkFXb2hBUXpIQVFzQ1FDQUJJZ0VnQWtjTkFFSFdBQ0VRREkwREN3SkFBa0FnQVMwQUFFRjJhZzRFQU0wQnpRRUJ6UUVMSUFGQkFXb2hBUXpIQVFzZ0FVRUJhaUVCUWNvQUlSQU04d0lMSUFBZ0FTSUJJQUlRcm9DQWdBQWlFQTNMQVNBQklRRkJ6UUFoRUF6eUFnc2dBQzBBS1VFaVJnMkZBd3ltQWdzQ1FDQUJJZ0VnQWtjTkFFSGJBQ0VRRElvREMwRUFJUlJCQVNFWFFRRWhGa0VBSVJBQ1FBSkFBa0FDUUFKQUFrQUNRQUpBQWtBZ0FTMEFBRUZRYWc0SzFBSFRBUUFCQWdNRUJRWUkxUUVMUVFJaEVBd0dDMEVESVJBTUJRdEJCQ0VRREFRTFFRVWhFQXdEQzBFR0lSQU1BZ3RCQnlFUURBRUxRUWdoRUF0QkFDRVhRUUFoRmtFQUlSUU16QUVMUVFraEVFRUJJUlJCQUNFWFFRQWhGZ3pMQVFzQ1FDQUJJZ0VnQWtjTkFFSGRBQ0VRRElrREN5QUJMUUFBUVM1SERjd0JJQUZCQVdvaEFReW1BZ3NnQVNJQklBSkhEY3dCUWQ4QUlSQU1od01MQWtBZ0FTSUJJQUpHRFFBZ0FFR09nSUNBQURZQ0NDQUFJQUUyQWdRZ0FTRUJRZEFBSVJBTTdnSUxRZUFBSVJBTWhnTUxRZUVBSVJBZ0FTSUJJQUpHRFlVRElBSWdBV3NnQUNnQ0FDSVVhaUVXSUFFZ0ZHdEJBMm9oRndOQUlBRXRBQUFnRkVIaXdvQ0FBR290QUFCSERjMEJJQlJCQTBZTnpBRWdGRUVCYWlFVUlBRkJBV29pQVNBQ1J3MEFDeUFBSUJZMkFnQU1oUU1MUWVJQUlSQWdBU0lCSUFKR0RZUURJQUlnQVdzZ0FDZ0NBQ0lVYWlFV0lBRWdGR3RCQW1vaEZ3TkFJQUV0QUFBZ0ZFSG13b0NBQUdvdEFBQkhEY3dCSUJSQkFrWU56Z0VnRkVFQmFpRVVJQUZCQVdvaUFTQUNSdzBBQ3lBQUlCWTJBZ0FNaEFNTFFlTUFJUkFnQVNJQklBSkdEWU1ESUFJZ0FXc2dBQ2dDQUNJVWFpRVdJQUVnRkd0QkEyb2hGd05BSUFFdEFBQWdGRUhwd29DQUFHb3RBQUJIRGNzQklCUkJBMFlOemdFZ0ZFRUJhaUVVSUFGQkFXb2lBU0FDUncwQUN5QUFJQlkyQWdBTWd3TUxBa0FnQVNJQklBSkhEUUJCNVFBaEVBeURBd3NnQUNBQlFRRnFJZ0VnQWhDb2dJQ0FBQ0lRRGMwQklBRWhBVUhXQUNFUURPa0NDd0pBSUFFaUFTQUNSZzBBQTBBQ1FDQUJMUUFBSWhCQklFWU5BQUpBQWtBQ1FDQVFRYmgvYWc0TEFBSFBBYzhCendIUEFjOEJ6d0hQQWM4QkFzOEJDeUFCUVFGcUlRRkIwZ0FoRUF6dEFnc2dBVUVCYWlFQlFkTUFJUkFNN0FJTElBRkJBV29oQVVIVUFDRVFET3NDQ3lBQlFRRnFJZ0VnQWtjTkFBdEI1QUFoRUF5Q0F3dEI1QUFoRUF5QkF3c0RRQUpBSUFFdEFBQkI4TUtBZ0FCcUxRQUFJaEJCQVVZTkFDQVFRWDVxRGdQUEFkQUIwUUhTQVFzZ0FVRUJhaUlCSUFKSERRQUxRZVlBSVJBTWdBTUxBa0FnQVNJQklBSkdEUUFnQVVFQmFpRUJEQU1MUWVjQUlSQU0vd0lMQTBBQ1FDQUJMUUFBUWZERWdJQUFhaTBBQUNJUVFRRkdEUUFDUUNBUVFYNXFEZ1RTQWRNQjFBRUExUUVMSUFFaEFVSFhBQ0VRRE9jQ0N5QUJRUUZxSWdFZ0FrY05BQXRCNkFBaEVBeitBZ3NDUUNBQklnRWdBa2NOQUVIcEFDRVFEUDRDQ3dKQUlBRXRBQUFpRUVGMmFnNGF1Z0hWQWRVQnZBSFZBZFVCMVFIVkFkVUIxUUhWQWRVQjFRSFZBZFVCMVFIVkFkVUIxUUhWQWRVQjFRSEtBZFVCMVFFQTB3RUxJQUZCQVdvaEFRdEJCaUVRRE9NQ0N3TkFBa0FnQVMwQUFFSHd4b0NBQUdvdEFBQkJBVVlOQUNBQklRRU1uZ0lMSUFGQkFXb2lBU0FDUncwQUMwSHFBQ0VRRFBzQ0N3SkFJQUVpQVNBQ1JnMEFJQUZCQVdvaEFRd0RDMEhyQUNFUURQb0NDd0pBSUFFaUFTQUNSdzBBUWV3QUlSQU0rZ0lMSUFGQkFXb2hBUXdCQ3dKQUlBRWlBU0FDUncwQVFlMEFJUkFNK1FJTElBRkJBV29oQVF0QkJDRVFETjRDQ3dKQUlBRWlGQ0FDUncwQVFlNEFJUkFNOXdJTElCUWhBUUpBQWtBQ1FDQVVMUUFBUWZESWdJQUFhaTBBQUVGL2FnNEgxQUhWQWRZQkFKd0NBUUxYQVFzZ0ZFRUJhaUVCREFvTElCUkJBV29oQVF6TkFRdEJBQ0VRSUFCQkFEWUNIQ0FBUVp1U2dJQUFOZ0lRSUFCQkJ6WUNEQ0FBSUJSQkFXbzJBaFFNOWdJTEFrQURRQUpBSUFFdEFBQkI4TWlBZ0FCcUxRQUFJaEJCQkVZTkFBSkFBa0FnRUVGL2FnNEgwZ0hUQWRRQjJRRUFCQUhaQVFzZ0FTRUJRZG9BSVJBTTRBSUxJQUZCQVdvaEFVSGNBQ0VRRE44Q0N5QUJRUUZxSWdFZ0FrY05BQXRCN3dBaEVBejJBZ3NnQVVFQmFpRUJETXNCQ3dKQUlBRWlGQ0FDUncwQVFmQUFJUkFNOVFJTElCUXRBQUJCTDBjTjFBRWdGRUVCYWlFQkRBWUxBa0FnQVNJVUlBSkhEUUJCOFFBaEVBejBBZ3NDUUNBVUxRQUFJZ0ZCTDBjTkFDQVVRUUZxSVFGQjNRQWhFQXpiQWdzZ0FVRjJhaUlFUVJaTERkTUJRUUVnQkhSQmlZQ0FBbkZGRGRNQkRNb0NDd0pBSUFFaUFTQUNSZzBBSUFGQkFXb2hBVUhlQUNFUUROb0NDMEh5QUNFUURQSUNDd0pBSUFFaUZDQUNSdzBBUWZRQUlSQU04Z0lMSUJRaEFRSkFJQlF0QUFCQjhNeUFnQUJxTFFBQVFYOXFEZ1BKQXBRQ0FOUUJDMEhoQUNFUUROZ0NDd0pBSUFFaUZDQUNSZzBBQTBBQ1FDQVVMUUFBUWZES2dJQUFhaTBBQUNJQlFRTkdEUUFDUUNBQlFYOXFEZ0xMQWdEVkFRc2dGQ0VCUWQ4QUlSQU0yZ0lMSUJSQkFXb2lGQ0FDUncwQUMwSHpBQ0VRRFBFQ0MwSHpBQ0VRRFBBQ0N3SkFJQUVpQVNBQ1JnMEFJQUJCajRDQWdBQTJBZ2dnQUNBQk5nSUVJQUVoQVVIZ0FDRVFETmNDQzBIMUFDRVFETzhDQ3dKQUlBRWlBU0FDUncwQVFmWUFJUkFNN3dJTElBQkJqNENBZ0FBMkFnZ2dBQ0FCTmdJRUlBRWhBUXRCQXlFUUROUUNDd05BSUFFdEFBQkJJRWNOd3dJZ0FVRUJhaUlCSUFKSERRQUxRZmNBSVJBTTdBSUxBa0FnQVNJQklBSkhEUUJCK0FBaEVBenNBZ3NnQVMwQUFFRWdSdzNPQVNBQlFRRnFJUUVNN3dFTElBQWdBU0lCSUFJUXJJQ0FnQUFpRUEzT0FTQUJJUUVNamdJTEFrQWdBU0lFSUFKSERRQkIrZ0FoRUF6cUFnc2dCQzBBQUVITUFFY04wUUVnQkVFQmFpRUJRUk1oRUF6UEFRc0NRQ0FCSWdRZ0FrY05BRUg3QUNFUURPa0NDeUFDSUFScklBQW9BZ0FpQVdvaEZDQUVJQUZyUVFWcUlSQURRQ0FFTFFBQUlBRkI4TTZBZ0FCcUxRQUFSdzNRQVNBQlFRVkdEYzRCSUFGQkFXb2hBU0FFUVFGcUlnUWdBa2NOQUFzZ0FDQVVOZ0lBUWZzQUlSQU02QUlMQWtBZ0FTSUVJQUpIRFFCQi9BQWhFQXpvQWdzQ1FBSkFJQVF0QUFCQnZYOXFEZ3dBMFFIUkFkRUIwUUhSQWRFQjBRSFJBZEVCMFFFQjBRRUxJQVJCQVdvaEFVSG1BQ0VRRE04Q0N5QUVRUUZxSVFGQjV3QWhFQXpPQWdzQ1FDQUJJZ1FnQWtjTkFFSDlBQ0VRRE9jQ0N5QUNJQVJySUFBb0FnQWlBV29oRkNBRUlBRnJRUUpxSVJBQ1FBTkFJQVF0QUFBZ0FVSHR6NENBQUdvdEFBQkhEYzhCSUFGQkFrWU5BU0FCUVFGcUlRRWdCRUVCYWlJRUlBSkhEUUFMSUFBZ0ZEWUNBRUg5QUNFUURPY0NDeUFBUVFBMkFnQWdFRUVCYWlFQlFSQWhFQXpNQVFzQ1FDQUJJZ1FnQWtjTkFFSCtBQ0VRRE9ZQ0N5QUNJQVJySUFBb0FnQWlBV29oRkNBRUlBRnJRUVZxSVJBQ1FBTkFJQVF0QUFBZ0FVSDJ6b0NBQUdvdEFBQkhEYzRCSUFGQkJVWU5BU0FCUVFGcUlRRWdCRUVCYWlJRUlBSkhEUUFMSUFBZ0ZEWUNBRUgrQUNFUURPWUNDeUFBUVFBMkFnQWdFRUVCYWlFQlFSWWhFQXpMQVFzQ1FDQUJJZ1FnQWtjTkFFSC9BQ0VRRE9VQ0N5QUNJQVJySUFBb0FnQWlBV29oRkNBRUlBRnJRUU5xSVJBQ1FBTkFJQVF0QUFBZ0FVSDh6b0NBQUdvdEFBQkhEYzBCSUFGQkEwWU5BU0FCUVFGcUlRRWdCRUVCYWlJRUlBSkhEUUFMSUFBZ0ZEWUNBRUgvQUNFUURPVUNDeUFBUVFBMkFnQWdFRUVCYWlFQlFRVWhFQXpLQVFzQ1FDQUJJZ1FnQWtjTkFFR0FBU0VRRE9RQ0N5QUVMUUFBUWRrQVJ3M0xBU0FFUVFGcUlRRkJDQ0VRRE1rQkN3SkFJQUVpQkNBQ1J3MEFRWUVCSVJBTTR3SUxBa0FDUUNBRUxRQUFRYkovYWc0REFNd0JBY3dCQ3lBRVFRRnFJUUZCNndBaEVBektBZ3NnQkVFQmFpRUJRZXdBSVJBTXlRSUxBa0FnQVNJRUlBSkhEUUJCZ2dFaEVBemlBZ3NDUUFKQUlBUXRBQUJCdUg5cURnZ0F5d0hMQWNzQnl3SExBY3NCQWNzQkN5QUVRUUZxSVFGQjZnQWhFQXpKQWdzZ0JFRUJhaUVCUWUwQUlSQU15QUlMQWtBZ0FTSUVJQUpIRFFCQmd3RWhFQXpoQWdzZ0FpQUVheUFBS0FJQUlnRnFJUkFnQkNBQmEwRUNhaUVVQWtBRFFDQUVMUUFBSUFGQmdNK0FnQUJxTFFBQVJ3M0pBU0FCUVFKR0RRRWdBVUVCYWlFQklBUkJBV29pQkNBQ1J3MEFDeUFBSUJBMkFnQkJnd0VoRUF6aEFndEJBQ0VRSUFCQkFEWUNBQ0FVUVFGcUlRRU14Z0VMQWtBZ0FTSUVJQUpIRFFCQmhBRWhFQXpnQWdzZ0FpQUVheUFBS0FJQUlnRnFJUlFnQkNBQmEwRUVhaUVRQWtBRFFDQUVMUUFBSUFGQmc4K0FnQUJxTFFBQVJ3M0lBU0FCUVFSR0RRRWdBVUVCYWlFQklBUkJBV29pQkNBQ1J3MEFDeUFBSUJRMkFnQkJoQUVoRUF6Z0Fnc2dBRUVBTmdJQUlCQkJBV29oQVVFaklSQU14UUVMQWtBZ0FTSUVJQUpIRFFCQmhRRWhFQXpmQWdzQ1FBSkFJQVF0QUFCQnRIOXFEZ2dBeUFISUFjZ0J5QUhJQWNnQkFjZ0JDeUFFUVFGcUlRRkI3d0FoRUF6R0Fnc2dCRUVCYWlFQlFmQUFJUkFNeFFJTEFrQWdBU0lFSUFKSERRQkJoZ0VoRUF6ZUFnc2dCQzBBQUVIRkFFY054UUVnQkVFQmFpRUJESU1DQ3dKQUlBRWlCQ0FDUncwQVFZY0JJUkFNM1FJTElBSWdCR3NnQUNnQ0FDSUJhaUVVSUFRZ0FXdEJBMm9oRUFKQUEwQWdCQzBBQUNBQlFZalBnSUFBYWkwQUFFY054UUVnQVVFRFJnMEJJQUZCQVdvaEFTQUVRUUZxSWdRZ0FrY05BQXNnQUNBVU5nSUFRWWNCSVJBTTNRSUxJQUJCQURZQ0FDQVFRUUZxSVFGQkxTRVFETUlCQ3dKQUlBRWlCQ0FDUncwQVFZZ0JJUkFNM0FJTElBSWdCR3NnQUNnQ0FDSUJhaUVVSUFRZ0FXdEJDR29oRUFKQUEwQWdCQzBBQUNBQlFkRFBnSUFBYWkwQUFFY054QUVnQVVFSVJnMEJJQUZCQVdvaEFTQUVRUUZxSWdRZ0FrY05BQXNnQUNBVU5nSUFRWWdCSVJBTTNBSUxJQUJCQURZQ0FDQVFRUUZxSVFGQktTRVFETUVCQ3dKQUlBRWlBU0FDUncwQVFZa0JJUkFNMndJTFFRRWhFQ0FCTFFBQVFkOEFSdzNBQVNBQlFRRnFJUUVNZ1FJTEFrQWdBU0lFSUFKSERRQkJpZ0VoRUF6YUFnc2dBaUFFYXlBQUtBSUFJZ0ZxSVJRZ0JDQUJhMEVCYWlFUUEwQWdCQzBBQUNBQlFZelBnSUFBYWkwQUFFY053UUVnQVVFQlJnMnZBaUFCUVFGcUlRRWdCRUVCYWlJRUlBSkhEUUFMSUFBZ0ZEWUNBRUdLQVNFUUROa0NDd0pBSUFFaUJDQUNSdzBBUVlzQklSQU0yUUlMSUFJZ0JHc2dBQ2dDQUNJQmFpRVVJQVFnQVd0QkFtb2hFQUpBQTBBZ0JDMEFBQ0FCUVk3UGdJQUFhaTBBQUVjTndRRWdBVUVDUmcwQklBRkJBV29oQVNBRVFRRnFJZ1FnQWtjTkFBc2dBQ0FVTmdJQVFZc0JJUkFNMlFJTElBQkJBRFlDQUNBUVFRRnFJUUZCQWlFUURMNEJDd0pBSUFFaUJDQUNSdzBBUVl3QklSQU0yQUlMSUFJZ0JHc2dBQ2dDQUNJQmFpRVVJQVFnQVd0QkFXb2hFQUpBQTBBZ0JDMEFBQ0FCUWZEUGdJQUFhaTBBQUVjTndBRWdBVUVCUmcwQklBRkJBV29oQVNBRVFRRnFJZ1FnQWtjTkFBc2dBQ0FVTmdJQVFZd0JJUkFNMkFJTElBQkJBRFlDQUNBUVFRRnFJUUZCSHlFUURMMEJDd0pBSUFFaUJDQUNSdzBBUVkwQklSQU0xd0lMSUFJZ0JHc2dBQ2dDQUNJQmFpRVVJQVFnQVd0QkFXb2hFQUpBQTBBZ0JDMEFBQ0FCUWZMUGdJQUFhaTBBQUVjTnZ3RWdBVUVCUmcwQklBRkJBV29oQVNBRVFRRnFJZ1FnQWtjTkFBc2dBQ0FVTmdJQVFZMEJJUkFNMXdJTElBQkJBRFlDQUNBUVFRRnFJUUZCQ1NFUURMd0JDd0pBSUFFaUJDQUNSdzBBUVk0QklSQU0xZ0lMQWtBQ1FDQUVMUUFBUWJkL2FnNEhBTDhCdndHL0FiOEJ2d0VCdndFTElBUkJBV29oQVVINEFDRVFETDBDQ3lBRVFRRnFJUUZCK1FBaEVBeThBZ3NDUUNBQklnUWdBa2NOQUVHUEFTRVFETlVDQ3lBQ0lBUnJJQUFvQWdBaUFXb2hGQ0FFSUFGclFRVnFJUkFDUUFOQUlBUXRBQUFnQVVHUno0Q0FBR290QUFCSERiMEJJQUZCQlVZTkFTQUJRUUZxSVFFZ0JFRUJhaUlFSUFKSERRQUxJQUFnRkRZQ0FFR1BBU0VRRE5VQ0N5QUFRUUEyQWdBZ0VFRUJhaUVCUVJnaEVBeTZBUXNDUUNBQklnUWdBa2NOQUVHUUFTRVFETlFDQ3lBQ0lBUnJJQUFvQWdBaUFXb2hGQ0FFSUFGclFRSnFJUkFDUUFOQUlBUXRBQUFnQVVHWHo0Q0FBR290QUFCSERid0JJQUZCQWtZTkFTQUJRUUZxSVFFZ0JFRUJhaUlFSUFKSERRQUxJQUFnRkRZQ0FFR1FBU0VRRE5RQ0N5QUFRUUEyQWdBZ0VFRUJhaUVCUVJjaEVBeTVBUXNDUUNBQklnUWdBa2NOQUVHUkFTRVFETk1DQ3lBQ0lBUnJJQUFvQWdBaUFXb2hGQ0FFSUFGclFRWnFJUkFDUUFOQUlBUXRBQUFnQVVHYXo0Q0FBR290QUFCSERic0JJQUZCQmtZTkFTQUJRUUZxSVFFZ0JFRUJhaUlFSUFKSERRQUxJQUFnRkRZQ0FFR1JBU0VRRE5NQ0N5QUFRUUEyQWdBZ0VFRUJhaUVCUVJVaEVBeTRBUXNDUUNBQklnUWdBa2NOQUVHU0FTRVFETklDQ3lBQ0lBUnJJQUFvQWdBaUFXb2hGQ0FFSUFGclFRVnFJUkFDUUFOQUlBUXRBQUFnQVVHaHo0Q0FBR290QUFCSERib0JJQUZCQlVZTkFTQUJRUUZxSVFFZ0JFRUJhaUlFSUFKSERRQUxJQUFnRkRZQ0FFR1NBU0VRRE5JQ0N5QUFRUUEyQWdBZ0VFRUJhaUVCUVI0aEVBeTNBUXNDUUNBQklnUWdBa2NOQUVHVEFTRVFETkVDQ3lBRUxRQUFRY3dBUncyNEFTQUVRUUZxSVFGQkNpRVFETFlCQ3dKQUlBUWdBa2NOQUVHVUFTRVFETkFDQ3dKQUFrQWdCQzBBQUVHL2Yyb09Ed0M1QWJrQnVRRzVBYmtCdVFHNUFia0J1UUc1QWJrQnVRRzVBUUc1QVFzZ0JFRUJhaUVCUWY0QUlSQU10d0lMSUFSQkFXb2hBVUgvQUNFUURMWUNDd0pBSUFRZ0FrY05BRUdWQVNFUURNOENDd0pBQWtBZ0JDMEFBRUcvZjJvT0F3QzRBUUc0QVFzZ0JFRUJhaUVCUWYwQUlSQU10Z0lMSUFSQkFXb2hCRUdBQVNFUURMVUNDd0pBSUFRZ0FrY05BRUdXQVNFUURNNENDeUFDSUFScklBQW9BZ0FpQVdvaEZDQUVJQUZyUVFGcUlSQUNRQU5BSUFRdEFBQWdBVUduejRDQUFHb3RBQUJIRGJZQklBRkJBVVlOQVNBQlFRRnFJUUVnQkVFQmFpSUVJQUpIRFFBTElBQWdGRFlDQUVHV0FTRVFETTRDQ3lBQVFRQTJBZ0FnRUVFQmFpRUJRUXNoRUF5ekFRc0NRQ0FFSUFKSERRQkJsd0VoRUF6TkFnc0NRQUpBQWtBQ1FDQUVMUUFBUVZOcURpTUF1QUc0QWJnQnVBRzRBYmdCdUFHNEFiZ0J1QUc0QWJnQnVBRzRBYmdCdUFHNEFiZ0J1QUc0QWJnQnVBRzRBUUc0QWJnQnVBRzRBYmdCQXJnQnVBRzRBUU80QVFzZ0JFRUJhaUVCUWZzQUlSQU10Z0lMSUFSQkFXb2hBVUg4QUNFUURMVUNDeUFFUVFGcUlRUkJnUUVoRUF5MEFnc2dCRUVCYWlFRVFZSUJJUkFNc3dJTEFrQWdCQ0FDUncwQVFaZ0JJUkFNekFJTElBSWdCR3NnQUNnQ0FDSUJhaUVVSUFRZ0FXdEJCR29oRUFKQUEwQWdCQzBBQUNBQlFhblBnSUFBYWkwQUFFY050QUVnQVVFRVJnMEJJQUZCQVdvaEFTQUVRUUZxSWdRZ0FrY05BQXNnQUNBVU5nSUFRWmdCSVJBTXpBSUxJQUJCQURZQ0FDQVFRUUZxSVFGQkdTRVFETEVCQ3dKQUlBUWdBa2NOQUVHWkFTRVFETXNDQ3lBQ0lBUnJJQUFvQWdBaUFXb2hGQ0FFSUFGclFRVnFJUkFDUUFOQUlBUXRBQUFnQVVHdXo0Q0FBR290QUFCSERiTUJJQUZCQlVZTkFTQUJRUUZxSVFFZ0JFRUJhaUlFSUFKSERRQUxJQUFnRkRZQ0FFR1pBU0VRRE1zQ0N5QUFRUUEyQWdBZ0VFRUJhaUVCUVFZaEVBeXdBUXNDUUNBRUlBSkhEUUJCbWdFaEVBektBZ3NnQWlBRWF5QUFLQUlBSWdGcUlSUWdCQ0FCYTBFQmFpRVFBa0FEUUNBRUxRQUFJQUZCdE0rQWdBQnFMUUFBUncyeUFTQUJRUUZHRFFFZ0FVRUJhaUVCSUFSQkFXb2lCQ0FDUncwQUN5QUFJQlEyQWdCQm1nRWhFQXpLQWdzZ0FFRUFOZ0lBSUJCQkFXb2hBVUVjSVJBTXJ3RUxBa0FnQkNBQ1J3MEFRWnNCSVJBTXlRSUxJQUlnQkdzZ0FDZ0NBQ0lCYWlFVUlBUWdBV3RCQVdvaEVBSkFBMEFnQkMwQUFDQUJRYmJQZ0lBQWFpMEFBRWNOc1FFZ0FVRUJSZzBCSUFGQkFXb2hBU0FFUVFGcUlnUWdBa2NOQUFzZ0FDQVVOZ0lBUVpzQklSQU15UUlMSUFCQkFEWUNBQ0FRUVFGcUlRRkJKeUVRREs0QkN3SkFJQVFnQWtjTkFFR2NBU0VRRE1nQ0N3SkFBa0FnQkMwQUFFR3NmMm9PQWdBQnNRRUxJQVJCQVdvaEJFR0dBU0VRREs4Q0N5QUVRUUZxSVFSQmh3RWhFQXl1QWdzQ1FDQUVJQUpIRFFCQm5RRWhFQXpIQWdzZ0FpQUVheUFBS0FJQUlnRnFJUlFnQkNBQmEwRUJhaUVRQWtBRFFDQUVMUUFBSUFGQnVNK0FnQUJxTFFBQVJ3MnZBU0FCUVFGR0RRRWdBVUVCYWlFQklBUkJBV29pQkNBQ1J3MEFDeUFBSUJRMkFnQkJuUUVoRUF6SEFnc2dBRUVBTmdJQUlCQkJBV29oQVVFbUlSQU1yQUVMQWtBZ0JDQUNSdzBBUVo0QklSQU14Z0lMSUFJZ0JHc2dBQ2dDQUNJQmFpRVVJQVFnQVd0QkFXb2hFQUpBQTBBZ0JDMEFBQ0FCUWJyUGdJQUFhaTBBQUVjTnJnRWdBVUVCUmcwQklBRkJBV29oQVNBRVFRRnFJZ1FnQWtjTkFBc2dBQ0FVTmdJQVFaNEJJUkFNeGdJTElBQkJBRFlDQUNBUVFRRnFJUUZCQXlFUURLc0JDd0pBSUFRZ0FrY05BRUdmQVNFUURNVUNDeUFDSUFScklBQW9BZ0FpQVdvaEZDQUVJQUZyUVFKcUlSQUNRQU5BSUFRdEFBQWdBVUh0ejRDQUFHb3RBQUJIRGEwQklBRkJBa1lOQVNBQlFRRnFJUUVnQkVFQmFpSUVJQUpIRFFBTElBQWdGRFlDQUVHZkFTRVFETVVDQ3lBQVFRQTJBZ0FnRUVFQmFpRUJRUXdoRUF5cUFRc0NRQ0FFSUFKSERRQkJvQUVoRUF6RUFnc2dBaUFFYXlBQUtBSUFJZ0ZxSVJRZ0JDQUJhMEVEYWlFUUFrQURRQ0FFTFFBQUlBRkJ2TStBZ0FCcUxRQUFSdzJzQVNBQlFRTkdEUUVnQVVFQmFpRUJJQVJCQVdvaUJDQUNSdzBBQ3lBQUlCUTJBZ0JCb0FFaEVBekVBZ3NnQUVFQU5nSUFJQkJCQVdvaEFVRU5JUkFNcVFFTEFrQWdCQ0FDUncwQVFhRUJJUkFNd3dJTEFrQUNRQ0FFTFFBQVFicC9hZzRMQUt3QnJBR3NBYXdCckFHc0Fhd0JyQUdzQVFHc0FRc2dCRUVCYWlFRVFZc0JJUkFNcWdJTElBUkJBV29oQkVHTUFTRVFES2tDQ3dKQUlBUWdBa2NOQUVHaUFTRVFETUlDQ3lBRUxRQUFRZEFBUncycEFTQUVRUUZxSVFRTTZRRUxBa0FnQkNBQ1J3MEFRYU1CSVJBTXdRSUxBa0FDUUNBRUxRQUFRYmQvYWc0SEFhb0JxZ0dxQWFvQnFnRUFxZ0VMSUFSQkFXb2hCRUdPQVNFUURLZ0NDeUFFUVFGcUlRRkJJaUVRREtZQkN3SkFJQVFnQWtjTkFFR2tBU0VRRE1BQ0N5QUNJQVJySUFBb0FnQWlBV29oRkNBRUlBRnJRUUZxSVJBQ1FBTkFJQVF0QUFBZ0FVSEF6NENBQUdvdEFBQkhEYWdCSUFGQkFVWU5BU0FCUVFGcUlRRWdCRUVCYWlJRUlBSkhEUUFMSUFBZ0ZEWUNBRUdrQVNFUURNQUNDeUFBUVFBMkFnQWdFRUVCYWlFQlFSMGhFQXlsQVFzQ1FDQUVJQUpIRFFCQnBRRWhFQXkvQWdzQ1FBSkFJQVF0QUFCQnJuOXFEZ01BcUFFQnFBRUxJQVJCQVdvaEJFR1FBU0VRREtZQ0N5QUVRUUZxSVFGQkJDRVFES1FCQ3dKQUlBUWdBa2NOQUVHbUFTRVFETDRDQ3dKQUFrQUNRQUpBQWtBZ0JDMEFBRUcvZjJvT0ZRQ3FBYW9CcWdHcUFhb0JxZ0dxQWFvQnFnR3FBUUdxQWFvQkFxb0JxZ0VEcWdHcUFRU3FBUXNnQkVFQmFpRUVRWWdCSVJBTXFBSUxJQVJCQVdvaEJFR0pBU0VRREtjQ0N5QUVRUUZxSVFSQmlnRWhFQXltQWdzZ0JFRUJhaUVFUVk4QklSQU1wUUlMSUFSQkFXb2hCRUdSQVNFUURLUUNDd0pBSUFRZ0FrY05BRUduQVNFUURMMENDeUFDSUFScklBQW9BZ0FpQVdvaEZDQUVJQUZyUVFKcUlSQUNRQU5BSUFRdEFBQWdBVUh0ejRDQUFHb3RBQUJIRGFVQklBRkJBa1lOQVNBQlFRRnFJUUVnQkVFQmFpSUVJQUpIRFFBTElBQWdGRFlDQUVHbkFTRVFETDBDQ3lBQVFRQTJBZ0FnRUVFQmFpRUJRUkVoRUF5aUFRc0NRQ0FFSUFKSERRQkJxQUVoRUF5OEFnc2dBaUFFYXlBQUtBSUFJZ0ZxSVJRZ0JDQUJhMEVDYWlFUUFrQURRQ0FFTFFBQUlBRkJ3cytBZ0FCcUxRQUFSdzJrQVNBQlFRSkdEUUVnQVVFQmFpRUJJQVJCQVdvaUJDQUNSdzBBQ3lBQUlCUTJBZ0JCcUFFaEVBeThBZ3NnQUVFQU5nSUFJQkJCQVdvaEFVRXNJUkFNb1FFTEFrQWdCQ0FDUncwQVFha0JJUkFNdXdJTElBSWdCR3NnQUNnQ0FDSUJhaUVVSUFRZ0FXdEJCR29oRUFKQUEwQWdCQzBBQUNBQlFjWFBnSUFBYWkwQUFFY05vd0VnQVVFRVJnMEJJQUZCQVdvaEFTQUVRUUZxSWdRZ0FrY05BQXNnQUNBVU5nSUFRYWtCSVJBTXV3SUxJQUJCQURZQ0FDQVFRUUZxSVFGQkt5RVFES0FCQ3dKQUlBUWdBa2NOQUVHcUFTRVFETG9DQ3lBQ0lBUnJJQUFvQWdBaUFXb2hGQ0FFSUFGclFRSnFJUkFDUUFOQUlBUXRBQUFnQVVIS3o0Q0FBR290QUFCSERhSUJJQUZCQWtZTkFTQUJRUUZxSVFFZ0JFRUJhaUlFSUFKSERRQUxJQUFnRkRZQ0FFR3FBU0VRRExvQ0N5QUFRUUEyQWdBZ0VFRUJhaUVCUVJRaEVBeWZBUXNDUUNBRUlBSkhEUUJCcXdFaEVBeTVBZ3NDUUFKQUFrQUNRQ0FFTFFBQVFiNS9hZzRQQUFFQ3BBR2tBYVFCcEFHa0FhUUJwQUdrQWFRQnBBR2tBUU9rQVFzZ0JFRUJhaUVFUVpNQklSQU1vZ0lMSUFSQkFXb2hCRUdVQVNFUURLRUNDeUFFUVFGcUlRUkJsUUVoRUF5Z0Fnc2dCRUVCYWlFRVFaWUJJUkFNbndJTEFrQWdCQ0FDUncwQVFhd0JJUkFNdUFJTElBUXRBQUJCeFFCSERaOEJJQVJCQVdvaEJBemdBUXNDUUNBRUlBSkhEUUJCclFFaEVBeTNBZ3NnQWlBRWF5QUFLQUlBSWdGcUlSUWdCQ0FCYTBFQ2FpRVFBa0FEUUNBRUxRQUFJQUZCemMrQWdBQnFMUUFBUncyZkFTQUJRUUpHRFFFZ0FVRUJhaUVCSUFSQkFXb2lCQ0FDUncwQUN5QUFJQlEyQWdCQnJRRWhFQXkzQWdzZ0FFRUFOZ0lBSUJCQkFXb2hBVUVPSVJBTW5BRUxBa0FnQkNBQ1J3MEFRYTRCSVJBTXRnSUxJQVF0QUFCQjBBQkhEWjBCSUFSQkFXb2hBVUVsSVJBTW13RUxBa0FnQkNBQ1J3MEFRYThCSVJBTXRRSUxJQUlnQkdzZ0FDZ0NBQ0lCYWlFVUlBUWdBV3RCQ0dvaEVBSkFBMEFnQkMwQUFDQUJRZERQZ0lBQWFpMEFBRWNOblFFZ0FVRUlSZzBCSUFGQkFXb2hBU0FFUVFGcUlnUWdBa2NOQUFzZ0FDQVVOZ0lBUWE4QklSQU10UUlMSUFCQkFEWUNBQ0FRUVFGcUlRRkJLaUVRREpvQkN3SkFJQVFnQWtjTkFFR3dBU0VRRExRQ0N3SkFBa0FnQkMwQUFFR3JmMm9PQ3dDZEFaMEJuUUdkQVowQm5RR2RBWjBCblFFQm5RRUxJQVJCQVdvaEJFR2FBU0VRREpzQ0N5QUVRUUZxSVFSQm13RWhFQXlhQWdzQ1FDQUVJQUpIRFFCQnNRRWhFQXl6QWdzQ1FBSkFJQVF0QUFCQnYzOXFEaFFBbkFHY0Fad0JuQUdjQVp3Qm5BR2NBWndCbkFHY0Fad0JuQUdjQVp3Qm5BR2NBWndCQVp3QkN5QUVRUUZxSVFSQm1RRWhFQXlhQWdzZ0JFRUJhaUVFUVp3QklSQU1tUUlMQWtBZ0JDQUNSdzBBUWJJQklSQU1zZ0lMSUFJZ0JHc2dBQ2dDQUNJQmFpRVVJQVFnQVd0QkEyb2hFQUpBQTBBZ0JDMEFBQ0FCUWRuUGdJQUFhaTBBQUVjTm1nRWdBVUVEUmcwQklBRkJBV29oQVNBRVFRRnFJZ1FnQWtjTkFBc2dBQ0FVTmdJQVFiSUJJUkFNc2dJTElBQkJBRFlDQUNBUVFRRnFJUUZCSVNFUURKY0JDd0pBSUFRZ0FrY05BRUd6QVNFUURMRUNDeUFDSUFScklBQW9BZ0FpQVdvaEZDQUVJQUZyUVFacUlSQUNRQU5BSUFRdEFBQWdBVUhkejRDQUFHb3RBQUJIRFprQklBRkJCa1lOQVNBQlFRRnFJUUVnQkVFQmFpSUVJQUpIRFFBTElBQWdGRFlDQUVHekFTRVFETEVDQ3lBQVFRQTJBZ0FnRUVFQmFpRUJRUm9oRUF5V0FRc0NRQ0FFSUFKSERRQkJ0QUVoRUF5d0Fnc0NRQUpBQWtBZ0JDMEFBRUc3ZjJvT0VRQ2FBWm9CbWdHYUFab0JtZ0dhQVpvQm1nRUJtZ0dhQVpvQm1nR2FBUUthQVFzZ0JFRUJhaUVFUVowQklSQU1tQUlMSUFSQkFXb2hCRUdlQVNFUURKY0NDeUFFUVFGcUlRUkJud0VoRUF5V0Fnc0NRQ0FFSUFKSERRQkJ0UUVoRUF5dkFnc2dBaUFFYXlBQUtBSUFJZ0ZxSVJRZ0JDQUJhMEVGYWlFUUFrQURRQ0FFTFFBQUlBRkI1TStBZ0FCcUxRQUFSdzJYQVNBQlFRVkdEUUVnQVVFQmFpRUJJQVJCQVdvaUJDQUNSdzBBQ3lBQUlCUTJBZ0JCdFFFaEVBeXZBZ3NnQUVFQU5nSUFJQkJCQVdvaEFVRW9JUkFNbEFFTEFrQWdCQ0FDUncwQVFiWUJJUkFNcmdJTElBSWdCR3NnQUNnQ0FDSUJhaUVVSUFRZ0FXdEJBbW9oRUFKQUEwQWdCQzBBQUNBQlFlclBnSUFBYWkwQUFFY05sZ0VnQVVFQ1JnMEJJQUZCQVdvaEFTQUVRUUZxSWdRZ0FrY05BQXNnQUNBVU5nSUFRYllCSVJBTXJnSUxJQUJCQURZQ0FDQVFRUUZxSVFGQkJ5RVFESk1CQ3dKQUlBUWdBa2NOQUVHM0FTRVFESzBDQ3dKQUFrQWdCQzBBQUVHN2Yyb09EZ0NXQVpZQmxnR1dBWllCbGdHV0FaWUJsZ0dXQVpZQmxnRUJsZ0VMSUFSQkFXb2hCRUdoQVNFUURKUUNDeUFFUVFGcUlRUkJvZ0VoRUF5VEFnc0NRQ0FFSUFKSERRQkJ1QUVoRUF5c0Fnc2dBaUFFYXlBQUtBSUFJZ0ZxSVJRZ0JDQUJhMEVDYWlFUUFrQURRQ0FFTFFBQUlBRkI3YytBZ0FCcUxRQUFSdzJVQVNBQlFRSkdEUUVnQVVFQmFpRUJJQVJCQVdvaUJDQUNSdzBBQ3lBQUlCUTJBZ0JCdUFFaEVBeXNBZ3NnQUVFQU5nSUFJQkJCQVdvaEFVRVNJUkFNa1FFTEFrQWdCQ0FDUncwQVFia0JJUkFNcXdJTElBSWdCR3NnQUNnQ0FDSUJhaUVVSUFRZ0FXdEJBV29oRUFKQUEwQWdCQzBBQUNBQlFmRFBnSUFBYWkwQUFFY05rd0VnQVVFQlJnMEJJQUZCQVdvaEFTQUVRUUZxSWdRZ0FrY05BQXNnQUNBVU5nSUFRYmtCSVJBTXF3SUxJQUJCQURZQ0FDQVFRUUZxSVFGQklDRVFESkFCQ3dKQUlBUWdBa2NOQUVHNkFTRVFES29DQ3lBQ0lBUnJJQUFvQWdBaUFXb2hGQ0FFSUFGclFRRnFJUkFDUUFOQUlBUXRBQUFnQVVIeXo0Q0FBR290QUFCSERaSUJJQUZCQVVZTkFTQUJRUUZxSVFFZ0JFRUJhaUlFSUFKSERRQUxJQUFnRkRZQ0FFRzZBU0VRREtvQ0N5QUFRUUEyQWdBZ0VFRUJhaUVCUVE4aEVBeVBBUXNDUUNBRUlBSkhEUUJCdXdFaEVBeXBBZ3NDUUFKQUlBUXRBQUJCdDM5cURnY0FrZ0dTQVpJQmtnR1NBUUdTQVFzZ0JFRUJhaUVFUWFVQklSQU1rQUlMSUFSQkFXb2hCRUdtQVNFUURJOENDd0pBSUFRZ0FrY05BRUc4QVNFUURLZ0NDeUFDSUFScklBQW9BZ0FpQVdvaEZDQUVJQUZyUVFkcUlSQUNRQU5BSUFRdEFBQWdBVUgwejRDQUFHb3RBQUJIRFpBQklBRkJCMFlOQVNBQlFRRnFJUUVnQkVFQmFpSUVJQUpIRFFBTElBQWdGRFlDQUVHOEFTRVFES2dDQ3lBQVFRQTJBZ0FnRUVFQmFpRUJRUnNoRUF5TkFRc0NRQ0FFSUFKSERRQkJ2UUVoRUF5bkFnc0NRQUpBQWtBZ0JDMEFBRUcrZjJvT0VnQ1JBWkVCa1FHUkFaRUJrUUdSQVpFQmtRRUJrUUdSQVpFQmtRR1JBWkVCQXBFQkN5QUVRUUZxSVFSQnBBRWhFQXlQQWdzZ0JFRUJhaUVFUWFjQklSQU1qZ0lMSUFSQkFXb2hCRUdvQVNFUURJMENDd0pBSUFRZ0FrY05BRUcrQVNFUURLWUNDeUFFTFFBQVFjNEFSdzJOQVNBRVFRRnFJUVFNendFTEFrQWdCQ0FDUncwQVFiOEJJUkFNcFFJTEFrQUNRQUpBQWtBQ1FBSkFBa0FDUUFKQUFrQUNRQUpBQWtBQ1FBSkFBa0FnQkMwQUFFRy9mMm9PRlFBQkFnT2NBUVFGQnB3Qm5BR2NBUWNJQ1FvTG5BRU1EUTRQbkFFTElBUkJBV29oQVVIb0FDRVFESm9DQ3lBRVFRRnFJUUZCNlFBaEVBeVpBZ3NnQkVFQmFpRUJRZTRBSVJBTW1BSUxJQVJCQVdvaEFVSHlBQ0VRREpjQ0N5QUVRUUZxSVFGQjh3QWhFQXlXQWdzZ0JFRUJhaUVCUWZZQUlSQU1sUUlMSUFSQkFXb2hBVUgzQUNFUURKUUNDeUFFUVFGcUlRRkIrZ0FoRUF5VEFnc2dCRUVCYWlFRVFZTUJJUkFNa2dJTElBUkJBV29oQkVHRUFTRVFESkVDQ3lBRVFRRnFJUVJCaFFFaEVBeVFBZ3NnQkVFQmFpRUVRWklCSVJBTWp3SUxJQVJCQVdvaEJFR1lBU0VRREk0Q0N5QUVRUUZxSVFSQm9BRWhFQXlOQWdzZ0JFRUJhaUVFUWFNQklSQU1qQUlMSUFSQkFXb2hCRUdxQVNFUURJc0NDd0pBSUFRZ0FrWU5BQ0FBUVpDQWdJQUFOZ0lJSUFBZ0JEWUNCRUdyQVNFUURJc0NDMEhBQVNFUURLTUNDeUFBSUFVZ0FoQ3FnSUNBQUNJQkRZc0JJQVVoQVF4Y0N3SkFJQVlnQWtZTkFDQUdRUUZxSVFVTWpRRUxRY0lCSVJBTW9RSUxBMEFDUUNBUUxRQUFRWFpxRGdTTUFRQUFqd0VBQ3lBUVFRRnFJaEFnQWtjTkFBdEJ3d0VoRUF5Z0Fnc0NRQ0FISUFKR0RRQWdBRUdSZ0lDQUFEWUNDQ0FBSUFjMkFnUWdCeUVCUVFFaEVBeUhBZ3RCeEFFaEVBeWZBZ3NDUUNBSElBSkhEUUJCeFFFaEVBeWZBZ3NDUUFKQUlBY3RBQUJCZG1vT0JBSE9BYzRCQU00QkN5QUhRUUZxSVFZTWpRRUxJQWRCQVdvaEJReUpBUXNDUUNBSElBSkhEUUJCeGdFaEVBeWVBZ3NDUUFKQUlBY3RBQUJCZG1vT0Z3R1BBWThCQVk4Qmp3R1BBWThCandHUEFZOEJqd0dQQVk4Qmp3R1BBWThCandHUEFZOEJqd0dQQVFDUEFRc2dCMEVCYWlFSEMwR3dBU0VRRElRQ0N3SkFJQWdnQWtjTkFFSElBU0VRREowQ0N5QUlMUUFBUVNCSERZMEJJQUJCQURzQk1pQUlRUUZxSVFGQnN3RWhFQXlEQWdzZ0FTRVhBa0FEUUNBWElnY2dBa1lOQVNBSExRQUFRVkJxUWY4QmNTSVFRUXBQRGN3QkFrQWdBQzhCTWlJVVFaa3pTdzBBSUFBZ0ZFRUtiQ0lVT3dFeUlCQkIvLzhEY3lBVVFmNy9BM0ZKRFFBZ0IwRUJhaUVYSUFBZ0ZDQVFhaUlRT3dFeUlCQkIvLzhEY1VIb0Iwa05BUXNMUVFBaEVDQUFRUUEyQWh3Z0FFSEJpWUNBQURZQ0VDQUFRUTAyQWd3Z0FDQUhRUUZxTmdJVURKd0NDMEhIQVNFUURKc0NDeUFBSUFnZ0FoQ3VnSUNBQUNJUVJRM0tBU0FRUVJWSERZd0JJQUJCeUFFMkFod2dBQ0FJTmdJVUlBQkJ5WmVBZ0FBMkFoQWdBRUVWTmdJTVFRQWhFQXlhQWdzQ1FDQUpJQUpIRFFCQnpBRWhFQXlhQWd0QkFDRVVRUUVoRjBFQklSWkJBQ0VRQWtBQ1FBSkFBa0FDUUFKQUFrQUNRQUpBSUFrdEFBQkJVR29PQ3BZQmxRRUFBUUlEQkFVR0NKY0JDMEVDSVJBTUJndEJBeUVRREFVTFFRUWhFQXdFQzBFRklSQU1Bd3RCQmlFUURBSUxRUWNoRUF3QkMwRUlJUkFMUVFBaEYwRUFJUlpCQUNFVURJNEJDMEVKSVJCQkFTRVVRUUFoRjBFQUlSWU1qUUVMQWtBZ0NpQUNSdzBBUWM0QklSQU1tUUlMSUFvdEFBQkJMa2NOamdFZ0NrRUJhaUVKRE1vQkN5QUxJQUpIRFk0QlFkQUJJUkFNbHdJTEFrQWdDeUFDUmcwQUlBQkJqb0NBZ0FBMkFnZ2dBQ0FMTmdJRVFiY0JJUkFNL2dFTFFkRUJJUkFNbGdJTEFrQWdCQ0FDUncwQVFkSUJJUkFNbGdJTElBSWdCR3NnQUNnQ0FDSVFhaUVVSUFRZ0VHdEJCR29oQ3dOQUlBUXRBQUFnRUVIOHo0Q0FBR290QUFCSERZNEJJQkJCQkVZTjZRRWdFRUVCYWlFUUlBUkJBV29pQkNBQ1J3MEFDeUFBSUJRMkFnQkIwZ0VoRUF5VkFnc2dBQ0FNSUFJUXJJQ0FnQUFpQVEyTkFTQU1JUUVNdUFFTEFrQWdCQ0FDUncwQVFkUUJJUkFNbEFJTElBSWdCR3NnQUNnQ0FDSVFhaUVVSUFRZ0VHdEJBV29oREFOQUlBUXRBQUFnRUVHQjBJQ0FBR290QUFCSERZOEJJQkJCQVVZTmpnRWdFRUVCYWlFUUlBUkJBV29pQkNBQ1J3MEFDeUFBSUJRMkFnQkIxQUVoRUF5VEFnc0NRQ0FFSUFKSERRQkIxZ0VoRUF5VEFnc2dBaUFFYXlBQUtBSUFJaEJxSVJRZ0JDQVFhMEVDYWlFTEEwQWdCQzBBQUNBUVFZUFFnSUFBYWkwQUFFY05qZ0VnRUVFQ1JnMlFBU0FRUVFGcUlSQWdCRUVCYWlJRUlBSkhEUUFMSUFBZ0ZEWUNBRUhXQVNFUURKSUNDd0pBSUFRZ0FrY05BRUhYQVNFUURKSUNDd0pBQWtBZ0JDMEFBRUc3ZjJvT0VBQ1BBWThCandHUEFZOEJqd0dQQVk4Qmp3R1BBWThCandHUEFZOEJBWThCQ3lBRVFRRnFJUVJCdXdFaEVBejVBUXNnQkVFQmFpRUVRYndCSVJBTStBRUxBa0FnQkNBQ1J3MEFRZGdCSVJBTWtRSUxJQVF0QUFCQnlBQkhEWXdCSUFSQkFXb2hCQXpFQVFzQ1FDQUVJQUpHRFFBZ0FFR1FnSUNBQURZQ0NDQUFJQVEyQWdSQnZnRWhFQXozQVF0QjJRRWhFQXlQQWdzQ1FDQUVJQUpIRFFCQjJnRWhFQXlQQWdzZ0JDMEFBRUhJQUVZTnd3RWdBRUVCT2dBb0RMa0JDeUFBUVFJNkFDOGdBQ0FFSUFJUXBvQ0FnQUFpRUEyTkFVSENBU0VRRFBRQkN5QUFMUUFvUVg5cURnSzNBYmtCdUFFTEEwQUNRQ0FFTFFBQVFYWnFEZ1FBamdHT0FRQ09BUXNnQkVFQmFpSUVJQUpIRFFBTFFkMEJJUkFNaXdJTElBQkJBRG9BTHlBQUxRQXRRUVJ4UlEyRUFnc2dBRUVBT2dBdklBQkJBVG9BTkNBQklRRU1qQUVMSUJCQkZVWU4yZ0VnQUVFQU5nSWNJQUFnQVRZQ0ZDQUFRYWVPZ0lBQU5nSVFJQUJCRWpZQ0RFRUFJUkFNaUFJTEFrQWdBQ0FRSUFJUXRJQ0FnQUFpQkEwQUlCQWhBUXlCQWdzQ1FDQUVRUlZIRFFBZ0FFRUROZ0ljSUFBZ0VEWUNGQ0FBUWJDWWdJQUFOZ0lRSUFCQkZUWUNERUVBSVJBTWlBSUxJQUJCQURZQ0hDQUFJQkEyQWhRZ0FFR25qb0NBQURZQ0VDQUFRUkkyQWd4QkFDRVFESWNDQ3lBUVFSVkdEZFlCSUFCQkFEWUNIQ0FBSUFFMkFoUWdBRUhhallDQUFEWUNFQ0FBUVJRMkFneEJBQ0VRRElZQ0N5QUFLQUlFSVJjZ0FFRUFOZ0lFSUJBZ0VhZHFJaFloQVNBQUlCY2dFQ0FXSUJRYkloQVF0WUNBZ0FBaUZFVU5qUUVnQUVFSE5nSWNJQUFnRURZQ0ZDQUFJQlEyQWd4QkFDRVFESVVDQ3lBQUlBQXZBVEJCZ0FGeU93RXdJQUVoQVF0QktpRVFET29CQ3lBUVFSVkdEZEVCSUFCQkFEWUNIQ0FBSUFFMkFoUWdBRUdEaklDQUFEWUNFQ0FBUVJNMkFneEJBQ0VRRElJQ0N5QVFRUlZHRGM4QklBQkJBRFlDSENBQUlBRTJBaFFnQUVHYWo0Q0FBRFlDRUNBQVFTSTJBZ3hCQUNFUURJRUNDeUFBS0FJRUlSQWdBRUVBTmdJRUFrQWdBQ0FRSUFFUXQ0Q0FnQUFpRUEwQUlBRkJBV29oQVF5TkFRc2dBRUVNTmdJY0lBQWdFRFlDRENBQUlBRkJBV28yQWhSQkFDRVFESUFDQ3lBUVFSVkdEY3dCSUFCQkFEWUNIQ0FBSUFFMkFoUWdBRUdhajRDQUFEWUNFQ0FBUVNJMkFneEJBQ0VRRFA4QkN5QUFLQUlFSVJBZ0FFRUFOZ0lFQWtBZ0FDQVFJQUVRdDRDQWdBQWlFQTBBSUFGQkFXb2hBUXlNQVFzZ0FFRU5OZ0ljSUFBZ0VEWUNEQ0FBSUFGQkFXbzJBaFJCQUNFUURQNEJDeUFRUVJWR0Rja0JJQUJCQURZQ0hDQUFJQUUyQWhRZ0FFSEdqSUNBQURZQ0VDQUFRU00yQWd4QkFDRVFEUDBCQ3lBQUtBSUVJUkFnQUVFQU5nSUVBa0FnQUNBUUlBRVF1WUNBZ0FBaUVBMEFJQUZCQVdvaEFReUxBUXNnQUVFT05nSWNJQUFnRURZQ0RDQUFJQUZCQVdvMkFoUkJBQ0VRRFB3QkN5QUFRUUEyQWh3Z0FDQUJOZ0lVSUFCQndKV0FnQUEyQWhBZ0FFRUNOZ0lNUVFBaEVBejdBUXNnRUVFVlJnM0ZBU0FBUVFBMkFod2dBQ0FCTmdJVUlBQkJ4b3lBZ0FBMkFoQWdBRUVqTmdJTVFRQWhFQXo2QVFzZ0FFRVFOZ0ljSUFBZ0FUWUNGQ0FBSUJBMkFneEJBQ0VRRFBrQkN5QUFLQUlFSVFRZ0FFRUFOZ0lFQWtBZ0FDQUVJQUVRdVlDQWdBQWlCQTBBSUFGQkFXb2hBUXp4QVFzZ0FFRVJOZ0ljSUFBZ0JEWUNEQ0FBSUFGQkFXbzJBaFJCQUNFUURQZ0JDeUFRUVJWR0RjRUJJQUJCQURZQ0hDQUFJQUUyQWhRZ0FFSEdqSUNBQURZQ0VDQUFRU00yQWd4QkFDRVFEUGNCQ3lBQUtBSUVJUkFnQUVFQU5nSUVBa0FnQUNBUUlBRVF1WUNBZ0FBaUVBMEFJQUZCQVdvaEFReUlBUXNnQUVFVE5nSWNJQUFnRURZQ0RDQUFJQUZCQVdvMkFoUkJBQ0VRRFBZQkN5QUFLQUlFSVFRZ0FFRUFOZ0lFQWtBZ0FDQUVJQUVRdVlDQWdBQWlCQTBBSUFGQkFXb2hBUXp0QVFzZ0FFRVVOZ0ljSUFBZ0JEWUNEQ0FBSUFGQkFXbzJBaFJCQUNFUURQVUJDeUFRUVJWR0RiMEJJQUJCQURZQ0hDQUFJQUUyQWhRZ0FFR2FqNENBQURZQ0VDQUFRU0kyQWd4QkFDRVFEUFFCQ3lBQUtBSUVJUkFnQUVFQU5nSUVBa0FnQUNBUUlBRVF0NENBZ0FBaUVBMEFJQUZCQVdvaEFReUdBUXNnQUVFV05nSWNJQUFnRURZQ0RDQUFJQUZCQVdvMkFoUkJBQ0VRRFBNQkN5QUFLQUlFSVFRZ0FFRUFOZ0lFQWtBZ0FDQUVJQUVRdDRDQWdBQWlCQTBBSUFGQkFXb2hBUXpwQVFzZ0FFRVhOZ0ljSUFBZ0JEWUNEQ0FBSUFGQkFXbzJBaFJCQUNFUURQSUJDeUFBUVFBMkFod2dBQ0FCTmdJVUlBQkJ6Wk9BZ0FBMkFoQWdBRUVNTmdJTVFRQWhFQXp4QVF0Q0FTRVJDeUFRUVFGcUlRRUNRQ0FBS1FNZ0loSkMvLy8vLy8vLy8vOFBWZzBBSUFBZ0VrSUVoaUFSaERjRElDQUJJUUVNaEFFTElBQkJBRFlDSENBQUlBRTJBaFFnQUVHdGlZQ0FBRFlDRUNBQVFRdzJBZ3hCQUNFUURPOEJDeUFBUVFBMkFod2dBQ0FRTmdJVUlBQkJ6Wk9BZ0FBMkFoQWdBRUVNTmdJTVFRQWhFQXp1QVFzZ0FDZ0NCQ0VYSUFCQkFEWUNCQ0FRSUJHbmFpSVdJUUVnQUNBWElCQWdGaUFVR3lJUUVMV0FnSUFBSWhSRkRYTWdBRUVGTmdJY0lBQWdFRFlDRkNBQUlCUTJBZ3hCQUNFUURPMEJDeUFBUVFBMkFod2dBQ0FRTmdJVUlBQkJxcHlBZ0FBMkFoQWdBRUVQTmdJTVFRQWhFQXpzQVFzZ0FDQVFJQUlRdElDQWdBQWlBUTBCSUJBaEFRdEJEaUVRRE5FQkN3SkFJQUZCRlVjTkFDQUFRUUkyQWh3Z0FDQVFOZ0lVSUFCQnNKaUFnQUEyQWhBZ0FFRVZOZ0lNUVFBaEVBenFBUXNnQUVFQU5nSWNJQUFnRURZQ0ZDQUFRYWVPZ0lBQU5nSVFJQUJCRWpZQ0RFRUFJUkFNNlFFTElBRkJBV29oRUFKQUlBQXZBVEFpQVVHQUFYRkZEUUFDUUNBQUlCQWdBaEM3Z0lDQUFDSUJEUUFnRUNFQkRIQUxJQUZCRlVjTnVnRWdBRUVGTmdJY0lBQWdFRFlDRkNBQVFmbVhnSUFBTmdJUUlBQkJGVFlDREVFQUlSQU02UUVMQWtBZ0FVR2dCSEZCb0FSSERRQWdBQzBBTFVFQ2NRMEFJQUJCQURZQ0hDQUFJQkEyQWhRZ0FFR1drNENBQURZQ0VDQUFRUVEyQWd4QkFDRVFET2tCQ3lBQUlCQWdBaEM5Z0lDQUFCb2dFQ0VCQWtBQ1FBSkFBa0FDUUNBQUlCQWdBaEN6Z0lDQUFBNFdBZ0VBQkFRRUJBUUVCQVFFQkFRRUJBUUVCQVFFQXdRTElBQkJBVG9BTGdzZ0FDQUFMd0V3UWNBQWNqc0JNQ0FRSVFFTFFTWWhFQXpSQVFzZ0FFRWpOZ0ljSUFBZ0VEWUNGQ0FBUWFXV2dJQUFOZ0lRSUFCQkZUWUNERUVBSVJBTTZRRUxJQUJCQURZQ0hDQUFJQkEyQWhRZ0FFSFZpNENBQURZQ0VDQUFRUkUyQWd4QkFDRVFET2dCQ3lBQUxRQXRRUUZ4UlEwQlFjTUJJUkFNemdFTEFrQWdEU0FDUmcwQUEwQUNRQ0FOTFFBQVFTQkdEUUFnRFNFQkRNUUJDeUFOUVFGcUlnMGdBa2NOQUF0QkpTRVFET2NCQzBFbElSQU01Z0VMSUFBb0FnUWhCQ0FBUVFBMkFnUWdBQ0FFSUEwUXI0Q0FnQUFpQkVVTnJRRWdBRUVtTmdJY0lBQWdCRFlDRENBQUlBMUJBV28yQWhSQkFDRVFET1VCQ3lBUVFSVkdEYXNCSUFCQkFEWUNIQ0FBSUFFMkFoUWdBRUg5allDQUFEWUNFQ0FBUVIwMkFneEJBQ0VRRE9RQkN5QUFRU2MyQWh3Z0FDQUJOZ0lVSUFBZ0VEWUNERUVBSVJBTTR3RUxJQkFoQVVFQklSUUNRQUpBQWtBQ1FBSkFBa0FDUUNBQUxRQXNRWDVxRGdjR0JRVURBUUlBQlFzZ0FDQUFMd0V3UVFoeU93RXdEQU1MUVFJaEZBd0JDMEVFSVJRTElBQkJBVG9BTENBQUlBQXZBVEFnRkhJN0FUQUxJQkFoQVF0Qkt5RVFETW9CQ3lBQVFRQTJBaHdnQUNBUU5nSVVJQUJCcTVLQWdBQTJBaEFnQUVFTE5nSU1RUUFoRUF6aUFRc2dBRUVBTmdJY0lBQWdBVFlDRkNBQVFlR1BnSUFBTmdJUUlBQkJDallDREVFQUlSQU00UUVMSUFCQkFEb0FMQ0FRSVFFTXZRRUxJQkFoQVVFQklSUUNRQUpBQWtBQ1FBSkFJQUF0QUN4QmUyb09CQU1CQWdBRkN5QUFJQUF2QVRCQkNISTdBVEFNQXd0QkFpRVVEQUVMUVFRaEZBc2dBRUVCT2dBc0lBQWdBQzhCTUNBVWNqc0JNQXNnRUNFQkMwRXBJUkFNeFFFTElBQkJBRFlDSENBQUlBRTJBaFFnQUVId2xJQ0FBRFlDRUNBQVFRTTJBZ3hCQUNFUUROMEJDd0pBSUE0dEFBQkJEVWNOQUNBQUtBSUVJUUVnQUVFQU5nSUVBa0FnQUNBQklBNFFzWUNBZ0FBaUFRMEFJQTVCQVdvaEFReDFDeUFBUVN3MkFod2dBQ0FCTmdJTUlBQWdEa0VCYWpZQ0ZFRUFJUkFNM1FFTElBQXRBQzFCQVhGRkRRRkJ4QUVoRUF6REFRc0NRQ0FPSUFKSERRQkJMU0VRRE53QkN3SkFBa0FEUUFKQUlBNHRBQUJCZG1vT0JBSUFBQU1BQ3lBT1FRRnFJZzRnQWtjTkFBdEJMU0VRRE4wQkN5QUFLQUlFSVFFZ0FFRUFOZ0lFQWtBZ0FDQUJJQTRRc1lDQWdBQWlBUTBBSUE0aEFReDBDeUFBUVN3MkFod2dBQ0FPTmdJVUlBQWdBVFlDREVFQUlSQU0zQUVMSUFBb0FnUWhBU0FBUVFBMkFnUUNRQ0FBSUFFZ0RoQ3hnSUNBQUNJQkRRQWdEa0VCYWlFQkRITUxJQUJCTERZQ0hDQUFJQUUyQWd3Z0FDQU9RUUZxTmdJVVFRQWhFQXpiQVFzZ0FDZ0NCQ0VFSUFCQkFEWUNCQ0FBSUFRZ0RoQ3hnSUNBQUNJRURhQUJJQTRoQVF6T0FRc2dFRUVzUncwQklBRkJBV29oRUVFQklRRUNRQUpBQWtBQ1FBSkFJQUF0QUN4QmUyb09CQU1CQWdRQUN5QVFJUUVNQkF0QkFpRUJEQUVMUVFRaEFRc2dBRUVCT2dBc0lBQWdBQzhCTUNBQmNqc0JNQ0FRSVFFTUFRc2dBQ0FBTHdFd1FRaHlPd0V3SUJBaEFRdEJPU0VRREw4QkN5QUFRUUE2QUN3Z0FTRUJDMEUwSVJBTXZRRUxJQUFnQUM4Qk1FRWdjanNCTUNBQklRRU1BZ3NnQUNnQ0JDRUVJQUJCQURZQ0JBSkFJQUFnQkNBQkVMR0FnSUFBSWdRTkFDQUJJUUVNeHdFTElBQkJOellDSENBQUlBRTJBaFFnQUNBRU5nSU1RUUFoRUF6VUFRc2dBRUVJT2dBc0lBRWhBUXRCTUNFUURMa0JDd0pBSUFBdEFDaEJBVVlOQUNBQklRRU1CQXNnQUMwQUxVRUljVVVOa3dFZ0FTRUJEQU1MSUFBdEFEQkJJSEVObEFGQnhRRWhFQXkzQVFzQ1FDQVBJQUpHRFFBQ1FBTkFBa0FnRHkwQUFFRlFhaUlCUWY4QmNVRUtTUTBBSUE4aEFVRTFJUkFNdWdFTElBQXBBeUFpRVVLWnMrYk1tYlBtekJsV0RRRWdBQ0FSUWdwK0loRTNBeUFnRVNBQnJVTC9BWU1pRWtKL2hWWU5BU0FBSUJFZ0VudzNBeUFnRDBFQmFpSVBJQUpIRFFBTFFUa2hFQXpSQVFzZ0FDZ0NCQ0VDSUFCQkFEWUNCQ0FBSUFJZ0QwRUJhaUlFRUxHQWdJQUFJZ0lObFFFZ0JDRUJETU1CQzBFNUlSQU16d0VMQWtBZ0FDOEJNQ0lCUVFoeFJRMEFJQUF0QUNoQkFVY05BQ0FBTFFBdFFRaHhSUTJRQVFzZ0FDQUJRZmY3QTNGQmdBUnlPd0V3SUE4aEFRdEJOeUVRRExRQkN5QUFJQUF2QVRCQkVISTdBVEFNcXdFTElCQkJGVVlOaXdFZ0FFRUFOZ0ljSUFBZ0FUWUNGQ0FBUWZDT2dJQUFOZ0lRSUFCQkhEWUNERUVBSVJBTXl3RUxJQUJCd3dBMkFod2dBQ0FCTmdJTUlBQWdEVUVCYWpZQ0ZFRUFJUkFNeWdFTEFrQWdBUzBBQUVFNlJ3MEFJQUFvQWdRaEVDQUFRUUEyQWdRQ1FDQUFJQkFnQVJDdmdJQ0FBQ0lRRFFBZ0FVRUJhaUVCREdNTElBQkJ3d0EyQWh3Z0FDQVFOZ0lNSUFBZ0FVRUJhallDRkVFQUlSQU15Z0VMSUFCQkFEWUNIQ0FBSUFFMkFoUWdBRUd4a1lDQUFEWUNFQ0FBUVFvMkFneEJBQ0VRRE1rQkN5QUFRUUEyQWh3Z0FDQUJOZ0lVSUFCQm9KbUFnQUEyQWhBZ0FFRWVOZ0lNUVFBaEVBeklBUXNnQUVFQU5nSUFDeUFBUVlBU093RXFJQUFnRjBFQmFpSUJJQUlRcUlDQWdBQWlFQTBCSUFFaEFRdEJ4d0FoRUF5c0FRc2dFRUVWUncyREFTQUFRZEVBTmdJY0lBQWdBVFlDRkNBQVFlT1hnSUFBTmdJUUlBQkJGVFlDREVFQUlSQU14QUVMSUFBb0FnUWhFQ0FBUVFBMkFnUUNRQ0FBSUJBZ0FSQ25nSUNBQUNJUURRQWdBU0VCREY0TElBQkIwZ0EyQWh3Z0FDQUJOZ0lVSUFBZ0VEWUNERUVBSVJBTXd3RUxJQUJCQURZQ0hDQUFJQlEyQWhRZ0FFSEJxSUNBQURZQ0VDQUFRUWMyQWd3Z0FFRUFOZ0lBUVFBaEVBekNBUXNnQUNnQ0JDRVFJQUJCQURZQ0JBSkFJQUFnRUNBQkVLZUFnSUFBSWhBTkFDQUJJUUVNWFFzZ0FFSFRBRFlDSENBQUlBRTJBaFFnQUNBUU5nSU1RUUFoRUF6QkFRdEJBQ0VRSUFCQkFEWUNIQ0FBSUFFMkFoUWdBRUdBa1lDQUFEWUNFQ0FBUVFrMkFnd013QUVMSUJCQkZVWU5mU0FBUVFBMkFod2dBQ0FCTmdJVUlBQkJsSTJBZ0FBMkFoQWdBRUVoTmdJTVFRQWhFQXkvQVF0QkFTRVdRUUFoRjBFQUlSUkJBU0VRQ3lBQUlCQTZBQ3NnQVVFQmFpRUJBa0FDUUNBQUxRQXRRUkJ4RFFBQ1FBSkFBa0FnQUMwQUtnNERBUUFDQkFzZ0ZrVU5Bd3dDQ3lBVURRRU1BZ3NnRjBVTkFRc2dBQ2dDQkNFUUlBQkJBRFlDQkFKQUlBQWdFQ0FCRUsyQWdJQUFJaEFOQUNBQklRRU1YQXNnQUVIWUFEWUNIQ0FBSUFFMkFoUWdBQ0FRTmdJTVFRQWhFQXkrQVFzZ0FDZ0NCQ0VFSUFCQkFEWUNCQUpBSUFBZ0JDQUJFSzJBZ0lBQUlnUU5BQ0FCSVFFTXJRRUxJQUJCMlFBMkFod2dBQ0FCTmdJVUlBQWdCRFlDREVFQUlSQU12UUVMSUFBb0FnUWhCQ0FBUVFBMkFnUUNRQ0FBSUFRZ0FSQ3RnSUNBQUNJRURRQWdBU0VCREtzQkN5QUFRZG9BTmdJY0lBQWdBVFlDRkNBQUlBUTJBZ3hCQUNFUURMd0JDeUFBS0FJRUlRUWdBRUVBTmdJRUFrQWdBQ0FFSUFFUXJZQ0FnQUFpQkEwQUlBRWhBUXlwQVFzZ0FFSGNBRFlDSENBQUlBRTJBaFFnQUNBRU5nSU1RUUFoRUF5N0FRc0NRQ0FCTFFBQVFWQnFJaEJCL3dGeFFRcFBEUUFnQUNBUU9nQXFJQUZCQVdvaEFVSFBBQ0VRREtJQkN5QUFLQUlFSVFRZ0FFRUFOZ0lFQWtBZ0FDQUVJQUVRcllDQWdBQWlCQTBBSUFFaEFReW5BUXNnQUVIZUFEWUNIQ0FBSUFFMkFoUWdBQ0FFTmdJTVFRQWhFQXk2QVFzZ0FFRUFOZ0lBSUJkQkFXb2hBUUpBSUFBdEFDbEJJMDhOQUNBQklRRU1XUXNnQUVFQU5nSWNJQUFnQVRZQ0ZDQUFRZE9KZ0lBQU5nSVFJQUJCQ0RZQ0RFRUFJUkFNdVFFTElBQkJBRFlDQUF0QkFDRVFJQUJCQURZQ0hDQUFJQUUyQWhRZ0FFR1FzNENBQURZQ0VDQUFRUWcyQWd3TXR3RUxJQUJCQURZQ0FDQVhRUUZxSVFFQ1FDQUFMUUFwUVNGSERRQWdBU0VCREZZTElBQkJBRFlDSENBQUlBRTJBaFFnQUVHYmlvQ0FBRFlDRUNBQVFRZzJBZ3hCQUNFUURMWUJDeUFBUVFBMkFnQWdGMEVCYWlFQkFrQWdBQzBBS1NJUVFWMXFRUXRQRFFBZ0FTRUJERlVMQWtBZ0VFRUdTdzBBUVFFZ0VIUkJ5Z0J4UlEwQUlBRWhBUXhWQzBFQUlSQWdBRUVBTmdJY0lBQWdBVFlDRkNBQVFmZUpnSUFBTmdJUUlBQkJDRFlDREF5MUFRc2dFRUVWUmcxeElBQkJBRFlDSENBQUlBRTJBaFFnQUVHNWpZQ0FBRFlDRUNBQVFSbzJBZ3hCQUNFUURMUUJDeUFBS0FJRUlSQWdBRUVBTmdJRUFrQWdBQ0FRSUFFUXA0Q0FnQUFpRUEwQUlBRWhBUXhVQ3lBQVFlVUFOZ0ljSUFBZ0FUWUNGQ0FBSUJBMkFneEJBQ0VRRExNQkN5QUFLQUlFSVJBZ0FFRUFOZ0lFQWtBZ0FDQVFJQUVRcDRDQWdBQWlFQTBBSUFFaEFReE5DeUFBUWRJQU5nSWNJQUFnQVRZQ0ZDQUFJQkEyQWd4QkFDRVFETElCQ3lBQUtBSUVJUkFnQUVFQU5nSUVBa0FnQUNBUUlBRVFwNENBZ0FBaUVBMEFJQUVoQVF4TkN5QUFRZE1BTmdJY0lBQWdBVFlDRkNBQUlCQTJBZ3hCQUNFUURMRUJDeUFBS0FJRUlSQWdBRUVBTmdJRUFrQWdBQ0FRSUFFUXA0Q0FnQUFpRUEwQUlBRWhBUXhSQ3lBQVFlVUFOZ0ljSUFBZ0FUWUNGQ0FBSUJBMkFneEJBQ0VRRExBQkN5QUFRUUEyQWh3Z0FDQUJOZ0lVSUFCQnhvcUFnQUEyQWhBZ0FFRUhOZ0lNUVFBaEVBeXZBUXNnQUNnQ0JDRVFJQUJCQURZQ0JBSkFJQUFnRUNBQkVLZUFnSUFBSWhBTkFDQUJJUUVNU1FzZ0FFSFNBRFlDSENBQUlBRTJBaFFnQUNBUU5nSU1RUUFoRUF5dUFRc2dBQ2dDQkNFUUlBQkJBRFlDQkFKQUlBQWdFQ0FCRUtlQWdJQUFJaEFOQUNBQklRRU1TUXNnQUVIVEFEWUNIQ0FBSUFFMkFoUWdBQ0FRTmdJTVFRQWhFQXl0QVFzZ0FDZ0NCQ0VRSUFCQkFEWUNCQUpBSUFBZ0VDQUJFS2VBZ0lBQUloQU5BQ0FCSVFFTVRRc2dBRUhsQURZQ0hDQUFJQUUyQWhRZ0FDQVFOZ0lNUVFBaEVBeXNBUXNnQUVFQU5nSWNJQUFnQVRZQ0ZDQUFRZHlJZ0lBQU5nSVFJQUJCQnpZQ0RFRUFJUkFNcXdFTElCQkJQMGNOQVNBQlFRRnFJUUVMUVFVaEVBeVFBUXRCQUNFUUlBQkJBRFlDSENBQUlBRTJBaFFnQUVIOWtvQ0FBRFlDRUNBQVFRYzJBZ3dNcUFFTElBQW9BZ1FoRUNBQVFRQTJBZ1FDUUNBQUlCQWdBUkNuZ0lDQUFDSVFEUUFnQVNFQkRFSUxJQUJCMGdBMkFod2dBQ0FCTmdJVUlBQWdFRFlDREVFQUlSQU1wd0VMSUFBb0FnUWhFQ0FBUVFBMkFnUUNRQ0FBSUJBZ0FSQ25nSUNBQUNJUURRQWdBU0VCREVJTElBQkIwd0EyQWh3Z0FDQUJOZ0lVSUFBZ0VEWUNERUVBSVJBTXBnRUxJQUFvQWdRaEVDQUFRUUEyQWdRQ1FDQUFJQkFnQVJDbmdJQ0FBQ0lRRFFBZ0FTRUJERVlMSUFCQjVRQTJBaHdnQUNBQk5nSVVJQUFnRURZQ0RFRUFJUkFNcFFFTElBQW9BZ1FoQVNBQVFRQTJBZ1FDUUNBQUlBRWdGQkNuZ0lDQUFDSUJEUUFnRkNFQkREOExJQUJCMGdBMkFod2dBQ0FVTmdJVUlBQWdBVFlDREVFQUlSQU1wQUVMSUFBb0FnUWhBU0FBUVFBMkFnUUNRQ0FBSUFFZ0ZCQ25nSUNBQUNJQkRRQWdGQ0VCREQ4TElBQkIwd0EyQWh3Z0FDQVVOZ0lVSUFBZ0FUWUNERUVBSVJBTW93RUxJQUFvQWdRaEFTQUFRUUEyQWdRQ1FDQUFJQUVnRkJDbmdJQ0FBQ0lCRFFBZ0ZDRUJERU1MSUFCQjVRQTJBaHdnQUNBVU5nSVVJQUFnQVRZQ0RFRUFJUkFNb2dFTElBQkJBRFlDSENBQUlCUTJBaFFnQUVIRGo0Q0FBRFlDRUNBQVFRYzJBZ3hCQUNFUURLRUJDeUFBUVFBMkFod2dBQ0FCTmdJVUlBQkJ3NCtBZ0FBMkFoQWdBRUVITmdJTVFRQWhFQXlnQVF0QkFDRVFJQUJCQURZQ0hDQUFJQlEyQWhRZ0FFR01uSUNBQURZQ0VDQUFRUWMyQWd3TW53RUxJQUJCQURZQ0hDQUFJQlEyQWhRZ0FFR01uSUNBQURZQ0VDQUFRUWMyQWd4QkFDRVFESjRCQ3lBQVFRQTJBaHdnQUNBVU5nSVVJQUJCL3BHQWdBQTJBaEFnQUVFSE5nSU1RUUFoRUF5ZEFRc2dBRUVBTmdJY0lBQWdBVFlDRkNBQVFZNmJnSUFBTmdJUUlBQkJCallDREVFQUlSQU1uQUVMSUJCQkZVWU5WeUFBUVFBMkFod2dBQ0FCTmdJVUlBQkJ6STZBZ0FBMkFoQWdBRUVnTmdJTVFRQWhFQXliQVFzZ0FFRUFOZ0lBSUJCQkFXb2hBVUVrSVJBTElBQWdFRG9BS1NBQUtBSUVJUkFnQUVFQU5nSUVJQUFnRUNBQkVLdUFnSUFBSWhBTlZDQUJJUUVNUGdzZ0FFRUFOZ0lBQzBFQUlSQWdBRUVBTmdJY0lBQWdCRFlDRkNBQVFmR2JnSUFBTmdJUUlBQkJCallDREF5WEFRc2dBVUVWUmcxUUlBQkJBRFlDSENBQUlBVTJBaFFnQUVId2pJQ0FBRFlDRUNBQVFSczJBZ3hCQUNFUURKWUJDeUFBS0FJRUlRVWdBRUVBTmdJRUlBQWdCU0FRRUttQWdJQUFJZ1VOQVNBUVFRRnFJUVVMUWEwQklSQU1ld3NnQUVIQkFUWUNIQ0FBSUFVMkFnd2dBQ0FRUVFGcU5nSVVRUUFoRUF5VEFRc2dBQ2dDQkNFR0lBQkJBRFlDQkNBQUlBWWdFQkNwZ0lDQUFDSUdEUUVnRUVFQmFpRUdDMEd1QVNFUURIZ0xJQUJCd2dFMkFod2dBQ0FHTmdJTUlBQWdFRUVCYWpZQ0ZFRUFJUkFNa0FFTElBQkJBRFlDSENBQUlBYzJBaFFnQUVHWGk0Q0FBRFlDRUNBQVFRMDJBZ3hCQUNFUURJOEJDeUFBUVFBMkFod2dBQ0FJTmdJVUlBQkI0NUNBZ0FBMkFoQWdBRUVKTmdJTVFRQWhFQXlPQVFzZ0FFRUFOZ0ljSUFBZ0NEWUNGQ0FBUVpTTmdJQUFOZ0lRSUFCQklUWUNERUVBSVJBTWpRRUxRUUVoRmtFQUlSZEJBQ0VVUVFFaEVBc2dBQ0FRT2dBcklBbEJBV29oQ0FKQUFrQWdBQzBBTFVFUWNRMEFBa0FDUUFKQUlBQXRBQ29PQXdFQUFnUUxJQlpGRFFNTUFnc2dGQTBCREFJTElCZEZEUUVMSUFBb0FnUWhFQ0FBUVFBMkFnUWdBQ0FRSUFnUXJZQ0FnQUFpRUVVTlBTQUFRY2tCTmdJY0lBQWdDRFlDRkNBQUlCQTJBZ3hCQUNFUURJd0JDeUFBS0FJRUlRUWdBRUVBTmdJRUlBQWdCQ0FJRUsyQWdJQUFJZ1JGRFhZZ0FFSEtBVFlDSENBQUlBZzJBaFFnQUNBRU5nSU1RUUFoRUF5TEFRc2dBQ2dDQkNFRUlBQkJBRFlDQkNBQUlBUWdDUkN0Z0lDQUFDSUVSUTEwSUFCQnl3RTJBaHdnQUNBSk5nSVVJQUFnQkRZQ0RFRUFJUkFNaWdFTElBQW9BZ1FoQkNBQVFRQTJBZ1FnQUNBRUlBb1FyWUNBZ0FBaUJFVU5jaUFBUWMwQk5nSWNJQUFnQ2pZQ0ZDQUFJQVEyQWd4QkFDRVFESWtCQ3dKQUlBc3RBQUJCVUdvaUVFSC9BWEZCQ2s4TkFDQUFJQkE2QUNvZ0MwRUJhaUVLUWJZQklSQU1jQXNnQUNnQ0JDRUVJQUJCQURZQ0JDQUFJQVFnQ3hDdGdJQ0FBQ0lFUlExd0lBQkJ6d0UyQWh3Z0FDQUxOZ0lVSUFBZ0JEWUNERUVBSVJBTWlBRUxJQUJCQURZQ0hDQUFJQVEyQWhRZ0FFR1FzNENBQURZQ0VDQUFRUWcyQWd3Z0FFRUFOZ0lBUVFBaEVBeUhBUXNnQVVFVlJnMC9JQUJCQURZQ0hDQUFJQXcyQWhRZ0FFSE1qb0NBQURZQ0VDQUFRU0EyQWd4QkFDRVFESVlCQ3lBQVFZRUVPd0VvSUFBb0FnUWhFQ0FBUWdBM0F3QWdBQ0FRSUF4QkFXb2lEQkNyZ0lDQUFDSVFSUTA0SUFCQjB3RTJBaHdnQUNBTU5nSVVJQUFnRURZQ0RFRUFJUkFNaFFFTElBQkJBRFlDQUF0QkFDRVFJQUJCQURZQ0hDQUFJQVEyQWhRZ0FFSFltNENBQURZQ0VDQUFRUWcyQWd3TWd3RUxJQUFvQWdRaEVDQUFRZ0EzQXdBZ0FDQVFJQXRCQVdvaUN4Q3JnSUNBQUNJUURRRkJ4Z0VoRUF4cEN5QUFRUUk2QUNnTVZRc2dBRUhWQVRZQ0hDQUFJQXMyQWhRZ0FDQVFOZ0lNUVFBaEVBeUFBUXNnRUVFVlJnMDNJQUJCQURZQ0hDQUFJQVEyQWhRZ0FFR2tqSUNBQURZQ0VDQUFRUkEyQWd4QkFDRVFESDhMSUFBdEFEUkJBVWNOTkNBQUlBUWdBaEM4Z0lDQUFDSVFSUTAwSUJCQkZVY05OU0FBUWR3Qk5nSWNJQUFnQkRZQ0ZDQUFRZFdXZ0lBQU5nSVFJQUJCRlRZQ0RFRUFJUkFNZmd0QkFDRVFJQUJCQURZQ0hDQUFRYStMZ0lBQU5nSVFJQUJCQWpZQ0RDQUFJQlJCQVdvMkFoUU1mUXRCQUNFUURHTUxRUUloRUF4aUMwRU5JUkFNWVF0QkR5RVFER0FMUVNVaEVBeGZDMEVUSVJBTVhndEJGU0VRREYwTFFSWWhFQXhjQzBFWElSQU1Xd3RCR0NFUURGb0xRUmtoRUF4WkMwRWFJUkFNV0F0Qkd5RVFERmNMUVJ3aEVBeFdDMEVkSVJBTVZRdEJIeUVRREZRTFFTRWhFQXhUQzBFaklSQU1VZ3RCeGdBaEVBeFJDMEV1SVJBTVVBdEJMeUVRREU4TFFUc2hFQXhPQzBFOUlSQU1UUXRCeUFBaEVBeE1DMEhKQUNFUURFc0xRY3NBSVJBTVNndEJ6QUFoRUF4SkMwSE9BQ0VRREVnTFFkRUFJUkFNUnd0QjFRQWhFQXhHQzBIWUFDRVFERVVMUWRrQUlSQU1SQXRCMndBaEVBeERDMEhrQUNFUURFSUxRZVVBSVJBTVFRdEI4UUFoRUF4QUMwSDBBQ0VRREQ4TFFZMEJJUkFNUGd0Qmx3RWhFQXc5QzBHcEFTRVFERHdMUWF3QklSQU1Pd3RCd0FFaEVBdzZDMEc1QVNFUUREa0xRYThCSVJBTU9BdEJzUUVoRUF3M0MwR3lBU0VRRERZTFFiUUJJUkFNTlF0QnRRRWhFQXcwQzBHNkFTRVFERE1MUWIwQklSQU1NZ3RCdndFaEVBd3hDMEhCQVNFUUREQUxJQUJCQURZQ0hDQUFJQVEyQWhRZ0FFSHBpNENBQURZQ0VDQUFRUjgyQWd4QkFDRVFERWdMSUFCQjJ3RTJBaHdnQUNBRU5nSVVJQUJCK3BhQWdBQTJBaEFnQUVFVk5nSU1RUUFoRUF4SEN5QUFRZmdBTmdJY0lBQWdERFlDRkNBQVFjcVlnSUFBTmdJUUlBQkJGVFlDREVFQUlSQU1SZ3NnQUVIUkFEWUNIQ0FBSUFVMkFoUWdBRUd3bDRDQUFEWUNFQ0FBUVJVMkFneEJBQ0VRREVVTElBQkIrUUEyQWh3Z0FDQUJOZ0lVSUFBZ0VEWUNERUVBSVJBTVJBc2dBRUg0QURZQ0hDQUFJQUUyQWhRZ0FFSEttSUNBQURZQ0VDQUFRUlUyQWd4QkFDRVFERU1MSUFCQjVBQTJBaHdnQUNBQk5nSVVJQUJCNDVlQWdBQTJBaEFnQUVFVk5nSU1RUUFoRUF4Q0N5QUFRZGNBTmdJY0lBQWdBVFlDRkNBQVFjbVhnSUFBTmdJUUlBQkJGVFlDREVFQUlSQU1RUXNnQUVFQU5nSWNJQUFnQVRZQ0ZDQUFRYm1OZ0lBQU5nSVFJQUJCR2pZQ0RFRUFJUkFNUUFzZ0FFSENBRFlDSENBQUlBRTJBaFFnQUVIam1JQ0FBRFlDRUNBQVFSVTJBZ3hCQUNFUUREOExJQUJCQURZQ0JDQUFJQThnRHhDeGdJQ0FBQ0lFUlEwQklBQkJPallDSENBQUlBUTJBZ3dnQUNBUFFRRnFOZ0lVUVFBaEVBdytDeUFBS0FJRUlRUWdBRUVBTmdJRUFrQWdBQ0FFSUFFUXNZQ0FnQUFpQkVVTkFDQUFRVHMyQWh3Z0FDQUVOZ0lNSUFBZ0FVRUJhallDRkVFQUlSQU1QZ3NnQVVFQmFpRUJEQzBMSUE5QkFXb2hBUXd0Q3lBQVFRQTJBaHdnQUNBUE5nSVVJQUJCNUpLQWdBQTJBaEFnQUVFRU5nSU1RUUFoRUF3N0N5QUFRVFkyQWh3Z0FDQUVOZ0lVSUFBZ0FqWUNERUVBSVJBTU9nc2dBRUV1TmdJY0lBQWdEallDRkNBQUlBUTJBZ3hCQUNFUUREa0xJQUJCMEFBMkFod2dBQ0FCTmdJVUlBQkJrWmlBZ0FBMkFoQWdBRUVWTmdJTVFRQWhFQXc0Q3lBTlFRRnFJUUVNTEFzZ0FFRVZOZ0ljSUFBZ0FUWUNGQ0FBUVlLWmdJQUFOZ0lRSUFCQkZUWUNERUVBSVJBTU5nc2dBRUViTmdJY0lBQWdBVFlDRkNBQVFaR1hnSUFBTmdJUUlBQkJGVFlDREVFQUlSQU1OUXNnQUVFUE5nSWNJQUFnQVRZQ0ZDQUFRWkdYZ0lBQU5nSVFJQUJCRlRZQ0RFRUFJUkFNTkFzZ0FFRUxOZ0ljSUFBZ0FUWUNGQ0FBUVpHWGdJQUFOZ0lRSUFCQkZUWUNERUVBSVJBTU13c2dBRUVhTmdJY0lBQWdBVFlDRkNBQVFZS1pnSUFBTmdJUUlBQkJGVFlDREVFQUlSQU1NZ3NnQUVFTE5nSWNJQUFnQVRZQ0ZDQUFRWUtaZ0lBQU5nSVFJQUJCRlRZQ0RFRUFJUkFNTVFzZ0FFRUtOZ0ljSUFBZ0FUWUNGQ0FBUWVTV2dJQUFOZ0lRSUFCQkZUWUNERUVBSVJBTU1Bc2dBRUVlTmdJY0lBQWdBVFlDRkNBQVFmbVhnSUFBTmdJUUlBQkJGVFlDREVFQUlSQU1Md3NnQUVFQU5nSWNJQUFnRURZQ0ZDQUFRZHFOZ0lBQU5nSVFJQUJCRkRZQ0RFRUFJUkFNTGdzZ0FFRUVOZ0ljSUFBZ0FUWUNGQ0FBUWJDWWdJQUFOZ0lRSUFCQkZUWUNERUVBSVJBTUxRc2dBRUVBTmdJQUlBdEJBV29oQ3d0QnVBRWhFQXdTQ3lBQVFRQTJBZ0FnRUVFQmFpRUJRZlVBSVJBTUVRc2dBU0VCQWtBZ0FDMEFLVUVGUncwQVFlTUFJUkFNRVF0QjRnQWhFQXdRQzBFQUlSQWdBRUVBTmdJY0lBQkI1SkdBZ0FBMkFoQWdBRUVITmdJTUlBQWdGRUVCYWpZQ0ZBd29DeUFBUVFBMkFnQWdGMEVCYWlFQlFjQUFJUkFNRGd0QkFTRUJDeUFBSUFFNkFDd2dBRUVBTmdJQUlCZEJBV29oQVF0QktDRVFEQXNMSUFFaEFRdEJPQ0VRREFrTEFrQWdBU0lQSUFKR0RRQURRQUpBSUE4dEFBQkJnTDZBZ0FCcUxRQUFJZ0ZCQVVZTkFDQUJRUUpIRFFNZ0QwRUJhaUVCREFRTElBOUJBV29pRHlBQ1J3MEFDMEUrSVJBTUlndEJQaUVRRENFTElBQkJBRG9BTENBUElRRU1BUXRCQ3lFUURBWUxRVG9oRUF3RkN5QUJRUUZxSVFGQkxTRVFEQVFMSUFBZ0FUb0FMQ0FBUVFBMkFnQWdGa0VCYWlFQlFRd2hFQXdEQ3lBQVFRQTJBZ0FnRjBFQmFpRUJRUW9oRUF3Q0N5QUFRUUEyQWdBTElBQkJBRG9BTENBTklRRkJDU0VRREFBTEMwRUFJUkFnQUVFQU5nSWNJQUFnQ3pZQ0ZDQUFRYzJRZ0lBQU5nSVFJQUJCQ1RZQ0RBd1hDMEVBSVJBZ0FFRUFOZ0ljSUFBZ0NqWUNGQ0FBUWVtS2dJQUFOZ0lRSUFCQkNUWUNEQXdXQzBFQUlSQWdBRUVBTmdJY0lBQWdDVFlDRkNBQVFiZVFnSUFBTmdJUUlBQkJDVFlDREF3VkMwRUFJUkFnQUVFQU5nSWNJQUFnQ0RZQ0ZDQUFRWnlSZ0lBQU5nSVFJQUJCQ1RZQ0RBd1VDMEVBSVJBZ0FFRUFOZ0ljSUFBZ0FUWUNGQ0FBUWMyUWdJQUFOZ0lRSUFCQkNUWUNEQXdUQzBFQUlSQWdBRUVBTmdJY0lBQWdBVFlDRkNBQVFlbUtnSUFBTmdJUUlBQkJDVFlDREF3U0MwRUFJUkFnQUVFQU5nSWNJQUFnQVRZQ0ZDQUFRYmVRZ0lBQU5nSVFJQUJCQ1RZQ0RBd1JDMEVBSVJBZ0FFRUFOZ0ljSUFBZ0FUWUNGQ0FBUVp5UmdJQUFOZ0lRSUFCQkNUWUNEQXdRQzBFQUlSQWdBRUVBTmdJY0lBQWdBVFlDRkNBQVFaZVZnSUFBTmdJUUlBQkJEellDREF3UEMwRUFJUkFnQUVFQU5nSWNJQUFnQVRZQ0ZDQUFRWmVWZ0lBQU5nSVFJQUJCRHpZQ0RBd09DMEVBSVJBZ0FFRUFOZ0ljSUFBZ0FUWUNGQ0FBUWNDU2dJQUFOZ0lRSUFCQkN6WUNEQXdOQzBFQUlSQWdBRUVBTmdJY0lBQWdBVFlDRkNBQVFaV0pnSUFBTmdJUUlBQkJDellDREF3TUMwRUFJUkFnQUVFQU5nSWNJQUFnQVRZQ0ZDQUFRZUdQZ0lBQU5nSVFJQUJCQ2pZQ0RBd0xDMEVBSVJBZ0FFRUFOZ0ljSUFBZ0FUWUNGQ0FBUWZ1UGdJQUFOZ0lRSUFCQkNqWUNEQXdLQzBFQUlSQWdBRUVBTmdJY0lBQWdBVFlDRkNBQVFmR1pnSUFBTmdJUUlBQkJBallDREF3SkMwRUFJUkFnQUVFQU5nSWNJQUFnQVRZQ0ZDQUFRY1NVZ0lBQU5nSVFJQUJCQWpZQ0RBd0lDMEVBSVJBZ0FFRUFOZ0ljSUFBZ0FUWUNGQ0FBUWZLVmdJQUFOZ0lRSUFCQkFqWUNEQXdIQ3lBQVFRSTJBaHdnQUNBQk5nSVVJQUJCbkpxQWdBQTJBaEFnQUVFV05nSU1RUUFoRUF3R0MwRUJJUkFNQlF0QjFBQWhFQ0FCSWdRZ0FrWU5CQ0FEUVFocUlBQWdCQ0FDUWRqQ2dJQUFRUW9ReFlDQWdBQWdBeWdDRENFRUlBTW9BZ2dPQXdFRUFnQUxFTXFBZ0lBQUFBc2dBRUVBTmdJY0lBQkJ0WnFBZ0FBMkFoQWdBRUVYTmdJTUlBQWdCRUVCYWpZQ0ZFRUFJUkFNQWdzZ0FFRUFOZ0ljSUFBZ0JEWUNGQ0FBUWNxYWdJQUFOZ0lRSUFCQkNUWUNERUVBSVJBTUFRc0NRQ0FCSWdRZ0FrY05BRUVpSVJBTUFRc2dBRUdKZ0lDQUFEWUNDQ0FBSUFRMkFnUkJJU0VRQ3lBRFFSQnFKSUNBZ0lBQUlCQUxyd0VCQW44Z0FTZ0NBQ0VHQWtBQ1FDQUNJQU5HRFFBZ0JDQUdhaUVFSUFZZ0Eyb2dBbXNoQnlBQ0lBWkJmM01nQldvaUJtb2hCUU5BQWtBZ0FpMEFBQ0FFTFFBQVJnMEFRUUloQkF3REN3SkFJQVlOQUVFQUlRUWdCU0VDREFNTElBWkJmMm9oQmlBRVFRRnFJUVFnQWtFQmFpSUNJQU5IRFFBTElBY2hCaUFESVFJTElBQkJBVFlDQUNBQklBWTJBZ0FnQUNBQ05nSUVEd3NnQVVFQU5nSUFJQUFnQkRZQ0FDQUFJQUkyQWdRTENnQWdBQkRIZ0lDQUFBdnlOZ0VMZnlPQWdJQ0FBRUVRYXlJQkpJQ0FnSUFBQWtCQkFDZ0NvTkNBZ0FBTkFFRUFFTXVBZ0lBQVFZRFVoSUFBYXlJQ1Fka0FTUTBBUVFBaEF3SkFRUUFvQXVEVGdJQUFJZ1FOQUVFQVFuODNBdXpUZ0lBQVFRQkNnSUNFZ0lDQXdBQTNBdVRUZ0lBQVFRQWdBVUVJYWtGd2NVSFlxdFdxQlhNaUJEWUM0Tk9BZ0FCQkFFRUFOZ0wwMDRDQUFFRUFRUUEyQXNUVGdJQUFDMEVBSUFJMkFzelRnSUFBUVFCQmdOU0VnQUEyQXNqVGdJQUFRUUJCZ05TRWdBQTJBcGpRZ0lBQVFRQWdCRFlDck5DQWdBQkJBRUYvTmdLbzBJQ0FBQU5BSUFOQnhOQ0FnQUJxSUFOQnVOQ0FnQUJxSWdRMkFnQWdCQ0FEUWJEUWdJQUFhaUlGTmdJQUlBTkJ2TkNBZ0FCcUlBVTJBZ0FnQTBITTBJQ0FBR29nQTBIQTBJQ0FBR29pQlRZQ0FDQUZJQVEyQWdBZ0EwSFUwSUNBQUdvZ0EwSEkwSUNBQUdvaUJEWUNBQ0FFSUFVMkFnQWdBMEhRMElDQUFHb2dCRFlDQUNBRFFTQnFJZ05CZ0FKSERRQUxRWURVaElBQVFYaEJnTlNFZ0FCclFROXhRUUJCZ05TRWdBQkJDR3BCRDNFYklnTnFJZ1JCQkdvZ0FrRklhaUlGSUFOcklnTkJBWEkyQWdCQkFFRUFLQUx3MDRDQUFEWUNwTkNBZ0FCQkFDQUROZ0tVMElDQUFFRUFJQVEyQXFEUWdJQUFRWURVaElBQUlBVnFRVGcyQWdRTEFrQUNRQUpBQWtBQ1FBSkFBa0FDUUFKQUFrQUNRQUpBSUFCQjdBRkxEUUFDUUVFQUtBS0kwSUNBQUNJR1FSQWdBRUVUYWtGd2NTQUFRUXRKR3lJQ1FRTjJJZ1IySWdOQkEzRkZEUUFDUUFKQUlBTkJBWEVnQkhKQkFYTWlCVUVEZENJRVFiRFFnSUFBYWlJRElBUkJ1TkNBZ0FCcUtBSUFJZ1FvQWdnaUFrY05BRUVBSUFaQmZpQUZkM0UyQW9qUWdJQUFEQUVMSUFNZ0FqWUNDQ0FDSUFNMkFnd0xJQVJCQ0dvaEF5QUVJQVZCQTNRaUJVRURjallDQkNBRUlBVnFJZ1FnQkNnQ0JFRUJjallDQkF3TUN5QUNRUUFvQXBEUWdJQUFJZ2RORFFFQ1FDQURSUTBBQWtBQ1FDQURJQVIwUVFJZ0JIUWlBMEVBSUFOcmNuRWlBMEVBSUFOcmNVRi9haUlESUFOQkRIWkJFSEVpQTNZaUJFRUZka0VJY1NJRklBTnlJQVFnQlhZaUEwRUNka0VFY1NJRWNpQURJQVIySWdOQkFYWkJBbkVpQkhJZ0F5QUVkaUlEUVFGMlFRRnhJZ1J5SUFNZ0JIWnFJZ1JCQTNRaUEwR3cwSUNBQUdvaUJTQURRYmpRZ0lBQWFpZ0NBQ0lES0FJSUlnQkhEUUJCQUNBR1FYNGdCSGR4SWdZMkFvalFnSUFBREFFTElBVWdBRFlDQ0NBQUlBVTJBZ3dMSUFNZ0FrRURjallDQkNBRElBUkJBM1FpQkdvZ0JDQUNheUlGTmdJQUlBTWdBbW9pQUNBRlFRRnlOZ0lFQWtBZ0IwVU5BQ0FIUVhoeFFiRFFnSUFBYWlFQ1FRQW9BcHpRZ0lBQUlRUUNRQUpBSUFaQkFTQUhRUU4yZENJSWNRMEFRUUFnQmlBSWNqWUNpTkNBZ0FBZ0FpRUlEQUVMSUFJb0FnZ2hDQXNnQ0NBRU5nSU1JQUlnQkRZQ0NDQUVJQUkyQWd3Z0JDQUlOZ0lJQ3lBRFFRaHFJUU5CQUNBQU5nS2MwSUNBQUVFQUlBVTJBcERRZ0lBQURBd0xRUUFvQW96UWdJQUFJZ2xGRFFFZ0NVRUFJQWxyY1VGL2FpSURJQU5CREhaQkVIRWlBM1lpQkVFRmRrRUljU0lGSUFOeUlBUWdCWFlpQTBFQ2RrRUVjU0lFY2lBRElBUjJJZ05CQVhaQkFuRWlCSElnQXlBRWRpSURRUUYyUVFGeElnUnlJQU1nQkhacVFRSjBRYmpTZ0lBQWFpZ0NBQ0lBS0FJRVFYaHhJQUpySVFRZ0FDRUZBa0FEUUFKQUlBVW9BaEFpQXcwQUlBVkJGR29vQWdBaUEwVU5BZ3NnQXlnQ0JFRjRjU0FDYXlJRklBUWdCU0FFU1NJRkd5RUVJQU1nQUNBRkd5RUFJQU1oQlF3QUN3c2dBQ2dDR0NFS0FrQWdBQ2dDRENJSUlBQkdEUUFnQUNnQ0NDSURRUUFvQXBqUWdJQUFTUm9nQ0NBRE5nSUlJQU1nQ0RZQ0RBd0xDd0pBSUFCQkZHb2lCU2dDQUNJRERRQWdBQ2dDRUNJRFJRMERJQUJCRUdvaEJRc0RRQ0FGSVFzZ0F5SUlRUlJxSWdVb0FnQWlBdzBBSUFoQkVHb2hCU0FJS0FJUUlnTU5BQXNnQzBFQU5nSUFEQW9MUVg4aEFpQUFRYjkvU3cwQUlBQkJFMm9pQTBGd2NTRUNRUUFvQW96UWdJQUFJZ2RGRFFCQkFDRUxBa0FnQWtHQUFra05BRUVmSVFzZ0FrSC8vLzhIU3cwQUlBTkJDSFlpQXlBRFFZRCtQMnBCRUhaQkNIRWlBM1FpQkNBRVFZRGdIMnBCRUhaQkJIRWlCSFFpQlNBRlFZQ0FEMnBCRUhaQkFuRWlCWFJCRDNZZ0F5QUVjaUFGY21zaUEwRUJkQ0FDSUFOQkZXcDJRUUZ4Y2tFY2FpRUxDMEVBSUFKcklRUUNRQUpBQWtBQ1FDQUxRUUowUWJqU2dJQUFhaWdDQUNJRkRRQkJBQ0VEUVFBaENBd0JDMEVBSVFNZ0FrRUFRUmtnQzBFQmRtc2dDMEVmUmh0MElRQkJBQ0VJQTBBQ1FDQUZLQUlFUVhoeElBSnJJZ1lnQkU4TkFDQUdJUVFnQlNFSUlBWU5BRUVBSVFRZ0JTRUlJQVVoQXd3REN5QURJQVZCRkdvb0FnQWlCaUFHSUFVZ0FFRWRka0VFY1dwQkVHb29BZ0FpQlVZYklBTWdCaHNoQXlBQVFRRjBJUUFnQlEwQUN3c0NRQ0FESUFoeURRQkJBQ0VJUVFJZ0MzUWlBMEVBSUFOcmNpQUhjU0lEUlEwRElBTkJBQ0FEYTNGQmYyb2lBeUFEUVF4MlFSQnhJZ04ySWdWQkJYWkJDSEVpQUNBRGNpQUZJQUIySWdOQkFuWkJCSEVpQlhJZ0F5QUZkaUlEUVFGMlFRSnhJZ1Z5SUFNZ0JYWWlBMEVCZGtFQmNTSUZjaUFESUFWMmFrRUNkRUc0MG9DQUFHb29BZ0FoQXdzZ0EwVU5BUXNEUUNBREtBSUVRWGh4SUFKcklnWWdCRWtoQUFKQUlBTW9BaEFpQlEwQUlBTkJGR29vQWdBaEJRc2dCaUFFSUFBYklRUWdBeUFJSUFBYklRZ2dCU0VESUFVTkFBc0xJQWhGRFFBZ0JFRUFLQUtRMElDQUFDQUNhMDhOQUNBSUtBSVlJUXNDUUNBSUtBSU1JZ0FnQ0VZTkFDQUlLQUlJSWdOQkFDZ0NtTkNBZ0FCSkdpQUFJQU0yQWdnZ0F5QUFOZ0lNREFrTEFrQWdDRUVVYWlJRktBSUFJZ01OQUNBSUtBSVFJZ05GRFFNZ0NFRVFhaUVGQ3dOQUlBVWhCaUFESWdCQkZHb2lCU2dDQUNJRERRQWdBRUVRYWlFRklBQW9BaEFpQXcwQUN5QUdRUUEyQWdBTUNBc0NRRUVBS0FLUTBJQ0FBQ0lESUFKSkRRQkJBQ2dDbk5DQWdBQWhCQUpBQWtBZ0F5QUNheUlGUVJCSkRRQWdCQ0FDYWlJQUlBVkJBWEkyQWdSQkFDQUZOZ0tRMElDQUFFRUFJQUEyQXB6UWdJQUFJQVFnQTJvZ0JUWUNBQ0FFSUFKQkEzSTJBZ1FNQVFzZ0JDQURRUU55TmdJRUlBUWdBMm9pQXlBREtBSUVRUUZ5TmdJRVFRQkJBRFlDbk5DQWdBQkJBRUVBTmdLUTBJQ0FBQXNnQkVFSWFpRUREQW9MQWtCQkFDZ0NsTkNBZ0FBaUFDQUNUUTBBUVFBb0FxRFFnSUFBSWdNZ0Ftb2lCQ0FBSUFKcklnVkJBWEkyQWdSQkFDQUZOZ0tVMElDQUFFRUFJQVEyQXFEUWdJQUFJQU1nQWtFRGNqWUNCQ0FEUVFocUlRTU1DZ3NDUUFKQVFRQW9BdURUZ0lBQVJRMEFRUUFvQXVqVGdJQUFJUVFNQVF0QkFFSi9Od0xzMDRDQUFFRUFRb0NBaElDQWdNQUFOd0xrMDRDQUFFRUFJQUZCREdwQmNIRkIyS3JWcWdWek5nTGcwNENBQUVFQVFRQTJBdlRUZ0lBQVFRQkJBRFlDeE5PQWdBQkJnSUFFSVFRTFFRQWhBd0pBSUFRZ0FrSEhBR29pQjJvaUJrRUFJQVJySWd0eElnZ2dBa3NOQUVFQVFUQTJBdmpUZ0lBQURBb0xBa0JCQUNnQ3dOT0FnQUFpQTBVTkFBSkFRUUFvQXJqVGdJQUFJZ1FnQ0dvaUJTQUVUUTBBSUFVZ0EwME5BUXRCQUNFRFFRQkJNRFlDK05PQWdBQU1DZ3RCQUMwQXhOT0FnQUJCQkhFTkJBSkFBa0FDUUVFQUtBS2cwSUNBQUNJRVJRMEFRY2pUZ0lBQUlRTURRQUpBSUFNb0FnQWlCU0FFU3cwQUlBVWdBeWdDQkdvZ0JFc05Bd3NnQXlnQ0NDSUREUUFMQzBFQUVNdUFnSUFBSWdCQmYwWU5CU0FJSVFZQ1FFRUFLQUxrMDRDQUFDSURRWDlxSWdRZ0FIRkZEUUFnQ0NBQWF5QUVJQUJxUVFBZ0EydHhhaUVHQ3lBR0lBSk5EUVVnQmtIKy8vLy9CMHNOQlFKQVFRQW9Bc0RUZ0lBQUlnTkZEUUJCQUNnQ3VOT0FnQUFpQkNBR2FpSUZJQVJORFFZZ0JTQURTdzBHQ3lBR0VNdUFnSUFBSWdNZ0FFY05BUXdIQ3lBR0lBQnJJQXR4SWdaQi92Ly8vd2RMRFFRZ0JoRExnSUNBQUNJQUlBTW9BZ0FnQXlnQ0JHcEdEUU1nQUNFREN3SkFJQU5CZjBZTkFDQUNRY2dBYWlBR1RRMEFBa0FnQnlBR2EwRUFLQUxvMDRDQUFDSUVha0VBSUFScmNTSUVRZjcvLy84SFRRMEFJQU1oQUF3SEN3SkFJQVFReTRDQWdBQkJmMFlOQUNBRUlBWnFJUVlnQXlFQURBY0xRUUFnQm1zUXk0Q0FnQUFhREFRTElBTWhBQ0FEUVg5SERRVU1Bd3RCQUNFSURBY0xRUUFoQUF3RkN5QUFRWDlIRFFJTFFRQkJBQ2dDeE5PQWdBQkJCSEkyQXNUVGdJQUFDeUFJUWY3Ly8vOEhTdzBCSUFnUXk0Q0FnQUFoQUVFQUVNdUFnSUFBSVFNZ0FFRi9SZzBCSUFOQmYwWU5BU0FBSUFOUERRRWdBeUFBYXlJR0lBSkJPR3BORFFFTFFRQkJBQ2dDdU5PQWdBQWdCbW9pQXpZQ3VOT0FnQUFDUUNBRFFRQW9BcnpUZ0lBQVRRMEFRUUFnQXpZQ3ZOT0FnQUFMQWtBQ1FBSkFBa0JCQUNnQ29OQ0FnQUFpQkVVTkFFSEkwNENBQUNFREEwQWdBQ0FES0FJQUlnVWdBeWdDQkNJSWFrWU5BaUFES0FJSUlnTU5BQXdEQ3dzQ1FBSkFRUUFvQXBqUWdJQUFJZ05GRFFBZ0FDQURUdzBCQzBFQUlBQTJBcGpRZ0lBQUMwRUFJUU5CQUNBR05nTE0wNENBQUVFQUlBQTJBc2pUZ0lBQVFRQkJmellDcU5DQWdBQkJBRUVBS0FMZzA0Q0FBRFlDck5DQWdBQkJBRUVBTmdMVTA0Q0FBQU5BSUFOQnhOQ0FnQUJxSUFOQnVOQ0FnQUJxSWdRMkFnQWdCQ0FEUWJEUWdJQUFhaUlGTmdJQUlBTkJ2TkNBZ0FCcUlBVTJBZ0FnQTBITTBJQ0FBR29nQTBIQTBJQ0FBR29pQlRZQ0FDQUZJQVEyQWdBZ0EwSFUwSUNBQUdvZ0EwSEkwSUNBQUdvaUJEWUNBQ0FFSUFVMkFnQWdBMEhRMElDQUFHb2dCRFlDQUNBRFFTQnFJZ05CZ0FKSERRQUxJQUJCZUNBQWEwRVBjVUVBSUFCQkNHcEJEM0ViSWdOcUlnUWdCa0ZJYWlJRklBTnJJZ05CQVhJMkFnUkJBRUVBS0FMdzA0Q0FBRFlDcE5DQWdBQkJBQ0FETmdLVTBJQ0FBRUVBSUFRMkFxRFFnSUFBSUFBZ0JXcEJPRFlDQkF3Q0N5QURMUUFNUVFoeERRQWdCQ0FGU1EwQUlBUWdBRThOQUNBRVFYZ2dCR3RCRDNGQkFDQUVRUWhxUVE5eEd5SUZhaUlBUVFBb0FwVFFnSUFBSUFacUlnc2dCV3NpQlVFQmNqWUNCQ0FESUFnZ0JtbzJBZ1JCQUVFQUtBTHcwNENBQURZQ3BOQ0FnQUJCQUNBRk5nS1UwSUNBQUVFQUlBQTJBcURRZ0lBQUlBUWdDMnBCT0RZQ0JBd0JDd0pBSUFCQkFDZ0NtTkNBZ0FBaUNFOE5BRUVBSUFBMkFwalFnSUFBSUFBaENBc2dBQ0FHYWlFRlFjalRnSUFBSVFNQ1FBSkFBa0FDUUFKQUFrQUNRQU5BSUFNb0FnQWdCVVlOQVNBREtBSUlJZ01OQUF3Q0N3c2dBeTBBREVFSWNVVU5BUXRCeU5PQWdBQWhBd05BQWtBZ0F5Z0NBQ0lGSUFSTERRQWdCU0FES0FJRWFpSUZJQVJMRFFNTElBTW9BZ2doQXd3QUN3c2dBeUFBTmdJQUlBTWdBeWdDQkNBR2FqWUNCQ0FBUVhnZ0FHdEJEM0ZCQUNBQVFRaHFRUTl4RzJvaUN5QUNRUU55TmdJRUlBVkJlQ0FGYTBFUGNVRUFJQVZCQ0dwQkQzRWJhaUlHSUFzZ0Ftb2lBbXNoQXdKQUlBWWdCRWNOQUVFQUlBSTJBcURRZ0lBQVFRQkJBQ2dDbE5DQWdBQWdBMm9pQXpZQ2xOQ0FnQUFnQWlBRFFRRnlOZ0lFREFNTEFrQWdCa0VBS0FLYzBJQ0FBRWNOQUVFQUlBSTJBcHpRZ0lBQVFRQkJBQ2dDa05DQWdBQWdBMm9pQXpZQ2tOQ0FnQUFnQWlBRFFRRnlOZ0lFSUFJZ0Eyb2dBellDQUF3REN3SkFJQVlvQWdRaUJFRURjVUVCUncwQUlBUkJlSEVoQndKQUFrQWdCRUgvQVVzTkFDQUdLQUlJSWdVZ0JFRURkaUlJUVFOMFFiRFFnSUFBYWlJQVJob0NRQ0FHS0FJTUlnUWdCVWNOQUVFQVFRQW9Bb2pRZ0lBQVFYNGdDSGR4TmdLSTBJQ0FBQXdDQ3lBRUlBQkdHaUFFSUFVMkFnZ2dCU0FFTmdJTURBRUxJQVlvQWhnaENRSkFBa0FnQmlnQ0RDSUFJQVpHRFFBZ0JpZ0NDQ0lFSUFoSkdpQUFJQVEyQWdnZ0JDQUFOZ0lNREFFTEFrQWdCa0VVYWlJRUtBSUFJZ1VOQUNBR1FSQnFJZ1FvQWdBaUJRMEFRUUFoQUF3QkN3TkFJQVFoQ0NBRklnQkJGR29pQkNnQ0FDSUZEUUFnQUVFUWFpRUVJQUFvQWhBaUJRMEFDeUFJUVFBMkFnQUxJQWxGRFFBQ1FBSkFJQVlnQmlnQ0hDSUZRUUowUWJqU2dJQUFhaUlFS0FJQVJ3MEFJQVFnQURZQ0FDQUFEUUZCQUVFQUtBS00wSUNBQUVGK0lBVjNjVFlDak5DQWdBQU1BZ3NnQ1VFUVFSUWdDU2dDRUNBR1JodHFJQUEyQWdBZ0FFVU5BUXNnQUNBSk5nSVlBa0FnQmlnQ0VDSUVSUTBBSUFBZ0JEWUNFQ0FFSUFBMkFoZ0xJQVlvQWhRaUJFVU5BQ0FBUVJScUlBUTJBZ0FnQkNBQU5nSVlDeUFISUFOcUlRTWdCaUFIYWlJR0tBSUVJUVFMSUFZZ0JFRitjVFlDQkNBQ0lBTnFJQU0yQWdBZ0FpQURRUUZ5TmdJRUFrQWdBMEgvQVVzTkFDQURRWGh4UWJEUWdJQUFhaUVFQWtBQ1FFRUFLQUtJMElDQUFDSUZRUUVnQTBFRGRuUWlBM0VOQUVFQUlBVWdBM0kyQW9qUWdJQUFJQVFoQXd3QkN5QUVLQUlJSVFNTElBTWdBallDRENBRUlBSTJBZ2dnQWlBRU5nSU1JQUlnQXpZQ0NBd0RDMEVmSVFRQ1FDQURRZi8vL3dkTERRQWdBMEVJZGlJRUlBUkJnUDQvYWtFUWRrRUljU0lFZENJRklBVkJnT0FmYWtFUWRrRUVjU0lGZENJQUlBQkJnSUFQYWtFUWRrRUNjU0lBZEVFUGRpQUVJQVZ5SUFCeWF5SUVRUUYwSUFNZ0JFRVZhblpCQVhGeVFSeHFJUVFMSUFJZ0JEWUNIQ0FDUWdBM0FoQWdCRUVDZEVHNDBvQ0FBR29oQlFKQVFRQW9Bb3pRZ0lBQUlnQkJBU0FFZENJSWNRMEFJQVVnQWpZQ0FFRUFJQUFnQ0hJMkFvelFnSUFBSUFJZ0JUWUNHQ0FDSUFJMkFnZ2dBaUFDTmdJTURBTUxJQU5CQUVFWklBUkJBWFpySUFSQkgwWWJkQ0VFSUFVb0FnQWhBQU5BSUFBaUJTZ0NCRUY0Y1NBRFJnMENJQVJCSFhZaEFDQUVRUUYwSVFRZ0JTQUFRUVJ4YWtFUWFpSUlLQUlBSWdBTkFBc2dDQ0FDTmdJQUlBSWdCVFlDR0NBQ0lBSTJBZ3dnQWlBQ05nSUlEQUlMSUFCQmVDQUFhMEVQY1VFQUlBQkJDR3BCRDNFYklnTnFJZ3NnQmtGSWFpSUlJQU5ySWdOQkFYSTJBZ1FnQUNBSWFrRTROZ0lFSUFRZ0JVRTNJQVZyUVE5eFFRQWdCVUZKYWtFUGNSdHFRVUZxSWdnZ0NDQUVRUkJxU1JzaUNFRWpOZ0lFUVFCQkFDZ0M4Tk9BZ0FBMkFxVFFnSUFBUVFBZ0F6WUNsTkNBZ0FCQkFDQUxOZ0tnMElDQUFDQUlRUkJxUVFBcEF0RFRnSUFBTndJQUlBaEJBQ2tDeU5PQWdBQTNBZ2hCQUNBSVFRaHFOZ0xRMDRDQUFFRUFJQVkyQXN6VGdJQUFRUUFnQURZQ3lOT0FnQUJCQUVFQU5nTFUwNENBQUNBSVFTUnFJUU1EUUNBRFFRYzJBZ0FnQTBFRWFpSURJQVZKRFFBTElBZ2dCRVlOQXlBSUlBZ29BZ1JCZm5FMkFnUWdDQ0FJSUFScklnQTJBZ0FnQkNBQVFRRnlOZ0lFQWtBZ0FFSC9BVXNOQUNBQVFYaHhRYkRRZ0lBQWFpRURBa0FDUUVFQUtBS0kwSUNBQUNJRlFRRWdBRUVEZG5RaUFIRU5BRUVBSUFVZ0FISTJBb2pRZ0lBQUlBTWhCUXdCQ3lBREtBSUlJUVVMSUFVZ0JEWUNEQ0FESUFRMkFnZ2dCQ0FETmdJTUlBUWdCVFlDQ0F3RUMwRWZJUU1DUUNBQVFmLy8vd2RMRFFBZ0FFRUlkaUlESUFOQmdQNC9ha0VRZGtFSWNTSURkQ0lGSUFWQmdPQWZha0VRZGtFRWNTSUZkQ0lJSUFoQmdJQVBha0VRZGtFQ2NTSUlkRUVQZGlBRElBVnlJQWh5YXlJRFFRRjBJQUFnQTBFVmFuWkJBWEZ5UVJ4cUlRTUxJQVFnQXpZQ0hDQUVRZ0EzQWhBZ0EwRUNkRUc0MG9DQUFHb2hCUUpBUVFBb0FvelFnSUFBSWdoQkFTQURkQ0lHY1EwQUlBVWdCRFlDQUVFQUlBZ2dCbkkyQW96UWdJQUFJQVFnQlRZQ0dDQUVJQVEyQWdnZ0JDQUVOZ0lNREFRTElBQkJBRUVaSUFOQkFYWnJJQU5CSDBZYmRDRURJQVVvQWdBaENBTkFJQWdpQlNnQ0JFRjRjU0FBUmcwRElBTkJIWFloQ0NBRFFRRjBJUU1nQlNBSVFRUnhha0VRYWlJR0tBSUFJZ2dOQUFzZ0JpQUVOZ0lBSUFRZ0JUWUNHQ0FFSUFRMkFnd2dCQ0FFTmdJSURBTUxJQVVvQWdnaUF5QUNOZ0lNSUFVZ0FqWUNDQ0FDUVFBMkFoZ2dBaUFGTmdJTUlBSWdBellDQ0FzZ0MwRUlhaUVEREFVTElBVW9BZ2dpQXlBRU5nSU1JQVVnQkRZQ0NDQUVRUUEyQWhnZ0JDQUZOZ0lNSUFRZ0F6WUNDQXRCQUNnQ2xOQ0FnQUFpQXlBQ1RRMEFRUUFvQXFEUWdJQUFJZ1FnQW1vaUJTQURJQUpySWdOQkFYSTJBZ1JCQUNBRE5nS1UwSUNBQUVFQUlBVTJBcURRZ0lBQUlBUWdBa0VEY2pZQ0JDQUVRUWhxSVFNTUF3dEJBQ0VEUVFCQk1EWUMrTk9BZ0FBTUFnc0NRQ0FMUlEwQUFrQUNRQ0FJSUFnb0Fod2lCVUVDZEVHNDBvQ0FBR29pQXlnQ0FFY05BQ0FESUFBMkFnQWdBQTBCUVFBZ0IwRitJQVYzY1NJSE5nS00wSUNBQUF3Q0N5QUxRUkJCRkNBTEtBSVFJQWhHRzJvZ0FEWUNBQ0FBUlEwQkN5QUFJQXMyQWhnQ1FDQUlLQUlRSWdORkRRQWdBQ0FETmdJUUlBTWdBRFlDR0FzZ0NFRVVhaWdDQUNJRFJRMEFJQUJCRkdvZ0F6WUNBQ0FESUFBMkFoZ0xBa0FDUUNBRVFROUxEUUFnQ0NBRUlBSnFJZ05CQTNJMkFnUWdDQ0FEYWlJRElBTW9BZ1JCQVhJMkFnUU1BUXNnQ0NBQ2FpSUFJQVJCQVhJMkFnUWdDQ0FDUVFOeU5nSUVJQUFnQkdvZ0JEWUNBQUpBSUFSQi93RkxEUUFnQkVGNGNVR3cwSUNBQUdvaEF3SkFBa0JCQUNnQ2lOQ0FnQUFpQlVFQklBUkJBM1owSWdSeERRQkJBQ0FGSUFSeU5nS0kwSUNBQUNBRElRUU1BUXNnQXlnQ0NDRUVDeUFFSUFBMkFnd2dBeUFBTmdJSUlBQWdBellDRENBQUlBUTJBZ2dNQVF0Qkh5RURBa0FnQkVILy8vOEhTdzBBSUFSQkNIWWlBeUFEUVlEK1AycEJFSFpCQ0hFaUEzUWlCU0FGUVlEZ0gycEJFSFpCQkhFaUJYUWlBaUFDUVlDQUQycEJFSFpCQW5FaUFuUkJEM1lnQXlBRmNpQUNjbXNpQTBFQmRDQUVJQU5CRldwMlFRRnhja0VjYWlFREN5QUFJQU0yQWh3Z0FFSUFOd0lRSUFOQkFuUkJ1TktBZ0FCcUlRVUNRQ0FIUVFFZ0EzUWlBbkVOQUNBRklBQTJBZ0JCQUNBSElBSnlOZ0tNMElDQUFDQUFJQVUyQWhnZ0FDQUFOZ0lJSUFBZ0FEWUNEQXdCQ3lBRVFRQkJHU0FEUVFGMmF5QURRUjlHRzNRaEF5QUZLQUlBSVFJQ1FBTkFJQUlpQlNnQ0JFRjRjU0FFUmcwQklBTkJIWFloQWlBRFFRRjBJUU1nQlNBQ1FRUnhha0VRYWlJR0tBSUFJZ0lOQUFzZ0JpQUFOZ0lBSUFBZ0JUWUNHQ0FBSUFBMkFnd2dBQ0FBTmdJSURBRUxJQVVvQWdnaUF5QUFOZ0lNSUFVZ0FEWUNDQ0FBUVFBMkFoZ2dBQ0FGTmdJTUlBQWdBellDQ0FzZ0NFRUlhaUVEREFFTEFrQWdDa1VOQUFKQUFrQWdBQ0FBS0FJY0lnVkJBblJCdU5LQWdBQnFJZ01vQWdCSERRQWdBeUFJTmdJQUlBZ05BVUVBSUFsQmZpQUZkM0UyQW96UWdJQUFEQUlMSUFwQkVFRVVJQW9vQWhBZ0FFWWJhaUFJTmdJQUlBaEZEUUVMSUFnZ0NqWUNHQUpBSUFBb0FoQWlBMFVOQUNBSUlBTTJBaEFnQXlBSU5nSVlDeUFBUVJScUtBSUFJZ05GRFFBZ0NFRVVhaUFETmdJQUlBTWdDRFlDR0FzQ1FBSkFJQVJCRDBzTkFDQUFJQVFnQW1vaUEwRURjallDQkNBQUlBTnFJZ01nQXlnQ0JFRUJjallDQkF3QkN5QUFJQUpxSWdVZ0JFRUJjallDQkNBQUlBSkJBM0kyQWdRZ0JTQUVhaUFFTmdJQUFrQWdCMFVOQUNBSFFYaHhRYkRRZ0lBQWFpRUNRUUFvQXB6UWdJQUFJUU1DUUFKQVFRRWdCMEVEZG5RaUNDQUdjUTBBUVFBZ0NDQUdjallDaU5DQWdBQWdBaUVJREFFTElBSW9BZ2doQ0FzZ0NDQUROZ0lNSUFJZ0F6WUNDQ0FESUFJMkFnd2dBeUFJTmdJSUMwRUFJQVUyQXB6UWdJQUFRUUFnQkRZQ2tOQ0FnQUFMSUFCQkNHb2hBd3NnQVVFUWFpU0FnSUNBQUNBREN3b0FJQUFReVlDQWdBQUw0ZzBCQjM4Q1FDQUFSUTBBSUFCQmVHb2lBU0FBUVh4cUtBSUFJZ0pCZUhFaUFHb2hBd0pBSUFKQkFYRU5BQ0FDUVFOeFJRMEJJQUVnQVNnQ0FDSUNheUlCUVFBb0FwalFnSUFBSWdSSkRRRWdBaUFBYWlFQUFrQWdBVUVBS0FLYzBJQ0FBRVlOQUFKQUlBSkIvd0ZMRFFBZ0FTZ0NDQ0lFSUFKQkEzWWlCVUVEZEVHdzBJQ0FBR29pQmtZYUFrQWdBU2dDRENJQ0lBUkhEUUJCQUVFQUtBS0kwSUNBQUVGK0lBVjNjVFlDaU5DQWdBQU1Bd3NnQWlBR1Job2dBaUFFTmdJSUlBUWdBallDREF3Q0N5QUJLQUlZSVFjQ1FBSkFJQUVvQWd3aUJpQUJSZzBBSUFFb0FnZ2lBaUFFU1JvZ0JpQUNOZ0lJSUFJZ0JqWUNEQXdCQ3dKQUlBRkJGR29pQWlnQ0FDSUVEUUFnQVVFUWFpSUNLQUlBSWdRTkFFRUFJUVlNQVFzRFFDQUNJUVVnQkNJR1FSUnFJZ0lvQWdBaUJBMEFJQVpCRUdvaEFpQUdLQUlRSWdRTkFBc2dCVUVBTmdJQUN5QUhSUTBCQWtBQ1FDQUJJQUVvQWh3aUJFRUNkRUc0MG9DQUFHb2lBaWdDQUVjTkFDQUNJQVkyQWdBZ0JnMEJRUUJCQUNnQ2pOQ0FnQUJCZmlBRWQzRTJBb3pRZ0lBQURBTUxJQWRCRUVFVUlBY29BaEFnQVVZYmFpQUdOZ0lBSUFaRkRRSUxJQVlnQnpZQ0dBSkFJQUVvQWhBaUFrVU5BQ0FHSUFJMkFoQWdBaUFHTmdJWUN5QUJLQUlVSWdKRkRRRWdCa0VVYWlBQ05nSUFJQUlnQmpZQ0dBd0JDeUFES0FJRUlnSkJBM0ZCQTBjTkFDQURJQUpCZm5FMkFnUkJBQ0FBTmdLUTBJQ0FBQ0FCSUFCcUlBQTJBZ0FnQVNBQVFRRnlOZ0lFRHdzZ0FTQURUdzBBSUFNb0FnUWlBa0VCY1VVTkFBSkFBa0FnQWtFQ2NRMEFBa0FnQTBFQUtBS2cwSUNBQUVjTkFFRUFJQUUyQXFEUWdJQUFRUUJCQUNnQ2xOQ0FnQUFnQUdvaUFEWUNsTkNBZ0FBZ0FTQUFRUUZ5TmdJRUlBRkJBQ2dDbk5DQWdBQkhEUU5CQUVFQU5nS1EwSUNBQUVFQVFRQTJBcHpRZ0lBQUR3c0NRQ0FEUVFBb0FwelFnSUFBUncwQVFRQWdBVFlDbk5DQWdBQkJBRUVBS0FLUTBJQ0FBQ0FBYWlJQU5nS1EwSUNBQUNBQklBQkJBWEkyQWdRZ0FTQUFhaUFBTmdJQUR3c2dBa0Y0Y1NBQWFpRUFBa0FDUUNBQ1FmOEJTdzBBSUFNb0FnZ2lCQ0FDUVFOMklnVkJBM1JCc05DQWdBQnFJZ1pHR2dKQUlBTW9BZ3dpQWlBRVJ3MEFRUUJCQUNnQ2lOQ0FnQUJCZmlBRmQzRTJBb2pRZ0lBQURBSUxJQUlnQmtZYUlBSWdCRFlDQ0NBRUlBSTJBZ3dNQVFzZ0F5Z0NHQ0VIQWtBQ1FDQURLQUlNSWdZZ0EwWU5BQ0FES0FJSUlnSkJBQ2dDbU5DQWdBQkpHaUFHSUFJMkFnZ2dBaUFHTmdJTURBRUxBa0FnQTBFVWFpSUNLQUlBSWdRTkFDQURRUkJxSWdJb0FnQWlCQTBBUVFBaEJnd0JDd05BSUFJaEJTQUVJZ1pCRkdvaUFpZ0NBQ0lFRFFBZ0JrRVFhaUVDSUFZb0FoQWlCQTBBQ3lBRlFRQTJBZ0FMSUFkRkRRQUNRQUpBSUFNZ0F5Z0NIQ0lFUVFKMFFialNnSUFBYWlJQ0tBSUFSdzBBSUFJZ0JqWUNBQ0FHRFFGQkFFRUFLQUtNMElDQUFFRitJQVIzY1RZQ2pOQ0FnQUFNQWdzZ0IwRVFRUlFnQnlnQ0VDQURSaHRxSUFZMkFnQWdCa1VOQVFzZ0JpQUhOZ0lZQWtBZ0F5Z0NFQ0lDUlEwQUlBWWdBallDRUNBQ0lBWTJBaGdMSUFNb0FoUWlBa1VOQUNBR1FSUnFJQUkyQWdBZ0FpQUdOZ0lZQ3lBQklBQnFJQUEyQWdBZ0FTQUFRUUZ5TmdJRUlBRkJBQ2dDbk5DQWdBQkhEUUZCQUNBQU5nS1EwSUNBQUE4TElBTWdBa0YrY1RZQ0JDQUJJQUJxSUFBMkFnQWdBU0FBUVFGeU5nSUVDd0pBSUFCQi93RkxEUUFnQUVGNGNVR3cwSUNBQUdvaEFnSkFBa0JCQUNnQ2lOQ0FnQUFpQkVFQklBQkJBM1owSWdCeERRQkJBQ0FFSUFCeU5nS0kwSUNBQUNBQ0lRQU1BUXNnQWlnQ0NDRUFDeUFBSUFFMkFnd2dBaUFCTmdJSUlBRWdBallDRENBQklBQTJBZ2dQQzBFZklRSUNRQ0FBUWYvLy93ZExEUUFnQUVFSWRpSUNJQUpCZ1A0L2FrRVFka0VJY1NJQ2RDSUVJQVJCZ09BZmFrRVFka0VFY1NJRWRDSUdJQVpCZ0lBUGFrRVFka0VDY1NJR2RFRVBkaUFDSUFSeUlBWnlheUlDUVFGMElBQWdBa0VWYW5aQkFYRnlRUnhxSVFJTElBRWdBallDSENBQlFnQTNBaEFnQWtFQ2RFRzQwb0NBQUdvaEJBSkFBa0JCQUNnQ2pOQ0FnQUFpQmtFQklBSjBJZ054RFFBZ0JDQUJOZ0lBUVFBZ0JpQURjallDak5DQWdBQWdBU0FFTmdJWUlBRWdBVFlDQ0NBQklBRTJBZ3dNQVFzZ0FFRUFRUmtnQWtFQmRtc2dBa0VmUmh0MElRSWdCQ2dDQUNFR0FrQURRQ0FHSWdRb0FnUkJlSEVnQUVZTkFTQUNRUjEySVFZZ0FrRUJkQ0VDSUFRZ0JrRUVjV3BCRUdvaUF5Z0NBQ0lHRFFBTElBTWdBVFlDQUNBQklBUTJBaGdnQVNBQk5nSU1JQUVnQVRZQ0NBd0JDeUFFS0FJSUlnQWdBVFlDRENBRUlBRTJBZ2dnQVVFQU5nSVlJQUVnQkRZQ0RDQUJJQUEyQWdnTFFRQkJBQ2dDcU5DQWdBQkJmMm9pQVVGL0lBRWJOZ0tvMElDQUFBc0xCQUFBQUF0T0FBSkFJQUFOQUQ4QVFSQjBEd3NDUUNBQVFmLy9BM0VOQUNBQVFYOU1EUUFDUUNBQVFSQjJRQUFpQUVGL1J3MEFRUUJCTURZQytOT0FnQUJCZnc4TElBQkJFSFFQQ3hES2dJQ0FBQUFMOGdJQ0EzOEJmZ0pBSUFKRkRRQWdBQ0FCT2dBQUlBSWdBR29pQTBGL2FpQUJPZ0FBSUFKQkEwa05BQ0FBSUFFNkFBSWdBQ0FCT2dBQklBTkJmV29nQVRvQUFDQURRWDVxSUFFNkFBQWdBa0VIU1EwQUlBQWdBVG9BQXlBRFFYeHFJQUU2QUFBZ0FrRUpTUTBBSUFCQkFDQUFhMEVEY1NJRWFpSURJQUZCL3dGeFFZR0NoQWhzSWdFMkFnQWdBeUFDSUFSclFYeHhJZ1JxSWdKQmZHb2dBVFlDQUNBRVFRbEpEUUFnQXlBQk5nSUlJQU1nQVRZQ0JDQUNRWGhxSUFFMkFnQWdBa0YwYWlBQk5nSUFJQVJCR1VrTkFDQURJQUUyQWhnZ0F5QUJOZ0lVSUFNZ0FUWUNFQ0FESUFFMkFnd2dBa0Z3YWlBQk5nSUFJQUpCYkdvZ0FUWUNBQ0FDUVdocUlBRTJBZ0FnQWtGa2FpQUJOZ0lBSUFRZ0EwRUVjVUVZY2lJRmF5SUNRU0JKRFFBZ0FhMUNnWUNBZ0JCK0lRWWdBeUFGYWlFQkEwQWdBU0FHTndNWUlBRWdCamNERUNBQklBWTNBd2dnQVNBR053TUFJQUZCSUdvaEFTQUNRV0JxSWdKQkgwc05BQXNMSUFBTEM0NUlBUUJCZ0FnTGhrZ0JBQUFBQWdBQUFBTUFBQUFBQUFBQUFBQUFBQVFBQUFBRkFBQUFBQUFBQUFBQUFBQUdBQUFBQndBQUFBZ0FBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBRWx1ZG1Gc2FXUWdZMmhoY2lCcGJpQjFjbXdnY1hWbGNua0FVM0JoYmlCallXeHNZbUZqYXlCbGNuSnZjaUJwYmlCdmJsOWliMlI1QUVOdmJuUmxiblF0VEdWdVozUm9JRzkyWlhKbWJHOTNBRU5vZFc1cklITnBlbVVnYjNabGNtWnNiM2NBVW1WemNHOXVjMlVnYjNabGNtWnNiM2NBU1c1MllXeHBaQ0J0WlhSb2IyUWdabTl5SUVoVVZGQXZlQzU0SUhKbGNYVmxjM1FBU1c1MllXeHBaQ0J0WlhSb2IyUWdabTl5SUZKVVUxQXZlQzU0SUhKbGNYVmxjM1FBUlhod1pXTjBaV1FnVTA5VlVrTkZJRzFsZEdodlpDQm1iM0lnU1VORkwzZ3VlQ0J5WlhGMVpYTjBBRWx1ZG1Gc2FXUWdZMmhoY2lCcGJpQjFjbXdnWm5KaFoyMWxiblFnYzNSaGNuUUFSWGh3WldOMFpXUWdaRzkwQUZOd1lXNGdZMkZzYkdKaFkyc2daWEp5YjNJZ2FXNGdiMjVmYzNSaGRIVnpBRWx1ZG1Gc2FXUWdjbVZ6Y0c5dWMyVWdjM1JoZEhWekFFbHVkbUZzYVdRZ1kyaGhjbUZqZEdWeUlHbHVJR05vZFc1cklHVjRkR1Z1YzJsdmJuTUFWWE5sY2lCallXeHNZbUZqYXlCbGNuSnZjZ0JnYjI1ZmNtVnpaWFJnSUdOaGJHeGlZV05ySUdWeWNtOXlBR0J2Ymw5amFIVnVhMTlvWldGa1pYSmdJR05oYkd4aVlXTnJJR1Z5Y205eUFHQnZibDl0WlhOellXZGxYMkpsWjJsdVlDQmpZV3hzWW1GamF5Qmxjbkp2Y2dCZ2IyNWZZMmgxYm10ZlpYaDBaVzV6YVc5dVgzWmhiSFZsWUNCallXeHNZbUZqYXlCbGNuSnZjZ0JnYjI1ZmMzUmhkSFZ6WDJOdmJYQnNaWFJsWUNCallXeHNZbUZqYXlCbGNuSnZjZ0JnYjI1ZmRtVnljMmx2Ymw5amIyMXdiR1YwWldBZ1kyRnNiR0poWTJzZ1pYSnliM0lBWUc5dVgzVnliRjlqYjIxd2JHVjBaV0FnWTJGc2JHSmhZMnNnWlhKeWIzSUFZRzl1WDJOb2RXNXJYMk52YlhCc1pYUmxZQ0JqWVd4c1ltRmpheUJsY25KdmNnQmdiMjVmYUdWaFpHVnlYM1poYkhWbFgyTnZiWEJzWlhSbFlDQmpZV3hzWW1GamF5Qmxjbkp2Y2dCZ2IyNWZiV1Z6YzJGblpWOWpiMjF3YkdWMFpXQWdZMkZzYkdKaFkyc2daWEp5YjNJQVlHOXVYMjFsZEdodlpGOWpiMjF3YkdWMFpXQWdZMkZzYkdKaFkyc2daWEp5YjNJQVlHOXVYMmhsWVdSbGNsOW1hV1ZzWkY5amIyMXdiR1YwWldBZ1kyRnNiR0poWTJzZ1pYSnliM0lBWUc5dVgyTm9kVzVyWDJWNGRHVnVjMmx2Ymw5dVlXMWxZQ0JqWVd4c1ltRmpheUJsY25KdmNnQlZibVY0Y0dWamRHVmtJR05vWVhJZ2FXNGdkWEpzSUhObGNuWmxjZ0JKYm5aaGJHbGtJR2hsWVdSbGNpQjJZV3gxWlNCamFHRnlBRWx1ZG1Gc2FXUWdhR1ZoWkdWeUlHWnBaV3hrSUdOb1lYSUFVM0JoYmlCallXeHNZbUZqYXlCbGNuSnZjaUJwYmlCdmJsOTJaWEp6YVc5dUFFbHVkbUZzYVdRZ2JXbHViM0lnZG1WeWMybHZiZ0JKYm5aaGJHbGtJRzFoYW05eUlIWmxjbk5wYjI0QVJYaHdaV04wWldRZ2MzQmhZMlVnWVdaMFpYSWdkbVZ5YzJsdmJnQkZlSEJsWTNSbFpDQkRVa3hHSUdGbWRHVnlJSFpsY25OcGIyNEFTVzUyWVd4cFpDQklWRlJRSUhabGNuTnBiMjRBU1c1MllXeHBaQ0JvWldGa1pYSWdkRzlyWlc0QVUzQmhiaUJqWVd4c1ltRmpheUJsY25KdmNpQnBiaUJ2Ymw5MWNtd0FTVzUyWVd4cFpDQmphR0Z5WVdOMFpYSnpJR2x1SUhWeWJBQlZibVY0Y0dWamRHVmtJSE4wWVhKMElHTm9ZWElnYVc0Z2RYSnNBRVJ2ZFdKc1pTQkFJR2x1SUhWeWJBQkZiWEIwZVNCRGIyNTBaVzUwTFV4bGJtZDBhQUJKYm5aaGJHbGtJR05vWVhKaFkzUmxjaUJwYmlCRGIyNTBaVzUwTFV4bGJtZDBhQUJFZFhCc2FXTmhkR1VnUTI5dWRHVnVkQzFNWlc1bmRHZ0FTVzUyWVd4cFpDQmphR0Z5SUdsdUlIVnliQ0J3WVhSb0FFTnZiblJsYm5RdFRHVnVaM1JvSUdOaGJpZDBJR0psSUhCeVpYTmxiblFnZDJsMGFDQlVjbUZ1YzJabGNpMUZibU52WkdsdVp3QkpiblpoYkdsa0lHTm9ZWEpoWTNSbGNpQnBiaUJqYUhWdWF5QnphWHBsQUZOd1lXNGdZMkZzYkdKaFkyc2daWEp5YjNJZ2FXNGdiMjVmYUdWaFpHVnlYM1poYkhWbEFGTndZVzRnWTJGc2JHSmhZMnNnWlhKeWIzSWdhVzRnYjI1ZlkyaDFibXRmWlhoMFpXNXphVzl1WDNaaGJIVmxBRWx1ZG1Gc2FXUWdZMmhoY21GamRHVnlJR2x1SUdOb2RXNXJJR1Y0ZEdWdWMybHZibk1nZG1Gc2RXVUFUV2x6YzJsdVp5QmxlSEJsWTNSbFpDQk1SaUJoWm5SbGNpQm9aV0ZrWlhJZ2RtRnNkV1VBU1c1MllXeHBaQ0JnVkhKaGJuTm1aWEl0Ulc1amIyUnBibWRnSUdobFlXUmxjaUIyWVd4MVpRQkpiblpoYkdsa0lHTm9ZWEpoWTNSbGNpQnBiaUJqYUhWdWF5QmxlSFJsYm5OcGIyNXpJSEYxYjNSbElIWmhiSFZsQUVsdWRtRnNhV1FnWTJoaGNtRmpkR1Z5SUdsdUlHTm9kVzVySUdWNGRHVnVjMmx2Ym5NZ2NYVnZkR1ZrSUhaaGJIVmxBRkJoZFhObFpDQmllU0J2Ymw5b1pXRmtaWEp6WDJOdmJYQnNaWFJsQUVsdWRtRnNhV1FnUlU5R0lITjBZWFJsQUc5dVgzSmxjMlYwSUhCaGRYTmxBRzl1WDJOb2RXNXJYMmhsWVdSbGNpQndZWFZ6WlFCdmJsOXRaWE56WVdkbFgySmxaMmx1SUhCaGRYTmxBRzl1WDJOb2RXNXJYMlY0ZEdWdWMybHZibDkyWVd4MVpTQndZWFZ6WlFCdmJsOXpkR0YwZFhOZlkyOXRjR3hsZEdVZ2NHRjFjMlVBYjI1ZmRtVnljMmx2Ymw5amIyMXdiR1YwWlNCd1lYVnpaUUJ2Ymw5MWNteGZZMjl0Y0d4bGRHVWdjR0YxYzJVQWIyNWZZMmgxYm10ZlkyOXRjR3hsZEdVZ2NHRjFjMlVBYjI1ZmFHVmhaR1Z5WDNaaGJIVmxYMk52YlhCc1pYUmxJSEJoZFhObEFHOXVYMjFsYzNOaFoyVmZZMjl0Y0d4bGRHVWdjR0YxYzJVQWIyNWZiV1YwYUc5a1gyTnZiWEJzWlhSbElIQmhkWE5sQUc5dVgyaGxZV1JsY2w5bWFXVnNaRjlqYjIxd2JHVjBaU0J3WVhWelpRQnZibDlqYUhWdWExOWxlSFJsYm5OcGIyNWZibUZ0WlNCd1lYVnpaUUJWYm1WNGNHVmpkR1ZrSUhOd1lXTmxJR0ZtZEdWeUlITjBZWEowSUd4cGJtVUFVM0JoYmlCallXeHNZbUZqYXlCbGNuSnZjaUJwYmlCdmJsOWphSFZ1YTE5bGVIUmxibk5wYjI1ZmJtRnRaUUJKYm5aaGJHbGtJR05vWVhKaFkzUmxjaUJwYmlCamFIVnVheUJsZUhSbGJuTnBiMjV6SUc1aGJXVUFVR0YxYzJVZ2IyNGdRMDlPVGtWRFZDOVZjR2R5WVdSbEFGQmhkWE5sSUc5dUlGQlNTUzlWY0dkeVlXUmxBRVY0Y0dWamRHVmtJRWhVVkZBdk1pQkRiMjV1WldOMGFXOXVJRkJ5WldaaFkyVUFVM0JoYmlCallXeHNZbUZqYXlCbGNuSnZjaUJwYmlCdmJsOXRaWFJvYjJRQVJYaHdaV04wWldRZ2MzQmhZMlVnWVdaMFpYSWdiV1YwYUc5a0FGTndZVzRnWTJGc2JHSmhZMnNnWlhKeWIzSWdhVzRnYjI1ZmFHVmhaR1Z5WDJacFpXeGtBRkJoZFhObFpBQkpiblpoYkdsa0lIZHZjbVFnWlc1amIzVnVkR1Z5WldRQVNXNTJZV3hwWkNCdFpYUm9iMlFnWlc1amIzVnVkR1Z5WldRQVZXNWxlSEJsWTNSbFpDQmphR0Z5SUdsdUlIVnliQ0J6WTJobGJXRUFVbVZ4ZFdWemRDQm9ZWE1nYVc1MllXeHBaQ0JnVkhKaGJuTm1aWEl0Ulc1amIyUnBibWRnQUZOWFNWUkRTRjlRVWs5WVdRQlZVMFZmVUZKUFdGa0FUVXRCUTFSSlZrbFVXUUJWVGxCU1QwTkZVMU5CUWt4RlgwVk9WRWxVV1FCRFQxQlpBRTFQVmtWRVgxQkZVazFCVGtWT1ZFeFpBRlJQVDE5RlFWSk1XUUJPVDFSSlJsa0FSa0ZKVEVWRVgwUkZVRVZPUkVWT1Exa0FRa0ZFWDBkQlZFVlhRVmtBVUV4QldRQlFWVlFBUTBoRlEwdFBWVlFBUjBGVVJWZEJXVjlVU1UxRlQxVlVBRkpGVVZWRlUxUmZWRWxOUlU5VlZBQk9SVlJYVDFKTFgwTlBUazVGUTFSZlZFbE5SVTlWVkFCRFQwNU9SVU5VU1U5T1gxUkpUVVZQVlZRQVRFOUhTVTVmVkVsTlJVOVZWQUJPUlZSWFQxSkxYMUpGUVVSZlZFbE5SVTlWVkFCUVQxTlVBRTFKVTBSSlVrVkRWRVZFWDFKRlVWVkZVMVFBUTB4SlJVNVVYME5NVDFORlJGOVNSVkZWUlZOVUFFTk1TVVZPVkY5RFRFOVRSVVJmVEU5QlJGOUNRVXhCVGtORlJGOVNSVkZWUlZOVUFFSkJSRjlTUlZGVlJWTlVBRWhVVkZCZlVrVlJWVVZUVkY5VFJVNVVYMVJQWDBoVVZGQlRYMUJQVWxRQVVrVlFUMUpVQUVsTlgwRmZWRVZCVUU5VUFGSkZVMFZVWDBOUFRsUkZUbFFBVGs5ZlEwOU9WRVZPVkFCUVFWSlVTVUZNWDBOUFRsUkZUbFFBU0ZCRlgwbE9Wa0ZNU1VSZlEwOU9VMVJCVGxRQVNGQkZYME5DWDFKRlUwVlVBRWRGVkFCSVVFVmZVMVJTU1VOVUFFTlBUa1pNU1VOVUFGUkZUVkJQVWtGU1dWOVNSVVJKVWtWRFZBQlFSVkpOUVU1RlRsUmZVa1ZFU1ZKRlExUUFRMDlPVGtWRFZBQk5WVXhVU1Y5VFZFRlVWVk1BU0ZCRlgwbE9Wa0ZNU1VSZlUxUkJWRlZUQUZSUFQxOU5RVTVaWDFKRlVWVkZVMVJUQUVWQlVreFpYMGhKVGxSVEFGVk9RVlpCU1V4QlFreEZYMFpQVWw5TVJVZEJURjlTUlVGVFQwNVRBRTlRVkVsUFRsTUFVMWRKVkVOSVNVNUhYMUJTVDFSUFEwOU1Vd0JXUVZKSlFVNVVYMEZNVTA5ZlRrVkhUMVJKUVZSRlV3Qk5WVXhVU1ZCTVJWOURTRTlKUTBWVEFFbE9WRVZTVGtGTVgxTkZVbFpGVWw5RlVsSlBVZ0JYUlVKZlUwVlNWa1ZTWDFWT1MwNVBWMDVmUlZKU1QxSUFVa0ZKVEVkVlRsOUZVbEpQVWdCSlJFVk9WRWxVV1Y5UVVrOVdTVVJGVWw5QlZWUklSVTVVU1VOQlZFbFBUbDlGVWxKUFVnQlRVMHhmUTBWU1ZFbEdTVU5CVkVWZlJWSlNUMUlBU1U1V1FVeEpSRjlZWDBaUFVsZEJVa1JGUkY5R1QxSUFVMFZVWDFCQlVrRk5SVlJGVWdCSFJWUmZVRUZTUVUxRlZFVlNBRWhRUlY5VlUwVlNBRk5GUlY5UFZFaEZVZ0JJVUVWZlEwSmZRMGhWVGt0ZlNFVkJSRVZTQUUxTFEwRk1SVTVFUVZJQVUwVlVWVkFBVjBWQ1gxTkZVbFpGVWw5SlUxOUVUMWRPQUZSRlFWSkVUMWRPQUVoUVJWOURURTlUUlVSZlEwOU9Ua1ZEVkVsUFRnQklSVlZTU1ZOVVNVTmZSVmhRU1ZKQlZFbFBUZ0JFU1ZORFQwNU9SVU5VUlVSZlQxQkZVa0ZVU1U5T0FFNVBUbDlCVlZSSVQxSkpWRUZVU1ZaRlgwbE9SazlTVFVGVVNVOU9BRWhRUlY5SlRsWkJURWxFWDFaRlVsTkpUMDRBU0ZCRlgwTkNYMDFGVTFOQlIwVmZRa1ZIU1U0QVUwbFVSVjlKVTE5R1VrOWFSVTRBU0ZCRlgwbE9Wa0ZNU1VSZlNFVkJSRVZTWDFSUFMwVk9BRWxPVmtGTVNVUmZWRTlMUlU0QVJrOVNRa2xFUkVWT0FFVk9TRUZPUTBWZldVOVZVbDlEUVV4TkFFaFFSVjlKVGxaQlRFbEVYMVZTVEFCQ1RFOURTMFZFWDBKWlgxQkJVa1ZPVkVGTVgwTlBUbFJTVDB3QVRVdERUMHdBUVVOTUFFaFFSVjlKVGxSRlVrNUJUQUJTUlZGVlJWTlVYMGhGUVVSRlVsOUdTVVZNUkZOZlZFOVBYMHhCVWtkRlgxVk9UMFpHU1VOSlFVd0FTRkJGWDA5TEFGVk9URWxPU3dCVlRreFBRMHNBVUZKSkFGSkZWRkpaWDFkSlZFZ0FTRkJGWDBsT1ZrRk1TVVJmUTA5T1ZFVk9WRjlNUlU1SFZFZ0FTRkJGWDFWT1JWaFFSVU5VUlVSZlEwOU9WRVZPVkY5TVJVNUhWRWdBUmt4VlUwZ0FVRkpQVUZCQlZFTklBRTB0VTBWQlVrTklBRlZTU1Y5VVQwOWZURTlPUndCUVVrOURSVk5UU1U1SEFFMUpVME5GVEV4QlRrVlBWVk5mVUVWU1UwbFRWRVZPVkY5WFFWSk9TVTVIQUUxSlUwTkZURXhCVGtWUFZWTmZWMEZTVGtsT1J3QklVRVZmU1U1V1FVeEpSRjlVVWtGT1UwWkZVbDlGVGtOUFJFbE9Sd0JGZUhCbFkzUmxaQ0JEVWt4R0FFaFFSVjlKVGxaQlRFbEVYME5JVlU1TFgxTkpXa1VBVFU5V1JRQkRUMDVVU1U1VlJRQklVRVZmUTBKZlUxUkJWRlZUWDBOUFRWQk1SVlJGQUVoUVJWOURRbDlJUlVGRVJWSlRYME5QVFZCTVJWUkZBRWhRUlY5RFFsOVdSVkpUU1U5T1gwTlBUVkJNUlZSRkFFaFFSVjlEUWw5VlVreGZRMDlOVUV4RlZFVUFTRkJGWDBOQ1gwTklWVTVMWDBOUFRWQk1SVlJGQUVoUVJWOURRbDlJUlVGRVJWSmZWa0ZNVlVWZlEwOU5VRXhGVkVVQVNGQkZYME5DWDBOSVZVNUxYMFZZVkVWT1UwbFBUbDlXUVV4VlJWOURUMDFRVEVWVVJRQklVRVZmUTBKZlEwaFZUa3RmUlZoVVJVNVRTVTlPWDA1QlRVVmZRMDlOVUV4RlZFVUFTRkJGWDBOQ1gwMUZVMU5CUjBWZlEwOU5VRXhGVkVVQVNGQkZYME5DWDAxRlZFaFBSRjlEVDAxUVRFVlVSUUJJVUVWZlEwSmZTRVZCUkVWU1gwWkpSVXhFWDBOUFRWQk1SVlJGQUVSRlRFVlVSUUJJVUVWZlNVNVdRVXhKUkY5RlQwWmZVMVJCVkVVQVNVNVdRVXhKUkY5VFUweGZRMFZTVkVsR1NVTkJWRVVBVUVGVlUwVUFUazlmVWtWVFVFOU9VMFVBVlU1VFZWQlFUMUpVUlVSZlRVVkVTVUZmVkZsUVJRQkhUMDVGQUU1UFZGOUJRME5GVUZSQlFreEZBRk5GVWxaSlEwVmZWVTVCVmtGSlRFRkNURVVBVWtGT1IwVmZUazlVWDFOQlZFbFRSa2xCUWt4RkFFOVNTVWRKVGw5SlUxOVZUbEpGUVVOSVFVSk1SUUJTUlZOUVQwNVRSVjlKVTE5VFZFRk1SUUJRVlZKSFJRQk5SVkpIUlFCU1JWRlZSVk5VWDBoRlFVUkZVbDlHU1VWTVJGTmZWRTlQWDB4QlVrZEZBRkpGVVZWRlUxUmZTRVZCUkVWU1gxUlBUMTlNUVZKSFJRQlFRVmxNVDBGRVgxUlBUMTlNUVZKSFJRQkpUbE5WUmtaSlEwbEZUbFJmVTFSUFVrRkhSUUJJVUVWZlVFRlZVMFZFWDFWUVIxSkJSRVVBU0ZCRlgxQkJWVk5GUkY5SU1sOVZVRWRTUVVSRkFGTlBWVkpEUlFCQlRrNVBWVTVEUlFCVVVrRkRSUUJJVUVWZlZVNUZXRkJGUTFSRlJGOVRVRUZEUlFCRVJWTkRVa2xDUlFCVlRsTlZRbE5EVWtsQ1JRQlNSVU5QVWtRQVNGQkZYMGxPVmtGTVNVUmZUVVZVU0U5RUFFNVBWRjlHVDFWT1JBQlFVazlRUmtsT1JBQlZUa0pKVGtRQVVrVkNTVTVFQUZWT1FWVlVTRTlTU1ZwRlJBQk5SVlJJVDBSZlRrOVVYMEZNVEU5WFJVUUFTRlJVVUY5V1JWSlRTVTlPWDA1UFZGOVRWVkJRVDFKVVJVUUFRVXhTUlVGRVdWOVNSVkJQVWxSRlJBQkJRME5GVUZSRlJBQk9UMVJmU1UxUVRFVk5SVTVVUlVRQVRFOVBVRjlFUlZSRlExUkZSQUJJVUVWZlExSmZSVmhRUlVOVVJVUUFTRkJGWDB4R1gwVllVRVZEVkVWRUFFTlNSVUZVUlVRQVNVMWZWVk5GUkFCSVVFVmZVRUZWVTBWRUFGUkpUVVZQVlZSZlQwTkRWVkpGUkFCUVFWbE5SVTVVWDFKRlVWVkpVa1ZFQUZCU1JVTlBUa1JKVkVsUFRsOVNSVkZWU1ZKRlJBQlFVazlZV1Y5QlZWUklSVTVVU1VOQlZFbFBUbDlTUlZGVlNWSkZSQUJPUlZSWFQxSkxYMEZWVkVoRlRsUkpRMEZVU1U5T1gxSkZVVlZKVWtWRUFFeEZUa2RVU0Y5U1JWRlZTVkpGUkFCVFUweGZRMFZTVkVsR1NVTkJWRVZmVWtWUlZVbFNSVVFBVlZCSFVrRkVSVjlTUlZGVlNWSkZSQUJRUVVkRlgwVllVRWxTUlVRQVVGSkZRMDlPUkVsVVNVOU9YMFpCU1V4RlJBQkZXRkJGUTFSQlZFbFBUbDlHUVVsTVJVUUFVa1ZXUVV4SlJFRlVTVTlPWDBaQlNVeEZSQUJUVTB4ZlNFRk9SRk5JUVV0RlgwWkJTVXhGUkFCTVQwTkxSVVFBVkZKQlRsTkdUMUpOUVZSSlQwNWZRVkJRVEVsRlJBQk9UMVJmVFU5RVNVWkpSVVFBVGs5VVgwVllWRVZPUkVWRUFFSkJUa1JYU1VSVVNGOU1TVTFKVkY5RldFTkZSVVJGUkFCVFNWUkZYMGxUWDA5V1JWSk1UMEZFUlVRQVNFVkJSQUJGZUhCbFkzUmxaQ0JJVkZSUUx3QUFYaE1BQUNZVEFBQXdFQUFBOEJjQUFKMFRBQUFWRWdBQU9SY0FBUEFTQUFBS0VBQUFkUklBQUswU0FBQ0NFd0FBVHhRQUFIOFFBQUNnRlFBQUl4UUFBSWtTQUFDTEZBQUFUUlVBQU5RUkFBRFBGQUFBRUJnQUFNa1dBQURjRmdBQXdSRUFBT0FYQUFDN0ZBQUFkQlFBQUh3VkFBRGxGQUFBQ0JjQUFCOFFBQUJsRlFBQW94UUFBQ2dWQUFBQ0ZRQUFtUlVBQUN3UUFBQ0xHUUFBVHc4QUFOUU9BQUJxRUFBQXpoQUFBQUlYQUFDSkRnQUFiaE1BQUJ3VEFBQm1GQUFBVmhjQUFNRVRBQURORXdBQWJCTUFBR2dYQUFCbUZ3QUFYeGNBQUNJVEFBRE9Ed0FBYVE0QUFOZ09BQUJqRmdBQXl4TUFBS29PQUFBb0Z3QUFKaGNBQU1VVEFBQmRGZ0FBNkJFQUFHY1RBQUJsRXdBQThoWUFBSE1UQUFBZEZ3QUErUllBQVBNUkFBRFBEZ0FBemhVQUFBd1NBQUN6RVFBQXBSRUFBR0VRQUFBeUZ3QUF1eE1BQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQVFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUJBUUlCQVFFQkFRRUJBUUVCQVFFQkFRRUJBUUVCQVFFQkFRRUJBUUVCQVFFQkFRRUJBUUVCQVFFQkFRRUJBUUVCQVFFQkFRRUJBUUVCQVFFQUFRRUJBUUVCQVFFQkFRRUJBUUVCQVFFQkFRRUJBUUVCQVFFQkFRRUJBUUVCQVFFQkFRRUJBUUVCQVFFQkFRRUJBUUVCQVFFQkFRRUJBUUVCQVFFQkFRRUJBUUVCQVFFQkFRRUJBUUVCQVFFQkFRRUJBUUVCQVFFQkFRRUJBUUVCQVFFQkFRRUJBUUVCQVFFQkFRRUJBUUVCQVFFQkFRRUJBUUVCQVFFQkFRRUJBUUVCQVFFQkFRRUJBUUVCQVFFQkFRRUJBUUVCQVFFQkFRRUJBUUVCQVFFQkFRQUFBQUFBQUFBQUFBQUFBQUFCQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFJREFnSUNBZ0lBQUFJQ0FBSUNBQUlDQWdJQ0FnSUNBZ0lBQkFBQUFBQUFBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUFBQUFDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdBQ0FBSUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFRQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUNBQUlDQWdJQ0FBQUNBZ0FDQWdBQ0FnSUNBZ0lDQWdJQ0FBTUFCQUFBQUFJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQUFBQUFnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUFBZ0FDQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQWJHOXpaV1ZsY0MxaGJHbDJaUUFBQUFBQUFBQUFBQUFBQUFFQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBUUVCQVFFQkFRRUJBUUVCQVFFQkFRRUJBUUVCQVFFQkFRRUJBUUVCQVFFQkFRRUJBUUVCQVFFQkFRRUJBUUVCQVFFQkFRRUJBUUVCQVFFQkFRRUJBUUVCQVFFQkFRRUJBUUVCQVFFQkFRRUJBUUVCQVFFQkFRRUJBUUVCQVFFQUFRRUJBUUVCQVFFQkFRRUJBUUVCQVFFQkFRRUJBUUVCQVFFQkFRRUJBUUVCQVFFQkFRRUJBUUVCQVFFQkFRRUJBUUVCQVFFQkFRRUJBUUVCQVFFQkFRRUJBUUVCQVFFQkFRRUJBUUVCQVFFQkFRRUJBUUVCQVFFQkFRRUJBUUVCQVFFQkFRRUJBUUVCQVFFQkFRRUJBUUVCQVFFQkFRRUJBUUVCQVFFQkFRRUFBQUFBQUFBQUFBQUJBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFFQkFRRUJBUUVCQVFFQkFRSUJBUUVCQVFFQkFRRUJBUUVCQVFFQkFRRUJBUUVCQVFFQkFRRUJBUUVCQVFFQkFRRUJBUUVCQVFFQkFRRUJBUUVCQVFFQkFRRUJBUUVCQVFFQkFRRUJBUUVCQVFFQkFRRUJBUUVCQVFFQkFRRUJBQUVCQVFFQkFRRUJBUUVCQVFFQkFRRUJBUUVCQVFFQkFRRUJBUUVCQVFFQkFRRUJBUUVCQVFFQkFRRUJBUUVCQVFFQkFRRUJBUUVCQVFFQkFRRUJBUUVCQVFFQkFRRUJBUUVCQVFFQkFRRUJBUUVCQVFFQkFRRUJBUUVCQVFFQkFRRUJBUUVCQVFFQkFRRUJBUUVCQVFFQkFRRUJBUUVCQVFFQkFRRUJBUUVCWTJoMWJtdGxaQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFRRUFBUUVCQVFFQUFBRUJBQUVCQUFFQkFRRUJBUUVCQVFFQUFBQUFBQUFBQVFFQkFRRUJBUUVCQVFFQkFRRUJBUUVCQVFFQkFRRUJBUUVBQUFBQkFRRUJBUUVCQVFFQkFRRUJBUUVCQVFFQkFRRUJBUUVCQVFFQkFRQUJBQUVBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFCbFkzUnBiMjVsYm5RdGJHVnVaM1JvYjI1eWIzaDVMV052Ym01bFkzUnBiMjRBQUFBQUFBQUFBQUFBQUFBQUFBQnlZVzV6Wm1WeUxXVnVZMjlrYVc1bmNHZHlZV1JsRFFvTkNnMEtVMDBOQ2cwS1ZGUlFMME5GTDFSVFVDOEFBQUFBQUFBQUFBQUFBQUFCQWdBQkF3QUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBUUJBUUVCQVFFQkFRRUJBUUVCQVFFQkFRRUJBUUVCQVFFQkFRRUJBUUVCQVFFQkFRRUJBUUVCQVFFQkFRRUJBUUVCQVFFQkFRRUJBUUVCQVFFQkFRRUJBUUVCQVFFQkFRRUJBUUVCQVFFQkFRRUJBUUVCQVFFQkFRRUJBUUVCQUFFQkFRRUJBUUVCQVFFQkFRRUJBUUVCQVFFQkFRRUJBUUVCQVFFQkFRRUJBUUVCQVFFQkFRRUJBUUVCQVFFQkFRRUJBUUVCQVFFQkFRRUJBUUVCQVFFQkFRRUJBUUVCQVFFQkFRRUJBUUVCQVFFQkFRRUJBUUVCQVFFQkFRRUJBUUVCQVFFQkFRRUJBUUVCQVFFQkFRRUJBUUVCQVFFQkFRRUJBUUVCQVFFQkFBQUFBQUFBQUFBQUFRSUFBUU1BQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFFQVFFRkFRRUJBUUVCQVFFQkFRRUJBUUVCQVFFQkFRRUJBUUVCQVFFQkFRRUJBUUVCQVFFQkFRRUJBUUVCQVFFQkFRRUJBUUVCQVFFQkFRRUJBUUVCQVFFQkFRRUJBUUVCQVFFQkFRRUJBUUVCQVFFQkFRRUJBUUVCQVFFQkFRQUJBUUVCQVFFQkFRRUJBUUVCQVFFQkFRRUJBUUVCQVFFQkFRRUJBUUVCQVFFQkFRRUJBUUVCQVFFQkFRRUJBUUVCQVFFQkFRRUJBUUVCQVFFQkFRRUJBUUVCQVFFQkFRRUJBUUVCQVFFQkFRRUJBUUVCQVFFQkFRRUJBUUVCQVFFQkFRRUJBUUVCQVFFQkFRRUJBUUVCQVFFQkFRRUJBUUVCQVFFQkFRRUJBUUFBQUFBQUFBQUFBQUVBQUFFQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBRUJBQUVCQVFFQkFRRUJBUUVCQVFFQkFRRUJBUUVCQVFFQkFRRUJBUUFCQVFFQkFRRUJBUUVCQVFFQkFRRUJBUUVCQVFFQkFRRUJBUUVCQVFFQkFRRUJBUUVCQVFFQkFRRUJBUUVCQVFFQkFRRUJBUUVCQVFFQkFRRUJBUUVBQVFFQkFRRUJBUUVCQVFFQkFRRUJBUUVCQVFFQkFRRUJBUUVCQVFFQkFRRUJBUUVCQVFFQkFRRUJBUUVCQVFFQkFRRUJBUUVCQVFFQkFRRUJBUUVCQVFFQkFRRUJBUUVCQVFFQkFRRUJBUUVCQVFFQkFRRUJBUUVCQVFFQkFRRUJBUUVCQVFFQkFRRUJBUUVCQVFFQkFRRUJBUUVCQVFFQkFRRUJBUUVCQVFFQUFBQUFBQUFBQUFBQUFRQUFBZ0FBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQU1FQUFBRUJBUUVCQVFFQkFRRUJBVUVCQVFFQkFRRUJBUUVCQVFBQkFBR0J3UUVCQVFFQkFRRUJBUUVCQVFFQkFRRUJBUUVCQVFFQkFRRUJBQUVBQVFBQkFRRUJBUUVCQVFFQkFRRUJBUUVCQVFFQkFRRUJBUUVCQVFBQUFBRUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUVBQUFFQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQkFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFJQUFBQUFBQUFEQXdNREF3TURBd01EQXdNREF3TURBd01EQXdNREF3TURBd0FBQUFBQUFBTURBd01EQXdNREF3TURBd01EQXdNREF3TURBd01EQXdNREFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQkFBQUJBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBUUFBQUFBQUFBQUFBQUlBQUFBQUFnQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUF3TURBd01EQXdNREF3TURBd01EQXdNREF3TURBd01EQXdNQUFBQUFBQUFEQXdNREF3TURBd01EQXdNREF3TURBd01EQXdNREF3TURBd0FBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQk9UMVZPUTBWRlEwdFBWVlJPUlVOVVJWUkZRMUpKUWtWTVZWTklSVlJGUVVSVFJVRlNRMGhTUjBWRFZFbFdTVlJaVEVWT1JFRlNWa1ZQVkVsR1dWQlVTVTlPVTBOSVUwVkJXVk5VUVZSRFNFZEZUMUpFU1ZKRlExUlBVbFJTUTBoUVFWSkJUVVZVUlZKVlVrTkZRbE5EVWtsQ1JVRlNSRTlYVGtGRFJVbE9SRTVMUTB0VlFsTkRVa2xDUlVoVVZGQXZRVVJVVUM4PSdcbiIsCiAgICAibW9kdWxlLmV4cG9ydHMgPSAnQUdGemJRRUFBQUFCTUFoZ0FYOEJmMkFEZjM5L0FYOWdCSDkvZjM4QmYyQUFBR0FEZjM5L0FHQUJmd0JnQW45L0FHQUdmMzkvZjM5L0FBTExBUWdEWlc1MkdIZGhjMjFmYjI1ZmFHVmhaR1Z5YzE5amIyMXdiR1YwWlFBQ0EyVnVkaFYzWVhOdFgyOXVYMjFsYzNOaFoyVmZZbVZuYVc0QUFBTmxibllMZDJGemJWOXZibDkxY213QUFRTmxibllPZDJGemJWOXZibDl6ZEdGMGRYTUFBUU5sYm5ZVWQyRnpiVjl2Ymw5b1pXRmtaWEpmWm1sbGJHUUFBUU5sYm5ZVWQyRnpiVjl2Ymw5b1pXRmtaWEpmZG1Gc2RXVUFBUU5sYm5ZTWQyRnpiVjl2Ymw5aWIyUjVBQUVEWlc1MkdIZGhjMjFmYjI1ZmJXVnpjMkZuWlY5amIyMXdiR1YwWlFBQUEwWkZBd01FQUFBRkFBQUFBQUFBQlFFRkFBVUZCUUFBQmdBQUFBQUdCZ1lHQVFFQkFRRUJBUUVCQVFFQkFRRUJBUUVCQVFFQkFRRUJBUUFCQUFBQkFRY0FBQVVGQXdBQkJBVUJjQUVTRWdVREFRQUNCZ2dCZndGQmdOUUVDd2ZSQlNJR2JXVnRiM0o1QWdBTFgybHVhWFJwWVd4cGVtVUFDUmxmWDJsdVpHbHlaV04wWDJaMWJtTjBhVzl1WDNSaFlteGxBUUFMYkd4b2RIUndYMmx1YVhRQUNoaHNiR2gwZEhCZmMyaHZkV3hrWDJ0bFpYQmZZV3hwZG1VQVFReHNiR2gwZEhCZllXeHNiMk1BREFadFlXeHNiMk1BUmd0c2JHaDBkSEJmWm5KbFpRQU5CR1p5WldVQVNBOXNiR2gwZEhCZloyVjBYM1I1Y0dVQURoVnNiR2gwZEhCZloyVjBYMmgwZEhCZmJXRnFiM0lBRHhWc2JHaDBkSEJmWjJWMFgyaDBkSEJmYldsdWIzSUFFQkZzYkdoMGRIQmZaMlYwWDIxbGRHaHZaQUFSRm14c2FIUjBjRjluWlhSZmMzUmhkSFZ6WDJOdlpHVUFFaEpzYkdoMGRIQmZaMlYwWDNWd1ozSmhaR1VBRXd4c2JHaDBkSEJmY21WelpYUUFGQTVzYkdoMGRIQmZaWGhsWTNWMFpRQVZGR3hzYUhSMGNGOXpaWFIwYVc1bmMxOXBibWwwQUJZTmJHeG9kSFJ3WDJacGJtbHphQUFYREd4c2FIUjBjRjl3WVhWelpRQVlEV3hzYUhSMGNGOXlaWE4xYldVQUdSdHNiR2gwZEhCZmNtVnpkVzFsWDJGbWRHVnlYM1Z3WjNKaFpHVUFHaEJzYkdoMGRIQmZaMlYwWDJWeWNtNXZBQnNYYkd4b2RIUndYMmRsZEY5bGNuSnZjbDl5WldGemIyNEFIQmRzYkdoMGRIQmZjMlYwWDJWeWNtOXlYM0psWVhOdmJnQWRGR3hzYUhSMGNGOW5aWFJmWlhKeWIzSmZjRzl6QUI0UmJHeG9kSFJ3WDJWeWNtNXZYMjVoYldVQUh4SnNiR2gwZEhCZmJXVjBhRzlrWDI1aGJXVUFJQkpzYkdoMGRIQmZjM1JoZEhWelgyNWhiV1VBSVJwc2JHaDBkSEJmYzJWMFgyeGxibWxsYm5SZmFHVmhaR1Z5Y3dBaUlXeHNhSFIwY0Y5elpYUmZiR1Z1YVdWdWRGOWphSFZ1YTJWa1gyeGxibWQwYUFBakhXeHNhSFIwY0Y5elpYUmZiR1Z1YVdWdWRGOXJaV1Z3WDJGc2FYWmxBQ1FrYkd4b2RIUndYM05sZEY5c1pXNXBaVzUwWDNSeVlXNXpabVZ5WDJWdVkyOWthVzVuQUNVWWJHeG9kSFJ3WDIxbGMzTmhaMlZmYm1WbFpITmZaVzltQUQ4SkZ3RUFRUUVMRVFFQ0F3UUZDd1lITlRrM01TOHRKeXNwQ3JMZ0FrVUNBQXNJQUJDSWdJQ0FBQXNaQUNBQUVNS0FnSUFBR2lBQUlBSTJBamdnQUNBQk9nQW9DeHdBSUFBZ0FDOEJNaUFBTFFBdUlBQVF3WUNBZ0FBUWdJQ0FnQUFMS2dFQmYwSEFBQkRHZ0lDQUFDSUJFTUtBZ0lBQUdpQUJRWUNJZ0lBQU5nSTRJQUVnQURvQUtDQUJDd29BSUFBUXlJQ0FnQUFMQndBZ0FDMEFLQXNIQUNBQUxRQXFDd2NBSUFBdEFDc0xCd0FnQUMwQUtRc0hBQ0FBTHdFeUN3Y0FJQUF0QUM0TFJRRUVmeUFBS0FJWUlRRWdBQzBBTFNFQ0lBQXRBQ2doQXlBQUtBSTRJUVFnQUJEQ2dJQ0FBQm9nQUNBRU5nSTRJQUFnQXpvQUtDQUFJQUk2QUMwZ0FDQUJOZ0lZQ3hFQUlBQWdBU0FCSUFKcUVNT0FnSUFBQ3hBQUlBQkJBRUhjQUJETWdJQ0FBQm9MWndFQmYwRUFJUUVDUUNBQUtBSU1EUUFDUUFKQUFrQUNRQ0FBTFFBdkRnTUJBQU1DQ3lBQUtBSTRJZ0ZGRFFBZ0FTZ0NMQ0lCUlEwQUlBQWdBUkdBZ0lDQUFBQWlBUTBEQzBFQUR3c1F5b0NBZ0FBQUN5QUFRY09XZ0lBQU5nSVFRUTRoQVFzZ0FRc2VBQUpBSUFBb0Fnd05BQ0FBUWRHYmdJQUFOZ0lRSUFCQkZUWUNEQXNMRmdBQ1FDQUFLQUlNUVJWSERRQWdBRUVBTmdJTUN3c1dBQUpBSUFBb0FneEJGa2NOQUNBQVFRQTJBZ3dMQ3djQUlBQW9BZ3dMQndBZ0FDZ0NFQXNKQUNBQUlBRTJBaEFMQndBZ0FDZ0NGQXNpQUFKQUlBQkJKRWtOQUJES2dJQ0FBQUFMSUFCQkFuUkJvTE9BZ0FCcUtBSUFDeUlBQWtBZ0FFRXVTUTBBRU1xQWdJQUFBQXNnQUVFQ2RFR3d0SUNBQUdvb0FnQUw3Z3NCQVg5QjY2aUFnQUFoQVFKQUFrQUNRQUpBQWtBQ1FBSkFBa0FDUUFKQUFrQUNRQUpBQWtBQ1FBSkFBa0FDUUFKQUFrQUNRQUpBQWtBQ1FBSkFBa0FDUUFKQUFrQUNRQUpBQWtBQ1FBSkFBa0FDUUFKQUFrQUNRQUpBQWtBQ1FBSkFBa0FDUUFKQUFrQUNRQUpBQWtBQ1FBSkFBa0FDUUFKQUFrQUNRQUpBQWtBQ1FBSkFBa0FDUUFKQUFrQUNRQUpBQWtBQ1FBSkFBa0FDUUFKQUFrQUNRQUpBQWtBQ1FBSkFBa0FDUUFKQUFrQUNRQUpBQWtBQ1FBSkFBa0FDUUFKQUFrQUNRQUpBQWtBQ1FBSkFBa0FDUUFKQUlBQkJuSDlxRHZRRFkySUFBV0ZoWVdGaFlRSURCQVZoWVdGaFlXRmhZV0ZoWVdGaFlXRmhZV0ZoWVdGaFlXRmhZV0ZoWVdGaFlXRmhZV0ZoWVdGaFlXRmhZV0ZoWVdGaFlXRmhZV0ZoWVdGaFlXRmhZV0ZoWVdGaFlXRmhZV0ZoWVdGaFlXRmhZV0ZoWVdGaEJnY0lDUW9MREEwT0QyRmhZV0ZoRUdGaFlXRmhZV0ZoWVdGaEVXRmhZV0ZoWVdGaFlXRmhZV0ZoWVdGaFlXRmhZV0ZoWVdGaFlXRmhZV0ZoWVdGaFlXRmhZV0ZoWVdGaFlXRmhZV0ZoWVdGaFlXRmhZV0ZoWVdGaFlXRmhZV0ZoWVdGaFlSSVRGQlVXRnhnWkdodGhZV0ZoWVdGaFlXRmhZV0ZoWVdGaFlXRmhZV0ZoWVdGaFlXRmhZV0ZoWVdGaFlXRmhZV0ZoWVdGaFlXRmhZV0ZoWVdGaFlXRmhZV0ZoWVdGaFlXRmhZV0ZoWVdGaFlXRmhZV0ZoWVdGaFlXRmhZV0ZoWVdGaFlXRmhIQjBlSHlBaElpTWtKU1luS0NrcUt5d3RMaTh3TVRJek5EVTJZVGM0T1RwaFlXRmhZV0ZoWVR0aFlXRThZV0ZoWVQwK1AyRmhZV0ZoWVdGaFFHRmhRV0ZoWVdGaFlXRmhZV0ZoWVdGaFlXRmhZV0ZoWVdGaFlXRmhZV0ZoWVVKRFJFVkdSMGhKU2t0TVRVNVBVRkZTVTJGaFlXRmhZV0ZoVkZWV1YxaFpXbHRoWEYxaFlXRmhZV0ZoWVdGaFlXRmhZV0ZoWVdGaFlXRmhZV0ZoWVdGaFlXRmVZV0ZoWVdGaFlXRmhZV0ZoWVdGaFlXRmhZV0ZoWVdGaFlXRmhZV0ZoWVdGaFlXRmhYMkJoQzBIaHA0Q0FBQThMUWFTaGdJQUFEd3RCeTZ5QWdBQVBDMEgrc1lDQUFBOExRY0NrZ0lBQUR3dEJxNlNBZ0FBUEMwR05xSUNBQUE4TFFlS21nSUFBRHd0QmdMQ0FnQUFQQzBHNXI0Q0FBQThMUWRla2dJQUFEd3RCNzUrQWdBQVBDMEhobjRDQUFBOExRZnFmZ0lBQUR3dEI4cUNBZ0FBUEMwR29yNENBQUE4TFFhNnlnSUFBRHd0QmlMQ0FnQUFQQzBIc3A0Q0FBQThMUVlLaWdJQUFEd3RCanAyQWdBQVBDMEhRcm9DQUFBOExRY3FqZ0lBQUR3dEJ4YktBZ0FBUEMwSGZuSUNBQUE4TFFkS2NnSUFBRHd0QnhLQ0FnQUFQQzBIWG9JQ0FBQThMUWFLZmdJQUFEd3RCN2E2QWdBQVBDMEdyc0lDQUFBOExRZFNsZ0lBQUR3dEJ6SzZBZ0FBUEMwSDZyb0NBQUE4TFFmeXJnSUFBRHd0QjByQ0FnQUFQQzBIeG5ZQ0FBQThMUWJ1Z2dJQUFEd3RCOTZ1QWdBQVBDMEdRc1lDQUFBOExRZGV4Z0lBQUR3dEJvcTJBZ0FBUEMwSFVwNENBQUE4TFFlQ3JnSUFBRHd0Qm42eUFnQUFQQzBIcnNZQ0FBQThMUWRXZmdJQUFEd3RCeXJHQWdBQVBDMEhlcFlDQUFBOExRZFNlZ0lBQUR3dEI5SnlBZ0FBUEMwR25zb0NBQUE4TFFiR2RnSUFBRHd0Qm9KMkFnQUFQQzBHNXNZQ0FBQThMUWJ5d2dJQUFEd3RCa3FHQWdBQVBDMEd6cG9DQUFBOExRZW1zZ0lBQUR3dEJySjZBZ0FBUEMwSFVxNENBQUE4TFFmZW1nSUFBRHd0QmdLYUFnQUFQQzBHd29ZQ0FBQThMUWY2ZWdJQUFEd3RCamFPQWdBQVBDMEdKcllDQUFBOExRZmVpZ0lBQUR3dEJvTEdBZ0FBUEMwR3VuNENBQUE4TFFjYWxnSUFBRHd0QjZKNkFnQUFQQzBHVG9vQ0FBQThMUWNLdmdJQUFEd3RCdzUyQWdBQVBDMEdMcklDQUFBOExRZUdkZ0lBQUR3dEJqYStBZ0FBUEMwSHFvWUNBQUE4TFFiU3RnSUFBRHd0QjBxK0FnQUFQQzBIZnNvQ0FBQThMUWRLeWdJQUFEd3RCOExDQWdBQVBDMEdwb29DQUFBOExRZm1qZ0lBQUR3dEJtWjZBZ0FBUEMwRzFySUNBQUE4TFFadXdnSUFBRHd0QmtyS0FnQUFQQzBHMnE0Q0FBQThMUWNLaWdJQUFEd3RCK0xLQWdBQVBDMEdlcFlDQUFBOExRZENpZ0lBQUR3dEJ1cDZBZ0FBUEMwR0Jub0NBQUE4TEVNcUFnSUFBQUF0QjFxR0FnQUFoQVFzZ0FRc1dBQ0FBSUFBdEFDMUIvZ0Z4SUFGQkFFZHlPZ0F0Q3hrQUlBQWdBQzBBTFVIOUFYRWdBVUVBUjBFQmRISTZBQzBMR1FBZ0FDQUFMUUF0UWZzQmNTQUJRUUJIUVFKMGNqb0FMUXNaQUNBQUlBQXRBQzFCOXdGeElBRkJBRWRCQTNSeU9nQXRDeTRCQW45QkFDRURBa0FnQUNnQ09DSUVSUTBBSUFRb0FnQWlCRVVOQUNBQUlBUVJnSUNBZ0FBQUlRTUxJQU1MU1FFQ2YwRUFJUU1DUUNBQUtBSTRJZ1JGRFFBZ0JDZ0NCQ0lFUlEwQUlBQWdBU0FDSUFGcklBUVJnWUNBZ0FBQUlnTkJmMGNOQUNBQVFjYVJnSUFBTmdJUVFSZ2hBd3NnQXdzdUFRSi9RUUFoQXdKQUlBQW9BamdpQkVVTkFDQUVLQUl3SWdSRkRRQWdBQ0FFRVlDQWdJQUFBQ0VEQ3lBREMwa0JBbjlCQUNFREFrQWdBQ2dDT0NJRVJRMEFJQVFvQWdnaUJFVU5BQ0FBSUFFZ0FpQUJheUFFRVlHQWdJQUFBQ0lEUVg5SERRQWdBRUgyaW9DQUFEWUNFRUVZSVFNTElBTUxMZ0VDZjBFQUlRTUNRQ0FBS0FJNElnUkZEUUFnQkNnQ05DSUVSUTBBSUFBZ0JCR0FnSUNBQUFBaEF3c2dBd3RKQVFKL1FRQWhBd0pBSUFBb0FqZ2lCRVVOQUNBRUtBSU1JZ1JGRFFBZ0FDQUJJQUlnQVdzZ0JCR0JnSUNBQUFBaUEwRi9SdzBBSUFCQjdacUFnQUEyQWhCQkdDRURDeUFEQ3k0QkFuOUJBQ0VEQWtBZ0FDZ0NPQ0lFUlEwQUlBUW9BamdpQkVVTkFDQUFJQVFSZ0lDQWdBQUFJUU1MSUFNTFNRRUNmMEVBSVFNQ1FDQUFLQUk0SWdSRkRRQWdCQ2dDRUNJRVJRMEFJQUFnQVNBQ0lBRnJJQVFSZ1lDQWdBQUFJZ05CZjBjTkFDQUFRWldRZ0lBQU5nSVFRUmdoQXdzZ0F3c3VBUUovUVFBaEF3SkFJQUFvQWpnaUJFVU5BQ0FFS0FJOElnUkZEUUFnQUNBRUVZQ0FnSUFBQUNFREN5QURDMGtCQW45QkFDRURBa0FnQUNnQ09DSUVSUTBBSUFRb0FoUWlCRVVOQUNBQUlBRWdBaUFCYXlBRUVZR0FnSUFBQUNJRFFYOUhEUUFnQUVHcW00Q0FBRFlDRUVFWUlRTUxJQU1MTGdFQ2YwRUFJUU1DUUNBQUtBSTRJZ1JGRFFBZ0JDZ0NRQ0lFUlEwQUlBQWdCQkdBZ0lDQUFBQWhBd3NnQXd0SkFRSi9RUUFoQXdKQUlBQW9BamdpQkVVTkFDQUVLQUlZSWdSRkRRQWdBQ0FCSUFJZ0FXc2dCQkdCZ0lDQUFBQWlBMEYvUncwQUlBQkI3Wk9BZ0FBMkFoQkJHQ0VEQ3lBREN5NEJBbjlCQUNFREFrQWdBQ2dDT0NJRVJRMEFJQVFvQWtRaUJFVU5BQ0FBSUFRUmdJQ0FnQUFBSVFNTElBTUxMZ0VDZjBFQUlRTUNRQ0FBS0FJNElnUkZEUUFnQkNnQ0pDSUVSUTBBSUFBZ0JCR0FnSUNBQUFBaEF3c2dBd3N1QVFKL1FRQWhBd0pBSUFBb0FqZ2lCRVVOQUNBRUtBSXNJZ1JGRFFBZ0FDQUVFWUNBZ0lBQUFDRURDeUFEQzBrQkFuOUJBQ0VEQWtBZ0FDZ0NPQ0lFUlEwQUlBUW9BaWdpQkVVTkFDQUFJQUVnQWlBQmF5QUVFWUdBZ0lBQUFDSURRWDlIRFFBZ0FFSDJpSUNBQURZQ0VFRVlJUU1MSUFNTExnRUNmMEVBSVFNQ1FDQUFLQUk0SWdSRkRRQWdCQ2dDVUNJRVJRMEFJQUFnQkJHQWdJQ0FBQUFoQXdzZ0F3dEpBUUovUVFBaEF3SkFJQUFvQWpnaUJFVU5BQ0FFS0FJY0lnUkZEUUFnQUNBQklBSWdBV3NnQkJHQmdJQ0FBQUFpQTBGL1J3MEFJQUJCd3BtQWdBQTJBaEJCR0NFREN5QURDeTRCQW45QkFDRURBa0FnQUNnQ09DSUVSUTBBSUFRb0FrZ2lCRVVOQUNBQUlBUVJnSUNBZ0FBQUlRTUxJQU1MU1FFQ2YwRUFJUU1DUUNBQUtBSTRJZ1JGRFFBZ0JDZ0NJQ0lFUlEwQUlBQWdBU0FDSUFGcklBUVJnWUNBZ0FBQUlnTkJmMGNOQUNBQVFaU1VnSUFBTmdJUVFSZ2hBd3NnQXdzdUFRSi9RUUFoQXdKQUlBQW9BamdpQkVVTkFDQUVLQUpNSWdSRkRRQWdBQ0FFRVlDQWdJQUFBQ0VEQ3lBREN5NEJBbjlCQUNFREFrQWdBQ2dDT0NJRVJRMEFJQVFvQWxRaUJFVU5BQ0FBSUFRUmdJQ0FnQUFBSVFNTElBTUxMZ0VDZjBFQUlRTUNRQ0FBS0FJNElnUkZEUUFnQkNnQ1dDSUVSUTBBSUFBZ0JCR0FnSUNBQUFBaEF3c2dBd3RGQVFGL0FrQUNRQ0FBTHdFd1FSUnhRUlJIRFFCQkFTRURJQUF0QUNoQkFVWU5BU0FBTHdFeVFlVUFSaUVEREFFTElBQXRBQ2xCQlVZaEF3c2dBQ0FET2dBdVFRQUwvZ0VCQTM5QkFTRURBa0FnQUM4Qk1DSUVRUWh4RFFBZ0FDa0RJRUlBVWlFREN3SkFBa0FnQUMwQUxrVU5BRUVCSVFVZ0FDMEFLVUVGUmcwQlFRRWhCU0FFUWNBQWNVVWdBM0ZCQVVjTkFRdEJBQ0VGSUFSQndBQnhEUUJCQWlFRklBUkIvLzhEY1NJRFFRaHhEUUFDUUNBRFFZQUVjVVVOQUFKQUlBQXRBQ2hCQVVjTkFDQUFMUUF0UVFweERRQkJCUThMUVFRUEN3SkFJQU5CSUhFTkFBSkFJQUF0QUNoQkFVWU5BQ0FBTHdFeVFmLy9BM0VpQUVHY2YycEI1QUJKRFFBZ0FFSE1BVVlOQUNBQVFiQUNSZzBBUVFRaEJTQUVRU2h4UlEwQ0lBTkJpQVJ4UVlBRVJnMENDMEVBRHd0QkFFRURJQUFwQXlCUUd5RUZDeUFGQzJJQkFuOUJBQ0VCQWtBZ0FDMEFLRUVCUmcwQUlBQXZBVEpCLy84RGNTSUNRWngvYWtIa0FFa05BQ0FDUWN3QlJnMEFJQUpCc0FKR0RRQWdBQzhCTUNJQVFjQUFjUTBBUVFFaEFTQUFRWWdFY1VHQUJFWU5BQ0FBUVNoeFJTRUJDeUFCQzZjQkFRTi9Ba0FDUUFKQUlBQXRBQ3BGRFFBZ0FDMEFLMFVOQUVFQUlRTWdBQzhCTUNJRVFRSnhSUTBCREFJTFFRQWhBeUFBTHdFd0lnUkJBWEZGRFFFTFFRRWhBeUFBTFFBb1FRRkdEUUFnQUM4Qk1rSC8vd054SWdWQm5IOXFRZVFBU1EwQUlBVkJ6QUZHRFFBZ0JVR3dBa1lOQUNBRVFjQUFjUTBBUVFBaEF5QUVRWWdFY1VHQUJFWU5BQ0FFUVNoeFFRQkhJUU1MSUFCQkFEc0JNQ0FBUVFBNkFDOGdBd3VaQVFFQ2Z3SkFBa0FDUUNBQUxRQXFSUTBBSUFBdEFDdEZEUUJCQUNFQklBQXZBVEFpQWtFQ2NVVU5BUXdDQzBFQUlRRWdBQzhCTUNJQ1FRRnhSUTBCQzBFQklRRWdBQzBBS0VFQlJnMEFJQUF2QVRKQi8vOERjU0lBUVp4L2FrSGtBRWtOQUNBQVFjd0JSZzBBSUFCQnNBSkdEUUFnQWtIQUFIRU5BRUVBSVFFZ0FrR0lCSEZCZ0FSR0RRQWdBa0VvY1VFQVJ5RUJDeUFCQzBrQkFYc2dBRUVRYXYwTUFBQUFBQUFBQUFBQUFBQUFBQUFBQUNJQi9Rc0RBQ0FBSUFIOUN3TUFJQUJCTUdvZ0FmMExBd0FnQUVFZ2FpQUIvUXNEQUNBQVFkMEJOZ0ljUVFBTGV3RUJmd0pBSUFBb0Fnd2lBdzBBQWtBZ0FDZ0NCRVVOQUNBQUlBRTJBZ1FMQWtBZ0FDQUJJQUlReElDQWdBQWlBdzBBSUFBb0Fnd1BDeUFBSUFNMkFoeEJBQ0VESUFBb0FnUWlBVVVOQUNBQUlBRWdBaUFBS0FJSUVZR0FnSUFBQUNJQlJRMEFJQUFnQWpZQ0ZDQUFJQUUyQWd3Z0FTRURDeUFEQytUekFRTU9md04rQkg4amdJQ0FnQUJCRUdzaUF5U0FnSUNBQUNBQklRUWdBU0VGSUFFaEJpQUJJUWNnQVNFSUlBRWhDU0FCSVFvZ0FTRUxJQUVoRENBQklRMGdBU0VPSUFFaER3SkFBa0FDUUFKQUFrQUNRQUpBQWtBQ1FBSkFBa0FDUUFKQUFrQUNRQUpBQWtBQ1FBSkFBa0FDUUFKQUFrQUNRQUpBQWtBQ1FBSkFBa0FDUUFKQUFrQUNRQUpBQWtBQ1FBSkFBa0FDUUFKQUFrQUNRQUpBQWtBQ1FBSkFBa0FDUUFKQUFrQUNRQUpBQWtBQ1FBSkFBa0FDUUFKQUFrQUNRQUpBQWtBQ1FBSkFBa0FDUUFKQUFrQUNRQUpBQWtBQ1FBSkFBa0FDUUFKQUFrQUNRQUpBQWtBQ1FBSkFBa0FDUUFKQUFrQUNRQUpBQWtBQ1FBSkFBa0FDUUFKQUFrQUNRQUpBQWtBQ1FBSkFBa0FDUUFKQUFrQUNRQUpBQWtBQ1FBSkFBa0FDUUFKQUFrQUNRQUpBQWtBQ1FBSkFBa0FDUUFKQUFrQUNRQUpBQWtBQ1FBSkFBa0FDUUFKQUFrQUNRQUpBQWtBQ1FBSkFBa0FDUUFKQUFrQUNRQUpBQWtBQ1FBSkFBa0FDUUFKQUFrQUNRQUpBQWtBQ1FBSkFBa0FDUUFKQUFrQUNRQUpBQWtBQ1FBSkFBa0FDUUFKQUFrQUNRQUpBQWtBQ1FBSkFBa0FDUUFKQUFrQUNRQUpBQWtBQ1FBSkFBa0FDUUFKQUFrQUNRQUpBQWtBQ1FBSkFBa0FDUUFKQUFrQUNRQUpBQWtBQ1FBSkFBa0FDUUFKQUFrQUNRQUpBQWtBQ1FBSkFBa0FDUUFKQUFrQUNRQUpBQWtBQ1FBSkFBa0FDUUFKQUFrQUNRQUpBQWtBQ1FDQUFLQUljSWhCQmYyb08zUUhhQVFIWkFRSURCQVVHQndnSkNnc01EUTdZQVE4UTF3RVJFdFlCRXhRVkZoY1lHUm9iNEFIZkFSd2RIdFVCSHlBaElpTWtKZFFCSmljb0tTb3JMTk1CMGdFdEx0RUIwQUV2TURFeU16UTFOamM0T1RvN1BEMCtQMEJCUWtORVJVYmJBVWRJU1VyUEFjNEJTODBCVE13QlRVNVBVRkZTVTFSVlZsZFlXVnBiWEYxZVgyQmhZbU5rWldabmFHbHFhMnh0Ym05d2NYSnpkSFYyZDNoNWVudDhmWDUvZ0FHQkFZSUJnd0dFQVlVQmhnR0hBWWdCaVFHS0FZc0JqQUdOQVk0Qmp3R1FBWkVCa2dHVEFaUUJsUUdXQVpjQm1BR1pBWm9CbXdHY0FaMEJuZ0dmQWFBQm9RR2lBYU1CcEFHbEFhWUJwd0dvQWFrQnFnR3JBYXdCclFHdUFhOEJzQUd4QWJJQnN3RzBBYlVCdGdHM0Fjc0J5Z0c0QWNrQnVRSElBYm9CdXdHOEFiMEJ2Z0cvQWNBQndRSENBY01CeEFIRkFjWUJBTndCQzBFQUlSQU14Z0VMUVE0aEVBekZBUXRCRFNFUURNUUJDMEVQSVJBTXd3RUxRUkFoRUF6Q0FRdEJFeUVRRE1FQkMwRVVJUkFNd0FFTFFSVWhFQXkvQVF0QkZpRVFETDRCQzBFWElSQU12UUVMUVJnaEVBeThBUXRCR1NFUURMc0JDMEVhSVJBTXVnRUxRUnNoRUF5NUFRdEJIQ0VRRExnQkMwRUlJUkFNdHdFTFFSMGhFQXkyQVF0QklDRVFETFVCQzBFZklSQU10QUVMUVFjaEVBeXpBUXRCSVNFUURMSUJDMEVpSVJBTXNRRUxRUjRoRUF5d0FRdEJJeUVRREs4QkMwRVNJUkFNcmdFTFFSRWhFQXl0QVF0QkpDRVFES3dCQzBFbElSQU1xd0VMUVNZaEVBeXFBUXRCSnlFUURLa0JDMEhEQVNFUURLZ0JDMEVwSVJBTXB3RUxRU3NoRUF5bUFRdEJMQ0VRREtVQkMwRXRJUkFNcEFFTFFTNGhFQXlqQVF0Qkx5RVFES0lCQzBIRUFTRVFES0VCQzBFd0lSQU1vQUVMUVRRaEVBeWZBUXRCRENFUURKNEJDMEV4SVJBTW5RRUxRVEloRUF5Y0FRdEJNeUVRREpzQkMwRTVJUkFNbWdFTFFUVWhFQXlaQVF0QnhRRWhFQXlZQVF0QkN5RVFESmNCQzBFNklSQU1sZ0VMUVRZaEVBeVZBUXRCQ2lFUURKUUJDMEUzSVJBTWt3RUxRVGdoRUF5U0FRdEJQQ0VRREpFQkMwRTdJUkFNa0FFTFFUMGhFQXlQQVF0QkNTRVFESTRCQzBFb0lSQU1qUUVMUVQ0aEVBeU1BUXRCUHlFUURJc0JDMEhBQUNFUURJb0JDMEhCQUNFUURJa0JDMEhDQUNFUURJZ0JDMEhEQUNFUURJY0JDMEhFQUNFUURJWUJDMEhGQUNFUURJVUJDMEhHQUNFUURJUUJDMEVxSVJBTWd3RUxRY2NBSVJBTWdnRUxRY2dBSVJBTWdRRUxRY2tBSVJBTWdBRUxRY29BSVJBTWZ3dEJ5d0FoRUF4K0MwSE5BQ0VRREgwTFFjd0FJUkFNZkF0QnpnQWhFQXg3QzBIUEFDRVFESG9MUWRBQUlSQU1lUXRCMFFBaEVBeDRDMEhTQUNFUURIY0xRZE1BSVJBTWRndEIxQUFoRUF4MUMwSFdBQ0VRREhRTFFkVUFJUkFNY3d0QkJpRVFESElMUWRjQUlSQU1jUXRCQlNFUURIQUxRZGdBSVJBTWJ3dEJCQ0VRREc0TFFka0FJUkFNYlF0QjJnQWhFQXhzQzBIYkFDRVFER3NMUWR3QUlSQU1hZ3RCQXlFUURHa0xRZDBBSVJBTWFBdEIzZ0FoRUF4bkMwSGZBQ0VRREdZTFFlRUFJUkFNWlF0QjRBQWhFQXhrQzBIaUFDRVFER01MUWVNQUlSQU1ZZ3RCQWlFUURHRUxRZVFBSVJBTVlBdEI1UUFoRUF4ZkMwSG1BQ0VRREY0TFFlY0FJUkFNWFF0QjZBQWhFQXhjQzBIcEFDRVFERnNMUWVvQUlSQU1XZ3RCNndBaEVBeFpDMEhzQUNFUURGZ0xRZTBBSVJBTVZ3dEI3Z0FoRUF4V0MwSHZBQ0VRREZVTFFmQUFJUkFNVkF0QjhRQWhFQXhUQzBIeUFDRVFERklMUWZNQUlSQU1VUXRCOUFBaEVBeFFDMEgxQUNFUURFOExRZllBSVJBTVRndEI5d0FoRUF4TkMwSDRBQ0VRREV3TFFma0FJUkFNU3d0QitnQWhFQXhLQzBIN0FDRVFERWtMUWZ3QUlSQU1TQXRCL1FBaEVBeEhDMEgrQUNFUURFWUxRZjhBSVJBTVJRdEJnQUVoRUF4RUMwR0JBU0VRREVNTFFZSUJJUkFNUWd0Qmd3RWhFQXhCQzBHRUFTRVFERUFMUVlVQklSQU1Qd3RCaGdFaEVBdytDMEdIQVNFUUREMExRWWdCSVJBTVBBdEJpUUVoRUF3N0MwR0tBU0VRRERvTFFZc0JJUkFNT1F0QmpBRWhFQXc0QzBHTkFTRVFERGNMUVk0QklSQU1OZ3RCandFaEVBdzFDMEdRQVNFUUREUUxRWkVCSVJBTU13dEJrZ0VoRUF3eUMwR1RBU0VRRERFTFFaUUJJUkFNTUF0QmxRRWhFQXd2QzBHV0FTRVFEQzRMUVpjQklSQU1MUXRCbUFFaEVBd3NDMEdaQVNFUURDc0xRWm9CSVJBTUtndEJtd0VoRUF3cEMwR2NBU0VRRENnTFFaMEJJUkFNSnd0Qm5nRWhFQXdtQzBHZkFTRVFEQ1VMUWFBQklSQU1KQXRCb1FFaEVBd2pDMEdpQVNFUURDSUxRYU1CSVJBTUlRdEJwQUVoRUF3Z0MwR2xBU0VRREI4TFFhWUJJUkFNSGd0QnB3RWhFQXdkQzBHb0FTRVFEQndMUWFrQklSQU1Hd3RCcWdFaEVBd2FDMEdyQVNFUURCa0xRYXdCSVJBTUdBdEJyUUVoRUF3WEMwR3VBU0VRREJZTFFRRWhFQXdWQzBHdkFTRVFEQlFMUWJBQklSQU1Fd3RCc1FFaEVBd1NDMEd6QVNFUURCRUxRYklCSVJBTUVBdEJ0QUVoRUF3UEMwRzFBU0VRREE0TFFiWUJJUkFNRFF0QnR3RWhFQXdNQzBHNEFTRVFEQXNMUWJrQklSQU1DZ3RCdWdFaEVBd0pDMEc3QVNFUURBZ0xRY1lCSVJBTUJ3dEJ2QUVoRUF3R0MwRzlBU0VRREFVTFFiNEJJUkFNQkF0QnZ3RWhFQXdEQzBIQUFTRVFEQUlMUWNJQklSQU1BUXRCd1FFaEVBc0RRQUpBQWtBQ1FBSkFBa0FDUUFKQUFrQUNRQUpBQWtBQ1FBSkFBa0FDUUFKQUFrQUNRQUpBQWtBQ1FBSkFBa0FDUUFKQUFrQUNRQUpBQWtBQ1FBSkFBa0FDUUFKQUFrQUNRQUpBQWtBQ1FBSkFBa0FDUUFKQUFrQUNRQUpBQWtBQ1FBSkFBa0FDUUFKQUFrQUNRQUpBQWtBQ1FBSkFBa0FDUUFKQUFrQUNRQUpBQWtBQ1FBSkFBa0FDUUFKQUFrQUNRQUpBQWtBQ1FBSkFBa0FDUUFKQUFrQUNRQUpBQWtBQ1FBSkFBa0FDUUFKQUFrQUNRQUpBQWtBQ1FBSkFBa0FDUUFKQUFrQUNRQUpBQWtBQ1FBSkFBa0FDUUFKQUFrQUNRQUpBQWtBQ1FBSkFBa0FDUUFKQUFrQUNRQUpBQWtBQ1FBSkFBa0FDUUFKQUFrQUNRQUpBQWtBQ1FBSkFBa0FDUUFKQUFrQUNRQUpBQWtBQ1FBSkFBa0FDUUFKQUFrQUNRQUpBQWtBQ1FBSkFBa0FDUUFKQUFrQUNRQUpBQWtBQ1FBSkFBa0FDUUFKQUFrQUNRQUpBQWtBQ1FBSkFBa0FDUUFKQUFrQUNRQUpBQWtBQ1FBSkFBa0FDUUFKQUFrQUNRQUpBQWtBQ1FBSkFBa0FDUUFKQUFrQUNRQUpBQWtBQ1FBSkFBa0FDUUFKQUFrQUNRQUpBQWtBQ1FBSkFBa0FDUUFKQUFrQUNRQUpBQWtBQ1FBSkFBa0FDUUFKQUFrQUNRQUpBQWtBQ1FBSkFBa0FDUUFKQUFrQUNRQUpBQWtBQ1FBSkFBa0FDUUFKQUFrQUNRQUpBQWtBQ1FBSkFBa0FDUUFKQUFrQUNRQUpBQWtBQ1FBSkFBa0FDUUFKQUFrQUNRQUpBQWtBQ1FBSkFBa0FDUUFKQUFrQUNRQUpBQWtBQ1FBSkFBa0FDUUFKQUFrQUNRQUpBQWtBQ1FBSkFBa0FDUUFKQUFrQUNRQUpBQWtBQ1FBSkFBa0FDUUFKQUFrQUNRQUpBQWtBQ1FBSkFBa0FDUUFKQUFrQUNRQUpBQWtBQ1FBSkFBa0FDUUFKQUFrQUNRQUpBQWtBQ1FBSkFBa0FDUUFKQUFrQUNRQUpBQWtBQ1FBSkFBa0FDUUFKQUFrQUNRQUpBQWtBQ1FBSkFBa0FDUUFKQUFrQUNRQUpBQWtBQ1FBSkFBa0FDUUFKQUFrQUNRQUpBQWtBQ1FBSkFBa0FDUUFKQUFrQUNRQUpBQWtBQ1FBSkFBa0FDUUFKQUFrQUNRQUpBQWtBQ1FBSkFBa0FDUUFKQUFrQUNRQUpBQWtBQ1FBSkFBa0FDUUFKQUFrQUNRQUpBQWtBQ1FBSkFBa0FDUUFKQUFrQUNRQUpBQWtBQ1FBSkFBa0FDUUFKQUFrQUNRQUpBQWtBQ1FBSkFBa0FDUUFKQUFrQUNRQUpBQWtBQ1FBSkFBa0FDUUFKQUFrQUNRQUpBQWtBQ1FBSkFBa0FDUUFKQUFrQUNRQUpBQWtBQ1FBSkFBa0FDUUFKQUFrQUNRQUpBQWtBQ1FBSkFBa0FDUUFKQUFrQUNRQUpBQWtBQ1FBSkFBa0FDUUFKQUFrQUNRQUpBQWtBQ1FBSkFBa0FDUUFKQUFrQUNRQUpBQWtBQ1FBSkFBa0FDUUFKQUFrQUNRQUpBQWtBQ1FBSkFBa0FDUUFKQUFrQUNRQUpBQWtBQ1FBSkFBa0FDUUFKQUFrQUNRQUpBSUJBT3h3RUFBUUlEQkFVR0J3Z0pDZ3NNRFE0UEVCRVNFeFFWRmhjWUdSb2JIQjRmSUNFakpTZy9RRUZFUlVaSFNFbEtTMHhOVDFCUlVsUGVBMWRaVzF4ZFlHSmxabWRvYVdwcmJHMXZjSEZ5YzNSMWRuZDRlWHA3ZkgxK2dBR0NBWVVCaGdHSEFZa0Jpd0dNQVkwQmpnR1BBWkFCa1FHVUFaVUJsZ0dYQVpnQm1RR2FBWnNCbkFHZEFaNEJud0dnQWFFQm9nR2pBYVFCcFFHbUFhY0JxQUdwQWFvQnF3R3NBYTBCcmdHdkFiQUJzUUd5QWJNQnRBRzFBYllCdHdHNEFia0J1Z0c3QWJ3QnZRRytBYjhCd0FIQkFjSUJ3d0hFQWNVQnhnSEhBY2dCeVFIS0Fjc0J6QUhOQWM0Qnp3SFFBZEVCMGdIVEFkUUIxUUhXQWRjQjJBSFpBZG9CMndIY0FkMEIzZ0hnQWVFQjRnSGpBZVFCNVFIbUFlY0I2QUhwQWVvQjZ3SHNBZTBCN2dIdkFmQUI4UUh5QWZNQm1RS2tBckFDL2dMK0Fnc2dBU0lFSUFKSERmTUJRZDBCSVJBTS93TUxJQUVpRUNBQ1J3M2RBVUhEQVNFUURQNERDeUFCSWdFZ0FrY05rQUZCOXdBaEVBejlBd3NnQVNJQklBSkhEWVlCUWU4QUlSQU0vQU1MSUFFaUFTQUNSdzEvUWVvQUlSQU0rd01MSUFFaUFTQUNSdzE3UWVnQUlSQU0rZ01MSUFFaUFTQUNSdzE0UWVZQUlSQU0rUU1MSUFFaUFTQUNSdzBhUVJnaEVBejRBd3NnQVNJQklBSkhEUlJCRWlFUURQY0RDeUFCSWdFZ0FrY05XVUhGQUNFUURQWURDeUFCSWdFZ0FrY05Ta0UvSVJBTTlRTUxJQUVpQVNBQ1J3MUlRVHdoRUF6MEF3c2dBU0lCSUFKSERVRkJNU0VRRFBNREN5QUFMUUF1UVFGR0Rlc0RESWNDQ3lBQUlBRWlBU0FDRU1DQWdJQUFRUUZIRGVZQklBQkNBRGNESUF6bkFRc2dBQ0FCSWdFZ0FoQzBnSUNBQUNJUURlY0JJQUVoQVF6MUFnc0NRQ0FCSWdFZ0FrY05BRUVHSVJBTThBTUxJQUFnQVVFQmFpSUJJQUlRdTRDQWdBQWlFQTNvQVNBQklRRU1NUXNnQUVJQU53TWdRUkloRUF6VkF3c2dBU0lRSUFKSERTdEJIU0VRRE8wREN3SkFJQUVpQVNBQ1JnMEFJQUZCQVdvaEFVRVFJUkFNMUFNTFFRY2hFQXpzQXdzZ0FFSUFJQUFwQXlBaUVTQUNJQUVpRUd1dEloSjlJaE1nRXlBUlZoczNBeUFnRVNBU1ZpSVVSUTNsQVVFSUlSQU02d01MQWtBZ0FTSUJJQUpHRFFBZ0FFR0pnSUNBQURZQ0NDQUFJQUUyQWdRZ0FTRUJRUlFoRUF6U0F3dEJDU0VRRE9vREN5QUJJUUVnQUNrRElGQU41QUVnQVNFQkRQSUNDd0pBSUFFaUFTQUNSdzBBUVFzaEVBenBBd3NnQUNBQlFRRnFJZ0VnQWhDMmdJQ0FBQ0lRRGVVQklBRWhBUXp5QWdzZ0FDQUJJZ0VnQWhDNGdJQ0FBQ0lRRGVVQklBRWhBUXp5QWdzZ0FDQUJJZ0VnQWhDNGdJQ0FBQ0lRRGVZQklBRWhBUXdOQ3lBQUlBRWlBU0FDRUxxQWdJQUFJaEFONXdFZ0FTRUJEUEFDQ3dKQUlBRWlBU0FDUncwQVFROGhFQXpsQXdzZ0FTMEFBQ0lRUVR0R0RRZ2dFRUVOUnczb0FTQUJRUUZxSVFFTTd3SUxJQUFnQVNJQklBSVF1b0NBZ0FBaUVBM29BU0FCSVFFTThnSUxBMEFDUUNBQkxRQUFRZkMxZ0lBQWFpMEFBQ0lRUVFGR0RRQWdFRUVDUnczckFTQUFLQUlFSVJBZ0FFRUFOZ0lFSUFBZ0VDQUJRUUZxSWdFUXVZQ0FnQUFpRUEzcUFTQUJJUUVNOUFJTElBRkJBV29pQVNBQ1J3MEFDMEVTSVJBTTRnTUxJQUFnQVNJQklBSVF1b0NBZ0FBaUVBM3BBU0FCSVFFTUNnc2dBU0lCSUFKSERRWkJHeUVRRE9BREN3SkFJQUVpQVNBQ1J3MEFRUlloRUF6Z0F3c2dBRUdLZ0lDQUFEWUNDQ0FBSUFFMkFnUWdBQ0FCSUFJUXVJQ0FnQUFpRUEzcUFTQUJJUUZCSUNFUURNWURDd0pBSUFFaUFTQUNSZzBBQTBBQ1FDQUJMUUFBUWZDM2dJQUFhaTBBQUNJUVFRSkdEUUFDUUNBUVFYOXFEZ1RsQWV3QkFPc0I3QUVMSUFGQkFXb2hBVUVJSVJBTXlBTUxJQUZCQVdvaUFTQUNSdzBBQzBFVklSQU0zd01MUVJVaEVBemVBd3NEUUFKQUlBRXRBQUJCOExtQWdBQnFMUUFBSWhCQkFrWU5BQ0FRUVg5cURnVGVBZXdCNEFIckFld0JDeUFCUVFGcUlnRWdBa2NOQUF0QkdDRVFETjBEQ3dKQUlBRWlBU0FDUmcwQUlBQkJpNENBZ0FBMkFnZ2dBQ0FCTmdJRUlBRWhBVUVISVJBTXhBTUxRUmtoRUF6Y0F3c2dBVUVCYWlFQkRBSUxBa0FnQVNJVUlBSkhEUUJCR2lFUUROc0RDeUFVSVFFQ1FDQVVMUUFBUVhOcURoVGRBdTRDN2dMdUF1NEM3Z0x1QXU0QzdnTHVBdTRDN2dMdUF1NEM3Z0x1QXU0QzdnTHVBZ0R1QWd0QkFDRVFJQUJCQURZQ0hDQUFRYStMZ0lBQU5nSVFJQUJCQWpZQ0RDQUFJQlJCQVdvMkFoUU0yZ01MQWtBZ0FTMEFBQ0lRUVR0R0RRQWdFRUVOUnczb0FTQUJRUUZxSVFFTTVRSUxJQUZCQVdvaEFRdEJJaUVRREw4REN3SkFJQUVpRUNBQ1J3MEFRUndoRUF6WUF3dENBQ0VSSUJBaEFTQVFMUUFBUVZCcURqZm5BZVlCQVFJREJBVUdCd2dBQUFBQUFBQUFDUW9MREEwT0FBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBUEVCRVNFeFFBQzBFZUlSQU12UU1MUWdJaEVRemxBUXRDQXlFUkRPUUJDMElFSVJFTTR3RUxRZ1VoRVF6aUFRdENCaUVSRE9FQkMwSUhJUkVNNEFFTFFnZ2hFUXpmQVF0Q0NTRVJETjRCQzBJS0lSRU0zUUVMUWdzaEVRemNBUXRDRENFUkROc0JDMElOSVJFTTJnRUxRZzRoRVF6WkFRdENEeUVSRE5nQkMwSUtJUkVNMXdFTFFnc2hFUXpXQVF0Q0RDRVJETlVCQzBJTklSRU0xQUVMUWc0aEVRelRBUXRDRHlFUkROSUJDMElBSVJFQ1FBSkFBa0FDUUFKQUFrQUNRQUpBQWtBQ1FBSkFBa0FDUUFKQUFrQUNRQUpBQWtBQ1FBSkFJQkF0QUFCQlVHb09OK1VCNUFFQUFRSURCQVVHQitZQjVnSG1BZVlCNWdIbUFlWUJDQWtLQ3d3TjVnSG1BZVlCNWdIbUFlWUI1Z0htQWVZQjVnSG1BZVlCNWdIbUFlWUI1Z0htQWVZQjVnSG1BZVlCNWdIbUFlWUI1Z0htQVE0UEVCRVNFK1lCQzBJQ0lSRU01QUVMUWdNaEVRempBUXRDQkNFUkRPSUJDMElGSVJFTTRRRUxRZ1loRVF6Z0FRdENCeUVSRE44QkMwSUlJUkVNM2dFTFFna2hFUXpkQVF0Q0NpRVJETndCQzBJTElSRU0yd0VMUWd3aEVRemFBUXRDRFNFUkROa0JDMElPSVJFTTJBRUxRZzhoRVF6WEFRdENDaUVSRE5ZQkMwSUxJUkVNMVFFTFFnd2hFUXpVQVF0Q0RTRVJETk1CQzBJT0lSRU0wZ0VMUWc4aEVRelJBUXNnQUVJQUlBQXBBeUFpRVNBQ0lBRWlFR3V0SWhKOUloTWdFeUFSVmhzM0F5QWdFU0FTVmlJVVJRM1NBVUVmSVJBTXdBTUxBa0FnQVNJQklBSkdEUUFnQUVHSmdJQ0FBRFlDQ0NBQUlBRTJBZ1FnQVNFQlFTUWhFQXluQXd0QklDRVFETDhEQ3lBQUlBRWlFQ0FDRUw2QWdJQUFRWDlxRGdXMkFRREZBZ0hSQWRJQkMwRVJJUkFNcEFNTElBQkJBVG9BTHlBUUlRRU11d01MSUFFaUFTQUNSdzNTQVVFa0lSQU11d01MSUFFaURTQUNSdzBlUWNZQUlSQU11Z01MSUFBZ0FTSUJJQUlRc29DQWdBQWlFQTNVQVNBQklRRU10UUVMSUFFaUVDQUNSdzBtUWRBQUlSQU11QU1MQWtBZ0FTSUJJQUpIRFFCQktDRVFETGdEQ3lBQVFRQTJBZ1FnQUVHTWdJQ0FBRFlDQ0NBQUlBRWdBUkN4Z0lDQUFDSVFEZE1CSUFFaEFRellBUXNDUUNBQkloQWdBa2NOQUVFcElSQU10d01MSUJBdEFBQWlBVUVnUmcwVUlBRkJDVWNOMHdFZ0VFRUJhaUVCREJVTEFrQWdBU0lCSUFKR0RRQWdBVUVCYWlFQkRCY0xRU29oRUF5MUF3c0NRQ0FCSWhBZ0FrY05BRUVySVJBTXRRTUxBa0FnRUMwQUFDSUJRUWxHRFFBZ0FVRWdSdzNWQVFzZ0FDMEFMRUVJUmczVEFTQVFJUUVNa1FNTEFrQWdBU0lCSUFKSERRQkJMQ0VRRExRREN5QUJMUUFBUVFwSERkVUJJQUZCQVdvaEFRekpBZ3NnQVNJT0lBSkhEZFVCUVM4aEVBeXlBd3NEUUFKQUlBRXRBQUFpRUVFZ1JnMEFBa0FnRUVGMmFnNEVBTndCM0FFQTJnRUxJQUVoQVF6Z0FRc2dBVUVCYWlJQklBSkhEUUFMUVRFaEVBeXhBd3RCTWlFUUlBRWlGQ0FDUmcyd0F5QUNJQlJySUFBb0FnQWlBV29oRlNBVUlBRnJRUU5xSVJZQ1FBTkFJQlF0QUFBaUYwRWdjaUFYSUJkQnYzOXFRZjhCY1VFYVNSdEIvd0Z4SUFGQjhMdUFnQUJxTFFBQVJ3MEJBa0FnQVVFRFJ3MEFRUVloQVF5V0F3c2dBVUVCYWlFQklCUkJBV29pRkNBQ1J3MEFDeUFBSUJVMkFnQU1zUU1MSUFCQkFEWUNBQ0FVSVFFTTJRRUxRVE1oRUNBQkloUWdBa1lOcndNZ0FpQVVheUFBS0FJQUlnRnFJUlVnRkNBQmEwRUlhaUVXQWtBRFFDQVVMUUFBSWhkQklISWdGeUFYUWI5L2FrSC9BWEZCR2trYlFmOEJjU0FCUWZTN2dJQUFhaTBBQUVjTkFRSkFJQUZCQ0VjTkFFRUZJUUVNbFFNTElBRkJBV29oQVNBVVFRRnFJaFFnQWtjTkFBc2dBQ0FWTmdJQURMQURDeUFBUVFBMkFnQWdGQ0VCRE5nQkMwRTBJUkFnQVNJVUlBSkdEYTRESUFJZ0ZHc2dBQ2dDQUNJQmFpRVZJQlFnQVd0QkJXb2hGZ0pBQTBBZ0ZDMEFBQ0lYUVNCeUlCY2dGMEcvZjJwQi93RnhRUnBKRzBIL0FYRWdBVUhRd29DQUFHb3RBQUJIRFFFQ1FDQUJRUVZIRFFCQkJ5RUJESlFEQ3lBQlFRRnFJUUVnRkVFQmFpSVVJQUpIRFFBTElBQWdGVFlDQUF5dkF3c2dBRUVBTmdJQUlCUWhBUXpYQVFzQ1FDQUJJZ0VnQWtZTkFBTkFBa0FnQVMwQUFFR0F2b0NBQUdvdEFBQWlFRUVCUmcwQUlCQkJBa1lOQ2lBQklRRU0zUUVMSUFGQkFXb2lBU0FDUncwQUMwRXdJUkFNcmdNTFFUQWhFQXl0QXdzQ1FDQUJJZ0VnQWtZTkFBTkFBa0FnQVMwQUFDSVFRU0JHRFFBZ0VFRjJhZzRFMlFIYUFkb0IyUUhhQVFzZ0FVRUJhaUlCSUFKSERRQUxRVGdoRUF5dEF3dEJPQ0VRREt3REN3TkFBa0FnQVMwQUFDSVFRU0JHRFFBZ0VFRUpSdzBEQ3lBQlFRRnFJZ0VnQWtjTkFBdEJQQ0VRREtzREN3TkFBa0FnQVMwQUFDSVFRU0JHRFFBQ1FBSkFJQkJCZG1vT0JOb0JBUUhhQVFBTElCQkJMRVlOMndFTElBRWhBUXdFQ3lBQlFRRnFJZ0VnQWtjTkFBdEJQeUVRREtvREN5QUJJUUVNMndFTFFjQUFJUkFnQVNJVUlBSkdEYWdESUFJZ0ZHc2dBQ2dDQUNJQmFpRVdJQlFnQVd0QkJtb2hGd0pBQTBBZ0ZDMEFBRUVnY2lBQlFZREFnSUFBYWkwQUFFY05BU0FCUVFaR0RZNERJQUZCQVdvaEFTQVVRUUZxSWhRZ0FrY05BQXNnQUNBV05nSUFES2tEQ3lBQVFRQTJBZ0FnRkNFQkMwRTJJUkFNamdNTEFrQWdBU0lQSUFKSERRQkJ3UUFoRUF5bkF3c2dBRUdNZ0lDQUFEWUNDQ0FBSUE4MkFnUWdEeUVCSUFBdEFDeEJmMm9PQk0wQjFRSFhBZGtCaHdNTElBRkJBV29oQVF6TUFRc0NRQ0FCSWdFZ0FrWU5BQU5BQWtBZ0FTMEFBQ0lRUVNCeUlCQWdFRUcvZjJwQi93RnhRUnBKRzBIL0FYRWlFRUVKUmcwQUlCQkJJRVlOQUFKQUFrQUNRQUpBSUJCQm5YOXFEaE1BQXdNREF3TURBd0VEQXdNREF3TURBd01DQXdzZ0FVRUJhaUVCUVRFaEVBeVJBd3NnQVVFQmFpRUJRVEloRUF5UUF3c2dBVUVCYWlFQlFUTWhFQXlQQXdzZ0FTRUJETkFCQ3lBQlFRRnFJZ0VnQWtjTkFBdEJOU0VRREtVREMwRTFJUkFNcEFNTEFrQWdBU0lCSUFKR0RRQURRQUpBSUFFdEFBQkJnTHlBZ0FCcUxRQUFRUUZHRFFBZ0FTRUJETk1CQ3lBQlFRRnFJZ0VnQWtjTkFBdEJQU0VRREtRREMwRTlJUkFNb3dNTElBQWdBU0lCSUFJUXNJQ0FnQUFpRUEzV0FTQUJJUUVNQVFzZ0VFRUJhaUVCQzBFOElSQU1od01MQWtBZ0FTSUJJQUpIRFFCQndnQWhFQXlnQXdzQ1FBTkFBa0FnQVMwQUFFRjNhZzRZQUFMK0F2NENoQVArQXY0Qy9nTCtBdjRDL2dMK0F2NEMvZ0wrQXY0Qy9nTCtBdjRDL2dMK0F2NEMvZ0lBL2dJTElBRkJBV29pQVNBQ1J3MEFDMEhDQUNFUURLQURDeUFCUVFGcUlRRWdBQzBBTFVFQmNVVU52UUVnQVNFQkMwRXNJUkFNaFFNTElBRWlBU0FDUnczVEFVSEVBQ0VRREowREN3TkFBa0FnQVMwQUFFR1F3SUNBQUdvdEFBQkJBVVlOQUNBQklRRU10d0lMSUFGQkFXb2lBU0FDUncwQUMwSEZBQ0VRREp3REN5QU5MUUFBSWhCQklFWU5zd0VnRUVFNlJ3MkJBeUFBS0FJRUlRRWdBRUVBTmdJRUlBQWdBU0FORUsrQWdJQUFJZ0VOMEFFZ0RVRUJhaUVCRExNQ0MwSEhBQ0VRSUFFaURTQUNSZzJhQXlBQ0lBMXJJQUFvQWdBaUFXb2hGaUFOSUFGclFRVnFJUmNEUUNBTkxRQUFJaFJCSUhJZ0ZDQVVRYjkvYWtIL0FYRkJHa2tiUWY4QmNTQUJRWkRDZ0lBQWFpMEFBRWNOZ0FNZ0FVRUZSZzMwQWlBQlFRRnFJUUVnRFVFQmFpSU5JQUpIRFFBTElBQWdGallDQUF5YUF3dEJ5QUFoRUNBQklnMGdBa1lObVFNZ0FpQU5heUFBS0FJQUlnRnFJUllnRFNBQmEwRUphaUVYQTBBZ0RTMEFBQ0lVUVNCeUlCUWdGRUcvZjJwQi93RnhRUnBKRzBIL0FYRWdBVUdXd29DQUFHb3RBQUJIRGY4Q0FrQWdBVUVKUncwQVFRSWhBUXoxQWdzZ0FVRUJhaUVCSUExQkFXb2lEU0FDUncwQUN5QUFJQlkyQWdBTW1RTUxBa0FnQVNJTklBSkhEUUJCeVFBaEVBeVpBd3NDUUFKQUlBMHRBQUFpQVVFZ2NpQUJJQUZCdjM5cVFmOEJjVUVhU1J0Qi93RnhRWkovYWc0SEFJQURnQU9BQTRBRGdBTUJnQU1MSUExQkFXb2hBVUUrSVJBTWdBTUxJQTFCQVdvaEFVRS9JUkFNL3dJTFFjb0FJUkFnQVNJTklBSkdEWmNESUFJZ0RXc2dBQ2dDQUNJQmFpRVdJQTBnQVd0QkFXb2hGd05BSUEwdEFBQWlGRUVnY2lBVUlCUkJ2MzlxUWY4QmNVRWFTUnRCL3dGeElBRkJvTUtBZ0FCcUxRQUFSdzM5QWlBQlFRRkdEZkFDSUFGQkFXb2hBU0FOUVFGcUlnMGdBa2NOQUFzZ0FDQVdOZ0lBREpjREMwSExBQ0VRSUFFaURTQUNSZzJXQXlBQ0lBMXJJQUFvQWdBaUFXb2hGaUFOSUFGclFRNXFJUmNEUUNBTkxRQUFJaFJCSUhJZ0ZDQVVRYjkvYWtIL0FYRkJHa2tiUWY4QmNTQUJRYUxDZ0lBQWFpMEFBRWNOL0FJZ0FVRU9SZzN3QWlBQlFRRnFJUUVnRFVFQmFpSU5JQUpIRFFBTElBQWdGallDQUF5V0F3dEJ6QUFoRUNBQklnMGdBa1lObFFNZ0FpQU5heUFBS0FJQUlnRnFJUllnRFNBQmEwRVBhaUVYQTBBZ0RTMEFBQ0lVUVNCeUlCUWdGRUcvZjJwQi93RnhRUnBKRzBIL0FYRWdBVUhBd29DQUFHb3RBQUJIRGZzQ0FrQWdBVUVQUncwQVFRTWhBUXp4QWdzZ0FVRUJhaUVCSUExQkFXb2lEU0FDUncwQUN5QUFJQlkyQWdBTWxRTUxRYzBBSVJBZ0FTSU5JQUpHRFpRRElBSWdEV3NnQUNnQ0FDSUJhaUVXSUEwZ0FXdEJCV29oRndOQUlBMHRBQUFpRkVFZ2NpQVVJQlJCdjM5cVFmOEJjVUVhU1J0Qi93RnhJQUZCME1LQWdBQnFMUUFBUnczNkFnSkFJQUZCQlVjTkFFRUVJUUVNOEFJTElBRkJBV29oQVNBTlFRRnFJZzBnQWtjTkFBc2dBQ0FXTmdJQURKUURDd0pBSUFFaURTQUNSdzBBUWM0QUlSQU1sQU1MQWtBQ1FBSkFBa0FnRFMwQUFDSUJRU0J5SUFFZ0FVRy9mMnBCL3dGeFFScEpHMEgvQVhGQm5YOXFEaE1BL1FMOUF2MEMvUUw5QXYwQy9RTDlBdjBDL1FMOUF2MENBZjBDL1FMOUFnSUQvUUlMSUExQkFXb2hBVUhCQUNFUURQMENDeUFOUVFGcUlRRkJ3Z0FoRUF6OEFnc2dEVUVCYWlFQlFjTUFJUkFNK3dJTElBMUJBV29oQVVIRUFDRVFEUG9DQ3dKQUlBRWlBU0FDUmcwQUlBQkJqWUNBZ0FBMkFnZ2dBQ0FCTmdJRUlBRWhBVUhGQUNFUURQb0NDMEhQQUNFUURKSURDeUFRSVFFQ1FBSkFJQkF0QUFCQmRtb09CQUdvQXFnQ0FLZ0NDeUFRUVFGcUlRRUxRU2NoRUF6NEFnc0NRQ0FCSWdFZ0FrY05BRUhSQUNFUURKRURDd0pBSUFFdEFBQkJJRVlOQUNBQklRRU1qUUVMSUFGQkFXb2hBU0FBTFFBdFFRRnhSUTNIQVNBQklRRU1qQUVMSUFFaUZ5QUNSdzNJQVVIU0FDRVFESThEQzBIVEFDRVFJQUVpRkNBQ1JnMk9BeUFDSUJScklBQW9BZ0FpQVdvaEZpQVVJQUZyUVFGcUlSY0RRQ0FVTFFBQUlBRkIxc0tBZ0FCcUxRQUFSdzNNQVNBQlFRRkdEY2NCSUFGQkFXb2hBU0FVUVFGcUloUWdBa2NOQUFzZ0FDQVdOZ0lBREk0REN3SkFJQUVpQVNBQ1J3MEFRZFVBSVJBTWpnTUxJQUV0QUFCQkNrY056QUVnQVVFQmFpRUJETWNCQ3dKQUlBRWlBU0FDUncwQVFkWUFJUkFNalFNTEFrQUNRQ0FCTFFBQVFYWnFEZ1FBelFITkFRSE5BUXNnQVVFQmFpRUJETWNCQ3lBQlFRRnFJUUZCeWdBaEVBenpBZ3NnQUNBQklnRWdBaEN1Z0lDQUFDSVFEY3NCSUFFaEFVSE5BQ0VRRFBJQ0N5QUFMUUFwUVNKR0RZVURES1lDQ3dKQUlBRWlBU0FDUncwQVFkc0FJUkFNaWdNTFFRQWhGRUVCSVJkQkFTRVdRUUFoRUFKQUFrQUNRQUpBQWtBQ1FBSkFBa0FDUUNBQkxRQUFRVkJxRGdyVUFkTUJBQUVDQXdRRkJnalZBUXRCQWlFUURBWUxRUU1oRUF3RkMwRUVJUkFNQkF0QkJTRVFEQU1MUVFZaEVBd0NDMEVISVJBTUFRdEJDQ0VRQzBFQUlSZEJBQ0VXUVFBaEZBek1BUXRCQ1NFUVFRRWhGRUVBSVJkQkFDRVdETXNCQ3dKQUlBRWlBU0FDUncwQVFkMEFJUkFNaVFNTElBRXRBQUJCTGtjTnpBRWdBVUVCYWlFQkRLWUNDeUFCSWdFZ0FrY056QUZCM3dBaEVBeUhBd3NDUUNBQklnRWdBa1lOQUNBQVFZNkFnSUFBTmdJSUlBQWdBVFlDQkNBQklRRkIwQUFoRUF6dUFndEI0QUFoRUF5R0F3dEI0UUFoRUNBQklnRWdBa1lOaFFNZ0FpQUJheUFBS0FJQUloUnFJUllnQVNBVWEwRURhaUVYQTBBZ0FTMEFBQ0FVUWVMQ2dJQUFhaTBBQUVjTnpRRWdGRUVEUmczTUFTQVVRUUZxSVJRZ0FVRUJhaUlCSUFKSERRQUxJQUFnRmpZQ0FBeUZBd3RCNGdBaEVDQUJJZ0VnQWtZTmhBTWdBaUFCYXlBQUtBSUFJaFJxSVJZZ0FTQVVhMEVDYWlFWEEwQWdBUzBBQUNBVVFlYkNnSUFBYWkwQUFFY056QUVnRkVFQ1JnM09BU0FVUVFGcUlSUWdBVUVCYWlJQklBSkhEUUFMSUFBZ0ZqWUNBQXlFQXd0QjR3QWhFQ0FCSWdFZ0FrWU5nd01nQWlBQmF5QUFLQUlBSWhScUlSWWdBU0FVYTBFRGFpRVhBMEFnQVMwQUFDQVVRZW5DZ0lBQWFpMEFBRWNOeXdFZ0ZFRURSZzNPQVNBVVFRRnFJUlFnQVVFQmFpSUJJQUpIRFFBTElBQWdGallDQUF5REF3c0NRQ0FCSWdFZ0FrY05BRUhsQUNFUURJTURDeUFBSUFGQkFXb2lBU0FDRUtpQWdJQUFJaEFOelFFZ0FTRUJRZFlBSVJBTTZRSUxBa0FnQVNJQklBSkdEUUFEUUFKQUlBRXRBQUFpRUVFZ1JnMEFBa0FDUUFKQUlCQkJ1SDlxRGdzQUFjOEJ6d0hQQWM4Qnp3SFBBYzhCendFQ3p3RUxJQUZCQVdvaEFVSFNBQ0VRRE8wQ0N5QUJRUUZxSVFGQjB3QWhFQXpzQWdzZ0FVRUJhaUVCUWRRQUlSQU02d0lMSUFGQkFXb2lBU0FDUncwQUMwSGtBQ0VRRElJREMwSGtBQ0VRRElFREN3TkFBa0FnQVMwQUFFSHd3b0NBQUdvdEFBQWlFRUVCUmcwQUlCQkJmbW9PQTg4QjBBSFJBZElCQ3lBQlFRRnFJZ0VnQWtjTkFBdEI1Z0FoRUF5QUF3c0NRQ0FCSWdFZ0FrWU5BQ0FCUVFGcUlRRU1Bd3RCNXdBaEVBei9BZ3NEUUFKQUlBRXRBQUJCOE1TQWdBQnFMUUFBSWhCQkFVWU5BQUpBSUJCQmZtb09CTklCMHdIVUFRRFZBUXNnQVNFQlFkY0FJUkFNNXdJTElBRkJBV29pQVNBQ1J3MEFDMEhvQUNFUURQNENDd0pBSUFFaUFTQUNSdzBBUWVrQUlSQU0vZ0lMQWtBZ0FTMEFBQ0lRUVhacURocTZBZFVCMVFHOEFkVUIxUUhWQWRVQjFRSFZBZFVCMVFIVkFkVUIxUUhWQWRVQjFRSFZBZFVCMVFIVkFjb0IxUUhWQVFEVEFRc2dBVUVCYWlFQkMwRUdJUkFNNHdJTEEwQUNRQ0FCTFFBQVFmREdnSUFBYWkwQUFFRUJSZzBBSUFFaEFReWVBZ3NnQVVFQmFpSUJJQUpIRFFBTFFlb0FJUkFNK3dJTEFrQWdBU0lCSUFKR0RRQWdBVUVCYWlFQkRBTUxRZXNBSVJBTStnSUxBa0FnQVNJQklBSkhEUUJCN0FBaEVBejZBZ3NnQVVFQmFpRUJEQUVMQWtBZ0FTSUJJQUpIRFFCQjdRQWhFQXo1QWdzZ0FVRUJhaUVCQzBFRUlSQU0zZ0lMQWtBZ0FTSVVJQUpIRFFCQjdnQWhFQXozQWdzZ0ZDRUJBa0FDUUFKQUlCUXRBQUJCOE1pQWdBQnFMUUFBUVg5cURnZlVBZFVCMWdFQW5BSUJBdGNCQ3lBVVFRRnFJUUVNQ2dzZ0ZFRUJhaUVCRE0wQkMwRUFJUkFnQUVFQU5nSWNJQUJCbTVLQWdBQTJBaEFnQUVFSE5nSU1JQUFnRkVFQmFqWUNGQXoyQWdzQ1FBTkFBa0FnQVMwQUFFSHd5SUNBQUdvdEFBQWlFRUVFUmcwQUFrQUNRQ0FRUVg5cURnZlNBZE1CMUFIWkFRQUVBZGtCQ3lBQklRRkIyZ0FoRUF6Z0Fnc2dBVUVCYWlFQlFkd0FJUkFNM3dJTElBRkJBV29pQVNBQ1J3MEFDMEh2QUNFUURQWUNDeUFCUVFGcUlRRU15d0VMQWtBZ0FTSVVJQUpIRFFCQjhBQWhFQXoxQWdzZ0ZDMEFBRUV2UnczVUFTQVVRUUZxSVFFTUJnc0NRQ0FCSWhRZ0FrY05BRUh4QUNFUURQUUNDd0pBSUJRdEFBQWlBVUV2UncwQUlCUkJBV29oQVVIZEFDRVFETnNDQ3lBQlFYWnFJZ1JCRmtzTjB3RkJBU0FFZEVHSmdJQUNjVVVOMHdFTXlnSUxBa0FnQVNJQklBSkdEUUFnQVVFQmFpRUJRZDRBSVJBTTJnSUxRZklBSVJBTThnSUxBa0FnQVNJVUlBSkhEUUJCOUFBaEVBenlBZ3NnRkNFQkFrQWdGQzBBQUVId3pJQ0FBR290QUFCQmYyb09BOGtDbEFJQTFBRUxRZUVBSVJBTTJBSUxBa0FnQVNJVUlBSkdEUUFEUUFKQUlCUXRBQUJCOE1xQWdBQnFMUUFBSWdGQkEwWU5BQUpBSUFGQmYyb09Bc3NDQU5VQkN5QVVJUUZCM3dBaEVBemFBZ3NnRkVFQmFpSVVJQUpIRFFBTFFmTUFJUkFNOFFJTFFmTUFJUkFNOEFJTEFrQWdBU0lCSUFKR0RRQWdBRUdQZ0lDQUFEWUNDQ0FBSUFFMkFnUWdBU0VCUWVBQUlSQU0xd0lMUWZVQUlSQU03d0lMQWtBZ0FTSUJJQUpIRFFCQjlnQWhFQXp2QWdzZ0FFR1BnSUNBQURZQ0NDQUFJQUUyQWdRZ0FTRUJDMEVESVJBTTFBSUxBMEFnQVMwQUFFRWdSdzNEQWlBQlFRRnFJZ0VnQWtjTkFBdEI5d0FoRUF6c0Fnc0NRQ0FCSWdFZ0FrY05BRUg0QUNFUURPd0NDeUFCTFFBQVFTQkhEYzRCSUFGQkFXb2hBUXp2QVFzZ0FDQUJJZ0VnQWhDc2dJQ0FBQ0lRRGM0QklBRWhBUXlPQWdzQ1FDQUJJZ1FnQWtjTkFFSDZBQ0VRRE9vQ0N5QUVMUUFBUWN3QVJ3M1JBU0FFUVFGcUlRRkJFeUVRRE04QkN3SkFJQUVpQkNBQ1J3MEFRZnNBSVJBTTZRSUxJQUlnQkdzZ0FDZ0NBQ0lCYWlFVUlBUWdBV3RCQldvaEVBTkFJQVF0QUFBZ0FVSHd6b0NBQUdvdEFBQkhEZEFCSUFGQkJVWU56Z0VnQVVFQmFpRUJJQVJCQVdvaUJDQUNSdzBBQ3lBQUlCUTJBZ0JCK3dBaEVBem9BZ3NDUUNBQklnUWdBa2NOQUVIOEFDRVFET2dDQ3dKQUFrQWdCQzBBQUVHOWYyb09EQURSQWRFQjBRSFJBZEVCMFFIUkFkRUIwUUhSQVFIUkFRc2dCRUVCYWlFQlFlWUFJUkFNendJTElBUkJBV29oQVVIbkFDRVFETTRDQ3dKQUlBRWlCQ0FDUncwQVFmMEFJUkFNNXdJTElBSWdCR3NnQUNnQ0FDSUJhaUVVSUFRZ0FXdEJBbW9oRUFKQUEwQWdCQzBBQUNBQlFlM1BnSUFBYWkwQUFFY056d0VnQVVFQ1JnMEJJQUZCQVdvaEFTQUVRUUZxSWdRZ0FrY05BQXNnQUNBVU5nSUFRZjBBSVJBTTV3SUxJQUJCQURZQ0FDQVFRUUZxSVFGQkVDRVFETXdCQ3dKQUlBRWlCQ0FDUncwQVFmNEFJUkFNNWdJTElBSWdCR3NnQUNnQ0FDSUJhaUVVSUFRZ0FXdEJCV29oRUFKQUEwQWdCQzBBQUNBQlFmYk9nSUFBYWkwQUFFY056Z0VnQVVFRlJnMEJJQUZCQVdvaEFTQUVRUUZxSWdRZ0FrY05BQXNnQUNBVU5nSUFRZjRBSVJBTTVnSUxJQUJCQURZQ0FDQVFRUUZxSVFGQkZpRVFETXNCQ3dKQUlBRWlCQ0FDUncwQVFmOEFJUkFNNVFJTElBSWdCR3NnQUNnQ0FDSUJhaUVVSUFRZ0FXdEJBMm9oRUFKQUEwQWdCQzBBQUNBQlFmek9nSUFBYWkwQUFFY056UUVnQVVFRFJnMEJJQUZCQVdvaEFTQUVRUUZxSWdRZ0FrY05BQXNnQUNBVU5nSUFRZjhBSVJBTTVRSUxJQUJCQURZQ0FDQVFRUUZxSVFGQkJTRVFETW9CQ3dKQUlBRWlCQ0FDUncwQVFZQUJJUkFNNUFJTElBUXRBQUJCMlFCSERjc0JJQVJCQVdvaEFVRUlJUkFNeVFFTEFrQWdBU0lFSUFKSERRQkJnUUVoRUF6akFnc0NRQUpBSUFRdEFBQkJzbjlxRGdNQXpBRUJ6QUVMSUFSQkFXb2hBVUhyQUNFUURNb0NDeUFFUVFGcUlRRkI3QUFoRUF6SkFnc0NRQ0FCSWdRZ0FrY05BRUdDQVNFUURPSUNDd0pBQWtBZ0JDMEFBRUc0ZjJvT0NBRExBY3NCeXdITEFjc0J5d0VCeXdFTElBUkJBV29oQVVIcUFDRVFETWtDQ3lBRVFRRnFJUUZCN1FBaEVBeklBZ3NDUUNBQklnUWdBa2NOQUVHREFTRVFET0VDQ3lBQ0lBUnJJQUFvQWdBaUFXb2hFQ0FFSUFGclFRSnFJUlFDUUFOQUlBUXRBQUFnQVVHQXo0Q0FBR290QUFCSERja0JJQUZCQWtZTkFTQUJRUUZxSVFFZ0JFRUJhaUlFSUFKSERRQUxJQUFnRURZQ0FFR0RBU0VRRE9FQ0MwRUFJUkFnQUVFQU5nSUFJQlJCQVdvaEFRekdBUXNDUUNBQklnUWdBa2NOQUVHRUFTRVFET0FDQ3lBQ0lBUnJJQUFvQWdBaUFXb2hGQ0FFSUFGclFRUnFJUkFDUUFOQUlBUXRBQUFnQVVHRHo0Q0FBR290QUFCSERjZ0JJQUZCQkVZTkFTQUJRUUZxSVFFZ0JFRUJhaUlFSUFKSERRQUxJQUFnRkRZQ0FFR0VBU0VRRE9BQ0N5QUFRUUEyQWdBZ0VFRUJhaUVCUVNNaEVBekZBUXNDUUNBQklnUWdBa2NOQUVHRkFTRVFETjhDQ3dKQUFrQWdCQzBBQUVHMGYyb09DQURJQWNnQnlBSElBY2dCeUFFQnlBRUxJQVJCQVdvaEFVSHZBQ0VRRE1ZQ0N5QUVRUUZxSVFGQjhBQWhFQXpGQWdzQ1FDQUJJZ1FnQWtjTkFFR0dBU0VRRE40Q0N5QUVMUUFBUWNVQVJ3M0ZBU0FFUVFGcUlRRU1nd0lMQWtBZ0FTSUVJQUpIRFFCQmh3RWhFQXpkQWdzZ0FpQUVheUFBS0FJQUlnRnFJUlFnQkNBQmEwRURhaUVRQWtBRFFDQUVMUUFBSUFGQmlNK0FnQUJxTFFBQVJ3M0ZBU0FCUVFOR0RRRWdBVUVCYWlFQklBUkJBV29pQkNBQ1J3MEFDeUFBSUJRMkFnQkJod0VoRUF6ZEFnc2dBRUVBTmdJQUlCQkJBV29oQVVFdElSQU13Z0VMQWtBZ0FTSUVJQUpIRFFCQmlBRWhFQXpjQWdzZ0FpQUVheUFBS0FJQUlnRnFJUlFnQkNBQmEwRUlhaUVRQWtBRFFDQUVMUUFBSUFGQjBNK0FnQUJxTFFBQVJ3M0VBU0FCUVFoR0RRRWdBVUVCYWlFQklBUkJBV29pQkNBQ1J3MEFDeUFBSUJRMkFnQkJpQUVoRUF6Y0Fnc2dBRUVBTmdJQUlCQkJBV29oQVVFcElSQU13UUVMQWtBZ0FTSUJJQUpIRFFCQmlRRWhFQXpiQWd0QkFTRVFJQUV0QUFCQjN3QkhEY0FCSUFGQkFXb2hBUXlCQWdzQ1FDQUJJZ1FnQWtjTkFFR0tBU0VRRE5vQ0N5QUNJQVJySUFBb0FnQWlBV29oRkNBRUlBRnJRUUZxSVJBRFFDQUVMUUFBSUFGQmpNK0FnQUJxTFFBQVJ3M0JBU0FCUVFGR0RhOENJQUZCQVdvaEFTQUVRUUZxSWdRZ0FrY05BQXNnQUNBVU5nSUFRWW9CSVJBTTJRSUxBa0FnQVNJRUlBSkhEUUJCaXdFaEVBelpBZ3NnQWlBRWF5QUFLQUlBSWdGcUlSUWdCQ0FCYTBFQ2FpRVFBa0FEUUNBRUxRQUFJQUZCanMrQWdBQnFMUUFBUnczQkFTQUJRUUpHRFFFZ0FVRUJhaUVCSUFSQkFXb2lCQ0FDUncwQUN5QUFJQlEyQWdCQml3RWhFQXpaQWdzZ0FFRUFOZ0lBSUJCQkFXb2hBVUVDSVJBTXZnRUxBa0FnQVNJRUlBSkhEUUJCakFFaEVBellBZ3NnQWlBRWF5QUFLQUlBSWdGcUlSUWdCQ0FCYTBFQmFpRVFBa0FEUUNBRUxRQUFJQUZCOE0rQWdBQnFMUUFBUnczQUFTQUJRUUZHRFFFZ0FVRUJhaUVCSUFSQkFXb2lCQ0FDUncwQUN5QUFJQlEyQWdCQmpBRWhFQXpZQWdzZ0FFRUFOZ0lBSUJCQkFXb2hBVUVmSVJBTXZRRUxBa0FnQVNJRUlBSkhEUUJCalFFaEVBelhBZ3NnQWlBRWF5QUFLQUlBSWdGcUlSUWdCQ0FCYTBFQmFpRVFBa0FEUUNBRUxRQUFJQUZCOHMrQWdBQnFMUUFBUncyL0FTQUJRUUZHRFFFZ0FVRUJhaUVCSUFSQkFXb2lCQ0FDUncwQUN5QUFJQlEyQWdCQmpRRWhFQXpYQWdzZ0FFRUFOZ0lBSUJCQkFXb2hBVUVKSVJBTXZBRUxBa0FnQVNJRUlBSkhEUUJCamdFaEVBeldBZ3NDUUFKQUlBUXRBQUJCdDM5cURnY0F2d0cvQWI4QnZ3Ry9BUUcvQVFzZ0JFRUJhaUVCUWZnQUlSQU12UUlMSUFSQkFXb2hBVUg1QUNFUURMd0NDd0pBSUFFaUJDQUNSdzBBUVk4QklSQU0xUUlMSUFJZ0JHc2dBQ2dDQUNJQmFpRVVJQVFnQVd0QkJXb2hFQUpBQTBBZ0JDMEFBQ0FCUVpIUGdJQUFhaTBBQUVjTnZRRWdBVUVGUmcwQklBRkJBV29oQVNBRVFRRnFJZ1FnQWtjTkFBc2dBQ0FVTmdJQVFZOEJJUkFNMVFJTElBQkJBRFlDQUNBUVFRRnFJUUZCR0NFUURMb0JDd0pBSUFFaUJDQUNSdzBBUVpBQklSQU0xQUlMSUFJZ0JHc2dBQ2dDQUNJQmFpRVVJQVFnQVd0QkFtb2hFQUpBQTBBZ0JDMEFBQ0FCUVpmUGdJQUFhaTBBQUVjTnZBRWdBVUVDUmcwQklBRkJBV29oQVNBRVFRRnFJZ1FnQWtjTkFBc2dBQ0FVTmdJQVFaQUJJUkFNMUFJTElBQkJBRFlDQUNBUVFRRnFJUUZCRnlFUURMa0JDd0pBSUFFaUJDQUNSdzBBUVpFQklSQU0wd0lMSUFJZ0JHc2dBQ2dDQUNJQmFpRVVJQVFnQVd0QkJtb2hFQUpBQTBBZ0JDMEFBQ0FCUVpyUGdJQUFhaTBBQUVjTnV3RWdBVUVHUmcwQklBRkJBV29oQVNBRVFRRnFJZ1FnQWtjTkFBc2dBQ0FVTmdJQVFaRUJJUkFNMHdJTElBQkJBRFlDQUNBUVFRRnFJUUZCRlNFUURMZ0JDd0pBSUFFaUJDQUNSdzBBUVpJQklSQU0wZ0lMSUFJZ0JHc2dBQ2dDQUNJQmFpRVVJQVFnQVd0QkJXb2hFQUpBQTBBZ0JDMEFBQ0FCUWFIUGdJQUFhaTBBQUVjTnVnRWdBVUVGUmcwQklBRkJBV29oQVNBRVFRRnFJZ1FnQWtjTkFBc2dBQ0FVTmdJQVFaSUJJUkFNMGdJTElBQkJBRFlDQUNBUVFRRnFJUUZCSGlFUURMY0JDd0pBSUFFaUJDQUNSdzBBUVpNQklSQU0wUUlMSUFRdEFBQkJ6QUJIRGJnQklBUkJBV29oQVVFS0lSQU10Z0VMQWtBZ0JDQUNSdzBBUVpRQklSQU0wQUlMQWtBQ1FDQUVMUUFBUWI5L2FnNFBBTGtCdVFHNUFia0J1UUc1QWJrQnVRRzVBYmtCdVFHNUFia0JBYmtCQ3lBRVFRRnFJUUZCL2dBaEVBeTNBZ3NnQkVFQmFpRUJRZjhBSVJBTXRnSUxBa0FnQkNBQ1J3MEFRWlVCSVJBTXp3SUxBa0FDUUNBRUxRQUFRYjkvYWc0REFMZ0JBYmdCQ3lBRVFRRnFJUUZCL1FBaEVBeTJBZ3NnQkVFQmFpRUVRWUFCSVJBTXRRSUxBa0FnQkNBQ1J3MEFRWllCSVJBTXpnSUxJQUlnQkdzZ0FDZ0NBQ0lCYWlFVUlBUWdBV3RCQVdvaEVBSkFBMEFnQkMwQUFDQUJRYWZQZ0lBQWFpMEFBRWNOdGdFZ0FVRUJSZzBCSUFGQkFXb2hBU0FFUVFGcUlnUWdBa2NOQUFzZ0FDQVVOZ0lBUVpZQklSQU16Z0lMSUFCQkFEWUNBQ0FRUVFGcUlRRkJDeUVRRExNQkN3SkFJQVFnQWtjTkFFR1hBU0VRRE0wQ0N3SkFBa0FDUUFKQUlBUXRBQUJCVTJvT0l3QzRBYmdCdUFHNEFiZ0J1QUc0QWJnQnVBRzRBYmdCdUFHNEFiZ0J1QUc0QWJnQnVBRzRBYmdCdUFHNEFiZ0JBYmdCdUFHNEFiZ0J1QUVDdUFHNEFiZ0JBN2dCQ3lBRVFRRnFJUUZCK3dBaEVBeTJBZ3NnQkVFQmFpRUJRZndBSVJBTXRRSUxJQVJCQVdvaEJFR0JBU0VRRExRQ0N5QUVRUUZxSVFSQmdnRWhFQXl6QWdzQ1FDQUVJQUpIRFFCQm1BRWhFQXpNQWdzZ0FpQUVheUFBS0FJQUlnRnFJUlFnQkNBQmEwRUVhaUVRQWtBRFFDQUVMUUFBSUFGQnFjK0FnQUJxTFFBQVJ3MjBBU0FCUVFSR0RRRWdBVUVCYWlFQklBUkJBV29pQkNBQ1J3MEFDeUFBSUJRMkFnQkJtQUVoRUF6TUFnc2dBRUVBTmdJQUlCQkJBV29oQVVFWklSQU1zUUVMQWtBZ0JDQUNSdzBBUVprQklSQU15d0lMSUFJZ0JHc2dBQ2dDQUNJQmFpRVVJQVFnQVd0QkJXb2hFQUpBQTBBZ0JDMEFBQ0FCUWE3UGdJQUFhaTBBQUVjTnN3RWdBVUVGUmcwQklBRkJBV29oQVNBRVFRRnFJZ1FnQWtjTkFBc2dBQ0FVTmdJQVFaa0JJUkFNeXdJTElBQkJBRFlDQUNBUVFRRnFJUUZCQmlFUURMQUJDd0pBSUFRZ0FrY05BRUdhQVNFUURNb0NDeUFDSUFScklBQW9BZ0FpQVdvaEZDQUVJQUZyUVFGcUlSQUNRQU5BSUFRdEFBQWdBVUcwejRDQUFHb3RBQUJIRGJJQklBRkJBVVlOQVNBQlFRRnFJUUVnQkVFQmFpSUVJQUpIRFFBTElBQWdGRFlDQUVHYUFTRVFETW9DQ3lBQVFRQTJBZ0FnRUVFQmFpRUJRUndoRUF5dkFRc0NRQ0FFSUFKSERRQkJtd0VoRUF6SkFnc2dBaUFFYXlBQUtBSUFJZ0ZxSVJRZ0JDQUJhMEVCYWlFUUFrQURRQ0FFTFFBQUlBRkJ0cytBZ0FCcUxRQUFSdzJ4QVNBQlFRRkdEUUVnQVVFQmFpRUJJQVJCQVdvaUJDQUNSdzBBQ3lBQUlCUTJBZ0JCbXdFaEVBekpBZ3NnQUVFQU5nSUFJQkJCQVdvaEFVRW5JUkFNcmdFTEFrQWdCQ0FDUncwQVFad0JJUkFNeUFJTEFrQUNRQ0FFTFFBQVFheC9hZzRDQUFHeEFRc2dCRUVCYWlFRVFZWUJJUkFNcndJTElBUkJBV29oQkVHSEFTRVFESzRDQ3dKQUlBUWdBa2NOQUVHZEFTRVFETWNDQ3lBQ0lBUnJJQUFvQWdBaUFXb2hGQ0FFSUFGclFRRnFJUkFDUUFOQUlBUXRBQUFnQVVHNHo0Q0FBR290QUFCSERhOEJJQUZCQVVZTkFTQUJRUUZxSVFFZ0JFRUJhaUlFSUFKSERRQUxJQUFnRkRZQ0FFR2RBU0VRRE1jQ0N5QUFRUUEyQWdBZ0VFRUJhaUVCUVNZaEVBeXNBUXNDUUNBRUlBSkhEUUJCbmdFaEVBekdBZ3NnQWlBRWF5QUFLQUlBSWdGcUlSUWdCQ0FCYTBFQmFpRVFBa0FEUUNBRUxRQUFJQUZCdXMrQWdBQnFMUUFBUncydUFTQUJRUUZHRFFFZ0FVRUJhaUVCSUFSQkFXb2lCQ0FDUncwQUN5QUFJQlEyQWdCQm5nRWhFQXpHQWdzZ0FFRUFOZ0lBSUJCQkFXb2hBVUVESVJBTXF3RUxBa0FnQkNBQ1J3MEFRWjhCSVJBTXhRSUxJQUlnQkdzZ0FDZ0NBQ0lCYWlFVUlBUWdBV3RCQW1vaEVBSkFBMEFnQkMwQUFDQUJRZTNQZ0lBQWFpMEFBRWNOclFFZ0FVRUNSZzBCSUFGQkFXb2hBU0FFUVFGcUlnUWdBa2NOQUFzZ0FDQVVOZ0lBUVo4QklSQU14UUlMSUFCQkFEWUNBQ0FRUVFGcUlRRkJEQ0VRREtvQkN3SkFJQVFnQWtjTkFFR2dBU0VRRE1RQ0N5QUNJQVJySUFBb0FnQWlBV29oRkNBRUlBRnJRUU5xSVJBQ1FBTkFJQVF0QUFBZ0FVRzh6NENBQUdvdEFBQkhEYXdCSUFGQkEwWU5BU0FCUVFGcUlRRWdCRUVCYWlJRUlBSkhEUUFMSUFBZ0ZEWUNBRUdnQVNFUURNUUNDeUFBUVFBMkFnQWdFRUVCYWlFQlFRMGhFQXlwQVFzQ1FDQUVJQUpIRFFCQm9RRWhFQXpEQWdzQ1FBSkFJQVF0QUFCQnVuOXFEZ3NBckFHc0Fhd0JyQUdzQWF3QnJBR3NBYXdCQWF3QkN5QUVRUUZxSVFSQml3RWhFQXlxQWdzZ0JFRUJhaUVFUVl3QklSQU1xUUlMQWtBZ0JDQUNSdzBBUWFJQklSQU13Z0lMSUFRdEFBQkIwQUJIRGFrQklBUkJBV29oQkF6cEFRc0NRQ0FFSUFKSERRQkJvd0VoRUF6QkFnc0NRQUpBSUFRdEFBQkJ0MzlxRGdjQnFnR3FBYW9CcWdHcUFRQ3FBUXNnQkVFQmFpRUVRWTRCSVJBTXFBSUxJQVJCQVdvaEFVRWlJUkFNcGdFTEFrQWdCQ0FDUncwQVFhUUJJUkFNd0FJTElBSWdCR3NnQUNnQ0FDSUJhaUVVSUFRZ0FXdEJBV29oRUFKQUEwQWdCQzBBQUNBQlFjRFBnSUFBYWkwQUFFY05xQUVnQVVFQlJnMEJJQUZCQVdvaEFTQUVRUUZxSWdRZ0FrY05BQXNnQUNBVU5nSUFRYVFCSVJBTXdBSUxJQUJCQURZQ0FDQVFRUUZxSVFGQkhTRVFES1VCQ3dKQUlBUWdBa2NOQUVHbEFTRVFETDhDQ3dKQUFrQWdCQzBBQUVHdWYyb09Bd0NvQVFHb0FRc2dCRUVCYWlFRVFaQUJJUkFNcGdJTElBUkJBV29oQVVFRUlSQU1wQUVMQWtBZ0JDQUNSdzBBUWFZQklSQU12Z0lMQWtBQ1FBSkFBa0FDUUNBRUxRQUFRYjkvYWc0VkFLb0JxZ0dxQWFvQnFnR3FBYW9CcWdHcUFhb0JBYW9CcWdFQ3FnR3FBUU9xQWFvQkJLb0JDeUFFUVFGcUlRUkJpQUVoRUF5b0Fnc2dCRUVCYWlFRVFZa0JJUkFNcHdJTElBUkJBV29oQkVHS0FTRVFES1lDQ3lBRVFRRnFJUVJCandFaEVBeWxBZ3NnQkVFQmFpRUVRWkVCSVJBTXBBSUxBa0FnQkNBQ1J3MEFRYWNCSVJBTXZRSUxJQUlnQkdzZ0FDZ0NBQ0lCYWlFVUlBUWdBV3RCQW1vaEVBSkFBMEFnQkMwQUFDQUJRZTNQZ0lBQWFpMEFBRWNOcFFFZ0FVRUNSZzBCSUFGQkFXb2hBU0FFUVFGcUlnUWdBa2NOQUFzZ0FDQVVOZ0lBUWFjQklSQU12UUlMSUFCQkFEWUNBQ0FRUVFGcUlRRkJFU0VRREtJQkN3SkFJQVFnQWtjTkFFR29BU0VRREx3Q0N5QUNJQVJySUFBb0FnQWlBV29oRkNBRUlBRnJRUUpxSVJBQ1FBTkFJQVF0QUFBZ0FVSEN6NENBQUdvdEFBQkhEYVFCSUFGQkFrWU5BU0FCUVFGcUlRRWdCRUVCYWlJRUlBSkhEUUFMSUFBZ0ZEWUNBRUdvQVNFUURMd0NDeUFBUVFBMkFnQWdFRUVCYWlFQlFTd2hFQXloQVFzQ1FDQUVJQUpIRFFCQnFRRWhFQXk3QWdzZ0FpQUVheUFBS0FJQUlnRnFJUlFnQkNBQmEwRUVhaUVRQWtBRFFDQUVMUUFBSUFGQnhjK0FnQUJxTFFBQVJ3MmpBU0FCUVFSR0RRRWdBVUVCYWlFQklBUkJBV29pQkNBQ1J3MEFDeUFBSUJRMkFnQkJxUUVoRUF5N0Fnc2dBRUVBTmdJQUlCQkJBV29oQVVFcklSQU1vQUVMQWtBZ0JDQUNSdzBBUWFvQklSQU11Z0lMSUFJZ0JHc2dBQ2dDQUNJQmFpRVVJQVFnQVd0QkFtb2hFQUpBQTBBZ0JDMEFBQ0FCUWNyUGdJQUFhaTBBQUVjTm9nRWdBVUVDUmcwQklBRkJBV29oQVNBRVFRRnFJZ1FnQWtjTkFBc2dBQ0FVTmdJQVFhb0JJUkFNdWdJTElBQkJBRFlDQUNBUVFRRnFJUUZCRkNFUURKOEJDd0pBSUFRZ0FrY05BRUdyQVNFUURMa0NDd0pBQWtBQ1FBSkFJQVF0QUFCQnZuOXFEZzhBQVFLa0FhUUJwQUdrQWFRQnBBR2tBYVFCcEFHa0FhUUJBNlFCQ3lBRVFRRnFJUVJCa3dFaEVBeWlBZ3NnQkVFQmFpRUVRWlFCSVJBTW9RSUxJQVJCQVdvaEJFR1ZBU0VRREtBQ0N5QUVRUUZxSVFSQmxnRWhFQXlmQWdzQ1FDQUVJQUpIRFFCQnJBRWhFQXk0QWdzZ0JDMEFBRUhGQUVjTm53RWdCRUVCYWlFRURPQUJDd0pBSUFRZ0FrY05BRUd0QVNFUURMY0NDeUFDSUFScklBQW9BZ0FpQVdvaEZDQUVJQUZyUVFKcUlSQUNRQU5BSUFRdEFBQWdBVUhOejRDQUFHb3RBQUJIRFo4QklBRkJBa1lOQVNBQlFRRnFJUUVnQkVFQmFpSUVJQUpIRFFBTElBQWdGRFlDQUVHdEFTRVFETGNDQ3lBQVFRQTJBZ0FnRUVFQmFpRUJRUTRoRUF5Y0FRc0NRQ0FFSUFKSERRQkJyZ0VoRUF5MkFnc2dCQzBBQUVIUUFFY05uUUVnQkVFQmFpRUJRU1VoRUF5YkFRc0NRQ0FFSUFKSERRQkJyd0VoRUF5MUFnc2dBaUFFYXlBQUtBSUFJZ0ZxSVJRZ0JDQUJhMEVJYWlFUUFrQURRQ0FFTFFBQUlBRkIwTStBZ0FCcUxRQUFSdzJkQVNBQlFRaEdEUUVnQVVFQmFpRUJJQVJCQVdvaUJDQUNSdzBBQ3lBQUlCUTJBZ0JCcndFaEVBeTFBZ3NnQUVFQU5nSUFJQkJCQVdvaEFVRXFJUkFNbWdFTEFrQWdCQ0FDUncwQVFiQUJJUkFNdEFJTEFrQUNRQ0FFTFFBQVFhdC9hZzRMQUowQm5RR2RBWjBCblFHZEFaMEJuUUdkQVFHZEFRc2dCRUVCYWlFRVFab0JJUkFNbXdJTElBUkJBV29oQkVHYkFTRVFESm9DQ3dKQUlBUWdBa2NOQUVHeEFTRVFETE1DQ3dKQUFrQWdCQzBBQUVHL2Yyb09GQUNjQVp3Qm5BR2NBWndCbkFHY0Fad0JuQUdjQVp3Qm5BR2NBWndCbkFHY0Fad0JuQUVCbkFFTElBUkJBV29oQkVHWkFTRVFESm9DQ3lBRVFRRnFJUVJCbkFFaEVBeVpBZ3NDUUNBRUlBSkhEUUJCc2dFaEVBeXlBZ3NnQWlBRWF5QUFLQUlBSWdGcUlSUWdCQ0FCYTBFRGFpRVFBa0FEUUNBRUxRQUFJQUZCMmMrQWdBQnFMUUFBUncyYUFTQUJRUU5HRFFFZ0FVRUJhaUVCSUFSQkFXb2lCQ0FDUncwQUN5QUFJQlEyQWdCQnNnRWhFQXl5QWdzZ0FFRUFOZ0lBSUJCQkFXb2hBVUVoSVJBTWx3RUxBa0FnQkNBQ1J3MEFRYk1CSVJBTXNRSUxJQUlnQkdzZ0FDZ0NBQ0lCYWlFVUlBUWdBV3RCQm1vaEVBSkFBMEFnQkMwQUFDQUJRZDNQZ0lBQWFpMEFBRWNObVFFZ0FVRUdSZzBCSUFGQkFXb2hBU0FFUVFGcUlnUWdBa2NOQUFzZ0FDQVVOZ0lBUWJNQklSQU1zUUlMSUFCQkFEWUNBQ0FRUVFGcUlRRkJHaUVRREpZQkN3SkFJQVFnQWtjTkFFRzBBU0VRRExBQ0N3SkFBa0FDUUNBRUxRQUFRYnQvYWc0UkFKb0JtZ0dhQVpvQm1nR2FBWm9CbWdHYUFRR2FBWm9CbWdHYUFab0JBcG9CQ3lBRVFRRnFJUVJCblFFaEVBeVlBZ3NnQkVFQmFpRUVRWjRCSVJBTWx3SUxJQVJCQVdvaEJFR2ZBU0VRREpZQ0N3SkFJQVFnQWtjTkFFRzFBU0VRREs4Q0N5QUNJQVJySUFBb0FnQWlBV29oRkNBRUlBRnJRUVZxSVJBQ1FBTkFJQVF0QUFBZ0FVSGt6NENBQUdvdEFBQkhEWmNCSUFGQkJVWU5BU0FCUVFGcUlRRWdCRUVCYWlJRUlBSkhEUUFMSUFBZ0ZEWUNBRUcxQVNFUURLOENDeUFBUVFBMkFnQWdFRUVCYWlFQlFTZ2hFQXlVQVFzQ1FDQUVJQUpIRFFCQnRnRWhFQXl1QWdzZ0FpQUVheUFBS0FJQUlnRnFJUlFnQkNBQmEwRUNhaUVRQWtBRFFDQUVMUUFBSUFGQjZzK0FnQUJxTFFBQVJ3MldBU0FCUVFKR0RRRWdBVUVCYWlFQklBUkJBV29pQkNBQ1J3MEFDeUFBSUJRMkFnQkJ0Z0VoRUF5dUFnc2dBRUVBTmdJQUlCQkJBV29oQVVFSElSQU1rd0VMQWtBZ0JDQUNSdzBBUWJjQklSQU1yUUlMQWtBQ1FDQUVMUUFBUWJ0L2FnNE9BSllCbGdHV0FaWUJsZ0dXQVpZQmxnR1dBWllCbGdHV0FRR1dBUXNnQkVFQmFpRUVRYUVCSVJBTWxBSUxJQVJCQVdvaEJFR2lBU0VRREpNQ0N3SkFJQVFnQWtjTkFFRzRBU0VRREt3Q0N5QUNJQVJySUFBb0FnQWlBV29oRkNBRUlBRnJRUUpxSVJBQ1FBTkFJQVF0QUFBZ0FVSHR6NENBQUdvdEFBQkhEWlFCSUFGQkFrWU5BU0FCUVFGcUlRRWdCRUVCYWlJRUlBSkhEUUFMSUFBZ0ZEWUNBRUc0QVNFUURLd0NDeUFBUVFBMkFnQWdFRUVCYWlFQlFSSWhFQXlSQVFzQ1FDQUVJQUpIRFFCQnVRRWhFQXlyQWdzZ0FpQUVheUFBS0FJQUlnRnFJUlFnQkNBQmEwRUJhaUVRQWtBRFFDQUVMUUFBSUFGQjhNK0FnQUJxTFFBQVJ3MlRBU0FCUVFGR0RRRWdBVUVCYWlFQklBUkJBV29pQkNBQ1J3MEFDeUFBSUJRMkFnQkJ1UUVoRUF5ckFnc2dBRUVBTmdJQUlCQkJBV29oQVVFZ0lSQU1rQUVMQWtBZ0JDQUNSdzBBUWJvQklSQU1xZ0lMSUFJZ0JHc2dBQ2dDQUNJQmFpRVVJQVFnQVd0QkFXb2hFQUpBQTBBZ0JDMEFBQ0FCUWZMUGdJQUFhaTBBQUVjTmtnRWdBVUVCUmcwQklBRkJBV29oQVNBRVFRRnFJZ1FnQWtjTkFBc2dBQ0FVTmdJQVFib0JJUkFNcWdJTElBQkJBRFlDQUNBUVFRRnFJUUZCRHlFUURJOEJDd0pBSUFRZ0FrY05BRUc3QVNFUURLa0NDd0pBQWtBZ0JDMEFBRUczZjJvT0J3Q1NBWklCa2dHU0FaSUJBWklCQ3lBRVFRRnFJUVJCcFFFaEVBeVFBZ3NnQkVFQmFpRUVRYVlCSVJBTWp3SUxBa0FnQkNBQ1J3MEFRYndCSVJBTXFBSUxJQUlnQkdzZ0FDZ0NBQ0lCYWlFVUlBUWdBV3RCQjJvaEVBSkFBMEFnQkMwQUFDQUJRZlRQZ0lBQWFpMEFBRWNOa0FFZ0FVRUhSZzBCSUFGQkFXb2hBU0FFUVFGcUlnUWdBa2NOQUFzZ0FDQVVOZ0lBUWJ3QklSQU1xQUlMSUFCQkFEWUNBQ0FRUVFGcUlRRkJHeUVRREkwQkN3SkFJQVFnQWtjTkFFRzlBU0VRREtjQ0N3SkFBa0FDUUNBRUxRQUFRYjUvYWc0U0FKRUJrUUdSQVpFQmtRR1JBWkVCa1FHUkFRR1JBWkVCa1FHUkFaRUJrUUVDa1FFTElBUkJBV29oQkVHa0FTRVFESThDQ3lBRVFRRnFJUVJCcHdFaEVBeU9BZ3NnQkVFQmFpRUVRYWdCSVJBTWpRSUxBa0FnQkNBQ1J3MEFRYjRCSVJBTXBnSUxJQVF0QUFCQnpnQkhEWTBCSUFSQkFXb2hCQXpQQVFzQ1FDQUVJQUpIRFFCQnZ3RWhFQXlsQWdzQ1FBSkFBa0FDUUFKQUFrQUNRQUpBQWtBQ1FBSkFBa0FDUUFKQUFrQUNRQ0FFTFFBQVFiOS9hZzRWQUFFQ0E1d0JCQVVHbkFHY0Fad0JCd2dKQ2d1Y0FRd05EZytjQVFzZ0JFRUJhaUVCUWVnQUlSQU1tZ0lMSUFSQkFXb2hBVUhwQUNFUURKa0NDeUFFUVFGcUlRRkI3Z0FoRUF5WUFnc2dCRUVCYWlFQlFmSUFJUkFNbHdJTElBUkJBV29oQVVIekFDRVFESllDQ3lBRVFRRnFJUUZCOWdBaEVBeVZBZ3NnQkVFQmFpRUJRZmNBSVJBTWxBSUxJQVJCQVdvaEFVSDZBQ0VRREpNQ0N5QUVRUUZxSVFSQmd3RWhFQXlTQWdzZ0JFRUJhaUVFUVlRQklSQU1rUUlMSUFSQkFXb2hCRUdGQVNFUURKQUNDeUFFUVFGcUlRUkJrZ0VoRUF5UEFnc2dCRUVCYWlFRVFaZ0JJUkFNamdJTElBUkJBV29oQkVHZ0FTRVFESTBDQ3lBRVFRRnFJUVJCb3dFaEVBeU1BZ3NnQkVFQmFpRUVRYW9CSVJBTWl3SUxBa0FnQkNBQ1JnMEFJQUJCa0lDQWdBQTJBZ2dnQUNBRU5nSUVRYXNCSVJBTWl3SUxRY0FCSVJBTW93SUxJQUFnQlNBQ0VLcUFnSUFBSWdFTml3RWdCU0VCREZ3TEFrQWdCaUFDUmcwQUlBWkJBV29oQlF5TkFRdEJ3Z0VoRUF5aEFnc0RRQUpBSUJBdEFBQkJkbW9PQkl3QkFBQ1BBUUFMSUJCQkFXb2lFQ0FDUncwQUMwSERBU0VRREtBQ0N3SkFJQWNnQWtZTkFDQUFRWkdBZ0lBQU5nSUlJQUFnQnpZQ0JDQUhJUUZCQVNFUURJY0NDMEhFQVNFUURKOENDd0pBSUFjZ0FrY05BRUhGQVNFUURKOENDd0pBQWtBZ0J5MEFBRUYyYWc0RUFjNEJ6Z0VBemdFTElBZEJBV29oQmd5TkFRc2dCMEVCYWlFRkRJa0JDd0pBSUFjZ0FrY05BRUhHQVNFUURKNENDd0pBQWtBZ0J5MEFBRUYyYWc0WEFZOEJqd0VCandHUEFZOEJqd0dQQVk4Qmp3R1BBWThCandHUEFZOEJqd0dQQVk4Qmp3R1BBWThCQUk4QkN5QUhRUUZxSVFjTFFiQUJJUkFNaEFJTEFrQWdDQ0FDUncwQVFjZ0JJUkFNblFJTElBZ3RBQUJCSUVjTmpRRWdBRUVBT3dFeUlBaEJBV29oQVVHekFTRVFESU1DQ3lBQklSY0NRQU5BSUJjaUJ5QUNSZzBCSUFjdEFBQkJVR3BCL3dGeEloQkJDazhOekFFQ1FDQUFMd0V5SWhSQm1UTkxEUUFnQUNBVVFRcHNJaFE3QVRJZ0VFSC8vd056SUJSQi92OERjVWtOQUNBSFFRRnFJUmNnQUNBVUlCQnFJaEE3QVRJZ0VFSC8vd054UWVnSFNRMEJDd3RCQUNFUUlBQkJBRFlDSENBQVFjR0pnSUFBTmdJUUlBQkJEVFlDRENBQUlBZEJBV28yQWhRTW5BSUxRY2NCSVJBTW13SUxJQUFnQ0NBQ0VLNkFnSUFBSWhCRkRjb0JJQkJCRlVjTmpBRWdBRUhJQVRZQ0hDQUFJQWcyQWhRZ0FFSEpsNENBQURZQ0VDQUFRUlUyQWd4QkFDRVFESm9DQ3dKQUlBa2dBa2NOQUVITUFTRVFESm9DQzBFQUlSUkJBU0VYUVFFaEZrRUFJUkFDUUFKQUFrQUNRQUpBQWtBQ1FBSkFBa0FnQ1MwQUFFRlFhZzRLbGdHVkFRQUJBZ01FQlFZSWx3RUxRUUloRUF3R0MwRURJUkFNQlF0QkJDRVFEQVFMUVFVaEVBd0RDMEVHSVJBTUFndEJCeUVRREFFTFFRZ2hFQXRCQUNFWFFRQWhGa0VBSVJRTWpnRUxRUWtoRUVFQklSUkJBQ0VYUVFBaEZneU5BUXNDUUNBS0lBSkhEUUJCemdFaEVBeVpBZ3NnQ2kwQUFFRXVSdzJPQVNBS1FRRnFJUWtNeWdFTElBc2dBa2NOamdGQjBBRWhFQXlYQWdzQ1FDQUxJQUpHRFFBZ0FFR09nSUNBQURZQ0NDQUFJQXMyQWdSQnR3RWhFQXorQVF0QjBRRWhFQXlXQWdzQ1FDQUVJQUpIRFFCQjBnRWhFQXlXQWdzZ0FpQUVheUFBS0FJQUloQnFJUlFnQkNBUWEwRUVhaUVMQTBBZ0JDMEFBQ0FRUWZ6UGdJQUFhaTBBQUVjTmpnRWdFRUVFUmczcEFTQVFRUUZxSVJBZ0JFRUJhaUlFSUFKSERRQUxJQUFnRkRZQ0FFSFNBU0VRREpVQ0N5QUFJQXdnQWhDc2dJQ0FBQ0lCRFkwQklBd2hBUXk0QVFzQ1FDQUVJQUpIRFFCQjFBRWhFQXlVQWdzZ0FpQUVheUFBS0FJQUloQnFJUlFnQkNBUWEwRUJhaUVNQTBBZ0JDMEFBQ0FRUVlIUWdJQUFhaTBBQUVjTmp3RWdFRUVCUmcyT0FTQVFRUUZxSVJBZ0JFRUJhaUlFSUFKSERRQUxJQUFnRkRZQ0FFSFVBU0VRREpNQ0N3SkFJQVFnQWtjTkFFSFdBU0VRREpNQ0N5QUNJQVJySUFBb0FnQWlFR29oRkNBRUlCQnJRUUpxSVFzRFFDQUVMUUFBSUJCQmc5Q0FnQUJxTFFBQVJ3Mk9BU0FRUVFKR0RaQUJJQkJCQVdvaEVDQUVRUUZxSWdRZ0FrY05BQXNnQUNBVU5nSUFRZFlCSVJBTWtnSUxBa0FnQkNBQ1J3MEFRZGNCSVJBTWtnSUxBa0FDUUNBRUxRQUFRYnQvYWc0UUFJOEJqd0dQQVk4Qmp3R1BBWThCandHUEFZOEJqd0dQQVk4Qmp3RUJqd0VMSUFSQkFXb2hCRUc3QVNFUURQa0JDeUFFUVFGcUlRUkJ2QUVoRUF6NEFRc0NRQ0FFSUFKSERRQkIyQUVoRUF5UkFnc2dCQzBBQUVISUFFY05qQUVnQkVFQmFpRUVETVFCQ3dKQUlBUWdBa1lOQUNBQVFaQ0FnSUFBTmdJSUlBQWdCRFlDQkVHK0FTRVFEUGNCQzBIWkFTRVFESThDQ3dKQUlBUWdBa2NOQUVIYUFTRVFESThDQ3lBRUxRQUFRY2dBUmczREFTQUFRUUU2QUNnTXVRRUxJQUJCQWpvQUx5QUFJQVFnQWhDbWdJQ0FBQ0lRRFkwQlFjSUJJUkFNOUFFTElBQXRBQ2hCZjJvT0FyY0J1UUc0QVFzRFFBSkFJQVF0QUFCQmRtb09CQUNPQVk0QkFJNEJDeUFFUVFGcUlnUWdBa2NOQUF0QjNRRWhFQXlMQWdzZ0FFRUFPZ0F2SUFBdEFDMUJCSEZGRFlRQ0N5QUFRUUE2QUM4Z0FFRUJPZ0EwSUFFaEFReU1BUXNnRUVFVlJnM2FBU0FBUVFBMkFod2dBQ0FCTmdJVUlBQkJwNDZBZ0FBMkFoQWdBRUVTTmdJTVFRQWhFQXlJQWdzQ1FDQUFJQkFnQWhDMGdJQ0FBQ0lFRFFBZ0VDRUJESUVDQ3dKQUlBUkJGVWNOQUNBQVFRTTJBaHdnQUNBUU5nSVVJQUJCc0ppQWdBQTJBaEFnQUVFVk5nSU1RUUFoRUF5SUFnc2dBRUVBTmdJY0lBQWdFRFlDRkNBQVFhZU9nSUFBTmdJUUlBQkJFallDREVFQUlSQU1od0lMSUJCQkZVWU4xZ0VnQUVFQU5nSWNJQUFnQVRZQ0ZDQUFRZHFOZ0lBQU5nSVFJQUJCRkRZQ0RFRUFJUkFNaGdJTElBQW9BZ1FoRnlBQVFRQTJBZ1FnRUNBUnAyb2lGaUVCSUFBZ0Z5QVFJQllnRkJzaUVCQzFnSUNBQUNJVVJRMk5BU0FBUVFjMkFod2dBQ0FRTmdJVUlBQWdGRFlDREVFQUlSQU1oUUlMSUFBZ0FDOEJNRUdBQVhJN0FUQWdBU0VCQzBFcUlSQU02Z0VMSUJCQkZVWU4wUUVnQUVFQU5nSWNJQUFnQVRZQ0ZDQUFRWU9NZ0lBQU5nSVFJQUJCRXpZQ0RFRUFJUkFNZ2dJTElCQkJGVVlOendFZ0FFRUFOZ0ljSUFBZ0FUWUNGQ0FBUVpxUGdJQUFOZ0lRSUFCQklqWUNERUVBSVJBTWdRSUxJQUFvQWdRaEVDQUFRUUEyQWdRQ1FDQUFJQkFnQVJDM2dJQ0FBQ0lRRFFBZ0FVRUJhaUVCREkwQkN5QUFRUXcyQWh3Z0FDQVFOZ0lNSUFBZ0FVRUJhallDRkVFQUlSQU1nQUlMSUJCQkZVWU56QUVnQUVFQU5nSWNJQUFnQVRZQ0ZDQUFRWnFQZ0lBQU5nSVFJQUJCSWpZQ0RFRUFJUkFNL3dFTElBQW9BZ1FoRUNBQVFRQTJBZ1FDUUNBQUlCQWdBUkMzZ0lDQUFDSVFEUUFnQVVFQmFpRUJESXdCQ3lBQVFRMDJBaHdnQUNBUU5nSU1JQUFnQVVFQmFqWUNGRUVBSVJBTS9nRUxJQkJCRlVZTnlRRWdBRUVBTmdJY0lBQWdBVFlDRkNBQVFjYU1nSUFBTmdJUUlBQkJJellDREVFQUlSQU0vUUVMSUFBb0FnUWhFQ0FBUVFBMkFnUUNRQ0FBSUJBZ0FSQzVnSUNBQUNJUURRQWdBVUVCYWlFQkRJc0JDeUFBUVE0MkFod2dBQ0FRTmdJTUlBQWdBVUVCYWpZQ0ZFRUFJUkFNL0FFTElBQkJBRFlDSENBQUlBRTJBaFFnQUVIQWxZQ0FBRFlDRUNBQVFRSTJBZ3hCQUNFUURQc0JDeUFRUVJWR0RjVUJJQUJCQURZQ0hDQUFJQUUyQWhRZ0FFSEdqSUNBQURZQ0VDQUFRU00yQWd4QkFDRVFEUG9CQ3lBQVFSQTJBaHdnQUNBQk5nSVVJQUFnRURZQ0RFRUFJUkFNK1FFTElBQW9BZ1FoQkNBQVFRQTJBZ1FDUUNBQUlBUWdBUkM1Z0lDQUFDSUVEUUFnQVVFQmFpRUJEUEVCQ3lBQVFSRTJBaHdnQUNBRU5nSU1JQUFnQVVFQmFqWUNGRUVBSVJBTStBRUxJQkJCRlVZTndRRWdBRUVBTmdJY0lBQWdBVFlDRkNBQVFjYU1nSUFBTmdJUUlBQkJJellDREVFQUlSQU05d0VMSUFBb0FnUWhFQ0FBUVFBMkFnUUNRQ0FBSUJBZ0FSQzVnSUNBQUNJUURRQWdBVUVCYWlFQkRJZ0JDeUFBUVJNMkFod2dBQ0FRTmdJTUlBQWdBVUVCYWpZQ0ZFRUFJUkFNOWdFTElBQW9BZ1FoQkNBQVFRQTJBZ1FDUUNBQUlBUWdBUkM1Z0lDQUFDSUVEUUFnQVVFQmFpRUJETzBCQ3lBQVFSUTJBaHdnQUNBRU5nSU1JQUFnQVVFQmFqWUNGRUVBSVJBTTlRRUxJQkJCRlVZTnZRRWdBRUVBTmdJY0lBQWdBVFlDRkNBQVFacVBnSUFBTmdJUUlBQkJJallDREVFQUlSQU05QUVMSUFBb0FnUWhFQ0FBUVFBMkFnUUNRQ0FBSUJBZ0FSQzNnSUNBQUNJUURRQWdBVUVCYWlFQkRJWUJDeUFBUVJZMkFod2dBQ0FRTmdJTUlBQWdBVUVCYWpZQ0ZFRUFJUkFNOHdFTElBQW9BZ1FoQkNBQVFRQTJBZ1FDUUNBQUlBUWdBUkMzZ0lDQUFDSUVEUUFnQVVFQmFpRUJET2tCQ3lBQVFSYzJBaHdnQUNBRU5nSU1JQUFnQVVFQmFqWUNGRUVBSVJBTThnRUxJQUJCQURZQ0hDQUFJQUUyQWhRZ0FFSE5rNENBQURZQ0VDQUFRUXcyQWd4QkFDRVFEUEVCQzBJQklSRUxJQkJCQVdvaEFRSkFJQUFwQXlBaUVrTC8vLy8vLy8vLy93OVdEUUFnQUNBU1FnU0dJQkdFTndNZ0lBRWhBUXlFQVFzZ0FFRUFOZ0ljSUFBZ0FUWUNGQ0FBUWEySmdJQUFOZ0lRSUFCQkREWUNERUVBSVJBTTd3RUxJQUJCQURZQ0hDQUFJQkEyQWhRZ0FFSE5rNENBQURZQ0VDQUFRUXcyQWd4QkFDRVFETzRCQ3lBQUtBSUVJUmNnQUVFQU5nSUVJQkFnRWFkcUloWWhBU0FBSUJjZ0VDQVdJQlFiSWhBUXRZQ0FnQUFpRkVVTmN5QUFRUVUyQWh3Z0FDQVFOZ0lVSUFBZ0ZEWUNERUVBSVJBTTdRRUxJQUJCQURZQ0hDQUFJQkEyQWhRZ0FFR3FuSUNBQURZQ0VDQUFRUTgyQWd4QkFDRVFET3dCQ3lBQUlCQWdBaEMwZ0lDQUFDSUJEUUVnRUNFQkMwRU9JUkFNMFFFTEFrQWdBVUVWUncwQUlBQkJBallDSENBQUlCQTJBaFFnQUVHd21JQ0FBRFlDRUNBQVFSVTJBZ3hCQUNFUURPb0JDeUFBUVFBMkFod2dBQ0FRTmdJVUlBQkJwNDZBZ0FBMkFoQWdBRUVTTmdJTVFRQWhFQXpwQVFzZ0FVRUJhaUVRQWtBZ0FDOEJNQ0lCUVlBQmNVVU5BQUpBSUFBZ0VDQUNFTHVBZ0lBQUlnRU5BQ0FRSVFFTWNBc2dBVUVWUncyNkFTQUFRUVUyQWh3Z0FDQVFOZ0lVSUFCQitaZUFnQUEyQWhBZ0FFRVZOZ0lNUVFBaEVBenBBUXNDUUNBQlFhQUVjVUdnQkVjTkFDQUFMUUF0UVFKeERRQWdBRUVBTmdJY0lBQWdFRFlDRkNBQVFaYVRnSUFBTmdJUUlBQkJCRFlDREVFQUlSQU02UUVMSUFBZ0VDQUNFTDJBZ0lBQUdpQVFJUUVDUUFKQUFrQUNRQUpBSUFBZ0VDQUNFTE9BZ0lBQURoWUNBUUFFQkFRRUJBUUVCQVFFQkFRRUJBUUVCQVFEQkFzZ0FFRUJPZ0F1Q3lBQUlBQXZBVEJCd0FCeU93RXdJQkFoQVF0QkppRVFETkVCQ3lBQVFTTTJBaHdnQUNBUU5nSVVJQUJCcFphQWdBQTJBaEFnQUVFVk5nSU1RUUFoRUF6cEFRc2dBRUVBTmdJY0lBQWdFRFlDRkNBQVFkV0xnSUFBTmdJUUlBQkJFVFlDREVFQUlSQU02QUVMSUFBdEFDMUJBWEZGRFFGQnd3RWhFQXpPQVFzQ1FDQU5JQUpHRFFBRFFBSkFJQTB0QUFCQklFWU5BQ0FOSVFFTXhBRUxJQTFCQVdvaURTQUNSdzBBQzBFbElSQU01d0VMUVNVaEVBem1BUXNnQUNnQ0JDRUVJQUJCQURZQ0JDQUFJQVFnRFJDdmdJQ0FBQ0lFUlEydEFTQUFRU1kyQWh3Z0FDQUVOZ0lNSUFBZ0RVRUJhallDRkVFQUlSQU01UUVMSUJCQkZVWU5xd0VnQUVFQU5nSWNJQUFnQVRZQ0ZDQUFRZjJOZ0lBQU5nSVFJQUJCSFRZQ0RFRUFJUkFNNUFFTElBQkJKellDSENBQUlBRTJBaFFnQUNBUU5nSU1RUUFoRUF6akFRc2dFQ0VCUVFFaEZBSkFBa0FDUUFKQUFrQUNRQUpBSUFBdEFDeEJmbW9PQndZRkJRTUJBZ0FGQ3lBQUlBQXZBVEJCQ0hJN0FUQU1Bd3RCQWlFVURBRUxRUVFoRkFzZ0FFRUJPZ0FzSUFBZ0FDOEJNQ0FVY2pzQk1Bc2dFQ0VCQzBFcklSQU15Z0VMSUFCQkFEWUNIQ0FBSUJBMkFoUWdBRUdya29DQUFEWUNFQ0FBUVFzMkFneEJBQ0VRRE9JQkN5QUFRUUEyQWh3Z0FDQUJOZ0lVSUFCQjRZK0FnQUEyQWhBZ0FFRUtOZ0lNUVFBaEVBemhBUXNnQUVFQU9nQXNJQkFoQVF5OUFRc2dFQ0VCUVFFaEZBSkFBa0FDUUFKQUFrQWdBQzBBTEVGN2FnNEVBd0VDQUFVTElBQWdBQzhCTUVFSWNqc0JNQXdEQzBFQ0lSUU1BUXRCQkNFVUN5QUFRUUU2QUN3Z0FDQUFMd0V3SUJSeU93RXdDeUFRSVFFTFFTa2hFQXpGQVFzZ0FFRUFOZ0ljSUFBZ0FUWUNGQ0FBUWZDVWdJQUFOZ0lRSUFCQkF6WUNERUVBSVJBTTNRRUxBa0FnRGkwQUFFRU5SdzBBSUFBb0FnUWhBU0FBUVFBMkFnUUNRQ0FBSUFFZ0RoQ3hnSUNBQUNJQkRRQWdEa0VCYWlFQkRIVUxJQUJCTERZQ0hDQUFJQUUyQWd3Z0FDQU9RUUZxTmdJVVFRQWhFQXpkQVFzZ0FDMEFMVUVCY1VVTkFVSEVBU0VRRE1NQkN3SkFJQTRnQWtjTkFFRXRJUkFNM0FFTEFrQUNRQU5BQWtBZ0RpMEFBRUYyYWc0RUFnQUFBd0FMSUE1QkFXb2lEaUFDUncwQUMwRXRJUkFNM1FFTElBQW9BZ1FoQVNBQVFRQTJBZ1FDUUNBQUlBRWdEaEN4Z0lDQUFDSUJEUUFnRGlFQkRIUUxJQUJCTERZQ0hDQUFJQTQyQWhRZ0FDQUJOZ0lNUVFBaEVBemNBUXNnQUNnQ0JDRUJJQUJCQURZQ0JBSkFJQUFnQVNBT0VMR0FnSUFBSWdFTkFDQU9RUUZxSVFFTWN3c2dBRUVzTmdJY0lBQWdBVFlDRENBQUlBNUJBV28yQWhSQkFDRVFETnNCQ3lBQUtBSUVJUVFnQUVFQU5nSUVJQUFnQkNBT0VMR0FnSUFBSWdRTm9BRWdEaUVCRE00QkN5QVFRU3hIRFFFZ0FVRUJhaUVRUVFFaEFRSkFBa0FDUUFKQUFrQWdBQzBBTEVGN2FnNEVBd0VDQkFBTElCQWhBUXdFQzBFQ0lRRU1BUXRCQkNFQkN5QUFRUUU2QUN3Z0FDQUFMd0V3SUFGeU93RXdJQkFoQVF3QkN5QUFJQUF2QVRCQkNISTdBVEFnRUNFQkMwRTVJUkFNdndFTElBQkJBRG9BTENBQklRRUxRVFFoRUF5OUFRc2dBQ0FBTHdFd1FTQnlPd0V3SUFFaEFRd0NDeUFBS0FJRUlRUWdBRUVBTmdJRUFrQWdBQ0FFSUFFUXNZQ0FnQUFpQkEwQUlBRWhBUXpIQVFzZ0FFRTNOZ0ljSUFBZ0FUWUNGQ0FBSUFRMkFneEJBQ0VRRE5RQkN5QUFRUWc2QUN3Z0FTRUJDMEV3SVJBTXVRRUxBa0FnQUMwQUtFRUJSZzBBSUFFaEFRd0VDeUFBTFFBdFFRaHhSUTJUQVNBQklRRU1Bd3NnQUMwQU1FRWdjUTJVQVVIRkFTRVFETGNCQ3dKQUlBOGdBa1lOQUFKQUEwQUNRQ0FQTFFBQVFWQnFJZ0ZCL3dGeFFRcEpEUUFnRHlFQlFUVWhFQXk2QVFzZ0FDa0RJQ0lSUXBtejVzeVpzK2JNR1ZZTkFTQUFJQkZDQ240aUVUY0RJQ0FSSUFHdFF2OEJneUlTUW4rRlZnMEJJQUFnRVNBU2ZEY0RJQ0FQUVFGcUlnOGdBa2NOQUF0Qk9TRVFETkVCQ3lBQUtBSUVJUUlnQUVFQU5nSUVJQUFnQWlBUFFRRnFJZ1FRc1lDQWdBQWlBZzJWQVNBRUlRRU13d0VMUVRraEVBelBBUXNDUUNBQUx3RXdJZ0ZCQ0hGRkRRQWdBQzBBS0VFQlJ3MEFJQUF0QUMxQkNIRkZEWkFCQ3lBQUlBRkI5L3NEY1VHQUJISTdBVEFnRHlFQkMwRTNJUkFNdEFFTElBQWdBQzhCTUVFUWNqc0JNQXlyQVFzZ0VFRVZSZzJMQVNBQVFRQTJBaHdnQUNBQk5nSVVJQUJCOEk2QWdBQTJBaEFnQUVFY05nSU1RUUFoRUF6TEFRc2dBRUhEQURZQ0hDQUFJQUUyQWd3Z0FDQU5RUUZxTmdJVVFRQWhFQXpLQVFzQ1FDQUJMUUFBUVRwSERRQWdBQ2dDQkNFUUlBQkJBRFlDQkFKQUlBQWdFQ0FCRUsrQWdJQUFJaEFOQUNBQlFRRnFJUUVNWXdzZ0FFSERBRFlDSENBQUlCQTJBZ3dnQUNBQlFRRnFOZ0lVUVFBaEVBektBUXNnQUVFQU5nSWNJQUFnQVRZQ0ZDQUFRYkdSZ0lBQU5nSVFJQUJCQ2pZQ0RFRUFJUkFNeVFFTElBQkJBRFlDSENBQUlBRTJBaFFnQUVHZ21ZQ0FBRFlDRUNBQVFSNDJBZ3hCQUNFUURNZ0JDeUFBUVFBMkFnQUxJQUJCZ0JJN0FTb2dBQ0FYUVFGcUlnRWdBaENvZ0lDQUFDSVFEUUVnQVNFQkMwSEhBQ0VRREt3QkN5QVFRUlZIRFlNQklBQkIwUUEyQWh3Z0FDQUJOZ0lVSUFCQjQ1ZUFnQUEyQWhBZ0FFRVZOZ0lNUVFBaEVBekVBUXNnQUNnQ0JDRVFJQUJCQURZQ0JBSkFJQUFnRUNBQkVLZUFnSUFBSWhBTkFDQUJJUUVNWGdzZ0FFSFNBRFlDSENBQUlBRTJBaFFnQUNBUU5nSU1RUUFoRUF6REFRc2dBRUVBTmdJY0lBQWdGRFlDRkNBQVFjR29nSUFBTmdJUUlBQkJCellDRENBQVFRQTJBZ0JCQUNFUURNSUJDeUFBS0FJRUlSQWdBRUVBTmdJRUFrQWdBQ0FRSUFFUXA0Q0FnQUFpRUEwQUlBRWhBUXhkQ3lBQVFkTUFOZ0ljSUFBZ0FUWUNGQ0FBSUJBMkFneEJBQ0VRRE1FQkMwRUFJUkFnQUVFQU5nSWNJQUFnQVRZQ0ZDQUFRWUNSZ0lBQU5nSVFJQUJCQ1RZQ0RBekFBUXNnRUVFVlJnMTlJQUJCQURZQ0hDQUFJQUUyQWhRZ0FFR1VqWUNBQURZQ0VDQUFRU0UyQWd4QkFDRVFETDhCQzBFQklSWkJBQ0VYUVFBaEZFRUJJUkFMSUFBZ0VEb0FLeUFCUVFGcUlRRUNRQUpBSUFBdEFDMUJFSEVOQUFKQUFrQUNRQ0FBTFFBcURnTUJBQUlFQ3lBV1JRMEREQUlMSUJRTkFRd0NDeUFYUlEwQkN5QUFLQUlFSVJBZ0FFRUFOZ0lFQWtBZ0FDQVFJQUVRcllDQWdBQWlFQTBBSUFFaEFReGNDeUFBUWRnQU5nSWNJQUFnQVRZQ0ZDQUFJQkEyQWd4QkFDRVFETDRCQ3lBQUtBSUVJUVFnQUVFQU5nSUVBa0FnQUNBRUlBRVFyWUNBZ0FBaUJBMEFJQUVoQVF5dEFRc2dBRUhaQURZQ0hDQUFJQUUyQWhRZ0FDQUVOZ0lNUVFBaEVBeTlBUXNnQUNnQ0JDRUVJQUJCQURZQ0JBSkFJQUFnQkNBQkVLMkFnSUFBSWdRTkFDQUJJUUVNcXdFTElBQkIyZ0EyQWh3Z0FDQUJOZ0lVSUFBZ0JEWUNERUVBSVJBTXZBRUxJQUFvQWdRaEJDQUFRUUEyQWdRQ1FDQUFJQVFnQVJDdGdJQ0FBQ0lFRFFBZ0FTRUJES2tCQ3lBQVFkd0FOZ0ljSUFBZ0FUWUNGQ0FBSUFRMkFneEJBQ0VRRExzQkN3SkFJQUV0QUFCQlVHb2lFRUgvQVhGQkNrOE5BQ0FBSUJBNkFDb2dBVUVCYWlFQlFjOEFJUkFNb2dFTElBQW9BZ1FoQkNBQVFRQTJBZ1FDUUNBQUlBUWdBUkN0Z0lDQUFDSUVEUUFnQVNFQkRLY0JDeUFBUWQ0QU5nSWNJQUFnQVRZQ0ZDQUFJQVEyQWd4QkFDRVFETG9CQ3lBQVFRQTJBZ0FnRjBFQmFpRUJBa0FnQUMwQUtVRWpUdzBBSUFFaEFReFpDeUFBUVFBMkFod2dBQ0FCTmdJVUlBQkIwNG1BZ0FBMkFoQWdBRUVJTmdJTVFRQWhFQXk1QVFzZ0FFRUFOZ0lBQzBFQUlSQWdBRUVBTmdJY0lBQWdBVFlDRkNBQVFaQ3pnSUFBTmdJUUlBQkJDRFlDREF5M0FRc2dBRUVBTmdJQUlCZEJBV29oQVFKQUlBQXRBQ2xCSVVjTkFDQUJJUUVNVmdzZ0FFRUFOZ0ljSUFBZ0FUWUNGQ0FBUVp1S2dJQUFOZ0lRSUFCQkNEWUNERUVBSVJBTXRnRUxJQUJCQURZQ0FDQVhRUUZxSVFFQ1FDQUFMUUFwSWhCQlhXcEJDMDhOQUNBQklRRU1WUXNDUUNBUVFRWkxEUUJCQVNBUWRFSEtBSEZGRFFBZ0FTRUJERlVMUVFBaEVDQUFRUUEyQWh3Z0FDQUJOZ0lVSUFCQjk0bUFnQUEyQWhBZ0FFRUlOZ0lNRExVQkN5QVFRUlZHRFhFZ0FFRUFOZ0ljSUFBZ0FUWUNGQ0FBUWJtTmdJQUFOZ0lRSUFCQkdqWUNERUVBSVJBTXRBRUxJQUFvQWdRaEVDQUFRUUEyQWdRQ1FDQUFJQkFnQVJDbmdJQ0FBQ0lRRFFBZ0FTRUJERlFMSUFCQjVRQTJBaHdnQUNBQk5nSVVJQUFnRURZQ0RFRUFJUkFNc3dFTElBQW9BZ1FoRUNBQVFRQTJBZ1FDUUNBQUlCQWdBUkNuZ0lDQUFDSVFEUUFnQVNFQkRFMExJQUJCMGdBMkFod2dBQ0FCTmdJVUlBQWdFRFlDREVFQUlSQU1zZ0VMSUFBb0FnUWhFQ0FBUVFBMkFnUUNRQ0FBSUJBZ0FSQ25nSUNBQUNJUURRQWdBU0VCREUwTElBQkIwd0EyQWh3Z0FDQUJOZ0lVSUFBZ0VEWUNERUVBSVJBTXNRRUxJQUFvQWdRaEVDQUFRUUEyQWdRQ1FDQUFJQkFnQVJDbmdJQ0FBQ0lRRFFBZ0FTRUJERkVMSUFCQjVRQTJBaHdnQUNBQk5nSVVJQUFnRURZQ0RFRUFJUkFNc0FFTElBQkJBRFlDSENBQUlBRTJBaFFnQUVIR2lvQ0FBRFlDRUNBQVFRYzJBZ3hCQUNFUURLOEJDeUFBS0FJRUlSQWdBRUVBTmdJRUFrQWdBQ0FRSUFFUXA0Q0FnQUFpRUEwQUlBRWhBUXhKQ3lBQVFkSUFOZ0ljSUFBZ0FUWUNGQ0FBSUJBMkFneEJBQ0VRREs0QkN5QUFLQUlFSVJBZ0FFRUFOZ0lFQWtBZ0FDQVFJQUVRcDRDQWdBQWlFQTBBSUFFaEFReEpDeUFBUWRNQU5nSWNJQUFnQVRZQ0ZDQUFJQkEyQWd4QkFDRVFESzBCQ3lBQUtBSUVJUkFnQUVFQU5nSUVBa0FnQUNBUUlBRVFwNENBZ0FBaUVBMEFJQUVoQVF4TkN5QUFRZVVBTmdJY0lBQWdBVFlDRkNBQUlCQTJBZ3hCQUNFUURLd0JDeUFBUVFBMkFod2dBQ0FCTmdJVUlBQkIzSWlBZ0FBMkFoQWdBRUVITmdJTVFRQWhFQXlyQVFzZ0VFRS9SdzBCSUFGQkFXb2hBUXRCQlNFUURKQUJDMEVBSVJBZ0FFRUFOZ0ljSUFBZ0FUWUNGQ0FBUWYyU2dJQUFOZ0lRSUFCQkJ6WUNEQXlvQVFzZ0FDZ0NCQ0VRSUFCQkFEWUNCQUpBSUFBZ0VDQUJFS2VBZ0lBQUloQU5BQ0FCSVFFTVFnc2dBRUhTQURZQ0hDQUFJQUUyQWhRZ0FDQVFOZ0lNUVFBaEVBeW5BUXNnQUNnQ0JDRVFJQUJCQURZQ0JBSkFJQUFnRUNBQkVLZUFnSUFBSWhBTkFDQUJJUUVNUWdzZ0FFSFRBRFlDSENBQUlBRTJBaFFnQUNBUU5nSU1RUUFoRUF5bUFRc2dBQ2dDQkNFUUlBQkJBRFlDQkFKQUlBQWdFQ0FCRUtlQWdJQUFJaEFOQUNBQklRRU1SZ3NnQUVIbEFEWUNIQ0FBSUFFMkFoUWdBQ0FRTmdJTVFRQWhFQXlsQVFzZ0FDZ0NCQ0VCSUFCQkFEWUNCQUpBSUFBZ0FTQVVFS2VBZ0lBQUlnRU5BQ0FVSVFFTVB3c2dBRUhTQURZQ0hDQUFJQlEyQWhRZ0FDQUJOZ0lNUVFBaEVBeWtBUXNnQUNnQ0JDRUJJQUJCQURZQ0JBSkFJQUFnQVNBVUVLZUFnSUFBSWdFTkFDQVVJUUVNUHdzZ0FFSFRBRFlDSENBQUlCUTJBaFFnQUNBQk5nSU1RUUFoRUF5akFRc2dBQ2dDQkNFQklBQkJBRFlDQkFKQUlBQWdBU0FVRUtlQWdJQUFJZ0VOQUNBVUlRRU1Rd3NnQUVIbEFEWUNIQ0FBSUJRMkFoUWdBQ0FCTmdJTVFRQWhFQXlpQVFzZ0FFRUFOZ0ljSUFBZ0ZEWUNGQ0FBUWNPUGdJQUFOZ0lRSUFCQkJ6WUNERUVBSVJBTW9RRUxJQUJCQURZQ0hDQUFJQUUyQWhRZ0FFSERqNENBQURZQ0VDQUFRUWMyQWd4QkFDRVFES0FCQzBFQUlSQWdBRUVBTmdJY0lBQWdGRFlDRkNBQVFZeWNnSUFBTmdJUUlBQkJCellDREF5ZkFRc2dBRUVBTmdJY0lBQWdGRFlDRkNBQVFZeWNnSUFBTmdJUUlBQkJCellDREVFQUlSQU1uZ0VMSUFCQkFEWUNIQ0FBSUJRMkFoUWdBRUgra1lDQUFEWUNFQ0FBUVFjMkFneEJBQ0VRREowQkN5QUFRUUEyQWh3Z0FDQUJOZ0lVSUFCQmpwdUFnQUEyQWhBZ0FFRUdOZ0lNUVFBaEVBeWNBUXNnRUVFVlJnMVhJQUJCQURZQ0hDQUFJQUUyQWhRZ0FFSE1qb0NBQURZQ0VDQUFRU0EyQWd4QkFDRVFESnNCQ3lBQVFRQTJBZ0FnRUVFQmFpRUJRU1FoRUFzZ0FDQVFPZ0FwSUFBb0FnUWhFQ0FBUVFBMkFnUWdBQ0FRSUFFUXE0Q0FnQUFpRUExVUlBRWhBUXcrQ3lBQVFRQTJBZ0FMUVFBaEVDQUFRUUEyQWh3Z0FDQUVOZ0lVSUFCQjhadUFnQUEyQWhBZ0FFRUdOZ0lNREpjQkN5QUJRUlZHRFZBZ0FFRUFOZ0ljSUFBZ0JUWUNGQ0FBUWZDTWdJQUFOZ0lRSUFCQkd6WUNERUVBSVJBTWxnRUxJQUFvQWdRaEJTQUFRUUEyQWdRZ0FDQUZJQkFRcVlDQWdBQWlCUTBCSUJCQkFXb2hCUXRCclFFaEVBeDdDeUFBUWNFQk5nSWNJQUFnQlRZQ0RDQUFJQkJCQVdvMkFoUkJBQ0VRREpNQkN5QUFLQUlFSVFZZ0FFRUFOZ0lFSUFBZ0JpQVFFS21BZ0lBQUlnWU5BU0FRUVFGcUlRWUxRYTRCSVJBTWVBc2dBRUhDQVRZQ0hDQUFJQVkyQWd3Z0FDQVFRUUZxTmdJVVFRQWhFQXlRQVFzZ0FFRUFOZ0ljSUFBZ0J6WUNGQ0FBUVplTGdJQUFOZ0lRSUFCQkRUWUNERUVBSVJBTWp3RUxJQUJCQURZQ0hDQUFJQWcyQWhRZ0FFSGprSUNBQURZQ0VDQUFRUWsyQWd4QkFDRVFESTRCQ3lBQVFRQTJBaHdnQUNBSU5nSVVJQUJCbEkyQWdBQTJBaEFnQUVFaE5nSU1RUUFoRUF5TkFRdEJBU0VXUVFBaEYwRUFJUlJCQVNFUUN5QUFJQkE2QUNzZ0NVRUJhaUVJQWtBQ1FDQUFMUUF0UVJCeERRQUNRQUpBQWtBZ0FDMEFLZzREQVFBQ0JBc2dGa1VOQXd3Q0N5QVVEUUVNQWdzZ0YwVU5BUXNnQUNnQ0JDRVFJQUJCQURZQ0JDQUFJQkFnQ0JDdGdJQ0FBQ0lRUlEwOUlBQkJ5UUUyQWh3Z0FDQUlOZ0lVSUFBZ0VEWUNERUVBSVJBTWpBRUxJQUFvQWdRaEJDQUFRUUEyQWdRZ0FDQUVJQWdRcllDQWdBQWlCRVVOZGlBQVFjb0JOZ0ljSUFBZ0NEWUNGQ0FBSUFRMkFneEJBQ0VRRElzQkN5QUFLQUlFSVFRZ0FFRUFOZ0lFSUFBZ0JDQUpFSzJBZ0lBQUlnUkZEWFFnQUVITEFUWUNIQ0FBSUFrMkFoUWdBQ0FFTmdJTVFRQWhFQXlLQVFzZ0FDZ0NCQ0VFSUFCQkFEWUNCQ0FBSUFRZ0NoQ3RnSUNBQUNJRVJRMXlJQUJCelFFMkFod2dBQ0FLTmdJVUlBQWdCRFlDREVFQUlSQU1pUUVMQWtBZ0N5MEFBRUZRYWlJUVFmOEJjVUVLVHcwQUlBQWdFRG9BS2lBTFFRRnFJUXBCdGdFaEVBeHdDeUFBS0FJRUlRUWdBRUVBTmdJRUlBQWdCQ0FMRUsyQWdJQUFJZ1JGRFhBZ0FFSFBBVFlDSENBQUlBczJBaFFnQUNBRU5nSU1RUUFoRUF5SUFRc2dBRUVBTmdJY0lBQWdCRFlDRkNBQVFaQ3pnSUFBTmdJUUlBQkJDRFlDRENBQVFRQTJBZ0JCQUNFUURJY0JDeUFCUVJWR0RUOGdBRUVBTmdJY0lBQWdERFlDRkNBQVFjeU9nSUFBTmdJUUlBQkJJRFlDREVFQUlSQU1oZ0VMSUFCQmdRUTdBU2dnQUNnQ0JDRVFJQUJDQURjREFDQUFJQkFnREVFQmFpSU1FS3VBZ0lBQUloQkZEVGdnQUVIVEFUWUNIQ0FBSUF3MkFoUWdBQ0FRTmdJTVFRQWhFQXlGQVFzZ0FFRUFOZ0lBQzBFQUlSQWdBRUVBTmdJY0lBQWdCRFlDRkNBQVFkaWJnSUFBTmdJUUlBQkJDRFlDREF5REFRc2dBQ2dDQkNFUUlBQkNBRGNEQUNBQUlCQWdDMEVCYWlJTEVLdUFnSUFBSWhBTkFVSEdBU0VRREdrTElBQkJBam9BS0F4VkN5QUFRZFVCTmdJY0lBQWdDellDRkNBQUlCQTJBZ3hCQUNFUURJQUJDeUFRUVJWR0RUY2dBRUVBTmdJY0lBQWdCRFlDRkNBQVFhU01nSUFBTmdJUUlBQkJFRFlDREVFQUlSQU1md3NnQUMwQU5FRUJSdzAwSUFBZ0JDQUNFTHlBZ0lBQUloQkZEVFFnRUVFVlJ3MDFJQUJCM0FFMkFod2dBQ0FFTmdJVUlBQkIxWmFBZ0FBMkFoQWdBRUVWTmdJTVFRQWhFQXgrQzBFQUlSQWdBRUVBTmdJY0lBQkJyNHVBZ0FBMkFoQWdBRUVDTmdJTUlBQWdGRUVCYWpZQ0ZBeDlDMEVBSVJBTVl3dEJBaUVRREdJTFFRMGhFQXhoQzBFUElSQU1ZQXRCSlNFUURGOExRUk1oRUF4ZUMwRVZJUkFNWFF0QkZpRVFERndMUVJjaEVBeGJDMEVZSVJBTVdndEJHU0VRREZrTFFSb2hFQXhZQzBFYklSQU1Wd3RCSENFUURGWUxRUjBoRUF4VkMwRWZJUkFNVkF0QklTRVFERk1MUVNNaEVBeFNDMEhHQUNFUURGRUxRUzRoRUF4UUMwRXZJUkFNVHd0Qk95RVFERTRMUVQwaEVBeE5DMEhJQUNFUURFd0xRY2tBSVJBTVN3dEJ5d0FoRUF4S0MwSE1BQ0VRREVrTFFjNEFJUkFNU0F0QjBRQWhFQXhIQzBIVkFDRVFERVlMUWRnQUlSQU1SUXRCMlFBaEVBeEVDMEhiQUNFUURFTUxRZVFBSVJBTVFndEI1UUFoRUF4QkMwSHhBQ0VRREVBTFFmUUFJUkFNUHd0QmpRRWhFQXcrQzBHWEFTRVFERDBMUWFrQklSQU1QQXRCckFFaEVBdzdDMEhBQVNFUUREb0xRYmtCSVJBTU9RdEJyd0VoRUF3NEMwR3hBU0VRRERjTFFiSUJJUkFNTmd0QnRBRWhFQXcxQzBHMUFTRVFERFFMUWJvQklSQU1Nd3RCdlFFaEVBd3lDMEcvQVNFUURERUxRY0VCSVJBTU1Bc2dBRUVBTmdJY0lBQWdCRFlDRkNBQVFlbUxnSUFBTmdJUUlBQkJIellDREVFQUlSQU1TQXNnQUVIYkFUWUNIQ0FBSUFRMkFoUWdBRUg2bG9DQUFEWUNFQ0FBUVJVMkFneEJBQ0VRREVjTElBQkIrQUEyQWh3Z0FDQU1OZ0lVSUFCQnlwaUFnQUEyQWhBZ0FFRVZOZ0lNUVFBaEVBeEdDeUFBUWRFQU5nSWNJQUFnQlRZQ0ZDQUFRYkNYZ0lBQU5nSVFJQUJCRlRZQ0RFRUFJUkFNUlFzZ0FFSDVBRFlDSENBQUlBRTJBaFFnQUNBUU5nSU1RUUFoRUF4RUN5QUFRZmdBTmdJY0lBQWdBVFlDRkNBQVFjcVlnSUFBTmdJUUlBQkJGVFlDREVFQUlSQU1Rd3NnQUVIa0FEWUNIQ0FBSUFFMkFoUWdBRUhqbDRDQUFEWUNFQ0FBUVJVMkFneEJBQ0VRREVJTElBQkIxd0EyQWh3Z0FDQUJOZ0lVSUFCQnlaZUFnQUEyQWhBZ0FFRVZOZ0lNUVFBaEVBeEJDeUFBUVFBMkFod2dBQ0FCTmdJVUlBQkJ1WTJBZ0FBMkFoQWdBRUVhTmdJTVFRQWhFQXhBQ3lBQVFjSUFOZ0ljSUFBZ0FUWUNGQ0FBUWVPWWdJQUFOZ0lRSUFCQkZUWUNERUVBSVJBTVB3c2dBRUVBTmdJRUlBQWdEeUFQRUxHQWdJQUFJZ1JGRFFFZ0FFRTZOZ0ljSUFBZ0JEWUNEQ0FBSUE5QkFXbzJBaFJCQUNFUURENExJQUFvQWdRaEJDQUFRUUEyQWdRQ1FDQUFJQVFnQVJDeGdJQ0FBQ0lFUlEwQUlBQkJPellDSENBQUlBUTJBZ3dnQUNBQlFRRnFOZ0lVUVFBaEVBdytDeUFCUVFGcUlRRU1MUXNnRDBFQmFpRUJEQzBMSUFCQkFEWUNIQ0FBSUE4MkFoUWdBRUhra29DQUFEWUNFQ0FBUVFRMkFneEJBQ0VRRERzTElBQkJOallDSENBQUlBUTJBaFFnQUNBQ05nSU1RUUFoRUF3NkN5QUFRUzQyQWh3Z0FDQU9OZ0lVSUFBZ0JEWUNERUVBSVJBTU9Rc2dBRUhRQURZQ0hDQUFJQUUyQWhRZ0FFR1JtSUNBQURZQ0VDQUFRUlUyQWd4QkFDRVFERGdMSUExQkFXb2hBUXdzQ3lBQVFSVTJBaHdnQUNBQk5nSVVJQUJCZ3BtQWdBQTJBaEFnQUVFVk5nSU1RUUFoRUF3MkN5QUFRUnMyQWh3Z0FDQUJOZ0lVSUFCQmtaZUFnQUEyQWhBZ0FFRVZOZ0lNUVFBaEVBdzFDeUFBUVE4MkFod2dBQ0FCTmdJVUlBQkJrWmVBZ0FBMkFoQWdBRUVWTmdJTVFRQWhFQXcwQ3lBQVFRczJBaHdnQUNBQk5nSVVJQUJCa1plQWdBQTJBaEFnQUVFVk5nSU1RUUFoRUF3ekN5QUFRUm8yQWh3Z0FDQUJOZ0lVSUFCQmdwbUFnQUEyQWhBZ0FFRVZOZ0lNUVFBaEVBd3lDeUFBUVFzMkFod2dBQ0FCTmdJVUlBQkJncG1BZ0FBMkFoQWdBRUVWTmdJTVFRQWhFQXd4Q3lBQVFRbzJBaHdnQUNBQk5nSVVJQUJCNUphQWdBQTJBaEFnQUVFVk5nSU1RUUFoRUF3d0N5QUFRUjQyQWh3Z0FDQUJOZ0lVSUFCQitaZUFnQUEyQWhBZ0FFRVZOZ0lNUVFBaEVBd3ZDeUFBUVFBMkFod2dBQ0FRTmdJVUlBQkIybzJBZ0FBMkFoQWdBRUVVTmdJTVFRQWhFQXd1Q3lBQVFRUTJBaHdnQUNBQk5nSVVJQUJCc0ppQWdBQTJBaEFnQUVFVk5nSU1RUUFoRUF3dEN5QUFRUUEyQWdBZ0MwRUJhaUVMQzBHNEFTRVFEQklMSUFCQkFEWUNBQ0FRUVFGcUlRRkI5UUFoRUF3UkN5QUJJUUVDUUNBQUxRQXBRUVZIRFFCQjR3QWhFQXdSQzBIaUFDRVFEQkFMUVFBaEVDQUFRUUEyQWh3Z0FFSGtrWUNBQURZQ0VDQUFRUWMyQWd3Z0FDQVVRUUZxTmdJVURDZ0xJQUJCQURZQ0FDQVhRUUZxSVFGQndBQWhFQXdPQzBFQklRRUxJQUFnQVRvQUxDQUFRUUEyQWdBZ0YwRUJhaUVCQzBFb0lSQU1Dd3NnQVNFQkMwRTRJUkFNQ1FzQ1FDQUJJZzhnQWtZTkFBTkFBa0FnRHkwQUFFR0F2b0NBQUdvdEFBQWlBVUVCUmcwQUlBRkJBa2NOQXlBUFFRRnFJUUVNQkFzZ0QwRUJhaUlQSUFKSERRQUxRVDRoRUF3aUMwRStJUkFNSVFzZ0FFRUFPZ0FzSUE4aEFRd0JDMEVMSVJBTUJndEJPaUVRREFVTElBRkJBV29oQVVFdElSQU1CQXNnQUNBQk9nQXNJQUJCQURZQ0FDQVdRUUZxSVFGQkRDRVFEQU1MSUFCQkFEWUNBQ0FYUVFGcUlRRkJDaUVRREFJTElBQkJBRFlDQUFzZ0FFRUFPZ0FzSUEwaEFVRUpJUkFNQUFzTFFRQWhFQ0FBUVFBMkFod2dBQ0FMTmdJVUlBQkJ6WkNBZ0FBMkFoQWdBRUVKTmdJTURCY0xRUUFoRUNBQVFRQTJBaHdnQUNBS05nSVVJQUJCNllxQWdBQTJBaEFnQUVFSk5nSU1EQllMUVFBaEVDQUFRUUEyQWh3Z0FDQUpOZ0lVSUFCQnQ1Q0FnQUEyQWhBZ0FFRUpOZ0lNREJVTFFRQWhFQ0FBUVFBMkFod2dBQ0FJTmdJVUlBQkJuSkdBZ0FBMkFoQWdBRUVKTmdJTURCUUxRUUFoRUNBQVFRQTJBaHdnQUNBQk5nSVVJQUJCelpDQWdBQTJBaEFnQUVFSk5nSU1EQk1MUVFBaEVDQUFRUUEyQWh3Z0FDQUJOZ0lVSUFCQjZZcUFnQUEyQWhBZ0FFRUpOZ0lNREJJTFFRQWhFQ0FBUVFBMkFod2dBQ0FCTmdJVUlBQkJ0NUNBZ0FBMkFoQWdBRUVKTmdJTURCRUxRUUFoRUNBQVFRQTJBaHdnQUNBQk5nSVVJQUJCbkpHQWdBQTJBaEFnQUVFSk5nSU1EQkFMUVFBaEVDQUFRUUEyQWh3Z0FDQUJOZ0lVSUFCQmw1V0FnQUEyQWhBZ0FFRVBOZ0lNREE4TFFRQWhFQ0FBUVFBMkFod2dBQ0FCTmdJVUlBQkJsNVdBZ0FBMkFoQWdBRUVQTmdJTURBNExRUUFoRUNBQVFRQTJBaHdnQUNBQk5nSVVJQUJCd0pLQWdBQTJBaEFnQUVFTE5nSU1EQTBMUVFBaEVDQUFRUUEyQWh3Z0FDQUJOZ0lVSUFCQmxZbUFnQUEyQWhBZ0FFRUxOZ0lNREF3TFFRQWhFQ0FBUVFBMkFod2dBQ0FCTmdJVUlBQkI0WStBZ0FBMkFoQWdBRUVLTmdJTURBc0xRUUFoRUNBQVFRQTJBaHdnQUNBQk5nSVVJQUJCKzQrQWdBQTJBaEFnQUVFS05nSU1EQW9MUVFBaEVDQUFRUUEyQWh3Z0FDQUJOZ0lVSUFCQjhabUFnQUEyQWhBZ0FFRUNOZ0lNREFrTFFRQWhFQ0FBUVFBMkFod2dBQ0FCTmdJVUlBQkJ4SlNBZ0FBMkFoQWdBRUVDTmdJTURBZ0xRUUFoRUNBQVFRQTJBaHdnQUNBQk5nSVVJQUJCOHBXQWdBQTJBaEFnQUVFQ05nSU1EQWNMSUFCQkFqWUNIQ0FBSUFFMkFoUWdBRUdjbW9DQUFEWUNFQ0FBUVJZMkFneEJBQ0VRREFZTFFRRWhFQXdGQzBIVUFDRVFJQUVpQkNBQ1JnMEVJQU5CQ0dvZ0FDQUVJQUpCMk1LQWdBQkJDaERGZ0lDQUFDQURLQUlNSVFRZ0F5Z0NDQTREQVFRQ0FBc1F5b0NBZ0FBQUN5QUFRUUEyQWh3Z0FFRzFtb0NBQURZQ0VDQUFRUmMyQWd3Z0FDQUVRUUZxTmdJVVFRQWhFQXdDQ3lBQVFRQTJBaHdnQUNBRU5nSVVJQUJCeXBxQWdBQTJBaEFnQUVFSk5nSU1RUUFoRUF3QkN3SkFJQUVpQkNBQ1J3MEFRU0loRUF3QkN5QUFRWW1BZ0lBQU5nSUlJQUFnQkRZQ0JFRWhJUkFMSUFOQkVHb2tnSUNBZ0FBZ0VBdXZBUUVDZnlBQktBSUFJUVlDUUFKQUlBSWdBMFlOQUNBRUlBWnFJUVFnQmlBRGFpQUNheUVISUFJZ0JrRi9jeUFGYWlJR2FpRUZBMEFDUUNBQ0xRQUFJQVF0QUFCR0RRQkJBaUVFREFNTEFrQWdCZzBBUVFBaEJDQUZJUUlNQXdzZ0JrRi9haUVHSUFSQkFXb2hCQ0FDUVFGcUlnSWdBMGNOQUFzZ0J5RUdJQU1oQWdzZ0FFRUJOZ0lBSUFFZ0JqWUNBQ0FBSUFJMkFnUVBDeUFCUVFBMkFnQWdBQ0FFTmdJQUlBQWdBallDQkFzS0FDQUFFTWVBZ0lBQUMvSTJBUXQvSTRDQWdJQUFRUkJySWdFa2dJQ0FnQUFDUUVFQUtBS2cwSUNBQUEwQVFRQVF5NENBZ0FCQmdOU0VnQUJySWdKQjJRQkpEUUJCQUNFREFrQkJBQ2dDNE5PQWdBQWlCQTBBUVFCQ2Z6Y0M3Tk9BZ0FCQkFFS0FnSVNBZ0lEQUFEY0M1Tk9BZ0FCQkFDQUJRUWhxUVhCeFFkaXExYW9GY3lJRU5nTGcwNENBQUVFQVFRQTJBdlRUZ0lBQVFRQkJBRFlDeE5PQWdBQUxRUUFnQWpZQ3pOT0FnQUJCQUVHQTFJU0FBRFlDeU5PQWdBQkJBRUdBMUlTQUFEWUNtTkNBZ0FCQkFDQUVOZ0tzMElDQUFFRUFRWDgyQXFqUWdJQUFBMEFnQTBIRTBJQ0FBR29nQTBHNDBJQ0FBR29pQkRZQ0FDQUVJQU5Cc05DQWdBQnFJZ1UyQWdBZ0EwRzgwSUNBQUdvZ0JUWUNBQ0FEUWN6UWdJQUFhaUFEUWNEUWdJQUFhaUlGTmdJQUlBVWdCRFlDQUNBRFFkVFFnSUFBYWlBRFFjalFnSUFBYWlJRU5nSUFJQVFnQlRZQ0FDQURRZERRZ0lBQWFpQUVOZ0lBSUFOQklHb2lBMEdBQWtjTkFBdEJnTlNFZ0FCQmVFR0ExSVNBQUd0QkQzRkJBRUdBMUlTQUFFRUlha0VQY1JzaUEyb2lCRUVFYWlBQ1FVaHFJZ1VnQTJzaUEwRUJjallDQUVFQVFRQW9BdkRUZ0lBQU5nS2swSUNBQUVFQUlBTTJBcFRRZ0lBQVFRQWdCRFlDb05DQWdBQkJnTlNFZ0FBZ0JXcEJPRFlDQkFzQ1FBSkFBa0FDUUFKQUFrQUNRQUpBQWtBQ1FBSkFBa0FnQUVIc0FVc05BQUpBUVFBb0FvalFnSUFBSWdaQkVDQUFRUk5xUVhCeElBQkJDMGtiSWdKQkEzWWlCSFlpQTBFRGNVVU5BQUpBQWtBZ0EwRUJjU0FFY2tFQmN5SUZRUU4wSWdSQnNOQ0FnQUJxSWdNZ0JFRzQwSUNBQUdvb0FnQWlCQ2dDQ0NJQ1J3MEFRUUFnQmtGK0lBVjNjVFlDaU5DQWdBQU1BUXNnQXlBQ05nSUlJQUlnQXpZQ0RBc2dCRUVJYWlFRElBUWdCVUVEZENJRlFRTnlOZ0lFSUFRZ0JXb2lCQ0FFS0FJRVFRRnlOZ0lFREF3TElBSkJBQ2dDa05DQWdBQWlCMDBOQVFKQUlBTkZEUUFDUUFKQUlBTWdCSFJCQWlBRWRDSURRUUFnQTJ0eWNTSURRUUFnQTJ0eFFYOXFJZ01nQTBFTWRrRVFjU0lEZGlJRVFRVjJRUWh4SWdVZ0EzSWdCQ0FGZGlJRFFRSjJRUVJ4SWdSeUlBTWdCSFlpQTBFQmRrRUNjU0lFY2lBRElBUjJJZ05CQVhaQkFYRWlCSElnQXlBRWRtb2lCRUVEZENJRFFiRFFnSUFBYWlJRklBTkJ1TkNBZ0FCcUtBSUFJZ01vQWdnaUFFY05BRUVBSUFaQmZpQUVkM0VpQmpZQ2lOQ0FnQUFNQVFzZ0JTQUFOZ0lJSUFBZ0JUWUNEQXNnQXlBQ1FRTnlOZ0lFSUFNZ0JFRURkQ0lFYWlBRUlBSnJJZ1UyQWdBZ0F5QUNhaUlBSUFWQkFYSTJBZ1FDUUNBSFJRMEFJQWRCZUhGQnNOQ0FnQUJxSVFKQkFDZ0NuTkNBZ0FBaEJBSkFBa0FnQmtFQklBZEJBM1owSWdoeERRQkJBQ0FHSUFoeU5nS0kwSUNBQUNBQ0lRZ01BUXNnQWlnQ0NDRUlDeUFJSUFRMkFnd2dBaUFFTmdJSUlBUWdBallDRENBRUlBZzJBZ2dMSUFOQkNHb2hBMEVBSUFBMkFwelFnSUFBUVFBZ0JUWUNrTkNBZ0FBTURBdEJBQ2dDak5DQWdBQWlDVVVOQVNBSlFRQWdDV3R4UVg5cUlnTWdBMEVNZGtFUWNTSURkaUlFUVFWMlFRaHhJZ1VnQTNJZ0JDQUZkaUlEUVFKMlFRUnhJZ1J5SUFNZ0JIWWlBMEVCZGtFQ2NTSUVjaUFESUFSMklnTkJBWFpCQVhFaUJISWdBeUFFZG1wQkFuUkJ1TktBZ0FCcUtBSUFJZ0FvQWdSQmVIRWdBbXNoQkNBQUlRVUNRQU5BQWtBZ0JTZ0NFQ0lERFFBZ0JVRVVhaWdDQUNJRFJRMENDeUFES0FJRVFYaHhJQUpySWdVZ0JDQUZJQVJKSWdVYklRUWdBeUFBSUFVYklRQWdBeUVGREFBTEN5QUFLQUlZSVFvQ1FDQUFLQUlNSWdnZ0FFWU5BQ0FBS0FJSUlnTkJBQ2dDbU5DQWdBQkpHaUFJSUFNMkFnZ2dBeUFJTmdJTURBc0xBa0FnQUVFVWFpSUZLQUlBSWdNTkFDQUFLQUlRSWdORkRRTWdBRUVRYWlFRkN3TkFJQVVoQ3lBRElnaEJGR29pQlNnQ0FDSUREUUFnQ0VFUWFpRUZJQWdvQWhBaUF3MEFDeUFMUVFBMkFnQU1DZ3RCZnlFQ0lBQkJ2MzlMRFFBZ0FFRVRhaUlEUVhCeElRSkJBQ2dDak5DQWdBQWlCMFVOQUVFQUlRc0NRQ0FDUVlBQ1NRMEFRUjhoQ3lBQ1FmLy8vd2RMRFFBZ0EwRUlkaUlESUFOQmdQNC9ha0VRZGtFSWNTSURkQ0lFSUFSQmdPQWZha0VRZGtFRWNTSUVkQ0lGSUFWQmdJQVBha0VRZGtFQ2NTSUZkRUVQZGlBRElBUnlJQVZ5YXlJRFFRRjBJQUlnQTBFVmFuWkJBWEZ5UVJ4cUlRc0xRUUFnQW1zaEJBSkFBa0FDUUFKQUlBdEJBblJCdU5LQWdBQnFLQUlBSWdVTkFFRUFJUU5CQUNFSURBRUxRUUFoQXlBQ1FRQkJHU0FMUVFGMmF5QUxRUjlHRzNRaEFFRUFJUWdEUUFKQUlBVW9BZ1JCZUhFZ0Ftc2lCaUFFVHcwQUlBWWhCQ0FGSVFnZ0JnMEFRUUFoQkNBRklRZ2dCU0VEREFNTElBTWdCVUVVYWlnQ0FDSUdJQVlnQlNBQVFSMTJRUVJ4YWtFUWFpZ0NBQ0lGUmhzZ0F5QUdHeUVESUFCQkFYUWhBQ0FGRFFBTEN3SkFJQU1nQ0hJTkFFRUFJUWhCQWlBTGRDSURRUUFnQTJ0eUlBZHhJZ05GRFFNZ0EwRUFJQU5yY1VGL2FpSURJQU5CREhaQkVIRWlBM1lpQlVFRmRrRUljU0lBSUFOeUlBVWdBSFlpQTBFQ2RrRUVjU0lGY2lBRElBVjJJZ05CQVhaQkFuRWlCWElnQXlBRmRpSURRUUYyUVFGeElnVnlJQU1nQlhacVFRSjBRYmpTZ0lBQWFpZ0NBQ0VEQ3lBRFJRMEJDd05BSUFNb0FnUkJlSEVnQW1zaUJpQUVTU0VBQWtBZ0F5Z0NFQ0lGRFFBZ0EwRVVhaWdDQUNFRkN5QUdJQVFnQUJzaEJDQURJQWdnQUJzaENDQUZJUU1nQlEwQUN3c2dDRVVOQUNBRVFRQW9BcERRZ0lBQUlBSnJUdzBBSUFnb0FoZ2hDd0pBSUFnb0Fnd2lBQ0FJUmcwQUlBZ29BZ2dpQTBFQUtBS1kwSUNBQUVrYUlBQWdBellDQ0NBRElBQTJBZ3dNQ1FzQ1FDQUlRUlJxSWdVb0FnQWlBdzBBSUFnb0FoQWlBMFVOQXlBSVFSQnFJUVVMQTBBZ0JTRUdJQU1pQUVFVWFpSUZLQUlBSWdNTkFDQUFRUkJxSVFVZ0FDZ0NFQ0lERFFBTElBWkJBRFlDQUF3SUN3SkFRUUFvQXBEUWdJQUFJZ01nQWtrTkFFRUFLQUtjMElDQUFDRUVBa0FDUUNBRElBSnJJZ1ZCRUVrTkFDQUVJQUpxSWdBZ0JVRUJjallDQkVFQUlBVTJBcERRZ0lBQVFRQWdBRFlDbk5DQWdBQWdCQ0FEYWlBRk5nSUFJQVFnQWtFRGNqWUNCQXdCQ3lBRUlBTkJBM0kyQWdRZ0JDQURhaUlESUFNb0FnUkJBWEkyQWdSQkFFRUFOZ0tjMElDQUFFRUFRUUEyQXBEUWdJQUFDeUFFUVFocUlRTU1DZ3NDUUVFQUtBS1UwSUNBQUNJQUlBSk5EUUJCQUNnQ29OQ0FnQUFpQXlBQ2FpSUVJQUFnQW1zaUJVRUJjallDQkVFQUlBVTJBcFRRZ0lBQVFRQWdCRFlDb05DQWdBQWdBeUFDUVFOeU5nSUVJQU5CQ0dvaEF3d0tDd0pBQWtCQkFDZ0M0Tk9BZ0FCRkRRQkJBQ2dDNk5PQWdBQWhCQXdCQzBFQVFuODNBdXpUZ0lBQVFRQkNnSUNFZ0lDQXdBQTNBdVRUZ0lBQVFRQWdBVUVNYWtGd2NVSFlxdFdxQlhNMkF1RFRnSUFBUVFCQkFEWUM5Tk9BZ0FCQkFFRUFOZ0xFMDRDQUFFR0FnQVFoQkF0QkFDRURBa0FnQkNBQ1FjY0FhaUlIYWlJR1FRQWdCR3NpQzNFaUNDQUNTdzBBUVFCQk1EWUMrTk9BZ0FBTUNnc0NRRUVBS0FMQTA0Q0FBQ0lEUlEwQUFrQkJBQ2dDdU5PQWdBQWlCQ0FJYWlJRklBUk5EUUFnQlNBRFRRMEJDMEVBSVFOQkFFRXdOZ0w0MDRDQUFBd0tDMEVBTFFERTA0Q0FBRUVFY1EwRUFrQUNRQUpBUVFBb0FxRFFnSUFBSWdSRkRRQkJ5Tk9BZ0FBaEF3TkFBa0FnQXlnQ0FDSUZJQVJMRFFBZ0JTQURLQUlFYWlBRVN3MERDeUFES0FJSUlnTU5BQXNMUVFBUXk0Q0FnQUFpQUVGL1JnMEZJQWdoQmdKQVFRQW9BdVRUZ0lBQUlnTkJmMm9pQkNBQWNVVU5BQ0FJSUFCcklBUWdBR3BCQUNBRGEzRnFJUVlMSUFZZ0FrME5CU0FHUWY3Ly8vOEhTdzBGQWtCQkFDZ0N3Tk9BZ0FBaUEwVU5BRUVBS0FLNDA0Q0FBQ0lFSUFacUlnVWdCRTBOQmlBRklBTkxEUVlMSUFZUXk0Q0FnQUFpQXlBQVJ3MEJEQWNMSUFZZ0FHc2dDM0VpQmtIKy8vLy9CMHNOQkNBR0VNdUFnSUFBSWdBZ0F5Z0NBQ0FES0FJRWFrWU5BeUFBSVFNTEFrQWdBMEYvUmcwQUlBSkJ5QUJxSUFaTkRRQUNRQ0FISUFaclFRQW9BdWpUZ0lBQUlnUnFRUUFnQkd0eElnUkIvdi8vL3dkTkRRQWdBeUVBREFjTEFrQWdCQkRMZ0lDQUFFRi9SZzBBSUFRZ0Jtb2hCaUFESVFBTUJ3dEJBQ0FHYXhETGdJQ0FBQm9NQkFzZ0F5RUFJQU5CZjBjTkJRd0RDMEVBSVFnTUJ3dEJBQ0VBREFVTElBQkJmMGNOQWd0QkFFRUFLQUxFMDRDQUFFRUVjallDeE5PQWdBQUxJQWhCL3YvLy93ZExEUUVnQ0JETGdJQ0FBQ0VBUVFBUXk0Q0FnQUFoQXlBQVFYOUdEUUVnQTBGL1JnMEJJQUFnQTA4TkFTQURJQUJySWdZZ0FrRTRhazBOQVF0QkFFRUFLQUs0MDRDQUFDQUdhaUlETmdLNDA0Q0FBQUpBSUFOQkFDZ0N2Tk9BZ0FCTkRRQkJBQ0FETmdLODA0Q0FBQXNDUUFKQUFrQUNRRUVBS0FLZzBJQ0FBQ0lFUlEwQVFjalRnSUFBSVFNRFFDQUFJQU1vQWdBaUJTQURLQUlFSWdocVJnMENJQU1vQWdnaUF3MEFEQU1MQ3dKQUFrQkJBQ2dDbU5DQWdBQWlBMFVOQUNBQUlBTlBEUUVMUVFBZ0FEWUNtTkNBZ0FBTFFRQWhBMEVBSUFZMkFzelRnSUFBUVFBZ0FEWUN5Tk9BZ0FCQkFFRi9OZ0tvMElDQUFFRUFRUUFvQXVEVGdJQUFOZ0tzMElDQUFFRUFRUUEyQXRUVGdJQUFBMEFnQTBIRTBJQ0FBR29nQTBHNDBJQ0FBR29pQkRZQ0FDQUVJQU5Cc05DQWdBQnFJZ1UyQWdBZ0EwRzgwSUNBQUdvZ0JUWUNBQ0FEUWN6UWdJQUFhaUFEUWNEUWdJQUFhaUlGTmdJQUlBVWdCRFlDQUNBRFFkVFFnSUFBYWlBRFFjalFnSUFBYWlJRU5nSUFJQVFnQlRZQ0FDQURRZERRZ0lBQWFpQUVOZ0lBSUFOQklHb2lBMEdBQWtjTkFBc2dBRUY0SUFCclFROXhRUUFnQUVFSWFrRVBjUnNpQTJvaUJDQUdRVWhxSWdVZ0Eyc2lBMEVCY2pZQ0JFRUFRUUFvQXZEVGdJQUFOZ0trMElDQUFFRUFJQU0yQXBUUWdJQUFRUUFnQkRZQ29OQ0FnQUFnQUNBRmFrRTROZ0lFREFJTElBTXRBQXhCQ0hFTkFDQUVJQVZKRFFBZ0JDQUFUdzBBSUFSQmVDQUVhMEVQY1VFQUlBUkJDR3BCRDNFYklnVnFJZ0JCQUNnQ2xOQ0FnQUFnQm1vaUN5QUZheUlGUVFGeU5nSUVJQU1nQ0NBR2FqWUNCRUVBUVFBb0F2RFRnSUFBTmdLazBJQ0FBRUVBSUFVMkFwVFFnSUFBUVFBZ0FEWUNvTkNBZ0FBZ0JDQUxha0U0TmdJRURBRUxBa0FnQUVFQUtBS1kwSUNBQUNJSVR3MEFRUUFnQURZQ21OQ0FnQUFnQUNFSUN5QUFJQVpxSVFWQnlOT0FnQUFoQXdKQUFrQUNRQUpBQWtBQ1FBSkFBMEFnQXlnQ0FDQUZSZzBCSUFNb0FnZ2lBdzBBREFJTEN5QURMUUFNUVFoeFJRMEJDMEhJMDRDQUFDRURBMEFDUUNBREtBSUFJZ1VnQkVzTkFDQUZJQU1vQWdScUlnVWdCRXNOQXdzZ0F5Z0NDQ0VEREFBTEN5QURJQUEyQWdBZ0F5QURLQUlFSUFacU5nSUVJQUJCZUNBQWEwRVBjVUVBSUFCQkNHcEJEM0ViYWlJTElBSkJBM0kyQWdRZ0JVRjRJQVZyUVE5eFFRQWdCVUVJYWtFUGNSdHFJZ1lnQ3lBQ2FpSUNheUVEQWtBZ0JpQUVSdzBBUVFBZ0FqWUNvTkNBZ0FCQkFFRUFLQUtVMElDQUFDQURhaUlETmdLVTBJQ0FBQ0FDSUFOQkFYSTJBZ1FNQXdzQ1FDQUdRUUFvQXB6UWdJQUFSdzBBUVFBZ0FqWUNuTkNBZ0FCQkFFRUFLQUtRMElDQUFDQURhaUlETmdLUTBJQ0FBQ0FDSUFOQkFYSTJBZ1FnQWlBRGFpQUROZ0lBREFNTEFrQWdCaWdDQkNJRVFRTnhRUUZIRFFBZ0JFRjRjU0VIQWtBQ1FDQUVRZjhCU3cwQUlBWW9BZ2dpQlNBRVFRTjJJZ2hCQTNSQnNOQ0FnQUJxSWdCR0dnSkFJQVlvQWd3aUJDQUZSdzBBUVFCQkFDZ0NpTkNBZ0FCQmZpQUlkM0UyQW9qUWdJQUFEQUlMSUFRZ0FFWWFJQVFnQlRZQ0NDQUZJQVEyQWd3TUFRc2dCaWdDR0NFSkFrQUNRQ0FHS0FJTUlnQWdCa1lOQUNBR0tBSUlJZ1FnQ0VrYUlBQWdCRFlDQ0NBRUlBQTJBZ3dNQVFzQ1FDQUdRUlJxSWdRb0FnQWlCUTBBSUFaQkVHb2lCQ2dDQUNJRkRRQkJBQ0VBREFFTEEwQWdCQ0VJSUFVaUFFRVVhaUlFS0FJQUlnVU5BQ0FBUVJCcUlRUWdBQ2dDRUNJRkRRQUxJQWhCQURZQ0FBc2dDVVVOQUFKQUFrQWdCaUFHS0FJY0lnVkJBblJCdU5LQWdBQnFJZ1FvQWdCSERRQWdCQ0FBTmdJQUlBQU5BVUVBUVFBb0FvelFnSUFBUVg0Z0JYZHhOZ0tNMElDQUFBd0NDeUFKUVJCQkZDQUpLQUlRSUFaR0cyb2dBRFlDQUNBQVJRMEJDeUFBSUFrMkFoZ0NRQ0FHS0FJUUlnUkZEUUFnQUNBRU5nSVFJQVFnQURZQ0dBc2dCaWdDRkNJRVJRMEFJQUJCRkdvZ0JEWUNBQ0FFSUFBMkFoZ0xJQWNnQTJvaEF5QUdJQWRxSWdZb0FnUWhCQXNnQmlBRVFYNXhOZ0lFSUFJZ0Eyb2dBellDQUNBQ0lBTkJBWEkyQWdRQ1FDQURRZjhCU3cwQUlBTkJlSEZCc05DQWdBQnFJUVFDUUFKQVFRQW9Bb2pRZ0lBQUlnVkJBU0FEUVFOMmRDSURjUTBBUVFBZ0JTQURjallDaU5DQWdBQWdCQ0VEREFFTElBUW9BZ2doQXdzZ0F5QUNOZ0lNSUFRZ0FqWUNDQ0FDSUFRMkFnd2dBaUFETmdJSURBTUxRUjhoQkFKQUlBTkIvLy8vQjBzTkFDQURRUWgySWdRZ0JFR0EvajlxUVJCMlFRaHhJZ1IwSWdVZ0JVR0E0QjlxUVJCMlFRUnhJZ1YwSWdBZ0FFR0FnQTlxUVJCMlFRSnhJZ0IwUVE5MklBUWdCWElnQUhKcklnUkJBWFFnQXlBRVFSVnFka0VCY1hKQkhHb2hCQXNnQWlBRU5nSWNJQUpDQURjQ0VDQUVRUUowUWJqU2dJQUFhaUVGQWtCQkFDZ0NqTkNBZ0FBaUFFRUJJQVIwSWdoeERRQWdCU0FDTmdJQVFRQWdBQ0FJY2pZQ2pOQ0FnQUFnQWlBRk5nSVlJQUlnQWpZQ0NDQUNJQUkyQWd3TUF3c2dBMEVBUVJrZ0JFRUJkbXNnQkVFZlJodDBJUVFnQlNnQ0FDRUFBMEFnQUNJRktBSUVRWGh4SUFOR0RRSWdCRUVkZGlFQUlBUkJBWFFoQkNBRklBQkJCSEZxUVJCcUlnZ29BZ0FpQUEwQUN5QUlJQUkyQWdBZ0FpQUZOZ0lZSUFJZ0FqWUNEQ0FDSUFJMkFnZ01BZ3NnQUVGNElBQnJRUTl4UVFBZ0FFRUlha0VQY1JzaUEyb2lDeUFHUVVocUlnZ2dBMnNpQTBFQmNqWUNCQ0FBSUFocVFUZzJBZ1FnQkNBRlFUY2dCV3RCRDNGQkFDQUZRVWxxUVE5eEcycEJRV29pQ0NBSUlBUkJFR3BKR3lJSVFTTTJBZ1JCQUVFQUtBTHcwNENBQURZQ3BOQ0FnQUJCQUNBRE5nS1UwSUNBQUVFQUlBczJBcURRZ0lBQUlBaEJFR3BCQUNrQzBOT0FnQUEzQWdBZ0NFRUFLUUxJMDRDQUFEY0NDRUVBSUFoQkNHbzJBdERUZ0lBQVFRQWdCallDek5PQWdBQkJBQ0FBTmdMSTA0Q0FBRUVBUVFBMkF0VFRnSUFBSUFoQkpHb2hBd05BSUFOQkJ6WUNBQ0FEUVFScUlnTWdCVWtOQUFzZ0NDQUVSZzBESUFnZ0NDZ0NCRUYrY1RZQ0JDQUlJQWdnQkdzaUFEWUNBQ0FFSUFCQkFYSTJBZ1FDUUNBQVFmOEJTdzBBSUFCQmVIRkJzTkNBZ0FCcUlRTUNRQUpBUVFBb0FvalFnSUFBSWdWQkFTQUFRUU4yZENJQWNRMEFRUUFnQlNBQWNqWUNpTkNBZ0FBZ0F5RUZEQUVMSUFNb0FnZ2hCUXNnQlNBRU5nSU1JQU1nQkRZQ0NDQUVJQU0yQWd3Z0JDQUZOZ0lJREFRTFFSOGhBd0pBSUFCQi8vLy9CMHNOQUNBQVFRaDJJZ01nQTBHQS9qOXFRUkIyUVFoeElnTjBJZ1VnQlVHQTRCOXFRUkIyUVFSeElnVjBJZ2dnQ0VHQWdBOXFRUkIyUVFKeElnaDBRUTkySUFNZ0JYSWdDSEpySWdOQkFYUWdBQ0FEUVJWcWRrRUJjWEpCSEdvaEF3c2dCQ0FETmdJY0lBUkNBRGNDRUNBRFFRSjBRYmpTZ0lBQWFpRUZBa0JCQUNnQ2pOQ0FnQUFpQ0VFQklBTjBJZ1p4RFFBZ0JTQUVOZ0lBUVFBZ0NDQUdjallDak5DQWdBQWdCQ0FGTmdJWUlBUWdCRFlDQ0NBRUlBUTJBZ3dNQkFzZ0FFRUFRUmtnQTBFQmRtc2dBMEVmUmh0MElRTWdCU2dDQUNFSUEwQWdDQ0lGS0FJRVFYaHhJQUJHRFFNZ0EwRWRkaUVJSUFOQkFYUWhBeUFGSUFoQkJIRnFRUkJxSWdZb0FnQWlDQTBBQ3lBR0lBUTJBZ0FnQkNBRk5nSVlJQVFnQkRZQ0RDQUVJQVEyQWdnTUF3c2dCU2dDQ0NJRElBSTJBZ3dnQlNBQ05nSUlJQUpCQURZQ0dDQUNJQVUyQWd3Z0FpQUROZ0lJQ3lBTFFRaHFJUU1NQlFzZ0JTZ0NDQ0lESUFRMkFnd2dCU0FFTmdJSUlBUkJBRFlDR0NBRUlBVTJBZ3dnQkNBRE5nSUlDMEVBS0FLVTBJQ0FBQ0lESUFKTkRRQkJBQ2dDb05DQWdBQWlCQ0FDYWlJRklBTWdBbXNpQTBFQmNqWUNCRUVBSUFNMkFwVFFnSUFBUVFBZ0JUWUNvTkNBZ0FBZ0JDQUNRUU55TmdJRUlBUkJDR29oQXd3REMwRUFJUU5CQUVFd05nTDQwNENBQUF3Q0N3SkFJQXRGRFFBQ1FBSkFJQWdnQ0NnQ0hDSUZRUUowUWJqU2dJQUFhaUlES0FJQVJ3MEFJQU1nQURZQ0FDQUFEUUZCQUNBSFFYNGdCWGR4SWdjMkFvelFnSUFBREFJTElBdEJFRUVVSUFzb0FoQWdDRVliYWlBQU5nSUFJQUJGRFFFTElBQWdDellDR0FKQUlBZ29BaEFpQTBVTkFDQUFJQU0yQWhBZ0F5QUFOZ0lZQ3lBSVFSUnFLQUlBSWdORkRRQWdBRUVVYWlBRE5nSUFJQU1nQURZQ0dBc0NRQUpBSUFSQkQwc05BQ0FJSUFRZ0Ftb2lBMEVEY2pZQ0JDQUlJQU5xSWdNZ0F5Z0NCRUVCY2pZQ0JBd0JDeUFJSUFKcUlnQWdCRUVCY2pZQ0JDQUlJQUpCQTNJMkFnUWdBQ0FFYWlBRU5nSUFBa0FnQkVIL0FVc05BQ0FFUVhoeFFiRFFnSUFBYWlFREFrQUNRRUVBS0FLSTBJQ0FBQ0lGUVFFZ0JFRURkblFpQkhFTkFFRUFJQVVnQkhJMkFvalFnSUFBSUFNaEJBd0JDeUFES0FJSUlRUUxJQVFnQURZQ0RDQURJQUEyQWdnZ0FDQUROZ0lNSUFBZ0JEWUNDQXdCQzBFZklRTUNRQ0FFUWYvLy93ZExEUUFnQkVFSWRpSURJQU5CZ1A0L2FrRVFka0VJY1NJRGRDSUZJQVZCZ09BZmFrRVFka0VFY1NJRmRDSUNJQUpCZ0lBUGFrRVFka0VDY1NJQ2RFRVBkaUFESUFWeUlBSnlheUlEUVFGMElBUWdBMEVWYW5aQkFYRnlRUnhxSVFNTElBQWdBellDSENBQVFnQTNBaEFnQTBFQ2RFRzQwb0NBQUdvaEJRSkFJQWRCQVNBRGRDSUNjUTBBSUFVZ0FEWUNBRUVBSUFjZ0FuSTJBb3pRZ0lBQUlBQWdCVFlDR0NBQUlBQTJBZ2dnQUNBQU5nSU1EQUVMSUFSQkFFRVpJQU5CQVhacklBTkJIMFliZENFRElBVW9BZ0FoQWdKQUEwQWdBaUlGS0FJRVFYaHhJQVJHRFFFZ0EwRWRkaUVDSUFOQkFYUWhBeUFGSUFKQkJIRnFRUkJxSWdZb0FnQWlBZzBBQ3lBR0lBQTJBZ0FnQUNBRk5nSVlJQUFnQURZQ0RDQUFJQUEyQWdnTUFRc2dCU2dDQ0NJRElBQTJBZ3dnQlNBQU5nSUlJQUJCQURZQ0dDQUFJQVUyQWd3Z0FDQUROZ0lJQ3lBSVFRaHFJUU1NQVFzQ1FDQUtSUTBBQWtBQ1FDQUFJQUFvQWh3aUJVRUNkRUc0MG9DQUFHb2lBeWdDQUVjTkFDQURJQWcyQWdBZ0NBMEJRUUFnQ1VGK0lBVjNjVFlDak5DQWdBQU1BZ3NnQ2tFUVFSUWdDaWdDRUNBQVJodHFJQWcyQWdBZ0NFVU5BUXNnQ0NBS05nSVlBa0FnQUNnQ0VDSURSUTBBSUFnZ0F6WUNFQ0FESUFnMkFoZ0xJQUJCRkdvb0FnQWlBMFVOQUNBSVFSUnFJQU0yQWdBZ0F5QUlOZ0lZQ3dKQUFrQWdCRUVQU3cwQUlBQWdCQ0FDYWlJRFFRTnlOZ0lFSUFBZ0Eyb2lBeUFES0FJRVFRRnlOZ0lFREFFTElBQWdBbW9pQlNBRVFRRnlOZ0lFSUFBZ0FrRURjallDQkNBRklBUnFJQVEyQWdBQ1FDQUhSUTBBSUFkQmVIRkJzTkNBZ0FCcUlRSkJBQ2dDbk5DQWdBQWhBd0pBQWtCQkFTQUhRUU4yZENJSUlBWnhEUUJCQUNBSUlBWnlOZ0tJMElDQUFDQUNJUWdNQVFzZ0FpZ0NDQ0VJQ3lBSUlBTTJBZ3dnQWlBRE5nSUlJQU1nQWpZQ0RDQURJQWcyQWdnTFFRQWdCVFlDbk5DQWdBQkJBQ0FFTmdLUTBJQ0FBQXNnQUVFSWFpRURDeUFCUVJCcUpJQ0FnSUFBSUFNTENnQWdBQkRKZ0lDQUFBdmlEUUVIZndKQUlBQkZEUUFnQUVGNGFpSUJJQUJCZkdvb0FnQWlBa0Y0Y1NJQWFpRURBa0FnQWtFQmNRMEFJQUpCQTNGRkRRRWdBU0FCS0FJQUlnSnJJZ0ZCQUNnQ21OQ0FnQUFpQkVrTkFTQUNJQUJxSVFBQ1FDQUJRUUFvQXB6UWdJQUFSZzBBQWtBZ0FrSC9BVXNOQUNBQktBSUlJZ1FnQWtFRGRpSUZRUU4wUWJEUWdJQUFhaUlHUmhvQ1FDQUJLQUlNSWdJZ0JFY05BRUVBUVFBb0FvalFnSUFBUVg0Z0JYZHhOZ0tJMElDQUFBd0RDeUFDSUFaR0dpQUNJQVEyQWdnZ0JDQUNOZ0lNREFJTElBRW9BaGdoQndKQUFrQWdBU2dDRENJR0lBRkdEUUFnQVNnQ0NDSUNJQVJKR2lBR0lBSTJBZ2dnQWlBR05nSU1EQUVMQWtBZ0FVRVVhaUlDS0FJQUlnUU5BQ0FCUVJCcUlnSW9BZ0FpQkEwQVFRQWhCZ3dCQ3dOQUlBSWhCU0FFSWdaQkZHb2lBaWdDQUNJRURRQWdCa0VRYWlFQ0lBWW9BaEFpQkEwQUN5QUZRUUEyQWdBTElBZEZEUUVDUUFKQUlBRWdBU2dDSENJRVFRSjBRYmpTZ0lBQWFpSUNLQUlBUncwQUlBSWdCallDQUNBR0RRRkJBRUVBS0FLTTBJQ0FBRUYrSUFSM2NUWUNqTkNBZ0FBTUF3c2dCMEVRUVJRZ0J5Z0NFQ0FCUmh0cUlBWTJBZ0FnQmtVTkFnc2dCaUFITmdJWUFrQWdBU2dDRUNJQ1JRMEFJQVlnQWpZQ0VDQUNJQVkyQWhnTElBRW9BaFFpQWtVTkFTQUdRUlJxSUFJMkFnQWdBaUFHTmdJWURBRUxJQU1vQWdRaUFrRURjVUVEUncwQUlBTWdBa0YrY1RZQ0JFRUFJQUEyQXBEUWdJQUFJQUVnQUdvZ0FEWUNBQ0FCSUFCQkFYSTJBZ1FQQ3lBQklBTlBEUUFnQXlnQ0JDSUNRUUZ4UlEwQUFrQUNRQ0FDUVFKeERRQUNRQ0FEUVFBb0FxRFFnSUFBUncwQVFRQWdBVFlDb05DQWdBQkJBRUVBS0FLVTBJQ0FBQ0FBYWlJQU5nS1UwSUNBQUNBQklBQkJBWEkyQWdRZ0FVRUFLQUtjMElDQUFFY05BMEVBUVFBMkFwRFFnSUFBUVFCQkFEWUNuTkNBZ0FBUEN3SkFJQU5CQUNnQ25OQ0FnQUJIRFFCQkFDQUJOZ0tjMElDQUFFRUFRUUFvQXBEUWdJQUFJQUJxSWdBMkFwRFFnSUFBSUFFZ0FFRUJjallDQkNBQklBQnFJQUEyQWdBUEN5QUNRWGh4SUFCcUlRQUNRQUpBSUFKQi93RkxEUUFnQXlnQ0NDSUVJQUpCQTNZaUJVRURkRUd3MElDQUFHb2lCa1lhQWtBZ0F5Z0NEQ0lDSUFSSERRQkJBRUVBS0FLSTBJQ0FBRUYrSUFWM2NUWUNpTkNBZ0FBTUFnc2dBaUFHUmhvZ0FpQUVOZ0lJSUFRZ0FqWUNEQXdCQ3lBREtBSVlJUWNDUUFKQUlBTW9BZ3dpQmlBRFJnMEFJQU1vQWdnaUFrRUFLQUtZMElDQUFFa2FJQVlnQWpZQ0NDQUNJQVkyQWd3TUFRc0NRQ0FEUVJScUlnSW9BZ0FpQkEwQUlBTkJFR29pQWlnQ0FDSUVEUUJCQUNFR0RBRUxBMEFnQWlFRklBUWlCa0VVYWlJQ0tBSUFJZ1FOQUNBR1FSQnFJUUlnQmlnQ0VDSUVEUUFMSUFWQkFEWUNBQXNnQjBVTkFBSkFBa0FnQXlBREtBSWNJZ1JCQW5SQnVOS0FnQUJxSWdJb0FnQkhEUUFnQWlBR05nSUFJQVlOQVVFQVFRQW9Bb3pRZ0lBQVFYNGdCSGR4TmdLTTBJQ0FBQXdDQ3lBSFFSQkJGQ0FIS0FJUUlBTkdHMm9nQmpZQ0FDQUdSUTBCQ3lBR0lBYzJBaGdDUUNBREtBSVFJZ0pGRFFBZ0JpQUNOZ0lRSUFJZ0JqWUNHQXNnQXlnQ0ZDSUNSUTBBSUFaQkZHb2dBallDQUNBQ0lBWTJBaGdMSUFFZ0FHb2dBRFlDQUNBQklBQkJBWEkyQWdRZ0FVRUFLQUtjMElDQUFFY05BVUVBSUFBMkFwRFFnSUFBRHdzZ0F5QUNRWDV4TmdJRUlBRWdBR29nQURZQ0FDQUJJQUJCQVhJMkFnUUxBa0FnQUVIL0FVc05BQ0FBUVhoeFFiRFFnSUFBYWlFQ0FrQUNRRUVBS0FLSTBJQ0FBQ0lFUVFFZ0FFRURkblFpQUhFTkFFRUFJQVFnQUhJMkFvalFnSUFBSUFJaEFBd0JDeUFDS0FJSUlRQUxJQUFnQVRZQ0RDQUNJQUUyQWdnZ0FTQUNOZ0lNSUFFZ0FEWUNDQThMUVI4aEFnSkFJQUJCLy8vL0Iwc05BQ0FBUVFoMklnSWdBa0dBL2o5cVFSQjJRUWh4SWdKMElnUWdCRUdBNEI5cVFSQjJRUVJ4SWdSMElnWWdCa0dBZ0E5cVFSQjJRUUp4SWdaMFFROTJJQUlnQkhJZ0JuSnJJZ0pCQVhRZ0FDQUNRUlZxZGtFQmNYSkJIR29oQWdzZ0FTQUNOZ0ljSUFGQ0FEY0NFQ0FDUVFKMFFialNnSUFBYWlFRUFrQUNRRUVBS0FLTTBJQ0FBQ0lHUVFFZ0FuUWlBM0VOQUNBRUlBRTJBZ0JCQUNBR0lBTnlOZ0tNMElDQUFDQUJJQVEyQWhnZ0FTQUJOZ0lJSUFFZ0FUWUNEQXdCQ3lBQVFRQkJHU0FDUVFGMmF5QUNRUjlHRzNRaEFpQUVLQUlBSVFZQ1FBTkFJQVlpQkNnQ0JFRjRjU0FBUmcwQklBSkJIWFloQmlBQ1FRRjBJUUlnQkNBR1FRUnhha0VRYWlJREtBSUFJZ1lOQUFzZ0F5QUJOZ0lBSUFFZ0JEWUNHQ0FCSUFFMkFnd2dBU0FCTmdJSURBRUxJQVFvQWdnaUFDQUJOZ0lNSUFRZ0FUWUNDQ0FCUVFBMkFoZ2dBU0FFTmdJTUlBRWdBRFlDQ0F0QkFFRUFLQUtvMElDQUFFRi9haUlCUVg4Z0FSczJBcWpRZ0lBQUN3c0VBQUFBQzA0QUFrQWdBQTBBUHdCQkVIUVBDd0pBSUFCQi8vOERjUTBBSUFCQmYwd05BQUpBSUFCQkVIWkFBQ0lBUVg5SERRQkJBRUV3TmdMNDA0Q0FBRUYvRHdzZ0FFRVFkQThMRU1xQWdJQUFBQXZ5QWdJRGZ3RitBa0FnQWtVTkFDQUFJQUU2QUFBZ0FpQUFhaUlEUVg5cUlBRTZBQUFnQWtFRFNRMEFJQUFnQVRvQUFpQUFJQUU2QUFFZ0EwRjlhaUFCT2dBQUlBTkJmbW9nQVRvQUFDQUNRUWRKRFFBZ0FDQUJPZ0FESUFOQmZHb2dBVG9BQUNBQ1FRbEpEUUFnQUVFQUlBQnJRUU54SWdScUlnTWdBVUgvQVhGQmdZS0VDR3dpQVRZQ0FDQURJQUlnQkd0QmZIRWlCR29pQWtGOGFpQUJOZ0lBSUFSQkNVa05BQ0FESUFFMkFnZ2dBeUFCTmdJRUlBSkJlR29nQVRZQ0FDQUNRWFJxSUFFMkFnQWdCRUVaU1EwQUlBTWdBVFlDR0NBRElBRTJBaFFnQXlBQk5nSVFJQU1nQVRZQ0RDQUNRWEJxSUFFMkFnQWdBa0ZzYWlBQk5nSUFJQUpCYUdvZ0FUWUNBQ0FDUVdScUlBRTJBZ0FnQkNBRFFRUnhRUmh5SWdWcklnSkJJRWtOQUNBQnJVS0JnSUNBRUg0aEJpQURJQVZxSVFFRFFDQUJJQVkzQXhnZ0FTQUdOd01RSUFFZ0JqY0RDQ0FCSUFZM0F3QWdBVUVnYWlFQklBSkJZR29pQWtFZlN3MEFDd3NnQUFzTGprZ0JBRUdBQ0F1R1NBRUFBQUFDQUFBQUF3QUFBQUFBQUFBQUFBQUFCQUFBQUFVQUFBQUFBQUFBQUFBQUFBWUFBQUFIQUFBQUNBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFTVzUyWVd4cFpDQmphR0Z5SUdsdUlIVnliQ0J4ZFdWeWVRQlRjR0Z1SUdOaGJHeGlZV05ySUdWeWNtOXlJR2x1SUc5dVgySnZaSGtBUTI5dWRHVnVkQzFNWlc1bmRHZ2diM1psY21ac2IzY0FRMmgxYm1zZ2MybDZaU0J2ZG1WeVpteHZkd0JTWlhOd2IyNXpaU0J2ZG1WeVpteHZkd0JKYm5aaGJHbGtJRzFsZEdodlpDQm1iM0lnU0ZSVVVDOTRMbmdnY21WeGRXVnpkQUJKYm5aaGJHbGtJRzFsZEdodlpDQm1iM0lnVWxSVFVDOTRMbmdnY21WeGRXVnpkQUJGZUhCbFkzUmxaQ0JUVDFWU1EwVWdiV1YwYUc5a0lHWnZjaUJKUTBVdmVDNTRJSEpsY1hWbGMzUUFTVzUyWVd4cFpDQmphR0Z5SUdsdUlIVnliQ0JtY21GbmJXVnVkQ0J6ZEdGeWRBQkZlSEJsWTNSbFpDQmtiM1FBVTNCaGJpQmpZV3hzWW1GamF5Qmxjbkp2Y2lCcGJpQnZibDl6ZEdGMGRYTUFTVzUyWVd4cFpDQnlaWE53YjI1elpTQnpkR0YwZFhNQVNXNTJZV3hwWkNCamFHRnlZV04wWlhJZ2FXNGdZMmgxYm1zZ1pYaDBaVzV6YVc5dWN3QlZjMlZ5SUdOaGJHeGlZV05ySUdWeWNtOXlBR0J2Ymw5eVpYTmxkR0FnWTJGc2JHSmhZMnNnWlhKeWIzSUFZRzl1WDJOb2RXNXJYMmhsWVdSbGNtQWdZMkZzYkdKaFkyc2daWEp5YjNJQVlHOXVYMjFsYzNOaFoyVmZZbVZuYVc1Z0lHTmhiR3hpWVdOcklHVnljbTl5QUdCdmJsOWphSFZ1YTE5bGVIUmxibk5wYjI1ZmRtRnNkV1ZnSUdOaGJHeGlZV05ySUdWeWNtOXlBR0J2Ymw5emRHRjBkWE5mWTI5dGNHeGxkR1ZnSUdOaGJHeGlZV05ySUdWeWNtOXlBR0J2Ymw5MlpYSnphVzl1WDJOdmJYQnNaWFJsWUNCallXeHNZbUZqYXlCbGNuSnZjZ0JnYjI1ZmRYSnNYMk52YlhCc1pYUmxZQ0JqWVd4c1ltRmpheUJsY25KdmNnQmdiMjVmWTJoMWJtdGZZMjl0Y0d4bGRHVmdJR05oYkd4aVlXTnJJR1Z5Y205eUFHQnZibDlvWldGa1pYSmZkbUZzZFdWZlkyOXRjR3hsZEdWZ0lHTmhiR3hpWVdOcklHVnljbTl5QUdCdmJsOXRaWE56WVdkbFgyTnZiWEJzWlhSbFlDQmpZV3hzWW1GamF5Qmxjbkp2Y2dCZ2IyNWZiV1YwYUc5a1gyTnZiWEJzWlhSbFlDQmpZV3hzWW1GamF5Qmxjbkp2Y2dCZ2IyNWZhR1ZoWkdWeVgyWnBaV3hrWDJOdmJYQnNaWFJsWUNCallXeHNZbUZqYXlCbGNuSnZjZ0JnYjI1ZlkyaDFibXRmWlhoMFpXNXphVzl1WDI1aGJXVmdJR05oYkd4aVlXTnJJR1Z5Y205eUFGVnVaWGh3WldOMFpXUWdZMmhoY2lCcGJpQjFjbXdnYzJWeWRtVnlBRWx1ZG1Gc2FXUWdhR1ZoWkdWeUlIWmhiSFZsSUdOb1lYSUFTVzUyWVd4cFpDQm9aV0ZrWlhJZ1ptbGxiR1FnWTJoaGNnQlRjR0Z1SUdOaGJHeGlZV05ySUdWeWNtOXlJR2x1SUc5dVgzWmxjbk5wYjI0QVNXNTJZV3hwWkNCdGFXNXZjaUIyWlhKemFXOXVBRWx1ZG1Gc2FXUWdiV0ZxYjNJZ2RtVnljMmx2YmdCRmVIQmxZM1JsWkNCemNHRmpaU0JoWm5SbGNpQjJaWEp6YVc5dUFFVjRjR1ZqZEdWa0lFTlNURVlnWVdaMFpYSWdkbVZ5YzJsdmJnQkpiblpoYkdsa0lFaFVWRkFnZG1WeWMybHZiZ0JKYm5aaGJHbGtJR2hsWVdSbGNpQjBiMnRsYmdCVGNHRnVJR05oYkd4aVlXTnJJR1Z5Y205eUlHbHVJRzl1WDNWeWJBQkpiblpoYkdsa0lHTm9ZWEpoWTNSbGNuTWdhVzRnZFhKc0FGVnVaWGh3WldOMFpXUWdjM1JoY25RZ1kyaGhjaUJwYmlCMWNtd0FSRzkxWW14bElFQWdhVzRnZFhKc0FFVnRjSFI1SUVOdmJuUmxiblF0VEdWdVozUm9BRWx1ZG1Gc2FXUWdZMmhoY21GamRHVnlJR2x1SUVOdmJuUmxiblF0VEdWdVozUm9BRVIxY0d4cFkyRjBaU0JEYjI1MFpXNTBMVXhsYm1kMGFBQkpiblpoYkdsa0lHTm9ZWElnYVc0Z2RYSnNJSEJoZEdnQVEyOXVkR1Z1ZEMxTVpXNW5kR2dnWTJGdUozUWdZbVVnY0hKbGMyVnVkQ0IzYVhSb0lGUnlZVzV6Wm1WeUxVVnVZMjlrYVc1bkFFbHVkbUZzYVdRZ1kyaGhjbUZqZEdWeUlHbHVJR05vZFc1cklITnBlbVVBVTNCaGJpQmpZV3hzWW1GamF5Qmxjbkp2Y2lCcGJpQnZibDlvWldGa1pYSmZkbUZzZFdVQVUzQmhiaUJqWVd4c1ltRmpheUJsY25KdmNpQnBiaUJ2Ymw5amFIVnVhMTlsZUhSbGJuTnBiMjVmZG1Gc2RXVUFTVzUyWVd4cFpDQmphR0Z5WVdOMFpYSWdhVzRnWTJoMWJtc2daWGgwWlc1emFXOXVjeUIyWVd4MVpRQk5hWE56YVc1bklHVjRjR1ZqZEdWa0lFeEdJR0ZtZEdWeUlHaGxZV1JsY2lCMllXeDFaUUJKYm5aaGJHbGtJR0JVY21GdWMyWmxjaTFGYm1OdlpHbHVaMkFnYUdWaFpHVnlJSFpoYkhWbEFFbHVkbUZzYVdRZ1kyaGhjbUZqZEdWeUlHbHVJR05vZFc1cklHVjRkR1Z1YzJsdmJuTWdjWFZ2ZEdVZ2RtRnNkV1VBU1c1MllXeHBaQ0JqYUdGeVlXTjBaWElnYVc0Z1kyaDFibXNnWlhoMFpXNXphVzl1Y3lCeGRXOTBaV1FnZG1Gc2RXVUFVR0YxYzJWa0lHSjVJRzl1WDJobFlXUmxjbk5mWTI5dGNHeGxkR1VBU1c1MllXeHBaQ0JGVDBZZ2MzUmhkR1VBYjI1ZmNtVnpaWFFnY0dGMWMyVUFiMjVmWTJoMWJtdGZhR1ZoWkdWeUlIQmhkWE5sQUc5dVgyMWxjM05oWjJWZlltVm5hVzRnY0dGMWMyVUFiMjVmWTJoMWJtdGZaWGgwWlc1emFXOXVYM1poYkhWbElIQmhkWE5sQUc5dVgzTjBZWFIxYzE5amIyMXdiR1YwWlNCd1lYVnpaUUJ2Ymw5MlpYSnphVzl1WDJOdmJYQnNaWFJsSUhCaGRYTmxBRzl1WDNWeWJGOWpiMjF3YkdWMFpTQndZWFZ6WlFCdmJsOWphSFZ1YTE5amIyMXdiR1YwWlNCd1lYVnpaUUJ2Ymw5b1pXRmtaWEpmZG1Gc2RXVmZZMjl0Y0d4bGRHVWdjR0YxYzJVQWIyNWZiV1Z6YzJGblpWOWpiMjF3YkdWMFpTQndZWFZ6WlFCdmJsOXRaWFJvYjJSZlkyOXRjR3hsZEdVZ2NHRjFjMlVBYjI1ZmFHVmhaR1Z5WDJacFpXeGtYMk52YlhCc1pYUmxJSEJoZFhObEFHOXVYMk5vZFc1clgyVjRkR1Z1YzJsdmJsOXVZVzFsSUhCaGRYTmxBRlZ1Wlhod1pXTjBaV1FnYzNCaFkyVWdZV1owWlhJZ2MzUmhjblFnYkdsdVpRQlRjR0Z1SUdOaGJHeGlZV05ySUdWeWNtOXlJR2x1SUc5dVgyTm9kVzVyWDJWNGRHVnVjMmx2Ymw5dVlXMWxBRWx1ZG1Gc2FXUWdZMmhoY21GamRHVnlJR2x1SUdOb2RXNXJJR1Y0ZEdWdWMybHZibk1nYm1GdFpRQlFZWFZ6WlNCdmJpQkRUMDVPUlVOVUwxVndaM0poWkdVQVVHRjFjMlVnYjI0Z1VGSkpMMVZ3WjNKaFpHVUFSWGh3WldOMFpXUWdTRlJVVUM4eUlFTnZibTVsWTNScGIyNGdVSEpsWm1GalpRQlRjR0Z1SUdOaGJHeGlZV05ySUdWeWNtOXlJR2x1SUc5dVgyMWxkR2h2WkFCRmVIQmxZM1JsWkNCemNHRmpaU0JoWm5SbGNpQnRaWFJvYjJRQVUzQmhiaUJqWVd4c1ltRmpheUJsY25KdmNpQnBiaUJ2Ymw5b1pXRmtaWEpmWm1sbGJHUUFVR0YxYzJWa0FFbHVkbUZzYVdRZ2QyOXlaQ0JsYm1OdmRXNTBaWEpsWkFCSmJuWmhiR2xrSUcxbGRHaHZaQ0JsYm1OdmRXNTBaWEpsWkFCVmJtVjRjR1ZqZEdWa0lHTm9ZWElnYVc0Z2RYSnNJSE5qYUdWdFlRQlNaWEYxWlhOMElHaGhjeUJwYm5aaGJHbGtJR0JVY21GdWMyWmxjaTFGYm1OdlpHbHVaMkFBVTFkSlZFTklYMUJTVDFoWkFGVlRSVjlRVWs5WVdRQk5TMEZEVkVsV1NWUlpBRlZPVUZKUFEwVlRVMEZDVEVWZlJVNVVTVlJaQUVOUFVGa0FUVTlXUlVSZlVFVlNUVUZPUlU1VVRGa0FWRTlQWDBWQlVreFpBRTVQVkVsR1dRQkdRVWxNUlVSZlJFVlFSVTVFUlU1RFdRQkNRVVJmUjBGVVJWZEJXUUJRVEVGWkFGQlZWQUJEU0VWRFMwOVZWQUJIUVZSRlYwRlpYMVJKVFVWUFZWUUFVa1ZSVlVWVFZGOVVTVTFGVDFWVUFFNUZWRmRQVWt0ZlEwOU9Ua1ZEVkY5VVNVMUZUMVZVQUVOUFRrNUZRMVJKVDA1ZlZFbE5SVTlWVkFCTVQwZEpUbDlVU1UxRlQxVlVBRTVGVkZkUFVrdGZVa1ZCUkY5VVNVMUZUMVZVQUZCUFUxUUFUVWxUUkVsU1JVTlVSVVJmVWtWUlZVVlRWQUJEVEVsRlRsUmZRMHhQVTBWRVgxSkZVVlZGVTFRQVEweEpSVTVVWDBOTVQxTkZSRjlNVDBGRVgwSkJURUZPUTBWRVgxSkZVVlZGVTFRQVFrRkVYMUpGVVZWRlUxUUFTRlJVVUY5U1JWRlZSVk5VWDFORlRsUmZWRTlmU0ZSVVVGTmZVRTlTVkFCU1JWQlBVbFFBU1UxZlFWOVVSVUZRVDFRQVVrVlRSVlJmUTA5T1ZFVk9WQUJPVDE5RFQwNVVSVTVVQUZCQlVsUkpRVXhmUTA5T1ZFVk9WQUJJVUVWZlNVNVdRVXhKUkY5RFQwNVRWRUZPVkFCSVVFVmZRMEpmVWtWVFJWUUFSMFZVQUVoUVJWOVRWRkpKUTFRQVEwOU9Sa3hKUTFRQVZFVk5VRTlTUVZKWlgxSkZSRWxTUlVOVUFGQkZVazFCVGtWT1ZGOVNSVVJKVWtWRFZBQkRUMDVPUlVOVUFFMVZURlJKWDFOVVFWUlZVd0JJVUVWZlNVNVdRVXhKUkY5VFZFRlVWVk1BVkU5UFgwMUJUbGxmVWtWUlZVVlRWRk1BUlVGU1RGbGZTRWxPVkZNQVZVNUJWa0ZKVEVGQ1RFVmZSazlTWDB4RlIwRk1YMUpGUVZOUFRsTUFUMUJVU1U5T1V3QlRWMGxVUTBoSlRrZGZVRkpQVkU5RFQweFRBRlpCVWtsQlRsUmZRVXhUVDE5T1JVZFBWRWxCVkVWVEFFMVZURlJKVUV4RlgwTklUMGxEUlZNQVNVNVVSVkpPUVV4ZlUwVlNWa1ZTWDBWU1VrOVNBRmRGUWw5VFJWSldSVkpmVlU1TFRrOVhUbDlGVWxKUFVnQlNRVWxNUjFWT1gwVlNVazlTQUVsRVJVNVVTVlJaWDFCU1QxWkpSRVZTWDBGVlZFaEZUbFJKUTBGVVNVOU9YMFZTVWs5U0FGTlRURjlEUlZKVVNVWkpRMEZVUlY5RlVsSlBVZ0JKVGxaQlRFbEVYMWhmUms5U1YwRlNSRVZFWDBaUFVnQlRSVlJmVUVGU1FVMUZWRVZTQUVkRlZGOVFRVkpCVFVWVVJWSUFTRkJGWDFWVFJWSUFVMFZGWDA5VVNFVlNBRWhRUlY5RFFsOURTRlZPUzE5SVJVRkVSVklBVFV0RFFVeEZUa1JCVWdCVFJWUlZVQUJYUlVKZlUwVlNWa1ZTWDBsVFgwUlBWMDRBVkVWQlVrUlBWMDRBU0ZCRlgwTk1UMU5GUkY5RFQwNU9SVU5VU1U5T0FFaEZWVkpKVTFSSlExOUZXRkJKVWtGVVNVOU9BRVJKVTBOUFRrNUZRMVJGUkY5UFVFVlNRVlJKVDA0QVRrOU9YMEZWVkVoUFVrbFVRVlJKVmtWZlNVNUdUMUpOUVZSSlQwNEFTRkJGWDBsT1ZrRk1TVVJmVmtWU1UwbFBUZ0JJVUVWZlEwSmZUVVZUVTBGSFJWOUNSVWRKVGdCVFNWUkZYMGxUWDBaU1QxcEZUZ0JJVUVWZlNVNVdRVXhKUkY5SVJVRkVSVkpmVkU5TFJVNEFTVTVXUVV4SlJGOVVUMHRGVGdCR1QxSkNTVVJFUlU0QVJVNUlRVTVEUlY5WlQxVlNYME5CVEUwQVNGQkZYMGxPVmtGTVNVUmZWVkpNQUVKTVQwTkxSVVJmUWxsZlVFRlNSVTVVUVV4ZlEwOU9WRkpQVEFCTlMwTlBUQUJCUTB3QVNGQkZYMGxPVkVWU1RrRk1BRkpGVVZWRlUxUmZTRVZCUkVWU1gwWkpSVXhFVTE5VVQwOWZURUZTUjBWZlZVNVBSa1pKUTBsQlRBQklVRVZmVDBzQVZVNU1TVTVMQUZWT1RFOURTd0JRVWtrQVVrVlVVbGxmVjBsVVNBQklVRVZmU1U1V1FVeEpSRjlEVDA1VVJVNVVYMHhGVGtkVVNBQklVRVZmVlU1RldGQkZRMVJGUkY5RFQwNVVSVTVVWDB4RlRrZFVTQUJHVEZWVFNBQlFVazlRVUVGVVEwZ0FUUzFUUlVGU1EwZ0FWVkpKWDFSUFQxOU1UMDVIQUZCU1QwTkZVMU5KVGtjQVRVbFRRMFZNVEVGT1JVOVZVMTlRUlZKVFNWTlVSVTVVWDFkQlVrNUpUa2NBVFVsVFEwVk1URUZPUlU5VlUxOVhRVkpPU1U1SEFFaFFSVjlKVGxaQlRFbEVYMVJTUVU1VFJrVlNYMFZPUTA5RVNVNUhBRVY0Y0dWamRHVmtJRU5TVEVZQVNGQkZYMGxPVmtGTVNVUmZRMGhWVGt0ZlUwbGFSUUJOVDFaRkFFTlBUbFJKVGxWRkFFaFFSVjlEUWw5VFZFRlVWVk5mUTA5TlVFeEZWRVVBU0ZCRlgwTkNYMGhGUVVSRlVsTmZRMDlOVUV4RlZFVUFTRkJGWDBOQ1gxWkZVbE5KVDA1ZlEwOU5VRXhGVkVVQVNGQkZYME5DWDFWU1RGOURUMDFRVEVWVVJRQklVRVZmUTBKZlEwaFZUa3RmUTA5TlVFeEZWRVVBU0ZCRlgwTkNYMGhGUVVSRlVsOVdRVXhWUlY5RFQwMVFURVZVUlFCSVVFVmZRMEpmUTBoVlRrdGZSVmhVUlU1VFNVOU9YMVpCVEZWRlgwTlBUVkJNUlZSRkFFaFFSVjlEUWw5RFNGVk9TMTlGV0ZSRlRsTkpUMDVmVGtGTlJWOURUMDFRVEVWVVJRQklVRVZmUTBKZlRVVlRVMEZIUlY5RFQwMVFURVZVUlFCSVVFVmZRMEpmVFVWVVNFOUVYME5QVFZCTVJWUkZBRWhRUlY5RFFsOUlSVUZFUlZKZlJrbEZURVJmUTA5TlVFeEZWRVVBUkVWTVJWUkZBRWhRUlY5SlRsWkJURWxFWDBWUFJsOVRWRUZVUlFCSlRsWkJURWxFWDFOVFRGOURSVkpVU1VaSlEwRlVSUUJRUVZWVFJRQk9UMTlTUlZOUVQwNVRSUUJWVGxOVlVGQlBVbFJGUkY5TlJVUkpRVjlVV1ZCRkFFZFBUa1VBVGs5VVgwRkRRMFZRVkVGQ1RFVUFVMFZTVmtsRFJWOVZUa0ZXUVVsTVFVSk1SUUJTUVU1SFJWOU9UMVJmVTBGVVNWTkdTVUZDVEVVQVQxSkpSMGxPWDBsVFgxVk9Va1ZCUTBoQlFreEZBRkpGVTFCUFRsTkZYMGxUWDFOVVFVeEZBRkJWVWtkRkFFMUZVa2RGQUZKRlVWVkZVMVJmU0VWQlJFVlNYMFpKUlV4RVUxOVVUMDlmVEVGU1IwVUFVa1ZSVlVWVFZGOUlSVUZFUlZKZlZFOVBYMHhCVWtkRkFGQkJXVXhQUVVSZlZFOVBYMHhCVWtkRkFFbE9VMVZHUmtsRFNVVk9WRjlUVkU5U1FVZEZBRWhRUlY5UVFWVlRSVVJmVlZCSFVrRkVSUUJJVUVWZlVFRlZVMFZFWDBneVgxVlFSMUpCUkVVQVUwOVZVa05GQUVGT1RrOVZUa05GQUZSU1FVTkZBRWhRUlY5VlRrVllVRVZEVkVWRVgxTlFRVU5GQUVSRlUwTlNTVUpGQUZWT1UxVkNVME5TU1VKRkFGSkZRMDlTUkFCSVVFVmZTVTVXUVV4SlJGOU5SVlJJVDBRQVRrOVVYMFpQVlU1RUFGQlNUMUJHU1U1RUFGVk9Ra2xPUkFCU1JVSkpUa1FBVlU1QlZWUklUMUpKV2tWRUFFMUZWRWhQUkY5T1QxUmZRVXhNVDFkRlJBQklWRlJRWDFaRlVsTkpUMDVmVGs5VVgxTlZVRkJQVWxSRlJBQkJURkpGUVVSWlgxSkZVRTlTVkVWRUFFRkRRMFZRVkVWRUFFNVBWRjlKVFZCTVJVMUZUbFJGUkFCTVQwOVFYMFJGVkVWRFZFVkVBRWhRUlY5RFVsOUZXRkJGUTFSRlJBQklVRVZmVEVaZlJWaFFSVU5VUlVRQVExSkZRVlJGUkFCSlRWOVZVMFZFQUVoUVJWOVFRVlZUUlVRQVZFbE5SVTlWVkY5UFEwTlZVa1ZFQUZCQldVMUZUbFJmVWtWUlZVbFNSVVFBVUZKRlEwOU9SRWxVU1U5T1gxSkZVVlZKVWtWRUFGQlNUMWhaWDBGVlZFaEZUbFJKUTBGVVNVOU9YMUpGVVZWSlVrVkVBRTVGVkZkUFVrdGZRVlZVU0VWT1ZFbERRVlJKVDA1ZlVrVlJWVWxTUlVRQVRFVk9SMVJJWDFKRlVWVkpVa1ZFQUZOVFRGOURSVkpVU1VaSlEwRlVSVjlTUlZGVlNWSkZSQUJWVUVkU1FVUkZYMUpGVVZWSlVrVkVBRkJCUjBWZlJWaFFTVkpGUkFCUVVrVkRUMDVFU1ZSSlQwNWZSa0ZKVEVWRUFFVllVRVZEVkVGVVNVOU9YMFpCU1V4RlJBQlNSVlpCVEVsRVFWUkpUMDVmUmtGSlRFVkVBRk5UVEY5SVFVNUVVMGhCUzBWZlJrRkpURVZFQUV4UFEwdEZSQUJVVWtGT1UwWlBVazFCVkVsUFRsOUJVRkJNU1VWRUFFNVBWRjlOVDBSSlJrbEZSQUJPVDFSZlJWaFVSVTVFUlVRQVFrRk9SRmRKUkZSSVgweEpUVWxVWDBWWVEwVkZSRVZFQUZOSlZFVmZTVk5mVDFaRlVreFBRVVJGUkFCSVJVRkVBRVY0Y0dWamRHVmtJRWhVVkZBdkFBQmVFd0FBSmhNQUFEQVFBQUR3RndBQW5STUFBQlVTQUFBNUZ3QUE4QklBQUFvUUFBQjFFZ0FBclJJQUFJSVRBQUJQRkFBQWZ4QUFBS0FWQUFBakZBQUFpUklBQUlzVUFBQk5GUUFBMUJFQUFNOFVBQUFRR0FBQXlSWUFBTndXQUFEQkVRQUE0QmNBQUxzVUFBQjBGQUFBZkJVQUFPVVVBQUFJRndBQUh4QUFBR1VWQUFDakZBQUFLQlVBQUFJVkFBQ1pGUUFBTEJBQUFJc1pBQUJQRHdBQTFBNEFBR29RQUFET0VBQUFBaGNBQUlrT0FBQnVFd0FBSEJNQUFHWVVBQUJXRndBQXdSTUFBTTBUQUFCc0V3QUFhQmNBQUdZWEFBQmZGd0FBSWhNQUFNNFBBQUJwRGdBQTJBNEFBR01XQUFETEV3QUFxZzRBQUNnWEFBQW1Gd0FBeFJNQUFGMFdBQURvRVFBQVp4TUFBR1VUQUFEeUZnQUFjeE1BQUIwWEFBRDVGZ0FBOHhFQUFNOE9BQURPRlFBQURCSUFBTE1SQUFDbEVRQUFZUkFBQURJWEFBQzdFd0FBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFCQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBRUJBZ0VCQVFFQkFRRUJBUUVCQVFFQkFRRUJBUUVCQVFFQkFRRUJBUUVCQVFFQkFRRUJBUUVCQVFFQkFRRUJBUUVCQVFFQkFRRUJBUUVCQVFBQkFRRUJBUUVCQVFFQkFRRUJBUUVCQVFFQkFRRUJBUUVCQVFFQkFRRUJBUUVCQVFFQkFRRUJBUUVCQVFFQkFRRUJBUUVCQVFFQkFRRUJBUUVCQVFFQkFRRUJBUUVCQVFFQkFRRUJBUUVCQVFFQkFRRUJBUUVCQVFFQkFRRUJBUUVCQVFFQkFRRUJBUUVCQVFFQkFRRUJBUUVCQVFFQkFRRUJBUUVCQVFFQkFRRUJBUUVCQVFFQkFRRUJBUUVCQVFFQkFRRUJBUUVCQVFFQkFRRUJBUUVCQVFFQkFBQUFBQUFBQUFBQUFBQUFBQUVBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQWdNQ0FnSUNBZ0FBQWdJQUFnSUFBZ0lDQWdJQ0FnSUNBZ0FFQUFBQUFBQUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnQUFBQUlDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQUFJQUFnQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQkFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBSUFBZ0lDQWdJQUFBSUNBQUlDQUFJQ0FnSUNBZ0lDQWdJQUF3QUVBQUFBQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lBQUFBQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnQUNBQUlBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFCc2IzTmxaV1Z3TFdGc2FYWmxBQUFBQUFBQUFBQUFBQUFBQVFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUJBUUVCQVFFQkFRRUJBUUVCQVFFQkFRRUJBUUVCQVFFQkFRRUJBUUVCQVFFQkFRRUJBUUVCQVFFQkFRRUJBUUVCQVFFQkFRRUJBUUVCQVFFQkFRRUJBUUVCQVFFQkFRRUJBUUVCQVFFQkFRRUJBUUVCQVFFQkFRRUJBUUVCQVFBQkFRRUJBUUVCQVFFQkFRRUJBUUVCQVFFQkFRRUJBUUVCQVFFQkFRRUJBUUVCQVFFQkFRRUJBUUVCQVFFQkFRRUJBUUVCQVFFQkFRRUJBUUVCQVFFQkFRRUJBUUVCQVFFQkFRRUJBUUVCQVFFQkFRRUJBUUVCQVFFQkFRRUJBUUVCQVFFQkFRRUJBUUVCQVFFQkFRRUJBUUVCQVFFQkFRRUJBUUVCQVFFQkFRQUFBQUFBQUFBQUFBRUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQVFFQkFRRUJBUUVCQVFFQkFnRUJBUUVCQVFFQkFRRUJBUUVCQVFFQkFRRUJBUUVCQVFFQkFRRUJBUUVCQVFFQkFRRUJBUUVCQVFFQkFRRUJBUUVCQVFFQkFRRUJBUUVCQVFFQkFRRUJBUUVCQVFFQkFRRUJBUUVCQVFFQkFRRUFBUUVCQVFFQkFRRUJBUUVCQVFFQkFRRUJBUUVCQVFFQkFRRUJBUUVCQVFFQkFRRUJBUUVCQVFFQkFRRUJBUUVCQVFFQkFRRUJBUUVCQVFFQkFRRUJBUUVCQVFFQkFRRUJBUUVCQVFFQkFRRUJBUUVCQVFFQkFRRUJBUUVCQVFFQkFRRUJBUUVCQVFFQkFRRUJBUUVCQVFFQkFRRUJBUUVCQVFFQkFRRUJBUUZqYUhWdWEyVmtBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQkFRQUJBUUVCQVFBQUFRRUFBUUVBQVFFQkFRRUJBUUVCQVFBQUFBQUFBQUFCQVFFQkFRRUJBUUVCQVFFQkFRRUJBUUVCQVFFQkFRRUJBUUFBQUFFQkFRRUJBUUVCQVFFQkFRRUJBUUVCQVFFQkFRRUJBUUVCQVFFQkFBRUFBUUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUdWamRHbHZibVZ1ZEMxc1pXNW5kR2h2Ym5KdmVIa3RZMjl1Ym1WamRHbHZiZ0FBQUFBQUFBQUFBQUFBQUFBQUFISmhibk5tWlhJdFpXNWpiMlJwYm1kd1ozSmhaR1VOQ2cwS0RRcFRUUTBLRFFwVVZGQXZRMFV2VkZOUUx3QUFBQUFBQUFBQUFBQUFBQUVDQUFFREFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUJBRUJBUUVCQVFFQkFRRUJBUUVCQVFFQkFRRUJBUUVCQVFFQkFRRUJBUUVCQVFFQkFRRUJBUUVCQVFFQkFRRUJBUUVCQVFFQkFRRUJBUUVCQVFFQkFRRUJBUUVCQVFFQkFRRUJBUUVCQVFFQkFRRUJBUUVCQVFFQkFRRUJBUUVBQVFFQkFRRUJBUUVCQVFFQkFRRUJBUUVCQVFFQkFRRUJBUUVCQVFFQkFRRUJBUUVCQVFFQkFRRUJBUUVCQVFFQkFRRUJBUUVCQVFFQkFRRUJBUUVCQVFFQkFRRUJBUUVCQVFFQkFRRUJBUUVCQVFFQkFRRUJBUUVCQVFFQkFRRUJBUUVCQVFFQkFRRUJBUUVCQVFFQkFRRUJBUUVCQVFFQkFRRUJBUUVCQVFFQUFBQUFBQUFBQUFBQkFnQUJBd0FBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQVFCQVFVQkFRRUJBUUVCQVFFQkFRRUJBUUVCQVFFQkFRRUJBUUVCQVFFQkFRRUJBUUVCQVFFQkFRRUJBUUVCQVFFQkFRRUJBUUVCQVFFQkFRRUJBUUVCQVFFQkFRRUJBUUVCQVFFQkFRRUJBUUVCQVFFQkFRRUJBUUVCQVFFQkFBRUJBUUVCQVFFQkFRRUJBUUVCQVFFQkFRRUJBUUVCQVFFQkFRRUJBUUVCQVFFQkFRRUJBUUVCQVFFQkFRRUJBUUVCQVFFQkFRRUJBUUVCQVFFQkFRRUJBUUVCQVFFQkFRRUJBUUVCQVFFQkFRRUJBUUVCQVFFQkFRRUJBUUVCQVFFQkFRRUJBUUVCQVFFQkFRRUJBUUVCQVFFQkFRRUJBUUVCQVFFQkFRRUJBQUFBQUFBQUFBQUFBUUFBQVFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFRRUFBUUVCQVFFQkFRRUJBUUVCQVFFQkFRRUJBUUVCQVFFQkFRRUJBQUVCQVFFQkFRRUJBUUVCQVFFQkFRRUJBUUVCQVFFQkFRRUJBUUVCQVFFQkFRRUJBUUVCQVFFQkFRRUJBUUVCQVFFQkFRRUJBUUVCQVFFQkFRRUJBUUFCQVFFQkFRRUJBUUVCQVFFQkFRRUJBUUVCQVFFQkFRRUJBUUVCQVFFQkFRRUJBUUVCQVFFQkFRRUJBUUVCQVFFQkFRRUJBUUVCQVFFQkFRRUJBUUVCQVFFQkFRRUJBUUVCQVFFQkFRRUJBUUVCQVFFQkFRRUJBUUVCQVFFQkFRRUJBUUVCQVFFQkFRRUJBUUVCQVFFQkFRRUJBUUVCQVFFQkFRRUJBUUVCQVFBQUFBQUFBQUFBQUFBQkFBQUNBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBd1FBQUFRRUJBUUVCQVFFQkFRRUJRUUVCQVFFQkFRRUJBUUVCQUFFQUFZSEJBUUVCQVFFQkFRRUJBUUVCQVFFQkFRRUJBUUVCQVFFQkFRRUFBUUFCQUFFQkFRRUJBUUVCQVFFQkFRRUJBUUVCQVFFQkFRRUJBUUVCQUFBQUFRQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBUUFBQVFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFFQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQWdBQUFBQUFBQU1EQXdNREF3TURBd01EQXdNREF3TURBd01EQXdNREF3TURBQUFBQUFBQUF3TURBd01EQXdNREF3TURBd01EQXdNREF3TURBd01EQXdNQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFFQUFBRUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUJBQUFBQUFBQUFBQUFBZ0FBQUFBQ0FBQUFBQUFBQUFBQUFBQUFBQUFBQUFBREF3TURBd01EQXdNREF3TURBd01EQXdNREF3TURBd01EQXdBQUFBQUFBQU1EQXdNREF3TURBd01EQXdNREF3TURBd01EQXdNREF3TURBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFFNVBWVTVEUlVWRFMwOVZWRTVGUTFSRlZFVkRVa2xDUlV4VlUwaEZWRVZCUkZORlFWSkRTRkpIUlVOVVNWWkpWRmxNUlU1RVFWSldSVTlVU1VaWlVGUkpUMDVUUTBoVFJVRlpVMVJCVkVOSVIwVlBVa1JKVWtWRFZFOVNWRkpEU0ZCQlVrRk5SVlJGVWxWU1EwVkNVME5TU1VKRlFWSkVUMWRPUVVORlNVNUVUa3REUzFWQ1UwTlNTVUpGU0ZSVVVDOUJSRlJRTHc9PSdcbiIsCiAgICAiLy8gQHRzLWNoZWNrXG5cbid1c2Ugc3RyaWN0J1xuXG4vKiBnbG9iYWwgV2ViQXNzZW1ibHkgKi9cblxuY29uc3QgYXNzZXJ0ID0gcmVxdWlyZSgnYXNzZXJ0JylcbmNvbnN0IG5ldCA9IHJlcXVpcmUoJ25ldCcpXG5jb25zdCBodHRwID0gcmVxdWlyZSgnaHR0cCcpXG5jb25zdCB7IHBpcGVsaW5lIH0gPSByZXF1aXJlKCdzdHJlYW0nKVxuY29uc3QgdXRpbCA9IHJlcXVpcmUoJy4vY29yZS91dGlsJylcbmNvbnN0IHRpbWVycyA9IHJlcXVpcmUoJy4vdGltZXJzJylcbmNvbnN0IFJlcXVlc3QgPSByZXF1aXJlKCcuL2NvcmUvcmVxdWVzdCcpXG5jb25zdCBEaXNwYXRjaGVyQmFzZSA9IHJlcXVpcmUoJy4vZGlzcGF0Y2hlci1iYXNlJylcbmNvbnN0IHtcbiAgUmVxdWVzdENvbnRlbnRMZW5ndGhNaXNtYXRjaEVycm9yLFxuICBSZXNwb25zZUNvbnRlbnRMZW5ndGhNaXNtYXRjaEVycm9yLFxuICBJbnZhbGlkQXJndW1lbnRFcnJvcixcbiAgUmVxdWVzdEFib3J0ZWRFcnJvcixcbiAgSGVhZGVyc1RpbWVvdXRFcnJvcixcbiAgSGVhZGVyc092ZXJmbG93RXJyb3IsXG4gIFNvY2tldEVycm9yLFxuICBJbmZvcm1hdGlvbmFsRXJyb3IsXG4gIEJvZHlUaW1lb3V0RXJyb3IsXG4gIEhUVFBQYXJzZXJFcnJvcixcbiAgUmVzcG9uc2VFeGNlZWRlZE1heFNpemVFcnJvcixcbiAgQ2xpZW50RGVzdHJveWVkRXJyb3Jcbn0gPSByZXF1aXJlKCcuL2NvcmUvZXJyb3JzJylcbmNvbnN0IGJ1aWxkQ29ubmVjdG9yID0gcmVxdWlyZSgnLi9jb3JlL2Nvbm5lY3QnKVxuY29uc3Qge1xuICBrVXJsLFxuICBrUmVzZXQsXG4gIGtTZXJ2ZXJOYW1lLFxuICBrQ2xpZW50LFxuICBrQnVzeSxcbiAga1BhcnNlcixcbiAga0Nvbm5lY3QsXG4gIGtCbG9ja2luZyxcbiAga1Jlc3VtaW5nLFxuICBrUnVubmluZyxcbiAga1BlbmRpbmcsXG4gIGtTaXplLFxuICBrV3JpdGluZyxcbiAga1F1ZXVlLFxuICBrQ29ubmVjdGVkLFxuICBrQ29ubmVjdGluZyxcbiAga05lZWREcmFpbixcbiAga05vUmVmLFxuICBrS2VlcEFsaXZlRGVmYXVsdFRpbWVvdXQsXG4gIGtIb3N0SGVhZGVyLFxuICBrUGVuZGluZ0lkeCxcbiAga1J1bm5pbmdJZHgsXG4gIGtFcnJvcixcbiAga1BpcGVsaW5pbmcsXG4gIGtTb2NrZXQsXG4gIGtLZWVwQWxpdmVUaW1lb3V0VmFsdWUsXG4gIGtNYXhIZWFkZXJzU2l6ZSxcbiAga0tlZXBBbGl2ZU1heFRpbWVvdXQsXG4gIGtLZWVwQWxpdmVUaW1lb3V0VGhyZXNob2xkLFxuICBrSGVhZGVyc1RpbWVvdXQsXG4gIGtCb2R5VGltZW91dCxcbiAga1N0cmljdENvbnRlbnRMZW5ndGgsXG4gIGtDb25uZWN0b3IsXG4gIGtNYXhSZWRpcmVjdGlvbnMsXG4gIGtNYXhSZXF1ZXN0cyxcbiAga0NvdW50ZXIsXG4gIGtDbG9zZSxcbiAga0Rlc3Ryb3ksXG4gIGtEaXNwYXRjaCxcbiAga0ludGVyY2VwdG9ycyxcbiAga0xvY2FsQWRkcmVzcyxcbiAga01heFJlc3BvbnNlU2l6ZSxcbiAga0hUVFBDb25uVmVyc2lvbixcbiAgLy8gSFRUUDJcbiAga0hvc3QsXG4gIGtIVFRQMlNlc3Npb24sXG4gIGtIVFRQMlNlc3Npb25TdGF0ZSxcbiAga0hUVFAyQnVpbGRSZXF1ZXN0LFxuICBrSFRUUDJDb3B5SGVhZGVycyxcbiAga0hUVFAxQnVpbGRSZXF1ZXN0XG59ID0gcmVxdWlyZSgnLi9jb3JlL3N5bWJvbHMnKVxuXG4vKiogQHR5cGUge2ltcG9ydCgnaHR0cDInKX0gKi9cbmxldCBodHRwMlxudHJ5IHtcbiAgaHR0cDIgPSByZXF1aXJlKCdodHRwMicpXG59IGNhdGNoIHtcbiAgLy8gQHRzLWlnbm9yZVxuICBodHRwMiA9IHsgY29uc3RhbnRzOiB7fSB9XG59XG5cbmNvbnN0IHtcbiAgY29uc3RhbnRzOiB7XG4gICAgSFRUUDJfSEVBREVSX0FVVEhPUklUWSxcbiAgICBIVFRQMl9IRUFERVJfTUVUSE9ELFxuICAgIEhUVFAyX0hFQURFUl9QQVRILFxuICAgIEhUVFAyX0hFQURFUl9TQ0hFTUUsXG4gICAgSFRUUDJfSEVBREVSX0NPTlRFTlRfTEVOR1RILFxuICAgIEhUVFAyX0hFQURFUl9FWFBFQ1QsXG4gICAgSFRUUDJfSEVBREVSX1NUQVRVU1xuICB9XG59ID0gaHR0cDJcblxuLy8gRXhwZXJpbWVudGFsXG5sZXQgaDJFeHBlcmltZW50YWxXYXJuZWQgPSBmYWxzZVxuXG5jb25zdCBGYXN0QnVmZmVyID0gQnVmZmVyW1N5bWJvbC5zcGVjaWVzXVxuXG5jb25zdCBrQ2xvc2VkUmVzb2x2ZSA9IFN5bWJvbCgna0Nsb3NlZFJlc29sdmUnKVxuXG5jb25zdCBjaGFubmVscyA9IHt9XG5cbnRyeSB7XG4gIGNvbnN0IGRpYWdub3N0aWNzQ2hhbm5lbCA9IHJlcXVpcmUoJ2RpYWdub3N0aWNzX2NoYW5uZWwnKVxuICBjaGFubmVscy5zZW5kSGVhZGVycyA9IGRpYWdub3N0aWNzQ2hhbm5lbC5jaGFubmVsKCd1bmRpY2k6Y2xpZW50OnNlbmRIZWFkZXJzJylcbiAgY2hhbm5lbHMuYmVmb3JlQ29ubmVjdCA9IGRpYWdub3N0aWNzQ2hhbm5lbC5jaGFubmVsKCd1bmRpY2k6Y2xpZW50OmJlZm9yZUNvbm5lY3QnKVxuICBjaGFubmVscy5jb25uZWN0RXJyb3IgPSBkaWFnbm9zdGljc0NoYW5uZWwuY2hhbm5lbCgndW5kaWNpOmNsaWVudDpjb25uZWN0RXJyb3InKVxuICBjaGFubmVscy5jb25uZWN0ZWQgPSBkaWFnbm9zdGljc0NoYW5uZWwuY2hhbm5lbCgndW5kaWNpOmNsaWVudDpjb25uZWN0ZWQnKVxufSBjYXRjaCB7XG4gIGNoYW5uZWxzLnNlbmRIZWFkZXJzID0geyBoYXNTdWJzY3JpYmVyczogZmFsc2UgfVxuICBjaGFubmVscy5iZWZvcmVDb25uZWN0ID0geyBoYXNTdWJzY3JpYmVyczogZmFsc2UgfVxuICBjaGFubmVscy5jb25uZWN0RXJyb3IgPSB7IGhhc1N1YnNjcmliZXJzOiBmYWxzZSB9XG4gIGNoYW5uZWxzLmNvbm5lY3RlZCA9IHsgaGFzU3Vic2NyaWJlcnM6IGZhbHNlIH1cbn1cblxuLyoqXG4gKiBAdHlwZSB7aW1wb3J0KCcuLi90eXBlcy9jbGllbnQnKS5kZWZhdWx0fVxuICovXG5jbGFzcyBDbGllbnQgZXh0ZW5kcyBEaXNwYXRjaGVyQmFzZSB7XG4gIC8qKlxuICAgKlxuICAgKiBAcGFyYW0ge3N0cmluZ3xVUkx9IHVybFxuICAgKiBAcGFyYW0ge2ltcG9ydCgnLi4vdHlwZXMvY2xpZW50JykuQ2xpZW50Lk9wdGlvbnN9IG9wdGlvbnNcbiAgICovXG4gIGNvbnN0cnVjdG9yICh1cmwsIHtcbiAgICBpbnRlcmNlcHRvcnMsXG4gICAgbWF4SGVhZGVyU2l6ZSxcbiAgICBoZWFkZXJzVGltZW91dCxcbiAgICBzb2NrZXRUaW1lb3V0LFxuICAgIHJlcXVlc3RUaW1lb3V0LFxuICAgIGNvbm5lY3RUaW1lb3V0LFxuICAgIGJvZHlUaW1lb3V0LFxuICAgIGlkbGVUaW1lb3V0LFxuICAgIGtlZXBBbGl2ZSxcbiAgICBrZWVwQWxpdmVUaW1lb3V0LFxuICAgIG1heEtlZXBBbGl2ZVRpbWVvdXQsXG4gICAga2VlcEFsaXZlTWF4VGltZW91dCxcbiAgICBrZWVwQWxpdmVUaW1lb3V0VGhyZXNob2xkLFxuICAgIHNvY2tldFBhdGgsXG4gICAgcGlwZWxpbmluZyxcbiAgICB0bHMsXG4gICAgc3RyaWN0Q29udGVudExlbmd0aCxcbiAgICBtYXhDYWNoZWRTZXNzaW9ucyxcbiAgICBtYXhSZWRpcmVjdGlvbnMsXG4gICAgY29ubmVjdCxcbiAgICBtYXhSZXF1ZXN0c1BlckNsaWVudCxcbiAgICBsb2NhbEFkZHJlc3MsXG4gICAgbWF4UmVzcG9uc2VTaXplLFxuICAgIGF1dG9TZWxlY3RGYW1pbHksXG4gICAgYXV0b1NlbGVjdEZhbWlseUF0dGVtcHRUaW1lb3V0LFxuICAgIC8vIGgyXG4gICAgYWxsb3dIMixcbiAgICBtYXhDb25jdXJyZW50U3RyZWFtc1xuICB9ID0ge30pIHtcbiAgICBzdXBlcigpXG5cbiAgICBpZiAoa2VlcEFsaXZlICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIHRocm93IG5ldyBJbnZhbGlkQXJndW1lbnRFcnJvcigndW5zdXBwb3J0ZWQga2VlcEFsaXZlLCB1c2UgcGlwZWxpbmluZz0wIGluc3RlYWQnKVxuICAgIH1cblxuICAgIGlmIChzb2NrZXRUaW1lb3V0ICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIHRocm93IG5ldyBJbnZhbGlkQXJndW1lbnRFcnJvcigndW5zdXBwb3J0ZWQgc29ja2V0VGltZW91dCwgdXNlIGhlYWRlcnNUaW1lb3V0ICYgYm9keVRpbWVvdXQgaW5zdGVhZCcpXG4gICAgfVxuXG4gICAgaWYgKHJlcXVlc3RUaW1lb3V0ICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIHRocm93IG5ldyBJbnZhbGlkQXJndW1lbnRFcnJvcigndW5zdXBwb3J0ZWQgcmVxdWVzdFRpbWVvdXQsIHVzZSBoZWFkZXJzVGltZW91dCAmIGJvZHlUaW1lb3V0IGluc3RlYWQnKVxuICAgIH1cblxuICAgIGlmIChpZGxlVGltZW91dCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICB0aHJvdyBuZXcgSW52YWxpZEFyZ3VtZW50RXJyb3IoJ3Vuc3VwcG9ydGVkIGlkbGVUaW1lb3V0LCB1c2Uga2VlcEFsaXZlVGltZW91dCBpbnN0ZWFkJylcbiAgICB9XG5cbiAgICBpZiAobWF4S2VlcEFsaXZlVGltZW91dCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICB0aHJvdyBuZXcgSW52YWxpZEFyZ3VtZW50RXJyb3IoJ3Vuc3VwcG9ydGVkIG1heEtlZXBBbGl2ZVRpbWVvdXQsIHVzZSBrZWVwQWxpdmVNYXhUaW1lb3V0IGluc3RlYWQnKVxuICAgIH1cblxuICAgIGlmIChtYXhIZWFkZXJTaXplICE9IG51bGwgJiYgIU51bWJlci5pc0Zpbml0ZShtYXhIZWFkZXJTaXplKSkge1xuICAgICAgdGhyb3cgbmV3IEludmFsaWRBcmd1bWVudEVycm9yKCdpbnZhbGlkIG1heEhlYWRlclNpemUnKVxuICAgIH1cblxuICAgIGlmIChzb2NrZXRQYXRoICE9IG51bGwgJiYgdHlwZW9mIHNvY2tldFBhdGggIT09ICdzdHJpbmcnKSB7XG4gICAgICB0aHJvdyBuZXcgSW52YWxpZEFyZ3VtZW50RXJyb3IoJ2ludmFsaWQgc29ja2V0UGF0aCcpXG4gICAgfVxuXG4gICAgaWYgKGNvbm5lY3RUaW1lb3V0ICE9IG51bGwgJiYgKCFOdW1iZXIuaXNGaW5pdGUoY29ubmVjdFRpbWVvdXQpIHx8IGNvbm5lY3RUaW1lb3V0IDwgMCkpIHtcbiAgICAgIHRocm93IG5ldyBJbnZhbGlkQXJndW1lbnRFcnJvcignaW52YWxpZCBjb25uZWN0VGltZW91dCcpXG4gICAgfVxuXG4gICAgaWYgKGtlZXBBbGl2ZVRpbWVvdXQgIT0gbnVsbCAmJiAoIU51bWJlci5pc0Zpbml0ZShrZWVwQWxpdmVUaW1lb3V0KSB8fCBrZWVwQWxpdmVUaW1lb3V0IDw9IDApKSB7XG4gICAgICB0aHJvdyBuZXcgSW52YWxpZEFyZ3VtZW50RXJyb3IoJ2ludmFsaWQga2VlcEFsaXZlVGltZW91dCcpXG4gICAgfVxuXG4gICAgaWYgKGtlZXBBbGl2ZU1heFRpbWVvdXQgIT0gbnVsbCAmJiAoIU51bWJlci5pc0Zpbml0ZShrZWVwQWxpdmVNYXhUaW1lb3V0KSB8fCBrZWVwQWxpdmVNYXhUaW1lb3V0IDw9IDApKSB7XG4gICAgICB0aHJvdyBuZXcgSW52YWxpZEFyZ3VtZW50RXJyb3IoJ2ludmFsaWQga2VlcEFsaXZlTWF4VGltZW91dCcpXG4gICAgfVxuXG4gICAgaWYgKGtlZXBBbGl2ZVRpbWVvdXRUaHJlc2hvbGQgIT0gbnVsbCAmJiAhTnVtYmVyLmlzRmluaXRlKGtlZXBBbGl2ZVRpbWVvdXRUaHJlc2hvbGQpKSB7XG4gICAgICB0aHJvdyBuZXcgSW52YWxpZEFyZ3VtZW50RXJyb3IoJ2ludmFsaWQga2VlcEFsaXZlVGltZW91dFRocmVzaG9sZCcpXG4gICAgfVxuXG4gICAgaWYgKGhlYWRlcnNUaW1lb3V0ICE9IG51bGwgJiYgKCFOdW1iZXIuaXNJbnRlZ2VyKGhlYWRlcnNUaW1lb3V0KSB8fCBoZWFkZXJzVGltZW91dCA8IDApKSB7XG4gICAgICB0aHJvdyBuZXcgSW52YWxpZEFyZ3VtZW50RXJyb3IoJ2hlYWRlcnNUaW1lb3V0IG11c3QgYmUgYSBwb3NpdGl2ZSBpbnRlZ2VyIG9yIHplcm8nKVxuICAgIH1cblxuICAgIGlmIChib2R5VGltZW91dCAhPSBudWxsICYmICghTnVtYmVyLmlzSW50ZWdlcihib2R5VGltZW91dCkgfHwgYm9keVRpbWVvdXQgPCAwKSkge1xuICAgICAgdGhyb3cgbmV3IEludmFsaWRBcmd1bWVudEVycm9yKCdib2R5VGltZW91dCBtdXN0IGJlIGEgcG9zaXRpdmUgaW50ZWdlciBvciB6ZXJvJylcbiAgICB9XG5cbiAgICBpZiAoY29ubmVjdCAhPSBudWxsICYmIHR5cGVvZiBjb25uZWN0ICE9PSAnZnVuY3Rpb24nICYmIHR5cGVvZiBjb25uZWN0ICE9PSAnb2JqZWN0Jykge1xuICAgICAgdGhyb3cgbmV3IEludmFsaWRBcmd1bWVudEVycm9yKCdjb25uZWN0IG11c3QgYmUgYSBmdW5jdGlvbiBvciBhbiBvYmplY3QnKVxuICAgIH1cblxuICAgIGlmIChtYXhSZWRpcmVjdGlvbnMgIT0gbnVsbCAmJiAoIU51bWJlci5pc0ludGVnZXIobWF4UmVkaXJlY3Rpb25zKSB8fCBtYXhSZWRpcmVjdGlvbnMgPCAwKSkge1xuICAgICAgdGhyb3cgbmV3IEludmFsaWRBcmd1bWVudEVycm9yKCdtYXhSZWRpcmVjdGlvbnMgbXVzdCBiZSBhIHBvc2l0aXZlIG51bWJlcicpXG4gICAgfVxuXG4gICAgaWYgKG1heFJlcXVlc3RzUGVyQ2xpZW50ICE9IG51bGwgJiYgKCFOdW1iZXIuaXNJbnRlZ2VyKG1heFJlcXVlc3RzUGVyQ2xpZW50KSB8fCBtYXhSZXF1ZXN0c1BlckNsaWVudCA8IDApKSB7XG4gICAgICB0aHJvdyBuZXcgSW52YWxpZEFyZ3VtZW50RXJyb3IoJ21heFJlcXVlc3RzUGVyQ2xpZW50IG11c3QgYmUgYSBwb3NpdGl2ZSBudW1iZXInKVxuICAgIH1cblxuICAgIGlmIChsb2NhbEFkZHJlc3MgIT0gbnVsbCAmJiAodHlwZW9mIGxvY2FsQWRkcmVzcyAhPT0gJ3N0cmluZycgfHwgbmV0LmlzSVAobG9jYWxBZGRyZXNzKSA9PT0gMCkpIHtcbiAgICAgIHRocm93IG5ldyBJbnZhbGlkQXJndW1lbnRFcnJvcignbG9jYWxBZGRyZXNzIG11c3QgYmUgdmFsaWQgc3RyaW5nIElQIGFkZHJlc3MnKVxuICAgIH1cblxuICAgIGlmIChtYXhSZXNwb25zZVNpemUgIT0gbnVsbCAmJiAoIU51bWJlci5pc0ludGVnZXIobWF4UmVzcG9uc2VTaXplKSB8fCBtYXhSZXNwb25zZVNpemUgPCAtMSkpIHtcbiAgICAgIHRocm93IG5ldyBJbnZhbGlkQXJndW1lbnRFcnJvcignbWF4UmVzcG9uc2VTaXplIG11c3QgYmUgYSBwb3NpdGl2ZSBudW1iZXInKVxuICAgIH1cblxuICAgIGlmIChcbiAgICAgIGF1dG9TZWxlY3RGYW1pbHlBdHRlbXB0VGltZW91dCAhPSBudWxsICYmXG4gICAgICAoIU51bWJlci5pc0ludGVnZXIoYXV0b1NlbGVjdEZhbWlseUF0dGVtcHRUaW1lb3V0KSB8fCBhdXRvU2VsZWN0RmFtaWx5QXR0ZW1wdFRpbWVvdXQgPCAtMSlcbiAgICApIHtcbiAgICAgIHRocm93IG5ldyBJbnZhbGlkQXJndW1lbnRFcnJvcignYXV0b1NlbGVjdEZhbWlseUF0dGVtcHRUaW1lb3V0IG11c3QgYmUgYSBwb3NpdGl2ZSBudW1iZXInKVxuICAgIH1cblxuICAgIC8vIGgyXG4gICAgaWYgKGFsbG93SDIgIT0gbnVsbCAmJiB0eXBlb2YgYWxsb3dIMiAhPT0gJ2Jvb2xlYW4nKSB7XG4gICAgICB0aHJvdyBuZXcgSW52YWxpZEFyZ3VtZW50RXJyb3IoJ2FsbG93SDIgbXVzdCBiZSBhIHZhbGlkIGJvb2xlYW4gdmFsdWUnKVxuICAgIH1cblxuICAgIGlmIChtYXhDb25jdXJyZW50U3RyZWFtcyAhPSBudWxsICYmICh0eXBlb2YgbWF4Q29uY3VycmVudFN0cmVhbXMgIT09ICdudW1iZXInIHx8IG1heENvbmN1cnJlbnRTdHJlYW1zIDwgMSkpIHtcbiAgICAgIHRocm93IG5ldyBJbnZhbGlkQXJndW1lbnRFcnJvcignbWF4Q29uY3VycmVudFN0cmVhbXMgbXVzdCBiZSBhIHBvc3NpdGl2ZSBpbnRlZ2VyLCBncmVhdGVyIHRoYW4gMCcpXG4gICAgfVxuXG4gICAgaWYgKHR5cGVvZiBjb25uZWN0ICE9PSAnZnVuY3Rpb24nKSB7XG4gICAgICBjb25uZWN0ID0gYnVpbGRDb25uZWN0b3Ioe1xuICAgICAgICAuLi50bHMsXG4gICAgICAgIG1heENhY2hlZFNlc3Npb25zLFxuICAgICAgICBhbGxvd0gyLFxuICAgICAgICBzb2NrZXRQYXRoLFxuICAgICAgICB0aW1lb3V0OiBjb25uZWN0VGltZW91dCxcbiAgICAgICAgLi4uKHV0aWwubm9kZUhhc0F1dG9TZWxlY3RGYW1pbHkgJiYgYXV0b1NlbGVjdEZhbWlseSA/IHsgYXV0b1NlbGVjdEZhbWlseSwgYXV0b1NlbGVjdEZhbWlseUF0dGVtcHRUaW1lb3V0IH0gOiB1bmRlZmluZWQpLFxuICAgICAgICAuLi5jb25uZWN0XG4gICAgICB9KVxuICAgIH1cblxuICAgIHRoaXNba0ludGVyY2VwdG9yc10gPSBpbnRlcmNlcHRvcnMgJiYgaW50ZXJjZXB0b3JzLkNsaWVudCAmJiBBcnJheS5pc0FycmF5KGludGVyY2VwdG9ycy5DbGllbnQpXG4gICAgICA/IGludGVyY2VwdG9ycy5DbGllbnRcbiAgICAgIDogW2NyZWF0ZVJlZGlyZWN0SW50ZXJjZXB0b3IoeyBtYXhSZWRpcmVjdGlvbnMgfSldXG4gICAgdGhpc1trVXJsXSA9IHV0aWwucGFyc2VPcmlnaW4odXJsKVxuICAgIHRoaXNba0Nvbm5lY3Rvcl0gPSBjb25uZWN0XG4gICAgdGhpc1trU29ja2V0XSA9IG51bGxcbiAgICB0aGlzW2tQaXBlbGluaW5nXSA9IHBpcGVsaW5pbmcgIT0gbnVsbCA/IHBpcGVsaW5pbmcgOiAxXG4gICAgdGhpc1trTWF4SGVhZGVyc1NpemVdID0gbWF4SGVhZGVyU2l6ZSB8fCBodHRwLm1heEhlYWRlclNpemVcbiAgICB0aGlzW2tLZWVwQWxpdmVEZWZhdWx0VGltZW91dF0gPSBrZWVwQWxpdmVUaW1lb3V0ID09IG51bGwgPyA0ZTMgOiBrZWVwQWxpdmVUaW1lb3V0XG4gICAgdGhpc1trS2VlcEFsaXZlTWF4VGltZW91dF0gPSBrZWVwQWxpdmVNYXhUaW1lb3V0ID09IG51bGwgPyA2MDBlMyA6IGtlZXBBbGl2ZU1heFRpbWVvdXRcbiAgICB0aGlzW2tLZWVwQWxpdmVUaW1lb3V0VGhyZXNob2xkXSA9IGtlZXBBbGl2ZVRpbWVvdXRUaHJlc2hvbGQgPT0gbnVsbCA/IDFlMyA6IGtlZXBBbGl2ZVRpbWVvdXRUaHJlc2hvbGRcbiAgICB0aGlzW2tLZWVwQWxpdmVUaW1lb3V0VmFsdWVdID0gdGhpc1trS2VlcEFsaXZlRGVmYXVsdFRpbWVvdXRdXG4gICAgdGhpc1trU2VydmVyTmFtZV0gPSBudWxsXG4gICAgdGhpc1trTG9jYWxBZGRyZXNzXSA9IGxvY2FsQWRkcmVzcyAhPSBudWxsID8gbG9jYWxBZGRyZXNzIDogbnVsbFxuICAgIHRoaXNba1Jlc3VtaW5nXSA9IDAgLy8gMCwgaWRsZSwgMSwgc2NoZWR1bGVkLCAyIHJlc3VtaW5nXG4gICAgdGhpc1trTmVlZERyYWluXSA9IDAgLy8gMCwgaWRsZSwgMSwgc2NoZWR1bGVkLCAyIHJlc3VtaW5nXG4gICAgdGhpc1trSG9zdEhlYWRlcl0gPSBgaG9zdDogJHt0aGlzW2tVcmxdLmhvc3RuYW1lfSR7dGhpc1trVXJsXS5wb3J0ID8gYDoke3RoaXNba1VybF0ucG9ydH1gIDogJyd9XFxyXFxuYFxuICAgIHRoaXNba0JvZHlUaW1lb3V0XSA9IGJvZHlUaW1lb3V0ICE9IG51bGwgPyBib2R5VGltZW91dCA6IDMwMGUzXG4gICAgdGhpc1trSGVhZGVyc1RpbWVvdXRdID0gaGVhZGVyc1RpbWVvdXQgIT0gbnVsbCA/IGhlYWRlcnNUaW1lb3V0IDogMzAwZTNcbiAgICB0aGlzW2tTdHJpY3RDb250ZW50TGVuZ3RoXSA9IHN0cmljdENvbnRlbnRMZW5ndGggPT0gbnVsbCA/IHRydWUgOiBzdHJpY3RDb250ZW50TGVuZ3RoXG4gICAgdGhpc1trTWF4UmVkaXJlY3Rpb25zXSA9IG1heFJlZGlyZWN0aW9uc1xuICAgIHRoaXNba01heFJlcXVlc3RzXSA9IG1heFJlcXVlc3RzUGVyQ2xpZW50XG4gICAgdGhpc1trQ2xvc2VkUmVzb2x2ZV0gPSBudWxsXG4gICAgdGhpc1trTWF4UmVzcG9uc2VTaXplXSA9IG1heFJlc3BvbnNlU2l6ZSA+IC0xID8gbWF4UmVzcG9uc2VTaXplIDogLTFcbiAgICB0aGlzW2tIVFRQQ29ublZlcnNpb25dID0gJ2gxJ1xuXG4gICAgLy8gSFRUUC8yXG4gICAgdGhpc1trSFRUUDJTZXNzaW9uXSA9IG51bGxcbiAgICB0aGlzW2tIVFRQMlNlc3Npb25TdGF0ZV0gPSAhYWxsb3dIMlxuICAgICAgPyBudWxsXG4gICAgICA6IHtcbiAgICAgICAgLy8gc3RyZWFtczogbnVsbCwgLy8gRml4ZWQgcXVldWUgb2Ygc3RyZWFtcyAtIEZvciBmdXR1cmUgc3VwcG9ydCBvZiBgcHVzaGBcbiAgICAgICAgICBvcGVuU3RyZWFtczogMCwgLy8gS2VlcCB0cmFjayBvZiB0aGVtIHRvIGRlY2lkZSB3ZXRoZXIgb3Igbm90IHVucmVmIHRoZSBzZXNzaW9uXG4gICAgICAgICAgbWF4Q29uY3VycmVudFN0cmVhbXM6IG1heENvbmN1cnJlbnRTdHJlYW1zICE9IG51bGwgPyBtYXhDb25jdXJyZW50U3RyZWFtcyA6IDEwMCAvLyBNYXggcGVlckNvbmN1cnJlbnRTdHJlYW1zIGZvciBhIE5vZGUgaDIgc2VydmVyXG4gICAgICAgIH1cbiAgICB0aGlzW2tIb3N0XSA9IGAke3RoaXNba1VybF0uaG9zdG5hbWV9JHt0aGlzW2tVcmxdLnBvcnQgPyBgOiR7dGhpc1trVXJsXS5wb3J0fWAgOiAnJ31gXG5cbiAgICAvLyBrUXVldWUgaXMgYnVpbHQgdXAgb2YgMyBzZWN0aW9ucyBzZXBhcmF0ZWQgYnlcbiAgICAvLyB0aGUga1J1bm5pbmdJZHggYW5kIGtQZW5kaW5nSWR4IGluZGljZXMuXG4gICAgLy8gfCAgIGNvbXBsZXRlICAgfCAgIHJ1bm5pbmcgICB8ICAgcGVuZGluZyAgIHxcbiAgICAvLyAgICAgICAgICAgICAgICBeIGtSdW5uaW5nSWR4IF4ga1BlbmRpbmdJZHggXiBrUXVldWUubGVuZ3RoXG4gICAgLy8ga1J1bm5pbmdJZHggcG9pbnRzIHRvIHRoZSBmaXJzdCBydW5uaW5nIGVsZW1lbnQuXG4gICAgLy8ga1BlbmRpbmdJZHggcG9pbnRzIHRvIHRoZSBmaXJzdCBwZW5kaW5nIGVsZW1lbnQuXG4gICAgLy8gVGhpcyBpbXBsZW1lbnRzIGEgZmFzdCBxdWV1ZSB3aXRoIGFuIGFtb3J0aXplZFxuICAgIC8vIHRpbWUgb2YgTygxKS5cblxuICAgIHRoaXNba1F1ZXVlXSA9IFtdXG4gICAgdGhpc1trUnVubmluZ0lkeF0gPSAwXG4gICAgdGhpc1trUGVuZGluZ0lkeF0gPSAwXG4gIH1cblxuICBnZXQgcGlwZWxpbmluZyAoKSB7XG4gICAgcmV0dXJuIHRoaXNba1BpcGVsaW5pbmddXG4gIH1cblxuICBzZXQgcGlwZWxpbmluZyAodmFsdWUpIHtcbiAgICB0aGlzW2tQaXBlbGluaW5nXSA9IHZhbHVlXG4gICAgcmVzdW1lKHRoaXMsIHRydWUpXG4gIH1cblxuICBnZXQgW2tQZW5kaW5nXSAoKSB7XG4gICAgcmV0dXJuIHRoaXNba1F1ZXVlXS5sZW5ndGggLSB0aGlzW2tQZW5kaW5nSWR4XVxuICB9XG5cbiAgZ2V0IFtrUnVubmluZ10gKCkge1xuICAgIHJldHVybiB0aGlzW2tQZW5kaW5nSWR4XSAtIHRoaXNba1J1bm5pbmdJZHhdXG4gIH1cblxuICBnZXQgW2tTaXplXSAoKSB7XG4gICAgcmV0dXJuIHRoaXNba1F1ZXVlXS5sZW5ndGggLSB0aGlzW2tSdW5uaW5nSWR4XVxuICB9XG5cbiAgZ2V0IFtrQ29ubmVjdGVkXSAoKSB7XG4gICAgcmV0dXJuICEhdGhpc1trU29ja2V0XSAmJiAhdGhpc1trQ29ubmVjdGluZ10gJiYgIXRoaXNba1NvY2tldF0uZGVzdHJveWVkXG4gIH1cblxuICBnZXQgW2tCdXN5XSAoKSB7XG4gICAgY29uc3Qgc29ja2V0ID0gdGhpc1trU29ja2V0XVxuICAgIHJldHVybiAoXG4gICAgICAoc29ja2V0ICYmIChzb2NrZXRba1Jlc2V0XSB8fCBzb2NrZXRba1dyaXRpbmddIHx8IHNvY2tldFtrQmxvY2tpbmddKSkgfHxcbiAgICAgICh0aGlzW2tTaXplXSA+PSAodGhpc1trUGlwZWxpbmluZ10gfHwgMSkpIHx8XG4gICAgICB0aGlzW2tQZW5kaW5nXSA+IDBcbiAgICApXG4gIH1cblxuICAvKiBpc3RhbmJ1bCBpZ25vcmU6IG9ubHkgdXNlZCBmb3IgdGVzdCAqL1xuICBba0Nvbm5lY3RdIChjYikge1xuICAgIGNvbm5lY3QodGhpcylcbiAgICB0aGlzLm9uY2UoJ2Nvbm5lY3QnLCBjYilcbiAgfVxuXG4gIFtrRGlzcGF0Y2hdIChvcHRzLCBoYW5kbGVyKSB7XG4gICAgY29uc3Qgb3JpZ2luID0gb3B0cy5vcmlnaW4gfHwgdGhpc1trVXJsXS5vcmlnaW5cblxuICAgIGNvbnN0IHJlcXVlc3QgPSB0aGlzW2tIVFRQQ29ublZlcnNpb25dID09PSAnaDInXG4gICAgICA/IFJlcXVlc3Rba0hUVFAyQnVpbGRSZXF1ZXN0XShvcmlnaW4sIG9wdHMsIGhhbmRsZXIpXG4gICAgICA6IFJlcXVlc3Rba0hUVFAxQnVpbGRSZXF1ZXN0XShvcmlnaW4sIG9wdHMsIGhhbmRsZXIpXG5cbiAgICB0aGlzW2tRdWV1ZV0ucHVzaChyZXF1ZXN0KVxuICAgIGlmICh0aGlzW2tSZXN1bWluZ10pIHtcbiAgICAgIC8vIERvIG5vdGhpbmcuXG4gICAgfSBlbHNlIGlmICh1dGlsLmJvZHlMZW5ndGgocmVxdWVzdC5ib2R5KSA9PSBudWxsICYmIHV0aWwuaXNJdGVyYWJsZShyZXF1ZXN0LmJvZHkpKSB7XG4gICAgICAvLyBXYWl0IGEgdGljayBpbiBjYXNlIHN0cmVhbS9pdGVyYXRvciBpcyBlbmRlZCBpbiB0aGUgc2FtZSB0aWNrLlxuICAgICAgdGhpc1trUmVzdW1pbmddID0gMVxuICAgICAgcHJvY2Vzcy5uZXh0VGljayhyZXN1bWUsIHRoaXMpXG4gICAgfSBlbHNlIHtcbiAgICAgIHJlc3VtZSh0aGlzLCB0cnVlKVxuICAgIH1cblxuICAgIGlmICh0aGlzW2tSZXN1bWluZ10gJiYgdGhpc1trTmVlZERyYWluXSAhPT0gMiAmJiB0aGlzW2tCdXN5XSkge1xuICAgICAgdGhpc1trTmVlZERyYWluXSA9IDJcbiAgICB9XG5cbiAgICByZXR1cm4gdGhpc1trTmVlZERyYWluXSA8IDJcbiAgfVxuXG4gIGFzeW5jIFtrQ2xvc2VdICgpIHtcbiAgICAvLyBUT0RPOiBmb3IgSDIgd2UgbmVlZCB0byBncmFjZWZ1bGx5IGZsdXNoIHRoZSByZW1haW5pbmcgZW5xdWV1ZWRcbiAgICAvLyByZXF1ZXN0IGFuZCBjbG9zZSBlYWNoIHN0cmVhbS5cbiAgICByZXR1cm4gbmV3IFByb21pc2UoKHJlc29sdmUpID0+IHtcbiAgICAgIGlmICghdGhpc1trU2l6ZV0pIHtcbiAgICAgICAgcmVzb2x2ZShudWxsKVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdGhpc1trQ2xvc2VkUmVzb2x2ZV0gPSByZXNvbHZlXG4gICAgICB9XG4gICAgfSlcbiAgfVxuXG4gIGFzeW5jIFtrRGVzdHJveV0gKGVycikge1xuICAgIHJldHVybiBuZXcgUHJvbWlzZSgocmVzb2x2ZSkgPT4ge1xuICAgICAgY29uc3QgcmVxdWVzdHMgPSB0aGlzW2tRdWV1ZV0uc3BsaWNlKHRoaXNba1BlbmRpbmdJZHhdKVxuICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCByZXF1ZXN0cy5sZW5ndGg7IGkrKykge1xuICAgICAgICBjb25zdCByZXF1ZXN0ID0gcmVxdWVzdHNbaV1cbiAgICAgICAgZXJyb3JSZXF1ZXN0KHRoaXMsIHJlcXVlc3QsIGVycilcbiAgICAgIH1cblxuICAgICAgY29uc3QgY2FsbGJhY2sgPSAoKSA9PiB7XG4gICAgICAgIGlmICh0aGlzW2tDbG9zZWRSZXNvbHZlXSkge1xuICAgICAgICAgIC8vIFRPRE8gKGZpeCk6IFNob3VsZCB3ZSBlcnJvciBoZXJlIHdpdGggQ2xpZW50RGVzdHJveWVkRXJyb3I/XG4gICAgICAgICAgdGhpc1trQ2xvc2VkUmVzb2x2ZV0oKVxuICAgICAgICAgIHRoaXNba0Nsb3NlZFJlc29sdmVdID0gbnVsbFxuICAgICAgICB9XG4gICAgICAgIHJlc29sdmUoKVxuICAgICAgfVxuXG4gICAgICBpZiAodGhpc1trSFRUUDJTZXNzaW9uXSAhPSBudWxsKSB7XG4gICAgICAgIHV0aWwuZGVzdHJveSh0aGlzW2tIVFRQMlNlc3Npb25dLCBlcnIpXG4gICAgICAgIHRoaXNba0hUVFAyU2Vzc2lvbl0gPSBudWxsXG4gICAgICAgIHRoaXNba0hUVFAyU2Vzc2lvblN0YXRlXSA9IG51bGxcbiAgICAgIH1cblxuICAgICAgaWYgKCF0aGlzW2tTb2NrZXRdKSB7XG4gICAgICAgIHF1ZXVlTWljcm90YXNrKGNhbGxiYWNrKVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdXRpbC5kZXN0cm95KHRoaXNba1NvY2tldF0ub24oJ2Nsb3NlJywgY2FsbGJhY2spLCBlcnIpXG4gICAgICB9XG5cbiAgICAgIHJlc3VtZSh0aGlzKVxuICAgIH0pXG4gIH1cbn1cblxuZnVuY3Rpb24gb25IdHRwMlNlc3Npb25FcnJvciAoZXJyKSB7XG4gIGFzc2VydChlcnIuY29kZSAhPT0gJ0VSUl9UTFNfQ0VSVF9BTFROQU1FX0lOVkFMSUQnKVxuXG4gIHRoaXNba1NvY2tldF1ba0Vycm9yXSA9IGVyclxuXG4gIG9uRXJyb3IodGhpc1trQ2xpZW50XSwgZXJyKVxufVxuXG5mdW5jdGlvbiBvbkh0dHAyRnJhbWVFcnJvciAodHlwZSwgY29kZSwgaWQpIHtcbiAgY29uc3QgZXJyID0gbmV3IEluZm9ybWF0aW9uYWxFcnJvcihgSFRUUC8yOiBcImZyYW1lRXJyb3JcIiByZWNlaXZlZCAtIHR5cGUgJHt0eXBlfSwgY29kZSAke2NvZGV9YClcblxuICBpZiAoaWQgPT09IDApIHtcbiAgICB0aGlzW2tTb2NrZXRdW2tFcnJvcl0gPSBlcnJcbiAgICBvbkVycm9yKHRoaXNba0NsaWVudF0sIGVycilcbiAgfVxufVxuXG5mdW5jdGlvbiBvbkh0dHAyU2Vzc2lvbkVuZCAoKSB7XG4gIHV0aWwuZGVzdHJveSh0aGlzLCBuZXcgU29ja2V0RXJyb3IoJ290aGVyIHNpZGUgY2xvc2VkJykpXG4gIHV0aWwuZGVzdHJveSh0aGlzW2tTb2NrZXRdLCBuZXcgU29ja2V0RXJyb3IoJ290aGVyIHNpZGUgY2xvc2VkJykpXG59XG5cbmZ1bmN0aW9uIG9uSFRUUDJHb0F3YXkgKGNvZGUpIHtcbiAgY29uc3QgY2xpZW50ID0gdGhpc1trQ2xpZW50XVxuICBjb25zdCBlcnIgPSBuZXcgSW5mb3JtYXRpb25hbEVycm9yKGBIVFRQLzI6IFwiR09BV0FZXCIgZnJhbWUgcmVjZWl2ZWQgd2l0aCBjb2RlICR7Y29kZX1gKVxuICBjbGllbnRba1NvY2tldF0gPSBudWxsXG4gIGNsaWVudFtrSFRUUDJTZXNzaW9uXSA9IG51bGxcblxuICBpZiAoY2xpZW50LmRlc3Ryb3llZCkge1xuICAgIGFzc2VydCh0aGlzW2tQZW5kaW5nXSA9PT0gMClcblxuICAgIC8vIEZhaWwgZW50aXJlIHF1ZXVlLlxuICAgIGNvbnN0IHJlcXVlc3RzID0gY2xpZW50W2tRdWV1ZV0uc3BsaWNlKGNsaWVudFtrUnVubmluZ0lkeF0pXG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCByZXF1ZXN0cy5sZW5ndGg7IGkrKykge1xuICAgICAgY29uc3QgcmVxdWVzdCA9IHJlcXVlc3RzW2ldXG4gICAgICBlcnJvclJlcXVlc3QodGhpcywgcmVxdWVzdCwgZXJyKVxuICAgIH1cbiAgfSBlbHNlIGlmIChjbGllbnRba1J1bm5pbmddID4gMCkge1xuICAgIC8vIEZhaWwgaGVhZCBvZiBwaXBlbGluZS5cbiAgICBjb25zdCByZXF1ZXN0ID0gY2xpZW50W2tRdWV1ZV1bY2xpZW50W2tSdW5uaW5nSWR4XV1cbiAgICBjbGllbnRba1F1ZXVlXVtjbGllbnRba1J1bm5pbmdJZHhdKytdID0gbnVsbFxuXG4gICAgZXJyb3JSZXF1ZXN0KGNsaWVudCwgcmVxdWVzdCwgZXJyKVxuICB9XG5cbiAgY2xpZW50W2tQZW5kaW5nSWR4XSA9IGNsaWVudFtrUnVubmluZ0lkeF1cblxuICBhc3NlcnQoY2xpZW50W2tSdW5uaW5nXSA9PT0gMClcblxuICBjbGllbnQuZW1pdCgnZGlzY29ubmVjdCcsXG4gICAgY2xpZW50W2tVcmxdLFxuICAgIFtjbGllbnRdLFxuICAgIGVyclxuICApXG5cbiAgcmVzdW1lKGNsaWVudClcbn1cblxuY29uc3QgY29uc3RhbnRzID0gcmVxdWlyZSgnLi9sbGh0dHAvY29uc3RhbnRzJylcbmNvbnN0IGNyZWF0ZVJlZGlyZWN0SW50ZXJjZXB0b3IgPSByZXF1aXJlKCcuL2ludGVyY2VwdG9yL3JlZGlyZWN0SW50ZXJjZXB0b3InKVxuY29uc3QgRU1QVFlfQlVGID0gQnVmZmVyLmFsbG9jKDApXG5cbmFzeW5jIGZ1bmN0aW9uIGxhenlsbGh0dHAgKCkge1xuICBjb25zdCBsbGh0dHBXYXNtRGF0YSA9IHByb2Nlc3MuZW52LkpFU1RfV09SS0VSX0lEID8gcmVxdWlyZSgnLi9sbGh0dHAvbGxodHRwLXdhc20uanMnKSA6IHVuZGVmaW5lZFxuXG4gIGxldCBtb2RcbiAgdHJ5IHtcbiAgICBtb2QgPSBhd2FpdCBXZWJBc3NlbWJseS5jb21waWxlKEJ1ZmZlci5mcm9tKHJlcXVpcmUoJy4vbGxodHRwL2xsaHR0cF9zaW1kLXdhc20uanMnKSwgJ2Jhc2U2NCcpKVxuICB9IGNhdGNoIChlKSB7XG4gICAgLyogaXN0YW5idWwgaWdub3JlIG5leHQgKi9cblxuICAgIC8vIFdlIGNvdWxkIGNoZWNrIGlmIHRoZSBlcnJvciB3YXMgY2F1c2VkIGJ5IHRoZSBzaW1kIG9wdGlvbiBub3RcbiAgICAvLyBiZWluZyBlbmFibGVkLCBidXQgdGhlIG9jY3VycmluZyBvZiB0aGlzIG90aGVyIGVycm9yXG4gICAgLy8gKiBodHRwczovL2dpdGh1Yi5jb20vZW1zY3JpcHRlbi1jb3JlL2Vtc2NyaXB0ZW4vaXNzdWVzLzExNDk1XG4gICAgLy8gZ290IG1lIHRvIHJlbW92ZSB0aGF0IGNoZWNrIHRvIGF2b2lkIGJyZWFraW5nIE5vZGUgMTIuXG4gICAgbW9kID0gYXdhaXQgV2ViQXNzZW1ibHkuY29tcGlsZShCdWZmZXIuZnJvbShsbGh0dHBXYXNtRGF0YSB8fCByZXF1aXJlKCcuL2xsaHR0cC9sbGh0dHAtd2FzbS5qcycpLCAnYmFzZTY0JykpXG4gIH1cblxuICByZXR1cm4gYXdhaXQgV2ViQXNzZW1ibHkuaW5zdGFudGlhdGUobW9kLCB7XG4gICAgZW52OiB7XG4gICAgICAvKiBlc2xpbnQtZGlzYWJsZSBjYW1lbGNhc2UgKi9cblxuICAgICAgd2FzbV9vbl91cmw6IChwLCBhdCwgbGVuKSA9PiB7XG4gICAgICAgIC8qIGlzdGFuYnVsIGlnbm9yZSBuZXh0ICovXG4gICAgICAgIHJldHVybiAwXG4gICAgICB9LFxuICAgICAgd2FzbV9vbl9zdGF0dXM6IChwLCBhdCwgbGVuKSA9PiB7XG4gICAgICAgIGFzc2VydC5zdHJpY3RFcXVhbChjdXJyZW50UGFyc2VyLnB0ciwgcClcbiAgICAgICAgY29uc3Qgc3RhcnQgPSBhdCAtIGN1cnJlbnRCdWZmZXJQdHIgKyBjdXJyZW50QnVmZmVyUmVmLmJ5dGVPZmZzZXRcbiAgICAgICAgcmV0dXJuIGN1cnJlbnRQYXJzZXIub25TdGF0dXMobmV3IEZhc3RCdWZmZXIoY3VycmVudEJ1ZmZlclJlZi5idWZmZXIsIHN0YXJ0LCBsZW4pKSB8fCAwXG4gICAgICB9LFxuICAgICAgd2FzbV9vbl9tZXNzYWdlX2JlZ2luOiAocCkgPT4ge1xuICAgICAgICBhc3NlcnQuc3RyaWN0RXF1YWwoY3VycmVudFBhcnNlci5wdHIsIHApXG4gICAgICAgIHJldHVybiBjdXJyZW50UGFyc2VyLm9uTWVzc2FnZUJlZ2luKCkgfHwgMFxuICAgICAgfSxcbiAgICAgIHdhc21fb25faGVhZGVyX2ZpZWxkOiAocCwgYXQsIGxlbikgPT4ge1xuICAgICAgICBhc3NlcnQuc3RyaWN0RXF1YWwoY3VycmVudFBhcnNlci5wdHIsIHApXG4gICAgICAgIGNvbnN0IHN0YXJ0ID0gYXQgLSBjdXJyZW50QnVmZmVyUHRyICsgY3VycmVudEJ1ZmZlclJlZi5ieXRlT2Zmc2V0XG4gICAgICAgIHJldHVybiBjdXJyZW50UGFyc2VyLm9uSGVhZGVyRmllbGQobmV3IEZhc3RCdWZmZXIoY3VycmVudEJ1ZmZlclJlZi5idWZmZXIsIHN0YXJ0LCBsZW4pKSB8fCAwXG4gICAgICB9LFxuICAgICAgd2FzbV9vbl9oZWFkZXJfdmFsdWU6IChwLCBhdCwgbGVuKSA9PiB7XG4gICAgICAgIGFzc2VydC5zdHJpY3RFcXVhbChjdXJyZW50UGFyc2VyLnB0ciwgcClcbiAgICAgICAgY29uc3Qgc3RhcnQgPSBhdCAtIGN1cnJlbnRCdWZmZXJQdHIgKyBjdXJyZW50QnVmZmVyUmVmLmJ5dGVPZmZzZXRcbiAgICAgICAgcmV0dXJuIGN1cnJlbnRQYXJzZXIub25IZWFkZXJWYWx1ZShuZXcgRmFzdEJ1ZmZlcihjdXJyZW50QnVmZmVyUmVmLmJ1ZmZlciwgc3RhcnQsIGxlbikpIHx8IDBcbiAgICAgIH0sXG4gICAgICB3YXNtX29uX2hlYWRlcnNfY29tcGxldGU6IChwLCBzdGF0dXNDb2RlLCB1cGdyYWRlLCBzaG91bGRLZWVwQWxpdmUpID0+IHtcbiAgICAgICAgYXNzZXJ0LnN0cmljdEVxdWFsKGN1cnJlbnRQYXJzZXIucHRyLCBwKVxuICAgICAgICByZXR1cm4gY3VycmVudFBhcnNlci5vbkhlYWRlcnNDb21wbGV0ZShzdGF0dXNDb2RlLCBCb29sZWFuKHVwZ3JhZGUpLCBCb29sZWFuKHNob3VsZEtlZXBBbGl2ZSkpIHx8IDBcbiAgICAgIH0sXG4gICAgICB3YXNtX29uX2JvZHk6IChwLCBhdCwgbGVuKSA9PiB7XG4gICAgICAgIGFzc2VydC5zdHJpY3RFcXVhbChjdXJyZW50UGFyc2VyLnB0ciwgcClcbiAgICAgICAgY29uc3Qgc3RhcnQgPSBhdCAtIGN1cnJlbnRCdWZmZXJQdHIgKyBjdXJyZW50QnVmZmVyUmVmLmJ5dGVPZmZzZXRcbiAgICAgICAgcmV0dXJuIGN1cnJlbnRQYXJzZXIub25Cb2R5KG5ldyBGYXN0QnVmZmVyKGN1cnJlbnRCdWZmZXJSZWYuYnVmZmVyLCBzdGFydCwgbGVuKSkgfHwgMFxuICAgICAgfSxcbiAgICAgIHdhc21fb25fbWVzc2FnZV9jb21wbGV0ZTogKHApID0+IHtcbiAgICAgICAgYXNzZXJ0LnN0cmljdEVxdWFsKGN1cnJlbnRQYXJzZXIucHRyLCBwKVxuICAgICAgICByZXR1cm4gY3VycmVudFBhcnNlci5vbk1lc3NhZ2VDb21wbGV0ZSgpIHx8IDBcbiAgICAgIH1cblxuICAgICAgLyogZXNsaW50LWVuYWJsZSBjYW1lbGNhc2UgKi9cbiAgICB9XG4gIH0pXG59XG5cbmxldCBsbGh0dHBJbnN0YW5jZSA9IG51bGxcbmxldCBsbGh0dHBQcm9taXNlID0gbGF6eWxsaHR0cCgpXG5sbGh0dHBQcm9taXNlLmNhdGNoKClcblxubGV0IGN1cnJlbnRQYXJzZXIgPSBudWxsXG5sZXQgY3VycmVudEJ1ZmZlclJlZiA9IG51bGxcbmxldCBjdXJyZW50QnVmZmVyU2l6ZSA9IDBcbmxldCBjdXJyZW50QnVmZmVyUHRyID0gbnVsbFxuXG5jb25zdCBUSU1FT1VUX0hFQURFUlMgPSAxXG5jb25zdCBUSU1FT1VUX0JPRFkgPSAyXG5jb25zdCBUSU1FT1VUX0lETEUgPSAzXG5cbmNsYXNzIFBhcnNlciB7XG4gIGNvbnN0cnVjdG9yIChjbGllbnQsIHNvY2tldCwgeyBleHBvcnRzIH0pIHtcbiAgICBhc3NlcnQoTnVtYmVyLmlzRmluaXRlKGNsaWVudFtrTWF4SGVhZGVyc1NpemVdKSAmJiBjbGllbnRba01heEhlYWRlcnNTaXplXSA+IDApXG5cbiAgICB0aGlzLmxsaHR0cCA9IGV4cG9ydHNcbiAgICB0aGlzLnB0ciA9IHRoaXMubGxodHRwLmxsaHR0cF9hbGxvYyhjb25zdGFudHMuVFlQRS5SRVNQT05TRSlcbiAgICB0aGlzLmNsaWVudCA9IGNsaWVudFxuICAgIHRoaXMuc29ja2V0ID0gc29ja2V0XG4gICAgdGhpcy50aW1lb3V0ID0gbnVsbFxuICAgIHRoaXMudGltZW91dFZhbHVlID0gbnVsbFxuICAgIHRoaXMudGltZW91dFR5cGUgPSBudWxsXG4gICAgdGhpcy5zdGF0dXNDb2RlID0gbnVsbFxuICAgIHRoaXMuc3RhdHVzVGV4dCA9ICcnXG4gICAgdGhpcy51cGdyYWRlID0gZmFsc2VcbiAgICB0aGlzLmhlYWRlcnMgPSBbXVxuICAgIHRoaXMuaGVhZGVyc1NpemUgPSAwXG4gICAgdGhpcy5oZWFkZXJzTWF4U2l6ZSA9IGNsaWVudFtrTWF4SGVhZGVyc1NpemVdXG4gICAgdGhpcy5zaG91bGRLZWVwQWxpdmUgPSBmYWxzZVxuICAgIHRoaXMucGF1c2VkID0gZmFsc2VcbiAgICB0aGlzLnJlc3VtZSA9IHRoaXMucmVzdW1lLmJpbmQodGhpcylcblxuICAgIHRoaXMuYnl0ZXNSZWFkID0gMFxuXG4gICAgdGhpcy5rZWVwQWxpdmUgPSAnJ1xuICAgIHRoaXMuY29udGVudExlbmd0aCA9ICcnXG4gICAgdGhpcy5jb25uZWN0aW9uID0gJydcbiAgICB0aGlzLm1heFJlc3BvbnNlU2l6ZSA9IGNsaWVudFtrTWF4UmVzcG9uc2VTaXplXVxuICB9XG5cbiAgc2V0VGltZW91dCAodmFsdWUsIHR5cGUpIHtcbiAgICB0aGlzLnRpbWVvdXRUeXBlID0gdHlwZVxuICAgIGlmICh2YWx1ZSAhPT0gdGhpcy50aW1lb3V0VmFsdWUpIHtcbiAgICAgIHRpbWVycy5jbGVhclRpbWVvdXQodGhpcy50aW1lb3V0KVxuICAgICAgaWYgKHZhbHVlKSB7XG4gICAgICAgIHRoaXMudGltZW91dCA9IHRpbWVycy5zZXRUaW1lb3V0KG9uUGFyc2VyVGltZW91dCwgdmFsdWUsIHRoaXMpXG4gICAgICAgIC8vIGlzdGFuYnVsIGlnbm9yZSBlbHNlOiBvbmx5IGZvciBqZXN0XG4gICAgICAgIGlmICh0aGlzLnRpbWVvdXQudW5yZWYpIHtcbiAgICAgICAgICB0aGlzLnRpbWVvdXQudW5yZWYoKVxuICAgICAgICB9XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB0aGlzLnRpbWVvdXQgPSBudWxsXG4gICAgICB9XG4gICAgICB0aGlzLnRpbWVvdXRWYWx1ZSA9IHZhbHVlXG4gICAgfSBlbHNlIGlmICh0aGlzLnRpbWVvdXQpIHtcbiAgICAgIC8vIGlzdGFuYnVsIGlnbm9yZSBlbHNlOiBvbmx5IGZvciBqZXN0XG4gICAgICBpZiAodGhpcy50aW1lb3V0LnJlZnJlc2gpIHtcbiAgICAgICAgdGhpcy50aW1lb3V0LnJlZnJlc2goKVxuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIHJlc3VtZSAoKSB7XG4gICAgaWYgKHRoaXMuc29ja2V0LmRlc3Ryb3llZCB8fCAhdGhpcy5wYXVzZWQpIHtcbiAgICAgIHJldHVyblxuICAgIH1cblxuICAgIGFzc2VydCh0aGlzLnB0ciAhPSBudWxsKVxuICAgIGFzc2VydChjdXJyZW50UGFyc2VyID09IG51bGwpXG5cbiAgICB0aGlzLmxsaHR0cC5sbGh0dHBfcmVzdW1lKHRoaXMucHRyKVxuXG4gICAgYXNzZXJ0KHRoaXMudGltZW91dFR5cGUgPT09IFRJTUVPVVRfQk9EWSlcbiAgICBpZiAodGhpcy50aW1lb3V0KSB7XG4gICAgICAvLyBpc3RhbmJ1bCBpZ25vcmUgZWxzZTogb25seSBmb3IgamVzdFxuICAgICAgaWYgKHRoaXMudGltZW91dC5yZWZyZXNoKSB7XG4gICAgICAgIHRoaXMudGltZW91dC5yZWZyZXNoKClcbiAgICAgIH1cbiAgICB9XG5cbiAgICB0aGlzLnBhdXNlZCA9IGZhbHNlXG4gICAgdGhpcy5leGVjdXRlKHRoaXMuc29ja2V0LnJlYWQoKSB8fCBFTVBUWV9CVUYpIC8vIEZsdXNoIHBhcnNlci5cbiAgICB0aGlzLnJlYWRNb3JlKClcbiAgfVxuXG4gIHJlYWRNb3JlICgpIHtcbiAgICB3aGlsZSAoIXRoaXMucGF1c2VkICYmIHRoaXMucHRyKSB7XG4gICAgICBjb25zdCBjaHVuayA9IHRoaXMuc29ja2V0LnJlYWQoKVxuICAgICAgaWYgKGNodW5rID09PSBudWxsKSB7XG4gICAgICAgIGJyZWFrXG4gICAgICB9XG4gICAgICB0aGlzLmV4ZWN1dGUoY2h1bmspXG4gICAgfVxuICB9XG5cbiAgZXhlY3V0ZSAoZGF0YSkge1xuICAgIGFzc2VydCh0aGlzLnB0ciAhPSBudWxsKVxuICAgIGFzc2VydChjdXJyZW50UGFyc2VyID09IG51bGwpXG4gICAgYXNzZXJ0KCF0aGlzLnBhdXNlZClcblxuICAgIGNvbnN0IHsgc29ja2V0LCBsbGh0dHAgfSA9IHRoaXNcblxuICAgIGlmIChkYXRhLmxlbmd0aCA+IGN1cnJlbnRCdWZmZXJTaXplKSB7XG4gICAgICBpZiAoY3VycmVudEJ1ZmZlclB0cikge1xuICAgICAgICBsbGh0dHAuZnJlZShjdXJyZW50QnVmZmVyUHRyKVxuICAgICAgfVxuICAgICAgY3VycmVudEJ1ZmZlclNpemUgPSBNYXRoLmNlaWwoZGF0YS5sZW5ndGggLyA0MDk2KSAqIDQwOTZcbiAgICAgIGN1cnJlbnRCdWZmZXJQdHIgPSBsbGh0dHAubWFsbG9jKGN1cnJlbnRCdWZmZXJTaXplKVxuICAgIH1cblxuICAgIG5ldyBVaW50OEFycmF5KGxsaHR0cC5tZW1vcnkuYnVmZmVyLCBjdXJyZW50QnVmZmVyUHRyLCBjdXJyZW50QnVmZmVyU2l6ZSkuc2V0KGRhdGEpXG5cbiAgICAvLyBDYWxsIGBleGVjdXRlYCBvbiB0aGUgd2FzbSBwYXJzZXIuXG4gICAgLy8gV2UgcGFzcyB0aGUgYGxsaHR0cF9wYXJzZXJgIHBvaW50ZXIgYWRkcmVzcywgdGhlIHBvaW50ZXIgYWRkcmVzcyBvZiBidWZmZXIgdmlldyBkYXRhLFxuICAgIC8vIGFuZCBmaW5hbGx5IHRoZSBsZW5ndGggb2YgYnl0ZXMgdG8gcGFyc2UuXG4gICAgLy8gVGhlIHJldHVybiB2YWx1ZSBpcyBhbiBlcnJvciBjb2RlIG9yIGBjb25zdGFudHMuRVJST1IuT0tgLlxuICAgIHRyeSB7XG4gICAgICBsZXQgcmV0XG5cbiAgICAgIHRyeSB7XG4gICAgICAgIGN1cnJlbnRCdWZmZXJSZWYgPSBkYXRhXG4gICAgICAgIGN1cnJlbnRQYXJzZXIgPSB0aGlzXG4gICAgICAgIHJldCA9IGxsaHR0cC5sbGh0dHBfZXhlY3V0ZSh0aGlzLnB0ciwgY3VycmVudEJ1ZmZlclB0ciwgZGF0YS5sZW5ndGgpXG4gICAgICAgIC8qIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby11c2VsZXNzLWNhdGNoICovXG4gICAgICB9IGNhdGNoIChlcnIpIHtcbiAgICAgICAgLyogaXN0YW5idWwgaWdub3JlIG5leHQ6IGRpZmZpY3VsdCB0byBtYWtlIGEgdGVzdCBjYXNlIGZvciAqL1xuICAgICAgICB0aHJvdyBlcnJcbiAgICAgIH0gZmluYWxseSB7XG4gICAgICAgIGN1cnJlbnRQYXJzZXIgPSBudWxsXG4gICAgICAgIGN1cnJlbnRCdWZmZXJSZWYgPSBudWxsXG4gICAgICB9XG5cbiAgICAgIGNvbnN0IG9mZnNldCA9IGxsaHR0cC5sbGh0dHBfZ2V0X2Vycm9yX3Bvcyh0aGlzLnB0cikgLSBjdXJyZW50QnVmZmVyUHRyXG5cbiAgICAgIGlmIChyZXQgPT09IGNvbnN0YW50cy5FUlJPUi5QQVVTRURfVVBHUkFERSkge1xuICAgICAgICB0aGlzLm9uVXBncmFkZShkYXRhLnNsaWNlKG9mZnNldCkpXG4gICAgICB9IGVsc2UgaWYgKHJldCA9PT0gY29uc3RhbnRzLkVSUk9SLlBBVVNFRCkge1xuICAgICAgICB0aGlzLnBhdXNlZCA9IHRydWVcbiAgICAgICAgc29ja2V0LnVuc2hpZnQoZGF0YS5zbGljZShvZmZzZXQpKVxuICAgICAgfSBlbHNlIGlmIChyZXQgIT09IGNvbnN0YW50cy5FUlJPUi5PSykge1xuICAgICAgICBjb25zdCBwdHIgPSBsbGh0dHAubGxodHRwX2dldF9lcnJvcl9yZWFzb24odGhpcy5wdHIpXG4gICAgICAgIGxldCBtZXNzYWdlID0gJydcbiAgICAgICAgLyogaXN0YW5idWwgaWdub3JlIGVsc2U6IGRpZmZpY3VsdCB0byBtYWtlIGEgdGVzdCBjYXNlIGZvciAqL1xuICAgICAgICBpZiAocHRyKSB7XG4gICAgICAgICAgY29uc3QgbGVuID0gbmV3IFVpbnQ4QXJyYXkobGxodHRwLm1lbW9yeS5idWZmZXIsIHB0cikuaW5kZXhPZigwKVxuICAgICAgICAgIG1lc3NhZ2UgPVxuICAgICAgICAgICAgJ1Jlc3BvbnNlIGRvZXMgbm90IG1hdGNoIHRoZSBIVFRQLzEuMSBwcm90b2NvbCAoJyArXG4gICAgICAgICAgICBCdWZmZXIuZnJvbShsbGh0dHAubWVtb3J5LmJ1ZmZlciwgcHRyLCBsZW4pLnRvU3RyaW5nKCkgK1xuICAgICAgICAgICAgJyknXG4gICAgICAgIH1cbiAgICAgICAgdGhyb3cgbmV3IEhUVFBQYXJzZXJFcnJvcihtZXNzYWdlLCBjb25zdGFudHMuRVJST1JbcmV0XSwgZGF0YS5zbGljZShvZmZzZXQpKVxuICAgICAgfVxuICAgIH0gY2F0Y2ggKGVycikge1xuICAgICAgdXRpbC5kZXN0cm95KHNvY2tldCwgZXJyKVxuICAgIH1cbiAgfVxuXG4gIGRlc3Ryb3kgKCkge1xuICAgIGFzc2VydCh0aGlzLnB0ciAhPSBudWxsKVxuICAgIGFzc2VydChjdXJyZW50UGFyc2VyID09IG51bGwpXG5cbiAgICB0aGlzLmxsaHR0cC5sbGh0dHBfZnJlZSh0aGlzLnB0cilcbiAgICB0aGlzLnB0ciA9IG51bGxcblxuICAgIHRpbWVycy5jbGVhclRpbWVvdXQodGhpcy50aW1lb3V0KVxuICAgIHRoaXMudGltZW91dCA9IG51bGxcbiAgICB0aGlzLnRpbWVvdXRWYWx1ZSA9IG51bGxcbiAgICB0aGlzLnRpbWVvdXRUeXBlID0gbnVsbFxuXG4gICAgdGhpcy5wYXVzZWQgPSBmYWxzZVxuICB9XG5cbiAgb25TdGF0dXMgKGJ1Zikge1xuICAgIHRoaXMuc3RhdHVzVGV4dCA9IGJ1Zi50b1N0cmluZygpXG4gIH1cblxuICBvbk1lc3NhZ2VCZWdpbiAoKSB7XG4gICAgY29uc3QgeyBzb2NrZXQsIGNsaWVudCB9ID0gdGhpc1xuXG4gICAgLyogaXN0YW5idWwgaWdub3JlIG5leHQ6IGRpZmZpY3VsdCB0byBtYWtlIGEgdGVzdCBjYXNlIGZvciAqL1xuICAgIGlmIChzb2NrZXQuZGVzdHJveWVkKSB7XG4gICAgICByZXR1cm4gLTFcbiAgICB9XG5cbiAgICBjb25zdCByZXF1ZXN0ID0gY2xpZW50W2tRdWV1ZV1bY2xpZW50W2tSdW5uaW5nSWR4XV1cbiAgICBpZiAoIXJlcXVlc3QpIHtcbiAgICAgIHJldHVybiAtMVxuICAgIH1cbiAgfVxuXG4gIG9uSGVhZGVyRmllbGQgKGJ1Zikge1xuICAgIGNvbnN0IGxlbiA9IHRoaXMuaGVhZGVycy5sZW5ndGhcblxuICAgIGlmICgobGVuICYgMSkgPT09IDApIHtcbiAgICAgIHRoaXMuaGVhZGVycy5wdXNoKGJ1ZilcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5oZWFkZXJzW2xlbiAtIDFdID0gQnVmZmVyLmNvbmNhdChbdGhpcy5oZWFkZXJzW2xlbiAtIDFdLCBidWZdKVxuICAgIH1cblxuICAgIHRoaXMudHJhY2tIZWFkZXIoYnVmLmxlbmd0aClcbiAgfVxuXG4gIG9uSGVhZGVyVmFsdWUgKGJ1Zikge1xuICAgIGxldCBsZW4gPSB0aGlzLmhlYWRlcnMubGVuZ3RoXG5cbiAgICBpZiAoKGxlbiAmIDEpID09PSAxKSB7XG4gICAgICB0aGlzLmhlYWRlcnMucHVzaChidWYpXG4gICAgICBsZW4gKz0gMVxuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLmhlYWRlcnNbbGVuIC0gMV0gPSBCdWZmZXIuY29uY2F0KFt0aGlzLmhlYWRlcnNbbGVuIC0gMV0sIGJ1Zl0pXG4gICAgfVxuXG4gICAgY29uc3Qga2V5ID0gdGhpcy5oZWFkZXJzW2xlbiAtIDJdXG4gICAgaWYgKGtleS5sZW5ndGggPT09IDEwICYmIGtleS50b1N0cmluZygpLnRvTG93ZXJDYXNlKCkgPT09ICdrZWVwLWFsaXZlJykge1xuICAgICAgdGhpcy5rZWVwQWxpdmUgKz0gYnVmLnRvU3RyaW5nKClcbiAgICB9IGVsc2UgaWYgKGtleS5sZW5ndGggPT09IDEwICYmIGtleS50b1N0cmluZygpLnRvTG93ZXJDYXNlKCkgPT09ICdjb25uZWN0aW9uJykge1xuICAgICAgdGhpcy5jb25uZWN0aW9uICs9IGJ1Zi50b1N0cmluZygpXG4gICAgfSBlbHNlIGlmIChrZXkubGVuZ3RoID09PSAxNCAmJiBrZXkudG9TdHJpbmcoKS50b0xvd2VyQ2FzZSgpID09PSAnY29udGVudC1sZW5ndGgnKSB7XG4gICAgICB0aGlzLmNvbnRlbnRMZW5ndGggKz0gYnVmLnRvU3RyaW5nKClcbiAgICB9XG5cbiAgICB0aGlzLnRyYWNrSGVhZGVyKGJ1Zi5sZW5ndGgpXG4gIH1cblxuICB0cmFja0hlYWRlciAobGVuKSB7XG4gICAgdGhpcy5oZWFkZXJzU2l6ZSArPSBsZW5cbiAgICBpZiAodGhpcy5oZWFkZXJzU2l6ZSA+PSB0aGlzLmhlYWRlcnNNYXhTaXplKSB7XG4gICAgICB1dGlsLmRlc3Ryb3kodGhpcy5zb2NrZXQsIG5ldyBIZWFkZXJzT3ZlcmZsb3dFcnJvcigpKVxuICAgIH1cbiAgfVxuXG4gIG9uVXBncmFkZSAoaGVhZCkge1xuICAgIGNvbnN0IHsgdXBncmFkZSwgY2xpZW50LCBzb2NrZXQsIGhlYWRlcnMsIHN0YXR1c0NvZGUgfSA9IHRoaXNcblxuICAgIGFzc2VydCh1cGdyYWRlKVxuXG4gICAgY29uc3QgcmVxdWVzdCA9IGNsaWVudFtrUXVldWVdW2NsaWVudFtrUnVubmluZ0lkeF1dXG4gICAgYXNzZXJ0KHJlcXVlc3QpXG5cbiAgICBhc3NlcnQoIXNvY2tldC5kZXN0cm95ZWQpXG4gICAgYXNzZXJ0KHNvY2tldCA9PT0gY2xpZW50W2tTb2NrZXRdKVxuICAgIGFzc2VydCghdGhpcy5wYXVzZWQpXG4gICAgYXNzZXJ0KHJlcXVlc3QudXBncmFkZSB8fCByZXF1ZXN0Lm1ldGhvZCA9PT0gJ0NPTk5FQ1QnKVxuXG4gICAgdGhpcy5zdGF0dXNDb2RlID0gbnVsbFxuICAgIHRoaXMuc3RhdHVzVGV4dCA9ICcnXG4gICAgdGhpcy5zaG91bGRLZWVwQWxpdmUgPSBudWxsXG5cbiAgICBhc3NlcnQodGhpcy5oZWFkZXJzLmxlbmd0aCAlIDIgPT09IDApXG4gICAgdGhpcy5oZWFkZXJzID0gW11cbiAgICB0aGlzLmhlYWRlcnNTaXplID0gMFxuXG4gICAgc29ja2V0LnVuc2hpZnQoaGVhZClcblxuICAgIHNvY2tldFtrUGFyc2VyXS5kZXN0cm95KClcbiAgICBzb2NrZXRba1BhcnNlcl0gPSBudWxsXG5cbiAgICBzb2NrZXRba0NsaWVudF0gPSBudWxsXG4gICAgc29ja2V0W2tFcnJvcl0gPSBudWxsXG4gICAgc29ja2V0XG4gICAgICAucmVtb3ZlTGlzdGVuZXIoJ2Vycm9yJywgb25Tb2NrZXRFcnJvcilcbiAgICAgIC5yZW1vdmVMaXN0ZW5lcigncmVhZGFibGUnLCBvblNvY2tldFJlYWRhYmxlKVxuICAgICAgLnJlbW92ZUxpc3RlbmVyKCdlbmQnLCBvblNvY2tldEVuZClcbiAgICAgIC5yZW1vdmVMaXN0ZW5lcignY2xvc2UnLCBvblNvY2tldENsb3NlKVxuXG4gICAgY2xpZW50W2tTb2NrZXRdID0gbnVsbFxuICAgIGNsaWVudFtrUXVldWVdW2NsaWVudFtrUnVubmluZ0lkeF0rK10gPSBudWxsXG4gICAgY2xpZW50LmVtaXQoJ2Rpc2Nvbm5lY3QnLCBjbGllbnRba1VybF0sIFtjbGllbnRdLCBuZXcgSW5mb3JtYXRpb25hbEVycm9yKCd1cGdyYWRlJykpXG5cbiAgICB0cnkge1xuICAgICAgcmVxdWVzdC5vblVwZ3JhZGUoc3RhdHVzQ29kZSwgaGVhZGVycywgc29ja2V0KVxuICAgIH0gY2F0Y2ggKGVycikge1xuICAgICAgdXRpbC5kZXN0cm95KHNvY2tldCwgZXJyKVxuICAgIH1cblxuICAgIHJlc3VtZShjbGllbnQpXG4gIH1cblxuICBvbkhlYWRlcnNDb21wbGV0ZSAoc3RhdHVzQ29kZSwgdXBncmFkZSwgc2hvdWxkS2VlcEFsaXZlKSB7XG4gICAgY29uc3QgeyBjbGllbnQsIHNvY2tldCwgaGVhZGVycywgc3RhdHVzVGV4dCB9ID0gdGhpc1xuXG4gICAgLyogaXN0YW5idWwgaWdub3JlIG5leHQ6IGRpZmZpY3VsdCB0byBtYWtlIGEgdGVzdCBjYXNlIGZvciAqL1xuICAgIGlmIChzb2NrZXQuZGVzdHJveWVkKSB7XG4gICAgICByZXR1cm4gLTFcbiAgICB9XG5cbiAgICBjb25zdCByZXF1ZXN0ID0gY2xpZW50W2tRdWV1ZV1bY2xpZW50W2tSdW5uaW5nSWR4XV1cblxuICAgIC8qIGlzdGFuYnVsIGlnbm9yZSBuZXh0OiBkaWZmaWN1bHQgdG8gbWFrZSBhIHRlc3QgY2FzZSBmb3IgKi9cbiAgICBpZiAoIXJlcXVlc3QpIHtcbiAgICAgIHJldHVybiAtMVxuICAgIH1cblxuICAgIGFzc2VydCghdGhpcy51cGdyYWRlKVxuICAgIGFzc2VydCh0aGlzLnN0YXR1c0NvZGUgPCAyMDApXG5cbiAgICBpZiAoc3RhdHVzQ29kZSA9PT0gMTAwKSB7XG4gICAgICB1dGlsLmRlc3Ryb3koc29ja2V0LCBuZXcgU29ja2V0RXJyb3IoJ2JhZCByZXNwb25zZScsIHV0aWwuZ2V0U29ja2V0SW5mbyhzb2NrZXQpKSlcbiAgICAgIHJldHVybiAtMVxuICAgIH1cblxuICAgIC8qIHRoaXMgY2FuIG9ubHkgaGFwcGVuIGlmIHNlcnZlciBpcyBtaXNiZWhhdmluZyAqL1xuICAgIGlmICh1cGdyYWRlICYmICFyZXF1ZXN0LnVwZ3JhZGUpIHtcbiAgICAgIHV0aWwuZGVzdHJveShzb2NrZXQsIG5ldyBTb2NrZXRFcnJvcignYmFkIHVwZ3JhZGUnLCB1dGlsLmdldFNvY2tldEluZm8oc29ja2V0KSkpXG4gICAgICByZXR1cm4gLTFcbiAgICB9XG5cbiAgICBhc3NlcnQuc3RyaWN0RXF1YWwodGhpcy50aW1lb3V0VHlwZSwgVElNRU9VVF9IRUFERVJTKVxuXG4gICAgdGhpcy5zdGF0dXNDb2RlID0gc3RhdHVzQ29kZVxuICAgIHRoaXMuc2hvdWxkS2VlcEFsaXZlID0gKFxuICAgICAgc2hvdWxkS2VlcEFsaXZlIHx8XG4gICAgICAvLyBPdmVycmlkZSBsbGh0dHAgdmFsdWUgd2hpY2ggZG9lcyBub3QgYWxsb3cga2VlcEFsaXZlIGZvciBIRUFELlxuICAgICAgKHJlcXVlc3QubWV0aG9kID09PSAnSEVBRCcgJiYgIXNvY2tldFtrUmVzZXRdICYmIHRoaXMuY29ubmVjdGlvbi50b0xvd2VyQ2FzZSgpID09PSAna2VlcC1hbGl2ZScpXG4gICAgKVxuXG4gICAgaWYgKHRoaXMuc3RhdHVzQ29kZSA+PSAyMDApIHtcbiAgICAgIGNvbnN0IGJvZHlUaW1lb3V0ID0gcmVxdWVzdC5ib2R5VGltZW91dCAhPSBudWxsXG4gICAgICAgID8gcmVxdWVzdC5ib2R5VGltZW91dFxuICAgICAgICA6IGNsaWVudFtrQm9keVRpbWVvdXRdXG4gICAgICB0aGlzLnNldFRpbWVvdXQoYm9keVRpbWVvdXQsIFRJTUVPVVRfQk9EWSlcbiAgICB9IGVsc2UgaWYgKHRoaXMudGltZW91dCkge1xuICAgICAgLy8gaXN0YW5idWwgaWdub3JlIGVsc2U6IG9ubHkgZm9yIGplc3RcbiAgICAgIGlmICh0aGlzLnRpbWVvdXQucmVmcmVzaCkge1xuICAgICAgICB0aGlzLnRpbWVvdXQucmVmcmVzaCgpXG4gICAgICB9XG4gICAgfVxuXG4gICAgaWYgKHJlcXVlc3QubWV0aG9kID09PSAnQ09OTkVDVCcpIHtcbiAgICAgIGFzc2VydChjbGllbnRba1J1bm5pbmddID09PSAxKVxuICAgICAgdGhpcy51cGdyYWRlID0gdHJ1ZVxuICAgICAgcmV0dXJuIDJcbiAgICB9XG5cbiAgICBpZiAodXBncmFkZSkge1xuICAgICAgYXNzZXJ0KGNsaWVudFtrUnVubmluZ10gPT09IDEpXG4gICAgICB0aGlzLnVwZ3JhZGUgPSB0cnVlXG4gICAgICByZXR1cm4gMlxuICAgIH1cblxuICAgIGFzc2VydCh0aGlzLmhlYWRlcnMubGVuZ3RoICUgMiA9PT0gMClcbiAgICB0aGlzLmhlYWRlcnMgPSBbXVxuICAgIHRoaXMuaGVhZGVyc1NpemUgPSAwXG5cbiAgICBpZiAodGhpcy5zaG91bGRLZWVwQWxpdmUgJiYgY2xpZW50W2tQaXBlbGluaW5nXSkge1xuICAgICAgY29uc3Qga2VlcEFsaXZlVGltZW91dCA9IHRoaXMua2VlcEFsaXZlID8gdXRpbC5wYXJzZUtlZXBBbGl2ZVRpbWVvdXQodGhpcy5rZWVwQWxpdmUpIDogbnVsbFxuXG4gICAgICBpZiAoa2VlcEFsaXZlVGltZW91dCAhPSBudWxsKSB7XG4gICAgICAgIGNvbnN0IHRpbWVvdXQgPSBNYXRoLm1pbihcbiAgICAgICAgICBrZWVwQWxpdmVUaW1lb3V0IC0gY2xpZW50W2tLZWVwQWxpdmVUaW1lb3V0VGhyZXNob2xkXSxcbiAgICAgICAgICBjbGllbnRba0tlZXBBbGl2ZU1heFRpbWVvdXRdXG4gICAgICAgIClcbiAgICAgICAgaWYgKHRpbWVvdXQgPD0gMCkge1xuICAgICAgICAgIHNvY2tldFtrUmVzZXRdID0gdHJ1ZVxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIGNsaWVudFtrS2VlcEFsaXZlVGltZW91dFZhbHVlXSA9IHRpbWVvdXRcbiAgICAgICAgfVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgY2xpZW50W2tLZWVwQWxpdmVUaW1lb3V0VmFsdWVdID0gY2xpZW50W2tLZWVwQWxpdmVEZWZhdWx0VGltZW91dF1cbiAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAgLy8gU3RvcCBtb3JlIHJlcXVlc3RzIGZyb20gYmVpbmcgZGlzcGF0Y2hlZC5cbiAgICAgIHNvY2tldFtrUmVzZXRdID0gdHJ1ZVxuICAgIH1cblxuICAgIGNvbnN0IHBhdXNlID0gcmVxdWVzdC5vbkhlYWRlcnMoc3RhdHVzQ29kZSwgaGVhZGVycywgdGhpcy5yZXN1bWUsIHN0YXR1c1RleHQpID09PSBmYWxzZVxuXG4gICAgaWYgKHJlcXVlc3QuYWJvcnRlZCkge1xuICAgICAgcmV0dXJuIC0xXG4gICAgfVxuXG4gICAgaWYgKHJlcXVlc3QubWV0aG9kID09PSAnSEVBRCcpIHtcbiAgICAgIHJldHVybiAxXG4gICAgfVxuXG4gICAgaWYgKHN0YXR1c0NvZGUgPCAyMDApIHtcbiAgICAgIHJldHVybiAxXG4gICAgfVxuXG4gICAgaWYgKHNvY2tldFtrQmxvY2tpbmddKSB7XG4gICAgICBzb2NrZXRba0Jsb2NraW5nXSA9IGZhbHNlXG4gICAgICByZXN1bWUoY2xpZW50KVxuICAgIH1cblxuICAgIHJldHVybiBwYXVzZSA/IGNvbnN0YW50cy5FUlJPUi5QQVVTRUQgOiAwXG4gIH1cblxuICBvbkJvZHkgKGJ1Zikge1xuICAgIGNvbnN0IHsgY2xpZW50LCBzb2NrZXQsIHN0YXR1c0NvZGUsIG1heFJlc3BvbnNlU2l6ZSB9ID0gdGhpc1xuXG4gICAgaWYgKHNvY2tldC5kZXN0cm95ZWQpIHtcbiAgICAgIHJldHVybiAtMVxuICAgIH1cblxuICAgIGNvbnN0IHJlcXVlc3QgPSBjbGllbnRba1F1ZXVlXVtjbGllbnRba1J1bm5pbmdJZHhdXVxuICAgIGFzc2VydChyZXF1ZXN0KVxuXG4gICAgYXNzZXJ0LnN0cmljdEVxdWFsKHRoaXMudGltZW91dFR5cGUsIFRJTUVPVVRfQk9EWSlcbiAgICBpZiAodGhpcy50aW1lb3V0KSB7XG4gICAgICAvLyBpc3RhbmJ1bCBpZ25vcmUgZWxzZTogb25seSBmb3IgamVzdFxuICAgICAgaWYgKHRoaXMudGltZW91dC5yZWZyZXNoKSB7XG4gICAgICAgIHRoaXMudGltZW91dC5yZWZyZXNoKClcbiAgICAgIH1cbiAgICB9XG5cbiAgICBhc3NlcnQoc3RhdHVzQ29kZSA+PSAyMDApXG5cbiAgICBpZiAobWF4UmVzcG9uc2VTaXplID4gLTEgJiYgdGhpcy5ieXRlc1JlYWQgKyBidWYubGVuZ3RoID4gbWF4UmVzcG9uc2VTaXplKSB7XG4gICAgICB1dGlsLmRlc3Ryb3koc29ja2V0LCBuZXcgUmVzcG9uc2VFeGNlZWRlZE1heFNpemVFcnJvcigpKVxuICAgICAgcmV0dXJuIC0xXG4gICAgfVxuXG4gICAgdGhpcy5ieXRlc1JlYWQgKz0gYnVmLmxlbmd0aFxuXG4gICAgaWYgKHJlcXVlc3Qub25EYXRhKGJ1ZikgPT09IGZhbHNlKSB7XG4gICAgICByZXR1cm4gY29uc3RhbnRzLkVSUk9SLlBBVVNFRFxuICAgIH1cbiAgfVxuXG4gIG9uTWVzc2FnZUNvbXBsZXRlICgpIHtcbiAgICBjb25zdCB7IGNsaWVudCwgc29ja2V0LCBzdGF0dXNDb2RlLCB1cGdyYWRlLCBoZWFkZXJzLCBjb250ZW50TGVuZ3RoLCBieXRlc1JlYWQsIHNob3VsZEtlZXBBbGl2ZSB9ID0gdGhpc1xuXG4gICAgaWYgKHNvY2tldC5kZXN0cm95ZWQgJiYgKCFzdGF0dXNDb2RlIHx8IHNob3VsZEtlZXBBbGl2ZSkpIHtcbiAgICAgIHJldHVybiAtMVxuICAgIH1cblxuICAgIGlmICh1cGdyYWRlKSB7XG4gICAgICByZXR1cm5cbiAgICB9XG5cbiAgICBjb25zdCByZXF1ZXN0ID0gY2xpZW50W2tRdWV1ZV1bY2xpZW50W2tSdW5uaW5nSWR4XV1cbiAgICBhc3NlcnQocmVxdWVzdClcblxuICAgIGFzc2VydChzdGF0dXNDb2RlID49IDEwMClcblxuICAgIHRoaXMuc3RhdHVzQ29kZSA9IG51bGxcbiAgICB0aGlzLnN0YXR1c1RleHQgPSAnJ1xuICAgIHRoaXMuYnl0ZXNSZWFkID0gMFxuICAgIHRoaXMuY29udGVudExlbmd0aCA9ICcnXG4gICAgdGhpcy5rZWVwQWxpdmUgPSAnJ1xuICAgIHRoaXMuY29ubmVjdGlvbiA9ICcnXG5cbiAgICBhc3NlcnQodGhpcy5oZWFkZXJzLmxlbmd0aCAlIDIgPT09IDApXG4gICAgdGhpcy5oZWFkZXJzID0gW11cbiAgICB0aGlzLmhlYWRlcnNTaXplID0gMFxuXG4gICAgaWYgKHN0YXR1c0NvZGUgPCAyMDApIHtcbiAgICAgIHJldHVyblxuICAgIH1cblxuICAgIC8qIGlzdGFuYnVsIGlnbm9yZSBuZXh0OiBzaG91bGQgYmUgaGFuZGxlZCBieSBsbGh0dHA/ICovXG4gICAgaWYgKHJlcXVlc3QubWV0aG9kICE9PSAnSEVBRCcgJiYgY29udGVudExlbmd0aCAmJiBieXRlc1JlYWQgIT09IHBhcnNlSW50KGNvbnRlbnRMZW5ndGgsIDEwKSkge1xuICAgICAgdXRpbC5kZXN0cm95KHNvY2tldCwgbmV3IFJlc3BvbnNlQ29udGVudExlbmd0aE1pc21hdGNoRXJyb3IoKSlcbiAgICAgIHJldHVybiAtMVxuICAgIH1cblxuICAgIHJlcXVlc3Qub25Db21wbGV0ZShoZWFkZXJzKVxuXG4gICAgY2xpZW50W2tRdWV1ZV1bY2xpZW50W2tSdW5uaW5nSWR4XSsrXSA9IG51bGxcblxuICAgIGlmIChzb2NrZXRba1dyaXRpbmddKSB7XG4gICAgICBhc3NlcnQuc3RyaWN0RXF1YWwoY2xpZW50W2tSdW5uaW5nXSwgMClcbiAgICAgIC8vIFJlc3BvbnNlIGNvbXBsZXRlZCBiZWZvcmUgcmVxdWVzdC5cbiAgICAgIHV0aWwuZGVzdHJveShzb2NrZXQsIG5ldyBJbmZvcm1hdGlvbmFsRXJyb3IoJ3Jlc2V0JykpXG4gICAgICByZXR1cm4gY29uc3RhbnRzLkVSUk9SLlBBVVNFRFxuICAgIH0gZWxzZSBpZiAoIXNob3VsZEtlZXBBbGl2ZSkge1xuICAgICAgdXRpbC5kZXN0cm95KHNvY2tldCwgbmV3IEluZm9ybWF0aW9uYWxFcnJvcigncmVzZXQnKSlcbiAgICAgIHJldHVybiBjb25zdGFudHMuRVJST1IuUEFVU0VEXG4gICAgfSBlbHNlIGlmIChzb2NrZXRba1Jlc2V0XSAmJiBjbGllbnRba1J1bm5pbmddID09PSAwKSB7XG4gICAgICAvLyBEZXN0cm95IHNvY2tldCBvbmNlIGFsbCByZXF1ZXN0cyBoYXZlIGNvbXBsZXRlZC5cbiAgICAgIC8vIFRoZSByZXF1ZXN0IGF0IHRoZSB0YWlsIG9mIHRoZSBwaXBlbGluZSBpcyB0aGUgb25lXG4gICAgICAvLyB0aGF0IHJlcXVlc3RlZCByZXNldCBhbmQgbm8gZnVydGhlciByZXF1ZXN0cyBzaG91bGRcbiAgICAgIC8vIGhhdmUgYmVlbiBxdWV1ZWQgc2luY2UgdGhlbi5cbiAgICAgIHV0aWwuZGVzdHJveShzb2NrZXQsIG5ldyBJbmZvcm1hdGlvbmFsRXJyb3IoJ3Jlc2V0JykpXG4gICAgICByZXR1cm4gY29uc3RhbnRzLkVSUk9SLlBBVVNFRFxuICAgIH0gZWxzZSBpZiAoY2xpZW50W2tQaXBlbGluaW5nXSA9PT0gMSkge1xuICAgICAgLy8gV2UgbXVzdCB3YWl0IGEgZnVsbCBldmVudCBsb29wIGN5Y2xlIHRvIHJldXNlIHRoaXMgc29ja2V0IHRvIG1ha2Ugc3VyZVxuICAgICAgLy8gdGhhdCBub24tc3BlYyBjb21wbGlhbnQgc2VydmVycyBhcmUgbm90IGNsb3NpbmcgdGhlIGNvbm5lY3Rpb24gZXZlbiBpZiB0aGV5XG4gICAgICAvLyBzYWlkIHRoZXkgd29uJ3QuXG4gICAgICBzZXRJbW1lZGlhdGUocmVzdW1lLCBjbGllbnQpXG4gICAgfSBlbHNlIHtcbiAgICAgIHJlc3VtZShjbGllbnQpXG4gICAgfVxuICB9XG59XG5cbmZ1bmN0aW9uIG9uUGFyc2VyVGltZW91dCAocGFyc2VyKSB7XG4gIGNvbnN0IHsgc29ja2V0LCB0aW1lb3V0VHlwZSwgY2xpZW50IH0gPSBwYXJzZXJcblxuICAvKiBpc3RhbmJ1bCBpZ25vcmUgZWxzZSAqL1xuICBpZiAodGltZW91dFR5cGUgPT09IFRJTUVPVVRfSEVBREVSUykge1xuICAgIGlmICghc29ja2V0W2tXcml0aW5nXSB8fCBzb2NrZXQud3JpdGFibGVOZWVkRHJhaW4gfHwgY2xpZW50W2tSdW5uaW5nXSA+IDEpIHtcbiAgICAgIGFzc2VydCghcGFyc2VyLnBhdXNlZCwgJ2Nhbm5vdCBiZSBwYXVzZWQgd2hpbGUgd2FpdGluZyBmb3IgaGVhZGVycycpXG4gICAgICB1dGlsLmRlc3Ryb3koc29ja2V0LCBuZXcgSGVhZGVyc1RpbWVvdXRFcnJvcigpKVxuICAgIH1cbiAgfSBlbHNlIGlmICh0aW1lb3V0VHlwZSA9PT0gVElNRU9VVF9CT0RZKSB7XG4gICAgaWYgKCFwYXJzZXIucGF1c2VkKSB7XG4gICAgICB1dGlsLmRlc3Ryb3koc29ja2V0LCBuZXcgQm9keVRpbWVvdXRFcnJvcigpKVxuICAgIH1cbiAgfSBlbHNlIGlmICh0aW1lb3V0VHlwZSA9PT0gVElNRU9VVF9JRExFKSB7XG4gICAgYXNzZXJ0KGNsaWVudFtrUnVubmluZ10gPT09IDAgJiYgY2xpZW50W2tLZWVwQWxpdmVUaW1lb3V0VmFsdWVdKVxuICAgIHV0aWwuZGVzdHJveShzb2NrZXQsIG5ldyBJbmZvcm1hdGlvbmFsRXJyb3IoJ3NvY2tldCBpZGxlIHRpbWVvdXQnKSlcbiAgfVxufVxuXG5mdW5jdGlvbiBvblNvY2tldFJlYWRhYmxlICgpIHtcbiAgY29uc3QgeyBba1BhcnNlcl06IHBhcnNlciB9ID0gdGhpc1xuICBpZiAocGFyc2VyKSB7XG4gICAgcGFyc2VyLnJlYWRNb3JlKClcbiAgfVxufVxuXG5mdW5jdGlvbiBvblNvY2tldEVycm9yIChlcnIpIHtcbiAgY29uc3QgeyBba0NsaWVudF06IGNsaWVudCwgW2tQYXJzZXJdOiBwYXJzZXIgfSA9IHRoaXNcblxuICBhc3NlcnQoZXJyLmNvZGUgIT09ICdFUlJfVExTX0NFUlRfQUxUTkFNRV9JTlZBTElEJylcblxuICBpZiAoY2xpZW50W2tIVFRQQ29ublZlcnNpb25dICE9PSAnaDInKSB7XG4gICAgLy8gT24gTWFjIE9TLCB3ZSBnZXQgYW4gRUNPTk5SRVNFVCBldmVuIGlmIHRoZXJlIGlzIGEgZnVsbCBib2R5IHRvIGJlIGZvcndhcmRlZFxuICAgIC8vIHRvIHRoZSB1c2VyLlxuICAgIGlmIChlcnIuY29kZSA9PT0gJ0VDT05OUkVTRVQnICYmIHBhcnNlci5zdGF0dXNDb2RlICYmICFwYXJzZXIuc2hvdWxkS2VlcEFsaXZlKSB7XG4gICAgICAvLyBXZSB0cmVhdCBhbGwgaW5jb21pbmcgZGF0YSBzbyBmb3IgYXMgYSB2YWxpZCByZXNwb25zZS5cbiAgICAgIHBhcnNlci5vbk1lc3NhZ2VDb21wbGV0ZSgpXG4gICAgICByZXR1cm5cbiAgICB9XG4gIH1cblxuICB0aGlzW2tFcnJvcl0gPSBlcnJcblxuICBvbkVycm9yKHRoaXNba0NsaWVudF0sIGVycilcbn1cblxuZnVuY3Rpb24gb25FcnJvciAoY2xpZW50LCBlcnIpIHtcbiAgaWYgKFxuICAgIGNsaWVudFtrUnVubmluZ10gPT09IDAgJiZcbiAgICBlcnIuY29kZSAhPT0gJ1VORF9FUlJfSU5GTycgJiZcbiAgICBlcnIuY29kZSAhPT0gJ1VORF9FUlJfU09DS0VUJ1xuICApIHtcbiAgICAvLyBFcnJvciBpcyBub3QgY2F1c2VkIGJ5IHJ1bm5pbmcgcmVxdWVzdCBhbmQgbm90IGEgcmVjb3ZlcmFibGVcbiAgICAvLyBzb2NrZXQgZXJyb3IuXG5cbiAgICBhc3NlcnQoY2xpZW50W2tQZW5kaW5nSWR4XSA9PT0gY2xpZW50W2tSdW5uaW5nSWR4XSlcblxuICAgIGNvbnN0IHJlcXVlc3RzID0gY2xpZW50W2tRdWV1ZV0uc3BsaWNlKGNsaWVudFtrUnVubmluZ0lkeF0pXG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCByZXF1ZXN0cy5sZW5ndGg7IGkrKykge1xuICAgICAgY29uc3QgcmVxdWVzdCA9IHJlcXVlc3RzW2ldXG4gICAgICBlcnJvclJlcXVlc3QoY2xpZW50LCByZXF1ZXN0LCBlcnIpXG4gICAgfVxuICAgIGFzc2VydChjbGllbnRba1NpemVdID09PSAwKVxuICB9XG59XG5cbmZ1bmN0aW9uIG9uU29ja2V0RW5kICgpIHtcbiAgY29uc3QgeyBba1BhcnNlcl06IHBhcnNlciwgW2tDbGllbnRdOiBjbGllbnQgfSA9IHRoaXNcblxuICBpZiAoY2xpZW50W2tIVFRQQ29ublZlcnNpb25dICE9PSAnaDInKSB7XG4gICAgaWYgKHBhcnNlci5zdGF0dXNDb2RlICYmICFwYXJzZXIuc2hvdWxkS2VlcEFsaXZlKSB7XG4gICAgICAvLyBXZSB0cmVhdCBhbGwgaW5jb21pbmcgZGF0YSBzbyBmYXIgYXMgYSB2YWxpZCByZXNwb25zZS5cbiAgICAgIHBhcnNlci5vbk1lc3NhZ2VDb21wbGV0ZSgpXG4gICAgICByZXR1cm5cbiAgICB9XG4gIH1cblxuICB1dGlsLmRlc3Ryb3kodGhpcywgbmV3IFNvY2tldEVycm9yKCdvdGhlciBzaWRlIGNsb3NlZCcsIHV0aWwuZ2V0U29ja2V0SW5mbyh0aGlzKSkpXG59XG5cbmZ1bmN0aW9uIG9uU29ja2V0Q2xvc2UgKCkge1xuICBjb25zdCB7IFtrQ2xpZW50XTogY2xpZW50LCBba1BhcnNlcl06IHBhcnNlciB9ID0gdGhpc1xuXG4gIGlmIChjbGllbnRba0hUVFBDb25uVmVyc2lvbl0gPT09ICdoMScgJiYgcGFyc2VyKSB7XG4gICAgaWYgKCF0aGlzW2tFcnJvcl0gJiYgcGFyc2VyLnN0YXR1c0NvZGUgJiYgIXBhcnNlci5zaG91bGRLZWVwQWxpdmUpIHtcbiAgICAgIC8vIFdlIHRyZWF0IGFsbCBpbmNvbWluZyBkYXRhIHNvIGZhciBhcyBhIHZhbGlkIHJlc3BvbnNlLlxuICAgICAgcGFyc2VyLm9uTWVzc2FnZUNvbXBsZXRlKClcbiAgICB9XG5cbiAgICB0aGlzW2tQYXJzZXJdLmRlc3Ryb3koKVxuICAgIHRoaXNba1BhcnNlcl0gPSBudWxsXG4gIH1cblxuICBjb25zdCBlcnIgPSB0aGlzW2tFcnJvcl0gfHwgbmV3IFNvY2tldEVycm9yKCdjbG9zZWQnLCB1dGlsLmdldFNvY2tldEluZm8odGhpcykpXG5cbiAgY2xpZW50W2tTb2NrZXRdID0gbnVsbFxuXG4gIGlmIChjbGllbnQuZGVzdHJveWVkKSB7XG4gICAgYXNzZXJ0KGNsaWVudFtrUGVuZGluZ10gPT09IDApXG5cbiAgICAvLyBGYWlsIGVudGlyZSBxdWV1ZS5cbiAgICBjb25zdCByZXF1ZXN0cyA9IGNsaWVudFtrUXVldWVdLnNwbGljZShjbGllbnRba1J1bm5pbmdJZHhdKVxuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgcmVxdWVzdHMubGVuZ3RoOyBpKyspIHtcbiAgICAgIGNvbnN0IHJlcXVlc3QgPSByZXF1ZXN0c1tpXVxuICAgICAgZXJyb3JSZXF1ZXN0KGNsaWVudCwgcmVxdWVzdCwgZXJyKVxuICAgIH1cbiAgfSBlbHNlIGlmIChjbGllbnRba1J1bm5pbmddID4gMCAmJiBlcnIuY29kZSAhPT0gJ1VORF9FUlJfSU5GTycpIHtcbiAgICAvLyBGYWlsIGhlYWQgb2YgcGlwZWxpbmUuXG4gICAgY29uc3QgcmVxdWVzdCA9IGNsaWVudFtrUXVldWVdW2NsaWVudFtrUnVubmluZ0lkeF1dXG4gICAgY2xpZW50W2tRdWV1ZV1bY2xpZW50W2tSdW5uaW5nSWR4XSsrXSA9IG51bGxcblxuICAgIGVycm9yUmVxdWVzdChjbGllbnQsIHJlcXVlc3QsIGVycilcbiAgfVxuXG4gIGNsaWVudFtrUGVuZGluZ0lkeF0gPSBjbGllbnRba1J1bm5pbmdJZHhdXG5cbiAgYXNzZXJ0KGNsaWVudFtrUnVubmluZ10gPT09IDApXG5cbiAgY2xpZW50LmVtaXQoJ2Rpc2Nvbm5lY3QnLCBjbGllbnRba1VybF0sIFtjbGllbnRdLCBlcnIpXG5cbiAgcmVzdW1lKGNsaWVudClcbn1cblxuYXN5bmMgZnVuY3Rpb24gY29ubmVjdCAoY2xpZW50KSB7XG4gIGFzc2VydCghY2xpZW50W2tDb25uZWN0aW5nXSlcbiAgYXNzZXJ0KCFjbGllbnRba1NvY2tldF0pXG5cbiAgbGV0IHsgaG9zdCwgaG9zdG5hbWUsIHByb3RvY29sLCBwb3J0IH0gPSBjbGllbnRba1VybF1cblxuICAvLyBSZXNvbHZlIGlwdjZcbiAgaWYgKGhvc3RuYW1lWzBdID09PSAnWycpIHtcbiAgICBjb25zdCBpZHggPSBob3N0bmFtZS5pbmRleE9mKCddJylcblxuICAgIGFzc2VydChpZHggIT09IC0xKVxuICAgIGNvbnN0IGlwID0gaG9zdG5hbWUuc3Vic3RyaW5nKDEsIGlkeClcblxuICAgIGFzc2VydChuZXQuaXNJUChpcCkpXG4gICAgaG9zdG5hbWUgPSBpcFxuICB9XG5cbiAgY2xpZW50W2tDb25uZWN0aW5nXSA9IHRydWVcblxuICBpZiAoY2hhbm5lbHMuYmVmb3JlQ29ubmVjdC5oYXNTdWJzY3JpYmVycykge1xuICAgIGNoYW5uZWxzLmJlZm9yZUNvbm5lY3QucHVibGlzaCh7XG4gICAgICBjb25uZWN0UGFyYW1zOiB7XG4gICAgICAgIGhvc3QsXG4gICAgICAgIGhvc3RuYW1lLFxuICAgICAgICBwcm90b2NvbCxcbiAgICAgICAgcG9ydCxcbiAgICAgICAgc2VydmVybmFtZTogY2xpZW50W2tTZXJ2ZXJOYW1lXSxcbiAgICAgICAgbG9jYWxBZGRyZXNzOiBjbGllbnRba0xvY2FsQWRkcmVzc11cbiAgICAgIH0sXG4gICAgICBjb25uZWN0b3I6IGNsaWVudFtrQ29ubmVjdG9yXVxuICAgIH0pXG4gIH1cblxuICB0cnkge1xuICAgIGNvbnN0IHNvY2tldCA9IGF3YWl0IG5ldyBQcm9taXNlKChyZXNvbHZlLCByZWplY3QpID0+IHtcbiAgICAgIGNsaWVudFtrQ29ubmVjdG9yXSh7XG4gICAgICAgIGhvc3QsXG4gICAgICAgIGhvc3RuYW1lLFxuICAgICAgICBwcm90b2NvbCxcbiAgICAgICAgcG9ydCxcbiAgICAgICAgc2VydmVybmFtZTogY2xpZW50W2tTZXJ2ZXJOYW1lXSxcbiAgICAgICAgbG9jYWxBZGRyZXNzOiBjbGllbnRba0xvY2FsQWRkcmVzc11cbiAgICAgIH0sIChlcnIsIHNvY2tldCkgPT4ge1xuICAgICAgICBpZiAoZXJyKSB7XG4gICAgICAgICAgcmVqZWN0KGVycilcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICByZXNvbHZlKHNvY2tldClcbiAgICAgICAgfVxuICAgICAgfSlcbiAgICB9KVxuXG4gICAgaWYgKGNsaWVudC5kZXN0cm95ZWQpIHtcbiAgICAgIHV0aWwuZGVzdHJveShzb2NrZXQub24oJ2Vycm9yJywgKCkgPT4ge30pLCBuZXcgQ2xpZW50RGVzdHJveWVkRXJyb3IoKSlcbiAgICAgIHJldHVyblxuICAgIH1cblxuICAgIGNsaWVudFtrQ29ubmVjdGluZ10gPSBmYWxzZVxuXG4gICAgYXNzZXJ0KHNvY2tldClcblxuICAgIGNvbnN0IGlzSDIgPSBzb2NrZXQuYWxwblByb3RvY29sID09PSAnaDInXG4gICAgaWYgKGlzSDIpIHtcbiAgICAgIGlmICghaDJFeHBlcmltZW50YWxXYXJuZWQpIHtcbiAgICAgICAgaDJFeHBlcmltZW50YWxXYXJuZWQgPSB0cnVlXG4gICAgICAgIHByb2Nlc3MuZW1pdFdhcm5pbmcoJ0gyIHN1cHBvcnQgaXMgZXhwZXJpbWVudGFsLCBleHBlY3QgdGhlbSB0byBjaGFuZ2UgYXQgYW55IHRpbWUuJywge1xuICAgICAgICAgIGNvZGU6ICdVTkRJQ0ktSDInXG4gICAgICAgIH0pXG4gICAgICB9XG5cbiAgICAgIGNvbnN0IHNlc3Npb24gPSBodHRwMi5jb25uZWN0KGNsaWVudFtrVXJsXSwge1xuICAgICAgICBjcmVhdGVDb25uZWN0aW9uOiAoKSA9PiBzb2NrZXQsXG4gICAgICAgIHBlZXJNYXhDb25jdXJyZW50U3RyZWFtczogY2xpZW50W2tIVFRQMlNlc3Npb25TdGF0ZV0ubWF4Q29uY3VycmVudFN0cmVhbXNcbiAgICAgIH0pXG5cbiAgICAgIGNsaWVudFtrSFRUUENvbm5WZXJzaW9uXSA9ICdoMidcbiAgICAgIHNlc3Npb25ba0NsaWVudF0gPSBjbGllbnRcbiAgICAgIHNlc3Npb25ba1NvY2tldF0gPSBzb2NrZXRcbiAgICAgIHNlc3Npb24ub24oJ2Vycm9yJywgb25IdHRwMlNlc3Npb25FcnJvcilcbiAgICAgIHNlc3Npb24ub24oJ2ZyYW1lRXJyb3InLCBvbkh0dHAyRnJhbWVFcnJvcilcbiAgICAgIHNlc3Npb24ub24oJ2VuZCcsIG9uSHR0cDJTZXNzaW9uRW5kKVxuICAgICAgc2Vzc2lvbi5vbignZ29hd2F5Jywgb25IVFRQMkdvQXdheSlcbiAgICAgIHNlc3Npb24ub24oJ2Nsb3NlJywgb25Tb2NrZXRDbG9zZSlcbiAgICAgIHNlc3Npb24udW5yZWYoKVxuXG4gICAgICBjbGllbnRba0hUVFAyU2Vzc2lvbl0gPSBzZXNzaW9uXG4gICAgICBzb2NrZXRba0hUVFAyU2Vzc2lvbl0gPSBzZXNzaW9uXG4gICAgfSBlbHNlIHtcbiAgICAgIGlmICghbGxodHRwSW5zdGFuY2UpIHtcbiAgICAgICAgbGxodHRwSW5zdGFuY2UgPSBhd2FpdCBsbGh0dHBQcm9taXNlXG4gICAgICAgIGxsaHR0cFByb21pc2UgPSBudWxsXG4gICAgICB9XG5cbiAgICAgIHNvY2tldFtrTm9SZWZdID0gZmFsc2VcbiAgICAgIHNvY2tldFtrV3JpdGluZ10gPSBmYWxzZVxuICAgICAgc29ja2V0W2tSZXNldF0gPSBmYWxzZVxuICAgICAgc29ja2V0W2tCbG9ja2luZ10gPSBmYWxzZVxuICAgICAgc29ja2V0W2tQYXJzZXJdID0gbmV3IFBhcnNlcihjbGllbnQsIHNvY2tldCwgbGxodHRwSW5zdGFuY2UpXG4gICAgfVxuXG4gICAgc29ja2V0W2tDb3VudGVyXSA9IDBcbiAgICBzb2NrZXRba01heFJlcXVlc3RzXSA9IGNsaWVudFtrTWF4UmVxdWVzdHNdXG4gICAgc29ja2V0W2tDbGllbnRdID0gY2xpZW50XG4gICAgc29ja2V0W2tFcnJvcl0gPSBudWxsXG5cbiAgICBzb2NrZXRcbiAgICAgIC5vbignZXJyb3InLCBvblNvY2tldEVycm9yKVxuICAgICAgLm9uKCdyZWFkYWJsZScsIG9uU29ja2V0UmVhZGFibGUpXG4gICAgICAub24oJ2VuZCcsIG9uU29ja2V0RW5kKVxuICAgICAgLm9uKCdjbG9zZScsIG9uU29ja2V0Q2xvc2UpXG5cbiAgICBjbGllbnRba1NvY2tldF0gPSBzb2NrZXRcblxuICAgIGlmIChjaGFubmVscy5jb25uZWN0ZWQuaGFzU3Vic2NyaWJlcnMpIHtcbiAgICAgIGNoYW5uZWxzLmNvbm5lY3RlZC5wdWJsaXNoKHtcbiAgICAgICAgY29ubmVjdFBhcmFtczoge1xuICAgICAgICAgIGhvc3QsXG4gICAgICAgICAgaG9zdG5hbWUsXG4gICAgICAgICAgcHJvdG9jb2wsXG4gICAgICAgICAgcG9ydCxcbiAgICAgICAgICBzZXJ2ZXJuYW1lOiBjbGllbnRba1NlcnZlck5hbWVdLFxuICAgICAgICAgIGxvY2FsQWRkcmVzczogY2xpZW50W2tMb2NhbEFkZHJlc3NdXG4gICAgICAgIH0sXG4gICAgICAgIGNvbm5lY3RvcjogY2xpZW50W2tDb25uZWN0b3JdLFxuICAgICAgICBzb2NrZXRcbiAgICAgIH0pXG4gICAgfVxuICAgIGNsaWVudC5lbWl0KCdjb25uZWN0JywgY2xpZW50W2tVcmxdLCBbY2xpZW50XSlcbiAgfSBjYXRjaCAoZXJyKSB7XG4gICAgaWYgKGNsaWVudC5kZXN0cm95ZWQpIHtcbiAgICAgIHJldHVyblxuICAgIH1cblxuICAgIGNsaWVudFtrQ29ubmVjdGluZ10gPSBmYWxzZVxuXG4gICAgaWYgKGNoYW5uZWxzLmNvbm5lY3RFcnJvci5oYXNTdWJzY3JpYmVycykge1xuICAgICAgY2hhbm5lbHMuY29ubmVjdEVycm9yLnB1Ymxpc2goe1xuICAgICAgICBjb25uZWN0UGFyYW1zOiB7XG4gICAgICAgICAgaG9zdCxcbiAgICAgICAgICBob3N0bmFtZSxcbiAgICAgICAgICBwcm90b2NvbCxcbiAgICAgICAgICBwb3J0LFxuICAgICAgICAgIHNlcnZlcm5hbWU6IGNsaWVudFtrU2VydmVyTmFtZV0sXG4gICAgICAgICAgbG9jYWxBZGRyZXNzOiBjbGllbnRba0xvY2FsQWRkcmVzc11cbiAgICAgICAgfSxcbiAgICAgICAgY29ubmVjdG9yOiBjbGllbnRba0Nvbm5lY3Rvcl0sXG4gICAgICAgIGVycm9yOiBlcnJcbiAgICAgIH0pXG4gICAgfVxuXG4gICAgaWYgKGVyci5jb2RlID09PSAnRVJSX1RMU19DRVJUX0FMVE5BTUVfSU5WQUxJRCcpIHtcbiAgICAgIGFzc2VydChjbGllbnRba1J1bm5pbmddID09PSAwKVxuICAgICAgd2hpbGUgKGNsaWVudFtrUGVuZGluZ10gPiAwICYmIGNsaWVudFtrUXVldWVdW2NsaWVudFtrUGVuZGluZ0lkeF1dLnNlcnZlcm5hbWUgPT09IGNsaWVudFtrU2VydmVyTmFtZV0pIHtcbiAgICAgICAgY29uc3QgcmVxdWVzdCA9IGNsaWVudFtrUXVldWVdW2NsaWVudFtrUGVuZGluZ0lkeF0rK11cbiAgICAgICAgZXJyb3JSZXF1ZXN0KGNsaWVudCwgcmVxdWVzdCwgZXJyKVxuICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICBvbkVycm9yKGNsaWVudCwgZXJyKVxuICAgIH1cblxuICAgIGNsaWVudC5lbWl0KCdjb25uZWN0aW9uRXJyb3InLCBjbGllbnRba1VybF0sIFtjbGllbnRdLCBlcnIpXG4gIH1cblxuICByZXN1bWUoY2xpZW50KVxufVxuXG5mdW5jdGlvbiBlbWl0RHJhaW4gKGNsaWVudCkge1xuICBjbGllbnRba05lZWREcmFpbl0gPSAwXG4gIGNsaWVudC5lbWl0KCdkcmFpbicsIGNsaWVudFtrVXJsXSwgW2NsaWVudF0pXG59XG5cbmZ1bmN0aW9uIHJlc3VtZSAoY2xpZW50LCBzeW5jKSB7XG4gIGlmIChjbGllbnRba1Jlc3VtaW5nXSA9PT0gMikge1xuICAgIHJldHVyblxuICB9XG5cbiAgY2xpZW50W2tSZXN1bWluZ10gPSAyXG5cbiAgX3Jlc3VtZShjbGllbnQsIHN5bmMpXG4gIGNsaWVudFtrUmVzdW1pbmddID0gMFxuXG4gIGlmIChjbGllbnRba1J1bm5pbmdJZHhdID4gMjU2KSB7XG4gICAgY2xpZW50W2tRdWV1ZV0uc3BsaWNlKDAsIGNsaWVudFtrUnVubmluZ0lkeF0pXG4gICAgY2xpZW50W2tQZW5kaW5nSWR4XSAtPSBjbGllbnRba1J1bm5pbmdJZHhdXG4gICAgY2xpZW50W2tSdW5uaW5nSWR4XSA9IDBcbiAgfVxufVxuXG5mdW5jdGlvbiBfcmVzdW1lIChjbGllbnQsIHN5bmMpIHtcbiAgd2hpbGUgKHRydWUpIHtcbiAgICBpZiAoY2xpZW50LmRlc3Ryb3llZCkge1xuICAgICAgYXNzZXJ0KGNsaWVudFtrUGVuZGluZ10gPT09IDApXG4gICAgICByZXR1cm5cbiAgICB9XG5cbiAgICBpZiAoY2xpZW50W2tDbG9zZWRSZXNvbHZlXSAmJiAhY2xpZW50W2tTaXplXSkge1xuICAgICAgY2xpZW50W2tDbG9zZWRSZXNvbHZlXSgpXG4gICAgICBjbGllbnRba0Nsb3NlZFJlc29sdmVdID0gbnVsbFxuICAgICAgcmV0dXJuXG4gICAgfVxuXG4gICAgY29uc3Qgc29ja2V0ID0gY2xpZW50W2tTb2NrZXRdXG5cbiAgICBpZiAoc29ja2V0ICYmICFzb2NrZXQuZGVzdHJveWVkICYmIHNvY2tldC5hbHBuUHJvdG9jb2wgIT09ICdoMicpIHtcbiAgICAgIGlmIChjbGllbnRba1NpemVdID09PSAwKSB7XG4gICAgICAgIGlmICghc29ja2V0W2tOb1JlZl0gJiYgc29ja2V0LnVucmVmKSB7XG4gICAgICAgICAgc29ja2V0LnVucmVmKClcbiAgICAgICAgICBzb2NrZXRba05vUmVmXSA9IHRydWVcbiAgICAgICAgfVxuICAgICAgfSBlbHNlIGlmIChzb2NrZXRba05vUmVmXSAmJiBzb2NrZXQucmVmKSB7XG4gICAgICAgIHNvY2tldC5yZWYoKVxuICAgICAgICBzb2NrZXRba05vUmVmXSA9IGZhbHNlXG4gICAgICB9XG5cbiAgICAgIGlmIChjbGllbnRba1NpemVdID09PSAwKSB7XG4gICAgICAgIGlmIChzb2NrZXRba1BhcnNlcl0udGltZW91dFR5cGUgIT09IFRJTUVPVVRfSURMRSkge1xuICAgICAgICAgIHNvY2tldFtrUGFyc2VyXS5zZXRUaW1lb3V0KGNsaWVudFtrS2VlcEFsaXZlVGltZW91dFZhbHVlXSwgVElNRU9VVF9JRExFKVxuICAgICAgICB9XG4gICAgICB9IGVsc2UgaWYgKGNsaWVudFtrUnVubmluZ10gPiAwICYmIHNvY2tldFtrUGFyc2VyXS5zdGF0dXNDb2RlIDwgMjAwKSB7XG4gICAgICAgIGlmIChzb2NrZXRba1BhcnNlcl0udGltZW91dFR5cGUgIT09IFRJTUVPVVRfSEVBREVSUykge1xuICAgICAgICAgIGNvbnN0IHJlcXVlc3QgPSBjbGllbnRba1F1ZXVlXVtjbGllbnRba1J1bm5pbmdJZHhdXVxuICAgICAgICAgIGNvbnN0IGhlYWRlcnNUaW1lb3V0ID0gcmVxdWVzdC5oZWFkZXJzVGltZW91dCAhPSBudWxsXG4gICAgICAgICAgICA/IHJlcXVlc3QuaGVhZGVyc1RpbWVvdXRcbiAgICAgICAgICAgIDogY2xpZW50W2tIZWFkZXJzVGltZW91dF1cbiAgICAgICAgICBzb2NrZXRba1BhcnNlcl0uc2V0VGltZW91dChoZWFkZXJzVGltZW91dCwgVElNRU9VVF9IRUFERVJTKVxuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuXG4gICAgaWYgKGNsaWVudFtrQnVzeV0pIHtcbiAgICAgIGNsaWVudFtrTmVlZERyYWluXSA9IDJcbiAgICB9IGVsc2UgaWYgKGNsaWVudFtrTmVlZERyYWluXSA9PT0gMikge1xuICAgICAgaWYgKHN5bmMpIHtcbiAgICAgICAgY2xpZW50W2tOZWVkRHJhaW5dID0gMVxuICAgICAgICBwcm9jZXNzLm5leHRUaWNrKGVtaXREcmFpbiwgY2xpZW50KVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgZW1pdERyYWluKGNsaWVudClcbiAgICAgIH1cbiAgICAgIGNvbnRpbnVlXG4gICAgfVxuXG4gICAgaWYgKGNsaWVudFtrUGVuZGluZ10gPT09IDApIHtcbiAgICAgIHJldHVyblxuICAgIH1cblxuICAgIGlmIChjbGllbnRba1J1bm5pbmddID49IChjbGllbnRba1BpcGVsaW5pbmddIHx8IDEpKSB7XG4gICAgICByZXR1cm5cbiAgICB9XG5cbiAgICBjb25zdCByZXF1ZXN0ID0gY2xpZW50W2tRdWV1ZV1bY2xpZW50W2tQZW5kaW5nSWR4XV1cblxuICAgIGlmIChjbGllbnRba1VybF0ucHJvdG9jb2wgPT09ICdodHRwczonICYmIGNsaWVudFtrU2VydmVyTmFtZV0gIT09IHJlcXVlc3Quc2VydmVybmFtZSkge1xuICAgICAgaWYgKGNsaWVudFtrUnVubmluZ10gPiAwKSB7XG4gICAgICAgIHJldHVyblxuICAgICAgfVxuXG4gICAgICBjbGllbnRba1NlcnZlck5hbWVdID0gcmVxdWVzdC5zZXJ2ZXJuYW1lXG5cbiAgICAgIGlmIChzb2NrZXQgJiYgc29ja2V0LnNlcnZlcm5hbWUgIT09IHJlcXVlc3Quc2VydmVybmFtZSkge1xuICAgICAgICB1dGlsLmRlc3Ryb3koc29ja2V0LCBuZXcgSW5mb3JtYXRpb25hbEVycm9yKCdzZXJ2ZXJuYW1lIGNoYW5nZWQnKSlcbiAgICAgICAgcmV0dXJuXG4gICAgICB9XG4gICAgfVxuXG4gICAgaWYgKGNsaWVudFtrQ29ubmVjdGluZ10pIHtcbiAgICAgIHJldHVyblxuICAgIH1cblxuICAgIGlmICghc29ja2V0ICYmICFjbGllbnRba0hUVFAyU2Vzc2lvbl0pIHtcbiAgICAgIGNvbm5lY3QoY2xpZW50KVxuICAgICAgcmV0dXJuXG4gICAgfVxuXG4gICAgaWYgKHNvY2tldC5kZXN0cm95ZWQgfHwgc29ja2V0W2tXcml0aW5nXSB8fCBzb2NrZXRba1Jlc2V0XSB8fCBzb2NrZXRba0Jsb2NraW5nXSkge1xuICAgICAgcmV0dXJuXG4gICAgfVxuXG4gICAgaWYgKGNsaWVudFtrUnVubmluZ10gPiAwICYmICFyZXF1ZXN0LmlkZW1wb3RlbnQpIHtcbiAgICAgIC8vIE5vbi1pZGVtcG90ZW50IHJlcXVlc3QgY2Fubm90IGJlIHJldHJpZWQuXG4gICAgICAvLyBFbnN1cmUgdGhhdCBubyBvdGhlciByZXF1ZXN0cyBhcmUgaW5mbGlnaHQgYW5kXG4gICAgICAvLyBjb3VsZCBjYXVzZSBmYWlsdXJlLlxuICAgICAgcmV0dXJuXG4gICAgfVxuXG4gICAgaWYgKGNsaWVudFtrUnVubmluZ10gPiAwICYmIChyZXF1ZXN0LnVwZ3JhZGUgfHwgcmVxdWVzdC5tZXRob2QgPT09ICdDT05ORUNUJykpIHtcbiAgICAgIC8vIERvbid0IGRpc3BhdGNoIGFuIHVwZ3JhZGUgdW50aWwgYWxsIHByZWNlZGluZyByZXF1ZXN0cyBoYXZlIGNvbXBsZXRlZC5cbiAgICAgIC8vIEEgbWlzYmVoYXZpbmcgc2VydmVyIG1pZ2h0IHVwZ3JhZGUgdGhlIGNvbm5lY3Rpb24gYmVmb3JlIGFsbCBwaXBlbGluZWRcbiAgICAgIC8vIHJlcXVlc3QgaGFzIGNvbXBsZXRlZC5cbiAgICAgIHJldHVyblxuICAgIH1cblxuICAgIGlmIChjbGllbnRba1J1bm5pbmddID4gMCAmJiB1dGlsLmJvZHlMZW5ndGgocmVxdWVzdC5ib2R5KSAhPT0gMCAmJlxuICAgICAgKHV0aWwuaXNTdHJlYW0ocmVxdWVzdC5ib2R5KSB8fCB1dGlsLmlzQXN5bmNJdGVyYWJsZShyZXF1ZXN0LmJvZHkpKSkge1xuICAgICAgLy8gUmVxdWVzdCB3aXRoIHN0cmVhbSBvciBpdGVyYXRvciBib2R5IGNhbiBlcnJvciB3aGlsZSBvdGhlciByZXF1ZXN0c1xuICAgICAgLy8gYXJlIGluZmxpZ2h0IGFuZCBpbmRpcmVjdGx5IGVycm9yIHRob3NlIGFzIHdlbGwuXG4gICAgICAvLyBFbnN1cmUgdGhpcyBkb2Vzbid0IGhhcHBlbiBieSB3YWl0aW5nIGZvciBpbmZsaWdodFxuICAgICAgLy8gdG8gY29tcGxldGUgYmVmb3JlIGRpc3BhdGNoaW5nLlxuXG4gICAgICAvLyBSZXF1ZXN0IHdpdGggc3RyZWFtIG9yIGl0ZXJhdG9yIGJvZHkgY2Fubm90IGJlIHJldHJpZWQuXG4gICAgICAvLyBFbnN1cmUgdGhhdCBubyBvdGhlciByZXF1ZXN0cyBhcmUgaW5mbGlnaHQgYW5kXG4gICAgICAvLyBjb3VsZCBjYXVzZSBmYWlsdXJlLlxuICAgICAgcmV0dXJuXG4gICAgfVxuXG4gICAgaWYgKCFyZXF1ZXN0LmFib3J0ZWQgJiYgd3JpdGUoY2xpZW50LCByZXF1ZXN0KSkge1xuICAgICAgY2xpZW50W2tQZW5kaW5nSWR4XSsrXG4gICAgfSBlbHNlIHtcbiAgICAgIGNsaWVudFtrUXVldWVdLnNwbGljZShjbGllbnRba1BlbmRpbmdJZHhdLCAxKVxuICAgIH1cbiAgfVxufVxuXG4vLyBodHRwczovL3d3dy5yZmMtZWRpdG9yLm9yZy9yZmMvcmZjNzIzMCNzZWN0aW9uLTMuMy4yXG5mdW5jdGlvbiBzaG91bGRTZW5kQ29udGVudExlbmd0aCAobWV0aG9kKSB7XG4gIHJldHVybiBtZXRob2QgIT09ICdHRVQnICYmIG1ldGhvZCAhPT0gJ0hFQUQnICYmIG1ldGhvZCAhPT0gJ09QVElPTlMnICYmIG1ldGhvZCAhPT0gJ1RSQUNFJyAmJiBtZXRob2QgIT09ICdDT05ORUNUJ1xufVxuXG5mdW5jdGlvbiB3cml0ZSAoY2xpZW50LCByZXF1ZXN0KSB7XG4gIGlmIChjbGllbnRba0hUVFBDb25uVmVyc2lvbl0gPT09ICdoMicpIHtcbiAgICB3cml0ZUgyKGNsaWVudCwgY2xpZW50W2tIVFRQMlNlc3Npb25dLCByZXF1ZXN0KVxuICAgIHJldHVyblxuICB9XG5cbiAgY29uc3QgeyBib2R5LCBtZXRob2QsIHBhdGgsIGhvc3QsIHVwZ3JhZGUsIGhlYWRlcnMsIGJsb2NraW5nLCByZXNldCB9ID0gcmVxdWVzdFxuXG4gIC8vIGh0dHBzOi8vdG9vbHMuaWV0Zi5vcmcvaHRtbC9yZmM3MjMxI3NlY3Rpb24tNC4zLjFcbiAgLy8gaHR0cHM6Ly90b29scy5pZXRmLm9yZy9odG1sL3JmYzcyMzEjc2VjdGlvbi00LjMuMlxuICAvLyBodHRwczovL3Rvb2xzLmlldGYub3JnL2h0bWwvcmZjNzIzMSNzZWN0aW9uLTQuMy41XG5cbiAgLy8gU2VuZGluZyBhIHBheWxvYWQgYm9keSBvbiBhIHJlcXVlc3QgdGhhdCBkb2VzIG5vdFxuICAvLyBleHBlY3QgaXQgY2FuIGNhdXNlIHVuZGVmaW5lZCBiZWhhdmlvciBvbiBzb21lXG4gIC8vIHNlcnZlcnMgYW5kIGNvcnJ1cHQgY29ubmVjdGlvbiBzdGF0ZS4gRG8gbm90XG4gIC8vIHJlLXVzZSB0aGUgY29ubmVjdGlvbiBmb3IgZnVydGhlciByZXF1ZXN0cy5cblxuICBjb25zdCBleHBlY3RzUGF5bG9hZCA9IChcbiAgICBtZXRob2QgPT09ICdQVVQnIHx8XG4gICAgbWV0aG9kID09PSAnUE9TVCcgfHxcbiAgICBtZXRob2QgPT09ICdQQVRDSCdcbiAgKVxuXG4gIGlmIChib2R5ICYmIHR5cGVvZiBib2R5LnJlYWQgPT09ICdmdW5jdGlvbicpIHtcbiAgICAvLyBUcnkgdG8gcmVhZCBFT0YgaW4gb3JkZXIgdG8gZ2V0IGxlbmd0aC5cbiAgICBib2R5LnJlYWQoMClcbiAgfVxuXG4gIGNvbnN0IGJvZHlMZW5ndGggPSB1dGlsLmJvZHlMZW5ndGgoYm9keSlcblxuICBsZXQgY29udGVudExlbmd0aCA9IGJvZHlMZW5ndGhcblxuICBpZiAoY29udGVudExlbmd0aCA9PT0gbnVsbCkge1xuICAgIGNvbnRlbnRMZW5ndGggPSByZXF1ZXN0LmNvbnRlbnRMZW5ndGhcbiAgfVxuXG4gIGlmIChjb250ZW50TGVuZ3RoID09PSAwICYmICFleHBlY3RzUGF5bG9hZCkge1xuICAgIC8vIGh0dHBzOi8vdG9vbHMuaWV0Zi5vcmcvaHRtbC9yZmM3MjMwI3NlY3Rpb24tMy4zLjJcbiAgICAvLyBBIHVzZXIgYWdlbnQgU0hPVUxEIE5PVCBzZW5kIGEgQ29udGVudC1MZW5ndGggaGVhZGVyIGZpZWxkIHdoZW5cbiAgICAvLyB0aGUgcmVxdWVzdCBtZXNzYWdlIGRvZXMgbm90IGNvbnRhaW4gYSBwYXlsb2FkIGJvZHkgYW5kIHRoZSBtZXRob2RcbiAgICAvLyBzZW1hbnRpY3MgZG8gbm90IGFudGljaXBhdGUgc3VjaCBhIGJvZHkuXG5cbiAgICBjb250ZW50TGVuZ3RoID0gbnVsbFxuICB9XG5cbiAgLy8gaHR0cHM6Ly9naXRodWIuY29tL25vZGVqcy91bmRpY2kvaXNzdWVzLzIwNDZcbiAgLy8gQSB1c2VyIGFnZW50IG1heSBzZW5kIGEgQ29udGVudC1MZW5ndGggaGVhZGVyIHdpdGggMCB2YWx1ZSwgdGhpcyBzaG91bGQgYmUgYWxsb3dlZC5cbiAgaWYgKHNob3VsZFNlbmRDb250ZW50TGVuZ3RoKG1ldGhvZCkgJiYgY29udGVudExlbmd0aCA+IDAgJiYgcmVxdWVzdC5jb250ZW50TGVuZ3RoICE9PSBudWxsICYmIHJlcXVlc3QuY29udGVudExlbmd0aCAhPT0gY29udGVudExlbmd0aCkge1xuICAgIGlmIChjbGllbnRba1N0cmljdENvbnRlbnRMZW5ndGhdKSB7XG4gICAgICBlcnJvclJlcXVlc3QoY2xpZW50LCByZXF1ZXN0LCBuZXcgUmVxdWVzdENvbnRlbnRMZW5ndGhNaXNtYXRjaEVycm9yKCkpXG4gICAgICByZXR1cm4gZmFsc2VcbiAgICB9XG5cbiAgICBwcm9jZXNzLmVtaXRXYXJuaW5nKG5ldyBSZXF1ZXN0Q29udGVudExlbmd0aE1pc21hdGNoRXJyb3IoKSlcbiAgfVxuXG4gIGNvbnN0IHNvY2tldCA9IGNsaWVudFtrU29ja2V0XVxuXG4gIHRyeSB7XG4gICAgcmVxdWVzdC5vbkNvbm5lY3QoKGVycikgPT4ge1xuICAgICAgaWYgKHJlcXVlc3QuYWJvcnRlZCB8fCByZXF1ZXN0LmNvbXBsZXRlZCkge1xuICAgICAgICByZXR1cm5cbiAgICAgIH1cblxuICAgICAgZXJyb3JSZXF1ZXN0KGNsaWVudCwgcmVxdWVzdCwgZXJyIHx8IG5ldyBSZXF1ZXN0QWJvcnRlZEVycm9yKCkpXG5cbiAgICAgIHV0aWwuZGVzdHJveShzb2NrZXQsIG5ldyBJbmZvcm1hdGlvbmFsRXJyb3IoJ2Fib3J0ZWQnKSlcbiAgICB9KVxuICB9IGNhdGNoIChlcnIpIHtcbiAgICBlcnJvclJlcXVlc3QoY2xpZW50LCByZXF1ZXN0LCBlcnIpXG4gIH1cblxuICBpZiAocmVxdWVzdC5hYm9ydGVkKSB7XG4gICAgcmV0dXJuIGZhbHNlXG4gIH1cblxuICBpZiAobWV0aG9kID09PSAnSEVBRCcpIHtcbiAgICAvLyBodHRwczovL2dpdGh1Yi5jb20vbWNvbGxpbmEvdW5kaWNpL2lzc3Vlcy8yNThcbiAgICAvLyBDbG9zZSBhZnRlciBhIEhFQUQgcmVxdWVzdCB0byBpbnRlcm9wIHdpdGggbWlzYmVoYXZpbmcgc2VydmVyc1xuICAgIC8vIHRoYXQgbWF5IHNlbmQgYSBib2R5IGluIHRoZSByZXNwb25zZS5cblxuICAgIHNvY2tldFtrUmVzZXRdID0gdHJ1ZVxuICB9XG5cbiAgaWYgKHVwZ3JhZGUgfHwgbWV0aG9kID09PSAnQ09OTkVDVCcpIHtcbiAgICAvLyBPbiBDT05ORUNUIG9yIHVwZ3JhZGUsIGJsb2NrIHBpcGVsaW5lIGZyb20gZGlzcGF0Y2hpbmcgZnVydGhlclxuICAgIC8vIHJlcXVlc3RzIG9uIHRoaXMgY29ubmVjdGlvbi5cblxuICAgIHNvY2tldFtrUmVzZXRdID0gdHJ1ZVxuICB9XG5cbiAgaWYgKHJlc2V0ICE9IG51bGwpIHtcbiAgICBzb2NrZXRba1Jlc2V0XSA9IHJlc2V0XG4gIH1cblxuICBpZiAoY2xpZW50W2tNYXhSZXF1ZXN0c10gJiYgc29ja2V0W2tDb3VudGVyXSsrID49IGNsaWVudFtrTWF4UmVxdWVzdHNdKSB7XG4gICAgc29ja2V0W2tSZXNldF0gPSB0cnVlXG4gIH1cblxuICBpZiAoYmxvY2tpbmcpIHtcbiAgICBzb2NrZXRba0Jsb2NraW5nXSA9IHRydWVcbiAgfVxuXG4gIGxldCBoZWFkZXIgPSBgJHttZXRob2R9ICR7cGF0aH0gSFRUUC8xLjFcXHJcXG5gXG5cbiAgaWYgKHR5cGVvZiBob3N0ID09PSAnc3RyaW5nJykge1xuICAgIGhlYWRlciArPSBgaG9zdDogJHtob3N0fVxcclxcbmBcbiAgfSBlbHNlIHtcbiAgICBoZWFkZXIgKz0gY2xpZW50W2tIb3N0SGVhZGVyXVxuICB9XG5cbiAgaWYgKHVwZ3JhZGUpIHtcbiAgICBoZWFkZXIgKz0gYGNvbm5lY3Rpb246IHVwZ3JhZGVcXHJcXG51cGdyYWRlOiAke3VwZ3JhZGV9XFxyXFxuYFxuICB9IGVsc2UgaWYgKGNsaWVudFtrUGlwZWxpbmluZ10gJiYgIXNvY2tldFtrUmVzZXRdKSB7XG4gICAgaGVhZGVyICs9ICdjb25uZWN0aW9uOiBrZWVwLWFsaXZlXFxyXFxuJ1xuICB9IGVsc2Uge1xuICAgIGhlYWRlciArPSAnY29ubmVjdGlvbjogY2xvc2VcXHJcXG4nXG4gIH1cblxuICBpZiAoaGVhZGVycykge1xuICAgIGhlYWRlciArPSBoZWFkZXJzXG4gIH1cblxuICBpZiAoY2hhbm5lbHMuc2VuZEhlYWRlcnMuaGFzU3Vic2NyaWJlcnMpIHtcbiAgICBjaGFubmVscy5zZW5kSGVhZGVycy5wdWJsaXNoKHsgcmVxdWVzdCwgaGVhZGVyczogaGVhZGVyLCBzb2NrZXQgfSlcbiAgfVxuXG4gIC8qIGlzdGFuYnVsIGlnbm9yZSBlbHNlOiBhc3NlcnRpb24gKi9cbiAgaWYgKCFib2R5IHx8IGJvZHlMZW5ndGggPT09IDApIHtcbiAgICBpZiAoY29udGVudExlbmd0aCA9PT0gMCkge1xuICAgICAgc29ja2V0LndyaXRlKGAke2hlYWRlcn1jb250ZW50LWxlbmd0aDogMFxcclxcblxcclxcbmAsICdsYXRpbjEnKVxuICAgIH0gZWxzZSB7XG4gICAgICBhc3NlcnQoY29udGVudExlbmd0aCA9PT0gbnVsbCwgJ25vIGJvZHkgbXVzdCBub3QgaGF2ZSBjb250ZW50IGxlbmd0aCcpXG4gICAgICBzb2NrZXQud3JpdGUoYCR7aGVhZGVyfVxcclxcbmAsICdsYXRpbjEnKVxuICAgIH1cbiAgICByZXF1ZXN0Lm9uUmVxdWVzdFNlbnQoKVxuICB9IGVsc2UgaWYgKHV0aWwuaXNCdWZmZXIoYm9keSkpIHtcbiAgICBhc3NlcnQoY29udGVudExlbmd0aCA9PT0gYm9keS5ieXRlTGVuZ3RoLCAnYnVmZmVyIGJvZHkgbXVzdCBoYXZlIGNvbnRlbnQgbGVuZ3RoJylcblxuICAgIHNvY2tldC5jb3JrKClcbiAgICBzb2NrZXQud3JpdGUoYCR7aGVhZGVyfWNvbnRlbnQtbGVuZ3RoOiAke2NvbnRlbnRMZW5ndGh9XFxyXFxuXFxyXFxuYCwgJ2xhdGluMScpXG4gICAgc29ja2V0LndyaXRlKGJvZHkpXG4gICAgc29ja2V0LnVuY29yaygpXG4gICAgcmVxdWVzdC5vbkJvZHlTZW50KGJvZHkpXG4gICAgcmVxdWVzdC5vblJlcXVlc3RTZW50KClcbiAgICBpZiAoIWV4cGVjdHNQYXlsb2FkKSB7XG4gICAgICBzb2NrZXRba1Jlc2V0XSA9IHRydWVcbiAgICB9XG4gIH0gZWxzZSBpZiAodXRpbC5pc0Jsb2JMaWtlKGJvZHkpKSB7XG4gICAgaWYgKHR5cGVvZiBib2R5LnN0cmVhbSA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgd3JpdGVJdGVyYWJsZSh7IGJvZHk6IGJvZHkuc3RyZWFtKCksIGNsaWVudCwgcmVxdWVzdCwgc29ja2V0LCBjb250ZW50TGVuZ3RoLCBoZWFkZXIsIGV4cGVjdHNQYXlsb2FkIH0pXG4gICAgfSBlbHNlIHtcbiAgICAgIHdyaXRlQmxvYih7IGJvZHksIGNsaWVudCwgcmVxdWVzdCwgc29ja2V0LCBjb250ZW50TGVuZ3RoLCBoZWFkZXIsIGV4cGVjdHNQYXlsb2FkIH0pXG4gICAgfVxuICB9IGVsc2UgaWYgKHV0aWwuaXNTdHJlYW0oYm9keSkpIHtcbiAgICB3cml0ZVN0cmVhbSh7IGJvZHksIGNsaWVudCwgcmVxdWVzdCwgc29ja2V0LCBjb250ZW50TGVuZ3RoLCBoZWFkZXIsIGV4cGVjdHNQYXlsb2FkIH0pXG4gIH0gZWxzZSBpZiAodXRpbC5pc0l0ZXJhYmxlKGJvZHkpKSB7XG4gICAgd3JpdGVJdGVyYWJsZSh7IGJvZHksIGNsaWVudCwgcmVxdWVzdCwgc29ja2V0LCBjb250ZW50TGVuZ3RoLCBoZWFkZXIsIGV4cGVjdHNQYXlsb2FkIH0pXG4gIH0gZWxzZSB7XG4gICAgYXNzZXJ0KGZhbHNlKVxuICB9XG5cbiAgcmV0dXJuIHRydWVcbn1cblxuZnVuY3Rpb24gd3JpdGVIMiAoY2xpZW50LCBzZXNzaW9uLCByZXF1ZXN0KSB7XG4gIGNvbnN0IHsgYm9keSwgbWV0aG9kLCBwYXRoLCBob3N0LCB1cGdyYWRlLCBleHBlY3RDb250aW51ZSwgc2lnbmFsLCBoZWFkZXJzOiByZXFIZWFkZXJzIH0gPSByZXF1ZXN0XG5cbiAgbGV0IGhlYWRlcnNcbiAgaWYgKHR5cGVvZiByZXFIZWFkZXJzID09PSAnc3RyaW5nJykgaGVhZGVycyA9IFJlcXVlc3Rba0hUVFAyQ29weUhlYWRlcnNdKHJlcUhlYWRlcnMudHJpbSgpKVxuICBlbHNlIGhlYWRlcnMgPSByZXFIZWFkZXJzXG5cbiAgaWYgKHVwZ3JhZGUpIHtcbiAgICBlcnJvclJlcXVlc3QoY2xpZW50LCByZXF1ZXN0LCBuZXcgRXJyb3IoJ1VwZ3JhZGUgbm90IHN1cHBvcnRlZCBmb3IgSDInKSlcbiAgICByZXR1cm4gZmFsc2VcbiAgfVxuXG4gIHRyeSB7XG4gICAgLy8gVE9ETyhIVFRQLzIpOiBTaG91bGQgd2UgY2FsbCBvbkNvbm5lY3QgaW1tZWRpYXRlbHkgb3Igb24gc3RyZWFtIHJlYWR5IGV2ZW50P1xuICAgIHJlcXVlc3Qub25Db25uZWN0KChlcnIpID0+IHtcbiAgICAgIGlmIChyZXF1ZXN0LmFib3J0ZWQgfHwgcmVxdWVzdC5jb21wbGV0ZWQpIHtcbiAgICAgICAgcmV0dXJuXG4gICAgICB9XG5cbiAgICAgIGVycm9yUmVxdWVzdChjbGllbnQsIHJlcXVlc3QsIGVyciB8fCBuZXcgUmVxdWVzdEFib3J0ZWRFcnJvcigpKVxuICAgIH0pXG4gIH0gY2F0Y2ggKGVycikge1xuICAgIGVycm9yUmVxdWVzdChjbGllbnQsIHJlcXVlc3QsIGVycilcbiAgfVxuXG4gIGlmIChyZXF1ZXN0LmFib3J0ZWQpIHtcbiAgICByZXR1cm4gZmFsc2VcbiAgfVxuXG4gIC8qKiBAdHlwZSB7aW1wb3J0KCdub2RlOmh0dHAyJykuQ2xpZW50SHR0cDJTdHJlYW19ICovXG4gIGxldCBzdHJlYW1cbiAgY29uc3QgaDJTdGF0ZSA9IGNsaWVudFtrSFRUUDJTZXNzaW9uU3RhdGVdXG5cbiAgaGVhZGVyc1tIVFRQMl9IRUFERVJfQVVUSE9SSVRZXSA9IGhvc3QgfHwgY2xpZW50W2tIb3N0XVxuICBoZWFkZXJzW0hUVFAyX0hFQURFUl9NRVRIT0RdID0gbWV0aG9kXG5cbiAgaWYgKG1ldGhvZCA9PT0gJ0NPTk5FQ1QnKSB7XG4gICAgc2Vzc2lvbi5yZWYoKVxuICAgIC8vIHdlIGFyZSBhbHJlYWR5IGNvbm5lY3RlZCwgc3RyZWFtcyBhcmUgcGVuZGluZywgZmlyc3QgcmVxdWVzdFxuICAgIC8vIHdpbGwgY3JlYXRlIGEgbmV3IHN0cmVhbS4gV2UgdHJpZ2dlciBhIHJlcXVlc3QgdG8gY3JlYXRlIHRoZSBzdHJlYW0gYW5kIHdhaXQgdW50aWxcbiAgICAvLyBgcmVhZHlgIGV2ZW50IGlzIHRyaWdnZXJlZFxuICAgIC8vIFdlIGRpc2FibGVkIGVuZFN0cmVhbSB0byBhbGxvdyB0aGUgdXNlciB0byB3cml0ZSB0byB0aGUgc3RyZWFtXG4gICAgc3RyZWFtID0gc2Vzc2lvbi5yZXF1ZXN0KGhlYWRlcnMsIHsgZW5kU3RyZWFtOiBmYWxzZSwgc2lnbmFsIH0pXG5cbiAgICBpZiAoc3RyZWFtLmlkICYmICFzdHJlYW0ucGVuZGluZykge1xuICAgICAgcmVxdWVzdC5vblVwZ3JhZGUobnVsbCwgbnVsbCwgc3RyZWFtKVxuICAgICAgKytoMlN0YXRlLm9wZW5TdHJlYW1zXG4gICAgfSBlbHNlIHtcbiAgICAgIHN0cmVhbS5vbmNlKCdyZWFkeScsICgpID0+IHtcbiAgICAgICAgcmVxdWVzdC5vblVwZ3JhZGUobnVsbCwgbnVsbCwgc3RyZWFtKVxuICAgICAgICArK2gyU3RhdGUub3BlblN0cmVhbXNcbiAgICAgIH0pXG4gICAgfVxuXG4gICAgc3RyZWFtLm9uY2UoJ2Nsb3NlJywgKCkgPT4ge1xuICAgICAgaDJTdGF0ZS5vcGVuU3RyZWFtcyAtPSAxXG4gICAgICAvLyBUT0RPKEhUVFAvMik6IHVucmVmIG9ubHkgaWYgY3VycmVudCBzdHJlYW1zIGNvdW50IGlzIDBcbiAgICAgIGlmIChoMlN0YXRlLm9wZW5TdHJlYW1zID09PSAwKSBzZXNzaW9uLnVucmVmKClcbiAgICB9KVxuXG4gICAgcmV0dXJuIHRydWVcbiAgfVxuXG4gIC8vIGh0dHBzOi8vdG9vbHMuaWV0Zi5vcmcvaHRtbC9yZmM3NTQwI3NlY3Rpb24tOC4zXG4gIC8vIDpwYXRoIGFuZCA6c2NoZW1lIGhlYWRlcnMgbXVzdCBiZSBvbWl0ZWQgd2hlbiBzZW5kaW5nIENPTk5FQ1RcblxuICBoZWFkZXJzW0hUVFAyX0hFQURFUl9QQVRIXSA9IHBhdGhcbiAgaGVhZGVyc1tIVFRQMl9IRUFERVJfU0NIRU1FXSA9ICdodHRwcydcblxuICAvLyBodHRwczovL3Rvb2xzLmlldGYub3JnL2h0bWwvcmZjNzIzMSNzZWN0aW9uLTQuMy4xXG4gIC8vIGh0dHBzOi8vdG9vbHMuaWV0Zi5vcmcvaHRtbC9yZmM3MjMxI3NlY3Rpb24tNC4zLjJcbiAgLy8gaHR0cHM6Ly90b29scy5pZXRmLm9yZy9odG1sL3JmYzcyMzEjc2VjdGlvbi00LjMuNVxuXG4gIC8vIFNlbmRpbmcgYSBwYXlsb2FkIGJvZHkgb24gYSByZXF1ZXN0IHRoYXQgZG9lcyBub3RcbiAgLy8gZXhwZWN0IGl0IGNhbiBjYXVzZSB1bmRlZmluZWQgYmVoYXZpb3Igb24gc29tZVxuICAvLyBzZXJ2ZXJzIGFuZCBjb3JydXB0IGNvbm5lY3Rpb24gc3RhdGUuIERvIG5vdFxuICAvLyByZS11c2UgdGhlIGNvbm5lY3Rpb24gZm9yIGZ1cnRoZXIgcmVxdWVzdHMuXG5cbiAgY29uc3QgZXhwZWN0c1BheWxvYWQgPSAoXG4gICAgbWV0aG9kID09PSAnUFVUJyB8fFxuICAgIG1ldGhvZCA9PT0gJ1BPU1QnIHx8XG4gICAgbWV0aG9kID09PSAnUEFUQ0gnXG4gIClcblxuICBpZiAoYm9keSAmJiB0eXBlb2YgYm9keS5yZWFkID09PSAnZnVuY3Rpb24nKSB7XG4gICAgLy8gVHJ5IHRvIHJlYWQgRU9GIGluIG9yZGVyIHRvIGdldCBsZW5ndGguXG4gICAgYm9keS5yZWFkKDApXG4gIH1cblxuICBsZXQgY29udGVudExlbmd0aCA9IHV0aWwuYm9keUxlbmd0aChib2R5KVxuXG4gIGlmIChjb250ZW50TGVuZ3RoID09IG51bGwpIHtcbiAgICBjb250ZW50TGVuZ3RoID0gcmVxdWVzdC5jb250ZW50TGVuZ3RoXG4gIH1cblxuICBpZiAoY29udGVudExlbmd0aCA9PT0gMCB8fCAhZXhwZWN0c1BheWxvYWQpIHtcbiAgICAvLyBodHRwczovL3Rvb2xzLmlldGYub3JnL2h0bWwvcmZjNzIzMCNzZWN0aW9uLTMuMy4yXG4gICAgLy8gQSB1c2VyIGFnZW50IFNIT1VMRCBOT1Qgc2VuZCBhIENvbnRlbnQtTGVuZ3RoIGhlYWRlciBmaWVsZCB3aGVuXG4gICAgLy8gdGhlIHJlcXVlc3QgbWVzc2FnZSBkb2VzIG5vdCBjb250YWluIGEgcGF5bG9hZCBib2R5IGFuZCB0aGUgbWV0aG9kXG4gICAgLy8gc2VtYW50aWNzIGRvIG5vdCBhbnRpY2lwYXRlIHN1Y2ggYSBib2R5LlxuXG4gICAgY29udGVudExlbmd0aCA9IG51bGxcbiAgfVxuXG4gIC8vIGh0dHBzOi8vZ2l0aHViLmNvbS9ub2RlanMvdW5kaWNpL2lzc3Vlcy8yMDQ2XG4gIC8vIEEgdXNlciBhZ2VudCBtYXkgc2VuZCBhIENvbnRlbnQtTGVuZ3RoIGhlYWRlciB3aXRoIDAgdmFsdWUsIHRoaXMgc2hvdWxkIGJlIGFsbG93ZWQuXG4gIGlmIChzaG91bGRTZW5kQ29udGVudExlbmd0aChtZXRob2QpICYmIGNvbnRlbnRMZW5ndGggPiAwICYmIHJlcXVlc3QuY29udGVudExlbmd0aCAhPSBudWxsICYmIHJlcXVlc3QuY29udGVudExlbmd0aCAhPT0gY29udGVudExlbmd0aCkge1xuICAgIGlmIChjbGllbnRba1N0cmljdENvbnRlbnRMZW5ndGhdKSB7XG4gICAgICBlcnJvclJlcXVlc3QoY2xpZW50LCByZXF1ZXN0LCBuZXcgUmVxdWVzdENvbnRlbnRMZW5ndGhNaXNtYXRjaEVycm9yKCkpXG4gICAgICByZXR1cm4gZmFsc2VcbiAgICB9XG5cbiAgICBwcm9jZXNzLmVtaXRXYXJuaW5nKG5ldyBSZXF1ZXN0Q29udGVudExlbmd0aE1pc21hdGNoRXJyb3IoKSlcbiAgfVxuXG4gIGlmIChjb250ZW50TGVuZ3RoICE9IG51bGwpIHtcbiAgICBhc3NlcnQoYm9keSwgJ25vIGJvZHkgbXVzdCBub3QgaGF2ZSBjb250ZW50IGxlbmd0aCcpXG4gICAgaGVhZGVyc1tIVFRQMl9IRUFERVJfQ09OVEVOVF9MRU5HVEhdID0gYCR7Y29udGVudExlbmd0aH1gXG4gIH1cblxuICBzZXNzaW9uLnJlZigpXG5cbiAgY29uc3Qgc2hvdWxkRW5kU3RyZWFtID0gbWV0aG9kID09PSAnR0VUJyB8fCBtZXRob2QgPT09ICdIRUFEJ1xuICBpZiAoZXhwZWN0Q29udGludWUpIHtcbiAgICBoZWFkZXJzW0hUVFAyX0hFQURFUl9FWFBFQ1RdID0gJzEwMC1jb250aW51ZSdcbiAgICBzdHJlYW0gPSBzZXNzaW9uLnJlcXVlc3QoaGVhZGVycywgeyBlbmRTdHJlYW06IHNob3VsZEVuZFN0cmVhbSwgc2lnbmFsIH0pXG5cbiAgICBzdHJlYW0ub25jZSgnY29udGludWUnLCB3cml0ZUJvZHlIMilcbiAgfSBlbHNlIHtcbiAgICBzdHJlYW0gPSBzZXNzaW9uLnJlcXVlc3QoaGVhZGVycywge1xuICAgICAgZW5kU3RyZWFtOiBzaG91bGRFbmRTdHJlYW0sXG4gICAgICBzaWduYWxcbiAgICB9KVxuICAgIHdyaXRlQm9keUgyKClcbiAgfVxuXG4gIC8vIEluY3JlbWVudCBjb3VudGVyIGFzIHdlIGhhdmUgbmV3IHNldmVyYWwgc3RyZWFtcyBvcGVuXG4gICsraDJTdGF0ZS5vcGVuU3RyZWFtc1xuXG4gIHN0cmVhbS5vbmNlKCdyZXNwb25zZScsIGhlYWRlcnMgPT4ge1xuICAgIGNvbnN0IHsgW0hUVFAyX0hFQURFUl9TVEFUVVNdOiBzdGF0dXNDb2RlLCAuLi5yZWFsSGVhZGVycyB9ID0gaGVhZGVyc1xuXG4gICAgaWYgKHJlcXVlc3Qub25IZWFkZXJzKE51bWJlcihzdGF0dXNDb2RlKSwgcmVhbEhlYWRlcnMsIHN0cmVhbS5yZXN1bWUuYmluZChzdHJlYW0pLCAnJykgPT09IGZhbHNlKSB7XG4gICAgICBzdHJlYW0ucGF1c2UoKVxuICAgIH1cbiAgfSlcblxuICBzdHJlYW0ub25jZSgnZW5kJywgKCkgPT4ge1xuICAgIHJlcXVlc3Qub25Db21wbGV0ZShbXSlcbiAgfSlcblxuICBzdHJlYW0ub24oJ2RhdGEnLCAoY2h1bmspID0+IHtcbiAgICBpZiAocmVxdWVzdC5vbkRhdGEoY2h1bmspID09PSBmYWxzZSkge1xuICAgICAgc3RyZWFtLnBhdXNlKClcbiAgICB9XG4gIH0pXG5cbiAgc3RyZWFtLm9uY2UoJ2Nsb3NlJywgKCkgPT4ge1xuICAgIGgyU3RhdGUub3BlblN0cmVhbXMgLT0gMVxuICAgIC8vIFRPRE8oSFRUUC8yKTogdW5yZWYgb25seSBpZiBjdXJyZW50IHN0cmVhbXMgY291bnQgaXMgMFxuICAgIGlmIChoMlN0YXRlLm9wZW5TdHJlYW1zID09PSAwKSB7XG4gICAgICBzZXNzaW9uLnVucmVmKClcbiAgICB9XG4gIH0pXG5cbiAgc3RyZWFtLm9uY2UoJ2Vycm9yJywgZnVuY3Rpb24gKGVycikge1xuICAgIGlmIChjbGllbnRba0hUVFAyU2Vzc2lvbl0gJiYgIWNsaWVudFtrSFRUUDJTZXNzaW9uXS5kZXN0cm95ZWQgJiYgIXRoaXMuY2xvc2VkICYmICF0aGlzLmRlc3Ryb3llZCkge1xuICAgICAgaDJTdGF0ZS5zdHJlYW1zIC09IDFcbiAgICAgIHV0aWwuZGVzdHJveShzdHJlYW0sIGVycilcbiAgICB9XG4gIH0pXG5cbiAgc3RyZWFtLm9uY2UoJ2ZyYW1lRXJyb3InLCAodHlwZSwgY29kZSkgPT4ge1xuICAgIGNvbnN0IGVyciA9IG5ldyBJbmZvcm1hdGlvbmFsRXJyb3IoYEhUVFAvMjogXCJmcmFtZUVycm9yXCIgcmVjZWl2ZWQgLSB0eXBlICR7dHlwZX0sIGNvZGUgJHtjb2RlfWApXG4gICAgZXJyb3JSZXF1ZXN0KGNsaWVudCwgcmVxdWVzdCwgZXJyKVxuXG4gICAgaWYgKGNsaWVudFtrSFRUUDJTZXNzaW9uXSAmJiAhY2xpZW50W2tIVFRQMlNlc3Npb25dLmRlc3Ryb3llZCAmJiAhdGhpcy5jbG9zZWQgJiYgIXRoaXMuZGVzdHJveWVkKSB7XG4gICAgICBoMlN0YXRlLnN0cmVhbXMgLT0gMVxuICAgICAgdXRpbC5kZXN0cm95KHN0cmVhbSwgZXJyKVxuICAgIH1cbiAgfSlcblxuICAvLyBzdHJlYW0ub24oJ2Fib3J0ZWQnLCAoKSA9PiB7XG4gIC8vICAgLy8gVE9ETyhIVFRQLzIpOiBTdXBwb3J0IGFib3J0ZWRcbiAgLy8gfSlcblxuICAvLyBzdHJlYW0ub24oJ3RpbWVvdXQnLCAoKSA9PiB7XG4gIC8vICAgLy8gVE9ETyhIVFRQLzIpOiBTdXBwb3J0IHRpbWVvdXRcbiAgLy8gfSlcblxuICAvLyBzdHJlYW0ub24oJ3B1c2gnLCBoZWFkZXJzID0+IHtcbiAgLy8gICAvLyBUT0RPKEhUVFAvMik6IFN1cHBvciBwdXNoXG4gIC8vIH0pXG5cbiAgLy8gc3RyZWFtLm9uKCd0cmFpbGVycycsIGhlYWRlcnMgPT4ge1xuICAvLyAgIC8vIFRPRE8oSFRUUC8yKTogU3VwcG9ydCB0cmFpbGVyc1xuICAvLyB9KVxuXG4gIHJldHVybiB0cnVlXG5cbiAgZnVuY3Rpb24gd3JpdGVCb2R5SDIgKCkge1xuICAgIC8qIGlzdGFuYnVsIGlnbm9yZSBlbHNlOiBhc3NlcnRpb24gKi9cbiAgICBpZiAoIWJvZHkpIHtcbiAgICAgIHJlcXVlc3Qub25SZXF1ZXN0U2VudCgpXG4gICAgfSBlbHNlIGlmICh1dGlsLmlzQnVmZmVyKGJvZHkpKSB7XG4gICAgICBhc3NlcnQoY29udGVudExlbmd0aCA9PT0gYm9keS5ieXRlTGVuZ3RoLCAnYnVmZmVyIGJvZHkgbXVzdCBoYXZlIGNvbnRlbnQgbGVuZ3RoJylcbiAgICAgIHN0cmVhbS5jb3JrKClcbiAgICAgIHN0cmVhbS53cml0ZShib2R5KVxuICAgICAgc3RyZWFtLnVuY29yaygpXG4gICAgICBzdHJlYW0uZW5kKClcbiAgICAgIHJlcXVlc3Qub25Cb2R5U2VudChib2R5KVxuICAgICAgcmVxdWVzdC5vblJlcXVlc3RTZW50KClcbiAgICB9IGVsc2UgaWYgKHV0aWwuaXNCbG9iTGlrZShib2R5KSkge1xuICAgICAgaWYgKHR5cGVvZiBib2R5LnN0cmVhbSA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICB3cml0ZUl0ZXJhYmxlKHtcbiAgICAgICAgICBjbGllbnQsXG4gICAgICAgICAgcmVxdWVzdCxcbiAgICAgICAgICBjb250ZW50TGVuZ3RoLFxuICAgICAgICAgIGgyc3RyZWFtOiBzdHJlYW0sXG4gICAgICAgICAgZXhwZWN0c1BheWxvYWQsXG4gICAgICAgICAgYm9keTogYm9keS5zdHJlYW0oKSxcbiAgICAgICAgICBzb2NrZXQ6IGNsaWVudFtrU29ja2V0XSxcbiAgICAgICAgICBoZWFkZXI6ICcnXG4gICAgICAgIH0pXG4gICAgICB9IGVsc2Uge1xuICAgICAgICB3cml0ZUJsb2Ioe1xuICAgICAgICAgIGJvZHksXG4gICAgICAgICAgY2xpZW50LFxuICAgICAgICAgIHJlcXVlc3QsXG4gICAgICAgICAgY29udGVudExlbmd0aCxcbiAgICAgICAgICBleHBlY3RzUGF5bG9hZCxcbiAgICAgICAgICBoMnN0cmVhbTogc3RyZWFtLFxuICAgICAgICAgIGhlYWRlcjogJycsXG4gICAgICAgICAgc29ja2V0OiBjbGllbnRba1NvY2tldF1cbiAgICAgICAgfSlcbiAgICAgIH1cbiAgICB9IGVsc2UgaWYgKHV0aWwuaXNTdHJlYW0oYm9keSkpIHtcbiAgICAgIHdyaXRlU3RyZWFtKHtcbiAgICAgICAgYm9keSxcbiAgICAgICAgY2xpZW50LFxuICAgICAgICByZXF1ZXN0LFxuICAgICAgICBjb250ZW50TGVuZ3RoLFxuICAgICAgICBleHBlY3RzUGF5bG9hZCxcbiAgICAgICAgc29ja2V0OiBjbGllbnRba1NvY2tldF0sXG4gICAgICAgIGgyc3RyZWFtOiBzdHJlYW0sXG4gICAgICAgIGhlYWRlcjogJydcbiAgICAgIH0pXG4gICAgfSBlbHNlIGlmICh1dGlsLmlzSXRlcmFibGUoYm9keSkpIHtcbiAgICAgIHdyaXRlSXRlcmFibGUoe1xuICAgICAgICBib2R5LFxuICAgICAgICBjbGllbnQsXG4gICAgICAgIHJlcXVlc3QsXG4gICAgICAgIGNvbnRlbnRMZW5ndGgsXG4gICAgICAgIGV4cGVjdHNQYXlsb2FkLFxuICAgICAgICBoZWFkZXI6ICcnLFxuICAgICAgICBoMnN0cmVhbTogc3RyZWFtLFxuICAgICAgICBzb2NrZXQ6IGNsaWVudFtrU29ja2V0XVxuICAgICAgfSlcbiAgICB9IGVsc2Uge1xuICAgICAgYXNzZXJ0KGZhbHNlKVxuICAgIH1cbiAgfVxufVxuXG5mdW5jdGlvbiB3cml0ZVN0cmVhbSAoeyBoMnN0cmVhbSwgYm9keSwgY2xpZW50LCByZXF1ZXN0LCBzb2NrZXQsIGNvbnRlbnRMZW5ndGgsIGhlYWRlciwgZXhwZWN0c1BheWxvYWQgfSkge1xuICBhc3NlcnQoY29udGVudExlbmd0aCAhPT0gMCB8fCBjbGllbnRba1J1bm5pbmddID09PSAwLCAnc3RyZWFtIGJvZHkgY2Fubm90IGJlIHBpcGVsaW5lZCcpXG5cbiAgaWYgKGNsaWVudFtrSFRUUENvbm5WZXJzaW9uXSA9PT0gJ2gyJykge1xuICAgIC8vIEZvciBIVFRQLzIsIGlzIGVub3VnaCB0byBwaXBlIHRoZSBzdHJlYW1cbiAgICBjb25zdCBwaXBlID0gcGlwZWxpbmUoXG4gICAgICBib2R5LFxuICAgICAgaDJzdHJlYW0sXG4gICAgICAoZXJyKSA9PiB7XG4gICAgICAgIGlmIChlcnIpIHtcbiAgICAgICAgICB1dGlsLmRlc3Ryb3koYm9keSwgZXJyKVxuICAgICAgICAgIHV0aWwuZGVzdHJveShoMnN0cmVhbSwgZXJyKVxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHJlcXVlc3Qub25SZXF1ZXN0U2VudCgpXG4gICAgICAgIH1cbiAgICAgIH1cbiAgICApXG5cbiAgICBwaXBlLm9uKCdkYXRhJywgb25QaXBlRGF0YSlcbiAgICBwaXBlLm9uY2UoJ2VuZCcsICgpID0+IHtcbiAgICAgIHBpcGUucmVtb3ZlTGlzdGVuZXIoJ2RhdGEnLCBvblBpcGVEYXRhKVxuICAgICAgdXRpbC5kZXN0cm95KHBpcGUpXG4gICAgfSlcblxuICAgIGZ1bmN0aW9uIG9uUGlwZURhdGEgKGNodW5rKSB7XG4gICAgICByZXF1ZXN0Lm9uQm9keVNlbnQoY2h1bmspXG4gICAgfVxuXG4gICAgcmV0dXJuXG4gIH1cblxuICBsZXQgZmluaXNoZWQgPSBmYWxzZVxuXG4gIGNvbnN0IHdyaXRlciA9IG5ldyBBc3luY1dyaXRlcih7IHNvY2tldCwgcmVxdWVzdCwgY29udGVudExlbmd0aCwgY2xpZW50LCBleHBlY3RzUGF5bG9hZCwgaGVhZGVyIH0pXG5cbiAgY29uc3Qgb25EYXRhID0gZnVuY3Rpb24gKGNodW5rKSB7XG4gICAgaWYgKGZpbmlzaGVkKSB7XG4gICAgICByZXR1cm5cbiAgICB9XG5cbiAgICB0cnkge1xuICAgICAgaWYgKCF3cml0ZXIud3JpdGUoY2h1bmspICYmIHRoaXMucGF1c2UpIHtcbiAgICAgICAgdGhpcy5wYXVzZSgpXG4gICAgICB9XG4gICAgfSBjYXRjaCAoZXJyKSB7XG4gICAgICB1dGlsLmRlc3Ryb3kodGhpcywgZXJyKVxuICAgIH1cbiAgfVxuICBjb25zdCBvbkRyYWluID0gZnVuY3Rpb24gKCkge1xuICAgIGlmIChmaW5pc2hlZCkge1xuICAgICAgcmV0dXJuXG4gICAgfVxuXG4gICAgaWYgKGJvZHkucmVzdW1lKSB7XG4gICAgICBib2R5LnJlc3VtZSgpXG4gICAgfVxuICB9XG4gIGNvbnN0IG9uQWJvcnQgPSBmdW5jdGlvbiAoKSB7XG4gICAgaWYgKGZpbmlzaGVkKSB7XG4gICAgICByZXR1cm5cbiAgICB9XG4gICAgY29uc3QgZXJyID0gbmV3IFJlcXVlc3RBYm9ydGVkRXJyb3IoKVxuICAgIHF1ZXVlTWljcm90YXNrKCgpID0+IG9uRmluaXNoZWQoZXJyKSlcbiAgfVxuICBjb25zdCBvbkZpbmlzaGVkID0gZnVuY3Rpb24gKGVycikge1xuICAgIGlmIChmaW5pc2hlZCkge1xuICAgICAgcmV0dXJuXG4gICAgfVxuXG4gICAgZmluaXNoZWQgPSB0cnVlXG5cbiAgICBhc3NlcnQoc29ja2V0LmRlc3Ryb3llZCB8fCAoc29ja2V0W2tXcml0aW5nXSAmJiBjbGllbnRba1J1bm5pbmddIDw9IDEpKVxuXG4gICAgc29ja2V0XG4gICAgICAub2ZmKCdkcmFpbicsIG9uRHJhaW4pXG4gICAgICAub2ZmKCdlcnJvcicsIG9uRmluaXNoZWQpXG5cbiAgICBib2R5XG4gICAgICAucmVtb3ZlTGlzdGVuZXIoJ2RhdGEnLCBvbkRhdGEpXG4gICAgICAucmVtb3ZlTGlzdGVuZXIoJ2VuZCcsIG9uRmluaXNoZWQpXG4gICAgICAucmVtb3ZlTGlzdGVuZXIoJ2Vycm9yJywgb25GaW5pc2hlZClcbiAgICAgIC5yZW1vdmVMaXN0ZW5lcignY2xvc2UnLCBvbkFib3J0KVxuXG4gICAgaWYgKCFlcnIpIHtcbiAgICAgIHRyeSB7XG4gICAgICAgIHdyaXRlci5lbmQoKVxuICAgICAgfSBjYXRjaCAoZXIpIHtcbiAgICAgICAgZXJyID0gZXJcbiAgICAgIH1cbiAgICB9XG5cbiAgICB3cml0ZXIuZGVzdHJveShlcnIpXG5cbiAgICBpZiAoZXJyICYmIChlcnIuY29kZSAhPT0gJ1VORF9FUlJfSU5GTycgfHwgZXJyLm1lc3NhZ2UgIT09ICdyZXNldCcpKSB7XG4gICAgICB1dGlsLmRlc3Ryb3koYm9keSwgZXJyKVxuICAgIH0gZWxzZSB7XG4gICAgICB1dGlsLmRlc3Ryb3koYm9keSlcbiAgICB9XG4gIH1cblxuICBib2R5XG4gICAgLm9uKCdkYXRhJywgb25EYXRhKVxuICAgIC5vbignZW5kJywgb25GaW5pc2hlZClcbiAgICAub24oJ2Vycm9yJywgb25GaW5pc2hlZClcbiAgICAub24oJ2Nsb3NlJywgb25BYm9ydClcblxuICBpZiAoYm9keS5yZXN1bWUpIHtcbiAgICBib2R5LnJlc3VtZSgpXG4gIH1cblxuICBzb2NrZXRcbiAgICAub24oJ2RyYWluJywgb25EcmFpbilcbiAgICAub24oJ2Vycm9yJywgb25GaW5pc2hlZClcbn1cblxuYXN5bmMgZnVuY3Rpb24gd3JpdGVCbG9iICh7IGgyc3RyZWFtLCBib2R5LCBjbGllbnQsIHJlcXVlc3QsIHNvY2tldCwgY29udGVudExlbmd0aCwgaGVhZGVyLCBleHBlY3RzUGF5bG9hZCB9KSB7XG4gIGFzc2VydChjb250ZW50TGVuZ3RoID09PSBib2R5LnNpemUsICdibG9iIGJvZHkgbXVzdCBoYXZlIGNvbnRlbnQgbGVuZ3RoJylcblxuICBjb25zdCBpc0gyID0gY2xpZW50W2tIVFRQQ29ublZlcnNpb25dID09PSAnaDInXG4gIHRyeSB7XG4gICAgaWYgKGNvbnRlbnRMZW5ndGggIT0gbnVsbCAmJiBjb250ZW50TGVuZ3RoICE9PSBib2R5LnNpemUpIHtcbiAgICAgIHRocm93IG5ldyBSZXF1ZXN0Q29udGVudExlbmd0aE1pc21hdGNoRXJyb3IoKVxuICAgIH1cblxuICAgIGNvbnN0IGJ1ZmZlciA9IEJ1ZmZlci5mcm9tKGF3YWl0IGJvZHkuYXJyYXlCdWZmZXIoKSlcblxuICAgIGlmIChpc0gyKSB7XG4gICAgICBoMnN0cmVhbS5jb3JrKClcbiAgICAgIGgyc3RyZWFtLndyaXRlKGJ1ZmZlcilcbiAgICAgIGgyc3RyZWFtLnVuY29yaygpXG4gICAgfSBlbHNlIHtcbiAgICAgIHNvY2tldC5jb3JrKClcbiAgICAgIHNvY2tldC53cml0ZShgJHtoZWFkZXJ9Y29udGVudC1sZW5ndGg6ICR7Y29udGVudExlbmd0aH1cXHJcXG5cXHJcXG5gLCAnbGF0aW4xJylcbiAgICAgIHNvY2tldC53cml0ZShidWZmZXIpXG4gICAgICBzb2NrZXQudW5jb3JrKClcbiAgICB9XG5cbiAgICByZXF1ZXN0Lm9uQm9keVNlbnQoYnVmZmVyKVxuICAgIHJlcXVlc3Qub25SZXF1ZXN0U2VudCgpXG5cbiAgICBpZiAoIWV4cGVjdHNQYXlsb2FkKSB7XG4gICAgICBzb2NrZXRba1Jlc2V0XSA9IHRydWVcbiAgICB9XG5cbiAgICByZXN1bWUoY2xpZW50KVxuICB9IGNhdGNoIChlcnIpIHtcbiAgICB1dGlsLmRlc3Ryb3koaXNIMiA/IGgyc3RyZWFtIDogc29ja2V0LCBlcnIpXG4gIH1cbn1cblxuYXN5bmMgZnVuY3Rpb24gd3JpdGVJdGVyYWJsZSAoeyBoMnN0cmVhbSwgYm9keSwgY2xpZW50LCByZXF1ZXN0LCBzb2NrZXQsIGNvbnRlbnRMZW5ndGgsIGhlYWRlciwgZXhwZWN0c1BheWxvYWQgfSkge1xuICBhc3NlcnQoY29udGVudExlbmd0aCAhPT0gMCB8fCBjbGllbnRba1J1bm5pbmddID09PSAwLCAnaXRlcmF0b3IgYm9keSBjYW5ub3QgYmUgcGlwZWxpbmVkJylcblxuICBsZXQgY2FsbGJhY2sgPSBudWxsXG4gIGZ1bmN0aW9uIG9uRHJhaW4gKCkge1xuICAgIGlmIChjYWxsYmFjaykge1xuICAgICAgY29uc3QgY2IgPSBjYWxsYmFja1xuICAgICAgY2FsbGJhY2sgPSBudWxsXG4gICAgICBjYigpXG4gICAgfVxuICB9XG5cbiAgY29uc3Qgd2FpdEZvckRyYWluID0gKCkgPT4gbmV3IFByb21pc2UoKHJlc29sdmUsIHJlamVjdCkgPT4ge1xuICAgIGFzc2VydChjYWxsYmFjayA9PT0gbnVsbClcblxuICAgIGlmIChzb2NrZXRba0Vycm9yXSkge1xuICAgICAgcmVqZWN0KHNvY2tldFtrRXJyb3JdKVxuICAgIH0gZWxzZSB7XG4gICAgICBjYWxsYmFjayA9IHJlc29sdmVcbiAgICB9XG4gIH0pXG5cbiAgaWYgKGNsaWVudFtrSFRUUENvbm5WZXJzaW9uXSA9PT0gJ2gyJykge1xuICAgIGgyc3RyZWFtXG4gICAgICAub24oJ2Nsb3NlJywgb25EcmFpbilcbiAgICAgIC5vbignZHJhaW4nLCBvbkRyYWluKVxuXG4gICAgdHJ5IHtcbiAgICAgIC8vIEl0J3MgdXAgdG8gdGhlIHVzZXIgdG8gc29tZWhvdyBhYm9ydCB0aGUgYXN5bmMgaXRlcmFibGUuXG4gICAgICBmb3IgYXdhaXQgKGNvbnN0IGNodW5rIG9mIGJvZHkpIHtcbiAgICAgICAgaWYgKHNvY2tldFtrRXJyb3JdKSB7XG4gICAgICAgICAgdGhyb3cgc29ja2V0W2tFcnJvcl1cbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IHJlcyA9IGgyc3RyZWFtLndyaXRlKGNodW5rKVxuICAgICAgICByZXF1ZXN0Lm9uQm9keVNlbnQoY2h1bmspXG4gICAgICAgIGlmICghcmVzKSB7XG4gICAgICAgICAgYXdhaXQgd2FpdEZvckRyYWluKClcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH0gY2F0Y2ggKGVycikge1xuICAgICAgaDJzdHJlYW0uZGVzdHJveShlcnIpXG4gICAgfSBmaW5hbGx5IHtcbiAgICAgIHJlcXVlc3Qub25SZXF1ZXN0U2VudCgpXG4gICAgICBoMnN0cmVhbS5lbmQoKVxuICAgICAgaDJzdHJlYW1cbiAgICAgICAgLm9mZignY2xvc2UnLCBvbkRyYWluKVxuICAgICAgICAub2ZmKCdkcmFpbicsIG9uRHJhaW4pXG4gICAgfVxuXG4gICAgcmV0dXJuXG4gIH1cblxuICBzb2NrZXRcbiAgICAub24oJ2Nsb3NlJywgb25EcmFpbilcbiAgICAub24oJ2RyYWluJywgb25EcmFpbilcblxuICBjb25zdCB3cml0ZXIgPSBuZXcgQXN5bmNXcml0ZXIoeyBzb2NrZXQsIHJlcXVlc3QsIGNvbnRlbnRMZW5ndGgsIGNsaWVudCwgZXhwZWN0c1BheWxvYWQsIGhlYWRlciB9KVxuICB0cnkge1xuICAgIC8vIEl0J3MgdXAgdG8gdGhlIHVzZXIgdG8gc29tZWhvdyBhYm9ydCB0aGUgYXN5bmMgaXRlcmFibGUuXG4gICAgZm9yIGF3YWl0IChjb25zdCBjaHVuayBvZiBib2R5KSB7XG4gICAgICBpZiAoc29ja2V0W2tFcnJvcl0pIHtcbiAgICAgICAgdGhyb3cgc29ja2V0W2tFcnJvcl1cbiAgICAgIH1cblxuICAgICAgaWYgKCF3cml0ZXIud3JpdGUoY2h1bmspKSB7XG4gICAgICAgIGF3YWl0IHdhaXRGb3JEcmFpbigpXG4gICAgICB9XG4gICAgfVxuXG4gICAgd3JpdGVyLmVuZCgpXG4gIH0gY2F0Y2ggKGVycikge1xuICAgIHdyaXRlci5kZXN0cm95KGVycilcbiAgfSBmaW5hbGx5IHtcbiAgICBzb2NrZXRcbiAgICAgIC5vZmYoJ2Nsb3NlJywgb25EcmFpbilcbiAgICAgIC5vZmYoJ2RyYWluJywgb25EcmFpbilcbiAgfVxufVxuXG5jbGFzcyBBc3luY1dyaXRlciB7XG4gIGNvbnN0cnVjdG9yICh7IHNvY2tldCwgcmVxdWVzdCwgY29udGVudExlbmd0aCwgY2xpZW50LCBleHBlY3RzUGF5bG9hZCwgaGVhZGVyIH0pIHtcbiAgICB0aGlzLnNvY2tldCA9IHNvY2tldFxuICAgIHRoaXMucmVxdWVzdCA9IHJlcXVlc3RcbiAgICB0aGlzLmNvbnRlbnRMZW5ndGggPSBjb250ZW50TGVuZ3RoXG4gICAgdGhpcy5jbGllbnQgPSBjbGllbnRcbiAgICB0aGlzLmJ5dGVzV3JpdHRlbiA9IDBcbiAgICB0aGlzLmV4cGVjdHNQYXlsb2FkID0gZXhwZWN0c1BheWxvYWRcbiAgICB0aGlzLmhlYWRlciA9IGhlYWRlclxuXG4gICAgc29ja2V0W2tXcml0aW5nXSA9IHRydWVcbiAgfVxuXG4gIHdyaXRlIChjaHVuaykge1xuICAgIGNvbnN0IHsgc29ja2V0LCByZXF1ZXN0LCBjb250ZW50TGVuZ3RoLCBjbGllbnQsIGJ5dGVzV3JpdHRlbiwgZXhwZWN0c1BheWxvYWQsIGhlYWRlciB9ID0gdGhpc1xuXG4gICAgaWYgKHNvY2tldFtrRXJyb3JdKSB7XG4gICAgICB0aHJvdyBzb2NrZXRba0Vycm9yXVxuICAgIH1cblxuICAgIGlmIChzb2NrZXQuZGVzdHJveWVkKSB7XG4gICAgICByZXR1cm4gZmFsc2VcbiAgICB9XG5cbiAgICBjb25zdCBsZW4gPSBCdWZmZXIuYnl0ZUxlbmd0aChjaHVuaylcbiAgICBpZiAoIWxlbikge1xuICAgICAgcmV0dXJuIHRydWVcbiAgICB9XG5cbiAgICAvLyBXZSBzaG91bGQgZGVmZXIgd3JpdGluZyBjaHVua3MuXG4gICAgaWYgKGNvbnRlbnRMZW5ndGggIT09IG51bGwgJiYgYnl0ZXNXcml0dGVuICsgbGVuID4gY29udGVudExlbmd0aCkge1xuICAgICAgaWYgKGNsaWVudFtrU3RyaWN0Q29udGVudExlbmd0aF0pIHtcbiAgICAgICAgdGhyb3cgbmV3IFJlcXVlc3RDb250ZW50TGVuZ3RoTWlzbWF0Y2hFcnJvcigpXG4gICAgICB9XG5cbiAgICAgIHByb2Nlc3MuZW1pdFdhcm5pbmcobmV3IFJlcXVlc3RDb250ZW50TGVuZ3RoTWlzbWF0Y2hFcnJvcigpKVxuICAgIH1cblxuICAgIHNvY2tldC5jb3JrKClcblxuICAgIGlmIChieXRlc1dyaXR0ZW4gPT09IDApIHtcbiAgICAgIGlmICghZXhwZWN0c1BheWxvYWQpIHtcbiAgICAgICAgc29ja2V0W2tSZXNldF0gPSB0cnVlXG4gICAgICB9XG5cbiAgICAgIGlmIChjb250ZW50TGVuZ3RoID09PSBudWxsKSB7XG4gICAgICAgIHNvY2tldC53cml0ZShgJHtoZWFkZXJ9dHJhbnNmZXItZW5jb2Rpbmc6IGNodW5rZWRcXHJcXG5gLCAnbGF0aW4xJylcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHNvY2tldC53cml0ZShgJHtoZWFkZXJ9Y29udGVudC1sZW5ndGg6ICR7Y29udGVudExlbmd0aH1cXHJcXG5cXHJcXG5gLCAnbGF0aW4xJylcbiAgICAgIH1cbiAgICB9XG5cbiAgICBpZiAoY29udGVudExlbmd0aCA9PT0gbnVsbCkge1xuICAgICAgc29ja2V0LndyaXRlKGBcXHJcXG4ke2xlbi50b1N0cmluZygxNil9XFxyXFxuYCwgJ2xhdGluMScpXG4gICAgfVxuXG4gICAgdGhpcy5ieXRlc1dyaXR0ZW4gKz0gbGVuXG5cbiAgICBjb25zdCByZXQgPSBzb2NrZXQud3JpdGUoY2h1bmspXG5cbiAgICBzb2NrZXQudW5jb3JrKClcblxuICAgIHJlcXVlc3Qub25Cb2R5U2VudChjaHVuaylcblxuICAgIGlmICghcmV0KSB7XG4gICAgICBpZiAoc29ja2V0W2tQYXJzZXJdLnRpbWVvdXQgJiYgc29ja2V0W2tQYXJzZXJdLnRpbWVvdXRUeXBlID09PSBUSU1FT1VUX0hFQURFUlMpIHtcbiAgICAgICAgLy8gaXN0YW5idWwgaWdub3JlIGVsc2U6IG9ubHkgZm9yIGplc3RcbiAgICAgICAgaWYgKHNvY2tldFtrUGFyc2VyXS50aW1lb3V0LnJlZnJlc2gpIHtcbiAgICAgICAgICBzb2NrZXRba1BhcnNlcl0udGltZW91dC5yZWZyZXNoKClcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiByZXRcbiAgfVxuXG4gIGVuZCAoKSB7XG4gICAgY29uc3QgeyBzb2NrZXQsIGNvbnRlbnRMZW5ndGgsIGNsaWVudCwgYnl0ZXNXcml0dGVuLCBleHBlY3RzUGF5bG9hZCwgaGVhZGVyLCByZXF1ZXN0IH0gPSB0aGlzXG4gICAgcmVxdWVzdC5vblJlcXVlc3RTZW50KClcblxuICAgIHNvY2tldFtrV3JpdGluZ10gPSBmYWxzZVxuXG4gICAgaWYgKHNvY2tldFtrRXJyb3JdKSB7XG4gICAgICB0aHJvdyBzb2NrZXRba0Vycm9yXVxuICAgIH1cblxuICAgIGlmIChzb2NrZXQuZGVzdHJveWVkKSB7XG4gICAgICByZXR1cm5cbiAgICB9XG5cbiAgICBpZiAoYnl0ZXNXcml0dGVuID09PSAwKSB7XG4gICAgICBpZiAoZXhwZWN0c1BheWxvYWQpIHtcbiAgICAgICAgLy8gaHR0cHM6Ly90b29scy5pZXRmLm9yZy9odG1sL3JmYzcyMzAjc2VjdGlvbi0zLjMuMlxuICAgICAgICAvLyBBIHVzZXIgYWdlbnQgU0hPVUxEIHNlbmQgYSBDb250ZW50LUxlbmd0aCBpbiBhIHJlcXVlc3QgbWVzc2FnZSB3aGVuXG4gICAgICAgIC8vIG5vIFRyYW5zZmVyLUVuY29kaW5nIGlzIHNlbnQgYW5kIHRoZSByZXF1ZXN0IG1ldGhvZCBkZWZpbmVzIGEgbWVhbmluZ1xuICAgICAgICAvLyBmb3IgYW4gZW5jbG9zZWQgcGF5bG9hZCBib2R5LlxuXG4gICAgICAgIHNvY2tldC53cml0ZShgJHtoZWFkZXJ9Y29udGVudC1sZW5ndGg6IDBcXHJcXG5cXHJcXG5gLCAnbGF0aW4xJylcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHNvY2tldC53cml0ZShgJHtoZWFkZXJ9XFxyXFxuYCwgJ2xhdGluMScpXG4gICAgICB9XG4gICAgfSBlbHNlIGlmIChjb250ZW50TGVuZ3RoID09PSBudWxsKSB7XG4gICAgICBzb2NrZXQud3JpdGUoJ1xcclxcbjBcXHJcXG5cXHJcXG4nLCAnbGF0aW4xJylcbiAgICB9XG5cbiAgICBpZiAoY29udGVudExlbmd0aCAhPT0gbnVsbCAmJiBieXRlc1dyaXR0ZW4gIT09IGNvbnRlbnRMZW5ndGgpIHtcbiAgICAgIGlmIChjbGllbnRba1N0cmljdENvbnRlbnRMZW5ndGhdKSB7XG4gICAgICAgIHRocm93IG5ldyBSZXF1ZXN0Q29udGVudExlbmd0aE1pc21hdGNoRXJyb3IoKVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgcHJvY2Vzcy5lbWl0V2FybmluZyhuZXcgUmVxdWVzdENvbnRlbnRMZW5ndGhNaXNtYXRjaEVycm9yKCkpXG4gICAgICB9XG4gICAgfVxuXG4gICAgaWYgKHNvY2tldFtrUGFyc2VyXS50aW1lb3V0ICYmIHNvY2tldFtrUGFyc2VyXS50aW1lb3V0VHlwZSA9PT0gVElNRU9VVF9IRUFERVJTKSB7XG4gICAgICAvLyBpc3RhbmJ1bCBpZ25vcmUgZWxzZTogb25seSBmb3IgamVzdFxuICAgICAgaWYgKHNvY2tldFtrUGFyc2VyXS50aW1lb3V0LnJlZnJlc2gpIHtcbiAgICAgICAgc29ja2V0W2tQYXJzZXJdLnRpbWVvdXQucmVmcmVzaCgpXG4gICAgICB9XG4gICAgfVxuXG4gICAgcmVzdW1lKGNsaWVudClcbiAgfVxuXG4gIGRlc3Ryb3kgKGVycikge1xuICAgIGNvbnN0IHsgc29ja2V0LCBjbGllbnQgfSA9IHRoaXNcblxuICAgIHNvY2tldFtrV3JpdGluZ10gPSBmYWxzZVxuXG4gICAgaWYgKGVycikge1xuICAgICAgYXNzZXJ0KGNsaWVudFtrUnVubmluZ10gPD0gMSwgJ3BpcGVsaW5lIHNob3VsZCBvbmx5IGNvbnRhaW4gdGhpcyByZXF1ZXN0JylcbiAgICAgIHV0aWwuZGVzdHJveShzb2NrZXQsIGVycilcbiAgICB9XG4gIH1cbn1cblxuZnVuY3Rpb24gZXJyb3JSZXF1ZXN0IChjbGllbnQsIHJlcXVlc3QsIGVycikge1xuICB0cnkge1xuICAgIHJlcXVlc3Qub25FcnJvcihlcnIpXG4gICAgYXNzZXJ0KHJlcXVlc3QuYWJvcnRlZClcbiAgfSBjYXRjaCAoZXJyKSB7XG4gICAgY2xpZW50LmVtaXQoJ2Vycm9yJywgZXJyKVxuICB9XG59XG5cbm1vZHVsZS5leHBvcnRzID0gQ2xpZW50XG4iLAogICAgIi8qIGVzbGludC1kaXNhYmxlICovXG5cbid1c2Ugc3RyaWN0J1xuXG4vLyBFeHRyYWN0ZWQgZnJvbSBub2RlL2xpYi9pbnRlcm5hbC9maXhlZF9xdWV1ZS5qc1xuXG4vLyBDdXJyZW50bHkgb3B0aW1hbCBxdWV1ZSBzaXplLCB0ZXN0ZWQgb24gVjggNi4wIC0gNi42LiBNdXN0IGJlIHBvd2VyIG9mIHR3by5cbmNvbnN0IGtTaXplID0gMjA0ODtcbmNvbnN0IGtNYXNrID0ga1NpemUgLSAxO1xuXG4vLyBUaGUgRml4ZWRRdWV1ZSBpcyBpbXBsZW1lbnRlZCBhcyBhIHNpbmdseS1saW5rZWQgbGlzdCBvZiBmaXhlZC1zaXplXG4vLyBjaXJjdWxhciBidWZmZXJzLiBJdCBsb29rcyBzb21ldGhpbmcgbGlrZSB0aGlzOlxuLy9cbi8vICBoZWFkICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRhaWxcbi8vICAgIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfFxuLy8gICAgdiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2XG4vLyArLS0tLS0tLS0tLS0rIDwtLS0tLVxcICAgICAgICstLS0tLS0tLS0tLSsgPC0tLS0tLVxcICAgICAgICAgKy0tLS0tLS0tLS0tK1xuLy8gfCAgW251bGxdICAgfCAgICAgICAgXFwtLS0tLSB8ICAgbmV4dCAgICB8ICAgICAgICAgXFwtLS0tLS0tIHwgICBuZXh0ICAgIHxcbi8vICstLS0tLS0tLS0tLSsgICAgICAgICAgICAgICArLS0tLS0tLS0tLS0rICAgICAgICAgICAgICAgICAgKy0tLS0tLS0tLS0tK1xuLy8gfCAgIGl0ZW0gICAgfCA8LS0gYm90dG9tICAgIHwgICBpdGVtICAgIHwgPC0tIGJvdHRvbSAgICAgICB8ICBbZW1wdHldICB8XG4vLyB8ICAgaXRlbSAgICB8ICAgICAgICAgICAgICAgfCAgIGl0ZW0gICAgfCAgICAgICAgICAgICAgICAgIHwgIFtlbXB0eV0gIHxcbi8vIHwgICBpdGVtICAgIHwgICAgICAgICAgICAgICB8ICAgaXRlbSAgICB8ICAgICAgICAgICAgICAgICAgfCAgW2VtcHR5XSAgfFxuLy8gfCAgIGl0ZW0gICAgfCAgICAgICAgICAgICAgIHwgICBpdGVtICAgIHwgICAgICAgICAgICAgICAgICB8ICBbZW1wdHldICB8XG4vLyB8ICAgaXRlbSAgICB8ICAgICAgICAgICAgICAgfCAgIGl0ZW0gICAgfCAgICAgICBib3R0b20gLS0+IHwgICBpdGVtICAgIHxcbi8vIHwgICBpdGVtICAgIHwgICAgICAgICAgICAgICB8ICAgaXRlbSAgICB8ICAgICAgICAgICAgICAgICAgfCAgIGl0ZW0gICAgfFxuLy8gfCAgICAuLi4gICAgfCAgICAgICAgICAgICAgIHwgICAgLi4uICAgIHwgICAgICAgICAgICAgICAgICB8ICAgIC4uLiAgICB8XG4vLyB8ICAgaXRlbSAgICB8ICAgICAgICAgICAgICAgfCAgIGl0ZW0gICAgfCAgICAgICAgICAgICAgICAgIHwgICBpdGVtICAgIHxcbi8vIHwgICBpdGVtICAgIHwgICAgICAgICAgICAgICB8ICAgaXRlbSAgICB8ICAgICAgICAgICAgICAgICAgfCAgIGl0ZW0gICAgfFxuLy8gfCAgW2VtcHR5XSAgfCA8LS0gdG9wICAgICAgIHwgICBpdGVtICAgIHwgICAgICAgICAgICAgICAgICB8ICAgaXRlbSAgICB8XG4vLyB8ICBbZW1wdHldICB8ICAgICAgICAgICAgICAgfCAgIGl0ZW0gICAgfCAgICAgICAgICAgICAgICAgIHwgICBpdGVtICAgIHxcbi8vIHwgIFtlbXB0eV0gIHwgICAgICAgICAgICAgICB8ICBbZW1wdHldICB8IDwtLSB0b3AgIHRvcCAtLT4gfCAgW2VtcHR5XSAgfFxuLy8gKy0tLS0tLS0tLS0tKyAgICAgICAgICAgICAgICstLS0tLS0tLS0tLSsgICAgICAgICAgICAgICAgICArLS0tLS0tLS0tLS0rXG4vL1xuLy8gT3IsIGlmIHRoZXJlIGlzIG9ubHkgb25lIGNpcmN1bGFyIGJ1ZmZlciwgaXQgbG9va3Mgc29tZXRoaW5nXG4vLyBsaWtlIGVpdGhlciBvZiB0aGVzZTpcbi8vXG4vLyAgaGVhZCAgIHRhaWwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBoZWFkICAgdGFpbFxuLy8gICAgfCAgICAgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8ICAgICB8XG4vLyAgICB2ICAgICB2ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHYgICAgIHZcbi8vICstLS0tLS0tLS0tLSsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKy0tLS0tLS0tLS0tK1xuLy8gfCAgW251bGxdICAgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8ICBbbnVsbF0gICB8XG4vLyArLS0tLS0tLS0tLS0rICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICstLS0tLS0tLS0tLStcbi8vIHwgIFtlbXB0eV0gIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAgIGl0ZW0gICAgfFxuLy8gfCAgW2VtcHR5XSAgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8ICAgaXRlbSAgICB8XG4vLyB8ICAgaXRlbSAgICB8IDwtLSBib3R0b20gICAgICAgICAgICB0b3AgLS0+IHwgIFtlbXB0eV0gIHxcbi8vIHwgICBpdGVtICAgIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAgW2VtcHR5XSAgfFxuLy8gfCAgW2VtcHR5XSAgfCA8LS0gdG9wICAgICAgICAgICAgYm90dG9tIC0tPiB8ICAgaXRlbSAgICB8XG4vLyB8ICBbZW1wdHldICB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgICBpdGVtICAgIHxcbi8vICstLS0tLS0tLS0tLSsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKy0tLS0tLS0tLS0tK1xuLy9cbi8vIEFkZGluZyBhIHZhbHVlIG1lYW5zIG1vdmluZyBgdG9wYCBmb3J3YXJkIGJ5IG9uZSwgcmVtb3ZpbmcgbWVhbnNcbi8vIG1vdmluZyBgYm90dG9tYCBmb3J3YXJkIGJ5IG9uZS4gQWZ0ZXIgcmVhY2hpbmcgdGhlIGVuZCwgdGhlIHF1ZXVlXG4vLyB3cmFwcyBhcm91bmQuXG4vL1xuLy8gV2hlbiBgdG9wID09PSBib3R0b21gIHRoZSBjdXJyZW50IHF1ZXVlIGlzIGVtcHR5IGFuZCB3aGVuXG4vLyBgdG9wICsgMSA9PT0gYm90dG9tYCBpdCdzIGZ1bGwuIFRoaXMgd2FzdGVzIGEgc2luZ2xlIHNwYWNlIG9mIHN0b3JhZ2Vcbi8vIGJ1dCBhbGxvd3MgbXVjaCBxdWlja2VyIGNoZWNrcy5cblxuY2xhc3MgRml4ZWRDaXJjdWxhckJ1ZmZlciB7XG4gIGNvbnN0cnVjdG9yKCkge1xuICAgIHRoaXMuYm90dG9tID0gMDtcbiAgICB0aGlzLnRvcCA9IDA7XG4gICAgdGhpcy5saXN0ID0gbmV3IEFycmF5KGtTaXplKTtcbiAgICB0aGlzLm5leHQgPSBudWxsO1xuICB9XG5cbiAgaXNFbXB0eSgpIHtcbiAgICByZXR1cm4gdGhpcy50b3AgPT09IHRoaXMuYm90dG9tO1xuICB9XG5cbiAgaXNGdWxsKCkge1xuICAgIHJldHVybiAoKHRoaXMudG9wICsgMSkgJiBrTWFzaykgPT09IHRoaXMuYm90dG9tO1xuICB9XG5cbiAgcHVzaChkYXRhKSB7XG4gICAgdGhpcy5saXN0W3RoaXMudG9wXSA9IGRhdGE7XG4gICAgdGhpcy50b3AgPSAodGhpcy50b3AgKyAxKSAmIGtNYXNrO1xuICB9XG5cbiAgc2hpZnQoKSB7XG4gICAgY29uc3QgbmV4dEl0ZW0gPSB0aGlzLmxpc3RbdGhpcy5ib3R0b21dO1xuICAgIGlmIChuZXh0SXRlbSA9PT0gdW5kZWZpbmVkKVxuICAgICAgcmV0dXJuIG51bGw7XG4gICAgdGhpcy5saXN0W3RoaXMuYm90dG9tXSA9IHVuZGVmaW5lZDtcbiAgICB0aGlzLmJvdHRvbSA9ICh0aGlzLmJvdHRvbSArIDEpICYga01hc2s7XG4gICAgcmV0dXJuIG5leHRJdGVtO1xuICB9XG59XG5cbm1vZHVsZS5leHBvcnRzID0gY2xhc3MgRml4ZWRRdWV1ZSB7XG4gIGNvbnN0cnVjdG9yKCkge1xuICAgIHRoaXMuaGVhZCA9IHRoaXMudGFpbCA9IG5ldyBGaXhlZENpcmN1bGFyQnVmZmVyKCk7XG4gIH1cblxuICBpc0VtcHR5KCkge1xuICAgIHJldHVybiB0aGlzLmhlYWQuaXNFbXB0eSgpO1xuICB9XG5cbiAgcHVzaChkYXRhKSB7XG4gICAgaWYgKHRoaXMuaGVhZC5pc0Z1bGwoKSkge1xuICAgICAgLy8gSGVhZCBpcyBmdWxsOiBDcmVhdGVzIGEgbmV3IHF1ZXVlLCBzZXRzIHRoZSBvbGQgcXVldWUncyBgLm5leHRgIHRvIGl0LFxuICAgICAgLy8gYW5kIHNldHMgaXQgYXMgdGhlIG5ldyBtYWluIHF1ZXVlLlxuICAgICAgdGhpcy5oZWFkID0gdGhpcy5oZWFkLm5leHQgPSBuZXcgRml4ZWRDaXJjdWxhckJ1ZmZlcigpO1xuICAgIH1cbiAgICB0aGlzLmhlYWQucHVzaChkYXRhKTtcbiAgfVxuXG4gIHNoaWZ0KCkge1xuICAgIGNvbnN0IHRhaWwgPSB0aGlzLnRhaWw7XG4gICAgY29uc3QgbmV4dCA9IHRhaWwuc2hpZnQoKTtcbiAgICBpZiAodGFpbC5pc0VtcHR5KCkgJiYgdGFpbC5uZXh0ICE9PSBudWxsKSB7XG4gICAgICAvLyBJZiB0aGVyZSBpcyBhbm90aGVyIHF1ZXVlLCBpdCBmb3JtcyB0aGUgbmV3IHRhaWwuXG4gICAgICB0aGlzLnRhaWwgPSB0YWlsLm5leHQ7XG4gICAgfVxuICAgIHJldHVybiBuZXh0O1xuICB9XG59O1xuIiwKICAgICJjb25zdCB7IGtGcmVlLCBrQ29ubmVjdGVkLCBrUGVuZGluZywga1F1ZXVlZCwga1J1bm5pbmcsIGtTaXplIH0gPSByZXF1aXJlKCcuL2NvcmUvc3ltYm9scycpXG5jb25zdCBrUG9vbCA9IFN5bWJvbCgncG9vbCcpXG5cbmNsYXNzIFBvb2xTdGF0cyB7XG4gIGNvbnN0cnVjdG9yIChwb29sKSB7XG4gICAgdGhpc1trUG9vbF0gPSBwb29sXG4gIH1cblxuICBnZXQgY29ubmVjdGVkICgpIHtcbiAgICByZXR1cm4gdGhpc1trUG9vbF1ba0Nvbm5lY3RlZF1cbiAgfVxuXG4gIGdldCBmcmVlICgpIHtcbiAgICByZXR1cm4gdGhpc1trUG9vbF1ba0ZyZWVdXG4gIH1cblxuICBnZXQgcGVuZGluZyAoKSB7XG4gICAgcmV0dXJuIHRoaXNba1Bvb2xdW2tQZW5kaW5nXVxuICB9XG5cbiAgZ2V0IHF1ZXVlZCAoKSB7XG4gICAgcmV0dXJuIHRoaXNba1Bvb2xdW2tRdWV1ZWRdXG4gIH1cblxuICBnZXQgcnVubmluZyAoKSB7XG4gICAgcmV0dXJuIHRoaXNba1Bvb2xdW2tSdW5uaW5nXVxuICB9XG5cbiAgZ2V0IHNpemUgKCkge1xuICAgIHJldHVybiB0aGlzW2tQb29sXVtrU2l6ZV1cbiAgfVxufVxuXG5tb2R1bGUuZXhwb3J0cyA9IFBvb2xTdGF0c1xuIiwKICAgICIndXNlIHN0cmljdCdcblxuY29uc3QgRGlzcGF0Y2hlckJhc2UgPSByZXF1aXJlKCcuL2Rpc3BhdGNoZXItYmFzZScpXG5jb25zdCBGaXhlZFF1ZXVlID0gcmVxdWlyZSgnLi9ub2RlL2ZpeGVkLXF1ZXVlJylcbmNvbnN0IHsga0Nvbm5lY3RlZCwga1NpemUsIGtSdW5uaW5nLCBrUGVuZGluZywga1F1ZXVlZCwga0J1c3ksIGtGcmVlLCBrVXJsLCBrQ2xvc2UsIGtEZXN0cm95LCBrRGlzcGF0Y2ggfSA9IHJlcXVpcmUoJy4vY29yZS9zeW1ib2xzJylcbmNvbnN0IFBvb2xTdGF0cyA9IHJlcXVpcmUoJy4vcG9vbC1zdGF0cycpXG5cbmNvbnN0IGtDbGllbnRzID0gU3ltYm9sKCdjbGllbnRzJylcbmNvbnN0IGtOZWVkRHJhaW4gPSBTeW1ib2woJ25lZWREcmFpbicpXG5jb25zdCBrUXVldWUgPSBTeW1ib2woJ3F1ZXVlJylcbmNvbnN0IGtDbG9zZWRSZXNvbHZlID0gU3ltYm9sKCdjbG9zZWQgcmVzb2x2ZScpXG5jb25zdCBrT25EcmFpbiA9IFN5bWJvbCgnb25EcmFpbicpXG5jb25zdCBrT25Db25uZWN0ID0gU3ltYm9sKCdvbkNvbm5lY3QnKVxuY29uc3Qga09uRGlzY29ubmVjdCA9IFN5bWJvbCgnb25EaXNjb25uZWN0JylcbmNvbnN0IGtPbkNvbm5lY3Rpb25FcnJvciA9IFN5bWJvbCgnb25Db25uZWN0aW9uRXJyb3InKVxuY29uc3Qga0dldERpc3BhdGNoZXIgPSBTeW1ib2woJ2dldCBkaXNwYXRjaGVyJylcbmNvbnN0IGtBZGRDbGllbnQgPSBTeW1ib2woJ2FkZCBjbGllbnQnKVxuY29uc3Qga1JlbW92ZUNsaWVudCA9IFN5bWJvbCgncmVtb3ZlIGNsaWVudCcpXG5jb25zdCBrU3RhdHMgPSBTeW1ib2woJ3N0YXRzJylcblxuY2xhc3MgUG9vbEJhc2UgZXh0ZW5kcyBEaXNwYXRjaGVyQmFzZSB7XG4gIGNvbnN0cnVjdG9yICgpIHtcbiAgICBzdXBlcigpXG5cbiAgICB0aGlzW2tRdWV1ZV0gPSBuZXcgRml4ZWRRdWV1ZSgpXG4gICAgdGhpc1trQ2xpZW50c10gPSBbXVxuICAgIHRoaXNba1F1ZXVlZF0gPSAwXG5cbiAgICBjb25zdCBwb29sID0gdGhpc1xuXG4gICAgdGhpc1trT25EcmFpbl0gPSBmdW5jdGlvbiBvbkRyYWluIChvcmlnaW4sIHRhcmdldHMpIHtcbiAgICAgIGNvbnN0IHF1ZXVlID0gcG9vbFtrUXVldWVdXG5cbiAgICAgIGxldCBuZWVkRHJhaW4gPSBmYWxzZVxuXG4gICAgICB3aGlsZSAoIW5lZWREcmFpbikge1xuICAgICAgICBjb25zdCBpdGVtID0gcXVldWUuc2hpZnQoKVxuICAgICAgICBpZiAoIWl0ZW0pIHtcbiAgICAgICAgICBicmVha1xuICAgICAgICB9XG4gICAgICAgIHBvb2xba1F1ZXVlZF0tLVxuICAgICAgICBuZWVkRHJhaW4gPSAhdGhpcy5kaXNwYXRjaChpdGVtLm9wdHMsIGl0ZW0uaGFuZGxlcilcbiAgICAgIH1cblxuICAgICAgdGhpc1trTmVlZERyYWluXSA9IG5lZWREcmFpblxuXG4gICAgICBpZiAoIXRoaXNba05lZWREcmFpbl0gJiYgcG9vbFtrTmVlZERyYWluXSkge1xuICAgICAgICBwb29sW2tOZWVkRHJhaW5dID0gZmFsc2VcbiAgICAgICAgcG9vbC5lbWl0KCdkcmFpbicsIG9yaWdpbiwgW3Bvb2wsIC4uLnRhcmdldHNdKVxuICAgICAgfVxuXG4gICAgICBpZiAocG9vbFtrQ2xvc2VkUmVzb2x2ZV0gJiYgcXVldWUuaXNFbXB0eSgpKSB7XG4gICAgICAgIFByb21pc2VcbiAgICAgICAgICAuYWxsKHBvb2xba0NsaWVudHNdLm1hcChjID0+IGMuY2xvc2UoKSkpXG4gICAgICAgICAgLnRoZW4ocG9vbFtrQ2xvc2VkUmVzb2x2ZV0pXG4gICAgICB9XG4gICAgfVxuXG4gICAgdGhpc1trT25Db25uZWN0XSA9IChvcmlnaW4sIHRhcmdldHMpID0+IHtcbiAgICAgIHBvb2wuZW1pdCgnY29ubmVjdCcsIG9yaWdpbiwgW3Bvb2wsIC4uLnRhcmdldHNdKVxuICAgIH1cblxuICAgIHRoaXNba09uRGlzY29ubmVjdF0gPSAob3JpZ2luLCB0YXJnZXRzLCBlcnIpID0+IHtcbiAgICAgIHBvb2wuZW1pdCgnZGlzY29ubmVjdCcsIG9yaWdpbiwgW3Bvb2wsIC4uLnRhcmdldHNdLCBlcnIpXG4gICAgfVxuXG4gICAgdGhpc1trT25Db25uZWN0aW9uRXJyb3JdID0gKG9yaWdpbiwgdGFyZ2V0cywgZXJyKSA9PiB7XG4gICAgICBwb29sLmVtaXQoJ2Nvbm5lY3Rpb25FcnJvcicsIG9yaWdpbiwgW3Bvb2wsIC4uLnRhcmdldHNdLCBlcnIpXG4gICAgfVxuXG4gICAgdGhpc1trU3RhdHNdID0gbmV3IFBvb2xTdGF0cyh0aGlzKVxuICB9XG5cbiAgZ2V0IFtrQnVzeV0gKCkge1xuICAgIHJldHVybiB0aGlzW2tOZWVkRHJhaW5dXG4gIH1cblxuICBnZXQgW2tDb25uZWN0ZWRdICgpIHtcbiAgICByZXR1cm4gdGhpc1trQ2xpZW50c10uZmlsdGVyKGNsaWVudCA9PiBjbGllbnRba0Nvbm5lY3RlZF0pLmxlbmd0aFxuICB9XG5cbiAgZ2V0IFtrRnJlZV0gKCkge1xuICAgIHJldHVybiB0aGlzW2tDbGllbnRzXS5maWx0ZXIoY2xpZW50ID0+IGNsaWVudFtrQ29ubmVjdGVkXSAmJiAhY2xpZW50W2tOZWVkRHJhaW5dKS5sZW5ndGhcbiAgfVxuXG4gIGdldCBba1BlbmRpbmddICgpIHtcbiAgICBsZXQgcmV0ID0gdGhpc1trUXVldWVkXVxuICAgIGZvciAoY29uc3QgeyBba1BlbmRpbmddOiBwZW5kaW5nIH0gb2YgdGhpc1trQ2xpZW50c10pIHtcbiAgICAgIHJldCArPSBwZW5kaW5nXG4gICAgfVxuICAgIHJldHVybiByZXRcbiAgfVxuXG4gIGdldCBba1J1bm5pbmddICgpIHtcbiAgICBsZXQgcmV0ID0gMFxuICAgIGZvciAoY29uc3QgeyBba1J1bm5pbmddOiBydW5uaW5nIH0gb2YgdGhpc1trQ2xpZW50c10pIHtcbiAgICAgIHJldCArPSBydW5uaW5nXG4gICAgfVxuICAgIHJldHVybiByZXRcbiAgfVxuXG4gIGdldCBba1NpemVdICgpIHtcbiAgICBsZXQgcmV0ID0gdGhpc1trUXVldWVkXVxuICAgIGZvciAoY29uc3QgeyBba1NpemVdOiBzaXplIH0gb2YgdGhpc1trQ2xpZW50c10pIHtcbiAgICAgIHJldCArPSBzaXplXG4gICAgfVxuICAgIHJldHVybiByZXRcbiAgfVxuXG4gIGdldCBzdGF0cyAoKSB7XG4gICAgcmV0dXJuIHRoaXNba1N0YXRzXVxuICB9XG5cbiAgYXN5bmMgW2tDbG9zZV0gKCkge1xuICAgIGlmICh0aGlzW2tRdWV1ZV0uaXNFbXB0eSgpKSB7XG4gICAgICByZXR1cm4gUHJvbWlzZS5hbGwodGhpc1trQ2xpZW50c10ubWFwKGMgPT4gYy5jbG9zZSgpKSlcbiAgICB9IGVsc2Uge1xuICAgICAgcmV0dXJuIG5ldyBQcm9taXNlKChyZXNvbHZlKSA9PiB7XG4gICAgICAgIHRoaXNba0Nsb3NlZFJlc29sdmVdID0gcmVzb2x2ZVxuICAgICAgfSlcbiAgICB9XG4gIH1cblxuICBhc3luYyBba0Rlc3Ryb3ldIChlcnIpIHtcbiAgICB3aGlsZSAodHJ1ZSkge1xuICAgICAgY29uc3QgaXRlbSA9IHRoaXNba1F1ZXVlXS5zaGlmdCgpXG4gICAgICBpZiAoIWl0ZW0pIHtcbiAgICAgICAgYnJlYWtcbiAgICAgIH1cbiAgICAgIGl0ZW0uaGFuZGxlci5vbkVycm9yKGVycilcbiAgICB9XG5cbiAgICByZXR1cm4gUHJvbWlzZS5hbGwodGhpc1trQ2xpZW50c10ubWFwKGMgPT4gYy5kZXN0cm95KGVycikpKVxuICB9XG5cbiAgW2tEaXNwYXRjaF0gKG9wdHMsIGhhbmRsZXIpIHtcbiAgICBjb25zdCBkaXNwYXRjaGVyID0gdGhpc1trR2V0RGlzcGF0Y2hlcl0oKVxuXG4gICAgaWYgKCFkaXNwYXRjaGVyKSB7XG4gICAgICB0aGlzW2tOZWVkRHJhaW5dID0gdHJ1ZVxuICAgICAgdGhpc1trUXVldWVdLnB1c2goeyBvcHRzLCBoYW5kbGVyIH0pXG4gICAgICB0aGlzW2tRdWV1ZWRdKytcbiAgICB9IGVsc2UgaWYgKCFkaXNwYXRjaGVyLmRpc3BhdGNoKG9wdHMsIGhhbmRsZXIpKSB7XG4gICAgICBkaXNwYXRjaGVyW2tOZWVkRHJhaW5dID0gdHJ1ZVxuICAgICAgdGhpc1trTmVlZERyYWluXSA9ICF0aGlzW2tHZXREaXNwYXRjaGVyXSgpXG4gICAgfVxuXG4gICAgcmV0dXJuICF0aGlzW2tOZWVkRHJhaW5dXG4gIH1cblxuICBba0FkZENsaWVudF0gKGNsaWVudCkge1xuICAgIGNsaWVudFxuICAgICAgLm9uKCdkcmFpbicsIHRoaXNba09uRHJhaW5dKVxuICAgICAgLm9uKCdjb25uZWN0JywgdGhpc1trT25Db25uZWN0XSlcbiAgICAgIC5vbignZGlzY29ubmVjdCcsIHRoaXNba09uRGlzY29ubmVjdF0pXG4gICAgICAub24oJ2Nvbm5lY3Rpb25FcnJvcicsIHRoaXNba09uQ29ubmVjdGlvbkVycm9yXSlcblxuICAgIHRoaXNba0NsaWVudHNdLnB1c2goY2xpZW50KVxuXG4gICAgaWYgKHRoaXNba05lZWREcmFpbl0pIHtcbiAgICAgIHByb2Nlc3MubmV4dFRpY2soKCkgPT4ge1xuICAgICAgICBpZiAodGhpc1trTmVlZERyYWluXSkge1xuICAgICAgICAgIHRoaXNba09uRHJhaW5dKGNsaWVudFtrVXJsXSwgW3RoaXMsIGNsaWVudF0pXG4gICAgICAgIH1cbiAgICAgIH0pXG4gICAgfVxuXG4gICAgcmV0dXJuIHRoaXNcbiAgfVxuXG4gIFtrUmVtb3ZlQ2xpZW50XSAoY2xpZW50KSB7XG4gICAgY2xpZW50LmNsb3NlKCgpID0+IHtcbiAgICAgIGNvbnN0IGlkeCA9IHRoaXNba0NsaWVudHNdLmluZGV4T2YoY2xpZW50KVxuICAgICAgaWYgKGlkeCAhPT0gLTEpIHtcbiAgICAgICAgdGhpc1trQ2xpZW50c10uc3BsaWNlKGlkeCwgMSlcbiAgICAgIH1cbiAgICB9KVxuXG4gICAgdGhpc1trTmVlZERyYWluXSA9IHRoaXNba0NsaWVudHNdLnNvbWUoZGlzcGF0Y2hlciA9PiAoXG4gICAgICAhZGlzcGF0Y2hlcltrTmVlZERyYWluXSAmJlxuICAgICAgZGlzcGF0Y2hlci5jbG9zZWQgIT09IHRydWUgJiZcbiAgICAgIGRpc3BhdGNoZXIuZGVzdHJveWVkICE9PSB0cnVlXG4gICAgKSlcbiAgfVxufVxuXG5tb2R1bGUuZXhwb3J0cyA9IHtcbiAgUG9vbEJhc2UsXG4gIGtDbGllbnRzLFxuICBrTmVlZERyYWluLFxuICBrQWRkQ2xpZW50LFxuICBrUmVtb3ZlQ2xpZW50LFxuICBrR2V0RGlzcGF0Y2hlclxufVxuIiwKICAgICIndXNlIHN0cmljdCdcblxuY29uc3Qge1xuICBQb29sQmFzZSxcbiAga0NsaWVudHMsXG4gIGtOZWVkRHJhaW4sXG4gIGtBZGRDbGllbnQsXG4gIGtHZXREaXNwYXRjaGVyXG59ID0gcmVxdWlyZSgnLi9wb29sLWJhc2UnKVxuY29uc3QgQ2xpZW50ID0gcmVxdWlyZSgnLi9jbGllbnQnKVxuY29uc3Qge1xuICBJbnZhbGlkQXJndW1lbnRFcnJvclxufSA9IHJlcXVpcmUoJy4vY29yZS9lcnJvcnMnKVxuY29uc3QgdXRpbCA9IHJlcXVpcmUoJy4vY29yZS91dGlsJylcbmNvbnN0IHsga1VybCwga0ludGVyY2VwdG9ycyB9ID0gcmVxdWlyZSgnLi9jb3JlL3N5bWJvbHMnKVxuY29uc3QgYnVpbGRDb25uZWN0b3IgPSByZXF1aXJlKCcuL2NvcmUvY29ubmVjdCcpXG5cbmNvbnN0IGtPcHRpb25zID0gU3ltYm9sKCdvcHRpb25zJylcbmNvbnN0IGtDb25uZWN0aW9ucyA9IFN5bWJvbCgnY29ubmVjdGlvbnMnKVxuY29uc3Qga0ZhY3RvcnkgPSBTeW1ib2woJ2ZhY3RvcnknKVxuXG5mdW5jdGlvbiBkZWZhdWx0RmFjdG9yeSAob3JpZ2luLCBvcHRzKSB7XG4gIHJldHVybiBuZXcgQ2xpZW50KG9yaWdpbiwgb3B0cylcbn1cblxuY2xhc3MgUG9vbCBleHRlbmRzIFBvb2xCYXNlIHtcbiAgY29uc3RydWN0b3IgKG9yaWdpbiwge1xuICAgIGNvbm5lY3Rpb25zLFxuICAgIGZhY3RvcnkgPSBkZWZhdWx0RmFjdG9yeSxcbiAgICBjb25uZWN0LFxuICAgIGNvbm5lY3RUaW1lb3V0LFxuICAgIHRscyxcbiAgICBtYXhDYWNoZWRTZXNzaW9ucyxcbiAgICBzb2NrZXRQYXRoLFxuICAgIGF1dG9TZWxlY3RGYW1pbHksXG4gICAgYXV0b1NlbGVjdEZhbWlseUF0dGVtcHRUaW1lb3V0LFxuICAgIGFsbG93SDIsXG4gICAgLi4ub3B0aW9uc1xuICB9ID0ge30pIHtcbiAgICBzdXBlcigpXG5cbiAgICBpZiAoY29ubmVjdGlvbnMgIT0gbnVsbCAmJiAoIU51bWJlci5pc0Zpbml0ZShjb25uZWN0aW9ucykgfHwgY29ubmVjdGlvbnMgPCAwKSkge1xuICAgICAgdGhyb3cgbmV3IEludmFsaWRBcmd1bWVudEVycm9yKCdpbnZhbGlkIGNvbm5lY3Rpb25zJylcbiAgICB9XG5cbiAgICBpZiAodHlwZW9mIGZhY3RvcnkgIT09ICdmdW5jdGlvbicpIHtcbiAgICAgIHRocm93IG5ldyBJbnZhbGlkQXJndW1lbnRFcnJvcignZmFjdG9yeSBtdXN0IGJlIGEgZnVuY3Rpb24uJylcbiAgICB9XG5cbiAgICBpZiAoY29ubmVjdCAhPSBudWxsICYmIHR5cGVvZiBjb25uZWN0ICE9PSAnZnVuY3Rpb24nICYmIHR5cGVvZiBjb25uZWN0ICE9PSAnb2JqZWN0Jykge1xuICAgICAgdGhyb3cgbmV3IEludmFsaWRBcmd1bWVudEVycm9yKCdjb25uZWN0IG11c3QgYmUgYSBmdW5jdGlvbiBvciBhbiBvYmplY3QnKVxuICAgIH1cblxuICAgIGlmICh0eXBlb2YgY29ubmVjdCAhPT0gJ2Z1bmN0aW9uJykge1xuICAgICAgY29ubmVjdCA9IGJ1aWxkQ29ubmVjdG9yKHtcbiAgICAgICAgLi4udGxzLFxuICAgICAgICBtYXhDYWNoZWRTZXNzaW9ucyxcbiAgICAgICAgYWxsb3dIMixcbiAgICAgICAgc29ja2V0UGF0aCxcbiAgICAgICAgdGltZW91dDogY29ubmVjdFRpbWVvdXQsXG4gICAgICAgIC4uLih1dGlsLm5vZGVIYXNBdXRvU2VsZWN0RmFtaWx5ICYmIGF1dG9TZWxlY3RGYW1pbHkgPyB7IGF1dG9TZWxlY3RGYW1pbHksIGF1dG9TZWxlY3RGYW1pbHlBdHRlbXB0VGltZW91dCB9IDogdW5kZWZpbmVkKSxcbiAgICAgICAgLi4uY29ubmVjdFxuICAgICAgfSlcbiAgICB9XG5cbiAgICB0aGlzW2tJbnRlcmNlcHRvcnNdID0gb3B0aW9ucy5pbnRlcmNlcHRvcnMgJiYgb3B0aW9ucy5pbnRlcmNlcHRvcnMuUG9vbCAmJiBBcnJheS5pc0FycmF5KG9wdGlvbnMuaW50ZXJjZXB0b3JzLlBvb2wpXG4gICAgICA/IG9wdGlvbnMuaW50ZXJjZXB0b3JzLlBvb2xcbiAgICAgIDogW11cbiAgICB0aGlzW2tDb25uZWN0aW9uc10gPSBjb25uZWN0aW9ucyB8fCBudWxsXG4gICAgdGhpc1trVXJsXSA9IHV0aWwucGFyc2VPcmlnaW4ob3JpZ2luKVxuICAgIHRoaXNba09wdGlvbnNdID0geyAuLi51dGlsLmRlZXBDbG9uZShvcHRpb25zKSwgY29ubmVjdCwgYWxsb3dIMiB9XG4gICAgdGhpc1trT3B0aW9uc10uaW50ZXJjZXB0b3JzID0gb3B0aW9ucy5pbnRlcmNlcHRvcnNcbiAgICAgID8geyAuLi5vcHRpb25zLmludGVyY2VwdG9ycyB9XG4gICAgICA6IHVuZGVmaW5lZFxuICAgIHRoaXNba0ZhY3RvcnldID0gZmFjdG9yeVxuICB9XG5cbiAgW2tHZXREaXNwYXRjaGVyXSAoKSB7XG4gICAgbGV0IGRpc3BhdGNoZXIgPSB0aGlzW2tDbGllbnRzXS5maW5kKGRpc3BhdGNoZXIgPT4gIWRpc3BhdGNoZXJba05lZWREcmFpbl0pXG5cbiAgICBpZiAoZGlzcGF0Y2hlcikge1xuICAgICAgcmV0dXJuIGRpc3BhdGNoZXJcbiAgICB9XG5cbiAgICBpZiAoIXRoaXNba0Nvbm5lY3Rpb25zXSB8fCB0aGlzW2tDbGllbnRzXS5sZW5ndGggPCB0aGlzW2tDb25uZWN0aW9uc10pIHtcbiAgICAgIGRpc3BhdGNoZXIgPSB0aGlzW2tGYWN0b3J5XSh0aGlzW2tVcmxdLCB0aGlzW2tPcHRpb25zXSlcbiAgICAgIHRoaXNba0FkZENsaWVudF0oZGlzcGF0Y2hlcilcbiAgICB9XG5cbiAgICByZXR1cm4gZGlzcGF0Y2hlclxuICB9XG59XG5cbm1vZHVsZS5leHBvcnRzID0gUG9vbFxuIiwKICAgICIndXNlIHN0cmljdCdcblxuY29uc3Qge1xuICBCYWxhbmNlZFBvb2xNaXNzaW5nVXBzdHJlYW1FcnJvcixcbiAgSW52YWxpZEFyZ3VtZW50RXJyb3Jcbn0gPSByZXF1aXJlKCcuL2NvcmUvZXJyb3JzJylcbmNvbnN0IHtcbiAgUG9vbEJhc2UsXG4gIGtDbGllbnRzLFxuICBrTmVlZERyYWluLFxuICBrQWRkQ2xpZW50LFxuICBrUmVtb3ZlQ2xpZW50LFxuICBrR2V0RGlzcGF0Y2hlclxufSA9IHJlcXVpcmUoJy4vcG9vbC1iYXNlJylcbmNvbnN0IFBvb2wgPSByZXF1aXJlKCcuL3Bvb2wnKVxuY29uc3QgeyBrVXJsLCBrSW50ZXJjZXB0b3JzIH0gPSByZXF1aXJlKCcuL2NvcmUvc3ltYm9scycpXG5jb25zdCB7IHBhcnNlT3JpZ2luIH0gPSByZXF1aXJlKCcuL2NvcmUvdXRpbCcpXG5jb25zdCBrRmFjdG9yeSA9IFN5bWJvbCgnZmFjdG9yeScpXG5cbmNvbnN0IGtPcHRpb25zID0gU3ltYm9sKCdvcHRpb25zJylcbmNvbnN0IGtHcmVhdGVzdENvbW1vbkRpdmlzb3IgPSBTeW1ib2woJ2tHcmVhdGVzdENvbW1vbkRpdmlzb3InKVxuY29uc3Qga0N1cnJlbnRXZWlnaHQgPSBTeW1ib2woJ2tDdXJyZW50V2VpZ2h0JylcbmNvbnN0IGtJbmRleCA9IFN5bWJvbCgna0luZGV4JylcbmNvbnN0IGtXZWlnaHQgPSBTeW1ib2woJ2tXZWlnaHQnKVxuY29uc3Qga01heFdlaWdodFBlclNlcnZlciA9IFN5bWJvbCgna01heFdlaWdodFBlclNlcnZlcicpXG5jb25zdCBrRXJyb3JQZW5hbHR5ID0gU3ltYm9sKCdrRXJyb3JQZW5hbHR5JylcblxuZnVuY3Rpb24gZ2V0R3JlYXRlc3RDb21tb25EaXZpc29yIChhLCBiKSB7XG4gIGlmIChiID09PSAwKSByZXR1cm4gYVxuICByZXR1cm4gZ2V0R3JlYXRlc3RDb21tb25EaXZpc29yKGIsIGEgJSBiKVxufVxuXG5mdW5jdGlvbiBkZWZhdWx0RmFjdG9yeSAob3JpZ2luLCBvcHRzKSB7XG4gIHJldHVybiBuZXcgUG9vbChvcmlnaW4sIG9wdHMpXG59XG5cbmNsYXNzIEJhbGFuY2VkUG9vbCBleHRlbmRzIFBvb2xCYXNlIHtcbiAgY29uc3RydWN0b3IgKHVwc3RyZWFtcyA9IFtdLCB7IGZhY3RvcnkgPSBkZWZhdWx0RmFjdG9yeSwgLi4ub3B0cyB9ID0ge30pIHtcbiAgICBzdXBlcigpXG5cbiAgICB0aGlzW2tPcHRpb25zXSA9IG9wdHNcbiAgICB0aGlzW2tJbmRleF0gPSAtMVxuICAgIHRoaXNba0N1cnJlbnRXZWlnaHRdID0gMFxuXG4gICAgdGhpc1trTWF4V2VpZ2h0UGVyU2VydmVyXSA9IHRoaXNba09wdGlvbnNdLm1heFdlaWdodFBlclNlcnZlciB8fCAxMDBcbiAgICB0aGlzW2tFcnJvclBlbmFsdHldID0gdGhpc1trT3B0aW9uc10uZXJyb3JQZW5hbHR5IHx8IDE1XG5cbiAgICBpZiAoIUFycmF5LmlzQXJyYXkodXBzdHJlYW1zKSkge1xuICAgICAgdXBzdHJlYW1zID0gW3Vwc3RyZWFtc11cbiAgICB9XG5cbiAgICBpZiAodHlwZW9mIGZhY3RvcnkgIT09ICdmdW5jdGlvbicpIHtcbiAgICAgIHRocm93IG5ldyBJbnZhbGlkQXJndW1lbnRFcnJvcignZmFjdG9yeSBtdXN0IGJlIGEgZnVuY3Rpb24uJylcbiAgICB9XG5cbiAgICB0aGlzW2tJbnRlcmNlcHRvcnNdID0gb3B0cy5pbnRlcmNlcHRvcnMgJiYgb3B0cy5pbnRlcmNlcHRvcnMuQmFsYW5jZWRQb29sICYmIEFycmF5LmlzQXJyYXkob3B0cy5pbnRlcmNlcHRvcnMuQmFsYW5jZWRQb29sKVxuICAgICAgPyBvcHRzLmludGVyY2VwdG9ycy5CYWxhbmNlZFBvb2xcbiAgICAgIDogW11cbiAgICB0aGlzW2tGYWN0b3J5XSA9IGZhY3RvcnlcblxuICAgIGZvciAoY29uc3QgdXBzdHJlYW0gb2YgdXBzdHJlYW1zKSB7XG4gICAgICB0aGlzLmFkZFVwc3RyZWFtKHVwc3RyZWFtKVxuICAgIH1cbiAgICB0aGlzLl91cGRhdGVCYWxhbmNlZFBvb2xTdGF0cygpXG4gIH1cblxuICBhZGRVcHN0cmVhbSAodXBzdHJlYW0pIHtcbiAgICBjb25zdCB1cHN0cmVhbU9yaWdpbiA9IHBhcnNlT3JpZ2luKHVwc3RyZWFtKS5vcmlnaW5cblxuICAgIGlmICh0aGlzW2tDbGllbnRzXS5maW5kKChwb29sKSA9PiAoXG4gICAgICBwb29sW2tVcmxdLm9yaWdpbiA9PT0gdXBzdHJlYW1PcmlnaW4gJiZcbiAgICAgIHBvb2wuY2xvc2VkICE9PSB0cnVlICYmXG4gICAgICBwb29sLmRlc3Ryb3llZCAhPT0gdHJ1ZVxuICAgICkpKSB7XG4gICAgICByZXR1cm4gdGhpc1xuICAgIH1cbiAgICBjb25zdCBwb29sID0gdGhpc1trRmFjdG9yeV0odXBzdHJlYW1PcmlnaW4sIE9iamVjdC5hc3NpZ24oe30sIHRoaXNba09wdGlvbnNdKSlcblxuICAgIHRoaXNba0FkZENsaWVudF0ocG9vbClcbiAgICBwb29sLm9uKCdjb25uZWN0JywgKCkgPT4ge1xuICAgICAgcG9vbFtrV2VpZ2h0XSA9IE1hdGgubWluKHRoaXNba01heFdlaWdodFBlclNlcnZlcl0sIHBvb2xba1dlaWdodF0gKyB0aGlzW2tFcnJvclBlbmFsdHldKVxuICAgIH0pXG5cbiAgICBwb29sLm9uKCdjb25uZWN0aW9uRXJyb3InLCAoKSA9PiB7XG4gICAgICBwb29sW2tXZWlnaHRdID0gTWF0aC5tYXgoMSwgcG9vbFtrV2VpZ2h0XSAtIHRoaXNba0Vycm9yUGVuYWx0eV0pXG4gICAgICB0aGlzLl91cGRhdGVCYWxhbmNlZFBvb2xTdGF0cygpXG4gICAgfSlcblxuICAgIHBvb2wub24oJ2Rpc2Nvbm5lY3QnLCAoLi4uYXJncykgPT4ge1xuICAgICAgY29uc3QgZXJyID0gYXJnc1syXVxuICAgICAgaWYgKGVyciAmJiBlcnIuY29kZSA9PT0gJ1VORF9FUlJfU09DS0VUJykge1xuICAgICAgICAvLyBkZWNyZWFzZSB0aGUgd2VpZ2h0IG9mIHRoZSBwb29sLlxuICAgICAgICBwb29sW2tXZWlnaHRdID0gTWF0aC5tYXgoMSwgcG9vbFtrV2VpZ2h0XSAtIHRoaXNba0Vycm9yUGVuYWx0eV0pXG4gICAgICAgIHRoaXMuX3VwZGF0ZUJhbGFuY2VkUG9vbFN0YXRzKClcbiAgICAgIH1cbiAgICB9KVxuXG4gICAgZm9yIChjb25zdCBjbGllbnQgb2YgdGhpc1trQ2xpZW50c10pIHtcbiAgICAgIGNsaWVudFtrV2VpZ2h0XSA9IHRoaXNba01heFdlaWdodFBlclNlcnZlcl1cbiAgICB9XG5cbiAgICB0aGlzLl91cGRhdGVCYWxhbmNlZFBvb2xTdGF0cygpXG5cbiAgICByZXR1cm4gdGhpc1xuICB9XG5cbiAgX3VwZGF0ZUJhbGFuY2VkUG9vbFN0YXRzICgpIHtcbiAgICB0aGlzW2tHcmVhdGVzdENvbW1vbkRpdmlzb3JdID0gdGhpc1trQ2xpZW50c10ubWFwKHAgPT4gcFtrV2VpZ2h0XSkucmVkdWNlKGdldEdyZWF0ZXN0Q29tbW9uRGl2aXNvciwgMClcbiAgfVxuXG4gIHJlbW92ZVVwc3RyZWFtICh1cHN0cmVhbSkge1xuICAgIGNvbnN0IHVwc3RyZWFtT3JpZ2luID0gcGFyc2VPcmlnaW4odXBzdHJlYW0pLm9yaWdpblxuXG4gICAgY29uc3QgcG9vbCA9IHRoaXNba0NsaWVudHNdLmZpbmQoKHBvb2wpID0+IChcbiAgICAgIHBvb2xba1VybF0ub3JpZ2luID09PSB1cHN0cmVhbU9yaWdpbiAmJlxuICAgICAgcG9vbC5jbG9zZWQgIT09IHRydWUgJiZcbiAgICAgIHBvb2wuZGVzdHJveWVkICE9PSB0cnVlXG4gICAgKSlcblxuICAgIGlmIChwb29sKSB7XG4gICAgICB0aGlzW2tSZW1vdmVDbGllbnRdKHBvb2wpXG4gICAgfVxuXG4gICAgcmV0dXJuIHRoaXNcbiAgfVxuXG4gIGdldCB1cHN0cmVhbXMgKCkge1xuICAgIHJldHVybiB0aGlzW2tDbGllbnRzXVxuICAgICAgLmZpbHRlcihkaXNwYXRjaGVyID0+IGRpc3BhdGNoZXIuY2xvc2VkICE9PSB0cnVlICYmIGRpc3BhdGNoZXIuZGVzdHJveWVkICE9PSB0cnVlKVxuICAgICAgLm1hcCgocCkgPT4gcFtrVXJsXS5vcmlnaW4pXG4gIH1cblxuICBba0dldERpc3BhdGNoZXJdICgpIHtcbiAgICAvLyBXZSB2YWxpZGF0ZSB0aGF0IHBvb2xzIGlzIGdyZWF0ZXIgdGhhbiAwLFxuICAgIC8vIG90aGVyd2lzZSB3ZSB3b3VsZCBoYXZlIHRvIHdhaXQgdW50aWwgYW4gdXBzdHJlYW1cbiAgICAvLyBpcyBhZGRlZCwgd2hpY2ggbWlnaHQgbmV2ZXIgaGFwcGVuLlxuICAgIGlmICh0aGlzW2tDbGllbnRzXS5sZW5ndGggPT09IDApIHtcbiAgICAgIHRocm93IG5ldyBCYWxhbmNlZFBvb2xNaXNzaW5nVXBzdHJlYW1FcnJvcigpXG4gICAgfVxuXG4gICAgY29uc3QgZGlzcGF0Y2hlciA9IHRoaXNba0NsaWVudHNdLmZpbmQoZGlzcGF0Y2hlciA9PiAoXG4gICAgICAhZGlzcGF0Y2hlcltrTmVlZERyYWluXSAmJlxuICAgICAgZGlzcGF0Y2hlci5jbG9zZWQgIT09IHRydWUgJiZcbiAgICAgIGRpc3BhdGNoZXIuZGVzdHJveWVkICE9PSB0cnVlXG4gICAgKSlcblxuICAgIGlmICghZGlzcGF0Y2hlcikge1xuICAgICAgcmV0dXJuXG4gICAgfVxuXG4gICAgY29uc3QgYWxsQ2xpZW50c0J1c3kgPSB0aGlzW2tDbGllbnRzXS5tYXAocG9vbCA9PiBwb29sW2tOZWVkRHJhaW5dKS5yZWR1Y2UoKGEsIGIpID0+IGEgJiYgYiwgdHJ1ZSlcblxuICAgIGlmIChhbGxDbGllbnRzQnVzeSkge1xuICAgICAgcmV0dXJuXG4gICAgfVxuXG4gICAgbGV0IGNvdW50ZXIgPSAwXG5cbiAgICBsZXQgbWF4V2VpZ2h0SW5kZXggPSB0aGlzW2tDbGllbnRzXS5maW5kSW5kZXgocG9vbCA9PiAhcG9vbFtrTmVlZERyYWluXSlcblxuICAgIHdoaWxlIChjb3VudGVyKysgPCB0aGlzW2tDbGllbnRzXS5sZW5ndGgpIHtcbiAgICAgIHRoaXNba0luZGV4XSA9ICh0aGlzW2tJbmRleF0gKyAxKSAlIHRoaXNba0NsaWVudHNdLmxlbmd0aFxuICAgICAgY29uc3QgcG9vbCA9IHRoaXNba0NsaWVudHNdW3RoaXNba0luZGV4XV1cblxuICAgICAgLy8gZmluZCBwb29sIGluZGV4IHdpdGggdGhlIGxhcmdlc3Qgd2VpZ2h0XG4gICAgICBpZiAocG9vbFtrV2VpZ2h0XSA+IHRoaXNba0NsaWVudHNdW21heFdlaWdodEluZGV4XVtrV2VpZ2h0XSAmJiAhcG9vbFtrTmVlZERyYWluXSkge1xuICAgICAgICBtYXhXZWlnaHRJbmRleCA9IHRoaXNba0luZGV4XVxuICAgICAgfVxuXG4gICAgICAvLyBkZWNyZWFzZSB0aGUgY3VycmVudCB3ZWlnaHQgZXZlcnkgYHRoaXNba0NsaWVudHNdLmxlbmd0aGAuXG4gICAgICBpZiAodGhpc1trSW5kZXhdID09PSAwKSB7XG4gICAgICAgIC8vIFNldCB0aGUgY3VycmVudCB3ZWlnaHQgdG8gdGhlIG5leHQgbG93ZXIgd2VpZ2h0LlxuICAgICAgICB0aGlzW2tDdXJyZW50V2VpZ2h0XSA9IHRoaXNba0N1cnJlbnRXZWlnaHRdIC0gdGhpc1trR3JlYXRlc3RDb21tb25EaXZpc29yXVxuXG4gICAgICAgIGlmICh0aGlzW2tDdXJyZW50V2VpZ2h0XSA8PSAwKSB7XG4gICAgICAgICAgdGhpc1trQ3VycmVudFdlaWdodF0gPSB0aGlzW2tNYXhXZWlnaHRQZXJTZXJ2ZXJdXG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIGlmIChwb29sW2tXZWlnaHRdID49IHRoaXNba0N1cnJlbnRXZWlnaHRdICYmICghcG9vbFtrTmVlZERyYWluXSkpIHtcbiAgICAgICAgcmV0dXJuIHBvb2xcbiAgICAgIH1cbiAgICB9XG5cbiAgICB0aGlzW2tDdXJyZW50V2VpZ2h0XSA9IHRoaXNba0NsaWVudHNdW21heFdlaWdodEluZGV4XVtrV2VpZ2h0XVxuICAgIHRoaXNba0luZGV4XSA9IG1heFdlaWdodEluZGV4XG4gICAgcmV0dXJuIHRoaXNba0NsaWVudHNdW21heFdlaWdodEluZGV4XVxuICB9XG59XG5cbm1vZHVsZS5leHBvcnRzID0gQmFsYW5jZWRQb29sXG4iLAogICAgIid1c2Ugc3RyaWN0J1xuXG4vKiBpc3RhbmJ1bCBpZ25vcmUgZmlsZTogb25seSBmb3IgTm9kZSAxMiAqL1xuXG5jb25zdCB7IGtDb25uZWN0ZWQsIGtTaXplIH0gPSByZXF1aXJlKCcuLi9jb3JlL3N5bWJvbHMnKVxuXG5jbGFzcyBDb21wYXRXZWFrUmVmIHtcbiAgY29uc3RydWN0b3IgKHZhbHVlKSB7XG4gICAgdGhpcy52YWx1ZSA9IHZhbHVlXG4gIH1cblxuICBkZXJlZiAoKSB7XG4gICAgcmV0dXJuIHRoaXMudmFsdWVba0Nvbm5lY3RlZF0gPT09IDAgJiYgdGhpcy52YWx1ZVtrU2l6ZV0gPT09IDBcbiAgICAgID8gdW5kZWZpbmVkXG4gICAgICA6IHRoaXMudmFsdWVcbiAgfVxufVxuXG5jbGFzcyBDb21wYXRGaW5hbGl6ZXIge1xuICBjb25zdHJ1Y3RvciAoZmluYWxpemVyKSB7XG4gICAgdGhpcy5maW5hbGl6ZXIgPSBmaW5hbGl6ZXJcbiAgfVxuXG4gIHJlZ2lzdGVyIChkaXNwYXRjaGVyLCBrZXkpIHtcbiAgICBpZiAoZGlzcGF0Y2hlci5vbikge1xuICAgICAgZGlzcGF0Y2hlci5vbignZGlzY29ubmVjdCcsICgpID0+IHtcbiAgICAgICAgaWYgKGRpc3BhdGNoZXJba0Nvbm5lY3RlZF0gPT09IDAgJiYgZGlzcGF0Y2hlcltrU2l6ZV0gPT09IDApIHtcbiAgICAgICAgICB0aGlzLmZpbmFsaXplcihrZXkpXG4gICAgICAgIH1cbiAgICAgIH0pXG4gICAgfVxuICB9XG59XG5cbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gKCkge1xuICAvLyBGSVhNRTogcmVtb3ZlIHdvcmthcm91bmQgd2hlbiB0aGUgTm9kZSBidWcgaXMgZml4ZWRcbiAgLy8gaHR0cHM6Ly9naXRodWIuY29tL25vZGVqcy9ub2RlL2lzc3Vlcy80OTM0NCNpc3N1ZWNvbW1lbnQtMTc0MTc3NjMwOFxuICBpZiAocHJvY2Vzcy5lbnYuTk9ERV9WOF9DT1ZFUkFHRSkge1xuICAgIHJldHVybiB7XG4gICAgICBXZWFrUmVmOiBDb21wYXRXZWFrUmVmLFxuICAgICAgRmluYWxpemF0aW9uUmVnaXN0cnk6IENvbXBhdEZpbmFsaXplclxuICAgIH1cbiAgfVxuICByZXR1cm4ge1xuICAgIFdlYWtSZWY6IGdsb2JhbC5XZWFrUmVmIHx8IENvbXBhdFdlYWtSZWYsXG4gICAgRmluYWxpemF0aW9uUmVnaXN0cnk6IGdsb2JhbC5GaW5hbGl6YXRpb25SZWdpc3RyeSB8fCBDb21wYXRGaW5hbGl6ZXJcbiAgfVxufVxuIiwKICAgICIndXNlIHN0cmljdCdcblxuY29uc3QgeyBJbnZhbGlkQXJndW1lbnRFcnJvciB9ID0gcmVxdWlyZSgnLi9jb3JlL2Vycm9ycycpXG5jb25zdCB7IGtDbGllbnRzLCBrUnVubmluZywga0Nsb3NlLCBrRGVzdHJveSwga0Rpc3BhdGNoLCBrSW50ZXJjZXB0b3JzIH0gPSByZXF1aXJlKCcuL2NvcmUvc3ltYm9scycpXG5jb25zdCBEaXNwYXRjaGVyQmFzZSA9IHJlcXVpcmUoJy4vZGlzcGF0Y2hlci1iYXNlJylcbmNvbnN0IFBvb2wgPSByZXF1aXJlKCcuL3Bvb2wnKVxuY29uc3QgQ2xpZW50ID0gcmVxdWlyZSgnLi9jbGllbnQnKVxuY29uc3QgdXRpbCA9IHJlcXVpcmUoJy4vY29yZS91dGlsJylcbmNvbnN0IGNyZWF0ZVJlZGlyZWN0SW50ZXJjZXB0b3IgPSByZXF1aXJlKCcuL2ludGVyY2VwdG9yL3JlZGlyZWN0SW50ZXJjZXB0b3InKVxuY29uc3QgeyBXZWFrUmVmLCBGaW5hbGl6YXRpb25SZWdpc3RyeSB9ID0gcmVxdWlyZSgnLi9jb21wYXQvZGlzcGF0Y2hlci13ZWFrcmVmJykoKVxuXG5jb25zdCBrT25Db25uZWN0ID0gU3ltYm9sKCdvbkNvbm5lY3QnKVxuY29uc3Qga09uRGlzY29ubmVjdCA9IFN5bWJvbCgnb25EaXNjb25uZWN0JylcbmNvbnN0IGtPbkNvbm5lY3Rpb25FcnJvciA9IFN5bWJvbCgnb25Db25uZWN0aW9uRXJyb3InKVxuY29uc3Qga01heFJlZGlyZWN0aW9ucyA9IFN5bWJvbCgnbWF4UmVkaXJlY3Rpb25zJylcbmNvbnN0IGtPbkRyYWluID0gU3ltYm9sKCdvbkRyYWluJylcbmNvbnN0IGtGYWN0b3J5ID0gU3ltYm9sKCdmYWN0b3J5JylcbmNvbnN0IGtGaW5hbGl6ZXIgPSBTeW1ib2woJ2ZpbmFsaXplcicpXG5jb25zdCBrT3B0aW9ucyA9IFN5bWJvbCgnb3B0aW9ucycpXG5cbmZ1bmN0aW9uIGRlZmF1bHRGYWN0b3J5IChvcmlnaW4sIG9wdHMpIHtcbiAgcmV0dXJuIG9wdHMgJiYgb3B0cy5jb25uZWN0aW9ucyA9PT0gMVxuICAgID8gbmV3IENsaWVudChvcmlnaW4sIG9wdHMpXG4gICAgOiBuZXcgUG9vbChvcmlnaW4sIG9wdHMpXG59XG5cbmNsYXNzIEFnZW50IGV4dGVuZHMgRGlzcGF0Y2hlckJhc2Uge1xuICBjb25zdHJ1Y3RvciAoeyBmYWN0b3J5ID0gZGVmYXVsdEZhY3RvcnksIG1heFJlZGlyZWN0aW9ucyA9IDAsIGNvbm5lY3QsIC4uLm9wdGlvbnMgfSA9IHt9KSB7XG4gICAgc3VwZXIoKVxuXG4gICAgaWYgKHR5cGVvZiBmYWN0b3J5ICE9PSAnZnVuY3Rpb24nKSB7XG4gICAgICB0aHJvdyBuZXcgSW52YWxpZEFyZ3VtZW50RXJyb3IoJ2ZhY3RvcnkgbXVzdCBiZSBhIGZ1bmN0aW9uLicpXG4gICAgfVxuXG4gICAgaWYgKGNvbm5lY3QgIT0gbnVsbCAmJiB0eXBlb2YgY29ubmVjdCAhPT0gJ2Z1bmN0aW9uJyAmJiB0eXBlb2YgY29ubmVjdCAhPT0gJ29iamVjdCcpIHtcbiAgICAgIHRocm93IG5ldyBJbnZhbGlkQXJndW1lbnRFcnJvcignY29ubmVjdCBtdXN0IGJlIGEgZnVuY3Rpb24gb3IgYW4gb2JqZWN0JylcbiAgICB9XG5cbiAgICBpZiAoIU51bWJlci5pc0ludGVnZXIobWF4UmVkaXJlY3Rpb25zKSB8fCBtYXhSZWRpcmVjdGlvbnMgPCAwKSB7XG4gICAgICB0aHJvdyBuZXcgSW52YWxpZEFyZ3VtZW50RXJyb3IoJ21heFJlZGlyZWN0aW9ucyBtdXN0IGJlIGEgcG9zaXRpdmUgbnVtYmVyJylcbiAgICB9XG5cbiAgICBpZiAoY29ubmVjdCAmJiB0eXBlb2YgY29ubmVjdCAhPT0gJ2Z1bmN0aW9uJykge1xuICAgICAgY29ubmVjdCA9IHsgLi4uY29ubmVjdCB9XG4gICAgfVxuXG4gICAgdGhpc1trSW50ZXJjZXB0b3JzXSA9IG9wdGlvbnMuaW50ZXJjZXB0b3JzICYmIG9wdGlvbnMuaW50ZXJjZXB0b3JzLkFnZW50ICYmIEFycmF5LmlzQXJyYXkob3B0aW9ucy5pbnRlcmNlcHRvcnMuQWdlbnQpXG4gICAgICA/IG9wdGlvbnMuaW50ZXJjZXB0b3JzLkFnZW50XG4gICAgICA6IFtjcmVhdGVSZWRpcmVjdEludGVyY2VwdG9yKHsgbWF4UmVkaXJlY3Rpb25zIH0pXVxuXG4gICAgdGhpc1trT3B0aW9uc10gPSB7IC4uLnV0aWwuZGVlcENsb25lKG9wdGlvbnMpLCBjb25uZWN0IH1cbiAgICB0aGlzW2tPcHRpb25zXS5pbnRlcmNlcHRvcnMgPSBvcHRpb25zLmludGVyY2VwdG9yc1xuICAgICAgPyB7IC4uLm9wdGlvbnMuaW50ZXJjZXB0b3JzIH1cbiAgICAgIDogdW5kZWZpbmVkXG4gICAgdGhpc1trTWF4UmVkaXJlY3Rpb25zXSA9IG1heFJlZGlyZWN0aW9uc1xuICAgIHRoaXNba0ZhY3RvcnldID0gZmFjdG9yeVxuICAgIHRoaXNba0NsaWVudHNdID0gbmV3IE1hcCgpXG4gICAgdGhpc1trRmluYWxpemVyXSA9IG5ldyBGaW5hbGl6YXRpb25SZWdpc3RyeSgvKiBpc3RhbmJ1bCBpZ25vcmUgbmV4dDogZ2MgaXMgdW5kZXRlcm1pbmlzdGljICovIGtleSA9PiB7XG4gICAgICBjb25zdCByZWYgPSB0aGlzW2tDbGllbnRzXS5nZXQoa2V5KVxuICAgICAgaWYgKHJlZiAhPT0gdW5kZWZpbmVkICYmIHJlZi5kZXJlZigpID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgdGhpc1trQ2xpZW50c10uZGVsZXRlKGtleSlcbiAgICAgIH1cbiAgICB9KVxuXG4gICAgY29uc3QgYWdlbnQgPSB0aGlzXG5cbiAgICB0aGlzW2tPbkRyYWluXSA9IChvcmlnaW4sIHRhcmdldHMpID0+IHtcbiAgICAgIGFnZW50LmVtaXQoJ2RyYWluJywgb3JpZ2luLCBbYWdlbnQsIC4uLnRhcmdldHNdKVxuICAgIH1cblxuICAgIHRoaXNba09uQ29ubmVjdF0gPSAob3JpZ2luLCB0YXJnZXRzKSA9PiB7XG4gICAgICBhZ2VudC5lbWl0KCdjb25uZWN0Jywgb3JpZ2luLCBbYWdlbnQsIC4uLnRhcmdldHNdKVxuICAgIH1cblxuICAgIHRoaXNba09uRGlzY29ubmVjdF0gPSAob3JpZ2luLCB0YXJnZXRzLCBlcnIpID0+IHtcbiAgICAgIGFnZW50LmVtaXQoJ2Rpc2Nvbm5lY3QnLCBvcmlnaW4sIFthZ2VudCwgLi4udGFyZ2V0c10sIGVycilcbiAgICB9XG5cbiAgICB0aGlzW2tPbkNvbm5lY3Rpb25FcnJvcl0gPSAob3JpZ2luLCB0YXJnZXRzLCBlcnIpID0+IHtcbiAgICAgIGFnZW50LmVtaXQoJ2Nvbm5lY3Rpb25FcnJvcicsIG9yaWdpbiwgW2FnZW50LCAuLi50YXJnZXRzXSwgZXJyKVxuICAgIH1cbiAgfVxuXG4gIGdldCBba1J1bm5pbmddICgpIHtcbiAgICBsZXQgcmV0ID0gMFxuICAgIGZvciAoY29uc3QgcmVmIG9mIHRoaXNba0NsaWVudHNdLnZhbHVlcygpKSB7XG4gICAgICBjb25zdCBjbGllbnQgPSByZWYuZGVyZWYoKVxuICAgICAgLyogaXN0YW5idWwgaWdub3JlIG5leHQ6IGdjIGlzIHVuZGV0ZXJtaW5pc3RpYyAqL1xuICAgICAgaWYgKGNsaWVudCkge1xuICAgICAgICByZXQgKz0gY2xpZW50W2tSdW5uaW5nXVxuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gcmV0XG4gIH1cblxuICBba0Rpc3BhdGNoXSAob3B0cywgaGFuZGxlcikge1xuICAgIGxldCBrZXlcbiAgICBpZiAob3B0cy5vcmlnaW4gJiYgKHR5cGVvZiBvcHRzLm9yaWdpbiA9PT0gJ3N0cmluZycgfHwgb3B0cy5vcmlnaW4gaW5zdGFuY2VvZiBVUkwpKSB7XG4gICAgICBrZXkgPSBTdHJpbmcob3B0cy5vcmlnaW4pXG4gICAgfSBlbHNlIHtcbiAgICAgIHRocm93IG5ldyBJbnZhbGlkQXJndW1lbnRFcnJvcignb3B0cy5vcmlnaW4gbXVzdCBiZSBhIG5vbi1lbXB0eSBzdHJpbmcgb3IgVVJMLicpXG4gICAgfVxuXG4gICAgY29uc3QgcmVmID0gdGhpc1trQ2xpZW50c10uZ2V0KGtleSlcblxuICAgIGxldCBkaXNwYXRjaGVyID0gcmVmID8gcmVmLmRlcmVmKCkgOiBudWxsXG4gICAgaWYgKCFkaXNwYXRjaGVyKSB7XG4gICAgICBkaXNwYXRjaGVyID0gdGhpc1trRmFjdG9yeV0ob3B0cy5vcmlnaW4sIHRoaXNba09wdGlvbnNdKVxuICAgICAgICAub24oJ2RyYWluJywgdGhpc1trT25EcmFpbl0pXG4gICAgICAgIC5vbignY29ubmVjdCcsIHRoaXNba09uQ29ubmVjdF0pXG4gICAgICAgIC5vbignZGlzY29ubmVjdCcsIHRoaXNba09uRGlzY29ubmVjdF0pXG4gICAgICAgIC5vbignY29ubmVjdGlvbkVycm9yJywgdGhpc1trT25Db25uZWN0aW9uRXJyb3JdKVxuXG4gICAgICB0aGlzW2tDbGllbnRzXS5zZXQoa2V5LCBuZXcgV2Vha1JlZihkaXNwYXRjaGVyKSlcbiAgICAgIHRoaXNba0ZpbmFsaXplcl0ucmVnaXN0ZXIoZGlzcGF0Y2hlciwga2V5KVxuICAgIH1cblxuICAgIHJldHVybiBkaXNwYXRjaGVyLmRpc3BhdGNoKG9wdHMsIGhhbmRsZXIpXG4gIH1cblxuICBhc3luYyBba0Nsb3NlXSAoKSB7XG4gICAgY29uc3QgY2xvc2VQcm9taXNlcyA9IFtdXG4gICAgZm9yIChjb25zdCByZWYgb2YgdGhpc1trQ2xpZW50c10udmFsdWVzKCkpIHtcbiAgICAgIGNvbnN0IGNsaWVudCA9IHJlZi5kZXJlZigpXG4gICAgICAvKiBpc3RhbmJ1bCBpZ25vcmUgZWxzZTogZ2MgaXMgdW5kZXRlcm1pbmlzdGljICovXG4gICAgICBpZiAoY2xpZW50KSB7XG4gICAgICAgIGNsb3NlUHJvbWlzZXMucHVzaChjbGllbnQuY2xvc2UoKSlcbiAgICAgIH1cbiAgICB9XG5cbiAgICBhd2FpdCBQcm9taXNlLmFsbChjbG9zZVByb21pc2VzKVxuICB9XG5cbiAgYXN5bmMgW2tEZXN0cm95XSAoZXJyKSB7XG4gICAgY29uc3QgZGVzdHJveVByb21pc2VzID0gW11cbiAgICBmb3IgKGNvbnN0IHJlZiBvZiB0aGlzW2tDbGllbnRzXS52YWx1ZXMoKSkge1xuICAgICAgY29uc3QgY2xpZW50ID0gcmVmLmRlcmVmKClcbiAgICAgIC8qIGlzdGFuYnVsIGlnbm9yZSBlbHNlOiBnYyBpcyB1bmRldGVybWluaXN0aWMgKi9cbiAgICAgIGlmIChjbGllbnQpIHtcbiAgICAgICAgZGVzdHJveVByb21pc2VzLnB1c2goY2xpZW50LmRlc3Ryb3koZXJyKSlcbiAgICAgIH1cbiAgICB9XG5cbiAgICBhd2FpdCBQcm9taXNlLmFsbChkZXN0cm95UHJvbWlzZXMpXG4gIH1cbn1cblxubW9kdWxlLmV4cG9ydHMgPSBBZ2VudFxuIiwKICAgICIvLyBQb3J0ZWQgZnJvbSBodHRwczovL2dpdGh1Yi5jb20vbm9kZWpzL3VuZGljaS9wdWxsLzkwN1xuXG4ndXNlIHN0cmljdCdcblxuY29uc3QgYXNzZXJ0ID0gcmVxdWlyZSgnYXNzZXJ0JylcbmNvbnN0IHsgUmVhZGFibGUgfSA9IHJlcXVpcmUoJ3N0cmVhbScpXG5jb25zdCB7IFJlcXVlc3RBYm9ydGVkRXJyb3IsIE5vdFN1cHBvcnRlZEVycm9yLCBJbnZhbGlkQXJndW1lbnRFcnJvciB9ID0gcmVxdWlyZSgnLi4vY29yZS9lcnJvcnMnKVxuY29uc3QgdXRpbCA9IHJlcXVpcmUoJy4uL2NvcmUvdXRpbCcpXG5jb25zdCB7IFJlYWRhYmxlU3RyZWFtRnJvbSwgdG9VU1ZTdHJpbmcgfSA9IHJlcXVpcmUoJy4uL2NvcmUvdXRpbCcpXG5cbmxldCBCbG9iXG5cbmNvbnN0IGtDb25zdW1lID0gU3ltYm9sKCdrQ29uc3VtZScpXG5jb25zdCBrUmVhZGluZyA9IFN5bWJvbCgna1JlYWRpbmcnKVxuY29uc3Qga0JvZHkgPSBTeW1ib2woJ2tCb2R5JylcbmNvbnN0IGtBYm9ydCA9IFN5bWJvbCgnYWJvcnQnKVxuY29uc3Qga0NvbnRlbnRUeXBlID0gU3ltYm9sKCdrQ29udGVudFR5cGUnKVxuXG5jb25zdCBub29wID0gKCkgPT4ge31cblxubW9kdWxlLmV4cG9ydHMgPSBjbGFzcyBCb2R5UmVhZGFibGUgZXh0ZW5kcyBSZWFkYWJsZSB7XG4gIGNvbnN0cnVjdG9yICh7XG4gICAgcmVzdW1lLFxuICAgIGFib3J0LFxuICAgIGNvbnRlbnRUeXBlID0gJycsXG4gICAgaGlnaFdhdGVyTWFyayA9IDY0ICogMTAyNCAvLyBTYW1lIGFzIG5vZGVqcyBmcyBzdHJlYW1zLlxuICB9KSB7XG4gICAgc3VwZXIoe1xuICAgICAgYXV0b0Rlc3Ryb3k6IHRydWUsXG4gICAgICByZWFkOiByZXN1bWUsXG4gICAgICBoaWdoV2F0ZXJNYXJrXG4gICAgfSlcblxuICAgIHRoaXMuX3JlYWRhYmxlU3RhdGUuZGF0YUVtaXR0ZWQgPSBmYWxzZVxuXG4gICAgdGhpc1trQWJvcnRdID0gYWJvcnRcbiAgICB0aGlzW2tDb25zdW1lXSA9IG51bGxcbiAgICB0aGlzW2tCb2R5XSA9IG51bGxcbiAgICB0aGlzW2tDb250ZW50VHlwZV0gPSBjb250ZW50VHlwZVxuXG4gICAgLy8gSXMgc3RyZWFtIGJlaW5nIGNvbnN1bWVkIHRocm91Z2ggUmVhZGFibGUgQVBJP1xuICAgIC8vIFRoaXMgaXMgYW4gb3B0aW1pemF0aW9uIHNvIHRoYXQgd2UgYXZvaWQgY2hlY2tpbmdcbiAgICAvLyBmb3IgJ2RhdGEnIGFuZCAncmVhZGFibGUnIGxpc3RlbmVycyBpbiB0aGUgaG90IHBhdGhcbiAgICAvLyBpbnNpZGUgcHVzaCgpLlxuICAgIHRoaXNba1JlYWRpbmddID0gZmFsc2VcbiAgfVxuXG4gIGRlc3Ryb3kgKGVycikge1xuICAgIGlmICh0aGlzLmRlc3Ryb3llZCkge1xuICAgICAgLy8gTm9kZSA8IDE2XG4gICAgICByZXR1cm4gdGhpc1xuICAgIH1cblxuICAgIGlmICghZXJyICYmICF0aGlzLl9yZWFkYWJsZVN0YXRlLmVuZEVtaXR0ZWQpIHtcbiAgICAgIGVyciA9IG5ldyBSZXF1ZXN0QWJvcnRlZEVycm9yKClcbiAgICB9XG5cbiAgICBpZiAoZXJyKSB7XG4gICAgICB0aGlzW2tBYm9ydF0oKVxuICAgIH1cblxuICAgIHJldHVybiBzdXBlci5kZXN0cm95KGVycilcbiAgfVxuXG4gIGVtaXQgKGV2LCAuLi5hcmdzKSB7XG4gICAgaWYgKGV2ID09PSAnZGF0YScpIHtcbiAgICAgIC8vIE5vZGUgPCAxNi43XG4gICAgICB0aGlzLl9yZWFkYWJsZVN0YXRlLmRhdGFFbWl0dGVkID0gdHJ1ZVxuICAgIH0gZWxzZSBpZiAoZXYgPT09ICdlcnJvcicpIHtcbiAgICAgIC8vIE5vZGUgPCAxNlxuICAgICAgdGhpcy5fcmVhZGFibGVTdGF0ZS5lcnJvckVtaXR0ZWQgPSB0cnVlXG4gICAgfVxuICAgIHJldHVybiBzdXBlci5lbWl0KGV2LCAuLi5hcmdzKVxuICB9XG5cbiAgb24gKGV2LCAuLi5hcmdzKSB7XG4gICAgaWYgKGV2ID09PSAnZGF0YScgfHwgZXYgPT09ICdyZWFkYWJsZScpIHtcbiAgICAgIHRoaXNba1JlYWRpbmddID0gdHJ1ZVxuICAgIH1cbiAgICByZXR1cm4gc3VwZXIub24oZXYsIC4uLmFyZ3MpXG4gIH1cblxuICBhZGRMaXN0ZW5lciAoZXYsIC4uLmFyZ3MpIHtcbiAgICByZXR1cm4gdGhpcy5vbihldiwgLi4uYXJncylcbiAgfVxuXG4gIG9mZiAoZXYsIC4uLmFyZ3MpIHtcbiAgICBjb25zdCByZXQgPSBzdXBlci5vZmYoZXYsIC4uLmFyZ3MpXG4gICAgaWYgKGV2ID09PSAnZGF0YScgfHwgZXYgPT09ICdyZWFkYWJsZScpIHtcbiAgICAgIHRoaXNba1JlYWRpbmddID0gKFxuICAgICAgICB0aGlzLmxpc3RlbmVyQ291bnQoJ2RhdGEnKSA+IDAgfHxcbiAgICAgICAgdGhpcy5saXN0ZW5lckNvdW50KCdyZWFkYWJsZScpID4gMFxuICAgICAgKVxuICAgIH1cbiAgICByZXR1cm4gcmV0XG4gIH1cblxuICByZW1vdmVMaXN0ZW5lciAoZXYsIC4uLmFyZ3MpIHtcbiAgICByZXR1cm4gdGhpcy5vZmYoZXYsIC4uLmFyZ3MpXG4gIH1cblxuICBwdXNoIChjaHVuaykge1xuICAgIGlmICh0aGlzW2tDb25zdW1lXSAmJiBjaHVuayAhPT0gbnVsbCAmJiB0aGlzLnJlYWRhYmxlTGVuZ3RoID09PSAwKSB7XG4gICAgICBjb25zdW1lUHVzaCh0aGlzW2tDb25zdW1lXSwgY2h1bmspXG4gICAgICByZXR1cm4gdGhpc1trUmVhZGluZ10gPyBzdXBlci5wdXNoKGNodW5rKSA6IHRydWVcbiAgICB9XG4gICAgcmV0dXJuIHN1cGVyLnB1c2goY2h1bmspXG4gIH1cblxuICAvLyBodHRwczovL2ZldGNoLnNwZWMud2hhdHdnLm9yZy8jZG9tLWJvZHktdGV4dFxuICBhc3luYyB0ZXh0ICgpIHtcbiAgICByZXR1cm4gY29uc3VtZSh0aGlzLCAndGV4dCcpXG4gIH1cblxuICAvLyBodHRwczovL2ZldGNoLnNwZWMud2hhdHdnLm9yZy8jZG9tLWJvZHktanNvblxuICBhc3luYyBqc29uICgpIHtcbiAgICByZXR1cm4gY29uc3VtZSh0aGlzLCAnanNvbicpXG4gIH1cblxuICAvLyBodHRwczovL2ZldGNoLnNwZWMud2hhdHdnLm9yZy8jZG9tLWJvZHktYmxvYlxuICBhc3luYyBibG9iICgpIHtcbiAgICByZXR1cm4gY29uc3VtZSh0aGlzLCAnYmxvYicpXG4gIH1cblxuICAvLyBodHRwczovL2ZldGNoLnNwZWMud2hhdHdnLm9yZy8jZG9tLWJvZHktYXJyYXlidWZmZXJcbiAgYXN5bmMgYXJyYXlCdWZmZXIgKCkge1xuICAgIHJldHVybiBjb25zdW1lKHRoaXMsICdhcnJheUJ1ZmZlcicpXG4gIH1cblxuICAvLyBodHRwczovL2ZldGNoLnNwZWMud2hhdHdnLm9yZy8jZG9tLWJvZHktZm9ybWRhdGFcbiAgYXN5bmMgZm9ybURhdGEgKCkge1xuICAgIC8vIFRPRE86IEltcGxlbWVudC5cbiAgICB0aHJvdyBuZXcgTm90U3VwcG9ydGVkRXJyb3IoKVxuICB9XG5cbiAgLy8gaHR0cHM6Ly9mZXRjaC5zcGVjLndoYXR3Zy5vcmcvI2RvbS1ib2R5LWJvZHl1c2VkXG4gIGdldCBib2R5VXNlZCAoKSB7XG4gICAgcmV0dXJuIHV0aWwuaXNEaXN0dXJiZWQodGhpcylcbiAgfVxuXG4gIC8vIGh0dHBzOi8vZmV0Y2guc3BlYy53aGF0d2cub3JnLyNkb20tYm9keS1ib2R5XG4gIGdldCBib2R5ICgpIHtcbiAgICBpZiAoIXRoaXNba0JvZHldKSB7XG4gICAgICB0aGlzW2tCb2R5XSA9IFJlYWRhYmxlU3RyZWFtRnJvbSh0aGlzKVxuICAgICAgaWYgKHRoaXNba0NvbnN1bWVdKSB7XG4gICAgICAgIC8vIFRPRE86IElzIHRoaXMgdGhlIGJlc3Qgd2F5IHRvIGZvcmNlIGEgbG9jaz9cbiAgICAgICAgdGhpc1trQm9keV0uZ2V0UmVhZGVyKCkgLy8gRW5zdXJlIHN0cmVhbSBpcyBsb2NrZWQuXG4gICAgICAgIGFzc2VydCh0aGlzW2tCb2R5XS5sb2NrZWQpXG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiB0aGlzW2tCb2R5XVxuICB9XG5cbiAgZHVtcCAob3B0cykge1xuICAgIGxldCBsaW1pdCA9IG9wdHMgJiYgTnVtYmVyLmlzRmluaXRlKG9wdHMubGltaXQpID8gb3B0cy5saW1pdCA6IDI2MjE0NFxuICAgIGNvbnN0IHNpZ25hbCA9IG9wdHMgJiYgb3B0cy5zaWduYWxcblxuICAgIGlmIChzaWduYWwpIHtcbiAgICAgIHRyeSB7XG4gICAgICAgIGlmICh0eXBlb2Ygc2lnbmFsICE9PSAnb2JqZWN0JyB8fCAhKCdhYm9ydGVkJyBpbiBzaWduYWwpKSB7XG4gICAgICAgICAgdGhyb3cgbmV3IEludmFsaWRBcmd1bWVudEVycm9yKCdzaWduYWwgbXVzdCBiZSBhbiBBYm9ydFNpZ25hbCcpXG4gICAgICAgIH1cbiAgICAgICAgdXRpbC50aHJvd0lmQWJvcnRlZChzaWduYWwpXG4gICAgICB9IGNhdGNoIChlcnIpIHtcbiAgICAgICAgcmV0dXJuIFByb21pc2UucmVqZWN0KGVycilcbiAgICAgIH1cbiAgICB9XG5cbiAgICBpZiAodGhpcy5jbG9zZWQpIHtcbiAgICAgIHJldHVybiBQcm9taXNlLnJlc29sdmUobnVsbClcbiAgICB9XG5cbiAgICByZXR1cm4gbmV3IFByb21pc2UoKHJlc29sdmUsIHJlamVjdCkgPT4ge1xuICAgICAgY29uc3Qgc2lnbmFsTGlzdGVuZXJDbGVhbnVwID0gc2lnbmFsXG4gICAgICAgID8gdXRpbC5hZGRBYm9ydExpc3RlbmVyKHNpZ25hbCwgKCkgPT4ge1xuICAgICAgICAgIHRoaXMuZGVzdHJveSgpXG4gICAgICAgIH0pXG4gICAgICAgIDogbm9vcFxuXG4gICAgICB0aGlzXG4gICAgICAgIC5vbignY2xvc2UnLCBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgc2lnbmFsTGlzdGVuZXJDbGVhbnVwKClcbiAgICAgICAgICBpZiAoc2lnbmFsICYmIHNpZ25hbC5hYm9ydGVkKSB7XG4gICAgICAgICAgICByZWplY3Qoc2lnbmFsLnJlYXNvbiB8fCBPYmplY3QuYXNzaWduKG5ldyBFcnJvcignVGhlIG9wZXJhdGlvbiB3YXMgYWJvcnRlZCcpLCB7IG5hbWU6ICdBYm9ydEVycm9yJyB9KSlcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgcmVzb2x2ZShudWxsKVxuICAgICAgICAgIH1cbiAgICAgICAgfSlcbiAgICAgICAgLm9uKCdlcnJvcicsIG5vb3ApXG4gICAgICAgIC5vbignZGF0YScsIGZ1bmN0aW9uIChjaHVuaykge1xuICAgICAgICAgIGxpbWl0IC09IGNodW5rLmxlbmd0aFxuICAgICAgICAgIGlmIChsaW1pdCA8PSAwKSB7XG4gICAgICAgICAgICB0aGlzLmRlc3Ryb3koKVxuICAgICAgICAgIH1cbiAgICAgICAgfSlcbiAgICAgICAgLnJlc3VtZSgpXG4gICAgfSlcbiAgfVxufVxuXG4vLyBodHRwczovL3N0cmVhbXMuc3BlYy53aGF0d2cub3JnLyNyZWFkYWJsZXN0cmVhbS1sb2NrZWRcbmZ1bmN0aW9uIGlzTG9ja2VkIChzZWxmKSB7XG4gIC8vIENvbnN1bWUgaXMgYW4gaW1wbGljaXQgbG9jay5cbiAgcmV0dXJuIChzZWxmW2tCb2R5XSAmJiBzZWxmW2tCb2R5XS5sb2NrZWQgPT09IHRydWUpIHx8IHNlbGZba0NvbnN1bWVdXG59XG5cbi8vIGh0dHBzOi8vZmV0Y2guc3BlYy53aGF0d2cub3JnLyNib2R5LXVudXNhYmxlXG5mdW5jdGlvbiBpc1VudXNhYmxlIChzZWxmKSB7XG4gIHJldHVybiB1dGlsLmlzRGlzdHVyYmVkKHNlbGYpIHx8IGlzTG9ja2VkKHNlbGYpXG59XG5cbmFzeW5jIGZ1bmN0aW9uIGNvbnN1bWUgKHN0cmVhbSwgdHlwZSkge1xuICBpZiAoaXNVbnVzYWJsZShzdHJlYW0pKSB7XG4gICAgdGhyb3cgbmV3IFR5cGVFcnJvcigndW51c2FibGUnKVxuICB9XG5cbiAgYXNzZXJ0KCFzdHJlYW1ba0NvbnN1bWVdKVxuXG4gIHJldHVybiBuZXcgUHJvbWlzZSgocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XG4gICAgc3RyZWFtW2tDb25zdW1lXSA9IHtcbiAgICAgIHR5cGUsXG4gICAgICBzdHJlYW0sXG4gICAgICByZXNvbHZlLFxuICAgICAgcmVqZWN0LFxuICAgICAgbGVuZ3RoOiAwLFxuICAgICAgYm9keTogW11cbiAgICB9XG5cbiAgICBzdHJlYW1cbiAgICAgIC5vbignZXJyb3InLCBmdW5jdGlvbiAoZXJyKSB7XG4gICAgICAgIGNvbnN1bWVGaW5pc2godGhpc1trQ29uc3VtZV0sIGVycilcbiAgICAgIH0pXG4gICAgICAub24oJ2Nsb3NlJywgZnVuY3Rpb24gKCkge1xuICAgICAgICBpZiAodGhpc1trQ29uc3VtZV0uYm9keSAhPT0gbnVsbCkge1xuICAgICAgICAgIGNvbnN1bWVGaW5pc2godGhpc1trQ29uc3VtZV0sIG5ldyBSZXF1ZXN0QWJvcnRlZEVycm9yKCkpXG4gICAgICAgIH1cbiAgICAgIH0pXG5cbiAgICBwcm9jZXNzLm5leHRUaWNrKGNvbnN1bWVTdGFydCwgc3RyZWFtW2tDb25zdW1lXSlcbiAgfSlcbn1cblxuZnVuY3Rpb24gY29uc3VtZVN0YXJ0IChjb25zdW1lKSB7XG4gIGlmIChjb25zdW1lLmJvZHkgPT09IG51bGwpIHtcbiAgICByZXR1cm5cbiAgfVxuXG4gIGNvbnN0IHsgX3JlYWRhYmxlU3RhdGU6IHN0YXRlIH0gPSBjb25zdW1lLnN0cmVhbVxuXG4gIGZvciAoY29uc3QgY2h1bmsgb2Ygc3RhdGUuYnVmZmVyKSB7XG4gICAgY29uc3VtZVB1c2goY29uc3VtZSwgY2h1bmspXG4gIH1cblxuICBpZiAoc3RhdGUuZW5kRW1pdHRlZCkge1xuICAgIGNvbnN1bWVFbmQodGhpc1trQ29uc3VtZV0pXG4gIH0gZWxzZSB7XG4gICAgY29uc3VtZS5zdHJlYW0ub24oJ2VuZCcsIGZ1bmN0aW9uICgpIHtcbiAgICAgIGNvbnN1bWVFbmQodGhpc1trQ29uc3VtZV0pXG4gICAgfSlcbiAgfVxuXG4gIGNvbnN1bWUuc3RyZWFtLnJlc3VtZSgpXG5cbiAgd2hpbGUgKGNvbnN1bWUuc3RyZWFtLnJlYWQoKSAhPSBudWxsKSB7XG4gICAgLy8gTG9vcFxuICB9XG59XG5cbmZ1bmN0aW9uIGNvbnN1bWVFbmQgKGNvbnN1bWUpIHtcbiAgY29uc3QgeyB0eXBlLCBib2R5LCByZXNvbHZlLCBzdHJlYW0sIGxlbmd0aCB9ID0gY29uc3VtZVxuXG4gIHRyeSB7XG4gICAgaWYgKHR5cGUgPT09ICd0ZXh0Jykge1xuICAgICAgcmVzb2x2ZSh0b1VTVlN0cmluZyhCdWZmZXIuY29uY2F0KGJvZHkpKSlcbiAgICB9IGVsc2UgaWYgKHR5cGUgPT09ICdqc29uJykge1xuICAgICAgcmVzb2x2ZShKU09OLnBhcnNlKEJ1ZmZlci5jb25jYXQoYm9keSkpKVxuICAgIH0gZWxzZSBpZiAodHlwZSA9PT0gJ2FycmF5QnVmZmVyJykge1xuICAgICAgY29uc3QgZHN0ID0gbmV3IFVpbnQ4QXJyYXkobGVuZ3RoKVxuXG4gICAgICBsZXQgcG9zID0gMFxuICAgICAgZm9yIChjb25zdCBidWYgb2YgYm9keSkge1xuICAgICAgICBkc3Quc2V0KGJ1ZiwgcG9zKVxuICAgICAgICBwb3MgKz0gYnVmLmJ5dGVMZW5ndGhcbiAgICAgIH1cblxuICAgICAgcmVzb2x2ZShkc3QuYnVmZmVyKVxuICAgIH0gZWxzZSBpZiAodHlwZSA9PT0gJ2Jsb2InKSB7XG4gICAgICBpZiAoIUJsb2IpIHtcbiAgICAgICAgQmxvYiA9IHJlcXVpcmUoJ2J1ZmZlcicpLkJsb2JcbiAgICAgIH1cbiAgICAgIHJlc29sdmUobmV3IEJsb2IoYm9keSwgeyB0eXBlOiBzdHJlYW1ba0NvbnRlbnRUeXBlXSB9KSlcbiAgICB9XG5cbiAgICBjb25zdW1lRmluaXNoKGNvbnN1bWUpXG4gIH0gY2F0Y2ggKGVycikge1xuICAgIHN0cmVhbS5kZXN0cm95KGVycilcbiAgfVxufVxuXG5mdW5jdGlvbiBjb25zdW1lUHVzaCAoY29uc3VtZSwgY2h1bmspIHtcbiAgY29uc3VtZS5sZW5ndGggKz0gY2h1bmsubGVuZ3RoXG4gIGNvbnN1bWUuYm9keS5wdXNoKGNodW5rKVxufVxuXG5mdW5jdGlvbiBjb25zdW1lRmluaXNoIChjb25zdW1lLCBlcnIpIHtcbiAgaWYgKGNvbnN1bWUuYm9keSA9PT0gbnVsbCkge1xuICAgIHJldHVyblxuICB9XG5cbiAgaWYgKGVycikge1xuICAgIGNvbnN1bWUucmVqZWN0KGVycilcbiAgfSBlbHNlIHtcbiAgICBjb25zdW1lLnJlc29sdmUoKVxuICB9XG5cbiAgY29uc3VtZS50eXBlID0gbnVsbFxuICBjb25zdW1lLnN0cmVhbSA9IG51bGxcbiAgY29uc3VtZS5yZXNvbHZlID0gbnVsbFxuICBjb25zdW1lLnJlamVjdCA9IG51bGxcbiAgY29uc3VtZS5sZW5ndGggPSAwXG4gIGNvbnN1bWUuYm9keSA9IG51bGxcbn1cbiIsCiAgICAiY29uc3QgYXNzZXJ0ID0gcmVxdWlyZSgnYXNzZXJ0JylcbmNvbnN0IHtcbiAgUmVzcG9uc2VTdGF0dXNDb2RlRXJyb3Jcbn0gPSByZXF1aXJlKCcuLi9jb3JlL2Vycm9ycycpXG5jb25zdCB7IHRvVVNWU3RyaW5nIH0gPSByZXF1aXJlKCcuLi9jb3JlL3V0aWwnKVxuXG5hc3luYyBmdW5jdGlvbiBnZXRSZXNvbHZlRXJyb3JCb2R5Q2FsbGJhY2sgKHsgY2FsbGJhY2ssIGJvZHksIGNvbnRlbnRUeXBlLCBzdGF0dXNDb2RlLCBzdGF0dXNNZXNzYWdlLCBoZWFkZXJzIH0pIHtcbiAgYXNzZXJ0KGJvZHkpXG5cbiAgbGV0IGNodW5rcyA9IFtdXG4gIGxldCBsaW1pdCA9IDBcblxuICBmb3IgYXdhaXQgKGNvbnN0IGNodW5rIG9mIGJvZHkpIHtcbiAgICBjaHVua3MucHVzaChjaHVuaylcbiAgICBsaW1pdCArPSBjaHVuay5sZW5ndGhcbiAgICBpZiAobGltaXQgPiAxMjggKiAxMDI0KSB7XG4gICAgICBjaHVua3MgPSBudWxsXG4gICAgICBicmVha1xuICAgIH1cbiAgfVxuXG4gIGlmIChzdGF0dXNDb2RlID09PSAyMDQgfHwgIWNvbnRlbnRUeXBlIHx8ICFjaHVua3MpIHtcbiAgICBwcm9jZXNzLm5leHRUaWNrKGNhbGxiYWNrLCBuZXcgUmVzcG9uc2VTdGF0dXNDb2RlRXJyb3IoYFJlc3BvbnNlIHN0YXR1cyBjb2RlICR7c3RhdHVzQ29kZX0ke3N0YXR1c01lc3NhZ2UgPyBgOiAke3N0YXR1c01lc3NhZ2V9YCA6ICcnfWAsIHN0YXR1c0NvZGUsIGhlYWRlcnMpKVxuICAgIHJldHVyblxuICB9XG5cbiAgdHJ5IHtcbiAgICBpZiAoY29udGVudFR5cGUuc3RhcnRzV2l0aCgnYXBwbGljYXRpb24vanNvbicpKSB7XG4gICAgICBjb25zdCBwYXlsb2FkID0gSlNPTi5wYXJzZSh0b1VTVlN0cmluZyhCdWZmZXIuY29uY2F0KGNodW5rcykpKVxuICAgICAgcHJvY2Vzcy5uZXh0VGljayhjYWxsYmFjaywgbmV3IFJlc3BvbnNlU3RhdHVzQ29kZUVycm9yKGBSZXNwb25zZSBzdGF0dXMgY29kZSAke3N0YXR1c0NvZGV9JHtzdGF0dXNNZXNzYWdlID8gYDogJHtzdGF0dXNNZXNzYWdlfWAgOiAnJ31gLCBzdGF0dXNDb2RlLCBoZWFkZXJzLCBwYXlsb2FkKSlcbiAgICAgIHJldHVyblxuICAgIH1cblxuICAgIGlmIChjb250ZW50VHlwZS5zdGFydHNXaXRoKCd0ZXh0LycpKSB7XG4gICAgICBjb25zdCBwYXlsb2FkID0gdG9VU1ZTdHJpbmcoQnVmZmVyLmNvbmNhdChjaHVua3MpKVxuICAgICAgcHJvY2Vzcy5uZXh0VGljayhjYWxsYmFjaywgbmV3IFJlc3BvbnNlU3RhdHVzQ29kZUVycm9yKGBSZXNwb25zZSBzdGF0dXMgY29kZSAke3N0YXR1c0NvZGV9JHtzdGF0dXNNZXNzYWdlID8gYDogJHtzdGF0dXNNZXNzYWdlfWAgOiAnJ31gLCBzdGF0dXNDb2RlLCBoZWFkZXJzLCBwYXlsb2FkKSlcbiAgICAgIHJldHVyblxuICAgIH1cbiAgfSBjYXRjaCAoZXJyKSB7XG4gICAgLy8gUHJvY2VzcyBpbiBhIGZhbGxiYWNrIGlmIGVycm9yXG4gIH1cblxuICBwcm9jZXNzLm5leHRUaWNrKGNhbGxiYWNrLCBuZXcgUmVzcG9uc2VTdGF0dXNDb2RlRXJyb3IoYFJlc3BvbnNlIHN0YXR1cyBjb2RlICR7c3RhdHVzQ29kZX0ke3N0YXR1c01lc3NhZ2UgPyBgOiAke3N0YXR1c01lc3NhZ2V9YCA6ICcnfWAsIHN0YXR1c0NvZGUsIGhlYWRlcnMpKVxufVxuXG5tb2R1bGUuZXhwb3J0cyA9IHsgZ2V0UmVzb2x2ZUVycm9yQm9keUNhbGxiYWNrIH1cbiIsCiAgICAiY29uc3QgeyBhZGRBYm9ydExpc3RlbmVyIH0gPSByZXF1aXJlKCcuLi9jb3JlL3V0aWwnKVxuY29uc3QgeyBSZXF1ZXN0QWJvcnRlZEVycm9yIH0gPSByZXF1aXJlKCcuLi9jb3JlL2Vycm9ycycpXG5cbmNvbnN0IGtMaXN0ZW5lciA9IFN5bWJvbCgna0xpc3RlbmVyJylcbmNvbnN0IGtTaWduYWwgPSBTeW1ib2woJ2tTaWduYWwnKVxuXG5mdW5jdGlvbiBhYm9ydCAoc2VsZikge1xuICBpZiAoc2VsZi5hYm9ydCkge1xuICAgIHNlbGYuYWJvcnQoKVxuICB9IGVsc2Uge1xuICAgIHNlbGYub25FcnJvcihuZXcgUmVxdWVzdEFib3J0ZWRFcnJvcigpKVxuICB9XG59XG5cbmZ1bmN0aW9uIGFkZFNpZ25hbCAoc2VsZiwgc2lnbmFsKSB7XG4gIHNlbGZba1NpZ25hbF0gPSBudWxsXG4gIHNlbGZba0xpc3RlbmVyXSA9IG51bGxcblxuICBpZiAoIXNpZ25hbCkge1xuICAgIHJldHVyblxuICB9XG5cbiAgaWYgKHNpZ25hbC5hYm9ydGVkKSB7XG4gICAgYWJvcnQoc2VsZilcbiAgICByZXR1cm5cbiAgfVxuXG4gIHNlbGZba1NpZ25hbF0gPSBzaWduYWxcbiAgc2VsZltrTGlzdGVuZXJdID0gKCkgPT4ge1xuICAgIGFib3J0KHNlbGYpXG4gIH1cblxuICBhZGRBYm9ydExpc3RlbmVyKHNlbGZba1NpZ25hbF0sIHNlbGZba0xpc3RlbmVyXSlcbn1cblxuZnVuY3Rpb24gcmVtb3ZlU2lnbmFsIChzZWxmKSB7XG4gIGlmICghc2VsZltrU2lnbmFsXSkge1xuICAgIHJldHVyblxuICB9XG5cbiAgaWYgKCdyZW1vdmVFdmVudExpc3RlbmVyJyBpbiBzZWxmW2tTaWduYWxdKSB7XG4gICAgc2VsZltrU2lnbmFsXS5yZW1vdmVFdmVudExpc3RlbmVyKCdhYm9ydCcsIHNlbGZba0xpc3RlbmVyXSlcbiAgfSBlbHNlIHtcbiAgICBzZWxmW2tTaWduYWxdLnJlbW92ZUxpc3RlbmVyKCdhYm9ydCcsIHNlbGZba0xpc3RlbmVyXSlcbiAgfVxuXG4gIHNlbGZba1NpZ25hbF0gPSBudWxsXG4gIHNlbGZba0xpc3RlbmVyXSA9IG51bGxcbn1cblxubW9kdWxlLmV4cG9ydHMgPSB7XG4gIGFkZFNpZ25hbCxcbiAgcmVtb3ZlU2lnbmFsXG59XG4iLAogICAgIid1c2Ugc3RyaWN0J1xuXG5jb25zdCBSZWFkYWJsZSA9IHJlcXVpcmUoJy4vcmVhZGFibGUnKVxuY29uc3Qge1xuICBJbnZhbGlkQXJndW1lbnRFcnJvcixcbiAgUmVxdWVzdEFib3J0ZWRFcnJvclxufSA9IHJlcXVpcmUoJy4uL2NvcmUvZXJyb3JzJylcbmNvbnN0IHV0aWwgPSByZXF1aXJlKCcuLi9jb3JlL3V0aWwnKVxuY29uc3QgeyBnZXRSZXNvbHZlRXJyb3JCb2R5Q2FsbGJhY2sgfSA9IHJlcXVpcmUoJy4vdXRpbCcpXG5jb25zdCB7IEFzeW5jUmVzb3VyY2UgfSA9IHJlcXVpcmUoJ2FzeW5jX2hvb2tzJylcbmNvbnN0IHsgYWRkU2lnbmFsLCByZW1vdmVTaWduYWwgfSA9IHJlcXVpcmUoJy4vYWJvcnQtc2lnbmFsJylcblxuY2xhc3MgUmVxdWVzdEhhbmRsZXIgZXh0ZW5kcyBBc3luY1Jlc291cmNlIHtcbiAgY29uc3RydWN0b3IgKG9wdHMsIGNhbGxiYWNrKSB7XG4gICAgaWYgKCFvcHRzIHx8IHR5cGVvZiBvcHRzICE9PSAnb2JqZWN0Jykge1xuICAgICAgdGhyb3cgbmV3IEludmFsaWRBcmd1bWVudEVycm9yKCdpbnZhbGlkIG9wdHMnKVxuICAgIH1cblxuICAgIGNvbnN0IHsgc2lnbmFsLCBtZXRob2QsIG9wYXF1ZSwgYm9keSwgb25JbmZvLCByZXNwb25zZUhlYWRlcnMsIHRocm93T25FcnJvciwgaGlnaFdhdGVyTWFyayB9ID0gb3B0c1xuXG4gICAgdHJ5IHtcbiAgICAgIGlmICh0eXBlb2YgY2FsbGJhY2sgIT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgdGhyb3cgbmV3IEludmFsaWRBcmd1bWVudEVycm9yKCdpbnZhbGlkIGNhbGxiYWNrJylcbiAgICAgIH1cblxuICAgICAgaWYgKGhpZ2hXYXRlck1hcmsgJiYgKHR5cGVvZiBoaWdoV2F0ZXJNYXJrICE9PSAnbnVtYmVyJyB8fCBoaWdoV2F0ZXJNYXJrIDwgMCkpIHtcbiAgICAgICAgdGhyb3cgbmV3IEludmFsaWRBcmd1bWVudEVycm9yKCdpbnZhbGlkIGhpZ2hXYXRlck1hcmsnKVxuICAgICAgfVxuXG4gICAgICBpZiAoc2lnbmFsICYmIHR5cGVvZiBzaWduYWwub24gIT09ICdmdW5jdGlvbicgJiYgdHlwZW9mIHNpZ25hbC5hZGRFdmVudExpc3RlbmVyICE9PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgIHRocm93IG5ldyBJbnZhbGlkQXJndW1lbnRFcnJvcignc2lnbmFsIG11c3QgYmUgYW4gRXZlbnRFbWl0dGVyIG9yIEV2ZW50VGFyZ2V0JylcbiAgICAgIH1cblxuICAgICAgaWYgKG1ldGhvZCA9PT0gJ0NPTk5FQ1QnKSB7XG4gICAgICAgIHRocm93IG5ldyBJbnZhbGlkQXJndW1lbnRFcnJvcignaW52YWxpZCBtZXRob2QnKVxuICAgICAgfVxuXG4gICAgICBpZiAob25JbmZvICYmIHR5cGVvZiBvbkluZm8gIT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgdGhyb3cgbmV3IEludmFsaWRBcmd1bWVudEVycm9yKCdpbnZhbGlkIG9uSW5mbyBjYWxsYmFjaycpXG4gICAgICB9XG5cbiAgICAgIHN1cGVyKCdVTkRJQ0lfUkVRVUVTVCcpXG4gICAgfSBjYXRjaCAoZXJyKSB7XG4gICAgICBpZiAodXRpbC5pc1N0cmVhbShib2R5KSkge1xuICAgICAgICB1dGlsLmRlc3Ryb3koYm9keS5vbignZXJyb3InLCB1dGlsLm5vcCksIGVycilcbiAgICAgIH1cbiAgICAgIHRocm93IGVyclxuICAgIH1cblxuICAgIHRoaXMucmVzcG9uc2VIZWFkZXJzID0gcmVzcG9uc2VIZWFkZXJzIHx8IG51bGxcbiAgICB0aGlzLm9wYXF1ZSA9IG9wYXF1ZSB8fCBudWxsXG4gICAgdGhpcy5jYWxsYmFjayA9IGNhbGxiYWNrXG4gICAgdGhpcy5yZXMgPSBudWxsXG4gICAgdGhpcy5hYm9ydCA9IG51bGxcbiAgICB0aGlzLmJvZHkgPSBib2R5XG4gICAgdGhpcy50cmFpbGVycyA9IHt9XG4gICAgdGhpcy5jb250ZXh0ID0gbnVsbFxuICAgIHRoaXMub25JbmZvID0gb25JbmZvIHx8IG51bGxcbiAgICB0aGlzLnRocm93T25FcnJvciA9IHRocm93T25FcnJvclxuICAgIHRoaXMuaGlnaFdhdGVyTWFyayA9IGhpZ2hXYXRlck1hcmtcblxuICAgIGlmICh1dGlsLmlzU3RyZWFtKGJvZHkpKSB7XG4gICAgICBib2R5Lm9uKCdlcnJvcicsIChlcnIpID0+IHtcbiAgICAgICAgdGhpcy5vbkVycm9yKGVycilcbiAgICAgIH0pXG4gICAgfVxuXG4gICAgYWRkU2lnbmFsKHRoaXMsIHNpZ25hbClcbiAgfVxuXG4gIG9uQ29ubmVjdCAoYWJvcnQsIGNvbnRleHQpIHtcbiAgICBpZiAoIXRoaXMuY2FsbGJhY2spIHtcbiAgICAgIHRocm93IG5ldyBSZXF1ZXN0QWJvcnRlZEVycm9yKClcbiAgICB9XG5cbiAgICB0aGlzLmFib3J0ID0gYWJvcnRcbiAgICB0aGlzLmNvbnRleHQgPSBjb250ZXh0XG4gIH1cblxuICBvbkhlYWRlcnMgKHN0YXR1c0NvZGUsIHJhd0hlYWRlcnMsIHJlc3VtZSwgc3RhdHVzTWVzc2FnZSkge1xuICAgIGNvbnN0IHsgY2FsbGJhY2ssIG9wYXF1ZSwgYWJvcnQsIGNvbnRleHQsIHJlc3BvbnNlSGVhZGVycywgaGlnaFdhdGVyTWFyayB9ID0gdGhpc1xuXG4gICAgY29uc3QgaGVhZGVycyA9IHJlc3BvbnNlSGVhZGVycyA9PT0gJ3JhdycgPyB1dGlsLnBhcnNlUmF3SGVhZGVycyhyYXdIZWFkZXJzKSA6IHV0aWwucGFyc2VIZWFkZXJzKHJhd0hlYWRlcnMpXG5cbiAgICBpZiAoc3RhdHVzQ29kZSA8IDIwMCkge1xuICAgICAgaWYgKHRoaXMub25JbmZvKSB7XG4gICAgICAgIHRoaXMub25JbmZvKHsgc3RhdHVzQ29kZSwgaGVhZGVycyB9KVxuICAgICAgfVxuICAgICAgcmV0dXJuXG4gICAgfVxuXG4gICAgY29uc3QgcGFyc2VkSGVhZGVycyA9IHJlc3BvbnNlSGVhZGVycyA9PT0gJ3JhdycgPyB1dGlsLnBhcnNlSGVhZGVycyhyYXdIZWFkZXJzKSA6IGhlYWRlcnNcbiAgICBjb25zdCBjb250ZW50VHlwZSA9IHBhcnNlZEhlYWRlcnNbJ2NvbnRlbnQtdHlwZSddXG4gICAgY29uc3QgYm9keSA9IG5ldyBSZWFkYWJsZSh7IHJlc3VtZSwgYWJvcnQsIGNvbnRlbnRUeXBlLCBoaWdoV2F0ZXJNYXJrIH0pXG5cbiAgICB0aGlzLmNhbGxiYWNrID0gbnVsbFxuICAgIHRoaXMucmVzID0gYm9keVxuICAgIGlmIChjYWxsYmFjayAhPT0gbnVsbCkge1xuICAgICAgaWYgKHRoaXMudGhyb3dPbkVycm9yICYmIHN0YXR1c0NvZGUgPj0gNDAwKSB7XG4gICAgICAgIHRoaXMucnVuSW5Bc3luY1Njb3BlKGdldFJlc29sdmVFcnJvckJvZHlDYWxsYmFjaywgbnVsbCxcbiAgICAgICAgICB7IGNhbGxiYWNrLCBib2R5LCBjb250ZW50VHlwZSwgc3RhdHVzQ29kZSwgc3RhdHVzTWVzc2FnZSwgaGVhZGVycyB9XG4gICAgICAgIClcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHRoaXMucnVuSW5Bc3luY1Njb3BlKGNhbGxiYWNrLCBudWxsLCBudWxsLCB7XG4gICAgICAgICAgc3RhdHVzQ29kZSxcbiAgICAgICAgICBoZWFkZXJzLFxuICAgICAgICAgIHRyYWlsZXJzOiB0aGlzLnRyYWlsZXJzLFxuICAgICAgICAgIG9wYXF1ZSxcbiAgICAgICAgICBib2R5LFxuICAgICAgICAgIGNvbnRleHRcbiAgICAgICAgfSlcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICBvbkRhdGEgKGNodW5rKSB7XG4gICAgY29uc3QgeyByZXMgfSA9IHRoaXNcbiAgICByZXR1cm4gcmVzLnB1c2goY2h1bmspXG4gIH1cblxuICBvbkNvbXBsZXRlICh0cmFpbGVycykge1xuICAgIGNvbnN0IHsgcmVzIH0gPSB0aGlzXG5cbiAgICByZW1vdmVTaWduYWwodGhpcylcblxuICAgIHV0aWwucGFyc2VIZWFkZXJzKHRyYWlsZXJzLCB0aGlzLnRyYWlsZXJzKVxuXG4gICAgcmVzLnB1c2gobnVsbClcbiAgfVxuXG4gIG9uRXJyb3IgKGVycikge1xuICAgIGNvbnN0IHsgcmVzLCBjYWxsYmFjaywgYm9keSwgb3BhcXVlIH0gPSB0aGlzXG5cbiAgICByZW1vdmVTaWduYWwodGhpcylcblxuICAgIGlmIChjYWxsYmFjaykge1xuICAgICAgLy8gVE9ETzogRG9lcyB0aGlzIG5lZWQgcXVldWVNaWNyb3Rhc2s/XG4gICAgICB0aGlzLmNhbGxiYWNrID0gbnVsbFxuICAgICAgcXVldWVNaWNyb3Rhc2soKCkgPT4ge1xuICAgICAgICB0aGlzLnJ1bkluQXN5bmNTY29wZShjYWxsYmFjaywgbnVsbCwgZXJyLCB7IG9wYXF1ZSB9KVxuICAgICAgfSlcbiAgICB9XG5cbiAgICBpZiAocmVzKSB7XG4gICAgICB0aGlzLnJlcyA9IG51bGxcbiAgICAgIC8vIEVuc3VyZSBhbGwgcXVldWVkIGhhbmRsZXJzIGFyZSBpbnZva2VkIGJlZm9yZSBkZXN0cm95aW5nIHJlcy5cbiAgICAgIHF1ZXVlTWljcm90YXNrKCgpID0+IHtcbiAgICAgICAgdXRpbC5kZXN0cm95KHJlcywgZXJyKVxuICAgICAgfSlcbiAgICB9XG5cbiAgICBpZiAoYm9keSkge1xuICAgICAgdGhpcy5ib2R5ID0gbnVsbFxuICAgICAgdXRpbC5kZXN0cm95KGJvZHksIGVycilcbiAgICB9XG4gIH1cbn1cblxuZnVuY3Rpb24gcmVxdWVzdCAob3B0cywgY2FsbGJhY2spIHtcbiAgaWYgKGNhbGxiYWNrID09PSB1bmRlZmluZWQpIHtcbiAgICByZXR1cm4gbmV3IFByb21pc2UoKHJlc29sdmUsIHJlamVjdCkgPT4ge1xuICAgICAgcmVxdWVzdC5jYWxsKHRoaXMsIG9wdHMsIChlcnIsIGRhdGEpID0+IHtcbiAgICAgICAgcmV0dXJuIGVyciA/IHJlamVjdChlcnIpIDogcmVzb2x2ZShkYXRhKVxuICAgICAgfSlcbiAgICB9KVxuICB9XG5cbiAgdHJ5IHtcbiAgICB0aGlzLmRpc3BhdGNoKG9wdHMsIG5ldyBSZXF1ZXN0SGFuZGxlcihvcHRzLCBjYWxsYmFjaykpXG4gIH0gY2F0Y2ggKGVycikge1xuICAgIGlmICh0eXBlb2YgY2FsbGJhY2sgIT09ICdmdW5jdGlvbicpIHtcbiAgICAgIHRocm93IGVyclxuICAgIH1cbiAgICBjb25zdCBvcGFxdWUgPSBvcHRzICYmIG9wdHMub3BhcXVlXG4gICAgcXVldWVNaWNyb3Rhc2soKCkgPT4gY2FsbGJhY2soZXJyLCB7IG9wYXF1ZSB9KSlcbiAgfVxufVxuXG5tb2R1bGUuZXhwb3J0cyA9IHJlcXVlc3Rcbm1vZHVsZS5leHBvcnRzLlJlcXVlc3RIYW5kbGVyID0gUmVxdWVzdEhhbmRsZXJcbiIsCiAgICAiJ3VzZSBzdHJpY3QnXG5cbmNvbnN0IHsgZmluaXNoZWQsIFBhc3NUaHJvdWdoIH0gPSByZXF1aXJlKCdzdHJlYW0nKVxuY29uc3Qge1xuICBJbnZhbGlkQXJndW1lbnRFcnJvcixcbiAgSW52YWxpZFJldHVyblZhbHVlRXJyb3IsXG4gIFJlcXVlc3RBYm9ydGVkRXJyb3Jcbn0gPSByZXF1aXJlKCcuLi9jb3JlL2Vycm9ycycpXG5jb25zdCB1dGlsID0gcmVxdWlyZSgnLi4vY29yZS91dGlsJylcbmNvbnN0IHsgZ2V0UmVzb2x2ZUVycm9yQm9keUNhbGxiYWNrIH0gPSByZXF1aXJlKCcuL3V0aWwnKVxuY29uc3QgeyBBc3luY1Jlc291cmNlIH0gPSByZXF1aXJlKCdhc3luY19ob29rcycpXG5jb25zdCB7IGFkZFNpZ25hbCwgcmVtb3ZlU2lnbmFsIH0gPSByZXF1aXJlKCcuL2Fib3J0LXNpZ25hbCcpXG5cbmNsYXNzIFN0cmVhbUhhbmRsZXIgZXh0ZW5kcyBBc3luY1Jlc291cmNlIHtcbiAgY29uc3RydWN0b3IgKG9wdHMsIGZhY3RvcnksIGNhbGxiYWNrKSB7XG4gICAgaWYgKCFvcHRzIHx8IHR5cGVvZiBvcHRzICE9PSAnb2JqZWN0Jykge1xuICAgICAgdGhyb3cgbmV3IEludmFsaWRBcmd1bWVudEVycm9yKCdpbnZhbGlkIG9wdHMnKVxuICAgIH1cblxuICAgIGNvbnN0IHsgc2lnbmFsLCBtZXRob2QsIG9wYXF1ZSwgYm9keSwgb25JbmZvLCByZXNwb25zZUhlYWRlcnMsIHRocm93T25FcnJvciB9ID0gb3B0c1xuXG4gICAgdHJ5IHtcbiAgICAgIGlmICh0eXBlb2YgY2FsbGJhY2sgIT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgdGhyb3cgbmV3IEludmFsaWRBcmd1bWVudEVycm9yKCdpbnZhbGlkIGNhbGxiYWNrJylcbiAgICAgIH1cblxuICAgICAgaWYgKHR5cGVvZiBmYWN0b3J5ICE9PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgIHRocm93IG5ldyBJbnZhbGlkQXJndW1lbnRFcnJvcignaW52YWxpZCBmYWN0b3J5JylcbiAgICAgIH1cblxuICAgICAgaWYgKHNpZ25hbCAmJiB0eXBlb2Ygc2lnbmFsLm9uICE9PSAnZnVuY3Rpb24nICYmIHR5cGVvZiBzaWduYWwuYWRkRXZlbnRMaXN0ZW5lciAhPT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICB0aHJvdyBuZXcgSW52YWxpZEFyZ3VtZW50RXJyb3IoJ3NpZ25hbCBtdXN0IGJlIGFuIEV2ZW50RW1pdHRlciBvciBFdmVudFRhcmdldCcpXG4gICAgICB9XG5cbiAgICAgIGlmIChtZXRob2QgPT09ICdDT05ORUNUJykge1xuICAgICAgICB0aHJvdyBuZXcgSW52YWxpZEFyZ3VtZW50RXJyb3IoJ2ludmFsaWQgbWV0aG9kJylcbiAgICAgIH1cblxuICAgICAgaWYgKG9uSW5mbyAmJiB0eXBlb2Ygb25JbmZvICE9PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgIHRocm93IG5ldyBJbnZhbGlkQXJndW1lbnRFcnJvcignaW52YWxpZCBvbkluZm8gY2FsbGJhY2snKVxuICAgICAgfVxuXG4gICAgICBzdXBlcignVU5ESUNJX1NUUkVBTScpXG4gICAgfSBjYXRjaCAoZXJyKSB7XG4gICAgICBpZiAodXRpbC5pc1N0cmVhbShib2R5KSkge1xuICAgICAgICB1dGlsLmRlc3Ryb3koYm9keS5vbignZXJyb3InLCB1dGlsLm5vcCksIGVycilcbiAgICAgIH1cbiAgICAgIHRocm93IGVyclxuICAgIH1cblxuICAgIHRoaXMucmVzcG9uc2VIZWFkZXJzID0gcmVzcG9uc2VIZWFkZXJzIHx8IG51bGxcbiAgICB0aGlzLm9wYXF1ZSA9IG9wYXF1ZSB8fCBudWxsXG4gICAgdGhpcy5mYWN0b3J5ID0gZmFjdG9yeVxuICAgIHRoaXMuY2FsbGJhY2sgPSBjYWxsYmFja1xuICAgIHRoaXMucmVzID0gbnVsbFxuICAgIHRoaXMuYWJvcnQgPSBudWxsXG4gICAgdGhpcy5jb250ZXh0ID0gbnVsbFxuICAgIHRoaXMudHJhaWxlcnMgPSBudWxsXG4gICAgdGhpcy5ib2R5ID0gYm9keVxuICAgIHRoaXMub25JbmZvID0gb25JbmZvIHx8IG51bGxcbiAgICB0aGlzLnRocm93T25FcnJvciA9IHRocm93T25FcnJvciB8fCBmYWxzZVxuXG4gICAgaWYgKHV0aWwuaXNTdHJlYW0oYm9keSkpIHtcbiAgICAgIGJvZHkub24oJ2Vycm9yJywgKGVycikgPT4ge1xuICAgICAgICB0aGlzLm9uRXJyb3IoZXJyKVxuICAgICAgfSlcbiAgICB9XG5cbiAgICBhZGRTaWduYWwodGhpcywgc2lnbmFsKVxuICB9XG5cbiAgb25Db25uZWN0IChhYm9ydCwgY29udGV4dCkge1xuICAgIGlmICghdGhpcy5jYWxsYmFjaykge1xuICAgICAgdGhyb3cgbmV3IFJlcXVlc3RBYm9ydGVkRXJyb3IoKVxuICAgIH1cblxuICAgIHRoaXMuYWJvcnQgPSBhYm9ydFxuICAgIHRoaXMuY29udGV4dCA9IGNvbnRleHRcbiAgfVxuXG4gIG9uSGVhZGVycyAoc3RhdHVzQ29kZSwgcmF3SGVhZGVycywgcmVzdW1lLCBzdGF0dXNNZXNzYWdlKSB7XG4gICAgY29uc3QgeyBmYWN0b3J5LCBvcGFxdWUsIGNvbnRleHQsIGNhbGxiYWNrLCByZXNwb25zZUhlYWRlcnMgfSA9IHRoaXNcblxuICAgIGNvbnN0IGhlYWRlcnMgPSByZXNwb25zZUhlYWRlcnMgPT09ICdyYXcnID8gdXRpbC5wYXJzZVJhd0hlYWRlcnMocmF3SGVhZGVycykgOiB1dGlsLnBhcnNlSGVhZGVycyhyYXdIZWFkZXJzKVxuXG4gICAgaWYgKHN0YXR1c0NvZGUgPCAyMDApIHtcbiAgICAgIGlmICh0aGlzLm9uSW5mbykge1xuICAgICAgICB0aGlzLm9uSW5mbyh7IHN0YXR1c0NvZGUsIGhlYWRlcnMgfSlcbiAgICAgIH1cbiAgICAgIHJldHVyblxuICAgIH1cblxuICAgIHRoaXMuZmFjdG9yeSA9IG51bGxcblxuICAgIGxldCByZXNcblxuICAgIGlmICh0aGlzLnRocm93T25FcnJvciAmJiBzdGF0dXNDb2RlID49IDQwMCkge1xuICAgICAgY29uc3QgcGFyc2VkSGVhZGVycyA9IHJlc3BvbnNlSGVhZGVycyA9PT0gJ3JhdycgPyB1dGlsLnBhcnNlSGVhZGVycyhyYXdIZWFkZXJzKSA6IGhlYWRlcnNcbiAgICAgIGNvbnN0IGNvbnRlbnRUeXBlID0gcGFyc2VkSGVhZGVyc1snY29udGVudC10eXBlJ11cbiAgICAgIHJlcyA9IG5ldyBQYXNzVGhyb3VnaCgpXG5cbiAgICAgIHRoaXMuY2FsbGJhY2sgPSBudWxsXG4gICAgICB0aGlzLnJ1bkluQXN5bmNTY29wZShnZXRSZXNvbHZlRXJyb3JCb2R5Q2FsbGJhY2ssIG51bGwsXG4gICAgICAgIHsgY2FsbGJhY2ssIGJvZHk6IHJlcywgY29udGVudFR5cGUsIHN0YXR1c0NvZGUsIHN0YXR1c01lc3NhZ2UsIGhlYWRlcnMgfVxuICAgICAgKVxuICAgIH0gZWxzZSB7XG4gICAgICBpZiAoZmFjdG9yeSA9PT0gbnVsbCkge1xuICAgICAgICByZXR1cm5cbiAgICAgIH1cblxuICAgICAgcmVzID0gdGhpcy5ydW5JbkFzeW5jU2NvcGUoZmFjdG9yeSwgbnVsbCwge1xuICAgICAgICBzdGF0dXNDb2RlLFxuICAgICAgICBoZWFkZXJzLFxuICAgICAgICBvcGFxdWUsXG4gICAgICAgIGNvbnRleHRcbiAgICAgIH0pXG5cbiAgICAgIGlmIChcbiAgICAgICAgIXJlcyB8fFxuICAgICAgICB0eXBlb2YgcmVzLndyaXRlICE9PSAnZnVuY3Rpb24nIHx8XG4gICAgICAgIHR5cGVvZiByZXMuZW5kICE9PSAnZnVuY3Rpb24nIHx8XG4gICAgICAgIHR5cGVvZiByZXMub24gIT09ICdmdW5jdGlvbidcbiAgICAgICkge1xuICAgICAgICB0aHJvdyBuZXcgSW52YWxpZFJldHVyblZhbHVlRXJyb3IoJ2V4cGVjdGVkIFdyaXRhYmxlJylcbiAgICAgIH1cblxuICAgICAgLy8gVE9ETzogQXZvaWQgZmluaXNoZWQuIEl0IHJlZ2lzdGVycyBhbiB1bm5lY2Vzc2FyeSBhbW91bnQgb2YgbGlzdGVuZXJzLlxuICAgICAgZmluaXNoZWQocmVzLCB7IHJlYWRhYmxlOiBmYWxzZSB9LCAoZXJyKSA9PiB7XG4gICAgICAgIGNvbnN0IHsgY2FsbGJhY2ssIHJlcywgb3BhcXVlLCB0cmFpbGVycywgYWJvcnQgfSA9IHRoaXNcblxuICAgICAgICB0aGlzLnJlcyA9IG51bGxcbiAgICAgICAgaWYgKGVyciB8fCAhcmVzLnJlYWRhYmxlKSB7XG4gICAgICAgICAgdXRpbC5kZXN0cm95KHJlcywgZXJyKVxuICAgICAgICB9XG5cbiAgICAgICAgdGhpcy5jYWxsYmFjayA9IG51bGxcbiAgICAgICAgdGhpcy5ydW5JbkFzeW5jU2NvcGUoY2FsbGJhY2ssIG51bGwsIGVyciB8fCBudWxsLCB7IG9wYXF1ZSwgdHJhaWxlcnMgfSlcblxuICAgICAgICBpZiAoZXJyKSB7XG4gICAgICAgICAgYWJvcnQoKVxuICAgICAgICB9XG4gICAgICB9KVxuICAgIH1cblxuICAgIHJlcy5vbignZHJhaW4nLCByZXN1bWUpXG5cbiAgICB0aGlzLnJlcyA9IHJlc1xuXG4gICAgY29uc3QgbmVlZERyYWluID0gcmVzLndyaXRhYmxlTmVlZERyYWluICE9PSB1bmRlZmluZWRcbiAgICAgID8gcmVzLndyaXRhYmxlTmVlZERyYWluXG4gICAgICA6IHJlcy5fd3JpdGFibGVTdGF0ZSAmJiByZXMuX3dyaXRhYmxlU3RhdGUubmVlZERyYWluXG5cbiAgICByZXR1cm4gbmVlZERyYWluICE9PSB0cnVlXG4gIH1cblxuICBvbkRhdGEgKGNodW5rKSB7XG4gICAgY29uc3QgeyByZXMgfSA9IHRoaXNcblxuICAgIHJldHVybiByZXMgPyByZXMud3JpdGUoY2h1bmspIDogdHJ1ZVxuICB9XG5cbiAgb25Db21wbGV0ZSAodHJhaWxlcnMpIHtcbiAgICBjb25zdCB7IHJlcyB9ID0gdGhpc1xuXG4gICAgcmVtb3ZlU2lnbmFsKHRoaXMpXG5cbiAgICBpZiAoIXJlcykge1xuICAgICAgcmV0dXJuXG4gICAgfVxuXG4gICAgdGhpcy50cmFpbGVycyA9IHV0aWwucGFyc2VIZWFkZXJzKHRyYWlsZXJzKVxuXG4gICAgcmVzLmVuZCgpXG4gIH1cblxuICBvbkVycm9yIChlcnIpIHtcbiAgICBjb25zdCB7IHJlcywgY2FsbGJhY2ssIG9wYXF1ZSwgYm9keSB9ID0gdGhpc1xuXG4gICAgcmVtb3ZlU2lnbmFsKHRoaXMpXG5cbiAgICB0aGlzLmZhY3RvcnkgPSBudWxsXG5cbiAgICBpZiAocmVzKSB7XG4gICAgICB0aGlzLnJlcyA9IG51bGxcbiAgICAgIHV0aWwuZGVzdHJveShyZXMsIGVycilcbiAgICB9IGVsc2UgaWYgKGNhbGxiYWNrKSB7XG4gICAgICB0aGlzLmNhbGxiYWNrID0gbnVsbFxuICAgICAgcXVldWVNaWNyb3Rhc2soKCkgPT4ge1xuICAgICAgICB0aGlzLnJ1bkluQXN5bmNTY29wZShjYWxsYmFjaywgbnVsbCwgZXJyLCB7IG9wYXF1ZSB9KVxuICAgICAgfSlcbiAgICB9XG5cbiAgICBpZiAoYm9keSkge1xuICAgICAgdGhpcy5ib2R5ID0gbnVsbFxuICAgICAgdXRpbC5kZXN0cm95KGJvZHksIGVycilcbiAgICB9XG4gIH1cbn1cblxuZnVuY3Rpb24gc3RyZWFtIChvcHRzLCBmYWN0b3J5LCBjYWxsYmFjaykge1xuICBpZiAoY2FsbGJhY2sgPT09IHVuZGVmaW5lZCkge1xuICAgIHJldHVybiBuZXcgUHJvbWlzZSgocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XG4gICAgICBzdHJlYW0uY2FsbCh0aGlzLCBvcHRzLCBmYWN0b3J5LCAoZXJyLCBkYXRhKSA9PiB7XG4gICAgICAgIHJldHVybiBlcnIgPyByZWplY3QoZXJyKSA6IHJlc29sdmUoZGF0YSlcbiAgICAgIH0pXG4gICAgfSlcbiAgfVxuXG4gIHRyeSB7XG4gICAgdGhpcy5kaXNwYXRjaChvcHRzLCBuZXcgU3RyZWFtSGFuZGxlcihvcHRzLCBmYWN0b3J5LCBjYWxsYmFjaykpXG4gIH0gY2F0Y2ggKGVycikge1xuICAgIGlmICh0eXBlb2YgY2FsbGJhY2sgIT09ICdmdW5jdGlvbicpIHtcbiAgICAgIHRocm93IGVyclxuICAgIH1cbiAgICBjb25zdCBvcGFxdWUgPSBvcHRzICYmIG9wdHMub3BhcXVlXG4gICAgcXVldWVNaWNyb3Rhc2soKCkgPT4gY2FsbGJhY2soZXJyLCB7IG9wYXF1ZSB9KSlcbiAgfVxufVxuXG5tb2R1bGUuZXhwb3J0cyA9IHN0cmVhbVxuIiwKICAgICIndXNlIHN0cmljdCdcblxuY29uc3Qge1xuICBSZWFkYWJsZSxcbiAgRHVwbGV4LFxuICBQYXNzVGhyb3VnaFxufSA9IHJlcXVpcmUoJ3N0cmVhbScpXG5jb25zdCB7XG4gIEludmFsaWRBcmd1bWVudEVycm9yLFxuICBJbnZhbGlkUmV0dXJuVmFsdWVFcnJvcixcbiAgUmVxdWVzdEFib3J0ZWRFcnJvclxufSA9IHJlcXVpcmUoJy4uL2NvcmUvZXJyb3JzJylcbmNvbnN0IHV0aWwgPSByZXF1aXJlKCcuLi9jb3JlL3V0aWwnKVxuY29uc3QgeyBBc3luY1Jlc291cmNlIH0gPSByZXF1aXJlKCdhc3luY19ob29rcycpXG5jb25zdCB7IGFkZFNpZ25hbCwgcmVtb3ZlU2lnbmFsIH0gPSByZXF1aXJlKCcuL2Fib3J0LXNpZ25hbCcpXG5jb25zdCBhc3NlcnQgPSByZXF1aXJlKCdhc3NlcnQnKVxuXG5jb25zdCBrUmVzdW1lID0gU3ltYm9sKCdyZXN1bWUnKVxuXG5jbGFzcyBQaXBlbGluZVJlcXVlc3QgZXh0ZW5kcyBSZWFkYWJsZSB7XG4gIGNvbnN0cnVjdG9yICgpIHtcbiAgICBzdXBlcih7IGF1dG9EZXN0cm95OiB0cnVlIH0pXG5cbiAgICB0aGlzW2tSZXN1bWVdID0gbnVsbFxuICB9XG5cbiAgX3JlYWQgKCkge1xuICAgIGNvbnN0IHsgW2tSZXN1bWVdOiByZXN1bWUgfSA9IHRoaXNcblxuICAgIGlmIChyZXN1bWUpIHtcbiAgICAgIHRoaXNba1Jlc3VtZV0gPSBudWxsXG4gICAgICByZXN1bWUoKVxuICAgIH1cbiAgfVxuXG4gIF9kZXN0cm95IChlcnIsIGNhbGxiYWNrKSB7XG4gICAgdGhpcy5fcmVhZCgpXG5cbiAgICBjYWxsYmFjayhlcnIpXG4gIH1cbn1cblxuY2xhc3MgUGlwZWxpbmVSZXNwb25zZSBleHRlbmRzIFJlYWRhYmxlIHtcbiAgY29uc3RydWN0b3IgKHJlc3VtZSkge1xuICAgIHN1cGVyKHsgYXV0b0Rlc3Ryb3k6IHRydWUgfSlcbiAgICB0aGlzW2tSZXN1bWVdID0gcmVzdW1lXG4gIH1cblxuICBfcmVhZCAoKSB7XG4gICAgdGhpc1trUmVzdW1lXSgpXG4gIH1cblxuICBfZGVzdHJveSAoZXJyLCBjYWxsYmFjaykge1xuICAgIGlmICghZXJyICYmICF0aGlzLl9yZWFkYWJsZVN0YXRlLmVuZEVtaXR0ZWQpIHtcbiAgICAgIGVyciA9IG5ldyBSZXF1ZXN0QWJvcnRlZEVycm9yKClcbiAgICB9XG5cbiAgICBjYWxsYmFjayhlcnIpXG4gIH1cbn1cblxuY2xhc3MgUGlwZWxpbmVIYW5kbGVyIGV4dGVuZHMgQXN5bmNSZXNvdXJjZSB7XG4gIGNvbnN0cnVjdG9yIChvcHRzLCBoYW5kbGVyKSB7XG4gICAgaWYgKCFvcHRzIHx8IHR5cGVvZiBvcHRzICE9PSAnb2JqZWN0Jykge1xuICAgICAgdGhyb3cgbmV3IEludmFsaWRBcmd1bWVudEVycm9yKCdpbnZhbGlkIG9wdHMnKVxuICAgIH1cblxuICAgIGlmICh0eXBlb2YgaGFuZGxlciAhPT0gJ2Z1bmN0aW9uJykge1xuICAgICAgdGhyb3cgbmV3IEludmFsaWRBcmd1bWVudEVycm9yKCdpbnZhbGlkIGhhbmRsZXInKVxuICAgIH1cblxuICAgIGNvbnN0IHsgc2lnbmFsLCBtZXRob2QsIG9wYXF1ZSwgb25JbmZvLCByZXNwb25zZUhlYWRlcnMgfSA9IG9wdHNcblxuICAgIGlmIChzaWduYWwgJiYgdHlwZW9mIHNpZ25hbC5vbiAhPT0gJ2Z1bmN0aW9uJyAmJiB0eXBlb2Ygc2lnbmFsLmFkZEV2ZW50TGlzdGVuZXIgIT09ICdmdW5jdGlvbicpIHtcbiAgICAgIHRocm93IG5ldyBJbnZhbGlkQXJndW1lbnRFcnJvcignc2lnbmFsIG11c3QgYmUgYW4gRXZlbnRFbWl0dGVyIG9yIEV2ZW50VGFyZ2V0JylcbiAgICB9XG5cbiAgICBpZiAobWV0aG9kID09PSAnQ09OTkVDVCcpIHtcbiAgICAgIHRocm93IG5ldyBJbnZhbGlkQXJndW1lbnRFcnJvcignaW52YWxpZCBtZXRob2QnKVxuICAgIH1cblxuICAgIGlmIChvbkluZm8gJiYgdHlwZW9mIG9uSW5mbyAhPT0gJ2Z1bmN0aW9uJykge1xuICAgICAgdGhyb3cgbmV3IEludmFsaWRBcmd1bWVudEVycm9yKCdpbnZhbGlkIG9uSW5mbyBjYWxsYmFjaycpXG4gICAgfVxuXG4gICAgc3VwZXIoJ1VORElDSV9QSVBFTElORScpXG5cbiAgICB0aGlzLm9wYXF1ZSA9IG9wYXF1ZSB8fCBudWxsXG4gICAgdGhpcy5yZXNwb25zZUhlYWRlcnMgPSByZXNwb25zZUhlYWRlcnMgfHwgbnVsbFxuICAgIHRoaXMuaGFuZGxlciA9IGhhbmRsZXJcbiAgICB0aGlzLmFib3J0ID0gbnVsbFxuICAgIHRoaXMuY29udGV4dCA9IG51bGxcbiAgICB0aGlzLm9uSW5mbyA9IG9uSW5mbyB8fCBudWxsXG5cbiAgICB0aGlzLnJlcSA9IG5ldyBQaXBlbGluZVJlcXVlc3QoKS5vbignZXJyb3InLCB1dGlsLm5vcClcblxuICAgIHRoaXMucmV0ID0gbmV3IER1cGxleCh7XG4gICAgICByZWFkYWJsZU9iamVjdE1vZGU6IG9wdHMub2JqZWN0TW9kZSxcbiAgICAgIGF1dG9EZXN0cm95OiB0cnVlLFxuICAgICAgcmVhZDogKCkgPT4ge1xuICAgICAgICBjb25zdCB7IGJvZHkgfSA9IHRoaXNcblxuICAgICAgICBpZiAoYm9keSAmJiBib2R5LnJlc3VtZSkge1xuICAgICAgICAgIGJvZHkucmVzdW1lKClcbiAgICAgICAgfVxuICAgICAgfSxcbiAgICAgIHdyaXRlOiAoY2h1bmssIGVuY29kaW5nLCBjYWxsYmFjaykgPT4ge1xuICAgICAgICBjb25zdCB7IHJlcSB9ID0gdGhpc1xuXG4gICAgICAgIGlmIChyZXEucHVzaChjaHVuaywgZW5jb2RpbmcpIHx8IHJlcS5fcmVhZGFibGVTdGF0ZS5kZXN0cm95ZWQpIHtcbiAgICAgICAgICBjYWxsYmFjaygpXG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgcmVxW2tSZXN1bWVdID0gY2FsbGJhY2tcbiAgICAgICAgfVxuICAgICAgfSxcbiAgICAgIGRlc3Ryb3k6IChlcnIsIGNhbGxiYWNrKSA9PiB7XG4gICAgICAgIGNvbnN0IHsgYm9keSwgcmVxLCByZXMsIHJldCwgYWJvcnQgfSA9IHRoaXNcblxuICAgICAgICBpZiAoIWVyciAmJiAhcmV0Ll9yZWFkYWJsZVN0YXRlLmVuZEVtaXR0ZWQpIHtcbiAgICAgICAgICBlcnIgPSBuZXcgUmVxdWVzdEFib3J0ZWRFcnJvcigpXG4gICAgICAgIH1cblxuICAgICAgICBpZiAoYWJvcnQgJiYgZXJyKSB7XG4gICAgICAgICAgYWJvcnQoKVxuICAgICAgICB9XG5cbiAgICAgICAgdXRpbC5kZXN0cm95KGJvZHksIGVycilcbiAgICAgICAgdXRpbC5kZXN0cm95KHJlcSwgZXJyKVxuICAgICAgICB1dGlsLmRlc3Ryb3kocmVzLCBlcnIpXG5cbiAgICAgICAgcmVtb3ZlU2lnbmFsKHRoaXMpXG5cbiAgICAgICAgY2FsbGJhY2soZXJyKVxuICAgICAgfVxuICAgIH0pLm9uKCdwcmVmaW5pc2gnLCAoKSA9PiB7XG4gICAgICBjb25zdCB7IHJlcSB9ID0gdGhpc1xuXG4gICAgICAvLyBOb2RlIDwgMTUgZG9lcyBub3QgY2FsbCBfZmluYWwgaW4gc2FtZSB0aWNrLlxuICAgICAgcmVxLnB1c2gobnVsbClcbiAgICB9KVxuXG4gICAgdGhpcy5yZXMgPSBudWxsXG5cbiAgICBhZGRTaWduYWwodGhpcywgc2lnbmFsKVxuICB9XG5cbiAgb25Db25uZWN0IChhYm9ydCwgY29udGV4dCkge1xuICAgIGNvbnN0IHsgcmV0LCByZXMgfSA9IHRoaXNcblxuICAgIGFzc2VydCghcmVzLCAncGlwZWxpbmUgY2Fubm90IGJlIHJldHJpZWQnKVxuXG4gICAgaWYgKHJldC5kZXN0cm95ZWQpIHtcbiAgICAgIHRocm93IG5ldyBSZXF1ZXN0QWJvcnRlZEVycm9yKClcbiAgICB9XG5cbiAgICB0aGlzLmFib3J0ID0gYWJvcnRcbiAgICB0aGlzLmNvbnRleHQgPSBjb250ZXh0XG4gIH1cblxuICBvbkhlYWRlcnMgKHN0YXR1c0NvZGUsIHJhd0hlYWRlcnMsIHJlc3VtZSkge1xuICAgIGNvbnN0IHsgb3BhcXVlLCBoYW5kbGVyLCBjb250ZXh0IH0gPSB0aGlzXG5cbiAgICBpZiAoc3RhdHVzQ29kZSA8IDIwMCkge1xuICAgICAgaWYgKHRoaXMub25JbmZvKSB7XG4gICAgICAgIGNvbnN0IGhlYWRlcnMgPSB0aGlzLnJlc3BvbnNlSGVhZGVycyA9PT0gJ3JhdycgPyB1dGlsLnBhcnNlUmF3SGVhZGVycyhyYXdIZWFkZXJzKSA6IHV0aWwucGFyc2VIZWFkZXJzKHJhd0hlYWRlcnMpXG4gICAgICAgIHRoaXMub25JbmZvKHsgc3RhdHVzQ29kZSwgaGVhZGVycyB9KVxuICAgICAgfVxuICAgICAgcmV0dXJuXG4gICAgfVxuXG4gICAgdGhpcy5yZXMgPSBuZXcgUGlwZWxpbmVSZXNwb25zZShyZXN1bWUpXG5cbiAgICBsZXQgYm9keVxuICAgIHRyeSB7XG4gICAgICB0aGlzLmhhbmRsZXIgPSBudWxsXG4gICAgICBjb25zdCBoZWFkZXJzID0gdGhpcy5yZXNwb25zZUhlYWRlcnMgPT09ICdyYXcnID8gdXRpbC5wYXJzZVJhd0hlYWRlcnMocmF3SGVhZGVycykgOiB1dGlsLnBhcnNlSGVhZGVycyhyYXdIZWFkZXJzKVxuICAgICAgYm9keSA9IHRoaXMucnVuSW5Bc3luY1Njb3BlKGhhbmRsZXIsIG51bGwsIHtcbiAgICAgICAgc3RhdHVzQ29kZSxcbiAgICAgICAgaGVhZGVycyxcbiAgICAgICAgb3BhcXVlLFxuICAgICAgICBib2R5OiB0aGlzLnJlcyxcbiAgICAgICAgY29udGV4dFxuICAgICAgfSlcbiAgICB9IGNhdGNoIChlcnIpIHtcbiAgICAgIHRoaXMucmVzLm9uKCdlcnJvcicsIHV0aWwubm9wKVxuICAgICAgdGhyb3cgZXJyXG4gICAgfVxuXG4gICAgaWYgKCFib2R5IHx8IHR5cGVvZiBib2R5Lm9uICE9PSAnZnVuY3Rpb24nKSB7XG4gICAgICB0aHJvdyBuZXcgSW52YWxpZFJldHVyblZhbHVlRXJyb3IoJ2V4cGVjdGVkIFJlYWRhYmxlJylcbiAgICB9XG5cbiAgICBib2R5XG4gICAgICAub24oJ2RhdGEnLCAoY2h1bmspID0+IHtcbiAgICAgICAgY29uc3QgeyByZXQsIGJvZHkgfSA9IHRoaXNcblxuICAgICAgICBpZiAoIXJldC5wdXNoKGNodW5rKSAmJiBib2R5LnBhdXNlKSB7XG4gICAgICAgICAgYm9keS5wYXVzZSgpXG4gICAgICAgIH1cbiAgICAgIH0pXG4gICAgICAub24oJ2Vycm9yJywgKGVycikgPT4ge1xuICAgICAgICBjb25zdCB7IHJldCB9ID0gdGhpc1xuXG4gICAgICAgIHV0aWwuZGVzdHJveShyZXQsIGVycilcbiAgICAgIH0pXG4gICAgICAub24oJ2VuZCcsICgpID0+IHtcbiAgICAgICAgY29uc3QgeyByZXQgfSA9IHRoaXNcblxuICAgICAgICByZXQucHVzaChudWxsKVxuICAgICAgfSlcbiAgICAgIC5vbignY2xvc2UnLCAoKSA9PiB7XG4gICAgICAgIGNvbnN0IHsgcmV0IH0gPSB0aGlzXG5cbiAgICAgICAgaWYgKCFyZXQuX3JlYWRhYmxlU3RhdGUuZW5kZWQpIHtcbiAgICAgICAgICB1dGlsLmRlc3Ryb3kocmV0LCBuZXcgUmVxdWVzdEFib3J0ZWRFcnJvcigpKVxuICAgICAgICB9XG4gICAgICB9KVxuXG4gICAgdGhpcy5ib2R5ID0gYm9keVxuICB9XG5cbiAgb25EYXRhIChjaHVuaykge1xuICAgIGNvbnN0IHsgcmVzIH0gPSB0aGlzXG4gICAgcmV0dXJuIHJlcy5wdXNoKGNodW5rKVxuICB9XG5cbiAgb25Db21wbGV0ZSAodHJhaWxlcnMpIHtcbiAgICBjb25zdCB7IHJlcyB9ID0gdGhpc1xuICAgIHJlcy5wdXNoKG51bGwpXG4gIH1cblxuICBvbkVycm9yIChlcnIpIHtcbiAgICBjb25zdCB7IHJldCB9ID0gdGhpc1xuICAgIHRoaXMuaGFuZGxlciA9IG51bGxcbiAgICB1dGlsLmRlc3Ryb3kocmV0LCBlcnIpXG4gIH1cbn1cblxuZnVuY3Rpb24gcGlwZWxpbmUgKG9wdHMsIGhhbmRsZXIpIHtcbiAgdHJ5IHtcbiAgICBjb25zdCBwaXBlbGluZUhhbmRsZXIgPSBuZXcgUGlwZWxpbmVIYW5kbGVyKG9wdHMsIGhhbmRsZXIpXG4gICAgdGhpcy5kaXNwYXRjaCh7IC4uLm9wdHMsIGJvZHk6IHBpcGVsaW5lSGFuZGxlci5yZXEgfSwgcGlwZWxpbmVIYW5kbGVyKVxuICAgIHJldHVybiBwaXBlbGluZUhhbmRsZXIucmV0XG4gIH0gY2F0Y2ggKGVycikge1xuICAgIHJldHVybiBuZXcgUGFzc1Rocm91Z2goKS5kZXN0cm95KGVycilcbiAgfVxufVxuXG5tb2R1bGUuZXhwb3J0cyA9IHBpcGVsaW5lXG4iLAogICAgIid1c2Ugc3RyaWN0J1xuXG5jb25zdCB7IEludmFsaWRBcmd1bWVudEVycm9yLCBSZXF1ZXN0QWJvcnRlZEVycm9yLCBTb2NrZXRFcnJvciB9ID0gcmVxdWlyZSgnLi4vY29yZS9lcnJvcnMnKVxuY29uc3QgeyBBc3luY1Jlc291cmNlIH0gPSByZXF1aXJlKCdhc3luY19ob29rcycpXG5jb25zdCB1dGlsID0gcmVxdWlyZSgnLi4vY29yZS91dGlsJylcbmNvbnN0IHsgYWRkU2lnbmFsLCByZW1vdmVTaWduYWwgfSA9IHJlcXVpcmUoJy4vYWJvcnQtc2lnbmFsJylcbmNvbnN0IGFzc2VydCA9IHJlcXVpcmUoJ2Fzc2VydCcpXG5cbmNsYXNzIFVwZ3JhZGVIYW5kbGVyIGV4dGVuZHMgQXN5bmNSZXNvdXJjZSB7XG4gIGNvbnN0cnVjdG9yIChvcHRzLCBjYWxsYmFjaykge1xuICAgIGlmICghb3B0cyB8fCB0eXBlb2Ygb3B0cyAhPT0gJ29iamVjdCcpIHtcbiAgICAgIHRocm93IG5ldyBJbnZhbGlkQXJndW1lbnRFcnJvcignaW52YWxpZCBvcHRzJylcbiAgICB9XG5cbiAgICBpZiAodHlwZW9mIGNhbGxiYWNrICE9PSAnZnVuY3Rpb24nKSB7XG4gICAgICB0aHJvdyBuZXcgSW52YWxpZEFyZ3VtZW50RXJyb3IoJ2ludmFsaWQgY2FsbGJhY2snKVxuICAgIH1cblxuICAgIGNvbnN0IHsgc2lnbmFsLCBvcGFxdWUsIHJlc3BvbnNlSGVhZGVycyB9ID0gb3B0c1xuXG4gICAgaWYgKHNpZ25hbCAmJiB0eXBlb2Ygc2lnbmFsLm9uICE9PSAnZnVuY3Rpb24nICYmIHR5cGVvZiBzaWduYWwuYWRkRXZlbnRMaXN0ZW5lciAhPT0gJ2Z1bmN0aW9uJykge1xuICAgICAgdGhyb3cgbmV3IEludmFsaWRBcmd1bWVudEVycm9yKCdzaWduYWwgbXVzdCBiZSBhbiBFdmVudEVtaXR0ZXIgb3IgRXZlbnRUYXJnZXQnKVxuICAgIH1cblxuICAgIHN1cGVyKCdVTkRJQ0lfVVBHUkFERScpXG5cbiAgICB0aGlzLnJlc3BvbnNlSGVhZGVycyA9IHJlc3BvbnNlSGVhZGVycyB8fCBudWxsXG4gICAgdGhpcy5vcGFxdWUgPSBvcGFxdWUgfHwgbnVsbFxuICAgIHRoaXMuY2FsbGJhY2sgPSBjYWxsYmFja1xuICAgIHRoaXMuYWJvcnQgPSBudWxsXG4gICAgdGhpcy5jb250ZXh0ID0gbnVsbFxuXG4gICAgYWRkU2lnbmFsKHRoaXMsIHNpZ25hbClcbiAgfVxuXG4gIG9uQ29ubmVjdCAoYWJvcnQsIGNvbnRleHQpIHtcbiAgICBpZiAoIXRoaXMuY2FsbGJhY2spIHtcbiAgICAgIHRocm93IG5ldyBSZXF1ZXN0QWJvcnRlZEVycm9yKClcbiAgICB9XG5cbiAgICB0aGlzLmFib3J0ID0gYWJvcnRcbiAgICB0aGlzLmNvbnRleHQgPSBudWxsXG4gIH1cblxuICBvbkhlYWRlcnMgKCkge1xuICAgIHRocm93IG5ldyBTb2NrZXRFcnJvcignYmFkIHVwZ3JhZGUnLCBudWxsKVxuICB9XG5cbiAgb25VcGdyYWRlIChzdGF0dXNDb2RlLCByYXdIZWFkZXJzLCBzb2NrZXQpIHtcbiAgICBjb25zdCB7IGNhbGxiYWNrLCBvcGFxdWUsIGNvbnRleHQgfSA9IHRoaXNcblxuICAgIGFzc2VydC5zdHJpY3RFcXVhbChzdGF0dXNDb2RlLCAxMDEpXG5cbiAgICByZW1vdmVTaWduYWwodGhpcylcblxuICAgIHRoaXMuY2FsbGJhY2sgPSBudWxsXG4gICAgY29uc3QgaGVhZGVycyA9IHRoaXMucmVzcG9uc2VIZWFkZXJzID09PSAncmF3JyA/IHV0aWwucGFyc2VSYXdIZWFkZXJzKHJhd0hlYWRlcnMpIDogdXRpbC5wYXJzZUhlYWRlcnMocmF3SGVhZGVycylcbiAgICB0aGlzLnJ1bkluQXN5bmNTY29wZShjYWxsYmFjaywgbnVsbCwgbnVsbCwge1xuICAgICAgaGVhZGVycyxcbiAgICAgIHNvY2tldCxcbiAgICAgIG9wYXF1ZSxcbiAgICAgIGNvbnRleHRcbiAgICB9KVxuICB9XG5cbiAgb25FcnJvciAoZXJyKSB7XG4gICAgY29uc3QgeyBjYWxsYmFjaywgb3BhcXVlIH0gPSB0aGlzXG5cbiAgICByZW1vdmVTaWduYWwodGhpcylcblxuICAgIGlmIChjYWxsYmFjaykge1xuICAgICAgdGhpcy5jYWxsYmFjayA9IG51bGxcbiAgICAgIHF1ZXVlTWljcm90YXNrKCgpID0+IHtcbiAgICAgICAgdGhpcy5ydW5JbkFzeW5jU2NvcGUoY2FsbGJhY2ssIG51bGwsIGVyciwgeyBvcGFxdWUgfSlcbiAgICAgIH0pXG4gICAgfVxuICB9XG59XG5cbmZ1bmN0aW9uIHVwZ3JhZGUgKG9wdHMsIGNhbGxiYWNrKSB7XG4gIGlmIChjYWxsYmFjayA9PT0gdW5kZWZpbmVkKSB7XG4gICAgcmV0dXJuIG5ldyBQcm9taXNlKChyZXNvbHZlLCByZWplY3QpID0+IHtcbiAgICAgIHVwZ3JhZGUuY2FsbCh0aGlzLCBvcHRzLCAoZXJyLCBkYXRhKSA9PiB7XG4gICAgICAgIHJldHVybiBlcnIgPyByZWplY3QoZXJyKSA6IHJlc29sdmUoZGF0YSlcbiAgICAgIH0pXG4gICAgfSlcbiAgfVxuXG4gIHRyeSB7XG4gICAgY29uc3QgdXBncmFkZUhhbmRsZXIgPSBuZXcgVXBncmFkZUhhbmRsZXIob3B0cywgY2FsbGJhY2spXG4gICAgdGhpcy5kaXNwYXRjaCh7XG4gICAgICAuLi5vcHRzLFxuICAgICAgbWV0aG9kOiBvcHRzLm1ldGhvZCB8fCAnR0VUJyxcbiAgICAgIHVwZ3JhZGU6IG9wdHMucHJvdG9jb2wgfHwgJ1dlYnNvY2tldCdcbiAgICB9LCB1cGdyYWRlSGFuZGxlcilcbiAgfSBjYXRjaCAoZXJyKSB7XG4gICAgaWYgKHR5cGVvZiBjYWxsYmFjayAhPT0gJ2Z1bmN0aW9uJykge1xuICAgICAgdGhyb3cgZXJyXG4gICAgfVxuICAgIGNvbnN0IG9wYXF1ZSA9IG9wdHMgJiYgb3B0cy5vcGFxdWVcbiAgICBxdWV1ZU1pY3JvdGFzaygoKSA9PiBjYWxsYmFjayhlcnIsIHsgb3BhcXVlIH0pKVxuICB9XG59XG5cbm1vZHVsZS5leHBvcnRzID0gdXBncmFkZVxuIiwKICAgICIndXNlIHN0cmljdCdcblxuY29uc3QgeyBBc3luY1Jlc291cmNlIH0gPSByZXF1aXJlKCdhc3luY19ob29rcycpXG5jb25zdCB7IEludmFsaWRBcmd1bWVudEVycm9yLCBSZXF1ZXN0QWJvcnRlZEVycm9yLCBTb2NrZXRFcnJvciB9ID0gcmVxdWlyZSgnLi4vY29yZS9lcnJvcnMnKVxuY29uc3QgdXRpbCA9IHJlcXVpcmUoJy4uL2NvcmUvdXRpbCcpXG5jb25zdCB7IGFkZFNpZ25hbCwgcmVtb3ZlU2lnbmFsIH0gPSByZXF1aXJlKCcuL2Fib3J0LXNpZ25hbCcpXG5cbmNsYXNzIENvbm5lY3RIYW5kbGVyIGV4dGVuZHMgQXN5bmNSZXNvdXJjZSB7XG4gIGNvbnN0cnVjdG9yIChvcHRzLCBjYWxsYmFjaykge1xuICAgIGlmICghb3B0cyB8fCB0eXBlb2Ygb3B0cyAhPT0gJ29iamVjdCcpIHtcbiAgICAgIHRocm93IG5ldyBJbnZhbGlkQXJndW1lbnRFcnJvcignaW52YWxpZCBvcHRzJylcbiAgICB9XG5cbiAgICBpZiAodHlwZW9mIGNhbGxiYWNrICE9PSAnZnVuY3Rpb24nKSB7XG4gICAgICB0aHJvdyBuZXcgSW52YWxpZEFyZ3VtZW50RXJyb3IoJ2ludmFsaWQgY2FsbGJhY2snKVxuICAgIH1cblxuICAgIGNvbnN0IHsgc2lnbmFsLCBvcGFxdWUsIHJlc3BvbnNlSGVhZGVycyB9ID0gb3B0c1xuXG4gICAgaWYgKHNpZ25hbCAmJiB0eXBlb2Ygc2lnbmFsLm9uICE9PSAnZnVuY3Rpb24nICYmIHR5cGVvZiBzaWduYWwuYWRkRXZlbnRMaXN0ZW5lciAhPT0gJ2Z1bmN0aW9uJykge1xuICAgICAgdGhyb3cgbmV3IEludmFsaWRBcmd1bWVudEVycm9yKCdzaWduYWwgbXVzdCBiZSBhbiBFdmVudEVtaXR0ZXIgb3IgRXZlbnRUYXJnZXQnKVxuICAgIH1cblxuICAgIHN1cGVyKCdVTkRJQ0lfQ09OTkVDVCcpXG5cbiAgICB0aGlzLm9wYXF1ZSA9IG9wYXF1ZSB8fCBudWxsXG4gICAgdGhpcy5yZXNwb25zZUhlYWRlcnMgPSByZXNwb25zZUhlYWRlcnMgfHwgbnVsbFxuICAgIHRoaXMuY2FsbGJhY2sgPSBjYWxsYmFja1xuICAgIHRoaXMuYWJvcnQgPSBudWxsXG5cbiAgICBhZGRTaWduYWwodGhpcywgc2lnbmFsKVxuICB9XG5cbiAgb25Db25uZWN0IChhYm9ydCwgY29udGV4dCkge1xuICAgIGlmICghdGhpcy5jYWxsYmFjaykge1xuICAgICAgdGhyb3cgbmV3IFJlcXVlc3RBYm9ydGVkRXJyb3IoKVxuICAgIH1cblxuICAgIHRoaXMuYWJvcnQgPSBhYm9ydFxuICAgIHRoaXMuY29udGV4dCA9IGNvbnRleHRcbiAgfVxuXG4gIG9uSGVhZGVycyAoKSB7XG4gICAgdGhyb3cgbmV3IFNvY2tldEVycm9yKCdiYWQgY29ubmVjdCcsIG51bGwpXG4gIH1cblxuICBvblVwZ3JhZGUgKHN0YXR1c0NvZGUsIHJhd0hlYWRlcnMsIHNvY2tldCkge1xuICAgIGNvbnN0IHsgY2FsbGJhY2ssIG9wYXF1ZSwgY29udGV4dCB9ID0gdGhpc1xuXG4gICAgcmVtb3ZlU2lnbmFsKHRoaXMpXG5cbiAgICB0aGlzLmNhbGxiYWNrID0gbnVsbFxuXG4gICAgbGV0IGhlYWRlcnMgPSByYXdIZWFkZXJzXG4gICAgLy8gSW5kaWNhdGVzIGlzIGFuIEhUVFAyU2Vzc2lvblxuICAgIGlmIChoZWFkZXJzICE9IG51bGwpIHtcbiAgICAgIGhlYWRlcnMgPSB0aGlzLnJlc3BvbnNlSGVhZGVycyA9PT0gJ3JhdycgPyB1dGlsLnBhcnNlUmF3SGVhZGVycyhyYXdIZWFkZXJzKSA6IHV0aWwucGFyc2VIZWFkZXJzKHJhd0hlYWRlcnMpXG4gICAgfVxuXG4gICAgdGhpcy5ydW5JbkFzeW5jU2NvcGUoY2FsbGJhY2ssIG51bGwsIG51bGwsIHtcbiAgICAgIHN0YXR1c0NvZGUsXG4gICAgICBoZWFkZXJzLFxuICAgICAgc29ja2V0LFxuICAgICAgb3BhcXVlLFxuICAgICAgY29udGV4dFxuICAgIH0pXG4gIH1cblxuICBvbkVycm9yIChlcnIpIHtcbiAgICBjb25zdCB7IGNhbGxiYWNrLCBvcGFxdWUgfSA9IHRoaXNcblxuICAgIHJlbW92ZVNpZ25hbCh0aGlzKVxuXG4gICAgaWYgKGNhbGxiYWNrKSB7XG4gICAgICB0aGlzLmNhbGxiYWNrID0gbnVsbFxuICAgICAgcXVldWVNaWNyb3Rhc2soKCkgPT4ge1xuICAgICAgICB0aGlzLnJ1bkluQXN5bmNTY29wZShjYWxsYmFjaywgbnVsbCwgZXJyLCB7IG9wYXF1ZSB9KVxuICAgICAgfSlcbiAgICB9XG4gIH1cbn1cblxuZnVuY3Rpb24gY29ubmVjdCAob3B0cywgY2FsbGJhY2spIHtcbiAgaWYgKGNhbGxiYWNrID09PSB1bmRlZmluZWQpIHtcbiAgICByZXR1cm4gbmV3IFByb21pc2UoKHJlc29sdmUsIHJlamVjdCkgPT4ge1xuICAgICAgY29ubmVjdC5jYWxsKHRoaXMsIG9wdHMsIChlcnIsIGRhdGEpID0+IHtcbiAgICAgICAgcmV0dXJuIGVyciA/IHJlamVjdChlcnIpIDogcmVzb2x2ZShkYXRhKVxuICAgICAgfSlcbiAgICB9KVxuICB9XG5cbiAgdHJ5IHtcbiAgICBjb25zdCBjb25uZWN0SGFuZGxlciA9IG5ldyBDb25uZWN0SGFuZGxlcihvcHRzLCBjYWxsYmFjaylcbiAgICB0aGlzLmRpc3BhdGNoKHsgLi4ub3B0cywgbWV0aG9kOiAnQ09OTkVDVCcgfSwgY29ubmVjdEhhbmRsZXIpXG4gIH0gY2F0Y2ggKGVycikge1xuICAgIGlmICh0eXBlb2YgY2FsbGJhY2sgIT09ICdmdW5jdGlvbicpIHtcbiAgICAgIHRocm93IGVyclxuICAgIH1cbiAgICBjb25zdCBvcGFxdWUgPSBvcHRzICYmIG9wdHMub3BhcXVlXG4gICAgcXVldWVNaWNyb3Rhc2soKCkgPT4gY2FsbGJhY2soZXJyLCB7IG9wYXF1ZSB9KSlcbiAgfVxufVxuXG5tb2R1bGUuZXhwb3J0cyA9IGNvbm5lY3RcbiIsCiAgICAiJ3VzZSBzdHJpY3QnXG5cbm1vZHVsZS5leHBvcnRzLnJlcXVlc3QgPSByZXF1aXJlKCcuL2FwaS1yZXF1ZXN0Jylcbm1vZHVsZS5leHBvcnRzLnN0cmVhbSA9IHJlcXVpcmUoJy4vYXBpLXN0cmVhbScpXG5tb2R1bGUuZXhwb3J0cy5waXBlbGluZSA9IHJlcXVpcmUoJy4vYXBpLXBpcGVsaW5lJylcbm1vZHVsZS5leHBvcnRzLnVwZ3JhZGUgPSByZXF1aXJlKCcuL2FwaS11cGdyYWRlJylcbm1vZHVsZS5leHBvcnRzLmNvbm5lY3QgPSByZXF1aXJlKCcuL2FwaS1jb25uZWN0JylcbiIsCiAgICAiJ3VzZSBzdHJpY3QnXG5cbmNvbnN0IHsgVW5kaWNpRXJyb3IgfSA9IHJlcXVpcmUoJy4uL2NvcmUvZXJyb3JzJylcblxuY2xhc3MgTW9ja05vdE1hdGNoZWRFcnJvciBleHRlbmRzIFVuZGljaUVycm9yIHtcbiAgY29uc3RydWN0b3IgKG1lc3NhZ2UpIHtcbiAgICBzdXBlcihtZXNzYWdlKVxuICAgIEVycm9yLmNhcHR1cmVTdGFja1RyYWNlKHRoaXMsIE1vY2tOb3RNYXRjaGVkRXJyb3IpXG4gICAgdGhpcy5uYW1lID0gJ01vY2tOb3RNYXRjaGVkRXJyb3InXG4gICAgdGhpcy5tZXNzYWdlID0gbWVzc2FnZSB8fCAnVGhlIHJlcXVlc3QgZG9lcyBub3QgbWF0Y2ggYW55IHJlZ2lzdGVyZWQgbW9jayBkaXNwYXRjaGVzJ1xuICAgIHRoaXMuY29kZSA9ICdVTkRfTU9DS19FUlJfTU9DS19OT1RfTUFUQ0hFRCdcbiAgfVxufVxuXG5tb2R1bGUuZXhwb3J0cyA9IHtcbiAgTW9ja05vdE1hdGNoZWRFcnJvclxufVxuIiwKICAgICIndXNlIHN0cmljdCdcblxubW9kdWxlLmV4cG9ydHMgPSB7XG4gIGtBZ2VudDogU3ltYm9sKCdhZ2VudCcpLFxuICBrT3B0aW9uczogU3ltYm9sKCdvcHRpb25zJyksXG4gIGtGYWN0b3J5OiBTeW1ib2woJ2ZhY3RvcnknKSxcbiAga0Rpc3BhdGNoZXM6IFN5bWJvbCgnZGlzcGF0Y2hlcycpLFxuICBrRGlzcGF0Y2hLZXk6IFN5bWJvbCgnZGlzcGF0Y2gga2V5JyksXG4gIGtEZWZhdWx0SGVhZGVyczogU3ltYm9sKCdkZWZhdWx0IGhlYWRlcnMnKSxcbiAga0RlZmF1bHRUcmFpbGVyczogU3ltYm9sKCdkZWZhdWx0IHRyYWlsZXJzJyksXG4gIGtDb250ZW50TGVuZ3RoOiBTeW1ib2woJ2NvbnRlbnQgbGVuZ3RoJyksXG4gIGtNb2NrQWdlbnQ6IFN5bWJvbCgnbW9jayBhZ2VudCcpLFxuICBrTW9ja0FnZW50U2V0OiBTeW1ib2woJ21vY2sgYWdlbnQgc2V0JyksXG4gIGtNb2NrQWdlbnRHZXQ6IFN5bWJvbCgnbW9jayBhZ2VudCBnZXQnKSxcbiAga01vY2tEaXNwYXRjaDogU3ltYm9sKCdtb2NrIGRpc3BhdGNoJyksXG4gIGtDbG9zZTogU3ltYm9sKCdjbG9zZScpLFxuICBrT3JpZ2luYWxDbG9zZTogU3ltYm9sKCdvcmlnaW5hbCBhZ2VudCBjbG9zZScpLFxuICBrT3JpZ2luOiBTeW1ib2woJ29yaWdpbicpLFxuICBrSXNNb2NrQWN0aXZlOiBTeW1ib2woJ2lzIG1vY2sgYWN0aXZlJyksXG4gIGtOZXRDb25uZWN0OiBTeW1ib2woJ25ldCBjb25uZWN0JyksXG4gIGtHZXROZXRDb25uZWN0OiBTeW1ib2woJ2dldCBuZXQgY29ubmVjdCcpLFxuICBrQ29ubmVjdGVkOiBTeW1ib2woJ2Nvbm5lY3RlZCcpXG59XG4iLAogICAgIid1c2Ugc3RyaWN0J1xuXG5jb25zdCB7IE1vY2tOb3RNYXRjaGVkRXJyb3IgfSA9IHJlcXVpcmUoJy4vbW9jay1lcnJvcnMnKVxuY29uc3Qge1xuICBrRGlzcGF0Y2hlcyxcbiAga01vY2tBZ2VudCxcbiAga09yaWdpbmFsRGlzcGF0Y2gsXG4gIGtPcmlnaW4sXG4gIGtHZXROZXRDb25uZWN0XG59ID0gcmVxdWlyZSgnLi9tb2NrLXN5bWJvbHMnKVxuY29uc3QgeyBidWlsZFVSTCwgbm9wIH0gPSByZXF1aXJlKCcuLi9jb3JlL3V0aWwnKVxuY29uc3QgeyBTVEFUVVNfQ09ERVMgfSA9IHJlcXVpcmUoJ2h0dHAnKVxuY29uc3Qge1xuICB0eXBlczoge1xuICAgIGlzUHJvbWlzZVxuICB9XG59ID0gcmVxdWlyZSgndXRpbCcpXG5cbmZ1bmN0aW9uIG1hdGNoVmFsdWUgKG1hdGNoLCB2YWx1ZSkge1xuICBpZiAodHlwZW9mIG1hdGNoID09PSAnc3RyaW5nJykge1xuICAgIHJldHVybiBtYXRjaCA9PT0gdmFsdWVcbiAgfVxuICBpZiAobWF0Y2ggaW5zdGFuY2VvZiBSZWdFeHApIHtcbiAgICByZXR1cm4gbWF0Y2gudGVzdCh2YWx1ZSlcbiAgfVxuICBpZiAodHlwZW9mIG1hdGNoID09PSAnZnVuY3Rpb24nKSB7XG4gICAgcmV0dXJuIG1hdGNoKHZhbHVlKSA9PT0gdHJ1ZVxuICB9XG4gIHJldHVybiBmYWxzZVxufVxuXG5mdW5jdGlvbiBsb3dlckNhc2VFbnRyaWVzIChoZWFkZXJzKSB7XG4gIHJldHVybiBPYmplY3QuZnJvbUVudHJpZXMoXG4gICAgT2JqZWN0LmVudHJpZXMoaGVhZGVycykubWFwKChbaGVhZGVyTmFtZSwgaGVhZGVyVmFsdWVdKSA9PiB7XG4gICAgICByZXR1cm4gW2hlYWRlck5hbWUudG9Mb2NhbGVMb3dlckNhc2UoKSwgaGVhZGVyVmFsdWVdXG4gICAgfSlcbiAgKVxufVxuXG4vKipcbiAqIEBwYXJhbSB7aW1wb3J0KCcuLi8uLi9pbmRleCcpLkhlYWRlcnN8c3RyaW5nW118UmVjb3JkPHN0cmluZywgc3RyaW5nPn0gaGVhZGVyc1xuICogQHBhcmFtIHtzdHJpbmd9IGtleVxuICovXG5mdW5jdGlvbiBnZXRIZWFkZXJCeU5hbWUgKGhlYWRlcnMsIGtleSkge1xuICBpZiAoQXJyYXkuaXNBcnJheShoZWFkZXJzKSkge1xuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgaGVhZGVycy5sZW5ndGg7IGkgKz0gMikge1xuICAgICAgaWYgKGhlYWRlcnNbaV0udG9Mb2NhbGVMb3dlckNhc2UoKSA9PT0ga2V5LnRvTG9jYWxlTG93ZXJDYXNlKCkpIHtcbiAgICAgICAgcmV0dXJuIGhlYWRlcnNbaSArIDFdXG4gICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuIHVuZGVmaW5lZFxuICB9IGVsc2UgaWYgKHR5cGVvZiBoZWFkZXJzLmdldCA9PT0gJ2Z1bmN0aW9uJykge1xuICAgIHJldHVybiBoZWFkZXJzLmdldChrZXkpXG4gIH0gZWxzZSB7XG4gICAgcmV0dXJuIGxvd2VyQ2FzZUVudHJpZXMoaGVhZGVycylba2V5LnRvTG9jYWxlTG93ZXJDYXNlKCldXG4gIH1cbn1cblxuLyoqIEBwYXJhbSB7c3RyaW5nW119IGhlYWRlcnMgKi9cbmZ1bmN0aW9uIGJ1aWxkSGVhZGVyc0Zyb21BcnJheSAoaGVhZGVycykgeyAvLyBmZXRjaCBIZWFkZXJzTGlzdFxuICBjb25zdCBjbG9uZSA9IGhlYWRlcnMuc2xpY2UoKVxuICBjb25zdCBlbnRyaWVzID0gW11cbiAgZm9yIChsZXQgaW5kZXggPSAwOyBpbmRleCA8IGNsb25lLmxlbmd0aDsgaW5kZXggKz0gMikge1xuICAgIGVudHJpZXMucHVzaChbY2xvbmVbaW5kZXhdLCBjbG9uZVtpbmRleCArIDFdXSlcbiAgfVxuICByZXR1cm4gT2JqZWN0LmZyb21FbnRyaWVzKGVudHJpZXMpXG59XG5cbmZ1bmN0aW9uIG1hdGNoSGVhZGVycyAobW9ja0Rpc3BhdGNoLCBoZWFkZXJzKSB7XG4gIGlmICh0eXBlb2YgbW9ja0Rpc3BhdGNoLmhlYWRlcnMgPT09ICdmdW5jdGlvbicpIHtcbiAgICBpZiAoQXJyYXkuaXNBcnJheShoZWFkZXJzKSkgeyAvLyBmZXRjaCBIZWFkZXJzTGlzdFxuICAgICAgaGVhZGVycyA9IGJ1aWxkSGVhZGVyc0Zyb21BcnJheShoZWFkZXJzKVxuICAgIH1cbiAgICByZXR1cm4gbW9ja0Rpc3BhdGNoLmhlYWRlcnMoaGVhZGVycyA/IGxvd2VyQ2FzZUVudHJpZXMoaGVhZGVycykgOiB7fSlcbiAgfVxuICBpZiAodHlwZW9mIG1vY2tEaXNwYXRjaC5oZWFkZXJzID09PSAndW5kZWZpbmVkJykge1xuICAgIHJldHVybiB0cnVlXG4gIH1cbiAgaWYgKHR5cGVvZiBoZWFkZXJzICE9PSAnb2JqZWN0JyB8fCB0eXBlb2YgbW9ja0Rpc3BhdGNoLmhlYWRlcnMgIT09ICdvYmplY3QnKSB7XG4gICAgcmV0dXJuIGZhbHNlXG4gIH1cblxuICBmb3IgKGNvbnN0IFttYXRjaEhlYWRlck5hbWUsIG1hdGNoSGVhZGVyVmFsdWVdIG9mIE9iamVjdC5lbnRyaWVzKG1vY2tEaXNwYXRjaC5oZWFkZXJzKSkge1xuICAgIGNvbnN0IGhlYWRlclZhbHVlID0gZ2V0SGVhZGVyQnlOYW1lKGhlYWRlcnMsIG1hdGNoSGVhZGVyTmFtZSlcblxuICAgIGlmICghbWF0Y2hWYWx1ZShtYXRjaEhlYWRlclZhbHVlLCBoZWFkZXJWYWx1ZSkpIHtcbiAgICAgIHJldHVybiBmYWxzZVxuICAgIH1cbiAgfVxuICByZXR1cm4gdHJ1ZVxufVxuXG5mdW5jdGlvbiBzYWZlVXJsIChwYXRoKSB7XG4gIGlmICh0eXBlb2YgcGF0aCAhPT0gJ3N0cmluZycpIHtcbiAgICByZXR1cm4gcGF0aFxuICB9XG5cbiAgY29uc3QgcGF0aFNlZ21lbnRzID0gcGF0aC5zcGxpdCgnPycpXG5cbiAgaWYgKHBhdGhTZWdtZW50cy5sZW5ndGggIT09IDIpIHtcbiAgICByZXR1cm4gcGF0aFxuICB9XG5cbiAgY29uc3QgcXAgPSBuZXcgVVJMU2VhcmNoUGFyYW1zKHBhdGhTZWdtZW50cy5wb3AoKSlcbiAgcXAuc29ydCgpXG4gIHJldHVybiBbLi4ucGF0aFNlZ21lbnRzLCBxcC50b1N0cmluZygpXS5qb2luKCc/Jylcbn1cblxuZnVuY3Rpb24gbWF0Y2hLZXkgKG1vY2tEaXNwYXRjaCwgeyBwYXRoLCBtZXRob2QsIGJvZHksIGhlYWRlcnMgfSkge1xuICBjb25zdCBwYXRoTWF0Y2ggPSBtYXRjaFZhbHVlKG1vY2tEaXNwYXRjaC5wYXRoLCBwYXRoKVxuICBjb25zdCBtZXRob2RNYXRjaCA9IG1hdGNoVmFsdWUobW9ja0Rpc3BhdGNoLm1ldGhvZCwgbWV0aG9kKVxuICBjb25zdCBib2R5TWF0Y2ggPSB0eXBlb2YgbW9ja0Rpc3BhdGNoLmJvZHkgIT09ICd1bmRlZmluZWQnID8gbWF0Y2hWYWx1ZShtb2NrRGlzcGF0Y2guYm9keSwgYm9keSkgOiB0cnVlXG4gIGNvbnN0IGhlYWRlcnNNYXRjaCA9IG1hdGNoSGVhZGVycyhtb2NrRGlzcGF0Y2gsIGhlYWRlcnMpXG4gIHJldHVybiBwYXRoTWF0Y2ggJiYgbWV0aG9kTWF0Y2ggJiYgYm9keU1hdGNoICYmIGhlYWRlcnNNYXRjaFxufVxuXG5mdW5jdGlvbiBnZXRSZXNwb25zZURhdGEgKGRhdGEpIHtcbiAgaWYgKEJ1ZmZlci5pc0J1ZmZlcihkYXRhKSkge1xuICAgIHJldHVybiBkYXRhXG4gIH0gZWxzZSBpZiAodHlwZW9mIGRhdGEgPT09ICdvYmplY3QnKSB7XG4gICAgcmV0dXJuIEpTT04uc3RyaW5naWZ5KGRhdGEpXG4gIH0gZWxzZSB7XG4gICAgcmV0dXJuIGRhdGEudG9TdHJpbmcoKVxuICB9XG59XG5cbmZ1bmN0aW9uIGdldE1vY2tEaXNwYXRjaCAobW9ja0Rpc3BhdGNoZXMsIGtleSkge1xuICBjb25zdCBiYXNlUGF0aCA9IGtleS5xdWVyeSA/IGJ1aWxkVVJMKGtleS5wYXRoLCBrZXkucXVlcnkpIDoga2V5LnBhdGhcbiAgY29uc3QgcmVzb2x2ZWRQYXRoID0gdHlwZW9mIGJhc2VQYXRoID09PSAnc3RyaW5nJyA/IHNhZmVVcmwoYmFzZVBhdGgpIDogYmFzZVBhdGhcblxuICAvLyBNYXRjaCBwYXRoXG4gIGxldCBtYXRjaGVkTW9ja0Rpc3BhdGNoZXMgPSBtb2NrRGlzcGF0Y2hlcy5maWx0ZXIoKHsgY29uc3VtZWQgfSkgPT4gIWNvbnN1bWVkKS5maWx0ZXIoKHsgcGF0aCB9KSA9PiBtYXRjaFZhbHVlKHNhZmVVcmwocGF0aCksIHJlc29sdmVkUGF0aCkpXG4gIGlmIChtYXRjaGVkTW9ja0Rpc3BhdGNoZXMubGVuZ3RoID09PSAwKSB7XG4gICAgdGhyb3cgbmV3IE1vY2tOb3RNYXRjaGVkRXJyb3IoYE1vY2sgZGlzcGF0Y2ggbm90IG1hdGNoZWQgZm9yIHBhdGggJyR7cmVzb2x2ZWRQYXRofSdgKVxuICB9XG5cbiAgLy8gTWF0Y2ggbWV0aG9kXG4gIG1hdGNoZWRNb2NrRGlzcGF0Y2hlcyA9IG1hdGNoZWRNb2NrRGlzcGF0Y2hlcy5maWx0ZXIoKHsgbWV0aG9kIH0pID0+IG1hdGNoVmFsdWUobWV0aG9kLCBrZXkubWV0aG9kKSlcbiAgaWYgKG1hdGNoZWRNb2NrRGlzcGF0Y2hlcy5sZW5ndGggPT09IDApIHtcbiAgICB0aHJvdyBuZXcgTW9ja05vdE1hdGNoZWRFcnJvcihgTW9jayBkaXNwYXRjaCBub3QgbWF0Y2hlZCBmb3IgbWV0aG9kICcke2tleS5tZXRob2R9J2ApXG4gIH1cblxuICAvLyBNYXRjaCBib2R5XG4gIG1hdGNoZWRNb2NrRGlzcGF0Y2hlcyA9IG1hdGNoZWRNb2NrRGlzcGF0Y2hlcy5maWx0ZXIoKHsgYm9keSB9KSA9PiB0eXBlb2YgYm9keSAhPT0gJ3VuZGVmaW5lZCcgPyBtYXRjaFZhbHVlKGJvZHksIGtleS5ib2R5KSA6IHRydWUpXG4gIGlmIChtYXRjaGVkTW9ja0Rpc3BhdGNoZXMubGVuZ3RoID09PSAwKSB7XG4gICAgdGhyb3cgbmV3IE1vY2tOb3RNYXRjaGVkRXJyb3IoYE1vY2sgZGlzcGF0Y2ggbm90IG1hdGNoZWQgZm9yIGJvZHkgJyR7a2V5LmJvZHl9J2ApXG4gIH1cblxuICAvLyBNYXRjaCBoZWFkZXJzXG4gIG1hdGNoZWRNb2NrRGlzcGF0Y2hlcyA9IG1hdGNoZWRNb2NrRGlzcGF0Y2hlcy5maWx0ZXIoKG1vY2tEaXNwYXRjaCkgPT4gbWF0Y2hIZWFkZXJzKG1vY2tEaXNwYXRjaCwga2V5LmhlYWRlcnMpKVxuICBpZiAobWF0Y2hlZE1vY2tEaXNwYXRjaGVzLmxlbmd0aCA9PT0gMCkge1xuICAgIHRocm93IG5ldyBNb2NrTm90TWF0Y2hlZEVycm9yKGBNb2NrIGRpc3BhdGNoIG5vdCBtYXRjaGVkIGZvciBoZWFkZXJzICcke3R5cGVvZiBrZXkuaGVhZGVycyA9PT0gJ29iamVjdCcgPyBKU09OLnN0cmluZ2lmeShrZXkuaGVhZGVycykgOiBrZXkuaGVhZGVyc30nYClcbiAgfVxuXG4gIHJldHVybiBtYXRjaGVkTW9ja0Rpc3BhdGNoZXNbMF1cbn1cblxuZnVuY3Rpb24gYWRkTW9ja0Rpc3BhdGNoIChtb2NrRGlzcGF0Y2hlcywga2V5LCBkYXRhKSB7XG4gIGNvbnN0IGJhc2VEYXRhID0geyB0aW1lc0ludm9rZWQ6IDAsIHRpbWVzOiAxLCBwZXJzaXN0OiBmYWxzZSwgY29uc3VtZWQ6IGZhbHNlIH1cbiAgY29uc3QgcmVwbHlEYXRhID0gdHlwZW9mIGRhdGEgPT09ICdmdW5jdGlvbicgPyB7IGNhbGxiYWNrOiBkYXRhIH0gOiB7IC4uLmRhdGEgfVxuICBjb25zdCBuZXdNb2NrRGlzcGF0Y2ggPSB7IC4uLmJhc2VEYXRhLCAuLi5rZXksIHBlbmRpbmc6IHRydWUsIGRhdGE6IHsgZXJyb3I6IG51bGwsIC4uLnJlcGx5RGF0YSB9IH1cbiAgbW9ja0Rpc3BhdGNoZXMucHVzaChuZXdNb2NrRGlzcGF0Y2gpXG4gIHJldHVybiBuZXdNb2NrRGlzcGF0Y2hcbn1cblxuZnVuY3Rpb24gZGVsZXRlTW9ja0Rpc3BhdGNoIChtb2NrRGlzcGF0Y2hlcywga2V5KSB7XG4gIGNvbnN0IGluZGV4ID0gbW9ja0Rpc3BhdGNoZXMuZmluZEluZGV4KGRpc3BhdGNoID0+IHtcbiAgICBpZiAoIWRpc3BhdGNoLmNvbnN1bWVkKSB7XG4gICAgICByZXR1cm4gZmFsc2VcbiAgICB9XG4gICAgcmV0dXJuIG1hdGNoS2V5KGRpc3BhdGNoLCBrZXkpXG4gIH0pXG4gIGlmIChpbmRleCAhPT0gLTEpIHtcbiAgICBtb2NrRGlzcGF0Y2hlcy5zcGxpY2UoaW5kZXgsIDEpXG4gIH1cbn1cblxuZnVuY3Rpb24gYnVpbGRLZXkgKG9wdHMpIHtcbiAgY29uc3QgeyBwYXRoLCBtZXRob2QsIGJvZHksIGhlYWRlcnMsIHF1ZXJ5IH0gPSBvcHRzXG4gIHJldHVybiB7XG4gICAgcGF0aCxcbiAgICBtZXRob2QsXG4gICAgYm9keSxcbiAgICBoZWFkZXJzLFxuICAgIHF1ZXJ5XG4gIH1cbn1cblxuZnVuY3Rpb24gZ2VuZXJhdGVLZXlWYWx1ZXMgKGRhdGEpIHtcbiAgcmV0dXJuIE9iamVjdC5lbnRyaWVzKGRhdGEpLnJlZHVjZSgoa2V5VmFsdWVQYWlycywgW2tleSwgdmFsdWVdKSA9PiBbXG4gICAgLi4ua2V5VmFsdWVQYWlycyxcbiAgICBCdWZmZXIuZnJvbShgJHtrZXl9YCksXG4gICAgQXJyYXkuaXNBcnJheSh2YWx1ZSkgPyB2YWx1ZS5tYXAoeCA9PiBCdWZmZXIuZnJvbShgJHt4fWApKSA6IEJ1ZmZlci5mcm9tKGAke3ZhbHVlfWApXG4gIF0sIFtdKVxufVxuXG4vKipcbiAqIEBzZWUgaHR0cHM6Ly9kZXZlbG9wZXIubW96aWxsYS5vcmcvZW4tVVMvZG9jcy9XZWIvSFRUUC9TdGF0dXNcbiAqIEBwYXJhbSB7bnVtYmVyfSBzdGF0dXNDb2RlXG4gKi9cbmZ1bmN0aW9uIGdldFN0YXR1c1RleHQgKHN0YXR1c0NvZGUpIHtcbiAgcmV0dXJuIFNUQVRVU19DT0RFU1tzdGF0dXNDb2RlXSB8fCAndW5rbm93bidcbn1cblxuYXN5bmMgZnVuY3Rpb24gZ2V0UmVzcG9uc2UgKGJvZHkpIHtcbiAgY29uc3QgYnVmZmVycyA9IFtdXG4gIGZvciBhd2FpdCAoY29uc3QgZGF0YSBvZiBib2R5KSB7XG4gICAgYnVmZmVycy5wdXNoKGRhdGEpXG4gIH1cbiAgcmV0dXJuIEJ1ZmZlci5jb25jYXQoYnVmZmVycykudG9TdHJpbmcoJ3V0ZjgnKVxufVxuXG4vKipcbiAqIE1vY2sgZGlzcGF0Y2ggZnVuY3Rpb24gdXNlZCB0byBzaW11bGF0ZSB1bmRpY2kgZGlzcGF0Y2hlc1xuICovXG5mdW5jdGlvbiBtb2NrRGlzcGF0Y2ggKG9wdHMsIGhhbmRsZXIpIHtcbiAgLy8gR2V0IG1vY2sgZGlzcGF0Y2ggZnJvbSBidWlsdCBrZXlcbiAgY29uc3Qga2V5ID0gYnVpbGRLZXkob3B0cylcbiAgY29uc3QgbW9ja0Rpc3BhdGNoID0gZ2V0TW9ja0Rpc3BhdGNoKHRoaXNba0Rpc3BhdGNoZXNdLCBrZXkpXG5cbiAgbW9ja0Rpc3BhdGNoLnRpbWVzSW52b2tlZCsrXG5cbiAgLy8gSGVyZSdzIHdoZXJlIHdlIHJlc29sdmUgYSBjYWxsYmFjayBpZiBhIGNhbGxiYWNrIGlzIHByZXNlbnQgZm9yIHRoZSBkaXNwYXRjaCBkYXRhLlxuICBpZiAobW9ja0Rpc3BhdGNoLmRhdGEuY2FsbGJhY2spIHtcbiAgICBtb2NrRGlzcGF0Y2guZGF0YSA9IHsgLi4ubW9ja0Rpc3BhdGNoLmRhdGEsIC4uLm1vY2tEaXNwYXRjaC5kYXRhLmNhbGxiYWNrKG9wdHMpIH1cbiAgfVxuXG4gIC8vIFBhcnNlIG1vY2tEaXNwYXRjaCBkYXRhXG4gIGNvbnN0IHsgZGF0YTogeyBzdGF0dXNDb2RlLCBkYXRhLCBoZWFkZXJzLCB0cmFpbGVycywgZXJyb3IgfSwgZGVsYXksIHBlcnNpc3QgfSA9IG1vY2tEaXNwYXRjaFxuICBjb25zdCB7IHRpbWVzSW52b2tlZCwgdGltZXMgfSA9IG1vY2tEaXNwYXRjaFxuXG4gIC8vIElmIGl0J3MgdXNlZCB1cCBhbmQgbm90IHBlcnNpc3RlbnQsIG1hcmsgYXMgY29uc3VtZWRcbiAgbW9ja0Rpc3BhdGNoLmNvbnN1bWVkID0gIXBlcnNpc3QgJiYgdGltZXNJbnZva2VkID49IHRpbWVzXG4gIG1vY2tEaXNwYXRjaC5wZW5kaW5nID0gdGltZXNJbnZva2VkIDwgdGltZXNcblxuICAvLyBJZiBzcGVjaWZpZWQsIHRyaWdnZXIgZGlzcGF0Y2ggZXJyb3JcbiAgaWYgKGVycm9yICE9PSBudWxsKSB7XG4gICAgZGVsZXRlTW9ja0Rpc3BhdGNoKHRoaXNba0Rpc3BhdGNoZXNdLCBrZXkpXG4gICAgaGFuZGxlci5vbkVycm9yKGVycm9yKVxuICAgIHJldHVybiB0cnVlXG4gIH1cblxuICAvLyBIYW5kbGUgdGhlIHJlcXVlc3Qgd2l0aCBhIGRlbGF5IGlmIG5lY2Vzc2FyeVxuICBpZiAodHlwZW9mIGRlbGF5ID09PSAnbnVtYmVyJyAmJiBkZWxheSA+IDApIHtcbiAgICBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgIGhhbmRsZVJlcGx5KHRoaXNba0Rpc3BhdGNoZXNdKVxuICAgIH0sIGRlbGF5KVxuICB9IGVsc2Uge1xuICAgIGhhbmRsZVJlcGx5KHRoaXNba0Rpc3BhdGNoZXNdKVxuICB9XG5cbiAgZnVuY3Rpb24gaGFuZGxlUmVwbHkgKG1vY2tEaXNwYXRjaGVzLCBfZGF0YSA9IGRhdGEpIHtcbiAgICAvLyBmZXRjaCdzIEhlYWRlcnNMaXN0IGlzIGEgMUQgc3RyaW5nIGFycmF5XG4gICAgY29uc3Qgb3B0c0hlYWRlcnMgPSBBcnJheS5pc0FycmF5KG9wdHMuaGVhZGVycylcbiAgICAgID8gYnVpbGRIZWFkZXJzRnJvbUFycmF5KG9wdHMuaGVhZGVycylcbiAgICAgIDogb3B0cy5oZWFkZXJzXG4gICAgY29uc3QgYm9keSA9IHR5cGVvZiBfZGF0YSA9PT0gJ2Z1bmN0aW9uJ1xuICAgICAgPyBfZGF0YSh7IC4uLm9wdHMsIGhlYWRlcnM6IG9wdHNIZWFkZXJzIH0pXG4gICAgICA6IF9kYXRhXG5cbiAgICAvLyB1dGlsLnR5cGVzLmlzUHJvbWlzZSBpcyBsaWtlbHkgbmVlZGVkIGZvciBqZXN0LlxuICAgIGlmIChpc1Byb21pc2UoYm9keSkpIHtcbiAgICAgIC8vIElmIGhhbmRsZVJlcGx5IGlzIGFzeW5jaHJvbm91cywgdGhyb3dpbmcgYW4gZXJyb3JcbiAgICAgIC8vIGluIHRoZSBjYWxsYmFjayB3aWxsIHJlamVjdCB0aGUgcHJvbWlzZSwgcmF0aGVyIHRoYW5cbiAgICAgIC8vIHN5bmNocm9ub3VzbHkgdGhyb3cgdGhlIGVycm9yLCB3aGljaCBicmVha3Mgc29tZSB0ZXN0cy5cbiAgICAgIC8vIFJhdGhlciwgd2Ugd2FpdCBmb3IgdGhlIGNhbGxiYWNrIHRvIHJlc29sdmUgaWYgaXQgaXMgYVxuICAgICAgLy8gcHJvbWlzZSwgYW5kIHRoZW4gcmUtcnVuIGhhbmRsZVJlcGx5IHdpdGggdGhlIG5ldyBib2R5LlxuICAgICAgYm9keS50aGVuKChuZXdEYXRhKSA9PiBoYW5kbGVSZXBseShtb2NrRGlzcGF0Y2hlcywgbmV3RGF0YSkpXG4gICAgICByZXR1cm5cbiAgICB9XG5cbiAgICBjb25zdCByZXNwb25zZURhdGEgPSBnZXRSZXNwb25zZURhdGEoYm9keSlcbiAgICBjb25zdCByZXNwb25zZUhlYWRlcnMgPSBnZW5lcmF0ZUtleVZhbHVlcyhoZWFkZXJzKVxuICAgIGNvbnN0IHJlc3BvbnNlVHJhaWxlcnMgPSBnZW5lcmF0ZUtleVZhbHVlcyh0cmFpbGVycylcblxuICAgIGhhbmRsZXIuYWJvcnQgPSBub3BcbiAgICBoYW5kbGVyLm9uSGVhZGVycyhzdGF0dXNDb2RlLCByZXNwb25zZUhlYWRlcnMsIHJlc3VtZSwgZ2V0U3RhdHVzVGV4dChzdGF0dXNDb2RlKSlcbiAgICBoYW5kbGVyLm9uRGF0YShCdWZmZXIuZnJvbShyZXNwb25zZURhdGEpKVxuICAgIGhhbmRsZXIub25Db21wbGV0ZShyZXNwb25zZVRyYWlsZXJzKVxuICAgIGRlbGV0ZU1vY2tEaXNwYXRjaChtb2NrRGlzcGF0Y2hlcywga2V5KVxuICB9XG5cbiAgZnVuY3Rpb24gcmVzdW1lICgpIHt9XG5cbiAgcmV0dXJuIHRydWVcbn1cblxuZnVuY3Rpb24gYnVpbGRNb2NrRGlzcGF0Y2ggKCkge1xuICBjb25zdCBhZ2VudCA9IHRoaXNba01vY2tBZ2VudF1cbiAgY29uc3Qgb3JpZ2luID0gdGhpc1trT3JpZ2luXVxuICBjb25zdCBvcmlnaW5hbERpc3BhdGNoID0gdGhpc1trT3JpZ2luYWxEaXNwYXRjaF1cblxuICByZXR1cm4gZnVuY3Rpb24gZGlzcGF0Y2ggKG9wdHMsIGhhbmRsZXIpIHtcbiAgICBpZiAoYWdlbnQuaXNNb2NrQWN0aXZlKSB7XG4gICAgICB0cnkge1xuICAgICAgICBtb2NrRGlzcGF0Y2guY2FsbCh0aGlzLCBvcHRzLCBoYW5kbGVyKVxuICAgICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgaWYgKGVycm9yIGluc3RhbmNlb2YgTW9ja05vdE1hdGNoZWRFcnJvcikge1xuICAgICAgICAgIGNvbnN0IG5ldENvbm5lY3QgPSBhZ2VudFtrR2V0TmV0Q29ubmVjdF0oKVxuICAgICAgICAgIGlmIChuZXRDb25uZWN0ID09PSBmYWxzZSkge1xuICAgICAgICAgICAgdGhyb3cgbmV3IE1vY2tOb3RNYXRjaGVkRXJyb3IoYCR7ZXJyb3IubWVzc2FnZX06IHN1YnNlcXVlbnQgcmVxdWVzdCB0byBvcmlnaW4gJHtvcmlnaW59IHdhcyBub3QgYWxsb3dlZCAobmV0LmNvbm5lY3QgZGlzYWJsZWQpYClcbiAgICAgICAgICB9XG4gICAgICAgICAgaWYgKGNoZWNrTmV0Q29ubmVjdChuZXRDb25uZWN0LCBvcmlnaW4pKSB7XG4gICAgICAgICAgICBvcmlnaW5hbERpc3BhdGNoLmNhbGwodGhpcywgb3B0cywgaGFuZGxlcilcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgdGhyb3cgbmV3IE1vY2tOb3RNYXRjaGVkRXJyb3IoYCR7ZXJyb3IubWVzc2FnZX06IHN1YnNlcXVlbnQgcmVxdWVzdCB0byBvcmlnaW4gJHtvcmlnaW59IHdhcyBub3QgYWxsb3dlZCAobmV0LmNvbm5lY3QgaXMgbm90IGVuYWJsZWQgZm9yIHRoaXMgb3JpZ2luKWApXG4gICAgICAgICAgfVxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHRocm93IGVycm9yXG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAgb3JpZ2luYWxEaXNwYXRjaC5jYWxsKHRoaXMsIG9wdHMsIGhhbmRsZXIpXG4gICAgfVxuICB9XG59XG5cbmZ1bmN0aW9uIGNoZWNrTmV0Q29ubmVjdCAobmV0Q29ubmVjdCwgb3JpZ2luKSB7XG4gIGNvbnN0IHVybCA9IG5ldyBVUkwob3JpZ2luKVxuICBpZiAobmV0Q29ubmVjdCA9PT0gdHJ1ZSkge1xuICAgIHJldHVybiB0cnVlXG4gIH0gZWxzZSBpZiAoQXJyYXkuaXNBcnJheShuZXRDb25uZWN0KSAmJiBuZXRDb25uZWN0LnNvbWUoKG1hdGNoZXIpID0+IG1hdGNoVmFsdWUobWF0Y2hlciwgdXJsLmhvc3QpKSkge1xuICAgIHJldHVybiB0cnVlXG4gIH1cbiAgcmV0dXJuIGZhbHNlXG59XG5cbmZ1bmN0aW9uIGJ1aWxkTW9ja09wdGlvbnMgKG9wdHMpIHtcbiAgaWYgKG9wdHMpIHtcbiAgICBjb25zdCB7IGFnZW50LCAuLi5tb2NrT3B0aW9ucyB9ID0gb3B0c1xuICAgIHJldHVybiBtb2NrT3B0aW9uc1xuICB9XG59XG5cbm1vZHVsZS5leHBvcnRzID0ge1xuICBnZXRSZXNwb25zZURhdGEsXG4gIGdldE1vY2tEaXNwYXRjaCxcbiAgYWRkTW9ja0Rpc3BhdGNoLFxuICBkZWxldGVNb2NrRGlzcGF0Y2gsXG4gIGJ1aWxkS2V5LFxuICBnZW5lcmF0ZUtleVZhbHVlcyxcbiAgbWF0Y2hWYWx1ZSxcbiAgZ2V0UmVzcG9uc2UsXG4gIGdldFN0YXR1c1RleHQsXG4gIG1vY2tEaXNwYXRjaCxcbiAgYnVpbGRNb2NrRGlzcGF0Y2gsXG4gIGNoZWNrTmV0Q29ubmVjdCxcbiAgYnVpbGRNb2NrT3B0aW9ucyxcbiAgZ2V0SGVhZGVyQnlOYW1lXG59XG4iLAogICAgIid1c2Ugc3RyaWN0J1xuXG5jb25zdCB7IGdldFJlc3BvbnNlRGF0YSwgYnVpbGRLZXksIGFkZE1vY2tEaXNwYXRjaCB9ID0gcmVxdWlyZSgnLi9tb2NrLXV0aWxzJylcbmNvbnN0IHtcbiAga0Rpc3BhdGNoZXMsXG4gIGtEaXNwYXRjaEtleSxcbiAga0RlZmF1bHRIZWFkZXJzLFxuICBrRGVmYXVsdFRyYWlsZXJzLFxuICBrQ29udGVudExlbmd0aCxcbiAga01vY2tEaXNwYXRjaFxufSA9IHJlcXVpcmUoJy4vbW9jay1zeW1ib2xzJylcbmNvbnN0IHsgSW52YWxpZEFyZ3VtZW50RXJyb3IgfSA9IHJlcXVpcmUoJy4uL2NvcmUvZXJyb3JzJylcbmNvbnN0IHsgYnVpbGRVUkwgfSA9IHJlcXVpcmUoJy4uL2NvcmUvdXRpbCcpXG5cbi8qKlxuICogRGVmaW5lcyB0aGUgc2NvcGUgQVBJIGZvciBhbiBpbnRlcmNlcHRvciByZXBseVxuICovXG5jbGFzcyBNb2NrU2NvcGUge1xuICBjb25zdHJ1Y3RvciAobW9ja0Rpc3BhdGNoKSB7XG4gICAgdGhpc1trTW9ja0Rpc3BhdGNoXSA9IG1vY2tEaXNwYXRjaFxuICB9XG5cbiAgLyoqXG4gICAqIERlbGF5IGEgcmVwbHkgYnkgYSBzZXQgYW1vdW50IGluIG1zLlxuICAgKi9cbiAgZGVsYXkgKHdhaXRJbk1zKSB7XG4gICAgaWYgKHR5cGVvZiB3YWl0SW5NcyAhPT0gJ251bWJlcicgfHwgIU51bWJlci5pc0ludGVnZXIod2FpdEluTXMpIHx8IHdhaXRJbk1zIDw9IDApIHtcbiAgICAgIHRocm93IG5ldyBJbnZhbGlkQXJndW1lbnRFcnJvcignd2FpdEluTXMgbXVzdCBiZSBhIHZhbGlkIGludGVnZXIgPiAwJylcbiAgICB9XG5cbiAgICB0aGlzW2tNb2NrRGlzcGF0Y2hdLmRlbGF5ID0gd2FpdEluTXNcbiAgICByZXR1cm4gdGhpc1xuICB9XG5cbiAgLyoqXG4gICAqIEZvciBhIGRlZmluZWQgcmVwbHksIG5ldmVyIG1hcmsgYXMgY29uc3VtZWQuXG4gICAqL1xuICBwZXJzaXN0ICgpIHtcbiAgICB0aGlzW2tNb2NrRGlzcGF0Y2hdLnBlcnNpc3QgPSB0cnVlXG4gICAgcmV0dXJuIHRoaXNcbiAgfVxuXG4gIC8qKlxuICAgKiBBbGxvdyBvbmUgdG8gZGVmaW5lIGEgcmVwbHkgZm9yIGEgc2V0IGFtb3VudCBvZiBtYXRjaGluZyByZXF1ZXN0cy5cbiAgICovXG4gIHRpbWVzIChyZXBlYXRUaW1lcykge1xuICAgIGlmICh0eXBlb2YgcmVwZWF0VGltZXMgIT09ICdudW1iZXInIHx8ICFOdW1iZXIuaXNJbnRlZ2VyKHJlcGVhdFRpbWVzKSB8fCByZXBlYXRUaW1lcyA8PSAwKSB7XG4gICAgICB0aHJvdyBuZXcgSW52YWxpZEFyZ3VtZW50RXJyb3IoJ3JlcGVhdFRpbWVzIG11c3QgYmUgYSB2YWxpZCBpbnRlZ2VyID4gMCcpXG4gICAgfVxuXG4gICAgdGhpc1trTW9ja0Rpc3BhdGNoXS50aW1lcyA9IHJlcGVhdFRpbWVzXG4gICAgcmV0dXJuIHRoaXNcbiAgfVxufVxuXG4vKipcbiAqIERlZmluZXMgYW4gaW50ZXJjZXB0b3IgZm9yIGEgTW9ja1xuICovXG5jbGFzcyBNb2NrSW50ZXJjZXB0b3Ige1xuICBjb25zdHJ1Y3RvciAob3B0cywgbW9ja0Rpc3BhdGNoZXMpIHtcbiAgICBpZiAodHlwZW9mIG9wdHMgIT09ICdvYmplY3QnKSB7XG4gICAgICB0aHJvdyBuZXcgSW52YWxpZEFyZ3VtZW50RXJyb3IoJ29wdHMgbXVzdCBiZSBhbiBvYmplY3QnKVxuICAgIH1cbiAgICBpZiAodHlwZW9mIG9wdHMucGF0aCA9PT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgIHRocm93IG5ldyBJbnZhbGlkQXJndW1lbnRFcnJvcignb3B0cy5wYXRoIG11c3QgYmUgZGVmaW5lZCcpXG4gICAgfVxuICAgIGlmICh0eXBlb2Ygb3B0cy5tZXRob2QgPT09ICd1bmRlZmluZWQnKSB7XG4gICAgICBvcHRzLm1ldGhvZCA9ICdHRVQnXG4gICAgfVxuICAgIC8vIFNlZSBodHRwczovL2dpdGh1Yi5jb20vbm9kZWpzL3VuZGljaS9pc3N1ZXMvMTI0NVxuICAgIC8vIEFzIHBlciBSRkMgMzk4NiwgY2xpZW50cyBhcmUgbm90IHN1cHBvc2VkIHRvIHNlbmQgVVJJXG4gICAgLy8gZnJhZ21lbnRzIHRvIHNlcnZlcnMgd2hlbiB0aGV5IHJldHJpZXZlIGEgZG9jdW1lbnQsXG4gICAgaWYgKHR5cGVvZiBvcHRzLnBhdGggPT09ICdzdHJpbmcnKSB7XG4gICAgICBpZiAob3B0cy5xdWVyeSkge1xuICAgICAgICBvcHRzLnBhdGggPSBidWlsZFVSTChvcHRzLnBhdGgsIG9wdHMucXVlcnkpXG4gICAgICB9IGVsc2Uge1xuICAgICAgICAvLyBNYXRjaGVzIGh0dHBzOi8vZ2l0aHViLmNvbS9ub2RlanMvdW5kaWNpL2Jsb2IvbWFpbi9saWIvZmV0Y2gvaW5kZXguanMjTDE4MTFcbiAgICAgICAgY29uc3QgcGFyc2VkVVJMID0gbmV3IFVSTChvcHRzLnBhdGgsICdkYXRhOi8vJylcbiAgICAgICAgb3B0cy5wYXRoID0gcGFyc2VkVVJMLnBhdGhuYW1lICsgcGFyc2VkVVJMLnNlYXJjaFxuICAgICAgfVxuICAgIH1cbiAgICBpZiAodHlwZW9mIG9wdHMubWV0aG9kID09PSAnc3RyaW5nJykge1xuICAgICAgb3B0cy5tZXRob2QgPSBvcHRzLm1ldGhvZC50b1VwcGVyQ2FzZSgpXG4gICAgfVxuXG4gICAgdGhpc1trRGlzcGF0Y2hLZXldID0gYnVpbGRLZXkob3B0cylcbiAgICB0aGlzW2tEaXNwYXRjaGVzXSA9IG1vY2tEaXNwYXRjaGVzXG4gICAgdGhpc1trRGVmYXVsdEhlYWRlcnNdID0ge31cbiAgICB0aGlzW2tEZWZhdWx0VHJhaWxlcnNdID0ge31cbiAgICB0aGlzW2tDb250ZW50TGVuZ3RoXSA9IGZhbHNlXG4gIH1cblxuICBjcmVhdGVNb2NrU2NvcGVEaXNwYXRjaERhdGEgKHN0YXR1c0NvZGUsIGRhdGEsIHJlc3BvbnNlT3B0aW9ucyA9IHt9KSB7XG4gICAgY29uc3QgcmVzcG9uc2VEYXRhID0gZ2V0UmVzcG9uc2VEYXRhKGRhdGEpXG4gICAgY29uc3QgY29udGVudExlbmd0aCA9IHRoaXNba0NvbnRlbnRMZW5ndGhdID8geyAnY29udGVudC1sZW5ndGgnOiByZXNwb25zZURhdGEubGVuZ3RoIH0gOiB7fVxuICAgIGNvbnN0IGhlYWRlcnMgPSB7IC4uLnRoaXNba0RlZmF1bHRIZWFkZXJzXSwgLi4uY29udGVudExlbmd0aCwgLi4ucmVzcG9uc2VPcHRpb25zLmhlYWRlcnMgfVxuICAgIGNvbnN0IHRyYWlsZXJzID0geyAuLi50aGlzW2tEZWZhdWx0VHJhaWxlcnNdLCAuLi5yZXNwb25zZU9wdGlvbnMudHJhaWxlcnMgfVxuXG4gICAgcmV0dXJuIHsgc3RhdHVzQ29kZSwgZGF0YSwgaGVhZGVycywgdHJhaWxlcnMgfVxuICB9XG5cbiAgdmFsaWRhdGVSZXBseVBhcmFtZXRlcnMgKHN0YXR1c0NvZGUsIGRhdGEsIHJlc3BvbnNlT3B0aW9ucykge1xuICAgIGlmICh0eXBlb2Ygc3RhdHVzQ29kZSA9PT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgIHRocm93IG5ldyBJbnZhbGlkQXJndW1lbnRFcnJvcignc3RhdHVzQ29kZSBtdXN0IGJlIGRlZmluZWQnKVxuICAgIH1cbiAgICBpZiAodHlwZW9mIGRhdGEgPT09ICd1bmRlZmluZWQnKSB7XG4gICAgICB0aHJvdyBuZXcgSW52YWxpZEFyZ3VtZW50RXJyb3IoJ2RhdGEgbXVzdCBiZSBkZWZpbmVkJylcbiAgICB9XG4gICAgaWYgKHR5cGVvZiByZXNwb25zZU9wdGlvbnMgIT09ICdvYmplY3QnKSB7XG4gICAgICB0aHJvdyBuZXcgSW52YWxpZEFyZ3VtZW50RXJyb3IoJ3Jlc3BvbnNlT3B0aW9ucyBtdXN0IGJlIGFuIG9iamVjdCcpXG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIE1vY2sgYW4gdW5kaWNpIHJlcXVlc3Qgd2l0aCBhIGRlZmluZWQgcmVwbHkuXG4gICAqL1xuICByZXBseSAocmVwbHlEYXRhKSB7XG4gICAgLy8gVmFsdWVzIG9mIHJlcGx5IGFyZW4ndCBhdmFpbGFibGUgcmlnaHQgbm93IGFzIHRoZXlcbiAgICAvLyBjYW4gb25seSBiZSBhdmFpbGFibGUgd2hlbiB0aGUgcmVwbHkgY2FsbGJhY2sgaXMgaW52b2tlZC5cbiAgICBpZiAodHlwZW9mIHJlcGx5RGF0YSA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgLy8gV2UnbGwgZmlyc3Qgd3JhcCB0aGUgcHJvdmlkZWQgY2FsbGJhY2sgaW4gYW5vdGhlciBmdW5jdGlvbixcbiAgICAgIC8vIHRoaXMgZnVuY3Rpb24gd2lsbCBwcm9wZXJseSByZXNvbHZlIHRoZSBkYXRhIGZyb20gdGhlIGNhbGxiYWNrXG4gICAgICAvLyB3aGVuIGludm9rZWQuXG4gICAgICBjb25zdCB3cmFwcGVkRGVmYXVsdHNDYWxsYmFjayA9IChvcHRzKSA9PiB7XG4gICAgICAgIC8vIE91ciByZXBseSBvcHRpb25zIGNhbGxiYWNrIGNvbnRhaW5zIHRoZSBwYXJhbWV0ZXIgZm9yIHN0YXR1c0NvZGUsIGRhdGEgYW5kIG9wdGlvbnMuXG4gICAgICAgIGNvbnN0IHJlc29sdmVkRGF0YSA9IHJlcGx5RGF0YShvcHRzKVxuXG4gICAgICAgIC8vIENoZWNrIGlmIGl0IGlzIGluIHRoZSByaWdodCBmb3JtYXRcbiAgICAgICAgaWYgKHR5cGVvZiByZXNvbHZlZERhdGEgIT09ICdvYmplY3QnKSB7XG4gICAgICAgICAgdGhyb3cgbmV3IEludmFsaWRBcmd1bWVudEVycm9yKCdyZXBseSBvcHRpb25zIGNhbGxiYWNrIG11c3QgcmV0dXJuIGFuIG9iamVjdCcpXG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCB7IHN0YXR1c0NvZGUsIGRhdGEgPSAnJywgcmVzcG9uc2VPcHRpb25zID0ge30gfSA9IHJlc29sdmVkRGF0YVxuICAgICAgICB0aGlzLnZhbGlkYXRlUmVwbHlQYXJhbWV0ZXJzKHN0YXR1c0NvZGUsIGRhdGEsIHJlc3BvbnNlT3B0aW9ucylcbiAgICAgICAgLy8gU2luY2UgdGhlIHZhbHVlcyBjYW4gYmUgb2J0YWluZWQgaW1tZWRpYXRlbHkgd2UgcmV0dXJuIHRoZW1cbiAgICAgICAgLy8gZnJvbSB0aGlzIGhpZ2hlciBvcmRlciBmdW5jdGlvbiB0aGF0IHdpbGwgYmUgcmVzb2x2ZWQgbGF0ZXIuXG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgLi4udGhpcy5jcmVhdGVNb2NrU2NvcGVEaXNwYXRjaERhdGEoc3RhdHVzQ29kZSwgZGF0YSwgcmVzcG9uc2VPcHRpb25zKVxuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIC8vIEFkZCB1c3VhbCBkaXNwYXRjaCBkYXRhLCBidXQgdGhpcyB0aW1lIHNldCB0aGUgZGF0YSBwYXJhbWV0ZXIgdG8gZnVuY3Rpb24gdGhhdCB3aWxsIGV2ZW50dWFsbHkgcHJvdmlkZSBkYXRhLlxuICAgICAgY29uc3QgbmV3TW9ja0Rpc3BhdGNoID0gYWRkTW9ja0Rpc3BhdGNoKHRoaXNba0Rpc3BhdGNoZXNdLCB0aGlzW2tEaXNwYXRjaEtleV0sIHdyYXBwZWREZWZhdWx0c0NhbGxiYWNrKVxuICAgICAgcmV0dXJuIG5ldyBNb2NrU2NvcGUobmV3TW9ja0Rpc3BhdGNoKVxuICAgIH1cblxuICAgIC8vIFdlIGNhbiBoYXZlIGVpdGhlciBvbmUgb3IgdGhyZWUgcGFyYW1ldGVycywgaWYgd2UgZ2V0IGhlcmUsXG4gICAgLy8gd2Ugc2hvdWxkIGhhdmUgMS0zIHBhcmFtZXRlcnMuIFNvIHdlIHNwcmVhZCB0aGUgYXJndW1lbnRzIG9mXG4gICAgLy8gdGhpcyBmdW5jdGlvbiB0byBvYnRhaW4gdGhlIHBhcmFtZXRlcnMsIHNpbmNlIHJlcGx5RGF0YSB3aWxsIGFsd2F5c1xuICAgIC8vIGp1c3QgYmUgdGhlIHN0YXR1c0NvZGUuXG4gICAgY29uc3QgW3N0YXR1c0NvZGUsIGRhdGEgPSAnJywgcmVzcG9uc2VPcHRpb25zID0ge31dID0gWy4uLmFyZ3VtZW50c11cbiAgICB0aGlzLnZhbGlkYXRlUmVwbHlQYXJhbWV0ZXJzKHN0YXR1c0NvZGUsIGRhdGEsIHJlc3BvbnNlT3B0aW9ucylcblxuICAgIC8vIFNlbmQgaW4tYWxyZWFkeSBwcm92aWRlZCBkYXRhIGxpa2UgdXN1YWxcbiAgICBjb25zdCBkaXNwYXRjaERhdGEgPSB0aGlzLmNyZWF0ZU1vY2tTY29wZURpc3BhdGNoRGF0YShzdGF0dXNDb2RlLCBkYXRhLCByZXNwb25zZU9wdGlvbnMpXG4gICAgY29uc3QgbmV3TW9ja0Rpc3BhdGNoID0gYWRkTW9ja0Rpc3BhdGNoKHRoaXNba0Rpc3BhdGNoZXNdLCB0aGlzW2tEaXNwYXRjaEtleV0sIGRpc3BhdGNoRGF0YSlcbiAgICByZXR1cm4gbmV3IE1vY2tTY29wZShuZXdNb2NrRGlzcGF0Y2gpXG4gIH1cblxuICAvKipcbiAgICogTW9jayBhbiB1bmRpY2kgcmVxdWVzdCB3aXRoIGEgZGVmaW5lZCBlcnJvci5cbiAgICovXG4gIHJlcGx5V2l0aEVycm9yIChlcnJvcikge1xuICAgIGlmICh0eXBlb2YgZXJyb3IgPT09ICd1bmRlZmluZWQnKSB7XG4gICAgICB0aHJvdyBuZXcgSW52YWxpZEFyZ3VtZW50RXJyb3IoJ2Vycm9yIG11c3QgYmUgZGVmaW5lZCcpXG4gICAgfVxuXG4gICAgY29uc3QgbmV3TW9ja0Rpc3BhdGNoID0gYWRkTW9ja0Rpc3BhdGNoKHRoaXNba0Rpc3BhdGNoZXNdLCB0aGlzW2tEaXNwYXRjaEtleV0sIHsgZXJyb3IgfSlcbiAgICByZXR1cm4gbmV3IE1vY2tTY29wZShuZXdNb2NrRGlzcGF0Y2gpXG4gIH1cblxuICAvKipcbiAgICogU2V0IGRlZmF1bHQgcmVwbHkgaGVhZGVycyBvbiB0aGUgaW50ZXJjZXB0b3IgZm9yIHN1YnNlcXVlbnQgcmVwbGllc1xuICAgKi9cbiAgZGVmYXVsdFJlcGx5SGVhZGVycyAoaGVhZGVycykge1xuICAgIGlmICh0eXBlb2YgaGVhZGVycyA9PT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgIHRocm93IG5ldyBJbnZhbGlkQXJndW1lbnRFcnJvcignaGVhZGVycyBtdXN0IGJlIGRlZmluZWQnKVxuICAgIH1cblxuICAgIHRoaXNba0RlZmF1bHRIZWFkZXJzXSA9IGhlYWRlcnNcbiAgICByZXR1cm4gdGhpc1xuICB9XG5cbiAgLyoqXG4gICAqIFNldCBkZWZhdWx0IHJlcGx5IHRyYWlsZXJzIG9uIHRoZSBpbnRlcmNlcHRvciBmb3Igc3Vic2VxdWVudCByZXBsaWVzXG4gICAqL1xuICBkZWZhdWx0UmVwbHlUcmFpbGVycyAodHJhaWxlcnMpIHtcbiAgICBpZiAodHlwZW9mIHRyYWlsZXJzID09PSAndW5kZWZpbmVkJykge1xuICAgICAgdGhyb3cgbmV3IEludmFsaWRBcmd1bWVudEVycm9yKCd0cmFpbGVycyBtdXN0IGJlIGRlZmluZWQnKVxuICAgIH1cblxuICAgIHRoaXNba0RlZmF1bHRUcmFpbGVyc10gPSB0cmFpbGVyc1xuICAgIHJldHVybiB0aGlzXG4gIH1cblxuICAvKipcbiAgICogU2V0IHJlcGx5IGNvbnRlbnQgbGVuZ3RoIGhlYWRlciBmb3IgcmVwbGllcyBvbiB0aGUgaW50ZXJjZXB0b3JcbiAgICovXG4gIHJlcGx5Q29udGVudExlbmd0aCAoKSB7XG4gICAgdGhpc1trQ29udGVudExlbmd0aF0gPSB0cnVlXG4gICAgcmV0dXJuIHRoaXNcbiAgfVxufVxuXG5tb2R1bGUuZXhwb3J0cy5Nb2NrSW50ZXJjZXB0b3IgPSBNb2NrSW50ZXJjZXB0b3Jcbm1vZHVsZS5leHBvcnRzLk1vY2tTY29wZSA9IE1vY2tTY29wZVxuIiwKICAgICIndXNlIHN0cmljdCdcblxuY29uc3QgeyBwcm9taXNpZnkgfSA9IHJlcXVpcmUoJ3V0aWwnKVxuY29uc3QgQ2xpZW50ID0gcmVxdWlyZSgnLi4vY2xpZW50JylcbmNvbnN0IHsgYnVpbGRNb2NrRGlzcGF0Y2ggfSA9IHJlcXVpcmUoJy4vbW9jay11dGlscycpXG5jb25zdCB7XG4gIGtEaXNwYXRjaGVzLFxuICBrTW9ja0FnZW50LFxuICBrQ2xvc2UsXG4gIGtPcmlnaW5hbENsb3NlLFxuICBrT3JpZ2luLFxuICBrT3JpZ2luYWxEaXNwYXRjaCxcbiAga0Nvbm5lY3RlZFxufSA9IHJlcXVpcmUoJy4vbW9jay1zeW1ib2xzJylcbmNvbnN0IHsgTW9ja0ludGVyY2VwdG9yIH0gPSByZXF1aXJlKCcuL21vY2staW50ZXJjZXB0b3InKVxuY29uc3QgU3ltYm9scyA9IHJlcXVpcmUoJy4uL2NvcmUvc3ltYm9scycpXG5jb25zdCB7IEludmFsaWRBcmd1bWVudEVycm9yIH0gPSByZXF1aXJlKCcuLi9jb3JlL2Vycm9ycycpXG5cbi8qKlxuICogTW9ja0NsaWVudCBwcm92aWRlcyBhbiBBUEkgdGhhdCBleHRlbmRzIHRoZSBDbGllbnQgdG8gaW5mbHVlbmNlIHRoZSBtb2NrRGlzcGF0Y2hlcy5cbiAqL1xuY2xhc3MgTW9ja0NsaWVudCBleHRlbmRzIENsaWVudCB7XG4gIGNvbnN0cnVjdG9yIChvcmlnaW4sIG9wdHMpIHtcbiAgICBzdXBlcihvcmlnaW4sIG9wdHMpXG5cbiAgICBpZiAoIW9wdHMgfHwgIW9wdHMuYWdlbnQgfHwgdHlwZW9mIG9wdHMuYWdlbnQuZGlzcGF0Y2ggIT09ICdmdW5jdGlvbicpIHtcbiAgICAgIHRocm93IG5ldyBJbnZhbGlkQXJndW1lbnRFcnJvcignQXJndW1lbnQgb3B0cy5hZ2VudCBtdXN0IGltcGxlbWVudCBBZ2VudCcpXG4gICAgfVxuXG4gICAgdGhpc1trTW9ja0FnZW50XSA9IG9wdHMuYWdlbnRcbiAgICB0aGlzW2tPcmlnaW5dID0gb3JpZ2luXG4gICAgdGhpc1trRGlzcGF0Y2hlc10gPSBbXVxuICAgIHRoaXNba0Nvbm5lY3RlZF0gPSAxXG4gICAgdGhpc1trT3JpZ2luYWxEaXNwYXRjaF0gPSB0aGlzLmRpc3BhdGNoXG4gICAgdGhpc1trT3JpZ2luYWxDbG9zZV0gPSB0aGlzLmNsb3NlLmJpbmQodGhpcylcblxuICAgIHRoaXMuZGlzcGF0Y2ggPSBidWlsZE1vY2tEaXNwYXRjaC5jYWxsKHRoaXMpXG4gICAgdGhpcy5jbG9zZSA9IHRoaXNba0Nsb3NlXVxuICB9XG5cbiAgZ2V0IFtTeW1ib2xzLmtDb25uZWN0ZWRdICgpIHtcbiAgICByZXR1cm4gdGhpc1trQ29ubmVjdGVkXVxuICB9XG5cbiAgLyoqXG4gICAqIFNldHMgdXAgdGhlIGJhc2UgaW50ZXJjZXB0b3IgZm9yIG1vY2tpbmcgcmVwbGllcyBmcm9tIHVuZGljaS5cbiAgICovXG4gIGludGVyY2VwdCAob3B0cykge1xuICAgIHJldHVybiBuZXcgTW9ja0ludGVyY2VwdG9yKG9wdHMsIHRoaXNba0Rpc3BhdGNoZXNdKVxuICB9XG5cbiAgYXN5bmMgW2tDbG9zZV0gKCkge1xuICAgIGF3YWl0IHByb21pc2lmeSh0aGlzW2tPcmlnaW5hbENsb3NlXSkoKVxuICAgIHRoaXNba0Nvbm5lY3RlZF0gPSAwXG4gICAgdGhpc1trTW9ja0FnZW50XVtTeW1ib2xzLmtDbGllbnRzXS5kZWxldGUodGhpc1trT3JpZ2luXSlcbiAgfVxufVxuXG5tb2R1bGUuZXhwb3J0cyA9IE1vY2tDbGllbnRcbiIsCiAgICAiJ3VzZSBzdHJpY3QnXG5cbmNvbnN0IHsgcHJvbWlzaWZ5IH0gPSByZXF1aXJlKCd1dGlsJylcbmNvbnN0IFBvb2wgPSByZXF1aXJlKCcuLi9wb29sJylcbmNvbnN0IHsgYnVpbGRNb2NrRGlzcGF0Y2ggfSA9IHJlcXVpcmUoJy4vbW9jay11dGlscycpXG5jb25zdCB7XG4gIGtEaXNwYXRjaGVzLFxuICBrTW9ja0FnZW50LFxuICBrQ2xvc2UsXG4gIGtPcmlnaW5hbENsb3NlLFxuICBrT3JpZ2luLFxuICBrT3JpZ2luYWxEaXNwYXRjaCxcbiAga0Nvbm5lY3RlZFxufSA9IHJlcXVpcmUoJy4vbW9jay1zeW1ib2xzJylcbmNvbnN0IHsgTW9ja0ludGVyY2VwdG9yIH0gPSByZXF1aXJlKCcuL21vY2staW50ZXJjZXB0b3InKVxuY29uc3QgU3ltYm9scyA9IHJlcXVpcmUoJy4uL2NvcmUvc3ltYm9scycpXG5jb25zdCB7IEludmFsaWRBcmd1bWVudEVycm9yIH0gPSByZXF1aXJlKCcuLi9jb3JlL2Vycm9ycycpXG5cbi8qKlxuICogTW9ja1Bvb2wgcHJvdmlkZXMgYW4gQVBJIHRoYXQgZXh0ZW5kcyB0aGUgUG9vbCB0byBpbmZsdWVuY2UgdGhlIG1vY2tEaXNwYXRjaGVzLlxuICovXG5jbGFzcyBNb2NrUG9vbCBleHRlbmRzIFBvb2wge1xuICBjb25zdHJ1Y3RvciAob3JpZ2luLCBvcHRzKSB7XG4gICAgc3VwZXIob3JpZ2luLCBvcHRzKVxuXG4gICAgaWYgKCFvcHRzIHx8ICFvcHRzLmFnZW50IHx8IHR5cGVvZiBvcHRzLmFnZW50LmRpc3BhdGNoICE9PSAnZnVuY3Rpb24nKSB7XG4gICAgICB0aHJvdyBuZXcgSW52YWxpZEFyZ3VtZW50RXJyb3IoJ0FyZ3VtZW50IG9wdHMuYWdlbnQgbXVzdCBpbXBsZW1lbnQgQWdlbnQnKVxuICAgIH1cblxuICAgIHRoaXNba01vY2tBZ2VudF0gPSBvcHRzLmFnZW50XG4gICAgdGhpc1trT3JpZ2luXSA9IG9yaWdpblxuICAgIHRoaXNba0Rpc3BhdGNoZXNdID0gW11cbiAgICB0aGlzW2tDb25uZWN0ZWRdID0gMVxuICAgIHRoaXNba09yaWdpbmFsRGlzcGF0Y2hdID0gdGhpcy5kaXNwYXRjaFxuICAgIHRoaXNba09yaWdpbmFsQ2xvc2VdID0gdGhpcy5jbG9zZS5iaW5kKHRoaXMpXG5cbiAgICB0aGlzLmRpc3BhdGNoID0gYnVpbGRNb2NrRGlzcGF0Y2guY2FsbCh0aGlzKVxuICAgIHRoaXMuY2xvc2UgPSB0aGlzW2tDbG9zZV1cbiAgfVxuXG4gIGdldCBbU3ltYm9scy5rQ29ubmVjdGVkXSAoKSB7XG4gICAgcmV0dXJuIHRoaXNba0Nvbm5lY3RlZF1cbiAgfVxuXG4gIC8qKlxuICAgKiBTZXRzIHVwIHRoZSBiYXNlIGludGVyY2VwdG9yIGZvciBtb2NraW5nIHJlcGxpZXMgZnJvbSB1bmRpY2kuXG4gICAqL1xuICBpbnRlcmNlcHQgKG9wdHMpIHtcbiAgICByZXR1cm4gbmV3IE1vY2tJbnRlcmNlcHRvcihvcHRzLCB0aGlzW2tEaXNwYXRjaGVzXSlcbiAgfVxuXG4gIGFzeW5jIFtrQ2xvc2VdICgpIHtcbiAgICBhd2FpdCBwcm9taXNpZnkodGhpc1trT3JpZ2luYWxDbG9zZV0pKClcbiAgICB0aGlzW2tDb25uZWN0ZWRdID0gMFxuICAgIHRoaXNba01vY2tBZ2VudF1bU3ltYm9scy5rQ2xpZW50c10uZGVsZXRlKHRoaXNba09yaWdpbl0pXG4gIH1cbn1cblxubW9kdWxlLmV4cG9ydHMgPSBNb2NrUG9vbFxuIiwKICAgICIndXNlIHN0cmljdCdcblxuY29uc3Qgc2luZ3VsYXJzID0ge1xuICBwcm9ub3VuOiAnaXQnLFxuICBpczogJ2lzJyxcbiAgd2FzOiAnd2FzJyxcbiAgdGhpczogJ3RoaXMnXG59XG5cbmNvbnN0IHBsdXJhbHMgPSB7XG4gIHByb25vdW46ICd0aGV5JyxcbiAgaXM6ICdhcmUnLFxuICB3YXM6ICd3ZXJlJyxcbiAgdGhpczogJ3RoZXNlJ1xufVxuXG5tb2R1bGUuZXhwb3J0cyA9IGNsYXNzIFBsdXJhbGl6ZXIge1xuICBjb25zdHJ1Y3RvciAoc2luZ3VsYXIsIHBsdXJhbCkge1xuICAgIHRoaXMuc2luZ3VsYXIgPSBzaW5ndWxhclxuICAgIHRoaXMucGx1cmFsID0gcGx1cmFsXG4gIH1cblxuICBwbHVyYWxpemUgKGNvdW50KSB7XG4gICAgY29uc3Qgb25lID0gY291bnQgPT09IDFcbiAgICBjb25zdCBrZXlzID0gb25lID8gc2luZ3VsYXJzIDogcGx1cmFsc1xuICAgIGNvbnN0IG5vdW4gPSBvbmUgPyB0aGlzLnNpbmd1bGFyIDogdGhpcy5wbHVyYWxcbiAgICByZXR1cm4geyAuLi5rZXlzLCBjb3VudCwgbm91biB9XG4gIH1cbn1cbiIsCiAgICAiJ3VzZSBzdHJpY3QnXG5cbmNvbnN0IHsgVHJhbnNmb3JtIH0gPSByZXF1aXJlKCdzdHJlYW0nKVxuY29uc3QgeyBDb25zb2xlIH0gPSByZXF1aXJlKCdjb25zb2xlJylcblxuLyoqXG4gKiBHZXRzIHRoZSBvdXRwdXQgb2YgYGNvbnNvbGUudGFibGUo4oCmKWAgYXMgYSBzdHJpbmcuXG4gKi9cbm1vZHVsZS5leHBvcnRzID0gY2xhc3MgUGVuZGluZ0ludGVyY2VwdG9yc0Zvcm1hdHRlciB7XG4gIGNvbnN0cnVjdG9yICh7IGRpc2FibGVDb2xvcnMgfSA9IHt9KSB7XG4gICAgdGhpcy50cmFuc2Zvcm0gPSBuZXcgVHJhbnNmb3JtKHtcbiAgICAgIHRyYW5zZm9ybSAoY2h1bmssIF9lbmMsIGNiKSB7XG4gICAgICAgIGNiKG51bGwsIGNodW5rKVxuICAgICAgfVxuICAgIH0pXG5cbiAgICB0aGlzLmxvZ2dlciA9IG5ldyBDb25zb2xlKHtcbiAgICAgIHN0ZG91dDogdGhpcy50cmFuc2Zvcm0sXG4gICAgICBpbnNwZWN0T3B0aW9uczoge1xuICAgICAgICBjb2xvcnM6ICFkaXNhYmxlQ29sb3JzICYmICFwcm9jZXNzLmVudi5DSVxuICAgICAgfVxuICAgIH0pXG4gIH1cblxuICBmb3JtYXQgKHBlbmRpbmdJbnRlcmNlcHRvcnMpIHtcbiAgICBjb25zdCB3aXRoUHJldHR5SGVhZGVycyA9IHBlbmRpbmdJbnRlcmNlcHRvcnMubWFwKFxuICAgICAgKHsgbWV0aG9kLCBwYXRoLCBkYXRhOiB7IHN0YXR1c0NvZGUgfSwgcGVyc2lzdCwgdGltZXMsIHRpbWVzSW52b2tlZCwgb3JpZ2luIH0pID0+ICh7XG4gICAgICAgIE1ldGhvZDogbWV0aG9kLFxuICAgICAgICBPcmlnaW46IG9yaWdpbixcbiAgICAgICAgUGF0aDogcGF0aCxcbiAgICAgICAgJ1N0YXR1cyBjb2RlJzogc3RhdHVzQ29kZSxcbiAgICAgICAgUGVyc2lzdGVudDogcGVyc2lzdCA/ICfinIUnIDogJ+KdjCcsXG4gICAgICAgIEludm9jYXRpb25zOiB0aW1lc0ludm9rZWQsXG4gICAgICAgIFJlbWFpbmluZzogcGVyc2lzdCA/IEluZmluaXR5IDogdGltZXMgLSB0aW1lc0ludm9rZWRcbiAgICAgIH0pKVxuXG4gICAgdGhpcy5sb2dnZXIudGFibGUod2l0aFByZXR0eUhlYWRlcnMpXG4gICAgcmV0dXJuIHRoaXMudHJhbnNmb3JtLnJlYWQoKS50b1N0cmluZygpXG4gIH1cbn1cbiIsCiAgICAiJ3VzZSBzdHJpY3QnXG5cbmNvbnN0IHsga0NsaWVudHMgfSA9IHJlcXVpcmUoJy4uL2NvcmUvc3ltYm9scycpXG5jb25zdCBBZ2VudCA9IHJlcXVpcmUoJy4uL2FnZW50JylcbmNvbnN0IHtcbiAga0FnZW50LFxuICBrTW9ja0FnZW50U2V0LFxuICBrTW9ja0FnZW50R2V0LFxuICBrRGlzcGF0Y2hlcyxcbiAga0lzTW9ja0FjdGl2ZSxcbiAga05ldENvbm5lY3QsXG4gIGtHZXROZXRDb25uZWN0LFxuICBrT3B0aW9ucyxcbiAga0ZhY3Rvcnlcbn0gPSByZXF1aXJlKCcuL21vY2stc3ltYm9scycpXG5jb25zdCBNb2NrQ2xpZW50ID0gcmVxdWlyZSgnLi9tb2NrLWNsaWVudCcpXG5jb25zdCBNb2NrUG9vbCA9IHJlcXVpcmUoJy4vbW9jay1wb29sJylcbmNvbnN0IHsgbWF0Y2hWYWx1ZSwgYnVpbGRNb2NrT3B0aW9ucyB9ID0gcmVxdWlyZSgnLi9tb2NrLXV0aWxzJylcbmNvbnN0IHsgSW52YWxpZEFyZ3VtZW50RXJyb3IsIFVuZGljaUVycm9yIH0gPSByZXF1aXJlKCcuLi9jb3JlL2Vycm9ycycpXG5jb25zdCBEaXNwYXRjaGVyID0gcmVxdWlyZSgnLi4vZGlzcGF0Y2hlcicpXG5jb25zdCBQbHVyYWxpemVyID0gcmVxdWlyZSgnLi9wbHVyYWxpemVyJylcbmNvbnN0IFBlbmRpbmdJbnRlcmNlcHRvcnNGb3JtYXR0ZXIgPSByZXF1aXJlKCcuL3BlbmRpbmctaW50ZXJjZXB0b3JzLWZvcm1hdHRlcicpXG5cbmNsYXNzIEZha2VXZWFrUmVmIHtcbiAgY29uc3RydWN0b3IgKHZhbHVlKSB7XG4gICAgdGhpcy52YWx1ZSA9IHZhbHVlXG4gIH1cblxuICBkZXJlZiAoKSB7XG4gICAgcmV0dXJuIHRoaXMudmFsdWVcbiAgfVxufVxuXG5jbGFzcyBNb2NrQWdlbnQgZXh0ZW5kcyBEaXNwYXRjaGVyIHtcbiAgY29uc3RydWN0b3IgKG9wdHMpIHtcbiAgICBzdXBlcihvcHRzKVxuXG4gICAgdGhpc1trTmV0Q29ubmVjdF0gPSB0cnVlXG4gICAgdGhpc1trSXNNb2NrQWN0aXZlXSA9IHRydWVcblxuICAgIC8vIEluc3RhbnRpYXRlIEFnZW50IGFuZCBlbmNhcHN1bGF0ZVxuICAgIGlmICgob3B0cyAmJiBvcHRzLmFnZW50ICYmIHR5cGVvZiBvcHRzLmFnZW50LmRpc3BhdGNoICE9PSAnZnVuY3Rpb24nKSkge1xuICAgICAgdGhyb3cgbmV3IEludmFsaWRBcmd1bWVudEVycm9yKCdBcmd1bWVudCBvcHRzLmFnZW50IG11c3QgaW1wbGVtZW50IEFnZW50JylcbiAgICB9XG4gICAgY29uc3QgYWdlbnQgPSBvcHRzICYmIG9wdHMuYWdlbnQgPyBvcHRzLmFnZW50IDogbmV3IEFnZW50KG9wdHMpXG4gICAgdGhpc1trQWdlbnRdID0gYWdlbnRcblxuICAgIHRoaXNba0NsaWVudHNdID0gYWdlbnRba0NsaWVudHNdXG4gICAgdGhpc1trT3B0aW9uc10gPSBidWlsZE1vY2tPcHRpb25zKG9wdHMpXG4gIH1cblxuICBnZXQgKG9yaWdpbikge1xuICAgIGxldCBkaXNwYXRjaGVyID0gdGhpc1trTW9ja0FnZW50R2V0XShvcmlnaW4pXG5cbiAgICBpZiAoIWRpc3BhdGNoZXIpIHtcbiAgICAgIGRpc3BhdGNoZXIgPSB0aGlzW2tGYWN0b3J5XShvcmlnaW4pXG4gICAgICB0aGlzW2tNb2NrQWdlbnRTZXRdKG9yaWdpbiwgZGlzcGF0Y2hlcilcbiAgICB9XG4gICAgcmV0dXJuIGRpc3BhdGNoZXJcbiAgfVxuXG4gIGRpc3BhdGNoIChvcHRzLCBoYW5kbGVyKSB7XG4gICAgLy8gQ2FsbCBNb2NrQWdlbnQuZ2V0IHRvIHBlcmZvcm0gYWRkaXRpb25hbCBzZXR1cCBiZWZvcmUgZGlzcGF0Y2hpbmcgYXMgbm9ybWFsXG4gICAgdGhpcy5nZXQob3B0cy5vcmlnaW4pXG4gICAgcmV0dXJuIHRoaXNba0FnZW50XS5kaXNwYXRjaChvcHRzLCBoYW5kbGVyKVxuICB9XG5cbiAgYXN5bmMgY2xvc2UgKCkge1xuICAgIGF3YWl0IHRoaXNba0FnZW50XS5jbG9zZSgpXG4gICAgdGhpc1trQ2xpZW50c10uY2xlYXIoKVxuICB9XG5cbiAgZGVhY3RpdmF0ZSAoKSB7XG4gICAgdGhpc1trSXNNb2NrQWN0aXZlXSA9IGZhbHNlXG4gIH1cblxuICBhY3RpdmF0ZSAoKSB7XG4gICAgdGhpc1trSXNNb2NrQWN0aXZlXSA9IHRydWVcbiAgfVxuXG4gIGVuYWJsZU5ldENvbm5lY3QgKG1hdGNoZXIpIHtcbiAgICBpZiAodHlwZW9mIG1hdGNoZXIgPT09ICdzdHJpbmcnIHx8IHR5cGVvZiBtYXRjaGVyID09PSAnZnVuY3Rpb24nIHx8IG1hdGNoZXIgaW5zdGFuY2VvZiBSZWdFeHApIHtcbiAgICAgIGlmIChBcnJheS5pc0FycmF5KHRoaXNba05ldENvbm5lY3RdKSkge1xuICAgICAgICB0aGlzW2tOZXRDb25uZWN0XS5wdXNoKG1hdGNoZXIpXG4gICAgICB9IGVsc2Uge1xuICAgICAgICB0aGlzW2tOZXRDb25uZWN0XSA9IFttYXRjaGVyXVxuICAgICAgfVxuICAgIH0gZWxzZSBpZiAodHlwZW9mIG1hdGNoZXIgPT09ICd1bmRlZmluZWQnKSB7XG4gICAgICB0aGlzW2tOZXRDb25uZWN0XSA9IHRydWVcbiAgICB9IGVsc2Uge1xuICAgICAgdGhyb3cgbmV3IEludmFsaWRBcmd1bWVudEVycm9yKCdVbnN1cHBvcnRlZCBtYXRjaGVyLiBNdXN0IGJlIG9uZSBvZiBTdHJpbmd8RnVuY3Rpb258UmVnRXhwLicpXG4gICAgfVxuICB9XG5cbiAgZGlzYWJsZU5ldENvbm5lY3QgKCkge1xuICAgIHRoaXNba05ldENvbm5lY3RdID0gZmFsc2VcbiAgfVxuXG4gIC8vIFRoaXMgaXMgcmVxdWlyZWQgdG8gYnlwYXNzIGlzc3VlcyBjYXVzZWQgYnkgdXNpbmcgZ2xvYmFsIHN5bWJvbHMgLSBzZWU6XG4gIC8vIGh0dHBzOi8vZ2l0aHViLmNvbS9ub2RlanMvdW5kaWNpL2lzc3Vlcy8xNDQ3XG4gIGdldCBpc01vY2tBY3RpdmUgKCkge1xuICAgIHJldHVybiB0aGlzW2tJc01vY2tBY3RpdmVdXG4gIH1cblxuICBba01vY2tBZ2VudFNldF0gKG9yaWdpbiwgZGlzcGF0Y2hlcikge1xuICAgIHRoaXNba0NsaWVudHNdLnNldChvcmlnaW4sIG5ldyBGYWtlV2Vha1JlZihkaXNwYXRjaGVyKSlcbiAgfVxuXG4gIFtrRmFjdG9yeV0gKG9yaWdpbikge1xuICAgIGNvbnN0IG1vY2tPcHRpb25zID0gT2JqZWN0LmFzc2lnbih7IGFnZW50OiB0aGlzIH0sIHRoaXNba09wdGlvbnNdKVxuICAgIHJldHVybiB0aGlzW2tPcHRpb25zXSAmJiB0aGlzW2tPcHRpb25zXS5jb25uZWN0aW9ucyA9PT0gMVxuICAgICAgPyBuZXcgTW9ja0NsaWVudChvcmlnaW4sIG1vY2tPcHRpb25zKVxuICAgICAgOiBuZXcgTW9ja1Bvb2wob3JpZ2luLCBtb2NrT3B0aW9ucylcbiAgfVxuXG4gIFtrTW9ja0FnZW50R2V0XSAob3JpZ2luKSB7XG4gICAgLy8gRmlyc3QgY2hlY2sgaWYgd2UgY2FuIGltbWVkaWF0ZWx5IGZpbmQgaXRcbiAgICBjb25zdCByZWYgPSB0aGlzW2tDbGllbnRzXS5nZXQob3JpZ2luKVxuICAgIGlmIChyZWYpIHtcbiAgICAgIHJldHVybiByZWYuZGVyZWYoKVxuICAgIH1cblxuICAgIC8vIElmIHRoZSBvcmlnaW4gaXMgbm90IGEgc3RyaW5nIGNyZWF0ZSBhIGR1bW15IHBhcmVudCBwb29sIGFuZCByZXR1cm4gdG8gdXNlclxuICAgIGlmICh0eXBlb2Ygb3JpZ2luICE9PSAnc3RyaW5nJykge1xuICAgICAgY29uc3QgZGlzcGF0Y2hlciA9IHRoaXNba0ZhY3RvcnldKCdodHRwOi8vbG9jYWxob3N0Ojk5OTknKVxuICAgICAgdGhpc1trTW9ja0FnZW50U2V0XShvcmlnaW4sIGRpc3BhdGNoZXIpXG4gICAgICByZXR1cm4gZGlzcGF0Y2hlclxuICAgIH1cblxuICAgIC8vIElmIHdlIG1hdGNoLCBjcmVhdGUgYSBwb29sIGFuZCBhc3NpZ24gdGhlIHNhbWUgZGlzcGF0Y2hlc1xuICAgIGZvciAoY29uc3QgW2tleU1hdGNoZXIsIG5vbkV4cGxpY2l0UmVmXSBvZiBBcnJheS5mcm9tKHRoaXNba0NsaWVudHNdKSkge1xuICAgICAgY29uc3Qgbm9uRXhwbGljaXREaXNwYXRjaGVyID0gbm9uRXhwbGljaXRSZWYuZGVyZWYoKVxuICAgICAgaWYgKG5vbkV4cGxpY2l0RGlzcGF0Y2hlciAmJiB0eXBlb2Yga2V5TWF0Y2hlciAhPT0gJ3N0cmluZycgJiYgbWF0Y2hWYWx1ZShrZXlNYXRjaGVyLCBvcmlnaW4pKSB7XG4gICAgICAgIGNvbnN0IGRpc3BhdGNoZXIgPSB0aGlzW2tGYWN0b3J5XShvcmlnaW4pXG4gICAgICAgIHRoaXNba01vY2tBZ2VudFNldF0ob3JpZ2luLCBkaXNwYXRjaGVyKVxuICAgICAgICBkaXNwYXRjaGVyW2tEaXNwYXRjaGVzXSA9IG5vbkV4cGxpY2l0RGlzcGF0Y2hlcltrRGlzcGF0Y2hlc11cbiAgICAgICAgcmV0dXJuIGRpc3BhdGNoZXJcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICBba0dldE5ldENvbm5lY3RdICgpIHtcbiAgICByZXR1cm4gdGhpc1trTmV0Q29ubmVjdF1cbiAgfVxuXG4gIHBlbmRpbmdJbnRlcmNlcHRvcnMgKCkge1xuICAgIGNvbnN0IG1vY2tBZ2VudENsaWVudHMgPSB0aGlzW2tDbGllbnRzXVxuXG4gICAgcmV0dXJuIEFycmF5LmZyb20obW9ja0FnZW50Q2xpZW50cy5lbnRyaWVzKCkpXG4gICAgICAuZmxhdE1hcCgoW29yaWdpbiwgc2NvcGVdKSA9PiBzY29wZS5kZXJlZigpW2tEaXNwYXRjaGVzXS5tYXAoZGlzcGF0Y2ggPT4gKHsgLi4uZGlzcGF0Y2gsIG9yaWdpbiB9KSkpXG4gICAgICAuZmlsdGVyKCh7IHBlbmRpbmcgfSkgPT4gcGVuZGluZylcbiAgfVxuXG4gIGFzc2VydE5vUGVuZGluZ0ludGVyY2VwdG9ycyAoeyBwZW5kaW5nSW50ZXJjZXB0b3JzRm9ybWF0dGVyID0gbmV3IFBlbmRpbmdJbnRlcmNlcHRvcnNGb3JtYXR0ZXIoKSB9ID0ge30pIHtcbiAgICBjb25zdCBwZW5kaW5nID0gdGhpcy5wZW5kaW5nSW50ZXJjZXB0b3JzKClcblxuICAgIGlmIChwZW5kaW5nLmxlbmd0aCA9PT0gMCkge1xuICAgICAgcmV0dXJuXG4gICAgfVxuXG4gICAgY29uc3QgcGx1cmFsaXplciA9IG5ldyBQbHVyYWxpemVyKCdpbnRlcmNlcHRvcicsICdpbnRlcmNlcHRvcnMnKS5wbHVyYWxpemUocGVuZGluZy5sZW5ndGgpXG5cbiAgICB0aHJvdyBuZXcgVW5kaWNpRXJyb3IoYFxuJHtwbHVyYWxpemVyLmNvdW50fSAke3BsdXJhbGl6ZXIubm91bn0gJHtwbHVyYWxpemVyLmlzfSBwZW5kaW5nOlxuXG4ke3BlbmRpbmdJbnRlcmNlcHRvcnNGb3JtYXR0ZXIuZm9ybWF0KHBlbmRpbmcpfVxuYC50cmltKCkpXG4gIH1cbn1cblxubW9kdWxlLmV4cG9ydHMgPSBNb2NrQWdlbnRcbiIsCiAgICAiJ3VzZSBzdHJpY3QnXG5cbmNvbnN0IHsga1Byb3h5LCBrQ2xvc2UsIGtEZXN0cm95LCBrSW50ZXJjZXB0b3JzIH0gPSByZXF1aXJlKCcuL2NvcmUvc3ltYm9scycpXG5jb25zdCB7IFVSTCB9ID0gcmVxdWlyZSgndXJsJylcbmNvbnN0IEFnZW50ID0gcmVxdWlyZSgnLi9hZ2VudCcpXG5jb25zdCBQb29sID0gcmVxdWlyZSgnLi9wb29sJylcbmNvbnN0IERpc3BhdGNoZXJCYXNlID0gcmVxdWlyZSgnLi9kaXNwYXRjaGVyLWJhc2UnKVxuY29uc3QgeyBJbnZhbGlkQXJndW1lbnRFcnJvciwgUmVxdWVzdEFib3J0ZWRFcnJvciB9ID0gcmVxdWlyZSgnLi9jb3JlL2Vycm9ycycpXG5jb25zdCBidWlsZENvbm5lY3RvciA9IHJlcXVpcmUoJy4vY29yZS9jb25uZWN0JylcblxuY29uc3Qga0FnZW50ID0gU3ltYm9sKCdwcm94eSBhZ2VudCcpXG5jb25zdCBrQ2xpZW50ID0gU3ltYm9sKCdwcm94eSBjbGllbnQnKVxuY29uc3Qga1Byb3h5SGVhZGVycyA9IFN5bWJvbCgncHJveHkgaGVhZGVycycpXG5jb25zdCBrUmVxdWVzdFRscyA9IFN5bWJvbCgncmVxdWVzdCB0bHMgc2V0dGluZ3MnKVxuY29uc3Qga1Byb3h5VGxzID0gU3ltYm9sKCdwcm94eSB0bHMgc2V0dGluZ3MnKVxuY29uc3Qga0Nvbm5lY3RFbmRwb2ludCA9IFN5bWJvbCgnY29ubmVjdCBlbmRwb2ludCBmdW5jdGlvbicpXG5cbmZ1bmN0aW9uIGRlZmF1bHRQcm90b2NvbFBvcnQgKHByb3RvY29sKSB7XG4gIHJldHVybiBwcm90b2NvbCA9PT0gJ2h0dHBzOicgPyA0NDMgOiA4MFxufVxuXG5mdW5jdGlvbiBidWlsZFByb3h5T3B0aW9ucyAob3B0cykge1xuICBpZiAodHlwZW9mIG9wdHMgPT09ICdzdHJpbmcnKSB7XG4gICAgb3B0cyA9IHsgdXJpOiBvcHRzIH1cbiAgfVxuXG4gIGlmICghb3B0cyB8fCAhb3B0cy51cmkpIHtcbiAgICB0aHJvdyBuZXcgSW52YWxpZEFyZ3VtZW50RXJyb3IoJ1Byb3h5IG9wdHMudXJpIGlzIG1hbmRhdG9yeScpXG4gIH1cblxuICByZXR1cm4ge1xuICAgIHVyaTogb3B0cy51cmksXG4gICAgcHJvdG9jb2w6IG9wdHMucHJvdG9jb2wgfHwgJ2h0dHBzJ1xuICB9XG59XG5cbmZ1bmN0aW9uIGRlZmF1bHRGYWN0b3J5IChvcmlnaW4sIG9wdHMpIHtcbiAgcmV0dXJuIG5ldyBQb29sKG9yaWdpbiwgb3B0cylcbn1cblxuY2xhc3MgUHJveHlBZ2VudCBleHRlbmRzIERpc3BhdGNoZXJCYXNlIHtcbiAgY29uc3RydWN0b3IgKG9wdHMpIHtcbiAgICBzdXBlcihvcHRzKVxuICAgIHRoaXNba1Byb3h5XSA9IGJ1aWxkUHJveHlPcHRpb25zKG9wdHMpXG4gICAgdGhpc1trQWdlbnRdID0gbmV3IEFnZW50KG9wdHMpXG4gICAgdGhpc1trSW50ZXJjZXB0b3JzXSA9IG9wdHMuaW50ZXJjZXB0b3JzICYmIG9wdHMuaW50ZXJjZXB0b3JzLlByb3h5QWdlbnQgJiYgQXJyYXkuaXNBcnJheShvcHRzLmludGVyY2VwdG9ycy5Qcm94eUFnZW50KVxuICAgICAgPyBvcHRzLmludGVyY2VwdG9ycy5Qcm94eUFnZW50XG4gICAgICA6IFtdXG5cbiAgICBpZiAodHlwZW9mIG9wdHMgPT09ICdzdHJpbmcnKSB7XG4gICAgICBvcHRzID0geyB1cmk6IG9wdHMgfVxuICAgIH1cblxuICAgIGlmICghb3B0cyB8fCAhb3B0cy51cmkpIHtcbiAgICAgIHRocm93IG5ldyBJbnZhbGlkQXJndW1lbnRFcnJvcignUHJveHkgb3B0cy51cmkgaXMgbWFuZGF0b3J5JylcbiAgICB9XG5cbiAgICBjb25zdCB7IGNsaWVudEZhY3RvcnkgPSBkZWZhdWx0RmFjdG9yeSB9ID0gb3B0c1xuXG4gICAgaWYgKHR5cGVvZiBjbGllbnRGYWN0b3J5ICE9PSAnZnVuY3Rpb24nKSB7XG4gICAgICB0aHJvdyBuZXcgSW52YWxpZEFyZ3VtZW50RXJyb3IoJ1Byb3h5IG9wdHMuY2xpZW50RmFjdG9yeSBtdXN0IGJlIGEgZnVuY3Rpb24uJylcbiAgICB9XG5cbiAgICB0aGlzW2tSZXF1ZXN0VGxzXSA9IG9wdHMucmVxdWVzdFRsc1xuICAgIHRoaXNba1Byb3h5VGxzXSA9IG9wdHMucHJveHlUbHNcbiAgICB0aGlzW2tQcm94eUhlYWRlcnNdID0gb3B0cy5oZWFkZXJzIHx8IHt9XG5cbiAgICBjb25zdCByZXNvbHZlZFVybCA9IG5ldyBVUkwob3B0cy51cmkpXG4gICAgY29uc3QgeyBvcmlnaW4sIHBvcnQsIGhvc3QsIHVzZXJuYW1lLCBwYXNzd29yZCB9ID0gcmVzb2x2ZWRVcmxcblxuICAgIGlmIChvcHRzLmF1dGggJiYgb3B0cy50b2tlbikge1xuICAgICAgdGhyb3cgbmV3IEludmFsaWRBcmd1bWVudEVycm9yKCdvcHRzLmF1dGggY2Fubm90IGJlIHVzZWQgaW4gY29tYmluYXRpb24gd2l0aCBvcHRzLnRva2VuJylcbiAgICB9IGVsc2UgaWYgKG9wdHMuYXV0aCkge1xuICAgICAgLyogQGRlcHJlY2F0ZWQgaW4gZmF2b3VyIG9mIG9wdHMudG9rZW4gKi9cbiAgICAgIHRoaXNba1Byb3h5SGVhZGVyc11bJ3Byb3h5LWF1dGhvcml6YXRpb24nXSA9IGBCYXNpYyAke29wdHMuYXV0aH1gXG4gICAgfSBlbHNlIGlmIChvcHRzLnRva2VuKSB7XG4gICAgICB0aGlzW2tQcm94eUhlYWRlcnNdWydwcm94eS1hdXRob3JpemF0aW9uJ10gPSBvcHRzLnRva2VuXG4gICAgfSBlbHNlIGlmICh1c2VybmFtZSAmJiBwYXNzd29yZCkge1xuICAgICAgdGhpc1trUHJveHlIZWFkZXJzXVsncHJveHktYXV0aG9yaXphdGlvbiddID0gYEJhc2ljICR7QnVmZmVyLmZyb20oYCR7ZGVjb2RlVVJJQ29tcG9uZW50KHVzZXJuYW1lKX06JHtkZWNvZGVVUklDb21wb25lbnQocGFzc3dvcmQpfWApLnRvU3RyaW5nKCdiYXNlNjQnKX1gXG4gICAgfVxuXG4gICAgY29uc3QgY29ubmVjdCA9IGJ1aWxkQ29ubmVjdG9yKHsgLi4ub3B0cy5wcm94eVRscyB9KVxuICAgIHRoaXNba0Nvbm5lY3RFbmRwb2ludF0gPSBidWlsZENvbm5lY3Rvcih7IC4uLm9wdHMucmVxdWVzdFRscyB9KVxuICAgIHRoaXNba0NsaWVudF0gPSBjbGllbnRGYWN0b3J5KHJlc29sdmVkVXJsLCB7IGNvbm5lY3QgfSlcbiAgICB0aGlzW2tBZ2VudF0gPSBuZXcgQWdlbnQoe1xuICAgICAgLi4ub3B0cyxcbiAgICAgIGNvbm5lY3Q6IGFzeW5jIChvcHRzLCBjYWxsYmFjaykgPT4ge1xuICAgICAgICBsZXQgcmVxdWVzdGVkSG9zdCA9IG9wdHMuaG9zdFxuICAgICAgICBpZiAoIW9wdHMucG9ydCkge1xuICAgICAgICAgIHJlcXVlc3RlZEhvc3QgKz0gYDoke2RlZmF1bHRQcm90b2NvbFBvcnQob3B0cy5wcm90b2NvbCl9YFxuICAgICAgICB9XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgY29uc3QgeyBzb2NrZXQsIHN0YXR1c0NvZGUgfSA9IGF3YWl0IHRoaXNba0NsaWVudF0uY29ubmVjdCh7XG4gICAgICAgICAgICBvcmlnaW4sXG4gICAgICAgICAgICBwb3J0LFxuICAgICAgICAgICAgcGF0aDogcmVxdWVzdGVkSG9zdCxcbiAgICAgICAgICAgIHNpZ25hbDogb3B0cy5zaWduYWwsXG4gICAgICAgICAgICBoZWFkZXJzOiB7XG4gICAgICAgICAgICAgIC4uLnRoaXNba1Byb3h5SGVhZGVyc10sXG4gICAgICAgICAgICAgIGhvc3RcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9KVxuICAgICAgICAgIGlmIChzdGF0dXNDb2RlICE9PSAyMDApIHtcbiAgICAgICAgICAgIHNvY2tldC5vbignZXJyb3InLCAoKSA9PiB7fSkuZGVzdHJveSgpXG4gICAgICAgICAgICBjYWxsYmFjayhuZXcgUmVxdWVzdEFib3J0ZWRFcnJvcihgUHJveHkgcmVzcG9uc2UgKCR7c3RhdHVzQ29kZX0pICE9PSAyMDAgd2hlbiBIVFRQIFR1bm5lbGluZ2ApKVxuICAgICAgICAgIH1cbiAgICAgICAgICBpZiAob3B0cy5wcm90b2NvbCAhPT0gJ2h0dHBzOicpIHtcbiAgICAgICAgICAgIGNhbGxiYWNrKG51bGwsIHNvY2tldClcbiAgICAgICAgICAgIHJldHVyblxuICAgICAgICAgIH1cbiAgICAgICAgICBsZXQgc2VydmVybmFtZVxuICAgICAgICAgIGlmICh0aGlzW2tSZXF1ZXN0VGxzXSkge1xuICAgICAgICAgICAgc2VydmVybmFtZSA9IHRoaXNba1JlcXVlc3RUbHNdLnNlcnZlcm5hbWVcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgc2VydmVybmFtZSA9IG9wdHMuc2VydmVybmFtZVxuICAgICAgICAgIH1cbiAgICAgICAgICB0aGlzW2tDb25uZWN0RW5kcG9pbnRdKHsgLi4ub3B0cywgc2VydmVybmFtZSwgaHR0cFNvY2tldDogc29ja2V0IH0sIGNhbGxiYWNrKVxuICAgICAgICB9IGNhdGNoIChlcnIpIHtcbiAgICAgICAgICBjYWxsYmFjayhlcnIpXG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9KVxuICB9XG5cbiAgZGlzcGF0Y2ggKG9wdHMsIGhhbmRsZXIpIHtcbiAgICBjb25zdCB7IGhvc3QgfSA9IG5ldyBVUkwob3B0cy5vcmlnaW4pXG4gICAgY29uc3QgaGVhZGVycyA9IGJ1aWxkSGVhZGVycyhvcHRzLmhlYWRlcnMpXG4gICAgdGhyb3dJZlByb3h5QXV0aElzU2VudChoZWFkZXJzKVxuICAgIHJldHVybiB0aGlzW2tBZ2VudF0uZGlzcGF0Y2goXG4gICAgICB7XG4gICAgICAgIC4uLm9wdHMsXG4gICAgICAgIGhlYWRlcnM6IHtcbiAgICAgICAgICAuLi5oZWFkZXJzLFxuICAgICAgICAgIGhvc3RcbiAgICAgICAgfVxuICAgICAgfSxcbiAgICAgIGhhbmRsZXJcbiAgICApXG4gIH1cblxuICBhc3luYyBba0Nsb3NlXSAoKSB7XG4gICAgYXdhaXQgdGhpc1trQWdlbnRdLmNsb3NlKClcbiAgICBhd2FpdCB0aGlzW2tDbGllbnRdLmNsb3NlKClcbiAgfVxuXG4gIGFzeW5jIFtrRGVzdHJveV0gKCkge1xuICAgIGF3YWl0IHRoaXNba0FnZW50XS5kZXN0cm95KClcbiAgICBhd2FpdCB0aGlzW2tDbGllbnRdLmRlc3Ryb3koKVxuICB9XG59XG5cbi8qKlxuICogQHBhcmFtIHtzdHJpbmdbXSB8IFJlY29yZDxzdHJpbmcsIHN0cmluZz59IGhlYWRlcnNcbiAqIEByZXR1cm5zIHtSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+fVxuICovXG5mdW5jdGlvbiBidWlsZEhlYWRlcnMgKGhlYWRlcnMpIHtcbiAgLy8gV2hlbiB1c2luZyB1bmRpY2kuZmV0Y2gsIHRoZSBoZWFkZXJzIGxpc3QgaXMgc3RvcmVkXG4gIC8vIGFzIGFuIGFycmF5LlxuICBpZiAoQXJyYXkuaXNBcnJheShoZWFkZXJzKSkge1xuICAgIC8qKiBAdHlwZSB7UmVjb3JkPHN0cmluZywgc3RyaW5nPn0gKi9cbiAgICBjb25zdCBoZWFkZXJzUGFpciA9IHt9XG5cbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IGhlYWRlcnMubGVuZ3RoOyBpICs9IDIpIHtcbiAgICAgIGhlYWRlcnNQYWlyW2hlYWRlcnNbaV1dID0gaGVhZGVyc1tpICsgMV1cbiAgICB9XG5cbiAgICByZXR1cm4gaGVhZGVyc1BhaXJcbiAgfVxuXG4gIHJldHVybiBoZWFkZXJzXG59XG5cbi8qKlxuICogQHBhcmFtIHtSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+fSBoZWFkZXJzXG4gKlxuICogUHJldmlvdXMgdmVyc2lvbnMgb2YgUHJveHlBZ2VudCBzdWdnZXN0cyB0aGUgUHJveHktQXV0aG9yaXphdGlvbiBpbiByZXF1ZXN0IGhlYWRlcnNcbiAqIE5ldmVydGhlbGVzcywgaXQgd2FzIGNoYW5nZWQgYW5kIHRvIGF2b2lkIGEgc2VjdXJpdHkgdnVsbmVyYWJpbGl0eSBieSBlbmQgdXNlcnNcbiAqIHRoaXMgY2hlY2sgd2FzIGNyZWF0ZWQuXG4gKiBJdCBzaG91bGQgYmUgcmVtb3ZlZCBpbiB0aGUgbmV4dCBtYWpvciB2ZXJzaW9uIGZvciBwZXJmb3JtYW5jZSByZWFzb25zXG4gKi9cbmZ1bmN0aW9uIHRocm93SWZQcm94eUF1dGhJc1NlbnQgKGhlYWRlcnMpIHtcbiAgY29uc3QgZXhpc3RQcm94eUF1dGggPSBoZWFkZXJzICYmIE9iamVjdC5rZXlzKGhlYWRlcnMpXG4gICAgLmZpbmQoKGtleSkgPT4ga2V5LnRvTG93ZXJDYXNlKCkgPT09ICdwcm94eS1hdXRob3JpemF0aW9uJylcbiAgaWYgKGV4aXN0UHJveHlBdXRoKSB7XG4gICAgdGhyb3cgbmV3IEludmFsaWRBcmd1bWVudEVycm9yKCdQcm94eS1BdXRob3JpemF0aW9uIHNob3VsZCBiZSBzZW50IGluIFByb3h5QWdlbnQgY29uc3RydWN0b3InKVxuICB9XG59XG5cbm1vZHVsZS5leHBvcnRzID0gUHJveHlBZ2VudFxuIiwKICAgICJjb25zdCBhc3NlcnQgPSByZXF1aXJlKCdhc3NlcnQnKVxuXG5jb25zdCB7IGtSZXRyeUhhbmRsZXJEZWZhdWx0UmV0cnkgfSA9IHJlcXVpcmUoJy4uL2NvcmUvc3ltYm9scycpXG5jb25zdCB7IFJlcXVlc3RSZXRyeUVycm9yIH0gPSByZXF1aXJlKCcuLi9jb3JlL2Vycm9ycycpXG5jb25zdCB7IGlzRGlzdHVyYmVkLCBwYXJzZUhlYWRlcnMsIHBhcnNlUmFuZ2VIZWFkZXIgfSA9IHJlcXVpcmUoJy4uL2NvcmUvdXRpbCcpXG5cbmZ1bmN0aW9uIGNhbGN1bGF0ZVJldHJ5QWZ0ZXJIZWFkZXIgKHJldHJ5QWZ0ZXIpIHtcbiAgY29uc3QgY3VycmVudCA9IERhdGUubm93KClcbiAgY29uc3QgZGlmZiA9IG5ldyBEYXRlKHJldHJ5QWZ0ZXIpLmdldFRpbWUoKSAtIGN1cnJlbnRcblxuICByZXR1cm4gZGlmZlxufVxuXG5jbGFzcyBSZXRyeUhhbmRsZXIge1xuICBjb25zdHJ1Y3RvciAob3B0cywgaGFuZGxlcnMpIHtcbiAgICBjb25zdCB7IHJldHJ5T3B0aW9ucywgLi4uZGlzcGF0Y2hPcHRzIH0gPSBvcHRzXG4gICAgY29uc3Qge1xuICAgICAgLy8gUmV0cnkgc2NvcGVkXG4gICAgICByZXRyeTogcmV0cnlGbixcbiAgICAgIG1heFJldHJpZXMsXG4gICAgICBtYXhUaW1lb3V0LFxuICAgICAgbWluVGltZW91dCxcbiAgICAgIHRpbWVvdXRGYWN0b3IsXG4gICAgICAvLyBSZXNwb25zZSBzY29wZWRcbiAgICAgIG1ldGhvZHMsXG4gICAgICBlcnJvckNvZGVzLFxuICAgICAgcmV0cnlBZnRlcixcbiAgICAgIHN0YXR1c0NvZGVzXG4gICAgfSA9IHJldHJ5T3B0aW9ucyA/PyB7fVxuXG4gICAgdGhpcy5kaXNwYXRjaCA9IGhhbmRsZXJzLmRpc3BhdGNoXG4gICAgdGhpcy5oYW5kbGVyID0gaGFuZGxlcnMuaGFuZGxlclxuICAgIHRoaXMub3B0cyA9IGRpc3BhdGNoT3B0c1xuICAgIHRoaXMuYWJvcnQgPSBudWxsXG4gICAgdGhpcy5hYm9ydGVkID0gZmFsc2VcbiAgICB0aGlzLnJldHJ5T3B0cyA9IHtcbiAgICAgIHJldHJ5OiByZXRyeUZuID8/IFJldHJ5SGFuZGxlcltrUmV0cnlIYW5kbGVyRGVmYXVsdFJldHJ5XSxcbiAgICAgIHJldHJ5QWZ0ZXI6IHJldHJ5QWZ0ZXIgPz8gdHJ1ZSxcbiAgICAgIG1heFRpbWVvdXQ6IG1heFRpbWVvdXQgPz8gMzAgKiAxMDAwLCAvLyAzMHMsXG4gICAgICB0aW1lb3V0OiBtaW5UaW1lb3V0ID8/IDUwMCwgLy8gLjVzXG4gICAgICB0aW1lb3V0RmFjdG9yOiB0aW1lb3V0RmFjdG9yID8/IDIsXG4gICAgICBtYXhSZXRyaWVzOiBtYXhSZXRyaWVzID8/IDUsXG4gICAgICAvLyBXaGF0IGVycm9ycyB3ZSBzaG91bGQgcmV0cnlcbiAgICAgIG1ldGhvZHM6IG1ldGhvZHMgPz8gWydHRVQnLCAnSEVBRCcsICdPUFRJT05TJywgJ1BVVCcsICdERUxFVEUnLCAnVFJBQ0UnXSxcbiAgICAgIC8vIEluZGljYXRlcyB3aGljaCBlcnJvcnMgdG8gcmV0cnlcbiAgICAgIHN0YXR1c0NvZGVzOiBzdGF0dXNDb2RlcyA/PyBbNTAwLCA1MDIsIDUwMywgNTA0LCA0MjldLFxuICAgICAgLy8gTGlzdCBvZiBlcnJvcnMgdG8gcmV0cnlcbiAgICAgIGVycm9yQ29kZXM6IGVycm9yQ29kZXMgPz8gW1xuICAgICAgICAnRUNPTk5SRVNFVCcsXG4gICAgICAgICdFQ09OTlJFRlVTRUQnLFxuICAgICAgICAnRU5PVEZPVU5EJyxcbiAgICAgICAgJ0VORVRET1dOJyxcbiAgICAgICAgJ0VORVRVTlJFQUNIJyxcbiAgICAgICAgJ0VIT1NURE9XTicsXG4gICAgICAgICdFSE9TVFVOUkVBQ0gnLFxuICAgICAgICAnRVBJUEUnXG4gICAgICBdXG4gICAgfVxuXG4gICAgdGhpcy5yZXRyeUNvdW50ID0gMFxuICAgIHRoaXMuc3RhcnQgPSAwXG4gICAgdGhpcy5lbmQgPSBudWxsXG4gICAgdGhpcy5ldGFnID0gbnVsbFxuICAgIHRoaXMucmVzdW1lID0gbnVsbFxuXG4gICAgLy8gSGFuZGxlIHBvc3NpYmxlIG9uQ29ubmVjdCBkdXBsaWNhdGlvblxuICAgIHRoaXMuaGFuZGxlci5vbkNvbm5lY3QocmVhc29uID0+IHtcbiAgICAgIHRoaXMuYWJvcnRlZCA9IHRydWVcbiAgICAgIGlmICh0aGlzLmFib3J0KSB7XG4gICAgICAgIHRoaXMuYWJvcnQocmVhc29uKVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdGhpcy5yZWFzb24gPSByZWFzb25cbiAgICAgIH1cbiAgICB9KVxuICB9XG5cbiAgb25SZXF1ZXN0U2VudCAoKSB7XG4gICAgaWYgKHRoaXMuaGFuZGxlci5vblJlcXVlc3RTZW50KSB7XG4gICAgICB0aGlzLmhhbmRsZXIub25SZXF1ZXN0U2VudCgpXG4gICAgfVxuICB9XG5cbiAgb25VcGdyYWRlIChzdGF0dXNDb2RlLCBoZWFkZXJzLCBzb2NrZXQpIHtcbiAgICBpZiAodGhpcy5oYW5kbGVyLm9uVXBncmFkZSkge1xuICAgICAgdGhpcy5oYW5kbGVyLm9uVXBncmFkZShzdGF0dXNDb2RlLCBoZWFkZXJzLCBzb2NrZXQpXG4gICAgfVxuICB9XG5cbiAgb25Db25uZWN0IChhYm9ydCkge1xuICAgIGlmICh0aGlzLmFib3J0ZWQpIHtcbiAgICAgIGFib3J0KHRoaXMucmVhc29uKVxuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLmFib3J0ID0gYWJvcnRcbiAgICB9XG4gIH1cblxuICBvbkJvZHlTZW50IChjaHVuaykge1xuICAgIGlmICh0aGlzLmhhbmRsZXIub25Cb2R5U2VudCkgcmV0dXJuIHRoaXMuaGFuZGxlci5vbkJvZHlTZW50KGNodW5rKVxuICB9XG5cbiAgc3RhdGljIFtrUmV0cnlIYW5kbGVyRGVmYXVsdFJldHJ5XSAoZXJyLCB7IHN0YXRlLCBvcHRzIH0sIGNiKSB7XG4gICAgY29uc3QgeyBzdGF0dXNDb2RlLCBjb2RlLCBoZWFkZXJzIH0gPSBlcnJcbiAgICBjb25zdCB7IG1ldGhvZCwgcmV0cnlPcHRpb25zIH0gPSBvcHRzXG4gICAgY29uc3Qge1xuICAgICAgbWF4UmV0cmllcyxcbiAgICAgIHRpbWVvdXQsXG4gICAgICBtYXhUaW1lb3V0LFxuICAgICAgdGltZW91dEZhY3RvcixcbiAgICAgIHN0YXR1c0NvZGVzLFxuICAgICAgZXJyb3JDb2RlcyxcbiAgICAgIG1ldGhvZHNcbiAgICB9ID0gcmV0cnlPcHRpb25zXG4gICAgbGV0IHsgY291bnRlciwgY3VycmVudFRpbWVvdXQgfSA9IHN0YXRlXG5cbiAgICBjdXJyZW50VGltZW91dCA9XG4gICAgICBjdXJyZW50VGltZW91dCAhPSBudWxsICYmIGN1cnJlbnRUaW1lb3V0ID4gMCA/IGN1cnJlbnRUaW1lb3V0IDogdGltZW91dFxuXG4gICAgLy8gQW55IGNvZGUgdGhhdCBpcyBub3QgYSBVbmRpY2kncyBvcmlnaW5hdGVkIGFuZCBhbGxvd2VkIHRvIHJldHJ5XG4gICAgaWYgKFxuICAgICAgY29kZSAmJlxuICAgICAgY29kZSAhPT0gJ1VORF9FUlJfUkVRX1JFVFJZJyAmJlxuICAgICAgY29kZSAhPT0gJ1VORF9FUlJfU09DS0VUJyAmJlxuICAgICAgIWVycm9yQ29kZXMuaW5jbHVkZXMoY29kZSlcbiAgICApIHtcbiAgICAgIGNiKGVycilcbiAgICAgIHJldHVyblxuICAgIH1cblxuICAgIC8vIElmIGEgc2V0IG9mIG1ldGhvZCBhcmUgcHJvdmlkZWQgYW5kIHRoZSBjdXJyZW50IG1ldGhvZCBpcyBub3QgaW4gdGhlIGxpc3RcbiAgICBpZiAoQXJyYXkuaXNBcnJheShtZXRob2RzKSAmJiAhbWV0aG9kcy5pbmNsdWRlcyhtZXRob2QpKSB7XG4gICAgICBjYihlcnIpXG4gICAgICByZXR1cm5cbiAgICB9XG5cbiAgICAvLyBJZiBhIHNldCBvZiBzdGF0dXMgY29kZSBhcmUgcHJvdmlkZWQgYW5kIHRoZSBjdXJyZW50IHN0YXR1cyBjb2RlIGlzIG5vdCBpbiB0aGUgbGlzdFxuICAgIGlmIChcbiAgICAgIHN0YXR1c0NvZGUgIT0gbnVsbCAmJlxuICAgICAgQXJyYXkuaXNBcnJheShzdGF0dXNDb2RlcykgJiZcbiAgICAgICFzdGF0dXNDb2Rlcy5pbmNsdWRlcyhzdGF0dXNDb2RlKVxuICAgICkge1xuICAgICAgY2IoZXJyKVxuICAgICAgcmV0dXJuXG4gICAgfVxuXG4gICAgLy8gSWYgd2UgcmVhY2hlZCB0aGUgbWF4IG51bWJlciBvZiByZXRyaWVzXG4gICAgaWYgKGNvdW50ZXIgPiBtYXhSZXRyaWVzKSB7XG4gICAgICBjYihlcnIpXG4gICAgICByZXR1cm5cbiAgICB9XG5cbiAgICBsZXQgcmV0cnlBZnRlckhlYWRlciA9IGhlYWRlcnMgIT0gbnVsbCAmJiBoZWFkZXJzWydyZXRyeS1hZnRlciddXG4gICAgaWYgKHJldHJ5QWZ0ZXJIZWFkZXIpIHtcbiAgICAgIHJldHJ5QWZ0ZXJIZWFkZXIgPSBOdW1iZXIocmV0cnlBZnRlckhlYWRlcilcbiAgICAgIHJldHJ5QWZ0ZXJIZWFkZXIgPSBpc05hTihyZXRyeUFmdGVySGVhZGVyKVxuICAgICAgICA/IGNhbGN1bGF0ZVJldHJ5QWZ0ZXJIZWFkZXIocmV0cnlBZnRlckhlYWRlcilcbiAgICAgICAgOiByZXRyeUFmdGVySGVhZGVyICogMWUzIC8vIFJldHJ5LUFmdGVyIGlzIGluIHNlY29uZHNcbiAgICB9XG5cbiAgICBjb25zdCByZXRyeVRpbWVvdXQgPVxuICAgICAgcmV0cnlBZnRlckhlYWRlciA+IDBcbiAgICAgICAgPyBNYXRoLm1pbihyZXRyeUFmdGVySGVhZGVyLCBtYXhUaW1lb3V0KVxuICAgICAgICA6IE1hdGgubWluKGN1cnJlbnRUaW1lb3V0ICogdGltZW91dEZhY3RvciAqKiBjb3VudGVyLCBtYXhUaW1lb3V0KVxuXG4gICAgc3RhdGUuY3VycmVudFRpbWVvdXQgPSByZXRyeVRpbWVvdXRcblxuICAgIHNldFRpbWVvdXQoKCkgPT4gY2IobnVsbCksIHJldHJ5VGltZW91dClcbiAgfVxuXG4gIG9uSGVhZGVycyAoc3RhdHVzQ29kZSwgcmF3SGVhZGVycywgcmVzdW1lLCBzdGF0dXNNZXNzYWdlKSB7XG4gICAgY29uc3QgaGVhZGVycyA9IHBhcnNlSGVhZGVycyhyYXdIZWFkZXJzKVxuXG4gICAgdGhpcy5yZXRyeUNvdW50ICs9IDFcblxuICAgIGlmIChzdGF0dXNDb2RlID49IDMwMCkge1xuICAgICAgdGhpcy5hYm9ydChcbiAgICAgICAgbmV3IFJlcXVlc3RSZXRyeUVycm9yKCdSZXF1ZXN0IGZhaWxlZCcsIHN0YXR1c0NvZGUsIHtcbiAgICAgICAgICBoZWFkZXJzLFxuICAgICAgICAgIGNvdW50OiB0aGlzLnJldHJ5Q291bnRcbiAgICAgICAgfSlcbiAgICAgIClcbiAgICAgIHJldHVybiBmYWxzZVxuICAgIH1cblxuICAgIC8vIENoZWNrcG9pbnQgZm9yIHJlc3VtZSBmcm9tIHdoZXJlIHdlIGxlZnQgaXRcbiAgICBpZiAodGhpcy5yZXN1bWUgIT0gbnVsbCkge1xuICAgICAgdGhpcy5yZXN1bWUgPSBudWxsXG5cbiAgICAgIGlmIChzdGF0dXNDb2RlICE9PSAyMDYpIHtcbiAgICAgICAgcmV0dXJuIHRydWVcbiAgICAgIH1cblxuICAgICAgY29uc3QgY29udGVudFJhbmdlID0gcGFyc2VSYW5nZUhlYWRlcihoZWFkZXJzWydjb250ZW50LXJhbmdlJ10pXG4gICAgICAvLyBJZiBubyBjb250ZW50IHJhbmdlXG4gICAgICBpZiAoIWNvbnRlbnRSYW5nZSkge1xuICAgICAgICB0aGlzLmFib3J0KFxuICAgICAgICAgIG5ldyBSZXF1ZXN0UmV0cnlFcnJvcignQ29udGVudC1SYW5nZSBtaXNtYXRjaCcsIHN0YXR1c0NvZGUsIHtcbiAgICAgICAgICAgIGhlYWRlcnMsXG4gICAgICAgICAgICBjb3VudDogdGhpcy5yZXRyeUNvdW50XG4gICAgICAgICAgfSlcbiAgICAgICAgKVxuICAgICAgICByZXR1cm4gZmFsc2VcbiAgICAgIH1cblxuICAgICAgLy8gTGV0J3Mgc3RhcnQgd2l0aCBhIHdlYWsgZXRhZyBjaGVja1xuICAgICAgaWYgKHRoaXMuZXRhZyAhPSBudWxsICYmIHRoaXMuZXRhZyAhPT0gaGVhZGVycy5ldGFnKSB7XG4gICAgICAgIHRoaXMuYWJvcnQoXG4gICAgICAgICAgbmV3IFJlcXVlc3RSZXRyeUVycm9yKCdFVGFnIG1pc21hdGNoJywgc3RhdHVzQ29kZSwge1xuICAgICAgICAgICAgaGVhZGVycyxcbiAgICAgICAgICAgIGNvdW50OiB0aGlzLnJldHJ5Q291bnRcbiAgICAgICAgICB9KVxuICAgICAgICApXG4gICAgICAgIHJldHVybiBmYWxzZVxuICAgICAgfVxuXG4gICAgICBjb25zdCB7IHN0YXJ0LCBzaXplLCBlbmQgPSBzaXplIH0gPSBjb250ZW50UmFuZ2VcblxuICAgICAgYXNzZXJ0KHRoaXMuc3RhcnQgPT09IHN0YXJ0LCAnY29udGVudC1yYW5nZSBtaXNtYXRjaCcpXG4gICAgICBhc3NlcnQodGhpcy5lbmQgPT0gbnVsbCB8fCB0aGlzLmVuZCA9PT0gZW5kLCAnY29udGVudC1yYW5nZSBtaXNtYXRjaCcpXG5cbiAgICAgIHRoaXMucmVzdW1lID0gcmVzdW1lXG4gICAgICByZXR1cm4gdHJ1ZVxuICAgIH1cblxuICAgIGlmICh0aGlzLmVuZCA9PSBudWxsKSB7XG4gICAgICBpZiAoc3RhdHVzQ29kZSA9PT0gMjA2KSB7XG4gICAgICAgIC8vIEZpcnN0IHRpbWUgd2UgcmVjZWl2ZSAyMDZcbiAgICAgICAgY29uc3QgcmFuZ2UgPSBwYXJzZVJhbmdlSGVhZGVyKGhlYWRlcnNbJ2NvbnRlbnQtcmFuZ2UnXSlcblxuICAgICAgICBpZiAocmFuZ2UgPT0gbnVsbCkge1xuICAgICAgICAgIHJldHVybiB0aGlzLmhhbmRsZXIub25IZWFkZXJzKFxuICAgICAgICAgICAgc3RhdHVzQ29kZSxcbiAgICAgICAgICAgIHJhd0hlYWRlcnMsXG4gICAgICAgICAgICByZXN1bWUsXG4gICAgICAgICAgICBzdGF0dXNNZXNzYWdlXG4gICAgICAgICAgKVxuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgeyBzdGFydCwgc2l6ZSwgZW5kID0gc2l6ZSB9ID0gcmFuZ2VcblxuICAgICAgICBhc3NlcnQoXG4gICAgICAgICAgc3RhcnQgIT0gbnVsbCAmJiBOdW1iZXIuaXNGaW5pdGUoc3RhcnQpICYmIHRoaXMuc3RhcnQgIT09IHN0YXJ0LFxuICAgICAgICAgICdjb250ZW50LXJhbmdlIG1pc21hdGNoJ1xuICAgICAgICApXG4gICAgICAgIGFzc2VydChOdW1iZXIuaXNGaW5pdGUoc3RhcnQpKVxuICAgICAgICBhc3NlcnQoXG4gICAgICAgICAgZW5kICE9IG51bGwgJiYgTnVtYmVyLmlzRmluaXRlKGVuZCkgJiYgdGhpcy5lbmQgIT09IGVuZCxcbiAgICAgICAgICAnaW52YWxpZCBjb250ZW50LWxlbmd0aCdcbiAgICAgICAgKVxuXG4gICAgICAgIHRoaXMuc3RhcnQgPSBzdGFydFxuICAgICAgICB0aGlzLmVuZCA9IGVuZFxuICAgICAgfVxuXG4gICAgICAvLyBXZSBtYWtlIG91ciBiZXN0IHRvIGNoZWNrcG9pbnQgdGhlIGJvZHkgZm9yIGZ1cnRoZXIgcmFuZ2UgaGVhZGVyc1xuICAgICAgaWYgKHRoaXMuZW5kID09IG51bGwpIHtcbiAgICAgICAgY29uc3QgY29udGVudExlbmd0aCA9IGhlYWRlcnNbJ2NvbnRlbnQtbGVuZ3RoJ11cbiAgICAgICAgdGhpcy5lbmQgPSBjb250ZW50TGVuZ3RoICE9IG51bGwgPyBOdW1iZXIoY29udGVudExlbmd0aCkgOiBudWxsXG4gICAgICB9XG5cbiAgICAgIGFzc2VydChOdW1iZXIuaXNGaW5pdGUodGhpcy5zdGFydCkpXG4gICAgICBhc3NlcnQoXG4gICAgICAgIHRoaXMuZW5kID09IG51bGwgfHwgTnVtYmVyLmlzRmluaXRlKHRoaXMuZW5kKSxcbiAgICAgICAgJ2ludmFsaWQgY29udGVudC1sZW5ndGgnXG4gICAgICApXG5cbiAgICAgIHRoaXMucmVzdW1lID0gcmVzdW1lXG4gICAgICB0aGlzLmV0YWcgPSBoZWFkZXJzLmV0YWcgIT0gbnVsbCA/IGhlYWRlcnMuZXRhZyA6IG51bGxcblxuICAgICAgcmV0dXJuIHRoaXMuaGFuZGxlci5vbkhlYWRlcnMoXG4gICAgICAgIHN0YXR1c0NvZGUsXG4gICAgICAgIHJhd0hlYWRlcnMsXG4gICAgICAgIHJlc3VtZSxcbiAgICAgICAgc3RhdHVzTWVzc2FnZVxuICAgICAgKVxuICAgIH1cblxuICAgIGNvbnN0IGVyciA9IG5ldyBSZXF1ZXN0UmV0cnlFcnJvcignUmVxdWVzdCBmYWlsZWQnLCBzdGF0dXNDb2RlLCB7XG4gICAgICBoZWFkZXJzLFxuICAgICAgY291bnQ6IHRoaXMucmV0cnlDb3VudFxuICAgIH0pXG5cbiAgICB0aGlzLmFib3J0KGVycilcblxuICAgIHJldHVybiBmYWxzZVxuICB9XG5cbiAgb25EYXRhIChjaHVuaykge1xuICAgIHRoaXMuc3RhcnQgKz0gY2h1bmsubGVuZ3RoXG5cbiAgICByZXR1cm4gdGhpcy5oYW5kbGVyLm9uRGF0YShjaHVuaylcbiAgfVxuXG4gIG9uQ29tcGxldGUgKHJhd1RyYWlsZXJzKSB7XG4gICAgdGhpcy5yZXRyeUNvdW50ID0gMFxuICAgIHJldHVybiB0aGlzLmhhbmRsZXIub25Db21wbGV0ZShyYXdUcmFpbGVycylcbiAgfVxuXG4gIG9uRXJyb3IgKGVycikge1xuICAgIGlmICh0aGlzLmFib3J0ZWQgfHwgaXNEaXN0dXJiZWQodGhpcy5vcHRzLmJvZHkpKSB7XG4gICAgICByZXR1cm4gdGhpcy5oYW5kbGVyLm9uRXJyb3IoZXJyKVxuICAgIH1cblxuICAgIHRoaXMucmV0cnlPcHRzLnJldHJ5KFxuICAgICAgZXJyLFxuICAgICAge1xuICAgICAgICBzdGF0ZTogeyBjb3VudGVyOiB0aGlzLnJldHJ5Q291bnQrKywgY3VycmVudFRpbWVvdXQ6IHRoaXMucmV0cnlBZnRlciB9LFxuICAgICAgICBvcHRzOiB7IHJldHJ5T3B0aW9uczogdGhpcy5yZXRyeU9wdHMsIC4uLnRoaXMub3B0cyB9XG4gICAgICB9LFxuICAgICAgb25SZXRyeS5iaW5kKHRoaXMpXG4gICAgKVxuXG4gICAgZnVuY3Rpb24gb25SZXRyeSAoZXJyKSB7XG4gICAgICBpZiAoZXJyICE9IG51bGwgfHwgdGhpcy5hYm9ydGVkIHx8IGlzRGlzdHVyYmVkKHRoaXMub3B0cy5ib2R5KSkge1xuICAgICAgICByZXR1cm4gdGhpcy5oYW5kbGVyLm9uRXJyb3IoZXJyKVxuICAgICAgfVxuXG4gICAgICBpZiAodGhpcy5zdGFydCAhPT0gMCkge1xuICAgICAgICB0aGlzLm9wdHMgPSB7XG4gICAgICAgICAgLi4udGhpcy5vcHRzLFxuICAgICAgICAgIGhlYWRlcnM6IHtcbiAgICAgICAgICAgIC4uLnRoaXMub3B0cy5oZWFkZXJzLFxuICAgICAgICAgICAgcmFuZ2U6IGBieXRlcz0ke3RoaXMuc3RhcnR9LSR7dGhpcy5lbmQgPz8gJyd9YFxuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICB0cnkge1xuICAgICAgICB0aGlzLmRpc3BhdGNoKHRoaXMub3B0cywgdGhpcylcbiAgICAgIH0gY2F0Y2ggKGVycikge1xuICAgICAgICB0aGlzLmhhbmRsZXIub25FcnJvcihlcnIpXG4gICAgICB9XG4gICAgfVxuICB9XG59XG5cbm1vZHVsZS5leHBvcnRzID0gUmV0cnlIYW5kbGVyXG4iLAogICAgIid1c2Ugc3RyaWN0J1xuXG4vLyBXZSBpbmNsdWRlIGEgdmVyc2lvbiBudW1iZXIgZm9yIHRoZSBEaXNwYXRjaGVyIEFQSS4gSW4gY2FzZSBvZiBicmVha2luZyBjaGFuZ2VzLFxuLy8gdGhpcyB2ZXJzaW9uIG51bWJlciBtdXN0IGJlIGluY3JlYXNlZCB0byBhdm9pZCBjb25mbGljdHMuXG5jb25zdCBnbG9iYWxEaXNwYXRjaGVyID0gU3ltYm9sLmZvcigndW5kaWNpLmdsb2JhbERpc3BhdGNoZXIuMScpXG5jb25zdCB7IEludmFsaWRBcmd1bWVudEVycm9yIH0gPSByZXF1aXJlKCcuL2NvcmUvZXJyb3JzJylcbmNvbnN0IEFnZW50ID0gcmVxdWlyZSgnLi9hZ2VudCcpXG5cbmlmIChnZXRHbG9iYWxEaXNwYXRjaGVyKCkgPT09IHVuZGVmaW5lZCkge1xuICBzZXRHbG9iYWxEaXNwYXRjaGVyKG5ldyBBZ2VudCgpKVxufVxuXG5mdW5jdGlvbiBzZXRHbG9iYWxEaXNwYXRjaGVyIChhZ2VudCkge1xuICBpZiAoIWFnZW50IHx8IHR5cGVvZiBhZ2VudC5kaXNwYXRjaCAhPT0gJ2Z1bmN0aW9uJykge1xuICAgIHRocm93IG5ldyBJbnZhbGlkQXJndW1lbnRFcnJvcignQXJndW1lbnQgYWdlbnQgbXVzdCBpbXBsZW1lbnQgQWdlbnQnKVxuICB9XG4gIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShnbG9iYWxUaGlzLCBnbG9iYWxEaXNwYXRjaGVyLCB7XG4gICAgdmFsdWU6IGFnZW50LFxuICAgIHdyaXRhYmxlOiB0cnVlLFxuICAgIGVudW1lcmFibGU6IGZhbHNlLFxuICAgIGNvbmZpZ3VyYWJsZTogZmFsc2VcbiAgfSlcbn1cblxuZnVuY3Rpb24gZ2V0R2xvYmFsRGlzcGF0Y2hlciAoKSB7XG4gIHJldHVybiBnbG9iYWxUaGlzW2dsb2JhbERpc3BhdGNoZXJdXG59XG5cbm1vZHVsZS5leHBvcnRzID0ge1xuICBzZXRHbG9iYWxEaXNwYXRjaGVyLFxuICBnZXRHbG9iYWxEaXNwYXRjaGVyXG59XG4iLAogICAgIid1c2Ugc3RyaWN0J1xuXG5tb2R1bGUuZXhwb3J0cyA9IGNsYXNzIERlY29yYXRvckhhbmRsZXIge1xuICBjb25zdHJ1Y3RvciAoaGFuZGxlcikge1xuICAgIHRoaXMuaGFuZGxlciA9IGhhbmRsZXJcbiAgfVxuXG4gIG9uQ29ubmVjdCAoLi4uYXJncykge1xuICAgIHJldHVybiB0aGlzLmhhbmRsZXIub25Db25uZWN0KC4uLmFyZ3MpXG4gIH1cblxuICBvbkVycm9yICguLi5hcmdzKSB7XG4gICAgcmV0dXJuIHRoaXMuaGFuZGxlci5vbkVycm9yKC4uLmFyZ3MpXG4gIH1cblxuICBvblVwZ3JhZGUgKC4uLmFyZ3MpIHtcbiAgICByZXR1cm4gdGhpcy5oYW5kbGVyLm9uVXBncmFkZSguLi5hcmdzKVxuICB9XG5cbiAgb25IZWFkZXJzICguLi5hcmdzKSB7XG4gICAgcmV0dXJuIHRoaXMuaGFuZGxlci5vbkhlYWRlcnMoLi4uYXJncylcbiAgfVxuXG4gIG9uRGF0YSAoLi4uYXJncykge1xuICAgIHJldHVybiB0aGlzLmhhbmRsZXIub25EYXRhKC4uLmFyZ3MpXG4gIH1cblxuICBvbkNvbXBsZXRlICguLi5hcmdzKSB7XG4gICAgcmV0dXJuIHRoaXMuaGFuZGxlci5vbkNvbXBsZXRlKC4uLmFyZ3MpXG4gIH1cblxuICBvbkJvZHlTZW50ICguLi5hcmdzKSB7XG4gICAgcmV0dXJuIHRoaXMuaGFuZGxlci5vbkJvZHlTZW50KC4uLmFyZ3MpXG4gIH1cbn1cbiIsCiAgICAiLy8gaHR0cHM6Ly9naXRodWIuY29tL0V0aGFuLUFycm93b29kL3VuZGljaS1mZXRjaFxuXG4ndXNlIHN0cmljdCdcblxuY29uc3QgeyBrSGVhZGVyc0xpc3QsIGtDb25zdHJ1Y3QgfSA9IHJlcXVpcmUoJy4uL2NvcmUvc3ltYm9scycpXG5jb25zdCB7IGtHdWFyZCB9ID0gcmVxdWlyZSgnLi9zeW1ib2xzJylcbmNvbnN0IHsga0VudW1lcmFibGVQcm9wZXJ0eSB9ID0gcmVxdWlyZSgnLi4vY29yZS91dGlsJylcbmNvbnN0IHtcbiAgbWFrZUl0ZXJhdG9yLFxuICBpc1ZhbGlkSGVhZGVyTmFtZSxcbiAgaXNWYWxpZEhlYWRlclZhbHVlXG59ID0gcmVxdWlyZSgnLi91dGlsJylcbmNvbnN0IHsgd2ViaWRsIH0gPSByZXF1aXJlKCcuL3dlYmlkbCcpXG5jb25zdCBhc3NlcnQgPSByZXF1aXJlKCdhc3NlcnQnKVxuXG5jb25zdCBrSGVhZGVyc01hcCA9IFN5bWJvbCgnaGVhZGVycyBtYXAnKVxuY29uc3Qga0hlYWRlcnNTb3J0ZWRNYXAgPSBTeW1ib2woJ2hlYWRlcnMgbWFwIHNvcnRlZCcpXG5cbi8qKlxuICogQHBhcmFtIHtudW1iZXJ9IGNvZGVcbiAqL1xuZnVuY3Rpb24gaXNIVFRQV2hpdGVTcGFjZUNoYXJDb2RlIChjb2RlKSB7XG4gIHJldHVybiBjb2RlID09PSAweDAwYSB8fCBjb2RlID09PSAweDAwZCB8fCBjb2RlID09PSAweDAwOSB8fCBjb2RlID09PSAweDAyMFxufVxuXG4vKipcbiAqIEBzZWUgaHR0cHM6Ly9mZXRjaC5zcGVjLndoYXR3Zy5vcmcvI2NvbmNlcHQtaGVhZGVyLXZhbHVlLW5vcm1hbGl6ZVxuICogQHBhcmFtIHtzdHJpbmd9IHBvdGVudGlhbFZhbHVlXG4gKi9cbmZ1bmN0aW9uIGhlYWRlclZhbHVlTm9ybWFsaXplIChwb3RlbnRpYWxWYWx1ZSkge1xuICAvLyAgVG8gbm9ybWFsaXplIGEgYnl0ZSBzZXF1ZW5jZSBwb3RlbnRpYWxWYWx1ZSwgcmVtb3ZlXG4gIC8vICBhbnkgbGVhZGluZyBhbmQgdHJhaWxpbmcgSFRUUCB3aGl0ZXNwYWNlIGJ5dGVzIGZyb21cbiAgLy8gIHBvdGVudGlhbFZhbHVlLlxuICBsZXQgaSA9IDA7IGxldCBqID0gcG90ZW50aWFsVmFsdWUubGVuZ3RoXG5cbiAgd2hpbGUgKGogPiBpICYmIGlzSFRUUFdoaXRlU3BhY2VDaGFyQ29kZShwb3RlbnRpYWxWYWx1ZS5jaGFyQ29kZUF0KGogLSAxKSkpIC0talxuICB3aGlsZSAoaiA+IGkgJiYgaXNIVFRQV2hpdGVTcGFjZUNoYXJDb2RlKHBvdGVudGlhbFZhbHVlLmNoYXJDb2RlQXQoaSkpKSArK2lcblxuICByZXR1cm4gaSA9PT0gMCAmJiBqID09PSBwb3RlbnRpYWxWYWx1ZS5sZW5ndGggPyBwb3RlbnRpYWxWYWx1ZSA6IHBvdGVudGlhbFZhbHVlLnN1YnN0cmluZyhpLCBqKVxufVxuXG5mdW5jdGlvbiBmaWxsIChoZWFkZXJzLCBvYmplY3QpIHtcbiAgLy8gVG8gZmlsbCBhIEhlYWRlcnMgb2JqZWN0IGhlYWRlcnMgd2l0aCBhIGdpdmVuIG9iamVjdCBvYmplY3QsIHJ1biB0aGVzZSBzdGVwczpcblxuICAvLyAxLiBJZiBvYmplY3QgaXMgYSBzZXF1ZW5jZSwgdGhlbiBmb3IgZWFjaCBoZWFkZXIgaW4gb2JqZWN0OlxuICAvLyBOb3RlOiB3ZWJpZGwgY29udmVyc2lvbiB0byBhcnJheSBoYXMgYWxyZWFkeSBiZWVuIGRvbmUuXG4gIGlmIChBcnJheS5pc0FycmF5KG9iamVjdCkpIHtcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IG9iamVjdC5sZW5ndGg7ICsraSkge1xuICAgICAgY29uc3QgaGVhZGVyID0gb2JqZWN0W2ldXG4gICAgICAvLyAxLiBJZiBoZWFkZXIgZG9lcyBub3QgY29udGFpbiBleGFjdGx5IHR3byBpdGVtcywgdGhlbiB0aHJvdyBhIFR5cGVFcnJvci5cbiAgICAgIGlmIChoZWFkZXIubGVuZ3RoICE9PSAyKSB7XG4gICAgICAgIHRocm93IHdlYmlkbC5lcnJvcnMuZXhjZXB0aW9uKHtcbiAgICAgICAgICBoZWFkZXI6ICdIZWFkZXJzIGNvbnN0cnVjdG9yJyxcbiAgICAgICAgICBtZXNzYWdlOiBgZXhwZWN0ZWQgbmFtZS92YWx1ZSBwYWlyIHRvIGJlIGxlbmd0aCAyLCBmb3VuZCAke2hlYWRlci5sZW5ndGh9LmBcbiAgICAgICAgfSlcbiAgICAgIH1cblxuICAgICAgLy8gMi4gQXBwZW5kIChoZWFkZXLigJlzIGZpcnN0IGl0ZW0sIGhlYWRlcuKAmXMgc2Vjb25kIGl0ZW0pIHRvIGhlYWRlcnMuXG4gICAgICBhcHBlbmRIZWFkZXIoaGVhZGVycywgaGVhZGVyWzBdLCBoZWFkZXJbMV0pXG4gICAgfVxuICB9IGVsc2UgaWYgKHR5cGVvZiBvYmplY3QgPT09ICdvYmplY3QnICYmIG9iamVjdCAhPT0gbnVsbCkge1xuICAgIC8vIE5vdGU6IG51bGwgc2hvdWxkIHRocm93XG5cbiAgICAvLyAyLiBPdGhlcndpc2UsIG9iamVjdCBpcyBhIHJlY29yZCwgdGhlbiBmb3IgZWFjaCBrZXkg4oaSIHZhbHVlIGluIG9iamVjdCxcbiAgICAvLyAgICBhcHBlbmQgKGtleSwgdmFsdWUpIHRvIGhlYWRlcnNcbiAgICBjb25zdCBrZXlzID0gT2JqZWN0LmtleXMob2JqZWN0KVxuICAgIGZvciAobGV0IGkgPSAwOyBpIDwga2V5cy5sZW5ndGg7ICsraSkge1xuICAgICAgYXBwZW5kSGVhZGVyKGhlYWRlcnMsIGtleXNbaV0sIG9iamVjdFtrZXlzW2ldXSlcbiAgICB9XG4gIH0gZWxzZSB7XG4gICAgdGhyb3cgd2ViaWRsLmVycm9ycy5jb252ZXJzaW9uRmFpbGVkKHtcbiAgICAgIHByZWZpeDogJ0hlYWRlcnMgY29uc3RydWN0b3InLFxuICAgICAgYXJndW1lbnQ6ICdBcmd1bWVudCAxJyxcbiAgICAgIHR5cGVzOiBbJ3NlcXVlbmNlPHNlcXVlbmNlPEJ5dGVTdHJpbmc+PicsICdyZWNvcmQ8Qnl0ZVN0cmluZywgQnl0ZVN0cmluZz4nXVxuICAgIH0pXG4gIH1cbn1cblxuLyoqXG4gKiBAc2VlIGh0dHBzOi8vZmV0Y2guc3BlYy53aGF0d2cub3JnLyNjb25jZXB0LWhlYWRlcnMtYXBwZW5kXG4gKi9cbmZ1bmN0aW9uIGFwcGVuZEhlYWRlciAoaGVhZGVycywgbmFtZSwgdmFsdWUpIHtcbiAgLy8gMS4gTm9ybWFsaXplIHZhbHVlLlxuICB2YWx1ZSA9IGhlYWRlclZhbHVlTm9ybWFsaXplKHZhbHVlKVxuXG4gIC8vIDIuIElmIG5hbWUgaXMgbm90IGEgaGVhZGVyIG5hbWUgb3IgdmFsdWUgaXMgbm90IGFcbiAgLy8gICAgaGVhZGVyIHZhbHVlLCB0aGVuIHRocm93IGEgVHlwZUVycm9yLlxuICBpZiAoIWlzVmFsaWRIZWFkZXJOYW1lKG5hbWUpKSB7XG4gICAgdGhyb3cgd2ViaWRsLmVycm9ycy5pbnZhbGlkQXJndW1lbnQoe1xuICAgICAgcHJlZml4OiAnSGVhZGVycy5hcHBlbmQnLFxuICAgICAgdmFsdWU6IG5hbWUsXG4gICAgICB0eXBlOiAnaGVhZGVyIG5hbWUnXG4gICAgfSlcbiAgfSBlbHNlIGlmICghaXNWYWxpZEhlYWRlclZhbHVlKHZhbHVlKSkge1xuICAgIHRocm93IHdlYmlkbC5lcnJvcnMuaW52YWxpZEFyZ3VtZW50KHtcbiAgICAgIHByZWZpeDogJ0hlYWRlcnMuYXBwZW5kJyxcbiAgICAgIHZhbHVlLFxuICAgICAgdHlwZTogJ2hlYWRlciB2YWx1ZSdcbiAgICB9KVxuICB9XG5cbiAgLy8gMy4gSWYgaGVhZGVyc+KAmXMgZ3VhcmQgaXMgXCJpbW11dGFibGVcIiwgdGhlbiB0aHJvdyBhIFR5cGVFcnJvci5cbiAgLy8gNC4gT3RoZXJ3aXNlLCBpZiBoZWFkZXJz4oCZcyBndWFyZCBpcyBcInJlcXVlc3RcIiBhbmQgbmFtZSBpcyBhXG4gIC8vICAgIGZvcmJpZGRlbiBoZWFkZXIgbmFtZSwgcmV0dXJuLlxuICAvLyBOb3RlOiB1bmRpY2kgZG9lcyBub3QgaW1wbGVtZW50IGZvcmJpZGRlbiBoZWFkZXIgbmFtZXNcbiAgaWYgKGhlYWRlcnNba0d1YXJkXSA9PT0gJ2ltbXV0YWJsZScpIHtcbiAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCdpbW11dGFibGUnKVxuICB9IGVsc2UgaWYgKGhlYWRlcnNba0d1YXJkXSA9PT0gJ3JlcXVlc3Qtbm8tY29ycycpIHtcbiAgICAvLyA1LiBPdGhlcndpc2UsIGlmIGhlYWRlcnPigJlzIGd1YXJkIGlzIFwicmVxdWVzdC1uby1jb3JzXCI6XG4gICAgLy8gVE9ET1xuICB9XG5cbiAgLy8gNi4gT3RoZXJ3aXNlLCBpZiBoZWFkZXJz4oCZcyBndWFyZCBpcyBcInJlc3BvbnNlXCIgYW5kIG5hbWUgaXMgYVxuICAvLyAgICBmb3JiaWRkZW4gcmVzcG9uc2UtaGVhZGVyIG5hbWUsIHJldHVybi5cblxuICAvLyA3LiBBcHBlbmQgKG5hbWUsIHZhbHVlKSB0byBoZWFkZXJz4oCZcyBoZWFkZXIgbGlzdC5cbiAgcmV0dXJuIGhlYWRlcnNba0hlYWRlcnNMaXN0XS5hcHBlbmQobmFtZSwgdmFsdWUpXG5cbiAgLy8gOC4gSWYgaGVhZGVyc+KAmXMgZ3VhcmQgaXMgXCJyZXF1ZXN0LW5vLWNvcnNcIiwgdGhlbiByZW1vdmVcbiAgLy8gICAgcHJpdmlsZWdlZCBuby1DT1JTIHJlcXVlc3QgaGVhZGVycyBmcm9tIGhlYWRlcnNcbn1cblxuY2xhc3MgSGVhZGVyc0xpc3Qge1xuICAvKiogQHR5cGUge1tzdHJpbmcsIHN0cmluZ11bXXxudWxsfSAqL1xuICBjb29raWVzID0gbnVsbFxuXG4gIGNvbnN0cnVjdG9yIChpbml0KSB7XG4gICAgaWYgKGluaXQgaW5zdGFuY2VvZiBIZWFkZXJzTGlzdCkge1xuICAgICAgdGhpc1trSGVhZGVyc01hcF0gPSBuZXcgTWFwKGluaXRba0hlYWRlcnNNYXBdKVxuICAgICAgdGhpc1trSGVhZGVyc1NvcnRlZE1hcF0gPSBpbml0W2tIZWFkZXJzU29ydGVkTWFwXVxuICAgICAgdGhpcy5jb29raWVzID0gaW5pdC5jb29raWVzID09PSBudWxsID8gbnVsbCA6IFsuLi5pbml0LmNvb2tpZXNdXG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXNba0hlYWRlcnNNYXBdID0gbmV3IE1hcChpbml0KVxuICAgICAgdGhpc1trSGVhZGVyc1NvcnRlZE1hcF0gPSBudWxsXG4gICAgfVxuICB9XG5cbiAgLy8gaHR0cHM6Ly9mZXRjaC5zcGVjLndoYXR3Zy5vcmcvI2hlYWRlci1saXN0LWNvbnRhaW5zXG4gIGNvbnRhaW5zIChuYW1lKSB7XG4gICAgLy8gQSBoZWFkZXIgbGlzdCBsaXN0IGNvbnRhaW5zIGEgaGVhZGVyIG5hbWUgbmFtZSBpZiBsaXN0XG4gICAgLy8gY29udGFpbnMgYSBoZWFkZXIgd2hvc2UgbmFtZSBpcyBhIGJ5dGUtY2FzZS1pbnNlbnNpdGl2ZVxuICAgIC8vIG1hdGNoIGZvciBuYW1lLlxuICAgIG5hbWUgPSBuYW1lLnRvTG93ZXJDYXNlKClcblxuICAgIHJldHVybiB0aGlzW2tIZWFkZXJzTWFwXS5oYXMobmFtZSlcbiAgfVxuXG4gIGNsZWFyICgpIHtcbiAgICB0aGlzW2tIZWFkZXJzTWFwXS5jbGVhcigpXG4gICAgdGhpc1trSGVhZGVyc1NvcnRlZE1hcF0gPSBudWxsXG4gICAgdGhpcy5jb29raWVzID0gbnVsbFxuICB9XG5cbiAgLy8gaHR0cHM6Ly9mZXRjaC5zcGVjLndoYXR3Zy5vcmcvI2NvbmNlcHQtaGVhZGVyLWxpc3QtYXBwZW5kXG4gIGFwcGVuZCAobmFtZSwgdmFsdWUpIHtcbiAgICB0aGlzW2tIZWFkZXJzU29ydGVkTWFwXSA9IG51bGxcblxuICAgIC8vIDEuIElmIGxpc3QgY29udGFpbnMgbmFtZSwgdGhlbiBzZXQgbmFtZSB0byB0aGUgZmlyc3Qgc3VjaFxuICAgIC8vICAgIGhlYWRlcuKAmXMgbmFtZS5cbiAgICBjb25zdCBsb3dlcmNhc2VOYW1lID0gbmFtZS50b0xvd2VyQ2FzZSgpXG4gICAgY29uc3QgZXhpc3RzID0gdGhpc1trSGVhZGVyc01hcF0uZ2V0KGxvd2VyY2FzZU5hbWUpXG5cbiAgICAvLyAyLiBBcHBlbmQgKG5hbWUsIHZhbHVlKSB0byBsaXN0LlxuICAgIGlmIChleGlzdHMpIHtcbiAgICAgIGNvbnN0IGRlbGltaXRlciA9IGxvd2VyY2FzZU5hbWUgPT09ICdjb29raWUnID8gJzsgJyA6ICcsICdcbiAgICAgIHRoaXNba0hlYWRlcnNNYXBdLnNldChsb3dlcmNhc2VOYW1lLCB7XG4gICAgICAgIG5hbWU6IGV4aXN0cy5uYW1lLFxuICAgICAgICB2YWx1ZTogYCR7ZXhpc3RzLnZhbHVlfSR7ZGVsaW1pdGVyfSR7dmFsdWV9YFxuICAgICAgfSlcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpc1trSGVhZGVyc01hcF0uc2V0KGxvd2VyY2FzZU5hbWUsIHsgbmFtZSwgdmFsdWUgfSlcbiAgICB9XG5cbiAgICBpZiAobG93ZXJjYXNlTmFtZSA9PT0gJ3NldC1jb29raWUnKSB7XG4gICAgICB0aGlzLmNvb2tpZXMgPz89IFtdXG4gICAgICB0aGlzLmNvb2tpZXMucHVzaCh2YWx1ZSlcbiAgICB9XG4gIH1cblxuICAvLyBodHRwczovL2ZldGNoLnNwZWMud2hhdHdnLm9yZy8jY29uY2VwdC1oZWFkZXItbGlzdC1zZXRcbiAgc2V0IChuYW1lLCB2YWx1ZSkge1xuICAgIHRoaXNba0hlYWRlcnNTb3J0ZWRNYXBdID0gbnVsbFxuICAgIGNvbnN0IGxvd2VyY2FzZU5hbWUgPSBuYW1lLnRvTG93ZXJDYXNlKClcblxuICAgIGlmIChsb3dlcmNhc2VOYW1lID09PSAnc2V0LWNvb2tpZScpIHtcbiAgICAgIHRoaXMuY29va2llcyA9IFt2YWx1ZV1cbiAgICB9XG5cbiAgICAvLyAxLiBJZiBsaXN0IGNvbnRhaW5zIG5hbWUsIHRoZW4gc2V0IHRoZSB2YWx1ZSBvZlxuICAgIC8vICAgIHRoZSBmaXJzdCBzdWNoIGhlYWRlciB0byB2YWx1ZSBhbmQgcmVtb3ZlIHRoZVxuICAgIC8vICAgIG90aGVycy5cbiAgICAvLyAyLiBPdGhlcndpc2UsIGFwcGVuZCBoZWFkZXIgKG5hbWUsIHZhbHVlKSB0byBsaXN0LlxuICAgIHRoaXNba0hlYWRlcnNNYXBdLnNldChsb3dlcmNhc2VOYW1lLCB7IG5hbWUsIHZhbHVlIH0pXG4gIH1cblxuICAvLyBodHRwczovL2ZldGNoLnNwZWMud2hhdHdnLm9yZy8jY29uY2VwdC1oZWFkZXItbGlzdC1kZWxldGVcbiAgZGVsZXRlIChuYW1lKSB7XG4gICAgdGhpc1trSGVhZGVyc1NvcnRlZE1hcF0gPSBudWxsXG5cbiAgICBuYW1lID0gbmFtZS50b0xvd2VyQ2FzZSgpXG5cbiAgICBpZiAobmFtZSA9PT0gJ3NldC1jb29raWUnKSB7XG4gICAgICB0aGlzLmNvb2tpZXMgPSBudWxsXG4gICAgfVxuXG4gICAgdGhpc1trSGVhZGVyc01hcF0uZGVsZXRlKG5hbWUpXG4gIH1cblxuICAvLyBodHRwczovL2ZldGNoLnNwZWMud2hhdHdnLm9yZy8jY29uY2VwdC1oZWFkZXItbGlzdC1nZXRcbiAgZ2V0IChuYW1lKSB7XG4gICAgY29uc3QgdmFsdWUgPSB0aGlzW2tIZWFkZXJzTWFwXS5nZXQobmFtZS50b0xvd2VyQ2FzZSgpKVxuXG4gICAgLy8gMS4gSWYgbGlzdCBkb2VzIG5vdCBjb250YWluIG5hbWUsIHRoZW4gcmV0dXJuIG51bGwuXG4gICAgLy8gMi4gUmV0dXJuIHRoZSB2YWx1ZXMgb2YgYWxsIGhlYWRlcnMgaW4gbGlzdCB3aG9zZSBuYW1lXG4gICAgLy8gICAgaXMgYSBieXRlLWNhc2UtaW5zZW5zaXRpdmUgbWF0Y2ggZm9yIG5hbWUsXG4gICAgLy8gICAgc2VwYXJhdGVkIGZyb20gZWFjaCBvdGhlciBieSAweDJDIDB4MjAsIGluIG9yZGVyLlxuICAgIHJldHVybiB2YWx1ZSA9PT0gdW5kZWZpbmVkID8gbnVsbCA6IHZhbHVlLnZhbHVlXG4gIH1cblxuICAqIFtTeW1ib2wuaXRlcmF0b3JdICgpIHtcbiAgICAvLyB1c2UgdGhlIGxvd2VyY2FzZWQgbmFtZVxuICAgIGZvciAoY29uc3QgW25hbWUsIHsgdmFsdWUgfV0gb2YgdGhpc1trSGVhZGVyc01hcF0pIHtcbiAgICAgIHlpZWxkIFtuYW1lLCB2YWx1ZV1cbiAgICB9XG4gIH1cblxuICBnZXQgZW50cmllcyAoKSB7XG4gICAgY29uc3QgaGVhZGVycyA9IHt9XG5cbiAgICBpZiAodGhpc1trSGVhZGVyc01hcF0uc2l6ZSkge1xuICAgICAgZm9yIChjb25zdCB7IG5hbWUsIHZhbHVlIH0gb2YgdGhpc1trSGVhZGVyc01hcF0udmFsdWVzKCkpIHtcbiAgICAgICAgaGVhZGVyc1tuYW1lXSA9IHZhbHVlXG4gICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuIGhlYWRlcnNcbiAgfVxufVxuXG4vLyBodHRwczovL2ZldGNoLnNwZWMud2hhdHdnLm9yZy8jaGVhZGVycy1jbGFzc1xuY2xhc3MgSGVhZGVycyB7XG4gIGNvbnN0cnVjdG9yIChpbml0ID0gdW5kZWZpbmVkKSB7XG4gICAgaWYgKGluaXQgPT09IGtDb25zdHJ1Y3QpIHtcbiAgICAgIHJldHVyblxuICAgIH1cbiAgICB0aGlzW2tIZWFkZXJzTGlzdF0gPSBuZXcgSGVhZGVyc0xpc3QoKVxuXG4gICAgLy8gVGhlIG5ldyBIZWFkZXJzKGluaXQpIGNvbnN0cnVjdG9yIHN0ZXBzIGFyZTpcblxuICAgIC8vIDEuIFNldCB0aGlz4oCZcyBndWFyZCB0byBcIm5vbmVcIi5cbiAgICB0aGlzW2tHdWFyZF0gPSAnbm9uZSdcblxuICAgIC8vIDIuIElmIGluaXQgaXMgZ2l2ZW4sIHRoZW4gZmlsbCB0aGlzIHdpdGggaW5pdC5cbiAgICBpZiAoaW5pdCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICBpbml0ID0gd2ViaWRsLmNvbnZlcnRlcnMuSGVhZGVyc0luaXQoaW5pdClcbiAgICAgIGZpbGwodGhpcywgaW5pdClcbiAgICB9XG4gIH1cblxuICAvLyBodHRwczovL2ZldGNoLnNwZWMud2hhdHdnLm9yZy8jZG9tLWhlYWRlcnMtYXBwZW5kXG4gIGFwcGVuZCAobmFtZSwgdmFsdWUpIHtcbiAgICB3ZWJpZGwuYnJhbmRDaGVjayh0aGlzLCBIZWFkZXJzKVxuXG4gICAgd2ViaWRsLmFyZ3VtZW50TGVuZ3RoQ2hlY2soYXJndW1lbnRzLCAyLCB7IGhlYWRlcjogJ0hlYWRlcnMuYXBwZW5kJyB9KVxuXG4gICAgbmFtZSA9IHdlYmlkbC5jb252ZXJ0ZXJzLkJ5dGVTdHJpbmcobmFtZSlcbiAgICB2YWx1ZSA9IHdlYmlkbC5jb252ZXJ0ZXJzLkJ5dGVTdHJpbmcodmFsdWUpXG5cbiAgICByZXR1cm4gYXBwZW5kSGVhZGVyKHRoaXMsIG5hbWUsIHZhbHVlKVxuICB9XG5cbiAgLy8gaHR0cHM6Ly9mZXRjaC5zcGVjLndoYXR3Zy5vcmcvI2RvbS1oZWFkZXJzLWRlbGV0ZVxuICBkZWxldGUgKG5hbWUpIHtcbiAgICB3ZWJpZGwuYnJhbmRDaGVjayh0aGlzLCBIZWFkZXJzKVxuXG4gICAgd2ViaWRsLmFyZ3VtZW50TGVuZ3RoQ2hlY2soYXJndW1lbnRzLCAxLCB7IGhlYWRlcjogJ0hlYWRlcnMuZGVsZXRlJyB9KVxuXG4gICAgbmFtZSA9IHdlYmlkbC5jb252ZXJ0ZXJzLkJ5dGVTdHJpbmcobmFtZSlcblxuICAgIC8vIDEuIElmIG5hbWUgaXMgbm90IGEgaGVhZGVyIG5hbWUsIHRoZW4gdGhyb3cgYSBUeXBlRXJyb3IuXG4gICAgaWYgKCFpc1ZhbGlkSGVhZGVyTmFtZShuYW1lKSkge1xuICAgICAgdGhyb3cgd2ViaWRsLmVycm9ycy5pbnZhbGlkQXJndW1lbnQoe1xuICAgICAgICBwcmVmaXg6ICdIZWFkZXJzLmRlbGV0ZScsXG4gICAgICAgIHZhbHVlOiBuYW1lLFxuICAgICAgICB0eXBlOiAnaGVhZGVyIG5hbWUnXG4gICAgICB9KVxuICAgIH1cblxuICAgIC8vIDIuIElmIHRoaXPigJlzIGd1YXJkIGlzIFwiaW1tdXRhYmxlXCIsIHRoZW4gdGhyb3cgYSBUeXBlRXJyb3IuXG4gICAgLy8gMy4gT3RoZXJ3aXNlLCBpZiB0aGlz4oCZcyBndWFyZCBpcyBcInJlcXVlc3RcIiBhbmQgbmFtZSBpcyBhXG4gICAgLy8gICAgZm9yYmlkZGVuIGhlYWRlciBuYW1lLCByZXR1cm4uXG4gICAgLy8gNC4gT3RoZXJ3aXNlLCBpZiB0aGlz4oCZcyBndWFyZCBpcyBcInJlcXVlc3Qtbm8tY29yc1wiLCBuYW1lXG4gICAgLy8gICAgaXMgbm90IGEgbm8tQ09SUy1zYWZlbGlzdGVkIHJlcXVlc3QtaGVhZGVyIG5hbWUsIGFuZFxuICAgIC8vICAgIG5hbWUgaXMgbm90IGEgcHJpdmlsZWdlZCBuby1DT1JTIHJlcXVlc3QtaGVhZGVyIG5hbWUsXG4gICAgLy8gICAgcmV0dXJuLlxuICAgIC8vIDUuIE90aGVyd2lzZSwgaWYgdGhpc+KAmXMgZ3VhcmQgaXMgXCJyZXNwb25zZVwiIGFuZCBuYW1lIGlzXG4gICAgLy8gICAgYSBmb3JiaWRkZW4gcmVzcG9uc2UtaGVhZGVyIG5hbWUsIHJldHVybi5cbiAgICAvLyBOb3RlOiB1bmRpY2kgZG9lcyBub3QgaW1wbGVtZW50IGZvcmJpZGRlbiBoZWFkZXIgbmFtZXNcbiAgICBpZiAodGhpc1trR3VhcmRdID09PSAnaW1tdXRhYmxlJykge1xuICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcignaW1tdXRhYmxlJylcbiAgICB9IGVsc2UgaWYgKHRoaXNba0d1YXJkXSA9PT0gJ3JlcXVlc3Qtbm8tY29ycycpIHtcbiAgICAgIC8vIFRPRE9cbiAgICB9XG5cbiAgICAvLyA2LiBJZiB0aGlz4oCZcyBoZWFkZXIgbGlzdCBkb2VzIG5vdCBjb250YWluIG5hbWUsIHRoZW5cbiAgICAvLyAgICByZXR1cm4uXG4gICAgaWYgKCF0aGlzW2tIZWFkZXJzTGlzdF0uY29udGFpbnMobmFtZSkpIHtcbiAgICAgIHJldHVyblxuICAgIH1cblxuICAgIC8vIDcuIERlbGV0ZSBuYW1lIGZyb20gdGhpc+KAmXMgaGVhZGVyIGxpc3QuXG4gICAgLy8gOC4gSWYgdGhpc+KAmXMgZ3VhcmQgaXMgXCJyZXF1ZXN0LW5vLWNvcnNcIiwgdGhlbiByZW1vdmVcbiAgICAvLyAgICBwcml2aWxlZ2VkIG5vLUNPUlMgcmVxdWVzdCBoZWFkZXJzIGZyb20gdGhpcy5cbiAgICB0aGlzW2tIZWFkZXJzTGlzdF0uZGVsZXRlKG5hbWUpXG4gIH1cblxuICAvLyBodHRwczovL2ZldGNoLnNwZWMud2hhdHdnLm9yZy8jZG9tLWhlYWRlcnMtZ2V0XG4gIGdldCAobmFtZSkge1xuICAgIHdlYmlkbC5icmFuZENoZWNrKHRoaXMsIEhlYWRlcnMpXG5cbiAgICB3ZWJpZGwuYXJndW1lbnRMZW5ndGhDaGVjayhhcmd1bWVudHMsIDEsIHsgaGVhZGVyOiAnSGVhZGVycy5nZXQnIH0pXG5cbiAgICBuYW1lID0gd2ViaWRsLmNvbnZlcnRlcnMuQnl0ZVN0cmluZyhuYW1lKVxuXG4gICAgLy8gMS4gSWYgbmFtZSBpcyBub3QgYSBoZWFkZXIgbmFtZSwgdGhlbiB0aHJvdyBhIFR5cGVFcnJvci5cbiAgICBpZiAoIWlzVmFsaWRIZWFkZXJOYW1lKG5hbWUpKSB7XG4gICAgICB0aHJvdyB3ZWJpZGwuZXJyb3JzLmludmFsaWRBcmd1bWVudCh7XG4gICAgICAgIHByZWZpeDogJ0hlYWRlcnMuZ2V0JyxcbiAgICAgICAgdmFsdWU6IG5hbWUsXG4gICAgICAgIHR5cGU6ICdoZWFkZXIgbmFtZSdcbiAgICAgIH0pXG4gICAgfVxuXG4gICAgLy8gMi4gUmV0dXJuIHRoZSByZXN1bHQgb2YgZ2V0dGluZyBuYW1lIGZyb20gdGhpc+KAmXMgaGVhZGVyXG4gICAgLy8gICAgbGlzdC5cbiAgICByZXR1cm4gdGhpc1trSGVhZGVyc0xpc3RdLmdldChuYW1lKVxuICB9XG5cbiAgLy8gaHR0cHM6Ly9mZXRjaC5zcGVjLndoYXR3Zy5vcmcvI2RvbS1oZWFkZXJzLWhhc1xuICBoYXMgKG5hbWUpIHtcbiAgICB3ZWJpZGwuYnJhbmRDaGVjayh0aGlzLCBIZWFkZXJzKVxuXG4gICAgd2ViaWRsLmFyZ3VtZW50TGVuZ3RoQ2hlY2soYXJndW1lbnRzLCAxLCB7IGhlYWRlcjogJ0hlYWRlcnMuaGFzJyB9KVxuXG4gICAgbmFtZSA9IHdlYmlkbC5jb252ZXJ0ZXJzLkJ5dGVTdHJpbmcobmFtZSlcblxuICAgIC8vIDEuIElmIG5hbWUgaXMgbm90IGEgaGVhZGVyIG5hbWUsIHRoZW4gdGhyb3cgYSBUeXBlRXJyb3IuXG4gICAgaWYgKCFpc1ZhbGlkSGVhZGVyTmFtZShuYW1lKSkge1xuICAgICAgdGhyb3cgd2ViaWRsLmVycm9ycy5pbnZhbGlkQXJndW1lbnQoe1xuICAgICAgICBwcmVmaXg6ICdIZWFkZXJzLmhhcycsXG4gICAgICAgIHZhbHVlOiBuYW1lLFxuICAgICAgICB0eXBlOiAnaGVhZGVyIG5hbWUnXG4gICAgICB9KVxuICAgIH1cblxuICAgIC8vIDIuIFJldHVybiB0cnVlIGlmIHRoaXPigJlzIGhlYWRlciBsaXN0IGNvbnRhaW5zIG5hbWU7XG4gICAgLy8gICAgb3RoZXJ3aXNlIGZhbHNlLlxuICAgIHJldHVybiB0aGlzW2tIZWFkZXJzTGlzdF0uY29udGFpbnMobmFtZSlcbiAgfVxuXG4gIC8vIGh0dHBzOi8vZmV0Y2guc3BlYy53aGF0d2cub3JnLyNkb20taGVhZGVycy1zZXRcbiAgc2V0IChuYW1lLCB2YWx1ZSkge1xuICAgIHdlYmlkbC5icmFuZENoZWNrKHRoaXMsIEhlYWRlcnMpXG5cbiAgICB3ZWJpZGwuYXJndW1lbnRMZW5ndGhDaGVjayhhcmd1bWVudHMsIDIsIHsgaGVhZGVyOiAnSGVhZGVycy5zZXQnIH0pXG5cbiAgICBuYW1lID0gd2ViaWRsLmNvbnZlcnRlcnMuQnl0ZVN0cmluZyhuYW1lKVxuICAgIHZhbHVlID0gd2ViaWRsLmNvbnZlcnRlcnMuQnl0ZVN0cmluZyh2YWx1ZSlcblxuICAgIC8vIDEuIE5vcm1hbGl6ZSB2YWx1ZS5cbiAgICB2YWx1ZSA9IGhlYWRlclZhbHVlTm9ybWFsaXplKHZhbHVlKVxuXG4gICAgLy8gMi4gSWYgbmFtZSBpcyBub3QgYSBoZWFkZXIgbmFtZSBvciB2YWx1ZSBpcyBub3QgYVxuICAgIC8vICAgIGhlYWRlciB2YWx1ZSwgdGhlbiB0aHJvdyBhIFR5cGVFcnJvci5cbiAgICBpZiAoIWlzVmFsaWRIZWFkZXJOYW1lKG5hbWUpKSB7XG4gICAgICB0aHJvdyB3ZWJpZGwuZXJyb3JzLmludmFsaWRBcmd1bWVudCh7XG4gICAgICAgIHByZWZpeDogJ0hlYWRlcnMuc2V0JyxcbiAgICAgICAgdmFsdWU6IG5hbWUsXG4gICAgICAgIHR5cGU6ICdoZWFkZXIgbmFtZSdcbiAgICAgIH0pXG4gICAgfSBlbHNlIGlmICghaXNWYWxpZEhlYWRlclZhbHVlKHZhbHVlKSkge1xuICAgICAgdGhyb3cgd2ViaWRsLmVycm9ycy5pbnZhbGlkQXJndW1lbnQoe1xuICAgICAgICBwcmVmaXg6ICdIZWFkZXJzLnNldCcsXG4gICAgICAgIHZhbHVlLFxuICAgICAgICB0eXBlOiAnaGVhZGVyIHZhbHVlJ1xuICAgICAgfSlcbiAgICB9XG5cbiAgICAvLyAzLiBJZiB0aGlz4oCZcyBndWFyZCBpcyBcImltbXV0YWJsZVwiLCB0aGVuIHRocm93IGEgVHlwZUVycm9yLlxuICAgIC8vIDQuIE90aGVyd2lzZSwgaWYgdGhpc+KAmXMgZ3VhcmQgaXMgXCJyZXF1ZXN0XCIgYW5kIG5hbWUgaXMgYVxuICAgIC8vICAgIGZvcmJpZGRlbiBoZWFkZXIgbmFtZSwgcmV0dXJuLlxuICAgIC8vIDUuIE90aGVyd2lzZSwgaWYgdGhpc+KAmXMgZ3VhcmQgaXMgXCJyZXF1ZXN0LW5vLWNvcnNcIiBhbmRcbiAgICAvLyAgICBuYW1lL3ZhbHVlIGlzIG5vdCBhIG5vLUNPUlMtc2FmZWxpc3RlZCByZXF1ZXN0LWhlYWRlcixcbiAgICAvLyAgICByZXR1cm4uXG4gICAgLy8gNi4gT3RoZXJ3aXNlLCBpZiB0aGlz4oCZcyBndWFyZCBpcyBcInJlc3BvbnNlXCIgYW5kIG5hbWUgaXMgYVxuICAgIC8vICAgIGZvcmJpZGRlbiByZXNwb25zZS1oZWFkZXIgbmFtZSwgcmV0dXJuLlxuICAgIC8vIE5vdGU6IHVuZGljaSBkb2VzIG5vdCBpbXBsZW1lbnQgZm9yYmlkZGVuIGhlYWRlciBuYW1lc1xuICAgIGlmICh0aGlzW2tHdWFyZF0gPT09ICdpbW11dGFibGUnKSB7XG4gICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCdpbW11dGFibGUnKVxuICAgIH0gZWxzZSBpZiAodGhpc1trR3VhcmRdID09PSAncmVxdWVzdC1uby1jb3JzJykge1xuICAgICAgLy8gVE9ET1xuICAgIH1cblxuICAgIC8vIDcuIFNldCAobmFtZSwgdmFsdWUpIGluIHRoaXPigJlzIGhlYWRlciBsaXN0LlxuICAgIC8vIDguIElmIHRoaXPigJlzIGd1YXJkIGlzIFwicmVxdWVzdC1uby1jb3JzXCIsIHRoZW4gcmVtb3ZlXG4gICAgLy8gICAgcHJpdmlsZWdlZCBuby1DT1JTIHJlcXVlc3QgaGVhZGVycyBmcm9tIHRoaXNcbiAgICB0aGlzW2tIZWFkZXJzTGlzdF0uc2V0KG5hbWUsIHZhbHVlKVxuICB9XG5cbiAgLy8gaHR0cHM6Ly9mZXRjaC5zcGVjLndoYXR3Zy5vcmcvI2RvbS1oZWFkZXJzLWdldHNldGNvb2tpZVxuICBnZXRTZXRDb29raWUgKCkge1xuICAgIHdlYmlkbC5icmFuZENoZWNrKHRoaXMsIEhlYWRlcnMpXG5cbiAgICAvLyAxLiBJZiB0aGlz4oCZcyBoZWFkZXIgbGlzdCBkb2VzIG5vdCBjb250YWluIGBTZXQtQ29va2llYCwgdGhlbiByZXR1cm4gwqsgwrsuXG4gICAgLy8gMi4gUmV0dXJuIHRoZSB2YWx1ZXMgb2YgYWxsIGhlYWRlcnMgaW4gdGhpc+KAmXMgaGVhZGVyIGxpc3Qgd2hvc2UgbmFtZSBpc1xuICAgIC8vICAgIGEgYnl0ZS1jYXNlLWluc2Vuc2l0aXZlIG1hdGNoIGZvciBgU2V0LUNvb2tpZWAsIGluIG9yZGVyLlxuXG4gICAgY29uc3QgbGlzdCA9IHRoaXNba0hlYWRlcnNMaXN0XS5jb29raWVzXG5cbiAgICBpZiAobGlzdCkge1xuICAgICAgcmV0dXJuIFsuLi5saXN0XVxuICAgIH1cblxuICAgIHJldHVybiBbXVxuICB9XG5cbiAgLy8gaHR0cHM6Ly9mZXRjaC5zcGVjLndoYXR3Zy5vcmcvI2NvbmNlcHQtaGVhZGVyLWxpc3Qtc29ydC1hbmQtY29tYmluZVxuICBnZXQgW2tIZWFkZXJzU29ydGVkTWFwXSAoKSB7XG4gICAgaWYgKHRoaXNba0hlYWRlcnNMaXN0XVtrSGVhZGVyc1NvcnRlZE1hcF0pIHtcbiAgICAgIHJldHVybiB0aGlzW2tIZWFkZXJzTGlzdF1ba0hlYWRlcnNTb3J0ZWRNYXBdXG4gICAgfVxuXG4gICAgLy8gMS4gTGV0IGhlYWRlcnMgYmUgYW4gZW1wdHkgbGlzdCBvZiBoZWFkZXJzIHdpdGggdGhlIGtleSBiZWluZyB0aGUgbmFtZVxuICAgIC8vICAgIGFuZCB2YWx1ZSB0aGUgdmFsdWUuXG4gICAgY29uc3QgaGVhZGVycyA9IFtdXG5cbiAgICAvLyAyLiBMZXQgbmFtZXMgYmUgdGhlIHJlc3VsdCBvZiBjb252ZXJ0IGhlYWRlciBuYW1lcyB0byBhIHNvcnRlZC1sb3dlcmNhc2VcbiAgICAvLyAgICBzZXQgd2l0aCBhbGwgdGhlIG5hbWVzIG9mIHRoZSBoZWFkZXJzIGluIGxpc3QuXG4gICAgY29uc3QgbmFtZXMgPSBbLi4udGhpc1trSGVhZGVyc0xpc3RdXS5zb3J0KChhLCBiKSA9PiBhWzBdIDwgYlswXSA/IC0xIDogMSlcbiAgICBjb25zdCBjb29raWVzID0gdGhpc1trSGVhZGVyc0xpc3RdLmNvb2tpZXNcblxuICAgIC8vIDMuIEZvciBlYWNoIG5hbWUgb2YgbmFtZXM6XG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCBuYW1lcy5sZW5ndGg7ICsraSkge1xuICAgICAgY29uc3QgW25hbWUsIHZhbHVlXSA9IG5hbWVzW2ldXG4gICAgICAvLyAxLiBJZiBuYW1lIGlzIGBzZXQtY29va2llYCwgdGhlbjpcbiAgICAgIGlmIChuYW1lID09PSAnc2V0LWNvb2tpZScpIHtcbiAgICAgICAgLy8gMS4gTGV0IHZhbHVlcyBiZSBhIGxpc3Qgb2YgYWxsIHZhbHVlcyBvZiBoZWFkZXJzIGluIGxpc3Qgd2hvc2UgbmFtZVxuICAgICAgICAvLyAgICBpcyBhIGJ5dGUtY2FzZS1pbnNlbnNpdGl2ZSBtYXRjaCBmb3IgbmFtZSwgaW4gb3JkZXIuXG5cbiAgICAgICAgLy8gMi4gRm9yIGVhY2ggdmFsdWUgb2YgdmFsdWVzOlxuICAgICAgICAvLyAxLiBBcHBlbmQgKG5hbWUsIHZhbHVlKSB0byBoZWFkZXJzLlxuICAgICAgICBmb3IgKGxldCBqID0gMDsgaiA8IGNvb2tpZXMubGVuZ3RoOyArK2opIHtcbiAgICAgICAgICBoZWFkZXJzLnB1c2goW25hbWUsIGNvb2tpZXNbal1dKVxuICAgICAgICB9XG4gICAgICB9IGVsc2Uge1xuICAgICAgICAvLyAyLiBPdGhlcndpc2U6XG5cbiAgICAgICAgLy8gMS4gTGV0IHZhbHVlIGJlIHRoZSByZXN1bHQgb2YgZ2V0dGluZyBuYW1lIGZyb20gbGlzdC5cblxuICAgICAgICAvLyAyLiBBc3NlcnQ6IHZhbHVlIGlzIG5vbi1udWxsLlxuICAgICAgICBhc3NlcnQodmFsdWUgIT09IG51bGwpXG5cbiAgICAgICAgLy8gMy4gQXBwZW5kIChuYW1lLCB2YWx1ZSkgdG8gaGVhZGVycy5cbiAgICAgICAgaGVhZGVycy5wdXNoKFtuYW1lLCB2YWx1ZV0pXG4gICAgICB9XG4gICAgfVxuXG4gICAgdGhpc1trSGVhZGVyc0xpc3RdW2tIZWFkZXJzU29ydGVkTWFwXSA9IGhlYWRlcnNcblxuICAgIC8vIDQuIFJldHVybiBoZWFkZXJzLlxuICAgIHJldHVybiBoZWFkZXJzXG4gIH1cblxuICBrZXlzICgpIHtcbiAgICB3ZWJpZGwuYnJhbmRDaGVjayh0aGlzLCBIZWFkZXJzKVxuXG4gICAgaWYgKHRoaXNba0d1YXJkXSA9PT0gJ2ltbXV0YWJsZScpIHtcbiAgICAgIGNvbnN0IHZhbHVlID0gdGhpc1trSGVhZGVyc1NvcnRlZE1hcF1cbiAgICAgIHJldHVybiBtYWtlSXRlcmF0b3IoKCkgPT4gdmFsdWUsICdIZWFkZXJzJyxcbiAgICAgICAgJ2tleScpXG4gICAgfVxuXG4gICAgcmV0dXJuIG1ha2VJdGVyYXRvcihcbiAgICAgICgpID0+IFsuLi50aGlzW2tIZWFkZXJzU29ydGVkTWFwXS52YWx1ZXMoKV0sXG4gICAgICAnSGVhZGVycycsXG4gICAgICAna2V5J1xuICAgIClcbiAgfVxuXG4gIHZhbHVlcyAoKSB7XG4gICAgd2ViaWRsLmJyYW5kQ2hlY2sodGhpcywgSGVhZGVycylcblxuICAgIGlmICh0aGlzW2tHdWFyZF0gPT09ICdpbW11dGFibGUnKSB7XG4gICAgICBjb25zdCB2YWx1ZSA9IHRoaXNba0hlYWRlcnNTb3J0ZWRNYXBdXG4gICAgICByZXR1cm4gbWFrZUl0ZXJhdG9yKCgpID0+IHZhbHVlLCAnSGVhZGVycycsXG4gICAgICAgICd2YWx1ZScpXG4gICAgfVxuXG4gICAgcmV0dXJuIG1ha2VJdGVyYXRvcihcbiAgICAgICgpID0+IFsuLi50aGlzW2tIZWFkZXJzU29ydGVkTWFwXS52YWx1ZXMoKV0sXG4gICAgICAnSGVhZGVycycsXG4gICAgICAndmFsdWUnXG4gICAgKVxuICB9XG5cbiAgZW50cmllcyAoKSB7XG4gICAgd2ViaWRsLmJyYW5kQ2hlY2sodGhpcywgSGVhZGVycylcblxuICAgIGlmICh0aGlzW2tHdWFyZF0gPT09ICdpbW11dGFibGUnKSB7XG4gICAgICBjb25zdCB2YWx1ZSA9IHRoaXNba0hlYWRlcnNTb3J0ZWRNYXBdXG4gICAgICByZXR1cm4gbWFrZUl0ZXJhdG9yKCgpID0+IHZhbHVlLCAnSGVhZGVycycsXG4gICAgICAgICdrZXkrdmFsdWUnKVxuICAgIH1cblxuICAgIHJldHVybiBtYWtlSXRlcmF0b3IoXG4gICAgICAoKSA9PiBbLi4udGhpc1trSGVhZGVyc1NvcnRlZE1hcF0udmFsdWVzKCldLFxuICAgICAgJ0hlYWRlcnMnLFxuICAgICAgJ2tleSt2YWx1ZSdcbiAgICApXG4gIH1cblxuICAvKipcbiAgICogQHBhcmFtIHsodmFsdWU6IHN0cmluZywga2V5OiBzdHJpbmcsIHNlbGY6IEhlYWRlcnMpID0+IHZvaWR9IGNhbGxiYWNrRm5cbiAgICogQHBhcmFtIHt1bmtub3dufSB0aGlzQXJnXG4gICAqL1xuICBmb3JFYWNoIChjYWxsYmFja0ZuLCB0aGlzQXJnID0gZ2xvYmFsVGhpcykge1xuICAgIHdlYmlkbC5icmFuZENoZWNrKHRoaXMsIEhlYWRlcnMpXG5cbiAgICB3ZWJpZGwuYXJndW1lbnRMZW5ndGhDaGVjayhhcmd1bWVudHMsIDEsIHsgaGVhZGVyOiAnSGVhZGVycy5mb3JFYWNoJyB9KVxuXG4gICAgaWYgKHR5cGVvZiBjYWxsYmFja0ZuICE9PSAnZnVuY3Rpb24nKSB7XG4gICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKFxuICAgICAgICBcIkZhaWxlZCB0byBleGVjdXRlICdmb3JFYWNoJyBvbiAnSGVhZGVycyc6IHBhcmFtZXRlciAxIGlzIG5vdCBvZiB0eXBlICdGdW5jdGlvbicuXCJcbiAgICAgIClcbiAgICB9XG5cbiAgICBmb3IgKGNvbnN0IFtrZXksIHZhbHVlXSBvZiB0aGlzKSB7XG4gICAgICBjYWxsYmFja0ZuLmFwcGx5KHRoaXNBcmcsIFt2YWx1ZSwga2V5LCB0aGlzXSlcbiAgICB9XG4gIH1cblxuICBbU3ltYm9sLmZvcignbm9kZWpzLnV0aWwuaW5zcGVjdC5jdXN0b20nKV0gKCkge1xuICAgIHdlYmlkbC5icmFuZENoZWNrKHRoaXMsIEhlYWRlcnMpXG5cbiAgICByZXR1cm4gdGhpc1trSGVhZGVyc0xpc3RdXG4gIH1cbn1cblxuSGVhZGVycy5wcm90b3R5cGVbU3ltYm9sLml0ZXJhdG9yXSA9IEhlYWRlcnMucHJvdG90eXBlLmVudHJpZXNcblxuT2JqZWN0LmRlZmluZVByb3BlcnRpZXMoSGVhZGVycy5wcm90b3R5cGUsIHtcbiAgYXBwZW5kOiBrRW51bWVyYWJsZVByb3BlcnR5LFxuICBkZWxldGU6IGtFbnVtZXJhYmxlUHJvcGVydHksXG4gIGdldDoga0VudW1lcmFibGVQcm9wZXJ0eSxcbiAgaGFzOiBrRW51bWVyYWJsZVByb3BlcnR5LFxuICBzZXQ6IGtFbnVtZXJhYmxlUHJvcGVydHksXG4gIGdldFNldENvb2tpZToga0VudW1lcmFibGVQcm9wZXJ0eSxcbiAga2V5czoga0VudW1lcmFibGVQcm9wZXJ0eSxcbiAgdmFsdWVzOiBrRW51bWVyYWJsZVByb3BlcnR5LFxuICBlbnRyaWVzOiBrRW51bWVyYWJsZVByb3BlcnR5LFxuICBmb3JFYWNoOiBrRW51bWVyYWJsZVByb3BlcnR5LFxuICBbU3ltYm9sLml0ZXJhdG9yXTogeyBlbnVtZXJhYmxlOiBmYWxzZSB9LFxuICBbU3ltYm9sLnRvU3RyaW5nVGFnXToge1xuICAgIHZhbHVlOiAnSGVhZGVycycsXG4gICAgY29uZmlndXJhYmxlOiB0cnVlXG4gIH1cbn0pXG5cbndlYmlkbC5jb252ZXJ0ZXJzLkhlYWRlcnNJbml0ID0gZnVuY3Rpb24gKFYpIHtcbiAgaWYgKHdlYmlkbC51dGlsLlR5cGUoVikgPT09ICdPYmplY3QnKSB7XG4gICAgaWYgKFZbU3ltYm9sLml0ZXJhdG9yXSkge1xuICAgICAgcmV0dXJuIHdlYmlkbC5jb252ZXJ0ZXJzWydzZXF1ZW5jZTxzZXF1ZW5jZTxCeXRlU3RyaW5nPj4nXShWKVxuICAgIH1cblxuICAgIHJldHVybiB3ZWJpZGwuY29udmVydGVyc1sncmVjb3JkPEJ5dGVTdHJpbmcsIEJ5dGVTdHJpbmc+J10oVilcbiAgfVxuXG4gIHRocm93IHdlYmlkbC5lcnJvcnMuY29udmVyc2lvbkZhaWxlZCh7XG4gICAgcHJlZml4OiAnSGVhZGVycyBjb25zdHJ1Y3RvcicsXG4gICAgYXJndW1lbnQ6ICdBcmd1bWVudCAxJyxcbiAgICB0eXBlczogWydzZXF1ZW5jZTxzZXF1ZW5jZTxCeXRlU3RyaW5nPj4nLCAncmVjb3JkPEJ5dGVTdHJpbmcsIEJ5dGVTdHJpbmc+J11cbiAgfSlcbn1cblxubW9kdWxlLmV4cG9ydHMgPSB7XG4gIGZpbGwsXG4gIEhlYWRlcnMsXG4gIEhlYWRlcnNMaXN0XG59XG4iLAogICAgIid1c2Ugc3RyaWN0J1xuXG5jb25zdCB7IEhlYWRlcnMsIEhlYWRlcnNMaXN0LCBmaWxsIH0gPSByZXF1aXJlKCcuL2hlYWRlcnMnKVxuY29uc3QgeyBleHRyYWN0Qm9keSwgY2xvbmVCb2R5LCBtaXhpbkJvZHkgfSA9IHJlcXVpcmUoJy4vYm9keScpXG5jb25zdCB1dGlsID0gcmVxdWlyZSgnLi4vY29yZS91dGlsJylcbmNvbnN0IHsga0VudW1lcmFibGVQcm9wZXJ0eSB9ID0gdXRpbFxuY29uc3Qge1xuICBpc1ZhbGlkUmVhc29uUGhyYXNlLFxuICBpc0NhbmNlbGxlZCxcbiAgaXNBYm9ydGVkLFxuICBpc0Jsb2JMaWtlLFxuICBzZXJpYWxpemVKYXZhc2NyaXB0VmFsdWVUb0pTT05TdHJpbmcsXG4gIGlzRXJyb3JMaWtlLFxuICBpc29tb3JwaGljRW5jb2RlXG59ID0gcmVxdWlyZSgnLi91dGlsJylcbmNvbnN0IHtcbiAgcmVkaXJlY3RTdGF0dXNTZXQsXG4gIG51bGxCb2R5U3RhdHVzLFxuICBET01FeGNlcHRpb25cbn0gPSByZXF1aXJlKCcuL2NvbnN0YW50cycpXG5jb25zdCB7IGtTdGF0ZSwga0hlYWRlcnMsIGtHdWFyZCwga1JlYWxtIH0gPSByZXF1aXJlKCcuL3N5bWJvbHMnKVxuY29uc3QgeyB3ZWJpZGwgfSA9IHJlcXVpcmUoJy4vd2ViaWRsJylcbmNvbnN0IHsgRm9ybURhdGEgfSA9IHJlcXVpcmUoJy4vZm9ybWRhdGEnKVxuY29uc3QgeyBnZXRHbG9iYWxPcmlnaW4gfSA9IHJlcXVpcmUoJy4vZ2xvYmFsJylcbmNvbnN0IHsgVVJMU2VyaWFsaXplciB9ID0gcmVxdWlyZSgnLi9kYXRhVVJMJylcbmNvbnN0IHsga0hlYWRlcnNMaXN0LCBrQ29uc3RydWN0IH0gPSByZXF1aXJlKCcuLi9jb3JlL3N5bWJvbHMnKVxuY29uc3QgYXNzZXJ0ID0gcmVxdWlyZSgnYXNzZXJ0JylcbmNvbnN0IHsgdHlwZXMgfSA9IHJlcXVpcmUoJ3V0aWwnKVxuXG5jb25zdCBSZWFkYWJsZVN0cmVhbSA9IGdsb2JhbFRoaXMuUmVhZGFibGVTdHJlYW0gfHwgcmVxdWlyZSgnc3RyZWFtL3dlYicpLlJlYWRhYmxlU3RyZWFtXG5jb25zdCB0ZXh0RW5jb2RlciA9IG5ldyBUZXh0RW5jb2RlcigndXRmLTgnKVxuXG4vLyBodHRwczovL2ZldGNoLnNwZWMud2hhdHdnLm9yZy8jcmVzcG9uc2UtY2xhc3NcbmNsYXNzIFJlc3BvbnNlIHtcbiAgLy8gQ3JlYXRlcyBuZXR3b3JrIGVycm9yIFJlc3BvbnNlLlxuICBzdGF0aWMgZXJyb3IgKCkge1xuICAgIC8vIFRPRE9cbiAgICBjb25zdCByZWxldmFudFJlYWxtID0geyBzZXR0aW5nc09iamVjdDoge30gfVxuXG4gICAgLy8gVGhlIHN0YXRpYyBlcnJvcigpIG1ldGhvZCBzdGVwcyBhcmUgdG8gcmV0dXJuIHRoZSByZXN1bHQgb2YgY3JlYXRpbmcgYVxuICAgIC8vIFJlc3BvbnNlIG9iamVjdCwgZ2l2ZW4gYSBuZXcgbmV0d29yayBlcnJvciwgXCJpbW11dGFibGVcIiwgYW5kIHRoaXPigJlzXG4gICAgLy8gcmVsZXZhbnQgUmVhbG0uXG4gICAgY29uc3QgcmVzcG9uc2VPYmplY3QgPSBuZXcgUmVzcG9uc2UoKVxuICAgIHJlc3BvbnNlT2JqZWN0W2tTdGF0ZV0gPSBtYWtlTmV0d29ya0Vycm9yKClcbiAgICByZXNwb25zZU9iamVjdFtrUmVhbG1dID0gcmVsZXZhbnRSZWFsbVxuICAgIHJlc3BvbnNlT2JqZWN0W2tIZWFkZXJzXVtrSGVhZGVyc0xpc3RdID0gcmVzcG9uc2VPYmplY3Rba1N0YXRlXS5oZWFkZXJzTGlzdFxuICAgIHJlc3BvbnNlT2JqZWN0W2tIZWFkZXJzXVtrR3VhcmRdID0gJ2ltbXV0YWJsZSdcbiAgICByZXNwb25zZU9iamVjdFtrSGVhZGVyc11ba1JlYWxtXSA9IHJlbGV2YW50UmVhbG1cbiAgICByZXR1cm4gcmVzcG9uc2VPYmplY3RcbiAgfVxuXG4gIC8vIGh0dHBzOi8vZmV0Y2guc3BlYy53aGF0d2cub3JnLyNkb20tcmVzcG9uc2UtanNvblxuICBzdGF0aWMganNvbiAoZGF0YSwgaW5pdCA9IHt9KSB7XG4gICAgd2ViaWRsLmFyZ3VtZW50TGVuZ3RoQ2hlY2soYXJndW1lbnRzLCAxLCB7IGhlYWRlcjogJ1Jlc3BvbnNlLmpzb24nIH0pXG5cbiAgICBpZiAoaW5pdCAhPT0gbnVsbCkge1xuICAgICAgaW5pdCA9IHdlYmlkbC5jb252ZXJ0ZXJzLlJlc3BvbnNlSW5pdChpbml0KVxuICAgIH1cblxuICAgIC8vIDEuIExldCBieXRlcyB0aGUgcmVzdWx0IG9mIHJ1bm5pbmcgc2VyaWFsaXplIGEgSmF2YVNjcmlwdCB2YWx1ZSB0byBKU09OIGJ5dGVzIG9uIGRhdGEuXG4gICAgY29uc3QgYnl0ZXMgPSB0ZXh0RW5jb2Rlci5lbmNvZGUoXG4gICAgICBzZXJpYWxpemVKYXZhc2NyaXB0VmFsdWVUb0pTT05TdHJpbmcoZGF0YSlcbiAgICApXG5cbiAgICAvLyAyLiBMZXQgYm9keSBiZSB0aGUgcmVzdWx0IG9mIGV4dHJhY3RpbmcgYnl0ZXMuXG4gICAgY29uc3QgYm9keSA9IGV4dHJhY3RCb2R5KGJ5dGVzKVxuXG4gICAgLy8gMy4gTGV0IHJlc3BvbnNlT2JqZWN0IGJlIHRoZSByZXN1bHQgb2YgY3JlYXRpbmcgYSBSZXNwb25zZSBvYmplY3QsIGdpdmVuIGEgbmV3IHJlc3BvbnNlLFxuICAgIC8vICAgIFwicmVzcG9uc2VcIiwgYW5kIHRoaXPigJlzIHJlbGV2YW50IFJlYWxtLlxuICAgIGNvbnN0IHJlbGV2YW50UmVhbG0gPSB7IHNldHRpbmdzT2JqZWN0OiB7fSB9XG4gICAgY29uc3QgcmVzcG9uc2VPYmplY3QgPSBuZXcgUmVzcG9uc2UoKVxuICAgIHJlc3BvbnNlT2JqZWN0W2tSZWFsbV0gPSByZWxldmFudFJlYWxtXG4gICAgcmVzcG9uc2VPYmplY3Rba0hlYWRlcnNdW2tHdWFyZF0gPSAncmVzcG9uc2UnXG4gICAgcmVzcG9uc2VPYmplY3Rba0hlYWRlcnNdW2tSZWFsbV0gPSByZWxldmFudFJlYWxtXG5cbiAgICAvLyA0LiBQZXJmb3JtIGluaXRpYWxpemUgYSByZXNwb25zZSBnaXZlbiByZXNwb25zZU9iamVjdCwgaW5pdCwgYW5kIChib2R5LCBcImFwcGxpY2F0aW9uL2pzb25cIikuXG4gICAgaW5pdGlhbGl6ZVJlc3BvbnNlKHJlc3BvbnNlT2JqZWN0LCBpbml0LCB7IGJvZHk6IGJvZHlbMF0sIHR5cGU6ICdhcHBsaWNhdGlvbi9qc29uJyB9KVxuXG4gICAgLy8gNS4gUmV0dXJuIHJlc3BvbnNlT2JqZWN0LlxuICAgIHJldHVybiByZXNwb25zZU9iamVjdFxuICB9XG5cbiAgLy8gQ3JlYXRlcyBhIHJlZGlyZWN0IFJlc3BvbnNlIHRoYXQgcmVkaXJlY3RzIHRvIHVybCB3aXRoIHN0YXR1cyBzdGF0dXMuXG4gIHN0YXRpYyByZWRpcmVjdCAodXJsLCBzdGF0dXMgPSAzMDIpIHtcbiAgICBjb25zdCByZWxldmFudFJlYWxtID0geyBzZXR0aW5nc09iamVjdDoge30gfVxuXG4gICAgd2ViaWRsLmFyZ3VtZW50TGVuZ3RoQ2hlY2soYXJndW1lbnRzLCAxLCB7IGhlYWRlcjogJ1Jlc3BvbnNlLnJlZGlyZWN0JyB9KVxuXG4gICAgdXJsID0gd2ViaWRsLmNvbnZlcnRlcnMuVVNWU3RyaW5nKHVybClcbiAgICBzdGF0dXMgPSB3ZWJpZGwuY29udmVydGVyc1sndW5zaWduZWQgc2hvcnQnXShzdGF0dXMpXG5cbiAgICAvLyAxLiBMZXQgcGFyc2VkVVJMIGJlIHRoZSByZXN1bHQgb2YgcGFyc2luZyB1cmwgd2l0aCBjdXJyZW50IHNldHRpbmdzXG4gICAgLy8gb2JqZWN04oCZcyBBUEkgYmFzZSBVUkwuXG4gICAgLy8gMi4gSWYgcGFyc2VkVVJMIGlzIGZhaWx1cmUsIHRoZW4gdGhyb3cgYSBUeXBlRXJyb3IuXG4gICAgLy8gVE9ETzogYmFzZS1VUkw/XG4gICAgbGV0IHBhcnNlZFVSTFxuICAgIHRyeSB7XG4gICAgICBwYXJzZWRVUkwgPSBuZXcgVVJMKHVybCwgZ2V0R2xvYmFsT3JpZ2luKCkpXG4gICAgfSBjYXRjaCAoZXJyKSB7XG4gICAgICB0aHJvdyBPYmplY3QuYXNzaWduKG5ldyBUeXBlRXJyb3IoJ0ZhaWxlZCB0byBwYXJzZSBVUkwgZnJvbSAnICsgdXJsKSwge1xuICAgICAgICBjYXVzZTogZXJyXG4gICAgICB9KVxuICAgIH1cblxuICAgIC8vIDMuIElmIHN0YXR1cyBpcyBub3QgYSByZWRpcmVjdCBzdGF0dXMsIHRoZW4gdGhyb3cgYSBSYW5nZUVycm9yLlxuICAgIGlmICghcmVkaXJlY3RTdGF0dXNTZXQuaGFzKHN0YXR1cykpIHtcbiAgICAgIHRocm93IG5ldyBSYW5nZUVycm9yKCdJbnZhbGlkIHN0YXR1cyBjb2RlICcgKyBzdGF0dXMpXG4gICAgfVxuXG4gICAgLy8gNC4gTGV0IHJlc3BvbnNlT2JqZWN0IGJlIHRoZSByZXN1bHQgb2YgY3JlYXRpbmcgYSBSZXNwb25zZSBvYmplY3QsXG4gICAgLy8gZ2l2ZW4gYSBuZXcgcmVzcG9uc2UsIFwiaW1tdXRhYmxlXCIsIGFuZCB0aGlz4oCZcyByZWxldmFudCBSZWFsbS5cbiAgICBjb25zdCByZXNwb25zZU9iamVjdCA9IG5ldyBSZXNwb25zZSgpXG4gICAgcmVzcG9uc2VPYmplY3Rba1JlYWxtXSA9IHJlbGV2YW50UmVhbG1cbiAgICByZXNwb25zZU9iamVjdFtrSGVhZGVyc11ba0d1YXJkXSA9ICdpbW11dGFibGUnXG4gICAgcmVzcG9uc2VPYmplY3Rba0hlYWRlcnNdW2tSZWFsbV0gPSByZWxldmFudFJlYWxtXG5cbiAgICAvLyA1LiBTZXQgcmVzcG9uc2VPYmplY3TigJlzIHJlc3BvbnNl4oCZcyBzdGF0dXMgdG8gc3RhdHVzLlxuICAgIHJlc3BvbnNlT2JqZWN0W2tTdGF0ZV0uc3RhdHVzID0gc3RhdHVzXG5cbiAgICAvLyA2LiBMZXQgdmFsdWUgYmUgcGFyc2VkVVJMLCBzZXJpYWxpemVkIGFuZCBpc29tb3JwaGljIGVuY29kZWQuXG4gICAgY29uc3QgdmFsdWUgPSBpc29tb3JwaGljRW5jb2RlKFVSTFNlcmlhbGl6ZXIocGFyc2VkVVJMKSlcblxuICAgIC8vIDcuIEFwcGVuZCBgTG9jYXRpb25gL3ZhbHVlIHRvIHJlc3BvbnNlT2JqZWN04oCZcyByZXNwb25zZeKAmXMgaGVhZGVyIGxpc3QuXG4gICAgcmVzcG9uc2VPYmplY3Rba1N0YXRlXS5oZWFkZXJzTGlzdC5hcHBlbmQoJ2xvY2F0aW9uJywgdmFsdWUpXG5cbiAgICAvLyA4LiBSZXR1cm4gcmVzcG9uc2VPYmplY3QuXG4gICAgcmV0dXJuIHJlc3BvbnNlT2JqZWN0XG4gIH1cblxuICAvLyBodHRwczovL2ZldGNoLnNwZWMud2hhdHdnLm9yZy8jZG9tLXJlc3BvbnNlXG4gIGNvbnN0cnVjdG9yIChib2R5ID0gbnVsbCwgaW5pdCA9IHt9KSB7XG4gICAgaWYgKGJvZHkgIT09IG51bGwpIHtcbiAgICAgIGJvZHkgPSB3ZWJpZGwuY29udmVydGVycy5Cb2R5SW5pdChib2R5KVxuICAgIH1cblxuICAgIGluaXQgPSB3ZWJpZGwuY29udmVydGVycy5SZXNwb25zZUluaXQoaW5pdClcblxuICAgIC8vIFRPRE9cbiAgICB0aGlzW2tSZWFsbV0gPSB7IHNldHRpbmdzT2JqZWN0OiB7fSB9XG5cbiAgICAvLyAxLiBTZXQgdGhpc+KAmXMgcmVzcG9uc2UgdG8gYSBuZXcgcmVzcG9uc2UuXG4gICAgdGhpc1trU3RhdGVdID0gbWFrZVJlc3BvbnNlKHt9KVxuXG4gICAgLy8gMi4gU2V0IHRoaXPigJlzIGhlYWRlcnMgdG8gYSBuZXcgSGVhZGVycyBvYmplY3Qgd2l0aCB0aGlz4oCZcyByZWxldmFudFxuICAgIC8vIFJlYWxtLCB3aG9zZSBoZWFkZXIgbGlzdCBpcyB0aGlz4oCZcyByZXNwb25zZeKAmXMgaGVhZGVyIGxpc3QgYW5kIGd1YXJkXG4gICAgLy8gaXMgXCJyZXNwb25zZVwiLlxuICAgIHRoaXNba0hlYWRlcnNdID0gbmV3IEhlYWRlcnMoa0NvbnN0cnVjdClcbiAgICB0aGlzW2tIZWFkZXJzXVtrR3VhcmRdID0gJ3Jlc3BvbnNlJ1xuICAgIHRoaXNba0hlYWRlcnNdW2tIZWFkZXJzTGlzdF0gPSB0aGlzW2tTdGF0ZV0uaGVhZGVyc0xpc3RcbiAgICB0aGlzW2tIZWFkZXJzXVtrUmVhbG1dID0gdGhpc1trUmVhbG1dXG5cbiAgICAvLyAzLiBMZXQgYm9keVdpdGhUeXBlIGJlIG51bGwuXG4gICAgbGV0IGJvZHlXaXRoVHlwZSA9IG51bGxcblxuICAgIC8vIDQuIElmIGJvZHkgaXMgbm9uLW51bGwsIHRoZW4gc2V0IGJvZHlXaXRoVHlwZSB0byB0aGUgcmVzdWx0IG9mIGV4dHJhY3RpbmcgYm9keS5cbiAgICBpZiAoYm9keSAhPSBudWxsKSB7XG4gICAgICBjb25zdCBbZXh0cmFjdGVkQm9keSwgdHlwZV0gPSBleHRyYWN0Qm9keShib2R5KVxuICAgICAgYm9keVdpdGhUeXBlID0geyBib2R5OiBleHRyYWN0ZWRCb2R5LCB0eXBlIH1cbiAgICB9XG5cbiAgICAvLyA1LiBQZXJmb3JtIGluaXRpYWxpemUgYSByZXNwb25zZSBnaXZlbiB0aGlzLCBpbml0LCBhbmQgYm9keVdpdGhUeXBlLlxuICAgIGluaXRpYWxpemVSZXNwb25zZSh0aGlzLCBpbml0LCBib2R5V2l0aFR5cGUpXG4gIH1cblxuICAvLyBSZXR1cm5zIHJlc3BvbnNl4oCZcyB0eXBlLCBlLmcuLCBcImNvcnNcIi5cbiAgZ2V0IHR5cGUgKCkge1xuICAgIHdlYmlkbC5icmFuZENoZWNrKHRoaXMsIFJlc3BvbnNlKVxuXG4gICAgLy8gVGhlIHR5cGUgZ2V0dGVyIHN0ZXBzIGFyZSB0byByZXR1cm4gdGhpc+KAmXMgcmVzcG9uc2XigJlzIHR5cGUuXG4gICAgcmV0dXJuIHRoaXNba1N0YXRlXS50eXBlXG4gIH1cblxuICAvLyBSZXR1cm5zIHJlc3BvbnNl4oCZcyBVUkwsIGlmIGl0IGhhcyBvbmU7IG90aGVyd2lzZSB0aGUgZW1wdHkgc3RyaW5nLlxuICBnZXQgdXJsICgpIHtcbiAgICB3ZWJpZGwuYnJhbmRDaGVjayh0aGlzLCBSZXNwb25zZSlcblxuICAgIGNvbnN0IHVybExpc3QgPSB0aGlzW2tTdGF0ZV0udXJsTGlzdFxuXG4gICAgLy8gVGhlIHVybCBnZXR0ZXIgc3RlcHMgYXJlIHRvIHJldHVybiB0aGUgZW1wdHkgc3RyaW5nIGlmIHRoaXPigJlzXG4gICAgLy8gcmVzcG9uc2XigJlzIFVSTCBpcyBudWxsOyBvdGhlcndpc2UgdGhpc+KAmXMgcmVzcG9uc2XigJlzIFVSTCxcbiAgICAvLyBzZXJpYWxpemVkIHdpdGggZXhjbHVkZSBmcmFnbWVudCBzZXQgdG8gdHJ1ZS5cbiAgICBjb25zdCB1cmwgPSB1cmxMaXN0W3VybExpc3QubGVuZ3RoIC0gMV0gPz8gbnVsbFxuXG4gICAgaWYgKHVybCA9PT0gbnVsbCkge1xuICAgICAgcmV0dXJuICcnXG4gICAgfVxuXG4gICAgcmV0dXJuIFVSTFNlcmlhbGl6ZXIodXJsLCB0cnVlKVxuICB9XG5cbiAgLy8gUmV0dXJucyB3aGV0aGVyIHJlc3BvbnNlIHdhcyBvYnRhaW5lZCB0aHJvdWdoIGEgcmVkaXJlY3QuXG4gIGdldCByZWRpcmVjdGVkICgpIHtcbiAgICB3ZWJpZGwuYnJhbmRDaGVjayh0aGlzLCBSZXNwb25zZSlcblxuICAgIC8vIFRoZSByZWRpcmVjdGVkIGdldHRlciBzdGVwcyBhcmUgdG8gcmV0dXJuIHRydWUgaWYgdGhpc+KAmXMgcmVzcG9uc2XigJlzIFVSTFxuICAgIC8vIGxpc3QgaGFzIG1vcmUgdGhhbiBvbmUgaXRlbTsgb3RoZXJ3aXNlIGZhbHNlLlxuICAgIHJldHVybiB0aGlzW2tTdGF0ZV0udXJsTGlzdC5sZW5ndGggPiAxXG4gIH1cblxuICAvLyBSZXR1cm5zIHJlc3BvbnNl4oCZcyBzdGF0dXMuXG4gIGdldCBzdGF0dXMgKCkge1xuICAgIHdlYmlkbC5icmFuZENoZWNrKHRoaXMsIFJlc3BvbnNlKVxuXG4gICAgLy8gVGhlIHN0YXR1cyBnZXR0ZXIgc3RlcHMgYXJlIHRvIHJldHVybiB0aGlz4oCZcyByZXNwb25zZeKAmXMgc3RhdHVzLlxuICAgIHJldHVybiB0aGlzW2tTdGF0ZV0uc3RhdHVzXG4gIH1cblxuICAvLyBSZXR1cm5zIHdoZXRoZXIgcmVzcG9uc2XigJlzIHN0YXR1cyBpcyBhbiBvayBzdGF0dXMuXG4gIGdldCBvayAoKSB7XG4gICAgd2ViaWRsLmJyYW5kQ2hlY2sodGhpcywgUmVzcG9uc2UpXG5cbiAgICAvLyBUaGUgb2sgZ2V0dGVyIHN0ZXBzIGFyZSB0byByZXR1cm4gdHJ1ZSBpZiB0aGlz4oCZcyByZXNwb25zZeKAmXMgc3RhdHVzIGlzIGFuXG4gICAgLy8gb2sgc3RhdHVzOyBvdGhlcndpc2UgZmFsc2UuXG4gICAgcmV0dXJuIHRoaXNba1N0YXRlXS5zdGF0dXMgPj0gMjAwICYmIHRoaXNba1N0YXRlXS5zdGF0dXMgPD0gMjk5XG4gIH1cblxuICAvLyBSZXR1cm5zIHJlc3BvbnNl4oCZcyBzdGF0dXMgbWVzc2FnZS5cbiAgZ2V0IHN0YXR1c1RleHQgKCkge1xuICAgIHdlYmlkbC5icmFuZENoZWNrKHRoaXMsIFJlc3BvbnNlKVxuXG4gICAgLy8gVGhlIHN0YXR1c1RleHQgZ2V0dGVyIHN0ZXBzIGFyZSB0byByZXR1cm4gdGhpc+KAmXMgcmVzcG9uc2XigJlzIHN0YXR1c1xuICAgIC8vIG1lc3NhZ2UuXG4gICAgcmV0dXJuIHRoaXNba1N0YXRlXS5zdGF0dXNUZXh0XG4gIH1cblxuICAvLyBSZXR1cm5zIHJlc3BvbnNl4oCZcyBoZWFkZXJzIGFzIEhlYWRlcnMuXG4gIGdldCBoZWFkZXJzICgpIHtcbiAgICB3ZWJpZGwuYnJhbmRDaGVjayh0aGlzLCBSZXNwb25zZSlcblxuICAgIC8vIFRoZSBoZWFkZXJzIGdldHRlciBzdGVwcyBhcmUgdG8gcmV0dXJuIHRoaXPigJlzIGhlYWRlcnMuXG4gICAgcmV0dXJuIHRoaXNba0hlYWRlcnNdXG4gIH1cblxuICBnZXQgYm9keSAoKSB7XG4gICAgd2ViaWRsLmJyYW5kQ2hlY2sodGhpcywgUmVzcG9uc2UpXG5cbiAgICByZXR1cm4gdGhpc1trU3RhdGVdLmJvZHkgPyB0aGlzW2tTdGF0ZV0uYm9keS5zdHJlYW0gOiBudWxsXG4gIH1cblxuICBnZXQgYm9keVVzZWQgKCkge1xuICAgIHdlYmlkbC5icmFuZENoZWNrKHRoaXMsIFJlc3BvbnNlKVxuXG4gICAgcmV0dXJuICEhdGhpc1trU3RhdGVdLmJvZHkgJiYgdXRpbC5pc0Rpc3R1cmJlZCh0aGlzW2tTdGF0ZV0uYm9keS5zdHJlYW0pXG4gIH1cblxuICAvLyBSZXR1cm5zIGEgY2xvbmUgb2YgcmVzcG9uc2UuXG4gIGNsb25lICgpIHtcbiAgICB3ZWJpZGwuYnJhbmRDaGVjayh0aGlzLCBSZXNwb25zZSlcblxuICAgIC8vIDEuIElmIHRoaXMgaXMgdW51c2FibGUsIHRoZW4gdGhyb3cgYSBUeXBlRXJyb3IuXG4gICAgaWYgKHRoaXMuYm9keVVzZWQgfHwgKHRoaXMuYm9keSAmJiB0aGlzLmJvZHkubG9ja2VkKSkge1xuICAgICAgdGhyb3cgd2ViaWRsLmVycm9ycy5leGNlcHRpb24oe1xuICAgICAgICBoZWFkZXI6ICdSZXNwb25zZS5jbG9uZScsXG4gICAgICAgIG1lc3NhZ2U6ICdCb2R5IGhhcyBhbHJlYWR5IGJlZW4gY29uc3VtZWQuJ1xuICAgICAgfSlcbiAgICB9XG5cbiAgICAvLyAyLiBMZXQgY2xvbmVkUmVzcG9uc2UgYmUgdGhlIHJlc3VsdCBvZiBjbG9uaW5nIHRoaXPigJlzIHJlc3BvbnNlLlxuICAgIGNvbnN0IGNsb25lZFJlc3BvbnNlID0gY2xvbmVSZXNwb25zZSh0aGlzW2tTdGF0ZV0pXG5cbiAgICAvLyAzLiBSZXR1cm4gdGhlIHJlc3VsdCBvZiBjcmVhdGluZyBhIFJlc3BvbnNlIG9iamVjdCwgZ2l2ZW5cbiAgICAvLyBjbG9uZWRSZXNwb25zZSwgdGhpc+KAmXMgaGVhZGVyc+KAmXMgZ3VhcmQsIGFuZCB0aGlz4oCZcyByZWxldmFudCBSZWFsbS5cbiAgICBjb25zdCBjbG9uZWRSZXNwb25zZU9iamVjdCA9IG5ldyBSZXNwb25zZSgpXG4gICAgY2xvbmVkUmVzcG9uc2VPYmplY3Rba1N0YXRlXSA9IGNsb25lZFJlc3BvbnNlXG4gICAgY2xvbmVkUmVzcG9uc2VPYmplY3Rba1JlYWxtXSA9IHRoaXNba1JlYWxtXVxuICAgIGNsb25lZFJlc3BvbnNlT2JqZWN0W2tIZWFkZXJzXVtrSGVhZGVyc0xpc3RdID0gY2xvbmVkUmVzcG9uc2UuaGVhZGVyc0xpc3RcbiAgICBjbG9uZWRSZXNwb25zZU9iamVjdFtrSGVhZGVyc11ba0d1YXJkXSA9IHRoaXNba0hlYWRlcnNdW2tHdWFyZF1cbiAgICBjbG9uZWRSZXNwb25zZU9iamVjdFtrSGVhZGVyc11ba1JlYWxtXSA9IHRoaXNba0hlYWRlcnNdW2tSZWFsbV1cblxuICAgIHJldHVybiBjbG9uZWRSZXNwb25zZU9iamVjdFxuICB9XG59XG5cbm1peGluQm9keShSZXNwb25zZSlcblxuT2JqZWN0LmRlZmluZVByb3BlcnRpZXMoUmVzcG9uc2UucHJvdG90eXBlLCB7XG4gIHR5cGU6IGtFbnVtZXJhYmxlUHJvcGVydHksXG4gIHVybDoga0VudW1lcmFibGVQcm9wZXJ0eSxcbiAgc3RhdHVzOiBrRW51bWVyYWJsZVByb3BlcnR5LFxuICBvazoga0VudW1lcmFibGVQcm9wZXJ0eSxcbiAgcmVkaXJlY3RlZDoga0VudW1lcmFibGVQcm9wZXJ0eSxcbiAgc3RhdHVzVGV4dDoga0VudW1lcmFibGVQcm9wZXJ0eSxcbiAgaGVhZGVyczoga0VudW1lcmFibGVQcm9wZXJ0eSxcbiAgY2xvbmU6IGtFbnVtZXJhYmxlUHJvcGVydHksXG4gIGJvZHk6IGtFbnVtZXJhYmxlUHJvcGVydHksXG4gIGJvZHlVc2VkOiBrRW51bWVyYWJsZVByb3BlcnR5LFxuICBbU3ltYm9sLnRvU3RyaW5nVGFnXToge1xuICAgIHZhbHVlOiAnUmVzcG9uc2UnLFxuICAgIGNvbmZpZ3VyYWJsZTogdHJ1ZVxuICB9XG59KVxuXG5PYmplY3QuZGVmaW5lUHJvcGVydGllcyhSZXNwb25zZSwge1xuICBqc29uOiBrRW51bWVyYWJsZVByb3BlcnR5LFxuICByZWRpcmVjdDoga0VudW1lcmFibGVQcm9wZXJ0eSxcbiAgZXJyb3I6IGtFbnVtZXJhYmxlUHJvcGVydHlcbn0pXG5cbi8vIGh0dHBzOi8vZmV0Y2guc3BlYy53aGF0d2cub3JnLyNjb25jZXB0LXJlc3BvbnNlLWNsb25lXG5mdW5jdGlvbiBjbG9uZVJlc3BvbnNlIChyZXNwb25zZSkge1xuICAvLyBUbyBjbG9uZSBhIHJlc3BvbnNlIHJlc3BvbnNlLCBydW4gdGhlc2Ugc3RlcHM6XG5cbiAgLy8gMS4gSWYgcmVzcG9uc2UgaXMgYSBmaWx0ZXJlZCByZXNwb25zZSwgdGhlbiByZXR1cm4gYSBuZXcgaWRlbnRpY2FsXG4gIC8vIGZpbHRlcmVkIHJlc3BvbnNlIHdob3NlIGludGVybmFsIHJlc3BvbnNlIGlzIGEgY2xvbmUgb2YgcmVzcG9uc2XigJlzXG4gIC8vIGludGVybmFsIHJlc3BvbnNlLlxuICBpZiAocmVzcG9uc2UuaW50ZXJuYWxSZXNwb25zZSkge1xuICAgIHJldHVybiBmaWx0ZXJSZXNwb25zZShcbiAgICAgIGNsb25lUmVzcG9uc2UocmVzcG9uc2UuaW50ZXJuYWxSZXNwb25zZSksXG4gICAgICByZXNwb25zZS50eXBlXG4gICAgKVxuICB9XG5cbiAgLy8gMi4gTGV0IG5ld1Jlc3BvbnNlIGJlIGEgY29weSBvZiByZXNwb25zZSwgZXhjZXB0IGZvciBpdHMgYm9keS5cbiAgY29uc3QgbmV3UmVzcG9uc2UgPSBtYWtlUmVzcG9uc2UoeyAuLi5yZXNwb25zZSwgYm9keTogbnVsbCB9KVxuXG4gIC8vIDMuIElmIHJlc3BvbnNl4oCZcyBib2R5IGlzIG5vbi1udWxsLCB0aGVuIHNldCBuZXdSZXNwb25zZeKAmXMgYm9keSB0byB0aGVcbiAgLy8gcmVzdWx0IG9mIGNsb25pbmcgcmVzcG9uc2XigJlzIGJvZHkuXG4gIGlmIChyZXNwb25zZS5ib2R5ICE9IG51bGwpIHtcbiAgICBuZXdSZXNwb25zZS5ib2R5ID0gY2xvbmVCb2R5KHJlc3BvbnNlLmJvZHkpXG4gIH1cblxuICAvLyA0LiBSZXR1cm4gbmV3UmVzcG9uc2UuXG4gIHJldHVybiBuZXdSZXNwb25zZVxufVxuXG5mdW5jdGlvbiBtYWtlUmVzcG9uc2UgKGluaXQpIHtcbiAgcmV0dXJuIHtcbiAgICBhYm9ydGVkOiBmYWxzZSxcbiAgICByYW5nZVJlcXVlc3RlZDogZmFsc2UsXG4gICAgdGltaW5nQWxsb3dQYXNzZWQ6IGZhbHNlLFxuICAgIHJlcXVlc3RJbmNsdWRlc0NyZWRlbnRpYWxzOiBmYWxzZSxcbiAgICB0eXBlOiAnZGVmYXVsdCcsXG4gICAgc3RhdHVzOiAyMDAsXG4gICAgdGltaW5nSW5mbzogbnVsbCxcbiAgICBjYWNoZVN0YXRlOiAnJyxcbiAgICBzdGF0dXNUZXh0OiAnJyxcbiAgICAuLi5pbml0LFxuICAgIGhlYWRlcnNMaXN0OiBpbml0LmhlYWRlcnNMaXN0XG4gICAgICA/IG5ldyBIZWFkZXJzTGlzdChpbml0LmhlYWRlcnNMaXN0KVxuICAgICAgOiBuZXcgSGVhZGVyc0xpc3QoKSxcbiAgICB1cmxMaXN0OiBpbml0LnVybExpc3QgPyBbLi4uaW5pdC51cmxMaXN0XSA6IFtdXG4gIH1cbn1cblxuZnVuY3Rpb24gbWFrZU5ldHdvcmtFcnJvciAocmVhc29uKSB7XG4gIGNvbnN0IGlzRXJyb3IgPSBpc0Vycm9yTGlrZShyZWFzb24pXG4gIHJldHVybiBtYWtlUmVzcG9uc2Uoe1xuICAgIHR5cGU6ICdlcnJvcicsXG4gICAgc3RhdHVzOiAwLFxuICAgIGVycm9yOiBpc0Vycm9yXG4gICAgICA/IHJlYXNvblxuICAgICAgOiBuZXcgRXJyb3IocmVhc29uID8gU3RyaW5nKHJlYXNvbikgOiByZWFzb24pLFxuICAgIGFib3J0ZWQ6IHJlYXNvbiAmJiByZWFzb24ubmFtZSA9PT0gJ0Fib3J0RXJyb3InXG4gIH0pXG59XG5cbmZ1bmN0aW9uIG1ha2VGaWx0ZXJlZFJlc3BvbnNlIChyZXNwb25zZSwgc3RhdGUpIHtcbiAgc3RhdGUgPSB7XG4gICAgaW50ZXJuYWxSZXNwb25zZTogcmVzcG9uc2UsXG4gICAgLi4uc3RhdGVcbiAgfVxuXG4gIHJldHVybiBuZXcgUHJveHkocmVzcG9uc2UsIHtcbiAgICBnZXQgKHRhcmdldCwgcCkge1xuICAgICAgcmV0dXJuIHAgaW4gc3RhdGUgPyBzdGF0ZVtwXSA6IHRhcmdldFtwXVxuICAgIH0sXG4gICAgc2V0ICh0YXJnZXQsIHAsIHZhbHVlKSB7XG4gICAgICBhc3NlcnQoIShwIGluIHN0YXRlKSlcbiAgICAgIHRhcmdldFtwXSA9IHZhbHVlXG4gICAgICByZXR1cm4gdHJ1ZVxuICAgIH1cbiAgfSlcbn1cblxuLy8gaHR0cHM6Ly9mZXRjaC5zcGVjLndoYXR3Zy5vcmcvI2NvbmNlcHQtZmlsdGVyZWQtcmVzcG9uc2VcbmZ1bmN0aW9uIGZpbHRlclJlc3BvbnNlIChyZXNwb25zZSwgdHlwZSkge1xuICAvLyBTZXQgcmVzcG9uc2UgdG8gdGhlIGZvbGxvd2luZyBmaWx0ZXJlZCByZXNwb25zZSB3aXRoIHJlc3BvbnNlIGFzIGl0c1xuICAvLyBpbnRlcm5hbCByZXNwb25zZSwgZGVwZW5kaW5nIG9uIHJlcXVlc3TigJlzIHJlc3BvbnNlIHRhaW50aW5nOlxuICBpZiAodHlwZSA9PT0gJ2Jhc2ljJykge1xuICAgIC8vIEEgYmFzaWMgZmlsdGVyZWQgcmVzcG9uc2UgaXMgYSBmaWx0ZXJlZCByZXNwb25zZSB3aG9zZSB0eXBlIGlzIFwiYmFzaWNcIlxuICAgIC8vIGFuZCBoZWFkZXIgbGlzdCBleGNsdWRlcyBhbnkgaGVhZGVycyBpbiBpbnRlcm5hbCByZXNwb25zZeKAmXMgaGVhZGVyIGxpc3RcbiAgICAvLyB3aG9zZSBuYW1lIGlzIGEgZm9yYmlkZGVuIHJlc3BvbnNlLWhlYWRlciBuYW1lLlxuXG4gICAgLy8gTm90ZTogdW5kaWNpIGRvZXMgbm90IGltcGxlbWVudCBmb3JiaWRkZW4gcmVzcG9uc2UtaGVhZGVyIG5hbWVzXG4gICAgcmV0dXJuIG1ha2VGaWx0ZXJlZFJlc3BvbnNlKHJlc3BvbnNlLCB7XG4gICAgICB0eXBlOiAnYmFzaWMnLFxuICAgICAgaGVhZGVyc0xpc3Q6IHJlc3BvbnNlLmhlYWRlcnNMaXN0XG4gICAgfSlcbiAgfSBlbHNlIGlmICh0eXBlID09PSAnY29ycycpIHtcbiAgICAvLyBBIENPUlMgZmlsdGVyZWQgcmVzcG9uc2UgaXMgYSBmaWx0ZXJlZCByZXNwb25zZSB3aG9zZSB0eXBlIGlzIFwiY29yc1wiXG4gICAgLy8gYW5kIGhlYWRlciBsaXN0IGV4Y2x1ZGVzIGFueSBoZWFkZXJzIGluIGludGVybmFsIHJlc3BvbnNl4oCZcyBoZWFkZXJcbiAgICAvLyBsaXN0IHdob3NlIG5hbWUgaXMgbm90IGEgQ09SUy1zYWZlbGlzdGVkIHJlc3BvbnNlLWhlYWRlciBuYW1lLCBnaXZlblxuICAgIC8vIGludGVybmFsIHJlc3BvbnNl4oCZcyBDT1JTLWV4cG9zZWQgaGVhZGVyLW5hbWUgbGlzdC5cblxuICAgIC8vIE5vdGU6IHVuZGljaSBkb2VzIG5vdCBpbXBsZW1lbnQgQ09SUy1zYWZlbGlzdGVkIHJlc3BvbnNlLWhlYWRlciBuYW1lc1xuICAgIHJldHVybiBtYWtlRmlsdGVyZWRSZXNwb25zZShyZXNwb25zZSwge1xuICAgICAgdHlwZTogJ2NvcnMnLFxuICAgICAgaGVhZGVyc0xpc3Q6IHJlc3BvbnNlLmhlYWRlcnNMaXN0XG4gICAgfSlcbiAgfSBlbHNlIGlmICh0eXBlID09PSAnb3BhcXVlJykge1xuICAgIC8vIEFuIG9wYXF1ZSBmaWx0ZXJlZCByZXNwb25zZSBpcyBhIGZpbHRlcmVkIHJlc3BvbnNlIHdob3NlIHR5cGUgaXNcbiAgICAvLyBcIm9wYXF1ZVwiLCBVUkwgbGlzdCBpcyB0aGUgZW1wdHkgbGlzdCwgc3RhdHVzIGlzIDAsIHN0YXR1cyBtZXNzYWdlXG4gICAgLy8gaXMgdGhlIGVtcHR5IGJ5dGUgc2VxdWVuY2UsIGhlYWRlciBsaXN0IGlzIGVtcHR5LCBhbmQgYm9keSBpcyBudWxsLlxuXG4gICAgcmV0dXJuIG1ha2VGaWx0ZXJlZFJlc3BvbnNlKHJlc3BvbnNlLCB7XG4gICAgICB0eXBlOiAnb3BhcXVlJyxcbiAgICAgIHVybExpc3Q6IE9iamVjdC5mcmVlemUoW10pLFxuICAgICAgc3RhdHVzOiAwLFxuICAgICAgc3RhdHVzVGV4dDogJycsXG4gICAgICBib2R5OiBudWxsXG4gICAgfSlcbiAgfSBlbHNlIGlmICh0eXBlID09PSAnb3BhcXVlcmVkaXJlY3QnKSB7XG4gICAgLy8gQW4gb3BhcXVlLXJlZGlyZWN0IGZpbHRlcmVkIHJlc3BvbnNlIGlzIGEgZmlsdGVyZWQgcmVzcG9uc2Ugd2hvc2UgdHlwZVxuICAgIC8vIGlzIFwib3BhcXVlcmVkaXJlY3RcIiwgc3RhdHVzIGlzIDAsIHN0YXR1cyBtZXNzYWdlIGlzIHRoZSBlbXB0eSBieXRlXG4gICAgLy8gc2VxdWVuY2UsIGhlYWRlciBsaXN0IGlzIGVtcHR5LCBhbmQgYm9keSBpcyBudWxsLlxuXG4gICAgcmV0dXJuIG1ha2VGaWx0ZXJlZFJlc3BvbnNlKHJlc3BvbnNlLCB7XG4gICAgICB0eXBlOiAnb3BhcXVlcmVkaXJlY3QnLFxuICAgICAgc3RhdHVzOiAwLFxuICAgICAgc3RhdHVzVGV4dDogJycsXG4gICAgICBoZWFkZXJzTGlzdDogW10sXG4gICAgICBib2R5OiBudWxsXG4gICAgfSlcbiAgfSBlbHNlIHtcbiAgICBhc3NlcnQoZmFsc2UpXG4gIH1cbn1cblxuLy8gaHR0cHM6Ly9mZXRjaC5zcGVjLndoYXR3Zy5vcmcvI2FwcHJvcHJpYXRlLW5ldHdvcmstZXJyb3JcbmZ1bmN0aW9uIG1ha2VBcHByb3ByaWF0ZU5ldHdvcmtFcnJvciAoZmV0Y2hQYXJhbXMsIGVyciA9IG51bGwpIHtcbiAgLy8gMS4gQXNzZXJ0OiBmZXRjaFBhcmFtcyBpcyBjYW5jZWxlZC5cbiAgYXNzZXJ0KGlzQ2FuY2VsbGVkKGZldGNoUGFyYW1zKSlcblxuICAvLyAyLiBSZXR1cm4gYW4gYWJvcnRlZCBuZXR3b3JrIGVycm9yIGlmIGZldGNoUGFyYW1zIGlzIGFib3J0ZWQ7XG4gIC8vIG90aGVyd2lzZSByZXR1cm4gYSBuZXR3b3JrIGVycm9yLlxuICByZXR1cm4gaXNBYm9ydGVkKGZldGNoUGFyYW1zKVxuICAgID8gbWFrZU5ldHdvcmtFcnJvcihPYmplY3QuYXNzaWduKG5ldyBET01FeGNlcHRpb24oJ1RoZSBvcGVyYXRpb24gd2FzIGFib3J0ZWQuJywgJ0Fib3J0RXJyb3InKSwgeyBjYXVzZTogZXJyIH0pKVxuICAgIDogbWFrZU5ldHdvcmtFcnJvcihPYmplY3QuYXNzaWduKG5ldyBET01FeGNlcHRpb24oJ1JlcXVlc3Qgd2FzIGNhbmNlbGxlZC4nKSwgeyBjYXVzZTogZXJyIH0pKVxufVxuXG4vLyBodHRwczovL3doYXRwci5vcmcvZmV0Y2gvMTM5Mi5odG1sI2luaXRpYWxpemUtYS1yZXNwb25zZVxuZnVuY3Rpb24gaW5pdGlhbGl6ZVJlc3BvbnNlIChyZXNwb25zZSwgaW5pdCwgYm9keSkge1xuICAvLyAxLiBJZiBpbml0W1wic3RhdHVzXCJdIGlzIG5vdCBpbiB0aGUgcmFuZ2UgMjAwIHRvIDU5OSwgaW5jbHVzaXZlLCB0aGVuXG4gIC8vICAgIHRocm93IGEgUmFuZ2VFcnJvci5cbiAgaWYgKGluaXQuc3RhdHVzICE9PSBudWxsICYmIChpbml0LnN0YXR1cyA8IDIwMCB8fCBpbml0LnN0YXR1cyA+IDU5OSkpIHtcbiAgICB0aHJvdyBuZXcgUmFuZ2VFcnJvcignaW5pdFtcInN0YXR1c1wiXSBtdXN0IGJlIGluIHRoZSByYW5nZSBvZiAyMDAgdG8gNTk5LCBpbmNsdXNpdmUuJylcbiAgfVxuXG4gIC8vIDIuIElmIGluaXRbXCJzdGF0dXNUZXh0XCJdIGRvZXMgbm90IG1hdGNoIHRoZSByZWFzb24tcGhyYXNlIHRva2VuIHByb2R1Y3Rpb24sXG4gIC8vICAgIHRoZW4gdGhyb3cgYSBUeXBlRXJyb3IuXG4gIGlmICgnc3RhdHVzVGV4dCcgaW4gaW5pdCAmJiBpbml0LnN0YXR1c1RleHQgIT0gbnVsbCkge1xuICAgIC8vIFNlZSwgaHR0cHM6Ly9kYXRhdHJhY2tlci5pZXRmLm9yZy9kb2MvaHRtbC9yZmM3MjMwI3NlY3Rpb24tMy4xLjI6XG4gICAgLy8gICByZWFzb24tcGhyYXNlICA9ICooIEhUQUIgLyBTUCAvIFZDSEFSIC8gb2JzLXRleHQgKVxuICAgIGlmICghaXNWYWxpZFJlYXNvblBocmFzZShTdHJpbmcoaW5pdC5zdGF0dXNUZXh0KSkpIHtcbiAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoJ0ludmFsaWQgc3RhdHVzVGV4dCcpXG4gICAgfVxuICB9XG5cbiAgLy8gMy4gU2V0IHJlc3BvbnNl4oCZcyByZXNwb25zZeKAmXMgc3RhdHVzIHRvIGluaXRbXCJzdGF0dXNcIl0uXG4gIGlmICgnc3RhdHVzJyBpbiBpbml0ICYmIGluaXQuc3RhdHVzICE9IG51bGwpIHtcbiAgICByZXNwb25zZVtrU3RhdGVdLnN0YXR1cyA9IGluaXQuc3RhdHVzXG4gIH1cblxuICAvLyA0LiBTZXQgcmVzcG9uc2XigJlzIHJlc3BvbnNl4oCZcyBzdGF0dXMgbWVzc2FnZSB0byBpbml0W1wic3RhdHVzVGV4dFwiXS5cbiAgaWYgKCdzdGF0dXNUZXh0JyBpbiBpbml0ICYmIGluaXQuc3RhdHVzVGV4dCAhPSBudWxsKSB7XG4gICAgcmVzcG9uc2Vba1N0YXRlXS5zdGF0dXNUZXh0ID0gaW5pdC5zdGF0dXNUZXh0XG4gIH1cblxuICAvLyA1LiBJZiBpbml0W1wiaGVhZGVyc1wiXSBleGlzdHMsIHRoZW4gZmlsbCByZXNwb25zZeKAmXMgaGVhZGVycyB3aXRoIGluaXRbXCJoZWFkZXJzXCJdLlxuICBpZiAoJ2hlYWRlcnMnIGluIGluaXQgJiYgaW5pdC5oZWFkZXJzICE9IG51bGwpIHtcbiAgICBmaWxsKHJlc3BvbnNlW2tIZWFkZXJzXSwgaW5pdC5oZWFkZXJzKVxuICB9XG5cbiAgLy8gNi4gSWYgYm9keSB3YXMgZ2l2ZW4sIHRoZW46XG4gIGlmIChib2R5KSB7XG4gICAgLy8gMS4gSWYgcmVzcG9uc2UncyBzdGF0dXMgaXMgYSBudWxsIGJvZHkgc3RhdHVzLCB0aGVuIHRocm93IGEgVHlwZUVycm9yLlxuICAgIGlmIChudWxsQm9keVN0YXR1cy5pbmNsdWRlcyhyZXNwb25zZS5zdGF0dXMpKSB7XG4gICAgICB0aHJvdyB3ZWJpZGwuZXJyb3JzLmV4Y2VwdGlvbih7XG4gICAgICAgIGhlYWRlcjogJ1Jlc3BvbnNlIGNvbnN0cnVjdG9yJyxcbiAgICAgICAgbWVzc2FnZTogJ0ludmFsaWQgcmVzcG9uc2Ugc3RhdHVzIGNvZGUgJyArIHJlc3BvbnNlLnN0YXR1c1xuICAgICAgfSlcbiAgICB9XG5cbiAgICAvLyAyLiBTZXQgcmVzcG9uc2UncyBib2R5IHRvIGJvZHkncyBib2R5LlxuICAgIHJlc3BvbnNlW2tTdGF0ZV0uYm9keSA9IGJvZHkuYm9keVxuXG4gICAgLy8gMy4gSWYgYm9keSdzIHR5cGUgaXMgbm9uLW51bGwgYW5kIHJlc3BvbnNlJ3MgaGVhZGVyIGxpc3QgZG9lcyBub3QgY29udGFpblxuICAgIC8vICAgIGBDb250ZW50LVR5cGVgLCB0aGVuIGFwcGVuZCAoYENvbnRlbnQtVHlwZWAsIGJvZHkncyB0eXBlKSB0byByZXNwb25zZSdzIGhlYWRlciBsaXN0LlxuICAgIGlmIChib2R5LnR5cGUgIT0gbnVsbCAmJiAhcmVzcG9uc2Vba1N0YXRlXS5oZWFkZXJzTGlzdC5jb250YWlucygnQ29udGVudC1UeXBlJykpIHtcbiAgICAgIHJlc3BvbnNlW2tTdGF0ZV0uaGVhZGVyc0xpc3QuYXBwZW5kKCdjb250ZW50LXR5cGUnLCBib2R5LnR5cGUpXG4gICAgfVxuICB9XG59XG5cbndlYmlkbC5jb252ZXJ0ZXJzLlJlYWRhYmxlU3RyZWFtID0gd2ViaWRsLmludGVyZmFjZUNvbnZlcnRlcihcbiAgUmVhZGFibGVTdHJlYW1cbilcblxud2ViaWRsLmNvbnZlcnRlcnMuRm9ybURhdGEgPSB3ZWJpZGwuaW50ZXJmYWNlQ29udmVydGVyKFxuICBGb3JtRGF0YVxuKVxuXG53ZWJpZGwuY29udmVydGVycy5VUkxTZWFyY2hQYXJhbXMgPSB3ZWJpZGwuaW50ZXJmYWNlQ29udmVydGVyKFxuICBVUkxTZWFyY2hQYXJhbXNcbilcblxuLy8gaHR0cHM6Ly9mZXRjaC5zcGVjLndoYXR3Zy5vcmcvI3R5cGVkZWZkZWYteG1saHR0cHJlcXVlc3Rib2R5aW5pdFxud2ViaWRsLmNvbnZlcnRlcnMuWE1MSHR0cFJlcXVlc3RCb2R5SW5pdCA9IGZ1bmN0aW9uIChWKSB7XG4gIGlmICh0eXBlb2YgViA9PT0gJ3N0cmluZycpIHtcbiAgICByZXR1cm4gd2ViaWRsLmNvbnZlcnRlcnMuVVNWU3RyaW5nKFYpXG4gIH1cblxuICBpZiAoaXNCbG9iTGlrZShWKSkge1xuICAgIHJldHVybiB3ZWJpZGwuY29udmVydGVycy5CbG9iKFYsIHsgc3RyaWN0OiBmYWxzZSB9KVxuICB9XG5cbiAgaWYgKHR5cGVzLmlzQXJyYXlCdWZmZXIoVikgfHwgdHlwZXMuaXNUeXBlZEFycmF5KFYpIHx8IHR5cGVzLmlzRGF0YVZpZXcoVikpIHtcbiAgICByZXR1cm4gd2ViaWRsLmNvbnZlcnRlcnMuQnVmZmVyU291cmNlKFYpXG4gIH1cblxuICBpZiAodXRpbC5pc0Zvcm1EYXRhTGlrZShWKSkge1xuICAgIHJldHVybiB3ZWJpZGwuY29udmVydGVycy5Gb3JtRGF0YShWLCB7IHN0cmljdDogZmFsc2UgfSlcbiAgfVxuXG4gIGlmIChWIGluc3RhbmNlb2YgVVJMU2VhcmNoUGFyYW1zKSB7XG4gICAgcmV0dXJuIHdlYmlkbC5jb252ZXJ0ZXJzLlVSTFNlYXJjaFBhcmFtcyhWKVxuICB9XG5cbiAgcmV0dXJuIHdlYmlkbC5jb252ZXJ0ZXJzLkRPTVN0cmluZyhWKVxufVxuXG4vLyBodHRwczovL2ZldGNoLnNwZWMud2hhdHdnLm9yZy8jYm9keWluaXRcbndlYmlkbC5jb252ZXJ0ZXJzLkJvZHlJbml0ID0gZnVuY3Rpb24gKFYpIHtcbiAgaWYgKFYgaW5zdGFuY2VvZiBSZWFkYWJsZVN0cmVhbSkge1xuICAgIHJldHVybiB3ZWJpZGwuY29udmVydGVycy5SZWFkYWJsZVN0cmVhbShWKVxuICB9XG5cbiAgLy8gTm90ZTogdGhlIHNwZWMgZG9lc24ndCBpbmNsdWRlIGFzeW5jIGl0ZXJhYmxlcyxcbiAgLy8gdGhpcyBpcyBhbiB1bmRpY2kgZXh0ZW5zaW9uLlxuICBpZiAoVj8uW1N5bWJvbC5hc3luY0l0ZXJhdG9yXSkge1xuICAgIHJldHVybiBWXG4gIH1cblxuICByZXR1cm4gd2ViaWRsLmNvbnZlcnRlcnMuWE1MSHR0cFJlcXVlc3RCb2R5SW5pdChWKVxufVxuXG53ZWJpZGwuY29udmVydGVycy5SZXNwb25zZUluaXQgPSB3ZWJpZGwuZGljdGlvbmFyeUNvbnZlcnRlcihbXG4gIHtcbiAgICBrZXk6ICdzdGF0dXMnLFxuICAgIGNvbnZlcnRlcjogd2ViaWRsLmNvbnZlcnRlcnNbJ3Vuc2lnbmVkIHNob3J0J10sXG4gICAgZGVmYXVsdFZhbHVlOiAyMDBcbiAgfSxcbiAge1xuICAgIGtleTogJ3N0YXR1c1RleHQnLFxuICAgIGNvbnZlcnRlcjogd2ViaWRsLmNvbnZlcnRlcnMuQnl0ZVN0cmluZyxcbiAgICBkZWZhdWx0VmFsdWU6ICcnXG4gIH0sXG4gIHtcbiAgICBrZXk6ICdoZWFkZXJzJyxcbiAgICBjb252ZXJ0ZXI6IHdlYmlkbC5jb252ZXJ0ZXJzLkhlYWRlcnNJbml0XG4gIH1cbl0pXG5cbm1vZHVsZS5leHBvcnRzID0ge1xuICBtYWtlTmV0d29ya0Vycm9yLFxuICBtYWtlUmVzcG9uc2UsXG4gIG1ha2VBcHByb3ByaWF0ZU5ldHdvcmtFcnJvcixcbiAgZmlsdGVyUmVzcG9uc2UsXG4gIFJlc3BvbnNlLFxuICBjbG9uZVJlc3BvbnNlXG59XG4iLAogICAgIi8qIGdsb2JhbHMgQWJvcnRDb250cm9sbGVyICovXG5cbid1c2Ugc3RyaWN0J1xuXG5jb25zdCB7IGV4dHJhY3RCb2R5LCBtaXhpbkJvZHksIGNsb25lQm9keSB9ID0gcmVxdWlyZSgnLi9ib2R5JylcbmNvbnN0IHsgSGVhZGVycywgZmlsbDogZmlsbEhlYWRlcnMsIEhlYWRlcnNMaXN0IH0gPSByZXF1aXJlKCcuL2hlYWRlcnMnKVxuY29uc3QgeyBGaW5hbGl6YXRpb25SZWdpc3RyeSB9ID0gcmVxdWlyZSgnLi4vY29tcGF0L2Rpc3BhdGNoZXItd2Vha3JlZicpKClcbmNvbnN0IHV0aWwgPSByZXF1aXJlKCcuLi9jb3JlL3V0aWwnKVxuY29uc3Qge1xuICBpc1ZhbGlkSFRUUFRva2VuLFxuICBzYW1lT3JpZ2luLFxuICBub3JtYWxpemVNZXRob2QsXG4gIG1ha2VQb2xpY3lDb250YWluZXIsXG4gIG5vcm1hbGl6ZU1ldGhvZFJlY29yZFxufSA9IHJlcXVpcmUoJy4vdXRpbCcpXG5jb25zdCB7XG4gIGZvcmJpZGRlbk1ldGhvZHNTZXQsXG4gIGNvcnNTYWZlTGlzdGVkTWV0aG9kc1NldCxcbiAgcmVmZXJyZXJQb2xpY3ksXG4gIHJlcXVlc3RSZWRpcmVjdCxcbiAgcmVxdWVzdE1vZGUsXG4gIHJlcXVlc3RDcmVkZW50aWFscyxcbiAgcmVxdWVzdENhY2hlLFxuICByZXF1ZXN0RHVwbGV4XG59ID0gcmVxdWlyZSgnLi9jb25zdGFudHMnKVxuY29uc3QgeyBrRW51bWVyYWJsZVByb3BlcnR5IH0gPSB1dGlsXG5jb25zdCB7IGtIZWFkZXJzLCBrU2lnbmFsLCBrU3RhdGUsIGtHdWFyZCwga1JlYWxtIH0gPSByZXF1aXJlKCcuL3N5bWJvbHMnKVxuY29uc3QgeyB3ZWJpZGwgfSA9IHJlcXVpcmUoJy4vd2ViaWRsJylcbmNvbnN0IHsgZ2V0R2xvYmFsT3JpZ2luIH0gPSByZXF1aXJlKCcuL2dsb2JhbCcpXG5jb25zdCB7IFVSTFNlcmlhbGl6ZXIgfSA9IHJlcXVpcmUoJy4vZGF0YVVSTCcpXG5jb25zdCB7IGtIZWFkZXJzTGlzdCwga0NvbnN0cnVjdCB9ID0gcmVxdWlyZSgnLi4vY29yZS9zeW1ib2xzJylcbmNvbnN0IGFzc2VydCA9IHJlcXVpcmUoJ2Fzc2VydCcpXG5jb25zdCB7IGdldE1heExpc3RlbmVycywgc2V0TWF4TGlzdGVuZXJzLCBnZXRFdmVudExpc3RlbmVycywgZGVmYXVsdE1heExpc3RlbmVycyB9ID0gcmVxdWlyZSgnZXZlbnRzJylcblxubGV0IFRyYW5zZm9ybVN0cmVhbSA9IGdsb2JhbFRoaXMuVHJhbnNmb3JtU3RyZWFtXG5cbmNvbnN0IGtBYm9ydENvbnRyb2xsZXIgPSBTeW1ib2woJ2Fib3J0Q29udHJvbGxlcicpXG5cbmNvbnN0IHJlcXVlc3RGaW5hbGl6ZXIgPSBuZXcgRmluYWxpemF0aW9uUmVnaXN0cnkoKHsgc2lnbmFsLCBhYm9ydCB9KSA9PiB7XG4gIHNpZ25hbC5yZW1vdmVFdmVudExpc3RlbmVyKCdhYm9ydCcsIGFib3J0KVxufSlcblxuLy8gaHR0cHM6Ly9mZXRjaC5zcGVjLndoYXR3Zy5vcmcvI3JlcXVlc3QtY2xhc3NcbmNsYXNzIFJlcXVlc3Qge1xuICAvLyBodHRwczovL2ZldGNoLnNwZWMud2hhdHdnLm9yZy8jZG9tLXJlcXVlc3RcbiAgY29uc3RydWN0b3IgKGlucHV0LCBpbml0ID0ge30pIHtcbiAgICBpZiAoaW5wdXQgPT09IGtDb25zdHJ1Y3QpIHtcbiAgICAgIHJldHVyblxuICAgIH1cblxuICAgIHdlYmlkbC5hcmd1bWVudExlbmd0aENoZWNrKGFyZ3VtZW50cywgMSwgeyBoZWFkZXI6ICdSZXF1ZXN0IGNvbnN0cnVjdG9yJyB9KVxuXG4gICAgaW5wdXQgPSB3ZWJpZGwuY29udmVydGVycy5SZXF1ZXN0SW5mbyhpbnB1dClcbiAgICBpbml0ID0gd2ViaWRsLmNvbnZlcnRlcnMuUmVxdWVzdEluaXQoaW5pdClcblxuICAgIC8vIGh0dHBzOi8vaHRtbC5zcGVjLndoYXR3Zy5vcmcvbXVsdGlwYWdlL3dlYmFwcGFwaXMuaHRtbCNlbnZpcm9ubWVudC1zZXR0aW5ncy1vYmplY3RcbiAgICB0aGlzW2tSZWFsbV0gPSB7XG4gICAgICBzZXR0aW5nc09iamVjdDoge1xuICAgICAgICBiYXNlVXJsOiBnZXRHbG9iYWxPcmlnaW4oKSxcbiAgICAgICAgZ2V0IG9yaWdpbiAoKSB7XG4gICAgICAgICAgcmV0dXJuIHRoaXMuYmFzZVVybD8ub3JpZ2luXG4gICAgICAgIH0sXG4gICAgICAgIHBvbGljeUNvbnRhaW5lcjogbWFrZVBvbGljeUNvbnRhaW5lcigpXG4gICAgICB9XG4gICAgfVxuXG4gICAgLy8gMS4gTGV0IHJlcXVlc3QgYmUgbnVsbC5cbiAgICBsZXQgcmVxdWVzdCA9IG51bGxcblxuICAgIC8vIDIuIExldCBmYWxsYmFja01vZGUgYmUgbnVsbC5cbiAgICBsZXQgZmFsbGJhY2tNb2RlID0gbnVsbFxuXG4gICAgLy8gMy4gTGV0IGJhc2VVUkwgYmUgdGhpc+KAmXMgcmVsZXZhbnQgc2V0dGluZ3Mgb2JqZWN04oCZcyBBUEkgYmFzZSBVUkwuXG4gICAgY29uc3QgYmFzZVVybCA9IHRoaXNba1JlYWxtXS5zZXR0aW5nc09iamVjdC5iYXNlVXJsXG5cbiAgICAvLyA0LiBMZXQgc2lnbmFsIGJlIG51bGwuXG4gICAgbGV0IHNpZ25hbCA9IG51bGxcblxuICAgIC8vIDUuIElmIGlucHV0IGlzIGEgc3RyaW5nLCB0aGVuOlxuICAgIGlmICh0eXBlb2YgaW5wdXQgPT09ICdzdHJpbmcnKSB7XG4gICAgICAvLyAxLiBMZXQgcGFyc2VkVVJMIGJlIHRoZSByZXN1bHQgb2YgcGFyc2luZyBpbnB1dCB3aXRoIGJhc2VVUkwuXG4gICAgICAvLyAyLiBJZiBwYXJzZWRVUkwgaXMgZmFpbHVyZSwgdGhlbiB0aHJvdyBhIFR5cGVFcnJvci5cbiAgICAgIGxldCBwYXJzZWRVUkxcbiAgICAgIHRyeSB7XG4gICAgICAgIHBhcnNlZFVSTCA9IG5ldyBVUkwoaW5wdXQsIGJhc2VVcmwpXG4gICAgICB9IGNhdGNoIChlcnIpIHtcbiAgICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcignRmFpbGVkIHRvIHBhcnNlIFVSTCBmcm9tICcgKyBpbnB1dCwgeyBjYXVzZTogZXJyIH0pXG4gICAgICB9XG5cbiAgICAgIC8vIDMuIElmIHBhcnNlZFVSTCBpbmNsdWRlcyBjcmVkZW50aWFscywgdGhlbiB0aHJvdyBhIFR5cGVFcnJvci5cbiAgICAgIGlmIChwYXJzZWRVUkwudXNlcm5hbWUgfHwgcGFyc2VkVVJMLnBhc3N3b3JkKSB7XG4gICAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoXG4gICAgICAgICAgJ1JlcXVlc3QgY2Fubm90IGJlIGNvbnN0cnVjdGVkIGZyb20gYSBVUkwgdGhhdCBpbmNsdWRlcyBjcmVkZW50aWFsczogJyArXG4gICAgICAgICAgICBpbnB1dFxuICAgICAgICApXG4gICAgICB9XG5cbiAgICAgIC8vIDQuIFNldCByZXF1ZXN0IHRvIGEgbmV3IHJlcXVlc3Qgd2hvc2UgVVJMIGlzIHBhcnNlZFVSTC5cbiAgICAgIHJlcXVlc3QgPSBtYWtlUmVxdWVzdCh7IHVybExpc3Q6IFtwYXJzZWRVUkxdIH0pXG5cbiAgICAgIC8vIDUuIFNldCBmYWxsYmFja01vZGUgdG8gXCJjb3JzXCIuXG4gICAgICBmYWxsYmFja01vZGUgPSAnY29ycydcbiAgICB9IGVsc2Uge1xuICAgICAgLy8gNi4gT3RoZXJ3aXNlOlxuXG4gICAgICAvLyA3LiBBc3NlcnQ6IGlucHV0IGlzIGEgUmVxdWVzdCBvYmplY3QuXG4gICAgICBhc3NlcnQoaW5wdXQgaW5zdGFuY2VvZiBSZXF1ZXN0KVxuXG4gICAgICAvLyA4LiBTZXQgcmVxdWVzdCB0byBpbnB1dOKAmXMgcmVxdWVzdC5cbiAgICAgIHJlcXVlc3QgPSBpbnB1dFtrU3RhdGVdXG5cbiAgICAgIC8vIDkuIFNldCBzaWduYWwgdG8gaW5wdXTigJlzIHNpZ25hbC5cbiAgICAgIHNpZ25hbCA9IGlucHV0W2tTaWduYWxdXG4gICAgfVxuXG4gICAgLy8gNy4gTGV0IG9yaWdpbiBiZSB0aGlz4oCZcyByZWxldmFudCBzZXR0aW5ncyBvYmplY3TigJlzIG9yaWdpbi5cbiAgICBjb25zdCBvcmlnaW4gPSB0aGlzW2tSZWFsbV0uc2V0dGluZ3NPYmplY3Qub3JpZ2luXG5cbiAgICAvLyA4LiBMZXQgd2luZG93IGJlIFwiY2xpZW50XCIuXG4gICAgbGV0IHdpbmRvdyA9ICdjbGllbnQnXG5cbiAgICAvLyA5LiBJZiByZXF1ZXN04oCZcyB3aW5kb3cgaXMgYW4gZW52aXJvbm1lbnQgc2V0dGluZ3Mgb2JqZWN0IGFuZCBpdHMgb3JpZ2luXG4gICAgLy8gaXMgc2FtZSBvcmlnaW4gd2l0aCBvcmlnaW4sIHRoZW4gc2V0IHdpbmRvdyB0byByZXF1ZXN04oCZcyB3aW5kb3cuXG4gICAgaWYgKFxuICAgICAgcmVxdWVzdC53aW5kb3c/LmNvbnN0cnVjdG9yPy5uYW1lID09PSAnRW52aXJvbm1lbnRTZXR0aW5nc09iamVjdCcgJiZcbiAgICAgIHNhbWVPcmlnaW4ocmVxdWVzdC53aW5kb3csIG9yaWdpbilcbiAgICApIHtcbiAgICAgIHdpbmRvdyA9IHJlcXVlc3Qud2luZG93XG4gICAgfVxuXG4gICAgLy8gMTAuIElmIGluaXRbXCJ3aW5kb3dcIl0gZXhpc3RzIGFuZCBpcyBub24tbnVsbCwgdGhlbiB0aHJvdyBhIFR5cGVFcnJvci5cbiAgICBpZiAoaW5pdC53aW5kb3cgIT0gbnVsbCkge1xuICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcihgJ3dpbmRvdycgb3B0aW9uICcke3dpbmRvd30nIG11c3QgYmUgbnVsbGApXG4gICAgfVxuXG4gICAgLy8gMTEuIElmIGluaXRbXCJ3aW5kb3dcIl0gZXhpc3RzLCB0aGVuIHNldCB3aW5kb3cgdG8gXCJuby13aW5kb3dcIi5cbiAgICBpZiAoJ3dpbmRvdycgaW4gaW5pdCkge1xuICAgICAgd2luZG93ID0gJ25vLXdpbmRvdydcbiAgICB9XG5cbiAgICAvLyAxMi4gU2V0IHJlcXVlc3QgdG8gYSBuZXcgcmVxdWVzdCB3aXRoIHRoZSBmb2xsb3dpbmcgcHJvcGVydGllczpcbiAgICByZXF1ZXN0ID0gbWFrZVJlcXVlc3Qoe1xuICAgICAgLy8gVVJMIHJlcXVlc3TigJlzIFVSTC5cbiAgICAgIC8vIHVuZGljaSBpbXBsZW1lbnRhdGlvbiBub3RlOiB0aGlzIGlzIHNldCBhcyB0aGUgZmlyc3QgaXRlbSBpbiByZXF1ZXN0J3MgdXJsTGlzdCBpbiBtYWtlUmVxdWVzdFxuICAgICAgLy8gbWV0aG9kIHJlcXVlc3TigJlzIG1ldGhvZC5cbiAgICAgIG1ldGhvZDogcmVxdWVzdC5tZXRob2QsXG4gICAgICAvLyBoZWFkZXIgbGlzdCBBIGNvcHkgb2YgcmVxdWVzdOKAmXMgaGVhZGVyIGxpc3QuXG4gICAgICAvLyB1bmRpY2kgaW1wbGVtZW50YXRpb24gbm90ZTogaGVhZGVyc0xpc3QgaXMgY2xvbmVkIGluIG1ha2VSZXF1ZXN0XG4gICAgICBoZWFkZXJzTGlzdDogcmVxdWVzdC5oZWFkZXJzTGlzdCxcbiAgICAgIC8vIHVuc2FmZS1yZXF1ZXN0IGZsYWcgU2V0LlxuICAgICAgdW5zYWZlUmVxdWVzdDogcmVxdWVzdC51bnNhZmVSZXF1ZXN0LFxuICAgICAgLy8gY2xpZW50IFRoaXPigJlzIHJlbGV2YW50IHNldHRpbmdzIG9iamVjdC5cbiAgICAgIGNsaWVudDogdGhpc1trUmVhbG1dLnNldHRpbmdzT2JqZWN0LFxuICAgICAgLy8gd2luZG93IHdpbmRvdy5cbiAgICAgIHdpbmRvdyxcbiAgICAgIC8vIHByaW9yaXR5IHJlcXVlc3TigJlzIHByaW9yaXR5LlxuICAgICAgcHJpb3JpdHk6IHJlcXVlc3QucHJpb3JpdHksXG4gICAgICAvLyBvcmlnaW4gcmVxdWVzdOKAmXMgb3JpZ2luLiBUaGUgcHJvcGFnYXRpb24gb2YgdGhlIG9yaWdpbiBpcyBvbmx5IHNpZ25pZmljYW50IGZvciBuYXZpZ2F0aW9uIHJlcXVlc3RzXG4gICAgICAvLyBiZWluZyBoYW5kbGVkIGJ5IGEgc2VydmljZSB3b3JrZXIuIEluIHRoaXMgc2NlbmFyaW8gYSByZXF1ZXN0IGNhbiBoYXZlIGFuIG9yaWdpbiB0aGF0IGlzIGRpZmZlcmVudFxuICAgICAgLy8gZnJvbSB0aGUgY3VycmVudCBjbGllbnQuXG4gICAgICBvcmlnaW46IHJlcXVlc3Qub3JpZ2luLFxuICAgICAgLy8gcmVmZXJyZXIgcmVxdWVzdOKAmXMgcmVmZXJyZXIuXG4gICAgICByZWZlcnJlcjogcmVxdWVzdC5yZWZlcnJlcixcbiAgICAgIC8vIHJlZmVycmVyIHBvbGljeSByZXF1ZXN04oCZcyByZWZlcnJlciBwb2xpY3kuXG4gICAgICByZWZlcnJlclBvbGljeTogcmVxdWVzdC5yZWZlcnJlclBvbGljeSxcbiAgICAgIC8vIG1vZGUgcmVxdWVzdOKAmXMgbW9kZS5cbiAgICAgIG1vZGU6IHJlcXVlc3QubW9kZSxcbiAgICAgIC8vIGNyZWRlbnRpYWxzIG1vZGUgcmVxdWVzdOKAmXMgY3JlZGVudGlhbHMgbW9kZS5cbiAgICAgIGNyZWRlbnRpYWxzOiByZXF1ZXN0LmNyZWRlbnRpYWxzLFxuICAgICAgLy8gY2FjaGUgbW9kZSByZXF1ZXN04oCZcyBjYWNoZSBtb2RlLlxuICAgICAgY2FjaGU6IHJlcXVlc3QuY2FjaGUsXG4gICAgICAvLyByZWRpcmVjdCBtb2RlIHJlcXVlc3TigJlzIHJlZGlyZWN0IG1vZGUuXG4gICAgICByZWRpcmVjdDogcmVxdWVzdC5yZWRpcmVjdCxcbiAgICAgIC8vIGludGVncml0eSBtZXRhZGF0YSByZXF1ZXN04oCZcyBpbnRlZ3JpdHkgbWV0YWRhdGEuXG4gICAgICBpbnRlZ3JpdHk6IHJlcXVlc3QuaW50ZWdyaXR5LFxuICAgICAgLy8ga2VlcGFsaXZlIHJlcXVlc3TigJlzIGtlZXBhbGl2ZS5cbiAgICAgIGtlZXBhbGl2ZTogcmVxdWVzdC5rZWVwYWxpdmUsXG4gICAgICAvLyByZWxvYWQtbmF2aWdhdGlvbiBmbGFnIHJlcXVlc3TigJlzIHJlbG9hZC1uYXZpZ2F0aW9uIGZsYWcuXG4gICAgICByZWxvYWROYXZpZ2F0aW9uOiByZXF1ZXN0LnJlbG9hZE5hdmlnYXRpb24sXG4gICAgICAvLyBoaXN0b3J5LW5hdmlnYXRpb24gZmxhZyByZXF1ZXN04oCZcyBoaXN0b3J5LW5hdmlnYXRpb24gZmxhZy5cbiAgICAgIGhpc3RvcnlOYXZpZ2F0aW9uOiByZXF1ZXN0Lmhpc3RvcnlOYXZpZ2F0aW9uLFxuICAgICAgLy8gVVJMIGxpc3QgQSBjbG9uZSBvZiByZXF1ZXN04oCZcyBVUkwgbGlzdC5cbiAgICAgIHVybExpc3Q6IFsuLi5yZXF1ZXN0LnVybExpc3RdXG4gICAgfSlcblxuICAgIGNvbnN0IGluaXRIYXNLZXkgPSBPYmplY3Qua2V5cyhpbml0KS5sZW5ndGggIT09IDBcblxuICAgIC8vIDEzLiBJZiBpbml0IGlzIG5vdCBlbXB0eSwgdGhlbjpcbiAgICBpZiAoaW5pdEhhc0tleSkge1xuICAgICAgLy8gMS4gSWYgcmVxdWVzdOKAmXMgbW9kZSBpcyBcIm5hdmlnYXRlXCIsIHRoZW4gc2V0IGl0IHRvIFwic2FtZS1vcmlnaW5cIi5cbiAgICAgIGlmIChyZXF1ZXN0Lm1vZGUgPT09ICduYXZpZ2F0ZScpIHtcbiAgICAgICAgcmVxdWVzdC5tb2RlID0gJ3NhbWUtb3JpZ2luJ1xuICAgICAgfVxuXG4gICAgICAvLyAyLiBVbnNldCByZXF1ZXN04oCZcyByZWxvYWQtbmF2aWdhdGlvbiBmbGFnLlxuICAgICAgcmVxdWVzdC5yZWxvYWROYXZpZ2F0aW9uID0gZmFsc2VcblxuICAgICAgLy8gMy4gVW5zZXQgcmVxdWVzdOKAmXMgaGlzdG9yeS1uYXZpZ2F0aW9uIGZsYWcuXG4gICAgICByZXF1ZXN0Lmhpc3RvcnlOYXZpZ2F0aW9uID0gZmFsc2VcblxuICAgICAgLy8gNC4gU2V0IHJlcXVlc3TigJlzIG9yaWdpbiB0byBcImNsaWVudFwiLlxuICAgICAgcmVxdWVzdC5vcmlnaW4gPSAnY2xpZW50J1xuXG4gICAgICAvLyA1LiBTZXQgcmVxdWVzdOKAmXMgcmVmZXJyZXIgdG8gXCJjbGllbnRcIlxuICAgICAgcmVxdWVzdC5yZWZlcnJlciA9ICdjbGllbnQnXG5cbiAgICAgIC8vIDYuIFNldCByZXF1ZXN04oCZcyByZWZlcnJlciBwb2xpY3kgdG8gdGhlIGVtcHR5IHN0cmluZy5cbiAgICAgIHJlcXVlc3QucmVmZXJyZXJQb2xpY3kgPSAnJ1xuXG4gICAgICAvLyA3LiBTZXQgcmVxdWVzdOKAmXMgVVJMIHRvIHJlcXVlc3TigJlzIGN1cnJlbnQgVVJMLlxuICAgICAgcmVxdWVzdC51cmwgPSByZXF1ZXN0LnVybExpc3RbcmVxdWVzdC51cmxMaXN0Lmxlbmd0aCAtIDFdXG5cbiAgICAgIC8vIDguIFNldCByZXF1ZXN04oCZcyBVUkwgbGlzdCB0byDCqyByZXF1ZXN04oCZcyBVUkwgwrsuXG4gICAgICByZXF1ZXN0LnVybExpc3QgPSBbcmVxdWVzdC51cmxdXG4gICAgfVxuXG4gICAgLy8gMTQuIElmIGluaXRbXCJyZWZlcnJlclwiXSBleGlzdHMsIHRoZW46XG4gICAgaWYgKGluaXQucmVmZXJyZXIgIT09IHVuZGVmaW5lZCkge1xuICAgICAgLy8gMS4gTGV0IHJlZmVycmVyIGJlIGluaXRbXCJyZWZlcnJlclwiXS5cbiAgICAgIGNvbnN0IHJlZmVycmVyID0gaW5pdC5yZWZlcnJlclxuXG4gICAgICAvLyAyLiBJZiByZWZlcnJlciBpcyB0aGUgZW1wdHkgc3RyaW5nLCB0aGVuIHNldCByZXF1ZXN04oCZcyByZWZlcnJlciB0byBcIm5vLXJlZmVycmVyXCIuXG4gICAgICBpZiAocmVmZXJyZXIgPT09ICcnKSB7XG4gICAgICAgIHJlcXVlc3QucmVmZXJyZXIgPSAnbm8tcmVmZXJyZXInXG4gICAgICB9IGVsc2Uge1xuICAgICAgICAvLyAxLiBMZXQgcGFyc2VkUmVmZXJyZXIgYmUgdGhlIHJlc3VsdCBvZiBwYXJzaW5nIHJlZmVycmVyIHdpdGhcbiAgICAgICAgLy8gYmFzZVVSTC5cbiAgICAgICAgLy8gMi4gSWYgcGFyc2VkUmVmZXJyZXIgaXMgZmFpbHVyZSwgdGhlbiB0aHJvdyBhIFR5cGVFcnJvci5cbiAgICAgICAgbGV0IHBhcnNlZFJlZmVycmVyXG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgcGFyc2VkUmVmZXJyZXIgPSBuZXcgVVJMKHJlZmVycmVyLCBiYXNlVXJsKVxuICAgICAgICB9IGNhdGNoIChlcnIpIHtcbiAgICAgICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKGBSZWZlcnJlciBcIiR7cmVmZXJyZXJ9XCIgaXMgbm90IGEgdmFsaWQgVVJMLmAsIHsgY2F1c2U6IGVyciB9KVxuICAgICAgICB9XG5cbiAgICAgICAgLy8gMy4gSWYgb25lIG9mIHRoZSBmb2xsb3dpbmcgaXMgdHJ1ZVxuICAgICAgICAvLyAtIHBhcnNlZFJlZmVycmVy4oCZcyBzY2hlbWUgaXMgXCJhYm91dFwiIGFuZCBwYXRoIGlzIHRoZSBzdHJpbmcgXCJjbGllbnRcIlxuICAgICAgICAvLyAtIHBhcnNlZFJlZmVycmVy4oCZcyBvcmlnaW4gaXMgbm90IHNhbWUgb3JpZ2luIHdpdGggb3JpZ2luXG4gICAgICAgIC8vIHRoZW4gc2V0IHJlcXVlc3TigJlzIHJlZmVycmVyIHRvIFwiY2xpZW50XCIuXG4gICAgICAgIGlmIChcbiAgICAgICAgICAocGFyc2VkUmVmZXJyZXIucHJvdG9jb2wgPT09ICdhYm91dDonICYmIHBhcnNlZFJlZmVycmVyLmhvc3RuYW1lID09PSAnY2xpZW50JykgfHxcbiAgICAgICAgICAob3JpZ2luICYmICFzYW1lT3JpZ2luKHBhcnNlZFJlZmVycmVyLCB0aGlzW2tSZWFsbV0uc2V0dGluZ3NPYmplY3QuYmFzZVVybCkpXG4gICAgICAgICkge1xuICAgICAgICAgIHJlcXVlc3QucmVmZXJyZXIgPSAnY2xpZW50J1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIC8vIDQuIE90aGVyd2lzZSwgc2V0IHJlcXVlc3TigJlzIHJlZmVycmVyIHRvIHBhcnNlZFJlZmVycmVyLlxuICAgICAgICAgIHJlcXVlc3QucmVmZXJyZXIgPSBwYXJzZWRSZWZlcnJlclxuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuXG4gICAgLy8gMTUuIElmIGluaXRbXCJyZWZlcnJlclBvbGljeVwiXSBleGlzdHMsIHRoZW4gc2V0IHJlcXVlc3TigJlzIHJlZmVycmVyIHBvbGljeVxuICAgIC8vIHRvIGl0LlxuICAgIGlmIChpbml0LnJlZmVycmVyUG9saWN5ICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIHJlcXVlc3QucmVmZXJyZXJQb2xpY3kgPSBpbml0LnJlZmVycmVyUG9saWN5XG4gICAgfVxuXG4gICAgLy8gMTYuIExldCBtb2RlIGJlIGluaXRbXCJtb2RlXCJdIGlmIGl0IGV4aXN0cywgYW5kIGZhbGxiYWNrTW9kZSBvdGhlcndpc2UuXG4gICAgbGV0IG1vZGVcbiAgICBpZiAoaW5pdC5tb2RlICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIG1vZGUgPSBpbml0Lm1vZGVcbiAgICB9IGVsc2Uge1xuICAgICAgbW9kZSA9IGZhbGxiYWNrTW9kZVxuICAgIH1cblxuICAgIC8vIDE3LiBJZiBtb2RlIGlzIFwibmF2aWdhdGVcIiwgdGhlbiB0aHJvdyBhIFR5cGVFcnJvci5cbiAgICBpZiAobW9kZSA9PT0gJ25hdmlnYXRlJykge1xuICAgICAgdGhyb3cgd2ViaWRsLmVycm9ycy5leGNlcHRpb24oe1xuICAgICAgICBoZWFkZXI6ICdSZXF1ZXN0IGNvbnN0cnVjdG9yJyxcbiAgICAgICAgbWVzc2FnZTogJ2ludmFsaWQgcmVxdWVzdCBtb2RlIG5hdmlnYXRlLidcbiAgICAgIH0pXG4gICAgfVxuXG4gICAgLy8gMTguIElmIG1vZGUgaXMgbm9uLW51bGwsIHNldCByZXF1ZXN04oCZcyBtb2RlIHRvIG1vZGUuXG4gICAgaWYgKG1vZGUgIT0gbnVsbCkge1xuICAgICAgcmVxdWVzdC5tb2RlID0gbW9kZVxuICAgIH1cblxuICAgIC8vIDE5LiBJZiBpbml0W1wiY3JlZGVudGlhbHNcIl0gZXhpc3RzLCB0aGVuIHNldCByZXF1ZXN04oCZcyBjcmVkZW50aWFscyBtb2RlXG4gICAgLy8gdG8gaXQuXG4gICAgaWYgKGluaXQuY3JlZGVudGlhbHMgIT09IHVuZGVmaW5lZCkge1xuICAgICAgcmVxdWVzdC5jcmVkZW50aWFscyA9IGluaXQuY3JlZGVudGlhbHNcbiAgICB9XG5cbiAgICAvLyAxOC4gSWYgaW5pdFtcImNhY2hlXCJdIGV4aXN0cywgdGhlbiBzZXQgcmVxdWVzdOKAmXMgY2FjaGUgbW9kZSB0byBpdC5cbiAgICBpZiAoaW5pdC5jYWNoZSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICByZXF1ZXN0LmNhY2hlID0gaW5pdC5jYWNoZVxuICAgIH1cblxuICAgIC8vIDIxLiBJZiByZXF1ZXN04oCZcyBjYWNoZSBtb2RlIGlzIFwib25seS1pZi1jYWNoZWRcIiBhbmQgcmVxdWVzdOKAmXMgbW9kZSBpc1xuICAgIC8vIG5vdCBcInNhbWUtb3JpZ2luXCIsIHRoZW4gdGhyb3cgYSBUeXBlRXJyb3IuXG4gICAgaWYgKHJlcXVlc3QuY2FjaGUgPT09ICdvbmx5LWlmLWNhY2hlZCcgJiYgcmVxdWVzdC5tb2RlICE9PSAnc2FtZS1vcmlnaW4nKSB7XG4gICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKFxuICAgICAgICBcIidvbmx5LWlmLWNhY2hlZCcgY2FuIGJlIHNldCBvbmx5IHdpdGggJ3NhbWUtb3JpZ2luJyBtb2RlXCJcbiAgICAgIClcbiAgICB9XG5cbiAgICAvLyAyMi4gSWYgaW5pdFtcInJlZGlyZWN0XCJdIGV4aXN0cywgdGhlbiBzZXQgcmVxdWVzdOKAmXMgcmVkaXJlY3QgbW9kZSB0byBpdC5cbiAgICBpZiAoaW5pdC5yZWRpcmVjdCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICByZXF1ZXN0LnJlZGlyZWN0ID0gaW5pdC5yZWRpcmVjdFxuICAgIH1cblxuICAgIC8vIDIzLiBJZiBpbml0W1wiaW50ZWdyaXR5XCJdIGV4aXN0cywgdGhlbiBzZXQgcmVxdWVzdOKAmXMgaW50ZWdyaXR5IG1ldGFkYXRhIHRvIGl0LlxuICAgIGlmIChpbml0LmludGVncml0eSAhPSBudWxsKSB7XG4gICAgICByZXF1ZXN0LmludGVncml0eSA9IFN0cmluZyhpbml0LmludGVncml0eSlcbiAgICB9XG5cbiAgICAvLyAyNC4gSWYgaW5pdFtcImtlZXBhbGl2ZVwiXSBleGlzdHMsIHRoZW4gc2V0IHJlcXVlc3TigJlzIGtlZXBhbGl2ZSB0byBpdC5cbiAgICBpZiAoaW5pdC5rZWVwYWxpdmUgIT09IHVuZGVmaW5lZCkge1xuICAgICAgcmVxdWVzdC5rZWVwYWxpdmUgPSBCb29sZWFuKGluaXQua2VlcGFsaXZlKVxuICAgIH1cblxuICAgIC8vIDI1LiBJZiBpbml0W1wibWV0aG9kXCJdIGV4aXN0cywgdGhlbjpcbiAgICBpZiAoaW5pdC5tZXRob2QgIT09IHVuZGVmaW5lZCkge1xuICAgICAgLy8gMS4gTGV0IG1ldGhvZCBiZSBpbml0W1wibWV0aG9kXCJdLlxuICAgICAgbGV0IG1ldGhvZCA9IGluaXQubWV0aG9kXG5cbiAgICAgIC8vIDIuIElmIG1ldGhvZCBpcyBub3QgYSBtZXRob2Qgb3IgbWV0aG9kIGlzIGEgZm9yYmlkZGVuIG1ldGhvZCwgdGhlblxuICAgICAgLy8gdGhyb3cgYSBUeXBlRXJyb3IuXG4gICAgICBpZiAoIWlzVmFsaWRIVFRQVG9rZW4obWV0aG9kKSkge1xuICAgICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKGAnJHttZXRob2R9JyBpcyBub3QgYSB2YWxpZCBIVFRQIG1ldGhvZC5gKVxuICAgICAgfVxuXG4gICAgICBpZiAoZm9yYmlkZGVuTWV0aG9kc1NldC5oYXMobWV0aG9kLnRvVXBwZXJDYXNlKCkpKSB7XG4gICAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoYCcke21ldGhvZH0nIEhUVFAgbWV0aG9kIGlzIHVuc3VwcG9ydGVkLmApXG4gICAgICB9XG5cbiAgICAgIC8vIDMuIE5vcm1hbGl6ZSBtZXRob2QuXG4gICAgICBtZXRob2QgPSBub3JtYWxpemVNZXRob2RSZWNvcmRbbWV0aG9kXSA/PyBub3JtYWxpemVNZXRob2QobWV0aG9kKVxuXG4gICAgICAvLyA0LiBTZXQgcmVxdWVzdOKAmXMgbWV0aG9kIHRvIG1ldGhvZC5cbiAgICAgIHJlcXVlc3QubWV0aG9kID0gbWV0aG9kXG4gICAgfVxuXG4gICAgLy8gMjYuIElmIGluaXRbXCJzaWduYWxcIl0gZXhpc3RzLCB0aGVuIHNldCBzaWduYWwgdG8gaXQuXG4gICAgaWYgKGluaXQuc2lnbmFsICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIHNpZ25hbCA9IGluaXQuc2lnbmFsXG4gICAgfVxuXG4gICAgLy8gMjcuIFNldCB0aGlz4oCZcyByZXF1ZXN0IHRvIHJlcXVlc3QuXG4gICAgdGhpc1trU3RhdGVdID0gcmVxdWVzdFxuXG4gICAgLy8gMjguIFNldCB0aGlz4oCZcyBzaWduYWwgdG8gYSBuZXcgQWJvcnRTaWduYWwgb2JqZWN0IHdpdGggdGhpc+KAmXMgcmVsZXZhbnRcbiAgICAvLyBSZWFsbS5cbiAgICAvLyBUT0RPOiBjb3VsZCB0aGlzIGJlIHNpbXBsaWZpZWQgd2l0aCBBYm9ydFNpZ25hbC5hbnlcbiAgICAvLyAoaHR0cHM6Ly9kb20uc3BlYy53aGF0d2cub3JnLyNkb20tYWJvcnRzaWduYWwtYW55KVxuICAgIGNvbnN0IGFjID0gbmV3IEFib3J0Q29udHJvbGxlcigpXG4gICAgdGhpc1trU2lnbmFsXSA9IGFjLnNpZ25hbFxuICAgIHRoaXNba1NpZ25hbF1ba1JlYWxtXSA9IHRoaXNba1JlYWxtXVxuXG4gICAgLy8gMjkuIElmIHNpZ25hbCBpcyBub3QgbnVsbCwgdGhlbiBtYWtlIHRoaXPigJlzIHNpZ25hbCBmb2xsb3cgc2lnbmFsLlxuICAgIGlmIChzaWduYWwgIT0gbnVsbCkge1xuICAgICAgaWYgKFxuICAgICAgICAhc2lnbmFsIHx8XG4gICAgICAgIHR5cGVvZiBzaWduYWwuYWJvcnRlZCAhPT0gJ2Jvb2xlYW4nIHx8XG4gICAgICAgIHR5cGVvZiBzaWduYWwuYWRkRXZlbnRMaXN0ZW5lciAhPT0gJ2Z1bmN0aW9uJ1xuICAgICAgKSB7XG4gICAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoXG4gICAgICAgICAgXCJGYWlsZWQgdG8gY29uc3RydWN0ICdSZXF1ZXN0JzogbWVtYmVyIHNpZ25hbCBpcyBub3Qgb2YgdHlwZSBBYm9ydFNpZ25hbC5cIlxuICAgICAgICApXG4gICAgICB9XG5cbiAgICAgIGlmIChzaWduYWwuYWJvcnRlZCkge1xuICAgICAgICBhYy5hYm9ydChzaWduYWwucmVhc29uKVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgLy8gS2VlcCBhIHN0cm9uZyByZWYgdG8gYWMgd2hpbGUgcmVxdWVzdCBvYmplY3RcbiAgICAgICAgLy8gaXMgYWxpdmUuIFRoaXMgaXMgbmVlZGVkIHRvIHByZXZlbnQgQWJvcnRDb250cm9sbGVyXG4gICAgICAgIC8vIGZyb20gYmVpbmcgcHJlbWF0dXJlbHkgZ2FyYmFnZSBjb2xsZWN0ZWQuXG4gICAgICAgIC8vIFNlZSwgaHR0cHM6Ly9naXRodWIuY29tL25vZGVqcy91bmRpY2kvaXNzdWVzLzE5MjYuXG4gICAgICAgIHRoaXNba0Fib3J0Q29udHJvbGxlcl0gPSBhY1xuXG4gICAgICAgIGNvbnN0IGFjUmVmID0gbmV3IFdlYWtSZWYoYWMpXG4gICAgICAgIGNvbnN0IGFib3J0ID0gZnVuY3Rpb24gKCkge1xuICAgICAgICAgIGNvbnN0IGFjID0gYWNSZWYuZGVyZWYoKVxuICAgICAgICAgIGlmIChhYyAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICBhYy5hYm9ydCh0aGlzLnJlYXNvbilcbiAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICAvLyBUaGlyZC1wYXJ0eSBBYm9ydENvbnRyb2xsZXJzIG1heSBub3Qgd29yayB3aXRoIHRoZXNlLlxuICAgICAgICAvLyBTZWUsIGh0dHBzOi8vZ2l0aHViLmNvbS9ub2RlanMvdW5kaWNpL3B1bGwvMTkxMCNpc3N1ZWNvbW1lbnQtMTQ2NDQ5NTYxOS5cbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICAvLyBJZiB0aGUgbWF4IGFtb3VudCBvZiBsaXN0ZW5lcnMgaXMgZXF1YWwgdG8gdGhlIGRlZmF1bHQsIGluY3JlYXNlIGl0XG4gICAgICAgICAgLy8gVGhpcyBpcyBvbmx5IGF2YWlsYWJsZSBpbiBub2RlID49IHYxOS45LjBcbiAgICAgICAgICBpZiAodHlwZW9mIGdldE1heExpc3RlbmVycyA9PT0gJ2Z1bmN0aW9uJyAmJiBnZXRNYXhMaXN0ZW5lcnMoc2lnbmFsKSA9PT0gZGVmYXVsdE1heExpc3RlbmVycykge1xuICAgICAgICAgICAgc2V0TWF4TGlzdGVuZXJzKDEwMCwgc2lnbmFsKVxuICAgICAgICAgIH0gZWxzZSBpZiAoZ2V0RXZlbnRMaXN0ZW5lcnMoc2lnbmFsLCAnYWJvcnQnKS5sZW5ndGggPj0gZGVmYXVsdE1heExpc3RlbmVycykge1xuICAgICAgICAgICAgc2V0TWF4TGlzdGVuZXJzKDEwMCwgc2lnbmFsKVxuICAgICAgICAgIH1cbiAgICAgICAgfSBjYXRjaCB7fVxuXG4gICAgICAgIHV0aWwuYWRkQWJvcnRMaXN0ZW5lcihzaWduYWwsIGFib3J0KVxuICAgICAgICByZXF1ZXN0RmluYWxpemVyLnJlZ2lzdGVyKGFjLCB7IHNpZ25hbCwgYWJvcnQgfSlcbiAgICAgIH1cbiAgICB9XG5cbiAgICAvLyAzMC4gU2V0IHRoaXPigJlzIGhlYWRlcnMgdG8gYSBuZXcgSGVhZGVycyBvYmplY3Qgd2l0aCB0aGlz4oCZcyByZWxldmFudFxuICAgIC8vIFJlYWxtLCB3aG9zZSBoZWFkZXIgbGlzdCBpcyByZXF1ZXN04oCZcyBoZWFkZXIgbGlzdCBhbmQgZ3VhcmQgaXNcbiAgICAvLyBcInJlcXVlc3RcIi5cbiAgICB0aGlzW2tIZWFkZXJzXSA9IG5ldyBIZWFkZXJzKGtDb25zdHJ1Y3QpXG4gICAgdGhpc1trSGVhZGVyc11ba0hlYWRlcnNMaXN0XSA9IHJlcXVlc3QuaGVhZGVyc0xpc3RcbiAgICB0aGlzW2tIZWFkZXJzXVtrR3VhcmRdID0gJ3JlcXVlc3QnXG4gICAgdGhpc1trSGVhZGVyc11ba1JlYWxtXSA9IHRoaXNba1JlYWxtXVxuXG4gICAgLy8gMzEuIElmIHRoaXPigJlzIHJlcXVlc3TigJlzIG1vZGUgaXMgXCJuby1jb3JzXCIsIHRoZW46XG4gICAgaWYgKG1vZGUgPT09ICduby1jb3JzJykge1xuICAgICAgLy8gMS4gSWYgdGhpc+KAmXMgcmVxdWVzdOKAmXMgbWV0aG9kIGlzIG5vdCBhIENPUlMtc2FmZWxpc3RlZCBtZXRob2QsXG4gICAgICAvLyB0aGVuIHRocm93IGEgVHlwZUVycm9yLlxuICAgICAgaWYgKCFjb3JzU2FmZUxpc3RlZE1ldGhvZHNTZXQuaGFzKHJlcXVlc3QubWV0aG9kKSkge1xuICAgICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKFxuICAgICAgICAgIGAnJHtyZXF1ZXN0Lm1ldGhvZH0gaXMgdW5zdXBwb3J0ZWQgaW4gbm8tY29ycyBtb2RlLmBcbiAgICAgICAgKVxuICAgICAgfVxuXG4gICAgICAvLyAyLiBTZXQgdGhpc+KAmXMgaGVhZGVyc+KAmXMgZ3VhcmQgdG8gXCJyZXF1ZXN0LW5vLWNvcnNcIi5cbiAgICAgIHRoaXNba0hlYWRlcnNdW2tHdWFyZF0gPSAncmVxdWVzdC1uby1jb3JzJ1xuICAgIH1cblxuICAgIC8vIDMyLiBJZiBpbml0IGlzIG5vdCBlbXB0eSwgdGhlbjpcbiAgICBpZiAoaW5pdEhhc0tleSkge1xuICAgICAgLyoqIEB0eXBlIHtIZWFkZXJzTGlzdH0gKi9cbiAgICAgIGNvbnN0IGhlYWRlcnNMaXN0ID0gdGhpc1trSGVhZGVyc11ba0hlYWRlcnNMaXN0XVxuICAgICAgLy8gMS4gTGV0IGhlYWRlcnMgYmUgYSBjb3B5IG9mIHRoaXPigJlzIGhlYWRlcnMgYW5kIGl0cyBhc3NvY2lhdGVkIGhlYWRlclxuICAgICAgLy8gbGlzdC5cbiAgICAgIC8vIDIuIElmIGluaXRbXCJoZWFkZXJzXCJdIGV4aXN0cywgdGhlbiBzZXQgaGVhZGVycyB0byBpbml0W1wiaGVhZGVyc1wiXS5cbiAgICAgIGNvbnN0IGhlYWRlcnMgPSBpbml0LmhlYWRlcnMgIT09IHVuZGVmaW5lZCA/IGluaXQuaGVhZGVycyA6IG5ldyBIZWFkZXJzTGlzdChoZWFkZXJzTGlzdClcblxuICAgICAgLy8gMy4gRW1wdHkgdGhpc+KAmXMgaGVhZGVyc+KAmXMgaGVhZGVyIGxpc3QuXG4gICAgICBoZWFkZXJzTGlzdC5jbGVhcigpXG5cbiAgICAgIC8vIDQuIElmIGhlYWRlcnMgaXMgYSBIZWFkZXJzIG9iamVjdCwgdGhlbiBmb3IgZWFjaCBoZWFkZXIgaW4gaXRzIGhlYWRlclxuICAgICAgLy8gbGlzdCwgYXBwZW5kIGhlYWRlcuKAmXMgbmFtZS9oZWFkZXLigJlzIHZhbHVlIHRvIHRoaXPigJlzIGhlYWRlcnMuXG4gICAgICBpZiAoaGVhZGVycyBpbnN0YW5jZW9mIEhlYWRlcnNMaXN0KSB7XG4gICAgICAgIGZvciAoY29uc3QgW2tleSwgdmFsXSBvZiBoZWFkZXJzKSB7XG4gICAgICAgICAgaGVhZGVyc0xpc3QuYXBwZW5kKGtleSwgdmFsKVxuICAgICAgICB9XG4gICAgICAgIC8vIE5vdGU6IENvcHkgdGhlIGBzZXQtY29va2llYCBtZXRhLWRhdGEuXG4gICAgICAgIGhlYWRlcnNMaXN0LmNvb2tpZXMgPSBoZWFkZXJzLmNvb2tpZXNcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIC8vIDUuIE90aGVyd2lzZSwgZmlsbCB0aGlz4oCZcyBoZWFkZXJzIHdpdGggaGVhZGVycy5cbiAgICAgICAgZmlsbEhlYWRlcnModGhpc1trSGVhZGVyc10sIGhlYWRlcnMpXG4gICAgICB9XG4gICAgfVxuXG4gICAgLy8gMzMuIExldCBpbnB1dEJvZHkgYmUgaW5wdXTigJlzIHJlcXVlc3TigJlzIGJvZHkgaWYgaW5wdXQgaXMgYSBSZXF1ZXN0XG4gICAgLy8gb2JqZWN0OyBvdGhlcndpc2UgbnVsbC5cbiAgICBjb25zdCBpbnB1dEJvZHkgPSBpbnB1dCBpbnN0YW5jZW9mIFJlcXVlc3QgPyBpbnB1dFtrU3RhdGVdLmJvZHkgOiBudWxsXG5cbiAgICAvLyAzNC4gSWYgZWl0aGVyIGluaXRbXCJib2R5XCJdIGV4aXN0cyBhbmQgaXMgbm9uLW51bGwgb3IgaW5wdXRCb2R5IGlzXG4gICAgLy8gbm9uLW51bGwsIGFuZCByZXF1ZXN04oCZcyBtZXRob2QgaXMgYEdFVGAgb3IgYEhFQURgLCB0aGVuIHRocm93IGFcbiAgICAvLyBUeXBlRXJyb3IuXG4gICAgaWYgKFxuICAgICAgKGluaXQuYm9keSAhPSBudWxsIHx8IGlucHV0Qm9keSAhPSBudWxsKSAmJlxuICAgICAgKHJlcXVlc3QubWV0aG9kID09PSAnR0VUJyB8fCByZXF1ZXN0Lm1ldGhvZCA9PT0gJ0hFQUQnKVxuICAgICkge1xuICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcignUmVxdWVzdCB3aXRoIEdFVC9IRUFEIG1ldGhvZCBjYW5ub3QgaGF2ZSBib2R5LicpXG4gICAgfVxuXG4gICAgLy8gMzUuIExldCBpbml0Qm9keSBiZSBudWxsLlxuICAgIGxldCBpbml0Qm9keSA9IG51bGxcblxuICAgIC8vIDM2LiBJZiBpbml0W1wiYm9keVwiXSBleGlzdHMgYW5kIGlzIG5vbi1udWxsLCB0aGVuOlxuICAgIGlmIChpbml0LmJvZHkgIT0gbnVsbCkge1xuICAgICAgLy8gMS4gTGV0IENvbnRlbnQtVHlwZSBiZSBudWxsLlxuICAgICAgLy8gMi4gU2V0IGluaXRCb2R5IGFuZCBDb250ZW50LVR5cGUgdG8gdGhlIHJlc3VsdCBvZiBleHRyYWN0aW5nXG4gICAgICAvLyBpbml0W1wiYm9keVwiXSwgd2l0aCBrZWVwYWxpdmUgc2V0IHRvIHJlcXVlc3TigJlzIGtlZXBhbGl2ZS5cbiAgICAgIGNvbnN0IFtleHRyYWN0ZWRCb2R5LCBjb250ZW50VHlwZV0gPSBleHRyYWN0Qm9keShcbiAgICAgICAgaW5pdC5ib2R5LFxuICAgICAgICByZXF1ZXN0LmtlZXBhbGl2ZVxuICAgICAgKVxuICAgICAgaW5pdEJvZHkgPSBleHRyYWN0ZWRCb2R5XG5cbiAgICAgIC8vIDMsIElmIENvbnRlbnQtVHlwZSBpcyBub24tbnVsbCBhbmQgdGhpc+KAmXMgaGVhZGVyc+KAmXMgaGVhZGVyIGxpc3QgZG9lc1xuICAgICAgLy8gbm90IGNvbnRhaW4gYENvbnRlbnQtVHlwZWAsIHRoZW4gYXBwZW5kIGBDb250ZW50LVR5cGVgL0NvbnRlbnQtVHlwZSB0b1xuICAgICAgLy8gdGhpc+KAmXMgaGVhZGVycy5cbiAgICAgIGlmIChjb250ZW50VHlwZSAmJiAhdGhpc1trSGVhZGVyc11ba0hlYWRlcnNMaXN0XS5jb250YWlucygnY29udGVudC10eXBlJykpIHtcbiAgICAgICAgdGhpc1trSGVhZGVyc10uYXBwZW5kKCdjb250ZW50LXR5cGUnLCBjb250ZW50VHlwZSlcbiAgICAgIH1cbiAgICB9XG5cbiAgICAvLyAzNy4gTGV0IGlucHV0T3JJbml0Qm9keSBiZSBpbml0Qm9keSBpZiBpdCBpcyBub24tbnVsbDsgb3RoZXJ3aXNlXG4gICAgLy8gaW5wdXRCb2R5LlxuICAgIGNvbnN0IGlucHV0T3JJbml0Qm9keSA9IGluaXRCb2R5ID8/IGlucHV0Qm9keVxuXG4gICAgLy8gMzguIElmIGlucHV0T3JJbml0Qm9keSBpcyBub24tbnVsbCBhbmQgaW5wdXRPckluaXRCb2R54oCZcyBzb3VyY2UgaXNcbiAgICAvLyBudWxsLCB0aGVuOlxuICAgIGlmIChpbnB1dE9ySW5pdEJvZHkgIT0gbnVsbCAmJiBpbnB1dE9ySW5pdEJvZHkuc291cmNlID09IG51bGwpIHtcbiAgICAgIC8vIDEuIElmIGluaXRCb2R5IGlzIG5vbi1udWxsIGFuZCBpbml0W1wiZHVwbGV4XCJdIGRvZXMgbm90IGV4aXN0LFxuICAgICAgLy8gICAgdGhlbiB0aHJvdyBhIFR5cGVFcnJvci5cbiAgICAgIGlmIChpbml0Qm9keSAhPSBudWxsICYmIGluaXQuZHVwbGV4ID09IG51bGwpIHtcbiAgICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcignUmVxdWVzdEluaXQ6IGR1cGxleCBvcHRpb24gaXMgcmVxdWlyZWQgd2hlbiBzZW5kaW5nIGEgYm9keS4nKVxuICAgICAgfVxuXG4gICAgICAvLyAyLiBJZiB0aGlz4oCZcyByZXF1ZXN04oCZcyBtb2RlIGlzIG5laXRoZXIgXCJzYW1lLW9yaWdpblwiIG5vciBcImNvcnNcIixcbiAgICAgIC8vIHRoZW4gdGhyb3cgYSBUeXBlRXJyb3IuXG4gICAgICBpZiAocmVxdWVzdC5tb2RlICE9PSAnc2FtZS1vcmlnaW4nICYmIHJlcXVlc3QubW9kZSAhPT0gJ2NvcnMnKSB7XG4gICAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoXG4gICAgICAgICAgJ0lmIHJlcXVlc3QgaXMgbWFkZSBmcm9tIFJlYWRhYmxlU3RyZWFtLCBtb2RlIHNob3VsZCBiZSBcInNhbWUtb3JpZ2luXCIgb3IgXCJjb3JzXCInXG4gICAgICAgIClcbiAgICAgIH1cblxuICAgICAgLy8gMy4gU2V0IHRoaXPigJlzIHJlcXVlc3TigJlzIHVzZS1DT1JTLXByZWZsaWdodCBmbGFnLlxuICAgICAgcmVxdWVzdC51c2VDT1JTUHJlZmxpZ2h0RmxhZyA9IHRydWVcbiAgICB9XG5cbiAgICAvLyAzOS4gTGV0IGZpbmFsQm9keSBiZSBpbnB1dE9ySW5pdEJvZHkuXG4gICAgbGV0IGZpbmFsQm9keSA9IGlucHV0T3JJbml0Qm9keVxuXG4gICAgLy8gNDAuIElmIGluaXRCb2R5IGlzIG51bGwgYW5kIGlucHV0Qm9keSBpcyBub24tbnVsbCwgdGhlbjpcbiAgICBpZiAoaW5pdEJvZHkgPT0gbnVsbCAmJiBpbnB1dEJvZHkgIT0gbnVsbCkge1xuICAgICAgLy8gMS4gSWYgaW5wdXQgaXMgdW51c2FibGUsIHRoZW4gdGhyb3cgYSBUeXBlRXJyb3IuXG4gICAgICBpZiAodXRpbC5pc0Rpc3R1cmJlZChpbnB1dEJvZHkuc3RyZWFtKSB8fCBpbnB1dEJvZHkuc3RyZWFtLmxvY2tlZCkge1xuICAgICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKFxuICAgICAgICAgICdDYW5ub3QgY29uc3RydWN0IGEgUmVxdWVzdCB3aXRoIGEgUmVxdWVzdCBvYmplY3QgdGhhdCBoYXMgYWxyZWFkeSBiZWVuIHVzZWQuJ1xuICAgICAgICApXG4gICAgICB9XG5cbiAgICAgIC8vIDIuIFNldCBmaW5hbEJvZHkgdG8gdGhlIHJlc3VsdCBvZiBjcmVhdGluZyBhIHByb3h5IGZvciBpbnB1dEJvZHkuXG4gICAgICBpZiAoIVRyYW5zZm9ybVN0cmVhbSkge1xuICAgICAgICBUcmFuc2Zvcm1TdHJlYW0gPSByZXF1aXJlKCdzdHJlYW0vd2ViJykuVHJhbnNmb3JtU3RyZWFtXG4gICAgICB9XG5cbiAgICAgIC8vIGh0dHBzOi8vc3RyZWFtcy5zcGVjLndoYXR3Zy5vcmcvI3JlYWRhYmxlc3RyZWFtLWNyZWF0ZS1hLXByb3h5XG4gICAgICBjb25zdCBpZGVudGl0eVRyYW5zZm9ybSA9IG5ldyBUcmFuc2Zvcm1TdHJlYW0oKVxuICAgICAgaW5wdXRCb2R5LnN0cmVhbS5waXBlVGhyb3VnaChpZGVudGl0eVRyYW5zZm9ybSlcbiAgICAgIGZpbmFsQm9keSA9IHtcbiAgICAgICAgc291cmNlOiBpbnB1dEJvZHkuc291cmNlLFxuICAgICAgICBsZW5ndGg6IGlucHV0Qm9keS5sZW5ndGgsXG4gICAgICAgIHN0cmVhbTogaWRlbnRpdHlUcmFuc2Zvcm0ucmVhZGFibGVcbiAgICAgIH1cbiAgICB9XG5cbiAgICAvLyA0MS4gU2V0IHRoaXPigJlzIHJlcXVlc3TigJlzIGJvZHkgdG8gZmluYWxCb2R5LlxuICAgIHRoaXNba1N0YXRlXS5ib2R5ID0gZmluYWxCb2R5XG4gIH1cblxuICAvLyBSZXR1cm5zIHJlcXVlc3TigJlzIEhUVFAgbWV0aG9kLCB3aGljaCBpcyBcIkdFVFwiIGJ5IGRlZmF1bHQuXG4gIGdldCBtZXRob2QgKCkge1xuICAgIHdlYmlkbC5icmFuZENoZWNrKHRoaXMsIFJlcXVlc3QpXG5cbiAgICAvLyBUaGUgbWV0aG9kIGdldHRlciBzdGVwcyBhcmUgdG8gcmV0dXJuIHRoaXPigJlzIHJlcXVlc3TigJlzIG1ldGhvZC5cbiAgICByZXR1cm4gdGhpc1trU3RhdGVdLm1ldGhvZFxuICB9XG5cbiAgLy8gUmV0dXJucyB0aGUgVVJMIG9mIHJlcXVlc3QgYXMgYSBzdHJpbmcuXG4gIGdldCB1cmwgKCkge1xuICAgIHdlYmlkbC5icmFuZENoZWNrKHRoaXMsIFJlcXVlc3QpXG5cbiAgICAvLyBUaGUgdXJsIGdldHRlciBzdGVwcyBhcmUgdG8gcmV0dXJuIHRoaXPigJlzIHJlcXVlc3TigJlzIFVSTCwgc2VyaWFsaXplZC5cbiAgICByZXR1cm4gVVJMU2VyaWFsaXplcih0aGlzW2tTdGF0ZV0udXJsKVxuICB9XG5cbiAgLy8gUmV0dXJucyBhIEhlYWRlcnMgb2JqZWN0IGNvbnNpc3Rpbmcgb2YgdGhlIGhlYWRlcnMgYXNzb2NpYXRlZCB3aXRoIHJlcXVlc3QuXG4gIC8vIE5vdGUgdGhhdCBoZWFkZXJzIGFkZGVkIGluIHRoZSBuZXR3b3JrIGxheWVyIGJ5IHRoZSB1c2VyIGFnZW50IHdpbGwgbm90XG4gIC8vIGJlIGFjY291bnRlZCBmb3IgaW4gdGhpcyBvYmplY3QsIGUuZy4sIHRoZSBcIkhvc3RcIiBoZWFkZXIuXG4gIGdldCBoZWFkZXJzICgpIHtcbiAgICB3ZWJpZGwuYnJhbmRDaGVjayh0aGlzLCBSZXF1ZXN0KVxuXG4gICAgLy8gVGhlIGhlYWRlcnMgZ2V0dGVyIHN0ZXBzIGFyZSB0byByZXR1cm4gdGhpc+KAmXMgaGVhZGVycy5cbiAgICByZXR1cm4gdGhpc1trSGVhZGVyc11cbiAgfVxuXG4gIC8vIFJldHVybnMgdGhlIGtpbmQgb2YgcmVzb3VyY2UgcmVxdWVzdGVkIGJ5IHJlcXVlc3QsIGUuZy4sIFwiZG9jdW1lbnRcIlxuICAvLyBvciBcInNjcmlwdFwiLlxuICBnZXQgZGVzdGluYXRpb24gKCkge1xuICAgIHdlYmlkbC5icmFuZENoZWNrKHRoaXMsIFJlcXVlc3QpXG5cbiAgICAvLyBUaGUgZGVzdGluYXRpb24gZ2V0dGVyIGFyZSB0byByZXR1cm4gdGhpc+KAmXMgcmVxdWVzdOKAmXMgZGVzdGluYXRpb24uXG4gICAgcmV0dXJuIHRoaXNba1N0YXRlXS5kZXN0aW5hdGlvblxuICB9XG5cbiAgLy8gUmV0dXJucyB0aGUgcmVmZXJyZXIgb2YgcmVxdWVzdC4gSXRzIHZhbHVlIGNhbiBiZSBhIHNhbWUtb3JpZ2luIFVSTCBpZlxuICAvLyBleHBsaWNpdGx5IHNldCBpbiBpbml0LCB0aGUgZW1wdHkgc3RyaW5nIHRvIGluZGljYXRlIG5vIHJlZmVycmVyLCBhbmRcbiAgLy8gXCJhYm91dDpjbGllbnRcIiB3aGVuIGRlZmF1bHRpbmcgdG8gdGhlIGdsb2JhbOKAmXMgZGVmYXVsdC4gVGhpcyBpcyB1c2VkXG4gIC8vIGR1cmluZyBmZXRjaGluZyB0byBkZXRlcm1pbmUgdGhlIHZhbHVlIG9mIHRoZSBgUmVmZXJlcmAgaGVhZGVyIG9mIHRoZVxuICAvLyByZXF1ZXN0IGJlaW5nIG1hZGUuXG4gIGdldCByZWZlcnJlciAoKSB7XG4gICAgd2ViaWRsLmJyYW5kQ2hlY2sodGhpcywgUmVxdWVzdClcblxuICAgIC8vIDEuIElmIHRoaXPigJlzIHJlcXVlc3TigJlzIHJlZmVycmVyIGlzIFwibm8tcmVmZXJyZXJcIiwgdGhlbiByZXR1cm4gdGhlXG4gICAgLy8gZW1wdHkgc3RyaW5nLlxuICAgIGlmICh0aGlzW2tTdGF0ZV0ucmVmZXJyZXIgPT09ICduby1yZWZlcnJlcicpIHtcbiAgICAgIHJldHVybiAnJ1xuICAgIH1cblxuICAgIC8vIDIuIElmIHRoaXPigJlzIHJlcXVlc3TigJlzIHJlZmVycmVyIGlzIFwiY2xpZW50XCIsIHRoZW4gcmV0dXJuXG4gICAgLy8gXCJhYm91dDpjbGllbnRcIi5cbiAgICBpZiAodGhpc1trU3RhdGVdLnJlZmVycmVyID09PSAnY2xpZW50Jykge1xuICAgICAgcmV0dXJuICdhYm91dDpjbGllbnQnXG4gICAgfVxuXG4gICAgLy8gUmV0dXJuIHRoaXPigJlzIHJlcXVlc3TigJlzIHJlZmVycmVyLCBzZXJpYWxpemVkLlxuICAgIHJldHVybiB0aGlzW2tTdGF0ZV0ucmVmZXJyZXIudG9TdHJpbmcoKVxuICB9XG5cbiAgLy8gUmV0dXJucyB0aGUgcmVmZXJyZXIgcG9saWN5IGFzc29jaWF0ZWQgd2l0aCByZXF1ZXN0LlxuICAvLyBUaGlzIGlzIHVzZWQgZHVyaW5nIGZldGNoaW5nIHRvIGNvbXB1dGUgdGhlIHZhbHVlIG9mIHRoZSByZXF1ZXN04oCZc1xuICAvLyByZWZlcnJlci5cbiAgZ2V0IHJlZmVycmVyUG9saWN5ICgpIHtcbiAgICB3ZWJpZGwuYnJhbmRDaGVjayh0aGlzLCBSZXF1ZXN0KVxuXG4gICAgLy8gVGhlIHJlZmVycmVyUG9saWN5IGdldHRlciBzdGVwcyBhcmUgdG8gcmV0dXJuIHRoaXPigJlzIHJlcXVlc3TigJlzIHJlZmVycmVyIHBvbGljeS5cbiAgICByZXR1cm4gdGhpc1trU3RhdGVdLnJlZmVycmVyUG9saWN5XG4gIH1cblxuICAvLyBSZXR1cm5zIHRoZSBtb2RlIGFzc29jaWF0ZWQgd2l0aCByZXF1ZXN0LCB3aGljaCBpcyBhIHN0cmluZyBpbmRpY2F0aW5nXG4gIC8vIHdoZXRoZXIgdGhlIHJlcXVlc3Qgd2lsbCB1c2UgQ09SUywgb3Igd2lsbCBiZSByZXN0cmljdGVkIHRvIHNhbWUtb3JpZ2luXG4gIC8vIFVSTHMuXG4gIGdldCBtb2RlICgpIHtcbiAgICB3ZWJpZGwuYnJhbmRDaGVjayh0aGlzLCBSZXF1ZXN0KVxuXG4gICAgLy8gVGhlIG1vZGUgZ2V0dGVyIHN0ZXBzIGFyZSB0byByZXR1cm4gdGhpc+KAmXMgcmVxdWVzdOKAmXMgbW9kZS5cbiAgICByZXR1cm4gdGhpc1trU3RhdGVdLm1vZGVcbiAgfVxuXG4gIC8vIFJldHVybnMgdGhlIGNyZWRlbnRpYWxzIG1vZGUgYXNzb2NpYXRlZCB3aXRoIHJlcXVlc3QsXG4gIC8vIHdoaWNoIGlzIGEgc3RyaW5nIGluZGljYXRpbmcgd2hldGhlciBjcmVkZW50aWFscyB3aWxsIGJlIHNlbnQgd2l0aCB0aGVcbiAgLy8gcmVxdWVzdCBhbHdheXMsIG5ldmVyLCBvciBvbmx5IHdoZW4gc2VudCB0byBhIHNhbWUtb3JpZ2luIFVSTC5cbiAgZ2V0IGNyZWRlbnRpYWxzICgpIHtcbiAgICAvLyBUaGUgY3JlZGVudGlhbHMgZ2V0dGVyIHN0ZXBzIGFyZSB0byByZXR1cm4gdGhpc+KAmXMgcmVxdWVzdOKAmXMgY3JlZGVudGlhbHMgbW9kZS5cbiAgICByZXR1cm4gdGhpc1trU3RhdGVdLmNyZWRlbnRpYWxzXG4gIH1cblxuICAvLyBSZXR1cm5zIHRoZSBjYWNoZSBtb2RlIGFzc29jaWF0ZWQgd2l0aCByZXF1ZXN0LFxuICAvLyB3aGljaCBpcyBhIHN0cmluZyBpbmRpY2F0aW5nIGhvdyB0aGUgcmVxdWVzdCB3aWxsXG4gIC8vIGludGVyYWN0IHdpdGggdGhlIGJyb3dzZXLigJlzIGNhY2hlIHdoZW4gZmV0Y2hpbmcuXG4gIGdldCBjYWNoZSAoKSB7XG4gICAgd2ViaWRsLmJyYW5kQ2hlY2sodGhpcywgUmVxdWVzdClcblxuICAgIC8vIFRoZSBjYWNoZSBnZXR0ZXIgc3RlcHMgYXJlIHRvIHJldHVybiB0aGlz4oCZcyByZXF1ZXN04oCZcyBjYWNoZSBtb2RlLlxuICAgIHJldHVybiB0aGlzW2tTdGF0ZV0uY2FjaGVcbiAgfVxuXG4gIC8vIFJldHVybnMgdGhlIHJlZGlyZWN0IG1vZGUgYXNzb2NpYXRlZCB3aXRoIHJlcXVlc3QsXG4gIC8vIHdoaWNoIGlzIGEgc3RyaW5nIGluZGljYXRpbmcgaG93IHJlZGlyZWN0cyBmb3IgdGhlXG4gIC8vIHJlcXVlc3Qgd2lsbCBiZSBoYW5kbGVkIGR1cmluZyBmZXRjaGluZy4gQSByZXF1ZXN0XG4gIC8vIHdpbGwgZm9sbG93IHJlZGlyZWN0cyBieSBkZWZhdWx0LlxuICBnZXQgcmVkaXJlY3QgKCkge1xuICAgIHdlYmlkbC5icmFuZENoZWNrKHRoaXMsIFJlcXVlc3QpXG5cbiAgICAvLyBUaGUgcmVkaXJlY3QgZ2V0dGVyIHN0ZXBzIGFyZSB0byByZXR1cm4gdGhpc+KAmXMgcmVxdWVzdOKAmXMgcmVkaXJlY3QgbW9kZS5cbiAgICByZXR1cm4gdGhpc1trU3RhdGVdLnJlZGlyZWN0XG4gIH1cblxuICAvLyBSZXR1cm5zIHJlcXVlc3TigJlzIHN1YnJlc291cmNlIGludGVncml0eSBtZXRhZGF0YSwgd2hpY2ggaXMgYVxuICAvLyBjcnlwdG9ncmFwaGljIGhhc2ggb2YgdGhlIHJlc291cmNlIGJlaW5nIGZldGNoZWQuIEl0cyB2YWx1ZVxuICAvLyBjb25zaXN0cyBvZiBtdWx0aXBsZSBoYXNoZXMgc2VwYXJhdGVkIGJ5IHdoaXRlc3BhY2UuIFtTUkldXG4gIGdldCBpbnRlZ3JpdHkgKCkge1xuICAgIHdlYmlkbC5icmFuZENoZWNrKHRoaXMsIFJlcXVlc3QpXG5cbiAgICAvLyBUaGUgaW50ZWdyaXR5IGdldHRlciBzdGVwcyBhcmUgdG8gcmV0dXJuIHRoaXPigJlzIHJlcXVlc3TigJlzIGludGVncml0eVxuICAgIC8vIG1ldGFkYXRhLlxuICAgIHJldHVybiB0aGlzW2tTdGF0ZV0uaW50ZWdyaXR5XG4gIH1cblxuICAvLyBSZXR1cm5zIGEgYm9vbGVhbiBpbmRpY2F0aW5nIHdoZXRoZXIgb3Igbm90IHJlcXVlc3QgY2FuIG91dGxpdmUgdGhlXG4gIC8vIGdsb2JhbCBpbiB3aGljaCBpdCB3YXMgY3JlYXRlZC5cbiAgZ2V0IGtlZXBhbGl2ZSAoKSB7XG4gICAgd2ViaWRsLmJyYW5kQ2hlY2sodGhpcywgUmVxdWVzdClcblxuICAgIC8vIFRoZSBrZWVwYWxpdmUgZ2V0dGVyIHN0ZXBzIGFyZSB0byByZXR1cm4gdGhpc+KAmXMgcmVxdWVzdOKAmXMga2VlcGFsaXZlLlxuICAgIHJldHVybiB0aGlzW2tTdGF0ZV0ua2VlcGFsaXZlXG4gIH1cblxuICAvLyBSZXR1cm5zIGEgYm9vbGVhbiBpbmRpY2F0aW5nIHdoZXRoZXIgb3Igbm90IHJlcXVlc3QgaXMgZm9yIGEgcmVsb2FkXG4gIC8vIG5hdmlnYXRpb24uXG4gIGdldCBpc1JlbG9hZE5hdmlnYXRpb24gKCkge1xuICAgIHdlYmlkbC5icmFuZENoZWNrKHRoaXMsIFJlcXVlc3QpXG5cbiAgICAvLyBUaGUgaXNSZWxvYWROYXZpZ2F0aW9uIGdldHRlciBzdGVwcyBhcmUgdG8gcmV0dXJuIHRydWUgaWYgdGhpc+KAmXNcbiAgICAvLyByZXF1ZXN04oCZcyByZWxvYWQtbmF2aWdhdGlvbiBmbGFnIGlzIHNldDsgb3RoZXJ3aXNlIGZhbHNlLlxuICAgIHJldHVybiB0aGlzW2tTdGF0ZV0ucmVsb2FkTmF2aWdhdGlvblxuICB9XG5cbiAgLy8gUmV0dXJucyBhIGJvb2xlYW4gaW5kaWNhdGluZyB3aGV0aGVyIG9yIG5vdCByZXF1ZXN0IGlzIGZvciBhIGhpc3RvcnlcbiAgLy8gbmF2aWdhdGlvbiAoYS5rLmEuIGJhY2stZm93YXJkIG5hdmlnYXRpb24pLlxuICBnZXQgaXNIaXN0b3J5TmF2aWdhdGlvbiAoKSB7XG4gICAgd2ViaWRsLmJyYW5kQ2hlY2sodGhpcywgUmVxdWVzdClcblxuICAgIC8vIFRoZSBpc0hpc3RvcnlOYXZpZ2F0aW9uIGdldHRlciBzdGVwcyBhcmUgdG8gcmV0dXJuIHRydWUgaWYgdGhpc+KAmXMgcmVxdWVzdOKAmXNcbiAgICAvLyBoaXN0b3J5LW5hdmlnYXRpb24gZmxhZyBpcyBzZXQ7IG90aGVyd2lzZSBmYWxzZS5cbiAgICByZXR1cm4gdGhpc1trU3RhdGVdLmhpc3RvcnlOYXZpZ2F0aW9uXG4gIH1cblxuICAvLyBSZXR1cm5zIHRoZSBzaWduYWwgYXNzb2NpYXRlZCB3aXRoIHJlcXVlc3QsIHdoaWNoIGlzIGFuIEFib3J0U2lnbmFsXG4gIC8vIG9iamVjdCBpbmRpY2F0aW5nIHdoZXRoZXIgb3Igbm90IHJlcXVlc3QgaGFzIGJlZW4gYWJvcnRlZCwgYW5kIGl0c1xuICAvLyBhYm9ydCBldmVudCBoYW5kbGVyLlxuICBnZXQgc2lnbmFsICgpIHtcbiAgICB3ZWJpZGwuYnJhbmRDaGVjayh0aGlzLCBSZXF1ZXN0KVxuXG4gICAgLy8gVGhlIHNpZ25hbCBnZXR0ZXIgc3RlcHMgYXJlIHRvIHJldHVybiB0aGlz4oCZcyBzaWduYWwuXG4gICAgcmV0dXJuIHRoaXNba1NpZ25hbF1cbiAgfVxuXG4gIGdldCBib2R5ICgpIHtcbiAgICB3ZWJpZGwuYnJhbmRDaGVjayh0aGlzLCBSZXF1ZXN0KVxuXG4gICAgcmV0dXJuIHRoaXNba1N0YXRlXS5ib2R5ID8gdGhpc1trU3RhdGVdLmJvZHkuc3RyZWFtIDogbnVsbFxuICB9XG5cbiAgZ2V0IGJvZHlVc2VkICgpIHtcbiAgICB3ZWJpZGwuYnJhbmRDaGVjayh0aGlzLCBSZXF1ZXN0KVxuXG4gICAgcmV0dXJuICEhdGhpc1trU3RhdGVdLmJvZHkgJiYgdXRpbC5pc0Rpc3R1cmJlZCh0aGlzW2tTdGF0ZV0uYm9keS5zdHJlYW0pXG4gIH1cblxuICBnZXQgZHVwbGV4ICgpIHtcbiAgICB3ZWJpZGwuYnJhbmRDaGVjayh0aGlzLCBSZXF1ZXN0KVxuXG4gICAgcmV0dXJuICdoYWxmJ1xuICB9XG5cbiAgLy8gUmV0dXJucyBhIGNsb25lIG9mIHJlcXVlc3QuXG4gIGNsb25lICgpIHtcbiAgICB3ZWJpZGwuYnJhbmRDaGVjayh0aGlzLCBSZXF1ZXN0KVxuXG4gICAgLy8gMS4gSWYgdGhpcyBpcyB1bnVzYWJsZSwgdGhlbiB0aHJvdyBhIFR5cGVFcnJvci5cbiAgICBpZiAodGhpcy5ib2R5VXNlZCB8fCB0aGlzLmJvZHk/LmxvY2tlZCkge1xuICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcigndW51c2FibGUnKVxuICAgIH1cblxuICAgIC8vIDIuIExldCBjbG9uZWRSZXF1ZXN0IGJlIHRoZSByZXN1bHQgb2YgY2xvbmluZyB0aGlz4oCZcyByZXF1ZXN0LlxuICAgIGNvbnN0IGNsb25lZFJlcXVlc3QgPSBjbG9uZVJlcXVlc3QodGhpc1trU3RhdGVdKVxuXG4gICAgLy8gMy4gTGV0IGNsb25lZFJlcXVlc3RPYmplY3QgYmUgdGhlIHJlc3VsdCBvZiBjcmVhdGluZyBhIFJlcXVlc3Qgb2JqZWN0LFxuICAgIC8vIGdpdmVuIGNsb25lZFJlcXVlc3QsIHRoaXPigJlzIGhlYWRlcnPigJlzIGd1YXJkLCBhbmQgdGhpc+KAmXMgcmVsZXZhbnQgUmVhbG0uXG4gICAgY29uc3QgY2xvbmVkUmVxdWVzdE9iamVjdCA9IG5ldyBSZXF1ZXN0KGtDb25zdHJ1Y3QpXG4gICAgY2xvbmVkUmVxdWVzdE9iamVjdFtrU3RhdGVdID0gY2xvbmVkUmVxdWVzdFxuICAgIGNsb25lZFJlcXVlc3RPYmplY3Rba1JlYWxtXSA9IHRoaXNba1JlYWxtXVxuICAgIGNsb25lZFJlcXVlc3RPYmplY3Rba0hlYWRlcnNdID0gbmV3IEhlYWRlcnMoa0NvbnN0cnVjdClcbiAgICBjbG9uZWRSZXF1ZXN0T2JqZWN0W2tIZWFkZXJzXVtrSGVhZGVyc0xpc3RdID0gY2xvbmVkUmVxdWVzdC5oZWFkZXJzTGlzdFxuICAgIGNsb25lZFJlcXVlc3RPYmplY3Rba0hlYWRlcnNdW2tHdWFyZF0gPSB0aGlzW2tIZWFkZXJzXVtrR3VhcmRdXG4gICAgY2xvbmVkUmVxdWVzdE9iamVjdFtrSGVhZGVyc11ba1JlYWxtXSA9IHRoaXNba0hlYWRlcnNdW2tSZWFsbV1cblxuICAgIC8vIDQuIE1ha2UgY2xvbmVkUmVxdWVzdE9iamVjdOKAmXMgc2lnbmFsIGZvbGxvdyB0aGlz4oCZcyBzaWduYWwuXG4gICAgY29uc3QgYWMgPSBuZXcgQWJvcnRDb250cm9sbGVyKClcbiAgICBpZiAodGhpcy5zaWduYWwuYWJvcnRlZCkge1xuICAgICAgYWMuYWJvcnQodGhpcy5zaWduYWwucmVhc29uKVxuICAgIH0gZWxzZSB7XG4gICAgICB1dGlsLmFkZEFib3J0TGlzdGVuZXIoXG4gICAgICAgIHRoaXMuc2lnbmFsLFxuICAgICAgICAoKSA9PiB7XG4gICAgICAgICAgYWMuYWJvcnQodGhpcy5zaWduYWwucmVhc29uKVxuICAgICAgICB9XG4gICAgICApXG4gICAgfVxuICAgIGNsb25lZFJlcXVlc3RPYmplY3Rba1NpZ25hbF0gPSBhYy5zaWduYWxcblxuICAgIC8vIDQuIFJldHVybiBjbG9uZWRSZXF1ZXN0T2JqZWN0LlxuICAgIHJldHVybiBjbG9uZWRSZXF1ZXN0T2JqZWN0XG4gIH1cbn1cblxubWl4aW5Cb2R5KFJlcXVlc3QpXG5cbmZ1bmN0aW9uIG1ha2VSZXF1ZXN0IChpbml0KSB7XG4gIC8vIGh0dHBzOi8vZmV0Y2guc3BlYy53aGF0d2cub3JnLyNyZXF1ZXN0c1xuICBjb25zdCByZXF1ZXN0ID0ge1xuICAgIG1ldGhvZDogJ0dFVCcsXG4gICAgbG9jYWxVUkxzT25seTogZmFsc2UsXG4gICAgdW5zYWZlUmVxdWVzdDogZmFsc2UsXG4gICAgYm9keTogbnVsbCxcbiAgICBjbGllbnQ6IG51bGwsXG4gICAgcmVzZXJ2ZWRDbGllbnQ6IG51bGwsXG4gICAgcmVwbGFjZXNDbGllbnRJZDogJycsXG4gICAgd2luZG93OiAnY2xpZW50JyxcbiAgICBrZWVwYWxpdmU6IGZhbHNlLFxuICAgIHNlcnZpY2VXb3JrZXJzOiAnYWxsJyxcbiAgICBpbml0aWF0b3I6ICcnLFxuICAgIGRlc3RpbmF0aW9uOiAnJyxcbiAgICBwcmlvcml0eTogbnVsbCxcbiAgICBvcmlnaW46ICdjbGllbnQnLFxuICAgIHBvbGljeUNvbnRhaW5lcjogJ2NsaWVudCcsXG4gICAgcmVmZXJyZXI6ICdjbGllbnQnLFxuICAgIHJlZmVycmVyUG9saWN5OiAnJyxcbiAgICBtb2RlOiAnbm8tY29ycycsXG4gICAgdXNlQ09SU1ByZWZsaWdodEZsYWc6IGZhbHNlLFxuICAgIGNyZWRlbnRpYWxzOiAnc2FtZS1vcmlnaW4nLFxuICAgIHVzZUNyZWRlbnRpYWxzOiBmYWxzZSxcbiAgICBjYWNoZTogJ2RlZmF1bHQnLFxuICAgIHJlZGlyZWN0OiAnZm9sbG93JyxcbiAgICBpbnRlZ3JpdHk6ICcnLFxuICAgIGNyeXB0b0dyYXBoaWNzTm9uY2VNZXRhZGF0YTogJycsXG4gICAgcGFyc2VyTWV0YWRhdGE6ICcnLFxuICAgIHJlbG9hZE5hdmlnYXRpb246IGZhbHNlLFxuICAgIGhpc3RvcnlOYXZpZ2F0aW9uOiBmYWxzZSxcbiAgICB1c2VyQWN0aXZhdGlvbjogZmFsc2UsXG4gICAgdGFpbnRlZE9yaWdpbjogZmFsc2UsXG4gICAgcmVkaXJlY3RDb3VudDogMCxcbiAgICByZXNwb25zZVRhaW50aW5nOiAnYmFzaWMnLFxuICAgIHByZXZlbnROb0NhY2hlQ2FjaGVDb250cm9sSGVhZGVyTW9kaWZpY2F0aW9uOiBmYWxzZSxcbiAgICBkb25lOiBmYWxzZSxcbiAgICB0aW1pbmdBbGxvd0ZhaWxlZDogZmFsc2UsXG4gICAgLi4uaW5pdCxcbiAgICBoZWFkZXJzTGlzdDogaW5pdC5oZWFkZXJzTGlzdFxuICAgICAgPyBuZXcgSGVhZGVyc0xpc3QoaW5pdC5oZWFkZXJzTGlzdClcbiAgICAgIDogbmV3IEhlYWRlcnNMaXN0KClcbiAgfVxuICByZXF1ZXN0LnVybCA9IHJlcXVlc3QudXJsTGlzdFswXVxuICByZXR1cm4gcmVxdWVzdFxufVxuXG4vLyBodHRwczovL2ZldGNoLnNwZWMud2hhdHdnLm9yZy8jY29uY2VwdC1yZXF1ZXN0LWNsb25lXG5mdW5jdGlvbiBjbG9uZVJlcXVlc3QgKHJlcXVlc3QpIHtcbiAgLy8gVG8gY2xvbmUgYSByZXF1ZXN0IHJlcXVlc3QsIHJ1biB0aGVzZSBzdGVwczpcblxuICAvLyAxLiBMZXQgbmV3UmVxdWVzdCBiZSBhIGNvcHkgb2YgcmVxdWVzdCwgZXhjZXB0IGZvciBpdHMgYm9keS5cbiAgY29uc3QgbmV3UmVxdWVzdCA9IG1ha2VSZXF1ZXN0KHsgLi4ucmVxdWVzdCwgYm9keTogbnVsbCB9KVxuXG4gIC8vIDIuIElmIHJlcXVlc3TigJlzIGJvZHkgaXMgbm9uLW51bGwsIHNldCBuZXdSZXF1ZXN04oCZcyBib2R5IHRvIHRoZVxuICAvLyByZXN1bHQgb2YgY2xvbmluZyByZXF1ZXN04oCZcyBib2R5LlxuICBpZiAocmVxdWVzdC5ib2R5ICE9IG51bGwpIHtcbiAgICBuZXdSZXF1ZXN0LmJvZHkgPSBjbG9uZUJvZHkocmVxdWVzdC5ib2R5KVxuICB9XG5cbiAgLy8gMy4gUmV0dXJuIG5ld1JlcXVlc3QuXG4gIHJldHVybiBuZXdSZXF1ZXN0XG59XG5cbk9iamVjdC5kZWZpbmVQcm9wZXJ0aWVzKFJlcXVlc3QucHJvdG90eXBlLCB7XG4gIG1ldGhvZDoga0VudW1lcmFibGVQcm9wZXJ0eSxcbiAgdXJsOiBrRW51bWVyYWJsZVByb3BlcnR5LFxuICBoZWFkZXJzOiBrRW51bWVyYWJsZVByb3BlcnR5LFxuICByZWRpcmVjdDoga0VudW1lcmFibGVQcm9wZXJ0eSxcbiAgY2xvbmU6IGtFbnVtZXJhYmxlUHJvcGVydHksXG4gIHNpZ25hbDoga0VudW1lcmFibGVQcm9wZXJ0eSxcbiAgZHVwbGV4OiBrRW51bWVyYWJsZVByb3BlcnR5LFxuICBkZXN0aW5hdGlvbjoga0VudW1lcmFibGVQcm9wZXJ0eSxcbiAgYm9keToga0VudW1lcmFibGVQcm9wZXJ0eSxcbiAgYm9keVVzZWQ6IGtFbnVtZXJhYmxlUHJvcGVydHksXG4gIGlzSGlzdG9yeU5hdmlnYXRpb246IGtFbnVtZXJhYmxlUHJvcGVydHksXG4gIGlzUmVsb2FkTmF2aWdhdGlvbjoga0VudW1lcmFibGVQcm9wZXJ0eSxcbiAga2VlcGFsaXZlOiBrRW51bWVyYWJsZVByb3BlcnR5LFxuICBpbnRlZ3JpdHk6IGtFbnVtZXJhYmxlUHJvcGVydHksXG4gIGNhY2hlOiBrRW51bWVyYWJsZVByb3BlcnR5LFxuICBjcmVkZW50aWFsczoga0VudW1lcmFibGVQcm9wZXJ0eSxcbiAgYXR0cmlidXRlOiBrRW51bWVyYWJsZVByb3BlcnR5LFxuICByZWZlcnJlclBvbGljeToga0VudW1lcmFibGVQcm9wZXJ0eSxcbiAgcmVmZXJyZXI6IGtFbnVtZXJhYmxlUHJvcGVydHksXG4gIG1vZGU6IGtFbnVtZXJhYmxlUHJvcGVydHksXG4gIFtTeW1ib2wudG9TdHJpbmdUYWddOiB7XG4gICAgdmFsdWU6ICdSZXF1ZXN0JyxcbiAgICBjb25maWd1cmFibGU6IHRydWVcbiAgfVxufSlcblxud2ViaWRsLmNvbnZlcnRlcnMuUmVxdWVzdCA9IHdlYmlkbC5pbnRlcmZhY2VDb252ZXJ0ZXIoXG4gIFJlcXVlc3RcbilcblxuLy8gaHR0cHM6Ly9mZXRjaC5zcGVjLndoYXR3Zy5vcmcvI3JlcXVlc3RpbmZvXG53ZWJpZGwuY29udmVydGVycy5SZXF1ZXN0SW5mbyA9IGZ1bmN0aW9uIChWKSB7XG4gIGlmICh0eXBlb2YgViA9PT0gJ3N0cmluZycpIHtcbiAgICByZXR1cm4gd2ViaWRsLmNvbnZlcnRlcnMuVVNWU3RyaW5nKFYpXG4gIH1cblxuICBpZiAoViBpbnN0YW5jZW9mIFJlcXVlc3QpIHtcbiAgICByZXR1cm4gd2ViaWRsLmNvbnZlcnRlcnMuUmVxdWVzdChWKVxuICB9XG5cbiAgcmV0dXJuIHdlYmlkbC5jb252ZXJ0ZXJzLlVTVlN0cmluZyhWKVxufVxuXG53ZWJpZGwuY29udmVydGVycy5BYm9ydFNpZ25hbCA9IHdlYmlkbC5pbnRlcmZhY2VDb252ZXJ0ZXIoXG4gIEFib3J0U2lnbmFsXG4pXG5cbi8vIGh0dHBzOi8vZmV0Y2guc3BlYy53aGF0d2cub3JnLyNyZXF1ZXN0aW5pdFxud2ViaWRsLmNvbnZlcnRlcnMuUmVxdWVzdEluaXQgPSB3ZWJpZGwuZGljdGlvbmFyeUNvbnZlcnRlcihbXG4gIHtcbiAgICBrZXk6ICdtZXRob2QnLFxuICAgIGNvbnZlcnRlcjogd2ViaWRsLmNvbnZlcnRlcnMuQnl0ZVN0cmluZ1xuICB9LFxuICB7XG4gICAga2V5OiAnaGVhZGVycycsXG4gICAgY29udmVydGVyOiB3ZWJpZGwuY29udmVydGVycy5IZWFkZXJzSW5pdFxuICB9LFxuICB7XG4gICAga2V5OiAnYm9keScsXG4gICAgY29udmVydGVyOiB3ZWJpZGwubnVsbGFibGVDb252ZXJ0ZXIoXG4gICAgICB3ZWJpZGwuY29udmVydGVycy5Cb2R5SW5pdFxuICAgIClcbiAgfSxcbiAge1xuICAgIGtleTogJ3JlZmVycmVyJyxcbiAgICBjb252ZXJ0ZXI6IHdlYmlkbC5jb252ZXJ0ZXJzLlVTVlN0cmluZ1xuICB9LFxuICB7XG4gICAga2V5OiAncmVmZXJyZXJQb2xpY3knLFxuICAgIGNvbnZlcnRlcjogd2ViaWRsLmNvbnZlcnRlcnMuRE9NU3RyaW5nLFxuICAgIC8vIGh0dHBzOi8vdzNjLmdpdGh1Yi5pby93ZWJhcHBzZWMtcmVmZXJyZXItcG9saWN5LyNyZWZlcnJlci1wb2xpY3lcbiAgICBhbGxvd2VkVmFsdWVzOiByZWZlcnJlclBvbGljeVxuICB9LFxuICB7XG4gICAga2V5OiAnbW9kZScsXG4gICAgY29udmVydGVyOiB3ZWJpZGwuY29udmVydGVycy5ET01TdHJpbmcsXG4gICAgLy8gaHR0cHM6Ly9mZXRjaC5zcGVjLndoYXR3Zy5vcmcvI2NvbmNlcHQtcmVxdWVzdC1tb2RlXG4gICAgYWxsb3dlZFZhbHVlczogcmVxdWVzdE1vZGVcbiAgfSxcbiAge1xuICAgIGtleTogJ2NyZWRlbnRpYWxzJyxcbiAgICBjb252ZXJ0ZXI6IHdlYmlkbC5jb252ZXJ0ZXJzLkRPTVN0cmluZyxcbiAgICAvLyBodHRwczovL2ZldGNoLnNwZWMud2hhdHdnLm9yZy8jcmVxdWVzdGNyZWRlbnRpYWxzXG4gICAgYWxsb3dlZFZhbHVlczogcmVxdWVzdENyZWRlbnRpYWxzXG4gIH0sXG4gIHtcbiAgICBrZXk6ICdjYWNoZScsXG4gICAgY29udmVydGVyOiB3ZWJpZGwuY29udmVydGVycy5ET01TdHJpbmcsXG4gICAgLy8gaHR0cHM6Ly9mZXRjaC5zcGVjLndoYXR3Zy5vcmcvI3JlcXVlc3RjYWNoZVxuICAgIGFsbG93ZWRWYWx1ZXM6IHJlcXVlc3RDYWNoZVxuICB9LFxuICB7XG4gICAga2V5OiAncmVkaXJlY3QnLFxuICAgIGNvbnZlcnRlcjogd2ViaWRsLmNvbnZlcnRlcnMuRE9NU3RyaW5nLFxuICAgIC8vIGh0dHBzOi8vZmV0Y2guc3BlYy53aGF0d2cub3JnLyNyZXF1ZXN0cmVkaXJlY3RcbiAgICBhbGxvd2VkVmFsdWVzOiByZXF1ZXN0UmVkaXJlY3RcbiAgfSxcbiAge1xuICAgIGtleTogJ2ludGVncml0eScsXG4gICAgY29udmVydGVyOiB3ZWJpZGwuY29udmVydGVycy5ET01TdHJpbmdcbiAgfSxcbiAge1xuICAgIGtleTogJ2tlZXBhbGl2ZScsXG4gICAgY29udmVydGVyOiB3ZWJpZGwuY29udmVydGVycy5ib29sZWFuXG4gIH0sXG4gIHtcbiAgICBrZXk6ICdzaWduYWwnLFxuICAgIGNvbnZlcnRlcjogd2ViaWRsLm51bGxhYmxlQ29udmVydGVyKFxuICAgICAgKHNpZ25hbCkgPT4gd2ViaWRsLmNvbnZlcnRlcnMuQWJvcnRTaWduYWwoXG4gICAgICAgIHNpZ25hbCxcbiAgICAgICAgeyBzdHJpY3Q6IGZhbHNlIH1cbiAgICAgIClcbiAgICApXG4gIH0sXG4gIHtcbiAgICBrZXk6ICd3aW5kb3cnLFxuICAgIGNvbnZlcnRlcjogd2ViaWRsLmNvbnZlcnRlcnMuYW55XG4gIH0sXG4gIHtcbiAgICBrZXk6ICdkdXBsZXgnLFxuICAgIGNvbnZlcnRlcjogd2ViaWRsLmNvbnZlcnRlcnMuRE9NU3RyaW5nLFxuICAgIGFsbG93ZWRWYWx1ZXM6IHJlcXVlc3REdXBsZXhcbiAgfVxuXSlcblxubW9kdWxlLmV4cG9ydHMgPSB7IFJlcXVlc3QsIG1ha2VSZXF1ZXN0IH1cbiIsCiAgICAiLy8gaHR0cHM6Ly9naXRodWIuY29tL0V0aGFuLUFycm93b29kL3VuZGljaS1mZXRjaFxuXG4ndXNlIHN0cmljdCdcblxuY29uc3Qge1xuICBSZXNwb25zZSxcbiAgbWFrZU5ldHdvcmtFcnJvcixcbiAgbWFrZUFwcHJvcHJpYXRlTmV0d29ya0Vycm9yLFxuICBmaWx0ZXJSZXNwb25zZSxcbiAgbWFrZVJlc3BvbnNlXG59ID0gcmVxdWlyZSgnLi9yZXNwb25zZScpXG5jb25zdCB7IEhlYWRlcnMgfSA9IHJlcXVpcmUoJy4vaGVhZGVycycpXG5jb25zdCB7IFJlcXVlc3QsIG1ha2VSZXF1ZXN0IH0gPSByZXF1aXJlKCcuL3JlcXVlc3QnKVxuY29uc3QgemxpYiA9IHJlcXVpcmUoJ3psaWInKVxuY29uc3Qge1xuICBieXRlc01hdGNoLFxuICBtYWtlUG9saWN5Q29udGFpbmVyLFxuICBjbG9uZVBvbGljeUNvbnRhaW5lcixcbiAgcmVxdWVzdEJhZFBvcnQsXG4gIFRBT0NoZWNrLFxuICBhcHBlbmRSZXF1ZXN0T3JpZ2luSGVhZGVyLFxuICByZXNwb25zZUxvY2F0aW9uVVJMLFxuICByZXF1ZXN0Q3VycmVudFVSTCxcbiAgc2V0UmVxdWVzdFJlZmVycmVyUG9saWN5T25SZWRpcmVjdCxcbiAgdHJ5VXBncmFkZVJlcXVlc3RUb0FQb3RlbnRpYWxseVRydXN0d29ydGh5VVJMLFxuICBjcmVhdGVPcGFxdWVUaW1pbmdJbmZvLFxuICBhcHBlbmRGZXRjaE1ldGFkYXRhLFxuICBjb3JzQ2hlY2ssXG4gIGNyb3NzT3JpZ2luUmVzb3VyY2VQb2xpY3lDaGVjayxcbiAgZGV0ZXJtaW5lUmVxdWVzdHNSZWZlcnJlcixcbiAgY29hcnNlbmVkU2hhcmVkQ3VycmVudFRpbWUsXG4gIGNyZWF0ZURlZmVycmVkUHJvbWlzZSxcbiAgaXNCbG9iTGlrZSxcbiAgc2FtZU9yaWdpbixcbiAgaXNDYW5jZWxsZWQsXG4gIGlzQWJvcnRlZCxcbiAgaXNFcnJvckxpa2UsXG4gIGZ1bGx5UmVhZEJvZHksXG4gIHJlYWRhYmxlU3RyZWFtQ2xvc2UsXG4gIGlzb21vcnBoaWNFbmNvZGUsXG4gIHVybElzTG9jYWwsXG4gIHVybElzSHR0cEh0dHBzU2NoZW1lLFxuICB1cmxIYXNIdHRwc1NjaGVtZVxufSA9IHJlcXVpcmUoJy4vdXRpbCcpXG5jb25zdCB7IGtTdGF0ZSwga0hlYWRlcnMsIGtHdWFyZCwga1JlYWxtIH0gPSByZXF1aXJlKCcuL3N5bWJvbHMnKVxuY29uc3QgYXNzZXJ0ID0gcmVxdWlyZSgnYXNzZXJ0JylcbmNvbnN0IHsgc2FmZWx5RXh0cmFjdEJvZHkgfSA9IHJlcXVpcmUoJy4vYm9keScpXG5jb25zdCB7XG4gIHJlZGlyZWN0U3RhdHVzU2V0LFxuICBudWxsQm9keVN0YXR1cyxcbiAgc2FmZU1ldGhvZHNTZXQsXG4gIHJlcXVlc3RCb2R5SGVhZGVyLFxuICBzdWJyZXNvdXJjZVNldCxcbiAgRE9NRXhjZXB0aW9uXG59ID0gcmVxdWlyZSgnLi9jb25zdGFudHMnKVxuY29uc3QgeyBrSGVhZGVyc0xpc3QgfSA9IHJlcXVpcmUoJy4uL2NvcmUvc3ltYm9scycpXG5jb25zdCBFRSA9IHJlcXVpcmUoJ2V2ZW50cycpXG5jb25zdCB7IFJlYWRhYmxlLCBwaXBlbGluZSB9ID0gcmVxdWlyZSgnc3RyZWFtJylcbmNvbnN0IHsgYWRkQWJvcnRMaXN0ZW5lciwgaXNFcnJvcmVkLCBpc1JlYWRhYmxlLCBub2RlTWFqb3IsIG5vZGVNaW5vciB9ID0gcmVxdWlyZSgnLi4vY29yZS91dGlsJylcbmNvbnN0IHsgZGF0YVVSTFByb2Nlc3Nvciwgc2VyaWFsaXplQU1pbWVUeXBlIH0gPSByZXF1aXJlKCcuL2RhdGFVUkwnKVxuY29uc3QgeyBUcmFuc2Zvcm1TdHJlYW0gfSA9IHJlcXVpcmUoJ3N0cmVhbS93ZWInKVxuY29uc3QgeyBnZXRHbG9iYWxEaXNwYXRjaGVyIH0gPSByZXF1aXJlKCcuLi9nbG9iYWwnKVxuY29uc3QgeyB3ZWJpZGwgfSA9IHJlcXVpcmUoJy4vd2ViaWRsJylcbmNvbnN0IHsgU1RBVFVTX0NPREVTIH0gPSByZXF1aXJlKCdodHRwJylcbmNvbnN0IEdFVF9PUl9IRUFEID0gWydHRVQnLCAnSEVBRCddXG5cbi8qKiBAdHlwZSB7aW1wb3J0KCdidWZmZXInKS5yZXNvbHZlT2JqZWN0VVJMfSAqL1xubGV0IHJlc29sdmVPYmplY3RVUkxcbmxldCBSZWFkYWJsZVN0cmVhbSA9IGdsb2JhbFRoaXMuUmVhZGFibGVTdHJlYW1cblxuY2xhc3MgRmV0Y2ggZXh0ZW5kcyBFRSB7XG4gIGNvbnN0cnVjdG9yIChkaXNwYXRjaGVyKSB7XG4gICAgc3VwZXIoKVxuXG4gICAgdGhpcy5kaXNwYXRjaGVyID0gZGlzcGF0Y2hlclxuICAgIHRoaXMuY29ubmVjdGlvbiA9IG51bGxcbiAgICB0aGlzLmR1bXAgPSBmYWxzZVxuICAgIHRoaXMuc3RhdGUgPSAnb25nb2luZydcbiAgICAvLyAyIHRlcm1pbmF0ZWQgbGlzdGVuZXJzIGdldCBhZGRlZCBwZXIgcmVxdWVzdCxcbiAgICAvLyBidXQgb25seSAxIGdldHMgcmVtb3ZlZC4gSWYgdGhlcmUgYXJlIDIwIHJlZGlyZWN0cyxcbiAgICAvLyAyMSBsaXN0ZW5lcnMgd2lsbCBiZSBhZGRlZC5cbiAgICAvLyBTZWUgaHR0cHM6Ly9naXRodWIuY29tL25vZGVqcy91bmRpY2kvaXNzdWVzLzE3MTFcbiAgICAvLyBUT0RPIChmaXgpOiBGaW5kIGFuZCBmaXggcm9vdCBjYXVzZSBmb3IgbGVha2VkIGxpc3RlbmVyLlxuICAgIHRoaXMuc2V0TWF4TGlzdGVuZXJzKDIxKVxuICB9XG5cbiAgdGVybWluYXRlIChyZWFzb24pIHtcbiAgICBpZiAodGhpcy5zdGF0ZSAhPT0gJ29uZ29pbmcnKSB7XG4gICAgICByZXR1cm5cbiAgICB9XG5cbiAgICB0aGlzLnN0YXRlID0gJ3Rlcm1pbmF0ZWQnXG4gICAgdGhpcy5jb25uZWN0aW9uPy5kZXN0cm95KHJlYXNvbilcbiAgICB0aGlzLmVtaXQoJ3Rlcm1pbmF0ZWQnLCByZWFzb24pXG4gIH1cblxuICAvLyBodHRwczovL2ZldGNoLnNwZWMud2hhdHdnLm9yZy8jZmV0Y2gtY29udHJvbGxlci1hYm9ydFxuICBhYm9ydCAoZXJyb3IpIHtcbiAgICBpZiAodGhpcy5zdGF0ZSAhPT0gJ29uZ29pbmcnKSB7XG4gICAgICByZXR1cm5cbiAgICB9XG5cbiAgICAvLyAxLiBTZXQgY29udHJvbGxlcuKAmXMgc3RhdGUgdG8gXCJhYm9ydGVkXCIuXG4gICAgdGhpcy5zdGF0ZSA9ICdhYm9ydGVkJ1xuXG4gICAgLy8gMi4gTGV0IGZhbGxiYWNrRXJyb3IgYmUgYW4gXCJBYm9ydEVycm9yXCIgRE9NRXhjZXB0aW9uLlxuICAgIC8vIDMuIFNldCBlcnJvciB0byBmYWxsYmFja0Vycm9yIGlmIGl0IGlzIG5vdCBnaXZlbi5cbiAgICBpZiAoIWVycm9yKSB7XG4gICAgICBlcnJvciA9IG5ldyBET01FeGNlcHRpb24oJ1RoZSBvcGVyYXRpb24gd2FzIGFib3J0ZWQuJywgJ0Fib3J0RXJyb3InKVxuICAgIH1cblxuICAgIC8vIDQuIExldCBzZXJpYWxpemVkRXJyb3IgYmUgU3RydWN0dXJlZFNlcmlhbGl6ZShlcnJvcikuXG4gICAgLy8gICAgSWYgdGhhdCB0aHJldyBhbiBleGNlcHRpb24sIGNhdGNoIGl0LCBhbmQgbGV0XG4gICAgLy8gICAgc2VyaWFsaXplZEVycm9yIGJlIFN0cnVjdHVyZWRTZXJpYWxpemUoZmFsbGJhY2tFcnJvcikuXG5cbiAgICAvLyA1LiBTZXQgY29udHJvbGxlcuKAmXMgc2VyaWFsaXplZCBhYm9ydCByZWFzb24gdG8gc2VyaWFsaXplZEVycm9yLlxuICAgIHRoaXMuc2VyaWFsaXplZEFib3J0UmVhc29uID0gZXJyb3JcblxuICAgIHRoaXMuY29ubmVjdGlvbj8uZGVzdHJveShlcnJvcilcbiAgICB0aGlzLmVtaXQoJ3Rlcm1pbmF0ZWQnLCBlcnJvcilcbiAgfVxufVxuXG4vLyBodHRwczovL2ZldGNoLnNwZWMud2hhdHdnLm9yZy8jZmV0Y2gtbWV0aG9kXG5mdW5jdGlvbiBmZXRjaCAoaW5wdXQsIGluaXQgPSB7fSkge1xuICB3ZWJpZGwuYXJndW1lbnRMZW5ndGhDaGVjayhhcmd1bWVudHMsIDEsIHsgaGVhZGVyOiAnZ2xvYmFsVGhpcy5mZXRjaCcgfSlcblxuICAvLyAxLiBMZXQgcCBiZSBhIG5ldyBwcm9taXNlLlxuICBjb25zdCBwID0gY3JlYXRlRGVmZXJyZWRQcm9taXNlKClcblxuICAvLyAyLiBMZXQgcmVxdWVzdE9iamVjdCBiZSB0aGUgcmVzdWx0IG9mIGludm9raW5nIHRoZSBpbml0aWFsIHZhbHVlIG9mXG4gIC8vIFJlcXVlc3QgYXMgY29uc3RydWN0b3Igd2l0aCBpbnB1dCBhbmQgaW5pdCBhcyBhcmd1bWVudHMuIElmIHRoaXMgdGhyb3dzXG4gIC8vIGFuIGV4Y2VwdGlvbiwgcmVqZWN0IHAgd2l0aCBpdCBhbmQgcmV0dXJuIHAuXG4gIGxldCByZXF1ZXN0T2JqZWN0XG5cbiAgdHJ5IHtcbiAgICByZXF1ZXN0T2JqZWN0ID0gbmV3IFJlcXVlc3QoaW5wdXQsIGluaXQpXG4gIH0gY2F0Y2ggKGUpIHtcbiAgICBwLnJlamVjdChlKVxuICAgIHJldHVybiBwLnByb21pc2VcbiAgfVxuXG4gIC8vIDMuIExldCByZXF1ZXN0IGJlIHJlcXVlc3RPYmplY3TigJlzIHJlcXVlc3QuXG4gIGNvbnN0IHJlcXVlc3QgPSByZXF1ZXN0T2JqZWN0W2tTdGF0ZV1cblxuICAvLyA0LiBJZiByZXF1ZXN0T2JqZWN04oCZcyBzaWduYWzigJlzIGFib3J0ZWQgZmxhZyBpcyBzZXQsIHRoZW46XG4gIGlmIChyZXF1ZXN0T2JqZWN0LnNpZ25hbC5hYm9ydGVkKSB7XG4gICAgLy8gMS4gQWJvcnQgdGhlIGZldGNoKCkgY2FsbCB3aXRoIHAsIHJlcXVlc3QsIG51bGwsIGFuZFxuICAgIC8vICAgIHJlcXVlc3RPYmplY3TigJlzIHNpZ25hbOKAmXMgYWJvcnQgcmVhc29uLlxuICAgIGFib3J0RmV0Y2gocCwgcmVxdWVzdCwgbnVsbCwgcmVxdWVzdE9iamVjdC5zaWduYWwucmVhc29uKVxuXG4gICAgLy8gMi4gUmV0dXJuIHAuXG4gICAgcmV0dXJuIHAucHJvbWlzZVxuICB9XG5cbiAgLy8gNS4gTGV0IGdsb2JhbE9iamVjdCBiZSByZXF1ZXN04oCZcyBjbGllbnTigJlzIGdsb2JhbCBvYmplY3QuXG4gIGNvbnN0IGdsb2JhbE9iamVjdCA9IHJlcXVlc3QuY2xpZW50Lmdsb2JhbE9iamVjdFxuXG4gIC8vIDYuIElmIGdsb2JhbE9iamVjdCBpcyBhIFNlcnZpY2VXb3JrZXJHbG9iYWxTY29wZSBvYmplY3QsIHRoZW4gc2V0XG4gIC8vIHJlcXVlc3TigJlzIHNlcnZpY2Utd29ya2VycyBtb2RlIHRvIFwibm9uZVwiLlxuICBpZiAoZ2xvYmFsT2JqZWN0Py5jb25zdHJ1Y3Rvcj8ubmFtZSA9PT0gJ1NlcnZpY2VXb3JrZXJHbG9iYWxTY29wZScpIHtcbiAgICByZXF1ZXN0LnNlcnZpY2VXb3JrZXJzID0gJ25vbmUnXG4gIH1cblxuICAvLyA3LiBMZXQgcmVzcG9uc2VPYmplY3QgYmUgbnVsbC5cbiAgbGV0IHJlc3BvbnNlT2JqZWN0ID0gbnVsbFxuXG4gIC8vIDguIExldCByZWxldmFudFJlYWxtIGJlIHRoaXPigJlzIHJlbGV2YW50IFJlYWxtLlxuICBjb25zdCByZWxldmFudFJlYWxtID0gbnVsbFxuXG4gIC8vIDkuIExldCBsb2NhbGx5QWJvcnRlZCBiZSBmYWxzZS5cbiAgbGV0IGxvY2FsbHlBYm9ydGVkID0gZmFsc2VcblxuICAvLyAxMC4gTGV0IGNvbnRyb2xsZXIgYmUgbnVsbC5cbiAgbGV0IGNvbnRyb2xsZXIgPSBudWxsXG5cbiAgLy8gMTEuIEFkZCB0aGUgZm9sbG93aW5nIGFib3J0IHN0ZXBzIHRvIHJlcXVlc3RPYmplY3TigJlzIHNpZ25hbDpcbiAgYWRkQWJvcnRMaXN0ZW5lcihcbiAgICByZXF1ZXN0T2JqZWN0LnNpZ25hbCxcbiAgICAoKSA9PiB7XG4gICAgICAvLyAxLiBTZXQgbG9jYWxseUFib3J0ZWQgdG8gdHJ1ZS5cbiAgICAgIGxvY2FsbHlBYm9ydGVkID0gdHJ1ZVxuXG4gICAgICAvLyAyLiBBc3NlcnQ6IGNvbnRyb2xsZXIgaXMgbm9uLW51bGwuXG4gICAgICBhc3NlcnQoY29udHJvbGxlciAhPSBudWxsKVxuXG4gICAgICAvLyAzLiBBYm9ydCBjb250cm9sbGVyIHdpdGggcmVxdWVzdE9iamVjdOKAmXMgc2lnbmFs4oCZcyBhYm9ydCByZWFzb24uXG4gICAgICBjb250cm9sbGVyLmFib3J0KHJlcXVlc3RPYmplY3Quc2lnbmFsLnJlYXNvbilcblxuICAgICAgLy8gNC4gQWJvcnQgdGhlIGZldGNoKCkgY2FsbCB3aXRoIHAsIHJlcXVlc3QsIHJlc3BvbnNlT2JqZWN0LFxuICAgICAgLy8gICAgYW5kIHJlcXVlc3RPYmplY3TigJlzIHNpZ25hbOKAmXMgYWJvcnQgcmVhc29uLlxuICAgICAgYWJvcnRGZXRjaChwLCByZXF1ZXN0LCByZXNwb25zZU9iamVjdCwgcmVxdWVzdE9iamVjdC5zaWduYWwucmVhc29uKVxuICAgIH1cbiAgKVxuXG4gIC8vIDEyLiBMZXQgaGFuZGxlRmV0Y2hEb25lIGdpdmVuIHJlc3BvbnNlIHJlc3BvbnNlIGJlIHRvIGZpbmFsaXplIGFuZFxuICAvLyByZXBvcnQgdGltaW5nIHdpdGggcmVzcG9uc2UsIGdsb2JhbE9iamVjdCwgYW5kIFwiZmV0Y2hcIi5cbiAgY29uc3QgaGFuZGxlRmV0Y2hEb25lID0gKHJlc3BvbnNlKSA9PlxuICAgIGZpbmFsaXplQW5kUmVwb3J0VGltaW5nKHJlc3BvbnNlLCAnZmV0Y2gnKVxuXG4gIC8vIDEzLiBTZXQgY29udHJvbGxlciB0byB0aGUgcmVzdWx0IG9mIGNhbGxpbmcgZmV0Y2ggZ2l2ZW4gcmVxdWVzdCxcbiAgLy8gd2l0aCBwcm9jZXNzUmVzcG9uc2VFbmRPZkJvZHkgc2V0IHRvIGhhbmRsZUZldGNoRG9uZSwgYW5kIHByb2Nlc3NSZXNwb25zZVxuICAvLyBnaXZlbiByZXNwb25zZSBiZWluZyB0aGVzZSBzdWJzdGVwczpcblxuICBjb25zdCBwcm9jZXNzUmVzcG9uc2UgPSAocmVzcG9uc2UpID0+IHtcbiAgICAvLyAxLiBJZiBsb2NhbGx5QWJvcnRlZCBpcyB0cnVlLCB0ZXJtaW5hdGUgdGhlc2Ugc3Vic3RlcHMuXG4gICAgaWYgKGxvY2FsbHlBYm9ydGVkKSB7XG4gICAgICByZXR1cm4gUHJvbWlzZS5yZXNvbHZlKClcbiAgICB9XG5cbiAgICAvLyAyLiBJZiByZXNwb25zZeKAmXMgYWJvcnRlZCBmbGFnIGlzIHNldCwgdGhlbjpcbiAgICBpZiAocmVzcG9uc2UuYWJvcnRlZCkge1xuICAgICAgLy8gMS4gTGV0IGRlc2VyaWFsaXplZEVycm9yIGJlIHRoZSByZXN1bHQgb2YgZGVzZXJpYWxpemUgYSBzZXJpYWxpemVkXG4gICAgICAvLyAgICBhYm9ydCByZWFzb24gZ2l2ZW4gY29udHJvbGxlcuKAmXMgc2VyaWFsaXplZCBhYm9ydCByZWFzb24gYW5kXG4gICAgICAvLyAgICByZWxldmFudFJlYWxtLlxuXG4gICAgICAvLyAyLiBBYm9ydCB0aGUgZmV0Y2goKSBjYWxsIHdpdGggcCwgcmVxdWVzdCwgcmVzcG9uc2VPYmplY3QsIGFuZFxuICAgICAgLy8gICAgZGVzZXJpYWxpemVkRXJyb3IuXG5cbiAgICAgIGFib3J0RmV0Y2gocCwgcmVxdWVzdCwgcmVzcG9uc2VPYmplY3QsIGNvbnRyb2xsZXIuc2VyaWFsaXplZEFib3J0UmVhc29uKVxuICAgICAgcmV0dXJuIFByb21pc2UucmVzb2x2ZSgpXG4gICAgfVxuXG4gICAgLy8gMy4gSWYgcmVzcG9uc2UgaXMgYSBuZXR3b3JrIGVycm9yLCB0aGVuIHJlamVjdCBwIHdpdGggYSBUeXBlRXJyb3JcbiAgICAvLyBhbmQgdGVybWluYXRlIHRoZXNlIHN1YnN0ZXBzLlxuICAgIGlmIChyZXNwb25zZS50eXBlID09PSAnZXJyb3InKSB7XG4gICAgICBwLnJlamVjdChcbiAgICAgICAgT2JqZWN0LmFzc2lnbihuZXcgVHlwZUVycm9yKCdmZXRjaCBmYWlsZWQnKSwgeyBjYXVzZTogcmVzcG9uc2UuZXJyb3IgfSlcbiAgICAgIClcbiAgICAgIHJldHVybiBQcm9taXNlLnJlc29sdmUoKVxuICAgIH1cblxuICAgIC8vIDQuIFNldCByZXNwb25zZU9iamVjdCB0byB0aGUgcmVzdWx0IG9mIGNyZWF0aW5nIGEgUmVzcG9uc2Ugb2JqZWN0LFxuICAgIC8vIGdpdmVuIHJlc3BvbnNlLCBcImltbXV0YWJsZVwiLCBhbmQgcmVsZXZhbnRSZWFsbS5cbiAgICByZXNwb25zZU9iamVjdCA9IG5ldyBSZXNwb25zZSgpXG4gICAgcmVzcG9uc2VPYmplY3Rba1N0YXRlXSA9IHJlc3BvbnNlXG4gICAgcmVzcG9uc2VPYmplY3Rba1JlYWxtXSA9IHJlbGV2YW50UmVhbG1cbiAgICByZXNwb25zZU9iamVjdFtrSGVhZGVyc11ba0hlYWRlcnNMaXN0XSA9IHJlc3BvbnNlLmhlYWRlcnNMaXN0XG4gICAgcmVzcG9uc2VPYmplY3Rba0hlYWRlcnNdW2tHdWFyZF0gPSAnaW1tdXRhYmxlJ1xuICAgIHJlc3BvbnNlT2JqZWN0W2tIZWFkZXJzXVtrUmVhbG1dID0gcmVsZXZhbnRSZWFsbVxuXG4gICAgLy8gNS4gUmVzb2x2ZSBwIHdpdGggcmVzcG9uc2VPYmplY3QuXG4gICAgcC5yZXNvbHZlKHJlc3BvbnNlT2JqZWN0KVxuICB9XG5cbiAgY29udHJvbGxlciA9IGZldGNoaW5nKHtcbiAgICByZXF1ZXN0LFxuICAgIHByb2Nlc3NSZXNwb25zZUVuZE9mQm9keTogaGFuZGxlRmV0Y2hEb25lLFxuICAgIHByb2Nlc3NSZXNwb25zZSxcbiAgICBkaXNwYXRjaGVyOiBpbml0LmRpc3BhdGNoZXIgPz8gZ2V0R2xvYmFsRGlzcGF0Y2hlcigpIC8vIHVuZGljaVxuICB9KVxuXG4gIC8vIDE0LiBSZXR1cm4gcC5cbiAgcmV0dXJuIHAucHJvbWlzZVxufVxuXG4vLyBodHRwczovL2ZldGNoLnNwZWMud2hhdHdnLm9yZy8jZmluYWxpemUtYW5kLXJlcG9ydC10aW1pbmdcbmZ1bmN0aW9uIGZpbmFsaXplQW5kUmVwb3J0VGltaW5nIChyZXNwb25zZSwgaW5pdGlhdG9yVHlwZSA9ICdvdGhlcicpIHtcbiAgLy8gMS4gSWYgcmVzcG9uc2UgaXMgYW4gYWJvcnRlZCBuZXR3b3JrIGVycm9yLCB0aGVuIHJldHVybi5cbiAgaWYgKHJlc3BvbnNlLnR5cGUgPT09ICdlcnJvcicgJiYgcmVzcG9uc2UuYWJvcnRlZCkge1xuICAgIHJldHVyblxuICB9XG5cbiAgLy8gMi4gSWYgcmVzcG9uc2XigJlzIFVSTCBsaXN0IGlzIG51bGwgb3IgZW1wdHksIHRoZW4gcmV0dXJuLlxuICBpZiAoIXJlc3BvbnNlLnVybExpc3Q/Lmxlbmd0aCkge1xuICAgIHJldHVyblxuICB9XG5cbiAgLy8gMy4gTGV0IG9yaWdpbmFsVVJMIGJlIHJlc3BvbnNl4oCZcyBVUkwgbGlzdFswXS5cbiAgY29uc3Qgb3JpZ2luYWxVUkwgPSByZXNwb25zZS51cmxMaXN0WzBdXG5cbiAgLy8gNC4gTGV0IHRpbWluZ0luZm8gYmUgcmVzcG9uc2XigJlzIHRpbWluZyBpbmZvLlxuICBsZXQgdGltaW5nSW5mbyA9IHJlc3BvbnNlLnRpbWluZ0luZm9cblxuICAvLyA1LiBMZXQgY2FjaGVTdGF0ZSBiZSByZXNwb25zZeKAmXMgY2FjaGUgc3RhdGUuXG4gIGxldCBjYWNoZVN0YXRlID0gcmVzcG9uc2UuY2FjaGVTdGF0ZVxuXG4gIC8vIDYuIElmIG9yaWdpbmFsVVJM4oCZcyBzY2hlbWUgaXMgbm90IGFuIEhUVFAoUykgc2NoZW1lLCB0aGVuIHJldHVybi5cbiAgaWYgKCF1cmxJc0h0dHBIdHRwc1NjaGVtZShvcmlnaW5hbFVSTCkpIHtcbiAgICByZXR1cm5cbiAgfVxuXG4gIC8vIDcuIElmIHRpbWluZ0luZm8gaXMgbnVsbCwgdGhlbiByZXR1cm4uXG4gIGlmICh0aW1pbmdJbmZvID09PSBudWxsKSB7XG4gICAgcmV0dXJuXG4gIH1cblxuICAvLyA4LiBJZiByZXNwb25zZeKAmXMgdGltaW5nIGFsbG93IHBhc3NlZCBmbGFnIGlzIG5vdCBzZXQsIHRoZW46XG4gIGlmICghcmVzcG9uc2UudGltaW5nQWxsb3dQYXNzZWQpIHtcbiAgICAvLyAgMS4gU2V0IHRpbWluZ0luZm8gdG8gYSB0aGUgcmVzdWx0IG9mIGNyZWF0aW5nIGFuIG9wYXF1ZSB0aW1pbmcgaW5mbyBmb3IgdGltaW5nSW5mby5cbiAgICB0aW1pbmdJbmZvID0gY3JlYXRlT3BhcXVlVGltaW5nSW5mbyh7XG4gICAgICBzdGFydFRpbWU6IHRpbWluZ0luZm8uc3RhcnRUaW1lXG4gICAgfSlcblxuICAgIC8vICAyLiBTZXQgY2FjaGVTdGF0ZSB0byB0aGUgZW1wdHkgc3RyaW5nLlxuICAgIGNhY2hlU3RhdGUgPSAnJ1xuICB9XG5cbiAgLy8gOS4gU2V0IHRpbWluZ0luZm/igJlzIGVuZCB0aW1lIHRvIHRoZSBjb2Fyc2VuZWQgc2hhcmVkIGN1cnJlbnQgdGltZVxuICAvLyBnaXZlbiBnbG9iYWzigJlzIHJlbGV2YW50IHNldHRpbmdzIG9iamVjdOKAmXMgY3Jvc3Mtb3JpZ2luIGlzb2xhdGVkXG4gIC8vIGNhcGFiaWxpdHkuXG4gIC8vIFRPRE86IGdpdmVuIGdsb2JhbOKAmXMgcmVsZXZhbnQgc2V0dGluZ3Mgb2JqZWN04oCZcyBjcm9zcy1vcmlnaW4gaXNvbGF0ZWRcbiAgLy8gY2FwYWJpbGl0eT9cbiAgdGltaW5nSW5mby5lbmRUaW1lID0gY29hcnNlbmVkU2hhcmVkQ3VycmVudFRpbWUoKVxuXG4gIC8vIDEwLiBTZXQgcmVzcG9uc2XigJlzIHRpbWluZyBpbmZvIHRvIHRpbWluZ0luZm8uXG4gIHJlc3BvbnNlLnRpbWluZ0luZm8gPSB0aW1pbmdJbmZvXG5cbiAgLy8gMTEuIE1hcmsgcmVzb3VyY2UgdGltaW5nIGZvciB0aW1pbmdJbmZvLCBvcmlnaW5hbFVSTCwgaW5pdGlhdG9yVHlwZSxcbiAgLy8gZ2xvYmFsLCBhbmQgY2FjaGVTdGF0ZS5cbiAgbWFya1Jlc291cmNlVGltaW5nKFxuICAgIHRpbWluZ0luZm8sXG4gICAgb3JpZ2luYWxVUkwsXG4gICAgaW5pdGlhdG9yVHlwZSxcbiAgICBnbG9iYWxUaGlzLFxuICAgIGNhY2hlU3RhdGVcbiAgKVxufVxuXG4vLyBodHRwczovL3czYy5naXRodWIuaW8vcmVzb3VyY2UtdGltaW5nLyNkZm4tbWFyay1yZXNvdXJjZS10aW1pbmdcbmZ1bmN0aW9uIG1hcmtSZXNvdXJjZVRpbWluZyAodGltaW5nSW5mbywgb3JpZ2luYWxVUkwsIGluaXRpYXRvclR5cGUsIGdsb2JhbFRoaXMsIGNhY2hlU3RhdGUpIHtcbiAgaWYgKG5vZGVNYWpvciA+IDE4IHx8IChub2RlTWFqb3IgPT09IDE4ICYmIG5vZGVNaW5vciA+PSAyKSkge1xuICAgIHBlcmZvcm1hbmNlLm1hcmtSZXNvdXJjZVRpbWluZyh0aW1pbmdJbmZvLCBvcmlnaW5hbFVSTC5ocmVmLCBpbml0aWF0b3JUeXBlLCBnbG9iYWxUaGlzLCBjYWNoZVN0YXRlKVxuICB9XG59XG5cbi8vIGh0dHBzOi8vZmV0Y2guc3BlYy53aGF0d2cub3JnLyNhYm9ydC1mZXRjaFxuZnVuY3Rpb24gYWJvcnRGZXRjaCAocCwgcmVxdWVzdCwgcmVzcG9uc2VPYmplY3QsIGVycm9yKSB7XG4gIC8vIE5vdGU6IEFib3J0U2lnbmFsLnJlYXNvbiB3YXMgYWRkZWQgaW4gbm9kZSB2MTcuMi4wXG4gIC8vIHdoaWNoIHdvdWxkIGdpdmUgdXMgYW4gdW5kZWZpbmVkIGVycm9yIHRvIHJlamVjdCB3aXRoLlxuICAvLyBSZW1vdmUgdGhpcyBvbmNlIG5vZGUgdjE2IGlzIG5vIGxvbmdlciBzdXBwb3J0ZWQuXG4gIGlmICghZXJyb3IpIHtcbiAgICBlcnJvciA9IG5ldyBET01FeGNlcHRpb24oJ1RoZSBvcGVyYXRpb24gd2FzIGFib3J0ZWQuJywgJ0Fib3J0RXJyb3InKVxuICB9XG5cbiAgLy8gMS4gUmVqZWN0IHByb21pc2Ugd2l0aCBlcnJvci5cbiAgcC5yZWplY3QoZXJyb3IpXG5cbiAgLy8gMi4gSWYgcmVxdWVzdOKAmXMgYm9keSBpcyBub3QgbnVsbCBhbmQgaXMgcmVhZGFibGUsIHRoZW4gY2FuY2VsIHJlcXVlc3TigJlzXG4gIC8vIGJvZHkgd2l0aCBlcnJvci5cbiAgaWYgKHJlcXVlc3QuYm9keSAhPSBudWxsICYmIGlzUmVhZGFibGUocmVxdWVzdC5ib2R5Py5zdHJlYW0pKSB7XG4gICAgcmVxdWVzdC5ib2R5LnN0cmVhbS5jYW5jZWwoZXJyb3IpLmNhdGNoKChlcnIpID0+IHtcbiAgICAgIGlmIChlcnIuY29kZSA9PT0gJ0VSUl9JTlZBTElEX1NUQVRFJykge1xuICAgICAgICAvLyBOb2RlIGJ1Zz9cbiAgICAgICAgcmV0dXJuXG4gICAgICB9XG4gICAgICB0aHJvdyBlcnJcbiAgICB9KVxuICB9XG5cbiAgLy8gMy4gSWYgcmVzcG9uc2VPYmplY3QgaXMgbnVsbCwgdGhlbiByZXR1cm4uXG4gIGlmIChyZXNwb25zZU9iamVjdCA9PSBudWxsKSB7XG4gICAgcmV0dXJuXG4gIH1cblxuICAvLyA0LiBMZXQgcmVzcG9uc2UgYmUgcmVzcG9uc2VPYmplY3TigJlzIHJlc3BvbnNlLlxuICBjb25zdCByZXNwb25zZSA9IHJlc3BvbnNlT2JqZWN0W2tTdGF0ZV1cblxuICAvLyA1LiBJZiByZXNwb25zZeKAmXMgYm9keSBpcyBub3QgbnVsbCBhbmQgaXMgcmVhZGFibGUsIHRoZW4gZXJyb3IgcmVzcG9uc2XigJlzXG4gIC8vIGJvZHkgd2l0aCBlcnJvci5cbiAgaWYgKHJlc3BvbnNlLmJvZHkgIT0gbnVsbCAmJiBpc1JlYWRhYmxlKHJlc3BvbnNlLmJvZHk/LnN0cmVhbSkpIHtcbiAgICByZXNwb25zZS5ib2R5LnN0cmVhbS5jYW5jZWwoZXJyb3IpLmNhdGNoKChlcnIpID0+IHtcbiAgICAgIGlmIChlcnIuY29kZSA9PT0gJ0VSUl9JTlZBTElEX1NUQVRFJykge1xuICAgICAgICAvLyBOb2RlIGJ1Zz9cbiAgICAgICAgcmV0dXJuXG4gICAgICB9XG4gICAgICB0aHJvdyBlcnJcbiAgICB9KVxuICB9XG59XG5cbi8vIGh0dHBzOi8vZmV0Y2guc3BlYy53aGF0d2cub3JnLyNmZXRjaGluZ1xuZnVuY3Rpb24gZmV0Y2hpbmcgKHtcbiAgcmVxdWVzdCxcbiAgcHJvY2Vzc1JlcXVlc3RCb2R5Q2h1bmtMZW5ndGgsXG4gIHByb2Nlc3NSZXF1ZXN0RW5kT2ZCb2R5LFxuICBwcm9jZXNzUmVzcG9uc2UsXG4gIHByb2Nlc3NSZXNwb25zZUVuZE9mQm9keSxcbiAgcHJvY2Vzc1Jlc3BvbnNlQ29uc3VtZUJvZHksXG4gIHVzZVBhcmFsbGVsUXVldWUgPSBmYWxzZSxcbiAgZGlzcGF0Y2hlciAvLyB1bmRpY2lcbn0pIHtcbiAgLy8gMS4gTGV0IHRhc2tEZXN0aW5hdGlvbiBiZSBudWxsLlxuICBsZXQgdGFza0Rlc3RpbmF0aW9uID0gbnVsbFxuXG4gIC8vIDIuIExldCBjcm9zc09yaWdpbklzb2xhdGVkQ2FwYWJpbGl0eSBiZSBmYWxzZS5cbiAgbGV0IGNyb3NzT3JpZ2luSXNvbGF0ZWRDYXBhYmlsaXR5ID0gZmFsc2VcblxuICAvLyAzLiBJZiByZXF1ZXN04oCZcyBjbGllbnQgaXMgbm9uLW51bGwsIHRoZW46XG4gIGlmIChyZXF1ZXN0LmNsaWVudCAhPSBudWxsKSB7XG4gICAgLy8gMS4gU2V0IHRhc2tEZXN0aW5hdGlvbiB0byByZXF1ZXN04oCZcyBjbGllbnTigJlzIGdsb2JhbCBvYmplY3QuXG4gICAgdGFza0Rlc3RpbmF0aW9uID0gcmVxdWVzdC5jbGllbnQuZ2xvYmFsT2JqZWN0XG5cbiAgICAvLyAyLiBTZXQgY3Jvc3NPcmlnaW5Jc29sYXRlZENhcGFiaWxpdHkgdG8gcmVxdWVzdOKAmXMgY2xpZW504oCZcyBjcm9zcy1vcmlnaW5cbiAgICAvLyBpc29sYXRlZCBjYXBhYmlsaXR5LlxuICAgIGNyb3NzT3JpZ2luSXNvbGF0ZWRDYXBhYmlsaXR5ID1cbiAgICAgIHJlcXVlc3QuY2xpZW50LmNyb3NzT3JpZ2luSXNvbGF0ZWRDYXBhYmlsaXR5XG4gIH1cblxuICAvLyA0LiBJZiB1c2VQYXJhbGxlbFF1ZXVlIGlzIHRydWUsIHRoZW4gc2V0IHRhc2tEZXN0aW5hdGlvbiB0byB0aGUgcmVzdWx0IG9mXG4gIC8vIHN0YXJ0aW5nIGEgbmV3IHBhcmFsbGVsIHF1ZXVlLlxuICAvLyBUT0RPXG5cbiAgLy8gNS4gTGV0IHRpbWluZ0luZm8gYmUgYSBuZXcgZmV0Y2ggdGltaW5nIGluZm8gd2hvc2Ugc3RhcnQgdGltZSBhbmRcbiAgLy8gcG9zdC1yZWRpcmVjdCBzdGFydCB0aW1lIGFyZSB0aGUgY29hcnNlbmVkIHNoYXJlZCBjdXJyZW50IHRpbWUgZ2l2ZW5cbiAgLy8gY3Jvc3NPcmlnaW5Jc29sYXRlZENhcGFiaWxpdHkuXG4gIGNvbnN0IGN1cnJlblRpbWUgPSBjb2Fyc2VuZWRTaGFyZWRDdXJyZW50VGltZShjcm9zc09yaWdpbklzb2xhdGVkQ2FwYWJpbGl0eSlcbiAgY29uc3QgdGltaW5nSW5mbyA9IGNyZWF0ZU9wYXF1ZVRpbWluZ0luZm8oe1xuICAgIHN0YXJ0VGltZTogY3VycmVuVGltZVxuICB9KVxuXG4gIC8vIDYuIExldCBmZXRjaFBhcmFtcyBiZSBhIG5ldyBmZXRjaCBwYXJhbXMgd2hvc2VcbiAgLy8gcmVxdWVzdCBpcyByZXF1ZXN0LFxuICAvLyB0aW1pbmcgaW5mbyBpcyB0aW1pbmdJbmZvLFxuICAvLyBwcm9jZXNzIHJlcXVlc3QgYm9keSBjaHVuayBsZW5ndGggaXMgcHJvY2Vzc1JlcXVlc3RCb2R5Q2h1bmtMZW5ndGgsXG4gIC8vIHByb2Nlc3MgcmVxdWVzdCBlbmQtb2YtYm9keSBpcyBwcm9jZXNzUmVxdWVzdEVuZE9mQm9keSxcbiAgLy8gcHJvY2VzcyByZXNwb25zZSBpcyBwcm9jZXNzUmVzcG9uc2UsXG4gIC8vIHByb2Nlc3MgcmVzcG9uc2UgY29uc3VtZSBib2R5IGlzIHByb2Nlc3NSZXNwb25zZUNvbnN1bWVCb2R5LFxuICAvLyBwcm9jZXNzIHJlc3BvbnNlIGVuZC1vZi1ib2R5IGlzIHByb2Nlc3NSZXNwb25zZUVuZE9mQm9keSxcbiAgLy8gdGFzayBkZXN0aW5hdGlvbiBpcyB0YXNrRGVzdGluYXRpb24sXG4gIC8vIGFuZCBjcm9zcy1vcmlnaW4gaXNvbGF0ZWQgY2FwYWJpbGl0eSBpcyBjcm9zc09yaWdpbklzb2xhdGVkQ2FwYWJpbGl0eS5cbiAgY29uc3QgZmV0Y2hQYXJhbXMgPSB7XG4gICAgY29udHJvbGxlcjogbmV3IEZldGNoKGRpc3BhdGNoZXIpLFxuICAgIHJlcXVlc3QsXG4gICAgdGltaW5nSW5mbyxcbiAgICBwcm9jZXNzUmVxdWVzdEJvZHlDaHVua0xlbmd0aCxcbiAgICBwcm9jZXNzUmVxdWVzdEVuZE9mQm9keSxcbiAgICBwcm9jZXNzUmVzcG9uc2UsXG4gICAgcHJvY2Vzc1Jlc3BvbnNlQ29uc3VtZUJvZHksXG4gICAgcHJvY2Vzc1Jlc3BvbnNlRW5kT2ZCb2R5LFxuICAgIHRhc2tEZXN0aW5hdGlvbixcbiAgICBjcm9zc09yaWdpbklzb2xhdGVkQ2FwYWJpbGl0eVxuICB9XG5cbiAgLy8gNy4gSWYgcmVxdWVzdOKAmXMgYm9keSBpcyBhIGJ5dGUgc2VxdWVuY2UsIHRoZW4gc2V0IHJlcXVlc3TigJlzIGJvZHkgdG9cbiAgLy8gICAgcmVxdWVzdOKAmXMgYm9keSBhcyBhIGJvZHkuXG4gIC8vIE5PVEU6IFNpbmNlIGZldGNoaW5nIGlzIG9ubHkgY2FsbGVkIGZyb20gZmV0Y2gsIGJvZHkgc2hvdWxkIGFscmVhZHkgYmVcbiAgLy8gZXh0cmFjdGVkLlxuICBhc3NlcnQoIXJlcXVlc3QuYm9keSB8fCByZXF1ZXN0LmJvZHkuc3RyZWFtKVxuXG4gIC8vIDguIElmIHJlcXVlc3TigJlzIHdpbmRvdyBpcyBcImNsaWVudFwiLCB0aGVuIHNldCByZXF1ZXN04oCZcyB3aW5kb3cgdG8gcmVxdWVzdOKAmXNcbiAgLy8gY2xpZW50LCBpZiByZXF1ZXN04oCZcyBjbGllbnTigJlzIGdsb2JhbCBvYmplY3QgaXMgYSBXaW5kb3cgb2JqZWN0OyBvdGhlcndpc2VcbiAgLy8gXCJuby13aW5kb3dcIi5cbiAgaWYgKHJlcXVlc3Qud2luZG93ID09PSAnY2xpZW50Jykge1xuICAgIC8vIFRPRE86IFdoYXQgaWYgcmVxdWVzdC5jbGllbnQgaXMgbnVsbD9cbiAgICByZXF1ZXN0LndpbmRvdyA9XG4gICAgICByZXF1ZXN0LmNsaWVudD8uZ2xvYmFsT2JqZWN0Py5jb25zdHJ1Y3Rvcj8ubmFtZSA9PT0gJ1dpbmRvdydcbiAgICAgICAgPyByZXF1ZXN0LmNsaWVudFxuICAgICAgICA6ICduby13aW5kb3cnXG4gIH1cblxuICAvLyA5LiBJZiByZXF1ZXN04oCZcyBvcmlnaW4gaXMgXCJjbGllbnRcIiwgdGhlbiBzZXQgcmVxdWVzdOKAmXMgb3JpZ2luIHRvIHJlcXVlc3TigJlzXG4gIC8vIGNsaWVudOKAmXMgb3JpZ2luLlxuICBpZiAocmVxdWVzdC5vcmlnaW4gPT09ICdjbGllbnQnKSB7XG4gICAgLy8gVE9ETzogV2hhdCBpZiByZXF1ZXN0LmNsaWVudCBpcyBudWxsP1xuICAgIHJlcXVlc3Qub3JpZ2luID0gcmVxdWVzdC5jbGllbnQ/Lm9yaWdpblxuICB9XG5cbiAgLy8gMTAuIElmIGFsbCBvZiB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlIHRydWU6XG4gIC8vIFRPRE9cblxuICAvLyAxMS4gSWYgcmVxdWVzdOKAmXMgcG9saWN5IGNvbnRhaW5lciBpcyBcImNsaWVudFwiLCB0aGVuOlxuICBpZiAocmVxdWVzdC5wb2xpY3lDb250YWluZXIgPT09ICdjbGllbnQnKSB7XG4gICAgLy8gMS4gSWYgcmVxdWVzdOKAmXMgY2xpZW50IGlzIG5vbi1udWxsLCB0aGVuIHNldCByZXF1ZXN04oCZcyBwb2xpY3lcbiAgICAvLyBjb250YWluZXIgdG8gYSBjbG9uZSBvZiByZXF1ZXN04oCZcyBjbGllbnTigJlzIHBvbGljeSBjb250YWluZXIuIFtIVE1MXVxuICAgIGlmIChyZXF1ZXN0LmNsaWVudCAhPSBudWxsKSB7XG4gICAgICByZXF1ZXN0LnBvbGljeUNvbnRhaW5lciA9IGNsb25lUG9saWN5Q29udGFpbmVyKFxuICAgICAgICByZXF1ZXN0LmNsaWVudC5wb2xpY3lDb250YWluZXJcbiAgICAgIClcbiAgICB9IGVsc2Uge1xuICAgICAgLy8gMi4gT3RoZXJ3aXNlLCBzZXQgcmVxdWVzdOKAmXMgcG9saWN5IGNvbnRhaW5lciB0byBhIG5ldyBwb2xpY3lcbiAgICAgIC8vIGNvbnRhaW5lci5cbiAgICAgIHJlcXVlc3QucG9saWN5Q29udGFpbmVyID0gbWFrZVBvbGljeUNvbnRhaW5lcigpXG4gICAgfVxuICB9XG5cbiAgLy8gMTIuIElmIHJlcXVlc3TigJlzIGhlYWRlciBsaXN0IGRvZXMgbm90IGNvbnRhaW4gYEFjY2VwdGAsIHRoZW46XG4gIGlmICghcmVxdWVzdC5oZWFkZXJzTGlzdC5jb250YWlucygnYWNjZXB0JykpIHtcbiAgICAvLyAxLiBMZXQgdmFsdWUgYmUgYCovKmAuXG4gICAgY29uc3QgdmFsdWUgPSAnKi8qJ1xuXG4gICAgLy8gMi4gQSB1c2VyIGFnZW50IHNob3VsZCBzZXQgdmFsdWUgdG8gdGhlIGZpcnN0IG1hdGNoaW5nIHN0YXRlbWVudCwgaWZcbiAgICAvLyBhbnksIHN3aXRjaGluZyBvbiByZXF1ZXN04oCZcyBkZXN0aW5hdGlvbjpcbiAgICAvLyBcImRvY3VtZW50XCJcbiAgICAvLyBcImZyYW1lXCJcbiAgICAvLyBcImlmcmFtZVwiXG4gICAgLy8gYHRleHQvaHRtbCxhcHBsaWNhdGlvbi94aHRtbCt4bWwsYXBwbGljYXRpb24veG1sO3E9MC45LCovKjtxPTAuOGBcbiAgICAvLyBcImltYWdlXCJcbiAgICAvLyBgaW1hZ2UvcG5nLGltYWdlL3N2Zyt4bWwsaW1hZ2UvKjtxPTAuOCwqLyo7cT0wLjVgXG4gICAgLy8gXCJzdHlsZVwiXG4gICAgLy8gYHRleHQvY3NzLCovKjtxPTAuMWBcbiAgICAvLyBUT0RPXG5cbiAgICAvLyAzLiBBcHBlbmQgYEFjY2VwdGAvdmFsdWUgdG8gcmVxdWVzdOKAmXMgaGVhZGVyIGxpc3QuXG4gICAgcmVxdWVzdC5oZWFkZXJzTGlzdC5hcHBlbmQoJ2FjY2VwdCcsIHZhbHVlKVxuICB9XG5cbiAgLy8gMTMuIElmIHJlcXVlc3TigJlzIGhlYWRlciBsaXN0IGRvZXMgbm90IGNvbnRhaW4gYEFjY2VwdC1MYW5ndWFnZWAsIHRoZW5cbiAgLy8gdXNlciBhZ2VudHMgc2hvdWxkIGFwcGVuZCBgQWNjZXB0LUxhbmd1YWdlYC9hbiBhcHByb3ByaWF0ZSB2YWx1ZSB0b1xuICAvLyByZXF1ZXN04oCZcyBoZWFkZXIgbGlzdC5cbiAgaWYgKCFyZXF1ZXN0LmhlYWRlcnNMaXN0LmNvbnRhaW5zKCdhY2NlcHQtbGFuZ3VhZ2UnKSkge1xuICAgIHJlcXVlc3QuaGVhZGVyc0xpc3QuYXBwZW5kKCdhY2NlcHQtbGFuZ3VhZ2UnLCAnKicpXG4gIH1cblxuICAvLyAxNC4gSWYgcmVxdWVzdOKAmXMgcHJpb3JpdHkgaXMgbnVsbCwgdGhlbiB1c2UgcmVxdWVzdOKAmXMgaW5pdGlhdG9yIGFuZFxuICAvLyBkZXN0aW5hdGlvbiBhcHByb3ByaWF0ZWx5IGluIHNldHRpbmcgcmVxdWVzdOKAmXMgcHJpb3JpdHkgdG8gYVxuICAvLyB1c2VyLWFnZW50LWRlZmluZWQgb2JqZWN0LlxuICBpZiAocmVxdWVzdC5wcmlvcml0eSA9PT0gbnVsbCkge1xuICAgIC8vIFRPRE9cbiAgfVxuXG4gIC8vIDE1LiBJZiByZXF1ZXN0IGlzIGEgc3VicmVzb3VyY2UgcmVxdWVzdCwgdGhlbjpcbiAgaWYgKHN1YnJlc291cmNlU2V0LmhhcyhyZXF1ZXN0LmRlc3RpbmF0aW9uKSkge1xuICAgIC8vIFRPRE9cbiAgfVxuXG4gIC8vIDE2LiBSdW4gbWFpbiBmZXRjaCBnaXZlbiBmZXRjaFBhcmFtcy5cbiAgbWFpbkZldGNoKGZldGNoUGFyYW1zKVxuICAgIC5jYXRjaChlcnIgPT4ge1xuICAgICAgZmV0Y2hQYXJhbXMuY29udHJvbGxlci50ZXJtaW5hdGUoZXJyKVxuICAgIH0pXG5cbiAgLy8gMTcuIFJldHVybiBmZXRjaFBhcmFtJ3MgY29udHJvbGxlclxuICByZXR1cm4gZmV0Y2hQYXJhbXMuY29udHJvbGxlclxufVxuXG4vLyBodHRwczovL2ZldGNoLnNwZWMud2hhdHdnLm9yZy8jY29uY2VwdC1tYWluLWZldGNoXG5hc3luYyBmdW5jdGlvbiBtYWluRmV0Y2ggKGZldGNoUGFyYW1zLCByZWN1cnNpdmUgPSBmYWxzZSkge1xuICAvLyAxLiBMZXQgcmVxdWVzdCBiZSBmZXRjaFBhcmFtc+KAmXMgcmVxdWVzdC5cbiAgY29uc3QgcmVxdWVzdCA9IGZldGNoUGFyYW1zLnJlcXVlc3RcblxuICAvLyAyLiBMZXQgcmVzcG9uc2UgYmUgbnVsbC5cbiAgbGV0IHJlc3BvbnNlID0gbnVsbFxuXG4gIC8vIDMuIElmIHJlcXVlc3TigJlzIGxvY2FsLVVSTHMtb25seSBmbGFnIGlzIHNldCBhbmQgcmVxdWVzdOKAmXMgY3VycmVudCBVUkwgaXNcbiAgLy8gbm90IGxvY2FsLCB0aGVuIHNldCByZXNwb25zZSB0byBhIG5ldHdvcmsgZXJyb3IuXG4gIGlmIChyZXF1ZXN0LmxvY2FsVVJMc09ubHkgJiYgIXVybElzTG9jYWwocmVxdWVzdEN1cnJlbnRVUkwocmVxdWVzdCkpKSB7XG4gICAgcmVzcG9uc2UgPSBtYWtlTmV0d29ya0Vycm9yKCdsb2NhbCBVUkxzIG9ubHknKVxuICB9XG5cbiAgLy8gNC4gUnVuIHJlcG9ydCBDb250ZW50IFNlY3VyaXR5IFBvbGljeSB2aW9sYXRpb25zIGZvciByZXF1ZXN0LlxuICAvLyBUT0RPXG5cbiAgLy8gNS4gVXBncmFkZSByZXF1ZXN0IHRvIGEgcG90ZW50aWFsbHkgdHJ1c3R3b3J0aHkgVVJMLCBpZiBhcHByb3ByaWF0ZS5cbiAgdHJ5VXBncmFkZVJlcXVlc3RUb0FQb3RlbnRpYWxseVRydXN0d29ydGh5VVJMKHJlcXVlc3QpXG5cbiAgLy8gNi4gSWYgc2hvdWxkIHJlcXVlc3QgYmUgYmxvY2tlZCBkdWUgdG8gYSBiYWQgcG9ydCwgc2hvdWxkIGZldGNoaW5nIHJlcXVlc3RcbiAgLy8gYmUgYmxvY2tlZCBhcyBtaXhlZCBjb250ZW50LCBvciBzaG91bGQgcmVxdWVzdCBiZSBibG9ja2VkIGJ5IENvbnRlbnRcbiAgLy8gU2VjdXJpdHkgUG9saWN5IHJldHVybnMgYmxvY2tlZCwgdGhlbiBzZXQgcmVzcG9uc2UgdG8gYSBuZXR3b3JrIGVycm9yLlxuICBpZiAocmVxdWVzdEJhZFBvcnQocmVxdWVzdCkgPT09ICdibG9ja2VkJykge1xuICAgIHJlc3BvbnNlID0gbWFrZU5ldHdvcmtFcnJvcignYmFkIHBvcnQnKVxuICB9XG4gIC8vIFRPRE86IHNob3VsZCBmZXRjaGluZyByZXF1ZXN0IGJlIGJsb2NrZWQgYXMgbWl4ZWQgY29udGVudD9cbiAgLy8gVE9ETzogc2hvdWxkIHJlcXVlc3QgYmUgYmxvY2tlZCBieSBDb250ZW50IFNlY3VyaXR5IFBvbGljeT9cblxuICAvLyA3LiBJZiByZXF1ZXN04oCZcyByZWZlcnJlciBwb2xpY3kgaXMgdGhlIGVtcHR5IHN0cmluZywgdGhlbiBzZXQgcmVxdWVzdOKAmXNcbiAgLy8gcmVmZXJyZXIgcG9saWN5IHRvIHJlcXVlc3TigJlzIHBvbGljeSBjb250YWluZXLigJlzIHJlZmVycmVyIHBvbGljeS5cbiAgaWYgKHJlcXVlc3QucmVmZXJyZXJQb2xpY3kgPT09ICcnKSB7XG4gICAgcmVxdWVzdC5yZWZlcnJlclBvbGljeSA9IHJlcXVlc3QucG9saWN5Q29udGFpbmVyLnJlZmVycmVyUG9saWN5XG4gIH1cblxuICAvLyA4LiBJZiByZXF1ZXN04oCZcyByZWZlcnJlciBpcyBub3QgXCJuby1yZWZlcnJlclwiLCB0aGVuIHNldCByZXF1ZXN04oCZc1xuICAvLyByZWZlcnJlciB0byB0aGUgcmVzdWx0IG9mIGludm9raW5nIGRldGVybWluZSByZXF1ZXN04oCZcyByZWZlcnJlci5cbiAgaWYgKHJlcXVlc3QucmVmZXJyZXIgIT09ICduby1yZWZlcnJlcicpIHtcbiAgICByZXF1ZXN0LnJlZmVycmVyID0gZGV0ZXJtaW5lUmVxdWVzdHNSZWZlcnJlcihyZXF1ZXN0KVxuICB9XG5cbiAgLy8gOS4gU2V0IHJlcXVlc3TigJlzIGN1cnJlbnQgVVJM4oCZcyBzY2hlbWUgdG8gXCJodHRwc1wiIGlmIGFsbCBvZiB0aGUgZm9sbG93aW5nXG4gIC8vIGNvbmRpdGlvbnMgYXJlIHRydWU6XG4gIC8vIC0gcmVxdWVzdOKAmXMgY3VycmVudCBVUkzigJlzIHNjaGVtZSBpcyBcImh0dHBcIlxuICAvLyAtIHJlcXVlc3TigJlzIGN1cnJlbnQgVVJM4oCZcyBob3N0IGlzIGEgZG9tYWluXG4gIC8vIC0gTWF0Y2hpbmcgcmVxdWVzdOKAmXMgY3VycmVudCBVUkzigJlzIGhvc3QgcGVyIEtub3duIEhTVFMgSG9zdCBEb21haW4gTmFtZVxuICAvLyAgIE1hdGNoaW5nIHJlc3VsdHMgaW4gZWl0aGVyIGEgc3VwZXJkb21haW4gbWF0Y2ggd2l0aCBhbiBhc3NlcnRlZFxuICAvLyAgIGluY2x1ZGVTdWJEb21haW5zIGRpcmVjdGl2ZSBvciBhIGNvbmdydWVudCBtYXRjaCAod2l0aCBvciB3aXRob3V0IGFuXG4gIC8vICAgYXNzZXJ0ZWQgaW5jbHVkZVN1YkRvbWFpbnMgZGlyZWN0aXZlKS4gW0hTVFNdXG4gIC8vIFRPRE9cblxuICAvLyAxMC4gSWYgcmVjdXJzaXZlIGlzIGZhbHNlLCB0aGVuIHJ1biB0aGUgcmVtYWluaW5nIHN0ZXBzIGluIHBhcmFsbGVsLlxuICAvLyBUT0RPXG5cbiAgLy8gMTEuIElmIHJlc3BvbnNlIGlzIG51bGwsIHRoZW4gc2V0IHJlc3BvbnNlIHRvIHRoZSByZXN1bHQgb2YgcnVubmluZ1xuICAvLyB0aGUgc3RlcHMgY29ycmVzcG9uZGluZyB0byB0aGUgZmlyc3QgbWF0Y2hpbmcgc3RhdGVtZW50OlxuICBpZiAocmVzcG9uc2UgPT09IG51bGwpIHtcbiAgICByZXNwb25zZSA9IGF3YWl0IChhc3luYyAoKSA9PiB7XG4gICAgICBjb25zdCBjdXJyZW50VVJMID0gcmVxdWVzdEN1cnJlbnRVUkwocmVxdWVzdClcblxuICAgICAgaWYgKFxuICAgICAgICAvLyAtIHJlcXVlc3TigJlzIGN1cnJlbnQgVVJM4oCZcyBvcmlnaW4gaXMgc2FtZSBvcmlnaW4gd2l0aCByZXF1ZXN04oCZcyBvcmlnaW4sXG4gICAgICAgIC8vICAgYW5kIHJlcXVlc3TigJlzIHJlc3BvbnNlIHRhaW50aW5nIGlzIFwiYmFzaWNcIlxuICAgICAgICAoc2FtZU9yaWdpbihjdXJyZW50VVJMLCByZXF1ZXN0LnVybCkgJiYgcmVxdWVzdC5yZXNwb25zZVRhaW50aW5nID09PSAnYmFzaWMnKSB8fFxuICAgICAgICAvLyByZXF1ZXN04oCZcyBjdXJyZW50IFVSTOKAmXMgc2NoZW1lIGlzIFwiZGF0YVwiXG4gICAgICAgIChjdXJyZW50VVJMLnByb3RvY29sID09PSAnZGF0YTonKSB8fFxuICAgICAgICAvLyAtIHJlcXVlc3TigJlzIG1vZGUgaXMgXCJuYXZpZ2F0ZVwiIG9yIFwid2Vic29ja2V0XCJcbiAgICAgICAgKHJlcXVlc3QubW9kZSA9PT0gJ25hdmlnYXRlJyB8fCByZXF1ZXN0Lm1vZGUgPT09ICd3ZWJzb2NrZXQnKVxuICAgICAgKSB7XG4gICAgICAgIC8vIDEuIFNldCByZXF1ZXN04oCZcyByZXNwb25zZSB0YWludGluZyB0byBcImJhc2ljXCIuXG4gICAgICAgIHJlcXVlc3QucmVzcG9uc2VUYWludGluZyA9ICdiYXNpYydcblxuICAgICAgICAvLyAyLiBSZXR1cm4gdGhlIHJlc3VsdCBvZiBydW5uaW5nIHNjaGVtZSBmZXRjaCBnaXZlbiBmZXRjaFBhcmFtcy5cbiAgICAgICAgcmV0dXJuIGF3YWl0IHNjaGVtZUZldGNoKGZldGNoUGFyYW1zKVxuICAgICAgfVxuXG4gICAgICAvLyByZXF1ZXN04oCZcyBtb2RlIGlzIFwic2FtZS1vcmlnaW5cIlxuICAgICAgaWYgKHJlcXVlc3QubW9kZSA9PT0gJ3NhbWUtb3JpZ2luJykge1xuICAgICAgICAvLyAxLiBSZXR1cm4gYSBuZXR3b3JrIGVycm9yLlxuICAgICAgICByZXR1cm4gbWFrZU5ldHdvcmtFcnJvcigncmVxdWVzdCBtb2RlIGNhbm5vdCBiZSBcInNhbWUtb3JpZ2luXCInKVxuICAgICAgfVxuXG4gICAgICAvLyByZXF1ZXN04oCZcyBtb2RlIGlzIFwibm8tY29yc1wiXG4gICAgICBpZiAocmVxdWVzdC5tb2RlID09PSAnbm8tY29ycycpIHtcbiAgICAgICAgLy8gMS4gSWYgcmVxdWVzdOKAmXMgcmVkaXJlY3QgbW9kZSBpcyBub3QgXCJmb2xsb3dcIiwgdGhlbiByZXR1cm4gYSBuZXR3b3JrXG4gICAgICAgIC8vIGVycm9yLlxuICAgICAgICBpZiAocmVxdWVzdC5yZWRpcmVjdCAhPT0gJ2ZvbGxvdycpIHtcbiAgICAgICAgICByZXR1cm4gbWFrZU5ldHdvcmtFcnJvcihcbiAgICAgICAgICAgICdyZWRpcmVjdCBtb2RlIGNhbm5vdCBiZSBcImZvbGxvd1wiIGZvciBcIm5vLWNvcnNcIiByZXF1ZXN0J1xuICAgICAgICAgIClcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIDIuIFNldCByZXF1ZXN04oCZcyByZXNwb25zZSB0YWludGluZyB0byBcIm9wYXF1ZVwiLlxuICAgICAgICByZXF1ZXN0LnJlc3BvbnNlVGFpbnRpbmcgPSAnb3BhcXVlJ1xuXG4gICAgICAgIC8vIDMuIFJldHVybiB0aGUgcmVzdWx0IG9mIHJ1bm5pbmcgc2NoZW1lIGZldGNoIGdpdmVuIGZldGNoUGFyYW1zLlxuICAgICAgICByZXR1cm4gYXdhaXQgc2NoZW1lRmV0Y2goZmV0Y2hQYXJhbXMpXG4gICAgICB9XG5cbiAgICAgIC8vIHJlcXVlc3TigJlzIGN1cnJlbnQgVVJM4oCZcyBzY2hlbWUgaXMgbm90IGFuIEhUVFAoUykgc2NoZW1lXG4gICAgICBpZiAoIXVybElzSHR0cEh0dHBzU2NoZW1lKHJlcXVlc3RDdXJyZW50VVJMKHJlcXVlc3QpKSkge1xuICAgICAgICAvLyBSZXR1cm4gYSBuZXR3b3JrIGVycm9yLlxuICAgICAgICByZXR1cm4gbWFrZU5ldHdvcmtFcnJvcignVVJMIHNjaGVtZSBtdXN0IGJlIGEgSFRUUChTKSBzY2hlbWUnKVxuICAgICAgfVxuXG4gICAgICAvLyAtIHJlcXVlc3TigJlzIHVzZS1DT1JTLXByZWZsaWdodCBmbGFnIGlzIHNldFxuICAgICAgLy8gLSByZXF1ZXN04oCZcyB1bnNhZmUtcmVxdWVzdCBmbGFnIGlzIHNldCBhbmQgZWl0aGVyIHJlcXVlc3TigJlzIG1ldGhvZCBpc1xuICAgICAgLy8gICBub3QgYSBDT1JTLXNhZmVsaXN0ZWQgbWV0aG9kIG9yIENPUlMtdW5zYWZlIHJlcXVlc3QtaGVhZGVyIG5hbWVzIHdpdGhcbiAgICAgIC8vICAgcmVxdWVzdOKAmXMgaGVhZGVyIGxpc3QgaXMgbm90IGVtcHR5XG4gICAgICAvLyAgICAxLiBTZXQgcmVxdWVzdOKAmXMgcmVzcG9uc2UgdGFpbnRpbmcgdG8gXCJjb3JzXCIuXG4gICAgICAvLyAgICAyLiBMZXQgY29yc1dpdGhQcmVmbGlnaHRSZXNwb25zZSBiZSB0aGUgcmVzdWx0IG9mIHJ1bm5pbmcgSFRUUCBmZXRjaFxuICAgICAgLy8gICAgZ2l2ZW4gZmV0Y2hQYXJhbXMgYW5kIHRydWUuXG4gICAgICAvLyAgICAzLiBJZiBjb3JzV2l0aFByZWZsaWdodFJlc3BvbnNlIGlzIGEgbmV0d29yayBlcnJvciwgdGhlbiBjbGVhciBjYWNoZVxuICAgICAgLy8gICAgZW50cmllcyB1c2luZyByZXF1ZXN0LlxuICAgICAgLy8gICAgNC4gUmV0dXJuIGNvcnNXaXRoUHJlZmxpZ2h0UmVzcG9uc2UuXG4gICAgICAvLyBUT0RPXG5cbiAgICAgIC8vIE90aGVyd2lzZVxuICAgICAgLy8gICAgMS4gU2V0IHJlcXVlc3TigJlzIHJlc3BvbnNlIHRhaW50aW5nIHRvIFwiY29yc1wiLlxuICAgICAgcmVxdWVzdC5yZXNwb25zZVRhaW50aW5nID0gJ2NvcnMnXG5cbiAgICAgIC8vICAgIDIuIFJldHVybiB0aGUgcmVzdWx0IG9mIHJ1bm5pbmcgSFRUUCBmZXRjaCBnaXZlbiBmZXRjaFBhcmFtcy5cbiAgICAgIHJldHVybiBhd2FpdCBodHRwRmV0Y2goZmV0Y2hQYXJhbXMpXG4gICAgfSkoKVxuICB9XG5cbiAgLy8gMTIuIElmIHJlY3Vyc2l2ZSBpcyB0cnVlLCB0aGVuIHJldHVybiByZXNwb25zZS5cbiAgaWYgKHJlY3Vyc2l2ZSkge1xuICAgIHJldHVybiByZXNwb25zZVxuICB9XG5cbiAgLy8gMTMuIElmIHJlc3BvbnNlIGlzIG5vdCBhIG5ldHdvcmsgZXJyb3IgYW5kIHJlc3BvbnNlIGlzIG5vdCBhIGZpbHRlcmVkXG4gIC8vIHJlc3BvbnNlLCB0aGVuOlxuICBpZiAocmVzcG9uc2Uuc3RhdHVzICE9PSAwICYmICFyZXNwb25zZS5pbnRlcm5hbFJlc3BvbnNlKSB7XG4gICAgLy8gSWYgcmVxdWVzdOKAmXMgcmVzcG9uc2UgdGFpbnRpbmcgaXMgXCJjb3JzXCIsIHRoZW46XG4gICAgaWYgKHJlcXVlc3QucmVzcG9uc2VUYWludGluZyA9PT0gJ2NvcnMnKSB7XG4gICAgICAvLyAxLiBMZXQgaGVhZGVyTmFtZXMgYmUgdGhlIHJlc3VsdCBvZiBleHRyYWN0aW5nIGhlYWRlciBsaXN0IHZhbHVlc1xuICAgICAgLy8gZ2l2ZW4gYEFjY2Vzcy1Db250cm9sLUV4cG9zZS1IZWFkZXJzYCBhbmQgcmVzcG9uc2XigJlzIGhlYWRlciBsaXN0LlxuICAgICAgLy8gVE9ET1xuICAgICAgLy8gMi4gSWYgcmVxdWVzdOKAmXMgY3JlZGVudGlhbHMgbW9kZSBpcyBub3QgXCJpbmNsdWRlXCIgYW5kIGhlYWRlck5hbWVzXG4gICAgICAvLyBjb250YWlucyBgKmAsIHRoZW4gc2V0IHJlc3BvbnNl4oCZcyBDT1JTLWV4cG9zZWQgaGVhZGVyLW5hbWUgbGlzdCB0b1xuICAgICAgLy8gYWxsIHVuaXF1ZSBoZWFkZXIgbmFtZXMgaW4gcmVzcG9uc2XigJlzIGhlYWRlciBsaXN0LlxuICAgICAgLy8gVE9ET1xuICAgICAgLy8gMy4gT3RoZXJ3aXNlLCBpZiBoZWFkZXJOYW1lcyBpcyBub3QgbnVsbCBvciBmYWlsdXJlLCB0aGVuIHNldFxuICAgICAgLy8gcmVzcG9uc2XigJlzIENPUlMtZXhwb3NlZCBoZWFkZXItbmFtZSBsaXN0IHRvIGhlYWRlck5hbWVzLlxuICAgICAgLy8gVE9ET1xuICAgIH1cblxuICAgIC8vIFNldCByZXNwb25zZSB0byB0aGUgZm9sbG93aW5nIGZpbHRlcmVkIHJlc3BvbnNlIHdpdGggcmVzcG9uc2UgYXMgaXRzXG4gICAgLy8gaW50ZXJuYWwgcmVzcG9uc2UsIGRlcGVuZGluZyBvbiByZXF1ZXN04oCZcyByZXNwb25zZSB0YWludGluZzpcbiAgICBpZiAocmVxdWVzdC5yZXNwb25zZVRhaW50aW5nID09PSAnYmFzaWMnKSB7XG4gICAgICByZXNwb25zZSA9IGZpbHRlclJlc3BvbnNlKHJlc3BvbnNlLCAnYmFzaWMnKVxuICAgIH0gZWxzZSBpZiAocmVxdWVzdC5yZXNwb25zZVRhaW50aW5nID09PSAnY29ycycpIHtcbiAgICAgIHJlc3BvbnNlID0gZmlsdGVyUmVzcG9uc2UocmVzcG9uc2UsICdjb3JzJylcbiAgICB9IGVsc2UgaWYgKHJlcXVlc3QucmVzcG9uc2VUYWludGluZyA9PT0gJ29wYXF1ZScpIHtcbiAgICAgIHJlc3BvbnNlID0gZmlsdGVyUmVzcG9uc2UocmVzcG9uc2UsICdvcGFxdWUnKVxuICAgIH0gZWxzZSB7XG4gICAgICBhc3NlcnQoZmFsc2UpXG4gICAgfVxuICB9XG5cbiAgLy8gMTQuIExldCBpbnRlcm5hbFJlc3BvbnNlIGJlIHJlc3BvbnNlLCBpZiByZXNwb25zZSBpcyBhIG5ldHdvcmsgZXJyb3IsXG4gIC8vIGFuZCByZXNwb25zZeKAmXMgaW50ZXJuYWwgcmVzcG9uc2Ugb3RoZXJ3aXNlLlxuICBsZXQgaW50ZXJuYWxSZXNwb25zZSA9XG4gICAgcmVzcG9uc2Uuc3RhdHVzID09PSAwID8gcmVzcG9uc2UgOiByZXNwb25zZS5pbnRlcm5hbFJlc3BvbnNlXG5cbiAgLy8gMTUuIElmIGludGVybmFsUmVzcG9uc2XigJlzIFVSTCBsaXN0IGlzIGVtcHR5LCB0aGVuIHNldCBpdCB0byBhIGNsb25lIG9mXG4gIC8vIHJlcXVlc3TigJlzIFVSTCBsaXN0LlxuICBpZiAoaW50ZXJuYWxSZXNwb25zZS51cmxMaXN0Lmxlbmd0aCA9PT0gMCkge1xuICAgIGludGVybmFsUmVzcG9uc2UudXJsTGlzdC5wdXNoKC4uLnJlcXVlc3QudXJsTGlzdClcbiAgfVxuXG4gIC8vIDE2LiBJZiByZXF1ZXN04oCZcyB0aW1pbmcgYWxsb3cgZmFpbGVkIGZsYWcgaXMgdW5zZXQsIHRoZW4gc2V0XG4gIC8vIGludGVybmFsUmVzcG9uc2XigJlzIHRpbWluZyBhbGxvdyBwYXNzZWQgZmxhZy5cbiAgaWYgKCFyZXF1ZXN0LnRpbWluZ0FsbG93RmFpbGVkKSB7XG4gICAgcmVzcG9uc2UudGltaW5nQWxsb3dQYXNzZWQgPSB0cnVlXG4gIH1cblxuICAvLyAxNy4gSWYgcmVzcG9uc2UgaXMgbm90IGEgbmV0d29yayBlcnJvciBhbmQgYW55IG9mIHRoZSBmb2xsb3dpbmcgcmV0dXJuc1xuICAvLyBibG9ja2VkXG4gIC8vIC0gc2hvdWxkIGludGVybmFsUmVzcG9uc2UgdG8gcmVxdWVzdCBiZSBibG9ja2VkIGFzIG1peGVkIGNvbnRlbnRcbiAgLy8gLSBzaG91bGQgaW50ZXJuYWxSZXNwb25zZSB0byByZXF1ZXN0IGJlIGJsb2NrZWQgYnkgQ29udGVudCBTZWN1cml0eSBQb2xpY3lcbiAgLy8gLSBzaG91bGQgaW50ZXJuYWxSZXNwb25zZSB0byByZXF1ZXN0IGJlIGJsb2NrZWQgZHVlIHRvIGl0cyBNSU1FIHR5cGVcbiAgLy8gLSBzaG91bGQgaW50ZXJuYWxSZXNwb25zZSB0byByZXF1ZXN0IGJlIGJsb2NrZWQgZHVlIHRvIG5vc25pZmZcbiAgLy8gVE9ET1xuXG4gIC8vIDE4LiBJZiByZXNwb25zZeKAmXMgdHlwZSBpcyBcIm9wYXF1ZVwiLCBpbnRlcm5hbFJlc3BvbnNl4oCZcyBzdGF0dXMgaXMgMjA2LFxuICAvLyBpbnRlcm5hbFJlc3BvbnNl4oCZcyByYW5nZS1yZXF1ZXN0ZWQgZmxhZyBpcyBzZXQsIGFuZCByZXF1ZXN04oCZcyBoZWFkZXJcbiAgLy8gbGlzdCBkb2VzIG5vdCBjb250YWluIGBSYW5nZWAsIHRoZW4gc2V0IHJlc3BvbnNlIGFuZCBpbnRlcm5hbFJlc3BvbnNlXG4gIC8vIHRvIGEgbmV0d29yayBlcnJvci5cbiAgaWYgKFxuICAgIHJlc3BvbnNlLnR5cGUgPT09ICdvcGFxdWUnICYmXG4gICAgaW50ZXJuYWxSZXNwb25zZS5zdGF0dXMgPT09IDIwNiAmJlxuICAgIGludGVybmFsUmVzcG9uc2UucmFuZ2VSZXF1ZXN0ZWQgJiZcbiAgICAhcmVxdWVzdC5oZWFkZXJzLmNvbnRhaW5zKCdyYW5nZScpXG4gICkge1xuICAgIHJlc3BvbnNlID0gaW50ZXJuYWxSZXNwb25zZSA9IG1ha2VOZXR3b3JrRXJyb3IoKVxuICB9XG5cbiAgLy8gMTkuIElmIHJlc3BvbnNlIGlzIG5vdCBhIG5ldHdvcmsgZXJyb3IgYW5kIGVpdGhlciByZXF1ZXN04oCZcyBtZXRob2QgaXNcbiAgLy8gYEhFQURgIG9yIGBDT05ORUNUYCwgb3IgaW50ZXJuYWxSZXNwb25zZeKAmXMgc3RhdHVzIGlzIGEgbnVsbCBib2R5IHN0YXR1cyxcbiAgLy8gc2V0IGludGVybmFsUmVzcG9uc2XigJlzIGJvZHkgdG8gbnVsbCBhbmQgZGlzcmVnYXJkIGFueSBlbnF1ZXVpbmcgdG93YXJkXG4gIC8vIGl0IChpZiBhbnkpLlxuICBpZiAoXG4gICAgcmVzcG9uc2Uuc3RhdHVzICE9PSAwICYmXG4gICAgKHJlcXVlc3QubWV0aG9kID09PSAnSEVBRCcgfHxcbiAgICAgIHJlcXVlc3QubWV0aG9kID09PSAnQ09OTkVDVCcgfHxcbiAgICAgIG51bGxCb2R5U3RhdHVzLmluY2x1ZGVzKGludGVybmFsUmVzcG9uc2Uuc3RhdHVzKSlcbiAgKSB7XG4gICAgaW50ZXJuYWxSZXNwb25zZS5ib2R5ID0gbnVsbFxuICAgIGZldGNoUGFyYW1zLmNvbnRyb2xsZXIuZHVtcCA9IHRydWVcbiAgfVxuXG4gIC8vIDIwLiBJZiByZXF1ZXN04oCZcyBpbnRlZ3JpdHkgbWV0YWRhdGEgaXMgbm90IHRoZSBlbXB0eSBzdHJpbmcsIHRoZW46XG4gIGlmIChyZXF1ZXN0LmludGVncml0eSkge1xuICAgIC8vIDEuIExldCBwcm9jZXNzQm9keUVycm9yIGJlIHRoaXMgc3RlcDogcnVuIGZldGNoIGZpbmFsZSBnaXZlbiBmZXRjaFBhcmFtc1xuICAgIC8vIGFuZCBhIG5ldHdvcmsgZXJyb3IuXG4gICAgY29uc3QgcHJvY2Vzc0JvZHlFcnJvciA9IChyZWFzb24pID0+XG4gICAgICBmZXRjaEZpbmFsZShmZXRjaFBhcmFtcywgbWFrZU5ldHdvcmtFcnJvcihyZWFzb24pKVxuXG4gICAgLy8gMi4gSWYgcmVxdWVzdOKAmXMgcmVzcG9uc2UgdGFpbnRpbmcgaXMgXCJvcGFxdWVcIiwgb3IgcmVzcG9uc2XigJlzIGJvZHkgaXMgbnVsbCxcbiAgICAvLyB0aGVuIHJ1biBwcm9jZXNzQm9keUVycm9yIGFuZCBhYm9ydCB0aGVzZSBzdGVwcy5cbiAgICBpZiAocmVxdWVzdC5yZXNwb25zZVRhaW50aW5nID09PSAnb3BhcXVlJyB8fCByZXNwb25zZS5ib2R5ID09IG51bGwpIHtcbiAgICAgIHByb2Nlc3NCb2R5RXJyb3IocmVzcG9uc2UuZXJyb3IpXG4gICAgICByZXR1cm5cbiAgICB9XG5cbiAgICAvLyAzLiBMZXQgcHJvY2Vzc0JvZHkgZ2l2ZW4gYnl0ZXMgYmUgdGhlc2Ugc3RlcHM6XG4gICAgY29uc3QgcHJvY2Vzc0JvZHkgPSAoYnl0ZXMpID0+IHtcbiAgICAgIC8vIDEuIElmIGJ5dGVzIGRvIG5vdCBtYXRjaCByZXF1ZXN04oCZcyBpbnRlZ3JpdHkgbWV0YWRhdGEsXG4gICAgICAvLyB0aGVuIHJ1biBwcm9jZXNzQm9keUVycm9yIGFuZCBhYm9ydCB0aGVzZSBzdGVwcy4gW1NSSV1cbiAgICAgIGlmICghYnl0ZXNNYXRjaChieXRlcywgcmVxdWVzdC5pbnRlZ3JpdHkpKSB7XG4gICAgICAgIHByb2Nlc3NCb2R5RXJyb3IoJ2ludGVncml0eSBtaXNtYXRjaCcpXG4gICAgICAgIHJldHVyblxuICAgICAgfVxuXG4gICAgICAvLyAyLiBTZXQgcmVzcG9uc2XigJlzIGJvZHkgdG8gYnl0ZXMgYXMgYSBib2R5LlxuICAgICAgcmVzcG9uc2UuYm9keSA9IHNhZmVseUV4dHJhY3RCb2R5KGJ5dGVzKVswXVxuXG4gICAgICAvLyAzLiBSdW4gZmV0Y2ggZmluYWxlIGdpdmVuIGZldGNoUGFyYW1zIGFuZCByZXNwb25zZS5cbiAgICAgIGZldGNoRmluYWxlKGZldGNoUGFyYW1zLCByZXNwb25zZSlcbiAgICB9XG5cbiAgICAvLyA0LiBGdWxseSByZWFkIHJlc3BvbnNl4oCZcyBib2R5IGdpdmVuIHByb2Nlc3NCb2R5IGFuZCBwcm9jZXNzQm9keUVycm9yLlxuICAgIGF3YWl0IGZ1bGx5UmVhZEJvZHkocmVzcG9uc2UuYm9keSwgcHJvY2Vzc0JvZHksIHByb2Nlc3NCb2R5RXJyb3IpXG4gIH0gZWxzZSB7XG4gICAgLy8gMjEuIE90aGVyd2lzZSwgcnVuIGZldGNoIGZpbmFsZSBnaXZlbiBmZXRjaFBhcmFtcyBhbmQgcmVzcG9uc2UuXG4gICAgZmV0Y2hGaW5hbGUoZmV0Y2hQYXJhbXMsIHJlc3BvbnNlKVxuICB9XG59XG5cbi8vIGh0dHBzOi8vZmV0Y2guc3BlYy53aGF0d2cub3JnLyNjb25jZXB0LXNjaGVtZS1mZXRjaFxuLy8gZ2l2ZW4gYSBmZXRjaCBwYXJhbXMgZmV0Y2hQYXJhbXNcbmZ1bmN0aW9uIHNjaGVtZUZldGNoIChmZXRjaFBhcmFtcykge1xuICAvLyBOb3RlOiBzaW5jZSB0aGUgY29ubmVjdGlvbiBpcyBkZXN0cm95ZWQgb24gcmVkaXJlY3QsIHdoaWNoIHNldHMgZmV0Y2hQYXJhbXMgdG8gYVxuICAvLyBjYW5jZWxsZWQgc3RhdGUsIHdlIGRvIG5vdCB3YW50IHRoaXMgY29uZGl0aW9uIHRvIHRyaWdnZXIgKnVubGVzcyogdGhlcmUgaGF2ZSBiZWVuXG4gIC8vIG5vIHJlZGlyZWN0cy4gU2VlIGh0dHBzOi8vZ2l0aHViLmNvbS9ub2RlanMvdW5kaWNpL2lzc3Vlcy8xNzc2XG4gIC8vIDEuIElmIGZldGNoUGFyYW1zIGlzIGNhbmNlbGVkLCB0aGVuIHJldHVybiB0aGUgYXBwcm9wcmlhdGUgbmV0d29yayBlcnJvciBmb3IgZmV0Y2hQYXJhbXMuXG4gIGlmIChpc0NhbmNlbGxlZChmZXRjaFBhcmFtcykgJiYgZmV0Y2hQYXJhbXMucmVxdWVzdC5yZWRpcmVjdENvdW50ID09PSAwKSB7XG4gICAgcmV0dXJuIFByb21pc2UucmVzb2x2ZShtYWtlQXBwcm9wcmlhdGVOZXR3b3JrRXJyb3IoZmV0Y2hQYXJhbXMpKVxuICB9XG5cbiAgLy8gMi4gTGV0IHJlcXVlc3QgYmUgZmV0Y2hQYXJhbXPigJlzIHJlcXVlc3QuXG4gIGNvbnN0IHsgcmVxdWVzdCB9ID0gZmV0Y2hQYXJhbXNcblxuICBjb25zdCB7IHByb3RvY29sOiBzY2hlbWUgfSA9IHJlcXVlc3RDdXJyZW50VVJMKHJlcXVlc3QpXG5cbiAgLy8gMy4gU3dpdGNoIG9uIHJlcXVlc3TigJlzIGN1cnJlbnQgVVJM4oCZcyBzY2hlbWUgYW5kIHJ1biB0aGUgYXNzb2NpYXRlZCBzdGVwczpcbiAgc3dpdGNoIChzY2hlbWUpIHtcbiAgICBjYXNlICdhYm91dDonOiB7XG4gICAgICAvLyBJZiByZXF1ZXN04oCZcyBjdXJyZW50IFVSTOKAmXMgcGF0aCBpcyB0aGUgc3RyaW5nIFwiYmxhbmtcIiwgdGhlbiByZXR1cm4gYSBuZXcgcmVzcG9uc2VcbiAgICAgIC8vIHdob3NlIHN0YXR1cyBtZXNzYWdlIGlzIGBPS2AsIGhlYWRlciBsaXN0IGlzIMKrIChgQ29udGVudC1UeXBlYCwgYHRleHQvaHRtbDtjaGFyc2V0PXV0Zi04YCkgwrssXG4gICAgICAvLyBhbmQgYm9keSBpcyB0aGUgZW1wdHkgYnl0ZSBzZXF1ZW5jZSBhcyBhIGJvZHkuXG5cbiAgICAgIC8vIE90aGVyd2lzZSwgcmV0dXJuIGEgbmV0d29yayBlcnJvci5cbiAgICAgIHJldHVybiBQcm9taXNlLnJlc29sdmUobWFrZU5ldHdvcmtFcnJvcignYWJvdXQgc2NoZW1lIGlzIG5vdCBzdXBwb3J0ZWQnKSlcbiAgICB9XG4gICAgY2FzZSAnYmxvYjonOiB7XG4gICAgICBpZiAoIXJlc29sdmVPYmplY3RVUkwpIHtcbiAgICAgICAgcmVzb2x2ZU9iamVjdFVSTCA9IHJlcXVpcmUoJ2J1ZmZlcicpLnJlc29sdmVPYmplY3RVUkxcbiAgICAgIH1cblxuICAgICAgLy8gMS4gTGV0IGJsb2JVUkxFbnRyeSBiZSByZXF1ZXN04oCZcyBjdXJyZW50IFVSTOKAmXMgYmxvYiBVUkwgZW50cnkuXG4gICAgICBjb25zdCBibG9iVVJMRW50cnkgPSByZXF1ZXN0Q3VycmVudFVSTChyZXF1ZXN0KVxuXG4gICAgICAvLyBodHRwczovL2dpdGh1Yi5jb20vd2ViLXBsYXRmb3JtLXRlc3RzL3dwdC9ibG9iLzdiMGViYWNjYzYyYjU2NmExOTY1Mzk2ZTViZTdiYjJiYzA2Zjg0MWYvRmlsZUFQSS91cmwvcmVzb3VyY2VzL2ZldGNoLXRlc3RzLmpzI0w1Mi1MNTZcbiAgICAgIC8vIEJ1ZmZlci5yZXNvbHZlT2JqZWN0VVJMIGRvZXMgbm90IGlnbm9yZSBVUkwgcXVlcmllcy5cbiAgICAgIGlmIChibG9iVVJMRW50cnkuc2VhcmNoLmxlbmd0aCAhPT0gMCkge1xuICAgICAgICByZXR1cm4gUHJvbWlzZS5yZXNvbHZlKG1ha2VOZXR3b3JrRXJyb3IoJ05ldHdvcmtFcnJvciB3aGVuIGF0dGVtcHRpbmcgdG8gZmV0Y2ggcmVzb3VyY2UuJykpXG4gICAgICB9XG5cbiAgICAgIGNvbnN0IGJsb2JVUkxFbnRyeU9iamVjdCA9IHJlc29sdmVPYmplY3RVUkwoYmxvYlVSTEVudHJ5LnRvU3RyaW5nKCkpXG5cbiAgICAgIC8vIDIuIElmIHJlcXVlc3TigJlzIG1ldGhvZCBpcyBub3QgYEdFVGAsIGJsb2JVUkxFbnRyeSBpcyBudWxsLCBvciBibG9iVVJMRW50cnnigJlzXG4gICAgICAvLyAgICBvYmplY3QgaXMgbm90IGEgQmxvYiBvYmplY3QsIHRoZW4gcmV0dXJuIGEgbmV0d29yayBlcnJvci5cbiAgICAgIGlmIChyZXF1ZXN0Lm1ldGhvZCAhPT0gJ0dFVCcgfHwgIWlzQmxvYkxpa2UoYmxvYlVSTEVudHJ5T2JqZWN0KSkge1xuICAgICAgICByZXR1cm4gUHJvbWlzZS5yZXNvbHZlKG1ha2VOZXR3b3JrRXJyb3IoJ2ludmFsaWQgbWV0aG9kJykpXG4gICAgICB9XG5cbiAgICAgIC8vIDMuIExldCBib2R5V2l0aFR5cGUgYmUgdGhlIHJlc3VsdCBvZiBzYWZlbHkgZXh0cmFjdGluZyBibG9iVVJMRW50cnnigJlzIG9iamVjdC5cbiAgICAgIGNvbnN0IGJvZHlXaXRoVHlwZSA9IHNhZmVseUV4dHJhY3RCb2R5KGJsb2JVUkxFbnRyeU9iamVjdClcblxuICAgICAgLy8gNC4gTGV0IGJvZHkgYmUgYm9keVdpdGhUeXBl4oCZcyBib2R5LlxuICAgICAgY29uc3QgYm9keSA9IGJvZHlXaXRoVHlwZVswXVxuXG4gICAgICAvLyA1LiBMZXQgbGVuZ3RoIGJlIGJvZHnigJlzIGxlbmd0aCwgc2VyaWFsaXplZCBhbmQgaXNvbW9ycGhpYyBlbmNvZGVkLlxuICAgICAgY29uc3QgbGVuZ3RoID0gaXNvbW9ycGhpY0VuY29kZShgJHtib2R5Lmxlbmd0aH1gKVxuXG4gICAgICAvLyA2LiBMZXQgdHlwZSBiZSBib2R5V2l0aFR5cGXigJlzIHR5cGUgaWYgaXQgaXMgbm9uLW51bGw7IG90aGVyd2lzZSB0aGUgZW1wdHkgYnl0ZSBzZXF1ZW5jZS5cbiAgICAgIGNvbnN0IHR5cGUgPSBib2R5V2l0aFR5cGVbMV0gPz8gJydcblxuICAgICAgLy8gNy4gUmV0dXJuIGEgbmV3IHJlc3BvbnNlIHdob3NlIHN0YXR1cyBtZXNzYWdlIGlzIGBPS2AsIGhlYWRlciBsaXN0IGlzXG4gICAgICAvLyAgICDCqyAoYENvbnRlbnQtTGVuZ3RoYCwgbGVuZ3RoKSwgKGBDb250ZW50LVR5cGVgLCB0eXBlKSDCuywgYW5kIGJvZHkgaXMgYm9keS5cbiAgICAgIGNvbnN0IHJlc3BvbnNlID0gbWFrZVJlc3BvbnNlKHtcbiAgICAgICAgc3RhdHVzVGV4dDogJ09LJyxcbiAgICAgICAgaGVhZGVyc0xpc3Q6IFtcbiAgICAgICAgICBbJ2NvbnRlbnQtbGVuZ3RoJywgeyBuYW1lOiAnQ29udGVudC1MZW5ndGgnLCB2YWx1ZTogbGVuZ3RoIH1dLFxuICAgICAgICAgIFsnY29udGVudC10eXBlJywgeyBuYW1lOiAnQ29udGVudC1UeXBlJywgdmFsdWU6IHR5cGUgfV1cbiAgICAgICAgXVxuICAgICAgfSlcblxuICAgICAgcmVzcG9uc2UuYm9keSA9IGJvZHlcblxuICAgICAgcmV0dXJuIFByb21pc2UucmVzb2x2ZShyZXNwb25zZSlcbiAgICB9XG4gICAgY2FzZSAnZGF0YTonOiB7XG4gICAgICAvLyAxLiBMZXQgZGF0YVVSTFN0cnVjdCBiZSB0aGUgcmVzdWx0IG9mIHJ1bm5pbmcgdGhlXG4gICAgICAvLyAgICBkYXRhOiBVUkwgcHJvY2Vzc29yIG9uIHJlcXVlc3TigJlzIGN1cnJlbnQgVVJMLlxuICAgICAgY29uc3QgY3VycmVudFVSTCA9IHJlcXVlc3RDdXJyZW50VVJMKHJlcXVlc3QpXG4gICAgICBjb25zdCBkYXRhVVJMU3RydWN0ID0gZGF0YVVSTFByb2Nlc3NvcihjdXJyZW50VVJMKVxuXG4gICAgICAvLyAyLiBJZiBkYXRhVVJMU3RydWN0IGlzIGZhaWx1cmUsIHRoZW4gcmV0dXJuIGFcbiAgICAgIC8vICAgIG5ldHdvcmsgZXJyb3IuXG4gICAgICBpZiAoZGF0YVVSTFN0cnVjdCA9PT0gJ2ZhaWx1cmUnKSB7XG4gICAgICAgIHJldHVybiBQcm9taXNlLnJlc29sdmUobWFrZU5ldHdvcmtFcnJvcignZmFpbGVkIHRvIGZldGNoIHRoZSBkYXRhIFVSTCcpKVxuICAgICAgfVxuXG4gICAgICAvLyAzLiBMZXQgbWltZVR5cGUgYmUgZGF0YVVSTFN0cnVjdOKAmXMgTUlNRSB0eXBlLCBzZXJpYWxpemVkLlxuICAgICAgY29uc3QgbWltZVR5cGUgPSBzZXJpYWxpemVBTWltZVR5cGUoZGF0YVVSTFN0cnVjdC5taW1lVHlwZSlcblxuICAgICAgLy8gNC4gUmV0dXJuIGEgcmVzcG9uc2Ugd2hvc2Ugc3RhdHVzIG1lc3NhZ2UgaXMgYE9LYCxcbiAgICAgIC8vICAgIGhlYWRlciBsaXN0IGlzIMKrIChgQ29udGVudC1UeXBlYCwgbWltZVR5cGUpIMK7LFxuICAgICAgLy8gICAgYW5kIGJvZHkgaXMgZGF0YVVSTFN0cnVjdOKAmXMgYm9keSBhcyBhIGJvZHkuXG4gICAgICByZXR1cm4gUHJvbWlzZS5yZXNvbHZlKG1ha2VSZXNwb25zZSh7XG4gICAgICAgIHN0YXR1c1RleHQ6ICdPSycsXG4gICAgICAgIGhlYWRlcnNMaXN0OiBbXG4gICAgICAgICAgWydjb250ZW50LXR5cGUnLCB7IG5hbWU6ICdDb250ZW50LVR5cGUnLCB2YWx1ZTogbWltZVR5cGUgfV1cbiAgICAgICAgXSxcbiAgICAgICAgYm9keTogc2FmZWx5RXh0cmFjdEJvZHkoZGF0YVVSTFN0cnVjdC5ib2R5KVswXVxuICAgICAgfSkpXG4gICAgfVxuICAgIGNhc2UgJ2ZpbGU6Jzoge1xuICAgICAgLy8gRm9yIG5vdywgdW5mb3J0dW5hdGUgYXMgaXQgaXMsIGZpbGUgVVJMcyBhcmUgbGVmdCBhcyBhbiBleGVyY2lzZSBmb3IgdGhlIHJlYWRlci5cbiAgICAgIC8vIFdoZW4gaW4gZG91YnQsIHJldHVybiBhIG5ldHdvcmsgZXJyb3IuXG4gICAgICByZXR1cm4gUHJvbWlzZS5yZXNvbHZlKG1ha2VOZXR3b3JrRXJyb3IoJ25vdCBpbXBsZW1lbnRlZC4uLiB5ZXQuLi4nKSlcbiAgICB9XG4gICAgY2FzZSAnaHR0cDonOlxuICAgIGNhc2UgJ2h0dHBzOic6IHtcbiAgICAgIC8vIFJldHVybiB0aGUgcmVzdWx0IG9mIHJ1bm5pbmcgSFRUUCBmZXRjaCBnaXZlbiBmZXRjaFBhcmFtcy5cblxuICAgICAgcmV0dXJuIGh0dHBGZXRjaChmZXRjaFBhcmFtcylcbiAgICAgICAgLmNhdGNoKChlcnIpID0+IG1ha2VOZXR3b3JrRXJyb3IoZXJyKSlcbiAgICB9XG4gICAgZGVmYXVsdDoge1xuICAgICAgcmV0dXJuIFByb21pc2UucmVzb2x2ZShtYWtlTmV0d29ya0Vycm9yKCd1bmtub3duIHNjaGVtZScpKVxuICAgIH1cbiAgfVxufVxuXG4vLyBodHRwczovL2ZldGNoLnNwZWMud2hhdHdnLm9yZy8jZmluYWxpemUtcmVzcG9uc2VcbmZ1bmN0aW9uIGZpbmFsaXplUmVzcG9uc2UgKGZldGNoUGFyYW1zLCByZXNwb25zZSkge1xuICAvLyAxLiBTZXQgZmV0Y2hQYXJhbXPigJlzIHJlcXVlc3TigJlzIGRvbmUgZmxhZy5cbiAgZmV0Y2hQYXJhbXMucmVxdWVzdC5kb25lID0gdHJ1ZVxuXG4gIC8vIDIsIElmIGZldGNoUGFyYW1z4oCZcyBwcm9jZXNzIHJlc3BvbnNlIGRvbmUgaXMgbm90IG51bGwsIHRoZW4gcXVldWUgYSBmZXRjaFxuICAvLyB0YXNrIHRvIHJ1biBmZXRjaFBhcmFtc+KAmXMgcHJvY2VzcyByZXNwb25zZSBkb25lIGdpdmVuIHJlc3BvbnNlLCB3aXRoXG4gIC8vIGZldGNoUGFyYW1z4oCZcyB0YXNrIGRlc3RpbmF0aW9uLlxuICBpZiAoZmV0Y2hQYXJhbXMucHJvY2Vzc1Jlc3BvbnNlRG9uZSAhPSBudWxsKSB7XG4gICAgcXVldWVNaWNyb3Rhc2soKCkgPT4gZmV0Y2hQYXJhbXMucHJvY2Vzc1Jlc3BvbnNlRG9uZShyZXNwb25zZSkpXG4gIH1cbn1cblxuLy8gaHR0cHM6Ly9mZXRjaC5zcGVjLndoYXR3Zy5vcmcvI2ZldGNoLWZpbmFsZVxuZnVuY3Rpb24gZmV0Y2hGaW5hbGUgKGZldGNoUGFyYW1zLCByZXNwb25zZSkge1xuICAvLyAxLiBJZiByZXNwb25zZSBpcyBhIG5ldHdvcmsgZXJyb3IsIHRoZW46XG4gIGlmIChyZXNwb25zZS50eXBlID09PSAnZXJyb3InKSB7XG4gICAgLy8gMS4gU2V0IHJlc3BvbnNl4oCZcyBVUkwgbGlzdCB0byDCqyBmZXRjaFBhcmFtc+KAmXMgcmVxdWVzdOKAmXMgVVJMIGxpc3RbMF0gwrsuXG4gICAgcmVzcG9uc2UudXJsTGlzdCA9IFtmZXRjaFBhcmFtcy5yZXF1ZXN0LnVybExpc3RbMF1dXG5cbiAgICAvLyAyLiBTZXQgcmVzcG9uc2XigJlzIHRpbWluZyBpbmZvIHRvIHRoZSByZXN1bHQgb2YgY3JlYXRpbmcgYW4gb3BhcXVlIHRpbWluZ1xuICAgIC8vIGluZm8gZm9yIGZldGNoUGFyYW1z4oCZcyB0aW1pbmcgaW5mby5cbiAgICByZXNwb25zZS50aW1pbmdJbmZvID0gY3JlYXRlT3BhcXVlVGltaW5nSW5mbyh7XG4gICAgICBzdGFydFRpbWU6IGZldGNoUGFyYW1zLnRpbWluZ0luZm8uc3RhcnRUaW1lXG4gICAgfSlcbiAgfVxuXG4gIC8vIDIuIExldCBwcm9jZXNzUmVzcG9uc2VFbmRPZkJvZHkgYmUgdGhlIGZvbGxvd2luZyBzdGVwczpcbiAgY29uc3QgcHJvY2Vzc1Jlc3BvbnNlRW5kT2ZCb2R5ID0gKCkgPT4ge1xuICAgIC8vIDEuIFNldCBmZXRjaFBhcmFtc+KAmXMgcmVxdWVzdOKAmXMgZG9uZSBmbGFnLlxuICAgIGZldGNoUGFyYW1zLnJlcXVlc3QuZG9uZSA9IHRydWVcblxuICAgIC8vIElmIGZldGNoUGFyYW1z4oCZcyBwcm9jZXNzIHJlc3BvbnNlIGVuZC1vZi1ib2R5IGlzIG5vdCBudWxsLFxuICAgIC8vIHRoZW4gcXVldWUgYSBmZXRjaCB0YXNrIHRvIHJ1biBmZXRjaFBhcmFtc+KAmXMgcHJvY2VzcyByZXNwb25zZVxuICAgIC8vIGVuZC1vZi1ib2R5IGdpdmVuIHJlc3BvbnNlIHdpdGggZmV0Y2hQYXJhbXPigJlzIHRhc2sgZGVzdGluYXRpb24uXG4gICAgaWYgKGZldGNoUGFyYW1zLnByb2Nlc3NSZXNwb25zZUVuZE9mQm9keSAhPSBudWxsKSB7XG4gICAgICBxdWV1ZU1pY3JvdGFzaygoKSA9PiBmZXRjaFBhcmFtcy5wcm9jZXNzUmVzcG9uc2VFbmRPZkJvZHkocmVzcG9uc2UpKVxuICAgIH1cbiAgfVxuXG4gIC8vIDMuIElmIGZldGNoUGFyYW1z4oCZcyBwcm9jZXNzIHJlc3BvbnNlIGlzIG5vbi1udWxsLCB0aGVuIHF1ZXVlIGEgZmV0Y2ggdGFza1xuICAvLyB0byBydW4gZmV0Y2hQYXJhbXPigJlzIHByb2Nlc3MgcmVzcG9uc2UgZ2l2ZW4gcmVzcG9uc2UsIHdpdGggZmV0Y2hQYXJhbXPigJlzXG4gIC8vIHRhc2sgZGVzdGluYXRpb24uXG4gIGlmIChmZXRjaFBhcmFtcy5wcm9jZXNzUmVzcG9uc2UgIT0gbnVsbCkge1xuICAgIHF1ZXVlTWljcm90YXNrKCgpID0+IGZldGNoUGFyYW1zLnByb2Nlc3NSZXNwb25zZShyZXNwb25zZSkpXG4gIH1cblxuICAvLyA0LiBJZiByZXNwb25zZeKAmXMgYm9keSBpcyBudWxsLCB0aGVuIHJ1biBwcm9jZXNzUmVzcG9uc2VFbmRPZkJvZHkuXG4gIGlmIChyZXNwb25zZS5ib2R5ID09IG51bGwpIHtcbiAgICBwcm9jZXNzUmVzcG9uc2VFbmRPZkJvZHkoKVxuICB9IGVsc2Uge1xuICAvLyA1LiBPdGhlcndpc2U6XG5cbiAgICAvLyAxLiBMZXQgdHJhbnNmb3JtU3RyZWFtIGJlIGEgbmV3IGEgVHJhbnNmb3JtU3RyZWFtLlxuXG4gICAgLy8gMi4gTGV0IGlkZW50aXR5VHJhbnNmb3JtQWxnb3JpdGhtIGJlIGFuIGFsZ29yaXRobSB3aGljaCwgZ2l2ZW4gY2h1bmssXG4gICAgLy8gZW5xdWV1ZXMgY2h1bmsgaW4gdHJhbnNmb3JtU3RyZWFtLlxuICAgIGNvbnN0IGlkZW50aXR5VHJhbnNmb3JtQWxnb3JpdGhtID0gKGNodW5rLCBjb250cm9sbGVyKSA9PiB7XG4gICAgICBjb250cm9sbGVyLmVucXVldWUoY2h1bmspXG4gICAgfVxuXG4gICAgLy8gMy4gU2V0IHVwIHRyYW5zZm9ybVN0cmVhbSB3aXRoIHRyYW5zZm9ybUFsZ29yaXRobSBzZXQgdG8gaWRlbnRpdHlUcmFuc2Zvcm1BbGdvcml0aG1cbiAgICAvLyBhbmQgZmx1c2hBbGdvcml0aG0gc2V0IHRvIHByb2Nlc3NSZXNwb25zZUVuZE9mQm9keS5cbiAgICBjb25zdCB0cmFuc2Zvcm1TdHJlYW0gPSBuZXcgVHJhbnNmb3JtU3RyZWFtKHtcbiAgICAgIHN0YXJ0ICgpIHt9LFxuICAgICAgdHJhbnNmb3JtOiBpZGVudGl0eVRyYW5zZm9ybUFsZ29yaXRobSxcbiAgICAgIGZsdXNoOiBwcm9jZXNzUmVzcG9uc2VFbmRPZkJvZHlcbiAgICB9LCB7XG4gICAgICBzaXplICgpIHtcbiAgICAgICAgcmV0dXJuIDFcbiAgICAgIH1cbiAgICB9LCB7XG4gICAgICBzaXplICgpIHtcbiAgICAgICAgcmV0dXJuIDFcbiAgICAgIH1cbiAgICB9KVxuXG4gICAgLy8gNC4gU2V0IHJlc3BvbnNl4oCZcyBib2R5IHRvIHRoZSByZXN1bHQgb2YgcGlwaW5nIHJlc3BvbnNl4oCZcyBib2R5IHRocm91Z2ggdHJhbnNmb3JtU3RyZWFtLlxuICAgIHJlc3BvbnNlLmJvZHkgPSB7IHN0cmVhbTogcmVzcG9uc2UuYm9keS5zdHJlYW0ucGlwZVRocm91Z2godHJhbnNmb3JtU3RyZWFtKSB9XG4gIH1cblxuICAvLyA2LiBJZiBmZXRjaFBhcmFtc+KAmXMgcHJvY2VzcyByZXNwb25zZSBjb25zdW1lIGJvZHkgaXMgbm9uLW51bGwsIHRoZW46XG4gIGlmIChmZXRjaFBhcmFtcy5wcm9jZXNzUmVzcG9uc2VDb25zdW1lQm9keSAhPSBudWxsKSB7XG4gICAgLy8gMS4gTGV0IHByb2Nlc3NCb2R5IGdpdmVuIG51bGxPckJ5dGVzIGJlIHRoaXMgc3RlcDogcnVuIGZldGNoUGFyYW1z4oCZc1xuICAgIC8vIHByb2Nlc3MgcmVzcG9uc2UgY29uc3VtZSBib2R5IGdpdmVuIHJlc3BvbnNlIGFuZCBudWxsT3JCeXRlcy5cbiAgICBjb25zdCBwcm9jZXNzQm9keSA9IChudWxsT3JCeXRlcykgPT4gZmV0Y2hQYXJhbXMucHJvY2Vzc1Jlc3BvbnNlQ29uc3VtZUJvZHkocmVzcG9uc2UsIG51bGxPckJ5dGVzKVxuXG4gICAgLy8gMi4gTGV0IHByb2Nlc3NCb2R5RXJyb3IgYmUgdGhpcyBzdGVwOiBydW4gZmV0Y2hQYXJhbXPigJlzIHByb2Nlc3NcbiAgICAvLyByZXNwb25zZSBjb25zdW1lIGJvZHkgZ2l2ZW4gcmVzcG9uc2UgYW5kIGZhaWx1cmUuXG4gICAgY29uc3QgcHJvY2Vzc0JvZHlFcnJvciA9IChmYWlsdXJlKSA9PiBmZXRjaFBhcmFtcy5wcm9jZXNzUmVzcG9uc2VDb25zdW1lQm9keShyZXNwb25zZSwgZmFpbHVyZSlcblxuICAgIC8vIDMuIElmIHJlc3BvbnNl4oCZcyBib2R5IGlzIG51bGwsIHRoZW4gcXVldWUgYSBmZXRjaCB0YXNrIHRvIHJ1biBwcm9jZXNzQm9keVxuICAgIC8vIGdpdmVuIG51bGwsIHdpdGggZmV0Y2hQYXJhbXPigJlzIHRhc2sgZGVzdGluYXRpb24uXG4gICAgaWYgKHJlc3BvbnNlLmJvZHkgPT0gbnVsbCkge1xuICAgICAgcXVldWVNaWNyb3Rhc2soKCkgPT4gcHJvY2Vzc0JvZHkobnVsbCkpXG4gICAgfSBlbHNlIHtcbiAgICAgIC8vIDQuIE90aGVyd2lzZSwgZnVsbHkgcmVhZCByZXNwb25zZeKAmXMgYm9keSBnaXZlbiBwcm9jZXNzQm9keSwgcHJvY2Vzc0JvZHlFcnJvcixcbiAgICAgIC8vIGFuZCBmZXRjaFBhcmFtc+KAmXMgdGFzayBkZXN0aW5hdGlvbi5cbiAgICAgIHJldHVybiBmdWxseVJlYWRCb2R5KHJlc3BvbnNlLmJvZHksIHByb2Nlc3NCb2R5LCBwcm9jZXNzQm9keUVycm9yKVxuICAgIH1cbiAgICByZXR1cm4gUHJvbWlzZS5yZXNvbHZlKClcbiAgfVxufVxuXG4vLyBodHRwczovL2ZldGNoLnNwZWMud2hhdHdnLm9yZy8jaHR0cC1mZXRjaFxuYXN5bmMgZnVuY3Rpb24gaHR0cEZldGNoIChmZXRjaFBhcmFtcykge1xuICAvLyAxLiBMZXQgcmVxdWVzdCBiZSBmZXRjaFBhcmFtc+KAmXMgcmVxdWVzdC5cbiAgY29uc3QgcmVxdWVzdCA9IGZldGNoUGFyYW1zLnJlcXVlc3RcblxuICAvLyAyLiBMZXQgcmVzcG9uc2UgYmUgbnVsbC5cbiAgbGV0IHJlc3BvbnNlID0gbnVsbFxuXG4gIC8vIDMuIExldCBhY3R1YWxSZXNwb25zZSBiZSBudWxsLlxuICBsZXQgYWN0dWFsUmVzcG9uc2UgPSBudWxsXG5cbiAgLy8gNC4gTGV0IHRpbWluZ0luZm8gYmUgZmV0Y2hQYXJhbXPigJlzIHRpbWluZyBpbmZvLlxuICBjb25zdCB0aW1pbmdJbmZvID0gZmV0Y2hQYXJhbXMudGltaW5nSW5mb1xuXG4gIC8vIDUuIElmIHJlcXVlc3TigJlzIHNlcnZpY2Utd29ya2VycyBtb2RlIGlzIFwiYWxsXCIsIHRoZW46XG4gIGlmIChyZXF1ZXN0LnNlcnZpY2VXb3JrZXJzID09PSAnYWxsJykge1xuICAgIC8vIFRPRE9cbiAgfVxuXG4gIC8vIDYuIElmIHJlc3BvbnNlIGlzIG51bGwsIHRoZW46XG4gIGlmIChyZXNwb25zZSA9PT0gbnVsbCkge1xuICAgIC8vIDEuIElmIG1ha2VDT1JTUHJlZmxpZ2h0IGlzIHRydWUgYW5kIG9uZSBvZiB0aGVzZSBjb25kaXRpb25zIGlzIHRydWU6XG4gICAgLy8gVE9ET1xuXG4gICAgLy8gMi4gSWYgcmVxdWVzdOKAmXMgcmVkaXJlY3QgbW9kZSBpcyBcImZvbGxvd1wiLCB0aGVuIHNldCByZXF1ZXN04oCZc1xuICAgIC8vIHNlcnZpY2Utd29ya2VycyBtb2RlIHRvIFwibm9uZVwiLlxuICAgIGlmIChyZXF1ZXN0LnJlZGlyZWN0ID09PSAnZm9sbG93Jykge1xuICAgICAgcmVxdWVzdC5zZXJ2aWNlV29ya2VycyA9ICdub25lJ1xuICAgIH1cblxuICAgIC8vIDMuIFNldCByZXNwb25zZSBhbmQgYWN0dWFsUmVzcG9uc2UgdG8gdGhlIHJlc3VsdCBvZiBydW5uaW5nXG4gICAgLy8gSFRUUC1uZXR3b3JrLW9yLWNhY2hlIGZldGNoIGdpdmVuIGZldGNoUGFyYW1zLlxuICAgIGFjdHVhbFJlc3BvbnNlID0gcmVzcG9uc2UgPSBhd2FpdCBodHRwTmV0d29ya09yQ2FjaGVGZXRjaChmZXRjaFBhcmFtcylcblxuICAgIC8vIDQuIElmIHJlcXVlc3TigJlzIHJlc3BvbnNlIHRhaW50aW5nIGlzIFwiY29yc1wiIGFuZCBhIENPUlMgY2hlY2tcbiAgICAvLyBmb3IgcmVxdWVzdCBhbmQgcmVzcG9uc2UgcmV0dXJucyBmYWlsdXJlLCB0aGVuIHJldHVybiBhIG5ldHdvcmsgZXJyb3IuXG4gICAgaWYgKFxuICAgICAgcmVxdWVzdC5yZXNwb25zZVRhaW50aW5nID09PSAnY29ycycgJiZcbiAgICAgIGNvcnNDaGVjayhyZXF1ZXN0LCByZXNwb25zZSkgPT09ICdmYWlsdXJlJ1xuICAgICkge1xuICAgICAgcmV0dXJuIG1ha2VOZXR3b3JrRXJyb3IoJ2NvcnMgZmFpbHVyZScpXG4gICAgfVxuXG4gICAgLy8gNS4gSWYgdGhlIFRBTyBjaGVjayBmb3IgcmVxdWVzdCBhbmQgcmVzcG9uc2UgcmV0dXJucyBmYWlsdXJlLCB0aGVuIHNldFxuICAgIC8vIHJlcXVlc3TigJlzIHRpbWluZyBhbGxvdyBmYWlsZWQgZmxhZy5cbiAgICBpZiAoVEFPQ2hlY2socmVxdWVzdCwgcmVzcG9uc2UpID09PSAnZmFpbHVyZScpIHtcbiAgICAgIHJlcXVlc3QudGltaW5nQWxsb3dGYWlsZWQgPSB0cnVlXG4gICAgfVxuICB9XG5cbiAgLy8gNy4gSWYgZWl0aGVyIHJlcXVlc3TigJlzIHJlc3BvbnNlIHRhaW50aW5nIG9yIHJlc3BvbnNl4oCZcyB0eXBlXG4gIC8vIGlzIFwib3BhcXVlXCIsIGFuZCB0aGUgY3Jvc3Mtb3JpZ2luIHJlc291cmNlIHBvbGljeSBjaGVjayB3aXRoXG4gIC8vIHJlcXVlc3TigJlzIG9yaWdpbiwgcmVxdWVzdOKAmXMgY2xpZW50LCByZXF1ZXN04oCZcyBkZXN0aW5hdGlvbixcbiAgLy8gYW5kIGFjdHVhbFJlc3BvbnNlIHJldHVybnMgYmxvY2tlZCwgdGhlbiByZXR1cm4gYSBuZXR3b3JrIGVycm9yLlxuICBpZiAoXG4gICAgKHJlcXVlc3QucmVzcG9uc2VUYWludGluZyA9PT0gJ29wYXF1ZScgfHwgcmVzcG9uc2UudHlwZSA9PT0gJ29wYXF1ZScpICYmXG4gICAgY3Jvc3NPcmlnaW5SZXNvdXJjZVBvbGljeUNoZWNrKFxuICAgICAgcmVxdWVzdC5vcmlnaW4sXG4gICAgICByZXF1ZXN0LmNsaWVudCxcbiAgICAgIHJlcXVlc3QuZGVzdGluYXRpb24sXG4gICAgICBhY3R1YWxSZXNwb25zZVxuICAgICkgPT09ICdibG9ja2VkJ1xuICApIHtcbiAgICByZXR1cm4gbWFrZU5ldHdvcmtFcnJvcignYmxvY2tlZCcpXG4gIH1cblxuICAvLyA4LiBJZiBhY3R1YWxSZXNwb25zZeKAmXMgc3RhdHVzIGlzIGEgcmVkaXJlY3Qgc3RhdHVzLCB0aGVuOlxuICBpZiAocmVkaXJlY3RTdGF0dXNTZXQuaGFzKGFjdHVhbFJlc3BvbnNlLnN0YXR1cykpIHtcbiAgICAvLyAxLiBJZiBhY3R1YWxSZXNwb25zZeKAmXMgc3RhdHVzIGlzIG5vdCAzMDMsIHJlcXVlc3TigJlzIGJvZHkgaXMgbm90IG51bGwsXG4gICAgLy8gYW5kIHRoZSBjb25uZWN0aW9uIHVzZXMgSFRUUC8yLCB0aGVuIHVzZXIgYWdlbnRzIG1heSwgYW5kIGFyZSBldmVuXG4gICAgLy8gZW5jb3VyYWdlZCB0bywgdHJhbnNtaXQgYW4gUlNUX1NUUkVBTSBmcmFtZS5cbiAgICAvLyBTZWUsIGh0dHBzOi8vZ2l0aHViLmNvbS93aGF0d2cvZmV0Y2gvaXNzdWVzLzEyODhcbiAgICBpZiAocmVxdWVzdC5yZWRpcmVjdCAhPT0gJ21hbnVhbCcpIHtcbiAgICAgIGZldGNoUGFyYW1zLmNvbnRyb2xsZXIuY29ubmVjdGlvbi5kZXN0cm95KClcbiAgICB9XG5cbiAgICAvLyAyLiBTd2l0Y2ggb24gcmVxdWVzdOKAmXMgcmVkaXJlY3QgbW9kZTpcbiAgICBpZiAocmVxdWVzdC5yZWRpcmVjdCA9PT0gJ2Vycm9yJykge1xuICAgICAgLy8gU2V0IHJlc3BvbnNlIHRvIGEgbmV0d29yayBlcnJvci5cbiAgICAgIHJlc3BvbnNlID0gbWFrZU5ldHdvcmtFcnJvcigndW5leHBlY3RlZCByZWRpcmVjdCcpXG4gICAgfSBlbHNlIGlmIChyZXF1ZXN0LnJlZGlyZWN0ID09PSAnbWFudWFsJykge1xuICAgICAgLy8gU2V0IHJlc3BvbnNlIHRvIGFuIG9wYXF1ZS1yZWRpcmVjdCBmaWx0ZXJlZCByZXNwb25zZSB3aG9zZSBpbnRlcm5hbFxuICAgICAgLy8gcmVzcG9uc2UgaXMgYWN0dWFsUmVzcG9uc2UuXG4gICAgICAvLyBOT1RFKHNwZWMpOiBPbiB0aGUgd2ViIHRoaXMgd291bGQgcmV0dXJuIGFuIGBvcGFxdWVyZWRpcmVjdGAgcmVzcG9uc2UsXG4gICAgICAvLyBidXQgdGhhdCBkb2Vzbid0IG1ha2Ugc2Vuc2Ugc2VydmVyIHNpZGUuXG4gICAgICAvLyBTZWUgaHR0cHM6Ly9naXRodWIuY29tL25vZGVqcy91bmRpY2kvaXNzdWVzLzExOTMuXG4gICAgICByZXNwb25zZSA9IGFjdHVhbFJlc3BvbnNlXG4gICAgfSBlbHNlIGlmIChyZXF1ZXN0LnJlZGlyZWN0ID09PSAnZm9sbG93Jykge1xuICAgICAgLy8gU2V0IHJlc3BvbnNlIHRvIHRoZSByZXN1bHQgb2YgcnVubmluZyBIVFRQLXJlZGlyZWN0IGZldGNoIGdpdmVuXG4gICAgICAvLyBmZXRjaFBhcmFtcyBhbmQgcmVzcG9uc2UuXG4gICAgICByZXNwb25zZSA9IGF3YWl0IGh0dHBSZWRpcmVjdEZldGNoKGZldGNoUGFyYW1zLCByZXNwb25zZSlcbiAgICB9IGVsc2Uge1xuICAgICAgYXNzZXJ0KGZhbHNlKVxuICAgIH1cbiAgfVxuXG4gIC8vIDkuIFNldCByZXNwb25zZeKAmXMgdGltaW5nIGluZm8gdG8gdGltaW5nSW5mby5cbiAgcmVzcG9uc2UudGltaW5nSW5mbyA9IHRpbWluZ0luZm9cblxuICAvLyAxMC4gUmV0dXJuIHJlc3BvbnNlLlxuICByZXR1cm4gcmVzcG9uc2Vcbn1cblxuLy8gaHR0cHM6Ly9mZXRjaC5zcGVjLndoYXR3Zy5vcmcvI2h0dHAtcmVkaXJlY3QtZmV0Y2hcbmZ1bmN0aW9uIGh0dHBSZWRpcmVjdEZldGNoIChmZXRjaFBhcmFtcywgcmVzcG9uc2UpIHtcbiAgLy8gMS4gTGV0IHJlcXVlc3QgYmUgZmV0Y2hQYXJhbXPigJlzIHJlcXVlc3QuXG4gIGNvbnN0IHJlcXVlc3QgPSBmZXRjaFBhcmFtcy5yZXF1ZXN0XG5cbiAgLy8gMi4gTGV0IGFjdHVhbFJlc3BvbnNlIGJlIHJlc3BvbnNlLCBpZiByZXNwb25zZSBpcyBub3QgYSBmaWx0ZXJlZCByZXNwb25zZSxcbiAgLy8gYW5kIHJlc3BvbnNl4oCZcyBpbnRlcm5hbCByZXNwb25zZSBvdGhlcndpc2UuXG4gIGNvbnN0IGFjdHVhbFJlc3BvbnNlID0gcmVzcG9uc2UuaW50ZXJuYWxSZXNwb25zZVxuICAgID8gcmVzcG9uc2UuaW50ZXJuYWxSZXNwb25zZVxuICAgIDogcmVzcG9uc2VcblxuICAvLyAzLiBMZXQgbG9jYXRpb25VUkwgYmUgYWN0dWFsUmVzcG9uc2XigJlzIGxvY2F0aW9uIFVSTCBnaXZlbiByZXF1ZXN04oCZcyBjdXJyZW50XG4gIC8vIFVSTOKAmXMgZnJhZ21lbnQuXG4gIGxldCBsb2NhdGlvblVSTFxuXG4gIHRyeSB7XG4gICAgbG9jYXRpb25VUkwgPSByZXNwb25zZUxvY2F0aW9uVVJMKFxuICAgICAgYWN0dWFsUmVzcG9uc2UsXG4gICAgICByZXF1ZXN0Q3VycmVudFVSTChyZXF1ZXN0KS5oYXNoXG4gICAgKVxuXG4gICAgLy8gNC4gSWYgbG9jYXRpb25VUkwgaXMgbnVsbCwgdGhlbiByZXR1cm4gcmVzcG9uc2UuXG4gICAgaWYgKGxvY2F0aW9uVVJMID09IG51bGwpIHtcbiAgICAgIHJldHVybiByZXNwb25zZVxuICAgIH1cbiAgfSBjYXRjaCAoZXJyKSB7XG4gICAgLy8gNS4gSWYgbG9jYXRpb25VUkwgaXMgZmFpbHVyZSwgdGhlbiByZXR1cm4gYSBuZXR3b3JrIGVycm9yLlxuICAgIHJldHVybiBQcm9taXNlLnJlc29sdmUobWFrZU5ldHdvcmtFcnJvcihlcnIpKVxuICB9XG5cbiAgLy8gNi4gSWYgbG9jYXRpb25VUkzigJlzIHNjaGVtZSBpcyBub3QgYW4gSFRUUChTKSBzY2hlbWUsIHRoZW4gcmV0dXJuIGEgbmV0d29ya1xuICAvLyBlcnJvci5cbiAgaWYgKCF1cmxJc0h0dHBIdHRwc1NjaGVtZShsb2NhdGlvblVSTCkpIHtcbiAgICByZXR1cm4gUHJvbWlzZS5yZXNvbHZlKG1ha2VOZXR3b3JrRXJyb3IoJ1VSTCBzY2hlbWUgbXVzdCBiZSBhIEhUVFAoUykgc2NoZW1lJykpXG4gIH1cblxuICAvLyA3LiBJZiByZXF1ZXN04oCZcyByZWRpcmVjdCBjb3VudCBpcyAyMCwgdGhlbiByZXR1cm4gYSBuZXR3b3JrIGVycm9yLlxuICBpZiAocmVxdWVzdC5yZWRpcmVjdENvdW50ID09PSAyMCkge1xuICAgIHJldHVybiBQcm9taXNlLnJlc29sdmUobWFrZU5ldHdvcmtFcnJvcigncmVkaXJlY3QgY291bnQgZXhjZWVkZWQnKSlcbiAgfVxuXG4gIC8vIDguIEluY3JlYXNlIHJlcXVlc3TigJlzIHJlZGlyZWN0IGNvdW50IGJ5IDEuXG4gIHJlcXVlc3QucmVkaXJlY3RDb3VudCArPSAxXG5cbiAgLy8gOS4gSWYgcmVxdWVzdOKAmXMgbW9kZSBpcyBcImNvcnNcIiwgbG9jYXRpb25VUkwgaW5jbHVkZXMgY3JlZGVudGlhbHMsIGFuZFxuICAvLyByZXF1ZXN04oCZcyBvcmlnaW4gaXMgbm90IHNhbWUgb3JpZ2luIHdpdGggbG9jYXRpb25VUkzigJlzIG9yaWdpbiwgdGhlbiByZXR1cm5cbiAgLy8gIGEgbmV0d29yayBlcnJvci5cbiAgaWYgKFxuICAgIHJlcXVlc3QubW9kZSA9PT0gJ2NvcnMnICYmXG4gICAgKGxvY2F0aW9uVVJMLnVzZXJuYW1lIHx8IGxvY2F0aW9uVVJMLnBhc3N3b3JkKSAmJlxuICAgICFzYW1lT3JpZ2luKHJlcXVlc3QsIGxvY2F0aW9uVVJMKVxuICApIHtcbiAgICByZXR1cm4gUHJvbWlzZS5yZXNvbHZlKG1ha2VOZXR3b3JrRXJyb3IoJ2Nyb3NzIG9yaWdpbiBub3QgYWxsb3dlZCBmb3IgcmVxdWVzdCBtb2RlIFwiY29yc1wiJykpXG4gIH1cblxuICAvLyAxMC4gSWYgcmVxdWVzdOKAmXMgcmVzcG9uc2UgdGFpbnRpbmcgaXMgXCJjb3JzXCIgYW5kIGxvY2F0aW9uVVJMIGluY2x1ZGVzXG4gIC8vIGNyZWRlbnRpYWxzLCB0aGVuIHJldHVybiBhIG5ldHdvcmsgZXJyb3IuXG4gIGlmIChcbiAgICByZXF1ZXN0LnJlc3BvbnNlVGFpbnRpbmcgPT09ICdjb3JzJyAmJlxuICAgIChsb2NhdGlvblVSTC51c2VybmFtZSB8fCBsb2NhdGlvblVSTC5wYXNzd29yZClcbiAgKSB7XG4gICAgcmV0dXJuIFByb21pc2UucmVzb2x2ZShtYWtlTmV0d29ya0Vycm9yKFxuICAgICAgJ1VSTCBjYW5ub3QgY29udGFpbiBjcmVkZW50aWFscyBmb3IgcmVxdWVzdCBtb2RlIFwiY29yc1wiJ1xuICAgICkpXG4gIH1cblxuICAvLyAxMS4gSWYgYWN0dWFsUmVzcG9uc2XigJlzIHN0YXR1cyBpcyBub3QgMzAzLCByZXF1ZXN04oCZcyBib2R5IGlzIG5vbi1udWxsLFxuICAvLyBhbmQgcmVxdWVzdOKAmXMgYm9keeKAmXMgc291cmNlIGlzIG51bGwsIHRoZW4gcmV0dXJuIGEgbmV0d29yayBlcnJvci5cbiAgaWYgKFxuICAgIGFjdHVhbFJlc3BvbnNlLnN0YXR1cyAhPT0gMzAzICYmXG4gICAgcmVxdWVzdC5ib2R5ICE9IG51bGwgJiZcbiAgICByZXF1ZXN0LmJvZHkuc291cmNlID09IG51bGxcbiAgKSB7XG4gICAgcmV0dXJuIFByb21pc2UucmVzb2x2ZShtYWtlTmV0d29ya0Vycm9yKCkpXG4gIH1cblxuICAvLyAxMi4gSWYgb25lIG9mIHRoZSBmb2xsb3dpbmcgaXMgdHJ1ZVxuICAvLyAtIGFjdHVhbFJlc3BvbnNl4oCZcyBzdGF0dXMgaXMgMzAxIG9yIDMwMiBhbmQgcmVxdWVzdOKAmXMgbWV0aG9kIGlzIGBQT1NUYFxuICAvLyAtIGFjdHVhbFJlc3BvbnNl4oCZcyBzdGF0dXMgaXMgMzAzIGFuZCByZXF1ZXN04oCZcyBtZXRob2QgaXMgbm90IGBHRVRgIG9yIGBIRUFEYFxuICBpZiAoXG4gICAgKFszMDEsIDMwMl0uaW5jbHVkZXMoYWN0dWFsUmVzcG9uc2Uuc3RhdHVzKSAmJiByZXF1ZXN0Lm1ldGhvZCA9PT0gJ1BPU1QnKSB8fFxuICAgIChhY3R1YWxSZXNwb25zZS5zdGF0dXMgPT09IDMwMyAmJlxuICAgICAgIUdFVF9PUl9IRUFELmluY2x1ZGVzKHJlcXVlc3QubWV0aG9kKSlcbiAgKSB7XG4gICAgLy8gdGhlbjpcbiAgICAvLyAxLiBTZXQgcmVxdWVzdOKAmXMgbWV0aG9kIHRvIGBHRVRgIGFuZCByZXF1ZXN04oCZcyBib2R5IHRvIG51bGwuXG4gICAgcmVxdWVzdC5tZXRob2QgPSAnR0VUJ1xuICAgIHJlcXVlc3QuYm9keSA9IG51bGxcblxuICAgIC8vIDIuIEZvciBlYWNoIGhlYWRlck5hbWUgb2YgcmVxdWVzdC1ib2R5LWhlYWRlciBuYW1lLCBkZWxldGUgaGVhZGVyTmFtZSBmcm9tXG4gICAgLy8gcmVxdWVzdOKAmXMgaGVhZGVyIGxpc3QuXG4gICAgZm9yIChjb25zdCBoZWFkZXJOYW1lIG9mIHJlcXVlc3RCb2R5SGVhZGVyKSB7XG4gICAgICByZXF1ZXN0LmhlYWRlcnNMaXN0LmRlbGV0ZShoZWFkZXJOYW1lKVxuICAgIH1cbiAgfVxuXG4gIC8vIDEzLiBJZiByZXF1ZXN04oCZcyBjdXJyZW50IFVSTOKAmXMgb3JpZ2luIGlzIG5vdCBzYW1lIG9yaWdpbiB3aXRoIGxvY2F0aW9uVVJM4oCZc1xuICAvLyAgICAgb3JpZ2luLCB0aGVuIGZvciBlYWNoIGhlYWRlck5hbWUgb2YgQ09SUyBub24td2lsZGNhcmQgcmVxdWVzdC1oZWFkZXIgbmFtZSxcbiAgLy8gICAgIGRlbGV0ZSBoZWFkZXJOYW1lIGZyb20gcmVxdWVzdOKAmXMgaGVhZGVyIGxpc3QuXG4gIGlmICghc2FtZU9yaWdpbihyZXF1ZXN0Q3VycmVudFVSTChyZXF1ZXN0KSwgbG9jYXRpb25VUkwpKSB7XG4gICAgLy8gaHR0cHM6Ly9mZXRjaC5zcGVjLndoYXR3Zy5vcmcvI2NvcnMtbm9uLXdpbGRjYXJkLXJlcXVlc3QtaGVhZGVyLW5hbWVcbiAgICByZXF1ZXN0LmhlYWRlcnNMaXN0LmRlbGV0ZSgnYXV0aG9yaXphdGlvbicpXG5cbiAgICAvLyBodHRwczovL2ZldGNoLnNwZWMud2hhdHdnLm9yZy8jYXV0aGVudGljYXRpb24tZW50cmllc1xuICAgIHJlcXVlc3QuaGVhZGVyc0xpc3QuZGVsZXRlKCdwcm94eS1hdXRob3JpemF0aW9uJywgdHJ1ZSlcblxuICAgIC8vIFwiQ29va2llXCIgYW5kIFwiSG9zdFwiIGFyZSBmb3JiaWRkZW4gcmVxdWVzdC1oZWFkZXJzLCB3aGljaCB1bmRpY2kgZG9lc24ndCBpbXBsZW1lbnQuXG4gICAgcmVxdWVzdC5oZWFkZXJzTGlzdC5kZWxldGUoJ2Nvb2tpZScpXG4gICAgcmVxdWVzdC5oZWFkZXJzTGlzdC5kZWxldGUoJ2hvc3QnKVxuICB9XG5cbiAgLy8gMTQuIElmIHJlcXVlc3TigJlzIGJvZHkgaXMgbm9uLW51bGwsIHRoZW4gc2V0IHJlcXVlc3TigJlzIGJvZHkgdG8gdGhlIGZpcnN0IHJldHVyblxuICAvLyB2YWx1ZSBvZiBzYWZlbHkgZXh0cmFjdGluZyByZXF1ZXN04oCZcyBib2R54oCZcyBzb3VyY2UuXG4gIGlmIChyZXF1ZXN0LmJvZHkgIT0gbnVsbCkge1xuICAgIGFzc2VydChyZXF1ZXN0LmJvZHkuc291cmNlICE9IG51bGwpXG4gICAgcmVxdWVzdC5ib2R5ID0gc2FmZWx5RXh0cmFjdEJvZHkocmVxdWVzdC5ib2R5LnNvdXJjZSlbMF1cbiAgfVxuXG4gIC8vIDE1LiBMZXQgdGltaW5nSW5mbyBiZSBmZXRjaFBhcmFtc+KAmXMgdGltaW5nIGluZm8uXG4gIGNvbnN0IHRpbWluZ0luZm8gPSBmZXRjaFBhcmFtcy50aW1pbmdJbmZvXG5cbiAgLy8gMTYuIFNldCB0aW1pbmdJbmZv4oCZcyByZWRpcmVjdCBlbmQgdGltZSBhbmQgcG9zdC1yZWRpcmVjdCBzdGFydCB0aW1lIHRvIHRoZVxuICAvLyBjb2Fyc2VuZWQgc2hhcmVkIGN1cnJlbnQgdGltZSBnaXZlbiBmZXRjaFBhcmFtc+KAmXMgY3Jvc3Mtb3JpZ2luIGlzb2xhdGVkXG4gIC8vIGNhcGFiaWxpdHkuXG4gIHRpbWluZ0luZm8ucmVkaXJlY3RFbmRUaW1lID0gdGltaW5nSW5mby5wb3N0UmVkaXJlY3RTdGFydFRpbWUgPVxuICAgIGNvYXJzZW5lZFNoYXJlZEN1cnJlbnRUaW1lKGZldGNoUGFyYW1zLmNyb3NzT3JpZ2luSXNvbGF0ZWRDYXBhYmlsaXR5KVxuXG4gIC8vIDE3LiBJZiB0aW1pbmdJbmZv4oCZcyByZWRpcmVjdCBzdGFydCB0aW1lIGlzIDAsIHRoZW4gc2V0IHRpbWluZ0luZm/igJlzXG4gIC8vICByZWRpcmVjdCBzdGFydCB0aW1lIHRvIHRpbWluZ0luZm/igJlzIHN0YXJ0IHRpbWUuXG4gIGlmICh0aW1pbmdJbmZvLnJlZGlyZWN0U3RhcnRUaW1lID09PSAwKSB7XG4gICAgdGltaW5nSW5mby5yZWRpcmVjdFN0YXJ0VGltZSA9IHRpbWluZ0luZm8uc3RhcnRUaW1lXG4gIH1cblxuICAvLyAxOC4gQXBwZW5kIGxvY2F0aW9uVVJMIHRvIHJlcXVlc3TigJlzIFVSTCBsaXN0LlxuICByZXF1ZXN0LnVybExpc3QucHVzaChsb2NhdGlvblVSTClcblxuICAvLyAxOS4gSW52b2tlIHNldCByZXF1ZXN04oCZcyByZWZlcnJlciBwb2xpY3kgb24gcmVkaXJlY3Qgb24gcmVxdWVzdCBhbmRcbiAgLy8gYWN0dWFsUmVzcG9uc2UuXG4gIHNldFJlcXVlc3RSZWZlcnJlclBvbGljeU9uUmVkaXJlY3QocmVxdWVzdCwgYWN0dWFsUmVzcG9uc2UpXG5cbiAgLy8gMjAuIFJldHVybiB0aGUgcmVzdWx0IG9mIHJ1bm5pbmcgbWFpbiBmZXRjaCBnaXZlbiBmZXRjaFBhcmFtcyBhbmQgdHJ1ZS5cbiAgcmV0dXJuIG1haW5GZXRjaChmZXRjaFBhcmFtcywgdHJ1ZSlcbn1cblxuLy8gaHR0cHM6Ly9mZXRjaC5zcGVjLndoYXR3Zy5vcmcvI2h0dHAtbmV0d29yay1vci1jYWNoZS1mZXRjaFxuYXN5bmMgZnVuY3Rpb24gaHR0cE5ldHdvcmtPckNhY2hlRmV0Y2ggKFxuICBmZXRjaFBhcmFtcyxcbiAgaXNBdXRoZW50aWNhdGlvbkZldGNoID0gZmFsc2UsXG4gIGlzTmV3Q29ubmVjdGlvbkZldGNoID0gZmFsc2Vcbikge1xuICAvLyAxLiBMZXQgcmVxdWVzdCBiZSBmZXRjaFBhcmFtc+KAmXMgcmVxdWVzdC5cbiAgY29uc3QgcmVxdWVzdCA9IGZldGNoUGFyYW1zLnJlcXVlc3RcblxuICAvLyAyLiBMZXQgaHR0cEZldGNoUGFyYW1zIGJlIG51bGwuXG4gIGxldCBodHRwRmV0Y2hQYXJhbXMgPSBudWxsXG5cbiAgLy8gMy4gTGV0IGh0dHBSZXF1ZXN0IGJlIG51bGwuXG4gIGxldCBodHRwUmVxdWVzdCA9IG51bGxcblxuICAvLyA0LiBMZXQgcmVzcG9uc2UgYmUgbnVsbC5cbiAgbGV0IHJlc3BvbnNlID0gbnVsbFxuXG4gIC8vIDUuIExldCBzdG9yZWRSZXNwb25zZSBiZSBudWxsLlxuICAvLyBUT0RPOiBjYWNoZVxuXG4gIC8vIDYuIExldCBodHRwQ2FjaGUgYmUgbnVsbC5cbiAgY29uc3QgaHR0cENhY2hlID0gbnVsbFxuXG4gIC8vIDcuIExldCB0aGUgcmV2YWxpZGF0aW5nRmxhZyBiZSB1bnNldC5cbiAgY29uc3QgcmV2YWxpZGF0aW5nRmxhZyA9IGZhbHNlXG5cbiAgLy8gOC4gUnVuIHRoZXNlIHN0ZXBzLCBidXQgYWJvcnQgd2hlbiB0aGUgb25nb2luZyBmZXRjaCBpcyB0ZXJtaW5hdGVkOlxuXG4gIC8vICAgIDEuIElmIHJlcXVlc3TigJlzIHdpbmRvdyBpcyBcIm5vLXdpbmRvd1wiIGFuZCByZXF1ZXN04oCZcyByZWRpcmVjdCBtb2RlIGlzXG4gIC8vICAgIFwiZXJyb3JcIiwgdGhlbiBzZXQgaHR0cEZldGNoUGFyYW1zIHRvIGZldGNoUGFyYW1zIGFuZCBodHRwUmVxdWVzdCB0b1xuICAvLyAgICByZXF1ZXN0LlxuICBpZiAocmVxdWVzdC53aW5kb3cgPT09ICduby13aW5kb3cnICYmIHJlcXVlc3QucmVkaXJlY3QgPT09ICdlcnJvcicpIHtcbiAgICBodHRwRmV0Y2hQYXJhbXMgPSBmZXRjaFBhcmFtc1xuICAgIGh0dHBSZXF1ZXN0ID0gcmVxdWVzdFxuICB9IGVsc2Uge1xuICAgIC8vIE90aGVyd2lzZTpcblxuICAgIC8vIDEuIFNldCBodHRwUmVxdWVzdCB0byBhIGNsb25lIG9mIHJlcXVlc3QuXG4gICAgaHR0cFJlcXVlc3QgPSBtYWtlUmVxdWVzdChyZXF1ZXN0KVxuXG4gICAgLy8gMi4gU2V0IGh0dHBGZXRjaFBhcmFtcyB0byBhIGNvcHkgb2YgZmV0Y2hQYXJhbXMuXG4gICAgaHR0cEZldGNoUGFyYW1zID0geyAuLi5mZXRjaFBhcmFtcyB9XG5cbiAgICAvLyAzLiBTZXQgaHR0cEZldGNoUGFyYW1z4oCZcyByZXF1ZXN0IHRvIGh0dHBSZXF1ZXN0LlxuICAgIGh0dHBGZXRjaFBhcmFtcy5yZXF1ZXN0ID0gaHR0cFJlcXVlc3RcbiAgfVxuXG4gIC8vICAgIDMuIExldCBpbmNsdWRlQ3JlZGVudGlhbHMgYmUgdHJ1ZSBpZiBvbmUgb2ZcbiAgY29uc3QgaW5jbHVkZUNyZWRlbnRpYWxzID1cbiAgICByZXF1ZXN0LmNyZWRlbnRpYWxzID09PSAnaW5jbHVkZScgfHxcbiAgICAocmVxdWVzdC5jcmVkZW50aWFscyA9PT0gJ3NhbWUtb3JpZ2luJyAmJlxuICAgICAgcmVxdWVzdC5yZXNwb25zZVRhaW50aW5nID09PSAnYmFzaWMnKVxuXG4gIC8vICAgIDQuIExldCBjb250ZW50TGVuZ3RoIGJlIGh0dHBSZXF1ZXN04oCZcyBib2R54oCZcyBsZW5ndGgsIGlmIGh0dHBSZXF1ZXN04oCZc1xuICAvLyAgICBib2R5IGlzIG5vbi1udWxsOyBvdGhlcndpc2UgbnVsbC5cbiAgY29uc3QgY29udGVudExlbmd0aCA9IGh0dHBSZXF1ZXN0LmJvZHkgPyBodHRwUmVxdWVzdC5ib2R5Lmxlbmd0aCA6IG51bGxcblxuICAvLyAgICA1LiBMZXQgY29udGVudExlbmd0aEhlYWRlclZhbHVlIGJlIG51bGwuXG4gIGxldCBjb250ZW50TGVuZ3RoSGVhZGVyVmFsdWUgPSBudWxsXG5cbiAgLy8gICAgNi4gSWYgaHR0cFJlcXVlc3TigJlzIGJvZHkgaXMgbnVsbCBhbmQgaHR0cFJlcXVlc3TigJlzIG1ldGhvZCBpcyBgUE9TVGAgb3JcbiAgLy8gICAgYFBVVGAsIHRoZW4gc2V0IGNvbnRlbnRMZW5ndGhIZWFkZXJWYWx1ZSB0byBgMGAuXG4gIGlmIChcbiAgICBodHRwUmVxdWVzdC5ib2R5ID09IG51bGwgJiZcbiAgICBbJ1BPU1QnLCAnUFVUJ10uaW5jbHVkZXMoaHR0cFJlcXVlc3QubWV0aG9kKVxuICApIHtcbiAgICBjb250ZW50TGVuZ3RoSGVhZGVyVmFsdWUgPSAnMCdcbiAgfVxuXG4gIC8vICAgIDcuIElmIGNvbnRlbnRMZW5ndGggaXMgbm9uLW51bGwsIHRoZW4gc2V0IGNvbnRlbnRMZW5ndGhIZWFkZXJWYWx1ZSB0b1xuICAvLyAgICBjb250ZW50TGVuZ3RoLCBzZXJpYWxpemVkIGFuZCBpc29tb3JwaGljIGVuY29kZWQuXG4gIGlmIChjb250ZW50TGVuZ3RoICE9IG51bGwpIHtcbiAgICBjb250ZW50TGVuZ3RoSGVhZGVyVmFsdWUgPSBpc29tb3JwaGljRW5jb2RlKGAke2NvbnRlbnRMZW5ndGh9YClcbiAgfVxuXG4gIC8vICAgIDguIElmIGNvbnRlbnRMZW5ndGhIZWFkZXJWYWx1ZSBpcyBub24tbnVsbCwgdGhlbiBhcHBlbmRcbiAgLy8gICAgYENvbnRlbnQtTGVuZ3RoYC9jb250ZW50TGVuZ3RoSGVhZGVyVmFsdWUgdG8gaHR0cFJlcXVlc3TigJlzIGhlYWRlclxuICAvLyAgICBsaXN0LlxuICBpZiAoY29udGVudExlbmd0aEhlYWRlclZhbHVlICE9IG51bGwpIHtcbiAgICBodHRwUmVxdWVzdC5oZWFkZXJzTGlzdC5hcHBlbmQoJ2NvbnRlbnQtbGVuZ3RoJywgY29udGVudExlbmd0aEhlYWRlclZhbHVlKVxuICB9XG5cbiAgLy8gICAgOS4gSWYgY29udGVudExlbmd0aEhlYWRlclZhbHVlIGlzIG5vbi1udWxsLCB0aGVuIGFwcGVuZCAoYENvbnRlbnQtTGVuZ3RoYCxcbiAgLy8gICAgY29udGVudExlbmd0aEhlYWRlclZhbHVlKSB0byBodHRwUmVxdWVzdOKAmXMgaGVhZGVyIGxpc3QuXG5cbiAgLy8gICAgMTAuIElmIGNvbnRlbnRMZW5ndGggaXMgbm9uLW51bGwgYW5kIGh0dHBSZXF1ZXN04oCZcyBrZWVwYWxpdmUgaXMgdHJ1ZSxcbiAgLy8gICAgdGhlbjpcbiAgaWYgKGNvbnRlbnRMZW5ndGggIT0gbnVsbCAmJiBodHRwUmVxdWVzdC5rZWVwYWxpdmUpIHtcbiAgICAvLyBOT1RFOiBrZWVwYWxpdmUgaXMgYSBub29wIG91dHNpZGUgb2YgYnJvd3NlciBjb250ZXh0LlxuICB9XG5cbiAgLy8gICAgMTEuIElmIGh0dHBSZXF1ZXN04oCZcyByZWZlcnJlciBpcyBhIFVSTCwgdGhlbiBhcHBlbmRcbiAgLy8gICAgYFJlZmVyZXJgL2h0dHBSZXF1ZXN04oCZcyByZWZlcnJlciwgc2VyaWFsaXplZCBhbmQgaXNvbW9ycGhpYyBlbmNvZGVkLFxuICAvLyAgICAgdG8gaHR0cFJlcXVlc3TigJlzIGhlYWRlciBsaXN0LlxuICBpZiAoaHR0cFJlcXVlc3QucmVmZXJyZXIgaW5zdGFuY2VvZiBVUkwpIHtcbiAgICBodHRwUmVxdWVzdC5oZWFkZXJzTGlzdC5hcHBlbmQoJ3JlZmVyZXInLCBpc29tb3JwaGljRW5jb2RlKGh0dHBSZXF1ZXN0LnJlZmVycmVyLmhyZWYpKVxuICB9XG5cbiAgLy8gICAgMTIuIEFwcGVuZCBhIHJlcXVlc3QgYE9yaWdpbmAgaGVhZGVyIGZvciBodHRwUmVxdWVzdC5cbiAgYXBwZW5kUmVxdWVzdE9yaWdpbkhlYWRlcihodHRwUmVxdWVzdClcblxuICAvLyAgICAxMy4gQXBwZW5kIHRoZSBGZXRjaCBtZXRhZGF0YSBoZWFkZXJzIGZvciBodHRwUmVxdWVzdC4gW0ZFVENILU1FVEFEQVRBXVxuICBhcHBlbmRGZXRjaE1ldGFkYXRhKGh0dHBSZXF1ZXN0KVxuXG4gIC8vICAgIDE0LiBJZiBodHRwUmVxdWVzdOKAmXMgaGVhZGVyIGxpc3QgZG9lcyBub3QgY29udGFpbiBgVXNlci1BZ2VudGAsIHRoZW5cbiAgLy8gICAgdXNlciBhZ2VudHMgc2hvdWxkIGFwcGVuZCBgVXNlci1BZ2VudGAvZGVmYXVsdCBgVXNlci1BZ2VudGAgdmFsdWUgdG9cbiAgLy8gICAgaHR0cFJlcXVlc3TigJlzIGhlYWRlciBsaXN0LlxuICBpZiAoIWh0dHBSZXF1ZXN0LmhlYWRlcnNMaXN0LmNvbnRhaW5zKCd1c2VyLWFnZW50JykpIHtcbiAgICBodHRwUmVxdWVzdC5oZWFkZXJzTGlzdC5hcHBlbmQoJ3VzZXItYWdlbnQnLCB0eXBlb2YgZXNidWlsZERldGVjdGlvbiA9PT0gJ3VuZGVmaW5lZCcgPyAndW5kaWNpJyA6ICdub2RlJylcbiAgfVxuXG4gIC8vICAgIDE1LiBJZiBodHRwUmVxdWVzdOKAmXMgY2FjaGUgbW9kZSBpcyBcImRlZmF1bHRcIiBhbmQgaHR0cFJlcXVlc3TigJlzIGhlYWRlclxuICAvLyAgICBsaXN0IGNvbnRhaW5zIGBJZi1Nb2RpZmllZC1TaW5jZWAsIGBJZi1Ob25lLU1hdGNoYCxcbiAgLy8gICAgYElmLVVubW9kaWZpZWQtU2luY2VgLCBgSWYtTWF0Y2hgLCBvciBgSWYtUmFuZ2VgLCB0aGVuIHNldFxuICAvLyAgICBodHRwUmVxdWVzdOKAmXMgY2FjaGUgbW9kZSB0byBcIm5vLXN0b3JlXCIuXG4gIGlmIChcbiAgICBodHRwUmVxdWVzdC5jYWNoZSA9PT0gJ2RlZmF1bHQnICYmXG4gICAgKGh0dHBSZXF1ZXN0LmhlYWRlcnNMaXN0LmNvbnRhaW5zKCdpZi1tb2RpZmllZC1zaW5jZScpIHx8XG4gICAgICBodHRwUmVxdWVzdC5oZWFkZXJzTGlzdC5jb250YWlucygnaWYtbm9uZS1tYXRjaCcpIHx8XG4gICAgICBodHRwUmVxdWVzdC5oZWFkZXJzTGlzdC5jb250YWlucygnaWYtdW5tb2RpZmllZC1zaW5jZScpIHx8XG4gICAgICBodHRwUmVxdWVzdC5oZWFkZXJzTGlzdC5jb250YWlucygnaWYtbWF0Y2gnKSB8fFxuICAgICAgaHR0cFJlcXVlc3QuaGVhZGVyc0xpc3QuY29udGFpbnMoJ2lmLXJhbmdlJykpXG4gICkge1xuICAgIGh0dHBSZXF1ZXN0LmNhY2hlID0gJ25vLXN0b3JlJ1xuICB9XG5cbiAgLy8gICAgMTYuIElmIGh0dHBSZXF1ZXN04oCZcyBjYWNoZSBtb2RlIGlzIFwibm8tY2FjaGVcIiwgaHR0cFJlcXVlc3TigJlzIHByZXZlbnRcbiAgLy8gICAgbm8tY2FjaGUgY2FjaGUtY29udHJvbCBoZWFkZXIgbW9kaWZpY2F0aW9uIGZsYWcgaXMgdW5zZXQsIGFuZFxuICAvLyAgICBodHRwUmVxdWVzdOKAmXMgaGVhZGVyIGxpc3QgZG9lcyBub3QgY29udGFpbiBgQ2FjaGUtQ29udHJvbGAsIHRoZW4gYXBwZW5kXG4gIC8vICAgIGBDYWNoZS1Db250cm9sYC9gbWF4LWFnZT0wYCB0byBodHRwUmVxdWVzdOKAmXMgaGVhZGVyIGxpc3QuXG4gIGlmIChcbiAgICBodHRwUmVxdWVzdC5jYWNoZSA9PT0gJ25vLWNhY2hlJyAmJlxuICAgICFodHRwUmVxdWVzdC5wcmV2ZW50Tm9DYWNoZUNhY2hlQ29udHJvbEhlYWRlck1vZGlmaWNhdGlvbiAmJlxuICAgICFodHRwUmVxdWVzdC5oZWFkZXJzTGlzdC5jb250YWlucygnY2FjaGUtY29udHJvbCcpXG4gICkge1xuICAgIGh0dHBSZXF1ZXN0LmhlYWRlcnNMaXN0LmFwcGVuZCgnY2FjaGUtY29udHJvbCcsICdtYXgtYWdlPTAnKVxuICB9XG5cbiAgLy8gICAgMTcuIElmIGh0dHBSZXF1ZXN04oCZcyBjYWNoZSBtb2RlIGlzIFwibm8tc3RvcmVcIiBvciBcInJlbG9hZFwiLCB0aGVuOlxuICBpZiAoaHR0cFJlcXVlc3QuY2FjaGUgPT09ICduby1zdG9yZScgfHwgaHR0cFJlcXVlc3QuY2FjaGUgPT09ICdyZWxvYWQnKSB7XG4gICAgLy8gMS4gSWYgaHR0cFJlcXVlc3TigJlzIGhlYWRlciBsaXN0IGRvZXMgbm90IGNvbnRhaW4gYFByYWdtYWAsIHRoZW4gYXBwZW5kXG4gICAgLy8gYFByYWdtYWAvYG5vLWNhY2hlYCB0byBodHRwUmVxdWVzdOKAmXMgaGVhZGVyIGxpc3QuXG4gICAgaWYgKCFodHRwUmVxdWVzdC5oZWFkZXJzTGlzdC5jb250YWlucygncHJhZ21hJykpIHtcbiAgICAgIGh0dHBSZXF1ZXN0LmhlYWRlcnNMaXN0LmFwcGVuZCgncHJhZ21hJywgJ25vLWNhY2hlJylcbiAgICB9XG5cbiAgICAvLyAyLiBJZiBodHRwUmVxdWVzdOKAmXMgaGVhZGVyIGxpc3QgZG9lcyBub3QgY29udGFpbiBgQ2FjaGUtQ29udHJvbGAsXG4gICAgLy8gdGhlbiBhcHBlbmQgYENhY2hlLUNvbnRyb2xgL2Buby1jYWNoZWAgdG8gaHR0cFJlcXVlc3TigJlzIGhlYWRlciBsaXN0LlxuICAgIGlmICghaHR0cFJlcXVlc3QuaGVhZGVyc0xpc3QuY29udGFpbnMoJ2NhY2hlLWNvbnRyb2wnKSkge1xuICAgICAgaHR0cFJlcXVlc3QuaGVhZGVyc0xpc3QuYXBwZW5kKCdjYWNoZS1jb250cm9sJywgJ25vLWNhY2hlJylcbiAgICB9XG4gIH1cblxuICAvLyAgICAxOC4gSWYgaHR0cFJlcXVlc3TigJlzIGhlYWRlciBsaXN0IGNvbnRhaW5zIGBSYW5nZWAsIHRoZW4gYXBwZW5kXG4gIC8vICAgIGBBY2NlcHQtRW5jb2RpbmdgL2BpZGVudGl0eWAgdG8gaHR0cFJlcXVlc3TigJlzIGhlYWRlciBsaXN0LlxuICBpZiAoaHR0cFJlcXVlc3QuaGVhZGVyc0xpc3QuY29udGFpbnMoJ3JhbmdlJykpIHtcbiAgICBodHRwUmVxdWVzdC5oZWFkZXJzTGlzdC5hcHBlbmQoJ2FjY2VwdC1lbmNvZGluZycsICdpZGVudGl0eScpXG4gIH1cblxuICAvLyAgICAxOS4gTW9kaWZ5IGh0dHBSZXF1ZXN04oCZcyBoZWFkZXIgbGlzdCBwZXIgSFRUUC4gRG8gbm90IGFwcGVuZCBhIGdpdmVuXG4gIC8vICAgIGhlYWRlciBpZiBodHRwUmVxdWVzdOKAmXMgaGVhZGVyIGxpc3QgY29udGFpbnMgdGhhdCBoZWFkZXLigJlzIG5hbWUuXG4gIC8vICAgIFRPRE86IGh0dHBzOi8vZ2l0aHViLmNvbS93aGF0d2cvZmV0Y2gvaXNzdWVzLzEyODUjaXNzdWVjb21tZW50LTg5NjU2MDEyOVxuICBpZiAoIWh0dHBSZXF1ZXN0LmhlYWRlcnNMaXN0LmNvbnRhaW5zKCdhY2NlcHQtZW5jb2RpbmcnKSkge1xuICAgIGlmICh1cmxIYXNIdHRwc1NjaGVtZShyZXF1ZXN0Q3VycmVudFVSTChodHRwUmVxdWVzdCkpKSB7XG4gICAgICBodHRwUmVxdWVzdC5oZWFkZXJzTGlzdC5hcHBlbmQoJ2FjY2VwdC1lbmNvZGluZycsICdiciwgZ3ppcCwgZGVmbGF0ZScpXG4gICAgfSBlbHNlIHtcbiAgICAgIGh0dHBSZXF1ZXN0LmhlYWRlcnNMaXN0LmFwcGVuZCgnYWNjZXB0LWVuY29kaW5nJywgJ2d6aXAsIGRlZmxhdGUnKVxuICAgIH1cbiAgfVxuXG4gIGh0dHBSZXF1ZXN0LmhlYWRlcnNMaXN0LmRlbGV0ZSgnaG9zdCcpXG5cbiAgLy8gICAgMjAuIElmIGluY2x1ZGVDcmVkZW50aWFscyBpcyB0cnVlLCB0aGVuOlxuICBpZiAoaW5jbHVkZUNyZWRlbnRpYWxzKSB7XG4gICAgLy8gMS4gSWYgdGhlIHVzZXIgYWdlbnQgaXMgbm90IGNvbmZpZ3VyZWQgdG8gYmxvY2sgY29va2llcyBmb3IgaHR0cFJlcXVlc3RcbiAgICAvLyAoc2VlIHNlY3Rpb24gNyBvZiBbQ09PS0lFU10pLCB0aGVuOlxuICAgIC8vIFRPRE86IGNyZWRlbnRpYWxzXG4gICAgLy8gMi4gSWYgaHR0cFJlcXVlc3TigJlzIGhlYWRlciBsaXN0IGRvZXMgbm90IGNvbnRhaW4gYEF1dGhvcml6YXRpb25gLCB0aGVuOlxuICAgIC8vIFRPRE86IGNyZWRlbnRpYWxzXG4gIH1cblxuICAvLyAgICAyMS4gSWYgdGhlcmXigJlzIGEgcHJveHktYXV0aGVudGljYXRpb24gZW50cnksIHVzZSBpdCBhcyBhcHByb3ByaWF0ZS5cbiAgLy8gICAgVE9ETzogcHJveHktYXV0aGVudGljYXRpb25cblxuICAvLyAgICAyMi4gU2V0IGh0dHBDYWNoZSB0byB0aGUgcmVzdWx0IG9mIGRldGVybWluaW5nIHRoZSBIVFRQIGNhY2hlXG4gIC8vICAgIHBhcnRpdGlvbiwgZ2l2ZW4gaHR0cFJlcXVlc3QuXG4gIC8vICAgIFRPRE86IGNhY2hlXG5cbiAgLy8gICAgMjMuIElmIGh0dHBDYWNoZSBpcyBudWxsLCB0aGVuIHNldCBodHRwUmVxdWVzdOKAmXMgY2FjaGUgbW9kZSB0b1xuICAvLyAgICBcIm5vLXN0b3JlXCIuXG4gIGlmIChodHRwQ2FjaGUgPT0gbnVsbCkge1xuICAgIGh0dHBSZXF1ZXN0LmNhY2hlID0gJ25vLXN0b3JlJ1xuICB9XG5cbiAgLy8gICAgMjQuIElmIGh0dHBSZXF1ZXN04oCZcyBjYWNoZSBtb2RlIGlzIG5laXRoZXIgXCJuby1zdG9yZVwiIG5vciBcInJlbG9hZFwiLFxuICAvLyAgICB0aGVuOlxuICBpZiAoaHR0cFJlcXVlc3QubW9kZSAhPT0gJ25vLXN0b3JlJyAmJiBodHRwUmVxdWVzdC5tb2RlICE9PSAncmVsb2FkJykge1xuICAgIC8vIFRPRE86IGNhY2hlXG4gIH1cblxuICAvLyA5LiBJZiBhYm9ydGVkLCB0aGVuIHJldHVybiB0aGUgYXBwcm9wcmlhdGUgbmV0d29yayBlcnJvciBmb3IgZmV0Y2hQYXJhbXMuXG4gIC8vIFRPRE9cblxuICAvLyAxMC4gSWYgcmVzcG9uc2UgaXMgbnVsbCwgdGhlbjpcbiAgaWYgKHJlc3BvbnNlID09IG51bGwpIHtcbiAgICAvLyAxLiBJZiBodHRwUmVxdWVzdOKAmXMgY2FjaGUgbW9kZSBpcyBcIm9ubHktaWYtY2FjaGVkXCIsIHRoZW4gcmV0dXJuIGFcbiAgICAvLyBuZXR3b3JrIGVycm9yLlxuICAgIGlmIChodHRwUmVxdWVzdC5tb2RlID09PSAnb25seS1pZi1jYWNoZWQnKSB7XG4gICAgICByZXR1cm4gbWFrZU5ldHdvcmtFcnJvcignb25seSBpZiBjYWNoZWQnKVxuICAgIH1cblxuICAgIC8vIDIuIExldCBmb3J3YXJkUmVzcG9uc2UgYmUgdGhlIHJlc3VsdCBvZiBydW5uaW5nIEhUVFAtbmV0d29yayBmZXRjaFxuICAgIC8vIGdpdmVuIGh0dHBGZXRjaFBhcmFtcywgaW5jbHVkZUNyZWRlbnRpYWxzLCBhbmQgaXNOZXdDb25uZWN0aW9uRmV0Y2guXG4gICAgY29uc3QgZm9yd2FyZFJlc3BvbnNlID0gYXdhaXQgaHR0cE5ldHdvcmtGZXRjaChcbiAgICAgIGh0dHBGZXRjaFBhcmFtcyxcbiAgICAgIGluY2x1ZGVDcmVkZW50aWFscyxcbiAgICAgIGlzTmV3Q29ubmVjdGlvbkZldGNoXG4gICAgKVxuXG4gICAgLy8gMy4gSWYgaHR0cFJlcXVlc3TigJlzIG1ldGhvZCBpcyB1bnNhZmUgYW5kIGZvcndhcmRSZXNwb25zZeKAmXMgc3RhdHVzIGlzXG4gICAgLy8gaW4gdGhlIHJhbmdlIDIwMCB0byAzOTksIGluY2x1c2l2ZSwgaW52YWxpZGF0ZSBhcHByb3ByaWF0ZSBzdG9yZWRcbiAgICAvLyByZXNwb25zZXMgaW4gaHR0cENhY2hlLCBhcyBwZXIgdGhlIFwiSW52YWxpZGF0aW9uXCIgY2hhcHRlciBvZiBIVFRQXG4gICAgLy8gQ2FjaGluZywgYW5kIHNldCBzdG9yZWRSZXNwb25zZSB0byBudWxsLiBbSFRUUC1DQUNISU5HXVxuICAgIGlmIChcbiAgICAgICFzYWZlTWV0aG9kc1NldC5oYXMoaHR0cFJlcXVlc3QubWV0aG9kKSAmJlxuICAgICAgZm9yd2FyZFJlc3BvbnNlLnN0YXR1cyA+PSAyMDAgJiZcbiAgICAgIGZvcndhcmRSZXNwb25zZS5zdGF0dXMgPD0gMzk5XG4gICAgKSB7XG4gICAgICAvLyBUT0RPOiBjYWNoZVxuICAgIH1cblxuICAgIC8vIDQuIElmIHRoZSByZXZhbGlkYXRpbmdGbGFnIGlzIHNldCBhbmQgZm9yd2FyZFJlc3BvbnNl4oCZcyBzdGF0dXMgaXMgMzA0LFxuICAgIC8vIHRoZW46XG4gICAgaWYgKHJldmFsaWRhdGluZ0ZsYWcgJiYgZm9yd2FyZFJlc3BvbnNlLnN0YXR1cyA9PT0gMzA0KSB7XG4gICAgICAvLyBUT0RPOiBjYWNoZVxuICAgIH1cblxuICAgIC8vIDUuIElmIHJlc3BvbnNlIGlzIG51bGwsIHRoZW46XG4gICAgaWYgKHJlc3BvbnNlID09IG51bGwpIHtcbiAgICAgIC8vIDEuIFNldCByZXNwb25zZSB0byBmb3J3YXJkUmVzcG9uc2UuXG4gICAgICByZXNwb25zZSA9IGZvcndhcmRSZXNwb25zZVxuXG4gICAgICAvLyAyLiBTdG9yZSBodHRwUmVxdWVzdCBhbmQgZm9yd2FyZFJlc3BvbnNlIGluIGh0dHBDYWNoZSwgYXMgcGVyIHRoZVxuICAgICAgLy8gXCJTdG9yaW5nIFJlc3BvbnNlcyBpbiBDYWNoZXNcIiBjaGFwdGVyIG9mIEhUVFAgQ2FjaGluZy4gW0hUVFAtQ0FDSElOR11cbiAgICAgIC8vIFRPRE86IGNhY2hlXG4gICAgfVxuICB9XG5cbiAgLy8gMTEuIFNldCByZXNwb25zZeKAmXMgVVJMIGxpc3QgdG8gYSBjbG9uZSBvZiBodHRwUmVxdWVzdOKAmXMgVVJMIGxpc3QuXG4gIHJlc3BvbnNlLnVybExpc3QgPSBbLi4uaHR0cFJlcXVlc3QudXJsTGlzdF1cblxuICAvLyAxMi4gSWYgaHR0cFJlcXVlc3TigJlzIGhlYWRlciBsaXN0IGNvbnRhaW5zIGBSYW5nZWAsIHRoZW4gc2V0IHJlc3BvbnNl4oCZc1xuICAvLyByYW5nZS1yZXF1ZXN0ZWQgZmxhZy5cbiAgaWYgKGh0dHBSZXF1ZXN0LmhlYWRlcnNMaXN0LmNvbnRhaW5zKCdyYW5nZScpKSB7XG4gICAgcmVzcG9uc2UucmFuZ2VSZXF1ZXN0ZWQgPSB0cnVlXG4gIH1cblxuICAvLyAxMy4gU2V0IHJlc3BvbnNl4oCZcyByZXF1ZXN0LWluY2x1ZGVzLWNyZWRlbnRpYWxzIHRvIGluY2x1ZGVDcmVkZW50aWFscy5cbiAgcmVzcG9uc2UucmVxdWVzdEluY2x1ZGVzQ3JlZGVudGlhbHMgPSBpbmNsdWRlQ3JlZGVudGlhbHNcblxuICAvLyAxNC4gSWYgcmVzcG9uc2XigJlzIHN0YXR1cyBpcyA0MDEsIGh0dHBSZXF1ZXN04oCZcyByZXNwb25zZSB0YWludGluZyBpcyBub3RcbiAgLy8gXCJjb3JzXCIsIGluY2x1ZGVDcmVkZW50aWFscyBpcyB0cnVlLCBhbmQgcmVxdWVzdOKAmXMgd2luZG93IGlzIGFuIGVudmlyb25tZW50XG4gIC8vIHNldHRpbmdzIG9iamVjdCwgdGhlbjpcbiAgLy8gVE9ET1xuXG4gIC8vIDE1LiBJZiByZXNwb25zZeKAmXMgc3RhdHVzIGlzIDQwNywgdGhlbjpcbiAgaWYgKHJlc3BvbnNlLnN0YXR1cyA9PT0gNDA3KSB7XG4gICAgLy8gMS4gSWYgcmVxdWVzdOKAmXMgd2luZG93IGlzIFwibm8td2luZG93XCIsIHRoZW4gcmV0dXJuIGEgbmV0d29yayBlcnJvci5cbiAgICBpZiAocmVxdWVzdC53aW5kb3cgPT09ICduby13aW5kb3cnKSB7XG4gICAgICByZXR1cm4gbWFrZU5ldHdvcmtFcnJvcigpXG4gICAgfVxuXG4gICAgLy8gMi4gPz8/XG5cbiAgICAvLyAzLiBJZiBmZXRjaFBhcmFtcyBpcyBjYW5jZWxlZCwgdGhlbiByZXR1cm4gdGhlIGFwcHJvcHJpYXRlIG5ldHdvcmsgZXJyb3IgZm9yIGZldGNoUGFyYW1zLlxuICAgIGlmIChpc0NhbmNlbGxlZChmZXRjaFBhcmFtcykpIHtcbiAgICAgIHJldHVybiBtYWtlQXBwcm9wcmlhdGVOZXR3b3JrRXJyb3IoZmV0Y2hQYXJhbXMpXG4gICAgfVxuXG4gICAgLy8gNC4gUHJvbXB0IHRoZSBlbmQgdXNlciBhcyBhcHByb3ByaWF0ZSBpbiByZXF1ZXN04oCZcyB3aW5kb3cgYW5kIHN0b3JlXG4gICAgLy8gdGhlIHJlc3VsdCBhcyBhIHByb3h5LWF1dGhlbnRpY2F0aW9uIGVudHJ5LiBbSFRUUC1BVVRIXVxuICAgIC8vIFRPRE86IEludm9rZSBzb21lIGtpbmQgb2YgY2FsbGJhY2s/XG5cbiAgICAvLyA1LiBTZXQgcmVzcG9uc2UgdG8gdGhlIHJlc3VsdCBvZiBydW5uaW5nIEhUVFAtbmV0d29yay1vci1jYWNoZSBmZXRjaCBnaXZlblxuICAgIC8vIGZldGNoUGFyYW1zLlxuICAgIC8vIFRPRE9cbiAgICByZXR1cm4gbWFrZU5ldHdvcmtFcnJvcigncHJveHkgYXV0aGVudGljYXRpb24gcmVxdWlyZWQnKVxuICB9XG5cbiAgLy8gMTYuIElmIGFsbCBvZiB0aGUgZm9sbG93aW5nIGFyZSB0cnVlXG4gIGlmIChcbiAgICAvLyByZXNwb25zZeKAmXMgc3RhdHVzIGlzIDQyMVxuICAgIHJlc3BvbnNlLnN0YXR1cyA9PT0gNDIxICYmXG4gICAgLy8gaXNOZXdDb25uZWN0aW9uRmV0Y2ggaXMgZmFsc2VcbiAgICAhaXNOZXdDb25uZWN0aW9uRmV0Y2ggJiZcbiAgICAvLyByZXF1ZXN04oCZcyBib2R5IGlzIG51bGwsIG9yIHJlcXVlc3TigJlzIGJvZHkgaXMgbm9uLW51bGwgYW5kIHJlcXVlc3TigJlzIGJvZHnigJlzIHNvdXJjZSBpcyBub24tbnVsbFxuICAgIChyZXF1ZXN0LmJvZHkgPT0gbnVsbCB8fCByZXF1ZXN0LmJvZHkuc291cmNlICE9IG51bGwpXG4gICkge1xuICAgIC8vIHRoZW46XG5cbiAgICAvLyAxLiBJZiBmZXRjaFBhcmFtcyBpcyBjYW5jZWxlZCwgdGhlbiByZXR1cm4gdGhlIGFwcHJvcHJpYXRlIG5ldHdvcmsgZXJyb3IgZm9yIGZldGNoUGFyYW1zLlxuICAgIGlmIChpc0NhbmNlbGxlZChmZXRjaFBhcmFtcykpIHtcbiAgICAgIHJldHVybiBtYWtlQXBwcm9wcmlhdGVOZXR3b3JrRXJyb3IoZmV0Y2hQYXJhbXMpXG4gICAgfVxuXG4gICAgLy8gMi4gU2V0IHJlc3BvbnNlIHRvIHRoZSByZXN1bHQgb2YgcnVubmluZyBIVFRQLW5ldHdvcmstb3ItY2FjaGVcbiAgICAvLyBmZXRjaCBnaXZlbiBmZXRjaFBhcmFtcywgaXNBdXRoZW50aWNhdGlvbkZldGNoLCBhbmQgdHJ1ZS5cblxuICAgIC8vIFRPRE8gKHNwZWMpOiBUaGUgc3BlYyBkb2Vzbid0IHNwZWNpZnkgdGhpcyBidXQgd2UgbmVlZCB0byBjYW5jZWxcbiAgICAvLyB0aGUgYWN0aXZlIHJlc3BvbnNlIGJlZm9yZSB3ZSBjYW4gc3RhcnQgYSBuZXcgb25lLlxuICAgIC8vIGh0dHBzOi8vZ2l0aHViLmNvbS93aGF0d2cvZmV0Y2gvaXNzdWVzLzEyOTNcbiAgICBmZXRjaFBhcmFtcy5jb250cm9sbGVyLmNvbm5lY3Rpb24uZGVzdHJveSgpXG5cbiAgICByZXNwb25zZSA9IGF3YWl0IGh0dHBOZXR3b3JrT3JDYWNoZUZldGNoKFxuICAgICAgZmV0Y2hQYXJhbXMsXG4gICAgICBpc0F1dGhlbnRpY2F0aW9uRmV0Y2gsXG4gICAgICB0cnVlXG4gICAgKVxuICB9XG5cbiAgLy8gMTcuIElmIGlzQXV0aGVudGljYXRpb25GZXRjaCBpcyB0cnVlLCB0aGVuIGNyZWF0ZSBhbiBhdXRoZW50aWNhdGlvbiBlbnRyeVxuICBpZiAoaXNBdXRoZW50aWNhdGlvbkZldGNoKSB7XG4gICAgLy8gVE9ET1xuICB9XG5cbiAgLy8gMTguIFJldHVybiByZXNwb25zZS5cbiAgcmV0dXJuIHJlc3BvbnNlXG59XG5cbi8vIGh0dHBzOi8vZmV0Y2guc3BlYy53aGF0d2cub3JnLyNodHRwLW5ldHdvcmstZmV0Y2hcbmFzeW5jIGZ1bmN0aW9uIGh0dHBOZXR3b3JrRmV0Y2ggKFxuICBmZXRjaFBhcmFtcyxcbiAgaW5jbHVkZUNyZWRlbnRpYWxzID0gZmFsc2UsXG4gIGZvcmNlTmV3Q29ubmVjdGlvbiA9IGZhbHNlXG4pIHtcbiAgYXNzZXJ0KCFmZXRjaFBhcmFtcy5jb250cm9sbGVyLmNvbm5lY3Rpb24gfHwgZmV0Y2hQYXJhbXMuY29udHJvbGxlci5jb25uZWN0aW9uLmRlc3Ryb3llZClcblxuICBmZXRjaFBhcmFtcy5jb250cm9sbGVyLmNvbm5lY3Rpb24gPSB7XG4gICAgYWJvcnQ6IG51bGwsXG4gICAgZGVzdHJveWVkOiBmYWxzZSxcbiAgICBkZXN0cm95IChlcnIpIHtcbiAgICAgIGlmICghdGhpcy5kZXN0cm95ZWQpIHtcbiAgICAgICAgdGhpcy5kZXN0cm95ZWQgPSB0cnVlXG4gICAgICAgIHRoaXMuYWJvcnQ/LihlcnIgPz8gbmV3IERPTUV4Y2VwdGlvbignVGhlIG9wZXJhdGlvbiB3YXMgYWJvcnRlZC4nLCAnQWJvcnRFcnJvcicpKVxuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIC8vIDEuIExldCByZXF1ZXN0IGJlIGZldGNoUGFyYW1z4oCZcyByZXF1ZXN0LlxuICBjb25zdCByZXF1ZXN0ID0gZmV0Y2hQYXJhbXMucmVxdWVzdFxuXG4gIC8vIDIuIExldCByZXNwb25zZSBiZSBudWxsLlxuICBsZXQgcmVzcG9uc2UgPSBudWxsXG5cbiAgLy8gMy4gTGV0IHRpbWluZ0luZm8gYmUgZmV0Y2hQYXJhbXPigJlzIHRpbWluZyBpbmZvLlxuICBjb25zdCB0aW1pbmdJbmZvID0gZmV0Y2hQYXJhbXMudGltaW5nSW5mb1xuXG4gIC8vIDQuIExldCBodHRwQ2FjaGUgYmUgdGhlIHJlc3VsdCBvZiBkZXRlcm1pbmluZyB0aGUgSFRUUCBjYWNoZSBwYXJ0aXRpb24sXG4gIC8vIGdpdmVuIHJlcXVlc3QuXG4gIC8vIFRPRE86IGNhY2hlXG4gIGNvbnN0IGh0dHBDYWNoZSA9IG51bGxcblxuICAvLyA1LiBJZiBodHRwQ2FjaGUgaXMgbnVsbCwgdGhlbiBzZXQgcmVxdWVzdOKAmXMgY2FjaGUgbW9kZSB0byBcIm5vLXN0b3JlXCIuXG4gIGlmIChodHRwQ2FjaGUgPT0gbnVsbCkge1xuICAgIHJlcXVlc3QuY2FjaGUgPSAnbm8tc3RvcmUnXG4gIH1cblxuICAvLyA2LiBMZXQgbmV0d29ya1BhcnRpdGlvbktleSBiZSB0aGUgcmVzdWx0IG9mIGRldGVybWluaW5nIHRoZSBuZXR3b3JrXG4gIC8vIHBhcnRpdGlvbiBrZXkgZ2l2ZW4gcmVxdWVzdC5cbiAgLy8gVE9ET1xuXG4gIC8vIDcuIExldCBuZXdDb25uZWN0aW9uIGJlIFwieWVzXCIgaWYgZm9yY2VOZXdDb25uZWN0aW9uIGlzIHRydWU7IG90aGVyd2lzZVxuICAvLyBcIm5vXCIuXG4gIGNvbnN0IG5ld0Nvbm5lY3Rpb24gPSBmb3JjZU5ld0Nvbm5lY3Rpb24gPyAneWVzJyA6ICdubycgLy8gZXNsaW50LWRpc2FibGUtbGluZSBuby11bnVzZWQtdmFyc1xuXG4gIC8vIDguIFN3aXRjaCBvbiByZXF1ZXN04oCZcyBtb2RlOlxuICBpZiAocmVxdWVzdC5tb2RlID09PSAnd2Vic29ja2V0Jykge1xuICAgIC8vIExldCBjb25uZWN0aW9uIGJlIHRoZSByZXN1bHQgb2Ygb2J0YWluaW5nIGEgV2ViU29ja2V0IGNvbm5lY3Rpb24sXG4gICAgLy8gZ2l2ZW4gcmVxdWVzdOKAmXMgY3VycmVudCBVUkwuXG4gICAgLy8gVE9ET1xuICB9IGVsc2Uge1xuICAgIC8vIExldCBjb25uZWN0aW9uIGJlIHRoZSByZXN1bHQgb2Ygb2J0YWluaW5nIGEgY29ubmVjdGlvbiwgZ2l2ZW5cbiAgICAvLyBuZXR3b3JrUGFydGl0aW9uS2V5LCByZXF1ZXN04oCZcyBjdXJyZW50IFVSTOKAmXMgb3JpZ2luLFxuICAgIC8vIGluY2x1ZGVDcmVkZW50aWFscywgYW5kIGZvcmNlTmV3Q29ubmVjdGlvbi5cbiAgICAvLyBUT0RPXG4gIH1cblxuICAvLyA5LiBSdW4gdGhlc2Ugc3RlcHMsIGJ1dCBhYm9ydCB3aGVuIHRoZSBvbmdvaW5nIGZldGNoIGlzIHRlcm1pbmF0ZWQ6XG5cbiAgLy8gICAgMS4gSWYgY29ubmVjdGlvbiBpcyBmYWlsdXJlLCB0aGVuIHJldHVybiBhIG5ldHdvcmsgZXJyb3IuXG5cbiAgLy8gICAgMi4gU2V0IHRpbWluZ0luZm/igJlzIGZpbmFsIGNvbm5lY3Rpb24gdGltaW5nIGluZm8gdG8gdGhlIHJlc3VsdCBvZlxuICAvLyAgICBjYWxsaW5nIGNsYW1wIGFuZCBjb2Fyc2VuIGNvbm5lY3Rpb24gdGltaW5nIGluZm8gd2l0aCBjb25uZWN0aW9u4oCZc1xuICAvLyAgICB0aW1pbmcgaW5mbywgdGltaW5nSW5mb+KAmXMgcG9zdC1yZWRpcmVjdCBzdGFydCB0aW1lLCBhbmQgZmV0Y2hQYXJhbXPigJlzXG4gIC8vICAgIGNyb3NzLW9yaWdpbiBpc29sYXRlZCBjYXBhYmlsaXR5LlxuXG4gIC8vICAgIDMuIElmIGNvbm5lY3Rpb24gaXMgbm90IGFuIEhUVFAvMiBjb25uZWN0aW9uLCByZXF1ZXN04oCZcyBib2R5IGlzIG5vbi1udWxsLFxuICAvLyAgICBhbmQgcmVxdWVzdOKAmXMgYm9keeKAmXMgc291cmNlIGlzIG51bGwsIHRoZW4gYXBwZW5kIChgVHJhbnNmZXItRW5jb2RpbmdgLFxuICAvLyAgICBgY2h1bmtlZGApIHRvIHJlcXVlc3TigJlzIGhlYWRlciBsaXN0LlxuXG4gIC8vICAgIDQuIFNldCB0aW1pbmdJbmZv4oCZcyBmaW5hbCBuZXR3b3JrLXJlcXVlc3Qgc3RhcnQgdGltZSB0byB0aGUgY29hcnNlbmVkXG4gIC8vICAgIHNoYXJlZCBjdXJyZW50IHRpbWUgZ2l2ZW4gZmV0Y2hQYXJhbXPigJlzIGNyb3NzLW9yaWdpbiBpc29sYXRlZFxuICAvLyAgICBjYXBhYmlsaXR5LlxuXG4gIC8vICAgIDUuIFNldCByZXNwb25zZSB0byB0aGUgcmVzdWx0IG9mIG1ha2luZyBhbiBIVFRQIHJlcXVlc3Qgb3ZlciBjb25uZWN0aW9uXG4gIC8vICAgIHVzaW5nIHJlcXVlc3Qgd2l0aCB0aGUgZm9sbG93aW5nIGNhdmVhdHM6XG5cbiAgLy8gICAgICAgIC0gRm9sbG93IHRoZSByZWxldmFudCByZXF1aXJlbWVudHMgZnJvbSBIVFRQLiBbSFRUUF0gW0hUVFAtU0VNQU5USUNTXVxuICAvLyAgICAgICAgW0hUVFAtQ09ORF0gW0hUVFAtQ0FDSElOR10gW0hUVFAtQVVUSF1cblxuICAvLyAgICAgICAgLSBJZiByZXF1ZXN04oCZcyBib2R5IGlzIG5vbi1udWxsLCBhbmQgcmVxdWVzdOKAmXMgYm9keeKAmXMgc291cmNlIGlzIG51bGwsXG4gIC8vICAgICAgICB0aGVuIHRoZSB1c2VyIGFnZW50IG1heSBoYXZlIGEgYnVmZmVyIG9mIHVwIHRvIDY0IGtpYmlieXRlcyBhbmQgc3RvcmVcbiAgLy8gICAgICAgIGEgcGFydCBvZiByZXF1ZXN04oCZcyBib2R5IGluIHRoYXQgYnVmZmVyLiBJZiB0aGUgdXNlciBhZ2VudCByZWFkcyBmcm9tXG4gIC8vICAgICAgICByZXF1ZXN04oCZcyBib2R5IGJleW9uZCB0aGF0IGJ1ZmZlcuKAmXMgc2l6ZSBhbmQgdGhlIHVzZXIgYWdlbnQgbmVlZHMgdG9cbiAgLy8gICAgICAgIHJlc2VuZCByZXF1ZXN0LCB0aGVuIGluc3RlYWQgcmV0dXJuIGEgbmV0d29yayBlcnJvci5cblxuICAvLyAgICAgICAgLSBTZXQgdGltaW5nSW5mb+KAmXMgZmluYWwgbmV0d29yay1yZXNwb25zZSBzdGFydCB0aW1lIHRvIHRoZSBjb2Fyc2VuZWRcbiAgLy8gICAgICAgIHNoYXJlZCBjdXJyZW50IHRpbWUgZ2l2ZW4gZmV0Y2hQYXJhbXPigJlzIGNyb3NzLW9yaWdpbiBpc29sYXRlZCBjYXBhYmlsaXR5LFxuICAvLyAgICAgICAgaW1tZWRpYXRlbHkgYWZ0ZXIgdGhlIHVzZXIgYWdlbnTigJlzIEhUVFAgcGFyc2VyIHJlY2VpdmVzIHRoZSBmaXJzdCBieXRlXG4gIC8vICAgICAgICBvZiB0aGUgcmVzcG9uc2UgKGUuZy4sIGZyYW1lIGhlYWRlciBieXRlcyBmb3IgSFRUUC8yIG9yIHJlc3BvbnNlIHN0YXR1c1xuICAvLyAgICAgICAgbGluZSBmb3IgSFRUUC8xLngpLlxuXG4gIC8vICAgICAgICAtIFdhaXQgdW50aWwgYWxsIHRoZSBoZWFkZXJzIGFyZSB0cmFuc21pdHRlZC5cblxuICAvLyAgICAgICAgLSBBbnkgcmVzcG9uc2VzIHdob3NlIHN0YXR1cyBpcyBpbiB0aGUgcmFuZ2UgMTAwIHRvIDE5OSwgaW5jbHVzaXZlLFxuICAvLyAgICAgICAgYW5kIGlzIG5vdCAxMDEsIGFyZSB0byBiZSBpZ25vcmVkLCBleGNlcHQgZm9yIHRoZSBwdXJwb3NlcyBvZiBzZXR0aW5nXG4gIC8vICAgICAgICB0aW1pbmdJbmZv4oCZcyBmaW5hbCBuZXR3b3JrLXJlc3BvbnNlIHN0YXJ0IHRpbWUgYWJvdmUuXG5cbiAgLy8gICAgLSBJZiByZXF1ZXN04oCZcyBoZWFkZXIgbGlzdCBjb250YWlucyBgVHJhbnNmZXItRW5jb2RpbmdgL2BjaHVua2VkYCBhbmRcbiAgLy8gICAgcmVzcG9uc2UgaXMgdHJhbnNmZXJyZWQgdmlhIEhUVFAvMS4wIG9yIG9sZGVyLCB0aGVuIHJldHVybiBhIG5ldHdvcmtcbiAgLy8gICAgZXJyb3IuXG5cbiAgLy8gICAgLSBJZiB0aGUgSFRUUCByZXF1ZXN0IHJlc3VsdHMgaW4gYSBUTFMgY2xpZW50IGNlcnRpZmljYXRlIGRpYWxvZywgdGhlbjpcblxuICAvLyAgICAgICAgMS4gSWYgcmVxdWVzdOKAmXMgd2luZG93IGlzIGFuIGVudmlyb25tZW50IHNldHRpbmdzIG9iamVjdCwgbWFrZSB0aGVcbiAgLy8gICAgICAgIGRpYWxvZyBhdmFpbGFibGUgaW4gcmVxdWVzdOKAmXMgd2luZG93LlxuXG4gIC8vICAgICAgICAyLiBPdGhlcndpc2UsIHJldHVybiBhIG5ldHdvcmsgZXJyb3IuXG5cbiAgLy8gVG8gdHJhbnNtaXQgcmVxdWVzdOKAmXMgYm9keSBib2R5LCBydW4gdGhlc2Ugc3RlcHM6XG4gIGxldCByZXF1ZXN0Qm9keSA9IG51bGxcbiAgLy8gMS4gSWYgYm9keSBpcyBudWxsIGFuZCBmZXRjaFBhcmFtc+KAmXMgcHJvY2VzcyByZXF1ZXN0IGVuZC1vZi1ib2R5IGlzXG4gIC8vIG5vbi1udWxsLCB0aGVuIHF1ZXVlIGEgZmV0Y2ggdGFzayBnaXZlbiBmZXRjaFBhcmFtc+KAmXMgcHJvY2VzcyByZXF1ZXN0XG4gIC8vIGVuZC1vZi1ib2R5IGFuZCBmZXRjaFBhcmFtc+KAmXMgdGFzayBkZXN0aW5hdGlvbi5cbiAgaWYgKHJlcXVlc3QuYm9keSA9PSBudWxsICYmIGZldGNoUGFyYW1zLnByb2Nlc3NSZXF1ZXN0RW5kT2ZCb2R5KSB7XG4gICAgcXVldWVNaWNyb3Rhc2soKCkgPT4gZmV0Y2hQYXJhbXMucHJvY2Vzc1JlcXVlc3RFbmRPZkJvZHkoKSlcbiAgfSBlbHNlIGlmIChyZXF1ZXN0LmJvZHkgIT0gbnVsbCkge1xuICAgIC8vIDIuIE90aGVyd2lzZSwgaWYgYm9keSBpcyBub24tbnVsbDpcblxuICAgIC8vICAgIDEuIExldCBwcm9jZXNzQm9keUNodW5rIGdpdmVuIGJ5dGVzIGJlIHRoZXNlIHN0ZXBzOlxuICAgIGNvbnN0IHByb2Nlc3NCb2R5Q2h1bmsgPSBhc3luYyBmdW5jdGlvbiAqIChieXRlcykge1xuICAgICAgLy8gMS4gSWYgdGhlIG9uZ29pbmcgZmV0Y2ggaXMgdGVybWluYXRlZCwgdGhlbiBhYm9ydCB0aGVzZSBzdGVwcy5cbiAgICAgIGlmIChpc0NhbmNlbGxlZChmZXRjaFBhcmFtcykpIHtcbiAgICAgICAgcmV0dXJuXG4gICAgICB9XG5cbiAgICAgIC8vIDIuIFJ1biB0aGlzIHN0ZXAgaW4gcGFyYWxsZWw6IHRyYW5zbWl0IGJ5dGVzLlxuICAgICAgeWllbGQgYnl0ZXNcblxuICAgICAgLy8gMy4gSWYgZmV0Y2hQYXJhbXPigJlzIHByb2Nlc3MgcmVxdWVzdCBib2R5IGlzIG5vbi1udWxsLCB0aGVuIHJ1blxuICAgICAgLy8gZmV0Y2hQYXJhbXPigJlzIHByb2Nlc3MgcmVxdWVzdCBib2R5IGdpdmVuIGJ5dGVz4oCZcyBsZW5ndGguXG4gICAgICBmZXRjaFBhcmFtcy5wcm9jZXNzUmVxdWVzdEJvZHlDaHVua0xlbmd0aD8uKGJ5dGVzLmJ5dGVMZW5ndGgpXG4gICAgfVxuXG4gICAgLy8gMi4gTGV0IHByb2Nlc3NFbmRPZkJvZHkgYmUgdGhlc2Ugc3RlcHM6XG4gICAgY29uc3QgcHJvY2Vzc0VuZE9mQm9keSA9ICgpID0+IHtcbiAgICAgIC8vIDEuIElmIGZldGNoUGFyYW1zIGlzIGNhbmNlbGVkLCB0aGVuIGFib3J0IHRoZXNlIHN0ZXBzLlxuICAgICAgaWYgKGlzQ2FuY2VsbGVkKGZldGNoUGFyYW1zKSkge1xuICAgICAgICByZXR1cm5cbiAgICAgIH1cblxuICAgICAgLy8gMi4gSWYgZmV0Y2hQYXJhbXPigJlzIHByb2Nlc3MgcmVxdWVzdCBlbmQtb2YtYm9keSBpcyBub24tbnVsbCxcbiAgICAgIC8vIHRoZW4gcnVuIGZldGNoUGFyYW1z4oCZcyBwcm9jZXNzIHJlcXVlc3QgZW5kLW9mLWJvZHkuXG4gICAgICBpZiAoZmV0Y2hQYXJhbXMucHJvY2Vzc1JlcXVlc3RFbmRPZkJvZHkpIHtcbiAgICAgICAgZmV0Y2hQYXJhbXMucHJvY2Vzc1JlcXVlc3RFbmRPZkJvZHkoKVxuICAgICAgfVxuICAgIH1cblxuICAgIC8vIDMuIExldCBwcm9jZXNzQm9keUVycm9yIGdpdmVuIGUgYmUgdGhlc2Ugc3RlcHM6XG4gICAgY29uc3QgcHJvY2Vzc0JvZHlFcnJvciA9IChlKSA9PiB7XG4gICAgICAvLyAxLiBJZiBmZXRjaFBhcmFtcyBpcyBjYW5jZWxlZCwgdGhlbiBhYm9ydCB0aGVzZSBzdGVwcy5cbiAgICAgIGlmIChpc0NhbmNlbGxlZChmZXRjaFBhcmFtcykpIHtcbiAgICAgICAgcmV0dXJuXG4gICAgICB9XG5cbiAgICAgIC8vIDIuIElmIGUgaXMgYW4gXCJBYm9ydEVycm9yXCIgRE9NRXhjZXB0aW9uLCB0aGVuIGFib3J0IGZldGNoUGFyYW1z4oCZcyBjb250cm9sbGVyLlxuICAgICAgaWYgKGUubmFtZSA9PT0gJ0Fib3J0RXJyb3InKSB7XG4gICAgICAgIGZldGNoUGFyYW1zLmNvbnRyb2xsZXIuYWJvcnQoKVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgZmV0Y2hQYXJhbXMuY29udHJvbGxlci50ZXJtaW5hdGUoZSlcbiAgICAgIH1cbiAgICB9XG5cbiAgICAvLyA0LiBJbmNyZW1lbnRhbGx5IHJlYWQgcmVxdWVzdOKAmXMgYm9keSBnaXZlbiBwcm9jZXNzQm9keUNodW5rLCBwcm9jZXNzRW5kT2ZCb2R5LFxuICAgIC8vIHByb2Nlc3NCb2R5RXJyb3IsIGFuZCBmZXRjaFBhcmFtc+KAmXMgdGFzayBkZXN0aW5hdGlvbi5cbiAgICByZXF1ZXN0Qm9keSA9IChhc3luYyBmdW5jdGlvbiAqICgpIHtcbiAgICAgIHRyeSB7XG4gICAgICAgIGZvciBhd2FpdCAoY29uc3QgYnl0ZXMgb2YgcmVxdWVzdC5ib2R5LnN0cmVhbSkge1xuICAgICAgICAgIHlpZWxkICogcHJvY2Vzc0JvZHlDaHVuayhieXRlcylcbiAgICAgICAgfVxuICAgICAgICBwcm9jZXNzRW5kT2ZCb2R5KClcbiAgICAgIH0gY2F0Y2ggKGVycikge1xuICAgICAgICBwcm9jZXNzQm9keUVycm9yKGVycilcbiAgICAgIH1cbiAgICB9KSgpXG4gIH1cblxuICB0cnkge1xuICAgIC8vIHNvY2tldCBpcyBvbmx5IHByb3ZpZGVkIGZvciB3ZWJzb2NrZXRzXG4gICAgY29uc3QgeyBib2R5LCBzdGF0dXMsIHN0YXR1c1RleHQsIGhlYWRlcnNMaXN0LCBzb2NrZXQgfSA9IGF3YWl0IGRpc3BhdGNoKHsgYm9keTogcmVxdWVzdEJvZHkgfSlcblxuICAgIGlmIChzb2NrZXQpIHtcbiAgICAgIHJlc3BvbnNlID0gbWFrZVJlc3BvbnNlKHsgc3RhdHVzLCBzdGF0dXNUZXh0LCBoZWFkZXJzTGlzdCwgc29ja2V0IH0pXG4gICAgfSBlbHNlIHtcbiAgICAgIGNvbnN0IGl0ZXJhdG9yID0gYm9keVtTeW1ib2wuYXN5bmNJdGVyYXRvcl0oKVxuICAgICAgZmV0Y2hQYXJhbXMuY29udHJvbGxlci5uZXh0ID0gKCkgPT4gaXRlcmF0b3IubmV4dCgpXG5cbiAgICAgIHJlc3BvbnNlID0gbWFrZVJlc3BvbnNlKHsgc3RhdHVzLCBzdGF0dXNUZXh0LCBoZWFkZXJzTGlzdCB9KVxuICAgIH1cbiAgfSBjYXRjaCAoZXJyKSB7XG4gICAgLy8gMTAuIElmIGFib3J0ZWQsIHRoZW46XG4gICAgaWYgKGVyci5uYW1lID09PSAnQWJvcnRFcnJvcicpIHtcbiAgICAgIC8vIDEuIElmIGNvbm5lY3Rpb24gdXNlcyBIVFRQLzIsIHRoZW4gdHJhbnNtaXQgYW4gUlNUX1NUUkVBTSBmcmFtZS5cbiAgICAgIGZldGNoUGFyYW1zLmNvbnRyb2xsZXIuY29ubmVjdGlvbi5kZXN0cm95KClcblxuICAgICAgLy8gMi4gUmV0dXJuIHRoZSBhcHByb3ByaWF0ZSBuZXR3b3JrIGVycm9yIGZvciBmZXRjaFBhcmFtcy5cbiAgICAgIHJldHVybiBtYWtlQXBwcm9wcmlhdGVOZXR3b3JrRXJyb3IoZmV0Y2hQYXJhbXMsIGVycilcbiAgICB9XG5cbiAgICByZXR1cm4gbWFrZU5ldHdvcmtFcnJvcihlcnIpXG4gIH1cblxuICAvLyAxMS4gTGV0IHB1bGxBbGdvcml0aG0gYmUgYW4gYWN0aW9uIHRoYXQgcmVzdW1lcyB0aGUgb25nb2luZyBmZXRjaFxuICAvLyBpZiBpdCBpcyBzdXNwZW5kZWQuXG4gIGNvbnN0IHB1bGxBbGdvcml0aG0gPSAoKSA9PiB7XG4gICAgZmV0Y2hQYXJhbXMuY29udHJvbGxlci5yZXN1bWUoKVxuICB9XG5cbiAgLy8gMTIuIExldCBjYW5jZWxBbGdvcml0aG0gYmUgYW4gYWxnb3JpdGhtIHRoYXQgYWJvcnRzIGZldGNoUGFyYW1z4oCZc1xuICAvLyBjb250cm9sbGVyIHdpdGggcmVhc29uLCBnaXZlbiByZWFzb24uXG4gIGNvbnN0IGNhbmNlbEFsZ29yaXRobSA9IChyZWFzb24pID0+IHtcbiAgICBmZXRjaFBhcmFtcy5jb250cm9sbGVyLmFib3J0KHJlYXNvbilcbiAgfVxuXG4gIC8vIDEzLiBMZXQgaGlnaFdhdGVyTWFyayBiZSBhIG5vbi1uZWdhdGl2ZSwgbm9uLU5hTiBudW1iZXIsIGNob3NlbiBieVxuICAvLyB0aGUgdXNlciBhZ2VudC5cbiAgLy8gVE9ET1xuXG4gIC8vIDE0LiBMZXQgc2l6ZUFsZ29yaXRobSBiZSBhbiBhbGdvcml0aG0gdGhhdCBhY2NlcHRzIGEgY2h1bmsgb2JqZWN0XG4gIC8vIGFuZCByZXR1cm5zIGEgbm9uLW5lZ2F0aXZlLCBub24tTmFOLCBub24taW5maW5pdGUgbnVtYmVyLCBjaG9zZW4gYnkgdGhlIHVzZXIgYWdlbnQuXG4gIC8vIFRPRE9cblxuICAvLyAxNS4gTGV0IHN0cmVhbSBiZSBhIG5ldyBSZWFkYWJsZVN0cmVhbS5cbiAgLy8gMTYuIFNldCB1cCBzdHJlYW0gd2l0aCBwdWxsQWxnb3JpdGhtIHNldCB0byBwdWxsQWxnb3JpdGhtLFxuICAvLyBjYW5jZWxBbGdvcml0aG0gc2V0IHRvIGNhbmNlbEFsZ29yaXRobSwgaGlnaFdhdGVyTWFyayBzZXQgdG9cbiAgLy8gaGlnaFdhdGVyTWFyaywgYW5kIHNpemVBbGdvcml0aG0gc2V0IHRvIHNpemVBbGdvcml0aG0uXG4gIGlmICghUmVhZGFibGVTdHJlYW0pIHtcbiAgICBSZWFkYWJsZVN0cmVhbSA9IHJlcXVpcmUoJ3N0cmVhbS93ZWInKS5SZWFkYWJsZVN0cmVhbVxuICB9XG5cbiAgY29uc3Qgc3RyZWFtID0gbmV3IFJlYWRhYmxlU3RyZWFtKFxuICAgIHtcbiAgICAgIGFzeW5jIHN0YXJ0IChjb250cm9sbGVyKSB7XG4gICAgICAgIGZldGNoUGFyYW1zLmNvbnRyb2xsZXIuY29udHJvbGxlciA9IGNvbnRyb2xsZXJcbiAgICAgIH0sXG4gICAgICBhc3luYyBwdWxsIChjb250cm9sbGVyKSB7XG4gICAgICAgIGF3YWl0IHB1bGxBbGdvcml0aG0oY29udHJvbGxlcilcbiAgICAgIH0sXG4gICAgICBhc3luYyBjYW5jZWwgKHJlYXNvbikge1xuICAgICAgICBhd2FpdCBjYW5jZWxBbGdvcml0aG0ocmVhc29uKVxuICAgICAgfVxuICAgIH0sXG4gICAge1xuICAgICAgaGlnaFdhdGVyTWFyazogMCxcbiAgICAgIHNpemUgKCkge1xuICAgICAgICByZXR1cm4gMVxuICAgICAgfVxuICAgIH1cbiAgKVxuXG4gIC8vIDE3LiBSdW4gdGhlc2Ugc3RlcHMsIGJ1dCBhYm9ydCB3aGVuIHRoZSBvbmdvaW5nIGZldGNoIGlzIHRlcm1pbmF0ZWQ6XG5cbiAgLy8gICAgMS4gU2V0IHJlc3BvbnNl4oCZcyBib2R5IHRvIGEgbmV3IGJvZHkgd2hvc2Ugc3RyZWFtIGlzIHN0cmVhbS5cbiAgcmVzcG9uc2UuYm9keSA9IHsgc3RyZWFtIH1cblxuICAvLyAgICAyLiBJZiByZXNwb25zZSBpcyBub3QgYSBuZXR3b3JrIGVycm9yIGFuZCByZXF1ZXN04oCZcyBjYWNoZSBtb2RlIGlzXG4gIC8vICAgIG5vdCBcIm5vLXN0b3JlXCIsIHRoZW4gdXBkYXRlIHJlc3BvbnNlIGluIGh0dHBDYWNoZSBmb3IgcmVxdWVzdC5cbiAgLy8gICAgVE9ET1xuXG4gIC8vICAgIDMuIElmIGluY2x1ZGVDcmVkZW50aWFscyBpcyB0cnVlIGFuZCB0aGUgdXNlciBhZ2VudCBpcyBub3QgY29uZmlndXJlZFxuICAvLyAgICB0byBibG9jayBjb29raWVzIGZvciByZXF1ZXN0IChzZWUgc2VjdGlvbiA3IG9mIFtDT09LSUVTXSksIHRoZW4gcnVuIHRoZVxuICAvLyAgICBcInNldC1jb29raWUtc3RyaW5nXCIgcGFyc2luZyBhbGdvcml0aG0gKHNlZSBzZWN0aW9uIDUuMiBvZiBbQ09PS0lFU10pIG9uXG4gIC8vICAgIHRoZSB2YWx1ZSBvZiBlYWNoIGhlYWRlciB3aG9zZSBuYW1lIGlzIGEgYnl0ZS1jYXNlLWluc2Vuc2l0aXZlIG1hdGNoIGZvclxuICAvLyAgICBgU2V0LUNvb2tpZWAgaW4gcmVzcG9uc2XigJlzIGhlYWRlciBsaXN0LCBpZiBhbnksIGFuZCByZXF1ZXN04oCZcyBjdXJyZW50IFVSTC5cbiAgLy8gICAgVE9ET1xuXG4gIC8vIDE4LiBJZiBhYm9ydGVkLCB0aGVuOlxuICAvLyBUT0RPXG5cbiAgLy8gMTkuIFJ1biB0aGVzZSBzdGVwcyBpbiBwYXJhbGxlbDpcblxuICAvLyAgICAxLiBSdW4gdGhlc2Ugc3RlcHMsIGJ1dCBhYm9ydCB3aGVuIGZldGNoUGFyYW1zIGlzIGNhbmNlbGVkOlxuICBmZXRjaFBhcmFtcy5jb250cm9sbGVyLm9uKCd0ZXJtaW5hdGVkJywgb25BYm9ydGVkKVxuICBmZXRjaFBhcmFtcy5jb250cm9sbGVyLnJlc3VtZSA9IGFzeW5jICgpID0+IHtcbiAgICAvLyAxLiBXaGlsZSB0cnVlXG4gICAgd2hpbGUgKHRydWUpIHtcbiAgICAgIC8vIDEtMy4gU2VlIG9uRGF0YS4uLlxuXG4gICAgICAvLyA0LiBTZXQgYnl0ZXMgdG8gdGhlIHJlc3VsdCBvZiBoYW5kbGluZyBjb250ZW50IGNvZGluZ3MgZ2l2ZW5cbiAgICAgIC8vIGNvZGluZ3MgYW5kIGJ5dGVzLlxuICAgICAgbGV0IGJ5dGVzXG4gICAgICBsZXQgaXNGYWlsdXJlXG4gICAgICB0cnkge1xuICAgICAgICBjb25zdCB7IGRvbmUsIHZhbHVlIH0gPSBhd2FpdCBmZXRjaFBhcmFtcy5jb250cm9sbGVyLm5leHQoKVxuXG4gICAgICAgIGlmIChpc0Fib3J0ZWQoZmV0Y2hQYXJhbXMpKSB7XG4gICAgICAgICAgYnJlYWtcbiAgICAgICAgfVxuXG4gICAgICAgIGJ5dGVzID0gZG9uZSA/IHVuZGVmaW5lZCA6IHZhbHVlXG4gICAgICB9IGNhdGNoIChlcnIpIHtcbiAgICAgICAgaWYgKGZldGNoUGFyYW1zLmNvbnRyb2xsZXIuZW5kZWQgJiYgIXRpbWluZ0luZm8uZW5jb2RlZEJvZHlTaXplKSB7XG4gICAgICAgICAgLy8gemxpYiBkb2Vzbid0IGxpa2UgZW1wdHkgc3RyZWFtcy5cbiAgICAgICAgICBieXRlcyA9IHVuZGVmaW5lZFxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIGJ5dGVzID0gZXJyXG5cbiAgICAgICAgICAvLyBlcnIgbWF5IGJlIHByb3BhZ2F0ZWQgZnJvbSB0aGUgcmVzdWx0IG9mIGNhbGxpbmcgcmVhZGFibGVzdHJlYW0uY2FuY2VsLFxuICAgICAgICAgIC8vIHdoaWNoIG1pZ2h0IG5vdCBiZSBhbiBlcnJvci4gaHR0cHM6Ly9naXRodWIuY29tL25vZGVqcy91bmRpY2kvaXNzdWVzLzIwMDlcbiAgICAgICAgICBpc0ZhaWx1cmUgPSB0cnVlXG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgaWYgKGJ5dGVzID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgLy8gMi4gT3RoZXJ3aXNlLCBpZiB0aGUgYnl0ZXMgdHJhbnNtaXNzaW9uIGZvciByZXNwb25zZeKAmXMgbWVzc2FnZVxuICAgICAgICAvLyBib2R5IGlzIGRvbmUgbm9ybWFsbHkgYW5kIHN0cmVhbSBpcyByZWFkYWJsZSwgdGhlbiBjbG9zZVxuICAgICAgICAvLyBzdHJlYW0sIGZpbmFsaXplIHJlc3BvbnNlIGZvciBmZXRjaFBhcmFtcyBhbmQgcmVzcG9uc2UsIGFuZFxuICAgICAgICAvLyBhYm9ydCB0aGVzZSBpbi1wYXJhbGxlbCBzdGVwcy5cbiAgICAgICAgcmVhZGFibGVTdHJlYW1DbG9zZShmZXRjaFBhcmFtcy5jb250cm9sbGVyLmNvbnRyb2xsZXIpXG5cbiAgICAgICAgZmluYWxpemVSZXNwb25zZShmZXRjaFBhcmFtcywgcmVzcG9uc2UpXG5cbiAgICAgICAgcmV0dXJuXG4gICAgICB9XG5cbiAgICAgIC8vIDUuIEluY3JlYXNlIHRpbWluZ0luZm/igJlzIGRlY29kZWQgYm9keSBzaXplIGJ5IGJ5dGVz4oCZcyBsZW5ndGguXG4gICAgICB0aW1pbmdJbmZvLmRlY29kZWRCb2R5U2l6ZSArPSBieXRlcz8uYnl0ZUxlbmd0aCA/PyAwXG5cbiAgICAgIC8vIDYuIElmIGJ5dGVzIGlzIGZhaWx1cmUsIHRoZW4gdGVybWluYXRlIGZldGNoUGFyYW1z4oCZcyBjb250cm9sbGVyLlxuICAgICAgaWYgKGlzRmFpbHVyZSkge1xuICAgICAgICBmZXRjaFBhcmFtcy5jb250cm9sbGVyLnRlcm1pbmF0ZShieXRlcylcbiAgICAgICAgcmV0dXJuXG4gICAgICB9XG5cbiAgICAgIC8vIDcuIEVucXVldWUgYSBVaW50OEFycmF5IHdyYXBwaW5nIGFuIEFycmF5QnVmZmVyIGNvbnRhaW5pbmcgYnl0ZXNcbiAgICAgIC8vIGludG8gc3RyZWFtLlxuICAgICAgZmV0Y2hQYXJhbXMuY29udHJvbGxlci5jb250cm9sbGVyLmVucXVldWUobmV3IFVpbnQ4QXJyYXkoYnl0ZXMpKVxuXG4gICAgICAvLyA4LiBJZiBzdHJlYW0gaXMgZXJyb3JlZCwgdGhlbiB0ZXJtaW5hdGUgdGhlIG9uZ29pbmcgZmV0Y2guXG4gICAgICBpZiAoaXNFcnJvcmVkKHN0cmVhbSkpIHtcbiAgICAgICAgZmV0Y2hQYXJhbXMuY29udHJvbGxlci50ZXJtaW5hdGUoKVxuICAgICAgICByZXR1cm5cbiAgICAgIH1cblxuICAgICAgLy8gOS4gSWYgc3RyZWFtIGRvZXNu4oCZdCBuZWVkIG1vcmUgZGF0YSBhc2sgdGhlIHVzZXIgYWdlbnQgdG8gc3VzcGVuZFxuICAgICAgLy8gdGhlIG9uZ29pbmcgZmV0Y2guXG4gICAgICBpZiAoIWZldGNoUGFyYW1zLmNvbnRyb2xsZXIuY29udHJvbGxlci5kZXNpcmVkU2l6ZSkge1xuICAgICAgICByZXR1cm5cbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICAvLyAgICAyLiBJZiBhYm9ydGVkLCB0aGVuOlxuICBmdW5jdGlvbiBvbkFib3J0ZWQgKHJlYXNvbikge1xuICAgIC8vIDIuIElmIGZldGNoUGFyYW1zIGlzIGFib3J0ZWQsIHRoZW46XG4gICAgaWYgKGlzQWJvcnRlZChmZXRjaFBhcmFtcykpIHtcbiAgICAgIC8vIDEuIFNldCByZXNwb25zZeKAmXMgYWJvcnRlZCBmbGFnLlxuICAgICAgcmVzcG9uc2UuYWJvcnRlZCA9IHRydWVcblxuICAgICAgLy8gMi4gSWYgc3RyZWFtIGlzIHJlYWRhYmxlLCB0aGVuIGVycm9yIHN0cmVhbSB3aXRoIHRoZSByZXN1bHQgb2ZcbiAgICAgIC8vICAgIGRlc2VyaWFsaXplIGEgc2VyaWFsaXplZCBhYm9ydCByZWFzb24gZ2l2ZW4gZmV0Y2hQYXJhbXPigJlzXG4gICAgICAvLyAgICBjb250cm9sbGVy4oCZcyBzZXJpYWxpemVkIGFib3J0IHJlYXNvbiBhbmQgYW5cbiAgICAgIC8vICAgIGltcGxlbWVudGF0aW9uLWRlZmluZWQgcmVhbG0uXG4gICAgICBpZiAoaXNSZWFkYWJsZShzdHJlYW0pKSB7XG4gICAgICAgIGZldGNoUGFyYW1zLmNvbnRyb2xsZXIuY29udHJvbGxlci5lcnJvcihcbiAgICAgICAgICBmZXRjaFBhcmFtcy5jb250cm9sbGVyLnNlcmlhbGl6ZWRBYm9ydFJlYXNvblxuICAgICAgICApXG4gICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgIC8vIDMuIE90aGVyd2lzZSwgaWYgc3RyZWFtIGlzIHJlYWRhYmxlLCBlcnJvciBzdHJlYW0gd2l0aCBhIFR5cGVFcnJvci5cbiAgICAgIGlmIChpc1JlYWRhYmxlKHN0cmVhbSkpIHtcbiAgICAgICAgZmV0Y2hQYXJhbXMuY29udHJvbGxlci5jb250cm9sbGVyLmVycm9yKG5ldyBUeXBlRXJyb3IoJ3Rlcm1pbmF0ZWQnLCB7XG4gICAgICAgICAgY2F1c2U6IGlzRXJyb3JMaWtlKHJlYXNvbikgPyByZWFzb24gOiB1bmRlZmluZWRcbiAgICAgICAgfSkpXG4gICAgICB9XG4gICAgfVxuXG4gICAgLy8gNC4gSWYgY29ubmVjdGlvbiB1c2VzIEhUVFAvMiwgdGhlbiB0cmFuc21pdCBhbiBSU1RfU1RSRUFNIGZyYW1lLlxuICAgIC8vIDUuIE90aGVyd2lzZSwgdGhlIHVzZXIgYWdlbnQgc2hvdWxkIGNsb3NlIGNvbm5lY3Rpb24gdW5sZXNzIGl0IHdvdWxkIGJlIGJhZCBmb3IgcGVyZm9ybWFuY2UgdG8gZG8gc28uXG4gICAgZmV0Y2hQYXJhbXMuY29udHJvbGxlci5jb25uZWN0aW9uLmRlc3Ryb3koKVxuICB9XG5cbiAgLy8gMjAuIFJldHVybiByZXNwb25zZS5cbiAgcmV0dXJuIHJlc3BvbnNlXG5cbiAgYXN5bmMgZnVuY3Rpb24gZGlzcGF0Y2ggKHsgYm9keSB9KSB7XG4gICAgY29uc3QgdXJsID0gcmVxdWVzdEN1cnJlbnRVUkwocmVxdWVzdClcbiAgICAvKiogQHR5cGUge2ltcG9ydCgnLi4vLi4nKS5BZ2VudH0gKi9cbiAgICBjb25zdCBhZ2VudCA9IGZldGNoUGFyYW1zLmNvbnRyb2xsZXIuZGlzcGF0Y2hlclxuXG4gICAgcmV0dXJuIG5ldyBQcm9taXNlKChyZXNvbHZlLCByZWplY3QpID0+IGFnZW50LmRpc3BhdGNoKFxuICAgICAge1xuICAgICAgICBwYXRoOiB1cmwucGF0aG5hbWUgKyB1cmwuc2VhcmNoLFxuICAgICAgICBvcmlnaW46IHVybC5vcmlnaW4sXG4gICAgICAgIG1ldGhvZDogcmVxdWVzdC5tZXRob2QsXG4gICAgICAgIGJvZHk6IGZldGNoUGFyYW1zLmNvbnRyb2xsZXIuZGlzcGF0Y2hlci5pc01vY2tBY3RpdmUgPyByZXF1ZXN0LmJvZHkgJiYgKHJlcXVlc3QuYm9keS5zb3VyY2UgfHwgcmVxdWVzdC5ib2R5LnN0cmVhbSkgOiBib2R5LFxuICAgICAgICBoZWFkZXJzOiByZXF1ZXN0LmhlYWRlcnNMaXN0LmVudHJpZXMsXG4gICAgICAgIG1heFJlZGlyZWN0aW9uczogMCxcbiAgICAgICAgdXBncmFkZTogcmVxdWVzdC5tb2RlID09PSAnd2Vic29ja2V0JyA/ICd3ZWJzb2NrZXQnIDogdW5kZWZpbmVkXG4gICAgICB9LFxuICAgICAge1xuICAgICAgICBib2R5OiBudWxsLFxuICAgICAgICBhYm9ydDogbnVsbCxcblxuICAgICAgICBvbkNvbm5lY3QgKGFib3J0KSB7XG4gICAgICAgICAgLy8gVE9ETyAoZml4KTogRG8gd2UgbmVlZCBjb25uZWN0aW9uIGhlcmU/XG4gICAgICAgICAgY29uc3QgeyBjb25uZWN0aW9uIH0gPSBmZXRjaFBhcmFtcy5jb250cm9sbGVyXG5cbiAgICAgICAgICBpZiAoY29ubmVjdGlvbi5kZXN0cm95ZWQpIHtcbiAgICAgICAgICAgIGFib3J0KG5ldyBET01FeGNlcHRpb24oJ1RoZSBvcGVyYXRpb24gd2FzIGFib3J0ZWQuJywgJ0Fib3J0RXJyb3InKSlcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgZmV0Y2hQYXJhbXMuY29udHJvbGxlci5vbigndGVybWluYXRlZCcsIGFib3J0KVxuICAgICAgICAgICAgdGhpcy5hYm9ydCA9IGNvbm5lY3Rpb24uYWJvcnQgPSBhYm9ydFxuICAgICAgICAgIH1cbiAgICAgICAgfSxcblxuICAgICAgICBvbkhlYWRlcnMgKHN0YXR1cywgaGVhZGVyc0xpc3QsIHJlc3VtZSwgc3RhdHVzVGV4dCkge1xuICAgICAgICAgIGlmIChzdGF0dXMgPCAyMDApIHtcbiAgICAgICAgICAgIHJldHVyblxuICAgICAgICAgIH1cblxuICAgICAgICAgIGxldCBjb2RpbmdzID0gW11cbiAgICAgICAgICBsZXQgbG9jYXRpb24gPSAnJ1xuXG4gICAgICAgICAgY29uc3QgaGVhZGVycyA9IG5ldyBIZWFkZXJzKClcblxuICAgICAgICAgIC8vIEZvciBIMiwgdGhlIGhlYWRlcnMgYXJlIGEgcGxhaW4gSlMgb2JqZWN0XG4gICAgICAgICAgLy8gV2UgZGlzdGluZ3Vpc2ggYmV0d2VlbiB0aGVtIGFuZCBpdGVyYXRlIGFjY29yZGluZ2x5XG4gICAgICAgICAgaWYgKEFycmF5LmlzQXJyYXkoaGVhZGVyc0xpc3QpKSB7XG4gICAgICAgICAgICBmb3IgKGxldCBuID0gMDsgbiA8IGhlYWRlcnNMaXN0Lmxlbmd0aDsgbiArPSAyKSB7XG4gICAgICAgICAgICAgIGNvbnN0IGtleSA9IGhlYWRlcnNMaXN0W24gKyAwXS50b1N0cmluZygnbGF0aW4xJylcbiAgICAgICAgICAgICAgY29uc3QgdmFsID0gaGVhZGVyc0xpc3RbbiArIDFdLnRvU3RyaW5nKCdsYXRpbjEnKVxuICAgICAgICAgICAgICBpZiAoa2V5LnRvTG93ZXJDYXNlKCkgPT09ICdjb250ZW50LWVuY29kaW5nJykge1xuICAgICAgICAgICAgICAgIC8vIGh0dHBzOi8vd3d3LnJmYy1lZGl0b3Iub3JnL3JmYy9yZmM3MjMxI3NlY3Rpb24tMy4xLjIuMVxuICAgICAgICAgICAgICAgIC8vIFwiQWxsIGNvbnRlbnQtY29kaW5nIHZhbHVlcyBhcmUgY2FzZS1pbnNlbnNpdGl2ZS4uLlwiXG4gICAgICAgICAgICAgICAgY29kaW5ncyA9IHZhbC50b0xvd2VyQ2FzZSgpLnNwbGl0KCcsJykubWFwKCh4KSA9PiB4LnRyaW0oKSlcbiAgICAgICAgICAgICAgfSBlbHNlIGlmIChrZXkudG9Mb3dlckNhc2UoKSA9PT0gJ2xvY2F0aW9uJykge1xuICAgICAgICAgICAgICAgIGxvY2F0aW9uID0gdmFsXG4gICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICBoZWFkZXJzW2tIZWFkZXJzTGlzdF0uYXBwZW5kKGtleSwgdmFsKVxuICAgICAgICAgICAgfVxuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBjb25zdCBrZXlzID0gT2JqZWN0LmtleXMoaGVhZGVyc0xpc3QpXG4gICAgICAgICAgICBmb3IgKGNvbnN0IGtleSBvZiBrZXlzKSB7XG4gICAgICAgICAgICAgIGNvbnN0IHZhbCA9IGhlYWRlcnNMaXN0W2tleV1cbiAgICAgICAgICAgICAgaWYgKGtleS50b0xvd2VyQ2FzZSgpID09PSAnY29udGVudC1lbmNvZGluZycpIHtcbiAgICAgICAgICAgICAgICAvLyBodHRwczovL3d3dy5yZmMtZWRpdG9yLm9yZy9yZmMvcmZjNzIzMSNzZWN0aW9uLTMuMS4yLjFcbiAgICAgICAgICAgICAgICAvLyBcIkFsbCBjb250ZW50LWNvZGluZyB2YWx1ZXMgYXJlIGNhc2UtaW5zZW5zaXRpdmUuLi5cIlxuICAgICAgICAgICAgICAgIGNvZGluZ3MgPSB2YWwudG9Mb3dlckNhc2UoKS5zcGxpdCgnLCcpLm1hcCgoeCkgPT4geC50cmltKCkpLnJldmVyc2UoKVxuICAgICAgICAgICAgICB9IGVsc2UgaWYgKGtleS50b0xvd2VyQ2FzZSgpID09PSAnbG9jYXRpb24nKSB7XG4gICAgICAgICAgICAgICAgbG9jYXRpb24gPSB2YWxcbiAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgIGhlYWRlcnNba0hlYWRlcnNMaXN0XS5hcHBlbmQoa2V5LCB2YWwpXG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgdGhpcy5ib2R5ID0gbmV3IFJlYWRhYmxlKHsgcmVhZDogcmVzdW1lIH0pXG5cbiAgICAgICAgICBjb25zdCBkZWNvZGVycyA9IFtdXG5cbiAgICAgICAgICBjb25zdCB3aWxsRm9sbG93ID0gcmVxdWVzdC5yZWRpcmVjdCA9PT0gJ2ZvbGxvdycgJiZcbiAgICAgICAgICAgIGxvY2F0aW9uICYmXG4gICAgICAgICAgICByZWRpcmVjdFN0YXR1c1NldC5oYXMoc3RhdHVzKVxuXG4gICAgICAgICAgLy8gaHR0cHM6Ly9kZXZlbG9wZXIubW96aWxsYS5vcmcvZW4tVVMvZG9jcy9XZWIvSFRUUC9IZWFkZXJzL0NvbnRlbnQtRW5jb2RpbmdcbiAgICAgICAgICBpZiAocmVxdWVzdC5tZXRob2QgIT09ICdIRUFEJyAmJiByZXF1ZXN0Lm1ldGhvZCAhPT0gJ0NPTk5FQ1QnICYmICFudWxsQm9keVN0YXR1cy5pbmNsdWRlcyhzdGF0dXMpICYmICF3aWxsRm9sbG93KSB7XG4gICAgICAgICAgICBmb3IgKGNvbnN0IGNvZGluZyBvZiBjb2RpbmdzKSB7XG4gICAgICAgICAgICAgIC8vIGh0dHBzOi8vd3d3LnJmYy1lZGl0b3Iub3JnL3JmYy9yZmM5MTEyLmh0bWwjc2VjdGlvbi03LjJcbiAgICAgICAgICAgICAgaWYgKGNvZGluZyA9PT0gJ3gtZ3ppcCcgfHwgY29kaW5nID09PSAnZ3ppcCcpIHtcbiAgICAgICAgICAgICAgICBkZWNvZGVycy5wdXNoKHpsaWIuY3JlYXRlR3VuemlwKHtcbiAgICAgICAgICAgICAgICAgIC8vIEJlIGxlc3Mgc3RyaWN0IHdoZW4gZGVjb2RpbmcgY29tcHJlc3NlZCByZXNwb25zZXMsIHNpbmNlIHNvbWV0aW1lc1xuICAgICAgICAgICAgICAgICAgLy8gc2VydmVycyBzZW5kIHNsaWdodGx5IGludmFsaWQgcmVzcG9uc2VzIHRoYXQgYXJlIHN0aWxsIGFjY2VwdGVkXG4gICAgICAgICAgICAgICAgICAvLyBieSBjb21tb24gYnJvd3NlcnMuXG4gICAgICAgICAgICAgICAgICAvLyBBbHdheXMgdXNpbmcgWl9TWU5DX0ZMVVNIIGlzIHdoYXQgY1VSTCBkb2VzLlxuICAgICAgICAgICAgICAgICAgZmx1c2g6IHpsaWIuY29uc3RhbnRzLlpfU1lOQ19GTFVTSCxcbiAgICAgICAgICAgICAgICAgIGZpbmlzaEZsdXNoOiB6bGliLmNvbnN0YW50cy5aX1NZTkNfRkxVU0hcbiAgICAgICAgICAgICAgICB9KSlcbiAgICAgICAgICAgICAgfSBlbHNlIGlmIChjb2RpbmcgPT09ICdkZWZsYXRlJykge1xuICAgICAgICAgICAgICAgIGRlY29kZXJzLnB1c2goemxpYi5jcmVhdGVJbmZsYXRlKCkpXG4gICAgICAgICAgICAgIH0gZWxzZSBpZiAoY29kaW5nID09PSAnYnInKSB7XG4gICAgICAgICAgICAgICAgZGVjb2RlcnMucHVzaCh6bGliLmNyZWF0ZUJyb3RsaURlY29tcHJlc3MoKSlcbiAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICBkZWNvZGVycy5sZW5ndGggPSAwXG4gICAgICAgICAgICAgICAgYnJlYWtcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cblxuICAgICAgICAgIHJlc29sdmUoe1xuICAgICAgICAgICAgc3RhdHVzLFxuICAgICAgICAgICAgc3RhdHVzVGV4dCxcbiAgICAgICAgICAgIGhlYWRlcnNMaXN0OiBoZWFkZXJzW2tIZWFkZXJzTGlzdF0sXG4gICAgICAgICAgICBib2R5OiBkZWNvZGVycy5sZW5ndGhcbiAgICAgICAgICAgICAgPyBwaXBlbGluZSh0aGlzLmJvZHksIC4uLmRlY29kZXJzLCAoKSA9PiB7IH0pXG4gICAgICAgICAgICAgIDogdGhpcy5ib2R5Lm9uKCdlcnJvcicsICgpID0+IHt9KVxuICAgICAgICAgIH0pXG5cbiAgICAgICAgICByZXR1cm4gdHJ1ZVxuICAgICAgICB9LFxuXG4gICAgICAgIG9uRGF0YSAoY2h1bmspIHtcbiAgICAgICAgICBpZiAoZmV0Y2hQYXJhbXMuY29udHJvbGxlci5kdW1wKSB7XG4gICAgICAgICAgICByZXR1cm5cbiAgICAgICAgICB9XG5cbiAgICAgICAgICAvLyAxLiBJZiBvbmUgb3IgbW9yZSBieXRlcyBoYXZlIGJlZW4gdHJhbnNtaXR0ZWQgZnJvbSByZXNwb25zZeKAmXNcbiAgICAgICAgICAvLyBtZXNzYWdlIGJvZHksIHRoZW46XG5cbiAgICAgICAgICAvLyAgMS4gTGV0IGJ5dGVzIGJlIHRoZSB0cmFuc21pdHRlZCBieXRlcy5cbiAgICAgICAgICBjb25zdCBieXRlcyA9IGNodW5rXG5cbiAgICAgICAgICAvLyAgMi4gTGV0IGNvZGluZ3MgYmUgdGhlIHJlc3VsdCBvZiBleHRyYWN0aW5nIGhlYWRlciBsaXN0IHZhbHVlc1xuICAgICAgICAgIC8vICBnaXZlbiBgQ29udGVudC1FbmNvZGluZ2AgYW5kIHJlc3BvbnNl4oCZcyBoZWFkZXIgbGlzdC5cbiAgICAgICAgICAvLyAgU2VlIHB1bGxBbGdvcml0aG0uXG5cbiAgICAgICAgICAvLyAgMy4gSW5jcmVhc2UgdGltaW5nSW5mb+KAmXMgZW5jb2RlZCBib2R5IHNpemUgYnkgYnl0ZXPigJlzIGxlbmd0aC5cbiAgICAgICAgICB0aW1pbmdJbmZvLmVuY29kZWRCb2R5U2l6ZSArPSBieXRlcy5ieXRlTGVuZ3RoXG5cbiAgICAgICAgICAvLyAgNC4gU2VlIHB1bGxBbGdvcml0aG0uLi5cblxuICAgICAgICAgIHJldHVybiB0aGlzLmJvZHkucHVzaChieXRlcylcbiAgICAgICAgfSxcblxuICAgICAgICBvbkNvbXBsZXRlICgpIHtcbiAgICAgICAgICBpZiAodGhpcy5hYm9ydCkge1xuICAgICAgICAgICAgZmV0Y2hQYXJhbXMuY29udHJvbGxlci5vZmYoJ3Rlcm1pbmF0ZWQnLCB0aGlzLmFib3J0KVxuICAgICAgICAgIH1cblxuICAgICAgICAgIGZldGNoUGFyYW1zLmNvbnRyb2xsZXIuZW5kZWQgPSB0cnVlXG5cbiAgICAgICAgICB0aGlzLmJvZHkucHVzaChudWxsKVxuICAgICAgICB9LFxuXG4gICAgICAgIG9uRXJyb3IgKGVycm9yKSB7XG4gICAgICAgICAgaWYgKHRoaXMuYWJvcnQpIHtcbiAgICAgICAgICAgIGZldGNoUGFyYW1zLmNvbnRyb2xsZXIub2ZmKCd0ZXJtaW5hdGVkJywgdGhpcy5hYm9ydClcbiAgICAgICAgICB9XG5cbiAgICAgICAgICB0aGlzLmJvZHk/LmRlc3Ryb3koZXJyb3IpXG5cbiAgICAgICAgICBmZXRjaFBhcmFtcy5jb250cm9sbGVyLnRlcm1pbmF0ZShlcnJvcilcblxuICAgICAgICAgIHJlamVjdChlcnJvcilcbiAgICAgICAgfSxcblxuICAgICAgICBvblVwZ3JhZGUgKHN0YXR1cywgaGVhZGVyc0xpc3QsIHNvY2tldCkge1xuICAgICAgICAgIGlmIChzdGF0dXMgIT09IDEwMSkge1xuICAgICAgICAgICAgcmV0dXJuXG4gICAgICAgICAgfVxuXG4gICAgICAgICAgY29uc3QgaGVhZGVycyA9IG5ldyBIZWFkZXJzKClcblxuICAgICAgICAgIGZvciAobGV0IG4gPSAwOyBuIDwgaGVhZGVyc0xpc3QubGVuZ3RoOyBuICs9IDIpIHtcbiAgICAgICAgICAgIGNvbnN0IGtleSA9IGhlYWRlcnNMaXN0W24gKyAwXS50b1N0cmluZygnbGF0aW4xJylcbiAgICAgICAgICAgIGNvbnN0IHZhbCA9IGhlYWRlcnNMaXN0W24gKyAxXS50b1N0cmluZygnbGF0aW4xJylcblxuICAgICAgICAgICAgaGVhZGVyc1trSGVhZGVyc0xpc3RdLmFwcGVuZChrZXksIHZhbClcbiAgICAgICAgICB9XG5cbiAgICAgICAgICByZXNvbHZlKHtcbiAgICAgICAgICAgIHN0YXR1cyxcbiAgICAgICAgICAgIHN0YXR1c1RleHQ6IFNUQVRVU19DT0RFU1tzdGF0dXNdLFxuICAgICAgICAgICAgaGVhZGVyc0xpc3Q6IGhlYWRlcnNba0hlYWRlcnNMaXN0XSxcbiAgICAgICAgICAgIHNvY2tldFxuICAgICAgICAgIH0pXG5cbiAgICAgICAgICByZXR1cm4gdHJ1ZVxuICAgICAgICB9XG4gICAgICB9XG4gICAgKSlcbiAgfVxufVxuXG5tb2R1bGUuZXhwb3J0cyA9IHtcbiAgZmV0Y2gsXG4gIEZldGNoLFxuICBmZXRjaGluZyxcbiAgZmluYWxpemVBbmRSZXBvcnRUaW1pbmdcbn1cbiIsCiAgICAiJ3VzZSBzdHJpY3QnXG5cbm1vZHVsZS5leHBvcnRzID0ge1xuICBrU3RhdGU6IFN5bWJvbCgnRmlsZVJlYWRlciBzdGF0ZScpLFxuICBrUmVzdWx0OiBTeW1ib2woJ0ZpbGVSZWFkZXIgcmVzdWx0JyksXG4gIGtFcnJvcjogU3ltYm9sKCdGaWxlUmVhZGVyIGVycm9yJyksXG4gIGtMYXN0UHJvZ3Jlc3NFdmVudEZpcmVkOiBTeW1ib2woJ0ZpbGVSZWFkZXIgbGFzdCBwcm9ncmVzcyBldmVudCBmaXJlZCB0aW1lc3RhbXAnKSxcbiAga0V2ZW50czogU3ltYm9sKCdGaWxlUmVhZGVyIGV2ZW50cycpLFxuICBrQWJvcnRlZDogU3ltYm9sKCdGaWxlUmVhZGVyIGFib3J0ZWQnKVxufVxuIiwKICAgICIndXNlIHN0cmljdCdcblxuY29uc3QgeyB3ZWJpZGwgfSA9IHJlcXVpcmUoJy4uL2ZldGNoL3dlYmlkbCcpXG5cbmNvbnN0IGtTdGF0ZSA9IFN5bWJvbCgnUHJvZ3Jlc3NFdmVudCBzdGF0ZScpXG5cbi8qKlxuICogQHNlZSBodHRwczovL3hoci5zcGVjLndoYXR3Zy5vcmcvI3Byb2dyZXNzZXZlbnRcbiAqL1xuY2xhc3MgUHJvZ3Jlc3NFdmVudCBleHRlbmRzIEV2ZW50IHtcbiAgY29uc3RydWN0b3IgKHR5cGUsIGV2ZW50SW5pdERpY3QgPSB7fSkge1xuICAgIHR5cGUgPSB3ZWJpZGwuY29udmVydGVycy5ET01TdHJpbmcodHlwZSlcbiAgICBldmVudEluaXREaWN0ID0gd2ViaWRsLmNvbnZlcnRlcnMuUHJvZ3Jlc3NFdmVudEluaXQoZXZlbnRJbml0RGljdCA/PyB7fSlcblxuICAgIHN1cGVyKHR5cGUsIGV2ZW50SW5pdERpY3QpXG5cbiAgICB0aGlzW2tTdGF0ZV0gPSB7XG4gICAgICBsZW5ndGhDb21wdXRhYmxlOiBldmVudEluaXREaWN0Lmxlbmd0aENvbXB1dGFibGUsXG4gICAgICBsb2FkZWQ6IGV2ZW50SW5pdERpY3QubG9hZGVkLFxuICAgICAgdG90YWw6IGV2ZW50SW5pdERpY3QudG90YWxcbiAgICB9XG4gIH1cblxuICBnZXQgbGVuZ3RoQ29tcHV0YWJsZSAoKSB7XG4gICAgd2ViaWRsLmJyYW5kQ2hlY2sodGhpcywgUHJvZ3Jlc3NFdmVudClcblxuICAgIHJldHVybiB0aGlzW2tTdGF0ZV0ubGVuZ3RoQ29tcHV0YWJsZVxuICB9XG5cbiAgZ2V0IGxvYWRlZCAoKSB7XG4gICAgd2ViaWRsLmJyYW5kQ2hlY2sodGhpcywgUHJvZ3Jlc3NFdmVudClcblxuICAgIHJldHVybiB0aGlzW2tTdGF0ZV0ubG9hZGVkXG4gIH1cblxuICBnZXQgdG90YWwgKCkge1xuICAgIHdlYmlkbC5icmFuZENoZWNrKHRoaXMsIFByb2dyZXNzRXZlbnQpXG5cbiAgICByZXR1cm4gdGhpc1trU3RhdGVdLnRvdGFsXG4gIH1cbn1cblxud2ViaWRsLmNvbnZlcnRlcnMuUHJvZ3Jlc3NFdmVudEluaXQgPSB3ZWJpZGwuZGljdGlvbmFyeUNvbnZlcnRlcihbXG4gIHtcbiAgICBrZXk6ICdsZW5ndGhDb21wdXRhYmxlJyxcbiAgICBjb252ZXJ0ZXI6IHdlYmlkbC5jb252ZXJ0ZXJzLmJvb2xlYW4sXG4gICAgZGVmYXVsdFZhbHVlOiBmYWxzZVxuICB9LFxuICB7XG4gICAga2V5OiAnbG9hZGVkJyxcbiAgICBjb252ZXJ0ZXI6IHdlYmlkbC5jb252ZXJ0ZXJzWyd1bnNpZ25lZCBsb25nIGxvbmcnXSxcbiAgICBkZWZhdWx0VmFsdWU6IDBcbiAgfSxcbiAge1xuICAgIGtleTogJ3RvdGFsJyxcbiAgICBjb252ZXJ0ZXI6IHdlYmlkbC5jb252ZXJ0ZXJzWyd1bnNpZ25lZCBsb25nIGxvbmcnXSxcbiAgICBkZWZhdWx0VmFsdWU6IDBcbiAgfSxcbiAge1xuICAgIGtleTogJ2J1YmJsZXMnLFxuICAgIGNvbnZlcnRlcjogd2ViaWRsLmNvbnZlcnRlcnMuYm9vbGVhbixcbiAgICBkZWZhdWx0VmFsdWU6IGZhbHNlXG4gIH0sXG4gIHtcbiAgICBrZXk6ICdjYW5jZWxhYmxlJyxcbiAgICBjb252ZXJ0ZXI6IHdlYmlkbC5jb252ZXJ0ZXJzLmJvb2xlYW4sXG4gICAgZGVmYXVsdFZhbHVlOiBmYWxzZVxuICB9LFxuICB7XG4gICAga2V5OiAnY29tcG9zZWQnLFxuICAgIGNvbnZlcnRlcjogd2ViaWRsLmNvbnZlcnRlcnMuYm9vbGVhbixcbiAgICBkZWZhdWx0VmFsdWU6IGZhbHNlXG4gIH1cbl0pXG5cbm1vZHVsZS5leHBvcnRzID0ge1xuICBQcm9ncmVzc0V2ZW50XG59XG4iLAogICAgIid1c2Ugc3RyaWN0J1xuXG4vKipcbiAqIEBzZWUgaHR0cHM6Ly9lbmNvZGluZy5zcGVjLndoYXR3Zy5vcmcvI2NvbmNlcHQtZW5jb2RpbmctZ2V0XG4gKiBAcGFyYW0ge3N0cmluZ3x1bmRlZmluZWR9IGxhYmVsXG4gKi9cbmZ1bmN0aW9uIGdldEVuY29kaW5nIChsYWJlbCkge1xuICBpZiAoIWxhYmVsKSB7XG4gICAgcmV0dXJuICdmYWlsdXJlJ1xuICB9XG5cbiAgLy8gMS4gUmVtb3ZlIGFueSBsZWFkaW5nIGFuZCB0cmFpbGluZyBBU0NJSSB3aGl0ZXNwYWNlIGZyb20gbGFiZWwuXG4gIC8vIDIuIElmIGxhYmVsIGlzIGFuIEFTQ0lJIGNhc2UtaW5zZW5zaXRpdmUgbWF0Y2ggZm9yIGFueSBvZiB0aGVcbiAgLy8gICAgbGFiZWxzIGxpc3RlZCBpbiB0aGUgdGFibGUgYmVsb3csIHRoZW4gcmV0dXJuIHRoZVxuICAvLyAgICBjb3JyZXNwb25kaW5nIGVuY29kaW5nOyBvdGhlcndpc2UgcmV0dXJuIGZhaWx1cmUuXG4gIHN3aXRjaCAobGFiZWwudHJpbSgpLnRvTG93ZXJDYXNlKCkpIHtcbiAgICBjYXNlICd1bmljb2RlLTEtMS11dGYtOCc6XG4gICAgY2FzZSAndW5pY29kZTExdXRmOCc6XG4gICAgY2FzZSAndW5pY29kZTIwdXRmOCc6XG4gICAgY2FzZSAndXRmLTgnOlxuICAgIGNhc2UgJ3V0ZjgnOlxuICAgIGNhc2UgJ3gtdW5pY29kZTIwdXRmOCc6XG4gICAgICByZXR1cm4gJ1VURi04J1xuICAgIGNhc2UgJzg2Nic6XG4gICAgY2FzZSAnY3A4NjYnOlxuICAgIGNhc2UgJ2NzaWJtODY2JzpcbiAgICBjYXNlICdpYm04NjYnOlxuICAgICAgcmV0dXJuICdJQk04NjYnXG4gICAgY2FzZSAnY3Npc29sYXRpbjInOlxuICAgIGNhc2UgJ2lzby04ODU5LTInOlxuICAgIGNhc2UgJ2lzby1pci0xMDEnOlxuICAgIGNhc2UgJ2lzbzg4NTktMic6XG4gICAgY2FzZSAnaXNvODg1OTInOlxuICAgIGNhc2UgJ2lzb184ODU5LTInOlxuICAgIGNhc2UgJ2lzb184ODU5LTI6MTk4Nyc6XG4gICAgY2FzZSAnbDInOlxuICAgIGNhc2UgJ2xhdGluMic6XG4gICAgICByZXR1cm4gJ0lTTy04ODU5LTInXG4gICAgY2FzZSAnY3Npc29sYXRpbjMnOlxuICAgIGNhc2UgJ2lzby04ODU5LTMnOlxuICAgIGNhc2UgJ2lzby1pci0xMDknOlxuICAgIGNhc2UgJ2lzbzg4NTktMyc6XG4gICAgY2FzZSAnaXNvODg1OTMnOlxuICAgIGNhc2UgJ2lzb184ODU5LTMnOlxuICAgIGNhc2UgJ2lzb184ODU5LTM6MTk4OCc6XG4gICAgY2FzZSAnbDMnOlxuICAgIGNhc2UgJ2xhdGluMyc6XG4gICAgICByZXR1cm4gJ0lTTy04ODU5LTMnXG4gICAgY2FzZSAnY3Npc29sYXRpbjQnOlxuICAgIGNhc2UgJ2lzby04ODU5LTQnOlxuICAgIGNhc2UgJ2lzby1pci0xMTAnOlxuICAgIGNhc2UgJ2lzbzg4NTktNCc6XG4gICAgY2FzZSAnaXNvODg1OTQnOlxuICAgIGNhc2UgJ2lzb184ODU5LTQnOlxuICAgIGNhc2UgJ2lzb184ODU5LTQ6MTk4OCc6XG4gICAgY2FzZSAnbDQnOlxuICAgIGNhc2UgJ2xhdGluNCc6XG4gICAgICByZXR1cm4gJ0lTTy04ODU5LTQnXG4gICAgY2FzZSAnY3Npc29sYXRpbmN5cmlsbGljJzpcbiAgICBjYXNlICdjeXJpbGxpYyc6XG4gICAgY2FzZSAnaXNvLTg4NTktNSc6XG4gICAgY2FzZSAnaXNvLWlyLTE0NCc6XG4gICAgY2FzZSAnaXNvODg1OS01JzpcbiAgICBjYXNlICdpc284ODU5NSc6XG4gICAgY2FzZSAnaXNvXzg4NTktNSc6XG4gICAgY2FzZSAnaXNvXzg4NTktNToxOTg4JzpcbiAgICAgIHJldHVybiAnSVNPLTg4NTktNSdcbiAgICBjYXNlICdhcmFiaWMnOlxuICAgIGNhc2UgJ2FzbW8tNzA4JzpcbiAgICBjYXNlICdjc2lzbzg4NTk2ZSc6XG4gICAgY2FzZSAnY3Npc284ODU5NmknOlxuICAgIGNhc2UgJ2NzaXNvbGF0aW5hcmFiaWMnOlxuICAgIGNhc2UgJ2VjbWEtMTE0JzpcbiAgICBjYXNlICdpc28tODg1OS02JzpcbiAgICBjYXNlICdpc28tODg1OS02LWUnOlxuICAgIGNhc2UgJ2lzby04ODU5LTYtaSc6XG4gICAgY2FzZSAnaXNvLWlyLTEyNyc6XG4gICAgY2FzZSAnaXNvODg1OS02JzpcbiAgICBjYXNlICdpc284ODU5Nic6XG4gICAgY2FzZSAnaXNvXzg4NTktNic6XG4gICAgY2FzZSAnaXNvXzg4NTktNjoxOTg3JzpcbiAgICAgIHJldHVybiAnSVNPLTg4NTktNidcbiAgICBjYXNlICdjc2lzb2xhdGluZ3JlZWsnOlxuICAgIGNhc2UgJ2VjbWEtMTE4JzpcbiAgICBjYXNlICdlbG90XzkyOCc6XG4gICAgY2FzZSAnZ3JlZWsnOlxuICAgIGNhc2UgJ2dyZWVrOCc6XG4gICAgY2FzZSAnaXNvLTg4NTktNyc6XG4gICAgY2FzZSAnaXNvLWlyLTEyNic6XG4gICAgY2FzZSAnaXNvODg1OS03JzpcbiAgICBjYXNlICdpc284ODU5Nyc6XG4gICAgY2FzZSAnaXNvXzg4NTktNyc6XG4gICAgY2FzZSAnaXNvXzg4NTktNzoxOTg3JzpcbiAgICBjYXNlICdzdW5fZXVfZ3JlZWsnOlxuICAgICAgcmV0dXJuICdJU08tODg1OS03J1xuICAgIGNhc2UgJ2NzaXNvODg1OThlJzpcbiAgICBjYXNlICdjc2lzb2xhdGluaGVicmV3JzpcbiAgICBjYXNlICdoZWJyZXcnOlxuICAgIGNhc2UgJ2lzby04ODU5LTgnOlxuICAgIGNhc2UgJ2lzby04ODU5LTgtZSc6XG4gICAgY2FzZSAnaXNvLWlyLTEzOCc6XG4gICAgY2FzZSAnaXNvODg1OS04JzpcbiAgICBjYXNlICdpc284ODU5OCc6XG4gICAgY2FzZSAnaXNvXzg4NTktOCc6XG4gICAgY2FzZSAnaXNvXzg4NTktODoxOTg4JzpcbiAgICBjYXNlICd2aXN1YWwnOlxuICAgICAgcmV0dXJuICdJU08tODg1OS04J1xuICAgIGNhc2UgJ2NzaXNvODg1OThpJzpcbiAgICBjYXNlICdpc28tODg1OS04LWknOlxuICAgIGNhc2UgJ2xvZ2ljYWwnOlxuICAgICAgcmV0dXJuICdJU08tODg1OS04LUknXG4gICAgY2FzZSAnY3Npc29sYXRpbjYnOlxuICAgIGNhc2UgJ2lzby04ODU5LTEwJzpcbiAgICBjYXNlICdpc28taXItMTU3JzpcbiAgICBjYXNlICdpc284ODU5LTEwJzpcbiAgICBjYXNlICdpc284ODU5MTAnOlxuICAgIGNhc2UgJ2w2JzpcbiAgICBjYXNlICdsYXRpbjYnOlxuICAgICAgcmV0dXJuICdJU08tODg1OS0xMCdcbiAgICBjYXNlICdpc28tODg1OS0xMyc6XG4gICAgY2FzZSAnaXNvODg1OS0xMyc6XG4gICAgY2FzZSAnaXNvODg1OTEzJzpcbiAgICAgIHJldHVybiAnSVNPLTg4NTktMTMnXG4gICAgY2FzZSAnaXNvLTg4NTktMTQnOlxuICAgIGNhc2UgJ2lzbzg4NTktMTQnOlxuICAgIGNhc2UgJ2lzbzg4NTkxNCc6XG4gICAgICByZXR1cm4gJ0lTTy04ODU5LTE0J1xuICAgIGNhc2UgJ2NzaXNvbGF0aW45JzpcbiAgICBjYXNlICdpc28tODg1OS0xNSc6XG4gICAgY2FzZSAnaXNvODg1OS0xNSc6XG4gICAgY2FzZSAnaXNvODg1OTE1JzpcbiAgICBjYXNlICdpc29fODg1OS0xNSc6XG4gICAgY2FzZSAnbDknOlxuICAgICAgcmV0dXJuICdJU08tODg1OS0xNSdcbiAgICBjYXNlICdpc28tODg1OS0xNic6XG4gICAgICByZXR1cm4gJ0lTTy04ODU5LTE2J1xuICAgIGNhc2UgJ2Nza29pOHInOlxuICAgIGNhc2UgJ2tvaSc6XG4gICAgY2FzZSAna29pOCc6XG4gICAgY2FzZSAna29pOC1yJzpcbiAgICBjYXNlICdrb2k4X3InOlxuICAgICAgcmV0dXJuICdLT0k4LVInXG4gICAgY2FzZSAna29pOC1ydSc6XG4gICAgY2FzZSAna29pOC11JzpcbiAgICAgIHJldHVybiAnS09JOC1VJ1xuICAgIGNhc2UgJ2NzbWFjaW50b3NoJzpcbiAgICBjYXNlICdtYWMnOlxuICAgIGNhc2UgJ21hY2ludG9zaCc6XG4gICAgY2FzZSAneC1tYWMtcm9tYW4nOlxuICAgICAgcmV0dXJuICdtYWNpbnRvc2gnXG4gICAgY2FzZSAnaXNvLTg4NTktMTEnOlxuICAgIGNhc2UgJ2lzbzg4NTktMTEnOlxuICAgIGNhc2UgJ2lzbzg4NTkxMSc6XG4gICAgY2FzZSAndGlzLTYyMCc6XG4gICAgY2FzZSAnd2luZG93cy04NzQnOlxuICAgICAgcmV0dXJuICd3aW5kb3dzLTg3NCdcbiAgICBjYXNlICdjcDEyNTAnOlxuICAgIGNhc2UgJ3dpbmRvd3MtMTI1MCc6XG4gICAgY2FzZSAneC1jcDEyNTAnOlxuICAgICAgcmV0dXJuICd3aW5kb3dzLTEyNTAnXG4gICAgY2FzZSAnY3AxMjUxJzpcbiAgICBjYXNlICd3aW5kb3dzLTEyNTEnOlxuICAgIGNhc2UgJ3gtY3AxMjUxJzpcbiAgICAgIHJldHVybiAnd2luZG93cy0xMjUxJ1xuICAgIGNhc2UgJ2Fuc2lfeDMuNC0xOTY4JzpcbiAgICBjYXNlICdhc2NpaSc6XG4gICAgY2FzZSAnY3AxMjUyJzpcbiAgICBjYXNlICdjcDgxOSc6XG4gICAgY2FzZSAnY3Npc29sYXRpbjEnOlxuICAgIGNhc2UgJ2libTgxOSc6XG4gICAgY2FzZSAnaXNvLTg4NTktMSc6XG4gICAgY2FzZSAnaXNvLWlyLTEwMCc6XG4gICAgY2FzZSAnaXNvODg1OS0xJzpcbiAgICBjYXNlICdpc284ODU5MSc6XG4gICAgY2FzZSAnaXNvXzg4NTktMSc6XG4gICAgY2FzZSAnaXNvXzg4NTktMToxOTg3JzpcbiAgICBjYXNlICdsMSc6XG4gICAgY2FzZSAnbGF0aW4xJzpcbiAgICBjYXNlICd1cy1hc2NpaSc6XG4gICAgY2FzZSAnd2luZG93cy0xMjUyJzpcbiAgICBjYXNlICd4LWNwMTI1Mic6XG4gICAgICByZXR1cm4gJ3dpbmRvd3MtMTI1MidcbiAgICBjYXNlICdjcDEyNTMnOlxuICAgIGNhc2UgJ3dpbmRvd3MtMTI1Myc6XG4gICAgY2FzZSAneC1jcDEyNTMnOlxuICAgICAgcmV0dXJuICd3aW5kb3dzLTEyNTMnXG4gICAgY2FzZSAnY3AxMjU0JzpcbiAgICBjYXNlICdjc2lzb2xhdGluNSc6XG4gICAgY2FzZSAnaXNvLTg4NTktOSc6XG4gICAgY2FzZSAnaXNvLWlyLTE0OCc6XG4gICAgY2FzZSAnaXNvODg1OS05JzpcbiAgICBjYXNlICdpc284ODU5OSc6XG4gICAgY2FzZSAnaXNvXzg4NTktOSc6XG4gICAgY2FzZSAnaXNvXzg4NTktOToxOTg5JzpcbiAgICBjYXNlICdsNSc6XG4gICAgY2FzZSAnbGF0aW41JzpcbiAgICBjYXNlICd3aW5kb3dzLTEyNTQnOlxuICAgIGNhc2UgJ3gtY3AxMjU0JzpcbiAgICAgIHJldHVybiAnd2luZG93cy0xMjU0J1xuICAgIGNhc2UgJ2NwMTI1NSc6XG4gICAgY2FzZSAnd2luZG93cy0xMjU1JzpcbiAgICBjYXNlICd4LWNwMTI1NSc6XG4gICAgICByZXR1cm4gJ3dpbmRvd3MtMTI1NSdcbiAgICBjYXNlICdjcDEyNTYnOlxuICAgIGNhc2UgJ3dpbmRvd3MtMTI1Nic6XG4gICAgY2FzZSAneC1jcDEyNTYnOlxuICAgICAgcmV0dXJuICd3aW5kb3dzLTEyNTYnXG4gICAgY2FzZSAnY3AxMjU3JzpcbiAgICBjYXNlICd3aW5kb3dzLTEyNTcnOlxuICAgIGNhc2UgJ3gtY3AxMjU3JzpcbiAgICAgIHJldHVybiAnd2luZG93cy0xMjU3J1xuICAgIGNhc2UgJ2NwMTI1OCc6XG4gICAgY2FzZSAnd2luZG93cy0xMjU4JzpcbiAgICBjYXNlICd4LWNwMTI1OCc6XG4gICAgICByZXR1cm4gJ3dpbmRvd3MtMTI1OCdcbiAgICBjYXNlICd4LW1hYy1jeXJpbGxpYyc6XG4gICAgY2FzZSAneC1tYWMtdWtyYWluaWFuJzpcbiAgICAgIHJldHVybiAneC1tYWMtY3lyaWxsaWMnXG4gICAgY2FzZSAnY2hpbmVzZSc6XG4gICAgY2FzZSAnY3NnYjIzMTInOlxuICAgIGNhc2UgJ2NzaXNvNThnYjIzMTI4MCc6XG4gICAgY2FzZSAnZ2IyMzEyJzpcbiAgICBjYXNlICdnYl8yMzEyJzpcbiAgICBjYXNlICdnYl8yMzEyLTgwJzpcbiAgICBjYXNlICdnYmsnOlxuICAgIGNhc2UgJ2lzby1pci01OCc6XG4gICAgY2FzZSAneC1nYmsnOlxuICAgICAgcmV0dXJuICdHQksnXG4gICAgY2FzZSAnZ2IxODAzMCc6XG4gICAgICByZXR1cm4gJ2diMTgwMzAnXG4gICAgY2FzZSAnYmlnNSc6XG4gICAgY2FzZSAnYmlnNS1oa3Njcyc6XG4gICAgY2FzZSAnY24tYmlnNSc6XG4gICAgY2FzZSAnY3NiaWc1JzpcbiAgICBjYXNlICd4LXgtYmlnNSc6XG4gICAgICByZXR1cm4gJ0JpZzUnXG4gICAgY2FzZSAnY3NldWNwa2RmbXRqYXBhbmVzZSc6XG4gICAgY2FzZSAnZXVjLWpwJzpcbiAgICBjYXNlICd4LWV1Yy1qcCc6XG4gICAgICByZXR1cm4gJ0VVQy1KUCdcbiAgICBjYXNlICdjc2lzbzIwMjJqcCc6XG4gICAgY2FzZSAnaXNvLTIwMjItanAnOlxuICAgICAgcmV0dXJuICdJU08tMjAyMi1KUCdcbiAgICBjYXNlICdjc3NoaWZ0amlzJzpcbiAgICBjYXNlICdtczkzMic6XG4gICAgY2FzZSAnbXNfa2FuamknOlxuICAgIGNhc2UgJ3NoaWZ0LWppcyc6XG4gICAgY2FzZSAnc2hpZnRfamlzJzpcbiAgICBjYXNlICdzamlzJzpcbiAgICBjYXNlICd3aW5kb3dzLTMxaic6XG4gICAgY2FzZSAneC1zamlzJzpcbiAgICAgIHJldHVybiAnU2hpZnRfSklTJ1xuICAgIGNhc2UgJ2NzZXVja3InOlxuICAgIGNhc2UgJ2Nza3NjNTYwMTE5ODcnOlxuICAgIGNhc2UgJ2V1Yy1rcic6XG4gICAgY2FzZSAnaXNvLWlyLTE0OSc6XG4gICAgY2FzZSAna29yZWFuJzpcbiAgICBjYXNlICdrc19jXzU2MDEtMTk4Nyc6XG4gICAgY2FzZSAna3NfY181NjAxLTE5ODknOlxuICAgIGNhc2UgJ2tzYzU2MDEnOlxuICAgIGNhc2UgJ2tzY181NjAxJzpcbiAgICBjYXNlICd3aW5kb3dzLTk0OSc6XG4gICAgICByZXR1cm4gJ0VVQy1LUidcbiAgICBjYXNlICdjc2lzbzIwMjJrcic6XG4gICAgY2FzZSAnaHotZ2ItMjMxMic6XG4gICAgY2FzZSAnaXNvLTIwMjItY24nOlxuICAgIGNhc2UgJ2lzby0yMDIyLWNuLWV4dCc6XG4gICAgY2FzZSAnaXNvLTIwMjIta3InOlxuICAgIGNhc2UgJ3JlcGxhY2VtZW50JzpcbiAgICAgIHJldHVybiAncmVwbGFjZW1lbnQnXG4gICAgY2FzZSAndW5pY29kZWZmZmUnOlxuICAgIGNhc2UgJ3V0Zi0xNmJlJzpcbiAgICAgIHJldHVybiAnVVRGLTE2QkUnXG4gICAgY2FzZSAnY3N1bmljb2RlJzpcbiAgICBjYXNlICdpc28tMTA2NDYtdWNzLTInOlxuICAgIGNhc2UgJ3Vjcy0yJzpcbiAgICBjYXNlICd1bmljb2RlJzpcbiAgICBjYXNlICd1bmljb2RlZmVmZic6XG4gICAgY2FzZSAndXRmLTE2JzpcbiAgICBjYXNlICd1dGYtMTZsZSc6XG4gICAgICByZXR1cm4gJ1VURi0xNkxFJ1xuICAgIGNhc2UgJ3gtdXNlci1kZWZpbmVkJzpcbiAgICAgIHJldHVybiAneC11c2VyLWRlZmluZWQnXG4gICAgZGVmYXVsdDogcmV0dXJuICdmYWlsdXJlJ1xuICB9XG59XG5cbm1vZHVsZS5leHBvcnRzID0ge1xuICBnZXRFbmNvZGluZ1xufVxuIiwKICAgICIndXNlIHN0cmljdCdcblxuY29uc3Qge1xuICBrU3RhdGUsXG4gIGtFcnJvcixcbiAga1Jlc3VsdCxcbiAga0Fib3J0ZWQsXG4gIGtMYXN0UHJvZ3Jlc3NFdmVudEZpcmVkXG59ID0gcmVxdWlyZSgnLi9zeW1ib2xzJylcbmNvbnN0IHsgUHJvZ3Jlc3NFdmVudCB9ID0gcmVxdWlyZSgnLi9wcm9ncmVzc2V2ZW50JylcbmNvbnN0IHsgZ2V0RW5jb2RpbmcgfSA9IHJlcXVpcmUoJy4vZW5jb2RpbmcnKVxuY29uc3QgeyBET01FeGNlcHRpb24gfSA9IHJlcXVpcmUoJy4uL2ZldGNoL2NvbnN0YW50cycpXG5jb25zdCB7IHNlcmlhbGl6ZUFNaW1lVHlwZSwgcGFyc2VNSU1FVHlwZSB9ID0gcmVxdWlyZSgnLi4vZmV0Y2gvZGF0YVVSTCcpXG5jb25zdCB7IHR5cGVzIH0gPSByZXF1aXJlKCd1dGlsJylcbmNvbnN0IHsgU3RyaW5nRGVjb2RlciB9ID0gcmVxdWlyZSgnc3RyaW5nX2RlY29kZXInKVxuY29uc3QgeyBidG9hIH0gPSByZXF1aXJlKCdidWZmZXInKVxuXG4vKiogQHR5cGUge1Byb3BlcnR5RGVzY3JpcHRvcn0gKi9cbmNvbnN0IHN0YXRpY1Byb3BlcnR5RGVzY3JpcHRvcnMgPSB7XG4gIGVudW1lcmFibGU6IHRydWUsXG4gIHdyaXRhYmxlOiBmYWxzZSxcbiAgY29uZmlndXJhYmxlOiBmYWxzZVxufVxuXG4vKipcbiAqIEBzZWUgaHR0cHM6Ly93M2MuZ2l0aHViLmlvL0ZpbGVBUEkvI3JlYWRPcGVyYXRpb25cbiAqIEBwYXJhbSB7aW1wb3J0KCcuL2ZpbGVyZWFkZXInKS5GaWxlUmVhZGVyfSBmclxuICogQHBhcmFtIHtpbXBvcnQoJ2J1ZmZlcicpLkJsb2J9IGJsb2JcbiAqIEBwYXJhbSB7c3RyaW5nfSB0eXBlXG4gKiBAcGFyYW0ge3N0cmluZz99IGVuY29kaW5nTmFtZVxuICovXG5mdW5jdGlvbiByZWFkT3BlcmF0aW9uIChmciwgYmxvYiwgdHlwZSwgZW5jb2RpbmdOYW1lKSB7XG4gIC8vIDEuIElmIGZy4oCZcyBzdGF0ZSBpcyBcImxvYWRpbmdcIiwgdGhyb3cgYW4gSW52YWxpZFN0YXRlRXJyb3JcbiAgLy8gICAgRE9NRXhjZXB0aW9uLlxuICBpZiAoZnJba1N0YXRlXSA9PT0gJ2xvYWRpbmcnKSB7XG4gICAgdGhyb3cgbmV3IERPTUV4Y2VwdGlvbignSW52YWxpZCBzdGF0ZScsICdJbnZhbGlkU3RhdGVFcnJvcicpXG4gIH1cblxuICAvLyAyLiBTZXQgZnLigJlzIHN0YXRlIHRvIFwibG9hZGluZ1wiLlxuICBmcltrU3RhdGVdID0gJ2xvYWRpbmcnXG5cbiAgLy8gMy4gU2V0IGZy4oCZcyByZXN1bHQgdG8gbnVsbC5cbiAgZnJba1Jlc3VsdF0gPSBudWxsXG5cbiAgLy8gNC4gU2V0IGZy4oCZcyBlcnJvciB0byBudWxsLlxuICBmcltrRXJyb3JdID0gbnVsbFxuXG4gIC8vIDUuIExldCBzdHJlYW0gYmUgdGhlIHJlc3VsdCBvZiBjYWxsaW5nIGdldCBzdHJlYW0gb24gYmxvYi5cbiAgLyoqIEB0eXBlIHtpbXBvcnQoJ3N0cmVhbS93ZWInKS5SZWFkYWJsZVN0cmVhbX0gKi9cbiAgY29uc3Qgc3RyZWFtID0gYmxvYi5zdHJlYW0oKVxuXG4gIC8vIDYuIExldCByZWFkZXIgYmUgdGhlIHJlc3VsdCBvZiBnZXR0aW5nIGEgcmVhZGVyIGZyb20gc3RyZWFtLlxuICBjb25zdCByZWFkZXIgPSBzdHJlYW0uZ2V0UmVhZGVyKClcblxuICAvLyA3LiBMZXQgYnl0ZXMgYmUgYW4gZW1wdHkgYnl0ZSBzZXF1ZW5jZS5cbiAgLyoqIEB0eXBlIHtVaW50OEFycmF5W119ICovXG4gIGNvbnN0IGJ5dGVzID0gW11cblxuICAvLyA4LiBMZXQgY2h1bmtQcm9taXNlIGJlIHRoZSByZXN1bHQgb2YgcmVhZGluZyBhIGNodW5rIGZyb21cbiAgLy8gICAgc3RyZWFtIHdpdGggcmVhZGVyLlxuICBsZXQgY2h1bmtQcm9taXNlID0gcmVhZGVyLnJlYWQoKVxuXG4gIC8vIDkuIExldCBpc0ZpcnN0Q2h1bmsgYmUgdHJ1ZS5cbiAgbGV0IGlzRmlyc3RDaHVuayA9IHRydWVcblxuICAvLyAxMC4gSW4gcGFyYWxsZWwsIHdoaWxlIHRydWU6XG4gIC8vIE5vdGU6IFwiSW4gcGFyYWxsZWxcIiBqdXN0IG1lYW5zIG5vbi1ibG9ja2luZ1xuICAvLyBOb3RlIDI6IHJlYWRPcGVyYXRpb24gaXRzZWxmIGNhbm5vdCBiZSBhc3luYyBhcyBkb3VibGVcbiAgLy8gcmVhZGluZyB0aGUgYm9keSB3b3VsZCB0aGVuIHJlamVjdCB0aGUgcHJvbWlzZSwgaW5zdGVhZFxuICAvLyBvZiB0aHJvd2luZyBhbiBlcnJvci5cbiAgOyhhc3luYyAoKSA9PiB7XG4gICAgd2hpbGUgKCFmcltrQWJvcnRlZF0pIHtcbiAgICAgIC8vIDEuIFdhaXQgZm9yIGNodW5rUHJvbWlzZSB0byBiZSBmdWxmaWxsZWQgb3IgcmVqZWN0ZWQuXG4gICAgICB0cnkge1xuICAgICAgICBjb25zdCB7IGRvbmUsIHZhbHVlIH0gPSBhd2FpdCBjaHVua1Byb21pc2VcblxuICAgICAgICAvLyAyLiBJZiBjaHVua1Byb21pc2UgaXMgZnVsZmlsbGVkLCBhbmQgaXNGaXJzdENodW5rIGlzXG4gICAgICAgIC8vICAgIHRydWUsIHF1ZXVlIGEgdGFzayB0byBmaXJlIGEgcHJvZ3Jlc3MgZXZlbnQgY2FsbGVkXG4gICAgICAgIC8vICAgIGxvYWRzdGFydCBhdCBmci5cbiAgICAgICAgaWYgKGlzRmlyc3RDaHVuayAmJiAhZnJba0Fib3J0ZWRdKSB7XG4gICAgICAgICAgcXVldWVNaWNyb3Rhc2soKCkgPT4ge1xuICAgICAgICAgICAgZmlyZUFQcm9ncmVzc0V2ZW50KCdsb2Fkc3RhcnQnLCBmcilcbiAgICAgICAgICB9KVxuICAgICAgICB9XG5cbiAgICAgICAgLy8gMy4gU2V0IGlzRmlyc3RDaHVuayB0byBmYWxzZS5cbiAgICAgICAgaXNGaXJzdENodW5rID0gZmFsc2VcblxuICAgICAgICAvLyA0LiBJZiBjaHVua1Byb21pc2UgaXMgZnVsZmlsbGVkIHdpdGggYW4gb2JqZWN0IHdob3NlXG4gICAgICAgIC8vICAgIGRvbmUgcHJvcGVydHkgaXMgZmFsc2UgYW5kIHdob3NlIHZhbHVlIHByb3BlcnR5IGlzXG4gICAgICAgIC8vICAgIGEgVWludDhBcnJheSBvYmplY3QsIHJ1biB0aGVzZSBzdGVwczpcbiAgICAgICAgaWYgKCFkb25lICYmIHR5cGVzLmlzVWludDhBcnJheSh2YWx1ZSkpIHtcbiAgICAgICAgICAvLyAxLiBMZXQgYnMgYmUgdGhlIGJ5dGUgc2VxdWVuY2UgcmVwcmVzZW50ZWQgYnkgdGhlXG4gICAgICAgICAgLy8gICAgVWludDhBcnJheSBvYmplY3QuXG5cbiAgICAgICAgICAvLyAyLiBBcHBlbmQgYnMgdG8gYnl0ZXMuXG4gICAgICAgICAgYnl0ZXMucHVzaCh2YWx1ZSlcblxuICAgICAgICAgIC8vIDMuIElmIHJvdWdobHkgNTBtcyBoYXZlIHBhc3NlZCBzaW5jZSB0aGVzZSBzdGVwc1xuICAgICAgICAgIC8vICAgIHdlcmUgbGFzdCBpbnZva2VkLCBxdWV1ZSBhIHRhc2sgdG8gZmlyZSBhXG4gICAgICAgICAgLy8gICAgcHJvZ3Jlc3MgZXZlbnQgY2FsbGVkIHByb2dyZXNzIGF0IGZyLlxuICAgICAgICAgIGlmIChcbiAgICAgICAgICAgIChcbiAgICAgICAgICAgICAgZnJba0xhc3RQcm9ncmVzc0V2ZW50RmlyZWRdID09PSB1bmRlZmluZWQgfHxcbiAgICAgICAgICAgICAgRGF0ZS5ub3coKSAtIGZyW2tMYXN0UHJvZ3Jlc3NFdmVudEZpcmVkXSA+PSA1MFxuICAgICAgICAgICAgKSAmJlxuICAgICAgICAgICAgIWZyW2tBYm9ydGVkXVxuICAgICAgICAgICkge1xuICAgICAgICAgICAgZnJba0xhc3RQcm9ncmVzc0V2ZW50RmlyZWRdID0gRGF0ZS5ub3coKVxuICAgICAgICAgICAgcXVldWVNaWNyb3Rhc2soKCkgPT4ge1xuICAgICAgICAgICAgICBmaXJlQVByb2dyZXNzRXZlbnQoJ3Byb2dyZXNzJywgZnIpXG4gICAgICAgICAgICB9KVxuICAgICAgICAgIH1cblxuICAgICAgICAgIC8vIDQuIFNldCBjaHVua1Byb21pc2UgdG8gdGhlIHJlc3VsdCBvZiByZWFkaW5nIGFcbiAgICAgICAgICAvLyAgICBjaHVuayBmcm9tIHN0cmVhbSB3aXRoIHJlYWRlci5cbiAgICAgICAgICBjaHVua1Byb21pc2UgPSByZWFkZXIucmVhZCgpXG4gICAgICAgIH0gZWxzZSBpZiAoZG9uZSkge1xuICAgICAgICAgIC8vIDUuIE90aGVyd2lzZSwgaWYgY2h1bmtQcm9taXNlIGlzIGZ1bGZpbGxlZCB3aXRoIGFuXG4gICAgICAgICAgLy8gICAgb2JqZWN0IHdob3NlIGRvbmUgcHJvcGVydHkgaXMgdHJ1ZSwgcXVldWUgYSB0YXNrXG4gICAgICAgICAgLy8gICAgdG8gcnVuIHRoZSBmb2xsb3dpbmcgc3RlcHMgYW5kIGFib3J0IHRoaXMgYWxnb3JpdGhtOlxuICAgICAgICAgIHF1ZXVlTWljcm90YXNrKCgpID0+IHtcbiAgICAgICAgICAgIC8vIDEuIFNldCBmcuKAmXMgc3RhdGUgdG8gXCJkb25lXCIuXG4gICAgICAgICAgICBmcltrU3RhdGVdID0gJ2RvbmUnXG5cbiAgICAgICAgICAgIC8vIDIuIExldCByZXN1bHQgYmUgdGhlIHJlc3VsdCBvZiBwYWNrYWdlIGRhdGEgZ2l2ZW5cbiAgICAgICAgICAgIC8vICAgIGJ5dGVzLCB0eXBlLCBibG9i4oCZcyB0eXBlLCBhbmQgZW5jb2RpbmdOYW1lLlxuICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgY29uc3QgcmVzdWx0ID0gcGFja2FnZURhdGEoYnl0ZXMsIHR5cGUsIGJsb2IudHlwZSwgZW5jb2RpbmdOYW1lKVxuXG4gICAgICAgICAgICAgIC8vIDQuIEVsc2U6XG5cbiAgICAgICAgICAgICAgaWYgKGZyW2tBYm9ydGVkXSkge1xuICAgICAgICAgICAgICAgIHJldHVyblxuICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgLy8gMS4gU2V0IGZy4oCZcyByZXN1bHQgdG8gcmVzdWx0LlxuICAgICAgICAgICAgICBmcltrUmVzdWx0XSA9IHJlc3VsdFxuXG4gICAgICAgICAgICAgIC8vIDIuIEZpcmUgYSBwcm9ncmVzcyBldmVudCBjYWxsZWQgbG9hZCBhdCB0aGUgZnIuXG4gICAgICAgICAgICAgIGZpcmVBUHJvZ3Jlc3NFdmVudCgnbG9hZCcsIGZyKVxuICAgICAgICAgICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgICAgICAgLy8gMy4gSWYgcGFja2FnZSBkYXRhIHRocmV3IGFuIGV4Y2VwdGlvbiBlcnJvcjpcblxuICAgICAgICAgICAgICAvLyAxLiBTZXQgZnLigJlzIGVycm9yIHRvIGVycm9yLlxuICAgICAgICAgICAgICBmcltrRXJyb3JdID0gZXJyb3JcblxuICAgICAgICAgICAgICAvLyAyLiBGaXJlIGEgcHJvZ3Jlc3MgZXZlbnQgY2FsbGVkIGVycm9yIGF0IGZyLlxuICAgICAgICAgICAgICBmaXJlQVByb2dyZXNzRXZlbnQoJ2Vycm9yJywgZnIpXG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIC8vIDUuIElmIGZy4oCZcyBzdGF0ZSBpcyBub3QgXCJsb2FkaW5nXCIsIGZpcmUgYSBwcm9ncmVzc1xuICAgICAgICAgICAgLy8gICAgZXZlbnQgY2FsbGVkIGxvYWRlbmQgYXQgdGhlIGZyLlxuICAgICAgICAgICAgaWYgKGZyW2tTdGF0ZV0gIT09ICdsb2FkaW5nJykge1xuICAgICAgICAgICAgICBmaXJlQVByb2dyZXNzRXZlbnQoJ2xvYWRlbmQnLCBmcilcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9KVxuXG4gICAgICAgICAgYnJlYWtcbiAgICAgICAgfVxuICAgICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgaWYgKGZyW2tBYm9ydGVkXSkge1xuICAgICAgICAgIHJldHVyblxuICAgICAgICB9XG5cbiAgICAgICAgLy8gNi4gT3RoZXJ3aXNlLCBpZiBjaHVua1Byb21pc2UgaXMgcmVqZWN0ZWQgd2l0aCBhblxuICAgICAgICAvLyAgICBlcnJvciBlcnJvciwgcXVldWUgYSB0YXNrIHRvIHJ1biB0aGUgZm9sbG93aW5nXG4gICAgICAgIC8vICAgIHN0ZXBzIGFuZCBhYm9ydCB0aGlzIGFsZ29yaXRobTpcbiAgICAgICAgcXVldWVNaWNyb3Rhc2soKCkgPT4ge1xuICAgICAgICAgIC8vIDEuIFNldCBmcuKAmXMgc3RhdGUgdG8gXCJkb25lXCIuXG4gICAgICAgICAgZnJba1N0YXRlXSA9ICdkb25lJ1xuXG4gICAgICAgICAgLy8gMi4gU2V0IGZy4oCZcyBlcnJvciB0byBlcnJvci5cbiAgICAgICAgICBmcltrRXJyb3JdID0gZXJyb3JcblxuICAgICAgICAgIC8vIDMuIEZpcmUgYSBwcm9ncmVzcyBldmVudCBjYWxsZWQgZXJyb3IgYXQgZnIuXG4gICAgICAgICAgZmlyZUFQcm9ncmVzc0V2ZW50KCdlcnJvcicsIGZyKVxuXG4gICAgICAgICAgLy8gNC4gSWYgZnLigJlzIHN0YXRlIGlzIG5vdCBcImxvYWRpbmdcIiwgZmlyZSBhIHByb2dyZXNzXG4gICAgICAgICAgLy8gICAgZXZlbnQgY2FsbGVkIGxvYWRlbmQgYXQgZnIuXG4gICAgICAgICAgaWYgKGZyW2tTdGF0ZV0gIT09ICdsb2FkaW5nJykge1xuICAgICAgICAgICAgZmlyZUFQcm9ncmVzc0V2ZW50KCdsb2FkZW5kJywgZnIpXG4gICAgICAgICAgfVxuICAgICAgICB9KVxuXG4gICAgICAgIGJyZWFrXG4gICAgICB9XG4gICAgfVxuICB9KSgpXG59XG5cbi8qKlxuICogQHNlZSBodHRwczovL3czYy5naXRodWIuaW8vRmlsZUFQSS8jZmlyZS1hLXByb2dyZXNzLWV2ZW50XG4gKiBAc2VlIGh0dHBzOi8vZG9tLnNwZWMud2hhdHdnLm9yZy8jY29uY2VwdC1ldmVudC1maXJlXG4gKiBAcGFyYW0ge3N0cmluZ30gZSBUaGUgbmFtZSBvZiB0aGUgZXZlbnRcbiAqIEBwYXJhbSB7aW1wb3J0KCcuL2ZpbGVyZWFkZXInKS5GaWxlUmVhZGVyfSByZWFkZXJcbiAqL1xuZnVuY3Rpb24gZmlyZUFQcm9ncmVzc0V2ZW50IChlLCByZWFkZXIpIHtcbiAgLy8gVGhlIHByb2dyZXNzIGV2ZW50IGUgZG9lcyBub3QgYnViYmxlLiBlLmJ1YmJsZXMgbXVzdCBiZSBmYWxzZVxuICAvLyBUaGUgcHJvZ3Jlc3MgZXZlbnQgZSBpcyBOT1QgY2FuY2VsYWJsZS4gZS5jYW5jZWxhYmxlIG11c3QgYmUgZmFsc2VcbiAgY29uc3QgZXZlbnQgPSBuZXcgUHJvZ3Jlc3NFdmVudChlLCB7XG4gICAgYnViYmxlczogZmFsc2UsXG4gICAgY2FuY2VsYWJsZTogZmFsc2VcbiAgfSlcblxuICByZWFkZXIuZGlzcGF0Y2hFdmVudChldmVudClcbn1cblxuLyoqXG4gKiBAc2VlIGh0dHBzOi8vdzNjLmdpdGh1Yi5pby9GaWxlQVBJLyNibG9iLXBhY2thZ2UtZGF0YVxuICogQHBhcmFtIHtVaW50OEFycmF5W119IGJ5dGVzXG4gKiBAcGFyYW0ge3N0cmluZ30gdHlwZVxuICogQHBhcmFtIHtzdHJpbmc/fSBtaW1lVHlwZVxuICogQHBhcmFtIHtzdHJpbmc/fSBlbmNvZGluZ05hbWVcbiAqL1xuZnVuY3Rpb24gcGFja2FnZURhdGEgKGJ5dGVzLCB0eXBlLCBtaW1lVHlwZSwgZW5jb2RpbmdOYW1lKSB7XG4gIC8vIDEuIEEgQmxvYiBoYXMgYW4gYXNzb2NpYXRlZCBwYWNrYWdlIGRhdGEgYWxnb3JpdGhtLCBnaXZlblxuICAvLyAgICBieXRlcywgYSB0eXBlLCBhIG9wdGlvbmFsIG1pbWVUeXBlLCBhbmQgYSBvcHRpb25hbFxuICAvLyAgICBlbmNvZGluZ05hbWUsIHdoaWNoIHN3aXRjaGVzIG9uIHR5cGUgYW5kIHJ1bnMgdGhlXG4gIC8vICAgIGFzc29jaWF0ZWQgc3RlcHM6XG5cbiAgc3dpdGNoICh0eXBlKSB7XG4gICAgY2FzZSAnRGF0YVVSTCc6IHtcbiAgICAgIC8vIDEuIFJldHVybiBieXRlcyBhcyBhIERhdGFVUkwgW1JGQzIzOTddIHN1YmplY3QgdG9cbiAgICAgIC8vICAgIHRoZSBjb25zaWRlcmF0aW9ucyBiZWxvdzpcbiAgICAgIC8vICAqIFVzZSBtaW1lVHlwZSBhcyBwYXJ0IG9mIHRoZSBEYXRhIFVSTCBpZiBpdCBpc1xuICAgICAgLy8gICAgYXZhaWxhYmxlIGluIGtlZXBpbmcgd2l0aCB0aGUgRGF0YSBVUkxcbiAgICAgIC8vICAgIHNwZWNpZmljYXRpb24gW1JGQzIzOTddLlxuICAgICAgLy8gICogSWYgbWltZVR5cGUgaXMgbm90IGF2YWlsYWJsZSByZXR1cm4gYSBEYXRhIFVSTFxuICAgICAgLy8gICAgd2l0aG91dCBhIG1lZGlhLXR5cGUuIFtSRkMyMzk3XS5cblxuICAgICAgLy8gaHR0cHM6Ly9kYXRhdHJhY2tlci5pZXRmLm9yZy9kb2MvaHRtbC9yZmMyMzk3I3NlY3Rpb24tM1xuICAgICAgLy8gZGF0YXVybCAgICA6PSBcImRhdGE6XCIgWyBtZWRpYXR5cGUgXSBbIFwiO2Jhc2U2NFwiIF0gXCIsXCIgZGF0YVxuICAgICAgLy8gbWVkaWF0eXBlICA6PSBbIHR5cGUgXCIvXCIgc3VidHlwZSBdICooIFwiO1wiIHBhcmFtZXRlciApXG4gICAgICAvLyBkYXRhICAgICAgIDo9ICp1cmxjaGFyXG4gICAgICAvLyBwYXJhbWV0ZXIgIDo9IGF0dHJpYnV0ZSBcIj1cIiB2YWx1ZVxuICAgICAgbGV0IGRhdGFVUkwgPSAnZGF0YTonXG5cbiAgICAgIGNvbnN0IHBhcnNlZCA9IHBhcnNlTUlNRVR5cGUobWltZVR5cGUgfHwgJ2FwcGxpY2F0aW9uL29jdGV0LXN0cmVhbScpXG5cbiAgICAgIGlmIChwYXJzZWQgIT09ICdmYWlsdXJlJykge1xuICAgICAgICBkYXRhVVJMICs9IHNlcmlhbGl6ZUFNaW1lVHlwZShwYXJzZWQpXG4gICAgICB9XG5cbiAgICAgIGRhdGFVUkwgKz0gJztiYXNlNjQsJ1xuXG4gICAgICBjb25zdCBkZWNvZGVyID0gbmV3IFN0cmluZ0RlY29kZXIoJ2xhdGluMScpXG5cbiAgICAgIGZvciAoY29uc3QgY2h1bmsgb2YgYnl0ZXMpIHtcbiAgICAgICAgZGF0YVVSTCArPSBidG9hKGRlY29kZXIud3JpdGUoY2h1bmspKVxuICAgICAgfVxuXG4gICAgICBkYXRhVVJMICs9IGJ0b2EoZGVjb2Rlci5lbmQoKSlcblxuICAgICAgcmV0dXJuIGRhdGFVUkxcbiAgICB9XG4gICAgY2FzZSAnVGV4dCc6IHtcbiAgICAgIC8vIDEuIExldCBlbmNvZGluZyBiZSBmYWlsdXJlXG4gICAgICBsZXQgZW5jb2RpbmcgPSAnZmFpbHVyZSdcblxuICAgICAgLy8gMi4gSWYgdGhlIGVuY29kaW5nTmFtZSBpcyBwcmVzZW50LCBzZXQgZW5jb2RpbmcgdG8gdGhlXG4gICAgICAvLyAgICByZXN1bHQgb2YgZ2V0dGluZyBhbiBlbmNvZGluZyBmcm9tIGVuY29kaW5nTmFtZS5cbiAgICAgIGlmIChlbmNvZGluZ05hbWUpIHtcbiAgICAgICAgZW5jb2RpbmcgPSBnZXRFbmNvZGluZyhlbmNvZGluZ05hbWUpXG4gICAgICB9XG5cbiAgICAgIC8vIDMuIElmIGVuY29kaW5nIGlzIGZhaWx1cmUsIGFuZCBtaW1lVHlwZSBpcyBwcmVzZW50OlxuICAgICAgaWYgKGVuY29kaW5nID09PSAnZmFpbHVyZScgJiYgbWltZVR5cGUpIHtcbiAgICAgICAgLy8gMS4gTGV0IHR5cGUgYmUgdGhlIHJlc3VsdCBvZiBwYXJzZSBhIE1JTUUgdHlwZVxuICAgICAgICAvLyAgICBnaXZlbiBtaW1lVHlwZS5cbiAgICAgICAgY29uc3QgdHlwZSA9IHBhcnNlTUlNRVR5cGUobWltZVR5cGUpXG5cbiAgICAgICAgLy8gMi4gSWYgdHlwZSBpcyBub3QgZmFpbHVyZSwgc2V0IGVuY29kaW5nIHRvIHRoZSByZXN1bHRcbiAgICAgICAgLy8gICAgb2YgZ2V0dGluZyBhbiBlbmNvZGluZyBmcm9tIHR5cGXigJlzIHBhcmFtZXRlcnNbXCJjaGFyc2V0XCJdLlxuICAgICAgICBpZiAodHlwZSAhPT0gJ2ZhaWx1cmUnKSB7XG4gICAgICAgICAgZW5jb2RpbmcgPSBnZXRFbmNvZGluZyh0eXBlLnBhcmFtZXRlcnMuZ2V0KCdjaGFyc2V0JykpXG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgLy8gNC4gSWYgZW5jb2RpbmcgaXMgZmFpbHVyZSwgdGhlbiBzZXQgZW5jb2RpbmcgdG8gVVRGLTguXG4gICAgICBpZiAoZW5jb2RpbmcgPT09ICdmYWlsdXJlJykge1xuICAgICAgICBlbmNvZGluZyA9ICdVVEYtOCdcbiAgICAgIH1cblxuICAgICAgLy8gNS4gRGVjb2RlIGJ5dGVzIHVzaW5nIGZhbGxiYWNrIGVuY29kaW5nIGVuY29kaW5nLCBhbmRcbiAgICAgIC8vICAgIHJldHVybiB0aGUgcmVzdWx0LlxuICAgICAgcmV0dXJuIGRlY29kZShieXRlcywgZW5jb2RpbmcpXG4gICAgfVxuICAgIGNhc2UgJ0FycmF5QnVmZmVyJzoge1xuICAgICAgLy8gUmV0dXJuIGEgbmV3IEFycmF5QnVmZmVyIHdob3NlIGNvbnRlbnRzIGFyZSBieXRlcy5cbiAgICAgIGNvbnN0IHNlcXVlbmNlID0gY29tYmluZUJ5dGVTZXF1ZW5jZXMoYnl0ZXMpXG5cbiAgICAgIHJldHVybiBzZXF1ZW5jZS5idWZmZXJcbiAgICB9XG4gICAgY2FzZSAnQmluYXJ5U3RyaW5nJzoge1xuICAgICAgLy8gUmV0dXJuIGJ5dGVzIGFzIGEgYmluYXJ5IHN0cmluZywgaW4gd2hpY2ggZXZlcnkgYnl0ZVxuICAgICAgLy8gIGlzIHJlcHJlc2VudGVkIGJ5IGEgY29kZSB1bml0IG9mIGVxdWFsIHZhbHVlIFswLi4yNTVdLlxuICAgICAgbGV0IGJpbmFyeVN0cmluZyA9ICcnXG5cbiAgICAgIGNvbnN0IGRlY29kZXIgPSBuZXcgU3RyaW5nRGVjb2RlcignbGF0aW4xJylcblxuICAgICAgZm9yIChjb25zdCBjaHVuayBvZiBieXRlcykge1xuICAgICAgICBiaW5hcnlTdHJpbmcgKz0gZGVjb2Rlci53cml0ZShjaHVuaylcbiAgICAgIH1cblxuICAgICAgYmluYXJ5U3RyaW5nICs9IGRlY29kZXIuZW5kKClcblxuICAgICAgcmV0dXJuIGJpbmFyeVN0cmluZ1xuICAgIH1cbiAgfVxufVxuXG4vKipcbiAqIEBzZWUgaHR0cHM6Ly9lbmNvZGluZy5zcGVjLndoYXR3Zy5vcmcvI2RlY29kZVxuICogQHBhcmFtIHtVaW50OEFycmF5W119IGlvUXVldWVcbiAqIEBwYXJhbSB7c3RyaW5nfSBlbmNvZGluZ1xuICovXG5mdW5jdGlvbiBkZWNvZGUgKGlvUXVldWUsIGVuY29kaW5nKSB7XG4gIGNvbnN0IGJ5dGVzID0gY29tYmluZUJ5dGVTZXF1ZW5jZXMoaW9RdWV1ZSlcblxuICAvLyAxLiBMZXQgQk9NRW5jb2RpbmcgYmUgdGhlIHJlc3VsdCBvZiBCT00gc25pZmZpbmcgaW9RdWV1ZS5cbiAgY29uc3QgQk9NRW5jb2RpbmcgPSBCT01TbmlmZmluZyhieXRlcylcblxuICBsZXQgc2xpY2UgPSAwXG5cbiAgLy8gMi4gSWYgQk9NRW5jb2RpbmcgaXMgbm9uLW51bGw6XG4gIGlmIChCT01FbmNvZGluZyAhPT0gbnVsbCkge1xuICAgIC8vIDEuIFNldCBlbmNvZGluZyB0byBCT01FbmNvZGluZy5cbiAgICBlbmNvZGluZyA9IEJPTUVuY29kaW5nXG5cbiAgICAvLyAyLiBSZWFkIHRocmVlIGJ5dGVzIGZyb20gaW9RdWV1ZSwgaWYgQk9NRW5jb2RpbmcgaXNcbiAgICAvLyAgICBVVEYtODsgb3RoZXJ3aXNlIHJlYWQgdHdvIGJ5dGVzLlxuICAgIC8vICAgIChEbyBub3RoaW5nIHdpdGggdGhvc2UgYnl0ZXMuKVxuICAgIHNsaWNlID0gQk9NRW5jb2RpbmcgPT09ICdVVEYtOCcgPyAzIDogMlxuICB9XG5cbiAgLy8gMy4gUHJvY2VzcyBhIHF1ZXVlIHdpdGggYW4gaW5zdGFuY2Ugb2YgZW5jb2RpbmfigJlzXG4gIC8vICAgIGRlY29kZXIsIGlvUXVldWUsIG91dHB1dCwgYW5kIFwicmVwbGFjZW1lbnRcIi5cblxuICAvLyA0LiBSZXR1cm4gb3V0cHV0LlxuXG4gIGNvbnN0IHNsaWNlZCA9IGJ5dGVzLnNsaWNlKHNsaWNlKVxuICByZXR1cm4gbmV3IFRleHREZWNvZGVyKGVuY29kaW5nKS5kZWNvZGUoc2xpY2VkKVxufVxuXG4vKipcbiAqIEBzZWUgaHR0cHM6Ly9lbmNvZGluZy5zcGVjLndoYXR3Zy5vcmcvI2JvbS1zbmlmZlxuICogQHBhcmFtIHtVaW50OEFycmF5fSBpb1F1ZXVlXG4gKi9cbmZ1bmN0aW9uIEJPTVNuaWZmaW5nIChpb1F1ZXVlKSB7XG4gIC8vIDEuIExldCBCT00gYmUgdGhlIHJlc3VsdCBvZiBwZWVraW5nIDMgYnl0ZXMgZnJvbSBpb1F1ZXVlLFxuICAvLyAgICBjb252ZXJ0ZWQgdG8gYSBieXRlIHNlcXVlbmNlLlxuICBjb25zdCBbYSwgYiwgY10gPSBpb1F1ZXVlXG5cbiAgLy8gMi4gRm9yIGVhY2ggb2YgdGhlIHJvd3MgaW4gdGhlIHRhYmxlIGJlbG93LCBzdGFydGluZyB3aXRoXG4gIC8vICAgIHRoZSBmaXJzdCBvbmUgYW5kIGdvaW5nIGRvd24sIGlmIEJPTSBzdGFydHMgd2l0aCB0aGVcbiAgLy8gICAgYnl0ZXMgZ2l2ZW4gaW4gdGhlIGZpcnN0IGNvbHVtbiwgdGhlbiByZXR1cm4gdGhlXG4gIC8vICAgIGVuY29kaW5nIGdpdmVuIGluIHRoZSBjZWxsIGluIHRoZSBzZWNvbmQgY29sdW1uIG9mIHRoYXRcbiAgLy8gICAgcm93LiBPdGhlcndpc2UsIHJldHVybiBudWxsLlxuICBpZiAoYSA9PT0gMHhFRiAmJiBiID09PSAweEJCICYmIGMgPT09IDB4QkYpIHtcbiAgICByZXR1cm4gJ1VURi04J1xuICB9IGVsc2UgaWYgKGEgPT09IDB4RkUgJiYgYiA9PT0gMHhGRikge1xuICAgIHJldHVybiAnVVRGLTE2QkUnXG4gIH0gZWxzZSBpZiAoYSA9PT0gMHhGRiAmJiBiID09PSAweEZFKSB7XG4gICAgcmV0dXJuICdVVEYtMTZMRSdcbiAgfVxuXG4gIHJldHVybiBudWxsXG59XG5cbi8qKlxuICogQHBhcmFtIHtVaW50OEFycmF5W119IHNlcXVlbmNlc1xuICovXG5mdW5jdGlvbiBjb21iaW5lQnl0ZVNlcXVlbmNlcyAoc2VxdWVuY2VzKSB7XG4gIGNvbnN0IHNpemUgPSBzZXF1ZW5jZXMucmVkdWNlKChhLCBiKSA9PiB7XG4gICAgcmV0dXJuIGEgKyBiLmJ5dGVMZW5ndGhcbiAgfSwgMClcblxuICBsZXQgb2Zmc2V0ID0gMFxuXG4gIHJldHVybiBzZXF1ZW5jZXMucmVkdWNlKChhLCBiKSA9PiB7XG4gICAgYS5zZXQoYiwgb2Zmc2V0KVxuICAgIG9mZnNldCArPSBiLmJ5dGVMZW5ndGhcbiAgICByZXR1cm4gYVxuICB9LCBuZXcgVWludDhBcnJheShzaXplKSlcbn1cblxubW9kdWxlLmV4cG9ydHMgPSB7XG4gIHN0YXRpY1Byb3BlcnR5RGVzY3JpcHRvcnMsXG4gIHJlYWRPcGVyYXRpb24sXG4gIGZpcmVBUHJvZ3Jlc3NFdmVudFxufVxuIiwKICAgICIndXNlIHN0cmljdCdcblxuY29uc3Qge1xuICBzdGF0aWNQcm9wZXJ0eURlc2NyaXB0b3JzLFxuICByZWFkT3BlcmF0aW9uLFxuICBmaXJlQVByb2dyZXNzRXZlbnRcbn0gPSByZXF1aXJlKCcuL3V0aWwnKVxuY29uc3Qge1xuICBrU3RhdGUsXG4gIGtFcnJvcixcbiAga1Jlc3VsdCxcbiAga0V2ZW50cyxcbiAga0Fib3J0ZWRcbn0gPSByZXF1aXJlKCcuL3N5bWJvbHMnKVxuY29uc3QgeyB3ZWJpZGwgfSA9IHJlcXVpcmUoJy4uL2ZldGNoL3dlYmlkbCcpXG5jb25zdCB7IGtFbnVtZXJhYmxlUHJvcGVydHkgfSA9IHJlcXVpcmUoJy4uL2NvcmUvdXRpbCcpXG5cbmNsYXNzIEZpbGVSZWFkZXIgZXh0ZW5kcyBFdmVudFRhcmdldCB7XG4gIGNvbnN0cnVjdG9yICgpIHtcbiAgICBzdXBlcigpXG5cbiAgICB0aGlzW2tTdGF0ZV0gPSAnZW1wdHknXG4gICAgdGhpc1trUmVzdWx0XSA9IG51bGxcbiAgICB0aGlzW2tFcnJvcl0gPSBudWxsXG4gICAgdGhpc1trRXZlbnRzXSA9IHtcbiAgICAgIGxvYWRlbmQ6IG51bGwsXG4gICAgICBlcnJvcjogbnVsbCxcbiAgICAgIGFib3J0OiBudWxsLFxuICAgICAgbG9hZDogbnVsbCxcbiAgICAgIHByb2dyZXNzOiBudWxsLFxuICAgICAgbG9hZHN0YXJ0OiBudWxsXG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIEBzZWUgaHR0cHM6Ly93M2MuZ2l0aHViLmlvL0ZpbGVBUEkvI2Rmbi1yZWFkQXNBcnJheUJ1ZmZlclxuICAgKiBAcGFyYW0ge2ltcG9ydCgnYnVmZmVyJykuQmxvYn0gYmxvYlxuICAgKi9cbiAgcmVhZEFzQXJyYXlCdWZmZXIgKGJsb2IpIHtcbiAgICB3ZWJpZGwuYnJhbmRDaGVjayh0aGlzLCBGaWxlUmVhZGVyKVxuXG4gICAgd2ViaWRsLmFyZ3VtZW50TGVuZ3RoQ2hlY2soYXJndW1lbnRzLCAxLCB7IGhlYWRlcjogJ0ZpbGVSZWFkZXIucmVhZEFzQXJyYXlCdWZmZXInIH0pXG5cbiAgICBibG9iID0gd2ViaWRsLmNvbnZlcnRlcnMuQmxvYihibG9iLCB7IHN0cmljdDogZmFsc2UgfSlcblxuICAgIC8vIFRoZSByZWFkQXNBcnJheUJ1ZmZlcihibG9iKSBtZXRob2QsIHdoZW4gaW52b2tlZCxcbiAgICAvLyBtdXN0IGluaXRpYXRlIGEgcmVhZCBvcGVyYXRpb24gZm9yIGJsb2Igd2l0aCBBcnJheUJ1ZmZlci5cbiAgICByZWFkT3BlcmF0aW9uKHRoaXMsIGJsb2IsICdBcnJheUJ1ZmZlcicpXG4gIH1cblxuICAvKipcbiAgICogQHNlZSBodHRwczovL3czYy5naXRodWIuaW8vRmlsZUFQSS8jcmVhZEFzQmluYXJ5U3RyaW5nXG4gICAqIEBwYXJhbSB7aW1wb3J0KCdidWZmZXInKS5CbG9ifSBibG9iXG4gICAqL1xuICByZWFkQXNCaW5hcnlTdHJpbmcgKGJsb2IpIHtcbiAgICB3ZWJpZGwuYnJhbmRDaGVjayh0aGlzLCBGaWxlUmVhZGVyKVxuXG4gICAgd2ViaWRsLmFyZ3VtZW50TGVuZ3RoQ2hlY2soYXJndW1lbnRzLCAxLCB7IGhlYWRlcjogJ0ZpbGVSZWFkZXIucmVhZEFzQmluYXJ5U3RyaW5nJyB9KVxuXG4gICAgYmxvYiA9IHdlYmlkbC5jb252ZXJ0ZXJzLkJsb2IoYmxvYiwgeyBzdHJpY3Q6IGZhbHNlIH0pXG5cbiAgICAvLyBUaGUgcmVhZEFzQmluYXJ5U3RyaW5nKGJsb2IpIG1ldGhvZCwgd2hlbiBpbnZva2VkLFxuICAgIC8vIG11c3QgaW5pdGlhdGUgYSByZWFkIG9wZXJhdGlvbiBmb3IgYmxvYiB3aXRoIEJpbmFyeVN0cmluZy5cbiAgICByZWFkT3BlcmF0aW9uKHRoaXMsIGJsb2IsICdCaW5hcnlTdHJpbmcnKVxuICB9XG5cbiAgLyoqXG4gICAqIEBzZWUgaHR0cHM6Ly93M2MuZ2l0aHViLmlvL0ZpbGVBUEkvI3JlYWRBc0RhdGFUZXh0XG4gICAqIEBwYXJhbSB7aW1wb3J0KCdidWZmZXInKS5CbG9ifSBibG9iXG4gICAqIEBwYXJhbSB7c3RyaW5nP30gZW5jb2RpbmdcbiAgICovXG4gIHJlYWRBc1RleHQgKGJsb2IsIGVuY29kaW5nID0gdW5kZWZpbmVkKSB7XG4gICAgd2ViaWRsLmJyYW5kQ2hlY2sodGhpcywgRmlsZVJlYWRlcilcblxuICAgIHdlYmlkbC5hcmd1bWVudExlbmd0aENoZWNrKGFyZ3VtZW50cywgMSwgeyBoZWFkZXI6ICdGaWxlUmVhZGVyLnJlYWRBc1RleHQnIH0pXG5cbiAgICBibG9iID0gd2ViaWRsLmNvbnZlcnRlcnMuQmxvYihibG9iLCB7IHN0cmljdDogZmFsc2UgfSlcblxuICAgIGlmIChlbmNvZGluZyAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICBlbmNvZGluZyA9IHdlYmlkbC5jb252ZXJ0ZXJzLkRPTVN0cmluZyhlbmNvZGluZylcbiAgICB9XG5cbiAgICAvLyBUaGUgcmVhZEFzVGV4dChibG9iLCBlbmNvZGluZykgbWV0aG9kLCB3aGVuIGludm9rZWQsXG4gICAgLy8gbXVzdCBpbml0aWF0ZSBhIHJlYWQgb3BlcmF0aW9uIGZvciBibG9iIHdpdGggVGV4dCBhbmQgZW5jb2RpbmcuXG4gICAgcmVhZE9wZXJhdGlvbih0aGlzLCBibG9iLCAnVGV4dCcsIGVuY29kaW5nKVxuICB9XG5cbiAgLyoqXG4gICAqIEBzZWUgaHR0cHM6Ly93M2MuZ2l0aHViLmlvL0ZpbGVBUEkvI2Rmbi1yZWFkQXNEYXRhVVJMXG4gICAqIEBwYXJhbSB7aW1wb3J0KCdidWZmZXInKS5CbG9ifSBibG9iXG4gICAqL1xuICByZWFkQXNEYXRhVVJMIChibG9iKSB7XG4gICAgd2ViaWRsLmJyYW5kQ2hlY2sodGhpcywgRmlsZVJlYWRlcilcblxuICAgIHdlYmlkbC5hcmd1bWVudExlbmd0aENoZWNrKGFyZ3VtZW50cywgMSwgeyBoZWFkZXI6ICdGaWxlUmVhZGVyLnJlYWRBc0RhdGFVUkwnIH0pXG5cbiAgICBibG9iID0gd2ViaWRsLmNvbnZlcnRlcnMuQmxvYihibG9iLCB7IHN0cmljdDogZmFsc2UgfSlcblxuICAgIC8vIFRoZSByZWFkQXNEYXRhVVJMKGJsb2IpIG1ldGhvZCwgd2hlbiBpbnZva2VkLCBtdXN0XG4gICAgLy8gaW5pdGlhdGUgYSByZWFkIG9wZXJhdGlvbiBmb3IgYmxvYiB3aXRoIERhdGFVUkwuXG4gICAgcmVhZE9wZXJhdGlvbih0aGlzLCBibG9iLCAnRGF0YVVSTCcpXG4gIH1cblxuICAvKipcbiAgICogQHNlZSBodHRwczovL3czYy5naXRodWIuaW8vRmlsZUFQSS8jZGZuLWFib3J0XG4gICAqL1xuICBhYm9ydCAoKSB7XG4gICAgLy8gMS4gSWYgdGhpcydzIHN0YXRlIGlzIFwiZW1wdHlcIiBvciBpZiB0aGlzJ3Mgc3RhdGUgaXNcbiAgICAvLyAgICBcImRvbmVcIiBzZXQgdGhpcydzIHJlc3VsdCB0byBudWxsIGFuZCB0ZXJtaW5hdGVcbiAgICAvLyAgICB0aGlzIGFsZ29yaXRobS5cbiAgICBpZiAodGhpc1trU3RhdGVdID09PSAnZW1wdHknIHx8IHRoaXNba1N0YXRlXSA9PT0gJ2RvbmUnKSB7XG4gICAgICB0aGlzW2tSZXN1bHRdID0gbnVsbFxuICAgICAgcmV0dXJuXG4gICAgfVxuXG4gICAgLy8gMi4gSWYgdGhpcydzIHN0YXRlIGlzIFwibG9hZGluZ1wiIHNldCB0aGlzJ3Mgc3RhdGUgdG9cbiAgICAvLyAgICBcImRvbmVcIiBhbmQgc2V0IHRoaXMncyByZXN1bHQgdG8gbnVsbC5cbiAgICBpZiAodGhpc1trU3RhdGVdID09PSAnbG9hZGluZycpIHtcbiAgICAgIHRoaXNba1N0YXRlXSA9ICdkb25lJ1xuICAgICAgdGhpc1trUmVzdWx0XSA9IG51bGxcbiAgICB9XG5cbiAgICAvLyAzLiBJZiB0aGVyZSBhcmUgYW55IHRhc2tzIGZyb20gdGhpcyBvbiB0aGUgZmlsZSByZWFkaW5nXG4gICAgLy8gICAgdGFzayBzb3VyY2UgaW4gYW4gYWZmaWxpYXRlZCB0YXNrIHF1ZXVlLCB0aGVuIHJlbW92ZVxuICAgIC8vICAgIHRob3NlIHRhc2tzIGZyb20gdGhhdCB0YXNrIHF1ZXVlLlxuICAgIHRoaXNba0Fib3J0ZWRdID0gdHJ1ZVxuXG4gICAgLy8gNC4gVGVybWluYXRlIHRoZSBhbGdvcml0aG0gZm9yIHRoZSByZWFkIG1ldGhvZCBiZWluZyBwcm9jZXNzZWQuXG4gICAgLy8gVE9ET1xuXG4gICAgLy8gNS4gRmlyZSBhIHByb2dyZXNzIGV2ZW50IGNhbGxlZCBhYm9ydCBhdCB0aGlzLlxuICAgIGZpcmVBUHJvZ3Jlc3NFdmVudCgnYWJvcnQnLCB0aGlzKVxuXG4gICAgLy8gNi4gSWYgdGhpcydzIHN0YXRlIGlzIG5vdCBcImxvYWRpbmdcIiwgZmlyZSBhIHByb2dyZXNzXG4gICAgLy8gICAgZXZlbnQgY2FsbGVkIGxvYWRlbmQgYXQgdGhpcy5cbiAgICBpZiAodGhpc1trU3RhdGVdICE9PSAnbG9hZGluZycpIHtcbiAgICAgIGZpcmVBUHJvZ3Jlc3NFdmVudCgnbG9hZGVuZCcsIHRoaXMpXG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIEBzZWUgaHR0cHM6Ly93M2MuZ2l0aHViLmlvL0ZpbGVBUEkvI2RvbS1maWxlcmVhZGVyLXJlYWR5c3RhdGVcbiAgICovXG4gIGdldCByZWFkeVN0YXRlICgpIHtcbiAgICB3ZWJpZGwuYnJhbmRDaGVjayh0aGlzLCBGaWxlUmVhZGVyKVxuXG4gICAgc3dpdGNoICh0aGlzW2tTdGF0ZV0pIHtcbiAgICAgIGNhc2UgJ2VtcHR5JzogcmV0dXJuIHRoaXMuRU1QVFlcbiAgICAgIGNhc2UgJ2xvYWRpbmcnOiByZXR1cm4gdGhpcy5MT0FESU5HXG4gICAgICBjYXNlICdkb25lJzogcmV0dXJuIHRoaXMuRE9ORVxuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBAc2VlIGh0dHBzOi8vdzNjLmdpdGh1Yi5pby9GaWxlQVBJLyNkb20tZmlsZXJlYWRlci1yZXN1bHRcbiAgICovXG4gIGdldCByZXN1bHQgKCkge1xuICAgIHdlYmlkbC5icmFuZENoZWNrKHRoaXMsIEZpbGVSZWFkZXIpXG5cbiAgICAvLyBUaGUgcmVzdWx0IGF0dHJpYnV0ZeKAmXMgZ2V0dGVyLCB3aGVuIGludm9rZWQsIG11c3QgcmV0dXJuXG4gICAgLy8gdGhpcydzIHJlc3VsdC5cbiAgICByZXR1cm4gdGhpc1trUmVzdWx0XVxuICB9XG5cbiAgLyoqXG4gICAqIEBzZWUgaHR0cHM6Ly93M2MuZ2l0aHViLmlvL0ZpbGVBUEkvI2RvbS1maWxlcmVhZGVyLWVycm9yXG4gICAqL1xuICBnZXQgZXJyb3IgKCkge1xuICAgIHdlYmlkbC5icmFuZENoZWNrKHRoaXMsIEZpbGVSZWFkZXIpXG5cbiAgICAvLyBUaGUgZXJyb3IgYXR0cmlidXRl4oCZcyBnZXR0ZXIsIHdoZW4gaW52b2tlZCwgbXVzdCByZXR1cm5cbiAgICAvLyB0aGlzJ3MgZXJyb3IuXG4gICAgcmV0dXJuIHRoaXNba0Vycm9yXVxuICB9XG5cbiAgZ2V0IG9ubG9hZGVuZCAoKSB7XG4gICAgd2ViaWRsLmJyYW5kQ2hlY2sodGhpcywgRmlsZVJlYWRlcilcblxuICAgIHJldHVybiB0aGlzW2tFdmVudHNdLmxvYWRlbmRcbiAgfVxuXG4gIHNldCBvbmxvYWRlbmQgKGZuKSB7XG4gICAgd2ViaWRsLmJyYW5kQ2hlY2sodGhpcywgRmlsZVJlYWRlcilcblxuICAgIGlmICh0aGlzW2tFdmVudHNdLmxvYWRlbmQpIHtcbiAgICAgIHRoaXMucmVtb3ZlRXZlbnRMaXN0ZW5lcignbG9hZGVuZCcsIHRoaXNba0V2ZW50c10ubG9hZGVuZClcbiAgICB9XG5cbiAgICBpZiAodHlwZW9mIGZuID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICB0aGlzW2tFdmVudHNdLmxvYWRlbmQgPSBmblxuICAgICAgdGhpcy5hZGRFdmVudExpc3RlbmVyKCdsb2FkZW5kJywgZm4pXG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXNba0V2ZW50c10ubG9hZGVuZCA9IG51bGxcbiAgICB9XG4gIH1cblxuICBnZXQgb25lcnJvciAoKSB7XG4gICAgd2ViaWRsLmJyYW5kQ2hlY2sodGhpcywgRmlsZVJlYWRlcilcblxuICAgIHJldHVybiB0aGlzW2tFdmVudHNdLmVycm9yXG4gIH1cblxuICBzZXQgb25lcnJvciAoZm4pIHtcbiAgICB3ZWJpZGwuYnJhbmRDaGVjayh0aGlzLCBGaWxlUmVhZGVyKVxuXG4gICAgaWYgKHRoaXNba0V2ZW50c10uZXJyb3IpIHtcbiAgICAgIHRoaXMucmVtb3ZlRXZlbnRMaXN0ZW5lcignZXJyb3InLCB0aGlzW2tFdmVudHNdLmVycm9yKVxuICAgIH1cblxuICAgIGlmICh0eXBlb2YgZm4gPT09ICdmdW5jdGlvbicpIHtcbiAgICAgIHRoaXNba0V2ZW50c10uZXJyb3IgPSBmblxuICAgICAgdGhpcy5hZGRFdmVudExpc3RlbmVyKCdlcnJvcicsIGZuKVxuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzW2tFdmVudHNdLmVycm9yID0gbnVsbFxuICAgIH1cbiAgfVxuXG4gIGdldCBvbmxvYWRzdGFydCAoKSB7XG4gICAgd2ViaWRsLmJyYW5kQ2hlY2sodGhpcywgRmlsZVJlYWRlcilcblxuICAgIHJldHVybiB0aGlzW2tFdmVudHNdLmxvYWRzdGFydFxuICB9XG5cbiAgc2V0IG9ubG9hZHN0YXJ0IChmbikge1xuICAgIHdlYmlkbC5icmFuZENoZWNrKHRoaXMsIEZpbGVSZWFkZXIpXG5cbiAgICBpZiAodGhpc1trRXZlbnRzXS5sb2Fkc3RhcnQpIHtcbiAgICAgIHRoaXMucmVtb3ZlRXZlbnRMaXN0ZW5lcignbG9hZHN0YXJ0JywgdGhpc1trRXZlbnRzXS5sb2Fkc3RhcnQpXG4gICAgfVxuXG4gICAgaWYgKHR5cGVvZiBmbiA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgdGhpc1trRXZlbnRzXS5sb2Fkc3RhcnQgPSBmblxuICAgICAgdGhpcy5hZGRFdmVudExpc3RlbmVyKCdsb2Fkc3RhcnQnLCBmbilcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpc1trRXZlbnRzXS5sb2Fkc3RhcnQgPSBudWxsXG4gICAgfVxuICB9XG5cbiAgZ2V0IG9ucHJvZ3Jlc3MgKCkge1xuICAgIHdlYmlkbC5icmFuZENoZWNrKHRoaXMsIEZpbGVSZWFkZXIpXG5cbiAgICByZXR1cm4gdGhpc1trRXZlbnRzXS5wcm9ncmVzc1xuICB9XG5cbiAgc2V0IG9ucHJvZ3Jlc3MgKGZuKSB7XG4gICAgd2ViaWRsLmJyYW5kQ2hlY2sodGhpcywgRmlsZVJlYWRlcilcblxuICAgIGlmICh0aGlzW2tFdmVudHNdLnByb2dyZXNzKSB7XG4gICAgICB0aGlzLnJlbW92ZUV2ZW50TGlzdGVuZXIoJ3Byb2dyZXNzJywgdGhpc1trRXZlbnRzXS5wcm9ncmVzcylcbiAgICB9XG5cbiAgICBpZiAodHlwZW9mIGZuID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICB0aGlzW2tFdmVudHNdLnByb2dyZXNzID0gZm5cbiAgICAgIHRoaXMuYWRkRXZlbnRMaXN0ZW5lcigncHJvZ3Jlc3MnLCBmbilcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpc1trRXZlbnRzXS5wcm9ncmVzcyA9IG51bGxcbiAgICB9XG4gIH1cblxuICBnZXQgb25sb2FkICgpIHtcbiAgICB3ZWJpZGwuYnJhbmRDaGVjayh0aGlzLCBGaWxlUmVhZGVyKVxuXG4gICAgcmV0dXJuIHRoaXNba0V2ZW50c10ubG9hZFxuICB9XG5cbiAgc2V0IG9ubG9hZCAoZm4pIHtcbiAgICB3ZWJpZGwuYnJhbmRDaGVjayh0aGlzLCBGaWxlUmVhZGVyKVxuXG4gICAgaWYgKHRoaXNba0V2ZW50c10ubG9hZCkge1xuICAgICAgdGhpcy5yZW1vdmVFdmVudExpc3RlbmVyKCdsb2FkJywgdGhpc1trRXZlbnRzXS5sb2FkKVxuICAgIH1cblxuICAgIGlmICh0eXBlb2YgZm4gPT09ICdmdW5jdGlvbicpIHtcbiAgICAgIHRoaXNba0V2ZW50c10ubG9hZCA9IGZuXG4gICAgICB0aGlzLmFkZEV2ZW50TGlzdGVuZXIoJ2xvYWQnLCBmbilcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpc1trRXZlbnRzXS5sb2FkID0gbnVsbFxuICAgIH1cbiAgfVxuXG4gIGdldCBvbmFib3J0ICgpIHtcbiAgICB3ZWJpZGwuYnJhbmRDaGVjayh0aGlzLCBGaWxlUmVhZGVyKVxuXG4gICAgcmV0dXJuIHRoaXNba0V2ZW50c10uYWJvcnRcbiAgfVxuXG4gIHNldCBvbmFib3J0IChmbikge1xuICAgIHdlYmlkbC5icmFuZENoZWNrKHRoaXMsIEZpbGVSZWFkZXIpXG5cbiAgICBpZiAodGhpc1trRXZlbnRzXS5hYm9ydCkge1xuICAgICAgdGhpcy5yZW1vdmVFdmVudExpc3RlbmVyKCdhYm9ydCcsIHRoaXNba0V2ZW50c10uYWJvcnQpXG4gICAgfVxuXG4gICAgaWYgKHR5cGVvZiBmbiA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgdGhpc1trRXZlbnRzXS5hYm9ydCA9IGZuXG4gICAgICB0aGlzLmFkZEV2ZW50TGlzdGVuZXIoJ2Fib3J0JywgZm4pXG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXNba0V2ZW50c10uYWJvcnQgPSBudWxsXG4gICAgfVxuICB9XG59XG5cbi8vIGh0dHBzOi8vdzNjLmdpdGh1Yi5pby9GaWxlQVBJLyNkb20tZmlsZXJlYWRlci1lbXB0eVxuRmlsZVJlYWRlci5FTVBUWSA9IEZpbGVSZWFkZXIucHJvdG90eXBlLkVNUFRZID0gMFxuLy8gaHR0cHM6Ly93M2MuZ2l0aHViLmlvL0ZpbGVBUEkvI2RvbS1maWxlcmVhZGVyLWxvYWRpbmdcbkZpbGVSZWFkZXIuTE9BRElORyA9IEZpbGVSZWFkZXIucHJvdG90eXBlLkxPQURJTkcgPSAxXG4vLyBodHRwczovL3czYy5naXRodWIuaW8vRmlsZUFQSS8jZG9tLWZpbGVyZWFkZXItZG9uZVxuRmlsZVJlYWRlci5ET05FID0gRmlsZVJlYWRlci5wcm90b3R5cGUuRE9ORSA9IDJcblxuT2JqZWN0LmRlZmluZVByb3BlcnRpZXMoRmlsZVJlYWRlci5wcm90b3R5cGUsIHtcbiAgRU1QVFk6IHN0YXRpY1Byb3BlcnR5RGVzY3JpcHRvcnMsXG4gIExPQURJTkc6IHN0YXRpY1Byb3BlcnR5RGVzY3JpcHRvcnMsXG4gIERPTkU6IHN0YXRpY1Byb3BlcnR5RGVzY3JpcHRvcnMsXG4gIHJlYWRBc0FycmF5QnVmZmVyOiBrRW51bWVyYWJsZVByb3BlcnR5LFxuICByZWFkQXNCaW5hcnlTdHJpbmc6IGtFbnVtZXJhYmxlUHJvcGVydHksXG4gIHJlYWRBc1RleHQ6IGtFbnVtZXJhYmxlUHJvcGVydHksXG4gIHJlYWRBc0RhdGFVUkw6IGtFbnVtZXJhYmxlUHJvcGVydHksXG4gIGFib3J0OiBrRW51bWVyYWJsZVByb3BlcnR5LFxuICByZWFkeVN0YXRlOiBrRW51bWVyYWJsZVByb3BlcnR5LFxuICByZXN1bHQ6IGtFbnVtZXJhYmxlUHJvcGVydHksXG4gIGVycm9yOiBrRW51bWVyYWJsZVByb3BlcnR5LFxuICBvbmxvYWRzdGFydDoga0VudW1lcmFibGVQcm9wZXJ0eSxcbiAgb25wcm9ncmVzczoga0VudW1lcmFibGVQcm9wZXJ0eSxcbiAgb25sb2FkOiBrRW51bWVyYWJsZVByb3BlcnR5LFxuICBvbmFib3J0OiBrRW51bWVyYWJsZVByb3BlcnR5LFxuICBvbmVycm9yOiBrRW51bWVyYWJsZVByb3BlcnR5LFxuICBvbmxvYWRlbmQ6IGtFbnVtZXJhYmxlUHJvcGVydHksXG4gIFtTeW1ib2wudG9TdHJpbmdUYWddOiB7XG4gICAgdmFsdWU6ICdGaWxlUmVhZGVyJyxcbiAgICB3cml0YWJsZTogZmFsc2UsXG4gICAgZW51bWVyYWJsZTogZmFsc2UsXG4gICAgY29uZmlndXJhYmxlOiB0cnVlXG4gIH1cbn0pXG5cbk9iamVjdC5kZWZpbmVQcm9wZXJ0aWVzKEZpbGVSZWFkZXIsIHtcbiAgRU1QVFk6IHN0YXRpY1Byb3BlcnR5RGVzY3JpcHRvcnMsXG4gIExPQURJTkc6IHN0YXRpY1Byb3BlcnR5RGVzY3JpcHRvcnMsXG4gIERPTkU6IHN0YXRpY1Byb3BlcnR5RGVzY3JpcHRvcnNcbn0pXG5cbm1vZHVsZS5leHBvcnRzID0ge1xuICBGaWxlUmVhZGVyXG59XG4iLAogICAgIid1c2Ugc3RyaWN0J1xuXG5tb2R1bGUuZXhwb3J0cyA9IHtcbiAga0NvbnN0cnVjdDogcmVxdWlyZSgnLi4vY29yZS9zeW1ib2xzJykua0NvbnN0cnVjdFxufVxuIiwKICAgICIndXNlIHN0cmljdCdcblxuY29uc3QgYXNzZXJ0ID0gcmVxdWlyZSgnYXNzZXJ0JylcbmNvbnN0IHsgVVJMU2VyaWFsaXplciB9ID0gcmVxdWlyZSgnLi4vZmV0Y2gvZGF0YVVSTCcpXG5jb25zdCB7IGlzVmFsaWRIZWFkZXJOYW1lIH0gPSByZXF1aXJlKCcuLi9mZXRjaC91dGlsJylcblxuLyoqXG4gKiBAc2VlIGh0dHBzOi8vdXJsLnNwZWMud2hhdHdnLm9yZy8jY29uY2VwdC11cmwtZXF1YWxzXG4gKiBAcGFyYW0ge1VSTH0gQVxuICogQHBhcmFtIHtVUkx9IEJcbiAqIEBwYXJhbSB7Ym9vbGVhbiB8IHVuZGVmaW5lZH0gZXhjbHVkZUZyYWdtZW50XG4gKiBAcmV0dXJucyB7Ym9vbGVhbn1cbiAqL1xuZnVuY3Rpb24gdXJsRXF1YWxzIChBLCBCLCBleGNsdWRlRnJhZ21lbnQgPSBmYWxzZSkge1xuICBjb25zdCBzZXJpYWxpemVkQSA9IFVSTFNlcmlhbGl6ZXIoQSwgZXhjbHVkZUZyYWdtZW50KVxuXG4gIGNvbnN0IHNlcmlhbGl6ZWRCID0gVVJMU2VyaWFsaXplcihCLCBleGNsdWRlRnJhZ21lbnQpXG5cbiAgcmV0dXJuIHNlcmlhbGl6ZWRBID09PSBzZXJpYWxpemVkQlxufVxuXG4vKipcbiAqIEBzZWUgaHR0cHM6Ly9naXRodWIuY29tL2Nocm9taXVtL2Nocm9taXVtL2Jsb2IvNjk0ZDIwZDEzNGNiNTUzZDhkODllNTUwMGI5MTQ4MDEyYjFiYTI5OS9jb250ZW50L2Jyb3dzZXIvY2FjaGVfc3RvcmFnZS9jYWNoZV9zdG9yYWdlX2NhY2hlLmNjI0wyNjAtTDI2MlxuICogQHBhcmFtIHtzdHJpbmd9IGhlYWRlclxuICovXG5mdW5jdGlvbiBmaWVsZFZhbHVlcyAoaGVhZGVyKSB7XG4gIGFzc2VydChoZWFkZXIgIT09IG51bGwpXG5cbiAgY29uc3QgdmFsdWVzID0gW11cblxuICBmb3IgKGxldCB2YWx1ZSBvZiBoZWFkZXIuc3BsaXQoJywnKSkge1xuICAgIHZhbHVlID0gdmFsdWUudHJpbSgpXG5cbiAgICBpZiAoIXZhbHVlLmxlbmd0aCkge1xuICAgICAgY29udGludWVcbiAgICB9IGVsc2UgaWYgKCFpc1ZhbGlkSGVhZGVyTmFtZSh2YWx1ZSkpIHtcbiAgICAgIGNvbnRpbnVlXG4gICAgfVxuXG4gICAgdmFsdWVzLnB1c2godmFsdWUpXG4gIH1cblxuICByZXR1cm4gdmFsdWVzXG59XG5cbm1vZHVsZS5leHBvcnRzID0ge1xuICB1cmxFcXVhbHMsXG4gIGZpZWxkVmFsdWVzXG59XG4iLAogICAgIid1c2Ugc3RyaWN0J1xuXG5jb25zdCB7IGtDb25zdHJ1Y3QgfSA9IHJlcXVpcmUoJy4vc3ltYm9scycpXG5jb25zdCB7IHVybEVxdWFscywgZmllbGRWYWx1ZXM6IGdldEZpZWxkVmFsdWVzIH0gPSByZXF1aXJlKCcuL3V0aWwnKVxuY29uc3QgeyBrRW51bWVyYWJsZVByb3BlcnR5LCBpc0Rpc3R1cmJlZCB9ID0gcmVxdWlyZSgnLi4vY29yZS91dGlsJylcbmNvbnN0IHsga0hlYWRlcnNMaXN0IH0gPSByZXF1aXJlKCcuLi9jb3JlL3N5bWJvbHMnKVxuY29uc3QgeyB3ZWJpZGwgfSA9IHJlcXVpcmUoJy4uL2ZldGNoL3dlYmlkbCcpXG5jb25zdCB7IFJlc3BvbnNlLCBjbG9uZVJlc3BvbnNlIH0gPSByZXF1aXJlKCcuLi9mZXRjaC9yZXNwb25zZScpXG5jb25zdCB7IFJlcXVlc3QgfSA9IHJlcXVpcmUoJy4uL2ZldGNoL3JlcXVlc3QnKVxuY29uc3QgeyBrU3RhdGUsIGtIZWFkZXJzLCBrR3VhcmQsIGtSZWFsbSB9ID0gcmVxdWlyZSgnLi4vZmV0Y2gvc3ltYm9scycpXG5jb25zdCB7IGZldGNoaW5nIH0gPSByZXF1aXJlKCcuLi9mZXRjaC9pbmRleCcpXG5jb25zdCB7IHVybElzSHR0cEh0dHBzU2NoZW1lLCBjcmVhdGVEZWZlcnJlZFByb21pc2UsIHJlYWRBbGxCeXRlcyB9ID0gcmVxdWlyZSgnLi4vZmV0Y2gvdXRpbCcpXG5jb25zdCBhc3NlcnQgPSByZXF1aXJlKCdhc3NlcnQnKVxuY29uc3QgeyBnZXRHbG9iYWxEaXNwYXRjaGVyIH0gPSByZXF1aXJlKCcuLi9nbG9iYWwnKVxuXG4vKipcbiAqIEBzZWUgaHR0cHM6Ly93M2MuZ2l0aHViLmlvL1NlcnZpY2VXb3JrZXIvI2Rmbi1jYWNoZS1iYXRjaC1vcGVyYXRpb25cbiAqIEB0eXBlZGVmIHtPYmplY3R9IENhY2hlQmF0Y2hPcGVyYXRpb25cbiAqIEBwcm9wZXJ0eSB7J2RlbGV0ZScgfCAncHV0J30gdHlwZVxuICogQHByb3BlcnR5IHthbnl9IHJlcXVlc3RcbiAqIEBwcm9wZXJ0eSB7YW55fSByZXNwb25zZVxuICogQHByb3BlcnR5IHtpbXBvcnQoJy4uLy4uL3R5cGVzL2NhY2hlJykuQ2FjaGVRdWVyeU9wdGlvbnN9IG9wdGlvbnNcbiAqL1xuXG4vKipcbiAqIEBzZWUgaHR0cHM6Ly93M2MuZ2l0aHViLmlvL1NlcnZpY2VXb3JrZXIvI2Rmbi1yZXF1ZXN0LXJlc3BvbnNlLWxpc3RcbiAqIEB0eXBlZGVmIHtbYW55LCBhbnldW119IHJlcXVlc3RSZXNwb25zZUxpc3RcbiAqL1xuXG5jbGFzcyBDYWNoZSB7XG4gIC8qKlxuICAgKiBAc2VlIGh0dHBzOi8vdzNjLmdpdGh1Yi5pby9TZXJ2aWNlV29ya2VyLyNkZm4tcmVsZXZhbnQtcmVxdWVzdC1yZXNwb25zZS1saXN0XG4gICAqIEB0eXBlIHtyZXF1ZXN0UmVzcG9uc2VMaXN0fVxuICAgKi9cbiAgI3JlbGV2YW50UmVxdWVzdFJlc3BvbnNlTGlzdFxuXG4gIGNvbnN0cnVjdG9yICgpIHtcbiAgICBpZiAoYXJndW1lbnRzWzBdICE9PSBrQ29uc3RydWN0KSB7XG4gICAgICB3ZWJpZGwuaWxsZWdhbENvbnN0cnVjdG9yKClcbiAgICB9XG5cbiAgICB0aGlzLiNyZWxldmFudFJlcXVlc3RSZXNwb25zZUxpc3QgPSBhcmd1bWVudHNbMV1cbiAgfVxuXG4gIGFzeW5jIG1hdGNoIChyZXF1ZXN0LCBvcHRpb25zID0ge30pIHtcbiAgICB3ZWJpZGwuYnJhbmRDaGVjayh0aGlzLCBDYWNoZSlcbiAgICB3ZWJpZGwuYXJndW1lbnRMZW5ndGhDaGVjayhhcmd1bWVudHMsIDEsIHsgaGVhZGVyOiAnQ2FjaGUubWF0Y2gnIH0pXG5cbiAgICByZXF1ZXN0ID0gd2ViaWRsLmNvbnZlcnRlcnMuUmVxdWVzdEluZm8ocmVxdWVzdClcbiAgICBvcHRpb25zID0gd2ViaWRsLmNvbnZlcnRlcnMuQ2FjaGVRdWVyeU9wdGlvbnMob3B0aW9ucylcblxuICAgIGNvbnN0IHAgPSBhd2FpdCB0aGlzLm1hdGNoQWxsKHJlcXVlc3QsIG9wdGlvbnMpXG5cbiAgICBpZiAocC5sZW5ndGggPT09IDApIHtcbiAgICAgIHJldHVyblxuICAgIH1cblxuICAgIHJldHVybiBwWzBdXG4gIH1cblxuICBhc3luYyBtYXRjaEFsbCAocmVxdWVzdCA9IHVuZGVmaW5lZCwgb3B0aW9ucyA9IHt9KSB7XG4gICAgd2ViaWRsLmJyYW5kQ2hlY2sodGhpcywgQ2FjaGUpXG5cbiAgICBpZiAocmVxdWVzdCAhPT0gdW5kZWZpbmVkKSByZXF1ZXN0ID0gd2ViaWRsLmNvbnZlcnRlcnMuUmVxdWVzdEluZm8ocmVxdWVzdClcbiAgICBvcHRpb25zID0gd2ViaWRsLmNvbnZlcnRlcnMuQ2FjaGVRdWVyeU9wdGlvbnMob3B0aW9ucylcblxuICAgIC8vIDEuXG4gICAgbGV0IHIgPSBudWxsXG5cbiAgICAvLyAyLlxuICAgIGlmIChyZXF1ZXN0ICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIGlmIChyZXF1ZXN0IGluc3RhbmNlb2YgUmVxdWVzdCkge1xuICAgICAgICAvLyAyLjEuMVxuICAgICAgICByID0gcmVxdWVzdFtrU3RhdGVdXG5cbiAgICAgICAgLy8gMi4xLjJcbiAgICAgICAgaWYgKHIubWV0aG9kICE9PSAnR0VUJyAmJiAhb3B0aW9ucy5pZ25vcmVNZXRob2QpIHtcbiAgICAgICAgICByZXR1cm4gW11cbiAgICAgICAgfVxuICAgICAgfSBlbHNlIGlmICh0eXBlb2YgcmVxdWVzdCA9PT0gJ3N0cmluZycpIHtcbiAgICAgICAgLy8gMi4yLjFcbiAgICAgICAgciA9IG5ldyBSZXF1ZXN0KHJlcXVlc3QpW2tTdGF0ZV1cbiAgICAgIH1cbiAgICB9XG5cbiAgICAvLyA1LlxuICAgIC8vIDUuMVxuICAgIGNvbnN0IHJlc3BvbnNlcyA9IFtdXG5cbiAgICAvLyA1LjJcbiAgICBpZiAocmVxdWVzdCA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAvLyA1LjIuMVxuICAgICAgZm9yIChjb25zdCByZXF1ZXN0UmVzcG9uc2Ugb2YgdGhpcy4jcmVsZXZhbnRSZXF1ZXN0UmVzcG9uc2VMaXN0KSB7XG4gICAgICAgIHJlc3BvbnNlcy5wdXNoKHJlcXVlc3RSZXNwb25zZVsxXSlcbiAgICAgIH1cbiAgICB9IGVsc2UgeyAvLyA1LjNcbiAgICAgIC8vIDUuMy4xXG4gICAgICBjb25zdCByZXF1ZXN0UmVzcG9uc2VzID0gdGhpcy4jcXVlcnlDYWNoZShyLCBvcHRpb25zKVxuXG4gICAgICAvLyA1LjMuMlxuICAgICAgZm9yIChjb25zdCByZXF1ZXN0UmVzcG9uc2Ugb2YgcmVxdWVzdFJlc3BvbnNlcykge1xuICAgICAgICByZXNwb25zZXMucHVzaChyZXF1ZXN0UmVzcG9uc2VbMV0pXG4gICAgICB9XG4gICAgfVxuXG4gICAgLy8gNS40XG4gICAgLy8gV2UgZG9uJ3QgaW1wbGVtZW50IENPUnMgc28gd2UgZG9uJ3QgbmVlZCB0byBsb29wIG92ZXIgdGhlIHJlc3BvbnNlcywgeWF5IVxuXG4gICAgLy8gNS41LjFcbiAgICBjb25zdCByZXNwb25zZUxpc3QgPSBbXVxuXG4gICAgLy8gNS41LjJcbiAgICBmb3IgKGNvbnN0IHJlc3BvbnNlIG9mIHJlc3BvbnNlcykge1xuICAgICAgLy8gNS41LjIuMVxuICAgICAgY29uc3QgcmVzcG9uc2VPYmplY3QgPSBuZXcgUmVzcG9uc2UocmVzcG9uc2UuYm9keT8uc291cmNlID8/IG51bGwpXG4gICAgICBjb25zdCBib2R5ID0gcmVzcG9uc2VPYmplY3Rba1N0YXRlXS5ib2R5XG4gICAgICByZXNwb25zZU9iamVjdFtrU3RhdGVdID0gcmVzcG9uc2VcbiAgICAgIHJlc3BvbnNlT2JqZWN0W2tTdGF0ZV0uYm9keSA9IGJvZHlcbiAgICAgIHJlc3BvbnNlT2JqZWN0W2tIZWFkZXJzXVtrSGVhZGVyc0xpc3RdID0gcmVzcG9uc2UuaGVhZGVyc0xpc3RcbiAgICAgIHJlc3BvbnNlT2JqZWN0W2tIZWFkZXJzXVtrR3VhcmRdID0gJ2ltbXV0YWJsZSdcblxuICAgICAgcmVzcG9uc2VMaXN0LnB1c2gocmVzcG9uc2VPYmplY3QpXG4gICAgfVxuXG4gICAgLy8gNi5cbiAgICByZXR1cm4gT2JqZWN0LmZyZWV6ZShyZXNwb25zZUxpc3QpXG4gIH1cblxuICBhc3luYyBhZGQgKHJlcXVlc3QpIHtcbiAgICB3ZWJpZGwuYnJhbmRDaGVjayh0aGlzLCBDYWNoZSlcbiAgICB3ZWJpZGwuYXJndW1lbnRMZW5ndGhDaGVjayhhcmd1bWVudHMsIDEsIHsgaGVhZGVyOiAnQ2FjaGUuYWRkJyB9KVxuXG4gICAgcmVxdWVzdCA9IHdlYmlkbC5jb252ZXJ0ZXJzLlJlcXVlc3RJbmZvKHJlcXVlc3QpXG5cbiAgICAvLyAxLlxuICAgIGNvbnN0IHJlcXVlc3RzID0gW3JlcXVlc3RdXG5cbiAgICAvLyAyLlxuICAgIGNvbnN0IHJlc3BvbnNlQXJyYXlQcm9taXNlID0gdGhpcy5hZGRBbGwocmVxdWVzdHMpXG5cbiAgICAvLyAzLlxuICAgIHJldHVybiBhd2FpdCByZXNwb25zZUFycmF5UHJvbWlzZVxuICB9XG5cbiAgYXN5bmMgYWRkQWxsIChyZXF1ZXN0cykge1xuICAgIHdlYmlkbC5icmFuZENoZWNrKHRoaXMsIENhY2hlKVxuICAgIHdlYmlkbC5hcmd1bWVudExlbmd0aENoZWNrKGFyZ3VtZW50cywgMSwgeyBoZWFkZXI6ICdDYWNoZS5hZGRBbGwnIH0pXG5cbiAgICByZXF1ZXN0cyA9IHdlYmlkbC5jb252ZXJ0ZXJzWydzZXF1ZW5jZTxSZXF1ZXN0SW5mbz4nXShyZXF1ZXN0cylcblxuICAgIC8vIDEuXG4gICAgY29uc3QgcmVzcG9uc2VQcm9taXNlcyA9IFtdXG5cbiAgICAvLyAyLlxuICAgIGNvbnN0IHJlcXVlc3RMaXN0ID0gW11cblxuICAgIC8vIDMuXG4gICAgZm9yIChjb25zdCByZXF1ZXN0IG9mIHJlcXVlc3RzKSB7XG4gICAgICBpZiAodHlwZW9mIHJlcXVlc3QgPT09ICdzdHJpbmcnKSB7XG4gICAgICAgIGNvbnRpbnVlXG4gICAgICB9XG5cbiAgICAgIC8vIDMuMVxuICAgICAgY29uc3QgciA9IHJlcXVlc3Rba1N0YXRlXVxuXG4gICAgICAvLyAzLjJcbiAgICAgIGlmICghdXJsSXNIdHRwSHR0cHNTY2hlbWUoci51cmwpIHx8IHIubWV0aG9kICE9PSAnR0VUJykge1xuICAgICAgICB0aHJvdyB3ZWJpZGwuZXJyb3JzLmV4Y2VwdGlvbih7XG4gICAgICAgICAgaGVhZGVyOiAnQ2FjaGUuYWRkQWxsJyxcbiAgICAgICAgICBtZXNzYWdlOiAnRXhwZWN0ZWQgaHR0cC9zIHNjaGVtZSB3aGVuIG1ldGhvZCBpcyBub3QgR0VULidcbiAgICAgICAgfSlcbiAgICAgIH1cbiAgICB9XG5cbiAgICAvLyA0LlxuICAgIC8qKiBAdHlwZSB7UmV0dXJuVHlwZTx0eXBlb2YgZmV0Y2hpbmc+W119ICovXG4gICAgY29uc3QgZmV0Y2hDb250cm9sbGVycyA9IFtdXG5cbiAgICAvLyA1LlxuICAgIGZvciAoY29uc3QgcmVxdWVzdCBvZiByZXF1ZXN0cykge1xuICAgICAgLy8gNS4xXG4gICAgICBjb25zdCByID0gbmV3IFJlcXVlc3QocmVxdWVzdClba1N0YXRlXVxuXG4gICAgICAvLyA1LjJcbiAgICAgIGlmICghdXJsSXNIdHRwSHR0cHNTY2hlbWUoci51cmwpKSB7XG4gICAgICAgIHRocm93IHdlYmlkbC5lcnJvcnMuZXhjZXB0aW9uKHtcbiAgICAgICAgICBoZWFkZXI6ICdDYWNoZS5hZGRBbGwnLFxuICAgICAgICAgIG1lc3NhZ2U6ICdFeHBlY3RlZCBodHRwL3Mgc2NoZW1lLidcbiAgICAgICAgfSlcbiAgICAgIH1cblxuICAgICAgLy8gNS40XG4gICAgICByLmluaXRpYXRvciA9ICdmZXRjaCdcbiAgICAgIHIuZGVzdGluYXRpb24gPSAnc3VicmVzb3VyY2UnXG5cbiAgICAgIC8vIDUuNVxuICAgICAgcmVxdWVzdExpc3QucHVzaChyKVxuXG4gICAgICAvLyA1LjZcbiAgICAgIGNvbnN0IHJlc3BvbnNlUHJvbWlzZSA9IGNyZWF0ZURlZmVycmVkUHJvbWlzZSgpXG5cbiAgICAgIC8vIDUuN1xuICAgICAgZmV0Y2hDb250cm9sbGVycy5wdXNoKGZldGNoaW5nKHtcbiAgICAgICAgcmVxdWVzdDogcixcbiAgICAgICAgZGlzcGF0Y2hlcjogZ2V0R2xvYmFsRGlzcGF0Y2hlcigpLFxuICAgICAgICBwcm9jZXNzUmVzcG9uc2UgKHJlc3BvbnNlKSB7XG4gICAgICAgICAgLy8gMS5cbiAgICAgICAgICBpZiAocmVzcG9uc2UudHlwZSA9PT0gJ2Vycm9yJyB8fCByZXNwb25zZS5zdGF0dXMgPT09IDIwNiB8fCByZXNwb25zZS5zdGF0dXMgPCAyMDAgfHwgcmVzcG9uc2Uuc3RhdHVzID4gMjk5KSB7XG4gICAgICAgICAgICByZXNwb25zZVByb21pc2UucmVqZWN0KHdlYmlkbC5lcnJvcnMuZXhjZXB0aW9uKHtcbiAgICAgICAgICAgICAgaGVhZGVyOiAnQ2FjaGUuYWRkQWxsJyxcbiAgICAgICAgICAgICAgbWVzc2FnZTogJ1JlY2VpdmVkIGFuIGludmFsaWQgc3RhdHVzIGNvZGUgb3IgdGhlIHJlcXVlc3QgZmFpbGVkLidcbiAgICAgICAgICAgIH0pKVxuICAgICAgICAgIH0gZWxzZSBpZiAocmVzcG9uc2UuaGVhZGVyc0xpc3QuY29udGFpbnMoJ3ZhcnknKSkgeyAvLyAyLlxuICAgICAgICAgICAgLy8gMi4xXG4gICAgICAgICAgICBjb25zdCBmaWVsZFZhbHVlcyA9IGdldEZpZWxkVmFsdWVzKHJlc3BvbnNlLmhlYWRlcnNMaXN0LmdldCgndmFyeScpKVxuXG4gICAgICAgICAgICAvLyAyLjJcbiAgICAgICAgICAgIGZvciAoY29uc3QgZmllbGRWYWx1ZSBvZiBmaWVsZFZhbHVlcykge1xuICAgICAgICAgICAgICAvLyAyLjIuMVxuICAgICAgICAgICAgICBpZiAoZmllbGRWYWx1ZSA9PT0gJyonKSB7XG4gICAgICAgICAgICAgICAgcmVzcG9uc2VQcm9taXNlLnJlamVjdCh3ZWJpZGwuZXJyb3JzLmV4Y2VwdGlvbih7XG4gICAgICAgICAgICAgICAgICBoZWFkZXI6ICdDYWNoZS5hZGRBbGwnLFxuICAgICAgICAgICAgICAgICAgbWVzc2FnZTogJ2ludmFsaWQgdmFyeSBmaWVsZCB2YWx1ZSdcbiAgICAgICAgICAgICAgICB9KSlcblxuICAgICAgICAgICAgICAgIGZvciAoY29uc3QgY29udHJvbGxlciBvZiBmZXRjaENvbnRyb2xsZXJzKSB7XG4gICAgICAgICAgICAgICAgICBjb250cm9sbGVyLmFib3J0KClcbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICByZXR1cm5cbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgfSxcbiAgICAgICAgcHJvY2Vzc1Jlc3BvbnNlRW5kT2ZCb2R5IChyZXNwb25zZSkge1xuICAgICAgICAgIC8vIDEuXG4gICAgICAgICAgaWYgKHJlc3BvbnNlLmFib3J0ZWQpIHtcbiAgICAgICAgICAgIHJlc3BvbnNlUHJvbWlzZS5yZWplY3QobmV3IERPTUV4Y2VwdGlvbignYWJvcnRlZCcsICdBYm9ydEVycm9yJykpXG4gICAgICAgICAgICByZXR1cm5cbiAgICAgICAgICB9XG5cbiAgICAgICAgICAvLyAyLlxuICAgICAgICAgIHJlc3BvbnNlUHJvbWlzZS5yZXNvbHZlKHJlc3BvbnNlKVxuICAgICAgICB9XG4gICAgICB9KSlcblxuICAgICAgLy8gNS44XG4gICAgICByZXNwb25zZVByb21pc2VzLnB1c2gocmVzcG9uc2VQcm9taXNlLnByb21pc2UpXG4gICAgfVxuXG4gICAgLy8gNi5cbiAgICBjb25zdCBwID0gUHJvbWlzZS5hbGwocmVzcG9uc2VQcm9taXNlcylcblxuICAgIC8vIDcuXG4gICAgY29uc3QgcmVzcG9uc2VzID0gYXdhaXQgcFxuXG4gICAgLy8gNy4xXG4gICAgY29uc3Qgb3BlcmF0aW9ucyA9IFtdXG5cbiAgICAvLyA3LjJcbiAgICBsZXQgaW5kZXggPSAwXG5cbiAgICAvLyA3LjNcbiAgICBmb3IgKGNvbnN0IHJlc3BvbnNlIG9mIHJlc3BvbnNlcykge1xuICAgICAgLy8gNy4zLjFcbiAgICAgIC8qKiBAdHlwZSB7Q2FjaGVCYXRjaE9wZXJhdGlvbn0gKi9cbiAgICAgIGNvbnN0IG9wZXJhdGlvbiA9IHtcbiAgICAgICAgdHlwZTogJ3B1dCcsIC8vIDcuMy4yXG4gICAgICAgIHJlcXVlc3Q6IHJlcXVlc3RMaXN0W2luZGV4XSwgLy8gNy4zLjNcbiAgICAgICAgcmVzcG9uc2UgLy8gNy4zLjRcbiAgICAgIH1cblxuICAgICAgb3BlcmF0aW9ucy5wdXNoKG9wZXJhdGlvbikgLy8gNy4zLjVcblxuICAgICAgaW5kZXgrKyAvLyA3LjMuNlxuICAgIH1cblxuICAgIC8vIDcuNVxuICAgIGNvbnN0IGNhY2hlSm9iUHJvbWlzZSA9IGNyZWF0ZURlZmVycmVkUHJvbWlzZSgpXG5cbiAgICAvLyA3LjYuMVxuICAgIGxldCBlcnJvckRhdGEgPSBudWxsXG5cbiAgICAvLyA3LjYuMlxuICAgIHRyeSB7XG4gICAgICB0aGlzLiNiYXRjaENhY2hlT3BlcmF0aW9ucyhvcGVyYXRpb25zKVxuICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgIGVycm9yRGF0YSA9IGVcbiAgICB9XG5cbiAgICAvLyA3LjYuM1xuICAgIHF1ZXVlTWljcm90YXNrKCgpID0+IHtcbiAgICAgIC8vIDcuNi4zLjFcbiAgICAgIGlmIChlcnJvckRhdGEgPT09IG51bGwpIHtcbiAgICAgICAgY2FjaGVKb2JQcm9taXNlLnJlc29sdmUodW5kZWZpbmVkKVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgLy8gNy42LjMuMlxuICAgICAgICBjYWNoZUpvYlByb21pc2UucmVqZWN0KGVycm9yRGF0YSlcbiAgICAgIH1cbiAgICB9KVxuXG4gICAgLy8gNy43XG4gICAgcmV0dXJuIGNhY2hlSm9iUHJvbWlzZS5wcm9taXNlXG4gIH1cblxuICBhc3luYyBwdXQgKHJlcXVlc3QsIHJlc3BvbnNlKSB7XG4gICAgd2ViaWRsLmJyYW5kQ2hlY2sodGhpcywgQ2FjaGUpXG4gICAgd2ViaWRsLmFyZ3VtZW50TGVuZ3RoQ2hlY2soYXJndW1lbnRzLCAyLCB7IGhlYWRlcjogJ0NhY2hlLnB1dCcgfSlcblxuICAgIHJlcXVlc3QgPSB3ZWJpZGwuY29udmVydGVycy5SZXF1ZXN0SW5mbyhyZXF1ZXN0KVxuICAgIHJlc3BvbnNlID0gd2ViaWRsLmNvbnZlcnRlcnMuUmVzcG9uc2UocmVzcG9uc2UpXG5cbiAgICAvLyAxLlxuICAgIGxldCBpbm5lclJlcXVlc3QgPSBudWxsXG5cbiAgICAvLyAyLlxuICAgIGlmIChyZXF1ZXN0IGluc3RhbmNlb2YgUmVxdWVzdCkge1xuICAgICAgaW5uZXJSZXF1ZXN0ID0gcmVxdWVzdFtrU3RhdGVdXG4gICAgfSBlbHNlIHsgLy8gMy5cbiAgICAgIGlubmVyUmVxdWVzdCA9IG5ldyBSZXF1ZXN0KHJlcXVlc3QpW2tTdGF0ZV1cbiAgICB9XG5cbiAgICAvLyA0LlxuICAgIGlmICghdXJsSXNIdHRwSHR0cHNTY2hlbWUoaW5uZXJSZXF1ZXN0LnVybCkgfHwgaW5uZXJSZXF1ZXN0Lm1ldGhvZCAhPT0gJ0dFVCcpIHtcbiAgICAgIHRocm93IHdlYmlkbC5lcnJvcnMuZXhjZXB0aW9uKHtcbiAgICAgICAgaGVhZGVyOiAnQ2FjaGUucHV0JyxcbiAgICAgICAgbWVzc2FnZTogJ0V4cGVjdGVkIGFuIGh0dHAvcyBzY2hlbWUgd2hlbiBtZXRob2QgaXMgbm90IEdFVCdcbiAgICAgIH0pXG4gICAgfVxuXG4gICAgLy8gNS5cbiAgICBjb25zdCBpbm5lclJlc3BvbnNlID0gcmVzcG9uc2Vba1N0YXRlXVxuXG4gICAgLy8gNi5cbiAgICBpZiAoaW5uZXJSZXNwb25zZS5zdGF0dXMgPT09IDIwNikge1xuICAgICAgdGhyb3cgd2ViaWRsLmVycm9ycy5leGNlcHRpb24oe1xuICAgICAgICBoZWFkZXI6ICdDYWNoZS5wdXQnLFxuICAgICAgICBtZXNzYWdlOiAnR290IDIwNiBzdGF0dXMnXG4gICAgICB9KVxuICAgIH1cblxuICAgIC8vIDcuXG4gICAgaWYgKGlubmVyUmVzcG9uc2UuaGVhZGVyc0xpc3QuY29udGFpbnMoJ3ZhcnknKSkge1xuICAgICAgLy8gNy4xLlxuICAgICAgY29uc3QgZmllbGRWYWx1ZXMgPSBnZXRGaWVsZFZhbHVlcyhpbm5lclJlc3BvbnNlLmhlYWRlcnNMaXN0LmdldCgndmFyeScpKVxuXG4gICAgICAvLyA3LjIuXG4gICAgICBmb3IgKGNvbnN0IGZpZWxkVmFsdWUgb2YgZmllbGRWYWx1ZXMpIHtcbiAgICAgICAgLy8gNy4yLjFcbiAgICAgICAgaWYgKGZpZWxkVmFsdWUgPT09ICcqJykge1xuICAgICAgICAgIHRocm93IHdlYmlkbC5lcnJvcnMuZXhjZXB0aW9uKHtcbiAgICAgICAgICAgIGhlYWRlcjogJ0NhY2hlLnB1dCcsXG4gICAgICAgICAgICBtZXNzYWdlOiAnR290ICogdmFyeSBmaWVsZCB2YWx1ZSdcbiAgICAgICAgICB9KVxuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuXG4gICAgLy8gOC5cbiAgICBpZiAoaW5uZXJSZXNwb25zZS5ib2R5ICYmIChpc0Rpc3R1cmJlZChpbm5lclJlc3BvbnNlLmJvZHkuc3RyZWFtKSB8fCBpbm5lclJlc3BvbnNlLmJvZHkuc3RyZWFtLmxvY2tlZCkpIHtcbiAgICAgIHRocm93IHdlYmlkbC5lcnJvcnMuZXhjZXB0aW9uKHtcbiAgICAgICAgaGVhZGVyOiAnQ2FjaGUucHV0JyxcbiAgICAgICAgbWVzc2FnZTogJ1Jlc3BvbnNlIGJvZHkgaXMgbG9ja2VkIG9yIGRpc3R1cmJlZCdcbiAgICAgIH0pXG4gICAgfVxuXG4gICAgLy8gOS5cbiAgICBjb25zdCBjbG9uZWRSZXNwb25zZSA9IGNsb25lUmVzcG9uc2UoaW5uZXJSZXNwb25zZSlcblxuICAgIC8vIDEwLlxuICAgIGNvbnN0IGJvZHlSZWFkUHJvbWlzZSA9IGNyZWF0ZURlZmVycmVkUHJvbWlzZSgpXG5cbiAgICAvLyAxMS5cbiAgICBpZiAoaW5uZXJSZXNwb25zZS5ib2R5ICE9IG51bGwpIHtcbiAgICAgIC8vIDExLjFcbiAgICAgIGNvbnN0IHN0cmVhbSA9IGlubmVyUmVzcG9uc2UuYm9keS5zdHJlYW1cblxuICAgICAgLy8gMTEuMlxuICAgICAgY29uc3QgcmVhZGVyID0gc3RyZWFtLmdldFJlYWRlcigpXG5cbiAgICAgIC8vIDExLjNcbiAgICAgIHJlYWRBbGxCeXRlcyhyZWFkZXIpLnRoZW4oYm9keVJlYWRQcm9taXNlLnJlc29sdmUsIGJvZHlSZWFkUHJvbWlzZS5yZWplY3QpXG4gICAgfSBlbHNlIHtcbiAgICAgIGJvZHlSZWFkUHJvbWlzZS5yZXNvbHZlKHVuZGVmaW5lZClcbiAgICB9XG5cbiAgICAvLyAxMi5cbiAgICAvKiogQHR5cGUge0NhY2hlQmF0Y2hPcGVyYXRpb25bXX0gKi9cbiAgICBjb25zdCBvcGVyYXRpb25zID0gW11cblxuICAgIC8vIDEzLlxuICAgIC8qKiBAdHlwZSB7Q2FjaGVCYXRjaE9wZXJhdGlvbn0gKi9cbiAgICBjb25zdCBvcGVyYXRpb24gPSB7XG4gICAgICB0eXBlOiAncHV0JywgLy8gMTQuXG4gICAgICByZXF1ZXN0OiBpbm5lclJlcXVlc3QsIC8vIDE1LlxuICAgICAgcmVzcG9uc2U6IGNsb25lZFJlc3BvbnNlIC8vIDE2LlxuICAgIH1cblxuICAgIC8vIDE3LlxuICAgIG9wZXJhdGlvbnMucHVzaChvcGVyYXRpb24pXG5cbiAgICAvLyAxOS5cbiAgICBjb25zdCBieXRlcyA9IGF3YWl0IGJvZHlSZWFkUHJvbWlzZS5wcm9taXNlXG5cbiAgICBpZiAoY2xvbmVkUmVzcG9uc2UuYm9keSAhPSBudWxsKSB7XG4gICAgICBjbG9uZWRSZXNwb25zZS5ib2R5LnNvdXJjZSA9IGJ5dGVzXG4gICAgfVxuXG4gICAgLy8gMTkuMVxuICAgIGNvbnN0IGNhY2hlSm9iUHJvbWlzZSA9IGNyZWF0ZURlZmVycmVkUHJvbWlzZSgpXG5cbiAgICAvLyAxOS4yLjFcbiAgICBsZXQgZXJyb3JEYXRhID0gbnVsbFxuXG4gICAgLy8gMTkuMi4yXG4gICAgdHJ5IHtcbiAgICAgIHRoaXMuI2JhdGNoQ2FjaGVPcGVyYXRpb25zKG9wZXJhdGlvbnMpXG4gICAgfSBjYXRjaCAoZSkge1xuICAgICAgZXJyb3JEYXRhID0gZVxuICAgIH1cblxuICAgIC8vIDE5LjIuM1xuICAgIHF1ZXVlTWljcm90YXNrKCgpID0+IHtcbiAgICAgIC8vIDE5LjIuMy4xXG4gICAgICBpZiAoZXJyb3JEYXRhID09PSBudWxsKSB7XG4gICAgICAgIGNhY2hlSm9iUHJvbWlzZS5yZXNvbHZlKClcbiAgICAgIH0gZWxzZSB7IC8vIDE5LjIuMy4yXG4gICAgICAgIGNhY2hlSm9iUHJvbWlzZS5yZWplY3QoZXJyb3JEYXRhKVxuICAgICAgfVxuICAgIH0pXG5cbiAgICByZXR1cm4gY2FjaGVKb2JQcm9taXNlLnByb21pc2VcbiAgfVxuXG4gIGFzeW5jIGRlbGV0ZSAocmVxdWVzdCwgb3B0aW9ucyA9IHt9KSB7XG4gICAgd2ViaWRsLmJyYW5kQ2hlY2sodGhpcywgQ2FjaGUpXG4gICAgd2ViaWRsLmFyZ3VtZW50TGVuZ3RoQ2hlY2soYXJndW1lbnRzLCAxLCB7IGhlYWRlcjogJ0NhY2hlLmRlbGV0ZScgfSlcblxuICAgIHJlcXVlc3QgPSB3ZWJpZGwuY29udmVydGVycy5SZXF1ZXN0SW5mbyhyZXF1ZXN0KVxuICAgIG9wdGlvbnMgPSB3ZWJpZGwuY29udmVydGVycy5DYWNoZVF1ZXJ5T3B0aW9ucyhvcHRpb25zKVxuXG4gICAgLyoqXG4gICAgICogQHR5cGUge1JlcXVlc3R9XG4gICAgICovXG4gICAgbGV0IHIgPSBudWxsXG5cbiAgICBpZiAocmVxdWVzdCBpbnN0YW5jZW9mIFJlcXVlc3QpIHtcbiAgICAgIHIgPSByZXF1ZXN0W2tTdGF0ZV1cblxuICAgICAgaWYgKHIubWV0aG9kICE9PSAnR0VUJyAmJiAhb3B0aW9ucy5pZ25vcmVNZXRob2QpIHtcbiAgICAgICAgcmV0dXJuIGZhbHNlXG4gICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgIGFzc2VydCh0eXBlb2YgcmVxdWVzdCA9PT0gJ3N0cmluZycpXG5cbiAgICAgIHIgPSBuZXcgUmVxdWVzdChyZXF1ZXN0KVtrU3RhdGVdXG4gICAgfVxuXG4gICAgLyoqIEB0eXBlIHtDYWNoZUJhdGNoT3BlcmF0aW9uW119ICovXG4gICAgY29uc3Qgb3BlcmF0aW9ucyA9IFtdXG5cbiAgICAvKiogQHR5cGUge0NhY2hlQmF0Y2hPcGVyYXRpb259ICovXG4gICAgY29uc3Qgb3BlcmF0aW9uID0ge1xuICAgICAgdHlwZTogJ2RlbGV0ZScsXG4gICAgICByZXF1ZXN0OiByLFxuICAgICAgb3B0aW9uc1xuICAgIH1cblxuICAgIG9wZXJhdGlvbnMucHVzaChvcGVyYXRpb24pXG5cbiAgICBjb25zdCBjYWNoZUpvYlByb21pc2UgPSBjcmVhdGVEZWZlcnJlZFByb21pc2UoKVxuXG4gICAgbGV0IGVycm9yRGF0YSA9IG51bGxcbiAgICBsZXQgcmVxdWVzdFJlc3BvbnNlc1xuXG4gICAgdHJ5IHtcbiAgICAgIHJlcXVlc3RSZXNwb25zZXMgPSB0aGlzLiNiYXRjaENhY2hlT3BlcmF0aW9ucyhvcGVyYXRpb25zKVxuICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgIGVycm9yRGF0YSA9IGVcbiAgICB9XG5cbiAgICBxdWV1ZU1pY3JvdGFzaygoKSA9PiB7XG4gICAgICBpZiAoZXJyb3JEYXRhID09PSBudWxsKSB7XG4gICAgICAgIGNhY2hlSm9iUHJvbWlzZS5yZXNvbHZlKCEhcmVxdWVzdFJlc3BvbnNlcz8ubGVuZ3RoKVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgY2FjaGVKb2JQcm9taXNlLnJlamVjdChlcnJvckRhdGEpXG4gICAgICB9XG4gICAgfSlcblxuICAgIHJldHVybiBjYWNoZUpvYlByb21pc2UucHJvbWlzZVxuICB9XG5cbiAgLyoqXG4gICAqIEBzZWUgaHR0cHM6Ly93M2MuZ2l0aHViLmlvL1NlcnZpY2VXb3JrZXIvI2RvbS1jYWNoZS1rZXlzXG4gICAqIEBwYXJhbSB7YW55fSByZXF1ZXN0XG4gICAqIEBwYXJhbSB7aW1wb3J0KCcuLi8uLi90eXBlcy9jYWNoZScpLkNhY2hlUXVlcnlPcHRpb25zfSBvcHRpb25zXG4gICAqIEByZXR1cm5zIHtyZWFkb25seSBSZXF1ZXN0W119XG4gICAqL1xuICBhc3luYyBrZXlzIChyZXF1ZXN0ID0gdW5kZWZpbmVkLCBvcHRpb25zID0ge30pIHtcbiAgICB3ZWJpZGwuYnJhbmRDaGVjayh0aGlzLCBDYWNoZSlcblxuICAgIGlmIChyZXF1ZXN0ICE9PSB1bmRlZmluZWQpIHJlcXVlc3QgPSB3ZWJpZGwuY29udmVydGVycy5SZXF1ZXN0SW5mbyhyZXF1ZXN0KVxuICAgIG9wdGlvbnMgPSB3ZWJpZGwuY29udmVydGVycy5DYWNoZVF1ZXJ5T3B0aW9ucyhvcHRpb25zKVxuXG4gICAgLy8gMS5cbiAgICBsZXQgciA9IG51bGxcblxuICAgIC8vIDIuXG4gICAgaWYgKHJlcXVlc3QgIT09IHVuZGVmaW5lZCkge1xuICAgICAgLy8gMi4xXG4gICAgICBpZiAocmVxdWVzdCBpbnN0YW5jZW9mIFJlcXVlc3QpIHtcbiAgICAgICAgLy8gMi4xLjFcbiAgICAgICAgciA9IHJlcXVlc3Rba1N0YXRlXVxuXG4gICAgICAgIC8vIDIuMS4yXG4gICAgICAgIGlmIChyLm1ldGhvZCAhPT0gJ0dFVCcgJiYgIW9wdGlvbnMuaWdub3JlTWV0aG9kKSB7XG4gICAgICAgICAgcmV0dXJuIFtdXG4gICAgICAgIH1cbiAgICAgIH0gZWxzZSBpZiAodHlwZW9mIHJlcXVlc3QgPT09ICdzdHJpbmcnKSB7IC8vIDIuMlxuICAgICAgICByID0gbmV3IFJlcXVlc3QocmVxdWVzdClba1N0YXRlXVxuICAgICAgfVxuICAgIH1cblxuICAgIC8vIDQuXG4gICAgY29uc3QgcHJvbWlzZSA9IGNyZWF0ZURlZmVycmVkUHJvbWlzZSgpXG5cbiAgICAvLyA1LlxuICAgIC8vIDUuMVxuICAgIGNvbnN0IHJlcXVlc3RzID0gW11cblxuICAgIC8vIDUuMlxuICAgIGlmIChyZXF1ZXN0ID09PSB1bmRlZmluZWQpIHtcbiAgICAgIC8vIDUuMi4xXG4gICAgICBmb3IgKGNvbnN0IHJlcXVlc3RSZXNwb25zZSBvZiB0aGlzLiNyZWxldmFudFJlcXVlc3RSZXNwb25zZUxpc3QpIHtcbiAgICAgICAgLy8gNS4yLjEuMVxuICAgICAgICByZXF1ZXN0cy5wdXNoKHJlcXVlc3RSZXNwb25zZVswXSlcbiAgICAgIH1cbiAgICB9IGVsc2UgeyAvLyA1LjNcbiAgICAgIC8vIDUuMy4xXG4gICAgICBjb25zdCByZXF1ZXN0UmVzcG9uc2VzID0gdGhpcy4jcXVlcnlDYWNoZShyLCBvcHRpb25zKVxuXG4gICAgICAvLyA1LjMuMlxuICAgICAgZm9yIChjb25zdCByZXF1ZXN0UmVzcG9uc2Ugb2YgcmVxdWVzdFJlc3BvbnNlcykge1xuICAgICAgICAvLyA1LjMuMi4xXG4gICAgICAgIHJlcXVlc3RzLnB1c2gocmVxdWVzdFJlc3BvbnNlWzBdKVxuICAgICAgfVxuICAgIH1cblxuICAgIC8vIDUuNFxuICAgIHF1ZXVlTWljcm90YXNrKCgpID0+IHtcbiAgICAgIC8vIDUuNC4xXG4gICAgICBjb25zdCByZXF1ZXN0TGlzdCA9IFtdXG5cbiAgICAgIC8vIDUuNC4yXG4gICAgICBmb3IgKGNvbnN0IHJlcXVlc3Qgb2YgcmVxdWVzdHMpIHtcbiAgICAgICAgY29uc3QgcmVxdWVzdE9iamVjdCA9IG5ldyBSZXF1ZXN0KCdodHRwczovL2EnKVxuICAgICAgICByZXF1ZXN0T2JqZWN0W2tTdGF0ZV0gPSByZXF1ZXN0XG4gICAgICAgIHJlcXVlc3RPYmplY3Rba0hlYWRlcnNdW2tIZWFkZXJzTGlzdF0gPSByZXF1ZXN0LmhlYWRlcnNMaXN0XG4gICAgICAgIHJlcXVlc3RPYmplY3Rba0hlYWRlcnNdW2tHdWFyZF0gPSAnaW1tdXRhYmxlJ1xuICAgICAgICByZXF1ZXN0T2JqZWN0W2tSZWFsbV0gPSByZXF1ZXN0LmNsaWVudFxuXG4gICAgICAgIC8vIDUuNC4yLjFcbiAgICAgICAgcmVxdWVzdExpc3QucHVzaChyZXF1ZXN0T2JqZWN0KVxuICAgICAgfVxuXG4gICAgICAvLyA1LjQuM1xuICAgICAgcHJvbWlzZS5yZXNvbHZlKE9iamVjdC5mcmVlemUocmVxdWVzdExpc3QpKVxuICAgIH0pXG5cbiAgICByZXR1cm4gcHJvbWlzZS5wcm9taXNlXG4gIH1cblxuICAvKipcbiAgICogQHNlZSBodHRwczovL3czYy5naXRodWIuaW8vU2VydmljZVdvcmtlci8jYmF0Y2gtY2FjaGUtb3BlcmF0aW9ucy1hbGdvcml0aG1cbiAgICogQHBhcmFtIHtDYWNoZUJhdGNoT3BlcmF0aW9uW119IG9wZXJhdGlvbnNcbiAgICogQHJldHVybnMge3JlcXVlc3RSZXNwb25zZUxpc3R9XG4gICAqL1xuICAjYmF0Y2hDYWNoZU9wZXJhdGlvbnMgKG9wZXJhdGlvbnMpIHtcbiAgICAvLyAxLlxuICAgIGNvbnN0IGNhY2hlID0gdGhpcy4jcmVsZXZhbnRSZXF1ZXN0UmVzcG9uc2VMaXN0XG5cbiAgICAvLyAyLlxuICAgIGNvbnN0IGJhY2t1cENhY2hlID0gWy4uLmNhY2hlXVxuXG4gICAgLy8gMy5cbiAgICBjb25zdCBhZGRlZEl0ZW1zID0gW11cblxuICAgIC8vIDQuMVxuICAgIGNvbnN0IHJlc3VsdExpc3QgPSBbXVxuXG4gICAgdHJ5IHtcbiAgICAgIC8vIDQuMlxuICAgICAgZm9yIChjb25zdCBvcGVyYXRpb24gb2Ygb3BlcmF0aW9ucykge1xuICAgICAgICAvLyA0LjIuMVxuICAgICAgICBpZiAob3BlcmF0aW9uLnR5cGUgIT09ICdkZWxldGUnICYmIG9wZXJhdGlvbi50eXBlICE9PSAncHV0Jykge1xuICAgICAgICAgIHRocm93IHdlYmlkbC5lcnJvcnMuZXhjZXB0aW9uKHtcbiAgICAgICAgICAgIGhlYWRlcjogJ0NhY2hlLiNiYXRjaENhY2hlT3BlcmF0aW9ucycsXG4gICAgICAgICAgICBtZXNzYWdlOiAnb3BlcmF0aW9uIHR5cGUgZG9lcyBub3QgbWF0Y2ggXCJkZWxldGVcIiBvciBcInB1dFwiJ1xuICAgICAgICAgIH0pXG4gICAgICAgIH1cblxuICAgICAgICAvLyA0LjIuMlxuICAgICAgICBpZiAob3BlcmF0aW9uLnR5cGUgPT09ICdkZWxldGUnICYmIG9wZXJhdGlvbi5yZXNwb25zZSAhPSBudWxsKSB7XG4gICAgICAgICAgdGhyb3cgd2ViaWRsLmVycm9ycy5leGNlcHRpb24oe1xuICAgICAgICAgICAgaGVhZGVyOiAnQ2FjaGUuI2JhdGNoQ2FjaGVPcGVyYXRpb25zJyxcbiAgICAgICAgICAgIG1lc3NhZ2U6ICdkZWxldGUgb3BlcmF0aW9uIHNob3VsZCBub3QgaGF2ZSBhbiBhc3NvY2lhdGVkIHJlc3BvbnNlJ1xuICAgICAgICAgIH0pXG4gICAgICAgIH1cblxuICAgICAgICAvLyA0LjIuM1xuICAgICAgICBpZiAodGhpcy4jcXVlcnlDYWNoZShvcGVyYXRpb24ucmVxdWVzdCwgb3BlcmF0aW9uLm9wdGlvbnMsIGFkZGVkSXRlbXMpLmxlbmd0aCkge1xuICAgICAgICAgIHRocm93IG5ldyBET01FeGNlcHRpb24oJz8/PycsICdJbnZhbGlkU3RhdGVFcnJvcicpXG4gICAgICAgIH1cblxuICAgICAgICAvLyA0LjIuNFxuICAgICAgICBsZXQgcmVxdWVzdFJlc3BvbnNlc1xuXG4gICAgICAgIC8vIDQuMi41XG4gICAgICAgIGlmIChvcGVyYXRpb24udHlwZSA9PT0gJ2RlbGV0ZScpIHtcbiAgICAgICAgICAvLyA0LjIuNS4xXG4gICAgICAgICAgcmVxdWVzdFJlc3BvbnNlcyA9IHRoaXMuI3F1ZXJ5Q2FjaGUob3BlcmF0aW9uLnJlcXVlc3QsIG9wZXJhdGlvbi5vcHRpb25zKVxuXG4gICAgICAgICAgLy8gVE9ETzogdGhlIHNwZWMgaXMgd3JvbmcsIHRoaXMgaXMgbmVlZGVkIHRvIHBhc3MgV1BUc1xuICAgICAgICAgIGlmIChyZXF1ZXN0UmVzcG9uc2VzLmxlbmd0aCA9PT0gMCkge1xuICAgICAgICAgICAgcmV0dXJuIFtdXG4gICAgICAgICAgfVxuXG4gICAgICAgICAgLy8gNC4yLjUuMlxuICAgICAgICAgIGZvciAoY29uc3QgcmVxdWVzdFJlc3BvbnNlIG9mIHJlcXVlc3RSZXNwb25zZXMpIHtcbiAgICAgICAgICAgIGNvbnN0IGlkeCA9IGNhY2hlLmluZGV4T2YocmVxdWVzdFJlc3BvbnNlKVxuICAgICAgICAgICAgYXNzZXJ0KGlkeCAhPT0gLTEpXG5cbiAgICAgICAgICAgIC8vIDQuMi41LjIuMVxuICAgICAgICAgICAgY2FjaGUuc3BsaWNlKGlkeCwgMSlcbiAgICAgICAgICB9XG4gICAgICAgIH0gZWxzZSBpZiAob3BlcmF0aW9uLnR5cGUgPT09ICdwdXQnKSB7IC8vIDQuMi42XG4gICAgICAgICAgLy8gNC4yLjYuMVxuICAgICAgICAgIGlmIChvcGVyYXRpb24ucmVzcG9uc2UgPT0gbnVsbCkge1xuICAgICAgICAgICAgdGhyb3cgd2ViaWRsLmVycm9ycy5leGNlcHRpb24oe1xuICAgICAgICAgICAgICBoZWFkZXI6ICdDYWNoZS4jYmF0Y2hDYWNoZU9wZXJhdGlvbnMnLFxuICAgICAgICAgICAgICBtZXNzYWdlOiAncHV0IG9wZXJhdGlvbiBzaG91bGQgaGF2ZSBhbiBhc3NvY2lhdGVkIHJlc3BvbnNlJ1xuICAgICAgICAgICAgfSlcbiAgICAgICAgICB9XG5cbiAgICAgICAgICAvLyA0LjIuNi4yXG4gICAgICAgICAgY29uc3QgciA9IG9wZXJhdGlvbi5yZXF1ZXN0XG5cbiAgICAgICAgICAvLyA0LjIuNi4zXG4gICAgICAgICAgaWYgKCF1cmxJc0h0dHBIdHRwc1NjaGVtZShyLnVybCkpIHtcbiAgICAgICAgICAgIHRocm93IHdlYmlkbC5lcnJvcnMuZXhjZXB0aW9uKHtcbiAgICAgICAgICAgICAgaGVhZGVyOiAnQ2FjaGUuI2JhdGNoQ2FjaGVPcGVyYXRpb25zJyxcbiAgICAgICAgICAgICAgbWVzc2FnZTogJ2V4cGVjdGVkIGh0dHAgb3IgaHR0cHMgc2NoZW1lJ1xuICAgICAgICAgICAgfSlcbiAgICAgICAgICB9XG5cbiAgICAgICAgICAvLyA0LjIuNi40XG4gICAgICAgICAgaWYgKHIubWV0aG9kICE9PSAnR0VUJykge1xuICAgICAgICAgICAgdGhyb3cgd2ViaWRsLmVycm9ycy5leGNlcHRpb24oe1xuICAgICAgICAgICAgICBoZWFkZXI6ICdDYWNoZS4jYmF0Y2hDYWNoZU9wZXJhdGlvbnMnLFxuICAgICAgICAgICAgICBtZXNzYWdlOiAnbm90IGdldCBtZXRob2QnXG4gICAgICAgICAgICB9KVxuICAgICAgICAgIH1cblxuICAgICAgICAgIC8vIDQuMi42LjVcbiAgICAgICAgICBpZiAob3BlcmF0aW9uLm9wdGlvbnMgIT0gbnVsbCkge1xuICAgICAgICAgICAgdGhyb3cgd2ViaWRsLmVycm9ycy5leGNlcHRpb24oe1xuICAgICAgICAgICAgICBoZWFkZXI6ICdDYWNoZS4jYmF0Y2hDYWNoZU9wZXJhdGlvbnMnLFxuICAgICAgICAgICAgICBtZXNzYWdlOiAnb3B0aW9ucyBtdXN0IG5vdCBiZSBkZWZpbmVkJ1xuICAgICAgICAgICAgfSlcbiAgICAgICAgICB9XG5cbiAgICAgICAgICAvLyA0LjIuNi42XG4gICAgICAgICAgcmVxdWVzdFJlc3BvbnNlcyA9IHRoaXMuI3F1ZXJ5Q2FjaGUob3BlcmF0aW9uLnJlcXVlc3QpXG5cbiAgICAgICAgICAvLyA0LjIuNi43XG4gICAgICAgICAgZm9yIChjb25zdCByZXF1ZXN0UmVzcG9uc2Ugb2YgcmVxdWVzdFJlc3BvbnNlcykge1xuICAgICAgICAgICAgY29uc3QgaWR4ID0gY2FjaGUuaW5kZXhPZihyZXF1ZXN0UmVzcG9uc2UpXG4gICAgICAgICAgICBhc3NlcnQoaWR4ICE9PSAtMSlcblxuICAgICAgICAgICAgLy8gNC4yLjYuNy4xXG4gICAgICAgICAgICBjYWNoZS5zcGxpY2UoaWR4LCAxKVxuICAgICAgICAgIH1cblxuICAgICAgICAgIC8vIDQuMi42LjhcbiAgICAgICAgICBjYWNoZS5wdXNoKFtvcGVyYXRpb24ucmVxdWVzdCwgb3BlcmF0aW9uLnJlc3BvbnNlXSlcblxuICAgICAgICAgIC8vIDQuMi42LjEwXG4gICAgICAgICAgYWRkZWRJdGVtcy5wdXNoKFtvcGVyYXRpb24ucmVxdWVzdCwgb3BlcmF0aW9uLnJlc3BvbnNlXSlcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIDQuMi43XG4gICAgICAgIHJlc3VsdExpc3QucHVzaChbb3BlcmF0aW9uLnJlcXVlc3QsIG9wZXJhdGlvbi5yZXNwb25zZV0pXG4gICAgICB9XG5cbiAgICAgIC8vIDQuM1xuICAgICAgcmV0dXJuIHJlc3VsdExpc3RcbiAgICB9IGNhdGNoIChlKSB7IC8vIDUuXG4gICAgICAvLyA1LjFcbiAgICAgIHRoaXMuI3JlbGV2YW50UmVxdWVzdFJlc3BvbnNlTGlzdC5sZW5ndGggPSAwXG5cbiAgICAgIC8vIDUuMlxuICAgICAgdGhpcy4jcmVsZXZhbnRSZXF1ZXN0UmVzcG9uc2VMaXN0ID0gYmFja3VwQ2FjaGVcblxuICAgICAgLy8gNS4zXG4gICAgICB0aHJvdyBlXG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIEBzZWUgaHR0cHM6Ly93M2MuZ2l0aHViLmlvL1NlcnZpY2VXb3JrZXIvI3F1ZXJ5LWNhY2hlXG4gICAqIEBwYXJhbSB7YW55fSByZXF1ZXN0UXVlcnlcbiAgICogQHBhcmFtIHtpbXBvcnQoJy4uLy4uL3R5cGVzL2NhY2hlJykuQ2FjaGVRdWVyeU9wdGlvbnN9IG9wdGlvbnNcbiAgICogQHBhcmFtIHtyZXF1ZXN0UmVzcG9uc2VMaXN0fSB0YXJnZXRTdG9yYWdlXG4gICAqIEByZXR1cm5zIHtyZXF1ZXN0UmVzcG9uc2VMaXN0fVxuICAgKi9cbiAgI3F1ZXJ5Q2FjaGUgKHJlcXVlc3RRdWVyeSwgb3B0aW9ucywgdGFyZ2V0U3RvcmFnZSkge1xuICAgIC8qKiBAdHlwZSB7cmVxdWVzdFJlc3BvbnNlTGlzdH0gKi9cbiAgICBjb25zdCByZXN1bHRMaXN0ID0gW11cblxuICAgIGNvbnN0IHN0b3JhZ2UgPSB0YXJnZXRTdG9yYWdlID8/IHRoaXMuI3JlbGV2YW50UmVxdWVzdFJlc3BvbnNlTGlzdFxuXG4gICAgZm9yIChjb25zdCByZXF1ZXN0UmVzcG9uc2Ugb2Ygc3RvcmFnZSkge1xuICAgICAgY29uc3QgW2NhY2hlZFJlcXVlc3QsIGNhY2hlZFJlc3BvbnNlXSA9IHJlcXVlc3RSZXNwb25zZVxuICAgICAgaWYgKHRoaXMuI3JlcXVlc3RNYXRjaGVzQ2FjaGVkSXRlbShyZXF1ZXN0UXVlcnksIGNhY2hlZFJlcXVlc3QsIGNhY2hlZFJlc3BvbnNlLCBvcHRpb25zKSkge1xuICAgICAgICByZXN1bHRMaXN0LnB1c2gocmVxdWVzdFJlc3BvbnNlKVxuICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiByZXN1bHRMaXN0XG4gIH1cblxuICAvKipcbiAgICogQHNlZSBodHRwczovL3czYy5naXRodWIuaW8vU2VydmljZVdvcmtlci8jcmVxdWVzdC1tYXRjaGVzLWNhY2hlZC1pdGVtLWFsZ29yaXRobVxuICAgKiBAcGFyYW0ge2FueX0gcmVxdWVzdFF1ZXJ5XG4gICAqIEBwYXJhbSB7YW55fSByZXF1ZXN0XG4gICAqIEBwYXJhbSB7YW55IHwgbnVsbH0gcmVzcG9uc2VcbiAgICogQHBhcmFtIHtpbXBvcnQoJy4uLy4uL3R5cGVzL2NhY2hlJykuQ2FjaGVRdWVyeU9wdGlvbnMgfCB1bmRlZmluZWR9IG9wdGlvbnNcbiAgICogQHJldHVybnMge2Jvb2xlYW59XG4gICAqL1xuICAjcmVxdWVzdE1hdGNoZXNDYWNoZWRJdGVtIChyZXF1ZXN0UXVlcnksIHJlcXVlc3QsIHJlc3BvbnNlID0gbnVsbCwgb3B0aW9ucykge1xuICAgIC8vIGlmIChvcHRpb25zPy5pZ25vcmVNZXRob2QgPT09IGZhbHNlICYmIHJlcXVlc3QubWV0aG9kID09PSAnR0VUJykge1xuICAgIC8vICAgcmV0dXJuIGZhbHNlXG4gICAgLy8gfVxuXG4gICAgY29uc3QgcXVlcnlVUkwgPSBuZXcgVVJMKHJlcXVlc3RRdWVyeS51cmwpXG5cbiAgICBjb25zdCBjYWNoZWRVUkwgPSBuZXcgVVJMKHJlcXVlc3QudXJsKVxuXG4gICAgaWYgKG9wdGlvbnM/Lmlnbm9yZVNlYXJjaCkge1xuICAgICAgY2FjaGVkVVJMLnNlYXJjaCA9ICcnXG5cbiAgICAgIHF1ZXJ5VVJMLnNlYXJjaCA9ICcnXG4gICAgfVxuXG4gICAgaWYgKCF1cmxFcXVhbHMocXVlcnlVUkwsIGNhY2hlZFVSTCwgdHJ1ZSkpIHtcbiAgICAgIHJldHVybiBmYWxzZVxuICAgIH1cblxuICAgIGlmIChcbiAgICAgIHJlc3BvbnNlID09IG51bGwgfHxcbiAgICAgIG9wdGlvbnM/Lmlnbm9yZVZhcnkgfHxcbiAgICAgICFyZXNwb25zZS5oZWFkZXJzTGlzdC5jb250YWlucygndmFyeScpXG4gICAgKSB7XG4gICAgICByZXR1cm4gdHJ1ZVxuICAgIH1cblxuICAgIGNvbnN0IGZpZWxkVmFsdWVzID0gZ2V0RmllbGRWYWx1ZXMocmVzcG9uc2UuaGVhZGVyc0xpc3QuZ2V0KCd2YXJ5JykpXG5cbiAgICBmb3IgKGNvbnN0IGZpZWxkVmFsdWUgb2YgZmllbGRWYWx1ZXMpIHtcbiAgICAgIGlmIChmaWVsZFZhbHVlID09PSAnKicpIHtcbiAgICAgICAgcmV0dXJuIGZhbHNlXG4gICAgICB9XG5cbiAgICAgIGNvbnN0IHJlcXVlc3RWYWx1ZSA9IHJlcXVlc3QuaGVhZGVyc0xpc3QuZ2V0KGZpZWxkVmFsdWUpXG4gICAgICBjb25zdCBxdWVyeVZhbHVlID0gcmVxdWVzdFF1ZXJ5LmhlYWRlcnNMaXN0LmdldChmaWVsZFZhbHVlKVxuXG4gICAgICAvLyBJZiBvbmUgaGFzIHRoZSBoZWFkZXIgYW5kIHRoZSBvdGhlciBkb2Vzbid0LCBvciBvbmUgaGFzXG4gICAgICAvLyBhIGRpZmZlcmVudCB2YWx1ZSB0aGFuIHRoZSBvdGhlciwgcmV0dXJuIGZhbHNlXG4gICAgICBpZiAocmVxdWVzdFZhbHVlICE9PSBxdWVyeVZhbHVlKSB7XG4gICAgICAgIHJldHVybiBmYWxzZVxuICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiB0cnVlXG4gIH1cbn1cblxuT2JqZWN0LmRlZmluZVByb3BlcnRpZXMoQ2FjaGUucHJvdG90eXBlLCB7XG4gIFtTeW1ib2wudG9TdHJpbmdUYWddOiB7XG4gICAgdmFsdWU6ICdDYWNoZScsXG4gICAgY29uZmlndXJhYmxlOiB0cnVlXG4gIH0sXG4gIG1hdGNoOiBrRW51bWVyYWJsZVByb3BlcnR5LFxuICBtYXRjaEFsbDoga0VudW1lcmFibGVQcm9wZXJ0eSxcbiAgYWRkOiBrRW51bWVyYWJsZVByb3BlcnR5LFxuICBhZGRBbGw6IGtFbnVtZXJhYmxlUHJvcGVydHksXG4gIHB1dDoga0VudW1lcmFibGVQcm9wZXJ0eSxcbiAgZGVsZXRlOiBrRW51bWVyYWJsZVByb3BlcnR5LFxuICBrZXlzOiBrRW51bWVyYWJsZVByb3BlcnR5XG59KVxuXG5jb25zdCBjYWNoZVF1ZXJ5T3B0aW9uQ29udmVydGVycyA9IFtcbiAge1xuICAgIGtleTogJ2lnbm9yZVNlYXJjaCcsXG4gICAgY29udmVydGVyOiB3ZWJpZGwuY29udmVydGVycy5ib29sZWFuLFxuICAgIGRlZmF1bHRWYWx1ZTogZmFsc2VcbiAgfSxcbiAge1xuICAgIGtleTogJ2lnbm9yZU1ldGhvZCcsXG4gICAgY29udmVydGVyOiB3ZWJpZGwuY29udmVydGVycy5ib29sZWFuLFxuICAgIGRlZmF1bHRWYWx1ZTogZmFsc2VcbiAgfSxcbiAge1xuICAgIGtleTogJ2lnbm9yZVZhcnknLFxuICAgIGNvbnZlcnRlcjogd2ViaWRsLmNvbnZlcnRlcnMuYm9vbGVhbixcbiAgICBkZWZhdWx0VmFsdWU6IGZhbHNlXG4gIH1cbl1cblxud2ViaWRsLmNvbnZlcnRlcnMuQ2FjaGVRdWVyeU9wdGlvbnMgPSB3ZWJpZGwuZGljdGlvbmFyeUNvbnZlcnRlcihjYWNoZVF1ZXJ5T3B0aW9uQ29udmVydGVycylcblxud2ViaWRsLmNvbnZlcnRlcnMuTXVsdGlDYWNoZVF1ZXJ5T3B0aW9ucyA9IHdlYmlkbC5kaWN0aW9uYXJ5Q29udmVydGVyKFtcbiAgLi4uY2FjaGVRdWVyeU9wdGlvbkNvbnZlcnRlcnMsXG4gIHtcbiAgICBrZXk6ICdjYWNoZU5hbWUnLFxuICAgIGNvbnZlcnRlcjogd2ViaWRsLmNvbnZlcnRlcnMuRE9NU3RyaW5nXG4gIH1cbl0pXG5cbndlYmlkbC5jb252ZXJ0ZXJzLlJlc3BvbnNlID0gd2ViaWRsLmludGVyZmFjZUNvbnZlcnRlcihSZXNwb25zZSlcblxud2ViaWRsLmNvbnZlcnRlcnNbJ3NlcXVlbmNlPFJlcXVlc3RJbmZvPiddID0gd2ViaWRsLnNlcXVlbmNlQ29udmVydGVyKFxuICB3ZWJpZGwuY29udmVydGVycy5SZXF1ZXN0SW5mb1xuKVxuXG5tb2R1bGUuZXhwb3J0cyA9IHtcbiAgQ2FjaGVcbn1cbiIsCiAgICAiJ3VzZSBzdHJpY3QnXG5cbmNvbnN0IHsga0NvbnN0cnVjdCB9ID0gcmVxdWlyZSgnLi9zeW1ib2xzJylcbmNvbnN0IHsgQ2FjaGUgfSA9IHJlcXVpcmUoJy4vY2FjaGUnKVxuY29uc3QgeyB3ZWJpZGwgfSA9IHJlcXVpcmUoJy4uL2ZldGNoL3dlYmlkbCcpXG5jb25zdCB7IGtFbnVtZXJhYmxlUHJvcGVydHkgfSA9IHJlcXVpcmUoJy4uL2NvcmUvdXRpbCcpXG5cbmNsYXNzIENhY2hlU3RvcmFnZSB7XG4gIC8qKlxuICAgKiBAc2VlIGh0dHBzOi8vdzNjLmdpdGh1Yi5pby9TZXJ2aWNlV29ya2VyLyNkZm4tcmVsZXZhbnQtbmFtZS10by1jYWNoZS1tYXBcbiAgICogQHR5cGUge01hcDxzdHJpbmcsIGltcG9ydCgnLi9jYWNoZScpLnJlcXVlc3RSZXNwb25zZUxpc3R9XG4gICAqL1xuICAjY2FjaGVzID0gbmV3IE1hcCgpXG5cbiAgY29uc3RydWN0b3IgKCkge1xuICAgIGlmIChhcmd1bWVudHNbMF0gIT09IGtDb25zdHJ1Y3QpIHtcbiAgICAgIHdlYmlkbC5pbGxlZ2FsQ29uc3RydWN0b3IoKVxuICAgIH1cbiAgfVxuXG4gIGFzeW5jIG1hdGNoIChyZXF1ZXN0LCBvcHRpb25zID0ge30pIHtcbiAgICB3ZWJpZGwuYnJhbmRDaGVjayh0aGlzLCBDYWNoZVN0b3JhZ2UpXG4gICAgd2ViaWRsLmFyZ3VtZW50TGVuZ3RoQ2hlY2soYXJndW1lbnRzLCAxLCB7IGhlYWRlcjogJ0NhY2hlU3RvcmFnZS5tYXRjaCcgfSlcblxuICAgIHJlcXVlc3QgPSB3ZWJpZGwuY29udmVydGVycy5SZXF1ZXN0SW5mbyhyZXF1ZXN0KVxuICAgIG9wdGlvbnMgPSB3ZWJpZGwuY29udmVydGVycy5NdWx0aUNhY2hlUXVlcnlPcHRpb25zKG9wdGlvbnMpXG5cbiAgICAvLyAxLlxuICAgIGlmIChvcHRpb25zLmNhY2hlTmFtZSAhPSBudWxsKSB7XG4gICAgICAvLyAxLjEuMS4xXG4gICAgICBpZiAodGhpcy4jY2FjaGVzLmhhcyhvcHRpb25zLmNhY2hlTmFtZSkpIHtcbiAgICAgICAgLy8gMS4xLjEuMS4xXG4gICAgICAgIGNvbnN0IGNhY2hlTGlzdCA9IHRoaXMuI2NhY2hlcy5nZXQob3B0aW9ucy5jYWNoZU5hbWUpXG4gICAgICAgIGNvbnN0IGNhY2hlID0gbmV3IENhY2hlKGtDb25zdHJ1Y3QsIGNhY2hlTGlzdClcblxuICAgICAgICByZXR1cm4gYXdhaXQgY2FjaGUubWF0Y2gocmVxdWVzdCwgb3B0aW9ucylcbiAgICAgIH1cbiAgICB9IGVsc2UgeyAvLyAyLlxuICAgICAgLy8gMi4yXG4gICAgICBmb3IgKGNvbnN0IGNhY2hlTGlzdCBvZiB0aGlzLiNjYWNoZXMudmFsdWVzKCkpIHtcbiAgICAgICAgY29uc3QgY2FjaGUgPSBuZXcgQ2FjaGUoa0NvbnN0cnVjdCwgY2FjaGVMaXN0KVxuXG4gICAgICAgIC8vIDIuMi4xLjJcbiAgICAgICAgY29uc3QgcmVzcG9uc2UgPSBhd2FpdCBjYWNoZS5tYXRjaChyZXF1ZXN0LCBvcHRpb25zKVxuXG4gICAgICAgIGlmIChyZXNwb25zZSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgcmV0dXJuIHJlc3BvbnNlXG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogQHNlZSBodHRwczovL3czYy5naXRodWIuaW8vU2VydmljZVdvcmtlci8jY2FjaGUtc3RvcmFnZS1oYXNcbiAgICogQHBhcmFtIHtzdHJpbmd9IGNhY2hlTmFtZVxuICAgKiBAcmV0dXJucyB7UHJvbWlzZTxib29sZWFuPn1cbiAgICovXG4gIGFzeW5jIGhhcyAoY2FjaGVOYW1lKSB7XG4gICAgd2ViaWRsLmJyYW5kQ2hlY2sodGhpcywgQ2FjaGVTdG9yYWdlKVxuICAgIHdlYmlkbC5hcmd1bWVudExlbmd0aENoZWNrKGFyZ3VtZW50cywgMSwgeyBoZWFkZXI6ICdDYWNoZVN0b3JhZ2UuaGFzJyB9KVxuXG4gICAgY2FjaGVOYW1lID0gd2ViaWRsLmNvbnZlcnRlcnMuRE9NU3RyaW5nKGNhY2hlTmFtZSlcblxuICAgIC8vIDIuMS4xXG4gICAgLy8gMi4yXG4gICAgcmV0dXJuIHRoaXMuI2NhY2hlcy5oYXMoY2FjaGVOYW1lKVxuICB9XG5cbiAgLyoqXG4gICAqIEBzZWUgaHR0cHM6Ly93M2MuZ2l0aHViLmlvL1NlcnZpY2VXb3JrZXIvI2RvbS1jYWNoZXN0b3JhZ2Utb3BlblxuICAgKiBAcGFyYW0ge3N0cmluZ30gY2FjaGVOYW1lXG4gICAqIEByZXR1cm5zIHtQcm9taXNlPENhY2hlPn1cbiAgICovXG4gIGFzeW5jIG9wZW4gKGNhY2hlTmFtZSkge1xuICAgIHdlYmlkbC5icmFuZENoZWNrKHRoaXMsIENhY2hlU3RvcmFnZSlcbiAgICB3ZWJpZGwuYXJndW1lbnRMZW5ndGhDaGVjayhhcmd1bWVudHMsIDEsIHsgaGVhZGVyOiAnQ2FjaGVTdG9yYWdlLm9wZW4nIH0pXG5cbiAgICBjYWNoZU5hbWUgPSB3ZWJpZGwuY29udmVydGVycy5ET01TdHJpbmcoY2FjaGVOYW1lKVxuXG4gICAgLy8gMi4xXG4gICAgaWYgKHRoaXMuI2NhY2hlcy5oYXMoY2FjaGVOYW1lKSkge1xuICAgICAgLy8gYXdhaXQgY2FjaGVzLm9wZW4oJ3YxJykgIT09IGF3YWl0IGNhY2hlcy5vcGVuKCd2MScpXG5cbiAgICAgIC8vIDIuMS4xXG4gICAgICBjb25zdCBjYWNoZSA9IHRoaXMuI2NhY2hlcy5nZXQoY2FjaGVOYW1lKVxuXG4gICAgICAvLyAyLjEuMS4xXG4gICAgICByZXR1cm4gbmV3IENhY2hlKGtDb25zdHJ1Y3QsIGNhY2hlKVxuICAgIH1cblxuICAgIC8vIDIuMlxuICAgIGNvbnN0IGNhY2hlID0gW11cblxuICAgIC8vIDIuM1xuICAgIHRoaXMuI2NhY2hlcy5zZXQoY2FjaGVOYW1lLCBjYWNoZSlcblxuICAgIC8vIDIuNFxuICAgIHJldHVybiBuZXcgQ2FjaGUoa0NvbnN0cnVjdCwgY2FjaGUpXG4gIH1cblxuICAvKipcbiAgICogQHNlZSBodHRwczovL3czYy5naXRodWIuaW8vU2VydmljZVdvcmtlci8jY2FjaGUtc3RvcmFnZS1kZWxldGVcbiAgICogQHBhcmFtIHtzdHJpbmd9IGNhY2hlTmFtZVxuICAgKiBAcmV0dXJucyB7UHJvbWlzZTxib29sZWFuPn1cbiAgICovXG4gIGFzeW5jIGRlbGV0ZSAoY2FjaGVOYW1lKSB7XG4gICAgd2ViaWRsLmJyYW5kQ2hlY2sodGhpcywgQ2FjaGVTdG9yYWdlKVxuICAgIHdlYmlkbC5hcmd1bWVudExlbmd0aENoZWNrKGFyZ3VtZW50cywgMSwgeyBoZWFkZXI6ICdDYWNoZVN0b3JhZ2UuZGVsZXRlJyB9KVxuXG4gICAgY2FjaGVOYW1lID0gd2ViaWRsLmNvbnZlcnRlcnMuRE9NU3RyaW5nKGNhY2hlTmFtZSlcblxuICAgIHJldHVybiB0aGlzLiNjYWNoZXMuZGVsZXRlKGNhY2hlTmFtZSlcbiAgfVxuXG4gIC8qKlxuICAgKiBAc2VlIGh0dHBzOi8vdzNjLmdpdGh1Yi5pby9TZXJ2aWNlV29ya2VyLyNjYWNoZS1zdG9yYWdlLWtleXNcbiAgICogQHJldHVybnMge3N0cmluZ1tdfVxuICAgKi9cbiAgYXN5bmMga2V5cyAoKSB7XG4gICAgd2ViaWRsLmJyYW5kQ2hlY2sodGhpcywgQ2FjaGVTdG9yYWdlKVxuXG4gICAgLy8gMi4xXG4gICAgY29uc3Qga2V5cyA9IHRoaXMuI2NhY2hlcy5rZXlzKClcblxuICAgIC8vIDIuMlxuICAgIHJldHVybiBbLi4ua2V5c11cbiAgfVxufVxuXG5PYmplY3QuZGVmaW5lUHJvcGVydGllcyhDYWNoZVN0b3JhZ2UucHJvdG90eXBlLCB7XG4gIFtTeW1ib2wudG9TdHJpbmdUYWddOiB7XG4gICAgdmFsdWU6ICdDYWNoZVN0b3JhZ2UnLFxuICAgIGNvbmZpZ3VyYWJsZTogdHJ1ZVxuICB9LFxuICBtYXRjaDoga0VudW1lcmFibGVQcm9wZXJ0eSxcbiAgaGFzOiBrRW51bWVyYWJsZVByb3BlcnR5LFxuICBvcGVuOiBrRW51bWVyYWJsZVByb3BlcnR5LFxuICBkZWxldGU6IGtFbnVtZXJhYmxlUHJvcGVydHksXG4gIGtleXM6IGtFbnVtZXJhYmxlUHJvcGVydHlcbn0pXG5cbm1vZHVsZS5leHBvcnRzID0ge1xuICBDYWNoZVN0b3JhZ2Vcbn1cbiIsCiAgICAiJ3VzZSBzdHJpY3QnXG5cbi8vIGh0dHBzOi8vd2ljZy5naXRodWIuaW8vY29va2llLXN0b3JlLyNjb29raWUtbWF4aW11bS1hdHRyaWJ1dGUtdmFsdWUtc2l6ZVxuY29uc3QgbWF4QXR0cmlidXRlVmFsdWVTaXplID0gMTAyNFxuXG4vLyBodHRwczovL3dpY2cuZ2l0aHViLmlvL2Nvb2tpZS1zdG9yZS8jY29va2llLW1heGltdW0tbmFtZS12YWx1ZS1wYWlyLXNpemVcbmNvbnN0IG1heE5hbWVWYWx1ZVBhaXJTaXplID0gNDA5NlxuXG5tb2R1bGUuZXhwb3J0cyA9IHtcbiAgbWF4QXR0cmlidXRlVmFsdWVTaXplLFxuICBtYXhOYW1lVmFsdWVQYWlyU2l6ZVxufVxuIiwKICAgICIndXNlIHN0cmljdCdcblxuY29uc3QgYXNzZXJ0ID0gcmVxdWlyZSgnYXNzZXJ0JylcbmNvbnN0IHsga0hlYWRlcnNMaXN0IH0gPSByZXF1aXJlKCcuLi9jb3JlL3N5bWJvbHMnKVxuXG5mdW5jdGlvbiBpc0NUTEV4Y2x1ZGluZ0h0YWIgKHZhbHVlKSB7XG4gIGlmICh2YWx1ZS5sZW5ndGggPT09IDApIHtcbiAgICByZXR1cm4gZmFsc2VcbiAgfVxuXG4gIGZvciAoY29uc3QgY2hhciBvZiB2YWx1ZSkge1xuICAgIGNvbnN0IGNvZGUgPSBjaGFyLmNoYXJDb2RlQXQoMClcblxuICAgIGlmIChcbiAgICAgIChjb2RlID49IDB4MDAgfHwgY29kZSA8PSAweDA4KSB8fFxuICAgICAgKGNvZGUgPj0gMHgwQSB8fCBjb2RlIDw9IDB4MUYpIHx8XG4gICAgICBjb2RlID09PSAweDdGXG4gICAgKSB7XG4gICAgICByZXR1cm4gZmFsc2VcbiAgICB9XG4gIH1cbn1cblxuLyoqXG4gQ0hBUiAgICAgICAgICAgPSA8YW55IFVTLUFTQ0lJIGNoYXJhY3RlciAob2N0ZXRzIDAgLSAxMjcpPlxuIHRva2VuICAgICAgICAgID0gMSo8YW55IENIQVIgZXhjZXB0IENUTHMgb3Igc2VwYXJhdG9ycz5cbiBzZXBhcmF0b3JzICAgICA9IFwiKFwiIHwgXCIpXCIgfCBcIjxcIiB8IFwiPlwiIHwgXCJAXCJcbiAgICAgICAgICAgICAgICB8IFwiLFwiIHwgXCI7XCIgfCBcIjpcIiB8IFwiXFxcIiB8IDxcIj5cbiAgICAgICAgICAgICAgICB8IFwiL1wiIHwgXCJbXCIgfCBcIl1cIiB8IFwiP1wiIHwgXCI9XCJcbiAgICAgICAgICAgICAgICB8IFwie1wiIHwgXCJ9XCIgfCBTUCB8IEhUXG4gKiBAcGFyYW0ge3N0cmluZ30gbmFtZVxuICovXG5mdW5jdGlvbiB2YWxpZGF0ZUNvb2tpZU5hbWUgKG5hbWUpIHtcbiAgZm9yIChjb25zdCBjaGFyIG9mIG5hbWUpIHtcbiAgICBjb25zdCBjb2RlID0gY2hhci5jaGFyQ29kZUF0KDApXG5cbiAgICBpZiAoXG4gICAgICAoY29kZSA8PSAweDIwIHx8IGNvZGUgPiAweDdGKSB8fFxuICAgICAgY2hhciA9PT0gJygnIHx8XG4gICAgICBjaGFyID09PSAnKScgfHxcbiAgICAgIGNoYXIgPT09ICc+JyB8fFxuICAgICAgY2hhciA9PT0gJzwnIHx8XG4gICAgICBjaGFyID09PSAnQCcgfHxcbiAgICAgIGNoYXIgPT09ICcsJyB8fFxuICAgICAgY2hhciA9PT0gJzsnIHx8XG4gICAgICBjaGFyID09PSAnOicgfHxcbiAgICAgIGNoYXIgPT09ICdcXFxcJyB8fFxuICAgICAgY2hhciA9PT0gJ1wiJyB8fFxuICAgICAgY2hhciA9PT0gJy8nIHx8XG4gICAgICBjaGFyID09PSAnWycgfHxcbiAgICAgIGNoYXIgPT09ICddJyB8fFxuICAgICAgY2hhciA9PT0gJz8nIHx8XG4gICAgICBjaGFyID09PSAnPScgfHxcbiAgICAgIGNoYXIgPT09ICd7JyB8fFxuICAgICAgY2hhciA9PT0gJ30nXG4gICAgKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ0ludmFsaWQgY29va2llIG5hbWUnKVxuICAgIH1cbiAgfVxufVxuXG4vKipcbiBjb29raWUtdmFsdWUgICAgICA9ICpjb29raWUtb2N0ZXQgLyAoIERRVU9URSAqY29va2llLW9jdGV0IERRVU9URSApXG4gY29va2llLW9jdGV0ICAgICAgPSAleDIxIC8gJXgyMy0yQiAvICV4MkQtM0EgLyAleDNDLTVCIC8gJXg1RC03RVxuICAgICAgICAgICAgICAgICAgICAgICA7IFVTLUFTQ0lJIGNoYXJhY3RlcnMgZXhjbHVkaW5nIENUTHMsXG4gICAgICAgICAgICAgICAgICAgICAgIDsgd2hpdGVzcGFjZSBEUVVPVEUsIGNvbW1hLCBzZW1pY29sb24sXG4gICAgICAgICAgICAgICAgICAgICAgIDsgYW5kIGJhY2tzbGFzaFxuICogQHBhcmFtIHtzdHJpbmd9IHZhbHVlXG4gKi9cbmZ1bmN0aW9uIHZhbGlkYXRlQ29va2llVmFsdWUgKHZhbHVlKSB7XG4gIGZvciAoY29uc3QgY2hhciBvZiB2YWx1ZSkge1xuICAgIGNvbnN0IGNvZGUgPSBjaGFyLmNoYXJDb2RlQXQoMClcblxuICAgIGlmIChcbiAgICAgIGNvZGUgPCAweDIxIHx8IC8vIGV4Y2x1ZGUgQ1RMcyAoMC0zMSlcbiAgICAgIGNvZGUgPT09IDB4MjIgfHxcbiAgICAgIGNvZGUgPT09IDB4MkMgfHxcbiAgICAgIGNvZGUgPT09IDB4M0IgfHxcbiAgICAgIGNvZGUgPT09IDB4NUMgfHxcbiAgICAgIGNvZGUgPiAweDdFIC8vIG5vbi1hc2NpaVxuICAgICkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdJbnZhbGlkIGhlYWRlciB2YWx1ZScpXG4gICAgfVxuICB9XG59XG5cbi8qKlxuICogcGF0aC12YWx1ZSAgICAgICAgPSA8YW55IENIQVIgZXhjZXB0IENUTHMgb3IgXCI7XCI+XG4gKiBAcGFyYW0ge3N0cmluZ30gcGF0aFxuICovXG5mdW5jdGlvbiB2YWxpZGF0ZUNvb2tpZVBhdGggKHBhdGgpIHtcbiAgZm9yIChjb25zdCBjaGFyIG9mIHBhdGgpIHtcbiAgICBjb25zdCBjb2RlID0gY2hhci5jaGFyQ29kZUF0KDApXG5cbiAgICBpZiAoY29kZSA8IDB4MjEgfHwgY2hhciA9PT0gJzsnKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ0ludmFsaWQgY29va2llIHBhdGgnKVxuICAgIH1cbiAgfVxufVxuXG4vKipcbiAqIEkgaGF2ZSBubyBpZGVhIHdoeSB0aGVzZSB2YWx1ZXMgYXJlbid0IGFsbG93ZWQgdG8gYmUgaG9uZXN0LFxuICogYnV0IERlbm8gdGVzdHMgdGhlc2UuIC0gS2hhZnJhXG4gKiBAcGFyYW0ge3N0cmluZ30gZG9tYWluXG4gKi9cbmZ1bmN0aW9uIHZhbGlkYXRlQ29va2llRG9tYWluIChkb21haW4pIHtcbiAgaWYgKFxuICAgIGRvbWFpbi5zdGFydHNXaXRoKCctJykgfHxcbiAgICBkb21haW4uZW5kc1dpdGgoJy4nKSB8fFxuICAgIGRvbWFpbi5lbmRzV2l0aCgnLScpXG4gICkge1xuICAgIHRocm93IG5ldyBFcnJvcignSW52YWxpZCBjb29raWUgZG9tYWluJylcbiAgfVxufVxuXG4vKipcbiAqIEBzZWUgaHR0cHM6Ly93d3cucmZjLWVkaXRvci5vcmcvcmZjL3JmYzcyMzEjc2VjdGlvbi03LjEuMS4xXG4gKiBAcGFyYW0ge251bWJlcnxEYXRlfSBkYXRlXG4gIElNRi1maXhkYXRlICA9IGRheS1uYW1lIFwiLFwiIFNQIGRhdGUxIFNQIHRpbWUtb2YtZGF5IFNQIEdNVFxuICA7IGZpeGVkIGxlbmd0aC96b25lL2NhcGl0YWxpemF0aW9uIHN1YnNldCBvZiB0aGUgZm9ybWF0XG4gIDsgc2VlIFNlY3Rpb24gMy4zIG9mIFtSRkM1MzIyXVxuXG4gIGRheS1uYW1lICAgICA9ICV4NEQuNkYuNkUgOyBcIk1vblwiLCBjYXNlLXNlbnNpdGl2ZVxuICAgICAgICAgICAgICAvICV4NTQuNzUuNjUgOyBcIlR1ZVwiLCBjYXNlLXNlbnNpdGl2ZVxuICAgICAgICAgICAgICAvICV4NTcuNjUuNjQgOyBcIldlZFwiLCBjYXNlLXNlbnNpdGl2ZVxuICAgICAgICAgICAgICAvICV4NTQuNjguNzUgOyBcIlRodVwiLCBjYXNlLXNlbnNpdGl2ZVxuICAgICAgICAgICAgICAvICV4NDYuNzIuNjkgOyBcIkZyaVwiLCBjYXNlLXNlbnNpdGl2ZVxuICAgICAgICAgICAgICAvICV4NTMuNjEuNzQgOyBcIlNhdFwiLCBjYXNlLXNlbnNpdGl2ZVxuICAgICAgICAgICAgICAvICV4NTMuNzUuNkUgOyBcIlN1blwiLCBjYXNlLXNlbnNpdGl2ZVxuICBkYXRlMSAgICAgICAgPSBkYXkgU1AgbW9udGggU1AgeWVhclxuICAgICAgICAgICAgICAgICAgOyBlLmcuLCAwMiBKdW4gMTk4MlxuXG4gIGRheSAgICAgICAgICA9IDJESUdJVFxuICBtb250aCAgICAgICAgPSAleDRBLjYxLjZFIDsgXCJKYW5cIiwgY2FzZS1zZW5zaXRpdmVcbiAgICAgICAgICAgICAgLyAleDQ2LjY1LjYyIDsgXCJGZWJcIiwgY2FzZS1zZW5zaXRpdmVcbiAgICAgICAgICAgICAgLyAleDRELjYxLjcyIDsgXCJNYXJcIiwgY2FzZS1zZW5zaXRpdmVcbiAgICAgICAgICAgICAgLyAleDQxLjcwLjcyIDsgXCJBcHJcIiwgY2FzZS1zZW5zaXRpdmVcbiAgICAgICAgICAgICAgLyAleDRELjYxLjc5IDsgXCJNYXlcIiwgY2FzZS1zZW5zaXRpdmVcbiAgICAgICAgICAgICAgLyAleDRBLjc1LjZFIDsgXCJKdW5cIiwgY2FzZS1zZW5zaXRpdmVcbiAgICAgICAgICAgICAgLyAleDRBLjc1LjZDIDsgXCJKdWxcIiwgY2FzZS1zZW5zaXRpdmVcbiAgICAgICAgICAgICAgLyAleDQxLjc1LjY3IDsgXCJBdWdcIiwgY2FzZS1zZW5zaXRpdmVcbiAgICAgICAgICAgICAgLyAleDUzLjY1LjcwIDsgXCJTZXBcIiwgY2FzZS1zZW5zaXRpdmVcbiAgICAgICAgICAgICAgLyAleDRGLjYzLjc0IDsgXCJPY3RcIiwgY2FzZS1zZW5zaXRpdmVcbiAgICAgICAgICAgICAgLyAleDRFLjZGLjc2IDsgXCJOb3ZcIiwgY2FzZS1zZW5zaXRpdmVcbiAgICAgICAgICAgICAgLyAleDQ0LjY1LjYzIDsgXCJEZWNcIiwgY2FzZS1zZW5zaXRpdmVcbiAgeWVhciAgICAgICAgID0gNERJR0lUXG5cbiAgR01UICAgICAgICAgID0gJXg0Ny40RC41NCA7IFwiR01UXCIsIGNhc2Utc2Vuc2l0aXZlXG5cbiAgdGltZS1vZi1kYXkgID0gaG91ciBcIjpcIiBtaW51dGUgXCI6XCIgc2Vjb25kXG4gICAgICAgICAgICAgIDsgMDA6MDA6MDAgLSAyMzo1OTo2MCAobGVhcCBzZWNvbmQpXG5cbiAgaG91ciAgICAgICAgID0gMkRJR0lUXG4gIG1pbnV0ZSAgICAgICA9IDJESUdJVFxuICBzZWNvbmQgICAgICAgPSAyRElHSVRcbiAqL1xuZnVuY3Rpb24gdG9JTUZEYXRlIChkYXRlKSB7XG4gIGlmICh0eXBlb2YgZGF0ZSA9PT0gJ251bWJlcicpIHtcbiAgICBkYXRlID0gbmV3IERhdGUoZGF0ZSlcbiAgfVxuXG4gIGNvbnN0IGRheXMgPSBbXG4gICAgJ1N1bicsICdNb24nLCAnVHVlJywgJ1dlZCcsXG4gICAgJ1RodScsICdGcmknLCAnU2F0J1xuICBdXG5cbiAgY29uc3QgbW9udGhzID0gW1xuICAgICdKYW4nLCAnRmViJywgJ01hcicsICdBcHInLCAnTWF5JywgJ0p1bicsXG4gICAgJ0p1bCcsICdBdWcnLCAnU2VwJywgJ09jdCcsICdOb3YnLCAnRGVjJ1xuICBdXG5cbiAgY29uc3QgZGF5TmFtZSA9IGRheXNbZGF0ZS5nZXRVVENEYXkoKV1cbiAgY29uc3QgZGF5ID0gZGF0ZS5nZXRVVENEYXRlKCkudG9TdHJpbmcoKS5wYWRTdGFydCgyLCAnMCcpXG4gIGNvbnN0IG1vbnRoID0gbW9udGhzW2RhdGUuZ2V0VVRDTW9udGgoKV1cbiAgY29uc3QgeWVhciA9IGRhdGUuZ2V0VVRDRnVsbFllYXIoKVxuICBjb25zdCBob3VyID0gZGF0ZS5nZXRVVENIb3VycygpLnRvU3RyaW5nKCkucGFkU3RhcnQoMiwgJzAnKVxuICBjb25zdCBtaW51dGUgPSBkYXRlLmdldFVUQ01pbnV0ZXMoKS50b1N0cmluZygpLnBhZFN0YXJ0KDIsICcwJylcbiAgY29uc3Qgc2Vjb25kID0gZGF0ZS5nZXRVVENTZWNvbmRzKCkudG9TdHJpbmcoKS5wYWRTdGFydCgyLCAnMCcpXG5cbiAgcmV0dXJuIGAke2RheU5hbWV9LCAke2RheX0gJHttb250aH0gJHt5ZWFyfSAke2hvdXJ9OiR7bWludXRlfToke3NlY29uZH0gR01UYFxufVxuXG4vKipcbiBtYXgtYWdlLWF2ICAgICAgICA9IFwiTWF4LUFnZT1cIiBub24temVyby1kaWdpdCAqRElHSVRcbiAgICAgICAgICAgICAgICAgICAgICAgOyBJbiBwcmFjdGljZSwgYm90aCBleHBpcmVzLWF2IGFuZCBtYXgtYWdlLWF2XG4gICAgICAgICAgICAgICAgICAgICAgIDsgYXJlIGxpbWl0ZWQgdG8gZGF0ZXMgcmVwcmVzZW50YWJsZSBieSB0aGVcbiAgICAgICAgICAgICAgICAgICAgICAgOyB1c2VyIGFnZW50LlxuICogQHBhcmFtIHtudW1iZXJ9IG1heEFnZVxuICovXG5mdW5jdGlvbiB2YWxpZGF0ZUNvb2tpZU1heEFnZSAobWF4QWdlKSB7XG4gIGlmIChtYXhBZ2UgPCAwKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKCdJbnZhbGlkIGNvb2tpZSBtYXgtYWdlJylcbiAgfVxufVxuXG4vKipcbiAqIEBzZWUgaHR0cHM6Ly93d3cucmZjLWVkaXRvci5vcmcvcmZjL3JmYzYyNjUjc2VjdGlvbi00LjEuMVxuICogQHBhcmFtIHtpbXBvcnQoJy4vaW5kZXgnKS5Db29raWV9IGNvb2tpZVxuICovXG5mdW5jdGlvbiBzdHJpbmdpZnkgKGNvb2tpZSkge1xuICBpZiAoY29va2llLm5hbWUubGVuZ3RoID09PSAwKSB7XG4gICAgcmV0dXJuIG51bGxcbiAgfVxuXG4gIHZhbGlkYXRlQ29va2llTmFtZShjb29raWUubmFtZSlcbiAgdmFsaWRhdGVDb29raWVWYWx1ZShjb29raWUudmFsdWUpXG5cbiAgY29uc3Qgb3V0ID0gW2Ake2Nvb2tpZS5uYW1lfT0ke2Nvb2tpZS52YWx1ZX1gXVxuXG4gIC8vIGh0dHBzOi8vZGF0YXRyYWNrZXIuaWV0Zi5vcmcvZG9jL2h0bWwvZHJhZnQtaWV0Zi1odHRwYmlzLWNvb2tpZS1wcmVmaXhlcy0wMCNzZWN0aW9uLTMuMVxuICAvLyBodHRwczovL2RhdGF0cmFja2VyLmlldGYub3JnL2RvYy9odG1sL2RyYWZ0LWlldGYtaHR0cGJpcy1jb29raWUtcHJlZml4ZXMtMDAjc2VjdGlvbi0zLjJcbiAgaWYgKGNvb2tpZS5uYW1lLnN0YXJ0c1dpdGgoJ19fU2VjdXJlLScpKSB7XG4gICAgY29va2llLnNlY3VyZSA9IHRydWVcbiAgfVxuXG4gIGlmIChjb29raWUubmFtZS5zdGFydHNXaXRoKCdfX0hvc3QtJykpIHtcbiAgICBjb29raWUuc2VjdXJlID0gdHJ1ZVxuICAgIGNvb2tpZS5kb21haW4gPSBudWxsXG4gICAgY29va2llLnBhdGggPSAnLydcbiAgfVxuXG4gIGlmIChjb29raWUuc2VjdXJlKSB7XG4gICAgb3V0LnB1c2goJ1NlY3VyZScpXG4gIH1cblxuICBpZiAoY29va2llLmh0dHBPbmx5KSB7XG4gICAgb3V0LnB1c2goJ0h0dHBPbmx5JylcbiAgfVxuXG4gIGlmICh0eXBlb2YgY29va2llLm1heEFnZSA9PT0gJ251bWJlcicpIHtcbiAgICB2YWxpZGF0ZUNvb2tpZU1heEFnZShjb29raWUubWF4QWdlKVxuICAgIG91dC5wdXNoKGBNYXgtQWdlPSR7Y29va2llLm1heEFnZX1gKVxuICB9XG5cbiAgaWYgKGNvb2tpZS5kb21haW4pIHtcbiAgICB2YWxpZGF0ZUNvb2tpZURvbWFpbihjb29raWUuZG9tYWluKVxuICAgIG91dC5wdXNoKGBEb21haW49JHtjb29raWUuZG9tYWlufWApXG4gIH1cblxuICBpZiAoY29va2llLnBhdGgpIHtcbiAgICB2YWxpZGF0ZUNvb2tpZVBhdGgoY29va2llLnBhdGgpXG4gICAgb3V0LnB1c2goYFBhdGg9JHtjb29raWUucGF0aH1gKVxuICB9XG5cbiAgaWYgKGNvb2tpZS5leHBpcmVzICYmIGNvb2tpZS5leHBpcmVzLnRvU3RyaW5nKCkgIT09ICdJbnZhbGlkIERhdGUnKSB7XG4gICAgb3V0LnB1c2goYEV4cGlyZXM9JHt0b0lNRkRhdGUoY29va2llLmV4cGlyZXMpfWApXG4gIH1cblxuICBpZiAoY29va2llLnNhbWVTaXRlKSB7XG4gICAgb3V0LnB1c2goYFNhbWVTaXRlPSR7Y29va2llLnNhbWVTaXRlfWApXG4gIH1cblxuICBmb3IgKGNvbnN0IHBhcnQgb2YgY29va2llLnVucGFyc2VkKSB7XG4gICAgaWYgKCFwYXJ0LmluY2x1ZGVzKCc9JykpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignSW52YWxpZCB1bnBhcnNlZCcpXG4gICAgfVxuXG4gICAgY29uc3QgW2tleSwgLi4udmFsdWVdID0gcGFydC5zcGxpdCgnPScpXG5cbiAgICBvdXQucHVzaChgJHtrZXkudHJpbSgpfT0ke3ZhbHVlLmpvaW4oJz0nKX1gKVxuICB9XG5cbiAgcmV0dXJuIG91dC5qb2luKCc7ICcpXG59XG5cbmxldCBrSGVhZGVyc0xpc3ROb2RlXG5cbmZ1bmN0aW9uIGdldEhlYWRlcnNMaXN0IChoZWFkZXJzKSB7XG4gIGlmIChoZWFkZXJzW2tIZWFkZXJzTGlzdF0pIHtcbiAgICByZXR1cm4gaGVhZGVyc1trSGVhZGVyc0xpc3RdXG4gIH1cblxuICBpZiAoIWtIZWFkZXJzTGlzdE5vZGUpIHtcbiAgICBrSGVhZGVyc0xpc3ROb2RlID0gT2JqZWN0LmdldE93blByb3BlcnR5U3ltYm9scyhoZWFkZXJzKS5maW5kKFxuICAgICAgKHN5bWJvbCkgPT4gc3ltYm9sLmRlc2NyaXB0aW9uID09PSAnaGVhZGVycyBsaXN0J1xuICAgIClcblxuICAgIGFzc2VydChrSGVhZGVyc0xpc3ROb2RlLCAnSGVhZGVycyBjYW5ub3QgYmUgcGFyc2VkJylcbiAgfVxuXG4gIGNvbnN0IGhlYWRlcnNMaXN0ID0gaGVhZGVyc1trSGVhZGVyc0xpc3ROb2RlXVxuICBhc3NlcnQoaGVhZGVyc0xpc3QpXG5cbiAgcmV0dXJuIGhlYWRlcnNMaXN0XG59XG5cbm1vZHVsZS5leHBvcnRzID0ge1xuICBpc0NUTEV4Y2x1ZGluZ0h0YWIsXG4gIHN0cmluZ2lmeSxcbiAgZ2V0SGVhZGVyc0xpc3Rcbn1cbiIsCiAgICAiJ3VzZSBzdHJpY3QnXG5cbmNvbnN0IHsgbWF4TmFtZVZhbHVlUGFpclNpemUsIG1heEF0dHJpYnV0ZVZhbHVlU2l6ZSB9ID0gcmVxdWlyZSgnLi9jb25zdGFudHMnKVxuY29uc3QgeyBpc0NUTEV4Y2x1ZGluZ0h0YWIgfSA9IHJlcXVpcmUoJy4vdXRpbCcpXG5jb25zdCB7IGNvbGxlY3RBU2VxdWVuY2VPZkNvZGVQb2ludHNGYXN0IH0gPSByZXF1aXJlKCcuLi9mZXRjaC9kYXRhVVJMJylcbmNvbnN0IGFzc2VydCA9IHJlcXVpcmUoJ2Fzc2VydCcpXG5cbi8qKlxuICogQGRlc2NyaXB0aW9uIFBhcnNlcyB0aGUgZmllbGQtdmFsdWUgYXR0cmlidXRlcyBvZiBhIHNldC1jb29raWUgaGVhZGVyIHN0cmluZy5cbiAqIEBzZWUgaHR0cHM6Ly9kYXRhdHJhY2tlci5pZXRmLm9yZy9kb2MvaHRtbC9kcmFmdC1pZXRmLWh0dHBiaXMtcmZjNjI2NWJpcyNzZWN0aW9uLTUuNFxuICogQHBhcmFtIHtzdHJpbmd9IGhlYWRlclxuICogQHJldHVybnMgaWYgdGhlIGhlYWRlciBpcyBpbnZhbGlkLCBudWxsIHdpbGwgYmUgcmV0dXJuZWRcbiAqL1xuZnVuY3Rpb24gcGFyc2VTZXRDb29raWUgKGhlYWRlcikge1xuICAvLyAxLiBJZiB0aGUgc2V0LWNvb2tpZS1zdHJpbmcgY29udGFpbnMgYSAleDAwLTA4IC8gJXgwQS0xRiAvICV4N0ZcbiAgLy8gICAgY2hhcmFjdGVyIChDVEwgY2hhcmFjdGVycyBleGNsdWRpbmcgSFRBQik6IEFib3J0IHRoZXNlIHN0ZXBzIGFuZFxuICAvLyAgICBpZ25vcmUgdGhlIHNldC1jb29raWUtc3RyaW5nIGVudGlyZWx5LlxuICBpZiAoaXNDVExFeGNsdWRpbmdIdGFiKGhlYWRlcikpIHtcbiAgICByZXR1cm4gbnVsbFxuICB9XG5cbiAgbGV0IG5hbWVWYWx1ZVBhaXIgPSAnJ1xuICBsZXQgdW5wYXJzZWRBdHRyaWJ1dGVzID0gJydcbiAgbGV0IG5hbWUgPSAnJ1xuICBsZXQgdmFsdWUgPSAnJ1xuXG4gIC8vIDIuIElmIHRoZSBzZXQtY29va2llLXN0cmluZyBjb250YWlucyBhICV4M0IgKFwiO1wiKSBjaGFyYWN0ZXI6XG4gIGlmIChoZWFkZXIuaW5jbHVkZXMoJzsnKSkge1xuICAgIC8vIDEuIFRoZSBuYW1lLXZhbHVlLXBhaXIgc3RyaW5nIGNvbnNpc3RzIG9mIHRoZSBjaGFyYWN0ZXJzIHVwIHRvLFxuICAgIC8vICAgIGJ1dCBub3QgaW5jbHVkaW5nLCB0aGUgZmlyc3QgJXgzQiAoXCI7XCIpLCBhbmQgdGhlIHVucGFyc2VkLVxuICAgIC8vICAgIGF0dHJpYnV0ZXMgY29uc2lzdCBvZiB0aGUgcmVtYWluZGVyIG9mIHRoZSBzZXQtY29va2llLXN0cmluZ1xuICAgIC8vICAgIChpbmNsdWRpbmcgdGhlICV4M0IgKFwiO1wiKSBpbiBxdWVzdGlvbikuXG4gICAgY29uc3QgcG9zaXRpb24gPSB7IHBvc2l0aW9uOiAwIH1cblxuICAgIG5hbWVWYWx1ZVBhaXIgPSBjb2xsZWN0QVNlcXVlbmNlT2ZDb2RlUG9pbnRzRmFzdCgnOycsIGhlYWRlciwgcG9zaXRpb24pXG4gICAgdW5wYXJzZWRBdHRyaWJ1dGVzID0gaGVhZGVyLnNsaWNlKHBvc2l0aW9uLnBvc2l0aW9uKVxuICB9IGVsc2Uge1xuICAgIC8vIE90aGVyd2lzZTpcblxuICAgIC8vIDEuIFRoZSBuYW1lLXZhbHVlLXBhaXIgc3RyaW5nIGNvbnNpc3RzIG9mIGFsbCB0aGUgY2hhcmFjdGVyc1xuICAgIC8vICAgIGNvbnRhaW5lZCBpbiB0aGUgc2V0LWNvb2tpZS1zdHJpbmcsIGFuZCB0aGUgdW5wYXJzZWQtXG4gICAgLy8gICAgYXR0cmlidXRlcyBpcyB0aGUgZW1wdHkgc3RyaW5nLlxuICAgIG5hbWVWYWx1ZVBhaXIgPSBoZWFkZXJcbiAgfVxuXG4gIC8vIDMuIElmIHRoZSBuYW1lLXZhbHVlLXBhaXIgc3RyaW5nIGxhY2tzIGEgJXgzRCAoXCI9XCIpIGNoYXJhY3RlciwgdGhlblxuICAvLyAgICB0aGUgbmFtZSBzdHJpbmcgaXMgZW1wdHksIGFuZCB0aGUgdmFsdWUgc3RyaW5nIGlzIHRoZSB2YWx1ZSBvZlxuICAvLyAgICBuYW1lLXZhbHVlLXBhaXIuXG4gIGlmICghbmFtZVZhbHVlUGFpci5pbmNsdWRlcygnPScpKSB7XG4gICAgdmFsdWUgPSBuYW1lVmFsdWVQYWlyXG4gIH0gZWxzZSB7XG4gICAgLy8gICAgT3RoZXJ3aXNlLCB0aGUgbmFtZSBzdHJpbmcgY29uc2lzdHMgb2YgdGhlIGNoYXJhY3RlcnMgdXAgdG8sIGJ1dFxuICAgIC8vICAgIG5vdCBpbmNsdWRpbmcsIHRoZSBmaXJzdCAleDNEIChcIj1cIikgY2hhcmFjdGVyLCBhbmQgdGhlIChwb3NzaWJseVxuICAgIC8vICAgIGVtcHR5KSB2YWx1ZSBzdHJpbmcgY29uc2lzdHMgb2YgdGhlIGNoYXJhY3RlcnMgYWZ0ZXIgdGhlIGZpcnN0XG4gICAgLy8gICAgJXgzRCAoXCI9XCIpIGNoYXJhY3Rlci5cbiAgICBjb25zdCBwb3NpdGlvbiA9IHsgcG9zaXRpb246IDAgfVxuICAgIG5hbWUgPSBjb2xsZWN0QVNlcXVlbmNlT2ZDb2RlUG9pbnRzRmFzdChcbiAgICAgICc9JyxcbiAgICAgIG5hbWVWYWx1ZVBhaXIsXG4gICAgICBwb3NpdGlvblxuICAgIClcbiAgICB2YWx1ZSA9IG5hbWVWYWx1ZVBhaXIuc2xpY2UocG9zaXRpb24ucG9zaXRpb24gKyAxKVxuICB9XG5cbiAgLy8gNC4gUmVtb3ZlIGFueSBsZWFkaW5nIG9yIHRyYWlsaW5nIFdTUCBjaGFyYWN0ZXJzIGZyb20gdGhlIG5hbWVcbiAgLy8gICAgc3RyaW5nIGFuZCB0aGUgdmFsdWUgc3RyaW5nLlxuICBuYW1lID0gbmFtZS50cmltKClcbiAgdmFsdWUgPSB2YWx1ZS50cmltKClcblxuICAvLyA1LiBJZiB0aGUgc3VtIG9mIHRoZSBsZW5ndGhzIG9mIHRoZSBuYW1lIHN0cmluZyBhbmQgdGhlIHZhbHVlIHN0cmluZ1xuICAvLyAgICBpcyBtb3JlIHRoYW4gNDA5NiBvY3RldHMsIGFib3J0IHRoZXNlIHN0ZXBzIGFuZCBpZ25vcmUgdGhlIHNldC1cbiAgLy8gICAgY29va2llLXN0cmluZyBlbnRpcmVseS5cbiAgaWYgKG5hbWUubGVuZ3RoICsgdmFsdWUubGVuZ3RoID4gbWF4TmFtZVZhbHVlUGFpclNpemUpIHtcbiAgICByZXR1cm4gbnVsbFxuICB9XG5cbiAgLy8gNi4gVGhlIGNvb2tpZS1uYW1lIGlzIHRoZSBuYW1lIHN0cmluZywgYW5kIHRoZSBjb29raWUtdmFsdWUgaXMgdGhlXG4gIC8vICAgIHZhbHVlIHN0cmluZy5cbiAgcmV0dXJuIHtcbiAgICBuYW1lLCB2YWx1ZSwgLi4ucGFyc2VVbnBhcnNlZEF0dHJpYnV0ZXModW5wYXJzZWRBdHRyaWJ1dGVzKVxuICB9XG59XG5cbi8qKlxuICogUGFyc2VzIHRoZSByZW1haW5pbmcgYXR0cmlidXRlcyBvZiBhIHNldC1jb29raWUgaGVhZGVyXG4gKiBAc2VlIGh0dHBzOi8vZGF0YXRyYWNrZXIuaWV0Zi5vcmcvZG9jL2h0bWwvZHJhZnQtaWV0Zi1odHRwYmlzLXJmYzYyNjViaXMjc2VjdGlvbi01LjRcbiAqIEBwYXJhbSB7c3RyaW5nfSB1bnBhcnNlZEF0dHJpYnV0ZXNcbiAqIEBwYXJhbSB7W09iamVjdC48c3RyaW5nLCB1bmtub3duPl09e319IGNvb2tpZUF0dHJpYnV0ZUxpc3RcbiAqL1xuZnVuY3Rpb24gcGFyc2VVbnBhcnNlZEF0dHJpYnV0ZXMgKHVucGFyc2VkQXR0cmlidXRlcywgY29va2llQXR0cmlidXRlTGlzdCA9IHt9KSB7XG4gIC8vIDEuIElmIHRoZSB1bnBhcnNlZC1hdHRyaWJ1dGVzIHN0cmluZyBpcyBlbXB0eSwgc2tpcCB0aGUgcmVzdCBvZlxuICAvLyAgICB0aGVzZSBzdGVwcy5cbiAgaWYgKHVucGFyc2VkQXR0cmlidXRlcy5sZW5ndGggPT09IDApIHtcbiAgICByZXR1cm4gY29va2llQXR0cmlidXRlTGlzdFxuICB9XG5cbiAgLy8gMi4gRGlzY2FyZCB0aGUgZmlyc3QgY2hhcmFjdGVyIG9mIHRoZSB1bnBhcnNlZC1hdHRyaWJ1dGVzICh3aGljaFxuICAvLyAgICB3aWxsIGJlIGEgJXgzQiAoXCI7XCIpIGNoYXJhY3RlcikuXG4gIGFzc2VydCh1bnBhcnNlZEF0dHJpYnV0ZXNbMF0gPT09ICc7JylcbiAgdW5wYXJzZWRBdHRyaWJ1dGVzID0gdW5wYXJzZWRBdHRyaWJ1dGVzLnNsaWNlKDEpXG5cbiAgbGV0IGNvb2tpZUF2ID0gJydcblxuICAvLyAzLiBJZiB0aGUgcmVtYWluaW5nIHVucGFyc2VkLWF0dHJpYnV0ZXMgY29udGFpbnMgYSAleDNCIChcIjtcIilcbiAgLy8gICAgY2hhcmFjdGVyOlxuICBpZiAodW5wYXJzZWRBdHRyaWJ1dGVzLmluY2x1ZGVzKCc7JykpIHtcbiAgICAvLyAxLiBDb25zdW1lIHRoZSBjaGFyYWN0ZXJzIG9mIHRoZSB1bnBhcnNlZC1hdHRyaWJ1dGVzIHVwIHRvLCBidXRcbiAgICAvLyAgICBub3QgaW5jbHVkaW5nLCB0aGUgZmlyc3QgJXgzQiAoXCI7XCIpIGNoYXJhY3Rlci5cbiAgICBjb29raWVBdiA9IGNvbGxlY3RBU2VxdWVuY2VPZkNvZGVQb2ludHNGYXN0KFxuICAgICAgJzsnLFxuICAgICAgdW5wYXJzZWRBdHRyaWJ1dGVzLFxuICAgICAgeyBwb3NpdGlvbjogMCB9XG4gICAgKVxuICAgIHVucGFyc2VkQXR0cmlidXRlcyA9IHVucGFyc2VkQXR0cmlidXRlcy5zbGljZShjb29raWVBdi5sZW5ndGgpXG4gIH0gZWxzZSB7XG4gICAgLy8gT3RoZXJ3aXNlOlxuXG4gICAgLy8gMS4gQ29uc3VtZSB0aGUgcmVtYWluZGVyIG9mIHRoZSB1bnBhcnNlZC1hdHRyaWJ1dGVzLlxuICAgIGNvb2tpZUF2ID0gdW5wYXJzZWRBdHRyaWJ1dGVzXG4gICAgdW5wYXJzZWRBdHRyaWJ1dGVzID0gJydcbiAgfVxuXG4gIC8vIExldCB0aGUgY29va2llLWF2IHN0cmluZyBiZSB0aGUgY2hhcmFjdGVycyBjb25zdW1lZCBpbiB0aGlzIHN0ZXAuXG5cbiAgbGV0IGF0dHJpYnV0ZU5hbWUgPSAnJ1xuICBsZXQgYXR0cmlidXRlVmFsdWUgPSAnJ1xuXG4gIC8vIDQuIElmIHRoZSBjb29raWUtYXYgc3RyaW5nIGNvbnRhaW5zIGEgJXgzRCAoXCI9XCIpIGNoYXJhY3RlcjpcbiAgaWYgKGNvb2tpZUF2LmluY2x1ZGVzKCc9JykpIHtcbiAgICAvLyAxLiBUaGUgKHBvc3NpYmx5IGVtcHR5KSBhdHRyaWJ1dGUtbmFtZSBzdHJpbmcgY29uc2lzdHMgb2YgdGhlXG4gICAgLy8gICAgY2hhcmFjdGVycyB1cCB0bywgYnV0IG5vdCBpbmNsdWRpbmcsIHRoZSBmaXJzdCAleDNEIChcIj1cIilcbiAgICAvLyAgICBjaGFyYWN0ZXIsIGFuZCB0aGUgKHBvc3NpYmx5IGVtcHR5KSBhdHRyaWJ1dGUtdmFsdWUgc3RyaW5nXG4gICAgLy8gICAgY29uc2lzdHMgb2YgdGhlIGNoYXJhY3RlcnMgYWZ0ZXIgdGhlIGZpcnN0ICV4M0QgKFwiPVwiKVxuICAgIC8vICAgIGNoYXJhY3Rlci5cbiAgICBjb25zdCBwb3NpdGlvbiA9IHsgcG9zaXRpb246IDAgfVxuXG4gICAgYXR0cmlidXRlTmFtZSA9IGNvbGxlY3RBU2VxdWVuY2VPZkNvZGVQb2ludHNGYXN0KFxuICAgICAgJz0nLFxuICAgICAgY29va2llQXYsXG4gICAgICBwb3NpdGlvblxuICAgIClcbiAgICBhdHRyaWJ1dGVWYWx1ZSA9IGNvb2tpZUF2LnNsaWNlKHBvc2l0aW9uLnBvc2l0aW9uICsgMSlcbiAgfSBlbHNlIHtcbiAgICAvLyBPdGhlcndpc2U6XG5cbiAgICAvLyAxLiBUaGUgYXR0cmlidXRlLW5hbWUgc3RyaW5nIGNvbnNpc3RzIG9mIHRoZSBlbnRpcmUgY29va2llLWF2XG4gICAgLy8gICAgc3RyaW5nLCBhbmQgdGhlIGF0dHJpYnV0ZS12YWx1ZSBzdHJpbmcgaXMgZW1wdHkuXG4gICAgYXR0cmlidXRlTmFtZSA9IGNvb2tpZUF2XG4gIH1cblxuICAvLyA1LiBSZW1vdmUgYW55IGxlYWRpbmcgb3IgdHJhaWxpbmcgV1NQIGNoYXJhY3RlcnMgZnJvbSB0aGUgYXR0cmlidXRlLVxuICAvLyAgICBuYW1lIHN0cmluZyBhbmQgdGhlIGF0dHJpYnV0ZS12YWx1ZSBzdHJpbmcuXG4gIGF0dHJpYnV0ZU5hbWUgPSBhdHRyaWJ1dGVOYW1lLnRyaW0oKVxuICBhdHRyaWJ1dGVWYWx1ZSA9IGF0dHJpYnV0ZVZhbHVlLnRyaW0oKVxuXG4gIC8vIDYuIElmIHRoZSBhdHRyaWJ1dGUtdmFsdWUgaXMgbG9uZ2VyIHRoYW4gMTAyNCBvY3RldHMsIGlnbm9yZSB0aGVcbiAgLy8gICAgY29va2llLWF2IHN0cmluZyBhbmQgcmV0dXJuIHRvIFN0ZXAgMSBvZiB0aGlzIGFsZ29yaXRobS5cbiAgaWYgKGF0dHJpYnV0ZVZhbHVlLmxlbmd0aCA+IG1heEF0dHJpYnV0ZVZhbHVlU2l6ZSkge1xuICAgIHJldHVybiBwYXJzZVVucGFyc2VkQXR0cmlidXRlcyh1bnBhcnNlZEF0dHJpYnV0ZXMsIGNvb2tpZUF0dHJpYnV0ZUxpc3QpXG4gIH1cblxuICAvLyA3LiBQcm9jZXNzIHRoZSBhdHRyaWJ1dGUtbmFtZSBhbmQgYXR0cmlidXRlLXZhbHVlIGFjY29yZGluZyB0byB0aGVcbiAgLy8gICAgcmVxdWlyZW1lbnRzIGluIHRoZSBmb2xsb3dpbmcgc3Vic2VjdGlvbnMuICAoTm90aWNlIHRoYXRcbiAgLy8gICAgYXR0cmlidXRlcyB3aXRoIHVucmVjb2duaXplZCBhdHRyaWJ1dGUtbmFtZXMgYXJlIGlnbm9yZWQuKVxuICBjb25zdCBhdHRyaWJ1dGVOYW1lTG93ZXJjYXNlID0gYXR0cmlidXRlTmFtZS50b0xvd2VyQ2FzZSgpXG5cbiAgLy8gaHR0cHM6Ly9kYXRhdHJhY2tlci5pZXRmLm9yZy9kb2MvaHRtbC9kcmFmdC1pZXRmLWh0dHBiaXMtcmZjNjI2NWJpcyNzZWN0aW9uLTUuNC4xXG4gIC8vIElmIHRoZSBhdHRyaWJ1dGUtbmFtZSBjYXNlLWluc2Vuc2l0aXZlbHkgbWF0Y2hlcyB0aGUgc3RyaW5nXG4gIC8vIFwiRXhwaXJlc1wiLCB0aGUgdXNlciBhZ2VudCBNVVNUIHByb2Nlc3MgdGhlIGNvb2tpZS1hdiBhcyBmb2xsb3dzLlxuICBpZiAoYXR0cmlidXRlTmFtZUxvd2VyY2FzZSA9PT0gJ2V4cGlyZXMnKSB7XG4gICAgLy8gMS4gTGV0IHRoZSBleHBpcnktdGltZSBiZSB0aGUgcmVzdWx0IG9mIHBhcnNpbmcgdGhlIGF0dHJpYnV0ZS12YWx1ZVxuICAgIC8vICAgIGFzIGNvb2tpZS1kYXRlIChzZWUgU2VjdGlvbiA1LjEuMSkuXG4gICAgY29uc3QgZXhwaXJ5VGltZSA9IG5ldyBEYXRlKGF0dHJpYnV0ZVZhbHVlKVxuXG4gICAgLy8gMi4gSWYgdGhlIGF0dHJpYnV0ZS12YWx1ZSBmYWlsZWQgdG8gcGFyc2UgYXMgYSBjb29raWUgZGF0ZSwgaWdub3JlXG4gICAgLy8gICAgdGhlIGNvb2tpZS1hdi5cblxuICAgIGNvb2tpZUF0dHJpYnV0ZUxpc3QuZXhwaXJlcyA9IGV4cGlyeVRpbWVcbiAgfSBlbHNlIGlmIChhdHRyaWJ1dGVOYW1lTG93ZXJjYXNlID09PSAnbWF4LWFnZScpIHtcbiAgICAvLyBodHRwczovL2RhdGF0cmFja2VyLmlldGYub3JnL2RvYy9odG1sL2RyYWZ0LWlldGYtaHR0cGJpcy1yZmM2MjY1YmlzI3NlY3Rpb24tNS40LjJcbiAgICAvLyBJZiB0aGUgYXR0cmlidXRlLW5hbWUgY2FzZS1pbnNlbnNpdGl2ZWx5IG1hdGNoZXMgdGhlIHN0cmluZyBcIk1heC1cbiAgICAvLyBBZ2VcIiwgdGhlIHVzZXIgYWdlbnQgTVVTVCBwcm9jZXNzIHRoZSBjb29raWUtYXYgYXMgZm9sbG93cy5cblxuICAgIC8vIDEuIElmIHRoZSBmaXJzdCBjaGFyYWN0ZXIgb2YgdGhlIGF0dHJpYnV0ZS12YWx1ZSBpcyBub3QgYSBESUdJVCBvciBhXG4gICAgLy8gICAgXCItXCIgY2hhcmFjdGVyLCBpZ25vcmUgdGhlIGNvb2tpZS1hdi5cbiAgICBjb25zdCBjaGFyQ29kZSA9IGF0dHJpYnV0ZVZhbHVlLmNoYXJDb2RlQXQoMClcblxuICAgIGlmICgoY2hhckNvZGUgPCA0OCB8fCBjaGFyQ29kZSA+IDU3KSAmJiBhdHRyaWJ1dGVWYWx1ZVswXSAhPT0gJy0nKSB7XG4gICAgICByZXR1cm4gcGFyc2VVbnBhcnNlZEF0dHJpYnV0ZXModW5wYXJzZWRBdHRyaWJ1dGVzLCBjb29raWVBdHRyaWJ1dGVMaXN0KVxuICAgIH1cblxuICAgIC8vIDIuIElmIHRoZSByZW1haW5kZXIgb2YgYXR0cmlidXRlLXZhbHVlIGNvbnRhaW5zIGEgbm9uLURJR0lUXG4gICAgLy8gICAgY2hhcmFjdGVyLCBpZ25vcmUgdGhlIGNvb2tpZS1hdi5cbiAgICBpZiAoIS9eXFxkKyQvLnRlc3QoYXR0cmlidXRlVmFsdWUpKSB7XG4gICAgICByZXR1cm4gcGFyc2VVbnBhcnNlZEF0dHJpYnV0ZXModW5wYXJzZWRBdHRyaWJ1dGVzLCBjb29raWVBdHRyaWJ1dGVMaXN0KVxuICAgIH1cblxuICAgIC8vIDMuIExldCBkZWx0YS1zZWNvbmRzIGJlIHRoZSBhdHRyaWJ1dGUtdmFsdWUgY29udmVydGVkIHRvIGFuIGludGVnZXIuXG4gICAgY29uc3QgZGVsdGFTZWNvbmRzID0gTnVtYmVyKGF0dHJpYnV0ZVZhbHVlKVxuXG4gICAgLy8gNC4gTGV0IGNvb2tpZS1hZ2UtbGltaXQgYmUgdGhlIG1heGltdW0gYWdlIG9mIHRoZSBjb29raWUgKHdoaWNoXG4gICAgLy8gICAgU0hPVUxEIGJlIDQwMCBkYXlzIG9yIGxlc3MsIHNlZSBTZWN0aW9uIDQuMS4yLjIpLlxuXG4gICAgLy8gNS4gU2V0IGRlbHRhLXNlY29uZHMgdG8gdGhlIHNtYWxsZXIgb2YgaXRzIHByZXNlbnQgdmFsdWUgYW5kIGNvb2tpZS1cbiAgICAvLyAgICBhZ2UtbGltaXQuXG4gICAgLy8gZGVsdGFTZWNvbmRzID0gTWF0aC5taW4oZGVsdGFTZWNvbmRzICogMTAwMCwgbWF4RXhwaXJlc01zKVxuXG4gICAgLy8gNi4gSWYgZGVsdGEtc2Vjb25kcyBpcyBsZXNzIHRoYW4gb3IgZXF1YWwgdG8gemVybyAoMCksIGxldCBleHBpcnktXG4gICAgLy8gICAgdGltZSBiZSB0aGUgZWFybGllc3QgcmVwcmVzZW50YWJsZSBkYXRlIGFuZCB0aW1lLiAgT3RoZXJ3aXNlLCBsZXRcbiAgICAvLyAgICB0aGUgZXhwaXJ5LXRpbWUgYmUgdGhlIGN1cnJlbnQgZGF0ZSBhbmQgdGltZSBwbHVzIGRlbHRhLXNlY29uZHNcbiAgICAvLyAgICBzZWNvbmRzLlxuICAgIC8vIGNvbnN0IGV4cGlyeVRpbWUgPSBkZWx0YVNlY29uZHMgPD0gMCA/IERhdGUubm93KCkgOiBEYXRlLm5vdygpICsgZGVsdGFTZWNvbmRzXG5cbiAgICAvLyA3LiBBcHBlbmQgYW4gYXR0cmlidXRlIHRvIHRoZSBjb29raWUtYXR0cmlidXRlLWxpc3Qgd2l0aCBhblxuICAgIC8vICAgIGF0dHJpYnV0ZS1uYW1lIG9mIE1heC1BZ2UgYW5kIGFuIGF0dHJpYnV0ZS12YWx1ZSBvZiBleHBpcnktdGltZS5cbiAgICBjb29raWVBdHRyaWJ1dGVMaXN0Lm1heEFnZSA9IGRlbHRhU2Vjb25kc1xuICB9IGVsc2UgaWYgKGF0dHJpYnV0ZU5hbWVMb3dlcmNhc2UgPT09ICdkb21haW4nKSB7XG4gICAgLy8gaHR0cHM6Ly9kYXRhdHJhY2tlci5pZXRmLm9yZy9kb2MvaHRtbC9kcmFmdC1pZXRmLWh0dHBiaXMtcmZjNjI2NWJpcyNzZWN0aW9uLTUuNC4zXG4gICAgLy8gSWYgdGhlIGF0dHJpYnV0ZS1uYW1lIGNhc2UtaW5zZW5zaXRpdmVseSBtYXRjaGVzIHRoZSBzdHJpbmcgXCJEb21haW5cIixcbiAgICAvLyB0aGUgdXNlciBhZ2VudCBNVVNUIHByb2Nlc3MgdGhlIGNvb2tpZS1hdiBhcyBmb2xsb3dzLlxuXG4gICAgLy8gMS4gTGV0IGNvb2tpZS1kb21haW4gYmUgdGhlIGF0dHJpYnV0ZS12YWx1ZS5cbiAgICBsZXQgY29va2llRG9tYWluID0gYXR0cmlidXRlVmFsdWVcblxuICAgIC8vIDIuIElmIGNvb2tpZS1kb21haW4gc3RhcnRzIHdpdGggJXgyRSAoXCIuXCIpLCBsZXQgY29va2llLWRvbWFpbiBiZVxuICAgIC8vICAgIGNvb2tpZS1kb21haW4gd2l0aG91dCBpdHMgbGVhZGluZyAleDJFIChcIi5cIikuXG4gICAgaWYgKGNvb2tpZURvbWFpblswXSA9PT0gJy4nKSB7XG4gICAgICBjb29raWVEb21haW4gPSBjb29raWVEb21haW4uc2xpY2UoMSlcbiAgICB9XG5cbiAgICAvLyAzLiBDb252ZXJ0IHRoZSBjb29raWUtZG9tYWluIHRvIGxvd2VyIGNhc2UuXG4gICAgY29va2llRG9tYWluID0gY29va2llRG9tYWluLnRvTG93ZXJDYXNlKClcblxuICAgIC8vIDQuIEFwcGVuZCBhbiBhdHRyaWJ1dGUgdG8gdGhlIGNvb2tpZS1hdHRyaWJ1dGUtbGlzdCB3aXRoIGFuXG4gICAgLy8gICAgYXR0cmlidXRlLW5hbWUgb2YgRG9tYWluIGFuZCBhbiBhdHRyaWJ1dGUtdmFsdWUgb2YgY29va2llLWRvbWFpbi5cbiAgICBjb29raWVBdHRyaWJ1dGVMaXN0LmRvbWFpbiA9IGNvb2tpZURvbWFpblxuICB9IGVsc2UgaWYgKGF0dHJpYnV0ZU5hbWVMb3dlcmNhc2UgPT09ICdwYXRoJykge1xuICAgIC8vIGh0dHBzOi8vZGF0YXRyYWNrZXIuaWV0Zi5vcmcvZG9jL2h0bWwvZHJhZnQtaWV0Zi1odHRwYmlzLXJmYzYyNjViaXMjc2VjdGlvbi01LjQuNFxuICAgIC8vIElmIHRoZSBhdHRyaWJ1dGUtbmFtZSBjYXNlLWluc2Vuc2l0aXZlbHkgbWF0Y2hlcyB0aGUgc3RyaW5nIFwiUGF0aFwiLFxuICAgIC8vIHRoZSB1c2VyIGFnZW50IE1VU1QgcHJvY2VzcyB0aGUgY29va2llLWF2IGFzIGZvbGxvd3MuXG5cbiAgICAvLyAxLiBJZiB0aGUgYXR0cmlidXRlLXZhbHVlIGlzIGVtcHR5IG9yIGlmIHRoZSBmaXJzdCBjaGFyYWN0ZXIgb2YgdGhlXG4gICAgLy8gICAgYXR0cmlidXRlLXZhbHVlIGlzIG5vdCAleDJGIChcIi9cIik6XG4gICAgbGV0IGNvb2tpZVBhdGggPSAnJ1xuICAgIGlmIChhdHRyaWJ1dGVWYWx1ZS5sZW5ndGggPT09IDAgfHwgYXR0cmlidXRlVmFsdWVbMF0gIT09ICcvJykge1xuICAgICAgLy8gMS4gTGV0IGNvb2tpZS1wYXRoIGJlIHRoZSBkZWZhdWx0LXBhdGguXG4gICAgICBjb29raWVQYXRoID0gJy8nXG4gICAgfSBlbHNlIHtcbiAgICAgIC8vIE90aGVyd2lzZTpcblxuICAgICAgLy8gMS4gTGV0IGNvb2tpZS1wYXRoIGJlIHRoZSBhdHRyaWJ1dGUtdmFsdWUuXG4gICAgICBjb29raWVQYXRoID0gYXR0cmlidXRlVmFsdWVcbiAgICB9XG5cbiAgICAvLyAyLiBBcHBlbmQgYW4gYXR0cmlidXRlIHRvIHRoZSBjb29raWUtYXR0cmlidXRlLWxpc3Qgd2l0aCBhblxuICAgIC8vICAgIGF0dHJpYnV0ZS1uYW1lIG9mIFBhdGggYW5kIGFuIGF0dHJpYnV0ZS12YWx1ZSBvZiBjb29raWUtcGF0aC5cbiAgICBjb29raWVBdHRyaWJ1dGVMaXN0LnBhdGggPSBjb29raWVQYXRoXG4gIH0gZWxzZSBpZiAoYXR0cmlidXRlTmFtZUxvd2VyY2FzZSA9PT0gJ3NlY3VyZScpIHtcbiAgICAvLyBodHRwczovL2RhdGF0cmFja2VyLmlldGYub3JnL2RvYy9odG1sL2RyYWZ0LWlldGYtaHR0cGJpcy1yZmM2MjY1YmlzI3NlY3Rpb24tNS40LjVcbiAgICAvLyBJZiB0aGUgYXR0cmlidXRlLW5hbWUgY2FzZS1pbnNlbnNpdGl2ZWx5IG1hdGNoZXMgdGhlIHN0cmluZyBcIlNlY3VyZVwiLFxuICAgIC8vIHRoZSB1c2VyIGFnZW50IE1VU1QgYXBwZW5kIGFuIGF0dHJpYnV0ZSB0byB0aGUgY29va2llLWF0dHJpYnV0ZS1saXN0XG4gICAgLy8gd2l0aCBhbiBhdHRyaWJ1dGUtbmFtZSBvZiBTZWN1cmUgYW5kIGFuIGVtcHR5IGF0dHJpYnV0ZS12YWx1ZS5cblxuICAgIGNvb2tpZUF0dHJpYnV0ZUxpc3Quc2VjdXJlID0gdHJ1ZVxuICB9IGVsc2UgaWYgKGF0dHJpYnV0ZU5hbWVMb3dlcmNhc2UgPT09ICdodHRwb25seScpIHtcbiAgICAvLyBodHRwczovL2RhdGF0cmFja2VyLmlldGYub3JnL2RvYy9odG1sL2RyYWZ0LWlldGYtaHR0cGJpcy1yZmM2MjY1YmlzI3NlY3Rpb24tNS40LjZcbiAgICAvLyBJZiB0aGUgYXR0cmlidXRlLW5hbWUgY2FzZS1pbnNlbnNpdGl2ZWx5IG1hdGNoZXMgdGhlIHN0cmluZ1xuICAgIC8vIFwiSHR0cE9ubHlcIiwgdGhlIHVzZXIgYWdlbnQgTVVTVCBhcHBlbmQgYW4gYXR0cmlidXRlIHRvIHRoZSBjb29raWUtXG4gICAgLy8gYXR0cmlidXRlLWxpc3Qgd2l0aCBhbiBhdHRyaWJ1dGUtbmFtZSBvZiBIdHRwT25seSBhbmQgYW4gZW1wdHlcbiAgICAvLyBhdHRyaWJ1dGUtdmFsdWUuXG5cbiAgICBjb29raWVBdHRyaWJ1dGVMaXN0Lmh0dHBPbmx5ID0gdHJ1ZVxuICB9IGVsc2UgaWYgKGF0dHJpYnV0ZU5hbWVMb3dlcmNhc2UgPT09ICdzYW1lc2l0ZScpIHtcbiAgICAvLyBodHRwczovL2RhdGF0cmFja2VyLmlldGYub3JnL2RvYy9odG1sL2RyYWZ0LWlldGYtaHR0cGJpcy1yZmM2MjY1YmlzI3NlY3Rpb24tNS40LjdcbiAgICAvLyBJZiB0aGUgYXR0cmlidXRlLW5hbWUgY2FzZS1pbnNlbnNpdGl2ZWx5IG1hdGNoZXMgdGhlIHN0cmluZ1xuICAgIC8vIFwiU2FtZVNpdGVcIiwgdGhlIHVzZXIgYWdlbnQgTVVTVCBwcm9jZXNzIHRoZSBjb29raWUtYXYgYXMgZm9sbG93czpcblxuICAgIC8vIDEuIExldCBlbmZvcmNlbWVudCBiZSBcIkRlZmF1bHRcIi5cbiAgICBsZXQgZW5mb3JjZW1lbnQgPSAnRGVmYXVsdCdcblxuICAgIGNvbnN0IGF0dHJpYnV0ZVZhbHVlTG93ZXJjYXNlID0gYXR0cmlidXRlVmFsdWUudG9Mb3dlckNhc2UoKVxuICAgIC8vIDIuIElmIGNvb2tpZS1hdidzIGF0dHJpYnV0ZS12YWx1ZSBpcyBhIGNhc2UtaW5zZW5zaXRpdmUgbWF0Y2ggZm9yXG4gICAgLy8gICAgXCJOb25lXCIsIHNldCBlbmZvcmNlbWVudCB0byBcIk5vbmVcIi5cbiAgICBpZiAoYXR0cmlidXRlVmFsdWVMb3dlcmNhc2UuaW5jbHVkZXMoJ25vbmUnKSkge1xuICAgICAgZW5mb3JjZW1lbnQgPSAnTm9uZSdcbiAgICB9XG5cbiAgICAvLyAzLiBJZiBjb29raWUtYXYncyBhdHRyaWJ1dGUtdmFsdWUgaXMgYSBjYXNlLWluc2Vuc2l0aXZlIG1hdGNoIGZvclxuICAgIC8vICAgIFwiU3RyaWN0XCIsIHNldCBlbmZvcmNlbWVudCB0byBcIlN0cmljdFwiLlxuICAgIGlmIChhdHRyaWJ1dGVWYWx1ZUxvd2VyY2FzZS5pbmNsdWRlcygnc3RyaWN0JykpIHtcbiAgICAgIGVuZm9yY2VtZW50ID0gJ1N0cmljdCdcbiAgICB9XG5cbiAgICAvLyA0LiBJZiBjb29raWUtYXYncyBhdHRyaWJ1dGUtdmFsdWUgaXMgYSBjYXNlLWluc2Vuc2l0aXZlIG1hdGNoIGZvclxuICAgIC8vICAgIFwiTGF4XCIsIHNldCBlbmZvcmNlbWVudCB0byBcIkxheFwiLlxuICAgIGlmIChhdHRyaWJ1dGVWYWx1ZUxvd2VyY2FzZS5pbmNsdWRlcygnbGF4JykpIHtcbiAgICAgIGVuZm9yY2VtZW50ID0gJ0xheCdcbiAgICB9XG5cbiAgICAvLyA1LiBBcHBlbmQgYW4gYXR0cmlidXRlIHRvIHRoZSBjb29raWUtYXR0cmlidXRlLWxpc3Qgd2l0aCBhblxuICAgIC8vICAgIGF0dHJpYnV0ZS1uYW1lIG9mIFwiU2FtZVNpdGVcIiBhbmQgYW4gYXR0cmlidXRlLXZhbHVlIG9mXG4gICAgLy8gICAgZW5mb3JjZW1lbnQuXG4gICAgY29va2llQXR0cmlidXRlTGlzdC5zYW1lU2l0ZSA9IGVuZm9yY2VtZW50XG4gIH0gZWxzZSB7XG4gICAgY29va2llQXR0cmlidXRlTGlzdC51bnBhcnNlZCA/Pz0gW11cblxuICAgIGNvb2tpZUF0dHJpYnV0ZUxpc3QudW5wYXJzZWQucHVzaChgJHthdHRyaWJ1dGVOYW1lfT0ke2F0dHJpYnV0ZVZhbHVlfWApXG4gIH1cblxuICAvLyA4LiBSZXR1cm4gdG8gU3RlcCAxIG9mIHRoaXMgYWxnb3JpdGhtLlxuICByZXR1cm4gcGFyc2VVbnBhcnNlZEF0dHJpYnV0ZXModW5wYXJzZWRBdHRyaWJ1dGVzLCBjb29raWVBdHRyaWJ1dGVMaXN0KVxufVxuXG5tb2R1bGUuZXhwb3J0cyA9IHtcbiAgcGFyc2VTZXRDb29raWUsXG4gIHBhcnNlVW5wYXJzZWRBdHRyaWJ1dGVzXG59XG4iLAogICAgIid1c2Ugc3RyaWN0J1xuXG5jb25zdCB7IHBhcnNlU2V0Q29va2llIH0gPSByZXF1aXJlKCcuL3BhcnNlJylcbmNvbnN0IHsgc3RyaW5naWZ5LCBnZXRIZWFkZXJzTGlzdCB9ID0gcmVxdWlyZSgnLi91dGlsJylcbmNvbnN0IHsgd2ViaWRsIH0gPSByZXF1aXJlKCcuLi9mZXRjaC93ZWJpZGwnKVxuY29uc3QgeyBIZWFkZXJzIH0gPSByZXF1aXJlKCcuLi9mZXRjaC9oZWFkZXJzJylcblxuLyoqXG4gKiBAdHlwZWRlZiB7T2JqZWN0fSBDb29raWVcbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBuYW1lXG4gKiBAcHJvcGVydHkge3N0cmluZ30gdmFsdWVcbiAqIEBwcm9wZXJ0eSB7RGF0ZXxudW1iZXJ8dW5kZWZpbmVkfSBleHBpcmVzXG4gKiBAcHJvcGVydHkge251bWJlcnx1bmRlZmluZWR9IG1heEFnZVxuICogQHByb3BlcnR5IHtzdHJpbmd8dW5kZWZpbmVkfSBkb21haW5cbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfHVuZGVmaW5lZH0gcGF0aFxuICogQHByb3BlcnR5IHtib29sZWFufHVuZGVmaW5lZH0gc2VjdXJlXG4gKiBAcHJvcGVydHkge2Jvb2xlYW58dW5kZWZpbmVkfSBodHRwT25seVxuICogQHByb3BlcnR5IHsnU3RyaWN0J3wnTGF4J3wnTm9uZSd9IHNhbWVTaXRlXG4gKiBAcHJvcGVydHkge3N0cmluZ1tdfSB1bnBhcnNlZFxuICovXG5cbi8qKlxuICogQHBhcmFtIHtIZWFkZXJzfSBoZWFkZXJzXG4gKiBAcmV0dXJucyB7UmVjb3JkPHN0cmluZywgc3RyaW5nPn1cbiAqL1xuZnVuY3Rpb24gZ2V0Q29va2llcyAoaGVhZGVycykge1xuICB3ZWJpZGwuYXJndW1lbnRMZW5ndGhDaGVjayhhcmd1bWVudHMsIDEsIHsgaGVhZGVyOiAnZ2V0Q29va2llcycgfSlcblxuICB3ZWJpZGwuYnJhbmRDaGVjayhoZWFkZXJzLCBIZWFkZXJzLCB7IHN0cmljdDogZmFsc2UgfSlcblxuICBjb25zdCBjb29raWUgPSBoZWFkZXJzLmdldCgnY29va2llJylcbiAgY29uc3Qgb3V0ID0ge31cblxuICBpZiAoIWNvb2tpZSkge1xuICAgIHJldHVybiBvdXRcbiAgfVxuXG4gIGZvciAoY29uc3QgcGllY2Ugb2YgY29va2llLnNwbGl0KCc7JykpIHtcbiAgICBjb25zdCBbbmFtZSwgLi4udmFsdWVdID0gcGllY2Uuc3BsaXQoJz0nKVxuXG4gICAgb3V0W25hbWUudHJpbSgpXSA9IHZhbHVlLmpvaW4oJz0nKVxuICB9XG5cbiAgcmV0dXJuIG91dFxufVxuXG4vKipcbiAqIEBwYXJhbSB7SGVhZGVyc30gaGVhZGVyc1xuICogQHBhcmFtIHtzdHJpbmd9IG5hbWVcbiAqIEBwYXJhbSB7eyBwYXRoPzogc3RyaW5nLCBkb21haW4/OiBzdHJpbmcgfXx1bmRlZmluZWR9IGF0dHJpYnV0ZXNcbiAqIEByZXR1cm5zIHt2b2lkfVxuICovXG5mdW5jdGlvbiBkZWxldGVDb29raWUgKGhlYWRlcnMsIG5hbWUsIGF0dHJpYnV0ZXMpIHtcbiAgd2ViaWRsLmFyZ3VtZW50TGVuZ3RoQ2hlY2soYXJndW1lbnRzLCAyLCB7IGhlYWRlcjogJ2RlbGV0ZUNvb2tpZScgfSlcblxuICB3ZWJpZGwuYnJhbmRDaGVjayhoZWFkZXJzLCBIZWFkZXJzLCB7IHN0cmljdDogZmFsc2UgfSlcblxuICBuYW1lID0gd2ViaWRsLmNvbnZlcnRlcnMuRE9NU3RyaW5nKG5hbWUpXG4gIGF0dHJpYnV0ZXMgPSB3ZWJpZGwuY29udmVydGVycy5EZWxldGVDb29raWVBdHRyaWJ1dGVzKGF0dHJpYnV0ZXMpXG5cbiAgLy8gTWF0Y2hlcyBiZWhhdmlvciBvZlxuICAvLyBodHRwczovL2dpdGh1Yi5jb20vZGVub2xhbmQvZGVub19zdGQvYmxvYi82MzgyN2IxNjMzMGI4MjQ4OWEwNDYxNDAyN2MzM2I3OTA0ZTA4YmU1L2h0dHAvY29va2llLnRzI0wyNzhcbiAgc2V0Q29va2llKGhlYWRlcnMsIHtcbiAgICBuYW1lLFxuICAgIHZhbHVlOiAnJyxcbiAgICBleHBpcmVzOiBuZXcgRGF0ZSgwKSxcbiAgICAuLi5hdHRyaWJ1dGVzXG4gIH0pXG59XG5cbi8qKlxuICogQHBhcmFtIHtIZWFkZXJzfSBoZWFkZXJzXG4gKiBAcmV0dXJucyB7Q29va2llW119XG4gKi9cbmZ1bmN0aW9uIGdldFNldENvb2tpZXMgKGhlYWRlcnMpIHtcbiAgd2ViaWRsLmFyZ3VtZW50TGVuZ3RoQ2hlY2soYXJndW1lbnRzLCAxLCB7IGhlYWRlcjogJ2dldFNldENvb2tpZXMnIH0pXG5cbiAgd2ViaWRsLmJyYW5kQ2hlY2soaGVhZGVycywgSGVhZGVycywgeyBzdHJpY3Q6IGZhbHNlIH0pXG5cbiAgY29uc3QgY29va2llcyA9IGdldEhlYWRlcnNMaXN0KGhlYWRlcnMpLmNvb2tpZXNcblxuICBpZiAoIWNvb2tpZXMpIHtcbiAgICByZXR1cm4gW11cbiAgfVxuXG4gIC8vIEluIG9sZGVyIHZlcnNpb25zIG9mIHVuZGljaSwgY29va2llcyBpcyBhIGxpc3Qgb2YgbmFtZTp2YWx1ZS5cbiAgcmV0dXJuIGNvb2tpZXMubWFwKChwYWlyKSA9PiBwYXJzZVNldENvb2tpZShBcnJheS5pc0FycmF5KHBhaXIpID8gcGFpclsxXSA6IHBhaXIpKVxufVxuXG4vKipcbiAqIEBwYXJhbSB7SGVhZGVyc30gaGVhZGVyc1xuICogQHBhcmFtIHtDb29raWV9IGNvb2tpZVxuICogQHJldHVybnMge3ZvaWR9XG4gKi9cbmZ1bmN0aW9uIHNldENvb2tpZSAoaGVhZGVycywgY29va2llKSB7XG4gIHdlYmlkbC5hcmd1bWVudExlbmd0aENoZWNrKGFyZ3VtZW50cywgMiwgeyBoZWFkZXI6ICdzZXRDb29raWUnIH0pXG5cbiAgd2ViaWRsLmJyYW5kQ2hlY2soaGVhZGVycywgSGVhZGVycywgeyBzdHJpY3Q6IGZhbHNlIH0pXG5cbiAgY29va2llID0gd2ViaWRsLmNvbnZlcnRlcnMuQ29va2llKGNvb2tpZSlcblxuICBjb25zdCBzdHIgPSBzdHJpbmdpZnkoY29va2llKVxuXG4gIGlmIChzdHIpIHtcbiAgICBoZWFkZXJzLmFwcGVuZCgnU2V0LUNvb2tpZScsIHN0cmluZ2lmeShjb29raWUpKVxuICB9XG59XG5cbndlYmlkbC5jb252ZXJ0ZXJzLkRlbGV0ZUNvb2tpZUF0dHJpYnV0ZXMgPSB3ZWJpZGwuZGljdGlvbmFyeUNvbnZlcnRlcihbXG4gIHtcbiAgICBjb252ZXJ0ZXI6IHdlYmlkbC5udWxsYWJsZUNvbnZlcnRlcih3ZWJpZGwuY29udmVydGVycy5ET01TdHJpbmcpLFxuICAgIGtleTogJ3BhdGgnLFxuICAgIGRlZmF1bHRWYWx1ZTogbnVsbFxuICB9LFxuICB7XG4gICAgY29udmVydGVyOiB3ZWJpZGwubnVsbGFibGVDb252ZXJ0ZXIod2ViaWRsLmNvbnZlcnRlcnMuRE9NU3RyaW5nKSxcbiAgICBrZXk6ICdkb21haW4nLFxuICAgIGRlZmF1bHRWYWx1ZTogbnVsbFxuICB9XG5dKVxuXG53ZWJpZGwuY29udmVydGVycy5Db29raWUgPSB3ZWJpZGwuZGljdGlvbmFyeUNvbnZlcnRlcihbXG4gIHtcbiAgICBjb252ZXJ0ZXI6IHdlYmlkbC5jb252ZXJ0ZXJzLkRPTVN0cmluZyxcbiAgICBrZXk6ICduYW1lJ1xuICB9LFxuICB7XG4gICAgY29udmVydGVyOiB3ZWJpZGwuY29udmVydGVycy5ET01TdHJpbmcsXG4gICAga2V5OiAndmFsdWUnXG4gIH0sXG4gIHtcbiAgICBjb252ZXJ0ZXI6IHdlYmlkbC5udWxsYWJsZUNvbnZlcnRlcigodmFsdWUpID0+IHtcbiAgICAgIGlmICh0eXBlb2YgdmFsdWUgPT09ICdudW1iZXInKSB7XG4gICAgICAgIHJldHVybiB3ZWJpZGwuY29udmVydGVyc1sndW5zaWduZWQgbG9uZyBsb25nJ10odmFsdWUpXG4gICAgICB9XG5cbiAgICAgIHJldHVybiBuZXcgRGF0ZSh2YWx1ZSlcbiAgICB9KSxcbiAgICBrZXk6ICdleHBpcmVzJyxcbiAgICBkZWZhdWx0VmFsdWU6IG51bGxcbiAgfSxcbiAge1xuICAgIGNvbnZlcnRlcjogd2ViaWRsLm51bGxhYmxlQ29udmVydGVyKHdlYmlkbC5jb252ZXJ0ZXJzWydsb25nIGxvbmcnXSksXG4gICAga2V5OiAnbWF4QWdlJyxcbiAgICBkZWZhdWx0VmFsdWU6IG51bGxcbiAgfSxcbiAge1xuICAgIGNvbnZlcnRlcjogd2ViaWRsLm51bGxhYmxlQ29udmVydGVyKHdlYmlkbC5jb252ZXJ0ZXJzLkRPTVN0cmluZyksXG4gICAga2V5OiAnZG9tYWluJyxcbiAgICBkZWZhdWx0VmFsdWU6IG51bGxcbiAgfSxcbiAge1xuICAgIGNvbnZlcnRlcjogd2ViaWRsLm51bGxhYmxlQ29udmVydGVyKHdlYmlkbC5jb252ZXJ0ZXJzLkRPTVN0cmluZyksXG4gICAga2V5OiAncGF0aCcsXG4gICAgZGVmYXVsdFZhbHVlOiBudWxsXG4gIH0sXG4gIHtcbiAgICBjb252ZXJ0ZXI6IHdlYmlkbC5udWxsYWJsZUNvbnZlcnRlcih3ZWJpZGwuY29udmVydGVycy5ib29sZWFuKSxcbiAgICBrZXk6ICdzZWN1cmUnLFxuICAgIGRlZmF1bHRWYWx1ZTogbnVsbFxuICB9LFxuICB7XG4gICAgY29udmVydGVyOiB3ZWJpZGwubnVsbGFibGVDb252ZXJ0ZXIod2ViaWRsLmNvbnZlcnRlcnMuYm9vbGVhbiksXG4gICAga2V5OiAnaHR0cE9ubHknLFxuICAgIGRlZmF1bHRWYWx1ZTogbnVsbFxuICB9LFxuICB7XG4gICAgY29udmVydGVyOiB3ZWJpZGwuY29udmVydGVycy5VU1ZTdHJpbmcsXG4gICAga2V5OiAnc2FtZVNpdGUnLFxuICAgIGFsbG93ZWRWYWx1ZXM6IFsnU3RyaWN0JywgJ0xheCcsICdOb25lJ11cbiAgfSxcbiAge1xuICAgIGNvbnZlcnRlcjogd2ViaWRsLnNlcXVlbmNlQ29udmVydGVyKHdlYmlkbC5jb252ZXJ0ZXJzLkRPTVN0cmluZyksXG4gICAga2V5OiAndW5wYXJzZWQnLFxuICAgIGRlZmF1bHRWYWx1ZTogW11cbiAgfVxuXSlcblxubW9kdWxlLmV4cG9ydHMgPSB7XG4gIGdldENvb2tpZXMsXG4gIGRlbGV0ZUNvb2tpZSxcbiAgZ2V0U2V0Q29va2llcyxcbiAgc2V0Q29va2llXG59XG4iLAogICAgIid1c2Ugc3RyaWN0J1xuXG4vLyBUaGlzIGlzIGEgR2xvYmFsbHkgVW5pcXVlIElkZW50aWZpZXIgdW5pcXVlIHVzZWRcbi8vIHRvIHZhbGlkYXRlIHRoYXQgdGhlIGVuZHBvaW50IGFjY2VwdHMgd2Vic29ja2V0XG4vLyBjb25uZWN0aW9ucy5cbi8vIFNlZSBodHRwczovL3d3dy5yZmMtZWRpdG9yLm9yZy9yZmMvcmZjNjQ1NS5odG1sI3NlY3Rpb24tMS4zXG5jb25zdCB1aWQgPSAnMjU4RUFGQTUtRTkxNC00N0RBLTk1Q0EtQzVBQjBEQzg1QjExJ1xuXG4vKiogQHR5cGUge1Byb3BlcnR5RGVzY3JpcHRvcn0gKi9cbmNvbnN0IHN0YXRpY1Byb3BlcnR5RGVzY3JpcHRvcnMgPSB7XG4gIGVudW1lcmFibGU6IHRydWUsXG4gIHdyaXRhYmxlOiBmYWxzZSxcbiAgY29uZmlndXJhYmxlOiBmYWxzZVxufVxuXG5jb25zdCBzdGF0ZXMgPSB7XG4gIENPTk5FQ1RJTkc6IDAsXG4gIE9QRU46IDEsXG4gIENMT1NJTkc6IDIsXG4gIENMT1NFRDogM1xufVxuXG5jb25zdCBvcGNvZGVzID0ge1xuICBDT05USU5VQVRJT046IDB4MCxcbiAgVEVYVDogMHgxLFxuICBCSU5BUlk6IDB4MixcbiAgQ0xPU0U6IDB4OCxcbiAgUElORzogMHg5LFxuICBQT05HOiAweEFcbn1cblxuY29uc3QgbWF4VW5zaWduZWQxNkJpdCA9IDIgKiogMTYgLSAxIC8vIDY1NTM1XG5cbmNvbnN0IHBhcnNlclN0YXRlcyA9IHtcbiAgSU5GTzogMCxcbiAgUEFZTE9BRExFTkdUSF8xNjogMixcbiAgUEFZTE9BRExFTkdUSF82NDogMyxcbiAgUkVBRF9EQVRBOiA0XG59XG5cbmNvbnN0IGVtcHR5QnVmZmVyID0gQnVmZmVyLmFsbG9jVW5zYWZlKDApXG5cbm1vZHVsZS5leHBvcnRzID0ge1xuICB1aWQsXG4gIHN0YXRpY1Byb3BlcnR5RGVzY3JpcHRvcnMsXG4gIHN0YXRlcyxcbiAgb3Bjb2RlcyxcbiAgbWF4VW5zaWduZWQxNkJpdCxcbiAgcGFyc2VyU3RhdGVzLFxuICBlbXB0eUJ1ZmZlclxufVxuIiwKICAgICIndXNlIHN0cmljdCdcblxubW9kdWxlLmV4cG9ydHMgPSB7XG4gIGtXZWJTb2NrZXRVUkw6IFN5bWJvbCgndXJsJyksXG4gIGtSZWFkeVN0YXRlOiBTeW1ib2woJ3JlYWR5IHN0YXRlJyksXG4gIGtDb250cm9sbGVyOiBTeW1ib2woJ2NvbnRyb2xsZXInKSxcbiAga1Jlc3BvbnNlOiBTeW1ib2woJ3Jlc3BvbnNlJyksXG4gIGtCaW5hcnlUeXBlOiBTeW1ib2woJ2JpbmFyeSB0eXBlJyksXG4gIGtTZW50Q2xvc2U6IFN5bWJvbCgnc2VudCBjbG9zZScpLFxuICBrUmVjZWl2ZWRDbG9zZTogU3ltYm9sKCdyZWNlaXZlZCBjbG9zZScpLFxuICBrQnl0ZVBhcnNlcjogU3ltYm9sKCdieXRlIHBhcnNlcicpXG59XG4iLAogICAgIid1c2Ugc3RyaWN0J1xuXG5jb25zdCB7IHdlYmlkbCB9ID0gcmVxdWlyZSgnLi4vZmV0Y2gvd2ViaWRsJylcbmNvbnN0IHsga0VudW1lcmFibGVQcm9wZXJ0eSB9ID0gcmVxdWlyZSgnLi4vY29yZS91dGlsJylcbmNvbnN0IHsgTWVzc2FnZVBvcnQgfSA9IHJlcXVpcmUoJ3dvcmtlcl90aHJlYWRzJylcblxuLyoqXG4gKiBAc2VlIGh0dHBzOi8vaHRtbC5zcGVjLndoYXR3Zy5vcmcvbXVsdGlwYWdlL2NvbW1zLmh0bWwjbWVzc2FnZWV2ZW50XG4gKi9cbmNsYXNzIE1lc3NhZ2VFdmVudCBleHRlbmRzIEV2ZW50IHtcbiAgI2V2ZW50SW5pdFxuXG4gIGNvbnN0cnVjdG9yICh0eXBlLCBldmVudEluaXREaWN0ID0ge30pIHtcbiAgICB3ZWJpZGwuYXJndW1lbnRMZW5ndGhDaGVjayhhcmd1bWVudHMsIDEsIHsgaGVhZGVyOiAnTWVzc2FnZUV2ZW50IGNvbnN0cnVjdG9yJyB9KVxuXG4gICAgdHlwZSA9IHdlYmlkbC5jb252ZXJ0ZXJzLkRPTVN0cmluZyh0eXBlKVxuICAgIGV2ZW50SW5pdERpY3QgPSB3ZWJpZGwuY29udmVydGVycy5NZXNzYWdlRXZlbnRJbml0KGV2ZW50SW5pdERpY3QpXG5cbiAgICBzdXBlcih0eXBlLCBldmVudEluaXREaWN0KVxuXG4gICAgdGhpcy4jZXZlbnRJbml0ID0gZXZlbnRJbml0RGljdFxuICB9XG5cbiAgZ2V0IGRhdGEgKCkge1xuICAgIHdlYmlkbC5icmFuZENoZWNrKHRoaXMsIE1lc3NhZ2VFdmVudClcblxuICAgIHJldHVybiB0aGlzLiNldmVudEluaXQuZGF0YVxuICB9XG5cbiAgZ2V0IG9yaWdpbiAoKSB7XG4gICAgd2ViaWRsLmJyYW5kQ2hlY2sodGhpcywgTWVzc2FnZUV2ZW50KVxuXG4gICAgcmV0dXJuIHRoaXMuI2V2ZW50SW5pdC5vcmlnaW5cbiAgfVxuXG4gIGdldCBsYXN0RXZlbnRJZCAoKSB7XG4gICAgd2ViaWRsLmJyYW5kQ2hlY2sodGhpcywgTWVzc2FnZUV2ZW50KVxuXG4gICAgcmV0dXJuIHRoaXMuI2V2ZW50SW5pdC5sYXN0RXZlbnRJZFxuICB9XG5cbiAgZ2V0IHNvdXJjZSAoKSB7XG4gICAgd2ViaWRsLmJyYW5kQ2hlY2sodGhpcywgTWVzc2FnZUV2ZW50KVxuXG4gICAgcmV0dXJuIHRoaXMuI2V2ZW50SW5pdC5zb3VyY2VcbiAgfVxuXG4gIGdldCBwb3J0cyAoKSB7XG4gICAgd2ViaWRsLmJyYW5kQ2hlY2sodGhpcywgTWVzc2FnZUV2ZW50KVxuXG4gICAgaWYgKCFPYmplY3QuaXNGcm96ZW4odGhpcy4jZXZlbnRJbml0LnBvcnRzKSkge1xuICAgICAgT2JqZWN0LmZyZWV6ZSh0aGlzLiNldmVudEluaXQucG9ydHMpXG4gICAgfVxuXG4gICAgcmV0dXJuIHRoaXMuI2V2ZW50SW5pdC5wb3J0c1xuICB9XG5cbiAgaW5pdE1lc3NhZ2VFdmVudCAoXG4gICAgdHlwZSxcbiAgICBidWJibGVzID0gZmFsc2UsXG4gICAgY2FuY2VsYWJsZSA9IGZhbHNlLFxuICAgIGRhdGEgPSBudWxsLFxuICAgIG9yaWdpbiA9ICcnLFxuICAgIGxhc3RFdmVudElkID0gJycsXG4gICAgc291cmNlID0gbnVsbCxcbiAgICBwb3J0cyA9IFtdXG4gICkge1xuICAgIHdlYmlkbC5icmFuZENoZWNrKHRoaXMsIE1lc3NhZ2VFdmVudClcblxuICAgIHdlYmlkbC5hcmd1bWVudExlbmd0aENoZWNrKGFyZ3VtZW50cywgMSwgeyBoZWFkZXI6ICdNZXNzYWdlRXZlbnQuaW5pdE1lc3NhZ2VFdmVudCcgfSlcblxuICAgIHJldHVybiBuZXcgTWVzc2FnZUV2ZW50KHR5cGUsIHtcbiAgICAgIGJ1YmJsZXMsIGNhbmNlbGFibGUsIGRhdGEsIG9yaWdpbiwgbGFzdEV2ZW50SWQsIHNvdXJjZSwgcG9ydHNcbiAgICB9KVxuICB9XG59XG5cbi8qKlxuICogQHNlZSBodHRwczovL3dlYnNvY2tldHMuc3BlYy53aGF0d2cub3JnLyN0aGUtY2xvc2VldmVudC1pbnRlcmZhY2VcbiAqL1xuY2xhc3MgQ2xvc2VFdmVudCBleHRlbmRzIEV2ZW50IHtcbiAgI2V2ZW50SW5pdFxuXG4gIGNvbnN0cnVjdG9yICh0eXBlLCBldmVudEluaXREaWN0ID0ge30pIHtcbiAgICB3ZWJpZGwuYXJndW1lbnRMZW5ndGhDaGVjayhhcmd1bWVudHMsIDEsIHsgaGVhZGVyOiAnQ2xvc2VFdmVudCBjb25zdHJ1Y3RvcicgfSlcblxuICAgIHR5cGUgPSB3ZWJpZGwuY29udmVydGVycy5ET01TdHJpbmcodHlwZSlcbiAgICBldmVudEluaXREaWN0ID0gd2ViaWRsLmNvbnZlcnRlcnMuQ2xvc2VFdmVudEluaXQoZXZlbnRJbml0RGljdClcblxuICAgIHN1cGVyKHR5cGUsIGV2ZW50SW5pdERpY3QpXG5cbiAgICB0aGlzLiNldmVudEluaXQgPSBldmVudEluaXREaWN0XG4gIH1cblxuICBnZXQgd2FzQ2xlYW4gKCkge1xuICAgIHdlYmlkbC5icmFuZENoZWNrKHRoaXMsIENsb3NlRXZlbnQpXG5cbiAgICByZXR1cm4gdGhpcy4jZXZlbnRJbml0Lndhc0NsZWFuXG4gIH1cblxuICBnZXQgY29kZSAoKSB7XG4gICAgd2ViaWRsLmJyYW5kQ2hlY2sodGhpcywgQ2xvc2VFdmVudClcblxuICAgIHJldHVybiB0aGlzLiNldmVudEluaXQuY29kZVxuICB9XG5cbiAgZ2V0IHJlYXNvbiAoKSB7XG4gICAgd2ViaWRsLmJyYW5kQ2hlY2sodGhpcywgQ2xvc2VFdmVudClcblxuICAgIHJldHVybiB0aGlzLiNldmVudEluaXQucmVhc29uXG4gIH1cbn1cblxuLy8gaHR0cHM6Ly9odG1sLnNwZWMud2hhdHdnLm9yZy9tdWx0aXBhZ2Uvd2ViYXBwYXBpcy5odG1sI3RoZS1lcnJvcmV2ZW50LWludGVyZmFjZVxuY2xhc3MgRXJyb3JFdmVudCBleHRlbmRzIEV2ZW50IHtcbiAgI2V2ZW50SW5pdFxuXG4gIGNvbnN0cnVjdG9yICh0eXBlLCBldmVudEluaXREaWN0KSB7XG4gICAgd2ViaWRsLmFyZ3VtZW50TGVuZ3RoQ2hlY2soYXJndW1lbnRzLCAxLCB7IGhlYWRlcjogJ0Vycm9yRXZlbnQgY29uc3RydWN0b3InIH0pXG5cbiAgICBzdXBlcih0eXBlLCBldmVudEluaXREaWN0KVxuXG4gICAgdHlwZSA9IHdlYmlkbC5jb252ZXJ0ZXJzLkRPTVN0cmluZyh0eXBlKVxuICAgIGV2ZW50SW5pdERpY3QgPSB3ZWJpZGwuY29udmVydGVycy5FcnJvckV2ZW50SW5pdChldmVudEluaXREaWN0ID8/IHt9KVxuXG4gICAgdGhpcy4jZXZlbnRJbml0ID0gZXZlbnRJbml0RGljdFxuICB9XG5cbiAgZ2V0IG1lc3NhZ2UgKCkge1xuICAgIHdlYmlkbC5icmFuZENoZWNrKHRoaXMsIEVycm9yRXZlbnQpXG5cbiAgICByZXR1cm4gdGhpcy4jZXZlbnRJbml0Lm1lc3NhZ2VcbiAgfVxuXG4gIGdldCBmaWxlbmFtZSAoKSB7XG4gICAgd2ViaWRsLmJyYW5kQ2hlY2sodGhpcywgRXJyb3JFdmVudClcblxuICAgIHJldHVybiB0aGlzLiNldmVudEluaXQuZmlsZW5hbWVcbiAgfVxuXG4gIGdldCBsaW5lbm8gKCkge1xuICAgIHdlYmlkbC5icmFuZENoZWNrKHRoaXMsIEVycm9yRXZlbnQpXG5cbiAgICByZXR1cm4gdGhpcy4jZXZlbnRJbml0LmxpbmVub1xuICB9XG5cbiAgZ2V0IGNvbG5vICgpIHtcbiAgICB3ZWJpZGwuYnJhbmRDaGVjayh0aGlzLCBFcnJvckV2ZW50KVxuXG4gICAgcmV0dXJuIHRoaXMuI2V2ZW50SW5pdC5jb2xub1xuICB9XG5cbiAgZ2V0IGVycm9yICgpIHtcbiAgICB3ZWJpZGwuYnJhbmRDaGVjayh0aGlzLCBFcnJvckV2ZW50KVxuXG4gICAgcmV0dXJuIHRoaXMuI2V2ZW50SW5pdC5lcnJvclxuICB9XG59XG5cbk9iamVjdC5kZWZpbmVQcm9wZXJ0aWVzKE1lc3NhZ2VFdmVudC5wcm90b3R5cGUsIHtcbiAgW1N5bWJvbC50b1N0cmluZ1RhZ106IHtcbiAgICB2YWx1ZTogJ01lc3NhZ2VFdmVudCcsXG4gICAgY29uZmlndXJhYmxlOiB0cnVlXG4gIH0sXG4gIGRhdGE6IGtFbnVtZXJhYmxlUHJvcGVydHksXG4gIG9yaWdpbjoga0VudW1lcmFibGVQcm9wZXJ0eSxcbiAgbGFzdEV2ZW50SWQ6IGtFbnVtZXJhYmxlUHJvcGVydHksXG4gIHNvdXJjZToga0VudW1lcmFibGVQcm9wZXJ0eSxcbiAgcG9ydHM6IGtFbnVtZXJhYmxlUHJvcGVydHksXG4gIGluaXRNZXNzYWdlRXZlbnQ6IGtFbnVtZXJhYmxlUHJvcGVydHlcbn0pXG5cbk9iamVjdC5kZWZpbmVQcm9wZXJ0aWVzKENsb3NlRXZlbnQucHJvdG90eXBlLCB7XG4gIFtTeW1ib2wudG9TdHJpbmdUYWddOiB7XG4gICAgdmFsdWU6ICdDbG9zZUV2ZW50JyxcbiAgICBjb25maWd1cmFibGU6IHRydWVcbiAgfSxcbiAgcmVhc29uOiBrRW51bWVyYWJsZVByb3BlcnR5LFxuICBjb2RlOiBrRW51bWVyYWJsZVByb3BlcnR5LFxuICB3YXNDbGVhbjoga0VudW1lcmFibGVQcm9wZXJ0eVxufSlcblxuT2JqZWN0LmRlZmluZVByb3BlcnRpZXMoRXJyb3JFdmVudC5wcm90b3R5cGUsIHtcbiAgW1N5bWJvbC50b1N0cmluZ1RhZ106IHtcbiAgICB2YWx1ZTogJ0Vycm9yRXZlbnQnLFxuICAgIGNvbmZpZ3VyYWJsZTogdHJ1ZVxuICB9LFxuICBtZXNzYWdlOiBrRW51bWVyYWJsZVByb3BlcnR5LFxuICBmaWxlbmFtZToga0VudW1lcmFibGVQcm9wZXJ0eSxcbiAgbGluZW5vOiBrRW51bWVyYWJsZVByb3BlcnR5LFxuICBjb2xubzoga0VudW1lcmFibGVQcm9wZXJ0eSxcbiAgZXJyb3I6IGtFbnVtZXJhYmxlUHJvcGVydHlcbn0pXG5cbndlYmlkbC5jb252ZXJ0ZXJzLk1lc3NhZ2VQb3J0ID0gd2ViaWRsLmludGVyZmFjZUNvbnZlcnRlcihNZXNzYWdlUG9ydClcblxud2ViaWRsLmNvbnZlcnRlcnNbJ3NlcXVlbmNlPE1lc3NhZ2VQb3J0PiddID0gd2ViaWRsLnNlcXVlbmNlQ29udmVydGVyKFxuICB3ZWJpZGwuY29udmVydGVycy5NZXNzYWdlUG9ydFxuKVxuXG5jb25zdCBldmVudEluaXQgPSBbXG4gIHtcbiAgICBrZXk6ICdidWJibGVzJyxcbiAgICBjb252ZXJ0ZXI6IHdlYmlkbC5jb252ZXJ0ZXJzLmJvb2xlYW4sXG4gICAgZGVmYXVsdFZhbHVlOiBmYWxzZVxuICB9LFxuICB7XG4gICAga2V5OiAnY2FuY2VsYWJsZScsXG4gICAgY29udmVydGVyOiB3ZWJpZGwuY29udmVydGVycy5ib29sZWFuLFxuICAgIGRlZmF1bHRWYWx1ZTogZmFsc2VcbiAgfSxcbiAge1xuICAgIGtleTogJ2NvbXBvc2VkJyxcbiAgICBjb252ZXJ0ZXI6IHdlYmlkbC5jb252ZXJ0ZXJzLmJvb2xlYW4sXG4gICAgZGVmYXVsdFZhbHVlOiBmYWxzZVxuICB9XG5dXG5cbndlYmlkbC5jb252ZXJ0ZXJzLk1lc3NhZ2VFdmVudEluaXQgPSB3ZWJpZGwuZGljdGlvbmFyeUNvbnZlcnRlcihbXG4gIC4uLmV2ZW50SW5pdCxcbiAge1xuICAgIGtleTogJ2RhdGEnLFxuICAgIGNvbnZlcnRlcjogd2ViaWRsLmNvbnZlcnRlcnMuYW55LFxuICAgIGRlZmF1bHRWYWx1ZTogbnVsbFxuICB9LFxuICB7XG4gICAga2V5OiAnb3JpZ2luJyxcbiAgICBjb252ZXJ0ZXI6IHdlYmlkbC5jb252ZXJ0ZXJzLlVTVlN0cmluZyxcbiAgICBkZWZhdWx0VmFsdWU6ICcnXG4gIH0sXG4gIHtcbiAgICBrZXk6ICdsYXN0RXZlbnRJZCcsXG4gICAgY29udmVydGVyOiB3ZWJpZGwuY29udmVydGVycy5ET01TdHJpbmcsXG4gICAgZGVmYXVsdFZhbHVlOiAnJ1xuICB9LFxuICB7XG4gICAga2V5OiAnc291cmNlJyxcbiAgICAvLyBOb2RlIGRvZXNuJ3QgaW1wbGVtZW50IFdpbmRvd1Byb3h5IG9yIFNlcnZpY2VXb3JrZXIsIHNvIHRoZSBvbmx5XG4gICAgLy8gdmFsaWQgdmFsdWUgZm9yIHNvdXJjZSBpcyBhIE1lc3NhZ2VQb3J0LlxuICAgIGNvbnZlcnRlcjogd2ViaWRsLm51bGxhYmxlQ29udmVydGVyKHdlYmlkbC5jb252ZXJ0ZXJzLk1lc3NhZ2VQb3J0KSxcbiAgICBkZWZhdWx0VmFsdWU6IG51bGxcbiAgfSxcbiAge1xuICAgIGtleTogJ3BvcnRzJyxcbiAgICBjb252ZXJ0ZXI6IHdlYmlkbC5jb252ZXJ0ZXJzWydzZXF1ZW5jZTxNZXNzYWdlUG9ydD4nXSxcbiAgICBnZXQgZGVmYXVsdFZhbHVlICgpIHtcbiAgICAgIHJldHVybiBbXVxuICAgIH1cbiAgfVxuXSlcblxud2ViaWRsLmNvbnZlcnRlcnMuQ2xvc2VFdmVudEluaXQgPSB3ZWJpZGwuZGljdGlvbmFyeUNvbnZlcnRlcihbXG4gIC4uLmV2ZW50SW5pdCxcbiAge1xuICAgIGtleTogJ3dhc0NsZWFuJyxcbiAgICBjb252ZXJ0ZXI6IHdlYmlkbC5jb252ZXJ0ZXJzLmJvb2xlYW4sXG4gICAgZGVmYXVsdFZhbHVlOiBmYWxzZVxuICB9LFxuICB7XG4gICAga2V5OiAnY29kZScsXG4gICAgY29udmVydGVyOiB3ZWJpZGwuY29udmVydGVyc1sndW5zaWduZWQgc2hvcnQnXSxcbiAgICBkZWZhdWx0VmFsdWU6IDBcbiAgfSxcbiAge1xuICAgIGtleTogJ3JlYXNvbicsXG4gICAgY29udmVydGVyOiB3ZWJpZGwuY29udmVydGVycy5VU1ZTdHJpbmcsXG4gICAgZGVmYXVsdFZhbHVlOiAnJ1xuICB9XG5dKVxuXG53ZWJpZGwuY29udmVydGVycy5FcnJvckV2ZW50SW5pdCA9IHdlYmlkbC5kaWN0aW9uYXJ5Q29udmVydGVyKFtcbiAgLi4uZXZlbnRJbml0LFxuICB7XG4gICAga2V5OiAnbWVzc2FnZScsXG4gICAgY29udmVydGVyOiB3ZWJpZGwuY29udmVydGVycy5ET01TdHJpbmcsXG4gICAgZGVmYXVsdFZhbHVlOiAnJ1xuICB9LFxuICB7XG4gICAga2V5OiAnZmlsZW5hbWUnLFxuICAgIGNvbnZlcnRlcjogd2ViaWRsLmNvbnZlcnRlcnMuVVNWU3RyaW5nLFxuICAgIGRlZmF1bHRWYWx1ZTogJydcbiAgfSxcbiAge1xuICAgIGtleTogJ2xpbmVubycsXG4gICAgY29udmVydGVyOiB3ZWJpZGwuY29udmVydGVyc1sndW5zaWduZWQgbG9uZyddLFxuICAgIGRlZmF1bHRWYWx1ZTogMFxuICB9LFxuICB7XG4gICAga2V5OiAnY29sbm8nLFxuICAgIGNvbnZlcnRlcjogd2ViaWRsLmNvbnZlcnRlcnNbJ3Vuc2lnbmVkIGxvbmcnXSxcbiAgICBkZWZhdWx0VmFsdWU6IDBcbiAgfSxcbiAge1xuICAgIGtleTogJ2Vycm9yJyxcbiAgICBjb252ZXJ0ZXI6IHdlYmlkbC5jb252ZXJ0ZXJzLmFueVxuICB9XG5dKVxuXG5tb2R1bGUuZXhwb3J0cyA9IHtcbiAgTWVzc2FnZUV2ZW50LFxuICBDbG9zZUV2ZW50LFxuICBFcnJvckV2ZW50XG59XG4iLAogICAgIid1c2Ugc3RyaWN0J1xuXG5jb25zdCB7IGtSZWFkeVN0YXRlLCBrQ29udHJvbGxlciwga1Jlc3BvbnNlLCBrQmluYXJ5VHlwZSwga1dlYlNvY2tldFVSTCB9ID0gcmVxdWlyZSgnLi9zeW1ib2xzJylcbmNvbnN0IHsgc3RhdGVzLCBvcGNvZGVzIH0gPSByZXF1aXJlKCcuL2NvbnN0YW50cycpXG5jb25zdCB7IE1lc3NhZ2VFdmVudCwgRXJyb3JFdmVudCB9ID0gcmVxdWlyZSgnLi9ldmVudHMnKVxuXG4vKiBnbG9iYWxzIEJsb2IgKi9cblxuLyoqXG4gKiBAcGFyYW0ge2ltcG9ydCgnLi93ZWJzb2NrZXQnKS5XZWJTb2NrZXR9IHdzXG4gKi9cbmZ1bmN0aW9uIGlzRXN0YWJsaXNoZWQgKHdzKSB7XG4gIC8vIElmIHRoZSBzZXJ2ZXIncyByZXNwb25zZSBpcyB2YWxpZGF0ZWQgYXMgcHJvdmlkZWQgZm9yIGFib3ZlLCBpdCBpc1xuICAvLyBzYWlkIHRoYXQgX1RoZSBXZWJTb2NrZXQgQ29ubmVjdGlvbiBpcyBFc3RhYmxpc2hlZF8gYW5kIHRoYXQgdGhlXG4gIC8vIFdlYlNvY2tldCBDb25uZWN0aW9uIGlzIGluIHRoZSBPUEVOIHN0YXRlLlxuICByZXR1cm4gd3Nba1JlYWR5U3RhdGVdID09PSBzdGF0ZXMuT1BFTlxufVxuXG4vKipcbiAqIEBwYXJhbSB7aW1wb3J0KCcuL3dlYnNvY2tldCcpLldlYlNvY2tldH0gd3NcbiAqL1xuZnVuY3Rpb24gaXNDbG9zaW5nICh3cykge1xuICAvLyBVcG9uIGVpdGhlciBzZW5kaW5nIG9yIHJlY2VpdmluZyBhIENsb3NlIGNvbnRyb2wgZnJhbWUsIGl0IGlzIHNhaWRcbiAgLy8gdGhhdCBfVGhlIFdlYlNvY2tldCBDbG9zaW5nIEhhbmRzaGFrZSBpcyBTdGFydGVkXyBhbmQgdGhhdCB0aGVcbiAgLy8gV2ViU29ja2V0IGNvbm5lY3Rpb24gaXMgaW4gdGhlIENMT1NJTkcgc3RhdGUuXG4gIHJldHVybiB3c1trUmVhZHlTdGF0ZV0gPT09IHN0YXRlcy5DTE9TSU5HXG59XG5cbi8qKlxuICogQHBhcmFtIHtpbXBvcnQoJy4vd2Vic29ja2V0JykuV2ViU29ja2V0fSB3c1xuICovXG5mdW5jdGlvbiBpc0Nsb3NlZCAod3MpIHtcbiAgcmV0dXJuIHdzW2tSZWFkeVN0YXRlXSA9PT0gc3RhdGVzLkNMT1NFRFxufVxuXG4vKipcbiAqIEBzZWUgaHR0cHM6Ly9kb20uc3BlYy53aGF0d2cub3JnLyNjb25jZXB0LWV2ZW50LWZpcmVcbiAqIEBwYXJhbSB7c3RyaW5nfSBlXG4gKiBAcGFyYW0ge0V2ZW50VGFyZ2V0fSB0YXJnZXRcbiAqIEBwYXJhbSB7RXZlbnRJbml0IHwgdW5kZWZpbmVkfSBldmVudEluaXREaWN0XG4gKi9cbmZ1bmN0aW9uIGZpcmVFdmVudCAoZSwgdGFyZ2V0LCBldmVudENvbnN0cnVjdG9yID0gRXZlbnQsIGV2ZW50SW5pdERpY3QpIHtcbiAgLy8gMS4gSWYgZXZlbnRDb25zdHJ1Y3RvciBpcyBub3QgZ2l2ZW4sIHRoZW4gbGV0IGV2ZW50Q29uc3RydWN0b3IgYmUgRXZlbnQuXG5cbiAgLy8gMi4gTGV0IGV2ZW50IGJlIHRoZSByZXN1bHQgb2YgY3JlYXRpbmcgYW4gZXZlbnQgZ2l2ZW4gZXZlbnRDb25zdHJ1Y3RvcixcbiAgLy8gICAgaW4gdGhlIHJlbGV2YW50IHJlYWxtIG9mIHRhcmdldC5cbiAgLy8gMy4gSW5pdGlhbGl6ZSBldmVudOKAmXMgdHlwZSBhdHRyaWJ1dGUgdG8gZS5cbiAgY29uc3QgZXZlbnQgPSBuZXcgZXZlbnRDb25zdHJ1Y3RvcihlLCBldmVudEluaXREaWN0KSAvLyBlc2xpbnQtZGlzYWJsZS1saW5lIG5ldy1jYXBcblxuICAvLyA0LiBJbml0aWFsaXplIGFueSBvdGhlciBJREwgYXR0cmlidXRlcyBvZiBldmVudCBhcyBkZXNjcmliZWQgaW4gdGhlXG4gIC8vICAgIGludm9jYXRpb24gb2YgdGhpcyBhbGdvcml0aG0uXG5cbiAgLy8gNS4gUmV0dXJuIHRoZSByZXN1bHQgb2YgZGlzcGF0Y2hpbmcgZXZlbnQgYXQgdGFyZ2V0LCB3aXRoIGxlZ2FjeSB0YXJnZXRcbiAgLy8gICAgb3ZlcnJpZGUgZmxhZyBzZXQgaWYgc2V0LlxuICB0YXJnZXQuZGlzcGF0Y2hFdmVudChldmVudClcbn1cblxuLyoqXG4gKiBAc2VlIGh0dHBzOi8vd2Vic29ja2V0cy5zcGVjLndoYXR3Zy5vcmcvI2ZlZWRiYWNrLWZyb20tdGhlLXByb3RvY29sXG4gKiBAcGFyYW0ge2ltcG9ydCgnLi93ZWJzb2NrZXQnKS5XZWJTb2NrZXR9IHdzXG4gKiBAcGFyYW0ge251bWJlcn0gdHlwZSBPcGNvZGVcbiAqIEBwYXJhbSB7QnVmZmVyfSBkYXRhIGFwcGxpY2F0aW9uIGRhdGFcbiAqL1xuZnVuY3Rpb24gd2Vic29ja2V0TWVzc2FnZVJlY2VpdmVkICh3cywgdHlwZSwgZGF0YSkge1xuICAvLyAxLiBJZiByZWFkeSBzdGF0ZSBpcyBub3QgT1BFTiAoMSksIHRoZW4gcmV0dXJuLlxuICBpZiAod3Nba1JlYWR5U3RhdGVdICE9PSBzdGF0ZXMuT1BFTikge1xuICAgIHJldHVyblxuICB9XG5cbiAgLy8gMi4gTGV0IGRhdGFGb3JFdmVudCBiZSBkZXRlcm1pbmVkIGJ5IHN3aXRjaGluZyBvbiB0eXBlIGFuZCBiaW5hcnkgdHlwZTpcbiAgbGV0IGRhdGFGb3JFdmVudFxuXG4gIGlmICh0eXBlID09PSBvcGNvZGVzLlRFWFQpIHtcbiAgICAvLyAtPiB0eXBlIGluZGljYXRlcyB0aGF0IHRoZSBkYXRhIGlzIFRleHRcbiAgICAvLyAgICAgIGEgbmV3IERPTVN0cmluZyBjb250YWluaW5nIGRhdGFcbiAgICB0cnkge1xuICAgICAgZGF0YUZvckV2ZW50ID0gbmV3IFRleHREZWNvZGVyKCd1dGYtOCcsIHsgZmF0YWw6IHRydWUgfSkuZGVjb2RlKGRhdGEpXG4gICAgfSBjYXRjaCB7XG4gICAgICBmYWlsV2Vic29ja2V0Q29ubmVjdGlvbih3cywgJ1JlY2VpdmVkIGludmFsaWQgVVRGLTggaW4gdGV4dCBmcmFtZS4nKVxuICAgICAgcmV0dXJuXG4gICAgfVxuICB9IGVsc2UgaWYgKHR5cGUgPT09IG9wY29kZXMuQklOQVJZKSB7XG4gICAgaWYgKHdzW2tCaW5hcnlUeXBlXSA9PT0gJ2Jsb2InKSB7XG4gICAgICAvLyAtPiB0eXBlIGluZGljYXRlcyB0aGF0IHRoZSBkYXRhIGlzIEJpbmFyeSBhbmQgYmluYXJ5IHR5cGUgaXMgXCJibG9iXCJcbiAgICAgIC8vICAgICAgYSBuZXcgQmxvYiBvYmplY3QsIGNyZWF0ZWQgaW4gdGhlIHJlbGV2YW50IFJlYWxtIG9mIHRoZSBXZWJTb2NrZXRcbiAgICAgIC8vICAgICAgb2JqZWN0LCB0aGF0IHJlcHJlc2VudHMgZGF0YSBhcyBpdHMgcmF3IGRhdGFcbiAgICAgIGRhdGFGb3JFdmVudCA9IG5ldyBCbG9iKFtkYXRhXSlcbiAgICB9IGVsc2Uge1xuICAgICAgLy8gLT4gdHlwZSBpbmRpY2F0ZXMgdGhhdCB0aGUgZGF0YSBpcyBCaW5hcnkgYW5kIGJpbmFyeSB0eXBlIGlzIFwiYXJyYXlidWZmZXJcIlxuICAgICAgLy8gICAgICBhIG5ldyBBcnJheUJ1ZmZlciBvYmplY3QsIGNyZWF0ZWQgaW4gdGhlIHJlbGV2YW50IFJlYWxtIG9mIHRoZVxuICAgICAgLy8gICAgICBXZWJTb2NrZXQgb2JqZWN0LCB3aG9zZSBjb250ZW50cyBhcmUgZGF0YVxuICAgICAgZGF0YUZvckV2ZW50ID0gbmV3IFVpbnQ4QXJyYXkoZGF0YSkuYnVmZmVyXG4gICAgfVxuICB9XG5cbiAgLy8gMy4gRmlyZSBhbiBldmVudCBuYW1lZCBtZXNzYWdlIGF0IHRoZSBXZWJTb2NrZXQgb2JqZWN0LCB1c2luZyBNZXNzYWdlRXZlbnQsXG4gIC8vICAgIHdpdGggdGhlIG9yaWdpbiBhdHRyaWJ1dGUgaW5pdGlhbGl6ZWQgdG8gdGhlIHNlcmlhbGl6YXRpb24gb2YgdGhlIFdlYlNvY2tldFxuICAvLyAgICBvYmplY3TigJlzIHVybCdzIG9yaWdpbiwgYW5kIHRoZSBkYXRhIGF0dHJpYnV0ZSBpbml0aWFsaXplZCB0byBkYXRhRm9yRXZlbnQuXG4gIGZpcmVFdmVudCgnbWVzc2FnZScsIHdzLCBNZXNzYWdlRXZlbnQsIHtcbiAgICBvcmlnaW46IHdzW2tXZWJTb2NrZXRVUkxdLm9yaWdpbixcbiAgICBkYXRhOiBkYXRhRm9yRXZlbnRcbiAgfSlcbn1cblxuLyoqXG4gKiBAc2VlIGh0dHBzOi8vZGF0YXRyYWNrZXIuaWV0Zi5vcmcvZG9jL2h0bWwvcmZjNjQ1NVxuICogQHNlZSBodHRwczovL2RhdGF0cmFja2VyLmlldGYub3JnL2RvYy9odG1sL3JmYzI2MTZcbiAqIEBzZWUgaHR0cHM6Ly9idWdzLmNocm9taXVtLm9yZy9wL2Nocm9taXVtL2lzc3Vlcy9kZXRhaWw/aWQ9Mzk4NDA3XG4gKiBAcGFyYW0ge3N0cmluZ30gcHJvdG9jb2xcbiAqL1xuZnVuY3Rpb24gaXNWYWxpZFN1YnByb3RvY29sIChwcm90b2NvbCkge1xuICAvLyBJZiBwcmVzZW50LCB0aGlzIHZhbHVlIGluZGljYXRlcyBvbmVcbiAgLy8gb3IgbW9yZSBjb21tYS1zZXBhcmF0ZWQgc3VicHJvdG9jb2wgdGhlIGNsaWVudCB3aXNoZXMgdG8gc3BlYWssXG4gIC8vIG9yZGVyZWQgYnkgcHJlZmVyZW5jZS4gIFRoZSBlbGVtZW50cyB0aGF0IGNvbXByaXNlIHRoaXMgdmFsdWVcbiAgLy8gTVVTVCBiZSBub24tZW1wdHkgc3RyaW5ncyB3aXRoIGNoYXJhY3RlcnMgaW4gdGhlIHJhbmdlIFUrMDAyMSB0b1xuICAvLyBVKzAwN0Ugbm90IGluY2x1ZGluZyBzZXBhcmF0b3IgY2hhcmFjdGVycyBhcyBkZWZpbmVkIGluXG4gIC8vIFtSRkMyNjE2XSBhbmQgTVVTVCBhbGwgYmUgdW5pcXVlIHN0cmluZ3MuXG4gIGlmIChwcm90b2NvbC5sZW5ndGggPT09IDApIHtcbiAgICByZXR1cm4gZmFsc2VcbiAgfVxuXG4gIGZvciAoY29uc3QgY2hhciBvZiBwcm90b2NvbCkge1xuICAgIGNvbnN0IGNvZGUgPSBjaGFyLmNoYXJDb2RlQXQoMClcblxuICAgIGlmIChcbiAgICAgIGNvZGUgPCAweDIxIHx8XG4gICAgICBjb2RlID4gMHg3RSB8fFxuICAgICAgY2hhciA9PT0gJygnIHx8XG4gICAgICBjaGFyID09PSAnKScgfHxcbiAgICAgIGNoYXIgPT09ICc8JyB8fFxuICAgICAgY2hhciA9PT0gJz4nIHx8XG4gICAgICBjaGFyID09PSAnQCcgfHxcbiAgICAgIGNoYXIgPT09ICcsJyB8fFxuICAgICAgY2hhciA9PT0gJzsnIHx8XG4gICAgICBjaGFyID09PSAnOicgfHxcbiAgICAgIGNoYXIgPT09ICdcXFxcJyB8fFxuICAgICAgY2hhciA9PT0gJ1wiJyB8fFxuICAgICAgY2hhciA9PT0gJy8nIHx8XG4gICAgICBjaGFyID09PSAnWycgfHxcbiAgICAgIGNoYXIgPT09ICddJyB8fFxuICAgICAgY2hhciA9PT0gJz8nIHx8XG4gICAgICBjaGFyID09PSAnPScgfHxcbiAgICAgIGNoYXIgPT09ICd7JyB8fFxuICAgICAgY2hhciA9PT0gJ30nIHx8XG4gICAgICBjb2RlID09PSAzMiB8fCAvLyBTUFxuICAgICAgY29kZSA9PT0gOSAvLyBIVFxuICAgICkge1xuICAgICAgcmV0dXJuIGZhbHNlXG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIHRydWVcbn1cblxuLyoqXG4gKiBAc2VlIGh0dHBzOi8vZGF0YXRyYWNrZXIuaWV0Zi5vcmcvZG9jL2h0bWwvcmZjNjQ1NSNzZWN0aW9uLTctNFxuICogQHBhcmFtIHtudW1iZXJ9IGNvZGVcbiAqL1xuZnVuY3Rpb24gaXNWYWxpZFN0YXR1c0NvZGUgKGNvZGUpIHtcbiAgaWYgKGNvZGUgPj0gMTAwMCAmJiBjb2RlIDwgMTAxNSkge1xuICAgIHJldHVybiAoXG4gICAgICBjb2RlICE9PSAxMDA0ICYmIC8vIHJlc2VydmVkXG4gICAgICBjb2RlICE9PSAxMDA1ICYmIC8vIFwiTVVTVCBOT1QgYmUgc2V0IGFzIGEgc3RhdHVzIGNvZGVcIlxuICAgICAgY29kZSAhPT0gMTAwNiAvLyBcIk1VU1QgTk9UIGJlIHNldCBhcyBhIHN0YXR1cyBjb2RlXCJcbiAgICApXG4gIH1cblxuICByZXR1cm4gY29kZSA+PSAzMDAwICYmIGNvZGUgPD0gNDk5OVxufVxuXG4vKipcbiAqIEBwYXJhbSB7aW1wb3J0KCcuL3dlYnNvY2tldCcpLldlYlNvY2tldH0gd3NcbiAqIEBwYXJhbSB7c3RyaW5nfHVuZGVmaW5lZH0gcmVhc29uXG4gKi9cbmZ1bmN0aW9uIGZhaWxXZWJzb2NrZXRDb25uZWN0aW9uICh3cywgcmVhc29uKSB7XG4gIGNvbnN0IHsgW2tDb250cm9sbGVyXTogY29udHJvbGxlciwgW2tSZXNwb25zZV06IHJlc3BvbnNlIH0gPSB3c1xuXG4gIGNvbnRyb2xsZXIuYWJvcnQoKVxuXG4gIGlmIChyZXNwb25zZT8uc29ja2V0ICYmICFyZXNwb25zZS5zb2NrZXQuZGVzdHJveWVkKSB7XG4gICAgcmVzcG9uc2Uuc29ja2V0LmRlc3Ryb3koKVxuICB9XG5cbiAgaWYgKHJlYXNvbikge1xuICAgIGZpcmVFdmVudCgnZXJyb3InLCB3cywgRXJyb3JFdmVudCwge1xuICAgICAgZXJyb3I6IG5ldyBFcnJvcihyZWFzb24pXG4gICAgfSlcbiAgfVxufVxuXG5tb2R1bGUuZXhwb3J0cyA9IHtcbiAgaXNFc3RhYmxpc2hlZCxcbiAgaXNDbG9zaW5nLFxuICBpc0Nsb3NlZCxcbiAgZmlyZUV2ZW50LFxuICBpc1ZhbGlkU3VicHJvdG9jb2wsXG4gIGlzVmFsaWRTdGF0dXNDb2RlLFxuICBmYWlsV2Vic29ja2V0Q29ubmVjdGlvbixcbiAgd2Vic29ja2V0TWVzc2FnZVJlY2VpdmVkXG59XG4iLAogICAgIid1c2Ugc3RyaWN0J1xuXG5jb25zdCBkaWFnbm9zdGljc0NoYW5uZWwgPSByZXF1aXJlKCdkaWFnbm9zdGljc19jaGFubmVsJylcbmNvbnN0IHsgdWlkLCBzdGF0ZXMgfSA9IHJlcXVpcmUoJy4vY29uc3RhbnRzJylcbmNvbnN0IHtcbiAga1JlYWR5U3RhdGUsXG4gIGtTZW50Q2xvc2UsXG4gIGtCeXRlUGFyc2VyLFxuICBrUmVjZWl2ZWRDbG9zZVxufSA9IHJlcXVpcmUoJy4vc3ltYm9scycpXG5jb25zdCB7IGZpcmVFdmVudCwgZmFpbFdlYnNvY2tldENvbm5lY3Rpb24gfSA9IHJlcXVpcmUoJy4vdXRpbCcpXG5jb25zdCB7IENsb3NlRXZlbnQgfSA9IHJlcXVpcmUoJy4vZXZlbnRzJylcbmNvbnN0IHsgbWFrZVJlcXVlc3QgfSA9IHJlcXVpcmUoJy4uL2ZldGNoL3JlcXVlc3QnKVxuY29uc3QgeyBmZXRjaGluZyB9ID0gcmVxdWlyZSgnLi4vZmV0Y2gvaW5kZXgnKVxuY29uc3QgeyBIZWFkZXJzIH0gPSByZXF1aXJlKCcuLi9mZXRjaC9oZWFkZXJzJylcbmNvbnN0IHsgZ2V0R2xvYmFsRGlzcGF0Y2hlciB9ID0gcmVxdWlyZSgnLi4vZ2xvYmFsJylcbmNvbnN0IHsga0hlYWRlcnNMaXN0IH0gPSByZXF1aXJlKCcuLi9jb3JlL3N5bWJvbHMnKVxuXG5jb25zdCBjaGFubmVscyA9IHt9XG5jaGFubmVscy5vcGVuID0gZGlhZ25vc3RpY3NDaGFubmVsLmNoYW5uZWwoJ3VuZGljaTp3ZWJzb2NrZXQ6b3BlbicpXG5jaGFubmVscy5jbG9zZSA9IGRpYWdub3N0aWNzQ2hhbm5lbC5jaGFubmVsKCd1bmRpY2k6d2Vic29ja2V0OmNsb3NlJylcbmNoYW5uZWxzLnNvY2tldEVycm9yID0gZGlhZ25vc3RpY3NDaGFubmVsLmNoYW5uZWwoJ3VuZGljaTp3ZWJzb2NrZXQ6c29ja2V0X2Vycm9yJylcblxuLyoqIEB0eXBlIHtpbXBvcnQoJ2NyeXB0bycpfSAqL1xubGV0IGNyeXB0b1xudHJ5IHtcbiAgY3J5cHRvID0gcmVxdWlyZSgnY3J5cHRvJylcbn0gY2F0Y2gge1xuXG59XG5cbi8qKlxuICogQHNlZSBodHRwczovL3dlYnNvY2tldHMuc3BlYy53aGF0d2cub3JnLyNjb25jZXB0LXdlYnNvY2tldC1lc3RhYmxpc2hcbiAqIEBwYXJhbSB7VVJMfSB1cmxcbiAqIEBwYXJhbSB7c3RyaW5nfHN0cmluZ1tdfSBwcm90b2NvbHNcbiAqIEBwYXJhbSB7aW1wb3J0KCcuL3dlYnNvY2tldCcpLldlYlNvY2tldH0gd3NcbiAqIEBwYXJhbSB7KHJlc3BvbnNlOiBhbnkpID0+IHZvaWR9IG9uRXN0YWJsaXNoXG4gKiBAcGFyYW0ge1BhcnRpYWw8aW1wb3J0KCcuLi8uLi90eXBlcy93ZWJzb2NrZXQnKS5XZWJTb2NrZXRJbml0Pn0gb3B0aW9uc1xuICovXG5mdW5jdGlvbiBlc3RhYmxpc2hXZWJTb2NrZXRDb25uZWN0aW9uICh1cmwsIHByb3RvY29scywgd3MsIG9uRXN0YWJsaXNoLCBvcHRpb25zKSB7XG4gIC8vIDEuIExldCByZXF1ZXN0VVJMIGJlIGEgY29weSBvZiB1cmwsIHdpdGggaXRzIHNjaGVtZSBzZXQgdG8gXCJodHRwXCIsIGlmIHVybOKAmXNcbiAgLy8gICAgc2NoZW1lIGlzIFwid3NcIiwgYW5kIHRvIFwiaHR0cHNcIiBvdGhlcndpc2UuXG4gIGNvbnN0IHJlcXVlc3RVUkwgPSB1cmxcblxuICByZXF1ZXN0VVJMLnByb3RvY29sID0gdXJsLnByb3RvY29sID09PSAnd3M6JyA/ICdodHRwOicgOiAnaHR0cHM6J1xuXG4gIC8vIDIuIExldCByZXF1ZXN0IGJlIGEgbmV3IHJlcXVlc3QsIHdob3NlIFVSTCBpcyByZXF1ZXN0VVJMLCBjbGllbnQgaXMgY2xpZW50LFxuICAvLyAgICBzZXJ2aWNlLXdvcmtlcnMgbW9kZSBpcyBcIm5vbmVcIiwgcmVmZXJyZXIgaXMgXCJuby1yZWZlcnJlclwiLCBtb2RlIGlzXG4gIC8vICAgIFwid2Vic29ja2V0XCIsIGNyZWRlbnRpYWxzIG1vZGUgaXMgXCJpbmNsdWRlXCIsIGNhY2hlIG1vZGUgaXMgXCJuby1zdG9yZVwiICxcbiAgLy8gICAgYW5kIHJlZGlyZWN0IG1vZGUgaXMgXCJlcnJvclwiLlxuICBjb25zdCByZXF1ZXN0ID0gbWFrZVJlcXVlc3Qoe1xuICAgIHVybExpc3Q6IFtyZXF1ZXN0VVJMXSxcbiAgICBzZXJ2aWNlV29ya2VyczogJ25vbmUnLFxuICAgIHJlZmVycmVyOiAnbm8tcmVmZXJyZXInLFxuICAgIG1vZGU6ICd3ZWJzb2NrZXQnLFxuICAgIGNyZWRlbnRpYWxzOiAnaW5jbHVkZScsXG4gICAgY2FjaGU6ICduby1zdG9yZScsXG4gICAgcmVkaXJlY3Q6ICdlcnJvcidcbiAgfSlcblxuICAvLyBOb3RlOiB1bmRpY2kgZXh0ZW5zaW9uLCBhbGxvdyBzZXR0aW5nIGN1c3RvbSBoZWFkZXJzLlxuICBpZiAob3B0aW9ucy5oZWFkZXJzKSB7XG4gICAgY29uc3QgaGVhZGVyc0xpc3QgPSBuZXcgSGVhZGVycyhvcHRpb25zLmhlYWRlcnMpW2tIZWFkZXJzTGlzdF1cblxuICAgIHJlcXVlc3QuaGVhZGVyc0xpc3QgPSBoZWFkZXJzTGlzdFxuICB9XG5cbiAgLy8gMy4gQXBwZW5kIChgVXBncmFkZWAsIGB3ZWJzb2NrZXRgKSB0byByZXF1ZXN04oCZcyBoZWFkZXIgbGlzdC5cbiAgLy8gNC4gQXBwZW5kIChgQ29ubmVjdGlvbmAsIGBVcGdyYWRlYCkgdG8gcmVxdWVzdOKAmXMgaGVhZGVyIGxpc3QuXG4gIC8vIE5vdGU6IGJvdGggb2YgdGhlc2UgYXJlIGhhbmRsZWQgYnkgdW5kaWNpIGN1cnJlbnRseS5cbiAgLy8gaHR0cHM6Ly9naXRodWIuY29tL25vZGVqcy91bmRpY2kvYmxvYi82OGMyNjljNDE0NGM0NDZmM2YxMjIwOTUxMzM4ZGFlZjRhNmI1ZWM0L2xpYi9jbGllbnQuanMjTDEzOTdcblxuICAvLyA1LiBMZXQga2V5VmFsdWUgYmUgYSBub25jZSBjb25zaXN0aW5nIG9mIGEgcmFuZG9tbHkgc2VsZWN0ZWRcbiAgLy8gICAgMTYtYnl0ZSB2YWx1ZSB0aGF0IGhhcyBiZWVuIGZvcmdpdmluZy1iYXNlNjQtZW5jb2RlZCBhbmRcbiAgLy8gICAgaXNvbW9ycGhpYyBlbmNvZGVkLlxuICBjb25zdCBrZXlWYWx1ZSA9IGNyeXB0by5yYW5kb21CeXRlcygxNikudG9TdHJpbmcoJ2Jhc2U2NCcpXG5cbiAgLy8gNi4gQXBwZW5kIChgU2VjLVdlYlNvY2tldC1LZXlgLCBrZXlWYWx1ZSkgdG8gcmVxdWVzdOKAmXNcbiAgLy8gICAgaGVhZGVyIGxpc3QuXG4gIHJlcXVlc3QuaGVhZGVyc0xpc3QuYXBwZW5kKCdzZWMtd2Vic29ja2V0LWtleScsIGtleVZhbHVlKVxuXG4gIC8vIDcuIEFwcGVuZCAoYFNlYy1XZWJTb2NrZXQtVmVyc2lvbmAsIGAxM2ApIHRvIHJlcXVlc3TigJlzXG4gIC8vICAgIGhlYWRlciBsaXN0LlxuICByZXF1ZXN0LmhlYWRlcnNMaXN0LmFwcGVuZCgnc2VjLXdlYnNvY2tldC12ZXJzaW9uJywgJzEzJylcblxuICAvLyA4LiBGb3IgZWFjaCBwcm90b2NvbCBpbiBwcm90b2NvbHMsIGNvbWJpbmVcbiAgLy8gICAgKGBTZWMtV2ViU29ja2V0LVByb3RvY29sYCwgcHJvdG9jb2wpIGluIHJlcXVlc3TigJlzIGhlYWRlclxuICAvLyAgICBsaXN0LlxuICBmb3IgKGNvbnN0IHByb3RvY29sIG9mIHByb3RvY29scykge1xuICAgIHJlcXVlc3QuaGVhZGVyc0xpc3QuYXBwZW5kKCdzZWMtd2Vic29ja2V0LXByb3RvY29sJywgcHJvdG9jb2wpXG4gIH1cblxuICAvLyA5LiBMZXQgcGVybWVzc2FnZURlZmxhdGUgYmUgYSB1c2VyLWFnZW50IGRlZmluZWRcbiAgLy8gICAgXCJwZXJtZXNzYWdlLWRlZmxhdGVcIiBleHRlbnNpb24gaGVhZGVyIHZhbHVlLlxuICAvLyBodHRwczovL2dpdGh1Yi5jb20vbW96aWxsYS9nZWNrby1kZXYvYmxvYi9jZTc4MjM0ZjVlNjUzYTVkMzkxNjgxM2ZmOTkwZjA1MzUxMDIyN2JjL25ldHdlcmsvcHJvdG9jb2wvd2Vic29ja2V0L1dlYlNvY2tldENoYW5uZWwuY3BwI0wyNjczXG4gIC8vIFRPRE86IGVuYWJsZSBvbmNlIHBlcm1lc3NhZ2UtZGVmbGF0ZSBpcyBzdXBwb3J0ZWRcbiAgY29uc3QgcGVybWVzc2FnZURlZmxhdGUgPSAnJyAvLyAncGVybWVzc2FnZS1kZWZsYXRlOyAxNSdcblxuICAvLyAxMC4gQXBwZW5kIChgU2VjLVdlYlNvY2tldC1FeHRlbnNpb25zYCwgcGVybWVzc2FnZURlZmxhdGUpIHRvXG4gIC8vICAgICByZXF1ZXN04oCZcyBoZWFkZXIgbGlzdC5cbiAgLy8gcmVxdWVzdC5oZWFkZXJzTGlzdC5hcHBlbmQoJ3NlYy13ZWJzb2NrZXQtZXh0ZW5zaW9ucycsIHBlcm1lc3NhZ2VEZWZsYXRlKVxuXG4gIC8vIDExLiBGZXRjaCByZXF1ZXN0IHdpdGggdXNlUGFyYWxsZWxRdWV1ZSBzZXQgdG8gdHJ1ZSwgYW5kXG4gIC8vICAgICBwcm9jZXNzUmVzcG9uc2UgZ2l2ZW4gcmVzcG9uc2UgYmVpbmcgdGhlc2Ugc3RlcHM6XG4gIGNvbnN0IGNvbnRyb2xsZXIgPSBmZXRjaGluZyh7XG4gICAgcmVxdWVzdCxcbiAgICB1c2VQYXJhbGxlbFF1ZXVlOiB0cnVlLFxuICAgIGRpc3BhdGNoZXI6IG9wdGlvbnMuZGlzcGF0Y2hlciA/PyBnZXRHbG9iYWxEaXNwYXRjaGVyKCksXG4gICAgcHJvY2Vzc1Jlc3BvbnNlIChyZXNwb25zZSkge1xuICAgICAgLy8gMS4gSWYgcmVzcG9uc2UgaXMgYSBuZXR3b3JrIGVycm9yIG9yIGl0cyBzdGF0dXMgaXMgbm90IDEwMSxcbiAgICAgIC8vICAgIGZhaWwgdGhlIFdlYlNvY2tldCBjb25uZWN0aW9uLlxuICAgICAgaWYgKHJlc3BvbnNlLnR5cGUgPT09ICdlcnJvcicgfHwgcmVzcG9uc2Uuc3RhdHVzICE9PSAxMDEpIHtcbiAgICAgICAgZmFpbFdlYnNvY2tldENvbm5lY3Rpb24od3MsICdSZWNlaXZlZCBuZXR3b3JrIGVycm9yIG9yIG5vbi0xMDEgc3RhdHVzIGNvZGUuJylcbiAgICAgICAgcmV0dXJuXG4gICAgICB9XG5cbiAgICAgIC8vIDIuIElmIHByb3RvY29scyBpcyBub3QgdGhlIGVtcHR5IGxpc3QgYW5kIGV4dHJhY3RpbmcgaGVhZGVyXG4gICAgICAvLyAgICBsaXN0IHZhbHVlcyBnaXZlbiBgU2VjLVdlYlNvY2tldC1Qcm90b2NvbGAgYW5kIHJlc3BvbnNl4oCZc1xuICAgICAgLy8gICAgaGVhZGVyIGxpc3QgcmVzdWx0cyBpbiBudWxsLCBmYWlsdXJlLCBvciB0aGUgZW1wdHkgYnl0ZVxuICAgICAgLy8gICAgc2VxdWVuY2UsIHRoZW4gZmFpbCB0aGUgV2ViU29ja2V0IGNvbm5lY3Rpb24uXG4gICAgICBpZiAocHJvdG9jb2xzLmxlbmd0aCAhPT0gMCAmJiAhcmVzcG9uc2UuaGVhZGVyc0xpc3QuZ2V0KCdTZWMtV2ViU29ja2V0LVByb3RvY29sJykpIHtcbiAgICAgICAgZmFpbFdlYnNvY2tldENvbm5lY3Rpb24od3MsICdTZXJ2ZXIgZGlkIG5vdCByZXNwb25kIHdpdGggc2VudCBwcm90b2NvbHMuJylcbiAgICAgICAgcmV0dXJuXG4gICAgICB9XG5cbiAgICAgIC8vIDMuIEZvbGxvdyB0aGUgcmVxdWlyZW1lbnRzIHN0YXRlZCBzdGVwIDIgdG8gc3RlcCA2LCBpbmNsdXNpdmUsXG4gICAgICAvLyAgICBvZiB0aGUgbGFzdCBzZXQgb2Ygc3RlcHMgaW4gc2VjdGlvbiA0LjEgb2YgVGhlIFdlYlNvY2tldFxuICAgICAgLy8gICAgUHJvdG9jb2wgdG8gdmFsaWRhdGUgcmVzcG9uc2UuIFRoaXMgZWl0aGVyIHJlc3VsdHMgaW4gZmFpbFxuICAgICAgLy8gICAgdGhlIFdlYlNvY2tldCBjb25uZWN0aW9uIG9yIHRoZSBXZWJTb2NrZXQgY29ubmVjdGlvbiBpc1xuICAgICAgLy8gICAgZXN0YWJsaXNoZWQuXG5cbiAgICAgIC8vIDIuIElmIHRoZSByZXNwb25zZSBsYWNrcyBhbiB8VXBncmFkZXwgaGVhZGVyIGZpZWxkIG9yIHRoZSB8VXBncmFkZXxcbiAgICAgIC8vICAgIGhlYWRlciBmaWVsZCBjb250YWlucyBhIHZhbHVlIHRoYXQgaXMgbm90IGFuIEFTQ0lJIGNhc2UtXG4gICAgICAvLyAgICBpbnNlbnNpdGl2ZSBtYXRjaCBmb3IgdGhlIHZhbHVlIFwid2Vic29ja2V0XCIsIHRoZSBjbGllbnQgTVVTVFxuICAgICAgLy8gICAgX0ZhaWwgdGhlIFdlYlNvY2tldCBDb25uZWN0aW9uXy5cbiAgICAgIGlmIChyZXNwb25zZS5oZWFkZXJzTGlzdC5nZXQoJ1VwZ3JhZGUnKT8udG9Mb3dlckNhc2UoKSAhPT0gJ3dlYnNvY2tldCcpIHtcbiAgICAgICAgZmFpbFdlYnNvY2tldENvbm5lY3Rpb24od3MsICdTZXJ2ZXIgZGlkIG5vdCBzZXQgVXBncmFkZSBoZWFkZXIgdG8gXCJ3ZWJzb2NrZXRcIi4nKVxuICAgICAgICByZXR1cm5cbiAgICAgIH1cblxuICAgICAgLy8gMy4gSWYgdGhlIHJlc3BvbnNlIGxhY2tzIGEgfENvbm5lY3Rpb258IGhlYWRlciBmaWVsZCBvciB0aGVcbiAgICAgIC8vICAgIHxDb25uZWN0aW9ufCBoZWFkZXIgZmllbGQgZG9lc24ndCBjb250YWluIGEgdG9rZW4gdGhhdCBpcyBhblxuICAgICAgLy8gICAgQVNDSUkgY2FzZS1pbnNlbnNpdGl2ZSBtYXRjaCBmb3IgdGhlIHZhbHVlIFwiVXBncmFkZVwiLCB0aGUgY2xpZW50XG4gICAgICAvLyAgICBNVVNUIF9GYWlsIHRoZSBXZWJTb2NrZXQgQ29ubmVjdGlvbl8uXG4gICAgICBpZiAocmVzcG9uc2UuaGVhZGVyc0xpc3QuZ2V0KCdDb25uZWN0aW9uJyk/LnRvTG93ZXJDYXNlKCkgIT09ICd1cGdyYWRlJykge1xuICAgICAgICBmYWlsV2Vic29ja2V0Q29ubmVjdGlvbih3cywgJ1NlcnZlciBkaWQgbm90IHNldCBDb25uZWN0aW9uIGhlYWRlciB0byBcInVwZ3JhZGVcIi4nKVxuICAgICAgICByZXR1cm5cbiAgICAgIH1cblxuICAgICAgLy8gNC4gSWYgdGhlIHJlc3BvbnNlIGxhY2tzIGEgfFNlYy1XZWJTb2NrZXQtQWNjZXB0fCBoZWFkZXIgZmllbGQgb3JcbiAgICAgIC8vICAgIHRoZSB8U2VjLVdlYlNvY2tldC1BY2NlcHR8IGNvbnRhaW5zIGEgdmFsdWUgb3RoZXIgdGhhbiB0aGVcbiAgICAgIC8vICAgIGJhc2U2NC1lbmNvZGVkIFNIQS0xIG9mIHRoZSBjb25jYXRlbmF0aW9uIG9mIHRoZSB8U2VjLVdlYlNvY2tldC1cbiAgICAgIC8vICAgIEtleXwgKGFzIGEgc3RyaW5nLCBub3QgYmFzZTY0LWRlY29kZWQpIHdpdGggdGhlIHN0cmluZyBcIjI1OEVBRkE1LVxuICAgICAgLy8gICAgRTkxNC00N0RBLTk1Q0EtQzVBQjBEQzg1QjExXCIgYnV0IGlnbm9yaW5nIGFueSBsZWFkaW5nIGFuZFxuICAgICAgLy8gICAgdHJhaWxpbmcgd2hpdGVzcGFjZSwgdGhlIGNsaWVudCBNVVNUIF9GYWlsIHRoZSBXZWJTb2NrZXRcbiAgICAgIC8vICAgIENvbm5lY3Rpb25fLlxuICAgICAgY29uc3Qgc2VjV1NBY2NlcHQgPSByZXNwb25zZS5oZWFkZXJzTGlzdC5nZXQoJ1NlYy1XZWJTb2NrZXQtQWNjZXB0JylcbiAgICAgIGNvbnN0IGRpZ2VzdCA9IGNyeXB0by5jcmVhdGVIYXNoKCdzaGExJykudXBkYXRlKGtleVZhbHVlICsgdWlkKS5kaWdlc3QoJ2Jhc2U2NCcpXG4gICAgICBpZiAoc2VjV1NBY2NlcHQgIT09IGRpZ2VzdCkge1xuICAgICAgICBmYWlsV2Vic29ja2V0Q29ubmVjdGlvbih3cywgJ0luY29ycmVjdCBoYXNoIHJlY2VpdmVkIGluIFNlYy1XZWJTb2NrZXQtQWNjZXB0IGhlYWRlci4nKVxuICAgICAgICByZXR1cm5cbiAgICAgIH1cblxuICAgICAgLy8gNS4gSWYgdGhlIHJlc3BvbnNlIGluY2x1ZGVzIGEgfFNlYy1XZWJTb2NrZXQtRXh0ZW5zaW9uc3wgaGVhZGVyXG4gICAgICAvLyAgICBmaWVsZCBhbmQgdGhpcyBoZWFkZXIgZmllbGQgaW5kaWNhdGVzIHRoZSB1c2Ugb2YgYW4gZXh0ZW5zaW9uXG4gICAgICAvLyAgICB0aGF0IHdhcyBub3QgcHJlc2VudCBpbiB0aGUgY2xpZW50J3MgaGFuZHNoYWtlICh0aGUgc2VydmVyIGhhc1xuICAgICAgLy8gICAgaW5kaWNhdGVkIGFuIGV4dGVuc2lvbiBub3QgcmVxdWVzdGVkIGJ5IHRoZSBjbGllbnQpLCB0aGUgY2xpZW50XG4gICAgICAvLyAgICBNVVNUIF9GYWlsIHRoZSBXZWJTb2NrZXQgQ29ubmVjdGlvbl8uICAoVGhlIHBhcnNpbmcgb2YgdGhpc1xuICAgICAgLy8gICAgaGVhZGVyIGZpZWxkIHRvIGRldGVybWluZSB3aGljaCBleHRlbnNpb25zIGFyZSByZXF1ZXN0ZWQgaXNcbiAgICAgIC8vICAgIGRpc2N1c3NlZCBpbiBTZWN0aW9uIDkuMS4pXG4gICAgICBjb25zdCBzZWNFeHRlbnNpb24gPSByZXNwb25zZS5oZWFkZXJzTGlzdC5nZXQoJ1NlYy1XZWJTb2NrZXQtRXh0ZW5zaW9ucycpXG5cbiAgICAgIGlmIChzZWNFeHRlbnNpb24gIT09IG51bGwgJiYgc2VjRXh0ZW5zaW9uICE9PSBwZXJtZXNzYWdlRGVmbGF0ZSkge1xuICAgICAgICBmYWlsV2Vic29ja2V0Q29ubmVjdGlvbih3cywgJ1JlY2VpdmVkIGRpZmZlcmVudCBwZXJtZXNzYWdlLWRlZmxhdGUgdGhhbiB0aGUgb25lIHNldC4nKVxuICAgICAgICByZXR1cm5cbiAgICAgIH1cblxuICAgICAgLy8gNi4gSWYgdGhlIHJlc3BvbnNlIGluY2x1ZGVzIGEgfFNlYy1XZWJTb2NrZXQtUHJvdG9jb2x8IGhlYWRlciBmaWVsZFxuICAgICAgLy8gICAgYW5kIHRoaXMgaGVhZGVyIGZpZWxkIGluZGljYXRlcyB0aGUgdXNlIG9mIGEgc3VicHJvdG9jb2wgdGhhdCB3YXNcbiAgICAgIC8vICAgIG5vdCBwcmVzZW50IGluIHRoZSBjbGllbnQncyBoYW5kc2hha2UgKHRoZSBzZXJ2ZXIgaGFzIGluZGljYXRlZCBhXG4gICAgICAvLyAgICBzdWJwcm90b2NvbCBub3QgcmVxdWVzdGVkIGJ5IHRoZSBjbGllbnQpLCB0aGUgY2xpZW50IE1VU1QgX0ZhaWxcbiAgICAgIC8vICAgIHRoZSBXZWJTb2NrZXQgQ29ubmVjdGlvbl8uXG4gICAgICBjb25zdCBzZWNQcm90b2NvbCA9IHJlc3BvbnNlLmhlYWRlcnNMaXN0LmdldCgnU2VjLVdlYlNvY2tldC1Qcm90b2NvbCcpXG5cbiAgICAgIGlmIChzZWNQcm90b2NvbCAhPT0gbnVsbCAmJiBzZWNQcm90b2NvbCAhPT0gcmVxdWVzdC5oZWFkZXJzTGlzdC5nZXQoJ1NlYy1XZWJTb2NrZXQtUHJvdG9jb2wnKSkge1xuICAgICAgICBmYWlsV2Vic29ja2V0Q29ubmVjdGlvbih3cywgJ1Byb3RvY29sIHdhcyBub3Qgc2V0IGluIHRoZSBvcGVuaW5nIGhhbmRzaGFrZS4nKVxuICAgICAgICByZXR1cm5cbiAgICAgIH1cblxuICAgICAgcmVzcG9uc2Uuc29ja2V0Lm9uKCdkYXRhJywgb25Tb2NrZXREYXRhKVxuICAgICAgcmVzcG9uc2Uuc29ja2V0Lm9uKCdjbG9zZScsIG9uU29ja2V0Q2xvc2UpXG4gICAgICByZXNwb25zZS5zb2NrZXQub24oJ2Vycm9yJywgb25Tb2NrZXRFcnJvcilcblxuICAgICAgaWYgKGNoYW5uZWxzLm9wZW4uaGFzU3Vic2NyaWJlcnMpIHtcbiAgICAgICAgY2hhbm5lbHMub3Blbi5wdWJsaXNoKHtcbiAgICAgICAgICBhZGRyZXNzOiByZXNwb25zZS5zb2NrZXQuYWRkcmVzcygpLFxuICAgICAgICAgIHByb3RvY29sOiBzZWNQcm90b2NvbCxcbiAgICAgICAgICBleHRlbnNpb25zOiBzZWNFeHRlbnNpb25cbiAgICAgICAgfSlcbiAgICAgIH1cblxuICAgICAgb25Fc3RhYmxpc2gocmVzcG9uc2UpXG4gICAgfVxuICB9KVxuXG4gIHJldHVybiBjb250cm9sbGVyXG59XG5cbi8qKlxuICogQHBhcmFtIHtCdWZmZXJ9IGNodW5rXG4gKi9cbmZ1bmN0aW9uIG9uU29ja2V0RGF0YSAoY2h1bmspIHtcbiAgaWYgKCF0aGlzLndzW2tCeXRlUGFyc2VyXS53cml0ZShjaHVuaykpIHtcbiAgICB0aGlzLnBhdXNlKClcbiAgfVxufVxuXG4vKipcbiAqIEBzZWUgaHR0cHM6Ly93ZWJzb2NrZXRzLnNwZWMud2hhdHdnLm9yZy8jZmVlZGJhY2stZnJvbS10aGUtcHJvdG9jb2xcbiAqIEBzZWUgaHR0cHM6Ly9kYXRhdHJhY2tlci5pZXRmLm9yZy9kb2MvaHRtbC9yZmM2NDU1I3NlY3Rpb24tNy4xLjRcbiAqL1xuZnVuY3Rpb24gb25Tb2NrZXRDbG9zZSAoKSB7XG4gIGNvbnN0IHsgd3MgfSA9IHRoaXNcblxuICAvLyBJZiB0aGUgVENQIGNvbm5lY3Rpb24gd2FzIGNsb3NlZCBhZnRlciB0aGVcbiAgLy8gV2ViU29ja2V0IGNsb3NpbmcgaGFuZHNoYWtlIHdhcyBjb21wbGV0ZWQsIHRoZSBXZWJTb2NrZXQgY29ubmVjdGlvblxuICAvLyBpcyBzYWlkIHRvIGhhdmUgYmVlbiBjbG9zZWQgX2NsZWFubHlfLlxuICBjb25zdCB3YXNDbGVhbiA9IHdzW2tTZW50Q2xvc2VdICYmIHdzW2tSZWNlaXZlZENsb3NlXVxuXG4gIGxldCBjb2RlID0gMTAwNVxuICBsZXQgcmVhc29uID0gJydcblxuICBjb25zdCByZXN1bHQgPSB3c1trQnl0ZVBhcnNlcl0uY2xvc2luZ0luZm9cblxuICBpZiAocmVzdWx0KSB7XG4gICAgY29kZSA9IHJlc3VsdC5jb2RlID8/IDEwMDVcbiAgICByZWFzb24gPSByZXN1bHQucmVhc29uXG4gIH0gZWxzZSBpZiAoIXdzW2tTZW50Q2xvc2VdKSB7XG4gICAgLy8gSWYgX1RoZSBXZWJTb2NrZXRcbiAgICAvLyBDb25uZWN0aW9uIGlzIENsb3NlZF8gYW5kIG5vIENsb3NlIGNvbnRyb2wgZnJhbWUgd2FzIHJlY2VpdmVkIGJ5IHRoZVxuICAgIC8vIGVuZHBvaW50IChzdWNoIGFzIGNvdWxkIG9jY3VyIGlmIHRoZSB1bmRlcmx5aW5nIHRyYW5zcG9ydCBjb25uZWN0aW9uXG4gICAgLy8gaXMgbG9zdCksIF9UaGUgV2ViU29ja2V0IENvbm5lY3Rpb24gQ2xvc2UgQ29kZV8gaXMgY29uc2lkZXJlZCB0byBiZVxuICAgIC8vIDEwMDYuXG4gICAgY29kZSA9IDEwMDZcbiAgfVxuXG4gIC8vIDEuIENoYW5nZSB0aGUgcmVhZHkgc3RhdGUgdG8gQ0xPU0VEICgzKS5cbiAgd3Nba1JlYWR5U3RhdGVdID0gc3RhdGVzLkNMT1NFRFxuXG4gIC8vIDIuIElmIHRoZSB1c2VyIGFnZW50IHdhcyByZXF1aXJlZCB0byBmYWlsIHRoZSBXZWJTb2NrZXRcbiAgLy8gICAgY29ubmVjdGlvbiwgb3IgaWYgdGhlIFdlYlNvY2tldCBjb25uZWN0aW9uIHdhcyBjbG9zZWRcbiAgLy8gICAgYWZ0ZXIgYmVpbmcgZmxhZ2dlZCBhcyBmdWxsLCBmaXJlIGFuIGV2ZW50IG5hbWVkIGVycm9yXG4gIC8vICAgIGF0IHRoZSBXZWJTb2NrZXQgb2JqZWN0LlxuICAvLyBUT0RPXG5cbiAgLy8gMy4gRmlyZSBhbiBldmVudCBuYW1lZCBjbG9zZSBhdCB0aGUgV2ViU29ja2V0IG9iamVjdCxcbiAgLy8gICAgdXNpbmcgQ2xvc2VFdmVudCwgd2l0aCB0aGUgd2FzQ2xlYW4gYXR0cmlidXRlXG4gIC8vICAgIGluaXRpYWxpemVkIHRvIHRydWUgaWYgdGhlIGNvbm5lY3Rpb24gY2xvc2VkIGNsZWFubHlcbiAgLy8gICAgYW5kIGZhbHNlIG90aGVyd2lzZSwgdGhlIGNvZGUgYXR0cmlidXRlIGluaXRpYWxpemVkIHRvXG4gIC8vICAgIHRoZSBXZWJTb2NrZXQgY29ubmVjdGlvbiBjbG9zZSBjb2RlLCBhbmQgdGhlIHJlYXNvblxuICAvLyAgICBhdHRyaWJ1dGUgaW5pdGlhbGl6ZWQgdG8gdGhlIHJlc3VsdCBvZiBhcHBseWluZyBVVEYtOFxuICAvLyAgICBkZWNvZGUgd2l0aG91dCBCT00gdG8gdGhlIFdlYlNvY2tldCBjb25uZWN0aW9uIGNsb3NlXG4gIC8vICAgIHJlYXNvbi5cbiAgZmlyZUV2ZW50KCdjbG9zZScsIHdzLCBDbG9zZUV2ZW50LCB7XG4gICAgd2FzQ2xlYW4sIGNvZGUsIHJlYXNvblxuICB9KVxuXG4gIGlmIChjaGFubmVscy5jbG9zZS5oYXNTdWJzY3JpYmVycykge1xuICAgIGNoYW5uZWxzLmNsb3NlLnB1Ymxpc2goe1xuICAgICAgd2Vic29ja2V0OiB3cyxcbiAgICAgIGNvZGUsXG4gICAgICByZWFzb25cbiAgICB9KVxuICB9XG59XG5cbmZ1bmN0aW9uIG9uU29ja2V0RXJyb3IgKGVycm9yKSB7XG4gIGNvbnN0IHsgd3MgfSA9IHRoaXNcblxuICB3c1trUmVhZHlTdGF0ZV0gPSBzdGF0ZXMuQ0xPU0lOR1xuXG4gIGlmIChjaGFubmVscy5zb2NrZXRFcnJvci5oYXNTdWJzY3JpYmVycykge1xuICAgIGNoYW5uZWxzLnNvY2tldEVycm9yLnB1Ymxpc2goZXJyb3IpXG4gIH1cblxuICB0aGlzLmRlc3Ryb3koKVxufVxuXG5tb2R1bGUuZXhwb3J0cyA9IHtcbiAgZXN0YWJsaXNoV2ViU29ja2V0Q29ubmVjdGlvblxufVxuIiwKICAgICIndXNlIHN0cmljdCdcblxuY29uc3QgeyBtYXhVbnNpZ25lZDE2Qml0IH0gPSByZXF1aXJlKCcuL2NvbnN0YW50cycpXG5cbi8qKiBAdHlwZSB7aW1wb3J0KCdjcnlwdG8nKX0gKi9cbmxldCBjcnlwdG9cbnRyeSB7XG4gIGNyeXB0byA9IHJlcXVpcmUoJ2NyeXB0bycpXG59IGNhdGNoIHtcblxufVxuXG5jbGFzcyBXZWJzb2NrZXRGcmFtZVNlbmQge1xuICAvKipcbiAgICogQHBhcmFtIHtCdWZmZXJ8dW5kZWZpbmVkfSBkYXRhXG4gICAqL1xuICBjb25zdHJ1Y3RvciAoZGF0YSkge1xuICAgIHRoaXMuZnJhbWVEYXRhID0gZGF0YVxuICAgIHRoaXMubWFza0tleSA9IGNyeXB0by5yYW5kb21CeXRlcyg0KVxuICB9XG5cbiAgY3JlYXRlRnJhbWUgKG9wY29kZSkge1xuICAgIGNvbnN0IGJvZHlMZW5ndGggPSB0aGlzLmZyYW1lRGF0YT8uYnl0ZUxlbmd0aCA/PyAwXG5cbiAgICAvKiogQHR5cGUge251bWJlcn0gKi9cbiAgICBsZXQgcGF5bG9hZExlbmd0aCA9IGJvZHlMZW5ndGggLy8gMC0xMjVcbiAgICBsZXQgb2Zmc2V0ID0gNlxuXG4gICAgaWYgKGJvZHlMZW5ndGggPiBtYXhVbnNpZ25lZDE2Qml0KSB7XG4gICAgICBvZmZzZXQgKz0gOCAvLyBwYXlsb2FkIGxlbmd0aCBpcyBuZXh0IDggYnl0ZXNcbiAgICAgIHBheWxvYWRMZW5ndGggPSAxMjdcbiAgICB9IGVsc2UgaWYgKGJvZHlMZW5ndGggPiAxMjUpIHtcbiAgICAgIG9mZnNldCArPSAyIC8vIHBheWxvYWQgbGVuZ3RoIGlzIG5leHQgMiBieXRlc1xuICAgICAgcGF5bG9hZExlbmd0aCA9IDEyNlxuICAgIH1cblxuICAgIGNvbnN0IGJ1ZmZlciA9IEJ1ZmZlci5hbGxvY1Vuc2FmZShib2R5TGVuZ3RoICsgb2Zmc2V0KVxuXG4gICAgLy8gQ2xlYXIgZmlyc3QgMiBieXRlcywgZXZlcnl0aGluZyBlbHNlIGlzIG92ZXJ3cml0dGVuXG4gICAgYnVmZmVyWzBdID0gYnVmZmVyWzFdID0gMFxuICAgIGJ1ZmZlclswXSB8PSAweDgwIC8vIEZJTlxuICAgIGJ1ZmZlclswXSA9IChidWZmZXJbMF0gJiAweEYwKSArIG9wY29kZSAvLyBvcGNvZGVcblxuICAgIC8qISB3cy4gTUlUIExpY2Vuc2UuIEVpbmFyIE90dG8gU3Rhbmd2aWsgPGVpbmFyb3NAZ21haWwuY29tPiAqL1xuICAgIGJ1ZmZlcltvZmZzZXQgLSA0XSA9IHRoaXMubWFza0tleVswXVxuICAgIGJ1ZmZlcltvZmZzZXQgLSAzXSA9IHRoaXMubWFza0tleVsxXVxuICAgIGJ1ZmZlcltvZmZzZXQgLSAyXSA9IHRoaXMubWFza0tleVsyXVxuICAgIGJ1ZmZlcltvZmZzZXQgLSAxXSA9IHRoaXMubWFza0tleVszXVxuXG4gICAgYnVmZmVyWzFdID0gcGF5bG9hZExlbmd0aFxuXG4gICAgaWYgKHBheWxvYWRMZW5ndGggPT09IDEyNikge1xuICAgICAgYnVmZmVyLndyaXRlVUludDE2QkUoYm9keUxlbmd0aCwgMilcbiAgICB9IGVsc2UgaWYgKHBheWxvYWRMZW5ndGggPT09IDEyNykge1xuICAgICAgLy8gQ2xlYXIgZXh0ZW5kZWQgcGF5bG9hZCBsZW5ndGhcbiAgICAgIGJ1ZmZlclsyXSA9IGJ1ZmZlclszXSA9IDBcbiAgICAgIGJ1ZmZlci53cml0ZVVJbnRCRShib2R5TGVuZ3RoLCA0LCA2KVxuICAgIH1cblxuICAgIGJ1ZmZlclsxXSB8PSAweDgwIC8vIE1BU0tcblxuICAgIC8vIG1hc2sgYm9keVxuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgYm9keUxlbmd0aDsgaSsrKSB7XG4gICAgICBidWZmZXJbb2Zmc2V0ICsgaV0gPSB0aGlzLmZyYW1lRGF0YVtpXSBeIHRoaXMubWFza0tleVtpICUgNF1cbiAgICB9XG5cbiAgICByZXR1cm4gYnVmZmVyXG4gIH1cbn1cblxubW9kdWxlLmV4cG9ydHMgPSB7XG4gIFdlYnNvY2tldEZyYW1lU2VuZFxufVxuIiwKICAgICIndXNlIHN0cmljdCdcblxuY29uc3QgeyBXcml0YWJsZSB9ID0gcmVxdWlyZSgnc3RyZWFtJylcbmNvbnN0IGRpYWdub3N0aWNzQ2hhbm5lbCA9IHJlcXVpcmUoJ2RpYWdub3N0aWNzX2NoYW5uZWwnKVxuY29uc3QgeyBwYXJzZXJTdGF0ZXMsIG9wY29kZXMsIHN0YXRlcywgZW1wdHlCdWZmZXIgfSA9IHJlcXVpcmUoJy4vY29uc3RhbnRzJylcbmNvbnN0IHsga1JlYWR5U3RhdGUsIGtTZW50Q2xvc2UsIGtSZXNwb25zZSwga1JlY2VpdmVkQ2xvc2UgfSA9IHJlcXVpcmUoJy4vc3ltYm9scycpXG5jb25zdCB7IGlzVmFsaWRTdGF0dXNDb2RlLCBmYWlsV2Vic29ja2V0Q29ubmVjdGlvbiwgd2Vic29ja2V0TWVzc2FnZVJlY2VpdmVkIH0gPSByZXF1aXJlKCcuL3V0aWwnKVxuY29uc3QgeyBXZWJzb2NrZXRGcmFtZVNlbmQgfSA9IHJlcXVpcmUoJy4vZnJhbWUnKVxuXG4vLyBUaGlzIGNvZGUgd2FzIGluZmx1ZW5jZWQgYnkgd3MgcmVsZWFzZWQgdW5kZXIgdGhlIE1JVCBsaWNlbnNlLlxuLy8gQ29weXJpZ2h0IChjKSAyMDExIEVpbmFyIE90dG8gU3Rhbmd2aWsgPGVpbmFyb3NAZ21haWwuY29tPlxuLy8gQ29weXJpZ2h0IChjKSAyMDEzIEFybm91dCBLYXplbWllciBhbmQgY29udHJpYnV0b3JzXG4vLyBDb3B5cmlnaHQgKGMpIDIwMTYgTHVpZ2kgUGluY2EgYW5kIGNvbnRyaWJ1dG9yc1xuXG5jb25zdCBjaGFubmVscyA9IHt9XG5jaGFubmVscy5waW5nID0gZGlhZ25vc3RpY3NDaGFubmVsLmNoYW5uZWwoJ3VuZGljaTp3ZWJzb2NrZXQ6cGluZycpXG5jaGFubmVscy5wb25nID0gZGlhZ25vc3RpY3NDaGFubmVsLmNoYW5uZWwoJ3VuZGljaTp3ZWJzb2NrZXQ6cG9uZycpXG5cbmNsYXNzIEJ5dGVQYXJzZXIgZXh0ZW5kcyBXcml0YWJsZSB7XG4gICNidWZmZXJzID0gW11cbiAgI2J5dGVPZmZzZXQgPSAwXG5cbiAgI3N0YXRlID0gcGFyc2VyU3RhdGVzLklORk9cblxuICAjaW5mbyA9IHt9XG4gICNmcmFnbWVudHMgPSBbXVxuXG4gIGNvbnN0cnVjdG9yICh3cykge1xuICAgIHN1cGVyKClcblxuICAgIHRoaXMud3MgPSB3c1xuICB9XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7QnVmZmVyfSBjaHVua1xuICAgKiBAcGFyYW0geygpID0+IHZvaWR9IGNhbGxiYWNrXG4gICAqL1xuICBfd3JpdGUgKGNodW5rLCBfLCBjYWxsYmFjaykge1xuICAgIHRoaXMuI2J1ZmZlcnMucHVzaChjaHVuaylcbiAgICB0aGlzLiNieXRlT2Zmc2V0ICs9IGNodW5rLmxlbmd0aFxuXG4gICAgdGhpcy5ydW4oY2FsbGJhY2spXG4gIH1cblxuICAvKipcbiAgICogUnVucyB3aGVuZXZlciBhIG5ldyBjaHVuayBpcyByZWNlaXZlZC5cbiAgICogQ2FsbGJhY2sgaXMgY2FsbGVkIHdoZW5ldmVyIHRoZXJlIGFyZSBubyBtb3JlIGNodW5rcyBidWZmZXJpbmcsXG4gICAqIG9yIG5vdCBlbm91Z2ggYnl0ZXMgYXJlIGJ1ZmZlcmVkIHRvIHBhcnNlLlxuICAgKi9cbiAgcnVuIChjYWxsYmFjaykge1xuICAgIHdoaWxlICh0cnVlKSB7XG4gICAgICBpZiAodGhpcy4jc3RhdGUgPT09IHBhcnNlclN0YXRlcy5JTkZPKSB7XG4gICAgICAgIC8vIElmIHRoZXJlIGFyZW4ndCBlbm91Z2ggYnl0ZXMgdG8gcGFyc2UgdGhlIHBheWxvYWQgbGVuZ3RoLCBldGMuXG4gICAgICAgIGlmICh0aGlzLiNieXRlT2Zmc2V0IDwgMikge1xuICAgICAgICAgIHJldHVybiBjYWxsYmFjaygpXG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCBidWZmZXIgPSB0aGlzLmNvbnN1bWUoMilcblxuICAgICAgICB0aGlzLiNpbmZvLmZpbiA9IChidWZmZXJbMF0gJiAweDgwKSAhPT0gMFxuICAgICAgICB0aGlzLiNpbmZvLm9wY29kZSA9IGJ1ZmZlclswXSAmIDB4MEZcblxuICAgICAgICAvLyBJZiB3ZSByZWNlaXZlIGEgZnJhZ21lbnRlZCBtZXNzYWdlLCB3ZSB1c2UgdGhlIHR5cGUgb2YgdGhlIGZpcnN0XG4gICAgICAgIC8vIGZyYW1lIHRvIHBhcnNlIHRoZSBmdWxsIG1lc3NhZ2UgYXMgYmluYXJ5L3RleHQsIHdoZW4gaXQncyB0ZXJtaW5hdGVkXG4gICAgICAgIHRoaXMuI2luZm8ub3JpZ2luYWxPcGNvZGUgPz89IHRoaXMuI2luZm8ub3Bjb2RlXG5cbiAgICAgICAgdGhpcy4jaW5mby5mcmFnbWVudGVkID0gIXRoaXMuI2luZm8uZmluICYmIHRoaXMuI2luZm8ub3Bjb2RlICE9PSBvcGNvZGVzLkNPTlRJTlVBVElPTlxuXG4gICAgICAgIGlmICh0aGlzLiNpbmZvLmZyYWdtZW50ZWQgJiYgdGhpcy4jaW5mby5vcGNvZGUgIT09IG9wY29kZXMuQklOQVJZICYmIHRoaXMuI2luZm8ub3Bjb2RlICE9PSBvcGNvZGVzLlRFWFQpIHtcbiAgICAgICAgICAvLyBPbmx5IHRleHQgYW5kIGJpbmFyeSBmcmFtZXMgY2FuIGJlIGZyYWdtZW50ZWRcbiAgICAgICAgICBmYWlsV2Vic29ja2V0Q29ubmVjdGlvbih0aGlzLndzLCAnSW52YWxpZCBmcmFtZSB0eXBlIHdhcyBmcmFnbWVudGVkLicpXG4gICAgICAgICAgcmV0dXJuXG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCBwYXlsb2FkTGVuZ3RoID0gYnVmZmVyWzFdICYgMHg3RlxuXG4gICAgICAgIGlmIChwYXlsb2FkTGVuZ3RoIDw9IDEyNSkge1xuICAgICAgICAgIHRoaXMuI2luZm8ucGF5bG9hZExlbmd0aCA9IHBheWxvYWRMZW5ndGhcbiAgICAgICAgICB0aGlzLiNzdGF0ZSA9IHBhcnNlclN0YXRlcy5SRUFEX0RBVEFcbiAgICAgICAgfSBlbHNlIGlmIChwYXlsb2FkTGVuZ3RoID09PSAxMjYpIHtcbiAgICAgICAgICB0aGlzLiNzdGF0ZSA9IHBhcnNlclN0YXRlcy5QQVlMT0FETEVOR1RIXzE2XG4gICAgICAgIH0gZWxzZSBpZiAocGF5bG9hZExlbmd0aCA9PT0gMTI3KSB7XG4gICAgICAgICAgdGhpcy4jc3RhdGUgPSBwYXJzZXJTdGF0ZXMuUEFZTE9BRExFTkdUSF82NFxuICAgICAgICB9XG5cbiAgICAgICAgaWYgKHRoaXMuI2luZm8uZnJhZ21lbnRlZCAmJiBwYXlsb2FkTGVuZ3RoID4gMTI1KSB7XG4gICAgICAgICAgLy8gQSBmcmFnbWVudGVkIGZyYW1lIGNhbid0IGJlIGZyYWdtZW50ZWQgaXRzZWxmXG4gICAgICAgICAgZmFpbFdlYnNvY2tldENvbm5lY3Rpb24odGhpcy53cywgJ0ZyYWdtZW50ZWQgZnJhbWUgZXhjZWVkZWQgMTI1IGJ5dGVzLicpXG4gICAgICAgICAgcmV0dXJuXG4gICAgICAgIH0gZWxzZSBpZiAoXG4gICAgICAgICAgKHRoaXMuI2luZm8ub3Bjb2RlID09PSBvcGNvZGVzLlBJTkcgfHxcbiAgICAgICAgICAgIHRoaXMuI2luZm8ub3Bjb2RlID09PSBvcGNvZGVzLlBPTkcgfHxcbiAgICAgICAgICAgIHRoaXMuI2luZm8ub3Bjb2RlID09PSBvcGNvZGVzLkNMT1NFKSAmJlxuICAgICAgICAgIHBheWxvYWRMZW5ndGggPiAxMjVcbiAgICAgICAgKSB7XG4gICAgICAgICAgLy8gQ29udHJvbCBmcmFtZXMgY2FuIGhhdmUgYSBwYXlsb2FkIGxlbmd0aCBvZiAxMjUgYnl0ZXMgTUFYXG4gICAgICAgICAgZmFpbFdlYnNvY2tldENvbm5lY3Rpb24odGhpcy53cywgJ1BheWxvYWQgbGVuZ3RoIGZvciBjb250cm9sIGZyYW1lIGV4Y2VlZGVkIDEyNSBieXRlcy4nKVxuICAgICAgICAgIHJldHVyblxuICAgICAgICB9IGVsc2UgaWYgKHRoaXMuI2luZm8ub3Bjb2RlID09PSBvcGNvZGVzLkNMT1NFKSB7XG4gICAgICAgICAgaWYgKHBheWxvYWRMZW5ndGggPT09IDEpIHtcbiAgICAgICAgICAgIGZhaWxXZWJzb2NrZXRDb25uZWN0aW9uKHRoaXMud3MsICdSZWNlaXZlZCBjbG9zZSBmcmFtZSB3aXRoIGEgMS1ieXRlIGJvZHkuJylcbiAgICAgICAgICAgIHJldHVyblxuICAgICAgICAgIH1cblxuICAgICAgICAgIGNvbnN0IGJvZHkgPSB0aGlzLmNvbnN1bWUocGF5bG9hZExlbmd0aClcblxuICAgICAgICAgIHRoaXMuI2luZm8uY2xvc2VJbmZvID0gdGhpcy5wYXJzZUNsb3NlQm9keShmYWxzZSwgYm9keSlcblxuICAgICAgICAgIGlmICghdGhpcy53c1trU2VudENsb3NlXSkge1xuICAgICAgICAgICAgLy8gSWYgYW4gZW5kcG9pbnQgcmVjZWl2ZXMgYSBDbG9zZSBmcmFtZSBhbmQgZGlkIG5vdCBwcmV2aW91c2x5IHNlbmQgYVxuICAgICAgICAgICAgLy8gQ2xvc2UgZnJhbWUsIHRoZSBlbmRwb2ludCBNVVNUIHNlbmQgYSBDbG9zZSBmcmFtZSBpbiByZXNwb25zZS4gIChXaGVuXG4gICAgICAgICAgICAvLyBzZW5kaW5nIGEgQ2xvc2UgZnJhbWUgaW4gcmVzcG9uc2UsIHRoZSBlbmRwb2ludCB0eXBpY2FsbHkgZWNob3MgdGhlXG4gICAgICAgICAgICAvLyBzdGF0dXMgY29kZSBpdCByZWNlaXZlZC4pXG4gICAgICAgICAgICBjb25zdCBib2R5ID0gQnVmZmVyLmFsbG9jVW5zYWZlKDIpXG4gICAgICAgICAgICBib2R5LndyaXRlVUludDE2QkUodGhpcy4jaW5mby5jbG9zZUluZm8uY29kZSwgMClcbiAgICAgICAgICAgIGNvbnN0IGNsb3NlRnJhbWUgPSBuZXcgV2Vic29ja2V0RnJhbWVTZW5kKGJvZHkpXG5cbiAgICAgICAgICAgIHRoaXMud3Nba1Jlc3BvbnNlXS5zb2NrZXQud3JpdGUoXG4gICAgICAgICAgICAgIGNsb3NlRnJhbWUuY3JlYXRlRnJhbWUob3Bjb2Rlcy5DTE9TRSksXG4gICAgICAgICAgICAgIChlcnIpID0+IHtcbiAgICAgICAgICAgICAgICBpZiAoIWVycikge1xuICAgICAgICAgICAgICAgICAgdGhpcy53c1trU2VudENsb3NlXSA9IHRydWVcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIClcbiAgICAgICAgICB9XG5cbiAgICAgICAgICAvLyBVcG9uIGVpdGhlciBzZW5kaW5nIG9yIHJlY2VpdmluZyBhIENsb3NlIGNvbnRyb2wgZnJhbWUsIGl0IGlzIHNhaWRcbiAgICAgICAgICAvLyB0aGF0IF9UaGUgV2ViU29ja2V0IENsb3NpbmcgSGFuZHNoYWtlIGlzIFN0YXJ0ZWRfIGFuZCB0aGF0IHRoZVxuICAgICAgICAgIC8vIFdlYlNvY2tldCBjb25uZWN0aW9uIGlzIGluIHRoZSBDTE9TSU5HIHN0YXRlLlxuICAgICAgICAgIHRoaXMud3Nba1JlYWR5U3RhdGVdID0gc3RhdGVzLkNMT1NJTkdcbiAgICAgICAgICB0aGlzLndzW2tSZWNlaXZlZENsb3NlXSA9IHRydWVcblxuICAgICAgICAgIHRoaXMuZW5kKClcblxuICAgICAgICAgIHJldHVyblxuICAgICAgICB9IGVsc2UgaWYgKHRoaXMuI2luZm8ub3Bjb2RlID09PSBvcGNvZGVzLlBJTkcpIHtcbiAgICAgICAgICAvLyBVcG9uIHJlY2VpcHQgb2YgYSBQaW5nIGZyYW1lLCBhbiBlbmRwb2ludCBNVVNUIHNlbmQgYSBQb25nIGZyYW1lIGluXG4gICAgICAgICAgLy8gcmVzcG9uc2UsIHVubGVzcyBpdCBhbHJlYWR5IHJlY2VpdmVkIGEgQ2xvc2UgZnJhbWUuXG4gICAgICAgICAgLy8gQSBQb25nIGZyYW1lIHNlbnQgaW4gcmVzcG9uc2UgdG8gYSBQaW5nIGZyYW1lIG11c3QgaGF2ZSBpZGVudGljYWxcbiAgICAgICAgICAvLyBcIkFwcGxpY2F0aW9uIGRhdGFcIlxuXG4gICAgICAgICAgY29uc3QgYm9keSA9IHRoaXMuY29uc3VtZShwYXlsb2FkTGVuZ3RoKVxuXG4gICAgICAgICAgaWYgKCF0aGlzLndzW2tSZWNlaXZlZENsb3NlXSkge1xuICAgICAgICAgICAgY29uc3QgZnJhbWUgPSBuZXcgV2Vic29ja2V0RnJhbWVTZW5kKGJvZHkpXG5cbiAgICAgICAgICAgIHRoaXMud3Nba1Jlc3BvbnNlXS5zb2NrZXQud3JpdGUoZnJhbWUuY3JlYXRlRnJhbWUob3Bjb2Rlcy5QT05HKSlcblxuICAgICAgICAgICAgaWYgKGNoYW5uZWxzLnBpbmcuaGFzU3Vic2NyaWJlcnMpIHtcbiAgICAgICAgICAgICAgY2hhbm5lbHMucGluZy5wdWJsaXNoKHtcbiAgICAgICAgICAgICAgICBwYXlsb2FkOiBib2R5XG4gICAgICAgICAgICAgIH0pXG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgdGhpcy4jc3RhdGUgPSBwYXJzZXJTdGF0ZXMuSU5GT1xuXG4gICAgICAgICAgaWYgKHRoaXMuI2J5dGVPZmZzZXQgPiAwKSB7XG4gICAgICAgICAgICBjb250aW51ZVxuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBjYWxsYmFjaygpXG4gICAgICAgICAgICByZXR1cm5cbiAgICAgICAgICB9XG4gICAgICAgIH0gZWxzZSBpZiAodGhpcy4jaW5mby5vcGNvZGUgPT09IG9wY29kZXMuUE9ORykge1xuICAgICAgICAgIC8vIEEgUG9uZyBmcmFtZSBNQVkgYmUgc2VudCB1bnNvbGljaXRlZC4gIFRoaXMgc2VydmVzIGFzIGFcbiAgICAgICAgICAvLyB1bmlkaXJlY3Rpb25hbCBoZWFydGJlYXQuICBBIHJlc3BvbnNlIHRvIGFuIHVuc29saWNpdGVkIFBvbmcgZnJhbWUgaXNcbiAgICAgICAgICAvLyBub3QgZXhwZWN0ZWQuXG5cbiAgICAgICAgICBjb25zdCBib2R5ID0gdGhpcy5jb25zdW1lKHBheWxvYWRMZW5ndGgpXG5cbiAgICAgICAgICBpZiAoY2hhbm5lbHMucG9uZy5oYXNTdWJzY3JpYmVycykge1xuICAgICAgICAgICAgY2hhbm5lbHMucG9uZy5wdWJsaXNoKHtcbiAgICAgICAgICAgICAgcGF5bG9hZDogYm9keVxuICAgICAgICAgICAgfSlcbiAgICAgICAgICB9XG5cbiAgICAgICAgICBpZiAodGhpcy4jYnl0ZU9mZnNldCA+IDApIHtcbiAgICAgICAgICAgIGNvbnRpbnVlXG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGNhbGxiYWNrKClcbiAgICAgICAgICAgIHJldHVyblxuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfSBlbHNlIGlmICh0aGlzLiNzdGF0ZSA9PT0gcGFyc2VyU3RhdGVzLlBBWUxPQURMRU5HVEhfMTYpIHtcbiAgICAgICAgaWYgKHRoaXMuI2J5dGVPZmZzZXQgPCAyKSB7XG4gICAgICAgICAgcmV0dXJuIGNhbGxiYWNrKClcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IGJ1ZmZlciA9IHRoaXMuY29uc3VtZSgyKVxuXG4gICAgICAgIHRoaXMuI2luZm8ucGF5bG9hZExlbmd0aCA9IGJ1ZmZlci5yZWFkVUludDE2QkUoMClcbiAgICAgICAgdGhpcy4jc3RhdGUgPSBwYXJzZXJTdGF0ZXMuUkVBRF9EQVRBXG4gICAgICB9IGVsc2UgaWYgKHRoaXMuI3N0YXRlID09PSBwYXJzZXJTdGF0ZXMuUEFZTE9BRExFTkdUSF82NCkge1xuICAgICAgICBpZiAodGhpcy4jYnl0ZU9mZnNldCA8IDgpIHtcbiAgICAgICAgICByZXR1cm4gY2FsbGJhY2soKVxuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgYnVmZmVyID0gdGhpcy5jb25zdW1lKDgpXG4gICAgICAgIGNvbnN0IHVwcGVyID0gYnVmZmVyLnJlYWRVSW50MzJCRSgwKVxuXG4gICAgICAgIC8vIDJeMzEgaXMgdGhlIG1heGluaW11bSBieXRlcyBhbiBhcnJheWJ1ZmZlciBjYW4gY29udGFpblxuICAgICAgICAvLyBvbiAzMi1iaXQgc3lzdGVtcy4gQWx0aG91Z2gsIG9uIDY0LWJpdCBzeXN0ZW1zLCB0aGlzIGlzXG4gICAgICAgIC8vIDJeNTMtMSBieXRlcy5cbiAgICAgICAgLy8gaHR0cHM6Ly9kZXZlbG9wZXIubW96aWxsYS5vcmcvZW4tVVMvZG9jcy9XZWIvSmF2YVNjcmlwdC9SZWZlcmVuY2UvRXJyb3JzL0ludmFsaWRfYXJyYXlfbGVuZ3RoXG4gICAgICAgIC8vIGh0dHBzOi8vc291cmNlLmNocm9taXVtLm9yZy9jaHJvbWl1bS9jaHJvbWl1bS9zcmMvKy9tYWluOnY4L3NyYy9jb21tb24vZ2xvYmFscy5oO2RyYz0xOTQ2MjEyYWMwMTAwNjY4ZjE0ZWI5ZTI4NDNiZGQ4NDZlNTEwYTFlO2Jwdj0xO2JwdD0xO2w9MTI3NVxuICAgICAgICAvLyBodHRwczovL3NvdXJjZS5jaHJvbWl1bS5vcmcvY2hyb21pdW0vY2hyb21pdW0vc3JjLysvbWFpbjp2OC9zcmMvb2JqZWN0cy9qcy1hcnJheS1idWZmZXIuaDtsPTM0O2RyYz0xOTQ2MjEyYWMwMTAwNjY4ZjE0ZWI5ZTI4NDNiZGQ4NDZlNTEwYTFlXG4gICAgICAgIGlmICh1cHBlciA+IDIgKiogMzEgLSAxKSB7XG4gICAgICAgICAgZmFpbFdlYnNvY2tldENvbm5lY3Rpb24odGhpcy53cywgJ1JlY2VpdmVkIHBheWxvYWQgbGVuZ3RoID4gMl4zMSBieXRlcy4nKVxuICAgICAgICAgIHJldHVyblxuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgbG93ZXIgPSBidWZmZXIucmVhZFVJbnQzMkJFKDQpXG5cbiAgICAgICAgdGhpcy4jaW5mby5wYXlsb2FkTGVuZ3RoID0gKHVwcGVyIDw8IDgpICsgbG93ZXJcbiAgICAgICAgdGhpcy4jc3RhdGUgPSBwYXJzZXJTdGF0ZXMuUkVBRF9EQVRBXG4gICAgICB9IGVsc2UgaWYgKHRoaXMuI3N0YXRlID09PSBwYXJzZXJTdGF0ZXMuUkVBRF9EQVRBKSB7XG4gICAgICAgIGlmICh0aGlzLiNieXRlT2Zmc2V0IDwgdGhpcy4jaW5mby5wYXlsb2FkTGVuZ3RoKSB7XG4gICAgICAgICAgLy8gSWYgdGhlcmUgaXMgc3RpbGwgbW9yZSBkYXRhIGluIHRoaXMgY2h1bmsgdGhhdCBuZWVkcyB0byBiZSByZWFkXG4gICAgICAgICAgcmV0dXJuIGNhbGxiYWNrKClcbiAgICAgICAgfSBlbHNlIGlmICh0aGlzLiNieXRlT2Zmc2V0ID49IHRoaXMuI2luZm8ucGF5bG9hZExlbmd0aCkge1xuICAgICAgICAgIC8vIElmIHRoZSBzZXJ2ZXIgc2VudCBtdWx0aXBsZSBmcmFtZXMgaW4gYSBzaW5nbGUgY2h1bmtcblxuICAgICAgICAgIGNvbnN0IGJvZHkgPSB0aGlzLmNvbnN1bWUodGhpcy4jaW5mby5wYXlsb2FkTGVuZ3RoKVxuXG4gICAgICAgICAgdGhpcy4jZnJhZ21lbnRzLnB1c2goYm9keSlcblxuICAgICAgICAgIC8vIElmIHRoZSBmcmFtZSBpcyB1bmZyYWdtZW50ZWQsIG9yIGEgZnJhZ21lbnRlZCBmcmFtZSB3YXMgdGVybWluYXRlZCxcbiAgICAgICAgICAvLyBhIG1lc3NhZ2Ugd2FzIHJlY2VpdmVkXG4gICAgICAgICAgaWYgKCF0aGlzLiNpbmZvLmZyYWdtZW50ZWQgfHwgKHRoaXMuI2luZm8uZmluICYmIHRoaXMuI2luZm8ub3Bjb2RlID09PSBvcGNvZGVzLkNPTlRJTlVBVElPTikpIHtcbiAgICAgICAgICAgIGNvbnN0IGZ1bGxNZXNzYWdlID0gQnVmZmVyLmNvbmNhdCh0aGlzLiNmcmFnbWVudHMpXG5cbiAgICAgICAgICAgIHdlYnNvY2tldE1lc3NhZ2VSZWNlaXZlZCh0aGlzLndzLCB0aGlzLiNpbmZvLm9yaWdpbmFsT3Bjb2RlLCBmdWxsTWVzc2FnZSlcblxuICAgICAgICAgICAgdGhpcy4jaW5mbyA9IHt9XG4gICAgICAgICAgICB0aGlzLiNmcmFnbWVudHMubGVuZ3RoID0gMFxuICAgICAgICAgIH1cblxuICAgICAgICAgIHRoaXMuI3N0YXRlID0gcGFyc2VyU3RhdGVzLklORk9cbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICBpZiAodGhpcy4jYnl0ZU9mZnNldCA+IDApIHtcbiAgICAgICAgY29udGludWVcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGNhbGxiYWNrKClcbiAgICAgICAgYnJlYWtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogVGFrZSBuIGJ5dGVzIGZyb20gdGhlIGJ1ZmZlcmVkIEJ1ZmZlcnNcbiAgICogQHBhcmFtIHtudW1iZXJ9IG5cbiAgICogQHJldHVybnMge0J1ZmZlcnxudWxsfVxuICAgKi9cbiAgY29uc3VtZSAobikge1xuICAgIGlmIChuID4gdGhpcy4jYnl0ZU9mZnNldCkge1xuICAgICAgcmV0dXJuIG51bGxcbiAgICB9IGVsc2UgaWYgKG4gPT09IDApIHtcbiAgICAgIHJldHVybiBlbXB0eUJ1ZmZlclxuICAgIH1cblxuICAgIGlmICh0aGlzLiNidWZmZXJzWzBdLmxlbmd0aCA9PT0gbikge1xuICAgICAgdGhpcy4jYnl0ZU9mZnNldCAtPSB0aGlzLiNidWZmZXJzWzBdLmxlbmd0aFxuICAgICAgcmV0dXJuIHRoaXMuI2J1ZmZlcnMuc2hpZnQoKVxuICAgIH1cblxuICAgIGNvbnN0IGJ1ZmZlciA9IEJ1ZmZlci5hbGxvY1Vuc2FmZShuKVxuICAgIGxldCBvZmZzZXQgPSAwXG5cbiAgICB3aGlsZSAob2Zmc2V0ICE9PSBuKSB7XG4gICAgICBjb25zdCBuZXh0ID0gdGhpcy4jYnVmZmVyc1swXVxuICAgICAgY29uc3QgeyBsZW5ndGggfSA9IG5leHRcblxuICAgICAgaWYgKGxlbmd0aCArIG9mZnNldCA9PT0gbikge1xuICAgICAgICBidWZmZXIuc2V0KHRoaXMuI2J1ZmZlcnMuc2hpZnQoKSwgb2Zmc2V0KVxuICAgICAgICBicmVha1xuICAgICAgfSBlbHNlIGlmIChsZW5ndGggKyBvZmZzZXQgPiBuKSB7XG4gICAgICAgIGJ1ZmZlci5zZXQobmV4dC5zdWJhcnJheSgwLCBuIC0gb2Zmc2V0KSwgb2Zmc2V0KVxuICAgICAgICB0aGlzLiNidWZmZXJzWzBdID0gbmV4dC5zdWJhcnJheShuIC0gb2Zmc2V0KVxuICAgICAgICBicmVha1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgYnVmZmVyLnNldCh0aGlzLiNidWZmZXJzLnNoaWZ0KCksIG9mZnNldClcbiAgICAgICAgb2Zmc2V0ICs9IG5leHQubGVuZ3RoXG4gICAgICB9XG4gICAgfVxuXG4gICAgdGhpcy4jYnl0ZU9mZnNldCAtPSBuXG5cbiAgICByZXR1cm4gYnVmZmVyXG4gIH1cblxuICBwYXJzZUNsb3NlQm9keSAob25seUNvZGUsIGRhdGEpIHtcbiAgICAvLyBodHRwczovL2RhdGF0cmFja2VyLmlldGYub3JnL2RvYy9odG1sL3JmYzY0NTUjc2VjdGlvbi03LjEuNVxuICAgIC8qKiBAdHlwZSB7bnVtYmVyfHVuZGVmaW5lZH0gKi9cbiAgICBsZXQgY29kZVxuXG4gICAgaWYgKGRhdGEubGVuZ3RoID49IDIpIHtcbiAgICAgIC8vIF9UaGUgV2ViU29ja2V0IENvbm5lY3Rpb24gQ2xvc2UgQ29kZV8gaXNcbiAgICAgIC8vIGRlZmluZWQgYXMgdGhlIHN0YXR1cyBjb2RlIChTZWN0aW9uIDcuNCkgY29udGFpbmVkIGluIHRoZSBmaXJzdCBDbG9zZVxuICAgICAgLy8gY29udHJvbCBmcmFtZSByZWNlaXZlZCBieSB0aGUgYXBwbGljYXRpb25cbiAgICAgIGNvZGUgPSBkYXRhLnJlYWRVSW50MTZCRSgwKVxuICAgIH1cblxuICAgIGlmIChvbmx5Q29kZSkge1xuICAgICAgaWYgKCFpc1ZhbGlkU3RhdHVzQ29kZShjb2RlKSkge1xuICAgICAgICByZXR1cm4gbnVsbFxuICAgICAgfVxuXG4gICAgICByZXR1cm4geyBjb2RlIH1cbiAgICB9XG5cbiAgICAvLyBodHRwczovL2RhdGF0cmFja2VyLmlldGYub3JnL2RvYy9odG1sL3JmYzY0NTUjc2VjdGlvbi03LjEuNlxuICAgIC8qKiBAdHlwZSB7QnVmZmVyfSAqL1xuICAgIGxldCByZWFzb24gPSBkYXRhLnN1YmFycmF5KDIpXG5cbiAgICAvLyBSZW1vdmUgQk9NXG4gICAgaWYgKHJlYXNvblswXSA9PT0gMHhFRiAmJiByZWFzb25bMV0gPT09IDB4QkIgJiYgcmVhc29uWzJdID09PSAweEJGKSB7XG4gICAgICByZWFzb24gPSByZWFzb24uc3ViYXJyYXkoMylcbiAgICB9XG5cbiAgICBpZiAoY29kZSAhPT0gdW5kZWZpbmVkICYmICFpc1ZhbGlkU3RhdHVzQ29kZShjb2RlKSkge1xuICAgICAgcmV0dXJuIG51bGxcbiAgICB9XG5cbiAgICB0cnkge1xuICAgICAgLy8gVE9ETzogb3B0aW1pemUgdGhpc1xuICAgICAgcmVhc29uID0gbmV3IFRleHREZWNvZGVyKCd1dGYtOCcsIHsgZmF0YWw6IHRydWUgfSkuZGVjb2RlKHJlYXNvbilcbiAgICB9IGNhdGNoIHtcbiAgICAgIHJldHVybiBudWxsXG4gICAgfVxuXG4gICAgcmV0dXJuIHsgY29kZSwgcmVhc29uIH1cbiAgfVxuXG4gIGdldCBjbG9zaW5nSW5mbyAoKSB7XG4gICAgcmV0dXJuIHRoaXMuI2luZm8uY2xvc2VJbmZvXG4gIH1cbn1cblxubW9kdWxlLmV4cG9ydHMgPSB7XG4gIEJ5dGVQYXJzZXJcbn1cbiIsCiAgICAiJ3VzZSBzdHJpY3QnXG5cbmNvbnN0IHsgd2ViaWRsIH0gPSByZXF1aXJlKCcuLi9mZXRjaC93ZWJpZGwnKVxuY29uc3QgeyBET01FeGNlcHRpb24gfSA9IHJlcXVpcmUoJy4uL2ZldGNoL2NvbnN0YW50cycpXG5jb25zdCB7IFVSTFNlcmlhbGl6ZXIgfSA9IHJlcXVpcmUoJy4uL2ZldGNoL2RhdGFVUkwnKVxuY29uc3QgeyBnZXRHbG9iYWxPcmlnaW4gfSA9IHJlcXVpcmUoJy4uL2ZldGNoL2dsb2JhbCcpXG5jb25zdCB7IHN0YXRpY1Byb3BlcnR5RGVzY3JpcHRvcnMsIHN0YXRlcywgb3Bjb2RlcywgZW1wdHlCdWZmZXIgfSA9IHJlcXVpcmUoJy4vY29uc3RhbnRzJylcbmNvbnN0IHtcbiAga1dlYlNvY2tldFVSTCxcbiAga1JlYWR5U3RhdGUsXG4gIGtDb250cm9sbGVyLFxuICBrQmluYXJ5VHlwZSxcbiAga1Jlc3BvbnNlLFxuICBrU2VudENsb3NlLFxuICBrQnl0ZVBhcnNlclxufSA9IHJlcXVpcmUoJy4vc3ltYm9scycpXG5jb25zdCB7IGlzRXN0YWJsaXNoZWQsIGlzQ2xvc2luZywgaXNWYWxpZFN1YnByb3RvY29sLCBmYWlsV2Vic29ja2V0Q29ubmVjdGlvbiwgZmlyZUV2ZW50IH0gPSByZXF1aXJlKCcuL3V0aWwnKVxuY29uc3QgeyBlc3RhYmxpc2hXZWJTb2NrZXRDb25uZWN0aW9uIH0gPSByZXF1aXJlKCcuL2Nvbm5lY3Rpb24nKVxuY29uc3QgeyBXZWJzb2NrZXRGcmFtZVNlbmQgfSA9IHJlcXVpcmUoJy4vZnJhbWUnKVxuY29uc3QgeyBCeXRlUGFyc2VyIH0gPSByZXF1aXJlKCcuL3JlY2VpdmVyJylcbmNvbnN0IHsga0VudW1lcmFibGVQcm9wZXJ0eSwgaXNCbG9iTGlrZSB9ID0gcmVxdWlyZSgnLi4vY29yZS91dGlsJylcbmNvbnN0IHsgZ2V0R2xvYmFsRGlzcGF0Y2hlciB9ID0gcmVxdWlyZSgnLi4vZ2xvYmFsJylcbmNvbnN0IHsgdHlwZXMgfSA9IHJlcXVpcmUoJ3V0aWwnKVxuXG5sZXQgZXhwZXJpbWVudGFsV2FybmVkID0gZmFsc2VcblxuLy8gaHR0cHM6Ly93ZWJzb2NrZXRzLnNwZWMud2hhdHdnLm9yZy8jaW50ZXJmYWNlLWRlZmluaXRpb25cbmNsYXNzIFdlYlNvY2tldCBleHRlbmRzIEV2ZW50VGFyZ2V0IHtcbiAgI2V2ZW50cyA9IHtcbiAgICBvcGVuOiBudWxsLFxuICAgIGVycm9yOiBudWxsLFxuICAgIGNsb3NlOiBudWxsLFxuICAgIG1lc3NhZ2U6IG51bGxcbiAgfVxuXG4gICNidWZmZXJlZEFtb3VudCA9IDBcbiAgI3Byb3RvY29sID0gJydcbiAgI2V4dGVuc2lvbnMgPSAnJ1xuXG4gIC8qKlxuICAgKiBAcGFyYW0ge3N0cmluZ30gdXJsXG4gICAqIEBwYXJhbSB7c3RyaW5nfHN0cmluZ1tdfSBwcm90b2NvbHNcbiAgICovXG4gIGNvbnN0cnVjdG9yICh1cmwsIHByb3RvY29scyA9IFtdKSB7XG4gICAgc3VwZXIoKVxuXG4gICAgd2ViaWRsLmFyZ3VtZW50TGVuZ3RoQ2hlY2soYXJndW1lbnRzLCAxLCB7IGhlYWRlcjogJ1dlYlNvY2tldCBjb25zdHJ1Y3RvcicgfSlcblxuICAgIGlmICghZXhwZXJpbWVudGFsV2FybmVkKSB7XG4gICAgICBleHBlcmltZW50YWxXYXJuZWQgPSB0cnVlXG4gICAgICBwcm9jZXNzLmVtaXRXYXJuaW5nKCdXZWJTb2NrZXRzIGFyZSBleHBlcmltZW50YWwsIGV4cGVjdCB0aGVtIHRvIGNoYW5nZSBhdCBhbnkgdGltZS4nLCB7XG4gICAgICAgIGNvZGU6ICdVTkRJQ0ktV1MnXG4gICAgICB9KVxuICAgIH1cblxuICAgIGNvbnN0IG9wdGlvbnMgPSB3ZWJpZGwuY29udmVydGVyc1snRE9NU3RyaW5nIG9yIHNlcXVlbmNlPERPTVN0cmluZz4gb3IgV2ViU29ja2V0SW5pdCddKHByb3RvY29scylcblxuICAgIHVybCA9IHdlYmlkbC5jb252ZXJ0ZXJzLlVTVlN0cmluZyh1cmwpXG4gICAgcHJvdG9jb2xzID0gb3B0aW9ucy5wcm90b2NvbHNcblxuICAgIC8vIDEuIExldCBiYXNlVVJMIGJlIHRoaXMncyByZWxldmFudCBzZXR0aW5ncyBvYmplY3QncyBBUEkgYmFzZSBVUkwuXG4gICAgY29uc3QgYmFzZVVSTCA9IGdldEdsb2JhbE9yaWdpbigpXG5cbiAgICAvLyAxLiBMZXQgdXJsUmVjb3JkIGJlIHRoZSByZXN1bHQgb2YgYXBwbHlpbmcgdGhlIFVSTCBwYXJzZXIgdG8gdXJsIHdpdGggYmFzZVVSTC5cbiAgICBsZXQgdXJsUmVjb3JkXG5cbiAgICB0cnkge1xuICAgICAgdXJsUmVjb3JkID0gbmV3IFVSTCh1cmwsIGJhc2VVUkwpXG4gICAgfSBjYXRjaCAoZSkge1xuICAgICAgLy8gMy4gSWYgdXJsUmVjb3JkIGlzIGZhaWx1cmUsIHRoZW4gdGhyb3cgYSBcIlN5bnRheEVycm9yXCIgRE9NRXhjZXB0aW9uLlxuICAgICAgdGhyb3cgbmV3IERPTUV4Y2VwdGlvbihlLCAnU3ludGF4RXJyb3InKVxuICAgIH1cblxuICAgIC8vIDQuIElmIHVybFJlY29yZOKAmXMgc2NoZW1lIGlzIFwiaHR0cFwiLCB0aGVuIHNldCB1cmxSZWNvcmTigJlzIHNjaGVtZSB0byBcIndzXCIuXG4gICAgaWYgKHVybFJlY29yZC5wcm90b2NvbCA9PT0gJ2h0dHA6Jykge1xuICAgICAgdXJsUmVjb3JkLnByb3RvY29sID0gJ3dzOidcbiAgICB9IGVsc2UgaWYgKHVybFJlY29yZC5wcm90b2NvbCA9PT0gJ2h0dHBzOicpIHtcbiAgICAgIC8vIDUuIE90aGVyd2lzZSwgaWYgdXJsUmVjb3Jk4oCZcyBzY2hlbWUgaXMgXCJodHRwc1wiLCBzZXQgdXJsUmVjb3Jk4oCZcyBzY2hlbWUgdG8gXCJ3c3NcIi5cbiAgICAgIHVybFJlY29yZC5wcm90b2NvbCA9ICd3c3M6J1xuICAgIH1cblxuICAgIC8vIDYuIElmIHVybFJlY29yZOKAmXMgc2NoZW1lIGlzIG5vdCBcIndzXCIgb3IgXCJ3c3NcIiwgdGhlbiB0aHJvdyBhIFwiU3ludGF4RXJyb3JcIiBET01FeGNlcHRpb24uXG4gICAgaWYgKHVybFJlY29yZC5wcm90b2NvbCAhPT0gJ3dzOicgJiYgdXJsUmVjb3JkLnByb3RvY29sICE9PSAnd3NzOicpIHtcbiAgICAgIHRocm93IG5ldyBET01FeGNlcHRpb24oXG4gICAgICAgIGBFeHBlY3RlZCBhIHdzOiBvciB3c3M6IHByb3RvY29sLCBnb3QgJHt1cmxSZWNvcmQucHJvdG9jb2x9YCxcbiAgICAgICAgJ1N5bnRheEVycm9yJ1xuICAgICAgKVxuICAgIH1cblxuICAgIC8vIDcuIElmIHVybFJlY29yZOKAmXMgZnJhZ21lbnQgaXMgbm9uLW51bGwsIHRoZW4gdGhyb3cgYSBcIlN5bnRheEVycm9yXCJcbiAgICAvLyAgICBET01FeGNlcHRpb24uXG4gICAgaWYgKHVybFJlY29yZC5oYXNoIHx8IHVybFJlY29yZC5ocmVmLmVuZHNXaXRoKCcjJykpIHtcbiAgICAgIHRocm93IG5ldyBET01FeGNlcHRpb24oJ0dvdCBmcmFnbWVudCcsICdTeW50YXhFcnJvcicpXG4gICAgfVxuXG4gICAgLy8gOC4gSWYgcHJvdG9jb2xzIGlzIGEgc3RyaW5nLCBzZXQgcHJvdG9jb2xzIHRvIGEgc2VxdWVuY2UgY29uc2lzdGluZ1xuICAgIC8vICAgIG9mIGp1c3QgdGhhdCBzdHJpbmcuXG4gICAgaWYgKHR5cGVvZiBwcm90b2NvbHMgPT09ICdzdHJpbmcnKSB7XG4gICAgICBwcm90b2NvbHMgPSBbcHJvdG9jb2xzXVxuICAgIH1cblxuICAgIC8vIDkuIElmIGFueSBvZiB0aGUgdmFsdWVzIGluIHByb3RvY29scyBvY2N1ciBtb3JlIHRoYW4gb25jZSBvciBvdGhlcndpc2VcbiAgICAvLyAgICBmYWlsIHRvIG1hdGNoIHRoZSByZXF1aXJlbWVudHMgZm9yIGVsZW1lbnRzIHRoYXQgY29tcHJpc2UgdGhlIHZhbHVlXG4gICAgLy8gICAgb2YgYFNlYy1XZWJTb2NrZXQtUHJvdG9jb2xgIGZpZWxkcyBhcyBkZWZpbmVkIGJ5IFRoZSBXZWJTb2NrZXRcbiAgICAvLyAgICBwcm90b2NvbCwgdGhlbiB0aHJvdyBhIFwiU3ludGF4RXJyb3JcIiBET01FeGNlcHRpb24uXG4gICAgaWYgKHByb3RvY29scy5sZW5ndGggIT09IG5ldyBTZXQocHJvdG9jb2xzLm1hcChwID0+IHAudG9Mb3dlckNhc2UoKSkpLnNpemUpIHtcbiAgICAgIHRocm93IG5ldyBET01FeGNlcHRpb24oJ0ludmFsaWQgU2VjLVdlYlNvY2tldC1Qcm90b2NvbCB2YWx1ZScsICdTeW50YXhFcnJvcicpXG4gICAgfVxuXG4gICAgaWYgKHByb3RvY29scy5sZW5ndGggPiAwICYmICFwcm90b2NvbHMuZXZlcnkocCA9PiBpc1ZhbGlkU3VicHJvdG9jb2wocCkpKSB7XG4gICAgICB0aHJvdyBuZXcgRE9NRXhjZXB0aW9uKCdJbnZhbGlkIFNlYy1XZWJTb2NrZXQtUHJvdG9jb2wgdmFsdWUnLCAnU3ludGF4RXJyb3InKVxuICAgIH1cblxuICAgIC8vIDEwLiBTZXQgdGhpcydzIHVybCB0byB1cmxSZWNvcmQuXG4gICAgdGhpc1trV2ViU29ja2V0VVJMXSA9IG5ldyBVUkwodXJsUmVjb3JkLmhyZWYpXG5cbiAgICAvLyAxMS4gTGV0IGNsaWVudCBiZSB0aGlzJ3MgcmVsZXZhbnQgc2V0dGluZ3Mgb2JqZWN0LlxuXG4gICAgLy8gMTIuIFJ1biB0aGlzIHN0ZXAgaW4gcGFyYWxsZWw6XG5cbiAgICAvLyAgICAxLiBFc3RhYmxpc2ggYSBXZWJTb2NrZXQgY29ubmVjdGlvbiBnaXZlbiB1cmxSZWNvcmQsIHByb3RvY29scyxcbiAgICAvLyAgICAgICBhbmQgY2xpZW50LlxuICAgIHRoaXNba0NvbnRyb2xsZXJdID0gZXN0YWJsaXNoV2ViU29ja2V0Q29ubmVjdGlvbihcbiAgICAgIHVybFJlY29yZCxcbiAgICAgIHByb3RvY29scyxcbiAgICAgIHRoaXMsXG4gICAgICAocmVzcG9uc2UpID0+IHRoaXMuI29uQ29ubmVjdGlvbkVzdGFibGlzaGVkKHJlc3BvbnNlKSxcbiAgICAgIG9wdGlvbnNcbiAgICApXG5cbiAgICAvLyBFYWNoIFdlYlNvY2tldCBvYmplY3QgaGFzIGFuIGFzc29jaWF0ZWQgcmVhZHkgc3RhdGUsIHdoaWNoIGlzIGFcbiAgICAvLyBudW1iZXIgcmVwcmVzZW50aW5nIHRoZSBzdGF0ZSBvZiB0aGUgY29ubmVjdGlvbi4gSW5pdGlhbGx5IGl0IG11c3RcbiAgICAvLyBiZSBDT05ORUNUSU5HICgwKS5cbiAgICB0aGlzW2tSZWFkeVN0YXRlXSA9IFdlYlNvY2tldC5DT05ORUNUSU5HXG5cbiAgICAvLyBUaGUgZXh0ZW5zaW9ucyBhdHRyaWJ1dGUgbXVzdCBpbml0aWFsbHkgcmV0dXJuIHRoZSBlbXB0eSBzdHJpbmcuXG5cbiAgICAvLyBUaGUgcHJvdG9jb2wgYXR0cmlidXRlIG11c3QgaW5pdGlhbGx5IHJldHVybiB0aGUgZW1wdHkgc3RyaW5nLlxuXG4gICAgLy8gRWFjaCBXZWJTb2NrZXQgb2JqZWN0IGhhcyBhbiBhc3NvY2lhdGVkIGJpbmFyeSB0eXBlLCB3aGljaCBpcyBhXG4gICAgLy8gQmluYXJ5VHlwZS4gSW5pdGlhbGx5IGl0IG11c3QgYmUgXCJibG9iXCIuXG4gICAgdGhpc1trQmluYXJ5VHlwZV0gPSAnYmxvYidcbiAgfVxuXG4gIC8qKlxuICAgKiBAc2VlIGh0dHBzOi8vd2Vic29ja2V0cy5zcGVjLndoYXR3Zy5vcmcvI2RvbS13ZWJzb2NrZXQtY2xvc2VcbiAgICogQHBhcmFtIHtudW1iZXJ8dW5kZWZpbmVkfSBjb2RlXG4gICAqIEBwYXJhbSB7c3RyaW5nfHVuZGVmaW5lZH0gcmVhc29uXG4gICAqL1xuICBjbG9zZSAoY29kZSA9IHVuZGVmaW5lZCwgcmVhc29uID0gdW5kZWZpbmVkKSB7XG4gICAgd2ViaWRsLmJyYW5kQ2hlY2sodGhpcywgV2ViU29ja2V0KVxuXG4gICAgaWYgKGNvZGUgIT09IHVuZGVmaW5lZCkge1xuICAgICAgY29kZSA9IHdlYmlkbC5jb252ZXJ0ZXJzWyd1bnNpZ25lZCBzaG9ydCddKGNvZGUsIHsgY2xhbXA6IHRydWUgfSlcbiAgICB9XG5cbiAgICBpZiAocmVhc29uICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIHJlYXNvbiA9IHdlYmlkbC5jb252ZXJ0ZXJzLlVTVlN0cmluZyhyZWFzb24pXG4gICAgfVxuXG4gICAgLy8gMS4gSWYgY29kZSBpcyBwcmVzZW50LCBidXQgaXMgbmVpdGhlciBhbiBpbnRlZ2VyIGVxdWFsIHRvIDEwMDAgbm9yIGFuXG4gICAgLy8gICAgaW50ZWdlciBpbiB0aGUgcmFuZ2UgMzAwMCB0byA0OTk5LCBpbmNsdXNpdmUsIHRocm93IGFuXG4gICAgLy8gICAgXCJJbnZhbGlkQWNjZXNzRXJyb3JcIiBET01FeGNlcHRpb24uXG4gICAgaWYgKGNvZGUgIT09IHVuZGVmaW5lZCkge1xuICAgICAgaWYgKGNvZGUgIT09IDEwMDAgJiYgKGNvZGUgPCAzMDAwIHx8IGNvZGUgPiA0OTk5KSkge1xuICAgICAgICB0aHJvdyBuZXcgRE9NRXhjZXB0aW9uKCdpbnZhbGlkIGNvZGUnLCAnSW52YWxpZEFjY2Vzc0Vycm9yJylcbiAgICAgIH1cbiAgICB9XG5cbiAgICBsZXQgcmVhc29uQnl0ZUxlbmd0aCA9IDBcblxuICAgIC8vIDIuIElmIHJlYXNvbiBpcyBwcmVzZW50LCB0aGVuIHJ1biB0aGVzZSBzdWJzdGVwczpcbiAgICBpZiAocmVhc29uICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIC8vIDEuIExldCByZWFzb25CeXRlcyBiZSB0aGUgcmVzdWx0IG9mIGVuY29kaW5nIHJlYXNvbi5cbiAgICAgIC8vIDIuIElmIHJlYXNvbkJ5dGVzIGlzIGxvbmdlciB0aGFuIDEyMyBieXRlcywgdGhlbiB0aHJvdyBhXG4gICAgICAvLyAgICBcIlN5bnRheEVycm9yXCIgRE9NRXhjZXB0aW9uLlxuICAgICAgcmVhc29uQnl0ZUxlbmd0aCA9IEJ1ZmZlci5ieXRlTGVuZ3RoKHJlYXNvbilcblxuICAgICAgaWYgKHJlYXNvbkJ5dGVMZW5ndGggPiAxMjMpIHtcbiAgICAgICAgdGhyb3cgbmV3IERPTUV4Y2VwdGlvbihcbiAgICAgICAgICBgUmVhc29uIG11c3QgYmUgbGVzcyB0aGFuIDEyMyBieXRlczsgcmVjZWl2ZWQgJHtyZWFzb25CeXRlTGVuZ3RofWAsXG4gICAgICAgICAgJ1N5bnRheEVycm9yJ1xuICAgICAgICApXG4gICAgICB9XG4gICAgfVxuXG4gICAgLy8gMy4gUnVuIHRoZSBmaXJzdCBtYXRjaGluZyBzdGVwcyBmcm9tIHRoZSBmb2xsb3dpbmcgbGlzdDpcbiAgICBpZiAodGhpc1trUmVhZHlTdGF0ZV0gPT09IFdlYlNvY2tldC5DTE9TSU5HIHx8IHRoaXNba1JlYWR5U3RhdGVdID09PSBXZWJTb2NrZXQuQ0xPU0VEKSB7XG4gICAgICAvLyBJZiB0aGlzJ3MgcmVhZHkgc3RhdGUgaXMgQ0xPU0lORyAoMikgb3IgQ0xPU0VEICgzKVxuICAgICAgLy8gRG8gbm90aGluZy5cbiAgICB9IGVsc2UgaWYgKCFpc0VzdGFibGlzaGVkKHRoaXMpKSB7XG4gICAgICAvLyBJZiB0aGUgV2ViU29ja2V0IGNvbm5lY3Rpb24gaXMgbm90IHlldCBlc3RhYmxpc2hlZFxuICAgICAgLy8gRmFpbCB0aGUgV2ViU29ja2V0IGNvbm5lY3Rpb24gYW5kIHNldCB0aGlzJ3MgcmVhZHkgc3RhdGVcbiAgICAgIC8vIHRvIENMT1NJTkcgKDIpLlxuICAgICAgZmFpbFdlYnNvY2tldENvbm5lY3Rpb24odGhpcywgJ0Nvbm5lY3Rpb24gd2FzIGNsb3NlZCBiZWZvcmUgaXQgd2FzIGVzdGFibGlzaGVkLicpXG4gICAgICB0aGlzW2tSZWFkeVN0YXRlXSA9IFdlYlNvY2tldC5DTE9TSU5HXG4gICAgfSBlbHNlIGlmICghaXNDbG9zaW5nKHRoaXMpKSB7XG4gICAgICAvLyBJZiB0aGUgV2ViU29ja2V0IGNsb3NpbmcgaGFuZHNoYWtlIGhhcyBub3QgeWV0IGJlZW4gc3RhcnRlZFxuICAgICAgLy8gU3RhcnQgdGhlIFdlYlNvY2tldCBjbG9zaW5nIGhhbmRzaGFrZSBhbmQgc2V0IHRoaXMncyByZWFkeVxuICAgICAgLy8gc3RhdGUgdG8gQ0xPU0lORyAoMikuXG4gICAgICAvLyAtIElmIG5laXRoZXIgY29kZSBub3IgcmVhc29uIGlzIHByZXNlbnQsIHRoZSBXZWJTb2NrZXQgQ2xvc2VcbiAgICAgIC8vICAgbWVzc2FnZSBtdXN0IG5vdCBoYXZlIGEgYm9keS5cbiAgICAgIC8vIC0gSWYgY29kZSBpcyBwcmVzZW50LCB0aGVuIHRoZSBzdGF0dXMgY29kZSB0byB1c2UgaW4gdGhlXG4gICAgICAvLyAgIFdlYlNvY2tldCBDbG9zZSBtZXNzYWdlIG11c3QgYmUgdGhlIGludGVnZXIgZ2l2ZW4gYnkgY29kZS5cbiAgICAgIC8vIC0gSWYgcmVhc29uIGlzIGFsc28gcHJlc2VudCwgdGhlbiByZWFzb25CeXRlcyBtdXN0IGJlXG4gICAgICAvLyAgIHByb3ZpZGVkIGluIHRoZSBDbG9zZSBtZXNzYWdlIGFmdGVyIHRoZSBzdGF0dXMgY29kZS5cblxuICAgICAgY29uc3QgZnJhbWUgPSBuZXcgV2Vic29ja2V0RnJhbWVTZW5kKClcblxuICAgICAgLy8gSWYgbmVpdGhlciBjb2RlIG5vciByZWFzb24gaXMgcHJlc2VudCwgdGhlIFdlYlNvY2tldCBDbG9zZVxuICAgICAgLy8gbWVzc2FnZSBtdXN0IG5vdCBoYXZlIGEgYm9keS5cblxuICAgICAgLy8gSWYgY29kZSBpcyBwcmVzZW50LCB0aGVuIHRoZSBzdGF0dXMgY29kZSB0byB1c2UgaW4gdGhlXG4gICAgICAvLyBXZWJTb2NrZXQgQ2xvc2UgbWVzc2FnZSBtdXN0IGJlIHRoZSBpbnRlZ2VyIGdpdmVuIGJ5IGNvZGUuXG4gICAgICBpZiAoY29kZSAhPT0gdW5kZWZpbmVkICYmIHJlYXNvbiA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgIGZyYW1lLmZyYW1lRGF0YSA9IEJ1ZmZlci5hbGxvY1Vuc2FmZSgyKVxuICAgICAgICBmcmFtZS5mcmFtZURhdGEud3JpdGVVSW50MTZCRShjb2RlLCAwKVxuICAgICAgfSBlbHNlIGlmIChjb2RlICE9PSB1bmRlZmluZWQgJiYgcmVhc29uICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgLy8gSWYgcmVhc29uIGlzIGFsc28gcHJlc2VudCwgdGhlbiByZWFzb25CeXRlcyBtdXN0IGJlXG4gICAgICAgIC8vIHByb3ZpZGVkIGluIHRoZSBDbG9zZSBtZXNzYWdlIGFmdGVyIHRoZSBzdGF0dXMgY29kZS5cbiAgICAgICAgZnJhbWUuZnJhbWVEYXRhID0gQnVmZmVyLmFsbG9jVW5zYWZlKDIgKyByZWFzb25CeXRlTGVuZ3RoKVxuICAgICAgICBmcmFtZS5mcmFtZURhdGEud3JpdGVVSW50MTZCRShjb2RlLCAwKVxuICAgICAgICAvLyB0aGUgYm9keSBNQVkgY29udGFpbiBVVEYtOC1lbmNvZGVkIGRhdGEgd2l0aCB2YWx1ZSAvcmVhc29uL1xuICAgICAgICBmcmFtZS5mcmFtZURhdGEud3JpdGUocmVhc29uLCAyLCAndXRmLTgnKVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgZnJhbWUuZnJhbWVEYXRhID0gZW1wdHlCdWZmZXJcbiAgICAgIH1cblxuICAgICAgLyoqIEB0eXBlIHtpbXBvcnQoJ3N0cmVhbScpLkR1cGxleH0gKi9cbiAgICAgIGNvbnN0IHNvY2tldCA9IHRoaXNba1Jlc3BvbnNlXS5zb2NrZXRcblxuICAgICAgc29ja2V0LndyaXRlKGZyYW1lLmNyZWF0ZUZyYW1lKG9wY29kZXMuQ0xPU0UpLCAoZXJyKSA9PiB7XG4gICAgICAgIGlmICghZXJyKSB7XG4gICAgICAgICAgdGhpc1trU2VudENsb3NlXSA9IHRydWVcbiAgICAgICAgfVxuICAgICAgfSlcblxuICAgICAgLy8gVXBvbiBlaXRoZXIgc2VuZGluZyBvciByZWNlaXZpbmcgYSBDbG9zZSBjb250cm9sIGZyYW1lLCBpdCBpcyBzYWlkXG4gICAgICAvLyB0aGF0IF9UaGUgV2ViU29ja2V0IENsb3NpbmcgSGFuZHNoYWtlIGlzIFN0YXJ0ZWRfIGFuZCB0aGF0IHRoZVxuICAgICAgLy8gV2ViU29ja2V0IGNvbm5lY3Rpb24gaXMgaW4gdGhlIENMT1NJTkcgc3RhdGUuXG4gICAgICB0aGlzW2tSZWFkeVN0YXRlXSA9IHN0YXRlcy5DTE9TSU5HXG4gICAgfSBlbHNlIHtcbiAgICAgIC8vIE90aGVyd2lzZVxuICAgICAgLy8gU2V0IHRoaXMncyByZWFkeSBzdGF0ZSB0byBDTE9TSU5HICgyKS5cbiAgICAgIHRoaXNba1JlYWR5U3RhdGVdID0gV2ViU29ja2V0LkNMT1NJTkdcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogQHNlZSBodHRwczovL3dlYnNvY2tldHMuc3BlYy53aGF0d2cub3JnLyNkb20td2Vic29ja2V0LXNlbmRcbiAgICogQHBhcmFtIHtOb2RlSlMuVHlwZWRBcnJheXxBcnJheUJ1ZmZlcnxCbG9ifHN0cmluZ30gZGF0YVxuICAgKi9cbiAgc2VuZCAoZGF0YSkge1xuICAgIHdlYmlkbC5icmFuZENoZWNrKHRoaXMsIFdlYlNvY2tldClcblxuICAgIHdlYmlkbC5hcmd1bWVudExlbmd0aENoZWNrKGFyZ3VtZW50cywgMSwgeyBoZWFkZXI6ICdXZWJTb2NrZXQuc2VuZCcgfSlcblxuICAgIGRhdGEgPSB3ZWJpZGwuY29udmVydGVycy5XZWJTb2NrZXRTZW5kRGF0YShkYXRhKVxuXG4gICAgLy8gMS4gSWYgdGhpcydzIHJlYWR5IHN0YXRlIGlzIENPTk5FQ1RJTkcsIHRoZW4gdGhyb3cgYW5cbiAgICAvLyAgICBcIkludmFsaWRTdGF0ZUVycm9yXCIgRE9NRXhjZXB0aW9uLlxuICAgIGlmICh0aGlzW2tSZWFkeVN0YXRlXSA9PT0gV2ViU29ja2V0LkNPTk5FQ1RJTkcpIHtcbiAgICAgIHRocm93IG5ldyBET01FeGNlcHRpb24oJ1NlbnQgYmVmb3JlIGNvbm5lY3RlZC4nLCAnSW52YWxpZFN0YXRlRXJyb3InKVxuICAgIH1cblxuICAgIC8vIDIuIFJ1biB0aGUgYXBwcm9wcmlhdGUgc2V0IG9mIHN0ZXBzIGZyb20gdGhlIGZvbGxvd2luZyBsaXN0OlxuICAgIC8vIGh0dHBzOi8vZGF0YXRyYWNrZXIuaWV0Zi5vcmcvZG9jL2h0bWwvcmZjNjQ1NSNzZWN0aW9uLTYuMVxuICAgIC8vIGh0dHBzOi8vZGF0YXRyYWNrZXIuaWV0Zi5vcmcvZG9jL2h0bWwvcmZjNjQ1NSNzZWN0aW9uLTUuMlxuXG4gICAgaWYgKCFpc0VzdGFibGlzaGVkKHRoaXMpIHx8IGlzQ2xvc2luZyh0aGlzKSkge1xuICAgICAgcmV0dXJuXG4gICAgfVxuXG4gICAgLyoqIEB0eXBlIHtpbXBvcnQoJ3N0cmVhbScpLkR1cGxleH0gKi9cbiAgICBjb25zdCBzb2NrZXQgPSB0aGlzW2tSZXNwb25zZV0uc29ja2V0XG5cbiAgICAvLyBJZiBkYXRhIGlzIGEgc3RyaW5nXG4gICAgaWYgKHR5cGVvZiBkYXRhID09PSAnc3RyaW5nJykge1xuICAgICAgLy8gSWYgdGhlIFdlYlNvY2tldCBjb25uZWN0aW9uIGlzIGVzdGFibGlzaGVkIGFuZCB0aGUgV2ViU29ja2V0XG4gICAgICAvLyBjbG9zaW5nIGhhbmRzaGFrZSBoYXMgbm90IHlldCBzdGFydGVkLCB0aGVuIHRoZSB1c2VyIGFnZW50XG4gICAgICAvLyBtdXN0IHNlbmQgYSBXZWJTb2NrZXQgTWVzc2FnZSBjb21wcmlzZWQgb2YgdGhlIGRhdGEgYXJndW1lbnRcbiAgICAgIC8vIHVzaW5nIGEgdGV4dCBmcmFtZSBvcGNvZGU7IGlmIHRoZSBkYXRhIGNhbm5vdCBiZSBzZW50LCBlLmcuXG4gICAgICAvLyBiZWNhdXNlIGl0IHdvdWxkIG5lZWQgdG8gYmUgYnVmZmVyZWQgYnV0IHRoZSBidWZmZXIgaXMgZnVsbCxcbiAgICAgIC8vIHRoZSB1c2VyIGFnZW50IG11c3QgZmxhZyB0aGUgV2ViU29ja2V0IGFzIGZ1bGwgYW5kIHRoZW4gY2xvc2VcbiAgICAgIC8vIHRoZSBXZWJTb2NrZXQgY29ubmVjdGlvbi4gQW55IGludm9jYXRpb24gb2YgdGhpcyBtZXRob2Qgd2l0aCBhXG4gICAgICAvLyBzdHJpbmcgYXJndW1lbnQgdGhhdCBkb2VzIG5vdCB0aHJvdyBhbiBleGNlcHRpb24gbXVzdCBpbmNyZWFzZVxuICAgICAgLy8gdGhlIGJ1ZmZlcmVkQW1vdW50IGF0dHJpYnV0ZSBieSB0aGUgbnVtYmVyIG9mIGJ5dGVzIG5lZWRlZCB0b1xuICAgICAgLy8gZXhwcmVzcyB0aGUgYXJndW1lbnQgYXMgVVRGLTguXG5cbiAgICAgIGNvbnN0IHZhbHVlID0gQnVmZmVyLmZyb20oZGF0YSlcbiAgICAgIGNvbnN0IGZyYW1lID0gbmV3IFdlYnNvY2tldEZyYW1lU2VuZCh2YWx1ZSlcbiAgICAgIGNvbnN0IGJ1ZmZlciA9IGZyYW1lLmNyZWF0ZUZyYW1lKG9wY29kZXMuVEVYVClcblxuICAgICAgdGhpcy4jYnVmZmVyZWRBbW91bnQgKz0gdmFsdWUuYnl0ZUxlbmd0aFxuICAgICAgc29ja2V0LndyaXRlKGJ1ZmZlciwgKCkgPT4ge1xuICAgICAgICB0aGlzLiNidWZmZXJlZEFtb3VudCAtPSB2YWx1ZS5ieXRlTGVuZ3RoXG4gICAgICB9KVxuICAgIH0gZWxzZSBpZiAodHlwZXMuaXNBcnJheUJ1ZmZlcihkYXRhKSkge1xuICAgICAgLy8gSWYgdGhlIFdlYlNvY2tldCBjb25uZWN0aW9uIGlzIGVzdGFibGlzaGVkLCBhbmQgdGhlIFdlYlNvY2tldFxuICAgICAgLy8gY2xvc2luZyBoYW5kc2hha2UgaGFzIG5vdCB5ZXQgc3RhcnRlZCwgdGhlbiB0aGUgdXNlciBhZ2VudCBtdXN0XG4gICAgICAvLyBzZW5kIGEgV2ViU29ja2V0IE1lc3NhZ2UgY29tcHJpc2VkIG9mIGRhdGEgdXNpbmcgYSBiaW5hcnkgZnJhbWVcbiAgICAgIC8vIG9wY29kZTsgaWYgdGhlIGRhdGEgY2Fubm90IGJlIHNlbnQsIGUuZy4gYmVjYXVzZSBpdCB3b3VsZCBuZWVkXG4gICAgICAvLyB0byBiZSBidWZmZXJlZCBidXQgdGhlIGJ1ZmZlciBpcyBmdWxsLCB0aGUgdXNlciBhZ2VudCBtdXN0IGZsYWdcbiAgICAgIC8vIHRoZSBXZWJTb2NrZXQgYXMgZnVsbCBhbmQgdGhlbiBjbG9zZSB0aGUgV2ViU29ja2V0IGNvbm5lY3Rpb24uXG4gICAgICAvLyBUaGUgZGF0YSB0byBiZSBzZW50IGlzIHRoZSBkYXRhIHN0b3JlZCBpbiB0aGUgYnVmZmVyIGRlc2NyaWJlZFxuICAgICAgLy8gYnkgdGhlIEFycmF5QnVmZmVyIG9iamVjdC4gQW55IGludm9jYXRpb24gb2YgdGhpcyBtZXRob2Qgd2l0aCBhblxuICAgICAgLy8gQXJyYXlCdWZmZXIgYXJndW1lbnQgdGhhdCBkb2VzIG5vdCB0aHJvdyBhbiBleGNlcHRpb24gbXVzdFxuICAgICAgLy8gaW5jcmVhc2UgdGhlIGJ1ZmZlcmVkQW1vdW50IGF0dHJpYnV0ZSBieSB0aGUgbGVuZ3RoIG9mIHRoZVxuICAgICAgLy8gQXJyYXlCdWZmZXIgaW4gYnl0ZXMuXG5cbiAgICAgIGNvbnN0IHZhbHVlID0gQnVmZmVyLmZyb20oZGF0YSlcbiAgICAgIGNvbnN0IGZyYW1lID0gbmV3IFdlYnNvY2tldEZyYW1lU2VuZCh2YWx1ZSlcbiAgICAgIGNvbnN0IGJ1ZmZlciA9IGZyYW1lLmNyZWF0ZUZyYW1lKG9wY29kZXMuQklOQVJZKVxuXG4gICAgICB0aGlzLiNidWZmZXJlZEFtb3VudCArPSB2YWx1ZS5ieXRlTGVuZ3RoXG4gICAgICBzb2NrZXQud3JpdGUoYnVmZmVyLCAoKSA9PiB7XG4gICAgICAgIHRoaXMuI2J1ZmZlcmVkQW1vdW50IC09IHZhbHVlLmJ5dGVMZW5ndGhcbiAgICAgIH0pXG4gICAgfSBlbHNlIGlmIChBcnJheUJ1ZmZlci5pc1ZpZXcoZGF0YSkpIHtcbiAgICAgIC8vIElmIHRoZSBXZWJTb2NrZXQgY29ubmVjdGlvbiBpcyBlc3RhYmxpc2hlZCwgYW5kIHRoZSBXZWJTb2NrZXRcbiAgICAgIC8vIGNsb3NpbmcgaGFuZHNoYWtlIGhhcyBub3QgeWV0IHN0YXJ0ZWQsIHRoZW4gdGhlIHVzZXIgYWdlbnQgbXVzdFxuICAgICAgLy8gc2VuZCBhIFdlYlNvY2tldCBNZXNzYWdlIGNvbXByaXNlZCBvZiBkYXRhIHVzaW5nIGEgYmluYXJ5IGZyYW1lXG4gICAgICAvLyBvcGNvZGU7IGlmIHRoZSBkYXRhIGNhbm5vdCBiZSBzZW50LCBlLmcuIGJlY2F1c2UgaXQgd291bGQgbmVlZCB0b1xuICAgICAgLy8gYmUgYnVmZmVyZWQgYnV0IHRoZSBidWZmZXIgaXMgZnVsbCwgdGhlIHVzZXIgYWdlbnQgbXVzdCBmbGFnIHRoZVxuICAgICAgLy8gV2ViU29ja2V0IGFzIGZ1bGwgYW5kIHRoZW4gY2xvc2UgdGhlIFdlYlNvY2tldCBjb25uZWN0aW9uLiBUaGVcbiAgICAgIC8vIGRhdGEgdG8gYmUgc2VudCBpcyB0aGUgZGF0YSBzdG9yZWQgaW4gdGhlIHNlY3Rpb24gb2YgdGhlIGJ1ZmZlclxuICAgICAgLy8gZGVzY3JpYmVkIGJ5IHRoZSBBcnJheUJ1ZmZlciBvYmplY3QgdGhhdCBkYXRhIHJlZmVyZW5jZXMuIEFueVxuICAgICAgLy8gaW52b2NhdGlvbiBvZiB0aGlzIG1ldGhvZCB3aXRoIHRoaXMga2luZCBvZiBhcmd1bWVudCB0aGF0IGRvZXNcbiAgICAgIC8vIG5vdCB0aHJvdyBhbiBleGNlcHRpb24gbXVzdCBpbmNyZWFzZSB0aGUgYnVmZmVyZWRBbW91bnQgYXR0cmlidXRlXG4gICAgICAvLyBieSB0aGUgbGVuZ3RoIG9mIGRhdGHigJlzIGJ1ZmZlciBpbiBieXRlcy5cblxuICAgICAgY29uc3QgYWIgPSBCdWZmZXIuZnJvbShkYXRhLCBkYXRhLmJ5dGVPZmZzZXQsIGRhdGEuYnl0ZUxlbmd0aClcblxuICAgICAgY29uc3QgZnJhbWUgPSBuZXcgV2Vic29ja2V0RnJhbWVTZW5kKGFiKVxuICAgICAgY29uc3QgYnVmZmVyID0gZnJhbWUuY3JlYXRlRnJhbWUob3Bjb2Rlcy5CSU5BUlkpXG5cbiAgICAgIHRoaXMuI2J1ZmZlcmVkQW1vdW50ICs9IGFiLmJ5dGVMZW5ndGhcbiAgICAgIHNvY2tldC53cml0ZShidWZmZXIsICgpID0+IHtcbiAgICAgICAgdGhpcy4jYnVmZmVyZWRBbW91bnQgLT0gYWIuYnl0ZUxlbmd0aFxuICAgICAgfSlcbiAgICB9IGVsc2UgaWYgKGlzQmxvYkxpa2UoZGF0YSkpIHtcbiAgICAgIC8vIElmIHRoZSBXZWJTb2NrZXQgY29ubmVjdGlvbiBpcyBlc3RhYmxpc2hlZCwgYW5kIHRoZSBXZWJTb2NrZXRcbiAgICAgIC8vIGNsb3NpbmcgaGFuZHNoYWtlIGhhcyBub3QgeWV0IHN0YXJ0ZWQsIHRoZW4gdGhlIHVzZXIgYWdlbnQgbXVzdFxuICAgICAgLy8gc2VuZCBhIFdlYlNvY2tldCBNZXNzYWdlIGNvbXByaXNlZCBvZiBkYXRhIHVzaW5nIGEgYmluYXJ5IGZyYW1lXG4gICAgICAvLyBvcGNvZGU7IGlmIHRoZSBkYXRhIGNhbm5vdCBiZSBzZW50LCBlLmcuIGJlY2F1c2UgaXQgd291bGQgbmVlZCB0b1xuICAgICAgLy8gYmUgYnVmZmVyZWQgYnV0IHRoZSBidWZmZXIgaXMgZnVsbCwgdGhlIHVzZXIgYWdlbnQgbXVzdCBmbGFnIHRoZVxuICAgICAgLy8gV2ViU29ja2V0IGFzIGZ1bGwgYW5kIHRoZW4gY2xvc2UgdGhlIFdlYlNvY2tldCBjb25uZWN0aW9uLiBUaGUgZGF0YVxuICAgICAgLy8gdG8gYmUgc2VudCBpcyB0aGUgcmF3IGRhdGEgcmVwcmVzZW50ZWQgYnkgdGhlIEJsb2Igb2JqZWN0LiBBbnlcbiAgICAgIC8vIGludm9jYXRpb24gb2YgdGhpcyBtZXRob2Qgd2l0aCBhIEJsb2IgYXJndW1lbnQgdGhhdCBkb2VzIG5vdCB0aHJvd1xuICAgICAgLy8gYW4gZXhjZXB0aW9uIG11c3QgaW5jcmVhc2UgdGhlIGJ1ZmZlcmVkQW1vdW50IGF0dHJpYnV0ZSBieSB0aGUgc2l6ZVxuICAgICAgLy8gb2YgdGhlIEJsb2Igb2JqZWN04oCZcyByYXcgZGF0YSwgaW4gYnl0ZXMuXG5cbiAgICAgIGNvbnN0IGZyYW1lID0gbmV3IFdlYnNvY2tldEZyYW1lU2VuZCgpXG5cbiAgICAgIGRhdGEuYXJyYXlCdWZmZXIoKS50aGVuKChhYikgPT4ge1xuICAgICAgICBjb25zdCB2YWx1ZSA9IEJ1ZmZlci5mcm9tKGFiKVxuICAgICAgICBmcmFtZS5mcmFtZURhdGEgPSB2YWx1ZVxuICAgICAgICBjb25zdCBidWZmZXIgPSBmcmFtZS5jcmVhdGVGcmFtZShvcGNvZGVzLkJJTkFSWSlcblxuICAgICAgICB0aGlzLiNidWZmZXJlZEFtb3VudCArPSB2YWx1ZS5ieXRlTGVuZ3RoXG4gICAgICAgIHNvY2tldC53cml0ZShidWZmZXIsICgpID0+IHtcbiAgICAgICAgICB0aGlzLiNidWZmZXJlZEFtb3VudCAtPSB2YWx1ZS5ieXRlTGVuZ3RoXG4gICAgICAgIH0pXG4gICAgICB9KVxuICAgIH1cbiAgfVxuXG4gIGdldCByZWFkeVN0YXRlICgpIHtcbiAgICB3ZWJpZGwuYnJhbmRDaGVjayh0aGlzLCBXZWJTb2NrZXQpXG5cbiAgICAvLyBUaGUgcmVhZHlTdGF0ZSBnZXR0ZXIgc3RlcHMgYXJlIHRvIHJldHVybiB0aGlzJ3MgcmVhZHkgc3RhdGUuXG4gICAgcmV0dXJuIHRoaXNba1JlYWR5U3RhdGVdXG4gIH1cblxuICBnZXQgYnVmZmVyZWRBbW91bnQgKCkge1xuICAgIHdlYmlkbC5icmFuZENoZWNrKHRoaXMsIFdlYlNvY2tldClcblxuICAgIHJldHVybiB0aGlzLiNidWZmZXJlZEFtb3VudFxuICB9XG5cbiAgZ2V0IHVybCAoKSB7XG4gICAgd2ViaWRsLmJyYW5kQ2hlY2sodGhpcywgV2ViU29ja2V0KVxuXG4gICAgLy8gVGhlIHVybCBnZXR0ZXIgc3RlcHMgYXJlIHRvIHJldHVybiB0aGlzJ3MgdXJsLCBzZXJpYWxpemVkLlxuICAgIHJldHVybiBVUkxTZXJpYWxpemVyKHRoaXNba1dlYlNvY2tldFVSTF0pXG4gIH1cblxuICBnZXQgZXh0ZW5zaW9ucyAoKSB7XG4gICAgd2ViaWRsLmJyYW5kQ2hlY2sodGhpcywgV2ViU29ja2V0KVxuXG4gICAgcmV0dXJuIHRoaXMuI2V4dGVuc2lvbnNcbiAgfVxuXG4gIGdldCBwcm90b2NvbCAoKSB7XG4gICAgd2ViaWRsLmJyYW5kQ2hlY2sodGhpcywgV2ViU29ja2V0KVxuXG4gICAgcmV0dXJuIHRoaXMuI3Byb3RvY29sXG4gIH1cblxuICBnZXQgb25vcGVuICgpIHtcbiAgICB3ZWJpZGwuYnJhbmRDaGVjayh0aGlzLCBXZWJTb2NrZXQpXG5cbiAgICByZXR1cm4gdGhpcy4jZXZlbnRzLm9wZW5cbiAgfVxuXG4gIHNldCBvbm9wZW4gKGZuKSB7XG4gICAgd2ViaWRsLmJyYW5kQ2hlY2sodGhpcywgV2ViU29ja2V0KVxuXG4gICAgaWYgKHRoaXMuI2V2ZW50cy5vcGVuKSB7XG4gICAgICB0aGlzLnJlbW92ZUV2ZW50TGlzdGVuZXIoJ29wZW4nLCB0aGlzLiNldmVudHMub3BlbilcbiAgICB9XG5cbiAgICBpZiAodHlwZW9mIGZuID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICB0aGlzLiNldmVudHMub3BlbiA9IGZuXG4gICAgICB0aGlzLmFkZEV2ZW50TGlzdGVuZXIoJ29wZW4nLCBmbilcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy4jZXZlbnRzLm9wZW4gPSBudWxsXG4gICAgfVxuICB9XG5cbiAgZ2V0IG9uZXJyb3IgKCkge1xuICAgIHdlYmlkbC5icmFuZENoZWNrKHRoaXMsIFdlYlNvY2tldClcblxuICAgIHJldHVybiB0aGlzLiNldmVudHMuZXJyb3JcbiAgfVxuXG4gIHNldCBvbmVycm9yIChmbikge1xuICAgIHdlYmlkbC5icmFuZENoZWNrKHRoaXMsIFdlYlNvY2tldClcblxuICAgIGlmICh0aGlzLiNldmVudHMuZXJyb3IpIHtcbiAgICAgIHRoaXMucmVtb3ZlRXZlbnRMaXN0ZW5lcignZXJyb3InLCB0aGlzLiNldmVudHMuZXJyb3IpXG4gICAgfVxuXG4gICAgaWYgKHR5cGVvZiBmbiA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgdGhpcy4jZXZlbnRzLmVycm9yID0gZm5cbiAgICAgIHRoaXMuYWRkRXZlbnRMaXN0ZW5lcignZXJyb3InLCBmbilcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy4jZXZlbnRzLmVycm9yID0gbnVsbFxuICAgIH1cbiAgfVxuXG4gIGdldCBvbmNsb3NlICgpIHtcbiAgICB3ZWJpZGwuYnJhbmRDaGVjayh0aGlzLCBXZWJTb2NrZXQpXG5cbiAgICByZXR1cm4gdGhpcy4jZXZlbnRzLmNsb3NlXG4gIH1cblxuICBzZXQgb25jbG9zZSAoZm4pIHtcbiAgICB3ZWJpZGwuYnJhbmRDaGVjayh0aGlzLCBXZWJTb2NrZXQpXG5cbiAgICBpZiAodGhpcy4jZXZlbnRzLmNsb3NlKSB7XG4gICAgICB0aGlzLnJlbW92ZUV2ZW50TGlzdGVuZXIoJ2Nsb3NlJywgdGhpcy4jZXZlbnRzLmNsb3NlKVxuICAgIH1cblxuICAgIGlmICh0eXBlb2YgZm4gPT09ICdmdW5jdGlvbicpIHtcbiAgICAgIHRoaXMuI2V2ZW50cy5jbG9zZSA9IGZuXG4gICAgICB0aGlzLmFkZEV2ZW50TGlzdGVuZXIoJ2Nsb3NlJywgZm4pXG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMuI2V2ZW50cy5jbG9zZSA9IG51bGxcbiAgICB9XG4gIH1cblxuICBnZXQgb25tZXNzYWdlICgpIHtcbiAgICB3ZWJpZGwuYnJhbmRDaGVjayh0aGlzLCBXZWJTb2NrZXQpXG5cbiAgICByZXR1cm4gdGhpcy4jZXZlbnRzLm1lc3NhZ2VcbiAgfVxuXG4gIHNldCBvbm1lc3NhZ2UgKGZuKSB7XG4gICAgd2ViaWRsLmJyYW5kQ2hlY2sodGhpcywgV2ViU29ja2V0KVxuXG4gICAgaWYgKHRoaXMuI2V2ZW50cy5tZXNzYWdlKSB7XG4gICAgICB0aGlzLnJlbW92ZUV2ZW50TGlzdGVuZXIoJ21lc3NhZ2UnLCB0aGlzLiNldmVudHMubWVzc2FnZSlcbiAgICB9XG5cbiAgICBpZiAodHlwZW9mIGZuID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICB0aGlzLiNldmVudHMubWVzc2FnZSA9IGZuXG4gICAgICB0aGlzLmFkZEV2ZW50TGlzdGVuZXIoJ21lc3NhZ2UnLCBmbilcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy4jZXZlbnRzLm1lc3NhZ2UgPSBudWxsXG4gICAgfVxuICB9XG5cbiAgZ2V0IGJpbmFyeVR5cGUgKCkge1xuICAgIHdlYmlkbC5icmFuZENoZWNrKHRoaXMsIFdlYlNvY2tldClcblxuICAgIHJldHVybiB0aGlzW2tCaW5hcnlUeXBlXVxuICB9XG5cbiAgc2V0IGJpbmFyeVR5cGUgKHR5cGUpIHtcbiAgICB3ZWJpZGwuYnJhbmRDaGVjayh0aGlzLCBXZWJTb2NrZXQpXG5cbiAgICBpZiAodHlwZSAhPT0gJ2Jsb2InICYmIHR5cGUgIT09ICdhcnJheWJ1ZmZlcicpIHtcbiAgICAgIHRoaXNba0JpbmFyeVR5cGVdID0gJ2Jsb2InXG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXNba0JpbmFyeVR5cGVdID0gdHlwZVxuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBAc2VlIGh0dHBzOi8vd2Vic29ja2V0cy5zcGVjLndoYXR3Zy5vcmcvI2ZlZWRiYWNrLWZyb20tdGhlLXByb3RvY29sXG4gICAqL1xuICAjb25Db25uZWN0aW9uRXN0YWJsaXNoZWQgKHJlc3BvbnNlKSB7XG4gICAgLy8gcHJvY2Vzc1Jlc3BvbnNlIGlzIGNhbGxlZCB3aGVuIHRoZSBcInJlc3BvbnNl4oCZcyBoZWFkZXIgbGlzdCBoYXMgYmVlbiByZWNlaXZlZCBhbmQgaW5pdGlhbGl6ZWQuXCJcbiAgICAvLyBvbmNlIHRoaXMgaGFwcGVucywgdGhlIGNvbm5lY3Rpb24gaXMgb3BlblxuICAgIHRoaXNba1Jlc3BvbnNlXSA9IHJlc3BvbnNlXG5cbiAgICBjb25zdCBwYXJzZXIgPSBuZXcgQnl0ZVBhcnNlcih0aGlzKVxuICAgIHBhcnNlci5vbignZHJhaW4nLCBmdW5jdGlvbiBvblBhcnNlckRyYWluICgpIHtcbiAgICAgIHRoaXMud3Nba1Jlc3BvbnNlXS5zb2NrZXQucmVzdW1lKClcbiAgICB9KVxuXG4gICAgcmVzcG9uc2Uuc29ja2V0LndzID0gdGhpc1xuICAgIHRoaXNba0J5dGVQYXJzZXJdID0gcGFyc2VyXG5cbiAgICAvLyAxLiBDaGFuZ2UgdGhlIHJlYWR5IHN0YXRlIHRvIE9QRU4gKDEpLlxuICAgIHRoaXNba1JlYWR5U3RhdGVdID0gc3RhdGVzLk9QRU5cblxuICAgIC8vIDIuIENoYW5nZSB0aGUgZXh0ZW5zaW9ucyBhdHRyaWJ1dGXigJlzIHZhbHVlIHRvIHRoZSBleHRlbnNpb25zIGluIHVzZSwgaWZcbiAgICAvLyAgICBpdCBpcyBub3QgdGhlIG51bGwgdmFsdWUuXG4gICAgLy8gaHR0cHM6Ly9kYXRhdHJhY2tlci5pZXRmLm9yZy9kb2MvaHRtbC9yZmM2NDU1I3NlY3Rpb24tOS4xXG4gICAgY29uc3QgZXh0ZW5zaW9ucyA9IHJlc3BvbnNlLmhlYWRlcnNMaXN0LmdldCgnc2VjLXdlYnNvY2tldC1leHRlbnNpb25zJylcblxuICAgIGlmIChleHRlbnNpb25zICE9PSBudWxsKSB7XG4gICAgICB0aGlzLiNleHRlbnNpb25zID0gZXh0ZW5zaW9uc1xuICAgIH1cblxuICAgIC8vIDMuIENoYW5nZSB0aGUgcHJvdG9jb2wgYXR0cmlidXRl4oCZcyB2YWx1ZSB0byB0aGUgc3VicHJvdG9jb2wgaW4gdXNlLCBpZlxuICAgIC8vICAgIGl0IGlzIG5vdCB0aGUgbnVsbCB2YWx1ZS5cbiAgICAvLyBodHRwczovL2RhdGF0cmFja2VyLmlldGYub3JnL2RvYy9odG1sL3JmYzY0NTUjc2VjdGlvbi0xLjlcbiAgICBjb25zdCBwcm90b2NvbCA9IHJlc3BvbnNlLmhlYWRlcnNMaXN0LmdldCgnc2VjLXdlYnNvY2tldC1wcm90b2NvbCcpXG5cbiAgICBpZiAocHJvdG9jb2wgIT09IG51bGwpIHtcbiAgICAgIHRoaXMuI3Byb3RvY29sID0gcHJvdG9jb2xcbiAgICB9XG5cbiAgICAvLyA0LiBGaXJlIGFuIGV2ZW50IG5hbWVkIG9wZW4gYXQgdGhlIFdlYlNvY2tldCBvYmplY3QuXG4gICAgZmlyZUV2ZW50KCdvcGVuJywgdGhpcylcbiAgfVxufVxuXG4vLyBodHRwczovL3dlYnNvY2tldHMuc3BlYy53aGF0d2cub3JnLyNkb20td2Vic29ja2V0LWNvbm5lY3RpbmdcbldlYlNvY2tldC5DT05ORUNUSU5HID0gV2ViU29ja2V0LnByb3RvdHlwZS5DT05ORUNUSU5HID0gc3RhdGVzLkNPTk5FQ1RJTkdcbi8vIGh0dHBzOi8vd2Vic29ja2V0cy5zcGVjLndoYXR3Zy5vcmcvI2RvbS13ZWJzb2NrZXQtb3BlblxuV2ViU29ja2V0Lk9QRU4gPSBXZWJTb2NrZXQucHJvdG90eXBlLk9QRU4gPSBzdGF0ZXMuT1BFTlxuLy8gaHR0cHM6Ly93ZWJzb2NrZXRzLnNwZWMud2hhdHdnLm9yZy8jZG9tLXdlYnNvY2tldC1jbG9zaW5nXG5XZWJTb2NrZXQuQ0xPU0lORyA9IFdlYlNvY2tldC5wcm90b3R5cGUuQ0xPU0lORyA9IHN0YXRlcy5DTE9TSU5HXG4vLyBodHRwczovL3dlYnNvY2tldHMuc3BlYy53aGF0d2cub3JnLyNkb20td2Vic29ja2V0LWNsb3NlZFxuV2ViU29ja2V0LkNMT1NFRCA9IFdlYlNvY2tldC5wcm90b3R5cGUuQ0xPU0VEID0gc3RhdGVzLkNMT1NFRFxuXG5PYmplY3QuZGVmaW5lUHJvcGVydGllcyhXZWJTb2NrZXQucHJvdG90eXBlLCB7XG4gIENPTk5FQ1RJTkc6IHN0YXRpY1Byb3BlcnR5RGVzY3JpcHRvcnMsXG4gIE9QRU46IHN0YXRpY1Byb3BlcnR5RGVzY3JpcHRvcnMsXG4gIENMT1NJTkc6IHN0YXRpY1Byb3BlcnR5RGVzY3JpcHRvcnMsXG4gIENMT1NFRDogc3RhdGljUHJvcGVydHlEZXNjcmlwdG9ycyxcbiAgdXJsOiBrRW51bWVyYWJsZVByb3BlcnR5LFxuICByZWFkeVN0YXRlOiBrRW51bWVyYWJsZVByb3BlcnR5LFxuICBidWZmZXJlZEFtb3VudDoga0VudW1lcmFibGVQcm9wZXJ0eSxcbiAgb25vcGVuOiBrRW51bWVyYWJsZVByb3BlcnR5LFxuICBvbmVycm9yOiBrRW51bWVyYWJsZVByb3BlcnR5LFxuICBvbmNsb3NlOiBrRW51bWVyYWJsZVByb3BlcnR5LFxuICBjbG9zZToga0VudW1lcmFibGVQcm9wZXJ0eSxcbiAgb25tZXNzYWdlOiBrRW51bWVyYWJsZVByb3BlcnR5LFxuICBiaW5hcnlUeXBlOiBrRW51bWVyYWJsZVByb3BlcnR5LFxuICBzZW5kOiBrRW51bWVyYWJsZVByb3BlcnR5LFxuICBleHRlbnNpb25zOiBrRW51bWVyYWJsZVByb3BlcnR5LFxuICBwcm90b2NvbDoga0VudW1lcmFibGVQcm9wZXJ0eSxcbiAgW1N5bWJvbC50b1N0cmluZ1RhZ106IHtcbiAgICB2YWx1ZTogJ1dlYlNvY2tldCcsXG4gICAgd3JpdGFibGU6IGZhbHNlLFxuICAgIGVudW1lcmFibGU6IGZhbHNlLFxuICAgIGNvbmZpZ3VyYWJsZTogdHJ1ZVxuICB9XG59KVxuXG5PYmplY3QuZGVmaW5lUHJvcGVydGllcyhXZWJTb2NrZXQsIHtcbiAgQ09OTkVDVElORzogc3RhdGljUHJvcGVydHlEZXNjcmlwdG9ycyxcbiAgT1BFTjogc3RhdGljUHJvcGVydHlEZXNjcmlwdG9ycyxcbiAgQ0xPU0lORzogc3RhdGljUHJvcGVydHlEZXNjcmlwdG9ycyxcbiAgQ0xPU0VEOiBzdGF0aWNQcm9wZXJ0eURlc2NyaXB0b3JzXG59KVxuXG53ZWJpZGwuY29udmVydGVyc1snc2VxdWVuY2U8RE9NU3RyaW5nPiddID0gd2ViaWRsLnNlcXVlbmNlQ29udmVydGVyKFxuICB3ZWJpZGwuY29udmVydGVycy5ET01TdHJpbmdcbilcblxud2ViaWRsLmNvbnZlcnRlcnNbJ0RPTVN0cmluZyBvciBzZXF1ZW5jZTxET01TdHJpbmc+J10gPSBmdW5jdGlvbiAoVikge1xuICBpZiAod2ViaWRsLnV0aWwuVHlwZShWKSA9PT0gJ09iamVjdCcgJiYgU3ltYm9sLml0ZXJhdG9yIGluIFYpIHtcbiAgICByZXR1cm4gd2ViaWRsLmNvbnZlcnRlcnNbJ3NlcXVlbmNlPERPTVN0cmluZz4nXShWKVxuICB9XG5cbiAgcmV0dXJuIHdlYmlkbC5jb252ZXJ0ZXJzLkRPTVN0cmluZyhWKVxufVxuXG4vLyBUaGlzIGltcGxlbWVudHMgdGhlIHByb3BzYWwgbWFkZSBpbiBodHRwczovL2dpdGh1Yi5jb20vd2hhdHdnL3dlYnNvY2tldHMvaXNzdWVzLzQyXG53ZWJpZGwuY29udmVydGVycy5XZWJTb2NrZXRJbml0ID0gd2ViaWRsLmRpY3Rpb25hcnlDb252ZXJ0ZXIoW1xuICB7XG4gICAga2V5OiAncHJvdG9jb2xzJyxcbiAgICBjb252ZXJ0ZXI6IHdlYmlkbC5jb252ZXJ0ZXJzWydET01TdHJpbmcgb3Igc2VxdWVuY2U8RE9NU3RyaW5nPiddLFxuICAgIGdldCBkZWZhdWx0VmFsdWUgKCkge1xuICAgICAgcmV0dXJuIFtdXG4gICAgfVxuICB9LFxuICB7XG4gICAga2V5OiAnZGlzcGF0Y2hlcicsXG4gICAgY29udmVydGVyOiAoVikgPT4gVixcbiAgICBnZXQgZGVmYXVsdFZhbHVlICgpIHtcbiAgICAgIHJldHVybiBnZXRHbG9iYWxEaXNwYXRjaGVyKClcbiAgICB9XG4gIH0sXG4gIHtcbiAgICBrZXk6ICdoZWFkZXJzJyxcbiAgICBjb252ZXJ0ZXI6IHdlYmlkbC5udWxsYWJsZUNvbnZlcnRlcih3ZWJpZGwuY29udmVydGVycy5IZWFkZXJzSW5pdClcbiAgfVxuXSlcblxud2ViaWRsLmNvbnZlcnRlcnNbJ0RPTVN0cmluZyBvciBzZXF1ZW5jZTxET01TdHJpbmc+IG9yIFdlYlNvY2tldEluaXQnXSA9IGZ1bmN0aW9uIChWKSB7XG4gIGlmICh3ZWJpZGwudXRpbC5UeXBlKFYpID09PSAnT2JqZWN0JyAmJiAhKFN5bWJvbC5pdGVyYXRvciBpbiBWKSkge1xuICAgIHJldHVybiB3ZWJpZGwuY29udmVydGVycy5XZWJTb2NrZXRJbml0KFYpXG4gIH1cblxuICByZXR1cm4geyBwcm90b2NvbHM6IHdlYmlkbC5jb252ZXJ0ZXJzWydET01TdHJpbmcgb3Igc2VxdWVuY2U8RE9NU3RyaW5nPiddKFYpIH1cbn1cblxud2ViaWRsLmNvbnZlcnRlcnMuV2ViU29ja2V0U2VuZERhdGEgPSBmdW5jdGlvbiAoVikge1xuICBpZiAod2ViaWRsLnV0aWwuVHlwZShWKSA9PT0gJ09iamVjdCcpIHtcbiAgICBpZiAoaXNCbG9iTGlrZShWKSkge1xuICAgICAgcmV0dXJuIHdlYmlkbC5jb252ZXJ0ZXJzLkJsb2IoViwgeyBzdHJpY3Q6IGZhbHNlIH0pXG4gICAgfVxuXG4gICAgaWYgKEFycmF5QnVmZmVyLmlzVmlldyhWKSB8fCB0eXBlcy5pc0FueUFycmF5QnVmZmVyKFYpKSB7XG4gICAgICByZXR1cm4gd2ViaWRsLmNvbnZlcnRlcnMuQnVmZmVyU291cmNlKFYpXG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIHdlYmlkbC5jb252ZXJ0ZXJzLlVTVlN0cmluZyhWKVxufVxuXG5tb2R1bGUuZXhwb3J0cyA9IHtcbiAgV2ViU29ja2V0XG59XG4iLAogICAgIid1c2Ugc3RyaWN0J1xuXG5jb25zdCBDbGllbnQgPSByZXF1aXJlKCcuL2xpYi9jbGllbnQnKVxuY29uc3QgRGlzcGF0Y2hlciA9IHJlcXVpcmUoJy4vbGliL2Rpc3BhdGNoZXInKVxuY29uc3QgZXJyb3JzID0gcmVxdWlyZSgnLi9saWIvY29yZS9lcnJvcnMnKVxuY29uc3QgUG9vbCA9IHJlcXVpcmUoJy4vbGliL3Bvb2wnKVxuY29uc3QgQmFsYW5jZWRQb29sID0gcmVxdWlyZSgnLi9saWIvYmFsYW5jZWQtcG9vbCcpXG5jb25zdCBBZ2VudCA9IHJlcXVpcmUoJy4vbGliL2FnZW50JylcbmNvbnN0IHV0aWwgPSByZXF1aXJlKCcuL2xpYi9jb3JlL3V0aWwnKVxuY29uc3QgeyBJbnZhbGlkQXJndW1lbnRFcnJvciB9ID0gZXJyb3JzXG5jb25zdCBhcGkgPSByZXF1aXJlKCcuL2xpYi9hcGknKVxuY29uc3QgYnVpbGRDb25uZWN0b3IgPSByZXF1aXJlKCcuL2xpYi9jb3JlL2Nvbm5lY3QnKVxuY29uc3QgTW9ja0NsaWVudCA9IHJlcXVpcmUoJy4vbGliL21vY2svbW9jay1jbGllbnQnKVxuY29uc3QgTW9ja0FnZW50ID0gcmVxdWlyZSgnLi9saWIvbW9jay9tb2NrLWFnZW50JylcbmNvbnN0IE1vY2tQb29sID0gcmVxdWlyZSgnLi9saWIvbW9jay9tb2NrLXBvb2wnKVxuY29uc3QgbW9ja0Vycm9ycyA9IHJlcXVpcmUoJy4vbGliL21vY2svbW9jay1lcnJvcnMnKVxuY29uc3QgUHJveHlBZ2VudCA9IHJlcXVpcmUoJy4vbGliL3Byb3h5LWFnZW50JylcbmNvbnN0IFJldHJ5SGFuZGxlciA9IHJlcXVpcmUoJy4vbGliL2hhbmRsZXIvUmV0cnlIYW5kbGVyJylcbmNvbnN0IHsgZ2V0R2xvYmFsRGlzcGF0Y2hlciwgc2V0R2xvYmFsRGlzcGF0Y2hlciB9ID0gcmVxdWlyZSgnLi9saWIvZ2xvYmFsJylcbmNvbnN0IERlY29yYXRvckhhbmRsZXIgPSByZXF1aXJlKCcuL2xpYi9oYW5kbGVyL0RlY29yYXRvckhhbmRsZXInKVxuY29uc3QgUmVkaXJlY3RIYW5kbGVyID0gcmVxdWlyZSgnLi9saWIvaGFuZGxlci9SZWRpcmVjdEhhbmRsZXInKVxuY29uc3QgY3JlYXRlUmVkaXJlY3RJbnRlcmNlcHRvciA9IHJlcXVpcmUoJy4vbGliL2ludGVyY2VwdG9yL3JlZGlyZWN0SW50ZXJjZXB0b3InKVxuXG5sZXQgaGFzQ3J5cHRvXG50cnkge1xuICByZXF1aXJlKCdjcnlwdG8nKVxuICBoYXNDcnlwdG8gPSB0cnVlXG59IGNhdGNoIHtcbiAgaGFzQ3J5cHRvID0gZmFsc2Vcbn1cblxuT2JqZWN0LmFzc2lnbihEaXNwYXRjaGVyLnByb3RvdHlwZSwgYXBpKVxuXG5tb2R1bGUuZXhwb3J0cy5EaXNwYXRjaGVyID0gRGlzcGF0Y2hlclxubW9kdWxlLmV4cG9ydHMuQ2xpZW50ID0gQ2xpZW50XG5tb2R1bGUuZXhwb3J0cy5Qb29sID0gUG9vbFxubW9kdWxlLmV4cG9ydHMuQmFsYW5jZWRQb29sID0gQmFsYW5jZWRQb29sXG5tb2R1bGUuZXhwb3J0cy5BZ2VudCA9IEFnZW50XG5tb2R1bGUuZXhwb3J0cy5Qcm94eUFnZW50ID0gUHJveHlBZ2VudFxubW9kdWxlLmV4cG9ydHMuUmV0cnlIYW5kbGVyID0gUmV0cnlIYW5kbGVyXG5cbm1vZHVsZS5leHBvcnRzLkRlY29yYXRvckhhbmRsZXIgPSBEZWNvcmF0b3JIYW5kbGVyXG5tb2R1bGUuZXhwb3J0cy5SZWRpcmVjdEhhbmRsZXIgPSBSZWRpcmVjdEhhbmRsZXJcbm1vZHVsZS5leHBvcnRzLmNyZWF0ZVJlZGlyZWN0SW50ZXJjZXB0b3IgPSBjcmVhdGVSZWRpcmVjdEludGVyY2VwdG9yXG5cbm1vZHVsZS5leHBvcnRzLmJ1aWxkQ29ubmVjdG9yID0gYnVpbGRDb25uZWN0b3Jcbm1vZHVsZS5leHBvcnRzLmVycm9ycyA9IGVycm9yc1xuXG5mdW5jdGlvbiBtYWtlRGlzcGF0Y2hlciAoZm4pIHtcbiAgcmV0dXJuICh1cmwsIG9wdHMsIGhhbmRsZXIpID0+IHtcbiAgICBpZiAodHlwZW9mIG9wdHMgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgIGhhbmRsZXIgPSBvcHRzXG4gICAgICBvcHRzID0gbnVsbFxuICAgIH1cblxuICAgIGlmICghdXJsIHx8ICh0eXBlb2YgdXJsICE9PSAnc3RyaW5nJyAmJiB0eXBlb2YgdXJsICE9PSAnb2JqZWN0JyAmJiAhKHVybCBpbnN0YW5jZW9mIFVSTCkpKSB7XG4gICAgICB0aHJvdyBuZXcgSW52YWxpZEFyZ3VtZW50RXJyb3IoJ2ludmFsaWQgdXJsJylcbiAgICB9XG5cbiAgICBpZiAob3B0cyAhPSBudWxsICYmIHR5cGVvZiBvcHRzICE9PSAnb2JqZWN0Jykge1xuICAgICAgdGhyb3cgbmV3IEludmFsaWRBcmd1bWVudEVycm9yKCdpbnZhbGlkIG9wdHMnKVxuICAgIH1cblxuICAgIGlmIChvcHRzICYmIG9wdHMucGF0aCAhPSBudWxsKSB7XG4gICAgICBpZiAodHlwZW9mIG9wdHMucGF0aCAhPT0gJ3N0cmluZycpIHtcbiAgICAgICAgdGhyb3cgbmV3IEludmFsaWRBcmd1bWVudEVycm9yKCdpbnZhbGlkIG9wdHMucGF0aCcpXG4gICAgICB9XG5cbiAgICAgIGxldCBwYXRoID0gb3B0cy5wYXRoXG4gICAgICBpZiAoIW9wdHMucGF0aC5zdGFydHNXaXRoKCcvJykpIHtcbiAgICAgICAgcGF0aCA9IGAvJHtwYXRofWBcbiAgICAgIH1cblxuICAgICAgdXJsID0gbmV3IFVSTCh1dGlsLnBhcnNlT3JpZ2luKHVybCkub3JpZ2luICsgcGF0aClcbiAgICB9IGVsc2Uge1xuICAgICAgaWYgKCFvcHRzKSB7XG4gICAgICAgIG9wdHMgPSB0eXBlb2YgdXJsID09PSAnb2JqZWN0JyA/IHVybCA6IHt9XG4gICAgICB9XG5cbiAgICAgIHVybCA9IHV0aWwucGFyc2VVUkwodXJsKVxuICAgIH1cblxuICAgIGNvbnN0IHsgYWdlbnQsIGRpc3BhdGNoZXIgPSBnZXRHbG9iYWxEaXNwYXRjaGVyKCkgfSA9IG9wdHNcblxuICAgIGlmIChhZ2VudCkge1xuICAgICAgdGhyb3cgbmV3IEludmFsaWRBcmd1bWVudEVycm9yKCd1bnN1cHBvcnRlZCBvcHRzLmFnZW50LiBEaWQgeW91IG1lYW4gb3B0cy5jbGllbnQ/JylcbiAgICB9XG5cbiAgICByZXR1cm4gZm4uY2FsbChkaXNwYXRjaGVyLCB7XG4gICAgICAuLi5vcHRzLFxuICAgICAgb3JpZ2luOiB1cmwub3JpZ2luLFxuICAgICAgcGF0aDogdXJsLnNlYXJjaCA/IGAke3VybC5wYXRobmFtZX0ke3VybC5zZWFyY2h9YCA6IHVybC5wYXRobmFtZSxcbiAgICAgIG1ldGhvZDogb3B0cy5tZXRob2QgfHwgKG9wdHMuYm9keSA/ICdQVVQnIDogJ0dFVCcpXG4gICAgfSwgaGFuZGxlcilcbiAgfVxufVxuXG5tb2R1bGUuZXhwb3J0cy5zZXRHbG9iYWxEaXNwYXRjaGVyID0gc2V0R2xvYmFsRGlzcGF0Y2hlclxubW9kdWxlLmV4cG9ydHMuZ2V0R2xvYmFsRGlzcGF0Y2hlciA9IGdldEdsb2JhbERpc3BhdGNoZXJcblxuaWYgKHV0aWwubm9kZU1ham9yID4gMTYgfHwgKHV0aWwubm9kZU1ham9yID09PSAxNiAmJiB1dGlsLm5vZGVNaW5vciA+PSA4KSkge1xuICBsZXQgZmV0Y2hJbXBsID0gbnVsbFxuICBtb2R1bGUuZXhwb3J0cy5mZXRjaCA9IGFzeW5jIGZ1bmN0aW9uIGZldGNoIChyZXNvdXJjZSkge1xuICAgIGlmICghZmV0Y2hJbXBsKSB7XG4gICAgICBmZXRjaEltcGwgPSByZXF1aXJlKCcuL2xpYi9mZXRjaCcpLmZldGNoXG4gICAgfVxuXG4gICAgdHJ5IHtcbiAgICAgIHJldHVybiBhd2FpdCBmZXRjaEltcGwoLi4uYXJndW1lbnRzKVxuICAgIH0gY2F0Y2ggKGVycikge1xuICAgICAgaWYgKHR5cGVvZiBlcnIgPT09ICdvYmplY3QnKSB7XG4gICAgICAgIEVycm9yLmNhcHR1cmVTdGFja1RyYWNlKGVyciwgdGhpcylcbiAgICAgIH1cblxuICAgICAgdGhyb3cgZXJyXG4gICAgfVxuICB9XG4gIG1vZHVsZS5leHBvcnRzLkhlYWRlcnMgPSByZXF1aXJlKCcuL2xpYi9mZXRjaC9oZWFkZXJzJykuSGVhZGVyc1xuICBtb2R1bGUuZXhwb3J0cy5SZXNwb25zZSA9IHJlcXVpcmUoJy4vbGliL2ZldGNoL3Jlc3BvbnNlJykuUmVzcG9uc2VcbiAgbW9kdWxlLmV4cG9ydHMuUmVxdWVzdCA9IHJlcXVpcmUoJy4vbGliL2ZldGNoL3JlcXVlc3QnKS5SZXF1ZXN0XG4gIG1vZHVsZS5leHBvcnRzLkZvcm1EYXRhID0gcmVxdWlyZSgnLi9saWIvZmV0Y2gvZm9ybWRhdGEnKS5Gb3JtRGF0YVxuICBtb2R1bGUuZXhwb3J0cy5GaWxlID0gcmVxdWlyZSgnLi9saWIvZmV0Y2gvZmlsZScpLkZpbGVcbiAgbW9kdWxlLmV4cG9ydHMuRmlsZVJlYWRlciA9IHJlcXVpcmUoJy4vbGliL2ZpbGVhcGkvZmlsZXJlYWRlcicpLkZpbGVSZWFkZXJcblxuICBjb25zdCB7IHNldEdsb2JhbE9yaWdpbiwgZ2V0R2xvYmFsT3JpZ2luIH0gPSByZXF1aXJlKCcuL2xpYi9mZXRjaC9nbG9iYWwnKVxuXG4gIG1vZHVsZS5leHBvcnRzLnNldEdsb2JhbE9yaWdpbiA9IHNldEdsb2JhbE9yaWdpblxuICBtb2R1bGUuZXhwb3J0cy5nZXRHbG9iYWxPcmlnaW4gPSBnZXRHbG9iYWxPcmlnaW5cblxuICBjb25zdCB7IENhY2hlU3RvcmFnZSB9ID0gcmVxdWlyZSgnLi9saWIvY2FjaGUvY2FjaGVzdG9yYWdlJylcbiAgY29uc3QgeyBrQ29uc3RydWN0IH0gPSByZXF1aXJlKCcuL2xpYi9jYWNoZS9zeW1ib2xzJylcblxuICAvLyBDYWNoZSAmIENhY2hlU3RvcmFnZSBhcmUgdGlnaHRseSBjb3VwbGVkIHdpdGggZmV0Y2guIEV2ZW4gaWYgaXQgbWF5IHJ1blxuICAvLyBpbiBhbiBvbGRlciB2ZXJzaW9uIG9mIE5vZGUsIGl0IGRvZXNuJ3QgaGF2ZSBhbnkgdXNlIHdpdGhvdXQgZmV0Y2guXG4gIG1vZHVsZS5leHBvcnRzLmNhY2hlcyA9IG5ldyBDYWNoZVN0b3JhZ2Uoa0NvbnN0cnVjdClcbn1cblxuaWYgKHV0aWwubm9kZU1ham9yID49IDE2KSB7XG4gIGNvbnN0IHsgZGVsZXRlQ29va2llLCBnZXRDb29raWVzLCBnZXRTZXRDb29raWVzLCBzZXRDb29raWUgfSA9IHJlcXVpcmUoJy4vbGliL2Nvb2tpZXMnKVxuXG4gIG1vZHVsZS5leHBvcnRzLmRlbGV0ZUNvb2tpZSA9IGRlbGV0ZUNvb2tpZVxuICBtb2R1bGUuZXhwb3J0cy5nZXRDb29raWVzID0gZ2V0Q29va2llc1xuICBtb2R1bGUuZXhwb3J0cy5nZXRTZXRDb29raWVzID0gZ2V0U2V0Q29va2llc1xuICBtb2R1bGUuZXhwb3J0cy5zZXRDb29raWUgPSBzZXRDb29raWVcblxuICBjb25zdCB7IHBhcnNlTUlNRVR5cGUsIHNlcmlhbGl6ZUFNaW1lVHlwZSB9ID0gcmVxdWlyZSgnLi9saWIvZmV0Y2gvZGF0YVVSTCcpXG5cbiAgbW9kdWxlLmV4cG9ydHMucGFyc2VNSU1FVHlwZSA9IHBhcnNlTUlNRVR5cGVcbiAgbW9kdWxlLmV4cG9ydHMuc2VyaWFsaXplQU1pbWVUeXBlID0gc2VyaWFsaXplQU1pbWVUeXBlXG59XG5cbmlmICh1dGlsLm5vZGVNYWpvciA+PSAxOCAmJiBoYXNDcnlwdG8pIHtcbiAgY29uc3QgeyBXZWJTb2NrZXQgfSA9IHJlcXVpcmUoJy4vbGliL3dlYnNvY2tldC93ZWJzb2NrZXQnKVxuXG4gIG1vZHVsZS5leHBvcnRzLldlYlNvY2tldCA9IFdlYlNvY2tldFxufVxuXG5tb2R1bGUuZXhwb3J0cy5yZXF1ZXN0ID0gbWFrZURpc3BhdGNoZXIoYXBpLnJlcXVlc3QpXG5tb2R1bGUuZXhwb3J0cy5zdHJlYW0gPSBtYWtlRGlzcGF0Y2hlcihhcGkuc3RyZWFtKVxubW9kdWxlLmV4cG9ydHMucGlwZWxpbmUgPSBtYWtlRGlzcGF0Y2hlcihhcGkucGlwZWxpbmUpXG5tb2R1bGUuZXhwb3J0cy5jb25uZWN0ID0gbWFrZURpc3BhdGNoZXIoYXBpLmNvbm5lY3QpXG5tb2R1bGUuZXhwb3J0cy51cGdyYWRlID0gbWFrZURpc3BhdGNoZXIoYXBpLnVwZ3JhZGUpXG5cbm1vZHVsZS5leHBvcnRzLk1vY2tDbGllbnQgPSBNb2NrQ2xpZW50XG5tb2R1bGUuZXhwb3J0cy5Nb2NrUG9vbCA9IE1vY2tQb29sXG5tb2R1bGUuZXhwb3J0cy5Nb2NrQWdlbnQgPSBNb2NrQWdlbnRcbm1vZHVsZS5leHBvcnRzLm1vY2tFcnJvcnMgPSBtb2NrRXJyb3JzXG4iLAogICAgIlwidXNlIHN0cmljdFwiO1xuLyogZXNsaW50LWRpc2FibGUgQHR5cGVzY3JpcHQtZXNsaW50L25vLWV4cGxpY2l0LWFueSAqL1xudmFyIF9fY3JlYXRlQmluZGluZyA9ICh0aGlzICYmIHRoaXMuX19jcmVhdGVCaW5kaW5nKSB8fCAoT2JqZWN0LmNyZWF0ZSA/IChmdW5jdGlvbihvLCBtLCBrLCBrMikge1xuICAgIGlmIChrMiA9PT0gdW5kZWZpbmVkKSBrMiA9IGs7XG4gICAgdmFyIGRlc2MgPSBPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKG0sIGspO1xuICAgIGlmICghZGVzYyB8fCAoXCJnZXRcIiBpbiBkZXNjID8gIW0uX19lc01vZHVsZSA6IGRlc2Mud3JpdGFibGUgfHwgZGVzYy5jb25maWd1cmFibGUpKSB7XG4gICAgICBkZXNjID0geyBlbnVtZXJhYmxlOiB0cnVlLCBnZXQ6IGZ1bmN0aW9uKCkgeyByZXR1cm4gbVtrXTsgfSB9O1xuICAgIH1cbiAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkobywgazIsIGRlc2MpO1xufSkgOiAoZnVuY3Rpb24obywgbSwgaywgazIpIHtcbiAgICBpZiAoazIgPT09IHVuZGVmaW5lZCkgazIgPSBrO1xuICAgIG9bazJdID0gbVtrXTtcbn0pKTtcbnZhciBfX3NldE1vZHVsZURlZmF1bHQgPSAodGhpcyAmJiB0aGlzLl9fc2V0TW9kdWxlRGVmYXVsdCkgfHwgKE9iamVjdC5jcmVhdGUgPyAoZnVuY3Rpb24obywgdikge1xuICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShvLCBcImRlZmF1bHRcIiwgeyBlbnVtZXJhYmxlOiB0cnVlLCB2YWx1ZTogdiB9KTtcbn0pIDogZnVuY3Rpb24obywgdikge1xuICAgIG9bXCJkZWZhdWx0XCJdID0gdjtcbn0pO1xudmFyIF9faW1wb3J0U3RhciA9ICh0aGlzICYmIHRoaXMuX19pbXBvcnRTdGFyKSB8fCBmdW5jdGlvbiAobW9kKSB7XG4gICAgaWYgKG1vZCAmJiBtb2QuX19lc01vZHVsZSkgcmV0dXJuIG1vZDtcbiAgICB2YXIgcmVzdWx0ID0ge307XG4gICAgaWYgKG1vZCAhPSBudWxsKSBmb3IgKHZhciBrIGluIG1vZCkgaWYgKGsgIT09IFwiZGVmYXVsdFwiICYmIE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChtb2QsIGspKSBfX2NyZWF0ZUJpbmRpbmcocmVzdWx0LCBtb2QsIGspO1xuICAgIF9fc2V0TW9kdWxlRGVmYXVsdChyZXN1bHQsIG1vZCk7XG4gICAgcmV0dXJuIHJlc3VsdDtcbn07XG52YXIgX19hd2FpdGVyID0gKHRoaXMgJiYgdGhpcy5fX2F3YWl0ZXIpIHx8IGZ1bmN0aW9uICh0aGlzQXJnLCBfYXJndW1lbnRzLCBQLCBnZW5lcmF0b3IpIHtcbiAgICBmdW5jdGlvbiBhZG9wdCh2YWx1ZSkgeyByZXR1cm4gdmFsdWUgaW5zdGFuY2VvZiBQID8gdmFsdWUgOiBuZXcgUChmdW5jdGlvbiAocmVzb2x2ZSkgeyByZXNvbHZlKHZhbHVlKTsgfSk7IH1cbiAgICByZXR1cm4gbmV3IChQIHx8IChQID0gUHJvbWlzZSkpKGZ1bmN0aW9uIChyZXNvbHZlLCByZWplY3QpIHtcbiAgICAgICAgZnVuY3Rpb24gZnVsZmlsbGVkKHZhbHVlKSB7IHRyeSB7IHN0ZXAoZ2VuZXJhdG9yLm5leHQodmFsdWUpKTsgfSBjYXRjaCAoZSkgeyByZWplY3QoZSk7IH0gfVxuICAgICAgICBmdW5jdGlvbiByZWplY3RlZCh2YWx1ZSkgeyB0cnkgeyBzdGVwKGdlbmVyYXRvcltcInRocm93XCJdKHZhbHVlKSk7IH0gY2F0Y2ggKGUpIHsgcmVqZWN0KGUpOyB9IH1cbiAgICAgICAgZnVuY3Rpb24gc3RlcChyZXN1bHQpIHsgcmVzdWx0LmRvbmUgPyByZXNvbHZlKHJlc3VsdC52YWx1ZSkgOiBhZG9wdChyZXN1bHQudmFsdWUpLnRoZW4oZnVsZmlsbGVkLCByZWplY3RlZCk7IH1cbiAgICAgICAgc3RlcCgoZ2VuZXJhdG9yID0gZ2VuZXJhdG9yLmFwcGx5KHRoaXNBcmcsIF9hcmd1bWVudHMgfHwgW10pKS5uZXh0KCkpO1xuICAgIH0pO1xufTtcbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIl9fZXNNb2R1bGVcIiwgeyB2YWx1ZTogdHJ1ZSB9KTtcbmV4cG9ydHMuSHR0cENsaWVudCA9IGV4cG9ydHMuaXNIdHRwcyA9IGV4cG9ydHMuSHR0cENsaWVudFJlc3BvbnNlID0gZXhwb3J0cy5IdHRwQ2xpZW50RXJyb3IgPSBleHBvcnRzLmdldFByb3h5VXJsID0gZXhwb3J0cy5NZWRpYVR5cGVzID0gZXhwb3J0cy5IZWFkZXJzID0gZXhwb3J0cy5IdHRwQ29kZXMgPSB2b2lkIDA7XG5jb25zdCBodHRwID0gX19pbXBvcnRTdGFyKHJlcXVpcmUoXCJodHRwXCIpKTtcbmNvbnN0IGh0dHBzID0gX19pbXBvcnRTdGFyKHJlcXVpcmUoXCJodHRwc1wiKSk7XG5jb25zdCBwbSA9IF9faW1wb3J0U3RhcihyZXF1aXJlKFwiLi9wcm94eVwiKSk7XG5jb25zdCB0dW5uZWwgPSBfX2ltcG9ydFN0YXIocmVxdWlyZShcInR1bm5lbFwiKSk7XG5jb25zdCB1bmRpY2lfMSA9IHJlcXVpcmUoXCJ1bmRpY2lcIik7XG52YXIgSHR0cENvZGVzO1xuKGZ1bmN0aW9uIChIdHRwQ29kZXMpIHtcbiAgICBIdHRwQ29kZXNbSHR0cENvZGVzW1wiT0tcIl0gPSAyMDBdID0gXCJPS1wiO1xuICAgIEh0dHBDb2Rlc1tIdHRwQ29kZXNbXCJNdWx0aXBsZUNob2ljZXNcIl0gPSAzMDBdID0gXCJNdWx0aXBsZUNob2ljZXNcIjtcbiAgICBIdHRwQ29kZXNbSHR0cENvZGVzW1wiTW92ZWRQZXJtYW5lbnRseVwiXSA9IDMwMV0gPSBcIk1vdmVkUGVybWFuZW50bHlcIjtcbiAgICBIdHRwQ29kZXNbSHR0cENvZGVzW1wiUmVzb3VyY2VNb3ZlZFwiXSA9IDMwMl0gPSBcIlJlc291cmNlTW92ZWRcIjtcbiAgICBIdHRwQ29kZXNbSHR0cENvZGVzW1wiU2VlT3RoZXJcIl0gPSAzMDNdID0gXCJTZWVPdGhlclwiO1xuICAgIEh0dHBDb2Rlc1tIdHRwQ29kZXNbXCJOb3RNb2RpZmllZFwiXSA9IDMwNF0gPSBcIk5vdE1vZGlmaWVkXCI7XG4gICAgSHR0cENvZGVzW0h0dHBDb2Rlc1tcIlVzZVByb3h5XCJdID0gMzA1XSA9IFwiVXNlUHJveHlcIjtcbiAgICBIdHRwQ29kZXNbSHR0cENvZGVzW1wiU3dpdGNoUHJveHlcIl0gPSAzMDZdID0gXCJTd2l0Y2hQcm94eVwiO1xuICAgIEh0dHBDb2Rlc1tIdHRwQ29kZXNbXCJUZW1wb3JhcnlSZWRpcmVjdFwiXSA9IDMwN10gPSBcIlRlbXBvcmFyeVJlZGlyZWN0XCI7XG4gICAgSHR0cENvZGVzW0h0dHBDb2Rlc1tcIlBlcm1hbmVudFJlZGlyZWN0XCJdID0gMzA4XSA9IFwiUGVybWFuZW50UmVkaXJlY3RcIjtcbiAgICBIdHRwQ29kZXNbSHR0cENvZGVzW1wiQmFkUmVxdWVzdFwiXSA9IDQwMF0gPSBcIkJhZFJlcXVlc3RcIjtcbiAgICBIdHRwQ29kZXNbSHR0cENvZGVzW1wiVW5hdXRob3JpemVkXCJdID0gNDAxXSA9IFwiVW5hdXRob3JpemVkXCI7XG4gICAgSHR0cENvZGVzW0h0dHBDb2Rlc1tcIlBheW1lbnRSZXF1aXJlZFwiXSA9IDQwMl0gPSBcIlBheW1lbnRSZXF1aXJlZFwiO1xuICAgIEh0dHBDb2Rlc1tIdHRwQ29kZXNbXCJGb3JiaWRkZW5cIl0gPSA0MDNdID0gXCJGb3JiaWRkZW5cIjtcbiAgICBIdHRwQ29kZXNbSHR0cENvZGVzW1wiTm90Rm91bmRcIl0gPSA0MDRdID0gXCJOb3RGb3VuZFwiO1xuICAgIEh0dHBDb2Rlc1tIdHRwQ29kZXNbXCJNZXRob2ROb3RBbGxvd2VkXCJdID0gNDA1XSA9IFwiTWV0aG9kTm90QWxsb3dlZFwiO1xuICAgIEh0dHBDb2Rlc1tIdHRwQ29kZXNbXCJOb3RBY2NlcHRhYmxlXCJdID0gNDA2XSA9IFwiTm90QWNjZXB0YWJsZVwiO1xuICAgIEh0dHBDb2Rlc1tIdHRwQ29kZXNbXCJQcm94eUF1dGhlbnRpY2F0aW9uUmVxdWlyZWRcIl0gPSA0MDddID0gXCJQcm94eUF1dGhlbnRpY2F0aW9uUmVxdWlyZWRcIjtcbiAgICBIdHRwQ29kZXNbSHR0cENvZGVzW1wiUmVxdWVzdFRpbWVvdXRcIl0gPSA0MDhdID0gXCJSZXF1ZXN0VGltZW91dFwiO1xuICAgIEh0dHBDb2Rlc1tIdHRwQ29kZXNbXCJDb25mbGljdFwiXSA9IDQwOV0gPSBcIkNvbmZsaWN0XCI7XG4gICAgSHR0cENvZGVzW0h0dHBDb2Rlc1tcIkdvbmVcIl0gPSA0MTBdID0gXCJHb25lXCI7XG4gICAgSHR0cENvZGVzW0h0dHBDb2Rlc1tcIlRvb01hbnlSZXF1ZXN0c1wiXSA9IDQyOV0gPSBcIlRvb01hbnlSZXF1ZXN0c1wiO1xuICAgIEh0dHBDb2Rlc1tIdHRwQ29kZXNbXCJJbnRlcm5hbFNlcnZlckVycm9yXCJdID0gNTAwXSA9IFwiSW50ZXJuYWxTZXJ2ZXJFcnJvclwiO1xuICAgIEh0dHBDb2Rlc1tIdHRwQ29kZXNbXCJOb3RJbXBsZW1lbnRlZFwiXSA9IDUwMV0gPSBcIk5vdEltcGxlbWVudGVkXCI7XG4gICAgSHR0cENvZGVzW0h0dHBDb2Rlc1tcIkJhZEdhdGV3YXlcIl0gPSA1MDJdID0gXCJCYWRHYXRld2F5XCI7XG4gICAgSHR0cENvZGVzW0h0dHBDb2Rlc1tcIlNlcnZpY2VVbmF2YWlsYWJsZVwiXSA9IDUwM10gPSBcIlNlcnZpY2VVbmF2YWlsYWJsZVwiO1xuICAgIEh0dHBDb2Rlc1tIdHRwQ29kZXNbXCJHYXRld2F5VGltZW91dFwiXSA9IDUwNF0gPSBcIkdhdGV3YXlUaW1lb3V0XCI7XG59KShIdHRwQ29kZXMgfHwgKGV4cG9ydHMuSHR0cENvZGVzID0gSHR0cENvZGVzID0ge30pKTtcbnZhciBIZWFkZXJzO1xuKGZ1bmN0aW9uIChIZWFkZXJzKSB7XG4gICAgSGVhZGVyc1tcIkFjY2VwdFwiXSA9IFwiYWNjZXB0XCI7XG4gICAgSGVhZGVyc1tcIkNvbnRlbnRUeXBlXCJdID0gXCJjb250ZW50LXR5cGVcIjtcbn0pKEhlYWRlcnMgfHwgKGV4cG9ydHMuSGVhZGVycyA9IEhlYWRlcnMgPSB7fSkpO1xudmFyIE1lZGlhVHlwZXM7XG4oZnVuY3Rpb24gKE1lZGlhVHlwZXMpIHtcbiAgICBNZWRpYVR5cGVzW1wiQXBwbGljYXRpb25Kc29uXCJdID0gXCJhcHBsaWNhdGlvbi9qc29uXCI7XG59KShNZWRpYVR5cGVzIHx8IChleHBvcnRzLk1lZGlhVHlwZXMgPSBNZWRpYVR5cGVzID0ge30pKTtcbi8qKlxuICogUmV0dXJucyB0aGUgcHJveHkgVVJMLCBkZXBlbmRpbmcgdXBvbiB0aGUgc3VwcGxpZWQgdXJsIGFuZCBwcm94eSBlbnZpcm9ubWVudCB2YXJpYWJsZXMuXG4gKiBAcGFyYW0gc2VydmVyVXJsICBUaGUgc2VydmVyIFVSTCB3aGVyZSB0aGUgcmVxdWVzdCB3aWxsIGJlIHNlbnQuIEZvciBleGFtcGxlLCBodHRwczovL2FwaS5naXRodWIuY29tXG4gKi9cbmZ1bmN0aW9uIGdldFByb3h5VXJsKHNlcnZlclVybCkge1xuICAgIGNvbnN0IHByb3h5VXJsID0gcG0uZ2V0UHJveHlVcmwobmV3IFVSTChzZXJ2ZXJVcmwpKTtcbiAgICByZXR1cm4gcHJveHlVcmwgPyBwcm94eVVybC5ocmVmIDogJyc7XG59XG5leHBvcnRzLmdldFByb3h5VXJsID0gZ2V0UHJveHlVcmw7XG5jb25zdCBIdHRwUmVkaXJlY3RDb2RlcyA9IFtcbiAgICBIdHRwQ29kZXMuTW92ZWRQZXJtYW5lbnRseSxcbiAgICBIdHRwQ29kZXMuUmVzb3VyY2VNb3ZlZCxcbiAgICBIdHRwQ29kZXMuU2VlT3RoZXIsXG4gICAgSHR0cENvZGVzLlRlbXBvcmFyeVJlZGlyZWN0LFxuICAgIEh0dHBDb2Rlcy5QZXJtYW5lbnRSZWRpcmVjdFxuXTtcbmNvbnN0IEh0dHBSZXNwb25zZVJldHJ5Q29kZXMgPSBbXG4gICAgSHR0cENvZGVzLkJhZEdhdGV3YXksXG4gICAgSHR0cENvZGVzLlNlcnZpY2VVbmF2YWlsYWJsZSxcbiAgICBIdHRwQ29kZXMuR2F0ZXdheVRpbWVvdXRcbl07XG5jb25zdCBSZXRyeWFibGVIdHRwVmVyYnMgPSBbJ09QVElPTlMnLCAnR0VUJywgJ0RFTEVURScsICdIRUFEJ107XG5jb25zdCBFeHBvbmVudGlhbEJhY2tvZmZDZWlsaW5nID0gMTA7XG5jb25zdCBFeHBvbmVudGlhbEJhY2tvZmZUaW1lU2xpY2UgPSA1O1xuY2xhc3MgSHR0cENsaWVudEVycm9yIGV4dGVuZHMgRXJyb3Ige1xuICAgIGNvbnN0cnVjdG9yKG1lc3NhZ2UsIHN0YXR1c0NvZGUpIHtcbiAgICAgICAgc3VwZXIobWVzc2FnZSk7XG4gICAgICAgIHRoaXMubmFtZSA9ICdIdHRwQ2xpZW50RXJyb3InO1xuICAgICAgICB0aGlzLnN0YXR1c0NvZGUgPSBzdGF0dXNDb2RlO1xuICAgICAgICBPYmplY3Quc2V0UHJvdG90eXBlT2YodGhpcywgSHR0cENsaWVudEVycm9yLnByb3RvdHlwZSk7XG4gICAgfVxufVxuZXhwb3J0cy5IdHRwQ2xpZW50RXJyb3IgPSBIdHRwQ2xpZW50RXJyb3I7XG5jbGFzcyBIdHRwQ2xpZW50UmVzcG9uc2Uge1xuICAgIGNvbnN0cnVjdG9yKG1lc3NhZ2UpIHtcbiAgICAgICAgdGhpcy5tZXNzYWdlID0gbWVzc2FnZTtcbiAgICB9XG4gICAgcmVhZEJvZHkoKSB7XG4gICAgICAgIHJldHVybiBfX2F3YWl0ZXIodGhpcywgdm9pZCAwLCB2b2lkIDAsIGZ1bmN0aW9uKiAoKSB7XG4gICAgICAgICAgICByZXR1cm4gbmV3IFByb21pc2UoKHJlc29sdmUpID0+IF9fYXdhaXRlcih0aGlzLCB2b2lkIDAsIHZvaWQgMCwgZnVuY3Rpb24qICgpIHtcbiAgICAgICAgICAgICAgICBsZXQgb3V0cHV0ID0gQnVmZmVyLmFsbG9jKDApO1xuICAgICAgICAgICAgICAgIHRoaXMubWVzc2FnZS5vbignZGF0YScsIChjaHVuaykgPT4ge1xuICAgICAgICAgICAgICAgICAgICBvdXRwdXQgPSBCdWZmZXIuY29uY2F0KFtvdXRwdXQsIGNodW5rXSk7XG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgdGhpcy5tZXNzYWdlLm9uKCdlbmQnLCAoKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgIHJlc29sdmUob3V0cHV0LnRvU3RyaW5nKCkpO1xuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgfSkpO1xuICAgICAgICB9KTtcbiAgICB9XG4gICAgcmVhZEJvZHlCdWZmZXIoKSB7XG4gICAgICAgIHJldHVybiBfX2F3YWl0ZXIodGhpcywgdm9pZCAwLCB2b2lkIDAsIGZ1bmN0aW9uKiAoKSB7XG4gICAgICAgICAgICByZXR1cm4gbmV3IFByb21pc2UoKHJlc29sdmUpID0+IF9fYXdhaXRlcih0aGlzLCB2b2lkIDAsIHZvaWQgMCwgZnVuY3Rpb24qICgpIHtcbiAgICAgICAgICAgICAgICBjb25zdCBjaHVua3MgPSBbXTtcbiAgICAgICAgICAgICAgICB0aGlzLm1lc3NhZ2Uub24oJ2RhdGEnLCAoY2h1bmspID0+IHtcbiAgICAgICAgICAgICAgICAgICAgY2h1bmtzLnB1c2goY2h1bmspO1xuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgIHRoaXMubWVzc2FnZS5vbignZW5kJywgKCkgPT4ge1xuICAgICAgICAgICAgICAgICAgICByZXNvbHZlKEJ1ZmZlci5jb25jYXQoY2h1bmtzKSk7XG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB9KSk7XG4gICAgICAgIH0pO1xuICAgIH1cbn1cbmV4cG9ydHMuSHR0cENsaWVudFJlc3BvbnNlID0gSHR0cENsaWVudFJlc3BvbnNlO1xuZnVuY3Rpb24gaXNIdHRwcyhyZXF1ZXN0VXJsKSB7XG4gICAgY29uc3QgcGFyc2VkVXJsID0gbmV3IFVSTChyZXF1ZXN0VXJsKTtcbiAgICByZXR1cm4gcGFyc2VkVXJsLnByb3RvY29sID09PSAnaHR0cHM6Jztcbn1cbmV4cG9ydHMuaXNIdHRwcyA9IGlzSHR0cHM7XG5jbGFzcyBIdHRwQ2xpZW50IHtcbiAgICBjb25zdHJ1Y3Rvcih1c2VyQWdlbnQsIGhhbmRsZXJzLCByZXF1ZXN0T3B0aW9ucykge1xuICAgICAgICB0aGlzLl9pZ25vcmVTc2xFcnJvciA9IGZhbHNlO1xuICAgICAgICB0aGlzLl9hbGxvd1JlZGlyZWN0cyA9IHRydWU7XG4gICAgICAgIHRoaXMuX2FsbG93UmVkaXJlY3REb3duZ3JhZGUgPSBmYWxzZTtcbiAgICAgICAgdGhpcy5fbWF4UmVkaXJlY3RzID0gNTA7XG4gICAgICAgIHRoaXMuX2FsbG93UmV0cmllcyA9IGZhbHNlO1xuICAgICAgICB0aGlzLl9tYXhSZXRyaWVzID0gMTtcbiAgICAgICAgdGhpcy5fa2VlcEFsaXZlID0gZmFsc2U7XG4gICAgICAgIHRoaXMuX2Rpc3Bvc2VkID0gZmFsc2U7XG4gICAgICAgIHRoaXMudXNlckFnZW50ID0gdXNlckFnZW50O1xuICAgICAgICB0aGlzLmhhbmRsZXJzID0gaGFuZGxlcnMgfHwgW107XG4gICAgICAgIHRoaXMucmVxdWVzdE9wdGlvbnMgPSByZXF1ZXN0T3B0aW9ucztcbiAgICAgICAgaWYgKHJlcXVlc3RPcHRpb25zKSB7XG4gICAgICAgICAgICBpZiAocmVxdWVzdE9wdGlvbnMuaWdub3JlU3NsRXJyb3IgIT0gbnVsbCkge1xuICAgICAgICAgICAgICAgIHRoaXMuX2lnbm9yZVNzbEVycm9yID0gcmVxdWVzdE9wdGlvbnMuaWdub3JlU3NsRXJyb3I7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICB0aGlzLl9zb2NrZXRUaW1lb3V0ID0gcmVxdWVzdE9wdGlvbnMuc29ja2V0VGltZW91dDtcbiAgICAgICAgICAgIGlmIChyZXF1ZXN0T3B0aW9ucy5hbGxvd1JlZGlyZWN0cyAhPSBudWxsKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5fYWxsb3dSZWRpcmVjdHMgPSByZXF1ZXN0T3B0aW9ucy5hbGxvd1JlZGlyZWN0cztcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmIChyZXF1ZXN0T3B0aW9ucy5hbGxvd1JlZGlyZWN0RG93bmdyYWRlICE9IG51bGwpIHtcbiAgICAgICAgICAgICAgICB0aGlzLl9hbGxvd1JlZGlyZWN0RG93bmdyYWRlID0gcmVxdWVzdE9wdGlvbnMuYWxsb3dSZWRpcmVjdERvd25ncmFkZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmIChyZXF1ZXN0T3B0aW9ucy5tYXhSZWRpcmVjdHMgIT0gbnVsbCkge1xuICAgICAgICAgICAgICAgIHRoaXMuX21heFJlZGlyZWN0cyA9IE1hdGgubWF4KHJlcXVlc3RPcHRpb25zLm1heFJlZGlyZWN0cywgMCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAocmVxdWVzdE9wdGlvbnMua2VlcEFsaXZlICE9IG51bGwpIHtcbiAgICAgICAgICAgICAgICB0aGlzLl9rZWVwQWxpdmUgPSByZXF1ZXN0T3B0aW9ucy5rZWVwQWxpdmU7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAocmVxdWVzdE9wdGlvbnMuYWxsb3dSZXRyaWVzICE9IG51bGwpIHtcbiAgICAgICAgICAgICAgICB0aGlzLl9hbGxvd1JldHJpZXMgPSByZXF1ZXN0T3B0aW9ucy5hbGxvd1JldHJpZXM7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAocmVxdWVzdE9wdGlvbnMubWF4UmV0cmllcyAhPSBudWxsKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5fbWF4UmV0cmllcyA9IHJlcXVlc3RPcHRpb25zLm1heFJldHJpZXM7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG4gICAgb3B0aW9ucyhyZXF1ZXN0VXJsLCBhZGRpdGlvbmFsSGVhZGVycykge1xuICAgICAgICByZXR1cm4gX19hd2FpdGVyKHRoaXMsIHZvaWQgMCwgdm9pZCAwLCBmdW5jdGlvbiogKCkge1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMucmVxdWVzdCgnT1BUSU9OUycsIHJlcXVlc3RVcmwsIG51bGwsIGFkZGl0aW9uYWxIZWFkZXJzIHx8IHt9KTtcbiAgICAgICAgfSk7XG4gICAgfVxuICAgIGdldChyZXF1ZXN0VXJsLCBhZGRpdGlvbmFsSGVhZGVycykge1xuICAgICAgICByZXR1cm4gX19hd2FpdGVyKHRoaXMsIHZvaWQgMCwgdm9pZCAwLCBmdW5jdGlvbiogKCkge1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMucmVxdWVzdCgnR0VUJywgcmVxdWVzdFVybCwgbnVsbCwgYWRkaXRpb25hbEhlYWRlcnMgfHwge30pO1xuICAgICAgICB9KTtcbiAgICB9XG4gICAgZGVsKHJlcXVlc3RVcmwsIGFkZGl0aW9uYWxIZWFkZXJzKSB7XG4gICAgICAgIHJldHVybiBfX2F3YWl0ZXIodGhpcywgdm9pZCAwLCB2b2lkIDAsIGZ1bmN0aW9uKiAoKSB7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy5yZXF1ZXN0KCdERUxFVEUnLCByZXF1ZXN0VXJsLCBudWxsLCBhZGRpdGlvbmFsSGVhZGVycyB8fCB7fSk7XG4gICAgICAgIH0pO1xuICAgIH1cbiAgICBwb3N0KHJlcXVlc3RVcmwsIGRhdGEsIGFkZGl0aW9uYWxIZWFkZXJzKSB7XG4gICAgICAgIHJldHVybiBfX2F3YWl0ZXIodGhpcywgdm9pZCAwLCB2b2lkIDAsIGZ1bmN0aW9uKiAoKSB7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy5yZXF1ZXN0KCdQT1NUJywgcmVxdWVzdFVybCwgZGF0YSwgYWRkaXRpb25hbEhlYWRlcnMgfHwge30pO1xuICAgICAgICB9KTtcbiAgICB9XG4gICAgcGF0Y2gocmVxdWVzdFVybCwgZGF0YSwgYWRkaXRpb25hbEhlYWRlcnMpIHtcbiAgICAgICAgcmV0dXJuIF9fYXdhaXRlcih0aGlzLCB2b2lkIDAsIHZvaWQgMCwgZnVuY3Rpb24qICgpIHtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLnJlcXVlc3QoJ1BBVENIJywgcmVxdWVzdFVybCwgZGF0YSwgYWRkaXRpb25hbEhlYWRlcnMgfHwge30pO1xuICAgICAgICB9KTtcbiAgICB9XG4gICAgcHV0KHJlcXVlc3RVcmwsIGRhdGEsIGFkZGl0aW9uYWxIZWFkZXJzKSB7XG4gICAgICAgIHJldHVybiBfX2F3YWl0ZXIodGhpcywgdm9pZCAwLCB2b2lkIDAsIGZ1bmN0aW9uKiAoKSB7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy5yZXF1ZXN0KCdQVVQnLCByZXF1ZXN0VXJsLCBkYXRhLCBhZGRpdGlvbmFsSGVhZGVycyB8fCB7fSk7XG4gICAgICAgIH0pO1xuICAgIH1cbiAgICBoZWFkKHJlcXVlc3RVcmwsIGFkZGl0aW9uYWxIZWFkZXJzKSB7XG4gICAgICAgIHJldHVybiBfX2F3YWl0ZXIodGhpcywgdm9pZCAwLCB2b2lkIDAsIGZ1bmN0aW9uKiAoKSB7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy5yZXF1ZXN0KCdIRUFEJywgcmVxdWVzdFVybCwgbnVsbCwgYWRkaXRpb25hbEhlYWRlcnMgfHwge30pO1xuICAgICAgICB9KTtcbiAgICB9XG4gICAgc2VuZFN0cmVhbSh2ZXJiLCByZXF1ZXN0VXJsLCBzdHJlYW0sIGFkZGl0aW9uYWxIZWFkZXJzKSB7XG4gICAgICAgIHJldHVybiBfX2F3YWl0ZXIodGhpcywgdm9pZCAwLCB2b2lkIDAsIGZ1bmN0aW9uKiAoKSB7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy5yZXF1ZXN0KHZlcmIsIHJlcXVlc3RVcmwsIHN0cmVhbSwgYWRkaXRpb25hbEhlYWRlcnMpO1xuICAgICAgICB9KTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogR2V0cyBhIHR5cGVkIG9iamVjdCBmcm9tIGFuIGVuZHBvaW50XG4gICAgICogQmUgYXdhcmUgdGhhdCBub3QgZm91bmQgcmV0dXJucyBhIG51bGwuICBPdGhlciBlcnJvcnMgKDR4eCwgNXh4KSByZWplY3QgdGhlIHByb21pc2VcbiAgICAgKi9cbiAgICBnZXRKc29uKHJlcXVlc3RVcmwsIGFkZGl0aW9uYWxIZWFkZXJzID0ge30pIHtcbiAgICAgICAgcmV0dXJuIF9fYXdhaXRlcih0aGlzLCB2b2lkIDAsIHZvaWQgMCwgZnVuY3Rpb24qICgpIHtcbiAgICAgICAgICAgIGFkZGl0aW9uYWxIZWFkZXJzW0hlYWRlcnMuQWNjZXB0XSA9IHRoaXMuX2dldEV4aXN0aW5nT3JEZWZhdWx0SGVhZGVyKGFkZGl0aW9uYWxIZWFkZXJzLCBIZWFkZXJzLkFjY2VwdCwgTWVkaWFUeXBlcy5BcHBsaWNhdGlvbkpzb24pO1xuICAgICAgICAgICAgY29uc3QgcmVzID0geWllbGQgdGhpcy5nZXQocmVxdWVzdFVybCwgYWRkaXRpb25hbEhlYWRlcnMpO1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMuX3Byb2Nlc3NSZXNwb25zZShyZXMsIHRoaXMucmVxdWVzdE9wdGlvbnMpO1xuICAgICAgICB9KTtcbiAgICB9XG4gICAgcG9zdEpzb24ocmVxdWVzdFVybCwgb2JqLCBhZGRpdGlvbmFsSGVhZGVycyA9IHt9KSB7XG4gICAgICAgIHJldHVybiBfX2F3YWl0ZXIodGhpcywgdm9pZCAwLCB2b2lkIDAsIGZ1bmN0aW9uKiAoKSB7XG4gICAgICAgICAgICBjb25zdCBkYXRhID0gSlNPTi5zdHJpbmdpZnkob2JqLCBudWxsLCAyKTtcbiAgICAgICAgICAgIGFkZGl0aW9uYWxIZWFkZXJzW0hlYWRlcnMuQWNjZXB0XSA9IHRoaXMuX2dldEV4aXN0aW5nT3JEZWZhdWx0SGVhZGVyKGFkZGl0aW9uYWxIZWFkZXJzLCBIZWFkZXJzLkFjY2VwdCwgTWVkaWFUeXBlcy5BcHBsaWNhdGlvbkpzb24pO1xuICAgICAgICAgICAgYWRkaXRpb25hbEhlYWRlcnNbSGVhZGVycy5Db250ZW50VHlwZV0gPSB0aGlzLl9nZXRFeGlzdGluZ09yRGVmYXVsdEhlYWRlcihhZGRpdGlvbmFsSGVhZGVycywgSGVhZGVycy5Db250ZW50VHlwZSwgTWVkaWFUeXBlcy5BcHBsaWNhdGlvbkpzb24pO1xuICAgICAgICAgICAgY29uc3QgcmVzID0geWllbGQgdGhpcy5wb3N0KHJlcXVlc3RVcmwsIGRhdGEsIGFkZGl0aW9uYWxIZWFkZXJzKTtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLl9wcm9jZXNzUmVzcG9uc2UocmVzLCB0aGlzLnJlcXVlc3RPcHRpb25zKTtcbiAgICAgICAgfSk7XG4gICAgfVxuICAgIHB1dEpzb24ocmVxdWVzdFVybCwgb2JqLCBhZGRpdGlvbmFsSGVhZGVycyA9IHt9KSB7XG4gICAgICAgIHJldHVybiBfX2F3YWl0ZXIodGhpcywgdm9pZCAwLCB2b2lkIDAsIGZ1bmN0aW9uKiAoKSB7XG4gICAgICAgICAgICBjb25zdCBkYXRhID0gSlNPTi5zdHJpbmdpZnkob2JqLCBudWxsLCAyKTtcbiAgICAgICAgICAgIGFkZGl0aW9uYWxIZWFkZXJzW0hlYWRlcnMuQWNjZXB0XSA9IHRoaXMuX2dldEV4aXN0aW5nT3JEZWZhdWx0SGVhZGVyKGFkZGl0aW9uYWxIZWFkZXJzLCBIZWFkZXJzLkFjY2VwdCwgTWVkaWFUeXBlcy5BcHBsaWNhdGlvbkpzb24pO1xuICAgICAgICAgICAgYWRkaXRpb25hbEhlYWRlcnNbSGVhZGVycy5Db250ZW50VHlwZV0gPSB0aGlzLl9nZXRFeGlzdGluZ09yRGVmYXVsdEhlYWRlcihhZGRpdGlvbmFsSGVhZGVycywgSGVhZGVycy5Db250ZW50VHlwZSwgTWVkaWFUeXBlcy5BcHBsaWNhdGlvbkpzb24pO1xuICAgICAgICAgICAgY29uc3QgcmVzID0geWllbGQgdGhpcy5wdXQocmVxdWVzdFVybCwgZGF0YSwgYWRkaXRpb25hbEhlYWRlcnMpO1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMuX3Byb2Nlc3NSZXNwb25zZShyZXMsIHRoaXMucmVxdWVzdE9wdGlvbnMpO1xuICAgICAgICB9KTtcbiAgICB9XG4gICAgcGF0Y2hKc29uKHJlcXVlc3RVcmwsIG9iaiwgYWRkaXRpb25hbEhlYWRlcnMgPSB7fSkge1xuICAgICAgICByZXR1cm4gX19hd2FpdGVyKHRoaXMsIHZvaWQgMCwgdm9pZCAwLCBmdW5jdGlvbiogKCkge1xuICAgICAgICAgICAgY29uc3QgZGF0YSA9IEpTT04uc3RyaW5naWZ5KG9iaiwgbnVsbCwgMik7XG4gICAgICAgICAgICBhZGRpdGlvbmFsSGVhZGVyc1tIZWFkZXJzLkFjY2VwdF0gPSB0aGlzLl9nZXRFeGlzdGluZ09yRGVmYXVsdEhlYWRlcihhZGRpdGlvbmFsSGVhZGVycywgSGVhZGVycy5BY2NlcHQsIE1lZGlhVHlwZXMuQXBwbGljYXRpb25Kc29uKTtcbiAgICAgICAgICAgIGFkZGl0aW9uYWxIZWFkZXJzW0hlYWRlcnMuQ29udGVudFR5cGVdID0gdGhpcy5fZ2V0RXhpc3RpbmdPckRlZmF1bHRIZWFkZXIoYWRkaXRpb25hbEhlYWRlcnMsIEhlYWRlcnMuQ29udGVudFR5cGUsIE1lZGlhVHlwZXMuQXBwbGljYXRpb25Kc29uKTtcbiAgICAgICAgICAgIGNvbnN0IHJlcyA9IHlpZWxkIHRoaXMucGF0Y2gocmVxdWVzdFVybCwgZGF0YSwgYWRkaXRpb25hbEhlYWRlcnMpO1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMuX3Byb2Nlc3NSZXNwb25zZShyZXMsIHRoaXMucmVxdWVzdE9wdGlvbnMpO1xuICAgICAgICB9KTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogTWFrZXMgYSByYXcgaHR0cCByZXF1ZXN0LlxuICAgICAqIEFsbCBvdGhlciBtZXRob2RzIHN1Y2ggYXMgZ2V0LCBwb3N0LCBwYXRjaCwgYW5kIHJlcXVlc3QgdWx0aW1hdGVseSBjYWxsIHRoaXMuXG4gICAgICogUHJlZmVyIGdldCwgZGVsLCBwb3N0IGFuZCBwYXRjaFxuICAgICAqL1xuICAgIHJlcXVlc3QodmVyYiwgcmVxdWVzdFVybCwgZGF0YSwgaGVhZGVycykge1xuICAgICAgICByZXR1cm4gX19hd2FpdGVyKHRoaXMsIHZvaWQgMCwgdm9pZCAwLCBmdW5jdGlvbiogKCkge1xuICAgICAgICAgICAgaWYgKHRoaXMuX2Rpc3Bvc2VkKSB7XG4gICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdDbGllbnQgaGFzIGFscmVhZHkgYmVlbiBkaXNwb3NlZC4nKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGNvbnN0IHBhcnNlZFVybCA9IG5ldyBVUkwocmVxdWVzdFVybCk7XG4gICAgICAgICAgICBsZXQgaW5mbyA9IHRoaXMuX3ByZXBhcmVSZXF1ZXN0KHZlcmIsIHBhcnNlZFVybCwgaGVhZGVycyk7XG4gICAgICAgICAgICAvLyBPbmx5IHBlcmZvcm0gcmV0cmllcyBvbiByZWFkcyBzaW5jZSB3cml0ZXMgbWF5IG5vdCBiZSBpZGVtcG90ZW50LlxuICAgICAgICAgICAgY29uc3QgbWF4VHJpZXMgPSB0aGlzLl9hbGxvd1JldHJpZXMgJiYgUmV0cnlhYmxlSHR0cFZlcmJzLmluY2x1ZGVzKHZlcmIpXG4gICAgICAgICAgICAgICAgPyB0aGlzLl9tYXhSZXRyaWVzICsgMVxuICAgICAgICAgICAgICAgIDogMTtcbiAgICAgICAgICAgIGxldCBudW1UcmllcyA9IDA7XG4gICAgICAgICAgICBsZXQgcmVzcG9uc2U7XG4gICAgICAgICAgICBkbyB7XG4gICAgICAgICAgICAgICAgcmVzcG9uc2UgPSB5aWVsZCB0aGlzLnJlcXVlc3RSYXcoaW5mbywgZGF0YSk7XG4gICAgICAgICAgICAgICAgLy8gQ2hlY2sgaWYgaXQncyBhbiBhdXRoZW50aWNhdGlvbiBjaGFsbGVuZ2VcbiAgICAgICAgICAgICAgICBpZiAocmVzcG9uc2UgJiZcbiAgICAgICAgICAgICAgICAgICAgcmVzcG9uc2UubWVzc2FnZSAmJlxuICAgICAgICAgICAgICAgICAgICByZXNwb25zZS5tZXNzYWdlLnN0YXR1c0NvZGUgPT09IEh0dHBDb2Rlcy5VbmF1dGhvcml6ZWQpIHtcbiAgICAgICAgICAgICAgICAgICAgbGV0IGF1dGhlbnRpY2F0aW9uSGFuZGxlcjtcbiAgICAgICAgICAgICAgICAgICAgZm9yIChjb25zdCBoYW5kbGVyIG9mIHRoaXMuaGFuZGxlcnMpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChoYW5kbGVyLmNhbkhhbmRsZUF1dGhlbnRpY2F0aW9uKHJlc3BvbnNlKSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1dGhlbnRpY2F0aW9uSGFuZGxlciA9IGhhbmRsZXI7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgaWYgKGF1dGhlbnRpY2F0aW9uSGFuZGxlcikge1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGF1dGhlbnRpY2F0aW9uSGFuZGxlci5oYW5kbGVBdXRoZW50aWNhdGlvbih0aGlzLCBpbmZvLCBkYXRhKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIFdlIGhhdmUgcmVjZWl2ZWQgYW4gdW5hdXRob3JpemVkIHJlc3BvbnNlIGJ1dCBoYXZlIG5vIGhhbmRsZXJzIHRvIGhhbmRsZSBpdC5cbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIExldCB0aGUgcmVzcG9uc2UgcmV0dXJuIHRvIHRoZSBjYWxsZXIuXG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gcmVzcG9uc2U7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgbGV0IHJlZGlyZWN0c1JlbWFpbmluZyA9IHRoaXMuX21heFJlZGlyZWN0cztcbiAgICAgICAgICAgICAgICB3aGlsZSAocmVzcG9uc2UubWVzc2FnZS5zdGF0dXNDb2RlICYmXG4gICAgICAgICAgICAgICAgICAgIEh0dHBSZWRpcmVjdENvZGVzLmluY2x1ZGVzKHJlc3BvbnNlLm1lc3NhZ2Uuc3RhdHVzQ29kZSkgJiZcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5fYWxsb3dSZWRpcmVjdHMgJiZcbiAgICAgICAgICAgICAgICAgICAgcmVkaXJlY3RzUmVtYWluaW5nID4gMCkge1xuICAgICAgICAgICAgICAgICAgICBjb25zdCByZWRpcmVjdFVybCA9IHJlc3BvbnNlLm1lc3NhZ2UuaGVhZGVyc1snbG9jYXRpb24nXTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKCFyZWRpcmVjdFVybCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgLy8gaWYgdGhlcmUncyBubyBsb2NhdGlvbiB0byByZWRpcmVjdCB0bywgd2Ugd29uJ3RcbiAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IHBhcnNlZFJlZGlyZWN0VXJsID0gbmV3IFVSTChyZWRpcmVjdFVybCk7XG4gICAgICAgICAgICAgICAgICAgIGlmIChwYXJzZWRVcmwucHJvdG9jb2wgPT09ICdodHRwczonICYmXG4gICAgICAgICAgICAgICAgICAgICAgICBwYXJzZWRVcmwucHJvdG9jb2wgIT09IHBhcnNlZFJlZGlyZWN0VXJsLnByb3RvY29sICYmXG4gICAgICAgICAgICAgICAgICAgICAgICAhdGhpcy5fYWxsb3dSZWRpcmVjdERvd25ncmFkZSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdSZWRpcmVjdCBmcm9tIEhUVFBTIHRvIEhUVFAgcHJvdG9jb2wuIFRoaXMgZG93bmdyYWRlIGlzIG5vdCBhbGxvd2VkIGZvciBzZWN1cml0eSByZWFzb25zLiBJZiB5b3Ugd2FudCB0byBhbGxvdyB0aGlzIGJlaGF2aW9yLCBzZXQgdGhlIGFsbG93UmVkaXJlY3REb3duZ3JhZGUgb3B0aW9uIHRvIHRydWUuJyk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgLy8gd2UgbmVlZCB0byBmaW5pc2ggcmVhZGluZyB0aGUgcmVzcG9uc2UgYmVmb3JlIHJlYXNzaWduaW5nIHJlc3BvbnNlXG4gICAgICAgICAgICAgICAgICAgIC8vIHdoaWNoIHdpbGwgbGVhayB0aGUgb3BlbiBzb2NrZXQuXG4gICAgICAgICAgICAgICAgICAgIHlpZWxkIHJlc3BvbnNlLnJlYWRCb2R5KCk7XG4gICAgICAgICAgICAgICAgICAgIC8vIHN0cmlwIGF1dGhvcml6YXRpb24gaGVhZGVyIGlmIHJlZGlyZWN0ZWQgdG8gYSBkaWZmZXJlbnQgaG9zdG5hbWVcbiAgICAgICAgICAgICAgICAgICAgaWYgKHBhcnNlZFJlZGlyZWN0VXJsLmhvc3RuYW1lICE9PSBwYXJzZWRVcmwuaG9zdG5hbWUpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGZvciAoY29uc3QgaGVhZGVyIGluIGhlYWRlcnMpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBoZWFkZXIgbmFtZXMgYXJlIGNhc2UgaW5zZW5zaXRpdmVcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoaGVhZGVyLnRvTG93ZXJDYXNlKCkgPT09ICdhdXRob3JpemF0aW9uJykge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZWxldGUgaGVhZGVyc1toZWFkZXJdO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAvLyBsZXQncyBtYWtlIHRoZSByZXF1ZXN0IHdpdGggdGhlIG5ldyByZWRpcmVjdFVybFxuICAgICAgICAgICAgICAgICAgICBpbmZvID0gdGhpcy5fcHJlcGFyZVJlcXVlc3QodmVyYiwgcGFyc2VkUmVkaXJlY3RVcmwsIGhlYWRlcnMpO1xuICAgICAgICAgICAgICAgICAgICByZXNwb25zZSA9IHlpZWxkIHRoaXMucmVxdWVzdFJhdyhpbmZvLCBkYXRhKTtcbiAgICAgICAgICAgICAgICAgICAgcmVkaXJlY3RzUmVtYWluaW5nLS07XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGlmICghcmVzcG9uc2UubWVzc2FnZS5zdGF0dXNDb2RlIHx8XG4gICAgICAgICAgICAgICAgICAgICFIdHRwUmVzcG9uc2VSZXRyeUNvZGVzLmluY2x1ZGVzKHJlc3BvbnNlLm1lc3NhZ2Uuc3RhdHVzQ29kZSkpIHtcbiAgICAgICAgICAgICAgICAgICAgLy8gSWYgbm90IGEgcmV0cnkgY29kZSwgcmV0dXJuIGltbWVkaWF0ZWx5IGluc3RlYWQgb2YgcmV0cnlpbmdcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHJlc3BvbnNlO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBudW1UcmllcyArPSAxO1xuICAgICAgICAgICAgICAgIGlmIChudW1UcmllcyA8IG1heFRyaWVzKSB7XG4gICAgICAgICAgICAgICAgICAgIHlpZWxkIHJlc3BvbnNlLnJlYWRCb2R5KCk7XG4gICAgICAgICAgICAgICAgICAgIHlpZWxkIHRoaXMuX3BlcmZvcm1FeHBvbmVudGlhbEJhY2tvZmYobnVtVHJpZXMpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0gd2hpbGUgKG51bVRyaWVzIDwgbWF4VHJpZXMpO1xuICAgICAgICAgICAgcmV0dXJuIHJlc3BvbnNlO1xuICAgICAgICB9KTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogTmVlZHMgdG8gYmUgY2FsbGVkIGlmIGtlZXBBbGl2ZSBpcyBzZXQgdG8gdHJ1ZSBpbiByZXF1ZXN0IG9wdGlvbnMuXG4gICAgICovXG4gICAgZGlzcG9zZSgpIHtcbiAgICAgICAgaWYgKHRoaXMuX2FnZW50KSB7XG4gICAgICAgICAgICB0aGlzLl9hZ2VudC5kZXN0cm95KCk7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5fZGlzcG9zZWQgPSB0cnVlO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBSYXcgcmVxdWVzdC5cbiAgICAgKiBAcGFyYW0gaW5mb1xuICAgICAqIEBwYXJhbSBkYXRhXG4gICAgICovXG4gICAgcmVxdWVzdFJhdyhpbmZvLCBkYXRhKSB7XG4gICAgICAgIHJldHVybiBfX2F3YWl0ZXIodGhpcywgdm9pZCAwLCB2b2lkIDAsIGZ1bmN0aW9uKiAoKSB7XG4gICAgICAgICAgICByZXR1cm4gbmV3IFByb21pc2UoKHJlc29sdmUsIHJlamVjdCkgPT4ge1xuICAgICAgICAgICAgICAgIGZ1bmN0aW9uIGNhbGxiYWNrRm9yUmVzdWx0KGVyciwgcmVzKSB7XG4gICAgICAgICAgICAgICAgICAgIGlmIChlcnIpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJlamVjdChlcnIpO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIGVsc2UgaWYgKCFyZXMpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIElmIGBlcnJgIGlzIG5vdCBwYXNzZWQsIHRoZW4gYHJlc2AgbXVzdCBiZSBwYXNzZWQuXG4gICAgICAgICAgICAgICAgICAgICAgICByZWplY3QobmV3IEVycm9yKCdVbmtub3duIGVycm9yJykpO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgcmVzb2x2ZShyZXMpO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHRoaXMucmVxdWVzdFJhd1dpdGhDYWxsYmFjayhpbmZvLCBkYXRhLCBjYWxsYmFja0ZvclJlc3VsdCk7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfSk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIFJhdyByZXF1ZXN0IHdpdGggY2FsbGJhY2suXG4gICAgICogQHBhcmFtIGluZm9cbiAgICAgKiBAcGFyYW0gZGF0YVxuICAgICAqIEBwYXJhbSBvblJlc3VsdFxuICAgICAqL1xuICAgIHJlcXVlc3RSYXdXaXRoQ2FsbGJhY2soaW5mbywgZGF0YSwgb25SZXN1bHQpIHtcbiAgICAgICAgaWYgKHR5cGVvZiBkYXRhID09PSAnc3RyaW5nJykge1xuICAgICAgICAgICAgaWYgKCFpbmZvLm9wdGlvbnMuaGVhZGVycykge1xuICAgICAgICAgICAgICAgIGluZm8ub3B0aW9ucy5oZWFkZXJzID0ge307XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpbmZvLm9wdGlvbnMuaGVhZGVyc1snQ29udGVudC1MZW5ndGgnXSA9IEJ1ZmZlci5ieXRlTGVuZ3RoKGRhdGEsICd1dGY4Jyk7XG4gICAgICAgIH1cbiAgICAgICAgbGV0IGNhbGxiYWNrQ2FsbGVkID0gZmFsc2U7XG4gICAgICAgIGZ1bmN0aW9uIGhhbmRsZVJlc3VsdChlcnIsIHJlcykge1xuICAgICAgICAgICAgaWYgKCFjYWxsYmFja0NhbGxlZCkge1xuICAgICAgICAgICAgICAgIGNhbGxiYWNrQ2FsbGVkID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICBvblJlc3VsdChlcnIsIHJlcyk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgcmVxID0gaW5mby5odHRwTW9kdWxlLnJlcXVlc3QoaW5mby5vcHRpb25zLCAobXNnKSA9PiB7XG4gICAgICAgICAgICBjb25zdCByZXMgPSBuZXcgSHR0cENsaWVudFJlc3BvbnNlKG1zZyk7XG4gICAgICAgICAgICBoYW5kbGVSZXN1bHQodW5kZWZpbmVkLCByZXMpO1xuICAgICAgICB9KTtcbiAgICAgICAgbGV0IHNvY2tldDtcbiAgICAgICAgcmVxLm9uKCdzb2NrZXQnLCBzb2NrID0+IHtcbiAgICAgICAgICAgIHNvY2tldCA9IHNvY2s7XG4gICAgICAgIH0pO1xuICAgICAgICAvLyBJZiB3ZSBldmVyIGdldCBkaXNjb25uZWN0ZWQsIHdlIHdhbnQgdGhlIHNvY2tldCB0byB0aW1lb3V0IGV2ZW50dWFsbHlcbiAgICAgICAgcmVxLnNldFRpbWVvdXQodGhpcy5fc29ja2V0VGltZW91dCB8fCAzICogNjAwMDAsICgpID0+IHtcbiAgICAgICAgICAgIGlmIChzb2NrZXQpIHtcbiAgICAgICAgICAgICAgICBzb2NrZXQuZW5kKCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBoYW5kbGVSZXN1bHQobmV3IEVycm9yKGBSZXF1ZXN0IHRpbWVvdXQ6ICR7aW5mby5vcHRpb25zLnBhdGh9YCkpO1xuICAgICAgICB9KTtcbiAgICAgICAgcmVxLm9uKCdlcnJvcicsIGZ1bmN0aW9uIChlcnIpIHtcbiAgICAgICAgICAgIC8vIGVyciBoYXMgc3RhdHVzQ29kZSBwcm9wZXJ0eVxuICAgICAgICAgICAgLy8gcmVzIHNob3VsZCBoYXZlIGhlYWRlcnNcbiAgICAgICAgICAgIGhhbmRsZVJlc3VsdChlcnIpO1xuICAgICAgICB9KTtcbiAgICAgICAgaWYgKGRhdGEgJiYgdHlwZW9mIGRhdGEgPT09ICdzdHJpbmcnKSB7XG4gICAgICAgICAgICByZXEud3JpdGUoZGF0YSwgJ3V0ZjgnKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoZGF0YSAmJiB0eXBlb2YgZGF0YSAhPT0gJ3N0cmluZycpIHtcbiAgICAgICAgICAgIGRhdGEub24oJ2Nsb3NlJywgZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgICAgIHJlcS5lbmQoKTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgZGF0YS5waXBlKHJlcSk7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICByZXEuZW5kKCk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgLyoqXG4gICAgICogR2V0cyBhbiBodHRwIGFnZW50LiBUaGlzIGZ1bmN0aW9uIGlzIHVzZWZ1bCB3aGVuIHlvdSBuZWVkIGFuIGh0dHAgYWdlbnQgdGhhdCBoYW5kbGVzXG4gICAgICogcm91dGluZyB0aHJvdWdoIGEgcHJveHkgc2VydmVyIC0gZGVwZW5kaW5nIHVwb24gdGhlIHVybCBhbmQgcHJveHkgZW52aXJvbm1lbnQgdmFyaWFibGVzLlxuICAgICAqIEBwYXJhbSBzZXJ2ZXJVcmwgIFRoZSBzZXJ2ZXIgVVJMIHdoZXJlIHRoZSByZXF1ZXN0IHdpbGwgYmUgc2VudC4gRm9yIGV4YW1wbGUsIGh0dHBzOi8vYXBpLmdpdGh1Yi5jb21cbiAgICAgKi9cbiAgICBnZXRBZ2VudChzZXJ2ZXJVcmwpIHtcbiAgICAgICAgY29uc3QgcGFyc2VkVXJsID0gbmV3IFVSTChzZXJ2ZXJVcmwpO1xuICAgICAgICByZXR1cm4gdGhpcy5fZ2V0QWdlbnQocGFyc2VkVXJsKTtcbiAgICB9XG4gICAgZ2V0QWdlbnREaXNwYXRjaGVyKHNlcnZlclVybCkge1xuICAgICAgICBjb25zdCBwYXJzZWRVcmwgPSBuZXcgVVJMKHNlcnZlclVybCk7XG4gICAgICAgIGNvbnN0IHByb3h5VXJsID0gcG0uZ2V0UHJveHlVcmwocGFyc2VkVXJsKTtcbiAgICAgICAgY29uc3QgdXNlUHJveHkgPSBwcm94eVVybCAmJiBwcm94eVVybC5ob3N0bmFtZTtcbiAgICAgICAgaWYgKCF1c2VQcm94eSkge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB0aGlzLl9nZXRQcm94eUFnZW50RGlzcGF0Y2hlcihwYXJzZWRVcmwsIHByb3h5VXJsKTtcbiAgICB9XG4gICAgX3ByZXBhcmVSZXF1ZXN0KG1ldGhvZCwgcmVxdWVzdFVybCwgaGVhZGVycykge1xuICAgICAgICBjb25zdCBpbmZvID0ge307XG4gICAgICAgIGluZm8ucGFyc2VkVXJsID0gcmVxdWVzdFVybDtcbiAgICAgICAgY29uc3QgdXNpbmdTc2wgPSBpbmZvLnBhcnNlZFVybC5wcm90b2NvbCA9PT0gJ2h0dHBzOic7XG4gICAgICAgIGluZm8uaHR0cE1vZHVsZSA9IHVzaW5nU3NsID8gaHR0cHMgOiBodHRwO1xuICAgICAgICBjb25zdCBkZWZhdWx0UG9ydCA9IHVzaW5nU3NsID8gNDQzIDogODA7XG4gICAgICAgIGluZm8ub3B0aW9ucyA9IHt9O1xuICAgICAgICBpbmZvLm9wdGlvbnMuaG9zdCA9IGluZm8ucGFyc2VkVXJsLmhvc3RuYW1lO1xuICAgICAgICBpbmZvLm9wdGlvbnMucG9ydCA9IGluZm8ucGFyc2VkVXJsLnBvcnRcbiAgICAgICAgICAgID8gcGFyc2VJbnQoaW5mby5wYXJzZWRVcmwucG9ydClcbiAgICAgICAgICAgIDogZGVmYXVsdFBvcnQ7XG4gICAgICAgIGluZm8ub3B0aW9ucy5wYXRoID1cbiAgICAgICAgICAgIChpbmZvLnBhcnNlZFVybC5wYXRobmFtZSB8fCAnJykgKyAoaW5mby5wYXJzZWRVcmwuc2VhcmNoIHx8ICcnKTtcbiAgICAgICAgaW5mby5vcHRpb25zLm1ldGhvZCA9IG1ldGhvZDtcbiAgICAgICAgaW5mby5vcHRpb25zLmhlYWRlcnMgPSB0aGlzLl9tZXJnZUhlYWRlcnMoaGVhZGVycyk7XG4gICAgICAgIGlmICh0aGlzLnVzZXJBZ2VudCAhPSBudWxsKSB7XG4gICAgICAgICAgICBpbmZvLm9wdGlvbnMuaGVhZGVyc1sndXNlci1hZ2VudCddID0gdGhpcy51c2VyQWdlbnQ7XG4gICAgICAgIH1cbiAgICAgICAgaW5mby5vcHRpb25zLmFnZW50ID0gdGhpcy5fZ2V0QWdlbnQoaW5mby5wYXJzZWRVcmwpO1xuICAgICAgICAvLyBnaXZlcyBoYW5kbGVycyBhbiBvcHBvcnR1bml0eSB0byBwYXJ0aWNpcGF0ZVxuICAgICAgICBpZiAodGhpcy5oYW5kbGVycykge1xuICAgICAgICAgICAgZm9yIChjb25zdCBoYW5kbGVyIG9mIHRoaXMuaGFuZGxlcnMpIHtcbiAgICAgICAgICAgICAgICBoYW5kbGVyLnByZXBhcmVSZXF1ZXN0KGluZm8ub3B0aW9ucyk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGluZm87XG4gICAgfVxuICAgIF9tZXJnZUhlYWRlcnMoaGVhZGVycykge1xuICAgICAgICBpZiAodGhpcy5yZXF1ZXN0T3B0aW9ucyAmJiB0aGlzLnJlcXVlc3RPcHRpb25zLmhlYWRlcnMpIHtcbiAgICAgICAgICAgIHJldHVybiBPYmplY3QuYXNzaWduKHt9LCBsb3dlcmNhc2VLZXlzKHRoaXMucmVxdWVzdE9wdGlvbnMuaGVhZGVycyksIGxvd2VyY2FzZUtleXMoaGVhZGVycyB8fCB7fSkpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBsb3dlcmNhc2VLZXlzKGhlYWRlcnMgfHwge30pO1xuICAgIH1cbiAgICBfZ2V0RXhpc3RpbmdPckRlZmF1bHRIZWFkZXIoYWRkaXRpb25hbEhlYWRlcnMsIGhlYWRlciwgX2RlZmF1bHQpIHtcbiAgICAgICAgbGV0IGNsaWVudEhlYWRlcjtcbiAgICAgICAgaWYgKHRoaXMucmVxdWVzdE9wdGlvbnMgJiYgdGhpcy5yZXF1ZXN0T3B0aW9ucy5oZWFkZXJzKSB7XG4gICAgICAgICAgICBjbGllbnRIZWFkZXIgPSBsb3dlcmNhc2VLZXlzKHRoaXMucmVxdWVzdE9wdGlvbnMuaGVhZGVycylbaGVhZGVyXTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gYWRkaXRpb25hbEhlYWRlcnNbaGVhZGVyXSB8fCBjbGllbnRIZWFkZXIgfHwgX2RlZmF1bHQ7XG4gICAgfVxuICAgIF9nZXRBZ2VudChwYXJzZWRVcmwpIHtcbiAgICAgICAgbGV0IGFnZW50O1xuICAgICAgICBjb25zdCBwcm94eVVybCA9IHBtLmdldFByb3h5VXJsKHBhcnNlZFVybCk7XG4gICAgICAgIGNvbnN0IHVzZVByb3h5ID0gcHJveHlVcmwgJiYgcHJveHlVcmwuaG9zdG5hbWU7XG4gICAgICAgIGlmICh0aGlzLl9rZWVwQWxpdmUgJiYgdXNlUHJveHkpIHtcbiAgICAgICAgICAgIGFnZW50ID0gdGhpcy5fcHJveHlBZ2VudDtcbiAgICAgICAgfVxuICAgICAgICBpZiAoIXVzZVByb3h5KSB7XG4gICAgICAgICAgICBhZ2VudCA9IHRoaXMuX2FnZW50O1xuICAgICAgICB9XG4gICAgICAgIC8vIGlmIGFnZW50IGlzIGFscmVhZHkgYXNzaWduZWQgdXNlIHRoYXQgYWdlbnQuXG4gICAgICAgIGlmIChhZ2VudCkge1xuICAgICAgICAgICAgcmV0dXJuIGFnZW50O1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IHVzaW5nU3NsID0gcGFyc2VkVXJsLnByb3RvY29sID09PSAnaHR0cHM6JztcbiAgICAgICAgbGV0IG1heFNvY2tldHMgPSAxMDA7XG4gICAgICAgIGlmICh0aGlzLnJlcXVlc3RPcHRpb25zKSB7XG4gICAgICAgICAgICBtYXhTb2NrZXRzID0gdGhpcy5yZXF1ZXN0T3B0aW9ucy5tYXhTb2NrZXRzIHx8IGh0dHAuZ2xvYmFsQWdlbnQubWF4U29ja2V0cztcbiAgICAgICAgfVxuICAgICAgICAvLyBUaGlzIGlzIGB1c2VQcm94eWAgYWdhaW4sIGJ1dCB3ZSBuZWVkIHRvIGNoZWNrIGBwcm94eVVSbGAgZGlyZWN0bHkgZm9yIFR5cGVTY3JpcHRzJ3MgZmxvdyBhbmFseXNpcy5cbiAgICAgICAgaWYgKHByb3h5VXJsICYmIHByb3h5VXJsLmhvc3RuYW1lKSB7XG4gICAgICAgICAgICBjb25zdCBhZ2VudE9wdGlvbnMgPSB7XG4gICAgICAgICAgICAgICAgbWF4U29ja2V0cyxcbiAgICAgICAgICAgICAgICBrZWVwQWxpdmU6IHRoaXMuX2tlZXBBbGl2ZSxcbiAgICAgICAgICAgICAgICBwcm94eTogT2JqZWN0LmFzc2lnbihPYmplY3QuYXNzaWduKHt9LCAoKHByb3h5VXJsLnVzZXJuYW1lIHx8IHByb3h5VXJsLnBhc3N3b3JkKSAmJiB7XG4gICAgICAgICAgICAgICAgICAgIHByb3h5QXV0aDogYCR7cHJveHlVcmwudXNlcm5hbWV9OiR7cHJveHlVcmwucGFzc3dvcmR9YFxuICAgICAgICAgICAgICAgIH0pKSwgeyBob3N0OiBwcm94eVVybC5ob3N0bmFtZSwgcG9ydDogcHJveHlVcmwucG9ydCB9KVxuICAgICAgICAgICAgfTtcbiAgICAgICAgICAgIGxldCB0dW5uZWxBZ2VudDtcbiAgICAgICAgICAgIGNvbnN0IG92ZXJIdHRwcyA9IHByb3h5VXJsLnByb3RvY29sID09PSAnaHR0cHM6JztcbiAgICAgICAgICAgIGlmICh1c2luZ1NzbCkge1xuICAgICAgICAgICAgICAgIHR1bm5lbEFnZW50ID0gb3Zlckh0dHBzID8gdHVubmVsLmh0dHBzT3Zlckh0dHBzIDogdHVubmVsLmh0dHBzT3Zlckh0dHA7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICB0dW5uZWxBZ2VudCA9IG92ZXJIdHRwcyA/IHR1bm5lbC5odHRwT3Zlckh0dHBzIDogdHVubmVsLmh0dHBPdmVySHR0cDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGFnZW50ID0gdHVubmVsQWdlbnQoYWdlbnRPcHRpb25zKTtcbiAgICAgICAgICAgIHRoaXMuX3Byb3h5QWdlbnQgPSBhZ2VudDtcbiAgICAgICAgfVxuICAgICAgICAvLyBpZiB0dW5uZWxpbmcgYWdlbnQgaXNuJ3QgYXNzaWduZWQgY3JlYXRlIGEgbmV3IGFnZW50XG4gICAgICAgIGlmICghYWdlbnQpIHtcbiAgICAgICAgICAgIGNvbnN0IG9wdGlvbnMgPSB7IGtlZXBBbGl2ZTogdGhpcy5fa2VlcEFsaXZlLCBtYXhTb2NrZXRzIH07XG4gICAgICAgICAgICBhZ2VudCA9IHVzaW5nU3NsID8gbmV3IGh0dHBzLkFnZW50KG9wdGlvbnMpIDogbmV3IGh0dHAuQWdlbnQob3B0aW9ucyk7XG4gICAgICAgICAgICB0aGlzLl9hZ2VudCA9IGFnZW50O1xuICAgICAgICB9XG4gICAgICAgIGlmICh1c2luZ1NzbCAmJiB0aGlzLl9pZ25vcmVTc2xFcnJvcikge1xuICAgICAgICAgICAgLy8gd2UgZG9uJ3Qgd2FudCB0byBzZXQgTk9ERV9UTFNfUkVKRUNUX1VOQVVUSE9SSVpFRD0wIHNpbmNlIHRoYXQgd2lsbCBhZmZlY3QgcmVxdWVzdCBmb3IgZW50aXJlIHByb2Nlc3NcbiAgICAgICAgICAgIC8vIGh0dHAuUmVxdWVzdE9wdGlvbnMgZG9lc24ndCBleHBvc2UgYSB3YXkgdG8gbW9kaWZ5IFJlcXVlc3RPcHRpb25zLmFnZW50Lm9wdGlvbnNcbiAgICAgICAgICAgIC8vIHdlIGhhdmUgdG8gY2FzdCBpdCB0byBhbnkgYW5kIGNoYW5nZSBpdCBkaXJlY3RseVxuICAgICAgICAgICAgYWdlbnQub3B0aW9ucyA9IE9iamVjdC5hc3NpZ24oYWdlbnQub3B0aW9ucyB8fCB7fSwge1xuICAgICAgICAgICAgICAgIHJlamVjdFVuYXV0aG9yaXplZDogZmFsc2VcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBhZ2VudDtcbiAgICB9XG4gICAgX2dldFByb3h5QWdlbnREaXNwYXRjaGVyKHBhcnNlZFVybCwgcHJveHlVcmwpIHtcbiAgICAgICAgbGV0IHByb3h5QWdlbnQ7XG4gICAgICAgIGlmICh0aGlzLl9rZWVwQWxpdmUpIHtcbiAgICAgICAgICAgIHByb3h5QWdlbnQgPSB0aGlzLl9wcm94eUFnZW50RGlzcGF0Y2hlcjtcbiAgICAgICAgfVxuICAgICAgICAvLyBpZiBhZ2VudCBpcyBhbHJlYWR5IGFzc2lnbmVkIHVzZSB0aGF0IGFnZW50LlxuICAgICAgICBpZiAocHJveHlBZ2VudCkge1xuICAgICAgICAgICAgcmV0dXJuIHByb3h5QWdlbnQ7XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgdXNpbmdTc2wgPSBwYXJzZWRVcmwucHJvdG9jb2wgPT09ICdodHRwczonO1xuICAgICAgICBwcm94eUFnZW50ID0gbmV3IHVuZGljaV8xLlByb3h5QWdlbnQoT2JqZWN0LmFzc2lnbih7IHVyaTogcHJveHlVcmwuaHJlZiwgcGlwZWxpbmluZzogIXRoaXMuX2tlZXBBbGl2ZSA/IDAgOiAxIH0sICgocHJveHlVcmwudXNlcm5hbWUgfHwgcHJveHlVcmwucGFzc3dvcmQpICYmIHtcbiAgICAgICAgICAgIHRva2VuOiBgQmFzaWMgJHtCdWZmZXIuZnJvbShgJHtwcm94eVVybC51c2VybmFtZX06JHtwcm94eVVybC5wYXNzd29yZH1gKS50b1N0cmluZygnYmFzZTY0Jyl9YFxuICAgICAgICB9KSkpO1xuICAgICAgICB0aGlzLl9wcm94eUFnZW50RGlzcGF0Y2hlciA9IHByb3h5QWdlbnQ7XG4gICAgICAgIGlmICh1c2luZ1NzbCAmJiB0aGlzLl9pZ25vcmVTc2xFcnJvcikge1xuICAgICAgICAgICAgLy8gd2UgZG9uJ3Qgd2FudCB0byBzZXQgTk9ERV9UTFNfUkVKRUNUX1VOQVVUSE9SSVpFRD0wIHNpbmNlIHRoYXQgd2lsbCBhZmZlY3QgcmVxdWVzdCBmb3IgZW50aXJlIHByb2Nlc3NcbiAgICAgICAgICAgIC8vIGh0dHAuUmVxdWVzdE9wdGlvbnMgZG9lc24ndCBleHBvc2UgYSB3YXkgdG8gbW9kaWZ5IFJlcXVlc3RPcHRpb25zLmFnZW50Lm9wdGlvbnNcbiAgICAgICAgICAgIC8vIHdlIGhhdmUgdG8gY2FzdCBpdCB0byBhbnkgYW5kIGNoYW5nZSBpdCBkaXJlY3RseVxuICAgICAgICAgICAgcHJveHlBZ2VudC5vcHRpb25zID0gT2JqZWN0LmFzc2lnbihwcm94eUFnZW50Lm9wdGlvbnMucmVxdWVzdFRscyB8fCB7fSwge1xuICAgICAgICAgICAgICAgIHJlamVjdFVuYXV0aG9yaXplZDogZmFsc2VcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBwcm94eUFnZW50O1xuICAgIH1cbiAgICBfcGVyZm9ybUV4cG9uZW50aWFsQmFja29mZihyZXRyeU51bWJlcikge1xuICAgICAgICByZXR1cm4gX19hd2FpdGVyKHRoaXMsIHZvaWQgMCwgdm9pZCAwLCBmdW5jdGlvbiogKCkge1xuICAgICAgICAgICAgcmV0cnlOdW1iZXIgPSBNYXRoLm1pbihFeHBvbmVudGlhbEJhY2tvZmZDZWlsaW5nLCByZXRyeU51bWJlcik7XG4gICAgICAgICAgICBjb25zdCBtcyA9IEV4cG9uZW50aWFsQmFja29mZlRpbWVTbGljZSAqIE1hdGgucG93KDIsIHJldHJ5TnVtYmVyKTtcbiAgICAgICAgICAgIHJldHVybiBuZXcgUHJvbWlzZShyZXNvbHZlID0+IHNldFRpbWVvdXQoKCkgPT4gcmVzb2x2ZSgpLCBtcykpO1xuICAgICAgICB9KTtcbiAgICB9XG4gICAgX3Byb2Nlc3NSZXNwb25zZShyZXMsIG9wdGlvbnMpIHtcbiAgICAgICAgcmV0dXJuIF9fYXdhaXRlcih0aGlzLCB2b2lkIDAsIHZvaWQgMCwgZnVuY3Rpb24qICgpIHtcbiAgICAgICAgICAgIHJldHVybiBuZXcgUHJvbWlzZSgocmVzb2x2ZSwgcmVqZWN0KSA9PiBfX2F3YWl0ZXIodGhpcywgdm9pZCAwLCB2b2lkIDAsIGZ1bmN0aW9uKiAoKSB7XG4gICAgICAgICAgICAgICAgY29uc3Qgc3RhdHVzQ29kZSA9IHJlcy5tZXNzYWdlLnN0YXR1c0NvZGUgfHwgMDtcbiAgICAgICAgICAgICAgICBjb25zdCByZXNwb25zZSA9IHtcbiAgICAgICAgICAgICAgICAgICAgc3RhdHVzQ29kZSxcbiAgICAgICAgICAgICAgICAgICAgcmVzdWx0OiBudWxsLFxuICAgICAgICAgICAgICAgICAgICBoZWFkZXJzOiB7fVxuICAgICAgICAgICAgICAgIH07XG4gICAgICAgICAgICAgICAgLy8gbm90IGZvdW5kIGxlYWRzIHRvIG51bGwgb2JqIHJldHVybmVkXG4gICAgICAgICAgICAgICAgaWYgKHN0YXR1c0NvZGUgPT09IEh0dHBDb2Rlcy5Ob3RGb3VuZCkge1xuICAgICAgICAgICAgICAgICAgICByZXNvbHZlKHJlc3BvbnNlKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgLy8gZ2V0IHRoZSByZXN1bHQgZnJvbSB0aGUgYm9keVxuICAgICAgICAgICAgICAgIGZ1bmN0aW9uIGRhdGVUaW1lRGVzZXJpYWxpemVyKGtleSwgdmFsdWUpIHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKHR5cGVvZiB2YWx1ZSA9PT0gJ3N0cmluZycpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGEgPSBuZXcgRGF0ZSh2YWx1ZSk7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoIWlzTmFOKGEudmFsdWVPZigpKSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBhO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiB2YWx1ZTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgbGV0IG9iajtcbiAgICAgICAgICAgICAgICBsZXQgY29udGVudHM7XG4gICAgICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICAgICAgY29udGVudHMgPSB5aWVsZCByZXMucmVhZEJvZHkoKTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKGNvbnRlbnRzICYmIGNvbnRlbnRzLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChvcHRpb25zICYmIG9wdGlvbnMuZGVzZXJpYWxpemVEYXRlcykge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9iaiA9IEpTT04ucGFyc2UoY29udGVudHMsIGRhdGVUaW1lRGVzZXJpYWxpemVyKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9iaiA9IEpTT04ucGFyc2UoY29udGVudHMpO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgcmVzcG9uc2UucmVzdWx0ID0gb2JqO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIHJlc3BvbnNlLmhlYWRlcnMgPSByZXMubWVzc2FnZS5oZWFkZXJzO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBjYXRjaCAoZXJyKSB7XG4gICAgICAgICAgICAgICAgICAgIC8vIEludmFsaWQgcmVzb3VyY2UgKGNvbnRlbnRzIG5vdCBqc29uKTsgIGxlYXZpbmcgcmVzdWx0IG9iaiBudWxsXG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIC8vIG5vdGUgdGhhdCAzeHggcmVkaXJlY3RzIGFyZSBoYW5kbGVkIGJ5IHRoZSBodHRwIGxheWVyLlxuICAgICAgICAgICAgICAgIGlmIChzdGF0dXNDb2RlID4gMjk5KSB7XG4gICAgICAgICAgICAgICAgICAgIGxldCBtc2c7XG4gICAgICAgICAgICAgICAgICAgIC8vIGlmIGV4Y2VwdGlvbi9lcnJvciBpbiBib2R5LCBhdHRlbXB0IHRvIGdldCBiZXR0ZXIgZXJyb3JcbiAgICAgICAgICAgICAgICAgICAgaWYgKG9iaiAmJiBvYmoubWVzc2FnZSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgbXNnID0gb2JqLm1lc3NhZ2U7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgZWxzZSBpZiAoY29udGVudHMgJiYgY29udGVudHMubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgLy8gaXQgbWF5IGJlIHRoZSBjYXNlIHRoYXQgdGhlIGV4Y2VwdGlvbiBpcyBpbiB0aGUgYm9keSBtZXNzYWdlIGFzIHN0cmluZ1xuICAgICAgICAgICAgICAgICAgICAgICAgbXNnID0gY29udGVudHM7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBtc2cgPSBgRmFpbGVkIHJlcXVlc3Q6ICgke3N0YXR1c0NvZGV9KWA7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgY29uc3QgZXJyID0gbmV3IEh0dHBDbGllbnRFcnJvcihtc2csIHN0YXR1c0NvZGUpO1xuICAgICAgICAgICAgICAgICAgICBlcnIucmVzdWx0ID0gcmVzcG9uc2UucmVzdWx0O1xuICAgICAgICAgICAgICAgICAgICByZWplY3QoZXJyKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIHJlc29sdmUocmVzcG9uc2UpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0pKTtcbiAgICAgICAgfSk7XG4gICAgfVxufVxuZXhwb3J0cy5IdHRwQ2xpZW50ID0gSHR0cENsaWVudDtcbmNvbnN0IGxvd2VyY2FzZUtleXMgPSAob2JqKSA9PiBPYmplY3Qua2V5cyhvYmopLnJlZHVjZSgoYywgaykgPT4gKChjW2sudG9Mb3dlckNhc2UoKV0gPSBvYmpba10pLCBjKSwge30pO1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9aW5kZXguanMubWFwIiwKICAgICJcInVzZSBzdHJpY3RcIjtcbnZhciBfX2F3YWl0ZXIgPSAodGhpcyAmJiB0aGlzLl9fYXdhaXRlcikgfHwgZnVuY3Rpb24gKHRoaXNBcmcsIF9hcmd1bWVudHMsIFAsIGdlbmVyYXRvcikge1xuICAgIGZ1bmN0aW9uIGFkb3B0KHZhbHVlKSB7IHJldHVybiB2YWx1ZSBpbnN0YW5jZW9mIFAgPyB2YWx1ZSA6IG5ldyBQKGZ1bmN0aW9uIChyZXNvbHZlKSB7IHJlc29sdmUodmFsdWUpOyB9KTsgfVxuICAgIHJldHVybiBuZXcgKFAgfHwgKFAgPSBQcm9taXNlKSkoZnVuY3Rpb24gKHJlc29sdmUsIHJlamVjdCkge1xuICAgICAgICBmdW5jdGlvbiBmdWxmaWxsZWQodmFsdWUpIHsgdHJ5IHsgc3RlcChnZW5lcmF0b3IubmV4dCh2YWx1ZSkpOyB9IGNhdGNoIChlKSB7IHJlamVjdChlKTsgfSB9XG4gICAgICAgIGZ1bmN0aW9uIHJlamVjdGVkKHZhbHVlKSB7IHRyeSB7IHN0ZXAoZ2VuZXJhdG9yW1widGhyb3dcIl0odmFsdWUpKTsgfSBjYXRjaCAoZSkgeyByZWplY3QoZSk7IH0gfVxuICAgICAgICBmdW5jdGlvbiBzdGVwKHJlc3VsdCkgeyByZXN1bHQuZG9uZSA/IHJlc29sdmUocmVzdWx0LnZhbHVlKSA6IGFkb3B0KHJlc3VsdC52YWx1ZSkudGhlbihmdWxmaWxsZWQsIHJlamVjdGVkKTsgfVxuICAgICAgICBzdGVwKChnZW5lcmF0b3IgPSBnZW5lcmF0b3IuYXBwbHkodGhpc0FyZywgX2FyZ3VtZW50cyB8fCBbXSkpLm5leHQoKSk7XG4gICAgfSk7XG59O1xuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiX19lc01vZHVsZVwiLCB7IHZhbHVlOiB0cnVlIH0pO1xuZXhwb3J0cy5QZXJzb25hbEFjY2Vzc1Rva2VuQ3JlZGVudGlhbEhhbmRsZXIgPSBleHBvcnRzLkJlYXJlckNyZWRlbnRpYWxIYW5kbGVyID0gZXhwb3J0cy5CYXNpY0NyZWRlbnRpYWxIYW5kbGVyID0gdm9pZCAwO1xuY2xhc3MgQmFzaWNDcmVkZW50aWFsSGFuZGxlciB7XG4gICAgY29uc3RydWN0b3IodXNlcm5hbWUsIHBhc3N3b3JkKSB7XG4gICAgICAgIHRoaXMudXNlcm5hbWUgPSB1c2VybmFtZTtcbiAgICAgICAgdGhpcy5wYXNzd29yZCA9IHBhc3N3b3JkO1xuICAgIH1cbiAgICBwcmVwYXJlUmVxdWVzdChvcHRpb25zKSB7XG4gICAgICAgIGlmICghb3B0aW9ucy5oZWFkZXJzKSB7XG4gICAgICAgICAgICB0aHJvdyBFcnJvcignVGhlIHJlcXVlc3QgaGFzIG5vIGhlYWRlcnMnKTtcbiAgICAgICAgfVxuICAgICAgICBvcHRpb25zLmhlYWRlcnNbJ0F1dGhvcml6YXRpb24nXSA9IGBCYXNpYyAke0J1ZmZlci5mcm9tKGAke3RoaXMudXNlcm5hbWV9OiR7dGhpcy5wYXNzd29yZH1gKS50b1N0cmluZygnYmFzZTY0Jyl9YDtcbiAgICB9XG4gICAgLy8gVGhpcyBoYW5kbGVyIGNhbm5vdCBoYW5kbGUgNDAxXG4gICAgY2FuSGFuZGxlQXV0aGVudGljYXRpb24oKSB7XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gICAgaGFuZGxlQXV0aGVudGljYXRpb24oKSB7XG4gICAgICAgIHJldHVybiBfX2F3YWl0ZXIodGhpcywgdm9pZCAwLCB2b2lkIDAsIGZ1bmN0aW9uKiAoKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ25vdCBpbXBsZW1lbnRlZCcpO1xuICAgICAgICB9KTtcbiAgICB9XG59XG5leHBvcnRzLkJhc2ljQ3JlZGVudGlhbEhhbmRsZXIgPSBCYXNpY0NyZWRlbnRpYWxIYW5kbGVyO1xuY2xhc3MgQmVhcmVyQ3JlZGVudGlhbEhhbmRsZXIge1xuICAgIGNvbnN0cnVjdG9yKHRva2VuKSB7XG4gICAgICAgIHRoaXMudG9rZW4gPSB0b2tlbjtcbiAgICB9XG4gICAgLy8gY3VycmVudGx5IGltcGxlbWVudHMgcHJlLWF1dGhvcml6YXRpb25cbiAgICAvLyBUT0RPOiBzdXBwb3J0IHByZUF1dGggPSBmYWxzZSB3aGVyZSBpdCBob29rcyBvbiA0MDFcbiAgICBwcmVwYXJlUmVxdWVzdChvcHRpb25zKSB7XG4gICAgICAgIGlmICghb3B0aW9ucy5oZWFkZXJzKSB7XG4gICAgICAgICAgICB0aHJvdyBFcnJvcignVGhlIHJlcXVlc3QgaGFzIG5vIGhlYWRlcnMnKTtcbiAgICAgICAgfVxuICAgICAgICBvcHRpb25zLmhlYWRlcnNbJ0F1dGhvcml6YXRpb24nXSA9IGBCZWFyZXIgJHt0aGlzLnRva2VufWA7XG4gICAgfVxuICAgIC8vIFRoaXMgaGFuZGxlciBjYW5ub3QgaGFuZGxlIDQwMVxuICAgIGNhbkhhbmRsZUF1dGhlbnRpY2F0aW9uKCkge1xuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuICAgIGhhbmRsZUF1dGhlbnRpY2F0aW9uKCkge1xuICAgICAgICByZXR1cm4gX19hd2FpdGVyKHRoaXMsIHZvaWQgMCwgdm9pZCAwLCBmdW5jdGlvbiogKCkge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdub3QgaW1wbGVtZW50ZWQnKTtcbiAgICAgICAgfSk7XG4gICAgfVxufVxuZXhwb3J0cy5CZWFyZXJDcmVkZW50aWFsSGFuZGxlciA9IEJlYXJlckNyZWRlbnRpYWxIYW5kbGVyO1xuY2xhc3MgUGVyc29uYWxBY2Nlc3NUb2tlbkNyZWRlbnRpYWxIYW5kbGVyIHtcbiAgICBjb25zdHJ1Y3Rvcih0b2tlbikge1xuICAgICAgICB0aGlzLnRva2VuID0gdG9rZW47XG4gICAgfVxuICAgIC8vIGN1cnJlbnRseSBpbXBsZW1lbnRzIHByZS1hdXRob3JpemF0aW9uXG4gICAgLy8gVE9ETzogc3VwcG9ydCBwcmVBdXRoID0gZmFsc2Ugd2hlcmUgaXQgaG9va3Mgb24gNDAxXG4gICAgcHJlcGFyZVJlcXVlc3Qob3B0aW9ucykge1xuICAgICAgICBpZiAoIW9wdGlvbnMuaGVhZGVycykge1xuICAgICAgICAgICAgdGhyb3cgRXJyb3IoJ1RoZSByZXF1ZXN0IGhhcyBubyBoZWFkZXJzJyk7XG4gICAgICAgIH1cbiAgICAgICAgb3B0aW9ucy5oZWFkZXJzWydBdXRob3JpemF0aW9uJ10gPSBgQmFzaWMgJHtCdWZmZXIuZnJvbShgUEFUOiR7dGhpcy50b2tlbn1gKS50b1N0cmluZygnYmFzZTY0Jyl9YDtcbiAgICB9XG4gICAgLy8gVGhpcyBoYW5kbGVyIGNhbm5vdCBoYW5kbGUgNDAxXG4gICAgY2FuSGFuZGxlQXV0aGVudGljYXRpb24oKSB7XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gICAgaGFuZGxlQXV0aGVudGljYXRpb24oKSB7XG4gICAgICAgIHJldHVybiBfX2F3YWl0ZXIodGhpcywgdm9pZCAwLCB2b2lkIDAsIGZ1bmN0aW9uKiAoKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ25vdCBpbXBsZW1lbnRlZCcpO1xuICAgICAgICB9KTtcbiAgICB9XG59XG5leHBvcnRzLlBlcnNvbmFsQWNjZXNzVG9rZW5DcmVkZW50aWFsSGFuZGxlciA9IFBlcnNvbmFsQWNjZXNzVG9rZW5DcmVkZW50aWFsSGFuZGxlcjtcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPWF1dGguanMubWFwIiwKICAgICJcInVzZSBzdHJpY3RcIjtcbnZhciBfX2F3YWl0ZXIgPSAodGhpcyAmJiB0aGlzLl9fYXdhaXRlcikgfHwgZnVuY3Rpb24gKHRoaXNBcmcsIF9hcmd1bWVudHMsIFAsIGdlbmVyYXRvcikge1xuICAgIGZ1bmN0aW9uIGFkb3B0KHZhbHVlKSB7IHJldHVybiB2YWx1ZSBpbnN0YW5jZW9mIFAgPyB2YWx1ZSA6IG5ldyBQKGZ1bmN0aW9uIChyZXNvbHZlKSB7IHJlc29sdmUodmFsdWUpOyB9KTsgfVxuICAgIHJldHVybiBuZXcgKFAgfHwgKFAgPSBQcm9taXNlKSkoZnVuY3Rpb24gKHJlc29sdmUsIHJlamVjdCkge1xuICAgICAgICBmdW5jdGlvbiBmdWxmaWxsZWQodmFsdWUpIHsgdHJ5IHsgc3RlcChnZW5lcmF0b3IubmV4dCh2YWx1ZSkpOyB9IGNhdGNoIChlKSB7IHJlamVjdChlKTsgfSB9XG4gICAgICAgIGZ1bmN0aW9uIHJlamVjdGVkKHZhbHVlKSB7IHRyeSB7IHN0ZXAoZ2VuZXJhdG9yW1widGhyb3dcIl0odmFsdWUpKTsgfSBjYXRjaCAoZSkgeyByZWplY3QoZSk7IH0gfVxuICAgICAgICBmdW5jdGlvbiBzdGVwKHJlc3VsdCkgeyByZXN1bHQuZG9uZSA/IHJlc29sdmUocmVzdWx0LnZhbHVlKSA6IGFkb3B0KHJlc3VsdC52YWx1ZSkudGhlbihmdWxmaWxsZWQsIHJlamVjdGVkKTsgfVxuICAgICAgICBzdGVwKChnZW5lcmF0b3IgPSBnZW5lcmF0b3IuYXBwbHkodGhpc0FyZywgX2FyZ3VtZW50cyB8fCBbXSkpLm5leHQoKSk7XG4gICAgfSk7XG59O1xuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiX19lc01vZHVsZVwiLCB7IHZhbHVlOiB0cnVlIH0pO1xuZXhwb3J0cy5PaWRjQ2xpZW50ID0gdm9pZCAwO1xuY29uc3QgaHR0cF9jbGllbnRfMSA9IHJlcXVpcmUoXCJAYWN0aW9ucy9odHRwLWNsaWVudFwiKTtcbmNvbnN0IGF1dGhfMSA9IHJlcXVpcmUoXCJAYWN0aW9ucy9odHRwLWNsaWVudC9saWIvYXV0aFwiKTtcbmNvbnN0IGNvcmVfMSA9IHJlcXVpcmUoXCIuL2NvcmVcIik7XG5jbGFzcyBPaWRjQ2xpZW50IHtcbiAgICBzdGF0aWMgY3JlYXRlSHR0cENsaWVudChhbGxvd1JldHJ5ID0gdHJ1ZSwgbWF4UmV0cnkgPSAxMCkge1xuICAgICAgICBjb25zdCByZXF1ZXN0T3B0aW9ucyA9IHtcbiAgICAgICAgICAgIGFsbG93UmV0cmllczogYWxsb3dSZXRyeSxcbiAgICAgICAgICAgIG1heFJldHJpZXM6IG1heFJldHJ5XG4gICAgICAgIH07XG4gICAgICAgIHJldHVybiBuZXcgaHR0cF9jbGllbnRfMS5IdHRwQ2xpZW50KCdhY3Rpb25zL29pZGMtY2xpZW50JywgW25ldyBhdXRoXzEuQmVhcmVyQ3JlZGVudGlhbEhhbmRsZXIoT2lkY0NsaWVudC5nZXRSZXF1ZXN0VG9rZW4oKSldLCByZXF1ZXN0T3B0aW9ucyk7XG4gICAgfVxuICAgIHN0YXRpYyBnZXRSZXF1ZXN0VG9rZW4oKSB7XG4gICAgICAgIGNvbnN0IHRva2VuID0gcHJvY2Vzcy5lbnZbJ0FDVElPTlNfSURfVE9LRU5fUkVRVUVTVF9UT0tFTiddO1xuICAgICAgICBpZiAoIXRva2VuKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ1VuYWJsZSB0byBnZXQgQUNUSU9OU19JRF9UT0tFTl9SRVFVRVNUX1RPS0VOIGVudiB2YXJpYWJsZScpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB0b2tlbjtcbiAgICB9XG4gICAgc3RhdGljIGdldElEVG9rZW5VcmwoKSB7XG4gICAgICAgIGNvbnN0IHJ1bnRpbWVVcmwgPSBwcm9jZXNzLmVudlsnQUNUSU9OU19JRF9UT0tFTl9SRVFVRVNUX1VSTCddO1xuICAgICAgICBpZiAoIXJ1bnRpbWVVcmwpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcignVW5hYmxlIHRvIGdldCBBQ1RJT05TX0lEX1RPS0VOX1JFUVVFU1RfVVJMIGVudiB2YXJpYWJsZScpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBydW50aW1lVXJsO1xuICAgIH1cbiAgICBzdGF0aWMgZ2V0Q2FsbChpZF90b2tlbl91cmwpIHtcbiAgICAgICAgdmFyIF9hO1xuICAgICAgICByZXR1cm4gX19hd2FpdGVyKHRoaXMsIHZvaWQgMCwgdm9pZCAwLCBmdW5jdGlvbiogKCkge1xuICAgICAgICAgICAgY29uc3QgaHR0cGNsaWVudCA9IE9pZGNDbGllbnQuY3JlYXRlSHR0cENsaWVudCgpO1xuICAgICAgICAgICAgY29uc3QgcmVzID0geWllbGQgaHR0cGNsaWVudFxuICAgICAgICAgICAgICAgIC5nZXRKc29uKGlkX3Rva2VuX3VybClcbiAgICAgICAgICAgICAgICAuY2F0Y2goZXJyb3IgPT4ge1xuICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihgRmFpbGVkIHRvIGdldCBJRCBUb2tlbi4gXFxuIFxuICAgICAgICBFcnJvciBDb2RlIDogJHtlcnJvci5zdGF0dXNDb2RlfVxcbiBcbiAgICAgICAgRXJyb3IgTWVzc2FnZTogJHtlcnJvci5tZXNzYWdlfWApO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICBjb25zdCBpZF90b2tlbiA9IChfYSA9IHJlcy5yZXN1bHQpID09PSBudWxsIHx8IF9hID09PSB2b2lkIDAgPyB2b2lkIDAgOiBfYS52YWx1ZTtcbiAgICAgICAgICAgIGlmICghaWRfdG9rZW4pIHtcbiAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ1Jlc3BvbnNlIGpzb24gYm9keSBkbyBub3QgaGF2ZSBJRCBUb2tlbiBmaWVsZCcpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIGlkX3Rva2VuO1xuICAgICAgICB9KTtcbiAgICB9XG4gICAgc3RhdGljIGdldElEVG9rZW4oYXVkaWVuY2UpIHtcbiAgICAgICAgcmV0dXJuIF9fYXdhaXRlcih0aGlzLCB2b2lkIDAsIHZvaWQgMCwgZnVuY3Rpb24qICgpIHtcbiAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgLy8gTmV3IElEIFRva2VuIGlzIHJlcXVlc3RlZCBmcm9tIGFjdGlvbiBzZXJ2aWNlXG4gICAgICAgICAgICAgICAgbGV0IGlkX3Rva2VuX3VybCA9IE9pZGNDbGllbnQuZ2V0SURUb2tlblVybCgpO1xuICAgICAgICAgICAgICAgIGlmIChhdWRpZW5jZSkge1xuICAgICAgICAgICAgICAgICAgICBjb25zdCBlbmNvZGVkQXVkaWVuY2UgPSBlbmNvZGVVUklDb21wb25lbnQoYXVkaWVuY2UpO1xuICAgICAgICAgICAgICAgICAgICBpZF90b2tlbl91cmwgPSBgJHtpZF90b2tlbl91cmx9JmF1ZGllbmNlPSR7ZW5jb2RlZEF1ZGllbmNlfWA7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICgwLCBjb3JlXzEuZGVidWcpKGBJRCB0b2tlbiB1cmwgaXMgJHtpZF90b2tlbl91cmx9YCk7XG4gICAgICAgICAgICAgICAgY29uc3QgaWRfdG9rZW4gPSB5aWVsZCBPaWRjQ2xpZW50LmdldENhbGwoaWRfdG9rZW5fdXJsKTtcbiAgICAgICAgICAgICAgICAoMCwgY29yZV8xLnNldFNlY3JldCkoaWRfdG9rZW4pO1xuICAgICAgICAgICAgICAgIHJldHVybiBpZF90b2tlbjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGNhdGNoIChlcnJvcikge1xuICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihgRXJyb3IgbWVzc2FnZTogJHtlcnJvci5tZXNzYWdlfWApO1xuICAgICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICB9XG59XG5leHBvcnRzLk9pZGNDbGllbnQgPSBPaWRjQ2xpZW50O1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9b2lkYy11dGlscy5qcy5tYXAiLAogICAgIlwidXNlIHN0cmljdFwiO1xudmFyIF9fYXdhaXRlciA9ICh0aGlzICYmIHRoaXMuX19hd2FpdGVyKSB8fCBmdW5jdGlvbiAodGhpc0FyZywgX2FyZ3VtZW50cywgUCwgZ2VuZXJhdG9yKSB7XG4gICAgZnVuY3Rpb24gYWRvcHQodmFsdWUpIHsgcmV0dXJuIHZhbHVlIGluc3RhbmNlb2YgUCA/IHZhbHVlIDogbmV3IFAoZnVuY3Rpb24gKHJlc29sdmUpIHsgcmVzb2x2ZSh2YWx1ZSk7IH0pOyB9XG4gICAgcmV0dXJuIG5ldyAoUCB8fCAoUCA9IFByb21pc2UpKShmdW5jdGlvbiAocmVzb2x2ZSwgcmVqZWN0KSB7XG4gICAgICAgIGZ1bmN0aW9uIGZ1bGZpbGxlZCh2YWx1ZSkgeyB0cnkgeyBzdGVwKGdlbmVyYXRvci5uZXh0KHZhbHVlKSk7IH0gY2F0Y2ggKGUpIHsgcmVqZWN0KGUpOyB9IH1cbiAgICAgICAgZnVuY3Rpb24gcmVqZWN0ZWQodmFsdWUpIHsgdHJ5IHsgc3RlcChnZW5lcmF0b3JbXCJ0aHJvd1wiXSh2YWx1ZSkpOyB9IGNhdGNoIChlKSB7IHJlamVjdChlKTsgfSB9XG4gICAgICAgIGZ1bmN0aW9uIHN0ZXAocmVzdWx0KSB7IHJlc3VsdC5kb25lID8gcmVzb2x2ZShyZXN1bHQudmFsdWUpIDogYWRvcHQocmVzdWx0LnZhbHVlKS50aGVuKGZ1bGZpbGxlZCwgcmVqZWN0ZWQpOyB9XG4gICAgICAgIHN0ZXAoKGdlbmVyYXRvciA9IGdlbmVyYXRvci5hcHBseSh0aGlzQXJnLCBfYXJndW1lbnRzIHx8IFtdKSkubmV4dCgpKTtcbiAgICB9KTtcbn07XG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJfX2VzTW9kdWxlXCIsIHsgdmFsdWU6IHRydWUgfSk7XG5leHBvcnRzLnN1bW1hcnkgPSBleHBvcnRzLm1hcmtkb3duU3VtbWFyeSA9IGV4cG9ydHMuU1VNTUFSWV9ET0NTX1VSTCA9IGV4cG9ydHMuU1VNTUFSWV9FTlZfVkFSID0gdm9pZCAwO1xuY29uc3Qgb3NfMSA9IHJlcXVpcmUoXCJvc1wiKTtcbmNvbnN0IGZzXzEgPSByZXF1aXJlKFwiZnNcIik7XG5jb25zdCB7IGFjY2VzcywgYXBwZW5kRmlsZSwgd3JpdGVGaWxlIH0gPSBmc18xLnByb21pc2VzO1xuZXhwb3J0cy5TVU1NQVJZX0VOVl9WQVIgPSAnR0lUSFVCX1NURVBfU1VNTUFSWSc7XG5leHBvcnRzLlNVTU1BUllfRE9DU19VUkwgPSAnaHR0cHM6Ly9kb2NzLmdpdGh1Yi5jb20vYWN0aW9ucy91c2luZy13b3JrZmxvd3Mvd29ya2Zsb3ctY29tbWFuZHMtZm9yLWdpdGh1Yi1hY3Rpb25zI2FkZGluZy1hLWpvYi1zdW1tYXJ5JztcbmNsYXNzIFN1bW1hcnkge1xuICAgIGNvbnN0cnVjdG9yKCkge1xuICAgICAgICB0aGlzLl9idWZmZXIgPSAnJztcbiAgICB9XG4gICAgLyoqXG4gICAgICogRmluZHMgdGhlIHN1bW1hcnkgZmlsZSBwYXRoIGZyb20gdGhlIGVudmlyb25tZW50LCByZWplY3RzIGlmIGVudiB2YXIgaXMgbm90IGZvdW5kIG9yIGZpbGUgZG9lcyBub3QgZXhpc3RcbiAgICAgKiBBbHNvIGNoZWNrcyByL3cgcGVybWlzc2lvbnMuXG4gICAgICpcbiAgICAgKiBAcmV0dXJucyBzdGVwIHN1bW1hcnkgZmlsZSBwYXRoXG4gICAgICovXG4gICAgZmlsZVBhdGgoKSB7XG4gICAgICAgIHJldHVybiBfX2F3YWl0ZXIodGhpcywgdm9pZCAwLCB2b2lkIDAsIGZ1bmN0aW9uKiAoKSB7XG4gICAgICAgICAgICBpZiAodGhpcy5fZmlsZVBhdGgpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5fZmlsZVBhdGg7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBjb25zdCBwYXRoRnJvbUVudiA9IHByb2Nlc3MuZW52W2V4cG9ydHMuU1VNTUFSWV9FTlZfVkFSXTtcbiAgICAgICAgICAgIGlmICghcGF0aEZyb21FbnYpIHtcbiAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYFVuYWJsZSB0byBmaW5kIGVudmlyb25tZW50IHZhcmlhYmxlIGZvciAkJHtleHBvcnRzLlNVTU1BUllfRU5WX1ZBUn0uIENoZWNrIGlmIHlvdXIgcnVudGltZSBlbnZpcm9ubWVudCBzdXBwb3J0cyBqb2Igc3VtbWFyaWVzLmApO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICB5aWVsZCBhY2Nlc3MocGF0aEZyb21FbnYsIGZzXzEuY29uc3RhbnRzLlJfT0sgfCBmc18xLmNvbnN0YW50cy5XX09LKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGNhdGNoIChfYSkge1xuICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihgVW5hYmxlIHRvIGFjY2VzcyBzdW1tYXJ5IGZpbGU6ICcke3BhdGhGcm9tRW52fScuIENoZWNrIGlmIHRoZSBmaWxlIGhhcyBjb3JyZWN0IHJlYWQvd3JpdGUgcGVybWlzc2lvbnMuYCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICB0aGlzLl9maWxlUGF0aCA9IHBhdGhGcm9tRW52O1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMuX2ZpbGVQYXRoO1xuICAgICAgICB9KTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogV3JhcHMgY29udGVudCBpbiBhbiBIVE1MIHRhZywgYWRkaW5nIGFueSBIVE1MIGF0dHJpYnV0ZXNcbiAgICAgKlxuICAgICAqIEBwYXJhbSB7c3RyaW5nfSB0YWcgSFRNTCB0YWcgdG8gd3JhcFxuICAgICAqIEBwYXJhbSB7c3RyaW5nIHwgbnVsbH0gY29udGVudCBjb250ZW50IHdpdGhpbiB0aGUgdGFnXG4gICAgICogQHBhcmFtIHtbYXR0cmlidXRlOiBzdHJpbmddOiBzdHJpbmd9IGF0dHJzIGtleS12YWx1ZSBsaXN0IG9mIEhUTUwgYXR0cmlidXRlcyB0byBhZGRcbiAgICAgKlxuICAgICAqIEByZXR1cm5zIHtzdHJpbmd9IGNvbnRlbnQgd3JhcHBlZCBpbiBIVE1MIGVsZW1lbnRcbiAgICAgKi9cbiAgICB3cmFwKHRhZywgY29udGVudCwgYXR0cnMgPSB7fSkge1xuICAgICAgICBjb25zdCBodG1sQXR0cnMgPSBPYmplY3QuZW50cmllcyhhdHRycylcbiAgICAgICAgICAgIC5tYXAoKFtrZXksIHZhbHVlXSkgPT4gYCAke2tleX09XCIke3ZhbHVlfVwiYClcbiAgICAgICAgICAgIC5qb2luKCcnKTtcbiAgICAgICAgaWYgKCFjb250ZW50KSB7XG4gICAgICAgICAgICByZXR1cm4gYDwke3RhZ30ke2h0bWxBdHRyc30+YDtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gYDwke3RhZ30ke2h0bWxBdHRyc30+JHtjb250ZW50fTwvJHt0YWd9PmA7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIFdyaXRlcyB0ZXh0IGluIHRoZSBidWZmZXIgdG8gdGhlIHN1bW1hcnkgYnVmZmVyIGZpbGUgYW5kIGVtcHRpZXMgYnVmZmVyLiBXaWxsIGFwcGVuZCBieSBkZWZhdWx0LlxuICAgICAqXG4gICAgICogQHBhcmFtIHtTdW1tYXJ5V3JpdGVPcHRpb25zfSBbb3B0aW9uc10gKG9wdGlvbmFsKSBvcHRpb25zIGZvciB3cml0ZSBvcGVyYXRpb25cbiAgICAgKlxuICAgICAqIEByZXR1cm5zIHtQcm9taXNlPFN1bW1hcnk+fSBzdW1tYXJ5IGluc3RhbmNlXG4gICAgICovXG4gICAgd3JpdGUob3B0aW9ucykge1xuICAgICAgICByZXR1cm4gX19hd2FpdGVyKHRoaXMsIHZvaWQgMCwgdm9pZCAwLCBmdW5jdGlvbiogKCkge1xuICAgICAgICAgICAgY29uc3Qgb3ZlcndyaXRlID0gISEob3B0aW9ucyA9PT0gbnVsbCB8fCBvcHRpb25zID09PSB2b2lkIDAgPyB2b2lkIDAgOiBvcHRpb25zLm92ZXJ3cml0ZSk7XG4gICAgICAgICAgICBjb25zdCBmaWxlUGF0aCA9IHlpZWxkIHRoaXMuZmlsZVBhdGgoKTtcbiAgICAgICAgICAgIGNvbnN0IHdyaXRlRnVuYyA9IG92ZXJ3cml0ZSA/IHdyaXRlRmlsZSA6IGFwcGVuZEZpbGU7XG4gICAgICAgICAgICB5aWVsZCB3cml0ZUZ1bmMoZmlsZVBhdGgsIHRoaXMuX2J1ZmZlciwgeyBlbmNvZGluZzogJ3V0ZjgnIH0pO1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMuZW1wdHlCdWZmZXIoKTtcbiAgICAgICAgfSk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIENsZWFycyB0aGUgc3VtbWFyeSBidWZmZXIgYW5kIHdpcGVzIHRoZSBzdW1tYXJ5IGZpbGVcbiAgICAgKlxuICAgICAqIEByZXR1cm5zIHtTdW1tYXJ5fSBzdW1tYXJ5IGluc3RhbmNlXG4gICAgICovXG4gICAgY2xlYXIoKSB7XG4gICAgICAgIHJldHVybiBfX2F3YWl0ZXIodGhpcywgdm9pZCAwLCB2b2lkIDAsIGZ1bmN0aW9uKiAoKSB7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy5lbXB0eUJ1ZmZlcigpLndyaXRlKHsgb3ZlcndyaXRlOiB0cnVlIH0pO1xuICAgICAgICB9KTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogUmV0dXJucyB0aGUgY3VycmVudCBzdW1tYXJ5IGJ1ZmZlciBhcyBhIHN0cmluZ1xuICAgICAqXG4gICAgICogQHJldHVybnMge3N0cmluZ30gc3RyaW5nIG9mIHN1bW1hcnkgYnVmZmVyXG4gICAgICovXG4gICAgc3RyaW5naWZ5KCkge1xuICAgICAgICByZXR1cm4gdGhpcy5fYnVmZmVyO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBJZiB0aGUgc3VtbWFyeSBidWZmZXIgaXMgZW1wdHlcbiAgICAgKlxuICAgICAqIEByZXR1cm5zIHtib29sZW59IHRydWUgaWYgdGhlIGJ1ZmZlciBpcyBlbXB0eVxuICAgICAqL1xuICAgIGlzRW1wdHlCdWZmZXIoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLl9idWZmZXIubGVuZ3RoID09PSAwO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBSZXNldHMgdGhlIHN1bW1hcnkgYnVmZmVyIHdpdGhvdXQgd3JpdGluZyB0byBzdW1tYXJ5IGZpbGVcbiAgICAgKlxuICAgICAqIEByZXR1cm5zIHtTdW1tYXJ5fSBzdW1tYXJ5IGluc3RhbmNlXG4gICAgICovXG4gICAgZW1wdHlCdWZmZXIoKSB7XG4gICAgICAgIHRoaXMuX2J1ZmZlciA9ICcnO1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9XG4gICAgLyoqXG4gICAgICogQWRkcyByYXcgdGV4dCB0byB0aGUgc3VtbWFyeSBidWZmZXJcbiAgICAgKlxuICAgICAqIEBwYXJhbSB7c3RyaW5nfSB0ZXh0IGNvbnRlbnQgdG8gYWRkXG4gICAgICogQHBhcmFtIHtib29sZWFufSBbYWRkRU9MPWZhbHNlXSAob3B0aW9uYWwpIGFwcGVuZCBhbiBFT0wgdG8gdGhlIHJhdyB0ZXh0IChkZWZhdWx0OiBmYWxzZSlcbiAgICAgKlxuICAgICAqIEByZXR1cm5zIHtTdW1tYXJ5fSBzdW1tYXJ5IGluc3RhbmNlXG4gICAgICovXG4gICAgYWRkUmF3KHRleHQsIGFkZEVPTCA9IGZhbHNlKSB7XG4gICAgICAgIHRoaXMuX2J1ZmZlciArPSB0ZXh0O1xuICAgICAgICByZXR1cm4gYWRkRU9MID8gdGhpcy5hZGRFT0woKSA6IHRoaXM7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIEFkZHMgdGhlIG9wZXJhdGluZyBzeXN0ZW0tc3BlY2lmaWMgZW5kLW9mLWxpbmUgbWFya2VyIHRvIHRoZSBidWZmZXJcbiAgICAgKlxuICAgICAqIEByZXR1cm5zIHtTdW1tYXJ5fSBzdW1tYXJ5IGluc3RhbmNlXG4gICAgICovXG4gICAgYWRkRU9MKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5hZGRSYXcob3NfMS5FT0wpO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBBZGRzIGFuIEhUTUwgY29kZWJsb2NrIHRvIHRoZSBzdW1tYXJ5IGJ1ZmZlclxuICAgICAqXG4gICAgICogQHBhcmFtIHtzdHJpbmd9IGNvZGUgY29udGVudCB0byByZW5kZXIgd2l0aGluIGZlbmNlZCBjb2RlIGJsb2NrXG4gICAgICogQHBhcmFtIHtzdHJpbmd9IGxhbmcgKG9wdGlvbmFsKSBsYW5ndWFnZSB0byBzeW50YXggaGlnaGxpZ2h0IGNvZGVcbiAgICAgKlxuICAgICAqIEByZXR1cm5zIHtTdW1tYXJ5fSBzdW1tYXJ5IGluc3RhbmNlXG4gICAgICovXG4gICAgYWRkQ29kZUJsb2NrKGNvZGUsIGxhbmcpIHtcbiAgICAgICAgY29uc3QgYXR0cnMgPSBPYmplY3QuYXNzaWduKHt9LCAobGFuZyAmJiB7IGxhbmcgfSkpO1xuICAgICAgICBjb25zdCBlbGVtZW50ID0gdGhpcy53cmFwKCdwcmUnLCB0aGlzLndyYXAoJ2NvZGUnLCBjb2RlKSwgYXR0cnMpO1xuICAgICAgICByZXR1cm4gdGhpcy5hZGRSYXcoZWxlbWVudCkuYWRkRU9MKCk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIEFkZHMgYW4gSFRNTCBsaXN0IHRvIHRoZSBzdW1tYXJ5IGJ1ZmZlclxuICAgICAqXG4gICAgICogQHBhcmFtIHtzdHJpbmdbXX0gaXRlbXMgbGlzdCBvZiBpdGVtcyB0byByZW5kZXJcbiAgICAgKiBAcGFyYW0ge2Jvb2xlYW59IFtvcmRlcmVkPWZhbHNlXSAob3B0aW9uYWwpIGlmIHRoZSByZW5kZXJlZCBsaXN0IHNob3VsZCBiZSBvcmRlcmVkIG9yIG5vdCAoZGVmYXVsdDogZmFsc2UpXG4gICAgICpcbiAgICAgKiBAcmV0dXJucyB7U3VtbWFyeX0gc3VtbWFyeSBpbnN0YW5jZVxuICAgICAqL1xuICAgIGFkZExpc3QoaXRlbXMsIG9yZGVyZWQgPSBmYWxzZSkge1xuICAgICAgICBjb25zdCB0YWcgPSBvcmRlcmVkID8gJ29sJyA6ICd1bCc7XG4gICAgICAgIGNvbnN0IGxpc3RJdGVtcyA9IGl0ZW1zLm1hcChpdGVtID0+IHRoaXMud3JhcCgnbGknLCBpdGVtKSkuam9pbignJyk7XG4gICAgICAgIGNvbnN0IGVsZW1lbnQgPSB0aGlzLndyYXAodGFnLCBsaXN0SXRlbXMpO1xuICAgICAgICByZXR1cm4gdGhpcy5hZGRSYXcoZWxlbWVudCkuYWRkRU9MKCk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIEFkZHMgYW4gSFRNTCB0YWJsZSB0byB0aGUgc3VtbWFyeSBidWZmZXJcbiAgICAgKlxuICAgICAqIEBwYXJhbSB7U3VtbWFyeVRhYmxlQ2VsbFtdfSByb3dzIHRhYmxlIHJvd3NcbiAgICAgKlxuICAgICAqIEByZXR1cm5zIHtTdW1tYXJ5fSBzdW1tYXJ5IGluc3RhbmNlXG4gICAgICovXG4gICAgYWRkVGFibGUocm93cykge1xuICAgICAgICBjb25zdCB0YWJsZUJvZHkgPSByb3dzXG4gICAgICAgICAgICAubWFwKHJvdyA9PiB7XG4gICAgICAgICAgICBjb25zdCBjZWxscyA9IHJvd1xuICAgICAgICAgICAgICAgIC5tYXAoY2VsbCA9PiB7XG4gICAgICAgICAgICAgICAgaWYgKHR5cGVvZiBjZWxsID09PSAnc3RyaW5nJykge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy53cmFwKCd0ZCcsIGNlbGwpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBjb25zdCB7IGhlYWRlciwgZGF0YSwgY29sc3Bhbiwgcm93c3BhbiB9ID0gY2VsbDtcbiAgICAgICAgICAgICAgICBjb25zdCB0YWcgPSBoZWFkZXIgPyAndGgnIDogJ3RkJztcbiAgICAgICAgICAgICAgICBjb25zdCBhdHRycyA9IE9iamVjdC5hc3NpZ24oT2JqZWN0LmFzc2lnbih7fSwgKGNvbHNwYW4gJiYgeyBjb2xzcGFuIH0pKSwgKHJvd3NwYW4gJiYgeyByb3dzcGFuIH0pKTtcbiAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy53cmFwKHRhZywgZGF0YSwgYXR0cnMpO1xuICAgICAgICAgICAgfSlcbiAgICAgICAgICAgICAgICAuam9pbignJyk7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy53cmFwKCd0cicsIGNlbGxzKTtcbiAgICAgICAgfSlcbiAgICAgICAgICAgIC5qb2luKCcnKTtcbiAgICAgICAgY29uc3QgZWxlbWVudCA9IHRoaXMud3JhcCgndGFibGUnLCB0YWJsZUJvZHkpO1xuICAgICAgICByZXR1cm4gdGhpcy5hZGRSYXcoZWxlbWVudCkuYWRkRU9MKCk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIEFkZHMgYSBjb2xsYXBzYWJsZSBIVE1MIGRldGFpbHMgZWxlbWVudCB0byB0aGUgc3VtbWFyeSBidWZmZXJcbiAgICAgKlxuICAgICAqIEBwYXJhbSB7c3RyaW5nfSBsYWJlbCB0ZXh0IGZvciB0aGUgY2xvc2VkIHN0YXRlXG4gICAgICogQHBhcmFtIHtzdHJpbmd9IGNvbnRlbnQgY29sbGFwc2FibGUgY29udGVudFxuICAgICAqXG4gICAgICogQHJldHVybnMge1N1bW1hcnl9IHN1bW1hcnkgaW5zdGFuY2VcbiAgICAgKi9cbiAgICBhZGREZXRhaWxzKGxhYmVsLCBjb250ZW50KSB7XG4gICAgICAgIGNvbnN0IGVsZW1lbnQgPSB0aGlzLndyYXAoJ2RldGFpbHMnLCB0aGlzLndyYXAoJ3N1bW1hcnknLCBsYWJlbCkgKyBjb250ZW50KTtcbiAgICAgICAgcmV0dXJuIHRoaXMuYWRkUmF3KGVsZW1lbnQpLmFkZEVPTCgpO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBBZGRzIGFuIEhUTUwgaW1hZ2UgdGFnIHRvIHRoZSBzdW1tYXJ5IGJ1ZmZlclxuICAgICAqXG4gICAgICogQHBhcmFtIHtzdHJpbmd9IHNyYyBwYXRoIHRvIHRoZSBpbWFnZSB5b3UgdG8gZW1iZWRcbiAgICAgKiBAcGFyYW0ge3N0cmluZ30gYWx0IHRleHQgZGVzY3JpcHRpb24gb2YgdGhlIGltYWdlXG4gICAgICogQHBhcmFtIHtTdW1tYXJ5SW1hZ2VPcHRpb25zfSBvcHRpb25zIChvcHRpb25hbCkgYWRkaXRpb24gaW1hZ2UgYXR0cmlidXRlc1xuICAgICAqXG4gICAgICogQHJldHVybnMge1N1bW1hcnl9IHN1bW1hcnkgaW5zdGFuY2VcbiAgICAgKi9cbiAgICBhZGRJbWFnZShzcmMsIGFsdCwgb3B0aW9ucykge1xuICAgICAgICBjb25zdCB7IHdpZHRoLCBoZWlnaHQgfSA9IG9wdGlvbnMgfHwge307XG4gICAgICAgIGNvbnN0IGF0dHJzID0gT2JqZWN0LmFzc2lnbihPYmplY3QuYXNzaWduKHt9LCAod2lkdGggJiYgeyB3aWR0aCB9KSksIChoZWlnaHQgJiYgeyBoZWlnaHQgfSkpO1xuICAgICAgICBjb25zdCBlbGVtZW50ID0gdGhpcy53cmFwKCdpbWcnLCBudWxsLCBPYmplY3QuYXNzaWduKHsgc3JjLCBhbHQgfSwgYXR0cnMpKTtcbiAgICAgICAgcmV0dXJuIHRoaXMuYWRkUmF3KGVsZW1lbnQpLmFkZEVPTCgpO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBBZGRzIGFuIEhUTUwgc2VjdGlvbiBoZWFkaW5nIGVsZW1lbnRcbiAgICAgKlxuICAgICAqIEBwYXJhbSB7c3RyaW5nfSB0ZXh0IGhlYWRpbmcgdGV4dFxuICAgICAqIEBwYXJhbSB7bnVtYmVyIHwgc3RyaW5nfSBbbGV2ZWw9MV0gKG9wdGlvbmFsKSB0aGUgaGVhZGluZyBsZXZlbCwgZGVmYXVsdDogMVxuICAgICAqXG4gICAgICogQHJldHVybnMge1N1bW1hcnl9IHN1bW1hcnkgaW5zdGFuY2VcbiAgICAgKi9cbiAgICBhZGRIZWFkaW5nKHRleHQsIGxldmVsKSB7XG4gICAgICAgIGNvbnN0IHRhZyA9IGBoJHtsZXZlbH1gO1xuICAgICAgICBjb25zdCBhbGxvd2VkVGFnID0gWydoMScsICdoMicsICdoMycsICdoNCcsICdoNScsICdoNiddLmluY2x1ZGVzKHRhZylcbiAgICAgICAgICAgID8gdGFnXG4gICAgICAgICAgICA6ICdoMSc7XG4gICAgICAgIGNvbnN0IGVsZW1lbnQgPSB0aGlzLndyYXAoYWxsb3dlZFRhZywgdGV4dCk7XG4gICAgICAgIHJldHVybiB0aGlzLmFkZFJhdyhlbGVtZW50KS5hZGRFT0woKTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogQWRkcyBhbiBIVE1MIHRoZW1hdGljIGJyZWFrICg8aHI+KSB0byB0aGUgc3VtbWFyeSBidWZmZXJcbiAgICAgKlxuICAgICAqIEByZXR1cm5zIHtTdW1tYXJ5fSBzdW1tYXJ5IGluc3RhbmNlXG4gICAgICovXG4gICAgYWRkU2VwYXJhdG9yKCkge1xuICAgICAgICBjb25zdCBlbGVtZW50ID0gdGhpcy53cmFwKCdocicsIG51bGwpO1xuICAgICAgICByZXR1cm4gdGhpcy5hZGRSYXcoZWxlbWVudCkuYWRkRU9MKCk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIEFkZHMgYW4gSFRNTCBsaW5lIGJyZWFrICg8YnI+KSB0byB0aGUgc3VtbWFyeSBidWZmZXJcbiAgICAgKlxuICAgICAqIEByZXR1cm5zIHtTdW1tYXJ5fSBzdW1tYXJ5IGluc3RhbmNlXG4gICAgICovXG4gICAgYWRkQnJlYWsoKSB7XG4gICAgICAgIGNvbnN0IGVsZW1lbnQgPSB0aGlzLndyYXAoJ2JyJywgbnVsbCk7XG4gICAgICAgIHJldHVybiB0aGlzLmFkZFJhdyhlbGVtZW50KS5hZGRFT0woKTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogQWRkcyBhbiBIVE1MIGJsb2NrcXVvdGUgdG8gdGhlIHN1bW1hcnkgYnVmZmVyXG4gICAgICpcbiAgICAgKiBAcGFyYW0ge3N0cmluZ30gdGV4dCBxdW90ZSB0ZXh0XG4gICAgICogQHBhcmFtIHtzdHJpbmd9IGNpdGUgKG9wdGlvbmFsKSBjaXRhdGlvbiB1cmxcbiAgICAgKlxuICAgICAqIEByZXR1cm5zIHtTdW1tYXJ5fSBzdW1tYXJ5IGluc3RhbmNlXG4gICAgICovXG4gICAgYWRkUXVvdGUodGV4dCwgY2l0ZSkge1xuICAgICAgICBjb25zdCBhdHRycyA9IE9iamVjdC5hc3NpZ24oe30sIChjaXRlICYmIHsgY2l0ZSB9KSk7XG4gICAgICAgIGNvbnN0IGVsZW1lbnQgPSB0aGlzLndyYXAoJ2Jsb2NrcXVvdGUnLCB0ZXh0LCBhdHRycyk7XG4gICAgICAgIHJldHVybiB0aGlzLmFkZFJhdyhlbGVtZW50KS5hZGRFT0woKTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogQWRkcyBhbiBIVE1MIGFuY2hvciB0YWcgdG8gdGhlIHN1bW1hcnkgYnVmZmVyXG4gICAgICpcbiAgICAgKiBAcGFyYW0ge3N0cmluZ30gdGV4dCBsaW5rIHRleHQvY29udGVudFxuICAgICAqIEBwYXJhbSB7c3RyaW5nfSBocmVmIGh5cGVybGlua1xuICAgICAqXG4gICAgICogQHJldHVybnMge1N1bW1hcnl9IHN1bW1hcnkgaW5zdGFuY2VcbiAgICAgKi9cbiAgICBhZGRMaW5rKHRleHQsIGhyZWYpIHtcbiAgICAgICAgY29uc3QgZWxlbWVudCA9IHRoaXMud3JhcCgnYScsIHRleHQsIHsgaHJlZiB9KTtcbiAgICAgICAgcmV0dXJuIHRoaXMuYWRkUmF3KGVsZW1lbnQpLmFkZEVPTCgpO1xuICAgIH1cbn1cbmNvbnN0IF9zdW1tYXJ5ID0gbmV3IFN1bW1hcnkoKTtcbi8qKlxuICogQGRlcHJlY2F0ZWQgdXNlIGBjb3JlLnN1bW1hcnlgXG4gKi9cbmV4cG9ydHMubWFya2Rvd25TdW1tYXJ5ID0gX3N1bW1hcnk7XG5leHBvcnRzLnN1bW1hcnkgPSBfc3VtbWFyeTtcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPXN1bW1hcnkuanMubWFwIiwKICAgICJcInVzZSBzdHJpY3RcIjtcbnZhciBfX2NyZWF0ZUJpbmRpbmcgPSAodGhpcyAmJiB0aGlzLl9fY3JlYXRlQmluZGluZykgfHwgKE9iamVjdC5jcmVhdGUgPyAoZnVuY3Rpb24obywgbSwgaywgazIpIHtcbiAgICBpZiAoazIgPT09IHVuZGVmaW5lZCkgazIgPSBrO1xuICAgIHZhciBkZXNjID0gT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcihtLCBrKTtcbiAgICBpZiAoIWRlc2MgfHwgKFwiZ2V0XCIgaW4gZGVzYyA/ICFtLl9fZXNNb2R1bGUgOiBkZXNjLndyaXRhYmxlIHx8IGRlc2MuY29uZmlndXJhYmxlKSkge1xuICAgICAgZGVzYyA9IHsgZW51bWVyYWJsZTogdHJ1ZSwgZ2V0OiBmdW5jdGlvbigpIHsgcmV0dXJuIG1ba107IH0gfTtcbiAgICB9XG4gICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KG8sIGsyLCBkZXNjKTtcbn0pIDogKGZ1bmN0aW9uKG8sIG0sIGssIGsyKSB7XG4gICAgaWYgKGsyID09PSB1bmRlZmluZWQpIGsyID0gaztcbiAgICBvW2syXSA9IG1ba107XG59KSk7XG52YXIgX19zZXRNb2R1bGVEZWZhdWx0ID0gKHRoaXMgJiYgdGhpcy5fX3NldE1vZHVsZURlZmF1bHQpIHx8IChPYmplY3QuY3JlYXRlID8gKGZ1bmN0aW9uKG8sIHYpIHtcbiAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkobywgXCJkZWZhdWx0XCIsIHsgZW51bWVyYWJsZTogdHJ1ZSwgdmFsdWU6IHYgfSk7XG59KSA6IGZ1bmN0aW9uKG8sIHYpIHtcbiAgICBvW1wiZGVmYXVsdFwiXSA9IHY7XG59KTtcbnZhciBfX2ltcG9ydFN0YXIgPSAodGhpcyAmJiB0aGlzLl9faW1wb3J0U3RhcikgfHwgZnVuY3Rpb24gKG1vZCkge1xuICAgIGlmIChtb2QgJiYgbW9kLl9fZXNNb2R1bGUpIHJldHVybiBtb2Q7XG4gICAgdmFyIHJlc3VsdCA9IHt9O1xuICAgIGlmIChtb2QgIT0gbnVsbCkgZm9yICh2YXIgayBpbiBtb2QpIGlmIChrICE9PSBcImRlZmF1bHRcIiAmJiBPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwobW9kLCBrKSkgX19jcmVhdGVCaW5kaW5nKHJlc3VsdCwgbW9kLCBrKTtcbiAgICBfX3NldE1vZHVsZURlZmF1bHQocmVzdWx0LCBtb2QpO1xuICAgIHJldHVybiByZXN1bHQ7XG59O1xuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiX19lc01vZHVsZVwiLCB7IHZhbHVlOiB0cnVlIH0pO1xuZXhwb3J0cy50b1BsYXRmb3JtUGF0aCA9IGV4cG9ydHMudG9XaW4zMlBhdGggPSBleHBvcnRzLnRvUG9zaXhQYXRoID0gdm9pZCAwO1xuY29uc3QgcGF0aCA9IF9faW1wb3J0U3RhcihyZXF1aXJlKFwicGF0aFwiKSk7XG4vKipcbiAqIHRvUG9zaXhQYXRoIGNvbnZlcnRzIHRoZSBnaXZlbiBwYXRoIHRvIHRoZSBwb3NpeCBmb3JtLiBPbiBXaW5kb3dzLCBcXFxcIHdpbGwgYmVcbiAqIHJlcGxhY2VkIHdpdGggLy5cbiAqXG4gKiBAcGFyYW0gcHRoLiBQYXRoIHRvIHRyYW5zZm9ybS5cbiAqIEByZXR1cm4gc3RyaW5nIFBvc2l4IHBhdGguXG4gKi9cbmZ1bmN0aW9uIHRvUG9zaXhQYXRoKHB0aCkge1xuICAgIHJldHVybiBwdGgucmVwbGFjZSgvW1xcXFxdL2csICcvJyk7XG59XG5leHBvcnRzLnRvUG9zaXhQYXRoID0gdG9Qb3NpeFBhdGg7XG4vKipcbiAqIHRvV2luMzJQYXRoIGNvbnZlcnRzIHRoZSBnaXZlbiBwYXRoIHRvIHRoZSB3aW4zMiBmb3JtLiBPbiBMaW51eCwgLyB3aWxsIGJlXG4gKiByZXBsYWNlZCB3aXRoIFxcXFwuXG4gKlxuICogQHBhcmFtIHB0aC4gUGF0aCB0byB0cmFuc2Zvcm0uXG4gKiBAcmV0dXJuIHN0cmluZyBXaW4zMiBwYXRoLlxuICovXG5mdW5jdGlvbiB0b1dpbjMyUGF0aChwdGgpIHtcbiAgICByZXR1cm4gcHRoLnJlcGxhY2UoL1svXS9nLCAnXFxcXCcpO1xufVxuZXhwb3J0cy50b1dpbjMyUGF0aCA9IHRvV2luMzJQYXRoO1xuLyoqXG4gKiB0b1BsYXRmb3JtUGF0aCBjb252ZXJ0cyB0aGUgZ2l2ZW4gcGF0aCB0byBhIHBsYXRmb3JtLXNwZWNpZmljIHBhdGguIEl0IGRvZXNcbiAqIHRoaXMgYnkgcmVwbGFjaW5nIGluc3RhbmNlcyBvZiAvIGFuZCBcXCB3aXRoIHRoZSBwbGF0Zm9ybS1zcGVjaWZpYyBwYXRoXG4gKiBzZXBhcmF0b3IuXG4gKlxuICogQHBhcmFtIHB0aCBUaGUgcGF0aCB0byBwbGF0Zm9ybWl6ZS5cbiAqIEByZXR1cm4gc3RyaW5nIFRoZSBwbGF0Zm9ybS1zcGVjaWZpYyBwYXRoLlxuICovXG5mdW5jdGlvbiB0b1BsYXRmb3JtUGF0aChwdGgpIHtcbiAgICByZXR1cm4gcHRoLnJlcGxhY2UoL1svXFxcXF0vZywgcGF0aC5zZXApO1xufVxuZXhwb3J0cy50b1BsYXRmb3JtUGF0aCA9IHRvUGxhdGZvcm1QYXRoO1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9cGF0aC11dGlscy5qcy5tYXAiLAogICAgIlwidXNlIHN0cmljdFwiO1xudmFyIF9fY3JlYXRlQmluZGluZyA9ICh0aGlzICYmIHRoaXMuX19jcmVhdGVCaW5kaW5nKSB8fCAoT2JqZWN0LmNyZWF0ZSA/IChmdW5jdGlvbihvLCBtLCBrLCBrMikge1xuICAgIGlmIChrMiA9PT0gdW5kZWZpbmVkKSBrMiA9IGs7XG4gICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KG8sIGsyLCB7IGVudW1lcmFibGU6IHRydWUsIGdldDogZnVuY3Rpb24oKSB7IHJldHVybiBtW2tdOyB9IH0pO1xufSkgOiAoZnVuY3Rpb24obywgbSwgaywgazIpIHtcbiAgICBpZiAoazIgPT09IHVuZGVmaW5lZCkgazIgPSBrO1xuICAgIG9bazJdID0gbVtrXTtcbn0pKTtcbnZhciBfX3NldE1vZHVsZURlZmF1bHQgPSAodGhpcyAmJiB0aGlzLl9fc2V0TW9kdWxlRGVmYXVsdCkgfHwgKE9iamVjdC5jcmVhdGUgPyAoZnVuY3Rpb24obywgdikge1xuICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShvLCBcImRlZmF1bHRcIiwgeyBlbnVtZXJhYmxlOiB0cnVlLCB2YWx1ZTogdiB9KTtcbn0pIDogZnVuY3Rpb24obywgdikge1xuICAgIG9bXCJkZWZhdWx0XCJdID0gdjtcbn0pO1xudmFyIF9faW1wb3J0U3RhciA9ICh0aGlzICYmIHRoaXMuX19pbXBvcnRTdGFyKSB8fCBmdW5jdGlvbiAobW9kKSB7XG4gICAgaWYgKG1vZCAmJiBtb2QuX19lc01vZHVsZSkgcmV0dXJuIG1vZDtcbiAgICB2YXIgcmVzdWx0ID0ge307XG4gICAgaWYgKG1vZCAhPSBudWxsKSBmb3IgKHZhciBrIGluIG1vZCkgaWYgKGsgIT09IFwiZGVmYXVsdFwiICYmIE9iamVjdC5oYXNPd25Qcm9wZXJ0eS5jYWxsKG1vZCwgaykpIF9fY3JlYXRlQmluZGluZyhyZXN1bHQsIG1vZCwgayk7XG4gICAgX19zZXRNb2R1bGVEZWZhdWx0KHJlc3VsdCwgbW9kKTtcbiAgICByZXR1cm4gcmVzdWx0O1xufTtcbnZhciBfX2F3YWl0ZXIgPSAodGhpcyAmJiB0aGlzLl9fYXdhaXRlcikgfHwgZnVuY3Rpb24gKHRoaXNBcmcsIF9hcmd1bWVudHMsIFAsIGdlbmVyYXRvcikge1xuICAgIGZ1bmN0aW9uIGFkb3B0KHZhbHVlKSB7IHJldHVybiB2YWx1ZSBpbnN0YW5jZW9mIFAgPyB2YWx1ZSA6IG5ldyBQKGZ1bmN0aW9uIChyZXNvbHZlKSB7IHJlc29sdmUodmFsdWUpOyB9KTsgfVxuICAgIHJldHVybiBuZXcgKFAgfHwgKFAgPSBQcm9taXNlKSkoZnVuY3Rpb24gKHJlc29sdmUsIHJlamVjdCkge1xuICAgICAgICBmdW5jdGlvbiBmdWxmaWxsZWQodmFsdWUpIHsgdHJ5IHsgc3RlcChnZW5lcmF0b3IubmV4dCh2YWx1ZSkpOyB9IGNhdGNoIChlKSB7IHJlamVjdChlKTsgfSB9XG4gICAgICAgIGZ1bmN0aW9uIHJlamVjdGVkKHZhbHVlKSB7IHRyeSB7IHN0ZXAoZ2VuZXJhdG9yW1widGhyb3dcIl0odmFsdWUpKTsgfSBjYXRjaCAoZSkgeyByZWplY3QoZSk7IH0gfVxuICAgICAgICBmdW5jdGlvbiBzdGVwKHJlc3VsdCkgeyByZXN1bHQuZG9uZSA/IHJlc29sdmUocmVzdWx0LnZhbHVlKSA6IGFkb3B0KHJlc3VsdC52YWx1ZSkudGhlbihmdWxmaWxsZWQsIHJlamVjdGVkKTsgfVxuICAgICAgICBzdGVwKChnZW5lcmF0b3IgPSBnZW5lcmF0b3IuYXBwbHkodGhpc0FyZywgX2FyZ3VtZW50cyB8fCBbXSkpLm5leHQoKSk7XG4gICAgfSk7XG59O1xudmFyIF9hO1xuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiX19lc01vZHVsZVwiLCB7IHZhbHVlOiB0cnVlIH0pO1xuZXhwb3J0cy5nZXRDbWRQYXRoID0gZXhwb3J0cy50cnlHZXRFeGVjdXRhYmxlUGF0aCA9IGV4cG9ydHMuaXNSb290ZWQgPSBleHBvcnRzLmlzRGlyZWN0b3J5ID0gZXhwb3J0cy5leGlzdHMgPSBleHBvcnRzLlJFQURPTkxZID0gZXhwb3J0cy5VVl9GU19PX0VYTE9DSyA9IGV4cG9ydHMuSVNfV0lORE9XUyA9IGV4cG9ydHMudW5saW5rID0gZXhwb3J0cy5zeW1saW5rID0gZXhwb3J0cy5zdGF0ID0gZXhwb3J0cy5ybWRpciA9IGV4cG9ydHMucm0gPSBleHBvcnRzLnJlbmFtZSA9IGV4cG9ydHMucmVhZGxpbmsgPSBleHBvcnRzLnJlYWRkaXIgPSBleHBvcnRzLm9wZW4gPSBleHBvcnRzLm1rZGlyID0gZXhwb3J0cy5sc3RhdCA9IGV4cG9ydHMuY29weUZpbGUgPSBleHBvcnRzLmNobW9kID0gdm9pZCAwO1xuY29uc3QgZnMgPSBfX2ltcG9ydFN0YXIocmVxdWlyZShcImZzXCIpKTtcbmNvbnN0IHBhdGggPSBfX2ltcG9ydFN0YXIocmVxdWlyZShcInBhdGhcIikpO1xuX2EgPSBmcy5wcm9taXNlc1xuLy8gZXhwb3J0IGNvbnN0IHtvcGVufSA9ICdmcydcbiwgZXhwb3J0cy5jaG1vZCA9IF9hLmNobW9kLCBleHBvcnRzLmNvcHlGaWxlID0gX2EuY29weUZpbGUsIGV4cG9ydHMubHN0YXQgPSBfYS5sc3RhdCwgZXhwb3J0cy5ta2RpciA9IF9hLm1rZGlyLCBleHBvcnRzLm9wZW4gPSBfYS5vcGVuLCBleHBvcnRzLnJlYWRkaXIgPSBfYS5yZWFkZGlyLCBleHBvcnRzLnJlYWRsaW5rID0gX2EucmVhZGxpbmssIGV4cG9ydHMucmVuYW1lID0gX2EucmVuYW1lLCBleHBvcnRzLnJtID0gX2Eucm0sIGV4cG9ydHMucm1kaXIgPSBfYS5ybWRpciwgZXhwb3J0cy5zdGF0ID0gX2Euc3RhdCwgZXhwb3J0cy5zeW1saW5rID0gX2Euc3ltbGluaywgZXhwb3J0cy51bmxpbmsgPSBfYS51bmxpbms7XG4vLyBleHBvcnQgY29uc3Qge29wZW59ID0gJ2ZzJ1xuZXhwb3J0cy5JU19XSU5ET1dTID0gcHJvY2Vzcy5wbGF0Zm9ybSA9PT0gJ3dpbjMyJztcbi8vIFNlZSBodHRwczovL2dpdGh1Yi5jb20vbm9kZWpzL25vZGUvYmxvYi9kMDE1M2FlZTM2NzQyMmQwODU4MTA1YWJlYzE4NmRhNGRmZjBhMGM1L2RlcHMvdXYvaW5jbHVkZS91di93aW4uaCNMNjkxXG5leHBvcnRzLlVWX0ZTX09fRVhMT0NLID0gMHgxMDAwMDAwMDtcbmV4cG9ydHMuUkVBRE9OTFkgPSBmcy5jb25zdGFudHMuT19SRE9OTFk7XG5mdW5jdGlvbiBleGlzdHMoZnNQYXRoKSB7XG4gICAgcmV0dXJuIF9fYXdhaXRlcih0aGlzLCB2b2lkIDAsIHZvaWQgMCwgZnVuY3Rpb24qICgpIHtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIHlpZWxkIGV4cG9ydHMuc3RhdChmc1BhdGgpO1xuICAgICAgICB9XG4gICAgICAgIGNhdGNoIChlcnIpIHtcbiAgICAgICAgICAgIGlmIChlcnIuY29kZSA9PT0gJ0VOT0VOVCcpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICB0aHJvdyBlcnI7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgfSk7XG59XG5leHBvcnRzLmV4aXN0cyA9IGV4aXN0cztcbmZ1bmN0aW9uIGlzRGlyZWN0b3J5KGZzUGF0aCwgdXNlU3RhdCA9IGZhbHNlKSB7XG4gICAgcmV0dXJuIF9fYXdhaXRlcih0aGlzLCB2b2lkIDAsIHZvaWQgMCwgZnVuY3Rpb24qICgpIHtcbiAgICAgICAgY29uc3Qgc3RhdHMgPSB1c2VTdGF0ID8geWllbGQgZXhwb3J0cy5zdGF0KGZzUGF0aCkgOiB5aWVsZCBleHBvcnRzLmxzdGF0KGZzUGF0aCk7XG4gICAgICAgIHJldHVybiBzdGF0cy5pc0RpcmVjdG9yeSgpO1xuICAgIH0pO1xufVxuZXhwb3J0cy5pc0RpcmVjdG9yeSA9IGlzRGlyZWN0b3J5O1xuLyoqXG4gKiBPbiBPU1gvTGludXgsIHRydWUgaWYgcGF0aCBzdGFydHMgd2l0aCAnLycuIE9uIFdpbmRvd3MsIHRydWUgZm9yIHBhdGhzIGxpa2U6XG4gKiBcXCwgXFxoZWxsbywgXFxcXGhlbGxvXFxzaGFyZSwgQzosIGFuZCBDOlxcaGVsbG8gKGFuZCBjb3JyZXNwb25kaW5nIGFsdGVybmF0ZSBzZXBhcmF0b3IgY2FzZXMpLlxuICovXG5mdW5jdGlvbiBpc1Jvb3RlZChwKSB7XG4gICAgcCA9IG5vcm1hbGl6ZVNlcGFyYXRvcnMocCk7XG4gICAgaWYgKCFwKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcignaXNSb290ZWQoKSBwYXJhbWV0ZXIgXCJwXCIgY2Fubm90IGJlIGVtcHR5Jyk7XG4gICAgfVxuICAgIGlmIChleHBvcnRzLklTX1dJTkRPV1MpIHtcbiAgICAgICAgcmV0dXJuIChwLnN0YXJ0c1dpdGgoJ1xcXFwnKSB8fCAvXltBLVpdOi9pLnRlc3QocCkgLy8gZS5nLiBcXCBvciBcXGhlbGxvIG9yIFxcXFxoZWxsb1xuICAgICAgICApOyAvLyBlLmcuIEM6IG9yIEM6XFxoZWxsb1xuICAgIH1cbiAgICByZXR1cm4gcC5zdGFydHNXaXRoKCcvJyk7XG59XG5leHBvcnRzLmlzUm9vdGVkID0gaXNSb290ZWQ7XG4vKipcbiAqIEJlc3QgZWZmb3J0IGF0dGVtcHQgdG8gZGV0ZXJtaW5lIHdoZXRoZXIgYSBmaWxlIGV4aXN0cyBhbmQgaXMgZXhlY3V0YWJsZS5cbiAqIEBwYXJhbSBmaWxlUGF0aCAgICBmaWxlIHBhdGggdG8gY2hlY2tcbiAqIEBwYXJhbSBleHRlbnNpb25zICBhZGRpdGlvbmFsIGZpbGUgZXh0ZW5zaW9ucyB0byB0cnlcbiAqIEByZXR1cm4gaWYgZmlsZSBleGlzdHMgYW5kIGlzIGV4ZWN1dGFibGUsIHJldHVybnMgdGhlIGZpbGUgcGF0aC4gb3RoZXJ3aXNlIGVtcHR5IHN0cmluZy5cbiAqL1xuZnVuY3Rpb24gdHJ5R2V0RXhlY3V0YWJsZVBhdGgoZmlsZVBhdGgsIGV4dGVuc2lvbnMpIHtcbiAgICByZXR1cm4gX19hd2FpdGVyKHRoaXMsIHZvaWQgMCwgdm9pZCAwLCBmdW5jdGlvbiogKCkge1xuICAgICAgICBsZXQgc3RhdHMgPSB1bmRlZmluZWQ7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgICAvLyB0ZXN0IGZpbGUgZXhpc3RzXG4gICAgICAgICAgICBzdGF0cyA9IHlpZWxkIGV4cG9ydHMuc3RhdChmaWxlUGF0aCk7XG4gICAgICAgIH1cbiAgICAgICAgY2F0Y2ggKGVycikge1xuICAgICAgICAgICAgaWYgKGVyci5jb2RlICE9PSAnRU5PRU5UJykge1xuICAgICAgICAgICAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby1jb25zb2xlXG4gICAgICAgICAgICAgICAgY29uc29sZS5sb2coYFVuZXhwZWN0ZWQgZXJyb3IgYXR0ZW1wdGluZyB0byBkZXRlcm1pbmUgaWYgZXhlY3V0YWJsZSBmaWxlIGV4aXN0cyAnJHtmaWxlUGF0aH0nOiAke2Vycn1gKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBpZiAoc3RhdHMgJiYgc3RhdHMuaXNGaWxlKCkpIHtcbiAgICAgICAgICAgIGlmIChleHBvcnRzLklTX1dJTkRPV1MpIHtcbiAgICAgICAgICAgICAgICAvLyBvbiBXaW5kb3dzLCB0ZXN0IGZvciB2YWxpZCBleHRlbnNpb25cbiAgICAgICAgICAgICAgICBjb25zdCB1cHBlckV4dCA9IHBhdGguZXh0bmFtZShmaWxlUGF0aCkudG9VcHBlckNhc2UoKTtcbiAgICAgICAgICAgICAgICBpZiAoZXh0ZW5zaW9ucy5zb21lKHZhbGlkRXh0ID0+IHZhbGlkRXh0LnRvVXBwZXJDYXNlKCkgPT09IHVwcGVyRXh0KSkge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmlsZVBhdGg7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgaWYgKGlzVW5peEV4ZWN1dGFibGUoc3RhdHMpKSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBmaWxlUGF0aDtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgLy8gdHJ5IGVhY2ggZXh0ZW5zaW9uXG4gICAgICAgIGNvbnN0IG9yaWdpbmFsRmlsZVBhdGggPSBmaWxlUGF0aDtcbiAgICAgICAgZm9yIChjb25zdCBleHRlbnNpb24gb2YgZXh0ZW5zaW9ucykge1xuICAgICAgICAgICAgZmlsZVBhdGggPSBvcmlnaW5hbEZpbGVQYXRoICsgZXh0ZW5zaW9uO1xuICAgICAgICAgICAgc3RhdHMgPSB1bmRlZmluZWQ7XG4gICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgIHN0YXRzID0geWllbGQgZXhwb3J0cy5zdGF0KGZpbGVQYXRoKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGNhdGNoIChlcnIpIHtcbiAgICAgICAgICAgICAgICBpZiAoZXJyLmNvZGUgIT09ICdFTk9FTlQnKSB7XG4gICAgICAgICAgICAgICAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby1jb25zb2xlXG4gICAgICAgICAgICAgICAgICAgIGNvbnNvbGUubG9nKGBVbmV4cGVjdGVkIGVycm9yIGF0dGVtcHRpbmcgdG8gZGV0ZXJtaW5lIGlmIGV4ZWN1dGFibGUgZmlsZSBleGlzdHMgJyR7ZmlsZVBhdGh9JzogJHtlcnJ9YCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKHN0YXRzICYmIHN0YXRzLmlzRmlsZSgpKSB7XG4gICAgICAgICAgICAgICAgaWYgKGV4cG9ydHMuSVNfV0lORE9XUykge1xuICAgICAgICAgICAgICAgICAgICAvLyBwcmVzZXJ2ZSB0aGUgY2FzZSBvZiB0aGUgYWN0dWFsIGZpbGUgKHNpbmNlIGFuIGV4dGVuc2lvbiB3YXMgYXBwZW5kZWQpXG4gICAgICAgICAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBkaXJlY3RvcnkgPSBwYXRoLmRpcm5hbWUoZmlsZVBhdGgpO1xuICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdXBwZXJOYW1lID0gcGF0aC5iYXNlbmFtZShmaWxlUGF0aCkudG9VcHBlckNhc2UoKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGZvciAoY29uc3QgYWN0dWFsTmFtZSBvZiB5aWVsZCBleHBvcnRzLnJlYWRkaXIoZGlyZWN0b3J5KSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICh1cHBlck5hbWUgPT09IGFjdHVhbE5hbWUudG9VcHBlckNhc2UoKSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaWxlUGF0aCA9IHBhdGguam9pbihkaXJlY3RvcnksIGFjdHVhbE5hbWUpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgY2F0Y2ggKGVycikge1xuICAgICAgICAgICAgICAgICAgICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLWNvbnNvbGVcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnNvbGUubG9nKGBVbmV4cGVjdGVkIGVycm9yIGF0dGVtcHRpbmcgdG8gZGV0ZXJtaW5lIHRoZSBhY3R1YWwgY2FzZSBvZiB0aGUgZmlsZSAnJHtmaWxlUGF0aH0nOiAke2Vycn1gKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmlsZVBhdGg7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICBpZiAoaXNVbml4RXhlY3V0YWJsZShzdGF0cykpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBmaWxlUGF0aDtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gJyc7XG4gICAgfSk7XG59XG5leHBvcnRzLnRyeUdldEV4ZWN1dGFibGVQYXRoID0gdHJ5R2V0RXhlY3V0YWJsZVBhdGg7XG5mdW5jdGlvbiBub3JtYWxpemVTZXBhcmF0b3JzKHApIHtcbiAgICBwID0gcCB8fCAnJztcbiAgICBpZiAoZXhwb3J0cy5JU19XSU5ET1dTKSB7XG4gICAgICAgIC8vIGNvbnZlcnQgc2xhc2hlcyBvbiBXaW5kb3dzXG4gICAgICAgIHAgPSBwLnJlcGxhY2UoL1xcLy9nLCAnXFxcXCcpO1xuICAgICAgICAvLyByZW1vdmUgcmVkdW5kYW50IHNsYXNoZXNcbiAgICAgICAgcmV0dXJuIHAucmVwbGFjZSgvXFxcXFxcXFwrL2csICdcXFxcJyk7XG4gICAgfVxuICAgIC8vIHJlbW92ZSByZWR1bmRhbnQgc2xhc2hlc1xuICAgIHJldHVybiBwLnJlcGxhY2UoL1xcL1xcLysvZywgJy8nKTtcbn1cbi8vIG9uIE1hYy9MaW51eCwgdGVzdCB0aGUgZXhlY3V0ZSBiaXRcbi8vICAgICBSICAgVyAgWCAgUiAgVyBYIFIgVyBYXG4vLyAgIDI1NiAxMjggNjQgMzIgMTYgOCA0IDIgMVxuZnVuY3Rpb24gaXNVbml4RXhlY3V0YWJsZShzdGF0cykge1xuICAgIHJldHVybiAoKHN0YXRzLm1vZGUgJiAxKSA+IDAgfHxcbiAgICAgICAgKChzdGF0cy5tb2RlICYgOCkgPiAwICYmIHN0YXRzLmdpZCA9PT0gcHJvY2Vzcy5nZXRnaWQoKSkgfHxcbiAgICAgICAgKChzdGF0cy5tb2RlICYgNjQpID4gMCAmJiBzdGF0cy51aWQgPT09IHByb2Nlc3MuZ2V0dWlkKCkpKTtcbn1cbi8vIEdldCB0aGUgcGF0aCBvZiBjbWQuZXhlIGluIHdpbmRvd3NcbmZ1bmN0aW9uIGdldENtZFBhdGgoKSB7XG4gICAgdmFyIF9hO1xuICAgIHJldHVybiAoX2EgPSBwcm9jZXNzLmVudlsnQ09NU1BFQyddKSAhPT0gbnVsbCAmJiBfYSAhPT0gdm9pZCAwID8gX2EgOiBgY21kLmV4ZWA7XG59XG5leHBvcnRzLmdldENtZFBhdGggPSBnZXRDbWRQYXRoO1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9aW8tdXRpbC5qcy5tYXAiLAogICAgIlwidXNlIHN0cmljdFwiO1xudmFyIF9fY3JlYXRlQmluZGluZyA9ICh0aGlzICYmIHRoaXMuX19jcmVhdGVCaW5kaW5nKSB8fCAoT2JqZWN0LmNyZWF0ZSA/IChmdW5jdGlvbihvLCBtLCBrLCBrMikge1xuICAgIGlmIChrMiA9PT0gdW5kZWZpbmVkKSBrMiA9IGs7XG4gICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KG8sIGsyLCB7IGVudW1lcmFibGU6IHRydWUsIGdldDogZnVuY3Rpb24oKSB7IHJldHVybiBtW2tdOyB9IH0pO1xufSkgOiAoZnVuY3Rpb24obywgbSwgaywgazIpIHtcbiAgICBpZiAoazIgPT09IHVuZGVmaW5lZCkgazIgPSBrO1xuICAgIG9bazJdID0gbVtrXTtcbn0pKTtcbnZhciBfX3NldE1vZHVsZURlZmF1bHQgPSAodGhpcyAmJiB0aGlzLl9fc2V0TW9kdWxlRGVmYXVsdCkgfHwgKE9iamVjdC5jcmVhdGUgPyAoZnVuY3Rpb24obywgdikge1xuICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShvLCBcImRlZmF1bHRcIiwgeyBlbnVtZXJhYmxlOiB0cnVlLCB2YWx1ZTogdiB9KTtcbn0pIDogZnVuY3Rpb24obywgdikge1xuICAgIG9bXCJkZWZhdWx0XCJdID0gdjtcbn0pO1xudmFyIF9faW1wb3J0U3RhciA9ICh0aGlzICYmIHRoaXMuX19pbXBvcnRTdGFyKSB8fCBmdW5jdGlvbiAobW9kKSB7XG4gICAgaWYgKG1vZCAmJiBtb2QuX19lc01vZHVsZSkgcmV0dXJuIG1vZDtcbiAgICB2YXIgcmVzdWx0ID0ge307XG4gICAgaWYgKG1vZCAhPSBudWxsKSBmb3IgKHZhciBrIGluIG1vZCkgaWYgKGsgIT09IFwiZGVmYXVsdFwiICYmIE9iamVjdC5oYXNPd25Qcm9wZXJ0eS5jYWxsKG1vZCwgaykpIF9fY3JlYXRlQmluZGluZyhyZXN1bHQsIG1vZCwgayk7XG4gICAgX19zZXRNb2R1bGVEZWZhdWx0KHJlc3VsdCwgbW9kKTtcbiAgICByZXR1cm4gcmVzdWx0O1xufTtcbnZhciBfX2F3YWl0ZXIgPSAodGhpcyAmJiB0aGlzLl9fYXdhaXRlcikgfHwgZnVuY3Rpb24gKHRoaXNBcmcsIF9hcmd1bWVudHMsIFAsIGdlbmVyYXRvcikge1xuICAgIGZ1bmN0aW9uIGFkb3B0KHZhbHVlKSB7IHJldHVybiB2YWx1ZSBpbnN0YW5jZW9mIFAgPyB2YWx1ZSA6IG5ldyBQKGZ1bmN0aW9uIChyZXNvbHZlKSB7IHJlc29sdmUodmFsdWUpOyB9KTsgfVxuICAgIHJldHVybiBuZXcgKFAgfHwgKFAgPSBQcm9taXNlKSkoZnVuY3Rpb24gKHJlc29sdmUsIHJlamVjdCkge1xuICAgICAgICBmdW5jdGlvbiBmdWxmaWxsZWQodmFsdWUpIHsgdHJ5IHsgc3RlcChnZW5lcmF0b3IubmV4dCh2YWx1ZSkpOyB9IGNhdGNoIChlKSB7IHJlamVjdChlKTsgfSB9XG4gICAgICAgIGZ1bmN0aW9uIHJlamVjdGVkKHZhbHVlKSB7IHRyeSB7IHN0ZXAoZ2VuZXJhdG9yW1widGhyb3dcIl0odmFsdWUpKTsgfSBjYXRjaCAoZSkgeyByZWplY3QoZSk7IH0gfVxuICAgICAgICBmdW5jdGlvbiBzdGVwKHJlc3VsdCkgeyByZXN1bHQuZG9uZSA/IHJlc29sdmUocmVzdWx0LnZhbHVlKSA6IGFkb3B0KHJlc3VsdC52YWx1ZSkudGhlbihmdWxmaWxsZWQsIHJlamVjdGVkKTsgfVxuICAgICAgICBzdGVwKChnZW5lcmF0b3IgPSBnZW5lcmF0b3IuYXBwbHkodGhpc0FyZywgX2FyZ3VtZW50cyB8fCBbXSkpLm5leHQoKSk7XG4gICAgfSk7XG59O1xuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiX19lc01vZHVsZVwiLCB7IHZhbHVlOiB0cnVlIH0pO1xuZXhwb3J0cy5maW5kSW5QYXRoID0gZXhwb3J0cy53aGljaCA9IGV4cG9ydHMubWtkaXJQID0gZXhwb3J0cy5ybVJGID0gZXhwb3J0cy5tdiA9IGV4cG9ydHMuY3AgPSB2b2lkIDA7XG5jb25zdCBhc3NlcnRfMSA9IHJlcXVpcmUoXCJhc3NlcnRcIik7XG5jb25zdCBwYXRoID0gX19pbXBvcnRTdGFyKHJlcXVpcmUoXCJwYXRoXCIpKTtcbmNvbnN0IGlvVXRpbCA9IF9faW1wb3J0U3RhcihyZXF1aXJlKFwiLi9pby11dGlsXCIpKTtcbi8qKlxuICogQ29waWVzIGEgZmlsZSBvciBmb2xkZXIuXG4gKiBCYXNlZCBvZmYgb2Ygc2hlbGxqcyAtIGh0dHBzOi8vZ2l0aHViLmNvbS9zaGVsbGpzL3NoZWxsanMvYmxvYi85MjM3ZjY2YzUyZTVkYWE0MDQ1OGY5NGY5NTY1ZTE4ZTgxMzJmNWE2L3NyYy9jcC5qc1xuICpcbiAqIEBwYXJhbSAgICAgc291cmNlICAgIHNvdXJjZSBwYXRoXG4gKiBAcGFyYW0gICAgIGRlc3QgICAgICBkZXN0aW5hdGlvbiBwYXRoXG4gKiBAcGFyYW0gICAgIG9wdGlvbnMgICBvcHRpb25hbC4gU2VlIENvcHlPcHRpb25zLlxuICovXG5mdW5jdGlvbiBjcChzb3VyY2UsIGRlc3QsIG9wdGlvbnMgPSB7fSkge1xuICAgIHJldHVybiBfX2F3YWl0ZXIodGhpcywgdm9pZCAwLCB2b2lkIDAsIGZ1bmN0aW9uKiAoKSB7XG4gICAgICAgIGNvbnN0IHsgZm9yY2UsIHJlY3Vyc2l2ZSwgY29weVNvdXJjZURpcmVjdG9yeSB9ID0gcmVhZENvcHlPcHRpb25zKG9wdGlvbnMpO1xuICAgICAgICBjb25zdCBkZXN0U3RhdCA9ICh5aWVsZCBpb1V0aWwuZXhpc3RzKGRlc3QpKSA/IHlpZWxkIGlvVXRpbC5zdGF0KGRlc3QpIDogbnVsbDtcbiAgICAgICAgLy8gRGVzdCBpcyBhbiBleGlzdGluZyBmaWxlLCBidXQgbm90IGZvcmNpbmdcbiAgICAgICAgaWYgKGRlc3RTdGF0ICYmIGRlc3RTdGF0LmlzRmlsZSgpICYmICFmb3JjZSkge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIC8vIElmIGRlc3QgaXMgYW4gZXhpc3RpbmcgZGlyZWN0b3J5LCBzaG91bGQgY29weSBpbnNpZGUuXG4gICAgICAgIGNvbnN0IG5ld0Rlc3QgPSBkZXN0U3RhdCAmJiBkZXN0U3RhdC5pc0RpcmVjdG9yeSgpICYmIGNvcHlTb3VyY2VEaXJlY3RvcnlcbiAgICAgICAgICAgID8gcGF0aC5qb2luKGRlc3QsIHBhdGguYmFzZW5hbWUoc291cmNlKSlcbiAgICAgICAgICAgIDogZGVzdDtcbiAgICAgICAgaWYgKCEoeWllbGQgaW9VdGlsLmV4aXN0cyhzb3VyY2UpKSkge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBubyBzdWNoIGZpbGUgb3IgZGlyZWN0b3J5OiAke3NvdXJjZX1gKTtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBzb3VyY2VTdGF0ID0geWllbGQgaW9VdGlsLnN0YXQoc291cmNlKTtcbiAgICAgICAgaWYgKHNvdXJjZVN0YXQuaXNEaXJlY3RvcnkoKSkge1xuICAgICAgICAgICAgaWYgKCFyZWN1cnNpdmUpIHtcbiAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYEZhaWxlZCB0byBjb3B5LiAke3NvdXJjZX0gaXMgYSBkaXJlY3RvcnksIGJ1dCB0cmllZCB0byBjb3B5IHdpdGhvdXQgcmVjdXJzaXZlIGZsYWcuYCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICB5aWVsZCBjcERpclJlY3Vyc2l2ZShzb3VyY2UsIG5ld0Rlc3QsIDAsIGZvcmNlKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIGlmIChwYXRoLnJlbGF0aXZlKHNvdXJjZSwgbmV3RGVzdCkgPT09ICcnKSB7XG4gICAgICAgICAgICAgICAgLy8gYSBmaWxlIGNhbm5vdCBiZSBjb3BpZWQgdG8gaXRzZWxmXG4gICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGAnJHtuZXdEZXN0fScgYW5kICcke3NvdXJjZX0nIGFyZSB0aGUgc2FtZSBmaWxlYCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICB5aWVsZCBjb3B5RmlsZShzb3VyY2UsIG5ld0Rlc3QsIGZvcmNlKTtcbiAgICAgICAgfVxuICAgIH0pO1xufVxuZXhwb3J0cy5jcCA9IGNwO1xuLyoqXG4gKiBNb3ZlcyBhIHBhdGguXG4gKlxuICogQHBhcmFtICAgICBzb3VyY2UgICAgc291cmNlIHBhdGhcbiAqIEBwYXJhbSAgICAgZGVzdCAgICAgIGRlc3RpbmF0aW9uIHBhdGhcbiAqIEBwYXJhbSAgICAgb3B0aW9ucyAgIG9wdGlvbmFsLiBTZWUgTW92ZU9wdGlvbnMuXG4gKi9cbmZ1bmN0aW9uIG12KHNvdXJjZSwgZGVzdCwgb3B0aW9ucyA9IHt9KSB7XG4gICAgcmV0dXJuIF9fYXdhaXRlcih0aGlzLCB2b2lkIDAsIHZvaWQgMCwgZnVuY3Rpb24qICgpIHtcbiAgICAgICAgaWYgKHlpZWxkIGlvVXRpbC5leGlzdHMoZGVzdCkpIHtcbiAgICAgICAgICAgIGxldCBkZXN0RXhpc3RzID0gdHJ1ZTtcbiAgICAgICAgICAgIGlmICh5aWVsZCBpb1V0aWwuaXNEaXJlY3RvcnkoZGVzdCkpIHtcbiAgICAgICAgICAgICAgICAvLyBJZiBkZXN0IGlzIGRpcmVjdG9yeSBjb3B5IHNyYyBpbnRvIGRlc3RcbiAgICAgICAgICAgICAgICBkZXN0ID0gcGF0aC5qb2luKGRlc3QsIHBhdGguYmFzZW5hbWUoc291cmNlKSk7XG4gICAgICAgICAgICAgICAgZGVzdEV4aXN0cyA9IHlpZWxkIGlvVXRpbC5leGlzdHMoZGVzdCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAoZGVzdEV4aXN0cykge1xuICAgICAgICAgICAgICAgIGlmIChvcHRpb25zLmZvcmNlID09IG51bGwgfHwgb3B0aW9ucy5mb3JjZSkge1xuICAgICAgICAgICAgICAgICAgICB5aWVsZCBybVJGKGRlc3QpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdEZXN0aW5hdGlvbiBhbHJlYWR5IGV4aXN0cycpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICB5aWVsZCBta2RpclAocGF0aC5kaXJuYW1lKGRlc3QpKTtcbiAgICAgICAgeWllbGQgaW9VdGlsLnJlbmFtZShzb3VyY2UsIGRlc3QpO1xuICAgIH0pO1xufVxuZXhwb3J0cy5tdiA9IG12O1xuLyoqXG4gKiBSZW1vdmUgYSBwYXRoIHJlY3Vyc2l2ZWx5IHdpdGggZm9yY2VcbiAqXG4gKiBAcGFyYW0gaW5wdXRQYXRoIHBhdGggdG8gcmVtb3ZlXG4gKi9cbmZ1bmN0aW9uIHJtUkYoaW5wdXRQYXRoKSB7XG4gICAgcmV0dXJuIF9fYXdhaXRlcih0aGlzLCB2b2lkIDAsIHZvaWQgMCwgZnVuY3Rpb24qICgpIHtcbiAgICAgICAgaWYgKGlvVXRpbC5JU19XSU5ET1dTKSB7XG4gICAgICAgICAgICAvLyBDaGVjayBmb3IgaW52YWxpZCBjaGFyYWN0ZXJzXG4gICAgICAgICAgICAvLyBodHRwczovL2RvY3MubWljcm9zb2Z0LmNvbS9lbi11cy93aW5kb3dzL3dpbjMyL2ZpbGVpby9uYW1pbmctYS1maWxlXG4gICAgICAgICAgICBpZiAoL1sqXCI8PnxdLy50ZXN0KGlucHV0UGF0aCkpIHtcbiAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ0ZpbGUgcGF0aCBtdXN0IG5vdCBjb250YWluIGAqYCwgYFwiYCwgYDxgLCBgPmAgb3IgYHxgIG9uIFdpbmRvd3MnKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICB0cnkge1xuICAgICAgICAgICAgLy8gbm90ZSBpZiBwYXRoIGRvZXMgbm90IGV4aXN0LCBlcnJvciBpcyBzaWxlbnRcbiAgICAgICAgICAgIHlpZWxkIGlvVXRpbC5ybShpbnB1dFBhdGgsIHtcbiAgICAgICAgICAgICAgICBmb3JjZTogdHJ1ZSxcbiAgICAgICAgICAgICAgICBtYXhSZXRyaWVzOiAzLFxuICAgICAgICAgICAgICAgIHJlY3Vyc2l2ZTogdHJ1ZSxcbiAgICAgICAgICAgICAgICByZXRyeURlbGF5OiAzMDBcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgICAgIGNhdGNoIChlcnIpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihgRmlsZSB3YXMgdW5hYmxlIHRvIGJlIHJlbW92ZWQgJHtlcnJ9YCk7XG4gICAgICAgIH1cbiAgICB9KTtcbn1cbmV4cG9ydHMucm1SRiA9IHJtUkY7XG4vKipcbiAqIE1ha2UgYSBkaXJlY3RvcnkuICBDcmVhdGVzIHRoZSBmdWxsIHBhdGggd2l0aCBmb2xkZXJzIGluIGJldHdlZW5cbiAqIFdpbGwgdGhyb3cgaWYgaXQgZmFpbHNcbiAqXG4gKiBAcGFyYW0gICBmc1BhdGggICAgICAgIHBhdGggdG8gY3JlYXRlXG4gKiBAcmV0dXJucyBQcm9taXNlPHZvaWQ+XG4gKi9cbmZ1bmN0aW9uIG1rZGlyUChmc1BhdGgpIHtcbiAgICByZXR1cm4gX19hd2FpdGVyKHRoaXMsIHZvaWQgMCwgdm9pZCAwLCBmdW5jdGlvbiogKCkge1xuICAgICAgICBhc3NlcnRfMS5vayhmc1BhdGgsICdhIHBhdGggYXJndW1lbnQgbXVzdCBiZSBwcm92aWRlZCcpO1xuICAgICAgICB5aWVsZCBpb1V0aWwubWtkaXIoZnNQYXRoLCB7IHJlY3Vyc2l2ZTogdHJ1ZSB9KTtcbiAgICB9KTtcbn1cbmV4cG9ydHMubWtkaXJQID0gbWtkaXJQO1xuLyoqXG4gKiBSZXR1cm5zIHBhdGggb2YgYSB0b29sIGhhZCB0aGUgdG9vbCBhY3R1YWxseSBiZWVuIGludm9rZWQuICBSZXNvbHZlcyB2aWEgcGF0aHMuXG4gKiBJZiB5b3UgY2hlY2sgYW5kIHRoZSB0b29sIGRvZXMgbm90IGV4aXN0LCBpdCB3aWxsIHRocm93LlxuICpcbiAqIEBwYXJhbSAgICAgdG9vbCAgICAgICAgICAgICAgbmFtZSBvZiB0aGUgdG9vbFxuICogQHBhcmFtICAgICBjaGVjayAgICAgICAgICAgICB3aGV0aGVyIHRvIGNoZWNrIGlmIHRvb2wgZXhpc3RzXG4gKiBAcmV0dXJucyAgIFByb21pc2U8c3RyaW5nPiAgIHBhdGggdG8gdG9vbFxuICovXG5mdW5jdGlvbiB3aGljaCh0b29sLCBjaGVjaykge1xuICAgIHJldHVybiBfX2F3YWl0ZXIodGhpcywgdm9pZCAwLCB2b2lkIDAsIGZ1bmN0aW9uKiAoKSB7XG4gICAgICAgIGlmICghdG9vbCkge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwicGFyYW1ldGVyICd0b29sJyBpcyByZXF1aXJlZFwiKTtcbiAgICAgICAgfVxuICAgICAgICAvLyByZWN1cnNpdmUgd2hlbiBjaGVjaz10cnVlXG4gICAgICAgIGlmIChjaGVjaykge1xuICAgICAgICAgICAgY29uc3QgcmVzdWx0ID0geWllbGQgd2hpY2godG9vbCwgZmFsc2UpO1xuICAgICAgICAgICAgaWYgKCFyZXN1bHQpIHtcbiAgICAgICAgICAgICAgICBpZiAoaW9VdGlsLklTX1dJTkRPV1MpIHtcbiAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBVbmFibGUgdG8gbG9jYXRlIGV4ZWN1dGFibGUgZmlsZTogJHt0b29sfS4gUGxlYXNlIHZlcmlmeSBlaXRoZXIgdGhlIGZpbGUgcGF0aCBleGlzdHMgb3IgdGhlIGZpbGUgY2FuIGJlIGZvdW5kIHdpdGhpbiBhIGRpcmVjdG9yeSBzcGVjaWZpZWQgYnkgdGhlIFBBVEggZW52aXJvbm1lbnQgdmFyaWFibGUuIEFsc28gdmVyaWZ5IHRoZSBmaWxlIGhhcyBhIHZhbGlkIGV4dGVuc2lvbiBmb3IgYW4gZXhlY3V0YWJsZSBmaWxlLmApO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBVbmFibGUgdG8gbG9jYXRlIGV4ZWN1dGFibGUgZmlsZTogJHt0b29sfS4gUGxlYXNlIHZlcmlmeSBlaXRoZXIgdGhlIGZpbGUgcGF0aCBleGlzdHMgb3IgdGhlIGZpbGUgY2FuIGJlIGZvdW5kIHdpdGhpbiBhIGRpcmVjdG9yeSBzcGVjaWZpZWQgYnkgdGhlIFBBVEggZW52aXJvbm1lbnQgdmFyaWFibGUuIEFsc28gY2hlY2sgdGhlIGZpbGUgbW9kZSB0byB2ZXJpZnkgdGhlIGZpbGUgaXMgZXhlY3V0YWJsZS5gKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4gcmVzdWx0O1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IG1hdGNoZXMgPSB5aWVsZCBmaW5kSW5QYXRoKHRvb2wpO1xuICAgICAgICBpZiAobWF0Y2hlcyAmJiBtYXRjaGVzLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgIHJldHVybiBtYXRjaGVzWzBdO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiAnJztcbiAgICB9KTtcbn1cbmV4cG9ydHMud2hpY2ggPSB3aGljaDtcbi8qKlxuICogUmV0dXJucyBhIGxpc3Qgb2YgYWxsIG9jY3VycmVuY2VzIG9mIHRoZSBnaXZlbiB0b29sIG9uIHRoZSBzeXN0ZW0gcGF0aC5cbiAqXG4gKiBAcmV0dXJucyAgIFByb21pc2U8c3RyaW5nW10+ICB0aGUgcGF0aHMgb2YgdGhlIHRvb2xcbiAqL1xuZnVuY3Rpb24gZmluZEluUGF0aCh0b29sKSB7XG4gICAgcmV0dXJuIF9fYXdhaXRlcih0aGlzLCB2b2lkIDAsIHZvaWQgMCwgZnVuY3Rpb24qICgpIHtcbiAgICAgICAgaWYgKCF0b29sKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJwYXJhbWV0ZXIgJ3Rvb2wnIGlzIHJlcXVpcmVkXCIpO1xuICAgICAgICB9XG4gICAgICAgIC8vIGJ1aWxkIHRoZSBsaXN0IG9mIGV4dGVuc2lvbnMgdG8gdHJ5XG4gICAgICAgIGNvbnN0IGV4dGVuc2lvbnMgPSBbXTtcbiAgICAgICAgaWYgKGlvVXRpbC5JU19XSU5ET1dTICYmIHByb2Nlc3MuZW52WydQQVRIRVhUJ10pIHtcbiAgICAgICAgICAgIGZvciAoY29uc3QgZXh0ZW5zaW9uIG9mIHByb2Nlc3MuZW52WydQQVRIRVhUJ10uc3BsaXQocGF0aC5kZWxpbWl0ZXIpKSB7XG4gICAgICAgICAgICAgICAgaWYgKGV4dGVuc2lvbikge1xuICAgICAgICAgICAgICAgICAgICBleHRlbnNpb25zLnB1c2goZXh0ZW5zaW9uKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgLy8gaWYgaXQncyByb290ZWQsIHJldHVybiBpdCBpZiBleGlzdHMuIG90aGVyd2lzZSByZXR1cm4gZW1wdHkuXG4gICAgICAgIGlmIChpb1V0aWwuaXNSb290ZWQodG9vbCkpIHtcbiAgICAgICAgICAgIGNvbnN0IGZpbGVQYXRoID0geWllbGQgaW9VdGlsLnRyeUdldEV4ZWN1dGFibGVQYXRoKHRvb2wsIGV4dGVuc2lvbnMpO1xuICAgICAgICAgICAgaWYgKGZpbGVQYXRoKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIFtmaWxlUGF0aF07XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4gW107XG4gICAgICAgIH1cbiAgICAgICAgLy8gaWYgYW55IHBhdGggc2VwYXJhdG9ycywgcmV0dXJuIGVtcHR5XG4gICAgICAgIGlmICh0b29sLmluY2x1ZGVzKHBhdGguc2VwKSkge1xuICAgICAgICAgICAgcmV0dXJuIFtdO1xuICAgICAgICB9XG4gICAgICAgIC8vIGJ1aWxkIHRoZSBsaXN0IG9mIGRpcmVjdG9yaWVzXG4gICAgICAgIC8vXG4gICAgICAgIC8vIE5vdGUsIHRlY2huaWNhbGx5IFwid2hlcmVcIiBjaGVja3MgdGhlIGN1cnJlbnQgZGlyZWN0b3J5IG9uIFdpbmRvd3MuIEZyb20gYSB0b29sa2l0IHBlcnNwZWN0aXZlLFxuICAgICAgICAvLyBpdCBmZWVscyBsaWtlIHdlIHNob3VsZCBub3QgZG8gdGhpcy4gQ2hlY2tpbmcgdGhlIGN1cnJlbnQgZGlyZWN0b3J5IHNlZW1zIGxpa2UgbW9yZSBvZiBhIHVzZVxuICAgICAgICAvLyBjYXNlIG9mIGEgc2hlbGwsIGFuZCB0aGUgd2hpY2goKSBmdW5jdGlvbiBleHBvc2VkIGJ5IHRoZSB0b29sa2l0IHNob3VsZCBzdHJpdmUgZm9yIGNvbnNpc3RlbmN5XG4gICAgICAgIC8vIGFjcm9zcyBwbGF0Zm9ybXMuXG4gICAgICAgIGNvbnN0IGRpcmVjdG9yaWVzID0gW107XG4gICAgICAgIGlmIChwcm9jZXNzLmVudi5QQVRIKSB7XG4gICAgICAgICAgICBmb3IgKGNvbnN0IHAgb2YgcHJvY2Vzcy5lbnYuUEFUSC5zcGxpdChwYXRoLmRlbGltaXRlcikpIHtcbiAgICAgICAgICAgICAgICBpZiAocCkge1xuICAgICAgICAgICAgICAgICAgICBkaXJlY3Rvcmllcy5wdXNoKHApO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICAvLyBmaW5kIGFsbCBtYXRjaGVzXG4gICAgICAgIGNvbnN0IG1hdGNoZXMgPSBbXTtcbiAgICAgICAgZm9yIChjb25zdCBkaXJlY3Rvcnkgb2YgZGlyZWN0b3JpZXMpIHtcbiAgICAgICAgICAgIGNvbnN0IGZpbGVQYXRoID0geWllbGQgaW9VdGlsLnRyeUdldEV4ZWN1dGFibGVQYXRoKHBhdGguam9pbihkaXJlY3RvcnksIHRvb2wpLCBleHRlbnNpb25zKTtcbiAgICAgICAgICAgIGlmIChmaWxlUGF0aCkge1xuICAgICAgICAgICAgICAgIG1hdGNoZXMucHVzaChmaWxlUGF0aCk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIG1hdGNoZXM7XG4gICAgfSk7XG59XG5leHBvcnRzLmZpbmRJblBhdGggPSBmaW5kSW5QYXRoO1xuZnVuY3Rpb24gcmVhZENvcHlPcHRpb25zKG9wdGlvbnMpIHtcbiAgICBjb25zdCBmb3JjZSA9IG9wdGlvbnMuZm9yY2UgPT0gbnVsbCA/IHRydWUgOiBvcHRpb25zLmZvcmNlO1xuICAgIGNvbnN0IHJlY3Vyc2l2ZSA9IEJvb2xlYW4ob3B0aW9ucy5yZWN1cnNpdmUpO1xuICAgIGNvbnN0IGNvcHlTb3VyY2VEaXJlY3RvcnkgPSBvcHRpb25zLmNvcHlTb3VyY2VEaXJlY3RvcnkgPT0gbnVsbFxuICAgICAgICA/IHRydWVcbiAgICAgICAgOiBCb29sZWFuKG9wdGlvbnMuY29weVNvdXJjZURpcmVjdG9yeSk7XG4gICAgcmV0dXJuIHsgZm9yY2UsIHJlY3Vyc2l2ZSwgY29weVNvdXJjZURpcmVjdG9yeSB9O1xufVxuZnVuY3Rpb24gY3BEaXJSZWN1cnNpdmUoc291cmNlRGlyLCBkZXN0RGlyLCBjdXJyZW50RGVwdGgsIGZvcmNlKSB7XG4gICAgcmV0dXJuIF9fYXdhaXRlcih0aGlzLCB2b2lkIDAsIHZvaWQgMCwgZnVuY3Rpb24qICgpIHtcbiAgICAgICAgLy8gRW5zdXJlIHRoZXJlIGlzIG5vdCBhIHJ1biBhd2F5IHJlY3Vyc2l2ZSBjb3B5XG4gICAgICAgIGlmIChjdXJyZW50RGVwdGggPj0gMjU1KVxuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICBjdXJyZW50RGVwdGgrKztcbiAgICAgICAgeWllbGQgbWtkaXJQKGRlc3REaXIpO1xuICAgICAgICBjb25zdCBmaWxlcyA9IHlpZWxkIGlvVXRpbC5yZWFkZGlyKHNvdXJjZURpcik7XG4gICAgICAgIGZvciAoY29uc3QgZmlsZU5hbWUgb2YgZmlsZXMpIHtcbiAgICAgICAgICAgIGNvbnN0IHNyY0ZpbGUgPSBgJHtzb3VyY2VEaXJ9LyR7ZmlsZU5hbWV9YDtcbiAgICAgICAgICAgIGNvbnN0IGRlc3RGaWxlID0gYCR7ZGVzdERpcn0vJHtmaWxlTmFtZX1gO1xuICAgICAgICAgICAgY29uc3Qgc3JjRmlsZVN0YXQgPSB5aWVsZCBpb1V0aWwubHN0YXQoc3JjRmlsZSk7XG4gICAgICAgICAgICBpZiAoc3JjRmlsZVN0YXQuaXNEaXJlY3RvcnkoKSkge1xuICAgICAgICAgICAgICAgIC8vIFJlY3Vyc2VcbiAgICAgICAgICAgICAgICB5aWVsZCBjcERpclJlY3Vyc2l2ZShzcmNGaWxlLCBkZXN0RmlsZSwgY3VycmVudERlcHRoLCBmb3JjZSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICB5aWVsZCBjb3B5RmlsZShzcmNGaWxlLCBkZXN0RmlsZSwgZm9yY2UpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIC8vIENoYW5nZSB0aGUgbW9kZSBmb3IgdGhlIG5ld2x5IGNyZWF0ZWQgZGlyZWN0b3J5XG4gICAgICAgIHlpZWxkIGlvVXRpbC5jaG1vZChkZXN0RGlyLCAoeWllbGQgaW9VdGlsLnN0YXQoc291cmNlRGlyKSkubW9kZSk7XG4gICAgfSk7XG59XG4vLyBCdWZmZXJlZCBmaWxlIGNvcHlcbmZ1bmN0aW9uIGNvcHlGaWxlKHNyY0ZpbGUsIGRlc3RGaWxlLCBmb3JjZSkge1xuICAgIHJldHVybiBfX2F3YWl0ZXIodGhpcywgdm9pZCAwLCB2b2lkIDAsIGZ1bmN0aW9uKiAoKSB7XG4gICAgICAgIGlmICgoeWllbGQgaW9VdGlsLmxzdGF0KHNyY0ZpbGUpKS5pc1N5bWJvbGljTGluaygpKSB7XG4gICAgICAgICAgICAvLyB1bmxpbmsvcmUtbGluayBpdFxuICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICB5aWVsZCBpb1V0aWwubHN0YXQoZGVzdEZpbGUpO1xuICAgICAgICAgICAgICAgIHlpZWxkIGlvVXRpbC51bmxpbmsoZGVzdEZpbGUpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgY2F0Y2ggKGUpIHtcbiAgICAgICAgICAgICAgICAvLyBUcnkgdG8gb3ZlcnJpZGUgZmlsZSBwZXJtaXNzaW9uXG4gICAgICAgICAgICAgICAgaWYgKGUuY29kZSA9PT0gJ0VQRVJNJykge1xuICAgICAgICAgICAgICAgICAgICB5aWVsZCBpb1V0aWwuY2htb2QoZGVzdEZpbGUsICcwNjY2Jyk7XG4gICAgICAgICAgICAgICAgICAgIHlpZWxkIGlvVXRpbC51bmxpbmsoZGVzdEZpbGUpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAvLyBvdGhlciBlcnJvcnMgPSBpdCBkb2Vzbid0IGV4aXN0LCBubyB3b3JrIHRvIGRvXG4gICAgICAgICAgICB9XG4gICAgICAgICAgICAvLyBDb3B5IG92ZXIgc3ltbGlua1xuICAgICAgICAgICAgY29uc3Qgc3ltbGlua0Z1bGwgPSB5aWVsZCBpb1V0aWwucmVhZGxpbmsoc3JjRmlsZSk7XG4gICAgICAgICAgICB5aWVsZCBpb1V0aWwuc3ltbGluayhzeW1saW5rRnVsbCwgZGVzdEZpbGUsIGlvVXRpbC5JU19XSU5ET1dTID8gJ2p1bmN0aW9uJyA6IG51bGwpO1xuICAgICAgICB9XG4gICAgICAgIGVsc2UgaWYgKCEoeWllbGQgaW9VdGlsLmV4aXN0cyhkZXN0RmlsZSkpIHx8IGZvcmNlKSB7XG4gICAgICAgICAgICB5aWVsZCBpb1V0aWwuY29weUZpbGUoc3JjRmlsZSwgZGVzdEZpbGUpO1xuICAgICAgICB9XG4gICAgfSk7XG59XG4vLyMgc291cmNlTWFwcGluZ1VSTD1pby5qcy5tYXAiLAogICAgIlwidXNlIHN0cmljdFwiO1xudmFyIF9fY3JlYXRlQmluZGluZyA9ICh0aGlzICYmIHRoaXMuX19jcmVhdGVCaW5kaW5nKSB8fCAoT2JqZWN0LmNyZWF0ZSA/IChmdW5jdGlvbihvLCBtLCBrLCBrMikge1xuICAgIGlmIChrMiA9PT0gdW5kZWZpbmVkKSBrMiA9IGs7XG4gICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KG8sIGsyLCB7IGVudW1lcmFibGU6IHRydWUsIGdldDogZnVuY3Rpb24oKSB7IHJldHVybiBtW2tdOyB9IH0pO1xufSkgOiAoZnVuY3Rpb24obywgbSwgaywgazIpIHtcbiAgICBpZiAoazIgPT09IHVuZGVmaW5lZCkgazIgPSBrO1xuICAgIG9bazJdID0gbVtrXTtcbn0pKTtcbnZhciBfX3NldE1vZHVsZURlZmF1bHQgPSAodGhpcyAmJiB0aGlzLl9fc2V0TW9kdWxlRGVmYXVsdCkgfHwgKE9iamVjdC5jcmVhdGUgPyAoZnVuY3Rpb24obywgdikge1xuICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShvLCBcImRlZmF1bHRcIiwgeyBlbnVtZXJhYmxlOiB0cnVlLCB2YWx1ZTogdiB9KTtcbn0pIDogZnVuY3Rpb24obywgdikge1xuICAgIG9bXCJkZWZhdWx0XCJdID0gdjtcbn0pO1xudmFyIF9faW1wb3J0U3RhciA9ICh0aGlzICYmIHRoaXMuX19pbXBvcnRTdGFyKSB8fCBmdW5jdGlvbiAobW9kKSB7XG4gICAgaWYgKG1vZCAmJiBtb2QuX19lc01vZHVsZSkgcmV0dXJuIG1vZDtcbiAgICB2YXIgcmVzdWx0ID0ge307XG4gICAgaWYgKG1vZCAhPSBudWxsKSBmb3IgKHZhciBrIGluIG1vZCkgaWYgKGsgIT09IFwiZGVmYXVsdFwiICYmIE9iamVjdC5oYXNPd25Qcm9wZXJ0eS5jYWxsKG1vZCwgaykpIF9fY3JlYXRlQmluZGluZyhyZXN1bHQsIG1vZCwgayk7XG4gICAgX19zZXRNb2R1bGVEZWZhdWx0KHJlc3VsdCwgbW9kKTtcbiAgICByZXR1cm4gcmVzdWx0O1xufTtcbnZhciBfX2F3YWl0ZXIgPSAodGhpcyAmJiB0aGlzLl9fYXdhaXRlcikgfHwgZnVuY3Rpb24gKHRoaXNBcmcsIF9hcmd1bWVudHMsIFAsIGdlbmVyYXRvcikge1xuICAgIGZ1bmN0aW9uIGFkb3B0KHZhbHVlKSB7IHJldHVybiB2YWx1ZSBpbnN0YW5jZW9mIFAgPyB2YWx1ZSA6IG5ldyBQKGZ1bmN0aW9uIChyZXNvbHZlKSB7IHJlc29sdmUodmFsdWUpOyB9KTsgfVxuICAgIHJldHVybiBuZXcgKFAgfHwgKFAgPSBQcm9taXNlKSkoZnVuY3Rpb24gKHJlc29sdmUsIHJlamVjdCkge1xuICAgICAgICBmdW5jdGlvbiBmdWxmaWxsZWQodmFsdWUpIHsgdHJ5IHsgc3RlcChnZW5lcmF0b3IubmV4dCh2YWx1ZSkpOyB9IGNhdGNoIChlKSB7IHJlamVjdChlKTsgfSB9XG4gICAgICAgIGZ1bmN0aW9uIHJlamVjdGVkKHZhbHVlKSB7IHRyeSB7IHN0ZXAoZ2VuZXJhdG9yW1widGhyb3dcIl0odmFsdWUpKTsgfSBjYXRjaCAoZSkgeyByZWplY3QoZSk7IH0gfVxuICAgICAgICBmdW5jdGlvbiBzdGVwKHJlc3VsdCkgeyByZXN1bHQuZG9uZSA/IHJlc29sdmUocmVzdWx0LnZhbHVlKSA6IGFkb3B0KHJlc3VsdC52YWx1ZSkudGhlbihmdWxmaWxsZWQsIHJlamVjdGVkKTsgfVxuICAgICAgICBzdGVwKChnZW5lcmF0b3IgPSBnZW5lcmF0b3IuYXBwbHkodGhpc0FyZywgX2FyZ3VtZW50cyB8fCBbXSkpLm5leHQoKSk7XG4gICAgfSk7XG59O1xuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiX19lc01vZHVsZVwiLCB7IHZhbHVlOiB0cnVlIH0pO1xuZXhwb3J0cy5hcmdTdHJpbmdUb0FycmF5ID0gZXhwb3J0cy5Ub29sUnVubmVyID0gdm9pZCAwO1xuY29uc3Qgb3MgPSBfX2ltcG9ydFN0YXIocmVxdWlyZShcIm9zXCIpKTtcbmNvbnN0IGV2ZW50cyA9IF9faW1wb3J0U3RhcihyZXF1aXJlKFwiZXZlbnRzXCIpKTtcbmNvbnN0IGNoaWxkID0gX19pbXBvcnRTdGFyKHJlcXVpcmUoXCJjaGlsZF9wcm9jZXNzXCIpKTtcbmNvbnN0IHBhdGggPSBfX2ltcG9ydFN0YXIocmVxdWlyZShcInBhdGhcIikpO1xuY29uc3QgaW8gPSBfX2ltcG9ydFN0YXIocmVxdWlyZShcIkBhY3Rpb25zL2lvXCIpKTtcbmNvbnN0IGlvVXRpbCA9IF9faW1wb3J0U3RhcihyZXF1aXJlKFwiQGFjdGlvbnMvaW8vbGliL2lvLXV0aWxcIikpO1xuY29uc3QgdGltZXJzXzEgPSByZXF1aXJlKFwidGltZXJzXCIpO1xuLyogZXNsaW50LWRpc2FibGUgQHR5cGVzY3JpcHQtZXNsaW50L3VuYm91bmQtbWV0aG9kICovXG5jb25zdCBJU19XSU5ET1dTID0gcHJvY2Vzcy5wbGF0Zm9ybSA9PT0gJ3dpbjMyJztcbi8qXG4gKiBDbGFzcyBmb3IgcnVubmluZyBjb21tYW5kIGxpbmUgdG9vbHMuIEhhbmRsZXMgcXVvdGluZyBhbmQgYXJnIHBhcnNpbmcgaW4gYSBwbGF0Zm9ybSBhZ25vc3RpYyB3YXkuXG4gKi9cbmNsYXNzIFRvb2xSdW5uZXIgZXh0ZW5kcyBldmVudHMuRXZlbnRFbWl0dGVyIHtcbiAgICBjb25zdHJ1Y3Rvcih0b29sUGF0aCwgYXJncywgb3B0aW9ucykge1xuICAgICAgICBzdXBlcigpO1xuICAgICAgICBpZiAoIXRvb2xQYXRoKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJQYXJhbWV0ZXIgJ3Rvb2xQYXRoJyBjYW5ub3QgYmUgbnVsbCBvciBlbXB0eS5cIik7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy50b29sUGF0aCA9IHRvb2xQYXRoO1xuICAgICAgICB0aGlzLmFyZ3MgPSBhcmdzIHx8IFtdO1xuICAgICAgICB0aGlzLm9wdGlvbnMgPSBvcHRpb25zIHx8IHt9O1xuICAgIH1cbiAgICBfZGVidWcobWVzc2FnZSkge1xuICAgICAgICBpZiAodGhpcy5vcHRpb25zLmxpc3RlbmVycyAmJiB0aGlzLm9wdGlvbnMubGlzdGVuZXJzLmRlYnVnKSB7XG4gICAgICAgICAgICB0aGlzLm9wdGlvbnMubGlzdGVuZXJzLmRlYnVnKG1lc3NhZ2UpO1xuICAgICAgICB9XG4gICAgfVxuICAgIF9nZXRDb21tYW5kU3RyaW5nKG9wdGlvbnMsIG5vUHJlZml4KSB7XG4gICAgICAgIGNvbnN0IHRvb2xQYXRoID0gdGhpcy5fZ2V0U3Bhd25GaWxlTmFtZSgpO1xuICAgICAgICBjb25zdCBhcmdzID0gdGhpcy5fZ2V0U3Bhd25BcmdzKG9wdGlvbnMpO1xuICAgICAgICBsZXQgY21kID0gbm9QcmVmaXggPyAnJyA6ICdbY29tbWFuZF0nOyAvLyBvbWl0IHByZWZpeCB3aGVuIHBpcGVkIHRvIGEgc2Vjb25kIHRvb2xcbiAgICAgICAgaWYgKElTX1dJTkRPV1MpIHtcbiAgICAgICAgICAgIC8vIFdpbmRvd3MgKyBjbWQgZmlsZVxuICAgICAgICAgICAgaWYgKHRoaXMuX2lzQ21kRmlsZSgpKSB7XG4gICAgICAgICAgICAgICAgY21kICs9IHRvb2xQYXRoO1xuICAgICAgICAgICAgICAgIGZvciAoY29uc3QgYSBvZiBhcmdzKSB7XG4gICAgICAgICAgICAgICAgICAgIGNtZCArPSBgICR7YX1gO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIC8vIFdpbmRvd3MgKyB2ZXJiYXRpbVxuICAgICAgICAgICAgZWxzZSBpZiAob3B0aW9ucy53aW5kb3dzVmVyYmF0aW1Bcmd1bWVudHMpIHtcbiAgICAgICAgICAgICAgICBjbWQgKz0gYFwiJHt0b29sUGF0aH1cImA7XG4gICAgICAgICAgICAgICAgZm9yIChjb25zdCBhIG9mIGFyZ3MpIHtcbiAgICAgICAgICAgICAgICAgICAgY21kICs9IGAgJHthfWA7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgLy8gV2luZG93cyAocmVndWxhcilcbiAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgIGNtZCArPSB0aGlzLl93aW5kb3dzUXVvdGVDbWRBcmcodG9vbFBhdGgpO1xuICAgICAgICAgICAgICAgIGZvciAoY29uc3QgYSBvZiBhcmdzKSB7XG4gICAgICAgICAgICAgICAgICAgIGNtZCArPSBgICR7dGhpcy5fd2luZG93c1F1b3RlQ21kQXJnKGEpfWA7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgLy8gT1NYL0xpbnV4IC0gdGhpcyBjYW4gbGlrZWx5IGJlIGltcHJvdmVkIHdpdGggc29tZSBmb3JtIG9mIHF1b3RpbmcuXG4gICAgICAgICAgICAvLyBjcmVhdGluZyBwcm9jZXNzZXMgb24gVW5peCBpcyBmdW5kYW1lbnRhbGx5IGRpZmZlcmVudCB0aGFuIFdpbmRvd3MuXG4gICAgICAgICAgICAvLyBvbiBVbml4LCBleGVjdnAoKSB0YWtlcyBhbiBhcmcgYXJyYXkuXG4gICAgICAgICAgICBjbWQgKz0gdG9vbFBhdGg7XG4gICAgICAgICAgICBmb3IgKGNvbnN0IGEgb2YgYXJncykge1xuICAgICAgICAgICAgICAgIGNtZCArPSBgICR7YX1gO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiBjbWQ7XG4gICAgfVxuICAgIF9wcm9jZXNzTGluZUJ1ZmZlcihkYXRhLCBzdHJCdWZmZXIsIG9uTGluZSkge1xuICAgICAgICB0cnkge1xuICAgICAgICAgICAgbGV0IHMgPSBzdHJCdWZmZXIgKyBkYXRhLnRvU3RyaW5nKCk7XG4gICAgICAgICAgICBsZXQgbiA9IHMuaW5kZXhPZihvcy5FT0wpO1xuICAgICAgICAgICAgd2hpbGUgKG4gPiAtMSkge1xuICAgICAgICAgICAgICAgIGNvbnN0IGxpbmUgPSBzLnN1YnN0cmluZygwLCBuKTtcbiAgICAgICAgICAgICAgICBvbkxpbmUobGluZSk7XG4gICAgICAgICAgICAgICAgLy8gdGhlIHJlc3Qgb2YgdGhlIHN0cmluZyAuLi5cbiAgICAgICAgICAgICAgICBzID0gcy5zdWJzdHJpbmcobiArIG9zLkVPTC5sZW5ndGgpO1xuICAgICAgICAgICAgICAgIG4gPSBzLmluZGV4T2Yob3MuRU9MKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiBzO1xuICAgICAgICB9XG4gICAgICAgIGNhdGNoIChlcnIpIHtcbiAgICAgICAgICAgIC8vIHN0cmVhbWluZyBsaW5lcyB0byBjb25zb2xlIGlzIGJlc3QgZWZmb3J0LiAgRG9uJ3QgZmFpbCBhIGJ1aWxkLlxuICAgICAgICAgICAgdGhpcy5fZGVidWcoYGVycm9yIHByb2Nlc3NpbmcgbGluZS4gRmFpbGVkIHdpdGggZXJyb3IgJHtlcnJ9YCk7XG4gICAgICAgICAgICByZXR1cm4gJyc7XG4gICAgICAgIH1cbiAgICB9XG4gICAgX2dldFNwYXduRmlsZU5hbWUoKSB7XG4gICAgICAgIGlmIChJU19XSU5ET1dTKSB7XG4gICAgICAgICAgICBpZiAodGhpcy5faXNDbWRGaWxlKCkpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gcHJvY2Vzcy5lbnZbJ0NPTVNQRUMnXSB8fCAnY21kLmV4ZSc7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHRoaXMudG9vbFBhdGg7XG4gICAgfVxuICAgIF9nZXRTcGF3bkFyZ3Mob3B0aW9ucykge1xuICAgICAgICBpZiAoSVNfV0lORE9XUykge1xuICAgICAgICAgICAgaWYgKHRoaXMuX2lzQ21kRmlsZSgpKSB7XG4gICAgICAgICAgICAgICAgbGV0IGFyZ2xpbmUgPSBgL0QgL1MgL0MgXCIke3RoaXMuX3dpbmRvd3NRdW90ZUNtZEFyZyh0aGlzLnRvb2xQYXRoKX1gO1xuICAgICAgICAgICAgICAgIGZvciAoY29uc3QgYSBvZiB0aGlzLmFyZ3MpIHtcbiAgICAgICAgICAgICAgICAgICAgYXJnbGluZSArPSAnICc7XG4gICAgICAgICAgICAgICAgICAgIGFyZ2xpbmUgKz0gb3B0aW9ucy53aW5kb3dzVmVyYmF0aW1Bcmd1bWVudHNcbiAgICAgICAgICAgICAgICAgICAgICAgID8gYVxuICAgICAgICAgICAgICAgICAgICAgICAgOiB0aGlzLl93aW5kb3dzUXVvdGVDbWRBcmcoYSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGFyZ2xpbmUgKz0gJ1wiJztcbiAgICAgICAgICAgICAgICByZXR1cm4gW2FyZ2xpbmVdO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiB0aGlzLmFyZ3M7XG4gICAgfVxuICAgIF9lbmRzV2l0aChzdHIsIGVuZCkge1xuICAgICAgICByZXR1cm4gc3RyLmVuZHNXaXRoKGVuZCk7XG4gICAgfVxuICAgIF9pc0NtZEZpbGUoKSB7XG4gICAgICAgIGNvbnN0IHVwcGVyVG9vbFBhdGggPSB0aGlzLnRvb2xQYXRoLnRvVXBwZXJDYXNlKCk7XG4gICAgICAgIHJldHVybiAodGhpcy5fZW5kc1dpdGgodXBwZXJUb29sUGF0aCwgJy5DTUQnKSB8fFxuICAgICAgICAgICAgdGhpcy5fZW5kc1dpdGgodXBwZXJUb29sUGF0aCwgJy5CQVQnKSk7XG4gICAgfVxuICAgIF93aW5kb3dzUXVvdGVDbWRBcmcoYXJnKSB7XG4gICAgICAgIC8vIGZvciAuZXhlLCBhcHBseSB0aGUgbm9ybWFsIHF1b3RpbmcgcnVsZXMgdGhhdCBsaWJ1diBhcHBsaWVzXG4gICAgICAgIGlmICghdGhpcy5faXNDbWRGaWxlKCkpIHtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLl91dlF1b3RlQ21kQXJnKGFyZyk7XG4gICAgICAgIH1cbiAgICAgICAgLy8gb3RoZXJ3aXNlIGFwcGx5IHF1b3RpbmcgcnVsZXMgc3BlY2lmaWMgdG8gdGhlIGNtZC5leGUgY29tbWFuZCBsaW5lIHBhcnNlci5cbiAgICAgICAgLy8gdGhlIGxpYnV2IHJ1bGVzIGFyZSBnZW5lcmljIGFuZCBhcmUgbm90IGRlc2lnbmVkIHNwZWNpZmljYWxseSBmb3IgY21kLmV4ZVxuICAgICAgICAvLyBjb21tYW5kIGxpbmUgcGFyc2VyLlxuICAgICAgICAvL1xuICAgICAgICAvLyBmb3IgYSBkZXRhaWxlZCBkZXNjcmlwdGlvbiBvZiB0aGUgY21kLmV4ZSBjb21tYW5kIGxpbmUgcGFyc2VyLCByZWZlciB0b1xuICAgICAgICAvLyBodHRwOi8vc3RhY2tvdmVyZmxvdy5jb20vcXVlc3Rpb25zLzQwOTQ2OTkvaG93LWRvZXMtdGhlLXdpbmRvd3MtY29tbWFuZC1pbnRlcnByZXRlci1jbWQtZXhlLXBhcnNlLXNjcmlwdHMvNzk3MDkxMiM3OTcwOTEyXG4gICAgICAgIC8vIG5lZWQgcXVvdGVzIGZvciBlbXB0eSBhcmdcbiAgICAgICAgaWYgKCFhcmcpIHtcbiAgICAgICAgICAgIHJldHVybiAnXCJcIic7XG4gICAgICAgIH1cbiAgICAgICAgLy8gZGV0ZXJtaW5lIHdoZXRoZXIgdGhlIGFyZyBuZWVkcyB0byBiZSBxdW90ZWRcbiAgICAgICAgY29uc3QgY21kU3BlY2lhbENoYXJzID0gW1xuICAgICAgICAgICAgJyAnLFxuICAgICAgICAgICAgJ1xcdCcsXG4gICAgICAgICAgICAnJicsXG4gICAgICAgICAgICAnKCcsXG4gICAgICAgICAgICAnKScsXG4gICAgICAgICAgICAnWycsXG4gICAgICAgICAgICAnXScsXG4gICAgICAgICAgICAneycsXG4gICAgICAgICAgICAnfScsXG4gICAgICAgICAgICAnXicsXG4gICAgICAgICAgICAnPScsXG4gICAgICAgICAgICAnOycsXG4gICAgICAgICAgICAnIScsXG4gICAgICAgICAgICBcIidcIixcbiAgICAgICAgICAgICcrJyxcbiAgICAgICAgICAgICcsJyxcbiAgICAgICAgICAgICdgJyxcbiAgICAgICAgICAgICd+JyxcbiAgICAgICAgICAgICd8JyxcbiAgICAgICAgICAgICc8JyxcbiAgICAgICAgICAgICc+JyxcbiAgICAgICAgICAgICdcIidcbiAgICAgICAgXTtcbiAgICAgICAgbGV0IG5lZWRzUXVvdGVzID0gZmFsc2U7XG4gICAgICAgIGZvciAoY29uc3QgY2hhciBvZiBhcmcpIHtcbiAgICAgICAgICAgIGlmIChjbWRTcGVjaWFsQ2hhcnMuc29tZSh4ID0+IHggPT09IGNoYXIpKSB7XG4gICAgICAgICAgICAgICAgbmVlZHNRdW90ZXMgPSB0cnVlO1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIC8vIHNob3J0LWNpcmN1aXQgaWYgcXVvdGVzIG5vdCBuZWVkZWRcbiAgICAgICAgaWYgKCFuZWVkc1F1b3Rlcykge1xuICAgICAgICAgICAgcmV0dXJuIGFyZztcbiAgICAgICAgfVxuICAgICAgICAvLyB0aGUgZm9sbG93aW5nIHF1b3RpbmcgcnVsZXMgYXJlIHZlcnkgc2ltaWxhciB0byB0aGUgcnVsZXMgdGhhdCBieSBsaWJ1diBhcHBsaWVzLlxuICAgICAgICAvL1xuICAgICAgICAvLyAxKSB3cmFwIHRoZSBzdHJpbmcgaW4gcXVvdGVzXG4gICAgICAgIC8vXG4gICAgICAgIC8vIDIpIGRvdWJsZS11cCBxdW90ZXMgLSBpLmUuIFwiID0+IFwiXCJcbiAgICAgICAgLy9cbiAgICAgICAgLy8gICAgdGhpcyBpcyBkaWZmZXJlbnQgZnJvbSB0aGUgbGlidXYgcXVvdGluZyBydWxlcy4gbGlidXYgcmVwbGFjZXMgXCIgd2l0aCBcXFwiLCB3aGljaCB1bmZvcnR1bmF0ZWx5XG4gICAgICAgIC8vICAgIGRvZXNuJ3Qgd29yayB3ZWxsIHdpdGggYSBjbWQuZXhlIGNvbW1hbmQgbGluZS5cbiAgICAgICAgLy9cbiAgICAgICAgLy8gICAgbm90ZSwgcmVwbGFjaW5nIFwiIHdpdGggXCJcIiBhbHNvIHdvcmtzIHdlbGwgaWYgdGhlIGFyZyBpcyBwYXNzZWQgdG8gYSBkb3duc3RyZWFtIC5ORVQgY29uc29sZSBhcHAuXG4gICAgICAgIC8vICAgIGZvciBleGFtcGxlLCB0aGUgY29tbWFuZCBsaW5lOlxuICAgICAgICAvLyAgICAgICAgICBmb28uZXhlIFwibXlhcmc6XCJcIm15IHZhbFwiXCJcIlxuICAgICAgICAvLyAgICBpcyBwYXJzZWQgYnkgYSAuTkVUIGNvbnNvbGUgYXBwIGludG8gYW4gYXJnIGFycmF5OlxuICAgICAgICAvLyAgICAgICAgICBbIFwibXlhcmc6XFxcIm15IHZhbFxcXCJcIiBdXG4gICAgICAgIC8vICAgIHdoaWNoIGlzIHRoZSBzYW1lIGVuZCByZXN1bHQgd2hlbiBhcHBseWluZyBsaWJ1diBxdW90aW5nIHJ1bGVzLiBhbHRob3VnaCB0aGUgYWN0dWFsXG4gICAgICAgIC8vICAgIGNvbW1hbmQgbGluZSBmcm9tIGxpYnV2IHF1b3RpbmcgcnVsZXMgd291bGQgbG9vayBsaWtlOlxuICAgICAgICAvLyAgICAgICAgICBmb28uZXhlIFwibXlhcmc6XFxcIm15IHZhbFxcXCJcIlxuICAgICAgICAvL1xuICAgICAgICAvLyAzKSBkb3VibGUtdXAgc2xhc2hlcyB0aGF0IHByZWNlZGUgYSBxdW90ZSxcbiAgICAgICAgLy8gICAgZS5nLiAgaGVsbG8gXFx3b3JsZCAgICA9PiBcImhlbGxvIFxcd29ybGRcIlxuICAgICAgICAvLyAgICAgICAgICBoZWxsb1xcXCJ3b3JsZCAgICA9PiBcImhlbGxvXFxcXFwiXCJ3b3JsZFwiXG4gICAgICAgIC8vICAgICAgICAgIGhlbGxvXFxcXFwid29ybGQgICA9PiBcImhlbGxvXFxcXFxcXFxcIlwid29ybGRcIlxuICAgICAgICAvLyAgICAgICAgICBoZWxsbyB3b3JsZFxcICAgID0+IFwiaGVsbG8gd29ybGRcXFxcXCJcbiAgICAgICAgLy9cbiAgICAgICAgLy8gICAgdGVjaG5pY2FsbHkgdGhpcyBpcyBub3QgcmVxdWlyZWQgZm9yIGEgY21kLmV4ZSBjb21tYW5kIGxpbmUsIG9yIHRoZSBiYXRjaCBhcmd1bWVudCBwYXJzZXIuXG4gICAgICAgIC8vICAgIHRoZSByZWFzb25zIGZvciBpbmNsdWRpbmcgdGhpcyBhcyBhIC5jbWQgcXVvdGluZyBydWxlIGFyZTpcbiAgICAgICAgLy9cbiAgICAgICAgLy8gICAgYSkgdGhpcyBpcyBvcHRpbWl6ZWQgZm9yIHRoZSBzY2VuYXJpbyB3aGVyZSB0aGUgYXJndW1lbnQgaXMgcGFzc2VkIGZyb20gdGhlIC5jbWQgZmlsZSB0byBhblxuICAgICAgICAvLyAgICAgICBleHRlcm5hbCBwcm9ncmFtLiBtYW55IHByb2dyYW1zIChlLmcuIC5ORVQgY29uc29sZSBhcHBzKSByZWx5IG9uIHRoZSBzbGFzaC1kb3VibGluZyBydWxlLlxuICAgICAgICAvL1xuICAgICAgICAvLyAgICBiKSBpdCdzIHdoYXQgd2UndmUgYmVlbiBkb2luZyBwcmV2aW91c2x5IChieSBkZWZlcnJpbmcgdG8gbm9kZSBkZWZhdWx0IGJlaGF2aW9yKSBhbmQgd2VcbiAgICAgICAgLy8gICAgICAgaGF2ZW4ndCBoZWFyZCBhbnkgY29tcGxhaW50cyBhYm91dCB0aGF0IGFzcGVjdC5cbiAgICAgICAgLy9cbiAgICAgICAgLy8gbm90ZSwgYSB3ZWFrbmVzcyBvZiB0aGUgcXVvdGluZyBydWxlcyBjaG9zZW4gaGVyZSwgaXMgdGhhdCAlIGlzIG5vdCBlc2NhcGVkLiBpbiBmYWN0LCAlIGNhbm5vdCBiZVxuICAgICAgICAvLyBlc2NhcGVkIHdoZW4gdXNlZCBvbiB0aGUgY29tbWFuZCBsaW5lIGRpcmVjdGx5IC0gZXZlbiB0aG91Z2ggd2l0aGluIGEgLmNtZCBmaWxlICUgY2FuIGJlIGVzY2FwZWRcbiAgICAgICAgLy8gYnkgdXNpbmcgJSUuXG4gICAgICAgIC8vXG4gICAgICAgIC8vIHRoZSBzYXZpbmcgZ3JhY2UgaXMsIG9uIHRoZSBjb21tYW5kIGxpbmUsICV2YXIlIGlzIGxlZnQgYXMtaXMgaWYgdmFyIGlzIG5vdCBkZWZpbmVkLiB0aGlzIGNvbnRyYXN0c1xuICAgICAgICAvLyB0aGUgbGluZSBwYXJzaW5nIHJ1bGVzIHdpdGhpbiBhIC5jbWQgZmlsZSwgd2hlcmUgaWYgdmFyIGlzIG5vdCBkZWZpbmVkIGl0IGlzIHJlcGxhY2VkIHdpdGggbm90aGluZy5cbiAgICAgICAgLy9cbiAgICAgICAgLy8gb25lIG9wdGlvbiB0aGF0IHdhcyBleHBsb3JlZCB3YXMgcmVwbGFjaW5nICUgd2l0aCBeJSAtIGkuZS4gJXZhciUgPT4gXiV2YXJeJS4gdGhpcyBoYWNrIHdvdWxkXG4gICAgICAgIC8vIG9mdGVuIHdvcmssIHNpbmNlIGl0IGlzIHVubGlrZWx5IHRoYXQgdmFyXiB3b3VsZCBleGlzdCwgYW5kIHRoZSBeIGNoYXJhY3RlciBpcyByZW1vdmVkIHdoZW4gdGhlXG4gICAgICAgIC8vIHZhcmlhYmxlIGlzIHVzZWQuIHRoZSBwcm9ibGVtLCBob3dldmVyLCBpcyB0aGF0IF4gaXMgbm90IHJlbW92ZWQgd2hlbiAlKiBpcyB1c2VkIHRvIHBhc3MgdGhlIGFyZ3NcbiAgICAgICAgLy8gdG8gYW4gZXh0ZXJuYWwgcHJvZ3JhbS5cbiAgICAgICAgLy9cbiAgICAgICAgLy8gYW4gdW5leHBsb3JlZCBwb3RlbnRpYWwgc29sdXRpb24gZm9yIHRoZSAlIGVzY2FwaW5nIHByb2JsZW0sIGlzIHRvIGNyZWF0ZSBhIHdyYXBwZXIgLmNtZCBmaWxlLlxuICAgICAgICAvLyAlIGNhbiBiZSBlc2NhcGVkIHdpdGhpbiBhIC5jbWQgZmlsZS5cbiAgICAgICAgbGV0IHJldmVyc2UgPSAnXCInO1xuICAgICAgICBsZXQgcXVvdGVIaXQgPSB0cnVlO1xuICAgICAgICBmb3IgKGxldCBpID0gYXJnLmxlbmd0aDsgaSA+IDA7IGktLSkge1xuICAgICAgICAgICAgLy8gd2FsayB0aGUgc3RyaW5nIGluIHJldmVyc2VcbiAgICAgICAgICAgIHJldmVyc2UgKz0gYXJnW2kgLSAxXTtcbiAgICAgICAgICAgIGlmIChxdW90ZUhpdCAmJiBhcmdbaSAtIDFdID09PSAnXFxcXCcpIHtcbiAgICAgICAgICAgICAgICByZXZlcnNlICs9ICdcXFxcJzsgLy8gZG91YmxlIHRoZSBzbGFzaFxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSBpZiAoYXJnW2kgLSAxXSA9PT0gJ1wiJykge1xuICAgICAgICAgICAgICAgIHF1b3RlSGl0ID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICByZXZlcnNlICs9ICdcIic7IC8vIGRvdWJsZSB0aGUgcXVvdGVcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgIHF1b3RlSGl0ID0gZmFsc2U7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcmV2ZXJzZSArPSAnXCInO1xuICAgICAgICByZXR1cm4gcmV2ZXJzZVxuICAgICAgICAgICAgLnNwbGl0KCcnKVxuICAgICAgICAgICAgLnJldmVyc2UoKVxuICAgICAgICAgICAgLmpvaW4oJycpO1xuICAgIH1cbiAgICBfdXZRdW90ZUNtZEFyZyhhcmcpIHtcbiAgICAgICAgLy8gVG9vbCBydW5uZXIgd3JhcHMgY2hpbGRfcHJvY2Vzcy5zcGF3bigpIGFuZCBuZWVkcyB0byBhcHBseSB0aGUgc2FtZSBxdW90aW5nIGFzXG4gICAgICAgIC8vIE5vZGUgaW4gY2VydGFpbiBjYXNlcyB3aGVyZSB0aGUgdW5kb2N1bWVudGVkIHNwYXduIG9wdGlvbiB3aW5kb3dzVmVyYmF0aW1Bcmd1bWVudHNcbiAgICAgICAgLy8gaXMgdXNlZC5cbiAgICAgICAgLy9cbiAgICAgICAgLy8gU2luY2UgdGhpcyBmdW5jdGlvbiBpcyBhIHBvcnQgb2YgcXVvdGVfY21kX2FyZyBmcm9tIE5vZGUgNC54ICh0ZWNobmljYWxseSwgbGliIFVWLFxuICAgICAgICAvLyBzZWUgaHR0cHM6Ly9naXRodWIuY29tL25vZGVqcy9ub2RlL2Jsb2IvdjQueC9kZXBzL3V2L3NyYy93aW4vcHJvY2Vzcy5jIGZvciBkZXRhaWxzKSxcbiAgICAgICAgLy8gcGFzdGluZyBjb3B5cmlnaHQgbm90aWNlIGZyb20gTm9kZSB3aXRoaW4gdGhpcyBmdW5jdGlvbjpcbiAgICAgICAgLy9cbiAgICAgICAgLy8gICAgICBDb3B5cmlnaHQgSm95ZW50LCBJbmMuIGFuZCBvdGhlciBOb2RlIGNvbnRyaWJ1dG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC5cbiAgICAgICAgLy9cbiAgICAgICAgLy8gICAgICBQZXJtaXNzaW9uIGlzIGhlcmVieSBncmFudGVkLCBmcmVlIG9mIGNoYXJnZSwgdG8gYW55IHBlcnNvbiBvYnRhaW5pbmcgYSBjb3B5XG4gICAgICAgIC8vICAgICAgb2YgdGhpcyBzb2Z0d2FyZSBhbmQgYXNzb2NpYXRlZCBkb2N1bWVudGF0aW9uIGZpbGVzICh0aGUgXCJTb2Z0d2FyZVwiKSwgdG9cbiAgICAgICAgLy8gICAgICBkZWFsIGluIHRoZSBTb2Z0d2FyZSB3aXRob3V0IHJlc3RyaWN0aW9uLCBpbmNsdWRpbmcgd2l0aG91dCBsaW1pdGF0aW9uIHRoZVxuICAgICAgICAvLyAgICAgIHJpZ2h0cyB0byB1c2UsIGNvcHksIG1vZGlmeSwgbWVyZ2UsIHB1Ymxpc2gsIGRpc3RyaWJ1dGUsIHN1YmxpY2Vuc2UsIGFuZC9vclxuICAgICAgICAvLyAgICAgIHNlbGwgY29waWVzIG9mIHRoZSBTb2Z0d2FyZSwgYW5kIHRvIHBlcm1pdCBwZXJzb25zIHRvIHdob20gdGhlIFNvZnR3YXJlIGlzXG4gICAgICAgIC8vICAgICAgZnVybmlzaGVkIHRvIGRvIHNvLCBzdWJqZWN0IHRvIHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczpcbiAgICAgICAgLy9cbiAgICAgICAgLy8gICAgICBUaGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBzaGFsbCBiZSBpbmNsdWRlZCBpblxuICAgICAgICAvLyAgICAgIGFsbCBjb3BpZXMgb3Igc3Vic3RhbnRpYWwgcG9ydGlvbnMgb2YgdGhlIFNvZnR3YXJlLlxuICAgICAgICAvL1xuICAgICAgICAvLyAgICAgIFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCBcIkFTIElTXCIsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIEVYUFJFU1MgT1JcbiAgICAgICAgLy8gICAgICBJTVBMSUVELCBJTkNMVURJTkcgQlVUIE5PVCBMSU1JVEVEIFRPIFRIRSBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSxcbiAgICAgICAgLy8gICAgICBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBTkQgTk9OSU5GUklOR0VNRU5ULiBJTiBOTyBFVkVOVCBTSEFMTCBUSEVcbiAgICAgICAgLy8gICAgICBBVVRIT1JTIE9SIENPUFlSSUdIVCBIT0xERVJTIEJFIExJQUJMRSBGT1IgQU5ZIENMQUlNLCBEQU1BR0VTIE9SIE9USEVSXG4gICAgICAgIC8vICAgICAgTElBQklMSVRZLCBXSEVUSEVSIElOIEFOIEFDVElPTiBPRiBDT05UUkFDVCwgVE9SVCBPUiBPVEhFUldJU0UsIEFSSVNJTkdcbiAgICAgICAgLy8gICAgICBGUk9NLCBPVVQgT0YgT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBTT0ZUV0FSRSBPUiBUSEUgVVNFIE9SIE9USEVSIERFQUxJTkdTXG4gICAgICAgIC8vICAgICAgSU4gVEhFIFNPRlRXQVJFLlxuICAgICAgICBpZiAoIWFyZykge1xuICAgICAgICAgICAgLy8gTmVlZCBkb3VibGUgcXVvdGF0aW9uIGZvciBlbXB0eSBhcmd1bWVudFxuICAgICAgICAgICAgcmV0dXJuICdcIlwiJztcbiAgICAgICAgfVxuICAgICAgICBpZiAoIWFyZy5pbmNsdWRlcygnICcpICYmICFhcmcuaW5jbHVkZXMoJ1xcdCcpICYmICFhcmcuaW5jbHVkZXMoJ1wiJykpIHtcbiAgICAgICAgICAgIC8vIE5vIHF1b3RhdGlvbiBuZWVkZWRcbiAgICAgICAgICAgIHJldHVybiBhcmc7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKCFhcmcuaW5jbHVkZXMoJ1wiJykgJiYgIWFyZy5pbmNsdWRlcygnXFxcXCcpKSB7XG4gICAgICAgICAgICAvLyBObyBlbWJlZGRlZCBkb3VibGUgcXVvdGVzIG9yIGJhY2tzbGFzaGVzLCBzbyBJIGNhbiBqdXN0IHdyYXBcbiAgICAgICAgICAgIC8vIHF1b3RlIG1hcmtzIGFyb3VuZCB0aGUgd2hvbGUgdGhpbmcuXG4gICAgICAgICAgICByZXR1cm4gYFwiJHthcmd9XCJgO1xuICAgICAgICB9XG4gICAgICAgIC8vIEV4cGVjdGVkIGlucHV0L291dHB1dDpcbiAgICAgICAgLy8gICBpbnB1dCA6IGhlbGxvXCJ3b3JsZFxuICAgICAgICAvLyAgIG91dHB1dDogXCJoZWxsb1xcXCJ3b3JsZFwiXG4gICAgICAgIC8vICAgaW5wdXQgOiBoZWxsb1wiXCJ3b3JsZFxuICAgICAgICAvLyAgIG91dHB1dDogXCJoZWxsb1xcXCJcXFwid29ybGRcIlxuICAgICAgICAvLyAgIGlucHV0IDogaGVsbG9cXHdvcmxkXG4gICAgICAgIC8vICAgb3V0cHV0OiBoZWxsb1xcd29ybGRcbiAgICAgICAgLy8gICBpbnB1dCA6IGhlbGxvXFxcXHdvcmxkXG4gICAgICAgIC8vICAgb3V0cHV0OiBoZWxsb1xcXFx3b3JsZFxuICAgICAgICAvLyAgIGlucHV0IDogaGVsbG9cXFwid29ybGRcbiAgICAgICAgLy8gICBvdXRwdXQ6IFwiaGVsbG9cXFxcXFxcIndvcmxkXCJcbiAgICAgICAgLy8gICBpbnB1dCA6IGhlbGxvXFxcXFwid29ybGRcbiAgICAgICAgLy8gICBvdXRwdXQ6IFwiaGVsbG9cXFxcXFxcXFxcXCJ3b3JsZFwiXG4gICAgICAgIC8vICAgaW5wdXQgOiBoZWxsbyB3b3JsZFxcXG4gICAgICAgIC8vICAgb3V0cHV0OiBcImhlbGxvIHdvcmxkXFxcXFwiIC0gbm90ZSB0aGUgY29tbWVudCBpbiBsaWJ1diBhY3R1YWxseSByZWFkcyBcImhlbGxvIHdvcmxkXFxcIlxuICAgICAgICAvLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnV0IGl0IGFwcGVhcnMgdGhlIGNvbW1lbnQgaXMgd3JvbmcsIGl0IHNob3VsZCBiZSBcImhlbGxvIHdvcmxkXFxcXFwiXG4gICAgICAgIGxldCByZXZlcnNlID0gJ1wiJztcbiAgICAgICAgbGV0IHF1b3RlSGl0ID0gdHJ1ZTtcbiAgICAgICAgZm9yIChsZXQgaSA9IGFyZy5sZW5ndGg7IGkgPiAwOyBpLS0pIHtcbiAgICAgICAgICAgIC8vIHdhbGsgdGhlIHN0cmluZyBpbiByZXZlcnNlXG4gICAgICAgICAgICByZXZlcnNlICs9IGFyZ1tpIC0gMV07XG4gICAgICAgICAgICBpZiAocXVvdGVIaXQgJiYgYXJnW2kgLSAxXSA9PT0gJ1xcXFwnKSB7XG4gICAgICAgICAgICAgICAgcmV2ZXJzZSArPSAnXFxcXCc7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIGlmIChhcmdbaSAtIDFdID09PSAnXCInKSB7XG4gICAgICAgICAgICAgICAgcXVvdGVIaXQgPSB0cnVlO1xuICAgICAgICAgICAgICAgIHJldmVyc2UgKz0gJ1xcXFwnO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgcXVvdGVIaXQgPSBmYWxzZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICByZXZlcnNlICs9ICdcIic7XG4gICAgICAgIHJldHVybiByZXZlcnNlXG4gICAgICAgICAgICAuc3BsaXQoJycpXG4gICAgICAgICAgICAucmV2ZXJzZSgpXG4gICAgICAgICAgICAuam9pbignJyk7XG4gICAgfVxuICAgIF9jbG9uZUV4ZWNPcHRpb25zKG9wdGlvbnMpIHtcbiAgICAgICAgb3B0aW9ucyA9IG9wdGlvbnMgfHwge307XG4gICAgICAgIGNvbnN0IHJlc3VsdCA9IHtcbiAgICAgICAgICAgIGN3ZDogb3B0aW9ucy5jd2QgfHwgcHJvY2Vzcy5jd2QoKSxcbiAgICAgICAgICAgIGVudjogb3B0aW9ucy5lbnYgfHwgcHJvY2Vzcy5lbnYsXG4gICAgICAgICAgICBzaWxlbnQ6IG9wdGlvbnMuc2lsZW50IHx8IGZhbHNlLFxuICAgICAgICAgICAgd2luZG93c1ZlcmJhdGltQXJndW1lbnRzOiBvcHRpb25zLndpbmRvd3NWZXJiYXRpbUFyZ3VtZW50cyB8fCBmYWxzZSxcbiAgICAgICAgICAgIGZhaWxPblN0ZEVycjogb3B0aW9ucy5mYWlsT25TdGRFcnIgfHwgZmFsc2UsXG4gICAgICAgICAgICBpZ25vcmVSZXR1cm5Db2RlOiBvcHRpb25zLmlnbm9yZVJldHVybkNvZGUgfHwgZmFsc2UsXG4gICAgICAgICAgICBkZWxheTogb3B0aW9ucy5kZWxheSB8fCAxMDAwMFxuICAgICAgICB9O1xuICAgICAgICByZXN1bHQub3V0U3RyZWFtID0gb3B0aW9ucy5vdXRTdHJlYW0gfHwgcHJvY2Vzcy5zdGRvdXQ7XG4gICAgICAgIHJlc3VsdC5lcnJTdHJlYW0gPSBvcHRpb25zLmVyclN0cmVhbSB8fCBwcm9jZXNzLnN0ZGVycjtcbiAgICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICB9XG4gICAgX2dldFNwYXduT3B0aW9ucyhvcHRpb25zLCB0b29sUGF0aCkge1xuICAgICAgICBvcHRpb25zID0gb3B0aW9ucyB8fCB7fTtcbiAgICAgICAgY29uc3QgcmVzdWx0ID0ge307XG4gICAgICAgIHJlc3VsdC5jd2QgPSBvcHRpb25zLmN3ZDtcbiAgICAgICAgcmVzdWx0LmVudiA9IG9wdGlvbnMuZW52O1xuICAgICAgICByZXN1bHRbJ3dpbmRvd3NWZXJiYXRpbUFyZ3VtZW50cyddID1cbiAgICAgICAgICAgIG9wdGlvbnMud2luZG93c1ZlcmJhdGltQXJndW1lbnRzIHx8IHRoaXMuX2lzQ21kRmlsZSgpO1xuICAgICAgICBpZiAob3B0aW9ucy53aW5kb3dzVmVyYmF0aW1Bcmd1bWVudHMpIHtcbiAgICAgICAgICAgIHJlc3VsdC5hcmd2MCA9IGBcIiR7dG9vbFBhdGh9XCJgO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIEV4ZWMgYSB0b29sLlxuICAgICAqIE91dHB1dCB3aWxsIGJlIHN0cmVhbWVkIHRvIHRoZSBsaXZlIGNvbnNvbGUuXG4gICAgICogUmV0dXJucyBwcm9taXNlIHdpdGggcmV0dXJuIGNvZGVcbiAgICAgKlxuICAgICAqIEBwYXJhbSAgICAgdG9vbCAgICAgcGF0aCB0byB0b29sIHRvIGV4ZWNcbiAgICAgKiBAcGFyYW0gICAgIG9wdGlvbnMgIG9wdGlvbmFsIGV4ZWMgb3B0aW9ucy4gIFNlZSBFeGVjT3B0aW9uc1xuICAgICAqIEByZXR1cm5zICAgbnVtYmVyXG4gICAgICovXG4gICAgZXhlYygpIHtcbiAgICAgICAgcmV0dXJuIF9fYXdhaXRlcih0aGlzLCB2b2lkIDAsIHZvaWQgMCwgZnVuY3Rpb24qICgpIHtcbiAgICAgICAgICAgIC8vIHJvb3QgdGhlIHRvb2wgcGF0aCBpZiBpdCBpcyB1bnJvb3RlZCBhbmQgY29udGFpbnMgcmVsYXRpdmUgcGF0aGluZ1xuICAgICAgICAgICAgaWYgKCFpb1V0aWwuaXNSb290ZWQodGhpcy50b29sUGF0aCkgJiZcbiAgICAgICAgICAgICAgICAodGhpcy50b29sUGF0aC5pbmNsdWRlcygnLycpIHx8XG4gICAgICAgICAgICAgICAgICAgIChJU19XSU5ET1dTICYmIHRoaXMudG9vbFBhdGguaW5jbHVkZXMoJ1xcXFwnKSkpKSB7XG4gICAgICAgICAgICAgICAgLy8gcHJlZmVyIG9wdGlvbnMuY3dkIGlmIGl0IGlzIHNwZWNpZmllZCwgaG93ZXZlciBvcHRpb25zLmN3ZCBtYXkgYWxzbyBuZWVkIHRvIGJlIHJvb3RlZFxuICAgICAgICAgICAgICAgIHRoaXMudG9vbFBhdGggPSBwYXRoLnJlc29sdmUocHJvY2Vzcy5jd2QoKSwgdGhpcy5vcHRpb25zLmN3ZCB8fCBwcm9jZXNzLmN3ZCgpLCB0aGlzLnRvb2xQYXRoKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIC8vIGlmIHRoZSB0b29sIGlzIG9ubHkgYSBmaWxlIG5hbWUsIHRoZW4gcmVzb2x2ZSBpdCBmcm9tIHRoZSBQQVRIXG4gICAgICAgICAgICAvLyBvdGhlcndpc2UgdmVyaWZ5IGl0IGV4aXN0cyAoYWRkIGV4dGVuc2lvbiBvbiBXaW5kb3dzIGlmIG5lY2Vzc2FyeSlcbiAgICAgICAgICAgIHRoaXMudG9vbFBhdGggPSB5aWVsZCBpby53aGljaCh0aGlzLnRvb2xQYXRoLCB0cnVlKTtcbiAgICAgICAgICAgIHJldHVybiBuZXcgUHJvbWlzZSgocmVzb2x2ZSwgcmVqZWN0KSA9PiBfX2F3YWl0ZXIodGhpcywgdm9pZCAwLCB2b2lkIDAsIGZ1bmN0aW9uKiAoKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5fZGVidWcoYGV4ZWMgdG9vbDogJHt0aGlzLnRvb2xQYXRofWApO1xuICAgICAgICAgICAgICAgIHRoaXMuX2RlYnVnKCdhcmd1bWVudHM6Jyk7XG4gICAgICAgICAgICAgICAgZm9yIChjb25zdCBhcmcgb2YgdGhpcy5hcmdzKSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuX2RlYnVnKGAgICAke2FyZ31gKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgY29uc3Qgb3B0aW9uc05vbk51bGwgPSB0aGlzLl9jbG9uZUV4ZWNPcHRpb25zKHRoaXMub3B0aW9ucyk7XG4gICAgICAgICAgICAgICAgaWYgKCFvcHRpb25zTm9uTnVsbC5zaWxlbnQgJiYgb3B0aW9uc05vbk51bGwub3V0U3RyZWFtKSB7XG4gICAgICAgICAgICAgICAgICAgIG9wdGlvbnNOb25OdWxsLm91dFN0cmVhbS53cml0ZSh0aGlzLl9nZXRDb21tYW5kU3RyaW5nKG9wdGlvbnNOb25OdWxsKSArIG9zLkVPTCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGNvbnN0IHN0YXRlID0gbmV3IEV4ZWNTdGF0ZShvcHRpb25zTm9uTnVsbCwgdGhpcy50b29sUGF0aCk7XG4gICAgICAgICAgICAgICAgc3RhdGUub24oJ2RlYnVnJywgKG1lc3NhZ2UpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5fZGVidWcobWVzc2FnZSk7XG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgaWYgKHRoaXMub3B0aW9ucy5jd2QgJiYgISh5aWVsZCBpb1V0aWwuZXhpc3RzKHRoaXMub3B0aW9ucy5jd2QpKSkge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gcmVqZWN0KG5ldyBFcnJvcihgVGhlIGN3ZDogJHt0aGlzLm9wdGlvbnMuY3dkfSBkb2VzIG5vdCBleGlzdCFgKSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGNvbnN0IGZpbGVOYW1lID0gdGhpcy5fZ2V0U3Bhd25GaWxlTmFtZSgpO1xuICAgICAgICAgICAgICAgIGNvbnN0IGNwID0gY2hpbGQuc3Bhd24oZmlsZU5hbWUsIHRoaXMuX2dldFNwYXduQXJncyhvcHRpb25zTm9uTnVsbCksIHRoaXMuX2dldFNwYXduT3B0aW9ucyh0aGlzLm9wdGlvbnMsIGZpbGVOYW1lKSk7XG4gICAgICAgICAgICAgICAgbGV0IHN0ZGJ1ZmZlciA9ICcnO1xuICAgICAgICAgICAgICAgIGlmIChjcC5zdGRvdXQpIHtcbiAgICAgICAgICAgICAgICAgICAgY3Auc3Rkb3V0Lm9uKCdkYXRhJywgKGRhdGEpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmICh0aGlzLm9wdGlvbnMubGlzdGVuZXJzICYmIHRoaXMub3B0aW9ucy5saXN0ZW5lcnMuc3Rkb3V0KSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5vcHRpb25zLmxpc3RlbmVycy5zdGRvdXQoZGF0YSk7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoIW9wdGlvbnNOb25OdWxsLnNpbGVudCAmJiBvcHRpb25zTm9uTnVsbC5vdXRTdHJlYW0pIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcHRpb25zTm9uTnVsbC5vdXRTdHJlYW0ud3JpdGUoZGF0YSk7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICBzdGRidWZmZXIgPSB0aGlzLl9wcm9jZXNzTGluZUJ1ZmZlcihkYXRhLCBzdGRidWZmZXIsIChsaW5lKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHRoaXMub3B0aW9ucy5saXN0ZW5lcnMgJiYgdGhpcy5vcHRpb25zLmxpc3RlbmVycy5zdGRsaW5lKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMub3B0aW9ucy5saXN0ZW5lcnMuc3RkbGluZShsaW5lKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGxldCBlcnJidWZmZXIgPSAnJztcbiAgICAgICAgICAgICAgICBpZiAoY3Auc3RkZXJyKSB7XG4gICAgICAgICAgICAgICAgICAgIGNwLnN0ZGVyci5vbignZGF0YScsIChkYXRhKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgICAgICBzdGF0ZS5wcm9jZXNzU3RkZXJyID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmICh0aGlzLm9wdGlvbnMubGlzdGVuZXJzICYmIHRoaXMub3B0aW9ucy5saXN0ZW5lcnMuc3RkZXJyKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5vcHRpb25zLmxpc3RlbmVycy5zdGRlcnIoZGF0YSk7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoIW9wdGlvbnNOb25OdWxsLnNpbGVudCAmJlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9wdGlvbnNOb25OdWxsLmVyclN0cmVhbSAmJlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9wdGlvbnNOb25OdWxsLm91dFN0cmVhbSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHMgPSBvcHRpb25zTm9uTnVsbC5mYWlsT25TdGRFcnJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPyBvcHRpb25zTm9uTnVsbC5lcnJTdHJlYW1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOiBvcHRpb25zTm9uTnVsbC5vdXRTdHJlYW07XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcy53cml0ZShkYXRhKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIGVycmJ1ZmZlciA9IHRoaXMuX3Byb2Nlc3NMaW5lQnVmZmVyKGRhdGEsIGVycmJ1ZmZlciwgKGxpbmUpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAodGhpcy5vcHRpb25zLmxpc3RlbmVycyAmJiB0aGlzLm9wdGlvbnMubGlzdGVuZXJzLmVycmxpbmUpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5vcHRpb25zLmxpc3RlbmVycy5lcnJsaW5lKGxpbmUpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgY3Aub24oJ2Vycm9yJywgKGVycikgPT4ge1xuICAgICAgICAgICAgICAgICAgICBzdGF0ZS5wcm9jZXNzRXJyb3IgPSBlcnIubWVzc2FnZTtcbiAgICAgICAgICAgICAgICAgICAgc3RhdGUucHJvY2Vzc0V4aXRlZCA9IHRydWU7XG4gICAgICAgICAgICAgICAgICAgIHN0YXRlLnByb2Nlc3NDbG9zZWQgPSB0cnVlO1xuICAgICAgICAgICAgICAgICAgICBzdGF0ZS5DaGVja0NvbXBsZXRlKCk7XG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgY3Aub24oJ2V4aXQnLCAoY29kZSkgPT4ge1xuICAgICAgICAgICAgICAgICAgICBzdGF0ZS5wcm9jZXNzRXhpdENvZGUgPSBjb2RlO1xuICAgICAgICAgICAgICAgICAgICBzdGF0ZS5wcm9jZXNzRXhpdGVkID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5fZGVidWcoYEV4aXQgY29kZSAke2NvZGV9IHJlY2VpdmVkIGZyb20gdG9vbCAnJHt0aGlzLnRvb2xQYXRofSdgKTtcbiAgICAgICAgICAgICAgICAgICAgc3RhdGUuQ2hlY2tDb21wbGV0ZSgpO1xuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgIGNwLm9uKCdjbG9zZScsIChjb2RlKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgIHN0YXRlLnByb2Nlc3NFeGl0Q29kZSA9IGNvZGU7XG4gICAgICAgICAgICAgICAgICAgIHN0YXRlLnByb2Nlc3NFeGl0ZWQgPSB0cnVlO1xuICAgICAgICAgICAgICAgICAgICBzdGF0ZS5wcm9jZXNzQ2xvc2VkID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5fZGVidWcoYFNURElPIHN0cmVhbXMgaGF2ZSBjbG9zZWQgZm9yIHRvb2wgJyR7dGhpcy50b29sUGF0aH0nYCk7XG4gICAgICAgICAgICAgICAgICAgIHN0YXRlLkNoZWNrQ29tcGxldGUoKTtcbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICBzdGF0ZS5vbignZG9uZScsIChlcnJvciwgZXhpdENvZGUpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKHN0ZGJ1ZmZlci5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmVtaXQoJ3N0ZGxpbmUnLCBzdGRidWZmZXIpO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIGlmIChlcnJidWZmZXIubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5lbWl0KCdlcnJsaW5lJywgZXJyYnVmZmVyKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBjcC5yZW1vdmVBbGxMaXN0ZW5lcnMoKTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKGVycm9yKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICByZWplY3QoZXJyb3IpO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgcmVzb2x2ZShleGl0Q29kZSk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICBpZiAodGhpcy5vcHRpb25zLmlucHV0KSB7XG4gICAgICAgICAgICAgICAgICAgIGlmICghY3Auc3RkaW4pIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcignY2hpbGQgcHJvY2VzcyBtaXNzaW5nIHN0ZGluJyk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgY3Auc3RkaW4uZW5kKHRoaXMub3B0aW9ucy5pbnB1dCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSkpO1xuICAgICAgICB9KTtcbiAgICB9XG59XG5leHBvcnRzLlRvb2xSdW5uZXIgPSBUb29sUnVubmVyO1xuLyoqXG4gKiBDb252ZXJ0IGFuIGFyZyBzdHJpbmcgdG8gYW4gYXJyYXkgb2YgYXJncy4gSGFuZGxlcyBlc2NhcGluZ1xuICpcbiAqIEBwYXJhbSAgICBhcmdTdHJpbmcgICBzdHJpbmcgb2YgYXJndW1lbnRzXG4gKiBAcmV0dXJucyAgc3RyaW5nW10gICAgYXJyYXkgb2YgYXJndW1lbnRzXG4gKi9cbmZ1bmN0aW9uIGFyZ1N0cmluZ1RvQXJyYXkoYXJnU3RyaW5nKSB7XG4gICAgY29uc3QgYXJncyA9IFtdO1xuICAgIGxldCBpblF1b3RlcyA9IGZhbHNlO1xuICAgIGxldCBlc2NhcGVkID0gZmFsc2U7XG4gICAgbGV0IGFyZyA9ICcnO1xuICAgIGZ1bmN0aW9uIGFwcGVuZChjKSB7XG4gICAgICAgIC8vIHdlIG9ubHkgZXNjYXBlIGRvdWJsZSBxdW90ZXMuXG4gICAgICAgIGlmIChlc2NhcGVkICYmIGMgIT09ICdcIicpIHtcbiAgICAgICAgICAgIGFyZyArPSAnXFxcXCc7XG4gICAgICAgIH1cbiAgICAgICAgYXJnICs9IGM7XG4gICAgICAgIGVzY2FwZWQgPSBmYWxzZTtcbiAgICB9XG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCBhcmdTdHJpbmcubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgY29uc3QgYyA9IGFyZ1N0cmluZy5jaGFyQXQoaSk7XG4gICAgICAgIGlmIChjID09PSAnXCInKSB7XG4gICAgICAgICAgICBpZiAoIWVzY2FwZWQpIHtcbiAgICAgICAgICAgICAgICBpblF1b3RlcyA9ICFpblF1b3RlcztcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgIGFwcGVuZChjKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICB9XG4gICAgICAgIGlmIChjID09PSAnXFxcXCcgJiYgZXNjYXBlZCkge1xuICAgICAgICAgICAgYXBwZW5kKGMpO1xuICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGMgPT09ICdcXFxcJyAmJiBpblF1b3Rlcykge1xuICAgICAgICAgICAgZXNjYXBlZCA9IHRydWU7XG4gICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoYyA9PT0gJyAnICYmICFpblF1b3Rlcykge1xuICAgICAgICAgICAgaWYgKGFyZy5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgICAgICAgYXJncy5wdXNoKGFyZyk7XG4gICAgICAgICAgICAgICAgYXJnID0gJyc7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgfVxuICAgICAgICBhcHBlbmQoYyk7XG4gICAgfVxuICAgIGlmIChhcmcubGVuZ3RoID4gMCkge1xuICAgICAgICBhcmdzLnB1c2goYXJnLnRyaW0oKSk7XG4gICAgfVxuICAgIHJldHVybiBhcmdzO1xufVxuZXhwb3J0cy5hcmdTdHJpbmdUb0FycmF5ID0gYXJnU3RyaW5nVG9BcnJheTtcbmNsYXNzIEV4ZWNTdGF0ZSBleHRlbmRzIGV2ZW50cy5FdmVudEVtaXR0ZXIge1xuICAgIGNvbnN0cnVjdG9yKG9wdGlvbnMsIHRvb2xQYXRoKSB7XG4gICAgICAgIHN1cGVyKCk7XG4gICAgICAgIHRoaXMucHJvY2Vzc0Nsb3NlZCA9IGZhbHNlOyAvLyB0cmFja3Mgd2hldGhlciB0aGUgcHJvY2VzcyBoYXMgZXhpdGVkIGFuZCBzdGRpbyBpcyBjbG9zZWRcbiAgICAgICAgdGhpcy5wcm9jZXNzRXJyb3IgPSAnJztcbiAgICAgICAgdGhpcy5wcm9jZXNzRXhpdENvZGUgPSAwO1xuICAgICAgICB0aGlzLnByb2Nlc3NFeGl0ZWQgPSBmYWxzZTsgLy8gdHJhY2tzIHdoZXRoZXIgdGhlIHByb2Nlc3MgaGFzIGV4aXRlZFxuICAgICAgICB0aGlzLnByb2Nlc3NTdGRlcnIgPSBmYWxzZTsgLy8gdHJhY2tzIHdoZXRoZXIgc3RkZXJyIHdhcyB3cml0dGVuIHRvXG4gICAgICAgIHRoaXMuZGVsYXkgPSAxMDAwMDsgLy8gMTAgc2Vjb25kc1xuICAgICAgICB0aGlzLmRvbmUgPSBmYWxzZTtcbiAgICAgICAgdGhpcy50aW1lb3V0ID0gbnVsbDtcbiAgICAgICAgaWYgKCF0b29sUGF0aCkge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCd0b29sUGF0aCBtdXN0IG5vdCBiZSBlbXB0eScpO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMub3B0aW9ucyA9IG9wdGlvbnM7XG4gICAgICAgIHRoaXMudG9vbFBhdGggPSB0b29sUGF0aDtcbiAgICAgICAgaWYgKG9wdGlvbnMuZGVsYXkpIHtcbiAgICAgICAgICAgIHRoaXMuZGVsYXkgPSBvcHRpb25zLmRlbGF5O1xuICAgICAgICB9XG4gICAgfVxuICAgIENoZWNrQ29tcGxldGUoKSB7XG4gICAgICAgIGlmICh0aGlzLmRvbmUpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICBpZiAodGhpcy5wcm9jZXNzQ2xvc2VkKSB7XG4gICAgICAgICAgICB0aGlzLl9zZXRSZXN1bHQoKTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIGlmICh0aGlzLnByb2Nlc3NFeGl0ZWQpIHtcbiAgICAgICAgICAgIHRoaXMudGltZW91dCA9IHRpbWVyc18xLnNldFRpbWVvdXQoRXhlY1N0YXRlLkhhbmRsZVRpbWVvdXQsIHRoaXMuZGVsYXksIHRoaXMpO1xuICAgICAgICB9XG4gICAgfVxuICAgIF9kZWJ1ZyhtZXNzYWdlKSB7XG4gICAgICAgIHRoaXMuZW1pdCgnZGVidWcnLCBtZXNzYWdlKTtcbiAgICB9XG4gICAgX3NldFJlc3VsdCgpIHtcbiAgICAgICAgLy8gZGV0ZXJtaW5lIHdoZXRoZXIgdGhlcmUgaXMgYW4gZXJyb3JcbiAgICAgICAgbGV0IGVycm9yO1xuICAgICAgICBpZiAodGhpcy5wcm9jZXNzRXhpdGVkKSB7XG4gICAgICAgICAgICBpZiAodGhpcy5wcm9jZXNzRXJyb3IpIHtcbiAgICAgICAgICAgICAgICBlcnJvciA9IG5ldyBFcnJvcihgVGhlcmUgd2FzIGFuIGVycm9yIHdoZW4gYXR0ZW1wdGluZyB0byBleGVjdXRlIHRoZSBwcm9jZXNzICcke3RoaXMudG9vbFBhdGh9Jy4gVGhpcyBtYXkgaW5kaWNhdGUgdGhlIHByb2Nlc3MgZmFpbGVkIHRvIHN0YXJ0LiBFcnJvcjogJHt0aGlzLnByb2Nlc3NFcnJvcn1gKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2UgaWYgKHRoaXMucHJvY2Vzc0V4aXRDb2RlICE9PSAwICYmICF0aGlzLm9wdGlvbnMuaWdub3JlUmV0dXJuQ29kZSkge1xuICAgICAgICAgICAgICAgIGVycm9yID0gbmV3IEVycm9yKGBUaGUgcHJvY2VzcyAnJHt0aGlzLnRvb2xQYXRofScgZmFpbGVkIHdpdGggZXhpdCBjb2RlICR7dGhpcy5wcm9jZXNzRXhpdENvZGV9YCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIGlmICh0aGlzLnByb2Nlc3NTdGRlcnIgJiYgdGhpcy5vcHRpb25zLmZhaWxPblN0ZEVycikge1xuICAgICAgICAgICAgICAgIGVycm9yID0gbmV3IEVycm9yKGBUaGUgcHJvY2VzcyAnJHt0aGlzLnRvb2xQYXRofScgZmFpbGVkIGJlY2F1c2Ugb25lIG9yIG1vcmUgbGluZXMgd2VyZSB3cml0dGVuIHRvIHRoZSBTVERFUlIgc3RyZWFtYCk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgLy8gY2xlYXIgdGhlIHRpbWVvdXRcbiAgICAgICAgaWYgKHRoaXMudGltZW91dCkge1xuICAgICAgICAgICAgY2xlYXJUaW1lb3V0KHRoaXMudGltZW91dCk7XG4gICAgICAgICAgICB0aGlzLnRpbWVvdXQgPSBudWxsO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMuZG9uZSA9IHRydWU7XG4gICAgICAgIHRoaXMuZW1pdCgnZG9uZScsIGVycm9yLCB0aGlzLnByb2Nlc3NFeGl0Q29kZSk7XG4gICAgfVxuICAgIHN0YXRpYyBIYW5kbGVUaW1lb3V0KHN0YXRlKSB7XG4gICAgICAgIGlmIChzdGF0ZS5kb25lKSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgaWYgKCFzdGF0ZS5wcm9jZXNzQ2xvc2VkICYmIHN0YXRlLnByb2Nlc3NFeGl0ZWQpIHtcbiAgICAgICAgICAgIGNvbnN0IG1lc3NhZ2UgPSBgVGhlIFNURElPIHN0cmVhbXMgZGlkIG5vdCBjbG9zZSB3aXRoaW4gJHtzdGF0ZS5kZWxheSAvXG4gICAgICAgICAgICAgICAgMTAwMH0gc2Vjb25kcyBvZiB0aGUgZXhpdCBldmVudCBmcm9tIHByb2Nlc3MgJyR7c3RhdGUudG9vbFBhdGh9Jy4gVGhpcyBtYXkgaW5kaWNhdGUgYSBjaGlsZCBwcm9jZXNzIGluaGVyaXRlZCB0aGUgU1RESU8gc3RyZWFtcyBhbmQgaGFzIG5vdCB5ZXQgZXhpdGVkLmA7XG4gICAgICAgICAgICBzdGF0ZS5fZGVidWcobWVzc2FnZSk7XG4gICAgICAgIH1cbiAgICAgICAgc3RhdGUuX3NldFJlc3VsdCgpO1xuICAgIH1cbn1cbi8vIyBzb3VyY2VNYXBwaW5nVVJMPXRvb2xydW5uZXIuanMubWFwIiwKICAgICJcInVzZSBzdHJpY3RcIjtcbnZhciBfX2NyZWF0ZUJpbmRpbmcgPSAodGhpcyAmJiB0aGlzLl9fY3JlYXRlQmluZGluZykgfHwgKE9iamVjdC5jcmVhdGUgPyAoZnVuY3Rpb24obywgbSwgaywgazIpIHtcbiAgICBpZiAoazIgPT09IHVuZGVmaW5lZCkgazIgPSBrO1xuICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShvLCBrMiwgeyBlbnVtZXJhYmxlOiB0cnVlLCBnZXQ6IGZ1bmN0aW9uKCkgeyByZXR1cm4gbVtrXTsgfSB9KTtcbn0pIDogKGZ1bmN0aW9uKG8sIG0sIGssIGsyKSB7XG4gICAgaWYgKGsyID09PSB1bmRlZmluZWQpIGsyID0gaztcbiAgICBvW2syXSA9IG1ba107XG59KSk7XG52YXIgX19zZXRNb2R1bGVEZWZhdWx0ID0gKHRoaXMgJiYgdGhpcy5fX3NldE1vZHVsZURlZmF1bHQpIHx8IChPYmplY3QuY3JlYXRlID8gKGZ1bmN0aW9uKG8sIHYpIHtcbiAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkobywgXCJkZWZhdWx0XCIsIHsgZW51bWVyYWJsZTogdHJ1ZSwgdmFsdWU6IHYgfSk7XG59KSA6IGZ1bmN0aW9uKG8sIHYpIHtcbiAgICBvW1wiZGVmYXVsdFwiXSA9IHY7XG59KTtcbnZhciBfX2ltcG9ydFN0YXIgPSAodGhpcyAmJiB0aGlzLl9faW1wb3J0U3RhcikgfHwgZnVuY3Rpb24gKG1vZCkge1xuICAgIGlmIChtb2QgJiYgbW9kLl9fZXNNb2R1bGUpIHJldHVybiBtb2Q7XG4gICAgdmFyIHJlc3VsdCA9IHt9O1xuICAgIGlmIChtb2QgIT0gbnVsbCkgZm9yICh2YXIgayBpbiBtb2QpIGlmIChrICE9PSBcImRlZmF1bHRcIiAmJiBPYmplY3QuaGFzT3duUHJvcGVydHkuY2FsbChtb2QsIGspKSBfX2NyZWF0ZUJpbmRpbmcocmVzdWx0LCBtb2QsIGspO1xuICAgIF9fc2V0TW9kdWxlRGVmYXVsdChyZXN1bHQsIG1vZCk7XG4gICAgcmV0dXJuIHJlc3VsdDtcbn07XG52YXIgX19hd2FpdGVyID0gKHRoaXMgJiYgdGhpcy5fX2F3YWl0ZXIpIHx8IGZ1bmN0aW9uICh0aGlzQXJnLCBfYXJndW1lbnRzLCBQLCBnZW5lcmF0b3IpIHtcbiAgICBmdW5jdGlvbiBhZG9wdCh2YWx1ZSkgeyByZXR1cm4gdmFsdWUgaW5zdGFuY2VvZiBQID8gdmFsdWUgOiBuZXcgUChmdW5jdGlvbiAocmVzb2x2ZSkgeyByZXNvbHZlKHZhbHVlKTsgfSk7IH1cbiAgICByZXR1cm4gbmV3IChQIHx8IChQID0gUHJvbWlzZSkpKGZ1bmN0aW9uIChyZXNvbHZlLCByZWplY3QpIHtcbiAgICAgICAgZnVuY3Rpb24gZnVsZmlsbGVkKHZhbHVlKSB7IHRyeSB7IHN0ZXAoZ2VuZXJhdG9yLm5leHQodmFsdWUpKTsgfSBjYXRjaCAoZSkgeyByZWplY3QoZSk7IH0gfVxuICAgICAgICBmdW5jdGlvbiByZWplY3RlZCh2YWx1ZSkgeyB0cnkgeyBzdGVwKGdlbmVyYXRvcltcInRocm93XCJdKHZhbHVlKSk7IH0gY2F0Y2ggKGUpIHsgcmVqZWN0KGUpOyB9IH1cbiAgICAgICAgZnVuY3Rpb24gc3RlcChyZXN1bHQpIHsgcmVzdWx0LmRvbmUgPyByZXNvbHZlKHJlc3VsdC52YWx1ZSkgOiBhZG9wdChyZXN1bHQudmFsdWUpLnRoZW4oZnVsZmlsbGVkLCByZWplY3RlZCk7IH1cbiAgICAgICAgc3RlcCgoZ2VuZXJhdG9yID0gZ2VuZXJhdG9yLmFwcGx5KHRoaXNBcmcsIF9hcmd1bWVudHMgfHwgW10pKS5uZXh0KCkpO1xuICAgIH0pO1xufTtcbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIl9fZXNNb2R1bGVcIiwgeyB2YWx1ZTogdHJ1ZSB9KTtcbmV4cG9ydHMuZ2V0RXhlY091dHB1dCA9IGV4cG9ydHMuZXhlYyA9IHZvaWQgMDtcbmNvbnN0IHN0cmluZ19kZWNvZGVyXzEgPSByZXF1aXJlKFwic3RyaW5nX2RlY29kZXJcIik7XG5jb25zdCB0ciA9IF9faW1wb3J0U3RhcihyZXF1aXJlKFwiLi90b29scnVubmVyXCIpKTtcbi8qKlxuICogRXhlYyBhIGNvbW1hbmQuXG4gKiBPdXRwdXQgd2lsbCBiZSBzdHJlYW1lZCB0byB0aGUgbGl2ZSBjb25zb2xlLlxuICogUmV0dXJucyBwcm9taXNlIHdpdGggcmV0dXJuIGNvZGVcbiAqXG4gKiBAcGFyYW0gICAgIGNvbW1hbmRMaW5lICAgICAgICBjb21tYW5kIHRvIGV4ZWN1dGUgKGNhbiBpbmNsdWRlIGFkZGl0aW9uYWwgYXJncykuIE11c3QgYmUgY29ycmVjdGx5IGVzY2FwZWQuXG4gKiBAcGFyYW0gICAgIGFyZ3MgICAgICAgICAgICAgICBvcHRpb25hbCBhcmd1bWVudHMgZm9yIHRvb2wuIEVzY2FwaW5nIGlzIGhhbmRsZWQgYnkgdGhlIGxpYi5cbiAqIEBwYXJhbSAgICAgb3B0aW9ucyAgICAgICAgICAgIG9wdGlvbmFsIGV4ZWMgb3B0aW9ucy4gIFNlZSBFeGVjT3B0aW9uc1xuICogQHJldHVybnMgICBQcm9taXNlPG51bWJlcj4gICAgZXhpdCBjb2RlXG4gKi9cbmZ1bmN0aW9uIGV4ZWMoY29tbWFuZExpbmUsIGFyZ3MsIG9wdGlvbnMpIHtcbiAgICByZXR1cm4gX19hd2FpdGVyKHRoaXMsIHZvaWQgMCwgdm9pZCAwLCBmdW5jdGlvbiogKCkge1xuICAgICAgICBjb25zdCBjb21tYW5kQXJncyA9IHRyLmFyZ1N0cmluZ1RvQXJyYXkoY29tbWFuZExpbmUpO1xuICAgICAgICBpZiAoY29tbWFuZEFyZ3MubGVuZ3RoID09PSAwKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYFBhcmFtZXRlciAnY29tbWFuZExpbmUnIGNhbm5vdCBiZSBudWxsIG9yIGVtcHR5LmApO1xuICAgICAgICB9XG4gICAgICAgIC8vIFBhdGggdG8gdG9vbCB0byBleGVjdXRlIHNob3VsZCBiZSBmaXJzdCBhcmdcbiAgICAgICAgY29uc3QgdG9vbFBhdGggPSBjb21tYW5kQXJnc1swXTtcbiAgICAgICAgYXJncyA9IGNvbW1hbmRBcmdzLnNsaWNlKDEpLmNvbmNhdChhcmdzIHx8IFtdKTtcbiAgICAgICAgY29uc3QgcnVubmVyID0gbmV3IHRyLlRvb2xSdW5uZXIodG9vbFBhdGgsIGFyZ3MsIG9wdGlvbnMpO1xuICAgICAgICByZXR1cm4gcnVubmVyLmV4ZWMoKTtcbiAgICB9KTtcbn1cbmV4cG9ydHMuZXhlYyA9IGV4ZWM7XG4vKipcbiAqIEV4ZWMgYSBjb21tYW5kIGFuZCBnZXQgdGhlIG91dHB1dC5cbiAqIE91dHB1dCB3aWxsIGJlIHN0cmVhbWVkIHRvIHRoZSBsaXZlIGNvbnNvbGUuXG4gKiBSZXR1cm5zIHByb21pc2Ugd2l0aCB0aGUgZXhpdCBjb2RlIGFuZCBjb2xsZWN0ZWQgc3Rkb3V0IGFuZCBzdGRlcnJcbiAqXG4gKiBAcGFyYW0gICAgIGNvbW1hbmRMaW5lICAgICAgICAgICBjb21tYW5kIHRvIGV4ZWN1dGUgKGNhbiBpbmNsdWRlIGFkZGl0aW9uYWwgYXJncykuIE11c3QgYmUgY29ycmVjdGx5IGVzY2FwZWQuXG4gKiBAcGFyYW0gICAgIGFyZ3MgICAgICAgICAgICAgICAgICBvcHRpb25hbCBhcmd1bWVudHMgZm9yIHRvb2wuIEVzY2FwaW5nIGlzIGhhbmRsZWQgYnkgdGhlIGxpYi5cbiAqIEBwYXJhbSAgICAgb3B0aW9ucyAgICAgICAgICAgICAgIG9wdGlvbmFsIGV4ZWMgb3B0aW9ucy4gIFNlZSBFeGVjT3B0aW9uc1xuICogQHJldHVybnMgICBQcm9taXNlPEV4ZWNPdXRwdXQ+ICAgZXhpdCBjb2RlLCBzdGRvdXQsIGFuZCBzdGRlcnJcbiAqL1xuZnVuY3Rpb24gZ2V0RXhlY091dHB1dChjb21tYW5kTGluZSwgYXJncywgb3B0aW9ucykge1xuICAgIHZhciBfYSwgX2I7XG4gICAgcmV0dXJuIF9fYXdhaXRlcih0aGlzLCB2b2lkIDAsIHZvaWQgMCwgZnVuY3Rpb24qICgpIHtcbiAgICAgICAgbGV0IHN0ZG91dCA9ICcnO1xuICAgICAgICBsZXQgc3RkZXJyID0gJyc7XG4gICAgICAgIC8vVXNpbmcgc3RyaW5nIGRlY29kZXIgY292ZXJzIHRoZSBjYXNlIHdoZXJlIGEgbXVsdC1ieXRlIGNoYXJhY3RlciBpcyBzcGxpdFxuICAgICAgICBjb25zdCBzdGRvdXREZWNvZGVyID0gbmV3IHN0cmluZ19kZWNvZGVyXzEuU3RyaW5nRGVjb2RlcigndXRmOCcpO1xuICAgICAgICBjb25zdCBzdGRlcnJEZWNvZGVyID0gbmV3IHN0cmluZ19kZWNvZGVyXzEuU3RyaW5nRGVjb2RlcigndXRmOCcpO1xuICAgICAgICBjb25zdCBvcmlnaW5hbFN0ZG91dExpc3RlbmVyID0gKF9hID0gb3B0aW9ucyA9PT0gbnVsbCB8fCBvcHRpb25zID09PSB2b2lkIDAgPyB2b2lkIDAgOiBvcHRpb25zLmxpc3RlbmVycykgPT09IG51bGwgfHwgX2EgPT09IHZvaWQgMCA/IHZvaWQgMCA6IF9hLnN0ZG91dDtcbiAgICAgICAgY29uc3Qgb3JpZ2luYWxTdGRFcnJMaXN0ZW5lciA9IChfYiA9IG9wdGlvbnMgPT09IG51bGwgfHwgb3B0aW9ucyA9PT0gdm9pZCAwID8gdm9pZCAwIDogb3B0aW9ucy5saXN0ZW5lcnMpID09PSBudWxsIHx8IF9iID09PSB2b2lkIDAgPyB2b2lkIDAgOiBfYi5zdGRlcnI7XG4gICAgICAgIGNvbnN0IHN0ZEVyckxpc3RlbmVyID0gKGRhdGEpID0+IHtcbiAgICAgICAgICAgIHN0ZGVyciArPSBzdGRlcnJEZWNvZGVyLndyaXRlKGRhdGEpO1xuICAgICAgICAgICAgaWYgKG9yaWdpbmFsU3RkRXJyTGlzdGVuZXIpIHtcbiAgICAgICAgICAgICAgICBvcmlnaW5hbFN0ZEVyckxpc3RlbmVyKGRhdGEpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9O1xuICAgICAgICBjb25zdCBzdGRPdXRMaXN0ZW5lciA9IChkYXRhKSA9PiB7XG4gICAgICAgICAgICBzdGRvdXQgKz0gc3Rkb3V0RGVjb2Rlci53cml0ZShkYXRhKTtcbiAgICAgICAgICAgIGlmIChvcmlnaW5hbFN0ZG91dExpc3RlbmVyKSB7XG4gICAgICAgICAgICAgICAgb3JpZ2luYWxTdGRvdXRMaXN0ZW5lcihkYXRhKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfTtcbiAgICAgICAgY29uc3QgbGlzdGVuZXJzID0gT2JqZWN0LmFzc2lnbihPYmplY3QuYXNzaWduKHt9LCBvcHRpb25zID09PSBudWxsIHx8IG9wdGlvbnMgPT09IHZvaWQgMCA/IHZvaWQgMCA6IG9wdGlvbnMubGlzdGVuZXJzKSwgeyBzdGRvdXQ6IHN0ZE91dExpc3RlbmVyLCBzdGRlcnI6IHN0ZEVyckxpc3RlbmVyIH0pO1xuICAgICAgICBjb25zdCBleGl0Q29kZSA9IHlpZWxkIGV4ZWMoY29tbWFuZExpbmUsIGFyZ3MsIE9iamVjdC5hc3NpZ24oT2JqZWN0LmFzc2lnbih7fSwgb3B0aW9ucyksIHsgbGlzdGVuZXJzIH0pKTtcbiAgICAgICAgLy9mbHVzaCBhbnkgcmVtYWluaW5nIGNoYXJhY3RlcnNcbiAgICAgICAgc3Rkb3V0ICs9IHN0ZG91dERlY29kZXIuZW5kKCk7XG4gICAgICAgIHN0ZGVyciArPSBzdGRlcnJEZWNvZGVyLmVuZCgpO1xuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgZXhpdENvZGUsXG4gICAgICAgICAgICBzdGRvdXQsXG4gICAgICAgICAgICBzdGRlcnJcbiAgICAgICAgfTtcbiAgICB9KTtcbn1cbmV4cG9ydHMuZ2V0RXhlY091dHB1dCA9IGdldEV4ZWNPdXRwdXQ7XG4vLyMgc291cmNlTWFwcGluZ1VSTD1leGVjLmpzLm1hcCIsCiAgICAiXCJ1c2Ugc3RyaWN0XCI7XG52YXIgX19jcmVhdGVCaW5kaW5nID0gKHRoaXMgJiYgdGhpcy5fX2NyZWF0ZUJpbmRpbmcpIHx8IChPYmplY3QuY3JlYXRlID8gKGZ1bmN0aW9uKG8sIG0sIGssIGsyKSB7XG4gICAgaWYgKGsyID09PSB1bmRlZmluZWQpIGsyID0gaztcbiAgICB2YXIgZGVzYyA9IE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IobSwgayk7XG4gICAgaWYgKCFkZXNjIHx8IChcImdldFwiIGluIGRlc2MgPyAhbS5fX2VzTW9kdWxlIDogZGVzYy53cml0YWJsZSB8fCBkZXNjLmNvbmZpZ3VyYWJsZSkpIHtcbiAgICAgIGRlc2MgPSB7IGVudW1lcmFibGU6IHRydWUsIGdldDogZnVuY3Rpb24oKSB7IHJldHVybiBtW2tdOyB9IH07XG4gICAgfVxuICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShvLCBrMiwgZGVzYyk7XG59KSA6IChmdW5jdGlvbihvLCBtLCBrLCBrMikge1xuICAgIGlmIChrMiA9PT0gdW5kZWZpbmVkKSBrMiA9IGs7XG4gICAgb1trMl0gPSBtW2tdO1xufSkpO1xudmFyIF9fc2V0TW9kdWxlRGVmYXVsdCA9ICh0aGlzICYmIHRoaXMuX19zZXRNb2R1bGVEZWZhdWx0KSB8fCAoT2JqZWN0LmNyZWF0ZSA/IChmdW5jdGlvbihvLCB2KSB7XG4gICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KG8sIFwiZGVmYXVsdFwiLCB7IGVudW1lcmFibGU6IHRydWUsIHZhbHVlOiB2IH0pO1xufSkgOiBmdW5jdGlvbihvLCB2KSB7XG4gICAgb1tcImRlZmF1bHRcIl0gPSB2O1xufSk7XG52YXIgX19pbXBvcnRTdGFyID0gKHRoaXMgJiYgdGhpcy5fX2ltcG9ydFN0YXIpIHx8IGZ1bmN0aW9uIChtb2QpIHtcbiAgICBpZiAobW9kICYmIG1vZC5fX2VzTW9kdWxlKSByZXR1cm4gbW9kO1xuICAgIHZhciByZXN1bHQgPSB7fTtcbiAgICBpZiAobW9kICE9IG51bGwpIGZvciAodmFyIGsgaW4gbW9kKSBpZiAoayAhPT0gXCJkZWZhdWx0XCIgJiYgT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKG1vZCwgaykpIF9fY3JlYXRlQmluZGluZyhyZXN1bHQsIG1vZCwgayk7XG4gICAgX19zZXRNb2R1bGVEZWZhdWx0KHJlc3VsdCwgbW9kKTtcbiAgICByZXR1cm4gcmVzdWx0O1xufTtcbnZhciBfX2F3YWl0ZXIgPSAodGhpcyAmJiB0aGlzLl9fYXdhaXRlcikgfHwgZnVuY3Rpb24gKHRoaXNBcmcsIF9hcmd1bWVudHMsIFAsIGdlbmVyYXRvcikge1xuICAgIGZ1bmN0aW9uIGFkb3B0KHZhbHVlKSB7IHJldHVybiB2YWx1ZSBpbnN0YW5jZW9mIFAgPyB2YWx1ZSA6IG5ldyBQKGZ1bmN0aW9uIChyZXNvbHZlKSB7IHJlc29sdmUodmFsdWUpOyB9KTsgfVxuICAgIHJldHVybiBuZXcgKFAgfHwgKFAgPSBQcm9taXNlKSkoZnVuY3Rpb24gKHJlc29sdmUsIHJlamVjdCkge1xuICAgICAgICBmdW5jdGlvbiBmdWxmaWxsZWQodmFsdWUpIHsgdHJ5IHsgc3RlcChnZW5lcmF0b3IubmV4dCh2YWx1ZSkpOyB9IGNhdGNoIChlKSB7IHJlamVjdChlKTsgfSB9XG4gICAgICAgIGZ1bmN0aW9uIHJlamVjdGVkKHZhbHVlKSB7IHRyeSB7IHN0ZXAoZ2VuZXJhdG9yW1widGhyb3dcIl0odmFsdWUpKTsgfSBjYXRjaCAoZSkgeyByZWplY3QoZSk7IH0gfVxuICAgICAgICBmdW5jdGlvbiBzdGVwKHJlc3VsdCkgeyByZXN1bHQuZG9uZSA/IHJlc29sdmUocmVzdWx0LnZhbHVlKSA6IGFkb3B0KHJlc3VsdC52YWx1ZSkudGhlbihmdWxmaWxsZWQsIHJlamVjdGVkKTsgfVxuICAgICAgICBzdGVwKChnZW5lcmF0b3IgPSBnZW5lcmF0b3IuYXBwbHkodGhpc0FyZywgX2FyZ3VtZW50cyB8fCBbXSkpLm5leHQoKSk7XG4gICAgfSk7XG59O1xudmFyIF9faW1wb3J0RGVmYXVsdCA9ICh0aGlzICYmIHRoaXMuX19pbXBvcnREZWZhdWx0KSB8fCBmdW5jdGlvbiAobW9kKSB7XG4gICAgcmV0dXJuIChtb2QgJiYgbW9kLl9fZXNNb2R1bGUpID8gbW9kIDogeyBcImRlZmF1bHRcIjogbW9kIH07XG59O1xuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiX19lc01vZHVsZVwiLCB7IHZhbHVlOiB0cnVlIH0pO1xuZXhwb3J0cy5nZXREZXRhaWxzID0gZXhwb3J0cy5pc0xpbnV4ID0gZXhwb3J0cy5pc01hY09TID0gZXhwb3J0cy5pc1dpbmRvd3MgPSBleHBvcnRzLmFyY2ggPSBleHBvcnRzLnBsYXRmb3JtID0gdm9pZCAwO1xuY29uc3Qgb3NfMSA9IF9faW1wb3J0RGVmYXVsdChyZXF1aXJlKFwib3NcIikpO1xuY29uc3QgZXhlYyA9IF9faW1wb3J0U3RhcihyZXF1aXJlKFwiQGFjdGlvbnMvZXhlY1wiKSk7XG5jb25zdCBnZXRXaW5kb3dzSW5mbyA9ICgpID0+IF9fYXdhaXRlcih2b2lkIDAsIHZvaWQgMCwgdm9pZCAwLCBmdW5jdGlvbiogKCkge1xuICAgIGNvbnN0IHsgc3Rkb3V0OiB2ZXJzaW9uIH0gPSB5aWVsZCBleGVjLmdldEV4ZWNPdXRwdXQoJ3Bvd2Vyc2hlbGwgLWNvbW1hbmQgXCIoR2V0LUNpbUluc3RhbmNlIC1DbGFzc05hbWUgV2luMzJfT3BlcmF0aW5nU3lzdGVtKS5WZXJzaW9uXCInLCB1bmRlZmluZWQsIHtcbiAgICAgICAgc2lsZW50OiB0cnVlXG4gICAgfSk7XG4gICAgY29uc3QgeyBzdGRvdXQ6IG5hbWUgfSA9IHlpZWxkIGV4ZWMuZ2V0RXhlY091dHB1dCgncG93ZXJzaGVsbCAtY29tbWFuZCBcIihHZXQtQ2ltSW5zdGFuY2UgLUNsYXNzTmFtZSBXaW4zMl9PcGVyYXRpbmdTeXN0ZW0pLkNhcHRpb25cIicsIHVuZGVmaW5lZCwge1xuICAgICAgICBzaWxlbnQ6IHRydWVcbiAgICB9KTtcbiAgICByZXR1cm4ge1xuICAgICAgICBuYW1lOiBuYW1lLnRyaW0oKSxcbiAgICAgICAgdmVyc2lvbjogdmVyc2lvbi50cmltKClcbiAgICB9O1xufSk7XG5jb25zdCBnZXRNYWNPc0luZm8gPSAoKSA9PiBfX2F3YWl0ZXIodm9pZCAwLCB2b2lkIDAsIHZvaWQgMCwgZnVuY3Rpb24qICgpIHtcbiAgICB2YXIgX2EsIF9iLCBfYywgX2Q7XG4gICAgY29uc3QgeyBzdGRvdXQgfSA9IHlpZWxkIGV4ZWMuZ2V0RXhlY091dHB1dCgnc3dfdmVycycsIHVuZGVmaW5lZCwge1xuICAgICAgICBzaWxlbnQ6IHRydWVcbiAgICB9KTtcbiAgICBjb25zdCB2ZXJzaW9uID0gKF9iID0gKF9hID0gc3Rkb3V0Lm1hdGNoKC9Qcm9kdWN0VmVyc2lvbjpcXHMqKC4rKS8pKSA9PT0gbnVsbCB8fCBfYSA9PT0gdm9pZCAwID8gdm9pZCAwIDogX2FbMV0pICE9PSBudWxsICYmIF9iICE9PSB2b2lkIDAgPyBfYiA6ICcnO1xuICAgIGNvbnN0IG5hbWUgPSAoX2QgPSAoX2MgPSBzdGRvdXQubWF0Y2goL1Byb2R1Y3ROYW1lOlxccyooLispLykpID09PSBudWxsIHx8IF9jID09PSB2b2lkIDAgPyB2b2lkIDAgOiBfY1sxXSkgIT09IG51bGwgJiYgX2QgIT09IHZvaWQgMCA/IF9kIDogJyc7XG4gICAgcmV0dXJuIHtcbiAgICAgICAgbmFtZSxcbiAgICAgICAgdmVyc2lvblxuICAgIH07XG59KTtcbmNvbnN0IGdldExpbnV4SW5mbyA9ICgpID0+IF9fYXdhaXRlcih2b2lkIDAsIHZvaWQgMCwgdm9pZCAwLCBmdW5jdGlvbiogKCkge1xuICAgIGNvbnN0IHsgc3Rkb3V0IH0gPSB5aWVsZCBleGVjLmdldEV4ZWNPdXRwdXQoJ2xzYl9yZWxlYXNlJywgWyctaScsICctcicsICctcyddLCB7XG4gICAgICAgIHNpbGVudDogdHJ1ZVxuICAgIH0pO1xuICAgIGNvbnN0IFtuYW1lLCB2ZXJzaW9uXSA9IHN0ZG91dC50cmltKCkuc3BsaXQoJ1xcbicpO1xuICAgIHJldHVybiB7XG4gICAgICAgIG5hbWUsXG4gICAgICAgIHZlcnNpb25cbiAgICB9O1xufSk7XG5leHBvcnRzLnBsYXRmb3JtID0gb3NfMS5kZWZhdWx0LnBsYXRmb3JtKCk7XG5leHBvcnRzLmFyY2ggPSBvc18xLmRlZmF1bHQuYXJjaCgpO1xuZXhwb3J0cy5pc1dpbmRvd3MgPSBleHBvcnRzLnBsYXRmb3JtID09PSAnd2luMzInO1xuZXhwb3J0cy5pc01hY09TID0gZXhwb3J0cy5wbGF0Zm9ybSA9PT0gJ2Rhcndpbic7XG5leHBvcnRzLmlzTGludXggPSBleHBvcnRzLnBsYXRmb3JtID09PSAnbGludXgnO1xuZnVuY3Rpb24gZ2V0RGV0YWlscygpIHtcbiAgICByZXR1cm4gX19hd2FpdGVyKHRoaXMsIHZvaWQgMCwgdm9pZCAwLCBmdW5jdGlvbiogKCkge1xuICAgICAgICByZXR1cm4gT2JqZWN0LmFzc2lnbihPYmplY3QuYXNzaWduKHt9LCAoeWllbGQgKGV4cG9ydHMuaXNXaW5kb3dzXG4gICAgICAgICAgICA/IGdldFdpbmRvd3NJbmZvKClcbiAgICAgICAgICAgIDogZXhwb3J0cy5pc01hY09TXG4gICAgICAgICAgICAgICAgPyBnZXRNYWNPc0luZm8oKVxuICAgICAgICAgICAgICAgIDogZ2V0TGludXhJbmZvKCkpKSksIHsgcGxhdGZvcm06IGV4cG9ydHMucGxhdGZvcm0sXG4gICAgICAgICAgICBhcmNoOiBleHBvcnRzLmFyY2gsXG4gICAgICAgICAgICBpc1dpbmRvd3M6IGV4cG9ydHMuaXNXaW5kb3dzLFxuICAgICAgICAgICAgaXNNYWNPUzogZXhwb3J0cy5pc01hY09TLFxuICAgICAgICAgICAgaXNMaW51eDogZXhwb3J0cy5pc0xpbnV4IH0pO1xuICAgIH0pO1xufVxuZXhwb3J0cy5nZXREZXRhaWxzID0gZ2V0RGV0YWlscztcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPXBsYXRmb3JtLmpzLm1hcCIsCiAgICAiXCJ1c2Ugc3RyaWN0XCI7XG52YXIgX19jcmVhdGVCaW5kaW5nID0gKHRoaXMgJiYgdGhpcy5fX2NyZWF0ZUJpbmRpbmcpIHx8IChPYmplY3QuY3JlYXRlID8gKGZ1bmN0aW9uKG8sIG0sIGssIGsyKSB7XG4gICAgaWYgKGsyID09PSB1bmRlZmluZWQpIGsyID0gaztcbiAgICB2YXIgZGVzYyA9IE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IobSwgayk7XG4gICAgaWYgKCFkZXNjIHx8IChcImdldFwiIGluIGRlc2MgPyAhbS5fX2VzTW9kdWxlIDogZGVzYy53cml0YWJsZSB8fCBkZXNjLmNvbmZpZ3VyYWJsZSkpIHtcbiAgICAgIGRlc2MgPSB7IGVudW1lcmFibGU6IHRydWUsIGdldDogZnVuY3Rpb24oKSB7IHJldHVybiBtW2tdOyB9IH07XG4gICAgfVxuICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShvLCBrMiwgZGVzYyk7XG59KSA6IChmdW5jdGlvbihvLCBtLCBrLCBrMikge1xuICAgIGlmIChrMiA9PT0gdW5kZWZpbmVkKSBrMiA9IGs7XG4gICAgb1trMl0gPSBtW2tdO1xufSkpO1xudmFyIF9fc2V0TW9kdWxlRGVmYXVsdCA9ICh0aGlzICYmIHRoaXMuX19zZXRNb2R1bGVEZWZhdWx0KSB8fCAoT2JqZWN0LmNyZWF0ZSA/IChmdW5jdGlvbihvLCB2KSB7XG4gICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KG8sIFwiZGVmYXVsdFwiLCB7IGVudW1lcmFibGU6IHRydWUsIHZhbHVlOiB2IH0pO1xufSkgOiBmdW5jdGlvbihvLCB2KSB7XG4gICAgb1tcImRlZmF1bHRcIl0gPSB2O1xufSk7XG52YXIgX19pbXBvcnRTdGFyID0gKHRoaXMgJiYgdGhpcy5fX2ltcG9ydFN0YXIpIHx8IGZ1bmN0aW9uIChtb2QpIHtcbiAgICBpZiAobW9kICYmIG1vZC5fX2VzTW9kdWxlKSByZXR1cm4gbW9kO1xuICAgIHZhciByZXN1bHQgPSB7fTtcbiAgICBpZiAobW9kICE9IG51bGwpIGZvciAodmFyIGsgaW4gbW9kKSBpZiAoayAhPT0gXCJkZWZhdWx0XCIgJiYgT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKG1vZCwgaykpIF9fY3JlYXRlQmluZGluZyhyZXN1bHQsIG1vZCwgayk7XG4gICAgX19zZXRNb2R1bGVEZWZhdWx0KHJlc3VsdCwgbW9kKTtcbiAgICByZXR1cm4gcmVzdWx0O1xufTtcbnZhciBfX2F3YWl0ZXIgPSAodGhpcyAmJiB0aGlzLl9fYXdhaXRlcikgfHwgZnVuY3Rpb24gKHRoaXNBcmcsIF9hcmd1bWVudHMsIFAsIGdlbmVyYXRvcikge1xuICAgIGZ1bmN0aW9uIGFkb3B0KHZhbHVlKSB7IHJldHVybiB2YWx1ZSBpbnN0YW5jZW9mIFAgPyB2YWx1ZSA6IG5ldyBQKGZ1bmN0aW9uIChyZXNvbHZlKSB7IHJlc29sdmUodmFsdWUpOyB9KTsgfVxuICAgIHJldHVybiBuZXcgKFAgfHwgKFAgPSBQcm9taXNlKSkoZnVuY3Rpb24gKHJlc29sdmUsIHJlamVjdCkge1xuICAgICAgICBmdW5jdGlvbiBmdWxmaWxsZWQodmFsdWUpIHsgdHJ5IHsgc3RlcChnZW5lcmF0b3IubmV4dCh2YWx1ZSkpOyB9IGNhdGNoIChlKSB7IHJlamVjdChlKTsgfSB9XG4gICAgICAgIGZ1bmN0aW9uIHJlamVjdGVkKHZhbHVlKSB7IHRyeSB7IHN0ZXAoZ2VuZXJhdG9yW1widGhyb3dcIl0odmFsdWUpKTsgfSBjYXRjaCAoZSkgeyByZWplY3QoZSk7IH0gfVxuICAgICAgICBmdW5jdGlvbiBzdGVwKHJlc3VsdCkgeyByZXN1bHQuZG9uZSA/IHJlc29sdmUocmVzdWx0LnZhbHVlKSA6IGFkb3B0KHJlc3VsdC52YWx1ZSkudGhlbihmdWxmaWxsZWQsIHJlamVjdGVkKTsgfVxuICAgICAgICBzdGVwKChnZW5lcmF0b3IgPSBnZW5lcmF0b3IuYXBwbHkodGhpc0FyZywgX2FyZ3VtZW50cyB8fCBbXSkpLm5leHQoKSk7XG4gICAgfSk7XG59O1xuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiX19lc01vZHVsZVwiLCB7IHZhbHVlOiB0cnVlIH0pO1xuZXhwb3J0cy5wbGF0Zm9ybSA9IGV4cG9ydHMudG9QbGF0Zm9ybVBhdGggPSBleHBvcnRzLnRvV2luMzJQYXRoID0gZXhwb3J0cy50b1Bvc2l4UGF0aCA9IGV4cG9ydHMubWFya2Rvd25TdW1tYXJ5ID0gZXhwb3J0cy5zdW1tYXJ5ID0gZXhwb3J0cy5nZXRJRFRva2VuID0gZXhwb3J0cy5nZXRTdGF0ZSA9IGV4cG9ydHMuc2F2ZVN0YXRlID0gZXhwb3J0cy5ncm91cCA9IGV4cG9ydHMuZW5kR3JvdXAgPSBleHBvcnRzLnN0YXJ0R3JvdXAgPSBleHBvcnRzLmluZm8gPSBleHBvcnRzLm5vdGljZSA9IGV4cG9ydHMud2FybmluZyA9IGV4cG9ydHMuZXJyb3IgPSBleHBvcnRzLmRlYnVnID0gZXhwb3J0cy5pc0RlYnVnID0gZXhwb3J0cy5zZXRGYWlsZWQgPSBleHBvcnRzLnNldENvbW1hbmRFY2hvID0gZXhwb3J0cy5zZXRPdXRwdXQgPSBleHBvcnRzLmdldEJvb2xlYW5JbnB1dCA9IGV4cG9ydHMuZ2V0TXVsdGlsaW5lSW5wdXQgPSBleHBvcnRzLmdldElucHV0ID0gZXhwb3J0cy5hZGRQYXRoID0gZXhwb3J0cy5zZXRTZWNyZXQgPSBleHBvcnRzLmV4cG9ydFZhcmlhYmxlID0gZXhwb3J0cy5FeGl0Q29kZSA9IHZvaWQgMDtcbmNvbnN0IGNvbW1hbmRfMSA9IHJlcXVpcmUoXCIuL2NvbW1hbmRcIik7XG5jb25zdCBmaWxlX2NvbW1hbmRfMSA9IHJlcXVpcmUoXCIuL2ZpbGUtY29tbWFuZFwiKTtcbmNvbnN0IHV0aWxzXzEgPSByZXF1aXJlKFwiLi91dGlsc1wiKTtcbmNvbnN0IG9zID0gX19pbXBvcnRTdGFyKHJlcXVpcmUoXCJvc1wiKSk7XG5jb25zdCBwYXRoID0gX19pbXBvcnRTdGFyKHJlcXVpcmUoXCJwYXRoXCIpKTtcbmNvbnN0IG9pZGNfdXRpbHNfMSA9IHJlcXVpcmUoXCIuL29pZGMtdXRpbHNcIik7XG4vKipcbiAqIFRoZSBjb2RlIHRvIGV4aXQgYW4gYWN0aW9uXG4gKi9cbnZhciBFeGl0Q29kZTtcbihmdW5jdGlvbiAoRXhpdENvZGUpIHtcbiAgICAvKipcbiAgICAgKiBBIGNvZGUgaW5kaWNhdGluZyB0aGF0IHRoZSBhY3Rpb24gd2FzIHN1Y2Nlc3NmdWxcbiAgICAgKi9cbiAgICBFeGl0Q29kZVtFeGl0Q29kZVtcIlN1Y2Nlc3NcIl0gPSAwXSA9IFwiU3VjY2Vzc1wiO1xuICAgIC8qKlxuICAgICAqIEEgY29kZSBpbmRpY2F0aW5nIHRoYXQgdGhlIGFjdGlvbiB3YXMgYSBmYWlsdXJlXG4gICAgICovXG4gICAgRXhpdENvZGVbRXhpdENvZGVbXCJGYWlsdXJlXCJdID0gMV0gPSBcIkZhaWx1cmVcIjtcbn0pKEV4aXRDb2RlIHx8IChleHBvcnRzLkV4aXRDb2RlID0gRXhpdENvZGUgPSB7fSkpO1xuLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuLy8gVmFyaWFibGVzXG4vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4vKipcbiAqIFNldHMgZW52IHZhcmlhYmxlIGZvciB0aGlzIGFjdGlvbiBhbmQgZnV0dXJlIGFjdGlvbnMgaW4gdGhlIGpvYlxuICogQHBhcmFtIG5hbWUgdGhlIG5hbWUgb2YgdGhlIHZhcmlhYmxlIHRvIHNldFxuICogQHBhcmFtIHZhbCB0aGUgdmFsdWUgb2YgdGhlIHZhcmlhYmxlLiBOb24tc3RyaW5nIHZhbHVlcyB3aWxsIGJlIGNvbnZlcnRlZCB0byBhIHN0cmluZyB2aWEgSlNPTi5zdHJpbmdpZnlcbiAqL1xuLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby1leHBsaWNpdC1hbnlcbmZ1bmN0aW9uIGV4cG9ydFZhcmlhYmxlKG5hbWUsIHZhbCkge1xuICAgIGNvbnN0IGNvbnZlcnRlZFZhbCA9ICgwLCB1dGlsc18xLnRvQ29tbWFuZFZhbHVlKSh2YWwpO1xuICAgIHByb2Nlc3MuZW52W25hbWVdID0gY29udmVydGVkVmFsO1xuICAgIGNvbnN0IGZpbGVQYXRoID0gcHJvY2Vzcy5lbnZbJ0dJVEhVQl9FTlYnXSB8fCAnJztcbiAgICBpZiAoZmlsZVBhdGgpIHtcbiAgICAgICAgcmV0dXJuICgwLCBmaWxlX2NvbW1hbmRfMS5pc3N1ZUZpbGVDb21tYW5kKSgnRU5WJywgKDAsIGZpbGVfY29tbWFuZF8xLnByZXBhcmVLZXlWYWx1ZU1lc3NhZ2UpKG5hbWUsIHZhbCkpO1xuICAgIH1cbiAgICAoMCwgY29tbWFuZF8xLmlzc3VlQ29tbWFuZCkoJ3NldC1lbnYnLCB7IG5hbWUgfSwgY29udmVydGVkVmFsKTtcbn1cbmV4cG9ydHMuZXhwb3J0VmFyaWFibGUgPSBleHBvcnRWYXJpYWJsZTtcbi8qKlxuICogUmVnaXN0ZXJzIGEgc2VjcmV0IHdoaWNoIHdpbGwgZ2V0IG1hc2tlZCBmcm9tIGxvZ3NcbiAqIEBwYXJhbSBzZWNyZXQgdmFsdWUgb2YgdGhlIHNlY3JldFxuICovXG5mdW5jdGlvbiBzZXRTZWNyZXQoc2VjcmV0KSB7XG4gICAgKDAsIGNvbW1hbmRfMS5pc3N1ZUNvbW1hbmQpKCdhZGQtbWFzaycsIHt9LCBzZWNyZXQpO1xufVxuZXhwb3J0cy5zZXRTZWNyZXQgPSBzZXRTZWNyZXQ7XG4vKipcbiAqIFByZXBlbmRzIGlucHV0UGF0aCB0byB0aGUgUEFUSCAoZm9yIHRoaXMgYWN0aW9uIGFuZCBmdXR1cmUgYWN0aW9ucylcbiAqIEBwYXJhbSBpbnB1dFBhdGhcbiAqL1xuZnVuY3Rpb24gYWRkUGF0aChpbnB1dFBhdGgpIHtcbiAgICBjb25zdCBmaWxlUGF0aCA9IHByb2Nlc3MuZW52WydHSVRIVUJfUEFUSCddIHx8ICcnO1xuICAgIGlmIChmaWxlUGF0aCkge1xuICAgICAgICAoMCwgZmlsZV9jb21tYW5kXzEuaXNzdWVGaWxlQ29tbWFuZCkoJ1BBVEgnLCBpbnB1dFBhdGgpO1xuICAgIH1cbiAgICBlbHNlIHtcbiAgICAgICAgKDAsIGNvbW1hbmRfMS5pc3N1ZUNvbW1hbmQpKCdhZGQtcGF0aCcsIHt9LCBpbnB1dFBhdGgpO1xuICAgIH1cbiAgICBwcm9jZXNzLmVudlsnUEFUSCddID0gYCR7aW5wdXRQYXRofSR7cGF0aC5kZWxpbWl0ZXJ9JHtwcm9jZXNzLmVudlsnUEFUSCddfWA7XG59XG5leHBvcnRzLmFkZFBhdGggPSBhZGRQYXRoO1xuLyoqXG4gKiBHZXRzIHRoZSB2YWx1ZSBvZiBhbiBpbnB1dC5cbiAqIFVubGVzcyB0cmltV2hpdGVzcGFjZSBpcyBzZXQgdG8gZmFsc2UgaW4gSW5wdXRPcHRpb25zLCB0aGUgdmFsdWUgaXMgYWxzbyB0cmltbWVkLlxuICogUmV0dXJucyBhbiBlbXB0eSBzdHJpbmcgaWYgdGhlIHZhbHVlIGlzIG5vdCBkZWZpbmVkLlxuICpcbiAqIEBwYXJhbSAgICAgbmFtZSAgICAgbmFtZSBvZiB0aGUgaW5wdXQgdG8gZ2V0XG4gKiBAcGFyYW0gICAgIG9wdGlvbnMgIG9wdGlvbmFsLiBTZWUgSW5wdXRPcHRpb25zLlxuICogQHJldHVybnMgICBzdHJpbmdcbiAqL1xuZnVuY3Rpb24gZ2V0SW5wdXQobmFtZSwgb3B0aW9ucykge1xuICAgIGNvbnN0IHZhbCA9IHByb2Nlc3MuZW52W2BJTlBVVF8ke25hbWUucmVwbGFjZSgvIC9nLCAnXycpLnRvVXBwZXJDYXNlKCl9YF0gfHwgJyc7XG4gICAgaWYgKG9wdGlvbnMgJiYgb3B0aW9ucy5yZXF1aXJlZCAmJiAhdmFsKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihgSW5wdXQgcmVxdWlyZWQgYW5kIG5vdCBzdXBwbGllZDogJHtuYW1lfWApO1xuICAgIH1cbiAgICBpZiAob3B0aW9ucyAmJiBvcHRpb25zLnRyaW1XaGl0ZXNwYWNlID09PSBmYWxzZSkge1xuICAgICAgICByZXR1cm4gdmFsO1xuICAgIH1cbiAgICByZXR1cm4gdmFsLnRyaW0oKTtcbn1cbmV4cG9ydHMuZ2V0SW5wdXQgPSBnZXRJbnB1dDtcbi8qKlxuICogR2V0cyB0aGUgdmFsdWVzIG9mIGFuIG11bHRpbGluZSBpbnB1dC4gIEVhY2ggdmFsdWUgaXMgYWxzbyB0cmltbWVkLlxuICpcbiAqIEBwYXJhbSAgICAgbmFtZSAgICAgbmFtZSBvZiB0aGUgaW5wdXQgdG8gZ2V0XG4gKiBAcGFyYW0gICAgIG9wdGlvbnMgIG9wdGlvbmFsLiBTZWUgSW5wdXRPcHRpb25zLlxuICogQHJldHVybnMgICBzdHJpbmdbXVxuICpcbiAqL1xuZnVuY3Rpb24gZ2V0TXVsdGlsaW5lSW5wdXQobmFtZSwgb3B0aW9ucykge1xuICAgIGNvbnN0IGlucHV0cyA9IGdldElucHV0KG5hbWUsIG9wdGlvbnMpXG4gICAgICAgIC5zcGxpdCgnXFxuJylcbiAgICAgICAgLmZpbHRlcih4ID0+IHggIT09ICcnKTtcbiAgICBpZiAob3B0aW9ucyAmJiBvcHRpb25zLnRyaW1XaGl0ZXNwYWNlID09PSBmYWxzZSkge1xuICAgICAgICByZXR1cm4gaW5wdXRzO1xuICAgIH1cbiAgICByZXR1cm4gaW5wdXRzLm1hcChpbnB1dCA9PiBpbnB1dC50cmltKCkpO1xufVxuZXhwb3J0cy5nZXRNdWx0aWxpbmVJbnB1dCA9IGdldE11bHRpbGluZUlucHV0O1xuLyoqXG4gKiBHZXRzIHRoZSBpbnB1dCB2YWx1ZSBvZiB0aGUgYm9vbGVhbiB0eXBlIGluIHRoZSBZQU1MIDEuMiBcImNvcmUgc2NoZW1hXCIgc3BlY2lmaWNhdGlvbi5cbiAqIFN1cHBvcnQgYm9vbGVhbiBpbnB1dCBsaXN0OiBgdHJ1ZSB8IFRydWUgfCBUUlVFIHwgZmFsc2UgfCBGYWxzZSB8IEZBTFNFYCAuXG4gKiBUaGUgcmV0dXJuIHZhbHVlIGlzIGFsc28gaW4gYm9vbGVhbiB0eXBlLlxuICogcmVmOiBodHRwczovL3lhbWwub3JnL3NwZWMvMS4yL3NwZWMuaHRtbCNpZDI4MDQ5MjNcbiAqXG4gKiBAcGFyYW0gICAgIG5hbWUgICAgIG5hbWUgb2YgdGhlIGlucHV0IHRvIGdldFxuICogQHBhcmFtICAgICBvcHRpb25zICBvcHRpb25hbC4gU2VlIElucHV0T3B0aW9ucy5cbiAqIEByZXR1cm5zICAgYm9vbGVhblxuICovXG5mdW5jdGlvbiBnZXRCb29sZWFuSW5wdXQobmFtZSwgb3B0aW9ucykge1xuICAgIGNvbnN0IHRydWVWYWx1ZSA9IFsndHJ1ZScsICdUcnVlJywgJ1RSVUUnXTtcbiAgICBjb25zdCBmYWxzZVZhbHVlID0gWydmYWxzZScsICdGYWxzZScsICdGQUxTRSddO1xuICAgIGNvbnN0IHZhbCA9IGdldElucHV0KG5hbWUsIG9wdGlvbnMpO1xuICAgIGlmICh0cnVlVmFsdWUuaW5jbHVkZXModmFsKSlcbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgaWYgKGZhbHNlVmFsdWUuaW5jbHVkZXModmFsKSlcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIHRocm93IG5ldyBUeXBlRXJyb3IoYElucHV0IGRvZXMgbm90IG1lZXQgWUFNTCAxLjIgXCJDb3JlIFNjaGVtYVwiIHNwZWNpZmljYXRpb246ICR7bmFtZX1cXG5gICtcbiAgICAgICAgYFN1cHBvcnQgYm9vbGVhbiBpbnB1dCBsaXN0OiBcXGB0cnVlIHwgVHJ1ZSB8IFRSVUUgfCBmYWxzZSB8IEZhbHNlIHwgRkFMU0VcXGBgKTtcbn1cbmV4cG9ydHMuZ2V0Qm9vbGVhbklucHV0ID0gZ2V0Qm9vbGVhbklucHV0O1xuLyoqXG4gKiBTZXRzIHRoZSB2YWx1ZSBvZiBhbiBvdXRwdXQuXG4gKlxuICogQHBhcmFtICAgICBuYW1lICAgICBuYW1lIG9mIHRoZSBvdXRwdXQgdG8gc2V0XG4gKiBAcGFyYW0gICAgIHZhbHVlICAgIHZhbHVlIHRvIHN0b3JlLiBOb24tc3RyaW5nIHZhbHVlcyB3aWxsIGJlIGNvbnZlcnRlZCB0byBhIHN0cmluZyB2aWEgSlNPTi5zdHJpbmdpZnlcbiAqL1xuLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby1leHBsaWNpdC1hbnlcbmZ1bmN0aW9uIHNldE91dHB1dChuYW1lLCB2YWx1ZSkge1xuICAgIGNvbnN0IGZpbGVQYXRoID0gcHJvY2Vzcy5lbnZbJ0dJVEhVQl9PVVRQVVQnXSB8fCAnJztcbiAgICBpZiAoZmlsZVBhdGgpIHtcbiAgICAgICAgcmV0dXJuICgwLCBmaWxlX2NvbW1hbmRfMS5pc3N1ZUZpbGVDb21tYW5kKSgnT1VUUFVUJywgKDAsIGZpbGVfY29tbWFuZF8xLnByZXBhcmVLZXlWYWx1ZU1lc3NhZ2UpKG5hbWUsIHZhbHVlKSk7XG4gICAgfVxuICAgIHByb2Nlc3Muc3Rkb3V0LndyaXRlKG9zLkVPTCk7XG4gICAgKDAsIGNvbW1hbmRfMS5pc3N1ZUNvbW1hbmQpKCdzZXQtb3V0cHV0JywgeyBuYW1lIH0sICgwLCB1dGlsc18xLnRvQ29tbWFuZFZhbHVlKSh2YWx1ZSkpO1xufVxuZXhwb3J0cy5zZXRPdXRwdXQgPSBzZXRPdXRwdXQ7XG4vKipcbiAqIEVuYWJsZXMgb3IgZGlzYWJsZXMgdGhlIGVjaG9pbmcgb2YgY29tbWFuZHMgaW50byBzdGRvdXQgZm9yIHRoZSByZXN0IG9mIHRoZSBzdGVwLlxuICogRWNob2luZyBpcyBkaXNhYmxlZCBieSBkZWZhdWx0IGlmIEFDVElPTlNfU1RFUF9ERUJVRyBpcyBub3Qgc2V0LlxuICpcbiAqL1xuZnVuY3Rpb24gc2V0Q29tbWFuZEVjaG8oZW5hYmxlZCkge1xuICAgICgwLCBjb21tYW5kXzEuaXNzdWUpKCdlY2hvJywgZW5hYmxlZCA/ICdvbicgOiAnb2ZmJyk7XG59XG5leHBvcnRzLnNldENvbW1hbmRFY2hvID0gc2V0Q29tbWFuZEVjaG87XG4vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4vLyBSZXN1bHRzXG4vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4vKipcbiAqIFNldHMgdGhlIGFjdGlvbiBzdGF0dXMgdG8gZmFpbGVkLlxuICogV2hlbiB0aGUgYWN0aW9uIGV4aXRzIGl0IHdpbGwgYmUgd2l0aCBhbiBleGl0IGNvZGUgb2YgMVxuICogQHBhcmFtIG1lc3NhZ2UgYWRkIGVycm9yIGlzc3VlIG1lc3NhZ2VcbiAqL1xuZnVuY3Rpb24gc2V0RmFpbGVkKG1lc3NhZ2UpIHtcbiAgICBwcm9jZXNzLmV4aXRDb2RlID0gRXhpdENvZGUuRmFpbHVyZTtcbiAgICBlcnJvcihtZXNzYWdlKTtcbn1cbmV4cG9ydHMuc2V0RmFpbGVkID0gc2V0RmFpbGVkO1xuLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuLy8gTG9nZ2luZyBDb21tYW5kc1xuLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuLyoqXG4gKiBHZXRzIHdoZXRoZXIgQWN0aW9ucyBTdGVwIERlYnVnIGlzIG9uIG9yIG5vdFxuICovXG5mdW5jdGlvbiBpc0RlYnVnKCkge1xuICAgIHJldHVybiBwcm9jZXNzLmVudlsnUlVOTkVSX0RFQlVHJ10gPT09ICcxJztcbn1cbmV4cG9ydHMuaXNEZWJ1ZyA9IGlzRGVidWc7XG4vKipcbiAqIFdyaXRlcyBkZWJ1ZyBtZXNzYWdlIHRvIHVzZXIgbG9nXG4gKiBAcGFyYW0gbWVzc2FnZSBkZWJ1ZyBtZXNzYWdlXG4gKi9cbmZ1bmN0aW9uIGRlYnVnKG1lc3NhZ2UpIHtcbiAgICAoMCwgY29tbWFuZF8xLmlzc3VlQ29tbWFuZCkoJ2RlYnVnJywge30sIG1lc3NhZ2UpO1xufVxuZXhwb3J0cy5kZWJ1ZyA9IGRlYnVnO1xuLyoqXG4gKiBBZGRzIGFuIGVycm9yIGlzc3VlXG4gKiBAcGFyYW0gbWVzc2FnZSBlcnJvciBpc3N1ZSBtZXNzYWdlLiBFcnJvcnMgd2lsbCBiZSBjb252ZXJ0ZWQgdG8gc3RyaW5nIHZpYSB0b1N0cmluZygpXG4gKiBAcGFyYW0gcHJvcGVydGllcyBvcHRpb25hbCBwcm9wZXJ0aWVzIHRvIGFkZCB0byB0aGUgYW5ub3RhdGlvbi5cbiAqL1xuZnVuY3Rpb24gZXJyb3IobWVzc2FnZSwgcHJvcGVydGllcyA9IHt9KSB7XG4gICAgKDAsIGNvbW1hbmRfMS5pc3N1ZUNvbW1hbmQpKCdlcnJvcicsICgwLCB1dGlsc18xLnRvQ29tbWFuZFByb3BlcnRpZXMpKHByb3BlcnRpZXMpLCBtZXNzYWdlIGluc3RhbmNlb2YgRXJyb3IgPyBtZXNzYWdlLnRvU3RyaW5nKCkgOiBtZXNzYWdlKTtcbn1cbmV4cG9ydHMuZXJyb3IgPSBlcnJvcjtcbi8qKlxuICogQWRkcyBhIHdhcm5pbmcgaXNzdWVcbiAqIEBwYXJhbSBtZXNzYWdlIHdhcm5pbmcgaXNzdWUgbWVzc2FnZS4gRXJyb3JzIHdpbGwgYmUgY29udmVydGVkIHRvIHN0cmluZyB2aWEgdG9TdHJpbmcoKVxuICogQHBhcmFtIHByb3BlcnRpZXMgb3B0aW9uYWwgcHJvcGVydGllcyB0byBhZGQgdG8gdGhlIGFubm90YXRpb24uXG4gKi9cbmZ1bmN0aW9uIHdhcm5pbmcobWVzc2FnZSwgcHJvcGVydGllcyA9IHt9KSB7XG4gICAgKDAsIGNvbW1hbmRfMS5pc3N1ZUNvbW1hbmQpKCd3YXJuaW5nJywgKDAsIHV0aWxzXzEudG9Db21tYW5kUHJvcGVydGllcykocHJvcGVydGllcyksIG1lc3NhZ2UgaW5zdGFuY2VvZiBFcnJvciA/IG1lc3NhZ2UudG9TdHJpbmcoKSA6IG1lc3NhZ2UpO1xufVxuZXhwb3J0cy53YXJuaW5nID0gd2FybmluZztcbi8qKlxuICogQWRkcyBhIG5vdGljZSBpc3N1ZVxuICogQHBhcmFtIG1lc3NhZ2Ugbm90aWNlIGlzc3VlIG1lc3NhZ2UuIEVycm9ycyB3aWxsIGJlIGNvbnZlcnRlZCB0byBzdHJpbmcgdmlhIHRvU3RyaW5nKClcbiAqIEBwYXJhbSBwcm9wZXJ0aWVzIG9wdGlvbmFsIHByb3BlcnRpZXMgdG8gYWRkIHRvIHRoZSBhbm5vdGF0aW9uLlxuICovXG5mdW5jdGlvbiBub3RpY2UobWVzc2FnZSwgcHJvcGVydGllcyA9IHt9KSB7XG4gICAgKDAsIGNvbW1hbmRfMS5pc3N1ZUNvbW1hbmQpKCdub3RpY2UnLCAoMCwgdXRpbHNfMS50b0NvbW1hbmRQcm9wZXJ0aWVzKShwcm9wZXJ0aWVzKSwgbWVzc2FnZSBpbnN0YW5jZW9mIEVycm9yID8gbWVzc2FnZS50b1N0cmluZygpIDogbWVzc2FnZSk7XG59XG5leHBvcnRzLm5vdGljZSA9IG5vdGljZTtcbi8qKlxuICogV3JpdGVzIGluZm8gdG8gbG9nIHdpdGggY29uc29sZS5sb2cuXG4gKiBAcGFyYW0gbWVzc2FnZSBpbmZvIG1lc3NhZ2VcbiAqL1xuZnVuY3Rpb24gaW5mbyhtZXNzYWdlKSB7XG4gICAgcHJvY2Vzcy5zdGRvdXQud3JpdGUobWVzc2FnZSArIG9zLkVPTCk7XG59XG5leHBvcnRzLmluZm8gPSBpbmZvO1xuLyoqXG4gKiBCZWdpbiBhbiBvdXRwdXQgZ3JvdXAuXG4gKlxuICogT3V0cHV0IHVudGlsIHRoZSBuZXh0IGBncm91cEVuZGAgd2lsbCBiZSBmb2xkYWJsZSBpbiB0aGlzIGdyb3VwXG4gKlxuICogQHBhcmFtIG5hbWUgVGhlIG5hbWUgb2YgdGhlIG91dHB1dCBncm91cFxuICovXG5mdW5jdGlvbiBzdGFydEdyb3VwKG5hbWUpIHtcbiAgICAoMCwgY29tbWFuZF8xLmlzc3VlKSgnZ3JvdXAnLCBuYW1lKTtcbn1cbmV4cG9ydHMuc3RhcnRHcm91cCA9IHN0YXJ0R3JvdXA7XG4vKipcbiAqIEVuZCBhbiBvdXRwdXQgZ3JvdXAuXG4gKi9cbmZ1bmN0aW9uIGVuZEdyb3VwKCkge1xuICAgICgwLCBjb21tYW5kXzEuaXNzdWUpKCdlbmRncm91cCcpO1xufVxuZXhwb3J0cy5lbmRHcm91cCA9IGVuZEdyb3VwO1xuLyoqXG4gKiBXcmFwIGFuIGFzeW5jaHJvbm91cyBmdW5jdGlvbiBjYWxsIGluIGEgZ3JvdXAuXG4gKlxuICogUmV0dXJucyB0aGUgc2FtZSB0eXBlIGFzIHRoZSBmdW5jdGlvbiBpdHNlbGYuXG4gKlxuICogQHBhcmFtIG5hbWUgVGhlIG5hbWUgb2YgdGhlIGdyb3VwXG4gKiBAcGFyYW0gZm4gVGhlIGZ1bmN0aW9uIHRvIHdyYXAgaW4gdGhlIGdyb3VwXG4gKi9cbmZ1bmN0aW9uIGdyb3VwKG5hbWUsIGZuKSB7XG4gICAgcmV0dXJuIF9fYXdhaXRlcih0aGlzLCB2b2lkIDAsIHZvaWQgMCwgZnVuY3Rpb24qICgpIHtcbiAgICAgICAgc3RhcnRHcm91cChuYW1lKTtcbiAgICAgICAgbGV0IHJlc3VsdDtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIHJlc3VsdCA9IHlpZWxkIGZuKCk7XG4gICAgICAgIH1cbiAgICAgICAgZmluYWxseSB7XG4gICAgICAgICAgICBlbmRHcm91cCgpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgfSk7XG59XG5leHBvcnRzLmdyb3VwID0gZ3JvdXA7XG4vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4vLyBXcmFwcGVyIGFjdGlvbiBzdGF0ZVxuLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuLyoqXG4gKiBTYXZlcyBzdGF0ZSBmb3IgY3VycmVudCBhY3Rpb24sIHRoZSBzdGF0ZSBjYW4gb25seSBiZSByZXRyaWV2ZWQgYnkgdGhpcyBhY3Rpb24ncyBwb3N0IGpvYiBleGVjdXRpb24uXG4gKlxuICogQHBhcmFtICAgICBuYW1lICAgICBuYW1lIG9mIHRoZSBzdGF0ZSB0byBzdG9yZVxuICogQHBhcmFtICAgICB2YWx1ZSAgICB2YWx1ZSB0byBzdG9yZS4gTm9uLXN0cmluZyB2YWx1ZXMgd2lsbCBiZSBjb252ZXJ0ZWQgdG8gYSBzdHJpbmcgdmlhIEpTT04uc3RyaW5naWZ5XG4gKi9cbi8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tZXhwbGljaXQtYW55XG5mdW5jdGlvbiBzYXZlU3RhdGUobmFtZSwgdmFsdWUpIHtcbiAgICBjb25zdCBmaWxlUGF0aCA9IHByb2Nlc3MuZW52WydHSVRIVUJfU1RBVEUnXSB8fCAnJztcbiAgICBpZiAoZmlsZVBhdGgpIHtcbiAgICAgICAgcmV0dXJuICgwLCBmaWxlX2NvbW1hbmRfMS5pc3N1ZUZpbGVDb21tYW5kKSgnU1RBVEUnLCAoMCwgZmlsZV9jb21tYW5kXzEucHJlcGFyZUtleVZhbHVlTWVzc2FnZSkobmFtZSwgdmFsdWUpKTtcbiAgICB9XG4gICAgKDAsIGNvbW1hbmRfMS5pc3N1ZUNvbW1hbmQpKCdzYXZlLXN0YXRlJywgeyBuYW1lIH0sICgwLCB1dGlsc18xLnRvQ29tbWFuZFZhbHVlKSh2YWx1ZSkpO1xufVxuZXhwb3J0cy5zYXZlU3RhdGUgPSBzYXZlU3RhdGU7XG4vKipcbiAqIEdldHMgdGhlIHZhbHVlIG9mIGFuIHN0YXRlIHNldCBieSB0aGlzIGFjdGlvbidzIG1haW4gZXhlY3V0aW9uLlxuICpcbiAqIEBwYXJhbSAgICAgbmFtZSAgICAgbmFtZSBvZiB0aGUgc3RhdGUgdG8gZ2V0XG4gKiBAcmV0dXJucyAgIHN0cmluZ1xuICovXG5mdW5jdGlvbiBnZXRTdGF0ZShuYW1lKSB7XG4gICAgcmV0dXJuIHByb2Nlc3MuZW52W2BTVEFURV8ke25hbWV9YF0gfHwgJyc7XG59XG5leHBvcnRzLmdldFN0YXRlID0gZ2V0U3RhdGU7XG5mdW5jdGlvbiBnZXRJRFRva2VuKGF1ZCkge1xuICAgIHJldHVybiBfX2F3YWl0ZXIodGhpcywgdm9pZCAwLCB2b2lkIDAsIGZ1bmN0aW9uKiAoKSB7XG4gICAgICAgIHJldHVybiB5aWVsZCBvaWRjX3V0aWxzXzEuT2lkY0NsaWVudC5nZXRJRFRva2VuKGF1ZCk7XG4gICAgfSk7XG59XG5leHBvcnRzLmdldElEVG9rZW4gPSBnZXRJRFRva2VuO1xuLyoqXG4gKiBTdW1tYXJ5IGV4cG9ydHNcbiAqL1xudmFyIHN1bW1hcnlfMSA9IHJlcXVpcmUoXCIuL3N1bW1hcnlcIik7XG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJzdW1tYXJ5XCIsIHsgZW51bWVyYWJsZTogdHJ1ZSwgZ2V0OiBmdW5jdGlvbiAoKSB7IHJldHVybiBzdW1tYXJ5XzEuc3VtbWFyeTsgfSB9KTtcbi8qKlxuICogQGRlcHJlY2F0ZWQgdXNlIGNvcmUuc3VtbWFyeVxuICovXG52YXIgc3VtbWFyeV8yID0gcmVxdWlyZShcIi4vc3VtbWFyeVwiKTtcbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIm1hcmtkb3duU3VtbWFyeVwiLCB7IGVudW1lcmFibGU6IHRydWUsIGdldDogZnVuY3Rpb24gKCkgeyByZXR1cm4gc3VtbWFyeV8yLm1hcmtkb3duU3VtbWFyeTsgfSB9KTtcbi8qKlxuICogUGF0aCBleHBvcnRzXG4gKi9cbnZhciBwYXRoX3V0aWxzXzEgPSByZXF1aXJlKFwiLi9wYXRoLXV0aWxzXCIpO1xuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwidG9Qb3NpeFBhdGhcIiwgeyBlbnVtZXJhYmxlOiB0cnVlLCBnZXQ6IGZ1bmN0aW9uICgpIHsgcmV0dXJuIHBhdGhfdXRpbHNfMS50b1Bvc2l4UGF0aDsgfSB9KTtcbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcInRvV2luMzJQYXRoXCIsIHsgZW51bWVyYWJsZTogdHJ1ZSwgZ2V0OiBmdW5jdGlvbiAoKSB7IHJldHVybiBwYXRoX3V0aWxzXzEudG9XaW4zMlBhdGg7IH0gfSk7XG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJ0b1BsYXRmb3JtUGF0aFwiLCB7IGVudW1lcmFibGU6IHRydWUsIGdldDogZnVuY3Rpb24gKCkgeyByZXR1cm4gcGF0aF91dGlsc18xLnRvUGxhdGZvcm1QYXRoOyB9IH0pO1xuLyoqXG4gKiBQbGF0Zm9ybSB1dGlsaXRpZXMgZXhwb3J0c1xuICovXG5leHBvcnRzLnBsYXRmb3JtID0gX19pbXBvcnRTdGFyKHJlcXVpcmUoXCIuL3BsYXRmb3JtXCIpKTtcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPWNvcmUuanMubWFwIiwKICAgICJcInVzZSBzdHJpY3RcIjtcbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIl9fZXNNb2R1bGVcIiwgeyB2YWx1ZTogdHJ1ZSB9KTtcbmV4cG9ydHMuQ29udGV4dCA9IHZvaWQgMDtcbmNvbnN0IGZzXzEgPSByZXF1aXJlKFwiZnNcIik7XG5jb25zdCBvc18xID0gcmVxdWlyZShcIm9zXCIpO1xuY2xhc3MgQ29udGV4dCB7XG4gICAgLyoqXG4gICAgICogSHlkcmF0ZSB0aGUgY29udGV4dCBmcm9tIHRoZSBlbnZpcm9ubWVudFxuICAgICAqL1xuICAgIGNvbnN0cnVjdG9yKCkge1xuICAgICAgICB2YXIgX2EsIF9iLCBfYztcbiAgICAgICAgdGhpcy5wYXlsb2FkID0ge307XG4gICAgICAgIGlmIChwcm9jZXNzLmVudi5HSVRIVUJfRVZFTlRfUEFUSCkge1xuICAgICAgICAgICAgaWYgKCgwLCBmc18xLmV4aXN0c1N5bmMpKHByb2Nlc3MuZW52LkdJVEhVQl9FVkVOVF9QQVRIKSkge1xuICAgICAgICAgICAgICAgIHRoaXMucGF5bG9hZCA9IEpTT04ucGFyc2UoKDAsIGZzXzEucmVhZEZpbGVTeW5jKShwcm9jZXNzLmVudi5HSVRIVUJfRVZFTlRfUEFUSCwgeyBlbmNvZGluZzogJ3V0ZjgnIH0pKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgIGNvbnN0IHBhdGggPSBwcm9jZXNzLmVudi5HSVRIVUJfRVZFTlRfUEFUSDtcbiAgICAgICAgICAgICAgICBwcm9jZXNzLnN0ZG91dC53cml0ZShgR0lUSFVCX0VWRU5UX1BBVEggJHtwYXRofSBkb2VzIG5vdCBleGlzdCR7b3NfMS5FT0x9YCk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5ldmVudE5hbWUgPSBwcm9jZXNzLmVudi5HSVRIVUJfRVZFTlRfTkFNRTtcbiAgICAgICAgdGhpcy5zaGEgPSBwcm9jZXNzLmVudi5HSVRIVUJfU0hBO1xuICAgICAgICB0aGlzLnJlZiA9IHByb2Nlc3MuZW52LkdJVEhVQl9SRUY7XG4gICAgICAgIHRoaXMud29ya2Zsb3cgPSBwcm9jZXNzLmVudi5HSVRIVUJfV09SS0ZMT1c7XG4gICAgICAgIHRoaXMuYWN0aW9uID0gcHJvY2Vzcy5lbnYuR0lUSFVCX0FDVElPTjtcbiAgICAgICAgdGhpcy5hY3RvciA9IHByb2Nlc3MuZW52LkdJVEhVQl9BQ1RPUjtcbiAgICAgICAgdGhpcy5qb2IgPSBwcm9jZXNzLmVudi5HSVRIVUJfSk9CO1xuICAgICAgICB0aGlzLnJ1bk51bWJlciA9IHBhcnNlSW50KHByb2Nlc3MuZW52LkdJVEhVQl9SVU5fTlVNQkVSLCAxMCk7XG4gICAgICAgIHRoaXMucnVuSWQgPSBwYXJzZUludChwcm9jZXNzLmVudi5HSVRIVUJfUlVOX0lELCAxMCk7XG4gICAgICAgIHRoaXMuYXBpVXJsID0gKF9hID0gcHJvY2Vzcy5lbnYuR0lUSFVCX0FQSV9VUkwpICE9PSBudWxsICYmIF9hICE9PSB2b2lkIDAgPyBfYSA6IGBodHRwczovL2FwaS5naXRodWIuY29tYDtcbiAgICAgICAgdGhpcy5zZXJ2ZXJVcmwgPSAoX2IgPSBwcm9jZXNzLmVudi5HSVRIVUJfU0VSVkVSX1VSTCkgIT09IG51bGwgJiYgX2IgIT09IHZvaWQgMCA/IF9iIDogYGh0dHBzOi8vZ2l0aHViLmNvbWA7XG4gICAgICAgIHRoaXMuZ3JhcGhxbFVybCA9XG4gICAgICAgICAgICAoX2MgPSBwcm9jZXNzLmVudi5HSVRIVUJfR1JBUEhRTF9VUkwpICE9PSBudWxsICYmIF9jICE9PSB2b2lkIDAgPyBfYyA6IGBodHRwczovL2FwaS5naXRodWIuY29tL2dyYXBocWxgO1xuICAgIH1cbiAgICBnZXQgaXNzdWUoKSB7XG4gICAgICAgIGNvbnN0IHBheWxvYWQgPSB0aGlzLnBheWxvYWQ7XG4gICAgICAgIHJldHVybiBPYmplY3QuYXNzaWduKE9iamVjdC5hc3NpZ24oe30sIHRoaXMucmVwbyksIHsgbnVtYmVyOiAocGF5bG9hZC5pc3N1ZSB8fCBwYXlsb2FkLnB1bGxfcmVxdWVzdCB8fCBwYXlsb2FkKS5udW1iZXIgfSk7XG4gICAgfVxuICAgIGdldCByZXBvKCkge1xuICAgICAgICBpZiAocHJvY2Vzcy5lbnYuR0lUSFVCX1JFUE9TSVRPUlkpIHtcbiAgICAgICAgICAgIGNvbnN0IFtvd25lciwgcmVwb10gPSBwcm9jZXNzLmVudi5HSVRIVUJfUkVQT1NJVE9SWS5zcGxpdCgnLycpO1xuICAgICAgICAgICAgcmV0dXJuIHsgb3duZXIsIHJlcG8gfTtcbiAgICAgICAgfVxuICAgICAgICBpZiAodGhpcy5wYXlsb2FkLnJlcG9zaXRvcnkpIHtcbiAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgb3duZXI6IHRoaXMucGF5bG9hZC5yZXBvc2l0b3J5Lm93bmVyLmxvZ2luLFxuICAgICAgICAgICAgICAgIHJlcG86IHRoaXMucGF5bG9hZC5yZXBvc2l0b3J5Lm5hbWVcbiAgICAgICAgICAgIH07XG4gICAgICAgIH1cbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwiY29udGV4dC5yZXBvIHJlcXVpcmVzIGEgR0lUSFVCX1JFUE9TSVRPUlkgZW52aXJvbm1lbnQgdmFyaWFibGUgbGlrZSAnb3duZXIvcmVwbydcIik7XG4gICAgfVxufVxuZXhwb3J0cy5Db250ZXh0ID0gQ29udGV4dDtcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPWNvbnRleHQuanMubWFwIiwKICAgICJcInVzZSBzdHJpY3RcIjtcbnZhciBfX2NyZWF0ZUJpbmRpbmcgPSAodGhpcyAmJiB0aGlzLl9fY3JlYXRlQmluZGluZykgfHwgKE9iamVjdC5jcmVhdGUgPyAoZnVuY3Rpb24obywgbSwgaywgazIpIHtcbiAgICBpZiAoazIgPT09IHVuZGVmaW5lZCkgazIgPSBrO1xuICAgIHZhciBkZXNjID0gT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcihtLCBrKTtcbiAgICBpZiAoIWRlc2MgfHwgKFwiZ2V0XCIgaW4gZGVzYyA/ICFtLl9fZXNNb2R1bGUgOiBkZXNjLndyaXRhYmxlIHx8IGRlc2MuY29uZmlndXJhYmxlKSkge1xuICAgICAgZGVzYyA9IHsgZW51bWVyYWJsZTogdHJ1ZSwgZ2V0OiBmdW5jdGlvbigpIHsgcmV0dXJuIG1ba107IH0gfTtcbiAgICB9XG4gICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KG8sIGsyLCBkZXNjKTtcbn0pIDogKGZ1bmN0aW9uKG8sIG0sIGssIGsyKSB7XG4gICAgaWYgKGsyID09PSB1bmRlZmluZWQpIGsyID0gaztcbiAgICBvW2syXSA9IG1ba107XG59KSk7XG52YXIgX19zZXRNb2R1bGVEZWZhdWx0ID0gKHRoaXMgJiYgdGhpcy5fX3NldE1vZHVsZURlZmF1bHQpIHx8IChPYmplY3QuY3JlYXRlID8gKGZ1bmN0aW9uKG8sIHYpIHtcbiAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkobywgXCJkZWZhdWx0XCIsIHsgZW51bWVyYWJsZTogdHJ1ZSwgdmFsdWU6IHYgfSk7XG59KSA6IGZ1bmN0aW9uKG8sIHYpIHtcbiAgICBvW1wiZGVmYXVsdFwiXSA9IHY7XG59KTtcbnZhciBfX2ltcG9ydFN0YXIgPSAodGhpcyAmJiB0aGlzLl9faW1wb3J0U3RhcikgfHwgZnVuY3Rpb24gKG1vZCkge1xuICAgIGlmIChtb2QgJiYgbW9kLl9fZXNNb2R1bGUpIHJldHVybiBtb2Q7XG4gICAgdmFyIHJlc3VsdCA9IHt9O1xuICAgIGlmIChtb2QgIT0gbnVsbCkgZm9yICh2YXIgayBpbiBtb2QpIGlmIChrICE9PSBcImRlZmF1bHRcIiAmJiBPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwobW9kLCBrKSkgX19jcmVhdGVCaW5kaW5nKHJlc3VsdCwgbW9kLCBrKTtcbiAgICBfX3NldE1vZHVsZURlZmF1bHQocmVzdWx0LCBtb2QpO1xuICAgIHJldHVybiByZXN1bHQ7XG59O1xudmFyIF9fYXdhaXRlciA9ICh0aGlzICYmIHRoaXMuX19hd2FpdGVyKSB8fCBmdW5jdGlvbiAodGhpc0FyZywgX2FyZ3VtZW50cywgUCwgZ2VuZXJhdG9yKSB7XG4gICAgZnVuY3Rpb24gYWRvcHQodmFsdWUpIHsgcmV0dXJuIHZhbHVlIGluc3RhbmNlb2YgUCA/IHZhbHVlIDogbmV3IFAoZnVuY3Rpb24gKHJlc29sdmUpIHsgcmVzb2x2ZSh2YWx1ZSk7IH0pOyB9XG4gICAgcmV0dXJuIG5ldyAoUCB8fCAoUCA9IFByb21pc2UpKShmdW5jdGlvbiAocmVzb2x2ZSwgcmVqZWN0KSB7XG4gICAgICAgIGZ1bmN0aW9uIGZ1bGZpbGxlZCh2YWx1ZSkgeyB0cnkgeyBzdGVwKGdlbmVyYXRvci5uZXh0KHZhbHVlKSk7IH0gY2F0Y2ggKGUpIHsgcmVqZWN0KGUpOyB9IH1cbiAgICAgICAgZnVuY3Rpb24gcmVqZWN0ZWQodmFsdWUpIHsgdHJ5IHsgc3RlcChnZW5lcmF0b3JbXCJ0aHJvd1wiXSh2YWx1ZSkpOyB9IGNhdGNoIChlKSB7IHJlamVjdChlKTsgfSB9XG4gICAgICAgIGZ1bmN0aW9uIHN0ZXAocmVzdWx0KSB7IHJlc3VsdC5kb25lID8gcmVzb2x2ZShyZXN1bHQudmFsdWUpIDogYWRvcHQocmVzdWx0LnZhbHVlKS50aGVuKGZ1bGZpbGxlZCwgcmVqZWN0ZWQpOyB9XG4gICAgICAgIHN0ZXAoKGdlbmVyYXRvciA9IGdlbmVyYXRvci5hcHBseSh0aGlzQXJnLCBfYXJndW1lbnRzIHx8IFtdKSkubmV4dCgpKTtcbiAgICB9KTtcbn07XG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJfX2VzTW9kdWxlXCIsIHsgdmFsdWU6IHRydWUgfSk7XG5leHBvcnRzLmdldEFwaUJhc2VVcmwgPSBleHBvcnRzLmdldFByb3h5RmV0Y2ggPSBleHBvcnRzLmdldFByb3h5QWdlbnREaXNwYXRjaGVyID0gZXhwb3J0cy5nZXRQcm94eUFnZW50ID0gZXhwb3J0cy5nZXRBdXRoU3RyaW5nID0gdm9pZCAwO1xuY29uc3QgaHR0cENsaWVudCA9IF9faW1wb3J0U3RhcihyZXF1aXJlKFwiQGFjdGlvbnMvaHR0cC1jbGllbnRcIikpO1xuY29uc3QgdW5kaWNpXzEgPSByZXF1aXJlKFwidW5kaWNpXCIpO1xuZnVuY3Rpb24gZ2V0QXV0aFN0cmluZyh0b2tlbiwgb3B0aW9ucykge1xuICAgIGlmICghdG9rZW4gJiYgIW9wdGlvbnMuYXV0aCkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ1BhcmFtZXRlciB0b2tlbiBvciBvcHRzLmF1dGggaXMgcmVxdWlyZWQnKTtcbiAgICB9XG4gICAgZWxzZSBpZiAodG9rZW4gJiYgb3B0aW9ucy5hdXRoKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcignUGFyYW1ldGVycyB0b2tlbiBhbmQgb3B0cy5hdXRoIG1heSBub3QgYm90aCBiZSBzcGVjaWZpZWQnKTtcbiAgICB9XG4gICAgcmV0dXJuIHR5cGVvZiBvcHRpb25zLmF1dGggPT09ICdzdHJpbmcnID8gb3B0aW9ucy5hdXRoIDogYHRva2VuICR7dG9rZW59YDtcbn1cbmV4cG9ydHMuZ2V0QXV0aFN0cmluZyA9IGdldEF1dGhTdHJpbmc7XG5mdW5jdGlvbiBnZXRQcm94eUFnZW50KGRlc3RpbmF0aW9uVXJsKSB7XG4gICAgY29uc3QgaGMgPSBuZXcgaHR0cENsaWVudC5IdHRwQ2xpZW50KCk7XG4gICAgcmV0dXJuIGhjLmdldEFnZW50KGRlc3RpbmF0aW9uVXJsKTtcbn1cbmV4cG9ydHMuZ2V0UHJveHlBZ2VudCA9IGdldFByb3h5QWdlbnQ7XG5mdW5jdGlvbiBnZXRQcm94eUFnZW50RGlzcGF0Y2hlcihkZXN0aW5hdGlvblVybCkge1xuICAgIGNvbnN0IGhjID0gbmV3IGh0dHBDbGllbnQuSHR0cENsaWVudCgpO1xuICAgIHJldHVybiBoYy5nZXRBZ2VudERpc3BhdGNoZXIoZGVzdGluYXRpb25VcmwpO1xufVxuZXhwb3J0cy5nZXRQcm94eUFnZW50RGlzcGF0Y2hlciA9IGdldFByb3h5QWdlbnREaXNwYXRjaGVyO1xuZnVuY3Rpb24gZ2V0UHJveHlGZXRjaChkZXN0aW5hdGlvblVybCkge1xuICAgIGNvbnN0IGh0dHBEaXNwYXRjaGVyID0gZ2V0UHJveHlBZ2VudERpc3BhdGNoZXIoZGVzdGluYXRpb25VcmwpO1xuICAgIGNvbnN0IHByb3h5RmV0Y2ggPSAodXJsLCBvcHRzKSA9PiBfX2F3YWl0ZXIodGhpcywgdm9pZCAwLCB2b2lkIDAsIGZ1bmN0aW9uKiAoKSB7XG4gICAgICAgIHJldHVybiAoMCwgdW5kaWNpXzEuZmV0Y2gpKHVybCwgT2JqZWN0LmFzc2lnbihPYmplY3QuYXNzaWduKHt9LCBvcHRzKSwgeyBkaXNwYXRjaGVyOiBodHRwRGlzcGF0Y2hlciB9KSk7XG4gICAgfSk7XG4gICAgcmV0dXJuIHByb3h5RmV0Y2g7XG59XG5leHBvcnRzLmdldFByb3h5RmV0Y2ggPSBnZXRQcm94eUZldGNoO1xuZnVuY3Rpb24gZ2V0QXBpQmFzZVVybCgpIHtcbiAgICByZXR1cm4gcHJvY2Vzcy5lbnZbJ0dJVEhVQl9BUElfVVJMJ10gfHwgJ2h0dHBzOi8vYXBpLmdpdGh1Yi5jb20nO1xufVxuZXhwb3J0cy5nZXRBcGlCYXNlVXJsID0gZ2V0QXBpQmFzZVVybDtcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPXV0aWxzLmpzLm1hcCIsCiAgICAiJ3VzZSBzdHJpY3QnO1xuXG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgJ19fZXNNb2R1bGUnLCB7IHZhbHVlOiB0cnVlIH0pO1xuXG5mdW5jdGlvbiBnZXRVc2VyQWdlbnQoKSB7XG4gIGlmICh0eXBlb2YgbmF2aWdhdG9yID09PSBcIm9iamVjdFwiICYmIFwidXNlckFnZW50XCIgaW4gbmF2aWdhdG9yKSB7XG4gICAgcmV0dXJuIG5hdmlnYXRvci51c2VyQWdlbnQ7XG4gIH1cblxuICBpZiAodHlwZW9mIHByb2Nlc3MgPT09IFwib2JqZWN0XCIgJiYgcHJvY2Vzcy52ZXJzaW9uICE9PSB1bmRlZmluZWQpIHtcbiAgICByZXR1cm4gYE5vZGUuanMvJHtwcm9jZXNzLnZlcnNpb24uc3Vic3RyKDEpfSAoJHtwcm9jZXNzLnBsYXRmb3JtfTsgJHtwcm9jZXNzLmFyY2h9KWA7XG4gIH1cblxuICByZXR1cm4gXCI8ZW52aXJvbm1lbnQgdW5kZXRlY3RhYmxlPlwiO1xufVxuXG5leHBvcnRzLmdldFVzZXJBZ2VudCA9IGdldFVzZXJBZ2VudDtcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPWluZGV4LmpzLm1hcFxuIiwKICAgICJtb2R1bGUuZXhwb3J0cyA9IHJlZ2lzdGVyO1xuXG5mdW5jdGlvbiByZWdpc3RlcihzdGF0ZSwgbmFtZSwgbWV0aG9kLCBvcHRpb25zKSB7XG4gIGlmICh0eXBlb2YgbWV0aG9kICE9PSBcImZ1bmN0aW9uXCIpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoXCJtZXRob2QgZm9yIGJlZm9yZSBob29rIG11c3QgYmUgYSBmdW5jdGlvblwiKTtcbiAgfVxuXG4gIGlmICghb3B0aW9ucykge1xuICAgIG9wdGlvbnMgPSB7fTtcbiAgfVxuXG4gIGlmIChBcnJheS5pc0FycmF5KG5hbWUpKSB7XG4gICAgcmV0dXJuIG5hbWUucmV2ZXJzZSgpLnJlZHVjZShmdW5jdGlvbiAoY2FsbGJhY2ssIG5hbWUpIHtcbiAgICAgIHJldHVybiByZWdpc3Rlci5iaW5kKG51bGwsIHN0YXRlLCBuYW1lLCBjYWxsYmFjaywgb3B0aW9ucyk7XG4gICAgfSwgbWV0aG9kKSgpO1xuICB9XG5cbiAgcmV0dXJuIFByb21pc2UucmVzb2x2ZSgpLnRoZW4oZnVuY3Rpb24gKCkge1xuICAgIGlmICghc3RhdGUucmVnaXN0cnlbbmFtZV0pIHtcbiAgICAgIHJldHVybiBtZXRob2Qob3B0aW9ucyk7XG4gICAgfVxuXG4gICAgcmV0dXJuIHN0YXRlLnJlZ2lzdHJ5W25hbWVdLnJlZHVjZShmdW5jdGlvbiAobWV0aG9kLCByZWdpc3RlcmVkKSB7XG4gICAgICByZXR1cm4gcmVnaXN0ZXJlZC5ob29rLmJpbmQobnVsbCwgbWV0aG9kLCBvcHRpb25zKTtcbiAgICB9LCBtZXRob2QpKCk7XG4gIH0pO1xufVxuIiwKICAgICJtb2R1bGUuZXhwb3J0cyA9IGFkZEhvb2s7XG5cbmZ1bmN0aW9uIGFkZEhvb2soc3RhdGUsIGtpbmQsIG5hbWUsIGhvb2spIHtcbiAgdmFyIG9yaWcgPSBob29rO1xuICBpZiAoIXN0YXRlLnJlZ2lzdHJ5W25hbWVdKSB7XG4gICAgc3RhdGUucmVnaXN0cnlbbmFtZV0gPSBbXTtcbiAgfVxuXG4gIGlmIChraW5kID09PSBcImJlZm9yZVwiKSB7XG4gICAgaG9vayA9IGZ1bmN0aW9uIChtZXRob2QsIG9wdGlvbnMpIHtcbiAgICAgIHJldHVybiBQcm9taXNlLnJlc29sdmUoKVxuICAgICAgICAudGhlbihvcmlnLmJpbmQobnVsbCwgb3B0aW9ucykpXG4gICAgICAgIC50aGVuKG1ldGhvZC5iaW5kKG51bGwsIG9wdGlvbnMpKTtcbiAgICB9O1xuICB9XG5cbiAgaWYgKGtpbmQgPT09IFwiYWZ0ZXJcIikge1xuICAgIGhvb2sgPSBmdW5jdGlvbiAobWV0aG9kLCBvcHRpb25zKSB7XG4gICAgICB2YXIgcmVzdWx0O1xuICAgICAgcmV0dXJuIFByb21pc2UucmVzb2x2ZSgpXG4gICAgICAgIC50aGVuKG1ldGhvZC5iaW5kKG51bGwsIG9wdGlvbnMpKVxuICAgICAgICAudGhlbihmdW5jdGlvbiAocmVzdWx0Xykge1xuICAgICAgICAgIHJlc3VsdCA9IHJlc3VsdF87XG4gICAgICAgICAgcmV0dXJuIG9yaWcocmVzdWx0LCBvcHRpb25zKTtcbiAgICAgICAgfSlcbiAgICAgICAgLnRoZW4oZnVuY3Rpb24gKCkge1xuICAgICAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgICAgIH0pO1xuICAgIH07XG4gIH1cblxuICBpZiAoa2luZCA9PT0gXCJlcnJvclwiKSB7XG4gICAgaG9vayA9IGZ1bmN0aW9uIChtZXRob2QsIG9wdGlvbnMpIHtcbiAgICAgIHJldHVybiBQcm9taXNlLnJlc29sdmUoKVxuICAgICAgICAudGhlbihtZXRob2QuYmluZChudWxsLCBvcHRpb25zKSlcbiAgICAgICAgLmNhdGNoKGZ1bmN0aW9uIChlcnJvcikge1xuICAgICAgICAgIHJldHVybiBvcmlnKGVycm9yLCBvcHRpb25zKTtcbiAgICAgICAgfSk7XG4gICAgfTtcbiAgfVxuXG4gIHN0YXRlLnJlZ2lzdHJ5W25hbWVdLnB1c2goe1xuICAgIGhvb2s6IGhvb2ssXG4gICAgb3JpZzogb3JpZyxcbiAgfSk7XG59XG4iLAogICAgIm1vZHVsZS5leHBvcnRzID0gcmVtb3ZlSG9vaztcblxuZnVuY3Rpb24gcmVtb3ZlSG9vayhzdGF0ZSwgbmFtZSwgbWV0aG9kKSB7XG4gIGlmICghc3RhdGUucmVnaXN0cnlbbmFtZV0pIHtcbiAgICByZXR1cm47XG4gIH1cblxuICB2YXIgaW5kZXggPSBzdGF0ZS5yZWdpc3RyeVtuYW1lXVxuICAgIC5tYXAoZnVuY3Rpb24gKHJlZ2lzdGVyZWQpIHtcbiAgICAgIHJldHVybiByZWdpc3RlcmVkLm9yaWc7XG4gICAgfSlcbiAgICAuaW5kZXhPZihtZXRob2QpO1xuXG4gIGlmIChpbmRleCA9PT0gLTEpIHtcbiAgICByZXR1cm47XG4gIH1cblxuICBzdGF0ZS5yZWdpc3RyeVtuYW1lXS5zcGxpY2UoaW5kZXgsIDEpO1xufVxuIiwKICAgICJ2YXIgcmVnaXN0ZXIgPSByZXF1aXJlKFwiLi9saWIvcmVnaXN0ZXJcIik7XG52YXIgYWRkSG9vayA9IHJlcXVpcmUoXCIuL2xpYi9hZGRcIik7XG52YXIgcmVtb3ZlSG9vayA9IHJlcXVpcmUoXCIuL2xpYi9yZW1vdmVcIik7XG5cbi8vIGJpbmQgd2l0aCBhcnJheSBvZiBhcmd1bWVudHM6IGh0dHBzOi8vc3RhY2tvdmVyZmxvdy5jb20vYS8yMTc5MjkxM1xudmFyIGJpbmQgPSBGdW5jdGlvbi5iaW5kO1xudmFyIGJpbmRhYmxlID0gYmluZC5iaW5kKGJpbmQpO1xuXG5mdW5jdGlvbiBiaW5kQXBpKGhvb2ssIHN0YXRlLCBuYW1lKSB7XG4gIHZhciByZW1vdmVIb29rUmVmID0gYmluZGFibGUocmVtb3ZlSG9vaywgbnVsbCkuYXBwbHkoXG4gICAgbnVsbCxcbiAgICBuYW1lID8gW3N0YXRlLCBuYW1lXSA6IFtzdGF0ZV1cbiAgKTtcbiAgaG9vay5hcGkgPSB7IHJlbW92ZTogcmVtb3ZlSG9va1JlZiB9O1xuICBob29rLnJlbW92ZSA9IHJlbW92ZUhvb2tSZWY7XG4gIFtcImJlZm9yZVwiLCBcImVycm9yXCIsIFwiYWZ0ZXJcIiwgXCJ3cmFwXCJdLmZvckVhY2goZnVuY3Rpb24gKGtpbmQpIHtcbiAgICB2YXIgYXJncyA9IG5hbWUgPyBbc3RhdGUsIGtpbmQsIG5hbWVdIDogW3N0YXRlLCBraW5kXTtcbiAgICBob29rW2tpbmRdID0gaG9vay5hcGlba2luZF0gPSBiaW5kYWJsZShhZGRIb29rLCBudWxsKS5hcHBseShudWxsLCBhcmdzKTtcbiAgfSk7XG59XG5cbmZ1bmN0aW9uIEhvb2tTaW5ndWxhcigpIHtcbiAgdmFyIHNpbmd1bGFySG9va05hbWUgPSBcImhcIjtcbiAgdmFyIHNpbmd1bGFySG9va1N0YXRlID0ge1xuICAgIHJlZ2lzdHJ5OiB7fSxcbiAgfTtcbiAgdmFyIHNpbmd1bGFySG9vayA9IHJlZ2lzdGVyLmJpbmQobnVsbCwgc2luZ3VsYXJIb29rU3RhdGUsIHNpbmd1bGFySG9va05hbWUpO1xuICBiaW5kQXBpKHNpbmd1bGFySG9vaywgc2luZ3VsYXJIb29rU3RhdGUsIHNpbmd1bGFySG9va05hbWUpO1xuICByZXR1cm4gc2luZ3VsYXJIb29rO1xufVxuXG5mdW5jdGlvbiBIb29rQ29sbGVjdGlvbigpIHtcbiAgdmFyIHN0YXRlID0ge1xuICAgIHJlZ2lzdHJ5OiB7fSxcbiAgfTtcblxuICB2YXIgaG9vayA9IHJlZ2lzdGVyLmJpbmQobnVsbCwgc3RhdGUpO1xuICBiaW5kQXBpKGhvb2ssIHN0YXRlKTtcblxuICByZXR1cm4gaG9vaztcbn1cblxudmFyIGNvbGxlY3Rpb25Ib29rRGVwcmVjYXRpb25NZXNzYWdlRGlzcGxheWVkID0gZmFsc2U7XG5mdW5jdGlvbiBIb29rKCkge1xuICBpZiAoIWNvbGxlY3Rpb25Ib29rRGVwcmVjYXRpb25NZXNzYWdlRGlzcGxheWVkKSB7XG4gICAgY29uc29sZS53YXJuKFxuICAgICAgJ1tiZWZvcmUtYWZ0ZXItaG9va106IFwiSG9vaygpXCIgcmVwdXJwb3Npbmcgd2FybmluZywgdXNlIFwiSG9vay5Db2xsZWN0aW9uKClcIi4gUmVhZCBtb3JlOiBodHRwczovL2dpdC5pby91cGdyYWRlLWJlZm9yZS1hZnRlci1ob29rLXRvLTEuNCdcbiAgICApO1xuICAgIGNvbGxlY3Rpb25Ib29rRGVwcmVjYXRpb25NZXNzYWdlRGlzcGxheWVkID0gdHJ1ZTtcbiAgfVxuICByZXR1cm4gSG9va0NvbGxlY3Rpb24oKTtcbn1cblxuSG9vay5TaW5ndWxhciA9IEhvb2tTaW5ndWxhci5iaW5kKCk7XG5Ib29rLkNvbGxlY3Rpb24gPSBIb29rQ29sbGVjdGlvbi5iaW5kKCk7XG5cbm1vZHVsZS5leHBvcnRzID0gSG9vaztcbi8vIGV4cG9zZSBjb25zdHJ1Y3RvcnMgYXMgYSBuYW1lZCBwcm9wZXJ0eSBmb3IgVHlwZVNjcmlwdFxubW9kdWxlLmV4cG9ydHMuSG9vayA9IEhvb2s7XG5tb2R1bGUuZXhwb3J0cy5TaW5ndWxhciA9IEhvb2suU2luZ3VsYXI7XG5tb2R1bGUuZXhwb3J0cy5Db2xsZWN0aW9uID0gSG9vay5Db2xsZWN0aW9uO1xuIiwKICAgICJcInVzZSBzdHJpY3RcIjtcbnZhciBfX2RlZlByb3AgPSBPYmplY3QuZGVmaW5lUHJvcGVydHk7XG52YXIgX19nZXRPd25Qcm9wRGVzYyA9IE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3I7XG52YXIgX19nZXRPd25Qcm9wTmFtZXMgPSBPYmplY3QuZ2V0T3duUHJvcGVydHlOYW1lcztcbnZhciBfX2hhc093blByb3AgPSBPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5O1xudmFyIF9fZXhwb3J0ID0gKHRhcmdldCwgYWxsKSA9PiB7XG4gIGZvciAodmFyIG5hbWUgaW4gYWxsKVxuICAgIF9fZGVmUHJvcCh0YXJnZXQsIG5hbWUsIHsgZ2V0OiBhbGxbbmFtZV0sIGVudW1lcmFibGU6IHRydWUgfSk7XG59O1xudmFyIF9fY29weVByb3BzID0gKHRvLCBmcm9tLCBleGNlcHQsIGRlc2MpID0+IHtcbiAgaWYgKGZyb20gJiYgdHlwZW9mIGZyb20gPT09IFwib2JqZWN0XCIgfHwgdHlwZW9mIGZyb20gPT09IFwiZnVuY3Rpb25cIikge1xuICAgIGZvciAobGV0IGtleSBvZiBfX2dldE93blByb3BOYW1lcyhmcm9tKSlcbiAgICAgIGlmICghX19oYXNPd25Qcm9wLmNhbGwodG8sIGtleSkgJiYga2V5ICE9PSBleGNlcHQpXG4gICAgICAgIF9fZGVmUHJvcCh0bywga2V5LCB7IGdldDogKCkgPT4gZnJvbVtrZXldLCBlbnVtZXJhYmxlOiAhKGRlc2MgPSBfX2dldE93blByb3BEZXNjKGZyb20sIGtleSkpIHx8IGRlc2MuZW51bWVyYWJsZSB9KTtcbiAgfVxuICByZXR1cm4gdG87XG59O1xudmFyIF9fdG9Db21tb25KUyA9IChtb2QpID0+IF9fY29weVByb3BzKF9fZGVmUHJvcCh7fSwgXCJfX2VzTW9kdWxlXCIsIHsgdmFsdWU6IHRydWUgfSksIG1vZCk7XG5cbi8vIHBrZy9kaXN0LXNyYy9pbmRleC5qc1xudmFyIGRpc3Rfc3JjX2V4cG9ydHMgPSB7fTtcbl9fZXhwb3J0KGRpc3Rfc3JjX2V4cG9ydHMsIHtcbiAgZW5kcG9pbnQ6ICgpID0+IGVuZHBvaW50XG59KTtcbm1vZHVsZS5leHBvcnRzID0gX190b0NvbW1vbkpTKGRpc3Rfc3JjX2V4cG9ydHMpO1xuXG4vLyBwa2cvZGlzdC1zcmMvZGVmYXVsdHMuanNcbnZhciBpbXBvcnRfdW5pdmVyc2FsX3VzZXJfYWdlbnQgPSByZXF1aXJlKFwidW5pdmVyc2FsLXVzZXItYWdlbnRcIik7XG5cbi8vIHBrZy9kaXN0LXNyYy92ZXJzaW9uLmpzXG52YXIgVkVSU0lPTiA9IFwiOS4wLjVcIjtcblxuLy8gcGtnL2Rpc3Qtc3JjL2RlZmF1bHRzLmpzXG52YXIgdXNlckFnZW50ID0gYG9jdG9raXQtZW5kcG9pbnQuanMvJHtWRVJTSU9OfSAkeygwLCBpbXBvcnRfdW5pdmVyc2FsX3VzZXJfYWdlbnQuZ2V0VXNlckFnZW50KSgpfWA7XG52YXIgREVGQVVMVFMgPSB7XG4gIG1ldGhvZDogXCJHRVRcIixcbiAgYmFzZVVybDogXCJodHRwczovL2FwaS5naXRodWIuY29tXCIsXG4gIGhlYWRlcnM6IHtcbiAgICBhY2NlcHQ6IFwiYXBwbGljYXRpb24vdm5kLmdpdGh1Yi52Mytqc29uXCIsXG4gICAgXCJ1c2VyLWFnZW50XCI6IHVzZXJBZ2VudFxuICB9LFxuICBtZWRpYVR5cGU6IHtcbiAgICBmb3JtYXQ6IFwiXCJcbiAgfVxufTtcblxuLy8gcGtnL2Rpc3Qtc3JjL3V0aWwvbG93ZXJjYXNlLWtleXMuanNcbmZ1bmN0aW9uIGxvd2VyY2FzZUtleXMob2JqZWN0KSB7XG4gIGlmICghb2JqZWN0KSB7XG4gICAgcmV0dXJuIHt9O1xuICB9XG4gIHJldHVybiBPYmplY3Qua2V5cyhvYmplY3QpLnJlZHVjZSgobmV3T2JqLCBrZXkpID0+IHtcbiAgICBuZXdPYmpba2V5LnRvTG93ZXJDYXNlKCldID0gb2JqZWN0W2tleV07XG4gICAgcmV0dXJuIG5ld09iajtcbiAgfSwge30pO1xufVxuXG4vLyBwa2cvZGlzdC1zcmMvdXRpbC9pcy1wbGFpbi1vYmplY3QuanNcbmZ1bmN0aW9uIGlzUGxhaW5PYmplY3QodmFsdWUpIHtcbiAgaWYgKHR5cGVvZiB2YWx1ZSAhPT0gXCJvYmplY3RcIiB8fCB2YWx1ZSA9PT0gbnVsbClcbiAgICByZXR1cm4gZmFsc2U7XG4gIGlmIChPYmplY3QucHJvdG90eXBlLnRvU3RyaW5nLmNhbGwodmFsdWUpICE9PSBcIltvYmplY3QgT2JqZWN0XVwiKVxuICAgIHJldHVybiBmYWxzZTtcbiAgY29uc3QgcHJvdG8gPSBPYmplY3QuZ2V0UHJvdG90eXBlT2YodmFsdWUpO1xuICBpZiAocHJvdG8gPT09IG51bGwpXG4gICAgcmV0dXJuIHRydWU7XG4gIGNvbnN0IEN0b3IgPSBPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwocHJvdG8sIFwiY29uc3RydWN0b3JcIikgJiYgcHJvdG8uY29uc3RydWN0b3I7XG4gIHJldHVybiB0eXBlb2YgQ3RvciA9PT0gXCJmdW5jdGlvblwiICYmIEN0b3IgaW5zdGFuY2VvZiBDdG9yICYmIEZ1bmN0aW9uLnByb3RvdHlwZS5jYWxsKEN0b3IpID09PSBGdW5jdGlvbi5wcm90b3R5cGUuY2FsbCh2YWx1ZSk7XG59XG5cbi8vIHBrZy9kaXN0LXNyYy91dGlsL21lcmdlLWRlZXAuanNcbmZ1bmN0aW9uIG1lcmdlRGVlcChkZWZhdWx0cywgb3B0aW9ucykge1xuICBjb25zdCByZXN1bHQgPSBPYmplY3QuYXNzaWduKHt9LCBkZWZhdWx0cyk7XG4gIE9iamVjdC5rZXlzKG9wdGlvbnMpLmZvckVhY2goKGtleSkgPT4ge1xuICAgIGlmIChpc1BsYWluT2JqZWN0KG9wdGlvbnNba2V5XSkpIHtcbiAgICAgIGlmICghKGtleSBpbiBkZWZhdWx0cykpXG4gICAgICAgIE9iamVjdC5hc3NpZ24ocmVzdWx0LCB7IFtrZXldOiBvcHRpb25zW2tleV0gfSk7XG4gICAgICBlbHNlXG4gICAgICAgIHJlc3VsdFtrZXldID0gbWVyZ2VEZWVwKGRlZmF1bHRzW2tleV0sIG9wdGlvbnNba2V5XSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIE9iamVjdC5hc3NpZ24ocmVzdWx0LCB7IFtrZXldOiBvcHRpb25zW2tleV0gfSk7XG4gICAgfVxuICB9KTtcbiAgcmV0dXJuIHJlc3VsdDtcbn1cblxuLy8gcGtnL2Rpc3Qtc3JjL3V0aWwvcmVtb3ZlLXVuZGVmaW5lZC1wcm9wZXJ0aWVzLmpzXG5mdW5jdGlvbiByZW1vdmVVbmRlZmluZWRQcm9wZXJ0aWVzKG9iaikge1xuICBmb3IgKGNvbnN0IGtleSBpbiBvYmopIHtcbiAgICBpZiAob2JqW2tleV0gPT09IHZvaWQgMCkge1xuICAgICAgZGVsZXRlIG9ialtrZXldO1xuICAgIH1cbiAgfVxuICByZXR1cm4gb2JqO1xufVxuXG4vLyBwa2cvZGlzdC1zcmMvbWVyZ2UuanNcbmZ1bmN0aW9uIG1lcmdlKGRlZmF1bHRzLCByb3V0ZSwgb3B0aW9ucykge1xuICBpZiAodHlwZW9mIHJvdXRlID09PSBcInN0cmluZ1wiKSB7XG4gICAgbGV0IFttZXRob2QsIHVybF0gPSByb3V0ZS5zcGxpdChcIiBcIik7XG4gICAgb3B0aW9ucyA9IE9iamVjdC5hc3NpZ24odXJsID8geyBtZXRob2QsIHVybCB9IDogeyB1cmw6IG1ldGhvZCB9LCBvcHRpb25zKTtcbiAgfSBlbHNlIHtcbiAgICBvcHRpb25zID0gT2JqZWN0LmFzc2lnbih7fSwgcm91dGUpO1xuICB9XG4gIG9wdGlvbnMuaGVhZGVycyA9IGxvd2VyY2FzZUtleXMob3B0aW9ucy5oZWFkZXJzKTtcbiAgcmVtb3ZlVW5kZWZpbmVkUHJvcGVydGllcyhvcHRpb25zKTtcbiAgcmVtb3ZlVW5kZWZpbmVkUHJvcGVydGllcyhvcHRpb25zLmhlYWRlcnMpO1xuICBjb25zdCBtZXJnZWRPcHRpb25zID0gbWVyZ2VEZWVwKGRlZmF1bHRzIHx8IHt9LCBvcHRpb25zKTtcbiAgaWYgKG9wdGlvbnMudXJsID09PSBcIi9ncmFwaHFsXCIpIHtcbiAgICBpZiAoZGVmYXVsdHMgJiYgZGVmYXVsdHMubWVkaWFUeXBlLnByZXZpZXdzPy5sZW5ndGgpIHtcbiAgICAgIG1lcmdlZE9wdGlvbnMubWVkaWFUeXBlLnByZXZpZXdzID0gZGVmYXVsdHMubWVkaWFUeXBlLnByZXZpZXdzLmZpbHRlcihcbiAgICAgICAgKHByZXZpZXcpID0+ICFtZXJnZWRPcHRpb25zLm1lZGlhVHlwZS5wcmV2aWV3cy5pbmNsdWRlcyhwcmV2aWV3KVxuICAgICAgKS5jb25jYXQobWVyZ2VkT3B0aW9ucy5tZWRpYVR5cGUucHJldmlld3MpO1xuICAgIH1cbiAgICBtZXJnZWRPcHRpb25zLm1lZGlhVHlwZS5wcmV2aWV3cyA9IChtZXJnZWRPcHRpb25zLm1lZGlhVHlwZS5wcmV2aWV3cyB8fCBbXSkubWFwKChwcmV2aWV3KSA9PiBwcmV2aWV3LnJlcGxhY2UoLy1wcmV2aWV3LywgXCJcIikpO1xuICB9XG4gIHJldHVybiBtZXJnZWRPcHRpb25zO1xufVxuXG4vLyBwa2cvZGlzdC1zcmMvdXRpbC9hZGQtcXVlcnktcGFyYW1ldGVycy5qc1xuZnVuY3Rpb24gYWRkUXVlcnlQYXJhbWV0ZXJzKHVybCwgcGFyYW1ldGVycykge1xuICBjb25zdCBzZXBhcmF0b3IgPSAvXFw/Ly50ZXN0KHVybCkgPyBcIiZcIiA6IFwiP1wiO1xuICBjb25zdCBuYW1lcyA9IE9iamVjdC5rZXlzKHBhcmFtZXRlcnMpO1xuICBpZiAobmFtZXMubGVuZ3RoID09PSAwKSB7XG4gICAgcmV0dXJuIHVybDtcbiAgfVxuICByZXR1cm4gdXJsICsgc2VwYXJhdG9yICsgbmFtZXMubWFwKChuYW1lKSA9PiB7XG4gICAgaWYgKG5hbWUgPT09IFwicVwiKSB7XG4gICAgICByZXR1cm4gXCJxPVwiICsgcGFyYW1ldGVycy5xLnNwbGl0KFwiK1wiKS5tYXAoZW5jb2RlVVJJQ29tcG9uZW50KS5qb2luKFwiK1wiKTtcbiAgICB9XG4gICAgcmV0dXJuIGAke25hbWV9PSR7ZW5jb2RlVVJJQ29tcG9uZW50KHBhcmFtZXRlcnNbbmFtZV0pfWA7XG4gIH0pLmpvaW4oXCImXCIpO1xufVxuXG4vLyBwa2cvZGlzdC1zcmMvdXRpbC9leHRyYWN0LXVybC12YXJpYWJsZS1uYW1lcy5qc1xudmFyIHVybFZhcmlhYmxlUmVnZXggPSAvXFx7W159XStcXH0vZztcbmZ1bmN0aW9uIHJlbW92ZU5vbkNoYXJzKHZhcmlhYmxlTmFtZSkge1xuICByZXR1cm4gdmFyaWFibGVOYW1lLnJlcGxhY2UoL15cXFcrfFxcVyskL2csIFwiXCIpLnNwbGl0KC8sLyk7XG59XG5mdW5jdGlvbiBleHRyYWN0VXJsVmFyaWFibGVOYW1lcyh1cmwpIHtcbiAgY29uc3QgbWF0Y2hlcyA9IHVybC5tYXRjaCh1cmxWYXJpYWJsZVJlZ2V4KTtcbiAgaWYgKCFtYXRjaGVzKSB7XG4gICAgcmV0dXJuIFtdO1xuICB9XG4gIHJldHVybiBtYXRjaGVzLm1hcChyZW1vdmVOb25DaGFycykucmVkdWNlKChhLCBiKSA9PiBhLmNvbmNhdChiKSwgW10pO1xufVxuXG4vLyBwa2cvZGlzdC1zcmMvdXRpbC9vbWl0LmpzXG5mdW5jdGlvbiBvbWl0KG9iamVjdCwga2V5c1RvT21pdCkge1xuICBjb25zdCByZXN1bHQgPSB7IF9fcHJvdG9fXzogbnVsbCB9O1xuICBmb3IgKGNvbnN0IGtleSBvZiBPYmplY3Qua2V5cyhvYmplY3QpKSB7XG4gICAgaWYgKGtleXNUb09taXQuaW5kZXhPZihrZXkpID09PSAtMSkge1xuICAgICAgcmVzdWx0W2tleV0gPSBvYmplY3Rba2V5XTtcbiAgICB9XG4gIH1cbiAgcmV0dXJuIHJlc3VsdDtcbn1cblxuLy8gcGtnL2Rpc3Qtc3JjL3V0aWwvdXJsLXRlbXBsYXRlLmpzXG5mdW5jdGlvbiBlbmNvZGVSZXNlcnZlZChzdHIpIHtcbiAgcmV0dXJuIHN0ci5zcGxpdCgvKCVbMC05QS1GYS1mXXsyfSkvZykubWFwKGZ1bmN0aW9uKHBhcnQpIHtcbiAgICBpZiAoIS8lWzAtOUEtRmEtZl0vLnRlc3QocGFydCkpIHtcbiAgICAgIHBhcnQgPSBlbmNvZGVVUkkocGFydCkucmVwbGFjZSgvJTVCL2csIFwiW1wiKS5yZXBsYWNlKC8lNUQvZywgXCJdXCIpO1xuICAgIH1cbiAgICByZXR1cm4gcGFydDtcbiAgfSkuam9pbihcIlwiKTtcbn1cbmZ1bmN0aW9uIGVuY29kZVVucmVzZXJ2ZWQoc3RyKSB7XG4gIHJldHVybiBlbmNvZGVVUklDb21wb25lbnQoc3RyKS5yZXBsYWNlKC9bIScoKSpdL2csIGZ1bmN0aW9uKGMpIHtcbiAgICByZXR1cm4gXCIlXCIgKyBjLmNoYXJDb2RlQXQoMCkudG9TdHJpbmcoMTYpLnRvVXBwZXJDYXNlKCk7XG4gIH0pO1xufVxuZnVuY3Rpb24gZW5jb2RlVmFsdWUob3BlcmF0b3IsIHZhbHVlLCBrZXkpIHtcbiAgdmFsdWUgPSBvcGVyYXRvciA9PT0gXCIrXCIgfHwgb3BlcmF0b3IgPT09IFwiI1wiID8gZW5jb2RlUmVzZXJ2ZWQodmFsdWUpIDogZW5jb2RlVW5yZXNlcnZlZCh2YWx1ZSk7XG4gIGlmIChrZXkpIHtcbiAgICByZXR1cm4gZW5jb2RlVW5yZXNlcnZlZChrZXkpICsgXCI9XCIgKyB2YWx1ZTtcbiAgfSBlbHNlIHtcbiAgICByZXR1cm4gdmFsdWU7XG4gIH1cbn1cbmZ1bmN0aW9uIGlzRGVmaW5lZCh2YWx1ZSkge1xuICByZXR1cm4gdmFsdWUgIT09IHZvaWQgMCAmJiB2YWx1ZSAhPT0gbnVsbDtcbn1cbmZ1bmN0aW9uIGlzS2V5T3BlcmF0b3Iob3BlcmF0b3IpIHtcbiAgcmV0dXJuIG9wZXJhdG9yID09PSBcIjtcIiB8fCBvcGVyYXRvciA9PT0gXCImXCIgfHwgb3BlcmF0b3IgPT09IFwiP1wiO1xufVxuZnVuY3Rpb24gZ2V0VmFsdWVzKGNvbnRleHQsIG9wZXJhdG9yLCBrZXksIG1vZGlmaWVyKSB7XG4gIHZhciB2YWx1ZSA9IGNvbnRleHRba2V5XSwgcmVzdWx0ID0gW107XG4gIGlmIChpc0RlZmluZWQodmFsdWUpICYmIHZhbHVlICE9PSBcIlwiKSB7XG4gICAgaWYgKHR5cGVvZiB2YWx1ZSA9PT0gXCJzdHJpbmdcIiB8fCB0eXBlb2YgdmFsdWUgPT09IFwibnVtYmVyXCIgfHwgdHlwZW9mIHZhbHVlID09PSBcImJvb2xlYW5cIikge1xuICAgICAgdmFsdWUgPSB2YWx1ZS50b1N0cmluZygpO1xuICAgICAgaWYgKG1vZGlmaWVyICYmIG1vZGlmaWVyICE9PSBcIipcIikge1xuICAgICAgICB2YWx1ZSA9IHZhbHVlLnN1YnN0cmluZygwLCBwYXJzZUludChtb2RpZmllciwgMTApKTtcbiAgICAgIH1cbiAgICAgIHJlc3VsdC5wdXNoKFxuICAgICAgICBlbmNvZGVWYWx1ZShvcGVyYXRvciwgdmFsdWUsIGlzS2V5T3BlcmF0b3Iob3BlcmF0b3IpID8ga2V5IDogXCJcIilcbiAgICAgICk7XG4gICAgfSBlbHNlIHtcbiAgICAgIGlmIChtb2RpZmllciA9PT0gXCIqXCIpIHtcbiAgICAgICAgaWYgKEFycmF5LmlzQXJyYXkodmFsdWUpKSB7XG4gICAgICAgICAgdmFsdWUuZmlsdGVyKGlzRGVmaW5lZCkuZm9yRWFjaChmdW5jdGlvbih2YWx1ZTIpIHtcbiAgICAgICAgICAgIHJlc3VsdC5wdXNoKFxuICAgICAgICAgICAgICBlbmNvZGVWYWx1ZShvcGVyYXRvciwgdmFsdWUyLCBpc0tleU9wZXJhdG9yKG9wZXJhdG9yKSA/IGtleSA6IFwiXCIpXG4gICAgICAgICAgICApO1xuICAgICAgICAgIH0pO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIE9iamVjdC5rZXlzKHZhbHVlKS5mb3JFYWNoKGZ1bmN0aW9uKGspIHtcbiAgICAgICAgICAgIGlmIChpc0RlZmluZWQodmFsdWVba10pKSB7XG4gICAgICAgICAgICAgIHJlc3VsdC5wdXNoKGVuY29kZVZhbHVlKG9wZXJhdG9yLCB2YWx1ZVtrXSwgaykpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBjb25zdCB0bXAgPSBbXTtcbiAgICAgICAgaWYgKEFycmF5LmlzQXJyYXkodmFsdWUpKSB7XG4gICAgICAgICAgdmFsdWUuZmlsdGVyKGlzRGVmaW5lZCkuZm9yRWFjaChmdW5jdGlvbih2YWx1ZTIpIHtcbiAgICAgICAgICAgIHRtcC5wdXNoKGVuY29kZVZhbHVlKG9wZXJhdG9yLCB2YWx1ZTIpKTtcbiAgICAgICAgICB9KTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBPYmplY3Qua2V5cyh2YWx1ZSkuZm9yRWFjaChmdW5jdGlvbihrKSB7XG4gICAgICAgICAgICBpZiAoaXNEZWZpbmVkKHZhbHVlW2tdKSkge1xuICAgICAgICAgICAgICB0bXAucHVzaChlbmNvZGVVbnJlc2VydmVkKGspKTtcbiAgICAgICAgICAgICAgdG1wLnB1c2goZW5jb2RlVmFsdWUob3BlcmF0b3IsIHZhbHVlW2tdLnRvU3RyaW5nKCkpKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoaXNLZXlPcGVyYXRvcihvcGVyYXRvcikpIHtcbiAgICAgICAgICByZXN1bHQucHVzaChlbmNvZGVVbnJlc2VydmVkKGtleSkgKyBcIj1cIiArIHRtcC5qb2luKFwiLFwiKSk7XG4gICAgICAgIH0gZWxzZSBpZiAodG1wLmxlbmd0aCAhPT0gMCkge1xuICAgICAgICAgIHJlc3VsdC5wdXNoKHRtcC5qb2luKFwiLFwiKSk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gIH0gZWxzZSB7XG4gICAgaWYgKG9wZXJhdG9yID09PSBcIjtcIikge1xuICAgICAgaWYgKGlzRGVmaW5lZCh2YWx1ZSkpIHtcbiAgICAgICAgcmVzdWx0LnB1c2goZW5jb2RlVW5yZXNlcnZlZChrZXkpKTtcbiAgICAgIH1cbiAgICB9IGVsc2UgaWYgKHZhbHVlID09PSBcIlwiICYmIChvcGVyYXRvciA9PT0gXCImXCIgfHwgb3BlcmF0b3IgPT09IFwiP1wiKSkge1xuICAgICAgcmVzdWx0LnB1c2goZW5jb2RlVW5yZXNlcnZlZChrZXkpICsgXCI9XCIpO1xuICAgIH0gZWxzZSBpZiAodmFsdWUgPT09IFwiXCIpIHtcbiAgICAgIHJlc3VsdC5wdXNoKFwiXCIpO1xuICAgIH1cbiAgfVxuICByZXR1cm4gcmVzdWx0O1xufVxuZnVuY3Rpb24gcGFyc2VVcmwodGVtcGxhdGUpIHtcbiAgcmV0dXJuIHtcbiAgICBleHBhbmQ6IGV4cGFuZC5iaW5kKG51bGwsIHRlbXBsYXRlKVxuICB9O1xufVxuZnVuY3Rpb24gZXhwYW5kKHRlbXBsYXRlLCBjb250ZXh0KSB7XG4gIHZhciBvcGVyYXRvcnMgPSBbXCIrXCIsIFwiI1wiLCBcIi5cIiwgXCIvXCIsIFwiO1wiLCBcIj9cIiwgXCImXCJdO1xuICB0ZW1wbGF0ZSA9IHRlbXBsYXRlLnJlcGxhY2UoXG4gICAgL1xceyhbXlxce1xcfV0rKVxcfXwoW15cXHtcXH1dKykvZyxcbiAgICBmdW5jdGlvbihfLCBleHByZXNzaW9uLCBsaXRlcmFsKSB7XG4gICAgICBpZiAoZXhwcmVzc2lvbikge1xuICAgICAgICBsZXQgb3BlcmF0b3IgPSBcIlwiO1xuICAgICAgICBjb25zdCB2YWx1ZXMgPSBbXTtcbiAgICAgICAgaWYgKG9wZXJhdG9ycy5pbmRleE9mKGV4cHJlc3Npb24uY2hhckF0KDApKSAhPT0gLTEpIHtcbiAgICAgICAgICBvcGVyYXRvciA9IGV4cHJlc3Npb24uY2hhckF0KDApO1xuICAgICAgICAgIGV4cHJlc3Npb24gPSBleHByZXNzaW9uLnN1YnN0cigxKTtcbiAgICAgICAgfVxuICAgICAgICBleHByZXNzaW9uLnNwbGl0KC8sL2cpLmZvckVhY2goZnVuY3Rpb24odmFyaWFibGUpIHtcbiAgICAgICAgICB2YXIgdG1wID0gLyhbXjpcXCpdKikoPzo6KFxcZCspfChcXCopKT8vLmV4ZWModmFyaWFibGUpO1xuICAgICAgICAgIHZhbHVlcy5wdXNoKGdldFZhbHVlcyhjb250ZXh0LCBvcGVyYXRvciwgdG1wWzFdLCB0bXBbMl0gfHwgdG1wWzNdKSk7XG4gICAgICAgIH0pO1xuICAgICAgICBpZiAob3BlcmF0b3IgJiYgb3BlcmF0b3IgIT09IFwiK1wiKSB7XG4gICAgICAgICAgdmFyIHNlcGFyYXRvciA9IFwiLFwiO1xuICAgICAgICAgIGlmIChvcGVyYXRvciA9PT0gXCI/XCIpIHtcbiAgICAgICAgICAgIHNlcGFyYXRvciA9IFwiJlwiO1xuICAgICAgICAgIH0gZWxzZSBpZiAob3BlcmF0b3IgIT09IFwiI1wiKSB7XG4gICAgICAgICAgICBzZXBhcmF0b3IgPSBvcGVyYXRvcjtcbiAgICAgICAgICB9XG4gICAgICAgICAgcmV0dXJuICh2YWx1ZXMubGVuZ3RoICE9PSAwID8gb3BlcmF0b3IgOiBcIlwiKSArIHZhbHVlcy5qb2luKHNlcGFyYXRvcik7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgcmV0dXJuIHZhbHVlcy5qb2luKFwiLFwiKTtcbiAgICAgICAgfVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgcmV0dXJuIGVuY29kZVJlc2VydmVkKGxpdGVyYWwpO1xuICAgICAgfVxuICAgIH1cbiAgKTtcbiAgaWYgKHRlbXBsYXRlID09PSBcIi9cIikge1xuICAgIHJldHVybiB0ZW1wbGF0ZTtcbiAgfSBlbHNlIHtcbiAgICByZXR1cm4gdGVtcGxhdGUucmVwbGFjZSgvXFwvJC8sIFwiXCIpO1xuICB9XG59XG5cbi8vIHBrZy9kaXN0LXNyYy9wYXJzZS5qc1xuZnVuY3Rpb24gcGFyc2Uob3B0aW9ucykge1xuICBsZXQgbWV0aG9kID0gb3B0aW9ucy5tZXRob2QudG9VcHBlckNhc2UoKTtcbiAgbGV0IHVybCA9IChvcHRpb25zLnVybCB8fCBcIi9cIikucmVwbGFjZSgvOihbYS16XVxcdyspL2csIFwieyQxfVwiKTtcbiAgbGV0IGhlYWRlcnMgPSBPYmplY3QuYXNzaWduKHt9LCBvcHRpb25zLmhlYWRlcnMpO1xuICBsZXQgYm9keTtcbiAgbGV0IHBhcmFtZXRlcnMgPSBvbWl0KG9wdGlvbnMsIFtcbiAgICBcIm1ldGhvZFwiLFxuICAgIFwiYmFzZVVybFwiLFxuICAgIFwidXJsXCIsXG4gICAgXCJoZWFkZXJzXCIsXG4gICAgXCJyZXF1ZXN0XCIsXG4gICAgXCJtZWRpYVR5cGVcIlxuICBdKTtcbiAgY29uc3QgdXJsVmFyaWFibGVOYW1lcyA9IGV4dHJhY3RVcmxWYXJpYWJsZU5hbWVzKHVybCk7XG4gIHVybCA9IHBhcnNlVXJsKHVybCkuZXhwYW5kKHBhcmFtZXRlcnMpO1xuICBpZiAoIS9eaHR0cC8udGVzdCh1cmwpKSB7XG4gICAgdXJsID0gb3B0aW9ucy5iYXNlVXJsICsgdXJsO1xuICB9XG4gIGNvbnN0IG9taXR0ZWRQYXJhbWV0ZXJzID0gT2JqZWN0LmtleXMob3B0aW9ucykuZmlsdGVyKChvcHRpb24pID0+IHVybFZhcmlhYmxlTmFtZXMuaW5jbHVkZXMob3B0aW9uKSkuY29uY2F0KFwiYmFzZVVybFwiKTtcbiAgY29uc3QgcmVtYWluaW5nUGFyYW1ldGVycyA9IG9taXQocGFyYW1ldGVycywgb21pdHRlZFBhcmFtZXRlcnMpO1xuICBjb25zdCBpc0JpbmFyeVJlcXVlc3QgPSAvYXBwbGljYXRpb25cXC9vY3RldC1zdHJlYW0vaS50ZXN0KGhlYWRlcnMuYWNjZXB0KTtcbiAgaWYgKCFpc0JpbmFyeVJlcXVlc3QpIHtcbiAgICBpZiAob3B0aW9ucy5tZWRpYVR5cGUuZm9ybWF0KSB7XG4gICAgICBoZWFkZXJzLmFjY2VwdCA9IGhlYWRlcnMuYWNjZXB0LnNwbGl0KC8sLykubWFwKFxuICAgICAgICAoZm9ybWF0KSA9PiBmb3JtYXQucmVwbGFjZShcbiAgICAgICAgICAvYXBwbGljYXRpb25cXC92bmQoXFwuXFx3KykoXFwudjMpPyhcXC5cXHcrKT8oXFwranNvbik/JC8sXG4gICAgICAgICAgYGFwcGxpY2F0aW9uL3ZuZCQxJDIuJHtvcHRpb25zLm1lZGlhVHlwZS5mb3JtYXR9YFxuICAgICAgICApXG4gICAgICApLmpvaW4oXCIsXCIpO1xuICAgIH1cbiAgICBpZiAodXJsLmVuZHNXaXRoKFwiL2dyYXBocWxcIikpIHtcbiAgICAgIGlmIChvcHRpb25zLm1lZGlhVHlwZS5wcmV2aWV3cz8ubGVuZ3RoKSB7XG4gICAgICAgIGNvbnN0IHByZXZpZXdzRnJvbUFjY2VwdEhlYWRlciA9IGhlYWRlcnMuYWNjZXB0Lm1hdGNoKC9bXFx3LV0rKD89LXByZXZpZXcpL2cpIHx8IFtdO1xuICAgICAgICBoZWFkZXJzLmFjY2VwdCA9IHByZXZpZXdzRnJvbUFjY2VwdEhlYWRlci5jb25jYXQob3B0aW9ucy5tZWRpYVR5cGUucHJldmlld3MpLm1hcCgocHJldmlldykgPT4ge1xuICAgICAgICAgIGNvbnN0IGZvcm1hdCA9IG9wdGlvbnMubWVkaWFUeXBlLmZvcm1hdCA/IGAuJHtvcHRpb25zLm1lZGlhVHlwZS5mb3JtYXR9YCA6IFwiK2pzb25cIjtcbiAgICAgICAgICByZXR1cm4gYGFwcGxpY2F0aW9uL3ZuZC5naXRodWIuJHtwcmV2aWV3fS1wcmV2aWV3JHtmb3JtYXR9YDtcbiAgICAgICAgfSkuam9pbihcIixcIik7XG4gICAgICB9XG4gICAgfVxuICB9XG4gIGlmIChbXCJHRVRcIiwgXCJIRUFEXCJdLmluY2x1ZGVzKG1ldGhvZCkpIHtcbiAgICB1cmwgPSBhZGRRdWVyeVBhcmFtZXRlcnModXJsLCByZW1haW5pbmdQYXJhbWV0ZXJzKTtcbiAgfSBlbHNlIHtcbiAgICBpZiAoXCJkYXRhXCIgaW4gcmVtYWluaW5nUGFyYW1ldGVycykge1xuICAgICAgYm9keSA9IHJlbWFpbmluZ1BhcmFtZXRlcnMuZGF0YTtcbiAgICB9IGVsc2Uge1xuICAgICAgaWYgKE9iamVjdC5rZXlzKHJlbWFpbmluZ1BhcmFtZXRlcnMpLmxlbmd0aCkge1xuICAgICAgICBib2R5ID0gcmVtYWluaW5nUGFyYW1ldGVycztcbiAgICAgIH1cbiAgICB9XG4gIH1cbiAgaWYgKCFoZWFkZXJzW1wiY29udGVudC10eXBlXCJdICYmIHR5cGVvZiBib2R5ICE9PSBcInVuZGVmaW5lZFwiKSB7XG4gICAgaGVhZGVyc1tcImNvbnRlbnQtdHlwZVwiXSA9IFwiYXBwbGljYXRpb24vanNvbjsgY2hhcnNldD11dGYtOFwiO1xuICB9XG4gIGlmIChbXCJQQVRDSFwiLCBcIlBVVFwiXS5pbmNsdWRlcyhtZXRob2QpICYmIHR5cGVvZiBib2R5ID09PSBcInVuZGVmaW5lZFwiKSB7XG4gICAgYm9keSA9IFwiXCI7XG4gIH1cbiAgcmV0dXJuIE9iamVjdC5hc3NpZ24oXG4gICAgeyBtZXRob2QsIHVybCwgaGVhZGVycyB9LFxuICAgIHR5cGVvZiBib2R5ICE9PSBcInVuZGVmaW5lZFwiID8geyBib2R5IH0gOiBudWxsLFxuICAgIG9wdGlvbnMucmVxdWVzdCA/IHsgcmVxdWVzdDogb3B0aW9ucy5yZXF1ZXN0IH0gOiBudWxsXG4gICk7XG59XG5cbi8vIHBrZy9kaXN0LXNyYy9lbmRwb2ludC13aXRoLWRlZmF1bHRzLmpzXG5mdW5jdGlvbiBlbmRwb2ludFdpdGhEZWZhdWx0cyhkZWZhdWx0cywgcm91dGUsIG9wdGlvbnMpIHtcbiAgcmV0dXJuIHBhcnNlKG1lcmdlKGRlZmF1bHRzLCByb3V0ZSwgb3B0aW9ucykpO1xufVxuXG4vLyBwa2cvZGlzdC1zcmMvd2l0aC1kZWZhdWx0cy5qc1xuZnVuY3Rpb24gd2l0aERlZmF1bHRzKG9sZERlZmF1bHRzLCBuZXdEZWZhdWx0cykge1xuICBjb25zdCBERUZBVUxUUzIgPSBtZXJnZShvbGREZWZhdWx0cywgbmV3RGVmYXVsdHMpO1xuICBjb25zdCBlbmRwb2ludDIgPSBlbmRwb2ludFdpdGhEZWZhdWx0cy5iaW5kKG51bGwsIERFRkFVTFRTMik7XG4gIHJldHVybiBPYmplY3QuYXNzaWduKGVuZHBvaW50Miwge1xuICAgIERFRkFVTFRTOiBERUZBVUxUUzIsXG4gICAgZGVmYXVsdHM6IHdpdGhEZWZhdWx0cy5iaW5kKG51bGwsIERFRkFVTFRTMiksXG4gICAgbWVyZ2U6IG1lcmdlLmJpbmQobnVsbCwgREVGQVVMVFMyKSxcbiAgICBwYXJzZVxuICB9KTtcbn1cblxuLy8gcGtnL2Rpc3Qtc3JjL2luZGV4LmpzXG52YXIgZW5kcG9pbnQgPSB3aXRoRGVmYXVsdHMobnVsbCwgREVGQVVMVFMpO1xuLy8gQW5ub3RhdGUgdGhlIENvbW1vbkpTIGV4cG9ydCBuYW1lcyBmb3IgRVNNIGltcG9ydCBpbiBub2RlOlxuMCAmJiAobW9kdWxlLmV4cG9ydHMgPSB7XG4gIGVuZHBvaW50XG59KTtcbiIsCiAgICAiJ3VzZSBzdHJpY3QnO1xuXG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgJ19fZXNNb2R1bGUnLCB7IHZhbHVlOiB0cnVlIH0pO1xuXG5jbGFzcyBEZXByZWNhdGlvbiBleHRlbmRzIEVycm9yIHtcbiAgY29uc3RydWN0b3IobWVzc2FnZSkge1xuICAgIHN1cGVyKG1lc3NhZ2UpOyAvLyBNYWludGFpbnMgcHJvcGVyIHN0YWNrIHRyYWNlIChvbmx5IGF2YWlsYWJsZSBvbiBWOClcblxuICAgIC8qIGlzdGFuYnVsIGlnbm9yZSBuZXh0ICovXG5cbiAgICBpZiAoRXJyb3IuY2FwdHVyZVN0YWNrVHJhY2UpIHtcbiAgICAgIEVycm9yLmNhcHR1cmVTdGFja1RyYWNlKHRoaXMsIHRoaXMuY29uc3RydWN0b3IpO1xuICAgIH1cblxuICAgIHRoaXMubmFtZSA9ICdEZXByZWNhdGlvbic7XG4gIH1cblxufVxuXG5leHBvcnRzLkRlcHJlY2F0aW9uID0gRGVwcmVjYXRpb247XG4iLAogICAgIi8vIFJldHVybnMgYSB3cmFwcGVyIGZ1bmN0aW9uIHRoYXQgcmV0dXJucyBhIHdyYXBwZWQgY2FsbGJhY2tcbi8vIFRoZSB3cmFwcGVyIGZ1bmN0aW9uIHNob3VsZCBkbyBzb21lIHN0dWZmLCBhbmQgcmV0dXJuIGFcbi8vIHByZXN1bWFibHkgZGlmZmVyZW50IGNhbGxiYWNrIGZ1bmN0aW9uLlxuLy8gVGhpcyBtYWtlcyBzdXJlIHRoYXQgb3duIHByb3BlcnRpZXMgYXJlIHJldGFpbmVkLCBzbyB0aGF0XG4vLyBkZWNvcmF0aW9ucyBhbmQgc3VjaCBhcmUgbm90IGxvc3QgYWxvbmcgdGhlIHdheS5cbm1vZHVsZS5leHBvcnRzID0gd3JhcHB5XG5mdW5jdGlvbiB3cmFwcHkgKGZuLCBjYikge1xuICBpZiAoZm4gJiYgY2IpIHJldHVybiB3cmFwcHkoZm4pKGNiKVxuXG4gIGlmICh0eXBlb2YgZm4gIT09ICdmdW5jdGlvbicpXG4gICAgdGhyb3cgbmV3IFR5cGVFcnJvcignbmVlZCB3cmFwcGVyIGZ1bmN0aW9uJylcblxuICBPYmplY3Qua2V5cyhmbikuZm9yRWFjaChmdW5jdGlvbiAoaykge1xuICAgIHdyYXBwZXJba10gPSBmbltrXVxuICB9KVxuXG4gIHJldHVybiB3cmFwcGVyXG5cbiAgZnVuY3Rpb24gd3JhcHBlcigpIHtcbiAgICB2YXIgYXJncyA9IG5ldyBBcnJheShhcmd1bWVudHMubGVuZ3RoKVxuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgYXJncy5sZW5ndGg7IGkrKykge1xuICAgICAgYXJnc1tpXSA9IGFyZ3VtZW50c1tpXVxuICAgIH1cbiAgICB2YXIgcmV0ID0gZm4uYXBwbHkodGhpcywgYXJncylcbiAgICB2YXIgY2IgPSBhcmdzW2FyZ3MubGVuZ3RoLTFdXG4gICAgaWYgKHR5cGVvZiByZXQgPT09ICdmdW5jdGlvbicgJiYgcmV0ICE9PSBjYikge1xuICAgICAgT2JqZWN0LmtleXMoY2IpLmZvckVhY2goZnVuY3Rpb24gKGspIHtcbiAgICAgICAgcmV0W2tdID0gY2Jba11cbiAgICAgIH0pXG4gICAgfVxuICAgIHJldHVybiByZXRcbiAgfVxufVxuIiwKICAgICJ2YXIgd3JhcHB5ID0gcmVxdWlyZSgnd3JhcHB5Jylcbm1vZHVsZS5leHBvcnRzID0gd3JhcHB5KG9uY2UpXG5tb2R1bGUuZXhwb3J0cy5zdHJpY3QgPSB3cmFwcHkob25jZVN0cmljdClcblxub25jZS5wcm90byA9IG9uY2UoZnVuY3Rpb24gKCkge1xuICBPYmplY3QuZGVmaW5lUHJvcGVydHkoRnVuY3Rpb24ucHJvdG90eXBlLCAnb25jZScsIHtcbiAgICB2YWx1ZTogZnVuY3Rpb24gKCkge1xuICAgICAgcmV0dXJuIG9uY2UodGhpcylcbiAgICB9LFxuICAgIGNvbmZpZ3VyYWJsZTogdHJ1ZVxuICB9KVxuXG4gIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShGdW5jdGlvbi5wcm90b3R5cGUsICdvbmNlU3RyaWN0Jywge1xuICAgIHZhbHVlOiBmdW5jdGlvbiAoKSB7XG4gICAgICByZXR1cm4gb25jZVN0cmljdCh0aGlzKVxuICAgIH0sXG4gICAgY29uZmlndXJhYmxlOiB0cnVlXG4gIH0pXG59KVxuXG5mdW5jdGlvbiBvbmNlIChmbikge1xuICB2YXIgZiA9IGZ1bmN0aW9uICgpIHtcbiAgICBpZiAoZi5jYWxsZWQpIHJldHVybiBmLnZhbHVlXG4gICAgZi5jYWxsZWQgPSB0cnVlXG4gICAgcmV0dXJuIGYudmFsdWUgPSBmbi5hcHBseSh0aGlzLCBhcmd1bWVudHMpXG4gIH1cbiAgZi5jYWxsZWQgPSBmYWxzZVxuICByZXR1cm4gZlxufVxuXG5mdW5jdGlvbiBvbmNlU3RyaWN0IChmbikge1xuICB2YXIgZiA9IGZ1bmN0aW9uICgpIHtcbiAgICBpZiAoZi5jYWxsZWQpXG4gICAgICB0aHJvdyBuZXcgRXJyb3IoZi5vbmNlRXJyb3IpXG4gICAgZi5jYWxsZWQgPSB0cnVlXG4gICAgcmV0dXJuIGYudmFsdWUgPSBmbi5hcHBseSh0aGlzLCBhcmd1bWVudHMpXG4gIH1cbiAgdmFyIG5hbWUgPSBmbi5uYW1lIHx8ICdGdW5jdGlvbiB3cmFwcGVkIHdpdGggYG9uY2VgJ1xuICBmLm9uY2VFcnJvciA9IG5hbWUgKyBcIiBzaG91bGRuJ3QgYmUgY2FsbGVkIG1vcmUgdGhhbiBvbmNlXCJcbiAgZi5jYWxsZWQgPSBmYWxzZVxuICByZXR1cm4gZlxufVxuIiwKICAgICJcInVzZSBzdHJpY3RcIjtcbnZhciBfX2NyZWF0ZSA9IE9iamVjdC5jcmVhdGU7XG52YXIgX19kZWZQcm9wID0gT2JqZWN0LmRlZmluZVByb3BlcnR5O1xudmFyIF9fZ2V0T3duUHJvcERlc2MgPSBPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yO1xudmFyIF9fZ2V0T3duUHJvcE5hbWVzID0gT2JqZWN0LmdldE93blByb3BlcnR5TmFtZXM7XG52YXIgX19nZXRQcm90b09mID0gT2JqZWN0LmdldFByb3RvdHlwZU9mO1xudmFyIF9faGFzT3duUHJvcCA9IE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHk7XG52YXIgX19leHBvcnQgPSAodGFyZ2V0LCBhbGwpID0+IHtcbiAgZm9yICh2YXIgbmFtZSBpbiBhbGwpXG4gICAgX19kZWZQcm9wKHRhcmdldCwgbmFtZSwgeyBnZXQ6IGFsbFtuYW1lXSwgZW51bWVyYWJsZTogdHJ1ZSB9KTtcbn07XG52YXIgX19jb3B5UHJvcHMgPSAodG8sIGZyb20sIGV4Y2VwdCwgZGVzYykgPT4ge1xuICBpZiAoZnJvbSAmJiB0eXBlb2YgZnJvbSA9PT0gXCJvYmplY3RcIiB8fCB0eXBlb2YgZnJvbSA9PT0gXCJmdW5jdGlvblwiKSB7XG4gICAgZm9yIChsZXQga2V5IG9mIF9fZ2V0T3duUHJvcE5hbWVzKGZyb20pKVxuICAgICAgaWYgKCFfX2hhc093blByb3AuY2FsbCh0bywga2V5KSAmJiBrZXkgIT09IGV4Y2VwdClcbiAgICAgICAgX19kZWZQcm9wKHRvLCBrZXksIHsgZ2V0OiAoKSA9PiBmcm9tW2tleV0sIGVudW1lcmFibGU6ICEoZGVzYyA9IF9fZ2V0T3duUHJvcERlc2MoZnJvbSwga2V5KSkgfHwgZGVzYy5lbnVtZXJhYmxlIH0pO1xuICB9XG4gIHJldHVybiB0bztcbn07XG52YXIgX190b0VTTSA9IChtb2QsIGlzTm9kZU1vZGUsIHRhcmdldCkgPT4gKHRhcmdldCA9IG1vZCAhPSBudWxsID8gX19jcmVhdGUoX19nZXRQcm90b09mKG1vZCkpIDoge30sIF9fY29weVByb3BzKFxuICAvLyBJZiB0aGUgaW1wb3J0ZXIgaXMgaW4gbm9kZSBjb21wYXRpYmlsaXR5IG1vZGUgb3IgdGhpcyBpcyBub3QgYW4gRVNNXG4gIC8vIGZpbGUgdGhhdCBoYXMgYmVlbiBjb252ZXJ0ZWQgdG8gYSBDb21tb25KUyBmaWxlIHVzaW5nIGEgQmFiZWwtXG4gIC8vIGNvbXBhdGlibGUgdHJhbnNmb3JtIChpLmUuIFwiX19lc01vZHVsZVwiIGhhcyBub3QgYmVlbiBzZXQpLCB0aGVuIHNldFxuICAvLyBcImRlZmF1bHRcIiB0byB0aGUgQ29tbW9uSlMgXCJtb2R1bGUuZXhwb3J0c1wiIGZvciBub2RlIGNvbXBhdGliaWxpdHkuXG4gIGlzTm9kZU1vZGUgfHwgIW1vZCB8fCAhbW9kLl9fZXNNb2R1bGUgPyBfX2RlZlByb3AodGFyZ2V0LCBcImRlZmF1bHRcIiwgeyB2YWx1ZTogbW9kLCBlbnVtZXJhYmxlOiB0cnVlIH0pIDogdGFyZ2V0LFxuICBtb2RcbikpO1xudmFyIF9fdG9Db21tb25KUyA9IChtb2QpID0+IF9fY29weVByb3BzKF9fZGVmUHJvcCh7fSwgXCJfX2VzTW9kdWxlXCIsIHsgdmFsdWU6IHRydWUgfSksIG1vZCk7XG5cbi8vIHBrZy9kaXN0LXNyYy9pbmRleC5qc1xudmFyIGRpc3Rfc3JjX2V4cG9ydHMgPSB7fTtcbl9fZXhwb3J0KGRpc3Rfc3JjX2V4cG9ydHMsIHtcbiAgUmVxdWVzdEVycm9yOiAoKSA9PiBSZXF1ZXN0RXJyb3Jcbn0pO1xubW9kdWxlLmV4cG9ydHMgPSBfX3RvQ29tbW9uSlMoZGlzdF9zcmNfZXhwb3J0cyk7XG52YXIgaW1wb3J0X2RlcHJlY2F0aW9uID0gcmVxdWlyZShcImRlcHJlY2F0aW9uXCIpO1xudmFyIGltcG9ydF9vbmNlID0gX190b0VTTShyZXF1aXJlKFwib25jZVwiKSk7XG52YXIgbG9nT25jZUNvZGUgPSAoMCwgaW1wb3J0X29uY2UuZGVmYXVsdCkoKGRlcHJlY2F0aW9uKSA9PiBjb25zb2xlLndhcm4oZGVwcmVjYXRpb24pKTtcbnZhciBsb2dPbmNlSGVhZGVycyA9ICgwLCBpbXBvcnRfb25jZS5kZWZhdWx0KSgoZGVwcmVjYXRpb24pID0+IGNvbnNvbGUud2FybihkZXByZWNhdGlvbikpO1xudmFyIFJlcXVlc3RFcnJvciA9IGNsYXNzIGV4dGVuZHMgRXJyb3Ige1xuICBjb25zdHJ1Y3RvcihtZXNzYWdlLCBzdGF0dXNDb2RlLCBvcHRpb25zKSB7XG4gICAgc3VwZXIobWVzc2FnZSk7XG4gICAgaWYgKEVycm9yLmNhcHR1cmVTdGFja1RyYWNlKSB7XG4gICAgICBFcnJvci5jYXB0dXJlU3RhY2tUcmFjZSh0aGlzLCB0aGlzLmNvbnN0cnVjdG9yKTtcbiAgICB9XG4gICAgdGhpcy5uYW1lID0gXCJIdHRwRXJyb3JcIjtcbiAgICB0aGlzLnN0YXR1cyA9IHN0YXR1c0NvZGU7XG4gICAgbGV0IGhlYWRlcnM7XG4gICAgaWYgKFwiaGVhZGVyc1wiIGluIG9wdGlvbnMgJiYgdHlwZW9mIG9wdGlvbnMuaGVhZGVycyAhPT0gXCJ1bmRlZmluZWRcIikge1xuICAgICAgaGVhZGVycyA9IG9wdGlvbnMuaGVhZGVycztcbiAgICB9XG4gICAgaWYgKFwicmVzcG9uc2VcIiBpbiBvcHRpb25zKSB7XG4gICAgICB0aGlzLnJlc3BvbnNlID0gb3B0aW9ucy5yZXNwb25zZTtcbiAgICAgIGhlYWRlcnMgPSBvcHRpb25zLnJlc3BvbnNlLmhlYWRlcnM7XG4gICAgfVxuICAgIGNvbnN0IHJlcXVlc3RDb3B5ID0gT2JqZWN0LmFzc2lnbih7fSwgb3B0aW9ucy5yZXF1ZXN0KTtcbiAgICBpZiAob3B0aW9ucy5yZXF1ZXN0LmhlYWRlcnMuYXV0aG9yaXphdGlvbikge1xuICAgICAgcmVxdWVzdENvcHkuaGVhZGVycyA9IE9iamVjdC5hc3NpZ24oe30sIG9wdGlvbnMucmVxdWVzdC5oZWFkZXJzLCB7XG4gICAgICAgIGF1dGhvcml6YXRpb246IG9wdGlvbnMucmVxdWVzdC5oZWFkZXJzLmF1dGhvcml6YXRpb24ucmVwbGFjZShcbiAgICAgICAgICAvIC4qJC8sXG4gICAgICAgICAgXCIgW1JFREFDVEVEXVwiXG4gICAgICAgIClcbiAgICAgIH0pO1xuICAgIH1cbiAgICByZXF1ZXN0Q29weS51cmwgPSByZXF1ZXN0Q29weS51cmwucmVwbGFjZSgvXFxiY2xpZW50X3NlY3JldD1cXHcrL2csIFwiY2xpZW50X3NlY3JldD1bUkVEQUNURURdXCIpLnJlcGxhY2UoL1xcYmFjY2Vzc190b2tlbj1cXHcrL2csIFwiYWNjZXNzX3Rva2VuPVtSRURBQ1RFRF1cIik7XG4gICAgdGhpcy5yZXF1ZXN0ID0gcmVxdWVzdENvcHk7XG4gICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KHRoaXMsIFwiY29kZVwiLCB7XG4gICAgICBnZXQoKSB7XG4gICAgICAgIGxvZ09uY2VDb2RlKFxuICAgICAgICAgIG5ldyBpbXBvcnRfZGVwcmVjYXRpb24uRGVwcmVjYXRpb24oXG4gICAgICAgICAgICBcIltAb2N0b2tpdC9yZXF1ZXN0LWVycm9yXSBgZXJyb3IuY29kZWAgaXMgZGVwcmVjYXRlZCwgdXNlIGBlcnJvci5zdGF0dXNgLlwiXG4gICAgICAgICAgKVxuICAgICAgICApO1xuICAgICAgICByZXR1cm4gc3RhdHVzQ29kZTtcbiAgICAgIH1cbiAgICB9KTtcbiAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkodGhpcywgXCJoZWFkZXJzXCIsIHtcbiAgICAgIGdldCgpIHtcbiAgICAgICAgbG9nT25jZUhlYWRlcnMoXG4gICAgICAgICAgbmV3IGltcG9ydF9kZXByZWNhdGlvbi5EZXByZWNhdGlvbihcbiAgICAgICAgICAgIFwiW0BvY3Rva2l0L3JlcXVlc3QtZXJyb3JdIGBlcnJvci5oZWFkZXJzYCBpcyBkZXByZWNhdGVkLCB1c2UgYGVycm9yLnJlc3BvbnNlLmhlYWRlcnNgLlwiXG4gICAgICAgICAgKVxuICAgICAgICApO1xuICAgICAgICByZXR1cm4gaGVhZGVycyB8fCB7fTtcbiAgICAgIH1cbiAgICB9KTtcbiAgfVxufTtcbi8vIEFubm90YXRlIHRoZSBDb21tb25KUyBleHBvcnQgbmFtZXMgZm9yIEVTTSBpbXBvcnQgaW4gbm9kZTpcbjAgJiYgKG1vZHVsZS5leHBvcnRzID0ge1xuICBSZXF1ZXN0RXJyb3Jcbn0pO1xuIiwKICAgICJcInVzZSBzdHJpY3RcIjtcbnZhciBfX2RlZlByb3AgPSBPYmplY3QuZGVmaW5lUHJvcGVydHk7XG52YXIgX19nZXRPd25Qcm9wRGVzYyA9IE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3I7XG52YXIgX19nZXRPd25Qcm9wTmFtZXMgPSBPYmplY3QuZ2V0T3duUHJvcGVydHlOYW1lcztcbnZhciBfX2hhc093blByb3AgPSBPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5O1xudmFyIF9fZXhwb3J0ID0gKHRhcmdldCwgYWxsKSA9PiB7XG4gIGZvciAodmFyIG5hbWUgaW4gYWxsKVxuICAgIF9fZGVmUHJvcCh0YXJnZXQsIG5hbWUsIHsgZ2V0OiBhbGxbbmFtZV0sIGVudW1lcmFibGU6IHRydWUgfSk7XG59O1xudmFyIF9fY29weVByb3BzID0gKHRvLCBmcm9tLCBleGNlcHQsIGRlc2MpID0+IHtcbiAgaWYgKGZyb20gJiYgdHlwZW9mIGZyb20gPT09IFwib2JqZWN0XCIgfHwgdHlwZW9mIGZyb20gPT09IFwiZnVuY3Rpb25cIikge1xuICAgIGZvciAobGV0IGtleSBvZiBfX2dldE93blByb3BOYW1lcyhmcm9tKSlcbiAgICAgIGlmICghX19oYXNPd25Qcm9wLmNhbGwodG8sIGtleSkgJiYga2V5ICE9PSBleGNlcHQpXG4gICAgICAgIF9fZGVmUHJvcCh0bywga2V5LCB7IGdldDogKCkgPT4gZnJvbVtrZXldLCBlbnVtZXJhYmxlOiAhKGRlc2MgPSBfX2dldE93blByb3BEZXNjKGZyb20sIGtleSkpIHx8IGRlc2MuZW51bWVyYWJsZSB9KTtcbiAgfVxuICByZXR1cm4gdG87XG59O1xudmFyIF9fdG9Db21tb25KUyA9IChtb2QpID0+IF9fY29weVByb3BzKF9fZGVmUHJvcCh7fSwgXCJfX2VzTW9kdWxlXCIsIHsgdmFsdWU6IHRydWUgfSksIG1vZCk7XG5cbi8vIHBrZy9kaXN0LXNyYy9pbmRleC5qc1xudmFyIGRpc3Rfc3JjX2V4cG9ydHMgPSB7fTtcbl9fZXhwb3J0KGRpc3Rfc3JjX2V4cG9ydHMsIHtcbiAgcmVxdWVzdDogKCkgPT4gcmVxdWVzdFxufSk7XG5tb2R1bGUuZXhwb3J0cyA9IF9fdG9Db21tb25KUyhkaXN0X3NyY19leHBvcnRzKTtcbnZhciBpbXBvcnRfZW5kcG9pbnQgPSByZXF1aXJlKFwiQG9jdG9raXQvZW5kcG9pbnRcIik7XG52YXIgaW1wb3J0X3VuaXZlcnNhbF91c2VyX2FnZW50ID0gcmVxdWlyZShcInVuaXZlcnNhbC11c2VyLWFnZW50XCIpO1xuXG4vLyBwa2cvZGlzdC1zcmMvdmVyc2lvbi5qc1xudmFyIFZFUlNJT04gPSBcIjguNC4wXCI7XG5cbi8vIHBrZy9kaXN0LXNyYy9pcy1wbGFpbi1vYmplY3QuanNcbmZ1bmN0aW9uIGlzUGxhaW5PYmplY3QodmFsdWUpIHtcbiAgaWYgKHR5cGVvZiB2YWx1ZSAhPT0gXCJvYmplY3RcIiB8fCB2YWx1ZSA9PT0gbnVsbClcbiAgICByZXR1cm4gZmFsc2U7XG4gIGlmIChPYmplY3QucHJvdG90eXBlLnRvU3RyaW5nLmNhbGwodmFsdWUpICE9PSBcIltvYmplY3QgT2JqZWN0XVwiKVxuICAgIHJldHVybiBmYWxzZTtcbiAgY29uc3QgcHJvdG8gPSBPYmplY3QuZ2V0UHJvdG90eXBlT2YodmFsdWUpO1xuICBpZiAocHJvdG8gPT09IG51bGwpXG4gICAgcmV0dXJuIHRydWU7XG4gIGNvbnN0IEN0b3IgPSBPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwocHJvdG8sIFwiY29uc3RydWN0b3JcIikgJiYgcHJvdG8uY29uc3RydWN0b3I7XG4gIHJldHVybiB0eXBlb2YgQ3RvciA9PT0gXCJmdW5jdGlvblwiICYmIEN0b3IgaW5zdGFuY2VvZiBDdG9yICYmIEZ1bmN0aW9uLnByb3RvdHlwZS5jYWxsKEN0b3IpID09PSBGdW5jdGlvbi5wcm90b3R5cGUuY2FsbCh2YWx1ZSk7XG59XG5cbi8vIHBrZy9kaXN0LXNyYy9mZXRjaC13cmFwcGVyLmpzXG52YXIgaW1wb3J0X3JlcXVlc3RfZXJyb3IgPSByZXF1aXJlKFwiQG9jdG9raXQvcmVxdWVzdC1lcnJvclwiKTtcblxuLy8gcGtnL2Rpc3Qtc3JjL2dldC1idWZmZXItcmVzcG9uc2UuanNcbmZ1bmN0aW9uIGdldEJ1ZmZlclJlc3BvbnNlKHJlc3BvbnNlKSB7XG4gIHJldHVybiByZXNwb25zZS5hcnJheUJ1ZmZlcigpO1xufVxuXG4vLyBwa2cvZGlzdC1zcmMvZmV0Y2gtd3JhcHBlci5qc1xuZnVuY3Rpb24gZmV0Y2hXcmFwcGVyKHJlcXVlc3RPcHRpb25zKSB7XG4gIHZhciBfYSwgX2IsIF9jLCBfZDtcbiAgY29uc3QgbG9nID0gcmVxdWVzdE9wdGlvbnMucmVxdWVzdCAmJiByZXF1ZXN0T3B0aW9ucy5yZXF1ZXN0LmxvZyA/IHJlcXVlc3RPcHRpb25zLnJlcXVlc3QubG9nIDogY29uc29sZTtcbiAgY29uc3QgcGFyc2VTdWNjZXNzUmVzcG9uc2VCb2R5ID0gKChfYSA9IHJlcXVlc3RPcHRpb25zLnJlcXVlc3QpID09IG51bGwgPyB2b2lkIDAgOiBfYS5wYXJzZVN1Y2Nlc3NSZXNwb25zZUJvZHkpICE9PSBmYWxzZTtcbiAgaWYgKGlzUGxhaW5PYmplY3QocmVxdWVzdE9wdGlvbnMuYm9keSkgfHwgQXJyYXkuaXNBcnJheShyZXF1ZXN0T3B0aW9ucy5ib2R5KSkge1xuICAgIHJlcXVlc3RPcHRpb25zLmJvZHkgPSBKU09OLnN0cmluZ2lmeShyZXF1ZXN0T3B0aW9ucy5ib2R5KTtcbiAgfVxuICBsZXQgaGVhZGVycyA9IHt9O1xuICBsZXQgc3RhdHVzO1xuICBsZXQgdXJsO1xuICBsZXQgeyBmZXRjaCB9ID0gZ2xvYmFsVGhpcztcbiAgaWYgKChfYiA9IHJlcXVlc3RPcHRpb25zLnJlcXVlc3QpID09IG51bGwgPyB2b2lkIDAgOiBfYi5mZXRjaCkge1xuICAgIGZldGNoID0gcmVxdWVzdE9wdGlvbnMucmVxdWVzdC5mZXRjaDtcbiAgfVxuICBpZiAoIWZldGNoKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgXCJmZXRjaCBpcyBub3Qgc2V0LiBQbGVhc2UgcGFzcyBhIGZldGNoIGltcGxlbWVudGF0aW9uIGFzIG5ldyBPY3Rva2l0KHsgcmVxdWVzdDogeyBmZXRjaCB9fSkuIExlYXJuIG1vcmUgYXQgaHR0cHM6Ly9naXRodWIuY29tL29jdG9raXQvb2N0b2tpdC5qcy8jZmV0Y2gtbWlzc2luZ1wiXG4gICAgKTtcbiAgfVxuICByZXR1cm4gZmV0Y2gocmVxdWVzdE9wdGlvbnMudXJsLCB7XG4gICAgbWV0aG9kOiByZXF1ZXN0T3B0aW9ucy5tZXRob2QsXG4gICAgYm9keTogcmVxdWVzdE9wdGlvbnMuYm9keSxcbiAgICByZWRpcmVjdDogKF9jID0gcmVxdWVzdE9wdGlvbnMucmVxdWVzdCkgPT0gbnVsbCA/IHZvaWQgMCA6IF9jLnJlZGlyZWN0LFxuICAgIGhlYWRlcnM6IHJlcXVlc3RPcHRpb25zLmhlYWRlcnMsXG4gICAgc2lnbmFsOiAoX2QgPSByZXF1ZXN0T3B0aW9ucy5yZXF1ZXN0KSA9PSBudWxsID8gdm9pZCAwIDogX2Quc2lnbmFsLFxuICAgIC8vIGR1cGxleCBtdXN0IGJlIHNldCBpZiByZXF1ZXN0LmJvZHkgaXMgUmVhZGFibGVTdHJlYW0gb3IgQXN5bmMgSXRlcmFibGVzLlxuICAgIC8vIFNlZSBodHRwczovL2ZldGNoLnNwZWMud2hhdHdnLm9yZy8jZG9tLXJlcXVlc3Rpbml0LWR1cGxleC5cbiAgICAuLi5yZXF1ZXN0T3B0aW9ucy5ib2R5ICYmIHsgZHVwbGV4OiBcImhhbGZcIiB9XG4gIH0pLnRoZW4oYXN5bmMgKHJlc3BvbnNlKSA9PiB7XG4gICAgdXJsID0gcmVzcG9uc2UudXJsO1xuICAgIHN0YXR1cyA9IHJlc3BvbnNlLnN0YXR1cztcbiAgICBmb3IgKGNvbnN0IGtleUFuZFZhbHVlIG9mIHJlc3BvbnNlLmhlYWRlcnMpIHtcbiAgICAgIGhlYWRlcnNba2V5QW5kVmFsdWVbMF1dID0ga2V5QW5kVmFsdWVbMV07XG4gICAgfVxuICAgIGlmIChcImRlcHJlY2F0aW9uXCIgaW4gaGVhZGVycykge1xuICAgICAgY29uc3QgbWF0Y2hlcyA9IGhlYWRlcnMubGluayAmJiBoZWFkZXJzLmxpbmsubWF0Y2goLzwoW14+XSspPjsgcmVsPVwiZGVwcmVjYXRpb25cIi8pO1xuICAgICAgY29uc3QgZGVwcmVjYXRpb25MaW5rID0gbWF0Y2hlcyAmJiBtYXRjaGVzLnBvcCgpO1xuICAgICAgbG9nLndhcm4oXG4gICAgICAgIGBbQG9jdG9raXQvcmVxdWVzdF0gXCIke3JlcXVlc3RPcHRpb25zLm1ldGhvZH0gJHtyZXF1ZXN0T3B0aW9ucy51cmx9XCIgaXMgZGVwcmVjYXRlZC4gSXQgaXMgc2NoZWR1bGVkIHRvIGJlIHJlbW92ZWQgb24gJHtoZWFkZXJzLnN1bnNldH0ke2RlcHJlY2F0aW9uTGluayA/IGAuIFNlZSAke2RlcHJlY2F0aW9uTGlua31gIDogXCJcIn1gXG4gICAgICApO1xuICAgIH1cbiAgICBpZiAoc3RhdHVzID09PSAyMDQgfHwgc3RhdHVzID09PSAyMDUpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgaWYgKHJlcXVlc3RPcHRpb25zLm1ldGhvZCA9PT0gXCJIRUFEXCIpIHtcbiAgICAgIGlmIChzdGF0dXMgPCA0MDApIHtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuICAgICAgdGhyb3cgbmV3IGltcG9ydF9yZXF1ZXN0X2Vycm9yLlJlcXVlc3RFcnJvcihyZXNwb25zZS5zdGF0dXNUZXh0LCBzdGF0dXMsIHtcbiAgICAgICAgcmVzcG9uc2U6IHtcbiAgICAgICAgICB1cmwsXG4gICAgICAgICAgc3RhdHVzLFxuICAgICAgICAgIGhlYWRlcnMsXG4gICAgICAgICAgZGF0YTogdm9pZCAwXG4gICAgICAgIH0sXG4gICAgICAgIHJlcXVlc3Q6IHJlcXVlc3RPcHRpb25zXG4gICAgICB9KTtcbiAgICB9XG4gICAgaWYgKHN0YXR1cyA9PT0gMzA0KSB7XG4gICAgICB0aHJvdyBuZXcgaW1wb3J0X3JlcXVlc3RfZXJyb3IuUmVxdWVzdEVycm9yKFwiTm90IG1vZGlmaWVkXCIsIHN0YXR1cywge1xuICAgICAgICByZXNwb25zZToge1xuICAgICAgICAgIHVybCxcbiAgICAgICAgICBzdGF0dXMsXG4gICAgICAgICAgaGVhZGVycyxcbiAgICAgICAgICBkYXRhOiBhd2FpdCBnZXRSZXNwb25zZURhdGEocmVzcG9uc2UpXG4gICAgICAgIH0sXG4gICAgICAgIHJlcXVlc3Q6IHJlcXVlc3RPcHRpb25zXG4gICAgICB9KTtcbiAgICB9XG4gICAgaWYgKHN0YXR1cyA+PSA0MDApIHtcbiAgICAgIGNvbnN0IGRhdGEgPSBhd2FpdCBnZXRSZXNwb25zZURhdGEocmVzcG9uc2UpO1xuICAgICAgY29uc3QgZXJyb3IgPSBuZXcgaW1wb3J0X3JlcXVlc3RfZXJyb3IuUmVxdWVzdEVycm9yKHRvRXJyb3JNZXNzYWdlKGRhdGEpLCBzdGF0dXMsIHtcbiAgICAgICAgcmVzcG9uc2U6IHtcbiAgICAgICAgICB1cmwsXG4gICAgICAgICAgc3RhdHVzLFxuICAgICAgICAgIGhlYWRlcnMsXG4gICAgICAgICAgZGF0YVxuICAgICAgICB9LFxuICAgICAgICByZXF1ZXN0OiByZXF1ZXN0T3B0aW9uc1xuICAgICAgfSk7XG4gICAgICB0aHJvdyBlcnJvcjtcbiAgICB9XG4gICAgcmV0dXJuIHBhcnNlU3VjY2Vzc1Jlc3BvbnNlQm9keSA/IGF3YWl0IGdldFJlc3BvbnNlRGF0YShyZXNwb25zZSkgOiByZXNwb25zZS5ib2R5O1xuICB9KS50aGVuKChkYXRhKSA9PiB7XG4gICAgcmV0dXJuIHtcbiAgICAgIHN0YXR1cyxcbiAgICAgIHVybCxcbiAgICAgIGhlYWRlcnMsXG4gICAgICBkYXRhXG4gICAgfTtcbiAgfSkuY2F0Y2goKGVycm9yKSA9PiB7XG4gICAgaWYgKGVycm9yIGluc3RhbmNlb2YgaW1wb3J0X3JlcXVlc3RfZXJyb3IuUmVxdWVzdEVycm9yKVxuICAgICAgdGhyb3cgZXJyb3I7XG4gICAgZWxzZSBpZiAoZXJyb3IubmFtZSA9PT0gXCJBYm9ydEVycm9yXCIpXG4gICAgICB0aHJvdyBlcnJvcjtcbiAgICBsZXQgbWVzc2FnZSA9IGVycm9yLm1lc3NhZ2U7XG4gICAgaWYgKGVycm9yLm5hbWUgPT09IFwiVHlwZUVycm9yXCIgJiYgXCJjYXVzZVwiIGluIGVycm9yKSB7XG4gICAgICBpZiAoZXJyb3IuY2F1c2UgaW5zdGFuY2VvZiBFcnJvcikge1xuICAgICAgICBtZXNzYWdlID0gZXJyb3IuY2F1c2UubWVzc2FnZTtcbiAgICAgIH0gZWxzZSBpZiAodHlwZW9mIGVycm9yLmNhdXNlID09PSBcInN0cmluZ1wiKSB7XG4gICAgICAgIG1lc3NhZ2UgPSBlcnJvci5jYXVzZTtcbiAgICAgIH1cbiAgICB9XG4gICAgdGhyb3cgbmV3IGltcG9ydF9yZXF1ZXN0X2Vycm9yLlJlcXVlc3RFcnJvcihtZXNzYWdlLCA1MDAsIHtcbiAgICAgIHJlcXVlc3Q6IHJlcXVlc3RPcHRpb25zXG4gICAgfSk7XG4gIH0pO1xufVxuYXN5bmMgZnVuY3Rpb24gZ2V0UmVzcG9uc2VEYXRhKHJlc3BvbnNlKSB7XG4gIGNvbnN0IGNvbnRlbnRUeXBlID0gcmVzcG9uc2UuaGVhZGVycy5nZXQoXCJjb250ZW50LXR5cGVcIik7XG4gIGlmICgvYXBwbGljYXRpb25cXC9qc29uLy50ZXN0KGNvbnRlbnRUeXBlKSkge1xuICAgIHJldHVybiByZXNwb25zZS5qc29uKCkuY2F0Y2goKCkgPT4gcmVzcG9uc2UudGV4dCgpKS5jYXRjaCgoKSA9PiBcIlwiKTtcbiAgfVxuICBpZiAoIWNvbnRlbnRUeXBlIHx8IC9edGV4dFxcL3xjaGFyc2V0PXV0Zi04JC8udGVzdChjb250ZW50VHlwZSkpIHtcbiAgICByZXR1cm4gcmVzcG9uc2UudGV4dCgpO1xuICB9XG4gIHJldHVybiBnZXRCdWZmZXJSZXNwb25zZShyZXNwb25zZSk7XG59XG5mdW5jdGlvbiB0b0Vycm9yTWVzc2FnZShkYXRhKSB7XG4gIGlmICh0eXBlb2YgZGF0YSA9PT0gXCJzdHJpbmdcIilcbiAgICByZXR1cm4gZGF0YTtcbiAgbGV0IHN1ZmZpeDtcbiAgaWYgKFwiZG9jdW1lbnRhdGlvbl91cmxcIiBpbiBkYXRhKSB7XG4gICAgc3VmZml4ID0gYCAtICR7ZGF0YS5kb2N1bWVudGF0aW9uX3VybH1gO1xuICB9IGVsc2Uge1xuICAgIHN1ZmZpeCA9IFwiXCI7XG4gIH1cbiAgaWYgKFwibWVzc2FnZVwiIGluIGRhdGEpIHtcbiAgICBpZiAoQXJyYXkuaXNBcnJheShkYXRhLmVycm9ycykpIHtcbiAgICAgIHJldHVybiBgJHtkYXRhLm1lc3NhZ2V9OiAke2RhdGEuZXJyb3JzLm1hcChKU09OLnN0cmluZ2lmeSkuam9pbihcIiwgXCIpfSR7c3VmZml4fWA7XG4gICAgfVxuICAgIHJldHVybiBgJHtkYXRhLm1lc3NhZ2V9JHtzdWZmaXh9YDtcbiAgfVxuICByZXR1cm4gYFVua25vd24gZXJyb3I6ICR7SlNPTi5zdHJpbmdpZnkoZGF0YSl9YDtcbn1cblxuLy8gcGtnL2Rpc3Qtc3JjL3dpdGgtZGVmYXVsdHMuanNcbmZ1bmN0aW9uIHdpdGhEZWZhdWx0cyhvbGRFbmRwb2ludCwgbmV3RGVmYXVsdHMpIHtcbiAgY29uc3QgZW5kcG9pbnQyID0gb2xkRW5kcG9pbnQuZGVmYXVsdHMobmV3RGVmYXVsdHMpO1xuICBjb25zdCBuZXdBcGkgPSBmdW5jdGlvbihyb3V0ZSwgcGFyYW1ldGVycykge1xuICAgIGNvbnN0IGVuZHBvaW50T3B0aW9ucyA9IGVuZHBvaW50Mi5tZXJnZShyb3V0ZSwgcGFyYW1ldGVycyk7XG4gICAgaWYgKCFlbmRwb2ludE9wdGlvbnMucmVxdWVzdCB8fCAhZW5kcG9pbnRPcHRpb25zLnJlcXVlc3QuaG9vaykge1xuICAgICAgcmV0dXJuIGZldGNoV3JhcHBlcihlbmRwb2ludDIucGFyc2UoZW5kcG9pbnRPcHRpb25zKSk7XG4gICAgfVxuICAgIGNvbnN0IHJlcXVlc3QyID0gKHJvdXRlMiwgcGFyYW1ldGVyczIpID0+IHtcbiAgICAgIHJldHVybiBmZXRjaFdyYXBwZXIoXG4gICAgICAgIGVuZHBvaW50Mi5wYXJzZShlbmRwb2ludDIubWVyZ2Uocm91dGUyLCBwYXJhbWV0ZXJzMikpXG4gICAgICApO1xuICAgIH07XG4gICAgT2JqZWN0LmFzc2lnbihyZXF1ZXN0Miwge1xuICAgICAgZW5kcG9pbnQ6IGVuZHBvaW50MixcbiAgICAgIGRlZmF1bHRzOiB3aXRoRGVmYXVsdHMuYmluZChudWxsLCBlbmRwb2ludDIpXG4gICAgfSk7XG4gICAgcmV0dXJuIGVuZHBvaW50T3B0aW9ucy5yZXF1ZXN0Lmhvb2socmVxdWVzdDIsIGVuZHBvaW50T3B0aW9ucyk7XG4gIH07XG4gIHJldHVybiBPYmplY3QuYXNzaWduKG5ld0FwaSwge1xuICAgIGVuZHBvaW50OiBlbmRwb2ludDIsXG4gICAgZGVmYXVsdHM6IHdpdGhEZWZhdWx0cy5iaW5kKG51bGwsIGVuZHBvaW50MilcbiAgfSk7XG59XG5cbi8vIHBrZy9kaXN0LXNyYy9pbmRleC5qc1xudmFyIHJlcXVlc3QgPSB3aXRoRGVmYXVsdHMoaW1wb3J0X2VuZHBvaW50LmVuZHBvaW50LCB7XG4gIGhlYWRlcnM6IHtcbiAgICBcInVzZXItYWdlbnRcIjogYG9jdG9raXQtcmVxdWVzdC5qcy8ke1ZFUlNJT059ICR7KDAsIGltcG9ydF91bml2ZXJzYWxfdXNlcl9hZ2VudC5nZXRVc2VyQWdlbnQpKCl9YFxuICB9XG59KTtcbi8vIEFubm90YXRlIHRoZSBDb21tb25KUyBleHBvcnQgbmFtZXMgZm9yIEVTTSBpbXBvcnQgaW4gbm9kZTpcbjAgJiYgKG1vZHVsZS5leHBvcnRzID0ge1xuICByZXF1ZXN0XG59KTtcbiIsCiAgICAiXCJ1c2Ugc3RyaWN0XCI7XG52YXIgX19kZWZQcm9wID0gT2JqZWN0LmRlZmluZVByb3BlcnR5O1xudmFyIF9fZ2V0T3duUHJvcERlc2MgPSBPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yO1xudmFyIF9fZ2V0T3duUHJvcE5hbWVzID0gT2JqZWN0LmdldE93blByb3BlcnR5TmFtZXM7XG52YXIgX19oYXNPd25Qcm9wID0gT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eTtcbnZhciBfX2V4cG9ydCA9ICh0YXJnZXQsIGFsbCkgPT4ge1xuICBmb3IgKHZhciBuYW1lIGluIGFsbClcbiAgICBfX2RlZlByb3AodGFyZ2V0LCBuYW1lLCB7IGdldDogYWxsW25hbWVdLCBlbnVtZXJhYmxlOiB0cnVlIH0pO1xufTtcbnZhciBfX2NvcHlQcm9wcyA9ICh0bywgZnJvbSwgZXhjZXB0LCBkZXNjKSA9PiB7XG4gIGlmIChmcm9tICYmIHR5cGVvZiBmcm9tID09PSBcIm9iamVjdFwiIHx8IHR5cGVvZiBmcm9tID09PSBcImZ1bmN0aW9uXCIpIHtcbiAgICBmb3IgKGxldCBrZXkgb2YgX19nZXRPd25Qcm9wTmFtZXMoZnJvbSkpXG4gICAgICBpZiAoIV9faGFzT3duUHJvcC5jYWxsKHRvLCBrZXkpICYmIGtleSAhPT0gZXhjZXB0KVxuICAgICAgICBfX2RlZlByb3AodG8sIGtleSwgeyBnZXQ6ICgpID0+IGZyb21ba2V5XSwgZW51bWVyYWJsZTogIShkZXNjID0gX19nZXRPd25Qcm9wRGVzYyhmcm9tLCBrZXkpKSB8fCBkZXNjLmVudW1lcmFibGUgfSk7XG4gIH1cbiAgcmV0dXJuIHRvO1xufTtcbnZhciBfX3RvQ29tbW9uSlMgPSAobW9kKSA9PiBfX2NvcHlQcm9wcyhfX2RlZlByb3Aoe30sIFwiX19lc01vZHVsZVwiLCB7IHZhbHVlOiB0cnVlIH0pLCBtb2QpO1xuXG4vLyBwa2cvZGlzdC1zcmMvaW5kZXguanNcbnZhciBkaXN0X3NyY19leHBvcnRzID0ge307XG5fX2V4cG9ydChkaXN0X3NyY19leHBvcnRzLCB7XG4gIEdyYXBocWxSZXNwb25zZUVycm9yOiAoKSA9PiBHcmFwaHFsUmVzcG9uc2VFcnJvcixcbiAgZ3JhcGhxbDogKCkgPT4gZ3JhcGhxbDIsXG4gIHdpdGhDdXN0b21SZXF1ZXN0OiAoKSA9PiB3aXRoQ3VzdG9tUmVxdWVzdFxufSk7XG5tb2R1bGUuZXhwb3J0cyA9IF9fdG9Db21tb25KUyhkaXN0X3NyY19leHBvcnRzKTtcbnZhciBpbXBvcnRfcmVxdWVzdDMgPSByZXF1aXJlKFwiQG9jdG9raXQvcmVxdWVzdFwiKTtcbnZhciBpbXBvcnRfdW5pdmVyc2FsX3VzZXJfYWdlbnQgPSByZXF1aXJlKFwidW5pdmVyc2FsLXVzZXItYWdlbnRcIik7XG5cbi8vIHBrZy9kaXN0LXNyYy92ZXJzaW9uLmpzXG52YXIgVkVSU0lPTiA9IFwiNy4xLjBcIjtcblxuLy8gcGtnL2Rpc3Qtc3JjL3dpdGgtZGVmYXVsdHMuanNcbnZhciBpbXBvcnRfcmVxdWVzdDIgPSByZXF1aXJlKFwiQG9jdG9raXQvcmVxdWVzdFwiKTtcblxuLy8gcGtnL2Rpc3Qtc3JjL2dyYXBocWwuanNcbnZhciBpbXBvcnRfcmVxdWVzdCA9IHJlcXVpcmUoXCJAb2N0b2tpdC9yZXF1ZXN0XCIpO1xuXG4vLyBwa2cvZGlzdC1zcmMvZXJyb3IuanNcbmZ1bmN0aW9uIF9idWlsZE1lc3NhZ2VGb3JSZXNwb25zZUVycm9ycyhkYXRhKSB7XG4gIHJldHVybiBgUmVxdWVzdCBmYWlsZWQgZHVlIHRvIGZvbGxvd2luZyByZXNwb25zZSBlcnJvcnM6XG5gICsgZGF0YS5lcnJvcnMubWFwKChlKSA9PiBgIC0gJHtlLm1lc3NhZ2V9YCkuam9pbihcIlxcblwiKTtcbn1cbnZhciBHcmFwaHFsUmVzcG9uc2VFcnJvciA9IGNsYXNzIGV4dGVuZHMgRXJyb3Ige1xuICBjb25zdHJ1Y3RvcihyZXF1ZXN0MiwgaGVhZGVycywgcmVzcG9uc2UpIHtcbiAgICBzdXBlcihfYnVpbGRNZXNzYWdlRm9yUmVzcG9uc2VFcnJvcnMocmVzcG9uc2UpKTtcbiAgICB0aGlzLnJlcXVlc3QgPSByZXF1ZXN0MjtcbiAgICB0aGlzLmhlYWRlcnMgPSBoZWFkZXJzO1xuICAgIHRoaXMucmVzcG9uc2UgPSByZXNwb25zZTtcbiAgICB0aGlzLm5hbWUgPSBcIkdyYXBocWxSZXNwb25zZUVycm9yXCI7XG4gICAgdGhpcy5lcnJvcnMgPSByZXNwb25zZS5lcnJvcnM7XG4gICAgdGhpcy5kYXRhID0gcmVzcG9uc2UuZGF0YTtcbiAgICBpZiAoRXJyb3IuY2FwdHVyZVN0YWNrVHJhY2UpIHtcbiAgICAgIEVycm9yLmNhcHR1cmVTdGFja1RyYWNlKHRoaXMsIHRoaXMuY29uc3RydWN0b3IpO1xuICAgIH1cbiAgfVxufTtcblxuLy8gcGtnL2Rpc3Qtc3JjL2dyYXBocWwuanNcbnZhciBOT05fVkFSSUFCTEVfT1BUSU9OUyA9IFtcbiAgXCJtZXRob2RcIixcbiAgXCJiYXNlVXJsXCIsXG4gIFwidXJsXCIsXG4gIFwiaGVhZGVyc1wiLFxuICBcInJlcXVlc3RcIixcbiAgXCJxdWVyeVwiLFxuICBcIm1lZGlhVHlwZVwiXG5dO1xudmFyIEZPUkJJRERFTl9WQVJJQUJMRV9PUFRJT05TID0gW1wicXVlcnlcIiwgXCJtZXRob2RcIiwgXCJ1cmxcIl07XG52YXIgR0hFU19WM19TVUZGSVhfUkVHRVggPSAvXFwvYXBpXFwvdjNcXC8/JC87XG5mdW5jdGlvbiBncmFwaHFsKHJlcXVlc3QyLCBxdWVyeSwgb3B0aW9ucykge1xuICBpZiAob3B0aW9ucykge1xuICAgIGlmICh0eXBlb2YgcXVlcnkgPT09IFwic3RyaW5nXCIgJiYgXCJxdWVyeVwiIGluIG9wdGlvbnMpIHtcbiAgICAgIHJldHVybiBQcm9taXNlLnJlamVjdChcbiAgICAgICAgbmV3IEVycm9yKGBbQG9jdG9raXQvZ3JhcGhxbF0gXCJxdWVyeVwiIGNhbm5vdCBiZSB1c2VkIGFzIHZhcmlhYmxlIG5hbWVgKVxuICAgICAgKTtcbiAgICB9XG4gICAgZm9yIChjb25zdCBrZXkgaW4gb3B0aW9ucykge1xuICAgICAgaWYgKCFGT1JCSURERU5fVkFSSUFCTEVfT1BUSU9OUy5pbmNsdWRlcyhrZXkpKVxuICAgICAgICBjb250aW51ZTtcbiAgICAgIHJldHVybiBQcm9taXNlLnJlamVjdChcbiAgICAgICAgbmV3IEVycm9yKFxuICAgICAgICAgIGBbQG9jdG9raXQvZ3JhcGhxbF0gXCIke2tleX1cIiBjYW5ub3QgYmUgdXNlZCBhcyB2YXJpYWJsZSBuYW1lYFxuICAgICAgICApXG4gICAgICApO1xuICAgIH1cbiAgfVxuICBjb25zdCBwYXJzZWRPcHRpb25zID0gdHlwZW9mIHF1ZXJ5ID09PSBcInN0cmluZ1wiID8gT2JqZWN0LmFzc2lnbih7IHF1ZXJ5IH0sIG9wdGlvbnMpIDogcXVlcnk7XG4gIGNvbnN0IHJlcXVlc3RPcHRpb25zID0gT2JqZWN0LmtleXMoXG4gICAgcGFyc2VkT3B0aW9uc1xuICApLnJlZHVjZSgocmVzdWx0LCBrZXkpID0+IHtcbiAgICBpZiAoTk9OX1ZBUklBQkxFX09QVElPTlMuaW5jbHVkZXMoa2V5KSkge1xuICAgICAgcmVzdWx0W2tleV0gPSBwYXJzZWRPcHRpb25zW2tleV07XG4gICAgICByZXR1cm4gcmVzdWx0O1xuICAgIH1cbiAgICBpZiAoIXJlc3VsdC52YXJpYWJsZXMpIHtcbiAgICAgIHJlc3VsdC52YXJpYWJsZXMgPSB7fTtcbiAgICB9XG4gICAgcmVzdWx0LnZhcmlhYmxlc1trZXldID0gcGFyc2VkT3B0aW9uc1trZXldO1xuICAgIHJldHVybiByZXN1bHQ7XG4gIH0sIHt9KTtcbiAgY29uc3QgYmFzZVVybCA9IHBhcnNlZE9wdGlvbnMuYmFzZVVybCB8fCByZXF1ZXN0Mi5lbmRwb2ludC5ERUZBVUxUUy5iYXNlVXJsO1xuICBpZiAoR0hFU19WM19TVUZGSVhfUkVHRVgudGVzdChiYXNlVXJsKSkge1xuICAgIHJlcXVlc3RPcHRpb25zLnVybCA9IGJhc2VVcmwucmVwbGFjZShHSEVTX1YzX1NVRkZJWF9SRUdFWCwgXCIvYXBpL2dyYXBocWxcIik7XG4gIH1cbiAgcmV0dXJuIHJlcXVlc3QyKHJlcXVlc3RPcHRpb25zKS50aGVuKChyZXNwb25zZSkgPT4ge1xuICAgIGlmIChyZXNwb25zZS5kYXRhLmVycm9ycykge1xuICAgICAgY29uc3QgaGVhZGVycyA9IHt9O1xuICAgICAgZm9yIChjb25zdCBrZXkgb2YgT2JqZWN0LmtleXMocmVzcG9uc2UuaGVhZGVycykpIHtcbiAgICAgICAgaGVhZGVyc1trZXldID0gcmVzcG9uc2UuaGVhZGVyc1trZXldO1xuICAgICAgfVxuICAgICAgdGhyb3cgbmV3IEdyYXBocWxSZXNwb25zZUVycm9yKFxuICAgICAgICByZXF1ZXN0T3B0aW9ucyxcbiAgICAgICAgaGVhZGVycyxcbiAgICAgICAgcmVzcG9uc2UuZGF0YVxuICAgICAgKTtcbiAgICB9XG4gICAgcmV0dXJuIHJlc3BvbnNlLmRhdGEuZGF0YTtcbiAgfSk7XG59XG5cbi8vIHBrZy9kaXN0LXNyYy93aXRoLWRlZmF1bHRzLmpzXG5mdW5jdGlvbiB3aXRoRGVmYXVsdHMocmVxdWVzdDIsIG5ld0RlZmF1bHRzKSB7XG4gIGNvbnN0IG5ld1JlcXVlc3QgPSByZXF1ZXN0Mi5kZWZhdWx0cyhuZXdEZWZhdWx0cyk7XG4gIGNvbnN0IG5ld0FwaSA9IChxdWVyeSwgb3B0aW9ucykgPT4ge1xuICAgIHJldHVybiBncmFwaHFsKG5ld1JlcXVlc3QsIHF1ZXJ5LCBvcHRpb25zKTtcbiAgfTtcbiAgcmV0dXJuIE9iamVjdC5hc3NpZ24obmV3QXBpLCB7XG4gICAgZGVmYXVsdHM6IHdpdGhEZWZhdWx0cy5iaW5kKG51bGwsIG5ld1JlcXVlc3QpLFxuICAgIGVuZHBvaW50OiBuZXdSZXF1ZXN0LmVuZHBvaW50XG4gIH0pO1xufVxuXG4vLyBwa2cvZGlzdC1zcmMvaW5kZXguanNcbnZhciBncmFwaHFsMiA9IHdpdGhEZWZhdWx0cyhpbXBvcnRfcmVxdWVzdDMucmVxdWVzdCwge1xuICBoZWFkZXJzOiB7XG4gICAgXCJ1c2VyLWFnZW50XCI6IGBvY3Rva2l0LWdyYXBocWwuanMvJHtWRVJTSU9OfSAkeygwLCBpbXBvcnRfdW5pdmVyc2FsX3VzZXJfYWdlbnQuZ2V0VXNlckFnZW50KSgpfWBcbiAgfSxcbiAgbWV0aG9kOiBcIlBPU1RcIixcbiAgdXJsOiBcIi9ncmFwaHFsXCJcbn0pO1xuZnVuY3Rpb24gd2l0aEN1c3RvbVJlcXVlc3QoY3VzdG9tUmVxdWVzdCkge1xuICByZXR1cm4gd2l0aERlZmF1bHRzKGN1c3RvbVJlcXVlc3QsIHtcbiAgICBtZXRob2Q6IFwiUE9TVFwiLFxuICAgIHVybDogXCIvZ3JhcGhxbFwiXG4gIH0pO1xufVxuLy8gQW5ub3RhdGUgdGhlIENvbW1vbkpTIGV4cG9ydCBuYW1lcyBmb3IgRVNNIGltcG9ydCBpbiBub2RlOlxuMCAmJiAobW9kdWxlLmV4cG9ydHMgPSB7XG4gIEdyYXBocWxSZXNwb25zZUVycm9yLFxuICBncmFwaHFsLFxuICB3aXRoQ3VzdG9tUmVxdWVzdFxufSk7XG4iLAogICAgIlwidXNlIHN0cmljdFwiO1xudmFyIF9fZGVmUHJvcCA9IE9iamVjdC5kZWZpbmVQcm9wZXJ0eTtcbnZhciBfX2dldE93blByb3BEZXNjID0gT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcjtcbnZhciBfX2dldE93blByb3BOYW1lcyA9IE9iamVjdC5nZXRPd25Qcm9wZXJ0eU5hbWVzO1xudmFyIF9faGFzT3duUHJvcCA9IE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHk7XG52YXIgX19leHBvcnQgPSAodGFyZ2V0LCBhbGwpID0+IHtcbiAgZm9yICh2YXIgbmFtZSBpbiBhbGwpXG4gICAgX19kZWZQcm9wKHRhcmdldCwgbmFtZSwgeyBnZXQ6IGFsbFtuYW1lXSwgZW51bWVyYWJsZTogdHJ1ZSB9KTtcbn07XG52YXIgX19jb3B5UHJvcHMgPSAodG8sIGZyb20sIGV4Y2VwdCwgZGVzYykgPT4ge1xuICBpZiAoZnJvbSAmJiB0eXBlb2YgZnJvbSA9PT0gXCJvYmplY3RcIiB8fCB0eXBlb2YgZnJvbSA9PT0gXCJmdW5jdGlvblwiKSB7XG4gICAgZm9yIChsZXQga2V5IG9mIF9fZ2V0T3duUHJvcE5hbWVzKGZyb20pKVxuICAgICAgaWYgKCFfX2hhc093blByb3AuY2FsbCh0bywga2V5KSAmJiBrZXkgIT09IGV4Y2VwdClcbiAgICAgICAgX19kZWZQcm9wKHRvLCBrZXksIHsgZ2V0OiAoKSA9PiBmcm9tW2tleV0sIGVudW1lcmFibGU6ICEoZGVzYyA9IF9fZ2V0T3duUHJvcERlc2MoZnJvbSwga2V5KSkgfHwgZGVzYy5lbnVtZXJhYmxlIH0pO1xuICB9XG4gIHJldHVybiB0bztcbn07XG52YXIgX190b0NvbW1vbkpTID0gKG1vZCkgPT4gX19jb3B5UHJvcHMoX19kZWZQcm9wKHt9LCBcIl9fZXNNb2R1bGVcIiwgeyB2YWx1ZTogdHJ1ZSB9KSwgbW9kKTtcblxuLy8gcGtnL2Rpc3Qtc3JjL2luZGV4LmpzXG52YXIgZGlzdF9zcmNfZXhwb3J0cyA9IHt9O1xuX19leHBvcnQoZGlzdF9zcmNfZXhwb3J0cywge1xuICBjcmVhdGVUb2tlbkF1dGg6ICgpID0+IGNyZWF0ZVRva2VuQXV0aFxufSk7XG5tb2R1bGUuZXhwb3J0cyA9IF9fdG9Db21tb25KUyhkaXN0X3NyY19leHBvcnRzKTtcblxuLy8gcGtnL2Rpc3Qtc3JjL2F1dGguanNcbnZhciBSRUdFWF9JU19JTlNUQUxMQVRJT05fTEVHQUNZID0gL152MVxcLi87XG52YXIgUkVHRVhfSVNfSU5TVEFMTEFUSU9OID0gL15naHNfLztcbnZhciBSRUdFWF9JU19VU0VSX1RPX1NFUlZFUiA9IC9eZ2h1Xy87XG5hc3luYyBmdW5jdGlvbiBhdXRoKHRva2VuKSB7XG4gIGNvbnN0IGlzQXBwID0gdG9rZW4uc3BsaXQoL1xcLi8pLmxlbmd0aCA9PT0gMztcbiAgY29uc3QgaXNJbnN0YWxsYXRpb24gPSBSRUdFWF9JU19JTlNUQUxMQVRJT05fTEVHQUNZLnRlc3QodG9rZW4pIHx8IFJFR0VYX0lTX0lOU1RBTExBVElPTi50ZXN0KHRva2VuKTtcbiAgY29uc3QgaXNVc2VyVG9TZXJ2ZXIgPSBSRUdFWF9JU19VU0VSX1RPX1NFUlZFUi50ZXN0KHRva2VuKTtcbiAgY29uc3QgdG9rZW5UeXBlID0gaXNBcHAgPyBcImFwcFwiIDogaXNJbnN0YWxsYXRpb24gPyBcImluc3RhbGxhdGlvblwiIDogaXNVc2VyVG9TZXJ2ZXIgPyBcInVzZXItdG8tc2VydmVyXCIgOiBcIm9hdXRoXCI7XG4gIHJldHVybiB7XG4gICAgdHlwZTogXCJ0b2tlblwiLFxuICAgIHRva2VuLFxuICAgIHRva2VuVHlwZVxuICB9O1xufVxuXG4vLyBwa2cvZGlzdC1zcmMvd2l0aC1hdXRob3JpemF0aW9uLXByZWZpeC5qc1xuZnVuY3Rpb24gd2l0aEF1dGhvcml6YXRpb25QcmVmaXgodG9rZW4pIHtcbiAgaWYgKHRva2VuLnNwbGl0KC9cXC4vKS5sZW5ndGggPT09IDMpIHtcbiAgICByZXR1cm4gYGJlYXJlciAke3Rva2VufWA7XG4gIH1cbiAgcmV0dXJuIGB0b2tlbiAke3Rva2VufWA7XG59XG5cbi8vIHBrZy9kaXN0LXNyYy9ob29rLmpzXG5hc3luYyBmdW5jdGlvbiBob29rKHRva2VuLCByZXF1ZXN0LCByb3V0ZSwgcGFyYW1ldGVycykge1xuICBjb25zdCBlbmRwb2ludCA9IHJlcXVlc3QuZW5kcG9pbnQubWVyZ2UoXG4gICAgcm91dGUsXG4gICAgcGFyYW1ldGVyc1xuICApO1xuICBlbmRwb2ludC5oZWFkZXJzLmF1dGhvcml6YXRpb24gPSB3aXRoQXV0aG9yaXphdGlvblByZWZpeCh0b2tlbik7XG4gIHJldHVybiByZXF1ZXN0KGVuZHBvaW50KTtcbn1cblxuLy8gcGtnL2Rpc3Qtc3JjL2luZGV4LmpzXG52YXIgY3JlYXRlVG9rZW5BdXRoID0gZnVuY3Rpb24gY3JlYXRlVG9rZW5BdXRoMih0b2tlbikge1xuICBpZiAoIXRva2VuKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKFwiW0BvY3Rva2l0L2F1dGgtdG9rZW5dIE5vIHRva2VuIHBhc3NlZCB0byBjcmVhdGVUb2tlbkF1dGhcIik7XG4gIH1cbiAgaWYgKHR5cGVvZiB0b2tlbiAhPT0gXCJzdHJpbmdcIikge1xuICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgIFwiW0BvY3Rva2l0L2F1dGgtdG9rZW5dIFRva2VuIHBhc3NlZCB0byBjcmVhdGVUb2tlbkF1dGggaXMgbm90IGEgc3RyaW5nXCJcbiAgICApO1xuICB9XG4gIHRva2VuID0gdG9rZW4ucmVwbGFjZSgvXih0b2tlbnxiZWFyZXIpICsvaSwgXCJcIik7XG4gIHJldHVybiBPYmplY3QuYXNzaWduKGF1dGguYmluZChudWxsLCB0b2tlbiksIHtcbiAgICBob29rOiBob29rLmJpbmQobnVsbCwgdG9rZW4pXG4gIH0pO1xufTtcbi8vIEFubm90YXRlIHRoZSBDb21tb25KUyBleHBvcnQgbmFtZXMgZm9yIEVTTSBpbXBvcnQgaW4gbm9kZTpcbjAgJiYgKG1vZHVsZS5leHBvcnRzID0ge1xuICBjcmVhdGVUb2tlbkF1dGhcbn0pO1xuIiwKICAgICJcInVzZSBzdHJpY3RcIjtcbnZhciBfX2RlZlByb3AgPSBPYmplY3QuZGVmaW5lUHJvcGVydHk7XG52YXIgX19nZXRPd25Qcm9wRGVzYyA9IE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3I7XG52YXIgX19nZXRPd25Qcm9wTmFtZXMgPSBPYmplY3QuZ2V0T3duUHJvcGVydHlOYW1lcztcbnZhciBfX2hhc093blByb3AgPSBPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5O1xudmFyIF9fZXhwb3J0ID0gKHRhcmdldCwgYWxsKSA9PiB7XG4gIGZvciAodmFyIG5hbWUgaW4gYWxsKVxuICAgIF9fZGVmUHJvcCh0YXJnZXQsIG5hbWUsIHsgZ2V0OiBhbGxbbmFtZV0sIGVudW1lcmFibGU6IHRydWUgfSk7XG59O1xudmFyIF9fY29weVByb3BzID0gKHRvLCBmcm9tLCBleGNlcHQsIGRlc2MpID0+IHtcbiAgaWYgKGZyb20gJiYgdHlwZW9mIGZyb20gPT09IFwib2JqZWN0XCIgfHwgdHlwZW9mIGZyb20gPT09IFwiZnVuY3Rpb25cIikge1xuICAgIGZvciAobGV0IGtleSBvZiBfX2dldE93blByb3BOYW1lcyhmcm9tKSlcbiAgICAgIGlmICghX19oYXNPd25Qcm9wLmNhbGwodG8sIGtleSkgJiYga2V5ICE9PSBleGNlcHQpXG4gICAgICAgIF9fZGVmUHJvcCh0bywga2V5LCB7IGdldDogKCkgPT4gZnJvbVtrZXldLCBlbnVtZXJhYmxlOiAhKGRlc2MgPSBfX2dldE93blByb3BEZXNjKGZyb20sIGtleSkpIHx8IGRlc2MuZW51bWVyYWJsZSB9KTtcbiAgfVxuICByZXR1cm4gdG87XG59O1xudmFyIF9fdG9Db21tb25KUyA9IChtb2QpID0+IF9fY29weVByb3BzKF9fZGVmUHJvcCh7fSwgXCJfX2VzTW9kdWxlXCIsIHsgdmFsdWU6IHRydWUgfSksIG1vZCk7XG5cbi8vIHBrZy9kaXN0LXNyYy9pbmRleC5qc1xudmFyIGRpc3Rfc3JjX2V4cG9ydHMgPSB7fTtcbl9fZXhwb3J0KGRpc3Rfc3JjX2V4cG9ydHMsIHtcbiAgT2N0b2tpdDogKCkgPT4gT2N0b2tpdFxufSk7XG5tb2R1bGUuZXhwb3J0cyA9IF9fdG9Db21tb25KUyhkaXN0X3NyY19leHBvcnRzKTtcbnZhciBpbXBvcnRfdW5pdmVyc2FsX3VzZXJfYWdlbnQgPSByZXF1aXJlKFwidW5pdmVyc2FsLXVzZXItYWdlbnRcIik7XG52YXIgaW1wb3J0X2JlZm9yZV9hZnRlcl9ob29rID0gcmVxdWlyZShcImJlZm9yZS1hZnRlci1ob29rXCIpO1xudmFyIGltcG9ydF9yZXF1ZXN0ID0gcmVxdWlyZShcIkBvY3Rva2l0L3JlcXVlc3RcIik7XG52YXIgaW1wb3J0X2dyYXBocWwgPSByZXF1aXJlKFwiQG9jdG9raXQvZ3JhcGhxbFwiKTtcbnZhciBpbXBvcnRfYXV0aF90b2tlbiA9IHJlcXVpcmUoXCJAb2N0b2tpdC9hdXRoLXRva2VuXCIpO1xuXG4vLyBwa2cvZGlzdC1zcmMvdmVyc2lvbi5qc1xudmFyIFZFUlNJT04gPSBcIjUuMi4wXCI7XG5cbi8vIHBrZy9kaXN0LXNyYy9pbmRleC5qc1xudmFyIG5vb3AgPSAoKSA9PiB7XG59O1xudmFyIGNvbnNvbGVXYXJuID0gY29uc29sZS53YXJuLmJpbmQoY29uc29sZSk7XG52YXIgY29uc29sZUVycm9yID0gY29uc29sZS5lcnJvci5iaW5kKGNvbnNvbGUpO1xudmFyIHVzZXJBZ2VudFRyYWlsID0gYG9jdG9raXQtY29yZS5qcy8ke1ZFUlNJT059ICR7KDAsIGltcG9ydF91bml2ZXJzYWxfdXNlcl9hZ2VudC5nZXRVc2VyQWdlbnQpKCl9YDtcbnZhciBPY3Rva2l0ID0gY2xhc3Mge1xuICBzdGF0aWMge1xuICAgIHRoaXMuVkVSU0lPTiA9IFZFUlNJT047XG4gIH1cbiAgc3RhdGljIGRlZmF1bHRzKGRlZmF1bHRzKSB7XG4gICAgY29uc3QgT2N0b2tpdFdpdGhEZWZhdWx0cyA9IGNsYXNzIGV4dGVuZHMgdGhpcyB7XG4gICAgICBjb25zdHJ1Y3RvciguLi5hcmdzKSB7XG4gICAgICAgIGNvbnN0IG9wdGlvbnMgPSBhcmdzWzBdIHx8IHt9O1xuICAgICAgICBpZiAodHlwZW9mIGRlZmF1bHRzID09PSBcImZ1bmN0aW9uXCIpIHtcbiAgICAgICAgICBzdXBlcihkZWZhdWx0cyhvcHRpb25zKSk7XG4gICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIHN1cGVyKFxuICAgICAgICAgIE9iamVjdC5hc3NpZ24oXG4gICAgICAgICAgICB7fSxcbiAgICAgICAgICAgIGRlZmF1bHRzLFxuICAgICAgICAgICAgb3B0aW9ucyxcbiAgICAgICAgICAgIG9wdGlvbnMudXNlckFnZW50ICYmIGRlZmF1bHRzLnVzZXJBZ2VudCA/IHtcbiAgICAgICAgICAgICAgdXNlckFnZW50OiBgJHtvcHRpb25zLnVzZXJBZ2VudH0gJHtkZWZhdWx0cy51c2VyQWdlbnR9YFxuICAgICAgICAgICAgfSA6IG51bGxcbiAgICAgICAgICApXG4gICAgICAgICk7XG4gICAgICB9XG4gICAgfTtcbiAgICByZXR1cm4gT2N0b2tpdFdpdGhEZWZhdWx0cztcbiAgfVxuICBzdGF0aWMge1xuICAgIHRoaXMucGx1Z2lucyA9IFtdO1xuICB9XG4gIC8qKlxuICAgKiBBdHRhY2ggYSBwbHVnaW4gKG9yIG1hbnkpIHRvIHlvdXIgT2N0b2tpdCBpbnN0YW5jZS5cbiAgICpcbiAgICogQGV4YW1wbGVcbiAgICogY29uc3QgQVBJID0gT2N0b2tpdC5wbHVnaW4ocGx1Z2luMSwgcGx1Z2luMiwgcGx1Z2luMywgLi4uKVxuICAgKi9cbiAgc3RhdGljIHBsdWdpbiguLi5uZXdQbHVnaW5zKSB7XG4gICAgY29uc3QgY3VycmVudFBsdWdpbnMgPSB0aGlzLnBsdWdpbnM7XG4gICAgY29uc3QgTmV3T2N0b2tpdCA9IGNsYXNzIGV4dGVuZHMgdGhpcyB7XG4gICAgICBzdGF0aWMge1xuICAgICAgICB0aGlzLnBsdWdpbnMgPSBjdXJyZW50UGx1Z2lucy5jb25jYXQoXG4gICAgICAgICAgbmV3UGx1Z2lucy5maWx0ZXIoKHBsdWdpbikgPT4gIWN1cnJlbnRQbHVnaW5zLmluY2x1ZGVzKHBsdWdpbikpXG4gICAgICAgICk7XG4gICAgICB9XG4gICAgfTtcbiAgICByZXR1cm4gTmV3T2N0b2tpdDtcbiAgfVxuICBjb25zdHJ1Y3RvcihvcHRpb25zID0ge30pIHtcbiAgICBjb25zdCBob29rID0gbmV3IGltcG9ydF9iZWZvcmVfYWZ0ZXJfaG9vay5Db2xsZWN0aW9uKCk7XG4gICAgY29uc3QgcmVxdWVzdERlZmF1bHRzID0ge1xuICAgICAgYmFzZVVybDogaW1wb3J0X3JlcXVlc3QucmVxdWVzdC5lbmRwb2ludC5ERUZBVUxUUy5iYXNlVXJsLFxuICAgICAgaGVhZGVyczoge30sXG4gICAgICByZXF1ZXN0OiBPYmplY3QuYXNzaWduKHt9LCBvcHRpb25zLnJlcXVlc3QsIHtcbiAgICAgICAgLy8gQHRzLWlnbm9yZSBpbnRlcm5hbCB1c2FnZSBvbmx5LCBubyBuZWVkIHRvIHR5cGVcbiAgICAgICAgaG9vazogaG9vay5iaW5kKG51bGwsIFwicmVxdWVzdFwiKVxuICAgICAgfSksXG4gICAgICBtZWRpYVR5cGU6IHtcbiAgICAgICAgcHJldmlld3M6IFtdLFxuICAgICAgICBmb3JtYXQ6IFwiXCJcbiAgICAgIH1cbiAgICB9O1xuICAgIHJlcXVlc3REZWZhdWx0cy5oZWFkZXJzW1widXNlci1hZ2VudFwiXSA9IG9wdGlvbnMudXNlckFnZW50ID8gYCR7b3B0aW9ucy51c2VyQWdlbnR9ICR7dXNlckFnZW50VHJhaWx9YCA6IHVzZXJBZ2VudFRyYWlsO1xuICAgIGlmIChvcHRpb25zLmJhc2VVcmwpIHtcbiAgICAgIHJlcXVlc3REZWZhdWx0cy5iYXNlVXJsID0gb3B0aW9ucy5iYXNlVXJsO1xuICAgIH1cbiAgICBpZiAob3B0aW9ucy5wcmV2aWV3cykge1xuICAgICAgcmVxdWVzdERlZmF1bHRzLm1lZGlhVHlwZS5wcmV2aWV3cyA9IG9wdGlvbnMucHJldmlld3M7XG4gICAgfVxuICAgIGlmIChvcHRpb25zLnRpbWVab25lKSB7XG4gICAgICByZXF1ZXN0RGVmYXVsdHMuaGVhZGVyc1tcInRpbWUtem9uZVwiXSA9IG9wdGlvbnMudGltZVpvbmU7XG4gICAgfVxuICAgIHRoaXMucmVxdWVzdCA9IGltcG9ydF9yZXF1ZXN0LnJlcXVlc3QuZGVmYXVsdHMocmVxdWVzdERlZmF1bHRzKTtcbiAgICB0aGlzLmdyYXBocWwgPSAoMCwgaW1wb3J0X2dyYXBocWwud2l0aEN1c3RvbVJlcXVlc3QpKHRoaXMucmVxdWVzdCkuZGVmYXVsdHMocmVxdWVzdERlZmF1bHRzKTtcbiAgICB0aGlzLmxvZyA9IE9iamVjdC5hc3NpZ24oXG4gICAgICB7XG4gICAgICAgIGRlYnVnOiBub29wLFxuICAgICAgICBpbmZvOiBub29wLFxuICAgICAgICB3YXJuOiBjb25zb2xlV2FybixcbiAgICAgICAgZXJyb3I6IGNvbnNvbGVFcnJvclxuICAgICAgfSxcbiAgICAgIG9wdGlvbnMubG9nXG4gICAgKTtcbiAgICB0aGlzLmhvb2sgPSBob29rO1xuICAgIGlmICghb3B0aW9ucy5hdXRoU3RyYXRlZ3kpIHtcbiAgICAgIGlmICghb3B0aW9ucy5hdXRoKSB7XG4gICAgICAgIHRoaXMuYXV0aCA9IGFzeW5jICgpID0+ICh7XG4gICAgICAgICAgdHlwZTogXCJ1bmF1dGhlbnRpY2F0ZWRcIlxuICAgICAgICB9KTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGNvbnN0IGF1dGggPSAoMCwgaW1wb3J0X2F1dGhfdG9rZW4uY3JlYXRlVG9rZW5BdXRoKShvcHRpb25zLmF1dGgpO1xuICAgICAgICBob29rLndyYXAoXCJyZXF1ZXN0XCIsIGF1dGguaG9vayk7XG4gICAgICAgIHRoaXMuYXV0aCA9IGF1dGg7XG4gICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgIGNvbnN0IHsgYXV0aFN0cmF0ZWd5LCAuLi5vdGhlck9wdGlvbnMgfSA9IG9wdGlvbnM7XG4gICAgICBjb25zdCBhdXRoID0gYXV0aFN0cmF0ZWd5KFxuICAgICAgICBPYmplY3QuYXNzaWduKFxuICAgICAgICAgIHtcbiAgICAgICAgICAgIHJlcXVlc3Q6IHRoaXMucmVxdWVzdCxcbiAgICAgICAgICAgIGxvZzogdGhpcy5sb2csXG4gICAgICAgICAgICAvLyB3ZSBwYXNzIHRoZSBjdXJyZW50IG9jdG9raXQgaW5zdGFuY2UgYXMgd2VsbCBhcyBpdHMgY29uc3RydWN0b3Igb3B0aW9uc1xuICAgICAgICAgICAgLy8gdG8gYWxsb3cgZm9yIGF1dGhlbnRpY2F0aW9uIHN0cmF0ZWdpZXMgdGhhdCByZXR1cm4gYSBuZXcgb2N0b2tpdCBpbnN0YW5jZVxuICAgICAgICAgICAgLy8gdGhhdCBzaGFyZXMgdGhlIHNhbWUgaW50ZXJuYWwgc3RhdGUgYXMgdGhlIGN1cnJlbnQgb25lLiBUaGUgb3JpZ2luYWxcbiAgICAgICAgICAgIC8vIHJlcXVpcmVtZW50IGZvciB0aGlzIHdhcyB0aGUgXCJldmVudC1vY3Rva2l0XCIgYXV0aGVudGljYXRpb24gc3RyYXRlZ3lcbiAgICAgICAgICAgIC8vIG9mIGh0dHBzOi8vZ2l0aHViLmNvbS9wcm9ib3Qvb2N0b2tpdC1hdXRoLXByb2JvdC5cbiAgICAgICAgICAgIG9jdG9raXQ6IHRoaXMsXG4gICAgICAgICAgICBvY3Rva2l0T3B0aW9uczogb3RoZXJPcHRpb25zXG4gICAgICAgICAgfSxcbiAgICAgICAgICBvcHRpb25zLmF1dGhcbiAgICAgICAgKVxuICAgICAgKTtcbiAgICAgIGhvb2sud3JhcChcInJlcXVlc3RcIiwgYXV0aC5ob29rKTtcbiAgICAgIHRoaXMuYXV0aCA9IGF1dGg7XG4gICAgfVxuICAgIGNvbnN0IGNsYXNzQ29uc3RydWN0b3IgPSB0aGlzLmNvbnN0cnVjdG9yO1xuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgY2xhc3NDb25zdHJ1Y3Rvci5wbHVnaW5zLmxlbmd0aDsgKytpKSB7XG4gICAgICBPYmplY3QuYXNzaWduKHRoaXMsIGNsYXNzQ29uc3RydWN0b3IucGx1Z2luc1tpXSh0aGlzLCBvcHRpb25zKSk7XG4gICAgfVxuICB9XG59O1xuLy8gQW5ub3RhdGUgdGhlIENvbW1vbkpTIGV4cG9ydCBuYW1lcyBmb3IgRVNNIGltcG9ydCBpbiBub2RlOlxuMCAmJiAobW9kdWxlLmV4cG9ydHMgPSB7XG4gIE9jdG9raXRcbn0pO1xuIiwKICAgICJcInVzZSBzdHJpY3RcIjtcbnZhciBfX2RlZlByb3AgPSBPYmplY3QuZGVmaW5lUHJvcGVydHk7XG52YXIgX19nZXRPd25Qcm9wRGVzYyA9IE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3I7XG52YXIgX19nZXRPd25Qcm9wTmFtZXMgPSBPYmplY3QuZ2V0T3duUHJvcGVydHlOYW1lcztcbnZhciBfX2hhc093blByb3AgPSBPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5O1xudmFyIF9fZXhwb3J0ID0gKHRhcmdldCwgYWxsKSA9PiB7XG4gIGZvciAodmFyIG5hbWUgaW4gYWxsKVxuICAgIF9fZGVmUHJvcCh0YXJnZXQsIG5hbWUsIHsgZ2V0OiBhbGxbbmFtZV0sIGVudW1lcmFibGU6IHRydWUgfSk7XG59O1xudmFyIF9fY29weVByb3BzID0gKHRvLCBmcm9tLCBleGNlcHQsIGRlc2MpID0+IHtcbiAgaWYgKGZyb20gJiYgdHlwZW9mIGZyb20gPT09IFwib2JqZWN0XCIgfHwgdHlwZW9mIGZyb20gPT09IFwiZnVuY3Rpb25cIikge1xuICAgIGZvciAobGV0IGtleSBvZiBfX2dldE93blByb3BOYW1lcyhmcm9tKSlcbiAgICAgIGlmICghX19oYXNPd25Qcm9wLmNhbGwodG8sIGtleSkgJiYga2V5ICE9PSBleGNlcHQpXG4gICAgICAgIF9fZGVmUHJvcCh0bywga2V5LCB7IGdldDogKCkgPT4gZnJvbVtrZXldLCBlbnVtZXJhYmxlOiAhKGRlc2MgPSBfX2dldE93blByb3BEZXNjKGZyb20sIGtleSkpIHx8IGRlc2MuZW51bWVyYWJsZSB9KTtcbiAgfVxuICByZXR1cm4gdG87XG59O1xudmFyIF9fdG9Db21tb25KUyA9IChtb2QpID0+IF9fY29weVByb3BzKF9fZGVmUHJvcCh7fSwgXCJfX2VzTW9kdWxlXCIsIHsgdmFsdWU6IHRydWUgfSksIG1vZCk7XG5cbi8vIHBrZy9kaXN0LXNyYy9pbmRleC5qc1xudmFyIGRpc3Rfc3JjX2V4cG9ydHMgPSB7fTtcbl9fZXhwb3J0KGRpc3Rfc3JjX2V4cG9ydHMsIHtcbiAgbGVnYWN5UmVzdEVuZHBvaW50TWV0aG9kczogKCkgPT4gbGVnYWN5UmVzdEVuZHBvaW50TWV0aG9kcyxcbiAgcmVzdEVuZHBvaW50TWV0aG9kczogKCkgPT4gcmVzdEVuZHBvaW50TWV0aG9kc1xufSk7XG5tb2R1bGUuZXhwb3J0cyA9IF9fdG9Db21tb25KUyhkaXN0X3NyY19leHBvcnRzKTtcblxuLy8gcGtnL2Rpc3Qtc3JjL3ZlcnNpb24uanNcbnZhciBWRVJTSU9OID0gXCIxMC40LjFcIjtcblxuLy8gcGtnL2Rpc3Qtc3JjL2dlbmVyYXRlZC9lbmRwb2ludHMuanNcbnZhciBFbmRwb2ludHMgPSB7XG4gIGFjdGlvbnM6IHtcbiAgICBhZGRDdXN0b21MYWJlbHNUb1NlbGZIb3N0ZWRSdW5uZXJGb3JPcmc6IFtcbiAgICAgIFwiUE9TVCAvb3Jncy97b3JnfS9hY3Rpb25zL3J1bm5lcnMve3J1bm5lcl9pZH0vbGFiZWxzXCJcbiAgICBdLFxuICAgIGFkZEN1c3RvbUxhYmVsc1RvU2VsZkhvc3RlZFJ1bm5lckZvclJlcG86IFtcbiAgICAgIFwiUE9TVCAvcmVwb3Mve293bmVyfS97cmVwb30vYWN0aW9ucy9ydW5uZXJzL3tydW5uZXJfaWR9L2xhYmVsc1wiXG4gICAgXSxcbiAgICBhZGRTZWxlY3RlZFJlcG9Ub09yZ1NlY3JldDogW1xuICAgICAgXCJQVVQgL29yZ3Mve29yZ30vYWN0aW9ucy9zZWNyZXRzL3tzZWNyZXRfbmFtZX0vcmVwb3NpdG9yaWVzL3tyZXBvc2l0b3J5X2lkfVwiXG4gICAgXSxcbiAgICBhZGRTZWxlY3RlZFJlcG9Ub09yZ1ZhcmlhYmxlOiBbXG4gICAgICBcIlBVVCAvb3Jncy97b3JnfS9hY3Rpb25zL3ZhcmlhYmxlcy97bmFtZX0vcmVwb3NpdG9yaWVzL3tyZXBvc2l0b3J5X2lkfVwiXG4gICAgXSxcbiAgICBhcHByb3ZlV29ya2Zsb3dSdW46IFtcbiAgICAgIFwiUE9TVCAvcmVwb3Mve293bmVyfS97cmVwb30vYWN0aW9ucy9ydW5zL3tydW5faWR9L2FwcHJvdmVcIlxuICAgIF0sXG4gICAgY2FuY2VsV29ya2Zsb3dSdW46IFtcbiAgICAgIFwiUE9TVCAvcmVwb3Mve293bmVyfS97cmVwb30vYWN0aW9ucy9ydW5zL3tydW5faWR9L2NhbmNlbFwiXG4gICAgXSxcbiAgICBjcmVhdGVFbnZpcm9ubWVudFZhcmlhYmxlOiBbXG4gICAgICBcIlBPU1QgL3JlcG9zaXRvcmllcy97cmVwb3NpdG9yeV9pZH0vZW52aXJvbm1lbnRzL3tlbnZpcm9ubWVudF9uYW1lfS92YXJpYWJsZXNcIlxuICAgIF0sXG4gICAgY3JlYXRlT3JVcGRhdGVFbnZpcm9ubWVudFNlY3JldDogW1xuICAgICAgXCJQVVQgL3JlcG9zaXRvcmllcy97cmVwb3NpdG9yeV9pZH0vZW52aXJvbm1lbnRzL3tlbnZpcm9ubWVudF9uYW1lfS9zZWNyZXRzL3tzZWNyZXRfbmFtZX1cIlxuICAgIF0sXG4gICAgY3JlYXRlT3JVcGRhdGVPcmdTZWNyZXQ6IFtcIlBVVCAvb3Jncy97b3JnfS9hY3Rpb25zL3NlY3JldHMve3NlY3JldF9uYW1lfVwiXSxcbiAgICBjcmVhdGVPclVwZGF0ZVJlcG9TZWNyZXQ6IFtcbiAgICAgIFwiUFVUIC9yZXBvcy97b3duZXJ9L3tyZXBvfS9hY3Rpb25zL3NlY3JldHMve3NlY3JldF9uYW1lfVwiXG4gICAgXSxcbiAgICBjcmVhdGVPcmdWYXJpYWJsZTogW1wiUE9TVCAvb3Jncy97b3JnfS9hY3Rpb25zL3ZhcmlhYmxlc1wiXSxcbiAgICBjcmVhdGVSZWdpc3RyYXRpb25Ub2tlbkZvck9yZzogW1xuICAgICAgXCJQT1NUIC9vcmdzL3tvcmd9L2FjdGlvbnMvcnVubmVycy9yZWdpc3RyYXRpb24tdG9rZW5cIlxuICAgIF0sXG4gICAgY3JlYXRlUmVnaXN0cmF0aW9uVG9rZW5Gb3JSZXBvOiBbXG4gICAgICBcIlBPU1QgL3JlcG9zL3tvd25lcn0ve3JlcG99L2FjdGlvbnMvcnVubmVycy9yZWdpc3RyYXRpb24tdG9rZW5cIlxuICAgIF0sXG4gICAgY3JlYXRlUmVtb3ZlVG9rZW5Gb3JPcmc6IFtcIlBPU1QgL29yZ3Mve29yZ30vYWN0aW9ucy9ydW5uZXJzL3JlbW92ZS10b2tlblwiXSxcbiAgICBjcmVhdGVSZW1vdmVUb2tlbkZvclJlcG86IFtcbiAgICAgIFwiUE9TVCAvcmVwb3Mve293bmVyfS97cmVwb30vYWN0aW9ucy9ydW5uZXJzL3JlbW92ZS10b2tlblwiXG4gICAgXSxcbiAgICBjcmVhdGVSZXBvVmFyaWFibGU6IFtcIlBPU1QgL3JlcG9zL3tvd25lcn0ve3JlcG99L2FjdGlvbnMvdmFyaWFibGVzXCJdLFxuICAgIGNyZWF0ZVdvcmtmbG93RGlzcGF0Y2g6IFtcbiAgICAgIFwiUE9TVCAvcmVwb3Mve293bmVyfS97cmVwb30vYWN0aW9ucy93b3JrZmxvd3Mve3dvcmtmbG93X2lkfS9kaXNwYXRjaGVzXCJcbiAgICBdLFxuICAgIGRlbGV0ZUFjdGlvbnNDYWNoZUJ5SWQ6IFtcbiAgICAgIFwiREVMRVRFIC9yZXBvcy97b3duZXJ9L3tyZXBvfS9hY3Rpb25zL2NhY2hlcy97Y2FjaGVfaWR9XCJcbiAgICBdLFxuICAgIGRlbGV0ZUFjdGlvbnNDYWNoZUJ5S2V5OiBbXG4gICAgICBcIkRFTEVURSAvcmVwb3Mve293bmVyfS97cmVwb30vYWN0aW9ucy9jYWNoZXN7P2tleSxyZWZ9XCJcbiAgICBdLFxuICAgIGRlbGV0ZUFydGlmYWN0OiBbXG4gICAgICBcIkRFTEVURSAvcmVwb3Mve293bmVyfS97cmVwb30vYWN0aW9ucy9hcnRpZmFjdHMve2FydGlmYWN0X2lkfVwiXG4gICAgXSxcbiAgICBkZWxldGVFbnZpcm9ubWVudFNlY3JldDogW1xuICAgICAgXCJERUxFVEUgL3JlcG9zaXRvcmllcy97cmVwb3NpdG9yeV9pZH0vZW52aXJvbm1lbnRzL3tlbnZpcm9ubWVudF9uYW1lfS9zZWNyZXRzL3tzZWNyZXRfbmFtZX1cIlxuICAgIF0sXG4gICAgZGVsZXRlRW52aXJvbm1lbnRWYXJpYWJsZTogW1xuICAgICAgXCJERUxFVEUgL3JlcG9zaXRvcmllcy97cmVwb3NpdG9yeV9pZH0vZW52aXJvbm1lbnRzL3tlbnZpcm9ubWVudF9uYW1lfS92YXJpYWJsZXMve25hbWV9XCJcbiAgICBdLFxuICAgIGRlbGV0ZU9yZ1NlY3JldDogW1wiREVMRVRFIC9vcmdzL3tvcmd9L2FjdGlvbnMvc2VjcmV0cy97c2VjcmV0X25hbWV9XCJdLFxuICAgIGRlbGV0ZU9yZ1ZhcmlhYmxlOiBbXCJERUxFVEUgL29yZ3Mve29yZ30vYWN0aW9ucy92YXJpYWJsZXMve25hbWV9XCJdLFxuICAgIGRlbGV0ZVJlcG9TZWNyZXQ6IFtcbiAgICAgIFwiREVMRVRFIC9yZXBvcy97b3duZXJ9L3tyZXBvfS9hY3Rpb25zL3NlY3JldHMve3NlY3JldF9uYW1lfVwiXG4gICAgXSxcbiAgICBkZWxldGVSZXBvVmFyaWFibGU6IFtcbiAgICAgIFwiREVMRVRFIC9yZXBvcy97b3duZXJ9L3tyZXBvfS9hY3Rpb25zL3ZhcmlhYmxlcy97bmFtZX1cIlxuICAgIF0sXG4gICAgZGVsZXRlU2VsZkhvc3RlZFJ1bm5lckZyb21Pcmc6IFtcbiAgICAgIFwiREVMRVRFIC9vcmdzL3tvcmd9L2FjdGlvbnMvcnVubmVycy97cnVubmVyX2lkfVwiXG4gICAgXSxcbiAgICBkZWxldGVTZWxmSG9zdGVkUnVubmVyRnJvbVJlcG86IFtcbiAgICAgIFwiREVMRVRFIC9yZXBvcy97b3duZXJ9L3tyZXBvfS9hY3Rpb25zL3J1bm5lcnMve3J1bm5lcl9pZH1cIlxuICAgIF0sXG4gICAgZGVsZXRlV29ya2Zsb3dSdW46IFtcIkRFTEVURSAvcmVwb3Mve293bmVyfS97cmVwb30vYWN0aW9ucy9ydW5zL3tydW5faWR9XCJdLFxuICAgIGRlbGV0ZVdvcmtmbG93UnVuTG9nczogW1xuICAgICAgXCJERUxFVEUgL3JlcG9zL3tvd25lcn0ve3JlcG99L2FjdGlvbnMvcnVucy97cnVuX2lkfS9sb2dzXCJcbiAgICBdLFxuICAgIGRpc2FibGVTZWxlY3RlZFJlcG9zaXRvcnlHaXRodWJBY3Rpb25zT3JnYW5pemF0aW9uOiBbXG4gICAgICBcIkRFTEVURSAvb3Jncy97b3JnfS9hY3Rpb25zL3Blcm1pc3Npb25zL3JlcG9zaXRvcmllcy97cmVwb3NpdG9yeV9pZH1cIlxuICAgIF0sXG4gICAgZGlzYWJsZVdvcmtmbG93OiBbXG4gICAgICBcIlBVVCAvcmVwb3Mve293bmVyfS97cmVwb30vYWN0aW9ucy93b3JrZmxvd3Mve3dvcmtmbG93X2lkfS9kaXNhYmxlXCJcbiAgICBdLFxuICAgIGRvd25sb2FkQXJ0aWZhY3Q6IFtcbiAgICAgIFwiR0VUIC9yZXBvcy97b3duZXJ9L3tyZXBvfS9hY3Rpb25zL2FydGlmYWN0cy97YXJ0aWZhY3RfaWR9L3thcmNoaXZlX2Zvcm1hdH1cIlxuICAgIF0sXG4gICAgZG93bmxvYWRKb2JMb2dzRm9yV29ya2Zsb3dSdW46IFtcbiAgICAgIFwiR0VUIC9yZXBvcy97b3duZXJ9L3tyZXBvfS9hY3Rpb25zL2pvYnMve2pvYl9pZH0vbG9nc1wiXG4gICAgXSxcbiAgICBkb3dubG9hZFdvcmtmbG93UnVuQXR0ZW1wdExvZ3M6IFtcbiAgICAgIFwiR0VUIC9yZXBvcy97b3duZXJ9L3tyZXBvfS9hY3Rpb25zL3J1bnMve3J1bl9pZH0vYXR0ZW1wdHMve2F0dGVtcHRfbnVtYmVyfS9sb2dzXCJcbiAgICBdLFxuICAgIGRvd25sb2FkV29ya2Zsb3dSdW5Mb2dzOiBbXG4gICAgICBcIkdFVCAvcmVwb3Mve293bmVyfS97cmVwb30vYWN0aW9ucy9ydW5zL3tydW5faWR9L2xvZ3NcIlxuICAgIF0sXG4gICAgZW5hYmxlU2VsZWN0ZWRSZXBvc2l0b3J5R2l0aHViQWN0aW9uc09yZ2FuaXphdGlvbjogW1xuICAgICAgXCJQVVQgL29yZ3Mve29yZ30vYWN0aW9ucy9wZXJtaXNzaW9ucy9yZXBvc2l0b3JpZXMve3JlcG9zaXRvcnlfaWR9XCJcbiAgICBdLFxuICAgIGVuYWJsZVdvcmtmbG93OiBbXG4gICAgICBcIlBVVCAvcmVwb3Mve293bmVyfS97cmVwb30vYWN0aW9ucy93b3JrZmxvd3Mve3dvcmtmbG93X2lkfS9lbmFibGVcIlxuICAgIF0sXG4gICAgZm9yY2VDYW5jZWxXb3JrZmxvd1J1bjogW1xuICAgICAgXCJQT1NUIC9yZXBvcy97b3duZXJ9L3tyZXBvfS9hY3Rpb25zL3J1bnMve3J1bl9pZH0vZm9yY2UtY2FuY2VsXCJcbiAgICBdLFxuICAgIGdlbmVyYXRlUnVubmVySml0Y29uZmlnRm9yT3JnOiBbXG4gICAgICBcIlBPU1QgL29yZ3Mve29yZ30vYWN0aW9ucy9ydW5uZXJzL2dlbmVyYXRlLWppdGNvbmZpZ1wiXG4gICAgXSxcbiAgICBnZW5lcmF0ZVJ1bm5lckppdGNvbmZpZ0ZvclJlcG86IFtcbiAgICAgIFwiUE9TVCAvcmVwb3Mve293bmVyfS97cmVwb30vYWN0aW9ucy9ydW5uZXJzL2dlbmVyYXRlLWppdGNvbmZpZ1wiXG4gICAgXSxcbiAgICBnZXRBY3Rpb25zQ2FjaGVMaXN0OiBbXCJHRVQgL3JlcG9zL3tvd25lcn0ve3JlcG99L2FjdGlvbnMvY2FjaGVzXCJdLFxuICAgIGdldEFjdGlvbnNDYWNoZVVzYWdlOiBbXCJHRVQgL3JlcG9zL3tvd25lcn0ve3JlcG99L2FjdGlvbnMvY2FjaGUvdXNhZ2VcIl0sXG4gICAgZ2V0QWN0aW9uc0NhY2hlVXNhZ2VCeVJlcG9Gb3JPcmc6IFtcbiAgICAgIFwiR0VUIC9vcmdzL3tvcmd9L2FjdGlvbnMvY2FjaGUvdXNhZ2UtYnktcmVwb3NpdG9yeVwiXG4gICAgXSxcbiAgICBnZXRBY3Rpb25zQ2FjaGVVc2FnZUZvck9yZzogW1wiR0VUIC9vcmdzL3tvcmd9L2FjdGlvbnMvY2FjaGUvdXNhZ2VcIl0sXG4gICAgZ2V0QWxsb3dlZEFjdGlvbnNPcmdhbml6YXRpb246IFtcbiAgICAgIFwiR0VUIC9vcmdzL3tvcmd9L2FjdGlvbnMvcGVybWlzc2lvbnMvc2VsZWN0ZWQtYWN0aW9uc1wiXG4gICAgXSxcbiAgICBnZXRBbGxvd2VkQWN0aW9uc1JlcG9zaXRvcnk6IFtcbiAgICAgIFwiR0VUIC9yZXBvcy97b3duZXJ9L3tyZXBvfS9hY3Rpb25zL3Blcm1pc3Npb25zL3NlbGVjdGVkLWFjdGlvbnNcIlxuICAgIF0sXG4gICAgZ2V0QXJ0aWZhY3Q6IFtcIkdFVCAvcmVwb3Mve293bmVyfS97cmVwb30vYWN0aW9ucy9hcnRpZmFjdHMve2FydGlmYWN0X2lkfVwiXSxcbiAgICBnZXRDdXN0b21PaWRjU3ViQ2xhaW1Gb3JSZXBvOiBbXG4gICAgICBcIkdFVCAvcmVwb3Mve293bmVyfS97cmVwb30vYWN0aW9ucy9vaWRjL2N1c3RvbWl6YXRpb24vc3ViXCJcbiAgICBdLFxuICAgIGdldEVudmlyb25tZW50UHVibGljS2V5OiBbXG4gICAgICBcIkdFVCAvcmVwb3NpdG9yaWVzL3tyZXBvc2l0b3J5X2lkfS9lbnZpcm9ubWVudHMve2Vudmlyb25tZW50X25hbWV9L3NlY3JldHMvcHVibGljLWtleVwiXG4gICAgXSxcbiAgICBnZXRFbnZpcm9ubWVudFNlY3JldDogW1xuICAgICAgXCJHRVQgL3JlcG9zaXRvcmllcy97cmVwb3NpdG9yeV9pZH0vZW52aXJvbm1lbnRzL3tlbnZpcm9ubWVudF9uYW1lfS9zZWNyZXRzL3tzZWNyZXRfbmFtZX1cIlxuICAgIF0sXG4gICAgZ2V0RW52aXJvbm1lbnRWYXJpYWJsZTogW1xuICAgICAgXCJHRVQgL3JlcG9zaXRvcmllcy97cmVwb3NpdG9yeV9pZH0vZW52aXJvbm1lbnRzL3tlbnZpcm9ubWVudF9uYW1lfS92YXJpYWJsZXMve25hbWV9XCJcbiAgICBdLFxuICAgIGdldEdpdGh1YkFjdGlvbnNEZWZhdWx0V29ya2Zsb3dQZXJtaXNzaW9uc09yZ2FuaXphdGlvbjogW1xuICAgICAgXCJHRVQgL29yZ3Mve29yZ30vYWN0aW9ucy9wZXJtaXNzaW9ucy93b3JrZmxvd1wiXG4gICAgXSxcbiAgICBnZXRHaXRodWJBY3Rpb25zRGVmYXVsdFdvcmtmbG93UGVybWlzc2lvbnNSZXBvc2l0b3J5OiBbXG4gICAgICBcIkdFVCAvcmVwb3Mve293bmVyfS97cmVwb30vYWN0aW9ucy9wZXJtaXNzaW9ucy93b3JrZmxvd1wiXG4gICAgXSxcbiAgICBnZXRHaXRodWJBY3Rpb25zUGVybWlzc2lvbnNPcmdhbml6YXRpb246IFtcbiAgICAgIFwiR0VUIC9vcmdzL3tvcmd9L2FjdGlvbnMvcGVybWlzc2lvbnNcIlxuICAgIF0sXG4gICAgZ2V0R2l0aHViQWN0aW9uc1Blcm1pc3Npb25zUmVwb3NpdG9yeTogW1xuICAgICAgXCJHRVQgL3JlcG9zL3tvd25lcn0ve3JlcG99L2FjdGlvbnMvcGVybWlzc2lvbnNcIlxuICAgIF0sXG4gICAgZ2V0Sm9iRm9yV29ya2Zsb3dSdW46IFtcIkdFVCAvcmVwb3Mve293bmVyfS97cmVwb30vYWN0aW9ucy9qb2JzL3tqb2JfaWR9XCJdLFxuICAgIGdldE9yZ1B1YmxpY0tleTogW1wiR0VUIC9vcmdzL3tvcmd9L2FjdGlvbnMvc2VjcmV0cy9wdWJsaWMta2V5XCJdLFxuICAgIGdldE9yZ1NlY3JldDogW1wiR0VUIC9vcmdzL3tvcmd9L2FjdGlvbnMvc2VjcmV0cy97c2VjcmV0X25hbWV9XCJdLFxuICAgIGdldE9yZ1ZhcmlhYmxlOiBbXCJHRVQgL29yZ3Mve29yZ30vYWN0aW9ucy92YXJpYWJsZXMve25hbWV9XCJdLFxuICAgIGdldFBlbmRpbmdEZXBsb3ltZW50c0ZvclJ1bjogW1xuICAgICAgXCJHRVQgL3JlcG9zL3tvd25lcn0ve3JlcG99L2FjdGlvbnMvcnVucy97cnVuX2lkfS9wZW5kaW5nX2RlcGxveW1lbnRzXCJcbiAgICBdLFxuICAgIGdldFJlcG9QZXJtaXNzaW9uczogW1xuICAgICAgXCJHRVQgL3JlcG9zL3tvd25lcn0ve3JlcG99L2FjdGlvbnMvcGVybWlzc2lvbnNcIixcbiAgICAgIHt9LFxuICAgICAgeyByZW5hbWVkOiBbXCJhY3Rpb25zXCIsIFwiZ2V0R2l0aHViQWN0aW9uc1Blcm1pc3Npb25zUmVwb3NpdG9yeVwiXSB9XG4gICAgXSxcbiAgICBnZXRSZXBvUHVibGljS2V5OiBbXCJHRVQgL3JlcG9zL3tvd25lcn0ve3JlcG99L2FjdGlvbnMvc2VjcmV0cy9wdWJsaWMta2V5XCJdLFxuICAgIGdldFJlcG9TZWNyZXQ6IFtcIkdFVCAvcmVwb3Mve293bmVyfS97cmVwb30vYWN0aW9ucy9zZWNyZXRzL3tzZWNyZXRfbmFtZX1cIl0sXG4gICAgZ2V0UmVwb1ZhcmlhYmxlOiBbXCJHRVQgL3JlcG9zL3tvd25lcn0ve3JlcG99L2FjdGlvbnMvdmFyaWFibGVzL3tuYW1lfVwiXSxcbiAgICBnZXRSZXZpZXdzRm9yUnVuOiBbXG4gICAgICBcIkdFVCAvcmVwb3Mve293bmVyfS97cmVwb30vYWN0aW9ucy9ydW5zL3tydW5faWR9L2FwcHJvdmFsc1wiXG4gICAgXSxcbiAgICBnZXRTZWxmSG9zdGVkUnVubmVyRm9yT3JnOiBbXCJHRVQgL29yZ3Mve29yZ30vYWN0aW9ucy9ydW5uZXJzL3tydW5uZXJfaWR9XCJdLFxuICAgIGdldFNlbGZIb3N0ZWRSdW5uZXJGb3JSZXBvOiBbXG4gICAgICBcIkdFVCAvcmVwb3Mve293bmVyfS97cmVwb30vYWN0aW9ucy9ydW5uZXJzL3tydW5uZXJfaWR9XCJcbiAgICBdLFxuICAgIGdldFdvcmtmbG93OiBbXCJHRVQgL3JlcG9zL3tvd25lcn0ve3JlcG99L2FjdGlvbnMvd29ya2Zsb3dzL3t3b3JrZmxvd19pZH1cIl0sXG4gICAgZ2V0V29ya2Zsb3dBY2Nlc3NUb1JlcG9zaXRvcnk6IFtcbiAgICAgIFwiR0VUIC9yZXBvcy97b3duZXJ9L3tyZXBvfS9hY3Rpb25zL3Blcm1pc3Npb25zL2FjY2Vzc1wiXG4gICAgXSxcbiAgICBnZXRXb3JrZmxvd1J1bjogW1wiR0VUIC9yZXBvcy97b3duZXJ9L3tyZXBvfS9hY3Rpb25zL3J1bnMve3J1bl9pZH1cIl0sXG4gICAgZ2V0V29ya2Zsb3dSdW5BdHRlbXB0OiBbXG4gICAgICBcIkdFVCAvcmVwb3Mve293bmVyfS97cmVwb30vYWN0aW9ucy9ydW5zL3tydW5faWR9L2F0dGVtcHRzL3thdHRlbXB0X251bWJlcn1cIlxuICAgIF0sXG4gICAgZ2V0V29ya2Zsb3dSdW5Vc2FnZTogW1xuICAgICAgXCJHRVQgL3JlcG9zL3tvd25lcn0ve3JlcG99L2FjdGlvbnMvcnVucy97cnVuX2lkfS90aW1pbmdcIlxuICAgIF0sXG4gICAgZ2V0V29ya2Zsb3dVc2FnZTogW1xuICAgICAgXCJHRVQgL3JlcG9zL3tvd25lcn0ve3JlcG99L2FjdGlvbnMvd29ya2Zsb3dzL3t3b3JrZmxvd19pZH0vdGltaW5nXCJcbiAgICBdLFxuICAgIGxpc3RBcnRpZmFjdHNGb3JSZXBvOiBbXCJHRVQgL3JlcG9zL3tvd25lcn0ve3JlcG99L2FjdGlvbnMvYXJ0aWZhY3RzXCJdLFxuICAgIGxpc3RFbnZpcm9ubWVudFNlY3JldHM6IFtcbiAgICAgIFwiR0VUIC9yZXBvc2l0b3JpZXMve3JlcG9zaXRvcnlfaWR9L2Vudmlyb25tZW50cy97ZW52aXJvbm1lbnRfbmFtZX0vc2VjcmV0c1wiXG4gICAgXSxcbiAgICBsaXN0RW52aXJvbm1lbnRWYXJpYWJsZXM6IFtcbiAgICAgIFwiR0VUIC9yZXBvc2l0b3JpZXMve3JlcG9zaXRvcnlfaWR9L2Vudmlyb25tZW50cy97ZW52aXJvbm1lbnRfbmFtZX0vdmFyaWFibGVzXCJcbiAgICBdLFxuICAgIGxpc3RKb2JzRm9yV29ya2Zsb3dSdW46IFtcbiAgICAgIFwiR0VUIC9yZXBvcy97b3duZXJ9L3tyZXBvfS9hY3Rpb25zL3J1bnMve3J1bl9pZH0vam9ic1wiXG4gICAgXSxcbiAgICBsaXN0Sm9ic0ZvcldvcmtmbG93UnVuQXR0ZW1wdDogW1xuICAgICAgXCJHRVQgL3JlcG9zL3tvd25lcn0ve3JlcG99L2FjdGlvbnMvcnVucy97cnVuX2lkfS9hdHRlbXB0cy97YXR0ZW1wdF9udW1iZXJ9L2pvYnNcIlxuICAgIF0sXG4gICAgbGlzdExhYmVsc0ZvclNlbGZIb3N0ZWRSdW5uZXJGb3JPcmc6IFtcbiAgICAgIFwiR0VUIC9vcmdzL3tvcmd9L2FjdGlvbnMvcnVubmVycy97cnVubmVyX2lkfS9sYWJlbHNcIlxuICAgIF0sXG4gICAgbGlzdExhYmVsc0ZvclNlbGZIb3N0ZWRSdW5uZXJGb3JSZXBvOiBbXG4gICAgICBcIkdFVCAvcmVwb3Mve293bmVyfS97cmVwb30vYWN0aW9ucy9ydW5uZXJzL3tydW5uZXJfaWR9L2xhYmVsc1wiXG4gICAgXSxcbiAgICBsaXN0T3JnU2VjcmV0czogW1wiR0VUIC9vcmdzL3tvcmd9L2FjdGlvbnMvc2VjcmV0c1wiXSxcbiAgICBsaXN0T3JnVmFyaWFibGVzOiBbXCJHRVQgL29yZ3Mve29yZ30vYWN0aW9ucy92YXJpYWJsZXNcIl0sXG4gICAgbGlzdFJlcG9Pcmdhbml6YXRpb25TZWNyZXRzOiBbXG4gICAgICBcIkdFVCAvcmVwb3Mve293bmVyfS97cmVwb30vYWN0aW9ucy9vcmdhbml6YXRpb24tc2VjcmV0c1wiXG4gICAgXSxcbiAgICBsaXN0UmVwb09yZ2FuaXphdGlvblZhcmlhYmxlczogW1xuICAgICAgXCJHRVQgL3JlcG9zL3tvd25lcn0ve3JlcG99L2FjdGlvbnMvb3JnYW5pemF0aW9uLXZhcmlhYmxlc1wiXG4gICAgXSxcbiAgICBsaXN0UmVwb1NlY3JldHM6IFtcIkdFVCAvcmVwb3Mve293bmVyfS97cmVwb30vYWN0aW9ucy9zZWNyZXRzXCJdLFxuICAgIGxpc3RSZXBvVmFyaWFibGVzOiBbXCJHRVQgL3JlcG9zL3tvd25lcn0ve3JlcG99L2FjdGlvbnMvdmFyaWFibGVzXCJdLFxuICAgIGxpc3RSZXBvV29ya2Zsb3dzOiBbXCJHRVQgL3JlcG9zL3tvd25lcn0ve3JlcG99L2FjdGlvbnMvd29ya2Zsb3dzXCJdLFxuICAgIGxpc3RSdW5uZXJBcHBsaWNhdGlvbnNGb3JPcmc6IFtcIkdFVCAvb3Jncy97b3JnfS9hY3Rpb25zL3J1bm5lcnMvZG93bmxvYWRzXCJdLFxuICAgIGxpc3RSdW5uZXJBcHBsaWNhdGlvbnNGb3JSZXBvOiBbXG4gICAgICBcIkdFVCAvcmVwb3Mve293bmVyfS97cmVwb30vYWN0aW9ucy9ydW5uZXJzL2Rvd25sb2Fkc1wiXG4gICAgXSxcbiAgICBsaXN0U2VsZWN0ZWRSZXBvc0Zvck9yZ1NlY3JldDogW1xuICAgICAgXCJHRVQgL29yZ3Mve29yZ30vYWN0aW9ucy9zZWNyZXRzL3tzZWNyZXRfbmFtZX0vcmVwb3NpdG9yaWVzXCJcbiAgICBdLFxuICAgIGxpc3RTZWxlY3RlZFJlcG9zRm9yT3JnVmFyaWFibGU6IFtcbiAgICAgIFwiR0VUIC9vcmdzL3tvcmd9L2FjdGlvbnMvdmFyaWFibGVzL3tuYW1lfS9yZXBvc2l0b3JpZXNcIlxuICAgIF0sXG4gICAgbGlzdFNlbGVjdGVkUmVwb3NpdG9yaWVzRW5hYmxlZEdpdGh1YkFjdGlvbnNPcmdhbml6YXRpb246IFtcbiAgICAgIFwiR0VUIC9vcmdzL3tvcmd9L2FjdGlvbnMvcGVybWlzc2lvbnMvcmVwb3NpdG9yaWVzXCJcbiAgICBdLFxuICAgIGxpc3RTZWxmSG9zdGVkUnVubmVyc0Zvck9yZzogW1wiR0VUIC9vcmdzL3tvcmd9L2FjdGlvbnMvcnVubmVyc1wiXSxcbiAgICBsaXN0U2VsZkhvc3RlZFJ1bm5lcnNGb3JSZXBvOiBbXCJHRVQgL3JlcG9zL3tvd25lcn0ve3JlcG99L2FjdGlvbnMvcnVubmVyc1wiXSxcbiAgICBsaXN0V29ya2Zsb3dSdW5BcnRpZmFjdHM6IFtcbiAgICAgIFwiR0VUIC9yZXBvcy97b3duZXJ9L3tyZXBvfS9hY3Rpb25zL3J1bnMve3J1bl9pZH0vYXJ0aWZhY3RzXCJcbiAgICBdLFxuICAgIGxpc3RXb3JrZmxvd1J1bnM6IFtcbiAgICAgIFwiR0VUIC9yZXBvcy97b3duZXJ9L3tyZXBvfS9hY3Rpb25zL3dvcmtmbG93cy97d29ya2Zsb3dfaWR9L3J1bnNcIlxuICAgIF0sXG4gICAgbGlzdFdvcmtmbG93UnVuc0ZvclJlcG86IFtcIkdFVCAvcmVwb3Mve293bmVyfS97cmVwb30vYWN0aW9ucy9ydW5zXCJdLFxuICAgIHJlUnVuSm9iRm9yV29ya2Zsb3dSdW46IFtcbiAgICAgIFwiUE9TVCAvcmVwb3Mve293bmVyfS97cmVwb30vYWN0aW9ucy9qb2JzL3tqb2JfaWR9L3JlcnVuXCJcbiAgICBdLFxuICAgIHJlUnVuV29ya2Zsb3c6IFtcIlBPU1QgL3JlcG9zL3tvd25lcn0ve3JlcG99L2FjdGlvbnMvcnVucy97cnVuX2lkfS9yZXJ1blwiXSxcbiAgICByZVJ1bldvcmtmbG93RmFpbGVkSm9iczogW1xuICAgICAgXCJQT1NUIC9yZXBvcy97b3duZXJ9L3tyZXBvfS9hY3Rpb25zL3J1bnMve3J1bl9pZH0vcmVydW4tZmFpbGVkLWpvYnNcIlxuICAgIF0sXG4gICAgcmVtb3ZlQWxsQ3VzdG9tTGFiZWxzRnJvbVNlbGZIb3N0ZWRSdW5uZXJGb3JPcmc6IFtcbiAgICAgIFwiREVMRVRFIC9vcmdzL3tvcmd9L2FjdGlvbnMvcnVubmVycy97cnVubmVyX2lkfS9sYWJlbHNcIlxuICAgIF0sXG4gICAgcmVtb3ZlQWxsQ3VzdG9tTGFiZWxzRnJvbVNlbGZIb3N0ZWRSdW5uZXJGb3JSZXBvOiBbXG4gICAgICBcIkRFTEVURSAvcmVwb3Mve293bmVyfS97cmVwb30vYWN0aW9ucy9ydW5uZXJzL3tydW5uZXJfaWR9L2xhYmVsc1wiXG4gICAgXSxcbiAgICByZW1vdmVDdXN0b21MYWJlbEZyb21TZWxmSG9zdGVkUnVubmVyRm9yT3JnOiBbXG4gICAgICBcIkRFTEVURSAvb3Jncy97b3JnfS9hY3Rpb25zL3J1bm5lcnMve3J1bm5lcl9pZH0vbGFiZWxzL3tuYW1lfVwiXG4gICAgXSxcbiAgICByZW1vdmVDdXN0b21MYWJlbEZyb21TZWxmSG9zdGVkUnVubmVyRm9yUmVwbzogW1xuICAgICAgXCJERUxFVEUgL3JlcG9zL3tvd25lcn0ve3JlcG99L2FjdGlvbnMvcnVubmVycy97cnVubmVyX2lkfS9sYWJlbHMve25hbWV9XCJcbiAgICBdLFxuICAgIHJlbW92ZVNlbGVjdGVkUmVwb0Zyb21PcmdTZWNyZXQ6IFtcbiAgICAgIFwiREVMRVRFIC9vcmdzL3tvcmd9L2FjdGlvbnMvc2VjcmV0cy97c2VjcmV0X25hbWV9L3JlcG9zaXRvcmllcy97cmVwb3NpdG9yeV9pZH1cIlxuICAgIF0sXG4gICAgcmVtb3ZlU2VsZWN0ZWRSZXBvRnJvbU9yZ1ZhcmlhYmxlOiBbXG4gICAgICBcIkRFTEVURSAvb3Jncy97b3JnfS9hY3Rpb25zL3ZhcmlhYmxlcy97bmFtZX0vcmVwb3NpdG9yaWVzL3tyZXBvc2l0b3J5X2lkfVwiXG4gICAgXSxcbiAgICByZXZpZXdDdXN0b21HYXRlc0ZvclJ1bjogW1xuICAgICAgXCJQT1NUIC9yZXBvcy97b3duZXJ9L3tyZXBvfS9hY3Rpb25zL3J1bnMve3J1bl9pZH0vZGVwbG95bWVudF9wcm90ZWN0aW9uX3J1bGVcIlxuICAgIF0sXG4gICAgcmV2aWV3UGVuZGluZ0RlcGxveW1lbnRzRm9yUnVuOiBbXG4gICAgICBcIlBPU1QgL3JlcG9zL3tvd25lcn0ve3JlcG99L2FjdGlvbnMvcnVucy97cnVuX2lkfS9wZW5kaW5nX2RlcGxveW1lbnRzXCJcbiAgICBdLFxuICAgIHNldEFsbG93ZWRBY3Rpb25zT3JnYW5pemF0aW9uOiBbXG4gICAgICBcIlBVVCAvb3Jncy97b3JnfS9hY3Rpb25zL3Blcm1pc3Npb25zL3NlbGVjdGVkLWFjdGlvbnNcIlxuICAgIF0sXG4gICAgc2V0QWxsb3dlZEFjdGlvbnNSZXBvc2l0b3J5OiBbXG4gICAgICBcIlBVVCAvcmVwb3Mve293bmVyfS97cmVwb30vYWN0aW9ucy9wZXJtaXNzaW9ucy9zZWxlY3RlZC1hY3Rpb25zXCJcbiAgICBdLFxuICAgIHNldEN1c3RvbUxhYmVsc0ZvclNlbGZIb3N0ZWRSdW5uZXJGb3JPcmc6IFtcbiAgICAgIFwiUFVUIC9vcmdzL3tvcmd9L2FjdGlvbnMvcnVubmVycy97cnVubmVyX2lkfS9sYWJlbHNcIlxuICAgIF0sXG4gICAgc2V0Q3VzdG9tTGFiZWxzRm9yU2VsZkhvc3RlZFJ1bm5lckZvclJlcG86IFtcbiAgICAgIFwiUFVUIC9yZXBvcy97b3duZXJ9L3tyZXBvfS9hY3Rpb25zL3J1bm5lcnMve3J1bm5lcl9pZH0vbGFiZWxzXCJcbiAgICBdLFxuICAgIHNldEN1c3RvbU9pZGNTdWJDbGFpbUZvclJlcG86IFtcbiAgICAgIFwiUFVUIC9yZXBvcy97b3duZXJ9L3tyZXBvfS9hY3Rpb25zL29pZGMvY3VzdG9taXphdGlvbi9zdWJcIlxuICAgIF0sXG4gICAgc2V0R2l0aHViQWN0aW9uc0RlZmF1bHRXb3JrZmxvd1Blcm1pc3Npb25zT3JnYW5pemF0aW9uOiBbXG4gICAgICBcIlBVVCAvb3Jncy97b3JnfS9hY3Rpb25zL3Blcm1pc3Npb25zL3dvcmtmbG93XCJcbiAgICBdLFxuICAgIHNldEdpdGh1YkFjdGlvbnNEZWZhdWx0V29ya2Zsb3dQZXJtaXNzaW9uc1JlcG9zaXRvcnk6IFtcbiAgICAgIFwiUFVUIC9yZXBvcy97b3duZXJ9L3tyZXBvfS9hY3Rpb25zL3Blcm1pc3Npb25zL3dvcmtmbG93XCJcbiAgICBdLFxuICAgIHNldEdpdGh1YkFjdGlvbnNQZXJtaXNzaW9uc09yZ2FuaXphdGlvbjogW1xuICAgICAgXCJQVVQgL29yZ3Mve29yZ30vYWN0aW9ucy9wZXJtaXNzaW9uc1wiXG4gICAgXSxcbiAgICBzZXRHaXRodWJBY3Rpb25zUGVybWlzc2lvbnNSZXBvc2l0b3J5OiBbXG4gICAgICBcIlBVVCAvcmVwb3Mve293bmVyfS97cmVwb30vYWN0aW9ucy9wZXJtaXNzaW9uc1wiXG4gICAgXSxcbiAgICBzZXRTZWxlY3RlZFJlcG9zRm9yT3JnU2VjcmV0OiBbXG4gICAgICBcIlBVVCAvb3Jncy97b3JnfS9hY3Rpb25zL3NlY3JldHMve3NlY3JldF9uYW1lfS9yZXBvc2l0b3JpZXNcIlxuICAgIF0sXG4gICAgc2V0U2VsZWN0ZWRSZXBvc0Zvck9yZ1ZhcmlhYmxlOiBbXG4gICAgICBcIlBVVCAvb3Jncy97b3JnfS9hY3Rpb25zL3ZhcmlhYmxlcy97bmFtZX0vcmVwb3NpdG9yaWVzXCJcbiAgICBdLFxuICAgIHNldFNlbGVjdGVkUmVwb3NpdG9yaWVzRW5hYmxlZEdpdGh1YkFjdGlvbnNPcmdhbml6YXRpb246IFtcbiAgICAgIFwiUFVUIC9vcmdzL3tvcmd9L2FjdGlvbnMvcGVybWlzc2lvbnMvcmVwb3NpdG9yaWVzXCJcbiAgICBdLFxuICAgIHNldFdvcmtmbG93QWNjZXNzVG9SZXBvc2l0b3J5OiBbXG4gICAgICBcIlBVVCAvcmVwb3Mve293bmVyfS97cmVwb30vYWN0aW9ucy9wZXJtaXNzaW9ucy9hY2Nlc3NcIlxuICAgIF0sXG4gICAgdXBkYXRlRW52aXJvbm1lbnRWYXJpYWJsZTogW1xuICAgICAgXCJQQVRDSCAvcmVwb3NpdG9yaWVzL3tyZXBvc2l0b3J5X2lkfS9lbnZpcm9ubWVudHMve2Vudmlyb25tZW50X25hbWV9L3ZhcmlhYmxlcy97bmFtZX1cIlxuICAgIF0sXG4gICAgdXBkYXRlT3JnVmFyaWFibGU6IFtcIlBBVENIIC9vcmdzL3tvcmd9L2FjdGlvbnMvdmFyaWFibGVzL3tuYW1lfVwiXSxcbiAgICB1cGRhdGVSZXBvVmFyaWFibGU6IFtcbiAgICAgIFwiUEFUQ0ggL3JlcG9zL3tvd25lcn0ve3JlcG99L2FjdGlvbnMvdmFyaWFibGVzL3tuYW1lfVwiXG4gICAgXVxuICB9LFxuICBhY3Rpdml0eToge1xuICAgIGNoZWNrUmVwb0lzU3RhcnJlZEJ5QXV0aGVudGljYXRlZFVzZXI6IFtcIkdFVCAvdXNlci9zdGFycmVkL3tvd25lcn0ve3JlcG99XCJdLFxuICAgIGRlbGV0ZVJlcG9TdWJzY3JpcHRpb246IFtcIkRFTEVURSAvcmVwb3Mve293bmVyfS97cmVwb30vc3Vic2NyaXB0aW9uXCJdLFxuICAgIGRlbGV0ZVRocmVhZFN1YnNjcmlwdGlvbjogW1xuICAgICAgXCJERUxFVEUgL25vdGlmaWNhdGlvbnMvdGhyZWFkcy97dGhyZWFkX2lkfS9zdWJzY3JpcHRpb25cIlxuICAgIF0sXG4gICAgZ2V0RmVlZHM6IFtcIkdFVCAvZmVlZHNcIl0sXG4gICAgZ2V0UmVwb1N1YnNjcmlwdGlvbjogW1wiR0VUIC9yZXBvcy97b3duZXJ9L3tyZXBvfS9zdWJzY3JpcHRpb25cIl0sXG4gICAgZ2V0VGhyZWFkOiBbXCJHRVQgL25vdGlmaWNhdGlvbnMvdGhyZWFkcy97dGhyZWFkX2lkfVwiXSxcbiAgICBnZXRUaHJlYWRTdWJzY3JpcHRpb25Gb3JBdXRoZW50aWNhdGVkVXNlcjogW1xuICAgICAgXCJHRVQgL25vdGlmaWNhdGlvbnMvdGhyZWFkcy97dGhyZWFkX2lkfS9zdWJzY3JpcHRpb25cIlxuICAgIF0sXG4gICAgbGlzdEV2ZW50c0ZvckF1dGhlbnRpY2F0ZWRVc2VyOiBbXCJHRVQgL3VzZXJzL3t1c2VybmFtZX0vZXZlbnRzXCJdLFxuICAgIGxpc3ROb3RpZmljYXRpb25zRm9yQXV0aGVudGljYXRlZFVzZXI6IFtcIkdFVCAvbm90aWZpY2F0aW9uc1wiXSxcbiAgICBsaXN0T3JnRXZlbnRzRm9yQXV0aGVudGljYXRlZFVzZXI6IFtcbiAgICAgIFwiR0VUIC91c2Vycy97dXNlcm5hbWV9L2V2ZW50cy9vcmdzL3tvcmd9XCJcbiAgICBdLFxuICAgIGxpc3RQdWJsaWNFdmVudHM6IFtcIkdFVCAvZXZlbnRzXCJdLFxuICAgIGxpc3RQdWJsaWNFdmVudHNGb3JSZXBvTmV0d29yazogW1wiR0VUIC9uZXR3b3Jrcy97b3duZXJ9L3tyZXBvfS9ldmVudHNcIl0sXG4gICAgbGlzdFB1YmxpY0V2ZW50c0ZvclVzZXI6IFtcIkdFVCAvdXNlcnMve3VzZXJuYW1lfS9ldmVudHMvcHVibGljXCJdLFxuICAgIGxpc3RQdWJsaWNPcmdFdmVudHM6IFtcIkdFVCAvb3Jncy97b3JnfS9ldmVudHNcIl0sXG4gICAgbGlzdFJlY2VpdmVkRXZlbnRzRm9yVXNlcjogW1wiR0VUIC91c2Vycy97dXNlcm5hbWV9L3JlY2VpdmVkX2V2ZW50c1wiXSxcbiAgICBsaXN0UmVjZWl2ZWRQdWJsaWNFdmVudHNGb3JVc2VyOiBbXG4gICAgICBcIkdFVCAvdXNlcnMve3VzZXJuYW1lfS9yZWNlaXZlZF9ldmVudHMvcHVibGljXCJcbiAgICBdLFxuICAgIGxpc3RSZXBvRXZlbnRzOiBbXCJHRVQgL3JlcG9zL3tvd25lcn0ve3JlcG99L2V2ZW50c1wiXSxcbiAgICBsaXN0UmVwb05vdGlmaWNhdGlvbnNGb3JBdXRoZW50aWNhdGVkVXNlcjogW1xuICAgICAgXCJHRVQgL3JlcG9zL3tvd25lcn0ve3JlcG99L25vdGlmaWNhdGlvbnNcIlxuICAgIF0sXG4gICAgbGlzdFJlcG9zU3RhcnJlZEJ5QXV0aGVudGljYXRlZFVzZXI6IFtcIkdFVCAvdXNlci9zdGFycmVkXCJdLFxuICAgIGxpc3RSZXBvc1N0YXJyZWRCeVVzZXI6IFtcIkdFVCAvdXNlcnMve3VzZXJuYW1lfS9zdGFycmVkXCJdLFxuICAgIGxpc3RSZXBvc1dhdGNoZWRCeVVzZXI6IFtcIkdFVCAvdXNlcnMve3VzZXJuYW1lfS9zdWJzY3JpcHRpb25zXCJdLFxuICAgIGxpc3RTdGFyZ2F6ZXJzRm9yUmVwbzogW1wiR0VUIC9yZXBvcy97b3duZXJ9L3tyZXBvfS9zdGFyZ2F6ZXJzXCJdLFxuICAgIGxpc3RXYXRjaGVkUmVwb3NGb3JBdXRoZW50aWNhdGVkVXNlcjogW1wiR0VUIC91c2VyL3N1YnNjcmlwdGlvbnNcIl0sXG4gICAgbGlzdFdhdGNoZXJzRm9yUmVwbzogW1wiR0VUIC9yZXBvcy97b3duZXJ9L3tyZXBvfS9zdWJzY3JpYmVyc1wiXSxcbiAgICBtYXJrTm90aWZpY2F0aW9uc0FzUmVhZDogW1wiUFVUIC9ub3RpZmljYXRpb25zXCJdLFxuICAgIG1hcmtSZXBvTm90aWZpY2F0aW9uc0FzUmVhZDogW1wiUFVUIC9yZXBvcy97b3duZXJ9L3tyZXBvfS9ub3RpZmljYXRpb25zXCJdLFxuICAgIG1hcmtUaHJlYWRBc0RvbmU6IFtcIkRFTEVURSAvbm90aWZpY2F0aW9ucy90aHJlYWRzL3t0aHJlYWRfaWR9XCJdLFxuICAgIG1hcmtUaHJlYWRBc1JlYWQ6IFtcIlBBVENIIC9ub3RpZmljYXRpb25zL3RocmVhZHMve3RocmVhZF9pZH1cIl0sXG4gICAgc2V0UmVwb1N1YnNjcmlwdGlvbjogW1wiUFVUIC9yZXBvcy97b3duZXJ9L3tyZXBvfS9zdWJzY3JpcHRpb25cIl0sXG4gICAgc2V0VGhyZWFkU3Vic2NyaXB0aW9uOiBbXG4gICAgICBcIlBVVCAvbm90aWZpY2F0aW9ucy90aHJlYWRzL3t0aHJlYWRfaWR9L3N1YnNjcmlwdGlvblwiXG4gICAgXSxcbiAgICBzdGFyUmVwb0ZvckF1dGhlbnRpY2F0ZWRVc2VyOiBbXCJQVVQgL3VzZXIvc3RhcnJlZC97b3duZXJ9L3tyZXBvfVwiXSxcbiAgICB1bnN0YXJSZXBvRm9yQXV0aGVudGljYXRlZFVzZXI6IFtcIkRFTEVURSAvdXNlci9zdGFycmVkL3tvd25lcn0ve3JlcG99XCJdXG4gIH0sXG4gIGFwcHM6IHtcbiAgICBhZGRSZXBvVG9JbnN0YWxsYXRpb246IFtcbiAgICAgIFwiUFVUIC91c2VyL2luc3RhbGxhdGlvbnMve2luc3RhbGxhdGlvbl9pZH0vcmVwb3NpdG9yaWVzL3tyZXBvc2l0b3J5X2lkfVwiLFxuICAgICAge30sXG4gICAgICB7IHJlbmFtZWQ6IFtcImFwcHNcIiwgXCJhZGRSZXBvVG9JbnN0YWxsYXRpb25Gb3JBdXRoZW50aWNhdGVkVXNlclwiXSB9XG4gICAgXSxcbiAgICBhZGRSZXBvVG9JbnN0YWxsYXRpb25Gb3JBdXRoZW50aWNhdGVkVXNlcjogW1xuICAgICAgXCJQVVQgL3VzZXIvaW5zdGFsbGF0aW9ucy97aW5zdGFsbGF0aW9uX2lkfS9yZXBvc2l0b3JpZXMve3JlcG9zaXRvcnlfaWR9XCJcbiAgICBdLFxuICAgIGNoZWNrVG9rZW46IFtcIlBPU1QgL2FwcGxpY2F0aW9ucy97Y2xpZW50X2lkfS90b2tlblwiXSxcbiAgICBjcmVhdGVGcm9tTWFuaWZlc3Q6IFtcIlBPU1QgL2FwcC1tYW5pZmVzdHMve2NvZGV9L2NvbnZlcnNpb25zXCJdLFxuICAgIGNyZWF0ZUluc3RhbGxhdGlvbkFjY2Vzc1Rva2VuOiBbXG4gICAgICBcIlBPU1QgL2FwcC9pbnN0YWxsYXRpb25zL3tpbnN0YWxsYXRpb25faWR9L2FjY2Vzc190b2tlbnNcIlxuICAgIF0sXG4gICAgZGVsZXRlQXV0aG9yaXphdGlvbjogW1wiREVMRVRFIC9hcHBsaWNhdGlvbnMve2NsaWVudF9pZH0vZ3JhbnRcIl0sXG4gICAgZGVsZXRlSW5zdGFsbGF0aW9uOiBbXCJERUxFVEUgL2FwcC9pbnN0YWxsYXRpb25zL3tpbnN0YWxsYXRpb25faWR9XCJdLFxuICAgIGRlbGV0ZVRva2VuOiBbXCJERUxFVEUgL2FwcGxpY2F0aW9ucy97Y2xpZW50X2lkfS90b2tlblwiXSxcbiAgICBnZXRBdXRoZW50aWNhdGVkOiBbXCJHRVQgL2FwcFwiXSxcbiAgICBnZXRCeVNsdWc6IFtcIkdFVCAvYXBwcy97YXBwX3NsdWd9XCJdLFxuICAgIGdldEluc3RhbGxhdGlvbjogW1wiR0VUIC9hcHAvaW5zdGFsbGF0aW9ucy97aW5zdGFsbGF0aW9uX2lkfVwiXSxcbiAgICBnZXRPcmdJbnN0YWxsYXRpb246IFtcIkdFVCAvb3Jncy97b3JnfS9pbnN0YWxsYXRpb25cIl0sXG4gICAgZ2V0UmVwb0luc3RhbGxhdGlvbjogW1wiR0VUIC9yZXBvcy97b3duZXJ9L3tyZXBvfS9pbnN0YWxsYXRpb25cIl0sXG4gICAgZ2V0U3Vic2NyaXB0aW9uUGxhbkZvckFjY291bnQ6IFtcbiAgICAgIFwiR0VUIC9tYXJrZXRwbGFjZV9saXN0aW5nL2FjY291bnRzL3thY2NvdW50X2lkfVwiXG4gICAgXSxcbiAgICBnZXRTdWJzY3JpcHRpb25QbGFuRm9yQWNjb3VudFN0dWJiZWQ6IFtcbiAgICAgIFwiR0VUIC9tYXJrZXRwbGFjZV9saXN0aW5nL3N0dWJiZWQvYWNjb3VudHMve2FjY291bnRfaWR9XCJcbiAgICBdLFxuICAgIGdldFVzZXJJbnN0YWxsYXRpb246IFtcIkdFVCAvdXNlcnMve3VzZXJuYW1lfS9pbnN0YWxsYXRpb25cIl0sXG4gICAgZ2V0V2ViaG9va0NvbmZpZ0ZvckFwcDogW1wiR0VUIC9hcHAvaG9vay9jb25maWdcIl0sXG4gICAgZ2V0V2ViaG9va0RlbGl2ZXJ5OiBbXCJHRVQgL2FwcC9ob29rL2RlbGl2ZXJpZXMve2RlbGl2ZXJ5X2lkfVwiXSxcbiAgICBsaXN0QWNjb3VudHNGb3JQbGFuOiBbXCJHRVQgL21hcmtldHBsYWNlX2xpc3RpbmcvcGxhbnMve3BsYW5faWR9L2FjY291bnRzXCJdLFxuICAgIGxpc3RBY2NvdW50c0ZvclBsYW5TdHViYmVkOiBbXG4gICAgICBcIkdFVCAvbWFya2V0cGxhY2VfbGlzdGluZy9zdHViYmVkL3BsYW5zL3twbGFuX2lkfS9hY2NvdW50c1wiXG4gICAgXSxcbiAgICBsaXN0SW5zdGFsbGF0aW9uUmVwb3NGb3JBdXRoZW50aWNhdGVkVXNlcjogW1xuICAgICAgXCJHRVQgL3VzZXIvaW5zdGFsbGF0aW9ucy97aW5zdGFsbGF0aW9uX2lkfS9yZXBvc2l0b3JpZXNcIlxuICAgIF0sXG4gICAgbGlzdEluc3RhbGxhdGlvblJlcXVlc3RzRm9yQXV0aGVudGljYXRlZEFwcDogW1xuICAgICAgXCJHRVQgL2FwcC9pbnN0YWxsYXRpb24tcmVxdWVzdHNcIlxuICAgIF0sXG4gICAgbGlzdEluc3RhbGxhdGlvbnM6IFtcIkdFVCAvYXBwL2luc3RhbGxhdGlvbnNcIl0sXG4gICAgbGlzdEluc3RhbGxhdGlvbnNGb3JBdXRoZW50aWNhdGVkVXNlcjogW1wiR0VUIC91c2VyL2luc3RhbGxhdGlvbnNcIl0sXG4gICAgbGlzdFBsYW5zOiBbXCJHRVQgL21hcmtldHBsYWNlX2xpc3RpbmcvcGxhbnNcIl0sXG4gICAgbGlzdFBsYW5zU3R1YmJlZDogW1wiR0VUIC9tYXJrZXRwbGFjZV9saXN0aW5nL3N0dWJiZWQvcGxhbnNcIl0sXG4gICAgbGlzdFJlcG9zQWNjZXNzaWJsZVRvSW5zdGFsbGF0aW9uOiBbXCJHRVQgL2luc3RhbGxhdGlvbi9yZXBvc2l0b3JpZXNcIl0sXG4gICAgbGlzdFN1YnNjcmlwdGlvbnNGb3JBdXRoZW50aWNhdGVkVXNlcjogW1wiR0VUIC91c2VyL21hcmtldHBsYWNlX3B1cmNoYXNlc1wiXSxcbiAgICBsaXN0U3Vic2NyaXB0aW9uc0ZvckF1dGhlbnRpY2F0ZWRVc2VyU3R1YmJlZDogW1xuICAgICAgXCJHRVQgL3VzZXIvbWFya2V0cGxhY2VfcHVyY2hhc2VzL3N0dWJiZWRcIlxuICAgIF0sXG4gICAgbGlzdFdlYmhvb2tEZWxpdmVyaWVzOiBbXCJHRVQgL2FwcC9ob29rL2RlbGl2ZXJpZXNcIl0sXG4gICAgcmVkZWxpdmVyV2ViaG9va0RlbGl2ZXJ5OiBbXG4gICAgICBcIlBPU1QgL2FwcC9ob29rL2RlbGl2ZXJpZXMve2RlbGl2ZXJ5X2lkfS9hdHRlbXB0c1wiXG4gICAgXSxcbiAgICByZW1vdmVSZXBvRnJvbUluc3RhbGxhdGlvbjogW1xuICAgICAgXCJERUxFVEUgL3VzZXIvaW5zdGFsbGF0aW9ucy97aW5zdGFsbGF0aW9uX2lkfS9yZXBvc2l0b3JpZXMve3JlcG9zaXRvcnlfaWR9XCIsXG4gICAgICB7fSxcbiAgICAgIHsgcmVuYW1lZDogW1wiYXBwc1wiLCBcInJlbW92ZVJlcG9Gcm9tSW5zdGFsbGF0aW9uRm9yQXV0aGVudGljYXRlZFVzZXJcIl0gfVxuICAgIF0sXG4gICAgcmVtb3ZlUmVwb0Zyb21JbnN0YWxsYXRpb25Gb3JBdXRoZW50aWNhdGVkVXNlcjogW1xuICAgICAgXCJERUxFVEUgL3VzZXIvaW5zdGFsbGF0aW9ucy97aW5zdGFsbGF0aW9uX2lkfS9yZXBvc2l0b3JpZXMve3JlcG9zaXRvcnlfaWR9XCJcbiAgICBdLFxuICAgIHJlc2V0VG9rZW46IFtcIlBBVENIIC9hcHBsaWNhdGlvbnMve2NsaWVudF9pZH0vdG9rZW5cIl0sXG4gICAgcmV2b2tlSW5zdGFsbGF0aW9uQWNjZXNzVG9rZW46IFtcIkRFTEVURSAvaW5zdGFsbGF0aW9uL3Rva2VuXCJdLFxuICAgIHNjb3BlVG9rZW46IFtcIlBPU1QgL2FwcGxpY2F0aW9ucy97Y2xpZW50X2lkfS90b2tlbi9zY29wZWRcIl0sXG4gICAgc3VzcGVuZEluc3RhbGxhdGlvbjogW1wiUFVUIC9hcHAvaW5zdGFsbGF0aW9ucy97aW5zdGFsbGF0aW9uX2lkfS9zdXNwZW5kZWRcIl0sXG4gICAgdW5zdXNwZW5kSW5zdGFsbGF0aW9uOiBbXG4gICAgICBcIkRFTEVURSAvYXBwL2luc3RhbGxhdGlvbnMve2luc3RhbGxhdGlvbl9pZH0vc3VzcGVuZGVkXCJcbiAgICBdLFxuICAgIHVwZGF0ZVdlYmhvb2tDb25maWdGb3JBcHA6IFtcIlBBVENIIC9hcHAvaG9vay9jb25maWdcIl1cbiAgfSxcbiAgYmlsbGluZzoge1xuICAgIGdldEdpdGh1YkFjdGlvbnNCaWxsaW5nT3JnOiBbXCJHRVQgL29yZ3Mve29yZ30vc2V0dGluZ3MvYmlsbGluZy9hY3Rpb25zXCJdLFxuICAgIGdldEdpdGh1YkFjdGlvbnNCaWxsaW5nVXNlcjogW1xuICAgICAgXCJHRVQgL3VzZXJzL3t1c2VybmFtZX0vc2V0dGluZ3MvYmlsbGluZy9hY3Rpb25zXCJcbiAgICBdLFxuICAgIGdldEdpdGh1YlBhY2thZ2VzQmlsbGluZ09yZzogW1wiR0VUIC9vcmdzL3tvcmd9L3NldHRpbmdzL2JpbGxpbmcvcGFja2FnZXNcIl0sXG4gICAgZ2V0R2l0aHViUGFja2FnZXNCaWxsaW5nVXNlcjogW1xuICAgICAgXCJHRVQgL3VzZXJzL3t1c2VybmFtZX0vc2V0dGluZ3MvYmlsbGluZy9wYWNrYWdlc1wiXG4gICAgXSxcbiAgICBnZXRTaGFyZWRTdG9yYWdlQmlsbGluZ09yZzogW1xuICAgICAgXCJHRVQgL29yZ3Mve29yZ30vc2V0dGluZ3MvYmlsbGluZy9zaGFyZWQtc3RvcmFnZVwiXG4gICAgXSxcbiAgICBnZXRTaGFyZWRTdG9yYWdlQmlsbGluZ1VzZXI6IFtcbiAgICAgIFwiR0VUIC91c2Vycy97dXNlcm5hbWV9L3NldHRpbmdzL2JpbGxpbmcvc2hhcmVkLXN0b3JhZ2VcIlxuICAgIF1cbiAgfSxcbiAgY2hlY2tzOiB7XG4gICAgY3JlYXRlOiBbXCJQT1NUIC9yZXBvcy97b3duZXJ9L3tyZXBvfS9jaGVjay1ydW5zXCJdLFxuICAgIGNyZWF0ZVN1aXRlOiBbXCJQT1NUIC9yZXBvcy97b3duZXJ9L3tyZXBvfS9jaGVjay1zdWl0ZXNcIl0sXG4gICAgZ2V0OiBbXCJHRVQgL3JlcG9zL3tvd25lcn0ve3JlcG99L2NoZWNrLXJ1bnMve2NoZWNrX3J1bl9pZH1cIl0sXG4gICAgZ2V0U3VpdGU6IFtcIkdFVCAvcmVwb3Mve293bmVyfS97cmVwb30vY2hlY2stc3VpdGVzL3tjaGVja19zdWl0ZV9pZH1cIl0sXG4gICAgbGlzdEFubm90YXRpb25zOiBbXG4gICAgICBcIkdFVCAvcmVwb3Mve293bmVyfS97cmVwb30vY2hlY2stcnVucy97Y2hlY2tfcnVuX2lkfS9hbm5vdGF0aW9uc1wiXG4gICAgXSxcbiAgICBsaXN0Rm9yUmVmOiBbXCJHRVQgL3JlcG9zL3tvd25lcn0ve3JlcG99L2NvbW1pdHMve3JlZn0vY2hlY2stcnVuc1wiXSxcbiAgICBsaXN0Rm9yU3VpdGU6IFtcbiAgICAgIFwiR0VUIC9yZXBvcy97b3duZXJ9L3tyZXBvfS9jaGVjay1zdWl0ZXMve2NoZWNrX3N1aXRlX2lkfS9jaGVjay1ydW5zXCJcbiAgICBdLFxuICAgIGxpc3RTdWl0ZXNGb3JSZWY6IFtcIkdFVCAvcmVwb3Mve293bmVyfS97cmVwb30vY29tbWl0cy97cmVmfS9jaGVjay1zdWl0ZXNcIl0sXG4gICAgcmVyZXF1ZXN0UnVuOiBbXG4gICAgICBcIlBPU1QgL3JlcG9zL3tvd25lcn0ve3JlcG99L2NoZWNrLXJ1bnMve2NoZWNrX3J1bl9pZH0vcmVyZXF1ZXN0XCJcbiAgICBdLFxuICAgIHJlcmVxdWVzdFN1aXRlOiBbXG4gICAgICBcIlBPU1QgL3JlcG9zL3tvd25lcn0ve3JlcG99L2NoZWNrLXN1aXRlcy97Y2hlY2tfc3VpdGVfaWR9L3JlcmVxdWVzdFwiXG4gICAgXSxcbiAgICBzZXRTdWl0ZXNQcmVmZXJlbmNlczogW1xuICAgICAgXCJQQVRDSCAvcmVwb3Mve293bmVyfS97cmVwb30vY2hlY2stc3VpdGVzL3ByZWZlcmVuY2VzXCJcbiAgICBdLFxuICAgIHVwZGF0ZTogW1wiUEFUQ0ggL3JlcG9zL3tvd25lcn0ve3JlcG99L2NoZWNrLXJ1bnMve2NoZWNrX3J1bl9pZH1cIl1cbiAgfSxcbiAgY29kZVNjYW5uaW5nOiB7XG4gICAgZGVsZXRlQW5hbHlzaXM6IFtcbiAgICAgIFwiREVMRVRFIC9yZXBvcy97b3duZXJ9L3tyZXBvfS9jb2RlLXNjYW5uaW5nL2FuYWx5c2VzL3thbmFseXNpc19pZH17P2NvbmZpcm1fZGVsZXRlfVwiXG4gICAgXSxcbiAgICBnZXRBbGVydDogW1xuICAgICAgXCJHRVQgL3JlcG9zL3tvd25lcn0ve3JlcG99L2NvZGUtc2Nhbm5pbmcvYWxlcnRzL3thbGVydF9udW1iZXJ9XCIsXG4gICAgICB7fSxcbiAgICAgIHsgcmVuYW1lZFBhcmFtZXRlcnM6IHsgYWxlcnRfaWQ6IFwiYWxlcnRfbnVtYmVyXCIgfSB9XG4gICAgXSxcbiAgICBnZXRBbmFseXNpczogW1xuICAgICAgXCJHRVQgL3JlcG9zL3tvd25lcn0ve3JlcG99L2NvZGUtc2Nhbm5pbmcvYW5hbHlzZXMve2FuYWx5c2lzX2lkfVwiXG4gICAgXSxcbiAgICBnZXRDb2RlcWxEYXRhYmFzZTogW1xuICAgICAgXCJHRVQgL3JlcG9zL3tvd25lcn0ve3JlcG99L2NvZGUtc2Nhbm5pbmcvY29kZXFsL2RhdGFiYXNlcy97bGFuZ3VhZ2V9XCJcbiAgICBdLFxuICAgIGdldERlZmF1bHRTZXR1cDogW1wiR0VUIC9yZXBvcy97b3duZXJ9L3tyZXBvfS9jb2RlLXNjYW5uaW5nL2RlZmF1bHQtc2V0dXBcIl0sXG4gICAgZ2V0U2FyaWY6IFtcIkdFVCAvcmVwb3Mve293bmVyfS97cmVwb30vY29kZS1zY2FubmluZy9zYXJpZnMve3NhcmlmX2lkfVwiXSxcbiAgICBsaXN0QWxlcnRJbnN0YW5jZXM6IFtcbiAgICAgIFwiR0VUIC9yZXBvcy97b3duZXJ9L3tyZXBvfS9jb2RlLXNjYW5uaW5nL2FsZXJ0cy97YWxlcnRfbnVtYmVyfS9pbnN0YW5jZXNcIlxuICAgIF0sXG4gICAgbGlzdEFsZXJ0c0Zvck9yZzogW1wiR0VUIC9vcmdzL3tvcmd9L2NvZGUtc2Nhbm5pbmcvYWxlcnRzXCJdLFxuICAgIGxpc3RBbGVydHNGb3JSZXBvOiBbXCJHRVQgL3JlcG9zL3tvd25lcn0ve3JlcG99L2NvZGUtc2Nhbm5pbmcvYWxlcnRzXCJdLFxuICAgIGxpc3RBbGVydHNJbnN0YW5jZXM6IFtcbiAgICAgIFwiR0VUIC9yZXBvcy97b3duZXJ9L3tyZXBvfS9jb2RlLXNjYW5uaW5nL2FsZXJ0cy97YWxlcnRfbnVtYmVyfS9pbnN0YW5jZXNcIixcbiAgICAgIHt9LFxuICAgICAgeyByZW5hbWVkOiBbXCJjb2RlU2Nhbm5pbmdcIiwgXCJsaXN0QWxlcnRJbnN0YW5jZXNcIl0gfVxuICAgIF0sXG4gICAgbGlzdENvZGVxbERhdGFiYXNlczogW1xuICAgICAgXCJHRVQgL3JlcG9zL3tvd25lcn0ve3JlcG99L2NvZGUtc2Nhbm5pbmcvY29kZXFsL2RhdGFiYXNlc1wiXG4gICAgXSxcbiAgICBsaXN0UmVjZW50QW5hbHlzZXM6IFtcIkdFVCAvcmVwb3Mve293bmVyfS97cmVwb30vY29kZS1zY2FubmluZy9hbmFseXNlc1wiXSxcbiAgICB1cGRhdGVBbGVydDogW1xuICAgICAgXCJQQVRDSCAvcmVwb3Mve293bmVyfS97cmVwb30vY29kZS1zY2FubmluZy9hbGVydHMve2FsZXJ0X251bWJlcn1cIlxuICAgIF0sXG4gICAgdXBkYXRlRGVmYXVsdFNldHVwOiBbXG4gICAgICBcIlBBVENIIC9yZXBvcy97b3duZXJ9L3tyZXBvfS9jb2RlLXNjYW5uaW5nL2RlZmF1bHQtc2V0dXBcIlxuICAgIF0sXG4gICAgdXBsb2FkU2FyaWY6IFtcIlBPU1QgL3JlcG9zL3tvd25lcn0ve3JlcG99L2NvZGUtc2Nhbm5pbmcvc2FyaWZzXCJdXG4gIH0sXG4gIGNvZGVzT2ZDb25kdWN0OiB7XG4gICAgZ2V0QWxsQ29kZXNPZkNvbmR1Y3Q6IFtcIkdFVCAvY29kZXNfb2ZfY29uZHVjdFwiXSxcbiAgICBnZXRDb25kdWN0Q29kZTogW1wiR0VUIC9jb2Rlc19vZl9jb25kdWN0L3trZXl9XCJdXG4gIH0sXG4gIGNvZGVzcGFjZXM6IHtcbiAgICBhZGRSZXBvc2l0b3J5Rm9yU2VjcmV0Rm9yQXV0aGVudGljYXRlZFVzZXI6IFtcbiAgICAgIFwiUFVUIC91c2VyL2NvZGVzcGFjZXMvc2VjcmV0cy97c2VjcmV0X25hbWV9L3JlcG9zaXRvcmllcy97cmVwb3NpdG9yeV9pZH1cIlxuICAgIF0sXG4gICAgYWRkU2VsZWN0ZWRSZXBvVG9PcmdTZWNyZXQ6IFtcbiAgICAgIFwiUFVUIC9vcmdzL3tvcmd9L2NvZGVzcGFjZXMvc2VjcmV0cy97c2VjcmV0X25hbWV9L3JlcG9zaXRvcmllcy97cmVwb3NpdG9yeV9pZH1cIlxuICAgIF0sXG4gICAgY2hlY2tQZXJtaXNzaW9uc0ZvckRldmNvbnRhaW5lcjogW1xuICAgICAgXCJHRVQgL3JlcG9zL3tvd25lcn0ve3JlcG99L2NvZGVzcGFjZXMvcGVybWlzc2lvbnNfY2hlY2tcIlxuICAgIF0sXG4gICAgY29kZXNwYWNlTWFjaGluZXNGb3JBdXRoZW50aWNhdGVkVXNlcjogW1xuICAgICAgXCJHRVQgL3VzZXIvY29kZXNwYWNlcy97Y29kZXNwYWNlX25hbWV9L21hY2hpbmVzXCJcbiAgICBdLFxuICAgIGNyZWF0ZUZvckF1dGhlbnRpY2F0ZWRVc2VyOiBbXCJQT1NUIC91c2VyL2NvZGVzcGFjZXNcIl0sXG4gICAgY3JlYXRlT3JVcGRhdGVPcmdTZWNyZXQ6IFtcbiAgICAgIFwiUFVUIC9vcmdzL3tvcmd9L2NvZGVzcGFjZXMvc2VjcmV0cy97c2VjcmV0X25hbWV9XCJcbiAgICBdLFxuICAgIGNyZWF0ZU9yVXBkYXRlUmVwb1NlY3JldDogW1xuICAgICAgXCJQVVQgL3JlcG9zL3tvd25lcn0ve3JlcG99L2NvZGVzcGFjZXMvc2VjcmV0cy97c2VjcmV0X25hbWV9XCJcbiAgICBdLFxuICAgIGNyZWF0ZU9yVXBkYXRlU2VjcmV0Rm9yQXV0aGVudGljYXRlZFVzZXI6IFtcbiAgICAgIFwiUFVUIC91c2VyL2NvZGVzcGFjZXMvc2VjcmV0cy97c2VjcmV0X25hbWV9XCJcbiAgICBdLFxuICAgIGNyZWF0ZVdpdGhQckZvckF1dGhlbnRpY2F0ZWRVc2VyOiBbXG4gICAgICBcIlBPU1QgL3JlcG9zL3tvd25lcn0ve3JlcG99L3B1bGxzL3twdWxsX251bWJlcn0vY29kZXNwYWNlc1wiXG4gICAgXSxcbiAgICBjcmVhdGVXaXRoUmVwb0ZvckF1dGhlbnRpY2F0ZWRVc2VyOiBbXG4gICAgICBcIlBPU1QgL3JlcG9zL3tvd25lcn0ve3JlcG99L2NvZGVzcGFjZXNcIlxuICAgIF0sXG4gICAgZGVsZXRlRm9yQXV0aGVudGljYXRlZFVzZXI6IFtcIkRFTEVURSAvdXNlci9jb2Rlc3BhY2VzL3tjb2Rlc3BhY2VfbmFtZX1cIl0sXG4gICAgZGVsZXRlRnJvbU9yZ2FuaXphdGlvbjogW1xuICAgICAgXCJERUxFVEUgL29yZ3Mve29yZ30vbWVtYmVycy97dXNlcm5hbWV9L2NvZGVzcGFjZXMve2NvZGVzcGFjZV9uYW1lfVwiXG4gICAgXSxcbiAgICBkZWxldGVPcmdTZWNyZXQ6IFtcIkRFTEVURSAvb3Jncy97b3JnfS9jb2Rlc3BhY2VzL3NlY3JldHMve3NlY3JldF9uYW1lfVwiXSxcbiAgICBkZWxldGVSZXBvU2VjcmV0OiBbXG4gICAgICBcIkRFTEVURSAvcmVwb3Mve293bmVyfS97cmVwb30vY29kZXNwYWNlcy9zZWNyZXRzL3tzZWNyZXRfbmFtZX1cIlxuICAgIF0sXG4gICAgZGVsZXRlU2VjcmV0Rm9yQXV0aGVudGljYXRlZFVzZXI6IFtcbiAgICAgIFwiREVMRVRFIC91c2VyL2NvZGVzcGFjZXMvc2VjcmV0cy97c2VjcmV0X25hbWV9XCJcbiAgICBdLFxuICAgIGV4cG9ydEZvckF1dGhlbnRpY2F0ZWRVc2VyOiBbXG4gICAgICBcIlBPU1QgL3VzZXIvY29kZXNwYWNlcy97Y29kZXNwYWNlX25hbWV9L2V4cG9ydHNcIlxuICAgIF0sXG4gICAgZ2V0Q29kZXNwYWNlc0ZvclVzZXJJbk9yZzogW1xuICAgICAgXCJHRVQgL29yZ3Mve29yZ30vbWVtYmVycy97dXNlcm5hbWV9L2NvZGVzcGFjZXNcIlxuICAgIF0sXG4gICAgZ2V0RXhwb3J0RGV0YWlsc0ZvckF1dGhlbnRpY2F0ZWRVc2VyOiBbXG4gICAgICBcIkdFVCAvdXNlci9jb2Rlc3BhY2VzL3tjb2Rlc3BhY2VfbmFtZX0vZXhwb3J0cy97ZXhwb3J0X2lkfVwiXG4gICAgXSxcbiAgICBnZXRGb3JBdXRoZW50aWNhdGVkVXNlcjogW1wiR0VUIC91c2VyL2NvZGVzcGFjZXMve2NvZGVzcGFjZV9uYW1lfVwiXSxcbiAgICBnZXRPcmdQdWJsaWNLZXk6IFtcIkdFVCAvb3Jncy97b3JnfS9jb2Rlc3BhY2VzL3NlY3JldHMvcHVibGljLWtleVwiXSxcbiAgICBnZXRPcmdTZWNyZXQ6IFtcIkdFVCAvb3Jncy97b3JnfS9jb2Rlc3BhY2VzL3NlY3JldHMve3NlY3JldF9uYW1lfVwiXSxcbiAgICBnZXRQdWJsaWNLZXlGb3JBdXRoZW50aWNhdGVkVXNlcjogW1xuICAgICAgXCJHRVQgL3VzZXIvY29kZXNwYWNlcy9zZWNyZXRzL3B1YmxpYy1rZXlcIlxuICAgIF0sXG4gICAgZ2V0UmVwb1B1YmxpY0tleTogW1xuICAgICAgXCJHRVQgL3JlcG9zL3tvd25lcn0ve3JlcG99L2NvZGVzcGFjZXMvc2VjcmV0cy9wdWJsaWMta2V5XCJcbiAgICBdLFxuICAgIGdldFJlcG9TZWNyZXQ6IFtcbiAgICAgIFwiR0VUIC9yZXBvcy97b3duZXJ9L3tyZXBvfS9jb2Rlc3BhY2VzL3NlY3JldHMve3NlY3JldF9uYW1lfVwiXG4gICAgXSxcbiAgICBnZXRTZWNyZXRGb3JBdXRoZW50aWNhdGVkVXNlcjogW1xuICAgICAgXCJHRVQgL3VzZXIvY29kZXNwYWNlcy9zZWNyZXRzL3tzZWNyZXRfbmFtZX1cIlxuICAgIF0sXG4gICAgbGlzdERldmNvbnRhaW5lcnNJblJlcG9zaXRvcnlGb3JBdXRoZW50aWNhdGVkVXNlcjogW1xuICAgICAgXCJHRVQgL3JlcG9zL3tvd25lcn0ve3JlcG99L2NvZGVzcGFjZXMvZGV2Y29udGFpbmVyc1wiXG4gICAgXSxcbiAgICBsaXN0Rm9yQXV0aGVudGljYXRlZFVzZXI6IFtcIkdFVCAvdXNlci9jb2Rlc3BhY2VzXCJdLFxuICAgIGxpc3RJbk9yZ2FuaXphdGlvbjogW1xuICAgICAgXCJHRVQgL29yZ3Mve29yZ30vY29kZXNwYWNlc1wiLFxuICAgICAge30sXG4gICAgICB7IHJlbmFtZWRQYXJhbWV0ZXJzOiB7IG9yZ19pZDogXCJvcmdcIiB9IH1cbiAgICBdLFxuICAgIGxpc3RJblJlcG9zaXRvcnlGb3JBdXRoZW50aWNhdGVkVXNlcjogW1xuICAgICAgXCJHRVQgL3JlcG9zL3tvd25lcn0ve3JlcG99L2NvZGVzcGFjZXNcIlxuICAgIF0sXG4gICAgbGlzdE9yZ1NlY3JldHM6IFtcIkdFVCAvb3Jncy97b3JnfS9jb2Rlc3BhY2VzL3NlY3JldHNcIl0sXG4gICAgbGlzdFJlcG9TZWNyZXRzOiBbXCJHRVQgL3JlcG9zL3tvd25lcn0ve3JlcG99L2NvZGVzcGFjZXMvc2VjcmV0c1wiXSxcbiAgICBsaXN0UmVwb3NpdG9yaWVzRm9yU2VjcmV0Rm9yQXV0aGVudGljYXRlZFVzZXI6IFtcbiAgICAgIFwiR0VUIC91c2VyL2NvZGVzcGFjZXMvc2VjcmV0cy97c2VjcmV0X25hbWV9L3JlcG9zaXRvcmllc1wiXG4gICAgXSxcbiAgICBsaXN0U2VjcmV0c0ZvckF1dGhlbnRpY2F0ZWRVc2VyOiBbXCJHRVQgL3VzZXIvY29kZXNwYWNlcy9zZWNyZXRzXCJdLFxuICAgIGxpc3RTZWxlY3RlZFJlcG9zRm9yT3JnU2VjcmV0OiBbXG4gICAgICBcIkdFVCAvb3Jncy97b3JnfS9jb2Rlc3BhY2VzL3NlY3JldHMve3NlY3JldF9uYW1lfS9yZXBvc2l0b3JpZXNcIlxuICAgIF0sXG4gICAgcHJlRmxpZ2h0V2l0aFJlcG9Gb3JBdXRoZW50aWNhdGVkVXNlcjogW1xuICAgICAgXCJHRVQgL3JlcG9zL3tvd25lcn0ve3JlcG99L2NvZGVzcGFjZXMvbmV3XCJcbiAgICBdLFxuICAgIHB1Ymxpc2hGb3JBdXRoZW50aWNhdGVkVXNlcjogW1xuICAgICAgXCJQT1NUIC91c2VyL2NvZGVzcGFjZXMve2NvZGVzcGFjZV9uYW1lfS9wdWJsaXNoXCJcbiAgICBdLFxuICAgIHJlbW92ZVJlcG9zaXRvcnlGb3JTZWNyZXRGb3JBdXRoZW50aWNhdGVkVXNlcjogW1xuICAgICAgXCJERUxFVEUgL3VzZXIvY29kZXNwYWNlcy9zZWNyZXRzL3tzZWNyZXRfbmFtZX0vcmVwb3NpdG9yaWVzL3tyZXBvc2l0b3J5X2lkfVwiXG4gICAgXSxcbiAgICByZW1vdmVTZWxlY3RlZFJlcG9Gcm9tT3JnU2VjcmV0OiBbXG4gICAgICBcIkRFTEVURSAvb3Jncy97b3JnfS9jb2Rlc3BhY2VzL3NlY3JldHMve3NlY3JldF9uYW1lfS9yZXBvc2l0b3JpZXMve3JlcG9zaXRvcnlfaWR9XCJcbiAgICBdLFxuICAgIHJlcG9NYWNoaW5lc0ZvckF1dGhlbnRpY2F0ZWRVc2VyOiBbXG4gICAgICBcIkdFVCAvcmVwb3Mve293bmVyfS97cmVwb30vY29kZXNwYWNlcy9tYWNoaW5lc1wiXG4gICAgXSxcbiAgICBzZXRSZXBvc2l0b3JpZXNGb3JTZWNyZXRGb3JBdXRoZW50aWNhdGVkVXNlcjogW1xuICAgICAgXCJQVVQgL3VzZXIvY29kZXNwYWNlcy9zZWNyZXRzL3tzZWNyZXRfbmFtZX0vcmVwb3NpdG9yaWVzXCJcbiAgICBdLFxuICAgIHNldFNlbGVjdGVkUmVwb3NGb3JPcmdTZWNyZXQ6IFtcbiAgICAgIFwiUFVUIC9vcmdzL3tvcmd9L2NvZGVzcGFjZXMvc2VjcmV0cy97c2VjcmV0X25hbWV9L3JlcG9zaXRvcmllc1wiXG4gICAgXSxcbiAgICBzdGFydEZvckF1dGhlbnRpY2F0ZWRVc2VyOiBbXCJQT1NUIC91c2VyL2NvZGVzcGFjZXMve2NvZGVzcGFjZV9uYW1lfS9zdGFydFwiXSxcbiAgICBzdG9wRm9yQXV0aGVudGljYXRlZFVzZXI6IFtcIlBPU1QgL3VzZXIvY29kZXNwYWNlcy97Y29kZXNwYWNlX25hbWV9L3N0b3BcIl0sXG4gICAgc3RvcEluT3JnYW5pemF0aW9uOiBbXG4gICAgICBcIlBPU1QgL29yZ3Mve29yZ30vbWVtYmVycy97dXNlcm5hbWV9L2NvZGVzcGFjZXMve2NvZGVzcGFjZV9uYW1lfS9zdG9wXCJcbiAgICBdLFxuICAgIHVwZGF0ZUZvckF1dGhlbnRpY2F0ZWRVc2VyOiBbXCJQQVRDSCAvdXNlci9jb2Rlc3BhY2VzL3tjb2Rlc3BhY2VfbmFtZX1cIl1cbiAgfSxcbiAgY29waWxvdDoge1xuICAgIGFkZENvcGlsb3RTZWF0c0ZvclRlYW1zOiBbXG4gICAgICBcIlBPU1QgL29yZ3Mve29yZ30vY29waWxvdC9iaWxsaW5nL3NlbGVjdGVkX3RlYW1zXCJcbiAgICBdLFxuICAgIGFkZENvcGlsb3RTZWF0c0ZvclVzZXJzOiBbXG4gICAgICBcIlBPU1QgL29yZ3Mve29yZ30vY29waWxvdC9iaWxsaW5nL3NlbGVjdGVkX3VzZXJzXCJcbiAgICBdLFxuICAgIGNhbmNlbENvcGlsb3RTZWF0QXNzaWdubWVudEZvclRlYW1zOiBbXG4gICAgICBcIkRFTEVURSAvb3Jncy97b3JnfS9jb3BpbG90L2JpbGxpbmcvc2VsZWN0ZWRfdGVhbXNcIlxuICAgIF0sXG4gICAgY2FuY2VsQ29waWxvdFNlYXRBc3NpZ25tZW50Rm9yVXNlcnM6IFtcbiAgICAgIFwiREVMRVRFIC9vcmdzL3tvcmd9L2NvcGlsb3QvYmlsbGluZy9zZWxlY3RlZF91c2Vyc1wiXG4gICAgXSxcbiAgICBnZXRDb3BpbG90T3JnYW5pemF0aW9uRGV0YWlsczogW1wiR0VUIC9vcmdzL3tvcmd9L2NvcGlsb3QvYmlsbGluZ1wiXSxcbiAgICBnZXRDb3BpbG90U2VhdERldGFpbHNGb3JVc2VyOiBbXG4gICAgICBcIkdFVCAvb3Jncy97b3JnfS9tZW1iZXJzL3t1c2VybmFtZX0vY29waWxvdFwiXG4gICAgXSxcbiAgICBsaXN0Q29waWxvdFNlYXRzOiBbXCJHRVQgL29yZ3Mve29yZ30vY29waWxvdC9iaWxsaW5nL3NlYXRzXCJdXG4gIH0sXG4gIGRlcGVuZGFib3Q6IHtcbiAgICBhZGRTZWxlY3RlZFJlcG9Ub09yZ1NlY3JldDogW1xuICAgICAgXCJQVVQgL29yZ3Mve29yZ30vZGVwZW5kYWJvdC9zZWNyZXRzL3tzZWNyZXRfbmFtZX0vcmVwb3NpdG9yaWVzL3tyZXBvc2l0b3J5X2lkfVwiXG4gICAgXSxcbiAgICBjcmVhdGVPclVwZGF0ZU9yZ1NlY3JldDogW1xuICAgICAgXCJQVVQgL29yZ3Mve29yZ30vZGVwZW5kYWJvdC9zZWNyZXRzL3tzZWNyZXRfbmFtZX1cIlxuICAgIF0sXG4gICAgY3JlYXRlT3JVcGRhdGVSZXBvU2VjcmV0OiBbXG4gICAgICBcIlBVVCAvcmVwb3Mve293bmVyfS97cmVwb30vZGVwZW5kYWJvdC9zZWNyZXRzL3tzZWNyZXRfbmFtZX1cIlxuICAgIF0sXG4gICAgZGVsZXRlT3JnU2VjcmV0OiBbXCJERUxFVEUgL29yZ3Mve29yZ30vZGVwZW5kYWJvdC9zZWNyZXRzL3tzZWNyZXRfbmFtZX1cIl0sXG4gICAgZGVsZXRlUmVwb1NlY3JldDogW1xuICAgICAgXCJERUxFVEUgL3JlcG9zL3tvd25lcn0ve3JlcG99L2RlcGVuZGFib3Qvc2VjcmV0cy97c2VjcmV0X25hbWV9XCJcbiAgICBdLFxuICAgIGdldEFsZXJ0OiBbXCJHRVQgL3JlcG9zL3tvd25lcn0ve3JlcG99L2RlcGVuZGFib3QvYWxlcnRzL3thbGVydF9udW1iZXJ9XCJdLFxuICAgIGdldE9yZ1B1YmxpY0tleTogW1wiR0VUIC9vcmdzL3tvcmd9L2RlcGVuZGFib3Qvc2VjcmV0cy9wdWJsaWMta2V5XCJdLFxuICAgIGdldE9yZ1NlY3JldDogW1wiR0VUIC9vcmdzL3tvcmd9L2RlcGVuZGFib3Qvc2VjcmV0cy97c2VjcmV0X25hbWV9XCJdLFxuICAgIGdldFJlcG9QdWJsaWNLZXk6IFtcbiAgICAgIFwiR0VUIC9yZXBvcy97b3duZXJ9L3tyZXBvfS9kZXBlbmRhYm90L3NlY3JldHMvcHVibGljLWtleVwiXG4gICAgXSxcbiAgICBnZXRSZXBvU2VjcmV0OiBbXG4gICAgICBcIkdFVCAvcmVwb3Mve293bmVyfS97cmVwb30vZGVwZW5kYWJvdC9zZWNyZXRzL3tzZWNyZXRfbmFtZX1cIlxuICAgIF0sXG4gICAgbGlzdEFsZXJ0c0ZvckVudGVycHJpc2U6IFtcbiAgICAgIFwiR0VUIC9lbnRlcnByaXNlcy97ZW50ZXJwcmlzZX0vZGVwZW5kYWJvdC9hbGVydHNcIlxuICAgIF0sXG4gICAgbGlzdEFsZXJ0c0Zvck9yZzogW1wiR0VUIC9vcmdzL3tvcmd9L2RlcGVuZGFib3QvYWxlcnRzXCJdLFxuICAgIGxpc3RBbGVydHNGb3JSZXBvOiBbXCJHRVQgL3JlcG9zL3tvd25lcn0ve3JlcG99L2RlcGVuZGFib3QvYWxlcnRzXCJdLFxuICAgIGxpc3RPcmdTZWNyZXRzOiBbXCJHRVQgL29yZ3Mve29yZ30vZGVwZW5kYWJvdC9zZWNyZXRzXCJdLFxuICAgIGxpc3RSZXBvU2VjcmV0czogW1wiR0VUIC9yZXBvcy97b3duZXJ9L3tyZXBvfS9kZXBlbmRhYm90L3NlY3JldHNcIl0sXG4gICAgbGlzdFNlbGVjdGVkUmVwb3NGb3JPcmdTZWNyZXQ6IFtcbiAgICAgIFwiR0VUIC9vcmdzL3tvcmd9L2RlcGVuZGFib3Qvc2VjcmV0cy97c2VjcmV0X25hbWV9L3JlcG9zaXRvcmllc1wiXG4gICAgXSxcbiAgICByZW1vdmVTZWxlY3RlZFJlcG9Gcm9tT3JnU2VjcmV0OiBbXG4gICAgICBcIkRFTEVURSAvb3Jncy97b3JnfS9kZXBlbmRhYm90L3NlY3JldHMve3NlY3JldF9uYW1lfS9yZXBvc2l0b3JpZXMve3JlcG9zaXRvcnlfaWR9XCJcbiAgICBdLFxuICAgIHNldFNlbGVjdGVkUmVwb3NGb3JPcmdTZWNyZXQ6IFtcbiAgICAgIFwiUFVUIC9vcmdzL3tvcmd9L2RlcGVuZGFib3Qvc2VjcmV0cy97c2VjcmV0X25hbWV9L3JlcG9zaXRvcmllc1wiXG4gICAgXSxcbiAgICB1cGRhdGVBbGVydDogW1xuICAgICAgXCJQQVRDSCAvcmVwb3Mve293bmVyfS97cmVwb30vZGVwZW5kYWJvdC9hbGVydHMve2FsZXJ0X251bWJlcn1cIlxuICAgIF1cbiAgfSxcbiAgZGVwZW5kZW5jeUdyYXBoOiB7XG4gICAgY3JlYXRlUmVwb3NpdG9yeVNuYXBzaG90OiBbXG4gICAgICBcIlBPU1QgL3JlcG9zL3tvd25lcn0ve3JlcG99L2RlcGVuZGVuY3ktZ3JhcGgvc25hcHNob3RzXCJcbiAgICBdLFxuICAgIGRpZmZSYW5nZTogW1xuICAgICAgXCJHRVQgL3JlcG9zL3tvd25lcn0ve3JlcG99L2RlcGVuZGVuY3ktZ3JhcGgvY29tcGFyZS97YmFzZWhlYWR9XCJcbiAgICBdLFxuICAgIGV4cG9ydFNib206IFtcIkdFVCAvcmVwb3Mve293bmVyfS97cmVwb30vZGVwZW5kZW5jeS1ncmFwaC9zYm9tXCJdXG4gIH0sXG4gIGVtb2ppczogeyBnZXQ6IFtcIkdFVCAvZW1vamlzXCJdIH0sXG4gIGdpc3RzOiB7XG4gICAgY2hlY2tJc1N0YXJyZWQ6IFtcIkdFVCAvZ2lzdHMve2dpc3RfaWR9L3N0YXJcIl0sXG4gICAgY3JlYXRlOiBbXCJQT1NUIC9naXN0c1wiXSxcbiAgICBjcmVhdGVDb21tZW50OiBbXCJQT1NUIC9naXN0cy97Z2lzdF9pZH0vY29tbWVudHNcIl0sXG4gICAgZGVsZXRlOiBbXCJERUxFVEUgL2dpc3RzL3tnaXN0X2lkfVwiXSxcbiAgICBkZWxldGVDb21tZW50OiBbXCJERUxFVEUgL2dpc3RzL3tnaXN0X2lkfS9jb21tZW50cy97Y29tbWVudF9pZH1cIl0sXG4gICAgZm9yazogW1wiUE9TVCAvZ2lzdHMve2dpc3RfaWR9L2ZvcmtzXCJdLFxuICAgIGdldDogW1wiR0VUIC9naXN0cy97Z2lzdF9pZH1cIl0sXG4gICAgZ2V0Q29tbWVudDogW1wiR0VUIC9naXN0cy97Z2lzdF9pZH0vY29tbWVudHMve2NvbW1lbnRfaWR9XCJdLFxuICAgIGdldFJldmlzaW9uOiBbXCJHRVQgL2dpc3RzL3tnaXN0X2lkfS97c2hhfVwiXSxcbiAgICBsaXN0OiBbXCJHRVQgL2dpc3RzXCJdLFxuICAgIGxpc3RDb21tZW50czogW1wiR0VUIC9naXN0cy97Z2lzdF9pZH0vY29tbWVudHNcIl0sXG4gICAgbGlzdENvbW1pdHM6IFtcIkdFVCAvZ2lzdHMve2dpc3RfaWR9L2NvbW1pdHNcIl0sXG4gICAgbGlzdEZvclVzZXI6IFtcIkdFVCAvdXNlcnMve3VzZXJuYW1lfS9naXN0c1wiXSxcbiAgICBsaXN0Rm9ya3M6IFtcIkdFVCAvZ2lzdHMve2dpc3RfaWR9L2ZvcmtzXCJdLFxuICAgIGxpc3RQdWJsaWM6IFtcIkdFVCAvZ2lzdHMvcHVibGljXCJdLFxuICAgIGxpc3RTdGFycmVkOiBbXCJHRVQgL2dpc3RzL3N0YXJyZWRcIl0sXG4gICAgc3RhcjogW1wiUFVUIC9naXN0cy97Z2lzdF9pZH0vc3RhclwiXSxcbiAgICB1bnN0YXI6IFtcIkRFTEVURSAvZ2lzdHMve2dpc3RfaWR9L3N0YXJcIl0sXG4gICAgdXBkYXRlOiBbXCJQQVRDSCAvZ2lzdHMve2dpc3RfaWR9XCJdLFxuICAgIHVwZGF0ZUNvbW1lbnQ6IFtcIlBBVENIIC9naXN0cy97Z2lzdF9pZH0vY29tbWVudHMve2NvbW1lbnRfaWR9XCJdXG4gIH0sXG4gIGdpdDoge1xuICAgIGNyZWF0ZUJsb2I6IFtcIlBPU1QgL3JlcG9zL3tvd25lcn0ve3JlcG99L2dpdC9ibG9ic1wiXSxcbiAgICBjcmVhdGVDb21taXQ6IFtcIlBPU1QgL3JlcG9zL3tvd25lcn0ve3JlcG99L2dpdC9jb21taXRzXCJdLFxuICAgIGNyZWF0ZVJlZjogW1wiUE9TVCAvcmVwb3Mve293bmVyfS97cmVwb30vZ2l0L3JlZnNcIl0sXG4gICAgY3JlYXRlVGFnOiBbXCJQT1NUIC9yZXBvcy97b3duZXJ9L3tyZXBvfS9naXQvdGFnc1wiXSxcbiAgICBjcmVhdGVUcmVlOiBbXCJQT1NUIC9yZXBvcy97b3duZXJ9L3tyZXBvfS9naXQvdHJlZXNcIl0sXG4gICAgZGVsZXRlUmVmOiBbXCJERUxFVEUgL3JlcG9zL3tvd25lcn0ve3JlcG99L2dpdC9yZWZzL3tyZWZ9XCJdLFxuICAgIGdldEJsb2I6IFtcIkdFVCAvcmVwb3Mve293bmVyfS97cmVwb30vZ2l0L2Jsb2JzL3tmaWxlX3NoYX1cIl0sXG4gICAgZ2V0Q29tbWl0OiBbXCJHRVQgL3JlcG9zL3tvd25lcn0ve3JlcG99L2dpdC9jb21taXRzL3tjb21taXRfc2hhfVwiXSxcbiAgICBnZXRSZWY6IFtcIkdFVCAvcmVwb3Mve293bmVyfS97cmVwb30vZ2l0L3JlZi97cmVmfVwiXSxcbiAgICBnZXRUYWc6IFtcIkdFVCAvcmVwb3Mve293bmVyfS97cmVwb30vZ2l0L3RhZ3Mve3RhZ19zaGF9XCJdLFxuICAgIGdldFRyZWU6IFtcIkdFVCAvcmVwb3Mve293bmVyfS97cmVwb30vZ2l0L3RyZWVzL3t0cmVlX3NoYX1cIl0sXG4gICAgbGlzdE1hdGNoaW5nUmVmczogW1wiR0VUIC9yZXBvcy97b3duZXJ9L3tyZXBvfS9naXQvbWF0Y2hpbmctcmVmcy97cmVmfVwiXSxcbiAgICB1cGRhdGVSZWY6IFtcIlBBVENIIC9yZXBvcy97b3duZXJ9L3tyZXBvfS9naXQvcmVmcy97cmVmfVwiXVxuICB9LFxuICBnaXRpZ25vcmU6IHtcbiAgICBnZXRBbGxUZW1wbGF0ZXM6IFtcIkdFVCAvZ2l0aWdub3JlL3RlbXBsYXRlc1wiXSxcbiAgICBnZXRUZW1wbGF0ZTogW1wiR0VUIC9naXRpZ25vcmUvdGVtcGxhdGVzL3tuYW1lfVwiXVxuICB9LFxuICBpbnRlcmFjdGlvbnM6IHtcbiAgICBnZXRSZXN0cmljdGlvbnNGb3JBdXRoZW50aWNhdGVkVXNlcjogW1wiR0VUIC91c2VyL2ludGVyYWN0aW9uLWxpbWl0c1wiXSxcbiAgICBnZXRSZXN0cmljdGlvbnNGb3JPcmc6IFtcIkdFVCAvb3Jncy97b3JnfS9pbnRlcmFjdGlvbi1saW1pdHNcIl0sXG4gICAgZ2V0UmVzdHJpY3Rpb25zRm9yUmVwbzogW1wiR0VUIC9yZXBvcy97b3duZXJ9L3tyZXBvfS9pbnRlcmFjdGlvbi1saW1pdHNcIl0sXG4gICAgZ2V0UmVzdHJpY3Rpb25zRm9yWW91clB1YmxpY1JlcG9zOiBbXG4gICAgICBcIkdFVCAvdXNlci9pbnRlcmFjdGlvbi1saW1pdHNcIixcbiAgICAgIHt9LFxuICAgICAgeyByZW5hbWVkOiBbXCJpbnRlcmFjdGlvbnNcIiwgXCJnZXRSZXN0cmljdGlvbnNGb3JBdXRoZW50aWNhdGVkVXNlclwiXSB9XG4gICAgXSxcbiAgICByZW1vdmVSZXN0cmljdGlvbnNGb3JBdXRoZW50aWNhdGVkVXNlcjogW1wiREVMRVRFIC91c2VyL2ludGVyYWN0aW9uLWxpbWl0c1wiXSxcbiAgICByZW1vdmVSZXN0cmljdGlvbnNGb3JPcmc6IFtcIkRFTEVURSAvb3Jncy97b3JnfS9pbnRlcmFjdGlvbi1saW1pdHNcIl0sXG4gICAgcmVtb3ZlUmVzdHJpY3Rpb25zRm9yUmVwbzogW1xuICAgICAgXCJERUxFVEUgL3JlcG9zL3tvd25lcn0ve3JlcG99L2ludGVyYWN0aW9uLWxpbWl0c1wiXG4gICAgXSxcbiAgICByZW1vdmVSZXN0cmljdGlvbnNGb3JZb3VyUHVibGljUmVwb3M6IFtcbiAgICAgIFwiREVMRVRFIC91c2VyL2ludGVyYWN0aW9uLWxpbWl0c1wiLFxuICAgICAge30sXG4gICAgICB7IHJlbmFtZWQ6IFtcImludGVyYWN0aW9uc1wiLCBcInJlbW92ZVJlc3RyaWN0aW9uc0ZvckF1dGhlbnRpY2F0ZWRVc2VyXCJdIH1cbiAgICBdLFxuICAgIHNldFJlc3RyaWN0aW9uc0ZvckF1dGhlbnRpY2F0ZWRVc2VyOiBbXCJQVVQgL3VzZXIvaW50ZXJhY3Rpb24tbGltaXRzXCJdLFxuICAgIHNldFJlc3RyaWN0aW9uc0Zvck9yZzogW1wiUFVUIC9vcmdzL3tvcmd9L2ludGVyYWN0aW9uLWxpbWl0c1wiXSxcbiAgICBzZXRSZXN0cmljdGlvbnNGb3JSZXBvOiBbXCJQVVQgL3JlcG9zL3tvd25lcn0ve3JlcG99L2ludGVyYWN0aW9uLWxpbWl0c1wiXSxcbiAgICBzZXRSZXN0cmljdGlvbnNGb3JZb3VyUHVibGljUmVwb3M6IFtcbiAgICAgIFwiUFVUIC91c2VyL2ludGVyYWN0aW9uLWxpbWl0c1wiLFxuICAgICAge30sXG4gICAgICB7IHJlbmFtZWQ6IFtcImludGVyYWN0aW9uc1wiLCBcInNldFJlc3RyaWN0aW9uc0ZvckF1dGhlbnRpY2F0ZWRVc2VyXCJdIH1cbiAgICBdXG4gIH0sXG4gIGlzc3Vlczoge1xuICAgIGFkZEFzc2lnbmVlczogW1xuICAgICAgXCJQT1NUIC9yZXBvcy97b3duZXJ9L3tyZXBvfS9pc3N1ZXMve2lzc3VlX251bWJlcn0vYXNzaWduZWVzXCJcbiAgICBdLFxuICAgIGFkZExhYmVsczogW1wiUE9TVCAvcmVwb3Mve293bmVyfS97cmVwb30vaXNzdWVzL3tpc3N1ZV9udW1iZXJ9L2xhYmVsc1wiXSxcbiAgICBjaGVja1VzZXJDYW5CZUFzc2lnbmVkOiBbXCJHRVQgL3JlcG9zL3tvd25lcn0ve3JlcG99L2Fzc2lnbmVlcy97YXNzaWduZWV9XCJdLFxuICAgIGNoZWNrVXNlckNhbkJlQXNzaWduZWRUb0lzc3VlOiBbXG4gICAgICBcIkdFVCAvcmVwb3Mve293bmVyfS97cmVwb30vaXNzdWVzL3tpc3N1ZV9udW1iZXJ9L2Fzc2lnbmVlcy97YXNzaWduZWV9XCJcbiAgICBdLFxuICAgIGNyZWF0ZTogW1wiUE9TVCAvcmVwb3Mve293bmVyfS97cmVwb30vaXNzdWVzXCJdLFxuICAgIGNyZWF0ZUNvbW1lbnQ6IFtcbiAgICAgIFwiUE9TVCAvcmVwb3Mve293bmVyfS97cmVwb30vaXNzdWVzL3tpc3N1ZV9udW1iZXJ9L2NvbW1lbnRzXCJcbiAgICBdLFxuICAgIGNyZWF0ZUxhYmVsOiBbXCJQT1NUIC9yZXBvcy97b3duZXJ9L3tyZXBvfS9sYWJlbHNcIl0sXG4gICAgY3JlYXRlTWlsZXN0b25lOiBbXCJQT1NUIC9yZXBvcy97b3duZXJ9L3tyZXBvfS9taWxlc3RvbmVzXCJdLFxuICAgIGRlbGV0ZUNvbW1lbnQ6IFtcbiAgICAgIFwiREVMRVRFIC9yZXBvcy97b3duZXJ9L3tyZXBvfS9pc3N1ZXMvY29tbWVudHMve2NvbW1lbnRfaWR9XCJcbiAgICBdLFxuICAgIGRlbGV0ZUxhYmVsOiBbXCJERUxFVEUgL3JlcG9zL3tvd25lcn0ve3JlcG99L2xhYmVscy97bmFtZX1cIl0sXG4gICAgZGVsZXRlTWlsZXN0b25lOiBbXG4gICAgICBcIkRFTEVURSAvcmVwb3Mve293bmVyfS97cmVwb30vbWlsZXN0b25lcy97bWlsZXN0b25lX251bWJlcn1cIlxuICAgIF0sXG4gICAgZ2V0OiBbXCJHRVQgL3JlcG9zL3tvd25lcn0ve3JlcG99L2lzc3Vlcy97aXNzdWVfbnVtYmVyfVwiXSxcbiAgICBnZXRDb21tZW50OiBbXCJHRVQgL3JlcG9zL3tvd25lcn0ve3JlcG99L2lzc3Vlcy9jb21tZW50cy97Y29tbWVudF9pZH1cIl0sXG4gICAgZ2V0RXZlbnQ6IFtcIkdFVCAvcmVwb3Mve293bmVyfS97cmVwb30vaXNzdWVzL2V2ZW50cy97ZXZlbnRfaWR9XCJdLFxuICAgIGdldExhYmVsOiBbXCJHRVQgL3JlcG9zL3tvd25lcn0ve3JlcG99L2xhYmVscy97bmFtZX1cIl0sXG4gICAgZ2V0TWlsZXN0b25lOiBbXCJHRVQgL3JlcG9zL3tvd25lcn0ve3JlcG99L21pbGVzdG9uZXMve21pbGVzdG9uZV9udW1iZXJ9XCJdLFxuICAgIGxpc3Q6IFtcIkdFVCAvaXNzdWVzXCJdLFxuICAgIGxpc3RBc3NpZ25lZXM6IFtcIkdFVCAvcmVwb3Mve293bmVyfS97cmVwb30vYXNzaWduZWVzXCJdLFxuICAgIGxpc3RDb21tZW50czogW1wiR0VUIC9yZXBvcy97b3duZXJ9L3tyZXBvfS9pc3N1ZXMve2lzc3VlX251bWJlcn0vY29tbWVudHNcIl0sXG4gICAgbGlzdENvbW1lbnRzRm9yUmVwbzogW1wiR0VUIC9yZXBvcy97b3duZXJ9L3tyZXBvfS9pc3N1ZXMvY29tbWVudHNcIl0sXG4gICAgbGlzdEV2ZW50czogW1wiR0VUIC9yZXBvcy97b3duZXJ9L3tyZXBvfS9pc3N1ZXMve2lzc3VlX251bWJlcn0vZXZlbnRzXCJdLFxuICAgIGxpc3RFdmVudHNGb3JSZXBvOiBbXCJHRVQgL3JlcG9zL3tvd25lcn0ve3JlcG99L2lzc3Vlcy9ldmVudHNcIl0sXG4gICAgbGlzdEV2ZW50c0ZvclRpbWVsaW5lOiBbXG4gICAgICBcIkdFVCAvcmVwb3Mve293bmVyfS97cmVwb30vaXNzdWVzL3tpc3N1ZV9udW1iZXJ9L3RpbWVsaW5lXCJcbiAgICBdLFxuICAgIGxpc3RGb3JBdXRoZW50aWNhdGVkVXNlcjogW1wiR0VUIC91c2VyL2lzc3Vlc1wiXSxcbiAgICBsaXN0Rm9yT3JnOiBbXCJHRVQgL29yZ3Mve29yZ30vaXNzdWVzXCJdLFxuICAgIGxpc3RGb3JSZXBvOiBbXCJHRVQgL3JlcG9zL3tvd25lcn0ve3JlcG99L2lzc3Vlc1wiXSxcbiAgICBsaXN0TGFiZWxzRm9yTWlsZXN0b25lOiBbXG4gICAgICBcIkdFVCAvcmVwb3Mve293bmVyfS97cmVwb30vbWlsZXN0b25lcy97bWlsZXN0b25lX251bWJlcn0vbGFiZWxzXCJcbiAgICBdLFxuICAgIGxpc3RMYWJlbHNGb3JSZXBvOiBbXCJHRVQgL3JlcG9zL3tvd25lcn0ve3JlcG99L2xhYmVsc1wiXSxcbiAgICBsaXN0TGFiZWxzT25Jc3N1ZTogW1xuICAgICAgXCJHRVQgL3JlcG9zL3tvd25lcn0ve3JlcG99L2lzc3Vlcy97aXNzdWVfbnVtYmVyfS9sYWJlbHNcIlxuICAgIF0sXG4gICAgbGlzdE1pbGVzdG9uZXM6IFtcIkdFVCAvcmVwb3Mve293bmVyfS97cmVwb30vbWlsZXN0b25lc1wiXSxcbiAgICBsb2NrOiBbXCJQVVQgL3JlcG9zL3tvd25lcn0ve3JlcG99L2lzc3Vlcy97aXNzdWVfbnVtYmVyfS9sb2NrXCJdLFxuICAgIHJlbW92ZUFsbExhYmVsczogW1xuICAgICAgXCJERUxFVEUgL3JlcG9zL3tvd25lcn0ve3JlcG99L2lzc3Vlcy97aXNzdWVfbnVtYmVyfS9sYWJlbHNcIlxuICAgIF0sXG4gICAgcmVtb3ZlQXNzaWduZWVzOiBbXG4gICAgICBcIkRFTEVURSAvcmVwb3Mve293bmVyfS97cmVwb30vaXNzdWVzL3tpc3N1ZV9udW1iZXJ9L2Fzc2lnbmVlc1wiXG4gICAgXSxcbiAgICByZW1vdmVMYWJlbDogW1xuICAgICAgXCJERUxFVEUgL3JlcG9zL3tvd25lcn0ve3JlcG99L2lzc3Vlcy97aXNzdWVfbnVtYmVyfS9sYWJlbHMve25hbWV9XCJcbiAgICBdLFxuICAgIHNldExhYmVsczogW1wiUFVUIC9yZXBvcy97b3duZXJ9L3tyZXBvfS9pc3N1ZXMve2lzc3VlX251bWJlcn0vbGFiZWxzXCJdLFxuICAgIHVubG9jazogW1wiREVMRVRFIC9yZXBvcy97b3duZXJ9L3tyZXBvfS9pc3N1ZXMve2lzc3VlX251bWJlcn0vbG9ja1wiXSxcbiAgICB1cGRhdGU6IFtcIlBBVENIIC9yZXBvcy97b3duZXJ9L3tyZXBvfS9pc3N1ZXMve2lzc3VlX251bWJlcn1cIl0sXG4gICAgdXBkYXRlQ29tbWVudDogW1wiUEFUQ0ggL3JlcG9zL3tvd25lcn0ve3JlcG99L2lzc3Vlcy9jb21tZW50cy97Y29tbWVudF9pZH1cIl0sXG4gICAgdXBkYXRlTGFiZWw6IFtcIlBBVENIIC9yZXBvcy97b3duZXJ9L3tyZXBvfS9sYWJlbHMve25hbWV9XCJdLFxuICAgIHVwZGF0ZU1pbGVzdG9uZTogW1xuICAgICAgXCJQQVRDSCAvcmVwb3Mve293bmVyfS97cmVwb30vbWlsZXN0b25lcy97bWlsZXN0b25lX251bWJlcn1cIlxuICAgIF1cbiAgfSxcbiAgbGljZW5zZXM6IHtcbiAgICBnZXQ6IFtcIkdFVCAvbGljZW5zZXMve2xpY2Vuc2V9XCJdLFxuICAgIGdldEFsbENvbW1vbmx5VXNlZDogW1wiR0VUIC9saWNlbnNlc1wiXSxcbiAgICBnZXRGb3JSZXBvOiBbXCJHRVQgL3JlcG9zL3tvd25lcn0ve3JlcG99L2xpY2Vuc2VcIl1cbiAgfSxcbiAgbWFya2Rvd246IHtcbiAgICByZW5kZXI6IFtcIlBPU1QgL21hcmtkb3duXCJdLFxuICAgIHJlbmRlclJhdzogW1xuICAgICAgXCJQT1NUIC9tYXJrZG93bi9yYXdcIixcbiAgICAgIHsgaGVhZGVyczogeyBcImNvbnRlbnQtdHlwZVwiOiBcInRleHQvcGxhaW47IGNoYXJzZXQ9dXRmLThcIiB9IH1cbiAgICBdXG4gIH0sXG4gIG1ldGE6IHtcbiAgICBnZXQ6IFtcIkdFVCAvbWV0YVwiXSxcbiAgICBnZXRBbGxWZXJzaW9uczogW1wiR0VUIC92ZXJzaW9uc1wiXSxcbiAgICBnZXRPY3RvY2F0OiBbXCJHRVQgL29jdG9jYXRcIl0sXG4gICAgZ2V0WmVuOiBbXCJHRVQgL3plblwiXSxcbiAgICByb290OiBbXCJHRVQgL1wiXVxuICB9LFxuICBtaWdyYXRpb25zOiB7XG4gICAgY2FuY2VsSW1wb3J0OiBbXG4gICAgICBcIkRFTEVURSAvcmVwb3Mve293bmVyfS97cmVwb30vaW1wb3J0XCIsXG4gICAgICB7fSxcbiAgICAgIHtcbiAgICAgICAgZGVwcmVjYXRlZDogXCJvY3Rva2l0LnJlc3QubWlncmF0aW9ucy5jYW5jZWxJbXBvcnQoKSBpcyBkZXByZWNhdGVkLCBzZWUgaHR0cHM6Ly9kb2NzLmdpdGh1Yi5jb20vcmVzdC9taWdyYXRpb25zL3NvdXJjZS1pbXBvcnRzI2NhbmNlbC1hbi1pbXBvcnRcIlxuICAgICAgfVxuICAgIF0sXG4gICAgZGVsZXRlQXJjaGl2ZUZvckF1dGhlbnRpY2F0ZWRVc2VyOiBbXG4gICAgICBcIkRFTEVURSAvdXNlci9taWdyYXRpb25zL3ttaWdyYXRpb25faWR9L2FyY2hpdmVcIlxuICAgIF0sXG4gICAgZGVsZXRlQXJjaGl2ZUZvck9yZzogW1xuICAgICAgXCJERUxFVEUgL29yZ3Mve29yZ30vbWlncmF0aW9ucy97bWlncmF0aW9uX2lkfS9hcmNoaXZlXCJcbiAgICBdLFxuICAgIGRvd25sb2FkQXJjaGl2ZUZvck9yZzogW1xuICAgICAgXCJHRVQgL29yZ3Mve29yZ30vbWlncmF0aW9ucy97bWlncmF0aW9uX2lkfS9hcmNoaXZlXCJcbiAgICBdLFxuICAgIGdldEFyY2hpdmVGb3JBdXRoZW50aWNhdGVkVXNlcjogW1xuICAgICAgXCJHRVQgL3VzZXIvbWlncmF0aW9ucy97bWlncmF0aW9uX2lkfS9hcmNoaXZlXCJcbiAgICBdLFxuICAgIGdldENvbW1pdEF1dGhvcnM6IFtcbiAgICAgIFwiR0VUIC9yZXBvcy97b3duZXJ9L3tyZXBvfS9pbXBvcnQvYXV0aG9yc1wiLFxuICAgICAge30sXG4gICAgICB7XG4gICAgICAgIGRlcHJlY2F0ZWQ6IFwib2N0b2tpdC5yZXN0Lm1pZ3JhdGlvbnMuZ2V0Q29tbWl0QXV0aG9ycygpIGlzIGRlcHJlY2F0ZWQsIHNlZSBodHRwczovL2RvY3MuZ2l0aHViLmNvbS9yZXN0L21pZ3JhdGlvbnMvc291cmNlLWltcG9ydHMjZ2V0LWNvbW1pdC1hdXRob3JzXCJcbiAgICAgIH1cbiAgICBdLFxuICAgIGdldEltcG9ydFN0YXR1czogW1xuICAgICAgXCJHRVQgL3JlcG9zL3tvd25lcn0ve3JlcG99L2ltcG9ydFwiLFxuICAgICAge30sXG4gICAgICB7XG4gICAgICAgIGRlcHJlY2F0ZWQ6IFwib2N0b2tpdC5yZXN0Lm1pZ3JhdGlvbnMuZ2V0SW1wb3J0U3RhdHVzKCkgaXMgZGVwcmVjYXRlZCwgc2VlIGh0dHBzOi8vZG9jcy5naXRodWIuY29tL3Jlc3QvbWlncmF0aW9ucy9zb3VyY2UtaW1wb3J0cyNnZXQtYW4taW1wb3J0LXN0YXR1c1wiXG4gICAgICB9XG4gICAgXSxcbiAgICBnZXRMYXJnZUZpbGVzOiBbXG4gICAgICBcIkdFVCAvcmVwb3Mve293bmVyfS97cmVwb30vaW1wb3J0L2xhcmdlX2ZpbGVzXCIsXG4gICAgICB7fSxcbiAgICAgIHtcbiAgICAgICAgZGVwcmVjYXRlZDogXCJvY3Rva2l0LnJlc3QubWlncmF0aW9ucy5nZXRMYXJnZUZpbGVzKCkgaXMgZGVwcmVjYXRlZCwgc2VlIGh0dHBzOi8vZG9jcy5naXRodWIuY29tL3Jlc3QvbWlncmF0aW9ucy9zb3VyY2UtaW1wb3J0cyNnZXQtbGFyZ2UtZmlsZXNcIlxuICAgICAgfVxuICAgIF0sXG4gICAgZ2V0U3RhdHVzRm9yQXV0aGVudGljYXRlZFVzZXI6IFtcIkdFVCAvdXNlci9taWdyYXRpb25zL3ttaWdyYXRpb25faWR9XCJdLFxuICAgIGdldFN0YXR1c0Zvck9yZzogW1wiR0VUIC9vcmdzL3tvcmd9L21pZ3JhdGlvbnMve21pZ3JhdGlvbl9pZH1cIl0sXG4gICAgbGlzdEZvckF1dGhlbnRpY2F0ZWRVc2VyOiBbXCJHRVQgL3VzZXIvbWlncmF0aW9uc1wiXSxcbiAgICBsaXN0Rm9yT3JnOiBbXCJHRVQgL29yZ3Mve29yZ30vbWlncmF0aW9uc1wiXSxcbiAgICBsaXN0UmVwb3NGb3JBdXRoZW50aWNhdGVkVXNlcjogW1xuICAgICAgXCJHRVQgL3VzZXIvbWlncmF0aW9ucy97bWlncmF0aW9uX2lkfS9yZXBvc2l0b3JpZXNcIlxuICAgIF0sXG4gICAgbGlzdFJlcG9zRm9yT3JnOiBbXCJHRVQgL29yZ3Mve29yZ30vbWlncmF0aW9ucy97bWlncmF0aW9uX2lkfS9yZXBvc2l0b3JpZXNcIl0sXG4gICAgbGlzdFJlcG9zRm9yVXNlcjogW1xuICAgICAgXCJHRVQgL3VzZXIvbWlncmF0aW9ucy97bWlncmF0aW9uX2lkfS9yZXBvc2l0b3JpZXNcIixcbiAgICAgIHt9LFxuICAgICAgeyByZW5hbWVkOiBbXCJtaWdyYXRpb25zXCIsIFwibGlzdFJlcG9zRm9yQXV0aGVudGljYXRlZFVzZXJcIl0gfVxuICAgIF0sXG4gICAgbWFwQ29tbWl0QXV0aG9yOiBbXG4gICAgICBcIlBBVENIIC9yZXBvcy97b3duZXJ9L3tyZXBvfS9pbXBvcnQvYXV0aG9ycy97YXV0aG9yX2lkfVwiLFxuICAgICAge30sXG4gICAgICB7XG4gICAgICAgIGRlcHJlY2F0ZWQ6IFwib2N0b2tpdC5yZXN0Lm1pZ3JhdGlvbnMubWFwQ29tbWl0QXV0aG9yKCkgaXMgZGVwcmVjYXRlZCwgc2VlIGh0dHBzOi8vZG9jcy5naXRodWIuY29tL3Jlc3QvbWlncmF0aW9ucy9zb3VyY2UtaW1wb3J0cyNtYXAtYS1jb21taXQtYXV0aG9yXCJcbiAgICAgIH1cbiAgICBdLFxuICAgIHNldExmc1ByZWZlcmVuY2U6IFtcbiAgICAgIFwiUEFUQ0ggL3JlcG9zL3tvd25lcn0ve3JlcG99L2ltcG9ydC9sZnNcIixcbiAgICAgIHt9LFxuICAgICAge1xuICAgICAgICBkZXByZWNhdGVkOiBcIm9jdG9raXQucmVzdC5taWdyYXRpb25zLnNldExmc1ByZWZlcmVuY2UoKSBpcyBkZXByZWNhdGVkLCBzZWUgaHR0cHM6Ly9kb2NzLmdpdGh1Yi5jb20vcmVzdC9taWdyYXRpb25zL3NvdXJjZS1pbXBvcnRzI3VwZGF0ZS1naXQtbGZzLXByZWZlcmVuY2VcIlxuICAgICAgfVxuICAgIF0sXG4gICAgc3RhcnRGb3JBdXRoZW50aWNhdGVkVXNlcjogW1wiUE9TVCAvdXNlci9taWdyYXRpb25zXCJdLFxuICAgIHN0YXJ0Rm9yT3JnOiBbXCJQT1NUIC9vcmdzL3tvcmd9L21pZ3JhdGlvbnNcIl0sXG4gICAgc3RhcnRJbXBvcnQ6IFtcbiAgICAgIFwiUFVUIC9yZXBvcy97b3duZXJ9L3tyZXBvfS9pbXBvcnRcIixcbiAgICAgIHt9LFxuICAgICAge1xuICAgICAgICBkZXByZWNhdGVkOiBcIm9jdG9raXQucmVzdC5taWdyYXRpb25zLnN0YXJ0SW1wb3J0KCkgaXMgZGVwcmVjYXRlZCwgc2VlIGh0dHBzOi8vZG9jcy5naXRodWIuY29tL3Jlc3QvbWlncmF0aW9ucy9zb3VyY2UtaW1wb3J0cyNzdGFydC1hbi1pbXBvcnRcIlxuICAgICAgfVxuICAgIF0sXG4gICAgdW5sb2NrUmVwb0ZvckF1dGhlbnRpY2F0ZWRVc2VyOiBbXG4gICAgICBcIkRFTEVURSAvdXNlci9taWdyYXRpb25zL3ttaWdyYXRpb25faWR9L3JlcG9zL3tyZXBvX25hbWV9L2xvY2tcIlxuICAgIF0sXG4gICAgdW5sb2NrUmVwb0Zvck9yZzogW1xuICAgICAgXCJERUxFVEUgL29yZ3Mve29yZ30vbWlncmF0aW9ucy97bWlncmF0aW9uX2lkfS9yZXBvcy97cmVwb19uYW1lfS9sb2NrXCJcbiAgICBdLFxuICAgIHVwZGF0ZUltcG9ydDogW1xuICAgICAgXCJQQVRDSCAvcmVwb3Mve293bmVyfS97cmVwb30vaW1wb3J0XCIsXG4gICAgICB7fSxcbiAgICAgIHtcbiAgICAgICAgZGVwcmVjYXRlZDogXCJvY3Rva2l0LnJlc3QubWlncmF0aW9ucy51cGRhdGVJbXBvcnQoKSBpcyBkZXByZWNhdGVkLCBzZWUgaHR0cHM6Ly9kb2NzLmdpdGh1Yi5jb20vcmVzdC9taWdyYXRpb25zL3NvdXJjZS1pbXBvcnRzI3VwZGF0ZS1hbi1pbXBvcnRcIlxuICAgICAgfVxuICAgIF1cbiAgfSxcbiAgb2lkYzoge1xuICAgIGdldE9pZGNDdXN0b21TdWJUZW1wbGF0ZUZvck9yZzogW1xuICAgICAgXCJHRVQgL29yZ3Mve29yZ30vYWN0aW9ucy9vaWRjL2N1c3RvbWl6YXRpb24vc3ViXCJcbiAgICBdLFxuICAgIHVwZGF0ZU9pZGNDdXN0b21TdWJUZW1wbGF0ZUZvck9yZzogW1xuICAgICAgXCJQVVQgL29yZ3Mve29yZ30vYWN0aW9ucy9vaWRjL2N1c3RvbWl6YXRpb24vc3ViXCJcbiAgICBdXG4gIH0sXG4gIG9yZ3M6IHtcbiAgICBhZGRTZWN1cml0eU1hbmFnZXJUZWFtOiBbXG4gICAgICBcIlBVVCAvb3Jncy97b3JnfS9zZWN1cml0eS1tYW5hZ2Vycy90ZWFtcy97dGVhbV9zbHVnfVwiXG4gICAgXSxcbiAgICBhc3NpZ25UZWFtVG9PcmdSb2xlOiBbXG4gICAgICBcIlBVVCAvb3Jncy97b3JnfS9vcmdhbml6YXRpb24tcm9sZXMvdGVhbXMve3RlYW1fc2x1Z30ve3JvbGVfaWR9XCJcbiAgICBdLFxuICAgIGFzc2lnblVzZXJUb09yZ1JvbGU6IFtcbiAgICAgIFwiUFVUIC9vcmdzL3tvcmd9L29yZ2FuaXphdGlvbi1yb2xlcy91c2Vycy97dXNlcm5hbWV9L3tyb2xlX2lkfVwiXG4gICAgXSxcbiAgICBibG9ja1VzZXI6IFtcIlBVVCAvb3Jncy97b3JnfS9ibG9ja3Mve3VzZXJuYW1lfVwiXSxcbiAgICBjYW5jZWxJbnZpdGF0aW9uOiBbXCJERUxFVEUgL29yZ3Mve29yZ30vaW52aXRhdGlvbnMve2ludml0YXRpb25faWR9XCJdLFxuICAgIGNoZWNrQmxvY2tlZFVzZXI6IFtcIkdFVCAvb3Jncy97b3JnfS9ibG9ja3Mve3VzZXJuYW1lfVwiXSxcbiAgICBjaGVja01lbWJlcnNoaXBGb3JVc2VyOiBbXCJHRVQgL29yZ3Mve29yZ30vbWVtYmVycy97dXNlcm5hbWV9XCJdLFxuICAgIGNoZWNrUHVibGljTWVtYmVyc2hpcEZvclVzZXI6IFtcIkdFVCAvb3Jncy97b3JnfS9wdWJsaWNfbWVtYmVycy97dXNlcm5hbWV9XCJdLFxuICAgIGNvbnZlcnRNZW1iZXJUb091dHNpZGVDb2xsYWJvcmF0b3I6IFtcbiAgICAgIFwiUFVUIC9vcmdzL3tvcmd9L291dHNpZGVfY29sbGFib3JhdG9ycy97dXNlcm5hbWV9XCJcbiAgICBdLFxuICAgIGNyZWF0ZUN1c3RvbU9yZ2FuaXphdGlvblJvbGU6IFtcIlBPU1QgL29yZ3Mve29yZ30vb3JnYW5pemF0aW9uLXJvbGVzXCJdLFxuICAgIGNyZWF0ZUludml0YXRpb246IFtcIlBPU1QgL29yZ3Mve29yZ30vaW52aXRhdGlvbnNcIl0sXG4gICAgY3JlYXRlT3JVcGRhdGVDdXN0b21Qcm9wZXJ0aWVzOiBbXCJQQVRDSCAvb3Jncy97b3JnfS9wcm9wZXJ0aWVzL3NjaGVtYVwiXSxcbiAgICBjcmVhdGVPclVwZGF0ZUN1c3RvbVByb3BlcnRpZXNWYWx1ZXNGb3JSZXBvczogW1xuICAgICAgXCJQQVRDSCAvb3Jncy97b3JnfS9wcm9wZXJ0aWVzL3ZhbHVlc1wiXG4gICAgXSxcbiAgICBjcmVhdGVPclVwZGF0ZUN1c3RvbVByb3BlcnR5OiBbXG4gICAgICBcIlBVVCAvb3Jncy97b3JnfS9wcm9wZXJ0aWVzL3NjaGVtYS97Y3VzdG9tX3Byb3BlcnR5X25hbWV9XCJcbiAgICBdLFxuICAgIGNyZWF0ZVdlYmhvb2s6IFtcIlBPU1QgL29yZ3Mve29yZ30vaG9va3NcIl0sXG4gICAgZGVsZXRlOiBbXCJERUxFVEUgL29yZ3Mve29yZ31cIl0sXG4gICAgZGVsZXRlQ3VzdG9tT3JnYW5pemF0aW9uUm9sZTogW1xuICAgICAgXCJERUxFVEUgL29yZ3Mve29yZ30vb3JnYW5pemF0aW9uLXJvbGVzL3tyb2xlX2lkfVwiXG4gICAgXSxcbiAgICBkZWxldGVXZWJob29rOiBbXCJERUxFVEUgL29yZ3Mve29yZ30vaG9va3Mve2hvb2tfaWR9XCJdLFxuICAgIGVuYWJsZU9yRGlzYWJsZVNlY3VyaXR5UHJvZHVjdE9uQWxsT3JnUmVwb3M6IFtcbiAgICAgIFwiUE9TVCAvb3Jncy97b3JnfS97c2VjdXJpdHlfcHJvZHVjdH0ve2VuYWJsZW1lbnR9XCJcbiAgICBdLFxuICAgIGdldDogW1wiR0VUIC9vcmdzL3tvcmd9XCJdLFxuICAgIGdldEFsbEN1c3RvbVByb3BlcnRpZXM6IFtcIkdFVCAvb3Jncy97b3JnfS9wcm9wZXJ0aWVzL3NjaGVtYVwiXSxcbiAgICBnZXRDdXN0b21Qcm9wZXJ0eTogW1xuICAgICAgXCJHRVQgL29yZ3Mve29yZ30vcHJvcGVydGllcy9zY2hlbWEve2N1c3RvbV9wcm9wZXJ0eV9uYW1lfVwiXG4gICAgXSxcbiAgICBnZXRNZW1iZXJzaGlwRm9yQXV0aGVudGljYXRlZFVzZXI6IFtcIkdFVCAvdXNlci9tZW1iZXJzaGlwcy9vcmdzL3tvcmd9XCJdLFxuICAgIGdldE1lbWJlcnNoaXBGb3JVc2VyOiBbXCJHRVQgL29yZ3Mve29yZ30vbWVtYmVyc2hpcHMve3VzZXJuYW1lfVwiXSxcbiAgICBnZXRPcmdSb2xlOiBbXCJHRVQgL29yZ3Mve29yZ30vb3JnYW5pemF0aW9uLXJvbGVzL3tyb2xlX2lkfVwiXSxcbiAgICBnZXRXZWJob29rOiBbXCJHRVQgL29yZ3Mve29yZ30vaG9va3Mve2hvb2tfaWR9XCJdLFxuICAgIGdldFdlYmhvb2tDb25maWdGb3JPcmc6IFtcIkdFVCAvb3Jncy97b3JnfS9ob29rcy97aG9va19pZH0vY29uZmlnXCJdLFxuICAgIGdldFdlYmhvb2tEZWxpdmVyeTogW1xuICAgICAgXCJHRVQgL29yZ3Mve29yZ30vaG9va3Mve2hvb2tfaWR9L2RlbGl2ZXJpZXMve2RlbGl2ZXJ5X2lkfVwiXG4gICAgXSxcbiAgICBsaXN0OiBbXCJHRVQgL29yZ2FuaXphdGlvbnNcIl0sXG4gICAgbGlzdEFwcEluc3RhbGxhdGlvbnM6IFtcIkdFVCAvb3Jncy97b3JnfS9pbnN0YWxsYXRpb25zXCJdLFxuICAgIGxpc3RCbG9ja2VkVXNlcnM6IFtcIkdFVCAvb3Jncy97b3JnfS9ibG9ja3NcIl0sXG4gICAgbGlzdEN1c3RvbVByb3BlcnRpZXNWYWx1ZXNGb3JSZXBvczogW1wiR0VUIC9vcmdzL3tvcmd9L3Byb3BlcnRpZXMvdmFsdWVzXCJdLFxuICAgIGxpc3RGYWlsZWRJbnZpdGF0aW9uczogW1wiR0VUIC9vcmdzL3tvcmd9L2ZhaWxlZF9pbnZpdGF0aW9uc1wiXSxcbiAgICBsaXN0Rm9yQXV0aGVudGljYXRlZFVzZXI6IFtcIkdFVCAvdXNlci9vcmdzXCJdLFxuICAgIGxpc3RGb3JVc2VyOiBbXCJHRVQgL3VzZXJzL3t1c2VybmFtZX0vb3Jnc1wiXSxcbiAgICBsaXN0SW52aXRhdGlvblRlYW1zOiBbXCJHRVQgL29yZ3Mve29yZ30vaW52aXRhdGlvbnMve2ludml0YXRpb25faWR9L3RlYW1zXCJdLFxuICAgIGxpc3RNZW1iZXJzOiBbXCJHRVQgL29yZ3Mve29yZ30vbWVtYmVyc1wiXSxcbiAgICBsaXN0TWVtYmVyc2hpcHNGb3JBdXRoZW50aWNhdGVkVXNlcjogW1wiR0VUIC91c2VyL21lbWJlcnNoaXBzL29yZ3NcIl0sXG4gICAgbGlzdE9yZ1JvbGVUZWFtczogW1wiR0VUIC9vcmdzL3tvcmd9L29yZ2FuaXphdGlvbi1yb2xlcy97cm9sZV9pZH0vdGVhbXNcIl0sXG4gICAgbGlzdE9yZ1JvbGVVc2VyczogW1wiR0VUIC9vcmdzL3tvcmd9L29yZ2FuaXphdGlvbi1yb2xlcy97cm9sZV9pZH0vdXNlcnNcIl0sXG4gICAgbGlzdE9yZ1JvbGVzOiBbXCJHRVQgL29yZ3Mve29yZ30vb3JnYW5pemF0aW9uLXJvbGVzXCJdLFxuICAgIGxpc3RPcmdhbml6YXRpb25GaW5lR3JhaW5lZFBlcm1pc3Npb25zOiBbXG4gICAgICBcIkdFVCAvb3Jncy97b3JnfS9vcmdhbml6YXRpb24tZmluZS1ncmFpbmVkLXBlcm1pc3Npb25zXCJcbiAgICBdLFxuICAgIGxpc3RPdXRzaWRlQ29sbGFib3JhdG9yczogW1wiR0VUIC9vcmdzL3tvcmd9L291dHNpZGVfY29sbGFib3JhdG9yc1wiXSxcbiAgICBsaXN0UGF0R3JhbnRSZXBvc2l0b3JpZXM6IFtcbiAgICAgIFwiR0VUIC9vcmdzL3tvcmd9L3BlcnNvbmFsLWFjY2Vzcy10b2tlbnMve3BhdF9pZH0vcmVwb3NpdG9yaWVzXCJcbiAgICBdLFxuICAgIGxpc3RQYXRHcmFudFJlcXVlc3RSZXBvc2l0b3JpZXM6IFtcbiAgICAgIFwiR0VUIC9vcmdzL3tvcmd9L3BlcnNvbmFsLWFjY2Vzcy10b2tlbi1yZXF1ZXN0cy97cGF0X3JlcXVlc3RfaWR9L3JlcG9zaXRvcmllc1wiXG4gICAgXSxcbiAgICBsaXN0UGF0R3JhbnRSZXF1ZXN0czogW1wiR0VUIC9vcmdzL3tvcmd9L3BlcnNvbmFsLWFjY2Vzcy10b2tlbi1yZXF1ZXN0c1wiXSxcbiAgICBsaXN0UGF0R3JhbnRzOiBbXCJHRVQgL29yZ3Mve29yZ30vcGVyc29uYWwtYWNjZXNzLXRva2Vuc1wiXSxcbiAgICBsaXN0UGVuZGluZ0ludml0YXRpb25zOiBbXCJHRVQgL29yZ3Mve29yZ30vaW52aXRhdGlvbnNcIl0sXG4gICAgbGlzdFB1YmxpY01lbWJlcnM6IFtcIkdFVCAvb3Jncy97b3JnfS9wdWJsaWNfbWVtYmVyc1wiXSxcbiAgICBsaXN0U2VjdXJpdHlNYW5hZ2VyVGVhbXM6IFtcIkdFVCAvb3Jncy97b3JnfS9zZWN1cml0eS1tYW5hZ2Vyc1wiXSxcbiAgICBsaXN0V2ViaG9va0RlbGl2ZXJpZXM6IFtcIkdFVCAvb3Jncy97b3JnfS9ob29rcy97aG9va19pZH0vZGVsaXZlcmllc1wiXSxcbiAgICBsaXN0V2ViaG9va3M6IFtcIkdFVCAvb3Jncy97b3JnfS9ob29rc1wiXSxcbiAgICBwYXRjaEN1c3RvbU9yZ2FuaXphdGlvblJvbGU6IFtcbiAgICAgIFwiUEFUQ0ggL29yZ3Mve29yZ30vb3JnYW5pemF0aW9uLXJvbGVzL3tyb2xlX2lkfVwiXG4gICAgXSxcbiAgICBwaW5nV2ViaG9vazogW1wiUE9TVCAvb3Jncy97b3JnfS9ob29rcy97aG9va19pZH0vcGluZ3NcIl0sXG4gICAgcmVkZWxpdmVyV2ViaG9va0RlbGl2ZXJ5OiBbXG4gICAgICBcIlBPU1QgL29yZ3Mve29yZ30vaG9va3Mve2hvb2tfaWR9L2RlbGl2ZXJpZXMve2RlbGl2ZXJ5X2lkfS9hdHRlbXB0c1wiXG4gICAgXSxcbiAgICByZW1vdmVDdXN0b21Qcm9wZXJ0eTogW1xuICAgICAgXCJERUxFVEUgL29yZ3Mve29yZ30vcHJvcGVydGllcy9zY2hlbWEve2N1c3RvbV9wcm9wZXJ0eV9uYW1lfVwiXG4gICAgXSxcbiAgICByZW1vdmVNZW1iZXI6IFtcIkRFTEVURSAvb3Jncy97b3JnfS9tZW1iZXJzL3t1c2VybmFtZX1cIl0sXG4gICAgcmVtb3ZlTWVtYmVyc2hpcEZvclVzZXI6IFtcIkRFTEVURSAvb3Jncy97b3JnfS9tZW1iZXJzaGlwcy97dXNlcm5hbWV9XCJdLFxuICAgIHJlbW92ZU91dHNpZGVDb2xsYWJvcmF0b3I6IFtcbiAgICAgIFwiREVMRVRFIC9vcmdzL3tvcmd9L291dHNpZGVfY29sbGFib3JhdG9ycy97dXNlcm5hbWV9XCJcbiAgICBdLFxuICAgIHJlbW92ZVB1YmxpY01lbWJlcnNoaXBGb3JBdXRoZW50aWNhdGVkVXNlcjogW1xuICAgICAgXCJERUxFVEUgL29yZ3Mve29yZ30vcHVibGljX21lbWJlcnMve3VzZXJuYW1lfVwiXG4gICAgXSxcbiAgICByZW1vdmVTZWN1cml0eU1hbmFnZXJUZWFtOiBbXG4gICAgICBcIkRFTEVURSAvb3Jncy97b3JnfS9zZWN1cml0eS1tYW5hZ2Vycy90ZWFtcy97dGVhbV9zbHVnfVwiXG4gICAgXSxcbiAgICByZXZpZXdQYXRHcmFudFJlcXVlc3Q6IFtcbiAgICAgIFwiUE9TVCAvb3Jncy97b3JnfS9wZXJzb25hbC1hY2Nlc3MtdG9rZW4tcmVxdWVzdHMve3BhdF9yZXF1ZXN0X2lkfVwiXG4gICAgXSxcbiAgICByZXZpZXdQYXRHcmFudFJlcXVlc3RzSW5CdWxrOiBbXG4gICAgICBcIlBPU1QgL29yZ3Mve29yZ30vcGVyc29uYWwtYWNjZXNzLXRva2VuLXJlcXVlc3RzXCJcbiAgICBdLFxuICAgIHJldm9rZUFsbE9yZ1JvbGVzVGVhbTogW1xuICAgICAgXCJERUxFVEUgL29yZ3Mve29yZ30vb3JnYW5pemF0aW9uLXJvbGVzL3RlYW1zL3t0ZWFtX3NsdWd9XCJcbiAgICBdLFxuICAgIHJldm9rZUFsbE9yZ1JvbGVzVXNlcjogW1xuICAgICAgXCJERUxFVEUgL29yZ3Mve29yZ30vb3JnYW5pemF0aW9uLXJvbGVzL3VzZXJzL3t1c2VybmFtZX1cIlxuICAgIF0sXG4gICAgcmV2b2tlT3JnUm9sZVRlYW06IFtcbiAgICAgIFwiREVMRVRFIC9vcmdzL3tvcmd9L29yZ2FuaXphdGlvbi1yb2xlcy90ZWFtcy97dGVhbV9zbHVnfS97cm9sZV9pZH1cIlxuICAgIF0sXG4gICAgcmV2b2tlT3JnUm9sZVVzZXI6IFtcbiAgICAgIFwiREVMRVRFIC9vcmdzL3tvcmd9L29yZ2FuaXphdGlvbi1yb2xlcy91c2Vycy97dXNlcm5hbWV9L3tyb2xlX2lkfVwiXG4gICAgXSxcbiAgICBzZXRNZW1iZXJzaGlwRm9yVXNlcjogW1wiUFVUIC9vcmdzL3tvcmd9L21lbWJlcnNoaXBzL3t1c2VybmFtZX1cIl0sXG4gICAgc2V0UHVibGljTWVtYmVyc2hpcEZvckF1dGhlbnRpY2F0ZWRVc2VyOiBbXG4gICAgICBcIlBVVCAvb3Jncy97b3JnfS9wdWJsaWNfbWVtYmVycy97dXNlcm5hbWV9XCJcbiAgICBdLFxuICAgIHVuYmxvY2tVc2VyOiBbXCJERUxFVEUgL29yZ3Mve29yZ30vYmxvY2tzL3t1c2VybmFtZX1cIl0sXG4gICAgdXBkYXRlOiBbXCJQQVRDSCAvb3Jncy97b3JnfVwiXSxcbiAgICB1cGRhdGVNZW1iZXJzaGlwRm9yQXV0aGVudGljYXRlZFVzZXI6IFtcbiAgICAgIFwiUEFUQ0ggL3VzZXIvbWVtYmVyc2hpcHMvb3Jncy97b3JnfVwiXG4gICAgXSxcbiAgICB1cGRhdGVQYXRBY2Nlc3M6IFtcIlBPU1QgL29yZ3Mve29yZ30vcGVyc29uYWwtYWNjZXNzLXRva2Vucy97cGF0X2lkfVwiXSxcbiAgICB1cGRhdGVQYXRBY2Nlc3NlczogW1wiUE9TVCAvb3Jncy97b3JnfS9wZXJzb25hbC1hY2Nlc3MtdG9rZW5zXCJdLFxuICAgIHVwZGF0ZVdlYmhvb2s6IFtcIlBBVENIIC9vcmdzL3tvcmd9L2hvb2tzL3tob29rX2lkfVwiXSxcbiAgICB1cGRhdGVXZWJob29rQ29uZmlnRm9yT3JnOiBbXCJQQVRDSCAvb3Jncy97b3JnfS9ob29rcy97aG9va19pZH0vY29uZmlnXCJdXG4gIH0sXG4gIHBhY2thZ2VzOiB7XG4gICAgZGVsZXRlUGFja2FnZUZvckF1dGhlbnRpY2F0ZWRVc2VyOiBbXG4gICAgICBcIkRFTEVURSAvdXNlci9wYWNrYWdlcy97cGFja2FnZV90eXBlfS97cGFja2FnZV9uYW1lfVwiXG4gICAgXSxcbiAgICBkZWxldGVQYWNrYWdlRm9yT3JnOiBbXG4gICAgICBcIkRFTEVURSAvb3Jncy97b3JnfS9wYWNrYWdlcy97cGFja2FnZV90eXBlfS97cGFja2FnZV9uYW1lfVwiXG4gICAgXSxcbiAgICBkZWxldGVQYWNrYWdlRm9yVXNlcjogW1xuICAgICAgXCJERUxFVEUgL3VzZXJzL3t1c2VybmFtZX0vcGFja2FnZXMve3BhY2thZ2VfdHlwZX0ve3BhY2thZ2VfbmFtZX1cIlxuICAgIF0sXG4gICAgZGVsZXRlUGFja2FnZVZlcnNpb25Gb3JBdXRoZW50aWNhdGVkVXNlcjogW1xuICAgICAgXCJERUxFVEUgL3VzZXIvcGFja2FnZXMve3BhY2thZ2VfdHlwZX0ve3BhY2thZ2VfbmFtZX0vdmVyc2lvbnMve3BhY2thZ2VfdmVyc2lvbl9pZH1cIlxuICAgIF0sXG4gICAgZGVsZXRlUGFja2FnZVZlcnNpb25Gb3JPcmc6IFtcbiAgICAgIFwiREVMRVRFIC9vcmdzL3tvcmd9L3BhY2thZ2VzL3twYWNrYWdlX3R5cGV9L3twYWNrYWdlX25hbWV9L3ZlcnNpb25zL3twYWNrYWdlX3ZlcnNpb25faWR9XCJcbiAgICBdLFxuICAgIGRlbGV0ZVBhY2thZ2VWZXJzaW9uRm9yVXNlcjogW1xuICAgICAgXCJERUxFVEUgL3VzZXJzL3t1c2VybmFtZX0vcGFja2FnZXMve3BhY2thZ2VfdHlwZX0ve3BhY2thZ2VfbmFtZX0vdmVyc2lvbnMve3BhY2thZ2VfdmVyc2lvbl9pZH1cIlxuICAgIF0sXG4gICAgZ2V0QWxsUGFja2FnZVZlcnNpb25zRm9yQVBhY2thZ2VPd25lZEJ5QW5Pcmc6IFtcbiAgICAgIFwiR0VUIC9vcmdzL3tvcmd9L3BhY2thZ2VzL3twYWNrYWdlX3R5cGV9L3twYWNrYWdlX25hbWV9L3ZlcnNpb25zXCIsXG4gICAgICB7fSxcbiAgICAgIHsgcmVuYW1lZDogW1wicGFja2FnZXNcIiwgXCJnZXRBbGxQYWNrYWdlVmVyc2lvbnNGb3JQYWNrYWdlT3duZWRCeU9yZ1wiXSB9XG4gICAgXSxcbiAgICBnZXRBbGxQYWNrYWdlVmVyc2lvbnNGb3JBUGFja2FnZU93bmVkQnlUaGVBdXRoZW50aWNhdGVkVXNlcjogW1xuICAgICAgXCJHRVQgL3VzZXIvcGFja2FnZXMve3BhY2thZ2VfdHlwZX0ve3BhY2thZ2VfbmFtZX0vdmVyc2lvbnNcIixcbiAgICAgIHt9LFxuICAgICAge1xuICAgICAgICByZW5hbWVkOiBbXG4gICAgICAgICAgXCJwYWNrYWdlc1wiLFxuICAgICAgICAgIFwiZ2V0QWxsUGFja2FnZVZlcnNpb25zRm9yUGFja2FnZU93bmVkQnlBdXRoZW50aWNhdGVkVXNlclwiXG4gICAgICAgIF1cbiAgICAgIH1cbiAgICBdLFxuICAgIGdldEFsbFBhY2thZ2VWZXJzaW9uc0ZvclBhY2thZ2VPd25lZEJ5QXV0aGVudGljYXRlZFVzZXI6IFtcbiAgICAgIFwiR0VUIC91c2VyL3BhY2thZ2VzL3twYWNrYWdlX3R5cGV9L3twYWNrYWdlX25hbWV9L3ZlcnNpb25zXCJcbiAgICBdLFxuICAgIGdldEFsbFBhY2thZ2VWZXJzaW9uc0ZvclBhY2thZ2VPd25lZEJ5T3JnOiBbXG4gICAgICBcIkdFVCAvb3Jncy97b3JnfS9wYWNrYWdlcy97cGFja2FnZV90eXBlfS97cGFja2FnZV9uYW1lfS92ZXJzaW9uc1wiXG4gICAgXSxcbiAgICBnZXRBbGxQYWNrYWdlVmVyc2lvbnNGb3JQYWNrYWdlT3duZWRCeVVzZXI6IFtcbiAgICAgIFwiR0VUIC91c2Vycy97dXNlcm5hbWV9L3BhY2thZ2VzL3twYWNrYWdlX3R5cGV9L3twYWNrYWdlX25hbWV9L3ZlcnNpb25zXCJcbiAgICBdLFxuICAgIGdldFBhY2thZ2VGb3JBdXRoZW50aWNhdGVkVXNlcjogW1xuICAgICAgXCJHRVQgL3VzZXIvcGFja2FnZXMve3BhY2thZ2VfdHlwZX0ve3BhY2thZ2VfbmFtZX1cIlxuICAgIF0sXG4gICAgZ2V0UGFja2FnZUZvck9yZ2FuaXphdGlvbjogW1xuICAgICAgXCJHRVQgL29yZ3Mve29yZ30vcGFja2FnZXMve3BhY2thZ2VfdHlwZX0ve3BhY2thZ2VfbmFtZX1cIlxuICAgIF0sXG4gICAgZ2V0UGFja2FnZUZvclVzZXI6IFtcbiAgICAgIFwiR0VUIC91c2Vycy97dXNlcm5hbWV9L3BhY2thZ2VzL3twYWNrYWdlX3R5cGV9L3twYWNrYWdlX25hbWV9XCJcbiAgICBdLFxuICAgIGdldFBhY2thZ2VWZXJzaW9uRm9yQXV0aGVudGljYXRlZFVzZXI6IFtcbiAgICAgIFwiR0VUIC91c2VyL3BhY2thZ2VzL3twYWNrYWdlX3R5cGV9L3twYWNrYWdlX25hbWV9L3ZlcnNpb25zL3twYWNrYWdlX3ZlcnNpb25faWR9XCJcbiAgICBdLFxuICAgIGdldFBhY2thZ2VWZXJzaW9uRm9yT3JnYW5pemF0aW9uOiBbXG4gICAgICBcIkdFVCAvb3Jncy97b3JnfS9wYWNrYWdlcy97cGFja2FnZV90eXBlfS97cGFja2FnZV9uYW1lfS92ZXJzaW9ucy97cGFja2FnZV92ZXJzaW9uX2lkfVwiXG4gICAgXSxcbiAgICBnZXRQYWNrYWdlVmVyc2lvbkZvclVzZXI6IFtcbiAgICAgIFwiR0VUIC91c2Vycy97dXNlcm5hbWV9L3BhY2thZ2VzL3twYWNrYWdlX3R5cGV9L3twYWNrYWdlX25hbWV9L3ZlcnNpb25zL3twYWNrYWdlX3ZlcnNpb25faWR9XCJcbiAgICBdLFxuICAgIGxpc3REb2NrZXJNaWdyYXRpb25Db25mbGljdGluZ1BhY2thZ2VzRm9yQXV0aGVudGljYXRlZFVzZXI6IFtcbiAgICAgIFwiR0VUIC91c2VyL2RvY2tlci9jb25mbGljdHNcIlxuICAgIF0sXG4gICAgbGlzdERvY2tlck1pZ3JhdGlvbkNvbmZsaWN0aW5nUGFja2FnZXNGb3JPcmdhbml6YXRpb246IFtcbiAgICAgIFwiR0VUIC9vcmdzL3tvcmd9L2RvY2tlci9jb25mbGljdHNcIlxuICAgIF0sXG4gICAgbGlzdERvY2tlck1pZ3JhdGlvbkNvbmZsaWN0aW5nUGFja2FnZXNGb3JVc2VyOiBbXG4gICAgICBcIkdFVCAvdXNlcnMve3VzZXJuYW1lfS9kb2NrZXIvY29uZmxpY3RzXCJcbiAgICBdLFxuICAgIGxpc3RQYWNrYWdlc0ZvckF1dGhlbnRpY2F0ZWRVc2VyOiBbXCJHRVQgL3VzZXIvcGFja2FnZXNcIl0sXG4gICAgbGlzdFBhY2thZ2VzRm9yT3JnYW5pemF0aW9uOiBbXCJHRVQgL29yZ3Mve29yZ30vcGFja2FnZXNcIl0sXG4gICAgbGlzdFBhY2thZ2VzRm9yVXNlcjogW1wiR0VUIC91c2Vycy97dXNlcm5hbWV9L3BhY2thZ2VzXCJdLFxuICAgIHJlc3RvcmVQYWNrYWdlRm9yQXV0aGVudGljYXRlZFVzZXI6IFtcbiAgICAgIFwiUE9TVCAvdXNlci9wYWNrYWdlcy97cGFja2FnZV90eXBlfS97cGFja2FnZV9uYW1lfS9yZXN0b3Jlez90b2tlbn1cIlxuICAgIF0sXG4gICAgcmVzdG9yZVBhY2thZ2VGb3JPcmc6IFtcbiAgICAgIFwiUE9TVCAvb3Jncy97b3JnfS9wYWNrYWdlcy97cGFja2FnZV90eXBlfS97cGFja2FnZV9uYW1lfS9yZXN0b3Jlez90b2tlbn1cIlxuICAgIF0sXG4gICAgcmVzdG9yZVBhY2thZ2VGb3JVc2VyOiBbXG4gICAgICBcIlBPU1QgL3VzZXJzL3t1c2VybmFtZX0vcGFja2FnZXMve3BhY2thZ2VfdHlwZX0ve3BhY2thZ2VfbmFtZX0vcmVzdG9yZXs/dG9rZW59XCJcbiAgICBdLFxuICAgIHJlc3RvcmVQYWNrYWdlVmVyc2lvbkZvckF1dGhlbnRpY2F0ZWRVc2VyOiBbXG4gICAgICBcIlBPU1QgL3VzZXIvcGFja2FnZXMve3BhY2thZ2VfdHlwZX0ve3BhY2thZ2VfbmFtZX0vdmVyc2lvbnMve3BhY2thZ2VfdmVyc2lvbl9pZH0vcmVzdG9yZVwiXG4gICAgXSxcbiAgICByZXN0b3JlUGFja2FnZVZlcnNpb25Gb3JPcmc6IFtcbiAgICAgIFwiUE9TVCAvb3Jncy97b3JnfS9wYWNrYWdlcy97cGFja2FnZV90eXBlfS97cGFja2FnZV9uYW1lfS92ZXJzaW9ucy97cGFja2FnZV92ZXJzaW9uX2lkfS9yZXN0b3JlXCJcbiAgICBdLFxuICAgIHJlc3RvcmVQYWNrYWdlVmVyc2lvbkZvclVzZXI6IFtcbiAgICAgIFwiUE9TVCAvdXNlcnMve3VzZXJuYW1lfS9wYWNrYWdlcy97cGFja2FnZV90eXBlfS97cGFja2FnZV9uYW1lfS92ZXJzaW9ucy97cGFja2FnZV92ZXJzaW9uX2lkfS9yZXN0b3JlXCJcbiAgICBdXG4gIH0sXG4gIHByb2plY3RzOiB7XG4gICAgYWRkQ29sbGFib3JhdG9yOiBbXCJQVVQgL3Byb2plY3RzL3twcm9qZWN0X2lkfS9jb2xsYWJvcmF0b3JzL3t1c2VybmFtZX1cIl0sXG4gICAgY3JlYXRlQ2FyZDogW1wiUE9TVCAvcHJvamVjdHMvY29sdW1ucy97Y29sdW1uX2lkfS9jYXJkc1wiXSxcbiAgICBjcmVhdGVDb2x1bW46IFtcIlBPU1QgL3Byb2plY3RzL3twcm9qZWN0X2lkfS9jb2x1bW5zXCJdLFxuICAgIGNyZWF0ZUZvckF1dGhlbnRpY2F0ZWRVc2VyOiBbXCJQT1NUIC91c2VyL3Byb2plY3RzXCJdLFxuICAgIGNyZWF0ZUZvck9yZzogW1wiUE9TVCAvb3Jncy97b3JnfS9wcm9qZWN0c1wiXSxcbiAgICBjcmVhdGVGb3JSZXBvOiBbXCJQT1NUIC9yZXBvcy97b3duZXJ9L3tyZXBvfS9wcm9qZWN0c1wiXSxcbiAgICBkZWxldGU6IFtcIkRFTEVURSAvcHJvamVjdHMve3Byb2plY3RfaWR9XCJdLFxuICAgIGRlbGV0ZUNhcmQ6IFtcIkRFTEVURSAvcHJvamVjdHMvY29sdW1ucy9jYXJkcy97Y2FyZF9pZH1cIl0sXG4gICAgZGVsZXRlQ29sdW1uOiBbXCJERUxFVEUgL3Byb2plY3RzL2NvbHVtbnMve2NvbHVtbl9pZH1cIl0sXG4gICAgZ2V0OiBbXCJHRVQgL3Byb2plY3RzL3twcm9qZWN0X2lkfVwiXSxcbiAgICBnZXRDYXJkOiBbXCJHRVQgL3Byb2plY3RzL2NvbHVtbnMvY2FyZHMve2NhcmRfaWR9XCJdLFxuICAgIGdldENvbHVtbjogW1wiR0VUIC9wcm9qZWN0cy9jb2x1bW5zL3tjb2x1bW5faWR9XCJdLFxuICAgIGdldFBlcm1pc3Npb25Gb3JVc2VyOiBbXG4gICAgICBcIkdFVCAvcHJvamVjdHMve3Byb2plY3RfaWR9L2NvbGxhYm9yYXRvcnMve3VzZXJuYW1lfS9wZXJtaXNzaW9uXCJcbiAgICBdLFxuICAgIGxpc3RDYXJkczogW1wiR0VUIC9wcm9qZWN0cy9jb2x1bW5zL3tjb2x1bW5faWR9L2NhcmRzXCJdLFxuICAgIGxpc3RDb2xsYWJvcmF0b3JzOiBbXCJHRVQgL3Byb2plY3RzL3twcm9qZWN0X2lkfS9jb2xsYWJvcmF0b3JzXCJdLFxuICAgIGxpc3RDb2x1bW5zOiBbXCJHRVQgL3Byb2plY3RzL3twcm9qZWN0X2lkfS9jb2x1bW5zXCJdLFxuICAgIGxpc3RGb3JPcmc6IFtcIkdFVCAvb3Jncy97b3JnfS9wcm9qZWN0c1wiXSxcbiAgICBsaXN0Rm9yUmVwbzogW1wiR0VUIC9yZXBvcy97b3duZXJ9L3tyZXBvfS9wcm9qZWN0c1wiXSxcbiAgICBsaXN0Rm9yVXNlcjogW1wiR0VUIC91c2Vycy97dXNlcm5hbWV9L3Byb2plY3RzXCJdLFxuICAgIG1vdmVDYXJkOiBbXCJQT1NUIC9wcm9qZWN0cy9jb2x1bW5zL2NhcmRzL3tjYXJkX2lkfS9tb3Zlc1wiXSxcbiAgICBtb3ZlQ29sdW1uOiBbXCJQT1NUIC9wcm9qZWN0cy9jb2x1bW5zL3tjb2x1bW5faWR9L21vdmVzXCJdLFxuICAgIHJlbW92ZUNvbGxhYm9yYXRvcjogW1xuICAgICAgXCJERUxFVEUgL3Byb2plY3RzL3twcm9qZWN0X2lkfS9jb2xsYWJvcmF0b3JzL3t1c2VybmFtZX1cIlxuICAgIF0sXG4gICAgdXBkYXRlOiBbXCJQQVRDSCAvcHJvamVjdHMve3Byb2plY3RfaWR9XCJdLFxuICAgIHVwZGF0ZUNhcmQ6IFtcIlBBVENIIC9wcm9qZWN0cy9jb2x1bW5zL2NhcmRzL3tjYXJkX2lkfVwiXSxcbiAgICB1cGRhdGVDb2x1bW46IFtcIlBBVENIIC9wcm9qZWN0cy9jb2x1bW5zL3tjb2x1bW5faWR9XCJdXG4gIH0sXG4gIHB1bGxzOiB7XG4gICAgY2hlY2tJZk1lcmdlZDogW1wiR0VUIC9yZXBvcy97b3duZXJ9L3tyZXBvfS9wdWxscy97cHVsbF9udW1iZXJ9L21lcmdlXCJdLFxuICAgIGNyZWF0ZTogW1wiUE9TVCAvcmVwb3Mve293bmVyfS97cmVwb30vcHVsbHNcIl0sXG4gICAgY3JlYXRlUmVwbHlGb3JSZXZpZXdDb21tZW50OiBbXG4gICAgICBcIlBPU1QgL3JlcG9zL3tvd25lcn0ve3JlcG99L3B1bGxzL3twdWxsX251bWJlcn0vY29tbWVudHMve2NvbW1lbnRfaWR9L3JlcGxpZXNcIlxuICAgIF0sXG4gICAgY3JlYXRlUmV2aWV3OiBbXCJQT1NUIC9yZXBvcy97b3duZXJ9L3tyZXBvfS9wdWxscy97cHVsbF9udW1iZXJ9L3Jldmlld3NcIl0sXG4gICAgY3JlYXRlUmV2aWV3Q29tbWVudDogW1xuICAgICAgXCJQT1NUIC9yZXBvcy97b3duZXJ9L3tyZXBvfS9wdWxscy97cHVsbF9udW1iZXJ9L2NvbW1lbnRzXCJcbiAgICBdLFxuICAgIGRlbGV0ZVBlbmRpbmdSZXZpZXc6IFtcbiAgICAgIFwiREVMRVRFIC9yZXBvcy97b3duZXJ9L3tyZXBvfS9wdWxscy97cHVsbF9udW1iZXJ9L3Jldmlld3Mve3Jldmlld19pZH1cIlxuICAgIF0sXG4gICAgZGVsZXRlUmV2aWV3Q29tbWVudDogW1xuICAgICAgXCJERUxFVEUgL3JlcG9zL3tvd25lcn0ve3JlcG99L3B1bGxzL2NvbW1lbnRzL3tjb21tZW50X2lkfVwiXG4gICAgXSxcbiAgICBkaXNtaXNzUmV2aWV3OiBbXG4gICAgICBcIlBVVCAvcmVwb3Mve293bmVyfS97cmVwb30vcHVsbHMve3B1bGxfbnVtYmVyfS9yZXZpZXdzL3tyZXZpZXdfaWR9L2Rpc21pc3NhbHNcIlxuICAgIF0sXG4gICAgZ2V0OiBbXCJHRVQgL3JlcG9zL3tvd25lcn0ve3JlcG99L3B1bGxzL3twdWxsX251bWJlcn1cIl0sXG4gICAgZ2V0UmV2aWV3OiBbXG4gICAgICBcIkdFVCAvcmVwb3Mve293bmVyfS97cmVwb30vcHVsbHMve3B1bGxfbnVtYmVyfS9yZXZpZXdzL3tyZXZpZXdfaWR9XCJcbiAgICBdLFxuICAgIGdldFJldmlld0NvbW1lbnQ6IFtcIkdFVCAvcmVwb3Mve293bmVyfS97cmVwb30vcHVsbHMvY29tbWVudHMve2NvbW1lbnRfaWR9XCJdLFxuICAgIGxpc3Q6IFtcIkdFVCAvcmVwb3Mve293bmVyfS97cmVwb30vcHVsbHNcIl0sXG4gICAgbGlzdENvbW1lbnRzRm9yUmV2aWV3OiBbXG4gICAgICBcIkdFVCAvcmVwb3Mve293bmVyfS97cmVwb30vcHVsbHMve3B1bGxfbnVtYmVyfS9yZXZpZXdzL3tyZXZpZXdfaWR9L2NvbW1lbnRzXCJcbiAgICBdLFxuICAgIGxpc3RDb21taXRzOiBbXCJHRVQgL3JlcG9zL3tvd25lcn0ve3JlcG99L3B1bGxzL3twdWxsX251bWJlcn0vY29tbWl0c1wiXSxcbiAgICBsaXN0RmlsZXM6IFtcIkdFVCAvcmVwb3Mve293bmVyfS97cmVwb30vcHVsbHMve3B1bGxfbnVtYmVyfS9maWxlc1wiXSxcbiAgICBsaXN0UmVxdWVzdGVkUmV2aWV3ZXJzOiBbXG4gICAgICBcIkdFVCAvcmVwb3Mve293bmVyfS97cmVwb30vcHVsbHMve3B1bGxfbnVtYmVyfS9yZXF1ZXN0ZWRfcmV2aWV3ZXJzXCJcbiAgICBdLFxuICAgIGxpc3RSZXZpZXdDb21tZW50czogW1xuICAgICAgXCJHRVQgL3JlcG9zL3tvd25lcn0ve3JlcG99L3B1bGxzL3twdWxsX251bWJlcn0vY29tbWVudHNcIlxuICAgIF0sXG4gICAgbGlzdFJldmlld0NvbW1lbnRzRm9yUmVwbzogW1wiR0VUIC9yZXBvcy97b3duZXJ9L3tyZXBvfS9wdWxscy9jb21tZW50c1wiXSxcbiAgICBsaXN0UmV2aWV3czogW1wiR0VUIC9yZXBvcy97b3duZXJ9L3tyZXBvfS9wdWxscy97cHVsbF9udW1iZXJ9L3Jldmlld3NcIl0sXG4gICAgbWVyZ2U6IFtcIlBVVCAvcmVwb3Mve293bmVyfS97cmVwb30vcHVsbHMve3B1bGxfbnVtYmVyfS9tZXJnZVwiXSxcbiAgICByZW1vdmVSZXF1ZXN0ZWRSZXZpZXdlcnM6IFtcbiAgICAgIFwiREVMRVRFIC9yZXBvcy97b3duZXJ9L3tyZXBvfS9wdWxscy97cHVsbF9udW1iZXJ9L3JlcXVlc3RlZF9yZXZpZXdlcnNcIlxuICAgIF0sXG4gICAgcmVxdWVzdFJldmlld2VyczogW1xuICAgICAgXCJQT1NUIC9yZXBvcy97b3duZXJ9L3tyZXBvfS9wdWxscy97cHVsbF9udW1iZXJ9L3JlcXVlc3RlZF9yZXZpZXdlcnNcIlxuICAgIF0sXG4gICAgc3VibWl0UmV2aWV3OiBbXG4gICAgICBcIlBPU1QgL3JlcG9zL3tvd25lcn0ve3JlcG99L3B1bGxzL3twdWxsX251bWJlcn0vcmV2aWV3cy97cmV2aWV3X2lkfS9ldmVudHNcIlxuICAgIF0sXG4gICAgdXBkYXRlOiBbXCJQQVRDSCAvcmVwb3Mve293bmVyfS97cmVwb30vcHVsbHMve3B1bGxfbnVtYmVyfVwiXSxcbiAgICB1cGRhdGVCcmFuY2g6IFtcbiAgICAgIFwiUFVUIC9yZXBvcy97b3duZXJ9L3tyZXBvfS9wdWxscy97cHVsbF9udW1iZXJ9L3VwZGF0ZS1icmFuY2hcIlxuICAgIF0sXG4gICAgdXBkYXRlUmV2aWV3OiBbXG4gICAgICBcIlBVVCAvcmVwb3Mve293bmVyfS97cmVwb30vcHVsbHMve3B1bGxfbnVtYmVyfS9yZXZpZXdzL3tyZXZpZXdfaWR9XCJcbiAgICBdLFxuICAgIHVwZGF0ZVJldmlld0NvbW1lbnQ6IFtcbiAgICAgIFwiUEFUQ0ggL3JlcG9zL3tvd25lcn0ve3JlcG99L3B1bGxzL2NvbW1lbnRzL3tjb21tZW50X2lkfVwiXG4gICAgXVxuICB9LFxuICByYXRlTGltaXQ6IHsgZ2V0OiBbXCJHRVQgL3JhdGVfbGltaXRcIl0gfSxcbiAgcmVhY3Rpb25zOiB7XG4gICAgY3JlYXRlRm9yQ29tbWl0Q29tbWVudDogW1xuICAgICAgXCJQT1NUIC9yZXBvcy97b3duZXJ9L3tyZXBvfS9jb21tZW50cy97Y29tbWVudF9pZH0vcmVhY3Rpb25zXCJcbiAgICBdLFxuICAgIGNyZWF0ZUZvcklzc3VlOiBbXG4gICAgICBcIlBPU1QgL3JlcG9zL3tvd25lcn0ve3JlcG99L2lzc3Vlcy97aXNzdWVfbnVtYmVyfS9yZWFjdGlvbnNcIlxuICAgIF0sXG4gICAgY3JlYXRlRm9ySXNzdWVDb21tZW50OiBbXG4gICAgICBcIlBPU1QgL3JlcG9zL3tvd25lcn0ve3JlcG99L2lzc3Vlcy9jb21tZW50cy97Y29tbWVudF9pZH0vcmVhY3Rpb25zXCJcbiAgICBdLFxuICAgIGNyZWF0ZUZvclB1bGxSZXF1ZXN0UmV2aWV3Q29tbWVudDogW1xuICAgICAgXCJQT1NUIC9yZXBvcy97b3duZXJ9L3tyZXBvfS9wdWxscy9jb21tZW50cy97Y29tbWVudF9pZH0vcmVhY3Rpb25zXCJcbiAgICBdLFxuICAgIGNyZWF0ZUZvclJlbGVhc2U6IFtcbiAgICAgIFwiUE9TVCAvcmVwb3Mve293bmVyfS97cmVwb30vcmVsZWFzZXMve3JlbGVhc2VfaWR9L3JlYWN0aW9uc1wiXG4gICAgXSxcbiAgICBjcmVhdGVGb3JUZWFtRGlzY3Vzc2lvbkNvbW1lbnRJbk9yZzogW1xuICAgICAgXCJQT1NUIC9vcmdzL3tvcmd9L3RlYW1zL3t0ZWFtX3NsdWd9L2Rpc2N1c3Npb25zL3tkaXNjdXNzaW9uX251bWJlcn0vY29tbWVudHMve2NvbW1lbnRfbnVtYmVyfS9yZWFjdGlvbnNcIlxuICAgIF0sXG4gICAgY3JlYXRlRm9yVGVhbURpc2N1c3Npb25Jbk9yZzogW1xuICAgICAgXCJQT1NUIC9vcmdzL3tvcmd9L3RlYW1zL3t0ZWFtX3NsdWd9L2Rpc2N1c3Npb25zL3tkaXNjdXNzaW9uX251bWJlcn0vcmVhY3Rpb25zXCJcbiAgICBdLFxuICAgIGRlbGV0ZUZvckNvbW1pdENvbW1lbnQ6IFtcbiAgICAgIFwiREVMRVRFIC9yZXBvcy97b3duZXJ9L3tyZXBvfS9jb21tZW50cy97Y29tbWVudF9pZH0vcmVhY3Rpb25zL3tyZWFjdGlvbl9pZH1cIlxuICAgIF0sXG4gICAgZGVsZXRlRm9ySXNzdWU6IFtcbiAgICAgIFwiREVMRVRFIC9yZXBvcy97b3duZXJ9L3tyZXBvfS9pc3N1ZXMve2lzc3VlX251bWJlcn0vcmVhY3Rpb25zL3tyZWFjdGlvbl9pZH1cIlxuICAgIF0sXG4gICAgZGVsZXRlRm9ySXNzdWVDb21tZW50OiBbXG4gICAgICBcIkRFTEVURSAvcmVwb3Mve293bmVyfS97cmVwb30vaXNzdWVzL2NvbW1lbnRzL3tjb21tZW50X2lkfS9yZWFjdGlvbnMve3JlYWN0aW9uX2lkfVwiXG4gICAgXSxcbiAgICBkZWxldGVGb3JQdWxsUmVxdWVzdENvbW1lbnQ6IFtcbiAgICAgIFwiREVMRVRFIC9yZXBvcy97b3duZXJ9L3tyZXBvfS9wdWxscy9jb21tZW50cy97Y29tbWVudF9pZH0vcmVhY3Rpb25zL3tyZWFjdGlvbl9pZH1cIlxuICAgIF0sXG4gICAgZGVsZXRlRm9yUmVsZWFzZTogW1xuICAgICAgXCJERUxFVEUgL3JlcG9zL3tvd25lcn0ve3JlcG99L3JlbGVhc2VzL3tyZWxlYXNlX2lkfS9yZWFjdGlvbnMve3JlYWN0aW9uX2lkfVwiXG4gICAgXSxcbiAgICBkZWxldGVGb3JUZWFtRGlzY3Vzc2lvbjogW1xuICAgICAgXCJERUxFVEUgL29yZ3Mve29yZ30vdGVhbXMve3RlYW1fc2x1Z30vZGlzY3Vzc2lvbnMve2Rpc2N1c3Npb25fbnVtYmVyfS9yZWFjdGlvbnMve3JlYWN0aW9uX2lkfVwiXG4gICAgXSxcbiAgICBkZWxldGVGb3JUZWFtRGlzY3Vzc2lvbkNvbW1lbnQ6IFtcbiAgICAgIFwiREVMRVRFIC9vcmdzL3tvcmd9L3RlYW1zL3t0ZWFtX3NsdWd9L2Rpc2N1c3Npb25zL3tkaXNjdXNzaW9uX251bWJlcn0vY29tbWVudHMve2NvbW1lbnRfbnVtYmVyfS9yZWFjdGlvbnMve3JlYWN0aW9uX2lkfVwiXG4gICAgXSxcbiAgICBsaXN0Rm9yQ29tbWl0Q29tbWVudDogW1xuICAgICAgXCJHRVQgL3JlcG9zL3tvd25lcn0ve3JlcG99L2NvbW1lbnRzL3tjb21tZW50X2lkfS9yZWFjdGlvbnNcIlxuICAgIF0sXG4gICAgbGlzdEZvcklzc3VlOiBbXCJHRVQgL3JlcG9zL3tvd25lcn0ve3JlcG99L2lzc3Vlcy97aXNzdWVfbnVtYmVyfS9yZWFjdGlvbnNcIl0sXG4gICAgbGlzdEZvcklzc3VlQ29tbWVudDogW1xuICAgICAgXCJHRVQgL3JlcG9zL3tvd25lcn0ve3JlcG99L2lzc3Vlcy9jb21tZW50cy97Y29tbWVudF9pZH0vcmVhY3Rpb25zXCJcbiAgICBdLFxuICAgIGxpc3RGb3JQdWxsUmVxdWVzdFJldmlld0NvbW1lbnQ6IFtcbiAgICAgIFwiR0VUIC9yZXBvcy97b3duZXJ9L3tyZXBvfS9wdWxscy9jb21tZW50cy97Y29tbWVudF9pZH0vcmVhY3Rpb25zXCJcbiAgICBdLFxuICAgIGxpc3RGb3JSZWxlYXNlOiBbXG4gICAgICBcIkdFVCAvcmVwb3Mve293bmVyfS97cmVwb30vcmVsZWFzZXMve3JlbGVhc2VfaWR9L3JlYWN0aW9uc1wiXG4gICAgXSxcbiAgICBsaXN0Rm9yVGVhbURpc2N1c3Npb25Db21tZW50SW5Pcmc6IFtcbiAgICAgIFwiR0VUIC9vcmdzL3tvcmd9L3RlYW1zL3t0ZWFtX3NsdWd9L2Rpc2N1c3Npb25zL3tkaXNjdXNzaW9uX251bWJlcn0vY29tbWVudHMve2NvbW1lbnRfbnVtYmVyfS9yZWFjdGlvbnNcIlxuICAgIF0sXG4gICAgbGlzdEZvclRlYW1EaXNjdXNzaW9uSW5Pcmc6IFtcbiAgICAgIFwiR0VUIC9vcmdzL3tvcmd9L3RlYW1zL3t0ZWFtX3NsdWd9L2Rpc2N1c3Npb25zL3tkaXNjdXNzaW9uX251bWJlcn0vcmVhY3Rpb25zXCJcbiAgICBdXG4gIH0sXG4gIHJlcG9zOiB7XG4gICAgYWNjZXB0SW52aXRhdGlvbjogW1xuICAgICAgXCJQQVRDSCAvdXNlci9yZXBvc2l0b3J5X2ludml0YXRpb25zL3tpbnZpdGF0aW9uX2lkfVwiLFxuICAgICAge30sXG4gICAgICB7IHJlbmFtZWQ6IFtcInJlcG9zXCIsIFwiYWNjZXB0SW52aXRhdGlvbkZvckF1dGhlbnRpY2F0ZWRVc2VyXCJdIH1cbiAgICBdLFxuICAgIGFjY2VwdEludml0YXRpb25Gb3JBdXRoZW50aWNhdGVkVXNlcjogW1xuICAgICAgXCJQQVRDSCAvdXNlci9yZXBvc2l0b3J5X2ludml0YXRpb25zL3tpbnZpdGF0aW9uX2lkfVwiXG4gICAgXSxcbiAgICBhZGRBcHBBY2Nlc3NSZXN0cmljdGlvbnM6IFtcbiAgICAgIFwiUE9TVCAvcmVwb3Mve293bmVyfS97cmVwb30vYnJhbmNoZXMve2JyYW5jaH0vcHJvdGVjdGlvbi9yZXN0cmljdGlvbnMvYXBwc1wiLFxuICAgICAge30sXG4gICAgICB7IG1hcFRvRGF0YTogXCJhcHBzXCIgfVxuICAgIF0sXG4gICAgYWRkQ29sbGFib3JhdG9yOiBbXCJQVVQgL3JlcG9zL3tvd25lcn0ve3JlcG99L2NvbGxhYm9yYXRvcnMve3VzZXJuYW1lfVwiXSxcbiAgICBhZGRTdGF0dXNDaGVja0NvbnRleHRzOiBbXG4gICAgICBcIlBPU1QgL3JlcG9zL3tvd25lcn0ve3JlcG99L2JyYW5jaGVzL3ticmFuY2h9L3Byb3RlY3Rpb24vcmVxdWlyZWRfc3RhdHVzX2NoZWNrcy9jb250ZXh0c1wiLFxuICAgICAge30sXG4gICAgICB7IG1hcFRvRGF0YTogXCJjb250ZXh0c1wiIH1cbiAgICBdLFxuICAgIGFkZFRlYW1BY2Nlc3NSZXN0cmljdGlvbnM6IFtcbiAgICAgIFwiUE9TVCAvcmVwb3Mve293bmVyfS97cmVwb30vYnJhbmNoZXMve2JyYW5jaH0vcHJvdGVjdGlvbi9yZXN0cmljdGlvbnMvdGVhbXNcIixcbiAgICAgIHt9LFxuICAgICAgeyBtYXBUb0RhdGE6IFwidGVhbXNcIiB9XG4gICAgXSxcbiAgICBhZGRVc2VyQWNjZXNzUmVzdHJpY3Rpb25zOiBbXG4gICAgICBcIlBPU1QgL3JlcG9zL3tvd25lcn0ve3JlcG99L2JyYW5jaGVzL3ticmFuY2h9L3Byb3RlY3Rpb24vcmVzdHJpY3Rpb25zL3VzZXJzXCIsXG4gICAgICB7fSxcbiAgICAgIHsgbWFwVG9EYXRhOiBcInVzZXJzXCIgfVxuICAgIF0sXG4gICAgY2FuY2VsUGFnZXNEZXBsb3ltZW50OiBbXG4gICAgICBcIlBPU1QgL3JlcG9zL3tvd25lcn0ve3JlcG99L3BhZ2VzL2RlcGxveW1lbnRzL3twYWdlc19kZXBsb3ltZW50X2lkfS9jYW5jZWxcIlxuICAgIF0sXG4gICAgY2hlY2tBdXRvbWF0ZWRTZWN1cml0eUZpeGVzOiBbXG4gICAgICBcIkdFVCAvcmVwb3Mve293bmVyfS97cmVwb30vYXV0b21hdGVkLXNlY3VyaXR5LWZpeGVzXCJcbiAgICBdLFxuICAgIGNoZWNrQ29sbGFib3JhdG9yOiBbXCJHRVQgL3JlcG9zL3tvd25lcn0ve3JlcG99L2NvbGxhYm9yYXRvcnMve3VzZXJuYW1lfVwiXSxcbiAgICBjaGVja1Z1bG5lcmFiaWxpdHlBbGVydHM6IFtcbiAgICAgIFwiR0VUIC9yZXBvcy97b3duZXJ9L3tyZXBvfS92dWxuZXJhYmlsaXR5LWFsZXJ0c1wiXG4gICAgXSxcbiAgICBjb2Rlb3duZXJzRXJyb3JzOiBbXCJHRVQgL3JlcG9zL3tvd25lcn0ve3JlcG99L2NvZGVvd25lcnMvZXJyb3JzXCJdLFxuICAgIGNvbXBhcmVDb21taXRzOiBbXCJHRVQgL3JlcG9zL3tvd25lcn0ve3JlcG99L2NvbXBhcmUve2Jhc2V9Li4ue2hlYWR9XCJdLFxuICAgIGNvbXBhcmVDb21taXRzV2l0aEJhc2VoZWFkOiBbXG4gICAgICBcIkdFVCAvcmVwb3Mve293bmVyfS97cmVwb30vY29tcGFyZS97YmFzZWhlYWR9XCJcbiAgICBdLFxuICAgIGNyZWF0ZUF1dG9saW5rOiBbXCJQT1NUIC9yZXBvcy97b3duZXJ9L3tyZXBvfS9hdXRvbGlua3NcIl0sXG4gICAgY3JlYXRlQ29tbWl0Q29tbWVudDogW1xuICAgICAgXCJQT1NUIC9yZXBvcy97b3duZXJ9L3tyZXBvfS9jb21taXRzL3tjb21taXRfc2hhfS9jb21tZW50c1wiXG4gICAgXSxcbiAgICBjcmVhdGVDb21taXRTaWduYXR1cmVQcm90ZWN0aW9uOiBbXG4gICAgICBcIlBPU1QgL3JlcG9zL3tvd25lcn0ve3JlcG99L2JyYW5jaGVzL3ticmFuY2h9L3Byb3RlY3Rpb24vcmVxdWlyZWRfc2lnbmF0dXJlc1wiXG4gICAgXSxcbiAgICBjcmVhdGVDb21taXRTdGF0dXM6IFtcIlBPU1QgL3JlcG9zL3tvd25lcn0ve3JlcG99L3N0YXR1c2VzL3tzaGF9XCJdLFxuICAgIGNyZWF0ZURlcGxveUtleTogW1wiUE9TVCAvcmVwb3Mve293bmVyfS97cmVwb30va2V5c1wiXSxcbiAgICBjcmVhdGVEZXBsb3ltZW50OiBbXCJQT1NUIC9yZXBvcy97b3duZXJ9L3tyZXBvfS9kZXBsb3ltZW50c1wiXSxcbiAgICBjcmVhdGVEZXBsb3ltZW50QnJhbmNoUG9saWN5OiBbXG4gICAgICBcIlBPU1QgL3JlcG9zL3tvd25lcn0ve3JlcG99L2Vudmlyb25tZW50cy97ZW52aXJvbm1lbnRfbmFtZX0vZGVwbG95bWVudC1icmFuY2gtcG9saWNpZXNcIlxuICAgIF0sXG4gICAgY3JlYXRlRGVwbG95bWVudFByb3RlY3Rpb25SdWxlOiBbXG4gICAgICBcIlBPU1QgL3JlcG9zL3tvd25lcn0ve3JlcG99L2Vudmlyb25tZW50cy97ZW52aXJvbm1lbnRfbmFtZX0vZGVwbG95bWVudF9wcm90ZWN0aW9uX3J1bGVzXCJcbiAgICBdLFxuICAgIGNyZWF0ZURlcGxveW1lbnRTdGF0dXM6IFtcbiAgICAgIFwiUE9TVCAvcmVwb3Mve293bmVyfS97cmVwb30vZGVwbG95bWVudHMve2RlcGxveW1lbnRfaWR9L3N0YXR1c2VzXCJcbiAgICBdLFxuICAgIGNyZWF0ZURpc3BhdGNoRXZlbnQ6IFtcIlBPU1QgL3JlcG9zL3tvd25lcn0ve3JlcG99L2Rpc3BhdGNoZXNcIl0sXG4gICAgY3JlYXRlRm9yQXV0aGVudGljYXRlZFVzZXI6IFtcIlBPU1QgL3VzZXIvcmVwb3NcIl0sXG4gICAgY3JlYXRlRm9yazogW1wiUE9TVCAvcmVwb3Mve293bmVyfS97cmVwb30vZm9ya3NcIl0sXG4gICAgY3JlYXRlSW5Pcmc6IFtcIlBPU1QgL29yZ3Mve29yZ30vcmVwb3NcIl0sXG4gICAgY3JlYXRlT3JVcGRhdGVDdXN0b21Qcm9wZXJ0aWVzVmFsdWVzOiBbXG4gICAgICBcIlBBVENIIC9yZXBvcy97b3duZXJ9L3tyZXBvfS9wcm9wZXJ0aWVzL3ZhbHVlc1wiXG4gICAgXSxcbiAgICBjcmVhdGVPclVwZGF0ZUVudmlyb25tZW50OiBbXG4gICAgICBcIlBVVCAvcmVwb3Mve293bmVyfS97cmVwb30vZW52aXJvbm1lbnRzL3tlbnZpcm9ubWVudF9uYW1lfVwiXG4gICAgXSxcbiAgICBjcmVhdGVPclVwZGF0ZUZpbGVDb250ZW50czogW1wiUFVUIC9yZXBvcy97b3duZXJ9L3tyZXBvfS9jb250ZW50cy97cGF0aH1cIl0sXG4gICAgY3JlYXRlT3JnUnVsZXNldDogW1wiUE9TVCAvb3Jncy97b3JnfS9ydWxlc2V0c1wiXSxcbiAgICBjcmVhdGVQYWdlc0RlcGxveW1lbnQ6IFtcIlBPU1QgL3JlcG9zL3tvd25lcn0ve3JlcG99L3BhZ2VzL2RlcGxveW1lbnRzXCJdLFxuICAgIGNyZWF0ZVBhZ2VzU2l0ZTogW1wiUE9TVCAvcmVwb3Mve293bmVyfS97cmVwb30vcGFnZXNcIl0sXG4gICAgY3JlYXRlUmVsZWFzZTogW1wiUE9TVCAvcmVwb3Mve293bmVyfS97cmVwb30vcmVsZWFzZXNcIl0sXG4gICAgY3JlYXRlUmVwb1J1bGVzZXQ6IFtcIlBPU1QgL3JlcG9zL3tvd25lcn0ve3JlcG99L3J1bGVzZXRzXCJdLFxuICAgIGNyZWF0ZVRhZ1Byb3RlY3Rpb246IFtcIlBPU1QgL3JlcG9zL3tvd25lcn0ve3JlcG99L3RhZ3MvcHJvdGVjdGlvblwiXSxcbiAgICBjcmVhdGVVc2luZ1RlbXBsYXRlOiBbXG4gICAgICBcIlBPU1QgL3JlcG9zL3t0ZW1wbGF0ZV9vd25lcn0ve3RlbXBsYXRlX3JlcG99L2dlbmVyYXRlXCJcbiAgICBdLFxuICAgIGNyZWF0ZVdlYmhvb2s6IFtcIlBPU1QgL3JlcG9zL3tvd25lcn0ve3JlcG99L2hvb2tzXCJdLFxuICAgIGRlY2xpbmVJbnZpdGF0aW9uOiBbXG4gICAgICBcIkRFTEVURSAvdXNlci9yZXBvc2l0b3J5X2ludml0YXRpb25zL3tpbnZpdGF0aW9uX2lkfVwiLFxuICAgICAge30sXG4gICAgICB7IHJlbmFtZWQ6IFtcInJlcG9zXCIsIFwiZGVjbGluZUludml0YXRpb25Gb3JBdXRoZW50aWNhdGVkVXNlclwiXSB9XG4gICAgXSxcbiAgICBkZWNsaW5lSW52aXRhdGlvbkZvckF1dGhlbnRpY2F0ZWRVc2VyOiBbXG4gICAgICBcIkRFTEVURSAvdXNlci9yZXBvc2l0b3J5X2ludml0YXRpb25zL3tpbnZpdGF0aW9uX2lkfVwiXG4gICAgXSxcbiAgICBkZWxldGU6IFtcIkRFTEVURSAvcmVwb3Mve293bmVyfS97cmVwb31cIl0sXG4gICAgZGVsZXRlQWNjZXNzUmVzdHJpY3Rpb25zOiBbXG4gICAgICBcIkRFTEVURSAvcmVwb3Mve293bmVyfS97cmVwb30vYnJhbmNoZXMve2JyYW5jaH0vcHJvdGVjdGlvbi9yZXN0cmljdGlvbnNcIlxuICAgIF0sXG4gICAgZGVsZXRlQWRtaW5CcmFuY2hQcm90ZWN0aW9uOiBbXG4gICAgICBcIkRFTEVURSAvcmVwb3Mve293bmVyfS97cmVwb30vYnJhbmNoZXMve2JyYW5jaH0vcHJvdGVjdGlvbi9lbmZvcmNlX2FkbWluc1wiXG4gICAgXSxcbiAgICBkZWxldGVBbkVudmlyb25tZW50OiBbXG4gICAgICBcIkRFTEVURSAvcmVwb3Mve293bmVyfS97cmVwb30vZW52aXJvbm1lbnRzL3tlbnZpcm9ubWVudF9uYW1lfVwiXG4gICAgXSxcbiAgICBkZWxldGVBdXRvbGluazogW1wiREVMRVRFIC9yZXBvcy97b3duZXJ9L3tyZXBvfS9hdXRvbGlua3Mve2F1dG9saW5rX2lkfVwiXSxcbiAgICBkZWxldGVCcmFuY2hQcm90ZWN0aW9uOiBbXG4gICAgICBcIkRFTEVURSAvcmVwb3Mve293bmVyfS97cmVwb30vYnJhbmNoZXMve2JyYW5jaH0vcHJvdGVjdGlvblwiXG4gICAgXSxcbiAgICBkZWxldGVDb21taXRDb21tZW50OiBbXCJERUxFVEUgL3JlcG9zL3tvd25lcn0ve3JlcG99L2NvbW1lbnRzL3tjb21tZW50X2lkfVwiXSxcbiAgICBkZWxldGVDb21taXRTaWduYXR1cmVQcm90ZWN0aW9uOiBbXG4gICAgICBcIkRFTEVURSAvcmVwb3Mve293bmVyfS97cmVwb30vYnJhbmNoZXMve2JyYW5jaH0vcHJvdGVjdGlvbi9yZXF1aXJlZF9zaWduYXR1cmVzXCJcbiAgICBdLFxuICAgIGRlbGV0ZURlcGxveUtleTogW1wiREVMRVRFIC9yZXBvcy97b3duZXJ9L3tyZXBvfS9rZXlzL3trZXlfaWR9XCJdLFxuICAgIGRlbGV0ZURlcGxveW1lbnQ6IFtcbiAgICAgIFwiREVMRVRFIC9yZXBvcy97b3duZXJ9L3tyZXBvfS9kZXBsb3ltZW50cy97ZGVwbG95bWVudF9pZH1cIlxuICAgIF0sXG4gICAgZGVsZXRlRGVwbG95bWVudEJyYW5jaFBvbGljeTogW1xuICAgICAgXCJERUxFVEUgL3JlcG9zL3tvd25lcn0ve3JlcG99L2Vudmlyb25tZW50cy97ZW52aXJvbm1lbnRfbmFtZX0vZGVwbG95bWVudC1icmFuY2gtcG9saWNpZXMve2JyYW5jaF9wb2xpY3lfaWR9XCJcbiAgICBdLFxuICAgIGRlbGV0ZUZpbGU6IFtcIkRFTEVURSAvcmVwb3Mve293bmVyfS97cmVwb30vY29udGVudHMve3BhdGh9XCJdLFxuICAgIGRlbGV0ZUludml0YXRpb246IFtcbiAgICAgIFwiREVMRVRFIC9yZXBvcy97b3duZXJ9L3tyZXBvfS9pbnZpdGF0aW9ucy97aW52aXRhdGlvbl9pZH1cIlxuICAgIF0sXG4gICAgZGVsZXRlT3JnUnVsZXNldDogW1wiREVMRVRFIC9vcmdzL3tvcmd9L3J1bGVzZXRzL3tydWxlc2V0X2lkfVwiXSxcbiAgICBkZWxldGVQYWdlc1NpdGU6IFtcIkRFTEVURSAvcmVwb3Mve293bmVyfS97cmVwb30vcGFnZXNcIl0sXG4gICAgZGVsZXRlUHVsbFJlcXVlc3RSZXZpZXdQcm90ZWN0aW9uOiBbXG4gICAgICBcIkRFTEVURSAvcmVwb3Mve293bmVyfS97cmVwb30vYnJhbmNoZXMve2JyYW5jaH0vcHJvdGVjdGlvbi9yZXF1aXJlZF9wdWxsX3JlcXVlc3RfcmV2aWV3c1wiXG4gICAgXSxcbiAgICBkZWxldGVSZWxlYXNlOiBbXCJERUxFVEUgL3JlcG9zL3tvd25lcn0ve3JlcG99L3JlbGVhc2VzL3tyZWxlYXNlX2lkfVwiXSxcbiAgICBkZWxldGVSZWxlYXNlQXNzZXQ6IFtcbiAgICAgIFwiREVMRVRFIC9yZXBvcy97b3duZXJ9L3tyZXBvfS9yZWxlYXNlcy9hc3NldHMve2Fzc2V0X2lkfVwiXG4gICAgXSxcbiAgICBkZWxldGVSZXBvUnVsZXNldDogW1wiREVMRVRFIC9yZXBvcy97b3duZXJ9L3tyZXBvfS9ydWxlc2V0cy97cnVsZXNldF9pZH1cIl0sXG4gICAgZGVsZXRlVGFnUHJvdGVjdGlvbjogW1xuICAgICAgXCJERUxFVEUgL3JlcG9zL3tvd25lcn0ve3JlcG99L3RhZ3MvcHJvdGVjdGlvbi97dGFnX3Byb3RlY3Rpb25faWR9XCJcbiAgICBdLFxuICAgIGRlbGV0ZVdlYmhvb2s6IFtcIkRFTEVURSAvcmVwb3Mve293bmVyfS97cmVwb30vaG9va3Mve2hvb2tfaWR9XCJdLFxuICAgIGRpc2FibGVBdXRvbWF0ZWRTZWN1cml0eUZpeGVzOiBbXG4gICAgICBcIkRFTEVURSAvcmVwb3Mve293bmVyfS97cmVwb30vYXV0b21hdGVkLXNlY3VyaXR5LWZpeGVzXCJcbiAgICBdLFxuICAgIGRpc2FibGVEZXBsb3ltZW50UHJvdGVjdGlvblJ1bGU6IFtcbiAgICAgIFwiREVMRVRFIC9yZXBvcy97b3duZXJ9L3tyZXBvfS9lbnZpcm9ubWVudHMve2Vudmlyb25tZW50X25hbWV9L2RlcGxveW1lbnRfcHJvdGVjdGlvbl9ydWxlcy97cHJvdGVjdGlvbl9ydWxlX2lkfVwiXG4gICAgXSxcbiAgICBkaXNhYmxlUHJpdmF0ZVZ1bG5lcmFiaWxpdHlSZXBvcnRpbmc6IFtcbiAgICAgIFwiREVMRVRFIC9yZXBvcy97b3duZXJ9L3tyZXBvfS9wcml2YXRlLXZ1bG5lcmFiaWxpdHktcmVwb3J0aW5nXCJcbiAgICBdLFxuICAgIGRpc2FibGVWdWxuZXJhYmlsaXR5QWxlcnRzOiBbXG4gICAgICBcIkRFTEVURSAvcmVwb3Mve293bmVyfS97cmVwb30vdnVsbmVyYWJpbGl0eS1hbGVydHNcIlxuICAgIF0sXG4gICAgZG93bmxvYWRBcmNoaXZlOiBbXG4gICAgICBcIkdFVCAvcmVwb3Mve293bmVyfS97cmVwb30vemlwYmFsbC97cmVmfVwiLFxuICAgICAge30sXG4gICAgICB7IHJlbmFtZWQ6IFtcInJlcG9zXCIsIFwiZG93bmxvYWRaaXBiYWxsQXJjaGl2ZVwiXSB9XG4gICAgXSxcbiAgICBkb3dubG9hZFRhcmJhbGxBcmNoaXZlOiBbXCJHRVQgL3JlcG9zL3tvd25lcn0ve3JlcG99L3RhcmJhbGwve3JlZn1cIl0sXG4gICAgZG93bmxvYWRaaXBiYWxsQXJjaGl2ZTogW1wiR0VUIC9yZXBvcy97b3duZXJ9L3tyZXBvfS96aXBiYWxsL3tyZWZ9XCJdLFxuICAgIGVuYWJsZUF1dG9tYXRlZFNlY3VyaXR5Rml4ZXM6IFtcbiAgICAgIFwiUFVUIC9yZXBvcy97b3duZXJ9L3tyZXBvfS9hdXRvbWF0ZWQtc2VjdXJpdHktZml4ZXNcIlxuICAgIF0sXG4gICAgZW5hYmxlUHJpdmF0ZVZ1bG5lcmFiaWxpdHlSZXBvcnRpbmc6IFtcbiAgICAgIFwiUFVUIC9yZXBvcy97b3duZXJ9L3tyZXBvfS9wcml2YXRlLXZ1bG5lcmFiaWxpdHktcmVwb3J0aW5nXCJcbiAgICBdLFxuICAgIGVuYWJsZVZ1bG5lcmFiaWxpdHlBbGVydHM6IFtcbiAgICAgIFwiUFVUIC9yZXBvcy97b3duZXJ9L3tyZXBvfS92dWxuZXJhYmlsaXR5LWFsZXJ0c1wiXG4gICAgXSxcbiAgICBnZW5lcmF0ZVJlbGVhc2VOb3RlczogW1xuICAgICAgXCJQT1NUIC9yZXBvcy97b3duZXJ9L3tyZXBvfS9yZWxlYXNlcy9nZW5lcmF0ZS1ub3Rlc1wiXG4gICAgXSxcbiAgICBnZXQ6IFtcIkdFVCAvcmVwb3Mve293bmVyfS97cmVwb31cIl0sXG4gICAgZ2V0QWNjZXNzUmVzdHJpY3Rpb25zOiBbXG4gICAgICBcIkdFVCAvcmVwb3Mve293bmVyfS97cmVwb30vYnJhbmNoZXMve2JyYW5jaH0vcHJvdGVjdGlvbi9yZXN0cmljdGlvbnNcIlxuICAgIF0sXG4gICAgZ2V0QWRtaW5CcmFuY2hQcm90ZWN0aW9uOiBbXG4gICAgICBcIkdFVCAvcmVwb3Mve293bmVyfS97cmVwb30vYnJhbmNoZXMve2JyYW5jaH0vcHJvdGVjdGlvbi9lbmZvcmNlX2FkbWluc1wiXG4gICAgXSxcbiAgICBnZXRBbGxEZXBsb3ltZW50UHJvdGVjdGlvblJ1bGVzOiBbXG4gICAgICBcIkdFVCAvcmVwb3Mve293bmVyfS97cmVwb30vZW52aXJvbm1lbnRzL3tlbnZpcm9ubWVudF9uYW1lfS9kZXBsb3ltZW50X3Byb3RlY3Rpb25fcnVsZXNcIlxuICAgIF0sXG4gICAgZ2V0QWxsRW52aXJvbm1lbnRzOiBbXCJHRVQgL3JlcG9zL3tvd25lcn0ve3JlcG99L2Vudmlyb25tZW50c1wiXSxcbiAgICBnZXRBbGxTdGF0dXNDaGVja0NvbnRleHRzOiBbXG4gICAgICBcIkdFVCAvcmVwb3Mve293bmVyfS97cmVwb30vYnJhbmNoZXMve2JyYW5jaH0vcHJvdGVjdGlvbi9yZXF1aXJlZF9zdGF0dXNfY2hlY2tzL2NvbnRleHRzXCJcbiAgICBdLFxuICAgIGdldEFsbFRvcGljczogW1wiR0VUIC9yZXBvcy97b3duZXJ9L3tyZXBvfS90b3BpY3NcIl0sXG4gICAgZ2V0QXBwc1dpdGhBY2Nlc3NUb1Byb3RlY3RlZEJyYW5jaDogW1xuICAgICAgXCJHRVQgL3JlcG9zL3tvd25lcn0ve3JlcG99L2JyYW5jaGVzL3ticmFuY2h9L3Byb3RlY3Rpb24vcmVzdHJpY3Rpb25zL2FwcHNcIlxuICAgIF0sXG4gICAgZ2V0QXV0b2xpbms6IFtcIkdFVCAvcmVwb3Mve293bmVyfS97cmVwb30vYXV0b2xpbmtzL3thdXRvbGlua19pZH1cIl0sXG4gICAgZ2V0QnJhbmNoOiBbXCJHRVQgL3JlcG9zL3tvd25lcn0ve3JlcG99L2JyYW5jaGVzL3ticmFuY2h9XCJdLFxuICAgIGdldEJyYW5jaFByb3RlY3Rpb246IFtcbiAgICAgIFwiR0VUIC9yZXBvcy97b3duZXJ9L3tyZXBvfS9icmFuY2hlcy97YnJhbmNofS9wcm90ZWN0aW9uXCJcbiAgICBdLFxuICAgIGdldEJyYW5jaFJ1bGVzOiBbXCJHRVQgL3JlcG9zL3tvd25lcn0ve3JlcG99L3J1bGVzL2JyYW5jaGVzL3ticmFuY2h9XCJdLFxuICAgIGdldENsb25lczogW1wiR0VUIC9yZXBvcy97b3duZXJ9L3tyZXBvfS90cmFmZmljL2Nsb25lc1wiXSxcbiAgICBnZXRDb2RlRnJlcXVlbmN5U3RhdHM6IFtcIkdFVCAvcmVwb3Mve293bmVyfS97cmVwb30vc3RhdHMvY29kZV9mcmVxdWVuY3lcIl0sXG4gICAgZ2V0Q29sbGFib3JhdG9yUGVybWlzc2lvbkxldmVsOiBbXG4gICAgICBcIkdFVCAvcmVwb3Mve293bmVyfS97cmVwb30vY29sbGFib3JhdG9ycy97dXNlcm5hbWV9L3Blcm1pc3Npb25cIlxuICAgIF0sXG4gICAgZ2V0Q29tYmluZWRTdGF0dXNGb3JSZWY6IFtcIkdFVCAvcmVwb3Mve293bmVyfS97cmVwb30vY29tbWl0cy97cmVmfS9zdGF0dXNcIl0sXG4gICAgZ2V0Q29tbWl0OiBbXCJHRVQgL3JlcG9zL3tvd25lcn0ve3JlcG99L2NvbW1pdHMve3JlZn1cIl0sXG4gICAgZ2V0Q29tbWl0QWN0aXZpdHlTdGF0czogW1wiR0VUIC9yZXBvcy97b3duZXJ9L3tyZXBvfS9zdGF0cy9jb21taXRfYWN0aXZpdHlcIl0sXG4gICAgZ2V0Q29tbWl0Q29tbWVudDogW1wiR0VUIC9yZXBvcy97b3duZXJ9L3tyZXBvfS9jb21tZW50cy97Y29tbWVudF9pZH1cIl0sXG4gICAgZ2V0Q29tbWl0U2lnbmF0dXJlUHJvdGVjdGlvbjogW1xuICAgICAgXCJHRVQgL3JlcG9zL3tvd25lcn0ve3JlcG99L2JyYW5jaGVzL3ticmFuY2h9L3Byb3RlY3Rpb24vcmVxdWlyZWRfc2lnbmF0dXJlc1wiXG4gICAgXSxcbiAgICBnZXRDb21tdW5pdHlQcm9maWxlTWV0cmljczogW1wiR0VUIC9yZXBvcy97b3duZXJ9L3tyZXBvfS9jb21tdW5pdHkvcHJvZmlsZVwiXSxcbiAgICBnZXRDb250ZW50OiBbXCJHRVQgL3JlcG9zL3tvd25lcn0ve3JlcG99L2NvbnRlbnRzL3twYXRofVwiXSxcbiAgICBnZXRDb250cmlidXRvcnNTdGF0czogW1wiR0VUIC9yZXBvcy97b3duZXJ9L3tyZXBvfS9zdGF0cy9jb250cmlidXRvcnNcIl0sXG4gICAgZ2V0Q3VzdG9tRGVwbG95bWVudFByb3RlY3Rpb25SdWxlOiBbXG4gICAgICBcIkdFVCAvcmVwb3Mve293bmVyfS97cmVwb30vZW52aXJvbm1lbnRzL3tlbnZpcm9ubWVudF9uYW1lfS9kZXBsb3ltZW50X3Byb3RlY3Rpb25fcnVsZXMve3Byb3RlY3Rpb25fcnVsZV9pZH1cIlxuICAgIF0sXG4gICAgZ2V0Q3VzdG9tUHJvcGVydGllc1ZhbHVlczogW1wiR0VUIC9yZXBvcy97b3duZXJ9L3tyZXBvfS9wcm9wZXJ0aWVzL3ZhbHVlc1wiXSxcbiAgICBnZXREZXBsb3lLZXk6IFtcIkdFVCAvcmVwb3Mve293bmVyfS97cmVwb30va2V5cy97a2V5X2lkfVwiXSxcbiAgICBnZXREZXBsb3ltZW50OiBbXCJHRVQgL3JlcG9zL3tvd25lcn0ve3JlcG99L2RlcGxveW1lbnRzL3tkZXBsb3ltZW50X2lkfVwiXSxcbiAgICBnZXREZXBsb3ltZW50QnJhbmNoUG9saWN5OiBbXG4gICAgICBcIkdFVCAvcmVwb3Mve293bmVyfS97cmVwb30vZW52aXJvbm1lbnRzL3tlbnZpcm9ubWVudF9uYW1lfS9kZXBsb3ltZW50LWJyYW5jaC1wb2xpY2llcy97YnJhbmNoX3BvbGljeV9pZH1cIlxuICAgIF0sXG4gICAgZ2V0RGVwbG95bWVudFN0YXR1czogW1xuICAgICAgXCJHRVQgL3JlcG9zL3tvd25lcn0ve3JlcG99L2RlcGxveW1lbnRzL3tkZXBsb3ltZW50X2lkfS9zdGF0dXNlcy97c3RhdHVzX2lkfVwiXG4gICAgXSxcbiAgICBnZXRFbnZpcm9ubWVudDogW1xuICAgICAgXCJHRVQgL3JlcG9zL3tvd25lcn0ve3JlcG99L2Vudmlyb25tZW50cy97ZW52aXJvbm1lbnRfbmFtZX1cIlxuICAgIF0sXG4gICAgZ2V0TGF0ZXN0UGFnZXNCdWlsZDogW1wiR0VUIC9yZXBvcy97b3duZXJ9L3tyZXBvfS9wYWdlcy9idWlsZHMvbGF0ZXN0XCJdLFxuICAgIGdldExhdGVzdFJlbGVhc2U6IFtcIkdFVCAvcmVwb3Mve293bmVyfS97cmVwb30vcmVsZWFzZXMvbGF0ZXN0XCJdLFxuICAgIGdldE9yZ1J1bGVTdWl0ZTogW1wiR0VUIC9vcmdzL3tvcmd9L3J1bGVzZXRzL3J1bGUtc3VpdGVzL3tydWxlX3N1aXRlX2lkfVwiXSxcbiAgICBnZXRPcmdSdWxlU3VpdGVzOiBbXCJHRVQgL29yZ3Mve29yZ30vcnVsZXNldHMvcnVsZS1zdWl0ZXNcIl0sXG4gICAgZ2V0T3JnUnVsZXNldDogW1wiR0VUIC9vcmdzL3tvcmd9L3J1bGVzZXRzL3tydWxlc2V0X2lkfVwiXSxcbiAgICBnZXRPcmdSdWxlc2V0czogW1wiR0VUIC9vcmdzL3tvcmd9L3J1bGVzZXRzXCJdLFxuICAgIGdldFBhZ2VzOiBbXCJHRVQgL3JlcG9zL3tvd25lcn0ve3JlcG99L3BhZ2VzXCJdLFxuICAgIGdldFBhZ2VzQnVpbGQ6IFtcIkdFVCAvcmVwb3Mve293bmVyfS97cmVwb30vcGFnZXMvYnVpbGRzL3tidWlsZF9pZH1cIl0sXG4gICAgZ2V0UGFnZXNEZXBsb3ltZW50OiBbXG4gICAgICBcIkdFVCAvcmVwb3Mve293bmVyfS97cmVwb30vcGFnZXMvZGVwbG95bWVudHMve3BhZ2VzX2RlcGxveW1lbnRfaWR9XCJcbiAgICBdLFxuICAgIGdldFBhZ2VzSGVhbHRoQ2hlY2s6IFtcIkdFVCAvcmVwb3Mve293bmVyfS97cmVwb30vcGFnZXMvaGVhbHRoXCJdLFxuICAgIGdldFBhcnRpY2lwYXRpb25TdGF0czogW1wiR0VUIC9yZXBvcy97b3duZXJ9L3tyZXBvfS9zdGF0cy9wYXJ0aWNpcGF0aW9uXCJdLFxuICAgIGdldFB1bGxSZXF1ZXN0UmV2aWV3UHJvdGVjdGlvbjogW1xuICAgICAgXCJHRVQgL3JlcG9zL3tvd25lcn0ve3JlcG99L2JyYW5jaGVzL3ticmFuY2h9L3Byb3RlY3Rpb24vcmVxdWlyZWRfcHVsbF9yZXF1ZXN0X3Jldmlld3NcIlxuICAgIF0sXG4gICAgZ2V0UHVuY2hDYXJkU3RhdHM6IFtcIkdFVCAvcmVwb3Mve293bmVyfS97cmVwb30vc3RhdHMvcHVuY2hfY2FyZFwiXSxcbiAgICBnZXRSZWFkbWU6IFtcIkdFVCAvcmVwb3Mve293bmVyfS97cmVwb30vcmVhZG1lXCJdLFxuICAgIGdldFJlYWRtZUluRGlyZWN0b3J5OiBbXCJHRVQgL3JlcG9zL3tvd25lcn0ve3JlcG99L3JlYWRtZS97ZGlyfVwiXSxcbiAgICBnZXRSZWxlYXNlOiBbXCJHRVQgL3JlcG9zL3tvd25lcn0ve3JlcG99L3JlbGVhc2VzL3tyZWxlYXNlX2lkfVwiXSxcbiAgICBnZXRSZWxlYXNlQXNzZXQ6IFtcIkdFVCAvcmVwb3Mve293bmVyfS97cmVwb30vcmVsZWFzZXMvYXNzZXRzL3thc3NldF9pZH1cIl0sXG4gICAgZ2V0UmVsZWFzZUJ5VGFnOiBbXCJHRVQgL3JlcG9zL3tvd25lcn0ve3JlcG99L3JlbGVhc2VzL3RhZ3Mve3RhZ31cIl0sXG4gICAgZ2V0UmVwb1J1bGVTdWl0ZTogW1xuICAgICAgXCJHRVQgL3JlcG9zL3tvd25lcn0ve3JlcG99L3J1bGVzZXRzL3J1bGUtc3VpdGVzL3tydWxlX3N1aXRlX2lkfVwiXG4gICAgXSxcbiAgICBnZXRSZXBvUnVsZVN1aXRlczogW1wiR0VUIC9yZXBvcy97b3duZXJ9L3tyZXBvfS9ydWxlc2V0cy9ydWxlLXN1aXRlc1wiXSxcbiAgICBnZXRSZXBvUnVsZXNldDogW1wiR0VUIC9yZXBvcy97b3duZXJ9L3tyZXBvfS9ydWxlc2V0cy97cnVsZXNldF9pZH1cIl0sXG4gICAgZ2V0UmVwb1J1bGVzZXRzOiBbXCJHRVQgL3JlcG9zL3tvd25lcn0ve3JlcG99L3J1bGVzZXRzXCJdLFxuICAgIGdldFN0YXR1c0NoZWNrc1Byb3RlY3Rpb246IFtcbiAgICAgIFwiR0VUIC9yZXBvcy97b3duZXJ9L3tyZXBvfS9icmFuY2hlcy97YnJhbmNofS9wcm90ZWN0aW9uL3JlcXVpcmVkX3N0YXR1c19jaGVja3NcIlxuICAgIF0sXG4gICAgZ2V0VGVhbXNXaXRoQWNjZXNzVG9Qcm90ZWN0ZWRCcmFuY2g6IFtcbiAgICAgIFwiR0VUIC9yZXBvcy97b3duZXJ9L3tyZXBvfS9icmFuY2hlcy97YnJhbmNofS9wcm90ZWN0aW9uL3Jlc3RyaWN0aW9ucy90ZWFtc1wiXG4gICAgXSxcbiAgICBnZXRUb3BQYXRoczogW1wiR0VUIC9yZXBvcy97b3duZXJ9L3tyZXBvfS90cmFmZmljL3BvcHVsYXIvcGF0aHNcIl0sXG4gICAgZ2V0VG9wUmVmZXJyZXJzOiBbXCJHRVQgL3JlcG9zL3tvd25lcn0ve3JlcG99L3RyYWZmaWMvcG9wdWxhci9yZWZlcnJlcnNcIl0sXG4gICAgZ2V0VXNlcnNXaXRoQWNjZXNzVG9Qcm90ZWN0ZWRCcmFuY2g6IFtcbiAgICAgIFwiR0VUIC9yZXBvcy97b3duZXJ9L3tyZXBvfS9icmFuY2hlcy97YnJhbmNofS9wcm90ZWN0aW9uL3Jlc3RyaWN0aW9ucy91c2Vyc1wiXG4gICAgXSxcbiAgICBnZXRWaWV3czogW1wiR0VUIC9yZXBvcy97b3duZXJ9L3tyZXBvfS90cmFmZmljL3ZpZXdzXCJdLFxuICAgIGdldFdlYmhvb2s6IFtcIkdFVCAvcmVwb3Mve293bmVyfS97cmVwb30vaG9va3Mve2hvb2tfaWR9XCJdLFxuICAgIGdldFdlYmhvb2tDb25maWdGb3JSZXBvOiBbXG4gICAgICBcIkdFVCAvcmVwb3Mve293bmVyfS97cmVwb30vaG9va3Mve2hvb2tfaWR9L2NvbmZpZ1wiXG4gICAgXSxcbiAgICBnZXRXZWJob29rRGVsaXZlcnk6IFtcbiAgICAgIFwiR0VUIC9yZXBvcy97b3duZXJ9L3tyZXBvfS9ob29rcy97aG9va19pZH0vZGVsaXZlcmllcy97ZGVsaXZlcnlfaWR9XCJcbiAgICBdLFxuICAgIGxpc3RBY3Rpdml0aWVzOiBbXCJHRVQgL3JlcG9zL3tvd25lcn0ve3JlcG99L2FjdGl2aXR5XCJdLFxuICAgIGxpc3RBdXRvbGlua3M6IFtcIkdFVCAvcmVwb3Mve293bmVyfS97cmVwb30vYXV0b2xpbmtzXCJdLFxuICAgIGxpc3RCcmFuY2hlczogW1wiR0VUIC9yZXBvcy97b3duZXJ9L3tyZXBvfS9icmFuY2hlc1wiXSxcbiAgICBsaXN0QnJhbmNoZXNGb3JIZWFkQ29tbWl0OiBbXG4gICAgICBcIkdFVCAvcmVwb3Mve293bmVyfS97cmVwb30vY29tbWl0cy97Y29tbWl0X3NoYX0vYnJhbmNoZXMtd2hlcmUtaGVhZFwiXG4gICAgXSxcbiAgICBsaXN0Q29sbGFib3JhdG9yczogW1wiR0VUIC9yZXBvcy97b3duZXJ9L3tyZXBvfS9jb2xsYWJvcmF0b3JzXCJdLFxuICAgIGxpc3RDb21tZW50c0ZvckNvbW1pdDogW1xuICAgICAgXCJHRVQgL3JlcG9zL3tvd25lcn0ve3JlcG99L2NvbW1pdHMve2NvbW1pdF9zaGF9L2NvbW1lbnRzXCJcbiAgICBdLFxuICAgIGxpc3RDb21taXRDb21tZW50c0ZvclJlcG86IFtcIkdFVCAvcmVwb3Mve293bmVyfS97cmVwb30vY29tbWVudHNcIl0sXG4gICAgbGlzdENvbW1pdFN0YXR1c2VzRm9yUmVmOiBbXG4gICAgICBcIkdFVCAvcmVwb3Mve293bmVyfS97cmVwb30vY29tbWl0cy97cmVmfS9zdGF0dXNlc1wiXG4gICAgXSxcbiAgICBsaXN0Q29tbWl0czogW1wiR0VUIC9yZXBvcy97b3duZXJ9L3tyZXBvfS9jb21taXRzXCJdLFxuICAgIGxpc3RDb250cmlidXRvcnM6IFtcIkdFVCAvcmVwb3Mve293bmVyfS97cmVwb30vY29udHJpYnV0b3JzXCJdLFxuICAgIGxpc3RDdXN0b21EZXBsb3ltZW50UnVsZUludGVncmF0aW9uczogW1xuICAgICAgXCJHRVQgL3JlcG9zL3tvd25lcn0ve3JlcG99L2Vudmlyb25tZW50cy97ZW52aXJvbm1lbnRfbmFtZX0vZGVwbG95bWVudF9wcm90ZWN0aW9uX3J1bGVzL2FwcHNcIlxuICAgIF0sXG4gICAgbGlzdERlcGxveUtleXM6IFtcIkdFVCAvcmVwb3Mve293bmVyfS97cmVwb30va2V5c1wiXSxcbiAgICBsaXN0RGVwbG95bWVudEJyYW5jaFBvbGljaWVzOiBbXG4gICAgICBcIkdFVCAvcmVwb3Mve293bmVyfS97cmVwb30vZW52aXJvbm1lbnRzL3tlbnZpcm9ubWVudF9uYW1lfS9kZXBsb3ltZW50LWJyYW5jaC1wb2xpY2llc1wiXG4gICAgXSxcbiAgICBsaXN0RGVwbG95bWVudFN0YXR1c2VzOiBbXG4gICAgICBcIkdFVCAvcmVwb3Mve293bmVyfS97cmVwb30vZGVwbG95bWVudHMve2RlcGxveW1lbnRfaWR9L3N0YXR1c2VzXCJcbiAgICBdLFxuICAgIGxpc3REZXBsb3ltZW50czogW1wiR0VUIC9yZXBvcy97b3duZXJ9L3tyZXBvfS9kZXBsb3ltZW50c1wiXSxcbiAgICBsaXN0Rm9yQXV0aGVudGljYXRlZFVzZXI6IFtcIkdFVCAvdXNlci9yZXBvc1wiXSxcbiAgICBsaXN0Rm9yT3JnOiBbXCJHRVQgL29yZ3Mve29yZ30vcmVwb3NcIl0sXG4gICAgbGlzdEZvclVzZXI6IFtcIkdFVCAvdXNlcnMve3VzZXJuYW1lfS9yZXBvc1wiXSxcbiAgICBsaXN0Rm9ya3M6IFtcIkdFVCAvcmVwb3Mve293bmVyfS97cmVwb30vZm9ya3NcIl0sXG4gICAgbGlzdEludml0YXRpb25zOiBbXCJHRVQgL3JlcG9zL3tvd25lcn0ve3JlcG99L2ludml0YXRpb25zXCJdLFxuICAgIGxpc3RJbnZpdGF0aW9uc0ZvckF1dGhlbnRpY2F0ZWRVc2VyOiBbXCJHRVQgL3VzZXIvcmVwb3NpdG9yeV9pbnZpdGF0aW9uc1wiXSxcbiAgICBsaXN0TGFuZ3VhZ2VzOiBbXCJHRVQgL3JlcG9zL3tvd25lcn0ve3JlcG99L2xhbmd1YWdlc1wiXSxcbiAgICBsaXN0UGFnZXNCdWlsZHM6IFtcIkdFVCAvcmVwb3Mve293bmVyfS97cmVwb30vcGFnZXMvYnVpbGRzXCJdLFxuICAgIGxpc3RQdWJsaWM6IFtcIkdFVCAvcmVwb3NpdG9yaWVzXCJdLFxuICAgIGxpc3RQdWxsUmVxdWVzdHNBc3NvY2lhdGVkV2l0aENvbW1pdDogW1xuICAgICAgXCJHRVQgL3JlcG9zL3tvd25lcn0ve3JlcG99L2NvbW1pdHMve2NvbW1pdF9zaGF9L3B1bGxzXCJcbiAgICBdLFxuICAgIGxpc3RSZWxlYXNlQXNzZXRzOiBbXG4gICAgICBcIkdFVCAvcmVwb3Mve293bmVyfS97cmVwb30vcmVsZWFzZXMve3JlbGVhc2VfaWR9L2Fzc2V0c1wiXG4gICAgXSxcbiAgICBsaXN0UmVsZWFzZXM6IFtcIkdFVCAvcmVwb3Mve293bmVyfS97cmVwb30vcmVsZWFzZXNcIl0sXG4gICAgbGlzdFRhZ1Byb3RlY3Rpb246IFtcIkdFVCAvcmVwb3Mve293bmVyfS97cmVwb30vdGFncy9wcm90ZWN0aW9uXCJdLFxuICAgIGxpc3RUYWdzOiBbXCJHRVQgL3JlcG9zL3tvd25lcn0ve3JlcG99L3RhZ3NcIl0sXG4gICAgbGlzdFRlYW1zOiBbXCJHRVQgL3JlcG9zL3tvd25lcn0ve3JlcG99L3RlYW1zXCJdLFxuICAgIGxpc3RXZWJob29rRGVsaXZlcmllczogW1xuICAgICAgXCJHRVQgL3JlcG9zL3tvd25lcn0ve3JlcG99L2hvb2tzL3tob29rX2lkfS9kZWxpdmVyaWVzXCJcbiAgICBdLFxuICAgIGxpc3RXZWJob29rczogW1wiR0VUIC9yZXBvcy97b3duZXJ9L3tyZXBvfS9ob29rc1wiXSxcbiAgICBtZXJnZTogW1wiUE9TVCAvcmVwb3Mve293bmVyfS97cmVwb30vbWVyZ2VzXCJdLFxuICAgIG1lcmdlVXBzdHJlYW06IFtcIlBPU1QgL3JlcG9zL3tvd25lcn0ve3JlcG99L21lcmdlLXVwc3RyZWFtXCJdLFxuICAgIHBpbmdXZWJob29rOiBbXCJQT1NUIC9yZXBvcy97b3duZXJ9L3tyZXBvfS9ob29rcy97aG9va19pZH0vcGluZ3NcIl0sXG4gICAgcmVkZWxpdmVyV2ViaG9va0RlbGl2ZXJ5OiBbXG4gICAgICBcIlBPU1QgL3JlcG9zL3tvd25lcn0ve3JlcG99L2hvb2tzL3tob29rX2lkfS9kZWxpdmVyaWVzL3tkZWxpdmVyeV9pZH0vYXR0ZW1wdHNcIlxuICAgIF0sXG4gICAgcmVtb3ZlQXBwQWNjZXNzUmVzdHJpY3Rpb25zOiBbXG4gICAgICBcIkRFTEVURSAvcmVwb3Mve293bmVyfS97cmVwb30vYnJhbmNoZXMve2JyYW5jaH0vcHJvdGVjdGlvbi9yZXN0cmljdGlvbnMvYXBwc1wiLFxuICAgICAge30sXG4gICAgICB7IG1hcFRvRGF0YTogXCJhcHBzXCIgfVxuICAgIF0sXG4gICAgcmVtb3ZlQ29sbGFib3JhdG9yOiBbXG4gICAgICBcIkRFTEVURSAvcmVwb3Mve293bmVyfS97cmVwb30vY29sbGFib3JhdG9ycy97dXNlcm5hbWV9XCJcbiAgICBdLFxuICAgIHJlbW92ZVN0YXR1c0NoZWNrQ29udGV4dHM6IFtcbiAgICAgIFwiREVMRVRFIC9yZXBvcy97b3duZXJ9L3tyZXBvfS9icmFuY2hlcy97YnJhbmNofS9wcm90ZWN0aW9uL3JlcXVpcmVkX3N0YXR1c19jaGVja3MvY29udGV4dHNcIixcbiAgICAgIHt9LFxuICAgICAgeyBtYXBUb0RhdGE6IFwiY29udGV4dHNcIiB9XG4gICAgXSxcbiAgICByZW1vdmVTdGF0dXNDaGVja1Byb3RlY3Rpb246IFtcbiAgICAgIFwiREVMRVRFIC9yZXBvcy97b3duZXJ9L3tyZXBvfS9icmFuY2hlcy97YnJhbmNofS9wcm90ZWN0aW9uL3JlcXVpcmVkX3N0YXR1c19jaGVja3NcIlxuICAgIF0sXG4gICAgcmVtb3ZlVGVhbUFjY2Vzc1Jlc3RyaWN0aW9uczogW1xuICAgICAgXCJERUxFVEUgL3JlcG9zL3tvd25lcn0ve3JlcG99L2JyYW5jaGVzL3ticmFuY2h9L3Byb3RlY3Rpb24vcmVzdHJpY3Rpb25zL3RlYW1zXCIsXG4gICAgICB7fSxcbiAgICAgIHsgbWFwVG9EYXRhOiBcInRlYW1zXCIgfVxuICAgIF0sXG4gICAgcmVtb3ZlVXNlckFjY2Vzc1Jlc3RyaWN0aW9uczogW1xuICAgICAgXCJERUxFVEUgL3JlcG9zL3tvd25lcn0ve3JlcG99L2JyYW5jaGVzL3ticmFuY2h9L3Byb3RlY3Rpb24vcmVzdHJpY3Rpb25zL3VzZXJzXCIsXG4gICAgICB7fSxcbiAgICAgIHsgbWFwVG9EYXRhOiBcInVzZXJzXCIgfVxuICAgIF0sXG4gICAgcmVuYW1lQnJhbmNoOiBbXCJQT1NUIC9yZXBvcy97b3duZXJ9L3tyZXBvfS9icmFuY2hlcy97YnJhbmNofS9yZW5hbWVcIl0sXG4gICAgcmVwbGFjZUFsbFRvcGljczogW1wiUFVUIC9yZXBvcy97b3duZXJ9L3tyZXBvfS90b3BpY3NcIl0sXG4gICAgcmVxdWVzdFBhZ2VzQnVpbGQ6IFtcIlBPU1QgL3JlcG9zL3tvd25lcn0ve3JlcG99L3BhZ2VzL2J1aWxkc1wiXSxcbiAgICBzZXRBZG1pbkJyYW5jaFByb3RlY3Rpb246IFtcbiAgICAgIFwiUE9TVCAvcmVwb3Mve293bmVyfS97cmVwb30vYnJhbmNoZXMve2JyYW5jaH0vcHJvdGVjdGlvbi9lbmZvcmNlX2FkbWluc1wiXG4gICAgXSxcbiAgICBzZXRBcHBBY2Nlc3NSZXN0cmljdGlvbnM6IFtcbiAgICAgIFwiUFVUIC9yZXBvcy97b3duZXJ9L3tyZXBvfS9icmFuY2hlcy97YnJhbmNofS9wcm90ZWN0aW9uL3Jlc3RyaWN0aW9ucy9hcHBzXCIsXG4gICAgICB7fSxcbiAgICAgIHsgbWFwVG9EYXRhOiBcImFwcHNcIiB9XG4gICAgXSxcbiAgICBzZXRTdGF0dXNDaGVja0NvbnRleHRzOiBbXG4gICAgICBcIlBVVCAvcmVwb3Mve293bmVyfS97cmVwb30vYnJhbmNoZXMve2JyYW5jaH0vcHJvdGVjdGlvbi9yZXF1aXJlZF9zdGF0dXNfY2hlY2tzL2NvbnRleHRzXCIsXG4gICAgICB7fSxcbiAgICAgIHsgbWFwVG9EYXRhOiBcImNvbnRleHRzXCIgfVxuICAgIF0sXG4gICAgc2V0VGVhbUFjY2Vzc1Jlc3RyaWN0aW9uczogW1xuICAgICAgXCJQVVQgL3JlcG9zL3tvd25lcn0ve3JlcG99L2JyYW5jaGVzL3ticmFuY2h9L3Byb3RlY3Rpb24vcmVzdHJpY3Rpb25zL3RlYW1zXCIsXG4gICAgICB7fSxcbiAgICAgIHsgbWFwVG9EYXRhOiBcInRlYW1zXCIgfVxuICAgIF0sXG4gICAgc2V0VXNlckFjY2Vzc1Jlc3RyaWN0aW9uczogW1xuICAgICAgXCJQVVQgL3JlcG9zL3tvd25lcn0ve3JlcG99L2JyYW5jaGVzL3ticmFuY2h9L3Byb3RlY3Rpb24vcmVzdHJpY3Rpb25zL3VzZXJzXCIsXG4gICAgICB7fSxcbiAgICAgIHsgbWFwVG9EYXRhOiBcInVzZXJzXCIgfVxuICAgIF0sXG4gICAgdGVzdFB1c2hXZWJob29rOiBbXCJQT1NUIC9yZXBvcy97b3duZXJ9L3tyZXBvfS9ob29rcy97aG9va19pZH0vdGVzdHNcIl0sXG4gICAgdHJhbnNmZXI6IFtcIlBPU1QgL3JlcG9zL3tvd25lcn0ve3JlcG99L3RyYW5zZmVyXCJdLFxuICAgIHVwZGF0ZTogW1wiUEFUQ0ggL3JlcG9zL3tvd25lcn0ve3JlcG99XCJdLFxuICAgIHVwZGF0ZUJyYW5jaFByb3RlY3Rpb246IFtcbiAgICAgIFwiUFVUIC9yZXBvcy97b3duZXJ9L3tyZXBvfS9icmFuY2hlcy97YnJhbmNofS9wcm90ZWN0aW9uXCJcbiAgICBdLFxuICAgIHVwZGF0ZUNvbW1pdENvbW1lbnQ6IFtcIlBBVENIIC9yZXBvcy97b3duZXJ9L3tyZXBvfS9jb21tZW50cy97Y29tbWVudF9pZH1cIl0sXG4gICAgdXBkYXRlRGVwbG95bWVudEJyYW5jaFBvbGljeTogW1xuICAgICAgXCJQVVQgL3JlcG9zL3tvd25lcn0ve3JlcG99L2Vudmlyb25tZW50cy97ZW52aXJvbm1lbnRfbmFtZX0vZGVwbG95bWVudC1icmFuY2gtcG9saWNpZXMve2JyYW5jaF9wb2xpY3lfaWR9XCJcbiAgICBdLFxuICAgIHVwZGF0ZUluZm9ybWF0aW9uQWJvdXRQYWdlc1NpdGU6IFtcIlBVVCAvcmVwb3Mve293bmVyfS97cmVwb30vcGFnZXNcIl0sXG4gICAgdXBkYXRlSW52aXRhdGlvbjogW1xuICAgICAgXCJQQVRDSCAvcmVwb3Mve293bmVyfS97cmVwb30vaW52aXRhdGlvbnMve2ludml0YXRpb25faWR9XCJcbiAgICBdLFxuICAgIHVwZGF0ZU9yZ1J1bGVzZXQ6IFtcIlBVVCAvb3Jncy97b3JnfS9ydWxlc2V0cy97cnVsZXNldF9pZH1cIl0sXG4gICAgdXBkYXRlUHVsbFJlcXVlc3RSZXZpZXdQcm90ZWN0aW9uOiBbXG4gICAgICBcIlBBVENIIC9yZXBvcy97b3duZXJ9L3tyZXBvfS9icmFuY2hlcy97YnJhbmNofS9wcm90ZWN0aW9uL3JlcXVpcmVkX3B1bGxfcmVxdWVzdF9yZXZpZXdzXCJcbiAgICBdLFxuICAgIHVwZGF0ZVJlbGVhc2U6IFtcIlBBVENIIC9yZXBvcy97b3duZXJ9L3tyZXBvfS9yZWxlYXNlcy97cmVsZWFzZV9pZH1cIl0sXG4gICAgdXBkYXRlUmVsZWFzZUFzc2V0OiBbXG4gICAgICBcIlBBVENIIC9yZXBvcy97b3duZXJ9L3tyZXBvfS9yZWxlYXNlcy9hc3NldHMve2Fzc2V0X2lkfVwiXG4gICAgXSxcbiAgICB1cGRhdGVSZXBvUnVsZXNldDogW1wiUFVUIC9yZXBvcy97b3duZXJ9L3tyZXBvfS9ydWxlc2V0cy97cnVsZXNldF9pZH1cIl0sXG4gICAgdXBkYXRlU3RhdHVzQ2hlY2tQb3RlY3Rpb246IFtcbiAgICAgIFwiUEFUQ0ggL3JlcG9zL3tvd25lcn0ve3JlcG99L2JyYW5jaGVzL3ticmFuY2h9L3Byb3RlY3Rpb24vcmVxdWlyZWRfc3RhdHVzX2NoZWNrc1wiLFxuICAgICAge30sXG4gICAgICB7IHJlbmFtZWQ6IFtcInJlcG9zXCIsIFwidXBkYXRlU3RhdHVzQ2hlY2tQcm90ZWN0aW9uXCJdIH1cbiAgICBdLFxuICAgIHVwZGF0ZVN0YXR1c0NoZWNrUHJvdGVjdGlvbjogW1xuICAgICAgXCJQQVRDSCAvcmVwb3Mve293bmVyfS97cmVwb30vYnJhbmNoZXMve2JyYW5jaH0vcHJvdGVjdGlvbi9yZXF1aXJlZF9zdGF0dXNfY2hlY2tzXCJcbiAgICBdLFxuICAgIHVwZGF0ZVdlYmhvb2s6IFtcIlBBVENIIC9yZXBvcy97b3duZXJ9L3tyZXBvfS9ob29rcy97aG9va19pZH1cIl0sXG4gICAgdXBkYXRlV2ViaG9va0NvbmZpZ0ZvclJlcG86IFtcbiAgICAgIFwiUEFUQ0ggL3JlcG9zL3tvd25lcn0ve3JlcG99L2hvb2tzL3tob29rX2lkfS9jb25maWdcIlxuICAgIF0sXG4gICAgdXBsb2FkUmVsZWFzZUFzc2V0OiBbXG4gICAgICBcIlBPU1QgL3JlcG9zL3tvd25lcn0ve3JlcG99L3JlbGVhc2VzL3tyZWxlYXNlX2lkfS9hc3NldHN7P25hbWUsbGFiZWx9XCIsXG4gICAgICB7IGJhc2VVcmw6IFwiaHR0cHM6Ly91cGxvYWRzLmdpdGh1Yi5jb21cIiB9XG4gICAgXVxuICB9LFxuICBzZWFyY2g6IHtcbiAgICBjb2RlOiBbXCJHRVQgL3NlYXJjaC9jb2RlXCJdLFxuICAgIGNvbW1pdHM6IFtcIkdFVCAvc2VhcmNoL2NvbW1pdHNcIl0sXG4gICAgaXNzdWVzQW5kUHVsbFJlcXVlc3RzOiBbXCJHRVQgL3NlYXJjaC9pc3N1ZXNcIl0sXG4gICAgbGFiZWxzOiBbXCJHRVQgL3NlYXJjaC9sYWJlbHNcIl0sXG4gICAgcmVwb3M6IFtcIkdFVCAvc2VhcmNoL3JlcG9zaXRvcmllc1wiXSxcbiAgICB0b3BpY3M6IFtcIkdFVCAvc2VhcmNoL3RvcGljc1wiXSxcbiAgICB1c2VyczogW1wiR0VUIC9zZWFyY2gvdXNlcnNcIl1cbiAgfSxcbiAgc2VjcmV0U2Nhbm5pbmc6IHtcbiAgICBnZXRBbGVydDogW1xuICAgICAgXCJHRVQgL3JlcG9zL3tvd25lcn0ve3JlcG99L3NlY3JldC1zY2FubmluZy9hbGVydHMve2FsZXJ0X251bWJlcn1cIlxuICAgIF0sXG4gICAgbGlzdEFsZXJ0c0ZvckVudGVycHJpc2U6IFtcbiAgICAgIFwiR0VUIC9lbnRlcnByaXNlcy97ZW50ZXJwcmlzZX0vc2VjcmV0LXNjYW5uaW5nL2FsZXJ0c1wiXG4gICAgXSxcbiAgICBsaXN0QWxlcnRzRm9yT3JnOiBbXCJHRVQgL29yZ3Mve29yZ30vc2VjcmV0LXNjYW5uaW5nL2FsZXJ0c1wiXSxcbiAgICBsaXN0QWxlcnRzRm9yUmVwbzogW1wiR0VUIC9yZXBvcy97b3duZXJ9L3tyZXBvfS9zZWNyZXQtc2Nhbm5pbmcvYWxlcnRzXCJdLFxuICAgIGxpc3RMb2NhdGlvbnNGb3JBbGVydDogW1xuICAgICAgXCJHRVQgL3JlcG9zL3tvd25lcn0ve3JlcG99L3NlY3JldC1zY2FubmluZy9hbGVydHMve2FsZXJ0X251bWJlcn0vbG9jYXRpb25zXCJcbiAgICBdLFxuICAgIHVwZGF0ZUFsZXJ0OiBbXG4gICAgICBcIlBBVENIIC9yZXBvcy97b3duZXJ9L3tyZXBvfS9zZWNyZXQtc2Nhbm5pbmcvYWxlcnRzL3thbGVydF9udW1iZXJ9XCJcbiAgICBdXG4gIH0sXG4gIHNlY3VyaXR5QWR2aXNvcmllczoge1xuICAgIGNyZWF0ZUZvcms6IFtcbiAgICAgIFwiUE9TVCAvcmVwb3Mve293bmVyfS97cmVwb30vc2VjdXJpdHktYWR2aXNvcmllcy97Z2hzYV9pZH0vZm9ya3NcIlxuICAgIF0sXG4gICAgY3JlYXRlUHJpdmF0ZVZ1bG5lcmFiaWxpdHlSZXBvcnQ6IFtcbiAgICAgIFwiUE9TVCAvcmVwb3Mve293bmVyfS97cmVwb30vc2VjdXJpdHktYWR2aXNvcmllcy9yZXBvcnRzXCJcbiAgICBdLFxuICAgIGNyZWF0ZVJlcG9zaXRvcnlBZHZpc29yeTogW1xuICAgICAgXCJQT1NUIC9yZXBvcy97b3duZXJ9L3tyZXBvfS9zZWN1cml0eS1hZHZpc29yaWVzXCJcbiAgICBdLFxuICAgIGNyZWF0ZVJlcG9zaXRvcnlBZHZpc29yeUN2ZVJlcXVlc3Q6IFtcbiAgICAgIFwiUE9TVCAvcmVwb3Mve293bmVyfS97cmVwb30vc2VjdXJpdHktYWR2aXNvcmllcy97Z2hzYV9pZH0vY3ZlXCJcbiAgICBdLFxuICAgIGdldEdsb2JhbEFkdmlzb3J5OiBbXCJHRVQgL2Fkdmlzb3JpZXMve2doc2FfaWR9XCJdLFxuICAgIGdldFJlcG9zaXRvcnlBZHZpc29yeTogW1xuICAgICAgXCJHRVQgL3JlcG9zL3tvd25lcn0ve3JlcG99L3NlY3VyaXR5LWFkdmlzb3JpZXMve2doc2FfaWR9XCJcbiAgICBdLFxuICAgIGxpc3RHbG9iYWxBZHZpc29yaWVzOiBbXCJHRVQgL2Fkdmlzb3JpZXNcIl0sXG4gICAgbGlzdE9yZ1JlcG9zaXRvcnlBZHZpc29yaWVzOiBbXCJHRVQgL29yZ3Mve29yZ30vc2VjdXJpdHktYWR2aXNvcmllc1wiXSxcbiAgICBsaXN0UmVwb3NpdG9yeUFkdmlzb3JpZXM6IFtcIkdFVCAvcmVwb3Mve293bmVyfS97cmVwb30vc2VjdXJpdHktYWR2aXNvcmllc1wiXSxcbiAgICB1cGRhdGVSZXBvc2l0b3J5QWR2aXNvcnk6IFtcbiAgICAgIFwiUEFUQ0ggL3JlcG9zL3tvd25lcn0ve3JlcG99L3NlY3VyaXR5LWFkdmlzb3JpZXMve2doc2FfaWR9XCJcbiAgICBdXG4gIH0sXG4gIHRlYW1zOiB7XG4gICAgYWRkT3JVcGRhdGVNZW1iZXJzaGlwRm9yVXNlckluT3JnOiBbXG4gICAgICBcIlBVVCAvb3Jncy97b3JnfS90ZWFtcy97dGVhbV9zbHVnfS9tZW1iZXJzaGlwcy97dXNlcm5hbWV9XCJcbiAgICBdLFxuICAgIGFkZE9yVXBkYXRlUHJvamVjdFBlcm1pc3Npb25zSW5Pcmc6IFtcbiAgICAgIFwiUFVUIC9vcmdzL3tvcmd9L3RlYW1zL3t0ZWFtX3NsdWd9L3Byb2plY3RzL3twcm9qZWN0X2lkfVwiXG4gICAgXSxcbiAgICBhZGRPclVwZGF0ZVJlcG9QZXJtaXNzaW9uc0luT3JnOiBbXG4gICAgICBcIlBVVCAvb3Jncy97b3JnfS90ZWFtcy97dGVhbV9zbHVnfS9yZXBvcy97b3duZXJ9L3tyZXBvfVwiXG4gICAgXSxcbiAgICBjaGVja1Blcm1pc3Npb25zRm9yUHJvamVjdEluT3JnOiBbXG4gICAgICBcIkdFVCAvb3Jncy97b3JnfS90ZWFtcy97dGVhbV9zbHVnfS9wcm9qZWN0cy97cHJvamVjdF9pZH1cIlxuICAgIF0sXG4gICAgY2hlY2tQZXJtaXNzaW9uc0ZvclJlcG9Jbk9yZzogW1xuICAgICAgXCJHRVQgL29yZ3Mve29yZ30vdGVhbXMve3RlYW1fc2x1Z30vcmVwb3Mve293bmVyfS97cmVwb31cIlxuICAgIF0sXG4gICAgY3JlYXRlOiBbXCJQT1NUIC9vcmdzL3tvcmd9L3RlYW1zXCJdLFxuICAgIGNyZWF0ZURpc2N1c3Npb25Db21tZW50SW5Pcmc6IFtcbiAgICAgIFwiUE9TVCAvb3Jncy97b3JnfS90ZWFtcy97dGVhbV9zbHVnfS9kaXNjdXNzaW9ucy97ZGlzY3Vzc2lvbl9udW1iZXJ9L2NvbW1lbnRzXCJcbiAgICBdLFxuICAgIGNyZWF0ZURpc2N1c3Npb25Jbk9yZzogW1wiUE9TVCAvb3Jncy97b3JnfS90ZWFtcy97dGVhbV9zbHVnfS9kaXNjdXNzaW9uc1wiXSxcbiAgICBkZWxldGVEaXNjdXNzaW9uQ29tbWVudEluT3JnOiBbXG4gICAgICBcIkRFTEVURSAvb3Jncy97b3JnfS90ZWFtcy97dGVhbV9zbHVnfS9kaXNjdXNzaW9ucy97ZGlzY3Vzc2lvbl9udW1iZXJ9L2NvbW1lbnRzL3tjb21tZW50X251bWJlcn1cIlxuICAgIF0sXG4gICAgZGVsZXRlRGlzY3Vzc2lvbkluT3JnOiBbXG4gICAgICBcIkRFTEVURSAvb3Jncy97b3JnfS90ZWFtcy97dGVhbV9zbHVnfS9kaXNjdXNzaW9ucy97ZGlzY3Vzc2lvbl9udW1iZXJ9XCJcbiAgICBdLFxuICAgIGRlbGV0ZUluT3JnOiBbXCJERUxFVEUgL29yZ3Mve29yZ30vdGVhbXMve3RlYW1fc2x1Z31cIl0sXG4gICAgZ2V0QnlOYW1lOiBbXCJHRVQgL29yZ3Mve29yZ30vdGVhbXMve3RlYW1fc2x1Z31cIl0sXG4gICAgZ2V0RGlzY3Vzc2lvbkNvbW1lbnRJbk9yZzogW1xuICAgICAgXCJHRVQgL29yZ3Mve29yZ30vdGVhbXMve3RlYW1fc2x1Z30vZGlzY3Vzc2lvbnMve2Rpc2N1c3Npb25fbnVtYmVyfS9jb21tZW50cy97Y29tbWVudF9udW1iZXJ9XCJcbiAgICBdLFxuICAgIGdldERpc2N1c3Npb25Jbk9yZzogW1xuICAgICAgXCJHRVQgL29yZ3Mve29yZ30vdGVhbXMve3RlYW1fc2x1Z30vZGlzY3Vzc2lvbnMve2Rpc2N1c3Npb25fbnVtYmVyfVwiXG4gICAgXSxcbiAgICBnZXRNZW1iZXJzaGlwRm9yVXNlckluT3JnOiBbXG4gICAgICBcIkdFVCAvb3Jncy97b3JnfS90ZWFtcy97dGVhbV9zbHVnfS9tZW1iZXJzaGlwcy97dXNlcm5hbWV9XCJcbiAgICBdLFxuICAgIGxpc3Q6IFtcIkdFVCAvb3Jncy97b3JnfS90ZWFtc1wiXSxcbiAgICBsaXN0Q2hpbGRJbk9yZzogW1wiR0VUIC9vcmdzL3tvcmd9L3RlYW1zL3t0ZWFtX3NsdWd9L3RlYW1zXCJdLFxuICAgIGxpc3REaXNjdXNzaW9uQ29tbWVudHNJbk9yZzogW1xuICAgICAgXCJHRVQgL29yZ3Mve29yZ30vdGVhbXMve3RlYW1fc2x1Z30vZGlzY3Vzc2lvbnMve2Rpc2N1c3Npb25fbnVtYmVyfS9jb21tZW50c1wiXG4gICAgXSxcbiAgICBsaXN0RGlzY3Vzc2lvbnNJbk9yZzogW1wiR0VUIC9vcmdzL3tvcmd9L3RlYW1zL3t0ZWFtX3NsdWd9L2Rpc2N1c3Npb25zXCJdLFxuICAgIGxpc3RGb3JBdXRoZW50aWNhdGVkVXNlcjogW1wiR0VUIC91c2VyL3RlYW1zXCJdLFxuICAgIGxpc3RNZW1iZXJzSW5Pcmc6IFtcIkdFVCAvb3Jncy97b3JnfS90ZWFtcy97dGVhbV9zbHVnfS9tZW1iZXJzXCJdLFxuICAgIGxpc3RQZW5kaW5nSW52aXRhdGlvbnNJbk9yZzogW1xuICAgICAgXCJHRVQgL29yZ3Mve29yZ30vdGVhbXMve3RlYW1fc2x1Z30vaW52aXRhdGlvbnNcIlxuICAgIF0sXG4gICAgbGlzdFByb2plY3RzSW5Pcmc6IFtcIkdFVCAvb3Jncy97b3JnfS90ZWFtcy97dGVhbV9zbHVnfS9wcm9qZWN0c1wiXSxcbiAgICBsaXN0UmVwb3NJbk9yZzogW1wiR0VUIC9vcmdzL3tvcmd9L3RlYW1zL3t0ZWFtX3NsdWd9L3JlcG9zXCJdLFxuICAgIHJlbW92ZU1lbWJlcnNoaXBGb3JVc2VySW5Pcmc6IFtcbiAgICAgIFwiREVMRVRFIC9vcmdzL3tvcmd9L3RlYW1zL3t0ZWFtX3NsdWd9L21lbWJlcnNoaXBzL3t1c2VybmFtZX1cIlxuICAgIF0sXG4gICAgcmVtb3ZlUHJvamVjdEluT3JnOiBbXG4gICAgICBcIkRFTEVURSAvb3Jncy97b3JnfS90ZWFtcy97dGVhbV9zbHVnfS9wcm9qZWN0cy97cHJvamVjdF9pZH1cIlxuICAgIF0sXG4gICAgcmVtb3ZlUmVwb0luT3JnOiBbXG4gICAgICBcIkRFTEVURSAvb3Jncy97b3JnfS90ZWFtcy97dGVhbV9zbHVnfS9yZXBvcy97b3duZXJ9L3tyZXBvfVwiXG4gICAgXSxcbiAgICB1cGRhdGVEaXNjdXNzaW9uQ29tbWVudEluT3JnOiBbXG4gICAgICBcIlBBVENIIC9vcmdzL3tvcmd9L3RlYW1zL3t0ZWFtX3NsdWd9L2Rpc2N1c3Npb25zL3tkaXNjdXNzaW9uX251bWJlcn0vY29tbWVudHMve2NvbW1lbnRfbnVtYmVyfVwiXG4gICAgXSxcbiAgICB1cGRhdGVEaXNjdXNzaW9uSW5Pcmc6IFtcbiAgICAgIFwiUEFUQ0ggL29yZ3Mve29yZ30vdGVhbXMve3RlYW1fc2x1Z30vZGlzY3Vzc2lvbnMve2Rpc2N1c3Npb25fbnVtYmVyfVwiXG4gICAgXSxcbiAgICB1cGRhdGVJbk9yZzogW1wiUEFUQ0ggL29yZ3Mve29yZ30vdGVhbXMve3RlYW1fc2x1Z31cIl1cbiAgfSxcbiAgdXNlcnM6IHtcbiAgICBhZGRFbWFpbEZvckF1dGhlbnRpY2F0ZWQ6IFtcbiAgICAgIFwiUE9TVCAvdXNlci9lbWFpbHNcIixcbiAgICAgIHt9LFxuICAgICAgeyByZW5hbWVkOiBbXCJ1c2Vyc1wiLCBcImFkZEVtYWlsRm9yQXV0aGVudGljYXRlZFVzZXJcIl0gfVxuICAgIF0sXG4gICAgYWRkRW1haWxGb3JBdXRoZW50aWNhdGVkVXNlcjogW1wiUE9TVCAvdXNlci9lbWFpbHNcIl0sXG4gICAgYWRkU29jaWFsQWNjb3VudEZvckF1dGhlbnRpY2F0ZWRVc2VyOiBbXCJQT1NUIC91c2VyL3NvY2lhbF9hY2NvdW50c1wiXSxcbiAgICBibG9jazogW1wiUFVUIC91c2VyL2Jsb2Nrcy97dXNlcm5hbWV9XCJdLFxuICAgIGNoZWNrQmxvY2tlZDogW1wiR0VUIC91c2VyL2Jsb2Nrcy97dXNlcm5hbWV9XCJdLFxuICAgIGNoZWNrRm9sbG93aW5nRm9yVXNlcjogW1wiR0VUIC91c2Vycy97dXNlcm5hbWV9L2ZvbGxvd2luZy97dGFyZ2V0X3VzZXJ9XCJdLFxuICAgIGNoZWNrUGVyc29uSXNGb2xsb3dlZEJ5QXV0aGVudGljYXRlZDogW1wiR0VUIC91c2VyL2ZvbGxvd2luZy97dXNlcm5hbWV9XCJdLFxuICAgIGNyZWF0ZUdwZ0tleUZvckF1dGhlbnRpY2F0ZWQ6IFtcbiAgICAgIFwiUE9TVCAvdXNlci9ncGdfa2V5c1wiLFxuICAgICAge30sXG4gICAgICB7IHJlbmFtZWQ6IFtcInVzZXJzXCIsIFwiY3JlYXRlR3BnS2V5Rm9yQXV0aGVudGljYXRlZFVzZXJcIl0gfVxuICAgIF0sXG4gICAgY3JlYXRlR3BnS2V5Rm9yQXV0aGVudGljYXRlZFVzZXI6IFtcIlBPU1QgL3VzZXIvZ3BnX2tleXNcIl0sXG4gICAgY3JlYXRlUHVibGljU3NoS2V5Rm9yQXV0aGVudGljYXRlZDogW1xuICAgICAgXCJQT1NUIC91c2VyL2tleXNcIixcbiAgICAgIHt9LFxuICAgICAgeyByZW5hbWVkOiBbXCJ1c2Vyc1wiLCBcImNyZWF0ZVB1YmxpY1NzaEtleUZvckF1dGhlbnRpY2F0ZWRVc2VyXCJdIH1cbiAgICBdLFxuICAgIGNyZWF0ZVB1YmxpY1NzaEtleUZvckF1dGhlbnRpY2F0ZWRVc2VyOiBbXCJQT1NUIC91c2VyL2tleXNcIl0sXG4gICAgY3JlYXRlU3NoU2lnbmluZ0tleUZvckF1dGhlbnRpY2F0ZWRVc2VyOiBbXCJQT1NUIC91c2VyL3NzaF9zaWduaW5nX2tleXNcIl0sXG4gICAgZGVsZXRlRW1haWxGb3JBdXRoZW50aWNhdGVkOiBbXG4gICAgICBcIkRFTEVURSAvdXNlci9lbWFpbHNcIixcbiAgICAgIHt9LFxuICAgICAgeyByZW5hbWVkOiBbXCJ1c2Vyc1wiLCBcImRlbGV0ZUVtYWlsRm9yQXV0aGVudGljYXRlZFVzZXJcIl0gfVxuICAgIF0sXG4gICAgZGVsZXRlRW1haWxGb3JBdXRoZW50aWNhdGVkVXNlcjogW1wiREVMRVRFIC91c2VyL2VtYWlsc1wiXSxcbiAgICBkZWxldGVHcGdLZXlGb3JBdXRoZW50aWNhdGVkOiBbXG4gICAgICBcIkRFTEVURSAvdXNlci9ncGdfa2V5cy97Z3BnX2tleV9pZH1cIixcbiAgICAgIHt9LFxuICAgICAgeyByZW5hbWVkOiBbXCJ1c2Vyc1wiLCBcImRlbGV0ZUdwZ0tleUZvckF1dGhlbnRpY2F0ZWRVc2VyXCJdIH1cbiAgICBdLFxuICAgIGRlbGV0ZUdwZ0tleUZvckF1dGhlbnRpY2F0ZWRVc2VyOiBbXCJERUxFVEUgL3VzZXIvZ3BnX2tleXMve2dwZ19rZXlfaWR9XCJdLFxuICAgIGRlbGV0ZVB1YmxpY1NzaEtleUZvckF1dGhlbnRpY2F0ZWQ6IFtcbiAgICAgIFwiREVMRVRFIC91c2VyL2tleXMve2tleV9pZH1cIixcbiAgICAgIHt9LFxuICAgICAgeyByZW5hbWVkOiBbXCJ1c2Vyc1wiLCBcImRlbGV0ZVB1YmxpY1NzaEtleUZvckF1dGhlbnRpY2F0ZWRVc2VyXCJdIH1cbiAgICBdLFxuICAgIGRlbGV0ZVB1YmxpY1NzaEtleUZvckF1dGhlbnRpY2F0ZWRVc2VyOiBbXCJERUxFVEUgL3VzZXIva2V5cy97a2V5X2lkfVwiXSxcbiAgICBkZWxldGVTb2NpYWxBY2NvdW50Rm9yQXV0aGVudGljYXRlZFVzZXI6IFtcIkRFTEVURSAvdXNlci9zb2NpYWxfYWNjb3VudHNcIl0sXG4gICAgZGVsZXRlU3NoU2lnbmluZ0tleUZvckF1dGhlbnRpY2F0ZWRVc2VyOiBbXG4gICAgICBcIkRFTEVURSAvdXNlci9zc2hfc2lnbmluZ19rZXlzL3tzc2hfc2lnbmluZ19rZXlfaWR9XCJcbiAgICBdLFxuICAgIGZvbGxvdzogW1wiUFVUIC91c2VyL2ZvbGxvd2luZy97dXNlcm5hbWV9XCJdLFxuICAgIGdldEF1dGhlbnRpY2F0ZWQ6IFtcIkdFVCAvdXNlclwiXSxcbiAgICBnZXRCeVVzZXJuYW1lOiBbXCJHRVQgL3VzZXJzL3t1c2VybmFtZX1cIl0sXG4gICAgZ2V0Q29udGV4dEZvclVzZXI6IFtcIkdFVCAvdXNlcnMve3VzZXJuYW1lfS9ob3ZlcmNhcmRcIl0sXG4gICAgZ2V0R3BnS2V5Rm9yQXV0aGVudGljYXRlZDogW1xuICAgICAgXCJHRVQgL3VzZXIvZ3BnX2tleXMve2dwZ19rZXlfaWR9XCIsXG4gICAgICB7fSxcbiAgICAgIHsgcmVuYW1lZDogW1widXNlcnNcIiwgXCJnZXRHcGdLZXlGb3JBdXRoZW50aWNhdGVkVXNlclwiXSB9XG4gICAgXSxcbiAgICBnZXRHcGdLZXlGb3JBdXRoZW50aWNhdGVkVXNlcjogW1wiR0VUIC91c2VyL2dwZ19rZXlzL3tncGdfa2V5X2lkfVwiXSxcbiAgICBnZXRQdWJsaWNTc2hLZXlGb3JBdXRoZW50aWNhdGVkOiBbXG4gICAgICBcIkdFVCAvdXNlci9rZXlzL3trZXlfaWR9XCIsXG4gICAgICB7fSxcbiAgICAgIHsgcmVuYW1lZDogW1widXNlcnNcIiwgXCJnZXRQdWJsaWNTc2hLZXlGb3JBdXRoZW50aWNhdGVkVXNlclwiXSB9XG4gICAgXSxcbiAgICBnZXRQdWJsaWNTc2hLZXlGb3JBdXRoZW50aWNhdGVkVXNlcjogW1wiR0VUIC91c2VyL2tleXMve2tleV9pZH1cIl0sXG4gICAgZ2V0U3NoU2lnbmluZ0tleUZvckF1dGhlbnRpY2F0ZWRVc2VyOiBbXG4gICAgICBcIkdFVCAvdXNlci9zc2hfc2lnbmluZ19rZXlzL3tzc2hfc2lnbmluZ19rZXlfaWR9XCJcbiAgICBdLFxuICAgIGxpc3Q6IFtcIkdFVCAvdXNlcnNcIl0sXG4gICAgbGlzdEJsb2NrZWRCeUF1dGhlbnRpY2F0ZWQ6IFtcbiAgICAgIFwiR0VUIC91c2VyL2Jsb2Nrc1wiLFxuICAgICAge30sXG4gICAgICB7IHJlbmFtZWQ6IFtcInVzZXJzXCIsIFwibGlzdEJsb2NrZWRCeUF1dGhlbnRpY2F0ZWRVc2VyXCJdIH1cbiAgICBdLFxuICAgIGxpc3RCbG9ja2VkQnlBdXRoZW50aWNhdGVkVXNlcjogW1wiR0VUIC91c2VyL2Jsb2Nrc1wiXSxcbiAgICBsaXN0RW1haWxzRm9yQXV0aGVudGljYXRlZDogW1xuICAgICAgXCJHRVQgL3VzZXIvZW1haWxzXCIsXG4gICAgICB7fSxcbiAgICAgIHsgcmVuYW1lZDogW1widXNlcnNcIiwgXCJsaXN0RW1haWxzRm9yQXV0aGVudGljYXRlZFVzZXJcIl0gfVxuICAgIF0sXG4gICAgbGlzdEVtYWlsc0ZvckF1dGhlbnRpY2F0ZWRVc2VyOiBbXCJHRVQgL3VzZXIvZW1haWxzXCJdLFxuICAgIGxpc3RGb2xsb3dlZEJ5QXV0aGVudGljYXRlZDogW1xuICAgICAgXCJHRVQgL3VzZXIvZm9sbG93aW5nXCIsXG4gICAgICB7fSxcbiAgICAgIHsgcmVuYW1lZDogW1widXNlcnNcIiwgXCJsaXN0Rm9sbG93ZWRCeUF1dGhlbnRpY2F0ZWRVc2VyXCJdIH1cbiAgICBdLFxuICAgIGxpc3RGb2xsb3dlZEJ5QXV0aGVudGljYXRlZFVzZXI6IFtcIkdFVCAvdXNlci9mb2xsb3dpbmdcIl0sXG4gICAgbGlzdEZvbGxvd2Vyc0ZvckF1dGhlbnRpY2F0ZWRVc2VyOiBbXCJHRVQgL3VzZXIvZm9sbG93ZXJzXCJdLFxuICAgIGxpc3RGb2xsb3dlcnNGb3JVc2VyOiBbXCJHRVQgL3VzZXJzL3t1c2VybmFtZX0vZm9sbG93ZXJzXCJdLFxuICAgIGxpc3RGb2xsb3dpbmdGb3JVc2VyOiBbXCJHRVQgL3VzZXJzL3t1c2VybmFtZX0vZm9sbG93aW5nXCJdLFxuICAgIGxpc3RHcGdLZXlzRm9yQXV0aGVudGljYXRlZDogW1xuICAgICAgXCJHRVQgL3VzZXIvZ3BnX2tleXNcIixcbiAgICAgIHt9LFxuICAgICAgeyByZW5hbWVkOiBbXCJ1c2Vyc1wiLCBcImxpc3RHcGdLZXlzRm9yQXV0aGVudGljYXRlZFVzZXJcIl0gfVxuICAgIF0sXG4gICAgbGlzdEdwZ0tleXNGb3JBdXRoZW50aWNhdGVkVXNlcjogW1wiR0VUIC91c2VyL2dwZ19rZXlzXCJdLFxuICAgIGxpc3RHcGdLZXlzRm9yVXNlcjogW1wiR0VUIC91c2Vycy97dXNlcm5hbWV9L2dwZ19rZXlzXCJdLFxuICAgIGxpc3RQdWJsaWNFbWFpbHNGb3JBdXRoZW50aWNhdGVkOiBbXG4gICAgICBcIkdFVCAvdXNlci9wdWJsaWNfZW1haWxzXCIsXG4gICAgICB7fSxcbiAgICAgIHsgcmVuYW1lZDogW1widXNlcnNcIiwgXCJsaXN0UHVibGljRW1haWxzRm9yQXV0aGVudGljYXRlZFVzZXJcIl0gfVxuICAgIF0sXG4gICAgbGlzdFB1YmxpY0VtYWlsc0ZvckF1dGhlbnRpY2F0ZWRVc2VyOiBbXCJHRVQgL3VzZXIvcHVibGljX2VtYWlsc1wiXSxcbiAgICBsaXN0UHVibGljS2V5c0ZvclVzZXI6IFtcIkdFVCAvdXNlcnMve3VzZXJuYW1lfS9rZXlzXCJdLFxuICAgIGxpc3RQdWJsaWNTc2hLZXlzRm9yQXV0aGVudGljYXRlZDogW1xuICAgICAgXCJHRVQgL3VzZXIva2V5c1wiLFxuICAgICAge30sXG4gICAgICB7IHJlbmFtZWQ6IFtcInVzZXJzXCIsIFwibGlzdFB1YmxpY1NzaEtleXNGb3JBdXRoZW50aWNhdGVkVXNlclwiXSB9XG4gICAgXSxcbiAgICBsaXN0UHVibGljU3NoS2V5c0ZvckF1dGhlbnRpY2F0ZWRVc2VyOiBbXCJHRVQgL3VzZXIva2V5c1wiXSxcbiAgICBsaXN0U29jaWFsQWNjb3VudHNGb3JBdXRoZW50aWNhdGVkVXNlcjogW1wiR0VUIC91c2VyL3NvY2lhbF9hY2NvdW50c1wiXSxcbiAgICBsaXN0U29jaWFsQWNjb3VudHNGb3JVc2VyOiBbXCJHRVQgL3VzZXJzL3t1c2VybmFtZX0vc29jaWFsX2FjY291bnRzXCJdLFxuICAgIGxpc3RTc2hTaWduaW5nS2V5c0ZvckF1dGhlbnRpY2F0ZWRVc2VyOiBbXCJHRVQgL3VzZXIvc3NoX3NpZ25pbmdfa2V5c1wiXSxcbiAgICBsaXN0U3NoU2lnbmluZ0tleXNGb3JVc2VyOiBbXCJHRVQgL3VzZXJzL3t1c2VybmFtZX0vc3NoX3NpZ25pbmdfa2V5c1wiXSxcbiAgICBzZXRQcmltYXJ5RW1haWxWaXNpYmlsaXR5Rm9yQXV0aGVudGljYXRlZDogW1xuICAgICAgXCJQQVRDSCAvdXNlci9lbWFpbC92aXNpYmlsaXR5XCIsXG4gICAgICB7fSxcbiAgICAgIHsgcmVuYW1lZDogW1widXNlcnNcIiwgXCJzZXRQcmltYXJ5RW1haWxWaXNpYmlsaXR5Rm9yQXV0aGVudGljYXRlZFVzZXJcIl0gfVxuICAgIF0sXG4gICAgc2V0UHJpbWFyeUVtYWlsVmlzaWJpbGl0eUZvckF1dGhlbnRpY2F0ZWRVc2VyOiBbXG4gICAgICBcIlBBVENIIC91c2VyL2VtYWlsL3Zpc2liaWxpdHlcIlxuICAgIF0sXG4gICAgdW5ibG9jazogW1wiREVMRVRFIC91c2VyL2Jsb2Nrcy97dXNlcm5hbWV9XCJdLFxuICAgIHVuZm9sbG93OiBbXCJERUxFVEUgL3VzZXIvZm9sbG93aW5nL3t1c2VybmFtZX1cIl0sXG4gICAgdXBkYXRlQXV0aGVudGljYXRlZDogW1wiUEFUQ0ggL3VzZXJcIl1cbiAgfVxufTtcbnZhciBlbmRwb2ludHNfZGVmYXVsdCA9IEVuZHBvaW50cztcblxuLy8gcGtnL2Rpc3Qtc3JjL2VuZHBvaW50cy10by1tZXRob2RzLmpzXG52YXIgZW5kcG9pbnRNZXRob2RzTWFwID0gLyogQF9fUFVSRV9fICovIG5ldyBNYXAoKTtcbmZvciAoY29uc3QgW3Njb3BlLCBlbmRwb2ludHNdIG9mIE9iamVjdC5lbnRyaWVzKGVuZHBvaW50c19kZWZhdWx0KSkge1xuICBmb3IgKGNvbnN0IFttZXRob2ROYW1lLCBlbmRwb2ludF0gb2YgT2JqZWN0LmVudHJpZXMoZW5kcG9pbnRzKSkge1xuICAgIGNvbnN0IFtyb3V0ZSwgZGVmYXVsdHMsIGRlY29yYXRpb25zXSA9IGVuZHBvaW50O1xuICAgIGNvbnN0IFttZXRob2QsIHVybF0gPSByb3V0ZS5zcGxpdCgvIC8pO1xuICAgIGNvbnN0IGVuZHBvaW50RGVmYXVsdHMgPSBPYmplY3QuYXNzaWduKFxuICAgICAge1xuICAgICAgICBtZXRob2QsXG4gICAgICAgIHVybFxuICAgICAgfSxcbiAgICAgIGRlZmF1bHRzXG4gICAgKTtcbiAgICBpZiAoIWVuZHBvaW50TWV0aG9kc01hcC5oYXMoc2NvcGUpKSB7XG4gICAgICBlbmRwb2ludE1ldGhvZHNNYXAuc2V0KHNjb3BlLCAvKiBAX19QVVJFX18gKi8gbmV3IE1hcCgpKTtcbiAgICB9XG4gICAgZW5kcG9pbnRNZXRob2RzTWFwLmdldChzY29wZSkuc2V0KG1ldGhvZE5hbWUsIHtcbiAgICAgIHNjb3BlLFxuICAgICAgbWV0aG9kTmFtZSxcbiAgICAgIGVuZHBvaW50RGVmYXVsdHMsXG4gICAgICBkZWNvcmF0aW9uc1xuICAgIH0pO1xuICB9XG59XG52YXIgaGFuZGxlciA9IHtcbiAgaGFzKHsgc2NvcGUgfSwgbWV0aG9kTmFtZSkge1xuICAgIHJldHVybiBlbmRwb2ludE1ldGhvZHNNYXAuZ2V0KHNjb3BlKS5oYXMobWV0aG9kTmFtZSk7XG4gIH0sXG4gIGdldE93blByb3BlcnR5RGVzY3JpcHRvcih0YXJnZXQsIG1ldGhvZE5hbWUpIHtcbiAgICByZXR1cm4ge1xuICAgICAgdmFsdWU6IHRoaXMuZ2V0KHRhcmdldCwgbWV0aG9kTmFtZSksXG4gICAgICAvLyBlbnN1cmVzIG1ldGhvZCBpcyBpbiB0aGUgY2FjaGVcbiAgICAgIGNvbmZpZ3VyYWJsZTogdHJ1ZSxcbiAgICAgIHdyaXRhYmxlOiB0cnVlLFxuICAgICAgZW51bWVyYWJsZTogdHJ1ZVxuICAgIH07XG4gIH0sXG4gIGRlZmluZVByb3BlcnR5KHRhcmdldCwgbWV0aG9kTmFtZSwgZGVzY3JpcHRvcikge1xuICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0YXJnZXQuY2FjaGUsIG1ldGhvZE5hbWUsIGRlc2NyaXB0b3IpO1xuICAgIHJldHVybiB0cnVlO1xuICB9LFxuICBkZWxldGVQcm9wZXJ0eSh0YXJnZXQsIG1ldGhvZE5hbWUpIHtcbiAgICBkZWxldGUgdGFyZ2V0LmNhY2hlW21ldGhvZE5hbWVdO1xuICAgIHJldHVybiB0cnVlO1xuICB9LFxuICBvd25LZXlzKHsgc2NvcGUgfSkge1xuICAgIHJldHVybiBbLi4uZW5kcG9pbnRNZXRob2RzTWFwLmdldChzY29wZSkua2V5cygpXTtcbiAgfSxcbiAgc2V0KHRhcmdldCwgbWV0aG9kTmFtZSwgdmFsdWUpIHtcbiAgICByZXR1cm4gdGFyZ2V0LmNhY2hlW21ldGhvZE5hbWVdID0gdmFsdWU7XG4gIH0sXG4gIGdldCh7IG9jdG9raXQsIHNjb3BlLCBjYWNoZSB9LCBtZXRob2ROYW1lKSB7XG4gICAgaWYgKGNhY2hlW21ldGhvZE5hbWVdKSB7XG4gICAgICByZXR1cm4gY2FjaGVbbWV0aG9kTmFtZV07XG4gICAgfVxuICAgIGNvbnN0IG1ldGhvZCA9IGVuZHBvaW50TWV0aG9kc01hcC5nZXQoc2NvcGUpLmdldChtZXRob2ROYW1lKTtcbiAgICBpZiAoIW1ldGhvZCkge1xuICAgICAgcmV0dXJuIHZvaWQgMDtcbiAgICB9XG4gICAgY29uc3QgeyBlbmRwb2ludERlZmF1bHRzLCBkZWNvcmF0aW9ucyB9ID0gbWV0aG9kO1xuICAgIGlmIChkZWNvcmF0aW9ucykge1xuICAgICAgY2FjaGVbbWV0aG9kTmFtZV0gPSBkZWNvcmF0ZShcbiAgICAgICAgb2N0b2tpdCxcbiAgICAgICAgc2NvcGUsXG4gICAgICAgIG1ldGhvZE5hbWUsXG4gICAgICAgIGVuZHBvaW50RGVmYXVsdHMsXG4gICAgICAgIGRlY29yYXRpb25zXG4gICAgICApO1xuICAgIH0gZWxzZSB7XG4gICAgICBjYWNoZVttZXRob2ROYW1lXSA9IG9jdG9raXQucmVxdWVzdC5kZWZhdWx0cyhlbmRwb2ludERlZmF1bHRzKTtcbiAgICB9XG4gICAgcmV0dXJuIGNhY2hlW21ldGhvZE5hbWVdO1xuICB9XG59O1xuZnVuY3Rpb24gZW5kcG9pbnRzVG9NZXRob2RzKG9jdG9raXQpIHtcbiAgY29uc3QgbmV3TWV0aG9kcyA9IHt9O1xuICBmb3IgKGNvbnN0IHNjb3BlIG9mIGVuZHBvaW50TWV0aG9kc01hcC5rZXlzKCkpIHtcbiAgICBuZXdNZXRob2RzW3Njb3BlXSA9IG5ldyBQcm94eSh7IG9jdG9raXQsIHNjb3BlLCBjYWNoZToge30gfSwgaGFuZGxlcik7XG4gIH1cbiAgcmV0dXJuIG5ld01ldGhvZHM7XG59XG5mdW5jdGlvbiBkZWNvcmF0ZShvY3Rva2l0LCBzY29wZSwgbWV0aG9kTmFtZSwgZGVmYXVsdHMsIGRlY29yYXRpb25zKSB7XG4gIGNvbnN0IHJlcXVlc3RXaXRoRGVmYXVsdHMgPSBvY3Rva2l0LnJlcXVlc3QuZGVmYXVsdHMoZGVmYXVsdHMpO1xuICBmdW5jdGlvbiB3aXRoRGVjb3JhdGlvbnMoLi4uYXJncykge1xuICAgIGxldCBvcHRpb25zID0gcmVxdWVzdFdpdGhEZWZhdWx0cy5lbmRwb2ludC5tZXJnZSguLi5hcmdzKTtcbiAgICBpZiAoZGVjb3JhdGlvbnMubWFwVG9EYXRhKSB7XG4gICAgICBvcHRpb25zID0gT2JqZWN0LmFzc2lnbih7fSwgb3B0aW9ucywge1xuICAgICAgICBkYXRhOiBvcHRpb25zW2RlY29yYXRpb25zLm1hcFRvRGF0YV0sXG4gICAgICAgIFtkZWNvcmF0aW9ucy5tYXBUb0RhdGFdOiB2b2lkIDBcbiAgICAgIH0pO1xuICAgICAgcmV0dXJuIHJlcXVlc3RXaXRoRGVmYXVsdHMob3B0aW9ucyk7XG4gICAgfVxuICAgIGlmIChkZWNvcmF0aW9ucy5yZW5hbWVkKSB7XG4gICAgICBjb25zdCBbbmV3U2NvcGUsIG5ld01ldGhvZE5hbWVdID0gZGVjb3JhdGlvbnMucmVuYW1lZDtcbiAgICAgIG9jdG9raXQubG9nLndhcm4oXG4gICAgICAgIGBvY3Rva2l0LiR7c2NvcGV9LiR7bWV0aG9kTmFtZX0oKSBoYXMgYmVlbiByZW5hbWVkIHRvIG9jdG9raXQuJHtuZXdTY29wZX0uJHtuZXdNZXRob2ROYW1lfSgpYFxuICAgICAgKTtcbiAgICB9XG4gICAgaWYgKGRlY29yYXRpb25zLmRlcHJlY2F0ZWQpIHtcbiAgICAgIG9jdG9raXQubG9nLndhcm4oZGVjb3JhdGlvbnMuZGVwcmVjYXRlZCk7XG4gICAgfVxuICAgIGlmIChkZWNvcmF0aW9ucy5yZW5hbWVkUGFyYW1ldGVycykge1xuICAgICAgY29uc3Qgb3B0aW9uczIgPSByZXF1ZXN0V2l0aERlZmF1bHRzLmVuZHBvaW50Lm1lcmdlKC4uLmFyZ3MpO1xuICAgICAgZm9yIChjb25zdCBbbmFtZSwgYWxpYXNdIG9mIE9iamVjdC5lbnRyaWVzKFxuICAgICAgICBkZWNvcmF0aW9ucy5yZW5hbWVkUGFyYW1ldGVyc1xuICAgICAgKSkge1xuICAgICAgICBpZiAobmFtZSBpbiBvcHRpb25zMikge1xuICAgICAgICAgIG9jdG9raXQubG9nLndhcm4oXG4gICAgICAgICAgICBgXCIke25hbWV9XCIgcGFyYW1ldGVyIGlzIGRlcHJlY2F0ZWQgZm9yIFwib2N0b2tpdC4ke3Njb3BlfS4ke21ldGhvZE5hbWV9KClcIi4gVXNlIFwiJHthbGlhc31cIiBpbnN0ZWFkYFxuICAgICAgICAgICk7XG4gICAgICAgICAgaWYgKCEoYWxpYXMgaW4gb3B0aW9uczIpKSB7XG4gICAgICAgICAgICBvcHRpb25zMlthbGlhc10gPSBvcHRpb25zMltuYW1lXTtcbiAgICAgICAgICB9XG4gICAgICAgICAgZGVsZXRlIG9wdGlvbnMyW25hbWVdO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICByZXR1cm4gcmVxdWVzdFdpdGhEZWZhdWx0cyhvcHRpb25zMik7XG4gICAgfVxuICAgIHJldHVybiByZXF1ZXN0V2l0aERlZmF1bHRzKC4uLmFyZ3MpO1xuICB9XG4gIHJldHVybiBPYmplY3QuYXNzaWduKHdpdGhEZWNvcmF0aW9ucywgcmVxdWVzdFdpdGhEZWZhdWx0cyk7XG59XG5cbi8vIHBrZy9kaXN0LXNyYy9pbmRleC5qc1xuZnVuY3Rpb24gcmVzdEVuZHBvaW50TWV0aG9kcyhvY3Rva2l0KSB7XG4gIGNvbnN0IGFwaSA9IGVuZHBvaW50c1RvTWV0aG9kcyhvY3Rva2l0KTtcbiAgcmV0dXJuIHtcbiAgICByZXN0OiBhcGlcbiAgfTtcbn1cbnJlc3RFbmRwb2ludE1ldGhvZHMuVkVSU0lPTiA9IFZFUlNJT047XG5mdW5jdGlvbiBsZWdhY3lSZXN0RW5kcG9pbnRNZXRob2RzKG9jdG9raXQpIHtcbiAgY29uc3QgYXBpID0gZW5kcG9pbnRzVG9NZXRob2RzKG9jdG9raXQpO1xuICByZXR1cm4ge1xuICAgIC4uLmFwaSxcbiAgICByZXN0OiBhcGlcbiAgfTtcbn1cbmxlZ2FjeVJlc3RFbmRwb2ludE1ldGhvZHMuVkVSU0lPTiA9IFZFUlNJT047XG4vLyBBbm5vdGF0ZSB0aGUgQ29tbW9uSlMgZXhwb3J0IG5hbWVzIGZvciBFU00gaW1wb3J0IGluIG5vZGU6XG4wICYmIChtb2R1bGUuZXhwb3J0cyA9IHtcbiAgbGVnYWN5UmVzdEVuZHBvaW50TWV0aG9kcyxcbiAgcmVzdEVuZHBvaW50TWV0aG9kc1xufSk7XG4iLAogICAgIlwidXNlIHN0cmljdFwiO1xudmFyIF9fZGVmUHJvcCA9IE9iamVjdC5kZWZpbmVQcm9wZXJ0eTtcbnZhciBfX2dldE93blByb3BEZXNjID0gT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcjtcbnZhciBfX2dldE93blByb3BOYW1lcyA9IE9iamVjdC5nZXRPd25Qcm9wZXJ0eU5hbWVzO1xudmFyIF9faGFzT3duUHJvcCA9IE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHk7XG52YXIgX19leHBvcnQgPSAodGFyZ2V0LCBhbGwpID0+IHtcbiAgZm9yICh2YXIgbmFtZSBpbiBhbGwpXG4gICAgX19kZWZQcm9wKHRhcmdldCwgbmFtZSwgeyBnZXQ6IGFsbFtuYW1lXSwgZW51bWVyYWJsZTogdHJ1ZSB9KTtcbn07XG52YXIgX19jb3B5UHJvcHMgPSAodG8sIGZyb20sIGV4Y2VwdCwgZGVzYykgPT4ge1xuICBpZiAoZnJvbSAmJiB0eXBlb2YgZnJvbSA9PT0gXCJvYmplY3RcIiB8fCB0eXBlb2YgZnJvbSA9PT0gXCJmdW5jdGlvblwiKSB7XG4gICAgZm9yIChsZXQga2V5IG9mIF9fZ2V0T3duUHJvcE5hbWVzKGZyb20pKVxuICAgICAgaWYgKCFfX2hhc093blByb3AuY2FsbCh0bywga2V5KSAmJiBrZXkgIT09IGV4Y2VwdClcbiAgICAgICAgX19kZWZQcm9wKHRvLCBrZXksIHsgZ2V0OiAoKSA9PiBmcm9tW2tleV0sIGVudW1lcmFibGU6ICEoZGVzYyA9IF9fZ2V0T3duUHJvcERlc2MoZnJvbSwga2V5KSkgfHwgZGVzYy5lbnVtZXJhYmxlIH0pO1xuICB9XG4gIHJldHVybiB0bztcbn07XG52YXIgX190b0NvbW1vbkpTID0gKG1vZCkgPT4gX19jb3B5UHJvcHMoX19kZWZQcm9wKHt9LCBcIl9fZXNNb2R1bGVcIiwgeyB2YWx1ZTogdHJ1ZSB9KSwgbW9kKTtcblxuLy8gcGtnL2Rpc3Qtc3JjL2luZGV4LmpzXG52YXIgZGlzdF9zcmNfZXhwb3J0cyA9IHt9O1xuX19leHBvcnQoZGlzdF9zcmNfZXhwb3J0cywge1xuICBjb21wb3NlUGFnaW5hdGVSZXN0OiAoKSA9PiBjb21wb3NlUGFnaW5hdGVSZXN0LFxuICBpc1BhZ2luYXRpbmdFbmRwb2ludDogKCkgPT4gaXNQYWdpbmF0aW5nRW5kcG9pbnQsXG4gIHBhZ2luYXRlUmVzdDogKCkgPT4gcGFnaW5hdGVSZXN0LFxuICBwYWdpbmF0aW5nRW5kcG9pbnRzOiAoKSA9PiBwYWdpbmF0aW5nRW5kcG9pbnRzXG59KTtcbm1vZHVsZS5leHBvcnRzID0gX190b0NvbW1vbkpTKGRpc3Rfc3JjX2V4cG9ydHMpO1xuXG4vLyBwa2cvZGlzdC1zcmMvdmVyc2lvbi5qc1xudmFyIFZFUlNJT04gPSBcIjkuMi4xXCI7XG5cbi8vIHBrZy9kaXN0LXNyYy9ub3JtYWxpemUtcGFnaW5hdGVkLWxpc3QtcmVzcG9uc2UuanNcbmZ1bmN0aW9uIG5vcm1hbGl6ZVBhZ2luYXRlZExpc3RSZXNwb25zZShyZXNwb25zZSkge1xuICBpZiAoIXJlc3BvbnNlLmRhdGEpIHtcbiAgICByZXR1cm4ge1xuICAgICAgLi4ucmVzcG9uc2UsXG4gICAgICBkYXRhOiBbXVxuICAgIH07XG4gIH1cbiAgY29uc3QgcmVzcG9uc2VOZWVkc05vcm1hbGl6YXRpb24gPSBcInRvdGFsX2NvdW50XCIgaW4gcmVzcG9uc2UuZGF0YSAmJiAhKFwidXJsXCIgaW4gcmVzcG9uc2UuZGF0YSk7XG4gIGlmICghcmVzcG9uc2VOZWVkc05vcm1hbGl6YXRpb24pXG4gICAgcmV0dXJuIHJlc3BvbnNlO1xuICBjb25zdCBpbmNvbXBsZXRlUmVzdWx0cyA9IHJlc3BvbnNlLmRhdGEuaW5jb21wbGV0ZV9yZXN1bHRzO1xuICBjb25zdCByZXBvc2l0b3J5U2VsZWN0aW9uID0gcmVzcG9uc2UuZGF0YS5yZXBvc2l0b3J5X3NlbGVjdGlvbjtcbiAgY29uc3QgdG90YWxDb3VudCA9IHJlc3BvbnNlLmRhdGEudG90YWxfY291bnQ7XG4gIGRlbGV0ZSByZXNwb25zZS5kYXRhLmluY29tcGxldGVfcmVzdWx0cztcbiAgZGVsZXRlIHJlc3BvbnNlLmRhdGEucmVwb3NpdG9yeV9zZWxlY3Rpb247XG4gIGRlbGV0ZSByZXNwb25zZS5kYXRhLnRvdGFsX2NvdW50O1xuICBjb25zdCBuYW1lc3BhY2VLZXkgPSBPYmplY3Qua2V5cyhyZXNwb25zZS5kYXRhKVswXTtcbiAgY29uc3QgZGF0YSA9IHJlc3BvbnNlLmRhdGFbbmFtZXNwYWNlS2V5XTtcbiAgcmVzcG9uc2UuZGF0YSA9IGRhdGE7XG4gIGlmICh0eXBlb2YgaW5jb21wbGV0ZVJlc3VsdHMgIT09IFwidW5kZWZpbmVkXCIpIHtcbiAgICByZXNwb25zZS5kYXRhLmluY29tcGxldGVfcmVzdWx0cyA9IGluY29tcGxldGVSZXN1bHRzO1xuICB9XG4gIGlmICh0eXBlb2YgcmVwb3NpdG9yeVNlbGVjdGlvbiAhPT0gXCJ1bmRlZmluZWRcIikge1xuICAgIHJlc3BvbnNlLmRhdGEucmVwb3NpdG9yeV9zZWxlY3Rpb24gPSByZXBvc2l0b3J5U2VsZWN0aW9uO1xuICB9XG4gIHJlc3BvbnNlLmRhdGEudG90YWxfY291bnQgPSB0b3RhbENvdW50O1xuICByZXR1cm4gcmVzcG9uc2U7XG59XG5cbi8vIHBrZy9kaXN0LXNyYy9pdGVyYXRvci5qc1xuZnVuY3Rpb24gaXRlcmF0b3Iob2N0b2tpdCwgcm91dGUsIHBhcmFtZXRlcnMpIHtcbiAgY29uc3Qgb3B0aW9ucyA9IHR5cGVvZiByb3V0ZSA9PT0gXCJmdW5jdGlvblwiID8gcm91dGUuZW5kcG9pbnQocGFyYW1ldGVycykgOiBvY3Rva2l0LnJlcXVlc3QuZW5kcG9pbnQocm91dGUsIHBhcmFtZXRlcnMpO1xuICBjb25zdCByZXF1ZXN0TWV0aG9kID0gdHlwZW9mIHJvdXRlID09PSBcImZ1bmN0aW9uXCIgPyByb3V0ZSA6IG9jdG9raXQucmVxdWVzdDtcbiAgY29uc3QgbWV0aG9kID0gb3B0aW9ucy5tZXRob2Q7XG4gIGNvbnN0IGhlYWRlcnMgPSBvcHRpb25zLmhlYWRlcnM7XG4gIGxldCB1cmwgPSBvcHRpb25zLnVybDtcbiAgcmV0dXJuIHtcbiAgICBbU3ltYm9sLmFzeW5jSXRlcmF0b3JdOiAoKSA9PiAoe1xuICAgICAgYXN5bmMgbmV4dCgpIHtcbiAgICAgICAgaWYgKCF1cmwpXG4gICAgICAgICAgcmV0dXJuIHsgZG9uZTogdHJ1ZSB9O1xuICAgICAgICB0cnkge1xuICAgICAgICAgIGNvbnN0IHJlc3BvbnNlID0gYXdhaXQgcmVxdWVzdE1ldGhvZCh7IG1ldGhvZCwgdXJsLCBoZWFkZXJzIH0pO1xuICAgICAgICAgIGNvbnN0IG5vcm1hbGl6ZWRSZXNwb25zZSA9IG5vcm1hbGl6ZVBhZ2luYXRlZExpc3RSZXNwb25zZShyZXNwb25zZSk7XG4gICAgICAgICAgdXJsID0gKChub3JtYWxpemVkUmVzcG9uc2UuaGVhZGVycy5saW5rIHx8IFwiXCIpLm1hdGNoKFxuICAgICAgICAgICAgLzwoW14+XSspPjtcXHMqcmVsPVwibmV4dFwiL1xuICAgICAgICAgICkgfHwgW10pWzFdO1xuICAgICAgICAgIHJldHVybiB7IHZhbHVlOiBub3JtYWxpemVkUmVzcG9uc2UgfTtcbiAgICAgICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgICBpZiAoZXJyb3Iuc3RhdHVzICE9PSA0MDkpXG4gICAgICAgICAgICB0aHJvdyBlcnJvcjtcbiAgICAgICAgICB1cmwgPSBcIlwiO1xuICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICB2YWx1ZToge1xuICAgICAgICAgICAgICBzdGF0dXM6IDIwMCxcbiAgICAgICAgICAgICAgaGVhZGVyczoge30sXG4gICAgICAgICAgICAgIGRhdGE6IFtdXG4gICAgICAgICAgICB9XG4gICAgICAgICAgfTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH0pXG4gIH07XG59XG5cbi8vIHBrZy9kaXN0LXNyYy9wYWdpbmF0ZS5qc1xuZnVuY3Rpb24gcGFnaW5hdGUob2N0b2tpdCwgcm91dGUsIHBhcmFtZXRlcnMsIG1hcEZuKSB7XG4gIGlmICh0eXBlb2YgcGFyYW1ldGVycyA9PT0gXCJmdW5jdGlvblwiKSB7XG4gICAgbWFwRm4gPSBwYXJhbWV0ZXJzO1xuICAgIHBhcmFtZXRlcnMgPSB2b2lkIDA7XG4gIH1cbiAgcmV0dXJuIGdhdGhlcihcbiAgICBvY3Rva2l0LFxuICAgIFtdLFxuICAgIGl0ZXJhdG9yKG9jdG9raXQsIHJvdXRlLCBwYXJhbWV0ZXJzKVtTeW1ib2wuYXN5bmNJdGVyYXRvcl0oKSxcbiAgICBtYXBGblxuICApO1xufVxuZnVuY3Rpb24gZ2F0aGVyKG9jdG9raXQsIHJlc3VsdHMsIGl0ZXJhdG9yMiwgbWFwRm4pIHtcbiAgcmV0dXJuIGl0ZXJhdG9yMi5uZXh0KCkudGhlbigocmVzdWx0KSA9PiB7XG4gICAgaWYgKHJlc3VsdC5kb25lKSB7XG4gICAgICByZXR1cm4gcmVzdWx0cztcbiAgICB9XG4gICAgbGV0IGVhcmx5RXhpdCA9IGZhbHNlO1xuICAgIGZ1bmN0aW9uIGRvbmUoKSB7XG4gICAgICBlYXJseUV4aXQgPSB0cnVlO1xuICAgIH1cbiAgICByZXN1bHRzID0gcmVzdWx0cy5jb25jYXQoXG4gICAgICBtYXBGbiA/IG1hcEZuKHJlc3VsdC52YWx1ZSwgZG9uZSkgOiByZXN1bHQudmFsdWUuZGF0YVxuICAgICk7XG4gICAgaWYgKGVhcmx5RXhpdCkge1xuICAgICAgcmV0dXJuIHJlc3VsdHM7XG4gICAgfVxuICAgIHJldHVybiBnYXRoZXIob2N0b2tpdCwgcmVzdWx0cywgaXRlcmF0b3IyLCBtYXBGbik7XG4gIH0pO1xufVxuXG4vLyBwa2cvZGlzdC1zcmMvY29tcG9zZS1wYWdpbmF0ZS5qc1xudmFyIGNvbXBvc2VQYWdpbmF0ZVJlc3QgPSBPYmplY3QuYXNzaWduKHBhZ2luYXRlLCB7XG4gIGl0ZXJhdG9yXG59KTtcblxuLy8gcGtnL2Rpc3Qtc3JjL2dlbmVyYXRlZC9wYWdpbmF0aW5nLWVuZHBvaW50cy5qc1xudmFyIHBhZ2luYXRpbmdFbmRwb2ludHMgPSBbXG4gIFwiR0VUIC9hZHZpc29yaWVzXCIsXG4gIFwiR0VUIC9hcHAvaG9vay9kZWxpdmVyaWVzXCIsXG4gIFwiR0VUIC9hcHAvaW5zdGFsbGF0aW9uLXJlcXVlc3RzXCIsXG4gIFwiR0VUIC9hcHAvaW5zdGFsbGF0aW9uc1wiLFxuICBcIkdFVCAvYXNzaWdubWVudHMve2Fzc2lnbm1lbnRfaWR9L2FjY2VwdGVkX2Fzc2lnbm1lbnRzXCIsXG4gIFwiR0VUIC9jbGFzc3Jvb21zXCIsXG4gIFwiR0VUIC9jbGFzc3Jvb21zL3tjbGFzc3Jvb21faWR9L2Fzc2lnbm1lbnRzXCIsXG4gIFwiR0VUIC9lbnRlcnByaXNlcy97ZW50ZXJwcmlzZX0vZGVwZW5kYWJvdC9hbGVydHNcIixcbiAgXCJHRVQgL2VudGVycHJpc2VzL3tlbnRlcnByaXNlfS9zZWNyZXQtc2Nhbm5pbmcvYWxlcnRzXCIsXG4gIFwiR0VUIC9ldmVudHNcIixcbiAgXCJHRVQgL2dpc3RzXCIsXG4gIFwiR0VUIC9naXN0cy9wdWJsaWNcIixcbiAgXCJHRVQgL2dpc3RzL3N0YXJyZWRcIixcbiAgXCJHRVQgL2dpc3RzL3tnaXN0X2lkfS9jb21tZW50c1wiLFxuICBcIkdFVCAvZ2lzdHMve2dpc3RfaWR9L2NvbW1pdHNcIixcbiAgXCJHRVQgL2dpc3RzL3tnaXN0X2lkfS9mb3Jrc1wiLFxuICBcIkdFVCAvaW5zdGFsbGF0aW9uL3JlcG9zaXRvcmllc1wiLFxuICBcIkdFVCAvaXNzdWVzXCIsXG4gIFwiR0VUIC9saWNlbnNlc1wiLFxuICBcIkdFVCAvbWFya2V0cGxhY2VfbGlzdGluZy9wbGFuc1wiLFxuICBcIkdFVCAvbWFya2V0cGxhY2VfbGlzdGluZy9wbGFucy97cGxhbl9pZH0vYWNjb3VudHNcIixcbiAgXCJHRVQgL21hcmtldHBsYWNlX2xpc3Rpbmcvc3R1YmJlZC9wbGFuc1wiLFxuICBcIkdFVCAvbWFya2V0cGxhY2VfbGlzdGluZy9zdHViYmVkL3BsYW5zL3twbGFuX2lkfS9hY2NvdW50c1wiLFxuICBcIkdFVCAvbmV0d29ya3Mve293bmVyfS97cmVwb30vZXZlbnRzXCIsXG4gIFwiR0VUIC9ub3RpZmljYXRpb25zXCIsXG4gIFwiR0VUIC9vcmdhbml6YXRpb25zXCIsXG4gIFwiR0VUIC9vcmdzL3tvcmd9L2FjdGlvbnMvY2FjaGUvdXNhZ2UtYnktcmVwb3NpdG9yeVwiLFxuICBcIkdFVCAvb3Jncy97b3JnfS9hY3Rpb25zL3Blcm1pc3Npb25zL3JlcG9zaXRvcmllc1wiLFxuICBcIkdFVCAvb3Jncy97b3JnfS9hY3Rpb25zL3J1bm5lcnNcIixcbiAgXCJHRVQgL29yZ3Mve29yZ30vYWN0aW9ucy9zZWNyZXRzXCIsXG4gIFwiR0VUIC9vcmdzL3tvcmd9L2FjdGlvbnMvc2VjcmV0cy97c2VjcmV0X25hbWV9L3JlcG9zaXRvcmllc1wiLFxuICBcIkdFVCAvb3Jncy97b3JnfS9hY3Rpb25zL3ZhcmlhYmxlc1wiLFxuICBcIkdFVCAvb3Jncy97b3JnfS9hY3Rpb25zL3ZhcmlhYmxlcy97bmFtZX0vcmVwb3NpdG9yaWVzXCIsXG4gIFwiR0VUIC9vcmdzL3tvcmd9L2Jsb2Nrc1wiLFxuICBcIkdFVCAvb3Jncy97b3JnfS9jb2RlLXNjYW5uaW5nL2FsZXJ0c1wiLFxuICBcIkdFVCAvb3Jncy97b3JnfS9jb2Rlc3BhY2VzXCIsXG4gIFwiR0VUIC9vcmdzL3tvcmd9L2NvZGVzcGFjZXMvc2VjcmV0c1wiLFxuICBcIkdFVCAvb3Jncy97b3JnfS9jb2Rlc3BhY2VzL3NlY3JldHMve3NlY3JldF9uYW1lfS9yZXBvc2l0b3JpZXNcIixcbiAgXCJHRVQgL29yZ3Mve29yZ30vY29waWxvdC9iaWxsaW5nL3NlYXRzXCIsXG4gIFwiR0VUIC9vcmdzL3tvcmd9L2RlcGVuZGFib3QvYWxlcnRzXCIsXG4gIFwiR0VUIC9vcmdzL3tvcmd9L2RlcGVuZGFib3Qvc2VjcmV0c1wiLFxuICBcIkdFVCAvb3Jncy97b3JnfS9kZXBlbmRhYm90L3NlY3JldHMve3NlY3JldF9uYW1lfS9yZXBvc2l0b3JpZXNcIixcbiAgXCJHRVQgL29yZ3Mve29yZ30vZXZlbnRzXCIsXG4gIFwiR0VUIC9vcmdzL3tvcmd9L2ZhaWxlZF9pbnZpdGF0aW9uc1wiLFxuICBcIkdFVCAvb3Jncy97b3JnfS9ob29rc1wiLFxuICBcIkdFVCAvb3Jncy97b3JnfS9ob29rcy97aG9va19pZH0vZGVsaXZlcmllc1wiLFxuICBcIkdFVCAvb3Jncy97b3JnfS9pbnN0YWxsYXRpb25zXCIsXG4gIFwiR0VUIC9vcmdzL3tvcmd9L2ludml0YXRpb25zXCIsXG4gIFwiR0VUIC9vcmdzL3tvcmd9L2ludml0YXRpb25zL3tpbnZpdGF0aW9uX2lkfS90ZWFtc1wiLFxuICBcIkdFVCAvb3Jncy97b3JnfS9pc3N1ZXNcIixcbiAgXCJHRVQgL29yZ3Mve29yZ30vbWVtYmVyc1wiLFxuICBcIkdFVCAvb3Jncy97b3JnfS9tZW1iZXJzL3t1c2VybmFtZX0vY29kZXNwYWNlc1wiLFxuICBcIkdFVCAvb3Jncy97b3JnfS9taWdyYXRpb25zXCIsXG4gIFwiR0VUIC9vcmdzL3tvcmd9L21pZ3JhdGlvbnMve21pZ3JhdGlvbl9pZH0vcmVwb3NpdG9yaWVzXCIsXG4gIFwiR0VUIC9vcmdzL3tvcmd9L29yZ2FuaXphdGlvbi1yb2xlcy97cm9sZV9pZH0vdGVhbXNcIixcbiAgXCJHRVQgL29yZ3Mve29yZ30vb3JnYW5pemF0aW9uLXJvbGVzL3tyb2xlX2lkfS91c2Vyc1wiLFxuICBcIkdFVCAvb3Jncy97b3JnfS9vdXRzaWRlX2NvbGxhYm9yYXRvcnNcIixcbiAgXCJHRVQgL29yZ3Mve29yZ30vcGFja2FnZXNcIixcbiAgXCJHRVQgL29yZ3Mve29yZ30vcGFja2FnZXMve3BhY2thZ2VfdHlwZX0ve3BhY2thZ2VfbmFtZX0vdmVyc2lvbnNcIixcbiAgXCJHRVQgL29yZ3Mve29yZ30vcGVyc29uYWwtYWNjZXNzLXRva2VuLXJlcXVlc3RzXCIsXG4gIFwiR0VUIC9vcmdzL3tvcmd9L3BlcnNvbmFsLWFjY2Vzcy10b2tlbi1yZXF1ZXN0cy97cGF0X3JlcXVlc3RfaWR9L3JlcG9zaXRvcmllc1wiLFxuICBcIkdFVCAvb3Jncy97b3JnfS9wZXJzb25hbC1hY2Nlc3MtdG9rZW5zXCIsXG4gIFwiR0VUIC9vcmdzL3tvcmd9L3BlcnNvbmFsLWFjY2Vzcy10b2tlbnMve3BhdF9pZH0vcmVwb3NpdG9yaWVzXCIsXG4gIFwiR0VUIC9vcmdzL3tvcmd9L3Byb2plY3RzXCIsXG4gIFwiR0VUIC9vcmdzL3tvcmd9L3Byb3BlcnRpZXMvdmFsdWVzXCIsXG4gIFwiR0VUIC9vcmdzL3tvcmd9L3B1YmxpY19tZW1iZXJzXCIsXG4gIFwiR0VUIC9vcmdzL3tvcmd9L3JlcG9zXCIsXG4gIFwiR0VUIC9vcmdzL3tvcmd9L3J1bGVzZXRzXCIsXG4gIFwiR0VUIC9vcmdzL3tvcmd9L3J1bGVzZXRzL3J1bGUtc3VpdGVzXCIsXG4gIFwiR0VUIC9vcmdzL3tvcmd9L3NlY3JldC1zY2FubmluZy9hbGVydHNcIixcbiAgXCJHRVQgL29yZ3Mve29yZ30vc2VjdXJpdHktYWR2aXNvcmllc1wiLFxuICBcIkdFVCAvb3Jncy97b3JnfS90ZWFtc1wiLFxuICBcIkdFVCAvb3Jncy97b3JnfS90ZWFtcy97dGVhbV9zbHVnfS9kaXNjdXNzaW9uc1wiLFxuICBcIkdFVCAvb3Jncy97b3JnfS90ZWFtcy97dGVhbV9zbHVnfS9kaXNjdXNzaW9ucy97ZGlzY3Vzc2lvbl9udW1iZXJ9L2NvbW1lbnRzXCIsXG4gIFwiR0VUIC9vcmdzL3tvcmd9L3RlYW1zL3t0ZWFtX3NsdWd9L2Rpc2N1c3Npb25zL3tkaXNjdXNzaW9uX251bWJlcn0vY29tbWVudHMve2NvbW1lbnRfbnVtYmVyfS9yZWFjdGlvbnNcIixcbiAgXCJHRVQgL29yZ3Mve29yZ30vdGVhbXMve3RlYW1fc2x1Z30vZGlzY3Vzc2lvbnMve2Rpc2N1c3Npb25fbnVtYmVyfS9yZWFjdGlvbnNcIixcbiAgXCJHRVQgL29yZ3Mve29yZ30vdGVhbXMve3RlYW1fc2x1Z30vaW52aXRhdGlvbnNcIixcbiAgXCJHRVQgL29yZ3Mve29yZ30vdGVhbXMve3RlYW1fc2x1Z30vbWVtYmVyc1wiLFxuICBcIkdFVCAvb3Jncy97b3JnfS90ZWFtcy97dGVhbV9zbHVnfS9wcm9qZWN0c1wiLFxuICBcIkdFVCAvb3Jncy97b3JnfS90ZWFtcy97dGVhbV9zbHVnfS9yZXBvc1wiLFxuICBcIkdFVCAvb3Jncy97b3JnfS90ZWFtcy97dGVhbV9zbHVnfS90ZWFtc1wiLFxuICBcIkdFVCAvcHJvamVjdHMvY29sdW1ucy97Y29sdW1uX2lkfS9jYXJkc1wiLFxuICBcIkdFVCAvcHJvamVjdHMve3Byb2plY3RfaWR9L2NvbGxhYm9yYXRvcnNcIixcbiAgXCJHRVQgL3Byb2plY3RzL3twcm9qZWN0X2lkfS9jb2x1bW5zXCIsXG4gIFwiR0VUIC9yZXBvcy97b3duZXJ9L3tyZXBvfS9hY3Rpb25zL2FydGlmYWN0c1wiLFxuICBcIkdFVCAvcmVwb3Mve293bmVyfS97cmVwb30vYWN0aW9ucy9jYWNoZXNcIixcbiAgXCJHRVQgL3JlcG9zL3tvd25lcn0ve3JlcG99L2FjdGlvbnMvb3JnYW5pemF0aW9uLXNlY3JldHNcIixcbiAgXCJHRVQgL3JlcG9zL3tvd25lcn0ve3JlcG99L2FjdGlvbnMvb3JnYW5pemF0aW9uLXZhcmlhYmxlc1wiLFxuICBcIkdFVCAvcmVwb3Mve293bmVyfS97cmVwb30vYWN0aW9ucy9ydW5uZXJzXCIsXG4gIFwiR0VUIC9yZXBvcy97b3duZXJ9L3tyZXBvfS9hY3Rpb25zL3J1bnNcIixcbiAgXCJHRVQgL3JlcG9zL3tvd25lcn0ve3JlcG99L2FjdGlvbnMvcnVucy97cnVuX2lkfS9hcnRpZmFjdHNcIixcbiAgXCJHRVQgL3JlcG9zL3tvd25lcn0ve3JlcG99L2FjdGlvbnMvcnVucy97cnVuX2lkfS9hdHRlbXB0cy97YXR0ZW1wdF9udW1iZXJ9L2pvYnNcIixcbiAgXCJHRVQgL3JlcG9zL3tvd25lcn0ve3JlcG99L2FjdGlvbnMvcnVucy97cnVuX2lkfS9qb2JzXCIsXG4gIFwiR0VUIC9yZXBvcy97b3duZXJ9L3tyZXBvfS9hY3Rpb25zL3NlY3JldHNcIixcbiAgXCJHRVQgL3JlcG9zL3tvd25lcn0ve3JlcG99L2FjdGlvbnMvdmFyaWFibGVzXCIsXG4gIFwiR0VUIC9yZXBvcy97b3duZXJ9L3tyZXBvfS9hY3Rpb25zL3dvcmtmbG93c1wiLFxuICBcIkdFVCAvcmVwb3Mve293bmVyfS97cmVwb30vYWN0aW9ucy93b3JrZmxvd3Mve3dvcmtmbG93X2lkfS9ydW5zXCIsXG4gIFwiR0VUIC9yZXBvcy97b3duZXJ9L3tyZXBvfS9hY3Rpdml0eVwiLFxuICBcIkdFVCAvcmVwb3Mve293bmVyfS97cmVwb30vYXNzaWduZWVzXCIsXG4gIFwiR0VUIC9yZXBvcy97b3duZXJ9L3tyZXBvfS9icmFuY2hlc1wiLFxuICBcIkdFVCAvcmVwb3Mve293bmVyfS97cmVwb30vY2hlY2stcnVucy97Y2hlY2tfcnVuX2lkfS9hbm5vdGF0aW9uc1wiLFxuICBcIkdFVCAvcmVwb3Mve293bmVyfS97cmVwb30vY2hlY2stc3VpdGVzL3tjaGVja19zdWl0ZV9pZH0vY2hlY2stcnVuc1wiLFxuICBcIkdFVCAvcmVwb3Mve293bmVyfS97cmVwb30vY29kZS1zY2FubmluZy9hbGVydHNcIixcbiAgXCJHRVQgL3JlcG9zL3tvd25lcn0ve3JlcG99L2NvZGUtc2Nhbm5pbmcvYWxlcnRzL3thbGVydF9udW1iZXJ9L2luc3RhbmNlc1wiLFxuICBcIkdFVCAvcmVwb3Mve293bmVyfS97cmVwb30vY29kZS1zY2FubmluZy9hbmFseXNlc1wiLFxuICBcIkdFVCAvcmVwb3Mve293bmVyfS97cmVwb30vY29kZXNwYWNlc1wiLFxuICBcIkdFVCAvcmVwb3Mve293bmVyfS97cmVwb30vY29kZXNwYWNlcy9kZXZjb250YWluZXJzXCIsXG4gIFwiR0VUIC9yZXBvcy97b3duZXJ9L3tyZXBvfS9jb2Rlc3BhY2VzL3NlY3JldHNcIixcbiAgXCJHRVQgL3JlcG9zL3tvd25lcn0ve3JlcG99L2NvbGxhYm9yYXRvcnNcIixcbiAgXCJHRVQgL3JlcG9zL3tvd25lcn0ve3JlcG99L2NvbW1lbnRzXCIsXG4gIFwiR0VUIC9yZXBvcy97b3duZXJ9L3tyZXBvfS9jb21tZW50cy97Y29tbWVudF9pZH0vcmVhY3Rpb25zXCIsXG4gIFwiR0VUIC9yZXBvcy97b3duZXJ9L3tyZXBvfS9jb21taXRzXCIsXG4gIFwiR0VUIC9yZXBvcy97b3duZXJ9L3tyZXBvfS9jb21taXRzL3tjb21taXRfc2hhfS9jb21tZW50c1wiLFxuICBcIkdFVCAvcmVwb3Mve293bmVyfS97cmVwb30vY29tbWl0cy97Y29tbWl0X3NoYX0vcHVsbHNcIixcbiAgXCJHRVQgL3JlcG9zL3tvd25lcn0ve3JlcG99L2NvbW1pdHMve3JlZn0vY2hlY2stcnVuc1wiLFxuICBcIkdFVCAvcmVwb3Mve293bmVyfS97cmVwb30vY29tbWl0cy97cmVmfS9jaGVjay1zdWl0ZXNcIixcbiAgXCJHRVQgL3JlcG9zL3tvd25lcn0ve3JlcG99L2NvbW1pdHMve3JlZn0vc3RhdHVzXCIsXG4gIFwiR0VUIC9yZXBvcy97b3duZXJ9L3tyZXBvfS9jb21taXRzL3tyZWZ9L3N0YXR1c2VzXCIsXG4gIFwiR0VUIC9yZXBvcy97b3duZXJ9L3tyZXBvfS9jb250cmlidXRvcnNcIixcbiAgXCJHRVQgL3JlcG9zL3tvd25lcn0ve3JlcG99L2RlcGVuZGFib3QvYWxlcnRzXCIsXG4gIFwiR0VUIC9yZXBvcy97b3duZXJ9L3tyZXBvfS9kZXBlbmRhYm90L3NlY3JldHNcIixcbiAgXCJHRVQgL3JlcG9zL3tvd25lcn0ve3JlcG99L2RlcGxveW1lbnRzXCIsXG4gIFwiR0VUIC9yZXBvcy97b3duZXJ9L3tyZXBvfS9kZXBsb3ltZW50cy97ZGVwbG95bWVudF9pZH0vc3RhdHVzZXNcIixcbiAgXCJHRVQgL3JlcG9zL3tvd25lcn0ve3JlcG99L2Vudmlyb25tZW50c1wiLFxuICBcIkdFVCAvcmVwb3Mve293bmVyfS97cmVwb30vZW52aXJvbm1lbnRzL3tlbnZpcm9ubWVudF9uYW1lfS9kZXBsb3ltZW50LWJyYW5jaC1wb2xpY2llc1wiLFxuICBcIkdFVCAvcmVwb3Mve293bmVyfS97cmVwb30vZW52aXJvbm1lbnRzL3tlbnZpcm9ubWVudF9uYW1lfS9kZXBsb3ltZW50X3Byb3RlY3Rpb25fcnVsZXMvYXBwc1wiLFxuICBcIkdFVCAvcmVwb3Mve293bmVyfS97cmVwb30vZXZlbnRzXCIsXG4gIFwiR0VUIC9yZXBvcy97b3duZXJ9L3tyZXBvfS9mb3Jrc1wiLFxuICBcIkdFVCAvcmVwb3Mve293bmVyfS97cmVwb30vaG9va3NcIixcbiAgXCJHRVQgL3JlcG9zL3tvd25lcn0ve3JlcG99L2hvb2tzL3tob29rX2lkfS9kZWxpdmVyaWVzXCIsXG4gIFwiR0VUIC9yZXBvcy97b3duZXJ9L3tyZXBvfS9pbnZpdGF0aW9uc1wiLFxuICBcIkdFVCAvcmVwb3Mve293bmVyfS97cmVwb30vaXNzdWVzXCIsXG4gIFwiR0VUIC9yZXBvcy97b3duZXJ9L3tyZXBvfS9pc3N1ZXMvY29tbWVudHNcIixcbiAgXCJHRVQgL3JlcG9zL3tvd25lcn0ve3JlcG99L2lzc3Vlcy9jb21tZW50cy97Y29tbWVudF9pZH0vcmVhY3Rpb25zXCIsXG4gIFwiR0VUIC9yZXBvcy97b3duZXJ9L3tyZXBvfS9pc3N1ZXMvZXZlbnRzXCIsXG4gIFwiR0VUIC9yZXBvcy97b3duZXJ9L3tyZXBvfS9pc3N1ZXMve2lzc3VlX251bWJlcn0vY29tbWVudHNcIixcbiAgXCJHRVQgL3JlcG9zL3tvd25lcn0ve3JlcG99L2lzc3Vlcy97aXNzdWVfbnVtYmVyfS9ldmVudHNcIixcbiAgXCJHRVQgL3JlcG9zL3tvd25lcn0ve3JlcG99L2lzc3Vlcy97aXNzdWVfbnVtYmVyfS9sYWJlbHNcIixcbiAgXCJHRVQgL3JlcG9zL3tvd25lcn0ve3JlcG99L2lzc3Vlcy97aXNzdWVfbnVtYmVyfS9yZWFjdGlvbnNcIixcbiAgXCJHRVQgL3JlcG9zL3tvd25lcn0ve3JlcG99L2lzc3Vlcy97aXNzdWVfbnVtYmVyfS90aW1lbGluZVwiLFxuICBcIkdFVCAvcmVwb3Mve293bmVyfS97cmVwb30va2V5c1wiLFxuICBcIkdFVCAvcmVwb3Mve293bmVyfS97cmVwb30vbGFiZWxzXCIsXG4gIFwiR0VUIC9yZXBvcy97b3duZXJ9L3tyZXBvfS9taWxlc3RvbmVzXCIsXG4gIFwiR0VUIC9yZXBvcy97b3duZXJ9L3tyZXBvfS9taWxlc3RvbmVzL3ttaWxlc3RvbmVfbnVtYmVyfS9sYWJlbHNcIixcbiAgXCJHRVQgL3JlcG9zL3tvd25lcn0ve3JlcG99L25vdGlmaWNhdGlvbnNcIixcbiAgXCJHRVQgL3JlcG9zL3tvd25lcn0ve3JlcG99L3BhZ2VzL2J1aWxkc1wiLFxuICBcIkdFVCAvcmVwb3Mve293bmVyfS97cmVwb30vcHJvamVjdHNcIixcbiAgXCJHRVQgL3JlcG9zL3tvd25lcn0ve3JlcG99L3B1bGxzXCIsXG4gIFwiR0VUIC9yZXBvcy97b3duZXJ9L3tyZXBvfS9wdWxscy9jb21tZW50c1wiLFxuICBcIkdFVCAvcmVwb3Mve293bmVyfS97cmVwb30vcHVsbHMvY29tbWVudHMve2NvbW1lbnRfaWR9L3JlYWN0aW9uc1wiLFxuICBcIkdFVCAvcmVwb3Mve293bmVyfS97cmVwb30vcHVsbHMve3B1bGxfbnVtYmVyfS9jb21tZW50c1wiLFxuICBcIkdFVCAvcmVwb3Mve293bmVyfS97cmVwb30vcHVsbHMve3B1bGxfbnVtYmVyfS9jb21taXRzXCIsXG4gIFwiR0VUIC9yZXBvcy97b3duZXJ9L3tyZXBvfS9wdWxscy97cHVsbF9udW1iZXJ9L2ZpbGVzXCIsXG4gIFwiR0VUIC9yZXBvcy97b3duZXJ9L3tyZXBvfS9wdWxscy97cHVsbF9udW1iZXJ9L3Jldmlld3NcIixcbiAgXCJHRVQgL3JlcG9zL3tvd25lcn0ve3JlcG99L3B1bGxzL3twdWxsX251bWJlcn0vcmV2aWV3cy97cmV2aWV3X2lkfS9jb21tZW50c1wiLFxuICBcIkdFVCAvcmVwb3Mve293bmVyfS97cmVwb30vcmVsZWFzZXNcIixcbiAgXCJHRVQgL3JlcG9zL3tvd25lcn0ve3JlcG99L3JlbGVhc2VzL3tyZWxlYXNlX2lkfS9hc3NldHNcIixcbiAgXCJHRVQgL3JlcG9zL3tvd25lcn0ve3JlcG99L3JlbGVhc2VzL3tyZWxlYXNlX2lkfS9yZWFjdGlvbnNcIixcbiAgXCJHRVQgL3JlcG9zL3tvd25lcn0ve3JlcG99L3J1bGVzL2JyYW5jaGVzL3ticmFuY2h9XCIsXG4gIFwiR0VUIC9yZXBvcy97b3duZXJ9L3tyZXBvfS9ydWxlc2V0c1wiLFxuICBcIkdFVCAvcmVwb3Mve293bmVyfS97cmVwb30vcnVsZXNldHMvcnVsZS1zdWl0ZXNcIixcbiAgXCJHRVQgL3JlcG9zL3tvd25lcn0ve3JlcG99L3NlY3JldC1zY2FubmluZy9hbGVydHNcIixcbiAgXCJHRVQgL3JlcG9zL3tvd25lcn0ve3JlcG99L3NlY3JldC1zY2FubmluZy9hbGVydHMve2FsZXJ0X251bWJlcn0vbG9jYXRpb25zXCIsXG4gIFwiR0VUIC9yZXBvcy97b3duZXJ9L3tyZXBvfS9zZWN1cml0eS1hZHZpc29yaWVzXCIsXG4gIFwiR0VUIC9yZXBvcy97b3duZXJ9L3tyZXBvfS9zdGFyZ2F6ZXJzXCIsXG4gIFwiR0VUIC9yZXBvcy97b3duZXJ9L3tyZXBvfS9zdWJzY3JpYmVyc1wiLFxuICBcIkdFVCAvcmVwb3Mve293bmVyfS97cmVwb30vdGFnc1wiLFxuICBcIkdFVCAvcmVwb3Mve293bmVyfS97cmVwb30vdGVhbXNcIixcbiAgXCJHRVQgL3JlcG9zL3tvd25lcn0ve3JlcG99L3RvcGljc1wiLFxuICBcIkdFVCAvcmVwb3NpdG9yaWVzXCIsXG4gIFwiR0VUIC9yZXBvc2l0b3JpZXMve3JlcG9zaXRvcnlfaWR9L2Vudmlyb25tZW50cy97ZW52aXJvbm1lbnRfbmFtZX0vc2VjcmV0c1wiLFxuICBcIkdFVCAvcmVwb3NpdG9yaWVzL3tyZXBvc2l0b3J5X2lkfS9lbnZpcm9ubWVudHMve2Vudmlyb25tZW50X25hbWV9L3ZhcmlhYmxlc1wiLFxuICBcIkdFVCAvc2VhcmNoL2NvZGVcIixcbiAgXCJHRVQgL3NlYXJjaC9jb21taXRzXCIsXG4gIFwiR0VUIC9zZWFyY2gvaXNzdWVzXCIsXG4gIFwiR0VUIC9zZWFyY2gvbGFiZWxzXCIsXG4gIFwiR0VUIC9zZWFyY2gvcmVwb3NpdG9yaWVzXCIsXG4gIFwiR0VUIC9zZWFyY2gvdG9waWNzXCIsXG4gIFwiR0VUIC9zZWFyY2gvdXNlcnNcIixcbiAgXCJHRVQgL3RlYW1zL3t0ZWFtX2lkfS9kaXNjdXNzaW9uc1wiLFxuICBcIkdFVCAvdGVhbXMve3RlYW1faWR9L2Rpc2N1c3Npb25zL3tkaXNjdXNzaW9uX251bWJlcn0vY29tbWVudHNcIixcbiAgXCJHRVQgL3RlYW1zL3t0ZWFtX2lkfS9kaXNjdXNzaW9ucy97ZGlzY3Vzc2lvbl9udW1iZXJ9L2NvbW1lbnRzL3tjb21tZW50X251bWJlcn0vcmVhY3Rpb25zXCIsXG4gIFwiR0VUIC90ZWFtcy97dGVhbV9pZH0vZGlzY3Vzc2lvbnMve2Rpc2N1c3Npb25fbnVtYmVyfS9yZWFjdGlvbnNcIixcbiAgXCJHRVQgL3RlYW1zL3t0ZWFtX2lkfS9pbnZpdGF0aW9uc1wiLFxuICBcIkdFVCAvdGVhbXMve3RlYW1faWR9L21lbWJlcnNcIixcbiAgXCJHRVQgL3RlYW1zL3t0ZWFtX2lkfS9wcm9qZWN0c1wiLFxuICBcIkdFVCAvdGVhbXMve3RlYW1faWR9L3JlcG9zXCIsXG4gIFwiR0VUIC90ZWFtcy97dGVhbV9pZH0vdGVhbXNcIixcbiAgXCJHRVQgL3VzZXIvYmxvY2tzXCIsXG4gIFwiR0VUIC91c2VyL2NvZGVzcGFjZXNcIixcbiAgXCJHRVQgL3VzZXIvY29kZXNwYWNlcy9zZWNyZXRzXCIsXG4gIFwiR0VUIC91c2VyL2VtYWlsc1wiLFxuICBcIkdFVCAvdXNlci9mb2xsb3dlcnNcIixcbiAgXCJHRVQgL3VzZXIvZm9sbG93aW5nXCIsXG4gIFwiR0VUIC91c2VyL2dwZ19rZXlzXCIsXG4gIFwiR0VUIC91c2VyL2luc3RhbGxhdGlvbnNcIixcbiAgXCJHRVQgL3VzZXIvaW5zdGFsbGF0aW9ucy97aW5zdGFsbGF0aW9uX2lkfS9yZXBvc2l0b3JpZXNcIixcbiAgXCJHRVQgL3VzZXIvaXNzdWVzXCIsXG4gIFwiR0VUIC91c2VyL2tleXNcIixcbiAgXCJHRVQgL3VzZXIvbWFya2V0cGxhY2VfcHVyY2hhc2VzXCIsXG4gIFwiR0VUIC91c2VyL21hcmtldHBsYWNlX3B1cmNoYXNlcy9zdHViYmVkXCIsXG4gIFwiR0VUIC91c2VyL21lbWJlcnNoaXBzL29yZ3NcIixcbiAgXCJHRVQgL3VzZXIvbWlncmF0aW9uc1wiLFxuICBcIkdFVCAvdXNlci9taWdyYXRpb25zL3ttaWdyYXRpb25faWR9L3JlcG9zaXRvcmllc1wiLFxuICBcIkdFVCAvdXNlci9vcmdzXCIsXG4gIFwiR0VUIC91c2VyL3BhY2thZ2VzXCIsXG4gIFwiR0VUIC91c2VyL3BhY2thZ2VzL3twYWNrYWdlX3R5cGV9L3twYWNrYWdlX25hbWV9L3ZlcnNpb25zXCIsXG4gIFwiR0VUIC91c2VyL3B1YmxpY19lbWFpbHNcIixcbiAgXCJHRVQgL3VzZXIvcmVwb3NcIixcbiAgXCJHRVQgL3VzZXIvcmVwb3NpdG9yeV9pbnZpdGF0aW9uc1wiLFxuICBcIkdFVCAvdXNlci9zb2NpYWxfYWNjb3VudHNcIixcbiAgXCJHRVQgL3VzZXIvc3NoX3NpZ25pbmdfa2V5c1wiLFxuICBcIkdFVCAvdXNlci9zdGFycmVkXCIsXG4gIFwiR0VUIC91c2VyL3N1YnNjcmlwdGlvbnNcIixcbiAgXCJHRVQgL3VzZXIvdGVhbXNcIixcbiAgXCJHRVQgL3VzZXJzXCIsXG4gIFwiR0VUIC91c2Vycy97dXNlcm5hbWV9L2V2ZW50c1wiLFxuICBcIkdFVCAvdXNlcnMve3VzZXJuYW1lfS9ldmVudHMvb3Jncy97b3JnfVwiLFxuICBcIkdFVCAvdXNlcnMve3VzZXJuYW1lfS9ldmVudHMvcHVibGljXCIsXG4gIFwiR0VUIC91c2Vycy97dXNlcm5hbWV9L2ZvbGxvd2Vyc1wiLFxuICBcIkdFVCAvdXNlcnMve3VzZXJuYW1lfS9mb2xsb3dpbmdcIixcbiAgXCJHRVQgL3VzZXJzL3t1c2VybmFtZX0vZ2lzdHNcIixcbiAgXCJHRVQgL3VzZXJzL3t1c2VybmFtZX0vZ3BnX2tleXNcIixcbiAgXCJHRVQgL3VzZXJzL3t1c2VybmFtZX0va2V5c1wiLFxuICBcIkdFVCAvdXNlcnMve3VzZXJuYW1lfS9vcmdzXCIsXG4gIFwiR0VUIC91c2Vycy97dXNlcm5hbWV9L3BhY2thZ2VzXCIsXG4gIFwiR0VUIC91c2Vycy97dXNlcm5hbWV9L3Byb2plY3RzXCIsXG4gIFwiR0VUIC91c2Vycy97dXNlcm5hbWV9L3JlY2VpdmVkX2V2ZW50c1wiLFxuICBcIkdFVCAvdXNlcnMve3VzZXJuYW1lfS9yZWNlaXZlZF9ldmVudHMvcHVibGljXCIsXG4gIFwiR0VUIC91c2Vycy97dXNlcm5hbWV9L3JlcG9zXCIsXG4gIFwiR0VUIC91c2Vycy97dXNlcm5hbWV9L3NvY2lhbF9hY2NvdW50c1wiLFxuICBcIkdFVCAvdXNlcnMve3VzZXJuYW1lfS9zc2hfc2lnbmluZ19rZXlzXCIsXG4gIFwiR0VUIC91c2Vycy97dXNlcm5hbWV9L3N0YXJyZWRcIixcbiAgXCJHRVQgL3VzZXJzL3t1c2VybmFtZX0vc3Vic2NyaXB0aW9uc1wiXG5dO1xuXG4vLyBwa2cvZGlzdC1zcmMvcGFnaW5hdGluZy1lbmRwb2ludHMuanNcbmZ1bmN0aW9uIGlzUGFnaW5hdGluZ0VuZHBvaW50KGFyZykge1xuICBpZiAodHlwZW9mIGFyZyA9PT0gXCJzdHJpbmdcIikge1xuICAgIHJldHVybiBwYWdpbmF0aW5nRW5kcG9pbnRzLmluY2x1ZGVzKGFyZyk7XG4gIH0gZWxzZSB7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG59XG5cbi8vIHBrZy9kaXN0LXNyYy9pbmRleC5qc1xuZnVuY3Rpb24gcGFnaW5hdGVSZXN0KG9jdG9raXQpIHtcbiAgcmV0dXJuIHtcbiAgICBwYWdpbmF0ZTogT2JqZWN0LmFzc2lnbihwYWdpbmF0ZS5iaW5kKG51bGwsIG9jdG9raXQpLCB7XG4gICAgICBpdGVyYXRvcjogaXRlcmF0b3IuYmluZChudWxsLCBvY3Rva2l0KVxuICAgIH0pXG4gIH07XG59XG5wYWdpbmF0ZVJlc3QuVkVSU0lPTiA9IFZFUlNJT047XG4vLyBBbm5vdGF0ZSB0aGUgQ29tbW9uSlMgZXhwb3J0IG5hbWVzIGZvciBFU00gaW1wb3J0IGluIG5vZGU6XG4wICYmIChtb2R1bGUuZXhwb3J0cyA9IHtcbiAgY29tcG9zZVBhZ2luYXRlUmVzdCxcbiAgaXNQYWdpbmF0aW5nRW5kcG9pbnQsXG4gIHBhZ2luYXRlUmVzdCxcbiAgcGFnaW5hdGluZ0VuZHBvaW50c1xufSk7XG4iLAogICAgIlwidXNlIHN0cmljdFwiO1xudmFyIF9fY3JlYXRlQmluZGluZyA9ICh0aGlzICYmIHRoaXMuX19jcmVhdGVCaW5kaW5nKSB8fCAoT2JqZWN0LmNyZWF0ZSA/IChmdW5jdGlvbihvLCBtLCBrLCBrMikge1xuICAgIGlmIChrMiA9PT0gdW5kZWZpbmVkKSBrMiA9IGs7XG4gICAgdmFyIGRlc2MgPSBPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKG0sIGspO1xuICAgIGlmICghZGVzYyB8fCAoXCJnZXRcIiBpbiBkZXNjID8gIW0uX19lc01vZHVsZSA6IGRlc2Mud3JpdGFibGUgfHwgZGVzYy5jb25maWd1cmFibGUpKSB7XG4gICAgICBkZXNjID0geyBlbnVtZXJhYmxlOiB0cnVlLCBnZXQ6IGZ1bmN0aW9uKCkgeyByZXR1cm4gbVtrXTsgfSB9O1xuICAgIH1cbiAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkobywgazIsIGRlc2MpO1xufSkgOiAoZnVuY3Rpb24obywgbSwgaywgazIpIHtcbiAgICBpZiAoazIgPT09IHVuZGVmaW5lZCkgazIgPSBrO1xuICAgIG9bazJdID0gbVtrXTtcbn0pKTtcbnZhciBfX3NldE1vZHVsZURlZmF1bHQgPSAodGhpcyAmJiB0aGlzLl9fc2V0TW9kdWxlRGVmYXVsdCkgfHwgKE9iamVjdC5jcmVhdGUgPyAoZnVuY3Rpb24obywgdikge1xuICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShvLCBcImRlZmF1bHRcIiwgeyBlbnVtZXJhYmxlOiB0cnVlLCB2YWx1ZTogdiB9KTtcbn0pIDogZnVuY3Rpb24obywgdikge1xuICAgIG9bXCJkZWZhdWx0XCJdID0gdjtcbn0pO1xudmFyIF9faW1wb3J0U3RhciA9ICh0aGlzICYmIHRoaXMuX19pbXBvcnRTdGFyKSB8fCBmdW5jdGlvbiAobW9kKSB7XG4gICAgaWYgKG1vZCAmJiBtb2QuX19lc01vZHVsZSkgcmV0dXJuIG1vZDtcbiAgICB2YXIgcmVzdWx0ID0ge307XG4gICAgaWYgKG1vZCAhPSBudWxsKSBmb3IgKHZhciBrIGluIG1vZCkgaWYgKGsgIT09IFwiZGVmYXVsdFwiICYmIE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChtb2QsIGspKSBfX2NyZWF0ZUJpbmRpbmcocmVzdWx0LCBtb2QsIGspO1xuICAgIF9fc2V0TW9kdWxlRGVmYXVsdChyZXN1bHQsIG1vZCk7XG4gICAgcmV0dXJuIHJlc3VsdDtcbn07XG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJfX2VzTW9kdWxlXCIsIHsgdmFsdWU6IHRydWUgfSk7XG5leHBvcnRzLmdldE9jdG9raXRPcHRpb25zID0gZXhwb3J0cy5HaXRIdWIgPSBleHBvcnRzLmRlZmF1bHRzID0gZXhwb3J0cy5jb250ZXh0ID0gdm9pZCAwO1xuY29uc3QgQ29udGV4dCA9IF9faW1wb3J0U3RhcihyZXF1aXJlKFwiLi9jb250ZXh0XCIpKTtcbmNvbnN0IFV0aWxzID0gX19pbXBvcnRTdGFyKHJlcXVpcmUoXCIuL2ludGVybmFsL3V0aWxzXCIpKTtcbi8vIG9jdG9raXQgKyBwbHVnaW5zXG5jb25zdCBjb3JlXzEgPSByZXF1aXJlKFwiQG9jdG9raXQvY29yZVwiKTtcbmNvbnN0IHBsdWdpbl9yZXN0X2VuZHBvaW50X21ldGhvZHNfMSA9IHJlcXVpcmUoXCJAb2N0b2tpdC9wbHVnaW4tcmVzdC1lbmRwb2ludC1tZXRob2RzXCIpO1xuY29uc3QgcGx1Z2luX3BhZ2luYXRlX3Jlc3RfMSA9IHJlcXVpcmUoXCJAb2N0b2tpdC9wbHVnaW4tcGFnaW5hdGUtcmVzdFwiKTtcbmV4cG9ydHMuY29udGV4dCA9IG5ldyBDb250ZXh0LkNvbnRleHQoKTtcbmNvbnN0IGJhc2VVcmwgPSBVdGlscy5nZXRBcGlCYXNlVXJsKCk7XG5leHBvcnRzLmRlZmF1bHRzID0ge1xuICAgIGJhc2VVcmwsXG4gICAgcmVxdWVzdDoge1xuICAgICAgICBhZ2VudDogVXRpbHMuZ2V0UHJveHlBZ2VudChiYXNlVXJsKSxcbiAgICAgICAgZmV0Y2g6IFV0aWxzLmdldFByb3h5RmV0Y2goYmFzZVVybClcbiAgICB9XG59O1xuZXhwb3J0cy5HaXRIdWIgPSBjb3JlXzEuT2N0b2tpdC5wbHVnaW4ocGx1Z2luX3Jlc3RfZW5kcG9pbnRfbWV0aG9kc18xLnJlc3RFbmRwb2ludE1ldGhvZHMsIHBsdWdpbl9wYWdpbmF0ZV9yZXN0XzEucGFnaW5hdGVSZXN0KS5kZWZhdWx0cyhleHBvcnRzLmRlZmF1bHRzKTtcbi8qKlxuICogQ29udmllbmNlIGZ1bmN0aW9uIHRvIGNvcnJlY3RseSBmb3JtYXQgT2N0b2tpdCBPcHRpb25zIHRvIHBhc3MgaW50byB0aGUgY29uc3RydWN0b3IuXG4gKlxuICogQHBhcmFtICAgICB0b2tlbiAgICB0aGUgcmVwbyBQQVQgb3IgR0lUSFVCX1RPS0VOXG4gKiBAcGFyYW0gICAgIG9wdGlvbnMgIG90aGVyIG9wdGlvbnMgdG8gc2V0XG4gKi9cbmZ1bmN0aW9uIGdldE9jdG9raXRPcHRpb25zKHRva2VuLCBvcHRpb25zKSB7XG4gICAgY29uc3Qgb3B0cyA9IE9iamVjdC5hc3NpZ24oe30sIG9wdGlvbnMgfHwge30pOyAvLyBTaGFsbG93IGNsb25lIC0gZG9uJ3QgbXV0YXRlIHRoZSBvYmplY3QgcHJvdmlkZWQgYnkgdGhlIGNhbGxlclxuICAgIC8vIEF1dGhcbiAgICBjb25zdCBhdXRoID0gVXRpbHMuZ2V0QXV0aFN0cmluZyh0b2tlbiwgb3B0cyk7XG4gICAgaWYgKGF1dGgpIHtcbiAgICAgICAgb3B0cy5hdXRoID0gYXV0aDtcbiAgICB9XG4gICAgcmV0dXJuIG9wdHM7XG59XG5leHBvcnRzLmdldE9jdG9raXRPcHRpb25zID0gZ2V0T2N0b2tpdE9wdGlvbnM7XG4vLyMgc291cmNlTWFwcGluZ1VSTD11dGlscy5qcy5tYXAiLAogICAgIlwidXNlIHN0cmljdFwiO1xudmFyIF9fY3JlYXRlQmluZGluZyA9ICh0aGlzICYmIHRoaXMuX19jcmVhdGVCaW5kaW5nKSB8fCAoT2JqZWN0LmNyZWF0ZSA/IChmdW5jdGlvbihvLCBtLCBrLCBrMikge1xuICAgIGlmIChrMiA9PT0gdW5kZWZpbmVkKSBrMiA9IGs7XG4gICAgdmFyIGRlc2MgPSBPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKG0sIGspO1xuICAgIGlmICghZGVzYyB8fCAoXCJnZXRcIiBpbiBkZXNjID8gIW0uX19lc01vZHVsZSA6IGRlc2Mud3JpdGFibGUgfHwgZGVzYy5jb25maWd1cmFibGUpKSB7XG4gICAgICBkZXNjID0geyBlbnVtZXJhYmxlOiB0cnVlLCBnZXQ6IGZ1bmN0aW9uKCkgeyByZXR1cm4gbVtrXTsgfSB9O1xuICAgIH1cbiAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkobywgazIsIGRlc2MpO1xufSkgOiAoZnVuY3Rpb24obywgbSwgaywgazIpIHtcbiAgICBpZiAoazIgPT09IHVuZGVmaW5lZCkgazIgPSBrO1xuICAgIG9bazJdID0gbVtrXTtcbn0pKTtcbnZhciBfX3NldE1vZHVsZURlZmF1bHQgPSAodGhpcyAmJiB0aGlzLl9fc2V0TW9kdWxlRGVmYXVsdCkgfHwgKE9iamVjdC5jcmVhdGUgPyAoZnVuY3Rpb24obywgdikge1xuICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShvLCBcImRlZmF1bHRcIiwgeyBlbnVtZXJhYmxlOiB0cnVlLCB2YWx1ZTogdiB9KTtcbn0pIDogZnVuY3Rpb24obywgdikge1xuICAgIG9bXCJkZWZhdWx0XCJdID0gdjtcbn0pO1xudmFyIF9faW1wb3J0U3RhciA9ICh0aGlzICYmIHRoaXMuX19pbXBvcnRTdGFyKSB8fCBmdW5jdGlvbiAobW9kKSB7XG4gICAgaWYgKG1vZCAmJiBtb2QuX19lc01vZHVsZSkgcmV0dXJuIG1vZDtcbiAgICB2YXIgcmVzdWx0ID0ge307XG4gICAgaWYgKG1vZCAhPSBudWxsKSBmb3IgKHZhciBrIGluIG1vZCkgaWYgKGsgIT09IFwiZGVmYXVsdFwiICYmIE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChtb2QsIGspKSBfX2NyZWF0ZUJpbmRpbmcocmVzdWx0LCBtb2QsIGspO1xuICAgIF9fc2V0TW9kdWxlRGVmYXVsdChyZXN1bHQsIG1vZCk7XG4gICAgcmV0dXJuIHJlc3VsdDtcbn07XG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJfX2VzTW9kdWxlXCIsIHsgdmFsdWU6IHRydWUgfSk7XG5leHBvcnRzLmdldE9jdG9raXQgPSBleHBvcnRzLmNvbnRleHQgPSB2b2lkIDA7XG5jb25zdCBDb250ZXh0ID0gX19pbXBvcnRTdGFyKHJlcXVpcmUoXCIuL2NvbnRleHRcIikpO1xuY29uc3QgdXRpbHNfMSA9IHJlcXVpcmUoXCIuL3V0aWxzXCIpO1xuZXhwb3J0cy5jb250ZXh0ID0gbmV3IENvbnRleHQuQ29udGV4dCgpO1xuLyoqXG4gKiBSZXR1cm5zIGEgaHlkcmF0ZWQgb2N0b2tpdCByZWFkeSB0byB1c2UgZm9yIEdpdEh1YiBBY3Rpb25zXG4gKlxuICogQHBhcmFtICAgICB0b2tlbiAgICB0aGUgcmVwbyBQQVQgb3IgR0lUSFVCX1RPS0VOXG4gKiBAcGFyYW0gICAgIG9wdGlvbnMgIG90aGVyIG9wdGlvbnMgdG8gc2V0XG4gKi9cbmZ1bmN0aW9uIGdldE9jdG9raXQodG9rZW4sIG9wdGlvbnMsIC4uLmFkZGl0aW9uYWxQbHVnaW5zKSB7XG4gICAgY29uc3QgR2l0SHViV2l0aFBsdWdpbnMgPSB1dGlsc18xLkdpdEh1Yi5wbHVnaW4oLi4uYWRkaXRpb25hbFBsdWdpbnMpO1xuICAgIHJldHVybiBuZXcgR2l0SHViV2l0aFBsdWdpbnMoKDAsIHV0aWxzXzEuZ2V0T2N0b2tpdE9wdGlvbnMpKHRva2VuLCBvcHRpb25zKSk7XG59XG5leHBvcnRzLmdldE9jdG9raXQgPSBnZXRPY3Rva2l0O1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9Z2l0aHViLmpzLm1hcCIsCiAgICAiXCJ1c2Ugc3RyaWN0XCI7XG52YXIgX19pbXBvcnREZWZhdWx0ID0gKHRoaXMgJiYgdGhpcy5fX2ltcG9ydERlZmF1bHQpIHx8IGZ1bmN0aW9uIChtb2QpIHtcbiAgICByZXR1cm4gKG1vZCAmJiBtb2QuX19lc01vZHVsZSkgPyBtb2QgOiB7IFwiZGVmYXVsdFwiOiBtb2QgfTtcbn07XG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJfX2VzTW9kdWxlXCIsIHsgdmFsdWU6IHRydWUgfSk7XG5leHBvcnRzLmdldFVwbG9hZENodW5rVGltZW91dCA9IGV4cG9ydHMuZ2V0Q29uY3VycmVuY3kgPSBleHBvcnRzLmdldEdpdEh1YldvcmtzcGFjZURpciA9IGV4cG9ydHMuaXNHaGVzID0gZXhwb3J0cy5nZXRSZXN1bHRzU2VydmljZVVybCA9IGV4cG9ydHMuZ2V0UnVudGltZVRva2VuID0gZXhwb3J0cy5nZXRVcGxvYWRDaHVua1NpemUgPSB2b2lkIDA7XG5jb25zdCBvc18xID0gX19pbXBvcnREZWZhdWx0KHJlcXVpcmUoXCJvc1wiKSk7XG4vLyBVc2VkIGZvciBjb250cm9sbGluZyB0aGUgaGlnaFdhdGVyTWFyayB2YWx1ZSBvZiB0aGUgemlwIHRoYXQgaXMgYmVpbmcgc3RyZWFtZWRcbi8vIFRoZSBzYW1lIHZhbHVlIGlzIHVzZWQgYXMgdGhlIGNodW5rIHNpemUgdGhhdCBpcyB1c2UgZHVyaW5nIHVwbG9hZCB0byBibG9iIHN0b3JhZ2VcbmZ1bmN0aW9uIGdldFVwbG9hZENodW5rU2l6ZSgpIHtcbiAgICByZXR1cm4gOCAqIDEwMjQgKiAxMDI0OyAvLyA4IE1CIENodW5rc1xufVxuZXhwb3J0cy5nZXRVcGxvYWRDaHVua1NpemUgPSBnZXRVcGxvYWRDaHVua1NpemU7XG5mdW5jdGlvbiBnZXRSdW50aW1lVG9rZW4oKSB7XG4gICAgY29uc3QgdG9rZW4gPSBwcm9jZXNzLmVudlsnQUNUSU9OU19SVU5USU1FX1RPS0VOJ107XG4gICAgaWYgKCF0b2tlbikge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ1VuYWJsZSB0byBnZXQgdGhlIEFDVElPTlNfUlVOVElNRV9UT0tFTiBlbnYgdmFyaWFibGUnKTtcbiAgICB9XG4gICAgcmV0dXJuIHRva2VuO1xufVxuZXhwb3J0cy5nZXRSdW50aW1lVG9rZW4gPSBnZXRSdW50aW1lVG9rZW47XG5mdW5jdGlvbiBnZXRSZXN1bHRzU2VydmljZVVybCgpIHtcbiAgICBjb25zdCByZXN1bHRzVXJsID0gcHJvY2Vzcy5lbnZbJ0FDVElPTlNfUkVTVUxUU19VUkwnXTtcbiAgICBpZiAoIXJlc3VsdHNVcmwpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdVbmFibGUgdG8gZ2V0IHRoZSBBQ1RJT05TX1JFU1VMVFNfVVJMIGVudiB2YXJpYWJsZScpO1xuICAgIH1cbiAgICByZXR1cm4gbmV3IFVSTChyZXN1bHRzVXJsKS5vcmlnaW47XG59XG5leHBvcnRzLmdldFJlc3VsdHNTZXJ2aWNlVXJsID0gZ2V0UmVzdWx0c1NlcnZpY2VVcmw7XG5mdW5jdGlvbiBpc0doZXMoKSB7XG4gICAgY29uc3QgZ2hVcmwgPSBuZXcgVVJMKHByb2Nlc3MuZW52WydHSVRIVUJfU0VSVkVSX1VSTCddIHx8ICdodHRwczovL2dpdGh1Yi5jb20nKTtcbiAgICBjb25zdCBob3N0bmFtZSA9IGdoVXJsLmhvc3RuYW1lLnRyaW1FbmQoKS50b1VwcGVyQ2FzZSgpO1xuICAgIGNvbnN0IGlzR2l0SHViSG9zdCA9IGhvc3RuYW1lID09PSAnR0lUSFVCLkNPTSc7XG4gICAgY29uc3QgaXNHaGVIb3N0ID0gaG9zdG5hbWUuZW5kc1dpdGgoJy5HSEUuQ09NJyk7XG4gICAgY29uc3QgaXNMb2NhbEhvc3QgPSBob3N0bmFtZS5lbmRzV2l0aCgnLkxPQ0FMSE9TVCcpO1xuICAgIHJldHVybiAhaXNHaXRIdWJIb3N0ICYmICFpc0doZUhvc3QgJiYgIWlzTG9jYWxIb3N0O1xufVxuZXhwb3J0cy5pc0doZXMgPSBpc0doZXM7XG5mdW5jdGlvbiBnZXRHaXRIdWJXb3Jrc3BhY2VEaXIoKSB7XG4gICAgY29uc3QgZ2hXb3Jrc3BhY2VEaXIgPSBwcm9jZXNzLmVudlsnR0lUSFVCX1dPUktTUEFDRSddO1xuICAgIGlmICghZ2hXb3Jrc3BhY2VEaXIpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdVbmFibGUgdG8gZ2V0IHRoZSBHSVRIVUJfV09SS1NQQUNFIGVudiB2YXJpYWJsZScpO1xuICAgIH1cbiAgICByZXR1cm4gZ2hXb3Jrc3BhY2VEaXI7XG59XG5leHBvcnRzLmdldEdpdEh1YldvcmtzcGFjZURpciA9IGdldEdpdEh1YldvcmtzcGFjZURpcjtcbi8vIE1pbWljcyBiZWhhdmlvciBvZiBhemNvcHk6IGh0dHBzOi8vbGVhcm4ubWljcm9zb2Z0LmNvbS9lbi11cy9henVyZS9zdG9yYWdlL2NvbW1vbi9zdG9yYWdlLXVzZS1hemNvcHktb3B0aW1pemVcbi8vIElmIHlvdXIgbWFjaGluZSBoYXMgZmV3ZXIgdGhhbiA1IENQVXMsIHRoZW4gdGhlIHZhbHVlIG9mIHRoaXMgdmFyaWFibGUgaXMgc2V0IHRvIDMyLlxuLy8gT3RoZXJ3aXNlLCB0aGUgZGVmYXVsdCB2YWx1ZSBpcyBlcXVhbCB0byAxNiBtdWx0aXBsaWVkIGJ5IHRoZSBudW1iZXIgb2YgQ1BVcy4gVGhlIG1heGltdW0gdmFsdWUgb2YgdGhpcyB2YXJpYWJsZSBpcyAzMDAuXG5mdW5jdGlvbiBnZXRDb25jdXJyZW5jeSgpIHtcbiAgICBjb25zdCBudW1DUFVzID0gb3NfMS5kZWZhdWx0LmNwdXMoKS5sZW5ndGg7XG4gICAgaWYgKG51bUNQVXMgPD0gNCkge1xuICAgICAgICByZXR1cm4gMzI7XG4gICAgfVxuICAgIGNvbnN0IGNvbmN1cnJlbmN5ID0gMTYgKiBudW1DUFVzO1xuICAgIHJldHVybiBjb25jdXJyZW5jeSA+IDMwMCA/IDMwMCA6IGNvbmN1cnJlbmN5O1xufVxuZXhwb3J0cy5nZXRDb25jdXJyZW5jeSA9IGdldENvbmN1cnJlbmN5O1xuZnVuY3Rpb24gZ2V0VXBsb2FkQ2h1bmtUaW1lb3V0KCkge1xuICAgIHJldHVybiAzMDAwMDA7IC8vIDUgbWludXRlc1xufVxuZXhwb3J0cy5nZXRVcGxvYWRDaHVua1RpbWVvdXQgPSBnZXRVcGxvYWRDaHVua1RpbWVvdXQ7XG4vLyMgc291cmNlTWFwcGluZ1VSTD1jb25maWcuanMubWFwIiwKICAgICJcInVzZSBzdHJpY3RcIjtcbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIl9fZXNNb2R1bGVcIiwgeyB2YWx1ZTogdHJ1ZSB9KTtcbmV4cG9ydHMuaXNKc29uT2JqZWN0ID0gZXhwb3J0cy50eXBlb2ZKc29uVmFsdWUgPSB2b2lkIDA7XG4vKipcbiAqIEdldCB0aGUgdHlwZSBvZiBhIEpTT04gdmFsdWUuXG4gKiBEaXN0aW5ndWlzaGVzIGJldHdlZW4gYXJyYXksIG51bGwgYW5kIG9iamVjdC5cbiAqL1xuZnVuY3Rpb24gdHlwZW9mSnNvblZhbHVlKHZhbHVlKSB7XG4gICAgbGV0IHQgPSB0eXBlb2YgdmFsdWU7XG4gICAgaWYgKHQgPT0gXCJvYmplY3RcIikge1xuICAgICAgICBpZiAoQXJyYXkuaXNBcnJheSh2YWx1ZSkpXG4gICAgICAgICAgICByZXR1cm4gXCJhcnJheVwiO1xuICAgICAgICBpZiAodmFsdWUgPT09IG51bGwpXG4gICAgICAgICAgICByZXR1cm4gXCJudWxsXCI7XG4gICAgfVxuICAgIHJldHVybiB0O1xufVxuZXhwb3J0cy50eXBlb2ZKc29uVmFsdWUgPSB0eXBlb2ZKc29uVmFsdWU7XG4vKipcbiAqIElzIHRoaXMgYSBKU09OIG9iamVjdCAoaW5zdGVhZCBvZiBhbiBhcnJheSBvciBudWxsKT9cbiAqL1xuZnVuY3Rpb24gaXNKc29uT2JqZWN0KHZhbHVlKSB7XG4gICAgcmV0dXJuIHZhbHVlICE9PSBudWxsICYmIHR5cGVvZiB2YWx1ZSA9PSBcIm9iamVjdFwiICYmICFBcnJheS5pc0FycmF5KHZhbHVlKTtcbn1cbmV4cG9ydHMuaXNKc29uT2JqZWN0ID0gaXNKc29uT2JqZWN0O1xuIiwKICAgICJcInVzZSBzdHJpY3RcIjtcbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIl9fZXNNb2R1bGVcIiwgeyB2YWx1ZTogdHJ1ZSB9KTtcbmV4cG9ydHMuYmFzZTY0ZW5jb2RlID0gZXhwb3J0cy5iYXNlNjRkZWNvZGUgPSB2b2lkIDA7XG4vLyBsb29rdXAgdGFibGUgZnJvbSBiYXNlNjQgY2hhcmFjdGVyIHRvIGJ5dGVcbmxldCBlbmNUYWJsZSA9ICdBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWmFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6MDEyMzQ1Njc4OSsvJy5zcGxpdCgnJyk7XG4vLyBsb29rdXAgdGFibGUgZnJvbSBiYXNlNjQgY2hhcmFjdGVyICpjb2RlKiB0byBieXRlIGJlY2F1c2UgbG9va3VwIGJ5IG51bWJlciBpcyBmYXN0XG5sZXQgZGVjVGFibGUgPSBbXTtcbmZvciAobGV0IGkgPSAwOyBpIDwgZW5jVGFibGUubGVuZ3RoOyBpKyspXG4gICAgZGVjVGFibGVbZW5jVGFibGVbaV0uY2hhckNvZGVBdCgwKV0gPSBpO1xuLy8gc3VwcG9ydCBiYXNlNjR1cmwgdmFyaWFudHNcbmRlY1RhYmxlW1wiLVwiLmNoYXJDb2RlQXQoMCldID0gZW5jVGFibGUuaW5kZXhPZihcIitcIik7XG5kZWNUYWJsZVtcIl9cIi5jaGFyQ29kZUF0KDApXSA9IGVuY1RhYmxlLmluZGV4T2YoXCIvXCIpO1xuLyoqXG4gKiBEZWNvZGVzIGEgYmFzZTY0IHN0cmluZyB0byBhIGJ5dGUgYXJyYXkuXG4gKlxuICogLSBpZ25vcmVzIHdoaXRlLXNwYWNlLCBpbmNsdWRpbmcgbGluZSBicmVha3MgYW5kIHRhYnNcbiAqIC0gYWxsb3dzIGlubmVyIHBhZGRpbmcgKGNhbiBkZWNvZGUgY29uY2F0ZW5hdGVkIGJhc2U2NCBzdHJpbmdzKVxuICogLSBkb2VzIG5vdCByZXF1aXJlIHBhZGRpbmdcbiAqIC0gdW5kZXJzdGFuZHMgYmFzZTY0dXJsIGVuY29kaW5nOlxuICogICBcIi1cIiBpbnN0ZWFkIG9mIFwiK1wiLFxuICogICBcIl9cIiBpbnN0ZWFkIG9mIFwiL1wiLFxuICogICBubyBwYWRkaW5nXG4gKi9cbmZ1bmN0aW9uIGJhc2U2NGRlY29kZShiYXNlNjRTdHIpIHtcbiAgICAvLyBlc3RpbWF0ZSBieXRlIHNpemUsIG5vdCBhY2NvdW50aW5nIGZvciBpbm5lciBwYWRkaW5nIGFuZCB3aGl0ZXNwYWNlXG4gICAgbGV0IGVzID0gYmFzZTY0U3RyLmxlbmd0aCAqIDMgLyA0O1xuICAgIC8vIGlmIChlcyAlIDMgIT09IDApXG4gICAgLy8gdGhyb3cgbmV3IEVycm9yKCdpbnZhbGlkIGJhc2U2NCBzdHJpbmcnKTtcbiAgICBpZiAoYmFzZTY0U3RyW2Jhc2U2NFN0ci5sZW5ndGggLSAyXSA9PSAnPScpXG4gICAgICAgIGVzIC09IDI7XG4gICAgZWxzZSBpZiAoYmFzZTY0U3RyW2Jhc2U2NFN0ci5sZW5ndGggLSAxXSA9PSAnPScpXG4gICAgICAgIGVzIC09IDE7XG4gICAgbGV0IGJ5dGVzID0gbmV3IFVpbnQ4QXJyYXkoZXMpLCBieXRlUG9zID0gMCwgLy8gcG9zaXRpb24gaW4gYnl0ZSBhcnJheVxuICAgIGdyb3VwUG9zID0gMCwgLy8gcG9zaXRpb24gaW4gYmFzZTY0IGdyb3VwXG4gICAgYiwgLy8gY3VycmVudCBieXRlXG4gICAgcCA9IDAgLy8gcHJldmlvdXMgYnl0ZVxuICAgIDtcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IGJhc2U2NFN0ci5sZW5ndGg7IGkrKykge1xuICAgICAgICBiID0gZGVjVGFibGVbYmFzZTY0U3RyLmNoYXJDb2RlQXQoaSldO1xuICAgICAgICBpZiAoYiA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICAvLyBub2luc3BlY3Rpb24gRmFsbFRocm91Z2hJblN3aXRjaFN0YXRlbWVudEpTXG4gICAgICAgICAgICBzd2l0Y2ggKGJhc2U2NFN0cltpXSkge1xuICAgICAgICAgICAgICAgIGNhc2UgJz0nOlxuICAgICAgICAgICAgICAgICAgICBncm91cFBvcyA9IDA7IC8vIHJlc2V0IHN0YXRlIHdoZW4gcGFkZGluZyBmb3VuZFxuICAgICAgICAgICAgICAgIGNhc2UgJ1xcbic6XG4gICAgICAgICAgICAgICAgY2FzZSAnXFxyJzpcbiAgICAgICAgICAgICAgICBjYXNlICdcXHQnOlxuICAgICAgICAgICAgICAgIGNhc2UgJyAnOlxuICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsgLy8gc2tpcCB3aGl0ZS1zcGFjZSwgYW5kIHBhZGRpbmdcbiAgICAgICAgICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgICAgICAgICAgICB0aHJvdyBFcnJvcihgaW52YWxpZCBiYXNlNjQgc3RyaW5nLmApO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHN3aXRjaCAoZ3JvdXBQb3MpIHtcbiAgICAgICAgICAgIGNhc2UgMDpcbiAgICAgICAgICAgICAgICBwID0gYjtcbiAgICAgICAgICAgICAgICBncm91cFBvcyA9IDE7XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICBjYXNlIDE6XG4gICAgICAgICAgICAgICAgYnl0ZXNbYnl0ZVBvcysrXSA9IHAgPDwgMiB8IChiICYgNDgpID4+IDQ7XG4gICAgICAgICAgICAgICAgcCA9IGI7XG4gICAgICAgICAgICAgICAgZ3JvdXBQb3MgPSAyO1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgY2FzZSAyOlxuICAgICAgICAgICAgICAgIGJ5dGVzW2J5dGVQb3MrK10gPSAocCAmIDE1KSA8PCA0IHwgKGIgJiA2MCkgPj4gMjtcbiAgICAgICAgICAgICAgICBwID0gYjtcbiAgICAgICAgICAgICAgICBncm91cFBvcyA9IDM7XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICBjYXNlIDM6XG4gICAgICAgICAgICAgICAgYnl0ZXNbYnl0ZVBvcysrXSA9IChwICYgMykgPDwgNiB8IGI7XG4gICAgICAgICAgICAgICAgZ3JvdXBQb3MgPSAwO1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG4gICAgfVxuICAgIGlmIChncm91cFBvcyA9PSAxKVxuICAgICAgICB0aHJvdyBFcnJvcihgaW52YWxpZCBiYXNlNjQgc3RyaW5nLmApO1xuICAgIHJldHVybiBieXRlcy5zdWJhcnJheSgwLCBieXRlUG9zKTtcbn1cbmV4cG9ydHMuYmFzZTY0ZGVjb2RlID0gYmFzZTY0ZGVjb2RlO1xuLyoqXG4gKiBFbmNvZGVzIGEgYnl0ZSBhcnJheSB0byBhIGJhc2U2NCBzdHJpbmcuXG4gKiBBZGRzIHBhZGRpbmcgYXQgdGhlIGVuZC5cbiAqIERvZXMgbm90IGluc2VydCBuZXdsaW5lcy5cbiAqL1xuZnVuY3Rpb24gYmFzZTY0ZW5jb2RlKGJ5dGVzKSB7XG4gICAgbGV0IGJhc2U2NCA9ICcnLCBncm91cFBvcyA9IDAsIC8vIHBvc2l0aW9uIGluIGJhc2U2NCBncm91cFxuICAgIGIsIC8vIGN1cnJlbnQgYnl0ZVxuICAgIHAgPSAwOyAvLyBjYXJyeSBvdmVyIGZyb20gcHJldmlvdXMgYnl0ZVxuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgYnl0ZXMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgYiA9IGJ5dGVzW2ldO1xuICAgICAgICBzd2l0Y2ggKGdyb3VwUG9zKSB7XG4gICAgICAgICAgICBjYXNlIDA6XG4gICAgICAgICAgICAgICAgYmFzZTY0ICs9IGVuY1RhYmxlW2IgPj4gMl07XG4gICAgICAgICAgICAgICAgcCA9IChiICYgMykgPDwgNDtcbiAgICAgICAgICAgICAgICBncm91cFBvcyA9IDE7XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICBjYXNlIDE6XG4gICAgICAgICAgICAgICAgYmFzZTY0ICs9IGVuY1RhYmxlW3AgfCBiID4+IDRdO1xuICAgICAgICAgICAgICAgIHAgPSAoYiAmIDE1KSA8PCAyO1xuICAgICAgICAgICAgICAgIGdyb3VwUG9zID0gMjtcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIGNhc2UgMjpcbiAgICAgICAgICAgICAgICBiYXNlNjQgKz0gZW5jVGFibGVbcCB8IGIgPj4gNl07XG4gICAgICAgICAgICAgICAgYmFzZTY0ICs9IGVuY1RhYmxlW2IgJiA2M107XG4gICAgICAgICAgICAgICAgZ3JvdXBQb3MgPSAwO1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG4gICAgfVxuICAgIC8vIHBhZGRpbmcgcmVxdWlyZWQ/XG4gICAgaWYgKGdyb3VwUG9zKSB7XG4gICAgICAgIGJhc2U2NCArPSBlbmNUYWJsZVtwXTtcbiAgICAgICAgYmFzZTY0ICs9ICc9JztcbiAgICAgICAgaWYgKGdyb3VwUG9zID09IDEpXG4gICAgICAgICAgICBiYXNlNjQgKz0gJz0nO1xuICAgIH1cbiAgICByZXR1cm4gYmFzZTY0O1xufVxuZXhwb3J0cy5iYXNlNjRlbmNvZGUgPSBiYXNlNjRlbmNvZGU7XG4iLAogICAgIlwidXNlIHN0cmljdFwiO1xuLy8gQ29weXJpZ2h0IChjKSAyMDE2LCBEYW5pZWwgV2lydHogIEFsbCByaWdodHMgcmVzZXJ2ZWQuXG4vL1xuLy8gUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0XG4vLyBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlXG4vLyBtZXQ6XG4vL1xuLy8gKiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodFxuLy8gICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuXG4vLyAqIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0XG4vLyAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGVcbi8vICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi5cbi8vICogTmVpdGhlciB0aGUgbmFtZSBvZiBpdHMgYXV0aG9yLCBub3IgdGhlIG5hbWVzIG9mIGl0cyBjb250cmlidXRvcnNcbi8vICAgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlXG4vLyAgIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLlxuLy9cbi8vIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlNcbi8vIFwiQVMgSVNcIiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1Rcbi8vIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUlxuLy8gQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFRcbi8vIE9XTkVSIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLFxuLy8gU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVFxuLy8gTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsXG4vLyBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTllcbi8vIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlRcbi8vIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRVxuLy8gT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS5cbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIl9fZXNNb2R1bGVcIiwgeyB2YWx1ZTogdHJ1ZSB9KTtcbmV4cG9ydHMudXRmOHJlYWQgPSB2b2lkIDA7XG5jb25zdCBmcm9tQ2hhckNvZGVzID0gKGNodW5rKSA9PiBTdHJpbmcuZnJvbUNoYXJDb2RlLmFwcGx5KFN0cmluZywgY2h1bmspO1xuLyoqXG4gKiBAZGVwcmVjYXRlZCBUaGlzIGZ1bmN0aW9uIHdpbGwgbm8gbG9uZ2VyIGJlIGV4cG9ydGVkIHdpdGggdGhlIG5leHQgbWFqb3JcbiAqIHJlbGVhc2UsIHNpbmNlIHByb3RvYnVmLXRzIGhhcyBzd2l0Y2ggdG8gVGV4dERlY29kZXIgQVBJLiBJZiB5b3UgbmVlZCB0aGlzXG4gKiBmdW5jdGlvbiwgcGxlYXNlIG1pZ3JhdGUgdG8gQHByb3RvYnVmanMvdXRmOC4gRm9yIGNvbnRleHQsIHNlZVxuICogaHR0cHM6Ly9naXRodWIuY29tL3RpbW9zdGFtbS9wcm90b2J1Zi10cy9pc3N1ZXMvMTg0XG4gKlxuICogUmVhZHMgVVRGOCBieXRlcyBhcyBhIHN0cmluZy5cbiAqXG4gKiBTZWUgW3Byb3RvYnVmanMgLyB1dGY4XShodHRwczovL2dpdGh1Yi5jb20vcHJvdG9idWZqcy9wcm90b2J1Zi5qcy9ibG9iLzk4OTNlMzViODU0NjIxY2NlNjRhZjRiZjZiZTJjZmY0ZmI4OTI3OTYvbGliL3V0ZjgvaW5kZXguanMjTDQwKVxuICpcbiAqIENvcHlyaWdodCAoYykgMjAxNiwgRGFuaWVsIFdpcnR6XG4gKi9cbmZ1bmN0aW9uIHV0ZjhyZWFkKGJ5dGVzKSB7XG4gICAgaWYgKGJ5dGVzLmxlbmd0aCA8IDEpXG4gICAgICAgIHJldHVybiBcIlwiO1xuICAgIGxldCBwb3MgPSAwLCAvLyBwb3NpdGlvbiBpbiBieXRlc1xuICAgIHBhcnRzID0gW10sIGNodW5rID0gW10sIGkgPSAwLCAvLyBjaGFyIG9mZnNldFxuICAgIHQ7IC8vIHRlbXBvcmFyeVxuICAgIGxldCBsZW4gPSBieXRlcy5sZW5ndGg7XG4gICAgd2hpbGUgKHBvcyA8IGxlbikge1xuICAgICAgICB0ID0gYnl0ZXNbcG9zKytdO1xuICAgICAgICBpZiAodCA8IDEyOClcbiAgICAgICAgICAgIGNodW5rW2krK10gPSB0O1xuICAgICAgICBlbHNlIGlmICh0ID4gMTkxICYmIHQgPCAyMjQpXG4gICAgICAgICAgICBjaHVua1tpKytdID0gKHQgJiAzMSkgPDwgNiB8IGJ5dGVzW3BvcysrXSAmIDYzO1xuICAgICAgICBlbHNlIGlmICh0ID4gMjM5ICYmIHQgPCAzNjUpIHtcbiAgICAgICAgICAgIHQgPSAoKHQgJiA3KSA8PCAxOCB8IChieXRlc1twb3MrK10gJiA2MykgPDwgMTIgfCAoYnl0ZXNbcG9zKytdICYgNjMpIDw8IDYgfCBieXRlc1twb3MrK10gJiA2MykgLSAweDEwMDAwO1xuICAgICAgICAgICAgY2h1bmtbaSsrXSA9IDB4RDgwMCArICh0ID4+IDEwKTtcbiAgICAgICAgICAgIGNodW5rW2krK10gPSAweERDMDAgKyAodCAmIDEwMjMpO1xuICAgICAgICB9XG4gICAgICAgIGVsc2VcbiAgICAgICAgICAgIGNodW5rW2krK10gPSAodCAmIDE1KSA8PCAxMiB8IChieXRlc1twb3MrK10gJiA2MykgPDwgNiB8IGJ5dGVzW3BvcysrXSAmIDYzO1xuICAgICAgICBpZiAoaSA+IDgxOTEpIHtcbiAgICAgICAgICAgIHBhcnRzLnB1c2goZnJvbUNoYXJDb2RlcyhjaHVuaykpO1xuICAgICAgICAgICAgaSA9IDA7XG4gICAgICAgIH1cbiAgICB9XG4gICAgaWYgKHBhcnRzLmxlbmd0aCkge1xuICAgICAgICBpZiAoaSlcbiAgICAgICAgICAgIHBhcnRzLnB1c2goZnJvbUNoYXJDb2RlcyhjaHVuay5zbGljZSgwLCBpKSkpO1xuICAgICAgICByZXR1cm4gcGFydHMuam9pbihcIlwiKTtcbiAgICB9XG4gICAgcmV0dXJuIGZyb21DaGFyQ29kZXMoY2h1bmsuc2xpY2UoMCwgaSkpO1xufVxuZXhwb3J0cy51dGY4cmVhZCA9IHV0ZjhyZWFkO1xuIiwKICAgICJcInVzZSBzdHJpY3RcIjtcbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIl9fZXNNb2R1bGVcIiwgeyB2YWx1ZTogdHJ1ZSB9KTtcbmV4cG9ydHMuV2lyZVR5cGUgPSBleHBvcnRzLm1lcmdlQmluYXJ5T3B0aW9ucyA9IGV4cG9ydHMuVW5rbm93bkZpZWxkSGFuZGxlciA9IHZvaWQgMDtcbi8qKlxuICogVGhpcyBoYW5kbGVyIGltcGxlbWVudHMgdGhlIGRlZmF1bHQgYmVoYXZpb3VyIGZvciB1bmtub3duIGZpZWxkcy5cbiAqIFdoZW4gcmVhZGluZyBkYXRhLCB1bmtub3duIGZpZWxkcyBhcmUgc3RvcmVkIG9uIHRoZSBtZXNzYWdlLCBpbiBhXG4gKiBzeW1ib2wgcHJvcGVydHkuXG4gKiBXaGVuIHdyaXRpbmcgZGF0YSwgdGhlIHN5bWJvbCBwcm9wZXJ0eSBpcyBxdWVyaWVkIGFuZCB1bmtub3duIGZpZWxkc1xuICogYXJlIHNlcmlhbGl6ZWQgaW50byB0aGUgb3V0cHV0IGFnYWluLlxuICovXG52YXIgVW5rbm93bkZpZWxkSGFuZGxlcjtcbihmdW5jdGlvbiAoVW5rbm93bkZpZWxkSGFuZGxlcikge1xuICAgIC8qKlxuICAgICAqIFRoZSBzeW1ib2wgdXNlZCB0byBzdG9yZSB1bmtub3duIGZpZWxkcyBmb3IgYSBtZXNzYWdlLlxuICAgICAqIFRoZSBwcm9wZXJ0eSBtdXN0IGNvbmZvcm0gdG8gYFVua25vd25GaWVsZENvbnRhaW5lcmAuXG4gICAgICovXG4gICAgVW5rbm93bkZpZWxkSGFuZGxlci5zeW1ib2wgPSBTeW1ib2wuZm9yKFwicHJvdG9idWYtdHMvdW5rbm93blwiKTtcbiAgICAvKipcbiAgICAgKiBTdG9yZSBhbiB1bmtub3duIGZpZWxkIGR1cmluZyBiaW5hcnkgcmVhZCBkaXJlY3RseSBvbiB0aGUgbWVzc2FnZS5cbiAgICAgKiBUaGlzIG1ldGhvZCBpcyBjb21wYXRpYmxlIHdpdGggYEJpbmFyeVJlYWRPcHRpb25zLnJlYWRVbmtub3duRmllbGRgLlxuICAgICAqL1xuICAgIFVua25vd25GaWVsZEhhbmRsZXIub25SZWFkID0gKHR5cGVOYW1lLCBtZXNzYWdlLCBmaWVsZE5vLCB3aXJlVHlwZSwgZGF0YSkgPT4ge1xuICAgICAgICBsZXQgY29udGFpbmVyID0gaXMobWVzc2FnZSkgPyBtZXNzYWdlW1Vua25vd25GaWVsZEhhbmRsZXIuc3ltYm9sXSA6IG1lc3NhZ2VbVW5rbm93bkZpZWxkSGFuZGxlci5zeW1ib2xdID0gW107XG4gICAgICAgIGNvbnRhaW5lci5wdXNoKHsgbm86IGZpZWxkTm8sIHdpcmVUeXBlLCBkYXRhIH0pO1xuICAgIH07XG4gICAgLyoqXG4gICAgICogV3JpdGUgdW5rbm93biBmaWVsZHMgc3RvcmVkIGZvciB0aGUgbWVzc2FnZSB0byB0aGUgd3JpdGVyLlxuICAgICAqIFRoaXMgbWV0aG9kIGlzIGNvbXBhdGlibGUgd2l0aCBgQmluYXJ5V3JpdGVPcHRpb25zLndyaXRlVW5rbm93bkZpZWxkc2AuXG4gICAgICovXG4gICAgVW5rbm93bkZpZWxkSGFuZGxlci5vbldyaXRlID0gKHR5cGVOYW1lLCBtZXNzYWdlLCB3cml0ZXIpID0+IHtcbiAgICAgICAgZm9yIChsZXQgeyBubywgd2lyZVR5cGUsIGRhdGEgfSBvZiBVbmtub3duRmllbGRIYW5kbGVyLmxpc3QobWVzc2FnZSkpXG4gICAgICAgICAgICB3cml0ZXIudGFnKG5vLCB3aXJlVHlwZSkucmF3KGRhdGEpO1xuICAgIH07XG4gICAgLyoqXG4gICAgICogTGlzdCB1bmtub3duIGZpZWxkcyBzdG9yZWQgZm9yIHRoZSBtZXNzYWdlLlxuICAgICAqIE5vdGUgdGhhdCB0aGVyZSBtYXkgYmUgbXVsdGlwbGVzIGZpZWxkcyB3aXRoIHRoZSBzYW1lIG51bWJlci5cbiAgICAgKi9cbiAgICBVbmtub3duRmllbGRIYW5kbGVyLmxpc3QgPSAobWVzc2FnZSwgZmllbGRObykgPT4ge1xuICAgICAgICBpZiAoaXMobWVzc2FnZSkpIHtcbiAgICAgICAgICAgIGxldCBhbGwgPSBtZXNzYWdlW1Vua25vd25GaWVsZEhhbmRsZXIuc3ltYm9sXTtcbiAgICAgICAgICAgIHJldHVybiBmaWVsZE5vID8gYWxsLmZpbHRlcih1ZiA9PiB1Zi5ubyA9PSBmaWVsZE5vKSA6IGFsbDtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gW107XG4gICAgfTtcbiAgICAvKipcbiAgICAgKiBSZXR1cm5zIHRoZSBsYXN0IHVua25vd24gZmllbGQgYnkgZmllbGQgbnVtYmVyLlxuICAgICAqL1xuICAgIFVua25vd25GaWVsZEhhbmRsZXIubGFzdCA9IChtZXNzYWdlLCBmaWVsZE5vKSA9PiBVbmtub3duRmllbGRIYW5kbGVyLmxpc3QobWVzc2FnZSwgZmllbGRObykuc2xpY2UoLTEpWzBdO1xuICAgIGNvbnN0IGlzID0gKG1lc3NhZ2UpID0+IG1lc3NhZ2UgJiYgQXJyYXkuaXNBcnJheShtZXNzYWdlW1Vua25vd25GaWVsZEhhbmRsZXIuc3ltYm9sXSk7XG59KShVbmtub3duRmllbGRIYW5kbGVyID0gZXhwb3J0cy5Vbmtub3duRmllbGRIYW5kbGVyIHx8IChleHBvcnRzLlVua25vd25GaWVsZEhhbmRsZXIgPSB7fSkpO1xuLyoqXG4gKiBNZXJnZXMgYmluYXJ5IHdyaXRlIG9yIHJlYWQgb3B0aW9ucy4gTGF0ZXIgdmFsdWVzIG92ZXJyaWRlIGVhcmxpZXIgdmFsdWVzLlxuICovXG5mdW5jdGlvbiBtZXJnZUJpbmFyeU9wdGlvbnMoYSwgYikge1xuICAgIHJldHVybiBPYmplY3QuYXNzaWduKE9iamVjdC5hc3NpZ24oe30sIGEpLCBiKTtcbn1cbmV4cG9ydHMubWVyZ2VCaW5hcnlPcHRpb25zID0gbWVyZ2VCaW5hcnlPcHRpb25zO1xuLyoqXG4gKiBQcm90b2J1ZiBiaW5hcnkgZm9ybWF0IHdpcmUgdHlwZXMuXG4gKlxuICogQSB3aXJlIHR5cGUgcHJvdmlkZXMganVzdCBlbm91Z2ggaW5mb3JtYXRpb24gdG8gZmluZCB0aGUgbGVuZ3RoIG9mIHRoZVxuICogZm9sbG93aW5nIHZhbHVlLlxuICpcbiAqIFNlZSBodHRwczovL2RldmVsb3BlcnMuZ29vZ2xlLmNvbS9wcm90b2NvbC1idWZmZXJzL2RvY3MvZW5jb2Rpbmcjc3RydWN0dXJlXG4gKi9cbnZhciBXaXJlVHlwZTtcbihmdW5jdGlvbiAoV2lyZVR5cGUpIHtcbiAgICAvKipcbiAgICAgKiBVc2VkIGZvciBpbnQzMiwgaW50NjQsIHVpbnQzMiwgdWludDY0LCBzaW50MzIsIHNpbnQ2NCwgYm9vbCwgZW51bVxuICAgICAqL1xuICAgIFdpcmVUeXBlW1dpcmVUeXBlW1wiVmFyaW50XCJdID0gMF0gPSBcIlZhcmludFwiO1xuICAgIC8qKlxuICAgICAqIFVzZWQgZm9yIGZpeGVkNjQsIHNmaXhlZDY0LCBkb3VibGUuXG4gICAgICogQWx3YXlzIDggYnl0ZXMgd2l0aCBsaXR0bGUtZW5kaWFuIGJ5dGUgb3JkZXIuXG4gICAgICovXG4gICAgV2lyZVR5cGVbV2lyZVR5cGVbXCJCaXQ2NFwiXSA9IDFdID0gXCJCaXQ2NFwiO1xuICAgIC8qKlxuICAgICAqIFVzZWQgZm9yIHN0cmluZywgYnl0ZXMsIGVtYmVkZGVkIG1lc3NhZ2VzLCBwYWNrZWQgcmVwZWF0ZWQgZmllbGRzXG4gICAgICpcbiAgICAgKiBPbmx5IHJlcGVhdGVkIG51bWVyaWMgdHlwZXMgKHR5cGVzIHdoaWNoIHVzZSB0aGUgdmFyaW50LCAzMi1iaXQsXG4gICAgICogb3IgNjQtYml0IHdpcmUgdHlwZXMpIGNhbiBiZSBwYWNrZWQuIEluIHByb3RvMywgc3VjaCBmaWVsZHMgYXJlXG4gICAgICogcGFja2VkIGJ5IGRlZmF1bHQuXG4gICAgICovXG4gICAgV2lyZVR5cGVbV2lyZVR5cGVbXCJMZW5ndGhEZWxpbWl0ZWRcIl0gPSAyXSA9IFwiTGVuZ3RoRGVsaW1pdGVkXCI7XG4gICAgLyoqXG4gICAgICogVXNlZCBmb3IgZ3JvdXBzXG4gICAgICogQGRlcHJlY2F0ZWRcbiAgICAgKi9cbiAgICBXaXJlVHlwZVtXaXJlVHlwZVtcIlN0YXJ0R3JvdXBcIl0gPSAzXSA9IFwiU3RhcnRHcm91cFwiO1xuICAgIC8qKlxuICAgICAqIFVzZWQgZm9yIGdyb3Vwc1xuICAgICAqIEBkZXByZWNhdGVkXG4gICAgICovXG4gICAgV2lyZVR5cGVbV2lyZVR5cGVbXCJFbmRHcm91cFwiXSA9IDRdID0gXCJFbmRHcm91cFwiO1xuICAgIC8qKlxuICAgICAqIFVzZWQgZm9yIGZpeGVkMzIsIHNmaXhlZDMyLCBmbG9hdC5cbiAgICAgKiBBbHdheXMgNCBieXRlcyB3aXRoIGxpdHRsZS1lbmRpYW4gYnl0ZSBvcmRlci5cbiAgICAgKi9cbiAgICBXaXJlVHlwZVtXaXJlVHlwZVtcIkJpdDMyXCJdID0gNV0gPSBcIkJpdDMyXCI7XG59KShXaXJlVHlwZSA9IGV4cG9ydHMuV2lyZVR5cGUgfHwgKGV4cG9ydHMuV2lyZVR5cGUgPSB7fSkpO1xuIiwKICAgICJcInVzZSBzdHJpY3RcIjtcbi8vIENvcHlyaWdodCAyMDA4IEdvb2dsZSBJbmMuICBBbGwgcmlnaHRzIHJlc2VydmVkLlxuLy9cbi8vIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dFxuLy8gbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZVxuLy8gbWV0OlxuLy9cbi8vICogUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHRcbi8vIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci5cbi8vICogUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZVxuLy8gY29weXJpZ2h0IG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lclxuLy8gaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZVxuLy8gZGlzdHJpYnV0aW9uLlxuLy8gKiBOZWl0aGVyIHRoZSBuYW1lIG9mIEdvb2dsZSBJbmMuIG5vciB0aGUgbmFtZXMgb2YgaXRzXG4vLyBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbVxuLy8gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi5cbi8vXG4vLyBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTXG4vLyBcIkFTIElTXCIgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UXG4vLyBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1Jcbi8vIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUXG4vLyBPV05FUiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCxcbi8vIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1Rcbi8vIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLFxuLy8gREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZXG4vLyBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUXG4vLyAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0Vcbi8vIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuXG4vL1xuLy8gQ29kZSBnZW5lcmF0ZWQgYnkgdGhlIFByb3RvY29sIEJ1ZmZlciBjb21waWxlciBpcyBvd25lZCBieSB0aGUgb3duZXJcbi8vIG9mIHRoZSBpbnB1dCBmaWxlIHVzZWQgd2hlbiBnZW5lcmF0aW5nIGl0LiAgVGhpcyBjb2RlIGlzIG5vdFxuLy8gc3RhbmRhbG9uZSBhbmQgcmVxdWlyZXMgYSBzdXBwb3J0IGxpYnJhcnkgdG8gYmUgbGlua2VkIHdpdGggaXQuICBUaGlzXG4vLyBzdXBwb3J0IGxpYnJhcnkgaXMgaXRzZWxmIGNvdmVyZWQgYnkgdGhlIGFib3ZlIGxpY2Vuc2UuXG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJfX2VzTW9kdWxlXCIsIHsgdmFsdWU6IHRydWUgfSk7XG5leHBvcnRzLnZhcmludDMycmVhZCA9IGV4cG9ydHMudmFyaW50MzJ3cml0ZSA9IGV4cG9ydHMuaW50NjR0b1N0cmluZyA9IGV4cG9ydHMuaW50NjRmcm9tU3RyaW5nID0gZXhwb3J0cy52YXJpbnQ2NHdyaXRlID0gZXhwb3J0cy52YXJpbnQ2NHJlYWQgPSB2b2lkIDA7XG4vKipcbiAqIFJlYWQgYSA2NCBiaXQgdmFyaW50IGFzIHR3byBKUyBudW1iZXJzLlxuICpcbiAqIFJldHVybnMgdHVwbGU6XG4gKiBbMF06IGxvdyBiaXRzXG4gKiBbMF06IGhpZ2ggYml0c1xuICpcbiAqIENvcHlyaWdodCAyMDA4IEdvb2dsZSBJbmMuICBBbGwgcmlnaHRzIHJlc2VydmVkLlxuICpcbiAqIFNlZSBodHRwczovL2dpdGh1Yi5jb20vcHJvdG9jb2xidWZmZXJzL3Byb3RvYnVmL2Jsb2IvOGE3MTkyN2Q3NGE0Y2UzNGVmZTJkODc2OWZkYTE5OGY1MmQyMGQxMi9qcy9leHBlcmltZW50YWwvcnVudGltZS9rZXJuZWwvYnVmZmVyX2RlY29kZXIuanMjTDE3NVxuICovXG5mdW5jdGlvbiB2YXJpbnQ2NHJlYWQoKSB7XG4gICAgbGV0IGxvd0JpdHMgPSAwO1xuICAgIGxldCBoaWdoQml0cyA9IDA7XG4gICAgZm9yIChsZXQgc2hpZnQgPSAwOyBzaGlmdCA8IDI4OyBzaGlmdCArPSA3KSB7XG4gICAgICAgIGxldCBiID0gdGhpcy5idWZbdGhpcy5wb3MrK107XG4gICAgICAgIGxvd0JpdHMgfD0gKGIgJiAweDdGKSA8PCBzaGlmdDtcbiAgICAgICAgaWYgKChiICYgMHg4MCkgPT0gMCkge1xuICAgICAgICAgICAgdGhpcy5hc3NlcnRCb3VuZHMoKTtcbiAgICAgICAgICAgIHJldHVybiBbbG93Qml0cywgaGlnaEJpdHNdO1xuICAgICAgICB9XG4gICAgfVxuICAgIGxldCBtaWRkbGVCeXRlID0gdGhpcy5idWZbdGhpcy5wb3MrK107XG4gICAgLy8gbGFzdCBmb3VyIGJpdHMgb2YgdGhlIGZpcnN0IDMyIGJpdCBudW1iZXJcbiAgICBsb3dCaXRzIHw9IChtaWRkbGVCeXRlICYgMHgwRikgPDwgMjg7XG4gICAgLy8gMyB1cHBlciBiaXRzIGFyZSBwYXJ0IG9mIHRoZSBuZXh0IDMyIGJpdCBudW1iZXJcbiAgICBoaWdoQml0cyA9IChtaWRkbGVCeXRlICYgMHg3MCkgPj4gNDtcbiAgICBpZiAoKG1pZGRsZUJ5dGUgJiAweDgwKSA9PSAwKSB7XG4gICAgICAgIHRoaXMuYXNzZXJ0Qm91bmRzKCk7XG4gICAgICAgIHJldHVybiBbbG93Qml0cywgaGlnaEJpdHNdO1xuICAgIH1cbiAgICBmb3IgKGxldCBzaGlmdCA9IDM7IHNoaWZ0IDw9IDMxOyBzaGlmdCArPSA3KSB7XG4gICAgICAgIGxldCBiID0gdGhpcy5idWZbdGhpcy5wb3MrK107XG4gICAgICAgIGhpZ2hCaXRzIHw9IChiICYgMHg3RikgPDwgc2hpZnQ7XG4gICAgICAgIGlmICgoYiAmIDB4ODApID09IDApIHtcbiAgICAgICAgICAgIHRoaXMuYXNzZXJ0Qm91bmRzKCk7XG4gICAgICAgICAgICByZXR1cm4gW2xvd0JpdHMsIGhpZ2hCaXRzXTtcbiAgICAgICAgfVxuICAgIH1cbiAgICB0aHJvdyBuZXcgRXJyb3IoJ2ludmFsaWQgdmFyaW50Jyk7XG59XG5leHBvcnRzLnZhcmludDY0cmVhZCA9IHZhcmludDY0cmVhZDtcbi8qKlxuICogV3JpdGUgYSA2NCBiaXQgdmFyaW50LCBnaXZlbiBhcyB0d28gSlMgbnVtYmVycywgdG8gdGhlIGdpdmVuIGJ5dGVzIGFycmF5LlxuICpcbiAqIENvcHlyaWdodCAyMDA4IEdvb2dsZSBJbmMuICBBbGwgcmlnaHRzIHJlc2VydmVkLlxuICpcbiAqIFNlZSBodHRwczovL2dpdGh1Yi5jb20vcHJvdG9jb2xidWZmZXJzL3Byb3RvYnVmL2Jsb2IvOGE3MTkyN2Q3NGE0Y2UzNGVmZTJkODc2OWZkYTE5OGY1MmQyMGQxMi9qcy9leHBlcmltZW50YWwvcnVudGltZS9rZXJuZWwvd3JpdGVyLmpzI0wzNDRcbiAqL1xuZnVuY3Rpb24gdmFyaW50NjR3cml0ZShsbywgaGksIGJ5dGVzKSB7XG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCAyODsgaSA9IGkgKyA3KSB7XG4gICAgICAgIGNvbnN0IHNoaWZ0ID0gbG8gPj4+IGk7XG4gICAgICAgIGNvbnN0IGhhc05leHQgPSAhKChzaGlmdCA+Pj4gNykgPT0gMCAmJiBoaSA9PSAwKTtcbiAgICAgICAgY29uc3QgYnl0ZSA9IChoYXNOZXh0ID8gc2hpZnQgfCAweDgwIDogc2hpZnQpICYgMHhGRjtcbiAgICAgICAgYnl0ZXMucHVzaChieXRlKTtcbiAgICAgICAgaWYgKCFoYXNOZXh0KSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICB9XG4gICAgY29uc3Qgc3BsaXRCaXRzID0gKChsbyA+Pj4gMjgpICYgMHgwRikgfCAoKGhpICYgMHgwNykgPDwgNCk7XG4gICAgY29uc3QgaGFzTW9yZUJpdHMgPSAhKChoaSA+PiAzKSA9PSAwKTtcbiAgICBieXRlcy5wdXNoKChoYXNNb3JlQml0cyA/IHNwbGl0Qml0cyB8IDB4ODAgOiBzcGxpdEJpdHMpICYgMHhGRik7XG4gICAgaWYgKCFoYXNNb3JlQml0cykge1xuICAgICAgICByZXR1cm47XG4gICAgfVxuICAgIGZvciAobGV0IGkgPSAzOyBpIDwgMzE7IGkgPSBpICsgNykge1xuICAgICAgICBjb25zdCBzaGlmdCA9IGhpID4+PiBpO1xuICAgICAgICBjb25zdCBoYXNOZXh0ID0gISgoc2hpZnQgPj4+IDcpID09IDApO1xuICAgICAgICBjb25zdCBieXRlID0gKGhhc05leHQgPyBzaGlmdCB8IDB4ODAgOiBzaGlmdCkgJiAweEZGO1xuICAgICAgICBieXRlcy5wdXNoKGJ5dGUpO1xuICAgICAgICBpZiAoIWhhc05leHQpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgIH1cbiAgICBieXRlcy5wdXNoKChoaSA+Pj4gMzEpICYgMHgwMSk7XG59XG5leHBvcnRzLnZhcmludDY0d3JpdGUgPSB2YXJpbnQ2NHdyaXRlO1xuLy8gY29uc3RhbnRzIGZvciBiaW5hcnkgbWF0aFxuY29uc3QgVFdPX1BXUl8zMl9EQkwgPSAoMSA8PCAxNikgKiAoMSA8PCAxNik7XG4vKipcbiAqIFBhcnNlIGRlY2ltYWwgc3RyaW5nIG9mIDY0IGJpdCBpbnRlZ2VyIHZhbHVlIGFzIHR3byBKUyBudW1iZXJzLlxuICpcbiAqIFJldHVybnMgdHVwbGU6XG4gKiBbMF06IG1pbnVzIHNpZ24/XG4gKiBbMV06IGxvdyBiaXRzXG4gKiBbMl06IGhpZ2ggYml0c1xuICpcbiAqIENvcHlyaWdodCAyMDA4IEdvb2dsZSBJbmMuXG4gKi9cbmZ1bmN0aW9uIGludDY0ZnJvbVN0cmluZyhkZWMpIHtcbiAgICAvLyBDaGVjayBmb3IgbWludXMgc2lnbi5cbiAgICBsZXQgbWludXMgPSBkZWNbMF0gPT0gJy0nO1xuICAgIGlmIChtaW51cylcbiAgICAgICAgZGVjID0gZGVjLnNsaWNlKDEpO1xuICAgIC8vIFdvcmsgNiBkZWNpbWFsIGRpZ2l0cyBhdCBhIHRpbWUsIGFjdGluZyBsaWtlIHdlJ3JlIGNvbnZlcnRpbmcgYmFzZSAxZTZcbiAgICAvLyBkaWdpdHMgdG8gYmluYXJ5LiBUaGlzIGlzIHNhZmUgdG8gZG8gd2l0aCBmbG9hdGluZyBwb2ludCBtYXRoIGJlY2F1c2VcbiAgICAvLyBOdW1iZXIuaXNTYWZlSW50ZWdlcihBTExfMzJfQklUUyAqIDFlNikgPT0gdHJ1ZS5cbiAgICBjb25zdCBiYXNlID0gMWU2O1xuICAgIGxldCBsb3dCaXRzID0gMDtcbiAgICBsZXQgaGlnaEJpdHMgPSAwO1xuICAgIGZ1bmN0aW9uIGFkZDFlNmRpZ2l0KGJlZ2luLCBlbmQpIHtcbiAgICAgICAgLy8gTm90ZTogTnVtYmVyKCcnKSBpcyAwLlxuICAgICAgICBjb25zdCBkaWdpdDFlNiA9IE51bWJlcihkZWMuc2xpY2UoYmVnaW4sIGVuZCkpO1xuICAgICAgICBoaWdoQml0cyAqPSBiYXNlO1xuICAgICAgICBsb3dCaXRzID0gbG93Qml0cyAqIGJhc2UgKyBkaWdpdDFlNjtcbiAgICAgICAgLy8gQ2FycnkgYml0cyBmcm9tIGxvd0JpdHMgdG8gaGlnaEJpdHNcbiAgICAgICAgaWYgKGxvd0JpdHMgPj0gVFdPX1BXUl8zMl9EQkwpIHtcbiAgICAgICAgICAgIGhpZ2hCaXRzID0gaGlnaEJpdHMgKyAoKGxvd0JpdHMgLyBUV09fUFdSXzMyX0RCTCkgfCAwKTtcbiAgICAgICAgICAgIGxvd0JpdHMgPSBsb3dCaXRzICUgVFdPX1BXUl8zMl9EQkw7XG4gICAgICAgIH1cbiAgICB9XG4gICAgYWRkMWU2ZGlnaXQoLTI0LCAtMTgpO1xuICAgIGFkZDFlNmRpZ2l0KC0xOCwgLTEyKTtcbiAgICBhZGQxZTZkaWdpdCgtMTIsIC02KTtcbiAgICBhZGQxZTZkaWdpdCgtNik7XG4gICAgcmV0dXJuIFttaW51cywgbG93Qml0cywgaGlnaEJpdHNdO1xufVxuZXhwb3J0cy5pbnQ2NGZyb21TdHJpbmcgPSBpbnQ2NGZyb21TdHJpbmc7XG4vKipcbiAqIEZvcm1hdCA2NCBiaXQgaW50ZWdlciB2YWx1ZSAoYXMgdHdvIEpTIG51bWJlcnMpIHRvIGRlY2ltYWwgc3RyaW5nLlxuICpcbiAqIENvcHlyaWdodCAyMDA4IEdvb2dsZSBJbmMuXG4gKi9cbmZ1bmN0aW9uIGludDY0dG9TdHJpbmcoYml0c0xvdywgYml0c0hpZ2gpIHtcbiAgICAvLyBTa2lwIHRoZSBleHBlbnNpdmUgY29udmVyc2lvbiBpZiB0aGUgbnVtYmVyIGlzIHNtYWxsIGVub3VnaCB0byB1c2UgdGhlXG4gICAgLy8gYnVpbHQtaW4gY29udmVyc2lvbnMuXG4gICAgaWYgKChiaXRzSGlnaCA+Pj4gMCkgPD0gMHgxRkZGRkYpIHtcbiAgICAgICAgcmV0dXJuICcnICsgKFRXT19QV1JfMzJfREJMICogYml0c0hpZ2ggKyAoYml0c0xvdyA+Pj4gMCkpO1xuICAgIH1cbiAgICAvLyBXaGF0IHRoaXMgY29kZSBpcyBkb2luZyBpcyBlc3NlbnRpYWxseSBjb252ZXJ0aW5nIHRoZSBpbnB1dCBudW1iZXIgZnJvbVxuICAgIC8vIGJhc2UtMiB0byBiYXNlLTFlNywgd2hpY2ggYWxsb3dzIHVzIHRvIHJlcHJlc2VudCB0aGUgNjQtYml0IHJhbmdlIHdpdGhcbiAgICAvLyBvbmx5IDMgKHZlcnkgbGFyZ2UpIGRpZ2l0cy4gVGhvc2UgZGlnaXRzIGFyZSB0aGVuIHRyaXZpYWwgdG8gY29udmVydCB0b1xuICAgIC8vIGEgYmFzZS0xMCBzdHJpbmcuXG4gICAgLy8gVGhlIG1hZ2ljIG51bWJlcnMgdXNlZCBoZXJlIGFyZSAtXG4gICAgLy8gMl4yNCA9IDE2Nzc3MjE2ID0gKDEsNjc3NzIxNikgaW4gYmFzZS0xZTcuXG4gICAgLy8gMl40OCA9IDI4MTQ3NDk3NjcxMDY1NiA9ICgyLDgxNDc0OTcsNjcxMDY1NikgaW4gYmFzZS0xZTcuXG4gICAgLy8gU3BsaXQgMzI6MzIgcmVwcmVzZW50YXRpb24gaW50byAxNjoyNDoyNCByZXByZXNlbnRhdGlvbiBzbyBvdXJcbiAgICAvLyBpbnRlcm1lZGlhdGUgZGlnaXRzIGRvbid0IG92ZXJmbG93LlxuICAgIGxldCBsb3cgPSBiaXRzTG93ICYgMHhGRkZGRkY7XG4gICAgbGV0IG1pZCA9ICgoKGJpdHNMb3cgPj4+IDI0KSB8IChiaXRzSGlnaCA8PCA4KSkgPj4+IDApICYgMHhGRkZGRkY7XG4gICAgbGV0IGhpZ2ggPSAoYml0c0hpZ2ggPj4gMTYpICYgMHhGRkZGO1xuICAgIC8vIEFzc2VtYmxlIG91ciB0aHJlZSBiYXNlLTFlNyBkaWdpdHMsIGlnbm9yaW5nIGNhcnJpZXMuIFRoZSBtYXhpbXVtXG4gICAgLy8gdmFsdWUgaW4gYSBkaWdpdCBhdCB0aGlzIHN0ZXAgaXMgcmVwcmVzZW50YWJsZSBhcyBhIDQ4LWJpdCBpbnRlZ2VyLCB3aGljaFxuICAgIC8vIGNhbiBiZSBzdG9yZWQgaW4gYSA2NC1iaXQgZmxvYXRpbmcgcG9pbnQgbnVtYmVyLlxuICAgIGxldCBkaWdpdEEgPSBsb3cgKyAobWlkICogNjc3NzIxNikgKyAoaGlnaCAqIDY3MTA2NTYpO1xuICAgIGxldCBkaWdpdEIgPSBtaWQgKyAoaGlnaCAqIDgxNDc0OTcpO1xuICAgIGxldCBkaWdpdEMgPSAoaGlnaCAqIDIpO1xuICAgIC8vIEFwcGx5IGNhcnJpZXMgZnJvbSBBIHRvIEIgYW5kIGZyb20gQiB0byBDLlxuICAgIGxldCBiYXNlID0gMTAwMDAwMDA7XG4gICAgaWYgKGRpZ2l0QSA+PSBiYXNlKSB7XG4gICAgICAgIGRpZ2l0QiArPSBNYXRoLmZsb29yKGRpZ2l0QSAvIGJhc2UpO1xuICAgICAgICBkaWdpdEEgJT0gYmFzZTtcbiAgICB9XG4gICAgaWYgKGRpZ2l0QiA+PSBiYXNlKSB7XG4gICAgICAgIGRpZ2l0QyArPSBNYXRoLmZsb29yKGRpZ2l0QiAvIGJhc2UpO1xuICAgICAgICBkaWdpdEIgJT0gYmFzZTtcbiAgICB9XG4gICAgLy8gQ29udmVydCBiYXNlLTFlNyBkaWdpdHMgdG8gYmFzZS0xMCwgd2l0aCBvcHRpb25hbCBsZWFkaW5nIHplcm9lcy5cbiAgICBmdW5jdGlvbiBkZWNpbWFsRnJvbTFlNyhkaWdpdDFlNywgbmVlZExlYWRpbmdaZXJvcykge1xuICAgICAgICBsZXQgcGFydGlhbCA9IGRpZ2l0MWU3ID8gU3RyaW5nKGRpZ2l0MWU3KSA6ICcnO1xuICAgICAgICBpZiAobmVlZExlYWRpbmdaZXJvcykge1xuICAgICAgICAgICAgcmV0dXJuICcwMDAwMDAwJy5zbGljZShwYXJ0aWFsLmxlbmd0aCkgKyBwYXJ0aWFsO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBwYXJ0aWFsO1xuICAgIH1cbiAgICByZXR1cm4gZGVjaW1hbEZyb20xZTcoZGlnaXRDLCAvKm5lZWRMZWFkaW5nWmVyb3M9Ki8gMCkgK1xuICAgICAgICBkZWNpbWFsRnJvbTFlNyhkaWdpdEIsIC8qbmVlZExlYWRpbmdaZXJvcz0qLyBkaWdpdEMpICtcbiAgICAgICAgLy8gSWYgdGhlIGZpbmFsIDFlNyBkaWdpdCBkaWRuJ3QgbmVlZCBsZWFkaW5nIHplcm9zLCB3ZSB3b3VsZCBoYXZlXG4gICAgICAgIC8vIHJldHVybmVkIHZpYSB0aGUgdHJpdmlhbCBjb2RlIHBhdGggYXQgdGhlIHRvcC5cbiAgICAgICAgZGVjaW1hbEZyb20xZTcoZGlnaXRBLCAvKm5lZWRMZWFkaW5nWmVyb3M9Ki8gMSk7XG59XG5leHBvcnRzLmludDY0dG9TdHJpbmcgPSBpbnQ2NHRvU3RyaW5nO1xuLyoqXG4gKiBXcml0ZSBhIDMyIGJpdCB2YXJpbnQsIHNpZ25lZCBvciB1bnNpZ25lZC4gU2FtZSBhcyBgdmFyaW50NjR3cml0ZSgwLCB2YWx1ZSwgYnl0ZXMpYFxuICpcbiAqIENvcHlyaWdodCAyMDA4IEdvb2dsZSBJbmMuICBBbGwgcmlnaHRzIHJlc2VydmVkLlxuICpcbiAqIFNlZSBodHRwczovL2dpdGh1Yi5jb20vcHJvdG9jb2xidWZmZXJzL3Byb3RvYnVmL2Jsb2IvMWIxODgzM2Y0ZjJhMmY2ODFmNGU0YTI1Y2RmM2IwYTQzMTE1ZWMyNi9qcy9iaW5hcnkvZW5jb2Rlci5qcyNMMTQ0XG4gKi9cbmZ1bmN0aW9uIHZhcmludDMyd3JpdGUodmFsdWUsIGJ5dGVzKSB7XG4gICAgaWYgKHZhbHVlID49IDApIHtcbiAgICAgICAgLy8gd3JpdGUgdmFsdWUgYXMgdmFyaW50IDMyXG4gICAgICAgIHdoaWxlICh2YWx1ZSA+IDB4N2YpIHtcbiAgICAgICAgICAgIGJ5dGVzLnB1c2goKHZhbHVlICYgMHg3ZikgfCAweDgwKTtcbiAgICAgICAgICAgIHZhbHVlID0gdmFsdWUgPj4+IDc7XG4gICAgICAgIH1cbiAgICAgICAgYnl0ZXMucHVzaCh2YWx1ZSk7XG4gICAgfVxuICAgIGVsc2Uge1xuICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IDk7IGkrKykge1xuICAgICAgICAgICAgYnl0ZXMucHVzaCh2YWx1ZSAmIDEyNyB8IDEyOCk7XG4gICAgICAgICAgICB2YWx1ZSA9IHZhbHVlID4+IDc7XG4gICAgICAgIH1cbiAgICAgICAgYnl0ZXMucHVzaCgxKTtcbiAgICB9XG59XG5leHBvcnRzLnZhcmludDMyd3JpdGUgPSB2YXJpbnQzMndyaXRlO1xuLyoqXG4gKiBSZWFkIGFuIHVuc2lnbmVkIDMyIGJpdCB2YXJpbnQuXG4gKlxuICogU2VlIGh0dHBzOi8vZ2l0aHViLmNvbS9wcm90b2NvbGJ1ZmZlcnMvcHJvdG9idWYvYmxvYi84YTcxOTI3ZDc0YTRjZTM0ZWZlMmQ4NzY5ZmRhMTk4ZjUyZDIwZDEyL2pzL2V4cGVyaW1lbnRhbC9ydW50aW1lL2tlcm5lbC9idWZmZXJfZGVjb2Rlci5qcyNMMjIwXG4gKi9cbmZ1bmN0aW9uIHZhcmludDMycmVhZCgpIHtcbiAgICBsZXQgYiA9IHRoaXMuYnVmW3RoaXMucG9zKytdO1xuICAgIGxldCByZXN1bHQgPSBiICYgMHg3RjtcbiAgICBpZiAoKGIgJiAweDgwKSA9PSAwKSB7XG4gICAgICAgIHRoaXMuYXNzZXJ0Qm91bmRzKCk7XG4gICAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgfVxuICAgIGIgPSB0aGlzLmJ1Zlt0aGlzLnBvcysrXTtcbiAgICByZXN1bHQgfD0gKGIgJiAweDdGKSA8PCA3O1xuICAgIGlmICgoYiAmIDB4ODApID09IDApIHtcbiAgICAgICAgdGhpcy5hc3NlcnRCb3VuZHMoKTtcbiAgICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICB9XG4gICAgYiA9IHRoaXMuYnVmW3RoaXMucG9zKytdO1xuICAgIHJlc3VsdCB8PSAoYiAmIDB4N0YpIDw8IDE0O1xuICAgIGlmICgoYiAmIDB4ODApID09IDApIHtcbiAgICAgICAgdGhpcy5hc3NlcnRCb3VuZHMoKTtcbiAgICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICB9XG4gICAgYiA9IHRoaXMuYnVmW3RoaXMucG9zKytdO1xuICAgIHJlc3VsdCB8PSAoYiAmIDB4N0YpIDw8IDIxO1xuICAgIGlmICgoYiAmIDB4ODApID09IDApIHtcbiAgICAgICAgdGhpcy5hc3NlcnRCb3VuZHMoKTtcbiAgICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICB9XG4gICAgLy8gRXh0cmFjdCBvbmx5IGxhc3QgNCBiaXRzXG4gICAgYiA9IHRoaXMuYnVmW3RoaXMucG9zKytdO1xuICAgIHJlc3VsdCB8PSAoYiAmIDB4MEYpIDw8IDI4O1xuICAgIGZvciAobGV0IHJlYWRCeXRlcyA9IDU7ICgoYiAmIDB4ODApICE9PSAwKSAmJiByZWFkQnl0ZXMgPCAxMDsgcmVhZEJ5dGVzKyspXG4gICAgICAgIGIgPSB0aGlzLmJ1Zlt0aGlzLnBvcysrXTtcbiAgICBpZiAoKGIgJiAweDgwKSAhPSAwKVxuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ2ludmFsaWQgdmFyaW50Jyk7XG4gICAgdGhpcy5hc3NlcnRCb3VuZHMoKTtcbiAgICAvLyBSZXN1bHQgY2FuIGhhdmUgMzIgYml0cywgY29udmVydCBpdCB0byB1bnNpZ25lZFxuICAgIHJldHVybiByZXN1bHQgPj4+IDA7XG59XG5leHBvcnRzLnZhcmludDMycmVhZCA9IHZhcmludDMycmVhZDtcbiIsCiAgICAiXCJ1c2Ugc3RyaWN0XCI7XG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJfX2VzTW9kdWxlXCIsIHsgdmFsdWU6IHRydWUgfSk7XG5leHBvcnRzLlBiTG9uZyA9IGV4cG9ydHMuUGJVTG9uZyA9IGV4cG9ydHMuZGV0ZWN0QmkgPSB2b2lkIDA7XG5jb25zdCBnb29nX3ZhcmludF8xID0gcmVxdWlyZShcIi4vZ29vZy12YXJpbnRcIik7XG5sZXQgQkk7XG5mdW5jdGlvbiBkZXRlY3RCaSgpIHtcbiAgICBjb25zdCBkdiA9IG5ldyBEYXRhVmlldyhuZXcgQXJyYXlCdWZmZXIoOCkpO1xuICAgIGNvbnN0IG9rID0gZ2xvYmFsVGhpcy5CaWdJbnQgIT09IHVuZGVmaW5lZFxuICAgICAgICAmJiB0eXBlb2YgZHYuZ2V0QmlnSW50NjQgPT09IFwiZnVuY3Rpb25cIlxuICAgICAgICAmJiB0eXBlb2YgZHYuZ2V0QmlnVWludDY0ID09PSBcImZ1bmN0aW9uXCJcbiAgICAgICAgJiYgdHlwZW9mIGR2LnNldEJpZ0ludDY0ID09PSBcImZ1bmN0aW9uXCJcbiAgICAgICAgJiYgdHlwZW9mIGR2LnNldEJpZ1VpbnQ2NCA9PT0gXCJmdW5jdGlvblwiO1xuICAgIEJJID0gb2sgPyB7XG4gICAgICAgIE1JTjogQmlnSW50KFwiLTkyMjMzNzIwMzY4NTQ3NzU4MDhcIiksXG4gICAgICAgIE1BWDogQmlnSW50KFwiOTIyMzM3MjAzNjg1NDc3NTgwN1wiKSxcbiAgICAgICAgVU1JTjogQmlnSW50KFwiMFwiKSxcbiAgICAgICAgVU1BWDogQmlnSW50KFwiMTg0NDY3NDQwNzM3MDk1NTE2MTVcIiksXG4gICAgICAgIEM6IEJpZ0ludCxcbiAgICAgICAgVjogZHYsXG4gICAgfSA6IHVuZGVmaW5lZDtcbn1cbmV4cG9ydHMuZGV0ZWN0QmkgPSBkZXRlY3RCaTtcbmRldGVjdEJpKCk7XG5mdW5jdGlvbiBhc3NlcnRCaShiaSkge1xuICAgIGlmICghYmkpXG4gICAgICAgIHRocm93IG5ldyBFcnJvcihcIkJpZ0ludCB1bmF2YWlsYWJsZSwgc2VlIGh0dHBzOi8vZ2l0aHViLmNvbS90aW1vc3RhbW0vcHJvdG9idWYtdHMvYmxvYi92MS4wLjgvTUFOVUFMLm1kI2JpZ2ludC1zdXBwb3J0XCIpO1xufVxuLy8gdXNlZCB0byB2YWxpZGF0ZSBmcm9tKHN0cmluZykgaW5wdXQgKHdoZW4gYmlnaW50IGlzIHVuYXZhaWxhYmxlKVxuY29uc3QgUkVfREVDSU1BTF9TVFIgPSAvXi0/WzAtOV0rJC87XG4vLyBjb25zdGFudHMgZm9yIGJpbmFyeSBtYXRoXG5jb25zdCBUV09fUFdSXzMyX0RCTCA9IDB4MTAwMDAwMDAwO1xuY29uc3QgSEFMRl8yX1BXUl8zMiA9IDB4MDgwMDAwMDAwO1xuLy8gYmFzZSBjbGFzcyBmb3IgUGJMb25nIGFuZCBQYlVMb25nIHByb3ZpZGVzIHNoYXJlZCBjb2RlXG5jbGFzcyBTaGFyZWRQYkxvbmcge1xuICAgIC8qKlxuICAgICAqIENyZWF0ZSBhIG5ldyBpbnN0YW5jZSB3aXRoIHRoZSBnaXZlbiBiaXRzLlxuICAgICAqL1xuICAgIGNvbnN0cnVjdG9yKGxvLCBoaSkge1xuICAgICAgICB0aGlzLmxvID0gbG8gfCAwO1xuICAgICAgICB0aGlzLmhpID0gaGkgfCAwO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBJcyB0aGlzIGluc3RhbmNlIGVxdWFsIHRvIDA/XG4gICAgICovXG4gICAgaXNaZXJvKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5sbyA9PSAwICYmIHRoaXMuaGkgPT0gMDtcbiAgICB9XG4gICAgLyoqXG4gICAgICogQ29udmVydCB0byBhIG5hdGl2ZSBudW1iZXIuXG4gICAgICovXG4gICAgdG9OdW1iZXIoKSB7XG4gICAgICAgIGxldCByZXN1bHQgPSB0aGlzLmhpICogVFdPX1BXUl8zMl9EQkwgKyAodGhpcy5sbyA+Pj4gMCk7XG4gICAgICAgIGlmICghTnVtYmVyLmlzU2FmZUludGVnZXIocmVzdWx0KSlcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihcImNhbm5vdCBjb252ZXJ0IHRvIHNhZmUgbnVtYmVyXCIpO1xuICAgICAgICByZXR1cm4gcmVzdWx0O1xuICAgIH1cbn1cbi8qKlxuICogNjQtYml0IHVuc2lnbmVkIGludGVnZXIgYXMgdHdvIDMyLWJpdCB2YWx1ZXMuXG4gKiBDb252ZXJ0cyBiZXR3ZWVuIGBzdHJpbmdgLCBgbnVtYmVyYCBhbmQgYGJpZ2ludGAgcmVwcmVzZW50YXRpb25zLlxuICovXG5jbGFzcyBQYlVMb25nIGV4dGVuZHMgU2hhcmVkUGJMb25nIHtcbiAgICAvKipcbiAgICAgKiBDcmVhdGUgaW5zdGFuY2UgZnJvbSBhIGBzdHJpbmdgLCBgbnVtYmVyYCBvciBgYmlnaW50YC5cbiAgICAgKi9cbiAgICBzdGF0aWMgZnJvbSh2YWx1ZSkge1xuICAgICAgICBpZiAoQkkpXG4gICAgICAgICAgICAvLyBub2luc3BlY3Rpb24gRmFsbFRocm91Z2hJblN3aXRjaFN0YXRlbWVudEpTXG4gICAgICAgICAgICBzd2l0Y2ggKHR5cGVvZiB2YWx1ZSkge1xuICAgICAgICAgICAgICAgIGNhc2UgXCJzdHJpbmdcIjpcbiAgICAgICAgICAgICAgICAgICAgaWYgKHZhbHVlID09IFwiMFwiKVxuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuWkVSTztcbiAgICAgICAgICAgICAgICAgICAgaWYgKHZhbHVlID09IFwiXCIpXG4gICAgICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ3N0cmluZyBpcyBubyBpbnRlZ2VyJyk7XG4gICAgICAgICAgICAgICAgICAgIHZhbHVlID0gQkkuQyh2YWx1ZSk7XG4gICAgICAgICAgICAgICAgY2FzZSBcIm51bWJlclwiOlxuICAgICAgICAgICAgICAgICAgICBpZiAodmFsdWUgPT09IDApXG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5aRVJPO1xuICAgICAgICAgICAgICAgICAgICB2YWx1ZSA9IEJJLkModmFsdWUpO1xuICAgICAgICAgICAgICAgIGNhc2UgXCJiaWdpbnRcIjpcbiAgICAgICAgICAgICAgICAgICAgaWYgKCF2YWx1ZSlcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLlpFUk87XG4gICAgICAgICAgICAgICAgICAgIGlmICh2YWx1ZSA8IEJJLlVNSU4pXG4gICAgICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ3NpZ25lZCB2YWx1ZSBmb3IgdWxvbmcnKTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKHZhbHVlID4gQkkuVU1BWClcbiAgICAgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcigndWxvbmcgdG9vIGxhcmdlJyk7XG4gICAgICAgICAgICAgICAgICAgIEJJLlYuc2V0QmlnVWludDY0KDAsIHZhbHVlLCB0cnVlKTtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBQYlVMb25nKEJJLlYuZ2V0SW50MzIoMCwgdHJ1ZSksIEJJLlYuZ2V0SW50MzIoNCwgdHJ1ZSkpO1xuICAgICAgICAgICAgfVxuICAgICAgICBlbHNlXG4gICAgICAgICAgICBzd2l0Y2ggKHR5cGVvZiB2YWx1ZSkge1xuICAgICAgICAgICAgICAgIGNhc2UgXCJzdHJpbmdcIjpcbiAgICAgICAgICAgICAgICAgICAgaWYgKHZhbHVlID09IFwiMFwiKVxuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuWkVSTztcbiAgICAgICAgICAgICAgICAgICAgdmFsdWUgPSB2YWx1ZS50cmltKCk7XG4gICAgICAgICAgICAgICAgICAgIGlmICghUkVfREVDSU1BTF9TVFIudGVzdCh2YWx1ZSkpXG4gICAgICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ3N0cmluZyBpcyBubyBpbnRlZ2VyJyk7XG4gICAgICAgICAgICAgICAgICAgIGxldCBbbWludXMsIGxvLCBoaV0gPSBnb29nX3ZhcmludF8xLmludDY0ZnJvbVN0cmluZyh2YWx1ZSk7XG4gICAgICAgICAgICAgICAgICAgIGlmIChtaW51cylcbiAgICAgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcignc2lnbmVkIHZhbHVlIGZvciB1bG9uZycpO1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gbmV3IFBiVUxvbmcobG8sIGhpKTtcbiAgICAgICAgICAgICAgICBjYXNlIFwibnVtYmVyXCI6XG4gICAgICAgICAgICAgICAgICAgIGlmICh2YWx1ZSA9PSAwKVxuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuWkVSTztcbiAgICAgICAgICAgICAgICAgICAgaWYgKCFOdW1iZXIuaXNTYWZlSW50ZWdlcih2YWx1ZSkpXG4gICAgICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ251bWJlciBpcyBubyBpbnRlZ2VyJyk7XG4gICAgICAgICAgICAgICAgICAgIGlmICh2YWx1ZSA8IDApXG4gICAgICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ3NpZ25lZCB2YWx1ZSBmb3IgdWxvbmcnKTtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBQYlVMb25nKHZhbHVlLCB2YWx1ZSAvIFRXT19QV1JfMzJfREJMKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKCd1bmtub3duIHZhbHVlICcgKyB0eXBlb2YgdmFsdWUpO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBDb252ZXJ0IHRvIGRlY2ltYWwgc3RyaW5nLlxuICAgICAqL1xuICAgIHRvU3RyaW5nKCkge1xuICAgICAgICByZXR1cm4gQkkgPyB0aGlzLnRvQmlnSW50KCkudG9TdHJpbmcoKSA6IGdvb2dfdmFyaW50XzEuaW50NjR0b1N0cmluZyh0aGlzLmxvLCB0aGlzLmhpKTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogQ29udmVydCB0byBuYXRpdmUgYmlnaW50LlxuICAgICAqL1xuICAgIHRvQmlnSW50KCkge1xuICAgICAgICBhc3NlcnRCaShCSSk7XG4gICAgICAgIEJJLlYuc2V0SW50MzIoMCwgdGhpcy5sbywgdHJ1ZSk7XG4gICAgICAgIEJJLlYuc2V0SW50MzIoNCwgdGhpcy5oaSwgdHJ1ZSk7XG4gICAgICAgIHJldHVybiBCSS5WLmdldEJpZ1VpbnQ2NCgwLCB0cnVlKTtcbiAgICB9XG59XG5leHBvcnRzLlBiVUxvbmcgPSBQYlVMb25nO1xuLyoqXG4gKiB1bG9uZyAwIHNpbmdsZXRvbi5cbiAqL1xuUGJVTG9uZy5aRVJPID0gbmV3IFBiVUxvbmcoMCwgMCk7XG4vKipcbiAqIDY0LWJpdCBzaWduZWQgaW50ZWdlciBhcyB0d28gMzItYml0IHZhbHVlcy5cbiAqIENvbnZlcnRzIGJldHdlZW4gYHN0cmluZ2AsIGBudW1iZXJgIGFuZCBgYmlnaW50YCByZXByZXNlbnRhdGlvbnMuXG4gKi9cbmNsYXNzIFBiTG9uZyBleHRlbmRzIFNoYXJlZFBiTG9uZyB7XG4gICAgLyoqXG4gICAgICogQ3JlYXRlIGluc3RhbmNlIGZyb20gYSBgc3RyaW5nYCwgYG51bWJlcmAgb3IgYGJpZ2ludGAuXG4gICAgICovXG4gICAgc3RhdGljIGZyb20odmFsdWUpIHtcbiAgICAgICAgaWYgKEJJKVxuICAgICAgICAgICAgLy8gbm9pbnNwZWN0aW9uIEZhbGxUaHJvdWdoSW5Td2l0Y2hTdGF0ZW1lbnRKU1xuICAgICAgICAgICAgc3dpdGNoICh0eXBlb2YgdmFsdWUpIHtcbiAgICAgICAgICAgICAgICBjYXNlIFwic3RyaW5nXCI6XG4gICAgICAgICAgICAgICAgICAgIGlmICh2YWx1ZSA9PSBcIjBcIilcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLlpFUk87XG4gICAgICAgICAgICAgICAgICAgIGlmICh2YWx1ZSA9PSBcIlwiKVxuICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdzdHJpbmcgaXMgbm8gaW50ZWdlcicpO1xuICAgICAgICAgICAgICAgICAgICB2YWx1ZSA9IEJJLkModmFsdWUpO1xuICAgICAgICAgICAgICAgIGNhc2UgXCJudW1iZXJcIjpcbiAgICAgICAgICAgICAgICAgICAgaWYgKHZhbHVlID09PSAwKVxuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuWkVSTztcbiAgICAgICAgICAgICAgICAgICAgdmFsdWUgPSBCSS5DKHZhbHVlKTtcbiAgICAgICAgICAgICAgICBjYXNlIFwiYmlnaW50XCI6XG4gICAgICAgICAgICAgICAgICAgIGlmICghdmFsdWUpXG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5aRVJPO1xuICAgICAgICAgICAgICAgICAgICBpZiAodmFsdWUgPCBCSS5NSU4pXG4gICAgICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ3NpZ25lZCBsb25nIHRvbyBzbWFsbCcpO1xuICAgICAgICAgICAgICAgICAgICBpZiAodmFsdWUgPiBCSS5NQVgpXG4gICAgICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ3NpZ25lZCBsb25nIHRvbyBsYXJnZScpO1xuICAgICAgICAgICAgICAgICAgICBCSS5WLnNldEJpZ0ludDY0KDAsIHZhbHVlLCB0cnVlKTtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBQYkxvbmcoQkkuVi5nZXRJbnQzMigwLCB0cnVlKSwgQkkuVi5nZXRJbnQzMig0LCB0cnVlKSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIGVsc2VcbiAgICAgICAgICAgIHN3aXRjaCAodHlwZW9mIHZhbHVlKSB7XG4gICAgICAgICAgICAgICAgY2FzZSBcInN0cmluZ1wiOlxuICAgICAgICAgICAgICAgICAgICBpZiAodmFsdWUgPT0gXCIwXCIpXG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5aRVJPO1xuICAgICAgICAgICAgICAgICAgICB2YWx1ZSA9IHZhbHVlLnRyaW0oKTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKCFSRV9ERUNJTUFMX1NUUi50ZXN0KHZhbHVlKSlcbiAgICAgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcignc3RyaW5nIGlzIG5vIGludGVnZXInKTtcbiAgICAgICAgICAgICAgICAgICAgbGV0IFttaW51cywgbG8sIGhpXSA9IGdvb2dfdmFyaW50XzEuaW50NjRmcm9tU3RyaW5nKHZhbHVlKTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKG1pbnVzKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoaGkgPiBIQUxGXzJfUFdSXzMyIHx8IChoaSA9PSBIQUxGXzJfUFdSXzMyICYmIGxvICE9IDApKVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcignc2lnbmVkIGxvbmcgdG9vIHNtYWxsJyk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgZWxzZSBpZiAoaGkgPj0gSEFMRl8yX1BXUl8zMilcbiAgICAgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcignc2lnbmVkIGxvbmcgdG9vIGxhcmdlJyk7XG4gICAgICAgICAgICAgICAgICAgIGxldCBwYmwgPSBuZXcgUGJMb25nKGxvLCBoaSk7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBtaW51cyA/IHBibC5uZWdhdGUoKSA6IHBibDtcbiAgICAgICAgICAgICAgICBjYXNlIFwibnVtYmVyXCI6XG4gICAgICAgICAgICAgICAgICAgIGlmICh2YWx1ZSA9PSAwKVxuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuWkVSTztcbiAgICAgICAgICAgICAgICAgICAgaWYgKCFOdW1iZXIuaXNTYWZlSW50ZWdlcih2YWx1ZSkpXG4gICAgICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ251bWJlciBpcyBubyBpbnRlZ2VyJyk7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiB2YWx1ZSA+IDBcbiAgICAgICAgICAgICAgICAgICAgICAgID8gbmV3IFBiTG9uZyh2YWx1ZSwgdmFsdWUgLyBUV09fUFdSXzMyX0RCTClcbiAgICAgICAgICAgICAgICAgICAgICAgIDogbmV3IFBiTG9uZygtdmFsdWUsIC12YWx1ZSAvIFRXT19QV1JfMzJfREJMKS5uZWdhdGUoKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKCd1bmtub3duIHZhbHVlICcgKyB0eXBlb2YgdmFsdWUpO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBEbyB3ZSBoYXZlIGEgbWludXMgc2lnbj9cbiAgICAgKi9cbiAgICBpc05lZ2F0aXZlKCkge1xuICAgICAgICByZXR1cm4gKHRoaXMuaGkgJiBIQUxGXzJfUFdSXzMyKSAhPT0gMDtcbiAgICB9XG4gICAgLyoqXG4gICAgICogTmVnYXRlIHR3bydzIGNvbXBsZW1lbnQuXG4gICAgICogSW52ZXJ0IGFsbCB0aGUgYml0cyBhbmQgYWRkIG9uZSB0byB0aGUgcmVzdWx0LlxuICAgICAqL1xuICAgIG5lZ2F0ZSgpIHtcbiAgICAgICAgbGV0IGhpID0gfnRoaXMuaGksIGxvID0gdGhpcy5sbztcbiAgICAgICAgaWYgKGxvKVxuICAgICAgICAgICAgbG8gPSB+bG8gKyAxO1xuICAgICAgICBlbHNlXG4gICAgICAgICAgICBoaSArPSAxO1xuICAgICAgICByZXR1cm4gbmV3IFBiTG9uZyhsbywgaGkpO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBDb252ZXJ0IHRvIGRlY2ltYWwgc3RyaW5nLlxuICAgICAqL1xuICAgIHRvU3RyaW5nKCkge1xuICAgICAgICBpZiAoQkkpXG4gICAgICAgICAgICByZXR1cm4gdGhpcy50b0JpZ0ludCgpLnRvU3RyaW5nKCk7XG4gICAgICAgIGlmICh0aGlzLmlzTmVnYXRpdmUoKSkge1xuICAgICAgICAgICAgbGV0IG4gPSB0aGlzLm5lZ2F0ZSgpO1xuICAgICAgICAgICAgcmV0dXJuICctJyArIGdvb2dfdmFyaW50XzEuaW50NjR0b1N0cmluZyhuLmxvLCBuLmhpKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gZ29vZ192YXJpbnRfMS5pbnQ2NHRvU3RyaW5nKHRoaXMubG8sIHRoaXMuaGkpO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBDb252ZXJ0IHRvIG5hdGl2ZSBiaWdpbnQuXG4gICAgICovXG4gICAgdG9CaWdJbnQoKSB7XG4gICAgICAgIGFzc2VydEJpKEJJKTtcbiAgICAgICAgQkkuVi5zZXRJbnQzMigwLCB0aGlzLmxvLCB0cnVlKTtcbiAgICAgICAgQkkuVi5zZXRJbnQzMig0LCB0aGlzLmhpLCB0cnVlKTtcbiAgICAgICAgcmV0dXJuIEJJLlYuZ2V0QmlnSW50NjQoMCwgdHJ1ZSk7XG4gICAgfVxufVxuZXhwb3J0cy5QYkxvbmcgPSBQYkxvbmc7XG4vKipcbiAqIGxvbmcgMCBzaW5nbGV0b24uXG4gKi9cblBiTG9uZy5aRVJPID0gbmV3IFBiTG9uZygwLCAwKTtcbiIsCiAgICAiXCJ1c2Ugc3RyaWN0XCI7XG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJfX2VzTW9kdWxlXCIsIHsgdmFsdWU6IHRydWUgfSk7XG5leHBvcnRzLkJpbmFyeVJlYWRlciA9IGV4cG9ydHMuYmluYXJ5UmVhZE9wdGlvbnMgPSB2b2lkIDA7XG5jb25zdCBiaW5hcnlfZm9ybWF0X2NvbnRyYWN0XzEgPSByZXF1aXJlKFwiLi9iaW5hcnktZm9ybWF0LWNvbnRyYWN0XCIpO1xuY29uc3QgcGJfbG9uZ18xID0gcmVxdWlyZShcIi4vcGItbG9uZ1wiKTtcbmNvbnN0IGdvb2dfdmFyaW50XzEgPSByZXF1aXJlKFwiLi9nb29nLXZhcmludFwiKTtcbmNvbnN0IGRlZmF1bHRzUmVhZCA9IHtcbiAgICByZWFkVW5rbm93bkZpZWxkOiB0cnVlLFxuICAgIHJlYWRlckZhY3Rvcnk6IGJ5dGVzID0+IG5ldyBCaW5hcnlSZWFkZXIoYnl0ZXMpLFxufTtcbi8qKlxuICogTWFrZSBvcHRpb25zIGZvciByZWFkaW5nIGJpbmFyeSBkYXRhIGZvcm0gcGFydGlhbCBvcHRpb25zLlxuICovXG5mdW5jdGlvbiBiaW5hcnlSZWFkT3B0aW9ucyhvcHRpb25zKSB7XG4gICAgcmV0dXJuIG9wdGlvbnMgPyBPYmplY3QuYXNzaWduKE9iamVjdC5hc3NpZ24oe30sIGRlZmF1bHRzUmVhZCksIG9wdGlvbnMpIDogZGVmYXVsdHNSZWFkO1xufVxuZXhwb3J0cy5iaW5hcnlSZWFkT3B0aW9ucyA9IGJpbmFyeVJlYWRPcHRpb25zO1xuY2xhc3MgQmluYXJ5UmVhZGVyIHtcbiAgICBjb25zdHJ1Y3RvcihidWYsIHRleHREZWNvZGVyKSB7XG4gICAgICAgIHRoaXMudmFyaW50NjQgPSBnb29nX3ZhcmludF8xLnZhcmludDY0cmVhZDsgLy8gZGlydHkgY2FzdCBmb3IgYHRoaXNgXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBSZWFkIGEgYHVpbnQzMmAgZmllbGQsIGFuIHVuc2lnbmVkIDMyIGJpdCB2YXJpbnQuXG4gICAgICAgICAqL1xuICAgICAgICB0aGlzLnVpbnQzMiA9IGdvb2dfdmFyaW50XzEudmFyaW50MzJyZWFkOyAvLyBkaXJ0eSBjYXN0IGZvciBgdGhpc2AgYW5kIGFjY2VzcyB0byBwcm90ZWN0ZWQgYGJ1ZmBcbiAgICAgICAgdGhpcy5idWYgPSBidWY7XG4gICAgICAgIHRoaXMubGVuID0gYnVmLmxlbmd0aDtcbiAgICAgICAgdGhpcy5wb3MgPSAwO1xuICAgICAgICB0aGlzLnZpZXcgPSBuZXcgRGF0YVZpZXcoYnVmLmJ1ZmZlciwgYnVmLmJ5dGVPZmZzZXQsIGJ1Zi5ieXRlTGVuZ3RoKTtcbiAgICAgICAgdGhpcy50ZXh0RGVjb2RlciA9IHRleHREZWNvZGVyICE9PSBudWxsICYmIHRleHREZWNvZGVyICE9PSB2b2lkIDAgPyB0ZXh0RGVjb2RlciA6IG5ldyBUZXh0RGVjb2RlcihcInV0Zi04XCIsIHtcbiAgICAgICAgICAgIGZhdGFsOiB0cnVlLFxuICAgICAgICAgICAgaWdub3JlQk9NOiB0cnVlLFxuICAgICAgICB9KTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogUmVhZHMgYSB0YWcgLSBmaWVsZCBudW1iZXIgYW5kIHdpcmUgdHlwZS5cbiAgICAgKi9cbiAgICB0YWcoKSB7XG4gICAgICAgIGxldCB0YWcgPSB0aGlzLnVpbnQzMigpLCBmaWVsZE5vID0gdGFnID4+PiAzLCB3aXJlVHlwZSA9IHRhZyAmIDc7XG4gICAgICAgIGlmIChmaWVsZE5vIDw9IDAgfHwgd2lyZVR5cGUgPCAwIHx8IHdpcmVUeXBlID4gNSlcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihcImlsbGVnYWwgdGFnOiBmaWVsZCBubyBcIiArIGZpZWxkTm8gKyBcIiB3aXJlIHR5cGUgXCIgKyB3aXJlVHlwZSk7XG4gICAgICAgIHJldHVybiBbZmllbGRObywgd2lyZVR5cGVdO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBTa2lwIG9uZSBlbGVtZW50IG9uIHRoZSB3aXJlIGFuZCByZXR1cm4gdGhlIHNraXBwZWQgZGF0YS5cbiAgICAgKiBTdXBwb3J0cyBXaXJlVHlwZS5TdGFydEdyb3VwIHNpbmNlIHYyLjAuMC1hbHBoYS4yMy5cbiAgICAgKi9cbiAgICBza2lwKHdpcmVUeXBlKSB7XG4gICAgICAgIGxldCBzdGFydCA9IHRoaXMucG9zO1xuICAgICAgICAvLyBub2luc3BlY3Rpb24gRmFsbFRocm91Z2hJblN3aXRjaFN0YXRlbWVudEpTXG4gICAgICAgIHN3aXRjaCAod2lyZVR5cGUpIHtcbiAgICAgICAgICAgIGNhc2UgYmluYXJ5X2Zvcm1hdF9jb250cmFjdF8xLldpcmVUeXBlLlZhcmludDpcbiAgICAgICAgICAgICAgICB3aGlsZSAodGhpcy5idWZbdGhpcy5wb3MrK10gJiAweDgwKSB7XG4gICAgICAgICAgICAgICAgICAgIC8vIGlnbm9yZVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIGNhc2UgYmluYXJ5X2Zvcm1hdF9jb250cmFjdF8xLldpcmVUeXBlLkJpdDY0OlxuICAgICAgICAgICAgICAgIHRoaXMucG9zICs9IDQ7XG4gICAgICAgICAgICBjYXNlIGJpbmFyeV9mb3JtYXRfY29udHJhY3RfMS5XaXJlVHlwZS5CaXQzMjpcbiAgICAgICAgICAgICAgICB0aGlzLnBvcyArPSA0O1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgY2FzZSBiaW5hcnlfZm9ybWF0X2NvbnRyYWN0XzEuV2lyZVR5cGUuTGVuZ3RoRGVsaW1pdGVkOlxuICAgICAgICAgICAgICAgIGxldCBsZW4gPSB0aGlzLnVpbnQzMigpO1xuICAgICAgICAgICAgICAgIHRoaXMucG9zICs9IGxlbjtcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIGNhc2UgYmluYXJ5X2Zvcm1hdF9jb250cmFjdF8xLldpcmVUeXBlLlN0YXJ0R3JvdXA6XG4gICAgICAgICAgICAgICAgLy8gRnJvbSBkZXNjcmlwdG9yLnByb3RvOiBHcm91cCB0eXBlIGlzIGRlcHJlY2F0ZWQsIG5vdCBzdXBwb3J0ZWQgaW4gcHJvdG8zLlxuICAgICAgICAgICAgICAgIC8vIEJ1dCB3ZSBtdXN0IHN0aWxsIGJlIGFibGUgdG8gcGFyc2UgYW5kIHRyZWF0IGFzIHVua25vd24uXG4gICAgICAgICAgICAgICAgbGV0IHQ7XG4gICAgICAgICAgICAgICAgd2hpbGUgKCh0ID0gdGhpcy50YWcoKVsxXSkgIT09IGJpbmFyeV9mb3JtYXRfY29udHJhY3RfMS5XaXJlVHlwZS5FbmRHcm91cCkge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLnNraXAodCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJjYW50IHNraXAgd2lyZSB0eXBlIFwiICsgd2lyZVR5cGUpO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMuYXNzZXJ0Qm91bmRzKCk7XG4gICAgICAgIHJldHVybiB0aGlzLmJ1Zi5zdWJhcnJheShzdGFydCwgdGhpcy5wb3MpO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBUaHJvd3MgZXJyb3IgaWYgcG9zaXRpb24gaW4gYnl0ZSBhcnJheSBpcyBvdXQgb2YgcmFuZ2UuXG4gICAgICovXG4gICAgYXNzZXJ0Qm91bmRzKCkge1xuICAgICAgICBpZiAodGhpcy5wb3MgPiB0aGlzLmxlbilcbiAgICAgICAgICAgIHRocm93IG5ldyBSYW5nZUVycm9yKFwicHJlbWF0dXJlIEVPRlwiKTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogUmVhZCBhIGBpbnQzMmAgZmllbGQsIGEgc2lnbmVkIDMyIGJpdCB2YXJpbnQuXG4gICAgICovXG4gICAgaW50MzIoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLnVpbnQzMigpIHwgMDtcbiAgICB9XG4gICAgLyoqXG4gICAgICogUmVhZCBhIGBzaW50MzJgIGZpZWxkLCBhIHNpZ25lZCwgemlnemFnLWVuY29kZWQgMzItYml0IHZhcmludC5cbiAgICAgKi9cbiAgICBzaW50MzIoKSB7XG4gICAgICAgIGxldCB6emUgPSB0aGlzLnVpbnQzMigpO1xuICAgICAgICAvLyBkZWNvZGUgemlnemFnXG4gICAgICAgIHJldHVybiAoenplID4+PiAxKSBeIC0oenplICYgMSk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIFJlYWQgYSBgaW50NjRgIGZpZWxkLCBhIHNpZ25lZCA2NC1iaXQgdmFyaW50LlxuICAgICAqL1xuICAgIGludDY0KCkge1xuICAgICAgICByZXR1cm4gbmV3IHBiX2xvbmdfMS5QYkxvbmcoLi4udGhpcy52YXJpbnQ2NCgpKTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogUmVhZCBhIGB1aW50NjRgIGZpZWxkLCBhbiB1bnNpZ25lZCA2NC1iaXQgdmFyaW50LlxuICAgICAqL1xuICAgIHVpbnQ2NCgpIHtcbiAgICAgICAgcmV0dXJuIG5ldyBwYl9sb25nXzEuUGJVTG9uZyguLi50aGlzLnZhcmludDY0KCkpO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBSZWFkIGEgYHNpbnQ2NGAgZmllbGQsIGEgc2lnbmVkLCB6aWctemFnLWVuY29kZWQgNjQtYml0IHZhcmludC5cbiAgICAgKi9cbiAgICBzaW50NjQoKSB7XG4gICAgICAgIGxldCBbbG8sIGhpXSA9IHRoaXMudmFyaW50NjQoKTtcbiAgICAgICAgLy8gZGVjb2RlIHppZyB6YWdcbiAgICAgICAgbGV0IHMgPSAtKGxvICYgMSk7XG4gICAgICAgIGxvID0gKChsbyA+Pj4gMSB8IChoaSAmIDEpIDw8IDMxKSBeIHMpO1xuICAgICAgICBoaSA9IChoaSA+Pj4gMSBeIHMpO1xuICAgICAgICByZXR1cm4gbmV3IHBiX2xvbmdfMS5QYkxvbmcobG8sIGhpKTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogUmVhZCBhIGBib29sYCBmaWVsZCwgYSB2YXJpYW50LlxuICAgICAqL1xuICAgIGJvb2woKSB7XG4gICAgICAgIGxldCBbbG8sIGhpXSA9IHRoaXMudmFyaW50NjQoKTtcbiAgICAgICAgcmV0dXJuIGxvICE9PSAwIHx8IGhpICE9PSAwO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBSZWFkIGEgYGZpeGVkMzJgIGZpZWxkLCBhbiB1bnNpZ25lZCwgZml4ZWQtbGVuZ3RoIDMyLWJpdCBpbnRlZ2VyLlxuICAgICAqL1xuICAgIGZpeGVkMzIoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLnZpZXcuZ2V0VWludDMyKCh0aGlzLnBvcyArPSA0KSAtIDQsIHRydWUpO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBSZWFkIGEgYHNmaXhlZDMyYCBmaWVsZCwgYSBzaWduZWQsIGZpeGVkLWxlbmd0aCAzMi1iaXQgaW50ZWdlci5cbiAgICAgKi9cbiAgICBzZml4ZWQzMigpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMudmlldy5nZXRJbnQzMigodGhpcy5wb3MgKz0gNCkgLSA0LCB0cnVlKTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogUmVhZCBhIGBmaXhlZDY0YCBmaWVsZCwgYW4gdW5zaWduZWQsIGZpeGVkLWxlbmd0aCA2NCBiaXQgaW50ZWdlci5cbiAgICAgKi9cbiAgICBmaXhlZDY0KCkge1xuICAgICAgICByZXR1cm4gbmV3IHBiX2xvbmdfMS5QYlVMb25nKHRoaXMuc2ZpeGVkMzIoKSwgdGhpcy5zZml4ZWQzMigpKTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogUmVhZCBhIGBmaXhlZDY0YCBmaWVsZCwgYSBzaWduZWQsIGZpeGVkLWxlbmd0aCA2NC1iaXQgaW50ZWdlci5cbiAgICAgKi9cbiAgICBzZml4ZWQ2NCgpIHtcbiAgICAgICAgcmV0dXJuIG5ldyBwYl9sb25nXzEuUGJMb25nKHRoaXMuc2ZpeGVkMzIoKSwgdGhpcy5zZml4ZWQzMigpKTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogUmVhZCBhIGBmbG9hdGAgZmllbGQsIDMyLWJpdCBmbG9hdGluZyBwb2ludCBudW1iZXIuXG4gICAgICovXG4gICAgZmxvYXQoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLnZpZXcuZ2V0RmxvYXQzMigodGhpcy5wb3MgKz0gNCkgLSA0LCB0cnVlKTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogUmVhZCBhIGBkb3VibGVgIGZpZWxkLCBhIDY0LWJpdCBmbG9hdGluZyBwb2ludCBudW1iZXIuXG4gICAgICovXG4gICAgZG91YmxlKCkge1xuICAgICAgICByZXR1cm4gdGhpcy52aWV3LmdldEZsb2F0NjQoKHRoaXMucG9zICs9IDgpIC0gOCwgdHJ1ZSk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIFJlYWQgYSBgYnl0ZXNgIGZpZWxkLCBsZW5ndGgtZGVsaW1pdGVkIGFyYml0cmFyeSBkYXRhLlxuICAgICAqL1xuICAgIGJ5dGVzKCkge1xuICAgICAgICBsZXQgbGVuID0gdGhpcy51aW50MzIoKTtcbiAgICAgICAgbGV0IHN0YXJ0ID0gdGhpcy5wb3M7XG4gICAgICAgIHRoaXMucG9zICs9IGxlbjtcbiAgICAgICAgdGhpcy5hc3NlcnRCb3VuZHMoKTtcbiAgICAgICAgcmV0dXJuIHRoaXMuYnVmLnN1YmFycmF5KHN0YXJ0LCBzdGFydCArIGxlbik7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIFJlYWQgYSBgc3RyaW5nYCBmaWVsZCwgbGVuZ3RoLWRlbGltaXRlZCBkYXRhIGNvbnZlcnRlZCB0byBVVEYtOCB0ZXh0LlxuICAgICAqL1xuICAgIHN0cmluZygpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMudGV4dERlY29kZXIuZGVjb2RlKHRoaXMuYnl0ZXMoKSk7XG4gICAgfVxufVxuZXhwb3J0cy5CaW5hcnlSZWFkZXIgPSBCaW5hcnlSZWFkZXI7XG4iLAogICAgIlwidXNlIHN0cmljdFwiO1xuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiX19lc01vZHVsZVwiLCB7IHZhbHVlOiB0cnVlIH0pO1xuZXhwb3J0cy5hc3NlcnRGbG9hdDMyID0gZXhwb3J0cy5hc3NlcnRVSW50MzIgPSBleHBvcnRzLmFzc2VydEludDMyID0gZXhwb3J0cy5hc3NlcnROZXZlciA9IGV4cG9ydHMuYXNzZXJ0ID0gdm9pZCAwO1xuLyoqXG4gKiBhc3NlcnQgdGhhdCBjb25kaXRpb24gaXMgdHJ1ZSBvciB0aHJvdyBlcnJvciAod2l0aCBtZXNzYWdlKVxuICovXG5mdW5jdGlvbiBhc3NlcnQoY29uZGl0aW9uLCBtc2cpIHtcbiAgICBpZiAoIWNvbmRpdGlvbikge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IobXNnKTtcbiAgICB9XG59XG5leHBvcnRzLmFzc2VydCA9IGFzc2VydDtcbi8qKlxuICogYXNzZXJ0IHRoYXQgdmFsdWUgY2Fubm90IGV4aXN0ID0gdHlwZSBgbmV2ZXJgLiB0aHJvdyBydW50aW1lIGVycm9yIGlmIGl0IGRvZXMuXG4gKi9cbmZ1bmN0aW9uIGFzc2VydE5ldmVyKHZhbHVlLCBtc2cpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IobXNnICE9PSBudWxsICYmIG1zZyAhPT0gdm9pZCAwID8gbXNnIDogJ1VuZXhwZWN0ZWQgb2JqZWN0OiAnICsgdmFsdWUpO1xufVxuZXhwb3J0cy5hc3NlcnROZXZlciA9IGFzc2VydE5ldmVyO1xuY29uc3QgRkxPQVQzMl9NQVggPSAzLjQwMjgyMzQ2NjM4NTI4ODZlKzM4LCBGTE9BVDMyX01JTiA9IC0zLjQwMjgyMzQ2NjM4NTI4ODZlKzM4LCBVSU5UMzJfTUFYID0gMHhGRkZGRkZGRiwgSU5UMzJfTUFYID0gMFg3RkZGRkZGRiwgSU5UMzJfTUlOID0gLTBYODAwMDAwMDA7XG5mdW5jdGlvbiBhc3NlcnRJbnQzMihhcmcpIHtcbiAgICBpZiAodHlwZW9mIGFyZyAhPT0gXCJudW1iZXJcIilcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdpbnZhbGlkIGludCAzMjogJyArIHR5cGVvZiBhcmcpO1xuICAgIGlmICghTnVtYmVyLmlzSW50ZWdlcihhcmcpIHx8IGFyZyA+IElOVDMyX01BWCB8fCBhcmcgPCBJTlQzMl9NSU4pXG4gICAgICAgIHRocm93IG5ldyBFcnJvcignaW52YWxpZCBpbnQgMzI6ICcgKyBhcmcpO1xufVxuZXhwb3J0cy5hc3NlcnRJbnQzMiA9IGFzc2VydEludDMyO1xuZnVuY3Rpb24gYXNzZXJ0VUludDMyKGFyZykge1xuICAgIGlmICh0eXBlb2YgYXJnICE9PSBcIm51bWJlclwiKVxuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ2ludmFsaWQgdWludCAzMjogJyArIHR5cGVvZiBhcmcpO1xuICAgIGlmICghTnVtYmVyLmlzSW50ZWdlcihhcmcpIHx8IGFyZyA+IFVJTlQzMl9NQVggfHwgYXJnIDwgMClcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdpbnZhbGlkIHVpbnQgMzI6ICcgKyBhcmcpO1xufVxuZXhwb3J0cy5hc3NlcnRVSW50MzIgPSBhc3NlcnRVSW50MzI7XG5mdW5jdGlvbiBhc3NlcnRGbG9hdDMyKGFyZykge1xuICAgIGlmICh0eXBlb2YgYXJnICE9PSBcIm51bWJlclwiKVxuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ2ludmFsaWQgZmxvYXQgMzI6ICcgKyB0eXBlb2YgYXJnKTtcbiAgICBpZiAoIU51bWJlci5pc0Zpbml0ZShhcmcpKVxuICAgICAgICByZXR1cm47XG4gICAgaWYgKGFyZyA+IEZMT0FUMzJfTUFYIHx8IGFyZyA8IEZMT0FUMzJfTUlOKVxuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ2ludmFsaWQgZmxvYXQgMzI6ICcgKyBhcmcpO1xufVxuZXhwb3J0cy5hc3NlcnRGbG9hdDMyID0gYXNzZXJ0RmxvYXQzMjtcbiIsCiAgICAiXCJ1c2Ugc3RyaWN0XCI7XG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJfX2VzTW9kdWxlXCIsIHsgdmFsdWU6IHRydWUgfSk7XG5leHBvcnRzLkJpbmFyeVdyaXRlciA9IGV4cG9ydHMuYmluYXJ5V3JpdGVPcHRpb25zID0gdm9pZCAwO1xuY29uc3QgcGJfbG9uZ18xID0gcmVxdWlyZShcIi4vcGItbG9uZ1wiKTtcbmNvbnN0IGdvb2dfdmFyaW50XzEgPSByZXF1aXJlKFwiLi9nb29nLXZhcmludFwiKTtcbmNvbnN0IGFzc2VydF8xID0gcmVxdWlyZShcIi4vYXNzZXJ0XCIpO1xuY29uc3QgZGVmYXVsdHNXcml0ZSA9IHtcbiAgICB3cml0ZVVua25vd25GaWVsZHM6IHRydWUsXG4gICAgd3JpdGVyRmFjdG9yeTogKCkgPT4gbmV3IEJpbmFyeVdyaXRlcigpLFxufTtcbi8qKlxuICogTWFrZSBvcHRpb25zIGZvciB3cml0aW5nIGJpbmFyeSBkYXRhIGZvcm0gcGFydGlhbCBvcHRpb25zLlxuICovXG5mdW5jdGlvbiBiaW5hcnlXcml0ZU9wdGlvbnMob3B0aW9ucykge1xuICAgIHJldHVybiBvcHRpb25zID8gT2JqZWN0LmFzc2lnbihPYmplY3QuYXNzaWduKHt9LCBkZWZhdWx0c1dyaXRlKSwgb3B0aW9ucykgOiBkZWZhdWx0c1dyaXRlO1xufVxuZXhwb3J0cy5iaW5hcnlXcml0ZU9wdGlvbnMgPSBiaW5hcnlXcml0ZU9wdGlvbnM7XG5jbGFzcyBCaW5hcnlXcml0ZXIge1xuICAgIGNvbnN0cnVjdG9yKHRleHRFbmNvZGVyKSB7XG4gICAgICAgIC8qKlxuICAgICAgICAgKiBQcmV2aW91cyBmb3JrIHN0YXRlcy5cbiAgICAgICAgICovXG4gICAgICAgIHRoaXMuc3RhY2sgPSBbXTtcbiAgICAgICAgdGhpcy50ZXh0RW5jb2RlciA9IHRleHRFbmNvZGVyICE9PSBudWxsICYmIHRleHRFbmNvZGVyICE9PSB2b2lkIDAgPyB0ZXh0RW5jb2RlciA6IG5ldyBUZXh0RW5jb2RlcigpO1xuICAgICAgICB0aGlzLmNodW5rcyA9IFtdO1xuICAgICAgICB0aGlzLmJ1ZiA9IFtdO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBSZXR1cm4gYWxsIGJ5dGVzIHdyaXR0ZW4gYW5kIHJlc2V0IHRoaXMgd3JpdGVyLlxuICAgICAqL1xuICAgIGZpbmlzaCgpIHtcbiAgICAgICAgdGhpcy5jaHVua3MucHVzaChuZXcgVWludDhBcnJheSh0aGlzLmJ1ZikpOyAvLyBmbHVzaCB0aGUgYnVmZmVyXG4gICAgICAgIGxldCBsZW4gPSAwO1xuICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IHRoaXMuY2h1bmtzLmxlbmd0aDsgaSsrKVxuICAgICAgICAgICAgbGVuICs9IHRoaXMuY2h1bmtzW2ldLmxlbmd0aDtcbiAgICAgICAgbGV0IGJ5dGVzID0gbmV3IFVpbnQ4QXJyYXkobGVuKTtcbiAgICAgICAgbGV0IG9mZnNldCA9IDA7XG4gICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgdGhpcy5jaHVua3MubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgIGJ5dGVzLnNldCh0aGlzLmNodW5rc1tpXSwgb2Zmc2V0KTtcbiAgICAgICAgICAgIG9mZnNldCArPSB0aGlzLmNodW5rc1tpXS5sZW5ndGg7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5jaHVua3MgPSBbXTtcbiAgICAgICAgcmV0dXJuIGJ5dGVzO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBTdGFydCBhIG5ldyBmb3JrIGZvciBsZW5ndGgtZGVsaW1pdGVkIGRhdGEgbGlrZSBhIG1lc3NhZ2VcbiAgICAgKiBvciBhIHBhY2tlZCByZXBlYXRlZCBmaWVsZC5cbiAgICAgKlxuICAgICAqIE11c3QgYmUgam9pbmVkIGxhdGVyIHdpdGggYGpvaW4oKWAuXG4gICAgICovXG4gICAgZm9yaygpIHtcbiAgICAgICAgdGhpcy5zdGFjay5wdXNoKHsgY2h1bmtzOiB0aGlzLmNodW5rcywgYnVmOiB0aGlzLmJ1ZiB9KTtcbiAgICAgICAgdGhpcy5jaHVua3MgPSBbXTtcbiAgICAgICAgdGhpcy5idWYgPSBbXTtcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIEpvaW4gdGhlIGxhc3QgZm9yay4gV3JpdGUgaXRzIGxlbmd0aCBhbmQgYnl0ZXMsIHRoZW5cbiAgICAgKiByZXR1cm4gdG8gdGhlIHByZXZpb3VzIHN0YXRlLlxuICAgICAqL1xuICAgIGpvaW4oKSB7XG4gICAgICAgIC8vIGdldCBjaHVuayBvZiBmb3JrXG4gICAgICAgIGxldCBjaHVuayA9IHRoaXMuZmluaXNoKCk7XG4gICAgICAgIC8vIHJlc3RvcmUgcHJldmlvdXMgc3RhdGVcbiAgICAgICAgbGV0IHByZXYgPSB0aGlzLnN0YWNrLnBvcCgpO1xuICAgICAgICBpZiAoIXByZXYpXG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ2ludmFsaWQgc3RhdGUsIGZvcmsgc3RhY2sgZW1wdHknKTtcbiAgICAgICAgdGhpcy5jaHVua3MgPSBwcmV2LmNodW5rcztcbiAgICAgICAgdGhpcy5idWYgPSBwcmV2LmJ1ZjtcbiAgICAgICAgLy8gd3JpdGUgbGVuZ3RoIG9mIGNodW5rIGFzIHZhcmludFxuICAgICAgICB0aGlzLnVpbnQzMihjaHVuay5ieXRlTGVuZ3RoKTtcbiAgICAgICAgcmV0dXJuIHRoaXMucmF3KGNodW5rKTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogV3JpdGVzIGEgdGFnIChmaWVsZCBudW1iZXIgYW5kIHdpcmUgdHlwZSkuXG4gICAgICpcbiAgICAgKiBFcXVpdmFsZW50IHRvIGB1aW50MzIoIChmaWVsZE5vIDw8IDMgfCB0eXBlKSA+Pj4gMCApYC5cbiAgICAgKlxuICAgICAqIEdlbmVyYXRlZCBjb2RlIHNob3VsZCBjb21wdXRlIHRoZSB0YWcgYWhlYWQgb2YgdGltZSBhbmQgY2FsbCBgdWludDMyKClgLlxuICAgICAqL1xuICAgIHRhZyhmaWVsZE5vLCB0eXBlKSB7XG4gICAgICAgIHJldHVybiB0aGlzLnVpbnQzMigoZmllbGRObyA8PCAzIHwgdHlwZSkgPj4+IDApO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBXcml0ZSBhIGNodW5rIG9mIHJhdyBieXRlcy5cbiAgICAgKi9cbiAgICByYXcoY2h1bmspIHtcbiAgICAgICAgaWYgKHRoaXMuYnVmLmxlbmd0aCkge1xuICAgICAgICAgICAgdGhpcy5jaHVua3MucHVzaChuZXcgVWludDhBcnJheSh0aGlzLmJ1ZikpO1xuICAgICAgICAgICAgdGhpcy5idWYgPSBbXTtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLmNodW5rcy5wdXNoKGNodW5rKTtcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIFdyaXRlIGEgYHVpbnQzMmAgdmFsdWUsIGFuIHVuc2lnbmVkIDMyIGJpdCB2YXJpbnQuXG4gICAgICovXG4gICAgdWludDMyKHZhbHVlKSB7XG4gICAgICAgIGFzc2VydF8xLmFzc2VydFVJbnQzMih2YWx1ZSk7XG4gICAgICAgIC8vIHdyaXRlIHZhbHVlIGFzIHZhcmludCAzMiwgaW5saW5lZCBmb3Igc3BlZWRcbiAgICAgICAgd2hpbGUgKHZhbHVlID4gMHg3Zikge1xuICAgICAgICAgICAgdGhpcy5idWYucHVzaCgodmFsdWUgJiAweDdmKSB8IDB4ODApO1xuICAgICAgICAgICAgdmFsdWUgPSB2YWx1ZSA+Pj4gNztcbiAgICAgICAgfVxuICAgICAgICB0aGlzLmJ1Zi5wdXNoKHZhbHVlKTtcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIFdyaXRlIGEgYGludDMyYCB2YWx1ZSwgYSBzaWduZWQgMzIgYml0IHZhcmludC5cbiAgICAgKi9cbiAgICBpbnQzMih2YWx1ZSkge1xuICAgICAgICBhc3NlcnRfMS5hc3NlcnRJbnQzMih2YWx1ZSk7XG4gICAgICAgIGdvb2dfdmFyaW50XzEudmFyaW50MzJ3cml0ZSh2YWx1ZSwgdGhpcy5idWYpO1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9XG4gICAgLyoqXG4gICAgICogV3JpdGUgYSBgYm9vbGAgdmFsdWUsIGEgdmFyaWFudC5cbiAgICAgKi9cbiAgICBib29sKHZhbHVlKSB7XG4gICAgICAgIHRoaXMuYnVmLnB1c2godmFsdWUgPyAxIDogMCk7XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBXcml0ZSBhIGBieXRlc2AgdmFsdWUsIGxlbmd0aC1kZWxpbWl0ZWQgYXJiaXRyYXJ5IGRhdGEuXG4gICAgICovXG4gICAgYnl0ZXModmFsdWUpIHtcbiAgICAgICAgdGhpcy51aW50MzIodmFsdWUuYnl0ZUxlbmd0aCk7IC8vIHdyaXRlIGxlbmd0aCBvZiBjaHVuayBhcyB2YXJpbnRcbiAgICAgICAgcmV0dXJuIHRoaXMucmF3KHZhbHVlKTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogV3JpdGUgYSBgc3RyaW5nYCB2YWx1ZSwgbGVuZ3RoLWRlbGltaXRlZCBkYXRhIGNvbnZlcnRlZCB0byBVVEYtOCB0ZXh0LlxuICAgICAqL1xuICAgIHN0cmluZyh2YWx1ZSkge1xuICAgICAgICBsZXQgY2h1bmsgPSB0aGlzLnRleHRFbmNvZGVyLmVuY29kZSh2YWx1ZSk7XG4gICAgICAgIHRoaXMudWludDMyKGNodW5rLmJ5dGVMZW5ndGgpOyAvLyB3cml0ZSBsZW5ndGggb2YgY2h1bmsgYXMgdmFyaW50XG4gICAgICAgIHJldHVybiB0aGlzLnJhdyhjaHVuayk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIFdyaXRlIGEgYGZsb2F0YCB2YWx1ZSwgMzItYml0IGZsb2F0aW5nIHBvaW50IG51bWJlci5cbiAgICAgKi9cbiAgICBmbG9hdCh2YWx1ZSkge1xuICAgICAgICBhc3NlcnRfMS5hc3NlcnRGbG9hdDMyKHZhbHVlKTtcbiAgICAgICAgbGV0IGNodW5rID0gbmV3IFVpbnQ4QXJyYXkoNCk7XG4gICAgICAgIG5ldyBEYXRhVmlldyhjaHVuay5idWZmZXIpLnNldEZsb2F0MzIoMCwgdmFsdWUsIHRydWUpO1xuICAgICAgICByZXR1cm4gdGhpcy5yYXcoY2h1bmspO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBXcml0ZSBhIGBkb3VibGVgIHZhbHVlLCBhIDY0LWJpdCBmbG9hdGluZyBwb2ludCBudW1iZXIuXG4gICAgICovXG4gICAgZG91YmxlKHZhbHVlKSB7XG4gICAgICAgIGxldCBjaHVuayA9IG5ldyBVaW50OEFycmF5KDgpO1xuICAgICAgICBuZXcgRGF0YVZpZXcoY2h1bmsuYnVmZmVyKS5zZXRGbG9hdDY0KDAsIHZhbHVlLCB0cnVlKTtcbiAgICAgICAgcmV0dXJuIHRoaXMucmF3KGNodW5rKTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogV3JpdGUgYSBgZml4ZWQzMmAgdmFsdWUsIGFuIHVuc2lnbmVkLCBmaXhlZC1sZW5ndGggMzItYml0IGludGVnZXIuXG4gICAgICovXG4gICAgZml4ZWQzMih2YWx1ZSkge1xuICAgICAgICBhc3NlcnRfMS5hc3NlcnRVSW50MzIodmFsdWUpO1xuICAgICAgICBsZXQgY2h1bmsgPSBuZXcgVWludDhBcnJheSg0KTtcbiAgICAgICAgbmV3IERhdGFWaWV3KGNodW5rLmJ1ZmZlcikuc2V0VWludDMyKDAsIHZhbHVlLCB0cnVlKTtcbiAgICAgICAgcmV0dXJuIHRoaXMucmF3KGNodW5rKTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogV3JpdGUgYSBgc2ZpeGVkMzJgIHZhbHVlLCBhIHNpZ25lZCwgZml4ZWQtbGVuZ3RoIDMyLWJpdCBpbnRlZ2VyLlxuICAgICAqL1xuICAgIHNmaXhlZDMyKHZhbHVlKSB7XG4gICAgICAgIGFzc2VydF8xLmFzc2VydEludDMyKHZhbHVlKTtcbiAgICAgICAgbGV0IGNodW5rID0gbmV3IFVpbnQ4QXJyYXkoNCk7XG4gICAgICAgIG5ldyBEYXRhVmlldyhjaHVuay5idWZmZXIpLnNldEludDMyKDAsIHZhbHVlLCB0cnVlKTtcbiAgICAgICAgcmV0dXJuIHRoaXMucmF3KGNodW5rKTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogV3JpdGUgYSBgc2ludDMyYCB2YWx1ZSwgYSBzaWduZWQsIHppZ3phZy1lbmNvZGVkIDMyLWJpdCB2YXJpbnQuXG4gICAgICovXG4gICAgc2ludDMyKHZhbHVlKSB7XG4gICAgICAgIGFzc2VydF8xLmFzc2VydEludDMyKHZhbHVlKTtcbiAgICAgICAgLy8gemlnemFnIGVuY29kZVxuICAgICAgICB2YWx1ZSA9ICgodmFsdWUgPDwgMSkgXiAodmFsdWUgPj4gMzEpKSA+Pj4gMDtcbiAgICAgICAgZ29vZ192YXJpbnRfMS52YXJpbnQzMndyaXRlKHZhbHVlLCB0aGlzLmJ1Zik7XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBXcml0ZSBhIGBmaXhlZDY0YCB2YWx1ZSwgYSBzaWduZWQsIGZpeGVkLWxlbmd0aCA2NC1iaXQgaW50ZWdlci5cbiAgICAgKi9cbiAgICBzZml4ZWQ2NCh2YWx1ZSkge1xuICAgICAgICBsZXQgY2h1bmsgPSBuZXcgVWludDhBcnJheSg4KTtcbiAgICAgICAgbGV0IHZpZXcgPSBuZXcgRGF0YVZpZXcoY2h1bmsuYnVmZmVyKTtcbiAgICAgICAgbGV0IGxvbmcgPSBwYl9sb25nXzEuUGJMb25nLmZyb20odmFsdWUpO1xuICAgICAgICB2aWV3LnNldEludDMyKDAsIGxvbmcubG8sIHRydWUpO1xuICAgICAgICB2aWV3LnNldEludDMyKDQsIGxvbmcuaGksIHRydWUpO1xuICAgICAgICByZXR1cm4gdGhpcy5yYXcoY2h1bmspO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBXcml0ZSBhIGBmaXhlZDY0YCB2YWx1ZSwgYW4gdW5zaWduZWQsIGZpeGVkLWxlbmd0aCA2NCBiaXQgaW50ZWdlci5cbiAgICAgKi9cbiAgICBmaXhlZDY0KHZhbHVlKSB7XG4gICAgICAgIGxldCBjaHVuayA9IG5ldyBVaW50OEFycmF5KDgpO1xuICAgICAgICBsZXQgdmlldyA9IG5ldyBEYXRhVmlldyhjaHVuay5idWZmZXIpO1xuICAgICAgICBsZXQgbG9uZyA9IHBiX2xvbmdfMS5QYlVMb25nLmZyb20odmFsdWUpO1xuICAgICAgICB2aWV3LnNldEludDMyKDAsIGxvbmcubG8sIHRydWUpO1xuICAgICAgICB2aWV3LnNldEludDMyKDQsIGxvbmcuaGksIHRydWUpO1xuICAgICAgICByZXR1cm4gdGhpcy5yYXcoY2h1bmspO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBXcml0ZSBhIGBpbnQ2NGAgdmFsdWUsIGEgc2lnbmVkIDY0LWJpdCB2YXJpbnQuXG4gICAgICovXG4gICAgaW50NjQodmFsdWUpIHtcbiAgICAgICAgbGV0IGxvbmcgPSBwYl9sb25nXzEuUGJMb25nLmZyb20odmFsdWUpO1xuICAgICAgICBnb29nX3ZhcmludF8xLnZhcmludDY0d3JpdGUobG9uZy5sbywgbG9uZy5oaSwgdGhpcy5idWYpO1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9XG4gICAgLyoqXG4gICAgICogV3JpdGUgYSBgc2ludDY0YCB2YWx1ZSwgYSBzaWduZWQsIHppZy16YWctZW5jb2RlZCA2NC1iaXQgdmFyaW50LlxuICAgICAqL1xuICAgIHNpbnQ2NCh2YWx1ZSkge1xuICAgICAgICBsZXQgbG9uZyA9IHBiX2xvbmdfMS5QYkxvbmcuZnJvbSh2YWx1ZSksIFxuICAgICAgICAvLyB6aWd6YWcgZW5jb2RlXG4gICAgICAgIHNpZ24gPSBsb25nLmhpID4+IDMxLCBsbyA9IChsb25nLmxvIDw8IDEpIF4gc2lnbiwgaGkgPSAoKGxvbmcuaGkgPDwgMSkgfCAobG9uZy5sbyA+Pj4gMzEpKSBeIHNpZ247XG4gICAgICAgIGdvb2dfdmFyaW50XzEudmFyaW50NjR3cml0ZShsbywgaGksIHRoaXMuYnVmKTtcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIFdyaXRlIGEgYHVpbnQ2NGAgdmFsdWUsIGFuIHVuc2lnbmVkIDY0LWJpdCB2YXJpbnQuXG4gICAgICovXG4gICAgdWludDY0KHZhbHVlKSB7XG4gICAgICAgIGxldCBsb25nID0gcGJfbG9uZ18xLlBiVUxvbmcuZnJvbSh2YWx1ZSk7XG4gICAgICAgIGdvb2dfdmFyaW50XzEudmFyaW50NjR3cml0ZShsb25nLmxvLCBsb25nLmhpLCB0aGlzLmJ1Zik7XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cbn1cbmV4cG9ydHMuQmluYXJ5V3JpdGVyID0gQmluYXJ5V3JpdGVyO1xuIiwKICAgICJcInVzZSBzdHJpY3RcIjtcbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIl9fZXNNb2R1bGVcIiwgeyB2YWx1ZTogdHJ1ZSB9KTtcbmV4cG9ydHMubWVyZ2VKc29uT3B0aW9ucyA9IGV4cG9ydHMuanNvbldyaXRlT3B0aW9ucyA9IGV4cG9ydHMuanNvblJlYWRPcHRpb25zID0gdm9pZCAwO1xuY29uc3QgZGVmYXVsdHNXcml0ZSA9IHtcbiAgICBlbWl0RGVmYXVsdFZhbHVlczogZmFsc2UsXG4gICAgZW51bUFzSW50ZWdlcjogZmFsc2UsXG4gICAgdXNlUHJvdG9GaWVsZE5hbWU6IGZhbHNlLFxuICAgIHByZXR0eVNwYWNlczogMCxcbn0sIGRlZmF1bHRzUmVhZCA9IHtcbiAgICBpZ25vcmVVbmtub3duRmllbGRzOiBmYWxzZSxcbn07XG4vKipcbiAqIE1ha2Ugb3B0aW9ucyBmb3IgcmVhZGluZyBKU09OIGRhdGEgZnJvbSBwYXJ0aWFsIG9wdGlvbnMuXG4gKi9cbmZ1bmN0aW9uIGpzb25SZWFkT3B0aW9ucyhvcHRpb25zKSB7XG4gICAgcmV0dXJuIG9wdGlvbnMgPyBPYmplY3QuYXNzaWduKE9iamVjdC5hc3NpZ24oe30sIGRlZmF1bHRzUmVhZCksIG9wdGlvbnMpIDogZGVmYXVsdHNSZWFkO1xufVxuZXhwb3J0cy5qc29uUmVhZE9wdGlvbnMgPSBqc29uUmVhZE9wdGlvbnM7XG4vKipcbiAqIE1ha2Ugb3B0aW9ucyBmb3Igd3JpdGluZyBKU09OIGRhdGEgZnJvbSBwYXJ0aWFsIG9wdGlvbnMuXG4gKi9cbmZ1bmN0aW9uIGpzb25Xcml0ZU9wdGlvbnMob3B0aW9ucykge1xuICAgIHJldHVybiBvcHRpb25zID8gT2JqZWN0LmFzc2lnbihPYmplY3QuYXNzaWduKHt9LCBkZWZhdWx0c1dyaXRlKSwgb3B0aW9ucykgOiBkZWZhdWx0c1dyaXRlO1xufVxuZXhwb3J0cy5qc29uV3JpdGVPcHRpb25zID0ganNvbldyaXRlT3B0aW9ucztcbi8qKlxuICogTWVyZ2VzIEpTT04gd3JpdGUgb3IgcmVhZCBvcHRpb25zLiBMYXRlciB2YWx1ZXMgb3ZlcnJpZGUgZWFybGllciB2YWx1ZXMuIFR5cGUgcmVnaXN0cmllcyBhcmUgbWVyZ2VkLlxuICovXG5mdW5jdGlvbiBtZXJnZUpzb25PcHRpb25zKGEsIGIpIHtcbiAgICB2YXIgX2EsIF9iO1xuICAgIGxldCBjID0gT2JqZWN0LmFzc2lnbihPYmplY3QuYXNzaWduKHt9LCBhKSwgYik7XG4gICAgYy50eXBlUmVnaXN0cnkgPSBbLi4uKChfYSA9IGEgPT09IG51bGwgfHwgYSA9PT0gdm9pZCAwID8gdm9pZCAwIDogYS50eXBlUmVnaXN0cnkpICE9PSBudWxsICYmIF9hICE9PSB2b2lkIDAgPyBfYSA6IFtdKSwgLi4uKChfYiA9IGIgPT09IG51bGwgfHwgYiA9PT0gdm9pZCAwID8gdm9pZCAwIDogYi50eXBlUmVnaXN0cnkpICE9PSBudWxsICYmIF9iICE9PSB2b2lkIDAgPyBfYiA6IFtdKV07XG4gICAgcmV0dXJuIGM7XG59XG5leHBvcnRzLm1lcmdlSnNvbk9wdGlvbnMgPSBtZXJnZUpzb25PcHRpb25zO1xuIiwKICAgICJcInVzZSBzdHJpY3RcIjtcbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIl9fZXNNb2R1bGVcIiwgeyB2YWx1ZTogdHJ1ZSB9KTtcbmV4cG9ydHMuTUVTU0FHRV9UWVBFID0gdm9pZCAwO1xuLyoqXG4gKiBUaGUgc3ltYm9sIHVzZWQgYXMgYSBrZXkgb24gbWVzc2FnZSBvYmplY3RzIHRvIHN0b3JlIHRoZSBtZXNzYWdlIHR5cGUuXG4gKlxuICogTm90ZSB0aGF0IHRoaXMgaXMgYW4gZXhwZXJpbWVudGFsIGZlYXR1cmUgLSBpdCBpcyBoZXJlIHRvIHN0YXksIGJ1dFxuICogaW1wbGVtZW50YXRpb24gZGV0YWlscyBtYXkgY2hhbmdlIHdpdGhvdXQgbm90aWNlLlxuICovXG5leHBvcnRzLk1FU1NBR0VfVFlQRSA9IFN5bWJvbC5mb3IoXCJwcm90b2J1Zi10cy9tZXNzYWdlLXR5cGVcIik7XG4iLAogICAgIlwidXNlIHN0cmljdFwiO1xuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiX19lc01vZHVsZVwiLCB7IHZhbHVlOiB0cnVlIH0pO1xuZXhwb3J0cy5sb3dlckNhbWVsQ2FzZSA9IHZvaWQgMDtcbi8qKlxuICogQ29udmVydHMgc25ha2VfY2FzZSB0byBsb3dlckNhbWVsQ2FzZS5cbiAqXG4gKiBTaG91bGQgYmVoYXZlIGxpa2UgcHJvdG9jOlxuICogaHR0cHM6Ly9naXRodWIuY29tL3Byb3RvY29sYnVmZmVycy9wcm90b2J1Zi9ibG9iL2U4YWUxMzdjOTY0NDRlYTMxMzQ4NWVkMTExOGM1ZTQzYjIwOTljZjEvc3JjL2dvb2dsZS9wcm90b2J1Zi9jb21waWxlci9qYXZhL2phdmFfaGVscGVycy5jYyNMMTE4XG4gKi9cbmZ1bmN0aW9uIGxvd2VyQ2FtZWxDYXNlKHNuYWtlQ2FzZSkge1xuICAgIGxldCBjYXBOZXh0ID0gZmFsc2U7XG4gICAgY29uc3Qgc2IgPSBbXTtcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IHNuYWtlQ2FzZS5sZW5ndGg7IGkrKykge1xuICAgICAgICBsZXQgbmV4dCA9IHNuYWtlQ2FzZS5jaGFyQXQoaSk7XG4gICAgICAgIGlmIChuZXh0ID09ICdfJykge1xuICAgICAgICAgICAgY2FwTmV4dCA9IHRydWU7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSBpZiAoL1xcZC8udGVzdChuZXh0KSkge1xuICAgICAgICAgICAgc2IucHVzaChuZXh0KTtcbiAgICAgICAgICAgIGNhcE5leHQgPSB0cnVlO1xuICAgICAgICB9XG4gICAgICAgIGVsc2UgaWYgKGNhcE5leHQpIHtcbiAgICAgICAgICAgIHNiLnB1c2gobmV4dC50b1VwcGVyQ2FzZSgpKTtcbiAgICAgICAgICAgIGNhcE5leHQgPSBmYWxzZTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIGlmIChpID09IDApIHtcbiAgICAgICAgICAgIHNiLnB1c2gobmV4dC50b0xvd2VyQ2FzZSgpKTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIHNiLnB1c2gobmV4dCk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIHNiLmpvaW4oJycpO1xufVxuZXhwb3J0cy5sb3dlckNhbWVsQ2FzZSA9IGxvd2VyQ2FtZWxDYXNlO1xuIiwKICAgICJcInVzZSBzdHJpY3RcIjtcbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIl9fZXNNb2R1bGVcIiwgeyB2YWx1ZTogdHJ1ZSB9KTtcbmV4cG9ydHMucmVhZE1lc3NhZ2VPcHRpb24gPSBleHBvcnRzLnJlYWRGaWVsZE9wdGlvbiA9IGV4cG9ydHMucmVhZEZpZWxkT3B0aW9ucyA9IGV4cG9ydHMubm9ybWFsaXplRmllbGRJbmZvID0gZXhwb3J0cy5SZXBlYXRUeXBlID0gZXhwb3J0cy5Mb25nVHlwZSA9IGV4cG9ydHMuU2NhbGFyVHlwZSA9IHZvaWQgMDtcbmNvbnN0IGxvd2VyX2NhbWVsX2Nhc2VfMSA9IHJlcXVpcmUoXCIuL2xvd2VyLWNhbWVsLWNhc2VcIik7XG4vKipcbiAqIFNjYWxhciB2YWx1ZSB0eXBlcy4gVGhpcyBpcyBhIHN1YnNldCBvZiBmaWVsZCB0eXBlcyBkZWNsYXJlZCBieSBwcm90b2J1ZlxuICogZW51bSBnb29nbGUucHJvdG9idWYuRmllbGREZXNjcmlwdG9yUHJvdG8uVHlwZSBUaGUgdHlwZXMgR1JPVVAgYW5kIE1FU1NBR0VcbiAqIGFyZSBvbWl0dGVkLCBidXQgdGhlIG51bWVyaWNhbCB2YWx1ZXMgYXJlIGlkZW50aWNhbC5cbiAqL1xudmFyIFNjYWxhclR5cGU7XG4oZnVuY3Rpb24gKFNjYWxhclR5cGUpIHtcbiAgICAvLyAwIGlzIHJlc2VydmVkIGZvciBlcnJvcnMuXG4gICAgLy8gT3JkZXIgaXMgd2VpcmQgZm9yIGhpc3RvcmljYWwgcmVhc29ucy5cbiAgICBTY2FsYXJUeXBlW1NjYWxhclR5cGVbXCJET1VCTEVcIl0gPSAxXSA9IFwiRE9VQkxFXCI7XG4gICAgU2NhbGFyVHlwZVtTY2FsYXJUeXBlW1wiRkxPQVRcIl0gPSAyXSA9IFwiRkxPQVRcIjtcbiAgICAvLyBOb3QgWmlnWmFnIGVuY29kZWQuICBOZWdhdGl2ZSBudW1iZXJzIHRha2UgMTAgYnl0ZXMuICBVc2UgVFlQRV9TSU5UNjQgaWZcbiAgICAvLyBuZWdhdGl2ZSB2YWx1ZXMgYXJlIGxpa2VseS5cbiAgICBTY2FsYXJUeXBlW1NjYWxhclR5cGVbXCJJTlQ2NFwiXSA9IDNdID0gXCJJTlQ2NFwiO1xuICAgIFNjYWxhclR5cGVbU2NhbGFyVHlwZVtcIlVJTlQ2NFwiXSA9IDRdID0gXCJVSU5UNjRcIjtcbiAgICAvLyBOb3QgWmlnWmFnIGVuY29kZWQuICBOZWdhdGl2ZSBudW1iZXJzIHRha2UgMTAgYnl0ZXMuICBVc2UgVFlQRV9TSU5UMzIgaWZcbiAgICAvLyBuZWdhdGl2ZSB2YWx1ZXMgYXJlIGxpa2VseS5cbiAgICBTY2FsYXJUeXBlW1NjYWxhclR5cGVbXCJJTlQzMlwiXSA9IDVdID0gXCJJTlQzMlwiO1xuICAgIFNjYWxhclR5cGVbU2NhbGFyVHlwZVtcIkZJWEVENjRcIl0gPSA2XSA9IFwiRklYRUQ2NFwiO1xuICAgIFNjYWxhclR5cGVbU2NhbGFyVHlwZVtcIkZJWEVEMzJcIl0gPSA3XSA9IFwiRklYRUQzMlwiO1xuICAgIFNjYWxhclR5cGVbU2NhbGFyVHlwZVtcIkJPT0xcIl0gPSA4XSA9IFwiQk9PTFwiO1xuICAgIFNjYWxhclR5cGVbU2NhbGFyVHlwZVtcIlNUUklOR1wiXSA9IDldID0gXCJTVFJJTkdcIjtcbiAgICAvLyBUYWctZGVsaW1pdGVkIGFnZ3JlZ2F0ZS5cbiAgICAvLyBHcm91cCB0eXBlIGlzIGRlcHJlY2F0ZWQgYW5kIG5vdCBzdXBwb3J0ZWQgaW4gcHJvdG8zLiBIb3dldmVyLCBQcm90bzNcbiAgICAvLyBpbXBsZW1lbnRhdGlvbnMgc2hvdWxkIHN0aWxsIGJlIGFibGUgdG8gcGFyc2UgdGhlIGdyb3VwIHdpcmUgZm9ybWF0IGFuZFxuICAgIC8vIHRyZWF0IGdyb3VwIGZpZWxkcyBhcyB1bmtub3duIGZpZWxkcy5cbiAgICAvLyBUWVBFX0dST1VQID0gMTAsXG4gICAgLy8gVFlQRV9NRVNTQUdFID0gMTEsICAvLyBMZW5ndGgtZGVsaW1pdGVkIGFnZ3JlZ2F0ZS5cbiAgICAvLyBOZXcgaW4gdmVyc2lvbiAyLlxuICAgIFNjYWxhclR5cGVbU2NhbGFyVHlwZVtcIkJZVEVTXCJdID0gMTJdID0gXCJCWVRFU1wiO1xuICAgIFNjYWxhclR5cGVbU2NhbGFyVHlwZVtcIlVJTlQzMlwiXSA9IDEzXSA9IFwiVUlOVDMyXCI7XG4gICAgLy8gVFlQRV9FTlVNID0gMTQsXG4gICAgU2NhbGFyVHlwZVtTY2FsYXJUeXBlW1wiU0ZJWEVEMzJcIl0gPSAxNV0gPSBcIlNGSVhFRDMyXCI7XG4gICAgU2NhbGFyVHlwZVtTY2FsYXJUeXBlW1wiU0ZJWEVENjRcIl0gPSAxNl0gPSBcIlNGSVhFRDY0XCI7XG4gICAgU2NhbGFyVHlwZVtTY2FsYXJUeXBlW1wiU0lOVDMyXCJdID0gMTddID0gXCJTSU5UMzJcIjtcbiAgICBTY2FsYXJUeXBlW1NjYWxhclR5cGVbXCJTSU5UNjRcIl0gPSAxOF0gPSBcIlNJTlQ2NFwiO1xufSkoU2NhbGFyVHlwZSA9IGV4cG9ydHMuU2NhbGFyVHlwZSB8fCAoZXhwb3J0cy5TY2FsYXJUeXBlID0ge30pKTtcbi8qKlxuICogSmF2YVNjcmlwdCByZXByZXNlbnRhdGlvbiBvZiA2NCBiaXQgaW50ZWdyYWwgdHlwZXMuIEVxdWl2YWxlbnQgdG8gdGhlXG4gKiBmaWVsZCBvcHRpb24gXCJqc3R5cGVcIi5cbiAqXG4gKiBCeSBkZWZhdWx0LCBwcm90b2J1Zi10cyByZXByZXNlbnRzIDY0IGJpdCB0eXBlcyBhcyBgYmlnaW50YC5cbiAqXG4gKiBZb3UgY2FuIGNoYW5nZSB0aGUgZGVmYXVsdCBiZWhhdmlvdXIgYnkgZW5hYmxpbmcgdGhlIHBsdWdpbiBwYXJhbWV0ZXJcbiAqIGBsb25nX3R5cGVfc3RyaW5nYCwgd2hpY2ggd2lsbCByZXByZXNlbnQgNjQgYml0IHR5cGVzIGFzIGBzdHJpbmdgLlxuICpcbiAqIEFsdGVybmF0aXZlbHksIHlvdSBjYW4gY2hhbmdlIHRoZSBiZWhhdmlvdXIgZm9yIGluZGl2aWR1YWwgZmllbGRzXG4gKiB3aXRoIHRoZSBmaWVsZCBvcHRpb24gXCJqc3R5cGVcIjpcbiAqXG4gKiBgYGBwcm90b2J1ZlxuICogdWludDY0IG15X2ZpZWxkID0gMSBbanN0eXBlID0gSlNfU1RSSU5HXTtcbiAqIHVpbnQ2NCBvdGhlcl9maWVsZCA9IDIgW2pzdHlwZSA9IEpTX05VTUJFUl07XG4gKiBgYGBcbiAqL1xudmFyIExvbmdUeXBlO1xuKGZ1bmN0aW9uIChMb25nVHlwZSkge1xuICAgIC8qKlxuICAgICAqIFVzZSBKYXZhU2NyaXB0IGBiaWdpbnRgLlxuICAgICAqXG4gICAgICogRmllbGQgb3B0aW9uIGBbanN0eXBlID0gSlNfTk9STUFMXWAuXG4gICAgICovXG4gICAgTG9uZ1R5cGVbTG9uZ1R5cGVbXCJCSUdJTlRcIl0gPSAwXSA9IFwiQklHSU5UXCI7XG4gICAgLyoqXG4gICAgICogVXNlIEphdmFTY3JpcHQgYHN0cmluZ2AuXG4gICAgICpcbiAgICAgKiBGaWVsZCBvcHRpb24gYFtqc3R5cGUgPSBKU19TVFJJTkddYC5cbiAgICAgKi9cbiAgICBMb25nVHlwZVtMb25nVHlwZVtcIlNUUklOR1wiXSA9IDFdID0gXCJTVFJJTkdcIjtcbiAgICAvKipcbiAgICAgKiBVc2UgSmF2YVNjcmlwdCBgbnVtYmVyYC5cbiAgICAgKlxuICAgICAqIExhcmdlIHZhbHVlcyB3aWxsIGxvb3NlIHByZWNpc2lvbi5cbiAgICAgKlxuICAgICAqIEZpZWxkIG9wdGlvbiBgW2pzdHlwZSA9IEpTX05VTUJFUl1gLlxuICAgICAqL1xuICAgIExvbmdUeXBlW0xvbmdUeXBlW1wiTlVNQkVSXCJdID0gMl0gPSBcIk5VTUJFUlwiO1xufSkoTG9uZ1R5cGUgPSBleHBvcnRzLkxvbmdUeXBlIHx8IChleHBvcnRzLkxvbmdUeXBlID0ge30pKTtcbi8qKlxuICogUHJvdG9idWYgMi4xLjAgaW50cm9kdWNlZCBwYWNrZWQgcmVwZWF0ZWQgZmllbGRzLlxuICogU2V0dGluZyB0aGUgZmllbGQgb3B0aW9uIGBbcGFja2VkID0gdHJ1ZV1gIGVuYWJsZXMgcGFja2luZy5cbiAqXG4gKiBJbiBwcm90bzMsIGFsbCByZXBlYXRlZCBmaWVsZHMgYXJlIHBhY2tlZCBieSBkZWZhdWx0LlxuICogU2V0dGluZyB0aGUgZmllbGQgb3B0aW9uIGBbcGFja2VkID0gZmFsc2VdYCBkaXNhYmxlcyBwYWNraW5nLlxuICpcbiAqIFBhY2tlZCByZXBlYXRlZCBmaWVsZHMgYXJlIGVuY29kZWQgd2l0aCBhIHNpbmdsZSB0YWcsXG4gKiB0aGVuIGEgbGVuZ3RoLWRlbGltaXRlciwgdGhlbiB0aGUgZWxlbWVudCB2YWx1ZXMuXG4gKlxuICogVW5wYWNrZWQgcmVwZWF0ZWQgZmllbGRzIGFyZSBlbmNvZGVkIHdpdGggYSB0YWcgYW5kXG4gKiB2YWx1ZSBmb3IgZWFjaCBlbGVtZW50LlxuICpcbiAqIGBieXRlc2AgYW5kIGBzdHJpbmdgIGNhbm5vdCBiZSBwYWNrZWQuXG4gKi9cbnZhciBSZXBlYXRUeXBlO1xuKGZ1bmN0aW9uIChSZXBlYXRUeXBlKSB7XG4gICAgLyoqXG4gICAgICogVGhlIGZpZWxkIGlzIG5vdCByZXBlYXRlZC5cbiAgICAgKi9cbiAgICBSZXBlYXRUeXBlW1JlcGVhdFR5cGVbXCJOT1wiXSA9IDBdID0gXCJOT1wiO1xuICAgIC8qKlxuICAgICAqIFRoZSBmaWVsZCBpcyByZXBlYXRlZCBhbmQgc2hvdWxkIGJlIHBhY2tlZC5cbiAgICAgKiBJbnZhbGlkIGZvciBgYnl0ZXNgIGFuZCBgc3RyaW5nYCwgdGhleSBjYW5ub3QgYmUgcGFja2VkLlxuICAgICAqL1xuICAgIFJlcGVhdFR5cGVbUmVwZWF0VHlwZVtcIlBBQ0tFRFwiXSA9IDFdID0gXCJQQUNLRURcIjtcbiAgICAvKipcbiAgICAgKiBUaGUgZmllbGQgaXMgcmVwZWF0ZWQgYnV0IHNob3VsZCBub3QgYmUgcGFja2VkLlxuICAgICAqIFRoZSBvbmx5IHZhbGlkIHJlcGVhdCB0eXBlIGZvciByZXBlYXRlZCBgYnl0ZXNgIGFuZCBgc3RyaW5nYC5cbiAgICAgKi9cbiAgICBSZXBlYXRUeXBlW1JlcGVhdFR5cGVbXCJVTlBBQ0tFRFwiXSA9IDJdID0gXCJVTlBBQ0tFRFwiO1xufSkoUmVwZWF0VHlwZSA9IGV4cG9ydHMuUmVwZWF0VHlwZSB8fCAoZXhwb3J0cy5SZXBlYXRUeXBlID0ge30pKTtcbi8qKlxuICogVHVybnMgUGFydGlhbEZpZWxkSW5mbyBpbnRvIEZpZWxkSW5mby5cbiAqL1xuZnVuY3Rpb24gbm9ybWFsaXplRmllbGRJbmZvKGZpZWxkKSB7XG4gICAgdmFyIF9hLCBfYiwgX2MsIF9kO1xuICAgIGZpZWxkLmxvY2FsTmFtZSA9IChfYSA9IGZpZWxkLmxvY2FsTmFtZSkgIT09IG51bGwgJiYgX2EgIT09IHZvaWQgMCA/IF9hIDogbG93ZXJfY2FtZWxfY2FzZV8xLmxvd2VyQ2FtZWxDYXNlKGZpZWxkLm5hbWUpO1xuICAgIGZpZWxkLmpzb25OYW1lID0gKF9iID0gZmllbGQuanNvbk5hbWUpICE9PSBudWxsICYmIF9iICE9PSB2b2lkIDAgPyBfYiA6IGxvd2VyX2NhbWVsX2Nhc2VfMS5sb3dlckNhbWVsQ2FzZShmaWVsZC5uYW1lKTtcbiAgICBmaWVsZC5yZXBlYXQgPSAoX2MgPSBmaWVsZC5yZXBlYXQpICE9PSBudWxsICYmIF9jICE9PSB2b2lkIDAgPyBfYyA6IFJlcGVhdFR5cGUuTk87XG4gICAgZmllbGQub3B0ID0gKF9kID0gZmllbGQub3B0KSAhPT0gbnVsbCAmJiBfZCAhPT0gdm9pZCAwID8gX2QgOiAoZmllbGQucmVwZWF0ID8gZmFsc2UgOiBmaWVsZC5vbmVvZiA/IGZhbHNlIDogZmllbGQua2luZCA9PSBcIm1lc3NhZ2VcIik7XG4gICAgcmV0dXJuIGZpZWxkO1xufVxuZXhwb3J0cy5ub3JtYWxpemVGaWVsZEluZm8gPSBub3JtYWxpemVGaWVsZEluZm87XG4vKipcbiAqIFJlYWQgY3VzdG9tIGZpZWxkIG9wdGlvbnMgZnJvbSBhIGdlbmVyYXRlZCBtZXNzYWdlIHR5cGUuXG4gKlxuICogQGRlcHJlY2F0ZWQgdXNlIHJlYWRGaWVsZE9wdGlvbigpXG4gKi9cbmZ1bmN0aW9uIHJlYWRGaWVsZE9wdGlvbnMobWVzc2FnZVR5cGUsIGZpZWxkTmFtZSwgZXh0ZW5zaW9uTmFtZSwgZXh0ZW5zaW9uVHlwZSkge1xuICAgIHZhciBfYTtcbiAgICBjb25zdCBvcHRpb25zID0gKF9hID0gbWVzc2FnZVR5cGUuZmllbGRzLmZpbmQoKG0sIGkpID0+IG0ubG9jYWxOYW1lID09IGZpZWxkTmFtZSB8fCBpID09IGZpZWxkTmFtZSkpID09PSBudWxsIHx8IF9hID09PSB2b2lkIDAgPyB2b2lkIDAgOiBfYS5vcHRpb25zO1xuICAgIHJldHVybiBvcHRpb25zICYmIG9wdGlvbnNbZXh0ZW5zaW9uTmFtZV0gPyBleHRlbnNpb25UeXBlLmZyb21Kc29uKG9wdGlvbnNbZXh0ZW5zaW9uTmFtZV0pIDogdW5kZWZpbmVkO1xufVxuZXhwb3J0cy5yZWFkRmllbGRPcHRpb25zID0gcmVhZEZpZWxkT3B0aW9ucztcbmZ1bmN0aW9uIHJlYWRGaWVsZE9wdGlvbihtZXNzYWdlVHlwZSwgZmllbGROYW1lLCBleHRlbnNpb25OYW1lLCBleHRlbnNpb25UeXBlKSB7XG4gICAgdmFyIF9hO1xuICAgIGNvbnN0IG9wdGlvbnMgPSAoX2EgPSBtZXNzYWdlVHlwZS5maWVsZHMuZmluZCgobSwgaSkgPT4gbS5sb2NhbE5hbWUgPT0gZmllbGROYW1lIHx8IGkgPT0gZmllbGROYW1lKSkgPT09IG51bGwgfHwgX2EgPT09IHZvaWQgMCA/IHZvaWQgMCA6IF9hLm9wdGlvbnM7XG4gICAgaWYgKCFvcHRpb25zKSB7XG4gICAgICAgIHJldHVybiB1bmRlZmluZWQ7XG4gICAgfVxuICAgIGNvbnN0IG9wdGlvblZhbCA9IG9wdGlvbnNbZXh0ZW5zaW9uTmFtZV07XG4gICAgaWYgKG9wdGlvblZhbCA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgIHJldHVybiBvcHRpb25WYWw7XG4gICAgfVxuICAgIHJldHVybiBleHRlbnNpb25UeXBlID8gZXh0ZW5zaW9uVHlwZS5mcm9tSnNvbihvcHRpb25WYWwpIDogb3B0aW9uVmFsO1xufVxuZXhwb3J0cy5yZWFkRmllbGRPcHRpb24gPSByZWFkRmllbGRPcHRpb247XG5mdW5jdGlvbiByZWFkTWVzc2FnZU9wdGlvbihtZXNzYWdlVHlwZSwgZXh0ZW5zaW9uTmFtZSwgZXh0ZW5zaW9uVHlwZSkge1xuICAgIGNvbnN0IG9wdGlvbnMgPSBtZXNzYWdlVHlwZS5vcHRpb25zO1xuICAgIGNvbnN0IG9wdGlvblZhbCA9IG9wdGlvbnNbZXh0ZW5zaW9uTmFtZV07XG4gICAgaWYgKG9wdGlvblZhbCA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgIHJldHVybiBvcHRpb25WYWw7XG4gICAgfVxuICAgIHJldHVybiBleHRlbnNpb25UeXBlID8gZXh0ZW5zaW9uVHlwZS5mcm9tSnNvbihvcHRpb25WYWwpIDogb3B0aW9uVmFsO1xufVxuZXhwb3J0cy5yZWFkTWVzc2FnZU9wdGlvbiA9IHJlYWRNZXNzYWdlT3B0aW9uO1xuIiwKICAgICJcInVzZSBzdHJpY3RcIjtcbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIl9fZXNNb2R1bGVcIiwgeyB2YWx1ZTogdHJ1ZSB9KTtcbmV4cG9ydHMuZ2V0U2VsZWN0ZWRPbmVvZlZhbHVlID0gZXhwb3J0cy5jbGVhck9uZW9mVmFsdWUgPSBleHBvcnRzLnNldFVua25vd25PbmVvZlZhbHVlID0gZXhwb3J0cy5zZXRPbmVvZlZhbHVlID0gZXhwb3J0cy5nZXRPbmVvZlZhbHVlID0gZXhwb3J0cy5pc09uZW9mR3JvdXAgPSB2b2lkIDA7XG4vKipcbiAqIElzIHRoZSBnaXZlbiB2YWx1ZSBhIHZhbGlkIG9uZW9mIGdyb3VwP1xuICpcbiAqIFdlIHJlcHJlc2VudCBwcm90b2J1ZiBgb25lb2ZgIGFzIGFsZ2VicmFpYyBkYXRhIHR5cGVzIChBRFQpIGluIGdlbmVyYXRlZFxuICogY29kZS4gQnV0IHdoZW4gd29ya2luZyB3aXRoIG1lc3NhZ2VzIG9mIHVua25vd24gdHlwZSwgdGhlIEFEVCBkb2VzIG5vdFxuICogaGVscCB1cy5cbiAqXG4gKiBUaGlzIHR5cGUgZ3VhcmQgY2hlY2tzIGlmIHRoZSBnaXZlbiBvYmplY3QgYWRoZXJlcyB0byB0aGUgQURUIHJ1bGVzLCB3aGljaFxuICogYXJlIGFzIGZvbGxvd3M6XG4gKlxuICogMSkgTXVzdCBiZSBhbiBvYmplY3QuXG4gKlxuICogMikgTXVzdCBoYXZlIGEgXCJvbmVvZktpbmRcIiBkaXNjcmltaW5hdG9yIHByb3BlcnR5LlxuICpcbiAqIDMpIElmIFwib25lb2ZLaW5kXCIgaXMgYHVuZGVmaW5lZGAsIG5vIG1lbWJlciBmaWVsZCBpcyBzZWxlY3RlZC4gVGhlIG9iamVjdFxuICogbXVzdCBub3QgaGF2ZSBhbnkgb3RoZXIgcHJvcGVydGllcy5cbiAqXG4gKiA0KSBJZiBcIm9uZW9mS2luZFwiIGlzIGEgYHN0cmluZ2AsIHRoZSBtZW1iZXIgZmllbGQgd2l0aCB0aGlzIG5hbWUgaXNcbiAqIHNlbGVjdGVkLlxuICpcbiAqIDUpIElmIGEgbWVtYmVyIGZpZWxkIGlzIHNlbGVjdGVkLCB0aGUgb2JqZWN0IG11c3QgaGF2ZSBhIHNlY29uZCBwcm9wZXJ0eVxuICogd2l0aCB0aGlzIG5hbWUuIFRoZSBwcm9wZXJ0eSBtdXN0IG5vdCBiZSBgdW5kZWZpbmVkYC5cbiAqXG4gKiA2KSBObyBleHRyYSBwcm9wZXJ0aWVzIGFyZSBhbGxvd2VkLiBUaGUgb2JqZWN0IGhhcyBlaXRoZXIgb25lIHByb3BlcnR5XG4gKiAobm8gc2VsZWN0aW9uKSBvciB0d28gcHJvcGVydGllcyAoc2VsZWN0aW9uKS5cbiAqXG4gKi9cbmZ1bmN0aW9uIGlzT25lb2ZHcm91cChhbnkpIHtcbiAgICBpZiAodHlwZW9mIGFueSAhPSAnb2JqZWN0JyB8fCBhbnkgPT09IG51bGwgfHwgIWFueS5oYXNPd25Qcm9wZXJ0eSgnb25lb2ZLaW5kJykpIHtcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgICBzd2l0Y2ggKHR5cGVvZiBhbnkub25lb2ZLaW5kKSB7XG4gICAgICAgIGNhc2UgXCJzdHJpbmdcIjpcbiAgICAgICAgICAgIGlmIChhbnlbYW55Lm9uZW9mS2luZF0gPT09IHVuZGVmaW5lZClcbiAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgICAgICByZXR1cm4gT2JqZWN0LmtleXMoYW55KS5sZW5ndGggPT0gMjtcbiAgICAgICAgY2FzZSBcInVuZGVmaW5lZFwiOlxuICAgICAgICAgICAgcmV0dXJuIE9iamVjdC5rZXlzKGFueSkubGVuZ3RoID09IDE7XG4gICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxufVxuZXhwb3J0cy5pc09uZW9mR3JvdXAgPSBpc09uZW9mR3JvdXA7XG4vKipcbiAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSBnaXZlbiBmaWVsZCBpbiBhIG9uZW9mIGdyb3VwLlxuICovXG5mdW5jdGlvbiBnZXRPbmVvZlZhbHVlKG9uZW9mLCBraW5kKSB7XG4gICAgcmV0dXJuIG9uZW9mW2tpbmRdO1xufVxuZXhwb3J0cy5nZXRPbmVvZlZhbHVlID0gZ2V0T25lb2ZWYWx1ZTtcbmZ1bmN0aW9uIHNldE9uZW9mVmFsdWUob25lb2YsIGtpbmQsIHZhbHVlKSB7XG4gICAgaWYgKG9uZW9mLm9uZW9mS2luZCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgIGRlbGV0ZSBvbmVvZltvbmVvZi5vbmVvZktpbmRdO1xuICAgIH1cbiAgICBvbmVvZi5vbmVvZktpbmQgPSBraW5kO1xuICAgIGlmICh2YWx1ZSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgIG9uZW9mW2tpbmRdID0gdmFsdWU7XG4gICAgfVxufVxuZXhwb3J0cy5zZXRPbmVvZlZhbHVlID0gc2V0T25lb2ZWYWx1ZTtcbmZ1bmN0aW9uIHNldFVua25vd25PbmVvZlZhbHVlKG9uZW9mLCBraW5kLCB2YWx1ZSkge1xuICAgIGlmIChvbmVvZi5vbmVvZktpbmQgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICBkZWxldGUgb25lb2Zbb25lb2Yub25lb2ZLaW5kXTtcbiAgICB9XG4gICAgb25lb2Yub25lb2ZLaW5kID0ga2luZDtcbiAgICBpZiAodmFsdWUgIT09IHVuZGVmaW5lZCAmJiBraW5kICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgb25lb2Zba2luZF0gPSB2YWx1ZTtcbiAgICB9XG59XG5leHBvcnRzLnNldFVua25vd25PbmVvZlZhbHVlID0gc2V0VW5rbm93bk9uZW9mVmFsdWU7XG4vKipcbiAqIFJlbW92ZXMgdGhlIHNlbGVjdGVkIGZpZWxkIGluIGEgb25lb2YgZ3JvdXAuXG4gKlxuICogTm90ZSB0aGF0IHRoZSByZWNvbW1lbmRlZCB3YXkgdG8gbW9kaWZ5IGEgb25lb2YgZ3JvdXAgaXMgdG8gc2V0XG4gKiBhIG5ldyBvYmplY3Q6XG4gKlxuICogYGBgdHNcbiAqIG1lc3NhZ2UucmVzdWx0ID0geyBvbmVvZktpbmQ6IHVuZGVmaW5lZCB9O1xuICogYGBgXG4gKi9cbmZ1bmN0aW9uIGNsZWFyT25lb2ZWYWx1ZShvbmVvZikge1xuICAgIGlmIChvbmVvZi5vbmVvZktpbmQgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICBkZWxldGUgb25lb2Zbb25lb2Yub25lb2ZLaW5kXTtcbiAgICB9XG4gICAgb25lb2Yub25lb2ZLaW5kID0gdW5kZWZpbmVkO1xufVxuZXhwb3J0cy5jbGVhck9uZW9mVmFsdWUgPSBjbGVhck9uZW9mVmFsdWU7XG4vKipcbiAqIFJldHVybnMgdGhlIHNlbGVjdGVkIHZhbHVlIG9mIHRoZSBnaXZlbiBvbmVvZiBncm91cC5cbiAqXG4gKiBOb3QgdGhhdCB0aGUgcmVjb21tZW5kZWQgd2F5IHRvIGFjY2VzcyBhIG9uZW9mIGdyb3VwIGlzIHRvIGNoZWNrXG4gKiB0aGUgXCJvbmVvZktpbmRcIiBwcm9wZXJ0eSBhbmQgbGV0IFR5cGVTY3JpcHQgbmFycm93IGRvd24gdGhlIHVuaW9uXG4gKiB0eXBlIGZvciB5b3U6XG4gKlxuICogYGBgdHNcbiAqIGlmIChtZXNzYWdlLnJlc3VsdC5vbmVvZktpbmQgPT09IFwiZXJyb3JcIikge1xuICogICBtZXNzYWdlLnJlc3VsdC5lcnJvcjsgLy8gc3RyaW5nXG4gKiB9XG4gKiBgYGBcbiAqXG4gKiBJbiB0aGUgcmFyZSBjYXNlIHlvdSBqdXN0IG5lZWQgdGhlIHZhbHVlLCBhbmQgZG8gbm90IGNhcmUgYWJvdXRcbiAqIHdoaWNoIHByb3RvYnVmIGZpZWxkIGlzIHNlbGVjdGVkLCB5b3UgY2FuIHVzZSB0aGlzIGZ1bmN0aW9uXG4gKiBmb3IgY29udmVuaWVuY2UuXG4gKi9cbmZ1bmN0aW9uIGdldFNlbGVjdGVkT25lb2ZWYWx1ZShvbmVvZikge1xuICAgIGlmIChvbmVvZi5vbmVvZktpbmQgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICByZXR1cm4gdW5kZWZpbmVkO1xuICAgIH1cbiAgICByZXR1cm4gb25lb2Zbb25lb2Yub25lb2ZLaW5kXTtcbn1cbmV4cG9ydHMuZ2V0U2VsZWN0ZWRPbmVvZlZhbHVlID0gZ2V0U2VsZWN0ZWRPbmVvZlZhbHVlO1xuIiwKICAgICJcInVzZSBzdHJpY3RcIjtcbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIl9fZXNNb2R1bGVcIiwgeyB2YWx1ZTogdHJ1ZSB9KTtcbmV4cG9ydHMuUmVmbGVjdGlvblR5cGVDaGVjayA9IHZvaWQgMDtcbmNvbnN0IHJlZmxlY3Rpb25faW5mb18xID0gcmVxdWlyZShcIi4vcmVmbGVjdGlvbi1pbmZvXCIpO1xuY29uc3Qgb25lb2ZfMSA9IHJlcXVpcmUoXCIuL29uZW9mXCIpO1xuLy8gbm9pbnNwZWN0aW9uIEpTTWV0aG9kQ2FuQmVTdGF0aWNcbmNsYXNzIFJlZmxlY3Rpb25UeXBlQ2hlY2sge1xuICAgIGNvbnN0cnVjdG9yKGluZm8pIHtcbiAgICAgICAgdmFyIF9hO1xuICAgICAgICB0aGlzLmZpZWxkcyA9IChfYSA9IGluZm8uZmllbGRzKSAhPT0gbnVsbCAmJiBfYSAhPT0gdm9pZCAwID8gX2EgOiBbXTtcbiAgICB9XG4gICAgcHJlcGFyZSgpIHtcbiAgICAgICAgaWYgKHRoaXMuZGF0YSlcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgY29uc3QgcmVxID0gW10sIGtub3duID0gW10sIG9uZW9mcyA9IFtdO1xuICAgICAgICBmb3IgKGxldCBmaWVsZCBvZiB0aGlzLmZpZWxkcykge1xuICAgICAgICAgICAgaWYgKGZpZWxkLm9uZW9mKSB7XG4gICAgICAgICAgICAgICAgaWYgKCFvbmVvZnMuaW5jbHVkZXMoZmllbGQub25lb2YpKSB7XG4gICAgICAgICAgICAgICAgICAgIG9uZW9mcy5wdXNoKGZpZWxkLm9uZW9mKTtcbiAgICAgICAgICAgICAgICAgICAgcmVxLnB1c2goZmllbGQub25lb2YpO1xuICAgICAgICAgICAgICAgICAgICBrbm93bi5wdXNoKGZpZWxkLm9uZW9mKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICBrbm93bi5wdXNoKGZpZWxkLmxvY2FsTmFtZSk7XG4gICAgICAgICAgICAgICAgc3dpdGNoIChmaWVsZC5raW5kKSB7XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgXCJzY2FsYXJcIjpcbiAgICAgICAgICAgICAgICAgICAgY2FzZSBcImVudW1cIjpcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmICghZmllbGQub3B0IHx8IGZpZWxkLnJlcGVhdClcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXEucHVzaChmaWVsZC5sb2NhbE5hbWUpO1xuICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgXCJtZXNzYWdlXCI6XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoZmllbGQucmVwZWF0KVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlcS5wdXNoKGZpZWxkLmxvY2FsTmFtZSk7XG4gICAgICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICAgICAgY2FzZSBcIm1hcFwiOlxuICAgICAgICAgICAgICAgICAgICAgICAgcmVxLnB1c2goZmllbGQubG9jYWxOYW1lKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICB0aGlzLmRhdGEgPSB7IHJlcSwga25vd24sIG9uZW9mczogT2JqZWN0LnZhbHVlcyhvbmVvZnMpIH07XG4gICAgfVxuICAgIC8qKlxuICAgICAqIElzIHRoZSBhcmd1bWVudCBhIHZhbGlkIG1lc3NhZ2UgYXMgc3BlY2lmaWVkIGJ5IHRoZVxuICAgICAqIHJlZmxlY3Rpb24gaW5mb3JtYXRpb24/XG4gICAgICpcbiAgICAgKiBDaGVja3MgYWxsIGZpZWxkIHR5cGVzIHJlY3Vyc2l2ZWx5LiBUaGUgYGRlcHRoYFxuICAgICAqIHNwZWNpZmllcyBob3cgZGVlcCBpbnRvIHRoZSBzdHJ1Y3R1cmUgdGhlIGNoZWNrIHdpbGwgYmUuXG4gICAgICpcbiAgICAgKiBXaXRoIGEgZGVwdGggb2YgMCwgb25seSB0aGUgcHJlc2VuY2Ugb2YgZmllbGRzXG4gICAgICogaXMgY2hlY2tlZC5cbiAgICAgKlxuICAgICAqIFdpdGggYSBkZXB0aCBvZiAxIG9yIG1vcmUsIHRoZSBmaWVsZCB0eXBlcyBhcmUgY2hlY2tlZC5cbiAgICAgKlxuICAgICAqIFdpdGggYSBkZXB0aCBvZiAyIG9yIG1vcmUsIHRoZSBtZW1iZXJzIG9mIG1hcCwgcmVwZWF0ZWRcbiAgICAgKiBhbmQgbWVzc2FnZSBmaWVsZHMgYXJlIGNoZWNrZWQuXG4gICAgICpcbiAgICAgKiBNZXNzYWdlIGZpZWxkcyB3aWxsIGJlIGNoZWNrZWQgcmVjdXJzaXZlbHkgd2l0aCBkZXB0aCAtIDEuXG4gICAgICpcbiAgICAgKiBUaGUgbnVtYmVyIG9mIG1hcCBlbnRyaWVzIC8gcmVwZWF0ZWQgdmFsdWVzIGJlaW5nIGNoZWNrZWRcbiAgICAgKiBpcyA8IGRlcHRoLlxuICAgICAqL1xuICAgIGlzKG1lc3NhZ2UsIGRlcHRoLCBhbGxvd0V4Y2Vzc1Byb3BlcnRpZXMgPSBmYWxzZSkge1xuICAgICAgICBpZiAoZGVwdGggPCAwKVxuICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgIGlmIChtZXNzYWdlID09PSBudWxsIHx8IG1lc3NhZ2UgPT09IHVuZGVmaW5lZCB8fCB0eXBlb2YgbWVzc2FnZSAhPSAnb2JqZWN0JylcbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgdGhpcy5wcmVwYXJlKCk7XG4gICAgICAgIGxldCBrZXlzID0gT2JqZWN0LmtleXMobWVzc2FnZSksIGRhdGEgPSB0aGlzLmRhdGE7XG4gICAgICAgIC8vIGlmIGEgcmVxdWlyZWQgZmllbGQgaXMgbWlzc2luZyBpbiBhcmcsIHRoaXMgY2Fubm90IGJlIGEgVFxuICAgICAgICBpZiAoa2V5cy5sZW5ndGggPCBkYXRhLnJlcS5sZW5ndGggfHwgZGF0YS5yZXEuc29tZShuID0+ICFrZXlzLmluY2x1ZGVzKG4pKSlcbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgaWYgKCFhbGxvd0V4Y2Vzc1Byb3BlcnRpZXMpIHtcbiAgICAgICAgICAgIC8vIGlmIHRoZSBhcmcgY29udGFpbnMgYSBrZXkgd2UgZG9udCBrbm93LCB0aGlzIGlzIG5vdCBhIGxpdGVyYWwgVFxuICAgICAgICAgICAgaWYgKGtleXMuc29tZShrID0+ICFkYXRhLmtub3duLmluY2x1ZGVzKGspKSlcbiAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgIH1cbiAgICAgICAgLy8gXCJXaXRoIGEgZGVwdGggb2YgMCwgb25seSB0aGUgcHJlc2VuY2UgYW5kIGFic2VuY2Ugb2YgZmllbGRzIGlzIGNoZWNrZWQuXCJcbiAgICAgICAgLy8gXCJXaXRoIGEgZGVwdGggb2YgMSBvciBtb3JlLCB0aGUgZmllbGQgdHlwZXMgYXJlIGNoZWNrZWQuXCJcbiAgICAgICAgaWYgKGRlcHRoIDwgMSkge1xuICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgIH1cbiAgICAgICAgLy8gY2hlY2sgb25lb2YgZ3JvdXBcbiAgICAgICAgZm9yIChjb25zdCBuYW1lIG9mIGRhdGEub25lb2ZzKSB7XG4gICAgICAgICAgICBjb25zdCBncm91cCA9IG1lc3NhZ2VbbmFtZV07XG4gICAgICAgICAgICBpZiAoIW9uZW9mXzEuaXNPbmVvZkdyb3VwKGdyb3VwKSlcbiAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgICAgICBpZiAoZ3JvdXAub25lb2ZLaW5kID09PSB1bmRlZmluZWQpXG4gICAgICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgICBjb25zdCBmaWVsZCA9IHRoaXMuZmllbGRzLmZpbmQoZiA9PiBmLmxvY2FsTmFtZSA9PT0gZ3JvdXAub25lb2ZLaW5kKTtcbiAgICAgICAgICAgIGlmICghZmllbGQpXG4gICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOyAvLyB3ZSBmb3VuZCBubyBmaWVsZCwgYnV0IGhhdmUgYSBraW5kLCBzb21ldGhpbmcgaXMgd3JvbmdcbiAgICAgICAgICAgIGlmICghdGhpcy5maWVsZChncm91cFtncm91cC5vbmVvZktpbmRdLCBmaWVsZCwgYWxsb3dFeGNlc3NQcm9wZXJ0aWVzLCBkZXB0aCkpXG4gICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICB9XG4gICAgICAgIC8vIGNoZWNrIHR5cGVzXG4gICAgICAgIGZvciAoY29uc3QgZmllbGQgb2YgdGhpcy5maWVsZHMpIHtcbiAgICAgICAgICAgIGlmIChmaWVsZC5vbmVvZiAhPT0gdW5kZWZpbmVkKVxuICAgICAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgICAgaWYgKCF0aGlzLmZpZWxkKG1lc3NhZ2VbZmllbGQubG9jYWxOYW1lXSwgZmllbGQsIGFsbG93RXhjZXNzUHJvcGVydGllcywgZGVwdGgpKVxuICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG4gICAgZmllbGQoYXJnLCBmaWVsZCwgYWxsb3dFeGNlc3NQcm9wZXJ0aWVzLCBkZXB0aCkge1xuICAgICAgICBsZXQgcmVwZWF0ZWQgPSBmaWVsZC5yZXBlYXQ7XG4gICAgICAgIHN3aXRjaCAoZmllbGQua2luZCkge1xuICAgICAgICAgICAgY2FzZSBcInNjYWxhclwiOlxuICAgICAgICAgICAgICAgIGlmIChhcmcgPT09IHVuZGVmaW5lZClcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZpZWxkLm9wdDtcbiAgICAgICAgICAgICAgICBpZiAocmVwZWF0ZWQpXG4gICAgICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLnNjYWxhcnMoYXJnLCBmaWVsZC5ULCBkZXB0aCwgZmllbGQuTCk7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuc2NhbGFyKGFyZywgZmllbGQuVCwgZmllbGQuTCk7XG4gICAgICAgICAgICBjYXNlIFwiZW51bVwiOlxuICAgICAgICAgICAgICAgIGlmIChhcmcgPT09IHVuZGVmaW5lZClcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZpZWxkLm9wdDtcbiAgICAgICAgICAgICAgICBpZiAocmVwZWF0ZWQpXG4gICAgICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLnNjYWxhcnMoYXJnLCByZWZsZWN0aW9uX2luZm9fMS5TY2FsYXJUeXBlLklOVDMyLCBkZXB0aCk7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuc2NhbGFyKGFyZywgcmVmbGVjdGlvbl9pbmZvXzEuU2NhbGFyVHlwZS5JTlQzMik7XG4gICAgICAgICAgICBjYXNlIFwibWVzc2FnZVwiOlxuICAgICAgICAgICAgICAgIGlmIChhcmcgPT09IHVuZGVmaW5lZClcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgICAgICAgICAgaWYgKHJlcGVhdGVkKVxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5tZXNzYWdlcyhhcmcsIGZpZWxkLlQoKSwgYWxsb3dFeGNlc3NQcm9wZXJ0aWVzLCBkZXB0aCk7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMubWVzc2FnZShhcmcsIGZpZWxkLlQoKSwgYWxsb3dFeGNlc3NQcm9wZXJ0aWVzLCBkZXB0aCk7XG4gICAgICAgICAgICBjYXNlIFwibWFwXCI6XG4gICAgICAgICAgICAgICAgaWYgKHR5cGVvZiBhcmcgIT0gJ29iamVjdCcgfHwgYXJnID09PSBudWxsKVxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgICAgICAgICAgaWYgKGRlcHRoIDwgMilcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgICAgICAgICAgaWYgKCF0aGlzLm1hcEtleXMoYXJnLCBmaWVsZC5LLCBkZXB0aCkpXG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgICAgICAgICBzd2l0Y2ggKGZpZWxkLlYua2luZCkge1xuICAgICAgICAgICAgICAgICAgICBjYXNlIFwic2NhbGFyXCI6XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5zY2FsYXJzKE9iamVjdC52YWx1ZXMoYXJnKSwgZmllbGQuVi5ULCBkZXB0aCwgZmllbGQuVi5MKTtcbiAgICAgICAgICAgICAgICAgICAgY2FzZSBcImVudW1cIjpcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLnNjYWxhcnMoT2JqZWN0LnZhbHVlcyhhcmcpLCByZWZsZWN0aW9uX2luZm9fMS5TY2FsYXJUeXBlLklOVDMyLCBkZXB0aCk7XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgXCJtZXNzYWdlXCI6XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5tZXNzYWdlcyhPYmplY3QudmFsdWVzKGFyZyksIGZpZWxkLlYuVCgpLCBhbGxvd0V4Y2Vzc1Byb3BlcnRpZXMsIGRlcHRoKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuICAgIG1lc3NhZ2UoYXJnLCB0eXBlLCBhbGxvd0V4Y2Vzc1Byb3BlcnRpZXMsIGRlcHRoKSB7XG4gICAgICAgIGlmIChhbGxvd0V4Y2Vzc1Byb3BlcnRpZXMpIHtcbiAgICAgICAgICAgIHJldHVybiB0eXBlLmlzQXNzaWduYWJsZShhcmcsIGRlcHRoKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gdHlwZS5pcyhhcmcsIGRlcHRoKTtcbiAgICB9XG4gICAgbWVzc2FnZXMoYXJnLCB0eXBlLCBhbGxvd0V4Y2Vzc1Byb3BlcnRpZXMsIGRlcHRoKSB7XG4gICAgICAgIGlmICghQXJyYXkuaXNBcnJheShhcmcpKVxuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICBpZiAoZGVwdGggPCAyKVxuICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgIGlmIChhbGxvd0V4Y2Vzc1Byb3BlcnRpZXMpIHtcbiAgICAgICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgYXJnLmxlbmd0aCAmJiBpIDwgZGVwdGg7IGkrKylcbiAgICAgICAgICAgICAgICBpZiAoIXR5cGUuaXNBc3NpZ25hYmxlKGFyZ1tpXSwgZGVwdGggLSAxKSlcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBhcmcubGVuZ3RoICYmIGkgPCBkZXB0aDsgaSsrKVxuICAgICAgICAgICAgICAgIGlmICghdHlwZS5pcyhhcmdbaV0sIGRlcHRoIC0gMSkpXG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG4gICAgc2NhbGFyKGFyZywgdHlwZSwgbG9uZ1R5cGUpIHtcbiAgICAgICAgbGV0IGFyZ1R5cGUgPSB0eXBlb2YgYXJnO1xuICAgICAgICBzd2l0Y2ggKHR5cGUpIHtcbiAgICAgICAgICAgIGNhc2UgcmVmbGVjdGlvbl9pbmZvXzEuU2NhbGFyVHlwZS5VSU5UNjQ6XG4gICAgICAgICAgICBjYXNlIHJlZmxlY3Rpb25faW5mb18xLlNjYWxhclR5cGUuRklYRUQ2NDpcbiAgICAgICAgICAgIGNhc2UgcmVmbGVjdGlvbl9pbmZvXzEuU2NhbGFyVHlwZS5JTlQ2NDpcbiAgICAgICAgICAgIGNhc2UgcmVmbGVjdGlvbl9pbmZvXzEuU2NhbGFyVHlwZS5TRklYRUQ2NDpcbiAgICAgICAgICAgIGNhc2UgcmVmbGVjdGlvbl9pbmZvXzEuU2NhbGFyVHlwZS5TSU5UNjQ6XG4gICAgICAgICAgICAgICAgc3dpdGNoIChsb25nVHlwZSkge1xuICAgICAgICAgICAgICAgICAgICBjYXNlIHJlZmxlY3Rpb25faW5mb18xLkxvbmdUeXBlLkJJR0lOVDpcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBhcmdUeXBlID09IFwiYmlnaW50XCI7XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgcmVmbGVjdGlvbl9pbmZvXzEuTG9uZ1R5cGUuTlVNQkVSOlxuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGFyZ1R5cGUgPT0gXCJudW1iZXJcIiAmJiAhaXNOYU4oYXJnKTtcbiAgICAgICAgICAgICAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBhcmdUeXBlID09IFwic3RyaW5nXCI7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgY2FzZSByZWZsZWN0aW9uX2luZm9fMS5TY2FsYXJUeXBlLkJPT0w6XG4gICAgICAgICAgICAgICAgcmV0dXJuIGFyZ1R5cGUgPT0gJ2Jvb2xlYW4nO1xuICAgICAgICAgICAgY2FzZSByZWZsZWN0aW9uX2luZm9fMS5TY2FsYXJUeXBlLlNUUklORzpcbiAgICAgICAgICAgICAgICByZXR1cm4gYXJnVHlwZSA9PSAnc3RyaW5nJztcbiAgICAgICAgICAgIGNhc2UgcmVmbGVjdGlvbl9pbmZvXzEuU2NhbGFyVHlwZS5CWVRFUzpcbiAgICAgICAgICAgICAgICByZXR1cm4gYXJnIGluc3RhbmNlb2YgVWludDhBcnJheTtcbiAgICAgICAgICAgIGNhc2UgcmVmbGVjdGlvbl9pbmZvXzEuU2NhbGFyVHlwZS5ET1VCTEU6XG4gICAgICAgICAgICBjYXNlIHJlZmxlY3Rpb25faW5mb18xLlNjYWxhclR5cGUuRkxPQVQ6XG4gICAgICAgICAgICAgICAgcmV0dXJuIGFyZ1R5cGUgPT0gJ251bWJlcicgJiYgIWlzTmFOKGFyZyk7XG4gICAgICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgICAgICAgIC8vIGNhc2UgU2NhbGFyVHlwZS5VSU5UMzI6XG4gICAgICAgICAgICAgICAgLy8gY2FzZSBTY2FsYXJUeXBlLkZJWEVEMzI6XG4gICAgICAgICAgICAgICAgLy8gY2FzZSBTY2FsYXJUeXBlLklOVDMyOlxuICAgICAgICAgICAgICAgIC8vIGNhc2UgU2NhbGFyVHlwZS5TSU5UMzI6XG4gICAgICAgICAgICAgICAgLy8gY2FzZSBTY2FsYXJUeXBlLlNGSVhFRDMyOlxuICAgICAgICAgICAgICAgIHJldHVybiBhcmdUeXBlID09ICdudW1iZXInICYmIE51bWJlci5pc0ludGVnZXIoYXJnKTtcbiAgICAgICAgfVxuICAgIH1cbiAgICBzY2FsYXJzKGFyZywgdHlwZSwgZGVwdGgsIGxvbmdUeXBlKSB7XG4gICAgICAgIGlmICghQXJyYXkuaXNBcnJheShhcmcpKVxuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICBpZiAoZGVwdGggPCAyKVxuICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgIGlmIChBcnJheS5pc0FycmF5KGFyZykpXG4gICAgICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IGFyZy5sZW5ndGggJiYgaSA8IGRlcHRoOyBpKyspXG4gICAgICAgICAgICAgICAgaWYgKCF0aGlzLnNjYWxhcihhcmdbaV0sIHR5cGUsIGxvbmdUeXBlKSlcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG4gICAgbWFwS2V5cyhtYXAsIHR5cGUsIGRlcHRoKSB7XG4gICAgICAgIGxldCBrZXlzID0gT2JqZWN0LmtleXMobWFwKTtcbiAgICAgICAgc3dpdGNoICh0eXBlKSB7XG4gICAgICAgICAgICBjYXNlIHJlZmxlY3Rpb25faW5mb18xLlNjYWxhclR5cGUuSU5UMzI6XG4gICAgICAgICAgICBjYXNlIHJlZmxlY3Rpb25faW5mb18xLlNjYWxhclR5cGUuRklYRUQzMjpcbiAgICAgICAgICAgIGNhc2UgcmVmbGVjdGlvbl9pbmZvXzEuU2NhbGFyVHlwZS5TRklYRUQzMjpcbiAgICAgICAgICAgIGNhc2UgcmVmbGVjdGlvbl9pbmZvXzEuU2NhbGFyVHlwZS5TSU5UMzI6XG4gICAgICAgICAgICBjYXNlIHJlZmxlY3Rpb25faW5mb18xLlNjYWxhclR5cGUuVUlOVDMyOlxuICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLnNjYWxhcnMoa2V5cy5zbGljZSgwLCBkZXB0aCkubWFwKGsgPT4gcGFyc2VJbnQoaykpLCB0eXBlLCBkZXB0aCk7XG4gICAgICAgICAgICBjYXNlIHJlZmxlY3Rpb25faW5mb18xLlNjYWxhclR5cGUuQk9PTDpcbiAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5zY2FsYXJzKGtleXMuc2xpY2UoMCwgZGVwdGgpLm1hcChrID0+IGsgPT0gJ3RydWUnID8gdHJ1ZSA6IGsgPT0gJ2ZhbHNlJyA/IGZhbHNlIDogayksIHR5cGUsIGRlcHRoKTtcbiAgICAgICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuc2NhbGFycyhrZXlzLCB0eXBlLCBkZXB0aCwgcmVmbGVjdGlvbl9pbmZvXzEuTG9uZ1R5cGUuU1RSSU5HKTtcbiAgICAgICAgfVxuICAgIH1cbn1cbmV4cG9ydHMuUmVmbGVjdGlvblR5cGVDaGVjayA9IFJlZmxlY3Rpb25UeXBlQ2hlY2s7XG4iLAogICAgIlwidXNlIHN0cmljdFwiO1xuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiX19lc01vZHVsZVwiLCB7IHZhbHVlOiB0cnVlIH0pO1xuZXhwb3J0cy5yZWZsZWN0aW9uTG9uZ0NvbnZlcnQgPSB2b2lkIDA7XG5jb25zdCByZWZsZWN0aW9uX2luZm9fMSA9IHJlcXVpcmUoXCIuL3JlZmxlY3Rpb24taW5mb1wiKTtcbi8qKlxuICogVXRpbGl0eSBtZXRob2QgdG8gY29udmVydCBhIFBiTG9uZyBvciBQYlVsb25nIHRvIGEgSmF2YVNjcmlwdFxuICogcmVwcmVzZW50YXRpb24gZHVyaW5nIHJ1bnRpbWUuXG4gKlxuICogV29ya3Mgd2l0aCBnZW5lcmF0ZWQgZmllbGQgaW5mb3JtYXRpb24sIGB1bmRlZmluZWRgIGlzIGVxdWl2YWxlbnRcbiAqIHRvIGBTVFJJTkdgLlxuICovXG5mdW5jdGlvbiByZWZsZWN0aW9uTG9uZ0NvbnZlcnQobG9uZywgdHlwZSkge1xuICAgIHN3aXRjaCAodHlwZSkge1xuICAgICAgICBjYXNlIHJlZmxlY3Rpb25faW5mb18xLkxvbmdUeXBlLkJJR0lOVDpcbiAgICAgICAgICAgIHJldHVybiBsb25nLnRvQmlnSW50KCk7XG4gICAgICAgIGNhc2UgcmVmbGVjdGlvbl9pbmZvXzEuTG9uZ1R5cGUuTlVNQkVSOlxuICAgICAgICAgICAgcmV0dXJuIGxvbmcudG9OdW1iZXIoKTtcbiAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICAgIC8vIGNhc2UgdW5kZWZpbmVkOlxuICAgICAgICAgICAgLy8gY2FzZSBMb25nVHlwZS5TVFJJTkc6XG4gICAgICAgICAgICByZXR1cm4gbG9uZy50b1N0cmluZygpO1xuICAgIH1cbn1cbmV4cG9ydHMucmVmbGVjdGlvbkxvbmdDb252ZXJ0ID0gcmVmbGVjdGlvbkxvbmdDb252ZXJ0O1xuIiwKICAgICJcInVzZSBzdHJpY3RcIjtcbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIl9fZXNNb2R1bGVcIiwgeyB2YWx1ZTogdHJ1ZSB9KTtcbmV4cG9ydHMuUmVmbGVjdGlvbkpzb25SZWFkZXIgPSB2b2lkIDA7XG5jb25zdCBqc29uX3R5cGluZ3NfMSA9IHJlcXVpcmUoXCIuL2pzb24tdHlwaW5nc1wiKTtcbmNvbnN0IGJhc2U2NF8xID0gcmVxdWlyZShcIi4vYmFzZTY0XCIpO1xuY29uc3QgcmVmbGVjdGlvbl9pbmZvXzEgPSByZXF1aXJlKFwiLi9yZWZsZWN0aW9uLWluZm9cIik7XG5jb25zdCBwYl9sb25nXzEgPSByZXF1aXJlKFwiLi9wYi1sb25nXCIpO1xuY29uc3QgYXNzZXJ0XzEgPSByZXF1aXJlKFwiLi9hc3NlcnRcIik7XG5jb25zdCByZWZsZWN0aW9uX2xvbmdfY29udmVydF8xID0gcmVxdWlyZShcIi4vcmVmbGVjdGlvbi1sb25nLWNvbnZlcnRcIik7XG4vKipcbiAqIFJlYWRzIHByb3RvMyBtZXNzYWdlcyBpbiBjYW5vbmljYWwgSlNPTiBmb3JtYXQgdXNpbmcgcmVmbGVjdGlvbiBpbmZvcm1hdGlvbi5cbiAqXG4gKiBodHRwczovL2RldmVsb3BlcnMuZ29vZ2xlLmNvbS9wcm90b2NvbC1idWZmZXJzL2RvY3MvcHJvdG8zI2pzb25cbiAqL1xuY2xhc3MgUmVmbGVjdGlvbkpzb25SZWFkZXIge1xuICAgIGNvbnN0cnVjdG9yKGluZm8pIHtcbiAgICAgICAgdGhpcy5pbmZvID0gaW5mbztcbiAgICB9XG4gICAgcHJlcGFyZSgpIHtcbiAgICAgICAgdmFyIF9hO1xuICAgICAgICBpZiAodGhpcy5mTWFwID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgIHRoaXMuZk1hcCA9IHt9O1xuICAgICAgICAgICAgY29uc3QgZmllbGRzSW5wdXQgPSAoX2EgPSB0aGlzLmluZm8uZmllbGRzKSAhPT0gbnVsbCAmJiBfYSAhPT0gdm9pZCAwID8gX2EgOiBbXTtcbiAgICAgICAgICAgIGZvciAoY29uc3QgZmllbGQgb2YgZmllbGRzSW5wdXQpIHtcbiAgICAgICAgICAgICAgICB0aGlzLmZNYXBbZmllbGQubmFtZV0gPSBmaWVsZDtcbiAgICAgICAgICAgICAgICB0aGlzLmZNYXBbZmllbGQuanNvbk5hbWVdID0gZmllbGQ7XG4gICAgICAgICAgICAgICAgdGhpcy5mTWFwW2ZpZWxkLmxvY2FsTmFtZV0gPSBmaWVsZDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cbiAgICAvLyBDYW5ub3QgcGFyc2UgSlNPTiA8dHlwZSBvZiBqc29uVmFsdWU+IGZvciA8dHlwZSBuYW1lPiM8ZmllbGROYW1lPi5cbiAgICBhc3NlcnQoY29uZGl0aW9uLCBmaWVsZE5hbWUsIGpzb25WYWx1ZSkge1xuICAgICAgICBpZiAoIWNvbmRpdGlvbikge1xuICAgICAgICAgICAgbGV0IHdoYXQgPSBqc29uX3R5cGluZ3NfMS50eXBlb2ZKc29uVmFsdWUoanNvblZhbHVlKTtcbiAgICAgICAgICAgIGlmICh3aGF0ID09IFwibnVtYmVyXCIgfHwgd2hhdCA9PSBcImJvb2xlYW5cIilcbiAgICAgICAgICAgICAgICB3aGF0ID0ganNvblZhbHVlLnRvU3RyaW5nKCk7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYENhbm5vdCBwYXJzZSBKU09OICR7d2hhdH0gZm9yICR7dGhpcy5pbmZvLnR5cGVOYW1lfSMke2ZpZWxkTmFtZX1gKTtcbiAgICAgICAgfVxuICAgIH1cbiAgICAvKipcbiAgICAgKiBSZWFkcyBhIG1lc3NhZ2UgZnJvbSBjYW5vbmljYWwgSlNPTiBmb3JtYXQgaW50byB0aGUgdGFyZ2V0IG1lc3NhZ2UuXG4gICAgICpcbiAgICAgKiBSZXBlYXRlZCBmaWVsZHMgYXJlIGFwcGVuZGVkLiBNYXAgZW50cmllcyBhcmUgYWRkZWQsIG92ZXJ3cml0aW5nXG4gICAgICogZXhpc3Rpbmcga2V5cy5cbiAgICAgKlxuICAgICAqIElmIGEgbWVzc2FnZSBmaWVsZCBpcyBhbHJlYWR5IHByZXNlbnQsIGl0IHdpbGwgYmUgbWVyZ2VkIHdpdGggdGhlXG4gICAgICogbmV3IGRhdGEuXG4gICAgICovXG4gICAgcmVhZChpbnB1dCwgbWVzc2FnZSwgb3B0aW9ucykge1xuICAgICAgICB0aGlzLnByZXBhcmUoKTtcbiAgICAgICAgY29uc3Qgb25lb2ZzSGFuZGxlZCA9IFtdO1xuICAgICAgICBmb3IgKGNvbnN0IFtqc29uS2V5LCBqc29uVmFsdWVdIG9mIE9iamVjdC5lbnRyaWVzKGlucHV0KSkge1xuICAgICAgICAgICAgY29uc3QgZmllbGQgPSB0aGlzLmZNYXBbanNvbktleV07XG4gICAgICAgICAgICBpZiAoIWZpZWxkKSB7XG4gICAgICAgICAgICAgICAgaWYgKCFvcHRpb25zLmlnbm9yZVVua25vd25GaWVsZHMpXG4gICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihgRm91bmQgdW5rbm93biBmaWVsZCB3aGlsZSByZWFkaW5nICR7dGhpcy5pbmZvLnR5cGVOYW1lfSBmcm9tIEpTT04gZm9ybWF0LiBKU09OIGtleTogJHtqc29uS2V5fWApO1xuICAgICAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgY29uc3QgbG9jYWxOYW1lID0gZmllbGQubG9jYWxOYW1lO1xuICAgICAgICAgICAgLy8gaGFuZGxlIG9uZW9mIEFEVFxuICAgICAgICAgICAgbGV0IHRhcmdldDsgLy8gdGhpcyB3aWxsIGJlIHRoZSB0YXJnZXQgZm9yIHRoZSBmaWVsZCB2YWx1ZSwgd2hldGhlciBpdCBpcyBtZW1iZXIgb2YgYSBvbmVvZiBvciBub3RcbiAgICAgICAgICAgIGlmIChmaWVsZC5vbmVvZikge1xuICAgICAgICAgICAgICAgIGlmIChqc29uVmFsdWUgPT09IG51bGwgJiYgKGZpZWxkLmtpbmQgIT09ICdlbnVtJyB8fCBmaWVsZC5UKClbMF0gIT09ICdnb29nbGUucHJvdG9idWYuTnVsbFZhbHVlJykpIHtcbiAgICAgICAgICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIC8vIHNpbmNlIGpzb24gb2JqZWN0cyBhcmUgdW5vcmRlcmVkIGJ5IHNwZWNpZmljYXRpb24sIGl0IGlzIG5vdCBwb3NzaWJsZSB0byB0YWtlIHRoZSBsYXN0IG9mIG11bHRpcGxlIG9uZW9mc1xuICAgICAgICAgICAgICAgIGlmIChvbmVvZnNIYW5kbGVkLmluY2x1ZGVzKGZpZWxkLm9uZW9mKSlcbiAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBNdWx0aXBsZSBtZW1iZXJzIG9mIHRoZSBvbmVvZiBncm91cCBcIiR7ZmllbGQub25lb2Z9XCIgb2YgJHt0aGlzLmluZm8udHlwZU5hbWV9IGFyZSBwcmVzZW50IGluIEpTT04uYCk7XG4gICAgICAgICAgICAgICAgb25lb2ZzSGFuZGxlZC5wdXNoKGZpZWxkLm9uZW9mKTtcbiAgICAgICAgICAgICAgICB0YXJnZXQgPSBtZXNzYWdlW2ZpZWxkLm9uZW9mXSA9IHtcbiAgICAgICAgICAgICAgICAgICAgb25lb2ZLaW5kOiBsb2NhbE5hbWVcbiAgICAgICAgICAgICAgICB9O1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgdGFyZ2V0ID0gbWVzc2FnZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIC8vIHdlIGhhdmUgaGFuZGxlZCBvbmVvZiBhYm92ZS4gd2UganVzdCBoYXZlIHJlYWQgdGhlIHZhbHVlIGludG8gYHRhcmdldGAuXG4gICAgICAgICAgICBpZiAoZmllbGQua2luZCA9PSAnbWFwJykge1xuICAgICAgICAgICAgICAgIGlmIChqc29uVmFsdWUgPT09IG51bGwpIHtcbiAgICAgICAgICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIC8vIGNoZWNrIGlucHV0XG4gICAgICAgICAgICAgICAgdGhpcy5hc3NlcnQoanNvbl90eXBpbmdzXzEuaXNKc29uT2JqZWN0KGpzb25WYWx1ZSksIGZpZWxkLm5hbWUsIGpzb25WYWx1ZSk7XG4gICAgICAgICAgICAgICAgLy8gb3VyIHRhcmdldCB0byBwdXQgbWFwIGVudHJpZXMgaW50b1xuICAgICAgICAgICAgICAgIGNvbnN0IGZpZWxkT2JqID0gdGFyZ2V0W2xvY2FsTmFtZV07XG4gICAgICAgICAgICAgICAgLy8gcmVhZCBlbnRyaWVzXG4gICAgICAgICAgICAgICAgZm9yIChjb25zdCBbanNvbk9iaktleSwganNvbk9ialZhbHVlXSBvZiBPYmplY3QuZW50cmllcyhqc29uVmFsdWUpKSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuYXNzZXJ0KGpzb25PYmpWYWx1ZSAhPT0gbnVsbCwgZmllbGQubmFtZSArIFwiIG1hcCB2YWx1ZVwiLCBudWxsKTtcbiAgICAgICAgICAgICAgICAgICAgLy8gcmVhZCB2YWx1ZVxuICAgICAgICAgICAgICAgICAgICBsZXQgdmFsO1xuICAgICAgICAgICAgICAgICAgICBzd2l0Y2ggKGZpZWxkLlYua2luZCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBcIm1lc3NhZ2VcIjpcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YWwgPSBmaWVsZC5WLlQoKS5pbnRlcm5hbEpzb25SZWFkKGpzb25PYmpWYWx1ZSwgb3B0aW9ucyk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgICAgICAgICBjYXNlIFwiZW51bVwiOlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhbCA9IHRoaXMuZW51bShmaWVsZC5WLlQoKSwganNvbk9ialZhbHVlLCBmaWVsZC5uYW1lLCBvcHRpb25zLmlnbm9yZVVua25vd25GaWVsZHMpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICh2YWwgPT09IGZhbHNlKVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgXCJzY2FsYXJcIjpcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YWwgPSB0aGlzLnNjYWxhcihqc29uT2JqVmFsdWUsIGZpZWxkLlYuVCwgZmllbGQuVi5MLCBmaWVsZC5uYW1lKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB0aGlzLmFzc2VydCh2YWwgIT09IHVuZGVmaW5lZCwgZmllbGQubmFtZSArIFwiIG1hcCB2YWx1ZVwiLCBqc29uT2JqVmFsdWUpO1xuICAgICAgICAgICAgICAgICAgICAvLyByZWFkIGtleVxuICAgICAgICAgICAgICAgICAgICBsZXQga2V5ID0ganNvbk9iaktleTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKGZpZWxkLksgPT0gcmVmbGVjdGlvbl9pbmZvXzEuU2NhbGFyVHlwZS5CT09MKVxuICAgICAgICAgICAgICAgICAgICAgICAga2V5ID0ga2V5ID09IFwidHJ1ZVwiID8gdHJ1ZSA6IGtleSA9PSBcImZhbHNlXCIgPyBmYWxzZSA6IGtleTtcbiAgICAgICAgICAgICAgICAgICAga2V5ID0gdGhpcy5zY2FsYXIoa2V5LCBmaWVsZC5LLCByZWZsZWN0aW9uX2luZm9fMS5Mb25nVHlwZS5TVFJJTkcsIGZpZWxkLm5hbWUpLnRvU3RyaW5nKCk7XG4gICAgICAgICAgICAgICAgICAgIGZpZWxkT2JqW2tleV0gPSB2YWw7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSBpZiAoZmllbGQucmVwZWF0KSB7XG4gICAgICAgICAgICAgICAgaWYgKGpzb25WYWx1ZSA9PT0gbnVsbClcbiAgICAgICAgICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgICAgICAgLy8gY2hlY2sgaW5wdXRcbiAgICAgICAgICAgICAgICB0aGlzLmFzc2VydChBcnJheS5pc0FycmF5KGpzb25WYWx1ZSksIGZpZWxkLm5hbWUsIGpzb25WYWx1ZSk7XG4gICAgICAgICAgICAgICAgLy8gb3VyIHRhcmdldCB0byBwdXQgYXJyYXkgZW50cmllcyBpbnRvXG4gICAgICAgICAgICAgICAgY29uc3QgZmllbGRBcnIgPSB0YXJnZXRbbG9jYWxOYW1lXTtcbiAgICAgICAgICAgICAgICAvLyByZWFkIGFycmF5IGVudHJpZXNcbiAgICAgICAgICAgICAgICBmb3IgKGNvbnN0IGpzb25JdGVtIG9mIGpzb25WYWx1ZSkge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLmFzc2VydChqc29uSXRlbSAhPT0gbnVsbCwgZmllbGQubmFtZSwgbnVsbCk7XG4gICAgICAgICAgICAgICAgICAgIGxldCB2YWw7XG4gICAgICAgICAgICAgICAgICAgIHN3aXRjaCAoZmllbGQua2luZCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBcIm1lc3NhZ2VcIjpcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YWwgPSBmaWVsZC5UKCkuaW50ZXJuYWxKc29uUmVhZChqc29uSXRlbSwgb3B0aW9ucyk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgICAgICAgICBjYXNlIFwiZW51bVwiOlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhbCA9IHRoaXMuZW51bShmaWVsZC5UKCksIGpzb25JdGVtLCBmaWVsZC5uYW1lLCBvcHRpb25zLmlnbm9yZVVua25vd25GaWVsZHMpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICh2YWwgPT09IGZhbHNlKVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgXCJzY2FsYXJcIjpcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YWwgPSB0aGlzLnNjYWxhcihqc29uSXRlbSwgZmllbGQuVCwgZmllbGQuTCwgZmllbGQubmFtZSk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgdGhpcy5hc3NlcnQodmFsICE9PSB1bmRlZmluZWQsIGZpZWxkLm5hbWUsIGpzb25WYWx1ZSk7XG4gICAgICAgICAgICAgICAgICAgIGZpZWxkQXJyLnB1c2godmFsKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICBzd2l0Y2ggKGZpZWxkLmtpbmQpIHtcbiAgICAgICAgICAgICAgICAgICAgY2FzZSBcIm1lc3NhZ2VcIjpcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChqc29uVmFsdWUgPT09IG51bGwgJiYgZmllbGQuVCgpLnR5cGVOYW1lICE9ICdnb29nbGUucHJvdG9idWYuVmFsdWUnKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5hc3NlcnQoZmllbGQub25lb2YgPT09IHVuZGVmaW5lZCwgZmllbGQubmFtZSArIFwiIChvbmVvZiBtZW1iZXIpXCIsIG51bGwpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgdGFyZ2V0W2xvY2FsTmFtZV0gPSBmaWVsZC5UKCkuaW50ZXJuYWxKc29uUmVhZChqc29uVmFsdWUsIG9wdGlvbnMsIHRhcmdldFtsb2NhbE5hbWVdKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgICAgICBjYXNlIFwiZW51bVwiOlxuICAgICAgICAgICAgICAgICAgICAgICAgbGV0IHZhbCA9IHRoaXMuZW51bShmaWVsZC5UKCksIGpzb25WYWx1ZSwgZmllbGQubmFtZSwgb3B0aW9ucy5pZ25vcmVVbmtub3duRmllbGRzKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmICh2YWwgPT09IGZhbHNlKVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgICAgICAgICAgICAgICAgdGFyZ2V0W2xvY2FsTmFtZV0gPSB2YWw7XG4gICAgICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICAgICAgY2FzZSBcInNjYWxhclwiOlxuICAgICAgICAgICAgICAgICAgICAgICAgdGFyZ2V0W2xvY2FsTmFtZV0gPSB0aGlzLnNjYWxhcihqc29uVmFsdWUsIGZpZWxkLlQsIGZpZWxkLkwsIGZpZWxkLm5hbWUpO1xuICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxuICAgIC8qKlxuICAgICAqIFJldHVybnMgYGZhbHNlYCBmb3IgdW5yZWNvZ25pemVkIHN0cmluZyByZXByZXNlbnRhdGlvbnMuXG4gICAgICpcbiAgICAgKiBnb29nbGUucHJvdG9idWYuTnVsbFZhbHVlIGFjY2VwdHMgb25seSBKU09OIGBudWxsYCAob3IgdGhlIG9sZCBgXCJOVUxMX1ZBTFVFXCJgKS5cbiAgICAgKi9cbiAgICBlbnVtKHR5cGUsIGpzb24sIGZpZWxkTmFtZSwgaWdub3JlVW5rbm93bkZpZWxkcykge1xuICAgICAgICBpZiAodHlwZVswXSA9PSAnZ29vZ2xlLnByb3RvYnVmLk51bGxWYWx1ZScpXG4gICAgICAgICAgICBhc3NlcnRfMS5hc3NlcnQoanNvbiA9PT0gbnVsbCB8fCBqc29uID09PSBcIk5VTExfVkFMVUVcIiwgYFVuYWJsZSB0byBwYXJzZSBmaWVsZCAke3RoaXMuaW5mby50eXBlTmFtZX0jJHtmaWVsZE5hbWV9LCBlbnVtICR7dHlwZVswXX0gb25seSBhY2NlcHRzIG51bGwuYCk7XG4gICAgICAgIGlmIChqc29uID09PSBudWxsKVxuICAgICAgICAgICAgLy8gd2UgcmVxdWlyZSAwIHRvIGJlIGRlZmF1bHQgdmFsdWUgZm9yIGFsbCBlbnVtc1xuICAgICAgICAgICAgcmV0dXJuIDA7XG4gICAgICAgIHN3aXRjaCAodHlwZW9mIGpzb24pIHtcbiAgICAgICAgICAgIGNhc2UgXCJudW1iZXJcIjpcbiAgICAgICAgICAgICAgICBhc3NlcnRfMS5hc3NlcnQoTnVtYmVyLmlzSW50ZWdlcihqc29uKSwgYFVuYWJsZSB0byBwYXJzZSBmaWVsZCAke3RoaXMuaW5mby50eXBlTmFtZX0jJHtmaWVsZE5hbWV9LCBlbnVtIGNhbiBvbmx5IGJlIGludGVncmFsIG51bWJlciwgZ290ICR7anNvbn0uYCk7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGpzb247XG4gICAgICAgICAgICBjYXNlIFwic3RyaW5nXCI6XG4gICAgICAgICAgICAgICAgbGV0IGxvY2FsRW51bU5hbWUgPSBqc29uO1xuICAgICAgICAgICAgICAgIGlmICh0eXBlWzJdICYmIGpzb24uc3Vic3RyaW5nKDAsIHR5cGVbMl0ubGVuZ3RoKSA9PT0gdHlwZVsyXSlcbiAgICAgICAgICAgICAgICAgICAgLy8gbG9va3VwIHdpdGhvdXQgdGhlIHNoYXJlZCBwcmVmaXhcbiAgICAgICAgICAgICAgICAgICAgbG9jYWxFbnVtTmFtZSA9IGpzb24uc3Vic3RyaW5nKHR5cGVbMl0ubGVuZ3RoKTtcbiAgICAgICAgICAgICAgICBsZXQgZW51bU51bWJlciA9IHR5cGVbMV1bbG9jYWxFbnVtTmFtZV07XG4gICAgICAgICAgICAgICAgaWYgKHR5cGVvZiBlbnVtTnVtYmVyID09PSAndW5kZWZpbmVkJyAmJiBpZ25vcmVVbmtub3duRmllbGRzKSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgYXNzZXJ0XzEuYXNzZXJ0KHR5cGVvZiBlbnVtTnVtYmVyID09IFwibnVtYmVyXCIsIGBVbmFibGUgdG8gcGFyc2UgZmllbGQgJHt0aGlzLmluZm8udHlwZU5hbWV9IyR7ZmllbGROYW1lfSwgZW51bSAke3R5cGVbMF19IGhhcyBubyB2YWx1ZSBmb3IgXCIke2pzb259XCIuYCk7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGVudW1OdW1iZXI7XG4gICAgICAgIH1cbiAgICAgICAgYXNzZXJ0XzEuYXNzZXJ0KGZhbHNlLCBgVW5hYmxlIHRvIHBhcnNlIGZpZWxkICR7dGhpcy5pbmZvLnR5cGVOYW1lfSMke2ZpZWxkTmFtZX0sIGNhbm5vdCBwYXJzZSBlbnVtIHZhbHVlIGZyb20gJHt0eXBlb2YganNvbn1cIi5gKTtcbiAgICB9XG4gICAgc2NhbGFyKGpzb24sIHR5cGUsIGxvbmdUeXBlLCBmaWVsZE5hbWUpIHtcbiAgICAgICAgbGV0IGU7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgICBzd2l0Y2ggKHR5cGUpIHtcbiAgICAgICAgICAgICAgICAvLyBmbG9hdCwgZG91YmxlOiBKU09OIHZhbHVlIHdpbGwgYmUgYSBudW1iZXIgb3Igb25lIG9mIHRoZSBzcGVjaWFsIHN0cmluZyB2YWx1ZXMgXCJOYU5cIiwgXCJJbmZpbml0eVwiLCBhbmQgXCItSW5maW5pdHlcIi5cbiAgICAgICAgICAgICAgICAvLyBFaXRoZXIgbnVtYmVycyBvciBzdHJpbmdzIGFyZSBhY2NlcHRlZC4gRXhwb25lbnQgbm90YXRpb24gaXMgYWxzbyBhY2NlcHRlZC5cbiAgICAgICAgICAgICAgICBjYXNlIHJlZmxlY3Rpb25faW5mb18xLlNjYWxhclR5cGUuRE9VQkxFOlxuICAgICAgICAgICAgICAgIGNhc2UgcmVmbGVjdGlvbl9pbmZvXzEuU2NhbGFyVHlwZS5GTE9BVDpcbiAgICAgICAgICAgICAgICAgICAgaWYgKGpzb24gPT09IG51bGwpXG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gLjA7XG4gICAgICAgICAgICAgICAgICAgIGlmIChqc29uID09PSBcIk5hTlwiKVxuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIE51bWJlci5OYU47XG4gICAgICAgICAgICAgICAgICAgIGlmIChqc29uID09PSBcIkluZmluaXR5XCIpXG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gTnVtYmVyLlBPU0lUSVZFX0lORklOSVRZO1xuICAgICAgICAgICAgICAgICAgICBpZiAoanNvbiA9PT0gXCItSW5maW5pdHlcIilcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBOdW1iZXIuTkVHQVRJVkVfSU5GSU5JVFk7XG4gICAgICAgICAgICAgICAgICAgIGlmIChqc29uID09PSBcIlwiKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBlID0gXCJlbXB0eSBzdHJpbmdcIjtcbiAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIGlmICh0eXBlb2YganNvbiA9PSBcInN0cmluZ1wiICYmIGpzb24udHJpbSgpLmxlbmd0aCAhPT0ganNvbi5sZW5ndGgpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGUgPSBcImV4dHJhIHdoaXRlc3BhY2VcIjtcbiAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIGlmICh0eXBlb2YganNvbiAhPSBcInN0cmluZ1wiICYmIHR5cGVvZiBqc29uICE9IFwibnVtYmVyXCIpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIGxldCBmbG9hdCA9IE51bWJlcihqc29uKTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKE51bWJlci5pc05hTihmbG9hdCkpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGUgPSBcIm5vdCBhIG51bWJlclwiO1xuICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgaWYgKCFOdW1iZXIuaXNGaW5pdGUoZmxvYXQpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBpbmZpbml0eSBhbmQgLWluZmluaXR5IGFyZSBoYW5kbGVkIGJ5IHN0cmluZyByZXByZXNlbnRhdGlvbiBhYm92ZSwgc28gdGhpcyBpcyBhbiBlcnJvclxuICAgICAgICAgICAgICAgICAgICAgICAgZSA9IFwidG9vIGxhcmdlIG9yIHNtYWxsXCI7XG4gICAgICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBpZiAodHlwZSA9PSByZWZsZWN0aW9uX2luZm9fMS5TY2FsYXJUeXBlLkZMT0FUKVxuICAgICAgICAgICAgICAgICAgICAgICAgYXNzZXJ0XzEuYXNzZXJ0RmxvYXQzMihmbG9hdCk7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBmbG9hdDtcbiAgICAgICAgICAgICAgICAvLyBpbnQzMiwgZml4ZWQzMiwgdWludDMyOiBKU09OIHZhbHVlIHdpbGwgYmUgYSBkZWNpbWFsIG51bWJlci4gRWl0aGVyIG51bWJlcnMgb3Igc3RyaW5ncyBhcmUgYWNjZXB0ZWQuXG4gICAgICAgICAgICAgICAgY2FzZSByZWZsZWN0aW9uX2luZm9fMS5TY2FsYXJUeXBlLklOVDMyOlxuICAgICAgICAgICAgICAgIGNhc2UgcmVmbGVjdGlvbl9pbmZvXzEuU2NhbGFyVHlwZS5GSVhFRDMyOlxuICAgICAgICAgICAgICAgIGNhc2UgcmVmbGVjdGlvbl9pbmZvXzEuU2NhbGFyVHlwZS5TRklYRUQzMjpcbiAgICAgICAgICAgICAgICBjYXNlIHJlZmxlY3Rpb25faW5mb18xLlNjYWxhclR5cGUuU0lOVDMyOlxuICAgICAgICAgICAgICAgIGNhc2UgcmVmbGVjdGlvbl9pbmZvXzEuU2NhbGFyVHlwZS5VSU5UMzI6XG4gICAgICAgICAgICAgICAgICAgIGlmIChqc29uID09PSBudWxsKVxuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIDA7XG4gICAgICAgICAgICAgICAgICAgIGxldCBpbnQzMjtcbiAgICAgICAgICAgICAgICAgICAgaWYgKHR5cGVvZiBqc29uID09IFwibnVtYmVyXCIpXG4gICAgICAgICAgICAgICAgICAgICAgICBpbnQzMiA9IGpzb247XG4gICAgICAgICAgICAgICAgICAgIGVsc2UgaWYgKGpzb24gPT09IFwiXCIpXG4gICAgICAgICAgICAgICAgICAgICAgICBlID0gXCJlbXB0eSBzdHJpbmdcIjtcbiAgICAgICAgICAgICAgICAgICAgZWxzZSBpZiAodHlwZW9mIGpzb24gPT0gXCJzdHJpbmdcIikge1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGpzb24udHJpbSgpLmxlbmd0aCAhPT0ganNvbi5sZW5ndGgpXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZSA9IFwiZXh0cmEgd2hpdGVzcGFjZVwiO1xuICAgICAgICAgICAgICAgICAgICAgICAgZWxzZVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyID0gTnVtYmVyKGpzb24pO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIGlmIChpbnQzMiA9PT0gdW5kZWZpbmVkKVxuICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgICAgIGlmICh0eXBlID09IHJlZmxlY3Rpb25faW5mb18xLlNjYWxhclR5cGUuVUlOVDMyKVxuICAgICAgICAgICAgICAgICAgICAgICAgYXNzZXJ0XzEuYXNzZXJ0VUludDMyKGludDMyKTtcbiAgICAgICAgICAgICAgICAgICAgZWxzZVxuICAgICAgICAgICAgICAgICAgICAgICAgYXNzZXJ0XzEuYXNzZXJ0SW50MzIoaW50MzIpO1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gaW50MzI7XG4gICAgICAgICAgICAgICAgLy8gaW50NjQsIGZpeGVkNjQsIHVpbnQ2NDogSlNPTiB2YWx1ZSB3aWxsIGJlIGEgZGVjaW1hbCBzdHJpbmcuIEVpdGhlciBudW1iZXJzIG9yIHN0cmluZ3MgYXJlIGFjY2VwdGVkLlxuICAgICAgICAgICAgICAgIGNhc2UgcmVmbGVjdGlvbl9pbmZvXzEuU2NhbGFyVHlwZS5JTlQ2NDpcbiAgICAgICAgICAgICAgICBjYXNlIHJlZmxlY3Rpb25faW5mb18xLlNjYWxhclR5cGUuU0ZJWEVENjQ6XG4gICAgICAgICAgICAgICAgY2FzZSByZWZsZWN0aW9uX2luZm9fMS5TY2FsYXJUeXBlLlNJTlQ2NDpcbiAgICAgICAgICAgICAgICAgICAgaWYgKGpzb24gPT09IG51bGwpXG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gcmVmbGVjdGlvbl9sb25nX2NvbnZlcnRfMS5yZWZsZWN0aW9uTG9uZ0NvbnZlcnQocGJfbG9uZ18xLlBiTG9uZy5aRVJPLCBsb25nVHlwZSk7XG4gICAgICAgICAgICAgICAgICAgIGlmICh0eXBlb2YganNvbiAhPSBcIm51bWJlclwiICYmIHR5cGVvZiBqc29uICE9IFwic3RyaW5nXCIpXG4gICAgICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHJlZmxlY3Rpb25fbG9uZ19jb252ZXJ0XzEucmVmbGVjdGlvbkxvbmdDb252ZXJ0KHBiX2xvbmdfMS5QYkxvbmcuZnJvbShqc29uKSwgbG9uZ1R5cGUpO1xuICAgICAgICAgICAgICAgIGNhc2UgcmVmbGVjdGlvbl9pbmZvXzEuU2NhbGFyVHlwZS5GSVhFRDY0OlxuICAgICAgICAgICAgICAgIGNhc2UgcmVmbGVjdGlvbl9pbmZvXzEuU2NhbGFyVHlwZS5VSU5UNjQ6XG4gICAgICAgICAgICAgICAgICAgIGlmIChqc29uID09PSBudWxsKVxuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHJlZmxlY3Rpb25fbG9uZ19jb252ZXJ0XzEucmVmbGVjdGlvbkxvbmdDb252ZXJ0KHBiX2xvbmdfMS5QYlVMb25nLlpFUk8sIGxvbmdUeXBlKTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKHR5cGVvZiBqc29uICE9IFwibnVtYmVyXCIgJiYgdHlwZW9mIGpzb24gIT0gXCJzdHJpbmdcIilcbiAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gcmVmbGVjdGlvbl9sb25nX2NvbnZlcnRfMS5yZWZsZWN0aW9uTG9uZ0NvbnZlcnQocGJfbG9uZ18xLlBiVUxvbmcuZnJvbShqc29uKSwgbG9uZ1R5cGUpO1xuICAgICAgICAgICAgICAgIC8vIGJvb2w6XG4gICAgICAgICAgICAgICAgY2FzZSByZWZsZWN0aW9uX2luZm9fMS5TY2FsYXJUeXBlLkJPT0w6XG4gICAgICAgICAgICAgICAgICAgIGlmIChqc29uID09PSBudWxsKVxuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICAgICAgICAgICAgICBpZiAodHlwZW9mIGpzb24gIT09IFwiYm9vbGVhblwiKVxuICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBqc29uO1xuICAgICAgICAgICAgICAgIC8vIHN0cmluZzpcbiAgICAgICAgICAgICAgICBjYXNlIHJlZmxlY3Rpb25faW5mb18xLlNjYWxhclR5cGUuU1RSSU5HOlxuICAgICAgICAgICAgICAgICAgICBpZiAoanNvbiA9PT0gbnVsbClcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBcIlwiO1xuICAgICAgICAgICAgICAgICAgICBpZiAodHlwZW9mIGpzb24gIT09IFwic3RyaW5nXCIpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGUgPSBcImV4dHJhIHdoaXRlc3BhY2VcIjtcbiAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBlbmNvZGVVUklDb21wb25lbnQoanNvbik7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgY2F0Y2ggKGUpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGUgPSBcImludmFsaWQgVVRGOFwiO1xuICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGpzb247XG4gICAgICAgICAgICAgICAgLy8gYnl0ZXM6IEpTT04gdmFsdWUgd2lsbCBiZSB0aGUgZGF0YSBlbmNvZGVkIGFzIGEgc3RyaW5nIHVzaW5nIHN0YW5kYXJkIGJhc2U2NCBlbmNvZGluZyB3aXRoIHBhZGRpbmdzLlxuICAgICAgICAgICAgICAgIC8vIEVpdGhlciBzdGFuZGFyZCBvciBVUkwtc2FmZSBiYXNlNjQgZW5jb2Rpbmcgd2l0aC93aXRob3V0IHBhZGRpbmdzIGFyZSBhY2NlcHRlZC5cbiAgICAgICAgICAgICAgICBjYXNlIHJlZmxlY3Rpb25faW5mb18xLlNjYWxhclR5cGUuQllURVM6XG4gICAgICAgICAgICAgICAgICAgIGlmIChqc29uID09PSBudWxsIHx8IGpzb24gPT09IFwiXCIpXG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gbmV3IFVpbnQ4QXJyYXkoMCk7XG4gICAgICAgICAgICAgICAgICAgIGlmICh0eXBlb2YganNvbiAhPT0gJ3N0cmluZycpXG4gICAgICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGJhc2U2NF8xLmJhc2U2NGRlY29kZShqc29uKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgICAgIGUgPSBlcnJvci5tZXNzYWdlO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMuYXNzZXJ0KGZhbHNlLCBmaWVsZE5hbWUgKyAoZSA/IFwiIC0gXCIgKyBlIDogXCJcIiksIGpzb24pO1xuICAgIH1cbn1cbmV4cG9ydHMuUmVmbGVjdGlvbkpzb25SZWFkZXIgPSBSZWZsZWN0aW9uSnNvblJlYWRlcjtcbiIsCiAgICAiXCJ1c2Ugc3RyaWN0XCI7XG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJfX2VzTW9kdWxlXCIsIHsgdmFsdWU6IHRydWUgfSk7XG5leHBvcnRzLlJlZmxlY3Rpb25Kc29uV3JpdGVyID0gdm9pZCAwO1xuY29uc3QgYmFzZTY0XzEgPSByZXF1aXJlKFwiLi9iYXNlNjRcIik7XG5jb25zdCBwYl9sb25nXzEgPSByZXF1aXJlKFwiLi9wYi1sb25nXCIpO1xuY29uc3QgcmVmbGVjdGlvbl9pbmZvXzEgPSByZXF1aXJlKFwiLi9yZWZsZWN0aW9uLWluZm9cIik7XG5jb25zdCBhc3NlcnRfMSA9IHJlcXVpcmUoXCIuL2Fzc2VydFwiKTtcbi8qKlxuICogV3JpdGVzIHByb3RvMyBtZXNzYWdlcyBpbiBjYW5vbmljYWwgSlNPTiBmb3JtYXQgdXNpbmcgcmVmbGVjdGlvblxuICogaW5mb3JtYXRpb24uXG4gKlxuICogaHR0cHM6Ly9kZXZlbG9wZXJzLmdvb2dsZS5jb20vcHJvdG9jb2wtYnVmZmVycy9kb2NzL3Byb3RvMyNqc29uXG4gKi9cbmNsYXNzIFJlZmxlY3Rpb25Kc29uV3JpdGVyIHtcbiAgICBjb25zdHJ1Y3RvcihpbmZvKSB7XG4gICAgICAgIHZhciBfYTtcbiAgICAgICAgdGhpcy5maWVsZHMgPSAoX2EgPSBpbmZvLmZpZWxkcykgIT09IG51bGwgJiYgX2EgIT09IHZvaWQgMCA/IF9hIDogW107XG4gICAgfVxuICAgIC8qKlxuICAgICAqIENvbnZlcnRzIHRoZSBtZXNzYWdlIHRvIGEgSlNPTiBvYmplY3QsIGJhc2VkIG9uIHRoZSBmaWVsZCBkZXNjcmlwdG9ycy5cbiAgICAgKi9cbiAgICB3cml0ZShtZXNzYWdlLCBvcHRpb25zKSB7XG4gICAgICAgIGNvbnN0IGpzb24gPSB7fSwgc291cmNlID0gbWVzc2FnZTtcbiAgICAgICAgZm9yIChjb25zdCBmaWVsZCBvZiB0aGlzLmZpZWxkcykge1xuICAgICAgICAgICAgLy8gZmllbGQgaXMgbm90IHBhcnQgb2YgYSBvbmVvZiwgc2ltcGx5IHdyaXRlIGFzIGlzXG4gICAgICAgICAgICBpZiAoIWZpZWxkLm9uZW9mKSB7XG4gICAgICAgICAgICAgICAgbGV0IGpzb25WYWx1ZSA9IHRoaXMuZmllbGQoZmllbGQsIHNvdXJjZVtmaWVsZC5sb2NhbE5hbWVdLCBvcHRpb25zKTtcbiAgICAgICAgICAgICAgICBpZiAoanNvblZhbHVlICE9PSB1bmRlZmluZWQpXG4gICAgICAgICAgICAgICAgICAgIGpzb25bb3B0aW9ucy51c2VQcm90b0ZpZWxkTmFtZSA/IGZpZWxkLm5hbWUgOiBmaWVsZC5qc29uTmFtZV0gPSBqc29uVmFsdWU7XG4gICAgICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICAvLyBmaWVsZCBpcyBwYXJ0IG9mIGEgb25lb2ZcbiAgICAgICAgICAgIGNvbnN0IGdyb3VwID0gc291cmNlW2ZpZWxkLm9uZW9mXTtcbiAgICAgICAgICAgIGlmIChncm91cC5vbmVvZktpbmQgIT09IGZpZWxkLmxvY2FsTmFtZSlcbiAgICAgICAgICAgICAgICBjb250aW51ZTsgLy8gbm90IHNlbGVjdGVkLCBza2lwXG4gICAgICAgICAgICBjb25zdCBvcHQgPSBmaWVsZC5raW5kID09ICdzY2FsYXInIHx8IGZpZWxkLmtpbmQgPT0gJ2VudW0nXG4gICAgICAgICAgICAgICAgPyBPYmplY3QuYXNzaWduKE9iamVjdC5hc3NpZ24oe30sIG9wdGlvbnMpLCB7IGVtaXREZWZhdWx0VmFsdWVzOiB0cnVlIH0pIDogb3B0aW9ucztcbiAgICAgICAgICAgIGxldCBqc29uVmFsdWUgPSB0aGlzLmZpZWxkKGZpZWxkLCBncm91cFtmaWVsZC5sb2NhbE5hbWVdLCBvcHQpO1xuICAgICAgICAgICAgYXNzZXJ0XzEuYXNzZXJ0KGpzb25WYWx1ZSAhPT0gdW5kZWZpbmVkKTtcbiAgICAgICAgICAgIGpzb25bb3B0aW9ucy51c2VQcm90b0ZpZWxkTmFtZSA/IGZpZWxkLm5hbWUgOiBmaWVsZC5qc29uTmFtZV0gPSBqc29uVmFsdWU7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGpzb247XG4gICAgfVxuICAgIGZpZWxkKGZpZWxkLCB2YWx1ZSwgb3B0aW9ucykge1xuICAgICAgICBsZXQganNvblZhbHVlID0gdW5kZWZpbmVkO1xuICAgICAgICBpZiAoZmllbGQua2luZCA9PSAnbWFwJykge1xuICAgICAgICAgICAgYXNzZXJ0XzEuYXNzZXJ0KHR5cGVvZiB2YWx1ZSA9PSBcIm9iamVjdFwiICYmIHZhbHVlICE9PSBudWxsKTtcbiAgICAgICAgICAgIGNvbnN0IGpzb25PYmogPSB7fTtcbiAgICAgICAgICAgIHN3aXRjaCAoZmllbGQuVi5raW5kKSB7XG4gICAgICAgICAgICAgICAgY2FzZSBcInNjYWxhclwiOlxuICAgICAgICAgICAgICAgICAgICBmb3IgKGNvbnN0IFtlbnRyeUtleSwgZW50cnlWYWx1ZV0gb2YgT2JqZWN0LmVudHJpZXModmFsdWUpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB2YWwgPSB0aGlzLnNjYWxhcihmaWVsZC5WLlQsIGVudHJ5VmFsdWUsIGZpZWxkLm5hbWUsIGZhbHNlLCB0cnVlKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGFzc2VydF8xLmFzc2VydCh2YWwgIT09IHVuZGVmaW5lZCk7XG4gICAgICAgICAgICAgICAgICAgICAgICBqc29uT2JqW2VudHJ5S2V5LnRvU3RyaW5nKCldID0gdmFsOyAvLyBKU09OIHN0YW5kYXJkIGFsbG93cyBvbmx5IChkb3VibGUgcXVvdGVkKSBzdHJpbmcgYXMgcHJvcGVydHkga2V5XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgY2FzZSBcIm1lc3NhZ2VcIjpcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgbWVzc2FnZVR5cGUgPSBmaWVsZC5WLlQoKTtcbiAgICAgICAgICAgICAgICAgICAgZm9yIChjb25zdCBbZW50cnlLZXksIGVudHJ5VmFsdWVdIG9mIE9iamVjdC5lbnRyaWVzKHZhbHVlKSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdmFsID0gdGhpcy5tZXNzYWdlKG1lc3NhZ2VUeXBlLCBlbnRyeVZhbHVlLCBmaWVsZC5uYW1lLCBvcHRpb25zKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGFzc2VydF8xLmFzc2VydCh2YWwgIT09IHVuZGVmaW5lZCk7XG4gICAgICAgICAgICAgICAgICAgICAgICBqc29uT2JqW2VudHJ5S2V5LnRvU3RyaW5nKCldID0gdmFsOyAvLyBKU09OIHN0YW5kYXJkIGFsbG93cyBvbmx5IChkb3VibGUgcXVvdGVkKSBzdHJpbmcgYXMgcHJvcGVydHkga2V5XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgY2FzZSBcImVudW1cIjpcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgZW51bUluZm8gPSBmaWVsZC5WLlQoKTtcbiAgICAgICAgICAgICAgICAgICAgZm9yIChjb25zdCBbZW50cnlLZXksIGVudHJ5VmFsdWVdIG9mIE9iamVjdC5lbnRyaWVzKHZhbHVlKSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgYXNzZXJ0XzEuYXNzZXJ0KGVudHJ5VmFsdWUgPT09IHVuZGVmaW5lZCB8fCB0eXBlb2YgZW50cnlWYWx1ZSA9PSAnbnVtYmVyJyk7XG4gICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB2YWwgPSB0aGlzLmVudW0oZW51bUluZm8sIGVudHJ5VmFsdWUsIGZpZWxkLm5hbWUsIGZhbHNlLCB0cnVlLCBvcHRpb25zLmVudW1Bc0ludGVnZXIpO1xuICAgICAgICAgICAgICAgICAgICAgICAgYXNzZXJ0XzEuYXNzZXJ0KHZhbCAhPT0gdW5kZWZpbmVkKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGpzb25PYmpbZW50cnlLZXkudG9TdHJpbmcoKV0gPSB2YWw7IC8vIEpTT04gc3RhbmRhcmQgYWxsb3dzIG9ubHkgKGRvdWJsZSBxdW90ZWQpIHN0cmluZyBhcyBwcm9wZXJ0eSBrZXlcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmIChvcHRpb25zLmVtaXREZWZhdWx0VmFsdWVzIHx8IE9iamVjdC5rZXlzKGpzb25PYmopLmxlbmd0aCA+IDApXG4gICAgICAgICAgICAgICAganNvblZhbHVlID0ganNvbk9iajtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIGlmIChmaWVsZC5yZXBlYXQpIHtcbiAgICAgICAgICAgIGFzc2VydF8xLmFzc2VydChBcnJheS5pc0FycmF5KHZhbHVlKSk7XG4gICAgICAgICAgICBjb25zdCBqc29uQXJyID0gW107XG4gICAgICAgICAgICBzd2l0Y2ggKGZpZWxkLmtpbmQpIHtcbiAgICAgICAgICAgICAgICBjYXNlIFwic2NhbGFyXCI6XG4gICAgICAgICAgICAgICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgdmFsdWUubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHZhbCA9IHRoaXMuc2NhbGFyKGZpZWxkLlQsIHZhbHVlW2ldLCBmaWVsZC5uYW1lLCBmaWVsZC5vcHQsIHRydWUpO1xuICAgICAgICAgICAgICAgICAgICAgICAgYXNzZXJ0XzEuYXNzZXJ0KHZhbCAhPT0gdW5kZWZpbmVkKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGpzb25BcnIucHVzaCh2YWwpO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIGNhc2UgXCJlbnVtXCI6XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IGVudW1JbmZvID0gZmllbGQuVCgpO1xuICAgICAgICAgICAgICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IHZhbHVlLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBhc3NlcnRfMS5hc3NlcnQodmFsdWVbaV0gPT09IHVuZGVmaW5lZCB8fCB0eXBlb2YgdmFsdWVbaV0gPT0gJ251bWJlcicpO1xuICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdmFsID0gdGhpcy5lbnVtKGVudW1JbmZvLCB2YWx1ZVtpXSwgZmllbGQubmFtZSwgZmllbGQub3B0LCB0cnVlLCBvcHRpb25zLmVudW1Bc0ludGVnZXIpO1xuICAgICAgICAgICAgICAgICAgICAgICAgYXNzZXJ0XzEuYXNzZXJ0KHZhbCAhPT0gdW5kZWZpbmVkKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGpzb25BcnIucHVzaCh2YWwpO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIGNhc2UgXCJtZXNzYWdlXCI6XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IG1lc3NhZ2VUeXBlID0gZmllbGQuVCgpO1xuICAgICAgICAgICAgICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IHZhbHVlLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB2YWwgPSB0aGlzLm1lc3NhZ2UobWVzc2FnZVR5cGUsIHZhbHVlW2ldLCBmaWVsZC5uYW1lLCBvcHRpb25zKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGFzc2VydF8xLmFzc2VydCh2YWwgIT09IHVuZGVmaW5lZCk7XG4gICAgICAgICAgICAgICAgICAgICAgICBqc29uQXJyLnB1c2godmFsKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIC8vIGFkZCBjb252ZXJ0ZWQgYXJyYXkgdG8ganNvbiBvdXRwdXRcbiAgICAgICAgICAgIGlmIChvcHRpb25zLmVtaXREZWZhdWx0VmFsdWVzIHx8IGpzb25BcnIubGVuZ3RoID4gMCB8fCBvcHRpb25zLmVtaXREZWZhdWx0VmFsdWVzKVxuICAgICAgICAgICAgICAgIGpzb25WYWx1ZSA9IGpzb25BcnI7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICBzd2l0Y2ggKGZpZWxkLmtpbmQpIHtcbiAgICAgICAgICAgICAgICBjYXNlIFwic2NhbGFyXCI6XG4gICAgICAgICAgICAgICAgICAgIGpzb25WYWx1ZSA9IHRoaXMuc2NhbGFyKGZpZWxkLlQsIHZhbHVlLCBmaWVsZC5uYW1lLCBmaWVsZC5vcHQsIG9wdGlvbnMuZW1pdERlZmF1bHRWYWx1ZXMpO1xuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICBjYXNlIFwiZW51bVwiOlxuICAgICAgICAgICAgICAgICAgICBqc29uVmFsdWUgPSB0aGlzLmVudW0oZmllbGQuVCgpLCB2YWx1ZSwgZmllbGQubmFtZSwgZmllbGQub3B0LCBvcHRpb25zLmVtaXREZWZhdWx0VmFsdWVzLCBvcHRpb25zLmVudW1Bc0ludGVnZXIpO1xuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICBjYXNlIFwibWVzc2FnZVwiOlxuICAgICAgICAgICAgICAgICAgICBqc29uVmFsdWUgPSB0aGlzLm1lc3NhZ2UoZmllbGQuVCgpLCB2YWx1ZSwgZmllbGQubmFtZSwgb3B0aW9ucyk7XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiBqc29uVmFsdWU7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIFJldHVybnMgYG51bGxgIGFzIHRoZSBkZWZhdWx0IGZvciBnb29nbGUucHJvdG9idWYuTnVsbFZhbHVlLlxuICAgICAqL1xuICAgIGVudW0odHlwZSwgdmFsdWUsIGZpZWxkTmFtZSwgb3B0aW9uYWwsIGVtaXREZWZhdWx0VmFsdWVzLCBlbnVtQXNJbnRlZ2VyKSB7XG4gICAgICAgIGlmICh0eXBlWzBdID09ICdnb29nbGUucHJvdG9idWYuTnVsbFZhbHVlJylcbiAgICAgICAgICAgIHJldHVybiAhZW1pdERlZmF1bHRWYWx1ZXMgJiYgIW9wdGlvbmFsID8gdW5kZWZpbmVkIDogbnVsbDtcbiAgICAgICAgaWYgKHZhbHVlID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgIGFzc2VydF8xLmFzc2VydChvcHRpb25hbCk7XG4gICAgICAgICAgICByZXR1cm4gdW5kZWZpbmVkO1xuICAgICAgICB9XG4gICAgICAgIGlmICh2YWx1ZSA9PT0gMCAmJiAhZW1pdERlZmF1bHRWYWx1ZXMgJiYgIW9wdGlvbmFsKVxuICAgICAgICAgICAgLy8gd2UgcmVxdWlyZSAwIHRvIGJlIGRlZmF1bHQgdmFsdWUgZm9yIGFsbCBlbnVtc1xuICAgICAgICAgICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICAgICAgYXNzZXJ0XzEuYXNzZXJ0KHR5cGVvZiB2YWx1ZSA9PSAnbnVtYmVyJyk7XG4gICAgICAgIGFzc2VydF8xLmFzc2VydChOdW1iZXIuaXNJbnRlZ2VyKHZhbHVlKSk7XG4gICAgICAgIGlmIChlbnVtQXNJbnRlZ2VyIHx8ICF0eXBlWzFdLmhhc093blByb3BlcnR5KHZhbHVlKSlcbiAgICAgICAgICAgIC8vIGlmIHdlIGRvbid0IG5vdyB0aGUgZW51bSB2YWx1ZSwganVzdCByZXR1cm4gdGhlIG51bWJlclxuICAgICAgICAgICAgcmV0dXJuIHZhbHVlO1xuICAgICAgICBpZiAodHlwZVsyXSlcbiAgICAgICAgICAgIC8vIHJlc3RvcmUgdGhlIGRyb3BwZWQgcHJlZml4XG4gICAgICAgICAgICByZXR1cm4gdHlwZVsyXSArIHR5cGVbMV1bdmFsdWVdO1xuICAgICAgICByZXR1cm4gdHlwZVsxXVt2YWx1ZV07XG4gICAgfVxuICAgIG1lc3NhZ2UodHlwZSwgdmFsdWUsIGZpZWxkTmFtZSwgb3B0aW9ucykge1xuICAgICAgICBpZiAodmFsdWUgPT09IHVuZGVmaW5lZClcbiAgICAgICAgICAgIHJldHVybiBvcHRpb25zLmVtaXREZWZhdWx0VmFsdWVzID8gbnVsbCA6IHVuZGVmaW5lZDtcbiAgICAgICAgcmV0dXJuIHR5cGUuaW50ZXJuYWxKc29uV3JpdGUodmFsdWUsIG9wdGlvbnMpO1xuICAgIH1cbiAgICBzY2FsYXIodHlwZSwgdmFsdWUsIGZpZWxkTmFtZSwgb3B0aW9uYWwsIGVtaXREZWZhdWx0VmFsdWVzKSB7XG4gICAgICAgIGlmICh2YWx1ZSA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICBhc3NlcnRfMS5hc3NlcnQob3B0aW9uYWwpO1xuICAgICAgICAgICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBlZCA9IGVtaXREZWZhdWx0VmFsdWVzIHx8IG9wdGlvbmFsO1xuICAgICAgICAvLyBub2luc3BlY3Rpb24gRmFsbFRocm91Z2hJblN3aXRjaFN0YXRlbWVudEpTXG4gICAgICAgIHN3aXRjaCAodHlwZSkge1xuICAgICAgICAgICAgLy8gaW50MzIsIGZpeGVkMzIsIHVpbnQzMjogSlNPTiB2YWx1ZSB3aWxsIGJlIGEgZGVjaW1hbCBudW1iZXIuIEVpdGhlciBudW1iZXJzIG9yIHN0cmluZ3MgYXJlIGFjY2VwdGVkLlxuICAgICAgICAgICAgY2FzZSByZWZsZWN0aW9uX2luZm9fMS5TY2FsYXJUeXBlLklOVDMyOlxuICAgICAgICAgICAgY2FzZSByZWZsZWN0aW9uX2luZm9fMS5TY2FsYXJUeXBlLlNGSVhFRDMyOlxuICAgICAgICAgICAgY2FzZSByZWZsZWN0aW9uX2luZm9fMS5TY2FsYXJUeXBlLlNJTlQzMjpcbiAgICAgICAgICAgICAgICBpZiAodmFsdWUgPT09IDApXG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBlZCA/IDAgOiB1bmRlZmluZWQ7XG4gICAgICAgICAgICAgICAgYXNzZXJ0XzEuYXNzZXJ0SW50MzIodmFsdWUpO1xuICAgICAgICAgICAgICAgIHJldHVybiB2YWx1ZTtcbiAgICAgICAgICAgIGNhc2UgcmVmbGVjdGlvbl9pbmZvXzEuU2NhbGFyVHlwZS5GSVhFRDMyOlxuICAgICAgICAgICAgY2FzZSByZWZsZWN0aW9uX2luZm9fMS5TY2FsYXJUeXBlLlVJTlQzMjpcbiAgICAgICAgICAgICAgICBpZiAodmFsdWUgPT09IDApXG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBlZCA/IDAgOiB1bmRlZmluZWQ7XG4gICAgICAgICAgICAgICAgYXNzZXJ0XzEuYXNzZXJ0VUludDMyKHZhbHVlKTtcbiAgICAgICAgICAgICAgICByZXR1cm4gdmFsdWU7XG4gICAgICAgICAgICAvLyBmbG9hdCwgZG91YmxlOiBKU09OIHZhbHVlIHdpbGwgYmUgYSBudW1iZXIgb3Igb25lIG9mIHRoZSBzcGVjaWFsIHN0cmluZyB2YWx1ZXMgXCJOYU5cIiwgXCJJbmZpbml0eVwiLCBhbmQgXCItSW5maW5pdHlcIi5cbiAgICAgICAgICAgIC8vIEVpdGhlciBudW1iZXJzIG9yIHN0cmluZ3MgYXJlIGFjY2VwdGVkLiBFeHBvbmVudCBub3RhdGlvbiBpcyBhbHNvIGFjY2VwdGVkLlxuICAgICAgICAgICAgY2FzZSByZWZsZWN0aW9uX2luZm9fMS5TY2FsYXJUeXBlLkZMT0FUOlxuICAgICAgICAgICAgICAgIGFzc2VydF8xLmFzc2VydEZsb2F0MzIodmFsdWUpO1xuICAgICAgICAgICAgY2FzZSByZWZsZWN0aW9uX2luZm9fMS5TY2FsYXJUeXBlLkRPVUJMRTpcbiAgICAgICAgICAgICAgICBpZiAodmFsdWUgPT09IDApXG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBlZCA/IDAgOiB1bmRlZmluZWQ7XG4gICAgICAgICAgICAgICAgYXNzZXJ0XzEuYXNzZXJ0KHR5cGVvZiB2YWx1ZSA9PSAnbnVtYmVyJyk7XG4gICAgICAgICAgICAgICAgaWYgKE51bWJlci5pc05hTih2YWx1ZSkpXG4gICAgICAgICAgICAgICAgICAgIHJldHVybiAnTmFOJztcbiAgICAgICAgICAgICAgICBpZiAodmFsdWUgPT09IE51bWJlci5QT1NJVElWRV9JTkZJTklUWSlcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuICdJbmZpbml0eSc7XG4gICAgICAgICAgICAgICAgaWYgKHZhbHVlID09PSBOdW1iZXIuTkVHQVRJVkVfSU5GSU5JVFkpXG4gICAgICAgICAgICAgICAgICAgIHJldHVybiAnLUluZmluaXR5JztcbiAgICAgICAgICAgICAgICByZXR1cm4gdmFsdWU7XG4gICAgICAgICAgICAvLyBzdHJpbmc6XG4gICAgICAgICAgICBjYXNlIHJlZmxlY3Rpb25faW5mb18xLlNjYWxhclR5cGUuU1RSSU5HOlxuICAgICAgICAgICAgICAgIGlmICh2YWx1ZSA9PT0gXCJcIilcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGVkID8gJycgOiB1bmRlZmluZWQ7XG4gICAgICAgICAgICAgICAgYXNzZXJ0XzEuYXNzZXJ0KHR5cGVvZiB2YWx1ZSA9PSAnc3RyaW5nJyk7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHZhbHVlO1xuICAgICAgICAgICAgLy8gYm9vbDpcbiAgICAgICAgICAgIGNhc2UgcmVmbGVjdGlvbl9pbmZvXzEuU2NhbGFyVHlwZS5CT09MOlxuICAgICAgICAgICAgICAgIGlmICh2YWx1ZSA9PT0gZmFsc2UpXG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBlZCA/IGZhbHNlIDogdW5kZWZpbmVkO1xuICAgICAgICAgICAgICAgIGFzc2VydF8xLmFzc2VydCh0eXBlb2YgdmFsdWUgPT0gJ2Jvb2xlYW4nKTtcbiAgICAgICAgICAgICAgICByZXR1cm4gdmFsdWU7XG4gICAgICAgICAgICAvLyBKU09OIHZhbHVlIHdpbGwgYmUgYSBkZWNpbWFsIHN0cmluZy4gRWl0aGVyIG51bWJlcnMgb3Igc3RyaW5ncyBhcmUgYWNjZXB0ZWQuXG4gICAgICAgICAgICBjYXNlIHJlZmxlY3Rpb25faW5mb18xLlNjYWxhclR5cGUuVUlOVDY0OlxuICAgICAgICAgICAgY2FzZSByZWZsZWN0aW9uX2luZm9fMS5TY2FsYXJUeXBlLkZJWEVENjQ6XG4gICAgICAgICAgICAgICAgYXNzZXJ0XzEuYXNzZXJ0KHR5cGVvZiB2YWx1ZSA9PSAnbnVtYmVyJyB8fCB0eXBlb2YgdmFsdWUgPT0gJ3N0cmluZycgfHwgdHlwZW9mIHZhbHVlID09ICdiaWdpbnQnKTtcbiAgICAgICAgICAgICAgICBsZXQgdWxvbmcgPSBwYl9sb25nXzEuUGJVTG9uZy5mcm9tKHZhbHVlKTtcbiAgICAgICAgICAgICAgICBpZiAodWxvbmcuaXNaZXJvKCkgJiYgIWVkKVxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gdW5kZWZpbmVkO1xuICAgICAgICAgICAgICAgIHJldHVybiB1bG9uZy50b1N0cmluZygpO1xuICAgICAgICAgICAgLy8gSlNPTiB2YWx1ZSB3aWxsIGJlIGEgZGVjaW1hbCBzdHJpbmcuIEVpdGhlciBudW1iZXJzIG9yIHN0cmluZ3MgYXJlIGFjY2VwdGVkLlxuICAgICAgICAgICAgY2FzZSByZWZsZWN0aW9uX2luZm9fMS5TY2FsYXJUeXBlLklOVDY0OlxuICAgICAgICAgICAgY2FzZSByZWZsZWN0aW9uX2luZm9fMS5TY2FsYXJUeXBlLlNGSVhFRDY0OlxuICAgICAgICAgICAgY2FzZSByZWZsZWN0aW9uX2luZm9fMS5TY2FsYXJUeXBlLlNJTlQ2NDpcbiAgICAgICAgICAgICAgICBhc3NlcnRfMS5hc3NlcnQodHlwZW9mIHZhbHVlID09ICdudW1iZXInIHx8IHR5cGVvZiB2YWx1ZSA9PSAnc3RyaW5nJyB8fCB0eXBlb2YgdmFsdWUgPT0gJ2JpZ2ludCcpO1xuICAgICAgICAgICAgICAgIGxldCBsb25nID0gcGJfbG9uZ18xLlBiTG9uZy5mcm9tKHZhbHVlKTtcbiAgICAgICAgICAgICAgICBpZiAobG9uZy5pc1plcm8oKSAmJiAhZWQpXG4gICAgICAgICAgICAgICAgICAgIHJldHVybiB1bmRlZmluZWQ7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGxvbmcudG9TdHJpbmcoKTtcbiAgICAgICAgICAgIC8vIGJ5dGVzOiBKU09OIHZhbHVlIHdpbGwgYmUgdGhlIGRhdGEgZW5jb2RlZCBhcyBhIHN0cmluZyB1c2luZyBzdGFuZGFyZCBiYXNlNjQgZW5jb2Rpbmcgd2l0aCBwYWRkaW5ncy5cbiAgICAgICAgICAgIC8vIEVpdGhlciBzdGFuZGFyZCBvciBVUkwtc2FmZSBiYXNlNjQgZW5jb2Rpbmcgd2l0aC93aXRob3V0IHBhZGRpbmdzIGFyZSBhY2NlcHRlZC5cbiAgICAgICAgICAgIGNhc2UgcmVmbGVjdGlvbl9pbmZvXzEuU2NhbGFyVHlwZS5CWVRFUzpcbiAgICAgICAgICAgICAgICBhc3NlcnRfMS5hc3NlcnQodmFsdWUgaW5zdGFuY2VvZiBVaW50OEFycmF5KTtcbiAgICAgICAgICAgICAgICBpZiAoIXZhbHVlLmJ5dGVMZW5ndGgpXG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBlZCA/IFwiXCIgOiB1bmRlZmluZWQ7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGJhc2U2NF8xLmJhc2U2NGVuY29kZSh2YWx1ZSk7XG4gICAgICAgIH1cbiAgICB9XG59XG5leHBvcnRzLlJlZmxlY3Rpb25Kc29uV3JpdGVyID0gUmVmbGVjdGlvbkpzb25Xcml0ZXI7XG4iLAogICAgIlwidXNlIHN0cmljdFwiO1xuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiX19lc01vZHVsZVwiLCB7IHZhbHVlOiB0cnVlIH0pO1xuZXhwb3J0cy5yZWZsZWN0aW9uU2NhbGFyRGVmYXVsdCA9IHZvaWQgMDtcbmNvbnN0IHJlZmxlY3Rpb25faW5mb18xID0gcmVxdWlyZShcIi4vcmVmbGVjdGlvbi1pbmZvXCIpO1xuY29uc3QgcmVmbGVjdGlvbl9sb25nX2NvbnZlcnRfMSA9IHJlcXVpcmUoXCIuL3JlZmxlY3Rpb24tbG9uZy1jb252ZXJ0XCIpO1xuY29uc3QgcGJfbG9uZ18xID0gcmVxdWlyZShcIi4vcGItbG9uZ1wiKTtcbi8qKlxuICogQ3JlYXRlcyB0aGUgZGVmYXVsdCB2YWx1ZSBmb3IgYSBzY2FsYXIgdHlwZS5cbiAqL1xuZnVuY3Rpb24gcmVmbGVjdGlvblNjYWxhckRlZmF1bHQodHlwZSwgbG9uZ1R5cGUgPSByZWZsZWN0aW9uX2luZm9fMS5Mb25nVHlwZS5TVFJJTkcpIHtcbiAgICBzd2l0Y2ggKHR5cGUpIHtcbiAgICAgICAgY2FzZSByZWZsZWN0aW9uX2luZm9fMS5TY2FsYXJUeXBlLkJPT0w6XG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgIGNhc2UgcmVmbGVjdGlvbl9pbmZvXzEuU2NhbGFyVHlwZS5VSU5UNjQ6XG4gICAgICAgIGNhc2UgcmVmbGVjdGlvbl9pbmZvXzEuU2NhbGFyVHlwZS5GSVhFRDY0OlxuICAgICAgICAgICAgcmV0dXJuIHJlZmxlY3Rpb25fbG9uZ19jb252ZXJ0XzEucmVmbGVjdGlvbkxvbmdDb252ZXJ0KHBiX2xvbmdfMS5QYlVMb25nLlpFUk8sIGxvbmdUeXBlKTtcbiAgICAgICAgY2FzZSByZWZsZWN0aW9uX2luZm9fMS5TY2FsYXJUeXBlLklOVDY0OlxuICAgICAgICBjYXNlIHJlZmxlY3Rpb25faW5mb18xLlNjYWxhclR5cGUuU0ZJWEVENjQ6XG4gICAgICAgIGNhc2UgcmVmbGVjdGlvbl9pbmZvXzEuU2NhbGFyVHlwZS5TSU5UNjQ6XG4gICAgICAgICAgICByZXR1cm4gcmVmbGVjdGlvbl9sb25nX2NvbnZlcnRfMS5yZWZsZWN0aW9uTG9uZ0NvbnZlcnQocGJfbG9uZ18xLlBiTG9uZy5aRVJPLCBsb25nVHlwZSk7XG4gICAgICAgIGNhc2UgcmVmbGVjdGlvbl9pbmZvXzEuU2NhbGFyVHlwZS5ET1VCTEU6XG4gICAgICAgIGNhc2UgcmVmbGVjdGlvbl9pbmZvXzEuU2NhbGFyVHlwZS5GTE9BVDpcbiAgICAgICAgICAgIHJldHVybiAwLjA7XG4gICAgICAgIGNhc2UgcmVmbGVjdGlvbl9pbmZvXzEuU2NhbGFyVHlwZS5CWVRFUzpcbiAgICAgICAgICAgIHJldHVybiBuZXcgVWludDhBcnJheSgwKTtcbiAgICAgICAgY2FzZSByZWZsZWN0aW9uX2luZm9fMS5TY2FsYXJUeXBlLlNUUklORzpcbiAgICAgICAgICAgIHJldHVybiBcIlwiO1xuICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgICAgLy8gY2FzZSBTY2FsYXJUeXBlLklOVDMyOlxuICAgICAgICAgICAgLy8gY2FzZSBTY2FsYXJUeXBlLlVJTlQzMjpcbiAgICAgICAgICAgIC8vIGNhc2UgU2NhbGFyVHlwZS5TSU5UMzI6XG4gICAgICAgICAgICAvLyBjYXNlIFNjYWxhclR5cGUuRklYRUQzMjpcbiAgICAgICAgICAgIC8vIGNhc2UgU2NhbGFyVHlwZS5TRklYRUQzMjpcbiAgICAgICAgICAgIHJldHVybiAwO1xuICAgIH1cbn1cbmV4cG9ydHMucmVmbGVjdGlvblNjYWxhckRlZmF1bHQgPSByZWZsZWN0aW9uU2NhbGFyRGVmYXVsdDtcbiIsCiAgICAiXCJ1c2Ugc3RyaWN0XCI7XG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJfX2VzTW9kdWxlXCIsIHsgdmFsdWU6IHRydWUgfSk7XG5leHBvcnRzLlJlZmxlY3Rpb25CaW5hcnlSZWFkZXIgPSB2b2lkIDA7XG5jb25zdCBiaW5hcnlfZm9ybWF0X2NvbnRyYWN0XzEgPSByZXF1aXJlKFwiLi9iaW5hcnktZm9ybWF0LWNvbnRyYWN0XCIpO1xuY29uc3QgcmVmbGVjdGlvbl9pbmZvXzEgPSByZXF1aXJlKFwiLi9yZWZsZWN0aW9uLWluZm9cIik7XG5jb25zdCByZWZsZWN0aW9uX2xvbmdfY29udmVydF8xID0gcmVxdWlyZShcIi4vcmVmbGVjdGlvbi1sb25nLWNvbnZlcnRcIik7XG5jb25zdCByZWZsZWN0aW9uX3NjYWxhcl9kZWZhdWx0XzEgPSByZXF1aXJlKFwiLi9yZWZsZWN0aW9uLXNjYWxhci1kZWZhdWx0XCIpO1xuLyoqXG4gKiBSZWFkcyBwcm90bzMgbWVzc2FnZXMgaW4gYmluYXJ5IGZvcm1hdCB1c2luZyByZWZsZWN0aW9uIGluZm9ybWF0aW9uLlxuICpcbiAqIGh0dHBzOi8vZGV2ZWxvcGVycy5nb29nbGUuY29tL3Byb3RvY29sLWJ1ZmZlcnMvZG9jcy9lbmNvZGluZ1xuICovXG5jbGFzcyBSZWZsZWN0aW9uQmluYXJ5UmVhZGVyIHtcbiAgICBjb25zdHJ1Y3RvcihpbmZvKSB7XG4gICAgICAgIHRoaXMuaW5mbyA9IGluZm87XG4gICAgfVxuICAgIHByZXBhcmUoKSB7XG4gICAgICAgIHZhciBfYTtcbiAgICAgICAgaWYgKCF0aGlzLmZpZWxkTm9Ub0ZpZWxkKSB7XG4gICAgICAgICAgICBjb25zdCBmaWVsZHNJbnB1dCA9IChfYSA9IHRoaXMuaW5mby5maWVsZHMpICE9PSBudWxsICYmIF9hICE9PSB2b2lkIDAgPyBfYSA6IFtdO1xuICAgICAgICAgICAgdGhpcy5maWVsZE5vVG9GaWVsZCA9IG5ldyBNYXAoZmllbGRzSW5wdXQubWFwKGZpZWxkID0+IFtmaWVsZC5ubywgZmllbGRdKSk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgLyoqXG4gICAgICogUmVhZHMgYSBtZXNzYWdlIGZyb20gYmluYXJ5IGZvcm1hdCBpbnRvIHRoZSB0YXJnZXQgbWVzc2FnZS5cbiAgICAgKlxuICAgICAqIFJlcGVhdGVkIGZpZWxkcyBhcmUgYXBwZW5kZWQuIE1hcCBlbnRyaWVzIGFyZSBhZGRlZCwgb3ZlcndyaXRpbmdcbiAgICAgKiBleGlzdGluZyBrZXlzLlxuICAgICAqXG4gICAgICogSWYgYSBtZXNzYWdlIGZpZWxkIGlzIGFscmVhZHkgcHJlc2VudCwgaXQgd2lsbCBiZSBtZXJnZWQgd2l0aCB0aGVcbiAgICAgKiBuZXcgZGF0YS5cbiAgICAgKi9cbiAgICByZWFkKHJlYWRlciwgbWVzc2FnZSwgb3B0aW9ucywgbGVuZ3RoKSB7XG4gICAgICAgIHRoaXMucHJlcGFyZSgpO1xuICAgICAgICBjb25zdCBlbmQgPSBsZW5ndGggPT09IHVuZGVmaW5lZCA/IHJlYWRlci5sZW4gOiByZWFkZXIucG9zICsgbGVuZ3RoO1xuICAgICAgICB3aGlsZSAocmVhZGVyLnBvcyA8IGVuZCkge1xuICAgICAgICAgICAgLy8gcmVhZCB0aGUgdGFnIGFuZCBmaW5kIHRoZSBmaWVsZFxuICAgICAgICAgICAgY29uc3QgW2ZpZWxkTm8sIHdpcmVUeXBlXSA9IHJlYWRlci50YWcoKSwgZmllbGQgPSB0aGlzLmZpZWxkTm9Ub0ZpZWxkLmdldChmaWVsZE5vKTtcbiAgICAgICAgICAgIGlmICghZmllbGQpIHtcbiAgICAgICAgICAgICAgICBsZXQgdSA9IG9wdGlvbnMucmVhZFVua25vd25GaWVsZDtcbiAgICAgICAgICAgICAgICBpZiAodSA9PSBcInRocm93XCIpXG4gICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihgVW5rbm93biBmaWVsZCAke2ZpZWxkTm99ICh3aXJlIHR5cGUgJHt3aXJlVHlwZX0pIGZvciAke3RoaXMuaW5mby50eXBlTmFtZX1gKTtcbiAgICAgICAgICAgICAgICBsZXQgZCA9IHJlYWRlci5za2lwKHdpcmVUeXBlKTtcbiAgICAgICAgICAgICAgICBpZiAodSAhPT0gZmFsc2UpXG4gICAgICAgICAgICAgICAgICAgICh1ID09PSB0cnVlID8gYmluYXJ5X2Zvcm1hdF9jb250cmFjdF8xLlVua25vd25GaWVsZEhhbmRsZXIub25SZWFkIDogdSkodGhpcy5pbmZvLnR5cGVOYW1lLCBtZXNzYWdlLCBmaWVsZE5vLCB3aXJlVHlwZSwgZCk7XG4gICAgICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICAvLyB0YXJnZXQgb2JqZWN0IGZvciB0aGUgZmllbGQgd2UgYXJlIHJlYWRpbmdcbiAgICAgICAgICAgIGxldCB0YXJnZXQgPSBtZXNzYWdlLCByZXBlYXRlZCA9IGZpZWxkLnJlcGVhdCwgbG9jYWxOYW1lID0gZmllbGQubG9jYWxOYW1lO1xuICAgICAgICAgICAgLy8gaWYgZmllbGQgaXMgbWVtYmVyIG9mIG9uZW9mIEFEVCwgdXNlIEFEVCBhcyB0YXJnZXRcbiAgICAgICAgICAgIGlmIChmaWVsZC5vbmVvZikge1xuICAgICAgICAgICAgICAgIHRhcmdldCA9IHRhcmdldFtmaWVsZC5vbmVvZl07XG4gICAgICAgICAgICAgICAgLy8gaWYgb3RoZXIgb25lb2YgbWVtYmVyIHNlbGVjdGVkLCBzZXQgbmV3IEFEVFxuICAgICAgICAgICAgICAgIGlmICh0YXJnZXQub25lb2ZLaW5kICE9PSBsb2NhbE5hbWUpXG4gICAgICAgICAgICAgICAgICAgIHRhcmdldCA9IG1lc3NhZ2VbZmllbGQub25lb2ZdID0ge1xuICAgICAgICAgICAgICAgICAgICAgICAgb25lb2ZLaW5kOiBsb2NhbE5hbWVcbiAgICAgICAgICAgICAgICAgICAgfTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIC8vIHdlIGhhdmUgaGFuZGxlZCBvbmVvZiBhYm92ZSwgd2UganVzdCBoYXZlIHJlYWQgdGhlIHZhbHVlIGludG8gYHRhcmdldFtsb2NhbE5hbWVdYFxuICAgICAgICAgICAgc3dpdGNoIChmaWVsZC5raW5kKSB7XG4gICAgICAgICAgICAgICAgY2FzZSBcInNjYWxhclwiOlxuICAgICAgICAgICAgICAgIGNhc2UgXCJlbnVtXCI6XG4gICAgICAgICAgICAgICAgICAgIGxldCBUID0gZmllbGQua2luZCA9PSBcImVudW1cIiA/IHJlZmxlY3Rpb25faW5mb18xLlNjYWxhclR5cGUuSU5UMzIgOiBmaWVsZC5UO1xuICAgICAgICAgICAgICAgICAgICBsZXQgTCA9IGZpZWxkLmtpbmQgPT0gXCJzY2FsYXJcIiA/IGZpZWxkLkwgOiB1bmRlZmluZWQ7XG4gICAgICAgICAgICAgICAgICAgIGlmIChyZXBlYXRlZCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgbGV0IGFyciA9IHRhcmdldFtsb2NhbE5hbWVdOyAvLyBzYWZlIHRvIGFzc3VtZSBwcmVzZW5jZSBvZiBhcnJheSwgb25lb2YgY2Fubm90IGNvbnRhaW4gcmVwZWF0ZWQgdmFsdWVzXG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAod2lyZVR5cGUgPT0gYmluYXJ5X2Zvcm1hdF9jb250cmFjdF8xLldpcmVUeXBlLkxlbmd0aERlbGltaXRlZCAmJiBUICE9IHJlZmxlY3Rpb25faW5mb18xLlNjYWxhclR5cGUuU1RSSU5HICYmIFQgIT0gcmVmbGVjdGlvbl9pbmZvXzEuU2NhbGFyVHlwZS5CWVRFUykge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxldCBlID0gcmVhZGVyLnVpbnQzMigpICsgcmVhZGVyLnBvcztcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB3aGlsZSAocmVhZGVyLnBvcyA8IGUpXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFyci5wdXNoKHRoaXMuc2NhbGFyKHJlYWRlciwgVCwgTCkpO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgZWxzZVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFyci5wdXNoKHRoaXMuc2NhbGFyKHJlYWRlciwgVCwgTCkpO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIGVsc2VcbiAgICAgICAgICAgICAgICAgICAgICAgIHRhcmdldFtsb2NhbE5hbWVdID0gdGhpcy5zY2FsYXIocmVhZGVyLCBULCBMKTtcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgY2FzZSBcIm1lc3NhZ2VcIjpcbiAgICAgICAgICAgICAgICAgICAgaWYgKHJlcGVhdGVkKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBsZXQgYXJyID0gdGFyZ2V0W2xvY2FsTmFtZV07IC8vIHNhZmUgdG8gYXNzdW1lIHByZXNlbmNlIG9mIGFycmF5LCBvbmVvZiBjYW5ub3QgY29udGFpbiByZXBlYXRlZCB2YWx1ZXNcbiAgICAgICAgICAgICAgICAgICAgICAgIGxldCBtc2cgPSBmaWVsZC5UKCkuaW50ZXJuYWxCaW5hcnlSZWFkKHJlYWRlciwgcmVhZGVyLnVpbnQzMigpLCBvcHRpb25zKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGFyci5wdXNoKG1zZyk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgZWxzZVxuICAgICAgICAgICAgICAgICAgICAgICAgdGFyZ2V0W2xvY2FsTmFtZV0gPSBmaWVsZC5UKCkuaW50ZXJuYWxCaW5hcnlSZWFkKHJlYWRlciwgcmVhZGVyLnVpbnQzMigpLCBvcHRpb25zLCB0YXJnZXRbbG9jYWxOYW1lXSk7XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIGNhc2UgXCJtYXBcIjpcbiAgICAgICAgICAgICAgICAgICAgbGV0IFttYXBLZXksIG1hcFZhbF0gPSB0aGlzLm1hcEVudHJ5KGZpZWxkLCByZWFkZXIsIG9wdGlvbnMpO1xuICAgICAgICAgICAgICAgICAgICAvLyBzYWZlIHRvIGFzc3VtZSBwcmVzZW5jZSBvZiBtYXAgb2JqZWN0LCBvbmVvZiBjYW5ub3QgY29udGFpbiByZXBlYXRlZCB2YWx1ZXNcbiAgICAgICAgICAgICAgICAgICAgdGFyZ2V0W2xvY2FsTmFtZV1bbWFwS2V5XSA9IG1hcFZhbDtcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG4gICAgLyoqXG4gICAgICogUmVhZCBhIG1hcCBmaWVsZCwgZXhwZWN0aW5nIGtleSBmaWVsZCA9IDEsIHZhbHVlIGZpZWxkID0gMlxuICAgICAqL1xuICAgIG1hcEVudHJ5KGZpZWxkLCByZWFkZXIsIG9wdGlvbnMpIHtcbiAgICAgICAgbGV0IGxlbmd0aCA9IHJlYWRlci51aW50MzIoKTtcbiAgICAgICAgbGV0IGVuZCA9IHJlYWRlci5wb3MgKyBsZW5ndGg7XG4gICAgICAgIGxldCBrZXkgPSB1bmRlZmluZWQ7IC8vIGphdmFzY3JpcHQgb25seSBhbGxvd3MgbnVtYmVyIG9yIHN0cmluZyBmb3Igb2JqZWN0IHByb3BlcnRpZXNcbiAgICAgICAgbGV0IHZhbCA9IHVuZGVmaW5lZDtcbiAgICAgICAgd2hpbGUgKHJlYWRlci5wb3MgPCBlbmQpIHtcbiAgICAgICAgICAgIGxldCBbZmllbGRObywgd2lyZVR5cGVdID0gcmVhZGVyLnRhZygpO1xuICAgICAgICAgICAgc3dpdGNoIChmaWVsZE5vKSB7XG4gICAgICAgICAgICAgICAgY2FzZSAxOlxuICAgICAgICAgICAgICAgICAgICBpZiAoZmllbGQuSyA9PSByZWZsZWN0aW9uX2luZm9fMS5TY2FsYXJUeXBlLkJPT0wpXG4gICAgICAgICAgICAgICAgICAgICAgICBrZXkgPSByZWFkZXIuYm9vbCgpLnRvU3RyaW5nKCk7XG4gICAgICAgICAgICAgICAgICAgIGVsc2VcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIGxvbmcgdHlwZXMgYXJlIHJlYWQgYXMgc3RyaW5nLCBudW1iZXIgdHlwZXMgYXJlIG9rYXkgYXMgbnVtYmVyXG4gICAgICAgICAgICAgICAgICAgICAgICBrZXkgPSB0aGlzLnNjYWxhcihyZWFkZXIsIGZpZWxkLkssIHJlZmxlY3Rpb25faW5mb18xLkxvbmdUeXBlLlNUUklORyk7XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIGNhc2UgMjpcbiAgICAgICAgICAgICAgICAgICAgc3dpdGNoIChmaWVsZC5WLmtpbmQpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgXCJzY2FsYXJcIjpcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YWwgPSB0aGlzLnNjYWxhcihyZWFkZXIsIGZpZWxkLlYuVCwgZmllbGQuVi5MKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgXCJlbnVtXCI6XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFsID0gcmVhZGVyLmludDMyKCk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgICAgICAgICBjYXNlIFwibWVzc2FnZVwiOlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhbCA9IGZpZWxkLlYuVCgpLmludGVybmFsQmluYXJ5UmVhZChyZWFkZXIsIHJlYWRlci51aW50MzIoKSwgb3B0aW9ucyk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBVbmtub3duIGZpZWxkICR7ZmllbGROb30gKHdpcmUgdHlwZSAke3dpcmVUeXBlfSkgaW4gbWFwIGVudHJ5IGZvciAke3RoaXMuaW5mby50eXBlTmFtZX0jJHtmaWVsZC5uYW1lfWApO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGlmIChrZXkgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgbGV0IGtleVJhdyA9IHJlZmxlY3Rpb25fc2NhbGFyX2RlZmF1bHRfMS5yZWZsZWN0aW9uU2NhbGFyRGVmYXVsdChmaWVsZC5LKTtcbiAgICAgICAgICAgIGtleSA9IGZpZWxkLksgPT0gcmVmbGVjdGlvbl9pbmZvXzEuU2NhbGFyVHlwZS5CT09MID8ga2V5UmF3LnRvU3RyaW5nKCkgOiBrZXlSYXc7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHZhbCA9PT0gdW5kZWZpbmVkKVxuICAgICAgICAgICAgc3dpdGNoIChmaWVsZC5WLmtpbmQpIHtcbiAgICAgICAgICAgICAgICBjYXNlIFwic2NhbGFyXCI6XG4gICAgICAgICAgICAgICAgICAgIHZhbCA9IHJlZmxlY3Rpb25fc2NhbGFyX2RlZmF1bHRfMS5yZWZsZWN0aW9uU2NhbGFyRGVmYXVsdChmaWVsZC5WLlQsIGZpZWxkLlYuTCk7XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIGNhc2UgXCJlbnVtXCI6XG4gICAgICAgICAgICAgICAgICAgIHZhbCA9IDA7XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIGNhc2UgXCJtZXNzYWdlXCI6XG4gICAgICAgICAgICAgICAgICAgIHZhbCA9IGZpZWxkLlYuVCgpLmNyZWF0ZSgpO1xuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIH1cbiAgICAgICAgcmV0dXJuIFtrZXksIHZhbF07XG4gICAgfVxuICAgIHNjYWxhcihyZWFkZXIsIHR5cGUsIGxvbmdUeXBlKSB7XG4gICAgICAgIHN3aXRjaCAodHlwZSkge1xuICAgICAgICAgICAgY2FzZSByZWZsZWN0aW9uX2luZm9fMS5TY2FsYXJUeXBlLklOVDMyOlxuICAgICAgICAgICAgICAgIHJldHVybiByZWFkZXIuaW50MzIoKTtcbiAgICAgICAgICAgIGNhc2UgcmVmbGVjdGlvbl9pbmZvXzEuU2NhbGFyVHlwZS5TVFJJTkc6XG4gICAgICAgICAgICAgICAgcmV0dXJuIHJlYWRlci5zdHJpbmcoKTtcbiAgICAgICAgICAgIGNhc2UgcmVmbGVjdGlvbl9pbmZvXzEuU2NhbGFyVHlwZS5CT09MOlxuICAgICAgICAgICAgICAgIHJldHVybiByZWFkZXIuYm9vbCgpO1xuICAgICAgICAgICAgY2FzZSByZWZsZWN0aW9uX2luZm9fMS5TY2FsYXJUeXBlLkRPVUJMRTpcbiAgICAgICAgICAgICAgICByZXR1cm4gcmVhZGVyLmRvdWJsZSgpO1xuICAgICAgICAgICAgY2FzZSByZWZsZWN0aW9uX2luZm9fMS5TY2FsYXJUeXBlLkZMT0FUOlxuICAgICAgICAgICAgICAgIHJldHVybiByZWFkZXIuZmxvYXQoKTtcbiAgICAgICAgICAgIGNhc2UgcmVmbGVjdGlvbl9pbmZvXzEuU2NhbGFyVHlwZS5JTlQ2NDpcbiAgICAgICAgICAgICAgICByZXR1cm4gcmVmbGVjdGlvbl9sb25nX2NvbnZlcnRfMS5yZWZsZWN0aW9uTG9uZ0NvbnZlcnQocmVhZGVyLmludDY0KCksIGxvbmdUeXBlKTtcbiAgICAgICAgICAgIGNhc2UgcmVmbGVjdGlvbl9pbmZvXzEuU2NhbGFyVHlwZS5VSU5UNjQ6XG4gICAgICAgICAgICAgICAgcmV0dXJuIHJlZmxlY3Rpb25fbG9uZ19jb252ZXJ0XzEucmVmbGVjdGlvbkxvbmdDb252ZXJ0KHJlYWRlci51aW50NjQoKSwgbG9uZ1R5cGUpO1xuICAgICAgICAgICAgY2FzZSByZWZsZWN0aW9uX2luZm9fMS5TY2FsYXJUeXBlLkZJWEVENjQ6XG4gICAgICAgICAgICAgICAgcmV0dXJuIHJlZmxlY3Rpb25fbG9uZ19jb252ZXJ0XzEucmVmbGVjdGlvbkxvbmdDb252ZXJ0KHJlYWRlci5maXhlZDY0KCksIGxvbmdUeXBlKTtcbiAgICAgICAgICAgIGNhc2UgcmVmbGVjdGlvbl9pbmZvXzEuU2NhbGFyVHlwZS5GSVhFRDMyOlxuICAgICAgICAgICAgICAgIHJldHVybiByZWFkZXIuZml4ZWQzMigpO1xuICAgICAgICAgICAgY2FzZSByZWZsZWN0aW9uX2luZm9fMS5TY2FsYXJUeXBlLkJZVEVTOlxuICAgICAgICAgICAgICAgIHJldHVybiByZWFkZXIuYnl0ZXMoKTtcbiAgICAgICAgICAgIGNhc2UgcmVmbGVjdGlvbl9pbmZvXzEuU2NhbGFyVHlwZS5VSU5UMzI6XG4gICAgICAgICAgICAgICAgcmV0dXJuIHJlYWRlci51aW50MzIoKTtcbiAgICAgICAgICAgIGNhc2UgcmVmbGVjdGlvbl9pbmZvXzEuU2NhbGFyVHlwZS5TRklYRUQzMjpcbiAgICAgICAgICAgICAgICByZXR1cm4gcmVhZGVyLnNmaXhlZDMyKCk7XG4gICAgICAgICAgICBjYXNlIHJlZmxlY3Rpb25faW5mb18xLlNjYWxhclR5cGUuU0ZJWEVENjQ6XG4gICAgICAgICAgICAgICAgcmV0dXJuIHJlZmxlY3Rpb25fbG9uZ19jb252ZXJ0XzEucmVmbGVjdGlvbkxvbmdDb252ZXJ0KHJlYWRlci5zZml4ZWQ2NCgpLCBsb25nVHlwZSk7XG4gICAgICAgICAgICBjYXNlIHJlZmxlY3Rpb25faW5mb18xLlNjYWxhclR5cGUuU0lOVDMyOlxuICAgICAgICAgICAgICAgIHJldHVybiByZWFkZXIuc2ludDMyKCk7XG4gICAgICAgICAgICBjYXNlIHJlZmxlY3Rpb25faW5mb18xLlNjYWxhclR5cGUuU0lOVDY0OlxuICAgICAgICAgICAgICAgIHJldHVybiByZWZsZWN0aW9uX2xvbmdfY29udmVydF8xLnJlZmxlY3Rpb25Mb25nQ29udmVydChyZWFkZXIuc2ludDY0KCksIGxvbmdUeXBlKTtcbiAgICAgICAgfVxuICAgIH1cbn1cbmV4cG9ydHMuUmVmbGVjdGlvbkJpbmFyeVJlYWRlciA9IFJlZmxlY3Rpb25CaW5hcnlSZWFkZXI7XG4iLAogICAgIlwidXNlIHN0cmljdFwiO1xuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiX19lc01vZHVsZVwiLCB7IHZhbHVlOiB0cnVlIH0pO1xuZXhwb3J0cy5SZWZsZWN0aW9uQmluYXJ5V3JpdGVyID0gdm9pZCAwO1xuY29uc3QgYmluYXJ5X2Zvcm1hdF9jb250cmFjdF8xID0gcmVxdWlyZShcIi4vYmluYXJ5LWZvcm1hdC1jb250cmFjdFwiKTtcbmNvbnN0IHJlZmxlY3Rpb25faW5mb18xID0gcmVxdWlyZShcIi4vcmVmbGVjdGlvbi1pbmZvXCIpO1xuY29uc3QgYXNzZXJ0XzEgPSByZXF1aXJlKFwiLi9hc3NlcnRcIik7XG5jb25zdCBwYl9sb25nXzEgPSByZXF1aXJlKFwiLi9wYi1sb25nXCIpO1xuLyoqXG4gKiBXcml0ZXMgcHJvdG8zIG1lc3NhZ2VzIGluIGJpbmFyeSBmb3JtYXQgdXNpbmcgcmVmbGVjdGlvbiBpbmZvcm1hdGlvbi5cbiAqXG4gKiBodHRwczovL2RldmVsb3BlcnMuZ29vZ2xlLmNvbS9wcm90b2NvbC1idWZmZXJzL2RvY3MvZW5jb2RpbmdcbiAqL1xuY2xhc3MgUmVmbGVjdGlvbkJpbmFyeVdyaXRlciB7XG4gICAgY29uc3RydWN0b3IoaW5mbykge1xuICAgICAgICB0aGlzLmluZm8gPSBpbmZvO1xuICAgIH1cbiAgICBwcmVwYXJlKCkge1xuICAgICAgICBpZiAoIXRoaXMuZmllbGRzKSB7XG4gICAgICAgICAgICBjb25zdCBmaWVsZHNJbnB1dCA9IHRoaXMuaW5mby5maWVsZHMgPyB0aGlzLmluZm8uZmllbGRzLmNvbmNhdCgpIDogW107XG4gICAgICAgICAgICB0aGlzLmZpZWxkcyA9IGZpZWxkc0lucHV0LnNvcnQoKGEsIGIpID0+IGEubm8gLSBiLm5vKTtcbiAgICAgICAgfVxuICAgIH1cbiAgICAvKipcbiAgICAgKiBXcml0ZXMgdGhlIG1lc3NhZ2UgdG8gYmluYXJ5IGZvcm1hdC5cbiAgICAgKi9cbiAgICB3cml0ZShtZXNzYWdlLCB3cml0ZXIsIG9wdGlvbnMpIHtcbiAgICAgICAgdGhpcy5wcmVwYXJlKCk7XG4gICAgICAgIGZvciAoY29uc3QgZmllbGQgb2YgdGhpcy5maWVsZHMpIHtcbiAgICAgICAgICAgIGxldCB2YWx1ZSwgLy8gdGhpcyB3aWxsIGJlIG91ciBmaWVsZCB2YWx1ZSwgd2hldGhlciBpdCBpcyBtZW1iZXIgb2YgYSBvbmVvZiBvciBub3RcbiAgICAgICAgICAgIGVtaXREZWZhdWx0LCAvLyB3aGV0aGVyIHdlIGVtaXQgdGhlIGRlZmF1bHQgdmFsdWUgKG9ubHkgdHJ1ZSBmb3Igb25lb2YgbWVtYmVycylcbiAgICAgICAgICAgIHJlcGVhdGVkID0gZmllbGQucmVwZWF0LCBsb2NhbE5hbWUgPSBmaWVsZC5sb2NhbE5hbWU7XG4gICAgICAgICAgICAvLyBoYW5kbGUgb25lb2YgQURUXG4gICAgICAgICAgICBpZiAoZmllbGQub25lb2YpIHtcbiAgICAgICAgICAgICAgICBjb25zdCBncm91cCA9IG1lc3NhZ2VbZmllbGQub25lb2ZdO1xuICAgICAgICAgICAgICAgIGlmIChncm91cC5vbmVvZktpbmQgIT09IGxvY2FsTmFtZSlcbiAgICAgICAgICAgICAgICAgICAgY29udGludWU7IC8vIGlmIGZpZWxkIGlzIG5vdCBzZWxlY3RlZCwgc2tpcFxuICAgICAgICAgICAgICAgIHZhbHVlID0gZ3JvdXBbbG9jYWxOYW1lXTtcbiAgICAgICAgICAgICAgICBlbWl0RGVmYXVsdCA9IHRydWU7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICB2YWx1ZSA9IG1lc3NhZ2VbbG9jYWxOYW1lXTtcbiAgICAgICAgICAgICAgICBlbWl0RGVmYXVsdCA9IGZhbHNlO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgLy8gd2UgaGF2ZSBoYW5kbGVkIG9uZW9mIGFib3ZlLiB3ZSBqdXN0IGhhdmUgdG8gaG9ub3IgYGVtaXREZWZhdWx0YC5cbiAgICAgICAgICAgIHN3aXRjaCAoZmllbGQua2luZCkge1xuICAgICAgICAgICAgICAgIGNhc2UgXCJzY2FsYXJcIjpcbiAgICAgICAgICAgICAgICBjYXNlIFwiZW51bVwiOlxuICAgICAgICAgICAgICAgICAgICBsZXQgVCA9IGZpZWxkLmtpbmQgPT0gXCJlbnVtXCIgPyByZWZsZWN0aW9uX2luZm9fMS5TY2FsYXJUeXBlLklOVDMyIDogZmllbGQuVDtcbiAgICAgICAgICAgICAgICAgICAgaWYgKHJlcGVhdGVkKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBhc3NlcnRfMS5hc3NlcnQoQXJyYXkuaXNBcnJheSh2YWx1ZSkpO1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHJlcGVhdGVkID09IHJlZmxlY3Rpb25faW5mb18xLlJlcGVhdFR5cGUuUEFDS0VEKVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMucGFja2VkKHdyaXRlciwgVCwgZmllbGQubm8sIHZhbHVlKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGVsc2VcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3IgKGNvbnN0IGl0ZW0gb2YgdmFsdWUpXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuc2NhbGFyKHdyaXRlciwgVCwgZmllbGQubm8sIGl0ZW0sIHRydWUpO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIGVsc2UgaWYgKHZhbHVlID09PSB1bmRlZmluZWQpXG4gICAgICAgICAgICAgICAgICAgICAgICBhc3NlcnRfMS5hc3NlcnQoZmllbGQub3B0KTtcbiAgICAgICAgICAgICAgICAgICAgZWxzZVxuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5zY2FsYXIod3JpdGVyLCBULCBmaWVsZC5ubywgdmFsdWUsIGVtaXREZWZhdWx0IHx8IGZpZWxkLm9wdCk7XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIGNhc2UgXCJtZXNzYWdlXCI6XG4gICAgICAgICAgICAgICAgICAgIGlmIChyZXBlYXRlZCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgYXNzZXJ0XzEuYXNzZXJ0KEFycmF5LmlzQXJyYXkodmFsdWUpKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGZvciAoY29uc3QgaXRlbSBvZiB2YWx1ZSlcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLm1lc3NhZ2Uod3JpdGVyLCBvcHRpb25zLCBmaWVsZC5UKCksIGZpZWxkLm5vLCBpdGVtKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMubWVzc2FnZSh3cml0ZXIsIG9wdGlvbnMsIGZpZWxkLlQoKSwgZmllbGQubm8sIHZhbHVlKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICBjYXNlIFwibWFwXCI6XG4gICAgICAgICAgICAgICAgICAgIGFzc2VydF8xLmFzc2VydCh0eXBlb2YgdmFsdWUgPT0gJ29iamVjdCcgJiYgdmFsdWUgIT09IG51bGwpO1xuICAgICAgICAgICAgICAgICAgICBmb3IgKGNvbnN0IFtrZXksIHZhbF0gb2YgT2JqZWN0LmVudHJpZXModmFsdWUpKVxuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5tYXBFbnRyeSh3cml0ZXIsIG9wdGlvbnMsIGZpZWxkLCBrZXksIHZhbCk7XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGxldCB1ID0gb3B0aW9ucy53cml0ZVVua25vd25GaWVsZHM7XG4gICAgICAgIGlmICh1ICE9PSBmYWxzZSlcbiAgICAgICAgICAgICh1ID09PSB0cnVlID8gYmluYXJ5X2Zvcm1hdF9jb250cmFjdF8xLlVua25vd25GaWVsZEhhbmRsZXIub25Xcml0ZSA6IHUpKHRoaXMuaW5mby50eXBlTmFtZSwgbWVzc2FnZSwgd3JpdGVyKTtcbiAgICB9XG4gICAgbWFwRW50cnkod3JpdGVyLCBvcHRpb25zLCBmaWVsZCwga2V5LCB2YWx1ZSkge1xuICAgICAgICB3cml0ZXIudGFnKGZpZWxkLm5vLCBiaW5hcnlfZm9ybWF0X2NvbnRyYWN0XzEuV2lyZVR5cGUuTGVuZ3RoRGVsaW1pdGVkKTtcbiAgICAgICAgd3JpdGVyLmZvcmsoKTtcbiAgICAgICAgLy8gamF2YXNjcmlwdCBvbmx5IGFsbG93cyBudW1iZXIgb3Igc3RyaW5nIGZvciBvYmplY3QgcHJvcGVydGllc1xuICAgICAgICAvLyB3ZSBjb252ZXJ0IGZyb20gb3VyIHJlcHJlc2VudGF0aW9uIHRvIHRoZSBwcm90b2J1ZiB0eXBlXG4gICAgICAgIGxldCBrZXlWYWx1ZSA9IGtleTtcbiAgICAgICAgc3dpdGNoIChmaWVsZC5LKSB7XG4gICAgICAgICAgICBjYXNlIHJlZmxlY3Rpb25faW5mb18xLlNjYWxhclR5cGUuSU5UMzI6XG4gICAgICAgICAgICBjYXNlIHJlZmxlY3Rpb25faW5mb18xLlNjYWxhclR5cGUuRklYRUQzMjpcbiAgICAgICAgICAgIGNhc2UgcmVmbGVjdGlvbl9pbmZvXzEuU2NhbGFyVHlwZS5VSU5UMzI6XG4gICAgICAgICAgICBjYXNlIHJlZmxlY3Rpb25faW5mb18xLlNjYWxhclR5cGUuU0ZJWEVEMzI6XG4gICAgICAgICAgICBjYXNlIHJlZmxlY3Rpb25faW5mb18xLlNjYWxhclR5cGUuU0lOVDMyOlxuICAgICAgICAgICAgICAgIGtleVZhbHVlID0gTnVtYmVyLnBhcnNlSW50KGtleSk7XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICBjYXNlIHJlZmxlY3Rpb25faW5mb18xLlNjYWxhclR5cGUuQk9PTDpcbiAgICAgICAgICAgICAgICBhc3NlcnRfMS5hc3NlcnQoa2V5ID09ICd0cnVlJyB8fCBrZXkgPT0gJ2ZhbHNlJyk7XG4gICAgICAgICAgICAgICAga2V5VmFsdWUgPSBrZXkgPT0gJ3RydWUnO1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG4gICAgICAgIC8vIHdyaXRlIGtleSwgZXhwZWN0aW5nIGtleSBmaWVsZCBudW1iZXIgPSAxXG4gICAgICAgIHRoaXMuc2NhbGFyKHdyaXRlciwgZmllbGQuSywgMSwga2V5VmFsdWUsIHRydWUpO1xuICAgICAgICAvLyB3cml0ZSB2YWx1ZSwgZXhwZWN0aW5nIHZhbHVlIGZpZWxkIG51bWJlciA9IDJcbiAgICAgICAgc3dpdGNoIChmaWVsZC5WLmtpbmQpIHtcbiAgICAgICAgICAgIGNhc2UgJ3NjYWxhcic6XG4gICAgICAgICAgICAgICAgdGhpcy5zY2FsYXIod3JpdGVyLCBmaWVsZC5WLlQsIDIsIHZhbHVlLCB0cnVlKTtcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIGNhc2UgJ2VudW0nOlxuICAgICAgICAgICAgICAgIHRoaXMuc2NhbGFyKHdyaXRlciwgcmVmbGVjdGlvbl9pbmZvXzEuU2NhbGFyVHlwZS5JTlQzMiwgMiwgdmFsdWUsIHRydWUpO1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgY2FzZSAnbWVzc2FnZSc6XG4gICAgICAgICAgICAgICAgdGhpcy5tZXNzYWdlKHdyaXRlciwgb3B0aW9ucywgZmllbGQuVi5UKCksIDIsIHZhbHVlKTtcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuICAgICAgICB3cml0ZXIuam9pbigpO1xuICAgIH1cbiAgICBtZXNzYWdlKHdyaXRlciwgb3B0aW9ucywgaGFuZGxlciwgZmllbGRObywgdmFsdWUpIHtcbiAgICAgICAgaWYgKHZhbHVlID09PSB1bmRlZmluZWQpXG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIGhhbmRsZXIuaW50ZXJuYWxCaW5hcnlXcml0ZSh2YWx1ZSwgd3JpdGVyLnRhZyhmaWVsZE5vLCBiaW5hcnlfZm9ybWF0X2NvbnRyYWN0XzEuV2lyZVR5cGUuTGVuZ3RoRGVsaW1pdGVkKS5mb3JrKCksIG9wdGlvbnMpO1xuICAgICAgICB3cml0ZXIuam9pbigpO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBXcml0ZSBhIHNpbmdsZSBzY2FsYXIgdmFsdWUuXG4gICAgICovXG4gICAgc2NhbGFyKHdyaXRlciwgdHlwZSwgZmllbGRObywgdmFsdWUsIGVtaXREZWZhdWx0KSB7XG4gICAgICAgIGxldCBbd2lyZVR5cGUsIG1ldGhvZCwgaXNEZWZhdWx0XSA9IHRoaXMuc2NhbGFySW5mbyh0eXBlLCB2YWx1ZSk7XG4gICAgICAgIGlmICghaXNEZWZhdWx0IHx8IGVtaXREZWZhdWx0KSB7XG4gICAgICAgICAgICB3cml0ZXIudGFnKGZpZWxkTm8sIHdpcmVUeXBlKTtcbiAgICAgICAgICAgIHdyaXRlclttZXRob2RdKHZhbHVlKTtcbiAgICAgICAgfVxuICAgIH1cbiAgICAvKipcbiAgICAgKiBXcml0ZSBhbiBhcnJheSBvZiBzY2FsYXIgdmFsdWVzIGluIHBhY2tlZCBmb3JtYXQuXG4gICAgICovXG4gICAgcGFja2VkKHdyaXRlciwgdHlwZSwgZmllbGRObywgdmFsdWUpIHtcbiAgICAgICAgaWYgKCF2YWx1ZS5sZW5ndGgpXG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIGFzc2VydF8xLmFzc2VydCh0eXBlICE9PSByZWZsZWN0aW9uX2luZm9fMS5TY2FsYXJUeXBlLkJZVEVTICYmIHR5cGUgIT09IHJlZmxlY3Rpb25faW5mb18xLlNjYWxhclR5cGUuU1RSSU5HKTtcbiAgICAgICAgLy8gd3JpdGUgdGFnXG4gICAgICAgIHdyaXRlci50YWcoZmllbGRObywgYmluYXJ5X2Zvcm1hdF9jb250cmFjdF8xLldpcmVUeXBlLkxlbmd0aERlbGltaXRlZCk7XG4gICAgICAgIC8vIGJlZ2luIGxlbmd0aC1kZWxpbWl0ZWRcbiAgICAgICAgd3JpdGVyLmZvcmsoKTtcbiAgICAgICAgLy8gd3JpdGUgdmFsdWVzIHdpdGhvdXQgdGFnc1xuICAgICAgICBsZXQgWywgbWV0aG9kLF0gPSB0aGlzLnNjYWxhckluZm8odHlwZSk7XG4gICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgdmFsdWUubGVuZ3RoOyBpKyspXG4gICAgICAgICAgICB3cml0ZXJbbWV0aG9kXSh2YWx1ZVtpXSk7XG4gICAgICAgIC8vIGVuZCBsZW5ndGggZGVsaW1pdGVkXG4gICAgICAgIHdyaXRlci5qb2luKCk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIEdldCBpbmZvcm1hdGlvbiBmb3Igd3JpdGluZyBhIHNjYWxhciB2YWx1ZS5cbiAgICAgKlxuICAgICAqIFJldHVybnMgdHVwbGU6XG4gICAgICogWzBdOiBhcHByb3ByaWF0ZSBXaXJlVHlwZVxuICAgICAqIFsxXTogbmFtZSBvZiB0aGUgYXBwcm9wcmlhdGUgbWV0aG9kIG9mIElCaW5hcnlXcml0ZXJcbiAgICAgKiBbMl06IHdoZXRoZXIgdGhlIGdpdmVuIHZhbHVlIGlzIGEgZGVmYXVsdCB2YWx1ZVxuICAgICAqXG4gICAgICogSWYgYXJndW1lbnQgYHZhbHVlYCBpcyBvbWl0dGVkLCBbMl0gaXMgYWx3YXlzIGZhbHNlLlxuICAgICAqL1xuICAgIHNjYWxhckluZm8odHlwZSwgdmFsdWUpIHtcbiAgICAgICAgbGV0IHQgPSBiaW5hcnlfZm9ybWF0X2NvbnRyYWN0XzEuV2lyZVR5cGUuVmFyaW50O1xuICAgICAgICBsZXQgbTtcbiAgICAgICAgbGV0IGkgPSB2YWx1ZSA9PT0gdW5kZWZpbmVkO1xuICAgICAgICBsZXQgZCA9IHZhbHVlID09PSAwO1xuICAgICAgICBzd2l0Y2ggKHR5cGUpIHtcbiAgICAgICAgICAgIGNhc2UgcmVmbGVjdGlvbl9pbmZvXzEuU2NhbGFyVHlwZS5JTlQzMjpcbiAgICAgICAgICAgICAgICBtID0gXCJpbnQzMlwiO1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgY2FzZSByZWZsZWN0aW9uX2luZm9fMS5TY2FsYXJUeXBlLlNUUklORzpcbiAgICAgICAgICAgICAgICBkID0gaSB8fCAhdmFsdWUubGVuZ3RoO1xuICAgICAgICAgICAgICAgIHQgPSBiaW5hcnlfZm9ybWF0X2NvbnRyYWN0XzEuV2lyZVR5cGUuTGVuZ3RoRGVsaW1pdGVkO1xuICAgICAgICAgICAgICAgIG0gPSBcInN0cmluZ1wiO1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgY2FzZSByZWZsZWN0aW9uX2luZm9fMS5TY2FsYXJUeXBlLkJPT0w6XG4gICAgICAgICAgICAgICAgZCA9IHZhbHVlID09PSBmYWxzZTtcbiAgICAgICAgICAgICAgICBtID0gXCJib29sXCI7XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICBjYXNlIHJlZmxlY3Rpb25faW5mb18xLlNjYWxhclR5cGUuVUlOVDMyOlxuICAgICAgICAgICAgICAgIG0gPSBcInVpbnQzMlwiO1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgY2FzZSByZWZsZWN0aW9uX2luZm9fMS5TY2FsYXJUeXBlLkRPVUJMRTpcbiAgICAgICAgICAgICAgICB0ID0gYmluYXJ5X2Zvcm1hdF9jb250cmFjdF8xLldpcmVUeXBlLkJpdDY0O1xuICAgICAgICAgICAgICAgIG0gPSBcImRvdWJsZVwiO1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgY2FzZSByZWZsZWN0aW9uX2luZm9fMS5TY2FsYXJUeXBlLkZMT0FUOlxuICAgICAgICAgICAgICAgIHQgPSBiaW5hcnlfZm9ybWF0X2NvbnRyYWN0XzEuV2lyZVR5cGUuQml0MzI7XG4gICAgICAgICAgICAgICAgbSA9IFwiZmxvYXRcIjtcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIGNhc2UgcmVmbGVjdGlvbl9pbmZvXzEuU2NhbGFyVHlwZS5JTlQ2NDpcbiAgICAgICAgICAgICAgICBkID0gaSB8fCBwYl9sb25nXzEuUGJMb25nLmZyb20odmFsdWUpLmlzWmVybygpO1xuICAgICAgICAgICAgICAgIG0gPSBcImludDY0XCI7XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICBjYXNlIHJlZmxlY3Rpb25faW5mb18xLlNjYWxhclR5cGUuVUlOVDY0OlxuICAgICAgICAgICAgICAgIGQgPSBpIHx8IHBiX2xvbmdfMS5QYlVMb25nLmZyb20odmFsdWUpLmlzWmVybygpO1xuICAgICAgICAgICAgICAgIG0gPSBcInVpbnQ2NFwiO1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgY2FzZSByZWZsZWN0aW9uX2luZm9fMS5TY2FsYXJUeXBlLkZJWEVENjQ6XG4gICAgICAgICAgICAgICAgZCA9IGkgfHwgcGJfbG9uZ18xLlBiVUxvbmcuZnJvbSh2YWx1ZSkuaXNaZXJvKCk7XG4gICAgICAgICAgICAgICAgdCA9IGJpbmFyeV9mb3JtYXRfY29udHJhY3RfMS5XaXJlVHlwZS5CaXQ2NDtcbiAgICAgICAgICAgICAgICBtID0gXCJmaXhlZDY0XCI7XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICBjYXNlIHJlZmxlY3Rpb25faW5mb18xLlNjYWxhclR5cGUuQllURVM6XG4gICAgICAgICAgICAgICAgZCA9IGkgfHwgIXZhbHVlLmJ5dGVMZW5ndGg7XG4gICAgICAgICAgICAgICAgdCA9IGJpbmFyeV9mb3JtYXRfY29udHJhY3RfMS5XaXJlVHlwZS5MZW5ndGhEZWxpbWl0ZWQ7XG4gICAgICAgICAgICAgICAgbSA9IFwiYnl0ZXNcIjtcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIGNhc2UgcmVmbGVjdGlvbl9pbmZvXzEuU2NhbGFyVHlwZS5GSVhFRDMyOlxuICAgICAgICAgICAgICAgIHQgPSBiaW5hcnlfZm9ybWF0X2NvbnRyYWN0XzEuV2lyZVR5cGUuQml0MzI7XG4gICAgICAgICAgICAgICAgbSA9IFwiZml4ZWQzMlwiO1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgY2FzZSByZWZsZWN0aW9uX2luZm9fMS5TY2FsYXJUeXBlLlNGSVhFRDMyOlxuICAgICAgICAgICAgICAgIHQgPSBiaW5hcnlfZm9ybWF0X2NvbnRyYWN0XzEuV2lyZVR5cGUuQml0MzI7XG4gICAgICAgICAgICAgICAgbSA9IFwic2ZpeGVkMzJcIjtcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIGNhc2UgcmVmbGVjdGlvbl9pbmZvXzEuU2NhbGFyVHlwZS5TRklYRUQ2NDpcbiAgICAgICAgICAgICAgICBkID0gaSB8fCBwYl9sb25nXzEuUGJMb25nLmZyb20odmFsdWUpLmlzWmVybygpO1xuICAgICAgICAgICAgICAgIHQgPSBiaW5hcnlfZm9ybWF0X2NvbnRyYWN0XzEuV2lyZVR5cGUuQml0NjQ7XG4gICAgICAgICAgICAgICAgbSA9IFwic2ZpeGVkNjRcIjtcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIGNhc2UgcmVmbGVjdGlvbl9pbmZvXzEuU2NhbGFyVHlwZS5TSU5UMzI6XG4gICAgICAgICAgICAgICAgbSA9IFwic2ludDMyXCI7XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICBjYXNlIHJlZmxlY3Rpb25faW5mb18xLlNjYWxhclR5cGUuU0lOVDY0OlxuICAgICAgICAgICAgICAgIGQgPSBpIHx8IHBiX2xvbmdfMS5QYkxvbmcuZnJvbSh2YWx1ZSkuaXNaZXJvKCk7XG4gICAgICAgICAgICAgICAgbSA9IFwic2ludDY0XCI7XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIFt0LCBtLCBpIHx8IGRdO1xuICAgIH1cbn1cbmV4cG9ydHMuUmVmbGVjdGlvbkJpbmFyeVdyaXRlciA9IFJlZmxlY3Rpb25CaW5hcnlXcml0ZXI7XG4iLAogICAgIlwidXNlIHN0cmljdFwiO1xuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiX19lc01vZHVsZVwiLCB7IHZhbHVlOiB0cnVlIH0pO1xuZXhwb3J0cy5yZWZsZWN0aW9uQ3JlYXRlID0gdm9pZCAwO1xuY29uc3QgcmVmbGVjdGlvbl9zY2FsYXJfZGVmYXVsdF8xID0gcmVxdWlyZShcIi4vcmVmbGVjdGlvbi1zY2FsYXItZGVmYXVsdFwiKTtcbmNvbnN0IG1lc3NhZ2VfdHlwZV9jb250cmFjdF8xID0gcmVxdWlyZShcIi4vbWVzc2FnZS10eXBlLWNvbnRyYWN0XCIpO1xuLyoqXG4gKiBDcmVhdGVzIGFuIGluc3RhbmNlIG9mIHRoZSBnZW5lcmljIG1lc3NhZ2UsIHVzaW5nIHRoZSBmaWVsZFxuICogaW5mb3JtYXRpb24uXG4gKi9cbmZ1bmN0aW9uIHJlZmxlY3Rpb25DcmVhdGUodHlwZSkge1xuICAgIC8qKlxuICAgICAqIFRoaXMgdGVybmFyeSBjYW4gYmUgcmVtb3ZlZCBpbiB0aGUgbmV4dCBtYWpvciB2ZXJzaW9uLlxuICAgICAqIFRoZSBgT2JqZWN0LmNyZWF0ZSgpYCBjb2RlIHBhdGggdXRpbGl6ZXMgYSBuZXcgYG1lc3NhZ2VQcm90b3R5cGVgXG4gICAgICogcHJvcGVydHkgb24gdGhlIGBJTWVzc2FnZVR5cGVgIHdoaWNoIGhhcyB0aGlzIHNhbWUgYE1FU1NBR0VfVFlQRWBcbiAgICAgKiBub24tZW51bWVyYWJsZSBwcm9wZXJ0eSBvbiBpdC4gRG9pbmcgaXQgdGhpcyB3YXkgbWVhbnMgdGhhdCB3ZSBvbmx5XG4gICAgICogcGF5IHRoZSBjb3N0IG9mIGBPYmplY3QuZGVmaW5lUHJvcGVydHkoKWAgb25jZSBwZXIgYElNZXNzYWdlVHlwZWBcbiAgICAgKiBjbGFzcyBvZiBvbmNlIHBlciBcImluc3RhbmNlXCIuIFRoZSBmYWxzeSBjb2RlIHBhdGggaXMgb25seSBwcm92aWRlZFxuICAgICAqIGZvciBiYWNrd2FyZHMgY29tcGF0aWJpbGl0eSBpbiBjYXNlcyB3aGVyZSB0aGUgcnVudGltZSBsaWJyYXJ5IGlzXG4gICAgICogdXBkYXRlZCB3aXRob3V0IGFsc28gdXBkYXRpbmcgdGhlIGdlbmVyYXRlZCBjb2RlLlxuICAgICAqL1xuICAgIGNvbnN0IG1zZyA9IHR5cGUubWVzc2FnZVByb3RvdHlwZVxuICAgICAgICA/IE9iamVjdC5jcmVhdGUodHlwZS5tZXNzYWdlUHJvdG90eXBlKVxuICAgICAgICA6IE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh7fSwgbWVzc2FnZV90eXBlX2NvbnRyYWN0XzEuTUVTU0FHRV9UWVBFLCB7IHZhbHVlOiB0eXBlIH0pO1xuICAgIGZvciAobGV0IGZpZWxkIG9mIHR5cGUuZmllbGRzKSB7XG4gICAgICAgIGxldCBuYW1lID0gZmllbGQubG9jYWxOYW1lO1xuICAgICAgICBpZiAoZmllbGQub3B0KVxuICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgIGlmIChmaWVsZC5vbmVvZilcbiAgICAgICAgICAgIG1zZ1tmaWVsZC5vbmVvZl0gPSB7IG9uZW9mS2luZDogdW5kZWZpbmVkIH07XG4gICAgICAgIGVsc2UgaWYgKGZpZWxkLnJlcGVhdClcbiAgICAgICAgICAgIG1zZ1tuYW1lXSA9IFtdO1xuICAgICAgICBlbHNlXG4gICAgICAgICAgICBzd2l0Y2ggKGZpZWxkLmtpbmQpIHtcbiAgICAgICAgICAgICAgICBjYXNlIFwic2NhbGFyXCI6XG4gICAgICAgICAgICAgICAgICAgIG1zZ1tuYW1lXSA9IHJlZmxlY3Rpb25fc2NhbGFyX2RlZmF1bHRfMS5yZWZsZWN0aW9uU2NhbGFyRGVmYXVsdChmaWVsZC5ULCBmaWVsZC5MKTtcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgY2FzZSBcImVudW1cIjpcbiAgICAgICAgICAgICAgICAgICAgLy8gd2UgcmVxdWlyZSAwIHRvIGJlIGRlZmF1bHQgdmFsdWUgZm9yIGFsbCBlbnVtc1xuICAgICAgICAgICAgICAgICAgICBtc2dbbmFtZV0gPSAwO1xuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICBjYXNlIFwibWFwXCI6XG4gICAgICAgICAgICAgICAgICAgIG1zZ1tuYW1lXSA9IHt9O1xuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIG1zZztcbn1cbmV4cG9ydHMucmVmbGVjdGlvbkNyZWF0ZSA9IHJlZmxlY3Rpb25DcmVhdGU7XG4iLAogICAgIlwidXNlIHN0cmljdFwiO1xuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiX19lc01vZHVsZVwiLCB7IHZhbHVlOiB0cnVlIH0pO1xuZXhwb3J0cy5yZWZsZWN0aW9uTWVyZ2VQYXJ0aWFsID0gdm9pZCAwO1xuLyoqXG4gKiBDb3B5IHBhcnRpYWwgZGF0YSBpbnRvIHRoZSB0YXJnZXQgbWVzc2FnZS5cbiAqXG4gKiBJZiBhIHNpbmd1bGFyIHNjYWxhciBvciBlbnVtIGZpZWxkIGlzIHByZXNlbnQgaW4gdGhlIHNvdXJjZSwgaXRcbiAqIHJlcGxhY2VzIHRoZSBmaWVsZCBpbiB0aGUgdGFyZ2V0LlxuICpcbiAqIElmIGEgc2luZ3VsYXIgbWVzc2FnZSBmaWVsZCBpcyBwcmVzZW50IGluIHRoZSBzb3VyY2UsIGl0IGlzIG1lcmdlZFxuICogd2l0aCB0aGUgdGFyZ2V0IGZpZWxkIGJ5IGNhbGxpbmcgbWVyZ2VQYXJ0aWFsKCkgb2YgdGhlIHJlc3BvbnNpYmxlXG4gKiBtZXNzYWdlIHR5cGUuXG4gKlxuICogSWYgYSByZXBlYXRlZCBmaWVsZCBpcyBwcmVzZW50IGluIHRoZSBzb3VyY2UsIGl0cyB2YWx1ZXMgcmVwbGFjZVxuICogYWxsIHZhbHVlcyBpbiB0aGUgdGFyZ2V0IGFycmF5LCByZW1vdmluZyBleHRyYW5lb3VzIHZhbHVlcy5cbiAqIFJlcGVhdGVkIG1lc3NhZ2UgZmllbGRzIGFyZSBjb3BpZWQsIG5vdCBtZXJnZWQuXG4gKlxuICogSWYgYSBtYXAgZmllbGQgaXMgcHJlc2VudCBpbiB0aGUgc291cmNlLCBlbnRyaWVzIGFyZSBhZGRlZCB0byB0aGVcbiAqIHRhcmdldCBtYXAsIHJlcGxhY2luZyBlbnRyaWVzIHdpdGggdGhlIHNhbWUga2V5LiBFbnRyaWVzIHRoYXQgb25seVxuICogZXhpc3QgaW4gdGhlIHRhcmdldCByZW1haW4uIEVudHJpZXMgd2l0aCBtZXNzYWdlIHZhbHVlcyBhcmUgY29waWVkLFxuICogbm90IG1lcmdlZC5cbiAqXG4gKiBOb3RlIHRoYXQgdGhpcyBmdW5jdGlvbiBkaWZmZXJzIGZyb20gcHJvdG9idWYgbWVyZ2Ugc2VtYW50aWNzLFxuICogd2hpY2ggYXBwZW5kcyByZXBlYXRlZCBmaWVsZHMuXG4gKi9cbmZ1bmN0aW9uIHJlZmxlY3Rpb25NZXJnZVBhcnRpYWwoaW5mbywgdGFyZ2V0LCBzb3VyY2UpIHtcbiAgICBsZXQgZmllbGRWYWx1ZSwgLy8gdGhlIGZpZWxkIHZhbHVlIHdlIGFyZSB3b3JraW5nIHdpdGhcbiAgICBpbnB1dCA9IHNvdXJjZSwgb3V0cHV0OyAvLyB3aGVyZSB3ZSB3YW50IG91ciBmaWVsZCB2YWx1ZSB0byBnb1xuICAgIGZvciAobGV0IGZpZWxkIG9mIGluZm8uZmllbGRzKSB7XG4gICAgICAgIGxldCBuYW1lID0gZmllbGQubG9jYWxOYW1lO1xuICAgICAgICBpZiAoZmllbGQub25lb2YpIHtcbiAgICAgICAgICAgIGNvbnN0IGdyb3VwID0gaW5wdXRbZmllbGQub25lb2ZdOyAvLyB0aGlzIGlzIHRoZSBvbmVvZmBzIGdyb3VwIGluIHRoZSBzb3VyY2VcbiAgICAgICAgICAgIGlmICgoZ3JvdXAgPT09IG51bGwgfHwgZ3JvdXAgPT09IHZvaWQgMCA/IHZvaWQgMCA6IGdyb3VwLm9uZW9mS2luZCkgPT0gdW5kZWZpbmVkKSB7IC8vIHRoZSB1c2VyIGlzIGZyZWUgdG8gb21pdFxuICAgICAgICAgICAgICAgIGNvbnRpbnVlOyAvLyB3ZSBza2lwIHRoaXMgZmllbGQsIGFuZCBhbGwgb3RoZXIgbWVtYmVycyB0b29cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGZpZWxkVmFsdWUgPSBncm91cFtuYW1lXTsgLy8gb3VyIHZhbHVlIGNvbWVzIGZyb20gdGhlIHRoZSBvbmVvZiBncm91cCBvZiB0aGUgc291cmNlXG4gICAgICAgICAgICBvdXRwdXQgPSB0YXJnZXRbZmllbGQub25lb2ZdOyAvLyBhbmQgb3VyIG91dHB1dCBpcyB0aGUgb25lb2YgZ3JvdXAgb2YgdGhlIHRhcmdldFxuICAgICAgICAgICAgb3V0cHV0Lm9uZW9mS2luZCA9IGdyb3VwLm9uZW9mS2luZDsgLy8gYWx3YXlzIHVwZGF0ZSBkaXNjcmltaW5hdG9yXG4gICAgICAgICAgICBpZiAoZmllbGRWYWx1ZSA9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgICAgICBkZWxldGUgb3V0cHV0W25hbWVdOyAvLyByZW1vdmUgYW55IGV4aXN0aW5nIHZhbHVlXG4gICAgICAgICAgICAgICAgY29udGludWU7IC8vIHNraXAgZnVydGhlciB3b3JrIG9uIGZpZWxkXG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICBmaWVsZFZhbHVlID0gaW5wdXRbbmFtZV07IC8vIHdlIGFyZSB1c2luZyB0aGUgc291cmNlIGRpcmVjdGx5XG4gICAgICAgICAgICBvdXRwdXQgPSB0YXJnZXQ7IC8vIHdlIHdhbnQgb3VyIGZpZWxkIHZhbHVlIHRvIGdvIGRpcmVjdGx5IGludG8gdGhlIHRhcmdldFxuICAgICAgICAgICAgaWYgKGZpZWxkVmFsdWUgPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICAgICAgY29udGludWU7IC8vIHNraXAgZnVydGhlciB3b3JrIG9uIGZpZWxkLCBleGlzdGluZyB2YWx1ZSBpcyB1c2VkIGFzIGlzXG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGZpZWxkLnJlcGVhdClcbiAgICAgICAgICAgIG91dHB1dFtuYW1lXS5sZW5ndGggPSBmaWVsZFZhbHVlLmxlbmd0aDsgLy8gcmVzaXplIHRhcmdldCBhcnJheSB0byBtYXRjaCBzb3VyY2UgYXJyYXlcbiAgICAgICAgLy8gbm93IHdlIGp1c3Qgd29yayB3aXRoIGBmaWVsZFZhbHVlYCBhbmQgYG91dHB1dGAgdG8gbWVyZ2UgdGhlIHZhbHVlXG4gICAgICAgIHN3aXRjaCAoZmllbGQua2luZCkge1xuICAgICAgICAgICAgY2FzZSBcInNjYWxhclwiOlxuICAgICAgICAgICAgY2FzZSBcImVudW1cIjpcbiAgICAgICAgICAgICAgICBpZiAoZmllbGQucmVwZWF0KVxuICAgICAgICAgICAgICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IGZpZWxkVmFsdWUubGVuZ3RoOyBpKyspXG4gICAgICAgICAgICAgICAgICAgICAgICBvdXRwdXRbbmFtZV1baV0gPSBmaWVsZFZhbHVlW2ldOyAvLyBub3QgYSByZWZlcmVuY2UgdHlwZVxuICAgICAgICAgICAgICAgIGVsc2VcbiAgICAgICAgICAgICAgICAgICAgb3V0cHV0W25hbWVdID0gZmllbGRWYWx1ZTsgLy8gbm90IGEgcmVmZXJlbmNlIHR5cGVcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIGNhc2UgXCJtZXNzYWdlXCI6XG4gICAgICAgICAgICAgICAgbGV0IFQgPSBmaWVsZC5UKCk7XG4gICAgICAgICAgICAgICAgaWYgKGZpZWxkLnJlcGVhdClcbiAgICAgICAgICAgICAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBmaWVsZFZhbHVlLmxlbmd0aDsgaSsrKVxuICAgICAgICAgICAgICAgICAgICAgICAgb3V0cHV0W25hbWVdW2ldID0gVC5jcmVhdGUoZmllbGRWYWx1ZVtpXSk7XG4gICAgICAgICAgICAgICAgZWxzZSBpZiAob3V0cHV0W25hbWVdID09PSB1bmRlZmluZWQpXG4gICAgICAgICAgICAgICAgICAgIG91dHB1dFtuYW1lXSA9IFQuY3JlYXRlKGZpZWxkVmFsdWUpOyAvLyBub3RoaW5nIHRvIG1lcmdlIHdpdGhcbiAgICAgICAgICAgICAgICBlbHNlXG4gICAgICAgICAgICAgICAgICAgIFQubWVyZ2VQYXJ0aWFsKG91dHB1dFtuYW1lXSwgZmllbGRWYWx1ZSk7XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICBjYXNlIFwibWFwXCI6XG4gICAgICAgICAgICAgICAgLy8gTWFwIGFuZCByZXBlYXRlZCBmaWVsZHMgYXJlIHNpbXBseSBvdmVyd3JpdHRlbiwgbm90IGFwcGVuZGVkIG9yIG1lcmdlZFxuICAgICAgICAgICAgICAgIHN3aXRjaCAoZmllbGQuVi5raW5kKSB7XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgXCJzY2FsYXJcIjpcbiAgICAgICAgICAgICAgICAgICAgY2FzZSBcImVudW1cIjpcbiAgICAgICAgICAgICAgICAgICAgICAgIE9iamVjdC5hc3NpZ24ob3V0cHV0W25hbWVdLCBmaWVsZFZhbHVlKTsgLy8gZWxlbWVudHMgYXJlIG5vdCByZWZlcmVuY2UgdHlwZXNcbiAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgICAgICBjYXNlIFwibWVzc2FnZVwiOlxuICAgICAgICAgICAgICAgICAgICAgICAgbGV0IFQgPSBmaWVsZC5WLlQoKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGZvciAobGV0IGsgb2YgT2JqZWN0LmtleXMoZmllbGRWYWx1ZSkpXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgb3V0cHV0W25hbWVdW2tdID0gVC5jcmVhdGUoZmllbGRWYWx1ZVtrXSk7XG4gICAgICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cbiAgICB9XG59XG5leHBvcnRzLnJlZmxlY3Rpb25NZXJnZVBhcnRpYWwgPSByZWZsZWN0aW9uTWVyZ2VQYXJ0aWFsO1xuIiwKICAgICJcInVzZSBzdHJpY3RcIjtcbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIl9fZXNNb2R1bGVcIiwgeyB2YWx1ZTogdHJ1ZSB9KTtcbmV4cG9ydHMucmVmbGVjdGlvbkVxdWFscyA9IHZvaWQgMDtcbmNvbnN0IHJlZmxlY3Rpb25faW5mb18xID0gcmVxdWlyZShcIi4vcmVmbGVjdGlvbi1pbmZvXCIpO1xuLyoqXG4gKiBEZXRlcm1pbmVzIHdoZXRoZXIgdHdvIG1lc3NhZ2Ugb2YgdGhlIHNhbWUgdHlwZSBoYXZlIHRoZSBzYW1lIGZpZWxkIHZhbHVlcy5cbiAqIENoZWNrcyBmb3IgZGVlcCBlcXVhbGl0eSwgdHJhdmVyc2luZyByZXBlYXRlZCBmaWVsZHMsIG9uZW9mIGdyb3VwcywgbWFwc1xuICogYW5kIG1lc3NhZ2VzIHJlY3Vyc2l2ZWx5LlxuICogV2lsbCBhbHNvIHJldHVybiB0cnVlIGlmIGJvdGggbWVzc2FnZXMgYXJlIGB1bmRlZmluZWRgLlxuICovXG5mdW5jdGlvbiByZWZsZWN0aW9uRXF1YWxzKGluZm8sIGEsIGIpIHtcbiAgICBpZiAoYSA9PT0gYilcbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgaWYgKCFhIHx8ICFiKVxuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgZm9yIChsZXQgZmllbGQgb2YgaW5mby5maWVsZHMpIHtcbiAgICAgICAgbGV0IGxvY2FsTmFtZSA9IGZpZWxkLmxvY2FsTmFtZTtcbiAgICAgICAgbGV0IHZhbF9hID0gZmllbGQub25lb2YgPyBhW2ZpZWxkLm9uZW9mXVtsb2NhbE5hbWVdIDogYVtsb2NhbE5hbWVdO1xuICAgICAgICBsZXQgdmFsX2IgPSBmaWVsZC5vbmVvZiA/IGJbZmllbGQub25lb2ZdW2xvY2FsTmFtZV0gOiBiW2xvY2FsTmFtZV07XG4gICAgICAgIHN3aXRjaCAoZmllbGQua2luZCkge1xuICAgICAgICAgICAgY2FzZSBcImVudW1cIjpcbiAgICAgICAgICAgIGNhc2UgXCJzY2FsYXJcIjpcbiAgICAgICAgICAgICAgICBsZXQgdCA9IGZpZWxkLmtpbmQgPT0gXCJlbnVtXCIgPyByZWZsZWN0aW9uX2luZm9fMS5TY2FsYXJUeXBlLklOVDMyIDogZmllbGQuVDtcbiAgICAgICAgICAgICAgICBpZiAoIShmaWVsZC5yZXBlYXRcbiAgICAgICAgICAgICAgICAgICAgPyByZXBlYXRlZFByaW1pdGl2ZUVxKHQsIHZhbF9hLCB2YWxfYilcbiAgICAgICAgICAgICAgICAgICAgOiBwcmltaXRpdmVFcSh0LCB2YWxfYSwgdmFsX2IpKSlcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgY2FzZSBcIm1hcFwiOlxuICAgICAgICAgICAgICAgIGlmICghKGZpZWxkLlYua2luZCA9PSBcIm1lc3NhZ2VcIlxuICAgICAgICAgICAgICAgICAgICA/IHJlcGVhdGVkTXNnRXEoZmllbGQuVi5UKCksIG9iamVjdFZhbHVlcyh2YWxfYSksIG9iamVjdFZhbHVlcyh2YWxfYikpXG4gICAgICAgICAgICAgICAgICAgIDogcmVwZWF0ZWRQcmltaXRpdmVFcShmaWVsZC5WLmtpbmQgPT0gXCJlbnVtXCIgPyByZWZsZWN0aW9uX2luZm9fMS5TY2FsYXJUeXBlLklOVDMyIDogZmllbGQuVi5ULCBvYmplY3RWYWx1ZXModmFsX2EpLCBvYmplY3RWYWx1ZXModmFsX2IpKSkpXG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIGNhc2UgXCJtZXNzYWdlXCI6XG4gICAgICAgICAgICAgICAgbGV0IFQgPSBmaWVsZC5UKCk7XG4gICAgICAgICAgICAgICAgaWYgKCEoZmllbGQucmVwZWF0XG4gICAgICAgICAgICAgICAgICAgID8gcmVwZWF0ZWRNc2dFcShULCB2YWxfYSwgdmFsX2IpXG4gICAgICAgICAgICAgICAgICAgIDogVC5lcXVhbHModmFsX2EsIHZhbF9iKSkpXG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gdHJ1ZTtcbn1cbmV4cG9ydHMucmVmbGVjdGlvbkVxdWFscyA9IHJlZmxlY3Rpb25FcXVhbHM7XG5jb25zdCBvYmplY3RWYWx1ZXMgPSBPYmplY3QudmFsdWVzO1xuZnVuY3Rpb24gcHJpbWl0aXZlRXEodHlwZSwgYSwgYikge1xuICAgIGlmIChhID09PSBiKVxuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICBpZiAodHlwZSAhPT0gcmVmbGVjdGlvbl9pbmZvXzEuU2NhbGFyVHlwZS5CWVRFUylcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIGxldCBiYSA9IGE7XG4gICAgbGV0IGJiID0gYjtcbiAgICBpZiAoYmEubGVuZ3RoICE9PSBiYi5sZW5ndGgpXG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IGJhLmxlbmd0aDsgaSsrKVxuICAgICAgICBpZiAoYmFbaV0gIT0gYmJbaV0pXG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgcmV0dXJuIHRydWU7XG59XG5mdW5jdGlvbiByZXBlYXRlZFByaW1pdGl2ZUVxKHR5cGUsIGEsIGIpIHtcbiAgICBpZiAoYS5sZW5ndGggIT09IGIubGVuZ3RoKVxuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCBhLmxlbmd0aDsgaSsrKVxuICAgICAgICBpZiAoIXByaW1pdGl2ZUVxKHR5cGUsIGFbaV0sIGJbaV0pKVxuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIHJldHVybiB0cnVlO1xufVxuZnVuY3Rpb24gcmVwZWF0ZWRNc2dFcSh0eXBlLCBhLCBiKSB7XG4gICAgaWYgKGEubGVuZ3RoICE9PSBiLmxlbmd0aClcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgYS5sZW5ndGg7IGkrKylcbiAgICAgICAgaWYgKCF0eXBlLmVxdWFscyhhW2ldLCBiW2ldKSlcbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICByZXR1cm4gdHJ1ZTtcbn1cbiIsCiAgICAiXCJ1c2Ugc3RyaWN0XCI7XG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJfX2VzTW9kdWxlXCIsIHsgdmFsdWU6IHRydWUgfSk7XG5leHBvcnRzLk1lc3NhZ2VUeXBlID0gdm9pZCAwO1xuY29uc3QgbWVzc2FnZV90eXBlX2NvbnRyYWN0XzEgPSByZXF1aXJlKFwiLi9tZXNzYWdlLXR5cGUtY29udHJhY3RcIik7XG5jb25zdCByZWZsZWN0aW9uX2luZm9fMSA9IHJlcXVpcmUoXCIuL3JlZmxlY3Rpb24taW5mb1wiKTtcbmNvbnN0IHJlZmxlY3Rpb25fdHlwZV9jaGVja18xID0gcmVxdWlyZShcIi4vcmVmbGVjdGlvbi10eXBlLWNoZWNrXCIpO1xuY29uc3QgcmVmbGVjdGlvbl9qc29uX3JlYWRlcl8xID0gcmVxdWlyZShcIi4vcmVmbGVjdGlvbi1qc29uLXJlYWRlclwiKTtcbmNvbnN0IHJlZmxlY3Rpb25fanNvbl93cml0ZXJfMSA9IHJlcXVpcmUoXCIuL3JlZmxlY3Rpb24tanNvbi13cml0ZXJcIik7XG5jb25zdCByZWZsZWN0aW9uX2JpbmFyeV9yZWFkZXJfMSA9IHJlcXVpcmUoXCIuL3JlZmxlY3Rpb24tYmluYXJ5LXJlYWRlclwiKTtcbmNvbnN0IHJlZmxlY3Rpb25fYmluYXJ5X3dyaXRlcl8xID0gcmVxdWlyZShcIi4vcmVmbGVjdGlvbi1iaW5hcnktd3JpdGVyXCIpO1xuY29uc3QgcmVmbGVjdGlvbl9jcmVhdGVfMSA9IHJlcXVpcmUoXCIuL3JlZmxlY3Rpb24tY3JlYXRlXCIpO1xuY29uc3QgcmVmbGVjdGlvbl9tZXJnZV9wYXJ0aWFsXzEgPSByZXF1aXJlKFwiLi9yZWZsZWN0aW9uLW1lcmdlLXBhcnRpYWxcIik7XG5jb25zdCBqc29uX3R5cGluZ3NfMSA9IHJlcXVpcmUoXCIuL2pzb24tdHlwaW5nc1wiKTtcbmNvbnN0IGpzb25fZm9ybWF0X2NvbnRyYWN0XzEgPSByZXF1aXJlKFwiLi9qc29uLWZvcm1hdC1jb250cmFjdFwiKTtcbmNvbnN0IHJlZmxlY3Rpb25fZXF1YWxzXzEgPSByZXF1aXJlKFwiLi9yZWZsZWN0aW9uLWVxdWFsc1wiKTtcbmNvbnN0IGJpbmFyeV93cml0ZXJfMSA9IHJlcXVpcmUoXCIuL2JpbmFyeS13cml0ZXJcIik7XG5jb25zdCBiaW5hcnlfcmVhZGVyXzEgPSByZXF1aXJlKFwiLi9iaW5hcnktcmVhZGVyXCIpO1xuY29uc3QgYmFzZURlc2NyaXB0b3JzID0gT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcnMoT2JqZWN0LmdldFByb3RvdHlwZU9mKHt9KSk7XG4vKipcbiAqIFRoaXMgc3RhbmRhcmQgbWVzc2FnZSB0eXBlIHByb3ZpZGVzIHJlZmxlY3Rpb24tYmFzZWRcbiAqIG9wZXJhdGlvbnMgdG8gd29yayB3aXRoIGEgbWVzc2FnZS5cbiAqL1xuY2xhc3MgTWVzc2FnZVR5cGUge1xuICAgIGNvbnN0cnVjdG9yKG5hbWUsIGZpZWxkcywgb3B0aW9ucykge1xuICAgICAgICB0aGlzLmRlZmF1bHRDaGVja0RlcHRoID0gMTY7XG4gICAgICAgIHRoaXMudHlwZU5hbWUgPSBuYW1lO1xuICAgICAgICB0aGlzLmZpZWxkcyA9IGZpZWxkcy5tYXAocmVmbGVjdGlvbl9pbmZvXzEubm9ybWFsaXplRmllbGRJbmZvKTtcbiAgICAgICAgdGhpcy5vcHRpb25zID0gb3B0aW9ucyAhPT0gbnVsbCAmJiBvcHRpb25zICE9PSB2b2lkIDAgPyBvcHRpb25zIDoge307XG4gICAgICAgIHRoaXMubWVzc2FnZVByb3RvdHlwZSA9IE9iamVjdC5jcmVhdGUobnVsbCwgT2JqZWN0LmFzc2lnbihPYmplY3QuYXNzaWduKHt9LCBiYXNlRGVzY3JpcHRvcnMpLCB7IFttZXNzYWdlX3R5cGVfY29udHJhY3RfMS5NRVNTQUdFX1RZUEVdOiB7IHZhbHVlOiB0aGlzIH0gfSkpO1xuICAgICAgICB0aGlzLnJlZlR5cGVDaGVjayA9IG5ldyByZWZsZWN0aW9uX3R5cGVfY2hlY2tfMS5SZWZsZWN0aW9uVHlwZUNoZWNrKHRoaXMpO1xuICAgICAgICB0aGlzLnJlZkpzb25SZWFkZXIgPSBuZXcgcmVmbGVjdGlvbl9qc29uX3JlYWRlcl8xLlJlZmxlY3Rpb25Kc29uUmVhZGVyKHRoaXMpO1xuICAgICAgICB0aGlzLnJlZkpzb25Xcml0ZXIgPSBuZXcgcmVmbGVjdGlvbl9qc29uX3dyaXRlcl8xLlJlZmxlY3Rpb25Kc29uV3JpdGVyKHRoaXMpO1xuICAgICAgICB0aGlzLnJlZkJpblJlYWRlciA9IG5ldyByZWZsZWN0aW9uX2JpbmFyeV9yZWFkZXJfMS5SZWZsZWN0aW9uQmluYXJ5UmVhZGVyKHRoaXMpO1xuICAgICAgICB0aGlzLnJlZkJpbldyaXRlciA9IG5ldyByZWZsZWN0aW9uX2JpbmFyeV93cml0ZXJfMS5SZWZsZWN0aW9uQmluYXJ5V3JpdGVyKHRoaXMpO1xuICAgIH1cbiAgICBjcmVhdGUodmFsdWUpIHtcbiAgICAgICAgbGV0IG1lc3NhZ2UgPSByZWZsZWN0aW9uX2NyZWF0ZV8xLnJlZmxlY3Rpb25DcmVhdGUodGhpcyk7XG4gICAgICAgIGlmICh2YWx1ZSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICByZWZsZWN0aW9uX21lcmdlX3BhcnRpYWxfMS5yZWZsZWN0aW9uTWVyZ2VQYXJ0aWFsKHRoaXMsIG1lc3NhZ2UsIHZhbHVlKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gbWVzc2FnZTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogQ2xvbmUgdGhlIG1lc3NhZ2UuXG4gICAgICpcbiAgICAgKiBVbmtub3duIGZpZWxkcyBhcmUgZGlzY2FyZGVkLlxuICAgICAqL1xuICAgIGNsb25lKG1lc3NhZ2UpIHtcbiAgICAgICAgbGV0IGNvcHkgPSB0aGlzLmNyZWF0ZSgpO1xuICAgICAgICByZWZsZWN0aW9uX21lcmdlX3BhcnRpYWxfMS5yZWZsZWN0aW9uTWVyZ2VQYXJ0aWFsKHRoaXMsIGNvcHksIG1lc3NhZ2UpO1xuICAgICAgICByZXR1cm4gY29weTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogRGV0ZXJtaW5lcyB3aGV0aGVyIHR3byBtZXNzYWdlIG9mIHRoZSBzYW1lIHR5cGUgaGF2ZSB0aGUgc2FtZSBmaWVsZCB2YWx1ZXMuXG4gICAgICogQ2hlY2tzIGZvciBkZWVwIGVxdWFsaXR5LCB0cmF2ZXJzaW5nIHJlcGVhdGVkIGZpZWxkcywgb25lb2YgZ3JvdXBzLCBtYXBzXG4gICAgICogYW5kIG1lc3NhZ2VzIHJlY3Vyc2l2ZWx5LlxuICAgICAqIFdpbGwgYWxzbyByZXR1cm4gdHJ1ZSBpZiBib3RoIG1lc3NhZ2VzIGFyZSBgdW5kZWZpbmVkYC5cbiAgICAgKi9cbiAgICBlcXVhbHMoYSwgYikge1xuICAgICAgICByZXR1cm4gcmVmbGVjdGlvbl9lcXVhbHNfMS5yZWZsZWN0aW9uRXF1YWxzKHRoaXMsIGEsIGIpO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBJcyB0aGUgZ2l2ZW4gdmFsdWUgYXNzaWduYWJsZSB0byBvdXIgbWVzc2FnZSB0eXBlXG4gICAgICogYW5kIGNvbnRhaW5zIG5vIFtleGNlc3MgcHJvcGVydGllc10oaHR0cHM6Ly93d3cudHlwZXNjcmlwdGxhbmcub3JnL2RvY3MvaGFuZGJvb2svaW50ZXJmYWNlcy5odG1sI2V4Y2Vzcy1wcm9wZXJ0eS1jaGVja3MpP1xuICAgICAqL1xuICAgIGlzKGFyZywgZGVwdGggPSB0aGlzLmRlZmF1bHRDaGVja0RlcHRoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLnJlZlR5cGVDaGVjay5pcyhhcmcsIGRlcHRoLCBmYWxzZSk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIElzIHRoZSBnaXZlbiB2YWx1ZSBhc3NpZ25hYmxlIHRvIG91ciBtZXNzYWdlIHR5cGUsXG4gICAgICogcmVnYXJkbGVzcyBvZiBbZXhjZXNzIHByb3BlcnRpZXNdKGh0dHBzOi8vd3d3LnR5cGVzY3JpcHRsYW5nLm9yZy9kb2NzL2hhbmRib29rL2ludGVyZmFjZXMuaHRtbCNleGNlc3MtcHJvcGVydHktY2hlY2tzKT9cbiAgICAgKi9cbiAgICBpc0Fzc2lnbmFibGUoYXJnLCBkZXB0aCA9IHRoaXMuZGVmYXVsdENoZWNrRGVwdGgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMucmVmVHlwZUNoZWNrLmlzKGFyZywgZGVwdGgsIHRydWUpO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBDb3B5IHBhcnRpYWwgZGF0YSBpbnRvIHRoZSB0YXJnZXQgbWVzc2FnZS5cbiAgICAgKi9cbiAgICBtZXJnZVBhcnRpYWwodGFyZ2V0LCBzb3VyY2UpIHtcbiAgICAgICAgcmVmbGVjdGlvbl9tZXJnZV9wYXJ0aWFsXzEucmVmbGVjdGlvbk1lcmdlUGFydGlhbCh0aGlzLCB0YXJnZXQsIHNvdXJjZSk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIENyZWF0ZSBhIG5ldyBtZXNzYWdlIGZyb20gYmluYXJ5IGZvcm1hdC5cbiAgICAgKi9cbiAgICBmcm9tQmluYXJ5KGRhdGEsIG9wdGlvbnMpIHtcbiAgICAgICAgbGV0IG9wdCA9IGJpbmFyeV9yZWFkZXJfMS5iaW5hcnlSZWFkT3B0aW9ucyhvcHRpb25zKTtcbiAgICAgICAgcmV0dXJuIHRoaXMuaW50ZXJuYWxCaW5hcnlSZWFkKG9wdC5yZWFkZXJGYWN0b3J5KGRhdGEpLCBkYXRhLmJ5dGVMZW5ndGgsIG9wdCk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIFJlYWQgYSBuZXcgbWVzc2FnZSBmcm9tIGEgSlNPTiB2YWx1ZS5cbiAgICAgKi9cbiAgICBmcm9tSnNvbihqc29uLCBvcHRpb25zKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmludGVybmFsSnNvblJlYWQoanNvbiwganNvbl9mb3JtYXRfY29udHJhY3RfMS5qc29uUmVhZE9wdGlvbnMob3B0aW9ucykpO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBSZWFkIGEgbmV3IG1lc3NhZ2UgZnJvbSBhIEpTT04gc3RyaW5nLlxuICAgICAqIFRoaXMgaXMgZXF1aXZhbGVudCB0byBgVC5mcm9tSnNvbihKU09OLnBhcnNlKGpzb24pKWAuXG4gICAgICovXG4gICAgZnJvbUpzb25TdHJpbmcoanNvbiwgb3B0aW9ucykge1xuICAgICAgICBsZXQgdmFsdWUgPSBKU09OLnBhcnNlKGpzb24pO1xuICAgICAgICByZXR1cm4gdGhpcy5mcm9tSnNvbih2YWx1ZSwgb3B0aW9ucyk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIFdyaXRlIHRoZSBtZXNzYWdlIHRvIGNhbm9uaWNhbCBKU09OIHZhbHVlLlxuICAgICAqL1xuICAgIHRvSnNvbihtZXNzYWdlLCBvcHRpb25zKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmludGVybmFsSnNvbldyaXRlKG1lc3NhZ2UsIGpzb25fZm9ybWF0X2NvbnRyYWN0XzEuanNvbldyaXRlT3B0aW9ucyhvcHRpb25zKSk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIENvbnZlcnQgdGhlIG1lc3NhZ2UgdG8gY2Fub25pY2FsIEpTT04gc3RyaW5nLlxuICAgICAqIFRoaXMgaXMgZXF1aXZhbGVudCB0byBgSlNPTi5zdHJpbmdpZnkoVC50b0pzb24odCkpYFxuICAgICAqL1xuICAgIHRvSnNvblN0cmluZyhtZXNzYWdlLCBvcHRpb25zKSB7XG4gICAgICAgIHZhciBfYTtcbiAgICAgICAgbGV0IHZhbHVlID0gdGhpcy50b0pzb24obWVzc2FnZSwgb3B0aW9ucyk7XG4gICAgICAgIHJldHVybiBKU09OLnN0cmluZ2lmeSh2YWx1ZSwgbnVsbCwgKF9hID0gb3B0aW9ucyA9PT0gbnVsbCB8fCBvcHRpb25zID09PSB2b2lkIDAgPyB2b2lkIDAgOiBvcHRpb25zLnByZXR0eVNwYWNlcykgIT09IG51bGwgJiYgX2EgIT09IHZvaWQgMCA/IF9hIDogMCk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIFdyaXRlIHRoZSBtZXNzYWdlIHRvIGJpbmFyeSBmb3JtYXQuXG4gICAgICovXG4gICAgdG9CaW5hcnkobWVzc2FnZSwgb3B0aW9ucykge1xuICAgICAgICBsZXQgb3B0ID0gYmluYXJ5X3dyaXRlcl8xLmJpbmFyeVdyaXRlT3B0aW9ucyhvcHRpb25zKTtcbiAgICAgICAgcmV0dXJuIHRoaXMuaW50ZXJuYWxCaW5hcnlXcml0ZShtZXNzYWdlLCBvcHQud3JpdGVyRmFjdG9yeSgpLCBvcHQpLmZpbmlzaCgpO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBUaGlzIGlzIGFuIGludGVybmFsIG1ldGhvZC4gSWYgeW91IGp1c3Qgd2FudCB0byByZWFkIGEgbWVzc2FnZSBmcm9tXG4gICAgICogSlNPTiwgdXNlIGBmcm9tSnNvbigpYCBvciBgZnJvbUpzb25TdHJpbmcoKWAuXG4gICAgICpcbiAgICAgKiBSZWFkcyBKU09OIHZhbHVlIGFuZCBtZXJnZXMgdGhlIGZpZWxkcyBpbnRvIHRoZSB0YXJnZXRcbiAgICAgKiBhY2NvcmRpbmcgdG8gcHJvdG9idWYgcnVsZXMuIElmIHRoZSB0YXJnZXQgaXMgb21pdHRlZCxcbiAgICAgKiBhIG5ldyBpbnN0YW5jZSBpcyBjcmVhdGVkIGZpcnN0LlxuICAgICAqL1xuICAgIGludGVybmFsSnNvblJlYWQoanNvbiwgb3B0aW9ucywgdGFyZ2V0KSB7XG4gICAgICAgIGlmIChqc29uICE9PSBudWxsICYmIHR5cGVvZiBqc29uID09IFwib2JqZWN0XCIgJiYgIUFycmF5LmlzQXJyYXkoanNvbikpIHtcbiAgICAgICAgICAgIGxldCBtZXNzYWdlID0gdGFyZ2V0ICE9PSBudWxsICYmIHRhcmdldCAhPT0gdm9pZCAwID8gdGFyZ2V0IDogdGhpcy5jcmVhdGUoKTtcbiAgICAgICAgICAgIHRoaXMucmVmSnNvblJlYWRlci5yZWFkKGpzb24sIG1lc3NhZ2UsIG9wdGlvbnMpO1xuICAgICAgICAgICAgcmV0dXJuIG1lc3NhZ2U7XG4gICAgICAgIH1cbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBVbmFibGUgdG8gcGFyc2UgbWVzc2FnZSAke3RoaXMudHlwZU5hbWV9IGZyb20gSlNPTiAke2pzb25fdHlwaW5nc18xLnR5cGVvZkpzb25WYWx1ZShqc29uKX0uYCk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIFRoaXMgaXMgYW4gaW50ZXJuYWwgbWV0aG9kLiBJZiB5b3UganVzdCB3YW50IHRvIHdyaXRlIGEgbWVzc2FnZVxuICAgICAqIHRvIEpTT04sIHVzZSBgdG9Kc29uKClgIG9yIGB0b0pzb25TdHJpbmcoKS5cbiAgICAgKlxuICAgICAqIFdyaXRlcyBKU09OIHZhbHVlIGFuZCByZXR1cm5zIGl0LlxuICAgICAqL1xuICAgIGludGVybmFsSnNvbldyaXRlKG1lc3NhZ2UsIG9wdGlvbnMpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMucmVmSnNvbldyaXRlci53cml0ZShtZXNzYWdlLCBvcHRpb25zKTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogVGhpcyBpcyBhbiBpbnRlcm5hbCBtZXRob2QuIElmIHlvdSBqdXN0IHdhbnQgdG8gd3JpdGUgYSBtZXNzYWdlXG4gICAgICogaW4gYmluYXJ5IGZvcm1hdCwgdXNlIGB0b0JpbmFyeSgpYC5cbiAgICAgKlxuICAgICAqIFNlcmlhbGl6ZXMgdGhlIG1lc3NhZ2UgaW4gYmluYXJ5IGZvcm1hdCBhbmQgYXBwZW5kcyBpdCB0byB0aGUgZ2l2ZW5cbiAgICAgKiB3cml0ZXIuIFJldHVybnMgcGFzc2VkIHdyaXRlci5cbiAgICAgKi9cbiAgICBpbnRlcm5hbEJpbmFyeVdyaXRlKG1lc3NhZ2UsIHdyaXRlciwgb3B0aW9ucykge1xuICAgICAgICB0aGlzLnJlZkJpbldyaXRlci53cml0ZShtZXNzYWdlLCB3cml0ZXIsIG9wdGlvbnMpO1xuICAgICAgICByZXR1cm4gd3JpdGVyO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBUaGlzIGlzIGFuIGludGVybmFsIG1ldGhvZC4gSWYgeW91IGp1c3Qgd2FudCB0byByZWFkIGEgbWVzc2FnZSBmcm9tXG4gICAgICogYmluYXJ5IGRhdGEsIHVzZSBgZnJvbUJpbmFyeSgpYC5cbiAgICAgKlxuICAgICAqIFJlYWRzIGRhdGEgZnJvbSBiaW5hcnkgZm9ybWF0IGFuZCBtZXJnZXMgdGhlIGZpZWxkcyBpbnRvXG4gICAgICogdGhlIHRhcmdldCBhY2NvcmRpbmcgdG8gcHJvdG9idWYgcnVsZXMuIElmIHRoZSB0YXJnZXQgaXNcbiAgICAgKiBvbWl0dGVkLCBhIG5ldyBpbnN0YW5jZSBpcyBjcmVhdGVkIGZpcnN0LlxuICAgICAqL1xuICAgIGludGVybmFsQmluYXJ5UmVhZChyZWFkZXIsIGxlbmd0aCwgb3B0aW9ucywgdGFyZ2V0KSB7XG4gICAgICAgIGxldCBtZXNzYWdlID0gdGFyZ2V0ICE9PSBudWxsICYmIHRhcmdldCAhPT0gdm9pZCAwID8gdGFyZ2V0IDogdGhpcy5jcmVhdGUoKTtcbiAgICAgICAgdGhpcy5yZWZCaW5SZWFkZXIucmVhZChyZWFkZXIsIG1lc3NhZ2UsIG9wdGlvbnMsIGxlbmd0aCk7XG4gICAgICAgIHJldHVybiBtZXNzYWdlO1xuICAgIH1cbn1cbmV4cG9ydHMuTWVzc2FnZVR5cGUgPSBNZXNzYWdlVHlwZTtcbiIsCiAgICAiXCJ1c2Ugc3RyaWN0XCI7XG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJfX2VzTW9kdWxlXCIsIHsgdmFsdWU6IHRydWUgfSk7XG5leHBvcnRzLmNvbnRhaW5zTWVzc2FnZVR5cGUgPSB2b2lkIDA7XG5jb25zdCBtZXNzYWdlX3R5cGVfY29udHJhY3RfMSA9IHJlcXVpcmUoXCIuL21lc3NhZ2UtdHlwZS1jb250cmFjdFwiKTtcbi8qKlxuICogQ2hlY2sgaWYgdGhlIHByb3ZpZGVkIG9iamVjdCBpcyBhIHByb3RvIG1lc3NhZ2UuXG4gKlxuICogTm90ZSB0aGF0IHRoaXMgaXMgYW4gZXhwZXJpbWVudGFsIGZlYXR1cmUgLSBpdCBpcyBoZXJlIHRvIHN0YXksIGJ1dFxuICogaW1wbGVtZW50YXRpb24gZGV0YWlscyBtYXkgY2hhbmdlIHdpdGhvdXQgbm90aWNlLlxuICovXG5mdW5jdGlvbiBjb250YWluc01lc3NhZ2VUeXBlKG1zZykge1xuICAgIHJldHVybiBtc2dbbWVzc2FnZV90eXBlX2NvbnRyYWN0XzEuTUVTU0FHRV9UWVBFXSAhPSBudWxsO1xufVxuZXhwb3J0cy5jb250YWluc01lc3NhZ2VUeXBlID0gY29udGFpbnNNZXNzYWdlVHlwZTtcbiIsCiAgICAiXCJ1c2Ugc3RyaWN0XCI7XG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJfX2VzTW9kdWxlXCIsIHsgdmFsdWU6IHRydWUgfSk7XG5leHBvcnRzLmxpc3RFbnVtTnVtYmVycyA9IGV4cG9ydHMubGlzdEVudW1OYW1lcyA9IGV4cG9ydHMubGlzdEVudW1WYWx1ZXMgPSBleHBvcnRzLmlzRW51bU9iamVjdCA9IHZvaWQgMDtcbi8qKlxuICogSXMgdGhpcyBhIGxvb2t1cCBvYmplY3QgZ2VuZXJhdGVkIGJ5IFR5cGVzY3JpcHQsIGZvciBhIFR5cGVzY3JpcHQgZW51bVxuICogZ2VuZXJhdGVkIGJ5IHByb3RvYnVmLXRzP1xuICpcbiAqIC0gTm8gYGNvbnN0IGVudW1gIChlbnVtIG11c3Qgbm90IGJlIGlubGluZWQsIHdlIG5lZWQgcmV2ZXJzZSBtYXBwaW5nKS5cbiAqIC0gTm8gc3RyaW5nIGVudW0gKHdlIG5lZWQgaW50MzIgZm9yIHByb3RvYnVmKS5cbiAqIC0gTXVzdCBoYXZlIGEgdmFsdWUgZm9yIDAgKG90aGVyd2lzZSwgd2Ugd291bGQgbmVlZCB0byBzdXBwb3J0IGN1c3RvbSBkZWZhdWx0IHZhbHVlcykuXG4gKi9cbmZ1bmN0aW9uIGlzRW51bU9iamVjdChhcmcpIHtcbiAgICBpZiAodHlwZW9mIGFyZyAhPSAnb2JqZWN0JyB8fCBhcmcgPT09IG51bGwpIHtcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgICBpZiAoIWFyZy5oYXNPd25Qcm9wZXJ0eSgwKSkge1xuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuICAgIGZvciAobGV0IGsgb2YgT2JqZWN0LmtleXMoYXJnKSkge1xuICAgICAgICBsZXQgbnVtID0gcGFyc2VJbnQoayk7XG4gICAgICAgIGlmICghTnVtYmVyLmlzTmFOKG51bSkpIHtcbiAgICAgICAgICAgIC8vIGlzIHRoZXJlIGEgbmFtZSBmb3IgdGhlIG51bWJlcj9cbiAgICAgICAgICAgIGxldCBuYW0gPSBhcmdbbnVtXTtcbiAgICAgICAgICAgIGlmIChuYW0gPT09IHVuZGVmaW5lZClcbiAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgICAgICAvLyBkb2VzIHRoZSBuYW1lIHJlc29sdmUgYmFjayB0byB0aGUgbnVtYmVyP1xuICAgICAgICAgICAgaWYgKGFyZ1tuYW1dICE9PSBudW0pXG4gICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgLy8gaXMgdGhlcmUgYSBudW1iZXIgZm9yIHRoZSBuYW1lP1xuICAgICAgICAgICAgbGV0IG51bSA9IGFyZ1trXTtcbiAgICAgICAgICAgIGlmIChudW0gPT09IHVuZGVmaW5lZClcbiAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgICAgICAvLyBpcyBpdCBhIHN0cmluZyBlbnVtP1xuICAgICAgICAgICAgaWYgKHR5cGVvZiBudW0gIT09ICdudW1iZXInKVxuICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgICAgIC8vIGRvIHdlIGtub3cgdGhlIG51bWJlcj9cbiAgICAgICAgICAgIGlmIChhcmdbbnVtXSA9PT0gdW5kZWZpbmVkKVxuICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gdHJ1ZTtcbn1cbmV4cG9ydHMuaXNFbnVtT2JqZWN0ID0gaXNFbnVtT2JqZWN0O1xuLyoqXG4gKiBMaXN0cyBhbGwgdmFsdWVzIG9mIGEgVHlwZXNjcmlwdCBlbnVtLCBhcyBhbiBhcnJheSBvZiBvYmplY3RzIHdpdGggYSBcIm5hbWVcIlxuICogcHJvcGVydHkgYW5kIGEgXCJudW1iZXJcIiBwcm9wZXJ0eS5cbiAqXG4gKiBOb3RlIHRoYXQgaXQgaXMgcG9zc2libGUgdGhhdCBhIG51bWJlciBhcHBlYXJzIG1vcmUgdGhhbiBvbmNlLCBiZWNhdXNlIGl0IGlzXG4gKiBwb3NzaWJsZSB0byBoYXZlIGFsaWFzZXMgaW4gYW4gZW51bS5cbiAqXG4gKiBUaHJvd3MgaWYgdGhlIGVudW0gZG9lcyBub3QgYWRoZXJlIHRvIHRoZSBydWxlcyBvZiBlbnVtcyBnZW5lcmF0ZWQgYnlcbiAqIHByb3RvYnVmLXRzLiBTZWUgYGlzRW51bU9iamVjdCgpYC5cbiAqL1xuZnVuY3Rpb24gbGlzdEVudW1WYWx1ZXMoZW51bU9iamVjdCkge1xuICAgIGlmICghaXNFbnVtT2JqZWN0KGVudW1PYmplY3QpKVxuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJub3QgYSB0eXBlc2NyaXB0IGVudW0gb2JqZWN0XCIpO1xuICAgIGxldCB2YWx1ZXMgPSBbXTtcbiAgICBmb3IgKGxldCBbbmFtZSwgbnVtYmVyXSBvZiBPYmplY3QuZW50cmllcyhlbnVtT2JqZWN0KSlcbiAgICAgICAgaWYgKHR5cGVvZiBudW1iZXIgPT0gXCJudW1iZXJcIilcbiAgICAgICAgICAgIHZhbHVlcy5wdXNoKHsgbmFtZSwgbnVtYmVyIH0pO1xuICAgIHJldHVybiB2YWx1ZXM7XG59XG5leHBvcnRzLmxpc3RFbnVtVmFsdWVzID0gbGlzdEVudW1WYWx1ZXM7XG4vKipcbiAqIExpc3RzIHRoZSBuYW1lcyBvZiBhIFR5cGVzY3JpcHQgZW51bS5cbiAqXG4gKiBUaHJvd3MgaWYgdGhlIGVudW0gZG9lcyBub3QgYWRoZXJlIHRvIHRoZSBydWxlcyBvZiBlbnVtcyBnZW5lcmF0ZWQgYnlcbiAqIHByb3RvYnVmLXRzLiBTZWUgYGlzRW51bU9iamVjdCgpYC5cbiAqL1xuZnVuY3Rpb24gbGlzdEVudW1OYW1lcyhlbnVtT2JqZWN0KSB7XG4gICAgcmV0dXJuIGxpc3RFbnVtVmFsdWVzKGVudW1PYmplY3QpLm1hcCh2YWwgPT4gdmFsLm5hbWUpO1xufVxuZXhwb3J0cy5saXN0RW51bU5hbWVzID0gbGlzdEVudW1OYW1lcztcbi8qKlxuICogTGlzdHMgdGhlIG51bWJlcnMgb2YgYSBUeXBlc2NyaXB0IGVudW0uXG4gKlxuICogVGhyb3dzIGlmIHRoZSBlbnVtIGRvZXMgbm90IGFkaGVyZSB0byB0aGUgcnVsZXMgb2YgZW51bXMgZ2VuZXJhdGVkIGJ5XG4gKiBwcm90b2J1Zi10cy4gU2VlIGBpc0VudW1PYmplY3QoKWAuXG4gKi9cbmZ1bmN0aW9uIGxpc3RFbnVtTnVtYmVycyhlbnVtT2JqZWN0KSB7XG4gICAgcmV0dXJuIGxpc3RFbnVtVmFsdWVzKGVudW1PYmplY3QpXG4gICAgICAgIC5tYXAodmFsID0+IHZhbC5udW1iZXIpXG4gICAgICAgIC5maWx0ZXIoKG51bSwgaW5kZXgsIGFycikgPT4gYXJyLmluZGV4T2YobnVtKSA9PSBpbmRleCk7XG59XG5leHBvcnRzLmxpc3RFbnVtTnVtYmVycyA9IGxpc3RFbnVtTnVtYmVycztcbiIsCiAgICAiXCJ1c2Ugc3RyaWN0XCI7XG4vLyBQdWJsaWMgQVBJIG9mIHRoZSBwcm90b2J1Zi10cyBydW50aW1lLlxuLy8gTm90ZTogd2UgZG8gbm90IHVzZSBgZXhwb3J0ICogZnJvbSAuLi5gIHRvIGhlbHAgdHJlZSBzaGFrZXJzLFxuLy8gd2VicGFjayB2ZXJib3NlIG91dHB1dCBoaW50cyB0aGF0IHRoaXMgc2hvdWxkIGJlIHVzZWZ1bFxuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiX19lc01vZHVsZVwiLCB7IHZhbHVlOiB0cnVlIH0pO1xuLy8gQ29udmVuaWVuY2UgSlNPTiB0eXBpbmdzIGFuZCBjb3JyZXNwb25kaW5nIHR5cGUgZ3VhcmRzXG52YXIganNvbl90eXBpbmdzXzEgPSByZXF1aXJlKFwiLi9qc29uLXR5cGluZ3NcIik7XG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJ0eXBlb2ZKc29uVmFsdWVcIiwgeyBlbnVtZXJhYmxlOiB0cnVlLCBnZXQ6IGZ1bmN0aW9uICgpIHsgcmV0dXJuIGpzb25fdHlwaW5nc18xLnR5cGVvZkpzb25WYWx1ZTsgfSB9KTtcbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcImlzSnNvbk9iamVjdFwiLCB7IGVudW1lcmFibGU6IHRydWUsIGdldDogZnVuY3Rpb24gKCkgeyByZXR1cm4ganNvbl90eXBpbmdzXzEuaXNKc29uT2JqZWN0OyB9IH0pO1xuLy8gQmFzZSA2NCBlbmNvZGluZ1xudmFyIGJhc2U2NF8xID0gcmVxdWlyZShcIi4vYmFzZTY0XCIpO1xuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiYmFzZTY0ZGVjb2RlXCIsIHsgZW51bWVyYWJsZTogdHJ1ZSwgZ2V0OiBmdW5jdGlvbiAoKSB7IHJldHVybiBiYXNlNjRfMS5iYXNlNjRkZWNvZGU7IH0gfSk7XG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJiYXNlNjRlbmNvZGVcIiwgeyBlbnVtZXJhYmxlOiB0cnVlLCBnZXQ6IGZ1bmN0aW9uICgpIHsgcmV0dXJuIGJhc2U2NF8xLmJhc2U2NGVuY29kZTsgfSB9KTtcbi8vIFVURjggZW5jb2RpbmdcbnZhciBwcm90b2J1ZmpzX3V0ZjhfMSA9IHJlcXVpcmUoXCIuL3Byb3RvYnVmanMtdXRmOFwiKTtcbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcInV0ZjhyZWFkXCIsIHsgZW51bWVyYWJsZTogdHJ1ZSwgZ2V0OiBmdW5jdGlvbiAoKSB7IHJldHVybiBwcm90b2J1ZmpzX3V0ZjhfMS51dGY4cmVhZDsgfSB9KTtcbi8vIEJpbmFyeSBmb3JtYXQgY29udHJhY3RzLCBvcHRpb25zIGZvciByZWFkaW5nIGFuZCB3cml0aW5nLCBmb3IgZXhhbXBsZVxudmFyIGJpbmFyeV9mb3JtYXRfY29udHJhY3RfMSA9IHJlcXVpcmUoXCIuL2JpbmFyeS1mb3JtYXQtY29udHJhY3RcIik7XG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJXaXJlVHlwZVwiLCB7IGVudW1lcmFibGU6IHRydWUsIGdldDogZnVuY3Rpb24gKCkgeyByZXR1cm4gYmluYXJ5X2Zvcm1hdF9jb250cmFjdF8xLldpcmVUeXBlOyB9IH0pO1xuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwibWVyZ2VCaW5hcnlPcHRpb25zXCIsIHsgZW51bWVyYWJsZTogdHJ1ZSwgZ2V0OiBmdW5jdGlvbiAoKSB7IHJldHVybiBiaW5hcnlfZm9ybWF0X2NvbnRyYWN0XzEubWVyZ2VCaW5hcnlPcHRpb25zOyB9IH0pO1xuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiVW5rbm93bkZpZWxkSGFuZGxlclwiLCB7IGVudW1lcmFibGU6IHRydWUsIGdldDogZnVuY3Rpb24gKCkgeyByZXR1cm4gYmluYXJ5X2Zvcm1hdF9jb250cmFjdF8xLlVua25vd25GaWVsZEhhbmRsZXI7IH0gfSk7XG4vLyBTdGFuZGFyZCBJQmluYXJ5UmVhZGVyIGltcGxlbWVudGF0aW9uXG52YXIgYmluYXJ5X3JlYWRlcl8xID0gcmVxdWlyZShcIi4vYmluYXJ5LXJlYWRlclwiKTtcbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIkJpbmFyeVJlYWRlclwiLCB7IGVudW1lcmFibGU6IHRydWUsIGdldDogZnVuY3Rpb24gKCkgeyByZXR1cm4gYmluYXJ5X3JlYWRlcl8xLkJpbmFyeVJlYWRlcjsgfSB9KTtcbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcImJpbmFyeVJlYWRPcHRpb25zXCIsIHsgZW51bWVyYWJsZTogdHJ1ZSwgZ2V0OiBmdW5jdGlvbiAoKSB7IHJldHVybiBiaW5hcnlfcmVhZGVyXzEuYmluYXJ5UmVhZE9wdGlvbnM7IH0gfSk7XG4vLyBTdGFuZGFyZCBJQmluYXJ5V3JpdGVyIGltcGxlbWVudGF0aW9uXG52YXIgYmluYXJ5X3dyaXRlcl8xID0gcmVxdWlyZShcIi4vYmluYXJ5LXdyaXRlclwiKTtcbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIkJpbmFyeVdyaXRlclwiLCB7IGVudW1lcmFibGU6IHRydWUsIGdldDogZnVuY3Rpb24gKCkgeyByZXR1cm4gYmluYXJ5X3dyaXRlcl8xLkJpbmFyeVdyaXRlcjsgfSB9KTtcbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcImJpbmFyeVdyaXRlT3B0aW9uc1wiLCB7IGVudW1lcmFibGU6IHRydWUsIGdldDogZnVuY3Rpb24gKCkgeyByZXR1cm4gYmluYXJ5X3dyaXRlcl8xLmJpbmFyeVdyaXRlT3B0aW9uczsgfSB9KTtcbi8vIEludDY0IGFuZCBVSW50NjQgaW1wbGVtZW50YXRpb25zIHJlcXVpcmVkIGZvciB0aGUgYmluYXJ5IGZvcm1hdFxudmFyIHBiX2xvbmdfMSA9IHJlcXVpcmUoXCIuL3BiLWxvbmdcIik7XG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJQYkxvbmdcIiwgeyBlbnVtZXJhYmxlOiB0cnVlLCBnZXQ6IGZ1bmN0aW9uICgpIHsgcmV0dXJuIHBiX2xvbmdfMS5QYkxvbmc7IH0gfSk7XG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJQYlVMb25nXCIsIHsgZW51bWVyYWJsZTogdHJ1ZSwgZ2V0OiBmdW5jdGlvbiAoKSB7IHJldHVybiBwYl9sb25nXzEuUGJVTG9uZzsgfSB9KTtcbi8vIEpTT04gZm9ybWF0IGNvbnRyYWN0cywgb3B0aW9ucyBmb3IgcmVhZGluZyBhbmQgd3JpdGluZywgZm9yIGV4YW1wbGVcbnZhciBqc29uX2Zvcm1hdF9jb250cmFjdF8xID0gcmVxdWlyZShcIi4vanNvbi1mb3JtYXQtY29udHJhY3RcIik7XG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJqc29uUmVhZE9wdGlvbnNcIiwgeyBlbnVtZXJhYmxlOiB0cnVlLCBnZXQ6IGZ1bmN0aW9uICgpIHsgcmV0dXJuIGpzb25fZm9ybWF0X2NvbnRyYWN0XzEuanNvblJlYWRPcHRpb25zOyB9IH0pO1xuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwianNvbldyaXRlT3B0aW9uc1wiLCB7IGVudW1lcmFibGU6IHRydWUsIGdldDogZnVuY3Rpb24gKCkgeyByZXR1cm4ganNvbl9mb3JtYXRfY29udHJhY3RfMS5qc29uV3JpdGVPcHRpb25zOyB9IH0pO1xuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwibWVyZ2VKc29uT3B0aW9uc1wiLCB7IGVudW1lcmFibGU6IHRydWUsIGdldDogZnVuY3Rpb24gKCkgeyByZXR1cm4ganNvbl9mb3JtYXRfY29udHJhY3RfMS5tZXJnZUpzb25PcHRpb25zOyB9IH0pO1xuLy8gTWVzc2FnZSB0eXBlIGNvbnRyYWN0XG52YXIgbWVzc2FnZV90eXBlX2NvbnRyYWN0XzEgPSByZXF1aXJlKFwiLi9tZXNzYWdlLXR5cGUtY29udHJhY3RcIik7XG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJNRVNTQUdFX1RZUEVcIiwgeyBlbnVtZXJhYmxlOiB0cnVlLCBnZXQ6IGZ1bmN0aW9uICgpIHsgcmV0dXJuIG1lc3NhZ2VfdHlwZV9jb250cmFjdF8xLk1FU1NBR0VfVFlQRTsgfSB9KTtcbi8vIE1lc3NhZ2UgdHlwZSBpbXBsZW1lbnRhdGlvbiB2aWEgcmVmbGVjdGlvblxudmFyIG1lc3NhZ2VfdHlwZV8xID0gcmVxdWlyZShcIi4vbWVzc2FnZS10eXBlXCIpO1xuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiTWVzc2FnZVR5cGVcIiwgeyBlbnVtZXJhYmxlOiB0cnVlLCBnZXQ6IGZ1bmN0aW9uICgpIHsgcmV0dXJuIG1lc3NhZ2VfdHlwZV8xLk1lc3NhZ2VUeXBlOyB9IH0pO1xuLy8gUmVmbGVjdGlvbiBpbmZvLCBnZW5lcmF0ZWQgYnkgdGhlIHBsdWdpbiwgZXhwb3NlZCB0byB0aGUgdXNlciwgdXNlZCBieSByZWZsZWN0aW9uIG9wc1xudmFyIHJlZmxlY3Rpb25faW5mb18xID0gcmVxdWlyZShcIi4vcmVmbGVjdGlvbi1pbmZvXCIpO1xuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiU2NhbGFyVHlwZVwiLCB7IGVudW1lcmFibGU6IHRydWUsIGdldDogZnVuY3Rpb24gKCkgeyByZXR1cm4gcmVmbGVjdGlvbl9pbmZvXzEuU2NhbGFyVHlwZTsgfSB9KTtcbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIkxvbmdUeXBlXCIsIHsgZW51bWVyYWJsZTogdHJ1ZSwgZ2V0OiBmdW5jdGlvbiAoKSB7IHJldHVybiByZWZsZWN0aW9uX2luZm9fMS5Mb25nVHlwZTsgfSB9KTtcbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIlJlcGVhdFR5cGVcIiwgeyBlbnVtZXJhYmxlOiB0cnVlLCBnZXQ6IGZ1bmN0aW9uICgpIHsgcmV0dXJuIHJlZmxlY3Rpb25faW5mb18xLlJlcGVhdFR5cGU7IH0gfSk7XG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJub3JtYWxpemVGaWVsZEluZm9cIiwgeyBlbnVtZXJhYmxlOiB0cnVlLCBnZXQ6IGZ1bmN0aW9uICgpIHsgcmV0dXJuIHJlZmxlY3Rpb25faW5mb18xLm5vcm1hbGl6ZUZpZWxkSW5mbzsgfSB9KTtcbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcInJlYWRGaWVsZE9wdGlvbnNcIiwgeyBlbnVtZXJhYmxlOiB0cnVlLCBnZXQ6IGZ1bmN0aW9uICgpIHsgcmV0dXJuIHJlZmxlY3Rpb25faW5mb18xLnJlYWRGaWVsZE9wdGlvbnM7IH0gfSk7XG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJyZWFkRmllbGRPcHRpb25cIiwgeyBlbnVtZXJhYmxlOiB0cnVlLCBnZXQ6IGZ1bmN0aW9uICgpIHsgcmV0dXJuIHJlZmxlY3Rpb25faW5mb18xLnJlYWRGaWVsZE9wdGlvbjsgfSB9KTtcbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcInJlYWRNZXNzYWdlT3B0aW9uXCIsIHsgZW51bWVyYWJsZTogdHJ1ZSwgZ2V0OiBmdW5jdGlvbiAoKSB7IHJldHVybiByZWZsZWN0aW9uX2luZm9fMS5yZWFkTWVzc2FnZU9wdGlvbjsgfSB9KTtcbi8vIE1lc3NhZ2Ugb3BlcmF0aW9ucyB2aWEgcmVmbGVjdGlvblxudmFyIHJlZmxlY3Rpb25fdHlwZV9jaGVja18xID0gcmVxdWlyZShcIi4vcmVmbGVjdGlvbi10eXBlLWNoZWNrXCIpO1xuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiUmVmbGVjdGlvblR5cGVDaGVja1wiLCB7IGVudW1lcmFibGU6IHRydWUsIGdldDogZnVuY3Rpb24gKCkgeyByZXR1cm4gcmVmbGVjdGlvbl90eXBlX2NoZWNrXzEuUmVmbGVjdGlvblR5cGVDaGVjazsgfSB9KTtcbnZhciByZWZsZWN0aW9uX2NyZWF0ZV8xID0gcmVxdWlyZShcIi4vcmVmbGVjdGlvbi1jcmVhdGVcIik7XG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJyZWZsZWN0aW9uQ3JlYXRlXCIsIHsgZW51bWVyYWJsZTogdHJ1ZSwgZ2V0OiBmdW5jdGlvbiAoKSB7IHJldHVybiByZWZsZWN0aW9uX2NyZWF0ZV8xLnJlZmxlY3Rpb25DcmVhdGU7IH0gfSk7XG52YXIgcmVmbGVjdGlvbl9zY2FsYXJfZGVmYXVsdF8xID0gcmVxdWlyZShcIi4vcmVmbGVjdGlvbi1zY2FsYXItZGVmYXVsdFwiKTtcbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcInJlZmxlY3Rpb25TY2FsYXJEZWZhdWx0XCIsIHsgZW51bWVyYWJsZTogdHJ1ZSwgZ2V0OiBmdW5jdGlvbiAoKSB7IHJldHVybiByZWZsZWN0aW9uX3NjYWxhcl9kZWZhdWx0XzEucmVmbGVjdGlvblNjYWxhckRlZmF1bHQ7IH0gfSk7XG52YXIgcmVmbGVjdGlvbl9tZXJnZV9wYXJ0aWFsXzEgPSByZXF1aXJlKFwiLi9yZWZsZWN0aW9uLW1lcmdlLXBhcnRpYWxcIik7XG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJyZWZsZWN0aW9uTWVyZ2VQYXJ0aWFsXCIsIHsgZW51bWVyYWJsZTogdHJ1ZSwgZ2V0OiBmdW5jdGlvbiAoKSB7IHJldHVybiByZWZsZWN0aW9uX21lcmdlX3BhcnRpYWxfMS5yZWZsZWN0aW9uTWVyZ2VQYXJ0aWFsOyB9IH0pO1xudmFyIHJlZmxlY3Rpb25fZXF1YWxzXzEgPSByZXF1aXJlKFwiLi9yZWZsZWN0aW9uLWVxdWFsc1wiKTtcbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcInJlZmxlY3Rpb25FcXVhbHNcIiwgeyBlbnVtZXJhYmxlOiB0cnVlLCBnZXQ6IGZ1bmN0aW9uICgpIHsgcmV0dXJuIHJlZmxlY3Rpb25fZXF1YWxzXzEucmVmbGVjdGlvbkVxdWFsczsgfSB9KTtcbnZhciByZWZsZWN0aW9uX2JpbmFyeV9yZWFkZXJfMSA9IHJlcXVpcmUoXCIuL3JlZmxlY3Rpb24tYmluYXJ5LXJlYWRlclwiKTtcbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIlJlZmxlY3Rpb25CaW5hcnlSZWFkZXJcIiwgeyBlbnVtZXJhYmxlOiB0cnVlLCBnZXQ6IGZ1bmN0aW9uICgpIHsgcmV0dXJuIHJlZmxlY3Rpb25fYmluYXJ5X3JlYWRlcl8xLlJlZmxlY3Rpb25CaW5hcnlSZWFkZXI7IH0gfSk7XG52YXIgcmVmbGVjdGlvbl9iaW5hcnlfd3JpdGVyXzEgPSByZXF1aXJlKFwiLi9yZWZsZWN0aW9uLWJpbmFyeS13cml0ZXJcIik7XG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJSZWZsZWN0aW9uQmluYXJ5V3JpdGVyXCIsIHsgZW51bWVyYWJsZTogdHJ1ZSwgZ2V0OiBmdW5jdGlvbiAoKSB7IHJldHVybiByZWZsZWN0aW9uX2JpbmFyeV93cml0ZXJfMS5SZWZsZWN0aW9uQmluYXJ5V3JpdGVyOyB9IH0pO1xudmFyIHJlZmxlY3Rpb25fanNvbl9yZWFkZXJfMSA9IHJlcXVpcmUoXCIuL3JlZmxlY3Rpb24tanNvbi1yZWFkZXJcIik7XG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJSZWZsZWN0aW9uSnNvblJlYWRlclwiLCB7IGVudW1lcmFibGU6IHRydWUsIGdldDogZnVuY3Rpb24gKCkgeyByZXR1cm4gcmVmbGVjdGlvbl9qc29uX3JlYWRlcl8xLlJlZmxlY3Rpb25Kc29uUmVhZGVyOyB9IH0pO1xudmFyIHJlZmxlY3Rpb25fanNvbl93cml0ZXJfMSA9IHJlcXVpcmUoXCIuL3JlZmxlY3Rpb24tanNvbi13cml0ZXJcIik7XG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJSZWZsZWN0aW9uSnNvbldyaXRlclwiLCB7IGVudW1lcmFibGU6IHRydWUsIGdldDogZnVuY3Rpb24gKCkgeyByZXR1cm4gcmVmbGVjdGlvbl9qc29uX3dyaXRlcl8xLlJlZmxlY3Rpb25Kc29uV3JpdGVyOyB9IH0pO1xudmFyIHJlZmxlY3Rpb25fY29udGFpbnNfbWVzc2FnZV90eXBlXzEgPSByZXF1aXJlKFwiLi9yZWZsZWN0aW9uLWNvbnRhaW5zLW1lc3NhZ2UtdHlwZVwiKTtcbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcImNvbnRhaW5zTWVzc2FnZVR5cGVcIiwgeyBlbnVtZXJhYmxlOiB0cnVlLCBnZXQ6IGZ1bmN0aW9uICgpIHsgcmV0dXJuIHJlZmxlY3Rpb25fY29udGFpbnNfbWVzc2FnZV90eXBlXzEuY29udGFpbnNNZXNzYWdlVHlwZTsgfSB9KTtcbi8vIE9uZW9mIGhlbHBlcnNcbnZhciBvbmVvZl8xID0gcmVxdWlyZShcIi4vb25lb2ZcIik7XG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJpc09uZW9mR3JvdXBcIiwgeyBlbnVtZXJhYmxlOiB0cnVlLCBnZXQ6IGZ1bmN0aW9uICgpIHsgcmV0dXJuIG9uZW9mXzEuaXNPbmVvZkdyb3VwOyB9IH0pO1xuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwic2V0T25lb2ZWYWx1ZVwiLCB7IGVudW1lcmFibGU6IHRydWUsIGdldDogZnVuY3Rpb24gKCkgeyByZXR1cm4gb25lb2ZfMS5zZXRPbmVvZlZhbHVlOyB9IH0pO1xuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiZ2V0T25lb2ZWYWx1ZVwiLCB7IGVudW1lcmFibGU6IHRydWUsIGdldDogZnVuY3Rpb24gKCkgeyByZXR1cm4gb25lb2ZfMS5nZXRPbmVvZlZhbHVlOyB9IH0pO1xuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiY2xlYXJPbmVvZlZhbHVlXCIsIHsgZW51bWVyYWJsZTogdHJ1ZSwgZ2V0OiBmdW5jdGlvbiAoKSB7IHJldHVybiBvbmVvZl8xLmNsZWFyT25lb2ZWYWx1ZTsgfSB9KTtcbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcImdldFNlbGVjdGVkT25lb2ZWYWx1ZVwiLCB7IGVudW1lcmFibGU6IHRydWUsIGdldDogZnVuY3Rpb24gKCkgeyByZXR1cm4gb25lb2ZfMS5nZXRTZWxlY3RlZE9uZW9mVmFsdWU7IH0gfSk7XG4vLyBFbnVtIG9iamVjdCB0eXBlIGd1YXJkIGFuZCByZWZsZWN0aW9uIHV0aWwsIG1heSBiZSBpbnRlcmVzdGluZyB0byB0aGUgdXNlci5cbnZhciBlbnVtX29iamVjdF8xID0gcmVxdWlyZShcIi4vZW51bS1vYmplY3RcIik7XG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJsaXN0RW51bVZhbHVlc1wiLCB7IGVudW1lcmFibGU6IHRydWUsIGdldDogZnVuY3Rpb24gKCkgeyByZXR1cm4gZW51bV9vYmplY3RfMS5saXN0RW51bVZhbHVlczsgfSB9KTtcbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcImxpc3RFbnVtTmFtZXNcIiwgeyBlbnVtZXJhYmxlOiB0cnVlLCBnZXQ6IGZ1bmN0aW9uICgpIHsgcmV0dXJuIGVudW1fb2JqZWN0XzEubGlzdEVudW1OYW1lczsgfSB9KTtcbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcImxpc3RFbnVtTnVtYmVyc1wiLCB7IGVudW1lcmFibGU6IHRydWUsIGdldDogZnVuY3Rpb24gKCkgeyByZXR1cm4gZW51bV9vYmplY3RfMS5saXN0RW51bU51bWJlcnM7IH0gfSk7XG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJpc0VudW1PYmplY3RcIiwgeyBlbnVtZXJhYmxlOiB0cnVlLCBnZXQ6IGZ1bmN0aW9uICgpIHsgcmV0dXJuIGVudW1fb2JqZWN0XzEuaXNFbnVtT2JqZWN0OyB9IH0pO1xuLy8gbG93ZXJDYW1lbENhc2UoKSBpcyBleHBvcnRlZCBmb3IgcGx1Z2luLCBycGMtcnVudGltZSBhbmQgb3RoZXIgcnBjIHBhY2thZ2VzXG52YXIgbG93ZXJfY2FtZWxfY2FzZV8xID0gcmVxdWlyZShcIi4vbG93ZXItY2FtZWwtY2FzZVwiKTtcbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcImxvd2VyQ2FtZWxDYXNlXCIsIHsgZW51bWVyYWJsZTogdHJ1ZSwgZ2V0OiBmdW5jdGlvbiAoKSB7IHJldHVybiBsb3dlcl9jYW1lbF9jYXNlXzEubG93ZXJDYW1lbENhc2U7IH0gfSk7XG4vLyBhc3NlcnRpb24gZnVuY3Rpb25zIGFyZSBleHBvcnRlZCBmb3IgcGx1Z2luLCBtYXkgYWxzbyBiZSB1c2VmdWwgdG8gdXNlclxudmFyIGFzc2VydF8xID0gcmVxdWlyZShcIi4vYXNzZXJ0XCIpO1xuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiYXNzZXJ0XCIsIHsgZW51bWVyYWJsZTogdHJ1ZSwgZ2V0OiBmdW5jdGlvbiAoKSB7IHJldHVybiBhc3NlcnRfMS5hc3NlcnQ7IH0gfSk7XG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJhc3NlcnROZXZlclwiLCB7IGVudW1lcmFibGU6IHRydWUsIGdldDogZnVuY3Rpb24gKCkgeyByZXR1cm4gYXNzZXJ0XzEuYXNzZXJ0TmV2ZXI7IH0gfSk7XG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJhc3NlcnRJbnQzMlwiLCB7IGVudW1lcmFibGU6IHRydWUsIGdldDogZnVuY3Rpb24gKCkgeyByZXR1cm4gYXNzZXJ0XzEuYXNzZXJ0SW50MzI7IH0gfSk7XG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJhc3NlcnRVSW50MzJcIiwgeyBlbnVtZXJhYmxlOiB0cnVlLCBnZXQ6IGZ1bmN0aW9uICgpIHsgcmV0dXJuIGFzc2VydF8xLmFzc2VydFVJbnQzMjsgfSB9KTtcbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcImFzc2VydEZsb2F0MzJcIiwgeyBlbnVtZXJhYmxlOiB0cnVlLCBnZXQ6IGZ1bmN0aW9uICgpIHsgcmV0dXJuIGFzc2VydF8xLmFzc2VydEZsb2F0MzI7IH0gfSk7XG4iLAogICAgIlwidXNlIHN0cmljdFwiO1xuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiX19lc01vZHVsZVwiLCB7IHZhbHVlOiB0cnVlIH0pO1xuZXhwb3J0cy5UaW1lc3RhbXAgPSB2b2lkIDA7XG5jb25zdCBydW50aW1lXzEgPSByZXF1aXJlKFwiQHByb3RvYnVmLXRzL3J1bnRpbWVcIik7XG5jb25zdCBydW50aW1lXzIgPSByZXF1aXJlKFwiQHByb3RvYnVmLXRzL3J1bnRpbWVcIik7XG5jb25zdCBydW50aW1lXzMgPSByZXF1aXJlKFwiQHByb3RvYnVmLXRzL3J1bnRpbWVcIik7XG5jb25zdCBydW50aW1lXzQgPSByZXF1aXJlKFwiQHByb3RvYnVmLXRzL3J1bnRpbWVcIik7XG5jb25zdCBydW50aW1lXzUgPSByZXF1aXJlKFwiQHByb3RvYnVmLXRzL3J1bnRpbWVcIik7XG5jb25zdCBydW50aW1lXzYgPSByZXF1aXJlKFwiQHByb3RvYnVmLXRzL3J1bnRpbWVcIik7XG5jb25zdCBydW50aW1lXzcgPSByZXF1aXJlKFwiQHByb3RvYnVmLXRzL3J1bnRpbWVcIik7XG4vLyBAZ2VuZXJhdGVkIG1lc3NhZ2UgdHlwZSB3aXRoIHJlZmxlY3Rpb24gaW5mb3JtYXRpb24sIG1heSBwcm92aWRlIHNwZWVkIG9wdGltaXplZCBtZXRob2RzXG5jbGFzcyBUaW1lc3RhbXAkVHlwZSBleHRlbmRzIHJ1bnRpbWVfNy5NZXNzYWdlVHlwZSB7XG4gICAgY29uc3RydWN0b3IoKSB7XG4gICAgICAgIHN1cGVyKFwiZ29vZ2xlLnByb3RvYnVmLlRpbWVzdGFtcFwiLCBbXG4gICAgICAgICAgICB7IG5vOiAxLCBuYW1lOiBcInNlY29uZHNcIiwga2luZDogXCJzY2FsYXJcIiwgVDogMyAvKlNjYWxhclR5cGUuSU5UNjQqLyB9LFxuICAgICAgICAgICAgeyBubzogMiwgbmFtZTogXCJuYW5vc1wiLCBraW5kOiBcInNjYWxhclwiLCBUOiA1IC8qU2NhbGFyVHlwZS5JTlQzMiovIH1cbiAgICAgICAgXSk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIENyZWF0ZXMgYSBuZXcgYFRpbWVzdGFtcGAgZm9yIHRoZSBjdXJyZW50IHRpbWUuXG4gICAgICovXG4gICAgbm93KCkge1xuICAgICAgICBjb25zdCBtc2cgPSB0aGlzLmNyZWF0ZSgpO1xuICAgICAgICBjb25zdCBtcyA9IERhdGUubm93KCk7XG4gICAgICAgIG1zZy5zZWNvbmRzID0gcnVudGltZV82LlBiTG9uZy5mcm9tKE1hdGguZmxvb3IobXMgLyAxMDAwKSkudG9TdHJpbmcoKTtcbiAgICAgICAgbXNnLm5hbm9zID0gKG1zICUgMTAwMCkgKiAxMDAwMDAwO1xuICAgICAgICByZXR1cm4gbXNnO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBDb252ZXJ0cyBhIGBUaW1lc3RhbXBgIHRvIGEgSmF2YVNjcmlwdCBEYXRlLlxuICAgICAqL1xuICAgIHRvRGF0ZShtZXNzYWdlKSB7XG4gICAgICAgIHJldHVybiBuZXcgRGF0ZShydW50aW1lXzYuUGJMb25nLmZyb20obWVzc2FnZS5zZWNvbmRzKS50b051bWJlcigpICogMTAwMCArIE1hdGguY2VpbChtZXNzYWdlLm5hbm9zIC8gMTAwMDAwMCkpO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBDb252ZXJ0cyBhIEphdmFTY3JpcHQgRGF0ZSB0byBhIGBUaW1lc3RhbXBgLlxuICAgICAqL1xuICAgIGZyb21EYXRlKGRhdGUpIHtcbiAgICAgICAgY29uc3QgbXNnID0gdGhpcy5jcmVhdGUoKTtcbiAgICAgICAgY29uc3QgbXMgPSBkYXRlLmdldFRpbWUoKTtcbiAgICAgICAgbXNnLnNlY29uZHMgPSBydW50aW1lXzYuUGJMb25nLmZyb20oTWF0aC5mbG9vcihtcyAvIDEwMDApKS50b1N0cmluZygpO1xuICAgICAgICBtc2cubmFub3MgPSAobXMgJSAxMDAwKSAqIDEwMDAwMDA7XG4gICAgICAgIHJldHVybiBtc2c7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIEluIEpTT04gZm9ybWF0LCB0aGUgYFRpbWVzdGFtcGAgdHlwZSBpcyBlbmNvZGVkIGFzIGEgc3RyaW5nXG4gICAgICogaW4gdGhlIFJGQyAzMzM5IGZvcm1hdC5cbiAgICAgKi9cbiAgICBpbnRlcm5hbEpzb25Xcml0ZShtZXNzYWdlLCBvcHRpb25zKSB7XG4gICAgICAgIGxldCBtcyA9IHJ1bnRpbWVfNi5QYkxvbmcuZnJvbShtZXNzYWdlLnNlY29uZHMpLnRvTnVtYmVyKCkgKiAxMDAwO1xuICAgICAgICBpZiAobXMgPCBEYXRlLnBhcnNlKFwiMDAwMS0wMS0wMVQwMDowMDowMFpcIikgfHwgbXMgPiBEYXRlLnBhcnNlKFwiOTk5OS0xMi0zMVQyMzo1OTo1OVpcIikpXG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJVbmFibGUgdG8gZW5jb2RlIFRpbWVzdGFtcCB0byBKU09OLiBNdXN0IGJlIGZyb20gMDAwMS0wMS0wMVQwMDowMDowMFogdG8gOTk5OS0xMi0zMVQyMzo1OTo1OVogaW5jbHVzaXZlLlwiKTtcbiAgICAgICAgaWYgKG1lc3NhZ2UubmFub3MgPCAwKVxuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwiVW5hYmxlIHRvIGVuY29kZSBpbnZhbGlkIFRpbWVzdGFtcCB0byBKU09OLiBOYW5vcyBtdXN0IG5vdCBiZSBuZWdhdGl2ZS5cIik7XG4gICAgICAgIGxldCB6ID0gXCJaXCI7XG4gICAgICAgIGlmIChtZXNzYWdlLm5hbm9zID4gMCkge1xuICAgICAgICAgICAgbGV0IG5hbm9zU3RyID0gKG1lc3NhZ2UubmFub3MgKyAxMDAwMDAwMDAwKS50b1N0cmluZygpLnN1YnN0cmluZygxKTtcbiAgICAgICAgICAgIGlmIChuYW5vc1N0ci5zdWJzdHJpbmcoMykgPT09IFwiMDAwMDAwXCIpXG4gICAgICAgICAgICAgICAgeiA9IFwiLlwiICsgbmFub3NTdHIuc3Vic3RyaW5nKDAsIDMpICsgXCJaXCI7XG4gICAgICAgICAgICBlbHNlIGlmIChuYW5vc1N0ci5zdWJzdHJpbmcoNikgPT09IFwiMDAwXCIpXG4gICAgICAgICAgICAgICAgeiA9IFwiLlwiICsgbmFub3NTdHIuc3Vic3RyaW5nKDAsIDYpICsgXCJaXCI7XG4gICAgICAgICAgICBlbHNlXG4gICAgICAgICAgICAgICAgeiA9IFwiLlwiICsgbmFub3NTdHIgKyBcIlpcIjtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gbmV3IERhdGUobXMpLnRvSVNPU3RyaW5nKCkucmVwbGFjZShcIi4wMDBaXCIsIHopO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBJbiBKU09OIGZvcm1hdCwgdGhlIGBUaW1lc3RhbXBgIHR5cGUgaXMgZW5jb2RlZCBhcyBhIHN0cmluZ1xuICAgICAqIGluIHRoZSBSRkMgMzMzOSBmb3JtYXQuXG4gICAgICovXG4gICAgaW50ZXJuYWxKc29uUmVhZChqc29uLCBvcHRpb25zLCB0YXJnZXQpIHtcbiAgICAgICAgaWYgKHR5cGVvZiBqc29uICE9PSBcInN0cmluZ1wiKVxuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwiVW5hYmxlIHRvIHBhcnNlIFRpbWVzdGFtcCBmcm9tIEpTT04gXCIgKyAoMCwgcnVudGltZV81LnR5cGVvZkpzb25WYWx1ZSkoanNvbikgKyBcIi5cIik7XG4gICAgICAgIGxldCBtYXRjaGVzID0ganNvbi5tYXRjaCgvXihbMC05XXs0fSktKFswLTldezJ9KS0oWzAtOV17Mn0pVChbMC05XXsyfSk6KFswLTldezJ9KTooWzAtOV17Mn0pKD86WnxcXC4oWzAtOV17Myw5fSlafChbKy1dWzAtOV1bMC05XTpbMC05XVswLTldKSkkLyk7XG4gICAgICAgIGlmICghbWF0Y2hlcylcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihcIlVuYWJsZSB0byBwYXJzZSBUaW1lc3RhbXAgZnJvbSBKU09OLiBJbnZhbGlkIGZvcm1hdC5cIik7XG4gICAgICAgIGxldCBtcyA9IERhdGUucGFyc2UobWF0Y2hlc1sxXSArIFwiLVwiICsgbWF0Y2hlc1syXSArIFwiLVwiICsgbWF0Y2hlc1szXSArIFwiVFwiICsgbWF0Y2hlc1s0XSArIFwiOlwiICsgbWF0Y2hlc1s1XSArIFwiOlwiICsgbWF0Y2hlc1s2XSArIChtYXRjaGVzWzhdID8gbWF0Y2hlc1s4XSA6IFwiWlwiKSk7XG4gICAgICAgIGlmIChOdW1iZXIuaXNOYU4obXMpKVxuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwiVW5hYmxlIHRvIHBhcnNlIFRpbWVzdGFtcCBmcm9tIEpTT04uIEludmFsaWQgdmFsdWUuXCIpO1xuICAgICAgICBpZiAobXMgPCBEYXRlLnBhcnNlKFwiMDAwMS0wMS0wMVQwMDowMDowMFpcIikgfHwgbXMgPiBEYXRlLnBhcnNlKFwiOTk5OS0xMi0zMVQyMzo1OTo1OVpcIikpXG4gICAgICAgICAgICB0aHJvdyBuZXcgZ2xvYmFsVGhpcy5FcnJvcihcIlVuYWJsZSB0byBwYXJzZSBUaW1lc3RhbXAgZnJvbSBKU09OLiBNdXN0IGJlIGZyb20gMDAwMS0wMS0wMVQwMDowMDowMFogdG8gOTk5OS0xMi0zMVQyMzo1OTo1OVogaW5jbHVzaXZlLlwiKTtcbiAgICAgICAgaWYgKCF0YXJnZXQpXG4gICAgICAgICAgICB0YXJnZXQgPSB0aGlzLmNyZWF0ZSgpO1xuICAgICAgICB0YXJnZXQuc2Vjb25kcyA9IHJ1bnRpbWVfNi5QYkxvbmcuZnJvbShtcyAvIDEwMDApLnRvU3RyaW5nKCk7XG4gICAgICAgIHRhcmdldC5uYW5vcyA9IDA7XG4gICAgICAgIGlmIChtYXRjaGVzWzddKVxuICAgICAgICAgICAgdGFyZ2V0Lm5hbm9zID0gKHBhcnNlSW50KFwiMVwiICsgbWF0Y2hlc1s3XSArIFwiMFwiLnJlcGVhdCg5IC0gbWF0Y2hlc1s3XS5sZW5ndGgpKSAtIDEwMDAwMDAwMDApO1xuICAgICAgICByZXR1cm4gdGFyZ2V0O1xuICAgIH1cbiAgICBjcmVhdGUodmFsdWUpIHtcbiAgICAgICAgY29uc3QgbWVzc2FnZSA9IHsgc2Vjb25kczogXCIwXCIsIG5hbm9zOiAwIH07XG4gICAgICAgIGdsb2JhbFRoaXMuT2JqZWN0LmRlZmluZVByb3BlcnR5KG1lc3NhZ2UsIHJ1bnRpbWVfNC5NRVNTQUdFX1RZUEUsIHsgZW51bWVyYWJsZTogZmFsc2UsIHZhbHVlOiB0aGlzIH0pO1xuICAgICAgICBpZiAodmFsdWUgIT09IHVuZGVmaW5lZClcbiAgICAgICAgICAgICgwLCBydW50aW1lXzMucmVmbGVjdGlvbk1lcmdlUGFydGlhbCkodGhpcywgbWVzc2FnZSwgdmFsdWUpO1xuICAgICAgICByZXR1cm4gbWVzc2FnZTtcbiAgICB9XG4gICAgaW50ZXJuYWxCaW5hcnlSZWFkKHJlYWRlciwgbGVuZ3RoLCBvcHRpb25zLCB0YXJnZXQpIHtcbiAgICAgICAgbGV0IG1lc3NhZ2UgPSB0YXJnZXQgIT09IG51bGwgJiYgdGFyZ2V0ICE9PSB2b2lkIDAgPyB0YXJnZXQgOiB0aGlzLmNyZWF0ZSgpLCBlbmQgPSByZWFkZXIucG9zICsgbGVuZ3RoO1xuICAgICAgICB3aGlsZSAocmVhZGVyLnBvcyA8IGVuZCkge1xuICAgICAgICAgICAgbGV0IFtmaWVsZE5vLCB3aXJlVHlwZV0gPSByZWFkZXIudGFnKCk7XG4gICAgICAgICAgICBzd2l0Y2ggKGZpZWxkTm8pIHtcbiAgICAgICAgICAgICAgICBjYXNlIC8qIGludDY0IHNlY29uZHMgKi8gMTpcbiAgICAgICAgICAgICAgICAgICAgbWVzc2FnZS5zZWNvbmRzID0gcmVhZGVyLmludDY0KCkudG9TdHJpbmcoKTtcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgY2FzZSAvKiBpbnQzMiBuYW5vcyAqLyAyOlxuICAgICAgICAgICAgICAgICAgICBtZXNzYWdlLm5hbm9zID0gcmVhZGVyLmludDMyKCk7XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgICAgICAgICAgIGxldCB1ID0gb3B0aW9ucy5yZWFkVW5rbm93bkZpZWxkO1xuICAgICAgICAgICAgICAgICAgICBpZiAodSA9PT0gXCJ0aHJvd1wiKVxuICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IGdsb2JhbFRoaXMuRXJyb3IoYFVua25vd24gZmllbGQgJHtmaWVsZE5vfSAod2lyZSB0eXBlICR7d2lyZVR5cGV9KSBmb3IgJHt0aGlzLnR5cGVOYW1lfWApO1xuICAgICAgICAgICAgICAgICAgICBsZXQgZCA9IHJlYWRlci5za2lwKHdpcmVUeXBlKTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKHUgIT09IGZhbHNlKVxuICAgICAgICAgICAgICAgICAgICAgICAgKHUgPT09IHRydWUgPyBydW50aW1lXzIuVW5rbm93bkZpZWxkSGFuZGxlci5vblJlYWQgOiB1KSh0aGlzLnR5cGVOYW1lLCBtZXNzYWdlLCBmaWVsZE5vLCB3aXJlVHlwZSwgZCk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIG1lc3NhZ2U7XG4gICAgfVxuICAgIGludGVybmFsQmluYXJ5V3JpdGUobWVzc2FnZSwgd3JpdGVyLCBvcHRpb25zKSB7XG4gICAgICAgIC8qIGludDY0IHNlY29uZHMgPSAxOyAqL1xuICAgICAgICBpZiAobWVzc2FnZS5zZWNvbmRzICE9PSBcIjBcIilcbiAgICAgICAgICAgIHdyaXRlci50YWcoMSwgcnVudGltZV8xLldpcmVUeXBlLlZhcmludCkuaW50NjQobWVzc2FnZS5zZWNvbmRzKTtcbiAgICAgICAgLyogaW50MzIgbmFub3MgPSAyOyAqL1xuICAgICAgICBpZiAobWVzc2FnZS5uYW5vcyAhPT0gMClcbiAgICAgICAgICAgIHdyaXRlci50YWcoMiwgcnVudGltZV8xLldpcmVUeXBlLlZhcmludCkuaW50MzIobWVzc2FnZS5uYW5vcyk7XG4gICAgICAgIGxldCB1ID0gb3B0aW9ucy53cml0ZVVua25vd25GaWVsZHM7XG4gICAgICAgIGlmICh1ICE9PSBmYWxzZSlcbiAgICAgICAgICAgICh1ID09IHRydWUgPyBydW50aW1lXzIuVW5rbm93bkZpZWxkSGFuZGxlci5vbldyaXRlIDogdSkodGhpcy50eXBlTmFtZSwgbWVzc2FnZSwgd3JpdGVyKTtcbiAgICAgICAgcmV0dXJuIHdyaXRlcjtcbiAgICB9XG59XG4vKipcbiAqIEBnZW5lcmF0ZWQgTWVzc2FnZVR5cGUgZm9yIHByb3RvYnVmIG1lc3NhZ2UgZ29vZ2xlLnByb3RvYnVmLlRpbWVzdGFtcFxuICovXG5leHBvcnRzLlRpbWVzdGFtcCA9IG5ldyBUaW1lc3RhbXAkVHlwZSgpO1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9dGltZXN0YW1wLmpzLm1hcCIsCiAgICAiXCJ1c2Ugc3RyaWN0XCI7XG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJfX2VzTW9kdWxlXCIsIHsgdmFsdWU6IHRydWUgfSk7XG5leHBvcnRzLkJ5dGVzVmFsdWUgPSBleHBvcnRzLlN0cmluZ1ZhbHVlID0gZXhwb3J0cy5Cb29sVmFsdWUgPSBleHBvcnRzLlVJbnQzMlZhbHVlID0gZXhwb3J0cy5JbnQzMlZhbHVlID0gZXhwb3J0cy5VSW50NjRWYWx1ZSA9IGV4cG9ydHMuSW50NjRWYWx1ZSA9IGV4cG9ydHMuRmxvYXRWYWx1ZSA9IGV4cG9ydHMuRG91YmxlVmFsdWUgPSB2b2lkIDA7XG4vLyBAZ2VuZXJhdGVkIGJ5IHByb3RvYnVmLXRzIDIuOS4xIHdpdGggcGFyYW1ldGVyIGxvbmdfdHlwZV9zdHJpbmcsY2xpZW50X25vbmUsZ2VuZXJhdGVfZGVwZW5kZW5jaWVzXG4vLyBAZ2VuZXJhdGVkIGZyb20gcHJvdG9idWYgZmlsZSBcImdvb2dsZS9wcm90b2J1Zi93cmFwcGVycy5wcm90b1wiIChwYWNrYWdlIFwiZ29vZ2xlLnByb3RvYnVmXCIsIHN5bnRheCBwcm90bzMpXG4vLyB0c2xpbnQ6ZGlzYWJsZVxuLy9cbi8vIFByb3RvY29sIEJ1ZmZlcnMgLSBHb29nbGUncyBkYXRhIGludGVyY2hhbmdlIGZvcm1hdFxuLy8gQ29weXJpZ2h0IDIwMDggR29vZ2xlIEluYy4gIEFsbCByaWdodHMgcmVzZXJ2ZWQuXG4vLyBodHRwczovL2RldmVsb3BlcnMuZ29vZ2xlLmNvbS9wcm90b2NvbC1idWZmZXJzL1xuLy9cbi8vIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dFxuLy8gbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZVxuLy8gbWV0OlxuLy9cbi8vICAgICAqIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0XG4vLyBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuXG4vLyAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlXG4vLyBjb3B5cmlnaHQgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyXG4vLyBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlXG4vLyBkaXN0cmlidXRpb24uXG4vLyAgICAgKiBOZWl0aGVyIHRoZSBuYW1lIG9mIEdvb2dsZSBJbmMuIG5vciB0aGUgbmFtZXMgb2YgaXRzXG4vLyBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbVxuLy8gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi5cbi8vXG4vLyBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTXG4vLyBcIkFTIElTXCIgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UXG4vLyBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1Jcbi8vIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUXG4vLyBPV05FUiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCxcbi8vIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1Rcbi8vIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLFxuLy8gREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZXG4vLyBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUXG4vLyAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0Vcbi8vIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuXG4vL1xuLy9cbi8vIFdyYXBwZXJzIGZvciBwcmltaXRpdmUgKG5vbi1tZXNzYWdlKSB0eXBlcy4gVGhlc2UgdHlwZXMgYXJlIHVzZWZ1bFxuLy8gZm9yIGVtYmVkZGluZyBwcmltaXRpdmVzIGluIHRoZSBgZ29vZ2xlLnByb3RvYnVmLkFueWAgdHlwZSBhbmQgZm9yIHBsYWNlc1xuLy8gd2hlcmUgd2UgbmVlZCB0byBkaXN0aW5ndWlzaCBiZXR3ZWVuIHRoZSBhYnNlbmNlIG9mIGEgcHJpbWl0aXZlXG4vLyB0eXBlZCBmaWVsZCBhbmQgaXRzIGRlZmF1bHQgdmFsdWUuXG4vL1xuY29uc3QgcnVudGltZV8xID0gcmVxdWlyZShcIkBwcm90b2J1Zi10cy9ydW50aW1lXCIpO1xuY29uc3QgcnVudGltZV8yID0gcmVxdWlyZShcIkBwcm90b2J1Zi10cy9ydW50aW1lXCIpO1xuY29uc3QgcnVudGltZV8zID0gcmVxdWlyZShcIkBwcm90b2J1Zi10cy9ydW50aW1lXCIpO1xuY29uc3QgcnVudGltZV80ID0gcmVxdWlyZShcIkBwcm90b2J1Zi10cy9ydW50aW1lXCIpO1xuY29uc3QgcnVudGltZV81ID0gcmVxdWlyZShcIkBwcm90b2J1Zi10cy9ydW50aW1lXCIpO1xuY29uc3QgcnVudGltZV82ID0gcmVxdWlyZShcIkBwcm90b2J1Zi10cy9ydW50aW1lXCIpO1xuY29uc3QgcnVudGltZV83ID0gcmVxdWlyZShcIkBwcm90b2J1Zi10cy9ydW50aW1lXCIpO1xuLy8gQGdlbmVyYXRlZCBtZXNzYWdlIHR5cGUgd2l0aCByZWZsZWN0aW9uIGluZm9ybWF0aW9uLCBtYXkgcHJvdmlkZSBzcGVlZCBvcHRpbWl6ZWQgbWV0aG9kc1xuY2xhc3MgRG91YmxlVmFsdWUkVHlwZSBleHRlbmRzIHJ1bnRpbWVfNy5NZXNzYWdlVHlwZSB7XG4gICAgY29uc3RydWN0b3IoKSB7XG4gICAgICAgIHN1cGVyKFwiZ29vZ2xlLnByb3RvYnVmLkRvdWJsZVZhbHVlXCIsIFtcbiAgICAgICAgICAgIHsgbm86IDEsIG5hbWU6IFwidmFsdWVcIiwga2luZDogXCJzY2FsYXJcIiwgVDogMSAvKlNjYWxhclR5cGUuRE9VQkxFKi8gfVxuICAgICAgICBdKTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogRW5jb2RlIGBEb3VibGVWYWx1ZWAgdG8gSlNPTiBudW1iZXIuXG4gICAgICovXG4gICAgaW50ZXJuYWxKc29uV3JpdGUobWVzc2FnZSwgb3B0aW9ucykge1xuICAgICAgICByZXR1cm4gdGhpcy5yZWZKc29uV3JpdGVyLnNjYWxhcigyLCBtZXNzYWdlLnZhbHVlLCBcInZhbHVlXCIsIGZhbHNlLCB0cnVlKTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogRGVjb2RlIGBEb3VibGVWYWx1ZWAgZnJvbSBKU09OIG51bWJlci5cbiAgICAgKi9cbiAgICBpbnRlcm5hbEpzb25SZWFkKGpzb24sIG9wdGlvbnMsIHRhcmdldCkge1xuICAgICAgICBpZiAoIXRhcmdldClcbiAgICAgICAgICAgIHRhcmdldCA9IHRoaXMuY3JlYXRlKCk7XG4gICAgICAgIHRhcmdldC52YWx1ZSA9IHRoaXMucmVmSnNvblJlYWRlci5zY2FsYXIoanNvbiwgMSwgdW5kZWZpbmVkLCBcInZhbHVlXCIpO1xuICAgICAgICByZXR1cm4gdGFyZ2V0O1xuICAgIH1cbiAgICBjcmVhdGUodmFsdWUpIHtcbiAgICAgICAgY29uc3QgbWVzc2FnZSA9IHsgdmFsdWU6IDAgfTtcbiAgICAgICAgZ2xvYmFsVGhpcy5PYmplY3QuZGVmaW5lUHJvcGVydHkobWVzc2FnZSwgcnVudGltZV82Lk1FU1NBR0VfVFlQRSwgeyBlbnVtZXJhYmxlOiBmYWxzZSwgdmFsdWU6IHRoaXMgfSk7XG4gICAgICAgIGlmICh2YWx1ZSAhPT0gdW5kZWZpbmVkKVxuICAgICAgICAgICAgKDAsIHJ1bnRpbWVfNS5yZWZsZWN0aW9uTWVyZ2VQYXJ0aWFsKSh0aGlzLCBtZXNzYWdlLCB2YWx1ZSk7XG4gICAgICAgIHJldHVybiBtZXNzYWdlO1xuICAgIH1cbiAgICBpbnRlcm5hbEJpbmFyeVJlYWQocmVhZGVyLCBsZW5ndGgsIG9wdGlvbnMsIHRhcmdldCkge1xuICAgICAgICBsZXQgbWVzc2FnZSA9IHRhcmdldCAhPT0gbnVsbCAmJiB0YXJnZXQgIT09IHZvaWQgMCA/IHRhcmdldCA6IHRoaXMuY3JlYXRlKCksIGVuZCA9IHJlYWRlci5wb3MgKyBsZW5ndGg7XG4gICAgICAgIHdoaWxlIChyZWFkZXIucG9zIDwgZW5kKSB7XG4gICAgICAgICAgICBsZXQgW2ZpZWxkTm8sIHdpcmVUeXBlXSA9IHJlYWRlci50YWcoKTtcbiAgICAgICAgICAgIHN3aXRjaCAoZmllbGRObykge1xuICAgICAgICAgICAgICAgIGNhc2UgLyogZG91YmxlIHZhbHVlICovIDE6XG4gICAgICAgICAgICAgICAgICAgIG1lc3NhZ2UudmFsdWUgPSByZWFkZXIuZG91YmxlKCk7XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgICAgICAgICAgIGxldCB1ID0gb3B0aW9ucy5yZWFkVW5rbm93bkZpZWxkO1xuICAgICAgICAgICAgICAgICAgICBpZiAodSA9PT0gXCJ0aHJvd1wiKVxuICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IGdsb2JhbFRoaXMuRXJyb3IoYFVua25vd24gZmllbGQgJHtmaWVsZE5vfSAod2lyZSB0eXBlICR7d2lyZVR5cGV9KSBmb3IgJHt0aGlzLnR5cGVOYW1lfWApO1xuICAgICAgICAgICAgICAgICAgICBsZXQgZCA9IHJlYWRlci5za2lwKHdpcmVUeXBlKTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKHUgIT09IGZhbHNlKVxuICAgICAgICAgICAgICAgICAgICAgICAgKHUgPT09IHRydWUgPyBydW50aW1lXzQuVW5rbm93bkZpZWxkSGFuZGxlci5vblJlYWQgOiB1KSh0aGlzLnR5cGVOYW1lLCBtZXNzYWdlLCBmaWVsZE5vLCB3aXJlVHlwZSwgZCk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIG1lc3NhZ2U7XG4gICAgfVxuICAgIGludGVybmFsQmluYXJ5V3JpdGUobWVzc2FnZSwgd3JpdGVyLCBvcHRpb25zKSB7XG4gICAgICAgIC8qIGRvdWJsZSB2YWx1ZSA9IDE7ICovXG4gICAgICAgIGlmIChtZXNzYWdlLnZhbHVlICE9PSAwKVxuICAgICAgICAgICAgd3JpdGVyLnRhZygxLCBydW50aW1lXzMuV2lyZVR5cGUuQml0NjQpLmRvdWJsZShtZXNzYWdlLnZhbHVlKTtcbiAgICAgICAgbGV0IHUgPSBvcHRpb25zLndyaXRlVW5rbm93bkZpZWxkcztcbiAgICAgICAgaWYgKHUgIT09IGZhbHNlKVxuICAgICAgICAgICAgKHUgPT0gdHJ1ZSA/IHJ1bnRpbWVfNC5Vbmtub3duRmllbGRIYW5kbGVyLm9uV3JpdGUgOiB1KSh0aGlzLnR5cGVOYW1lLCBtZXNzYWdlLCB3cml0ZXIpO1xuICAgICAgICByZXR1cm4gd3JpdGVyO1xuICAgIH1cbn1cbi8qKlxuICogQGdlbmVyYXRlZCBNZXNzYWdlVHlwZSBmb3IgcHJvdG9idWYgbWVzc2FnZSBnb29nbGUucHJvdG9idWYuRG91YmxlVmFsdWVcbiAqL1xuZXhwb3J0cy5Eb3VibGVWYWx1ZSA9IG5ldyBEb3VibGVWYWx1ZSRUeXBlKCk7XG4vLyBAZ2VuZXJhdGVkIG1lc3NhZ2UgdHlwZSB3aXRoIHJlZmxlY3Rpb24gaW5mb3JtYXRpb24sIG1heSBwcm92aWRlIHNwZWVkIG9wdGltaXplZCBtZXRob2RzXG5jbGFzcyBGbG9hdFZhbHVlJFR5cGUgZXh0ZW5kcyBydW50aW1lXzcuTWVzc2FnZVR5cGUge1xuICAgIGNvbnN0cnVjdG9yKCkge1xuICAgICAgICBzdXBlcihcImdvb2dsZS5wcm90b2J1Zi5GbG9hdFZhbHVlXCIsIFtcbiAgICAgICAgICAgIHsgbm86IDEsIG5hbWU6IFwidmFsdWVcIiwga2luZDogXCJzY2FsYXJcIiwgVDogMiAvKlNjYWxhclR5cGUuRkxPQVQqLyB9XG4gICAgICAgIF0pO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBFbmNvZGUgYEZsb2F0VmFsdWVgIHRvIEpTT04gbnVtYmVyLlxuICAgICAqL1xuICAgIGludGVybmFsSnNvbldyaXRlKG1lc3NhZ2UsIG9wdGlvbnMpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMucmVmSnNvbldyaXRlci5zY2FsYXIoMSwgbWVzc2FnZS52YWx1ZSwgXCJ2YWx1ZVwiLCBmYWxzZSwgdHJ1ZSk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIERlY29kZSBgRmxvYXRWYWx1ZWAgZnJvbSBKU09OIG51bWJlci5cbiAgICAgKi9cbiAgICBpbnRlcm5hbEpzb25SZWFkKGpzb24sIG9wdGlvbnMsIHRhcmdldCkge1xuICAgICAgICBpZiAoIXRhcmdldClcbiAgICAgICAgICAgIHRhcmdldCA9IHRoaXMuY3JlYXRlKCk7XG4gICAgICAgIHRhcmdldC52YWx1ZSA9IHRoaXMucmVmSnNvblJlYWRlci5zY2FsYXIoanNvbiwgMSwgdW5kZWZpbmVkLCBcInZhbHVlXCIpO1xuICAgICAgICByZXR1cm4gdGFyZ2V0O1xuICAgIH1cbiAgICBjcmVhdGUodmFsdWUpIHtcbiAgICAgICAgY29uc3QgbWVzc2FnZSA9IHsgdmFsdWU6IDAgfTtcbiAgICAgICAgZ2xvYmFsVGhpcy5PYmplY3QuZGVmaW5lUHJvcGVydHkobWVzc2FnZSwgcnVudGltZV82Lk1FU1NBR0VfVFlQRSwgeyBlbnVtZXJhYmxlOiBmYWxzZSwgdmFsdWU6IHRoaXMgfSk7XG4gICAgICAgIGlmICh2YWx1ZSAhPT0gdW5kZWZpbmVkKVxuICAgICAgICAgICAgKDAsIHJ1bnRpbWVfNS5yZWZsZWN0aW9uTWVyZ2VQYXJ0aWFsKSh0aGlzLCBtZXNzYWdlLCB2YWx1ZSk7XG4gICAgICAgIHJldHVybiBtZXNzYWdlO1xuICAgIH1cbiAgICBpbnRlcm5hbEJpbmFyeVJlYWQocmVhZGVyLCBsZW5ndGgsIG9wdGlvbnMsIHRhcmdldCkge1xuICAgICAgICBsZXQgbWVzc2FnZSA9IHRhcmdldCAhPT0gbnVsbCAmJiB0YXJnZXQgIT09IHZvaWQgMCA/IHRhcmdldCA6IHRoaXMuY3JlYXRlKCksIGVuZCA9IHJlYWRlci5wb3MgKyBsZW5ndGg7XG4gICAgICAgIHdoaWxlIChyZWFkZXIucG9zIDwgZW5kKSB7XG4gICAgICAgICAgICBsZXQgW2ZpZWxkTm8sIHdpcmVUeXBlXSA9IHJlYWRlci50YWcoKTtcbiAgICAgICAgICAgIHN3aXRjaCAoZmllbGRObykge1xuICAgICAgICAgICAgICAgIGNhc2UgLyogZmxvYXQgdmFsdWUgKi8gMTpcbiAgICAgICAgICAgICAgICAgICAgbWVzc2FnZS52YWx1ZSA9IHJlYWRlci5mbG9hdCgpO1xuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgICAgICAgICAgICBsZXQgdSA9IG9wdGlvbnMucmVhZFVua25vd25GaWVsZDtcbiAgICAgICAgICAgICAgICAgICAgaWYgKHUgPT09IFwidGhyb3dcIilcbiAgICAgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBnbG9iYWxUaGlzLkVycm9yKGBVbmtub3duIGZpZWxkICR7ZmllbGROb30gKHdpcmUgdHlwZSAke3dpcmVUeXBlfSkgZm9yICR7dGhpcy50eXBlTmFtZX1gKTtcbiAgICAgICAgICAgICAgICAgICAgbGV0IGQgPSByZWFkZXIuc2tpcCh3aXJlVHlwZSk7XG4gICAgICAgICAgICAgICAgICAgIGlmICh1ICE9PSBmYWxzZSlcbiAgICAgICAgICAgICAgICAgICAgICAgICh1ID09PSB0cnVlID8gcnVudGltZV80LlVua25vd25GaWVsZEhhbmRsZXIub25SZWFkIDogdSkodGhpcy50eXBlTmFtZSwgbWVzc2FnZSwgZmllbGRObywgd2lyZVR5cGUsIGQpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiBtZXNzYWdlO1xuICAgIH1cbiAgICBpbnRlcm5hbEJpbmFyeVdyaXRlKG1lc3NhZ2UsIHdyaXRlciwgb3B0aW9ucykge1xuICAgICAgICAvKiBmbG9hdCB2YWx1ZSA9IDE7ICovXG4gICAgICAgIGlmIChtZXNzYWdlLnZhbHVlICE9PSAwKVxuICAgICAgICAgICAgd3JpdGVyLnRhZygxLCBydW50aW1lXzMuV2lyZVR5cGUuQml0MzIpLmZsb2F0KG1lc3NhZ2UudmFsdWUpO1xuICAgICAgICBsZXQgdSA9IG9wdGlvbnMud3JpdGVVbmtub3duRmllbGRzO1xuICAgICAgICBpZiAodSAhPT0gZmFsc2UpXG4gICAgICAgICAgICAodSA9PSB0cnVlID8gcnVudGltZV80LlVua25vd25GaWVsZEhhbmRsZXIub25Xcml0ZSA6IHUpKHRoaXMudHlwZU5hbWUsIG1lc3NhZ2UsIHdyaXRlcik7XG4gICAgICAgIHJldHVybiB3cml0ZXI7XG4gICAgfVxufVxuLyoqXG4gKiBAZ2VuZXJhdGVkIE1lc3NhZ2VUeXBlIGZvciBwcm90b2J1ZiBtZXNzYWdlIGdvb2dsZS5wcm90b2J1Zi5GbG9hdFZhbHVlXG4gKi9cbmV4cG9ydHMuRmxvYXRWYWx1ZSA9IG5ldyBGbG9hdFZhbHVlJFR5cGUoKTtcbi8vIEBnZW5lcmF0ZWQgbWVzc2FnZSB0eXBlIHdpdGggcmVmbGVjdGlvbiBpbmZvcm1hdGlvbiwgbWF5IHByb3ZpZGUgc3BlZWQgb3B0aW1pemVkIG1ldGhvZHNcbmNsYXNzIEludDY0VmFsdWUkVHlwZSBleHRlbmRzIHJ1bnRpbWVfNy5NZXNzYWdlVHlwZSB7XG4gICAgY29uc3RydWN0b3IoKSB7XG4gICAgICAgIHN1cGVyKFwiZ29vZ2xlLnByb3RvYnVmLkludDY0VmFsdWVcIiwgW1xuICAgICAgICAgICAgeyBubzogMSwgbmFtZTogXCJ2YWx1ZVwiLCBraW5kOiBcInNjYWxhclwiLCBUOiAzIC8qU2NhbGFyVHlwZS5JTlQ2NCovIH1cbiAgICAgICAgXSk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIEVuY29kZSBgSW50NjRWYWx1ZWAgdG8gSlNPTiBzdHJpbmcuXG4gICAgICovXG4gICAgaW50ZXJuYWxKc29uV3JpdGUobWVzc2FnZSwgb3B0aW9ucykge1xuICAgICAgICByZXR1cm4gdGhpcy5yZWZKc29uV3JpdGVyLnNjYWxhcihydW50aW1lXzEuU2NhbGFyVHlwZS5JTlQ2NCwgbWVzc2FnZS52YWx1ZSwgXCJ2YWx1ZVwiLCBmYWxzZSwgdHJ1ZSk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIERlY29kZSBgSW50NjRWYWx1ZWAgZnJvbSBKU09OIHN0cmluZy5cbiAgICAgKi9cbiAgICBpbnRlcm5hbEpzb25SZWFkKGpzb24sIG9wdGlvbnMsIHRhcmdldCkge1xuICAgICAgICBpZiAoIXRhcmdldClcbiAgICAgICAgICAgIHRhcmdldCA9IHRoaXMuY3JlYXRlKCk7XG4gICAgICAgIHRhcmdldC52YWx1ZSA9IHRoaXMucmVmSnNvblJlYWRlci5zY2FsYXIoanNvbiwgcnVudGltZV8xLlNjYWxhclR5cGUuSU5UNjQsIHJ1bnRpbWVfMi5Mb25nVHlwZS5TVFJJTkcsIFwidmFsdWVcIik7XG4gICAgICAgIHJldHVybiB0YXJnZXQ7XG4gICAgfVxuICAgIGNyZWF0ZSh2YWx1ZSkge1xuICAgICAgICBjb25zdCBtZXNzYWdlID0geyB2YWx1ZTogXCIwXCIgfTtcbiAgICAgICAgZ2xvYmFsVGhpcy5PYmplY3QuZGVmaW5lUHJvcGVydHkobWVzc2FnZSwgcnVudGltZV82Lk1FU1NBR0VfVFlQRSwgeyBlbnVtZXJhYmxlOiBmYWxzZSwgdmFsdWU6IHRoaXMgfSk7XG4gICAgICAgIGlmICh2YWx1ZSAhPT0gdW5kZWZpbmVkKVxuICAgICAgICAgICAgKDAsIHJ1bnRpbWVfNS5yZWZsZWN0aW9uTWVyZ2VQYXJ0aWFsKSh0aGlzLCBtZXNzYWdlLCB2YWx1ZSk7XG4gICAgICAgIHJldHVybiBtZXNzYWdlO1xuICAgIH1cbiAgICBpbnRlcm5hbEJpbmFyeVJlYWQocmVhZGVyLCBsZW5ndGgsIG9wdGlvbnMsIHRhcmdldCkge1xuICAgICAgICBsZXQgbWVzc2FnZSA9IHRhcmdldCAhPT0gbnVsbCAmJiB0YXJnZXQgIT09IHZvaWQgMCA/IHRhcmdldCA6IHRoaXMuY3JlYXRlKCksIGVuZCA9IHJlYWRlci5wb3MgKyBsZW5ndGg7XG4gICAgICAgIHdoaWxlIChyZWFkZXIucG9zIDwgZW5kKSB7XG4gICAgICAgICAgICBsZXQgW2ZpZWxkTm8sIHdpcmVUeXBlXSA9IHJlYWRlci50YWcoKTtcbiAgICAgICAgICAgIHN3aXRjaCAoZmllbGRObykge1xuICAgICAgICAgICAgICAgIGNhc2UgLyogaW50NjQgdmFsdWUgKi8gMTpcbiAgICAgICAgICAgICAgICAgICAgbWVzc2FnZS52YWx1ZSA9IHJlYWRlci5pbnQ2NCgpLnRvU3RyaW5nKCk7XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgICAgICAgICAgIGxldCB1ID0gb3B0aW9ucy5yZWFkVW5rbm93bkZpZWxkO1xuICAgICAgICAgICAgICAgICAgICBpZiAodSA9PT0gXCJ0aHJvd1wiKVxuICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IGdsb2JhbFRoaXMuRXJyb3IoYFVua25vd24gZmllbGQgJHtmaWVsZE5vfSAod2lyZSB0eXBlICR7d2lyZVR5cGV9KSBmb3IgJHt0aGlzLnR5cGVOYW1lfWApO1xuICAgICAgICAgICAgICAgICAgICBsZXQgZCA9IHJlYWRlci5za2lwKHdpcmVUeXBlKTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKHUgIT09IGZhbHNlKVxuICAgICAgICAgICAgICAgICAgICAgICAgKHUgPT09IHRydWUgPyBydW50aW1lXzQuVW5rbm93bkZpZWxkSGFuZGxlci5vblJlYWQgOiB1KSh0aGlzLnR5cGVOYW1lLCBtZXNzYWdlLCBmaWVsZE5vLCB3aXJlVHlwZSwgZCk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIG1lc3NhZ2U7XG4gICAgfVxuICAgIGludGVybmFsQmluYXJ5V3JpdGUobWVzc2FnZSwgd3JpdGVyLCBvcHRpb25zKSB7XG4gICAgICAgIC8qIGludDY0IHZhbHVlID0gMTsgKi9cbiAgICAgICAgaWYgKG1lc3NhZ2UudmFsdWUgIT09IFwiMFwiKVxuICAgICAgICAgICAgd3JpdGVyLnRhZygxLCBydW50aW1lXzMuV2lyZVR5cGUuVmFyaW50KS5pbnQ2NChtZXNzYWdlLnZhbHVlKTtcbiAgICAgICAgbGV0IHUgPSBvcHRpb25zLndyaXRlVW5rbm93bkZpZWxkcztcbiAgICAgICAgaWYgKHUgIT09IGZhbHNlKVxuICAgICAgICAgICAgKHUgPT0gdHJ1ZSA/IHJ1bnRpbWVfNC5Vbmtub3duRmllbGRIYW5kbGVyLm9uV3JpdGUgOiB1KSh0aGlzLnR5cGVOYW1lLCBtZXNzYWdlLCB3cml0ZXIpO1xuICAgICAgICByZXR1cm4gd3JpdGVyO1xuICAgIH1cbn1cbi8qKlxuICogQGdlbmVyYXRlZCBNZXNzYWdlVHlwZSBmb3IgcHJvdG9idWYgbWVzc2FnZSBnb29nbGUucHJvdG9idWYuSW50NjRWYWx1ZVxuICovXG5leHBvcnRzLkludDY0VmFsdWUgPSBuZXcgSW50NjRWYWx1ZSRUeXBlKCk7XG4vLyBAZ2VuZXJhdGVkIG1lc3NhZ2UgdHlwZSB3aXRoIHJlZmxlY3Rpb24gaW5mb3JtYXRpb24sIG1heSBwcm92aWRlIHNwZWVkIG9wdGltaXplZCBtZXRob2RzXG5jbGFzcyBVSW50NjRWYWx1ZSRUeXBlIGV4dGVuZHMgcnVudGltZV83Lk1lc3NhZ2VUeXBlIHtcbiAgICBjb25zdHJ1Y3RvcigpIHtcbiAgICAgICAgc3VwZXIoXCJnb29nbGUucHJvdG9idWYuVUludDY0VmFsdWVcIiwgW1xuICAgICAgICAgICAgeyBubzogMSwgbmFtZTogXCJ2YWx1ZVwiLCBraW5kOiBcInNjYWxhclwiLCBUOiA0IC8qU2NhbGFyVHlwZS5VSU5UNjQqLyB9XG4gICAgICAgIF0pO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBFbmNvZGUgYFVJbnQ2NFZhbHVlYCB0byBKU09OIHN0cmluZy5cbiAgICAgKi9cbiAgICBpbnRlcm5hbEpzb25Xcml0ZShtZXNzYWdlLCBvcHRpb25zKSB7XG4gICAgICAgIHJldHVybiB0aGlzLnJlZkpzb25Xcml0ZXIuc2NhbGFyKHJ1bnRpbWVfMS5TY2FsYXJUeXBlLlVJTlQ2NCwgbWVzc2FnZS52YWx1ZSwgXCJ2YWx1ZVwiLCBmYWxzZSwgdHJ1ZSk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIERlY29kZSBgVUludDY0VmFsdWVgIGZyb20gSlNPTiBzdHJpbmcuXG4gICAgICovXG4gICAgaW50ZXJuYWxKc29uUmVhZChqc29uLCBvcHRpb25zLCB0YXJnZXQpIHtcbiAgICAgICAgaWYgKCF0YXJnZXQpXG4gICAgICAgICAgICB0YXJnZXQgPSB0aGlzLmNyZWF0ZSgpO1xuICAgICAgICB0YXJnZXQudmFsdWUgPSB0aGlzLnJlZkpzb25SZWFkZXIuc2NhbGFyKGpzb24sIHJ1bnRpbWVfMS5TY2FsYXJUeXBlLlVJTlQ2NCwgcnVudGltZV8yLkxvbmdUeXBlLlNUUklORywgXCJ2YWx1ZVwiKTtcbiAgICAgICAgcmV0dXJuIHRhcmdldDtcbiAgICB9XG4gICAgY3JlYXRlKHZhbHVlKSB7XG4gICAgICAgIGNvbnN0IG1lc3NhZ2UgPSB7IHZhbHVlOiBcIjBcIiB9O1xuICAgICAgICBnbG9iYWxUaGlzLk9iamVjdC5kZWZpbmVQcm9wZXJ0eShtZXNzYWdlLCBydW50aW1lXzYuTUVTU0FHRV9UWVBFLCB7IGVudW1lcmFibGU6IGZhbHNlLCB2YWx1ZTogdGhpcyB9KTtcbiAgICAgICAgaWYgKHZhbHVlICE9PSB1bmRlZmluZWQpXG4gICAgICAgICAgICAoMCwgcnVudGltZV81LnJlZmxlY3Rpb25NZXJnZVBhcnRpYWwpKHRoaXMsIG1lc3NhZ2UsIHZhbHVlKTtcbiAgICAgICAgcmV0dXJuIG1lc3NhZ2U7XG4gICAgfVxuICAgIGludGVybmFsQmluYXJ5UmVhZChyZWFkZXIsIGxlbmd0aCwgb3B0aW9ucywgdGFyZ2V0KSB7XG4gICAgICAgIGxldCBtZXNzYWdlID0gdGFyZ2V0ICE9PSBudWxsICYmIHRhcmdldCAhPT0gdm9pZCAwID8gdGFyZ2V0IDogdGhpcy5jcmVhdGUoKSwgZW5kID0gcmVhZGVyLnBvcyArIGxlbmd0aDtcbiAgICAgICAgd2hpbGUgKHJlYWRlci5wb3MgPCBlbmQpIHtcbiAgICAgICAgICAgIGxldCBbZmllbGRObywgd2lyZVR5cGVdID0gcmVhZGVyLnRhZygpO1xuICAgICAgICAgICAgc3dpdGNoIChmaWVsZE5vKSB7XG4gICAgICAgICAgICAgICAgY2FzZSAvKiB1aW50NjQgdmFsdWUgKi8gMTpcbiAgICAgICAgICAgICAgICAgICAgbWVzc2FnZS52YWx1ZSA9IHJlYWRlci51aW50NjQoKS50b1N0cmluZygpO1xuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgICAgICAgICAgICBsZXQgdSA9IG9wdGlvbnMucmVhZFVua25vd25GaWVsZDtcbiAgICAgICAgICAgICAgICAgICAgaWYgKHUgPT09IFwidGhyb3dcIilcbiAgICAgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBnbG9iYWxUaGlzLkVycm9yKGBVbmtub3duIGZpZWxkICR7ZmllbGROb30gKHdpcmUgdHlwZSAke3dpcmVUeXBlfSkgZm9yICR7dGhpcy50eXBlTmFtZX1gKTtcbiAgICAgICAgICAgICAgICAgICAgbGV0IGQgPSByZWFkZXIuc2tpcCh3aXJlVHlwZSk7XG4gICAgICAgICAgICAgICAgICAgIGlmICh1ICE9PSBmYWxzZSlcbiAgICAgICAgICAgICAgICAgICAgICAgICh1ID09PSB0cnVlID8gcnVudGltZV80LlVua25vd25GaWVsZEhhbmRsZXIub25SZWFkIDogdSkodGhpcy50eXBlTmFtZSwgbWVzc2FnZSwgZmllbGRObywgd2lyZVR5cGUsIGQpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiBtZXNzYWdlO1xuICAgIH1cbiAgICBpbnRlcm5hbEJpbmFyeVdyaXRlKG1lc3NhZ2UsIHdyaXRlciwgb3B0aW9ucykge1xuICAgICAgICAvKiB1aW50NjQgdmFsdWUgPSAxOyAqL1xuICAgICAgICBpZiAobWVzc2FnZS52YWx1ZSAhPT0gXCIwXCIpXG4gICAgICAgICAgICB3cml0ZXIudGFnKDEsIHJ1bnRpbWVfMy5XaXJlVHlwZS5WYXJpbnQpLnVpbnQ2NChtZXNzYWdlLnZhbHVlKTtcbiAgICAgICAgbGV0IHUgPSBvcHRpb25zLndyaXRlVW5rbm93bkZpZWxkcztcbiAgICAgICAgaWYgKHUgIT09IGZhbHNlKVxuICAgICAgICAgICAgKHUgPT0gdHJ1ZSA/IHJ1bnRpbWVfNC5Vbmtub3duRmllbGRIYW5kbGVyLm9uV3JpdGUgOiB1KSh0aGlzLnR5cGVOYW1lLCBtZXNzYWdlLCB3cml0ZXIpO1xuICAgICAgICByZXR1cm4gd3JpdGVyO1xuICAgIH1cbn1cbi8qKlxuICogQGdlbmVyYXRlZCBNZXNzYWdlVHlwZSBmb3IgcHJvdG9idWYgbWVzc2FnZSBnb29nbGUucHJvdG9idWYuVUludDY0VmFsdWVcbiAqL1xuZXhwb3J0cy5VSW50NjRWYWx1ZSA9IG5ldyBVSW50NjRWYWx1ZSRUeXBlKCk7XG4vLyBAZ2VuZXJhdGVkIG1lc3NhZ2UgdHlwZSB3aXRoIHJlZmxlY3Rpb24gaW5mb3JtYXRpb24sIG1heSBwcm92aWRlIHNwZWVkIG9wdGltaXplZCBtZXRob2RzXG5jbGFzcyBJbnQzMlZhbHVlJFR5cGUgZXh0ZW5kcyBydW50aW1lXzcuTWVzc2FnZVR5cGUge1xuICAgIGNvbnN0cnVjdG9yKCkge1xuICAgICAgICBzdXBlcihcImdvb2dsZS5wcm90b2J1Zi5JbnQzMlZhbHVlXCIsIFtcbiAgICAgICAgICAgIHsgbm86IDEsIG5hbWU6IFwidmFsdWVcIiwga2luZDogXCJzY2FsYXJcIiwgVDogNSAvKlNjYWxhclR5cGUuSU5UMzIqLyB9XG4gICAgICAgIF0pO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBFbmNvZGUgYEludDMyVmFsdWVgIHRvIEpTT04gc3RyaW5nLlxuICAgICAqL1xuICAgIGludGVybmFsSnNvbldyaXRlKG1lc3NhZ2UsIG9wdGlvbnMpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMucmVmSnNvbldyaXRlci5zY2FsYXIoNSwgbWVzc2FnZS52YWx1ZSwgXCJ2YWx1ZVwiLCBmYWxzZSwgdHJ1ZSk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIERlY29kZSBgSW50MzJWYWx1ZWAgZnJvbSBKU09OIHN0cmluZy5cbiAgICAgKi9cbiAgICBpbnRlcm5hbEpzb25SZWFkKGpzb24sIG9wdGlvbnMsIHRhcmdldCkge1xuICAgICAgICBpZiAoIXRhcmdldClcbiAgICAgICAgICAgIHRhcmdldCA9IHRoaXMuY3JlYXRlKCk7XG4gICAgICAgIHRhcmdldC52YWx1ZSA9IHRoaXMucmVmSnNvblJlYWRlci5zY2FsYXIoanNvbiwgNSwgdW5kZWZpbmVkLCBcInZhbHVlXCIpO1xuICAgICAgICByZXR1cm4gdGFyZ2V0O1xuICAgIH1cbiAgICBjcmVhdGUodmFsdWUpIHtcbiAgICAgICAgY29uc3QgbWVzc2FnZSA9IHsgdmFsdWU6IDAgfTtcbiAgICAgICAgZ2xvYmFsVGhpcy5PYmplY3QuZGVmaW5lUHJvcGVydHkobWVzc2FnZSwgcnVudGltZV82Lk1FU1NBR0VfVFlQRSwgeyBlbnVtZXJhYmxlOiBmYWxzZSwgdmFsdWU6IHRoaXMgfSk7XG4gICAgICAgIGlmICh2YWx1ZSAhPT0gdW5kZWZpbmVkKVxuICAgICAgICAgICAgKDAsIHJ1bnRpbWVfNS5yZWZsZWN0aW9uTWVyZ2VQYXJ0aWFsKSh0aGlzLCBtZXNzYWdlLCB2YWx1ZSk7XG4gICAgICAgIHJldHVybiBtZXNzYWdlO1xuICAgIH1cbiAgICBpbnRlcm5hbEJpbmFyeVJlYWQocmVhZGVyLCBsZW5ndGgsIG9wdGlvbnMsIHRhcmdldCkge1xuICAgICAgICBsZXQgbWVzc2FnZSA9IHRhcmdldCAhPT0gbnVsbCAmJiB0YXJnZXQgIT09IHZvaWQgMCA/IHRhcmdldCA6IHRoaXMuY3JlYXRlKCksIGVuZCA9IHJlYWRlci5wb3MgKyBsZW5ndGg7XG4gICAgICAgIHdoaWxlIChyZWFkZXIucG9zIDwgZW5kKSB7XG4gICAgICAgICAgICBsZXQgW2ZpZWxkTm8sIHdpcmVUeXBlXSA9IHJlYWRlci50YWcoKTtcbiAgICAgICAgICAgIHN3aXRjaCAoZmllbGRObykge1xuICAgICAgICAgICAgICAgIGNhc2UgLyogaW50MzIgdmFsdWUgKi8gMTpcbiAgICAgICAgICAgICAgICAgICAgbWVzc2FnZS52YWx1ZSA9IHJlYWRlci5pbnQzMigpO1xuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgICAgICAgICAgICBsZXQgdSA9IG9wdGlvbnMucmVhZFVua25vd25GaWVsZDtcbiAgICAgICAgICAgICAgICAgICAgaWYgKHUgPT09IFwidGhyb3dcIilcbiAgICAgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBnbG9iYWxUaGlzLkVycm9yKGBVbmtub3duIGZpZWxkICR7ZmllbGROb30gKHdpcmUgdHlwZSAke3dpcmVUeXBlfSkgZm9yICR7dGhpcy50eXBlTmFtZX1gKTtcbiAgICAgICAgICAgICAgICAgICAgbGV0IGQgPSByZWFkZXIuc2tpcCh3aXJlVHlwZSk7XG4gICAgICAgICAgICAgICAgICAgIGlmICh1ICE9PSBmYWxzZSlcbiAgICAgICAgICAgICAgICAgICAgICAgICh1ID09PSB0cnVlID8gcnVudGltZV80LlVua25vd25GaWVsZEhhbmRsZXIub25SZWFkIDogdSkodGhpcy50eXBlTmFtZSwgbWVzc2FnZSwgZmllbGRObywgd2lyZVR5cGUsIGQpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiBtZXNzYWdlO1xuICAgIH1cbiAgICBpbnRlcm5hbEJpbmFyeVdyaXRlKG1lc3NhZ2UsIHdyaXRlciwgb3B0aW9ucykge1xuICAgICAgICAvKiBpbnQzMiB2YWx1ZSA9IDE7ICovXG4gICAgICAgIGlmIChtZXNzYWdlLnZhbHVlICE9PSAwKVxuICAgICAgICAgICAgd3JpdGVyLnRhZygxLCBydW50aW1lXzMuV2lyZVR5cGUuVmFyaW50KS5pbnQzMihtZXNzYWdlLnZhbHVlKTtcbiAgICAgICAgbGV0IHUgPSBvcHRpb25zLndyaXRlVW5rbm93bkZpZWxkcztcbiAgICAgICAgaWYgKHUgIT09IGZhbHNlKVxuICAgICAgICAgICAgKHUgPT0gdHJ1ZSA/IHJ1bnRpbWVfNC5Vbmtub3duRmllbGRIYW5kbGVyLm9uV3JpdGUgOiB1KSh0aGlzLnR5cGVOYW1lLCBtZXNzYWdlLCB3cml0ZXIpO1xuICAgICAgICByZXR1cm4gd3JpdGVyO1xuICAgIH1cbn1cbi8qKlxuICogQGdlbmVyYXRlZCBNZXNzYWdlVHlwZSBmb3IgcHJvdG9idWYgbWVzc2FnZSBnb29nbGUucHJvdG9idWYuSW50MzJWYWx1ZVxuICovXG5leHBvcnRzLkludDMyVmFsdWUgPSBuZXcgSW50MzJWYWx1ZSRUeXBlKCk7XG4vLyBAZ2VuZXJhdGVkIG1lc3NhZ2UgdHlwZSB3aXRoIHJlZmxlY3Rpb24gaW5mb3JtYXRpb24sIG1heSBwcm92aWRlIHNwZWVkIG9wdGltaXplZCBtZXRob2RzXG5jbGFzcyBVSW50MzJWYWx1ZSRUeXBlIGV4dGVuZHMgcnVudGltZV83Lk1lc3NhZ2VUeXBlIHtcbiAgICBjb25zdHJ1Y3RvcigpIHtcbiAgICAgICAgc3VwZXIoXCJnb29nbGUucHJvdG9idWYuVUludDMyVmFsdWVcIiwgW1xuICAgICAgICAgICAgeyBubzogMSwgbmFtZTogXCJ2YWx1ZVwiLCBraW5kOiBcInNjYWxhclwiLCBUOiAxMyAvKlNjYWxhclR5cGUuVUlOVDMyKi8gfVxuICAgICAgICBdKTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogRW5jb2RlIGBVSW50MzJWYWx1ZWAgdG8gSlNPTiBzdHJpbmcuXG4gICAgICovXG4gICAgaW50ZXJuYWxKc29uV3JpdGUobWVzc2FnZSwgb3B0aW9ucykge1xuICAgICAgICByZXR1cm4gdGhpcy5yZWZKc29uV3JpdGVyLnNjYWxhcigxMywgbWVzc2FnZS52YWx1ZSwgXCJ2YWx1ZVwiLCBmYWxzZSwgdHJ1ZSk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIERlY29kZSBgVUludDMyVmFsdWVgIGZyb20gSlNPTiBzdHJpbmcuXG4gICAgICovXG4gICAgaW50ZXJuYWxKc29uUmVhZChqc29uLCBvcHRpb25zLCB0YXJnZXQpIHtcbiAgICAgICAgaWYgKCF0YXJnZXQpXG4gICAgICAgICAgICB0YXJnZXQgPSB0aGlzLmNyZWF0ZSgpO1xuICAgICAgICB0YXJnZXQudmFsdWUgPSB0aGlzLnJlZkpzb25SZWFkZXIuc2NhbGFyKGpzb24sIDEzLCB1bmRlZmluZWQsIFwidmFsdWVcIik7XG4gICAgICAgIHJldHVybiB0YXJnZXQ7XG4gICAgfVxuICAgIGNyZWF0ZSh2YWx1ZSkge1xuICAgICAgICBjb25zdCBtZXNzYWdlID0geyB2YWx1ZTogMCB9O1xuICAgICAgICBnbG9iYWxUaGlzLk9iamVjdC5kZWZpbmVQcm9wZXJ0eShtZXNzYWdlLCBydW50aW1lXzYuTUVTU0FHRV9UWVBFLCB7IGVudW1lcmFibGU6IGZhbHNlLCB2YWx1ZTogdGhpcyB9KTtcbiAgICAgICAgaWYgKHZhbHVlICE9PSB1bmRlZmluZWQpXG4gICAgICAgICAgICAoMCwgcnVudGltZV81LnJlZmxlY3Rpb25NZXJnZVBhcnRpYWwpKHRoaXMsIG1lc3NhZ2UsIHZhbHVlKTtcbiAgICAgICAgcmV0dXJuIG1lc3NhZ2U7XG4gICAgfVxuICAgIGludGVybmFsQmluYXJ5UmVhZChyZWFkZXIsIGxlbmd0aCwgb3B0aW9ucywgdGFyZ2V0KSB7XG4gICAgICAgIGxldCBtZXNzYWdlID0gdGFyZ2V0ICE9PSBudWxsICYmIHRhcmdldCAhPT0gdm9pZCAwID8gdGFyZ2V0IDogdGhpcy5jcmVhdGUoKSwgZW5kID0gcmVhZGVyLnBvcyArIGxlbmd0aDtcbiAgICAgICAgd2hpbGUgKHJlYWRlci5wb3MgPCBlbmQpIHtcbiAgICAgICAgICAgIGxldCBbZmllbGRObywgd2lyZVR5cGVdID0gcmVhZGVyLnRhZygpO1xuICAgICAgICAgICAgc3dpdGNoIChmaWVsZE5vKSB7XG4gICAgICAgICAgICAgICAgY2FzZSAvKiB1aW50MzIgdmFsdWUgKi8gMTpcbiAgICAgICAgICAgICAgICAgICAgbWVzc2FnZS52YWx1ZSA9IHJlYWRlci51aW50MzIoKTtcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICAgICAgICAgICAgbGV0IHUgPSBvcHRpb25zLnJlYWRVbmtub3duRmllbGQ7XG4gICAgICAgICAgICAgICAgICAgIGlmICh1ID09PSBcInRocm93XCIpXG4gICAgICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgZ2xvYmFsVGhpcy5FcnJvcihgVW5rbm93biBmaWVsZCAke2ZpZWxkTm99ICh3aXJlIHR5cGUgJHt3aXJlVHlwZX0pIGZvciAke3RoaXMudHlwZU5hbWV9YCk7XG4gICAgICAgICAgICAgICAgICAgIGxldCBkID0gcmVhZGVyLnNraXAod2lyZVR5cGUpO1xuICAgICAgICAgICAgICAgICAgICBpZiAodSAhPT0gZmFsc2UpXG4gICAgICAgICAgICAgICAgICAgICAgICAodSA9PT0gdHJ1ZSA/IHJ1bnRpbWVfNC5Vbmtub3duRmllbGRIYW5kbGVyLm9uUmVhZCA6IHUpKHRoaXMudHlwZU5hbWUsIG1lc3NhZ2UsIGZpZWxkTm8sIHdpcmVUeXBlLCBkKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gbWVzc2FnZTtcbiAgICB9XG4gICAgaW50ZXJuYWxCaW5hcnlXcml0ZShtZXNzYWdlLCB3cml0ZXIsIG9wdGlvbnMpIHtcbiAgICAgICAgLyogdWludDMyIHZhbHVlID0gMTsgKi9cbiAgICAgICAgaWYgKG1lc3NhZ2UudmFsdWUgIT09IDApXG4gICAgICAgICAgICB3cml0ZXIudGFnKDEsIHJ1bnRpbWVfMy5XaXJlVHlwZS5WYXJpbnQpLnVpbnQzMihtZXNzYWdlLnZhbHVlKTtcbiAgICAgICAgbGV0IHUgPSBvcHRpb25zLndyaXRlVW5rbm93bkZpZWxkcztcbiAgICAgICAgaWYgKHUgIT09IGZhbHNlKVxuICAgICAgICAgICAgKHUgPT0gdHJ1ZSA/IHJ1bnRpbWVfNC5Vbmtub3duRmllbGRIYW5kbGVyLm9uV3JpdGUgOiB1KSh0aGlzLnR5cGVOYW1lLCBtZXNzYWdlLCB3cml0ZXIpO1xuICAgICAgICByZXR1cm4gd3JpdGVyO1xuICAgIH1cbn1cbi8qKlxuICogQGdlbmVyYXRlZCBNZXNzYWdlVHlwZSBmb3IgcHJvdG9idWYgbWVzc2FnZSBnb29nbGUucHJvdG9idWYuVUludDMyVmFsdWVcbiAqL1xuZXhwb3J0cy5VSW50MzJWYWx1ZSA9IG5ldyBVSW50MzJWYWx1ZSRUeXBlKCk7XG4vLyBAZ2VuZXJhdGVkIG1lc3NhZ2UgdHlwZSB3aXRoIHJlZmxlY3Rpb24gaW5mb3JtYXRpb24sIG1heSBwcm92aWRlIHNwZWVkIG9wdGltaXplZCBtZXRob2RzXG5jbGFzcyBCb29sVmFsdWUkVHlwZSBleHRlbmRzIHJ1bnRpbWVfNy5NZXNzYWdlVHlwZSB7XG4gICAgY29uc3RydWN0b3IoKSB7XG4gICAgICAgIHN1cGVyKFwiZ29vZ2xlLnByb3RvYnVmLkJvb2xWYWx1ZVwiLCBbXG4gICAgICAgICAgICB7IG5vOiAxLCBuYW1lOiBcInZhbHVlXCIsIGtpbmQ6IFwic2NhbGFyXCIsIFQ6IDggLypTY2FsYXJUeXBlLkJPT0wqLyB9XG4gICAgICAgIF0pO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBFbmNvZGUgYEJvb2xWYWx1ZWAgdG8gSlNPTiBib29sLlxuICAgICAqL1xuICAgIGludGVybmFsSnNvbldyaXRlKG1lc3NhZ2UsIG9wdGlvbnMpIHtcbiAgICAgICAgcmV0dXJuIG1lc3NhZ2UudmFsdWU7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIERlY29kZSBgQm9vbFZhbHVlYCBmcm9tIEpTT04gYm9vbC5cbiAgICAgKi9cbiAgICBpbnRlcm5hbEpzb25SZWFkKGpzb24sIG9wdGlvbnMsIHRhcmdldCkge1xuICAgICAgICBpZiAoIXRhcmdldClcbiAgICAgICAgICAgIHRhcmdldCA9IHRoaXMuY3JlYXRlKCk7XG4gICAgICAgIHRhcmdldC52YWx1ZSA9IHRoaXMucmVmSnNvblJlYWRlci5zY2FsYXIoanNvbiwgOCwgdW5kZWZpbmVkLCBcInZhbHVlXCIpO1xuICAgICAgICByZXR1cm4gdGFyZ2V0O1xuICAgIH1cbiAgICBjcmVhdGUodmFsdWUpIHtcbiAgICAgICAgY29uc3QgbWVzc2FnZSA9IHsgdmFsdWU6IGZhbHNlIH07XG4gICAgICAgIGdsb2JhbFRoaXMuT2JqZWN0LmRlZmluZVByb3BlcnR5KG1lc3NhZ2UsIHJ1bnRpbWVfNi5NRVNTQUdFX1RZUEUsIHsgZW51bWVyYWJsZTogZmFsc2UsIHZhbHVlOiB0aGlzIH0pO1xuICAgICAgICBpZiAodmFsdWUgIT09IHVuZGVmaW5lZClcbiAgICAgICAgICAgICgwLCBydW50aW1lXzUucmVmbGVjdGlvbk1lcmdlUGFydGlhbCkodGhpcywgbWVzc2FnZSwgdmFsdWUpO1xuICAgICAgICByZXR1cm4gbWVzc2FnZTtcbiAgICB9XG4gICAgaW50ZXJuYWxCaW5hcnlSZWFkKHJlYWRlciwgbGVuZ3RoLCBvcHRpb25zLCB0YXJnZXQpIHtcbiAgICAgICAgbGV0IG1lc3NhZ2UgPSB0YXJnZXQgIT09IG51bGwgJiYgdGFyZ2V0ICE9PSB2b2lkIDAgPyB0YXJnZXQgOiB0aGlzLmNyZWF0ZSgpLCBlbmQgPSByZWFkZXIucG9zICsgbGVuZ3RoO1xuICAgICAgICB3aGlsZSAocmVhZGVyLnBvcyA8IGVuZCkge1xuICAgICAgICAgICAgbGV0IFtmaWVsZE5vLCB3aXJlVHlwZV0gPSByZWFkZXIudGFnKCk7XG4gICAgICAgICAgICBzd2l0Y2ggKGZpZWxkTm8pIHtcbiAgICAgICAgICAgICAgICBjYXNlIC8qIGJvb2wgdmFsdWUgKi8gMTpcbiAgICAgICAgICAgICAgICAgICAgbWVzc2FnZS52YWx1ZSA9IHJlYWRlci5ib29sKCk7XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgICAgICAgICAgIGxldCB1ID0gb3B0aW9ucy5yZWFkVW5rbm93bkZpZWxkO1xuICAgICAgICAgICAgICAgICAgICBpZiAodSA9PT0gXCJ0aHJvd1wiKVxuICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IGdsb2JhbFRoaXMuRXJyb3IoYFVua25vd24gZmllbGQgJHtmaWVsZE5vfSAod2lyZSB0eXBlICR7d2lyZVR5cGV9KSBmb3IgJHt0aGlzLnR5cGVOYW1lfWApO1xuICAgICAgICAgICAgICAgICAgICBsZXQgZCA9IHJlYWRlci5za2lwKHdpcmVUeXBlKTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKHUgIT09IGZhbHNlKVxuICAgICAgICAgICAgICAgICAgICAgICAgKHUgPT09IHRydWUgPyBydW50aW1lXzQuVW5rbm93bkZpZWxkSGFuZGxlci5vblJlYWQgOiB1KSh0aGlzLnR5cGVOYW1lLCBtZXNzYWdlLCBmaWVsZE5vLCB3aXJlVHlwZSwgZCk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIG1lc3NhZ2U7XG4gICAgfVxuICAgIGludGVybmFsQmluYXJ5V3JpdGUobWVzc2FnZSwgd3JpdGVyLCBvcHRpb25zKSB7XG4gICAgICAgIC8qIGJvb2wgdmFsdWUgPSAxOyAqL1xuICAgICAgICBpZiAobWVzc2FnZS52YWx1ZSAhPT0gZmFsc2UpXG4gICAgICAgICAgICB3cml0ZXIudGFnKDEsIHJ1bnRpbWVfMy5XaXJlVHlwZS5WYXJpbnQpLmJvb2wobWVzc2FnZS52YWx1ZSk7XG4gICAgICAgIGxldCB1ID0gb3B0aW9ucy53cml0ZVVua25vd25GaWVsZHM7XG4gICAgICAgIGlmICh1ICE9PSBmYWxzZSlcbiAgICAgICAgICAgICh1ID09IHRydWUgPyBydW50aW1lXzQuVW5rbm93bkZpZWxkSGFuZGxlci5vbldyaXRlIDogdSkodGhpcy50eXBlTmFtZSwgbWVzc2FnZSwgd3JpdGVyKTtcbiAgICAgICAgcmV0dXJuIHdyaXRlcjtcbiAgICB9XG59XG4vKipcbiAqIEBnZW5lcmF0ZWQgTWVzc2FnZVR5cGUgZm9yIHByb3RvYnVmIG1lc3NhZ2UgZ29vZ2xlLnByb3RvYnVmLkJvb2xWYWx1ZVxuICovXG5leHBvcnRzLkJvb2xWYWx1ZSA9IG5ldyBCb29sVmFsdWUkVHlwZSgpO1xuLy8gQGdlbmVyYXRlZCBtZXNzYWdlIHR5cGUgd2l0aCByZWZsZWN0aW9uIGluZm9ybWF0aW9uLCBtYXkgcHJvdmlkZSBzcGVlZCBvcHRpbWl6ZWQgbWV0aG9kc1xuY2xhc3MgU3RyaW5nVmFsdWUkVHlwZSBleHRlbmRzIHJ1bnRpbWVfNy5NZXNzYWdlVHlwZSB7XG4gICAgY29uc3RydWN0b3IoKSB7XG4gICAgICAgIHN1cGVyKFwiZ29vZ2xlLnByb3RvYnVmLlN0cmluZ1ZhbHVlXCIsIFtcbiAgICAgICAgICAgIHsgbm86IDEsIG5hbWU6IFwidmFsdWVcIiwga2luZDogXCJzY2FsYXJcIiwgVDogOSAvKlNjYWxhclR5cGUuU1RSSU5HKi8gfVxuICAgICAgICBdKTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogRW5jb2RlIGBTdHJpbmdWYWx1ZWAgdG8gSlNPTiBzdHJpbmcuXG4gICAgICovXG4gICAgaW50ZXJuYWxKc29uV3JpdGUobWVzc2FnZSwgb3B0aW9ucykge1xuICAgICAgICByZXR1cm4gbWVzc2FnZS52YWx1ZTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogRGVjb2RlIGBTdHJpbmdWYWx1ZWAgZnJvbSBKU09OIHN0cmluZy5cbiAgICAgKi9cbiAgICBpbnRlcm5hbEpzb25SZWFkKGpzb24sIG9wdGlvbnMsIHRhcmdldCkge1xuICAgICAgICBpZiAoIXRhcmdldClcbiAgICAgICAgICAgIHRhcmdldCA9IHRoaXMuY3JlYXRlKCk7XG4gICAgICAgIHRhcmdldC52YWx1ZSA9IHRoaXMucmVmSnNvblJlYWRlci5zY2FsYXIoanNvbiwgOSwgdW5kZWZpbmVkLCBcInZhbHVlXCIpO1xuICAgICAgICByZXR1cm4gdGFyZ2V0O1xuICAgIH1cbiAgICBjcmVhdGUodmFsdWUpIHtcbiAgICAgICAgY29uc3QgbWVzc2FnZSA9IHsgdmFsdWU6IFwiXCIgfTtcbiAgICAgICAgZ2xvYmFsVGhpcy5PYmplY3QuZGVmaW5lUHJvcGVydHkobWVzc2FnZSwgcnVudGltZV82Lk1FU1NBR0VfVFlQRSwgeyBlbnVtZXJhYmxlOiBmYWxzZSwgdmFsdWU6IHRoaXMgfSk7XG4gICAgICAgIGlmICh2YWx1ZSAhPT0gdW5kZWZpbmVkKVxuICAgICAgICAgICAgKDAsIHJ1bnRpbWVfNS5yZWZsZWN0aW9uTWVyZ2VQYXJ0aWFsKSh0aGlzLCBtZXNzYWdlLCB2YWx1ZSk7XG4gICAgICAgIHJldHVybiBtZXNzYWdlO1xuICAgIH1cbiAgICBpbnRlcm5hbEJpbmFyeVJlYWQocmVhZGVyLCBsZW5ndGgsIG9wdGlvbnMsIHRhcmdldCkge1xuICAgICAgICBsZXQgbWVzc2FnZSA9IHRhcmdldCAhPT0gbnVsbCAmJiB0YXJnZXQgIT09IHZvaWQgMCA/IHRhcmdldCA6IHRoaXMuY3JlYXRlKCksIGVuZCA9IHJlYWRlci5wb3MgKyBsZW5ndGg7XG4gICAgICAgIHdoaWxlIChyZWFkZXIucG9zIDwgZW5kKSB7XG4gICAgICAgICAgICBsZXQgW2ZpZWxkTm8sIHdpcmVUeXBlXSA9IHJlYWRlci50YWcoKTtcbiAgICAgICAgICAgIHN3aXRjaCAoZmllbGRObykge1xuICAgICAgICAgICAgICAgIGNhc2UgLyogc3RyaW5nIHZhbHVlICovIDE6XG4gICAgICAgICAgICAgICAgICAgIG1lc3NhZ2UudmFsdWUgPSByZWFkZXIuc3RyaW5nKCk7XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgICAgICAgICAgIGxldCB1ID0gb3B0aW9ucy5yZWFkVW5rbm93bkZpZWxkO1xuICAgICAgICAgICAgICAgICAgICBpZiAodSA9PT0gXCJ0aHJvd1wiKVxuICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IGdsb2JhbFRoaXMuRXJyb3IoYFVua25vd24gZmllbGQgJHtmaWVsZE5vfSAod2lyZSB0eXBlICR7d2lyZVR5cGV9KSBmb3IgJHt0aGlzLnR5cGVOYW1lfWApO1xuICAgICAgICAgICAgICAgICAgICBsZXQgZCA9IHJlYWRlci5za2lwKHdpcmVUeXBlKTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKHUgIT09IGZhbHNlKVxuICAgICAgICAgICAgICAgICAgICAgICAgKHUgPT09IHRydWUgPyBydW50aW1lXzQuVW5rbm93bkZpZWxkSGFuZGxlci5vblJlYWQgOiB1KSh0aGlzLnR5cGVOYW1lLCBtZXNzYWdlLCBmaWVsZE5vLCB3aXJlVHlwZSwgZCk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIG1lc3NhZ2U7XG4gICAgfVxuICAgIGludGVybmFsQmluYXJ5V3JpdGUobWVzc2FnZSwgd3JpdGVyLCBvcHRpb25zKSB7XG4gICAgICAgIC8qIHN0cmluZyB2YWx1ZSA9IDE7ICovXG4gICAgICAgIGlmIChtZXNzYWdlLnZhbHVlICE9PSBcIlwiKVxuICAgICAgICAgICAgd3JpdGVyLnRhZygxLCBydW50aW1lXzMuV2lyZVR5cGUuTGVuZ3RoRGVsaW1pdGVkKS5zdHJpbmcobWVzc2FnZS52YWx1ZSk7XG4gICAgICAgIGxldCB1ID0gb3B0aW9ucy53cml0ZVVua25vd25GaWVsZHM7XG4gICAgICAgIGlmICh1ICE9PSBmYWxzZSlcbiAgICAgICAgICAgICh1ID09IHRydWUgPyBydW50aW1lXzQuVW5rbm93bkZpZWxkSGFuZGxlci5vbldyaXRlIDogdSkodGhpcy50eXBlTmFtZSwgbWVzc2FnZSwgd3JpdGVyKTtcbiAgICAgICAgcmV0dXJuIHdyaXRlcjtcbiAgICB9XG59XG4vKipcbiAqIEBnZW5lcmF0ZWQgTWVzc2FnZVR5cGUgZm9yIHByb3RvYnVmIG1lc3NhZ2UgZ29vZ2xlLnByb3RvYnVmLlN0cmluZ1ZhbHVlXG4gKi9cbmV4cG9ydHMuU3RyaW5nVmFsdWUgPSBuZXcgU3RyaW5nVmFsdWUkVHlwZSgpO1xuLy8gQGdlbmVyYXRlZCBtZXNzYWdlIHR5cGUgd2l0aCByZWZsZWN0aW9uIGluZm9ybWF0aW9uLCBtYXkgcHJvdmlkZSBzcGVlZCBvcHRpbWl6ZWQgbWV0aG9kc1xuY2xhc3MgQnl0ZXNWYWx1ZSRUeXBlIGV4dGVuZHMgcnVudGltZV83Lk1lc3NhZ2VUeXBlIHtcbiAgICBjb25zdHJ1Y3RvcigpIHtcbiAgICAgICAgc3VwZXIoXCJnb29nbGUucHJvdG9idWYuQnl0ZXNWYWx1ZVwiLCBbXG4gICAgICAgICAgICB7IG5vOiAxLCBuYW1lOiBcInZhbHVlXCIsIGtpbmQ6IFwic2NhbGFyXCIsIFQ6IDEyIC8qU2NhbGFyVHlwZS5CWVRFUyovIH1cbiAgICAgICAgXSk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIEVuY29kZSBgQnl0ZXNWYWx1ZWAgdG8gSlNPTiBzdHJpbmcuXG4gICAgICovXG4gICAgaW50ZXJuYWxKc29uV3JpdGUobWVzc2FnZSwgb3B0aW9ucykge1xuICAgICAgICByZXR1cm4gdGhpcy5yZWZKc29uV3JpdGVyLnNjYWxhcigxMiwgbWVzc2FnZS52YWx1ZSwgXCJ2YWx1ZVwiLCBmYWxzZSwgdHJ1ZSk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIERlY29kZSBgQnl0ZXNWYWx1ZWAgZnJvbSBKU09OIHN0cmluZy5cbiAgICAgKi9cbiAgICBpbnRlcm5hbEpzb25SZWFkKGpzb24sIG9wdGlvbnMsIHRhcmdldCkge1xuICAgICAgICBpZiAoIXRhcmdldClcbiAgICAgICAgICAgIHRhcmdldCA9IHRoaXMuY3JlYXRlKCk7XG4gICAgICAgIHRhcmdldC52YWx1ZSA9IHRoaXMucmVmSnNvblJlYWRlci5zY2FsYXIoanNvbiwgMTIsIHVuZGVmaW5lZCwgXCJ2YWx1ZVwiKTtcbiAgICAgICAgcmV0dXJuIHRhcmdldDtcbiAgICB9XG4gICAgY3JlYXRlKHZhbHVlKSB7XG4gICAgICAgIGNvbnN0IG1lc3NhZ2UgPSB7IHZhbHVlOiBuZXcgVWludDhBcnJheSgwKSB9O1xuICAgICAgICBnbG9iYWxUaGlzLk9iamVjdC5kZWZpbmVQcm9wZXJ0eShtZXNzYWdlLCBydW50aW1lXzYuTUVTU0FHRV9UWVBFLCB7IGVudW1lcmFibGU6IGZhbHNlLCB2YWx1ZTogdGhpcyB9KTtcbiAgICAgICAgaWYgKHZhbHVlICE9PSB1bmRlZmluZWQpXG4gICAgICAgICAgICAoMCwgcnVudGltZV81LnJlZmxlY3Rpb25NZXJnZVBhcnRpYWwpKHRoaXMsIG1lc3NhZ2UsIHZhbHVlKTtcbiAgICAgICAgcmV0dXJuIG1lc3NhZ2U7XG4gICAgfVxuICAgIGludGVybmFsQmluYXJ5UmVhZChyZWFkZXIsIGxlbmd0aCwgb3B0aW9ucywgdGFyZ2V0KSB7XG4gICAgICAgIGxldCBtZXNzYWdlID0gdGFyZ2V0ICE9PSBudWxsICYmIHRhcmdldCAhPT0gdm9pZCAwID8gdGFyZ2V0IDogdGhpcy5jcmVhdGUoKSwgZW5kID0gcmVhZGVyLnBvcyArIGxlbmd0aDtcbiAgICAgICAgd2hpbGUgKHJlYWRlci5wb3MgPCBlbmQpIHtcbiAgICAgICAgICAgIGxldCBbZmllbGRObywgd2lyZVR5cGVdID0gcmVhZGVyLnRhZygpO1xuICAgICAgICAgICAgc3dpdGNoIChmaWVsZE5vKSB7XG4gICAgICAgICAgICAgICAgY2FzZSAvKiBieXRlcyB2YWx1ZSAqLyAxOlxuICAgICAgICAgICAgICAgICAgICBtZXNzYWdlLnZhbHVlID0gcmVhZGVyLmJ5dGVzKCk7XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgICAgICAgICAgIGxldCB1ID0gb3B0aW9ucy5yZWFkVW5rbm93bkZpZWxkO1xuICAgICAgICAgICAgICAgICAgICBpZiAodSA9PT0gXCJ0aHJvd1wiKVxuICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IGdsb2JhbFRoaXMuRXJyb3IoYFVua25vd24gZmllbGQgJHtmaWVsZE5vfSAod2lyZSB0eXBlICR7d2lyZVR5cGV9KSBmb3IgJHt0aGlzLnR5cGVOYW1lfWApO1xuICAgICAgICAgICAgICAgICAgICBsZXQgZCA9IHJlYWRlci5za2lwKHdpcmVUeXBlKTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKHUgIT09IGZhbHNlKVxuICAgICAgICAgICAgICAgICAgICAgICAgKHUgPT09IHRydWUgPyBydW50aW1lXzQuVW5rbm93bkZpZWxkSGFuZGxlci5vblJlYWQgOiB1KSh0aGlzLnR5cGVOYW1lLCBtZXNzYWdlLCBmaWVsZE5vLCB3aXJlVHlwZSwgZCk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIG1lc3NhZ2U7XG4gICAgfVxuICAgIGludGVybmFsQmluYXJ5V3JpdGUobWVzc2FnZSwgd3JpdGVyLCBvcHRpb25zKSB7XG4gICAgICAgIC8qIGJ5dGVzIHZhbHVlID0gMTsgKi9cbiAgICAgICAgaWYgKG1lc3NhZ2UudmFsdWUubGVuZ3RoKVxuICAgICAgICAgICAgd3JpdGVyLnRhZygxLCBydW50aW1lXzMuV2lyZVR5cGUuTGVuZ3RoRGVsaW1pdGVkKS5ieXRlcyhtZXNzYWdlLnZhbHVlKTtcbiAgICAgICAgbGV0IHUgPSBvcHRpb25zLndyaXRlVW5rbm93bkZpZWxkcztcbiAgICAgICAgaWYgKHUgIT09IGZhbHNlKVxuICAgICAgICAgICAgKHUgPT0gdHJ1ZSA/IHJ1bnRpbWVfNC5Vbmtub3duRmllbGRIYW5kbGVyLm9uV3JpdGUgOiB1KSh0aGlzLnR5cGVOYW1lLCBtZXNzYWdlLCB3cml0ZXIpO1xuICAgICAgICByZXR1cm4gd3JpdGVyO1xuICAgIH1cbn1cbi8qKlxuICogQGdlbmVyYXRlZCBNZXNzYWdlVHlwZSBmb3IgcHJvdG9idWYgbWVzc2FnZSBnb29nbGUucHJvdG9idWYuQnl0ZXNWYWx1ZVxuICovXG5leHBvcnRzLkJ5dGVzVmFsdWUgPSBuZXcgQnl0ZXNWYWx1ZSRUeXBlKCk7XG4vLyMgc291cmNlTWFwcGluZ1VSTD13cmFwcGVycy5qcy5tYXAiLAogICAgIlwidXNlIHN0cmljdFwiO1xuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiX19lc01vZHVsZVwiLCB7IHZhbHVlOiB0cnVlIH0pO1xuZXhwb3J0cy5yZWFkU2VydmljZU9wdGlvbiA9IGV4cG9ydHMucmVhZE1ldGhvZE9wdGlvbiA9IGV4cG9ydHMucmVhZE1ldGhvZE9wdGlvbnMgPSBleHBvcnRzLm5vcm1hbGl6ZU1ldGhvZEluZm8gPSB2b2lkIDA7XG5jb25zdCBydW50aW1lXzEgPSByZXF1aXJlKFwiQHByb3RvYnVmLXRzL3J1bnRpbWVcIik7XG4vKipcbiAqIFR1cm5zIFBhcnRpYWxNZXRob2RJbmZvIGludG8gTWV0aG9kSW5mby5cbiAqL1xuZnVuY3Rpb24gbm9ybWFsaXplTWV0aG9kSW5mbyhtZXRob2QsIHNlcnZpY2UpIHtcbiAgICB2YXIgX2EsIF9iLCBfYztcbiAgICBsZXQgbSA9IG1ldGhvZDtcbiAgICBtLnNlcnZpY2UgPSBzZXJ2aWNlO1xuICAgIG0ubG9jYWxOYW1lID0gKF9hID0gbS5sb2NhbE5hbWUpICE9PSBudWxsICYmIF9hICE9PSB2b2lkIDAgPyBfYSA6IHJ1bnRpbWVfMS5sb3dlckNhbWVsQ2FzZShtLm5hbWUpO1xuICAgIC8vIG5vaW5zcGVjdGlvbiBQb2ludGxlc3NCb29sZWFuRXhwcmVzc2lvbkpTXG4gICAgbS5zZXJ2ZXJTdHJlYW1pbmcgPSAhIW0uc2VydmVyU3RyZWFtaW5nO1xuICAgIC8vIG5vaW5zcGVjdGlvbiBQb2ludGxlc3NCb29sZWFuRXhwcmVzc2lvbkpTXG4gICAgbS5jbGllbnRTdHJlYW1pbmcgPSAhIW0uY2xpZW50U3RyZWFtaW5nO1xuICAgIG0ub3B0aW9ucyA9IChfYiA9IG0ub3B0aW9ucykgIT09IG51bGwgJiYgX2IgIT09IHZvaWQgMCA/IF9iIDoge307XG4gICAgbS5pZGVtcG90ZW5jeSA9IChfYyA9IG0uaWRlbXBvdGVuY3kpICE9PSBudWxsICYmIF9jICE9PSB2b2lkIDAgPyBfYyA6IHVuZGVmaW5lZDtcbiAgICByZXR1cm4gbTtcbn1cbmV4cG9ydHMubm9ybWFsaXplTWV0aG9kSW5mbyA9IG5vcm1hbGl6ZU1ldGhvZEluZm87XG4vKipcbiAqIFJlYWQgY3VzdG9tIG1ldGhvZCBvcHRpb25zIGZyb20gYSBnZW5lcmF0ZWQgc2VydmljZSBjbGllbnQuXG4gKlxuICogQGRlcHJlY2F0ZWQgdXNlIHJlYWRNZXRob2RPcHRpb24oKVxuICovXG5mdW5jdGlvbiByZWFkTWV0aG9kT3B0aW9ucyhzZXJ2aWNlLCBtZXRob2ROYW1lLCBleHRlbnNpb25OYW1lLCBleHRlbnNpb25UeXBlKSB7XG4gICAgdmFyIF9hO1xuICAgIGNvbnN0IG9wdGlvbnMgPSAoX2EgPSBzZXJ2aWNlLm1ldGhvZHMuZmluZCgobSwgaSkgPT4gbS5sb2NhbE5hbWUgPT09IG1ldGhvZE5hbWUgfHwgaSA9PT0gbWV0aG9kTmFtZSkpID09PSBudWxsIHx8IF9hID09PSB2b2lkIDAgPyB2b2lkIDAgOiBfYS5vcHRpb25zO1xuICAgIHJldHVybiBvcHRpb25zICYmIG9wdGlvbnNbZXh0ZW5zaW9uTmFtZV0gPyBleHRlbnNpb25UeXBlLmZyb21Kc29uKG9wdGlvbnNbZXh0ZW5zaW9uTmFtZV0pIDogdW5kZWZpbmVkO1xufVxuZXhwb3J0cy5yZWFkTWV0aG9kT3B0aW9ucyA9IHJlYWRNZXRob2RPcHRpb25zO1xuZnVuY3Rpb24gcmVhZE1ldGhvZE9wdGlvbihzZXJ2aWNlLCBtZXRob2ROYW1lLCBleHRlbnNpb25OYW1lLCBleHRlbnNpb25UeXBlKSB7XG4gICAgdmFyIF9hO1xuICAgIGNvbnN0IG9wdGlvbnMgPSAoX2EgPSBzZXJ2aWNlLm1ldGhvZHMuZmluZCgobSwgaSkgPT4gbS5sb2NhbE5hbWUgPT09IG1ldGhvZE5hbWUgfHwgaSA9PT0gbWV0aG9kTmFtZSkpID09PSBudWxsIHx8IF9hID09PSB2b2lkIDAgPyB2b2lkIDAgOiBfYS5vcHRpb25zO1xuICAgIGlmICghb3B0aW9ucykge1xuICAgICAgICByZXR1cm4gdW5kZWZpbmVkO1xuICAgIH1cbiAgICBjb25zdCBvcHRpb25WYWwgPSBvcHRpb25zW2V4dGVuc2lvbk5hbWVdO1xuICAgIGlmIChvcHRpb25WYWwgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICByZXR1cm4gb3B0aW9uVmFsO1xuICAgIH1cbiAgICByZXR1cm4gZXh0ZW5zaW9uVHlwZSA/IGV4dGVuc2lvblR5cGUuZnJvbUpzb24ob3B0aW9uVmFsKSA6IG9wdGlvblZhbDtcbn1cbmV4cG9ydHMucmVhZE1ldGhvZE9wdGlvbiA9IHJlYWRNZXRob2RPcHRpb247XG5mdW5jdGlvbiByZWFkU2VydmljZU9wdGlvbihzZXJ2aWNlLCBleHRlbnNpb25OYW1lLCBleHRlbnNpb25UeXBlKSB7XG4gICAgY29uc3Qgb3B0aW9ucyA9IHNlcnZpY2Uub3B0aW9ucztcbiAgICBpZiAoIW9wdGlvbnMpIHtcbiAgICAgICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICB9XG4gICAgY29uc3Qgb3B0aW9uVmFsID0gb3B0aW9uc1tleHRlbnNpb25OYW1lXTtcbiAgICBpZiAob3B0aW9uVmFsID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgcmV0dXJuIG9wdGlvblZhbDtcbiAgICB9XG4gICAgcmV0dXJuIGV4dGVuc2lvblR5cGUgPyBleHRlbnNpb25UeXBlLmZyb21Kc29uKG9wdGlvblZhbCkgOiBvcHRpb25WYWw7XG59XG5leHBvcnRzLnJlYWRTZXJ2aWNlT3B0aW9uID0gcmVhZFNlcnZpY2VPcHRpb247XG4iLAogICAgIlwidXNlIHN0cmljdFwiO1xuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiX19lc01vZHVsZVwiLCB7IHZhbHVlOiB0cnVlIH0pO1xuZXhwb3J0cy5TZXJ2aWNlVHlwZSA9IHZvaWQgMDtcbmNvbnN0IHJlZmxlY3Rpb25faW5mb18xID0gcmVxdWlyZShcIi4vcmVmbGVjdGlvbi1pbmZvXCIpO1xuY2xhc3MgU2VydmljZVR5cGUge1xuICAgIGNvbnN0cnVjdG9yKHR5cGVOYW1lLCBtZXRob2RzLCBvcHRpb25zKSB7XG4gICAgICAgIHRoaXMudHlwZU5hbWUgPSB0eXBlTmFtZTtcbiAgICAgICAgdGhpcy5tZXRob2RzID0gbWV0aG9kcy5tYXAoaSA9PiByZWZsZWN0aW9uX2luZm9fMS5ub3JtYWxpemVNZXRob2RJbmZvKGksIHRoaXMpKTtcbiAgICAgICAgdGhpcy5vcHRpb25zID0gb3B0aW9ucyAhPT0gbnVsbCAmJiBvcHRpb25zICE9PSB2b2lkIDAgPyBvcHRpb25zIDoge307XG4gICAgfVxufVxuZXhwb3J0cy5TZXJ2aWNlVHlwZSA9IFNlcnZpY2VUeXBlO1xuIiwKICAgICJcInVzZSBzdHJpY3RcIjtcbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIl9fZXNNb2R1bGVcIiwgeyB2YWx1ZTogdHJ1ZSB9KTtcbmV4cG9ydHMuUnBjRXJyb3IgPSB2b2lkIDA7XG4vKipcbiAqIEFuIGVycm9yIHRoYXQgb2NjdXJyZWQgd2hpbGUgY2FsbGluZyBhIFJQQyBtZXRob2QuXG4gKi9cbmNsYXNzIFJwY0Vycm9yIGV4dGVuZHMgRXJyb3Ige1xuICAgIGNvbnN0cnVjdG9yKG1lc3NhZ2UsIGNvZGUgPSAnVU5LTk9XTicsIG1ldGEpIHtcbiAgICAgICAgc3VwZXIobWVzc2FnZSk7XG4gICAgICAgIHRoaXMubmFtZSA9ICdScGNFcnJvcic7XG4gICAgICAgIC8vIHNlZSBodHRwczovL3d3dy50eXBlc2NyaXB0bGFuZy5vcmcvZG9jcy9oYW5kYm9vay9yZWxlYXNlLW5vdGVzL3R5cGVzY3JpcHQtMi0yLmh0bWwjZXhhbXBsZVxuICAgICAgICBPYmplY3Quc2V0UHJvdG90eXBlT2YodGhpcywgbmV3LnRhcmdldC5wcm90b3R5cGUpO1xuICAgICAgICB0aGlzLmNvZGUgPSBjb2RlO1xuICAgICAgICB0aGlzLm1ldGEgPSBtZXRhICE9PSBudWxsICYmIG1ldGEgIT09IHZvaWQgMCA/IG1ldGEgOiB7fTtcbiAgICB9XG4gICAgdG9TdHJpbmcoKSB7XG4gICAgICAgIGNvbnN0IGwgPSBbdGhpcy5uYW1lICsgJzogJyArIHRoaXMubWVzc2FnZV07XG4gICAgICAgIGlmICh0aGlzLmNvZGUpIHtcbiAgICAgICAgICAgIGwucHVzaCgnJyk7XG4gICAgICAgICAgICBsLnB1c2goJ0NvZGU6ICcgKyB0aGlzLmNvZGUpO1xuICAgICAgICB9XG4gICAgICAgIGlmICh0aGlzLnNlcnZpY2VOYW1lICYmIHRoaXMubWV0aG9kTmFtZSkge1xuICAgICAgICAgICAgbC5wdXNoKCdNZXRob2Q6ICcgKyB0aGlzLnNlcnZpY2VOYW1lICsgJy8nICsgdGhpcy5tZXRob2ROYW1lKTtcbiAgICAgICAgfVxuICAgICAgICBsZXQgbSA9IE9iamVjdC5lbnRyaWVzKHRoaXMubWV0YSk7XG4gICAgICAgIGlmIChtLmxlbmd0aCkge1xuICAgICAgICAgICAgbC5wdXNoKCcnKTtcbiAgICAgICAgICAgIGwucHVzaCgnTWV0YTonKTtcbiAgICAgICAgICAgIGZvciAobGV0IFtrLCB2XSBvZiBtKSB7XG4gICAgICAgICAgICAgICAgbC5wdXNoKGAgICR7a306ICR7dn1gKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gbC5qb2luKCdcXG4nKTtcbiAgICB9XG59XG5leHBvcnRzLlJwY0Vycm9yID0gUnBjRXJyb3I7XG4iLAogICAgIlwidXNlIHN0cmljdFwiO1xuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiX19lc01vZHVsZVwiLCB7IHZhbHVlOiB0cnVlIH0pO1xuZXhwb3J0cy5tZXJnZVJwY09wdGlvbnMgPSB2b2lkIDA7XG5jb25zdCBydW50aW1lXzEgPSByZXF1aXJlKFwiQHByb3RvYnVmLXRzL3J1bnRpbWVcIik7XG4vKipcbiAqIE1lcmdlcyBjdXN0b20gUlBDIG9wdGlvbnMgd2l0aCBkZWZhdWx0cy4gUmV0dXJucyBhIG5ldyBpbnN0YW5jZSBhbmQga2VlcHNcbiAqIHRoZSBcImRlZmF1bHRzXCIgYW5kIHRoZSBcIm9wdGlvbnNcIiB1bm1vZGlmaWVkLlxuICpcbiAqIE1lcmdlcyBgUnBjTWV0YWRhdGFgIFwibWV0YVwiLCBvdmVyd3JpdGluZyB2YWx1ZXMgZnJvbSBcImRlZmF1bHRzXCIgd2l0aFxuICogdmFsdWVzIGZyb20gXCJvcHRpb25zXCIuIERvZXMgbm90IGFwcGVuZCB2YWx1ZXMgdG8gZXhpc3RpbmcgZW50cmllcy5cbiAqXG4gKiBNZXJnZXMgXCJqc29uT3B0aW9uc1wiLCBpbmNsdWRpbmcgXCJqc29uT3B0aW9ucy50eXBlUmVnaXN0cnlcIiwgYnkgY3JlYXRpbmdcbiAqIGEgbmV3IGFycmF5IHRoYXQgY29udGFpbnMgdHlwZXMgZnJvbSBcIm9wdGlvbnMuanNvbk9wdGlvbnMudHlwZVJlZ2lzdHJ5XCJcbiAqIGZpcnN0LCB0aGVuIHR5cGVzIGZyb20gXCJkZWZhdWx0cy5qc29uT3B0aW9ucy50eXBlUmVnaXN0cnlcIi5cbiAqXG4gKiBNZXJnZXMgXCJiaW5hcnlPcHRpb25zXCIuXG4gKlxuICogTWVyZ2VzIFwiaW50ZXJjZXB0b3JzXCIgYnkgY3JlYXRpbmcgYSBuZXcgYXJyYXkgdGhhdCBjb250YWlucyBpbnRlcmNlcHRvcnNcbiAqIGZyb20gXCJkZWZhdWx0c1wiIGZpcnN0LCB0aGVuIGludGVyY2VwdG9ycyBmcm9tIFwib3B0aW9uc1wiLlxuICpcbiAqIFdvcmtzIHdpdGggb2JqZWN0cyB0aGF0IGV4dGVuZCBgUnBjT3B0aW9uc2AsIGJ1dCBvbmx5IGlmIHRoZSBhZGRlZFxuICogcHJvcGVydGllcyBhcmUgb2YgdHlwZSBEYXRlLCBwcmltaXRpdmUgbGlrZSBzdHJpbmcsIGJvb2xlYW4sIG9yIEFycmF5XG4gKiBvZiBwcmltaXRpdmVzLiBJZiB5b3UgaGF2ZSBvdGhlciBwcm9wZXJ0eSB0eXBlcywgeW91IGhhdmUgdG8gbWVyZ2UgdGhlbVxuICogeW91cnNlbGYuXG4gKi9cbmZ1bmN0aW9uIG1lcmdlUnBjT3B0aW9ucyhkZWZhdWx0cywgb3B0aW9ucykge1xuICAgIGlmICghb3B0aW9ucylcbiAgICAgICAgcmV0dXJuIGRlZmF1bHRzO1xuICAgIGxldCBvID0ge307XG4gICAgY29weShkZWZhdWx0cywgbyk7XG4gICAgY29weShvcHRpb25zLCBvKTtcbiAgICBmb3IgKGxldCBrZXkgb2YgT2JqZWN0LmtleXMob3B0aW9ucykpIHtcbiAgICAgICAgbGV0IHZhbCA9IG9wdGlvbnNba2V5XTtcbiAgICAgICAgc3dpdGNoIChrZXkpIHtcbiAgICAgICAgICAgIGNhc2UgXCJqc29uT3B0aW9uc1wiOlxuICAgICAgICAgICAgICAgIG8uanNvbk9wdGlvbnMgPSBydW50aW1lXzEubWVyZ2VKc29uT3B0aW9ucyhkZWZhdWx0cy5qc29uT3B0aW9ucywgby5qc29uT3B0aW9ucyk7XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICBjYXNlIFwiYmluYXJ5T3B0aW9uc1wiOlxuICAgICAgICAgICAgICAgIG8uYmluYXJ5T3B0aW9ucyA9IHJ1bnRpbWVfMS5tZXJnZUJpbmFyeU9wdGlvbnMoZGVmYXVsdHMuYmluYXJ5T3B0aW9ucywgby5iaW5hcnlPcHRpb25zKTtcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIGNhc2UgXCJtZXRhXCI6XG4gICAgICAgICAgICAgICAgby5tZXRhID0ge307XG4gICAgICAgICAgICAgICAgY29weShkZWZhdWx0cy5tZXRhLCBvLm1ldGEpO1xuICAgICAgICAgICAgICAgIGNvcHkob3B0aW9ucy5tZXRhLCBvLm1ldGEpO1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgY2FzZSBcImludGVyY2VwdG9yc1wiOlxuICAgICAgICAgICAgICAgIG8uaW50ZXJjZXB0b3JzID0gZGVmYXVsdHMuaW50ZXJjZXB0b3JzID8gZGVmYXVsdHMuaW50ZXJjZXB0b3JzLmNvbmNhdCh2YWwpIDogdmFsLmNvbmNhdCgpO1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG4gICAgfVxuICAgIHJldHVybiBvO1xufVxuZXhwb3J0cy5tZXJnZVJwY09wdGlvbnMgPSBtZXJnZVJwY09wdGlvbnM7XG5mdW5jdGlvbiBjb3B5KGEsIGludG8pIHtcbiAgICBpZiAoIWEpXG4gICAgICAgIHJldHVybjtcbiAgICBsZXQgYyA9IGludG87XG4gICAgZm9yIChsZXQgW2ssIHZdIG9mIE9iamVjdC5lbnRyaWVzKGEpKSB7XG4gICAgICAgIGlmICh2IGluc3RhbmNlb2YgRGF0ZSlcbiAgICAgICAgICAgIGNba10gPSBuZXcgRGF0ZSh2LmdldFRpbWUoKSk7XG4gICAgICAgIGVsc2UgaWYgKEFycmF5LmlzQXJyYXkodikpXG4gICAgICAgICAgICBjW2tdID0gdi5jb25jYXQoKTtcbiAgICAgICAgZWxzZVxuICAgICAgICAgICAgY1trXSA9IHY7XG4gICAgfVxufVxuIiwKICAgICJcInVzZSBzdHJpY3RcIjtcbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIl9fZXNNb2R1bGVcIiwgeyB2YWx1ZTogdHJ1ZSB9KTtcbmV4cG9ydHMuRGVmZXJyZWQgPSBleHBvcnRzLkRlZmVycmVkU3RhdGUgPSB2b2lkIDA7XG52YXIgRGVmZXJyZWRTdGF0ZTtcbihmdW5jdGlvbiAoRGVmZXJyZWRTdGF0ZSkge1xuICAgIERlZmVycmVkU3RhdGVbRGVmZXJyZWRTdGF0ZVtcIlBFTkRJTkdcIl0gPSAwXSA9IFwiUEVORElOR1wiO1xuICAgIERlZmVycmVkU3RhdGVbRGVmZXJyZWRTdGF0ZVtcIlJFSkVDVEVEXCJdID0gMV0gPSBcIlJFSkVDVEVEXCI7XG4gICAgRGVmZXJyZWRTdGF0ZVtEZWZlcnJlZFN0YXRlW1wiUkVTT0xWRURcIl0gPSAyXSA9IFwiUkVTT0xWRURcIjtcbn0pKERlZmVycmVkU3RhdGUgPSBleHBvcnRzLkRlZmVycmVkU3RhdGUgfHwgKGV4cG9ydHMuRGVmZXJyZWRTdGF0ZSA9IHt9KSk7XG4vKipcbiAqIEEgZGVmZXJyZWQgcHJvbWlzZS4gVGhpcyBpcyBhIFwiY29udHJvbGxlclwiIGZvciBhIHByb21pc2UsIHdoaWNoIGxldHMgeW91XG4gKiBwYXNzIGEgcHJvbWlzZSBhcm91bmQgYW5kIHJlamVjdCBvciByZXNvbHZlIGl0IGZyb20gdGhlIG91dHNpZGUuXG4gKlxuICogV2FybmluZzogVGhpcyBjbGFzcyBpcyB0byBiZSB1c2VkIHdpdGggY2FyZS4gVXNpbmcgaXQgY2FuIG1ha2UgY29kZSB2ZXJ5XG4gKiBkaWZmaWN1bHQgdG8gcmVhZC4gSXQgaXMgaW50ZW5kZWQgZm9yIHVzZSBpbiBsaWJyYXJ5IGNvZGUgdGhhdCBleHBvc2VzXG4gKiBwcm9taXNlcywgbm90IGZvciByZWd1bGFyIGJ1c2luZXNzIGxvZ2ljLlxuICovXG5jbGFzcyBEZWZlcnJlZCB7XG4gICAgLyoqXG4gICAgICogQHBhcmFtIHByZXZlbnRVbmhhbmRsZWRSZWplY3Rpb25XYXJuaW5nIC0gcHJldmVudHMgdGhlIHdhcm5pbmdcbiAgICAgKiBcIlVuaGFuZGxlZCBQcm9taXNlIHJlamVjdGlvblwiIGJ5IGFkZGluZyBhIG5vb3AgcmVqZWN0aW9uIGhhbmRsZXIuXG4gICAgICogV29ya2luZyB3aXRoIGNhbGxzIHJldHVybmVkIGZyb20gdGhlIHJ1bnRpbWUtcnBjIHBhY2thZ2UgaW4gYW5cbiAgICAgKiBhc3luYyBmdW5jdGlvbiB1c3VhbGx5IG1lYW5zIGF3YWl0aW5nIG9uZSBjYWxsIHByb3BlcnR5IGFmdGVyXG4gICAgICogdGhlIG90aGVyLiBUaGlzIG1lYW5zIHRoYXQgdGhlIFwic3RhdHVzXCIgaXMgbm90IGJlaW5nIGF3YWl0ZWQgd2hlblxuICAgICAqIGFuIGVhcmxpZXIgYXdhaXQgZm9yIHRoZSBcImhlYWRlcnNcIiBpcyByZWplY3RlZC4gVGhpcyBjYXVzZXMgdGhlXG4gICAgICogXCJ1bmhhbmRsZWQgcHJvbWlzZSByZWplY3RcIiB3YXJuaW5nLiBBIG1vcmUgY29ycmVjdCBiZWhhdmlvdXIgZm9yXG4gICAgICogY2FsbHMgbWlnaHQgYmUgdG8gYmVjb21lIGF3YXJlIHdoZXRoZXIgYXQgbGVhc3Qgb25lIG9mIHRoZVxuICAgICAqIHByb21pc2VzIGlzIGhhbmRsZWQgYW5kIHN3YWxsb3cgdGhlIHJlamVjdGlvbiB3YXJuaW5nIGZvciB0aGVcbiAgICAgKiBvdGhlcnMuXG4gICAgICovXG4gICAgY29uc3RydWN0b3IocHJldmVudFVuaGFuZGxlZFJlamVjdGlvbldhcm5pbmcgPSB0cnVlKSB7XG4gICAgICAgIHRoaXMuX3N0YXRlID0gRGVmZXJyZWRTdGF0ZS5QRU5ESU5HO1xuICAgICAgICB0aGlzLl9wcm9taXNlID0gbmV3IFByb21pc2UoKHJlc29sdmUsIHJlamVjdCkgPT4ge1xuICAgICAgICAgICAgdGhpcy5fcmVzb2x2ZSA9IHJlc29sdmU7XG4gICAgICAgICAgICB0aGlzLl9yZWplY3QgPSByZWplY3Q7XG4gICAgICAgIH0pO1xuICAgICAgICBpZiAocHJldmVudFVuaGFuZGxlZFJlamVjdGlvbldhcm5pbmcpIHtcbiAgICAgICAgICAgIHRoaXMuX3Byb21pc2UuY2F0Y2goXyA9PiB7IH0pO1xuICAgICAgICB9XG4gICAgfVxuICAgIC8qKlxuICAgICAqIEdldCB0aGUgY3VycmVudCBzdGF0ZSBvZiB0aGUgcHJvbWlzZS5cbiAgICAgKi9cbiAgICBnZXQgc3RhdGUoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLl9zdGF0ZTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogR2V0IHRoZSBkZWZlcnJlZCBwcm9taXNlLlxuICAgICAqL1xuICAgIGdldCBwcm9taXNlKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5fcHJvbWlzZTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogUmVzb2x2ZSB0aGUgcHJvbWlzZS4gVGhyb3dzIGlmIHRoZSBwcm9taXNlIGlzIGFscmVhZHkgcmVzb2x2ZWQgb3IgcmVqZWN0ZWQuXG4gICAgICovXG4gICAgcmVzb2x2ZSh2YWx1ZSkge1xuICAgICAgICBpZiAodGhpcy5zdGF0ZSAhPT0gRGVmZXJyZWRTdGF0ZS5QRU5ESU5HKVxuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBjYW5ub3QgcmVzb2x2ZSAke0RlZmVycmVkU3RhdGVbdGhpcy5zdGF0ZV0udG9Mb3dlckNhc2UoKX1gKTtcbiAgICAgICAgdGhpcy5fcmVzb2x2ZSh2YWx1ZSk7XG4gICAgICAgIHRoaXMuX3N0YXRlID0gRGVmZXJyZWRTdGF0ZS5SRVNPTFZFRDtcbiAgICB9XG4gICAgLyoqXG4gICAgICogUmVqZWN0IHRoZSBwcm9taXNlLiBUaHJvd3MgaWYgdGhlIHByb21pc2UgaXMgYWxyZWFkeSByZXNvbHZlZCBvciByZWplY3RlZC5cbiAgICAgKi9cbiAgICByZWplY3QocmVhc29uKSB7XG4gICAgICAgIGlmICh0aGlzLnN0YXRlICE9PSBEZWZlcnJlZFN0YXRlLlBFTkRJTkcpXG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYGNhbm5vdCByZWplY3QgJHtEZWZlcnJlZFN0YXRlW3RoaXMuc3RhdGVdLnRvTG93ZXJDYXNlKCl9YCk7XG4gICAgICAgIHRoaXMuX3JlamVjdChyZWFzb24pO1xuICAgICAgICB0aGlzLl9zdGF0ZSA9IERlZmVycmVkU3RhdGUuUkVKRUNURUQ7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIFJlc29sdmUgdGhlIHByb21pc2UuIElnbm9yZSBpZiBub3QgcGVuZGluZy5cbiAgICAgKi9cbiAgICByZXNvbHZlUGVuZGluZyh2YWwpIHtcbiAgICAgICAgaWYgKHRoaXMuX3N0YXRlID09PSBEZWZlcnJlZFN0YXRlLlBFTkRJTkcpXG4gICAgICAgICAgICB0aGlzLnJlc29sdmUodmFsKTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogUmVqZWN0IHRoZSBwcm9taXNlLiBJZ25vcmUgaWYgbm90IHBlbmRpbmcuXG4gICAgICovXG4gICAgcmVqZWN0UGVuZGluZyhyZWFzb24pIHtcbiAgICAgICAgaWYgKHRoaXMuX3N0YXRlID09PSBEZWZlcnJlZFN0YXRlLlBFTkRJTkcpXG4gICAgICAgICAgICB0aGlzLnJlamVjdChyZWFzb24pO1xuICAgIH1cbn1cbmV4cG9ydHMuRGVmZXJyZWQgPSBEZWZlcnJlZDtcbiIsCiAgICAiXCJ1c2Ugc3RyaWN0XCI7XG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJfX2VzTW9kdWxlXCIsIHsgdmFsdWU6IHRydWUgfSk7XG5leHBvcnRzLlJwY091dHB1dFN0cmVhbUNvbnRyb2xsZXIgPSB2b2lkIDA7XG5jb25zdCBkZWZlcnJlZF8xID0gcmVxdWlyZShcIi4vZGVmZXJyZWRcIik7XG5jb25zdCBydW50aW1lXzEgPSByZXF1aXJlKFwiQHByb3RvYnVmLXRzL3J1bnRpbWVcIik7XG4vKipcbiAqIEEgYFJwY091dHB1dFN0cmVhbWAgdGhhdCB5b3UgY29udHJvbC5cbiAqL1xuY2xhc3MgUnBjT3V0cHV0U3RyZWFtQ29udHJvbGxlciB7XG4gICAgY29uc3RydWN0b3IoKSB7XG4gICAgICAgIHRoaXMuX2xpcyA9IHtcbiAgICAgICAgICAgIG54dDogW10sXG4gICAgICAgICAgICBtc2c6IFtdLFxuICAgICAgICAgICAgZXJyOiBbXSxcbiAgICAgICAgICAgIGNtcDogW10sXG4gICAgICAgIH07XG4gICAgICAgIHRoaXMuX2Nsb3NlZCA9IGZhbHNlO1xuICAgIH1cbiAgICAvLyAtLS0gUnBjT3V0cHV0U3RyZWFtIGNhbGxiYWNrIEFQSVxuICAgIG9uTmV4dChjYWxsYmFjaykge1xuICAgICAgICByZXR1cm4gdGhpcy5hZGRMaXMoY2FsbGJhY2ssIHRoaXMuX2xpcy5ueHQpO1xuICAgIH1cbiAgICBvbk1lc3NhZ2UoY2FsbGJhY2spIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuYWRkTGlzKGNhbGxiYWNrLCB0aGlzLl9saXMubXNnKTtcbiAgICB9XG4gICAgb25FcnJvcihjYWxsYmFjaykge1xuICAgICAgICByZXR1cm4gdGhpcy5hZGRMaXMoY2FsbGJhY2ssIHRoaXMuX2xpcy5lcnIpO1xuICAgIH1cbiAgICBvbkNvbXBsZXRlKGNhbGxiYWNrKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmFkZExpcyhjYWxsYmFjaywgdGhpcy5fbGlzLmNtcCk7XG4gICAgfVxuICAgIGFkZExpcyhjYWxsYmFjaywgbGlzdCkge1xuICAgICAgICBsaXN0LnB1c2goY2FsbGJhY2spO1xuICAgICAgICByZXR1cm4gKCkgPT4ge1xuICAgICAgICAgICAgbGV0IGkgPSBsaXN0LmluZGV4T2YoY2FsbGJhY2spO1xuICAgICAgICAgICAgaWYgKGkgPj0gMClcbiAgICAgICAgICAgICAgICBsaXN0LnNwbGljZShpLCAxKTtcbiAgICAgICAgfTtcbiAgICB9XG4gICAgLy8gcmVtb3ZlIGFsbCBsaXN0ZW5lcnNcbiAgICBjbGVhckxpcygpIHtcbiAgICAgICAgZm9yIChsZXQgbCBvZiBPYmplY3QudmFsdWVzKHRoaXMuX2xpcykpXG4gICAgICAgICAgICBsLnNwbGljZSgwLCBsLmxlbmd0aCk7XG4gICAgfVxuICAgIC8vIC0tLSBDb250cm9sbGVyIEFQSVxuICAgIC8qKlxuICAgICAqIElzIHRoaXMgc3RyZWFtIGFscmVhZHkgY2xvc2VkIGJ5IGEgY29tcGxldGlvbiBvciBlcnJvcj9cbiAgICAgKi9cbiAgICBnZXQgY2xvc2VkKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5fY2xvc2VkICE9PSBmYWxzZTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogRW1pdCBtZXNzYWdlLCBjbG9zZSB3aXRoIGVycm9yLCBvciBjbG9zZSBzdWNjZXNzZnVsbHksIGJ1dCBvbmx5IG9uZVxuICAgICAqIGF0IGEgdGltZS5cbiAgICAgKiBDYW4gYmUgdXNlZCB0byB3cmFwIGEgc3RyZWFtIGJ5IHVzaW5nIHRoZSBvdGhlciBzdHJlYW0ncyBgb25OZXh0YC5cbiAgICAgKi9cbiAgICBub3RpZnlOZXh0KG1lc3NhZ2UsIGVycm9yLCBjb21wbGV0ZSkge1xuICAgICAgICBydW50aW1lXzEuYXNzZXJ0KChtZXNzYWdlID8gMSA6IDApICsgKGVycm9yID8gMSA6IDApICsgKGNvbXBsZXRlID8gMSA6IDApIDw9IDEsICdvbmx5IG9uZSBlbWlzc2lvbiBhdCBhIHRpbWUnKTtcbiAgICAgICAgaWYgKG1lc3NhZ2UpXG4gICAgICAgICAgICB0aGlzLm5vdGlmeU1lc3NhZ2UobWVzc2FnZSk7XG4gICAgICAgIGlmIChlcnJvcilcbiAgICAgICAgICAgIHRoaXMubm90aWZ5RXJyb3IoZXJyb3IpO1xuICAgICAgICBpZiAoY29tcGxldGUpXG4gICAgICAgICAgICB0aGlzLm5vdGlmeUNvbXBsZXRlKCk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIEVtaXRzIGEgbmV3IG1lc3NhZ2UuIFRocm93cyBpZiBzdHJlYW0gaXMgY2xvc2VkLlxuICAgICAqXG4gICAgICogVHJpZ2dlcnMgb25OZXh0IGFuZCBvbk1lc3NhZ2UgY2FsbGJhY2tzLlxuICAgICAqL1xuICAgIG5vdGlmeU1lc3NhZ2UobWVzc2FnZSkge1xuICAgICAgICBydW50aW1lXzEuYXNzZXJ0KCF0aGlzLmNsb3NlZCwgJ3N0cmVhbSBpcyBjbG9zZWQnKTtcbiAgICAgICAgdGhpcy5wdXNoSXQoeyB2YWx1ZTogbWVzc2FnZSwgZG9uZTogZmFsc2UgfSk7XG4gICAgICAgIHRoaXMuX2xpcy5tc2cuZm9yRWFjaChsID0+IGwobWVzc2FnZSkpO1xuICAgICAgICB0aGlzLl9saXMubnh0LmZvckVhY2gobCA9PiBsKG1lc3NhZ2UsIHVuZGVmaW5lZCwgZmFsc2UpKTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogQ2xvc2VzIHRoZSBzdHJlYW0gd2l0aCBhbiBlcnJvci4gVGhyb3dzIGlmIHN0cmVhbSBpcyBjbG9zZWQuXG4gICAgICpcbiAgICAgKiBUcmlnZ2VycyBvbk5leHQgYW5kIG9uRXJyb3IgY2FsbGJhY2tzLlxuICAgICAqL1xuICAgIG5vdGlmeUVycm9yKGVycm9yKSB7XG4gICAgICAgIHJ1bnRpbWVfMS5hc3NlcnQoIXRoaXMuY2xvc2VkLCAnc3RyZWFtIGlzIGNsb3NlZCcpO1xuICAgICAgICB0aGlzLl9jbG9zZWQgPSBlcnJvcjtcbiAgICAgICAgdGhpcy5wdXNoSXQoZXJyb3IpO1xuICAgICAgICB0aGlzLl9saXMuZXJyLmZvckVhY2gobCA9PiBsKGVycm9yKSk7XG4gICAgICAgIHRoaXMuX2xpcy5ueHQuZm9yRWFjaChsID0+IGwodW5kZWZpbmVkLCBlcnJvciwgZmFsc2UpKTtcbiAgICAgICAgdGhpcy5jbGVhckxpcygpO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBDbG9zZXMgdGhlIHN0cmVhbSBzdWNjZXNzZnVsbHkuIFRocm93cyBpZiBzdHJlYW0gaXMgY2xvc2VkLlxuICAgICAqXG4gICAgICogVHJpZ2dlcnMgb25OZXh0IGFuZCBvbkNvbXBsZXRlIGNhbGxiYWNrcy5cbiAgICAgKi9cbiAgICBub3RpZnlDb21wbGV0ZSgpIHtcbiAgICAgICAgcnVudGltZV8xLmFzc2VydCghdGhpcy5jbG9zZWQsICdzdHJlYW0gaXMgY2xvc2VkJyk7XG4gICAgICAgIHRoaXMuX2Nsb3NlZCA9IHRydWU7XG4gICAgICAgIHRoaXMucHVzaEl0KHsgdmFsdWU6IG51bGwsIGRvbmU6IHRydWUgfSk7XG4gICAgICAgIHRoaXMuX2xpcy5jbXAuZm9yRWFjaChsID0+IGwoKSk7XG4gICAgICAgIHRoaXMuX2xpcy5ueHQuZm9yRWFjaChsID0+IGwodW5kZWZpbmVkLCB1bmRlZmluZWQsIHRydWUpKTtcbiAgICAgICAgdGhpcy5jbGVhckxpcygpO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBDcmVhdGVzIGFuIGFzeW5jIGl0ZXJhdG9yICh0aGF0IGNhbiBiZSB1c2VkIHdpdGggYGZvciBhd2FpdCB7Li4ufWApXG4gICAgICogdG8gY29uc3VtZSB0aGUgc3RyZWFtLlxuICAgICAqXG4gICAgICogU29tZSB0aGluZ3MgdG8gbm90ZTpcbiAgICAgKiAtIElmIGFuIGVycm9yIG9jY3VycywgdGhlIGBmb3IgYXdhaXRgIHdpbGwgdGhyb3cgaXQuXG4gICAgICogLSBJZiBhbiBlcnJvciBvY2N1cnJlZCBiZWZvcmUgdGhlIGBmb3IgYXdhaXRgIHdhcyBzdGFydGVkLCBgZm9yIGF3YWl0YFxuICAgICAqICAgd2lsbCByZS10aHJvdyBpdC5cbiAgICAgKiAtIElmIHRoZSBzdHJlYW0gaXMgYWxyZWFkeSBjb21wbGV0ZSwgdGhlIGBmb3IgYXdhaXRgIHdpbGwgYmUgZW1wdHkuXG4gICAgICogLSBJZiB5b3VyIGBmb3IgYXdhaXRgIGNvbnN1bWVzIHNsb3dlciB0aGFuIHRoZSBzdHJlYW0gcHJvZHVjZXMsXG4gICAgICogICBmb3IgZXhhbXBsZSBiZWNhdXNlIHlvdSBhcmUgcmVsYXlpbmcgbWVzc2FnZXMgaW4gYSBzbG93IG9wZXJhdGlvbixcbiAgICAgKiAgIG1lc3NhZ2VzIGFyZSBxdWV1ZWQuXG4gICAgICovXG4gICAgW1N5bWJvbC5hc3luY0l0ZXJhdG9yXSgpIHtcbiAgICAgICAgLy8gaW5pdCB0aGUgaXRlcmF0b3Igc3RhdGUsIGVuYWJsaW5nIHB1c2hJdCgpXG4gICAgICAgIGlmICghdGhpcy5faXRTdGF0ZSkge1xuICAgICAgICAgICAgdGhpcy5faXRTdGF0ZSA9IHsgcTogW10gfTtcbiAgICAgICAgfVxuICAgICAgICAvLyBpZiB3ZSBhcmUgY2xvc2VkLCB3ZSBhcmUgZGVmaW5pdGVseSBub3QgcmVjZWl2aW5nIGFueSBtb3JlIG1lc3NhZ2VzLlxuICAgICAgICAvLyBidXQgd2UgY2FuJ3QgbGV0IHRoZSBpdGVyYXRvciBnZXQgc3R1Y2suIHdlIHdhbnQgdG8gZWl0aGVyOlxuICAgICAgICAvLyBhKSBmaW5pc2ggdGhlIG5ldyBpdGVyYXRvciBpbW1lZGlhdGVseSwgYmVjYXVzZSB3ZSBhcmUgY29tcGxldGVkXG4gICAgICAgIC8vIGIpIHJlamVjdCB0aGUgbmV3IGl0ZXJhdG9yLCBiZWNhdXNlIHdlIGVycm9yZWRcbiAgICAgICAgaWYgKHRoaXMuX2Nsb3NlZCA9PT0gdHJ1ZSlcbiAgICAgICAgICAgIHRoaXMucHVzaEl0KHsgdmFsdWU6IG51bGwsIGRvbmU6IHRydWUgfSk7XG4gICAgICAgIGVsc2UgaWYgKHRoaXMuX2Nsb3NlZCAhPT0gZmFsc2UpXG4gICAgICAgICAgICB0aGlzLnB1c2hJdCh0aGlzLl9jbG9zZWQpO1xuICAgICAgICAvLyB0aGUgYXN5bmMgaXRlcmF0b3JcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgIG5leHQ6ICgpID0+IHtcbiAgICAgICAgICAgICAgICBsZXQgc3RhdGUgPSB0aGlzLl9pdFN0YXRlO1xuICAgICAgICAgICAgICAgIHJ1bnRpbWVfMS5hc3NlcnQoc3RhdGUsIFwiYmFkIHN0YXRlXCIpOyAvLyBpZiB3ZSBkb24ndCBoYXZlIGEgc3RhdGUgaGVyZSwgY29kZSBpcyBicm9rZW5cbiAgICAgICAgICAgICAgICAvLyB0aGVyZSBzaG91bGQgYmUgbm8gcGVuZGluZyByZXN1bHQuXG4gICAgICAgICAgICAgICAgLy8gZGlkIHRoZSBjb25zdW1lciBjYWxsIG5leHQoKSBiZWZvcmUgd2UgcmVzb2x2ZWQgb3VyIHByZXZpb3VzIHJlc3VsdCBwcm9taXNlP1xuICAgICAgICAgICAgICAgIHJ1bnRpbWVfMS5hc3NlcnQoIXN0YXRlLnAsIFwiaXRlcmF0b3IgY29udHJhY3QgYnJva2VuXCIpO1xuICAgICAgICAgICAgICAgIC8vIGRpZCB3ZSBwcm9kdWNlIGZhc3RlciB0aGFuIHRoZSBpdGVyYXRvciBjb25zdW1lZD9cbiAgICAgICAgICAgICAgICAvLyByZXR1cm4gdGhlIG9sZGVzdCByZXN1bHQgZnJvbSB0aGUgcXVldWUuXG4gICAgICAgICAgICAgICAgbGV0IGZpcnN0ID0gc3RhdGUucS5zaGlmdCgpO1xuICAgICAgICAgICAgICAgIGlmIChmaXJzdClcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIChcInZhbHVlXCIgaW4gZmlyc3QpID8gUHJvbWlzZS5yZXNvbHZlKGZpcnN0KSA6IFByb21pc2UucmVqZWN0KGZpcnN0KTtcbiAgICAgICAgICAgICAgICAvLyB3ZSBoYXZlIG5vIHJlc3VsdCBBVE0sIGJ1dCB3ZSBwcm9taXNlIG9uZS5cbiAgICAgICAgICAgICAgICAvLyBhcyBzb29uIGFzIHdlIGhhdmUgYSByZXN1bHQsIHdlIG11c3QgcmVzb2x2ZSBwcm9taXNlLlxuICAgICAgICAgICAgICAgIHN0YXRlLnAgPSBuZXcgZGVmZXJyZWRfMS5EZWZlcnJlZCgpO1xuICAgICAgICAgICAgICAgIHJldHVybiBzdGF0ZS5wLnByb21pc2U7XG4gICAgICAgICAgICB9LFxuICAgICAgICB9O1xuICAgIH1cbiAgICAvLyBcInB1c2hcIiBhIG5ldyBpdGVyYXRvciByZXN1bHQuXG4gICAgLy8gdGhpcyBlaXRoZXIgcmVzb2x2ZXMgYSBwZW5kaW5nIHByb21pc2UsIG9yIGVucXVldWVzIHRoZSByZXN1bHQuXG4gICAgcHVzaEl0KHJlc3VsdCkge1xuICAgICAgICBsZXQgc3RhdGUgPSB0aGlzLl9pdFN0YXRlO1xuICAgICAgICBpZiAoIXN0YXRlKVxuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAvLyBpcyB0aGUgY29uc3VtZXIgd2FpdGluZyBmb3IgdXM/XG4gICAgICAgIGlmIChzdGF0ZS5wKSB7XG4gICAgICAgICAgICAvLyB5ZXMsIGNvbnN1bWVyIGlzIHdhaXRpbmcgZm9yIHRoaXMgcHJvbWlzZS5cbiAgICAgICAgICAgIGNvbnN0IHAgPSBzdGF0ZS5wO1xuICAgICAgICAgICAgcnVudGltZV8xLmFzc2VydChwLnN0YXRlID09IGRlZmVycmVkXzEuRGVmZXJyZWRTdGF0ZS5QRU5ESU5HLCBcIml0ZXJhdG9yIGNvbnRyYWN0IGJyb2tlblwiKTtcbiAgICAgICAgICAgIC8vIHJlc29sdmUgdGhlIHByb21pc2VcbiAgICAgICAgICAgIChcInZhbHVlXCIgaW4gcmVzdWx0KSA/IHAucmVzb2x2ZShyZXN1bHQpIDogcC5yZWplY3QocmVzdWx0KTtcbiAgICAgICAgICAgIC8vIG11c3QgY2xlYW51cCwgb3RoZXJ3aXNlIGl0ZXJhdG9yLm5leHQoKSB3b3VsZCBwaWNrIGl0IHVwIGFnYWluLlxuICAgICAgICAgICAgZGVsZXRlIHN0YXRlLnA7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAvLyB3ZSBhcmUgcHJvZHVjaW5nIGZhc3RlciB0aGFuIHRoZSBpdGVyYXRvciBjb25zdW1lcy5cbiAgICAgICAgICAgIC8vIHB1c2ggcmVzdWx0IG9udG8gcXVldWUuXG4gICAgICAgICAgICBzdGF0ZS5xLnB1c2gocmVzdWx0KTtcbiAgICAgICAgfVxuICAgIH1cbn1cbmV4cG9ydHMuUnBjT3V0cHV0U3RyZWFtQ29udHJvbGxlciA9IFJwY091dHB1dFN0cmVhbUNvbnRyb2xsZXI7XG4iLAogICAgIlwidXNlIHN0cmljdFwiO1xudmFyIF9fYXdhaXRlciA9ICh0aGlzICYmIHRoaXMuX19hd2FpdGVyKSB8fCBmdW5jdGlvbiAodGhpc0FyZywgX2FyZ3VtZW50cywgUCwgZ2VuZXJhdG9yKSB7XG4gICAgZnVuY3Rpb24gYWRvcHQodmFsdWUpIHsgcmV0dXJuIHZhbHVlIGluc3RhbmNlb2YgUCA/IHZhbHVlIDogbmV3IFAoZnVuY3Rpb24gKHJlc29sdmUpIHsgcmVzb2x2ZSh2YWx1ZSk7IH0pOyB9XG4gICAgcmV0dXJuIG5ldyAoUCB8fCAoUCA9IFByb21pc2UpKShmdW5jdGlvbiAocmVzb2x2ZSwgcmVqZWN0KSB7XG4gICAgICAgIGZ1bmN0aW9uIGZ1bGZpbGxlZCh2YWx1ZSkgeyB0cnkgeyBzdGVwKGdlbmVyYXRvci5uZXh0KHZhbHVlKSk7IH0gY2F0Y2ggKGUpIHsgcmVqZWN0KGUpOyB9IH1cbiAgICAgICAgZnVuY3Rpb24gcmVqZWN0ZWQodmFsdWUpIHsgdHJ5IHsgc3RlcChnZW5lcmF0b3JbXCJ0aHJvd1wiXSh2YWx1ZSkpOyB9IGNhdGNoIChlKSB7IHJlamVjdChlKTsgfSB9XG4gICAgICAgIGZ1bmN0aW9uIHN0ZXAocmVzdWx0KSB7IHJlc3VsdC5kb25lID8gcmVzb2x2ZShyZXN1bHQudmFsdWUpIDogYWRvcHQocmVzdWx0LnZhbHVlKS50aGVuKGZ1bGZpbGxlZCwgcmVqZWN0ZWQpOyB9XG4gICAgICAgIHN0ZXAoKGdlbmVyYXRvciA9IGdlbmVyYXRvci5hcHBseSh0aGlzQXJnLCBfYXJndW1lbnRzIHx8IFtdKSkubmV4dCgpKTtcbiAgICB9KTtcbn07XG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJfX2VzTW9kdWxlXCIsIHsgdmFsdWU6IHRydWUgfSk7XG5leHBvcnRzLlVuYXJ5Q2FsbCA9IHZvaWQgMDtcbi8qKlxuICogQSB1bmFyeSBSUEMgY2FsbC4gVW5hcnkgbWVhbnMgdGhlcmUgaXMgZXhhY3RseSBvbmUgaW5wdXQgbWVzc2FnZSBhbmRcbiAqIGV4YWN0bHkgb25lIG91dHB1dCBtZXNzYWdlIHVubGVzcyBhbiBlcnJvciBvY2N1cnJlZC5cbiAqL1xuY2xhc3MgVW5hcnlDYWxsIHtcbiAgICBjb25zdHJ1Y3RvcihtZXRob2QsIHJlcXVlc3RIZWFkZXJzLCByZXF1ZXN0LCBoZWFkZXJzLCByZXNwb25zZSwgc3RhdHVzLCB0cmFpbGVycykge1xuICAgICAgICB0aGlzLm1ldGhvZCA9IG1ldGhvZDtcbiAgICAgICAgdGhpcy5yZXF1ZXN0SGVhZGVycyA9IHJlcXVlc3RIZWFkZXJzO1xuICAgICAgICB0aGlzLnJlcXVlc3QgPSByZXF1ZXN0O1xuICAgICAgICB0aGlzLmhlYWRlcnMgPSBoZWFkZXJzO1xuICAgICAgICB0aGlzLnJlc3BvbnNlID0gcmVzcG9uc2U7XG4gICAgICAgIHRoaXMuc3RhdHVzID0gc3RhdHVzO1xuICAgICAgICB0aGlzLnRyYWlsZXJzID0gdHJhaWxlcnM7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIElmIHlvdSBhcmUgb25seSBpbnRlcmVzdGVkIGluIHRoZSBmaW5hbCBvdXRjb21lIG9mIHRoaXMgY2FsbCxcbiAgICAgKiB5b3UgY2FuIGF3YWl0IGl0IHRvIHJlY2VpdmUgYSBgRmluaXNoZWRVbmFyeUNhbGxgLlxuICAgICAqL1xuICAgIHRoZW4ob25mdWxmaWxsZWQsIG9ucmVqZWN0ZWQpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMucHJvbWlzZUZpbmlzaGVkKCkudGhlbih2YWx1ZSA9PiBvbmZ1bGZpbGxlZCA/IFByb21pc2UucmVzb2x2ZShvbmZ1bGZpbGxlZCh2YWx1ZSkpIDogdmFsdWUsIHJlYXNvbiA9PiBvbnJlamVjdGVkID8gUHJvbWlzZS5yZXNvbHZlKG9ucmVqZWN0ZWQocmVhc29uKSkgOiBQcm9taXNlLnJlamVjdChyZWFzb24pKTtcbiAgICB9XG4gICAgcHJvbWlzZUZpbmlzaGVkKCkge1xuICAgICAgICByZXR1cm4gX19hd2FpdGVyKHRoaXMsIHZvaWQgMCwgdm9pZCAwLCBmdW5jdGlvbiogKCkge1xuICAgICAgICAgICAgbGV0IFtoZWFkZXJzLCByZXNwb25zZSwgc3RhdHVzLCB0cmFpbGVyc10gPSB5aWVsZCBQcm9taXNlLmFsbChbdGhpcy5oZWFkZXJzLCB0aGlzLnJlc3BvbnNlLCB0aGlzLnN0YXR1cywgdGhpcy50cmFpbGVyc10pO1xuICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgICBtZXRob2Q6IHRoaXMubWV0aG9kLFxuICAgICAgICAgICAgICAgIHJlcXVlc3RIZWFkZXJzOiB0aGlzLnJlcXVlc3RIZWFkZXJzLFxuICAgICAgICAgICAgICAgIHJlcXVlc3Q6IHRoaXMucmVxdWVzdCxcbiAgICAgICAgICAgICAgICBoZWFkZXJzLFxuICAgICAgICAgICAgICAgIHJlc3BvbnNlLFxuICAgICAgICAgICAgICAgIHN0YXR1cyxcbiAgICAgICAgICAgICAgICB0cmFpbGVyc1xuICAgICAgICAgICAgfTtcbiAgICAgICAgfSk7XG4gICAgfVxufVxuZXhwb3J0cy5VbmFyeUNhbGwgPSBVbmFyeUNhbGw7XG4iLAogICAgIlwidXNlIHN0cmljdFwiO1xudmFyIF9fYXdhaXRlciA9ICh0aGlzICYmIHRoaXMuX19hd2FpdGVyKSB8fCBmdW5jdGlvbiAodGhpc0FyZywgX2FyZ3VtZW50cywgUCwgZ2VuZXJhdG9yKSB7XG4gICAgZnVuY3Rpb24gYWRvcHQodmFsdWUpIHsgcmV0dXJuIHZhbHVlIGluc3RhbmNlb2YgUCA/IHZhbHVlIDogbmV3IFAoZnVuY3Rpb24gKHJlc29sdmUpIHsgcmVzb2x2ZSh2YWx1ZSk7IH0pOyB9XG4gICAgcmV0dXJuIG5ldyAoUCB8fCAoUCA9IFByb21pc2UpKShmdW5jdGlvbiAocmVzb2x2ZSwgcmVqZWN0KSB7XG4gICAgICAgIGZ1bmN0aW9uIGZ1bGZpbGxlZCh2YWx1ZSkgeyB0cnkgeyBzdGVwKGdlbmVyYXRvci5uZXh0KHZhbHVlKSk7IH0gY2F0Y2ggKGUpIHsgcmVqZWN0KGUpOyB9IH1cbiAgICAgICAgZnVuY3Rpb24gcmVqZWN0ZWQodmFsdWUpIHsgdHJ5IHsgc3RlcChnZW5lcmF0b3JbXCJ0aHJvd1wiXSh2YWx1ZSkpOyB9IGNhdGNoIChlKSB7IHJlamVjdChlKTsgfSB9XG4gICAgICAgIGZ1bmN0aW9uIHN0ZXAocmVzdWx0KSB7IHJlc3VsdC5kb25lID8gcmVzb2x2ZShyZXN1bHQudmFsdWUpIDogYWRvcHQocmVzdWx0LnZhbHVlKS50aGVuKGZ1bGZpbGxlZCwgcmVqZWN0ZWQpOyB9XG4gICAgICAgIHN0ZXAoKGdlbmVyYXRvciA9IGdlbmVyYXRvci5hcHBseSh0aGlzQXJnLCBfYXJndW1lbnRzIHx8IFtdKSkubmV4dCgpKTtcbiAgICB9KTtcbn07XG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJfX2VzTW9kdWxlXCIsIHsgdmFsdWU6IHRydWUgfSk7XG5leHBvcnRzLlNlcnZlclN0cmVhbWluZ0NhbGwgPSB2b2lkIDA7XG4vKipcbiAqIEEgc2VydmVyIHN0cmVhbWluZyBSUEMgY2FsbC4gVGhlIGNsaWVudCBwcm92aWRlcyBleGFjdGx5IG9uZSBpbnB1dCBtZXNzYWdlXG4gKiBidXQgdGhlIHNlcnZlciBtYXkgcmVzcG9uZCB3aXRoIDAsIDEsIG9yIG1vcmUgbWVzc2FnZXMuXG4gKi9cbmNsYXNzIFNlcnZlclN0cmVhbWluZ0NhbGwge1xuICAgIGNvbnN0cnVjdG9yKG1ldGhvZCwgcmVxdWVzdEhlYWRlcnMsIHJlcXVlc3QsIGhlYWRlcnMsIHJlc3BvbnNlLCBzdGF0dXMsIHRyYWlsZXJzKSB7XG4gICAgICAgIHRoaXMubWV0aG9kID0gbWV0aG9kO1xuICAgICAgICB0aGlzLnJlcXVlc3RIZWFkZXJzID0gcmVxdWVzdEhlYWRlcnM7XG4gICAgICAgIHRoaXMucmVxdWVzdCA9IHJlcXVlc3Q7XG4gICAgICAgIHRoaXMuaGVhZGVycyA9IGhlYWRlcnM7XG4gICAgICAgIHRoaXMucmVzcG9uc2VzID0gcmVzcG9uc2U7XG4gICAgICAgIHRoaXMuc3RhdHVzID0gc3RhdHVzO1xuICAgICAgICB0aGlzLnRyYWlsZXJzID0gdHJhaWxlcnM7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIEluc3RlYWQgb2YgYXdhaXRpbmcgdGhlIHJlc3BvbnNlIHN0YXR1cyBhbmQgdHJhaWxlcnMsIHlvdSBjYW5cbiAgICAgKiBqdXN0IGFzIHdlbGwgYXdhaXQgdGhpcyBjYWxsIGl0c2VsZiB0byByZWNlaXZlIHRoZSBzZXJ2ZXIgb3V0Y29tZS5cbiAgICAgKiBZb3Ugc2hvdWxkIGZpcnN0IHNldHVwIHNvbWUgbGlzdGVuZXJzIHRvIHRoZSBgcmVxdWVzdGAgdG9cbiAgICAgKiBzZWUgdGhlIGFjdHVhbCBtZXNzYWdlcyB0aGUgc2VydmVyIHJlcGxpZWQgd2l0aC5cbiAgICAgKi9cbiAgICB0aGVuKG9uZnVsZmlsbGVkLCBvbnJlamVjdGVkKSB7XG4gICAgICAgIHJldHVybiB0aGlzLnByb21pc2VGaW5pc2hlZCgpLnRoZW4odmFsdWUgPT4gb25mdWxmaWxsZWQgPyBQcm9taXNlLnJlc29sdmUob25mdWxmaWxsZWQodmFsdWUpKSA6IHZhbHVlLCByZWFzb24gPT4gb25yZWplY3RlZCA/IFByb21pc2UucmVzb2x2ZShvbnJlamVjdGVkKHJlYXNvbikpIDogUHJvbWlzZS5yZWplY3QocmVhc29uKSk7XG4gICAgfVxuICAgIHByb21pc2VGaW5pc2hlZCgpIHtcbiAgICAgICAgcmV0dXJuIF9fYXdhaXRlcih0aGlzLCB2b2lkIDAsIHZvaWQgMCwgZnVuY3Rpb24qICgpIHtcbiAgICAgICAgICAgIGxldCBbaGVhZGVycywgc3RhdHVzLCB0cmFpbGVyc10gPSB5aWVsZCBQcm9taXNlLmFsbChbdGhpcy5oZWFkZXJzLCB0aGlzLnN0YXR1cywgdGhpcy50cmFpbGVyc10pO1xuICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgICBtZXRob2Q6IHRoaXMubWV0aG9kLFxuICAgICAgICAgICAgICAgIHJlcXVlc3RIZWFkZXJzOiB0aGlzLnJlcXVlc3RIZWFkZXJzLFxuICAgICAgICAgICAgICAgIHJlcXVlc3Q6IHRoaXMucmVxdWVzdCxcbiAgICAgICAgICAgICAgICBoZWFkZXJzLFxuICAgICAgICAgICAgICAgIHN0YXR1cyxcbiAgICAgICAgICAgICAgICB0cmFpbGVycyxcbiAgICAgICAgICAgIH07XG4gICAgICAgIH0pO1xuICAgIH1cbn1cbmV4cG9ydHMuU2VydmVyU3RyZWFtaW5nQ2FsbCA9IFNlcnZlclN0cmVhbWluZ0NhbGw7XG4iLAogICAgIlwidXNlIHN0cmljdFwiO1xudmFyIF9fYXdhaXRlciA9ICh0aGlzICYmIHRoaXMuX19hd2FpdGVyKSB8fCBmdW5jdGlvbiAodGhpc0FyZywgX2FyZ3VtZW50cywgUCwgZ2VuZXJhdG9yKSB7XG4gICAgZnVuY3Rpb24gYWRvcHQodmFsdWUpIHsgcmV0dXJuIHZhbHVlIGluc3RhbmNlb2YgUCA/IHZhbHVlIDogbmV3IFAoZnVuY3Rpb24gKHJlc29sdmUpIHsgcmVzb2x2ZSh2YWx1ZSk7IH0pOyB9XG4gICAgcmV0dXJuIG5ldyAoUCB8fCAoUCA9IFByb21pc2UpKShmdW5jdGlvbiAocmVzb2x2ZSwgcmVqZWN0KSB7XG4gICAgICAgIGZ1bmN0aW9uIGZ1bGZpbGxlZCh2YWx1ZSkgeyB0cnkgeyBzdGVwKGdlbmVyYXRvci5uZXh0KHZhbHVlKSk7IH0gY2F0Y2ggKGUpIHsgcmVqZWN0KGUpOyB9IH1cbiAgICAgICAgZnVuY3Rpb24gcmVqZWN0ZWQodmFsdWUpIHsgdHJ5IHsgc3RlcChnZW5lcmF0b3JbXCJ0aHJvd1wiXSh2YWx1ZSkpOyB9IGNhdGNoIChlKSB7IHJlamVjdChlKTsgfSB9XG4gICAgICAgIGZ1bmN0aW9uIHN0ZXAocmVzdWx0KSB7IHJlc3VsdC5kb25lID8gcmVzb2x2ZShyZXN1bHQudmFsdWUpIDogYWRvcHQocmVzdWx0LnZhbHVlKS50aGVuKGZ1bGZpbGxlZCwgcmVqZWN0ZWQpOyB9XG4gICAgICAgIHN0ZXAoKGdlbmVyYXRvciA9IGdlbmVyYXRvci5hcHBseSh0aGlzQXJnLCBfYXJndW1lbnRzIHx8IFtdKSkubmV4dCgpKTtcbiAgICB9KTtcbn07XG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJfX2VzTW9kdWxlXCIsIHsgdmFsdWU6IHRydWUgfSk7XG5leHBvcnRzLkNsaWVudFN0cmVhbWluZ0NhbGwgPSB2b2lkIDA7XG4vKipcbiAqIEEgY2xpZW50IHN0cmVhbWluZyBSUEMgY2FsbC4gVGhpcyBtZWFucyB0aGF0IHRoZSBjbGllbnRzIHNlbmRzIDAsIDEsIG9yXG4gKiBtb3JlIG1lc3NhZ2VzIHRvIHRoZSBzZXJ2ZXIsIGFuZCB0aGUgc2VydmVyIHJlcGxpZXMgd2l0aCBleGFjdGx5IG9uZVxuICogbWVzc2FnZS5cbiAqL1xuY2xhc3MgQ2xpZW50U3RyZWFtaW5nQ2FsbCB7XG4gICAgY29uc3RydWN0b3IobWV0aG9kLCByZXF1ZXN0SGVhZGVycywgcmVxdWVzdCwgaGVhZGVycywgcmVzcG9uc2UsIHN0YXR1cywgdHJhaWxlcnMpIHtcbiAgICAgICAgdGhpcy5tZXRob2QgPSBtZXRob2Q7XG4gICAgICAgIHRoaXMucmVxdWVzdEhlYWRlcnMgPSByZXF1ZXN0SGVhZGVycztcbiAgICAgICAgdGhpcy5yZXF1ZXN0cyA9IHJlcXVlc3Q7XG4gICAgICAgIHRoaXMuaGVhZGVycyA9IGhlYWRlcnM7XG4gICAgICAgIHRoaXMucmVzcG9uc2UgPSByZXNwb25zZTtcbiAgICAgICAgdGhpcy5zdGF0dXMgPSBzdGF0dXM7XG4gICAgICAgIHRoaXMudHJhaWxlcnMgPSB0cmFpbGVycztcbiAgICB9XG4gICAgLyoqXG4gICAgICogSW5zdGVhZCBvZiBhd2FpdGluZyB0aGUgcmVzcG9uc2Ugc3RhdHVzIGFuZCB0cmFpbGVycywgeW91IGNhblxuICAgICAqIGp1c3QgYXMgd2VsbCBhd2FpdCB0aGlzIGNhbGwgaXRzZWxmIHRvIHJlY2VpdmUgdGhlIHNlcnZlciBvdXRjb21lLlxuICAgICAqIE5vdGUgdGhhdCBpdCBtYXkgc3RpbGwgYmUgdmFsaWQgdG8gc2VuZCBtb3JlIHJlcXVlc3QgbWVzc2FnZXMuXG4gICAgICovXG4gICAgdGhlbihvbmZ1bGZpbGxlZCwgb25yZWplY3RlZCkge1xuICAgICAgICByZXR1cm4gdGhpcy5wcm9taXNlRmluaXNoZWQoKS50aGVuKHZhbHVlID0+IG9uZnVsZmlsbGVkID8gUHJvbWlzZS5yZXNvbHZlKG9uZnVsZmlsbGVkKHZhbHVlKSkgOiB2YWx1ZSwgcmVhc29uID0+IG9ucmVqZWN0ZWQgPyBQcm9taXNlLnJlc29sdmUob25yZWplY3RlZChyZWFzb24pKSA6IFByb21pc2UucmVqZWN0KHJlYXNvbikpO1xuICAgIH1cbiAgICBwcm9taXNlRmluaXNoZWQoKSB7XG4gICAgICAgIHJldHVybiBfX2F3YWl0ZXIodGhpcywgdm9pZCAwLCB2b2lkIDAsIGZ1bmN0aW9uKiAoKSB7XG4gICAgICAgICAgICBsZXQgW2hlYWRlcnMsIHJlc3BvbnNlLCBzdGF0dXMsIHRyYWlsZXJzXSA9IHlpZWxkIFByb21pc2UuYWxsKFt0aGlzLmhlYWRlcnMsIHRoaXMucmVzcG9uc2UsIHRoaXMuc3RhdHVzLCB0aGlzLnRyYWlsZXJzXSk7XG4gICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICAgIG1ldGhvZDogdGhpcy5tZXRob2QsXG4gICAgICAgICAgICAgICAgcmVxdWVzdEhlYWRlcnM6IHRoaXMucmVxdWVzdEhlYWRlcnMsXG4gICAgICAgICAgICAgICAgaGVhZGVycyxcbiAgICAgICAgICAgICAgICByZXNwb25zZSxcbiAgICAgICAgICAgICAgICBzdGF0dXMsXG4gICAgICAgICAgICAgICAgdHJhaWxlcnNcbiAgICAgICAgICAgIH07XG4gICAgICAgIH0pO1xuICAgIH1cbn1cbmV4cG9ydHMuQ2xpZW50U3RyZWFtaW5nQ2FsbCA9IENsaWVudFN0cmVhbWluZ0NhbGw7XG4iLAogICAgIlwidXNlIHN0cmljdFwiO1xudmFyIF9fYXdhaXRlciA9ICh0aGlzICYmIHRoaXMuX19hd2FpdGVyKSB8fCBmdW5jdGlvbiAodGhpc0FyZywgX2FyZ3VtZW50cywgUCwgZ2VuZXJhdG9yKSB7XG4gICAgZnVuY3Rpb24gYWRvcHQodmFsdWUpIHsgcmV0dXJuIHZhbHVlIGluc3RhbmNlb2YgUCA/IHZhbHVlIDogbmV3IFAoZnVuY3Rpb24gKHJlc29sdmUpIHsgcmVzb2x2ZSh2YWx1ZSk7IH0pOyB9XG4gICAgcmV0dXJuIG5ldyAoUCB8fCAoUCA9IFByb21pc2UpKShmdW5jdGlvbiAocmVzb2x2ZSwgcmVqZWN0KSB7XG4gICAgICAgIGZ1bmN0aW9uIGZ1bGZpbGxlZCh2YWx1ZSkgeyB0cnkgeyBzdGVwKGdlbmVyYXRvci5uZXh0KHZhbHVlKSk7IH0gY2F0Y2ggKGUpIHsgcmVqZWN0KGUpOyB9IH1cbiAgICAgICAgZnVuY3Rpb24gcmVqZWN0ZWQodmFsdWUpIHsgdHJ5IHsgc3RlcChnZW5lcmF0b3JbXCJ0aHJvd1wiXSh2YWx1ZSkpOyB9IGNhdGNoIChlKSB7IHJlamVjdChlKTsgfSB9XG4gICAgICAgIGZ1bmN0aW9uIHN0ZXAocmVzdWx0KSB7IHJlc3VsdC5kb25lID8gcmVzb2x2ZShyZXN1bHQudmFsdWUpIDogYWRvcHQocmVzdWx0LnZhbHVlKS50aGVuKGZ1bGZpbGxlZCwgcmVqZWN0ZWQpOyB9XG4gICAgICAgIHN0ZXAoKGdlbmVyYXRvciA9IGdlbmVyYXRvci5hcHBseSh0aGlzQXJnLCBfYXJndW1lbnRzIHx8IFtdKSkubmV4dCgpKTtcbiAgICB9KTtcbn07XG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJfX2VzTW9kdWxlXCIsIHsgdmFsdWU6IHRydWUgfSk7XG5leHBvcnRzLkR1cGxleFN0cmVhbWluZ0NhbGwgPSB2b2lkIDA7XG4vKipcbiAqIEEgZHVwbGV4IHN0cmVhbWluZyBSUEMgY2FsbC4gVGhpcyBtZWFucyB0aGF0IHRoZSBjbGllbnRzIHNlbmRzIGFuXG4gKiBhcmJpdHJhcnkgYW1vdW50IG9mIG1lc3NhZ2VzIHRvIHRoZSBzZXJ2ZXIsIHdoaWxlIGF0IHRoZSBzYW1lIHRpbWUsXG4gKiB0aGUgc2VydmVyIHNlbmRzIGFuIGFyYml0cmFyeSBhbW91bnQgb2YgbWVzc2FnZXMgdG8gdGhlIGNsaWVudC5cbiAqL1xuY2xhc3MgRHVwbGV4U3RyZWFtaW5nQ2FsbCB7XG4gICAgY29uc3RydWN0b3IobWV0aG9kLCByZXF1ZXN0SGVhZGVycywgcmVxdWVzdCwgaGVhZGVycywgcmVzcG9uc2UsIHN0YXR1cywgdHJhaWxlcnMpIHtcbiAgICAgICAgdGhpcy5tZXRob2QgPSBtZXRob2Q7XG4gICAgICAgIHRoaXMucmVxdWVzdEhlYWRlcnMgPSByZXF1ZXN0SGVhZGVycztcbiAgICAgICAgdGhpcy5yZXF1ZXN0cyA9IHJlcXVlc3Q7XG4gICAgICAgIHRoaXMuaGVhZGVycyA9IGhlYWRlcnM7XG4gICAgICAgIHRoaXMucmVzcG9uc2VzID0gcmVzcG9uc2U7XG4gICAgICAgIHRoaXMuc3RhdHVzID0gc3RhdHVzO1xuICAgICAgICB0aGlzLnRyYWlsZXJzID0gdHJhaWxlcnM7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIEluc3RlYWQgb2YgYXdhaXRpbmcgdGhlIHJlc3BvbnNlIHN0YXR1cyBhbmQgdHJhaWxlcnMsIHlvdSBjYW5cbiAgICAgKiBqdXN0IGFzIHdlbGwgYXdhaXQgdGhpcyBjYWxsIGl0c2VsZiB0byByZWNlaXZlIHRoZSBzZXJ2ZXIgb3V0Y29tZS5cbiAgICAgKiBOb3RlIHRoYXQgaXQgbWF5IHN0aWxsIGJlIHZhbGlkIHRvIHNlbmQgbW9yZSByZXF1ZXN0IG1lc3NhZ2VzLlxuICAgICAqL1xuICAgIHRoZW4ob25mdWxmaWxsZWQsIG9ucmVqZWN0ZWQpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMucHJvbWlzZUZpbmlzaGVkKCkudGhlbih2YWx1ZSA9PiBvbmZ1bGZpbGxlZCA/IFByb21pc2UucmVzb2x2ZShvbmZ1bGZpbGxlZCh2YWx1ZSkpIDogdmFsdWUsIHJlYXNvbiA9PiBvbnJlamVjdGVkID8gUHJvbWlzZS5yZXNvbHZlKG9ucmVqZWN0ZWQocmVhc29uKSkgOiBQcm9taXNlLnJlamVjdChyZWFzb24pKTtcbiAgICB9XG4gICAgcHJvbWlzZUZpbmlzaGVkKCkge1xuICAgICAgICByZXR1cm4gX19hd2FpdGVyKHRoaXMsIHZvaWQgMCwgdm9pZCAwLCBmdW5jdGlvbiogKCkge1xuICAgICAgICAgICAgbGV0IFtoZWFkZXJzLCBzdGF0dXMsIHRyYWlsZXJzXSA9IHlpZWxkIFByb21pc2UuYWxsKFt0aGlzLmhlYWRlcnMsIHRoaXMuc3RhdHVzLCB0aGlzLnRyYWlsZXJzXSk7XG4gICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICAgIG1ldGhvZDogdGhpcy5tZXRob2QsXG4gICAgICAgICAgICAgICAgcmVxdWVzdEhlYWRlcnM6IHRoaXMucmVxdWVzdEhlYWRlcnMsXG4gICAgICAgICAgICAgICAgaGVhZGVycyxcbiAgICAgICAgICAgICAgICBzdGF0dXMsXG4gICAgICAgICAgICAgICAgdHJhaWxlcnMsXG4gICAgICAgICAgICB9O1xuICAgICAgICB9KTtcbiAgICB9XG59XG5leHBvcnRzLkR1cGxleFN0cmVhbWluZ0NhbGwgPSBEdXBsZXhTdHJlYW1pbmdDYWxsO1xuIiwKICAgICJcInVzZSBzdHJpY3RcIjtcbnZhciBfX2F3YWl0ZXIgPSAodGhpcyAmJiB0aGlzLl9fYXdhaXRlcikgfHwgZnVuY3Rpb24gKHRoaXNBcmcsIF9hcmd1bWVudHMsIFAsIGdlbmVyYXRvcikge1xuICAgIGZ1bmN0aW9uIGFkb3B0KHZhbHVlKSB7IHJldHVybiB2YWx1ZSBpbnN0YW5jZW9mIFAgPyB2YWx1ZSA6IG5ldyBQKGZ1bmN0aW9uIChyZXNvbHZlKSB7IHJlc29sdmUodmFsdWUpOyB9KTsgfVxuICAgIHJldHVybiBuZXcgKFAgfHwgKFAgPSBQcm9taXNlKSkoZnVuY3Rpb24gKHJlc29sdmUsIHJlamVjdCkge1xuICAgICAgICBmdW5jdGlvbiBmdWxmaWxsZWQodmFsdWUpIHsgdHJ5IHsgc3RlcChnZW5lcmF0b3IubmV4dCh2YWx1ZSkpOyB9IGNhdGNoIChlKSB7IHJlamVjdChlKTsgfSB9XG4gICAgICAgIGZ1bmN0aW9uIHJlamVjdGVkKHZhbHVlKSB7IHRyeSB7IHN0ZXAoZ2VuZXJhdG9yW1widGhyb3dcIl0odmFsdWUpKTsgfSBjYXRjaCAoZSkgeyByZWplY3QoZSk7IH0gfVxuICAgICAgICBmdW5jdGlvbiBzdGVwKHJlc3VsdCkgeyByZXN1bHQuZG9uZSA/IHJlc29sdmUocmVzdWx0LnZhbHVlKSA6IGFkb3B0KHJlc3VsdC52YWx1ZSkudGhlbihmdWxmaWxsZWQsIHJlamVjdGVkKTsgfVxuICAgICAgICBzdGVwKChnZW5lcmF0b3IgPSBnZW5lcmF0b3IuYXBwbHkodGhpc0FyZywgX2FyZ3VtZW50cyB8fCBbXSkpLm5leHQoKSk7XG4gICAgfSk7XG59O1xuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiX19lc01vZHVsZVwiLCB7IHZhbHVlOiB0cnVlIH0pO1xuZXhwb3J0cy5UZXN0VHJhbnNwb3J0ID0gdm9pZCAwO1xuY29uc3QgcnBjX2Vycm9yXzEgPSByZXF1aXJlKFwiLi9ycGMtZXJyb3JcIik7XG5jb25zdCBydW50aW1lXzEgPSByZXF1aXJlKFwiQHByb3RvYnVmLXRzL3J1bnRpbWVcIik7XG5jb25zdCBycGNfb3V0cHV0X3N0cmVhbV8xID0gcmVxdWlyZShcIi4vcnBjLW91dHB1dC1zdHJlYW1cIik7XG5jb25zdCBycGNfb3B0aW9uc18xID0gcmVxdWlyZShcIi4vcnBjLW9wdGlvbnNcIik7XG5jb25zdCB1bmFyeV9jYWxsXzEgPSByZXF1aXJlKFwiLi91bmFyeS1jYWxsXCIpO1xuY29uc3Qgc2VydmVyX3N0cmVhbWluZ19jYWxsXzEgPSByZXF1aXJlKFwiLi9zZXJ2ZXItc3RyZWFtaW5nLWNhbGxcIik7XG5jb25zdCBjbGllbnRfc3RyZWFtaW5nX2NhbGxfMSA9IHJlcXVpcmUoXCIuL2NsaWVudC1zdHJlYW1pbmctY2FsbFwiKTtcbmNvbnN0IGR1cGxleF9zdHJlYW1pbmdfY2FsbF8xID0gcmVxdWlyZShcIi4vZHVwbGV4LXN0cmVhbWluZy1jYWxsXCIpO1xuLyoqXG4gKiBUcmFuc3BvcnQgZm9yIHRlc3RpbmcuXG4gKi9cbmNsYXNzIFRlc3RUcmFuc3BvcnQge1xuICAgIC8qKlxuICAgICAqIEluaXRpYWxpemUgd2l0aCBtb2NrIGRhdGEuIE9taXR0ZWQgZmllbGRzIGhhdmUgZGVmYXVsdCB2YWx1ZS5cbiAgICAgKi9cbiAgICBjb25zdHJ1Y3RvcihkYXRhKSB7XG4gICAgICAgIC8qKlxuICAgICAgICAgKiBTdXBwcmVzcyB3YXJuaW5nIC8gZXJyb3IgYWJvdXQgdW5jYXVnaHQgcmVqZWN0aW9ucyBvZlxuICAgICAgICAgKiBcInN0YXR1c1wiIGFuZCBcInRyYWlsZXJzXCIuXG4gICAgICAgICAqL1xuICAgICAgICB0aGlzLnN1cHByZXNzVW5jYXVnaHRSZWplY3Rpb25zID0gdHJ1ZTtcbiAgICAgICAgdGhpcy5oZWFkZXJEZWxheSA9IDEwO1xuICAgICAgICB0aGlzLnJlc3BvbnNlRGVsYXkgPSA1MDtcbiAgICAgICAgdGhpcy5iZXR3ZWVuUmVzcG9uc2VEZWxheSA9IDEwO1xuICAgICAgICB0aGlzLmFmdGVyUmVzcG9uc2VEZWxheSA9IDEwO1xuICAgICAgICB0aGlzLmRhdGEgPSBkYXRhICE9PSBudWxsICYmIGRhdGEgIT09IHZvaWQgMCA/IGRhdGEgOiB7fTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogU2VudCBtZXNzYWdlKHMpIGR1cmluZyB0aGUgbGFzdCBvcGVyYXRpb24uXG4gICAgICovXG4gICAgZ2V0IHNlbnRNZXNzYWdlcygpIHtcbiAgICAgICAgaWYgKHRoaXMubGFzdElucHV0IGluc3RhbmNlb2YgVGVzdElucHV0U3RyZWFtKSB7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy5sYXN0SW5wdXQuc2VudDtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIGlmICh0eXBlb2YgdGhpcy5sYXN0SW5wdXQgPT0gXCJvYmplY3RcIikge1xuICAgICAgICAgICAgcmV0dXJuIFt0aGlzLmxhc3RJbnB1dC5zaW5nbGVdO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBbXTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogU2VuZGluZyBtZXNzYWdlKHMpIGNvbXBsZXRlZD9cbiAgICAgKi9cbiAgICBnZXQgc2VuZENvbXBsZXRlKCkge1xuICAgICAgICBpZiAodGhpcy5sYXN0SW5wdXQgaW5zdGFuY2VvZiBUZXN0SW5wdXRTdHJlYW0pIHtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLmxhc3RJbnB1dC5jb21wbGV0ZWQ7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSBpZiAodHlwZW9mIHRoaXMubGFzdElucHV0ID09IFwib2JqZWN0XCIpIHtcbiAgICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gICAgLy8gQ3JlYXRlcyBhIHByb21pc2UgZm9yIHJlc3BvbnNlIGhlYWRlcnMgZnJvbSB0aGUgbW9jayBkYXRhLlxuICAgIHByb21pc2VIZWFkZXJzKCkge1xuICAgICAgICB2YXIgX2E7XG4gICAgICAgIGNvbnN0IGhlYWRlcnMgPSAoX2EgPSB0aGlzLmRhdGEuaGVhZGVycykgIT09IG51bGwgJiYgX2EgIT09IHZvaWQgMCA/IF9hIDogVGVzdFRyYW5zcG9ydC5kZWZhdWx0SGVhZGVycztcbiAgICAgICAgcmV0dXJuIGhlYWRlcnMgaW5zdGFuY2VvZiBycGNfZXJyb3JfMS5ScGNFcnJvclxuICAgICAgICAgICAgPyBQcm9taXNlLnJlamVjdChoZWFkZXJzKVxuICAgICAgICAgICAgOiBQcm9taXNlLnJlc29sdmUoaGVhZGVycyk7XG4gICAgfVxuICAgIC8vIENyZWF0ZXMgYSBwcm9taXNlIGZvciBhIHNpbmdsZSwgdmFsaWQsIG1lc3NhZ2UgZnJvbSB0aGUgbW9jayBkYXRhLlxuICAgIHByb21pc2VTaW5nbGVSZXNwb25zZShtZXRob2QpIHtcbiAgICAgICAgaWYgKHRoaXMuZGF0YS5yZXNwb25zZSBpbnN0YW5jZW9mIHJwY19lcnJvcl8xLlJwY0Vycm9yKSB7XG4gICAgICAgICAgICByZXR1cm4gUHJvbWlzZS5yZWplY3QodGhpcy5kYXRhLnJlc3BvbnNlKTtcbiAgICAgICAgfVxuICAgICAgICBsZXQgcjtcbiAgICAgICAgaWYgKEFycmF5LmlzQXJyYXkodGhpcy5kYXRhLnJlc3BvbnNlKSkge1xuICAgICAgICAgICAgcnVudGltZV8xLmFzc2VydCh0aGlzLmRhdGEucmVzcG9uc2UubGVuZ3RoID4gMCk7XG4gICAgICAgICAgICByID0gdGhpcy5kYXRhLnJlc3BvbnNlWzBdO1xuICAgICAgICB9XG4gICAgICAgIGVsc2UgaWYgKHRoaXMuZGF0YS5yZXNwb25zZSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICByID0gdGhpcy5kYXRhLnJlc3BvbnNlO1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgciA9IG1ldGhvZC5PLmNyZWF0ZSgpO1xuICAgICAgICB9XG4gICAgICAgIHJ1bnRpbWVfMS5hc3NlcnQobWV0aG9kLk8uaXMocikpO1xuICAgICAgICByZXR1cm4gUHJvbWlzZS5yZXNvbHZlKHIpO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBQdXNoZXMgcmVzcG9uc2UgbWVzc2FnZXMgZnJvbSB0aGUgbW9jayBkYXRhIHRvIHRoZSBvdXRwdXQgc3RyZWFtLlxuICAgICAqIElmIGFuIGVycm9yIHJlc3BvbnNlLCBzdGF0dXMgb3IgdHJhaWxlcnMgYXJlIG1vY2tlZCwgdGhlIHN0cmVhbSBpc1xuICAgICAqIGNsb3NlZCB3aXRoIHRoZSByZXNwZWN0aXZlIGVycm9yLlxuICAgICAqIE90aGVyd2lzZSwgc3RyZWFtIGlzIGNvbXBsZXRlZCBzdWNjZXNzZnVsbHkuXG4gICAgICpcbiAgICAgKiBUaGUgcmV0dXJuZWQgcHJvbWlzZSByZXNvbHZlcyB3aGVuIHRoZSBzdHJlYW0gaXMgY2xvc2VkLiBJdCBzaG91bGRcbiAgICAgKiBub3QgcmVqZWN0LiBJZiBpdCBkb2VzLCBjb2RlIGlzIGJyb2tlbi5cbiAgICAgKi9cbiAgICBzdHJlYW1SZXNwb25zZXMobWV0aG9kLCBzdHJlYW0sIGFib3J0KSB7XG4gICAgICAgIHJldHVybiBfX2F3YWl0ZXIodGhpcywgdm9pZCAwLCB2b2lkIDAsIGZ1bmN0aW9uKiAoKSB7XG4gICAgICAgICAgICAvLyBub3JtYWxpemUgXCJkYXRhLnJlc3BvbnNlXCIgaW50byBhbiBhcnJheSBvZiB2YWxpZCBvdXRwdXQgbWVzc2FnZXNcbiAgICAgICAgICAgIGNvbnN0IG1lc3NhZ2VzID0gW107XG4gICAgICAgICAgICBpZiAodGhpcy5kYXRhLnJlc3BvbnNlID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgICAgICBtZXNzYWdlcy5wdXNoKG1ldGhvZC5PLmNyZWF0ZSgpKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2UgaWYgKEFycmF5LmlzQXJyYXkodGhpcy5kYXRhLnJlc3BvbnNlKSkge1xuICAgICAgICAgICAgICAgIGZvciAobGV0IG1zZyBvZiB0aGlzLmRhdGEucmVzcG9uc2UpIHtcbiAgICAgICAgICAgICAgICAgICAgcnVudGltZV8xLmFzc2VydChtZXRob2QuTy5pcyhtc2cpKTtcbiAgICAgICAgICAgICAgICAgICAgbWVzc2FnZXMucHVzaChtc2cpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2UgaWYgKCEodGhpcy5kYXRhLnJlc3BvbnNlIGluc3RhbmNlb2YgcnBjX2Vycm9yXzEuUnBjRXJyb3IpKSB7XG4gICAgICAgICAgICAgICAgcnVudGltZV8xLmFzc2VydChtZXRob2QuTy5pcyh0aGlzLmRhdGEucmVzcG9uc2UpKTtcbiAgICAgICAgICAgICAgICBtZXNzYWdlcy5wdXNoKHRoaXMuZGF0YS5yZXNwb25zZSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICAvLyBzdGFydCB0aGUgc3RyZWFtIHdpdGggYW4gaW5pdGlhbCBkZWxheS5cbiAgICAgICAgICAgIC8vIGlmIHRoZSByZXF1ZXN0IGlzIGNhbmNlbGxlZCwgbm90aWZ5KCkgZXJyb3IgYW5kIGV4aXQuXG4gICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgIHlpZWxkIGRlbGF5KHRoaXMucmVzcG9uc2VEZWxheSwgYWJvcnQpKHVuZGVmaW5lZCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgICAgICAgICBzdHJlYW0ubm90aWZ5RXJyb3IoZXJyb3IpO1xuICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIC8vIGlmIGVycm9yIHJlc3BvbnNlIHdhcyBtb2NrZWQsIG5vdGlmeSgpIGVycm9yIChzdHJlYW0gaXMgbm93IGNsb3NlZCB3aXRoIGVycm9yKSBhbmQgZXhpdC5cbiAgICAgICAgICAgIGlmICh0aGlzLmRhdGEucmVzcG9uc2UgaW5zdGFuY2VvZiBycGNfZXJyb3JfMS5ScGNFcnJvcikge1xuICAgICAgICAgICAgICAgIHN0cmVhbS5ub3RpZnlFcnJvcih0aGlzLmRhdGEucmVzcG9uc2UpO1xuICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIC8vIHJlZ3VsYXIgcmVzcG9uc2UgbWVzc2FnZXMgd2VyZSBtb2NrZWQuIG5vdGlmeSgpIHRoZW0uXG4gICAgICAgICAgICBmb3IgKGxldCBtc2cgb2YgbWVzc2FnZXMpIHtcbiAgICAgICAgICAgICAgICBzdHJlYW0ubm90aWZ5TWVzc2FnZShtc2cpO1xuICAgICAgICAgICAgICAgIC8vIGFkZCBhIHNob3J0IGRlbGF5IGJldHdlZW4gcmVzcG9uc2VzXG4gICAgICAgICAgICAgICAgLy8gaWYgdGhlIHJlcXVlc3QgaXMgY2FuY2VsbGVkLCBub3RpZnkoKSBlcnJvciBhbmQgZXhpdC5cbiAgICAgICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgICAgICB5aWVsZCBkZWxheSh0aGlzLmJldHdlZW5SZXNwb25zZURlbGF5LCBhYm9ydCkodW5kZWZpbmVkKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgICAgICAgICAgICAgIHN0cmVhbS5ub3RpZnlFcnJvcihlcnJvcik7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICAvLyBlcnJvciBzdGF0dXMgd2FzIG1vY2tlZCwgbm90aWZ5KCkgZXJyb3IgKHN0cmVhbSBpcyBub3cgY2xvc2VkIHdpdGggZXJyb3IpIGFuZCBleGl0LlxuICAgICAgICAgICAgaWYgKHRoaXMuZGF0YS5zdGF0dXMgaW5zdGFuY2VvZiBycGNfZXJyb3JfMS5ScGNFcnJvcikge1xuICAgICAgICAgICAgICAgIHN0cmVhbS5ub3RpZnlFcnJvcih0aGlzLmRhdGEuc3RhdHVzKTtcbiAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICAvLyBlcnJvciB0cmFpbGVycyB3ZXJlIG1vY2tlZCwgbm90aWZ5KCkgZXJyb3IgKHN0cmVhbSBpcyBub3cgY2xvc2VkIHdpdGggZXJyb3IpIGFuZCBleGl0LlxuICAgICAgICAgICAgaWYgKHRoaXMuZGF0YS50cmFpbGVycyBpbnN0YW5jZW9mIHJwY19lcnJvcl8xLlJwY0Vycm9yKSB7XG4gICAgICAgICAgICAgICAgc3RyZWFtLm5vdGlmeUVycm9yKHRoaXMuZGF0YS50cmFpbGVycyk7XG4gICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgLy8gc3RyZWFtIGNvbXBsZXRlZCBzdWNjZXNzZnVsbHlcbiAgICAgICAgICAgIHN0cmVhbS5ub3RpZnlDb21wbGV0ZSgpO1xuICAgICAgICB9KTtcbiAgICB9XG4gICAgLy8gQ3JlYXRlcyBhIHByb21pc2UgZm9yIHJlc3BvbnNlIHN0YXR1cyBmcm9tIHRoZSBtb2NrIGRhdGEuXG4gICAgcHJvbWlzZVN0YXR1cygpIHtcbiAgICAgICAgdmFyIF9hO1xuICAgICAgICBjb25zdCBzdGF0dXMgPSAoX2EgPSB0aGlzLmRhdGEuc3RhdHVzKSAhPT0gbnVsbCAmJiBfYSAhPT0gdm9pZCAwID8gX2EgOiBUZXN0VHJhbnNwb3J0LmRlZmF1bHRTdGF0dXM7XG4gICAgICAgIHJldHVybiBzdGF0dXMgaW5zdGFuY2VvZiBycGNfZXJyb3JfMS5ScGNFcnJvclxuICAgICAgICAgICAgPyBQcm9taXNlLnJlamVjdChzdGF0dXMpXG4gICAgICAgICAgICA6IFByb21pc2UucmVzb2x2ZShzdGF0dXMpO1xuICAgIH1cbiAgICAvLyBDcmVhdGVzIGEgcHJvbWlzZSBmb3IgcmVzcG9uc2UgdHJhaWxlcnMgZnJvbSB0aGUgbW9jayBkYXRhLlxuICAgIHByb21pc2VUcmFpbGVycygpIHtcbiAgICAgICAgdmFyIF9hO1xuICAgICAgICBjb25zdCB0cmFpbGVycyA9IChfYSA9IHRoaXMuZGF0YS50cmFpbGVycykgIT09IG51bGwgJiYgX2EgIT09IHZvaWQgMCA/IF9hIDogVGVzdFRyYW5zcG9ydC5kZWZhdWx0VHJhaWxlcnM7XG4gICAgICAgIHJldHVybiB0cmFpbGVycyBpbnN0YW5jZW9mIHJwY19lcnJvcl8xLlJwY0Vycm9yXG4gICAgICAgICAgICA/IFByb21pc2UucmVqZWN0KHRyYWlsZXJzKVxuICAgICAgICAgICAgOiBQcm9taXNlLnJlc29sdmUodHJhaWxlcnMpO1xuICAgIH1cbiAgICBtYXliZVN1cHByZXNzVW5jYXVnaHQoLi4ucHJvbWlzZSkge1xuICAgICAgICBpZiAodGhpcy5zdXBwcmVzc1VuY2F1Z2h0UmVqZWN0aW9ucykge1xuICAgICAgICAgICAgZm9yIChsZXQgcCBvZiBwcm9taXNlKSB7XG4gICAgICAgICAgICAgICAgcC5jYXRjaCgoKSA9PiB7XG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG4gICAgbWVyZ2VPcHRpb25zKG9wdGlvbnMpIHtcbiAgICAgICAgcmV0dXJuIHJwY19vcHRpb25zXzEubWVyZ2VScGNPcHRpb25zKHt9LCBvcHRpb25zKTtcbiAgICB9XG4gICAgdW5hcnkobWV0aG9kLCBpbnB1dCwgb3B0aW9ucykge1xuICAgICAgICB2YXIgX2E7XG4gICAgICAgIGNvbnN0IHJlcXVlc3RIZWFkZXJzID0gKF9hID0gb3B0aW9ucy5tZXRhKSAhPT0gbnVsbCAmJiBfYSAhPT0gdm9pZCAwID8gX2EgOiB7fSwgaGVhZGVyc1Byb21pc2UgPSB0aGlzLnByb21pc2VIZWFkZXJzKClcbiAgICAgICAgICAgIC50aGVuKGRlbGF5KHRoaXMuaGVhZGVyRGVsYXksIG9wdGlvbnMuYWJvcnQpKSwgcmVzcG9uc2VQcm9taXNlID0gaGVhZGVyc1Byb21pc2VcbiAgICAgICAgICAgIC5jYXRjaChfID0+IHtcbiAgICAgICAgfSlcbiAgICAgICAgICAgIC50aGVuKGRlbGF5KHRoaXMucmVzcG9uc2VEZWxheSwgb3B0aW9ucy5hYm9ydCkpXG4gICAgICAgICAgICAudGhlbihfID0+IHRoaXMucHJvbWlzZVNpbmdsZVJlc3BvbnNlKG1ldGhvZCkpLCBzdGF0dXNQcm9taXNlID0gcmVzcG9uc2VQcm9taXNlXG4gICAgICAgICAgICAuY2F0Y2goXyA9PiB7XG4gICAgICAgIH0pXG4gICAgICAgICAgICAudGhlbihkZWxheSh0aGlzLmFmdGVyUmVzcG9uc2VEZWxheSwgb3B0aW9ucy5hYm9ydCkpXG4gICAgICAgICAgICAudGhlbihfID0+IHRoaXMucHJvbWlzZVN0YXR1cygpKSwgdHJhaWxlcnNQcm9taXNlID0gcmVzcG9uc2VQcm9taXNlXG4gICAgICAgICAgICAuY2F0Y2goXyA9PiB7XG4gICAgICAgIH0pXG4gICAgICAgICAgICAudGhlbihkZWxheSh0aGlzLmFmdGVyUmVzcG9uc2VEZWxheSwgb3B0aW9ucy5hYm9ydCkpXG4gICAgICAgICAgICAudGhlbihfID0+IHRoaXMucHJvbWlzZVRyYWlsZXJzKCkpO1xuICAgICAgICB0aGlzLm1heWJlU3VwcHJlc3NVbmNhdWdodChzdGF0dXNQcm9taXNlLCB0cmFpbGVyc1Byb21pc2UpO1xuICAgICAgICB0aGlzLmxhc3RJbnB1dCA9IHsgc2luZ2xlOiBpbnB1dCB9O1xuICAgICAgICByZXR1cm4gbmV3IHVuYXJ5X2NhbGxfMS5VbmFyeUNhbGwobWV0aG9kLCByZXF1ZXN0SGVhZGVycywgaW5wdXQsIGhlYWRlcnNQcm9taXNlLCByZXNwb25zZVByb21pc2UsIHN0YXR1c1Byb21pc2UsIHRyYWlsZXJzUHJvbWlzZSk7XG4gICAgfVxuICAgIHNlcnZlclN0cmVhbWluZyhtZXRob2QsIGlucHV0LCBvcHRpb25zKSB7XG4gICAgICAgIHZhciBfYTtcbiAgICAgICAgY29uc3QgcmVxdWVzdEhlYWRlcnMgPSAoX2EgPSBvcHRpb25zLm1ldGEpICE9PSBudWxsICYmIF9hICE9PSB2b2lkIDAgPyBfYSA6IHt9LCBoZWFkZXJzUHJvbWlzZSA9IHRoaXMucHJvbWlzZUhlYWRlcnMoKVxuICAgICAgICAgICAgLnRoZW4oZGVsYXkodGhpcy5oZWFkZXJEZWxheSwgb3B0aW9ucy5hYm9ydCkpLCBvdXRwdXRTdHJlYW0gPSBuZXcgcnBjX291dHB1dF9zdHJlYW1fMS5ScGNPdXRwdXRTdHJlYW1Db250cm9sbGVyKCksIHJlc3BvbnNlU3RyZWFtQ2xvc2VkUHJvbWlzZSA9IGhlYWRlcnNQcm9taXNlXG4gICAgICAgICAgICAudGhlbihkZWxheSh0aGlzLnJlc3BvbnNlRGVsYXksIG9wdGlvbnMuYWJvcnQpKVxuICAgICAgICAgICAgLmNhdGNoKCgpID0+IHtcbiAgICAgICAgfSlcbiAgICAgICAgICAgIC50aGVuKCgpID0+IHRoaXMuc3RyZWFtUmVzcG9uc2VzKG1ldGhvZCwgb3V0cHV0U3RyZWFtLCBvcHRpb25zLmFib3J0KSlcbiAgICAgICAgICAgIC50aGVuKGRlbGF5KHRoaXMuYWZ0ZXJSZXNwb25zZURlbGF5LCBvcHRpb25zLmFib3J0KSksIHN0YXR1c1Byb21pc2UgPSByZXNwb25zZVN0cmVhbUNsb3NlZFByb21pc2VcbiAgICAgICAgICAgIC50aGVuKCgpID0+IHRoaXMucHJvbWlzZVN0YXR1cygpKSwgdHJhaWxlcnNQcm9taXNlID0gcmVzcG9uc2VTdHJlYW1DbG9zZWRQcm9taXNlXG4gICAgICAgICAgICAudGhlbigoKSA9PiB0aGlzLnByb21pc2VUcmFpbGVycygpKTtcbiAgICAgICAgdGhpcy5tYXliZVN1cHByZXNzVW5jYXVnaHQoc3RhdHVzUHJvbWlzZSwgdHJhaWxlcnNQcm9taXNlKTtcbiAgICAgICAgdGhpcy5sYXN0SW5wdXQgPSB7IHNpbmdsZTogaW5wdXQgfTtcbiAgICAgICAgcmV0dXJuIG5ldyBzZXJ2ZXJfc3RyZWFtaW5nX2NhbGxfMS5TZXJ2ZXJTdHJlYW1pbmdDYWxsKG1ldGhvZCwgcmVxdWVzdEhlYWRlcnMsIGlucHV0LCBoZWFkZXJzUHJvbWlzZSwgb3V0cHV0U3RyZWFtLCBzdGF0dXNQcm9taXNlLCB0cmFpbGVyc1Byb21pc2UpO1xuICAgIH1cbiAgICBjbGllbnRTdHJlYW1pbmcobWV0aG9kLCBvcHRpb25zKSB7XG4gICAgICAgIHZhciBfYTtcbiAgICAgICAgY29uc3QgcmVxdWVzdEhlYWRlcnMgPSAoX2EgPSBvcHRpb25zLm1ldGEpICE9PSBudWxsICYmIF9hICE9PSB2b2lkIDAgPyBfYSA6IHt9LCBoZWFkZXJzUHJvbWlzZSA9IHRoaXMucHJvbWlzZUhlYWRlcnMoKVxuICAgICAgICAgICAgLnRoZW4oZGVsYXkodGhpcy5oZWFkZXJEZWxheSwgb3B0aW9ucy5hYm9ydCkpLCByZXNwb25zZVByb21pc2UgPSBoZWFkZXJzUHJvbWlzZVxuICAgICAgICAgICAgLmNhdGNoKF8gPT4ge1xuICAgICAgICB9KVxuICAgICAgICAgICAgLnRoZW4oZGVsYXkodGhpcy5yZXNwb25zZURlbGF5LCBvcHRpb25zLmFib3J0KSlcbiAgICAgICAgICAgIC50aGVuKF8gPT4gdGhpcy5wcm9taXNlU2luZ2xlUmVzcG9uc2UobWV0aG9kKSksIHN0YXR1c1Byb21pc2UgPSByZXNwb25zZVByb21pc2VcbiAgICAgICAgICAgIC5jYXRjaChfID0+IHtcbiAgICAgICAgfSlcbiAgICAgICAgICAgIC50aGVuKGRlbGF5KHRoaXMuYWZ0ZXJSZXNwb25zZURlbGF5LCBvcHRpb25zLmFib3J0KSlcbiAgICAgICAgICAgIC50aGVuKF8gPT4gdGhpcy5wcm9taXNlU3RhdHVzKCkpLCB0cmFpbGVyc1Byb21pc2UgPSByZXNwb25zZVByb21pc2VcbiAgICAgICAgICAgIC5jYXRjaChfID0+IHtcbiAgICAgICAgfSlcbiAgICAgICAgICAgIC50aGVuKGRlbGF5KHRoaXMuYWZ0ZXJSZXNwb25zZURlbGF5LCBvcHRpb25zLmFib3J0KSlcbiAgICAgICAgICAgIC50aGVuKF8gPT4gdGhpcy5wcm9taXNlVHJhaWxlcnMoKSk7XG4gICAgICAgIHRoaXMubWF5YmVTdXBwcmVzc1VuY2F1Z2h0KHN0YXR1c1Byb21pc2UsIHRyYWlsZXJzUHJvbWlzZSk7XG4gICAgICAgIHRoaXMubGFzdElucHV0ID0gbmV3IFRlc3RJbnB1dFN0cmVhbSh0aGlzLmRhdGEsIG9wdGlvbnMuYWJvcnQpO1xuICAgICAgICByZXR1cm4gbmV3IGNsaWVudF9zdHJlYW1pbmdfY2FsbF8xLkNsaWVudFN0cmVhbWluZ0NhbGwobWV0aG9kLCByZXF1ZXN0SGVhZGVycywgdGhpcy5sYXN0SW5wdXQsIGhlYWRlcnNQcm9taXNlLCByZXNwb25zZVByb21pc2UsIHN0YXR1c1Byb21pc2UsIHRyYWlsZXJzUHJvbWlzZSk7XG4gICAgfVxuICAgIGR1cGxleChtZXRob2QsIG9wdGlvbnMpIHtcbiAgICAgICAgdmFyIF9hO1xuICAgICAgICBjb25zdCByZXF1ZXN0SGVhZGVycyA9IChfYSA9IG9wdGlvbnMubWV0YSkgIT09IG51bGwgJiYgX2EgIT09IHZvaWQgMCA/IF9hIDoge30sIGhlYWRlcnNQcm9taXNlID0gdGhpcy5wcm9taXNlSGVhZGVycygpXG4gICAgICAgICAgICAudGhlbihkZWxheSh0aGlzLmhlYWRlckRlbGF5LCBvcHRpb25zLmFib3J0KSksIG91dHB1dFN0cmVhbSA9IG5ldyBycGNfb3V0cHV0X3N0cmVhbV8xLlJwY091dHB1dFN0cmVhbUNvbnRyb2xsZXIoKSwgcmVzcG9uc2VTdHJlYW1DbG9zZWRQcm9taXNlID0gaGVhZGVyc1Byb21pc2VcbiAgICAgICAgICAgIC50aGVuKGRlbGF5KHRoaXMucmVzcG9uc2VEZWxheSwgb3B0aW9ucy5hYm9ydCkpXG4gICAgICAgICAgICAuY2F0Y2goKCkgPT4ge1xuICAgICAgICB9KVxuICAgICAgICAgICAgLnRoZW4oKCkgPT4gdGhpcy5zdHJlYW1SZXNwb25zZXMobWV0aG9kLCBvdXRwdXRTdHJlYW0sIG9wdGlvbnMuYWJvcnQpKVxuICAgICAgICAgICAgLnRoZW4oZGVsYXkodGhpcy5hZnRlclJlc3BvbnNlRGVsYXksIG9wdGlvbnMuYWJvcnQpKSwgc3RhdHVzUHJvbWlzZSA9IHJlc3BvbnNlU3RyZWFtQ2xvc2VkUHJvbWlzZVxuICAgICAgICAgICAgLnRoZW4oKCkgPT4gdGhpcy5wcm9taXNlU3RhdHVzKCkpLCB0cmFpbGVyc1Byb21pc2UgPSByZXNwb25zZVN0cmVhbUNsb3NlZFByb21pc2VcbiAgICAgICAgICAgIC50aGVuKCgpID0+IHRoaXMucHJvbWlzZVRyYWlsZXJzKCkpO1xuICAgICAgICB0aGlzLm1heWJlU3VwcHJlc3NVbmNhdWdodChzdGF0dXNQcm9taXNlLCB0cmFpbGVyc1Byb21pc2UpO1xuICAgICAgICB0aGlzLmxhc3RJbnB1dCA9IG5ldyBUZXN0SW5wdXRTdHJlYW0odGhpcy5kYXRhLCBvcHRpb25zLmFib3J0KTtcbiAgICAgICAgcmV0dXJuIG5ldyBkdXBsZXhfc3RyZWFtaW5nX2NhbGxfMS5EdXBsZXhTdHJlYW1pbmdDYWxsKG1ldGhvZCwgcmVxdWVzdEhlYWRlcnMsIHRoaXMubGFzdElucHV0LCBoZWFkZXJzUHJvbWlzZSwgb3V0cHV0U3RyZWFtLCBzdGF0dXNQcm9taXNlLCB0cmFpbGVyc1Byb21pc2UpO1xuICAgIH1cbn1cbmV4cG9ydHMuVGVzdFRyYW5zcG9ydCA9IFRlc3RUcmFuc3BvcnQ7XG5UZXN0VHJhbnNwb3J0LmRlZmF1bHRIZWFkZXJzID0ge1xuICAgIHJlc3BvbnNlSGVhZGVyOiBcInRlc3RcIlxufTtcblRlc3RUcmFuc3BvcnQuZGVmYXVsdFN0YXR1cyA9IHtcbiAgICBjb2RlOiBcIk9LXCIsIGRldGFpbDogXCJhbGwgZ29vZFwiXG59O1xuVGVzdFRyYW5zcG9ydC5kZWZhdWx0VHJhaWxlcnMgPSB7XG4gICAgcmVzcG9uc2VUcmFpbGVyOiBcInRlc3RcIlxufTtcbmZ1bmN0aW9uIGRlbGF5KG1zLCBhYm9ydCkge1xuICAgIHJldHVybiAodikgPT4gbmV3IFByb21pc2UoKHJlc29sdmUsIHJlamVjdCkgPT4ge1xuICAgICAgICBpZiAoYWJvcnQgPT09IG51bGwgfHwgYWJvcnQgPT09IHZvaWQgMCA/IHZvaWQgMCA6IGFib3J0LmFib3J0ZWQpIHtcbiAgICAgICAgICAgIHJlamVjdChuZXcgcnBjX2Vycm9yXzEuUnBjRXJyb3IoXCJ1c2VyIGNhbmNlbFwiLCBcIkNBTkNFTExFRFwiKSk7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICBjb25zdCBpZCA9IHNldFRpbWVvdXQoKCkgPT4gcmVzb2x2ZSh2KSwgbXMpO1xuICAgICAgICAgICAgaWYgKGFib3J0KSB7XG4gICAgICAgICAgICAgICAgYWJvcnQuYWRkRXZlbnRMaXN0ZW5lcihcImFib3J0XCIsIGV2ID0+IHtcbiAgICAgICAgICAgICAgICAgICAgY2xlYXJUaW1lb3V0KGlkKTtcbiAgICAgICAgICAgICAgICAgICAgcmVqZWN0KG5ldyBycGNfZXJyb3JfMS5ScGNFcnJvcihcInVzZXIgY2FuY2VsXCIsIFwiQ0FOQ0VMTEVEXCIpKTtcbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH0pO1xufVxuY2xhc3MgVGVzdElucHV0U3RyZWFtIHtcbiAgICBjb25zdHJ1Y3RvcihkYXRhLCBhYm9ydCkge1xuICAgICAgICB0aGlzLl9jb21wbGV0ZWQgPSBmYWxzZTtcbiAgICAgICAgdGhpcy5fc2VudCA9IFtdO1xuICAgICAgICB0aGlzLmRhdGEgPSBkYXRhO1xuICAgICAgICB0aGlzLmFib3J0ID0gYWJvcnQ7XG4gICAgfVxuICAgIGdldCBzZW50KCkge1xuICAgICAgICByZXR1cm4gdGhpcy5fc2VudDtcbiAgICB9XG4gICAgZ2V0IGNvbXBsZXRlZCgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX2NvbXBsZXRlZDtcbiAgICB9XG4gICAgc2VuZChtZXNzYWdlKSB7XG4gICAgICAgIGlmICh0aGlzLmRhdGEuaW5wdXRNZXNzYWdlIGluc3RhbmNlb2YgcnBjX2Vycm9yXzEuUnBjRXJyb3IpIHtcbiAgICAgICAgICAgIHJldHVybiBQcm9taXNlLnJlamVjdCh0aGlzLmRhdGEuaW5wdXRNZXNzYWdlKTtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBkZWxheU1zID0gdGhpcy5kYXRhLmlucHV0TWVzc2FnZSA9PT0gdW5kZWZpbmVkXG4gICAgICAgICAgICA/IDEwXG4gICAgICAgICAgICA6IHRoaXMuZGF0YS5pbnB1dE1lc3NhZ2U7XG4gICAgICAgIHJldHVybiBQcm9taXNlLnJlc29sdmUodW5kZWZpbmVkKVxuICAgICAgICAgICAgLnRoZW4oKCkgPT4ge1xuICAgICAgICAgICAgdGhpcy5fc2VudC5wdXNoKG1lc3NhZ2UpO1xuICAgICAgICB9KVxuICAgICAgICAgICAgLnRoZW4oZGVsYXkoZGVsYXlNcywgdGhpcy5hYm9ydCkpO1xuICAgIH1cbiAgICBjb21wbGV0ZSgpIHtcbiAgICAgICAgaWYgKHRoaXMuZGF0YS5pbnB1dENvbXBsZXRlIGluc3RhbmNlb2YgcnBjX2Vycm9yXzEuUnBjRXJyb3IpIHtcbiAgICAgICAgICAgIHJldHVybiBQcm9taXNlLnJlamVjdCh0aGlzLmRhdGEuaW5wdXRDb21wbGV0ZSk7XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgZGVsYXlNcyA9IHRoaXMuZGF0YS5pbnB1dENvbXBsZXRlID09PSB1bmRlZmluZWRcbiAgICAgICAgICAgID8gMTBcbiAgICAgICAgICAgIDogdGhpcy5kYXRhLmlucHV0Q29tcGxldGU7XG4gICAgICAgIHJldHVybiBQcm9taXNlLnJlc29sdmUodW5kZWZpbmVkKVxuICAgICAgICAgICAgLnRoZW4oKCkgPT4ge1xuICAgICAgICAgICAgdGhpcy5fY29tcGxldGVkID0gdHJ1ZTtcbiAgICAgICAgfSlcbiAgICAgICAgICAgIC50aGVuKGRlbGF5KGRlbGF5TXMsIHRoaXMuYWJvcnQpKTtcbiAgICB9XG59XG4iLAogICAgIlwidXNlIHN0cmljdFwiO1xuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiX19lc01vZHVsZVwiLCB7IHZhbHVlOiB0cnVlIH0pO1xuZXhwb3J0cy5zdGFja0R1cGxleFN0cmVhbWluZ0ludGVyY2VwdG9ycyA9IGV4cG9ydHMuc3RhY2tDbGllbnRTdHJlYW1pbmdJbnRlcmNlcHRvcnMgPSBleHBvcnRzLnN0YWNrU2VydmVyU3RyZWFtaW5nSW50ZXJjZXB0b3JzID0gZXhwb3J0cy5zdGFja1VuYXJ5SW50ZXJjZXB0b3JzID0gZXhwb3J0cy5zdGFja0ludGVyY2VwdCA9IHZvaWQgMDtcbmNvbnN0IHJ1bnRpbWVfMSA9IHJlcXVpcmUoXCJAcHJvdG9idWYtdHMvcnVudGltZVwiKTtcbi8qKlxuICogQ3JlYXRlcyBhIFwic3RhY2tcIiBvZiBvZiBhbGwgaW50ZXJjZXB0b3JzIHNwZWNpZmllZCBpbiB0aGUgZ2l2ZW4gYFJwY09wdGlvbnNgLlxuICogVXNlZCBieSBnZW5lcmF0ZWQgY2xpZW50IGltcGxlbWVudGF0aW9ucy5cbiAqIEBpbnRlcm5hbFxuICovXG5mdW5jdGlvbiBzdGFja0ludGVyY2VwdChraW5kLCB0cmFuc3BvcnQsIG1ldGhvZCwgb3B0aW9ucywgaW5wdXQpIHtcbiAgICB2YXIgX2EsIF9iLCBfYywgX2Q7XG4gICAgaWYgKGtpbmQgPT0gXCJ1bmFyeVwiKSB7XG4gICAgICAgIGxldCB0YWlsID0gKG10ZCwgaW5wLCBvcHQpID0+IHRyYW5zcG9ydC51bmFyeShtdGQsIGlucCwgb3B0KTtcbiAgICAgICAgZm9yIChjb25zdCBjdXJyIG9mICgoX2EgPSBvcHRpb25zLmludGVyY2VwdG9ycykgIT09IG51bGwgJiYgX2EgIT09IHZvaWQgMCA/IF9hIDogW10pLmZpbHRlcihpID0+IGkuaW50ZXJjZXB0VW5hcnkpLnJldmVyc2UoKSkge1xuICAgICAgICAgICAgY29uc3QgbmV4dCA9IHRhaWw7XG4gICAgICAgICAgICB0YWlsID0gKG10ZCwgaW5wLCBvcHQpID0+IGN1cnIuaW50ZXJjZXB0VW5hcnkobmV4dCwgbXRkLCBpbnAsIG9wdCk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHRhaWwobWV0aG9kLCBpbnB1dCwgb3B0aW9ucyk7XG4gICAgfVxuICAgIGlmIChraW5kID09IFwic2VydmVyU3RyZWFtaW5nXCIpIHtcbiAgICAgICAgbGV0IHRhaWwgPSAobXRkLCBpbnAsIG9wdCkgPT4gdHJhbnNwb3J0LnNlcnZlclN0cmVhbWluZyhtdGQsIGlucCwgb3B0KTtcbiAgICAgICAgZm9yIChjb25zdCBjdXJyIG9mICgoX2IgPSBvcHRpb25zLmludGVyY2VwdG9ycykgIT09IG51bGwgJiYgX2IgIT09IHZvaWQgMCA/IF9iIDogW10pLmZpbHRlcihpID0+IGkuaW50ZXJjZXB0U2VydmVyU3RyZWFtaW5nKS5yZXZlcnNlKCkpIHtcbiAgICAgICAgICAgIGNvbnN0IG5leHQgPSB0YWlsO1xuICAgICAgICAgICAgdGFpbCA9IChtdGQsIGlucCwgb3B0KSA9PiBjdXJyLmludGVyY2VwdFNlcnZlclN0cmVhbWluZyhuZXh0LCBtdGQsIGlucCwgb3B0KTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gdGFpbChtZXRob2QsIGlucHV0LCBvcHRpb25zKTtcbiAgICB9XG4gICAgaWYgKGtpbmQgPT0gXCJjbGllbnRTdHJlYW1pbmdcIikge1xuICAgICAgICBsZXQgdGFpbCA9IChtdGQsIG9wdCkgPT4gdHJhbnNwb3J0LmNsaWVudFN0cmVhbWluZyhtdGQsIG9wdCk7XG4gICAgICAgIGZvciAoY29uc3QgY3VyciBvZiAoKF9jID0gb3B0aW9ucy5pbnRlcmNlcHRvcnMpICE9PSBudWxsICYmIF9jICE9PSB2b2lkIDAgPyBfYyA6IFtdKS5maWx0ZXIoaSA9PiBpLmludGVyY2VwdENsaWVudFN0cmVhbWluZykucmV2ZXJzZSgpKSB7XG4gICAgICAgICAgICBjb25zdCBuZXh0ID0gdGFpbDtcbiAgICAgICAgICAgIHRhaWwgPSAobXRkLCBvcHQpID0+IGN1cnIuaW50ZXJjZXB0Q2xpZW50U3RyZWFtaW5nKG5leHQsIG10ZCwgb3B0KTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gdGFpbChtZXRob2QsIG9wdGlvbnMpO1xuICAgIH1cbiAgICBpZiAoa2luZCA9PSBcImR1cGxleFwiKSB7XG4gICAgICAgIGxldCB0YWlsID0gKG10ZCwgb3B0KSA9PiB0cmFuc3BvcnQuZHVwbGV4KG10ZCwgb3B0KTtcbiAgICAgICAgZm9yIChjb25zdCBjdXJyIG9mICgoX2QgPSBvcHRpb25zLmludGVyY2VwdG9ycykgIT09IG51bGwgJiYgX2QgIT09IHZvaWQgMCA/IF9kIDogW10pLmZpbHRlcihpID0+IGkuaW50ZXJjZXB0RHVwbGV4KS5yZXZlcnNlKCkpIHtcbiAgICAgICAgICAgIGNvbnN0IG5leHQgPSB0YWlsO1xuICAgICAgICAgICAgdGFpbCA9IChtdGQsIG9wdCkgPT4gY3Vyci5pbnRlcmNlcHREdXBsZXgobmV4dCwgbXRkLCBvcHQpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB0YWlsKG1ldGhvZCwgb3B0aW9ucyk7XG4gICAgfVxuICAgIHJ1bnRpbWVfMS5hc3NlcnROZXZlcihraW5kKTtcbn1cbmV4cG9ydHMuc3RhY2tJbnRlcmNlcHQgPSBzdGFja0ludGVyY2VwdDtcbi8qKlxuICogQGRlcHJlY2F0ZWQgcmVwbGFjZWQgYnkgYHN0YWNrSW50ZXJjZXB0KClgLCBzdGlsbCBoZXJlIHRvIHN1cHBvcnQgb2xkZXIgZ2VuZXJhdGVkIGNvZGVcbiAqL1xuZnVuY3Rpb24gc3RhY2tVbmFyeUludGVyY2VwdG9ycyh0cmFuc3BvcnQsIG1ldGhvZCwgaW5wdXQsIG9wdGlvbnMpIHtcbiAgICByZXR1cm4gc3RhY2tJbnRlcmNlcHQoXCJ1bmFyeVwiLCB0cmFuc3BvcnQsIG1ldGhvZCwgb3B0aW9ucywgaW5wdXQpO1xufVxuZXhwb3J0cy5zdGFja1VuYXJ5SW50ZXJjZXB0b3JzID0gc3RhY2tVbmFyeUludGVyY2VwdG9ycztcbi8qKlxuICogQGRlcHJlY2F0ZWQgcmVwbGFjZWQgYnkgYHN0YWNrSW50ZXJjZXB0KClgLCBzdGlsbCBoZXJlIHRvIHN1cHBvcnQgb2xkZXIgZ2VuZXJhdGVkIGNvZGVcbiAqL1xuZnVuY3Rpb24gc3RhY2tTZXJ2ZXJTdHJlYW1pbmdJbnRlcmNlcHRvcnModHJhbnNwb3J0LCBtZXRob2QsIGlucHV0LCBvcHRpb25zKSB7XG4gICAgcmV0dXJuIHN0YWNrSW50ZXJjZXB0KFwic2VydmVyU3RyZWFtaW5nXCIsIHRyYW5zcG9ydCwgbWV0aG9kLCBvcHRpb25zLCBpbnB1dCk7XG59XG5leHBvcnRzLnN0YWNrU2VydmVyU3RyZWFtaW5nSW50ZXJjZXB0b3JzID0gc3RhY2tTZXJ2ZXJTdHJlYW1pbmdJbnRlcmNlcHRvcnM7XG4vKipcbiAqIEBkZXByZWNhdGVkIHJlcGxhY2VkIGJ5IGBzdGFja0ludGVyY2VwdCgpYCwgc3RpbGwgaGVyZSB0byBzdXBwb3J0IG9sZGVyIGdlbmVyYXRlZCBjb2RlXG4gKi9cbmZ1bmN0aW9uIHN0YWNrQ2xpZW50U3RyZWFtaW5nSW50ZXJjZXB0b3JzKHRyYW5zcG9ydCwgbWV0aG9kLCBvcHRpb25zKSB7XG4gICAgcmV0dXJuIHN0YWNrSW50ZXJjZXB0KFwiY2xpZW50U3RyZWFtaW5nXCIsIHRyYW5zcG9ydCwgbWV0aG9kLCBvcHRpb25zKTtcbn1cbmV4cG9ydHMuc3RhY2tDbGllbnRTdHJlYW1pbmdJbnRlcmNlcHRvcnMgPSBzdGFja0NsaWVudFN0cmVhbWluZ0ludGVyY2VwdG9ycztcbi8qKlxuICogQGRlcHJlY2F0ZWQgcmVwbGFjZWQgYnkgYHN0YWNrSW50ZXJjZXB0KClgLCBzdGlsbCBoZXJlIHRvIHN1cHBvcnQgb2xkZXIgZ2VuZXJhdGVkIGNvZGVcbiAqL1xuZnVuY3Rpb24gc3RhY2tEdXBsZXhTdHJlYW1pbmdJbnRlcmNlcHRvcnModHJhbnNwb3J0LCBtZXRob2QsIG9wdGlvbnMpIHtcbiAgICByZXR1cm4gc3RhY2tJbnRlcmNlcHQoXCJkdXBsZXhcIiwgdHJhbnNwb3J0LCBtZXRob2QsIG9wdGlvbnMpO1xufVxuZXhwb3J0cy5zdGFja0R1cGxleFN0cmVhbWluZ0ludGVyY2VwdG9ycyA9IHN0YWNrRHVwbGV4U3RyZWFtaW5nSW50ZXJjZXB0b3JzO1xuIiwKICAgICJcInVzZSBzdHJpY3RcIjtcbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIl9fZXNNb2R1bGVcIiwgeyB2YWx1ZTogdHJ1ZSB9KTtcbmV4cG9ydHMuU2VydmVyQ2FsbENvbnRleHRDb250cm9sbGVyID0gdm9pZCAwO1xuY2xhc3MgU2VydmVyQ2FsbENvbnRleHRDb250cm9sbGVyIHtcbiAgICBjb25zdHJ1Y3RvcihtZXRob2QsIGhlYWRlcnMsIGRlYWRsaW5lLCBzZW5kUmVzcG9uc2VIZWFkZXJzRm4sIGRlZmF1bHRTdGF0dXMgPSB7IGNvZGU6ICdPSycsIGRldGFpbDogJycgfSkge1xuICAgICAgICB0aGlzLl9jYW5jZWxsZWQgPSBmYWxzZTtcbiAgICAgICAgdGhpcy5fbGlzdGVuZXJzID0gW107XG4gICAgICAgIHRoaXMubWV0aG9kID0gbWV0aG9kO1xuICAgICAgICB0aGlzLmhlYWRlcnMgPSBoZWFkZXJzO1xuICAgICAgICB0aGlzLmRlYWRsaW5lID0gZGVhZGxpbmU7XG4gICAgICAgIHRoaXMudHJhaWxlcnMgPSB7fTtcbiAgICAgICAgdGhpcy5fc2VuZFJIID0gc2VuZFJlc3BvbnNlSGVhZGVyc0ZuO1xuICAgICAgICB0aGlzLnN0YXR1cyA9IGRlZmF1bHRTdGF0dXM7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIFNldCB0aGUgY2FsbCBjYW5jZWxsZWQuXG4gICAgICpcbiAgICAgKiBJbnZva2VzIGFsbCBjYWxsYmFja3MgcmVnaXN0ZXJlZCB3aXRoIG9uQ2FuY2VsKCkgYW5kXG4gICAgICogc2V0cyBgY2FuY2VsbGVkID0gdHJ1ZWAuXG4gICAgICovXG4gICAgbm90aWZ5Q2FuY2VsbGVkKCkge1xuICAgICAgICBpZiAoIXRoaXMuX2NhbmNlbGxlZCkge1xuICAgICAgICAgICAgdGhpcy5fY2FuY2VsbGVkID0gdHJ1ZTtcbiAgICAgICAgICAgIGZvciAobGV0IGwgb2YgdGhpcy5fbGlzdGVuZXJzKSB7XG4gICAgICAgICAgICAgICAgbCgpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxuICAgIC8qKlxuICAgICAqIFNlbmQgcmVzcG9uc2UgaGVhZGVycy5cbiAgICAgKi9cbiAgICBzZW5kUmVzcG9uc2VIZWFkZXJzKGRhdGEpIHtcbiAgICAgICAgdGhpcy5fc2VuZFJIKGRhdGEpO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBJcyB0aGUgY2FsbCBjYW5jZWxsZWQ/XG4gICAgICpcbiAgICAgKiBXaGVuIHRoZSBjbGllbnQgY2xvc2VzIHRoZSBjb25uZWN0aW9uIGJlZm9yZSB0aGUgc2VydmVyXG4gICAgICogaXMgZG9uZSwgdGhlIGNhbGwgaXMgY2FuY2VsbGVkLlxuICAgICAqXG4gICAgICogSWYgeW91IHdhbnQgdG8gY2FuY2VsIGEgcmVxdWVzdCBvbiB0aGUgc2VydmVyLCB0aHJvdyBhXG4gICAgICogUnBjRXJyb3Igd2l0aCB0aGUgQ0FOQ0VMTEVEIHN0YXR1cyBjb2RlLlxuICAgICAqL1xuICAgIGdldCBjYW5jZWxsZWQoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLl9jYW5jZWxsZWQ7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIEFkZCBhIGNhbGxiYWNrIGZvciBjYW5jZWxsYXRpb24uXG4gICAgICovXG4gICAgb25DYW5jZWwoY2FsbGJhY2spIHtcbiAgICAgICAgY29uc3QgbCA9IHRoaXMuX2xpc3RlbmVycztcbiAgICAgICAgbC5wdXNoKGNhbGxiYWNrKTtcbiAgICAgICAgcmV0dXJuICgpID0+IHtcbiAgICAgICAgICAgIGxldCBpID0gbC5pbmRleE9mKGNhbGxiYWNrKTtcbiAgICAgICAgICAgIGlmIChpID49IDApXG4gICAgICAgICAgICAgICAgbC5zcGxpY2UoaSwgMSk7XG4gICAgICAgIH07XG4gICAgfVxufVxuZXhwb3J0cy5TZXJ2ZXJDYWxsQ29udGV4dENvbnRyb2xsZXIgPSBTZXJ2ZXJDYWxsQ29udGV4dENvbnRyb2xsZXI7XG4iLAogICAgIlwidXNlIHN0cmljdFwiO1xuLy8gUHVibGljIEFQSSBvZiB0aGUgcnBjIHJ1bnRpbWUuXG4vLyBOb3RlOiB3ZSBkbyBub3QgdXNlIGBleHBvcnQgKiBmcm9tIC4uLmAgdG8gaGVscCB0cmVlIHNoYWtlcnMsXG4vLyB3ZWJwYWNrIHZlcmJvc2Ugb3V0cHV0IGhpbnRzIHRoYXQgdGhpcyBzaG91bGQgYmUgdXNlZnVsXG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJfX2VzTW9kdWxlXCIsIHsgdmFsdWU6IHRydWUgfSk7XG52YXIgc2VydmljZV90eXBlXzEgPSByZXF1aXJlKFwiLi9zZXJ2aWNlLXR5cGVcIik7XG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJTZXJ2aWNlVHlwZVwiLCB7IGVudW1lcmFibGU6IHRydWUsIGdldDogZnVuY3Rpb24gKCkgeyByZXR1cm4gc2VydmljZV90eXBlXzEuU2VydmljZVR5cGU7IH0gfSk7XG52YXIgcmVmbGVjdGlvbl9pbmZvXzEgPSByZXF1aXJlKFwiLi9yZWZsZWN0aW9uLWluZm9cIik7XG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJyZWFkTWV0aG9kT3B0aW9uc1wiLCB7IGVudW1lcmFibGU6IHRydWUsIGdldDogZnVuY3Rpb24gKCkgeyByZXR1cm4gcmVmbGVjdGlvbl9pbmZvXzEucmVhZE1ldGhvZE9wdGlvbnM7IH0gfSk7XG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJyZWFkTWV0aG9kT3B0aW9uXCIsIHsgZW51bWVyYWJsZTogdHJ1ZSwgZ2V0OiBmdW5jdGlvbiAoKSB7IHJldHVybiByZWZsZWN0aW9uX2luZm9fMS5yZWFkTWV0aG9kT3B0aW9uOyB9IH0pO1xuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwicmVhZFNlcnZpY2VPcHRpb25cIiwgeyBlbnVtZXJhYmxlOiB0cnVlLCBnZXQ6IGZ1bmN0aW9uICgpIHsgcmV0dXJuIHJlZmxlY3Rpb25faW5mb18xLnJlYWRTZXJ2aWNlT3B0aW9uOyB9IH0pO1xudmFyIHJwY19lcnJvcl8xID0gcmVxdWlyZShcIi4vcnBjLWVycm9yXCIpO1xuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiUnBjRXJyb3JcIiwgeyBlbnVtZXJhYmxlOiB0cnVlLCBnZXQ6IGZ1bmN0aW9uICgpIHsgcmV0dXJuIHJwY19lcnJvcl8xLlJwY0Vycm9yOyB9IH0pO1xudmFyIHJwY19vcHRpb25zXzEgPSByZXF1aXJlKFwiLi9ycGMtb3B0aW9uc1wiKTtcbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIm1lcmdlUnBjT3B0aW9uc1wiLCB7IGVudW1lcmFibGU6IHRydWUsIGdldDogZnVuY3Rpb24gKCkgeyByZXR1cm4gcnBjX29wdGlvbnNfMS5tZXJnZVJwY09wdGlvbnM7IH0gfSk7XG52YXIgcnBjX291dHB1dF9zdHJlYW1fMSA9IHJlcXVpcmUoXCIuL3JwYy1vdXRwdXQtc3RyZWFtXCIpO1xuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiUnBjT3V0cHV0U3RyZWFtQ29udHJvbGxlclwiLCB7IGVudW1lcmFibGU6IHRydWUsIGdldDogZnVuY3Rpb24gKCkgeyByZXR1cm4gcnBjX291dHB1dF9zdHJlYW1fMS5ScGNPdXRwdXRTdHJlYW1Db250cm9sbGVyOyB9IH0pO1xudmFyIHRlc3RfdHJhbnNwb3J0XzEgPSByZXF1aXJlKFwiLi90ZXN0LXRyYW5zcG9ydFwiKTtcbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIlRlc3RUcmFuc3BvcnRcIiwgeyBlbnVtZXJhYmxlOiB0cnVlLCBnZXQ6IGZ1bmN0aW9uICgpIHsgcmV0dXJuIHRlc3RfdHJhbnNwb3J0XzEuVGVzdFRyYW5zcG9ydDsgfSB9KTtcbnZhciBkZWZlcnJlZF8xID0gcmVxdWlyZShcIi4vZGVmZXJyZWRcIik7XG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJEZWZlcnJlZFwiLCB7IGVudW1lcmFibGU6IHRydWUsIGdldDogZnVuY3Rpb24gKCkgeyByZXR1cm4gZGVmZXJyZWRfMS5EZWZlcnJlZDsgfSB9KTtcbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIkRlZmVycmVkU3RhdGVcIiwgeyBlbnVtZXJhYmxlOiB0cnVlLCBnZXQ6IGZ1bmN0aW9uICgpIHsgcmV0dXJuIGRlZmVycmVkXzEuRGVmZXJyZWRTdGF0ZTsgfSB9KTtcbnZhciBkdXBsZXhfc3RyZWFtaW5nX2NhbGxfMSA9IHJlcXVpcmUoXCIuL2R1cGxleC1zdHJlYW1pbmctY2FsbFwiKTtcbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIkR1cGxleFN0cmVhbWluZ0NhbGxcIiwgeyBlbnVtZXJhYmxlOiB0cnVlLCBnZXQ6IGZ1bmN0aW9uICgpIHsgcmV0dXJuIGR1cGxleF9zdHJlYW1pbmdfY2FsbF8xLkR1cGxleFN0cmVhbWluZ0NhbGw7IH0gfSk7XG52YXIgY2xpZW50X3N0cmVhbWluZ19jYWxsXzEgPSByZXF1aXJlKFwiLi9jbGllbnQtc3RyZWFtaW5nLWNhbGxcIik7XG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJDbGllbnRTdHJlYW1pbmdDYWxsXCIsIHsgZW51bWVyYWJsZTogdHJ1ZSwgZ2V0OiBmdW5jdGlvbiAoKSB7IHJldHVybiBjbGllbnRfc3RyZWFtaW5nX2NhbGxfMS5DbGllbnRTdHJlYW1pbmdDYWxsOyB9IH0pO1xudmFyIHNlcnZlcl9zdHJlYW1pbmdfY2FsbF8xID0gcmVxdWlyZShcIi4vc2VydmVyLXN0cmVhbWluZy1jYWxsXCIpO1xuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiU2VydmVyU3RyZWFtaW5nQ2FsbFwiLCB7IGVudW1lcmFibGU6IHRydWUsIGdldDogZnVuY3Rpb24gKCkgeyByZXR1cm4gc2VydmVyX3N0cmVhbWluZ19jYWxsXzEuU2VydmVyU3RyZWFtaW5nQ2FsbDsgfSB9KTtcbnZhciB1bmFyeV9jYWxsXzEgPSByZXF1aXJlKFwiLi91bmFyeS1jYWxsXCIpO1xuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiVW5hcnlDYWxsXCIsIHsgZW51bWVyYWJsZTogdHJ1ZSwgZ2V0OiBmdW5jdGlvbiAoKSB7IHJldHVybiB1bmFyeV9jYWxsXzEuVW5hcnlDYWxsOyB9IH0pO1xudmFyIHJwY19pbnRlcmNlcHRvcl8xID0gcmVxdWlyZShcIi4vcnBjLWludGVyY2VwdG9yXCIpO1xuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwic3RhY2tJbnRlcmNlcHRcIiwgeyBlbnVtZXJhYmxlOiB0cnVlLCBnZXQ6IGZ1bmN0aW9uICgpIHsgcmV0dXJuIHJwY19pbnRlcmNlcHRvcl8xLnN0YWNrSW50ZXJjZXB0OyB9IH0pO1xuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwic3RhY2tEdXBsZXhTdHJlYW1pbmdJbnRlcmNlcHRvcnNcIiwgeyBlbnVtZXJhYmxlOiB0cnVlLCBnZXQ6IGZ1bmN0aW9uICgpIHsgcmV0dXJuIHJwY19pbnRlcmNlcHRvcl8xLnN0YWNrRHVwbGV4U3RyZWFtaW5nSW50ZXJjZXB0b3JzOyB9IH0pO1xuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwic3RhY2tDbGllbnRTdHJlYW1pbmdJbnRlcmNlcHRvcnNcIiwgeyBlbnVtZXJhYmxlOiB0cnVlLCBnZXQ6IGZ1bmN0aW9uICgpIHsgcmV0dXJuIHJwY19pbnRlcmNlcHRvcl8xLnN0YWNrQ2xpZW50U3RyZWFtaW5nSW50ZXJjZXB0b3JzOyB9IH0pO1xuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwic3RhY2tTZXJ2ZXJTdHJlYW1pbmdJbnRlcmNlcHRvcnNcIiwgeyBlbnVtZXJhYmxlOiB0cnVlLCBnZXQ6IGZ1bmN0aW9uICgpIHsgcmV0dXJuIHJwY19pbnRlcmNlcHRvcl8xLnN0YWNrU2VydmVyU3RyZWFtaW5nSW50ZXJjZXB0b3JzOyB9IH0pO1xuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwic3RhY2tVbmFyeUludGVyY2VwdG9yc1wiLCB7IGVudW1lcmFibGU6IHRydWUsIGdldDogZnVuY3Rpb24gKCkgeyByZXR1cm4gcnBjX2ludGVyY2VwdG9yXzEuc3RhY2tVbmFyeUludGVyY2VwdG9yczsgfSB9KTtcbnZhciBzZXJ2ZXJfY2FsbF9jb250ZXh0XzEgPSByZXF1aXJlKFwiLi9zZXJ2ZXItY2FsbC1jb250ZXh0XCIpO1xuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiU2VydmVyQ2FsbENvbnRleHRDb250cm9sbGVyXCIsIHsgZW51bWVyYWJsZTogdHJ1ZSwgZ2V0OiBmdW5jdGlvbiAoKSB7IHJldHVybiBzZXJ2ZXJfY2FsbF9jb250ZXh0XzEuU2VydmVyQ2FsbENvbnRleHRDb250cm9sbGVyOyB9IH0pO1xuIiwKICAgICJcInVzZSBzdHJpY3RcIjtcbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIl9fZXNNb2R1bGVcIiwgeyB2YWx1ZTogdHJ1ZSB9KTtcbmV4cG9ydHMuQXJ0aWZhY3RTZXJ2aWNlID0gZXhwb3J0cy5EZWxldGVBcnRpZmFjdFJlc3BvbnNlID0gZXhwb3J0cy5EZWxldGVBcnRpZmFjdFJlcXVlc3QgPSBleHBvcnRzLkdldFNpZ25lZEFydGlmYWN0VVJMUmVzcG9uc2UgPSBleHBvcnRzLkdldFNpZ25lZEFydGlmYWN0VVJMUmVxdWVzdCA9IGV4cG9ydHMuTGlzdEFydGlmYWN0c1Jlc3BvbnNlX01vbm9saXRoQXJ0aWZhY3QgPSBleHBvcnRzLkxpc3RBcnRpZmFjdHNSZXNwb25zZSA9IGV4cG9ydHMuTGlzdEFydGlmYWN0c1JlcXVlc3QgPSBleHBvcnRzLkZpbmFsaXplQXJ0aWZhY3RSZXNwb25zZSA9IGV4cG9ydHMuRmluYWxpemVBcnRpZmFjdFJlcXVlc3QgPSBleHBvcnRzLkNyZWF0ZUFydGlmYWN0UmVzcG9uc2UgPSBleHBvcnRzLkNyZWF0ZUFydGlmYWN0UmVxdWVzdCA9IHZvaWQgMDtcbi8vIEBnZW5lcmF0ZWQgYnkgcHJvdG9idWYtdHMgMi45LjEgd2l0aCBwYXJhbWV0ZXIgbG9uZ190eXBlX3N0cmluZyxjbGllbnRfbm9uZSxnZW5lcmF0ZV9kZXBlbmRlbmNpZXNcbi8vIEBnZW5lcmF0ZWQgZnJvbSBwcm90b2J1ZiBmaWxlIFwicmVzdWx0cy9hcGkvdjEvYXJ0aWZhY3QucHJvdG9cIiAocGFja2FnZSBcImdpdGh1Yi5hY3Rpb25zLnJlc3VsdHMuYXBpLnYxXCIsIHN5bnRheCBwcm90bzMpXG4vLyB0c2xpbnQ6ZGlzYWJsZVxuY29uc3QgcnVudGltZV9ycGNfMSA9IHJlcXVpcmUoXCJAcHJvdG9idWYtdHMvcnVudGltZS1ycGNcIik7XG5jb25zdCBydW50aW1lXzEgPSByZXF1aXJlKFwiQHByb3RvYnVmLXRzL3J1bnRpbWVcIik7XG5jb25zdCBydW50aW1lXzIgPSByZXF1aXJlKFwiQHByb3RvYnVmLXRzL3J1bnRpbWVcIik7XG5jb25zdCBydW50aW1lXzMgPSByZXF1aXJlKFwiQHByb3RvYnVmLXRzL3J1bnRpbWVcIik7XG5jb25zdCBydW50aW1lXzQgPSByZXF1aXJlKFwiQHByb3RvYnVmLXRzL3J1bnRpbWVcIik7XG5jb25zdCBydW50aW1lXzUgPSByZXF1aXJlKFwiQHByb3RvYnVmLXRzL3J1bnRpbWVcIik7XG5jb25zdCB3cmFwcGVyc18xID0gcmVxdWlyZShcIi4uLy4uLy4uL2dvb2dsZS9wcm90b2J1Zi93cmFwcGVyc1wiKTtcbmNvbnN0IHdyYXBwZXJzXzIgPSByZXF1aXJlKFwiLi4vLi4vLi4vZ29vZ2xlL3Byb3RvYnVmL3dyYXBwZXJzXCIpO1xuY29uc3QgdGltZXN0YW1wXzEgPSByZXF1aXJlKFwiLi4vLi4vLi4vZ29vZ2xlL3Byb3RvYnVmL3RpbWVzdGFtcFwiKTtcbi8vIEBnZW5lcmF0ZWQgbWVzc2FnZSB0eXBlIHdpdGggcmVmbGVjdGlvbiBpbmZvcm1hdGlvbiwgbWF5IHByb3ZpZGUgc3BlZWQgb3B0aW1pemVkIG1ldGhvZHNcbmNsYXNzIENyZWF0ZUFydGlmYWN0UmVxdWVzdCRUeXBlIGV4dGVuZHMgcnVudGltZV81Lk1lc3NhZ2VUeXBlIHtcbiAgICBjb25zdHJ1Y3RvcigpIHtcbiAgICAgICAgc3VwZXIoXCJnaXRodWIuYWN0aW9ucy5yZXN1bHRzLmFwaS52MS5DcmVhdGVBcnRpZmFjdFJlcXVlc3RcIiwgW1xuICAgICAgICAgICAgeyBubzogMSwgbmFtZTogXCJ3b3JrZmxvd19ydW5fYmFja2VuZF9pZFwiLCBraW5kOiBcInNjYWxhclwiLCBUOiA5IC8qU2NhbGFyVHlwZS5TVFJJTkcqLyB9LFxuICAgICAgICAgICAgeyBubzogMiwgbmFtZTogXCJ3b3JrZmxvd19qb2JfcnVuX2JhY2tlbmRfaWRcIiwga2luZDogXCJzY2FsYXJcIiwgVDogOSAvKlNjYWxhclR5cGUuU1RSSU5HKi8gfSxcbiAgICAgICAgICAgIHsgbm86IDMsIG5hbWU6IFwibmFtZVwiLCBraW5kOiBcInNjYWxhclwiLCBUOiA5IC8qU2NhbGFyVHlwZS5TVFJJTkcqLyB9LFxuICAgICAgICAgICAgeyBubzogNCwgbmFtZTogXCJleHBpcmVzX2F0XCIsIGtpbmQ6IFwibWVzc2FnZVwiLCBUOiAoKSA9PiB0aW1lc3RhbXBfMS5UaW1lc3RhbXAgfSxcbiAgICAgICAgICAgIHsgbm86IDUsIG5hbWU6IFwidmVyc2lvblwiLCBraW5kOiBcInNjYWxhclwiLCBUOiA1IC8qU2NhbGFyVHlwZS5JTlQzMiovIH1cbiAgICAgICAgXSk7XG4gICAgfVxuICAgIGNyZWF0ZSh2YWx1ZSkge1xuICAgICAgICBjb25zdCBtZXNzYWdlID0geyB3b3JrZmxvd1J1bkJhY2tlbmRJZDogXCJcIiwgd29ya2Zsb3dKb2JSdW5CYWNrZW5kSWQ6IFwiXCIsIG5hbWU6IFwiXCIsIHZlcnNpb246IDAgfTtcbiAgICAgICAgZ2xvYmFsVGhpcy5PYmplY3QuZGVmaW5lUHJvcGVydHkobWVzc2FnZSwgcnVudGltZV80Lk1FU1NBR0VfVFlQRSwgeyBlbnVtZXJhYmxlOiBmYWxzZSwgdmFsdWU6IHRoaXMgfSk7XG4gICAgICAgIGlmICh2YWx1ZSAhPT0gdW5kZWZpbmVkKVxuICAgICAgICAgICAgKDAsIHJ1bnRpbWVfMy5yZWZsZWN0aW9uTWVyZ2VQYXJ0aWFsKSh0aGlzLCBtZXNzYWdlLCB2YWx1ZSk7XG4gICAgICAgIHJldHVybiBtZXNzYWdlO1xuICAgIH1cbiAgICBpbnRlcm5hbEJpbmFyeVJlYWQocmVhZGVyLCBsZW5ndGgsIG9wdGlvbnMsIHRhcmdldCkge1xuICAgICAgICBsZXQgbWVzc2FnZSA9IHRhcmdldCAhPT0gbnVsbCAmJiB0YXJnZXQgIT09IHZvaWQgMCA/IHRhcmdldCA6IHRoaXMuY3JlYXRlKCksIGVuZCA9IHJlYWRlci5wb3MgKyBsZW5ndGg7XG4gICAgICAgIHdoaWxlIChyZWFkZXIucG9zIDwgZW5kKSB7XG4gICAgICAgICAgICBsZXQgW2ZpZWxkTm8sIHdpcmVUeXBlXSA9IHJlYWRlci50YWcoKTtcbiAgICAgICAgICAgIHN3aXRjaCAoZmllbGRObykge1xuICAgICAgICAgICAgICAgIGNhc2UgLyogc3RyaW5nIHdvcmtmbG93X3J1bl9iYWNrZW5kX2lkICovIDE6XG4gICAgICAgICAgICAgICAgICAgIG1lc3NhZ2Uud29ya2Zsb3dSdW5CYWNrZW5kSWQgPSByZWFkZXIuc3RyaW5nKCk7XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIGNhc2UgLyogc3RyaW5nIHdvcmtmbG93X2pvYl9ydW5fYmFja2VuZF9pZCAqLyAyOlxuICAgICAgICAgICAgICAgICAgICBtZXNzYWdlLndvcmtmbG93Sm9iUnVuQmFja2VuZElkID0gcmVhZGVyLnN0cmluZygpO1xuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICBjYXNlIC8qIHN0cmluZyBuYW1lICovIDM6XG4gICAgICAgICAgICAgICAgICAgIG1lc3NhZ2UubmFtZSA9IHJlYWRlci5zdHJpbmcoKTtcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgY2FzZSAvKiBnb29nbGUucHJvdG9idWYuVGltZXN0YW1wIGV4cGlyZXNfYXQgKi8gNDpcbiAgICAgICAgICAgICAgICAgICAgbWVzc2FnZS5leHBpcmVzQXQgPSB0aW1lc3RhbXBfMS5UaW1lc3RhbXAuaW50ZXJuYWxCaW5hcnlSZWFkKHJlYWRlciwgcmVhZGVyLnVpbnQzMigpLCBvcHRpb25zLCBtZXNzYWdlLmV4cGlyZXNBdCk7XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIGNhc2UgLyogaW50MzIgdmVyc2lvbiAqLyA1OlxuICAgICAgICAgICAgICAgICAgICBtZXNzYWdlLnZlcnNpb24gPSByZWFkZXIuaW50MzIoKTtcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICAgICAgICAgICAgbGV0IHUgPSBvcHRpb25zLnJlYWRVbmtub3duRmllbGQ7XG4gICAgICAgICAgICAgICAgICAgIGlmICh1ID09PSBcInRocm93XCIpXG4gICAgICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgZ2xvYmFsVGhpcy5FcnJvcihgVW5rbm93biBmaWVsZCAke2ZpZWxkTm99ICh3aXJlIHR5cGUgJHt3aXJlVHlwZX0pIGZvciAke3RoaXMudHlwZU5hbWV9YCk7XG4gICAgICAgICAgICAgICAgICAgIGxldCBkID0gcmVhZGVyLnNraXAod2lyZVR5cGUpO1xuICAgICAgICAgICAgICAgICAgICBpZiAodSAhPT0gZmFsc2UpXG4gICAgICAgICAgICAgICAgICAgICAgICAodSA9PT0gdHJ1ZSA/IHJ1bnRpbWVfMi5Vbmtub3duRmllbGRIYW5kbGVyLm9uUmVhZCA6IHUpKHRoaXMudHlwZU5hbWUsIG1lc3NhZ2UsIGZpZWxkTm8sIHdpcmVUeXBlLCBkKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gbWVzc2FnZTtcbiAgICB9XG4gICAgaW50ZXJuYWxCaW5hcnlXcml0ZShtZXNzYWdlLCB3cml0ZXIsIG9wdGlvbnMpIHtcbiAgICAgICAgLyogc3RyaW5nIHdvcmtmbG93X3J1bl9iYWNrZW5kX2lkID0gMTsgKi9cbiAgICAgICAgaWYgKG1lc3NhZ2Uud29ya2Zsb3dSdW5CYWNrZW5kSWQgIT09IFwiXCIpXG4gICAgICAgICAgICB3cml0ZXIudGFnKDEsIHJ1bnRpbWVfMS5XaXJlVHlwZS5MZW5ndGhEZWxpbWl0ZWQpLnN0cmluZyhtZXNzYWdlLndvcmtmbG93UnVuQmFja2VuZElkKTtcbiAgICAgICAgLyogc3RyaW5nIHdvcmtmbG93X2pvYl9ydW5fYmFja2VuZF9pZCA9IDI7ICovXG4gICAgICAgIGlmIChtZXNzYWdlLndvcmtmbG93Sm9iUnVuQmFja2VuZElkICE9PSBcIlwiKVxuICAgICAgICAgICAgd3JpdGVyLnRhZygyLCBydW50aW1lXzEuV2lyZVR5cGUuTGVuZ3RoRGVsaW1pdGVkKS5zdHJpbmcobWVzc2FnZS53b3JrZmxvd0pvYlJ1bkJhY2tlbmRJZCk7XG4gICAgICAgIC8qIHN0cmluZyBuYW1lID0gMzsgKi9cbiAgICAgICAgaWYgKG1lc3NhZ2UubmFtZSAhPT0gXCJcIilcbiAgICAgICAgICAgIHdyaXRlci50YWcoMywgcnVudGltZV8xLldpcmVUeXBlLkxlbmd0aERlbGltaXRlZCkuc3RyaW5nKG1lc3NhZ2UubmFtZSk7XG4gICAgICAgIC8qIGdvb2dsZS5wcm90b2J1Zi5UaW1lc3RhbXAgZXhwaXJlc19hdCA9IDQ7ICovXG4gICAgICAgIGlmIChtZXNzYWdlLmV4cGlyZXNBdClcbiAgICAgICAgICAgIHRpbWVzdGFtcF8xLlRpbWVzdGFtcC5pbnRlcm5hbEJpbmFyeVdyaXRlKG1lc3NhZ2UuZXhwaXJlc0F0LCB3cml0ZXIudGFnKDQsIHJ1bnRpbWVfMS5XaXJlVHlwZS5MZW5ndGhEZWxpbWl0ZWQpLmZvcmsoKSwgb3B0aW9ucykuam9pbigpO1xuICAgICAgICAvKiBpbnQzMiB2ZXJzaW9uID0gNTsgKi9cbiAgICAgICAgaWYgKG1lc3NhZ2UudmVyc2lvbiAhPT0gMClcbiAgICAgICAgICAgIHdyaXRlci50YWcoNSwgcnVudGltZV8xLldpcmVUeXBlLlZhcmludCkuaW50MzIobWVzc2FnZS52ZXJzaW9uKTtcbiAgICAgICAgbGV0IHUgPSBvcHRpb25zLndyaXRlVW5rbm93bkZpZWxkcztcbiAgICAgICAgaWYgKHUgIT09IGZhbHNlKVxuICAgICAgICAgICAgKHUgPT0gdHJ1ZSA/IHJ1bnRpbWVfMi5Vbmtub3duRmllbGRIYW5kbGVyLm9uV3JpdGUgOiB1KSh0aGlzLnR5cGVOYW1lLCBtZXNzYWdlLCB3cml0ZXIpO1xuICAgICAgICByZXR1cm4gd3JpdGVyO1xuICAgIH1cbn1cbi8qKlxuICogQGdlbmVyYXRlZCBNZXNzYWdlVHlwZSBmb3IgcHJvdG9idWYgbWVzc2FnZSBnaXRodWIuYWN0aW9ucy5yZXN1bHRzLmFwaS52MS5DcmVhdGVBcnRpZmFjdFJlcXVlc3RcbiAqL1xuZXhwb3J0cy5DcmVhdGVBcnRpZmFjdFJlcXVlc3QgPSBuZXcgQ3JlYXRlQXJ0aWZhY3RSZXF1ZXN0JFR5cGUoKTtcbi8vIEBnZW5lcmF0ZWQgbWVzc2FnZSB0eXBlIHdpdGggcmVmbGVjdGlvbiBpbmZvcm1hdGlvbiwgbWF5IHByb3ZpZGUgc3BlZWQgb3B0aW1pemVkIG1ldGhvZHNcbmNsYXNzIENyZWF0ZUFydGlmYWN0UmVzcG9uc2UkVHlwZSBleHRlbmRzIHJ1bnRpbWVfNS5NZXNzYWdlVHlwZSB7XG4gICAgY29uc3RydWN0b3IoKSB7XG4gICAgICAgIHN1cGVyKFwiZ2l0aHViLmFjdGlvbnMucmVzdWx0cy5hcGkudjEuQ3JlYXRlQXJ0aWZhY3RSZXNwb25zZVwiLCBbXG4gICAgICAgICAgICB7IG5vOiAxLCBuYW1lOiBcIm9rXCIsIGtpbmQ6IFwic2NhbGFyXCIsIFQ6IDggLypTY2FsYXJUeXBlLkJPT0wqLyB9LFxuICAgICAgICAgICAgeyBubzogMiwgbmFtZTogXCJzaWduZWRfdXBsb2FkX3VybFwiLCBraW5kOiBcInNjYWxhclwiLCBUOiA5IC8qU2NhbGFyVHlwZS5TVFJJTkcqLyB9XG4gICAgICAgIF0pO1xuICAgIH1cbiAgICBjcmVhdGUodmFsdWUpIHtcbiAgICAgICAgY29uc3QgbWVzc2FnZSA9IHsgb2s6IGZhbHNlLCBzaWduZWRVcGxvYWRVcmw6IFwiXCIgfTtcbiAgICAgICAgZ2xvYmFsVGhpcy5PYmplY3QuZGVmaW5lUHJvcGVydHkobWVzc2FnZSwgcnVudGltZV80Lk1FU1NBR0VfVFlQRSwgeyBlbnVtZXJhYmxlOiBmYWxzZSwgdmFsdWU6IHRoaXMgfSk7XG4gICAgICAgIGlmICh2YWx1ZSAhPT0gdW5kZWZpbmVkKVxuICAgICAgICAgICAgKDAsIHJ1bnRpbWVfMy5yZWZsZWN0aW9uTWVyZ2VQYXJ0aWFsKSh0aGlzLCBtZXNzYWdlLCB2YWx1ZSk7XG4gICAgICAgIHJldHVybiBtZXNzYWdlO1xuICAgIH1cbiAgICBpbnRlcm5hbEJpbmFyeVJlYWQocmVhZGVyLCBsZW5ndGgsIG9wdGlvbnMsIHRhcmdldCkge1xuICAgICAgICBsZXQgbWVzc2FnZSA9IHRhcmdldCAhPT0gbnVsbCAmJiB0YXJnZXQgIT09IHZvaWQgMCA/IHRhcmdldCA6IHRoaXMuY3JlYXRlKCksIGVuZCA9IHJlYWRlci5wb3MgKyBsZW5ndGg7XG4gICAgICAgIHdoaWxlIChyZWFkZXIucG9zIDwgZW5kKSB7XG4gICAgICAgICAgICBsZXQgW2ZpZWxkTm8sIHdpcmVUeXBlXSA9IHJlYWRlci50YWcoKTtcbiAgICAgICAgICAgIHN3aXRjaCAoZmllbGRObykge1xuICAgICAgICAgICAgICAgIGNhc2UgLyogYm9vbCBvayAqLyAxOlxuICAgICAgICAgICAgICAgICAgICBtZXNzYWdlLm9rID0gcmVhZGVyLmJvb2woKTtcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgY2FzZSAvKiBzdHJpbmcgc2lnbmVkX3VwbG9hZF91cmwgKi8gMjpcbiAgICAgICAgICAgICAgICAgICAgbWVzc2FnZS5zaWduZWRVcGxvYWRVcmwgPSByZWFkZXIuc3RyaW5nKCk7XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgICAgICAgICAgIGxldCB1ID0gb3B0aW9ucy5yZWFkVW5rbm93bkZpZWxkO1xuICAgICAgICAgICAgICAgICAgICBpZiAodSA9PT0gXCJ0aHJvd1wiKVxuICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IGdsb2JhbFRoaXMuRXJyb3IoYFVua25vd24gZmllbGQgJHtmaWVsZE5vfSAod2lyZSB0eXBlICR7d2lyZVR5cGV9KSBmb3IgJHt0aGlzLnR5cGVOYW1lfWApO1xuICAgICAgICAgICAgICAgICAgICBsZXQgZCA9IHJlYWRlci5za2lwKHdpcmVUeXBlKTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKHUgIT09IGZhbHNlKVxuICAgICAgICAgICAgICAgICAgICAgICAgKHUgPT09IHRydWUgPyBydW50aW1lXzIuVW5rbm93bkZpZWxkSGFuZGxlci5vblJlYWQgOiB1KSh0aGlzLnR5cGVOYW1lLCBtZXNzYWdlLCBmaWVsZE5vLCB3aXJlVHlwZSwgZCk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIG1lc3NhZ2U7XG4gICAgfVxuICAgIGludGVybmFsQmluYXJ5V3JpdGUobWVzc2FnZSwgd3JpdGVyLCBvcHRpb25zKSB7XG4gICAgICAgIC8qIGJvb2wgb2sgPSAxOyAqL1xuICAgICAgICBpZiAobWVzc2FnZS5vayAhPT0gZmFsc2UpXG4gICAgICAgICAgICB3cml0ZXIudGFnKDEsIHJ1bnRpbWVfMS5XaXJlVHlwZS5WYXJpbnQpLmJvb2wobWVzc2FnZS5vayk7XG4gICAgICAgIC8qIHN0cmluZyBzaWduZWRfdXBsb2FkX3VybCA9IDI7ICovXG4gICAgICAgIGlmIChtZXNzYWdlLnNpZ25lZFVwbG9hZFVybCAhPT0gXCJcIilcbiAgICAgICAgICAgIHdyaXRlci50YWcoMiwgcnVudGltZV8xLldpcmVUeXBlLkxlbmd0aERlbGltaXRlZCkuc3RyaW5nKG1lc3NhZ2Uuc2lnbmVkVXBsb2FkVXJsKTtcbiAgICAgICAgbGV0IHUgPSBvcHRpb25zLndyaXRlVW5rbm93bkZpZWxkcztcbiAgICAgICAgaWYgKHUgIT09IGZhbHNlKVxuICAgICAgICAgICAgKHUgPT0gdHJ1ZSA/IHJ1bnRpbWVfMi5Vbmtub3duRmllbGRIYW5kbGVyLm9uV3JpdGUgOiB1KSh0aGlzLnR5cGVOYW1lLCBtZXNzYWdlLCB3cml0ZXIpO1xuICAgICAgICByZXR1cm4gd3JpdGVyO1xuICAgIH1cbn1cbi8qKlxuICogQGdlbmVyYXRlZCBNZXNzYWdlVHlwZSBmb3IgcHJvdG9idWYgbWVzc2FnZSBnaXRodWIuYWN0aW9ucy5yZXN1bHRzLmFwaS52MS5DcmVhdGVBcnRpZmFjdFJlc3BvbnNlXG4gKi9cbmV4cG9ydHMuQ3JlYXRlQXJ0aWZhY3RSZXNwb25zZSA9IG5ldyBDcmVhdGVBcnRpZmFjdFJlc3BvbnNlJFR5cGUoKTtcbi8vIEBnZW5lcmF0ZWQgbWVzc2FnZSB0eXBlIHdpdGggcmVmbGVjdGlvbiBpbmZvcm1hdGlvbiwgbWF5IHByb3ZpZGUgc3BlZWQgb3B0aW1pemVkIG1ldGhvZHNcbmNsYXNzIEZpbmFsaXplQXJ0aWZhY3RSZXF1ZXN0JFR5cGUgZXh0ZW5kcyBydW50aW1lXzUuTWVzc2FnZVR5cGUge1xuICAgIGNvbnN0cnVjdG9yKCkge1xuICAgICAgICBzdXBlcihcImdpdGh1Yi5hY3Rpb25zLnJlc3VsdHMuYXBpLnYxLkZpbmFsaXplQXJ0aWZhY3RSZXF1ZXN0XCIsIFtcbiAgICAgICAgICAgIHsgbm86IDEsIG5hbWU6IFwid29ya2Zsb3dfcnVuX2JhY2tlbmRfaWRcIiwga2luZDogXCJzY2FsYXJcIiwgVDogOSAvKlNjYWxhclR5cGUuU1RSSU5HKi8gfSxcbiAgICAgICAgICAgIHsgbm86IDIsIG5hbWU6IFwid29ya2Zsb3dfam9iX3J1bl9iYWNrZW5kX2lkXCIsIGtpbmQ6IFwic2NhbGFyXCIsIFQ6IDkgLypTY2FsYXJUeXBlLlNUUklORyovIH0sXG4gICAgICAgICAgICB7IG5vOiAzLCBuYW1lOiBcIm5hbWVcIiwga2luZDogXCJzY2FsYXJcIiwgVDogOSAvKlNjYWxhclR5cGUuU1RSSU5HKi8gfSxcbiAgICAgICAgICAgIHsgbm86IDQsIG5hbWU6IFwic2l6ZVwiLCBraW5kOiBcInNjYWxhclwiLCBUOiAzIC8qU2NhbGFyVHlwZS5JTlQ2NCovIH0sXG4gICAgICAgICAgICB7IG5vOiA1LCBuYW1lOiBcImhhc2hcIiwga2luZDogXCJtZXNzYWdlXCIsIFQ6ICgpID0+IHdyYXBwZXJzXzIuU3RyaW5nVmFsdWUgfVxuICAgICAgICBdKTtcbiAgICB9XG4gICAgY3JlYXRlKHZhbHVlKSB7XG4gICAgICAgIGNvbnN0IG1lc3NhZ2UgPSB7IHdvcmtmbG93UnVuQmFja2VuZElkOiBcIlwiLCB3b3JrZmxvd0pvYlJ1bkJhY2tlbmRJZDogXCJcIiwgbmFtZTogXCJcIiwgc2l6ZTogXCIwXCIgfTtcbiAgICAgICAgZ2xvYmFsVGhpcy5PYmplY3QuZGVmaW5lUHJvcGVydHkobWVzc2FnZSwgcnVudGltZV80Lk1FU1NBR0VfVFlQRSwgeyBlbnVtZXJhYmxlOiBmYWxzZSwgdmFsdWU6IHRoaXMgfSk7XG4gICAgICAgIGlmICh2YWx1ZSAhPT0gdW5kZWZpbmVkKVxuICAgICAgICAgICAgKDAsIHJ1bnRpbWVfMy5yZWZsZWN0aW9uTWVyZ2VQYXJ0aWFsKSh0aGlzLCBtZXNzYWdlLCB2YWx1ZSk7XG4gICAgICAgIHJldHVybiBtZXNzYWdlO1xuICAgIH1cbiAgICBpbnRlcm5hbEJpbmFyeVJlYWQocmVhZGVyLCBsZW5ndGgsIG9wdGlvbnMsIHRhcmdldCkge1xuICAgICAgICBsZXQgbWVzc2FnZSA9IHRhcmdldCAhPT0gbnVsbCAmJiB0YXJnZXQgIT09IHZvaWQgMCA/IHRhcmdldCA6IHRoaXMuY3JlYXRlKCksIGVuZCA9IHJlYWRlci5wb3MgKyBsZW5ndGg7XG4gICAgICAgIHdoaWxlIChyZWFkZXIucG9zIDwgZW5kKSB7XG4gICAgICAgICAgICBsZXQgW2ZpZWxkTm8sIHdpcmVUeXBlXSA9IHJlYWRlci50YWcoKTtcbiAgICAgICAgICAgIHN3aXRjaCAoZmllbGRObykge1xuICAgICAgICAgICAgICAgIGNhc2UgLyogc3RyaW5nIHdvcmtmbG93X3J1bl9iYWNrZW5kX2lkICovIDE6XG4gICAgICAgICAgICAgICAgICAgIG1lc3NhZ2Uud29ya2Zsb3dSdW5CYWNrZW5kSWQgPSByZWFkZXIuc3RyaW5nKCk7XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIGNhc2UgLyogc3RyaW5nIHdvcmtmbG93X2pvYl9ydW5fYmFja2VuZF9pZCAqLyAyOlxuICAgICAgICAgICAgICAgICAgICBtZXNzYWdlLndvcmtmbG93Sm9iUnVuQmFja2VuZElkID0gcmVhZGVyLnN0cmluZygpO1xuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICBjYXNlIC8qIHN0cmluZyBuYW1lICovIDM6XG4gICAgICAgICAgICAgICAgICAgIG1lc3NhZ2UubmFtZSA9IHJlYWRlci5zdHJpbmcoKTtcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgY2FzZSAvKiBpbnQ2NCBzaXplICovIDQ6XG4gICAgICAgICAgICAgICAgICAgIG1lc3NhZ2Uuc2l6ZSA9IHJlYWRlci5pbnQ2NCgpLnRvU3RyaW5nKCk7XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIGNhc2UgLyogZ29vZ2xlLnByb3RvYnVmLlN0cmluZ1ZhbHVlIGhhc2ggKi8gNTpcbiAgICAgICAgICAgICAgICAgICAgbWVzc2FnZS5oYXNoID0gd3JhcHBlcnNfMi5TdHJpbmdWYWx1ZS5pbnRlcm5hbEJpbmFyeVJlYWQocmVhZGVyLCByZWFkZXIudWludDMyKCksIG9wdGlvbnMsIG1lc3NhZ2UuaGFzaCk7XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgICAgICAgICAgIGxldCB1ID0gb3B0aW9ucy5yZWFkVW5rbm93bkZpZWxkO1xuICAgICAgICAgICAgICAgICAgICBpZiAodSA9PT0gXCJ0aHJvd1wiKVxuICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IGdsb2JhbFRoaXMuRXJyb3IoYFVua25vd24gZmllbGQgJHtmaWVsZE5vfSAod2lyZSB0eXBlICR7d2lyZVR5cGV9KSBmb3IgJHt0aGlzLnR5cGVOYW1lfWApO1xuICAgICAgICAgICAgICAgICAgICBsZXQgZCA9IHJlYWRlci5za2lwKHdpcmVUeXBlKTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKHUgIT09IGZhbHNlKVxuICAgICAgICAgICAgICAgICAgICAgICAgKHUgPT09IHRydWUgPyBydW50aW1lXzIuVW5rbm93bkZpZWxkSGFuZGxlci5vblJlYWQgOiB1KSh0aGlzLnR5cGVOYW1lLCBtZXNzYWdlLCBmaWVsZE5vLCB3aXJlVHlwZSwgZCk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIG1lc3NhZ2U7XG4gICAgfVxuICAgIGludGVybmFsQmluYXJ5V3JpdGUobWVzc2FnZSwgd3JpdGVyLCBvcHRpb25zKSB7XG4gICAgICAgIC8qIHN0cmluZyB3b3JrZmxvd19ydW5fYmFja2VuZF9pZCA9IDE7ICovXG4gICAgICAgIGlmIChtZXNzYWdlLndvcmtmbG93UnVuQmFja2VuZElkICE9PSBcIlwiKVxuICAgICAgICAgICAgd3JpdGVyLnRhZygxLCBydW50aW1lXzEuV2lyZVR5cGUuTGVuZ3RoRGVsaW1pdGVkKS5zdHJpbmcobWVzc2FnZS53b3JrZmxvd1J1bkJhY2tlbmRJZCk7XG4gICAgICAgIC8qIHN0cmluZyB3b3JrZmxvd19qb2JfcnVuX2JhY2tlbmRfaWQgPSAyOyAqL1xuICAgICAgICBpZiAobWVzc2FnZS53b3JrZmxvd0pvYlJ1bkJhY2tlbmRJZCAhPT0gXCJcIilcbiAgICAgICAgICAgIHdyaXRlci50YWcoMiwgcnVudGltZV8xLldpcmVUeXBlLkxlbmd0aERlbGltaXRlZCkuc3RyaW5nKG1lc3NhZ2Uud29ya2Zsb3dKb2JSdW5CYWNrZW5kSWQpO1xuICAgICAgICAvKiBzdHJpbmcgbmFtZSA9IDM7ICovXG4gICAgICAgIGlmIChtZXNzYWdlLm5hbWUgIT09IFwiXCIpXG4gICAgICAgICAgICB3cml0ZXIudGFnKDMsIHJ1bnRpbWVfMS5XaXJlVHlwZS5MZW5ndGhEZWxpbWl0ZWQpLnN0cmluZyhtZXNzYWdlLm5hbWUpO1xuICAgICAgICAvKiBpbnQ2NCBzaXplID0gNDsgKi9cbiAgICAgICAgaWYgKG1lc3NhZ2Uuc2l6ZSAhPT0gXCIwXCIpXG4gICAgICAgICAgICB3cml0ZXIudGFnKDQsIHJ1bnRpbWVfMS5XaXJlVHlwZS5WYXJpbnQpLmludDY0KG1lc3NhZ2Uuc2l6ZSk7XG4gICAgICAgIC8qIGdvb2dsZS5wcm90b2J1Zi5TdHJpbmdWYWx1ZSBoYXNoID0gNTsgKi9cbiAgICAgICAgaWYgKG1lc3NhZ2UuaGFzaClcbiAgICAgICAgICAgIHdyYXBwZXJzXzIuU3RyaW5nVmFsdWUuaW50ZXJuYWxCaW5hcnlXcml0ZShtZXNzYWdlLmhhc2gsIHdyaXRlci50YWcoNSwgcnVudGltZV8xLldpcmVUeXBlLkxlbmd0aERlbGltaXRlZCkuZm9yaygpLCBvcHRpb25zKS5qb2luKCk7XG4gICAgICAgIGxldCB1ID0gb3B0aW9ucy53cml0ZVVua25vd25GaWVsZHM7XG4gICAgICAgIGlmICh1ICE9PSBmYWxzZSlcbiAgICAgICAgICAgICh1ID09IHRydWUgPyBydW50aW1lXzIuVW5rbm93bkZpZWxkSGFuZGxlci5vbldyaXRlIDogdSkodGhpcy50eXBlTmFtZSwgbWVzc2FnZSwgd3JpdGVyKTtcbiAgICAgICAgcmV0dXJuIHdyaXRlcjtcbiAgICB9XG59XG4vKipcbiAqIEBnZW5lcmF0ZWQgTWVzc2FnZVR5cGUgZm9yIHByb3RvYnVmIG1lc3NhZ2UgZ2l0aHViLmFjdGlvbnMucmVzdWx0cy5hcGkudjEuRmluYWxpemVBcnRpZmFjdFJlcXVlc3RcbiAqL1xuZXhwb3J0cy5GaW5hbGl6ZUFydGlmYWN0UmVxdWVzdCA9IG5ldyBGaW5hbGl6ZUFydGlmYWN0UmVxdWVzdCRUeXBlKCk7XG4vLyBAZ2VuZXJhdGVkIG1lc3NhZ2UgdHlwZSB3aXRoIHJlZmxlY3Rpb24gaW5mb3JtYXRpb24sIG1heSBwcm92aWRlIHNwZWVkIG9wdGltaXplZCBtZXRob2RzXG5jbGFzcyBGaW5hbGl6ZUFydGlmYWN0UmVzcG9uc2UkVHlwZSBleHRlbmRzIHJ1bnRpbWVfNS5NZXNzYWdlVHlwZSB7XG4gICAgY29uc3RydWN0b3IoKSB7XG4gICAgICAgIHN1cGVyKFwiZ2l0aHViLmFjdGlvbnMucmVzdWx0cy5hcGkudjEuRmluYWxpemVBcnRpZmFjdFJlc3BvbnNlXCIsIFtcbiAgICAgICAgICAgIHsgbm86IDEsIG5hbWU6IFwib2tcIiwga2luZDogXCJzY2FsYXJcIiwgVDogOCAvKlNjYWxhclR5cGUuQk9PTCovIH0sXG4gICAgICAgICAgICB7IG5vOiAyLCBuYW1lOiBcImFydGlmYWN0X2lkXCIsIGtpbmQ6IFwic2NhbGFyXCIsIFQ6IDMgLypTY2FsYXJUeXBlLklOVDY0Ki8gfVxuICAgICAgICBdKTtcbiAgICB9XG4gICAgY3JlYXRlKHZhbHVlKSB7XG4gICAgICAgIGNvbnN0IG1lc3NhZ2UgPSB7IG9rOiBmYWxzZSwgYXJ0aWZhY3RJZDogXCIwXCIgfTtcbiAgICAgICAgZ2xvYmFsVGhpcy5PYmplY3QuZGVmaW5lUHJvcGVydHkobWVzc2FnZSwgcnVudGltZV80Lk1FU1NBR0VfVFlQRSwgeyBlbnVtZXJhYmxlOiBmYWxzZSwgdmFsdWU6IHRoaXMgfSk7XG4gICAgICAgIGlmICh2YWx1ZSAhPT0gdW5kZWZpbmVkKVxuICAgICAgICAgICAgKDAsIHJ1bnRpbWVfMy5yZWZsZWN0aW9uTWVyZ2VQYXJ0aWFsKSh0aGlzLCBtZXNzYWdlLCB2YWx1ZSk7XG4gICAgICAgIHJldHVybiBtZXNzYWdlO1xuICAgIH1cbiAgICBpbnRlcm5hbEJpbmFyeVJlYWQocmVhZGVyLCBsZW5ndGgsIG9wdGlvbnMsIHRhcmdldCkge1xuICAgICAgICBsZXQgbWVzc2FnZSA9IHRhcmdldCAhPT0gbnVsbCAmJiB0YXJnZXQgIT09IHZvaWQgMCA/IHRhcmdldCA6IHRoaXMuY3JlYXRlKCksIGVuZCA9IHJlYWRlci5wb3MgKyBsZW5ndGg7XG4gICAgICAgIHdoaWxlIChyZWFkZXIucG9zIDwgZW5kKSB7XG4gICAgICAgICAgICBsZXQgW2ZpZWxkTm8sIHdpcmVUeXBlXSA9IHJlYWRlci50YWcoKTtcbiAgICAgICAgICAgIHN3aXRjaCAoZmllbGRObykge1xuICAgICAgICAgICAgICAgIGNhc2UgLyogYm9vbCBvayAqLyAxOlxuICAgICAgICAgICAgICAgICAgICBtZXNzYWdlLm9rID0gcmVhZGVyLmJvb2woKTtcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgY2FzZSAvKiBpbnQ2NCBhcnRpZmFjdF9pZCAqLyAyOlxuICAgICAgICAgICAgICAgICAgICBtZXNzYWdlLmFydGlmYWN0SWQgPSByZWFkZXIuaW50NjQoKS50b1N0cmluZygpO1xuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgICAgICAgICAgICBsZXQgdSA9IG9wdGlvbnMucmVhZFVua25vd25GaWVsZDtcbiAgICAgICAgICAgICAgICAgICAgaWYgKHUgPT09IFwidGhyb3dcIilcbiAgICAgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBnbG9iYWxUaGlzLkVycm9yKGBVbmtub3duIGZpZWxkICR7ZmllbGROb30gKHdpcmUgdHlwZSAke3dpcmVUeXBlfSkgZm9yICR7dGhpcy50eXBlTmFtZX1gKTtcbiAgICAgICAgICAgICAgICAgICAgbGV0IGQgPSByZWFkZXIuc2tpcCh3aXJlVHlwZSk7XG4gICAgICAgICAgICAgICAgICAgIGlmICh1ICE9PSBmYWxzZSlcbiAgICAgICAgICAgICAgICAgICAgICAgICh1ID09PSB0cnVlID8gcnVudGltZV8yLlVua25vd25GaWVsZEhhbmRsZXIub25SZWFkIDogdSkodGhpcy50eXBlTmFtZSwgbWVzc2FnZSwgZmllbGRObywgd2lyZVR5cGUsIGQpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiBtZXNzYWdlO1xuICAgIH1cbiAgICBpbnRlcm5hbEJpbmFyeVdyaXRlKG1lc3NhZ2UsIHdyaXRlciwgb3B0aW9ucykge1xuICAgICAgICAvKiBib29sIG9rID0gMTsgKi9cbiAgICAgICAgaWYgKG1lc3NhZ2Uub2sgIT09IGZhbHNlKVxuICAgICAgICAgICAgd3JpdGVyLnRhZygxLCBydW50aW1lXzEuV2lyZVR5cGUuVmFyaW50KS5ib29sKG1lc3NhZ2Uub2spO1xuICAgICAgICAvKiBpbnQ2NCBhcnRpZmFjdF9pZCA9IDI7ICovXG4gICAgICAgIGlmIChtZXNzYWdlLmFydGlmYWN0SWQgIT09IFwiMFwiKVxuICAgICAgICAgICAgd3JpdGVyLnRhZygyLCBydW50aW1lXzEuV2lyZVR5cGUuVmFyaW50KS5pbnQ2NChtZXNzYWdlLmFydGlmYWN0SWQpO1xuICAgICAgICBsZXQgdSA9IG9wdGlvbnMud3JpdGVVbmtub3duRmllbGRzO1xuICAgICAgICBpZiAodSAhPT0gZmFsc2UpXG4gICAgICAgICAgICAodSA9PSB0cnVlID8gcnVudGltZV8yLlVua25vd25GaWVsZEhhbmRsZXIub25Xcml0ZSA6IHUpKHRoaXMudHlwZU5hbWUsIG1lc3NhZ2UsIHdyaXRlcik7XG4gICAgICAgIHJldHVybiB3cml0ZXI7XG4gICAgfVxufVxuLyoqXG4gKiBAZ2VuZXJhdGVkIE1lc3NhZ2VUeXBlIGZvciBwcm90b2J1ZiBtZXNzYWdlIGdpdGh1Yi5hY3Rpb25zLnJlc3VsdHMuYXBpLnYxLkZpbmFsaXplQXJ0aWZhY3RSZXNwb25zZVxuICovXG5leHBvcnRzLkZpbmFsaXplQXJ0aWZhY3RSZXNwb25zZSA9IG5ldyBGaW5hbGl6ZUFydGlmYWN0UmVzcG9uc2UkVHlwZSgpO1xuLy8gQGdlbmVyYXRlZCBtZXNzYWdlIHR5cGUgd2l0aCByZWZsZWN0aW9uIGluZm9ybWF0aW9uLCBtYXkgcHJvdmlkZSBzcGVlZCBvcHRpbWl6ZWQgbWV0aG9kc1xuY2xhc3MgTGlzdEFydGlmYWN0c1JlcXVlc3QkVHlwZSBleHRlbmRzIHJ1bnRpbWVfNS5NZXNzYWdlVHlwZSB7XG4gICAgY29uc3RydWN0b3IoKSB7XG4gICAgICAgIHN1cGVyKFwiZ2l0aHViLmFjdGlvbnMucmVzdWx0cy5hcGkudjEuTGlzdEFydGlmYWN0c1JlcXVlc3RcIiwgW1xuICAgICAgICAgICAgeyBubzogMSwgbmFtZTogXCJ3b3JrZmxvd19ydW5fYmFja2VuZF9pZFwiLCBraW5kOiBcInNjYWxhclwiLCBUOiA5IC8qU2NhbGFyVHlwZS5TVFJJTkcqLyB9LFxuICAgICAgICAgICAgeyBubzogMiwgbmFtZTogXCJ3b3JrZmxvd19qb2JfcnVuX2JhY2tlbmRfaWRcIiwga2luZDogXCJzY2FsYXJcIiwgVDogOSAvKlNjYWxhclR5cGUuU1RSSU5HKi8gfSxcbiAgICAgICAgICAgIHsgbm86IDMsIG5hbWU6IFwibmFtZV9maWx0ZXJcIiwga2luZDogXCJtZXNzYWdlXCIsIFQ6ICgpID0+IHdyYXBwZXJzXzIuU3RyaW5nVmFsdWUgfSxcbiAgICAgICAgICAgIHsgbm86IDQsIG5hbWU6IFwiaWRfZmlsdGVyXCIsIGtpbmQ6IFwibWVzc2FnZVwiLCBUOiAoKSA9PiB3cmFwcGVyc18xLkludDY0VmFsdWUgfVxuICAgICAgICBdKTtcbiAgICB9XG4gICAgY3JlYXRlKHZhbHVlKSB7XG4gICAgICAgIGNvbnN0IG1lc3NhZ2UgPSB7IHdvcmtmbG93UnVuQmFja2VuZElkOiBcIlwiLCB3b3JrZmxvd0pvYlJ1bkJhY2tlbmRJZDogXCJcIiB9O1xuICAgICAgICBnbG9iYWxUaGlzLk9iamVjdC5kZWZpbmVQcm9wZXJ0eShtZXNzYWdlLCBydW50aW1lXzQuTUVTU0FHRV9UWVBFLCB7IGVudW1lcmFibGU6IGZhbHNlLCB2YWx1ZTogdGhpcyB9KTtcbiAgICAgICAgaWYgKHZhbHVlICE9PSB1bmRlZmluZWQpXG4gICAgICAgICAgICAoMCwgcnVudGltZV8zLnJlZmxlY3Rpb25NZXJnZVBhcnRpYWwpKHRoaXMsIG1lc3NhZ2UsIHZhbHVlKTtcbiAgICAgICAgcmV0dXJuIG1lc3NhZ2U7XG4gICAgfVxuICAgIGludGVybmFsQmluYXJ5UmVhZChyZWFkZXIsIGxlbmd0aCwgb3B0aW9ucywgdGFyZ2V0KSB7XG4gICAgICAgIGxldCBtZXNzYWdlID0gdGFyZ2V0ICE9PSBudWxsICYmIHRhcmdldCAhPT0gdm9pZCAwID8gdGFyZ2V0IDogdGhpcy5jcmVhdGUoKSwgZW5kID0gcmVhZGVyLnBvcyArIGxlbmd0aDtcbiAgICAgICAgd2hpbGUgKHJlYWRlci5wb3MgPCBlbmQpIHtcbiAgICAgICAgICAgIGxldCBbZmllbGRObywgd2lyZVR5cGVdID0gcmVhZGVyLnRhZygpO1xuICAgICAgICAgICAgc3dpdGNoIChmaWVsZE5vKSB7XG4gICAgICAgICAgICAgICAgY2FzZSAvKiBzdHJpbmcgd29ya2Zsb3dfcnVuX2JhY2tlbmRfaWQgKi8gMTpcbiAgICAgICAgICAgICAgICAgICAgbWVzc2FnZS53b3JrZmxvd1J1bkJhY2tlbmRJZCA9IHJlYWRlci5zdHJpbmcoKTtcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgY2FzZSAvKiBzdHJpbmcgd29ya2Zsb3dfam9iX3J1bl9iYWNrZW5kX2lkICovIDI6XG4gICAgICAgICAgICAgICAgICAgIG1lc3NhZ2Uud29ya2Zsb3dKb2JSdW5CYWNrZW5kSWQgPSByZWFkZXIuc3RyaW5nKCk7XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIGNhc2UgLyogZ29vZ2xlLnByb3RvYnVmLlN0cmluZ1ZhbHVlIG5hbWVfZmlsdGVyICovIDM6XG4gICAgICAgICAgICAgICAgICAgIG1lc3NhZ2UubmFtZUZpbHRlciA9IHdyYXBwZXJzXzIuU3RyaW5nVmFsdWUuaW50ZXJuYWxCaW5hcnlSZWFkKHJlYWRlciwgcmVhZGVyLnVpbnQzMigpLCBvcHRpb25zLCBtZXNzYWdlLm5hbWVGaWx0ZXIpO1xuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICBjYXNlIC8qIGdvb2dsZS5wcm90b2J1Zi5JbnQ2NFZhbHVlIGlkX2ZpbHRlciAqLyA0OlxuICAgICAgICAgICAgICAgICAgICBtZXNzYWdlLmlkRmlsdGVyID0gd3JhcHBlcnNfMS5JbnQ2NFZhbHVlLmludGVybmFsQmluYXJ5UmVhZChyZWFkZXIsIHJlYWRlci51aW50MzIoKSwgb3B0aW9ucywgbWVzc2FnZS5pZEZpbHRlcik7XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgICAgICAgICAgIGxldCB1ID0gb3B0aW9ucy5yZWFkVW5rbm93bkZpZWxkO1xuICAgICAgICAgICAgICAgICAgICBpZiAodSA9PT0gXCJ0aHJvd1wiKVxuICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IGdsb2JhbFRoaXMuRXJyb3IoYFVua25vd24gZmllbGQgJHtmaWVsZE5vfSAod2lyZSB0eXBlICR7d2lyZVR5cGV9KSBmb3IgJHt0aGlzLnR5cGVOYW1lfWApO1xuICAgICAgICAgICAgICAgICAgICBsZXQgZCA9IHJlYWRlci5za2lwKHdpcmVUeXBlKTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKHUgIT09IGZhbHNlKVxuICAgICAgICAgICAgICAgICAgICAgICAgKHUgPT09IHRydWUgPyBydW50aW1lXzIuVW5rbm93bkZpZWxkSGFuZGxlci5vblJlYWQgOiB1KSh0aGlzLnR5cGVOYW1lLCBtZXNzYWdlLCBmaWVsZE5vLCB3aXJlVHlwZSwgZCk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIG1lc3NhZ2U7XG4gICAgfVxuICAgIGludGVybmFsQmluYXJ5V3JpdGUobWVzc2FnZSwgd3JpdGVyLCBvcHRpb25zKSB7XG4gICAgICAgIC8qIHN0cmluZyB3b3JrZmxvd19ydW5fYmFja2VuZF9pZCA9IDE7ICovXG4gICAgICAgIGlmIChtZXNzYWdlLndvcmtmbG93UnVuQmFja2VuZElkICE9PSBcIlwiKVxuICAgICAgICAgICAgd3JpdGVyLnRhZygxLCBydW50aW1lXzEuV2lyZVR5cGUuTGVuZ3RoRGVsaW1pdGVkKS5zdHJpbmcobWVzc2FnZS53b3JrZmxvd1J1bkJhY2tlbmRJZCk7XG4gICAgICAgIC8qIHN0cmluZyB3b3JrZmxvd19qb2JfcnVuX2JhY2tlbmRfaWQgPSAyOyAqL1xuICAgICAgICBpZiAobWVzc2FnZS53b3JrZmxvd0pvYlJ1bkJhY2tlbmRJZCAhPT0gXCJcIilcbiAgICAgICAgICAgIHdyaXRlci50YWcoMiwgcnVudGltZV8xLldpcmVUeXBlLkxlbmd0aERlbGltaXRlZCkuc3RyaW5nKG1lc3NhZ2Uud29ya2Zsb3dKb2JSdW5CYWNrZW5kSWQpO1xuICAgICAgICAvKiBnb29nbGUucHJvdG9idWYuU3RyaW5nVmFsdWUgbmFtZV9maWx0ZXIgPSAzOyAqL1xuICAgICAgICBpZiAobWVzc2FnZS5uYW1lRmlsdGVyKVxuICAgICAgICAgICAgd3JhcHBlcnNfMi5TdHJpbmdWYWx1ZS5pbnRlcm5hbEJpbmFyeVdyaXRlKG1lc3NhZ2UubmFtZUZpbHRlciwgd3JpdGVyLnRhZygzLCBydW50aW1lXzEuV2lyZVR5cGUuTGVuZ3RoRGVsaW1pdGVkKS5mb3JrKCksIG9wdGlvbnMpLmpvaW4oKTtcbiAgICAgICAgLyogZ29vZ2xlLnByb3RvYnVmLkludDY0VmFsdWUgaWRfZmlsdGVyID0gNDsgKi9cbiAgICAgICAgaWYgKG1lc3NhZ2UuaWRGaWx0ZXIpXG4gICAgICAgICAgICB3cmFwcGVyc18xLkludDY0VmFsdWUuaW50ZXJuYWxCaW5hcnlXcml0ZShtZXNzYWdlLmlkRmlsdGVyLCB3cml0ZXIudGFnKDQsIHJ1bnRpbWVfMS5XaXJlVHlwZS5MZW5ndGhEZWxpbWl0ZWQpLmZvcmsoKSwgb3B0aW9ucykuam9pbigpO1xuICAgICAgICBsZXQgdSA9IG9wdGlvbnMud3JpdGVVbmtub3duRmllbGRzO1xuICAgICAgICBpZiAodSAhPT0gZmFsc2UpXG4gICAgICAgICAgICAodSA9PSB0cnVlID8gcnVudGltZV8yLlVua25vd25GaWVsZEhhbmRsZXIub25Xcml0ZSA6IHUpKHRoaXMudHlwZU5hbWUsIG1lc3NhZ2UsIHdyaXRlcik7XG4gICAgICAgIHJldHVybiB3cml0ZXI7XG4gICAgfVxufVxuLyoqXG4gKiBAZ2VuZXJhdGVkIE1lc3NhZ2VUeXBlIGZvciBwcm90b2J1ZiBtZXNzYWdlIGdpdGh1Yi5hY3Rpb25zLnJlc3VsdHMuYXBpLnYxLkxpc3RBcnRpZmFjdHNSZXF1ZXN0XG4gKi9cbmV4cG9ydHMuTGlzdEFydGlmYWN0c1JlcXVlc3QgPSBuZXcgTGlzdEFydGlmYWN0c1JlcXVlc3QkVHlwZSgpO1xuLy8gQGdlbmVyYXRlZCBtZXNzYWdlIHR5cGUgd2l0aCByZWZsZWN0aW9uIGluZm9ybWF0aW9uLCBtYXkgcHJvdmlkZSBzcGVlZCBvcHRpbWl6ZWQgbWV0aG9kc1xuY2xhc3MgTGlzdEFydGlmYWN0c1Jlc3BvbnNlJFR5cGUgZXh0ZW5kcyBydW50aW1lXzUuTWVzc2FnZVR5cGUge1xuICAgIGNvbnN0cnVjdG9yKCkge1xuICAgICAgICBzdXBlcihcImdpdGh1Yi5hY3Rpb25zLnJlc3VsdHMuYXBpLnYxLkxpc3RBcnRpZmFjdHNSZXNwb25zZVwiLCBbXG4gICAgICAgICAgICB7IG5vOiAxLCBuYW1lOiBcImFydGlmYWN0c1wiLCBraW5kOiBcIm1lc3NhZ2VcIiwgcmVwZWF0OiAxIC8qUmVwZWF0VHlwZS5QQUNLRUQqLywgVDogKCkgPT4gZXhwb3J0cy5MaXN0QXJ0aWZhY3RzUmVzcG9uc2VfTW9ub2xpdGhBcnRpZmFjdCB9XG4gICAgICAgIF0pO1xuICAgIH1cbiAgICBjcmVhdGUodmFsdWUpIHtcbiAgICAgICAgY29uc3QgbWVzc2FnZSA9IHsgYXJ0aWZhY3RzOiBbXSB9O1xuICAgICAgICBnbG9iYWxUaGlzLk9iamVjdC5kZWZpbmVQcm9wZXJ0eShtZXNzYWdlLCBydW50aW1lXzQuTUVTU0FHRV9UWVBFLCB7IGVudW1lcmFibGU6IGZhbHNlLCB2YWx1ZTogdGhpcyB9KTtcbiAgICAgICAgaWYgKHZhbHVlICE9PSB1bmRlZmluZWQpXG4gICAgICAgICAgICAoMCwgcnVudGltZV8zLnJlZmxlY3Rpb25NZXJnZVBhcnRpYWwpKHRoaXMsIG1lc3NhZ2UsIHZhbHVlKTtcbiAgICAgICAgcmV0dXJuIG1lc3NhZ2U7XG4gICAgfVxuICAgIGludGVybmFsQmluYXJ5UmVhZChyZWFkZXIsIGxlbmd0aCwgb3B0aW9ucywgdGFyZ2V0KSB7XG4gICAgICAgIGxldCBtZXNzYWdlID0gdGFyZ2V0ICE9PSBudWxsICYmIHRhcmdldCAhPT0gdm9pZCAwID8gdGFyZ2V0IDogdGhpcy5jcmVhdGUoKSwgZW5kID0gcmVhZGVyLnBvcyArIGxlbmd0aDtcbiAgICAgICAgd2hpbGUgKHJlYWRlci5wb3MgPCBlbmQpIHtcbiAgICAgICAgICAgIGxldCBbZmllbGRObywgd2lyZVR5cGVdID0gcmVhZGVyLnRhZygpO1xuICAgICAgICAgICAgc3dpdGNoIChmaWVsZE5vKSB7XG4gICAgICAgICAgICAgICAgY2FzZSAvKiByZXBlYXRlZCBnaXRodWIuYWN0aW9ucy5yZXN1bHRzLmFwaS52MS5MaXN0QXJ0aWZhY3RzUmVzcG9uc2UuTW9ub2xpdGhBcnRpZmFjdCBhcnRpZmFjdHMgKi8gMTpcbiAgICAgICAgICAgICAgICAgICAgbWVzc2FnZS5hcnRpZmFjdHMucHVzaChleHBvcnRzLkxpc3RBcnRpZmFjdHNSZXNwb25zZV9Nb25vbGl0aEFydGlmYWN0LmludGVybmFsQmluYXJ5UmVhZChyZWFkZXIsIHJlYWRlci51aW50MzIoKSwgb3B0aW9ucykpO1xuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgICAgICAgICAgICBsZXQgdSA9IG9wdGlvbnMucmVhZFVua25vd25GaWVsZDtcbiAgICAgICAgICAgICAgICAgICAgaWYgKHUgPT09IFwidGhyb3dcIilcbiAgICAgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBnbG9iYWxUaGlzLkVycm9yKGBVbmtub3duIGZpZWxkICR7ZmllbGROb30gKHdpcmUgdHlwZSAke3dpcmVUeXBlfSkgZm9yICR7dGhpcy50eXBlTmFtZX1gKTtcbiAgICAgICAgICAgICAgICAgICAgbGV0IGQgPSByZWFkZXIuc2tpcCh3aXJlVHlwZSk7XG4gICAgICAgICAgICAgICAgICAgIGlmICh1ICE9PSBmYWxzZSlcbiAgICAgICAgICAgICAgICAgICAgICAgICh1ID09PSB0cnVlID8gcnVudGltZV8yLlVua25vd25GaWVsZEhhbmRsZXIub25SZWFkIDogdSkodGhpcy50eXBlTmFtZSwgbWVzc2FnZSwgZmllbGRObywgd2lyZVR5cGUsIGQpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiBtZXNzYWdlO1xuICAgIH1cbiAgICBpbnRlcm5hbEJpbmFyeVdyaXRlKG1lc3NhZ2UsIHdyaXRlciwgb3B0aW9ucykge1xuICAgICAgICAvKiByZXBlYXRlZCBnaXRodWIuYWN0aW9ucy5yZXN1bHRzLmFwaS52MS5MaXN0QXJ0aWZhY3RzUmVzcG9uc2UuTW9ub2xpdGhBcnRpZmFjdCBhcnRpZmFjdHMgPSAxOyAqL1xuICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IG1lc3NhZ2UuYXJ0aWZhY3RzLmxlbmd0aDsgaSsrKVxuICAgICAgICAgICAgZXhwb3J0cy5MaXN0QXJ0aWZhY3RzUmVzcG9uc2VfTW9ub2xpdGhBcnRpZmFjdC5pbnRlcm5hbEJpbmFyeVdyaXRlKG1lc3NhZ2UuYXJ0aWZhY3RzW2ldLCB3cml0ZXIudGFnKDEsIHJ1bnRpbWVfMS5XaXJlVHlwZS5MZW5ndGhEZWxpbWl0ZWQpLmZvcmsoKSwgb3B0aW9ucykuam9pbigpO1xuICAgICAgICBsZXQgdSA9IG9wdGlvbnMud3JpdGVVbmtub3duRmllbGRzO1xuICAgICAgICBpZiAodSAhPT0gZmFsc2UpXG4gICAgICAgICAgICAodSA9PSB0cnVlID8gcnVudGltZV8yLlVua25vd25GaWVsZEhhbmRsZXIub25Xcml0ZSA6IHUpKHRoaXMudHlwZU5hbWUsIG1lc3NhZ2UsIHdyaXRlcik7XG4gICAgICAgIHJldHVybiB3cml0ZXI7XG4gICAgfVxufVxuLyoqXG4gKiBAZ2VuZXJhdGVkIE1lc3NhZ2VUeXBlIGZvciBwcm90b2J1ZiBtZXNzYWdlIGdpdGh1Yi5hY3Rpb25zLnJlc3VsdHMuYXBpLnYxLkxpc3RBcnRpZmFjdHNSZXNwb25zZVxuICovXG5leHBvcnRzLkxpc3RBcnRpZmFjdHNSZXNwb25zZSA9IG5ldyBMaXN0QXJ0aWZhY3RzUmVzcG9uc2UkVHlwZSgpO1xuLy8gQGdlbmVyYXRlZCBtZXNzYWdlIHR5cGUgd2l0aCByZWZsZWN0aW9uIGluZm9ybWF0aW9uLCBtYXkgcHJvdmlkZSBzcGVlZCBvcHRpbWl6ZWQgbWV0aG9kc1xuY2xhc3MgTGlzdEFydGlmYWN0c1Jlc3BvbnNlX01vbm9saXRoQXJ0aWZhY3QkVHlwZSBleHRlbmRzIHJ1bnRpbWVfNS5NZXNzYWdlVHlwZSB7XG4gICAgY29uc3RydWN0b3IoKSB7XG4gICAgICAgIHN1cGVyKFwiZ2l0aHViLmFjdGlvbnMucmVzdWx0cy5hcGkudjEuTGlzdEFydGlmYWN0c1Jlc3BvbnNlLk1vbm9saXRoQXJ0aWZhY3RcIiwgW1xuICAgICAgICAgICAgeyBubzogMSwgbmFtZTogXCJ3b3JrZmxvd19ydW5fYmFja2VuZF9pZFwiLCBraW5kOiBcInNjYWxhclwiLCBUOiA5IC8qU2NhbGFyVHlwZS5TVFJJTkcqLyB9LFxuICAgICAgICAgICAgeyBubzogMiwgbmFtZTogXCJ3b3JrZmxvd19qb2JfcnVuX2JhY2tlbmRfaWRcIiwga2luZDogXCJzY2FsYXJcIiwgVDogOSAvKlNjYWxhclR5cGUuU1RSSU5HKi8gfSxcbiAgICAgICAgICAgIHsgbm86IDMsIG5hbWU6IFwiZGF0YWJhc2VfaWRcIiwga2luZDogXCJzY2FsYXJcIiwgVDogMyAvKlNjYWxhclR5cGUuSU5UNjQqLyB9LFxuICAgICAgICAgICAgeyBubzogNCwgbmFtZTogXCJuYW1lXCIsIGtpbmQ6IFwic2NhbGFyXCIsIFQ6IDkgLypTY2FsYXJUeXBlLlNUUklORyovIH0sXG4gICAgICAgICAgICB7IG5vOiA1LCBuYW1lOiBcInNpemVcIiwga2luZDogXCJzY2FsYXJcIiwgVDogMyAvKlNjYWxhclR5cGUuSU5UNjQqLyB9LFxuICAgICAgICAgICAgeyBubzogNiwgbmFtZTogXCJjcmVhdGVkX2F0XCIsIGtpbmQ6IFwibWVzc2FnZVwiLCBUOiAoKSA9PiB0aW1lc3RhbXBfMS5UaW1lc3RhbXAgfVxuICAgICAgICBdKTtcbiAgICB9XG4gICAgY3JlYXRlKHZhbHVlKSB7XG4gICAgICAgIGNvbnN0IG1lc3NhZ2UgPSB7IHdvcmtmbG93UnVuQmFja2VuZElkOiBcIlwiLCB3b3JrZmxvd0pvYlJ1bkJhY2tlbmRJZDogXCJcIiwgZGF0YWJhc2VJZDogXCIwXCIsIG5hbWU6IFwiXCIsIHNpemU6IFwiMFwiIH07XG4gICAgICAgIGdsb2JhbFRoaXMuT2JqZWN0LmRlZmluZVByb3BlcnR5KG1lc3NhZ2UsIHJ1bnRpbWVfNC5NRVNTQUdFX1RZUEUsIHsgZW51bWVyYWJsZTogZmFsc2UsIHZhbHVlOiB0aGlzIH0pO1xuICAgICAgICBpZiAodmFsdWUgIT09IHVuZGVmaW5lZClcbiAgICAgICAgICAgICgwLCBydW50aW1lXzMucmVmbGVjdGlvbk1lcmdlUGFydGlhbCkodGhpcywgbWVzc2FnZSwgdmFsdWUpO1xuICAgICAgICByZXR1cm4gbWVzc2FnZTtcbiAgICB9XG4gICAgaW50ZXJuYWxCaW5hcnlSZWFkKHJlYWRlciwgbGVuZ3RoLCBvcHRpb25zLCB0YXJnZXQpIHtcbiAgICAgICAgbGV0IG1lc3NhZ2UgPSB0YXJnZXQgIT09IG51bGwgJiYgdGFyZ2V0ICE9PSB2b2lkIDAgPyB0YXJnZXQgOiB0aGlzLmNyZWF0ZSgpLCBlbmQgPSByZWFkZXIucG9zICsgbGVuZ3RoO1xuICAgICAgICB3aGlsZSAocmVhZGVyLnBvcyA8IGVuZCkge1xuICAgICAgICAgICAgbGV0IFtmaWVsZE5vLCB3aXJlVHlwZV0gPSByZWFkZXIudGFnKCk7XG4gICAgICAgICAgICBzd2l0Y2ggKGZpZWxkTm8pIHtcbiAgICAgICAgICAgICAgICBjYXNlIC8qIHN0cmluZyB3b3JrZmxvd19ydW5fYmFja2VuZF9pZCAqLyAxOlxuICAgICAgICAgICAgICAgICAgICBtZXNzYWdlLndvcmtmbG93UnVuQmFja2VuZElkID0gcmVhZGVyLnN0cmluZygpO1xuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICBjYXNlIC8qIHN0cmluZyB3b3JrZmxvd19qb2JfcnVuX2JhY2tlbmRfaWQgKi8gMjpcbiAgICAgICAgICAgICAgICAgICAgbWVzc2FnZS53b3JrZmxvd0pvYlJ1bkJhY2tlbmRJZCA9IHJlYWRlci5zdHJpbmcoKTtcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgY2FzZSAvKiBpbnQ2NCBkYXRhYmFzZV9pZCAqLyAzOlxuICAgICAgICAgICAgICAgICAgICBtZXNzYWdlLmRhdGFiYXNlSWQgPSByZWFkZXIuaW50NjQoKS50b1N0cmluZygpO1xuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICBjYXNlIC8qIHN0cmluZyBuYW1lICovIDQ6XG4gICAgICAgICAgICAgICAgICAgIG1lc3NhZ2UubmFtZSA9IHJlYWRlci5zdHJpbmcoKTtcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgY2FzZSAvKiBpbnQ2NCBzaXplICovIDU6XG4gICAgICAgICAgICAgICAgICAgIG1lc3NhZ2Uuc2l6ZSA9IHJlYWRlci5pbnQ2NCgpLnRvU3RyaW5nKCk7XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIGNhc2UgLyogZ29vZ2xlLnByb3RvYnVmLlRpbWVzdGFtcCBjcmVhdGVkX2F0ICovIDY6XG4gICAgICAgICAgICAgICAgICAgIG1lc3NhZ2UuY3JlYXRlZEF0ID0gdGltZXN0YW1wXzEuVGltZXN0YW1wLmludGVybmFsQmluYXJ5UmVhZChyZWFkZXIsIHJlYWRlci51aW50MzIoKSwgb3B0aW9ucywgbWVzc2FnZS5jcmVhdGVkQXQpO1xuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgICAgICAgICAgICBsZXQgdSA9IG9wdGlvbnMucmVhZFVua25vd25GaWVsZDtcbiAgICAgICAgICAgICAgICAgICAgaWYgKHUgPT09IFwidGhyb3dcIilcbiAgICAgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBnbG9iYWxUaGlzLkVycm9yKGBVbmtub3duIGZpZWxkICR7ZmllbGROb30gKHdpcmUgdHlwZSAke3dpcmVUeXBlfSkgZm9yICR7dGhpcy50eXBlTmFtZX1gKTtcbiAgICAgICAgICAgICAgICAgICAgbGV0IGQgPSByZWFkZXIuc2tpcCh3aXJlVHlwZSk7XG4gICAgICAgICAgICAgICAgICAgIGlmICh1ICE9PSBmYWxzZSlcbiAgICAgICAgICAgICAgICAgICAgICAgICh1ID09PSB0cnVlID8gcnVudGltZV8yLlVua25vd25GaWVsZEhhbmRsZXIub25SZWFkIDogdSkodGhpcy50eXBlTmFtZSwgbWVzc2FnZSwgZmllbGRObywgd2lyZVR5cGUsIGQpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiBtZXNzYWdlO1xuICAgIH1cbiAgICBpbnRlcm5hbEJpbmFyeVdyaXRlKG1lc3NhZ2UsIHdyaXRlciwgb3B0aW9ucykge1xuICAgICAgICAvKiBzdHJpbmcgd29ya2Zsb3dfcnVuX2JhY2tlbmRfaWQgPSAxOyAqL1xuICAgICAgICBpZiAobWVzc2FnZS53b3JrZmxvd1J1bkJhY2tlbmRJZCAhPT0gXCJcIilcbiAgICAgICAgICAgIHdyaXRlci50YWcoMSwgcnVudGltZV8xLldpcmVUeXBlLkxlbmd0aERlbGltaXRlZCkuc3RyaW5nKG1lc3NhZ2Uud29ya2Zsb3dSdW5CYWNrZW5kSWQpO1xuICAgICAgICAvKiBzdHJpbmcgd29ya2Zsb3dfam9iX3J1bl9iYWNrZW5kX2lkID0gMjsgKi9cbiAgICAgICAgaWYgKG1lc3NhZ2Uud29ya2Zsb3dKb2JSdW5CYWNrZW5kSWQgIT09IFwiXCIpXG4gICAgICAgICAgICB3cml0ZXIudGFnKDIsIHJ1bnRpbWVfMS5XaXJlVHlwZS5MZW5ndGhEZWxpbWl0ZWQpLnN0cmluZyhtZXNzYWdlLndvcmtmbG93Sm9iUnVuQmFja2VuZElkKTtcbiAgICAgICAgLyogaW50NjQgZGF0YWJhc2VfaWQgPSAzOyAqL1xuICAgICAgICBpZiAobWVzc2FnZS5kYXRhYmFzZUlkICE9PSBcIjBcIilcbiAgICAgICAgICAgIHdyaXRlci50YWcoMywgcnVudGltZV8xLldpcmVUeXBlLlZhcmludCkuaW50NjQobWVzc2FnZS5kYXRhYmFzZUlkKTtcbiAgICAgICAgLyogc3RyaW5nIG5hbWUgPSA0OyAqL1xuICAgICAgICBpZiAobWVzc2FnZS5uYW1lICE9PSBcIlwiKVxuICAgICAgICAgICAgd3JpdGVyLnRhZyg0LCBydW50aW1lXzEuV2lyZVR5cGUuTGVuZ3RoRGVsaW1pdGVkKS5zdHJpbmcobWVzc2FnZS5uYW1lKTtcbiAgICAgICAgLyogaW50NjQgc2l6ZSA9IDU7ICovXG4gICAgICAgIGlmIChtZXNzYWdlLnNpemUgIT09IFwiMFwiKVxuICAgICAgICAgICAgd3JpdGVyLnRhZyg1LCBydW50aW1lXzEuV2lyZVR5cGUuVmFyaW50KS5pbnQ2NChtZXNzYWdlLnNpemUpO1xuICAgICAgICAvKiBnb29nbGUucHJvdG9idWYuVGltZXN0YW1wIGNyZWF0ZWRfYXQgPSA2OyAqL1xuICAgICAgICBpZiAobWVzc2FnZS5jcmVhdGVkQXQpXG4gICAgICAgICAgICB0aW1lc3RhbXBfMS5UaW1lc3RhbXAuaW50ZXJuYWxCaW5hcnlXcml0ZShtZXNzYWdlLmNyZWF0ZWRBdCwgd3JpdGVyLnRhZyg2LCBydW50aW1lXzEuV2lyZVR5cGUuTGVuZ3RoRGVsaW1pdGVkKS5mb3JrKCksIG9wdGlvbnMpLmpvaW4oKTtcbiAgICAgICAgbGV0IHUgPSBvcHRpb25zLndyaXRlVW5rbm93bkZpZWxkcztcbiAgICAgICAgaWYgKHUgIT09IGZhbHNlKVxuICAgICAgICAgICAgKHUgPT0gdHJ1ZSA/IHJ1bnRpbWVfMi5Vbmtub3duRmllbGRIYW5kbGVyLm9uV3JpdGUgOiB1KSh0aGlzLnR5cGVOYW1lLCBtZXNzYWdlLCB3cml0ZXIpO1xuICAgICAgICByZXR1cm4gd3JpdGVyO1xuICAgIH1cbn1cbi8qKlxuICogQGdlbmVyYXRlZCBNZXNzYWdlVHlwZSBmb3IgcHJvdG9idWYgbWVzc2FnZSBnaXRodWIuYWN0aW9ucy5yZXN1bHRzLmFwaS52MS5MaXN0QXJ0aWZhY3RzUmVzcG9uc2UuTW9ub2xpdGhBcnRpZmFjdFxuICovXG5leHBvcnRzLkxpc3RBcnRpZmFjdHNSZXNwb25zZV9Nb25vbGl0aEFydGlmYWN0ID0gbmV3IExpc3RBcnRpZmFjdHNSZXNwb25zZV9Nb25vbGl0aEFydGlmYWN0JFR5cGUoKTtcbi8vIEBnZW5lcmF0ZWQgbWVzc2FnZSB0eXBlIHdpdGggcmVmbGVjdGlvbiBpbmZvcm1hdGlvbiwgbWF5IHByb3ZpZGUgc3BlZWQgb3B0aW1pemVkIG1ldGhvZHNcbmNsYXNzIEdldFNpZ25lZEFydGlmYWN0VVJMUmVxdWVzdCRUeXBlIGV4dGVuZHMgcnVudGltZV81Lk1lc3NhZ2VUeXBlIHtcbiAgICBjb25zdHJ1Y3RvcigpIHtcbiAgICAgICAgc3VwZXIoXCJnaXRodWIuYWN0aW9ucy5yZXN1bHRzLmFwaS52MS5HZXRTaWduZWRBcnRpZmFjdFVSTFJlcXVlc3RcIiwgW1xuICAgICAgICAgICAgeyBubzogMSwgbmFtZTogXCJ3b3JrZmxvd19ydW5fYmFja2VuZF9pZFwiLCBraW5kOiBcInNjYWxhclwiLCBUOiA5IC8qU2NhbGFyVHlwZS5TVFJJTkcqLyB9LFxuICAgICAgICAgICAgeyBubzogMiwgbmFtZTogXCJ3b3JrZmxvd19qb2JfcnVuX2JhY2tlbmRfaWRcIiwga2luZDogXCJzY2FsYXJcIiwgVDogOSAvKlNjYWxhclR5cGUuU1RSSU5HKi8gfSxcbiAgICAgICAgICAgIHsgbm86IDMsIG5hbWU6IFwibmFtZVwiLCBraW5kOiBcInNjYWxhclwiLCBUOiA5IC8qU2NhbGFyVHlwZS5TVFJJTkcqLyB9XG4gICAgICAgIF0pO1xuICAgIH1cbiAgICBjcmVhdGUodmFsdWUpIHtcbiAgICAgICAgY29uc3QgbWVzc2FnZSA9IHsgd29ya2Zsb3dSdW5CYWNrZW5kSWQ6IFwiXCIsIHdvcmtmbG93Sm9iUnVuQmFja2VuZElkOiBcIlwiLCBuYW1lOiBcIlwiIH07XG4gICAgICAgIGdsb2JhbFRoaXMuT2JqZWN0LmRlZmluZVByb3BlcnR5KG1lc3NhZ2UsIHJ1bnRpbWVfNC5NRVNTQUdFX1RZUEUsIHsgZW51bWVyYWJsZTogZmFsc2UsIHZhbHVlOiB0aGlzIH0pO1xuICAgICAgICBpZiAodmFsdWUgIT09IHVuZGVmaW5lZClcbiAgICAgICAgICAgICgwLCBydW50aW1lXzMucmVmbGVjdGlvbk1lcmdlUGFydGlhbCkodGhpcywgbWVzc2FnZSwgdmFsdWUpO1xuICAgICAgICByZXR1cm4gbWVzc2FnZTtcbiAgICB9XG4gICAgaW50ZXJuYWxCaW5hcnlSZWFkKHJlYWRlciwgbGVuZ3RoLCBvcHRpb25zLCB0YXJnZXQpIHtcbiAgICAgICAgbGV0IG1lc3NhZ2UgPSB0YXJnZXQgIT09IG51bGwgJiYgdGFyZ2V0ICE9PSB2b2lkIDAgPyB0YXJnZXQgOiB0aGlzLmNyZWF0ZSgpLCBlbmQgPSByZWFkZXIucG9zICsgbGVuZ3RoO1xuICAgICAgICB3aGlsZSAocmVhZGVyLnBvcyA8IGVuZCkge1xuICAgICAgICAgICAgbGV0IFtmaWVsZE5vLCB3aXJlVHlwZV0gPSByZWFkZXIudGFnKCk7XG4gICAgICAgICAgICBzd2l0Y2ggKGZpZWxkTm8pIHtcbiAgICAgICAgICAgICAgICBjYXNlIC8qIHN0cmluZyB3b3JrZmxvd19ydW5fYmFja2VuZF9pZCAqLyAxOlxuICAgICAgICAgICAgICAgICAgICBtZXNzYWdlLndvcmtmbG93UnVuQmFja2VuZElkID0gcmVhZGVyLnN0cmluZygpO1xuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICBjYXNlIC8qIHN0cmluZyB3b3JrZmxvd19qb2JfcnVuX2JhY2tlbmRfaWQgKi8gMjpcbiAgICAgICAgICAgICAgICAgICAgbWVzc2FnZS53b3JrZmxvd0pvYlJ1bkJhY2tlbmRJZCA9IHJlYWRlci5zdHJpbmcoKTtcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgY2FzZSAvKiBzdHJpbmcgbmFtZSAqLyAzOlxuICAgICAgICAgICAgICAgICAgICBtZXNzYWdlLm5hbWUgPSByZWFkZXIuc3RyaW5nKCk7XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgICAgICAgICAgIGxldCB1ID0gb3B0aW9ucy5yZWFkVW5rbm93bkZpZWxkO1xuICAgICAgICAgICAgICAgICAgICBpZiAodSA9PT0gXCJ0aHJvd1wiKVxuICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IGdsb2JhbFRoaXMuRXJyb3IoYFVua25vd24gZmllbGQgJHtmaWVsZE5vfSAod2lyZSB0eXBlICR7d2lyZVR5cGV9KSBmb3IgJHt0aGlzLnR5cGVOYW1lfWApO1xuICAgICAgICAgICAgICAgICAgICBsZXQgZCA9IHJlYWRlci5za2lwKHdpcmVUeXBlKTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKHUgIT09IGZhbHNlKVxuICAgICAgICAgICAgICAgICAgICAgICAgKHUgPT09IHRydWUgPyBydW50aW1lXzIuVW5rbm93bkZpZWxkSGFuZGxlci5vblJlYWQgOiB1KSh0aGlzLnR5cGVOYW1lLCBtZXNzYWdlLCBmaWVsZE5vLCB3aXJlVHlwZSwgZCk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIG1lc3NhZ2U7XG4gICAgfVxuICAgIGludGVybmFsQmluYXJ5V3JpdGUobWVzc2FnZSwgd3JpdGVyLCBvcHRpb25zKSB7XG4gICAgICAgIC8qIHN0cmluZyB3b3JrZmxvd19ydW5fYmFja2VuZF9pZCA9IDE7ICovXG4gICAgICAgIGlmIChtZXNzYWdlLndvcmtmbG93UnVuQmFja2VuZElkICE9PSBcIlwiKVxuICAgICAgICAgICAgd3JpdGVyLnRhZygxLCBydW50aW1lXzEuV2lyZVR5cGUuTGVuZ3RoRGVsaW1pdGVkKS5zdHJpbmcobWVzc2FnZS53b3JrZmxvd1J1bkJhY2tlbmRJZCk7XG4gICAgICAgIC8qIHN0cmluZyB3b3JrZmxvd19qb2JfcnVuX2JhY2tlbmRfaWQgPSAyOyAqL1xuICAgICAgICBpZiAobWVzc2FnZS53b3JrZmxvd0pvYlJ1bkJhY2tlbmRJZCAhPT0gXCJcIilcbiAgICAgICAgICAgIHdyaXRlci50YWcoMiwgcnVudGltZV8xLldpcmVUeXBlLkxlbmd0aERlbGltaXRlZCkuc3RyaW5nKG1lc3NhZ2Uud29ya2Zsb3dKb2JSdW5CYWNrZW5kSWQpO1xuICAgICAgICAvKiBzdHJpbmcgbmFtZSA9IDM7ICovXG4gICAgICAgIGlmIChtZXNzYWdlLm5hbWUgIT09IFwiXCIpXG4gICAgICAgICAgICB3cml0ZXIudGFnKDMsIHJ1bnRpbWVfMS5XaXJlVHlwZS5MZW5ndGhEZWxpbWl0ZWQpLnN0cmluZyhtZXNzYWdlLm5hbWUpO1xuICAgICAgICBsZXQgdSA9IG9wdGlvbnMud3JpdGVVbmtub3duRmllbGRzO1xuICAgICAgICBpZiAodSAhPT0gZmFsc2UpXG4gICAgICAgICAgICAodSA9PSB0cnVlID8gcnVudGltZV8yLlVua25vd25GaWVsZEhhbmRsZXIub25Xcml0ZSA6IHUpKHRoaXMudHlwZU5hbWUsIG1lc3NhZ2UsIHdyaXRlcik7XG4gICAgICAgIHJldHVybiB3cml0ZXI7XG4gICAgfVxufVxuLyoqXG4gKiBAZ2VuZXJhdGVkIE1lc3NhZ2VUeXBlIGZvciBwcm90b2J1ZiBtZXNzYWdlIGdpdGh1Yi5hY3Rpb25zLnJlc3VsdHMuYXBpLnYxLkdldFNpZ25lZEFydGlmYWN0VVJMUmVxdWVzdFxuICovXG5leHBvcnRzLkdldFNpZ25lZEFydGlmYWN0VVJMUmVxdWVzdCA9IG5ldyBHZXRTaWduZWRBcnRpZmFjdFVSTFJlcXVlc3QkVHlwZSgpO1xuLy8gQGdlbmVyYXRlZCBtZXNzYWdlIHR5cGUgd2l0aCByZWZsZWN0aW9uIGluZm9ybWF0aW9uLCBtYXkgcHJvdmlkZSBzcGVlZCBvcHRpbWl6ZWQgbWV0aG9kc1xuY2xhc3MgR2V0U2lnbmVkQXJ0aWZhY3RVUkxSZXNwb25zZSRUeXBlIGV4dGVuZHMgcnVudGltZV81Lk1lc3NhZ2VUeXBlIHtcbiAgICBjb25zdHJ1Y3RvcigpIHtcbiAgICAgICAgc3VwZXIoXCJnaXRodWIuYWN0aW9ucy5yZXN1bHRzLmFwaS52MS5HZXRTaWduZWRBcnRpZmFjdFVSTFJlc3BvbnNlXCIsIFtcbiAgICAgICAgICAgIHsgbm86IDEsIG5hbWU6IFwic2lnbmVkX3VybFwiLCBraW5kOiBcInNjYWxhclwiLCBUOiA5IC8qU2NhbGFyVHlwZS5TVFJJTkcqLyB9XG4gICAgICAgIF0pO1xuICAgIH1cbiAgICBjcmVhdGUodmFsdWUpIHtcbiAgICAgICAgY29uc3QgbWVzc2FnZSA9IHsgc2lnbmVkVXJsOiBcIlwiIH07XG4gICAgICAgIGdsb2JhbFRoaXMuT2JqZWN0LmRlZmluZVByb3BlcnR5KG1lc3NhZ2UsIHJ1bnRpbWVfNC5NRVNTQUdFX1RZUEUsIHsgZW51bWVyYWJsZTogZmFsc2UsIHZhbHVlOiB0aGlzIH0pO1xuICAgICAgICBpZiAodmFsdWUgIT09IHVuZGVmaW5lZClcbiAgICAgICAgICAgICgwLCBydW50aW1lXzMucmVmbGVjdGlvbk1lcmdlUGFydGlhbCkodGhpcywgbWVzc2FnZSwgdmFsdWUpO1xuICAgICAgICByZXR1cm4gbWVzc2FnZTtcbiAgICB9XG4gICAgaW50ZXJuYWxCaW5hcnlSZWFkKHJlYWRlciwgbGVuZ3RoLCBvcHRpb25zLCB0YXJnZXQpIHtcbiAgICAgICAgbGV0IG1lc3NhZ2UgPSB0YXJnZXQgIT09IG51bGwgJiYgdGFyZ2V0ICE9PSB2b2lkIDAgPyB0YXJnZXQgOiB0aGlzLmNyZWF0ZSgpLCBlbmQgPSByZWFkZXIucG9zICsgbGVuZ3RoO1xuICAgICAgICB3aGlsZSAocmVhZGVyLnBvcyA8IGVuZCkge1xuICAgICAgICAgICAgbGV0IFtmaWVsZE5vLCB3aXJlVHlwZV0gPSByZWFkZXIudGFnKCk7XG4gICAgICAgICAgICBzd2l0Y2ggKGZpZWxkTm8pIHtcbiAgICAgICAgICAgICAgICBjYXNlIC8qIHN0cmluZyBzaWduZWRfdXJsICovIDE6XG4gICAgICAgICAgICAgICAgICAgIG1lc3NhZ2Uuc2lnbmVkVXJsID0gcmVhZGVyLnN0cmluZygpO1xuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgICAgICAgICAgICBsZXQgdSA9IG9wdGlvbnMucmVhZFVua25vd25GaWVsZDtcbiAgICAgICAgICAgICAgICAgICAgaWYgKHUgPT09IFwidGhyb3dcIilcbiAgICAgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBnbG9iYWxUaGlzLkVycm9yKGBVbmtub3duIGZpZWxkICR7ZmllbGROb30gKHdpcmUgdHlwZSAke3dpcmVUeXBlfSkgZm9yICR7dGhpcy50eXBlTmFtZX1gKTtcbiAgICAgICAgICAgICAgICAgICAgbGV0IGQgPSByZWFkZXIuc2tpcCh3aXJlVHlwZSk7XG4gICAgICAgICAgICAgICAgICAgIGlmICh1ICE9PSBmYWxzZSlcbiAgICAgICAgICAgICAgICAgICAgICAgICh1ID09PSB0cnVlID8gcnVudGltZV8yLlVua25vd25GaWVsZEhhbmRsZXIub25SZWFkIDogdSkodGhpcy50eXBlTmFtZSwgbWVzc2FnZSwgZmllbGRObywgd2lyZVR5cGUsIGQpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiBtZXNzYWdlO1xuICAgIH1cbiAgICBpbnRlcm5hbEJpbmFyeVdyaXRlKG1lc3NhZ2UsIHdyaXRlciwgb3B0aW9ucykge1xuICAgICAgICAvKiBzdHJpbmcgc2lnbmVkX3VybCA9IDE7ICovXG4gICAgICAgIGlmIChtZXNzYWdlLnNpZ25lZFVybCAhPT0gXCJcIilcbiAgICAgICAgICAgIHdyaXRlci50YWcoMSwgcnVudGltZV8xLldpcmVUeXBlLkxlbmd0aERlbGltaXRlZCkuc3RyaW5nKG1lc3NhZ2Uuc2lnbmVkVXJsKTtcbiAgICAgICAgbGV0IHUgPSBvcHRpb25zLndyaXRlVW5rbm93bkZpZWxkcztcbiAgICAgICAgaWYgKHUgIT09IGZhbHNlKVxuICAgICAgICAgICAgKHUgPT0gdHJ1ZSA/IHJ1bnRpbWVfMi5Vbmtub3duRmllbGRIYW5kbGVyLm9uV3JpdGUgOiB1KSh0aGlzLnR5cGVOYW1lLCBtZXNzYWdlLCB3cml0ZXIpO1xuICAgICAgICByZXR1cm4gd3JpdGVyO1xuICAgIH1cbn1cbi8qKlxuICogQGdlbmVyYXRlZCBNZXNzYWdlVHlwZSBmb3IgcHJvdG9idWYgbWVzc2FnZSBnaXRodWIuYWN0aW9ucy5yZXN1bHRzLmFwaS52MS5HZXRTaWduZWRBcnRpZmFjdFVSTFJlc3BvbnNlXG4gKi9cbmV4cG9ydHMuR2V0U2lnbmVkQXJ0aWZhY3RVUkxSZXNwb25zZSA9IG5ldyBHZXRTaWduZWRBcnRpZmFjdFVSTFJlc3BvbnNlJFR5cGUoKTtcbi8vIEBnZW5lcmF0ZWQgbWVzc2FnZSB0eXBlIHdpdGggcmVmbGVjdGlvbiBpbmZvcm1hdGlvbiwgbWF5IHByb3ZpZGUgc3BlZWQgb3B0aW1pemVkIG1ldGhvZHNcbmNsYXNzIERlbGV0ZUFydGlmYWN0UmVxdWVzdCRUeXBlIGV4dGVuZHMgcnVudGltZV81Lk1lc3NhZ2VUeXBlIHtcbiAgICBjb25zdHJ1Y3RvcigpIHtcbiAgICAgICAgc3VwZXIoXCJnaXRodWIuYWN0aW9ucy5yZXN1bHRzLmFwaS52MS5EZWxldGVBcnRpZmFjdFJlcXVlc3RcIiwgW1xuICAgICAgICAgICAgeyBubzogMSwgbmFtZTogXCJ3b3JrZmxvd19ydW5fYmFja2VuZF9pZFwiLCBraW5kOiBcInNjYWxhclwiLCBUOiA5IC8qU2NhbGFyVHlwZS5TVFJJTkcqLyB9LFxuICAgICAgICAgICAgeyBubzogMiwgbmFtZTogXCJ3b3JrZmxvd19qb2JfcnVuX2JhY2tlbmRfaWRcIiwga2luZDogXCJzY2FsYXJcIiwgVDogOSAvKlNjYWxhclR5cGUuU1RSSU5HKi8gfSxcbiAgICAgICAgICAgIHsgbm86IDMsIG5hbWU6IFwibmFtZVwiLCBraW5kOiBcInNjYWxhclwiLCBUOiA5IC8qU2NhbGFyVHlwZS5TVFJJTkcqLyB9XG4gICAgICAgIF0pO1xuICAgIH1cbiAgICBjcmVhdGUodmFsdWUpIHtcbiAgICAgICAgY29uc3QgbWVzc2FnZSA9IHsgd29ya2Zsb3dSdW5CYWNrZW5kSWQ6IFwiXCIsIHdvcmtmbG93Sm9iUnVuQmFja2VuZElkOiBcIlwiLCBuYW1lOiBcIlwiIH07XG4gICAgICAgIGdsb2JhbFRoaXMuT2JqZWN0LmRlZmluZVByb3BlcnR5KG1lc3NhZ2UsIHJ1bnRpbWVfNC5NRVNTQUdFX1RZUEUsIHsgZW51bWVyYWJsZTogZmFsc2UsIHZhbHVlOiB0aGlzIH0pO1xuICAgICAgICBpZiAodmFsdWUgIT09IHVuZGVmaW5lZClcbiAgICAgICAgICAgICgwLCBydW50aW1lXzMucmVmbGVjdGlvbk1lcmdlUGFydGlhbCkodGhpcywgbWVzc2FnZSwgdmFsdWUpO1xuICAgICAgICByZXR1cm4gbWVzc2FnZTtcbiAgICB9XG4gICAgaW50ZXJuYWxCaW5hcnlSZWFkKHJlYWRlciwgbGVuZ3RoLCBvcHRpb25zLCB0YXJnZXQpIHtcbiAgICAgICAgbGV0IG1lc3NhZ2UgPSB0YXJnZXQgIT09IG51bGwgJiYgdGFyZ2V0ICE9PSB2b2lkIDAgPyB0YXJnZXQgOiB0aGlzLmNyZWF0ZSgpLCBlbmQgPSByZWFkZXIucG9zICsgbGVuZ3RoO1xuICAgICAgICB3aGlsZSAocmVhZGVyLnBvcyA8IGVuZCkge1xuICAgICAgICAgICAgbGV0IFtmaWVsZE5vLCB3aXJlVHlwZV0gPSByZWFkZXIudGFnKCk7XG4gICAgICAgICAgICBzd2l0Y2ggKGZpZWxkTm8pIHtcbiAgICAgICAgICAgICAgICBjYXNlIC8qIHN0cmluZyB3b3JrZmxvd19ydW5fYmFja2VuZF9pZCAqLyAxOlxuICAgICAgICAgICAgICAgICAgICBtZXNzYWdlLndvcmtmbG93UnVuQmFja2VuZElkID0gcmVhZGVyLnN0cmluZygpO1xuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICBjYXNlIC8qIHN0cmluZyB3b3JrZmxvd19qb2JfcnVuX2JhY2tlbmRfaWQgKi8gMjpcbiAgICAgICAgICAgICAgICAgICAgbWVzc2FnZS53b3JrZmxvd0pvYlJ1bkJhY2tlbmRJZCA9IHJlYWRlci5zdHJpbmcoKTtcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgY2FzZSAvKiBzdHJpbmcgbmFtZSAqLyAzOlxuICAgICAgICAgICAgICAgICAgICBtZXNzYWdlLm5hbWUgPSByZWFkZXIuc3RyaW5nKCk7XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgICAgICAgICAgIGxldCB1ID0gb3B0aW9ucy5yZWFkVW5rbm93bkZpZWxkO1xuICAgICAgICAgICAgICAgICAgICBpZiAodSA9PT0gXCJ0aHJvd1wiKVxuICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IGdsb2JhbFRoaXMuRXJyb3IoYFVua25vd24gZmllbGQgJHtmaWVsZE5vfSAod2lyZSB0eXBlICR7d2lyZVR5cGV9KSBmb3IgJHt0aGlzLnR5cGVOYW1lfWApO1xuICAgICAgICAgICAgICAgICAgICBsZXQgZCA9IHJlYWRlci5za2lwKHdpcmVUeXBlKTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKHUgIT09IGZhbHNlKVxuICAgICAgICAgICAgICAgICAgICAgICAgKHUgPT09IHRydWUgPyBydW50aW1lXzIuVW5rbm93bkZpZWxkSGFuZGxlci5vblJlYWQgOiB1KSh0aGlzLnR5cGVOYW1lLCBtZXNzYWdlLCBmaWVsZE5vLCB3aXJlVHlwZSwgZCk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIG1lc3NhZ2U7XG4gICAgfVxuICAgIGludGVybmFsQmluYXJ5V3JpdGUobWVzc2FnZSwgd3JpdGVyLCBvcHRpb25zKSB7XG4gICAgICAgIC8qIHN0cmluZyB3b3JrZmxvd19ydW5fYmFja2VuZF9pZCA9IDE7ICovXG4gICAgICAgIGlmIChtZXNzYWdlLndvcmtmbG93UnVuQmFja2VuZElkICE9PSBcIlwiKVxuICAgICAgICAgICAgd3JpdGVyLnRhZygxLCBydW50aW1lXzEuV2lyZVR5cGUuTGVuZ3RoRGVsaW1pdGVkKS5zdHJpbmcobWVzc2FnZS53b3JrZmxvd1J1bkJhY2tlbmRJZCk7XG4gICAgICAgIC8qIHN0cmluZyB3b3JrZmxvd19qb2JfcnVuX2JhY2tlbmRfaWQgPSAyOyAqL1xuICAgICAgICBpZiAobWVzc2FnZS53b3JrZmxvd0pvYlJ1bkJhY2tlbmRJZCAhPT0gXCJcIilcbiAgICAgICAgICAgIHdyaXRlci50YWcoMiwgcnVudGltZV8xLldpcmVUeXBlLkxlbmd0aERlbGltaXRlZCkuc3RyaW5nKG1lc3NhZ2Uud29ya2Zsb3dKb2JSdW5CYWNrZW5kSWQpO1xuICAgICAgICAvKiBzdHJpbmcgbmFtZSA9IDM7ICovXG4gICAgICAgIGlmIChtZXNzYWdlLm5hbWUgIT09IFwiXCIpXG4gICAgICAgICAgICB3cml0ZXIudGFnKDMsIHJ1bnRpbWVfMS5XaXJlVHlwZS5MZW5ndGhEZWxpbWl0ZWQpLnN0cmluZyhtZXNzYWdlLm5hbWUpO1xuICAgICAgICBsZXQgdSA9IG9wdGlvbnMud3JpdGVVbmtub3duRmllbGRzO1xuICAgICAgICBpZiAodSAhPT0gZmFsc2UpXG4gICAgICAgICAgICAodSA9PSB0cnVlID8gcnVudGltZV8yLlVua25vd25GaWVsZEhhbmRsZXIub25Xcml0ZSA6IHUpKHRoaXMudHlwZU5hbWUsIG1lc3NhZ2UsIHdyaXRlcik7XG4gICAgICAgIHJldHVybiB3cml0ZXI7XG4gICAgfVxufVxuLyoqXG4gKiBAZ2VuZXJhdGVkIE1lc3NhZ2VUeXBlIGZvciBwcm90b2J1ZiBtZXNzYWdlIGdpdGh1Yi5hY3Rpb25zLnJlc3VsdHMuYXBpLnYxLkRlbGV0ZUFydGlmYWN0UmVxdWVzdFxuICovXG5leHBvcnRzLkRlbGV0ZUFydGlmYWN0UmVxdWVzdCA9IG5ldyBEZWxldGVBcnRpZmFjdFJlcXVlc3QkVHlwZSgpO1xuLy8gQGdlbmVyYXRlZCBtZXNzYWdlIHR5cGUgd2l0aCByZWZsZWN0aW9uIGluZm9ybWF0aW9uLCBtYXkgcHJvdmlkZSBzcGVlZCBvcHRpbWl6ZWQgbWV0aG9kc1xuY2xhc3MgRGVsZXRlQXJ0aWZhY3RSZXNwb25zZSRUeXBlIGV4dGVuZHMgcnVudGltZV81Lk1lc3NhZ2VUeXBlIHtcbiAgICBjb25zdHJ1Y3RvcigpIHtcbiAgICAgICAgc3VwZXIoXCJnaXRodWIuYWN0aW9ucy5yZXN1bHRzLmFwaS52MS5EZWxldGVBcnRpZmFjdFJlc3BvbnNlXCIsIFtcbiAgICAgICAgICAgIHsgbm86IDEsIG5hbWU6IFwib2tcIiwga2luZDogXCJzY2FsYXJcIiwgVDogOCAvKlNjYWxhclR5cGUuQk9PTCovIH0sXG4gICAgICAgICAgICB7IG5vOiAyLCBuYW1lOiBcImFydGlmYWN0X2lkXCIsIGtpbmQ6IFwic2NhbGFyXCIsIFQ6IDMgLypTY2FsYXJUeXBlLklOVDY0Ki8gfVxuICAgICAgICBdKTtcbiAgICB9XG4gICAgY3JlYXRlKHZhbHVlKSB7XG4gICAgICAgIGNvbnN0IG1lc3NhZ2UgPSB7IG9rOiBmYWxzZSwgYXJ0aWZhY3RJZDogXCIwXCIgfTtcbiAgICAgICAgZ2xvYmFsVGhpcy5PYmplY3QuZGVmaW5lUHJvcGVydHkobWVzc2FnZSwgcnVudGltZV80Lk1FU1NBR0VfVFlQRSwgeyBlbnVtZXJhYmxlOiBmYWxzZSwgdmFsdWU6IHRoaXMgfSk7XG4gICAgICAgIGlmICh2YWx1ZSAhPT0gdW5kZWZpbmVkKVxuICAgICAgICAgICAgKDAsIHJ1bnRpbWVfMy5yZWZsZWN0aW9uTWVyZ2VQYXJ0aWFsKSh0aGlzLCBtZXNzYWdlLCB2YWx1ZSk7XG4gICAgICAgIHJldHVybiBtZXNzYWdlO1xuICAgIH1cbiAgICBpbnRlcm5hbEJpbmFyeVJlYWQocmVhZGVyLCBsZW5ndGgsIG9wdGlvbnMsIHRhcmdldCkge1xuICAgICAgICBsZXQgbWVzc2FnZSA9IHRhcmdldCAhPT0gbnVsbCAmJiB0YXJnZXQgIT09IHZvaWQgMCA/IHRhcmdldCA6IHRoaXMuY3JlYXRlKCksIGVuZCA9IHJlYWRlci5wb3MgKyBsZW5ndGg7XG4gICAgICAgIHdoaWxlIChyZWFkZXIucG9zIDwgZW5kKSB7XG4gICAgICAgICAgICBsZXQgW2ZpZWxkTm8sIHdpcmVUeXBlXSA9IHJlYWRlci50YWcoKTtcbiAgICAgICAgICAgIHN3aXRjaCAoZmllbGRObykge1xuICAgICAgICAgICAgICAgIGNhc2UgLyogYm9vbCBvayAqLyAxOlxuICAgICAgICAgICAgICAgICAgICBtZXNzYWdlLm9rID0gcmVhZGVyLmJvb2woKTtcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgY2FzZSAvKiBpbnQ2NCBhcnRpZmFjdF9pZCAqLyAyOlxuICAgICAgICAgICAgICAgICAgICBtZXNzYWdlLmFydGlmYWN0SWQgPSByZWFkZXIuaW50NjQoKS50b1N0cmluZygpO1xuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgICAgICAgICAgICBsZXQgdSA9IG9wdGlvbnMucmVhZFVua25vd25GaWVsZDtcbiAgICAgICAgICAgICAgICAgICAgaWYgKHUgPT09IFwidGhyb3dcIilcbiAgICAgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBnbG9iYWxUaGlzLkVycm9yKGBVbmtub3duIGZpZWxkICR7ZmllbGROb30gKHdpcmUgdHlwZSAke3dpcmVUeXBlfSkgZm9yICR7dGhpcy50eXBlTmFtZX1gKTtcbiAgICAgICAgICAgICAgICAgICAgbGV0IGQgPSByZWFkZXIuc2tpcCh3aXJlVHlwZSk7XG4gICAgICAgICAgICAgICAgICAgIGlmICh1ICE9PSBmYWxzZSlcbiAgICAgICAgICAgICAgICAgICAgICAgICh1ID09PSB0cnVlID8gcnVudGltZV8yLlVua25vd25GaWVsZEhhbmRsZXIub25SZWFkIDogdSkodGhpcy50eXBlTmFtZSwgbWVzc2FnZSwgZmllbGRObywgd2lyZVR5cGUsIGQpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiBtZXNzYWdlO1xuICAgIH1cbiAgICBpbnRlcm5hbEJpbmFyeVdyaXRlKG1lc3NhZ2UsIHdyaXRlciwgb3B0aW9ucykge1xuICAgICAgICAvKiBib29sIG9rID0gMTsgKi9cbiAgICAgICAgaWYgKG1lc3NhZ2Uub2sgIT09IGZhbHNlKVxuICAgICAgICAgICAgd3JpdGVyLnRhZygxLCBydW50aW1lXzEuV2lyZVR5cGUuVmFyaW50KS5ib29sKG1lc3NhZ2Uub2spO1xuICAgICAgICAvKiBpbnQ2NCBhcnRpZmFjdF9pZCA9IDI7ICovXG4gICAgICAgIGlmIChtZXNzYWdlLmFydGlmYWN0SWQgIT09IFwiMFwiKVxuICAgICAgICAgICAgd3JpdGVyLnRhZygyLCBydW50aW1lXzEuV2lyZVR5cGUuVmFyaW50KS5pbnQ2NChtZXNzYWdlLmFydGlmYWN0SWQpO1xuICAgICAgICBsZXQgdSA9IG9wdGlvbnMud3JpdGVVbmtub3duRmllbGRzO1xuICAgICAgICBpZiAodSAhPT0gZmFsc2UpXG4gICAgICAgICAgICAodSA9PSB0cnVlID8gcnVudGltZV8yLlVua25vd25GaWVsZEhhbmRsZXIub25Xcml0ZSA6IHUpKHRoaXMudHlwZU5hbWUsIG1lc3NhZ2UsIHdyaXRlcik7XG4gICAgICAgIHJldHVybiB3cml0ZXI7XG4gICAgfVxufVxuLyoqXG4gKiBAZ2VuZXJhdGVkIE1lc3NhZ2VUeXBlIGZvciBwcm90b2J1ZiBtZXNzYWdlIGdpdGh1Yi5hY3Rpb25zLnJlc3VsdHMuYXBpLnYxLkRlbGV0ZUFydGlmYWN0UmVzcG9uc2VcbiAqL1xuZXhwb3J0cy5EZWxldGVBcnRpZmFjdFJlc3BvbnNlID0gbmV3IERlbGV0ZUFydGlmYWN0UmVzcG9uc2UkVHlwZSgpO1xuLyoqXG4gKiBAZ2VuZXJhdGVkIFNlcnZpY2VUeXBlIGZvciBwcm90b2J1ZiBzZXJ2aWNlIGdpdGh1Yi5hY3Rpb25zLnJlc3VsdHMuYXBpLnYxLkFydGlmYWN0U2VydmljZVxuICovXG5leHBvcnRzLkFydGlmYWN0U2VydmljZSA9IG5ldyBydW50aW1lX3JwY18xLlNlcnZpY2VUeXBlKFwiZ2l0aHViLmFjdGlvbnMucmVzdWx0cy5hcGkudjEuQXJ0aWZhY3RTZXJ2aWNlXCIsIFtcbiAgICB7IG5hbWU6IFwiQ3JlYXRlQXJ0aWZhY3RcIiwgb3B0aW9uczoge30sIEk6IGV4cG9ydHMuQ3JlYXRlQXJ0aWZhY3RSZXF1ZXN0LCBPOiBleHBvcnRzLkNyZWF0ZUFydGlmYWN0UmVzcG9uc2UgfSxcbiAgICB7IG5hbWU6IFwiRmluYWxpemVBcnRpZmFjdFwiLCBvcHRpb25zOiB7fSwgSTogZXhwb3J0cy5GaW5hbGl6ZUFydGlmYWN0UmVxdWVzdCwgTzogZXhwb3J0cy5GaW5hbGl6ZUFydGlmYWN0UmVzcG9uc2UgfSxcbiAgICB7IG5hbWU6IFwiTGlzdEFydGlmYWN0c1wiLCBvcHRpb25zOiB7fSwgSTogZXhwb3J0cy5MaXN0QXJ0aWZhY3RzUmVxdWVzdCwgTzogZXhwb3J0cy5MaXN0QXJ0aWZhY3RzUmVzcG9uc2UgfSxcbiAgICB7IG5hbWU6IFwiR2V0U2lnbmVkQXJ0aWZhY3RVUkxcIiwgb3B0aW9uczoge30sIEk6IGV4cG9ydHMuR2V0U2lnbmVkQXJ0aWZhY3RVUkxSZXF1ZXN0LCBPOiBleHBvcnRzLkdldFNpZ25lZEFydGlmYWN0VVJMUmVzcG9uc2UgfSxcbiAgICB7IG5hbWU6IFwiRGVsZXRlQXJ0aWZhY3RcIiwgb3B0aW9uczoge30sIEk6IGV4cG9ydHMuRGVsZXRlQXJ0aWZhY3RSZXF1ZXN0LCBPOiBleHBvcnRzLkRlbGV0ZUFydGlmYWN0UmVzcG9uc2UgfVxuXSk7XG4vLyMgc291cmNlTWFwcGluZ1VSTD1hcnRpZmFjdC5qcy5tYXAiLAogICAgIlwidXNlIHN0cmljdFwiO1xuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiX19lc01vZHVsZVwiLCB7IHZhbHVlOiB0cnVlIH0pO1xuIiwKICAgICJcInVzZSBzdHJpY3RcIjtcbnZhciBfX2F3YWl0ZXIgPSAodGhpcyAmJiB0aGlzLl9fYXdhaXRlcikgfHwgZnVuY3Rpb24gKHRoaXNBcmcsIF9hcmd1bWVudHMsIFAsIGdlbmVyYXRvcikge1xuICAgIGZ1bmN0aW9uIGFkb3B0KHZhbHVlKSB7IHJldHVybiB2YWx1ZSBpbnN0YW5jZW9mIFAgPyB2YWx1ZSA6IG5ldyBQKGZ1bmN0aW9uIChyZXNvbHZlKSB7IHJlc29sdmUodmFsdWUpOyB9KTsgfVxuICAgIHJldHVybiBuZXcgKFAgfHwgKFAgPSBQcm9taXNlKSkoZnVuY3Rpb24gKHJlc29sdmUsIHJlamVjdCkge1xuICAgICAgICBmdW5jdGlvbiBmdWxmaWxsZWQodmFsdWUpIHsgdHJ5IHsgc3RlcChnZW5lcmF0b3IubmV4dCh2YWx1ZSkpOyB9IGNhdGNoIChlKSB7IHJlamVjdChlKTsgfSB9XG4gICAgICAgIGZ1bmN0aW9uIHJlamVjdGVkKHZhbHVlKSB7IHRyeSB7IHN0ZXAoZ2VuZXJhdG9yW1widGhyb3dcIl0odmFsdWUpKTsgfSBjYXRjaCAoZSkgeyByZWplY3QoZSk7IH0gfVxuICAgICAgICBmdW5jdGlvbiBzdGVwKHJlc3VsdCkgeyByZXN1bHQuZG9uZSA/IHJlc29sdmUocmVzdWx0LnZhbHVlKSA6IGFkb3B0KHJlc3VsdC52YWx1ZSkudGhlbihmdWxmaWxsZWQsIHJlamVjdGVkKTsgfVxuICAgICAgICBzdGVwKChnZW5lcmF0b3IgPSBnZW5lcmF0b3IuYXBwbHkodGhpc0FyZywgX2FyZ3VtZW50cyB8fCBbXSkpLm5leHQoKSk7XG4gICAgfSk7XG59O1xuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiX19lc01vZHVsZVwiLCB7IHZhbHVlOiB0cnVlIH0pO1xuZXhwb3J0cy5pc0hvb2sgPSBleHBvcnRzLmNoYWluSG9va3MgPSB2b2lkIDA7XG4vLyBDaGFpbkhvb2tzIGNyZWF0ZXMgYSBuZXcgU2VydmVySG9vayB3aGljaCBjaGFpbnMgdGhlIGNhbGxiYWNrcyBpblxuLy8gZWFjaCBvZiB0aGUgY29uc3RpdHVlbnQgaG9va3MgcGFzc2VkIGluLiBFYWNoIGhvb2sgZnVuY3Rpb24gd2lsbCBiZVxuLy8gY2FsbGVkIGluIHRoZSBvcmRlciBvZiB0aGUgU2VydmVySG9va3MgdmFsdWVzIHBhc3NlZCBpbi5cbi8vXG4vLyBGb3IgdGhlIGVycm9yaW5nIGhvb2tzLCBSZXF1ZXN0UmVjZWl2ZWQgYW5kIFJlcXVlc3RSb3V0ZWQsIGFueSByZXR1cm5lZFxuLy8gZXJyb3JzIHByZXZlbnQgcHJvY2Vzc2luZyBieSBsYXRlciBob29rcy5cbmZ1bmN0aW9uIGNoYWluSG9va3MoLi4uaG9va3MpIHtcbiAgICBpZiAoaG9va3MubGVuZ3RoID09PSAwKSB7XG4gICAgICAgIHJldHVybiBudWxsO1xuICAgIH1cbiAgICBpZiAoaG9va3MubGVuZ3RoID09PSAxKSB7XG4gICAgICAgIHJldHVybiBob29rc1swXTtcbiAgICB9XG4gICAgY29uc3Qgc2VydmVySG9vayA9IHtcbiAgICAgICAgcmVxdWVzdFJlY2VpdmVkKGN0eCkge1xuICAgICAgICAgICAgcmV0dXJuIF9fYXdhaXRlcih0aGlzLCB2b2lkIDAsIHZvaWQgMCwgZnVuY3Rpb24qICgpIHtcbiAgICAgICAgICAgICAgICBmb3IgKGNvbnN0IGhvb2sgb2YgaG9va3MpIHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKCFob29rLnJlcXVlc3RSZWNlaXZlZCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgeWllbGQgaG9vay5yZXF1ZXN0UmVjZWl2ZWQoY3R4KTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfSxcbiAgICAgICAgcmVxdWVzdFByZXBhcmVkKGN0eCkge1xuICAgICAgICAgICAgcmV0dXJuIF9fYXdhaXRlcih0aGlzLCB2b2lkIDAsIHZvaWQgMCwgZnVuY3Rpb24qICgpIHtcbiAgICAgICAgICAgICAgICBmb3IgKGNvbnN0IGhvb2sgb2YgaG9va3MpIHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKCFob29rLnJlcXVlc3RQcmVwYXJlZCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgY29uc29sZS53YXJuKFwiaG9vayByZXF1ZXN0UHJlcGFyZWQgaXMgZGVwcmVjYXRlZCBhbmQgd2lsbCBiZSByZW1vdmVkIGluIHRoZSBuZXh0IHJlbGVhc2UuIFwiICtcbiAgICAgICAgICAgICAgICAgICAgICAgIFwiUGxlYXNlIHVzZSByZXNwb25zZVByZXBhcmVkIGluc3RlYWQuXCIpO1xuICAgICAgICAgICAgICAgICAgICB5aWVsZCBob29rLnJlcXVlc3RQcmVwYXJlZChjdHgpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9LFxuICAgICAgICByZXNwb25zZVByZXBhcmVkKGN0eCkge1xuICAgICAgICAgICAgcmV0dXJuIF9fYXdhaXRlcih0aGlzLCB2b2lkIDAsIHZvaWQgMCwgZnVuY3Rpb24qICgpIHtcbiAgICAgICAgICAgICAgICBmb3IgKGNvbnN0IGhvb2sgb2YgaG9va3MpIHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKCFob29rLnJlc3BvbnNlUHJlcGFyZWQpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIHlpZWxkIGhvb2sucmVzcG9uc2VQcmVwYXJlZChjdHgpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9LFxuICAgICAgICByZXF1ZXN0U2VudChjdHgpIHtcbiAgICAgICAgICAgIHJldHVybiBfX2F3YWl0ZXIodGhpcywgdm9pZCAwLCB2b2lkIDAsIGZ1bmN0aW9uKiAoKSB7XG4gICAgICAgICAgICAgICAgZm9yIChjb25zdCBob29rIG9mIGhvb2tzKSB7XG4gICAgICAgICAgICAgICAgICAgIGlmICghaG9vay5yZXF1ZXN0U2VudCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgY29uc29sZS53YXJuKFwiaG9vayByZXF1ZXN0U2VudCBpcyBkZXByZWNhdGVkIGFuZCB3aWxsIGJlIHJlbW92ZWQgaW4gdGhlIG5leHQgcmVsZWFzZS4gXCIgK1xuICAgICAgICAgICAgICAgICAgICAgICAgXCJQbGVhc2UgdXNlIHJlc3BvbnNlU2VudCBpbnN0ZWFkLlwiKTtcbiAgICAgICAgICAgICAgICAgICAgeWllbGQgaG9vay5yZXF1ZXN0U2VudChjdHgpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9LFxuICAgICAgICByZXNwb25zZVNlbnQoY3R4KSB7XG4gICAgICAgICAgICByZXR1cm4gX19hd2FpdGVyKHRoaXMsIHZvaWQgMCwgdm9pZCAwLCBmdW5jdGlvbiogKCkge1xuICAgICAgICAgICAgICAgIGZvciAoY29uc3QgaG9vayBvZiBob29rcykge1xuICAgICAgICAgICAgICAgICAgICBpZiAoIWhvb2sucmVzcG9uc2VTZW50KSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB5aWVsZCBob29rLnJlc3BvbnNlU2VudChjdHgpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9LFxuICAgICAgICByZXF1ZXN0Um91dGVkKGN0eCkge1xuICAgICAgICAgICAgcmV0dXJuIF9fYXdhaXRlcih0aGlzLCB2b2lkIDAsIHZvaWQgMCwgZnVuY3Rpb24qICgpIHtcbiAgICAgICAgICAgICAgICBmb3IgKGNvbnN0IGhvb2sgb2YgaG9va3MpIHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKCFob29rLnJlcXVlc3RSb3V0ZWQpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIHlpZWxkIGhvb2sucmVxdWVzdFJvdXRlZChjdHgpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9LFxuICAgICAgICBlcnJvcihjdHgsIGVycikge1xuICAgICAgICAgICAgcmV0dXJuIF9fYXdhaXRlcih0aGlzLCB2b2lkIDAsIHZvaWQgMCwgZnVuY3Rpb24qICgpIHtcbiAgICAgICAgICAgICAgICBmb3IgKGNvbnN0IGhvb2sgb2YgaG9va3MpIHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKCFob29rLmVycm9yKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB5aWVsZCBob29rLmVycm9yKGN0eCwgZXJyKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfSxcbiAgICB9O1xuICAgIHJldHVybiBzZXJ2ZXJIb29rO1xufVxuZXhwb3J0cy5jaGFpbkhvb2tzID0gY2hhaW5Ib29rcztcbmZ1bmN0aW9uIGlzSG9vayhvYmplY3QpIHtcbiAgICByZXR1cm4gKFwicmVxdWVzdFJlY2VpdmVkXCIgaW4gb2JqZWN0IHx8XG4gICAgICAgIFwicmVxdWVzdFByZXBhcmVkXCIgaW4gb2JqZWN0IHx8XG4gICAgICAgIFwicmVxdWVzdFNlbnRcIiBpbiBvYmplY3QgfHxcbiAgICAgICAgXCJyZXF1ZXN0Um91dGVkXCIgaW4gb2JqZWN0IHx8XG4gICAgICAgIFwicmVzcG9uc2VQcmVwYXJlZFwiIGluIG9iamVjdCB8fFxuICAgICAgICBcInJlc3BvbnNlU2VudFwiIGluIG9iamVjdCB8fFxuICAgICAgICBcImVycm9yXCIgaW4gb2JqZWN0KTtcbn1cbmV4cG9ydHMuaXNIb29rID0gaXNIb29rO1xuIiwKICAgICJcInVzZSBzdHJpY3RcIjtcbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIl9fZXNNb2R1bGVcIiwgeyB2YWx1ZTogdHJ1ZSB9KTtcbmV4cG9ydHMuaXNWYWxpZEVycm9yQ29kZSA9IGV4cG9ydHMuaHR0cFN0YXR1c0Zyb21FcnJvckNvZGUgPSBleHBvcnRzLlR3aXJwRXJyb3JDb2RlID0gZXhwb3J0cy5CYWRSb3V0ZUVycm9yID0gZXhwb3J0cy5JbnRlcm5hbFNlcnZlckVycm9yV2l0aCA9IGV4cG9ydHMuSW50ZXJuYWxTZXJ2ZXJFcnJvciA9IGV4cG9ydHMuUmVxdWlyZWRBcmd1bWVudEVycm9yID0gZXhwb3J0cy5JbnZhbGlkQXJndW1lbnRFcnJvciA9IGV4cG9ydHMuTm90Rm91bmRFcnJvciA9IGV4cG9ydHMuVHdpcnBFcnJvciA9IHZvaWQgMDtcbi8qKlxuICogUmVwcmVzZW50cyBhIHR3aXJwIGVycm9yXG4gKi9cbmNsYXNzIFR3aXJwRXJyb3IgZXh0ZW5kcyBFcnJvciB7XG4gICAgY29uc3RydWN0b3IoY29kZSwgbXNnKSB7XG4gICAgICAgIHN1cGVyKG1zZyk7XG4gICAgICAgIHRoaXMuY29kZSA9IFR3aXJwRXJyb3JDb2RlLkludGVybmFsO1xuICAgICAgICB0aGlzLm1ldGEgPSB7fTtcbiAgICAgICAgdGhpcy5jb2RlID0gY29kZTtcbiAgICAgICAgdGhpcy5tc2cgPSBtc2c7XG4gICAgICAgIE9iamVjdC5zZXRQcm90b3R5cGVPZih0aGlzLCBUd2lycEVycm9yLnByb3RvdHlwZSk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIEFkZHMgYSBtZXRhZGF0YSBrdiB0byB0aGUgZXJyb3JcbiAgICAgKiBAcGFyYW0ga2V5XG4gICAgICogQHBhcmFtIHZhbHVlXG4gICAgICovXG4gICAgd2l0aE1ldGEoa2V5LCB2YWx1ZSkge1xuICAgICAgICB0aGlzLm1ldGFba2V5XSA9IHZhbHVlO1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9XG4gICAgLyoqXG4gICAgICogUmV0dXJucyBhIHNpbmdsZSBtZXRhZGF0YSB2YWx1ZVxuICAgICAqIHJldHVybiBcIlwiIGlmIG5vdCBmb3VuZFxuICAgICAqIEBwYXJhbSBrZXlcbiAgICAgKi9cbiAgICBnZXRNZXRhKGtleSkge1xuICAgICAgICByZXR1cm4gdGhpcy5tZXRhW2tleV0gfHwgXCJcIjtcbiAgICB9XG4gICAgLyoqXG4gICAgICogQWRkIHRoZSBvcmlnaW5hbCBlcnJvciBjYXVzZVxuICAgICAqIEBwYXJhbSBlcnJcbiAgICAgKiBAcGFyYW0gYWRkTWV0YVxuICAgICAqL1xuICAgIHdpdGhDYXVzZShlcnIsIGFkZE1ldGEgPSBmYWxzZSkge1xuICAgICAgICB0aGlzLl9vcmlnaW5hbENhdXNlID0gZXJyO1xuICAgICAgICBpZiAoYWRkTWV0YSkge1xuICAgICAgICAgICAgdGhpcy53aXRoTWV0YShcImNhdXNlXCIsIGVyci5tZXNzYWdlKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9XG4gICAgY2F1c2UoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLl9vcmlnaW5hbENhdXNlO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBSZXR1cm5zIHRoZSBlcnJvciByZXByZXNlbnRhdGlvbiB0byBKU09OXG4gICAgICovXG4gICAgdG9KU09OKCkge1xuICAgICAgICB0cnkge1xuICAgICAgICAgICAgcmV0dXJuIEpTT04uc3RyaW5naWZ5KHtcbiAgICAgICAgICAgICAgICBjb2RlOiB0aGlzLmNvZGUsXG4gICAgICAgICAgICAgICAgbXNnOiB0aGlzLm1zZyxcbiAgICAgICAgICAgICAgICBtZXRhOiB0aGlzLm1ldGEsXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgICAgICBjYXRjaCAoZSkge1xuICAgICAgICAgICAgcmV0dXJuIGB7XCJjb2RlXCI6IFwiaW50ZXJuYWxcIiwgXCJtc2dcIjogXCJUaGVyZSB3YXMgYW4gZXJyb3IgYnV0IGl0IGNvdWxkIG5vdCBiZSBzZXJpYWxpemVkIGludG8gSlNPTlwifWA7XG4gICAgICAgIH1cbiAgICB9XG4gICAgLyoqXG4gICAgICogQ3JlYXRlIGEgdHdpcnAgZXJyb3IgZnJvbSBhbiBvYmplY3RcbiAgICAgKiBAcGFyYW0gb2JqXG4gICAgICovXG4gICAgc3RhdGljIGZyb21PYmplY3Qob2JqKSB7XG4gICAgICAgIGNvbnN0IGNvZGUgPSBvYmpbXCJjb2RlXCJdIHx8IFR3aXJwRXJyb3JDb2RlLlVua25vd247XG4gICAgICAgIGNvbnN0IG1zZyA9IG9ialtcIm1zZ1wiXSB8fCBcInVua25vd25cIjtcbiAgICAgICAgY29uc3QgZXJyb3IgPSBuZXcgVHdpcnBFcnJvcihjb2RlLCBtc2cpO1xuICAgICAgICBpZiAob2JqW1wibWV0YVwiXSkge1xuICAgICAgICAgICAgT2JqZWN0LmtleXMob2JqW1wibWV0YVwiXSkuZm9yRWFjaCgoa2V5KSA9PiB7XG4gICAgICAgICAgICAgICAgZXJyb3Iud2l0aE1ldGEoa2V5LCBvYmpbXCJtZXRhXCJdW2tleV0pO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGVycm9yO1xuICAgIH1cbn1cbmV4cG9ydHMuVHdpcnBFcnJvciA9IFR3aXJwRXJyb3I7XG4vKipcbiAqIE5vdEZvdW5kRXJyb3IgY29uc3RydWN0b3IgZm9yIHRoZSBjb21tb24gTm90Rm91bmQgZXJyb3IuXG4gKi9cbmNsYXNzIE5vdEZvdW5kRXJyb3IgZXh0ZW5kcyBUd2lycEVycm9yIHtcbiAgICBjb25zdHJ1Y3Rvcihtc2cpIHtcbiAgICAgICAgc3VwZXIoVHdpcnBFcnJvckNvZGUuTm90Rm91bmQsIG1zZyk7XG4gICAgfVxufVxuZXhwb3J0cy5Ob3RGb3VuZEVycm9yID0gTm90Rm91bmRFcnJvcjtcbi8qKlxuICogSW52YWxpZEFyZ3VtZW50RXJyb3IgY29uc3RydWN0b3IgZm9yIHRoZSBjb21tb24gSW52YWxpZEFyZ3VtZW50IGVycm9yLiBDYW4gYmVcbiAqIHVzZWQgd2hlbiBhbiBhcmd1bWVudCBoYXMgaW52YWxpZCBmb3JtYXQsIGlzIGEgbnVtYmVyIG91dCBvZiByYW5nZSwgaXMgYSBiYWRcbiAqIG9wdGlvbiwgZXRjKS5cbiAqL1xuY2xhc3MgSW52YWxpZEFyZ3VtZW50RXJyb3IgZXh0ZW5kcyBUd2lycEVycm9yIHtcbiAgICBjb25zdHJ1Y3Rvcihhcmd1bWVudCwgdmFsaWRhdGlvbk1zZykge1xuICAgICAgICBzdXBlcihUd2lycEVycm9yQ29kZS5JbnZhbGlkQXJndW1lbnQsIGFyZ3VtZW50ICsgXCIgXCIgKyB2YWxpZGF0aW9uTXNnKTtcbiAgICAgICAgdGhpcy53aXRoTWV0YShcImFyZ3VtZW50XCIsIGFyZ3VtZW50KTtcbiAgICB9XG59XG5leHBvcnRzLkludmFsaWRBcmd1bWVudEVycm9yID0gSW52YWxpZEFyZ3VtZW50RXJyb3I7XG4vKipcbiAqIFJlcXVpcmVkQXJndW1lbnRFcnJvciBpcyBhIG1vcmUgc3BlY2lmaWMgY29uc3RydWN0b3IgZm9yIEludmFsaWRBcmd1bWVudFxuICogZXJyb3IuIFNob3VsZCBiZSB1c2VkIHdoZW4gdGhlIGFyZ3VtZW50IGlzIHJlcXVpcmVkIChleHBlY3RlZCB0byBoYXZlIGFcbiAqIG5vbi16ZXJvIHZhbHVlKS5cbiAqL1xuY2xhc3MgUmVxdWlyZWRBcmd1bWVudEVycm9yIGV4dGVuZHMgSW52YWxpZEFyZ3VtZW50RXJyb3Ige1xuICAgIGNvbnN0cnVjdG9yKGFyZ3VtZW50KSB7XG4gICAgICAgIHN1cGVyKGFyZ3VtZW50LCBcImlzIHJlcXVpcmVkXCIpO1xuICAgIH1cbn1cbmV4cG9ydHMuUmVxdWlyZWRBcmd1bWVudEVycm9yID0gUmVxdWlyZWRBcmd1bWVudEVycm9yO1xuLyoqXG4gKiBJbnRlcm5hbEVycm9yIGNvbnN0cnVjdG9yIGZvciB0aGUgY29tbW9uIEludGVybmFsIGVycm9yLiBTaG91bGQgYmUgdXNlZCB0b1xuICogc3BlY2lmeSB0aGF0IHNvbWV0aGluZyBiYWQgb3IgdW5leHBlY3RlZCBoYXBwZW5lZC5cbiAqL1xuY2xhc3MgSW50ZXJuYWxTZXJ2ZXJFcnJvciBleHRlbmRzIFR3aXJwRXJyb3Ige1xuICAgIGNvbnN0cnVjdG9yKG1zZykge1xuICAgICAgICBzdXBlcihUd2lycEVycm9yQ29kZS5JbnRlcm5hbCwgbXNnKTtcbiAgICB9XG59XG5leHBvcnRzLkludGVybmFsU2VydmVyRXJyb3IgPSBJbnRlcm5hbFNlcnZlckVycm9yO1xuLyoqXG4gKiBJbnRlcm5hbEVycm9yV2l0aCBtYWtlcyBhbiBpbnRlcm5hbCBlcnJvciwgd3JhcHBpbmcgdGhlIG9yaWdpbmFsIGVycm9yIGFuZCB1c2luZyBpdFxuICogZm9yIHRoZSBlcnJvciBtZXNzYWdlLCBhbmQgd2l0aCBtZXRhZGF0YSBcImNhdXNlXCIgd2l0aCB0aGUgb3JpZ2luYWwgZXJyb3IgdHlwZS5cbiAqIFRoaXMgZnVuY3Rpb24gaXMgdXNlZCBieSBUd2lycCBzZXJ2aWNlcyB0byB3cmFwIG5vbi1Ud2lycCBlcnJvcnMgYXMgaW50ZXJuYWwgZXJyb3JzLlxuICogVGhlIHdyYXBwZWQgZXJyb3IgY2FuIGJlIGV4dHJhY3RlZCBsYXRlciB3aXRoIGVyci5jYXVzZSgpXG4gKi9cbmNsYXNzIEludGVybmFsU2VydmVyRXJyb3JXaXRoIGV4dGVuZHMgSW50ZXJuYWxTZXJ2ZXJFcnJvciB7XG4gICAgY29uc3RydWN0b3IoZXJyKSB7XG4gICAgICAgIHN1cGVyKGVyci5tZXNzYWdlKTtcbiAgICAgICAgdGhpcy53aXRoTWV0YShcImNhdXNlXCIsIGVyci5uYW1lKTtcbiAgICAgICAgdGhpcy53aXRoQ2F1c2UoZXJyKTtcbiAgICB9XG59XG5leHBvcnRzLkludGVybmFsU2VydmVyRXJyb3JXaXRoID0gSW50ZXJuYWxTZXJ2ZXJFcnJvcldpdGg7XG4vKipcbiAqIEEgc3RhbmRhcmQgQmFkUm91dGUgRXJyb3JcbiAqL1xuY2xhc3MgQmFkUm91dGVFcnJvciBleHRlbmRzIFR3aXJwRXJyb3Ige1xuICAgIGNvbnN0cnVjdG9yKG1zZywgbWV0aG9kLCB1cmwpIHtcbiAgICAgICAgc3VwZXIoVHdpcnBFcnJvckNvZGUuQmFkUm91dGUsIG1zZyk7XG4gICAgICAgIHRoaXMud2l0aE1ldGEoXCJ0d2lycF9pbnZhbGlkX3JvdXRlXCIsIG1ldGhvZCArIFwiIFwiICsgdXJsKTtcbiAgICB9XG59XG5leHBvcnRzLkJhZFJvdXRlRXJyb3IgPSBCYWRSb3V0ZUVycm9yO1xudmFyIFR3aXJwRXJyb3JDb2RlO1xuKGZ1bmN0aW9uIChUd2lycEVycm9yQ29kZSkge1xuICAgIC8vIENhbmNlbGVkIGluZGljYXRlcyB0aGUgb3BlcmF0aW9uIHdhcyBjYW5jZWxsZWQgKHR5cGljYWxseSBieSB0aGUgY2FsbGVyKS5cbiAgICBUd2lycEVycm9yQ29kZVtcIkNhbmNlbGVkXCJdID0gXCJjYW5jZWxlZFwiO1xuICAgIC8vIFVua25vd24gZXJyb3IuIEZvciBleGFtcGxlIHdoZW4gaGFuZGxpbmcgZXJyb3JzIHJhaXNlZCBieSBBUElzIHRoYXQgZG8gbm90XG4gICAgLy8gcmV0dXJuIGVub3VnaCBlcnJvciBpbmZvcm1hdGlvbi5cbiAgICBUd2lycEVycm9yQ29kZVtcIlVua25vd25cIl0gPSBcInVua25vd25cIjtcbiAgICAvLyBJbnZhbGlkQXJndW1lbnQgaW5kaWNhdGVzIGNsaWVudCBzcGVjaWZpZWQgYW4gaW52YWxpZCBhcmd1bWVudC4gSXRcbiAgICAvLyBpbmRpY2F0ZXMgYXJndW1lbnRzIHRoYXQgYXJlIHByb2JsZW1hdGljIHJlZ2FyZGxlc3Mgb2YgdGhlIHN0YXRlIG9mIHRoZVxuICAgIC8vIHN5c3RlbSAoaS5lLiBhIG1hbGZvcm1lZCBmaWxlIG5hbWUsIHJlcXVpcmVkIGFyZ3VtZW50LCBudW1iZXIgb3V0IG9mIHJhbmdlLFxuICAgIC8vIGV0Yy4pLlxuICAgIFR3aXJwRXJyb3JDb2RlW1wiSW52YWxpZEFyZ3VtZW50XCJdID0gXCJpbnZhbGlkX2FyZ3VtZW50XCI7XG4gICAgLy8gTWFsZm9ybWVkIGluZGljYXRlcyBhbiBlcnJvciBvY2N1cnJlZCB3aGlsZSBkZWNvZGluZyB0aGUgY2xpZW50J3MgcmVxdWVzdC5cbiAgICAvLyBUaGlzIG1heSBtZWFuIHRoYXQgdGhlIG1lc3NhZ2Ugd2FzIGVuY29kZWQgaW1wcm9wZXJseSwgb3IgdGhhdCB0aGVyZSBpcyBhXG4gICAgLy8gZGlzYWdyZWVtZW50IGluIG1lc3NhZ2UgZm9ybWF0IGJldHdlZW4gdGhlIGNsaWVudCBhbmQgc2VydmVyLlxuICAgIFR3aXJwRXJyb3JDb2RlW1wiTWFsZm9ybWVkXCJdID0gXCJtYWxmb3JtZWRcIjtcbiAgICAvLyBEZWFkbGluZUV4Y2VlZGVkIG1lYW5zIG9wZXJhdGlvbiBleHBpcmVkIGJlZm9yZSBjb21wbGV0aW9uLiBGb3Igb3BlcmF0aW9uc1xuICAgIC8vIHRoYXQgY2hhbmdlIHRoZSBzdGF0ZSBvZiB0aGUgc3lzdGVtLCB0aGlzIGVycm9yIG1heSBiZSByZXR1cm5lZCBldmVuIGlmIHRoZVxuICAgIC8vIG9wZXJhdGlvbiBoYXMgY29tcGxldGVkIHN1Y2Nlc3NmdWxseSAodGltZW91dCkuXG4gICAgVHdpcnBFcnJvckNvZGVbXCJEZWFkbGluZUV4Y2VlZGVkXCJdID0gXCJkZWFkbGluZV9leGNlZWRlZFwiO1xuICAgIC8vIE5vdEZvdW5kIG1lYW5zIHNvbWUgcmVxdWVzdGVkIGVudGl0eSB3YXMgbm90IGZvdW5kLlxuICAgIFR3aXJwRXJyb3JDb2RlW1wiTm90Rm91bmRcIl0gPSBcIm5vdF9mb3VuZFwiO1xuICAgIC8vIEJhZFJvdXRlIG1lYW5zIHRoYXQgdGhlIHJlcXVlc3RlZCBVUkwgcGF0aCB3YXNuJ3Qgcm91dGFibGUgdG8gYSBUd2lycFxuICAgIC8vIHNlcnZpY2UgYW5kIG1ldGhvZC4gVGhpcyBpcyByZXR1cm5lZCBieSB0aGUgZ2VuZXJhdGVkIHNlcnZlciwgYW5kIHVzdWFsbHlcbiAgICAvLyBzaG91bGRuJ3QgYmUgcmV0dXJuZWQgYnkgYXBwbGljYXRpb25zLiBJbnN0ZWFkLCBhcHBsaWNhdGlvbnMgc2hvdWxkIHVzZVxuICAgIC8vIE5vdEZvdW5kIG9yIFVuaW1wbGVtZW50ZWQuXG4gICAgVHdpcnBFcnJvckNvZGVbXCJCYWRSb3V0ZVwiXSA9IFwiYmFkX3JvdXRlXCI7XG4gICAgLy8gQWxyZWFkeUV4aXN0cyBtZWFucyBhbiBhdHRlbXB0IHRvIGNyZWF0ZSBhbiBlbnRpdHkgZmFpbGVkIGJlY2F1c2Ugb25lXG4gICAgLy8gYWxyZWFkeSBleGlzdHMuXG4gICAgVHdpcnBFcnJvckNvZGVbXCJBbHJlYWR5RXhpc3RzXCJdID0gXCJhbHJlYWR5X2V4aXN0c1wiO1xuICAgIC8vIFBlcm1pc3Npb25EZW5pZWQgaW5kaWNhdGVzIHRoZSBjYWxsZXIgZG9lcyBub3QgaGF2ZSBwZXJtaXNzaW9uIHRvIGV4ZWN1dGVcbiAgICAvLyB0aGUgc3BlY2lmaWVkIG9wZXJhdGlvbi4gSXQgbXVzdCBub3QgYmUgdXNlZCBpZiB0aGUgY2FsbGVyIGNhbm5vdCBiZVxuICAgIC8vIGlkZW50aWZpZWQgKFVuYXV0aGVudGljYXRlZCkuXG4gICAgVHdpcnBFcnJvckNvZGVbXCJQZXJtaXNzaW9uRGVuaWVkXCJdID0gXCJwZXJtaXNzaW9uX2RlbmllZFwiO1xuICAgIC8vIFVuYXV0aGVudGljYXRlZCBpbmRpY2F0ZXMgdGhlIHJlcXVlc3QgZG9lcyBub3QgaGF2ZSB2YWxpZCBhdXRoZW50aWNhdGlvblxuICAgIC8vIGNyZWRlbnRpYWxzIGZvciB0aGUgb3BlcmF0aW9uLlxuICAgIFR3aXJwRXJyb3JDb2RlW1wiVW5hdXRoZW50aWNhdGVkXCJdID0gXCJ1bmF1dGhlbnRpY2F0ZWRcIjtcbiAgICAvLyBSZXNvdXJjZUV4aGF1c3RlZCBpbmRpY2F0ZXMgc29tZSByZXNvdXJjZSBoYXMgYmVlbiBleGhhdXN0ZWQsIHBlcmhhcHMgYVxuICAgIC8vIHBlci11c2VyIHF1b3RhLCBvciBwZXJoYXBzIHRoZSBlbnRpcmUgZmlsZSBzeXN0ZW0gaXMgb3V0IG9mIHNwYWNlLlxuICAgIFR3aXJwRXJyb3JDb2RlW1wiUmVzb3VyY2VFeGhhdXN0ZWRcIl0gPSBcInJlc291cmNlX2V4aGF1c3RlZFwiO1xuICAgIC8vIEZhaWxlZFByZWNvbmRpdGlvbiBpbmRpY2F0ZXMgb3BlcmF0aW9uIHdhcyByZWplY3RlZCBiZWNhdXNlIHRoZSBzeXN0ZW0gaXNcbiAgICAvLyBub3QgaW4gYSBzdGF0ZSByZXF1aXJlZCBmb3IgdGhlIG9wZXJhdGlvbidzIGV4ZWN1dGlvbi4gRm9yIGV4YW1wbGUsIGRvaW5nXG4gICAgLy8gYW4gcm1kaXIgb3BlcmF0aW9uIG9uIGEgZGlyZWN0b3J5IHRoYXQgaXMgbm9uLWVtcHR5LCBvciBvbiBhIG5vbi1kaXJlY3RvcnlcbiAgICAvLyBvYmplY3QsIG9yIHdoZW4gaGF2aW5nIGNvbmZsaWN0aW5nIHJlYWQtbW9kaWZ5LXdyaXRlIG9uIHRoZSBzYW1lIHJlc291cmNlLlxuICAgIFR3aXJwRXJyb3JDb2RlW1wiRmFpbGVkUHJlY29uZGl0aW9uXCJdID0gXCJmYWlsZWRfcHJlY29uZGl0aW9uXCI7XG4gICAgLy8gQWJvcnRlZCBpbmRpY2F0ZXMgdGhlIG9wZXJhdGlvbiB3YXMgYWJvcnRlZCwgdHlwaWNhbGx5IGR1ZSB0byBhIGNvbmN1cnJlbmN5XG4gICAgLy8gaXNzdWUgbGlrZSBzZXF1ZW5jZXIgY2hlY2sgZmFpbHVyZXMsIHRyYW5zYWN0aW9uIGFib3J0cywgZXRjLlxuICAgIFR3aXJwRXJyb3JDb2RlW1wiQWJvcnRlZFwiXSA9IFwiYWJvcnRlZFwiO1xuICAgIC8vIE91dE9mUmFuZ2UgbWVhbnMgb3BlcmF0aW9uIHdhcyBhdHRlbXB0ZWQgcGFzdCB0aGUgdmFsaWQgcmFuZ2UuIEZvciBleGFtcGxlLFxuICAgIC8vIHNlZWtpbmcgb3IgcmVhZGluZyBwYXN0IGVuZCBvZiBhIHBhZ2luYXRlZCBjb2xsZWN0aW9uLlxuICAgIC8vXG4gICAgLy8gVW5saWtlIEludmFsaWRBcmd1bWVudCwgdGhpcyBlcnJvciBpbmRpY2F0ZXMgYSBwcm9ibGVtIHRoYXQgbWF5IGJlIGZpeGVkIGlmXG4gICAgLy8gdGhlIHN5c3RlbSBzdGF0ZSBjaGFuZ2VzIChpLmUuIGFkZGluZyBtb3JlIGl0ZW1zIHRvIHRoZSBjb2xsZWN0aW9uKS5cbiAgICAvL1xuICAgIC8vIFRoZXJlIGlzIGEgZmFpciBiaXQgb2Ygb3ZlcmxhcCBiZXR3ZWVuIEZhaWxlZFByZWNvbmRpdGlvbiBhbmQgT3V0T2ZSYW5nZS5cbiAgICAvLyBXZSByZWNvbW1lbmQgdXNpbmcgT3V0T2ZSYW5nZSAodGhlIG1vcmUgc3BlY2lmaWMgZXJyb3IpIHdoZW4gaXQgYXBwbGllcyBzb1xuICAgIC8vIHRoYXQgY2FsbGVycyB3aG8gYXJlIGl0ZXJhdGluZyB0aHJvdWdoIGEgc3BhY2UgY2FuIGVhc2lseSBsb29rIGZvciBhblxuICAgIC8vIE91dE9mUmFuZ2UgZXJyb3IgdG8gZGV0ZWN0IHdoZW4gdGhleSBhcmUgZG9uZS5cbiAgICBUd2lycEVycm9yQ29kZVtcIk91dE9mUmFuZ2VcIl0gPSBcIm91dF9vZl9yYW5nZVwiO1xuICAgIC8vIFVuaW1wbGVtZW50ZWQgaW5kaWNhdGVzIG9wZXJhdGlvbiBpcyBub3QgaW1wbGVtZW50ZWQgb3Igbm90XG4gICAgLy8gc3VwcG9ydGVkL2VuYWJsZWQgaW4gdGhpcyBzZXJ2aWNlLlxuICAgIFR3aXJwRXJyb3JDb2RlW1wiVW5pbXBsZW1lbnRlZFwiXSA9IFwidW5pbXBsZW1lbnRlZFwiO1xuICAgIC8vIEludGVybmFsIGVycm9ycy4gV2hlbiBzb21lIGludmFyaWFudHMgZXhwZWN0ZWQgYnkgdGhlIHVuZGVybHlpbmcgc3lzdGVtXG4gICAgLy8gaGF2ZSBiZWVuIGJyb2tlbi4gSW4gb3RoZXIgd29yZHMsIHNvbWV0aGluZyBiYWQgaGFwcGVuZWQgaW4gdGhlIGxpYnJhcnkgb3JcbiAgICAvLyBiYWNrZW5kIHNlcnZpY2UuIERvIG5vdCBjb25mdXNlIHdpdGggSFRUUCBJbnRlcm5hbCBTZXJ2ZXIgRXJyb3I7IGFuXG4gICAgLy8gSW50ZXJuYWwgZXJyb3IgY291bGQgYWxzbyBoYXBwZW4gb24gdGhlIGNsaWVudCBjb2RlLCBpLmUuIHdoZW4gcGFyc2luZyBhXG4gICAgLy8gc2VydmVyIHJlc3BvbnNlLlxuICAgIFR3aXJwRXJyb3JDb2RlW1wiSW50ZXJuYWxcIl0gPSBcImludGVybmFsXCI7XG4gICAgLy8gVW5hdmFpbGFibGUgaW5kaWNhdGVzIHRoZSBzZXJ2aWNlIGlzIGN1cnJlbnRseSB1bmF2YWlsYWJsZS4gVGhpcyBpcyBhIG1vc3RcbiAgICAvLyBsaWtlbHkgYSB0cmFuc2llbnQgY29uZGl0aW9uIGFuZCBtYXkgYmUgY29ycmVjdGVkIGJ5IHJldHJ5aW5nIHdpdGggYVxuICAgIC8vIGJhY2tvZmYuXG4gICAgVHdpcnBFcnJvckNvZGVbXCJVbmF2YWlsYWJsZVwiXSA9IFwidW5hdmFpbGFibGVcIjtcbiAgICAvLyBEYXRhTG9zcyBpbmRpY2F0ZXMgdW5yZWNvdmVyYWJsZSBkYXRhIGxvc3Mgb3IgY29ycnVwdGlvbi5cbiAgICBUd2lycEVycm9yQ29kZVtcIkRhdGFMb3NzXCJdID0gXCJkYXRhX2xvc3NcIjtcbn0pKFR3aXJwRXJyb3JDb2RlID0gZXhwb3J0cy5Ud2lycEVycm9yQ29kZSB8fCAoZXhwb3J0cy5Ud2lycEVycm9yQ29kZSA9IHt9KSk7XG4vLyBTZXJ2ZXJIVFRQU3RhdHVzRnJvbUVycm9yQ29kZSBtYXBzIGEgVHdpcnAgZXJyb3IgdHlwZSBpbnRvIGEgc2ltaWxhciBIVFRQXG4vLyByZXNwb25zZSBzdGF0dXMuIEl0IGlzIHVzZWQgYnkgdGhlIFR3aXJwIHNlcnZlciBoYW5kbGVyIHRvIHNldCB0aGUgSFRUUFxuLy8gcmVzcG9uc2Ugc3RhdHVzIGNvZGUuIFJldHVybnMgMCBpZiB0aGUgRXJyb3JDb2RlIGlzIGludmFsaWQuXG5mdW5jdGlvbiBodHRwU3RhdHVzRnJvbUVycm9yQ29kZShjb2RlKSB7XG4gICAgc3dpdGNoIChjb2RlKSB7XG4gICAgICAgIGNhc2UgVHdpcnBFcnJvckNvZGUuQ2FuY2VsZWQ6XG4gICAgICAgICAgICByZXR1cm4gNDA4OyAvLyBSZXF1ZXN0VGltZW91dFxuICAgICAgICBjYXNlIFR3aXJwRXJyb3JDb2RlLlVua25vd246XG4gICAgICAgICAgICByZXR1cm4gNTAwOyAvLyBJbnRlcm5hbCBTZXJ2ZXIgRXJyb3JcbiAgICAgICAgY2FzZSBUd2lycEVycm9yQ29kZS5JbnZhbGlkQXJndW1lbnQ6XG4gICAgICAgICAgICByZXR1cm4gNDAwOyAvLyBCYWRSZXF1ZXN0XG4gICAgICAgIGNhc2UgVHdpcnBFcnJvckNvZGUuTWFsZm9ybWVkOlxuICAgICAgICAgICAgcmV0dXJuIDQwMDsgLy8gQmFkUmVxdWVzdFxuICAgICAgICBjYXNlIFR3aXJwRXJyb3JDb2RlLkRlYWRsaW5lRXhjZWVkZWQ6XG4gICAgICAgICAgICByZXR1cm4gNDA4OyAvLyBSZXF1ZXN0VGltZW91dFxuICAgICAgICBjYXNlIFR3aXJwRXJyb3JDb2RlLk5vdEZvdW5kOlxuICAgICAgICAgICAgcmV0dXJuIDQwNDsgLy8gTm90IEZvdW5kXG4gICAgICAgIGNhc2UgVHdpcnBFcnJvckNvZGUuQmFkUm91dGU6XG4gICAgICAgICAgICByZXR1cm4gNDA0OyAvLyBOb3QgRm91bmRcbiAgICAgICAgY2FzZSBUd2lycEVycm9yQ29kZS5BbHJlYWR5RXhpc3RzOlxuICAgICAgICAgICAgcmV0dXJuIDQwOTsgLy8gQ29uZmxpY3RcbiAgICAgICAgY2FzZSBUd2lycEVycm9yQ29kZS5QZXJtaXNzaW9uRGVuaWVkOlxuICAgICAgICAgICAgcmV0dXJuIDQwMzsgLy8gRm9yYmlkZGVuXG4gICAgICAgIGNhc2UgVHdpcnBFcnJvckNvZGUuVW5hdXRoZW50aWNhdGVkOlxuICAgICAgICAgICAgcmV0dXJuIDQwMTsgLy8gVW5hdXRob3JpemVkXG4gICAgICAgIGNhc2UgVHdpcnBFcnJvckNvZGUuUmVzb3VyY2VFeGhhdXN0ZWQ6XG4gICAgICAgICAgICByZXR1cm4gNDI5OyAvLyBUb28gTWFueSBSZXF1ZXN0c1xuICAgICAgICBjYXNlIFR3aXJwRXJyb3JDb2RlLkZhaWxlZFByZWNvbmRpdGlvbjpcbiAgICAgICAgICAgIHJldHVybiA0MTI7IC8vIFByZWNvbmRpdGlvbiBGYWlsZWRcbiAgICAgICAgY2FzZSBUd2lycEVycm9yQ29kZS5BYm9ydGVkOlxuICAgICAgICAgICAgcmV0dXJuIDQwOTsgLy8gQ29uZmxpY3RcbiAgICAgICAgY2FzZSBUd2lycEVycm9yQ29kZS5PdXRPZlJhbmdlOlxuICAgICAgICAgICAgcmV0dXJuIDQwMDsgLy8gQmFkIFJlcXVlc3RcbiAgICAgICAgY2FzZSBUd2lycEVycm9yQ29kZS5VbmltcGxlbWVudGVkOlxuICAgICAgICAgICAgcmV0dXJuIDUwMTsgLy8gTm90IEltcGxlbWVudGVkXG4gICAgICAgIGNhc2UgVHdpcnBFcnJvckNvZGUuSW50ZXJuYWw6XG4gICAgICAgICAgICByZXR1cm4gNTAwOyAvLyBJbnRlcm5hbCBTZXJ2ZXIgRXJyb3JcbiAgICAgICAgY2FzZSBUd2lycEVycm9yQ29kZS5VbmF2YWlsYWJsZTpcbiAgICAgICAgICAgIHJldHVybiA1MDM7IC8vIFNlcnZpY2UgVW5hdmFpbGFibGVcbiAgICAgICAgY2FzZSBUd2lycEVycm9yQ29kZS5EYXRhTG9zczpcbiAgICAgICAgICAgIHJldHVybiA1MDA7IC8vIEludGVybmFsIFNlcnZlciBFcnJvclxuICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgICAgcmV0dXJuIDA7IC8vIEludmFsaWQhXG4gICAgfVxufVxuZXhwb3J0cy5odHRwU3RhdHVzRnJvbUVycm9yQ29kZSA9IGh0dHBTdGF0dXNGcm9tRXJyb3JDb2RlO1xuLy8gSXNWYWxpZEVycm9yQ29kZSByZXR1cm5zIHRydWUgaWYgaXMgb25lIG9mIHRoZSB2YWxpZCBwcmVkZWZpbmVkIGNvbnN0YW50cy5cbmZ1bmN0aW9uIGlzVmFsaWRFcnJvckNvZGUoY29kZSkge1xuICAgIHJldHVybiBodHRwU3RhdHVzRnJvbUVycm9yQ29kZShjb2RlKSAhPSAwO1xufVxuZXhwb3J0cy5pc1ZhbGlkRXJyb3JDb2RlID0gaXNWYWxpZEVycm9yQ29kZTtcbiIsCiAgICAiXCJ1c2Ugc3RyaWN0XCI7XG52YXIgX19hd2FpdGVyID0gKHRoaXMgJiYgdGhpcy5fX2F3YWl0ZXIpIHx8IGZ1bmN0aW9uICh0aGlzQXJnLCBfYXJndW1lbnRzLCBQLCBnZW5lcmF0b3IpIHtcbiAgICBmdW5jdGlvbiBhZG9wdCh2YWx1ZSkgeyByZXR1cm4gdmFsdWUgaW5zdGFuY2VvZiBQID8gdmFsdWUgOiBuZXcgUChmdW5jdGlvbiAocmVzb2x2ZSkgeyByZXNvbHZlKHZhbHVlKTsgfSk7IH1cbiAgICByZXR1cm4gbmV3IChQIHx8IChQID0gUHJvbWlzZSkpKGZ1bmN0aW9uIChyZXNvbHZlLCByZWplY3QpIHtcbiAgICAgICAgZnVuY3Rpb24gZnVsZmlsbGVkKHZhbHVlKSB7IHRyeSB7IHN0ZXAoZ2VuZXJhdG9yLm5leHQodmFsdWUpKTsgfSBjYXRjaCAoZSkgeyByZWplY3QoZSk7IH0gfVxuICAgICAgICBmdW5jdGlvbiByZWplY3RlZCh2YWx1ZSkgeyB0cnkgeyBzdGVwKGdlbmVyYXRvcltcInRocm93XCJdKHZhbHVlKSk7IH0gY2F0Y2ggKGUpIHsgcmVqZWN0KGUpOyB9IH1cbiAgICAgICAgZnVuY3Rpb24gc3RlcChyZXN1bHQpIHsgcmVzdWx0LmRvbmUgPyByZXNvbHZlKHJlc3VsdC52YWx1ZSkgOiBhZG9wdChyZXN1bHQudmFsdWUpLnRoZW4oZnVsZmlsbGVkLCByZWplY3RlZCk7IH1cbiAgICAgICAgc3RlcCgoZ2VuZXJhdG9yID0gZ2VuZXJhdG9yLmFwcGx5KHRoaXNBcmcsIF9hcmd1bWVudHMgfHwgW10pKS5uZXh0KCkpO1xuICAgIH0pO1xufTtcbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIl9fZXNNb2R1bGVcIiwgeyB2YWx1ZTogdHJ1ZSB9KTtcbmV4cG9ydHMucGFyc2VUd2lycFBhdGggPSBleHBvcnRzLmdldFJlcXVlc3REYXRhID0gZXhwb3J0cy52YWxpZGF0ZVJlcXVlc3QgPSBleHBvcnRzLmdldENvbnRlbnRUeXBlID0gZXhwb3J0cy5Ud2lycENvbnRlbnRUeXBlID0gdm9pZCAwO1xuY29uc3QgZXJyb3JzXzEgPSByZXF1aXJlKFwiLi9lcnJvcnNcIik7XG4vKipcbiAqIFN1cHBvcnRlZCBUd2lycCBDb250ZW50LVR5cGVcbiAqL1xudmFyIFR3aXJwQ29udGVudFR5cGU7XG4oZnVuY3Rpb24gKFR3aXJwQ29udGVudFR5cGUpIHtcbiAgICBUd2lycENvbnRlbnRUeXBlW1R3aXJwQ29udGVudFR5cGVbXCJQcm90b2J1ZlwiXSA9IDBdID0gXCJQcm90b2J1ZlwiO1xuICAgIFR3aXJwQ29udGVudFR5cGVbVHdpcnBDb250ZW50VHlwZVtcIkpTT05cIl0gPSAxXSA9IFwiSlNPTlwiO1xuICAgIFR3aXJwQ29udGVudFR5cGVbVHdpcnBDb250ZW50VHlwZVtcIlVua25vd25cIl0gPSAyXSA9IFwiVW5rbm93blwiO1xufSkoVHdpcnBDb250ZW50VHlwZSA9IGV4cG9ydHMuVHdpcnBDb250ZW50VHlwZSB8fCAoZXhwb3J0cy5Ud2lycENvbnRlbnRUeXBlID0ge30pKTtcbi8qKlxuICogR2V0IHN1cHBvcnRlZCBjb250ZW50LXR5cGVcbiAqIEBwYXJhbSBtaW1lVHlwZVxuICovXG5mdW5jdGlvbiBnZXRDb250ZW50VHlwZShtaW1lVHlwZSkge1xuICAgIHN3aXRjaCAobWltZVR5cGUpIHtcbiAgICAgICAgY2FzZSBcImFwcGxpY2F0aW9uL3Byb3RvYnVmXCI6XG4gICAgICAgICAgICByZXR1cm4gVHdpcnBDb250ZW50VHlwZS5Qcm90b2J1ZjtcbiAgICAgICAgY2FzZSBcImFwcGxpY2F0aW9uL2pzb25cIjpcbiAgICAgICAgICAgIHJldHVybiBUd2lycENvbnRlbnRUeXBlLkpTT047XG4gICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgICByZXR1cm4gVHdpcnBDb250ZW50VHlwZS5Vbmtub3duO1xuICAgIH1cbn1cbmV4cG9ydHMuZ2V0Q29udGVudFR5cGUgPSBnZXRDb250ZW50VHlwZTtcbi8qKlxuICogVmFsaWRhdGUgYSB0d2lycCByZXF1ZXN0XG4gKiBAcGFyYW0gY3R4XG4gKiBAcGFyYW0gcmVxdWVzdFxuICogQHBhcmFtIHBhdGhQcmVmaXhcbiAqL1xuZnVuY3Rpb24gdmFsaWRhdGVSZXF1ZXN0KGN0eCwgcmVxdWVzdCwgcGF0aFByZWZpeCkge1xuICAgIGlmIChyZXF1ZXN0Lm1ldGhvZCAhPT0gXCJQT1NUXCIpIHtcbiAgICAgICAgY29uc3QgbXNnID0gYHVuc3VwcG9ydGVkIG1ldGhvZCAke3JlcXVlc3QubWV0aG9kfSAob25seSBQT1NUIGlzIGFsbG93ZWQpYDtcbiAgICAgICAgdGhyb3cgbmV3IGVycm9yc18xLkJhZFJvdXRlRXJyb3IobXNnLCByZXF1ZXN0Lm1ldGhvZCB8fCBcIlwiLCByZXF1ZXN0LnVybCB8fCBcIlwiKTtcbiAgICB9XG4gICAgY29uc3QgcGF0aCA9IHBhcnNlVHdpcnBQYXRoKHJlcXVlc3QudXJsIHx8IFwiXCIpO1xuICAgIGlmIChwYXRoLnBrZ1NlcnZpY2UgIT09XG4gICAgICAgIChjdHgucGFja2FnZU5hbWUgPyBjdHgucGFja2FnZU5hbWUgKyBcIi5cIiA6IFwiXCIpICsgY3R4LnNlcnZpY2VOYW1lKSB7XG4gICAgICAgIGNvbnN0IG1zZyA9IGBubyBoYW5kbGVyIGZvciBwYXRoICR7cmVxdWVzdC51cmx9YDtcbiAgICAgICAgdGhyb3cgbmV3IGVycm9yc18xLkJhZFJvdXRlRXJyb3IobXNnLCByZXF1ZXN0Lm1ldGhvZCB8fCBcIlwiLCByZXF1ZXN0LnVybCB8fCBcIlwiKTtcbiAgICB9XG4gICAgaWYgKHBhdGgucHJlZml4ICE9PSBwYXRoUHJlZml4KSB7XG4gICAgICAgIGNvbnN0IG1zZyA9IGBpbnZhbGlkIHBhdGggcHJlZml4ICR7cGF0aC5wcmVmaXh9LCBleHBlY3RlZCAke3BhdGhQcmVmaXh9LCBvbiBwYXRoICR7cmVxdWVzdC51cmx9YDtcbiAgICAgICAgdGhyb3cgbmV3IGVycm9yc18xLkJhZFJvdXRlRXJyb3IobXNnLCByZXF1ZXN0Lm1ldGhvZCB8fCBcIlwiLCByZXF1ZXN0LnVybCB8fCBcIlwiKTtcbiAgICB9XG4gICAgY29uc3QgbWltZUNvbnRlbnRUeXBlID0gcmVxdWVzdC5oZWFkZXJzW1wiY29udGVudC10eXBlXCJdIHx8IFwiXCI7XG4gICAgaWYgKGN0eC5jb250ZW50VHlwZSA9PT0gVHdpcnBDb250ZW50VHlwZS5Vbmtub3duKSB7XG4gICAgICAgIGNvbnN0IG1zZyA9IGB1bmV4cGVjdGVkIENvbnRlbnQtVHlwZTogJHtyZXF1ZXN0LmhlYWRlcnNbXCJjb250ZW50LXR5cGVcIl19YDtcbiAgICAgICAgdGhyb3cgbmV3IGVycm9yc18xLkJhZFJvdXRlRXJyb3IobXNnLCByZXF1ZXN0Lm1ldGhvZCB8fCBcIlwiLCByZXF1ZXN0LnVybCB8fCBcIlwiKTtcbiAgICB9XG4gICAgcmV0dXJuIE9iamVjdC5hc3NpZ24oT2JqZWN0LmFzc2lnbih7fSwgcGF0aCksIHsgbWltZUNvbnRlbnRUeXBlLCBjb250ZW50VHlwZTogY3R4LmNvbnRlbnRUeXBlIH0pO1xufVxuZXhwb3J0cy52YWxpZGF0ZVJlcXVlc3QgPSB2YWxpZGF0ZVJlcXVlc3Q7XG4vKipcbiAqIEdldCByZXF1ZXN0IGRhdGEgZnJvbSB0aGUgYm9keVxuICogQHBhcmFtIHJlcVxuICovXG5mdW5jdGlvbiBnZXRSZXF1ZXN0RGF0YShyZXEpIHtcbiAgICByZXR1cm4gbmV3IFByb21pc2UoKHJlc29sdmUsIHJlamVjdCkgPT4ge1xuICAgICAgICBjb25zdCByZXFXaXRoUmF3Qm9keSA9IHJlcTtcbiAgICAgICAgaWYgKHJlcVdpdGhSYXdCb2R5LnJhd0JvZHkgaW5zdGFuY2VvZiBCdWZmZXIpIHtcbiAgICAgICAgICAgIHJlc29sdmUocmVxV2l0aFJhd0JvZHkucmF3Qm9keSk7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgY2h1bmtzID0gW107XG4gICAgICAgIHJlcS5vbihcImRhdGFcIiwgKGNodW5rKSA9PiBjaHVua3MucHVzaChjaHVuaykpO1xuICAgICAgICByZXEub24oXCJlbmRcIiwgKCkgPT4gX19hd2FpdGVyKHRoaXMsIHZvaWQgMCwgdm9pZCAwLCBmdW5jdGlvbiogKCkge1xuICAgICAgICAgICAgY29uc3QgZGF0YSA9IEJ1ZmZlci5jb25jYXQoY2h1bmtzKTtcbiAgICAgICAgICAgIHJlc29sdmUoZGF0YSk7XG4gICAgICAgIH0pKTtcbiAgICAgICAgcmVxLm9uKFwiZXJyb3JcIiwgKGVycikgPT4ge1xuICAgICAgICAgICAgaWYgKHJlcS5hYm9ydGVkKSB7XG4gICAgICAgICAgICAgICAgcmVqZWN0KG5ldyBlcnJvcnNfMS5Ud2lycEVycm9yKGVycm9yc18xLlR3aXJwRXJyb3JDb2RlLkRlYWRsaW5lRXhjZWVkZWQsIFwiZmFpbGVkIHRvIHJlYWQgcmVxdWVzdDogZGVhZGxpbmUgZXhjZWVkZWRcIikpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgcmVqZWN0KG5ldyBlcnJvcnNfMS5Ud2lycEVycm9yKGVycm9yc18xLlR3aXJwRXJyb3JDb2RlLk1hbGZvcm1lZCwgZXJyLm1lc3NhZ2UpLndpdGhDYXVzZShlcnIpKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgICAgIHJlcS5vbihcImNsb3NlXCIsICgpID0+IHtcbiAgICAgICAgICAgIHJlamVjdChuZXcgZXJyb3JzXzEuVHdpcnBFcnJvcihlcnJvcnNfMS5Ud2lycEVycm9yQ29kZS5DYW5jZWxlZCwgXCJmYWlsZWQgdG8gcmVhZCByZXF1ZXN0OiBjb250ZXh0IGNhbmNlbGVkXCIpKTtcbiAgICAgICAgfSk7XG4gICAgfSk7XG59XG5leHBvcnRzLmdldFJlcXVlc3REYXRhID0gZ2V0UmVxdWVzdERhdGE7XG4vKipcbiAqIFBhcnNlcyB0d2lycCB1cmwgcGF0aFxuICogQHBhcmFtIHBhdGhcbiAqL1xuZnVuY3Rpb24gcGFyc2VUd2lycFBhdGgocGF0aCkge1xuICAgIGNvbnN0IHBhcnRzID0gcGF0aC5zcGxpdChcIi9cIik7XG4gICAgaWYgKHBhcnRzLmxlbmd0aCA8IDIpIHtcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgIHBrZ1NlcnZpY2U6IFwiXCIsXG4gICAgICAgICAgICBtZXRob2Q6IFwiXCIsXG4gICAgICAgICAgICBwcmVmaXg6IFwiXCIsXG4gICAgICAgIH07XG4gICAgfVxuICAgIHJldHVybiB7XG4gICAgICAgIG1ldGhvZDogcGFydHNbcGFydHMubGVuZ3RoIC0gMV0sXG4gICAgICAgIHBrZ1NlcnZpY2U6IHBhcnRzW3BhcnRzLmxlbmd0aCAtIDJdLFxuICAgICAgICBwcmVmaXg6IHBhcnRzLnNsaWNlKDAsIHBhcnRzLmxlbmd0aCAtIDIpLmpvaW4oXCIvXCIpLFxuICAgIH07XG59XG5leHBvcnRzLnBhcnNlVHdpcnBQYXRoID0gcGFyc2VUd2lycFBhdGg7XG4iLAogICAgIlwidXNlIHN0cmljdFwiO1xudmFyIF9fYXdhaXRlciA9ICh0aGlzICYmIHRoaXMuX19hd2FpdGVyKSB8fCBmdW5jdGlvbiAodGhpc0FyZywgX2FyZ3VtZW50cywgUCwgZ2VuZXJhdG9yKSB7XG4gICAgZnVuY3Rpb24gYWRvcHQodmFsdWUpIHsgcmV0dXJuIHZhbHVlIGluc3RhbmNlb2YgUCA/IHZhbHVlIDogbmV3IFAoZnVuY3Rpb24gKHJlc29sdmUpIHsgcmVzb2x2ZSh2YWx1ZSk7IH0pOyB9XG4gICAgcmV0dXJuIG5ldyAoUCB8fCAoUCA9IFByb21pc2UpKShmdW5jdGlvbiAocmVzb2x2ZSwgcmVqZWN0KSB7XG4gICAgICAgIGZ1bmN0aW9uIGZ1bGZpbGxlZCh2YWx1ZSkgeyB0cnkgeyBzdGVwKGdlbmVyYXRvci5uZXh0KHZhbHVlKSk7IH0gY2F0Y2ggKGUpIHsgcmVqZWN0KGUpOyB9IH1cbiAgICAgICAgZnVuY3Rpb24gcmVqZWN0ZWQodmFsdWUpIHsgdHJ5IHsgc3RlcChnZW5lcmF0b3JbXCJ0aHJvd1wiXSh2YWx1ZSkpOyB9IGNhdGNoIChlKSB7IHJlamVjdChlKTsgfSB9XG4gICAgICAgIGZ1bmN0aW9uIHN0ZXAocmVzdWx0KSB7IHJlc3VsdC5kb25lID8gcmVzb2x2ZShyZXN1bHQudmFsdWUpIDogYWRvcHQocmVzdWx0LnZhbHVlKS50aGVuKGZ1bGZpbGxlZCwgcmVqZWN0ZWQpOyB9XG4gICAgICAgIHN0ZXAoKGdlbmVyYXRvciA9IGdlbmVyYXRvci5hcHBseSh0aGlzQXJnLCBfYXJndW1lbnRzIHx8IFtdKSkubmV4dCgpKTtcbiAgICB9KTtcbn07XG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJfX2VzTW9kdWxlXCIsIHsgdmFsdWU6IHRydWUgfSk7XG5leHBvcnRzLndyaXRlRXJyb3IgPSBleHBvcnRzLlR3aXJwU2VydmVyID0gdm9pZCAwO1xuY29uc3QgaG9va3NfMSA9IHJlcXVpcmUoXCIuL2hvb2tzXCIpO1xuY29uc3QgcmVxdWVzdF8xID0gcmVxdWlyZShcIi4vcmVxdWVzdFwiKTtcbmNvbnN0IGVycm9yc18xID0gcmVxdWlyZShcIi4vZXJyb3JzXCIpO1xuLyoqXG4gKiBSdW50aW1lIHNlcnZlciBpbXBsZW1lbnRhdGlvbiBvZiBhIFR3aXJwU2VydmVyXG4gKi9cbmNsYXNzIFR3aXJwU2VydmVyIHtcbiAgICBjb25zdHJ1Y3RvcihvcHRpb25zKSB7XG4gICAgICAgIHRoaXMucGF0aFByZWZpeCA9IFwiL3R3aXJwXCI7XG4gICAgICAgIHRoaXMuaG9va3MgPSBbXTtcbiAgICAgICAgdGhpcy5pbnRlcmNlcHRvcnMgPSBbXTtcbiAgICAgICAgdGhpcy5wYWNrYWdlTmFtZSA9IG9wdGlvbnMucGFja2FnZU5hbWU7XG4gICAgICAgIHRoaXMuc2VydmljZU5hbWUgPSBvcHRpb25zLnNlcnZpY2VOYW1lO1xuICAgICAgICB0aGlzLm1ldGhvZExpc3QgPSBvcHRpb25zLm1ldGhvZExpc3Q7XG4gICAgICAgIHRoaXMubWF0Y2hSb3V0ZSA9IG9wdGlvbnMubWF0Y2hSb3V0ZTtcbiAgICAgICAgdGhpcy5zZXJ2aWNlID0gb3B0aW9ucy5zZXJ2aWNlO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBSZXR1cm5zIHRoZSBwcmVmaXggZm9yIHRoaXMgc2VydmVyXG4gICAgICovXG4gICAgZ2V0IHByZWZpeCgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMucGF0aFByZWZpeDtcbiAgICB9XG4gICAgLyoqXG4gICAgICogVGhlIGh0dHAgaGFuZGxlciBmb3IgdHdpcnAgY29tcGxhaW50IGVuZHBvaW50c1xuICAgICAqIEBwYXJhbSBvcHRpb25zXG4gICAgICovXG4gICAgaHR0cEhhbmRsZXIob3B0aW9ucykge1xuICAgICAgICByZXR1cm4gKHJlcSwgcmVzcCkgPT4ge1xuICAgICAgICAgICAgLy8gc2V0dXAgcHJlZml4XG4gICAgICAgICAgICBpZiAoKG9wdGlvbnMgPT09IG51bGwgfHwgb3B0aW9ucyA9PT0gdm9pZCAwID8gdm9pZCAwIDogb3B0aW9ucy5wcmVmaXgpICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgICAgICB0aGlzLndpdGhQcmVmaXgob3B0aW9ucy5wcmVmaXgpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIHRoaXMuX2h0dHBIYW5kbGVyKHJlcSwgcmVzcCk7XG4gICAgICAgIH07XG4gICAgfVxuICAgIC8qKlxuICAgICAqIEFkZHMgaW50ZXJjZXB0b3JzIG9yIGhvb2tzIHRvIHRoZSByZXF1ZXN0IHN0YWNrXG4gICAgICogQHBhcmFtIG1pZGRsZXdhcmVzXG4gICAgICovXG4gICAgdXNlKC4uLm1pZGRsZXdhcmVzKSB7XG4gICAgICAgIG1pZGRsZXdhcmVzLmZvckVhY2goKG1pZGRsZXdhcmUpID0+IHtcbiAgICAgICAgICAgIGlmIChob29rc18xLmlzSG9vayhtaWRkbGV3YXJlKSkge1xuICAgICAgICAgICAgICAgIHRoaXMuaG9va3MucHVzaChtaWRkbGV3YXJlKTtcbiAgICAgICAgICAgICAgICByZXR1cm4gdGhpcztcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHRoaXMuaW50ZXJjZXB0b3JzLnB1c2gobWlkZGxld2FyZSk7XG4gICAgICAgIH0pO1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9XG4gICAgLyoqXG4gICAgICogQWRkcyBhIHByZWZpeCB0byB0aGUgc2VydmljZSB1cmwgcGF0aFxuICAgICAqIEBwYXJhbSBwcmVmaXhcbiAgICAgKi9cbiAgICB3aXRoUHJlZml4KHByZWZpeCkge1xuICAgICAgICBpZiAocHJlZml4ID09PSBmYWxzZSkge1xuICAgICAgICAgICAgdGhpcy5wYXRoUHJlZml4ID0gXCJcIjtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIHRoaXMucGF0aFByZWZpeCA9IHByZWZpeDtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9XG4gICAgLyoqXG4gICAgICogUmV0dXJucyB0aGUgcmVnZXggbWF0Y2hpbmcgcGF0aCBmb3IgdGhpcyB0d2lycCBzZXJ2ZXJcbiAgICAgKi9cbiAgICBtYXRjaGluZ1BhdGgoKSB7XG4gICAgICAgIGNvbnN0IGJhc2VSZWdleCA9IHRoaXMuYmFzZVVSSSgpLnJlcGxhY2UoL1xcLi9nLCBcIlxcXFwuXCIpO1xuICAgICAgICByZXR1cm4gbmV3IFJlZ0V4cChgJHtiYXNlUmVnZXh9XFwvKCR7dGhpcy5tZXRob2RMaXN0LmpvaW4oXCJ8XCIpfSlgKTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogUmV0dXJucyB0aGUgYmFzZSBVUkkgZm9yIHRoaXMgdHdpcnAgc2VydmVyXG4gICAgICovXG4gICAgYmFzZVVSSSgpIHtcbiAgICAgICAgcmV0dXJuIGAke3RoaXMucGF0aFByZWZpeH0vJHt0aGlzLnBhY2thZ2VOYW1lID8gdGhpcy5wYWNrYWdlTmFtZSArIFwiLlwiIDogXCJcIn0ke3RoaXMuc2VydmljZU5hbWV9YDtcbiAgICB9XG4gICAgLyoqXG4gICAgICogQ3JlYXRlIGEgdHdpcnAgY29udGV4dFxuICAgICAqIEBwYXJhbSByZXFcbiAgICAgKiBAcGFyYW0gcmVzXG4gICAgICogQHByaXZhdGVcbiAgICAgKi9cbiAgICBjcmVhdGVDb250ZXh0KHJlcSwgcmVzKSB7XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICBwYWNrYWdlTmFtZTogdGhpcy5wYWNrYWdlTmFtZSxcbiAgICAgICAgICAgIHNlcnZpY2VOYW1lOiB0aGlzLnNlcnZpY2VOYW1lLFxuICAgICAgICAgICAgbWV0aG9kTmFtZTogXCJcIixcbiAgICAgICAgICAgIGNvbnRlbnRUeXBlOiByZXF1ZXN0XzEuZ2V0Q29udGVudFR5cGUocmVxLmhlYWRlcnNbXCJjb250ZW50LXR5cGVcIl0pLFxuICAgICAgICAgICAgcmVxOiByZXEsXG4gICAgICAgICAgICByZXM6IHJlcyxcbiAgICAgICAgfTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogVHdyaXAgc2VydmVyIGh0dHAgaGFuZGxlciBpbXBsZW1lbnRhdGlvblxuICAgICAqIEBwYXJhbSByZXFcbiAgICAgKiBAcGFyYW0gcmVzcFxuICAgICAqIEBwcml2YXRlXG4gICAgICovXG4gICAgX2h0dHBIYW5kbGVyKHJlcSwgcmVzcCkge1xuICAgICAgICByZXR1cm4gX19hd2FpdGVyKHRoaXMsIHZvaWQgMCwgdm9pZCAwLCBmdW5jdGlvbiogKCkge1xuICAgICAgICAgICAgY29uc3QgY3R4ID0gdGhpcy5jcmVhdGVDb250ZXh0KHJlcSwgcmVzcCk7XG4gICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgIHlpZWxkIHRoaXMuaW52b2tlSG9vayhcInJlcXVlc3RSZWNlaXZlZFwiLCBjdHgpO1xuICAgICAgICAgICAgICAgIGNvbnN0IHsgbWV0aG9kLCBtaW1lQ29udGVudFR5cGUgfSA9IHJlcXVlc3RfMS52YWxpZGF0ZVJlcXVlc3QoY3R4LCByZXEsIHRoaXMucGF0aFByZWZpeCB8fCBcIlwiKTtcbiAgICAgICAgICAgICAgICBjb25zdCBoYW5kbGVyID0gdGhpcy5tYXRjaFJvdXRlKG1ldGhvZCwge1xuICAgICAgICAgICAgICAgICAgICBvbk1hdGNoOiAoY3R4KSA9PiB7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5pbnZva2VIb29rKFwicmVxdWVzdFJvdXRlZFwiLCBjdHgpO1xuICAgICAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgICAgICBvbk5vdEZvdW5kOiAoKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBtc2cgPSBgbm8gaGFuZGxlciBmb3IgcGF0aCAke3JlcS51cmx9YDtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBlcnJvcnNfMS5CYWRSb3V0ZUVycm9yKG1zZywgcmVxLm1ldGhvZCB8fCBcIlwiLCByZXEudXJsIHx8IFwiXCIpO1xuICAgICAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgIGNvbnN0IGJvZHkgPSB5aWVsZCByZXF1ZXN0XzEuZ2V0UmVxdWVzdERhdGEocmVxKTtcbiAgICAgICAgICAgICAgICBjb25zdCByZXNwb25zZSA9IHlpZWxkIGhhbmRsZXIoY3R4LCB0aGlzLnNlcnZpY2UsIGJvZHksIHRoaXMuaW50ZXJjZXB0b3JzKTtcbiAgICAgICAgICAgICAgICB5aWVsZCBQcm9taXNlLmFsbChbXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuaW52b2tlSG9vayhcInJlc3BvbnNlUHJlcGFyZWRcIiwgY3R4KSxcbiAgICAgICAgICAgICAgICAgICAgLy8ga2VlcCBiYWNrd2FyZHMgY29tcGF0aWJpbGl0eSB0aWxsIG5leHQgcmVsZWFzZVxuICAgICAgICAgICAgICAgICAgICB0aGlzLmludm9rZUhvb2soXCJyZXF1ZXN0UHJlcGFyZWRcIiwgY3R4KSxcbiAgICAgICAgICAgICAgICBdKTtcbiAgICAgICAgICAgICAgICByZXNwLnN0YXR1c0NvZGUgPSAyMDA7XG4gICAgICAgICAgICAgICAgcmVzcC5zZXRIZWFkZXIoXCJDb250ZW50LVR5cGVcIiwgbWltZUNvbnRlbnRUeXBlKTtcbiAgICAgICAgICAgICAgICByZXNwLmVuZChyZXNwb25zZSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBjYXRjaCAoZSkge1xuICAgICAgICAgICAgICAgIHlpZWxkIHRoaXMuaW52b2tlSG9vayhcImVycm9yXCIsIGN0eCwgbXVzdEJlVHdpcnBFcnJvcihlKSk7XG4gICAgICAgICAgICAgICAgaWYgKCFyZXNwLmhlYWRlcnNTZW50KSB7XG4gICAgICAgICAgICAgICAgICAgIHdyaXRlRXJyb3IocmVzcCwgZSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZmluYWxseSB7XG4gICAgICAgICAgICAgICAgeWllbGQgUHJvbWlzZS5hbGwoW1xuICAgICAgICAgICAgICAgICAgICB0aGlzLmludm9rZUhvb2soXCJyZXNwb25zZVNlbnRcIiwgY3R4KSxcbiAgICAgICAgICAgICAgICAgICAgLy8ga2VlcCBiYWNrd2FyZHMgY29tcGF0aWJpbGl0eSB0aWxsIG5leHQgcmVsZWFzZVxuICAgICAgICAgICAgICAgICAgICB0aGlzLmludm9rZUhvb2soXCJyZXF1ZXN0U2VudFwiLCBjdHgpLFxuICAgICAgICAgICAgICAgIF0pO1xuICAgICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogSW52b2tlIGEgaG9va1xuICAgICAqIEBwYXJhbSBob29rTmFtZVxuICAgICAqIEBwYXJhbSBjdHhcbiAgICAgKiBAcGFyYW0gZXJyXG4gICAgICogQHByb3RlY3RlZFxuICAgICAqL1xuICAgIGludm9rZUhvb2soaG9va05hbWUsIGN0eCwgZXJyKSB7XG4gICAgICAgIHJldHVybiBfX2F3YWl0ZXIodGhpcywgdm9pZCAwLCB2b2lkIDAsIGZ1bmN0aW9uKiAoKSB7XG4gICAgICAgICAgICBpZiAodGhpcy5ob29rcy5sZW5ndGggPT09IDApIHtcbiAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBjb25zdCBjaGFpbmVkSG9va3MgPSBob29rc18xLmNoYWluSG9va3MoLi4udGhpcy5ob29rcyk7XG4gICAgICAgICAgICBjb25zdCBob29rID0gY2hhaW5lZEhvb2tzID09PSBudWxsIHx8IGNoYWluZWRIb29rcyA9PT0gdm9pZCAwID8gdm9pZCAwIDogY2hhaW5lZEhvb2tzW2hvb2tOYW1lXTtcbiAgICAgICAgICAgIGlmIChob29rKSB7XG4gICAgICAgICAgICAgICAgeWllbGQgaG9vayhjdHgsIGVyciB8fCBuZXcgZXJyb3JzXzEuSW50ZXJuYWxTZXJ2ZXJFcnJvcihcImludGVybmFsIHNlcnZlciBlcnJvclwiKSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgIH1cbn1cbmV4cG9ydHMuVHdpcnBTZXJ2ZXIgPSBUd2lycFNlcnZlcjtcbi8qKlxuICogV3JpdGUgaHR0cCBlcnJvciByZXNwb25zZVxuICogQHBhcmFtIHJlc1xuICogQHBhcmFtIGVycm9yXG4gKi9cbmZ1bmN0aW9uIHdyaXRlRXJyb3IocmVzLCBlcnJvcikge1xuICAgIGNvbnN0IHR3aXJwRXJyb3IgPSBtdXN0QmVUd2lycEVycm9yKGVycm9yKTtcbiAgICByZXMuc2V0SGVhZGVyKFwiQ29udGVudC1UeXBlXCIsIFwiYXBwbGljYXRpb24vanNvblwiKTtcbiAgICByZXMuc3RhdHVzQ29kZSA9IGVycm9yc18xLmh0dHBTdGF0dXNGcm9tRXJyb3JDb2RlKHR3aXJwRXJyb3IuY29kZSk7XG4gICAgcmVzLmVuZCh0d2lycEVycm9yLnRvSlNPTigpKTtcbn1cbmV4cG9ydHMud3JpdGVFcnJvciA9IHdyaXRlRXJyb3I7XG4vKipcbiAqIE1ha2Ugc3VyZSB0aGF0IHRoZSBlcnJvciBwYXNzZWQgaXMgYSBUd2lycEVycm9yXG4gKiBvdGhlcndpc2UgaXQgd2lsbCB3cmFwIGl0IGludG8gYW4gSW50ZXJuYWxFcnJvclxuICogQHBhcmFtIGVyclxuICovXG5mdW5jdGlvbiBtdXN0QmVUd2lycEVycm9yKGVycikge1xuICAgIGlmIChlcnIgaW5zdGFuY2VvZiBlcnJvcnNfMS5Ud2lycEVycm9yKSB7XG4gICAgICAgIHJldHVybiBlcnI7XG4gICAgfVxuICAgIHJldHVybiBuZXcgZXJyb3JzXzEuSW50ZXJuYWxTZXJ2ZXJFcnJvcldpdGgoZXJyKTtcbn1cbiIsCiAgICAiXCJ1c2Ugc3RyaWN0XCI7XG52YXIgX19hd2FpdGVyID0gKHRoaXMgJiYgdGhpcy5fX2F3YWl0ZXIpIHx8IGZ1bmN0aW9uICh0aGlzQXJnLCBfYXJndW1lbnRzLCBQLCBnZW5lcmF0b3IpIHtcbiAgICBmdW5jdGlvbiBhZG9wdCh2YWx1ZSkgeyByZXR1cm4gdmFsdWUgaW5zdGFuY2VvZiBQID8gdmFsdWUgOiBuZXcgUChmdW5jdGlvbiAocmVzb2x2ZSkgeyByZXNvbHZlKHZhbHVlKTsgfSk7IH1cbiAgICByZXR1cm4gbmV3IChQIHx8IChQID0gUHJvbWlzZSkpKGZ1bmN0aW9uIChyZXNvbHZlLCByZWplY3QpIHtcbiAgICAgICAgZnVuY3Rpb24gZnVsZmlsbGVkKHZhbHVlKSB7IHRyeSB7IHN0ZXAoZ2VuZXJhdG9yLm5leHQodmFsdWUpKTsgfSBjYXRjaCAoZSkgeyByZWplY3QoZSk7IH0gfVxuICAgICAgICBmdW5jdGlvbiByZWplY3RlZCh2YWx1ZSkgeyB0cnkgeyBzdGVwKGdlbmVyYXRvcltcInRocm93XCJdKHZhbHVlKSk7IH0gY2F0Y2ggKGUpIHsgcmVqZWN0KGUpOyB9IH1cbiAgICAgICAgZnVuY3Rpb24gc3RlcChyZXN1bHQpIHsgcmVzdWx0LmRvbmUgPyByZXNvbHZlKHJlc3VsdC52YWx1ZSkgOiBhZG9wdChyZXN1bHQudmFsdWUpLnRoZW4oZnVsZmlsbGVkLCByZWplY3RlZCk7IH1cbiAgICAgICAgc3RlcCgoZ2VuZXJhdG9yID0gZ2VuZXJhdG9yLmFwcGx5KHRoaXNBcmcsIF9hcmd1bWVudHMgfHwgW10pKS5uZXh0KCkpO1xuICAgIH0pO1xufTtcbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIl9fZXNNb2R1bGVcIiwgeyB2YWx1ZTogdHJ1ZSB9KTtcbmV4cG9ydHMuY2hhaW5JbnRlcmNlcHRvcnMgPSB2b2lkIDA7XG4vLyBjaGFpbnMgbXVsdGlwbGUgSW50ZXJjZXB0b3JzIGludG8gYSBzaW5nbGUgSW50ZXJjZXB0b3IuXG4vLyBUaGUgZmlyc3QgaW50ZXJjZXB0b3Igd3JhcHMgdGhlIHNlY29uZCBvbmUsIGFuZCBzbyBvbi5cbi8vIFJldHVybnMgbnVsbCBpZiBpbnRlcmNlcHRvcnMgaXMgZW1wdHkuXG5mdW5jdGlvbiBjaGFpbkludGVyY2VwdG9ycyguLi5pbnRlcmNlcHRvcnMpIHtcbiAgICBpZiAoaW50ZXJjZXB0b3JzLmxlbmd0aCA9PT0gMCkge1xuICAgICAgICByZXR1cm47XG4gICAgfVxuICAgIGlmIChpbnRlcmNlcHRvcnMubGVuZ3RoID09PSAxKSB7XG4gICAgICAgIHJldHVybiBpbnRlcmNlcHRvcnNbMF07XG4gICAgfVxuICAgIGNvbnN0IGZpcnN0ID0gaW50ZXJjZXB0b3JzWzBdO1xuICAgIHJldHVybiAoY3R4LCByZXF1ZXN0LCBoYW5kbGVyKSA9PiBfX2F3YWl0ZXIodGhpcywgdm9pZCAwLCB2b2lkIDAsIGZ1bmN0aW9uKiAoKSB7XG4gICAgICAgIGxldCBuZXh0ID0gaGFuZGxlcjtcbiAgICAgICAgZm9yIChsZXQgaSA9IGludGVyY2VwdG9ycy5sZW5ndGggLSAxOyBpID4gMDsgaS0tKSB7XG4gICAgICAgICAgICBuZXh0ID0gKChuZXh0KSA9PiAoY3R4LCB0eXBlZFJlcXVlc3QpID0+IHtcbiAgICAgICAgICAgICAgICByZXR1cm4gaW50ZXJjZXB0b3JzW2ldKGN0eCwgdHlwZWRSZXF1ZXN0LCBuZXh0KTtcbiAgICAgICAgICAgIH0pKG5leHQpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBmaXJzdChjdHgsIHJlcXVlc3QsIG5leHQpO1xuICAgIH0pO1xufVxuZXhwb3J0cy5jaGFpbkludGVyY2VwdG9ycyA9IGNoYWluSW50ZXJjZXB0b3JzO1xuIiwKICAgICIndXNlIHN0cmljdCdcblxuZnVuY3Rpb24gX3Byb2Nlc3MgKHYsIG1vZCkge1xuICB2YXIgaVxuICB2YXIgclxuXG4gIGlmICh0eXBlb2YgbW9kID09PSAnZnVuY3Rpb24nKSB7XG4gICAgciA9IG1vZCh2KVxuICAgIGlmIChyICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIHYgPSByXG4gICAgfVxuICB9IGVsc2UgaWYgKEFycmF5LmlzQXJyYXkobW9kKSkge1xuICAgIGZvciAoaSA9IDA7IGkgPCBtb2QubGVuZ3RoOyBpKyspIHtcbiAgICAgIHIgPSBtb2RbaV0odilcbiAgICAgIGlmIChyICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgdiA9IHJcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICByZXR1cm4gdlxufVxuXG5mdW5jdGlvbiBwYXJzZUtleSAoa2V5LCB2YWwpIHtcbiAgLy8gZGV0ZWN0IG5lZ2F0aXZlIGluZGV4IG5vdGF0aW9uXG4gIGlmIChrZXlbMF0gPT09ICctJyAmJiBBcnJheS5pc0FycmF5KHZhbCkgJiYgL14tXFxkKyQvLnRlc3Qoa2V5KSkge1xuICAgIHJldHVybiB2YWwubGVuZ3RoICsgcGFyc2VJbnQoa2V5LCAxMClcbiAgfVxuICByZXR1cm4ga2V5XG59XG5cbmZ1bmN0aW9uIGlzSW5kZXggKGspIHtcbiAgcmV0dXJuIC9eXFxkKyQvLnRlc3Qoaylcbn1cblxuZnVuY3Rpb24gaXNPYmplY3QgKHZhbCkge1xuICByZXR1cm4gT2JqZWN0LnByb3RvdHlwZS50b1N0cmluZy5jYWxsKHZhbCkgPT09ICdbb2JqZWN0IE9iamVjdF0nXG59XG5cbmZ1bmN0aW9uIGlzQXJyYXlPck9iamVjdCAodmFsKSB7XG4gIHJldHVybiBPYmplY3QodmFsKSA9PT0gdmFsXG59XG5cbmZ1bmN0aW9uIGlzRW1wdHlPYmplY3QgKHZhbCkge1xuICByZXR1cm4gT2JqZWN0LmtleXModmFsKS5sZW5ndGggPT09IDBcbn1cblxudmFyIGJsYWNrbGlzdCA9IFsnX19wcm90b19fJywgJ3Byb3RvdHlwZScsICdjb25zdHJ1Y3RvciddXG52YXIgYmxhY2tsaXN0RmlsdGVyID0gZnVuY3Rpb24gKHBhcnQpIHsgcmV0dXJuIGJsYWNrbGlzdC5pbmRleE9mKHBhcnQpID09PSAtMSB9XG5cbmZ1bmN0aW9uIHBhcnNlUGF0aCAocGF0aCwgc2VwKSB7XG4gIGlmIChwYXRoLmluZGV4T2YoJ1snKSA+PSAwKSB7XG4gICAgcGF0aCA9IHBhdGgucmVwbGFjZSgvXFxbL2csIHNlcCkucmVwbGFjZSgvXS9nLCAnJylcbiAgfVxuXG4gIHZhciBwYXJ0cyA9IHBhdGguc3BsaXQoc2VwKVxuXG4gIHZhciBjaGVjayA9IHBhcnRzLmZpbHRlcihibGFja2xpc3RGaWx0ZXIpXG5cbiAgaWYgKGNoZWNrLmxlbmd0aCAhPT0gcGFydHMubGVuZ3RoKSB7XG4gICAgdGhyb3cgRXJyb3IoJ1JlZnVzaW5nIHRvIHVwZGF0ZSBibGFja2xpc3RlZCBwcm9wZXJ0eSAnICsgcGF0aClcbiAgfVxuXG4gIHJldHVybiBwYXJ0c1xufVxuXG52YXIgaGFzT3duUHJvcGVydHkgPSBPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5XG5cbmZ1bmN0aW9uIERvdE9iamVjdCAoc2VwYXJhdG9yLCBvdmVycmlkZSwgdXNlQXJyYXksIHVzZUJyYWNrZXRzKSB7XG4gIGlmICghKHRoaXMgaW5zdGFuY2VvZiBEb3RPYmplY3QpKSB7XG4gICAgcmV0dXJuIG5ldyBEb3RPYmplY3Qoc2VwYXJhdG9yLCBvdmVycmlkZSwgdXNlQXJyYXksIHVzZUJyYWNrZXRzKVxuICB9XG5cbiAgaWYgKHR5cGVvZiBvdmVycmlkZSA9PT0gJ3VuZGVmaW5lZCcpIG92ZXJyaWRlID0gZmFsc2VcbiAgaWYgKHR5cGVvZiB1c2VBcnJheSA9PT0gJ3VuZGVmaW5lZCcpIHVzZUFycmF5ID0gdHJ1ZVxuICBpZiAodHlwZW9mIHVzZUJyYWNrZXRzID09PSAndW5kZWZpbmVkJykgdXNlQnJhY2tldHMgPSB0cnVlXG4gIHRoaXMuc2VwYXJhdG9yID0gc2VwYXJhdG9yIHx8ICcuJ1xuICB0aGlzLm92ZXJyaWRlID0gb3ZlcnJpZGVcbiAgdGhpcy51c2VBcnJheSA9IHVzZUFycmF5XG4gIHRoaXMudXNlQnJhY2tldHMgPSB1c2VCcmFja2V0c1xuICB0aGlzLmtlZXBBcnJheSA9IGZhbHNlXG5cbiAgLy8gY29udGFpbnMgdG91Y2hlZCBhcnJheXNcbiAgdGhpcy5jbGVhbnVwID0gW11cbn1cblxudmFyIGRvdERlZmF1bHQgPSBuZXcgRG90T2JqZWN0KCcuJywgZmFsc2UsIHRydWUsIHRydWUpXG5mdW5jdGlvbiB3cmFwIChtZXRob2QpIHtcbiAgcmV0dXJuIGZ1bmN0aW9uICgpIHtcbiAgICByZXR1cm4gZG90RGVmYXVsdFttZXRob2RdLmFwcGx5KGRvdERlZmF1bHQsIGFyZ3VtZW50cylcbiAgfVxufVxuXG5Eb3RPYmplY3QucHJvdG90eXBlLl9maWxsID0gZnVuY3Rpb24gKGEsIG9iaiwgdiwgbW9kKSB7XG4gIHZhciBrID0gYS5zaGlmdCgpXG5cbiAgaWYgKGEubGVuZ3RoID4gMCkge1xuICAgIG9ialtrXSA9IG9ialtrXSB8fCAodGhpcy51c2VBcnJheSAmJiBpc0luZGV4KGFbMF0pID8gW10gOiB7fSlcblxuICAgIGlmICghaXNBcnJheU9yT2JqZWN0KG9ialtrXSkpIHtcbiAgICAgIGlmICh0aGlzLm92ZXJyaWRlKSB7XG4gICAgICAgIG9ialtrXSA9IHt9XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBpZiAoIShpc0FycmF5T3JPYmplY3QodikgJiYgaXNFbXB0eU9iamVjdCh2KSkpIHtcbiAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgICAgICAnVHJ5aW5nIHRvIHJlZGVmaW5lIGAnICsgayArICdgIHdoaWNoIGlzIGEgJyArIHR5cGVvZiBvYmpba11cbiAgICAgICAgICApXG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm5cbiAgICAgIH1cbiAgICB9XG5cbiAgICB0aGlzLl9maWxsKGEsIG9ialtrXSwgdiwgbW9kKVxuICB9IGVsc2Uge1xuICAgIGlmICghdGhpcy5vdmVycmlkZSAmJiBpc0FycmF5T3JPYmplY3Qob2JqW2tdKSAmJiAhaXNFbXB0eU9iamVjdChvYmpba10pKSB7XG4gICAgICBpZiAoIShpc0FycmF5T3JPYmplY3QodikgJiYgaXNFbXB0eU9iamVjdCh2KSkpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwiVHJ5aW5nIHRvIHJlZGVmaW5lIG5vbi1lbXB0eSBvYmpbJ1wiICsgayArIFwiJ11cIilcbiAgICAgIH1cblxuICAgICAgcmV0dXJuXG4gICAgfVxuXG4gICAgb2JqW2tdID0gX3Byb2Nlc3ModiwgbW9kKVxuICB9XG59XG5cbi8qKlxuICpcbiAqIENvbnZlcnRzIGFuIG9iamVjdCB3aXRoIGRvdHRlZC1rZXkvdmFsdWUgcGFpcnMgdG8gaXQncyBleHBhbmRlZCB2ZXJzaW9uXG4gKlxuICogT3B0aW9uYWxseSB0cmFuc2Zvcm1lZCBieSBhIHNldCBvZiBtb2RpZmllcnMuXG4gKlxuICogVXNhZ2U6XG4gKlxuICogICB2YXIgcm93ID0ge1xuICogICAgICducic6IDIwMCxcbiAqICAgICAnZG9jLm5hbWUnOiAnICBNeSBEb2N1bWVudCAgJ1xuICogICB9XG4gKlxuICogICB2YXIgbW9kcyA9IHtcbiAqICAgICAnZG9jLm5hbWUnOiBbX3MudHJpbSwgX3MudW5kZXJzY29yZWRdXG4gKiAgIH1cbiAqXG4gKiAgIGRvdC5vYmplY3Qocm93LCBtb2RzKVxuICpcbiAqIEBwYXJhbSB7T2JqZWN0fSBvYmpcbiAqIEBwYXJhbSB7T2JqZWN0fSBtb2RzXG4gKi9cbkRvdE9iamVjdC5wcm90b3R5cGUub2JqZWN0ID0gZnVuY3Rpb24gKG9iaiwgbW9kcykge1xuICB2YXIgc2VsZiA9IHRoaXNcblxuICBPYmplY3Qua2V5cyhvYmopLmZvckVhY2goZnVuY3Rpb24gKGspIHtcbiAgICB2YXIgbW9kID0gbW9kcyA9PT0gdW5kZWZpbmVkID8gbnVsbCA6IG1vZHNba11cbiAgICAvLyBub3JtYWxpemUgYXJyYXkgbm90YXRpb24uXG4gICAgdmFyIG9rID0gcGFyc2VQYXRoKGssIHNlbGYuc2VwYXJhdG9yKS5qb2luKHNlbGYuc2VwYXJhdG9yKVxuXG4gICAgaWYgKG9rLmluZGV4T2Yoc2VsZi5zZXBhcmF0b3IpICE9PSAtMSkge1xuICAgICAgc2VsZi5fZmlsbChvay5zcGxpdChzZWxmLnNlcGFyYXRvciksIG9iaiwgb2JqW2tdLCBtb2QpXG4gICAgICBkZWxldGUgb2JqW2tdXG4gICAgfSBlbHNlIHtcbiAgICAgIG9ialtrXSA9IF9wcm9jZXNzKG9ialtrXSwgbW9kKVxuICAgIH1cbiAgfSlcblxuICByZXR1cm4gb2JqXG59XG5cbi8qKlxuICogQHBhcmFtIHtTdHJpbmd9IHBhdGggZG90dGVkIHBhdGhcbiAqIEBwYXJhbSB7U3RyaW5nfSB2IHZhbHVlIHRvIGJlIHNldFxuICogQHBhcmFtIHtPYmplY3R9IG9iaiBvYmplY3QgdG8gYmUgbW9kaWZpZWRcbiAqIEBwYXJhbSB7RnVuY3Rpb258QXJyYXl9IG1vZCBvcHRpb25hbCBtb2RpZmllclxuICovXG5Eb3RPYmplY3QucHJvdG90eXBlLnN0ciA9IGZ1bmN0aW9uIChwYXRoLCB2LCBvYmosIG1vZCkge1xuICB2YXIgb2sgPSBwYXJzZVBhdGgocGF0aCwgdGhpcy5zZXBhcmF0b3IpLmpvaW4odGhpcy5zZXBhcmF0b3IpXG5cbiAgaWYgKHBhdGguaW5kZXhPZih0aGlzLnNlcGFyYXRvcikgIT09IC0xKSB7XG4gICAgdGhpcy5fZmlsbChvay5zcGxpdCh0aGlzLnNlcGFyYXRvciksIG9iaiwgdiwgbW9kKVxuICB9IGVsc2Uge1xuICAgIG9ialtwYXRoXSA9IF9wcm9jZXNzKHYsIG1vZClcbiAgfVxuXG4gIHJldHVybiBvYmpcbn1cblxuLyoqXG4gKlxuICogUGljayBhIHZhbHVlIGZyb20gYW4gb2JqZWN0IHVzaW5nIGRvdCBub3RhdGlvbi5cbiAqXG4gKiBPcHRpb25hbGx5IHJlbW92ZSB0aGUgdmFsdWVcbiAqXG4gKiBAcGFyYW0ge1N0cmluZ30gcGF0aFxuICogQHBhcmFtIHtPYmplY3R9IG9ialxuICogQHBhcmFtIHtCb29sZWFufSByZW1vdmVcbiAqL1xuRG90T2JqZWN0LnByb3RvdHlwZS5waWNrID0gZnVuY3Rpb24gKHBhdGgsIG9iaiwgcmVtb3ZlLCByZWluZGV4QXJyYXkpIHtcbiAgdmFyIGlcbiAgdmFyIGtleXNcbiAgdmFyIHZhbFxuICB2YXIga2V5XG4gIHZhciBjcFxuXG4gIGtleXMgPSBwYXJzZVBhdGgocGF0aCwgdGhpcy5zZXBhcmF0b3IpXG4gIGZvciAoaSA9IDA7IGkgPCBrZXlzLmxlbmd0aDsgaSsrKSB7XG4gICAga2V5ID0gcGFyc2VLZXkoa2V5c1tpXSwgb2JqKVxuICAgIGlmIChvYmogJiYgdHlwZW9mIG9iaiA9PT0gJ29iamVjdCcgJiYga2V5IGluIG9iaikge1xuICAgICAgaWYgKGkgPT09IGtleXMubGVuZ3RoIC0gMSkge1xuICAgICAgICBpZiAocmVtb3ZlKSB7XG4gICAgICAgICAgdmFsID0gb2JqW2tleV1cbiAgICAgICAgICBpZiAocmVpbmRleEFycmF5ICYmIEFycmF5LmlzQXJyYXkob2JqKSkge1xuICAgICAgICAgICAgb2JqLnNwbGljZShrZXksIDEpXG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGRlbGV0ZSBvYmpba2V5XVxuICAgICAgICAgIH1cbiAgICAgICAgICBpZiAoQXJyYXkuaXNBcnJheShvYmopKSB7XG4gICAgICAgICAgICBjcCA9IGtleXMuc2xpY2UoMCwgLTEpLmpvaW4oJy4nKVxuICAgICAgICAgICAgaWYgKHRoaXMuY2xlYW51cC5pbmRleE9mKGNwKSA9PT0gLTEpIHtcbiAgICAgICAgICAgICAgdGhpcy5jbGVhbnVwLnB1c2goY3ApXG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICAgIHJldHVybiB2YWxcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICByZXR1cm4gb2JqW2tleV1cbiAgICAgICAgfVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgb2JqID0gb2JqW2tleV1cbiAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAgcmV0dXJuIHVuZGVmaW5lZFxuICAgIH1cbiAgfVxuICBpZiAocmVtb3ZlICYmIEFycmF5LmlzQXJyYXkob2JqKSkge1xuICAgIG9iaiA9IG9iai5maWx0ZXIoZnVuY3Rpb24gKG4pIHtcbiAgICAgIHJldHVybiBuICE9PSB1bmRlZmluZWRcbiAgICB9KVxuICB9XG4gIHJldHVybiBvYmpcbn1cbi8qKlxuICpcbiAqIERlbGV0ZSB2YWx1ZSBmcm9tIGFuIG9iamVjdCB1c2luZyBkb3Qgbm90YXRpb24uXG4gKlxuICogQHBhcmFtIHtTdHJpbmd9IHBhdGhcbiAqIEBwYXJhbSB7T2JqZWN0fSBvYmpcbiAqIEByZXR1cm4ge2FueX0gVGhlIHJlbW92ZWQgdmFsdWVcbiAqL1xuRG90T2JqZWN0LnByb3RvdHlwZS5kZWxldGUgPSBmdW5jdGlvbiAocGF0aCwgb2JqKSB7XG4gIHJldHVybiB0aGlzLnJlbW92ZShwYXRoLCBvYmosIHRydWUpXG59XG5cbi8qKlxuICpcbiAqIFJlbW92ZSB2YWx1ZSBmcm9tIGFuIG9iamVjdCB1c2luZyBkb3Qgbm90YXRpb24uXG4gKlxuICogV2lsbCByZW1vdmUgbXVsdGlwbGUgaXRlbXMgaWYgcGF0aCBpcyBhbiBhcnJheS5cbiAqIEluIHRoaXMgY2FzZSBhcnJheSBpbmRleGVzIHdpbGwgYmUgcmV0YWluZWQgdW50aWwgYWxsXG4gKiByZW1vdmFscyBoYXZlIGJlZW4gcHJvY2Vzc2VkLlxuICpcbiAqIFVzZSBkb3QuZGVsZXRlKCkgdG8gYXV0b21hdGljYWxseSAgcmUtaW5kZXggYXJyYXlzLlxuICpcbiAqIEBwYXJhbSB7U3RyaW5nfEFycmF5PFN0cmluZz59IHBhdGhcbiAqIEBwYXJhbSB7T2JqZWN0fSBvYmpcbiAqIEBwYXJhbSB7Qm9vbGVhbn0gcmVpbmRleEFycmF5XG4gKiBAcmV0dXJuIHthbnl9IFRoZSByZW1vdmVkIHZhbHVlXG4gKi9cbkRvdE9iamVjdC5wcm90b3R5cGUucmVtb3ZlID0gZnVuY3Rpb24gKHBhdGgsIG9iaiwgcmVpbmRleEFycmF5KSB7XG4gIHZhciBpXG5cbiAgdGhpcy5jbGVhbnVwID0gW11cbiAgaWYgKEFycmF5LmlzQXJyYXkocGF0aCkpIHtcbiAgICBmb3IgKGkgPSAwOyBpIDwgcGF0aC5sZW5ndGg7IGkrKykge1xuICAgICAgdGhpcy5waWNrKHBhdGhbaV0sIG9iaiwgdHJ1ZSwgcmVpbmRleEFycmF5KVxuICAgIH1cbiAgICBpZiAoIXJlaW5kZXhBcnJheSkge1xuICAgICAgdGhpcy5fY2xlYW51cChvYmopXG4gICAgfVxuICAgIHJldHVybiBvYmpcbiAgfSBlbHNlIHtcbiAgICByZXR1cm4gdGhpcy5waWNrKHBhdGgsIG9iaiwgdHJ1ZSwgcmVpbmRleEFycmF5KVxuICB9XG59XG5cbkRvdE9iamVjdC5wcm90b3R5cGUuX2NsZWFudXAgPSBmdW5jdGlvbiAob2JqKSB7XG4gIHZhciByZXRcbiAgdmFyIGlcbiAgdmFyIGtleXNcbiAgdmFyIHJvb3RcbiAgaWYgKHRoaXMuY2xlYW51cC5sZW5ndGgpIHtcbiAgICBmb3IgKGkgPSAwOyBpIDwgdGhpcy5jbGVhbnVwLmxlbmd0aDsgaSsrKSB7XG4gICAgICBrZXlzID0gdGhpcy5jbGVhbnVwW2ldLnNwbGl0KCcuJylcbiAgICAgIHJvb3QgPSBrZXlzLnNwbGljZSgwLCAtMSkuam9pbignLicpXG4gICAgICByZXQgPSByb290ID8gdGhpcy5waWNrKHJvb3QsIG9iaikgOiBvYmpcbiAgICAgIHJldCA9IHJldFtrZXlzWzBdXS5maWx0ZXIoZnVuY3Rpb24gKHYpIHtcbiAgICAgICAgcmV0dXJuIHYgIT09IHVuZGVmaW5lZFxuICAgICAgfSlcbiAgICAgIHRoaXMuc2V0KHRoaXMuY2xlYW51cFtpXSwgcmV0LCBvYmopXG4gICAgfVxuICAgIHRoaXMuY2xlYW51cCA9IFtdXG4gIH1cbn1cblxuLyoqXG4gKiBBbGlhcyBtZXRob2QgIGZvciBgZG90LnJlbW92ZWBcbiAqXG4gKiBOb3RlOiB0aGlzIGlzIG5vdCBhbiBhbGlhcyBmb3IgZG90LmRlbGV0ZSgpXG4gKlxuICogQHBhcmFtIHtTdHJpbmd8QXJyYXk8U3RyaW5nPn0gcGF0aFxuICogQHBhcmFtIHtPYmplY3R9IG9ialxuICogQHBhcmFtIHtCb29sZWFufSByZWluZGV4QXJyYXlcbiAqIEByZXR1cm4ge2FueX0gVGhlIHJlbW92ZWQgdmFsdWVcbiAqL1xuRG90T2JqZWN0LnByb3RvdHlwZS5kZWwgPSBEb3RPYmplY3QucHJvdG90eXBlLnJlbW92ZVxuXG4vKipcbiAqXG4gKiBNb3ZlIGEgcHJvcGVydHkgZnJvbSBvbmUgcGxhY2UgdG8gdGhlIG90aGVyLlxuICpcbiAqIElmIHRoZSBzb3VyY2UgcGF0aCBkb2VzIG5vdCBleGlzdCAodW5kZWZpbmVkKVxuICogdGhlIHRhcmdldCBwcm9wZXJ0eSB3aWxsIG5vdCBiZSBzZXQuXG4gKlxuICogQHBhcmFtIHtTdHJpbmd9IHNvdXJjZVxuICogQHBhcmFtIHtTdHJpbmd9IHRhcmdldFxuICogQHBhcmFtIHtPYmplY3R9IG9ialxuICogQHBhcmFtIHtGdW5jdGlvbnxBcnJheX0gbW9kc1xuICogQHBhcmFtIHtCb29sZWFufSBtZXJnZVxuICovXG5Eb3RPYmplY3QucHJvdG90eXBlLm1vdmUgPSBmdW5jdGlvbiAoc291cmNlLCB0YXJnZXQsIG9iaiwgbW9kcywgbWVyZ2UpIHtcbiAgaWYgKHR5cGVvZiBtb2RzID09PSAnZnVuY3Rpb24nIHx8IEFycmF5LmlzQXJyYXkobW9kcykpIHtcbiAgICB0aGlzLnNldCh0YXJnZXQsIF9wcm9jZXNzKHRoaXMucGljayhzb3VyY2UsIG9iaiwgdHJ1ZSksIG1vZHMpLCBvYmosIG1lcmdlKVxuICB9IGVsc2Uge1xuICAgIG1lcmdlID0gbW9kc1xuICAgIHRoaXMuc2V0KHRhcmdldCwgdGhpcy5waWNrKHNvdXJjZSwgb2JqLCB0cnVlKSwgb2JqLCBtZXJnZSlcbiAgfVxuXG4gIHJldHVybiBvYmpcbn1cblxuLyoqXG4gKlxuICogVHJhbnNmZXIgYSBwcm9wZXJ0eSBmcm9tIG9uZSBvYmplY3QgdG8gYW5vdGhlciBvYmplY3QuXG4gKlxuICogSWYgdGhlIHNvdXJjZSBwYXRoIGRvZXMgbm90IGV4aXN0ICh1bmRlZmluZWQpXG4gKiB0aGUgcHJvcGVydHkgb24gdGhlIG90aGVyIG9iamVjdCB3aWxsIG5vdCBiZSBzZXQuXG4gKlxuICogQHBhcmFtIHtTdHJpbmd9IHNvdXJjZVxuICogQHBhcmFtIHtTdHJpbmd9IHRhcmdldFxuICogQHBhcmFtIHtPYmplY3R9IG9iajFcbiAqIEBwYXJhbSB7T2JqZWN0fSBvYmoyXG4gKiBAcGFyYW0ge0Z1bmN0aW9ufEFycmF5fSBtb2RzXG4gKiBAcGFyYW0ge0Jvb2xlYW59IG1lcmdlXG4gKi9cbkRvdE9iamVjdC5wcm90b3R5cGUudHJhbnNmZXIgPSBmdW5jdGlvbiAoXG4gIHNvdXJjZSxcbiAgdGFyZ2V0LFxuICBvYmoxLFxuICBvYmoyLFxuICBtb2RzLFxuICBtZXJnZVxuKSB7XG4gIGlmICh0eXBlb2YgbW9kcyA9PT0gJ2Z1bmN0aW9uJyB8fCBBcnJheS5pc0FycmF5KG1vZHMpKSB7XG4gICAgdGhpcy5zZXQoXG4gICAgICB0YXJnZXQsXG4gICAgICBfcHJvY2Vzcyh0aGlzLnBpY2soc291cmNlLCBvYmoxLCB0cnVlKSwgbW9kcyksXG4gICAgICBvYmoyLFxuICAgICAgbWVyZ2VcbiAgICApXG4gIH0gZWxzZSB7XG4gICAgbWVyZ2UgPSBtb2RzXG4gICAgdGhpcy5zZXQodGFyZ2V0LCB0aGlzLnBpY2soc291cmNlLCBvYmoxLCB0cnVlKSwgb2JqMiwgbWVyZ2UpXG4gIH1cblxuICByZXR1cm4gb2JqMlxufVxuXG4vKipcbiAqXG4gKiBDb3B5IGEgcHJvcGVydHkgZnJvbSBvbmUgb2JqZWN0IHRvIGFub3RoZXIgb2JqZWN0LlxuICpcbiAqIElmIHRoZSBzb3VyY2UgcGF0aCBkb2VzIG5vdCBleGlzdCAodW5kZWZpbmVkKVxuICogdGhlIHByb3BlcnR5IG9uIHRoZSBvdGhlciBvYmplY3Qgd2lsbCBub3QgYmUgc2V0LlxuICpcbiAqIEBwYXJhbSB7U3RyaW5nfSBzb3VyY2VcbiAqIEBwYXJhbSB7U3RyaW5nfSB0YXJnZXRcbiAqIEBwYXJhbSB7T2JqZWN0fSBvYmoxXG4gKiBAcGFyYW0ge09iamVjdH0gb2JqMlxuICogQHBhcmFtIHtGdW5jdGlvbnxBcnJheX0gbW9kc1xuICogQHBhcmFtIHtCb29sZWFufSBtZXJnZVxuICovXG5Eb3RPYmplY3QucHJvdG90eXBlLmNvcHkgPSBmdW5jdGlvbiAoc291cmNlLCB0YXJnZXQsIG9iajEsIG9iajIsIG1vZHMsIG1lcmdlKSB7XG4gIGlmICh0eXBlb2YgbW9kcyA9PT0gJ2Z1bmN0aW9uJyB8fCBBcnJheS5pc0FycmF5KG1vZHMpKSB7XG4gICAgdGhpcy5zZXQoXG4gICAgICB0YXJnZXQsXG4gICAgICBfcHJvY2VzcyhcbiAgICAgICAgLy8gY2xvbmUgd2hhdCBpcyBwaWNrZWRcbiAgICAgICAgSlNPTi5wYXJzZShKU09OLnN0cmluZ2lmeSh0aGlzLnBpY2soc291cmNlLCBvYmoxLCBmYWxzZSkpKSxcbiAgICAgICAgbW9kc1xuICAgICAgKSxcbiAgICAgIG9iajIsXG4gICAgICBtZXJnZVxuICAgIClcbiAgfSBlbHNlIHtcbiAgICBtZXJnZSA9IG1vZHNcbiAgICB0aGlzLnNldCh0YXJnZXQsIHRoaXMucGljayhzb3VyY2UsIG9iajEsIGZhbHNlKSwgb2JqMiwgbWVyZ2UpXG4gIH1cblxuICByZXR1cm4gb2JqMlxufVxuXG4vKipcbiAqXG4gKiBTZXQgYSBwcm9wZXJ0eSBvbiBhbiBvYmplY3QgdXNpbmcgZG90IG5vdGF0aW9uLlxuICpcbiAqIEBwYXJhbSB7U3RyaW5nfSBwYXRoXG4gKiBAcGFyYW0ge2FueX0gdmFsXG4gKiBAcGFyYW0ge09iamVjdH0gb2JqXG4gKiBAcGFyYW0ge0Jvb2xlYW59IG1lcmdlXG4gKi9cbkRvdE9iamVjdC5wcm90b3R5cGUuc2V0ID0gZnVuY3Rpb24gKHBhdGgsIHZhbCwgb2JqLCBtZXJnZSkge1xuICB2YXIgaVxuICB2YXIga1xuICB2YXIga2V5c1xuICB2YXIga2V5XG5cbiAgLy8gRG8gbm90IG9wZXJhdGUgaWYgdGhlIHZhbHVlIGlzIHVuZGVmaW5lZC5cbiAgaWYgKHR5cGVvZiB2YWwgPT09ICd1bmRlZmluZWQnKSB7XG4gICAgcmV0dXJuIG9ialxuICB9XG4gIGtleXMgPSBwYXJzZVBhdGgocGF0aCwgdGhpcy5zZXBhcmF0b3IpXG5cbiAgZm9yIChpID0gMDsgaSA8IGtleXMubGVuZ3RoOyBpKyspIHtcbiAgICBrZXkgPSBrZXlzW2ldXG4gICAgaWYgKGkgPT09IGtleXMubGVuZ3RoIC0gMSkge1xuICAgICAgaWYgKG1lcmdlICYmIGlzT2JqZWN0KHZhbCkgJiYgaXNPYmplY3Qob2JqW2tleV0pKSB7XG4gICAgICAgIGZvciAoayBpbiB2YWwpIHtcbiAgICAgICAgICBpZiAoaGFzT3duUHJvcGVydHkuY2FsbCh2YWwsIGspKSB7XG4gICAgICAgICAgICBvYmpba2V5XVtrXSA9IHZhbFtrXVxuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfSBlbHNlIGlmIChtZXJnZSAmJiBBcnJheS5pc0FycmF5KG9ialtrZXldKSAmJiBBcnJheS5pc0FycmF5KHZhbCkpIHtcbiAgICAgICAgZm9yICh2YXIgaiA9IDA7IGogPCB2YWwubGVuZ3RoOyBqKyspIHtcbiAgICAgICAgICBvYmpba2V5c1tpXV0ucHVzaCh2YWxbal0pXG4gICAgICAgIH1cbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIG9ialtrZXldID0gdmFsXG4gICAgICB9XG4gICAgfSBlbHNlIGlmIChcbiAgICAgIC8vIGZvcmNlIHRoZSB2YWx1ZSB0byBiZSBhbiBvYmplY3RcbiAgICAgICFoYXNPd25Qcm9wZXJ0eS5jYWxsKG9iaiwga2V5KSB8fFxuICAgICAgKCFpc09iamVjdChvYmpba2V5XSkgJiYgIUFycmF5LmlzQXJyYXkob2JqW2tleV0pKVxuICAgICkge1xuICAgICAgLy8gaW5pdGlhbGl6ZSBhcyBhcnJheSBpZiBuZXh0IGtleSBpcyBudW1lcmljXG4gICAgICBpZiAoL15cXGQrJC8udGVzdChrZXlzW2kgKyAxXSkpIHtcbiAgICAgICAgb2JqW2tleV0gPSBbXVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgb2JqW2tleV0gPSB7fVxuICAgICAgfVxuICAgIH1cbiAgICBvYmogPSBvYmpba2V5XVxuICB9XG4gIHJldHVybiBvYmpcbn1cblxuLyoqXG4gKlxuICogVHJhbnNmb3JtIGFuIG9iamVjdFxuICpcbiAqIFVzYWdlOlxuICpcbiAqICAgdmFyIG9iaiA9IHtcbiAqICAgICBcImlkXCI6IDEsXG4gKiAgICBcInNvbWVcIjoge1xuICogICAgICBcInRoaW5nXCI6IFwiZWxzZVwiXG4gKiAgICB9XG4gKiAgIH1cbiAqXG4gKiAgIHZhciB0cmFuc2Zvcm0gPSB7XG4gKiAgICAgXCJpZFwiOiBcIm5yXCIsXG4gKiAgICBcInNvbWUudGhpbmdcIjogXCJuYW1lXCJcbiAqICAgfVxuICpcbiAqICAgdmFyIHRndCA9IGRvdC50cmFuc2Zvcm0odHJhbnNmb3JtLCBvYmopXG4gKlxuICogQHBhcmFtIHtPYmplY3R9IHJlY2lwZSBUcmFuc2Zvcm0gcmVjaXBlXG4gKiBAcGFyYW0ge09iamVjdH0gb2JqIE9iamVjdCB0byBiZSB0cmFuc2Zvcm1lZFxuICogQHBhcmFtIHtBcnJheX0gbW9kcyBtb2RpZmllcnMgZm9yIHRoZSB0YXJnZXRcbiAqL1xuRG90T2JqZWN0LnByb3RvdHlwZS50cmFuc2Zvcm0gPSBmdW5jdGlvbiAocmVjaXBlLCBvYmosIHRndCkge1xuICBvYmogPSBvYmogfHwge31cbiAgdGd0ID0gdGd0IHx8IHt9XG4gIE9iamVjdC5rZXlzKHJlY2lwZSkuZm9yRWFjaChcbiAgICBmdW5jdGlvbiAoa2V5KSB7XG4gICAgICB0aGlzLnNldChyZWNpcGVba2V5XSwgdGhpcy5waWNrKGtleSwgb2JqKSwgdGd0KVxuICAgIH0uYmluZCh0aGlzKVxuICApXG4gIHJldHVybiB0Z3Rcbn1cblxuLyoqXG4gKlxuICogQ29udmVydCBvYmplY3QgdG8gZG90dGVkLWtleS92YWx1ZSBwYWlyXG4gKlxuICogVXNhZ2U6XG4gKlxuICogICB2YXIgdGd0ID0gZG90LmRvdChvYmopXG4gKlxuICogICBvclxuICpcbiAqICAgdmFyIHRndCA9IHt9XG4gKiAgIGRvdC5kb3Qob2JqLCB0Z3QpXG4gKlxuICogQHBhcmFtIHtPYmplY3R9IG9iaiBzb3VyY2Ugb2JqZWN0XG4gKiBAcGFyYW0ge09iamVjdH0gdGd0IHRhcmdldCBvYmplY3RcbiAqIEBwYXJhbSB7QXJyYXl9IHBhdGggcGF0aCBhcnJheSAoaW50ZXJuYWwpXG4gKi9cbkRvdE9iamVjdC5wcm90b3R5cGUuZG90ID0gZnVuY3Rpb24gKG9iaiwgdGd0LCBwYXRoKSB7XG4gIHRndCA9IHRndCB8fCB7fVxuICBwYXRoID0gcGF0aCB8fCBbXVxuICB2YXIgaXNBcnJheSA9IEFycmF5LmlzQXJyYXkob2JqKVxuXG4gIE9iamVjdC5rZXlzKG9iaikuZm9yRWFjaChcbiAgICBmdW5jdGlvbiAoa2V5KSB7XG4gICAgICB2YXIgaW5kZXggPSBpc0FycmF5ICYmIHRoaXMudXNlQnJhY2tldHMgPyAnWycgKyBrZXkgKyAnXScgOiBrZXlcbiAgICAgIGlmIChcbiAgICAgICAgaXNBcnJheU9yT2JqZWN0KG9ialtrZXldKSAmJlxuICAgICAgICAoKGlzT2JqZWN0KG9ialtrZXldKSAmJiAhaXNFbXB0eU9iamVjdChvYmpba2V5XSkpIHx8XG4gICAgICAgICAgKEFycmF5LmlzQXJyYXkob2JqW2tleV0pICYmICF0aGlzLmtlZXBBcnJheSAmJiBvYmpba2V5XS5sZW5ndGggIT09IDApKVxuICAgICAgKSB7XG4gICAgICAgIGlmIChpc0FycmF5ICYmIHRoaXMudXNlQnJhY2tldHMpIHtcbiAgICAgICAgICB2YXIgcHJldmlvdXNLZXkgPSBwYXRoW3BhdGgubGVuZ3RoIC0gMV0gfHwgJydcbiAgICAgICAgICByZXR1cm4gdGhpcy5kb3QoXG4gICAgICAgICAgICBvYmpba2V5XSxcbiAgICAgICAgICAgIHRndCxcbiAgICAgICAgICAgIHBhdGguc2xpY2UoMCwgLTEpLmNvbmNhdChwcmV2aW91c0tleSArIGluZGV4KVxuICAgICAgICAgIClcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICByZXR1cm4gdGhpcy5kb3Qob2JqW2tleV0sIHRndCwgcGF0aC5jb25jYXQoaW5kZXgpKVxuICAgICAgICB9XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBpZiAoaXNBcnJheSAmJiB0aGlzLnVzZUJyYWNrZXRzKSB7XG4gICAgICAgICAgdGd0W3BhdGguam9pbih0aGlzLnNlcGFyYXRvcikuY29uY2F0KCdbJyArIGtleSArICddJyldID0gb2JqW2tleV1cbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICB0Z3RbcGF0aC5jb25jYXQoaW5kZXgpLmpvaW4odGhpcy5zZXBhcmF0b3IpXSA9IG9ialtrZXldXG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9LmJpbmQodGhpcylcbiAgKVxuICByZXR1cm4gdGd0XG59XG5cbkRvdE9iamVjdC5waWNrID0gd3JhcCgncGljaycpXG5Eb3RPYmplY3QubW92ZSA9IHdyYXAoJ21vdmUnKVxuRG90T2JqZWN0LnRyYW5zZmVyID0gd3JhcCgndHJhbnNmZXInKVxuRG90T2JqZWN0LnRyYW5zZm9ybSA9IHdyYXAoJ3RyYW5zZm9ybScpXG5Eb3RPYmplY3QuY29weSA9IHdyYXAoJ2NvcHknKVxuRG90T2JqZWN0Lm9iamVjdCA9IHdyYXAoJ29iamVjdCcpXG5Eb3RPYmplY3Quc3RyID0gd3JhcCgnc3RyJylcbkRvdE9iamVjdC5zZXQgPSB3cmFwKCdzZXQnKVxuRG90T2JqZWN0LmRlbGV0ZSA9IHdyYXAoJ2RlbGV0ZScpXG5Eb3RPYmplY3QuZGVsID0gRG90T2JqZWN0LnJlbW92ZSA9IHdyYXAoJ3JlbW92ZScpXG5Eb3RPYmplY3QuZG90ID0gd3JhcCgnZG90Jyk7XG5bJ292ZXJyaWRlJywgJ292ZXJ3cml0ZSddLmZvckVhY2goZnVuY3Rpb24gKHByb3ApIHtcbiAgT2JqZWN0LmRlZmluZVByb3BlcnR5KERvdE9iamVjdCwgcHJvcCwge1xuICAgIGdldDogZnVuY3Rpb24gKCkge1xuICAgICAgcmV0dXJuIGRvdERlZmF1bHQub3ZlcnJpZGVcbiAgICB9LFxuICAgIHNldDogZnVuY3Rpb24gKHZhbCkge1xuICAgICAgZG90RGVmYXVsdC5vdmVycmlkZSA9ICEhdmFsXG4gICAgfVxuICB9KVxufSk7XG5bJ3VzZUFycmF5JywgJ2tlZXBBcnJheScsICd1c2VCcmFja2V0cyddLmZvckVhY2goZnVuY3Rpb24gKHByb3ApIHtcbiAgT2JqZWN0LmRlZmluZVByb3BlcnR5KERvdE9iamVjdCwgcHJvcCwge1xuICAgIGdldDogZnVuY3Rpb24gKCkge1xuICAgICAgcmV0dXJuIGRvdERlZmF1bHRbcHJvcF1cbiAgICB9LFxuICAgIHNldDogZnVuY3Rpb24gKHZhbCkge1xuICAgICAgZG90RGVmYXVsdFtwcm9wXSA9IHZhbFxuICAgIH1cbiAgfSlcbn0pXG5cbkRvdE9iamVjdC5fcHJvY2VzcyA9IF9wcm9jZXNzXG5cbm1vZHVsZS5leHBvcnRzID0gRG90T2JqZWN0XG4iLAogICAgIlwidXNlIHN0cmljdFwiO1xudmFyIF9fY3JlYXRlQmluZGluZyA9ICh0aGlzICYmIHRoaXMuX19jcmVhdGVCaW5kaW5nKSB8fCAoT2JqZWN0LmNyZWF0ZSA/IChmdW5jdGlvbihvLCBtLCBrLCBrMikge1xuICAgIGlmIChrMiA9PT0gdW5kZWZpbmVkKSBrMiA9IGs7XG4gICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KG8sIGsyLCB7IGVudW1lcmFibGU6IHRydWUsIGdldDogZnVuY3Rpb24oKSB7IHJldHVybiBtW2tdOyB9IH0pO1xufSkgOiAoZnVuY3Rpb24obywgbSwgaywgazIpIHtcbiAgICBpZiAoazIgPT09IHVuZGVmaW5lZCkgazIgPSBrO1xuICAgIG9bazJdID0gbVtrXTtcbn0pKTtcbnZhciBfX3NldE1vZHVsZURlZmF1bHQgPSAodGhpcyAmJiB0aGlzLl9fc2V0TW9kdWxlRGVmYXVsdCkgfHwgKE9iamVjdC5jcmVhdGUgPyAoZnVuY3Rpb24obywgdikge1xuICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShvLCBcImRlZmF1bHRcIiwgeyBlbnVtZXJhYmxlOiB0cnVlLCB2YWx1ZTogdiB9KTtcbn0pIDogZnVuY3Rpb24obywgdikge1xuICAgIG9bXCJkZWZhdWx0XCJdID0gdjtcbn0pO1xudmFyIF9faW1wb3J0U3RhciA9ICh0aGlzICYmIHRoaXMuX19pbXBvcnRTdGFyKSB8fCBmdW5jdGlvbiAobW9kKSB7XG4gICAgaWYgKG1vZCAmJiBtb2QuX19lc01vZHVsZSkgcmV0dXJuIG1vZDtcbiAgICB2YXIgcmVzdWx0ID0ge307XG4gICAgaWYgKG1vZCAhPSBudWxsKSBmb3IgKHZhciBrIGluIG1vZCkgaWYgKGsgIT09IFwiZGVmYXVsdFwiICYmIE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChtb2QsIGspKSBfX2NyZWF0ZUJpbmRpbmcocmVzdWx0LCBtb2QsIGspO1xuICAgIF9fc2V0TW9kdWxlRGVmYXVsdChyZXN1bHQsIG1vZCk7XG4gICAgcmV0dXJuIHJlc3VsdDtcbn07XG52YXIgX19hd2FpdGVyID0gKHRoaXMgJiYgdGhpcy5fX2F3YWl0ZXIpIHx8IGZ1bmN0aW9uICh0aGlzQXJnLCBfYXJndW1lbnRzLCBQLCBnZW5lcmF0b3IpIHtcbiAgICBmdW5jdGlvbiBhZG9wdCh2YWx1ZSkgeyByZXR1cm4gdmFsdWUgaW5zdGFuY2VvZiBQID8gdmFsdWUgOiBuZXcgUChmdW5jdGlvbiAocmVzb2x2ZSkgeyByZXNvbHZlKHZhbHVlKTsgfSk7IH1cbiAgICByZXR1cm4gbmV3IChQIHx8IChQID0gUHJvbWlzZSkpKGZ1bmN0aW9uIChyZXNvbHZlLCByZWplY3QpIHtcbiAgICAgICAgZnVuY3Rpb24gZnVsZmlsbGVkKHZhbHVlKSB7IHRyeSB7IHN0ZXAoZ2VuZXJhdG9yLm5leHQodmFsdWUpKTsgfSBjYXRjaCAoZSkgeyByZWplY3QoZSk7IH0gfVxuICAgICAgICBmdW5jdGlvbiByZWplY3RlZCh2YWx1ZSkgeyB0cnkgeyBzdGVwKGdlbmVyYXRvcltcInRocm93XCJdKHZhbHVlKSk7IH0gY2F0Y2ggKGUpIHsgcmVqZWN0KGUpOyB9IH1cbiAgICAgICAgZnVuY3Rpb24gc3RlcChyZXN1bHQpIHsgcmVzdWx0LmRvbmUgPyByZXNvbHZlKHJlc3VsdC52YWx1ZSkgOiBhZG9wdChyZXN1bHQudmFsdWUpLnRoZW4oZnVsZmlsbGVkLCByZWplY3RlZCk7IH1cbiAgICAgICAgc3RlcCgoZ2VuZXJhdG9yID0gZ2VuZXJhdG9yLmFwcGx5KHRoaXNBcmcsIF9hcmd1bWVudHMgfHwgW10pKS5uZXh0KCkpO1xuICAgIH0pO1xufTtcbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIl9fZXNNb2R1bGVcIiwgeyB2YWx1ZTogdHJ1ZSB9KTtcbmV4cG9ydHMuRmV0Y2hSUEMgPSBleHBvcnRzLndyYXBFcnJvclJlc3BvbnNlVG9Ud2lycEVycm9yID0gZXhwb3J0cy5Ob2RlSHR0cFJQQyA9IHZvaWQgMDtcbmNvbnN0IGh0dHAgPSBfX2ltcG9ydFN0YXIocmVxdWlyZShcImh0dHBcIikpO1xuY29uc3QgaHR0cHMgPSBfX2ltcG9ydFN0YXIocmVxdWlyZShcImh0dHBzXCIpKTtcbmNvbnN0IHVybF8xID0gcmVxdWlyZShcInVybFwiKTtcbmNvbnN0IGVycm9yc18xID0gcmVxdWlyZShcIi4vZXJyb3JzXCIpO1xuLyoqXG4gKiBhIG5vZGUgSFRUUCBSUEMgaW1wbGVtZW50YXRpb25cbiAqIEBwYXJhbSBvcHRpb25zXG4gKiBAY29uc3RydWN0b3JcbiAqL1xuY29uc3QgTm9kZUh0dHBSUEMgPSAob3B0aW9ucykgPT4gKHtcbiAgICByZXF1ZXN0KHNlcnZpY2UsIG1ldGhvZCwgY29udGVudFR5cGUsIGRhdGEpIHtcbiAgICAgICAgbGV0IGNsaWVudDtcbiAgICAgICAgcmV0dXJuIG5ldyBQcm9taXNlKChyZXNvbHZlLCByZWplY3RlZCkgPT4ge1xuICAgICAgICAgICAgY29uc3QgcmVzcG9uc2VDaHVua3MgPSBbXTtcbiAgICAgICAgICAgIGNvbnN0IHJlcXVlc3REYXRhID0gY29udGVudFR5cGUgPT09IFwiYXBwbGljYXRpb24vcHJvdG9idWZcIlxuICAgICAgICAgICAgICAgID8gQnVmZmVyLmZyb20oZGF0YSlcbiAgICAgICAgICAgICAgICA6IEpTT04uc3RyaW5naWZ5KGRhdGEpO1xuICAgICAgICAgICAgY29uc3QgdXJsID0gbmV3IHVybF8xLlVSTChvcHRpb25zLmJhc2VVcmwpO1xuICAgICAgICAgICAgY29uc3QgaXNIdHRwcyA9IHVybC5wcm90b2NvbCA9PT0gXCJodHRwczpcIjtcbiAgICAgICAgICAgIGlmIChpc0h0dHBzKSB7XG4gICAgICAgICAgICAgICAgY2xpZW50ID0gaHR0cHM7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICBjbGllbnQgPSBodHRwO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgY29uc3QgcHJlZml4ID0gdXJsLnBhdGhuYW1lICE9PSBcIi9cIiA/IHVybC5wYXRobmFtZSA6IFwiXCI7XG4gICAgICAgICAgICBjb25zdCByZXEgPSBjbGllbnRcbiAgICAgICAgICAgICAgICAucmVxdWVzdChPYmplY3QuYXNzaWduKE9iamVjdC5hc3NpZ24oe30sIChvcHRpb25zID8gb3B0aW9ucyA6IHt9KSksIHsgbWV0aG9kOiBcIlBPU1RcIiwgcHJvdG9jb2w6IHVybC5wcm90b2NvbCwgaG9zdDogdXJsLmhvc3RuYW1lLCBwb3J0OiB1cmwucG9ydCA/IHVybC5wb3J0IDogaXNIdHRwcyA/IDQ0MyA6IDgwLCBwYXRoOiBgJHtwcmVmaXh9LyR7c2VydmljZX0vJHttZXRob2R9YCwgaGVhZGVyczogT2JqZWN0LmFzc2lnbihPYmplY3QuYXNzaWduKHt9LCAob3B0aW9ucy5oZWFkZXJzID8gb3B0aW9ucy5oZWFkZXJzIDoge30pKSwgeyBcIkNvbnRlbnQtVHlwZVwiOiBjb250ZW50VHlwZSwgXCJDb250ZW50LUxlbmd0aFwiOiBjb250ZW50VHlwZSA9PT0gXCJhcHBsaWNhdGlvbi9wcm90b2J1ZlwiXG4gICAgICAgICAgICAgICAgICAgICAgICA/IEJ1ZmZlci5ieXRlTGVuZ3RoKHJlcXVlc3REYXRhKVxuICAgICAgICAgICAgICAgICAgICAgICAgOiBCdWZmZXIuZnJvbShyZXF1ZXN0RGF0YSkuYnl0ZUxlbmd0aCB9KSB9KSwgKHJlcykgPT4ge1xuICAgICAgICAgICAgICAgIHJlcy5vbihcImRhdGFcIiwgKGNodW5rKSA9PiByZXNwb25zZUNodW5rcy5wdXNoKGNodW5rKSk7XG4gICAgICAgICAgICAgICAgcmVzLm9uKFwiZW5kXCIsICgpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgZGF0YSA9IEJ1ZmZlci5jb25jYXQocmVzcG9uc2VDaHVua3MpO1xuICAgICAgICAgICAgICAgICAgICBpZiAocmVzLnN0YXR1c0NvZGUgIT0gMjAwKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICByZWplY3RlZCh3cmFwRXJyb3JSZXNwb25zZVRvVHdpcnBFcnJvcihkYXRhLnRvU3RyaW5nKCkpKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChjb250ZW50VHlwZSA9PT0gXCJhcHBsaWNhdGlvbi9qc29uXCIpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXNvbHZlKEpTT04ucGFyc2UoZGF0YS50b1N0cmluZygpKSk7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXNvbHZlKGRhdGEpO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgcmVzLm9uKFwiZXJyb3JcIiwgKGVycikgPT4ge1xuICAgICAgICAgICAgICAgICAgICByZWplY3RlZChlcnIpO1xuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgfSlcbiAgICAgICAgICAgICAgICAub24oXCJlcnJvclwiLCAoZXJyKSA9PiB7XG4gICAgICAgICAgICAgICAgcmVqZWN0ZWQoZXJyKTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgcmVxLmVuZChyZXF1ZXN0RGF0YSk7XG4gICAgICAgIH0pO1xuICAgIH0sXG59KTtcbmV4cG9ydHMuTm9kZUh0dHBSUEMgPSBOb2RlSHR0cFJQQztcbmZ1bmN0aW9uIHdyYXBFcnJvclJlc3BvbnNlVG9Ud2lycEVycm9yKGVycm9yUmVzcG9uc2UpIHtcbiAgICByZXR1cm4gZXJyb3JzXzEuVHdpcnBFcnJvci5mcm9tT2JqZWN0KEpTT04ucGFyc2UoZXJyb3JSZXNwb25zZSkpO1xufVxuZXhwb3J0cy53cmFwRXJyb3JSZXNwb25zZVRvVHdpcnBFcnJvciA9IHdyYXBFcnJvclJlc3BvbnNlVG9Ud2lycEVycm9yO1xuLyoqXG4gKiBhIGJyb3dzZXIgZmV0Y2ggUlBDIGltcGxlbWVudGF0aW9uXG4gKi9cbmNvbnN0IEZldGNoUlBDID0gKG9wdGlvbnMpID0+ICh7XG4gICAgcmVxdWVzdChzZXJ2aWNlLCBtZXRob2QsIGNvbnRlbnRUeXBlLCBkYXRhKSB7XG4gICAgICAgIHJldHVybiBfX2F3YWl0ZXIodGhpcywgdm9pZCAwLCB2b2lkIDAsIGZ1bmN0aW9uKiAoKSB7XG4gICAgICAgICAgICBjb25zdCBoZWFkZXJzID0gbmV3IEhlYWRlcnMob3B0aW9ucy5oZWFkZXJzKTtcbiAgICAgICAgICAgIGhlYWRlcnMuc2V0KFwiY29udGVudC10eXBlXCIsIGNvbnRlbnRUeXBlKTtcbiAgICAgICAgICAgIGNvbnN0IHJlc3BvbnNlID0geWllbGQgZmV0Y2goYCR7b3B0aW9ucy5iYXNlVXJsfS8ke3NlcnZpY2V9LyR7bWV0aG9kfWAsIE9iamVjdC5hc3NpZ24oT2JqZWN0LmFzc2lnbih7fSwgb3B0aW9ucyksIHsgbWV0aG9kOiBcIlBPU1RcIiwgaGVhZGVycywgYm9keTogZGF0YSBpbnN0YW5jZW9mIFVpbnQ4QXJyYXkgPyBkYXRhIDogSlNPTi5zdHJpbmdpZnkoZGF0YSkgfSkpO1xuICAgICAgICAgICAgaWYgKHJlc3BvbnNlLnN0YXR1cyA9PT0gMjAwKSB7XG4gICAgICAgICAgICAgICAgaWYgKGNvbnRlbnRUeXBlID09PSBcImFwcGxpY2F0aW9uL2pzb25cIikge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4geWllbGQgcmVzcG9uc2UuanNvbigpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICByZXR1cm4gbmV3IFVpbnQ4QXJyYXkoeWllbGQgcmVzcG9uc2UuYXJyYXlCdWZmZXIoKSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICB0aHJvdyBlcnJvcnNfMS5Ud2lycEVycm9yLmZyb21PYmplY3QoeWllbGQgcmVzcG9uc2UuanNvbigpKTtcbiAgICAgICAgfSk7XG4gICAgfSxcbn0pO1xuZXhwb3J0cy5GZXRjaFJQQyA9IEZldGNoUlBDO1xuIiwKICAgICJcInVzZSBzdHJpY3RcIjtcbnZhciBfX2NyZWF0ZUJpbmRpbmcgPSAodGhpcyAmJiB0aGlzLl9fY3JlYXRlQmluZGluZykgfHwgKE9iamVjdC5jcmVhdGUgPyAoZnVuY3Rpb24obywgbSwgaywgazIpIHtcbiAgICBpZiAoazIgPT09IHVuZGVmaW5lZCkgazIgPSBrO1xuICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShvLCBrMiwgeyBlbnVtZXJhYmxlOiB0cnVlLCBnZXQ6IGZ1bmN0aW9uKCkgeyByZXR1cm4gbVtrXTsgfSB9KTtcbn0pIDogKGZ1bmN0aW9uKG8sIG0sIGssIGsyKSB7XG4gICAgaWYgKGsyID09PSB1bmRlZmluZWQpIGsyID0gaztcbiAgICBvW2syXSA9IG1ba107XG59KSk7XG52YXIgX19zZXRNb2R1bGVEZWZhdWx0ID0gKHRoaXMgJiYgdGhpcy5fX3NldE1vZHVsZURlZmF1bHQpIHx8IChPYmplY3QuY3JlYXRlID8gKGZ1bmN0aW9uKG8sIHYpIHtcbiAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkobywgXCJkZWZhdWx0XCIsIHsgZW51bWVyYWJsZTogdHJ1ZSwgdmFsdWU6IHYgfSk7XG59KSA6IGZ1bmN0aW9uKG8sIHYpIHtcbiAgICBvW1wiZGVmYXVsdFwiXSA9IHY7XG59KTtcbnZhciBfX2ltcG9ydFN0YXIgPSAodGhpcyAmJiB0aGlzLl9faW1wb3J0U3RhcikgfHwgZnVuY3Rpb24gKG1vZCkge1xuICAgIGlmIChtb2QgJiYgbW9kLl9fZXNNb2R1bGUpIHJldHVybiBtb2Q7XG4gICAgdmFyIHJlc3VsdCA9IHt9O1xuICAgIGlmIChtb2QgIT0gbnVsbCkgZm9yICh2YXIgayBpbiBtb2QpIGlmIChrICE9PSBcImRlZmF1bHRcIiAmJiBPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwobW9kLCBrKSkgX19jcmVhdGVCaW5kaW5nKHJlc3VsdCwgbW9kLCBrKTtcbiAgICBfX3NldE1vZHVsZURlZmF1bHQocmVzdWx0LCBtb2QpO1xuICAgIHJldHVybiByZXN1bHQ7XG59O1xudmFyIF9fYXdhaXRlciA9ICh0aGlzICYmIHRoaXMuX19hd2FpdGVyKSB8fCBmdW5jdGlvbiAodGhpc0FyZywgX2FyZ3VtZW50cywgUCwgZ2VuZXJhdG9yKSB7XG4gICAgZnVuY3Rpb24gYWRvcHQodmFsdWUpIHsgcmV0dXJuIHZhbHVlIGluc3RhbmNlb2YgUCA/IHZhbHVlIDogbmV3IFAoZnVuY3Rpb24gKHJlc29sdmUpIHsgcmVzb2x2ZSh2YWx1ZSk7IH0pOyB9XG4gICAgcmV0dXJuIG5ldyAoUCB8fCAoUCA9IFByb21pc2UpKShmdW5jdGlvbiAocmVzb2x2ZSwgcmVqZWN0KSB7XG4gICAgICAgIGZ1bmN0aW9uIGZ1bGZpbGxlZCh2YWx1ZSkgeyB0cnkgeyBzdGVwKGdlbmVyYXRvci5uZXh0KHZhbHVlKSk7IH0gY2F0Y2ggKGUpIHsgcmVqZWN0KGUpOyB9IH1cbiAgICAgICAgZnVuY3Rpb24gcmVqZWN0ZWQodmFsdWUpIHsgdHJ5IHsgc3RlcChnZW5lcmF0b3JbXCJ0aHJvd1wiXSh2YWx1ZSkpOyB9IGNhdGNoIChlKSB7IHJlamVjdChlKTsgfSB9XG4gICAgICAgIGZ1bmN0aW9uIHN0ZXAocmVzdWx0KSB7IHJlc3VsdC5kb25lID8gcmVzb2x2ZShyZXN1bHQudmFsdWUpIDogYWRvcHQocmVzdWx0LnZhbHVlKS50aGVuKGZ1bGZpbGxlZCwgcmVqZWN0ZWQpOyB9XG4gICAgICAgIHN0ZXAoKGdlbmVyYXRvciA9IGdlbmVyYXRvci5hcHBseSh0aGlzQXJnLCBfYXJndW1lbnRzIHx8IFtdKSkubmV4dCgpKTtcbiAgICB9KTtcbn07XG52YXIgX19yZXN0ID0gKHRoaXMgJiYgdGhpcy5fX3Jlc3QpIHx8IGZ1bmN0aW9uIChzLCBlKSB7XG4gICAgdmFyIHQgPSB7fTtcbiAgICBmb3IgKHZhciBwIGluIHMpIGlmIChPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwocywgcCkgJiYgZS5pbmRleE9mKHApIDwgMClcbiAgICAgICAgdFtwXSA9IHNbcF07XG4gICAgaWYgKHMgIT0gbnVsbCAmJiB0eXBlb2YgT2JqZWN0LmdldE93blByb3BlcnR5U3ltYm9scyA9PT0gXCJmdW5jdGlvblwiKVxuICAgICAgICBmb3IgKHZhciBpID0gMCwgcCA9IE9iamVjdC5nZXRPd25Qcm9wZXJ0eVN5bWJvbHMocyk7IGkgPCBwLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICBpZiAoZS5pbmRleE9mKHBbaV0pIDwgMCAmJiBPYmplY3QucHJvdG90eXBlLnByb3BlcnR5SXNFbnVtZXJhYmxlLmNhbGwocywgcFtpXSkpXG4gICAgICAgICAgICAgICAgdFtwW2ldXSA9IHNbcFtpXV07XG4gICAgICAgIH1cbiAgICByZXR1cm4gdDtcbn07XG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJfX2VzTW9kdWxlXCIsIHsgdmFsdWU6IHRydWUgfSk7XG5leHBvcnRzLkdhdGV3YXkgPSBleHBvcnRzLlBhdHRlcm4gPSB2b2lkIDA7XG5jb25zdCBxdWVyeXN0cmluZ18xID0gcmVxdWlyZShcInF1ZXJ5c3RyaW5nXCIpO1xuY29uc3QgZG90T2JqZWN0ID0gX19pbXBvcnRTdGFyKHJlcXVpcmUoXCJkb3Qtb2JqZWN0XCIpKTtcbmNvbnN0IHJlcXVlc3RfMSA9IHJlcXVpcmUoXCIuL3JlcXVlc3RcIik7XG5jb25zdCBlcnJvcnNfMSA9IHJlcXVpcmUoXCIuL2Vycm9yc1wiKTtcbmNvbnN0IGh0dHBfY2xpZW50XzEgPSByZXF1aXJlKFwiLi9odHRwLmNsaWVudFwiKTtcbmNvbnN0IHNlcnZlcl8xID0gcmVxdWlyZShcIi4vc2VydmVyXCIpO1xudmFyIFBhdHRlcm47XG4oZnVuY3Rpb24gKFBhdHRlcm4pIHtcbiAgICBQYXR0ZXJuW1wiUE9TVFwiXSA9IFwicG9zdFwiO1xuICAgIFBhdHRlcm5bXCJHRVRcIl0gPSBcImdldFwiO1xuICAgIFBhdHRlcm5bXCJQQVRDSFwiXSA9IFwicGF0Y2hcIjtcbiAgICBQYXR0ZXJuW1wiUFVUXCJdID0gXCJwdXRcIjtcbiAgICBQYXR0ZXJuW1wiREVMRVRFXCJdID0gXCJkZWxldGVcIjtcbn0pKFBhdHRlcm4gPSBleHBvcnRzLlBhdHRlcm4gfHwgKGV4cG9ydHMuUGF0dGVybiA9IHt9KSk7XG4vKipcbiAqIFRoZSBHYXRld2F5IHByb3hpZXMgaHR0cCByZXF1ZXN0cyB0byBUd2lycCBDb21wbGlhbnRcbiAqIGhhbmRsZXJzXG4gKi9cbmNsYXNzIEdhdGV3YXkge1xuICAgIGNvbnN0cnVjdG9yKHJvdXRlcykge1xuICAgICAgICB0aGlzLnJvdXRlcyA9IHJvdXRlcztcbiAgICB9XG4gICAgLyoqXG4gICAgICogTWlkZGxld2FyZSB0aGF0IHJld3JpdGUgdGhlIGN1cnJlbnQgcmVxdWVzdFxuICAgICAqIHRvIGEgVHdpcnAgY29tcGxpYW50IHJlcXVlc3RcbiAgICAgKi9cbiAgICB0d2lycFJld3JpdGUocHJlZml4ID0gXCIvdHdpcnBcIikge1xuICAgICAgICByZXR1cm4gKHJlcSwgcmVzcCwgbmV4dCkgPT4ge1xuICAgICAgICAgICAgdGhpcy5yZXdyaXRlKHJlcSwgcmVzcCwgcHJlZml4KVxuICAgICAgICAgICAgICAgIC50aGVuKCgpID0+IG5leHQoKSlcbiAgICAgICAgICAgICAgICAuY2F0Y2goKGUpID0+IHtcbiAgICAgICAgICAgICAgICBpZiAoZSBpbnN0YW5jZW9mIGVycm9yc18xLlR3aXJwRXJyb3IpIHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKGUuY29kZSAhPT0gZXJyb3JzXzEuVHdpcnBFcnJvckNvZGUuTm90Rm91bmQpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHNlcnZlcl8xLndyaXRlRXJyb3IocmVzcCwgZSk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBuZXh0KCk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogUmV3cml0ZSBhbiBpbmNvbWluZyByZXF1ZXN0IHRvIGEgVHdpcnAgY29tcGxpYW50IHJlcXVlc3RcbiAgICAgKiBAcGFyYW0gcmVxXG4gICAgICogQHBhcmFtIHJlc3BcbiAgICAgKiBAcGFyYW0gcHJlZml4XG4gICAgICovXG4gICAgcmV3cml0ZShyZXEsIHJlc3AsIHByZWZpeCA9IFwiL3R3aXJwXCIpIHtcbiAgICAgICAgcmV0dXJuIF9fYXdhaXRlcih0aGlzLCB2b2lkIDAsIHZvaWQgMCwgZnVuY3Rpb24qICgpIHtcbiAgICAgICAgICAgIGNvbnN0IFttYXRjaCwgcm91dGVdID0gdGhpcy5tYXRjaFJvdXRlKHJlcSk7XG4gICAgICAgICAgICBjb25zdCBib2R5ID0geWllbGQgdGhpcy5wcmVwYXJlVHdpcnBCb2R5KHJlcSwgbWF0Y2gsIHJvdXRlKTtcbiAgICAgICAgICAgIGNvbnN0IHR3aXJwVXJsID0gYCR7cHJlZml4fS8ke3JvdXRlLnBhY2thZ2VOYW1lfS4ke3JvdXRlLnNlcnZpY2VOYW1lfS8ke3JvdXRlLm1ldGhvZE5hbWV9YDtcbiAgICAgICAgICAgIHJlcS51cmwgPSB0d2lycFVybDtcbiAgICAgICAgICAgIHJlcS5vcmlnaW5hbFVybCA9IHR3aXJwVXJsO1xuICAgICAgICAgICAgcmVxLm1ldGhvZCA9IFwiUE9TVFwiO1xuICAgICAgICAgICAgcmVxLmhlYWRlcnNbXCJjb250ZW50LXR5cGVcIl0gPSBcImFwcGxpY2F0aW9uL2pzb25cIjtcbiAgICAgICAgICAgIHJlcS5yYXdCb2R5ID0gQnVmZmVyLmZyb20oSlNPTi5zdHJpbmdpZnkoYm9keSkpO1xuICAgICAgICAgICAgaWYgKHJvdXRlLnJlc3BvbnNlQm9keUtleSkge1xuICAgICAgICAgICAgICAgIGNvbnN0IGVuZEZuID0gcmVzcC5lbmQuYmluZChyZXNwKTtcbiAgICAgICAgICAgICAgICByZXNwLmVuZCA9IGZ1bmN0aW9uIChjaHVuaykge1xuICAgICAgICAgICAgICAgICAgICBpZiAocmVzcC5zdGF0dXNDb2RlID09PSAyMDApIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGVuZEZuKGB7IFwiJHtyb3V0ZS5yZXNwb25zZUJvZHlLZXl9XCI6ICR7Y2h1bmt9IH1gKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGVuZEZuKGNodW5rKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH07XG4gICAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBDcmVhdGUgYSByZXZlcnNlIHByb3h5IGhhbmRsZXIgdG9cbiAgICAgKiBwcm94eSBodHRwIHJlcXVlc3RzIHRvIFR3aXJwIENvbXBsaWFudCBoYW5kbGVyc1xuICAgICAqIEBwYXJhbSBodHRwQ2xpZW50T3B0aW9uXG4gICAgICovXG4gICAgcmV2ZXJzZVByb3h5KGh0dHBDbGllbnRPcHRpb24pIHtcbiAgICAgICAgY29uc3QgY2xpZW50ID0gaHR0cF9jbGllbnRfMS5Ob2RlSHR0cFJQQyhodHRwQ2xpZW50T3B0aW9uKTtcbiAgICAgICAgcmV0dXJuIChyZXEsIHJlcykgPT4gX19hd2FpdGVyKHRoaXMsIHZvaWQgMCwgdm9pZCAwLCBmdW5jdGlvbiogKCkge1xuICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICBjb25zdCBbbWF0Y2gsIHJvdXRlXSA9IHRoaXMubWF0Y2hSb3V0ZShyZXEpO1xuICAgICAgICAgICAgICAgIGNvbnN0IGJvZHkgPSB5aWVsZCB0aGlzLnByZXBhcmVUd2lycEJvZHkocmVxLCBtYXRjaCwgcm91dGUpO1xuICAgICAgICAgICAgICAgIGNvbnN0IHJlc3BvbnNlID0geWllbGQgY2xpZW50LnJlcXVlc3QoYCR7cm91dGUucGFja2FnZU5hbWV9LiR7cm91dGUuc2VydmljZU5hbWV9YCwgcm91dGUubWV0aG9kTmFtZSwgXCJhcHBsaWNhdGlvbi9qc29uXCIsIGJvZHkpO1xuICAgICAgICAgICAgICAgIHJlcy5zdGF0dXNDb2RlID0gMjAwO1xuICAgICAgICAgICAgICAgIHJlcy5zZXRIZWFkZXIoXCJjb250ZW50LXR5cGVcIiwgXCJhcHBsaWNhdGlvbi9qc29uXCIpO1xuICAgICAgICAgICAgICAgIGxldCBqc29uUmVzcG9uc2U7XG4gICAgICAgICAgICAgICAgaWYgKHJvdXRlLnJlc3BvbnNlQm9keUtleSkge1xuICAgICAgICAgICAgICAgICAgICBqc29uUmVzcG9uc2UgPSBKU09OLnN0cmluZ2lmeSh7IFtyb3V0ZS5yZXNwb25zZUJvZHlLZXldOiByZXNwb25zZSB9KTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIGpzb25SZXNwb25zZSA9IEpTT04uc3RyaW5naWZ5KHJlc3BvbnNlKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgcmVzLmVuZChqc29uUmVzcG9uc2UpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgY2F0Y2ggKGUpIHtcbiAgICAgICAgICAgICAgICBzZXJ2ZXJfMS53cml0ZUVycm9yKHJlcywgZSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBQcmVwYXJlcyB0d2lycCBib2R5IHJlcXVlc3RzIHVzaW5nIGh0dHAuZ29vZ2xlLmFubm90aW9uc1xuICAgICAqIGNvbXBsaWFudCBzcGVjXG4gICAgICpcbiAgICAgKiBAcGFyYW0gcmVxXG4gICAgICogQHBhcmFtIG1hdGNoXG4gICAgICogQHBhcmFtIHJvdXRlXG4gICAgICogQHByb3RlY3RlZFxuICAgICAqL1xuICAgIHByZXBhcmVUd2lycEJvZHkocmVxLCBtYXRjaCwgcm91dGUpIHtcbiAgICAgICAgcmV0dXJuIF9fYXdhaXRlcih0aGlzLCB2b2lkIDAsIHZvaWQgMCwgZnVuY3Rpb24qICgpIHtcbiAgICAgICAgICAgIGNvbnN0IF9hID0gbWF0Y2gucGFyYW1zLCB7IHF1ZXJ5X3N0cmluZyB9ID0gX2EsIHBhcmFtcyA9IF9fcmVzdChfYSwgW1wicXVlcnlfc3RyaW5nXCJdKTtcbiAgICAgICAgICAgIGxldCByZXF1ZXN0Qm9keSA9IE9iamVjdC5hc3NpZ24oe30sIHBhcmFtcyk7XG4gICAgICAgICAgICBpZiAocXVlcnlfc3RyaW5nICYmIHJvdXRlLmJvZHlLZXkgIT09IFwiKlwiKSB7XG4gICAgICAgICAgICAgICAgY29uc3QgcXVlcnlQYXJhbXMgPSB0aGlzLnBhcnNlUXVlcnlTdHJpbmcocXVlcnlfc3RyaW5nKTtcbiAgICAgICAgICAgICAgICByZXF1ZXN0Qm9keSA9IE9iamVjdC5hc3NpZ24oT2JqZWN0LmFzc2lnbih7fSwgcXVlcnlQYXJhbXMpLCByZXF1ZXN0Qm9keSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBsZXQgYm9keSA9IHt9O1xuICAgICAgICAgICAgaWYgKHJvdXRlLmJvZHlLZXkpIHtcbiAgICAgICAgICAgICAgICBjb25zdCBkYXRhID0geWllbGQgcmVxdWVzdF8xLmdldFJlcXVlc3REYXRhKHJlcSk7XG4gICAgICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QganNvbkJvZHkgPSBKU09OLnBhcnNlKGRhdGEudG9TdHJpbmcoKSB8fCBcInt9XCIpO1xuICAgICAgICAgICAgICAgICAgICBpZiAocm91dGUuYm9keUtleSA9PT0gXCIqXCIpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGJvZHkgPSBqc29uQm9keTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGJvZHlbcm91dGUuYm9keUtleV0gPSBqc29uQm9keTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBjYXRjaCAoZSkge1xuICAgICAgICAgICAgICAgICAgICBjb25zdCBtc2cgPSBcInRoZSBqc29uIHJlcXVlc3QgY291bGQgbm90IGJlIGRlY29kZWRcIjtcbiAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IGVycm9yc18xLlR3aXJwRXJyb3IoZXJyb3JzXzEuVHdpcnBFcnJvckNvZGUuTWFsZm9ybWVkLCBtc2cpLndpdGhDYXVzZShlLCB0cnVlKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4gT2JqZWN0LmFzc2lnbihPYmplY3QuYXNzaWduKHt9LCBib2R5KSwgcmVxdWVzdEJvZHkpO1xuICAgICAgICB9KTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogTWF0Y2hlcyBhIHJvdXRlXG4gICAgICogQHBhcmFtIHJlcVxuICAgICAqL1xuICAgIG1hdGNoUm91dGUocmVxKSB7XG4gICAgICAgIHZhciBfYTtcbiAgICAgICAgY29uc3QgaHR0cE1ldGhvZCA9IChfYSA9IHJlcS5tZXRob2QpID09PSBudWxsIHx8IF9hID09PSB2b2lkIDAgPyB2b2lkIDAgOiBfYS50b0xvd2VyQ2FzZSgpO1xuICAgICAgICBpZiAoIWh0dHBNZXRob2QpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBlcnJvcnNfMS5CYWRSb3V0ZUVycm9yKGBtZXRob2Qgbm90IGFsbG93ZWRgLCByZXEubWV0aG9kIHx8IFwiXCIsIHJlcS51cmwgfHwgXCJcIik7XG4gICAgICAgIH1cbiAgICAgICAgY29uc3Qgcm91dGVzID0gdGhpcy5yb3V0ZXNbaHR0cE1ldGhvZF07XG4gICAgICAgIGZvciAoY29uc3Qgcm91dGUgb2Ygcm91dGVzKSB7XG4gICAgICAgICAgICBjb25zdCBtYXRjaCA9IHJvdXRlLm1hdGNoZXIocmVxLnVybCB8fCBcIi9cIik7XG4gICAgICAgICAgICBpZiAobWF0Y2gpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gW21hdGNoLCByb3V0ZV07XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgdGhyb3cgbmV3IGVycm9yc18xLk5vdEZvdW5kRXJyb3IoYHVybCAke3JlcS51cmx9IG5vdCBmb3VuZGApO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBQYXJzZSBxdWVyeSBzdHJpbmdcbiAgICAgKiBAcGFyYW0gcXVlcnlTdHJpbmdcbiAgICAgKi9cbiAgICBwYXJzZVF1ZXJ5U3RyaW5nKHF1ZXJ5U3RyaW5nKSB7XG4gICAgICAgIGNvbnN0IHF1ZXJ5UGFyYW1zID0gcXVlcnlzdHJpbmdfMS5wYXJzZShxdWVyeVN0cmluZy5yZXBsYWNlKFwiP1wiLCBcIlwiKSk7XG4gICAgICAgIHJldHVybiBkb3RPYmplY3Qub2JqZWN0KHF1ZXJ5UGFyYW1zKTtcbiAgICB9XG59XG5leHBvcnRzLkdhdGV3YXkgPSBHYXRld2F5O1xuIiwKICAgICJcInVzZSBzdHJpY3RcIjtcbnZhciBfX2NyZWF0ZUJpbmRpbmcgPSAodGhpcyAmJiB0aGlzLl9fY3JlYXRlQmluZGluZykgfHwgKE9iamVjdC5jcmVhdGUgPyAoZnVuY3Rpb24obywgbSwgaywgazIpIHtcbiAgICBpZiAoazIgPT09IHVuZGVmaW5lZCkgazIgPSBrO1xuICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShvLCBrMiwgeyBlbnVtZXJhYmxlOiB0cnVlLCBnZXQ6IGZ1bmN0aW9uKCkgeyByZXR1cm4gbVtrXTsgfSB9KTtcbn0pIDogKGZ1bmN0aW9uKG8sIG0sIGssIGsyKSB7XG4gICAgaWYgKGsyID09PSB1bmRlZmluZWQpIGsyID0gaztcbiAgICBvW2syXSA9IG1ba107XG59KSk7XG52YXIgX19leHBvcnRTdGFyID0gKHRoaXMgJiYgdGhpcy5fX2V4cG9ydFN0YXIpIHx8IGZ1bmN0aW9uKG0sIGV4cG9ydHMpIHtcbiAgICBmb3IgKHZhciBwIGluIG0pIGlmIChwICE9PSBcImRlZmF1bHRcIiAmJiAhT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKGV4cG9ydHMsIHApKSBfX2NyZWF0ZUJpbmRpbmcoZXhwb3J0cywgbSwgcCk7XG59O1xuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiX19lc01vZHVsZVwiLCB7IHZhbHVlOiB0cnVlIH0pO1xuZXhwb3J0cy5Ud2lycENvbnRlbnRUeXBlID0gdm9pZCAwO1xuX19leHBvcnRTdGFyKHJlcXVpcmUoXCIuL2NvbnRleHRcIiksIGV4cG9ydHMpO1xuX19leHBvcnRTdGFyKHJlcXVpcmUoXCIuL3NlcnZlclwiKSwgZXhwb3J0cyk7XG5fX2V4cG9ydFN0YXIocmVxdWlyZShcIi4vaW50ZXJjZXB0b3JzXCIpLCBleHBvcnRzKTtcbl9fZXhwb3J0U3RhcihyZXF1aXJlKFwiLi9ob29rc1wiKSwgZXhwb3J0cyk7XG5fX2V4cG9ydFN0YXIocmVxdWlyZShcIi4vZXJyb3JzXCIpLCBleHBvcnRzKTtcbl9fZXhwb3J0U3RhcihyZXF1aXJlKFwiLi9nYXRld2F5XCIpLCBleHBvcnRzKTtcbl9fZXhwb3J0U3RhcihyZXF1aXJlKFwiLi9odHRwLmNsaWVudFwiKSwgZXhwb3J0cyk7XG52YXIgcmVxdWVzdF8xID0gcmVxdWlyZShcIi4vcmVxdWVzdFwiKTtcbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIlR3aXJwQ29udGVudFR5cGVcIiwgeyBlbnVtZXJhYmxlOiB0cnVlLCBnZXQ6IGZ1bmN0aW9uICgpIHsgcmV0dXJuIHJlcXVlc3RfMS5Ud2lycENvbnRlbnRUeXBlOyB9IH0pO1xuIiwKICAgICJcInVzZSBzdHJpY3RcIjtcbnZhciBfX2F3YWl0ZXIgPSAodGhpcyAmJiB0aGlzLl9fYXdhaXRlcikgfHwgZnVuY3Rpb24gKHRoaXNBcmcsIF9hcmd1bWVudHMsIFAsIGdlbmVyYXRvcikge1xuICAgIGZ1bmN0aW9uIGFkb3B0KHZhbHVlKSB7IHJldHVybiB2YWx1ZSBpbnN0YW5jZW9mIFAgPyB2YWx1ZSA6IG5ldyBQKGZ1bmN0aW9uIChyZXNvbHZlKSB7IHJlc29sdmUodmFsdWUpOyB9KTsgfVxuICAgIHJldHVybiBuZXcgKFAgfHwgKFAgPSBQcm9taXNlKSkoZnVuY3Rpb24gKHJlc29sdmUsIHJlamVjdCkge1xuICAgICAgICBmdW5jdGlvbiBmdWxmaWxsZWQodmFsdWUpIHsgdHJ5IHsgc3RlcChnZW5lcmF0b3IubmV4dCh2YWx1ZSkpOyB9IGNhdGNoIChlKSB7IHJlamVjdChlKTsgfSB9XG4gICAgICAgIGZ1bmN0aW9uIHJlamVjdGVkKHZhbHVlKSB7IHRyeSB7IHN0ZXAoZ2VuZXJhdG9yW1widGhyb3dcIl0odmFsdWUpKTsgfSBjYXRjaCAoZSkgeyByZWplY3QoZSk7IH0gfVxuICAgICAgICBmdW5jdGlvbiBzdGVwKHJlc3VsdCkgeyByZXN1bHQuZG9uZSA/IHJlc29sdmUocmVzdWx0LnZhbHVlKSA6IGFkb3B0KHJlc3VsdC52YWx1ZSkudGhlbihmdWxmaWxsZWQsIHJlamVjdGVkKTsgfVxuICAgICAgICBzdGVwKChnZW5lcmF0b3IgPSBnZW5lcmF0b3IuYXBwbHkodGhpc0FyZywgX2FyZ3VtZW50cyB8fCBbXSkpLm5leHQoKSk7XG4gICAgfSk7XG59O1xuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiX19lc01vZHVsZVwiLCB7IHZhbHVlOiB0cnVlIH0pO1xuZXhwb3J0cy5jcmVhdGVBcnRpZmFjdFNlcnZpY2VTZXJ2ZXIgPSBleHBvcnRzLkFydGlmYWN0U2VydmljZU1ldGhvZExpc3QgPSBleHBvcnRzLkFydGlmYWN0U2VydmljZU1ldGhvZCA9IGV4cG9ydHMuQXJ0aWZhY3RTZXJ2aWNlQ2xpZW50UHJvdG9idWYgPSBleHBvcnRzLkFydGlmYWN0U2VydmljZUNsaWVudEpTT04gPSB2b2lkIDA7XG5jb25zdCB0d2lycF90c18xID0gcmVxdWlyZShcInR3aXJwLXRzXCIpO1xuY29uc3QgYXJ0aWZhY3RfMSA9IHJlcXVpcmUoXCIuL2FydGlmYWN0XCIpO1xuY2xhc3MgQXJ0aWZhY3RTZXJ2aWNlQ2xpZW50SlNPTiB7XG4gICAgY29uc3RydWN0b3IocnBjKSB7XG4gICAgICAgIHRoaXMucnBjID0gcnBjO1xuICAgICAgICB0aGlzLkNyZWF0ZUFydGlmYWN0LmJpbmQodGhpcyk7XG4gICAgICAgIHRoaXMuRmluYWxpemVBcnRpZmFjdC5iaW5kKHRoaXMpO1xuICAgICAgICB0aGlzLkxpc3RBcnRpZmFjdHMuYmluZCh0aGlzKTtcbiAgICAgICAgdGhpcy5HZXRTaWduZWRBcnRpZmFjdFVSTC5iaW5kKHRoaXMpO1xuICAgICAgICB0aGlzLkRlbGV0ZUFydGlmYWN0LmJpbmQodGhpcyk7XG4gICAgfVxuICAgIENyZWF0ZUFydGlmYWN0KHJlcXVlc3QpIHtcbiAgICAgICAgY29uc3QgZGF0YSA9IGFydGlmYWN0XzEuQ3JlYXRlQXJ0aWZhY3RSZXF1ZXN0LnRvSnNvbihyZXF1ZXN0LCB7XG4gICAgICAgICAgICB1c2VQcm90b0ZpZWxkTmFtZTogdHJ1ZSxcbiAgICAgICAgICAgIGVtaXREZWZhdWx0VmFsdWVzOiBmYWxzZSxcbiAgICAgICAgfSk7XG4gICAgICAgIGNvbnN0IHByb21pc2UgPSB0aGlzLnJwYy5yZXF1ZXN0KFwiZ2l0aHViLmFjdGlvbnMucmVzdWx0cy5hcGkudjEuQXJ0aWZhY3RTZXJ2aWNlXCIsIFwiQ3JlYXRlQXJ0aWZhY3RcIiwgXCJhcHBsaWNhdGlvbi9qc29uXCIsIGRhdGEpO1xuICAgICAgICByZXR1cm4gcHJvbWlzZS50aGVuKChkYXRhKSA9PiBhcnRpZmFjdF8xLkNyZWF0ZUFydGlmYWN0UmVzcG9uc2UuZnJvbUpzb24oZGF0YSwge1xuICAgICAgICAgICAgaWdub3JlVW5rbm93bkZpZWxkczogdHJ1ZSxcbiAgICAgICAgfSkpO1xuICAgIH1cbiAgICBGaW5hbGl6ZUFydGlmYWN0KHJlcXVlc3QpIHtcbiAgICAgICAgY29uc3QgZGF0YSA9IGFydGlmYWN0XzEuRmluYWxpemVBcnRpZmFjdFJlcXVlc3QudG9Kc29uKHJlcXVlc3QsIHtcbiAgICAgICAgICAgIHVzZVByb3RvRmllbGROYW1lOiB0cnVlLFxuICAgICAgICAgICAgZW1pdERlZmF1bHRWYWx1ZXM6IGZhbHNlLFxuICAgICAgICB9KTtcbiAgICAgICAgY29uc3QgcHJvbWlzZSA9IHRoaXMucnBjLnJlcXVlc3QoXCJnaXRodWIuYWN0aW9ucy5yZXN1bHRzLmFwaS52MS5BcnRpZmFjdFNlcnZpY2VcIiwgXCJGaW5hbGl6ZUFydGlmYWN0XCIsIFwiYXBwbGljYXRpb24vanNvblwiLCBkYXRhKTtcbiAgICAgICAgcmV0dXJuIHByb21pc2UudGhlbigoZGF0YSkgPT4gYXJ0aWZhY3RfMS5GaW5hbGl6ZUFydGlmYWN0UmVzcG9uc2UuZnJvbUpzb24oZGF0YSwge1xuICAgICAgICAgICAgaWdub3JlVW5rbm93bkZpZWxkczogdHJ1ZSxcbiAgICAgICAgfSkpO1xuICAgIH1cbiAgICBMaXN0QXJ0aWZhY3RzKHJlcXVlc3QpIHtcbiAgICAgICAgY29uc3QgZGF0YSA9IGFydGlmYWN0XzEuTGlzdEFydGlmYWN0c1JlcXVlc3QudG9Kc29uKHJlcXVlc3QsIHtcbiAgICAgICAgICAgIHVzZVByb3RvRmllbGROYW1lOiB0cnVlLFxuICAgICAgICAgICAgZW1pdERlZmF1bHRWYWx1ZXM6IGZhbHNlLFxuICAgICAgICB9KTtcbiAgICAgICAgY29uc3QgcHJvbWlzZSA9IHRoaXMucnBjLnJlcXVlc3QoXCJnaXRodWIuYWN0aW9ucy5yZXN1bHRzLmFwaS52MS5BcnRpZmFjdFNlcnZpY2VcIiwgXCJMaXN0QXJ0aWZhY3RzXCIsIFwiYXBwbGljYXRpb24vanNvblwiLCBkYXRhKTtcbiAgICAgICAgcmV0dXJuIHByb21pc2UudGhlbigoZGF0YSkgPT4gYXJ0aWZhY3RfMS5MaXN0QXJ0aWZhY3RzUmVzcG9uc2UuZnJvbUpzb24oZGF0YSwgeyBpZ25vcmVVbmtub3duRmllbGRzOiB0cnVlIH0pKTtcbiAgICB9XG4gICAgR2V0U2lnbmVkQXJ0aWZhY3RVUkwocmVxdWVzdCkge1xuICAgICAgICBjb25zdCBkYXRhID0gYXJ0aWZhY3RfMS5HZXRTaWduZWRBcnRpZmFjdFVSTFJlcXVlc3QudG9Kc29uKHJlcXVlc3QsIHtcbiAgICAgICAgICAgIHVzZVByb3RvRmllbGROYW1lOiB0cnVlLFxuICAgICAgICAgICAgZW1pdERlZmF1bHRWYWx1ZXM6IGZhbHNlLFxuICAgICAgICB9KTtcbiAgICAgICAgY29uc3QgcHJvbWlzZSA9IHRoaXMucnBjLnJlcXVlc3QoXCJnaXRodWIuYWN0aW9ucy5yZXN1bHRzLmFwaS52MS5BcnRpZmFjdFNlcnZpY2VcIiwgXCJHZXRTaWduZWRBcnRpZmFjdFVSTFwiLCBcImFwcGxpY2F0aW9uL2pzb25cIiwgZGF0YSk7XG4gICAgICAgIHJldHVybiBwcm9taXNlLnRoZW4oKGRhdGEpID0+IGFydGlmYWN0XzEuR2V0U2lnbmVkQXJ0aWZhY3RVUkxSZXNwb25zZS5mcm9tSnNvbihkYXRhLCB7XG4gICAgICAgICAgICBpZ25vcmVVbmtub3duRmllbGRzOiB0cnVlLFxuICAgICAgICB9KSk7XG4gICAgfVxuICAgIERlbGV0ZUFydGlmYWN0KHJlcXVlc3QpIHtcbiAgICAgICAgY29uc3QgZGF0YSA9IGFydGlmYWN0XzEuRGVsZXRlQXJ0aWZhY3RSZXF1ZXN0LnRvSnNvbihyZXF1ZXN0LCB7XG4gICAgICAgICAgICB1c2VQcm90b0ZpZWxkTmFtZTogdHJ1ZSxcbiAgICAgICAgICAgIGVtaXREZWZhdWx0VmFsdWVzOiBmYWxzZSxcbiAgICAgICAgfSk7XG4gICAgICAgIGNvbnN0IHByb21pc2UgPSB0aGlzLnJwYy5yZXF1ZXN0KFwiZ2l0aHViLmFjdGlvbnMucmVzdWx0cy5hcGkudjEuQXJ0aWZhY3RTZXJ2aWNlXCIsIFwiRGVsZXRlQXJ0aWZhY3RcIiwgXCJhcHBsaWNhdGlvbi9qc29uXCIsIGRhdGEpO1xuICAgICAgICByZXR1cm4gcHJvbWlzZS50aGVuKChkYXRhKSA9PiBhcnRpZmFjdF8xLkRlbGV0ZUFydGlmYWN0UmVzcG9uc2UuZnJvbUpzb24oZGF0YSwge1xuICAgICAgICAgICAgaWdub3JlVW5rbm93bkZpZWxkczogdHJ1ZSxcbiAgICAgICAgfSkpO1xuICAgIH1cbn1cbmV4cG9ydHMuQXJ0aWZhY3RTZXJ2aWNlQ2xpZW50SlNPTiA9IEFydGlmYWN0U2VydmljZUNsaWVudEpTT047XG5jbGFzcyBBcnRpZmFjdFNlcnZpY2VDbGllbnRQcm90b2J1ZiB7XG4gICAgY29uc3RydWN0b3IocnBjKSB7XG4gICAgICAgIHRoaXMucnBjID0gcnBjO1xuICAgICAgICB0aGlzLkNyZWF0ZUFydGlmYWN0LmJpbmQodGhpcyk7XG4gICAgICAgIHRoaXMuRmluYWxpemVBcnRpZmFjdC5iaW5kKHRoaXMpO1xuICAgICAgICB0aGlzLkxpc3RBcnRpZmFjdHMuYmluZCh0aGlzKTtcbiAgICAgICAgdGhpcy5HZXRTaWduZWRBcnRpZmFjdFVSTC5iaW5kKHRoaXMpO1xuICAgICAgICB0aGlzLkRlbGV0ZUFydGlmYWN0LmJpbmQodGhpcyk7XG4gICAgfVxuICAgIENyZWF0ZUFydGlmYWN0KHJlcXVlc3QpIHtcbiAgICAgICAgY29uc3QgZGF0YSA9IGFydGlmYWN0XzEuQ3JlYXRlQXJ0aWZhY3RSZXF1ZXN0LnRvQmluYXJ5KHJlcXVlc3QpO1xuICAgICAgICBjb25zdCBwcm9taXNlID0gdGhpcy5ycGMucmVxdWVzdChcImdpdGh1Yi5hY3Rpb25zLnJlc3VsdHMuYXBpLnYxLkFydGlmYWN0U2VydmljZVwiLCBcIkNyZWF0ZUFydGlmYWN0XCIsIFwiYXBwbGljYXRpb24vcHJvdG9idWZcIiwgZGF0YSk7XG4gICAgICAgIHJldHVybiBwcm9taXNlLnRoZW4oKGRhdGEpID0+IGFydGlmYWN0XzEuQ3JlYXRlQXJ0aWZhY3RSZXNwb25zZS5mcm9tQmluYXJ5KGRhdGEpKTtcbiAgICB9XG4gICAgRmluYWxpemVBcnRpZmFjdChyZXF1ZXN0KSB7XG4gICAgICAgIGNvbnN0IGRhdGEgPSBhcnRpZmFjdF8xLkZpbmFsaXplQXJ0aWZhY3RSZXF1ZXN0LnRvQmluYXJ5KHJlcXVlc3QpO1xuICAgICAgICBjb25zdCBwcm9taXNlID0gdGhpcy5ycGMucmVxdWVzdChcImdpdGh1Yi5hY3Rpb25zLnJlc3VsdHMuYXBpLnYxLkFydGlmYWN0U2VydmljZVwiLCBcIkZpbmFsaXplQXJ0aWZhY3RcIiwgXCJhcHBsaWNhdGlvbi9wcm90b2J1ZlwiLCBkYXRhKTtcbiAgICAgICAgcmV0dXJuIHByb21pc2UudGhlbigoZGF0YSkgPT4gYXJ0aWZhY3RfMS5GaW5hbGl6ZUFydGlmYWN0UmVzcG9uc2UuZnJvbUJpbmFyeShkYXRhKSk7XG4gICAgfVxuICAgIExpc3RBcnRpZmFjdHMocmVxdWVzdCkge1xuICAgICAgICBjb25zdCBkYXRhID0gYXJ0aWZhY3RfMS5MaXN0QXJ0aWZhY3RzUmVxdWVzdC50b0JpbmFyeShyZXF1ZXN0KTtcbiAgICAgICAgY29uc3QgcHJvbWlzZSA9IHRoaXMucnBjLnJlcXVlc3QoXCJnaXRodWIuYWN0aW9ucy5yZXN1bHRzLmFwaS52MS5BcnRpZmFjdFNlcnZpY2VcIiwgXCJMaXN0QXJ0aWZhY3RzXCIsIFwiYXBwbGljYXRpb24vcHJvdG9idWZcIiwgZGF0YSk7XG4gICAgICAgIHJldHVybiBwcm9taXNlLnRoZW4oKGRhdGEpID0+IGFydGlmYWN0XzEuTGlzdEFydGlmYWN0c1Jlc3BvbnNlLmZyb21CaW5hcnkoZGF0YSkpO1xuICAgIH1cbiAgICBHZXRTaWduZWRBcnRpZmFjdFVSTChyZXF1ZXN0KSB7XG4gICAgICAgIGNvbnN0IGRhdGEgPSBhcnRpZmFjdF8xLkdldFNpZ25lZEFydGlmYWN0VVJMUmVxdWVzdC50b0JpbmFyeShyZXF1ZXN0KTtcbiAgICAgICAgY29uc3QgcHJvbWlzZSA9IHRoaXMucnBjLnJlcXVlc3QoXCJnaXRodWIuYWN0aW9ucy5yZXN1bHRzLmFwaS52MS5BcnRpZmFjdFNlcnZpY2VcIiwgXCJHZXRTaWduZWRBcnRpZmFjdFVSTFwiLCBcImFwcGxpY2F0aW9uL3Byb3RvYnVmXCIsIGRhdGEpO1xuICAgICAgICByZXR1cm4gcHJvbWlzZS50aGVuKChkYXRhKSA9PiBhcnRpZmFjdF8xLkdldFNpZ25lZEFydGlmYWN0VVJMUmVzcG9uc2UuZnJvbUJpbmFyeShkYXRhKSk7XG4gICAgfVxuICAgIERlbGV0ZUFydGlmYWN0KHJlcXVlc3QpIHtcbiAgICAgICAgY29uc3QgZGF0YSA9IGFydGlmYWN0XzEuRGVsZXRlQXJ0aWZhY3RSZXF1ZXN0LnRvQmluYXJ5KHJlcXVlc3QpO1xuICAgICAgICBjb25zdCBwcm9taXNlID0gdGhpcy5ycGMucmVxdWVzdChcImdpdGh1Yi5hY3Rpb25zLnJlc3VsdHMuYXBpLnYxLkFydGlmYWN0U2VydmljZVwiLCBcIkRlbGV0ZUFydGlmYWN0XCIsIFwiYXBwbGljYXRpb24vcHJvdG9idWZcIiwgZGF0YSk7XG4gICAgICAgIHJldHVybiBwcm9taXNlLnRoZW4oKGRhdGEpID0+IGFydGlmYWN0XzEuRGVsZXRlQXJ0aWZhY3RSZXNwb25zZS5mcm9tQmluYXJ5KGRhdGEpKTtcbiAgICB9XG59XG5leHBvcnRzLkFydGlmYWN0U2VydmljZUNsaWVudFByb3RvYnVmID0gQXJ0aWZhY3RTZXJ2aWNlQ2xpZW50UHJvdG9idWY7XG52YXIgQXJ0aWZhY3RTZXJ2aWNlTWV0aG9kO1xuKGZ1bmN0aW9uIChBcnRpZmFjdFNlcnZpY2VNZXRob2QpIHtcbiAgICBBcnRpZmFjdFNlcnZpY2VNZXRob2RbXCJDcmVhdGVBcnRpZmFjdFwiXSA9IFwiQ3JlYXRlQXJ0aWZhY3RcIjtcbiAgICBBcnRpZmFjdFNlcnZpY2VNZXRob2RbXCJGaW5hbGl6ZUFydGlmYWN0XCJdID0gXCJGaW5hbGl6ZUFydGlmYWN0XCI7XG4gICAgQXJ0aWZhY3RTZXJ2aWNlTWV0aG9kW1wiTGlzdEFydGlmYWN0c1wiXSA9IFwiTGlzdEFydGlmYWN0c1wiO1xuICAgIEFydGlmYWN0U2VydmljZU1ldGhvZFtcIkdldFNpZ25lZEFydGlmYWN0VVJMXCJdID0gXCJHZXRTaWduZWRBcnRpZmFjdFVSTFwiO1xuICAgIEFydGlmYWN0U2VydmljZU1ldGhvZFtcIkRlbGV0ZUFydGlmYWN0XCJdID0gXCJEZWxldGVBcnRpZmFjdFwiO1xufSkoQXJ0aWZhY3RTZXJ2aWNlTWV0aG9kIHx8IChleHBvcnRzLkFydGlmYWN0U2VydmljZU1ldGhvZCA9IEFydGlmYWN0U2VydmljZU1ldGhvZCA9IHt9KSk7XG5leHBvcnRzLkFydGlmYWN0U2VydmljZU1ldGhvZExpc3QgPSBbXG4gICAgQXJ0aWZhY3RTZXJ2aWNlTWV0aG9kLkNyZWF0ZUFydGlmYWN0LFxuICAgIEFydGlmYWN0U2VydmljZU1ldGhvZC5GaW5hbGl6ZUFydGlmYWN0LFxuICAgIEFydGlmYWN0U2VydmljZU1ldGhvZC5MaXN0QXJ0aWZhY3RzLFxuICAgIEFydGlmYWN0U2VydmljZU1ldGhvZC5HZXRTaWduZWRBcnRpZmFjdFVSTCxcbiAgICBBcnRpZmFjdFNlcnZpY2VNZXRob2QuRGVsZXRlQXJ0aWZhY3QsXG5dO1xuZnVuY3Rpb24gY3JlYXRlQXJ0aWZhY3RTZXJ2aWNlU2VydmVyKHNlcnZpY2UpIHtcbiAgICByZXR1cm4gbmV3IHR3aXJwX3RzXzEuVHdpcnBTZXJ2ZXIoe1xuICAgICAgICBzZXJ2aWNlLFxuICAgICAgICBwYWNrYWdlTmFtZTogXCJnaXRodWIuYWN0aW9ucy5yZXN1bHRzLmFwaS52MVwiLFxuICAgICAgICBzZXJ2aWNlTmFtZTogXCJBcnRpZmFjdFNlcnZpY2VcIixcbiAgICAgICAgbWV0aG9kTGlzdDogZXhwb3J0cy5BcnRpZmFjdFNlcnZpY2VNZXRob2RMaXN0LFxuICAgICAgICBtYXRjaFJvdXRlOiBtYXRjaEFydGlmYWN0U2VydmljZVJvdXRlLFxuICAgIH0pO1xufVxuZXhwb3J0cy5jcmVhdGVBcnRpZmFjdFNlcnZpY2VTZXJ2ZXIgPSBjcmVhdGVBcnRpZmFjdFNlcnZpY2VTZXJ2ZXI7XG5mdW5jdGlvbiBtYXRjaEFydGlmYWN0U2VydmljZVJvdXRlKG1ldGhvZCwgZXZlbnRzKSB7XG4gICAgc3dpdGNoIChtZXRob2QpIHtcbiAgICAgICAgY2FzZSBcIkNyZWF0ZUFydGlmYWN0XCI6XG4gICAgICAgICAgICByZXR1cm4gKGN0eCwgc2VydmljZSwgZGF0YSwgaW50ZXJjZXB0b3JzKSA9PiBfX2F3YWl0ZXIodGhpcywgdm9pZCAwLCB2b2lkIDAsIGZ1bmN0aW9uKiAoKSB7XG4gICAgICAgICAgICAgICAgY3R4ID0gT2JqZWN0LmFzc2lnbihPYmplY3QuYXNzaWduKHt9LCBjdHgpLCB7IG1ldGhvZE5hbWU6IFwiQ3JlYXRlQXJ0aWZhY3RcIiB9KTtcbiAgICAgICAgICAgICAgICB5aWVsZCBldmVudHMub25NYXRjaChjdHgpO1xuICAgICAgICAgICAgICAgIHJldHVybiBoYW5kbGVBcnRpZmFjdFNlcnZpY2VDcmVhdGVBcnRpZmFjdFJlcXVlc3QoY3R4LCBzZXJ2aWNlLCBkYXRhLCBpbnRlcmNlcHRvcnMpO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgIGNhc2UgXCJGaW5hbGl6ZUFydGlmYWN0XCI6XG4gICAgICAgICAgICByZXR1cm4gKGN0eCwgc2VydmljZSwgZGF0YSwgaW50ZXJjZXB0b3JzKSA9PiBfX2F3YWl0ZXIodGhpcywgdm9pZCAwLCB2b2lkIDAsIGZ1bmN0aW9uKiAoKSB7XG4gICAgICAgICAgICAgICAgY3R4ID0gT2JqZWN0LmFzc2lnbihPYmplY3QuYXNzaWduKHt9LCBjdHgpLCB7IG1ldGhvZE5hbWU6IFwiRmluYWxpemVBcnRpZmFjdFwiIH0pO1xuICAgICAgICAgICAgICAgIHlpZWxkIGV2ZW50cy5vbk1hdGNoKGN0eCk7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGhhbmRsZUFydGlmYWN0U2VydmljZUZpbmFsaXplQXJ0aWZhY3RSZXF1ZXN0KGN0eCwgc2VydmljZSwgZGF0YSwgaW50ZXJjZXB0b3JzKTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICBjYXNlIFwiTGlzdEFydGlmYWN0c1wiOlxuICAgICAgICAgICAgcmV0dXJuIChjdHgsIHNlcnZpY2UsIGRhdGEsIGludGVyY2VwdG9ycykgPT4gX19hd2FpdGVyKHRoaXMsIHZvaWQgMCwgdm9pZCAwLCBmdW5jdGlvbiogKCkge1xuICAgICAgICAgICAgICAgIGN0eCA9IE9iamVjdC5hc3NpZ24oT2JqZWN0LmFzc2lnbih7fSwgY3R4KSwgeyBtZXRob2ROYW1lOiBcIkxpc3RBcnRpZmFjdHNcIiB9KTtcbiAgICAgICAgICAgICAgICB5aWVsZCBldmVudHMub25NYXRjaChjdHgpO1xuICAgICAgICAgICAgICAgIHJldHVybiBoYW5kbGVBcnRpZmFjdFNlcnZpY2VMaXN0QXJ0aWZhY3RzUmVxdWVzdChjdHgsIHNlcnZpY2UsIGRhdGEsIGludGVyY2VwdG9ycyk7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgY2FzZSBcIkdldFNpZ25lZEFydGlmYWN0VVJMXCI6XG4gICAgICAgICAgICByZXR1cm4gKGN0eCwgc2VydmljZSwgZGF0YSwgaW50ZXJjZXB0b3JzKSA9PiBfX2F3YWl0ZXIodGhpcywgdm9pZCAwLCB2b2lkIDAsIGZ1bmN0aW9uKiAoKSB7XG4gICAgICAgICAgICAgICAgY3R4ID0gT2JqZWN0LmFzc2lnbihPYmplY3QuYXNzaWduKHt9LCBjdHgpLCB7IG1ldGhvZE5hbWU6IFwiR2V0U2lnbmVkQXJ0aWZhY3RVUkxcIiB9KTtcbiAgICAgICAgICAgICAgICB5aWVsZCBldmVudHMub25NYXRjaChjdHgpO1xuICAgICAgICAgICAgICAgIHJldHVybiBoYW5kbGVBcnRpZmFjdFNlcnZpY2VHZXRTaWduZWRBcnRpZmFjdFVSTFJlcXVlc3QoY3R4LCBzZXJ2aWNlLCBkYXRhLCBpbnRlcmNlcHRvcnMpO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgIGNhc2UgXCJEZWxldGVBcnRpZmFjdFwiOlxuICAgICAgICAgICAgcmV0dXJuIChjdHgsIHNlcnZpY2UsIGRhdGEsIGludGVyY2VwdG9ycykgPT4gX19hd2FpdGVyKHRoaXMsIHZvaWQgMCwgdm9pZCAwLCBmdW5jdGlvbiogKCkge1xuICAgICAgICAgICAgICAgIGN0eCA9IE9iamVjdC5hc3NpZ24oT2JqZWN0LmFzc2lnbih7fSwgY3R4KSwgeyBtZXRob2ROYW1lOiBcIkRlbGV0ZUFydGlmYWN0XCIgfSk7XG4gICAgICAgICAgICAgICAgeWllbGQgZXZlbnRzLm9uTWF0Y2goY3R4KTtcbiAgICAgICAgICAgICAgICByZXR1cm4gaGFuZGxlQXJ0aWZhY3RTZXJ2aWNlRGVsZXRlQXJ0aWZhY3RSZXF1ZXN0KGN0eCwgc2VydmljZSwgZGF0YSwgaW50ZXJjZXB0b3JzKTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgICAgZXZlbnRzLm9uTm90Rm91bmQoKTtcbiAgICAgICAgICAgIGNvbnN0IG1zZyA9IGBubyBoYW5kbGVyIGZvdW5kYDtcbiAgICAgICAgICAgIHRocm93IG5ldyB0d2lycF90c18xLlR3aXJwRXJyb3IodHdpcnBfdHNfMS5Ud2lycEVycm9yQ29kZS5CYWRSb3V0ZSwgbXNnKTtcbiAgICB9XG59XG5mdW5jdGlvbiBoYW5kbGVBcnRpZmFjdFNlcnZpY2VDcmVhdGVBcnRpZmFjdFJlcXVlc3QoY3R4LCBzZXJ2aWNlLCBkYXRhLCBpbnRlcmNlcHRvcnMpIHtcbiAgICBzd2l0Y2ggKGN0eC5jb250ZW50VHlwZSkge1xuICAgICAgICBjYXNlIHR3aXJwX3RzXzEuVHdpcnBDb250ZW50VHlwZS5KU09OOlxuICAgICAgICAgICAgcmV0dXJuIGhhbmRsZUFydGlmYWN0U2VydmljZUNyZWF0ZUFydGlmYWN0SlNPTihjdHgsIHNlcnZpY2UsIGRhdGEsIGludGVyY2VwdG9ycyk7XG4gICAgICAgIGNhc2UgdHdpcnBfdHNfMS5Ud2lycENvbnRlbnRUeXBlLlByb3RvYnVmOlxuICAgICAgICAgICAgcmV0dXJuIGhhbmRsZUFydGlmYWN0U2VydmljZUNyZWF0ZUFydGlmYWN0UHJvdG9idWYoY3R4LCBzZXJ2aWNlLCBkYXRhLCBpbnRlcmNlcHRvcnMpO1xuICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgICAgY29uc3QgbXNnID0gXCJ1bmV4cGVjdGVkIENvbnRlbnQtVHlwZVwiO1xuICAgICAgICAgICAgdGhyb3cgbmV3IHR3aXJwX3RzXzEuVHdpcnBFcnJvcih0d2lycF90c18xLlR3aXJwRXJyb3JDb2RlLkJhZFJvdXRlLCBtc2cpO1xuICAgIH1cbn1cbmZ1bmN0aW9uIGhhbmRsZUFydGlmYWN0U2VydmljZUZpbmFsaXplQXJ0aWZhY3RSZXF1ZXN0KGN0eCwgc2VydmljZSwgZGF0YSwgaW50ZXJjZXB0b3JzKSB7XG4gICAgc3dpdGNoIChjdHguY29udGVudFR5cGUpIHtcbiAgICAgICAgY2FzZSB0d2lycF90c18xLlR3aXJwQ29udGVudFR5cGUuSlNPTjpcbiAgICAgICAgICAgIHJldHVybiBoYW5kbGVBcnRpZmFjdFNlcnZpY2VGaW5hbGl6ZUFydGlmYWN0SlNPTihjdHgsIHNlcnZpY2UsIGRhdGEsIGludGVyY2VwdG9ycyk7XG4gICAgICAgIGNhc2UgdHdpcnBfdHNfMS5Ud2lycENvbnRlbnRUeXBlLlByb3RvYnVmOlxuICAgICAgICAgICAgcmV0dXJuIGhhbmRsZUFydGlmYWN0U2VydmljZUZpbmFsaXplQXJ0aWZhY3RQcm90b2J1ZihjdHgsIHNlcnZpY2UsIGRhdGEsIGludGVyY2VwdG9ycyk7XG4gICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgICBjb25zdCBtc2cgPSBcInVuZXhwZWN0ZWQgQ29udGVudC1UeXBlXCI7XG4gICAgICAgICAgICB0aHJvdyBuZXcgdHdpcnBfdHNfMS5Ud2lycEVycm9yKHR3aXJwX3RzXzEuVHdpcnBFcnJvckNvZGUuQmFkUm91dGUsIG1zZyk7XG4gICAgfVxufVxuZnVuY3Rpb24gaGFuZGxlQXJ0aWZhY3RTZXJ2aWNlTGlzdEFydGlmYWN0c1JlcXVlc3QoY3R4LCBzZXJ2aWNlLCBkYXRhLCBpbnRlcmNlcHRvcnMpIHtcbiAgICBzd2l0Y2ggKGN0eC5jb250ZW50VHlwZSkge1xuICAgICAgICBjYXNlIHR3aXJwX3RzXzEuVHdpcnBDb250ZW50VHlwZS5KU09OOlxuICAgICAgICAgICAgcmV0dXJuIGhhbmRsZUFydGlmYWN0U2VydmljZUxpc3RBcnRpZmFjdHNKU09OKGN0eCwgc2VydmljZSwgZGF0YSwgaW50ZXJjZXB0b3JzKTtcbiAgICAgICAgY2FzZSB0d2lycF90c18xLlR3aXJwQ29udGVudFR5cGUuUHJvdG9idWY6XG4gICAgICAgICAgICByZXR1cm4gaGFuZGxlQXJ0aWZhY3RTZXJ2aWNlTGlzdEFydGlmYWN0c1Byb3RvYnVmKGN0eCwgc2VydmljZSwgZGF0YSwgaW50ZXJjZXB0b3JzKTtcbiAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICAgIGNvbnN0IG1zZyA9IFwidW5leHBlY3RlZCBDb250ZW50LVR5cGVcIjtcbiAgICAgICAgICAgIHRocm93IG5ldyB0d2lycF90c18xLlR3aXJwRXJyb3IodHdpcnBfdHNfMS5Ud2lycEVycm9yQ29kZS5CYWRSb3V0ZSwgbXNnKTtcbiAgICB9XG59XG5mdW5jdGlvbiBoYW5kbGVBcnRpZmFjdFNlcnZpY2VHZXRTaWduZWRBcnRpZmFjdFVSTFJlcXVlc3QoY3R4LCBzZXJ2aWNlLCBkYXRhLCBpbnRlcmNlcHRvcnMpIHtcbiAgICBzd2l0Y2ggKGN0eC5jb250ZW50VHlwZSkge1xuICAgICAgICBjYXNlIHR3aXJwX3RzXzEuVHdpcnBDb250ZW50VHlwZS5KU09OOlxuICAgICAgICAgICAgcmV0dXJuIGhhbmRsZUFydGlmYWN0U2VydmljZUdldFNpZ25lZEFydGlmYWN0VVJMSlNPTihjdHgsIHNlcnZpY2UsIGRhdGEsIGludGVyY2VwdG9ycyk7XG4gICAgICAgIGNhc2UgdHdpcnBfdHNfMS5Ud2lycENvbnRlbnRUeXBlLlByb3RvYnVmOlxuICAgICAgICAgICAgcmV0dXJuIGhhbmRsZUFydGlmYWN0U2VydmljZUdldFNpZ25lZEFydGlmYWN0VVJMUHJvdG9idWYoY3R4LCBzZXJ2aWNlLCBkYXRhLCBpbnRlcmNlcHRvcnMpO1xuICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgICAgY29uc3QgbXNnID0gXCJ1bmV4cGVjdGVkIENvbnRlbnQtVHlwZVwiO1xuICAgICAgICAgICAgdGhyb3cgbmV3IHR3aXJwX3RzXzEuVHdpcnBFcnJvcih0d2lycF90c18xLlR3aXJwRXJyb3JDb2RlLkJhZFJvdXRlLCBtc2cpO1xuICAgIH1cbn1cbmZ1bmN0aW9uIGhhbmRsZUFydGlmYWN0U2VydmljZURlbGV0ZUFydGlmYWN0UmVxdWVzdChjdHgsIHNlcnZpY2UsIGRhdGEsIGludGVyY2VwdG9ycykge1xuICAgIHN3aXRjaCAoY3R4LmNvbnRlbnRUeXBlKSB7XG4gICAgICAgIGNhc2UgdHdpcnBfdHNfMS5Ud2lycENvbnRlbnRUeXBlLkpTT046XG4gICAgICAgICAgICByZXR1cm4gaGFuZGxlQXJ0aWZhY3RTZXJ2aWNlRGVsZXRlQXJ0aWZhY3RKU09OKGN0eCwgc2VydmljZSwgZGF0YSwgaW50ZXJjZXB0b3JzKTtcbiAgICAgICAgY2FzZSB0d2lycF90c18xLlR3aXJwQ29udGVudFR5cGUuUHJvdG9idWY6XG4gICAgICAgICAgICByZXR1cm4gaGFuZGxlQXJ0aWZhY3RTZXJ2aWNlRGVsZXRlQXJ0aWZhY3RQcm90b2J1ZihjdHgsIHNlcnZpY2UsIGRhdGEsIGludGVyY2VwdG9ycyk7XG4gICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgICBjb25zdCBtc2cgPSBcInVuZXhwZWN0ZWQgQ29udGVudC1UeXBlXCI7XG4gICAgICAgICAgICB0aHJvdyBuZXcgdHdpcnBfdHNfMS5Ud2lycEVycm9yKHR3aXJwX3RzXzEuVHdpcnBFcnJvckNvZGUuQmFkUm91dGUsIG1zZyk7XG4gICAgfVxufVxuZnVuY3Rpb24gaGFuZGxlQXJ0aWZhY3RTZXJ2aWNlQ3JlYXRlQXJ0aWZhY3RKU09OKGN0eCwgc2VydmljZSwgZGF0YSwgaW50ZXJjZXB0b3JzKSB7XG4gICAgcmV0dXJuIF9fYXdhaXRlcih0aGlzLCB2b2lkIDAsIHZvaWQgMCwgZnVuY3Rpb24qICgpIHtcbiAgICAgICAgbGV0IHJlcXVlc3Q7XG4gICAgICAgIGxldCByZXNwb25zZTtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIGNvbnN0IGJvZHkgPSBKU09OLnBhcnNlKGRhdGEudG9TdHJpbmcoKSB8fCBcInt9XCIpO1xuICAgICAgICAgICAgcmVxdWVzdCA9IGFydGlmYWN0XzEuQ3JlYXRlQXJ0aWZhY3RSZXF1ZXN0LmZyb21Kc29uKGJvZHksIHtcbiAgICAgICAgICAgICAgICBpZ25vcmVVbmtub3duRmllbGRzOiB0cnVlLFxuICAgICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICAgICAgY2F0Y2ggKGUpIHtcbiAgICAgICAgICAgIGlmIChlIGluc3RhbmNlb2YgRXJyb3IpIHtcbiAgICAgICAgICAgICAgICBjb25zdCBtc2cgPSBcInRoZSBqc29uIHJlcXVlc3QgY291bGQgbm90IGJlIGRlY29kZWRcIjtcbiAgICAgICAgICAgICAgICB0aHJvdyBuZXcgdHdpcnBfdHNfMS5Ud2lycEVycm9yKHR3aXJwX3RzXzEuVHdpcnBFcnJvckNvZGUuTWFsZm9ybWVkLCBtc2cpLndpdGhDYXVzZShlLCB0cnVlKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBpZiAoaW50ZXJjZXB0b3JzICYmIGludGVyY2VwdG9ycy5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgICBjb25zdCBpbnRlcmNlcHRvciA9ICgwLCB0d2lycF90c18xLmNoYWluSW50ZXJjZXB0b3JzKSguLi5pbnRlcmNlcHRvcnMpO1xuICAgICAgICAgICAgcmVzcG9uc2UgPSB5aWVsZCBpbnRlcmNlcHRvcihjdHgsIHJlcXVlc3QsIChjdHgsIGlucHV0UmVxKSA9PiB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHNlcnZpY2UuQ3JlYXRlQXJ0aWZhY3QoY3R4LCBpbnB1dFJlcSk7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIHJlc3BvbnNlID0geWllbGQgc2VydmljZS5DcmVhdGVBcnRpZmFjdChjdHgsIHJlcXVlc3QpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBKU09OLnN0cmluZ2lmeShhcnRpZmFjdF8xLkNyZWF0ZUFydGlmYWN0UmVzcG9uc2UudG9Kc29uKHJlc3BvbnNlLCB7XG4gICAgICAgICAgICB1c2VQcm90b0ZpZWxkTmFtZTogdHJ1ZSxcbiAgICAgICAgICAgIGVtaXREZWZhdWx0VmFsdWVzOiBmYWxzZSxcbiAgICAgICAgfSkpO1xuICAgIH0pO1xufVxuZnVuY3Rpb24gaGFuZGxlQXJ0aWZhY3RTZXJ2aWNlRmluYWxpemVBcnRpZmFjdEpTT04oY3R4LCBzZXJ2aWNlLCBkYXRhLCBpbnRlcmNlcHRvcnMpIHtcbiAgICByZXR1cm4gX19hd2FpdGVyKHRoaXMsIHZvaWQgMCwgdm9pZCAwLCBmdW5jdGlvbiogKCkge1xuICAgICAgICBsZXQgcmVxdWVzdDtcbiAgICAgICAgbGV0IHJlc3BvbnNlO1xuICAgICAgICB0cnkge1xuICAgICAgICAgICAgY29uc3QgYm9keSA9IEpTT04ucGFyc2UoZGF0YS50b1N0cmluZygpIHx8IFwie31cIik7XG4gICAgICAgICAgICByZXF1ZXN0ID0gYXJ0aWZhY3RfMS5GaW5hbGl6ZUFydGlmYWN0UmVxdWVzdC5mcm9tSnNvbihib2R5LCB7XG4gICAgICAgICAgICAgICAgaWdub3JlVW5rbm93bkZpZWxkczogdHJ1ZSxcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgICAgIGNhdGNoIChlKSB7XG4gICAgICAgICAgICBpZiAoZSBpbnN0YW5jZW9mIEVycm9yKSB7XG4gICAgICAgICAgICAgICAgY29uc3QgbXNnID0gXCJ0aGUganNvbiByZXF1ZXN0IGNvdWxkIG5vdCBiZSBkZWNvZGVkXCI7XG4gICAgICAgICAgICAgICAgdGhyb3cgbmV3IHR3aXJwX3RzXzEuVHdpcnBFcnJvcih0d2lycF90c18xLlR3aXJwRXJyb3JDb2RlLk1hbGZvcm1lZCwgbXNnKS53aXRoQ2F1c2UoZSwgdHJ1ZSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGludGVyY2VwdG9ycyAmJiBpbnRlcmNlcHRvcnMubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgY29uc3QgaW50ZXJjZXB0b3IgPSAoMCwgdHdpcnBfdHNfMS5jaGFpbkludGVyY2VwdG9ycykoLi4uaW50ZXJjZXB0b3JzKTtcbiAgICAgICAgICAgIHJlc3BvbnNlID0geWllbGQgaW50ZXJjZXB0b3IoY3R4LCByZXF1ZXN0LCAoY3R4LCBpbnB1dFJlcSkgPT4ge1xuICAgICAgICAgICAgICAgIHJldHVybiBzZXJ2aWNlLkZpbmFsaXplQXJ0aWZhY3QoY3R4LCBpbnB1dFJlcSk7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIHJlc3BvbnNlID0geWllbGQgc2VydmljZS5GaW5hbGl6ZUFydGlmYWN0KGN0eCwgcmVxdWVzdCk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIEpTT04uc3RyaW5naWZ5KGFydGlmYWN0XzEuRmluYWxpemVBcnRpZmFjdFJlc3BvbnNlLnRvSnNvbihyZXNwb25zZSwge1xuICAgICAgICAgICAgdXNlUHJvdG9GaWVsZE5hbWU6IHRydWUsXG4gICAgICAgICAgICBlbWl0RGVmYXVsdFZhbHVlczogZmFsc2UsXG4gICAgICAgIH0pKTtcbiAgICB9KTtcbn1cbmZ1bmN0aW9uIGhhbmRsZUFydGlmYWN0U2VydmljZUxpc3RBcnRpZmFjdHNKU09OKGN0eCwgc2VydmljZSwgZGF0YSwgaW50ZXJjZXB0b3JzKSB7XG4gICAgcmV0dXJuIF9fYXdhaXRlcih0aGlzLCB2b2lkIDAsIHZvaWQgMCwgZnVuY3Rpb24qICgpIHtcbiAgICAgICAgbGV0IHJlcXVlc3Q7XG4gICAgICAgIGxldCByZXNwb25zZTtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIGNvbnN0IGJvZHkgPSBKU09OLnBhcnNlKGRhdGEudG9TdHJpbmcoKSB8fCBcInt9XCIpO1xuICAgICAgICAgICAgcmVxdWVzdCA9IGFydGlmYWN0XzEuTGlzdEFydGlmYWN0c1JlcXVlc3QuZnJvbUpzb24oYm9keSwge1xuICAgICAgICAgICAgICAgIGlnbm9yZVVua25vd25GaWVsZHM6IHRydWUsXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgICAgICBjYXRjaCAoZSkge1xuICAgICAgICAgICAgaWYgKGUgaW5zdGFuY2VvZiBFcnJvcikge1xuICAgICAgICAgICAgICAgIGNvbnN0IG1zZyA9IFwidGhlIGpzb24gcmVxdWVzdCBjb3VsZCBub3QgYmUgZGVjb2RlZFwiO1xuICAgICAgICAgICAgICAgIHRocm93IG5ldyB0d2lycF90c18xLlR3aXJwRXJyb3IodHdpcnBfdHNfMS5Ud2lycEVycm9yQ29kZS5NYWxmb3JtZWQsIG1zZykud2l0aENhdXNlKGUsIHRydWUpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGlmIChpbnRlcmNlcHRvcnMgJiYgaW50ZXJjZXB0b3JzLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgIGNvbnN0IGludGVyY2VwdG9yID0gKDAsIHR3aXJwX3RzXzEuY2hhaW5JbnRlcmNlcHRvcnMpKC4uLmludGVyY2VwdG9ycyk7XG4gICAgICAgICAgICByZXNwb25zZSA9IHlpZWxkIGludGVyY2VwdG9yKGN0eCwgcmVxdWVzdCwgKGN0eCwgaW5wdXRSZXEpID0+IHtcbiAgICAgICAgICAgICAgICByZXR1cm4gc2VydmljZS5MaXN0QXJ0aWZhY3RzKGN0eCwgaW5wdXRSZXEpO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICByZXNwb25zZSA9IHlpZWxkIHNlcnZpY2UuTGlzdEFydGlmYWN0cyhjdHgsIHJlcXVlc3QpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBKU09OLnN0cmluZ2lmeShhcnRpZmFjdF8xLkxpc3RBcnRpZmFjdHNSZXNwb25zZS50b0pzb24ocmVzcG9uc2UsIHtcbiAgICAgICAgICAgIHVzZVByb3RvRmllbGROYW1lOiB0cnVlLFxuICAgICAgICAgICAgZW1pdERlZmF1bHRWYWx1ZXM6IGZhbHNlLFxuICAgICAgICB9KSk7XG4gICAgfSk7XG59XG5mdW5jdGlvbiBoYW5kbGVBcnRpZmFjdFNlcnZpY2VHZXRTaWduZWRBcnRpZmFjdFVSTEpTT04oY3R4LCBzZXJ2aWNlLCBkYXRhLCBpbnRlcmNlcHRvcnMpIHtcbiAgICByZXR1cm4gX19hd2FpdGVyKHRoaXMsIHZvaWQgMCwgdm9pZCAwLCBmdW5jdGlvbiogKCkge1xuICAgICAgICBsZXQgcmVxdWVzdDtcbiAgICAgICAgbGV0IHJlc3BvbnNlO1xuICAgICAgICB0cnkge1xuICAgICAgICAgICAgY29uc3QgYm9keSA9IEpTT04ucGFyc2UoZGF0YS50b1N0cmluZygpIHx8IFwie31cIik7XG4gICAgICAgICAgICByZXF1ZXN0ID0gYXJ0aWZhY3RfMS5HZXRTaWduZWRBcnRpZmFjdFVSTFJlcXVlc3QuZnJvbUpzb24oYm9keSwge1xuICAgICAgICAgICAgICAgIGlnbm9yZVVua25vd25GaWVsZHM6IHRydWUsXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgICAgICBjYXRjaCAoZSkge1xuICAgICAgICAgICAgaWYgKGUgaW5zdGFuY2VvZiBFcnJvcikge1xuICAgICAgICAgICAgICAgIGNvbnN0IG1zZyA9IFwidGhlIGpzb24gcmVxdWVzdCBjb3VsZCBub3QgYmUgZGVjb2RlZFwiO1xuICAgICAgICAgICAgICAgIHRocm93IG5ldyB0d2lycF90c18xLlR3aXJwRXJyb3IodHdpcnBfdHNfMS5Ud2lycEVycm9yQ29kZS5NYWxmb3JtZWQsIG1zZykud2l0aENhdXNlKGUsIHRydWUpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGlmIChpbnRlcmNlcHRvcnMgJiYgaW50ZXJjZXB0b3JzLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgIGNvbnN0IGludGVyY2VwdG9yID0gKDAsIHR3aXJwX3RzXzEuY2hhaW5JbnRlcmNlcHRvcnMpKC4uLmludGVyY2VwdG9ycyk7XG4gICAgICAgICAgICByZXNwb25zZSA9IHlpZWxkIGludGVyY2VwdG9yKGN0eCwgcmVxdWVzdCwgKGN0eCwgaW5wdXRSZXEpID0+IHtcbiAgICAgICAgICAgICAgICByZXR1cm4gc2VydmljZS5HZXRTaWduZWRBcnRpZmFjdFVSTChjdHgsIGlucHV0UmVxKTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgcmVzcG9uc2UgPSB5aWVsZCBzZXJ2aWNlLkdldFNpZ25lZEFydGlmYWN0VVJMKGN0eCwgcmVxdWVzdCk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIEpTT04uc3RyaW5naWZ5KGFydGlmYWN0XzEuR2V0U2lnbmVkQXJ0aWZhY3RVUkxSZXNwb25zZS50b0pzb24ocmVzcG9uc2UsIHtcbiAgICAgICAgICAgIHVzZVByb3RvRmllbGROYW1lOiB0cnVlLFxuICAgICAgICAgICAgZW1pdERlZmF1bHRWYWx1ZXM6IGZhbHNlLFxuICAgICAgICB9KSk7XG4gICAgfSk7XG59XG5mdW5jdGlvbiBoYW5kbGVBcnRpZmFjdFNlcnZpY2VEZWxldGVBcnRpZmFjdEpTT04oY3R4LCBzZXJ2aWNlLCBkYXRhLCBpbnRlcmNlcHRvcnMpIHtcbiAgICByZXR1cm4gX19hd2FpdGVyKHRoaXMsIHZvaWQgMCwgdm9pZCAwLCBmdW5jdGlvbiogKCkge1xuICAgICAgICBsZXQgcmVxdWVzdDtcbiAgICAgICAgbGV0IHJlc3BvbnNlO1xuICAgICAgICB0cnkge1xuICAgICAgICAgICAgY29uc3QgYm9keSA9IEpTT04ucGFyc2UoZGF0YS50b1N0cmluZygpIHx8IFwie31cIik7XG4gICAgICAgICAgICByZXF1ZXN0ID0gYXJ0aWZhY3RfMS5EZWxldGVBcnRpZmFjdFJlcXVlc3QuZnJvbUpzb24oYm9keSwge1xuICAgICAgICAgICAgICAgIGlnbm9yZVVua25vd25GaWVsZHM6IHRydWUsXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgICAgICBjYXRjaCAoZSkge1xuICAgICAgICAgICAgaWYgKGUgaW5zdGFuY2VvZiBFcnJvcikge1xuICAgICAgICAgICAgICAgIGNvbnN0IG1zZyA9IFwidGhlIGpzb24gcmVxdWVzdCBjb3VsZCBub3QgYmUgZGVjb2RlZFwiO1xuICAgICAgICAgICAgICAgIHRocm93IG5ldyB0d2lycF90c18xLlR3aXJwRXJyb3IodHdpcnBfdHNfMS5Ud2lycEVycm9yQ29kZS5NYWxmb3JtZWQsIG1zZykud2l0aENhdXNlKGUsIHRydWUpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGlmIChpbnRlcmNlcHRvcnMgJiYgaW50ZXJjZXB0b3JzLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgIGNvbnN0IGludGVyY2VwdG9yID0gKDAsIHR3aXJwX3RzXzEuY2hhaW5JbnRlcmNlcHRvcnMpKC4uLmludGVyY2VwdG9ycyk7XG4gICAgICAgICAgICByZXNwb25zZSA9IHlpZWxkIGludGVyY2VwdG9yKGN0eCwgcmVxdWVzdCwgKGN0eCwgaW5wdXRSZXEpID0+IHtcbiAgICAgICAgICAgICAgICByZXR1cm4gc2VydmljZS5EZWxldGVBcnRpZmFjdChjdHgsIGlucHV0UmVxKTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgcmVzcG9uc2UgPSB5aWVsZCBzZXJ2aWNlLkRlbGV0ZUFydGlmYWN0KGN0eCwgcmVxdWVzdCk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIEpTT04uc3RyaW5naWZ5KGFydGlmYWN0XzEuRGVsZXRlQXJ0aWZhY3RSZXNwb25zZS50b0pzb24ocmVzcG9uc2UsIHtcbiAgICAgICAgICAgIHVzZVByb3RvRmllbGROYW1lOiB0cnVlLFxuICAgICAgICAgICAgZW1pdERlZmF1bHRWYWx1ZXM6IGZhbHNlLFxuICAgICAgICB9KSk7XG4gICAgfSk7XG59XG5mdW5jdGlvbiBoYW5kbGVBcnRpZmFjdFNlcnZpY2VDcmVhdGVBcnRpZmFjdFByb3RvYnVmKGN0eCwgc2VydmljZSwgZGF0YSwgaW50ZXJjZXB0b3JzKSB7XG4gICAgcmV0dXJuIF9fYXdhaXRlcih0aGlzLCB2b2lkIDAsIHZvaWQgMCwgZnVuY3Rpb24qICgpIHtcbiAgICAgICAgbGV0IHJlcXVlc3Q7XG4gICAgICAgIGxldCByZXNwb25zZTtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIHJlcXVlc3QgPSBhcnRpZmFjdF8xLkNyZWF0ZUFydGlmYWN0UmVxdWVzdC5mcm9tQmluYXJ5KGRhdGEpO1xuICAgICAgICB9XG4gICAgICAgIGNhdGNoIChlKSB7XG4gICAgICAgICAgICBpZiAoZSBpbnN0YW5jZW9mIEVycm9yKSB7XG4gICAgICAgICAgICAgICAgY29uc3QgbXNnID0gXCJ0aGUgcHJvdG9idWYgcmVxdWVzdCBjb3VsZCBub3QgYmUgZGVjb2RlZFwiO1xuICAgICAgICAgICAgICAgIHRocm93IG5ldyB0d2lycF90c18xLlR3aXJwRXJyb3IodHdpcnBfdHNfMS5Ud2lycEVycm9yQ29kZS5NYWxmb3JtZWQsIG1zZykud2l0aENhdXNlKGUsIHRydWUpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGlmIChpbnRlcmNlcHRvcnMgJiYgaW50ZXJjZXB0b3JzLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgIGNvbnN0IGludGVyY2VwdG9yID0gKDAsIHR3aXJwX3RzXzEuY2hhaW5JbnRlcmNlcHRvcnMpKC4uLmludGVyY2VwdG9ycyk7XG4gICAgICAgICAgICByZXNwb25zZSA9IHlpZWxkIGludGVyY2VwdG9yKGN0eCwgcmVxdWVzdCwgKGN0eCwgaW5wdXRSZXEpID0+IHtcbiAgICAgICAgICAgICAgICByZXR1cm4gc2VydmljZS5DcmVhdGVBcnRpZmFjdChjdHgsIGlucHV0UmVxKTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgcmVzcG9uc2UgPSB5aWVsZCBzZXJ2aWNlLkNyZWF0ZUFydGlmYWN0KGN0eCwgcmVxdWVzdCk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIEJ1ZmZlci5mcm9tKGFydGlmYWN0XzEuQ3JlYXRlQXJ0aWZhY3RSZXNwb25zZS50b0JpbmFyeShyZXNwb25zZSkpO1xuICAgIH0pO1xufVxuZnVuY3Rpb24gaGFuZGxlQXJ0aWZhY3RTZXJ2aWNlRmluYWxpemVBcnRpZmFjdFByb3RvYnVmKGN0eCwgc2VydmljZSwgZGF0YSwgaW50ZXJjZXB0b3JzKSB7XG4gICAgcmV0dXJuIF9fYXdhaXRlcih0aGlzLCB2b2lkIDAsIHZvaWQgMCwgZnVuY3Rpb24qICgpIHtcbiAgICAgICAgbGV0IHJlcXVlc3Q7XG4gICAgICAgIGxldCByZXNwb25zZTtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIHJlcXVlc3QgPSBhcnRpZmFjdF8xLkZpbmFsaXplQXJ0aWZhY3RSZXF1ZXN0LmZyb21CaW5hcnkoZGF0YSk7XG4gICAgICAgIH1cbiAgICAgICAgY2F0Y2ggKGUpIHtcbiAgICAgICAgICAgIGlmIChlIGluc3RhbmNlb2YgRXJyb3IpIHtcbiAgICAgICAgICAgICAgICBjb25zdCBtc2cgPSBcInRoZSBwcm90b2J1ZiByZXF1ZXN0IGNvdWxkIG5vdCBiZSBkZWNvZGVkXCI7XG4gICAgICAgICAgICAgICAgdGhyb3cgbmV3IHR3aXJwX3RzXzEuVHdpcnBFcnJvcih0d2lycF90c18xLlR3aXJwRXJyb3JDb2RlLk1hbGZvcm1lZCwgbXNnKS53aXRoQ2F1c2UoZSwgdHJ1ZSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGludGVyY2VwdG9ycyAmJiBpbnRlcmNlcHRvcnMubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgY29uc3QgaW50ZXJjZXB0b3IgPSAoMCwgdHdpcnBfdHNfMS5jaGFpbkludGVyY2VwdG9ycykoLi4uaW50ZXJjZXB0b3JzKTtcbiAgICAgICAgICAgIHJlc3BvbnNlID0geWllbGQgaW50ZXJjZXB0b3IoY3R4LCByZXF1ZXN0LCAoY3R4LCBpbnB1dFJlcSkgPT4ge1xuICAgICAgICAgICAgICAgIHJldHVybiBzZXJ2aWNlLkZpbmFsaXplQXJ0aWZhY3QoY3R4LCBpbnB1dFJlcSk7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIHJlc3BvbnNlID0geWllbGQgc2VydmljZS5GaW5hbGl6ZUFydGlmYWN0KGN0eCwgcmVxdWVzdCk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIEJ1ZmZlci5mcm9tKGFydGlmYWN0XzEuRmluYWxpemVBcnRpZmFjdFJlc3BvbnNlLnRvQmluYXJ5KHJlc3BvbnNlKSk7XG4gICAgfSk7XG59XG5mdW5jdGlvbiBoYW5kbGVBcnRpZmFjdFNlcnZpY2VMaXN0QXJ0aWZhY3RzUHJvdG9idWYoY3R4LCBzZXJ2aWNlLCBkYXRhLCBpbnRlcmNlcHRvcnMpIHtcbiAgICByZXR1cm4gX19hd2FpdGVyKHRoaXMsIHZvaWQgMCwgdm9pZCAwLCBmdW5jdGlvbiogKCkge1xuICAgICAgICBsZXQgcmVxdWVzdDtcbiAgICAgICAgbGV0IHJlc3BvbnNlO1xuICAgICAgICB0cnkge1xuICAgICAgICAgICAgcmVxdWVzdCA9IGFydGlmYWN0XzEuTGlzdEFydGlmYWN0c1JlcXVlc3QuZnJvbUJpbmFyeShkYXRhKTtcbiAgICAgICAgfVxuICAgICAgICBjYXRjaCAoZSkge1xuICAgICAgICAgICAgaWYgKGUgaW5zdGFuY2VvZiBFcnJvcikge1xuICAgICAgICAgICAgICAgIGNvbnN0IG1zZyA9IFwidGhlIHByb3RvYnVmIHJlcXVlc3QgY291bGQgbm90IGJlIGRlY29kZWRcIjtcbiAgICAgICAgICAgICAgICB0aHJvdyBuZXcgdHdpcnBfdHNfMS5Ud2lycEVycm9yKHR3aXJwX3RzXzEuVHdpcnBFcnJvckNvZGUuTWFsZm9ybWVkLCBtc2cpLndpdGhDYXVzZShlLCB0cnVlKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBpZiAoaW50ZXJjZXB0b3JzICYmIGludGVyY2VwdG9ycy5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgICBjb25zdCBpbnRlcmNlcHRvciA9ICgwLCB0d2lycF90c18xLmNoYWluSW50ZXJjZXB0b3JzKSguLi5pbnRlcmNlcHRvcnMpO1xuICAgICAgICAgICAgcmVzcG9uc2UgPSB5aWVsZCBpbnRlcmNlcHRvcihjdHgsIHJlcXVlc3QsIChjdHgsIGlucHV0UmVxKSA9PiB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHNlcnZpY2UuTGlzdEFydGlmYWN0cyhjdHgsIGlucHV0UmVxKTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgcmVzcG9uc2UgPSB5aWVsZCBzZXJ2aWNlLkxpc3RBcnRpZmFjdHMoY3R4LCByZXF1ZXN0KTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gQnVmZmVyLmZyb20oYXJ0aWZhY3RfMS5MaXN0QXJ0aWZhY3RzUmVzcG9uc2UudG9CaW5hcnkocmVzcG9uc2UpKTtcbiAgICB9KTtcbn1cbmZ1bmN0aW9uIGhhbmRsZUFydGlmYWN0U2VydmljZUdldFNpZ25lZEFydGlmYWN0VVJMUHJvdG9idWYoY3R4LCBzZXJ2aWNlLCBkYXRhLCBpbnRlcmNlcHRvcnMpIHtcbiAgICByZXR1cm4gX19hd2FpdGVyKHRoaXMsIHZvaWQgMCwgdm9pZCAwLCBmdW5jdGlvbiogKCkge1xuICAgICAgICBsZXQgcmVxdWVzdDtcbiAgICAgICAgbGV0IHJlc3BvbnNlO1xuICAgICAgICB0cnkge1xuICAgICAgICAgICAgcmVxdWVzdCA9IGFydGlmYWN0XzEuR2V0U2lnbmVkQXJ0aWZhY3RVUkxSZXF1ZXN0LmZyb21CaW5hcnkoZGF0YSk7XG4gICAgICAgIH1cbiAgICAgICAgY2F0Y2ggKGUpIHtcbiAgICAgICAgICAgIGlmIChlIGluc3RhbmNlb2YgRXJyb3IpIHtcbiAgICAgICAgICAgICAgICBjb25zdCBtc2cgPSBcInRoZSBwcm90b2J1ZiByZXF1ZXN0IGNvdWxkIG5vdCBiZSBkZWNvZGVkXCI7XG4gICAgICAgICAgICAgICAgdGhyb3cgbmV3IHR3aXJwX3RzXzEuVHdpcnBFcnJvcih0d2lycF90c18xLlR3aXJwRXJyb3JDb2RlLk1hbGZvcm1lZCwgbXNnKS53aXRoQ2F1c2UoZSwgdHJ1ZSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGludGVyY2VwdG9ycyAmJiBpbnRlcmNlcHRvcnMubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgY29uc3QgaW50ZXJjZXB0b3IgPSAoMCwgdHdpcnBfdHNfMS5jaGFpbkludGVyY2VwdG9ycykoLi4uaW50ZXJjZXB0b3JzKTtcbiAgICAgICAgICAgIHJlc3BvbnNlID0geWllbGQgaW50ZXJjZXB0b3IoY3R4LCByZXF1ZXN0LCAoY3R4LCBpbnB1dFJlcSkgPT4ge1xuICAgICAgICAgICAgICAgIHJldHVybiBzZXJ2aWNlLkdldFNpZ25lZEFydGlmYWN0VVJMKGN0eCwgaW5wdXRSZXEpO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICByZXNwb25zZSA9IHlpZWxkIHNlcnZpY2UuR2V0U2lnbmVkQXJ0aWZhY3RVUkwoY3R4LCByZXF1ZXN0KTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gQnVmZmVyLmZyb20oYXJ0aWZhY3RfMS5HZXRTaWduZWRBcnRpZmFjdFVSTFJlc3BvbnNlLnRvQmluYXJ5KHJlc3BvbnNlKSk7XG4gICAgfSk7XG59XG5mdW5jdGlvbiBoYW5kbGVBcnRpZmFjdFNlcnZpY2VEZWxldGVBcnRpZmFjdFByb3RvYnVmKGN0eCwgc2VydmljZSwgZGF0YSwgaW50ZXJjZXB0b3JzKSB7XG4gICAgcmV0dXJuIF9fYXdhaXRlcih0aGlzLCB2b2lkIDAsIHZvaWQgMCwgZnVuY3Rpb24qICgpIHtcbiAgICAgICAgbGV0IHJlcXVlc3Q7XG4gICAgICAgIGxldCByZXNwb25zZTtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIHJlcXVlc3QgPSBhcnRpZmFjdF8xLkRlbGV0ZUFydGlmYWN0UmVxdWVzdC5mcm9tQmluYXJ5KGRhdGEpO1xuICAgICAgICB9XG4gICAgICAgIGNhdGNoIChlKSB7XG4gICAgICAgICAgICBpZiAoZSBpbnN0YW5jZW9mIEVycm9yKSB7XG4gICAgICAgICAgICAgICAgY29uc3QgbXNnID0gXCJ0aGUgcHJvdG9idWYgcmVxdWVzdCBjb3VsZCBub3QgYmUgZGVjb2RlZFwiO1xuICAgICAgICAgICAgICAgIHRocm93IG5ldyB0d2lycF90c18xLlR3aXJwRXJyb3IodHdpcnBfdHNfMS5Ud2lycEVycm9yQ29kZS5NYWxmb3JtZWQsIG1zZykud2l0aENhdXNlKGUsIHRydWUpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGlmIChpbnRlcmNlcHRvcnMgJiYgaW50ZXJjZXB0b3JzLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgIGNvbnN0IGludGVyY2VwdG9yID0gKDAsIHR3aXJwX3RzXzEuY2hhaW5JbnRlcmNlcHRvcnMpKC4uLmludGVyY2VwdG9ycyk7XG4gICAgICAgICAgICByZXNwb25zZSA9IHlpZWxkIGludGVyY2VwdG9yKGN0eCwgcmVxdWVzdCwgKGN0eCwgaW5wdXRSZXEpID0+IHtcbiAgICAgICAgICAgICAgICByZXR1cm4gc2VydmljZS5EZWxldGVBcnRpZmFjdChjdHgsIGlucHV0UmVxKTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgcmVzcG9uc2UgPSB5aWVsZCBzZXJ2aWNlLkRlbGV0ZUFydGlmYWN0KGN0eCwgcmVxdWVzdCk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIEJ1ZmZlci5mcm9tKGFydGlmYWN0XzEuRGVsZXRlQXJ0aWZhY3RSZXNwb25zZS50b0JpbmFyeShyZXNwb25zZSkpO1xuICAgIH0pO1xufVxuLy8jIHNvdXJjZU1hcHBpbmdVUkw9YXJ0aWZhY3QudHdpcnAuanMubWFwIiwKICAgICJcInVzZSBzdHJpY3RcIjtcbnZhciBfX2NyZWF0ZUJpbmRpbmcgPSAodGhpcyAmJiB0aGlzLl9fY3JlYXRlQmluZGluZykgfHwgKE9iamVjdC5jcmVhdGUgPyAoZnVuY3Rpb24obywgbSwgaywgazIpIHtcbiAgICBpZiAoazIgPT09IHVuZGVmaW5lZCkgazIgPSBrO1xuICAgIHZhciBkZXNjID0gT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcihtLCBrKTtcbiAgICBpZiAoIWRlc2MgfHwgKFwiZ2V0XCIgaW4gZGVzYyA/ICFtLl9fZXNNb2R1bGUgOiBkZXNjLndyaXRhYmxlIHx8IGRlc2MuY29uZmlndXJhYmxlKSkge1xuICAgICAgZGVzYyA9IHsgZW51bWVyYWJsZTogdHJ1ZSwgZ2V0OiBmdW5jdGlvbigpIHsgcmV0dXJuIG1ba107IH0gfTtcbiAgICB9XG4gICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KG8sIGsyLCBkZXNjKTtcbn0pIDogKGZ1bmN0aW9uKG8sIG0sIGssIGsyKSB7XG4gICAgaWYgKGsyID09PSB1bmRlZmluZWQpIGsyID0gaztcbiAgICBvW2syXSA9IG1ba107XG59KSk7XG52YXIgX19leHBvcnRTdGFyID0gKHRoaXMgJiYgdGhpcy5fX2V4cG9ydFN0YXIpIHx8IGZ1bmN0aW9uKG0sIGV4cG9ydHMpIHtcbiAgICBmb3IgKHZhciBwIGluIG0pIGlmIChwICE9PSBcImRlZmF1bHRcIiAmJiAhT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKGV4cG9ydHMsIHApKSBfX2NyZWF0ZUJpbmRpbmcoZXhwb3J0cywgbSwgcCk7XG59O1xuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiX19lc01vZHVsZVwiLCB7IHZhbHVlOiB0cnVlIH0pO1xuX19leHBvcnRTdGFyKHJlcXVpcmUoXCIuL2dvb2dsZS9wcm90b2J1Zi90aW1lc3RhbXBcIiksIGV4cG9ydHMpO1xuX19leHBvcnRTdGFyKHJlcXVpcmUoXCIuL2dvb2dsZS9wcm90b2J1Zi93cmFwcGVyc1wiKSwgZXhwb3J0cyk7XG5fX2V4cG9ydFN0YXIocmVxdWlyZShcIi4vcmVzdWx0cy9hcGkvdjEvYXJ0aWZhY3RcIiksIGV4cG9ydHMpO1xuX19leHBvcnRTdGFyKHJlcXVpcmUoXCIuL3Jlc3VsdHMvYXBpL3YxL2FydGlmYWN0LnR3aXJwXCIpLCBleHBvcnRzKTtcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPWluZGV4LmpzLm1hcCIsCiAgICAiXCJ1c2Ugc3RyaWN0XCI7XG52YXIgX19jcmVhdGVCaW5kaW5nID0gKHRoaXMgJiYgdGhpcy5fX2NyZWF0ZUJpbmRpbmcpIHx8IChPYmplY3QuY3JlYXRlID8gKGZ1bmN0aW9uKG8sIG0sIGssIGsyKSB7XG4gICAgaWYgKGsyID09PSB1bmRlZmluZWQpIGsyID0gaztcbiAgICB2YXIgZGVzYyA9IE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IobSwgayk7XG4gICAgaWYgKCFkZXNjIHx8IChcImdldFwiIGluIGRlc2MgPyAhbS5fX2VzTW9kdWxlIDogZGVzYy53cml0YWJsZSB8fCBkZXNjLmNvbmZpZ3VyYWJsZSkpIHtcbiAgICAgIGRlc2MgPSB7IGVudW1lcmFibGU6IHRydWUsIGdldDogZnVuY3Rpb24oKSB7IHJldHVybiBtW2tdOyB9IH07XG4gICAgfVxuICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShvLCBrMiwgZGVzYyk7XG59KSA6IChmdW5jdGlvbihvLCBtLCBrLCBrMikge1xuICAgIGlmIChrMiA9PT0gdW5kZWZpbmVkKSBrMiA9IGs7XG4gICAgb1trMl0gPSBtW2tdO1xufSkpO1xudmFyIF9fc2V0TW9kdWxlRGVmYXVsdCA9ICh0aGlzICYmIHRoaXMuX19zZXRNb2R1bGVEZWZhdWx0KSB8fCAoT2JqZWN0LmNyZWF0ZSA/IChmdW5jdGlvbihvLCB2KSB7XG4gICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KG8sIFwiZGVmYXVsdFwiLCB7IGVudW1lcmFibGU6IHRydWUsIHZhbHVlOiB2IH0pO1xufSkgOiBmdW5jdGlvbihvLCB2KSB7XG4gICAgb1tcImRlZmF1bHRcIl0gPSB2O1xufSk7XG52YXIgX19pbXBvcnRTdGFyID0gKHRoaXMgJiYgdGhpcy5fX2ltcG9ydFN0YXIpIHx8IGZ1bmN0aW9uIChtb2QpIHtcbiAgICBpZiAobW9kICYmIG1vZC5fX2VzTW9kdWxlKSByZXR1cm4gbW9kO1xuICAgIHZhciByZXN1bHQgPSB7fTtcbiAgICBpZiAobW9kICE9IG51bGwpIGZvciAodmFyIGsgaW4gbW9kKSBpZiAoayAhPT0gXCJkZWZhdWx0XCIgJiYgT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKG1vZCwgaykpIF9fY3JlYXRlQmluZGluZyhyZXN1bHQsIG1vZCwgayk7XG4gICAgX19zZXRNb2R1bGVEZWZhdWx0KHJlc3VsdCwgbW9kKTtcbiAgICByZXR1cm4gcmVzdWx0O1xufTtcbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIl9fZXNNb2R1bGVcIiwgeyB2YWx1ZTogdHJ1ZSB9KTtcbmV4cG9ydHMuZ2V0RXhwaXJhdGlvbiA9IHZvaWQgMDtcbmNvbnN0IGdlbmVyYXRlZF8xID0gcmVxdWlyZShcIi4uLy4uL2dlbmVyYXRlZFwiKTtcbmNvbnN0IGNvcmUgPSBfX2ltcG9ydFN0YXIocmVxdWlyZShcIkBhY3Rpb25zL2NvcmVcIikpO1xuZnVuY3Rpb24gZ2V0RXhwaXJhdGlvbihyZXRlbnRpb25EYXlzKSB7XG4gICAgaWYgKCFyZXRlbnRpb25EYXlzKSB7XG4gICAgICAgIHJldHVybiB1bmRlZmluZWQ7XG4gICAgfVxuICAgIGNvbnN0IG1heFJldGVudGlvbkRheXMgPSBnZXRSZXRlbnRpb25EYXlzKCk7XG4gICAgaWYgKG1heFJldGVudGlvbkRheXMgJiYgbWF4UmV0ZW50aW9uRGF5cyA8IHJldGVudGlvbkRheXMpIHtcbiAgICAgICAgY29yZS53YXJuaW5nKGBSZXRlbnRpb24gZGF5cyBjYW5ub3QgYmUgZ3JlYXRlciB0aGFuIHRoZSBtYXhpbXVtIGFsbG93ZWQgcmV0ZW50aW9uIHNldCB3aXRoaW4gdGhlIHJlcG9zaXRvcnkuIFVzaW5nICR7bWF4UmV0ZW50aW9uRGF5c30gaW5zdGVhZC5gKTtcbiAgICAgICAgcmV0ZW50aW9uRGF5cyA9IG1heFJldGVudGlvbkRheXM7XG4gICAgfVxuICAgIGNvbnN0IGV4cGlyYXRpb25EYXRlID0gbmV3IERhdGUoKTtcbiAgICBleHBpcmF0aW9uRGF0ZS5zZXREYXRlKGV4cGlyYXRpb25EYXRlLmdldERhdGUoKSArIHJldGVudGlvbkRheXMpO1xuICAgIHJldHVybiBnZW5lcmF0ZWRfMS5UaW1lc3RhbXAuZnJvbURhdGUoZXhwaXJhdGlvbkRhdGUpO1xufVxuZXhwb3J0cy5nZXRFeHBpcmF0aW9uID0gZ2V0RXhwaXJhdGlvbjtcbmZ1bmN0aW9uIGdldFJldGVudGlvbkRheXMoKSB7XG4gICAgY29uc3QgcmV0ZW50aW9uRGF5cyA9IHByb2Nlc3MuZW52WydHSVRIVUJfUkVURU5USU9OX0RBWVMnXTtcbiAgICBpZiAoIXJldGVudGlvbkRheXMpIHtcbiAgICAgICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICB9XG4gICAgY29uc3QgZGF5cyA9IHBhcnNlSW50KHJldGVudGlvbkRheXMpO1xuICAgIGlmIChpc05hTihkYXlzKSkge1xuICAgICAgICByZXR1cm4gdW5kZWZpbmVkO1xuICAgIH1cbiAgICByZXR1cm4gZGF5cztcbn1cbi8vIyBzb3VyY2VNYXBwaW5nVVJMPXJldGVudGlvbi5qcy5tYXAiLAogICAgIlwidXNlIHN0cmljdFwiO1xuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiX19lc01vZHVsZVwiLCB7IHZhbHVlOiB0cnVlIH0pO1xuZXhwb3J0cy52YWxpZGF0ZUZpbGVQYXRoID0gZXhwb3J0cy52YWxpZGF0ZUFydGlmYWN0TmFtZSA9IHZvaWQgMDtcbmNvbnN0IGNvcmVfMSA9IHJlcXVpcmUoXCJAYWN0aW9ucy9jb3JlXCIpO1xuLyoqXG4gKiBJbnZhbGlkIGNoYXJhY3RlcnMgdGhhdCBjYW5ub3QgYmUgaW4gdGhlIGFydGlmYWN0IG5hbWUgb3IgYW4gdXBsb2FkZWQgZmlsZS4gV2lsbCBiZSByZWplY3RlZFxuICogZnJvbSB0aGUgc2VydmVyIGlmIGF0dGVtcHRlZCB0byBiZSBzZW50IG92ZXIuIFRoZXNlIGNoYXJhY3RlcnMgYXJlIG5vdCBhbGxvd2VkIGR1ZSB0byBsaW1pdGF0aW9ucyB3aXRoIGNlcnRhaW5cbiAqIGZpbGUgc3lzdGVtcyBzdWNoIGFzIE5URlMuIFRvIG1haW50YWluIHBsYXRmb3JtLWFnbm9zdGljIGJlaGF2aW9yLCBhbGwgY2hhcmFjdGVycyB0aGF0IGFyZSBub3Qgc3VwcG9ydGVkIGJ5IGFuXG4gKiBpbmRpdmlkdWFsIGZpbGVzeXN0ZW0vcGxhdGZvcm0gd2lsbCBub3QgYmUgc3VwcG9ydGVkIG9uIGFsbCBmaWxlU3lzdGVtcy9wbGF0Zm9ybXNcbiAqXG4gKiBGaWxlUGF0aHMgY2FuIGluY2x1ZGUgY2hhcmFjdGVycyBzdWNoIGFzIFxcIGFuZCAvIHdoaWNoIGFyZSBub3QgcGVybWl0dGVkIGluIHRoZSBhcnRpZmFjdCBuYW1lIGFsb25lXG4gKi9cbmNvbnN0IGludmFsaWRBcnRpZmFjdEZpbGVQYXRoQ2hhcmFjdGVycyA9IG5ldyBNYXAoW1xuICAgIFsnXCInLCAnIERvdWJsZSBxdW90ZSBcIiddLFxuICAgIFsnOicsICcgQ29sb24gOiddLFxuICAgIFsnPCcsICcgTGVzcyB0aGFuIDwnXSxcbiAgICBbJz4nLCAnIEdyZWF0ZXIgdGhhbiA+J10sXG4gICAgWyd8JywgJyBWZXJ0aWNhbCBiYXIgfCddLFxuICAgIFsnKicsICcgQXN0ZXJpc2sgKiddLFxuICAgIFsnPycsICcgUXVlc3Rpb24gbWFyayA/J10sXG4gICAgWydcXHInLCAnIENhcnJpYWdlIHJldHVybiBcXFxcciddLFxuICAgIFsnXFxuJywgJyBMaW5lIGZlZWQgXFxcXG4nXVxuXSk7XG5jb25zdCBpbnZhbGlkQXJ0aWZhY3ROYW1lQ2hhcmFjdGVycyA9IG5ldyBNYXAoW1xuICAgIC4uLmludmFsaWRBcnRpZmFjdEZpbGVQYXRoQ2hhcmFjdGVycyxcbiAgICBbJ1xcXFwnLCAnIEJhY2tzbGFzaCBcXFxcJ10sXG4gICAgWycvJywgJyBGb3J3YXJkIHNsYXNoIC8nXVxuXSk7XG4vKipcbiAqIFZhbGlkYXRlcyB0aGUgbmFtZSBvZiB0aGUgYXJ0aWZhY3QgdG8gY2hlY2sgdG8gbWFrZSBzdXJlIHRoZXJlIGFyZSBubyBpbGxlZ2FsIGNoYXJhY3RlcnNcbiAqL1xuZnVuY3Rpb24gdmFsaWRhdGVBcnRpZmFjdE5hbWUobmFtZSkge1xuICAgIGlmICghbmFtZSkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYFByb3ZpZGVkIGFydGlmYWN0IG5hbWUgaW5wdXQgZHVyaW5nIHZhbGlkYXRpb24gaXMgZW1wdHlgKTtcbiAgICB9XG4gICAgZm9yIChjb25zdCBbaW52YWxpZENoYXJhY3RlcktleSwgZXJyb3JNZXNzYWdlRm9yQ2hhcmFjdGVyXSBvZiBpbnZhbGlkQXJ0aWZhY3ROYW1lQ2hhcmFjdGVycykge1xuICAgICAgICBpZiAobmFtZS5pbmNsdWRlcyhpbnZhbGlkQ2hhcmFjdGVyS2V5KSkge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBUaGUgYXJ0aWZhY3QgbmFtZSBpcyBub3QgdmFsaWQ6ICR7bmFtZX0uIENvbnRhaW5zIHRoZSBmb2xsb3dpbmcgY2hhcmFjdGVyOiAke2Vycm9yTWVzc2FnZUZvckNoYXJhY3Rlcn1cbiAgICAgICAgICBcbkludmFsaWQgY2hhcmFjdGVycyBpbmNsdWRlOiAke0FycmF5LmZyb20oaW52YWxpZEFydGlmYWN0TmFtZUNoYXJhY3RlcnMudmFsdWVzKCkpLnRvU3RyaW5nKCl9XG4gICAgICAgICAgXG5UaGVzZSBjaGFyYWN0ZXJzIGFyZSBub3QgYWxsb3dlZCBpbiB0aGUgYXJ0aWZhY3QgbmFtZSBkdWUgdG8gbGltaXRhdGlvbnMgd2l0aCBjZXJ0YWluIGZpbGUgc3lzdGVtcyBzdWNoIGFzIE5URlMuIFRvIG1haW50YWluIGZpbGUgc3lzdGVtIGFnbm9zdGljIGJlaGF2aW9yLCB0aGVzZSBjaGFyYWN0ZXJzIGFyZSBpbnRlbnRpb25hbGx5IG5vdCBhbGxvd2VkIHRvIHByZXZlbnQgcG90ZW50aWFsIHByb2JsZW1zIHdpdGggZG93bmxvYWRzIG9uIGRpZmZlcmVudCBmaWxlIHN5c3RlbXMuYCk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgKDAsIGNvcmVfMS5pbmZvKShgQXJ0aWZhY3QgbmFtZSBpcyB2YWxpZCFgKTtcbn1cbmV4cG9ydHMudmFsaWRhdGVBcnRpZmFjdE5hbWUgPSB2YWxpZGF0ZUFydGlmYWN0TmFtZTtcbi8qKlxuICogVmFsaWRhdGVzIGZpbGUgcGF0aHMgdG8gY2hlY2sgZm9yIGFueSBpbGxlZ2FsIGNoYXJhY3RlcnMgdGhhdCBjYW4gY2F1c2UgcHJvYmxlbXMgb24gZGlmZmVyZW50IGZpbGUgc3lzdGVtc1xuICovXG5mdW5jdGlvbiB2YWxpZGF0ZUZpbGVQYXRoKHBhdGgpIHtcbiAgICBpZiAoIXBhdGgpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBQcm92aWRlZCBmaWxlIHBhdGggaW5wdXQgZHVyaW5nIHZhbGlkYXRpb24gaXMgZW1wdHlgKTtcbiAgICB9XG4gICAgZm9yIChjb25zdCBbaW52YWxpZENoYXJhY3RlcktleSwgZXJyb3JNZXNzYWdlRm9yQ2hhcmFjdGVyXSBvZiBpbnZhbGlkQXJ0aWZhY3RGaWxlUGF0aENoYXJhY3RlcnMpIHtcbiAgICAgICAgaWYgKHBhdGguaW5jbHVkZXMoaW52YWxpZENoYXJhY3RlcktleSkpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihgVGhlIHBhdGggZm9yIG9uZSBvZiB0aGUgZmlsZXMgaW4gYXJ0aWZhY3QgaXMgbm90IHZhbGlkOiAke3BhdGh9LiBDb250YWlucyB0aGUgZm9sbG93aW5nIGNoYXJhY3RlcjogJHtlcnJvck1lc3NhZ2VGb3JDaGFyYWN0ZXJ9XG4gICAgICAgICAgXG5JbnZhbGlkIGNoYXJhY3RlcnMgaW5jbHVkZTogJHtBcnJheS5mcm9tKGludmFsaWRBcnRpZmFjdEZpbGVQYXRoQ2hhcmFjdGVycy52YWx1ZXMoKSkudG9TdHJpbmcoKX1cbiAgICAgICAgICBcblRoZSBmb2xsb3dpbmcgY2hhcmFjdGVycyBhcmUgbm90IGFsbG93ZWQgaW4gZmlsZXMgdGhhdCBhcmUgdXBsb2FkZWQgZHVlIHRvIGxpbWl0YXRpb25zIHdpdGggY2VydGFpbiBmaWxlIHN5c3RlbXMgc3VjaCBhcyBOVEZTLiBUbyBtYWludGFpbiBmaWxlIHN5c3RlbSBhZ25vc3RpYyBiZWhhdmlvciwgdGhlc2UgY2hhcmFjdGVycyBhcmUgaW50ZW50aW9uYWxseSBub3QgYWxsb3dlZCB0byBwcmV2ZW50IHBvdGVudGlhbCBwcm9ibGVtcyB3aXRoIGRvd25sb2FkcyBvbiBkaWZmZXJlbnQgZmlsZSBzeXN0ZW1zLlxuICAgICAgICAgIGApO1xuICAgICAgICB9XG4gICAgfVxufVxuZXhwb3J0cy52YWxpZGF0ZUZpbGVQYXRoID0gdmFsaWRhdGVGaWxlUGF0aDtcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPXBhdGgtYW5kLWFydGlmYWN0LW5hbWUtdmFsaWRhdGlvbi5qcy5tYXAiLAogICAgIlwidXNlIHN0cmljdFwiO1xuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiX19lc01vZHVsZVwiLCB7IHZhbHVlOiB0cnVlIH0pO1xuZXhwb3J0cy5nZXRVc2VyQWdlbnRTdHJpbmcgPSB2b2lkIDA7XG4vLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLXZhci1yZXF1aXJlcywgQHR5cGVzY3JpcHQtZXNsaW50L25vLXJlcXVpcmUtaW1wb3J0c1xuY29uc3QgcGFja2FnZUpzb24gPSByZXF1aXJlKCcuLi8uLi8uLi9wYWNrYWdlLmpzb24nKTtcbi8qKlxuICogRW5zdXJlIHRoYXQgdGhpcyBVc2VyIEFnZW50IFN0cmluZyBpcyB1c2VkIGluIGFsbCBIVFRQIGNhbGxzIHNvIHRoYXQgd2UgY2FuIG1vbml0b3IgdGVsZW1ldHJ5IGJldHdlZW4gZGlmZmVyZW50IHZlcnNpb25zIG9mIHRoaXMgcGFja2FnZVxuICovXG5mdW5jdGlvbiBnZXRVc2VyQWdlbnRTdHJpbmcoKSB7XG4gICAgcmV0dXJuIGBAYWN0aW9ucy9hcnRpZmFjdC0ke3BhY2thZ2VKc29uLnZlcnNpb259YDtcbn1cbmV4cG9ydHMuZ2V0VXNlckFnZW50U3RyaW5nID0gZ2V0VXNlckFnZW50U3RyaW5nO1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9dXNlci1hZ2VudC5qcy5tYXAiLAogICAgIlwidXNlIHN0cmljdFwiO1xuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiX19lc01vZHVsZVwiLCB7IHZhbHVlOiB0cnVlIH0pO1xuZXhwb3J0cy5Vc2FnZUVycm9yID0gZXhwb3J0cy5OZXR3b3JrRXJyb3IgPSBleHBvcnRzLkdIRVNOb3RTdXBwb3J0ZWRFcnJvciA9IGV4cG9ydHMuQXJ0aWZhY3ROb3RGb3VuZEVycm9yID0gZXhwb3J0cy5JbnZhbGlkUmVzcG9uc2VFcnJvciA9IGV4cG9ydHMuRmlsZXNOb3RGb3VuZEVycm9yID0gdm9pZCAwO1xuY2xhc3MgRmlsZXNOb3RGb3VuZEVycm9yIGV4dGVuZHMgRXJyb3Ige1xuICAgIGNvbnN0cnVjdG9yKGZpbGVzID0gW10pIHtcbiAgICAgICAgbGV0IG1lc3NhZ2UgPSAnTm8gZmlsZXMgd2VyZSBmb3VuZCB0byB1cGxvYWQnO1xuICAgICAgICBpZiAoZmlsZXMubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgbWVzc2FnZSArPSBgOiAke2ZpbGVzLmpvaW4oJywgJyl9YDtcbiAgICAgICAgfVxuICAgICAgICBzdXBlcihtZXNzYWdlKTtcbiAgICAgICAgdGhpcy5maWxlcyA9IGZpbGVzO1xuICAgICAgICB0aGlzLm5hbWUgPSAnRmlsZXNOb3RGb3VuZEVycm9yJztcbiAgICB9XG59XG5leHBvcnRzLkZpbGVzTm90Rm91bmRFcnJvciA9IEZpbGVzTm90Rm91bmRFcnJvcjtcbmNsYXNzIEludmFsaWRSZXNwb25zZUVycm9yIGV4dGVuZHMgRXJyb3Ige1xuICAgIGNvbnN0cnVjdG9yKG1lc3NhZ2UpIHtcbiAgICAgICAgc3VwZXIobWVzc2FnZSk7XG4gICAgICAgIHRoaXMubmFtZSA9ICdJbnZhbGlkUmVzcG9uc2VFcnJvcic7XG4gICAgfVxufVxuZXhwb3J0cy5JbnZhbGlkUmVzcG9uc2VFcnJvciA9IEludmFsaWRSZXNwb25zZUVycm9yO1xuY2xhc3MgQXJ0aWZhY3ROb3RGb3VuZEVycm9yIGV4dGVuZHMgRXJyb3Ige1xuICAgIGNvbnN0cnVjdG9yKG1lc3NhZ2UgPSAnQXJ0aWZhY3Qgbm90IGZvdW5kJykge1xuICAgICAgICBzdXBlcihtZXNzYWdlKTtcbiAgICAgICAgdGhpcy5uYW1lID0gJ0FydGlmYWN0Tm90Rm91bmRFcnJvcic7XG4gICAgfVxufVxuZXhwb3J0cy5BcnRpZmFjdE5vdEZvdW5kRXJyb3IgPSBBcnRpZmFjdE5vdEZvdW5kRXJyb3I7XG5jbGFzcyBHSEVTTm90U3VwcG9ydGVkRXJyb3IgZXh0ZW5kcyBFcnJvciB7XG4gICAgY29uc3RydWN0b3IobWVzc2FnZSA9ICdAYWN0aW9ucy9hcnRpZmFjdCB2Mi4wLjArLCB1cGxvYWQtYXJ0aWZhY3RAdjQrIGFuZCBkb3dubG9hZC1hcnRpZmFjdEB2NCsgYXJlIG5vdCBjdXJyZW50bHkgc3VwcG9ydGVkIG9uIEdIRVMuJykge1xuICAgICAgICBzdXBlcihtZXNzYWdlKTtcbiAgICAgICAgdGhpcy5uYW1lID0gJ0dIRVNOb3RTdXBwb3J0ZWRFcnJvcic7XG4gICAgfVxufVxuZXhwb3J0cy5HSEVTTm90U3VwcG9ydGVkRXJyb3IgPSBHSEVTTm90U3VwcG9ydGVkRXJyb3I7XG5jbGFzcyBOZXR3b3JrRXJyb3IgZXh0ZW5kcyBFcnJvciB7XG4gICAgY29uc3RydWN0b3IoY29kZSkge1xuICAgICAgICBjb25zdCBtZXNzYWdlID0gYFVuYWJsZSB0byBtYWtlIHJlcXVlc3Q6ICR7Y29kZX1cXG5JZiB5b3UgYXJlIHVzaW5nIHNlbGYtaG9zdGVkIHJ1bm5lcnMsIHBsZWFzZSBtYWtlIHN1cmUgeW91ciBydW5uZXIgaGFzIGFjY2VzcyB0byBhbGwgR2l0SHViIGVuZHBvaW50czogaHR0cHM6Ly9kb2NzLmdpdGh1Yi5jb20vZW4vYWN0aW9ucy9ob3N0aW5nLXlvdXItb3duLXJ1bm5lcnMvbWFuYWdpbmctc2VsZi1ob3N0ZWQtcnVubmVycy9hYm91dC1zZWxmLWhvc3RlZC1ydW5uZXJzI2NvbW11bmljYXRpb24tYmV0d2Vlbi1zZWxmLWhvc3RlZC1ydW5uZXJzLWFuZC1naXRodWJgO1xuICAgICAgICBzdXBlcihtZXNzYWdlKTtcbiAgICAgICAgdGhpcy5jb2RlID0gY29kZTtcbiAgICAgICAgdGhpcy5uYW1lID0gJ05ldHdvcmtFcnJvcic7XG4gICAgfVxufVxuZXhwb3J0cy5OZXR3b3JrRXJyb3IgPSBOZXR3b3JrRXJyb3I7XG5OZXR3b3JrRXJyb3IuaXNOZXR3b3JrRXJyb3JDb2RlID0gKGNvZGUpID0+IHtcbiAgICBpZiAoIWNvZGUpXG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICByZXR1cm4gW1xuICAgICAgICAnRUNPTk5SRVNFVCcsXG4gICAgICAgICdFTk9URk9VTkQnLFxuICAgICAgICAnRVRJTUVET1VUJyxcbiAgICAgICAgJ0VDT05OUkVGVVNFRCcsXG4gICAgICAgICdFSE9TVFVOUkVBQ0gnXG4gICAgXS5pbmNsdWRlcyhjb2RlKTtcbn07XG5jbGFzcyBVc2FnZUVycm9yIGV4dGVuZHMgRXJyb3Ige1xuICAgIGNvbnN0cnVjdG9yKCkge1xuICAgICAgICBjb25zdCBtZXNzYWdlID0gYEFydGlmYWN0IHN0b3JhZ2UgcXVvdGEgaGFzIGJlZW4gaGl0LiBVbmFibGUgdG8gdXBsb2FkIGFueSBuZXcgYXJ0aWZhY3RzLiBVc2FnZSBpcyByZWNhbGN1bGF0ZWQgZXZlcnkgNi0xMiBob3Vycy5cXG5Nb3JlIGluZm8gb24gc3RvcmFnZSBsaW1pdHM6IGh0dHBzOi8vZG9jcy5naXRodWIuY29tL2VuL2JpbGxpbmcvbWFuYWdpbmctYmlsbGluZy1mb3ItZ2l0aHViLWFjdGlvbnMvYWJvdXQtYmlsbGluZy1mb3ItZ2l0aHViLWFjdGlvbnMjY2FsY3VsYXRpbmctbWludXRlLWFuZC1zdG9yYWdlLXNwZW5kaW5nYDtcbiAgICAgICAgc3VwZXIobWVzc2FnZSk7XG4gICAgICAgIHRoaXMubmFtZSA9ICdVc2FnZUVycm9yJztcbiAgICB9XG59XG5leHBvcnRzLlVzYWdlRXJyb3IgPSBVc2FnZUVycm9yO1xuVXNhZ2VFcnJvci5pc1VzYWdlRXJyb3JNZXNzYWdlID0gKG1zZykgPT4ge1xuICAgIGlmICghbXNnKVxuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgcmV0dXJuIG1zZy5pbmNsdWRlcygnaW5zdWZmaWNpZW50IHVzYWdlJyk7XG59O1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9ZXJyb3JzLmpzLm1hcCIsCiAgICAiXCJ1c2Ugc3RyaWN0XCI7XG52YXIgX19hd2FpdGVyID0gKHRoaXMgJiYgdGhpcy5fX2F3YWl0ZXIpIHx8IGZ1bmN0aW9uICh0aGlzQXJnLCBfYXJndW1lbnRzLCBQLCBnZW5lcmF0b3IpIHtcbiAgICBmdW5jdGlvbiBhZG9wdCh2YWx1ZSkgeyByZXR1cm4gdmFsdWUgaW5zdGFuY2VvZiBQID8gdmFsdWUgOiBuZXcgUChmdW5jdGlvbiAocmVzb2x2ZSkgeyByZXNvbHZlKHZhbHVlKTsgfSk7IH1cbiAgICByZXR1cm4gbmV3IChQIHx8IChQID0gUHJvbWlzZSkpKGZ1bmN0aW9uIChyZXNvbHZlLCByZWplY3QpIHtcbiAgICAgICAgZnVuY3Rpb24gZnVsZmlsbGVkKHZhbHVlKSB7IHRyeSB7IHN0ZXAoZ2VuZXJhdG9yLm5leHQodmFsdWUpKTsgfSBjYXRjaCAoZSkgeyByZWplY3QoZSk7IH0gfVxuICAgICAgICBmdW5jdGlvbiByZWplY3RlZCh2YWx1ZSkgeyB0cnkgeyBzdGVwKGdlbmVyYXRvcltcInRocm93XCJdKHZhbHVlKSk7IH0gY2F0Y2ggKGUpIHsgcmVqZWN0KGUpOyB9IH1cbiAgICAgICAgZnVuY3Rpb24gc3RlcChyZXN1bHQpIHsgcmVzdWx0LmRvbmUgPyByZXNvbHZlKHJlc3VsdC52YWx1ZSkgOiBhZG9wdChyZXN1bHQudmFsdWUpLnRoZW4oZnVsZmlsbGVkLCByZWplY3RlZCk7IH1cbiAgICAgICAgc3RlcCgoZ2VuZXJhdG9yID0gZ2VuZXJhdG9yLmFwcGx5KHRoaXNBcmcsIF9hcmd1bWVudHMgfHwgW10pKS5uZXh0KCkpO1xuICAgIH0pO1xufTtcbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIl9fZXNNb2R1bGVcIiwgeyB2YWx1ZTogdHJ1ZSB9KTtcbmV4cG9ydHMuaW50ZXJuYWxBcnRpZmFjdFR3aXJwQ2xpZW50ID0gdm9pZCAwO1xuY29uc3QgaHR0cF9jbGllbnRfMSA9IHJlcXVpcmUoXCJAYWN0aW9ucy9odHRwLWNsaWVudFwiKTtcbmNvbnN0IGF1dGhfMSA9IHJlcXVpcmUoXCJAYWN0aW9ucy9odHRwLWNsaWVudC9saWIvYXV0aFwiKTtcbmNvbnN0IGNvcmVfMSA9IHJlcXVpcmUoXCJAYWN0aW9ucy9jb3JlXCIpO1xuY29uc3QgZ2VuZXJhdGVkXzEgPSByZXF1aXJlKFwiLi4vLi4vZ2VuZXJhdGVkXCIpO1xuY29uc3QgY29uZmlnXzEgPSByZXF1aXJlKFwiLi9jb25maWdcIik7XG5jb25zdCB1c2VyX2FnZW50XzEgPSByZXF1aXJlKFwiLi91c2VyLWFnZW50XCIpO1xuY29uc3QgZXJyb3JzXzEgPSByZXF1aXJlKFwiLi9lcnJvcnNcIik7XG5jbGFzcyBBcnRpZmFjdEh0dHBDbGllbnQge1xuICAgIGNvbnN0cnVjdG9yKHVzZXJBZ2VudCwgbWF4QXR0ZW1wdHMsIGJhc2VSZXRyeUludGVydmFsTWlsbGlzZWNvbmRzLCByZXRyeU11bHRpcGxpZXIpIHtcbiAgICAgICAgdGhpcy5tYXhBdHRlbXB0cyA9IDU7XG4gICAgICAgIHRoaXMuYmFzZVJldHJ5SW50ZXJ2YWxNaWxsaXNlY29uZHMgPSAzMDAwO1xuICAgICAgICB0aGlzLnJldHJ5TXVsdGlwbGllciA9IDEuNTtcbiAgICAgICAgY29uc3QgdG9rZW4gPSAoMCwgY29uZmlnXzEuZ2V0UnVudGltZVRva2VuKSgpO1xuICAgICAgICB0aGlzLmJhc2VVcmwgPSAoMCwgY29uZmlnXzEuZ2V0UmVzdWx0c1NlcnZpY2VVcmwpKCk7XG4gICAgICAgIGlmIChtYXhBdHRlbXB0cykge1xuICAgICAgICAgICAgdGhpcy5tYXhBdHRlbXB0cyA9IG1heEF0dGVtcHRzO1xuICAgICAgICB9XG4gICAgICAgIGlmIChiYXNlUmV0cnlJbnRlcnZhbE1pbGxpc2Vjb25kcykge1xuICAgICAgICAgICAgdGhpcy5iYXNlUmV0cnlJbnRlcnZhbE1pbGxpc2Vjb25kcyA9IGJhc2VSZXRyeUludGVydmFsTWlsbGlzZWNvbmRzO1xuICAgICAgICB9XG4gICAgICAgIGlmIChyZXRyeU11bHRpcGxpZXIpIHtcbiAgICAgICAgICAgIHRoaXMucmV0cnlNdWx0aXBsaWVyID0gcmV0cnlNdWx0aXBsaWVyO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMuaHR0cENsaWVudCA9IG5ldyBodHRwX2NsaWVudF8xLkh0dHBDbGllbnQodXNlckFnZW50LCBbXG4gICAgICAgICAgICBuZXcgYXV0aF8xLkJlYXJlckNyZWRlbnRpYWxIYW5kbGVyKHRva2VuKVxuICAgICAgICBdKTtcbiAgICB9XG4gICAgLy8gVGhpcyBmdW5jdGlvbiBzYXRpc2ZpZXMgdGhlIFJwYyBpbnRlcmZhY2UuIEl0IGlzIGNvbXBhdGlibGUgd2l0aCB0aGUgSlNPTlxuICAgIC8vIEpTT04gZ2VuZXJhdGVkIGNsaWVudC5cbiAgICByZXF1ZXN0KHNlcnZpY2UsIG1ldGhvZCwgY29udGVudFR5cGUsIGRhdGEpIHtcbiAgICAgICAgcmV0dXJuIF9fYXdhaXRlcih0aGlzLCB2b2lkIDAsIHZvaWQgMCwgZnVuY3Rpb24qICgpIHtcbiAgICAgICAgICAgIGNvbnN0IHVybCA9IG5ldyBVUkwoYC90d2lycC8ke3NlcnZpY2V9LyR7bWV0aG9kfWAsIHRoaXMuYmFzZVVybCkuaHJlZjtcbiAgICAgICAgICAgICgwLCBjb3JlXzEuZGVidWcpKGBbUmVxdWVzdF0gJHttZXRob2R9ICR7dXJsfWApO1xuICAgICAgICAgICAgY29uc3QgaGVhZGVycyA9IHtcbiAgICAgICAgICAgICAgICAnQ29udGVudC1UeXBlJzogY29udGVudFR5cGVcbiAgICAgICAgICAgIH07XG4gICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgIGNvbnN0IHsgYm9keSB9ID0geWllbGQgdGhpcy5yZXRyeWFibGVSZXF1ZXN0KCgpID0+IF9fYXdhaXRlcih0aGlzLCB2b2lkIDAsIHZvaWQgMCwgZnVuY3Rpb24qICgpIHsgcmV0dXJuIHRoaXMuaHR0cENsaWVudC5wb3N0KHVybCwgSlNPTi5zdHJpbmdpZnkoZGF0YSksIGhlYWRlcnMpOyB9KSk7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGJvZHk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYEZhaWxlZCB0byAke21ldGhvZH06ICR7ZXJyb3IubWVzc2FnZX1gKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgfVxuICAgIHJldHJ5YWJsZVJlcXVlc3Qob3BlcmF0aW9uKSB7XG4gICAgICAgIHJldHVybiBfX2F3YWl0ZXIodGhpcywgdm9pZCAwLCB2b2lkIDAsIGZ1bmN0aW9uKiAoKSB7XG4gICAgICAgICAgICBsZXQgYXR0ZW1wdCA9IDA7XG4gICAgICAgICAgICBsZXQgZXJyb3JNZXNzYWdlID0gJyc7XG4gICAgICAgICAgICBsZXQgcmF3Qm9keSA9ICcnO1xuICAgICAgICAgICAgd2hpbGUgKGF0dGVtcHQgPCB0aGlzLm1heEF0dGVtcHRzKSB7XG4gICAgICAgICAgICAgICAgbGV0IGlzUmV0cnlhYmxlID0gZmFsc2U7XG4gICAgICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgcmVzcG9uc2UgPSB5aWVsZCBvcGVyYXRpb24oKTtcbiAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RhdHVzQ29kZSA9IHJlc3BvbnNlLm1lc3NhZ2Uuc3RhdHVzQ29kZTtcbiAgICAgICAgICAgICAgICAgICAgcmF3Qm9keSA9IHlpZWxkIHJlc3BvbnNlLnJlYWRCb2R5KCk7XG4gICAgICAgICAgICAgICAgICAgICgwLCBjb3JlXzEuZGVidWcpKGBbUmVzcG9uc2VdIC0gJHtyZXNwb25zZS5tZXNzYWdlLnN0YXR1c0NvZGV9YCk7XG4gICAgICAgICAgICAgICAgICAgICgwLCBjb3JlXzEuZGVidWcpKGBIZWFkZXJzOiAke0pTT04uc3RyaW5naWZ5KHJlc3BvbnNlLm1lc3NhZ2UuaGVhZGVycywgbnVsbCwgMil9YCk7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IGJvZHkgPSBKU09OLnBhcnNlKHJhd0JvZHkpO1xuICAgICAgICAgICAgICAgICAgICAoMCwgY29yZV8xLmRlYnVnKShgQm9keTogJHtKU09OLnN0cmluZ2lmeShib2R5LCBudWxsLCAyKX1gKTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKHRoaXMuaXNTdWNjZXNzU3RhdHVzQ29kZShzdGF0dXNDb2RlKSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHsgcmVzcG9uc2UsIGJvZHkgfTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBpc1JldHJ5YWJsZSA9IHRoaXMuaXNSZXRyeWFibGVIdHRwU3RhdHVzQ29kZShzdGF0dXNDb2RlKTtcbiAgICAgICAgICAgICAgICAgICAgZXJyb3JNZXNzYWdlID0gYEZhaWxlZCByZXF1ZXN0OiAoJHtzdGF0dXNDb2RlfSkgJHtyZXNwb25zZS5tZXNzYWdlLnN0YXR1c01lc3NhZ2V9YDtcbiAgICAgICAgICAgICAgICAgICAgaWYgKGJvZHkubXNnKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoZXJyb3JzXzEuVXNhZ2VFcnJvci5pc1VzYWdlRXJyb3JNZXNzYWdlKGJvZHkubXNnKSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBlcnJvcnNfMS5Vc2FnZUVycm9yKCk7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICBlcnJvck1lc3NhZ2UgPSBgJHtlcnJvck1lc3NhZ2V9OiAke2JvZHkubXNnfWA7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgICAgICAgICAgICAgIGlmIChlcnJvciBpbnN0YW5jZW9mIFN5bnRheEVycm9yKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAoMCwgY29yZV8xLmRlYnVnKShgUmF3IEJvZHk6ICR7cmF3Qm9keX1gKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBpZiAoZXJyb3IgaW5zdGFuY2VvZiBlcnJvcnNfMS5Vc2FnZUVycm9yKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICB0aHJvdyBlcnJvcjtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBpZiAoZXJyb3JzXzEuTmV0d29ya0Vycm9yLmlzTmV0d29ya0Vycm9yQ29kZShlcnJvciA9PT0gbnVsbCB8fCBlcnJvciA9PT0gdm9pZCAwID8gdm9pZCAwIDogZXJyb3IuY29kZSkpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBlcnJvcnNfMS5OZXR3b3JrRXJyb3IoZXJyb3IgPT09IG51bGwgfHwgZXJyb3IgPT09IHZvaWQgMCA/IHZvaWQgMCA6IGVycm9yLmNvZGUpO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIGlzUmV0cnlhYmxlID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICAgICAgZXJyb3JNZXNzYWdlID0gZXJyb3IubWVzc2FnZTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgaWYgKCFpc1JldHJ5YWJsZSkge1xuICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYFJlY2VpdmVkIG5vbi1yZXRyeWFibGUgZXJyb3I6ICR7ZXJyb3JNZXNzYWdlfWApO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBpZiAoYXR0ZW1wdCArIDEgPT09IHRoaXMubWF4QXR0ZW1wdHMpIHtcbiAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBGYWlsZWQgdG8gbWFrZSByZXF1ZXN0IGFmdGVyICR7dGhpcy5tYXhBdHRlbXB0c30gYXR0ZW1wdHM6ICR7ZXJyb3JNZXNzYWdlfWApO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBjb25zdCByZXRyeVRpbWVNaWxsaXNlY29uZHMgPSB0aGlzLmdldEV4cG9uZW50aWFsUmV0cnlUaW1lTWlsbGlzZWNvbmRzKGF0dGVtcHQpO1xuICAgICAgICAgICAgICAgICgwLCBjb3JlXzEuaW5mbykoYEF0dGVtcHQgJHthdHRlbXB0ICsgMX0gb2YgJHt0aGlzLm1heEF0dGVtcHRzfSBmYWlsZWQgd2l0aCBlcnJvcjogJHtlcnJvck1lc3NhZ2V9LiBSZXRyeWluZyByZXF1ZXN0IGluICR7cmV0cnlUaW1lTWlsbGlzZWNvbmRzfSBtcy4uLmApO1xuICAgICAgICAgICAgICAgIHlpZWxkIHRoaXMuc2xlZXAocmV0cnlUaW1lTWlsbGlzZWNvbmRzKTtcbiAgICAgICAgICAgICAgICBhdHRlbXB0Kys7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYFJlcXVlc3QgZmFpbGVkYCk7XG4gICAgICAgIH0pO1xuICAgIH1cbiAgICBpc1N1Y2Nlc3NTdGF0dXNDb2RlKHN0YXR1c0NvZGUpIHtcbiAgICAgICAgaWYgKCFzdGF0dXNDb2RlKVxuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICByZXR1cm4gc3RhdHVzQ29kZSA+PSAyMDAgJiYgc3RhdHVzQ29kZSA8IDMwMDtcbiAgICB9XG4gICAgaXNSZXRyeWFibGVIdHRwU3RhdHVzQ29kZShzdGF0dXNDb2RlKSB7XG4gICAgICAgIGlmICghc3RhdHVzQ29kZSlcbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgY29uc3QgcmV0cnlhYmxlU3RhdHVzQ29kZXMgPSBbXG4gICAgICAgICAgICBodHRwX2NsaWVudF8xLkh0dHBDb2Rlcy5CYWRHYXRld2F5LFxuICAgICAgICAgICAgaHR0cF9jbGllbnRfMS5IdHRwQ29kZXMuR2F0ZXdheVRpbWVvdXQsXG4gICAgICAgICAgICBodHRwX2NsaWVudF8xLkh0dHBDb2Rlcy5JbnRlcm5hbFNlcnZlckVycm9yLFxuICAgICAgICAgICAgaHR0cF9jbGllbnRfMS5IdHRwQ29kZXMuU2VydmljZVVuYXZhaWxhYmxlLFxuICAgICAgICAgICAgaHR0cF9jbGllbnRfMS5IdHRwQ29kZXMuVG9vTWFueVJlcXVlc3RzXG4gICAgICAgIF07XG4gICAgICAgIHJldHVybiByZXRyeWFibGVTdGF0dXNDb2Rlcy5pbmNsdWRlcyhzdGF0dXNDb2RlKTtcbiAgICB9XG4gICAgc2xlZXAobWlsbGlzZWNvbmRzKSB7XG4gICAgICAgIHJldHVybiBfX2F3YWl0ZXIodGhpcywgdm9pZCAwLCB2b2lkIDAsIGZ1bmN0aW9uKiAoKSB7XG4gICAgICAgICAgICByZXR1cm4gbmV3IFByb21pc2UocmVzb2x2ZSA9PiBzZXRUaW1lb3V0KHJlc29sdmUsIG1pbGxpc2Vjb25kcykpO1xuICAgICAgICB9KTtcbiAgICB9XG4gICAgZ2V0RXhwb25lbnRpYWxSZXRyeVRpbWVNaWxsaXNlY29uZHMoYXR0ZW1wdCkge1xuICAgICAgICBpZiAoYXR0ZW1wdCA8IDApIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcignYXR0ZW1wdCBzaG91bGQgYmUgYSBwb3NpdGl2ZSBpbnRlZ2VyJyk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGF0dGVtcHQgPT09IDApIHtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLmJhc2VSZXRyeUludGVydmFsTWlsbGlzZWNvbmRzO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IG1pblRpbWUgPSB0aGlzLmJhc2VSZXRyeUludGVydmFsTWlsbGlzZWNvbmRzICogTWF0aC5wb3codGhpcy5yZXRyeU11bHRpcGxpZXIsIGF0dGVtcHQpO1xuICAgICAgICBjb25zdCBtYXhUaW1lID0gbWluVGltZSAqIHRoaXMucmV0cnlNdWx0aXBsaWVyO1xuICAgICAgICAvLyByZXR1cm5zIGEgcmFuZG9tIG51bWJlciBiZXR3ZWVuIG1pblRpbWUgYW5kIG1heFRpbWUgKGV4Y2x1c2l2ZSlcbiAgICAgICAgcmV0dXJuIE1hdGgudHJ1bmMoTWF0aC5yYW5kb20oKSAqIChtYXhUaW1lIC0gbWluVGltZSkgKyBtaW5UaW1lKTtcbiAgICB9XG59XG5mdW5jdGlvbiBpbnRlcm5hbEFydGlmYWN0VHdpcnBDbGllbnQob3B0aW9ucykge1xuICAgIGNvbnN0IGNsaWVudCA9IG5ldyBBcnRpZmFjdEh0dHBDbGllbnQoKDAsIHVzZXJfYWdlbnRfMS5nZXRVc2VyQWdlbnRTdHJpbmcpKCksIG9wdGlvbnMgPT09IG51bGwgfHwgb3B0aW9ucyA9PT0gdm9pZCAwID8gdm9pZCAwIDogb3B0aW9ucy5tYXhBdHRlbXB0cywgb3B0aW9ucyA9PT0gbnVsbCB8fCBvcHRpb25zID09PSB2b2lkIDAgPyB2b2lkIDAgOiBvcHRpb25zLnJldHJ5SW50ZXJ2YWxNcywgb3B0aW9ucyA9PT0gbnVsbCB8fCBvcHRpb25zID09PSB2b2lkIDAgPyB2b2lkIDAgOiBvcHRpb25zLnJldHJ5TXVsdGlwbGllcik7XG4gICAgcmV0dXJuIG5ldyBnZW5lcmF0ZWRfMS5BcnRpZmFjdFNlcnZpY2VDbGllbnRKU09OKGNsaWVudCk7XG59XG5leHBvcnRzLmludGVybmFsQXJ0aWZhY3RUd2lycENsaWVudCA9IGludGVybmFsQXJ0aWZhY3RUd2lycENsaWVudDtcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPWFydGlmYWN0LXR3aXJwLWNsaWVudC5qcy5tYXAiLAogICAgIlwidXNlIHN0cmljdFwiO1xudmFyIF9fY3JlYXRlQmluZGluZyA9ICh0aGlzICYmIHRoaXMuX19jcmVhdGVCaW5kaW5nKSB8fCAoT2JqZWN0LmNyZWF0ZSA/IChmdW5jdGlvbihvLCBtLCBrLCBrMikge1xuICAgIGlmIChrMiA9PT0gdW5kZWZpbmVkKSBrMiA9IGs7XG4gICAgdmFyIGRlc2MgPSBPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKG0sIGspO1xuICAgIGlmICghZGVzYyB8fCAoXCJnZXRcIiBpbiBkZXNjID8gIW0uX19lc01vZHVsZSA6IGRlc2Mud3JpdGFibGUgfHwgZGVzYy5jb25maWd1cmFibGUpKSB7XG4gICAgICBkZXNjID0geyBlbnVtZXJhYmxlOiB0cnVlLCBnZXQ6IGZ1bmN0aW9uKCkgeyByZXR1cm4gbVtrXTsgfSB9O1xuICAgIH1cbiAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkobywgazIsIGRlc2MpO1xufSkgOiAoZnVuY3Rpb24obywgbSwgaywgazIpIHtcbiAgICBpZiAoazIgPT09IHVuZGVmaW5lZCkgazIgPSBrO1xuICAgIG9bazJdID0gbVtrXTtcbn0pKTtcbnZhciBfX3NldE1vZHVsZURlZmF1bHQgPSAodGhpcyAmJiB0aGlzLl9fc2V0TW9kdWxlRGVmYXVsdCkgfHwgKE9iamVjdC5jcmVhdGUgPyAoZnVuY3Rpb24obywgdikge1xuICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShvLCBcImRlZmF1bHRcIiwgeyBlbnVtZXJhYmxlOiB0cnVlLCB2YWx1ZTogdiB9KTtcbn0pIDogZnVuY3Rpb24obywgdikge1xuICAgIG9bXCJkZWZhdWx0XCJdID0gdjtcbn0pO1xudmFyIF9faW1wb3J0U3RhciA9ICh0aGlzICYmIHRoaXMuX19pbXBvcnRTdGFyKSB8fCBmdW5jdGlvbiAobW9kKSB7XG4gICAgaWYgKG1vZCAmJiBtb2QuX19lc01vZHVsZSkgcmV0dXJuIG1vZDtcbiAgICB2YXIgcmVzdWx0ID0ge307XG4gICAgaWYgKG1vZCAhPSBudWxsKSBmb3IgKHZhciBrIGluIG1vZCkgaWYgKGsgIT09IFwiZGVmYXVsdFwiICYmIE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChtb2QsIGspKSBfX2NyZWF0ZUJpbmRpbmcocmVzdWx0LCBtb2QsIGspO1xuICAgIF9fc2V0TW9kdWxlRGVmYXVsdChyZXN1bHQsIG1vZCk7XG4gICAgcmV0dXJuIHJlc3VsdDtcbn07XG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJfX2VzTW9kdWxlXCIsIHsgdmFsdWU6IHRydWUgfSk7XG5leHBvcnRzLmdldFVwbG9hZFppcFNwZWNpZmljYXRpb24gPSBleHBvcnRzLnZhbGlkYXRlUm9vdERpcmVjdG9yeSA9IHZvaWQgMDtcbmNvbnN0IGZzID0gX19pbXBvcnRTdGFyKHJlcXVpcmUoXCJmc1wiKSk7XG5jb25zdCBjb3JlXzEgPSByZXF1aXJlKFwiQGFjdGlvbnMvY29yZVwiKTtcbmNvbnN0IHBhdGhfMSA9IHJlcXVpcmUoXCJwYXRoXCIpO1xuY29uc3QgcGF0aF9hbmRfYXJ0aWZhY3RfbmFtZV92YWxpZGF0aW9uXzEgPSByZXF1aXJlKFwiLi9wYXRoLWFuZC1hcnRpZmFjdC1uYW1lLXZhbGlkYXRpb25cIik7XG4vKipcbiAqIENoZWNrcyBpZiBhIHJvb3QgZGlyZWN0b3J5IGV4aXN0cyBhbmQgaXMgdmFsaWRcbiAqIEBwYXJhbSByb290RGlyZWN0b3J5IGFuIGFic29sdXRlIHJvb3QgZGlyZWN0b3J5IHBhdGggY29tbW9uIHRvIGFsbCBpbnB1dCBmaWxlcyB0aGF0IHRoYXQgd2lsbCBiZSB0cmltbWVkIGZyb20gdGhlIGZpbmFsIHppcCBzdHJ1Y3R1cmVcbiAqL1xuZnVuY3Rpb24gdmFsaWRhdGVSb290RGlyZWN0b3J5KHJvb3REaXJlY3RvcnkpIHtcbiAgICBpZiAoIWZzLmV4aXN0c1N5bmMocm9vdERpcmVjdG9yeSkpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBUaGUgcHJvdmlkZWQgcm9vdERpcmVjdG9yeSAke3Jvb3REaXJlY3Rvcnl9IGRvZXMgbm90IGV4aXN0YCk7XG4gICAgfVxuICAgIGlmICghZnMuc3RhdFN5bmMocm9vdERpcmVjdG9yeSkuaXNEaXJlY3RvcnkoKSkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYFRoZSBwcm92aWRlZCByb290RGlyZWN0b3J5ICR7cm9vdERpcmVjdG9yeX0gaXMgbm90IGEgdmFsaWQgZGlyZWN0b3J5YCk7XG4gICAgfVxuICAgICgwLCBjb3JlXzEuaW5mbykoYFJvb3QgZGlyZWN0b3J5IGlucHV0IGlzIHZhbGlkIWApO1xufVxuZXhwb3J0cy52YWxpZGF0ZVJvb3REaXJlY3RvcnkgPSB2YWxpZGF0ZVJvb3REaXJlY3Rvcnk7XG4vKipcbiAqIENyZWF0ZXMgYSBzcGVjaWZpY2F0aW9uIHRoYXQgZGVzY3JpYmVzIGhvdyBhIHppcCBmaWxlIHdpbGwgYmUgY3JlYXRlZCBmb3IgYSBzZXQgb2YgaW5wdXQgZmlsZXNcbiAqIEBwYXJhbSBmaWxlc1RvWmlwIGEgbGlzdCBvZiBmaWxlIHRoYXQgc2hvdWxkIGJlIGluY2x1ZGVkIGluIHRoZSB6aXBcbiAqIEBwYXJhbSByb290RGlyZWN0b3J5IGFuIGFic29sdXRlIHJvb3QgZGlyZWN0b3J5IHBhdGggY29tbW9uIHRvIGFsbCBpbnB1dCBmaWxlcyB0aGF0IHRoYXQgd2lsbCBiZSB0cmltbWVkIGZyb20gdGhlIGZpbmFsIHppcCBzdHJ1Y3R1cmVcbiAqL1xuZnVuY3Rpb24gZ2V0VXBsb2FkWmlwU3BlY2lmaWNhdGlvbihmaWxlc1RvWmlwLCByb290RGlyZWN0b3J5KSB7XG4gICAgY29uc3Qgc3BlY2lmaWNhdGlvbiA9IFtdO1xuICAgIC8vIE5vcm1hbGl6ZSBhbmQgcmVzb2x2ZSwgdGhpcyBhbGxvd3MgZm9yIGVpdGhlciBhYnNvbHV0ZSBvciByZWxhdGl2ZSBwYXRocyB0byBiZSB1c2VkXG4gICAgcm9vdERpcmVjdG9yeSA9ICgwLCBwYXRoXzEubm9ybWFsaXplKShyb290RGlyZWN0b3J5KTtcbiAgICByb290RGlyZWN0b3J5ID0gKDAsIHBhdGhfMS5yZXNvbHZlKShyb290RGlyZWN0b3J5KTtcbiAgICAvKlxuICAgICAgIEV4YW1wbGVcbiAgICAgICBcbiAgICAgICBJbnB1dDpcbiAgICAgICAgIHJvb3REaXJlY3Rvcnk6ICcvaG9tZS91c2VyL2ZpbGVzL3Bsei11cGxvYWQnXG4gICAgICAgICBhcnRpZmFjdEZpbGVzOiBbXG4gICAgICAgICAgICcvaG9tZS91c2VyL2ZpbGVzL3Bsei11cGxvYWQvZmlsZTEudHh0JyxcbiAgICAgICAgICAgJy9ob21lL3VzZXIvZmlsZXMvcGx6LXVwbG9hZC9maWxlMi50eHQnLFxuICAgICAgICAgICAnL2hvbWUvdXNlci9maWxlcy9wbHotdXBsb2FkL2Rpci9maWxlMy50eHQnXG4gICAgICAgICBdXG4gICAgICAgXG4gICAgICAgT3V0cHV0OlxuICAgICAgICAgc3BlY2lmaWNhdGlvbnM6IFtcbiAgICAgICAgICAgWycvaG9tZS91c2VyL2ZpbGVzL3Bsei11cGxvYWQvZmlsZTEudHh0JywgJy9maWxlMS50eHQnXSxcbiAgICAgICAgICAgWycvaG9tZS91c2VyL2ZpbGVzL3Bsei11cGxvYWQvZmlsZTEudHh0JywgJy9maWxlMi50eHQnXSxcbiAgICAgICAgICAgWycvaG9tZS91c2VyL2ZpbGVzL3Bsei11cGxvYWQvZmlsZTEudHh0JywgJy9kaXIvZmlsZTMudHh0J11cbiAgICAgICAgIF1cbiAgXG4gICAgICAgIFRoZSBmaW5hbCB6aXAgdGhhdCBpcyBsYXRlciB1cGxvYWRlZCB3aWxsIGxvb2sgbGlrZSB0aGlzOlxuICBcbiAgICAgICAgbXktYXJ0aWZhY3QuemlwXG4gICAgICAgICAgLSBmaWxlLnR4dFxuICAgICAgICAgIC0gZmlsZTIudHh0XG4gICAgICAgICAgLSBkaXIvXG4gICAgICAgICAgICAtIGZpbGUzLnR4dFxuICAgICovXG4gICAgZm9yIChsZXQgZmlsZSBvZiBmaWxlc1RvWmlwKSB7XG4gICAgICAgIGNvbnN0IHN0YXRzID0gZnMubHN0YXRTeW5jKGZpbGUsIHsgdGhyb3dJZk5vRW50cnk6IGZhbHNlIH0pO1xuICAgICAgICBpZiAoIXN0YXRzKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYEZpbGUgJHtmaWxlfSBkb2VzIG5vdCBleGlzdGApO1xuICAgICAgICB9XG4gICAgICAgIGlmICghc3RhdHMuaXNEaXJlY3RvcnkoKSkge1xuICAgICAgICAgICAgLy8gTm9ybWFsaXplIGFuZCByZXNvbHZlLCB0aGlzIGFsbG93cyBmb3IgZWl0aGVyIGFic29sdXRlIG9yIHJlbGF0aXZlIHBhdGhzIHRvIGJlIHVzZWRcbiAgICAgICAgICAgIGZpbGUgPSAoMCwgcGF0aF8xLm5vcm1hbGl6ZSkoZmlsZSk7XG4gICAgICAgICAgICBmaWxlID0gKDAsIHBhdGhfMS5yZXNvbHZlKShmaWxlKTtcbiAgICAgICAgICAgIGlmICghZmlsZS5zdGFydHNXaXRoKHJvb3REaXJlY3RvcnkpKSB7XG4gICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBUaGUgcm9vdERpcmVjdG9yeTogJHtyb290RGlyZWN0b3J5fSBpcyBub3QgYSBwYXJlbnQgZGlyZWN0b3J5IG9mIHRoZSBmaWxlOiAke2ZpbGV9YCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICAvLyBDaGVjayBmb3IgZm9yYmlkZGVuIGNoYXJhY3RlcnMgaW4gZmlsZSBwYXRocyB0aGF0IG1heSBjYXVzZSBhbWJpZ3VvdXMgYmVoYXZpb3IgaWYgZG93bmxvYWRlZCBvbiBkaWZmZXJlbnQgZmlsZSBzeXN0ZW1zXG4gICAgICAgICAgICBjb25zdCB1cGxvYWRQYXRoID0gZmlsZS5yZXBsYWNlKHJvb3REaXJlY3RvcnksICcnKTtcbiAgICAgICAgICAgICgwLCBwYXRoX2FuZF9hcnRpZmFjdF9uYW1lX3ZhbGlkYXRpb25fMS52YWxpZGF0ZUZpbGVQYXRoKSh1cGxvYWRQYXRoKTtcbiAgICAgICAgICAgIHNwZWNpZmljYXRpb24ucHVzaCh7XG4gICAgICAgICAgICAgICAgc291cmNlUGF0aDogZmlsZSxcbiAgICAgICAgICAgICAgICBkZXN0aW5hdGlvblBhdGg6IHVwbG9hZFBhdGgsXG4gICAgICAgICAgICAgICAgc3RhdHNcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgLy8gRW1wdHkgZGlyZWN0b3J5XG4gICAgICAgICAgICBjb25zdCBkaXJlY3RvcnlQYXRoID0gZmlsZS5yZXBsYWNlKHJvb3REaXJlY3RvcnksICcnKTtcbiAgICAgICAgICAgICgwLCBwYXRoX2FuZF9hcnRpZmFjdF9uYW1lX3ZhbGlkYXRpb25fMS52YWxpZGF0ZUZpbGVQYXRoKShkaXJlY3RvcnlQYXRoKTtcbiAgICAgICAgICAgIHNwZWNpZmljYXRpb24ucHVzaCh7XG4gICAgICAgICAgICAgICAgc291cmNlUGF0aDogbnVsbCxcbiAgICAgICAgICAgICAgICBkZXN0aW5hdGlvblBhdGg6IGRpcmVjdG9yeVBhdGgsXG4gICAgICAgICAgICAgICAgc3RhdHNcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgfVxuICAgIHJldHVybiBzcGVjaWZpY2F0aW9uO1xufVxuZXhwb3J0cy5nZXRVcGxvYWRaaXBTcGVjaWZpY2F0aW9uID0gZ2V0VXBsb2FkWmlwU3BlY2lmaWNhdGlvbjtcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPXVwbG9hZC16aXAtc3BlY2lmaWNhdGlvbi5qcy5tYXAiLAogICAgIlwidXNlIHN0cmljdFwiO2Z1bmN0aW9uIGUoZSl7dGhpcy5tZXNzYWdlPWV9ZS5wcm90b3R5cGU9bmV3IEVycm9yLGUucHJvdG90eXBlLm5hbWU9XCJJbnZhbGlkQ2hhcmFjdGVyRXJyb3JcIjt2YXIgcj1cInVuZGVmaW5lZFwiIT10eXBlb2Ygd2luZG93JiZ3aW5kb3cuYXRvYiYmd2luZG93LmF0b2IuYmluZCh3aW5kb3cpfHxmdW5jdGlvbihyKXt2YXIgdD1TdHJpbmcocikucmVwbGFjZSgvPSskLyxcIlwiKTtpZih0Lmxlbmd0aCU0PT0xKXRocm93IG5ldyBlKFwiJ2F0b2InIGZhaWxlZDogVGhlIHN0cmluZyB0byBiZSBkZWNvZGVkIGlzIG5vdCBjb3JyZWN0bHkgZW5jb2RlZC5cIik7Zm9yKHZhciBuLG8sYT0wLGk9MCxjPVwiXCI7bz10LmNoYXJBdChpKyspO35vJiYobj1hJTQ/NjQqbitvOm8sYSsrJTQpP2MrPVN0cmluZy5mcm9tQ2hhckNvZGUoMjU1Jm4+PigtMiphJjYpKTowKW89XCJBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWmFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6MDEyMzQ1Njc4OSsvPVwiLmluZGV4T2Yobyk7cmV0dXJuIGN9O2Z1bmN0aW9uIHQoZSl7dmFyIHQ9ZS5yZXBsYWNlKC8tL2csXCIrXCIpLnJlcGxhY2UoL18vZyxcIi9cIik7c3dpdGNoKHQubGVuZ3RoJTQpe2Nhc2UgMDpicmVhaztjYXNlIDI6dCs9XCI9PVwiO2JyZWFrO2Nhc2UgMzp0Kz1cIj1cIjticmVhaztkZWZhdWx0OnRocm93XCJJbGxlZ2FsIGJhc2U2NHVybCBzdHJpbmchXCJ9dHJ5e3JldHVybiBmdW5jdGlvbihlKXtyZXR1cm4gZGVjb2RlVVJJQ29tcG9uZW50KHIoZSkucmVwbGFjZSgvKC4pL2csKGZ1bmN0aW9uKGUscil7dmFyIHQ9ci5jaGFyQ29kZUF0KDApLnRvU3RyaW5nKDE2KS50b1VwcGVyQ2FzZSgpO3JldHVybiB0Lmxlbmd0aDwyJiYodD1cIjBcIit0KSxcIiVcIit0fSkpKX0odCl9Y2F0Y2goZSl7cmV0dXJuIHIodCl9fWZ1bmN0aW9uIG4oZSl7dGhpcy5tZXNzYWdlPWV9ZnVuY3Rpb24gbyhlLHIpe2lmKFwic3RyaW5nXCIhPXR5cGVvZiBlKXRocm93IG5ldyBuKFwiSW52YWxpZCB0b2tlbiBzcGVjaWZpZWRcIik7dmFyIG89ITA9PT0ocj1yfHx7fSkuaGVhZGVyPzA6MTt0cnl7cmV0dXJuIEpTT04ucGFyc2UodChlLnNwbGl0KFwiLlwiKVtvXSkpfWNhdGNoKGUpe3Rocm93IG5ldyBuKFwiSW52YWxpZCB0b2tlbiBzcGVjaWZpZWQ6IFwiK2UubWVzc2FnZSl9fW4ucHJvdG90eXBlPW5ldyBFcnJvcixuLnByb3RvdHlwZS5uYW1lPVwiSW52YWxpZFRva2VuRXJyb3JcIjtjb25zdCBhPW87YS5kZWZhdWx0PW8sYS5JbnZhbGlkVG9rZW5FcnJvcj1uLG1vZHVsZS5leHBvcnRzPWE7XG4vLyMgc291cmNlTWFwcGluZ1VSTD1qd3QtZGVjb2RlLmNqcy5qcy5tYXBcbiIsCiAgICAiXCJ1c2Ugc3RyaWN0XCI7XG52YXIgX19jcmVhdGVCaW5kaW5nID0gKHRoaXMgJiYgdGhpcy5fX2NyZWF0ZUJpbmRpbmcpIHx8IChPYmplY3QuY3JlYXRlID8gKGZ1bmN0aW9uKG8sIG0sIGssIGsyKSB7XG4gICAgaWYgKGsyID09PSB1bmRlZmluZWQpIGsyID0gaztcbiAgICB2YXIgZGVzYyA9IE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IobSwgayk7XG4gICAgaWYgKCFkZXNjIHx8IChcImdldFwiIGluIGRlc2MgPyAhbS5fX2VzTW9kdWxlIDogZGVzYy53cml0YWJsZSB8fCBkZXNjLmNvbmZpZ3VyYWJsZSkpIHtcbiAgICAgIGRlc2MgPSB7IGVudW1lcmFibGU6IHRydWUsIGdldDogZnVuY3Rpb24oKSB7IHJldHVybiBtW2tdOyB9IH07XG4gICAgfVxuICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShvLCBrMiwgZGVzYyk7XG59KSA6IChmdW5jdGlvbihvLCBtLCBrLCBrMikge1xuICAgIGlmIChrMiA9PT0gdW5kZWZpbmVkKSBrMiA9IGs7XG4gICAgb1trMl0gPSBtW2tdO1xufSkpO1xudmFyIF9fc2V0TW9kdWxlRGVmYXVsdCA9ICh0aGlzICYmIHRoaXMuX19zZXRNb2R1bGVEZWZhdWx0KSB8fCAoT2JqZWN0LmNyZWF0ZSA/IChmdW5jdGlvbihvLCB2KSB7XG4gICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KG8sIFwiZGVmYXVsdFwiLCB7IGVudW1lcmFibGU6IHRydWUsIHZhbHVlOiB2IH0pO1xufSkgOiBmdW5jdGlvbihvLCB2KSB7XG4gICAgb1tcImRlZmF1bHRcIl0gPSB2O1xufSk7XG52YXIgX19pbXBvcnRTdGFyID0gKHRoaXMgJiYgdGhpcy5fX2ltcG9ydFN0YXIpIHx8IGZ1bmN0aW9uIChtb2QpIHtcbiAgICBpZiAobW9kICYmIG1vZC5fX2VzTW9kdWxlKSByZXR1cm4gbW9kO1xuICAgIHZhciByZXN1bHQgPSB7fTtcbiAgICBpZiAobW9kICE9IG51bGwpIGZvciAodmFyIGsgaW4gbW9kKSBpZiAoayAhPT0gXCJkZWZhdWx0XCIgJiYgT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKG1vZCwgaykpIF9fY3JlYXRlQmluZGluZyhyZXN1bHQsIG1vZCwgayk7XG4gICAgX19zZXRNb2R1bGVEZWZhdWx0KHJlc3VsdCwgbW9kKTtcbiAgICByZXR1cm4gcmVzdWx0O1xufTtcbnZhciBfX2ltcG9ydERlZmF1bHQgPSAodGhpcyAmJiB0aGlzLl9faW1wb3J0RGVmYXVsdCkgfHwgZnVuY3Rpb24gKG1vZCkge1xuICAgIHJldHVybiAobW9kICYmIG1vZC5fX2VzTW9kdWxlKSA/IG1vZCA6IHsgXCJkZWZhdWx0XCI6IG1vZCB9O1xufTtcbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIl9fZXNNb2R1bGVcIiwgeyB2YWx1ZTogdHJ1ZSB9KTtcbmV4cG9ydHMuZ2V0QmFja2VuZElkc0Zyb21Ub2tlbiA9IHZvaWQgMDtcbmNvbnN0IGNvcmUgPSBfX2ltcG9ydFN0YXIocmVxdWlyZShcIkBhY3Rpb25zL2NvcmVcIikpO1xuY29uc3QgY29uZmlnXzEgPSByZXF1aXJlKFwiLi9jb25maWdcIik7XG5jb25zdCBqd3RfZGVjb2RlXzEgPSBfX2ltcG9ydERlZmF1bHQocmVxdWlyZShcImp3dC1kZWNvZGVcIikpO1xuY29uc3QgSW52YWxpZEp3dEVycm9yID0gbmV3IEVycm9yKCdGYWlsZWQgdG8gZ2V0IGJhY2tlbmQgSURzOiBUaGUgcHJvdmlkZWQgSldUIHRva2VuIGlzIGludmFsaWQgYW5kL29yIG1pc3NpbmcgY2xhaW1zJyk7XG4vLyB1c2VzIHRoZSBKV1QgdG9rZW4gY2xhaW1zIHRvIGdldCB0aGVcbi8vIHdvcmtmbG93IHJ1biBhbmQgd29ya2Zsb3cgam9iIHJ1biBiYWNrZW5kIGlkc1xuZnVuY3Rpb24gZ2V0QmFja2VuZElkc0Zyb21Ub2tlbigpIHtcbiAgICBjb25zdCB0b2tlbiA9ICgwLCBjb25maWdfMS5nZXRSdW50aW1lVG9rZW4pKCk7XG4gICAgY29uc3QgZGVjb2RlZCA9ICgwLCBqd3RfZGVjb2RlXzEuZGVmYXVsdCkodG9rZW4pO1xuICAgIGlmICghZGVjb2RlZC5zY3ApIHtcbiAgICAgICAgdGhyb3cgSW52YWxpZEp3dEVycm9yO1xuICAgIH1cbiAgICAvKlxuICAgICAqIGV4YW1wbGUgZGVjb2RlZDpcbiAgICAgKiB7XG4gICAgICogICBzY3A6IFwiQWN0aW9ucy5FeGFtcGxlU2NvcGUgQWN0aW9ucy5SZXN1bHRzOmNlN2Y1NGM3LTYxYzctNGFhZS04ODdmLTMwZGE0NzVmNWYxYTpjYTM5NTA4NS0wNDBhLTUyNmItMmNlOC1iZGM4NWY2OTI3NzRcIlxuICAgICAqIH1cbiAgICAgKi9cbiAgICBjb25zdCBzY3BQYXJ0cyA9IGRlY29kZWQuc2NwLnNwbGl0KCcgJyk7XG4gICAgaWYgKHNjcFBhcnRzLmxlbmd0aCA9PT0gMCkge1xuICAgICAgICB0aHJvdyBJbnZhbGlkSnd0RXJyb3I7XG4gICAgfVxuICAgIC8qXG4gICAgICogZXhhbXBsZSBzY3BQYXJ0czpcbiAgICAgKiBbXCJBY3Rpb25zLkV4YW1wbGVTY29wZVwiLCBcIkFjdGlvbnMuUmVzdWx0czpjZTdmNTRjNy02MWM3LTRhYWUtODg3Zi0zMGRhNDc1ZjVmMWE6Y2EzOTUwODUtMDQwYS01MjZiLTJjZTgtYmRjODVmNjkyNzc0XCJdXG4gICAgICovXG4gICAgZm9yIChjb25zdCBzY29wZXMgb2Ygc2NwUGFydHMpIHtcbiAgICAgICAgY29uc3Qgc2NvcGVQYXJ0cyA9IHNjb3Blcy5zcGxpdCgnOicpO1xuICAgICAgICBpZiAoKHNjb3BlUGFydHMgPT09IG51bGwgfHwgc2NvcGVQYXJ0cyA9PT0gdm9pZCAwID8gdm9pZCAwIDogc2NvcGVQYXJ0c1swXSkgIT09ICdBY3Rpb25zLlJlc3VsdHMnKSB7XG4gICAgICAgICAgICAvLyBub3QgdGhlIEFjdGlvbnMuUmVzdWx0cyBzY29wZVxuICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgIH1cbiAgICAgICAgLypcbiAgICAgICAgICogZXhhbXBsZSBzY29wZVBhcnRzOlxuICAgICAgICAgKiBbXCJBY3Rpb25zLlJlc3VsdHNcIiwgXCJjZTdmNTRjNy02MWM3LTRhYWUtODg3Zi0zMGRhNDc1ZjVmMWFcIiwgXCJjYTM5NTA4NS0wNDBhLTUyNmItMmNlOC1iZGM4NWY2OTI3NzRcIl1cbiAgICAgICAgICovXG4gICAgICAgIGlmIChzY29wZVBhcnRzLmxlbmd0aCAhPT0gMykge1xuICAgICAgICAgICAgLy8gbWlzc2luZyBleHBlY3RlZCBudW1iZXIgb2YgY2xhaW1zXG4gICAgICAgICAgICB0aHJvdyBJbnZhbGlkSnd0RXJyb3I7XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgaWRzID0ge1xuICAgICAgICAgICAgd29ya2Zsb3dSdW5CYWNrZW5kSWQ6IHNjb3BlUGFydHNbMV0sXG4gICAgICAgICAgICB3b3JrZmxvd0pvYlJ1bkJhY2tlbmRJZDogc2NvcGVQYXJ0c1syXVxuICAgICAgICB9O1xuICAgICAgICBjb3JlLmRlYnVnKGBXb3JrZmxvdyBSdW4gQmFja2VuZCBJRDogJHtpZHMud29ya2Zsb3dSdW5CYWNrZW5kSWR9YCk7XG4gICAgICAgIGNvcmUuZGVidWcoYFdvcmtmbG93IEpvYiBSdW4gQmFja2VuZCBJRDogJHtpZHMud29ya2Zsb3dKb2JSdW5CYWNrZW5kSWR9YCk7XG4gICAgICAgIHJldHVybiBpZHM7XG4gICAgfVxuICAgIHRocm93IEludmFsaWRKd3RFcnJvcjtcbn1cbmV4cG9ydHMuZ2V0QmFja2VuZElkc0Zyb21Ub2tlbiA9IGdldEJhY2tlbmRJZHNGcm9tVG9rZW47XG4vLyMgc291cmNlTWFwcGluZ1VSTD11dGlsLmpzLm1hcCIsCiAgICAiXCJ1c2Ugc3RyaWN0XCI7XG4vLyBDb3B5cmlnaHQgKGMpIE1pY3Jvc29mdCBDb3Jwb3JhdGlvbi5cbi8vIExpY2Vuc2VkIHVuZGVyIHRoZSBNSVQgTGljZW5zZS5cbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIl9fZXNNb2R1bGVcIiwgeyB2YWx1ZTogdHJ1ZSB9KTtcbmV4cG9ydHMuY3JlYXRlRW1wdHlQaXBlbGluZSA9IGNyZWF0ZUVtcHR5UGlwZWxpbmU7XG5jb25zdCBWYWxpZFBoYXNlTmFtZXMgPSBuZXcgU2V0KFtcIkRlc2VyaWFsaXplXCIsIFwiU2VyaWFsaXplXCIsIFwiUmV0cnlcIiwgXCJTaWduXCJdKTtcbi8qKlxuICogQSBwcml2YXRlIGltcGxlbWVudGF0aW9uIG9mIFBpcGVsaW5lLlxuICogRG8gbm90IGV4cG9ydCB0aGlzIGNsYXNzIGZyb20gdGhlIHBhY2thZ2UuXG4gKiBAaW50ZXJuYWxcbiAqL1xuY2xhc3MgSHR0cFBpcGVsaW5lIHtcbiAgICBjb25zdHJ1Y3Rvcihwb2xpY2llcykge1xuICAgICAgICB2YXIgX2E7XG4gICAgICAgIHRoaXMuX3BvbGljaWVzID0gW107XG4gICAgICAgIHRoaXMuX3BvbGljaWVzID0gKF9hID0gcG9saWNpZXMgPT09IG51bGwgfHwgcG9saWNpZXMgPT09IHZvaWQgMCA/IHZvaWQgMCA6IHBvbGljaWVzLnNsaWNlKDApKSAhPT0gbnVsbCAmJiBfYSAhPT0gdm9pZCAwID8gX2EgOiBbXTtcbiAgICAgICAgdGhpcy5fb3JkZXJlZFBvbGljaWVzID0gdW5kZWZpbmVkO1xuICAgIH1cbiAgICBhZGRQb2xpY3kocG9saWN5LCBvcHRpb25zID0ge30pIHtcbiAgICAgICAgaWYgKG9wdGlvbnMucGhhc2UgJiYgb3B0aW9ucy5hZnRlclBoYXNlKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJQb2xpY2llcyBpbnNpZGUgYSBwaGFzZSBjYW5ub3Qgc3BlY2lmeSBhZnRlclBoYXNlLlwiKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAob3B0aW9ucy5waGFzZSAmJiAhVmFsaWRQaGFzZU5hbWVzLmhhcyhvcHRpb25zLnBoYXNlKSkge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBJbnZhbGlkIHBoYXNlIG5hbWU6ICR7b3B0aW9ucy5waGFzZX1gKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAob3B0aW9ucy5hZnRlclBoYXNlICYmICFWYWxpZFBoYXNlTmFtZXMuaGFzKG9wdGlvbnMuYWZ0ZXJQaGFzZSkpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihgSW52YWxpZCBhZnRlclBoYXNlIG5hbWU6ICR7b3B0aW9ucy5hZnRlclBoYXNlfWApO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMuX3BvbGljaWVzLnB1c2goe1xuICAgICAgICAgICAgcG9saWN5LFxuICAgICAgICAgICAgb3B0aW9ucyxcbiAgICAgICAgfSk7XG4gICAgICAgIHRoaXMuX29yZGVyZWRQb2xpY2llcyA9IHVuZGVmaW5lZDtcbiAgICB9XG4gICAgcmVtb3ZlUG9saWN5KG9wdGlvbnMpIHtcbiAgICAgICAgY29uc3QgcmVtb3ZlZFBvbGljaWVzID0gW107XG4gICAgICAgIHRoaXMuX3BvbGljaWVzID0gdGhpcy5fcG9saWNpZXMuZmlsdGVyKChwb2xpY3lEZXNjcmlwdG9yKSA9PiB7XG4gICAgICAgICAgICBpZiAoKG9wdGlvbnMubmFtZSAmJiBwb2xpY3lEZXNjcmlwdG9yLnBvbGljeS5uYW1lID09PSBvcHRpb25zLm5hbWUpIHx8XG4gICAgICAgICAgICAgICAgKG9wdGlvbnMucGhhc2UgJiYgcG9saWN5RGVzY3JpcHRvci5vcHRpb25zLnBoYXNlID09PSBvcHRpb25zLnBoYXNlKSkge1xuICAgICAgICAgICAgICAgIHJlbW92ZWRQb2xpY2llcy5wdXNoKHBvbGljeURlc2NyaXB0b3IucG9saWN5KTtcbiAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgICAgIHRoaXMuX29yZGVyZWRQb2xpY2llcyA9IHVuZGVmaW5lZDtcbiAgICAgICAgcmV0dXJuIHJlbW92ZWRQb2xpY2llcztcbiAgICB9XG4gICAgc2VuZFJlcXVlc3QoaHR0cENsaWVudCwgcmVxdWVzdCkge1xuICAgICAgICBjb25zdCBwb2xpY2llcyA9IHRoaXMuZ2V0T3JkZXJlZFBvbGljaWVzKCk7XG4gICAgICAgIGNvbnN0IHBpcGVsaW5lID0gcG9saWNpZXMucmVkdWNlUmlnaHQoKG5leHQsIHBvbGljeSkgPT4ge1xuICAgICAgICAgICAgcmV0dXJuIChyZXEpID0+IHtcbiAgICAgICAgICAgICAgICByZXR1cm4gcG9saWN5LnNlbmRSZXF1ZXN0KHJlcSwgbmV4dCk7XG4gICAgICAgICAgICB9O1xuICAgICAgICB9LCAocmVxKSA9PiBodHRwQ2xpZW50LnNlbmRSZXF1ZXN0KHJlcSkpO1xuICAgICAgICByZXR1cm4gcGlwZWxpbmUocmVxdWVzdCk7XG4gICAgfVxuICAgIGdldE9yZGVyZWRQb2xpY2llcygpIHtcbiAgICAgICAgaWYgKCF0aGlzLl9vcmRlcmVkUG9saWNpZXMpIHtcbiAgICAgICAgICAgIHRoaXMuX29yZGVyZWRQb2xpY2llcyA9IHRoaXMub3JkZXJQb2xpY2llcygpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB0aGlzLl9vcmRlcmVkUG9saWNpZXM7XG4gICAgfVxuICAgIGNsb25lKCkge1xuICAgICAgICByZXR1cm4gbmV3IEh0dHBQaXBlbGluZSh0aGlzLl9wb2xpY2llcyk7XG4gICAgfVxuICAgIHN0YXRpYyBjcmVhdGUoKSB7XG4gICAgICAgIHJldHVybiBuZXcgSHR0cFBpcGVsaW5lKCk7XG4gICAgfVxuICAgIG9yZGVyUG9saWNpZXMoKSB7XG4gICAgICAgIC8qKlxuICAgICAgICAgKiBUaGUgZ29hbCBvZiB0aGlzIG1ldGhvZCBpcyB0byByZWxpYWJseSBvcmRlciBwaXBlbGluZSBwb2xpY2llc1xuICAgICAgICAgKiBiYXNlZCBvbiB0aGVpciBkZWNsYXJlZCByZXF1aXJlbWVudHMgd2hlbiB0aGV5IHdlcmUgYWRkZWQuXG4gICAgICAgICAqXG4gICAgICAgICAqIE9yZGVyIGlzIGZpcnN0IGRldGVybWluZWQgYnkgcGhhc2U6XG4gICAgICAgICAqXG4gICAgICAgICAqIDEuIFNlcmlhbGl6ZSBQaGFzZVxuICAgICAgICAgKiAyLiBQb2xpY2llcyBub3QgaW4gYSBwaGFzZVxuICAgICAgICAgKiAzLiBEZXNlcmlhbGl6ZSBQaGFzZVxuICAgICAgICAgKiA0LiBSZXRyeSBQaGFzZVxuICAgICAgICAgKiA1LiBTaWduIFBoYXNlXG4gICAgICAgICAqXG4gICAgICAgICAqIFdpdGhpbiBlYWNoIHBoYXNlLCBwb2xpY2llcyBhcmUgZXhlY3V0ZWQgaW4gdGhlIG9yZGVyXG4gICAgICAgICAqIHRoZXkgd2VyZSBhZGRlZCB1bmxlc3MgdGhleSB3ZXJlIHNwZWNpZmllZCB0byBleGVjdXRlXG4gICAgICAgICAqIGJlZm9yZS9hZnRlciBvdGhlciBwb2xpY2llcyBvciBhZnRlciBhIHBhcnRpY3VsYXIgcGhhc2UuXG4gICAgICAgICAqXG4gICAgICAgICAqIFRvIGRldGVybWluZSB0aGUgZmluYWwgb3JkZXIsIHdlIHdpbGwgd2FsayB0aGUgcG9saWN5IGxpc3RcbiAgICAgICAgICogaW4gcGhhc2Ugb3JkZXIgbXVsdGlwbGUgdGltZXMgdW50aWwgYWxsIGRlcGVuZGVuY2llcyBhcmVcbiAgICAgICAgICogc2F0aXNmaWVkLlxuICAgICAgICAgKlxuICAgICAgICAgKiBgYWZ0ZXJQb2xpY2llc2AgYXJlIHRoZSBzZXQgb2YgcG9saWNpZXMgdGhhdCBtdXN0IGJlXG4gICAgICAgICAqIGV4ZWN1dGVkIGJlZm9yZSBhIGdpdmVuIHBvbGljeS4gVGhpcyByZXF1aXJlbWVudCBpc1xuICAgICAgICAgKiBjb25zaWRlcmVkIHNhdGlzZmllZCB3aGVuIGVhY2ggb2YgdGhlIGxpc3RlZCBwb2xpY2llc1xuICAgICAgICAgKiBoYXZlIGJlZW4gc2NoZWR1bGVkLlxuICAgICAgICAgKlxuICAgICAgICAgKiBgYmVmb3JlUG9saWNpZXNgIGFyZSB0aGUgc2V0IG9mIHBvbGljaWVzIHRoYXQgbXVzdCBiZVxuICAgICAgICAgKiBleGVjdXRlZCBhZnRlciBhIGdpdmVuIHBvbGljeS4gU2luY2UgdGhpcyBkZXBlbmRlbmN5XG4gICAgICAgICAqIGNhbiBiZSBleHByZXNzZWQgYnkgY29udmVydGluZyBpdCBpbnRvIGEgZXF1aXZhbGVudFxuICAgICAgICAgKiBgYWZ0ZXJQb2xpY2llc2AgZGVjbGFyYXRpb25zLCB0aGV5IGFyZSBub3JtYWxpemVkXG4gICAgICAgICAqIGludG8gdGhhdCBmb3JtIGZvciBzaW1wbGljaXR5LlxuICAgICAgICAgKlxuICAgICAgICAgKiBBbiBgYWZ0ZXJQaGFzZWAgZGVwZW5kZW5jeSBpcyBjb25zaWRlcmVkIHNhdGlzZmllZCB3aGVuIGFsbFxuICAgICAgICAgKiBwb2xpY2llcyBpbiB0aGF0IHBoYXNlIGhhdmUgc2NoZWR1bGVkLlxuICAgICAgICAgKlxuICAgICAgICAgKi9cbiAgICAgICAgY29uc3QgcmVzdWx0ID0gW107XG4gICAgICAgIC8vIFRyYWNrIGFsbCBwb2xpY2llcyB3ZSBrbm93IGFib3V0LlxuICAgICAgICBjb25zdCBwb2xpY3lNYXAgPSBuZXcgTWFwKCk7XG4gICAgICAgIGZ1bmN0aW9uIGNyZWF0ZVBoYXNlKG5hbWUpIHtcbiAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgbmFtZSxcbiAgICAgICAgICAgICAgICBwb2xpY2llczogbmV3IFNldCgpLFxuICAgICAgICAgICAgICAgIGhhc1J1bjogZmFsc2UsXG4gICAgICAgICAgICAgICAgaGFzQWZ0ZXJQb2xpY2llczogZmFsc2UsXG4gICAgICAgICAgICB9O1xuICAgICAgICB9XG4gICAgICAgIC8vIFRyYWNrIHBvbGljaWVzIGZvciBlYWNoIHBoYXNlLlxuICAgICAgICBjb25zdCBzZXJpYWxpemVQaGFzZSA9IGNyZWF0ZVBoYXNlKFwiU2VyaWFsaXplXCIpO1xuICAgICAgICBjb25zdCBub1BoYXNlID0gY3JlYXRlUGhhc2UoXCJOb25lXCIpO1xuICAgICAgICBjb25zdCBkZXNlcmlhbGl6ZVBoYXNlID0gY3JlYXRlUGhhc2UoXCJEZXNlcmlhbGl6ZVwiKTtcbiAgICAgICAgY29uc3QgcmV0cnlQaGFzZSA9IGNyZWF0ZVBoYXNlKFwiUmV0cnlcIik7XG4gICAgICAgIGNvbnN0IHNpZ25QaGFzZSA9IGNyZWF0ZVBoYXNlKFwiU2lnblwiKTtcbiAgICAgICAgLy8gYSBsaXN0IG9mIHBoYXNlcyBpbiBvcmRlclxuICAgICAgICBjb25zdCBvcmRlcmVkUGhhc2VzID0gW3NlcmlhbGl6ZVBoYXNlLCBub1BoYXNlLCBkZXNlcmlhbGl6ZVBoYXNlLCByZXRyeVBoYXNlLCBzaWduUGhhc2VdO1xuICAgICAgICAvLyBTbWFsbCBoZWxwZXIgZnVuY3Rpb24gdG8gbWFwIHBoYXNlIG5hbWUgdG8gZWFjaCBQaGFzZVxuICAgICAgICBmdW5jdGlvbiBnZXRQaGFzZShwaGFzZSkge1xuICAgICAgICAgICAgaWYgKHBoYXNlID09PSBcIlJldHJ5XCIpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gcmV0cnlQaGFzZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2UgaWYgKHBoYXNlID09PSBcIlNlcmlhbGl6ZVwiKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHNlcmlhbGl6ZVBoYXNlO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSBpZiAocGhhc2UgPT09IFwiRGVzZXJpYWxpemVcIikge1xuICAgICAgICAgICAgICAgIHJldHVybiBkZXNlcmlhbGl6ZVBoYXNlO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSBpZiAocGhhc2UgPT09IFwiU2lnblwiKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHNpZ25QaGFzZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgIHJldHVybiBub1BoYXNlO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIC8vIEZpcnN0IHdhbGsgZWFjaCBwb2xpY3kgYW5kIGNyZWF0ZSBhIG5vZGUgdG8gdHJhY2sgbWV0YWRhdGEuXG4gICAgICAgIGZvciAoY29uc3QgZGVzY3JpcHRvciBvZiB0aGlzLl9wb2xpY2llcykge1xuICAgICAgICAgICAgY29uc3QgcG9saWN5ID0gZGVzY3JpcHRvci5wb2xpY3k7XG4gICAgICAgICAgICBjb25zdCBvcHRpb25zID0gZGVzY3JpcHRvci5vcHRpb25zO1xuICAgICAgICAgICAgY29uc3QgcG9saWN5TmFtZSA9IHBvbGljeS5uYW1lO1xuICAgICAgICAgICAgaWYgKHBvbGljeU1hcC5oYXMocG9saWN5TmFtZSkpIHtcbiAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJEdXBsaWNhdGUgcG9saWN5IG5hbWVzIG5vdCBhbGxvd2VkIGluIHBpcGVsaW5lXCIpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgY29uc3Qgbm9kZSA9IHtcbiAgICAgICAgICAgICAgICBwb2xpY3ksXG4gICAgICAgICAgICAgICAgZGVwZW5kc09uOiBuZXcgU2V0KCksXG4gICAgICAgICAgICAgICAgZGVwZW5kYW50czogbmV3IFNldCgpLFxuICAgICAgICAgICAgfTtcbiAgICAgICAgICAgIGlmIChvcHRpb25zLmFmdGVyUGhhc2UpIHtcbiAgICAgICAgICAgICAgICBub2RlLmFmdGVyUGhhc2UgPSBnZXRQaGFzZShvcHRpb25zLmFmdGVyUGhhc2UpO1xuICAgICAgICAgICAgICAgIG5vZGUuYWZ0ZXJQaGFzZS5oYXNBZnRlclBvbGljaWVzID0gdHJ1ZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHBvbGljeU1hcC5zZXQocG9saWN5TmFtZSwgbm9kZSk7XG4gICAgICAgICAgICBjb25zdCBwaGFzZSA9IGdldFBoYXNlKG9wdGlvbnMucGhhc2UpO1xuICAgICAgICAgICAgcGhhc2UucG9saWNpZXMuYWRkKG5vZGUpO1xuICAgICAgICB9XG4gICAgICAgIC8vIE5vdyB0aGF0IGVhY2ggcG9saWN5IGhhcyBhIG5vZGUsIGNvbm5lY3QgZGVwZW5kZW5jeSByZWZlcmVuY2VzLlxuICAgICAgICBmb3IgKGNvbnN0IGRlc2NyaXB0b3Igb2YgdGhpcy5fcG9saWNpZXMpIHtcbiAgICAgICAgICAgIGNvbnN0IHsgcG9saWN5LCBvcHRpb25zIH0gPSBkZXNjcmlwdG9yO1xuICAgICAgICAgICAgY29uc3QgcG9saWN5TmFtZSA9IHBvbGljeS5uYW1lO1xuICAgICAgICAgICAgY29uc3Qgbm9kZSA9IHBvbGljeU1hcC5nZXQocG9saWN5TmFtZSk7XG4gICAgICAgICAgICBpZiAoIW5vZGUpIHtcbiAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYE1pc3Npbmcgbm9kZSBmb3IgcG9saWN5ICR7cG9saWN5TmFtZX1gKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmIChvcHRpb25zLmFmdGVyUG9saWNpZXMpIHtcbiAgICAgICAgICAgICAgICBmb3IgKGNvbnN0IGFmdGVyUG9saWN5TmFtZSBvZiBvcHRpb25zLmFmdGVyUG9saWNpZXMpIHtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgYWZ0ZXJOb2RlID0gcG9saWN5TWFwLmdldChhZnRlclBvbGljeU5hbWUpO1xuICAgICAgICAgICAgICAgICAgICBpZiAoYWZ0ZXJOb2RlKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBMaW5raW5nIGluIGJvdGggZGlyZWN0aW9ucyBoZWxwcyBsYXRlclxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gd2hlbiB3ZSB3YW50IHRvIG5vdGlmeSBkZXBlbmRhbnRzLlxuICAgICAgICAgICAgICAgICAgICAgICAgbm9kZS5kZXBlbmRzT24uYWRkKGFmdGVyTm9kZSk7XG4gICAgICAgICAgICAgICAgICAgICAgICBhZnRlck5vZGUuZGVwZW5kYW50cy5hZGQobm9kZSk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAob3B0aW9ucy5iZWZvcmVQb2xpY2llcykge1xuICAgICAgICAgICAgICAgIGZvciAoY29uc3QgYmVmb3JlUG9saWN5TmFtZSBvZiBvcHRpb25zLmJlZm9yZVBvbGljaWVzKSB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IGJlZm9yZU5vZGUgPSBwb2xpY3lNYXAuZ2V0KGJlZm9yZVBvbGljeU5hbWUpO1xuICAgICAgICAgICAgICAgICAgICBpZiAoYmVmb3JlTm9kZSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgLy8gVG8gZXhlY3V0ZSBiZWZvcmUgYW5vdGhlciBub2RlLCBtYWtlIGl0XG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBkZXBlbmQgb24gdGhlIGN1cnJlbnQgbm9kZS5cbiAgICAgICAgICAgICAgICAgICAgICAgIGJlZm9yZU5vZGUuZGVwZW5kc09uLmFkZChub2RlKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIG5vZGUuZGVwZW5kYW50cy5hZGQoYmVmb3JlTm9kZSk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgZnVuY3Rpb24gd2Fsa1BoYXNlKHBoYXNlKSB7XG4gICAgICAgICAgICBwaGFzZS5oYXNSdW4gPSB0cnVlO1xuICAgICAgICAgICAgLy8gU2V0cyBpdGVyYXRlIGluIGluc2VydGlvbiBvcmRlclxuICAgICAgICAgICAgZm9yIChjb25zdCBub2RlIG9mIHBoYXNlLnBvbGljaWVzKSB7XG4gICAgICAgICAgICAgICAgaWYgKG5vZGUuYWZ0ZXJQaGFzZSAmJiAoIW5vZGUuYWZ0ZXJQaGFzZS5oYXNSdW4gfHwgbm9kZS5hZnRlclBoYXNlLnBvbGljaWVzLnNpemUpKSB7XG4gICAgICAgICAgICAgICAgICAgIC8vIElmIHRoaXMgbm9kZSBpcyB3YWl0aW5nIG9uIGEgcGhhc2UgdG8gY29tcGxldGUsXG4gICAgICAgICAgICAgICAgICAgIC8vIHdlIG5lZWQgdG8gc2tpcCBpdCBmb3Igbm93LlxuICAgICAgICAgICAgICAgICAgICAvLyBFdmVuIGlmIHRoZSBwaGFzZSBpcyBlbXB0eSwgd2Ugc2hvdWxkIHdhaXQgZm9yIGl0XG4gICAgICAgICAgICAgICAgICAgIC8vIHRvIGJlIHdhbGtlZCB0byBhdm9pZCByZS1vcmRlcmluZyBwb2xpY2llcy5cbiAgICAgICAgICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGlmIChub2RlLmRlcGVuZHNPbi5zaXplID09PSAwKSB7XG4gICAgICAgICAgICAgICAgICAgIC8vIElmIHRoZXJlJ3Mgbm90aGluZyBlbHNlIHdlJ3JlIHdhaXRpbmcgZm9yLCB3ZSBjYW5cbiAgICAgICAgICAgICAgICAgICAgLy8gYWRkIHRoaXMgcG9saWN5IHRvIHRoZSByZXN1bHQgbGlzdC5cbiAgICAgICAgICAgICAgICAgICAgcmVzdWx0LnB1c2gobm9kZS5wb2xpY3kpO1xuICAgICAgICAgICAgICAgICAgICAvLyBOb3RpZnkgYW55dGhpbmcgdGhhdCBkZXBlbmRzIG9uIHRoaXMgcG9saWN5IHRoYXRcbiAgICAgICAgICAgICAgICAgICAgLy8gdGhlIHBvbGljeSBoYXMgYmVlbiBzY2hlZHVsZWQuXG4gICAgICAgICAgICAgICAgICAgIGZvciAoY29uc3QgZGVwZW5kYW50IG9mIG5vZGUuZGVwZW5kYW50cykge1xuICAgICAgICAgICAgICAgICAgICAgICAgZGVwZW5kYW50LmRlcGVuZHNPbi5kZWxldGUobm9kZSk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgcG9saWN5TWFwLmRlbGV0ZShub2RlLnBvbGljeS5uYW1lKTtcbiAgICAgICAgICAgICAgICAgICAgcGhhc2UucG9saWNpZXMuZGVsZXRlKG5vZGUpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBmdW5jdGlvbiB3YWxrUGhhc2VzKCkge1xuICAgICAgICAgICAgZm9yIChjb25zdCBwaGFzZSBvZiBvcmRlcmVkUGhhc2VzKSB7XG4gICAgICAgICAgICAgICAgd2Fsa1BoYXNlKHBoYXNlKTtcbiAgICAgICAgICAgICAgICAvLyBpZiB0aGUgcGhhc2UgaXNuJ3QgY29tcGxldGVcbiAgICAgICAgICAgICAgICBpZiAocGhhc2UucG9saWNpZXMuc2l6ZSA+IDAgJiYgcGhhc2UgIT09IG5vUGhhc2UpIHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKCFub1BoYXNlLmhhc1J1bikge1xuICAgICAgICAgICAgICAgICAgICAgICAgLy8gVHJ5IHJ1bm5pbmcgbm9QaGFzZSB0byBzZWUgaWYgdGhhdCB1bmJsb2NrcyB0aGlzIHBoYXNlIG5leHQgdGljay5cbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIFRoaXMgY2FuIGhhcHBlbiBpZiBhIHBoYXNlIHRoYXQgaGFwcGVucyBiZWZvcmUgbm9QaGFzZVxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gaXMgd2FpdGluZyBvbiBhIG5vUGhhc2UgcG9saWN5IHRvIGNvbXBsZXRlLlxuICAgICAgICAgICAgICAgICAgICAgICAgd2Fsa1BoYXNlKG5vUGhhc2UpO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIC8vIERvbid0IHByb2NlZWQgdG8gdGhlIG5leHQgcGhhc2UgdW50aWwgdGhpcyBwaGFzZSBmaW5pc2hlcy5cbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBpZiAocGhhc2UuaGFzQWZ0ZXJQb2xpY2llcykge1xuICAgICAgICAgICAgICAgICAgICAvLyBSdW4gYW55IHBvbGljaWVzIHVuYmxvY2tlZCBieSB0aGlzIHBoYXNlXG4gICAgICAgICAgICAgICAgICAgIHdhbGtQaGFzZShub1BoYXNlKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgLy8gSXRlcmF0ZSB1bnRpbCB3ZSd2ZSBwdXQgZXZlcnkgbm9kZSBpbiB0aGUgcmVzdWx0IGxpc3QuXG4gICAgICAgIGxldCBpdGVyYXRpb24gPSAwO1xuICAgICAgICB3aGlsZSAocG9saWN5TWFwLnNpemUgPiAwKSB7XG4gICAgICAgICAgICBpdGVyYXRpb24rKztcbiAgICAgICAgICAgIGNvbnN0IGluaXRpYWxSZXN1bHRMZW5ndGggPSByZXN1bHQubGVuZ3RoO1xuICAgICAgICAgICAgLy8gS2VlcCB3YWxraW5nIGVhY2ggcGhhc2UgaW4gb3JkZXIgdW50aWwgd2UgY2FuIG9yZGVyIGV2ZXJ5IG5vZGUuXG4gICAgICAgICAgICB3YWxrUGhhc2VzKCk7XG4gICAgICAgICAgICAvLyBUaGUgcmVzdWx0IGxpc3QgKnNob3VsZCogZ2V0IGF0IGxlYXN0IG9uZSBsYXJnZXIgZWFjaCB0aW1lXG4gICAgICAgICAgICAvLyBhZnRlciB0aGUgZmlyc3QgZnVsbCBwYXNzLlxuICAgICAgICAgICAgLy8gT3RoZXJ3aXNlLCB3ZSdyZSBnb2luZyB0byBsb29wIGZvcmV2ZXIuXG4gICAgICAgICAgICBpZiAocmVzdWx0Lmxlbmd0aCA8PSBpbml0aWFsUmVzdWx0TGVuZ3RoICYmIGl0ZXJhdGlvbiA+IDEpIHtcbiAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJDYW5ub3Qgc2F0aXNmeSBwb2xpY3kgZGVwZW5kZW5jaWVzIGR1ZSB0byByZXF1aXJlbWVudHMgY3ljbGUuXCIpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgfVxufVxuLyoqXG4gKiBDcmVhdGVzIGEgdG90YWxseSBlbXB0eSBwaXBlbGluZS5cbiAqIFVzZWZ1bCBmb3IgdGVzdGluZyBvciBjcmVhdGluZyBhIGN1c3RvbSBvbmUuXG4gKi9cbmZ1bmN0aW9uIGNyZWF0ZUVtcHR5UGlwZWxpbmUoKSB7XG4gICAgcmV0dXJuIEh0dHBQaXBlbGluZS5jcmVhdGUoKTtcbn1cbi8vIyBzb3VyY2VNYXBwaW5nVVJMPXBpcGVsaW5lLmpzLm1hcCIsCiAgICAiLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKlxyXG5Db3B5cmlnaHQgKGMpIE1pY3Jvc29mdCBDb3Jwb3JhdGlvbi5cclxuXHJcblBlcm1pc3Npb24gdG8gdXNlLCBjb3B5LCBtb2RpZnksIGFuZC9vciBkaXN0cmlidXRlIHRoaXMgc29mdHdhcmUgZm9yIGFueVxyXG5wdXJwb3NlIHdpdGggb3Igd2l0aG91dCBmZWUgaXMgaGVyZWJ5IGdyYW50ZWQuXHJcblxyXG5USEUgU09GVFdBUkUgSVMgUFJPVklERUQgXCJBUyBJU1wiIEFORCBUSEUgQVVUSE9SIERJU0NMQUlNUyBBTEwgV0FSUkFOVElFUyBXSVRIXHJcblJFR0FSRCBUTyBUSElTIFNPRlRXQVJFIElOQ0xVRElORyBBTEwgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWVxyXG5BTkQgRklUTkVTUy4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFVVEhPUiBCRSBMSUFCTEUgRk9SIEFOWSBTUEVDSUFMLCBESVJFQ1QsXHJcbklORElSRUNULCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgT1IgQU5ZIERBTUFHRVMgV0hBVFNPRVZFUiBSRVNVTFRJTkcgRlJPTVxyXG5MT1NTIE9GIFVTRSwgREFUQSBPUiBQUk9GSVRTLCBXSEVUSEVSIElOIEFOIEFDVElPTiBPRiBDT05UUkFDVCwgTkVHTElHRU5DRSBPUlxyXG5PVEhFUiBUT1JUSU9VUyBBQ1RJT04sIEFSSVNJTkcgT1VUIE9GIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUgVVNFIE9SXHJcblBFUkZPUk1BTkNFIE9GIFRISVMgU09GVFdBUkUuXHJcbioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqICovXHJcbi8qIGdsb2JhbCBnbG9iYWwsIGRlZmluZSwgU3ltYm9sLCBSZWZsZWN0LCBQcm9taXNlLCBTdXBwcmVzc2VkRXJyb3IsIEl0ZXJhdG9yICovXHJcbnZhciBfX2V4dGVuZHM7XHJcbnZhciBfX2Fzc2lnbjtcclxudmFyIF9fcmVzdDtcclxudmFyIF9fZGVjb3JhdGU7XHJcbnZhciBfX3BhcmFtO1xyXG52YXIgX19lc0RlY29yYXRlO1xyXG52YXIgX19ydW5Jbml0aWFsaXplcnM7XHJcbnZhciBfX3Byb3BLZXk7XHJcbnZhciBfX3NldEZ1bmN0aW9uTmFtZTtcclxudmFyIF9fbWV0YWRhdGE7XHJcbnZhciBfX2F3YWl0ZXI7XHJcbnZhciBfX2dlbmVyYXRvcjtcclxudmFyIF9fZXhwb3J0U3RhcjtcclxudmFyIF9fdmFsdWVzO1xyXG52YXIgX19yZWFkO1xyXG52YXIgX19zcHJlYWQ7XHJcbnZhciBfX3NwcmVhZEFycmF5cztcclxudmFyIF9fc3ByZWFkQXJyYXk7XHJcbnZhciBfX2F3YWl0O1xyXG52YXIgX19hc3luY0dlbmVyYXRvcjtcclxudmFyIF9fYXN5bmNEZWxlZ2F0b3I7XHJcbnZhciBfX2FzeW5jVmFsdWVzO1xyXG52YXIgX19tYWtlVGVtcGxhdGVPYmplY3Q7XHJcbnZhciBfX2ltcG9ydFN0YXI7XHJcbnZhciBfX2ltcG9ydERlZmF1bHQ7XHJcbnZhciBfX2NsYXNzUHJpdmF0ZUZpZWxkR2V0O1xyXG52YXIgX19jbGFzc1ByaXZhdGVGaWVsZFNldDtcclxudmFyIF9fY2xhc3NQcml2YXRlRmllbGRJbjtcclxudmFyIF9fY3JlYXRlQmluZGluZztcclxudmFyIF9fYWRkRGlzcG9zYWJsZVJlc291cmNlO1xyXG52YXIgX19kaXNwb3NlUmVzb3VyY2VzO1xyXG52YXIgX19yZXdyaXRlUmVsYXRpdmVJbXBvcnRFeHRlbnNpb247XHJcbihmdW5jdGlvbiAoZmFjdG9yeSkge1xyXG4gICAgdmFyIHJvb3QgPSB0eXBlb2YgZ2xvYmFsID09PSBcIm9iamVjdFwiID8gZ2xvYmFsIDogdHlwZW9mIHNlbGYgPT09IFwib2JqZWN0XCIgPyBzZWxmIDogdHlwZW9mIHRoaXMgPT09IFwib2JqZWN0XCIgPyB0aGlzIDoge307XHJcbiAgICBpZiAodHlwZW9mIGRlZmluZSA9PT0gXCJmdW5jdGlvblwiICYmIGRlZmluZS5hbWQpIHtcclxuICAgICAgICBkZWZpbmUoXCJ0c2xpYlwiLCBbXCJleHBvcnRzXCJdLCBmdW5jdGlvbiAoZXhwb3J0cykgeyBmYWN0b3J5KGNyZWF0ZUV4cG9ydGVyKHJvb3QsIGNyZWF0ZUV4cG9ydGVyKGV4cG9ydHMpKSk7IH0pO1xyXG4gICAgfVxyXG4gICAgZWxzZSBpZiAodHlwZW9mIG1vZHVsZSA9PT0gXCJvYmplY3RcIiAmJiB0eXBlb2YgbW9kdWxlLmV4cG9ydHMgPT09IFwib2JqZWN0XCIpIHtcclxuICAgICAgICBmYWN0b3J5KGNyZWF0ZUV4cG9ydGVyKHJvb3QsIGNyZWF0ZUV4cG9ydGVyKG1vZHVsZS5leHBvcnRzKSkpO1xyXG4gICAgfVxyXG4gICAgZWxzZSB7XHJcbiAgICAgICAgZmFjdG9yeShjcmVhdGVFeHBvcnRlcihyb290KSk7XHJcbiAgICB9XHJcbiAgICBmdW5jdGlvbiBjcmVhdGVFeHBvcnRlcihleHBvcnRzLCBwcmV2aW91cykge1xyXG4gICAgICAgIGlmIChleHBvcnRzICE9PSByb290KSB7XHJcbiAgICAgICAgICAgIGlmICh0eXBlb2YgT2JqZWN0LmNyZWF0ZSA9PT0gXCJmdW5jdGlvblwiKSB7XHJcbiAgICAgICAgICAgICAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJfX2VzTW9kdWxlXCIsIHsgdmFsdWU6IHRydWUgfSk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgZWxzZSB7XHJcbiAgICAgICAgICAgICAgICBleHBvcnRzLl9fZXNNb2R1bGUgPSB0cnVlO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHJldHVybiBmdW5jdGlvbiAoaWQsIHYpIHsgcmV0dXJuIGV4cG9ydHNbaWRdID0gcHJldmlvdXMgPyBwcmV2aW91cyhpZCwgdikgOiB2OyB9O1xyXG4gICAgfVxyXG59KVxyXG4oZnVuY3Rpb24gKGV4cG9ydGVyKSB7XHJcbiAgICB2YXIgZXh0ZW5kU3RhdGljcyA9IE9iamVjdC5zZXRQcm90b3R5cGVPZiB8fFxyXG4gICAgICAgICh7IF9fcHJvdG9fXzogW10gfSBpbnN0YW5jZW9mIEFycmF5ICYmIGZ1bmN0aW9uIChkLCBiKSB7IGQuX19wcm90b19fID0gYjsgfSkgfHxcclxuICAgICAgICBmdW5jdGlvbiAoZCwgYikgeyBmb3IgKHZhciBwIGluIGIpIGlmIChPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwoYiwgcCkpIGRbcF0gPSBiW3BdOyB9O1xyXG5cclxuICAgIF9fZXh0ZW5kcyA9IGZ1bmN0aW9uIChkLCBiKSB7XHJcbiAgICAgICAgaWYgKHR5cGVvZiBiICE9PSBcImZ1bmN0aW9uXCIgJiYgYiAhPT0gbnVsbClcclxuICAgICAgICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcihcIkNsYXNzIGV4dGVuZHMgdmFsdWUgXCIgKyBTdHJpbmcoYikgKyBcIiBpcyBub3QgYSBjb25zdHJ1Y3RvciBvciBudWxsXCIpO1xyXG4gICAgICAgIGV4dGVuZFN0YXRpY3MoZCwgYik7XHJcbiAgICAgICAgZnVuY3Rpb24gX18oKSB7IHRoaXMuY29uc3RydWN0b3IgPSBkOyB9XHJcbiAgICAgICAgZC5wcm90b3R5cGUgPSBiID09PSBudWxsID8gT2JqZWN0LmNyZWF0ZShiKSA6IChfXy5wcm90b3R5cGUgPSBiLnByb3RvdHlwZSwgbmV3IF9fKCkpO1xyXG4gICAgfTtcclxuXHJcbiAgICBfX2Fzc2lnbiA9IE9iamVjdC5hc3NpZ24gfHwgZnVuY3Rpb24gKHQpIHtcclxuICAgICAgICBmb3IgKHZhciBzLCBpID0gMSwgbiA9IGFyZ3VtZW50cy5sZW5ndGg7IGkgPCBuOyBpKyspIHtcclxuICAgICAgICAgICAgcyA9IGFyZ3VtZW50c1tpXTtcclxuICAgICAgICAgICAgZm9yICh2YXIgcCBpbiBzKSBpZiAoT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKHMsIHApKSB0W3BdID0gc1twXTtcclxuICAgICAgICB9XHJcbiAgICAgICAgcmV0dXJuIHQ7XHJcbiAgICB9O1xyXG5cclxuICAgIF9fcmVzdCA9IGZ1bmN0aW9uIChzLCBlKSB7XHJcbiAgICAgICAgdmFyIHQgPSB7fTtcclxuICAgICAgICBmb3IgKHZhciBwIGluIHMpIGlmIChPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwocywgcCkgJiYgZS5pbmRleE9mKHApIDwgMClcclxuICAgICAgICAgICAgdFtwXSA9IHNbcF07XHJcbiAgICAgICAgaWYgKHMgIT0gbnVsbCAmJiB0eXBlb2YgT2JqZWN0LmdldE93blByb3BlcnR5U3ltYm9scyA9PT0gXCJmdW5jdGlvblwiKVxyXG4gICAgICAgICAgICBmb3IgKHZhciBpID0gMCwgcCA9IE9iamVjdC5nZXRPd25Qcm9wZXJ0eVN5bWJvbHMocyk7IGkgPCBwLmxlbmd0aDsgaSsrKSB7XHJcbiAgICAgICAgICAgICAgICBpZiAoZS5pbmRleE9mKHBbaV0pIDwgMCAmJiBPYmplY3QucHJvdG90eXBlLnByb3BlcnR5SXNFbnVtZXJhYmxlLmNhbGwocywgcFtpXSkpXHJcbiAgICAgICAgICAgICAgICAgICAgdFtwW2ldXSA9IHNbcFtpXV07XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICByZXR1cm4gdDtcclxuICAgIH07XHJcblxyXG4gICAgX19kZWNvcmF0ZSA9IGZ1bmN0aW9uIChkZWNvcmF0b3JzLCB0YXJnZXQsIGtleSwgZGVzYykge1xyXG4gICAgICAgIHZhciBjID0gYXJndW1lbnRzLmxlbmd0aCwgciA9IGMgPCAzID8gdGFyZ2V0IDogZGVzYyA9PT0gbnVsbCA/IGRlc2MgPSBPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKHRhcmdldCwga2V5KSA6IGRlc2MsIGQ7XHJcbiAgICAgICAgaWYgKHR5cGVvZiBSZWZsZWN0ID09PSBcIm9iamVjdFwiICYmIHR5cGVvZiBSZWZsZWN0LmRlY29yYXRlID09PSBcImZ1bmN0aW9uXCIpIHIgPSBSZWZsZWN0LmRlY29yYXRlKGRlY29yYXRvcnMsIHRhcmdldCwga2V5LCBkZXNjKTtcclxuICAgICAgICBlbHNlIGZvciAodmFyIGkgPSBkZWNvcmF0b3JzLmxlbmd0aCAtIDE7IGkgPj0gMDsgaS0tKSBpZiAoZCA9IGRlY29yYXRvcnNbaV0pIHIgPSAoYyA8IDMgPyBkKHIpIDogYyA+IDMgPyBkKHRhcmdldCwga2V5LCByKSA6IGQodGFyZ2V0LCBrZXkpKSB8fCByO1xyXG4gICAgICAgIHJldHVybiBjID4gMyAmJiByICYmIE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0YXJnZXQsIGtleSwgciksIHI7XHJcbiAgICB9O1xyXG5cclxuICAgIF9fcGFyYW0gPSBmdW5jdGlvbiAocGFyYW1JbmRleCwgZGVjb3JhdG9yKSB7XHJcbiAgICAgICAgcmV0dXJuIGZ1bmN0aW9uICh0YXJnZXQsIGtleSkgeyBkZWNvcmF0b3IodGFyZ2V0LCBrZXksIHBhcmFtSW5kZXgpOyB9XHJcbiAgICB9O1xyXG5cclxuICAgIF9fZXNEZWNvcmF0ZSA9IGZ1bmN0aW9uIChjdG9yLCBkZXNjcmlwdG9ySW4sIGRlY29yYXRvcnMsIGNvbnRleHRJbiwgaW5pdGlhbGl6ZXJzLCBleHRyYUluaXRpYWxpemVycykge1xyXG4gICAgICAgIGZ1bmN0aW9uIGFjY2VwdChmKSB7IGlmIChmICE9PSB2b2lkIDAgJiYgdHlwZW9mIGYgIT09IFwiZnVuY3Rpb25cIikgdGhyb3cgbmV3IFR5cGVFcnJvcihcIkZ1bmN0aW9uIGV4cGVjdGVkXCIpOyByZXR1cm4gZjsgfVxyXG4gICAgICAgIHZhciBraW5kID0gY29udGV4dEluLmtpbmQsIGtleSA9IGtpbmQgPT09IFwiZ2V0dGVyXCIgPyBcImdldFwiIDoga2luZCA9PT0gXCJzZXR0ZXJcIiA/IFwic2V0XCIgOiBcInZhbHVlXCI7XHJcbiAgICAgICAgdmFyIHRhcmdldCA9ICFkZXNjcmlwdG9ySW4gJiYgY3RvciA/IGNvbnRleHRJbltcInN0YXRpY1wiXSA/IGN0b3IgOiBjdG9yLnByb3RvdHlwZSA6IG51bGw7XHJcbiAgICAgICAgdmFyIGRlc2NyaXB0b3IgPSBkZXNjcmlwdG9ySW4gfHwgKHRhcmdldCA/IE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IodGFyZ2V0LCBjb250ZXh0SW4ubmFtZSkgOiB7fSk7XHJcbiAgICAgICAgdmFyIF8sIGRvbmUgPSBmYWxzZTtcclxuICAgICAgICBmb3IgKHZhciBpID0gZGVjb3JhdG9ycy5sZW5ndGggLSAxOyBpID49IDA7IGktLSkge1xyXG4gICAgICAgICAgICB2YXIgY29udGV4dCA9IHt9O1xyXG4gICAgICAgICAgICBmb3IgKHZhciBwIGluIGNvbnRleHRJbikgY29udGV4dFtwXSA9IHAgPT09IFwiYWNjZXNzXCIgPyB7fSA6IGNvbnRleHRJbltwXTtcclxuICAgICAgICAgICAgZm9yICh2YXIgcCBpbiBjb250ZXh0SW4uYWNjZXNzKSBjb250ZXh0LmFjY2Vzc1twXSA9IGNvbnRleHRJbi5hY2Nlc3NbcF07XHJcbiAgICAgICAgICAgIGNvbnRleHQuYWRkSW5pdGlhbGl6ZXIgPSBmdW5jdGlvbiAoZikgeyBpZiAoZG9uZSkgdGhyb3cgbmV3IFR5cGVFcnJvcihcIkNhbm5vdCBhZGQgaW5pdGlhbGl6ZXJzIGFmdGVyIGRlY29yYXRpb24gaGFzIGNvbXBsZXRlZFwiKTsgZXh0cmFJbml0aWFsaXplcnMucHVzaChhY2NlcHQoZiB8fCBudWxsKSk7IH07XHJcbiAgICAgICAgICAgIHZhciByZXN1bHQgPSAoMCwgZGVjb3JhdG9yc1tpXSkoa2luZCA9PT0gXCJhY2Nlc3NvclwiID8geyBnZXQ6IGRlc2NyaXB0b3IuZ2V0LCBzZXQ6IGRlc2NyaXB0b3Iuc2V0IH0gOiBkZXNjcmlwdG9yW2tleV0sIGNvbnRleHQpO1xyXG4gICAgICAgICAgICBpZiAoa2luZCA9PT0gXCJhY2Nlc3NvclwiKSB7XHJcbiAgICAgICAgICAgICAgICBpZiAocmVzdWx0ID09PSB2b2lkIDApIGNvbnRpbnVlO1xyXG4gICAgICAgICAgICAgICAgaWYgKHJlc3VsdCA9PT0gbnVsbCB8fCB0eXBlb2YgcmVzdWx0ICE9PSBcIm9iamVjdFwiKSB0aHJvdyBuZXcgVHlwZUVycm9yKFwiT2JqZWN0IGV4cGVjdGVkXCIpO1xyXG4gICAgICAgICAgICAgICAgaWYgKF8gPSBhY2NlcHQocmVzdWx0LmdldCkpIGRlc2NyaXB0b3IuZ2V0ID0gXztcclxuICAgICAgICAgICAgICAgIGlmIChfID0gYWNjZXB0KHJlc3VsdC5zZXQpKSBkZXNjcmlwdG9yLnNldCA9IF87XHJcbiAgICAgICAgICAgICAgICBpZiAoXyA9IGFjY2VwdChyZXN1bHQuaW5pdCkpIGluaXRpYWxpemVycy51bnNoaWZ0KF8pO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGVsc2UgaWYgKF8gPSBhY2NlcHQocmVzdWx0KSkge1xyXG4gICAgICAgICAgICAgICAgaWYgKGtpbmQgPT09IFwiZmllbGRcIikgaW5pdGlhbGl6ZXJzLnVuc2hpZnQoXyk7XHJcbiAgICAgICAgICAgICAgICBlbHNlIGRlc2NyaXB0b3Jba2V5XSA9IF87XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICAgICAgaWYgKHRhcmdldCkgT2JqZWN0LmRlZmluZVByb3BlcnR5KHRhcmdldCwgY29udGV4dEluLm5hbWUsIGRlc2NyaXB0b3IpO1xyXG4gICAgICAgIGRvbmUgPSB0cnVlO1xyXG4gICAgfTtcclxuXHJcbiAgICBfX3J1bkluaXRpYWxpemVycyA9IGZ1bmN0aW9uICh0aGlzQXJnLCBpbml0aWFsaXplcnMsIHZhbHVlKSB7XHJcbiAgICAgICAgdmFyIHVzZVZhbHVlID0gYXJndW1lbnRzLmxlbmd0aCA+IDI7XHJcbiAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBpbml0aWFsaXplcnMubGVuZ3RoOyBpKyspIHtcclxuICAgICAgICAgICAgdmFsdWUgPSB1c2VWYWx1ZSA/IGluaXRpYWxpemVyc1tpXS5jYWxsKHRoaXNBcmcsIHZhbHVlKSA6IGluaXRpYWxpemVyc1tpXS5jYWxsKHRoaXNBcmcpO1xyXG4gICAgICAgIH1cclxuICAgICAgICByZXR1cm4gdXNlVmFsdWUgPyB2YWx1ZSA6IHZvaWQgMDtcclxuICAgIH07XHJcblxyXG4gICAgX19wcm9wS2V5ID0gZnVuY3Rpb24gKHgpIHtcclxuICAgICAgICByZXR1cm4gdHlwZW9mIHggPT09IFwic3ltYm9sXCIgPyB4IDogXCJcIi5jb25jYXQoeCk7XHJcbiAgICB9O1xyXG5cclxuICAgIF9fc2V0RnVuY3Rpb25OYW1lID0gZnVuY3Rpb24gKGYsIG5hbWUsIHByZWZpeCkge1xyXG4gICAgICAgIGlmICh0eXBlb2YgbmFtZSA9PT0gXCJzeW1ib2xcIikgbmFtZSA9IG5hbWUuZGVzY3JpcHRpb24gPyBcIltcIi5jb25jYXQobmFtZS5kZXNjcmlwdGlvbiwgXCJdXCIpIDogXCJcIjtcclxuICAgICAgICByZXR1cm4gT2JqZWN0LmRlZmluZVByb3BlcnR5KGYsIFwibmFtZVwiLCB7IGNvbmZpZ3VyYWJsZTogdHJ1ZSwgdmFsdWU6IHByZWZpeCA/IFwiXCIuY29uY2F0KHByZWZpeCwgXCIgXCIsIG5hbWUpIDogbmFtZSB9KTtcclxuICAgIH07XHJcblxyXG4gICAgX19tZXRhZGF0YSA9IGZ1bmN0aW9uIChtZXRhZGF0YUtleSwgbWV0YWRhdGFWYWx1ZSkge1xyXG4gICAgICAgIGlmICh0eXBlb2YgUmVmbGVjdCA9PT0gXCJvYmplY3RcIiAmJiB0eXBlb2YgUmVmbGVjdC5tZXRhZGF0YSA9PT0gXCJmdW5jdGlvblwiKSByZXR1cm4gUmVmbGVjdC5tZXRhZGF0YShtZXRhZGF0YUtleSwgbWV0YWRhdGFWYWx1ZSk7XHJcbiAgICB9O1xyXG5cclxuICAgIF9fYXdhaXRlciA9IGZ1bmN0aW9uICh0aGlzQXJnLCBfYXJndW1lbnRzLCBQLCBnZW5lcmF0b3IpIHtcclxuICAgICAgICBmdW5jdGlvbiBhZG9wdCh2YWx1ZSkgeyByZXR1cm4gdmFsdWUgaW5zdGFuY2VvZiBQID8gdmFsdWUgOiBuZXcgUChmdW5jdGlvbiAocmVzb2x2ZSkgeyByZXNvbHZlKHZhbHVlKTsgfSk7IH1cclxuICAgICAgICByZXR1cm4gbmV3IChQIHx8IChQID0gUHJvbWlzZSkpKGZ1bmN0aW9uIChyZXNvbHZlLCByZWplY3QpIHtcclxuICAgICAgICAgICAgZnVuY3Rpb24gZnVsZmlsbGVkKHZhbHVlKSB7IHRyeSB7IHN0ZXAoZ2VuZXJhdG9yLm5leHQodmFsdWUpKTsgfSBjYXRjaCAoZSkgeyByZWplY3QoZSk7IH0gfVxyXG4gICAgICAgICAgICBmdW5jdGlvbiByZWplY3RlZCh2YWx1ZSkgeyB0cnkgeyBzdGVwKGdlbmVyYXRvcltcInRocm93XCJdKHZhbHVlKSk7IH0gY2F0Y2ggKGUpIHsgcmVqZWN0KGUpOyB9IH1cclxuICAgICAgICAgICAgZnVuY3Rpb24gc3RlcChyZXN1bHQpIHsgcmVzdWx0LmRvbmUgPyByZXNvbHZlKHJlc3VsdC52YWx1ZSkgOiBhZG9wdChyZXN1bHQudmFsdWUpLnRoZW4oZnVsZmlsbGVkLCByZWplY3RlZCk7IH1cclxuICAgICAgICAgICAgc3RlcCgoZ2VuZXJhdG9yID0gZ2VuZXJhdG9yLmFwcGx5KHRoaXNBcmcsIF9hcmd1bWVudHMgfHwgW10pKS5uZXh0KCkpO1xyXG4gICAgICAgIH0pO1xyXG4gICAgfTtcclxuXHJcbiAgICBfX2dlbmVyYXRvciA9IGZ1bmN0aW9uICh0aGlzQXJnLCBib2R5KSB7XHJcbiAgICAgICAgdmFyIF8gPSB7IGxhYmVsOiAwLCBzZW50OiBmdW5jdGlvbigpIHsgaWYgKHRbMF0gJiAxKSB0aHJvdyB0WzFdOyByZXR1cm4gdFsxXTsgfSwgdHJ5czogW10sIG9wczogW10gfSwgZiwgeSwgdCwgZyA9IE9iamVjdC5jcmVhdGUoKHR5cGVvZiBJdGVyYXRvciA9PT0gXCJmdW5jdGlvblwiID8gSXRlcmF0b3IgOiBPYmplY3QpLnByb3RvdHlwZSk7XHJcbiAgICAgICAgcmV0dXJuIGcubmV4dCA9IHZlcmIoMCksIGdbXCJ0aHJvd1wiXSA9IHZlcmIoMSksIGdbXCJyZXR1cm5cIl0gPSB2ZXJiKDIpLCB0eXBlb2YgU3ltYm9sID09PSBcImZ1bmN0aW9uXCIgJiYgKGdbU3ltYm9sLml0ZXJhdG9yXSA9IGZ1bmN0aW9uKCkgeyByZXR1cm4gdGhpczsgfSksIGc7XHJcbiAgICAgICAgZnVuY3Rpb24gdmVyYihuKSB7IHJldHVybiBmdW5jdGlvbiAodikgeyByZXR1cm4gc3RlcChbbiwgdl0pOyB9OyB9XHJcbiAgICAgICAgZnVuY3Rpb24gc3RlcChvcCkge1xyXG4gICAgICAgICAgICBpZiAoZikgdGhyb3cgbmV3IFR5cGVFcnJvcihcIkdlbmVyYXRvciBpcyBhbHJlYWR5IGV4ZWN1dGluZy5cIik7XHJcbiAgICAgICAgICAgIHdoaWxlIChnICYmIChnID0gMCwgb3BbMF0gJiYgKF8gPSAwKSksIF8pIHRyeSB7XHJcbiAgICAgICAgICAgICAgICBpZiAoZiA9IDEsIHkgJiYgKHQgPSBvcFswXSAmIDIgPyB5W1wicmV0dXJuXCJdIDogb3BbMF0gPyB5W1widGhyb3dcIl0gfHwgKCh0ID0geVtcInJldHVyblwiXSkgJiYgdC5jYWxsKHkpLCAwKSA6IHkubmV4dCkgJiYgISh0ID0gdC5jYWxsKHksIG9wWzFdKSkuZG9uZSkgcmV0dXJuIHQ7XHJcbiAgICAgICAgICAgICAgICBpZiAoeSA9IDAsIHQpIG9wID0gW29wWzBdICYgMiwgdC52YWx1ZV07XHJcbiAgICAgICAgICAgICAgICBzd2l0Y2ggKG9wWzBdKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgY2FzZSAwOiBjYXNlIDE6IHQgPSBvcDsgYnJlYWs7XHJcbiAgICAgICAgICAgICAgICAgICAgY2FzZSA0OiBfLmxhYmVsKys7IHJldHVybiB7IHZhbHVlOiBvcFsxXSwgZG9uZTogZmFsc2UgfTtcclxuICAgICAgICAgICAgICAgICAgICBjYXNlIDU6IF8ubGFiZWwrKzsgeSA9IG9wWzFdOyBvcCA9IFswXTsgY29udGludWU7XHJcbiAgICAgICAgICAgICAgICAgICAgY2FzZSA3OiBvcCA9IF8ub3BzLnBvcCgpOyBfLnRyeXMucG9wKCk7IGNvbnRpbnVlO1xyXG4gICAgICAgICAgICAgICAgICAgIGRlZmF1bHQ6XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmICghKHQgPSBfLnRyeXMsIHQgPSB0Lmxlbmd0aCA+IDAgJiYgdFt0Lmxlbmd0aCAtIDFdKSAmJiAob3BbMF0gPT09IDYgfHwgb3BbMF0gPT09IDIpKSB7IF8gPSAwOyBjb250aW51ZTsgfVxyXG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAob3BbMF0gPT09IDMgJiYgKCF0IHx8IChvcFsxXSA+IHRbMF0gJiYgb3BbMV0gPCB0WzNdKSkpIHsgXy5sYWJlbCA9IG9wWzFdOyBicmVhazsgfVxyXG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAob3BbMF0gPT09IDYgJiYgXy5sYWJlbCA8IHRbMV0pIHsgXy5sYWJlbCA9IHRbMV07IHQgPSBvcDsgYnJlYWs7IH1cclxuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHQgJiYgXy5sYWJlbCA8IHRbMl0pIHsgXy5sYWJlbCA9IHRbMl07IF8ub3BzLnB1c2gob3ApOyBicmVhazsgfVxyXG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAodFsyXSkgXy5vcHMucG9wKCk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIF8udHJ5cy5wb3AoKTsgY29udGludWU7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICBvcCA9IGJvZHkuY2FsbCh0aGlzQXJnLCBfKTtcclxuICAgICAgICAgICAgfSBjYXRjaCAoZSkgeyBvcCA9IFs2LCBlXTsgeSA9IDA7IH0gZmluYWxseSB7IGYgPSB0ID0gMDsgfVxyXG4gICAgICAgICAgICBpZiAob3BbMF0gJiA1KSB0aHJvdyBvcFsxXTsgcmV0dXJuIHsgdmFsdWU6IG9wWzBdID8gb3BbMV0gOiB2b2lkIDAsIGRvbmU6IHRydWUgfTtcclxuICAgICAgICB9XHJcbiAgICB9O1xyXG5cclxuICAgIF9fZXhwb3J0U3RhciA9IGZ1bmN0aW9uKG0sIG8pIHtcclxuICAgICAgICBmb3IgKHZhciBwIGluIG0pIGlmIChwICE9PSBcImRlZmF1bHRcIiAmJiAhT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKG8sIHApKSBfX2NyZWF0ZUJpbmRpbmcobywgbSwgcCk7XHJcbiAgICB9O1xyXG5cclxuICAgIF9fY3JlYXRlQmluZGluZyA9IE9iamVjdC5jcmVhdGUgPyAoZnVuY3Rpb24obywgbSwgaywgazIpIHtcclxuICAgICAgICBpZiAoazIgPT09IHVuZGVmaW5lZCkgazIgPSBrO1xyXG4gICAgICAgIHZhciBkZXNjID0gT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcihtLCBrKTtcclxuICAgICAgICBpZiAoIWRlc2MgfHwgKFwiZ2V0XCIgaW4gZGVzYyA/ICFtLl9fZXNNb2R1bGUgOiBkZXNjLndyaXRhYmxlIHx8IGRlc2MuY29uZmlndXJhYmxlKSkge1xyXG4gICAgICAgICAgICBkZXNjID0geyBlbnVtZXJhYmxlOiB0cnVlLCBnZXQ6IGZ1bmN0aW9uKCkgeyByZXR1cm4gbVtrXTsgfSB9O1xyXG4gICAgICAgIH1cclxuICAgICAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkobywgazIsIGRlc2MpO1xyXG4gICAgfSkgOiAoZnVuY3Rpb24obywgbSwgaywgazIpIHtcclxuICAgICAgICBpZiAoazIgPT09IHVuZGVmaW5lZCkgazIgPSBrO1xyXG4gICAgICAgIG9bazJdID0gbVtrXTtcclxuICAgIH0pO1xyXG5cclxuICAgIF9fdmFsdWVzID0gZnVuY3Rpb24gKG8pIHtcclxuICAgICAgICB2YXIgcyA9IHR5cGVvZiBTeW1ib2wgPT09IFwiZnVuY3Rpb25cIiAmJiBTeW1ib2wuaXRlcmF0b3IsIG0gPSBzICYmIG9bc10sIGkgPSAwO1xyXG4gICAgICAgIGlmIChtKSByZXR1cm4gbS5jYWxsKG8pO1xyXG4gICAgICAgIGlmIChvICYmIHR5cGVvZiBvLmxlbmd0aCA9PT0gXCJudW1iZXJcIikgcmV0dXJuIHtcclxuICAgICAgICAgICAgbmV4dDogZnVuY3Rpb24gKCkge1xyXG4gICAgICAgICAgICAgICAgaWYgKG8gJiYgaSA+PSBvLmxlbmd0aCkgbyA9IHZvaWQgMDtcclxuICAgICAgICAgICAgICAgIHJldHVybiB7IHZhbHVlOiBvICYmIG9baSsrXSwgZG9uZTogIW8gfTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH07XHJcbiAgICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcihzID8gXCJPYmplY3QgaXMgbm90IGl0ZXJhYmxlLlwiIDogXCJTeW1ib2wuaXRlcmF0b3IgaXMgbm90IGRlZmluZWQuXCIpO1xyXG4gICAgfTtcclxuXHJcbiAgICBfX3JlYWQgPSBmdW5jdGlvbiAobywgbikge1xyXG4gICAgICAgIHZhciBtID0gdHlwZW9mIFN5bWJvbCA9PT0gXCJmdW5jdGlvblwiICYmIG9bU3ltYm9sLml0ZXJhdG9yXTtcclxuICAgICAgICBpZiAoIW0pIHJldHVybiBvO1xyXG4gICAgICAgIHZhciBpID0gbS5jYWxsKG8pLCByLCBhciA9IFtdLCBlO1xyXG4gICAgICAgIHRyeSB7XHJcbiAgICAgICAgICAgIHdoaWxlICgobiA9PT0gdm9pZCAwIHx8IG4tLSA+IDApICYmICEociA9IGkubmV4dCgpKS5kb25lKSBhci5wdXNoKHIudmFsdWUpO1xyXG4gICAgICAgIH1cclxuICAgICAgICBjYXRjaCAoZXJyb3IpIHsgZSA9IHsgZXJyb3I6IGVycm9yIH07IH1cclxuICAgICAgICBmaW5hbGx5IHtcclxuICAgICAgICAgICAgdHJ5IHtcclxuICAgICAgICAgICAgICAgIGlmIChyICYmICFyLmRvbmUgJiYgKG0gPSBpW1wicmV0dXJuXCJdKSkgbS5jYWxsKGkpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGZpbmFsbHkgeyBpZiAoZSkgdGhyb3cgZS5lcnJvcjsgfVxyXG4gICAgICAgIH1cclxuICAgICAgICByZXR1cm4gYXI7XHJcbiAgICB9O1xyXG5cclxuICAgIC8qKiBAZGVwcmVjYXRlZCAqL1xyXG4gICAgX19zcHJlYWQgPSBmdW5jdGlvbiAoKSB7XHJcbiAgICAgICAgZm9yICh2YXIgYXIgPSBbXSwgaSA9IDA7IGkgPCBhcmd1bWVudHMubGVuZ3RoOyBpKyspXHJcbiAgICAgICAgICAgIGFyID0gYXIuY29uY2F0KF9fcmVhZChhcmd1bWVudHNbaV0pKTtcclxuICAgICAgICByZXR1cm4gYXI7XHJcbiAgICB9O1xyXG5cclxuICAgIC8qKiBAZGVwcmVjYXRlZCAqL1xyXG4gICAgX19zcHJlYWRBcnJheXMgPSBmdW5jdGlvbiAoKSB7XHJcbiAgICAgICAgZm9yICh2YXIgcyA9IDAsIGkgPSAwLCBpbCA9IGFyZ3VtZW50cy5sZW5ndGg7IGkgPCBpbDsgaSsrKSBzICs9IGFyZ3VtZW50c1tpXS5sZW5ndGg7XHJcbiAgICAgICAgZm9yICh2YXIgciA9IEFycmF5KHMpLCBrID0gMCwgaSA9IDA7IGkgPCBpbDsgaSsrKVxyXG4gICAgICAgICAgICBmb3IgKHZhciBhID0gYXJndW1lbnRzW2ldLCBqID0gMCwgamwgPSBhLmxlbmd0aDsgaiA8IGpsOyBqKyssIGsrKylcclxuICAgICAgICAgICAgICAgIHJba10gPSBhW2pdO1xyXG4gICAgICAgIHJldHVybiByO1xyXG4gICAgfTtcclxuXHJcbiAgICBfX3NwcmVhZEFycmF5ID0gZnVuY3Rpb24gKHRvLCBmcm9tLCBwYWNrKSB7XHJcbiAgICAgICAgaWYgKHBhY2sgfHwgYXJndW1lbnRzLmxlbmd0aCA9PT0gMikgZm9yICh2YXIgaSA9IDAsIGwgPSBmcm9tLmxlbmd0aCwgYXI7IGkgPCBsOyBpKyspIHtcclxuICAgICAgICAgICAgaWYgKGFyIHx8ICEoaSBpbiBmcm9tKSkge1xyXG4gICAgICAgICAgICAgICAgaWYgKCFhcikgYXIgPSBBcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChmcm9tLCAwLCBpKTtcclxuICAgICAgICAgICAgICAgIGFyW2ldID0gZnJvbVtpXTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgICAgICByZXR1cm4gdG8uY29uY2F0KGFyIHx8IEFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGZyb20pKTtcclxuICAgIH07XHJcblxyXG4gICAgX19hd2FpdCA9IGZ1bmN0aW9uICh2KSB7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMgaW5zdGFuY2VvZiBfX2F3YWl0ID8gKHRoaXMudiA9IHYsIHRoaXMpIDogbmV3IF9fYXdhaXQodik7XHJcbiAgICB9O1xyXG5cclxuICAgIF9fYXN5bmNHZW5lcmF0b3IgPSBmdW5jdGlvbiAodGhpc0FyZywgX2FyZ3VtZW50cywgZ2VuZXJhdG9yKSB7XHJcbiAgICAgICAgaWYgKCFTeW1ib2wuYXN5bmNJdGVyYXRvcikgdGhyb3cgbmV3IFR5cGVFcnJvcihcIlN5bWJvbC5hc3luY0l0ZXJhdG9yIGlzIG5vdCBkZWZpbmVkLlwiKTtcclxuICAgICAgICB2YXIgZyA9IGdlbmVyYXRvci5hcHBseSh0aGlzQXJnLCBfYXJndW1lbnRzIHx8IFtdKSwgaSwgcSA9IFtdO1xyXG4gICAgICAgIHJldHVybiBpID0gT2JqZWN0LmNyZWF0ZSgodHlwZW9mIEFzeW5jSXRlcmF0b3IgPT09IFwiZnVuY3Rpb25cIiA/IEFzeW5jSXRlcmF0b3IgOiBPYmplY3QpLnByb3RvdHlwZSksIHZlcmIoXCJuZXh0XCIpLCB2ZXJiKFwidGhyb3dcIiksIHZlcmIoXCJyZXR1cm5cIiwgYXdhaXRSZXR1cm4pLCBpW1N5bWJvbC5hc3luY0l0ZXJhdG9yXSA9IGZ1bmN0aW9uICgpIHsgcmV0dXJuIHRoaXM7IH0sIGk7XHJcbiAgICAgICAgZnVuY3Rpb24gYXdhaXRSZXR1cm4oZikgeyByZXR1cm4gZnVuY3Rpb24gKHYpIHsgcmV0dXJuIFByb21pc2UucmVzb2x2ZSh2KS50aGVuKGYsIHJlamVjdCk7IH07IH1cclxuICAgICAgICBmdW5jdGlvbiB2ZXJiKG4sIGYpIHsgaWYgKGdbbl0pIHsgaVtuXSA9IGZ1bmN0aW9uICh2KSB7IHJldHVybiBuZXcgUHJvbWlzZShmdW5jdGlvbiAoYSwgYikgeyBxLnB1c2goW24sIHYsIGEsIGJdKSA+IDEgfHwgcmVzdW1lKG4sIHYpOyB9KTsgfTsgaWYgKGYpIGlbbl0gPSBmKGlbbl0pOyB9IH1cclxuICAgICAgICBmdW5jdGlvbiByZXN1bWUobiwgdikgeyB0cnkgeyBzdGVwKGdbbl0odikpOyB9IGNhdGNoIChlKSB7IHNldHRsZShxWzBdWzNdLCBlKTsgfSB9XHJcbiAgICAgICAgZnVuY3Rpb24gc3RlcChyKSB7IHIudmFsdWUgaW5zdGFuY2VvZiBfX2F3YWl0ID8gUHJvbWlzZS5yZXNvbHZlKHIudmFsdWUudikudGhlbihmdWxmaWxsLCByZWplY3QpIDogc2V0dGxlKHFbMF1bMl0sIHIpOyB9XHJcbiAgICAgICAgZnVuY3Rpb24gZnVsZmlsbCh2YWx1ZSkgeyByZXN1bWUoXCJuZXh0XCIsIHZhbHVlKTsgfVxyXG4gICAgICAgIGZ1bmN0aW9uIHJlamVjdCh2YWx1ZSkgeyByZXN1bWUoXCJ0aHJvd1wiLCB2YWx1ZSk7IH1cclxuICAgICAgICBmdW5jdGlvbiBzZXR0bGUoZiwgdikgeyBpZiAoZih2KSwgcS5zaGlmdCgpLCBxLmxlbmd0aCkgcmVzdW1lKHFbMF1bMF0sIHFbMF1bMV0pOyB9XHJcbiAgICB9O1xyXG5cclxuICAgIF9fYXN5bmNEZWxlZ2F0b3IgPSBmdW5jdGlvbiAobykge1xyXG4gICAgICAgIHZhciBpLCBwO1xyXG4gICAgICAgIHJldHVybiBpID0ge30sIHZlcmIoXCJuZXh0XCIpLCB2ZXJiKFwidGhyb3dcIiwgZnVuY3Rpb24gKGUpIHsgdGhyb3cgZTsgfSksIHZlcmIoXCJyZXR1cm5cIiksIGlbU3ltYm9sLml0ZXJhdG9yXSA9IGZ1bmN0aW9uICgpIHsgcmV0dXJuIHRoaXM7IH0sIGk7XHJcbiAgICAgICAgZnVuY3Rpb24gdmVyYihuLCBmKSB7IGlbbl0gPSBvW25dID8gZnVuY3Rpb24gKHYpIHsgcmV0dXJuIChwID0gIXApID8geyB2YWx1ZTogX19hd2FpdChvW25dKHYpKSwgZG9uZTogZmFsc2UgfSA6IGYgPyBmKHYpIDogdjsgfSA6IGY7IH1cclxuICAgIH07XHJcblxyXG4gICAgX19hc3luY1ZhbHVlcyA9IGZ1bmN0aW9uIChvKSB7XHJcbiAgICAgICAgaWYgKCFTeW1ib2wuYXN5bmNJdGVyYXRvcikgdGhyb3cgbmV3IFR5cGVFcnJvcihcIlN5bWJvbC5hc3luY0l0ZXJhdG9yIGlzIG5vdCBkZWZpbmVkLlwiKTtcclxuICAgICAgICB2YXIgbSA9IG9bU3ltYm9sLmFzeW5jSXRlcmF0b3JdLCBpO1xyXG4gICAgICAgIHJldHVybiBtID8gbS5jYWxsKG8pIDogKG8gPSB0eXBlb2YgX192YWx1ZXMgPT09IFwiZnVuY3Rpb25cIiA/IF9fdmFsdWVzKG8pIDogb1tTeW1ib2wuaXRlcmF0b3JdKCksIGkgPSB7fSwgdmVyYihcIm5leHRcIiksIHZlcmIoXCJ0aHJvd1wiKSwgdmVyYihcInJldHVyblwiKSwgaVtTeW1ib2wuYXN5bmNJdGVyYXRvcl0gPSBmdW5jdGlvbiAoKSB7IHJldHVybiB0aGlzOyB9LCBpKTtcclxuICAgICAgICBmdW5jdGlvbiB2ZXJiKG4pIHsgaVtuXSA9IG9bbl0gJiYgZnVuY3Rpb24gKHYpIHsgcmV0dXJuIG5ldyBQcm9taXNlKGZ1bmN0aW9uIChyZXNvbHZlLCByZWplY3QpIHsgdiA9IG9bbl0odiksIHNldHRsZShyZXNvbHZlLCByZWplY3QsIHYuZG9uZSwgdi52YWx1ZSk7IH0pOyB9OyB9XHJcbiAgICAgICAgZnVuY3Rpb24gc2V0dGxlKHJlc29sdmUsIHJlamVjdCwgZCwgdikgeyBQcm9taXNlLnJlc29sdmUodikudGhlbihmdW5jdGlvbih2KSB7IHJlc29sdmUoeyB2YWx1ZTogdiwgZG9uZTogZCB9KTsgfSwgcmVqZWN0KTsgfVxyXG4gICAgfTtcclxuXHJcbiAgICBfX21ha2VUZW1wbGF0ZU9iamVjdCA9IGZ1bmN0aW9uIChjb29rZWQsIHJhdykge1xyXG4gICAgICAgIGlmIChPYmplY3QuZGVmaW5lUHJvcGVydHkpIHsgT2JqZWN0LmRlZmluZVByb3BlcnR5KGNvb2tlZCwgXCJyYXdcIiwgeyB2YWx1ZTogcmF3IH0pOyB9IGVsc2UgeyBjb29rZWQucmF3ID0gcmF3OyB9XHJcbiAgICAgICAgcmV0dXJuIGNvb2tlZDtcclxuICAgIH07XHJcblxyXG4gICAgdmFyIF9fc2V0TW9kdWxlRGVmYXVsdCA9IE9iamVjdC5jcmVhdGUgPyAoZnVuY3Rpb24obywgdikge1xyXG4gICAgICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShvLCBcImRlZmF1bHRcIiwgeyBlbnVtZXJhYmxlOiB0cnVlLCB2YWx1ZTogdiB9KTtcclxuICAgIH0pIDogZnVuY3Rpb24obywgdikge1xyXG4gICAgICAgIG9bXCJkZWZhdWx0XCJdID0gdjtcclxuICAgIH07XHJcblxyXG4gICAgX19pbXBvcnRTdGFyID0gZnVuY3Rpb24gKG1vZCkge1xyXG4gICAgICAgIGlmIChtb2QgJiYgbW9kLl9fZXNNb2R1bGUpIHJldHVybiBtb2Q7XHJcbiAgICAgICAgdmFyIHJlc3VsdCA9IHt9O1xyXG4gICAgICAgIGlmIChtb2QgIT0gbnVsbCkgZm9yICh2YXIgayBpbiBtb2QpIGlmIChrICE9PSBcImRlZmF1bHRcIiAmJiBPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwobW9kLCBrKSkgX19jcmVhdGVCaW5kaW5nKHJlc3VsdCwgbW9kLCBrKTtcclxuICAgICAgICBfX3NldE1vZHVsZURlZmF1bHQocmVzdWx0LCBtb2QpO1xyXG4gICAgICAgIHJldHVybiByZXN1bHQ7XHJcbiAgICB9O1xyXG5cclxuICAgIF9faW1wb3J0RGVmYXVsdCA9IGZ1bmN0aW9uIChtb2QpIHtcclxuICAgICAgICByZXR1cm4gKG1vZCAmJiBtb2QuX19lc01vZHVsZSkgPyBtb2QgOiB7IFwiZGVmYXVsdFwiOiBtb2QgfTtcclxuICAgIH07XHJcblxyXG4gICAgX19jbGFzc1ByaXZhdGVGaWVsZEdldCA9IGZ1bmN0aW9uIChyZWNlaXZlciwgc3RhdGUsIGtpbmQsIGYpIHtcclxuICAgICAgICBpZiAoa2luZCA9PT0gXCJhXCIgJiYgIWYpIHRocm93IG5ldyBUeXBlRXJyb3IoXCJQcml2YXRlIGFjY2Vzc29yIHdhcyBkZWZpbmVkIHdpdGhvdXQgYSBnZXR0ZXJcIik7XHJcbiAgICAgICAgaWYgKHR5cGVvZiBzdGF0ZSA9PT0gXCJmdW5jdGlvblwiID8gcmVjZWl2ZXIgIT09IHN0YXRlIHx8ICFmIDogIXN0YXRlLmhhcyhyZWNlaXZlcikpIHRocm93IG5ldyBUeXBlRXJyb3IoXCJDYW5ub3QgcmVhZCBwcml2YXRlIG1lbWJlciBmcm9tIGFuIG9iamVjdCB3aG9zZSBjbGFzcyBkaWQgbm90IGRlY2xhcmUgaXRcIik7XHJcbiAgICAgICAgcmV0dXJuIGtpbmQgPT09IFwibVwiID8gZiA6IGtpbmQgPT09IFwiYVwiID8gZi5jYWxsKHJlY2VpdmVyKSA6IGYgPyBmLnZhbHVlIDogc3RhdGUuZ2V0KHJlY2VpdmVyKTtcclxuICAgIH07XHJcblxyXG4gICAgX19jbGFzc1ByaXZhdGVGaWVsZFNldCA9IGZ1bmN0aW9uIChyZWNlaXZlciwgc3RhdGUsIHZhbHVlLCBraW5kLCBmKSB7XHJcbiAgICAgICAgaWYgKGtpbmQgPT09IFwibVwiKSB0aHJvdyBuZXcgVHlwZUVycm9yKFwiUHJpdmF0ZSBtZXRob2QgaXMgbm90IHdyaXRhYmxlXCIpO1xyXG4gICAgICAgIGlmIChraW5kID09PSBcImFcIiAmJiAhZikgdGhyb3cgbmV3IFR5cGVFcnJvcihcIlByaXZhdGUgYWNjZXNzb3Igd2FzIGRlZmluZWQgd2l0aG91dCBhIHNldHRlclwiKTtcclxuICAgICAgICBpZiAodHlwZW9mIHN0YXRlID09PSBcImZ1bmN0aW9uXCIgPyByZWNlaXZlciAhPT0gc3RhdGUgfHwgIWYgOiAhc3RhdGUuaGFzKHJlY2VpdmVyKSkgdGhyb3cgbmV3IFR5cGVFcnJvcihcIkNhbm5vdCB3cml0ZSBwcml2YXRlIG1lbWJlciB0byBhbiBvYmplY3Qgd2hvc2UgY2xhc3MgZGlkIG5vdCBkZWNsYXJlIGl0XCIpO1xyXG4gICAgICAgIHJldHVybiAoa2luZCA9PT0gXCJhXCIgPyBmLmNhbGwocmVjZWl2ZXIsIHZhbHVlKSA6IGYgPyBmLnZhbHVlID0gdmFsdWUgOiBzdGF0ZS5zZXQocmVjZWl2ZXIsIHZhbHVlKSksIHZhbHVlO1xyXG4gICAgfTtcclxuXHJcbiAgICBfX2NsYXNzUHJpdmF0ZUZpZWxkSW4gPSBmdW5jdGlvbiAoc3RhdGUsIHJlY2VpdmVyKSB7XHJcbiAgICAgICAgaWYgKHJlY2VpdmVyID09PSBudWxsIHx8ICh0eXBlb2YgcmVjZWl2ZXIgIT09IFwib2JqZWN0XCIgJiYgdHlwZW9mIHJlY2VpdmVyICE9PSBcImZ1bmN0aW9uXCIpKSB0aHJvdyBuZXcgVHlwZUVycm9yKFwiQ2Fubm90IHVzZSAnaW4nIG9wZXJhdG9yIG9uIG5vbi1vYmplY3RcIik7XHJcbiAgICAgICAgcmV0dXJuIHR5cGVvZiBzdGF0ZSA9PT0gXCJmdW5jdGlvblwiID8gcmVjZWl2ZXIgPT09IHN0YXRlIDogc3RhdGUuaGFzKHJlY2VpdmVyKTtcclxuICAgIH07XHJcblxyXG4gICAgX19hZGREaXNwb3NhYmxlUmVzb3VyY2UgPSBmdW5jdGlvbiAoZW52LCB2YWx1ZSwgYXN5bmMpIHtcclxuICAgICAgICBpZiAodmFsdWUgIT09IG51bGwgJiYgdmFsdWUgIT09IHZvaWQgMCkge1xyXG4gICAgICAgICAgICBpZiAodHlwZW9mIHZhbHVlICE9PSBcIm9iamVjdFwiICYmIHR5cGVvZiB2YWx1ZSAhPT0gXCJmdW5jdGlvblwiKSB0aHJvdyBuZXcgVHlwZUVycm9yKFwiT2JqZWN0IGV4cGVjdGVkLlwiKTtcclxuICAgICAgICAgICAgdmFyIGRpc3Bvc2UsIGlubmVyO1xyXG4gICAgICAgICAgICBpZiAoYXN5bmMpIHtcclxuICAgICAgICAgICAgICAgIGlmICghU3ltYm9sLmFzeW5jRGlzcG9zZSkgdGhyb3cgbmV3IFR5cGVFcnJvcihcIlN5bWJvbC5hc3luY0Rpc3Bvc2UgaXMgbm90IGRlZmluZWQuXCIpO1xyXG4gICAgICAgICAgICAgICAgZGlzcG9zZSA9IHZhbHVlW1N5bWJvbC5hc3luY0Rpc3Bvc2VdO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGlmIChkaXNwb3NlID09PSB2b2lkIDApIHtcclxuICAgICAgICAgICAgICAgIGlmICghU3ltYm9sLmRpc3Bvc2UpIHRocm93IG5ldyBUeXBlRXJyb3IoXCJTeW1ib2wuZGlzcG9zZSBpcyBub3QgZGVmaW5lZC5cIik7XHJcbiAgICAgICAgICAgICAgICBkaXNwb3NlID0gdmFsdWVbU3ltYm9sLmRpc3Bvc2VdO1xyXG4gICAgICAgICAgICAgICAgaWYgKGFzeW5jKSBpbm5lciA9IGRpc3Bvc2U7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgaWYgKHR5cGVvZiBkaXNwb3NlICE9PSBcImZ1bmN0aW9uXCIpIHRocm93IG5ldyBUeXBlRXJyb3IoXCJPYmplY3Qgbm90IGRpc3Bvc2FibGUuXCIpO1xyXG4gICAgICAgICAgICBpZiAoaW5uZXIpIGRpc3Bvc2UgPSBmdW5jdGlvbigpIHsgdHJ5IHsgaW5uZXIuY2FsbCh0aGlzKTsgfSBjYXRjaCAoZSkgeyByZXR1cm4gUHJvbWlzZS5yZWplY3QoZSk7IH0gfTtcclxuICAgICAgICAgICAgZW52LnN0YWNrLnB1c2goeyB2YWx1ZTogdmFsdWUsIGRpc3Bvc2U6IGRpc3Bvc2UsIGFzeW5jOiBhc3luYyB9KTtcclxuICAgICAgICB9XHJcbiAgICAgICAgZWxzZSBpZiAoYXN5bmMpIHtcclxuICAgICAgICAgICAgZW52LnN0YWNrLnB1c2goeyBhc3luYzogdHJ1ZSB9KTtcclxuICAgICAgICB9XHJcbiAgICAgICAgcmV0dXJuIHZhbHVlO1xyXG4gICAgfTtcclxuXHJcbiAgICB2YXIgX1N1cHByZXNzZWRFcnJvciA9IHR5cGVvZiBTdXBwcmVzc2VkRXJyb3IgPT09IFwiZnVuY3Rpb25cIiA/IFN1cHByZXNzZWRFcnJvciA6IGZ1bmN0aW9uIChlcnJvciwgc3VwcHJlc3NlZCwgbWVzc2FnZSkge1xyXG4gICAgICAgIHZhciBlID0gbmV3IEVycm9yKG1lc3NhZ2UpO1xyXG4gICAgICAgIHJldHVybiBlLm5hbWUgPSBcIlN1cHByZXNzZWRFcnJvclwiLCBlLmVycm9yID0gZXJyb3IsIGUuc3VwcHJlc3NlZCA9IHN1cHByZXNzZWQsIGU7XHJcbiAgICB9O1xyXG5cclxuICAgIF9fZGlzcG9zZVJlc291cmNlcyA9IGZ1bmN0aW9uIChlbnYpIHtcclxuICAgICAgICBmdW5jdGlvbiBmYWlsKGUpIHtcclxuICAgICAgICAgICAgZW52LmVycm9yID0gZW52Lmhhc0Vycm9yID8gbmV3IF9TdXBwcmVzc2VkRXJyb3IoZSwgZW52LmVycm9yLCBcIkFuIGVycm9yIHdhcyBzdXBwcmVzc2VkIGR1cmluZyBkaXNwb3NhbC5cIikgOiBlO1xyXG4gICAgICAgICAgICBlbnYuaGFzRXJyb3IgPSB0cnVlO1xyXG4gICAgICAgIH1cclxuICAgICAgICB2YXIgciwgcyA9IDA7XHJcbiAgICAgICAgZnVuY3Rpb24gbmV4dCgpIHtcclxuICAgICAgICAgICAgd2hpbGUgKHIgPSBlbnYuc3RhY2sucG9wKCkpIHtcclxuICAgICAgICAgICAgICAgIHRyeSB7XHJcbiAgICAgICAgICAgICAgICAgICAgaWYgKCFyLmFzeW5jICYmIHMgPT09IDEpIHJldHVybiBzID0gMCwgZW52LnN0YWNrLnB1c2gociksIFByb21pc2UucmVzb2x2ZSgpLnRoZW4obmV4dCk7XHJcbiAgICAgICAgICAgICAgICAgICAgaWYgKHIuZGlzcG9zZSkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB2YXIgcmVzdWx0ID0gci5kaXNwb3NlLmNhbGwoci52YWx1ZSk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChyLmFzeW5jKSByZXR1cm4gcyB8PSAyLCBQcm9taXNlLnJlc29sdmUocmVzdWx0KS50aGVuKG5leHQsIGZ1bmN0aW9uKGUpIHsgZmFpbChlKTsgcmV0dXJuIG5leHQoKTsgfSk7XHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgIGVsc2UgcyB8PSAxO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgY2F0Y2ggKGUpIHtcclxuICAgICAgICAgICAgICAgICAgICBmYWlsKGUpO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGlmIChzID09PSAxKSByZXR1cm4gZW52Lmhhc0Vycm9yID8gUHJvbWlzZS5yZWplY3QoZW52LmVycm9yKSA6IFByb21pc2UucmVzb2x2ZSgpO1xyXG4gICAgICAgICAgICBpZiAoZW52Lmhhc0Vycm9yKSB0aHJvdyBlbnYuZXJyb3I7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHJldHVybiBuZXh0KCk7XHJcbiAgICB9O1xyXG5cclxuICAgIF9fcmV3cml0ZVJlbGF0aXZlSW1wb3J0RXh0ZW5zaW9uID0gZnVuY3Rpb24gKHBhdGgsIHByZXNlcnZlSnN4KSB7XHJcbiAgICAgICAgaWYgKHR5cGVvZiBwYXRoID09PSBcInN0cmluZ1wiICYmIC9eXFwuXFwuP1xcLy8udGVzdChwYXRoKSkge1xyXG4gICAgICAgICAgICByZXR1cm4gcGF0aC5yZXBsYWNlKC9cXC4odHN4KSR8KCg/OlxcLmQpPykoKD86XFwuW14uL10rPyk/KVxcLihbY21dPyl0cyQvaSwgZnVuY3Rpb24gKG0sIHRzeCwgZCwgZXh0LCBjbSkge1xyXG4gICAgICAgICAgICAgICAgcmV0dXJuIHRzeCA/IHByZXNlcnZlSnN4ID8gXCIuanN4XCIgOiBcIi5qc1wiIDogZCAmJiAoIWV4dCB8fCAhY20pID8gbSA6IChkICsgZXh0ICsgXCIuXCIgKyBjbS50b0xvd2VyQ2FzZSgpICsgXCJqc1wiKTtcclxuICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHJldHVybiBwYXRoO1xyXG4gICAgfTtcclxuXHJcbiAgICBleHBvcnRlcihcIl9fZXh0ZW5kc1wiLCBfX2V4dGVuZHMpO1xyXG4gICAgZXhwb3J0ZXIoXCJfX2Fzc2lnblwiLCBfX2Fzc2lnbik7XHJcbiAgICBleHBvcnRlcihcIl9fcmVzdFwiLCBfX3Jlc3QpO1xyXG4gICAgZXhwb3J0ZXIoXCJfX2RlY29yYXRlXCIsIF9fZGVjb3JhdGUpO1xyXG4gICAgZXhwb3J0ZXIoXCJfX3BhcmFtXCIsIF9fcGFyYW0pO1xyXG4gICAgZXhwb3J0ZXIoXCJfX2VzRGVjb3JhdGVcIiwgX19lc0RlY29yYXRlKTtcclxuICAgIGV4cG9ydGVyKFwiX19ydW5Jbml0aWFsaXplcnNcIiwgX19ydW5Jbml0aWFsaXplcnMpO1xyXG4gICAgZXhwb3J0ZXIoXCJfX3Byb3BLZXlcIiwgX19wcm9wS2V5KTtcclxuICAgIGV4cG9ydGVyKFwiX19zZXRGdW5jdGlvbk5hbWVcIiwgX19zZXRGdW5jdGlvbk5hbWUpO1xyXG4gICAgZXhwb3J0ZXIoXCJfX21ldGFkYXRhXCIsIF9fbWV0YWRhdGEpO1xyXG4gICAgZXhwb3J0ZXIoXCJfX2F3YWl0ZXJcIiwgX19hd2FpdGVyKTtcclxuICAgIGV4cG9ydGVyKFwiX19nZW5lcmF0b3JcIiwgX19nZW5lcmF0b3IpO1xyXG4gICAgZXhwb3J0ZXIoXCJfX2V4cG9ydFN0YXJcIiwgX19leHBvcnRTdGFyKTtcclxuICAgIGV4cG9ydGVyKFwiX19jcmVhdGVCaW5kaW5nXCIsIF9fY3JlYXRlQmluZGluZyk7XHJcbiAgICBleHBvcnRlcihcIl9fdmFsdWVzXCIsIF9fdmFsdWVzKTtcclxuICAgIGV4cG9ydGVyKFwiX19yZWFkXCIsIF9fcmVhZCk7XHJcbiAgICBleHBvcnRlcihcIl9fc3ByZWFkXCIsIF9fc3ByZWFkKTtcclxuICAgIGV4cG9ydGVyKFwiX19zcHJlYWRBcnJheXNcIiwgX19zcHJlYWRBcnJheXMpO1xyXG4gICAgZXhwb3J0ZXIoXCJfX3NwcmVhZEFycmF5XCIsIF9fc3ByZWFkQXJyYXkpO1xyXG4gICAgZXhwb3J0ZXIoXCJfX2F3YWl0XCIsIF9fYXdhaXQpO1xyXG4gICAgZXhwb3J0ZXIoXCJfX2FzeW5jR2VuZXJhdG9yXCIsIF9fYXN5bmNHZW5lcmF0b3IpO1xyXG4gICAgZXhwb3J0ZXIoXCJfX2FzeW5jRGVsZWdhdG9yXCIsIF9fYXN5bmNEZWxlZ2F0b3IpO1xyXG4gICAgZXhwb3J0ZXIoXCJfX2FzeW5jVmFsdWVzXCIsIF9fYXN5bmNWYWx1ZXMpO1xyXG4gICAgZXhwb3J0ZXIoXCJfX21ha2VUZW1wbGF0ZU9iamVjdFwiLCBfX21ha2VUZW1wbGF0ZU9iamVjdCk7XHJcbiAgICBleHBvcnRlcihcIl9faW1wb3J0U3RhclwiLCBfX2ltcG9ydFN0YXIpO1xyXG4gICAgZXhwb3J0ZXIoXCJfX2ltcG9ydERlZmF1bHRcIiwgX19pbXBvcnREZWZhdWx0KTtcclxuICAgIGV4cG9ydGVyKFwiX19jbGFzc1ByaXZhdGVGaWVsZEdldFwiLCBfX2NsYXNzUHJpdmF0ZUZpZWxkR2V0KTtcclxuICAgIGV4cG9ydGVyKFwiX19jbGFzc1ByaXZhdGVGaWVsZFNldFwiLCBfX2NsYXNzUHJpdmF0ZUZpZWxkU2V0KTtcclxuICAgIGV4cG9ydGVyKFwiX19jbGFzc1ByaXZhdGVGaWVsZEluXCIsIF9fY2xhc3NQcml2YXRlRmllbGRJbik7XHJcbiAgICBleHBvcnRlcihcIl9fYWRkRGlzcG9zYWJsZVJlc291cmNlXCIsIF9fYWRkRGlzcG9zYWJsZVJlc291cmNlKTtcclxuICAgIGV4cG9ydGVyKFwiX19kaXNwb3NlUmVzb3VyY2VzXCIsIF9fZGlzcG9zZVJlc291cmNlcyk7XHJcbiAgICBleHBvcnRlcihcIl9fcmV3cml0ZVJlbGF0aXZlSW1wb3J0RXh0ZW5zaW9uXCIsIF9fcmV3cml0ZVJlbGF0aXZlSW1wb3J0RXh0ZW5zaW9uKTtcclxufSk7XHJcblxyXG4wICYmIChtb2R1bGUuZXhwb3J0cyA9IHtcclxuICAgIF9fZXh0ZW5kcyxcclxuICAgIF9fYXNzaWduLFxyXG4gICAgX19yZXN0LFxyXG4gICAgX19kZWNvcmF0ZSxcclxuICAgIF9fcGFyYW0sXHJcbiAgICBfX2VzRGVjb3JhdGUsXHJcbiAgICBfX3J1bkluaXRpYWxpemVycyxcclxuICAgIF9fcHJvcEtleSxcclxuICAgIF9fc2V0RnVuY3Rpb25OYW1lLFxyXG4gICAgX19tZXRhZGF0YSxcclxuICAgIF9fYXdhaXRlcixcclxuICAgIF9fZ2VuZXJhdG9yLFxyXG4gICAgX19leHBvcnRTdGFyLFxyXG4gICAgX19jcmVhdGVCaW5kaW5nLFxyXG4gICAgX192YWx1ZXMsXHJcbiAgICBfX3JlYWQsXHJcbiAgICBfX3NwcmVhZCxcclxuICAgIF9fc3ByZWFkQXJyYXlzLFxyXG4gICAgX19zcHJlYWRBcnJheSxcclxuICAgIF9fYXdhaXQsXHJcbiAgICBfX2FzeW5jR2VuZXJhdG9yLFxyXG4gICAgX19hc3luY0RlbGVnYXRvcixcclxuICAgIF9fYXN5bmNWYWx1ZXMsXHJcbiAgICBfX21ha2VUZW1wbGF0ZU9iamVjdCxcclxuICAgIF9faW1wb3J0U3RhcixcclxuICAgIF9faW1wb3J0RGVmYXVsdCxcclxuICAgIF9fY2xhc3NQcml2YXRlRmllbGRHZXQsXHJcbiAgICBfX2NsYXNzUHJpdmF0ZUZpZWxkU2V0LFxyXG4gICAgX19jbGFzc1ByaXZhdGVGaWVsZEluLFxyXG4gICAgX19hZGREaXNwb3NhYmxlUmVzb3VyY2UsXHJcbiAgICBfX2Rpc3Bvc2VSZXNvdXJjZXMsXHJcbiAgICBfX3Jld3JpdGVSZWxhdGl2ZUltcG9ydEV4dGVuc2lvbixcclxufSk7XHJcbiIsCiAgICAiXCJ1c2Ugc3RyaWN0XCI7XG4vLyBDb3B5cmlnaHQgKGMpIE1pY3Jvc29mdCBDb3Jwb3JhdGlvbi5cbi8vIExpY2Vuc2VkIHVuZGVyIHRoZSBNSVQgbGljZW5zZS5cbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIl9fZXNNb2R1bGVcIiwgeyB2YWx1ZTogdHJ1ZSB9KTtcbmV4cG9ydHMubG9nID0gbG9nO1xuY29uc3QgdHNsaWJfMSA9IHJlcXVpcmUoXCJ0c2xpYlwiKTtcbmNvbnN0IG5vZGVfb3NfMSA9IHJlcXVpcmUoXCJub2RlOm9zXCIpO1xuY29uc3Qgbm9kZV91dGlsXzEgPSB0c2xpYl8xLl9faW1wb3J0RGVmYXVsdChyZXF1aXJlKFwibm9kZTp1dGlsXCIpKTtcbmNvbnN0IHByb2Nlc3MgPSB0c2xpYl8xLl9faW1wb3J0U3RhcihyZXF1aXJlKFwibm9kZTpwcm9jZXNzXCIpKTtcbmZ1bmN0aW9uIGxvZyhtZXNzYWdlLCAuLi5hcmdzKSB7XG4gICAgcHJvY2Vzcy5zdGRlcnIud3JpdGUoYCR7bm9kZV91dGlsXzEuZGVmYXVsdC5mb3JtYXQobWVzc2FnZSwgLi4uYXJncyl9JHtub2RlX29zXzEuRU9MfWApO1xufVxuLy8jIHNvdXJjZU1hcHBpbmdVUkw9bG9nLmpzLm1hcCIsCiAgICAiXCJ1c2Ugc3RyaWN0XCI7XG4vLyBDb3B5cmlnaHQgKGMpIE1pY3Jvc29mdCBDb3Jwb3JhdGlvbi5cbi8vIExpY2Vuc2VkIHVuZGVyIHRoZSBNSVQgbGljZW5zZS5cbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIl9fZXNNb2R1bGVcIiwgeyB2YWx1ZTogdHJ1ZSB9KTtcbmNvbnN0IGxvZ19qc18xID0gcmVxdWlyZShcIi4vbG9nLmpzXCIpO1xuY29uc3QgZGVidWdFbnZWYXJpYWJsZSA9ICh0eXBlb2YgcHJvY2VzcyAhPT0gXCJ1bmRlZmluZWRcIiAmJiBwcm9jZXNzLmVudiAmJiBwcm9jZXNzLmVudi5ERUJVRykgfHwgdW5kZWZpbmVkO1xubGV0IGVuYWJsZWRTdHJpbmc7XG5sZXQgZW5hYmxlZE5hbWVzcGFjZXMgPSBbXTtcbmxldCBza2lwcGVkTmFtZXNwYWNlcyA9IFtdO1xuY29uc3QgZGVidWdnZXJzID0gW107XG5pZiAoZGVidWdFbnZWYXJpYWJsZSkge1xuICAgIGVuYWJsZShkZWJ1Z0VudlZhcmlhYmxlKTtcbn1cbmNvbnN0IGRlYnVnT2JqID0gT2JqZWN0LmFzc2lnbigobmFtZXNwYWNlKSA9PiB7XG4gICAgcmV0dXJuIGNyZWF0ZURlYnVnZ2VyKG5hbWVzcGFjZSk7XG59LCB7XG4gICAgZW5hYmxlLFxuICAgIGVuYWJsZWQsXG4gICAgZGlzYWJsZSxcbiAgICBsb2c6IGxvZ19qc18xLmxvZyxcbn0pO1xuZnVuY3Rpb24gZW5hYmxlKG5hbWVzcGFjZXMpIHtcbiAgICBlbmFibGVkU3RyaW5nID0gbmFtZXNwYWNlcztcbiAgICBlbmFibGVkTmFtZXNwYWNlcyA9IFtdO1xuICAgIHNraXBwZWROYW1lc3BhY2VzID0gW107XG4gICAgY29uc3Qgd2lsZGNhcmQgPSAvXFwqL2c7XG4gICAgY29uc3QgbmFtZXNwYWNlTGlzdCA9IG5hbWVzcGFjZXMuc3BsaXQoXCIsXCIpLm1hcCgobnMpID0+IG5zLnRyaW0oKS5yZXBsYWNlKHdpbGRjYXJkLCBcIi4qP1wiKSk7XG4gICAgZm9yIChjb25zdCBucyBvZiBuYW1lc3BhY2VMaXN0KSB7XG4gICAgICAgIGlmIChucy5zdGFydHNXaXRoKFwiLVwiKSkge1xuICAgICAgICAgICAgc2tpcHBlZE5hbWVzcGFjZXMucHVzaChuZXcgUmVnRXhwKGBeJHtucy5zdWJzdHIoMSl9JGApKTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIGVuYWJsZWROYW1lc3BhY2VzLnB1c2gobmV3IFJlZ0V4cChgXiR7bnN9JGApKTtcbiAgICAgICAgfVxuICAgIH1cbiAgICBmb3IgKGNvbnN0IGluc3RhbmNlIG9mIGRlYnVnZ2Vycykge1xuICAgICAgICBpbnN0YW5jZS5lbmFibGVkID0gZW5hYmxlZChpbnN0YW5jZS5uYW1lc3BhY2UpO1xuICAgIH1cbn1cbmZ1bmN0aW9uIGVuYWJsZWQobmFtZXNwYWNlKSB7XG4gICAgaWYgKG5hbWVzcGFjZS5lbmRzV2l0aChcIipcIikpIHtcbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuICAgIGZvciAoY29uc3Qgc2tpcHBlZCBvZiBza2lwcGVkTmFtZXNwYWNlcykge1xuICAgICAgICBpZiAoc2tpcHBlZC50ZXN0KG5hbWVzcGFjZSkpIHtcbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgfVxuICAgIH1cbiAgICBmb3IgKGNvbnN0IGVuYWJsZWROYW1lc3BhY2Ugb2YgZW5hYmxlZE5hbWVzcGFjZXMpIHtcbiAgICAgICAgaWYgKGVuYWJsZWROYW1lc3BhY2UudGVzdChuYW1lc3BhY2UpKSB7XG4gICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gZmFsc2U7XG59XG5mdW5jdGlvbiBkaXNhYmxlKCkge1xuICAgIGNvbnN0IHJlc3VsdCA9IGVuYWJsZWRTdHJpbmcgfHwgXCJcIjtcbiAgICBlbmFibGUoXCJcIik7XG4gICAgcmV0dXJuIHJlc3VsdDtcbn1cbmZ1bmN0aW9uIGNyZWF0ZURlYnVnZ2VyKG5hbWVzcGFjZSkge1xuICAgIGNvbnN0IG5ld0RlYnVnZ2VyID0gT2JqZWN0LmFzc2lnbihkZWJ1Zywge1xuICAgICAgICBlbmFibGVkOiBlbmFibGVkKG5hbWVzcGFjZSksXG4gICAgICAgIGRlc3Ryb3ksXG4gICAgICAgIGxvZzogZGVidWdPYmoubG9nLFxuICAgICAgICBuYW1lc3BhY2UsXG4gICAgICAgIGV4dGVuZCxcbiAgICB9KTtcbiAgICBmdW5jdGlvbiBkZWJ1ZyguLi5hcmdzKSB7XG4gICAgICAgIGlmICghbmV3RGVidWdnZXIuZW5hYmxlZCkge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIGlmIChhcmdzLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgIGFyZ3NbMF0gPSBgJHtuYW1lc3BhY2V9ICR7YXJnc1swXX1gO1xuICAgICAgICB9XG4gICAgICAgIG5ld0RlYnVnZ2VyLmxvZyguLi5hcmdzKTtcbiAgICB9XG4gICAgZGVidWdnZXJzLnB1c2gobmV3RGVidWdnZXIpO1xuICAgIHJldHVybiBuZXdEZWJ1Z2dlcjtcbn1cbmZ1bmN0aW9uIGRlc3Ryb3koKSB7XG4gICAgY29uc3QgaW5kZXggPSBkZWJ1Z2dlcnMuaW5kZXhPZih0aGlzKTtcbiAgICBpZiAoaW5kZXggPj0gMCkge1xuICAgICAgICBkZWJ1Z2dlcnMuc3BsaWNlKGluZGV4LCAxKTtcbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuICAgIHJldHVybiBmYWxzZTtcbn1cbmZ1bmN0aW9uIGV4dGVuZChuYW1lc3BhY2UpIHtcbiAgICBjb25zdCBuZXdEZWJ1Z2dlciA9IGNyZWF0ZURlYnVnZ2VyKGAke3RoaXMubmFtZXNwYWNlfToke25hbWVzcGFjZX1gKTtcbiAgICBuZXdEZWJ1Z2dlci5sb2cgPSB0aGlzLmxvZztcbiAgICByZXR1cm4gbmV3RGVidWdnZXI7XG59XG5leHBvcnRzLmRlZmF1bHQgPSBkZWJ1Z09iajtcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPWRlYnVnLmpzLm1hcCIsCiAgICAiXCJ1c2Ugc3RyaWN0XCI7XG4vLyBDb3B5cmlnaHQgKGMpIE1pY3Jvc29mdCBDb3Jwb3JhdGlvbi5cbi8vIExpY2Vuc2VkIHVuZGVyIHRoZSBNSVQgbGljZW5zZS5cbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIl9fZXNNb2R1bGVcIiwgeyB2YWx1ZTogdHJ1ZSB9KTtcbmV4cG9ydHMuQXp1cmVMb2dnZXIgPSB2b2lkIDA7XG5leHBvcnRzLnNldExvZ0xldmVsID0gc2V0TG9nTGV2ZWw7XG5leHBvcnRzLmdldExvZ0xldmVsID0gZ2V0TG9nTGV2ZWw7XG5leHBvcnRzLmNyZWF0ZUNsaWVudExvZ2dlciA9IGNyZWF0ZUNsaWVudExvZ2dlcjtcbmNvbnN0IHRzbGliXzEgPSByZXF1aXJlKFwidHNsaWJcIik7XG5jb25zdCBkZWJ1Z19qc18xID0gdHNsaWJfMS5fX2ltcG9ydERlZmF1bHQocmVxdWlyZShcIi4vZGVidWcuanNcIikpO1xuY29uc3QgcmVnaXN0ZXJlZExvZ2dlcnMgPSBuZXcgU2V0KCk7XG5jb25zdCBsb2dMZXZlbEZyb21FbnYgPSAodHlwZW9mIHByb2Nlc3MgIT09IFwidW5kZWZpbmVkXCIgJiYgcHJvY2Vzcy5lbnYgJiYgcHJvY2Vzcy5lbnYuQVpVUkVfTE9HX0xFVkVMKSB8fCB1bmRlZmluZWQ7XG5sZXQgYXp1cmVMb2dMZXZlbDtcbi8qKlxuICogVGhlIEF6dXJlTG9nZ2VyIHByb3ZpZGVzIGEgbWVjaGFuaXNtIGZvciBvdmVycmlkaW5nIHdoZXJlIGxvZ3MgYXJlIG91dHB1dCB0by5cbiAqIEJ5IGRlZmF1bHQsIGxvZ3MgYXJlIHNlbnQgdG8gc3RkZXJyLlxuICogT3ZlcnJpZGUgdGhlIGBsb2dgIG1ldGhvZCB0byByZWRpcmVjdCBsb2dzIHRvIGFub3RoZXIgbG9jYXRpb24uXG4gKi9cbmV4cG9ydHMuQXp1cmVMb2dnZXIgPSAoMCwgZGVidWdfanNfMS5kZWZhdWx0KShcImF6dXJlXCIpO1xuZXhwb3J0cy5BenVyZUxvZ2dlci5sb2cgPSAoLi4uYXJncykgPT4ge1xuICAgIGRlYnVnX2pzXzEuZGVmYXVsdC5sb2coLi4uYXJncyk7XG59O1xuY29uc3QgQVpVUkVfTE9HX0xFVkVMUyA9IFtcInZlcmJvc2VcIiwgXCJpbmZvXCIsIFwid2FybmluZ1wiLCBcImVycm9yXCJdO1xuaWYgKGxvZ0xldmVsRnJvbUVudikge1xuICAgIC8vIGF2b2lkIGNhbGxpbmcgc2V0TG9nTGV2ZWwgYmVjYXVzZSB3ZSBkb24ndCB3YW50IGEgbWlzLXNldCBlbnZpcm9ubWVudCB2YXJpYWJsZSB0byBjcmFzaFxuICAgIGlmIChpc0F6dXJlTG9nTGV2ZWwobG9nTGV2ZWxGcm9tRW52KSkge1xuICAgICAgICBzZXRMb2dMZXZlbChsb2dMZXZlbEZyb21FbnYpO1xuICAgIH1cbiAgICBlbHNlIHtcbiAgICAgICAgY29uc29sZS5lcnJvcihgQVpVUkVfTE9HX0xFVkVMIHNldCB0byB1bmtub3duIGxvZyBsZXZlbCAnJHtsb2dMZXZlbEZyb21FbnZ9JzsgbG9nZ2luZyBpcyBub3QgZW5hYmxlZC4gQWNjZXB0YWJsZSB2YWx1ZXM6ICR7QVpVUkVfTE9HX0xFVkVMUy5qb2luKFwiLCBcIil9LmApO1xuICAgIH1cbn1cbi8qKlxuICogSW1tZWRpYXRlbHkgZW5hYmxlcyBsb2dnaW5nIGF0IHRoZSBzcGVjaWZpZWQgbG9nIGxldmVsLiBJZiBubyBsZXZlbCBpcyBzcGVjaWZpZWQsIGxvZ2dpbmcgaXMgZGlzYWJsZWQuXG4gKiBAcGFyYW0gbGV2ZWwgLSBUaGUgbG9nIGxldmVsIHRvIGVuYWJsZSBmb3IgbG9nZ2luZy5cbiAqIE9wdGlvbnMgZnJvbSBtb3N0IHZlcmJvc2UgdG8gbGVhc3QgdmVyYm9zZSBhcmU6XG4gKiAtIHZlcmJvc2VcbiAqIC0gaW5mb1xuICogLSB3YXJuaW5nXG4gKiAtIGVycm9yXG4gKi9cbmZ1bmN0aW9uIHNldExvZ0xldmVsKGxldmVsKSB7XG4gICAgaWYgKGxldmVsICYmICFpc0F6dXJlTG9nTGV2ZWwobGV2ZWwpKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihgVW5rbm93biBsb2cgbGV2ZWwgJyR7bGV2ZWx9Jy4gQWNjZXB0YWJsZSB2YWx1ZXM6ICR7QVpVUkVfTE9HX0xFVkVMUy5qb2luKFwiLFwiKX1gKTtcbiAgICB9XG4gICAgYXp1cmVMb2dMZXZlbCA9IGxldmVsO1xuICAgIGNvbnN0IGVuYWJsZWROYW1lc3BhY2VzID0gW107XG4gICAgZm9yIChjb25zdCBsb2dnZXIgb2YgcmVnaXN0ZXJlZExvZ2dlcnMpIHtcbiAgICAgICAgaWYgKHNob3VsZEVuYWJsZShsb2dnZXIpKSB7XG4gICAgICAgICAgICBlbmFibGVkTmFtZXNwYWNlcy5wdXNoKGxvZ2dlci5uYW1lc3BhY2UpO1xuICAgICAgICB9XG4gICAgfVxuICAgIGRlYnVnX2pzXzEuZGVmYXVsdC5lbmFibGUoZW5hYmxlZE5hbWVzcGFjZXMuam9pbihcIixcIikpO1xufVxuLyoqXG4gKiBSZXRyaWV2ZXMgdGhlIGN1cnJlbnRseSBzcGVjaWZpZWQgbG9nIGxldmVsLlxuICovXG5mdW5jdGlvbiBnZXRMb2dMZXZlbCgpIHtcbiAgICByZXR1cm4gYXp1cmVMb2dMZXZlbDtcbn1cbmNvbnN0IGxldmVsTWFwID0ge1xuICAgIHZlcmJvc2U6IDQwMCxcbiAgICBpbmZvOiAzMDAsXG4gICAgd2FybmluZzogMjAwLFxuICAgIGVycm9yOiAxMDAsXG59O1xuLyoqXG4gKiBDcmVhdGVzIGEgbG9nZ2VyIGZvciB1c2UgYnkgdGhlIEF6dXJlIFNES3MgdGhhdCBpbmhlcml0cyBmcm9tIGBBenVyZUxvZ2dlcmAuXG4gKiBAcGFyYW0gbmFtZXNwYWNlIC0gVGhlIG5hbWUgb2YgdGhlIFNESyBwYWNrYWdlLlxuICogQGhpZGRlblxuICovXG5mdW5jdGlvbiBjcmVhdGVDbGllbnRMb2dnZXIobmFtZXNwYWNlKSB7XG4gICAgY29uc3QgY2xpZW50Um9vdExvZ2dlciA9IGV4cG9ydHMuQXp1cmVMb2dnZXIuZXh0ZW5kKG5hbWVzcGFjZSk7XG4gICAgcGF0Y2hMb2dNZXRob2QoZXhwb3J0cy5BenVyZUxvZ2dlciwgY2xpZW50Um9vdExvZ2dlcik7XG4gICAgcmV0dXJuIHtcbiAgICAgICAgZXJyb3I6IGNyZWF0ZUxvZ2dlcihjbGllbnRSb290TG9nZ2VyLCBcImVycm9yXCIpLFxuICAgICAgICB3YXJuaW5nOiBjcmVhdGVMb2dnZXIoY2xpZW50Um9vdExvZ2dlciwgXCJ3YXJuaW5nXCIpLFxuICAgICAgICBpbmZvOiBjcmVhdGVMb2dnZXIoY2xpZW50Um9vdExvZ2dlciwgXCJpbmZvXCIpLFxuICAgICAgICB2ZXJib3NlOiBjcmVhdGVMb2dnZXIoY2xpZW50Um9vdExvZ2dlciwgXCJ2ZXJib3NlXCIpLFxuICAgIH07XG59XG5mdW5jdGlvbiBwYXRjaExvZ01ldGhvZChwYXJlbnQsIGNoaWxkKSB7XG4gICAgY2hpbGQubG9nID0gKC4uLmFyZ3MpID0+IHtcbiAgICAgICAgcGFyZW50LmxvZyguLi5hcmdzKTtcbiAgICB9O1xufVxuZnVuY3Rpb24gY3JlYXRlTG9nZ2VyKHBhcmVudCwgbGV2ZWwpIHtcbiAgICBjb25zdCBsb2dnZXIgPSBPYmplY3QuYXNzaWduKHBhcmVudC5leHRlbmQobGV2ZWwpLCB7XG4gICAgICAgIGxldmVsLFxuICAgIH0pO1xuICAgIHBhdGNoTG9nTWV0aG9kKHBhcmVudCwgbG9nZ2VyKTtcbiAgICBpZiAoc2hvdWxkRW5hYmxlKGxvZ2dlcikpIHtcbiAgICAgICAgY29uc3QgZW5hYmxlZE5hbWVzcGFjZXMgPSBkZWJ1Z19qc18xLmRlZmF1bHQuZGlzYWJsZSgpO1xuICAgICAgICBkZWJ1Z19qc18xLmRlZmF1bHQuZW5hYmxlKGVuYWJsZWROYW1lc3BhY2VzICsgXCIsXCIgKyBsb2dnZXIubmFtZXNwYWNlKTtcbiAgICB9XG4gICAgcmVnaXN0ZXJlZExvZ2dlcnMuYWRkKGxvZ2dlcik7XG4gICAgcmV0dXJuIGxvZ2dlcjtcbn1cbmZ1bmN0aW9uIHNob3VsZEVuYWJsZShsb2dnZXIpIHtcbiAgICByZXR1cm4gQm9vbGVhbihhenVyZUxvZ0xldmVsICYmIGxldmVsTWFwW2xvZ2dlci5sZXZlbF0gPD0gbGV2ZWxNYXBbYXp1cmVMb2dMZXZlbF0pO1xufVxuZnVuY3Rpb24gaXNBenVyZUxvZ0xldmVsKGxvZ0xldmVsKSB7XG4gICAgcmV0dXJuIEFaVVJFX0xPR19MRVZFTFMuaW5jbHVkZXMobG9nTGV2ZWwpO1xufVxuLy8jIHNvdXJjZU1hcHBpbmdVUkw9aW5kZXguanMubWFwIiwKICAgICJcInVzZSBzdHJpY3RcIjtcbi8vIENvcHlyaWdodCAoYykgTWljcm9zb2Z0IENvcnBvcmF0aW9uLlxuLy8gTGljZW5zZWQgdW5kZXIgdGhlIE1JVCBMaWNlbnNlLlxuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiX19lc01vZHVsZVwiLCB7IHZhbHVlOiB0cnVlIH0pO1xuZXhwb3J0cy5sb2dnZXIgPSB2b2lkIDA7XG5jb25zdCBsb2dnZXJfMSA9IHJlcXVpcmUoXCJAYXp1cmUvbG9nZ2VyXCIpO1xuZXhwb3J0cy5sb2dnZXIgPSAoMCwgbG9nZ2VyXzEuY3JlYXRlQ2xpZW50TG9nZ2VyKShcImNvcmUtcmVzdC1waXBlbGluZVwiKTtcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPWxvZy5qcy5tYXAiLAogICAgIlwidXNlIHN0cmljdFwiO1xuLy8gQ29weXJpZ2h0IChjKSBNaWNyb3NvZnQgQ29ycG9yYXRpb24uXG4vLyBMaWNlbnNlZCB1bmRlciB0aGUgTUlUIGxpY2Vuc2UuXG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJfX2VzTW9kdWxlXCIsIHsgdmFsdWU6IHRydWUgfSk7XG5leHBvcnRzLkFib3J0RXJyb3IgPSB2b2lkIDA7XG4vKipcbiAqIFRoaXMgZXJyb3IgaXMgdGhyb3duIHdoZW4gYW4gYXN5bmNocm9ub3VzIG9wZXJhdGlvbiBoYXMgYmVlbiBhYm9ydGVkLlxuICogQ2hlY2sgZm9yIHRoaXMgZXJyb3IgYnkgdGVzdGluZyB0aGUgYG5hbWVgIHRoYXQgdGhlIG5hbWUgcHJvcGVydHkgb2YgdGhlXG4gKiBlcnJvciBtYXRjaGVzIGBcIkFib3J0RXJyb3JcImAuXG4gKlxuICogQGV4YW1wbGVcbiAqIGBgYHRzXG4gKiBjb25zdCBjb250cm9sbGVyID0gbmV3IEFib3J0Q29udHJvbGxlcigpO1xuICogY29udHJvbGxlci5hYm9ydCgpO1xuICogdHJ5IHtcbiAqICAgZG9Bc3luY1dvcmsoY29udHJvbGxlci5zaWduYWwpXG4gKiB9IGNhdGNoIChlKSB7XG4gKiAgIGlmIChlLm5hbWUgPT09ICdBYm9ydEVycm9yJykge1xuICogICAgIC8vIGhhbmRsZSBhYm9ydCBlcnJvciBoZXJlLlxuICogICB9XG4gKiB9XG4gKiBgYGBcbiAqL1xuY2xhc3MgQWJvcnRFcnJvciBleHRlbmRzIEVycm9yIHtcbiAgICBjb25zdHJ1Y3RvcihtZXNzYWdlKSB7XG4gICAgICAgIHN1cGVyKG1lc3NhZ2UpO1xuICAgICAgICB0aGlzLm5hbWUgPSBcIkFib3J0RXJyb3JcIjtcbiAgICB9XG59XG5leHBvcnRzLkFib3J0RXJyb3IgPSBBYm9ydEVycm9yO1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9QWJvcnRFcnJvci5qcy5tYXAiLAogICAgIlwidXNlIHN0cmljdFwiO1xuLy8gQ29weXJpZ2h0IChjKSBNaWNyb3NvZnQgQ29ycG9yYXRpb24uXG4vLyBMaWNlbnNlZCB1bmRlciB0aGUgTUlUIGxpY2Vuc2UuXG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJfX2VzTW9kdWxlXCIsIHsgdmFsdWU6IHRydWUgfSk7XG5leHBvcnRzLkFib3J0RXJyb3IgPSB2b2lkIDA7XG52YXIgQWJvcnRFcnJvcl9qc18xID0gcmVxdWlyZShcIi4vQWJvcnRFcnJvci5qc1wiKTtcbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIkFib3J0RXJyb3JcIiwgeyBlbnVtZXJhYmxlOiB0cnVlLCBnZXQ6IGZ1bmN0aW9uICgpIHsgcmV0dXJuIEFib3J0RXJyb3JfanNfMS5BYm9ydEVycm9yOyB9IH0pO1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9aW5kZXguanMubWFwIiwKICAgICJcInVzZSBzdHJpY3RcIjtcbi8vIENvcHlyaWdodCAoYykgTWljcm9zb2Z0IENvcnBvcmF0aW9uLlxuLy8gTGljZW5zZWQgdW5kZXIgdGhlIE1JVCBMaWNlbnNlLlxuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiX19lc01vZHVsZVwiLCB7IHZhbHVlOiB0cnVlIH0pO1xuZXhwb3J0cy5jcmVhdGVBYm9ydGFibGVQcm9taXNlID0gY3JlYXRlQWJvcnRhYmxlUHJvbWlzZTtcbmNvbnN0IGFib3J0X2NvbnRyb2xsZXJfMSA9IHJlcXVpcmUoXCJAYXp1cmUvYWJvcnQtY29udHJvbGxlclwiKTtcbi8qKlxuICogQ3JlYXRlcyBhbiBhYm9ydGFibGUgcHJvbWlzZS5cbiAqIEBwYXJhbSBidWlsZFByb21pc2UgLSBBIGZ1bmN0aW9uIHRoYXQgdGFrZXMgdGhlIHJlc29sdmUgYW5kIHJlamVjdCBmdW5jdGlvbnMgYXMgcGFyYW1ldGVycy5cbiAqIEBwYXJhbSBvcHRpb25zIC0gVGhlIG9wdGlvbnMgZm9yIHRoZSBhYm9ydGFibGUgcHJvbWlzZS5cbiAqIEByZXR1cm5zIEEgcHJvbWlzZSB0aGF0IGNhbiBiZSBhYm9ydGVkLlxuICovXG5mdW5jdGlvbiBjcmVhdGVBYm9ydGFibGVQcm9taXNlKGJ1aWxkUHJvbWlzZSwgb3B0aW9ucykge1xuICAgIGNvbnN0IHsgY2xlYW51cEJlZm9yZUFib3J0LCBhYm9ydFNpZ25hbCwgYWJvcnRFcnJvck1zZyB9ID0gb3B0aW9ucyAhPT0gbnVsbCAmJiBvcHRpb25zICE9PSB2b2lkIDAgPyBvcHRpb25zIDoge307XG4gICAgcmV0dXJuIG5ldyBQcm9taXNlKChyZXNvbHZlLCByZWplY3QpID0+IHtcbiAgICAgICAgZnVuY3Rpb24gcmVqZWN0T25BYm9ydCgpIHtcbiAgICAgICAgICAgIHJlamVjdChuZXcgYWJvcnRfY29udHJvbGxlcl8xLkFib3J0RXJyb3IoYWJvcnRFcnJvck1zZyAhPT0gbnVsbCAmJiBhYm9ydEVycm9yTXNnICE9PSB2b2lkIDAgPyBhYm9ydEVycm9yTXNnIDogXCJUaGUgb3BlcmF0aW9uIHdhcyBhYm9ydGVkLlwiKSk7XG4gICAgICAgIH1cbiAgICAgICAgZnVuY3Rpb24gcmVtb3ZlTGlzdGVuZXJzKCkge1xuICAgICAgICAgICAgYWJvcnRTaWduYWwgPT09IG51bGwgfHwgYWJvcnRTaWduYWwgPT09IHZvaWQgMCA/IHZvaWQgMCA6IGFib3J0U2lnbmFsLnJlbW92ZUV2ZW50TGlzdGVuZXIoXCJhYm9ydFwiLCBvbkFib3J0KTtcbiAgICAgICAgfVxuICAgICAgICBmdW5jdGlvbiBvbkFib3J0KCkge1xuICAgICAgICAgICAgY2xlYW51cEJlZm9yZUFib3J0ID09PSBudWxsIHx8IGNsZWFudXBCZWZvcmVBYm9ydCA9PT0gdm9pZCAwID8gdm9pZCAwIDogY2xlYW51cEJlZm9yZUFib3J0KCk7XG4gICAgICAgICAgICByZW1vdmVMaXN0ZW5lcnMoKTtcbiAgICAgICAgICAgIHJlamVjdE9uQWJvcnQoKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoYWJvcnRTaWduYWwgPT09IG51bGwgfHwgYWJvcnRTaWduYWwgPT09IHZvaWQgMCA/IHZvaWQgMCA6IGFib3J0U2lnbmFsLmFib3J0ZWQpIHtcbiAgICAgICAgICAgIHJldHVybiByZWplY3RPbkFib3J0KCk7XG4gICAgICAgIH1cbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIGJ1aWxkUHJvbWlzZSgoeCkgPT4ge1xuICAgICAgICAgICAgICAgIHJlbW92ZUxpc3RlbmVycygpO1xuICAgICAgICAgICAgICAgIHJlc29sdmUoeCk7XG4gICAgICAgICAgICB9LCAoeCkgPT4ge1xuICAgICAgICAgICAgICAgIHJlbW92ZUxpc3RlbmVycygpO1xuICAgICAgICAgICAgICAgIHJlamVjdCh4KTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgICAgIGNhdGNoIChlcnIpIHtcbiAgICAgICAgICAgIHJlamVjdChlcnIpO1xuICAgICAgICB9XG4gICAgICAgIGFib3J0U2lnbmFsID09PSBudWxsIHx8IGFib3J0U2lnbmFsID09PSB2b2lkIDAgPyB2b2lkIDAgOiBhYm9ydFNpZ25hbC5hZGRFdmVudExpc3RlbmVyKFwiYWJvcnRcIiwgb25BYm9ydCk7XG4gICAgfSk7XG59XG4vLyMgc291cmNlTWFwcGluZ1VSTD1jcmVhdGVBYm9ydGFibGVQcm9taXNlLmpzLm1hcCIsCiAgICAiXCJ1c2Ugc3RyaWN0XCI7XG4vLyBDb3B5cmlnaHQgKGMpIE1pY3Jvc29mdCBDb3Jwb3JhdGlvbi5cbi8vIExpY2Vuc2VkIHVuZGVyIHRoZSBNSVQgTGljZW5zZS5cbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIl9fZXNNb2R1bGVcIiwgeyB2YWx1ZTogdHJ1ZSB9KTtcbmV4cG9ydHMuZ2V0UmFuZG9tSW50ZWdlckluY2x1c2l2ZSA9IGdldFJhbmRvbUludGVnZXJJbmNsdXNpdmU7XG4vKipcbiAqIFJldHVybnMgYSByYW5kb20gaW50ZWdlciB2YWx1ZSBiZXR3ZWVuIGEgbG93ZXIgYW5kIHVwcGVyIGJvdW5kLFxuICogaW5jbHVzaXZlIG9mIGJvdGggYm91bmRzLlxuICogTm90ZSB0aGF0IHRoaXMgdXNlcyBNYXRoLnJhbmRvbSBhbmQgaXNuJ3Qgc2VjdXJlLiBJZiB5b3UgbmVlZCB0byB1c2VcbiAqIHRoaXMgZm9yIGFueSBraW5kIG9mIHNlY3VyaXR5IHB1cnBvc2UsIGZpbmQgYSBiZXR0ZXIgc291cmNlIG9mIHJhbmRvbS5cbiAqIEBwYXJhbSBtaW4gLSBUaGUgc21hbGxlc3QgaW50ZWdlciB2YWx1ZSBhbGxvd2VkLlxuICogQHBhcmFtIG1heCAtIFRoZSBsYXJnZXN0IGludGVnZXIgdmFsdWUgYWxsb3dlZC5cbiAqL1xuZnVuY3Rpb24gZ2V0UmFuZG9tSW50ZWdlckluY2x1c2l2ZShtaW4sIG1heCkge1xuICAgIC8vIE1ha2Ugc3VyZSBpbnB1dHMgYXJlIGludGVnZXJzLlxuICAgIG1pbiA9IE1hdGguY2VpbChtaW4pO1xuICAgIG1heCA9IE1hdGguZmxvb3IobWF4KTtcbiAgICAvLyBQaWNrIGEgcmFuZG9tIG9mZnNldCBmcm9tIHplcm8gdG8gdGhlIHNpemUgb2YgdGhlIHJhbmdlLlxuICAgIC8vIFNpbmNlIE1hdGgucmFuZG9tKCkgY2FuIG5ldmVyIHJldHVybiAxLCB3ZSBoYXZlIHRvIG1ha2UgdGhlIHJhbmdlIG9uZSBsYXJnZXJcbiAgICAvLyBpbiBvcmRlciB0byBiZSBpbmNsdXNpdmUgb2YgdGhlIG1heGltdW0gdmFsdWUgYWZ0ZXIgd2UgdGFrZSB0aGUgZmxvb3IuXG4gICAgY29uc3Qgb2Zmc2V0ID0gTWF0aC5mbG9vcihNYXRoLnJhbmRvbSgpICogKG1heCAtIG1pbiArIDEpKTtcbiAgICByZXR1cm4gb2Zmc2V0ICsgbWluO1xufVxuLy8jIHNvdXJjZU1hcHBpbmdVUkw9cmFuZG9tLmpzLm1hcCIsCiAgICAiXCJ1c2Ugc3RyaWN0XCI7XG4vLyBDb3B5cmlnaHQgKGMpIE1pY3Jvc29mdCBDb3Jwb3JhdGlvbi5cbi8vIExpY2Vuc2VkIHVuZGVyIHRoZSBNSVQgTGljZW5zZS5cbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIl9fZXNNb2R1bGVcIiwgeyB2YWx1ZTogdHJ1ZSB9KTtcbmV4cG9ydHMuZGVsYXkgPSBkZWxheTtcbmV4cG9ydHMuY2FsY3VsYXRlUmV0cnlEZWxheSA9IGNhbGN1bGF0ZVJldHJ5RGVsYXk7XG5jb25zdCBjcmVhdGVBYm9ydGFibGVQcm9taXNlX2pzXzEgPSByZXF1aXJlKFwiLi9jcmVhdGVBYm9ydGFibGVQcm9taXNlLmpzXCIpO1xuY29uc3QgcmFuZG9tX2pzXzEgPSByZXF1aXJlKFwiLi9yYW5kb20uanNcIik7XG5jb25zdCBTdGFuZGFyZEFib3J0TWVzc2FnZSA9IFwiVGhlIGRlbGF5IHdhcyBhYm9ydGVkLlwiO1xuLyoqXG4gKiBBIHdyYXBwZXIgZm9yIHNldFRpbWVvdXQgdGhhdCByZXNvbHZlcyBhIHByb21pc2UgYWZ0ZXIgdGltZUluTXMgbWlsbGlzZWNvbmRzLlxuICogQHBhcmFtIHRpbWVJbk1zIC0gVGhlIG51bWJlciBvZiBtaWxsaXNlY29uZHMgdG8gYmUgZGVsYXllZC5cbiAqIEBwYXJhbSBvcHRpb25zIC0gVGhlIG9wdGlvbnMgZm9yIGRlbGF5IC0gY3VycmVudGx5IGFib3J0IG9wdGlvbnNcbiAqIEByZXR1cm5zIFByb21pc2UgdGhhdCBpcyByZXNvbHZlZCBhZnRlciB0aW1lSW5Nc1xuICovXG5mdW5jdGlvbiBkZWxheSh0aW1lSW5Ncywgb3B0aW9ucykge1xuICAgIGxldCB0b2tlbjtcbiAgICBjb25zdCB7IGFib3J0U2lnbmFsLCBhYm9ydEVycm9yTXNnIH0gPSBvcHRpb25zICE9PSBudWxsICYmIG9wdGlvbnMgIT09IHZvaWQgMCA/IG9wdGlvbnMgOiB7fTtcbiAgICByZXR1cm4gKDAsIGNyZWF0ZUFib3J0YWJsZVByb21pc2VfanNfMS5jcmVhdGVBYm9ydGFibGVQcm9taXNlKSgocmVzb2x2ZSkgPT4ge1xuICAgICAgICB0b2tlbiA9IHNldFRpbWVvdXQocmVzb2x2ZSwgdGltZUluTXMpO1xuICAgIH0sIHtcbiAgICAgICAgY2xlYW51cEJlZm9yZUFib3J0OiAoKSA9PiBjbGVhclRpbWVvdXQodG9rZW4pLFxuICAgICAgICBhYm9ydFNpZ25hbCxcbiAgICAgICAgYWJvcnRFcnJvck1zZzogYWJvcnRFcnJvck1zZyAhPT0gbnVsbCAmJiBhYm9ydEVycm9yTXNnICE9PSB2b2lkIDAgPyBhYm9ydEVycm9yTXNnIDogU3RhbmRhcmRBYm9ydE1lc3NhZ2UsXG4gICAgfSk7XG59XG4vKipcbiAqIENhbGN1bGF0ZXMgdGhlIGRlbGF5IGludGVydmFsIGZvciByZXRyeSBhdHRlbXB0cyB1c2luZyBleHBvbmVudGlhbCBkZWxheSB3aXRoIGppdHRlci5cbiAqIEBwYXJhbSByZXRyeUF0dGVtcHQgLSBUaGUgY3VycmVudCByZXRyeSBhdHRlbXB0IG51bWJlci5cbiAqIEBwYXJhbSBjb25maWcgLSBUaGUgZXhwb25lbnRpYWwgcmV0cnkgY29uZmlndXJhdGlvbi5cbiAqIEByZXR1cm5zIEFuIG9iamVjdCBjb250YWluaW5nIHRoZSBjYWxjdWxhdGVkIHJldHJ5IGRlbGF5LlxuICovXG5mdW5jdGlvbiBjYWxjdWxhdGVSZXRyeURlbGF5KHJldHJ5QXR0ZW1wdCwgY29uZmlnKSB7XG4gICAgLy8gRXhwb25lbnRpYWxseSBpbmNyZWFzZSB0aGUgZGVsYXkgZWFjaCB0aW1lXG4gICAgY29uc3QgZXhwb25lbnRpYWxEZWxheSA9IGNvbmZpZy5yZXRyeURlbGF5SW5NcyAqIE1hdGgucG93KDIsIHJldHJ5QXR0ZW1wdCk7XG4gICAgLy8gRG9uJ3QgbGV0IHRoZSBkZWxheSBleGNlZWQgdGhlIG1heGltdW1cbiAgICBjb25zdCBjbGFtcGVkRGVsYXkgPSBNYXRoLm1pbihjb25maWcubWF4UmV0cnlEZWxheUluTXMsIGV4cG9uZW50aWFsRGVsYXkpO1xuICAgIC8vIEFsbG93IHRoZSBmaW5hbCB2YWx1ZSB0byBoYXZlIHNvbWUgXCJqaXR0ZXJcIiAod2l0aGluIDUwJSBvZiB0aGUgZGVsYXkgc2l6ZSkgc29cbiAgICAvLyB0aGF0IHJldHJpZXMgYWNyb3NzIG11bHRpcGxlIGNsaWVudHMgZG9uJ3Qgb2NjdXIgc2ltdWx0YW5lb3VzbHkuXG4gICAgY29uc3QgcmV0cnlBZnRlckluTXMgPSBjbGFtcGVkRGVsYXkgLyAyICsgKDAsIHJhbmRvbV9qc18xLmdldFJhbmRvbUludGVnZXJJbmNsdXNpdmUpKDAsIGNsYW1wZWREZWxheSAvIDIpO1xuICAgIHJldHVybiB7IHJldHJ5QWZ0ZXJJbk1zIH07XG59XG4vLyMgc291cmNlTWFwcGluZ1VSTD1kZWxheS5qcy5tYXAiLAogICAgIlwidXNlIHN0cmljdFwiO1xuLy8gQ29weXJpZ2h0IChjKSBNaWNyb3NvZnQgQ29ycG9yYXRpb24uXG4vLyBMaWNlbnNlZCB1bmRlciB0aGUgTUlUIExpY2Vuc2UuXG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJfX2VzTW9kdWxlXCIsIHsgdmFsdWU6IHRydWUgfSk7XG5leHBvcnRzLmNhbmNlbGFibGVQcm9taXNlUmFjZSA9IGNhbmNlbGFibGVQcm9taXNlUmFjZTtcbi8qKlxuICogcHJvbWlzZS5yYWNlKCkgd3JhcHBlciB0aGF0IGFib3J0cyByZXN0IG9mIHByb21pc2VzIGFzIHNvb24gYXMgdGhlIGZpcnN0IHByb21pc2Ugc2V0dGxlcy5cbiAqL1xuYXN5bmMgZnVuY3Rpb24gY2FuY2VsYWJsZVByb21pc2VSYWNlKGFib3J0YWJsZVByb21pc2VCdWlsZGVycywgb3B0aW9ucykge1xuICAgIHZhciBfYSwgX2I7XG4gICAgY29uc3QgYWJvcnRlciA9IG5ldyBBYm9ydENvbnRyb2xsZXIoKTtcbiAgICBmdW5jdGlvbiBhYm9ydEhhbmRsZXIoKSB7XG4gICAgICAgIGFib3J0ZXIuYWJvcnQoKTtcbiAgICB9XG4gICAgKF9hID0gb3B0aW9ucyA9PT0gbnVsbCB8fCBvcHRpb25zID09PSB2b2lkIDAgPyB2b2lkIDAgOiBvcHRpb25zLmFib3J0U2lnbmFsKSA9PT0gbnVsbCB8fCBfYSA9PT0gdm9pZCAwID8gdm9pZCAwIDogX2EuYWRkRXZlbnRMaXN0ZW5lcihcImFib3J0XCIsIGFib3J0SGFuZGxlcik7XG4gICAgdHJ5IHtcbiAgICAgICAgcmV0dXJuIGF3YWl0IFByb21pc2UucmFjZShhYm9ydGFibGVQcm9taXNlQnVpbGRlcnMubWFwKChwKSA9PiBwKHsgYWJvcnRTaWduYWw6IGFib3J0ZXIuc2lnbmFsIH0pKSk7XG4gICAgfVxuICAgIGZpbmFsbHkge1xuICAgICAgICBhYm9ydGVyLmFib3J0KCk7XG4gICAgICAgIChfYiA9IG9wdGlvbnMgPT09IG51bGwgfHwgb3B0aW9ucyA9PT0gdm9pZCAwID8gdm9pZCAwIDogb3B0aW9ucy5hYm9ydFNpZ25hbCkgPT09IG51bGwgfHwgX2IgPT09IHZvaWQgMCA/IHZvaWQgMCA6IF9iLnJlbW92ZUV2ZW50TGlzdGVuZXIoXCJhYm9ydFwiLCBhYm9ydEhhbmRsZXIpO1xuICAgIH1cbn1cbi8vIyBzb3VyY2VNYXBwaW5nVVJMPWFib3J0ZXJVdGlscy5qcy5tYXAiLAogICAgIlwidXNlIHN0cmljdFwiO1xuLy8gQ29weXJpZ2h0IChjKSBNaWNyb3NvZnQgQ29ycG9yYXRpb24uXG4vLyBMaWNlbnNlZCB1bmRlciB0aGUgTUlUIExpY2Vuc2UuXG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJfX2VzTW9kdWxlXCIsIHsgdmFsdWU6IHRydWUgfSk7XG5leHBvcnRzLmlzT2JqZWN0ID0gaXNPYmplY3Q7XG4vKipcbiAqIEhlbHBlciB0byBkZXRlcm1pbmUgd2hlbiBhbiBpbnB1dCBpcyBhIGdlbmVyaWMgSlMgb2JqZWN0LlxuICogQHJldHVybnMgdHJ1ZSB3aGVuIGlucHV0IGlzIGFuIG9iamVjdCB0eXBlIHRoYXQgaXMgbm90IG51bGwsIEFycmF5LCBSZWdFeHAsIG9yIERhdGUuXG4gKi9cbmZ1bmN0aW9uIGlzT2JqZWN0KGlucHV0KSB7XG4gICAgcmV0dXJuICh0eXBlb2YgaW5wdXQgPT09IFwib2JqZWN0XCIgJiZcbiAgICAgICAgaW5wdXQgIT09IG51bGwgJiZcbiAgICAgICAgIUFycmF5LmlzQXJyYXkoaW5wdXQpICYmXG4gICAgICAgICEoaW5wdXQgaW5zdGFuY2VvZiBSZWdFeHApICYmXG4gICAgICAgICEoaW5wdXQgaW5zdGFuY2VvZiBEYXRlKSk7XG59XG4vLyMgc291cmNlTWFwcGluZ1VSTD1vYmplY3QuanMubWFwIiwKICAgICJcInVzZSBzdHJpY3RcIjtcbi8vIENvcHlyaWdodCAoYykgTWljcm9zb2Z0IENvcnBvcmF0aW9uLlxuLy8gTGljZW5zZWQgdW5kZXIgdGhlIE1JVCBMaWNlbnNlLlxuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiX19lc01vZHVsZVwiLCB7IHZhbHVlOiB0cnVlIH0pO1xuZXhwb3J0cy5pc0Vycm9yID0gaXNFcnJvcjtcbmV4cG9ydHMuZ2V0RXJyb3JNZXNzYWdlID0gZ2V0RXJyb3JNZXNzYWdlO1xuY29uc3Qgb2JqZWN0X2pzXzEgPSByZXF1aXJlKFwiLi9vYmplY3QuanNcIik7XG4vKipcbiAqIFR5cGVndWFyZCBmb3IgYW4gZXJyb3Igb2JqZWN0IHNoYXBlIChoYXMgbmFtZSBhbmQgbWVzc2FnZSlcbiAqIEBwYXJhbSBlIC0gU29tZXRoaW5nIGNhdWdodCBieSBhIGNhdGNoIGNsYXVzZS5cbiAqL1xuZnVuY3Rpb24gaXNFcnJvcihlKSB7XG4gICAgaWYgKCgwLCBvYmplY3RfanNfMS5pc09iamVjdCkoZSkpIHtcbiAgICAgICAgY29uc3QgaGFzTmFtZSA9IHR5cGVvZiBlLm5hbWUgPT09IFwic3RyaW5nXCI7XG4gICAgICAgIGNvbnN0IGhhc01lc3NhZ2UgPSB0eXBlb2YgZS5tZXNzYWdlID09PSBcInN0cmluZ1wiO1xuICAgICAgICByZXR1cm4gaGFzTmFtZSAmJiBoYXNNZXNzYWdlO1xuICAgIH1cbiAgICByZXR1cm4gZmFsc2U7XG59XG4vKipcbiAqIEdpdmVuIHdoYXQgaXMgdGhvdWdodCB0byBiZSBhbiBlcnJvciBvYmplY3QsIHJldHVybiB0aGUgbWVzc2FnZSBpZiBwb3NzaWJsZS5cbiAqIElmIHRoZSBtZXNzYWdlIGlzIG1pc3NpbmcsIHJldHVybnMgYSBzdHJpbmdpZmllZCB2ZXJzaW9uIG9mIHRoZSBpbnB1dC5cbiAqIEBwYXJhbSBlIC0gU29tZXRoaW5nIHRocm93biBmcm9tIGEgdHJ5IGJsb2NrXG4gKiBAcmV0dXJucyBUaGUgZXJyb3IgbWVzc2FnZSBvciBhIHN0cmluZyBvZiB0aGUgaW5wdXRcbiAqL1xuZnVuY3Rpb24gZ2V0RXJyb3JNZXNzYWdlKGUpIHtcbiAgICBpZiAoaXNFcnJvcihlKSkge1xuICAgICAgICByZXR1cm4gZS5tZXNzYWdlO1xuICAgIH1cbiAgICBlbHNlIHtcbiAgICAgICAgbGV0IHN0cmluZ2lmaWVkO1xuICAgICAgICB0cnkge1xuICAgICAgICAgICAgaWYgKHR5cGVvZiBlID09PSBcIm9iamVjdFwiICYmIGUpIHtcbiAgICAgICAgICAgICAgICBzdHJpbmdpZmllZCA9IEpTT04uc3RyaW5naWZ5KGUpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgc3RyaW5naWZpZWQgPSBTdHJpbmcoZSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgY2F0Y2ggKGVycikge1xuICAgICAgICAgICAgc3RyaW5naWZpZWQgPSBcIlt1bmFibGUgdG8gc3RyaW5naWZ5IGlucHV0XVwiO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBgVW5rbm93biBlcnJvciAke3N0cmluZ2lmaWVkfWA7XG4gICAgfVxufVxuLy8jIHNvdXJjZU1hcHBpbmdVUkw9ZXJyb3IuanMubWFwIiwKICAgICJcInVzZSBzdHJpY3RcIjtcbi8vIENvcHlyaWdodCAoYykgTWljcm9zb2Z0IENvcnBvcmF0aW9uLlxuLy8gTGljZW5zZWQgdW5kZXIgdGhlIE1JVCBMaWNlbnNlLlxuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiX19lc01vZHVsZVwiLCB7IHZhbHVlOiB0cnVlIH0pO1xuZXhwb3J0cy5jb21wdXRlU2hhMjU2SG1hYyA9IGNvbXB1dGVTaGEyNTZIbWFjO1xuZXhwb3J0cy5jb21wdXRlU2hhMjU2SGFzaCA9IGNvbXB1dGVTaGEyNTZIYXNoO1xuY29uc3QgY3J5cHRvXzEgPSByZXF1aXJlKFwiY3J5cHRvXCIpO1xuLyoqXG4gKiBHZW5lcmF0ZXMgYSBTSEEtMjU2IEhNQUMgc2lnbmF0dXJlLlxuICogQHBhcmFtIGtleSAtIFRoZSBITUFDIGtleSByZXByZXNlbnRlZCBhcyBhIGJhc2U2NCBzdHJpbmcsIHVzZWQgdG8gZ2VuZXJhdGUgdGhlIGNyeXB0b2dyYXBoaWMgSE1BQyBoYXNoLlxuICogQHBhcmFtIHN0cmluZ1RvU2lnbiAtIFRoZSBkYXRhIHRvIGJlIHNpZ25lZC5cbiAqIEBwYXJhbSBlbmNvZGluZyAtIFRoZSB0ZXh0dWFsIGVuY29kaW5nIHRvIHVzZSBmb3IgdGhlIHJldHVybmVkIEhNQUMgZGlnZXN0LlxuICovXG5hc3luYyBmdW5jdGlvbiBjb21wdXRlU2hhMjU2SG1hYyhrZXksIHN0cmluZ1RvU2lnbiwgZW5jb2RpbmcpIHtcbiAgICBjb25zdCBkZWNvZGVkS2V5ID0gQnVmZmVyLmZyb20oa2V5LCBcImJhc2U2NFwiKTtcbiAgICByZXR1cm4gKDAsIGNyeXB0b18xLmNyZWF0ZUhtYWMpKFwic2hhMjU2XCIsIGRlY29kZWRLZXkpLnVwZGF0ZShzdHJpbmdUb1NpZ24pLmRpZ2VzdChlbmNvZGluZyk7XG59XG4vKipcbiAqIEdlbmVyYXRlcyBhIFNIQS0yNTYgaGFzaC5cbiAqIEBwYXJhbSBjb250ZW50IC0gVGhlIGRhdGEgdG8gYmUgaW5jbHVkZWQgaW4gdGhlIGhhc2guXG4gKiBAcGFyYW0gZW5jb2RpbmcgLSBUaGUgdGV4dHVhbCBlbmNvZGluZyB0byB1c2UgZm9yIHRoZSByZXR1cm5lZCBoYXNoLlxuICovXG5hc3luYyBmdW5jdGlvbiBjb21wdXRlU2hhMjU2SGFzaChjb250ZW50LCBlbmNvZGluZykge1xuICAgIHJldHVybiAoMCwgY3J5cHRvXzEuY3JlYXRlSGFzaCkoXCJzaGEyNTZcIikudXBkYXRlKGNvbnRlbnQpLmRpZ2VzdChlbmNvZGluZyk7XG59XG4vLyMgc291cmNlTWFwcGluZ1VSTD1zaGEyNTYuanMubWFwIiwKICAgICJcInVzZSBzdHJpY3RcIjtcbi8vIENvcHlyaWdodCAoYykgTWljcm9zb2Z0IENvcnBvcmF0aW9uLlxuLy8gTGljZW5zZWQgdW5kZXIgdGhlIE1JVCBMaWNlbnNlLlxuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiX19lc01vZHVsZVwiLCB7IHZhbHVlOiB0cnVlIH0pO1xuZXhwb3J0cy5pc0RlZmluZWQgPSBpc0RlZmluZWQ7XG5leHBvcnRzLmlzT2JqZWN0V2l0aFByb3BlcnRpZXMgPSBpc09iamVjdFdpdGhQcm9wZXJ0aWVzO1xuZXhwb3J0cy5vYmplY3RIYXNQcm9wZXJ0eSA9IG9iamVjdEhhc1Byb3BlcnR5O1xuLyoqXG4gKiBIZWxwZXIgVHlwZUd1YXJkIHRoYXQgY2hlY2tzIGlmIHNvbWV0aGluZyBpcyBkZWZpbmVkIG9yIG5vdC5cbiAqIEBwYXJhbSB0aGluZyAtIEFueXRoaW5nXG4gKi9cbmZ1bmN0aW9uIGlzRGVmaW5lZCh0aGluZykge1xuICAgIHJldHVybiB0eXBlb2YgdGhpbmcgIT09IFwidW5kZWZpbmVkXCIgJiYgdGhpbmcgIT09IG51bGw7XG59XG4vKipcbiAqIEhlbHBlciBUeXBlR3VhcmQgdGhhdCBjaGVja3MgaWYgdGhlIGlucHV0IGlzIGFuIG9iamVjdCB3aXRoIHRoZSBzcGVjaWZpZWQgcHJvcGVydGllcy5cbiAqIEBwYXJhbSB0aGluZyAtIEFueXRoaW5nLlxuICogQHBhcmFtIHByb3BlcnRpZXMgLSBUaGUgbmFtZSBvZiB0aGUgcHJvcGVydGllcyB0aGF0IHNob3VsZCBhcHBlYXIgaW4gdGhlIG9iamVjdC5cbiAqL1xuZnVuY3Rpb24gaXNPYmplY3RXaXRoUHJvcGVydGllcyh0aGluZywgcHJvcGVydGllcykge1xuICAgIGlmICghaXNEZWZpbmVkKHRoaW5nKSB8fCB0eXBlb2YgdGhpbmcgIT09IFwib2JqZWN0XCIpIHtcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgICBmb3IgKGNvbnN0IHByb3BlcnR5IG9mIHByb3BlcnRpZXMpIHtcbiAgICAgICAgaWYgKCFvYmplY3RIYXNQcm9wZXJ0eSh0aGluZywgcHJvcGVydHkpKSB7XG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIHRydWU7XG59XG4vKipcbiAqIEhlbHBlciBUeXBlR3VhcmQgdGhhdCBjaGVja3MgaWYgdGhlIGlucHV0IGlzIGFuIG9iamVjdCB3aXRoIHRoZSBzcGVjaWZpZWQgcHJvcGVydHkuXG4gKiBAcGFyYW0gdGhpbmcgLSBBbnkgb2JqZWN0LlxuICogQHBhcmFtIHByb3BlcnR5IC0gVGhlIG5hbWUgb2YgdGhlIHByb3BlcnR5IHRoYXQgc2hvdWxkIGFwcGVhciBpbiB0aGUgb2JqZWN0LlxuICovXG5mdW5jdGlvbiBvYmplY3RIYXNQcm9wZXJ0eSh0aGluZywgcHJvcGVydHkpIHtcbiAgICByZXR1cm4gKGlzRGVmaW5lZCh0aGluZykgJiYgdHlwZW9mIHRoaW5nID09PSBcIm9iamVjdFwiICYmIHByb3BlcnR5IGluIHRoaW5nKTtcbn1cbi8vIyBzb3VyY2VNYXBwaW5nVVJMPXR5cGVHdWFyZHMuanMubWFwIiwKICAgICJcInVzZSBzdHJpY3RcIjtcbi8vIENvcHlyaWdodCAoYykgTWljcm9zb2Z0IENvcnBvcmF0aW9uLlxuLy8gTGljZW5zZWQgdW5kZXIgdGhlIE1JVCBMaWNlbnNlLlxudmFyIF9hO1xuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiX19lc01vZHVsZVwiLCB7IHZhbHVlOiB0cnVlIH0pO1xuZXhwb3J0cy5yYW5kb21VVUlEID0gcmFuZG9tVVVJRDtcbmNvbnN0IGNyeXB0b18xID0gcmVxdWlyZShcImNyeXB0b1wiKTtcbi8vIE5PVEU6IFRoaXMgaXMgYSB3b3JrYXJvdW5kIHVudGlsIHdlIGNhbiB1c2UgYGdsb2JhbFRoaXMuY3J5cHRvLnJhbmRvbVVVSURgIGluIE5vZGUuanMgMTkrLlxuY29uc3QgdXVpZEZ1bmN0aW9uID0gdHlwZW9mICgoX2EgPSBnbG9iYWxUaGlzID09PSBudWxsIHx8IGdsb2JhbFRoaXMgPT09IHZvaWQgMCA/IHZvaWQgMCA6IGdsb2JhbFRoaXMuY3J5cHRvKSA9PT0gbnVsbCB8fCBfYSA9PT0gdm9pZCAwID8gdm9pZCAwIDogX2EucmFuZG9tVVVJRCkgPT09IFwiZnVuY3Rpb25cIlxuICAgID8gZ2xvYmFsVGhpcy5jcnlwdG8ucmFuZG9tVVVJRC5iaW5kKGdsb2JhbFRoaXMuY3J5cHRvKVxuICAgIDogY3J5cHRvXzEucmFuZG9tVVVJRDtcbi8qKlxuICogR2VuZXJhdGVkIFVuaXZlcnNhbGx5IFVuaXF1ZSBJZGVudGlmaWVyXG4gKlxuICogQHJldHVybnMgUkZDNDEyMiB2NCBVVUlELlxuICovXG5mdW5jdGlvbiByYW5kb21VVUlEKCkge1xuICAgIHJldHVybiB1dWlkRnVuY3Rpb24oKTtcbn1cbi8vIyBzb3VyY2VNYXBwaW5nVVJMPXV1aWRVdGlscy5qcy5tYXAiLAogICAgIlwidXNlIHN0cmljdFwiO1xuLy8gQ29weXJpZ2h0IChjKSBNaWNyb3NvZnQgQ29ycG9yYXRpb24uXG4vLyBMaWNlbnNlZCB1bmRlciB0aGUgTUlUIExpY2Vuc2UuXG52YXIgX2EsIF9iLCBfYywgX2Q7XG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJfX2VzTW9kdWxlXCIsIHsgdmFsdWU6IHRydWUgfSk7XG5leHBvcnRzLmlzUmVhY3ROYXRpdmUgPSBleHBvcnRzLmlzTm9kZVJ1bnRpbWUgPSBleHBvcnRzLmlzTm9kZSA9IGV4cG9ydHMuaXNOb2RlTGlrZSA9IGV4cG9ydHMuaXNCdW4gPSBleHBvcnRzLmlzRGVubyA9IGV4cG9ydHMuaXNXZWJXb3JrZXIgPSBleHBvcnRzLmlzQnJvd3NlciA9IHZvaWQgMDtcbi8qKlxuICogQSBjb25zdGFudCB0aGF0IGluZGljYXRlcyB3aGV0aGVyIHRoZSBlbnZpcm9ubWVudCB0aGUgY29kZSBpcyBydW5uaW5nIGlzIGEgV2ViIEJyb3dzZXIuXG4gKi9cbi8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAYXp1cmUvYXp1cmUtc2RrL3RzLW5vLXdpbmRvd1xuZXhwb3J0cy5pc0Jyb3dzZXIgPSB0eXBlb2Ygd2luZG93ICE9PSBcInVuZGVmaW5lZFwiICYmIHR5cGVvZiB3aW5kb3cuZG9jdW1lbnQgIT09IFwidW5kZWZpbmVkXCI7XG4vKipcbiAqIEEgY29uc3RhbnQgdGhhdCBpbmRpY2F0ZXMgd2hldGhlciB0aGUgZW52aXJvbm1lbnQgdGhlIGNvZGUgaXMgcnVubmluZyBpcyBhIFdlYiBXb3JrZXIuXG4gKi9cbmV4cG9ydHMuaXNXZWJXb3JrZXIgPSB0eXBlb2Ygc2VsZiA9PT0gXCJvYmplY3RcIiAmJlxuICAgIHR5cGVvZiAoc2VsZiA9PT0gbnVsbCB8fCBzZWxmID09PSB2b2lkIDAgPyB2b2lkIDAgOiBzZWxmLmltcG9ydFNjcmlwdHMpID09PSBcImZ1bmN0aW9uXCIgJiZcbiAgICAoKChfYSA9IHNlbGYuY29uc3RydWN0b3IpID09PSBudWxsIHx8IF9hID09PSB2b2lkIDAgPyB2b2lkIDAgOiBfYS5uYW1lKSA9PT0gXCJEZWRpY2F0ZWRXb3JrZXJHbG9iYWxTY29wZVwiIHx8XG4gICAgICAgICgoX2IgPSBzZWxmLmNvbnN0cnVjdG9yKSA9PT0gbnVsbCB8fCBfYiA9PT0gdm9pZCAwID8gdm9pZCAwIDogX2IubmFtZSkgPT09IFwiU2VydmljZVdvcmtlckdsb2JhbFNjb3BlXCIgfHxcbiAgICAgICAgKChfYyA9IHNlbGYuY29uc3RydWN0b3IpID09PSBudWxsIHx8IF9jID09PSB2b2lkIDAgPyB2b2lkIDAgOiBfYy5uYW1lKSA9PT0gXCJTaGFyZWRXb3JrZXJHbG9iYWxTY29wZVwiKTtcbi8qKlxuICogQSBjb25zdGFudCB0aGF0IGluZGljYXRlcyB3aGV0aGVyIHRoZSBlbnZpcm9ubWVudCB0aGUgY29kZSBpcyBydW5uaW5nIGlzIERlbm8uXG4gKi9cbmV4cG9ydHMuaXNEZW5vID0gdHlwZW9mIERlbm8gIT09IFwidW5kZWZpbmVkXCIgJiZcbiAgICB0eXBlb2YgRGVuby52ZXJzaW9uICE9PSBcInVuZGVmaW5lZFwiICYmXG4gICAgdHlwZW9mIERlbm8udmVyc2lvbi5kZW5vICE9PSBcInVuZGVmaW5lZFwiO1xuLyoqXG4gKiBBIGNvbnN0YW50IHRoYXQgaW5kaWNhdGVzIHdoZXRoZXIgdGhlIGVudmlyb25tZW50IHRoZSBjb2RlIGlzIHJ1bm5pbmcgaXMgQnVuLnNoLlxuICovXG5leHBvcnRzLmlzQnVuID0gdHlwZW9mIEJ1biAhPT0gXCJ1bmRlZmluZWRcIiAmJiB0eXBlb2YgQnVuLnZlcnNpb24gIT09IFwidW5kZWZpbmVkXCI7XG4vKipcbiAqIEEgY29uc3RhbnQgdGhhdCBpbmRpY2F0ZXMgd2hldGhlciB0aGUgZW52aXJvbm1lbnQgdGhlIGNvZGUgaXMgcnVubmluZyBpcyBhIE5vZGUuanMgY29tcGF0aWJsZSBlbnZpcm9ubWVudC5cbiAqL1xuZXhwb3J0cy5pc05vZGVMaWtlID0gdHlwZW9mIGdsb2JhbFRoaXMucHJvY2VzcyAhPT0gXCJ1bmRlZmluZWRcIiAmJlxuICAgIEJvb2xlYW4oZ2xvYmFsVGhpcy5wcm9jZXNzLnZlcnNpb24pICYmXG4gICAgQm9vbGVhbigoX2QgPSBnbG9iYWxUaGlzLnByb2Nlc3MudmVyc2lvbnMpID09PSBudWxsIHx8IF9kID09PSB2b2lkIDAgPyB2b2lkIDAgOiBfZC5ub2RlKTtcbi8qKlxuICogQSBjb25zdGFudCB0aGF0IGluZGljYXRlcyB3aGV0aGVyIHRoZSBlbnZpcm9ubWVudCB0aGUgY29kZSBpcyBydW5uaW5nIGlzIGEgTm9kZS5qcyBjb21wYXRpYmxlIGVudmlyb25tZW50LlxuICogQGRlcHJlY2F0ZWQgVXNlIGBpc05vZGVMaWtlYCBpbnN0ZWFkLlxuICovXG5leHBvcnRzLmlzTm9kZSA9IGV4cG9ydHMuaXNOb2RlTGlrZTtcbi8qKlxuICogQSBjb25zdGFudCB0aGF0IGluZGljYXRlcyB3aGV0aGVyIHRoZSBlbnZpcm9ubWVudCB0aGUgY29kZSBpcyBydW5uaW5nIGlzIE5vZGUuSlMuXG4gKi9cbmV4cG9ydHMuaXNOb2RlUnVudGltZSA9IGV4cG9ydHMuaXNOb2RlTGlrZSAmJiAhZXhwb3J0cy5pc0J1biAmJiAhZXhwb3J0cy5pc0Rlbm87XG4vKipcbiAqIEEgY29uc3RhbnQgdGhhdCBpbmRpY2F0ZXMgd2hldGhlciB0aGUgZW52aXJvbm1lbnQgdGhlIGNvZGUgaXMgcnVubmluZyBpcyBpbiBSZWFjdC1OYXRpdmUuXG4gKi9cbi8vIGh0dHBzOi8vZ2l0aHViLmNvbS9mYWNlYm9vay9yZWFjdC1uYXRpdmUvYmxvYi9tYWluL3BhY2thZ2VzL3JlYWN0LW5hdGl2ZS9MaWJyYXJpZXMvQ29yZS9zZXRVcE5hdmlnYXRvci5qc1xuZXhwb3J0cy5pc1JlYWN0TmF0aXZlID0gdHlwZW9mIG5hdmlnYXRvciAhPT0gXCJ1bmRlZmluZWRcIiAmJiAobmF2aWdhdG9yID09PSBudWxsIHx8IG5hdmlnYXRvciA9PT0gdm9pZCAwID8gdm9pZCAwIDogbmF2aWdhdG9yLnByb2R1Y3QpID09PSBcIlJlYWN0TmF0aXZlXCI7XG4vLyMgc291cmNlTWFwcGluZ1VSTD1jaGVja0Vudmlyb25tZW50LmpzLm1hcCIsCiAgICAiXCJ1c2Ugc3RyaWN0XCI7XG4vLyBDb3B5cmlnaHQgKGMpIE1pY3Jvc29mdCBDb3Jwb3JhdGlvbi5cbi8vIExpY2Vuc2VkIHVuZGVyIHRoZSBNSVQgTGljZW5zZS5cbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIl9fZXNNb2R1bGVcIiwgeyB2YWx1ZTogdHJ1ZSB9KTtcbmV4cG9ydHMudWludDhBcnJheVRvU3RyaW5nID0gdWludDhBcnJheVRvU3RyaW5nO1xuZXhwb3J0cy5zdHJpbmdUb1VpbnQ4QXJyYXkgPSBzdHJpbmdUb1VpbnQ4QXJyYXk7XG4vKipcbiAqIFRoZSBoZWxwZXIgdGhhdCB0cmFuc2Zvcm1zIGJ5dGVzIHdpdGggc3BlY2lmaWMgY2hhcmFjdGVyIGVuY29kaW5nIGludG8gc3RyaW5nXG4gKiBAcGFyYW0gYnl0ZXMgLSB0aGUgdWludDhhcnJheSBieXRlc1xuICogQHBhcmFtIGZvcm1hdCAtIHRoZSBmb3JtYXQgd2UgdXNlIHRvIGVuY29kZSB0aGUgYnl0ZVxuICogQHJldHVybnMgYSBzdHJpbmcgb2YgdGhlIGVuY29kZWQgc3RyaW5nXG4gKi9cbmZ1bmN0aW9uIHVpbnQ4QXJyYXlUb1N0cmluZyhieXRlcywgZm9ybWF0KSB7XG4gICAgcmV0dXJuIEJ1ZmZlci5mcm9tKGJ5dGVzKS50b1N0cmluZyhmb3JtYXQpO1xufVxuLyoqXG4gKiBUaGUgaGVscGVyIHRoYXQgdHJhbnNmb3JtcyBzdHJpbmcgdG8gc3BlY2lmaWMgY2hhcmFjdGVyIGVuY29kZWQgYnl0ZXMgYXJyYXkuXG4gKiBAcGFyYW0gdmFsdWUgLSB0aGUgc3RyaW5nIHRvIGJlIGNvbnZlcnRlZFxuICogQHBhcmFtIGZvcm1hdCAtIHRoZSBmb3JtYXQgd2UgdXNlIHRvIGRlY29kZSB0aGUgdmFsdWVcbiAqIEByZXR1cm5zIGEgdWludDhhcnJheVxuICovXG5mdW5jdGlvbiBzdHJpbmdUb1VpbnQ4QXJyYXkodmFsdWUsIGZvcm1hdCkge1xuICAgIHJldHVybiBCdWZmZXIuZnJvbSh2YWx1ZSwgZm9ybWF0KTtcbn1cbi8vIyBzb3VyY2VNYXBwaW5nVVJMPWJ5dGVzRW5jb2RpbmcuanMubWFwIiwKICAgICJcInVzZSBzdHJpY3RcIjtcbi8vIENvcHlyaWdodCAoYykgTWljcm9zb2Z0IENvcnBvcmF0aW9uLlxuLy8gTGljZW5zZWQgdW5kZXIgdGhlIE1JVCBMaWNlbnNlLlxuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiX19lc01vZHVsZVwiLCB7IHZhbHVlOiB0cnVlIH0pO1xuZXhwb3J0cy5zdHJpbmdUb1VpbnQ4QXJyYXkgPSBleHBvcnRzLnVpbnQ4QXJyYXlUb1N0cmluZyA9IGV4cG9ydHMuaXNXZWJXb3JrZXIgPSBleHBvcnRzLmlzUmVhY3ROYXRpdmUgPSBleHBvcnRzLmlzRGVubyA9IGV4cG9ydHMuaXNOb2RlUnVudGltZSA9IGV4cG9ydHMuaXNOb2RlTGlrZSA9IGV4cG9ydHMuaXNOb2RlID0gZXhwb3J0cy5pc0J1biA9IGV4cG9ydHMuaXNCcm93c2VyID0gZXhwb3J0cy5yYW5kb21VVUlEID0gZXhwb3J0cy5vYmplY3RIYXNQcm9wZXJ0eSA9IGV4cG9ydHMuaXNPYmplY3RXaXRoUHJvcGVydGllcyA9IGV4cG9ydHMuaXNEZWZpbmVkID0gZXhwb3J0cy5jb21wdXRlU2hhMjU2SG1hYyA9IGV4cG9ydHMuY29tcHV0ZVNoYTI1Nkhhc2ggPSBleHBvcnRzLmdldEVycm9yTWVzc2FnZSA9IGV4cG9ydHMuaXNFcnJvciA9IGV4cG9ydHMuaXNPYmplY3QgPSBleHBvcnRzLmdldFJhbmRvbUludGVnZXJJbmNsdXNpdmUgPSBleHBvcnRzLmNyZWF0ZUFib3J0YWJsZVByb21pc2UgPSBleHBvcnRzLmNhbmNlbGFibGVQcm9taXNlUmFjZSA9IGV4cG9ydHMuY2FsY3VsYXRlUmV0cnlEZWxheSA9IGV4cG9ydHMuZGVsYXkgPSB2b2lkIDA7XG52YXIgZGVsYXlfanNfMSA9IHJlcXVpcmUoXCIuL2RlbGF5LmpzXCIpO1xuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiZGVsYXlcIiwgeyBlbnVtZXJhYmxlOiB0cnVlLCBnZXQ6IGZ1bmN0aW9uICgpIHsgcmV0dXJuIGRlbGF5X2pzXzEuZGVsYXk7IH0gfSk7XG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJjYWxjdWxhdGVSZXRyeURlbGF5XCIsIHsgZW51bWVyYWJsZTogdHJ1ZSwgZ2V0OiBmdW5jdGlvbiAoKSB7IHJldHVybiBkZWxheV9qc18xLmNhbGN1bGF0ZVJldHJ5RGVsYXk7IH0gfSk7XG52YXIgYWJvcnRlclV0aWxzX2pzXzEgPSByZXF1aXJlKFwiLi9hYm9ydGVyVXRpbHMuanNcIik7XG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJjYW5jZWxhYmxlUHJvbWlzZVJhY2VcIiwgeyBlbnVtZXJhYmxlOiB0cnVlLCBnZXQ6IGZ1bmN0aW9uICgpIHsgcmV0dXJuIGFib3J0ZXJVdGlsc19qc18xLmNhbmNlbGFibGVQcm9taXNlUmFjZTsgfSB9KTtcbnZhciBjcmVhdGVBYm9ydGFibGVQcm9taXNlX2pzXzEgPSByZXF1aXJlKFwiLi9jcmVhdGVBYm9ydGFibGVQcm9taXNlLmpzXCIpO1xuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiY3JlYXRlQWJvcnRhYmxlUHJvbWlzZVwiLCB7IGVudW1lcmFibGU6IHRydWUsIGdldDogZnVuY3Rpb24gKCkgeyByZXR1cm4gY3JlYXRlQWJvcnRhYmxlUHJvbWlzZV9qc18xLmNyZWF0ZUFib3J0YWJsZVByb21pc2U7IH0gfSk7XG52YXIgcmFuZG9tX2pzXzEgPSByZXF1aXJlKFwiLi9yYW5kb20uanNcIik7XG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJnZXRSYW5kb21JbnRlZ2VySW5jbHVzaXZlXCIsIHsgZW51bWVyYWJsZTogdHJ1ZSwgZ2V0OiBmdW5jdGlvbiAoKSB7IHJldHVybiByYW5kb21fanNfMS5nZXRSYW5kb21JbnRlZ2VySW5jbHVzaXZlOyB9IH0pO1xudmFyIG9iamVjdF9qc18xID0gcmVxdWlyZShcIi4vb2JqZWN0LmpzXCIpO1xuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiaXNPYmplY3RcIiwgeyBlbnVtZXJhYmxlOiB0cnVlLCBnZXQ6IGZ1bmN0aW9uICgpIHsgcmV0dXJuIG9iamVjdF9qc18xLmlzT2JqZWN0OyB9IH0pO1xudmFyIGVycm9yX2pzXzEgPSByZXF1aXJlKFwiLi9lcnJvci5qc1wiKTtcbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcImlzRXJyb3JcIiwgeyBlbnVtZXJhYmxlOiB0cnVlLCBnZXQ6IGZ1bmN0aW9uICgpIHsgcmV0dXJuIGVycm9yX2pzXzEuaXNFcnJvcjsgfSB9KTtcbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcImdldEVycm9yTWVzc2FnZVwiLCB7IGVudW1lcmFibGU6IHRydWUsIGdldDogZnVuY3Rpb24gKCkgeyByZXR1cm4gZXJyb3JfanNfMS5nZXRFcnJvck1lc3NhZ2U7IH0gfSk7XG52YXIgc2hhMjU2X2pzXzEgPSByZXF1aXJlKFwiLi9zaGEyNTYuanNcIik7XG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJjb21wdXRlU2hhMjU2SGFzaFwiLCB7IGVudW1lcmFibGU6IHRydWUsIGdldDogZnVuY3Rpb24gKCkgeyByZXR1cm4gc2hhMjU2X2pzXzEuY29tcHV0ZVNoYTI1Nkhhc2g7IH0gfSk7XG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJjb21wdXRlU2hhMjU2SG1hY1wiLCB7IGVudW1lcmFibGU6IHRydWUsIGdldDogZnVuY3Rpb24gKCkgeyByZXR1cm4gc2hhMjU2X2pzXzEuY29tcHV0ZVNoYTI1NkhtYWM7IH0gfSk7XG52YXIgdHlwZUd1YXJkc19qc18xID0gcmVxdWlyZShcIi4vdHlwZUd1YXJkcy5qc1wiKTtcbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcImlzRGVmaW5lZFwiLCB7IGVudW1lcmFibGU6IHRydWUsIGdldDogZnVuY3Rpb24gKCkgeyByZXR1cm4gdHlwZUd1YXJkc19qc18xLmlzRGVmaW5lZDsgfSB9KTtcbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcImlzT2JqZWN0V2l0aFByb3BlcnRpZXNcIiwgeyBlbnVtZXJhYmxlOiB0cnVlLCBnZXQ6IGZ1bmN0aW9uICgpIHsgcmV0dXJuIHR5cGVHdWFyZHNfanNfMS5pc09iamVjdFdpdGhQcm9wZXJ0aWVzOyB9IH0pO1xuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwib2JqZWN0SGFzUHJvcGVydHlcIiwgeyBlbnVtZXJhYmxlOiB0cnVlLCBnZXQ6IGZ1bmN0aW9uICgpIHsgcmV0dXJuIHR5cGVHdWFyZHNfanNfMS5vYmplY3RIYXNQcm9wZXJ0eTsgfSB9KTtcbnZhciB1dWlkVXRpbHNfanNfMSA9IHJlcXVpcmUoXCIuL3V1aWRVdGlscy5qc1wiKTtcbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcInJhbmRvbVVVSURcIiwgeyBlbnVtZXJhYmxlOiB0cnVlLCBnZXQ6IGZ1bmN0aW9uICgpIHsgcmV0dXJuIHV1aWRVdGlsc19qc18xLnJhbmRvbVVVSUQ7IH0gfSk7XG52YXIgY2hlY2tFbnZpcm9ubWVudF9qc18xID0gcmVxdWlyZShcIi4vY2hlY2tFbnZpcm9ubWVudC5qc1wiKTtcbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcImlzQnJvd3NlclwiLCB7IGVudW1lcmFibGU6IHRydWUsIGdldDogZnVuY3Rpb24gKCkgeyByZXR1cm4gY2hlY2tFbnZpcm9ubWVudF9qc18xLmlzQnJvd3NlcjsgfSB9KTtcbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcImlzQnVuXCIsIHsgZW51bWVyYWJsZTogdHJ1ZSwgZ2V0OiBmdW5jdGlvbiAoKSB7IHJldHVybiBjaGVja0Vudmlyb25tZW50X2pzXzEuaXNCdW47IH0gfSk7XG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJpc05vZGVcIiwgeyBlbnVtZXJhYmxlOiB0cnVlLCBnZXQ6IGZ1bmN0aW9uICgpIHsgcmV0dXJuIGNoZWNrRW52aXJvbm1lbnRfanNfMS5pc05vZGU7IH0gfSk7XG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJpc05vZGVMaWtlXCIsIHsgZW51bWVyYWJsZTogdHJ1ZSwgZ2V0OiBmdW5jdGlvbiAoKSB7IHJldHVybiBjaGVja0Vudmlyb25tZW50X2pzXzEuaXNOb2RlTGlrZTsgfSB9KTtcbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcImlzTm9kZVJ1bnRpbWVcIiwgeyBlbnVtZXJhYmxlOiB0cnVlLCBnZXQ6IGZ1bmN0aW9uICgpIHsgcmV0dXJuIGNoZWNrRW52aXJvbm1lbnRfanNfMS5pc05vZGVSdW50aW1lOyB9IH0pO1xuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiaXNEZW5vXCIsIHsgZW51bWVyYWJsZTogdHJ1ZSwgZ2V0OiBmdW5jdGlvbiAoKSB7IHJldHVybiBjaGVja0Vudmlyb25tZW50X2pzXzEuaXNEZW5vOyB9IH0pO1xuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiaXNSZWFjdE5hdGl2ZVwiLCB7IGVudW1lcmFibGU6IHRydWUsIGdldDogZnVuY3Rpb24gKCkgeyByZXR1cm4gY2hlY2tFbnZpcm9ubWVudF9qc18xLmlzUmVhY3ROYXRpdmU7IH0gfSk7XG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJpc1dlYldvcmtlclwiLCB7IGVudW1lcmFibGU6IHRydWUsIGdldDogZnVuY3Rpb24gKCkgeyByZXR1cm4gY2hlY2tFbnZpcm9ubWVudF9qc18xLmlzV2ViV29ya2VyOyB9IH0pO1xudmFyIGJ5dGVzRW5jb2RpbmdfanNfMSA9IHJlcXVpcmUoXCIuL2J5dGVzRW5jb2RpbmcuanNcIik7XG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJ1aW50OEFycmF5VG9TdHJpbmdcIiwgeyBlbnVtZXJhYmxlOiB0cnVlLCBnZXQ6IGZ1bmN0aW9uICgpIHsgcmV0dXJuIGJ5dGVzRW5jb2RpbmdfanNfMS51aW50OEFycmF5VG9TdHJpbmc7IH0gfSk7XG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJzdHJpbmdUb1VpbnQ4QXJyYXlcIiwgeyBlbnVtZXJhYmxlOiB0cnVlLCBnZXQ6IGZ1bmN0aW9uICgpIHsgcmV0dXJuIGJ5dGVzRW5jb2RpbmdfanNfMS5zdHJpbmdUb1VpbnQ4QXJyYXk7IH0gfSk7XG4vLyMgc291cmNlTWFwcGluZ1VSTD1pbmRleC5qcy5tYXAiLAogICAgIlwidXNlIHN0cmljdFwiO1xuLy8gQ29weXJpZ2h0IChjKSBNaWNyb3NvZnQgQ29ycG9yYXRpb24uXG4vLyBMaWNlbnNlZCB1bmRlciB0aGUgTUlUIExpY2Vuc2UuXG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJfX2VzTW9kdWxlXCIsIHsgdmFsdWU6IHRydWUgfSk7XG5leHBvcnRzLlNhbml0aXplciA9IHZvaWQgMDtcbmNvbnN0IGNvcmVfdXRpbF8xID0gcmVxdWlyZShcIkBhenVyZS9jb3JlLXV0aWxcIik7XG5jb25zdCBSZWRhY3RlZFN0cmluZyA9IFwiUkVEQUNURURcIjtcbi8vIE1ha2Ugc3VyZSB0aGlzIGxpc3QgaXMgdXAtdG8tZGF0ZSB3aXRoIHRoZSBvbmUgdW5kZXIgY29yZS9sb2dnZXIvUmVhZG1lI0tleWNvbmNlcHRzXG5jb25zdCBkZWZhdWx0QWxsb3dlZEhlYWRlck5hbWVzID0gW1xuICAgIFwieC1tcy1jbGllbnQtcmVxdWVzdC1pZFwiLFxuICAgIFwieC1tcy1yZXR1cm4tY2xpZW50LXJlcXVlc3QtaWRcIixcbiAgICBcIngtbXMtdXNlcmFnZW50XCIsXG4gICAgXCJ4LW1zLWNvcnJlbGF0aW9uLXJlcXVlc3QtaWRcIixcbiAgICBcIngtbXMtcmVxdWVzdC1pZFwiLFxuICAgIFwiY2xpZW50LXJlcXVlc3QtaWRcIixcbiAgICBcIm1zLWN2XCIsXG4gICAgXCJyZXR1cm4tY2xpZW50LXJlcXVlc3QtaWRcIixcbiAgICBcInRyYWNlcGFyZW50XCIsXG4gICAgXCJBY2Nlc3MtQ29udHJvbC1BbGxvdy1DcmVkZW50aWFsc1wiLFxuICAgIFwiQWNjZXNzLUNvbnRyb2wtQWxsb3ctSGVhZGVyc1wiLFxuICAgIFwiQWNjZXNzLUNvbnRyb2wtQWxsb3ctTWV0aG9kc1wiLFxuICAgIFwiQWNjZXNzLUNvbnRyb2wtQWxsb3ctT3JpZ2luXCIsXG4gICAgXCJBY2Nlc3MtQ29udHJvbC1FeHBvc2UtSGVhZGVyc1wiLFxuICAgIFwiQWNjZXNzLUNvbnRyb2wtTWF4LUFnZVwiLFxuICAgIFwiQWNjZXNzLUNvbnRyb2wtUmVxdWVzdC1IZWFkZXJzXCIsXG4gICAgXCJBY2Nlc3MtQ29udHJvbC1SZXF1ZXN0LU1ldGhvZFwiLFxuICAgIFwiT3JpZ2luXCIsXG4gICAgXCJBY2NlcHRcIixcbiAgICBcIkFjY2VwdC1FbmNvZGluZ1wiLFxuICAgIFwiQ2FjaGUtQ29udHJvbFwiLFxuICAgIFwiQ29ubmVjdGlvblwiLFxuICAgIFwiQ29udGVudC1MZW5ndGhcIixcbiAgICBcIkNvbnRlbnQtVHlwZVwiLFxuICAgIFwiRGF0ZVwiLFxuICAgIFwiRVRhZ1wiLFxuICAgIFwiRXhwaXJlc1wiLFxuICAgIFwiSWYtTWF0Y2hcIixcbiAgICBcIklmLU1vZGlmaWVkLVNpbmNlXCIsXG4gICAgXCJJZi1Ob25lLU1hdGNoXCIsXG4gICAgXCJJZi1Vbm1vZGlmaWVkLVNpbmNlXCIsXG4gICAgXCJMYXN0LU1vZGlmaWVkXCIsXG4gICAgXCJQcmFnbWFcIixcbiAgICBcIlJlcXVlc3QtSWRcIixcbiAgICBcIlJldHJ5LUFmdGVyXCIsXG4gICAgXCJTZXJ2ZXJcIixcbiAgICBcIlRyYW5zZmVyLUVuY29kaW5nXCIsXG4gICAgXCJVc2VyLUFnZW50XCIsXG4gICAgXCJXV1ctQXV0aGVudGljYXRlXCIsXG5dO1xuY29uc3QgZGVmYXVsdEFsbG93ZWRRdWVyeVBhcmFtZXRlcnMgPSBbXCJhcGktdmVyc2lvblwiXTtcbi8qKlxuICogQGludGVybmFsXG4gKi9cbmNsYXNzIFNhbml0aXplciB7XG4gICAgY29uc3RydWN0b3IoeyBhZGRpdGlvbmFsQWxsb3dlZEhlYWRlck5hbWVzOiBhbGxvd2VkSGVhZGVyTmFtZXMgPSBbXSwgYWRkaXRpb25hbEFsbG93ZWRRdWVyeVBhcmFtZXRlcnM6IGFsbG93ZWRRdWVyeVBhcmFtZXRlcnMgPSBbXSwgfSA9IHt9KSB7XG4gICAgICAgIGFsbG93ZWRIZWFkZXJOYW1lcyA9IGRlZmF1bHRBbGxvd2VkSGVhZGVyTmFtZXMuY29uY2F0KGFsbG93ZWRIZWFkZXJOYW1lcyk7XG4gICAgICAgIGFsbG93ZWRRdWVyeVBhcmFtZXRlcnMgPSBkZWZhdWx0QWxsb3dlZFF1ZXJ5UGFyYW1ldGVycy5jb25jYXQoYWxsb3dlZFF1ZXJ5UGFyYW1ldGVycyk7XG4gICAgICAgIHRoaXMuYWxsb3dlZEhlYWRlck5hbWVzID0gbmV3IFNldChhbGxvd2VkSGVhZGVyTmFtZXMubWFwKChuKSA9PiBuLnRvTG93ZXJDYXNlKCkpKTtcbiAgICAgICAgdGhpcy5hbGxvd2VkUXVlcnlQYXJhbWV0ZXJzID0gbmV3IFNldChhbGxvd2VkUXVlcnlQYXJhbWV0ZXJzLm1hcCgocCkgPT4gcC50b0xvd2VyQ2FzZSgpKSk7XG4gICAgfVxuICAgIHNhbml0aXplKG9iaikge1xuICAgICAgICBjb25zdCBzZWVuID0gbmV3IFNldCgpO1xuICAgICAgICByZXR1cm4gSlNPTi5zdHJpbmdpZnkob2JqLCAoa2V5LCB2YWx1ZSkgPT4ge1xuICAgICAgICAgICAgLy8gRW5zdXJlIEVycm9ycyBpbmNsdWRlIHRoZWlyIGludGVyZXN0aW5nIG5vbi1lbnVtZXJhYmxlIG1lbWJlcnNcbiAgICAgICAgICAgIGlmICh2YWx1ZSBpbnN0YW5jZW9mIEVycm9yKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIE9iamVjdC5hc3NpZ24oT2JqZWN0LmFzc2lnbih7fSwgdmFsdWUpLCB7IG5hbWU6IHZhbHVlLm5hbWUsIG1lc3NhZ2U6IHZhbHVlLm1lc3NhZ2UgfSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAoa2V5ID09PSBcImhlYWRlcnNcIikge1xuICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLnNhbml0aXplSGVhZGVycyh2YWx1ZSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIGlmIChrZXkgPT09IFwidXJsXCIpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5zYW5pdGl6ZVVybCh2YWx1ZSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIGlmIChrZXkgPT09IFwicXVlcnlcIikge1xuICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLnNhbml0aXplUXVlcnkodmFsdWUpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSBpZiAoa2V5ID09PSBcImJvZHlcIikge1xuICAgICAgICAgICAgICAgIC8vIERvbid0IGxvZyB0aGUgcmVxdWVzdCBib2R5XG4gICAgICAgICAgICAgICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2UgaWYgKGtleSA9PT0gXCJyZXNwb25zZVwiKSB7XG4gICAgICAgICAgICAgICAgLy8gRG9uJ3QgbG9nIHJlc3BvbnNlIGFnYWluXG4gICAgICAgICAgICAgICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2UgaWYgKGtleSA9PT0gXCJvcGVyYXRpb25TcGVjXCIpIHtcbiAgICAgICAgICAgICAgICAvLyBXaGVuIHVzaW5nIHNlbmRPcGVyYXRpb25SZXF1ZXN0LCB0aGUgcmVxdWVzdCBjYXJyaWVzIGEgbWFzc2l2ZVxuICAgICAgICAgICAgICAgIC8vIGZpZWxkIHdpdGggdGhlIGF1dG9yZXN0IHNwZWMuIE5vIG5lZWQgdG8gbG9nIGl0LlxuICAgICAgICAgICAgICAgIHJldHVybiB1bmRlZmluZWQ7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIGlmIChBcnJheS5pc0FycmF5KHZhbHVlKSB8fCAoMCwgY29yZV91dGlsXzEuaXNPYmplY3QpKHZhbHVlKSkge1xuICAgICAgICAgICAgICAgIGlmIChzZWVuLmhhcyh2YWx1ZSkpIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFwiW0NpcmN1bGFyXVwiO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBzZWVuLmFkZCh2YWx1ZSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4gdmFsdWU7XG4gICAgICAgIH0sIDIpO1xuICAgIH1cbiAgICBzYW5pdGl6ZVVybCh2YWx1ZSkge1xuICAgICAgICBpZiAodHlwZW9mIHZhbHVlICE9PSBcInN0cmluZ1wiIHx8IHZhbHVlID09PSBudWxsIHx8IHZhbHVlID09PSBcIlwiKSB7XG4gICAgICAgICAgICByZXR1cm4gdmFsdWU7XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgdXJsID0gbmV3IFVSTCh2YWx1ZSk7XG4gICAgICAgIGlmICghdXJsLnNlYXJjaCkge1xuICAgICAgICAgICAgcmV0dXJuIHZhbHVlO1xuICAgICAgICB9XG4gICAgICAgIGZvciAoY29uc3QgW2tleV0gb2YgdXJsLnNlYXJjaFBhcmFtcykge1xuICAgICAgICAgICAgaWYgKCF0aGlzLmFsbG93ZWRRdWVyeVBhcmFtZXRlcnMuaGFzKGtleS50b0xvd2VyQ2FzZSgpKSkge1xuICAgICAgICAgICAgICAgIHVybC5zZWFyY2hQYXJhbXMuc2V0KGtleSwgUmVkYWN0ZWRTdHJpbmcpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiB1cmwudG9TdHJpbmcoKTtcbiAgICB9XG4gICAgc2FuaXRpemVIZWFkZXJzKG9iaikge1xuICAgICAgICBjb25zdCBzYW5pdGl6ZWQgPSB7fTtcbiAgICAgICAgZm9yIChjb25zdCBrZXkgb2YgT2JqZWN0LmtleXMob2JqKSkge1xuICAgICAgICAgICAgaWYgKHRoaXMuYWxsb3dlZEhlYWRlck5hbWVzLmhhcyhrZXkudG9Mb3dlckNhc2UoKSkpIHtcbiAgICAgICAgICAgICAgICBzYW5pdGl6ZWRba2V5XSA9IG9ialtrZXldO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgc2FuaXRpemVkW2tleV0gPSBSZWRhY3RlZFN0cmluZztcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gc2FuaXRpemVkO1xuICAgIH1cbiAgICBzYW5pdGl6ZVF1ZXJ5KHZhbHVlKSB7XG4gICAgICAgIGlmICh0eXBlb2YgdmFsdWUgIT09IFwib2JqZWN0XCIgfHwgdmFsdWUgPT09IG51bGwpIHtcbiAgICAgICAgICAgIHJldHVybiB2YWx1ZTtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBzYW5pdGl6ZWQgPSB7fTtcbiAgICAgICAgZm9yIChjb25zdCBrIG9mIE9iamVjdC5rZXlzKHZhbHVlKSkge1xuICAgICAgICAgICAgaWYgKHRoaXMuYWxsb3dlZFF1ZXJ5UGFyYW1ldGVycy5oYXMoay50b0xvd2VyQ2FzZSgpKSkge1xuICAgICAgICAgICAgICAgIHNhbml0aXplZFtrXSA9IHZhbHVlW2tdO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgc2FuaXRpemVkW2tdID0gUmVkYWN0ZWRTdHJpbmc7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHNhbml0aXplZDtcbiAgICB9XG59XG5leHBvcnRzLlNhbml0aXplciA9IFNhbml0aXplcjtcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPXNhbml0aXplci5qcy5tYXAiLAogICAgIlwidXNlIHN0cmljdFwiO1xuLy8gQ29weXJpZ2h0IChjKSBNaWNyb3NvZnQgQ29ycG9yYXRpb24uXG4vLyBMaWNlbnNlZCB1bmRlciB0aGUgTUlUIExpY2Vuc2UuXG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJfX2VzTW9kdWxlXCIsIHsgdmFsdWU6IHRydWUgfSk7XG5leHBvcnRzLmxvZ1BvbGljeU5hbWUgPSB2b2lkIDA7XG5leHBvcnRzLmxvZ1BvbGljeSA9IGxvZ1BvbGljeTtcbmNvbnN0IGxvZ19qc18xID0gcmVxdWlyZShcIi4uL2xvZy5qc1wiKTtcbmNvbnN0IHNhbml0aXplcl9qc18xID0gcmVxdWlyZShcIi4uL3V0aWwvc2FuaXRpemVyLmpzXCIpO1xuLyoqXG4gKiBUaGUgcHJvZ3JhbW1hdGljIGlkZW50aWZpZXIgb2YgdGhlIGxvZ1BvbGljeS5cbiAqL1xuZXhwb3J0cy5sb2dQb2xpY3lOYW1lID0gXCJsb2dQb2xpY3lcIjtcbi8qKlxuICogQSBwb2xpY3kgdGhhdCBsb2dzIGFsbCByZXF1ZXN0cyBhbmQgcmVzcG9uc2VzLlxuICogQHBhcmFtIG9wdGlvbnMgLSBPcHRpb25zIHRvIGNvbmZpZ3VyZSBsb2dQb2xpY3kuXG4gKi9cbmZ1bmN0aW9uIGxvZ1BvbGljeShvcHRpb25zID0ge30pIHtcbiAgICB2YXIgX2E7XG4gICAgY29uc3QgbG9nZ2VyID0gKF9hID0gb3B0aW9ucy5sb2dnZXIpICE9PSBudWxsICYmIF9hICE9PSB2b2lkIDAgPyBfYSA6IGxvZ19qc18xLmxvZ2dlci5pbmZvO1xuICAgIGNvbnN0IHNhbml0aXplciA9IG5ldyBzYW5pdGl6ZXJfanNfMS5TYW5pdGl6ZXIoe1xuICAgICAgICBhZGRpdGlvbmFsQWxsb3dlZEhlYWRlck5hbWVzOiBvcHRpb25zLmFkZGl0aW9uYWxBbGxvd2VkSGVhZGVyTmFtZXMsXG4gICAgICAgIGFkZGl0aW9uYWxBbGxvd2VkUXVlcnlQYXJhbWV0ZXJzOiBvcHRpb25zLmFkZGl0aW9uYWxBbGxvd2VkUXVlcnlQYXJhbWV0ZXJzLFxuICAgIH0pO1xuICAgIHJldHVybiB7XG4gICAgICAgIG5hbWU6IGV4cG9ydHMubG9nUG9saWN5TmFtZSxcbiAgICAgICAgYXN5bmMgc2VuZFJlcXVlc3QocmVxdWVzdCwgbmV4dCkge1xuICAgICAgICAgICAgaWYgKCFsb2dnZXIuZW5hYmxlZCkge1xuICAgICAgICAgICAgICAgIHJldHVybiBuZXh0KHJlcXVlc3QpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgbG9nZ2VyKGBSZXF1ZXN0OiAke3Nhbml0aXplci5zYW5pdGl6ZShyZXF1ZXN0KX1gKTtcbiAgICAgICAgICAgIGNvbnN0IHJlc3BvbnNlID0gYXdhaXQgbmV4dChyZXF1ZXN0KTtcbiAgICAgICAgICAgIGxvZ2dlcihgUmVzcG9uc2Ugc3RhdHVzIGNvZGU6ICR7cmVzcG9uc2Uuc3RhdHVzfWApO1xuICAgICAgICAgICAgbG9nZ2VyKGBIZWFkZXJzOiAke3Nhbml0aXplci5zYW5pdGl6ZShyZXNwb25zZS5oZWFkZXJzKX1gKTtcbiAgICAgICAgICAgIHJldHVybiByZXNwb25zZTtcbiAgICAgICAgfSxcbiAgICB9O1xufVxuLy8jIHNvdXJjZU1hcHBpbmdVUkw9bG9nUG9saWN5LmpzLm1hcCIsCiAgICAiXCJ1c2Ugc3RyaWN0XCI7XG4vLyBDb3B5cmlnaHQgKGMpIE1pY3Jvc29mdCBDb3Jwb3JhdGlvbi5cbi8vIExpY2Vuc2VkIHVuZGVyIHRoZSBNSVQgTGljZW5zZS5cbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIl9fZXNNb2R1bGVcIiwgeyB2YWx1ZTogdHJ1ZSB9KTtcbmV4cG9ydHMucmVkaXJlY3RQb2xpY3lOYW1lID0gdm9pZCAwO1xuZXhwb3J0cy5yZWRpcmVjdFBvbGljeSA9IHJlZGlyZWN0UG9saWN5O1xuLyoqXG4gKiBUaGUgcHJvZ3JhbW1hdGljIGlkZW50aWZpZXIgb2YgdGhlIHJlZGlyZWN0UG9saWN5LlxuICovXG5leHBvcnRzLnJlZGlyZWN0UG9saWN5TmFtZSA9IFwicmVkaXJlY3RQb2xpY3lcIjtcbi8qKlxuICogTWV0aG9kcyB0aGF0IGFyZSBhbGxvd2VkIHRvIGZvbGxvdyByZWRpcmVjdHMgMzAxIGFuZCAzMDJcbiAqL1xuY29uc3QgYWxsb3dlZFJlZGlyZWN0ID0gW1wiR0VUXCIsIFwiSEVBRFwiXTtcbi8qKlxuICogQSBwb2xpY3kgdG8gZm9sbG93IExvY2F0aW9uIGhlYWRlcnMgZnJvbSB0aGUgc2VydmVyIGluIG9yZGVyXG4gKiB0byBzdXBwb3J0IHNlcnZlci1zaWRlIHJlZGlyZWN0aW9uLlxuICogSW4gdGhlIGJyb3dzZXIsIHRoaXMgcG9saWN5IGlzIG5vdCB1c2VkLlxuICogQHBhcmFtIG9wdGlvbnMgLSBPcHRpb25zIHRvIGNvbnRyb2wgcG9saWN5IGJlaGF2aW9yLlxuICovXG5mdW5jdGlvbiByZWRpcmVjdFBvbGljeShvcHRpb25zID0ge30pIHtcbiAgICBjb25zdCB7IG1heFJldHJpZXMgPSAyMCB9ID0gb3B0aW9ucztcbiAgICByZXR1cm4ge1xuICAgICAgICBuYW1lOiBleHBvcnRzLnJlZGlyZWN0UG9saWN5TmFtZSxcbiAgICAgICAgYXN5bmMgc2VuZFJlcXVlc3QocmVxdWVzdCwgbmV4dCkge1xuICAgICAgICAgICAgY29uc3QgcmVzcG9uc2UgPSBhd2FpdCBuZXh0KHJlcXVlc3QpO1xuICAgICAgICAgICAgcmV0dXJuIGhhbmRsZVJlZGlyZWN0KG5leHQsIHJlc3BvbnNlLCBtYXhSZXRyaWVzKTtcbiAgICAgICAgfSxcbiAgICB9O1xufVxuYXN5bmMgZnVuY3Rpb24gaGFuZGxlUmVkaXJlY3QobmV4dCwgcmVzcG9uc2UsIG1heFJldHJpZXMsIGN1cnJlbnRSZXRyaWVzID0gMCkge1xuICAgIGNvbnN0IHsgcmVxdWVzdCwgc3RhdHVzLCBoZWFkZXJzIH0gPSByZXNwb25zZTtcbiAgICBjb25zdCBsb2NhdGlvbkhlYWRlciA9IGhlYWRlcnMuZ2V0KFwibG9jYXRpb25cIik7XG4gICAgaWYgKGxvY2F0aW9uSGVhZGVyICYmXG4gICAgICAgIChzdGF0dXMgPT09IDMwMCB8fFxuICAgICAgICAgICAgKHN0YXR1cyA9PT0gMzAxICYmIGFsbG93ZWRSZWRpcmVjdC5pbmNsdWRlcyhyZXF1ZXN0Lm1ldGhvZCkpIHx8XG4gICAgICAgICAgICAoc3RhdHVzID09PSAzMDIgJiYgYWxsb3dlZFJlZGlyZWN0LmluY2x1ZGVzKHJlcXVlc3QubWV0aG9kKSkgfHxcbiAgICAgICAgICAgIChzdGF0dXMgPT09IDMwMyAmJiByZXF1ZXN0Lm1ldGhvZCA9PT0gXCJQT1NUXCIpIHx8XG4gICAgICAgICAgICBzdGF0dXMgPT09IDMwNykgJiZcbiAgICAgICAgY3VycmVudFJldHJpZXMgPCBtYXhSZXRyaWVzKSB7XG4gICAgICAgIGNvbnN0IHVybCA9IG5ldyBVUkwobG9jYXRpb25IZWFkZXIsIHJlcXVlc3QudXJsKTtcbiAgICAgICAgcmVxdWVzdC51cmwgPSB1cmwudG9TdHJpbmcoKTtcbiAgICAgICAgLy8gUE9TVCByZXF1ZXN0IHdpdGggU3RhdHVzIGNvZGUgMzAzIHNob3VsZCBiZSBjb252ZXJ0ZWQgaW50byBhXG4gICAgICAgIC8vIHJlZGlyZWN0ZWQgR0VUIHJlcXVlc3QgaWYgdGhlIHJlZGlyZWN0IHVybCBpcyBwcmVzZW50IGluIHRoZSBsb2NhdGlvbiBoZWFkZXJcbiAgICAgICAgaWYgKHN0YXR1cyA9PT0gMzAzKSB7XG4gICAgICAgICAgICByZXF1ZXN0Lm1ldGhvZCA9IFwiR0VUXCI7XG4gICAgICAgICAgICByZXF1ZXN0LmhlYWRlcnMuZGVsZXRlKFwiQ29udGVudC1MZW5ndGhcIik7XG4gICAgICAgICAgICBkZWxldGUgcmVxdWVzdC5ib2R5O1xuICAgICAgICB9XG4gICAgICAgIHJlcXVlc3QuaGVhZGVycy5kZWxldGUoXCJBdXRob3JpemF0aW9uXCIpO1xuICAgICAgICBjb25zdCByZXMgPSBhd2FpdCBuZXh0KHJlcXVlc3QpO1xuICAgICAgICByZXR1cm4gaGFuZGxlUmVkaXJlY3QobmV4dCwgcmVzLCBtYXhSZXRyaWVzLCBjdXJyZW50UmV0cmllcyArIDEpO1xuICAgIH1cbiAgICByZXR1cm4gcmVzcG9uc2U7XG59XG4vLyMgc291cmNlTWFwcGluZ1VSTD1yZWRpcmVjdFBvbGljeS5qcy5tYXAiLAogICAgIlwidXNlIHN0cmljdFwiO1xuLy8gQ29weXJpZ2h0IChjKSBNaWNyb3NvZnQgQ29ycG9yYXRpb24uXG4vLyBMaWNlbnNlZCB1bmRlciB0aGUgTUlUIExpY2Vuc2UuXG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJfX2VzTW9kdWxlXCIsIHsgdmFsdWU6IHRydWUgfSk7XG5leHBvcnRzLmdldEhlYWRlck5hbWUgPSBnZXRIZWFkZXJOYW1lO1xuZXhwb3J0cy5zZXRQbGF0Zm9ybVNwZWNpZmljRGF0YSA9IHNldFBsYXRmb3JtU3BlY2lmaWNEYXRhO1xuY29uc3QgdHNsaWJfMSA9IHJlcXVpcmUoXCJ0c2xpYlwiKTtcbmNvbnN0IG9zID0gdHNsaWJfMS5fX2ltcG9ydFN0YXIocmVxdWlyZShcIm5vZGU6b3NcIikpO1xuY29uc3QgcHJvY2VzcyA9IHRzbGliXzEuX19pbXBvcnRTdGFyKHJlcXVpcmUoXCJub2RlOnByb2Nlc3NcIikpO1xuLyoqXG4gKiBAaW50ZXJuYWxcbiAqL1xuZnVuY3Rpb24gZ2V0SGVhZGVyTmFtZSgpIHtcbiAgICByZXR1cm4gXCJVc2VyLUFnZW50XCI7XG59XG4vKipcbiAqIEBpbnRlcm5hbFxuICovXG5hc3luYyBmdW5jdGlvbiBzZXRQbGF0Zm9ybVNwZWNpZmljRGF0YShtYXApIHtcbiAgICBpZiAocHJvY2VzcyAmJiBwcm9jZXNzLnZlcnNpb25zKSB7XG4gICAgICAgIGNvbnN0IHZlcnNpb25zID0gcHJvY2Vzcy52ZXJzaW9ucztcbiAgICAgICAgaWYgKHZlcnNpb25zLmJ1bikge1xuICAgICAgICAgICAgbWFwLnNldChcIkJ1blwiLCB2ZXJzaW9ucy5idW4pO1xuICAgICAgICB9XG4gICAgICAgIGVsc2UgaWYgKHZlcnNpb25zLmRlbm8pIHtcbiAgICAgICAgICAgIG1hcC5zZXQoXCJEZW5vXCIsIHZlcnNpb25zLmRlbm8pO1xuICAgICAgICB9XG4gICAgICAgIGVsc2UgaWYgKHZlcnNpb25zLm5vZGUpIHtcbiAgICAgICAgICAgIG1hcC5zZXQoXCJOb2RlXCIsIHZlcnNpb25zLm5vZGUpO1xuICAgICAgICB9XG4gICAgfVxuICAgIG1hcC5zZXQoXCJPU1wiLCBgKCR7b3MuYXJjaCgpfS0ke29zLnR5cGUoKX0tJHtvcy5yZWxlYXNlKCl9KWApO1xufVxuLy8jIHNvdXJjZU1hcHBpbmdVUkw9dXNlckFnZW50UGxhdGZvcm0uanMubWFwIiwKICAgICJcInVzZSBzdHJpY3RcIjtcbi8vIENvcHlyaWdodCAoYykgTWljcm9zb2Z0IENvcnBvcmF0aW9uLlxuLy8gTGljZW5zZWQgdW5kZXIgdGhlIE1JVCBMaWNlbnNlLlxuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiX19lc01vZHVsZVwiLCB7IHZhbHVlOiB0cnVlIH0pO1xuZXhwb3J0cy5ERUZBVUxUX1JFVFJZX1BPTElDWV9DT1VOVCA9IGV4cG9ydHMuU0RLX1ZFUlNJT04gPSB2b2lkIDA7XG5leHBvcnRzLlNES19WRVJTSU9OID0gXCIxLjE3LjBcIjtcbmV4cG9ydHMuREVGQVVMVF9SRVRSWV9QT0xJQ1lfQ09VTlQgPSAzO1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9Y29uc3RhbnRzLmpzLm1hcCIsCiAgICAiXCJ1c2Ugc3RyaWN0XCI7XG4vLyBDb3B5cmlnaHQgKGMpIE1pY3Jvc29mdCBDb3Jwb3JhdGlvbi5cbi8vIExpY2Vuc2VkIHVuZGVyIHRoZSBNSVQgTGljZW5zZS5cbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIl9fZXNNb2R1bGVcIiwgeyB2YWx1ZTogdHJ1ZSB9KTtcbmV4cG9ydHMuZ2V0VXNlckFnZW50SGVhZGVyTmFtZSA9IGdldFVzZXJBZ2VudEhlYWRlck5hbWU7XG5leHBvcnRzLmdldFVzZXJBZ2VudFZhbHVlID0gZ2V0VXNlckFnZW50VmFsdWU7XG5jb25zdCB1c2VyQWdlbnRQbGF0Zm9ybV9qc18xID0gcmVxdWlyZShcIi4vdXNlckFnZW50UGxhdGZvcm0uanNcIik7XG5jb25zdCBjb25zdGFudHNfanNfMSA9IHJlcXVpcmUoXCIuLi9jb25zdGFudHMuanNcIik7XG5mdW5jdGlvbiBnZXRVc2VyQWdlbnRTdHJpbmcodGVsZW1ldHJ5SW5mbykge1xuICAgIGNvbnN0IHBhcnRzID0gW107XG4gICAgZm9yIChjb25zdCBba2V5LCB2YWx1ZV0gb2YgdGVsZW1ldHJ5SW5mbykge1xuICAgICAgICBjb25zdCB0b2tlbiA9IHZhbHVlID8gYCR7a2V5fS8ke3ZhbHVlfWAgOiBrZXk7XG4gICAgICAgIHBhcnRzLnB1c2godG9rZW4pO1xuICAgIH1cbiAgICByZXR1cm4gcGFydHMuam9pbihcIiBcIik7XG59XG4vKipcbiAqIEBpbnRlcm5hbFxuICovXG5mdW5jdGlvbiBnZXRVc2VyQWdlbnRIZWFkZXJOYW1lKCkge1xuICAgIHJldHVybiAoMCwgdXNlckFnZW50UGxhdGZvcm1fanNfMS5nZXRIZWFkZXJOYW1lKSgpO1xufVxuLyoqXG4gKiBAaW50ZXJuYWxcbiAqL1xuYXN5bmMgZnVuY3Rpb24gZ2V0VXNlckFnZW50VmFsdWUocHJlZml4KSB7XG4gICAgY29uc3QgcnVudGltZUluZm8gPSBuZXcgTWFwKCk7XG4gICAgcnVudGltZUluZm8uc2V0KFwiY29yZS1yZXN0LXBpcGVsaW5lXCIsIGNvbnN0YW50c19qc18xLlNES19WRVJTSU9OKTtcbiAgICBhd2FpdCAoMCwgdXNlckFnZW50UGxhdGZvcm1fanNfMS5zZXRQbGF0Zm9ybVNwZWNpZmljRGF0YSkocnVudGltZUluZm8pO1xuICAgIGNvbnN0IGRlZmF1bHRBZ2VudCA9IGdldFVzZXJBZ2VudFN0cmluZyhydW50aW1lSW5mbyk7XG4gICAgY29uc3QgdXNlckFnZW50VmFsdWUgPSBwcmVmaXggPyBgJHtwcmVmaXh9ICR7ZGVmYXVsdEFnZW50fWAgOiBkZWZhdWx0QWdlbnQ7XG4gICAgcmV0dXJuIHVzZXJBZ2VudFZhbHVlO1xufVxuLy8jIHNvdXJjZU1hcHBpbmdVUkw9dXNlckFnZW50LmpzLm1hcCIsCiAgICAiXCJ1c2Ugc3RyaWN0XCI7XG4vLyBDb3B5cmlnaHQgKGMpIE1pY3Jvc29mdCBDb3Jwb3JhdGlvbi5cbi8vIExpY2Vuc2VkIHVuZGVyIHRoZSBNSVQgTGljZW5zZS5cbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIl9fZXNNb2R1bGVcIiwgeyB2YWx1ZTogdHJ1ZSB9KTtcbmV4cG9ydHMudXNlckFnZW50UG9saWN5TmFtZSA9IHZvaWQgMDtcbmV4cG9ydHMudXNlckFnZW50UG9saWN5ID0gdXNlckFnZW50UG9saWN5O1xuY29uc3QgdXNlckFnZW50X2pzXzEgPSByZXF1aXJlKFwiLi4vdXRpbC91c2VyQWdlbnQuanNcIik7XG5jb25zdCBVc2VyQWdlbnRIZWFkZXJOYW1lID0gKDAsIHVzZXJBZ2VudF9qc18xLmdldFVzZXJBZ2VudEhlYWRlck5hbWUpKCk7XG4vKipcbiAqIFRoZSBwcm9ncmFtbWF0aWMgaWRlbnRpZmllciBvZiB0aGUgdXNlckFnZW50UG9saWN5LlxuICovXG5leHBvcnRzLnVzZXJBZ2VudFBvbGljeU5hbWUgPSBcInVzZXJBZ2VudFBvbGljeVwiO1xuLyoqXG4gKiBBIHBvbGljeSB0aGF0IHNldHMgdGhlIFVzZXItQWdlbnQgaGVhZGVyIChvciBlcXVpdmFsZW50KSB0byByZWZsZWN0XG4gKiB0aGUgbGlicmFyeSB2ZXJzaW9uLlxuICogQHBhcmFtIG9wdGlvbnMgLSBPcHRpb25zIHRvIGN1c3RvbWl6ZSB0aGUgdXNlciBhZ2VudCB2YWx1ZS5cbiAqL1xuZnVuY3Rpb24gdXNlckFnZW50UG9saWN5KG9wdGlvbnMgPSB7fSkge1xuICAgIGNvbnN0IHVzZXJBZ2VudFZhbHVlID0gKDAsIHVzZXJBZ2VudF9qc18xLmdldFVzZXJBZ2VudFZhbHVlKShvcHRpb25zLnVzZXJBZ2VudFByZWZpeCk7XG4gICAgcmV0dXJuIHtcbiAgICAgICAgbmFtZTogZXhwb3J0cy51c2VyQWdlbnRQb2xpY3lOYW1lLFxuICAgICAgICBhc3luYyBzZW5kUmVxdWVzdChyZXF1ZXN0LCBuZXh0KSB7XG4gICAgICAgICAgICBpZiAoIXJlcXVlc3QuaGVhZGVycy5oYXMoVXNlckFnZW50SGVhZGVyTmFtZSkpIHtcbiAgICAgICAgICAgICAgICByZXF1ZXN0LmhlYWRlcnMuc2V0KFVzZXJBZ2VudEhlYWRlck5hbWUsIGF3YWl0IHVzZXJBZ2VudFZhbHVlKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiBuZXh0KHJlcXVlc3QpO1xuICAgICAgICB9LFxuICAgIH07XG59XG4vLyMgc291cmNlTWFwcGluZ1VSTD11c2VyQWdlbnRQb2xpY3kuanMubWFwIiwKICAgICJcInVzZSBzdHJpY3RcIjtcbi8vIENvcHlyaWdodCAoYykgTWljcm9zb2Z0IENvcnBvcmF0aW9uLlxuLy8gTGljZW5zZWQgdW5kZXIgdGhlIE1JVCBMaWNlbnNlLlxuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiX19lc01vZHVsZVwiLCB7IHZhbHVlOiB0cnVlIH0pO1xuZXhwb3J0cy5pc05vZGVSZWFkYWJsZVN0cmVhbSA9IGlzTm9kZVJlYWRhYmxlU3RyZWFtO1xuZXhwb3J0cy5pc1dlYlJlYWRhYmxlU3RyZWFtID0gaXNXZWJSZWFkYWJsZVN0cmVhbTtcbmV4cG9ydHMuaXNSZWFkYWJsZVN0cmVhbSA9IGlzUmVhZGFibGVTdHJlYW07XG5leHBvcnRzLmlzQmxvYiA9IGlzQmxvYjtcbmZ1bmN0aW9uIGlzTm9kZVJlYWRhYmxlU3RyZWFtKHgpIHtcbiAgICByZXR1cm4gQm9vbGVhbih4ICYmIHR5cGVvZiB4W1wicGlwZVwiXSA9PT0gXCJmdW5jdGlvblwiKTtcbn1cbmZ1bmN0aW9uIGlzV2ViUmVhZGFibGVTdHJlYW0oeCkge1xuICAgIHJldHVybiBCb29sZWFuKHggJiZcbiAgICAgICAgdHlwZW9mIHguZ2V0UmVhZGVyID09PSBcImZ1bmN0aW9uXCIgJiZcbiAgICAgICAgdHlwZW9mIHgudGVlID09PSBcImZ1bmN0aW9uXCIpO1xufVxuZnVuY3Rpb24gaXNSZWFkYWJsZVN0cmVhbSh4KSB7XG4gICAgcmV0dXJuIGlzTm9kZVJlYWRhYmxlU3RyZWFtKHgpIHx8IGlzV2ViUmVhZGFibGVTdHJlYW0oeCk7XG59XG5mdW5jdGlvbiBpc0Jsb2IoeCkge1xuICAgIHJldHVybiB0eXBlb2YgeC5zdHJlYW0gPT09IFwiZnVuY3Rpb25cIjtcbn1cbi8vIyBzb3VyY2VNYXBwaW5nVVJMPXR5cGVHdWFyZHMuanMubWFwIiwKICAgICJcInVzZSBzdHJpY3RcIjtcbi8vIENvcHlyaWdodCAoYykgTWljcm9zb2Z0IENvcnBvcmF0aW9uLlxuLy8gTGljZW5zZWQgdW5kZXIgdGhlIE1JVCBMaWNlbnNlLlxuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiX19lc01vZHVsZVwiLCB7IHZhbHVlOiB0cnVlIH0pO1xuZXhwb3J0cy5nZXRSYXdDb250ZW50ID0gZ2V0UmF3Q29udGVudDtcbmV4cG9ydHMuY3JlYXRlRmlsZUZyb21TdHJlYW0gPSBjcmVhdGVGaWxlRnJvbVN0cmVhbTtcbmV4cG9ydHMuY3JlYXRlRmlsZSA9IGNyZWF0ZUZpbGU7XG5jb25zdCBjb3JlX3V0aWxfMSA9IHJlcXVpcmUoXCJAYXp1cmUvY29yZS11dGlsXCIpO1xuY29uc3QgdHlwZUd1YXJkc19qc18xID0gcmVxdWlyZShcIi4vdHlwZUd1YXJkcy5qc1wiKTtcbmNvbnN0IHVuaW1wbGVtZW50ZWRNZXRob2RzID0ge1xuICAgIGFycmF5QnVmZmVyOiAoKSA9PiB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihcIk5vdCBpbXBsZW1lbnRlZFwiKTtcbiAgICB9LFxuICAgIHNsaWNlOiAoKSA9PiB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihcIk5vdCBpbXBsZW1lbnRlZFwiKTtcbiAgICB9LFxuICAgIHRleHQ6ICgpID0+IHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwiTm90IGltcGxlbWVudGVkXCIpO1xuICAgIH0sXG59O1xuLyoqXG4gKiBQcml2YXRlIHN5bWJvbCB1c2VkIGFzIGtleSBvbiBvYmplY3RzIGNyZWF0ZWQgdXNpbmcgY3JlYXRlRmlsZSBjb250YWluaW5nIHRoZVxuICogb3JpZ2luYWwgc291cmNlIG9mIHRoZSBmaWxlIG9iamVjdC5cbiAqXG4gKiBUaGlzIGlzIHVzZWQgaW4gTm9kZSB0byBhY2Nlc3MgdGhlIG9yaWdpbmFsIE5vZGUgc3RyZWFtIHdpdGhvdXQgdXNpbmcgQmxvYiNzdHJlYW0sIHdoaWNoXG4gKiByZXR1cm5zIGEgd2ViIHN0cmVhbS4gVGhpcyBpcyBkb25lIHRvIGF2b2lkIGEgY291cGxlIG9mIGJ1Z3MgdG8gZG8gd2l0aCBCbG9iI3N0cmVhbSBhbmRcbiAqIFJlYWRhYmxlI3RvL2Zyb21XZWIgaW4gTm9kZSB2ZXJzaW9ucyB3ZSBzdXBwb3J0OlxuICogLSBodHRwczovL2dpdGh1Yi5jb20vbm9kZWpzL25vZGUvaXNzdWVzLzQyNjk0IChmaXhlZCBpbiBOb2RlIDE4LjE0KVxuICogLSBodHRwczovL2dpdGh1Yi5jb20vbm9kZWpzL25vZGUvaXNzdWVzLzQ4OTE2IChmaXhlZCBpbiBOb2RlIDIwLjYpXG4gKlxuICogT25jZSB0aGVzZSB2ZXJzaW9ucyBhcmUgbm8gbG9uZ2VyIHN1cHBvcnRlZCwgd2UgbWF5IGJlIGFibGUgdG8gc3RvcCBkb2luZyB0aGlzLlxuICpcbiAqIEBpbnRlcm5hbFxuICovXG5jb25zdCByYXdDb250ZW50ID0gU3ltYm9sKFwicmF3Q29udGVudFwiKTtcbmZ1bmN0aW9uIGhhc1Jhd0NvbnRlbnQoeCkge1xuICAgIHJldHVybiB0eXBlb2YgeFtyYXdDb250ZW50XSA9PT0gXCJmdW5jdGlvblwiO1xufVxuLyoqXG4gKiBFeHRyYWN0IHRoZSByYXcgY29udGVudCBmcm9tIGEgZ2l2ZW4gYmxvYi1saWtlIG9iamVjdC4gSWYgdGhlIGlucHV0IHdhcyBjcmVhdGVkIHVzaW5nIGNyZWF0ZUZpbGVcbiAqIG9yIGNyZWF0ZUZpbGVGcm9tU3RyZWFtLCB0aGUgZXhhY3QgY29udGVudCBwYXNzZWQgaW50byBjcmVhdGVGaWxlL2NyZWF0ZUZpbGVGcm9tU3RyZWFtIHdpbGwgYmUgdXNlZC5cbiAqIEZvciB0cnVlIGluc3RhbmNlcyBvZiBCbG9iIGFuZCBGaWxlLCByZXR1cm5zIHRoZSBibG9iJ3MgY29udGVudCBhcyBhIFdlYiBSZWFkYWJsZVN0cmVhbTxVaW50OEFycmF5Pi5cbiAqXG4gKiBAaW50ZXJuYWxcbiAqL1xuZnVuY3Rpb24gZ2V0UmF3Q29udGVudChibG9iKSB7XG4gICAgaWYgKGhhc1Jhd0NvbnRlbnQoYmxvYikpIHtcbiAgICAgICAgcmV0dXJuIGJsb2JbcmF3Q29udGVudF0oKTtcbiAgICB9XG4gICAgZWxzZSB7XG4gICAgICAgIHJldHVybiBibG9iLnN0cmVhbSgpO1xuICAgIH1cbn1cbi8qKlxuICogQ3JlYXRlIGFuIG9iamVjdCB0aGF0IGltcGxlbWVudHMgdGhlIEZpbGUgaW50ZXJmYWNlLiBUaGlzIG9iamVjdCBpcyBpbnRlbmRlZCB0byBiZVxuICogcGFzc2VkIGludG8gUmVxdWVzdEJvZHlUeXBlLmZvcm1EYXRhLCBhbmQgaXMgbm90IGd1YXJhbnRlZWQgdG8gd29yayBhcyBleHBlY3RlZCBpblxuICogb3RoZXIgc2l0dWF0aW9ucy5cbiAqXG4gKiBVc2UgdGhpcyBmdW5jdGlvbiB0bzpcbiAqIC0gQ3JlYXRlIGEgRmlsZSBvYmplY3QgZm9yIHVzZSBpbiBSZXF1ZXN0Qm9keVR5cGUuZm9ybURhdGEgaW4gZW52aXJvbm1lbnRzIHdoZXJlIHRoZVxuICogICBnbG9iYWwgRmlsZSBvYmplY3QgaXMgdW5hdmFpbGFibGUuXG4gKiAtIENyZWF0ZSBhIEZpbGUtbGlrZSBvYmplY3QgZnJvbSBhIHJlYWRhYmxlIHN0cmVhbSB3aXRob3V0IHJlYWRpbmcgdGhlIHN0cmVhbSBpbnRvIG1lbW9yeS5cbiAqXG4gKiBAcGFyYW0gc3RyZWFtIC0gdGhlIGNvbnRlbnQgb2YgdGhlIGZpbGUgYXMgYSBjYWxsYmFjayByZXR1cm5pbmcgYSBzdHJlYW0uIFdoZW4gYSBGaWxlIG9iamVjdCBtYWRlIHVzaW5nIGNyZWF0ZUZpbGUgaXNcbiAqICAgICAgICAgICAgICAgICAgcGFzc2VkIGluIGEgcmVxdWVzdCdzIGZvcm0gZGF0YSBtYXAsIHRoZSBzdHJlYW0gd2lsbCBub3QgYmUgcmVhZCBpbnRvIG1lbW9yeVxuICogICAgICAgICAgICAgICAgICBhbmQgaW5zdGVhZCB3aWxsIGJlIHN0cmVhbWVkIHdoZW4gdGhlIHJlcXVlc3QgaXMgbWFkZS4gSW4gdGhlIGV2ZW50IG9mIGEgcmV0cnksIHRoZVxuICogICAgICAgICAgICAgICAgICBzdHJlYW0gbmVlZHMgdG8gYmUgcmVhZCBhZ2Fpbiwgc28gdGhpcyBjYWxsYmFjayBTSE9VTEQgcmV0dXJuIGEgZnJlc2ggc3RyZWFtIGlmIHBvc3NpYmxlLlxuICogQHBhcmFtIG5hbWUgLSB0aGUgbmFtZSBvZiB0aGUgZmlsZS5cbiAqIEBwYXJhbSBvcHRpb25zIC0gb3B0aW9uYWwgbWV0YWRhdGEgYWJvdXQgdGhlIGZpbGUsIGUuZy4gZmlsZSBuYW1lLCBmaWxlIHNpemUsIE1JTUUgdHlwZS5cbiAqL1xuZnVuY3Rpb24gY3JlYXRlRmlsZUZyb21TdHJlYW0oc3RyZWFtLCBuYW1lLCBvcHRpb25zID0ge30pIHtcbiAgICB2YXIgX2EsIF9iLCBfYywgX2Q7XG4gICAgcmV0dXJuIE9iamVjdC5hc3NpZ24oT2JqZWN0LmFzc2lnbih7fSwgdW5pbXBsZW1lbnRlZE1ldGhvZHMpLCB7IHR5cGU6IChfYSA9IG9wdGlvbnMudHlwZSkgIT09IG51bGwgJiYgX2EgIT09IHZvaWQgMCA/IF9hIDogXCJcIiwgbGFzdE1vZGlmaWVkOiAoX2IgPSBvcHRpb25zLmxhc3RNb2RpZmllZCkgIT09IG51bGwgJiYgX2IgIT09IHZvaWQgMCA/IF9iIDogbmV3IERhdGUoKS5nZXRUaW1lKCksIHdlYmtpdFJlbGF0aXZlUGF0aDogKF9jID0gb3B0aW9ucy53ZWJraXRSZWxhdGl2ZVBhdGgpICE9PSBudWxsICYmIF9jICE9PSB2b2lkIDAgPyBfYyA6IFwiXCIsIHNpemU6IChfZCA9IG9wdGlvbnMuc2l6ZSkgIT09IG51bGwgJiYgX2QgIT09IHZvaWQgMCA/IF9kIDogLTEsIG5hbWUsIHN0cmVhbTogKCkgPT4ge1xuICAgICAgICAgICAgY29uc3QgcyA9IHN0cmVhbSgpO1xuICAgICAgICAgICAgaWYgKCgwLCB0eXBlR3VhcmRzX2pzXzEuaXNOb2RlUmVhZGFibGVTdHJlYW0pKHMpKSB7XG4gICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwiTm90IHN1cHBvcnRlZDogYSBOb2RlIHN0cmVhbSB3YXMgcHJvdmlkZWQgYXMgaW5wdXQgdG8gY3JlYXRlRmlsZUZyb21TdHJlYW0uXCIpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIHM7XG4gICAgICAgIH0sIFtyYXdDb250ZW50XTogc3RyZWFtIH0pO1xufVxuLyoqXG4gKiBDcmVhdGUgYW4gb2JqZWN0IHRoYXQgaW1wbGVtZW50cyB0aGUgRmlsZSBpbnRlcmZhY2UuIFRoaXMgb2JqZWN0IGlzIGludGVuZGVkIHRvIGJlXG4gKiBwYXNzZWQgaW50byBSZXF1ZXN0Qm9keVR5cGUuZm9ybURhdGEsIGFuZCBpcyBub3QgZ3VhcmFudGVlZCB0byB3b3JrIGFzIGV4cGVjdGVkIGluXG4gKiBvdGhlciBzaXR1YXRpb25zLlxuICpcbiAqIFVzZSB0aGlzIGZ1bmN0aW9uIGNyZWF0ZSBhIEZpbGUgb2JqZWN0IGZvciB1c2UgaW4gUmVxdWVzdEJvZHlUeXBlLmZvcm1EYXRhIGluIGVudmlyb25tZW50cyB3aGVyZSB0aGUgZ2xvYmFsIEZpbGUgb2JqZWN0IGlzIHVuYXZhaWxhYmxlLlxuICpcbiAqIEBwYXJhbSBjb250ZW50IC0gdGhlIGNvbnRlbnQgb2YgdGhlIGZpbGUgYXMgYSBVaW50OEFycmF5IGluIG1lbW9yeS5cbiAqIEBwYXJhbSBuYW1lIC0gdGhlIG5hbWUgb2YgdGhlIGZpbGUuXG4gKiBAcGFyYW0gb3B0aW9ucyAtIG9wdGlvbmFsIG1ldGFkYXRhIGFib3V0IHRoZSBmaWxlLCBlLmcuIGZpbGUgbmFtZSwgZmlsZSBzaXplLCBNSU1FIHR5cGUuXG4gKi9cbmZ1bmN0aW9uIGNyZWF0ZUZpbGUoY29udGVudCwgbmFtZSwgb3B0aW9ucyA9IHt9KSB7XG4gICAgdmFyIF9hLCBfYiwgX2M7XG4gICAgaWYgKGNvcmVfdXRpbF8xLmlzTm9kZUxpa2UpIHtcbiAgICAgICAgcmV0dXJuIE9iamVjdC5hc3NpZ24oT2JqZWN0LmFzc2lnbih7fSwgdW5pbXBsZW1lbnRlZE1ldGhvZHMpLCB7IHR5cGU6IChfYSA9IG9wdGlvbnMudHlwZSkgIT09IG51bGwgJiYgX2EgIT09IHZvaWQgMCA/IF9hIDogXCJcIiwgbGFzdE1vZGlmaWVkOiAoX2IgPSBvcHRpb25zLmxhc3RNb2RpZmllZCkgIT09IG51bGwgJiYgX2IgIT09IHZvaWQgMCA/IF9iIDogbmV3IERhdGUoKS5nZXRUaW1lKCksIHdlYmtpdFJlbGF0aXZlUGF0aDogKF9jID0gb3B0aW9ucy53ZWJraXRSZWxhdGl2ZVBhdGgpICE9PSBudWxsICYmIF9jICE9PSB2b2lkIDAgPyBfYyA6IFwiXCIsIHNpemU6IGNvbnRlbnQuYnl0ZUxlbmd0aCwgbmFtZSwgYXJyYXlCdWZmZXI6IGFzeW5jICgpID0+IGNvbnRlbnQuYnVmZmVyLCBzdHJlYW06ICgpID0+IG5ldyBCbG9iKFtjb250ZW50XSkuc3RyZWFtKCksIFtyYXdDb250ZW50XTogKCkgPT4gY29udGVudCB9KTtcbiAgICB9XG4gICAgZWxzZSB7XG4gICAgICAgIHJldHVybiBuZXcgRmlsZShbY29udGVudF0sIG5hbWUsIG9wdGlvbnMpO1xuICAgIH1cbn1cbi8vIyBzb3VyY2VNYXBwaW5nVVJMPWZpbGUuanMubWFwIiwKICAgICJcInVzZSBzdHJpY3RcIjtcbi8vIENvcHlyaWdodCAoYykgTWljcm9zb2Z0IENvcnBvcmF0aW9uLlxuLy8gTGljZW5zZWQgdW5kZXIgdGhlIE1JVCBMaWNlbnNlLlxuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiX19lc01vZHVsZVwiLCB7IHZhbHVlOiB0cnVlIH0pO1xuZXhwb3J0cy5jb25jYXQgPSBjb25jYXQ7XG5jb25zdCB0c2xpYl8xID0gcmVxdWlyZShcInRzbGliXCIpO1xuY29uc3Qgbm9kZV9zdHJlYW1fMSA9IHJlcXVpcmUoXCJub2RlOnN0cmVhbVwiKTtcbmNvbnN0IHR5cGVHdWFyZHNfanNfMSA9IHJlcXVpcmUoXCIuL3R5cGVHdWFyZHMuanNcIik7XG5jb25zdCBmaWxlX2pzXzEgPSByZXF1aXJlKFwiLi9maWxlLmpzXCIpO1xuZnVuY3Rpb24gc3RyZWFtQXN5bmNJdGVyYXRvcigpIHtcbiAgICByZXR1cm4gdHNsaWJfMS5fX2FzeW5jR2VuZXJhdG9yKHRoaXMsIGFyZ3VtZW50cywgZnVuY3Rpb24qIHN0cmVhbUFzeW5jSXRlcmF0b3JfMSgpIHtcbiAgICAgICAgY29uc3QgcmVhZGVyID0gdGhpcy5nZXRSZWFkZXIoKTtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIHdoaWxlICh0cnVlKSB7XG4gICAgICAgICAgICAgICAgY29uc3QgeyBkb25lLCB2YWx1ZSB9ID0geWllbGQgdHNsaWJfMS5fX2F3YWl0KHJlYWRlci5yZWFkKCkpO1xuICAgICAgICAgICAgICAgIGlmIChkb25lKSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiB5aWVsZCB0c2xpYl8xLl9fYXdhaXQodm9pZCAwKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgeWllbGQgeWllbGQgdHNsaWJfMS5fX2F3YWl0KHZhbHVlKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBmaW5hbGx5IHtcbiAgICAgICAgICAgIHJlYWRlci5yZWxlYXNlTG9jaygpO1xuICAgICAgICB9XG4gICAgfSk7XG59XG5mdW5jdGlvbiBtYWtlQXN5bmNJdGVyYWJsZSh3ZWJTdHJlYW0pIHtcbiAgICBpZiAoIXdlYlN0cmVhbVtTeW1ib2wuYXN5bmNJdGVyYXRvcl0pIHtcbiAgICAgICAgd2ViU3RyZWFtW1N5bWJvbC5hc3luY0l0ZXJhdG9yXSA9IHN0cmVhbUFzeW5jSXRlcmF0b3IuYmluZCh3ZWJTdHJlYW0pO1xuICAgIH1cbiAgICBpZiAoIXdlYlN0cmVhbS52YWx1ZXMpIHtcbiAgICAgICAgd2ViU3RyZWFtLnZhbHVlcyA9IHN0cmVhbUFzeW5jSXRlcmF0b3IuYmluZCh3ZWJTdHJlYW0pO1xuICAgIH1cbn1cbmZ1bmN0aW9uIGVuc3VyZU5vZGVTdHJlYW0oc3RyZWFtKSB7XG4gICAgaWYgKHN0cmVhbSBpbnN0YW5jZW9mIFJlYWRhYmxlU3RyZWFtKSB7XG4gICAgICAgIG1ha2VBc3luY0l0ZXJhYmxlKHN0cmVhbSk7XG4gICAgICAgIHJldHVybiBub2RlX3N0cmVhbV8xLlJlYWRhYmxlLmZyb21XZWIoc3RyZWFtKTtcbiAgICB9XG4gICAgZWxzZSB7XG4gICAgICAgIHJldHVybiBzdHJlYW07XG4gICAgfVxufVxuZnVuY3Rpb24gdG9TdHJlYW0oc291cmNlKSB7XG4gICAgaWYgKHNvdXJjZSBpbnN0YW5jZW9mIFVpbnQ4QXJyYXkpIHtcbiAgICAgICAgcmV0dXJuIG5vZGVfc3RyZWFtXzEuUmVhZGFibGUuZnJvbShCdWZmZXIuZnJvbShzb3VyY2UpKTtcbiAgICB9XG4gICAgZWxzZSBpZiAoKDAsIHR5cGVHdWFyZHNfanNfMS5pc0Jsb2IpKHNvdXJjZSkpIHtcbiAgICAgICAgcmV0dXJuIHRvU3RyZWFtKCgwLCBmaWxlX2pzXzEuZ2V0UmF3Q29udGVudCkoc291cmNlKSk7XG4gICAgfVxuICAgIGVsc2Uge1xuICAgICAgICByZXR1cm4gZW5zdXJlTm9kZVN0cmVhbShzb3VyY2UpO1xuICAgIH1cbn1cbi8qKlxuICogVXRpbGl0eSBmdW5jdGlvbiB0aGF0IGNvbmNhdGVuYXRlcyBhIHNldCBvZiBiaW5hcnkgaW5wdXRzIGludG8gb25lIGNvbWJpbmVkIG91dHB1dC5cbiAqXG4gKiBAcGFyYW0gc291cmNlcyAtIGFycmF5IG9mIHNvdXJjZXMgZm9yIHRoZSBjb25jYXRlbmF0aW9uXG4gKiBAcmV0dXJucyAtIGluIE5vZGUsIGEgKCgpID1cXD4gTm9kZUpTLlJlYWRhYmxlU3RyZWFtKSB3aGljaCwgd2hlbiByZWFkLCBwcm9kdWNlcyBhIGNvbmNhdGVuYXRpb24gb2YgYWxsIHRoZSBpbnB1dHMuXG4gKiAgICAgICAgICAgSW4gYnJvd3NlciwgcmV0dXJucyBhIGBCbG9iYCByZXByZXNlbnRpbmcgYWxsIHRoZSBjb25jYXRlbmF0ZWQgaW5wdXRzLlxuICpcbiAqIEBpbnRlcm5hbFxuICovXG5hc3luYyBmdW5jdGlvbiBjb25jYXQoc291cmNlcykge1xuICAgIHJldHVybiBmdW5jdGlvbiAoKSB7XG4gICAgICAgIGNvbnN0IHN0cmVhbXMgPSBzb3VyY2VzLm1hcCgoeCkgPT4gKHR5cGVvZiB4ID09PSBcImZ1bmN0aW9uXCIgPyB4KCkgOiB4KSkubWFwKHRvU3RyZWFtKTtcbiAgICAgICAgcmV0dXJuIG5vZGVfc3RyZWFtXzEuUmVhZGFibGUuZnJvbSgoZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgcmV0dXJuIHRzbGliXzEuX19hc3luY0dlbmVyYXRvcih0aGlzLCBhcmd1bWVudHMsIGZ1bmN0aW9uKiAoKSB7XG4gICAgICAgICAgICAgICAgdmFyIF9hLCBlXzEsIF9iLCBfYztcbiAgICAgICAgICAgICAgICBmb3IgKGNvbnN0IHN0cmVhbSBvZiBzdHJlYW1zKSB7XG4gICAgICAgICAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBmb3IgKHZhciBfZCA9IHRydWUsIHN0cmVhbV8xID0gKGVfMSA9IHZvaWQgMCwgdHNsaWJfMS5fX2FzeW5jVmFsdWVzKHN0cmVhbSkpLCBzdHJlYW1fMV8xOyBzdHJlYW1fMV8xID0geWllbGQgdHNsaWJfMS5fX2F3YWl0KHN0cmVhbV8xLm5leHQoKSksIF9hID0gc3RyZWFtXzFfMS5kb25lLCAhX2E7IF9kID0gdHJ1ZSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9jID0gc3RyZWFtXzFfMS52YWx1ZTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBfZCA9IGZhbHNlO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNodW5rID0gX2M7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgeWllbGQgeWllbGQgdHNsaWJfMS5fX2F3YWl0KGNodW5rKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBjYXRjaCAoZV8xXzEpIHsgZV8xID0geyBlcnJvcjogZV8xXzEgfTsgfVxuICAgICAgICAgICAgICAgICAgICBmaW5hbGx5IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFfZCAmJiAhX2EgJiYgKF9iID0gc3RyZWFtXzEucmV0dXJuKSkgeWllbGQgdHNsaWJfMS5fX2F3YWl0KF9iLmNhbGwoc3RyZWFtXzEpKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIGZpbmFsbHkgeyBpZiAoZV8xKSB0aHJvdyBlXzEuZXJyb3I7IH1cbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9KSgpKTtcbiAgICB9O1xufVxuLy8jIHNvdXJjZU1hcHBpbmdVUkw9Y29uY2F0LmpzLm1hcCIsCiAgICAiXCJ1c2Ugc3RyaWN0XCI7XG4vLyBDb3B5cmlnaHQgKGMpIE1pY3Jvc29mdCBDb3Jwb3JhdGlvbi5cbi8vIExpY2Vuc2VkIHVuZGVyIHRoZSBNSVQgTGljZW5zZS5cbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIl9fZXNNb2R1bGVcIiwgeyB2YWx1ZTogdHJ1ZSB9KTtcbmV4cG9ydHMubXVsdGlwYXJ0UG9saWN5TmFtZSA9IHZvaWQgMDtcbmV4cG9ydHMubXVsdGlwYXJ0UG9saWN5ID0gbXVsdGlwYXJ0UG9saWN5O1xuY29uc3QgY29yZV91dGlsXzEgPSByZXF1aXJlKFwiQGF6dXJlL2NvcmUtdXRpbFwiKTtcbmNvbnN0IGNvbmNhdF9qc18xID0gcmVxdWlyZShcIi4uL3V0aWwvY29uY2F0LmpzXCIpO1xuY29uc3QgdHlwZUd1YXJkc19qc18xID0gcmVxdWlyZShcIi4uL3V0aWwvdHlwZUd1YXJkcy5qc1wiKTtcbmZ1bmN0aW9uIGdlbmVyYXRlQm91bmRhcnkoKSB7XG4gICAgcmV0dXJuIGAtLS0tQXpTREtGb3JtQm91bmRhcnkkeygwLCBjb3JlX3V0aWxfMS5yYW5kb21VVUlEKSgpfWA7XG59XG5mdW5jdGlvbiBlbmNvZGVIZWFkZXJzKGhlYWRlcnMpIHtcbiAgICBsZXQgcmVzdWx0ID0gXCJcIjtcbiAgICBmb3IgKGNvbnN0IFtrZXksIHZhbHVlXSBvZiBoZWFkZXJzKSB7XG4gICAgICAgIHJlc3VsdCArPSBgJHtrZXl9OiAke3ZhbHVlfVxcclxcbmA7XG4gICAgfVxuICAgIHJldHVybiByZXN1bHQ7XG59XG5mdW5jdGlvbiBnZXRMZW5ndGgoc291cmNlKSB7XG4gICAgaWYgKHNvdXJjZSBpbnN0YW5jZW9mIFVpbnQ4QXJyYXkpIHtcbiAgICAgICAgcmV0dXJuIHNvdXJjZS5ieXRlTGVuZ3RoO1xuICAgIH1cbiAgICBlbHNlIGlmICgoMCwgdHlwZUd1YXJkc19qc18xLmlzQmxvYikoc291cmNlKSkge1xuICAgICAgICAvLyBpZiB3YXMgY3JlYXRlZCB1c2luZyBjcmVhdGVGaWxlIHRoZW4gLTEgbWVhbnMgd2UgaGF2ZSBhbiB1bmtub3duIHNpemVcbiAgICAgICAgcmV0dXJuIHNvdXJjZS5zaXplID09PSAtMSA/IHVuZGVmaW5lZCA6IHNvdXJjZS5zaXplO1xuICAgIH1cbiAgICBlbHNlIHtcbiAgICAgICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICB9XG59XG5mdW5jdGlvbiBnZXRUb3RhbExlbmd0aChzb3VyY2VzKSB7XG4gICAgbGV0IHRvdGFsID0gMDtcbiAgICBmb3IgKGNvbnN0IHNvdXJjZSBvZiBzb3VyY2VzKSB7XG4gICAgICAgIGNvbnN0IHBhcnRMZW5ndGggPSBnZXRMZW5ndGgoc291cmNlKTtcbiAgICAgICAgaWYgKHBhcnRMZW5ndGggPT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIHRvdGFsICs9IHBhcnRMZW5ndGg7XG4gICAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIHRvdGFsO1xufVxuYXN5bmMgZnVuY3Rpb24gYnVpbGRSZXF1ZXN0Qm9keShyZXF1ZXN0LCBwYXJ0cywgYm91bmRhcnkpIHtcbiAgICBjb25zdCBzb3VyY2VzID0gW1xuICAgICAgICAoMCwgY29yZV91dGlsXzEuc3RyaW5nVG9VaW50OEFycmF5KShgLS0ke2JvdW5kYXJ5fWAsIFwidXRmLThcIiksXG4gICAgICAgIC4uLnBhcnRzLmZsYXRNYXAoKHBhcnQpID0+IFtcbiAgICAgICAgICAgICgwLCBjb3JlX3V0aWxfMS5zdHJpbmdUb1VpbnQ4QXJyYXkpKFwiXFxyXFxuXCIsIFwidXRmLThcIiksXG4gICAgICAgICAgICAoMCwgY29yZV91dGlsXzEuc3RyaW5nVG9VaW50OEFycmF5KShlbmNvZGVIZWFkZXJzKHBhcnQuaGVhZGVycyksIFwidXRmLThcIiksXG4gICAgICAgICAgICAoMCwgY29yZV91dGlsXzEuc3RyaW5nVG9VaW50OEFycmF5KShcIlxcclxcblwiLCBcInV0Zi04XCIpLFxuICAgICAgICAgICAgcGFydC5ib2R5LFxuICAgICAgICAgICAgKDAsIGNvcmVfdXRpbF8xLnN0cmluZ1RvVWludDhBcnJheSkoYFxcclxcbi0tJHtib3VuZGFyeX1gLCBcInV0Zi04XCIpLFxuICAgICAgICBdKSxcbiAgICAgICAgKDAsIGNvcmVfdXRpbF8xLnN0cmluZ1RvVWludDhBcnJheSkoXCItLVxcclxcblxcclxcblwiLCBcInV0Zi04XCIpLFxuICAgIF07XG4gICAgY29uc3QgY29udGVudExlbmd0aCA9IGdldFRvdGFsTGVuZ3RoKHNvdXJjZXMpO1xuICAgIGlmIChjb250ZW50TGVuZ3RoKSB7XG4gICAgICAgIHJlcXVlc3QuaGVhZGVycy5zZXQoXCJDb250ZW50LUxlbmd0aFwiLCBjb250ZW50TGVuZ3RoKTtcbiAgICB9XG4gICAgcmVxdWVzdC5ib2R5ID0gYXdhaXQgKDAsIGNvbmNhdF9qc18xLmNvbmNhdCkoc291cmNlcyk7XG59XG4vKipcbiAqIE5hbWUgb2YgbXVsdGlwYXJ0IHBvbGljeVxuICovXG5leHBvcnRzLm11bHRpcGFydFBvbGljeU5hbWUgPSBcIm11bHRpcGFydFBvbGljeVwiO1xuY29uc3QgbWF4Qm91bmRhcnlMZW5ndGggPSA3MDtcbmNvbnN0IHZhbGlkQm91bmRhcnlDaGFyYWN0ZXJzID0gbmV3IFNldChgYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXpBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWjAxMjM0NTY3ODknKCkrLC0uLzo9P2ApO1xuZnVuY3Rpb24gYXNzZXJ0VmFsaWRCb3VuZGFyeShib3VuZGFyeSkge1xuICAgIGlmIChib3VuZGFyeS5sZW5ndGggPiBtYXhCb3VuZGFyeUxlbmd0aCkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYE11bHRpcGFydCBib3VuZGFyeSBcIiR7Ym91bmRhcnl9XCIgZXhjZWVkcyBtYXhpbXVtIGxlbmd0aCBvZiA3MCBjaGFyYWN0ZXJzYCk7XG4gICAgfVxuICAgIGlmIChBcnJheS5mcm9tKGJvdW5kYXJ5KS5zb21lKCh4KSA9PiAhdmFsaWRCb3VuZGFyeUNoYXJhY3RlcnMuaGFzKHgpKSkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYE11bHRpcGFydCBib3VuZGFyeSBcIiR7Ym91bmRhcnl9XCIgY29udGFpbnMgaW52YWxpZCBjaGFyYWN0ZXJzYCk7XG4gICAgfVxufVxuLyoqXG4gKiBQaXBlbGluZSBwb2xpY3kgZm9yIG11bHRpcGFydCByZXF1ZXN0c1xuICovXG5mdW5jdGlvbiBtdWx0aXBhcnRQb2xpY3koKSB7XG4gICAgcmV0dXJuIHtcbiAgICAgICAgbmFtZTogZXhwb3J0cy5tdWx0aXBhcnRQb2xpY3lOYW1lLFxuICAgICAgICBhc3luYyBzZW5kUmVxdWVzdChyZXF1ZXN0LCBuZXh0KSB7XG4gICAgICAgICAgICB2YXIgX2E7XG4gICAgICAgICAgICBpZiAoIXJlcXVlc3QubXVsdGlwYXJ0Qm9keSkge1xuICAgICAgICAgICAgICAgIHJldHVybiBuZXh0KHJlcXVlc3QpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKHJlcXVlc3QuYm9keSkge1xuICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihcIm11bHRpcGFydEJvZHkgYW5kIHJlZ3VsYXIgYm9keSBjYW5ub3QgYmUgc2V0IGF0IHRoZSBzYW1lIHRpbWVcIik7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBsZXQgYm91bmRhcnkgPSByZXF1ZXN0Lm11bHRpcGFydEJvZHkuYm91bmRhcnk7XG4gICAgICAgICAgICBjb25zdCBjb250ZW50VHlwZUhlYWRlciA9IChfYSA9IHJlcXVlc3QuaGVhZGVycy5nZXQoXCJDb250ZW50LVR5cGVcIikpICE9PSBudWxsICYmIF9hICE9PSB2b2lkIDAgPyBfYSA6IFwibXVsdGlwYXJ0L21peGVkXCI7XG4gICAgICAgICAgICBjb25zdCBwYXJzZWRIZWFkZXIgPSBjb250ZW50VHlwZUhlYWRlci5tYXRjaCgvXihtdWx0aXBhcnRcXC9bXiA7XSspKD86OyAqYm91bmRhcnk9KC4rKSk/JC8pO1xuICAgICAgICAgICAgaWYgKCFwYXJzZWRIZWFkZXIpIHtcbiAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYEdvdCBtdWx0aXBhcnQgcmVxdWVzdCBib2R5LCBidXQgY29udGVudC10eXBlIGhlYWRlciB3YXMgbm90IG11bHRpcGFydDogJHtjb250ZW50VHlwZUhlYWRlcn1gKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGNvbnN0IFssIGNvbnRlbnRUeXBlLCBwYXJzZWRCb3VuZGFyeV0gPSBwYXJzZWRIZWFkZXI7XG4gICAgICAgICAgICBpZiAocGFyc2VkQm91bmRhcnkgJiYgYm91bmRhcnkgJiYgcGFyc2VkQm91bmRhcnkgIT09IGJvdW5kYXJ5KSB7XG4gICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBNdWx0aXBhcnQgYm91bmRhcnkgd2FzIHNwZWNpZmllZCBhcyAke3BhcnNlZEJvdW5kYXJ5fSBpbiB0aGUgaGVhZGVyLCBidXQgZ290ICR7Ym91bmRhcnl9IGluIHRoZSByZXF1ZXN0IGJvZHlgKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGJvdW5kYXJ5ICE9PSBudWxsICYmIGJvdW5kYXJ5ICE9PSB2b2lkIDAgPyBib3VuZGFyeSA6IChib3VuZGFyeSA9IHBhcnNlZEJvdW5kYXJ5KTtcbiAgICAgICAgICAgIGlmIChib3VuZGFyeSkge1xuICAgICAgICAgICAgICAgIGFzc2VydFZhbGlkQm91bmRhcnkoYm91bmRhcnkpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgYm91bmRhcnkgPSBnZW5lcmF0ZUJvdW5kYXJ5KCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXF1ZXN0LmhlYWRlcnMuc2V0KFwiQ29udGVudC1UeXBlXCIsIGAke2NvbnRlbnRUeXBlfTsgYm91bmRhcnk9JHtib3VuZGFyeX1gKTtcbiAgICAgICAgICAgIGF3YWl0IGJ1aWxkUmVxdWVzdEJvZHkocmVxdWVzdCwgcmVxdWVzdC5tdWx0aXBhcnRCb2R5LnBhcnRzLCBib3VuZGFyeSk7XG4gICAgICAgICAgICByZXF1ZXN0Lm11bHRpcGFydEJvZHkgPSB1bmRlZmluZWQ7XG4gICAgICAgICAgICByZXR1cm4gbmV4dChyZXF1ZXN0KTtcbiAgICAgICAgfSxcbiAgICB9O1xufVxuLy8jIHNvdXJjZU1hcHBpbmdVUkw9bXVsdGlwYXJ0UG9saWN5LmpzLm1hcCIsCiAgICAiXCJ1c2Ugc3RyaWN0XCI7XG4vLyBDb3B5cmlnaHQgKGMpIE1pY3Jvc29mdCBDb3Jwb3JhdGlvbi5cbi8vIExpY2Vuc2VkIHVuZGVyIHRoZSBNSVQgTGljZW5zZS5cbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIl9fZXNNb2R1bGVcIiwgeyB2YWx1ZTogdHJ1ZSB9KTtcbmV4cG9ydHMuZGVjb21wcmVzc1Jlc3BvbnNlUG9saWN5TmFtZSA9IHZvaWQgMDtcbmV4cG9ydHMuZGVjb21wcmVzc1Jlc3BvbnNlUG9saWN5ID0gZGVjb21wcmVzc1Jlc3BvbnNlUG9saWN5O1xuLyoqXG4gKiBUaGUgcHJvZ3JhbW1hdGljIGlkZW50aWZpZXIgb2YgdGhlIGRlY29tcHJlc3NSZXNwb25zZVBvbGljeS5cbiAqL1xuZXhwb3J0cy5kZWNvbXByZXNzUmVzcG9uc2VQb2xpY3lOYW1lID0gXCJkZWNvbXByZXNzUmVzcG9uc2VQb2xpY3lcIjtcbi8qKlxuICogQSBwb2xpY3kgdG8gZW5hYmxlIHJlc3BvbnNlIGRlY29tcHJlc3Npb24gYWNjb3JkaW5nIHRvIEFjY2VwdC1FbmNvZGluZyBoZWFkZXJcbiAqIGh0dHBzOi8vZGV2ZWxvcGVyLm1vemlsbGEub3JnL2VuLVVTL2RvY3MvV2ViL0hUVFAvSGVhZGVycy9BY2NlcHQtRW5jb2RpbmdcbiAqL1xuZnVuY3Rpb24gZGVjb21wcmVzc1Jlc3BvbnNlUG9saWN5KCkge1xuICAgIHJldHVybiB7XG4gICAgICAgIG5hbWU6IGV4cG9ydHMuZGVjb21wcmVzc1Jlc3BvbnNlUG9saWN5TmFtZSxcbiAgICAgICAgYXN5bmMgc2VuZFJlcXVlc3QocmVxdWVzdCwgbmV4dCkge1xuICAgICAgICAgICAgLy8gSEVBRCByZXF1ZXN0cyBoYXZlIG5vIGJvZHlcbiAgICAgICAgICAgIGlmIChyZXF1ZXN0Lm1ldGhvZCAhPT0gXCJIRUFEXCIpIHtcbiAgICAgICAgICAgICAgICByZXF1ZXN0LmhlYWRlcnMuc2V0KFwiQWNjZXB0LUVuY29kaW5nXCIsIFwiZ3ppcCxkZWZsYXRlXCIpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIG5leHQocmVxdWVzdCk7XG4gICAgICAgIH0sXG4gICAgfTtcbn1cbi8vIyBzb3VyY2VNYXBwaW5nVVJMPWRlY29tcHJlc3NSZXNwb25zZVBvbGljeS5qcy5tYXAiLAogICAgIlwidXNlIHN0cmljdFwiO1xuLy8gQ29weXJpZ2h0IChjKSBNaWNyb3NvZnQgQ29ycG9yYXRpb24uXG4vLyBMaWNlbnNlZCB1bmRlciB0aGUgTUlUIExpY2Vuc2UuXG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJfX2VzTW9kdWxlXCIsIHsgdmFsdWU6IHRydWUgfSk7XG5leHBvcnRzLmRlbGF5ID0gZGVsYXk7XG5leHBvcnRzLnBhcnNlSGVhZGVyVmFsdWVBc051bWJlciA9IHBhcnNlSGVhZGVyVmFsdWVBc051bWJlcjtcbmNvbnN0IGFib3J0X2NvbnRyb2xsZXJfMSA9IHJlcXVpcmUoXCJAYXp1cmUvYWJvcnQtY29udHJvbGxlclwiKTtcbmNvbnN0IFN0YW5kYXJkQWJvcnRNZXNzYWdlID0gXCJUaGUgb3BlcmF0aW9uIHdhcyBhYm9ydGVkLlwiO1xuLyoqXG4gKiBBIHdyYXBwZXIgZm9yIHNldFRpbWVvdXQgdGhhdCByZXNvbHZlcyBhIHByb21pc2UgYWZ0ZXIgZGVsYXlJbk1zIG1pbGxpc2Vjb25kcy5cbiAqIEBwYXJhbSBkZWxheUluTXMgLSBUaGUgbnVtYmVyIG9mIG1pbGxpc2Vjb25kcyB0byBiZSBkZWxheWVkLlxuICogQHBhcmFtIHZhbHVlIC0gVGhlIHZhbHVlIHRvIGJlIHJlc29sdmVkIHdpdGggYWZ0ZXIgYSB0aW1lb3V0IG9mIHQgbWlsbGlzZWNvbmRzLlxuICogQHBhcmFtIG9wdGlvbnMgLSBUaGUgb3B0aW9ucyBmb3IgZGVsYXkgLSBjdXJyZW50bHkgYWJvcnQgb3B0aW9uc1xuICogICAgICAgICAgICAgICAgICAtIGFib3J0U2lnbmFsIC0gVGhlIGFib3J0U2lnbmFsIGFzc29jaWF0ZWQgd2l0aCBjb250YWluaW5nIG9wZXJhdGlvbi5cbiAqICAgICAgICAgICAgICAgICAgLSBhYm9ydEVycm9yTXNnIC0gVGhlIGFib3J0IGVycm9yIG1lc3NhZ2UgYXNzb2NpYXRlZCB3aXRoIGNvbnRhaW5pbmcgb3BlcmF0aW9uLlxuICogQHJldHVybnMgUmVzb2x2ZWQgcHJvbWlzZVxuICovXG5mdW5jdGlvbiBkZWxheShkZWxheUluTXMsIHZhbHVlLCBvcHRpb25zKSB7XG4gICAgcmV0dXJuIG5ldyBQcm9taXNlKChyZXNvbHZlLCByZWplY3QpID0+IHtcbiAgICAgICAgbGV0IHRpbWVyID0gdW5kZWZpbmVkO1xuICAgICAgICBsZXQgb25BYm9ydGVkID0gdW5kZWZpbmVkO1xuICAgICAgICBjb25zdCByZWplY3RPbkFib3J0ID0gKCkgPT4ge1xuICAgICAgICAgICAgcmV0dXJuIHJlamVjdChuZXcgYWJvcnRfY29udHJvbGxlcl8xLkFib3J0RXJyb3IoKG9wdGlvbnMgPT09IG51bGwgfHwgb3B0aW9ucyA9PT0gdm9pZCAwID8gdm9pZCAwIDogb3B0aW9ucy5hYm9ydEVycm9yTXNnKSA/IG9wdGlvbnMgPT09IG51bGwgfHwgb3B0aW9ucyA9PT0gdm9pZCAwID8gdm9pZCAwIDogb3B0aW9ucy5hYm9ydEVycm9yTXNnIDogU3RhbmRhcmRBYm9ydE1lc3NhZ2UpKTtcbiAgICAgICAgfTtcbiAgICAgICAgY29uc3QgcmVtb3ZlTGlzdGVuZXJzID0gKCkgPT4ge1xuICAgICAgICAgICAgaWYgKChvcHRpb25zID09PSBudWxsIHx8IG9wdGlvbnMgPT09IHZvaWQgMCA/IHZvaWQgMCA6IG9wdGlvbnMuYWJvcnRTaWduYWwpICYmIG9uQWJvcnRlZCkge1xuICAgICAgICAgICAgICAgIG9wdGlvbnMuYWJvcnRTaWduYWwucmVtb3ZlRXZlbnRMaXN0ZW5lcihcImFib3J0XCIsIG9uQWJvcnRlZCk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH07XG4gICAgICAgIG9uQWJvcnRlZCA9ICgpID0+IHtcbiAgICAgICAgICAgIGlmICh0aW1lcikge1xuICAgICAgICAgICAgICAgIGNsZWFyVGltZW91dCh0aW1lcik7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZW1vdmVMaXN0ZW5lcnMoKTtcbiAgICAgICAgICAgIHJldHVybiByZWplY3RPbkFib3J0KCk7XG4gICAgICAgIH07XG4gICAgICAgIGlmICgob3B0aW9ucyA9PT0gbnVsbCB8fCBvcHRpb25zID09PSB2b2lkIDAgPyB2b2lkIDAgOiBvcHRpb25zLmFib3J0U2lnbmFsKSAmJiBvcHRpb25zLmFib3J0U2lnbmFsLmFib3J0ZWQpIHtcbiAgICAgICAgICAgIHJldHVybiByZWplY3RPbkFib3J0KCk7XG4gICAgICAgIH1cbiAgICAgICAgdGltZXIgPSBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgICAgICAgIHJlbW92ZUxpc3RlbmVycygpO1xuICAgICAgICAgICAgcmVzb2x2ZSh2YWx1ZSk7XG4gICAgICAgIH0sIGRlbGF5SW5Ncyk7XG4gICAgICAgIGlmIChvcHRpb25zID09PSBudWxsIHx8IG9wdGlvbnMgPT09IHZvaWQgMCA/IHZvaWQgMCA6IG9wdGlvbnMuYWJvcnRTaWduYWwpIHtcbiAgICAgICAgICAgIG9wdGlvbnMuYWJvcnRTaWduYWwuYWRkRXZlbnRMaXN0ZW5lcihcImFib3J0XCIsIG9uQWJvcnRlZCk7XG4gICAgICAgIH1cbiAgICB9KTtcbn1cbi8qKlxuICogQGludGVybmFsXG4gKiBAcmV0dXJucyB0aGUgcGFyc2VkIHZhbHVlIG9yIHVuZGVmaW5lZCBpZiB0aGUgcGFyc2VkIHZhbHVlIGlzIGludmFsaWQuXG4gKi9cbmZ1bmN0aW9uIHBhcnNlSGVhZGVyVmFsdWVBc051bWJlcihyZXNwb25zZSwgaGVhZGVyTmFtZSkge1xuICAgIGNvbnN0IHZhbHVlID0gcmVzcG9uc2UuaGVhZGVycy5nZXQoaGVhZGVyTmFtZSk7XG4gICAgaWYgKCF2YWx1ZSlcbiAgICAgICAgcmV0dXJuO1xuICAgIGNvbnN0IHZhbHVlQXNOdW0gPSBOdW1iZXIodmFsdWUpO1xuICAgIGlmIChOdW1iZXIuaXNOYU4odmFsdWVBc051bSkpXG4gICAgICAgIHJldHVybjtcbiAgICByZXR1cm4gdmFsdWVBc051bTtcbn1cbi8vIyBzb3VyY2VNYXBwaW5nVVJMPWhlbHBlcnMuanMubWFwIiwKICAgICJcInVzZSBzdHJpY3RcIjtcbi8vIENvcHlyaWdodCAoYykgTWljcm9zb2Z0IENvcnBvcmF0aW9uLlxuLy8gTGljZW5zZWQgdW5kZXIgdGhlIE1JVCBMaWNlbnNlLlxuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiX19lc01vZHVsZVwiLCB7IHZhbHVlOiB0cnVlIH0pO1xuZXhwb3J0cy5pc1Rocm90dGxpbmdSZXRyeVJlc3BvbnNlID0gaXNUaHJvdHRsaW5nUmV0cnlSZXNwb25zZTtcbmV4cG9ydHMudGhyb3R0bGluZ1JldHJ5U3RyYXRlZ3kgPSB0aHJvdHRsaW5nUmV0cnlTdHJhdGVneTtcbmNvbnN0IGhlbHBlcnNfanNfMSA9IHJlcXVpcmUoXCIuLi91dGlsL2hlbHBlcnMuanNcIik7XG4vKipcbiAqIFRoZSBoZWFkZXIgdGhhdCBjb21lcyBiYWNrIGZyb20gQXp1cmUgc2VydmljZXMgcmVwcmVzZW50aW5nXG4gKiB0aGUgYW1vdW50IG9mIHRpbWUgKG1pbmltdW0pIHRvIHdhaXQgdG8gcmV0cnkgKGluIHNlY29uZHMgb3IgdGltZXN0YW1wIGFmdGVyIHdoaWNoIHdlIGNhbiByZXRyeSkuXG4gKi9cbmNvbnN0IFJldHJ5QWZ0ZXJIZWFkZXIgPSBcIlJldHJ5LUFmdGVyXCI7XG4vKipcbiAqIFRoZSBoZWFkZXJzIHRoYXQgY29tZSBiYWNrIGZyb20gQXp1cmUgc2VydmljZXMgcmVwcmVzZW50aW5nXG4gKiB0aGUgYW1vdW50IG9mIHRpbWUgKG1pbmltdW0pIHRvIHdhaXQgdG8gcmV0cnkuXG4gKlxuICogXCJyZXRyeS1hZnRlci1tc1wiLCBcIngtbXMtcmV0cnktYWZ0ZXItbXNcIiA6IG1pbGxpc2Vjb25kc1xuICogXCJSZXRyeS1BZnRlclwiIDogc2Vjb25kcyBvciB0aW1lc3RhbXBcbiAqL1xuY29uc3QgQWxsUmV0cnlBZnRlckhlYWRlcnMgPSBbXCJyZXRyeS1hZnRlci1tc1wiLCBcIngtbXMtcmV0cnktYWZ0ZXItbXNcIiwgUmV0cnlBZnRlckhlYWRlcl07XG4vKipcbiAqIEEgcmVzcG9uc2UgaXMgYSB0aHJvdHRsaW5nIHJldHJ5IHJlc3BvbnNlIGlmIGl0IGhhcyBhIHRocm90dGxpbmcgc3RhdHVzIGNvZGUgKDQyOSBvciA1MDMpLFxuICogYXMgbG9uZyBhcyBvbmUgb2YgdGhlIFsgXCJSZXRyeS1BZnRlclwiIG9yIFwicmV0cnktYWZ0ZXItbXNcIiBvciBcIngtbXMtcmV0cnktYWZ0ZXItbXNcIiBdIGhlYWRlcnMgaGFzIGEgdmFsaWQgdmFsdWUuXG4gKlxuICogUmV0dXJucyB0aGUgYHJldHJ5QWZ0ZXJJbk1zYCB2YWx1ZSBpZiB0aGUgcmVzcG9uc2UgaXMgYSB0aHJvdHRsaW5nIHJldHJ5IHJlc3BvbnNlLlxuICogSWYgbm90IHRocm90dGxpbmcgcmV0cnkgcmVzcG9uc2UsIHJldHVybnMgYHVuZGVmaW5lZGAuXG4gKlxuICogQGludGVybmFsXG4gKi9cbmZ1bmN0aW9uIGdldFJldHJ5QWZ0ZXJJbk1zKHJlc3BvbnNlKSB7XG4gICAgaWYgKCEocmVzcG9uc2UgJiYgWzQyOSwgNTAzXS5pbmNsdWRlcyhyZXNwb25zZS5zdGF0dXMpKSlcbiAgICAgICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICB0cnkge1xuICAgICAgICAvLyBIZWFkZXJzOiBcInJldHJ5LWFmdGVyLW1zXCIsIFwieC1tcy1yZXRyeS1hZnRlci1tc1wiLCBcIlJldHJ5LUFmdGVyXCJcbiAgICAgICAgZm9yIChjb25zdCBoZWFkZXIgb2YgQWxsUmV0cnlBZnRlckhlYWRlcnMpIHtcbiAgICAgICAgICAgIGNvbnN0IHJldHJ5QWZ0ZXJWYWx1ZSA9ICgwLCBoZWxwZXJzX2pzXzEucGFyc2VIZWFkZXJWYWx1ZUFzTnVtYmVyKShyZXNwb25zZSwgaGVhZGVyKTtcbiAgICAgICAgICAgIGlmIChyZXRyeUFmdGVyVmFsdWUgPT09IDAgfHwgcmV0cnlBZnRlclZhbHVlKSB7XG4gICAgICAgICAgICAgICAgLy8gXCJSZXRyeS1BZnRlclwiIGhlYWRlciA9PT4gc2Vjb25kc1xuICAgICAgICAgICAgICAgIC8vIFwicmV0cnktYWZ0ZXItbXNcIiwgXCJ4LW1zLXJldHJ5LWFmdGVyLW1zXCIgaGVhZGVycyA9PT4gbWlsbGktc2Vjb25kc1xuICAgICAgICAgICAgICAgIGNvbnN0IG11bHRpcGx5aW5nRmFjdG9yID0gaGVhZGVyID09PSBSZXRyeUFmdGVySGVhZGVyID8gMTAwMCA6IDE7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHJldHJ5QWZ0ZXJWYWx1ZSAqIG11bHRpcGx5aW5nRmFjdG9yOyAvLyBpbiBtaWxsaS1zZWNvbmRzXG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgLy8gUmV0cnlBZnRlckhlYWRlciAoXCJSZXRyeS1BZnRlclwiKSBoYXMgYSBzcGVjaWFsIGNhc2Ugd2hlcmUgaXQgbWlnaHQgYmUgZm9ybWF0dGVkIGFzIGEgZGF0ZSBpbnN0ZWFkIG9mIGEgbnVtYmVyIG9mIHNlY29uZHNcbiAgICAgICAgY29uc3QgcmV0cnlBZnRlckhlYWRlciA9IHJlc3BvbnNlLmhlYWRlcnMuZ2V0KFJldHJ5QWZ0ZXJIZWFkZXIpO1xuICAgICAgICBpZiAoIXJldHJ5QWZ0ZXJIZWFkZXIpXG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIGNvbnN0IGRhdGUgPSBEYXRlLnBhcnNlKHJldHJ5QWZ0ZXJIZWFkZXIpO1xuICAgICAgICBjb25zdCBkaWZmID0gZGF0ZSAtIERhdGUubm93KCk7XG4gICAgICAgIC8vIG5lZ2F0aXZlIGRpZmYgd291bGQgbWVhbiBhIGRhdGUgaW4gdGhlIHBhc3QsIHNvIHJldHJ5IGFzYXAgd2l0aCAwIG1pbGxpc2Vjb25kc1xuICAgICAgICByZXR1cm4gTnVtYmVyLmlzRmluaXRlKGRpZmYpID8gTWF0aC5tYXgoMCwgZGlmZikgOiB1bmRlZmluZWQ7XG4gICAgfVxuICAgIGNhdGNoIChfYSkge1xuICAgICAgICByZXR1cm4gdW5kZWZpbmVkO1xuICAgIH1cbn1cbi8qKlxuICogQSByZXNwb25zZSBpcyBhIHJldHJ5IHJlc3BvbnNlIGlmIGl0IGhhcyBhIHRocm90dGxpbmcgc3RhdHVzIGNvZGUgKDQyOSBvciA1MDMpLFxuICogYXMgbG9uZyBhcyBvbmUgb2YgdGhlIFsgXCJSZXRyeS1BZnRlclwiIG9yIFwicmV0cnktYWZ0ZXItbXNcIiBvciBcIngtbXMtcmV0cnktYWZ0ZXItbXNcIiBdIGhlYWRlcnMgaGFzIGEgdmFsaWQgdmFsdWUuXG4gKi9cbmZ1bmN0aW9uIGlzVGhyb3R0bGluZ1JldHJ5UmVzcG9uc2UocmVzcG9uc2UpIHtcbiAgICByZXR1cm4gTnVtYmVyLmlzRmluaXRlKGdldFJldHJ5QWZ0ZXJJbk1zKHJlc3BvbnNlKSk7XG59XG5mdW5jdGlvbiB0aHJvdHRsaW5nUmV0cnlTdHJhdGVneSgpIHtcbiAgICByZXR1cm4ge1xuICAgICAgICBuYW1lOiBcInRocm90dGxpbmdSZXRyeVN0cmF0ZWd5XCIsXG4gICAgICAgIHJldHJ5KHsgcmVzcG9uc2UgfSkge1xuICAgICAgICAgICAgY29uc3QgcmV0cnlBZnRlckluTXMgPSBnZXRSZXRyeUFmdGVySW5NcyhyZXNwb25zZSk7XG4gICAgICAgICAgICBpZiAoIU51bWJlci5pc0Zpbml0ZShyZXRyeUFmdGVySW5NcykpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4geyBza2lwU3RyYXRlZ3k6IHRydWUgfTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgcmV0cnlBZnRlckluTXMsXG4gICAgICAgICAgICB9O1xuICAgICAgICB9LFxuICAgIH07XG59XG4vLyMgc291cmNlTWFwcGluZ1VSTD10aHJvdHRsaW5nUmV0cnlTdHJhdGVneS5qcy5tYXAiLAogICAgIlwidXNlIHN0cmljdFwiO1xuLy8gQ29weXJpZ2h0IChjKSBNaWNyb3NvZnQgQ29ycG9yYXRpb24uXG4vLyBMaWNlbnNlZCB1bmRlciB0aGUgTUlUIExpY2Vuc2UuXG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJfX2VzTW9kdWxlXCIsIHsgdmFsdWU6IHRydWUgfSk7XG5leHBvcnRzLmV4cG9uZW50aWFsUmV0cnlTdHJhdGVneSA9IGV4cG9uZW50aWFsUmV0cnlTdHJhdGVneTtcbmV4cG9ydHMuaXNFeHBvbmVudGlhbFJldHJ5UmVzcG9uc2UgPSBpc0V4cG9uZW50aWFsUmV0cnlSZXNwb25zZTtcbmV4cG9ydHMuaXNTeXN0ZW1FcnJvciA9IGlzU3lzdGVtRXJyb3I7XG5jb25zdCBjb3JlX3V0aWxfMSA9IHJlcXVpcmUoXCJAYXp1cmUvY29yZS11dGlsXCIpO1xuY29uc3QgdGhyb3R0bGluZ1JldHJ5U3RyYXRlZ3lfanNfMSA9IHJlcXVpcmUoXCIuL3Rocm90dGxpbmdSZXRyeVN0cmF0ZWd5LmpzXCIpO1xuLy8gaW50ZXJ2YWxzIGFyZSBpbiBtaWxsaXNlY29uZHNcbmNvbnN0IERFRkFVTFRfQ0xJRU5UX1JFVFJZX0lOVEVSVkFMID0gMTAwMDtcbmNvbnN0IERFRkFVTFRfQ0xJRU5UX01BWF9SRVRSWV9JTlRFUlZBTCA9IDEwMDAgKiA2NDtcbi8qKlxuICogQSByZXRyeSBzdHJhdGVneSB0aGF0IHJldHJpZXMgd2l0aCBhbiBleHBvbmVudGlhbGx5IGluY3JlYXNpbmcgZGVsYXkgaW4gdGhlc2UgdHdvIGNhc2VzOlxuICogLSBXaGVuIHRoZXJlIGFyZSBlcnJvcnMgaW4gdGhlIHVuZGVybHlpbmcgdHJhbnNwb3J0IGxheWVyIChlLmcuIEROUyBsb29rdXAgZmFpbHVyZXMpLlxuICogLSBPciBvdGhlcndpc2UgaWYgdGhlIG91dGdvaW5nIHJlcXVlc3QgZmFpbHMgKDQwOCwgZ3JlYXRlciBvciBlcXVhbCB0aGFuIDUwMCwgZXhjZXB0IGZvciA1MDEgYW5kIDUwNSkuXG4gKi9cbmZ1bmN0aW9uIGV4cG9uZW50aWFsUmV0cnlTdHJhdGVneShvcHRpb25zID0ge30pIHtcbiAgICB2YXIgX2EsIF9iO1xuICAgIGNvbnN0IHJldHJ5SW50ZXJ2YWwgPSAoX2EgPSBvcHRpb25zLnJldHJ5RGVsYXlJbk1zKSAhPT0gbnVsbCAmJiBfYSAhPT0gdm9pZCAwID8gX2EgOiBERUZBVUxUX0NMSUVOVF9SRVRSWV9JTlRFUlZBTDtcbiAgICBjb25zdCBtYXhSZXRyeUludGVydmFsID0gKF9iID0gb3B0aW9ucy5tYXhSZXRyeURlbGF5SW5NcykgIT09IG51bGwgJiYgX2IgIT09IHZvaWQgMCA/IF9iIDogREVGQVVMVF9DTElFTlRfTUFYX1JFVFJZX0lOVEVSVkFMO1xuICAgIGxldCByZXRyeUFmdGVySW5NcyA9IHJldHJ5SW50ZXJ2YWw7XG4gICAgcmV0dXJuIHtcbiAgICAgICAgbmFtZTogXCJleHBvbmVudGlhbFJldHJ5U3RyYXRlZ3lcIixcbiAgICAgICAgcmV0cnkoeyByZXRyeUNvdW50LCByZXNwb25zZSwgcmVzcG9uc2VFcnJvciB9KSB7XG4gICAgICAgICAgICBjb25zdCBtYXRjaGVkU3lzdGVtRXJyb3IgPSBpc1N5c3RlbUVycm9yKHJlc3BvbnNlRXJyb3IpO1xuICAgICAgICAgICAgY29uc3QgaWdub3JlU3lzdGVtRXJyb3JzID0gbWF0Y2hlZFN5c3RlbUVycm9yICYmIG9wdGlvbnMuaWdub3JlU3lzdGVtRXJyb3JzO1xuICAgICAgICAgICAgY29uc3QgaXNFeHBvbmVudGlhbCA9IGlzRXhwb25lbnRpYWxSZXRyeVJlc3BvbnNlKHJlc3BvbnNlKTtcbiAgICAgICAgICAgIGNvbnN0IGlnbm9yZUV4cG9uZW50aWFsUmVzcG9uc2UgPSBpc0V4cG9uZW50aWFsICYmIG9wdGlvbnMuaWdub3JlSHR0cFN0YXR1c0NvZGVzO1xuICAgICAgICAgICAgY29uc3QgdW5rbm93blJlc3BvbnNlID0gcmVzcG9uc2UgJiYgKCgwLCB0aHJvdHRsaW5nUmV0cnlTdHJhdGVneV9qc18xLmlzVGhyb3R0bGluZ1JldHJ5UmVzcG9uc2UpKHJlc3BvbnNlKSB8fCAhaXNFeHBvbmVudGlhbCk7XG4gICAgICAgICAgICBpZiAodW5rbm93blJlc3BvbnNlIHx8IGlnbm9yZUV4cG9uZW50aWFsUmVzcG9uc2UgfHwgaWdub3JlU3lzdGVtRXJyb3JzKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHsgc2tpcFN0cmF0ZWd5OiB0cnVlIH07XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAocmVzcG9uc2VFcnJvciAmJiAhbWF0Y2hlZFN5c3RlbUVycm9yICYmICFpc0V4cG9uZW50aWFsKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHsgZXJyb3JUb1Rocm93OiByZXNwb25zZUVycm9yIH07XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICAvLyBFeHBvbmVudGlhbGx5IGluY3JlYXNlIHRoZSBkZWxheSBlYWNoIHRpbWVcbiAgICAgICAgICAgIGNvbnN0IGV4cG9uZW50aWFsRGVsYXkgPSByZXRyeUFmdGVySW5NcyAqIE1hdGgucG93KDIsIHJldHJ5Q291bnQpO1xuICAgICAgICAgICAgLy8gRG9uJ3QgbGV0IHRoZSBkZWxheSBleGNlZWQgdGhlIG1heGltdW1cbiAgICAgICAgICAgIGNvbnN0IGNsYW1wZWRFeHBvbmVudGlhbERlbGF5ID0gTWF0aC5taW4obWF4UmV0cnlJbnRlcnZhbCwgZXhwb25lbnRpYWxEZWxheSk7XG4gICAgICAgICAgICAvLyBBbGxvdyB0aGUgZmluYWwgdmFsdWUgdG8gaGF2ZSBzb21lIFwiaml0dGVyXCIgKHdpdGhpbiA1MCUgb2YgdGhlIGRlbGF5IHNpemUpIHNvXG4gICAgICAgICAgICAvLyB0aGF0IHJldHJpZXMgYWNyb3NzIG11bHRpcGxlIGNsaWVudHMgZG9uJ3Qgb2NjdXIgc2ltdWx0YW5lb3VzbHkuXG4gICAgICAgICAgICByZXRyeUFmdGVySW5NcyA9XG4gICAgICAgICAgICAgICAgY2xhbXBlZEV4cG9uZW50aWFsRGVsYXkgLyAyICsgKDAsIGNvcmVfdXRpbF8xLmdldFJhbmRvbUludGVnZXJJbmNsdXNpdmUpKDAsIGNsYW1wZWRFeHBvbmVudGlhbERlbGF5IC8gMik7XG4gICAgICAgICAgICByZXR1cm4geyByZXRyeUFmdGVySW5NcyB9O1xuICAgICAgICB9LFxuICAgIH07XG59XG4vKipcbiAqIEEgcmVzcG9uc2UgaXMgYSByZXRyeSByZXNwb25zZSBpZiBpdCBoYXMgc3RhdHVzIGNvZGVzOlxuICogLSA0MDgsIG9yXG4gKiAtIEdyZWF0ZXIgb3IgZXF1YWwgdGhhbiA1MDAsIGV4Y2VwdCBmb3IgNTAxIGFuZCA1MDUuXG4gKi9cbmZ1bmN0aW9uIGlzRXhwb25lbnRpYWxSZXRyeVJlc3BvbnNlKHJlc3BvbnNlKSB7XG4gICAgcmV0dXJuIEJvb2xlYW4ocmVzcG9uc2UgJiZcbiAgICAgICAgcmVzcG9uc2Uuc3RhdHVzICE9PSB1bmRlZmluZWQgJiZcbiAgICAgICAgKHJlc3BvbnNlLnN0YXR1cyA+PSA1MDAgfHwgcmVzcG9uc2Uuc3RhdHVzID09PSA0MDgpICYmXG4gICAgICAgIHJlc3BvbnNlLnN0YXR1cyAhPT0gNTAxICYmXG4gICAgICAgIHJlc3BvbnNlLnN0YXR1cyAhPT0gNTA1KTtcbn1cbi8qKlxuICogRGV0ZXJtaW5lcyB3aGV0aGVyIGFuIGVycm9yIGZyb20gYSBwaXBlbGluZSByZXNwb25zZSB3YXMgdHJpZ2dlcmVkIGluIHRoZSBuZXR3b3JrIGxheWVyLlxuICovXG5mdW5jdGlvbiBpc1N5c3RlbUVycm9yKGVycikge1xuICAgIGlmICghZXJyKSB7XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gICAgcmV0dXJuIChlcnIuY29kZSA9PT0gXCJFVElNRURPVVRcIiB8fFxuICAgICAgICBlcnIuY29kZSA9PT0gXCJFU09DS0VUVElNRURPVVRcIiB8fFxuICAgICAgICBlcnIuY29kZSA9PT0gXCJFQ09OTlJFRlVTRURcIiB8fFxuICAgICAgICBlcnIuY29kZSA9PT0gXCJFQ09OTlJFU0VUXCIgfHxcbiAgICAgICAgZXJyLmNvZGUgPT09IFwiRU5PRU5UXCIgfHxcbiAgICAgICAgZXJyLmNvZGUgPT09IFwiRU5PVEZPVU5EXCIpO1xufVxuLy8jIHNvdXJjZU1hcHBpbmdVUkw9ZXhwb25lbnRpYWxSZXRyeVN0cmF0ZWd5LmpzLm1hcCIsCiAgICAiXCJ1c2Ugc3RyaWN0XCI7XG4vLyBDb3B5cmlnaHQgKGMpIE1pY3Jvc29mdCBDb3Jwb3JhdGlvbi5cbi8vIExpY2Vuc2VkIHVuZGVyIHRoZSBNSVQgTGljZW5zZS5cbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIl9fZXNNb2R1bGVcIiwgeyB2YWx1ZTogdHJ1ZSB9KTtcbmV4cG9ydHMucmV0cnlQb2xpY3kgPSByZXRyeVBvbGljeTtcbmNvbnN0IGhlbHBlcnNfanNfMSA9IHJlcXVpcmUoXCIuLi91dGlsL2hlbHBlcnMuanNcIik7XG5jb25zdCBsb2dnZXJfMSA9IHJlcXVpcmUoXCJAYXp1cmUvbG9nZ2VyXCIpO1xuY29uc3QgYWJvcnRfY29udHJvbGxlcl8xID0gcmVxdWlyZShcIkBhenVyZS9hYm9ydC1jb250cm9sbGVyXCIpO1xuY29uc3QgY29uc3RhbnRzX2pzXzEgPSByZXF1aXJlKFwiLi4vY29uc3RhbnRzLmpzXCIpO1xuY29uc3QgcmV0cnlQb2xpY3lMb2dnZXIgPSAoMCwgbG9nZ2VyXzEuY3JlYXRlQ2xpZW50TG9nZ2VyKShcImNvcmUtcmVzdC1waXBlbGluZSByZXRyeVBvbGljeVwiKTtcbi8qKlxuICogVGhlIHByb2dyYW1tYXRpYyBpZGVudGlmaWVyIG9mIHRoZSByZXRyeVBvbGljeS5cbiAqL1xuY29uc3QgcmV0cnlQb2xpY3lOYW1lID0gXCJyZXRyeVBvbGljeVwiO1xuLyoqXG4gKiByZXRyeVBvbGljeSBpcyBhIGdlbmVyaWMgcG9saWN5IHRvIGVuYWJsZSByZXRyeWluZyByZXF1ZXN0cyB3aGVuIGNlcnRhaW4gY29uZGl0aW9ucyBhcmUgbWV0XG4gKi9cbmZ1bmN0aW9uIHJldHJ5UG9saWN5KHN0cmF0ZWdpZXMsIG9wdGlvbnMgPSB7IG1heFJldHJpZXM6IGNvbnN0YW50c19qc18xLkRFRkFVTFRfUkVUUllfUE9MSUNZX0NPVU5UIH0pIHtcbiAgICBjb25zdCBsb2dnZXIgPSBvcHRpb25zLmxvZ2dlciB8fCByZXRyeVBvbGljeUxvZ2dlcjtcbiAgICByZXR1cm4ge1xuICAgICAgICBuYW1lOiByZXRyeVBvbGljeU5hbWUsXG4gICAgICAgIGFzeW5jIHNlbmRSZXF1ZXN0KHJlcXVlc3QsIG5leHQpIHtcbiAgICAgICAgICAgIHZhciBfYSwgX2I7XG4gICAgICAgICAgICBsZXQgcmVzcG9uc2U7XG4gICAgICAgICAgICBsZXQgcmVzcG9uc2VFcnJvcjtcbiAgICAgICAgICAgIGxldCByZXRyeUNvdW50ID0gLTE7XG4gICAgICAgICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tY29uc3RhbnQtY29uZGl0aW9uXG4gICAgICAgICAgICByZXRyeVJlcXVlc3Q6IHdoaWxlICh0cnVlKSB7XG4gICAgICAgICAgICAgICAgcmV0cnlDb3VudCArPSAxO1xuICAgICAgICAgICAgICAgIHJlc3BvbnNlID0gdW5kZWZpbmVkO1xuICAgICAgICAgICAgICAgIHJlc3BvbnNlRXJyb3IgPSB1bmRlZmluZWQ7XG4gICAgICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICAgICAgbG9nZ2VyLmluZm8oYFJldHJ5ICR7cmV0cnlDb3VudH06IEF0dGVtcHRpbmcgdG8gc2VuZCByZXF1ZXN0YCwgcmVxdWVzdC5yZXF1ZXN0SWQpO1xuICAgICAgICAgICAgICAgICAgICByZXNwb25zZSA9IGF3YWl0IG5leHQocmVxdWVzdCk7XG4gICAgICAgICAgICAgICAgICAgIGxvZ2dlci5pbmZvKGBSZXRyeSAke3JldHJ5Q291bnR9OiBSZWNlaXZlZCBhIHJlc3BvbnNlIGZyb20gcmVxdWVzdGAsIHJlcXVlc3QucmVxdWVzdElkKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgY2F0Y2ggKGUpIHtcbiAgICAgICAgICAgICAgICAgICAgbG9nZ2VyLmVycm9yKGBSZXRyeSAke3JldHJ5Q291bnR9OiBSZWNlaXZlZCBhbiBlcnJvciBmcm9tIHJlcXVlc3RgLCByZXF1ZXN0LnJlcXVlc3RJZCk7XG4gICAgICAgICAgICAgICAgICAgIC8vIFJlc3RFcnJvcnMgYXJlIHZhbGlkIHRhcmdldHMgZm9yIHRoZSByZXRyeSBzdHJhdGVnaWVzLlxuICAgICAgICAgICAgICAgICAgICAvLyBJZiBub25lIG9mIHRoZSByZXRyeSBzdHJhdGVnaWVzIGNhbiB3b3JrIHdpdGggdGhlbSwgdGhleSB3aWxsIGJlIHRocm93biBsYXRlciBpbiB0aGlzIHBvbGljeS5cbiAgICAgICAgICAgICAgICAgICAgLy8gSWYgdGhlIHJlY2VpdmVkIGVycm9yIGlzIG5vdCBhIFJlc3RFcnJvciwgaXQgaXMgaW1tZWRpYXRlbHkgdGhyb3duLlxuICAgICAgICAgICAgICAgICAgICByZXNwb25zZUVycm9yID0gZTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKCFlIHx8IHJlc3BvbnNlRXJyb3IubmFtZSAhPT0gXCJSZXN0RXJyb3JcIikge1xuICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cgZTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICByZXNwb25zZSA9IHJlc3BvbnNlRXJyb3IucmVzcG9uc2U7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGlmICgoX2EgPSByZXF1ZXN0LmFib3J0U2lnbmFsKSA9PT0gbnVsbCB8fCBfYSA9PT0gdm9pZCAwID8gdm9pZCAwIDogX2EuYWJvcnRlZCkge1xuICAgICAgICAgICAgICAgICAgICBsb2dnZXIuZXJyb3IoYFJldHJ5ICR7cmV0cnlDb3VudH06IFJlcXVlc3QgYWJvcnRlZC5gKTtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgYWJvcnRFcnJvciA9IG5ldyBhYm9ydF9jb250cm9sbGVyXzEuQWJvcnRFcnJvcigpO1xuICAgICAgICAgICAgICAgICAgICB0aHJvdyBhYm9ydEVycm9yO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBpZiAocmV0cnlDb3VudCA+PSAoKF9iID0gb3B0aW9ucy5tYXhSZXRyaWVzKSAhPT0gbnVsbCAmJiBfYiAhPT0gdm9pZCAwID8gX2IgOiBjb25zdGFudHNfanNfMS5ERUZBVUxUX1JFVFJZX1BPTElDWV9DT1VOVCkpIHtcbiAgICAgICAgICAgICAgICAgICAgbG9nZ2VyLmluZm8oYFJldHJ5ICR7cmV0cnlDb3VudH06IE1heGltdW0gcmV0cmllcyByZWFjaGVkLiBSZXR1cm5pbmcgdGhlIGxhc3QgcmVjZWl2ZWQgcmVzcG9uc2UsIG9yIHRocm93aW5nIHRoZSBsYXN0IHJlY2VpdmVkIGVycm9yLmApO1xuICAgICAgICAgICAgICAgICAgICBpZiAocmVzcG9uc2VFcnJvcikge1xuICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cgcmVzcG9uc2VFcnJvcjtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBlbHNlIGlmIChyZXNwb25zZSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHJlc3BvbnNlO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwiTWF4aW11bSByZXRyaWVzIHJlYWNoZWQgd2l0aCBubyByZXNwb25zZSBvciBlcnJvciB0byB0aHJvd1wiKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBsb2dnZXIuaW5mbyhgUmV0cnkgJHtyZXRyeUNvdW50fTogUHJvY2Vzc2luZyAke3N0cmF0ZWdpZXMubGVuZ3RofSByZXRyeSBzdHJhdGVnaWVzLmApO1xuICAgICAgICAgICAgICAgIHN0cmF0ZWdpZXNMb29wOiBmb3IgKGNvbnN0IHN0cmF0ZWd5IG9mIHN0cmF0ZWdpZXMpIHtcbiAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RyYXRlZ3lMb2dnZXIgPSBzdHJhdGVneS5sb2dnZXIgfHwgcmV0cnlQb2xpY3lMb2dnZXI7XG4gICAgICAgICAgICAgICAgICAgIHN0cmF0ZWd5TG9nZ2VyLmluZm8oYFJldHJ5ICR7cmV0cnlDb3VudH06IFByb2Nlc3NpbmcgcmV0cnkgc3RyYXRlZ3kgJHtzdHJhdGVneS5uYW1lfS5gKTtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgbW9kaWZpZXJzID0gc3RyYXRlZ3kucmV0cnkoe1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0cnlDb3VudCxcbiAgICAgICAgICAgICAgICAgICAgICAgIHJlc3BvbnNlLFxuICAgICAgICAgICAgICAgICAgICAgICAgcmVzcG9uc2VFcnJvcixcbiAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgICAgIGlmIChtb2RpZmllcnMuc2tpcFN0cmF0ZWd5KSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBzdHJhdGVneUxvZ2dlci5pbmZvKGBSZXRyeSAke3JldHJ5Q291bnR9OiBTa2lwcGVkLmApO1xuICAgICAgICAgICAgICAgICAgICAgICAgY29udGludWUgc3RyYXRlZ2llc0xvb3A7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgY29uc3QgeyBlcnJvclRvVGhyb3csIHJldHJ5QWZ0ZXJJbk1zLCByZWRpcmVjdFRvIH0gPSBtb2RpZmllcnM7XG4gICAgICAgICAgICAgICAgICAgIGlmIChlcnJvclRvVGhyb3cpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHN0cmF0ZWd5TG9nZ2VyLmVycm9yKGBSZXRyeSAke3JldHJ5Q291bnR9OiBSZXRyeSBzdHJhdGVneSAke3N0cmF0ZWd5Lm5hbWV9IHRocm93cyBlcnJvcjpgLCBlcnJvclRvVGhyb3cpO1xuICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cgZXJyb3JUb1Rocm93O1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIGlmIChyZXRyeUFmdGVySW5NcyB8fCByZXRyeUFmdGVySW5NcyA9PT0gMCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgc3RyYXRlZ3lMb2dnZXIuaW5mbyhgUmV0cnkgJHtyZXRyeUNvdW50fTogUmV0cnkgc3RyYXRlZ3kgJHtzdHJhdGVneS5uYW1lfSByZXRyaWVzIGFmdGVyICR7cmV0cnlBZnRlckluTXN9YCk7XG4gICAgICAgICAgICAgICAgICAgICAgICBhd2FpdCAoMCwgaGVscGVyc19qc18xLmRlbGF5KShyZXRyeUFmdGVySW5NcywgdW5kZWZpbmVkLCB7IGFib3J0U2lnbmFsOiByZXF1ZXN0LmFib3J0U2lnbmFsIH0pO1xuICAgICAgICAgICAgICAgICAgICAgICAgY29udGludWUgcmV0cnlSZXF1ZXN0O1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIGlmIChyZWRpcmVjdFRvKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBzdHJhdGVneUxvZ2dlci5pbmZvKGBSZXRyeSAke3JldHJ5Q291bnR9OiBSZXRyeSBzdHJhdGVneSAke3N0cmF0ZWd5Lm5hbWV9IHJlZGlyZWN0cyB0byAke3JlZGlyZWN0VG99YCk7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXF1ZXN0LnVybCA9IHJlZGlyZWN0VG87XG4gICAgICAgICAgICAgICAgICAgICAgICBjb250aW51ZSByZXRyeVJlcXVlc3Q7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgaWYgKHJlc3BvbnNlRXJyb3IpIHtcbiAgICAgICAgICAgICAgICAgICAgbG9nZ2VyLmluZm8oYE5vbmUgb2YgdGhlIHJldHJ5IHN0cmF0ZWdpZXMgY291bGQgd29yayB3aXRoIHRoZSByZWNlaXZlZCBlcnJvci4gVGhyb3dpbmcgaXQuYCk7XG4gICAgICAgICAgICAgICAgICAgIHRocm93IHJlc3BvbnNlRXJyb3I7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGlmIChyZXNwb25zZSkge1xuICAgICAgICAgICAgICAgICAgICBsb2dnZXIuaW5mbyhgTm9uZSBvZiB0aGUgcmV0cnkgc3RyYXRlZ2llcyBjb3VsZCB3b3JrIHdpdGggdGhlIHJlY2VpdmVkIHJlc3BvbnNlLiBSZXR1cm5pbmcgaXQuYCk7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiByZXNwb25zZTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgLy8gSWYgYWxsIHRoZSByZXRyaWVzIHNraXAgYW5kIHRoZXJlJ3Mgbm8gcmVzcG9uc2UsXG4gICAgICAgICAgICAgICAgLy8gd2UncmUgc3RpbGwgaW4gdGhlIHJldHJ5IGxvb3AsIHNvIGEgbmV3IHJlcXVlc3Qgd2lsbCBiZSBzZW50XG4gICAgICAgICAgICAgICAgLy8gdW50aWwgYG1heFJldHJpZXNgIGlzIHJlYWNoZWQuXG4gICAgICAgICAgICB9XG4gICAgICAgIH0sXG4gICAgfTtcbn1cbi8vIyBzb3VyY2VNYXBwaW5nVVJMPXJldHJ5UG9saWN5LmpzLm1hcCIsCiAgICAiXCJ1c2Ugc3RyaWN0XCI7XG4vLyBDb3B5cmlnaHQgKGMpIE1pY3Jvc29mdCBDb3Jwb3JhdGlvbi5cbi8vIExpY2Vuc2VkIHVuZGVyIHRoZSBNSVQgTGljZW5zZS5cbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIl9fZXNNb2R1bGVcIiwgeyB2YWx1ZTogdHJ1ZSB9KTtcbmV4cG9ydHMuZGVmYXVsdFJldHJ5UG9saWN5TmFtZSA9IHZvaWQgMDtcbmV4cG9ydHMuZGVmYXVsdFJldHJ5UG9saWN5ID0gZGVmYXVsdFJldHJ5UG9saWN5O1xuY29uc3QgZXhwb25lbnRpYWxSZXRyeVN0cmF0ZWd5X2pzXzEgPSByZXF1aXJlKFwiLi4vcmV0cnlTdHJhdGVnaWVzL2V4cG9uZW50aWFsUmV0cnlTdHJhdGVneS5qc1wiKTtcbmNvbnN0IHRocm90dGxpbmdSZXRyeVN0cmF0ZWd5X2pzXzEgPSByZXF1aXJlKFwiLi4vcmV0cnlTdHJhdGVnaWVzL3Rocm90dGxpbmdSZXRyeVN0cmF0ZWd5LmpzXCIpO1xuY29uc3QgcmV0cnlQb2xpY3lfanNfMSA9IHJlcXVpcmUoXCIuL3JldHJ5UG9saWN5LmpzXCIpO1xuY29uc3QgY29uc3RhbnRzX2pzXzEgPSByZXF1aXJlKFwiLi4vY29uc3RhbnRzLmpzXCIpO1xuLyoqXG4gKiBOYW1lIG9mIHRoZSB7QGxpbmsgZGVmYXVsdFJldHJ5UG9saWN5fVxuICovXG5leHBvcnRzLmRlZmF1bHRSZXRyeVBvbGljeU5hbWUgPSBcImRlZmF1bHRSZXRyeVBvbGljeVwiO1xuLyoqXG4gKiBBIHBvbGljeSB0aGF0IHJldHJpZXMgYWNjb3JkaW5nIHRvIHRocmVlIHN0cmF0ZWdpZXM6XG4gKiAtIFdoZW4gdGhlIHNlcnZlciBzZW5kcyBhIDQyOSByZXNwb25zZSB3aXRoIGEgUmV0cnktQWZ0ZXIgaGVhZGVyLlxuICogLSBXaGVuIHRoZXJlIGFyZSBlcnJvcnMgaW4gdGhlIHVuZGVybHlpbmcgdHJhbnNwb3J0IGxheWVyIChlLmcuIEROUyBsb29rdXAgZmFpbHVyZXMpLlxuICogLSBPciBvdGhlcndpc2UgaWYgdGhlIG91dGdvaW5nIHJlcXVlc3QgZmFpbHMsIGl0IHdpbGwgcmV0cnkgd2l0aCBhbiBleHBvbmVudGlhbGx5IGluY3JlYXNpbmcgZGVsYXkuXG4gKi9cbmZ1bmN0aW9uIGRlZmF1bHRSZXRyeVBvbGljeShvcHRpb25zID0ge30pIHtcbiAgICB2YXIgX2E7XG4gICAgcmV0dXJuIHtcbiAgICAgICAgbmFtZTogZXhwb3J0cy5kZWZhdWx0UmV0cnlQb2xpY3lOYW1lLFxuICAgICAgICBzZW5kUmVxdWVzdDogKDAsIHJldHJ5UG9saWN5X2pzXzEucmV0cnlQb2xpY3kpKFsoMCwgdGhyb3R0bGluZ1JldHJ5U3RyYXRlZ3lfanNfMS50aHJvdHRsaW5nUmV0cnlTdHJhdGVneSkoKSwgKDAsIGV4cG9uZW50aWFsUmV0cnlTdHJhdGVneV9qc18xLmV4cG9uZW50aWFsUmV0cnlTdHJhdGVneSkob3B0aW9ucyldLCB7XG4gICAgICAgICAgICBtYXhSZXRyaWVzOiAoX2EgPSBvcHRpb25zLm1heFJldHJpZXMpICE9PSBudWxsICYmIF9hICE9PSB2b2lkIDAgPyBfYSA6IGNvbnN0YW50c19qc18xLkRFRkFVTFRfUkVUUllfUE9MSUNZX0NPVU5ULFxuICAgICAgICB9KS5zZW5kUmVxdWVzdCxcbiAgICB9O1xufVxuLy8jIHNvdXJjZU1hcHBpbmdVUkw9ZGVmYXVsdFJldHJ5UG9saWN5LmpzLm1hcCIsCiAgICAiXCJ1c2Ugc3RyaWN0XCI7XG4vLyBDb3B5cmlnaHQgKGMpIE1pY3Jvc29mdCBDb3Jwb3JhdGlvbi5cbi8vIExpY2Vuc2VkIHVuZGVyIHRoZSBNSVQgTGljZW5zZS5cbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIl9fZXNNb2R1bGVcIiwgeyB2YWx1ZTogdHJ1ZSB9KTtcbmV4cG9ydHMuY3JlYXRlSHR0cEhlYWRlcnMgPSBjcmVhdGVIdHRwSGVhZGVycztcbmZ1bmN0aW9uIG5vcm1hbGl6ZU5hbWUobmFtZSkge1xuICAgIHJldHVybiBuYW1lLnRvTG93ZXJDYXNlKCk7XG59XG5mdW5jdGlvbiogaGVhZGVySXRlcmF0b3IobWFwKSB7XG4gICAgZm9yIChjb25zdCBlbnRyeSBvZiBtYXAudmFsdWVzKCkpIHtcbiAgICAgICAgeWllbGQgW2VudHJ5Lm5hbWUsIGVudHJ5LnZhbHVlXTtcbiAgICB9XG59XG5jbGFzcyBIdHRwSGVhZGVyc0ltcGwge1xuICAgIGNvbnN0cnVjdG9yKHJhd0hlYWRlcnMpIHtcbiAgICAgICAgdGhpcy5faGVhZGVyc01hcCA9IG5ldyBNYXAoKTtcbiAgICAgICAgaWYgKHJhd0hlYWRlcnMpIHtcbiAgICAgICAgICAgIGZvciAoY29uc3QgaGVhZGVyTmFtZSBvZiBPYmplY3Qua2V5cyhyYXdIZWFkZXJzKSkge1xuICAgICAgICAgICAgICAgIHRoaXMuc2V0KGhlYWRlck5hbWUsIHJhd0hlYWRlcnNbaGVhZGVyTmFtZV0pO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxuICAgIC8qKlxuICAgICAqIFNldCBhIGhlYWRlciBpbiB0aGlzIGNvbGxlY3Rpb24gd2l0aCB0aGUgcHJvdmlkZWQgbmFtZSBhbmQgdmFsdWUuIFRoZSBuYW1lIGlzXG4gICAgICogY2FzZS1pbnNlbnNpdGl2ZS5cbiAgICAgKiBAcGFyYW0gbmFtZSAtIFRoZSBuYW1lIG9mIHRoZSBoZWFkZXIgdG8gc2V0LiBUaGlzIHZhbHVlIGlzIGNhc2UtaW5zZW5zaXRpdmUuXG4gICAgICogQHBhcmFtIHZhbHVlIC0gVGhlIHZhbHVlIG9mIHRoZSBoZWFkZXIgdG8gc2V0LlxuICAgICAqL1xuICAgIHNldChuYW1lLCB2YWx1ZSkge1xuICAgICAgICB0aGlzLl9oZWFkZXJzTWFwLnNldChub3JtYWxpemVOYW1lKG5hbWUpLCB7IG5hbWUsIHZhbHVlOiBTdHJpbmcodmFsdWUpLnRyaW0oKSB9KTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogR2V0IHRoZSBoZWFkZXIgdmFsdWUgZm9yIHRoZSBwcm92aWRlZCBoZWFkZXIgbmFtZSwgb3IgdW5kZWZpbmVkIGlmIG5vIGhlYWRlciBleGlzdHMgaW4gdGhpc1xuICAgICAqIGNvbGxlY3Rpb24gd2l0aCB0aGUgcHJvdmlkZWQgbmFtZS5cbiAgICAgKiBAcGFyYW0gbmFtZSAtIFRoZSBuYW1lIG9mIHRoZSBoZWFkZXIuIFRoaXMgdmFsdWUgaXMgY2FzZS1pbnNlbnNpdGl2ZS5cbiAgICAgKi9cbiAgICBnZXQobmFtZSkge1xuICAgICAgICB2YXIgX2E7XG4gICAgICAgIHJldHVybiAoX2EgPSB0aGlzLl9oZWFkZXJzTWFwLmdldChub3JtYWxpemVOYW1lKG5hbWUpKSkgPT09IG51bGwgfHwgX2EgPT09IHZvaWQgMCA/IHZvaWQgMCA6IF9hLnZhbHVlO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBHZXQgd2hldGhlciBvciBub3QgdGhpcyBoZWFkZXIgY29sbGVjdGlvbiBjb250YWlucyBhIGhlYWRlciBlbnRyeSBmb3IgdGhlIHByb3ZpZGVkIGhlYWRlciBuYW1lLlxuICAgICAqIEBwYXJhbSBuYW1lIC0gVGhlIG5hbWUgb2YgdGhlIGhlYWRlciB0byBzZXQuIFRoaXMgdmFsdWUgaXMgY2FzZS1pbnNlbnNpdGl2ZS5cbiAgICAgKi9cbiAgICBoYXMobmFtZSkge1xuICAgICAgICByZXR1cm4gdGhpcy5faGVhZGVyc01hcC5oYXMobm9ybWFsaXplTmFtZShuYW1lKSk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIFJlbW92ZSB0aGUgaGVhZGVyIHdpdGggdGhlIHByb3ZpZGVkIGhlYWRlck5hbWUuXG4gICAgICogQHBhcmFtIG5hbWUgLSBUaGUgbmFtZSBvZiB0aGUgaGVhZGVyIHRvIHJlbW92ZS5cbiAgICAgKi9cbiAgICBkZWxldGUobmFtZSkge1xuICAgICAgICB0aGlzLl9oZWFkZXJzTWFwLmRlbGV0ZShub3JtYWxpemVOYW1lKG5hbWUpKTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogR2V0IHRoZSBKU09OIG9iamVjdCByZXByZXNlbnRhdGlvbiBvZiB0aGlzIEhUVFAgaGVhZGVyIGNvbGxlY3Rpb24uXG4gICAgICovXG4gICAgdG9KU09OKG9wdGlvbnMgPSB7fSkge1xuICAgICAgICBjb25zdCByZXN1bHQgPSB7fTtcbiAgICAgICAgaWYgKG9wdGlvbnMucHJlc2VydmVDYXNlKSB7XG4gICAgICAgICAgICBmb3IgKGNvbnN0IGVudHJ5IG9mIHRoaXMuX2hlYWRlcnNNYXAudmFsdWVzKCkpIHtcbiAgICAgICAgICAgICAgICByZXN1bHRbZW50cnkubmFtZV0gPSBlbnRyeS52YWx1ZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIGZvciAoY29uc3QgW25vcm1hbGl6ZWROYW1lLCBlbnRyeV0gb2YgdGhpcy5faGVhZGVyc01hcCkge1xuICAgICAgICAgICAgICAgIHJlc3VsdFtub3JtYWxpemVkTmFtZV0gPSBlbnRyeS52YWx1ZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gcmVzdWx0O1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBHZXQgdGhlIHN0cmluZyByZXByZXNlbnRhdGlvbiBvZiB0aGlzIEhUVFAgaGVhZGVyIGNvbGxlY3Rpb24uXG4gICAgICovXG4gICAgdG9TdHJpbmcoKSB7XG4gICAgICAgIHJldHVybiBKU09OLnN0cmluZ2lmeSh0aGlzLnRvSlNPTih7IHByZXNlcnZlQ2FzZTogdHJ1ZSB9KSk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIEl0ZXJhdGUgb3ZlciB0dXBsZXMgb2YgaGVhZGVyIFtuYW1lLCB2YWx1ZV0gcGFpcnMuXG4gICAgICovXG4gICAgW1N5bWJvbC5pdGVyYXRvcl0oKSB7XG4gICAgICAgIHJldHVybiBoZWFkZXJJdGVyYXRvcih0aGlzLl9oZWFkZXJzTWFwKTtcbiAgICB9XG59XG4vKipcbiAqIENyZWF0ZXMgYW4gb2JqZWN0IHRoYXQgc2F0aXNmaWVzIHRoZSBgSHR0cEhlYWRlcnNgIGludGVyZmFjZS5cbiAqIEBwYXJhbSByYXdIZWFkZXJzIC0gQSBzaW1wbGUgb2JqZWN0IHJlcHJlc2VudGluZyBpbml0aWFsIGhlYWRlcnNcbiAqL1xuZnVuY3Rpb24gY3JlYXRlSHR0cEhlYWRlcnMocmF3SGVhZGVycykge1xuICAgIHJldHVybiBuZXcgSHR0cEhlYWRlcnNJbXBsKHJhd0hlYWRlcnMpO1xufVxuLy8jIHNvdXJjZU1hcHBpbmdVUkw9aHR0cEhlYWRlcnMuanMubWFwIiwKICAgICJcInVzZSBzdHJpY3RcIjtcbi8vIENvcHlyaWdodCAoYykgTWljcm9zb2Z0IENvcnBvcmF0aW9uLlxuLy8gTGljZW5zZWQgdW5kZXIgdGhlIE1JVCBMaWNlbnNlLlxuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiX19lc01vZHVsZVwiLCB7IHZhbHVlOiB0cnVlIH0pO1xuZXhwb3J0cy5mb3JtRGF0YVBvbGljeU5hbWUgPSB2b2lkIDA7XG5leHBvcnRzLmZvcm1EYXRhUG9saWN5ID0gZm9ybURhdGFQb2xpY3k7XG5jb25zdCBjb3JlX3V0aWxfMSA9IHJlcXVpcmUoXCJAYXp1cmUvY29yZS11dGlsXCIpO1xuY29uc3QgaHR0cEhlYWRlcnNfanNfMSA9IHJlcXVpcmUoXCIuLi9odHRwSGVhZGVycy5qc1wiKTtcbi8qKlxuICogVGhlIHByb2dyYW1tYXRpYyBpZGVudGlmaWVyIG9mIHRoZSBmb3JtRGF0YVBvbGljeS5cbiAqL1xuZXhwb3J0cy5mb3JtRGF0YVBvbGljeU5hbWUgPSBcImZvcm1EYXRhUG9saWN5XCI7XG5mdW5jdGlvbiBmb3JtRGF0YVRvRm9ybURhdGFNYXAoZm9ybURhdGEpIHtcbiAgICB2YXIgX2E7XG4gICAgY29uc3QgZm9ybURhdGFNYXAgPSB7fTtcbiAgICBmb3IgKGNvbnN0IFtrZXksIHZhbHVlXSBvZiBmb3JtRGF0YS5lbnRyaWVzKCkpIHtcbiAgICAgICAgKF9hID0gZm9ybURhdGFNYXBba2V5XSkgIT09IG51bGwgJiYgX2EgIT09IHZvaWQgMCA/IF9hIDogKGZvcm1EYXRhTWFwW2tleV0gPSBbXSk7XG4gICAgICAgIGZvcm1EYXRhTWFwW2tleV0ucHVzaCh2YWx1ZSk7XG4gICAgfVxuICAgIHJldHVybiBmb3JtRGF0YU1hcDtcbn1cbi8qKlxuICogQSBwb2xpY3kgdGhhdCBlbmNvZGVzIEZvcm1EYXRhIG9uIHRoZSByZXF1ZXN0IGludG8gdGhlIGJvZHkuXG4gKi9cbmZ1bmN0aW9uIGZvcm1EYXRhUG9saWN5KCkge1xuICAgIHJldHVybiB7XG4gICAgICAgIG5hbWU6IGV4cG9ydHMuZm9ybURhdGFQb2xpY3lOYW1lLFxuICAgICAgICBhc3luYyBzZW5kUmVxdWVzdChyZXF1ZXN0LCBuZXh0KSB7XG4gICAgICAgICAgICBpZiAoY29yZV91dGlsXzEuaXNOb2RlTGlrZSAmJiB0eXBlb2YgRm9ybURhdGEgIT09IFwidW5kZWZpbmVkXCIgJiYgcmVxdWVzdC5ib2R5IGluc3RhbmNlb2YgRm9ybURhdGEpIHtcbiAgICAgICAgICAgICAgICByZXF1ZXN0LmZvcm1EYXRhID0gZm9ybURhdGFUb0Zvcm1EYXRhTWFwKHJlcXVlc3QuYm9keSk7XG4gICAgICAgICAgICAgICAgcmVxdWVzdC5ib2R5ID0gdW5kZWZpbmVkO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKHJlcXVlc3QuZm9ybURhdGEpIHtcbiAgICAgICAgICAgICAgICBjb25zdCBjb250ZW50VHlwZSA9IHJlcXVlc3QuaGVhZGVycy5nZXQoXCJDb250ZW50LVR5cGVcIik7XG4gICAgICAgICAgICAgICAgaWYgKGNvbnRlbnRUeXBlICYmIGNvbnRlbnRUeXBlLmluZGV4T2YoXCJhcHBsaWNhdGlvbi94LXd3dy1mb3JtLXVybGVuY29kZWRcIikgIT09IC0xKSB7XG4gICAgICAgICAgICAgICAgICAgIHJlcXVlc3QuYm9keSA9IHd3d0Zvcm1VcmxFbmNvZGUocmVxdWVzdC5mb3JtRGF0YSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICBhd2FpdCBwcmVwYXJlRm9ybURhdGEocmVxdWVzdC5mb3JtRGF0YSwgcmVxdWVzdCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHJlcXVlc3QuZm9ybURhdGEgPSB1bmRlZmluZWQ7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4gbmV4dChyZXF1ZXN0KTtcbiAgICAgICAgfSxcbiAgICB9O1xufVxuZnVuY3Rpb24gd3d3Rm9ybVVybEVuY29kZShmb3JtRGF0YSkge1xuICAgIGNvbnN0IHVybFNlYXJjaFBhcmFtcyA9IG5ldyBVUkxTZWFyY2hQYXJhbXMoKTtcbiAgICBmb3IgKGNvbnN0IFtrZXksIHZhbHVlXSBvZiBPYmplY3QuZW50cmllcyhmb3JtRGF0YSkpIHtcbiAgICAgICAgaWYgKEFycmF5LmlzQXJyYXkodmFsdWUpKSB7XG4gICAgICAgICAgICBmb3IgKGNvbnN0IHN1YlZhbHVlIG9mIHZhbHVlKSB7XG4gICAgICAgICAgICAgICAgdXJsU2VhcmNoUGFyYW1zLmFwcGVuZChrZXksIHN1YlZhbHVlLnRvU3RyaW5nKCkpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgdXJsU2VhcmNoUGFyYW1zLmFwcGVuZChrZXksIHZhbHVlLnRvU3RyaW5nKCkpO1xuICAgICAgICB9XG4gICAgfVxuICAgIHJldHVybiB1cmxTZWFyY2hQYXJhbXMudG9TdHJpbmcoKTtcbn1cbmFzeW5jIGZ1bmN0aW9uIHByZXBhcmVGb3JtRGF0YShmb3JtRGF0YSwgcmVxdWVzdCkge1xuICAgIC8vIHZhbGlkYXRlIGNvbnRlbnQgdHlwZSAobXVsdGlwYXJ0L2Zvcm0tZGF0YSlcbiAgICBjb25zdCBjb250ZW50VHlwZSA9IHJlcXVlc3QuaGVhZGVycy5nZXQoXCJDb250ZW50LVR5cGVcIik7XG4gICAgaWYgKGNvbnRlbnRUeXBlICYmICFjb250ZW50VHlwZS5zdGFydHNXaXRoKFwibXVsdGlwYXJ0L2Zvcm0tZGF0YVwiKSkge1xuICAgICAgICAvLyBjb250ZW50IHR5cGUgaXMgc3BlY2lmaWVkIGFuZCBpcyBub3QgbXVsdGlwYXJ0L2Zvcm0tZGF0YS4gRXhpdC5cbiAgICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICByZXF1ZXN0LmhlYWRlcnMuc2V0KFwiQ29udGVudC1UeXBlXCIsIGNvbnRlbnRUeXBlICE9PSBudWxsICYmIGNvbnRlbnRUeXBlICE9PSB2b2lkIDAgPyBjb250ZW50VHlwZSA6IFwibXVsdGlwYXJ0L2Zvcm0tZGF0YVwiKTtcbiAgICAvLyBzZXQgYm9keSB0byBNdWx0aXBhcnRSZXF1ZXN0Qm9keSB1c2luZyBjb250ZW50IGZyb20gRm9ybURhdGFNYXBcbiAgICBjb25zdCBwYXJ0cyA9IFtdO1xuICAgIGZvciAoY29uc3QgW2ZpZWxkTmFtZSwgdmFsdWVzXSBvZiBPYmplY3QuZW50cmllcyhmb3JtRGF0YSkpIHtcbiAgICAgICAgZm9yIChjb25zdCB2YWx1ZSBvZiBBcnJheS5pc0FycmF5KHZhbHVlcykgPyB2YWx1ZXMgOiBbdmFsdWVzXSkge1xuICAgICAgICAgICAgaWYgKHR5cGVvZiB2YWx1ZSA9PT0gXCJzdHJpbmdcIikge1xuICAgICAgICAgICAgICAgIHBhcnRzLnB1c2goe1xuICAgICAgICAgICAgICAgICAgICBoZWFkZXJzOiAoMCwgaHR0cEhlYWRlcnNfanNfMS5jcmVhdGVIdHRwSGVhZGVycykoe1xuICAgICAgICAgICAgICAgICAgICAgICAgXCJDb250ZW50LURpc3Bvc2l0aW9uXCI6IGBmb3JtLWRhdGE7IG5hbWU9XCIke2ZpZWxkTmFtZX1cImAsXG4gICAgICAgICAgICAgICAgICAgIH0pLFxuICAgICAgICAgICAgICAgICAgICBib2R5OiAoMCwgY29yZV91dGlsXzEuc3RyaW5nVG9VaW50OEFycmF5KSh2YWx1ZSwgXCJ1dGYtOFwiKSxcbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2UgaWYgKHZhbHVlID09PSB1bmRlZmluZWQgfHwgdmFsdWUgPT09IG51bGwgfHwgdHlwZW9mIHZhbHVlICE9PSBcIm9iamVjdFwiKSB7XG4gICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBVbmV4cGVjdGVkIHZhbHVlIGZvciBrZXkgJHtmaWVsZE5hbWV9OiAke3ZhbHVlfS4gVmFsdWUgc2hvdWxkIGJlIHNlcmlhbGl6ZWQgdG8gc3RyaW5nIGZpcnN0LmApO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgLy8gdXNpbmcgfHwgaW5zdGVhZCBvZiA/PyBoZXJlIHNpbmNlIGlmIHZhbHVlLm5hbWUgaXMgZW1wdHkgd2Ugc2hvdWxkIGNyZWF0ZSBhIGZpbGUgbmFtZVxuICAgICAgICAgICAgICAgIGNvbnN0IGZpbGVOYW1lID0gdmFsdWUubmFtZSB8fCBcImJsb2JcIjtcbiAgICAgICAgICAgICAgICBjb25zdCBoZWFkZXJzID0gKDAsIGh0dHBIZWFkZXJzX2pzXzEuY3JlYXRlSHR0cEhlYWRlcnMpKCk7XG4gICAgICAgICAgICAgICAgaGVhZGVycy5zZXQoXCJDb250ZW50LURpc3Bvc2l0aW9uXCIsIGBmb3JtLWRhdGE7IG5hbWU9XCIke2ZpZWxkTmFtZX1cIjsgZmlsZW5hbWU9XCIke2ZpbGVOYW1lfVwiYCk7XG4gICAgICAgICAgICAgICAgLy8gYWdhaW4sIHx8IGlzIHVzZWQgc2luY2UgYW4gZW1wdHkgdmFsdWUudHlwZSBtZWFucyB0aGUgY29udGVudCB0eXBlIGlzIHVuc2V0XG4gICAgICAgICAgICAgICAgaGVhZGVycy5zZXQoXCJDb250ZW50LVR5cGVcIiwgdmFsdWUudHlwZSB8fCBcImFwcGxpY2F0aW9uL29jdGV0LXN0cmVhbVwiKTtcbiAgICAgICAgICAgICAgICBwYXJ0cy5wdXNoKHtcbiAgICAgICAgICAgICAgICAgICAgaGVhZGVycyxcbiAgICAgICAgICAgICAgICAgICAgYm9keTogdmFsdWUsXG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG4gICAgcmVxdWVzdC5tdWx0aXBhcnRCb2R5ID0geyBwYXJ0cyB9O1xufVxuLy8jIHNvdXJjZU1hcHBpbmdVUkw9Zm9ybURhdGFQb2xpY3kuanMubWFwIiwKICAgICIvKipcbiAqIEhlbHBlcnMuXG4gKi9cblxudmFyIHMgPSAxMDAwO1xudmFyIG0gPSBzICogNjA7XG52YXIgaCA9IG0gKiA2MDtcbnZhciBkID0gaCAqIDI0O1xudmFyIHcgPSBkICogNztcbnZhciB5ID0gZCAqIDM2NS4yNTtcblxuLyoqXG4gKiBQYXJzZSBvciBmb3JtYXQgdGhlIGdpdmVuIGB2YWxgLlxuICpcbiAqIE9wdGlvbnM6XG4gKlxuICogIC0gYGxvbmdgIHZlcmJvc2UgZm9ybWF0dGluZyBbZmFsc2VdXG4gKlxuICogQHBhcmFtIHtTdHJpbmd8TnVtYmVyfSB2YWxcbiAqIEBwYXJhbSB7T2JqZWN0fSBbb3B0aW9uc11cbiAqIEB0aHJvd3Mge0Vycm9yfSB0aHJvdyBhbiBlcnJvciBpZiB2YWwgaXMgbm90IGEgbm9uLWVtcHR5IHN0cmluZyBvciBhIG51bWJlclxuICogQHJldHVybiB7U3RyaW5nfE51bWJlcn1cbiAqIEBhcGkgcHVibGljXG4gKi9cblxubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiAodmFsLCBvcHRpb25zKSB7XG4gIG9wdGlvbnMgPSBvcHRpb25zIHx8IHt9O1xuICB2YXIgdHlwZSA9IHR5cGVvZiB2YWw7XG4gIGlmICh0eXBlID09PSAnc3RyaW5nJyAmJiB2YWwubGVuZ3RoID4gMCkge1xuICAgIHJldHVybiBwYXJzZSh2YWwpO1xuICB9IGVsc2UgaWYgKHR5cGUgPT09ICdudW1iZXInICYmIGlzRmluaXRlKHZhbCkpIHtcbiAgICByZXR1cm4gb3B0aW9ucy5sb25nID8gZm10TG9uZyh2YWwpIDogZm10U2hvcnQodmFsKTtcbiAgfVxuICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgJ3ZhbCBpcyBub3QgYSBub24tZW1wdHkgc3RyaW5nIG9yIGEgdmFsaWQgbnVtYmVyLiB2YWw9JyArXG4gICAgICBKU09OLnN0cmluZ2lmeSh2YWwpXG4gICk7XG59O1xuXG4vKipcbiAqIFBhcnNlIHRoZSBnaXZlbiBgc3RyYCBhbmQgcmV0dXJuIG1pbGxpc2Vjb25kcy5cbiAqXG4gKiBAcGFyYW0ge1N0cmluZ30gc3RyXG4gKiBAcmV0dXJuIHtOdW1iZXJ9XG4gKiBAYXBpIHByaXZhdGVcbiAqL1xuXG5mdW5jdGlvbiBwYXJzZShzdHIpIHtcbiAgc3RyID0gU3RyaW5nKHN0cik7XG4gIGlmIChzdHIubGVuZ3RoID4gMTAwKSB7XG4gICAgcmV0dXJuO1xuICB9XG4gIHZhciBtYXRjaCA9IC9eKC0/KD86XFxkKyk/XFwuP1xcZCspICoobWlsbGlzZWNvbmRzP3xtc2Vjcz98bXN8c2Vjb25kcz98c2Vjcz98c3xtaW51dGVzP3xtaW5zP3xtfGhvdXJzP3xocnM/fGh8ZGF5cz98ZHx3ZWVrcz98d3x5ZWFycz98eXJzP3x5KT8kL2kuZXhlYyhcbiAgICBzdHJcbiAgKTtcbiAgaWYgKCFtYXRjaCkge1xuICAgIHJldHVybjtcbiAgfVxuICB2YXIgbiA9IHBhcnNlRmxvYXQobWF0Y2hbMV0pO1xuICB2YXIgdHlwZSA9IChtYXRjaFsyXSB8fCAnbXMnKS50b0xvd2VyQ2FzZSgpO1xuICBzd2l0Y2ggKHR5cGUpIHtcbiAgICBjYXNlICd5ZWFycyc6XG4gICAgY2FzZSAneWVhcic6XG4gICAgY2FzZSAneXJzJzpcbiAgICBjYXNlICd5cic6XG4gICAgY2FzZSAneSc6XG4gICAgICByZXR1cm4gbiAqIHk7XG4gICAgY2FzZSAnd2Vla3MnOlxuICAgIGNhc2UgJ3dlZWsnOlxuICAgIGNhc2UgJ3cnOlxuICAgICAgcmV0dXJuIG4gKiB3O1xuICAgIGNhc2UgJ2RheXMnOlxuICAgIGNhc2UgJ2RheSc6XG4gICAgY2FzZSAnZCc6XG4gICAgICByZXR1cm4gbiAqIGQ7XG4gICAgY2FzZSAnaG91cnMnOlxuICAgIGNhc2UgJ2hvdXInOlxuICAgIGNhc2UgJ2hycyc6XG4gICAgY2FzZSAnaHInOlxuICAgIGNhc2UgJ2gnOlxuICAgICAgcmV0dXJuIG4gKiBoO1xuICAgIGNhc2UgJ21pbnV0ZXMnOlxuICAgIGNhc2UgJ21pbnV0ZSc6XG4gICAgY2FzZSAnbWlucyc6XG4gICAgY2FzZSAnbWluJzpcbiAgICBjYXNlICdtJzpcbiAgICAgIHJldHVybiBuICogbTtcbiAgICBjYXNlICdzZWNvbmRzJzpcbiAgICBjYXNlICdzZWNvbmQnOlxuICAgIGNhc2UgJ3NlY3MnOlxuICAgIGNhc2UgJ3NlYyc6XG4gICAgY2FzZSAncyc6XG4gICAgICByZXR1cm4gbiAqIHM7XG4gICAgY2FzZSAnbWlsbGlzZWNvbmRzJzpcbiAgICBjYXNlICdtaWxsaXNlY29uZCc6XG4gICAgY2FzZSAnbXNlY3MnOlxuICAgIGNhc2UgJ21zZWMnOlxuICAgIGNhc2UgJ21zJzpcbiAgICAgIHJldHVybiBuO1xuICAgIGRlZmF1bHQ6XG4gICAgICByZXR1cm4gdW5kZWZpbmVkO1xuICB9XG59XG5cbi8qKlxuICogU2hvcnQgZm9ybWF0IGZvciBgbXNgLlxuICpcbiAqIEBwYXJhbSB7TnVtYmVyfSBtc1xuICogQHJldHVybiB7U3RyaW5nfVxuICogQGFwaSBwcml2YXRlXG4gKi9cblxuZnVuY3Rpb24gZm10U2hvcnQobXMpIHtcbiAgdmFyIG1zQWJzID0gTWF0aC5hYnMobXMpO1xuICBpZiAobXNBYnMgPj0gZCkge1xuICAgIHJldHVybiBNYXRoLnJvdW5kKG1zIC8gZCkgKyAnZCc7XG4gIH1cbiAgaWYgKG1zQWJzID49IGgpIHtcbiAgICByZXR1cm4gTWF0aC5yb3VuZChtcyAvIGgpICsgJ2gnO1xuICB9XG4gIGlmIChtc0FicyA+PSBtKSB7XG4gICAgcmV0dXJuIE1hdGgucm91bmQobXMgLyBtKSArICdtJztcbiAgfVxuICBpZiAobXNBYnMgPj0gcykge1xuICAgIHJldHVybiBNYXRoLnJvdW5kKG1zIC8gcykgKyAncyc7XG4gIH1cbiAgcmV0dXJuIG1zICsgJ21zJztcbn1cblxuLyoqXG4gKiBMb25nIGZvcm1hdCBmb3IgYG1zYC5cbiAqXG4gKiBAcGFyYW0ge051bWJlcn0gbXNcbiAqIEByZXR1cm4ge1N0cmluZ31cbiAqIEBhcGkgcHJpdmF0ZVxuICovXG5cbmZ1bmN0aW9uIGZtdExvbmcobXMpIHtcbiAgdmFyIG1zQWJzID0gTWF0aC5hYnMobXMpO1xuICBpZiAobXNBYnMgPj0gZCkge1xuICAgIHJldHVybiBwbHVyYWwobXMsIG1zQWJzLCBkLCAnZGF5Jyk7XG4gIH1cbiAgaWYgKG1zQWJzID49IGgpIHtcbiAgICByZXR1cm4gcGx1cmFsKG1zLCBtc0FicywgaCwgJ2hvdXInKTtcbiAgfVxuICBpZiAobXNBYnMgPj0gbSkge1xuICAgIHJldHVybiBwbHVyYWwobXMsIG1zQWJzLCBtLCAnbWludXRlJyk7XG4gIH1cbiAgaWYgKG1zQWJzID49IHMpIHtcbiAgICByZXR1cm4gcGx1cmFsKG1zLCBtc0FicywgcywgJ3NlY29uZCcpO1xuICB9XG4gIHJldHVybiBtcyArICcgbXMnO1xufVxuXG4vKipcbiAqIFBsdXJhbGl6YXRpb24gaGVscGVyLlxuICovXG5cbmZ1bmN0aW9uIHBsdXJhbChtcywgbXNBYnMsIG4sIG5hbWUpIHtcbiAgdmFyIGlzUGx1cmFsID0gbXNBYnMgPj0gbiAqIDEuNTtcbiAgcmV0dXJuIE1hdGgucm91bmQobXMgLyBuKSArICcgJyArIG5hbWUgKyAoaXNQbHVyYWwgPyAncycgOiAnJyk7XG59XG4iLAogICAgIlxuLyoqXG4gKiBUaGlzIGlzIHRoZSBjb21tb24gbG9naWMgZm9yIGJvdGggdGhlIE5vZGUuanMgYW5kIHdlYiBicm93c2VyXG4gKiBpbXBsZW1lbnRhdGlvbnMgb2YgYGRlYnVnKClgLlxuICovXG5cbmZ1bmN0aW9uIHNldHVwKGVudikge1xuXHRjcmVhdGVEZWJ1Zy5kZWJ1ZyA9IGNyZWF0ZURlYnVnO1xuXHRjcmVhdGVEZWJ1Zy5kZWZhdWx0ID0gY3JlYXRlRGVidWc7XG5cdGNyZWF0ZURlYnVnLmNvZXJjZSA9IGNvZXJjZTtcblx0Y3JlYXRlRGVidWcuZGlzYWJsZSA9IGRpc2FibGU7XG5cdGNyZWF0ZURlYnVnLmVuYWJsZSA9IGVuYWJsZTtcblx0Y3JlYXRlRGVidWcuZW5hYmxlZCA9IGVuYWJsZWQ7XG5cdGNyZWF0ZURlYnVnLmh1bWFuaXplID0gcmVxdWlyZSgnbXMnKTtcblx0Y3JlYXRlRGVidWcuZGVzdHJveSA9IGRlc3Ryb3k7XG5cblx0T2JqZWN0LmtleXMoZW52KS5mb3JFYWNoKGtleSA9PiB7XG5cdFx0Y3JlYXRlRGVidWdba2V5XSA9IGVudltrZXldO1xuXHR9KTtcblxuXHQvKipcblx0KiBUaGUgY3VycmVudGx5IGFjdGl2ZSBkZWJ1ZyBtb2RlIG5hbWVzLCBhbmQgbmFtZXMgdG8gc2tpcC5cblx0Ki9cblxuXHRjcmVhdGVEZWJ1Zy5uYW1lcyA9IFtdO1xuXHRjcmVhdGVEZWJ1Zy5za2lwcyA9IFtdO1xuXG5cdC8qKlxuXHQqIE1hcCBvZiBzcGVjaWFsIFwiJW5cIiBoYW5kbGluZyBmdW5jdGlvbnMsIGZvciB0aGUgZGVidWcgXCJmb3JtYXRcIiBhcmd1bWVudC5cblx0KlxuXHQqIFZhbGlkIGtleSBuYW1lcyBhcmUgYSBzaW5nbGUsIGxvd2VyIG9yIHVwcGVyLWNhc2UgbGV0dGVyLCBpLmUuIFwiblwiIGFuZCBcIk5cIi5cblx0Ki9cblx0Y3JlYXRlRGVidWcuZm9ybWF0dGVycyA9IHt9O1xuXG5cdC8qKlxuXHQqIFNlbGVjdHMgYSBjb2xvciBmb3IgYSBkZWJ1ZyBuYW1lc3BhY2Vcblx0KiBAcGFyYW0ge1N0cmluZ30gbmFtZXNwYWNlIFRoZSBuYW1lc3BhY2Ugc3RyaW5nIGZvciB0aGUgZGVidWcgaW5zdGFuY2UgdG8gYmUgY29sb3JlZFxuXHQqIEByZXR1cm4ge051bWJlcnxTdHJpbmd9IEFuIEFOU0kgY29sb3IgY29kZSBmb3IgdGhlIGdpdmVuIG5hbWVzcGFjZVxuXHQqIEBhcGkgcHJpdmF0ZVxuXHQqL1xuXHRmdW5jdGlvbiBzZWxlY3RDb2xvcihuYW1lc3BhY2UpIHtcblx0XHRsZXQgaGFzaCA9IDA7XG5cblx0XHRmb3IgKGxldCBpID0gMDsgaSA8IG5hbWVzcGFjZS5sZW5ndGg7IGkrKykge1xuXHRcdFx0aGFzaCA9ICgoaGFzaCA8PCA1KSAtIGhhc2gpICsgbmFtZXNwYWNlLmNoYXJDb2RlQXQoaSk7XG5cdFx0XHRoYXNoIHw9IDA7IC8vIENvbnZlcnQgdG8gMzJiaXQgaW50ZWdlclxuXHRcdH1cblxuXHRcdHJldHVybiBjcmVhdGVEZWJ1Zy5jb2xvcnNbTWF0aC5hYnMoaGFzaCkgJSBjcmVhdGVEZWJ1Zy5jb2xvcnMubGVuZ3RoXTtcblx0fVxuXHRjcmVhdGVEZWJ1Zy5zZWxlY3RDb2xvciA9IHNlbGVjdENvbG9yO1xuXG5cdC8qKlxuXHQqIENyZWF0ZSBhIGRlYnVnZ2VyIHdpdGggdGhlIGdpdmVuIGBuYW1lc3BhY2VgLlxuXHQqXG5cdCogQHBhcmFtIHtTdHJpbmd9IG5hbWVzcGFjZVxuXHQqIEByZXR1cm4ge0Z1bmN0aW9ufVxuXHQqIEBhcGkgcHVibGljXG5cdCovXG5cdGZ1bmN0aW9uIGNyZWF0ZURlYnVnKG5hbWVzcGFjZSkge1xuXHRcdGxldCBwcmV2VGltZTtcblx0XHRsZXQgZW5hYmxlT3ZlcnJpZGUgPSBudWxsO1xuXHRcdGxldCBuYW1lc3BhY2VzQ2FjaGU7XG5cdFx0bGV0IGVuYWJsZWRDYWNoZTtcblxuXHRcdGZ1bmN0aW9uIGRlYnVnKC4uLmFyZ3MpIHtcblx0XHRcdC8vIERpc2FibGVkP1xuXHRcdFx0aWYgKCFkZWJ1Zy5lbmFibGVkKSB7XG5cdFx0XHRcdHJldHVybjtcblx0XHRcdH1cblxuXHRcdFx0Y29uc3Qgc2VsZiA9IGRlYnVnO1xuXG5cdFx0XHQvLyBTZXQgYGRpZmZgIHRpbWVzdGFtcFxuXHRcdFx0Y29uc3QgY3VyciA9IE51bWJlcihuZXcgRGF0ZSgpKTtcblx0XHRcdGNvbnN0IG1zID0gY3VyciAtIChwcmV2VGltZSB8fCBjdXJyKTtcblx0XHRcdHNlbGYuZGlmZiA9IG1zO1xuXHRcdFx0c2VsZi5wcmV2ID0gcHJldlRpbWU7XG5cdFx0XHRzZWxmLmN1cnIgPSBjdXJyO1xuXHRcdFx0cHJldlRpbWUgPSBjdXJyO1xuXG5cdFx0XHRhcmdzWzBdID0gY3JlYXRlRGVidWcuY29lcmNlKGFyZ3NbMF0pO1xuXG5cdFx0XHRpZiAodHlwZW9mIGFyZ3NbMF0gIT09ICdzdHJpbmcnKSB7XG5cdFx0XHRcdC8vIEFueXRoaW5nIGVsc2UgbGV0J3MgaW5zcGVjdCB3aXRoICVPXG5cdFx0XHRcdGFyZ3MudW5zaGlmdCgnJU8nKTtcblx0XHRcdH1cblxuXHRcdFx0Ly8gQXBwbHkgYW55IGBmb3JtYXR0ZXJzYCB0cmFuc2Zvcm1hdGlvbnNcblx0XHRcdGxldCBpbmRleCA9IDA7XG5cdFx0XHRhcmdzWzBdID0gYXJnc1swXS5yZXBsYWNlKC8lKFthLXpBLVolXSkvZywgKG1hdGNoLCBmb3JtYXQpID0+IHtcblx0XHRcdFx0Ly8gSWYgd2UgZW5jb3VudGVyIGFuIGVzY2FwZWQgJSB0aGVuIGRvbid0IGluY3JlYXNlIHRoZSBhcnJheSBpbmRleFxuXHRcdFx0XHRpZiAobWF0Y2ggPT09ICclJScpIHtcblx0XHRcdFx0XHRyZXR1cm4gJyUnO1xuXHRcdFx0XHR9XG5cdFx0XHRcdGluZGV4Kys7XG5cdFx0XHRcdGNvbnN0IGZvcm1hdHRlciA9IGNyZWF0ZURlYnVnLmZvcm1hdHRlcnNbZm9ybWF0XTtcblx0XHRcdFx0aWYgKHR5cGVvZiBmb3JtYXR0ZXIgPT09ICdmdW5jdGlvbicpIHtcblx0XHRcdFx0XHRjb25zdCB2YWwgPSBhcmdzW2luZGV4XTtcblx0XHRcdFx0XHRtYXRjaCA9IGZvcm1hdHRlci5jYWxsKHNlbGYsIHZhbCk7XG5cblx0XHRcdFx0XHQvLyBOb3cgd2UgbmVlZCB0byByZW1vdmUgYGFyZ3NbaW5kZXhdYCBzaW5jZSBpdCdzIGlubGluZWQgaW4gdGhlIGBmb3JtYXRgXG5cdFx0XHRcdFx0YXJncy5zcGxpY2UoaW5kZXgsIDEpO1xuXHRcdFx0XHRcdGluZGV4LS07XG5cdFx0XHRcdH1cblx0XHRcdFx0cmV0dXJuIG1hdGNoO1xuXHRcdFx0fSk7XG5cblx0XHRcdC8vIEFwcGx5IGVudi1zcGVjaWZpYyBmb3JtYXR0aW5nIChjb2xvcnMsIGV0Yy4pXG5cdFx0XHRjcmVhdGVEZWJ1Zy5mb3JtYXRBcmdzLmNhbGwoc2VsZiwgYXJncyk7XG5cblx0XHRcdGNvbnN0IGxvZ0ZuID0gc2VsZi5sb2cgfHwgY3JlYXRlRGVidWcubG9nO1xuXHRcdFx0bG9nRm4uYXBwbHkoc2VsZiwgYXJncyk7XG5cdFx0fVxuXG5cdFx0ZGVidWcubmFtZXNwYWNlID0gbmFtZXNwYWNlO1xuXHRcdGRlYnVnLnVzZUNvbG9ycyA9IGNyZWF0ZURlYnVnLnVzZUNvbG9ycygpO1xuXHRcdGRlYnVnLmNvbG9yID0gY3JlYXRlRGVidWcuc2VsZWN0Q29sb3IobmFtZXNwYWNlKTtcblx0XHRkZWJ1Zy5leHRlbmQgPSBleHRlbmQ7XG5cdFx0ZGVidWcuZGVzdHJveSA9IGNyZWF0ZURlYnVnLmRlc3Ryb3k7IC8vIFhYWCBUZW1wb3JhcnkuIFdpbGwgYmUgcmVtb3ZlZCBpbiB0aGUgbmV4dCBtYWpvciByZWxlYXNlLlxuXG5cdFx0T2JqZWN0LmRlZmluZVByb3BlcnR5KGRlYnVnLCAnZW5hYmxlZCcsIHtcblx0XHRcdGVudW1lcmFibGU6IHRydWUsXG5cdFx0XHRjb25maWd1cmFibGU6IGZhbHNlLFxuXHRcdFx0Z2V0OiAoKSA9PiB7XG5cdFx0XHRcdGlmIChlbmFibGVPdmVycmlkZSAhPT0gbnVsbCkge1xuXHRcdFx0XHRcdHJldHVybiBlbmFibGVPdmVycmlkZTtcblx0XHRcdFx0fVxuXHRcdFx0XHRpZiAobmFtZXNwYWNlc0NhY2hlICE9PSBjcmVhdGVEZWJ1Zy5uYW1lc3BhY2VzKSB7XG5cdFx0XHRcdFx0bmFtZXNwYWNlc0NhY2hlID0gY3JlYXRlRGVidWcubmFtZXNwYWNlcztcblx0XHRcdFx0XHRlbmFibGVkQ2FjaGUgPSBjcmVhdGVEZWJ1Zy5lbmFibGVkKG5hbWVzcGFjZSk7XG5cdFx0XHRcdH1cblxuXHRcdFx0XHRyZXR1cm4gZW5hYmxlZENhY2hlO1xuXHRcdFx0fSxcblx0XHRcdHNldDogdiA9PiB7XG5cdFx0XHRcdGVuYWJsZU92ZXJyaWRlID0gdjtcblx0XHRcdH1cblx0XHR9KTtcblxuXHRcdC8vIEVudi1zcGVjaWZpYyBpbml0aWFsaXphdGlvbiBsb2dpYyBmb3IgZGVidWcgaW5zdGFuY2VzXG5cdFx0aWYgKHR5cGVvZiBjcmVhdGVEZWJ1Zy5pbml0ID09PSAnZnVuY3Rpb24nKSB7XG5cdFx0XHRjcmVhdGVEZWJ1Zy5pbml0KGRlYnVnKTtcblx0XHR9XG5cblx0XHRyZXR1cm4gZGVidWc7XG5cdH1cblxuXHRmdW5jdGlvbiBleHRlbmQobmFtZXNwYWNlLCBkZWxpbWl0ZXIpIHtcblx0XHRjb25zdCBuZXdEZWJ1ZyA9IGNyZWF0ZURlYnVnKHRoaXMubmFtZXNwYWNlICsgKHR5cGVvZiBkZWxpbWl0ZXIgPT09ICd1bmRlZmluZWQnID8gJzonIDogZGVsaW1pdGVyKSArIG5hbWVzcGFjZSk7XG5cdFx0bmV3RGVidWcubG9nID0gdGhpcy5sb2c7XG5cdFx0cmV0dXJuIG5ld0RlYnVnO1xuXHR9XG5cblx0LyoqXG5cdCogRW5hYmxlcyBhIGRlYnVnIG1vZGUgYnkgbmFtZXNwYWNlcy4gVGhpcyBjYW4gaW5jbHVkZSBtb2Rlc1xuXHQqIHNlcGFyYXRlZCBieSBhIGNvbG9uIGFuZCB3aWxkY2FyZHMuXG5cdCpcblx0KiBAcGFyYW0ge1N0cmluZ30gbmFtZXNwYWNlc1xuXHQqIEBhcGkgcHVibGljXG5cdCovXG5cdGZ1bmN0aW9uIGVuYWJsZShuYW1lc3BhY2VzKSB7XG5cdFx0Y3JlYXRlRGVidWcuc2F2ZShuYW1lc3BhY2VzKTtcblx0XHRjcmVhdGVEZWJ1Zy5uYW1lc3BhY2VzID0gbmFtZXNwYWNlcztcblxuXHRcdGNyZWF0ZURlYnVnLm5hbWVzID0gW107XG5cdFx0Y3JlYXRlRGVidWcuc2tpcHMgPSBbXTtcblxuXHRcdGxldCBpO1xuXHRcdGNvbnN0IHNwbGl0ID0gKHR5cGVvZiBuYW1lc3BhY2VzID09PSAnc3RyaW5nJyA/IG5hbWVzcGFjZXMgOiAnJykuc3BsaXQoL1tcXHMsXSsvKTtcblx0XHRjb25zdCBsZW4gPSBzcGxpdC5sZW5ndGg7XG5cblx0XHRmb3IgKGkgPSAwOyBpIDwgbGVuOyBpKyspIHtcblx0XHRcdGlmICghc3BsaXRbaV0pIHtcblx0XHRcdFx0Ly8gaWdub3JlIGVtcHR5IHN0cmluZ3Ncblx0XHRcdFx0Y29udGludWU7XG5cdFx0XHR9XG5cblx0XHRcdG5hbWVzcGFjZXMgPSBzcGxpdFtpXS5yZXBsYWNlKC9cXCovZywgJy4qPycpO1xuXG5cdFx0XHRpZiAobmFtZXNwYWNlc1swXSA9PT0gJy0nKSB7XG5cdFx0XHRcdGNyZWF0ZURlYnVnLnNraXBzLnB1c2gobmV3IFJlZ0V4cCgnXicgKyBuYW1lc3BhY2VzLnNsaWNlKDEpICsgJyQnKSk7XG5cdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRjcmVhdGVEZWJ1Zy5uYW1lcy5wdXNoKG5ldyBSZWdFeHAoJ14nICsgbmFtZXNwYWNlcyArICckJykpO1xuXHRcdFx0fVxuXHRcdH1cblx0fVxuXG5cdC8qKlxuXHQqIERpc2FibGUgZGVidWcgb3V0cHV0LlxuXHQqXG5cdCogQHJldHVybiB7U3RyaW5nfSBuYW1lc3BhY2VzXG5cdCogQGFwaSBwdWJsaWNcblx0Ki9cblx0ZnVuY3Rpb24gZGlzYWJsZSgpIHtcblx0XHRjb25zdCBuYW1lc3BhY2VzID0gW1xuXHRcdFx0Li4uY3JlYXRlRGVidWcubmFtZXMubWFwKHRvTmFtZXNwYWNlKSxcblx0XHRcdC4uLmNyZWF0ZURlYnVnLnNraXBzLm1hcCh0b05hbWVzcGFjZSkubWFwKG5hbWVzcGFjZSA9PiAnLScgKyBuYW1lc3BhY2UpXG5cdFx0XS5qb2luKCcsJyk7XG5cdFx0Y3JlYXRlRGVidWcuZW5hYmxlKCcnKTtcblx0XHRyZXR1cm4gbmFtZXNwYWNlcztcblx0fVxuXG5cdC8qKlxuXHQqIFJldHVybnMgdHJ1ZSBpZiB0aGUgZ2l2ZW4gbW9kZSBuYW1lIGlzIGVuYWJsZWQsIGZhbHNlIG90aGVyd2lzZS5cblx0KlxuXHQqIEBwYXJhbSB7U3RyaW5nfSBuYW1lXG5cdCogQHJldHVybiB7Qm9vbGVhbn1cblx0KiBAYXBpIHB1YmxpY1xuXHQqL1xuXHRmdW5jdGlvbiBlbmFibGVkKG5hbWUpIHtcblx0XHRpZiAobmFtZVtuYW1lLmxlbmd0aCAtIDFdID09PSAnKicpIHtcblx0XHRcdHJldHVybiB0cnVlO1xuXHRcdH1cblxuXHRcdGxldCBpO1xuXHRcdGxldCBsZW47XG5cblx0XHRmb3IgKGkgPSAwLCBsZW4gPSBjcmVhdGVEZWJ1Zy5za2lwcy5sZW5ndGg7IGkgPCBsZW47IGkrKykge1xuXHRcdFx0aWYgKGNyZWF0ZURlYnVnLnNraXBzW2ldLnRlc3QobmFtZSkpIHtcblx0XHRcdFx0cmV0dXJuIGZhbHNlO1xuXHRcdFx0fVxuXHRcdH1cblxuXHRcdGZvciAoaSA9IDAsIGxlbiA9IGNyZWF0ZURlYnVnLm5hbWVzLmxlbmd0aDsgaSA8IGxlbjsgaSsrKSB7XG5cdFx0XHRpZiAoY3JlYXRlRGVidWcubmFtZXNbaV0udGVzdChuYW1lKSkge1xuXHRcdFx0XHRyZXR1cm4gdHJ1ZTtcblx0XHRcdH1cblx0XHR9XG5cblx0XHRyZXR1cm4gZmFsc2U7XG5cdH1cblxuXHQvKipcblx0KiBDb252ZXJ0IHJlZ2V4cCB0byBuYW1lc3BhY2Vcblx0KlxuXHQqIEBwYXJhbSB7UmVnRXhwfSByZWd4ZXBcblx0KiBAcmV0dXJuIHtTdHJpbmd9IG5hbWVzcGFjZVxuXHQqIEBhcGkgcHJpdmF0ZVxuXHQqL1xuXHRmdW5jdGlvbiB0b05hbWVzcGFjZShyZWdleHApIHtcblx0XHRyZXR1cm4gcmVnZXhwLnRvU3RyaW5nKClcblx0XHRcdC5zdWJzdHJpbmcoMiwgcmVnZXhwLnRvU3RyaW5nKCkubGVuZ3RoIC0gMilcblx0XHRcdC5yZXBsYWNlKC9cXC5cXCpcXD8kLywgJyonKTtcblx0fVxuXG5cdC8qKlxuXHQqIENvZXJjZSBgdmFsYC5cblx0KlxuXHQqIEBwYXJhbSB7TWl4ZWR9IHZhbFxuXHQqIEByZXR1cm4ge01peGVkfVxuXHQqIEBhcGkgcHJpdmF0ZVxuXHQqL1xuXHRmdW5jdGlvbiBjb2VyY2UodmFsKSB7XG5cdFx0aWYgKHZhbCBpbnN0YW5jZW9mIEVycm9yKSB7XG5cdFx0XHRyZXR1cm4gdmFsLnN0YWNrIHx8IHZhbC5tZXNzYWdlO1xuXHRcdH1cblx0XHRyZXR1cm4gdmFsO1xuXHR9XG5cblx0LyoqXG5cdCogWFhYIERPIE5PVCBVU0UuIFRoaXMgaXMgYSB0ZW1wb3Jhcnkgc3R1YiBmdW5jdGlvbi5cblx0KiBYWFggSXQgV0lMTCBiZSByZW1vdmVkIGluIHRoZSBuZXh0IG1ham9yIHJlbGVhc2UuXG5cdCovXG5cdGZ1bmN0aW9uIGRlc3Ryb3koKSB7XG5cdFx0Y29uc29sZS53YXJuKCdJbnN0YW5jZSBtZXRob2QgYGRlYnVnLmRlc3Ryb3koKWAgaXMgZGVwcmVjYXRlZCBhbmQgbm8gbG9uZ2VyIGRvZXMgYW55dGhpbmcuIEl0IHdpbGwgYmUgcmVtb3ZlZCBpbiB0aGUgbmV4dCBtYWpvciB2ZXJzaW9uIG9mIGBkZWJ1Z2AuJyk7XG5cdH1cblxuXHRjcmVhdGVEZWJ1Zy5lbmFibGUoY3JlYXRlRGVidWcubG9hZCgpKTtcblxuXHRyZXR1cm4gY3JlYXRlRGVidWc7XG59XG5cbm1vZHVsZS5leHBvcnRzID0gc2V0dXA7XG4iLAogICAgIi8qIGVzbGludC1lbnYgYnJvd3NlciAqL1xuXG4vKipcbiAqIFRoaXMgaXMgdGhlIHdlYiBicm93c2VyIGltcGxlbWVudGF0aW9uIG9mIGBkZWJ1ZygpYC5cbiAqL1xuXG5leHBvcnRzLmZvcm1hdEFyZ3MgPSBmb3JtYXRBcmdzO1xuZXhwb3J0cy5zYXZlID0gc2F2ZTtcbmV4cG9ydHMubG9hZCA9IGxvYWQ7XG5leHBvcnRzLnVzZUNvbG9ycyA9IHVzZUNvbG9ycztcbmV4cG9ydHMuc3RvcmFnZSA9IGxvY2Fsc3RvcmFnZSgpO1xuZXhwb3J0cy5kZXN0cm95ID0gKCgpID0+IHtcblx0bGV0IHdhcm5lZCA9IGZhbHNlO1xuXG5cdHJldHVybiAoKSA9PiB7XG5cdFx0aWYgKCF3YXJuZWQpIHtcblx0XHRcdHdhcm5lZCA9IHRydWU7XG5cdFx0XHRjb25zb2xlLndhcm4oJ0luc3RhbmNlIG1ldGhvZCBgZGVidWcuZGVzdHJveSgpYCBpcyBkZXByZWNhdGVkIGFuZCBubyBsb25nZXIgZG9lcyBhbnl0aGluZy4gSXQgd2lsbCBiZSByZW1vdmVkIGluIHRoZSBuZXh0IG1ham9yIHZlcnNpb24gb2YgYGRlYnVnYC4nKTtcblx0XHR9XG5cdH07XG59KSgpO1xuXG4vKipcbiAqIENvbG9ycy5cbiAqL1xuXG5leHBvcnRzLmNvbG9ycyA9IFtcblx0JyMwMDAwQ0MnLFxuXHQnIzAwMDBGRicsXG5cdCcjMDAzM0NDJyxcblx0JyMwMDMzRkYnLFxuXHQnIzAwNjZDQycsXG5cdCcjMDA2NkZGJyxcblx0JyMwMDk5Q0MnLFxuXHQnIzAwOTlGRicsXG5cdCcjMDBDQzAwJyxcblx0JyMwMENDMzMnLFxuXHQnIzAwQ0M2NicsXG5cdCcjMDBDQzk5Jyxcblx0JyMwMENDQ0MnLFxuXHQnIzAwQ0NGRicsXG5cdCcjMzMwMENDJyxcblx0JyMzMzAwRkYnLFxuXHQnIzMzMzNDQycsXG5cdCcjMzMzM0ZGJyxcblx0JyMzMzY2Q0MnLFxuXHQnIzMzNjZGRicsXG5cdCcjMzM5OUNDJyxcblx0JyMzMzk5RkYnLFxuXHQnIzMzQ0MwMCcsXG5cdCcjMzNDQzMzJyxcblx0JyMzM0NDNjYnLFxuXHQnIzMzQ0M5OScsXG5cdCcjMzNDQ0NDJyxcblx0JyMzM0NDRkYnLFxuXHQnIzY2MDBDQycsXG5cdCcjNjYwMEZGJyxcblx0JyM2NjMzQ0MnLFxuXHQnIzY2MzNGRicsXG5cdCcjNjZDQzAwJyxcblx0JyM2NkNDMzMnLFxuXHQnIzk5MDBDQycsXG5cdCcjOTkwMEZGJyxcblx0JyM5OTMzQ0MnLFxuXHQnIzk5MzNGRicsXG5cdCcjOTlDQzAwJyxcblx0JyM5OUNDMzMnLFxuXHQnI0NDMDAwMCcsXG5cdCcjQ0MwMDMzJyxcblx0JyNDQzAwNjYnLFxuXHQnI0NDMDA5OScsXG5cdCcjQ0MwMENDJyxcblx0JyNDQzAwRkYnLFxuXHQnI0NDMzMwMCcsXG5cdCcjQ0MzMzMzJyxcblx0JyNDQzMzNjYnLFxuXHQnI0NDMzM5OScsXG5cdCcjQ0MzM0NDJyxcblx0JyNDQzMzRkYnLFxuXHQnI0NDNjYwMCcsXG5cdCcjQ0M2NjMzJyxcblx0JyNDQzk5MDAnLFxuXHQnI0NDOTkzMycsXG5cdCcjQ0NDQzAwJyxcblx0JyNDQ0NDMzMnLFxuXHQnI0ZGMDAwMCcsXG5cdCcjRkYwMDMzJyxcblx0JyNGRjAwNjYnLFxuXHQnI0ZGMDA5OScsXG5cdCcjRkYwMENDJyxcblx0JyNGRjAwRkYnLFxuXHQnI0ZGMzMwMCcsXG5cdCcjRkYzMzMzJyxcblx0JyNGRjMzNjYnLFxuXHQnI0ZGMzM5OScsXG5cdCcjRkYzM0NDJyxcblx0JyNGRjMzRkYnLFxuXHQnI0ZGNjYwMCcsXG5cdCcjRkY2NjMzJyxcblx0JyNGRjk5MDAnLFxuXHQnI0ZGOTkzMycsXG5cdCcjRkZDQzAwJyxcblx0JyNGRkNDMzMnXG5dO1xuXG4vKipcbiAqIEN1cnJlbnRseSBvbmx5IFdlYktpdC1iYXNlZCBXZWIgSW5zcGVjdG9ycywgRmlyZWZveCA+PSB2MzEsXG4gKiBhbmQgdGhlIEZpcmVidWcgZXh0ZW5zaW9uIChhbnkgRmlyZWZveCB2ZXJzaW9uKSBhcmUga25vd25cbiAqIHRvIHN1cHBvcnQgXCIlY1wiIENTUyBjdXN0b21pemF0aW9ucy5cbiAqXG4gKiBUT0RPOiBhZGQgYSBgbG9jYWxTdG9yYWdlYCB2YXJpYWJsZSB0byBleHBsaWNpdGx5IGVuYWJsZS9kaXNhYmxlIGNvbG9yc1xuICovXG5cbi8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBjb21wbGV4aXR5XG5mdW5jdGlvbiB1c2VDb2xvcnMoKSB7XG5cdC8vIE5COiBJbiBhbiBFbGVjdHJvbiBwcmVsb2FkIHNjcmlwdCwgZG9jdW1lbnQgd2lsbCBiZSBkZWZpbmVkIGJ1dCBub3QgZnVsbHlcblx0Ly8gaW5pdGlhbGl6ZWQuIFNpbmNlIHdlIGtub3cgd2UncmUgaW4gQ2hyb21lLCB3ZSdsbCBqdXN0IGRldGVjdCB0aGlzIGNhc2Vcblx0Ly8gZXhwbGljaXRseVxuXHRpZiAodHlwZW9mIHdpbmRvdyAhPT0gJ3VuZGVmaW5lZCcgJiYgd2luZG93LnByb2Nlc3MgJiYgKHdpbmRvdy5wcm9jZXNzLnR5cGUgPT09ICdyZW5kZXJlcicgfHwgd2luZG93LnByb2Nlc3MuX19ud2pzKSkge1xuXHRcdHJldHVybiB0cnVlO1xuXHR9XG5cblx0Ly8gSW50ZXJuZXQgRXhwbG9yZXIgYW5kIEVkZ2UgZG8gbm90IHN1cHBvcnQgY29sb3JzLlxuXHRpZiAodHlwZW9mIG5hdmlnYXRvciAhPT0gJ3VuZGVmaW5lZCcgJiYgbmF2aWdhdG9yLnVzZXJBZ2VudCAmJiBuYXZpZ2F0b3IudXNlckFnZW50LnRvTG93ZXJDYXNlKCkubWF0Y2goLyhlZGdlfHRyaWRlbnQpXFwvKFxcZCspLykpIHtcblx0XHRyZXR1cm4gZmFsc2U7XG5cdH1cblxuXHRsZXQgbTtcblxuXHQvLyBJcyB3ZWJraXQ/IGh0dHA6Ly9zdGFja292ZXJmbG93LmNvbS9hLzE2NDU5NjA2LzM3Njc3M1xuXHQvLyBkb2N1bWVudCBpcyB1bmRlZmluZWQgaW4gcmVhY3QtbmF0aXZlOiBodHRwczovL2dpdGh1Yi5jb20vZmFjZWJvb2svcmVhY3QtbmF0aXZlL3B1bGwvMTYzMlxuXHRyZXR1cm4gKHR5cGVvZiBkb2N1bWVudCAhPT0gJ3VuZGVmaW5lZCcgJiYgZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50ICYmIGRvY3VtZW50LmRvY3VtZW50RWxlbWVudC5zdHlsZSAmJiBkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQuc3R5bGUuV2Via2l0QXBwZWFyYW5jZSkgfHxcblx0XHQvLyBJcyBmaXJlYnVnPyBodHRwOi8vc3RhY2tvdmVyZmxvdy5jb20vYS8zOTgxMjAvMzc2NzczXG5cdFx0KHR5cGVvZiB3aW5kb3cgIT09ICd1bmRlZmluZWQnICYmIHdpbmRvdy5jb25zb2xlICYmICh3aW5kb3cuY29uc29sZS5maXJlYnVnIHx8ICh3aW5kb3cuY29uc29sZS5leGNlcHRpb24gJiYgd2luZG93LmNvbnNvbGUudGFibGUpKSkgfHxcblx0XHQvLyBJcyBmaXJlZm94ID49IHYzMT9cblx0XHQvLyBodHRwczovL2RldmVsb3Blci5tb3ppbGxhLm9yZy9lbi1VUy9kb2NzL1Rvb2xzL1dlYl9Db25zb2xlI1N0eWxpbmdfbWVzc2FnZXNcblx0XHQodHlwZW9mIG5hdmlnYXRvciAhPT0gJ3VuZGVmaW5lZCcgJiYgbmF2aWdhdG9yLnVzZXJBZ2VudCAmJiAobSA9IG5hdmlnYXRvci51c2VyQWdlbnQudG9Mb3dlckNhc2UoKS5tYXRjaCgvZmlyZWZveFxcLyhcXGQrKS8pKSAmJiBwYXJzZUludChtWzFdLCAxMCkgPj0gMzEpIHx8XG5cdFx0Ly8gRG91YmxlIGNoZWNrIHdlYmtpdCBpbiB1c2VyQWdlbnQganVzdCBpbiBjYXNlIHdlIGFyZSBpbiBhIHdvcmtlclxuXHRcdCh0eXBlb2YgbmF2aWdhdG9yICE9PSAndW5kZWZpbmVkJyAmJiBuYXZpZ2F0b3IudXNlckFnZW50ICYmIG5hdmlnYXRvci51c2VyQWdlbnQudG9Mb3dlckNhc2UoKS5tYXRjaCgvYXBwbGV3ZWJraXRcXC8oXFxkKykvKSk7XG59XG5cbi8qKlxuICogQ29sb3JpemUgbG9nIGFyZ3VtZW50cyBpZiBlbmFibGVkLlxuICpcbiAqIEBhcGkgcHVibGljXG4gKi9cblxuZnVuY3Rpb24gZm9ybWF0QXJncyhhcmdzKSB7XG5cdGFyZ3NbMF0gPSAodGhpcy51c2VDb2xvcnMgPyAnJWMnIDogJycpICtcblx0XHR0aGlzLm5hbWVzcGFjZSArXG5cdFx0KHRoaXMudXNlQ29sb3JzID8gJyAlYycgOiAnICcpICtcblx0XHRhcmdzWzBdICtcblx0XHQodGhpcy51c2VDb2xvcnMgPyAnJWMgJyA6ICcgJykgK1xuXHRcdCcrJyArIG1vZHVsZS5leHBvcnRzLmh1bWFuaXplKHRoaXMuZGlmZik7XG5cblx0aWYgKCF0aGlzLnVzZUNvbG9ycykge1xuXHRcdHJldHVybjtcblx0fVxuXG5cdGNvbnN0IGMgPSAnY29sb3I6ICcgKyB0aGlzLmNvbG9yO1xuXHRhcmdzLnNwbGljZSgxLCAwLCBjLCAnY29sb3I6IGluaGVyaXQnKTtcblxuXHQvLyBUaGUgZmluYWwgXCIlY1wiIGlzIHNvbWV3aGF0IHRyaWNreSwgYmVjYXVzZSB0aGVyZSBjb3VsZCBiZSBvdGhlclxuXHQvLyBhcmd1bWVudHMgcGFzc2VkIGVpdGhlciBiZWZvcmUgb3IgYWZ0ZXIgdGhlICVjLCBzbyB3ZSBuZWVkIHRvXG5cdC8vIGZpZ3VyZSBvdXQgdGhlIGNvcnJlY3QgaW5kZXggdG8gaW5zZXJ0IHRoZSBDU1MgaW50b1xuXHRsZXQgaW5kZXggPSAwO1xuXHRsZXQgbGFzdEMgPSAwO1xuXHRhcmdzWzBdLnJlcGxhY2UoLyVbYS16QS1aJV0vZywgbWF0Y2ggPT4ge1xuXHRcdGlmIChtYXRjaCA9PT0gJyUlJykge1xuXHRcdFx0cmV0dXJuO1xuXHRcdH1cblx0XHRpbmRleCsrO1xuXHRcdGlmIChtYXRjaCA9PT0gJyVjJykge1xuXHRcdFx0Ly8gV2Ugb25seSBhcmUgaW50ZXJlc3RlZCBpbiB0aGUgKmxhc3QqICVjXG5cdFx0XHQvLyAodGhlIHVzZXIgbWF5IGhhdmUgcHJvdmlkZWQgdGhlaXIgb3duKVxuXHRcdFx0bGFzdEMgPSBpbmRleDtcblx0XHR9XG5cdH0pO1xuXG5cdGFyZ3Muc3BsaWNlKGxhc3RDLCAwLCBjKTtcbn1cblxuLyoqXG4gKiBJbnZva2VzIGBjb25zb2xlLmRlYnVnKClgIHdoZW4gYXZhaWxhYmxlLlxuICogTm8tb3Agd2hlbiBgY29uc29sZS5kZWJ1Z2AgaXMgbm90IGEgXCJmdW5jdGlvblwiLlxuICogSWYgYGNvbnNvbGUuZGVidWdgIGlzIG5vdCBhdmFpbGFibGUsIGZhbGxzIGJhY2tcbiAqIHRvIGBjb25zb2xlLmxvZ2AuXG4gKlxuICogQGFwaSBwdWJsaWNcbiAqL1xuZXhwb3J0cy5sb2cgPSBjb25zb2xlLmRlYnVnIHx8IGNvbnNvbGUubG9nIHx8ICgoKSA9PiB7fSk7XG5cbi8qKlxuICogU2F2ZSBgbmFtZXNwYWNlc2AuXG4gKlxuICogQHBhcmFtIHtTdHJpbmd9IG5hbWVzcGFjZXNcbiAqIEBhcGkgcHJpdmF0ZVxuICovXG5mdW5jdGlvbiBzYXZlKG5hbWVzcGFjZXMpIHtcblx0dHJ5IHtcblx0XHRpZiAobmFtZXNwYWNlcykge1xuXHRcdFx0ZXhwb3J0cy5zdG9yYWdlLnNldEl0ZW0oJ2RlYnVnJywgbmFtZXNwYWNlcyk7XG5cdFx0fSBlbHNlIHtcblx0XHRcdGV4cG9ydHMuc3RvcmFnZS5yZW1vdmVJdGVtKCdkZWJ1ZycpO1xuXHRcdH1cblx0fSBjYXRjaCAoZXJyb3IpIHtcblx0XHQvLyBTd2FsbG93XG5cdFx0Ly8gWFhYIChAUWl4LSkgc2hvdWxkIHdlIGJlIGxvZ2dpbmcgdGhlc2U/XG5cdH1cbn1cblxuLyoqXG4gKiBMb2FkIGBuYW1lc3BhY2VzYC5cbiAqXG4gKiBAcmV0dXJuIHtTdHJpbmd9IHJldHVybnMgdGhlIHByZXZpb3VzbHkgcGVyc2lzdGVkIGRlYnVnIG1vZGVzXG4gKiBAYXBpIHByaXZhdGVcbiAqL1xuZnVuY3Rpb24gbG9hZCgpIHtcblx0bGV0IHI7XG5cdHRyeSB7XG5cdFx0ciA9IGV4cG9ydHMuc3RvcmFnZS5nZXRJdGVtKCdkZWJ1ZycpO1xuXHR9IGNhdGNoIChlcnJvcikge1xuXHRcdC8vIFN3YWxsb3dcblx0XHQvLyBYWFggKEBRaXgtKSBzaG91bGQgd2UgYmUgbG9nZ2luZyB0aGVzZT9cblx0fVxuXG5cdC8vIElmIGRlYnVnIGlzbid0IHNldCBpbiBMUywgYW5kIHdlJ3JlIGluIEVsZWN0cm9uLCB0cnkgdG8gbG9hZCAkREVCVUdcblx0aWYgKCFyICYmIHR5cGVvZiBwcm9jZXNzICE9PSAndW5kZWZpbmVkJyAmJiAnZW52JyBpbiBwcm9jZXNzKSB7XG5cdFx0ciA9IHByb2Nlc3MuZW52LkRFQlVHO1xuXHR9XG5cblx0cmV0dXJuIHI7XG59XG5cbi8qKlxuICogTG9jYWxzdG9yYWdlIGF0dGVtcHRzIHRvIHJldHVybiB0aGUgbG9jYWxzdG9yYWdlLlxuICpcbiAqIFRoaXMgaXMgbmVjZXNzYXJ5IGJlY2F1c2Ugc2FmYXJpIHRocm93c1xuICogd2hlbiBhIHVzZXIgZGlzYWJsZXMgY29va2llcy9sb2NhbHN0b3JhZ2VcbiAqIGFuZCB5b3UgYXR0ZW1wdCB0byBhY2Nlc3MgaXQuXG4gKlxuICogQHJldHVybiB7TG9jYWxTdG9yYWdlfVxuICogQGFwaSBwcml2YXRlXG4gKi9cblxuZnVuY3Rpb24gbG9jYWxzdG9yYWdlKCkge1xuXHR0cnkge1xuXHRcdC8vIFRWTUxLaXQgKEFwcGxlIFRWIEpTIFJ1bnRpbWUpIGRvZXMgbm90IGhhdmUgYSB3aW5kb3cgb2JqZWN0LCBqdXN0IGxvY2FsU3RvcmFnZSBpbiB0aGUgZ2xvYmFsIGNvbnRleHRcblx0XHQvLyBUaGUgQnJvd3NlciBhbHNvIGhhcyBsb2NhbFN0b3JhZ2UgaW4gdGhlIGdsb2JhbCBjb250ZXh0LlxuXHRcdHJldHVybiBsb2NhbFN0b3JhZ2U7XG5cdH0gY2F0Y2ggKGVycm9yKSB7XG5cdFx0Ly8gU3dhbGxvd1xuXHRcdC8vIFhYWCAoQFFpeC0pIHNob3VsZCB3ZSBiZSBsb2dnaW5nIHRoZXNlP1xuXHR9XG59XG5cbm1vZHVsZS5leHBvcnRzID0gcmVxdWlyZSgnLi9jb21tb24nKShleHBvcnRzKTtcblxuY29uc3Qge2Zvcm1hdHRlcnN9ID0gbW9kdWxlLmV4cG9ydHM7XG5cbi8qKlxuICogTWFwICVqIHRvIGBKU09OLnN0cmluZ2lmeSgpYCwgc2luY2Ugbm8gV2ViIEluc3BlY3RvcnMgZG8gdGhhdCBieSBkZWZhdWx0LlxuICovXG5cbmZvcm1hdHRlcnMuaiA9IGZ1bmN0aW9uICh2KSB7XG5cdHRyeSB7XG5cdFx0cmV0dXJuIEpTT04uc3RyaW5naWZ5KHYpO1xuXHR9IGNhdGNoIChlcnJvcikge1xuXHRcdHJldHVybiAnW1VuZXhwZWN0ZWRKU09OUGFyc2VFcnJvcl06ICcgKyBlcnJvci5tZXNzYWdlO1xuXHR9XG59O1xuIiwKICAgICIvKipcbiAqIE1vZHVsZSBkZXBlbmRlbmNpZXMuXG4gKi9cblxuY29uc3QgdHR5ID0gcmVxdWlyZSgndHR5Jyk7XG5jb25zdCB1dGlsID0gcmVxdWlyZSgndXRpbCcpO1xuXG4vKipcbiAqIFRoaXMgaXMgdGhlIE5vZGUuanMgaW1wbGVtZW50YXRpb24gb2YgYGRlYnVnKClgLlxuICovXG5cbmV4cG9ydHMuaW5pdCA9IGluaXQ7XG5leHBvcnRzLmxvZyA9IGxvZztcbmV4cG9ydHMuZm9ybWF0QXJncyA9IGZvcm1hdEFyZ3M7XG5leHBvcnRzLnNhdmUgPSBzYXZlO1xuZXhwb3J0cy5sb2FkID0gbG9hZDtcbmV4cG9ydHMudXNlQ29sb3JzID0gdXNlQ29sb3JzO1xuZXhwb3J0cy5kZXN0cm95ID0gdXRpbC5kZXByZWNhdGUoXG5cdCgpID0+IHt9LFxuXHQnSW5zdGFuY2UgbWV0aG9kIGBkZWJ1Zy5kZXN0cm95KClgIGlzIGRlcHJlY2F0ZWQgYW5kIG5vIGxvbmdlciBkb2VzIGFueXRoaW5nLiBJdCB3aWxsIGJlIHJlbW92ZWQgaW4gdGhlIG5leHQgbWFqb3IgdmVyc2lvbiBvZiBgZGVidWdgLidcbik7XG5cbi8qKlxuICogQ29sb3JzLlxuICovXG5cbmV4cG9ydHMuY29sb3JzID0gWzYsIDIsIDMsIDQsIDUsIDFdO1xuXG50cnkge1xuXHQvLyBPcHRpb25hbCBkZXBlbmRlbmN5IChhcyBpbiwgZG9lc24ndCBuZWVkIHRvIGJlIGluc3RhbGxlZCwgTk9UIGxpa2Ugb3B0aW9uYWxEZXBlbmRlbmNpZXMgaW4gcGFja2FnZS5qc29uKVxuXHQvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgaW1wb3J0L25vLWV4dHJhbmVvdXMtZGVwZW5kZW5jaWVzXG5cdGNvbnN0IHN1cHBvcnRzQ29sb3IgPSByZXF1aXJlKCdzdXBwb3J0cy1jb2xvcicpO1xuXG5cdGlmIChzdXBwb3J0c0NvbG9yICYmIChzdXBwb3J0c0NvbG9yLnN0ZGVyciB8fCBzdXBwb3J0c0NvbG9yKS5sZXZlbCA+PSAyKSB7XG5cdFx0ZXhwb3J0cy5jb2xvcnMgPSBbXG5cdFx0XHQyMCxcblx0XHRcdDIxLFxuXHRcdFx0MjYsXG5cdFx0XHQyNyxcblx0XHRcdDMyLFxuXHRcdFx0MzMsXG5cdFx0XHQzOCxcblx0XHRcdDM5LFxuXHRcdFx0NDAsXG5cdFx0XHQ0MSxcblx0XHRcdDQyLFxuXHRcdFx0NDMsXG5cdFx0XHQ0NCxcblx0XHRcdDQ1LFxuXHRcdFx0NTYsXG5cdFx0XHQ1Nyxcblx0XHRcdDYyLFxuXHRcdFx0NjMsXG5cdFx0XHQ2OCxcblx0XHRcdDY5LFxuXHRcdFx0NzQsXG5cdFx0XHQ3NSxcblx0XHRcdDc2LFxuXHRcdFx0NzcsXG5cdFx0XHQ3OCxcblx0XHRcdDc5LFxuXHRcdFx0ODAsXG5cdFx0XHQ4MSxcblx0XHRcdDkyLFxuXHRcdFx0OTMsXG5cdFx0XHQ5OCxcblx0XHRcdDk5LFxuXHRcdFx0MTEyLFxuXHRcdFx0MTEzLFxuXHRcdFx0MTI4LFxuXHRcdFx0MTI5LFxuXHRcdFx0MTM0LFxuXHRcdFx0MTM1LFxuXHRcdFx0MTQ4LFxuXHRcdFx0MTQ5LFxuXHRcdFx0MTYwLFxuXHRcdFx0MTYxLFxuXHRcdFx0MTYyLFxuXHRcdFx0MTYzLFxuXHRcdFx0MTY0LFxuXHRcdFx0MTY1LFxuXHRcdFx0MTY2LFxuXHRcdFx0MTY3LFxuXHRcdFx0MTY4LFxuXHRcdFx0MTY5LFxuXHRcdFx0MTcwLFxuXHRcdFx0MTcxLFxuXHRcdFx0MTcyLFxuXHRcdFx0MTczLFxuXHRcdFx0MTc4LFxuXHRcdFx0MTc5LFxuXHRcdFx0MTg0LFxuXHRcdFx0MTg1LFxuXHRcdFx0MTk2LFxuXHRcdFx0MTk3LFxuXHRcdFx0MTk4LFxuXHRcdFx0MTk5LFxuXHRcdFx0MjAwLFxuXHRcdFx0MjAxLFxuXHRcdFx0MjAyLFxuXHRcdFx0MjAzLFxuXHRcdFx0MjA0LFxuXHRcdFx0MjA1LFxuXHRcdFx0MjA2LFxuXHRcdFx0MjA3LFxuXHRcdFx0MjA4LFxuXHRcdFx0MjA5LFxuXHRcdFx0MjE0LFxuXHRcdFx0MjE1LFxuXHRcdFx0MjIwLFxuXHRcdFx0MjIxXG5cdFx0XTtcblx0fVxufSBjYXRjaCAoZXJyb3IpIHtcblx0Ly8gU3dhbGxvdyAtIHdlIG9ubHkgY2FyZSBpZiBgc3VwcG9ydHMtY29sb3JgIGlzIGF2YWlsYWJsZTsgaXQgZG9lc24ndCBoYXZlIHRvIGJlLlxufVxuXG4vKipcbiAqIEJ1aWxkIHVwIHRoZSBkZWZhdWx0IGBpbnNwZWN0T3B0c2Agb2JqZWN0IGZyb20gdGhlIGVudmlyb25tZW50IHZhcmlhYmxlcy5cbiAqXG4gKiAgICQgREVCVUdfQ09MT1JTPW5vIERFQlVHX0RFUFRIPTEwIERFQlVHX1NIT1dfSElEREVOPWVuYWJsZWQgbm9kZSBzY3JpcHQuanNcbiAqL1xuXG5leHBvcnRzLmluc3BlY3RPcHRzID0gT2JqZWN0LmtleXMocHJvY2Vzcy5lbnYpLmZpbHRlcihrZXkgPT4ge1xuXHRyZXR1cm4gL15kZWJ1Z18vaS50ZXN0KGtleSk7XG59KS5yZWR1Y2UoKG9iaiwga2V5KSA9PiB7XG5cdC8vIENhbWVsLWNhc2Vcblx0Y29uc3QgcHJvcCA9IGtleVxuXHRcdC5zdWJzdHJpbmcoNilcblx0XHQudG9Mb3dlckNhc2UoKVxuXHRcdC5yZXBsYWNlKC9fKFthLXpdKS9nLCAoXywgaykgPT4ge1xuXHRcdFx0cmV0dXJuIGsudG9VcHBlckNhc2UoKTtcblx0XHR9KTtcblxuXHQvLyBDb2VyY2Ugc3RyaW5nIHZhbHVlIGludG8gSlMgdmFsdWVcblx0bGV0IHZhbCA9IHByb2Nlc3MuZW52W2tleV07XG5cdGlmICgvXih5ZXN8b258dHJ1ZXxlbmFibGVkKSQvaS50ZXN0KHZhbCkpIHtcblx0XHR2YWwgPSB0cnVlO1xuXHR9IGVsc2UgaWYgKC9eKG5vfG9mZnxmYWxzZXxkaXNhYmxlZCkkL2kudGVzdCh2YWwpKSB7XG5cdFx0dmFsID0gZmFsc2U7XG5cdH0gZWxzZSBpZiAodmFsID09PSAnbnVsbCcpIHtcblx0XHR2YWwgPSBudWxsO1xuXHR9IGVsc2Uge1xuXHRcdHZhbCA9IE51bWJlcih2YWwpO1xuXHR9XG5cblx0b2JqW3Byb3BdID0gdmFsO1xuXHRyZXR1cm4gb2JqO1xufSwge30pO1xuXG4vKipcbiAqIElzIHN0ZG91dCBhIFRUWT8gQ29sb3JlZCBvdXRwdXQgaXMgZW5hYmxlZCB3aGVuIGB0cnVlYC5cbiAqL1xuXG5mdW5jdGlvbiB1c2VDb2xvcnMoKSB7XG5cdHJldHVybiAnY29sb3JzJyBpbiBleHBvcnRzLmluc3BlY3RPcHRzID9cblx0XHRCb29sZWFuKGV4cG9ydHMuaW5zcGVjdE9wdHMuY29sb3JzKSA6XG5cdFx0dHR5LmlzYXR0eShwcm9jZXNzLnN0ZGVyci5mZCk7XG59XG5cbi8qKlxuICogQWRkcyBBTlNJIGNvbG9yIGVzY2FwZSBjb2RlcyBpZiBlbmFibGVkLlxuICpcbiAqIEBhcGkgcHVibGljXG4gKi9cblxuZnVuY3Rpb24gZm9ybWF0QXJncyhhcmdzKSB7XG5cdGNvbnN0IHtuYW1lc3BhY2U6IG5hbWUsIHVzZUNvbG9yc30gPSB0aGlzO1xuXG5cdGlmICh1c2VDb2xvcnMpIHtcblx0XHRjb25zdCBjID0gdGhpcy5jb2xvcjtcblx0XHRjb25zdCBjb2xvckNvZGUgPSAnXFx1MDAxQlszJyArIChjIDwgOCA/IGMgOiAnODs1OycgKyBjKTtcblx0XHRjb25zdCBwcmVmaXggPSBgICAke2NvbG9yQ29kZX07MW0ke25hbWV9IFxcdTAwMUJbMG1gO1xuXG5cdFx0YXJnc1swXSA9IHByZWZpeCArIGFyZ3NbMF0uc3BsaXQoJ1xcbicpLmpvaW4oJ1xcbicgKyBwcmVmaXgpO1xuXHRcdGFyZ3MucHVzaChjb2xvckNvZGUgKyAnbSsnICsgbW9kdWxlLmV4cG9ydHMuaHVtYW5pemUodGhpcy5kaWZmKSArICdcXHUwMDFCWzBtJyk7XG5cdH0gZWxzZSB7XG5cdFx0YXJnc1swXSA9IGdldERhdGUoKSArIG5hbWUgKyAnICcgKyBhcmdzWzBdO1xuXHR9XG59XG5cbmZ1bmN0aW9uIGdldERhdGUoKSB7XG5cdGlmIChleHBvcnRzLmluc3BlY3RPcHRzLmhpZGVEYXRlKSB7XG5cdFx0cmV0dXJuICcnO1xuXHR9XG5cdHJldHVybiBuZXcgRGF0ZSgpLnRvSVNPU3RyaW5nKCkgKyAnICc7XG59XG5cbi8qKlxuICogSW52b2tlcyBgdXRpbC5mb3JtYXRXaXRoT3B0aW9ucygpYCB3aXRoIHRoZSBzcGVjaWZpZWQgYXJndW1lbnRzIGFuZCB3cml0ZXMgdG8gc3RkZXJyLlxuICovXG5cbmZ1bmN0aW9uIGxvZyguLi5hcmdzKSB7XG5cdHJldHVybiBwcm9jZXNzLnN0ZGVyci53cml0ZSh1dGlsLmZvcm1hdFdpdGhPcHRpb25zKGV4cG9ydHMuaW5zcGVjdE9wdHMsIC4uLmFyZ3MpICsgJ1xcbicpO1xufVxuXG4vKipcbiAqIFNhdmUgYG5hbWVzcGFjZXNgLlxuICpcbiAqIEBwYXJhbSB7U3RyaW5nfSBuYW1lc3BhY2VzXG4gKiBAYXBpIHByaXZhdGVcbiAqL1xuZnVuY3Rpb24gc2F2ZShuYW1lc3BhY2VzKSB7XG5cdGlmIChuYW1lc3BhY2VzKSB7XG5cdFx0cHJvY2Vzcy5lbnYuREVCVUcgPSBuYW1lc3BhY2VzO1xuXHR9IGVsc2Uge1xuXHRcdC8vIElmIHlvdSBzZXQgYSBwcm9jZXNzLmVudiBmaWVsZCB0byBudWxsIG9yIHVuZGVmaW5lZCwgaXQgZ2V0cyBjYXN0IHRvIHRoZVxuXHRcdC8vIHN0cmluZyAnbnVsbCcgb3IgJ3VuZGVmaW5lZCcuIEp1c3QgZGVsZXRlIGluc3RlYWQuXG5cdFx0ZGVsZXRlIHByb2Nlc3MuZW52LkRFQlVHO1xuXHR9XG59XG5cbi8qKlxuICogTG9hZCBgbmFtZXNwYWNlc2AuXG4gKlxuICogQHJldHVybiB7U3RyaW5nfSByZXR1cm5zIHRoZSBwcmV2aW91c2x5IHBlcnNpc3RlZCBkZWJ1ZyBtb2Rlc1xuICogQGFwaSBwcml2YXRlXG4gKi9cblxuZnVuY3Rpb24gbG9hZCgpIHtcblx0cmV0dXJuIHByb2Nlc3MuZW52LkRFQlVHO1xufVxuXG4vKipcbiAqIEluaXQgbG9naWMgZm9yIGBkZWJ1Z2AgaW5zdGFuY2VzLlxuICpcbiAqIENyZWF0ZSBhIG5ldyBgaW5zcGVjdE9wdHNgIG9iamVjdCBpbiBjYXNlIGB1c2VDb2xvcnNgIGlzIHNldFxuICogZGlmZmVyZW50bHkgZm9yIGEgcGFydGljdWxhciBgZGVidWdgIGluc3RhbmNlLlxuICovXG5cbmZ1bmN0aW9uIGluaXQoZGVidWcpIHtcblx0ZGVidWcuaW5zcGVjdE9wdHMgPSB7fTtcblxuXHRjb25zdCBrZXlzID0gT2JqZWN0LmtleXMoZXhwb3J0cy5pbnNwZWN0T3B0cyk7XG5cdGZvciAobGV0IGkgPSAwOyBpIDwga2V5cy5sZW5ndGg7IGkrKykge1xuXHRcdGRlYnVnLmluc3BlY3RPcHRzW2tleXNbaV1dID0gZXhwb3J0cy5pbnNwZWN0T3B0c1trZXlzW2ldXTtcblx0fVxufVxuXG5tb2R1bGUuZXhwb3J0cyA9IHJlcXVpcmUoJy4vY29tbW9uJykoZXhwb3J0cyk7XG5cbmNvbnN0IHtmb3JtYXR0ZXJzfSA9IG1vZHVsZS5leHBvcnRzO1xuXG4vKipcbiAqIE1hcCAlbyB0byBgdXRpbC5pbnNwZWN0KClgLCBhbGwgb24gYSBzaW5nbGUgbGluZS5cbiAqL1xuXG5mb3JtYXR0ZXJzLm8gPSBmdW5jdGlvbiAodikge1xuXHR0aGlzLmluc3BlY3RPcHRzLmNvbG9ycyA9IHRoaXMudXNlQ29sb3JzO1xuXHRyZXR1cm4gdXRpbC5pbnNwZWN0KHYsIHRoaXMuaW5zcGVjdE9wdHMpXG5cdFx0LnNwbGl0KCdcXG4nKVxuXHRcdC5tYXAoc3RyID0+IHN0ci50cmltKCkpXG5cdFx0LmpvaW4oJyAnKTtcbn07XG5cbi8qKlxuICogTWFwICVPIHRvIGB1dGlsLmluc3BlY3QoKWAsIGFsbG93aW5nIG11bHRpcGxlIGxpbmVzIGlmIG5lZWRlZC5cbiAqL1xuXG5mb3JtYXR0ZXJzLk8gPSBmdW5jdGlvbiAodikge1xuXHR0aGlzLmluc3BlY3RPcHRzLmNvbG9ycyA9IHRoaXMudXNlQ29sb3JzO1xuXHRyZXR1cm4gdXRpbC5pbnNwZWN0KHYsIHRoaXMuaW5zcGVjdE9wdHMpO1xufTtcbiIsCiAgICAiLyoqXG4gKiBEZXRlY3QgRWxlY3Ryb24gcmVuZGVyZXIgLyBud2pzIHByb2Nlc3MsIHdoaWNoIGlzIG5vZGUsIGJ1dCB3ZSBzaG91bGRcbiAqIHRyZWF0IGFzIGEgYnJvd3Nlci5cbiAqL1xuXG5pZiAodHlwZW9mIHByb2Nlc3MgPT09ICd1bmRlZmluZWQnIHx8IHByb2Nlc3MudHlwZSA9PT0gJ3JlbmRlcmVyJyB8fCBwcm9jZXNzLmJyb3dzZXIgPT09IHRydWUgfHwgcHJvY2Vzcy5fX253anMpIHtcblx0bW9kdWxlLmV4cG9ydHMgPSByZXF1aXJlKCcuL2Jyb3dzZXIuanMnKTtcbn0gZWxzZSB7XG5cdG1vZHVsZS5leHBvcnRzID0gcmVxdWlyZSgnLi9ub2RlLmpzJyk7XG59XG4iLAogICAgIlwidXNlIHN0cmljdFwiO1xudmFyIF9fY3JlYXRlQmluZGluZyA9ICh0aGlzICYmIHRoaXMuX19jcmVhdGVCaW5kaW5nKSB8fCAoT2JqZWN0LmNyZWF0ZSA/IChmdW5jdGlvbihvLCBtLCBrLCBrMikge1xuICAgIGlmIChrMiA9PT0gdW5kZWZpbmVkKSBrMiA9IGs7XG4gICAgdmFyIGRlc2MgPSBPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKG0sIGspO1xuICAgIGlmICghZGVzYyB8fCAoXCJnZXRcIiBpbiBkZXNjID8gIW0uX19lc01vZHVsZSA6IGRlc2Mud3JpdGFibGUgfHwgZGVzYy5jb25maWd1cmFibGUpKSB7XG4gICAgICBkZXNjID0geyBlbnVtZXJhYmxlOiB0cnVlLCBnZXQ6IGZ1bmN0aW9uKCkgeyByZXR1cm4gbVtrXTsgfSB9O1xuICAgIH1cbiAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkobywgazIsIGRlc2MpO1xufSkgOiAoZnVuY3Rpb24obywgbSwgaywgazIpIHtcbiAgICBpZiAoazIgPT09IHVuZGVmaW5lZCkgazIgPSBrO1xuICAgIG9bazJdID0gbVtrXTtcbn0pKTtcbnZhciBfX3NldE1vZHVsZURlZmF1bHQgPSAodGhpcyAmJiB0aGlzLl9fc2V0TW9kdWxlRGVmYXVsdCkgfHwgKE9iamVjdC5jcmVhdGUgPyAoZnVuY3Rpb24obywgdikge1xuICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShvLCBcImRlZmF1bHRcIiwgeyBlbnVtZXJhYmxlOiB0cnVlLCB2YWx1ZTogdiB9KTtcbn0pIDogZnVuY3Rpb24obywgdikge1xuICAgIG9bXCJkZWZhdWx0XCJdID0gdjtcbn0pO1xudmFyIF9faW1wb3J0U3RhciA9ICh0aGlzICYmIHRoaXMuX19pbXBvcnRTdGFyKSB8fCBmdW5jdGlvbiAobW9kKSB7XG4gICAgaWYgKG1vZCAmJiBtb2QuX19lc01vZHVsZSkgcmV0dXJuIG1vZDtcbiAgICB2YXIgcmVzdWx0ID0ge307XG4gICAgaWYgKG1vZCAhPSBudWxsKSBmb3IgKHZhciBrIGluIG1vZCkgaWYgKGsgIT09IFwiZGVmYXVsdFwiICYmIE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChtb2QsIGspKSBfX2NyZWF0ZUJpbmRpbmcocmVzdWx0LCBtb2QsIGspO1xuICAgIF9fc2V0TW9kdWxlRGVmYXVsdChyZXN1bHQsIG1vZCk7XG4gICAgcmV0dXJuIHJlc3VsdDtcbn07XG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJfX2VzTW9kdWxlXCIsIHsgdmFsdWU6IHRydWUgfSk7XG5leHBvcnRzLnJlcSA9IGV4cG9ydHMuanNvbiA9IGV4cG9ydHMudG9CdWZmZXIgPSB2b2lkIDA7XG5jb25zdCBodHRwID0gX19pbXBvcnRTdGFyKHJlcXVpcmUoXCJodHRwXCIpKTtcbmNvbnN0IGh0dHBzID0gX19pbXBvcnRTdGFyKHJlcXVpcmUoXCJodHRwc1wiKSk7XG5hc3luYyBmdW5jdGlvbiB0b0J1ZmZlcihzdHJlYW0pIHtcbiAgICBsZXQgbGVuZ3RoID0gMDtcbiAgICBjb25zdCBjaHVua3MgPSBbXTtcbiAgICBmb3IgYXdhaXQgKGNvbnN0IGNodW5rIG9mIHN0cmVhbSkge1xuICAgICAgICBsZW5ndGggKz0gY2h1bmsubGVuZ3RoO1xuICAgICAgICBjaHVua3MucHVzaChjaHVuayk7XG4gICAgfVxuICAgIHJldHVybiBCdWZmZXIuY29uY2F0KGNodW5rcywgbGVuZ3RoKTtcbn1cbmV4cG9ydHMudG9CdWZmZXIgPSB0b0J1ZmZlcjtcbi8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tZXhwbGljaXQtYW55XG5hc3luYyBmdW5jdGlvbiBqc29uKHN0cmVhbSkge1xuICAgIGNvbnN0IGJ1ZiA9IGF3YWl0IHRvQnVmZmVyKHN0cmVhbSk7XG4gICAgY29uc3Qgc3RyID0gYnVmLnRvU3RyaW5nKCd1dGY4Jyk7XG4gICAgdHJ5IHtcbiAgICAgICAgcmV0dXJuIEpTT04ucGFyc2Uoc3RyKTtcbiAgICB9XG4gICAgY2F0Y2ggKF9lcnIpIHtcbiAgICAgICAgY29uc3QgZXJyID0gX2VycjtcbiAgICAgICAgZXJyLm1lc3NhZ2UgKz0gYCAoaW5wdXQ6ICR7c3RyfSlgO1xuICAgICAgICB0aHJvdyBlcnI7XG4gICAgfVxufVxuZXhwb3J0cy5qc29uID0ganNvbjtcbmZ1bmN0aW9uIHJlcSh1cmwsIG9wdHMgPSB7fSkge1xuICAgIGNvbnN0IGhyZWYgPSB0eXBlb2YgdXJsID09PSAnc3RyaW5nJyA/IHVybCA6IHVybC5ocmVmO1xuICAgIGNvbnN0IHJlcSA9IChocmVmLnN0YXJ0c1dpdGgoJ2h0dHBzOicpID8gaHR0cHMgOiBodHRwKS5yZXF1ZXN0KHVybCwgb3B0cyk7XG4gICAgY29uc3QgcHJvbWlzZSA9IG5ldyBQcm9taXNlKChyZXNvbHZlLCByZWplY3QpID0+IHtcbiAgICAgICAgcmVxXG4gICAgICAgICAgICAub25jZSgncmVzcG9uc2UnLCByZXNvbHZlKVxuICAgICAgICAgICAgLm9uY2UoJ2Vycm9yJywgcmVqZWN0KVxuICAgICAgICAgICAgLmVuZCgpO1xuICAgIH0pO1xuICAgIHJlcS50aGVuID0gcHJvbWlzZS50aGVuLmJpbmQocHJvbWlzZSk7XG4gICAgcmV0dXJuIHJlcTtcbn1cbmV4cG9ydHMucmVxID0gcmVxO1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9aGVscGVycy5qcy5tYXAiLAogICAgIlwidXNlIHN0cmljdFwiO1xudmFyIF9fY3JlYXRlQmluZGluZyA9ICh0aGlzICYmIHRoaXMuX19jcmVhdGVCaW5kaW5nKSB8fCAoT2JqZWN0LmNyZWF0ZSA/IChmdW5jdGlvbihvLCBtLCBrLCBrMikge1xuICAgIGlmIChrMiA9PT0gdW5kZWZpbmVkKSBrMiA9IGs7XG4gICAgdmFyIGRlc2MgPSBPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKG0sIGspO1xuICAgIGlmICghZGVzYyB8fCAoXCJnZXRcIiBpbiBkZXNjID8gIW0uX19lc01vZHVsZSA6IGRlc2Mud3JpdGFibGUgfHwgZGVzYy5jb25maWd1cmFibGUpKSB7XG4gICAgICBkZXNjID0geyBlbnVtZXJhYmxlOiB0cnVlLCBnZXQ6IGZ1bmN0aW9uKCkgeyByZXR1cm4gbVtrXTsgfSB9O1xuICAgIH1cbiAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkobywgazIsIGRlc2MpO1xufSkgOiAoZnVuY3Rpb24obywgbSwgaywgazIpIHtcbiAgICBpZiAoazIgPT09IHVuZGVmaW5lZCkgazIgPSBrO1xuICAgIG9bazJdID0gbVtrXTtcbn0pKTtcbnZhciBfX3NldE1vZHVsZURlZmF1bHQgPSAodGhpcyAmJiB0aGlzLl9fc2V0TW9kdWxlRGVmYXVsdCkgfHwgKE9iamVjdC5jcmVhdGUgPyAoZnVuY3Rpb24obywgdikge1xuICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShvLCBcImRlZmF1bHRcIiwgeyBlbnVtZXJhYmxlOiB0cnVlLCB2YWx1ZTogdiB9KTtcbn0pIDogZnVuY3Rpb24obywgdikge1xuICAgIG9bXCJkZWZhdWx0XCJdID0gdjtcbn0pO1xudmFyIF9faW1wb3J0U3RhciA9ICh0aGlzICYmIHRoaXMuX19pbXBvcnRTdGFyKSB8fCBmdW5jdGlvbiAobW9kKSB7XG4gICAgaWYgKG1vZCAmJiBtb2QuX19lc01vZHVsZSkgcmV0dXJuIG1vZDtcbiAgICB2YXIgcmVzdWx0ID0ge307XG4gICAgaWYgKG1vZCAhPSBudWxsKSBmb3IgKHZhciBrIGluIG1vZCkgaWYgKGsgIT09IFwiZGVmYXVsdFwiICYmIE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChtb2QsIGspKSBfX2NyZWF0ZUJpbmRpbmcocmVzdWx0LCBtb2QsIGspO1xuICAgIF9fc2V0TW9kdWxlRGVmYXVsdChyZXN1bHQsIG1vZCk7XG4gICAgcmV0dXJuIHJlc3VsdDtcbn07XG52YXIgX19leHBvcnRTdGFyID0gKHRoaXMgJiYgdGhpcy5fX2V4cG9ydFN0YXIpIHx8IGZ1bmN0aW9uKG0sIGV4cG9ydHMpIHtcbiAgICBmb3IgKHZhciBwIGluIG0pIGlmIChwICE9PSBcImRlZmF1bHRcIiAmJiAhT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKGV4cG9ydHMsIHApKSBfX2NyZWF0ZUJpbmRpbmcoZXhwb3J0cywgbSwgcCk7XG59O1xuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiX19lc01vZHVsZVwiLCB7IHZhbHVlOiB0cnVlIH0pO1xuZXhwb3J0cy5BZ2VudCA9IHZvaWQgMDtcbmNvbnN0IG5ldCA9IF9faW1wb3J0U3RhcihyZXF1aXJlKFwibmV0XCIpKTtcbmNvbnN0IGh0dHAgPSBfX2ltcG9ydFN0YXIocmVxdWlyZShcImh0dHBcIikpO1xuY29uc3QgaHR0cHNfMSA9IHJlcXVpcmUoXCJodHRwc1wiKTtcbl9fZXhwb3J0U3RhcihyZXF1aXJlKFwiLi9oZWxwZXJzXCIpLCBleHBvcnRzKTtcbmNvbnN0IElOVEVSTkFMID0gU3ltYm9sKCdBZ2VudEJhc2VJbnRlcm5hbFN0YXRlJyk7XG5jbGFzcyBBZ2VudCBleHRlbmRzIGh0dHAuQWdlbnQge1xuICAgIGNvbnN0cnVjdG9yKG9wdHMpIHtcbiAgICAgICAgc3VwZXIob3B0cyk7XG4gICAgICAgIHRoaXNbSU5URVJOQUxdID0ge307XG4gICAgfVxuICAgIC8qKlxuICAgICAqIERldGVybWluZSB3aGV0aGVyIHRoaXMgaXMgYW4gYGh0dHBgIG9yIGBodHRwc2AgcmVxdWVzdC5cbiAgICAgKi9cbiAgICBpc1NlY3VyZUVuZHBvaW50KG9wdGlvbnMpIHtcbiAgICAgICAgaWYgKG9wdGlvbnMpIHtcbiAgICAgICAgICAgIC8vIEZpcnN0IGNoZWNrIHRoZSBgc2VjdXJlRW5kcG9pbnRgIHByb3BlcnR5IGV4cGxpY2l0bHksIHNpbmNlIHRoaXNcbiAgICAgICAgICAgIC8vIG1lYW5zIHRoYXQgYSBwYXJlbnQgYEFnZW50YCBpcyBcInBhc3NpbmcgdGhyb3VnaFwiIHRvIHRoaXMgaW5zdGFuY2UuXG4gICAgICAgICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLWV4cGxpY2l0LWFueVxuICAgICAgICAgICAgaWYgKHR5cGVvZiBvcHRpb25zLnNlY3VyZUVuZHBvaW50ID09PSAnYm9vbGVhbicpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gb3B0aW9ucy5zZWN1cmVFbmRwb2ludDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIC8vIElmIG5vIGV4cGxpY2l0IGBzZWN1cmVgIGVuZHBvaW50LCBjaGVjayBpZiBgcHJvdG9jb2xgIHByb3BlcnR5IGlzXG4gICAgICAgICAgICAvLyBzZXQuIFRoaXMgd2lsbCB1c3VhbGx5IGJlIHRoZSBjYXNlIHNpbmNlIHVzaW5nIGEgZnVsbCBzdHJpbmcgVVJMXG4gICAgICAgICAgICAvLyBvciBgVVJMYCBpbnN0YW5jZSBzaG91bGQgYmUgdGhlIG1vc3QgY29tbW9uIHVzYWdlLlxuICAgICAgICAgICAgaWYgKHR5cGVvZiBvcHRpb25zLnByb3RvY29sID09PSAnc3RyaW5nJykge1xuICAgICAgICAgICAgICAgIHJldHVybiBvcHRpb25zLnByb3RvY29sID09PSAnaHR0cHM6JztcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICAvLyBGaW5hbGx5LCBpZiBubyBgcHJvdG9jb2xgIHByb3BlcnR5IHdhcyBzZXQsIHRoZW4gZmFsbCBiYWNrIHRvXG4gICAgICAgIC8vIGNoZWNraW5nIHRoZSBzdGFjayB0cmFjZSBvZiB0aGUgY3VycmVudCBjYWxsIHN0YWNrLCBhbmQgdHJ5IHRvXG4gICAgICAgIC8vIGRldGVjdCB0aGUgXCJodHRwc1wiIG1vZHVsZS5cbiAgICAgICAgY29uc3QgeyBzdGFjayB9ID0gbmV3IEVycm9yKCk7XG4gICAgICAgIGlmICh0eXBlb2Ygc3RhY2sgIT09ICdzdHJpbmcnKVxuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICByZXR1cm4gc3RhY2tcbiAgICAgICAgICAgIC5zcGxpdCgnXFxuJylcbiAgICAgICAgICAgIC5zb21lKChsKSA9PiBsLmluZGV4T2YoJyhodHRwcy5qczonKSAhPT0gLTEgfHxcbiAgICAgICAgICAgIGwuaW5kZXhPZignbm9kZTpodHRwczonKSAhPT0gLTEpO1xuICAgIH1cbiAgICAvLyBJbiBvcmRlciB0byBzdXBwb3J0IGFzeW5jIHNpZ25hdHVyZXMgaW4gYGNvbm5lY3QoKWAgYW5kIE5vZGUncyBuYXRpdmVcbiAgICAvLyBjb25uZWN0aW9uIHBvb2xpbmcgaW4gYGh0dHAuQWdlbnRgLCB0aGUgYXJyYXkgb2Ygc29ja2V0cyBmb3IgZWFjaCBvcmlnaW5cbiAgICAvLyBoYXMgdG8gYmUgdXBkYXRlZCBzeW5jaHJvbm91c2x5LiBUaGlzIGlzIHNvIHRoZSBsZW5ndGggb2YgdGhlIGFycmF5IGlzXG4gICAgLy8gYWNjdXJhdGUgd2hlbiBgYWRkUmVxdWVzdCgpYCBpcyBuZXh0IGNhbGxlZC4gV2UgYWNoaWV2ZSB0aGlzIGJ5IGNyZWF0aW5nIGFcbiAgICAvLyBmYWtlIHNvY2tldCBhbmQgYWRkaW5nIGl0IHRvIGBzb2NrZXRzW29yaWdpbl1gIGFuZCBpbmNyZW1lbnRpbmdcbiAgICAvLyBgdG90YWxTb2NrZXRDb3VudGAuXG4gICAgaW5jcmVtZW50U29ja2V0cyhuYW1lKSB7XG4gICAgICAgIC8vIElmIGBtYXhTb2NrZXRzYCBhbmQgYG1heFRvdGFsU29ja2V0c2AgYXJlIGJvdGggSW5maW5pdHkgdGhlbiB0aGVyZSBpcyBub1xuICAgICAgICAvLyBuZWVkIHRvIGNyZWF0ZSBhIGZha2Ugc29ja2V0IGJlY2F1c2UgTm9kZS5qcyBuYXRpdmUgY29ubmVjdGlvbiBwb29saW5nXG4gICAgICAgIC8vIHdpbGwgbmV2ZXIgYmUgaW52b2tlZC5cbiAgICAgICAgaWYgKHRoaXMubWF4U29ja2V0cyA9PT0gSW5maW5pdHkgJiYgdGhpcy5tYXhUb3RhbFNvY2tldHMgPT09IEluZmluaXR5KSB7XG4gICAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgICAgfVxuICAgICAgICAvLyBBbGwgaW5zdGFuY2VzIG9mIGBzb2NrZXRzYCBhcmUgZXhwZWN0ZWQgVHlwZVNjcmlwdCBlcnJvcnMuIFRoZVxuICAgICAgICAvLyBhbHRlcm5hdGl2ZSBpcyB0byBhZGQgaXQgYXMgYSBwcml2YXRlIHByb3BlcnR5IG9mIHRoaXMgY2xhc3MgYnV0IHRoYXRcbiAgICAgICAgLy8gd2lsbCBicmVhayBUeXBlU2NyaXB0IHN1YmNsYXNzaW5nLlxuICAgICAgICBpZiAoIXRoaXMuc29ja2V0c1tuYW1lXSkge1xuICAgICAgICAgICAgLy8gQHRzLWV4cGVjdC1lcnJvciBgc29ja2V0c2AgaXMgcmVhZG9ubHkgaW4gYEB0eXBlcy9ub2RlYFxuICAgICAgICAgICAgdGhpcy5zb2NrZXRzW25hbWVdID0gW107XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgZmFrZVNvY2tldCA9IG5ldyBuZXQuU29ja2V0KHsgd3JpdGFibGU6IGZhbHNlIH0pO1xuICAgICAgICB0aGlzLnNvY2tldHNbbmFtZV0ucHVzaChmYWtlU29ja2V0KTtcbiAgICAgICAgLy8gQHRzLWV4cGVjdC1lcnJvciBgdG90YWxTb2NrZXRDb3VudGAgaXNuJ3QgZGVmaW5lZCBpbiBgQHR5cGVzL25vZGVgXG4gICAgICAgIHRoaXMudG90YWxTb2NrZXRDb3VudCsrO1xuICAgICAgICByZXR1cm4gZmFrZVNvY2tldDtcbiAgICB9XG4gICAgZGVjcmVtZW50U29ja2V0cyhuYW1lLCBzb2NrZXQpIHtcbiAgICAgICAgaWYgKCF0aGlzLnNvY2tldHNbbmFtZV0gfHwgc29ja2V0ID09PSBudWxsKSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgY29uc3Qgc29ja2V0cyA9IHRoaXMuc29ja2V0c1tuYW1lXTtcbiAgICAgICAgY29uc3QgaW5kZXggPSBzb2NrZXRzLmluZGV4T2Yoc29ja2V0KTtcbiAgICAgICAgaWYgKGluZGV4ICE9PSAtMSkge1xuICAgICAgICAgICAgc29ja2V0cy5zcGxpY2UoaW5kZXgsIDEpO1xuICAgICAgICAgICAgLy8gQHRzLWV4cGVjdC1lcnJvciAgYHRvdGFsU29ja2V0Q291bnRgIGlzbid0IGRlZmluZWQgaW4gYEB0eXBlcy9ub2RlYFxuICAgICAgICAgICAgdGhpcy50b3RhbFNvY2tldENvdW50LS07XG4gICAgICAgICAgICBpZiAoc29ja2V0cy5sZW5ndGggPT09IDApIHtcbiAgICAgICAgICAgICAgICAvLyBAdHMtZXhwZWN0LWVycm9yIGBzb2NrZXRzYCBpcyByZWFkb25seSBpbiBgQHR5cGVzL25vZGVgXG4gICAgICAgICAgICAgICAgZGVsZXRlIHRoaXMuc29ja2V0c1tuYW1lXTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cbiAgICAvLyBJbiBvcmRlciB0byBwcm9wZXJseSB1cGRhdGUgdGhlIHNvY2tldCBwb29sLCB3ZSBuZWVkIHRvIGNhbGwgYGdldE5hbWUoKWAgb25cbiAgICAvLyB0aGUgY29yZSBgaHR0cHMuQWdlbnRgIGlmIGl0IGlzIGEgc2VjdXJlRW5kcG9pbnQuXG4gICAgZ2V0TmFtZShvcHRpb25zKSB7XG4gICAgICAgIGNvbnN0IHNlY3VyZUVuZHBvaW50ID0gdHlwZW9mIG9wdGlvbnMuc2VjdXJlRW5kcG9pbnQgPT09ICdib29sZWFuJ1xuICAgICAgICAgICAgPyBvcHRpb25zLnNlY3VyZUVuZHBvaW50XG4gICAgICAgICAgICA6IHRoaXMuaXNTZWN1cmVFbmRwb2ludChvcHRpb25zKTtcbiAgICAgICAgaWYgKHNlY3VyZUVuZHBvaW50KSB7XG4gICAgICAgICAgICAvLyBAdHMtZXhwZWN0LWVycm9yIGBnZXROYW1lKClgIGlzbid0IGRlZmluZWQgaW4gYEB0eXBlcy9ub2RlYFxuICAgICAgICAgICAgcmV0dXJuIGh0dHBzXzEuQWdlbnQucHJvdG90eXBlLmdldE5hbWUuY2FsbCh0aGlzLCBvcHRpb25zKTtcbiAgICAgICAgfVxuICAgICAgICAvLyBAdHMtZXhwZWN0LWVycm9yIGBnZXROYW1lKClgIGlzbid0IGRlZmluZWQgaW4gYEB0eXBlcy9ub2RlYFxuICAgICAgICByZXR1cm4gc3VwZXIuZ2V0TmFtZShvcHRpb25zKTtcbiAgICB9XG4gICAgY3JlYXRlU29ja2V0KHJlcSwgb3B0aW9ucywgY2IpIHtcbiAgICAgICAgY29uc3QgY29ubmVjdE9wdHMgPSB7XG4gICAgICAgICAgICAuLi5vcHRpb25zLFxuICAgICAgICAgICAgc2VjdXJlRW5kcG9pbnQ6IHRoaXMuaXNTZWN1cmVFbmRwb2ludChvcHRpb25zKSxcbiAgICAgICAgfTtcbiAgICAgICAgY29uc3QgbmFtZSA9IHRoaXMuZ2V0TmFtZShjb25uZWN0T3B0cyk7XG4gICAgICAgIGNvbnN0IGZha2VTb2NrZXQgPSB0aGlzLmluY3JlbWVudFNvY2tldHMobmFtZSk7XG4gICAgICAgIFByb21pc2UucmVzb2x2ZSgpXG4gICAgICAgICAgICAudGhlbigoKSA9PiB0aGlzLmNvbm5lY3QocmVxLCBjb25uZWN0T3B0cykpXG4gICAgICAgICAgICAudGhlbigoc29ja2V0KSA9PiB7XG4gICAgICAgICAgICB0aGlzLmRlY3JlbWVudFNvY2tldHMobmFtZSwgZmFrZVNvY2tldCk7XG4gICAgICAgICAgICBpZiAoc29ja2V0IGluc3RhbmNlb2YgaHR0cC5BZ2VudCkge1xuICAgICAgICAgICAgICAgIC8vIEB0cy1leHBlY3QtZXJyb3IgYGFkZFJlcXVlc3QoKWAgaXNuJ3QgZGVmaW5lZCBpbiBgQHR5cGVzL25vZGVgXG4gICAgICAgICAgICAgICAgcmV0dXJuIHNvY2tldC5hZGRSZXF1ZXN0KHJlcSwgY29ubmVjdE9wdHMpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgdGhpc1tJTlRFUk5BTF0uY3VycmVudFNvY2tldCA9IHNvY2tldDtcbiAgICAgICAgICAgIC8vIEB0cy1leHBlY3QtZXJyb3IgYGNyZWF0ZVNvY2tldCgpYCBpc24ndCBkZWZpbmVkIGluIGBAdHlwZXMvbm9kZWBcbiAgICAgICAgICAgIHN1cGVyLmNyZWF0ZVNvY2tldChyZXEsIG9wdGlvbnMsIGNiKTtcbiAgICAgICAgfSwgKGVycikgPT4ge1xuICAgICAgICAgICAgdGhpcy5kZWNyZW1lbnRTb2NrZXRzKG5hbWUsIGZha2VTb2NrZXQpO1xuICAgICAgICAgICAgY2IoZXJyKTtcbiAgICAgICAgfSk7XG4gICAgfVxuICAgIGNyZWF0ZUNvbm5lY3Rpb24oKSB7XG4gICAgICAgIGNvbnN0IHNvY2tldCA9IHRoaXNbSU5URVJOQUxdLmN1cnJlbnRTb2NrZXQ7XG4gICAgICAgIHRoaXNbSU5URVJOQUxdLmN1cnJlbnRTb2NrZXQgPSB1bmRlZmluZWQ7XG4gICAgICAgIGlmICghc29ja2V0KSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ05vIHNvY2tldCB3YXMgcmV0dXJuZWQgaW4gdGhlIGBjb25uZWN0KClgIGZ1bmN0aW9uJyk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHNvY2tldDtcbiAgICB9XG4gICAgZ2V0IGRlZmF1bHRQb3J0KCkge1xuICAgICAgICByZXR1cm4gKHRoaXNbSU5URVJOQUxdLmRlZmF1bHRQb3J0ID8/XG4gICAgICAgICAgICAodGhpcy5wcm90b2NvbCA9PT0gJ2h0dHBzOicgPyA0NDMgOiA4MCkpO1xuICAgIH1cbiAgICBzZXQgZGVmYXVsdFBvcnQodikge1xuICAgICAgICBpZiAodGhpc1tJTlRFUk5BTF0pIHtcbiAgICAgICAgICAgIHRoaXNbSU5URVJOQUxdLmRlZmF1bHRQb3J0ID0gdjtcbiAgICAgICAgfVxuICAgIH1cbiAgICBnZXQgcHJvdG9jb2woKSB7XG4gICAgICAgIHJldHVybiAodGhpc1tJTlRFUk5BTF0ucHJvdG9jb2wgPz9cbiAgICAgICAgICAgICh0aGlzLmlzU2VjdXJlRW5kcG9pbnQoKSA/ICdodHRwczonIDogJ2h0dHA6JykpO1xuICAgIH1cbiAgICBzZXQgcHJvdG9jb2wodikge1xuICAgICAgICBpZiAodGhpc1tJTlRFUk5BTF0pIHtcbiAgICAgICAgICAgIHRoaXNbSU5URVJOQUxdLnByb3RvY29sID0gdjtcbiAgICAgICAgfVxuICAgIH1cbn1cbmV4cG9ydHMuQWdlbnQgPSBBZ2VudDtcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPWluZGV4LmpzLm1hcCIsCiAgICAiXCJ1c2Ugc3RyaWN0XCI7XG52YXIgX19pbXBvcnREZWZhdWx0ID0gKHRoaXMgJiYgdGhpcy5fX2ltcG9ydERlZmF1bHQpIHx8IGZ1bmN0aW9uIChtb2QpIHtcbiAgICByZXR1cm4gKG1vZCAmJiBtb2QuX19lc01vZHVsZSkgPyBtb2QgOiB7IFwiZGVmYXVsdFwiOiBtb2QgfTtcbn07XG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJfX2VzTW9kdWxlXCIsIHsgdmFsdWU6IHRydWUgfSk7XG5leHBvcnRzLnBhcnNlUHJveHlSZXNwb25zZSA9IHZvaWQgMDtcbmNvbnN0IGRlYnVnXzEgPSBfX2ltcG9ydERlZmF1bHQocmVxdWlyZShcImRlYnVnXCIpKTtcbmNvbnN0IGRlYnVnID0gKDAsIGRlYnVnXzEuZGVmYXVsdCkoJ2h0dHBzLXByb3h5LWFnZW50OnBhcnNlLXByb3h5LXJlc3BvbnNlJyk7XG5mdW5jdGlvbiBwYXJzZVByb3h5UmVzcG9uc2Uoc29ja2V0KSB7XG4gICAgcmV0dXJuIG5ldyBQcm9taXNlKChyZXNvbHZlLCByZWplY3QpID0+IHtcbiAgICAgICAgLy8gd2UgbmVlZCB0byBidWZmZXIgYW55IEhUVFAgdHJhZmZpYyB0aGF0IGhhcHBlbnMgd2l0aCB0aGUgcHJveHkgYmVmb3JlIHdlIGdldFxuICAgICAgICAvLyB0aGUgQ09OTkVDVCByZXNwb25zZSwgc28gdGhhdCBpZiB0aGUgcmVzcG9uc2UgaXMgYW55dGhpbmcgb3RoZXIgdGhhbiBhbiBcIjIwMFwiXG4gICAgICAgIC8vIHJlc3BvbnNlIGNvZGUsIHRoZW4gd2UgY2FuIHJlLXBsYXkgdGhlIFwiZGF0YVwiIGV2ZW50cyBvbiB0aGUgc29ja2V0IG9uY2UgdGhlXG4gICAgICAgIC8vIEhUVFAgcGFyc2VyIGlzIGhvb2tlZCB1cC4uLlxuICAgICAgICBsZXQgYnVmZmVyc0xlbmd0aCA9IDA7XG4gICAgICAgIGNvbnN0IGJ1ZmZlcnMgPSBbXTtcbiAgICAgICAgZnVuY3Rpb24gcmVhZCgpIHtcbiAgICAgICAgICAgIGNvbnN0IGIgPSBzb2NrZXQucmVhZCgpO1xuICAgICAgICAgICAgaWYgKGIpXG4gICAgICAgICAgICAgICAgb25kYXRhKGIpO1xuICAgICAgICAgICAgZWxzZVxuICAgICAgICAgICAgICAgIHNvY2tldC5vbmNlKCdyZWFkYWJsZScsIHJlYWQpO1xuICAgICAgICB9XG4gICAgICAgIGZ1bmN0aW9uIGNsZWFudXAoKSB7XG4gICAgICAgICAgICBzb2NrZXQucmVtb3ZlTGlzdGVuZXIoJ2VuZCcsIG9uZW5kKTtcbiAgICAgICAgICAgIHNvY2tldC5yZW1vdmVMaXN0ZW5lcignZXJyb3InLCBvbmVycm9yKTtcbiAgICAgICAgICAgIHNvY2tldC5yZW1vdmVMaXN0ZW5lcigncmVhZGFibGUnLCByZWFkKTtcbiAgICAgICAgfVxuICAgICAgICBmdW5jdGlvbiBvbmVuZCgpIHtcbiAgICAgICAgICAgIGNsZWFudXAoKTtcbiAgICAgICAgICAgIGRlYnVnKCdvbmVuZCcpO1xuICAgICAgICAgICAgcmVqZWN0KG5ldyBFcnJvcignUHJveHkgY29ubmVjdGlvbiBlbmRlZCBiZWZvcmUgcmVjZWl2aW5nIENPTk5FQ1QgcmVzcG9uc2UnKSk7XG4gICAgICAgIH1cbiAgICAgICAgZnVuY3Rpb24gb25lcnJvcihlcnIpIHtcbiAgICAgICAgICAgIGNsZWFudXAoKTtcbiAgICAgICAgICAgIGRlYnVnKCdvbmVycm9yICVvJywgZXJyKTtcbiAgICAgICAgICAgIHJlamVjdChlcnIpO1xuICAgICAgICB9XG4gICAgICAgIGZ1bmN0aW9uIG9uZGF0YShiKSB7XG4gICAgICAgICAgICBidWZmZXJzLnB1c2goYik7XG4gICAgICAgICAgICBidWZmZXJzTGVuZ3RoICs9IGIubGVuZ3RoO1xuICAgICAgICAgICAgY29uc3QgYnVmZmVyZWQgPSBCdWZmZXIuY29uY2F0KGJ1ZmZlcnMsIGJ1ZmZlcnNMZW5ndGgpO1xuICAgICAgICAgICAgY29uc3QgZW5kT2ZIZWFkZXJzID0gYnVmZmVyZWQuaW5kZXhPZignXFxyXFxuXFxyXFxuJyk7XG4gICAgICAgICAgICBpZiAoZW5kT2ZIZWFkZXJzID09PSAtMSkge1xuICAgICAgICAgICAgICAgIC8vIGtlZXAgYnVmZmVyaW5nXG4gICAgICAgICAgICAgICAgZGVidWcoJ2hhdmUgbm90IHJlY2VpdmVkIGVuZCBvZiBIVFRQIGhlYWRlcnMgeWV0Li4uJyk7XG4gICAgICAgICAgICAgICAgcmVhZCgpO1xuICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGNvbnN0IGhlYWRlclBhcnRzID0gYnVmZmVyZWRcbiAgICAgICAgICAgICAgICAuc2xpY2UoMCwgZW5kT2ZIZWFkZXJzKVxuICAgICAgICAgICAgICAgIC50b1N0cmluZygnYXNjaWknKVxuICAgICAgICAgICAgICAgIC5zcGxpdCgnXFxyXFxuJyk7XG4gICAgICAgICAgICBjb25zdCBmaXJzdExpbmUgPSBoZWFkZXJQYXJ0cy5zaGlmdCgpO1xuICAgICAgICAgICAgaWYgKCFmaXJzdExpbmUpIHtcbiAgICAgICAgICAgICAgICBzb2NrZXQuZGVzdHJveSgpO1xuICAgICAgICAgICAgICAgIHJldHVybiByZWplY3QobmV3IEVycm9yKCdObyBoZWFkZXIgcmVjZWl2ZWQgZnJvbSBwcm94eSBDT05ORUNUIHJlc3BvbnNlJykpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgY29uc3QgZmlyc3RMaW5lUGFydHMgPSBmaXJzdExpbmUuc3BsaXQoJyAnKTtcbiAgICAgICAgICAgIGNvbnN0IHN0YXR1c0NvZGUgPSArZmlyc3RMaW5lUGFydHNbMV07XG4gICAgICAgICAgICBjb25zdCBzdGF0dXNUZXh0ID0gZmlyc3RMaW5lUGFydHMuc2xpY2UoMikuam9pbignICcpO1xuICAgICAgICAgICAgY29uc3QgaGVhZGVycyA9IHt9O1xuICAgICAgICAgICAgZm9yIChjb25zdCBoZWFkZXIgb2YgaGVhZGVyUGFydHMpIHtcbiAgICAgICAgICAgICAgICBpZiAoIWhlYWRlcilcbiAgICAgICAgICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgICAgICAgY29uc3QgZmlyc3RDb2xvbiA9IGhlYWRlci5pbmRleE9mKCc6Jyk7XG4gICAgICAgICAgICAgICAgaWYgKGZpcnN0Q29sb24gPT09IC0xKSB7XG4gICAgICAgICAgICAgICAgICAgIHNvY2tldC5kZXN0cm95KCk7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiByZWplY3QobmV3IEVycm9yKGBJbnZhbGlkIGhlYWRlciBmcm9tIHByb3h5IENPTk5FQ1QgcmVzcG9uc2U6IFwiJHtoZWFkZXJ9XCJgKSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGNvbnN0IGtleSA9IGhlYWRlci5zbGljZSgwLCBmaXJzdENvbG9uKS50b0xvd2VyQ2FzZSgpO1xuICAgICAgICAgICAgICAgIGNvbnN0IHZhbHVlID0gaGVhZGVyLnNsaWNlKGZpcnN0Q29sb24gKyAxKS50cmltU3RhcnQoKTtcbiAgICAgICAgICAgICAgICBjb25zdCBjdXJyZW50ID0gaGVhZGVyc1trZXldO1xuICAgICAgICAgICAgICAgIGlmICh0eXBlb2YgY3VycmVudCA9PT0gJ3N0cmluZycpIHtcbiAgICAgICAgICAgICAgICAgICAgaGVhZGVyc1trZXldID0gW2N1cnJlbnQsIHZhbHVlXTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgZWxzZSBpZiAoQXJyYXkuaXNBcnJheShjdXJyZW50KSkge1xuICAgICAgICAgICAgICAgICAgICBjdXJyZW50LnB1c2godmFsdWUpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgaGVhZGVyc1trZXldID0gdmFsdWU7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZGVidWcoJ2dvdCBwcm94eSBzZXJ2ZXIgcmVzcG9uc2U6ICVvICVvJywgZmlyc3RMaW5lLCBoZWFkZXJzKTtcbiAgICAgICAgICAgIGNsZWFudXAoKTtcbiAgICAgICAgICAgIHJlc29sdmUoe1xuICAgICAgICAgICAgICAgIGNvbm5lY3Q6IHtcbiAgICAgICAgICAgICAgICAgICAgc3RhdHVzQ29kZSxcbiAgICAgICAgICAgICAgICAgICAgc3RhdHVzVGV4dCxcbiAgICAgICAgICAgICAgICAgICAgaGVhZGVycyxcbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgIGJ1ZmZlcmVkLFxuICAgICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICAgICAgc29ja2V0Lm9uKCdlcnJvcicsIG9uZXJyb3IpO1xuICAgICAgICBzb2NrZXQub24oJ2VuZCcsIG9uZW5kKTtcbiAgICAgICAgcmVhZCgpO1xuICAgIH0pO1xufVxuZXhwb3J0cy5wYXJzZVByb3h5UmVzcG9uc2UgPSBwYXJzZVByb3h5UmVzcG9uc2U7XG4vLyMgc291cmNlTWFwcGluZ1VSTD1wYXJzZS1wcm94eS1yZXNwb25zZS5qcy5tYXAiLAogICAgIlwidXNlIHN0cmljdFwiO1xudmFyIF9fY3JlYXRlQmluZGluZyA9ICh0aGlzICYmIHRoaXMuX19jcmVhdGVCaW5kaW5nKSB8fCAoT2JqZWN0LmNyZWF0ZSA/IChmdW5jdGlvbihvLCBtLCBrLCBrMikge1xuICAgIGlmIChrMiA9PT0gdW5kZWZpbmVkKSBrMiA9IGs7XG4gICAgdmFyIGRlc2MgPSBPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKG0sIGspO1xuICAgIGlmICghZGVzYyB8fCAoXCJnZXRcIiBpbiBkZXNjID8gIW0uX19lc01vZHVsZSA6IGRlc2Mud3JpdGFibGUgfHwgZGVzYy5jb25maWd1cmFibGUpKSB7XG4gICAgICBkZXNjID0geyBlbnVtZXJhYmxlOiB0cnVlLCBnZXQ6IGZ1bmN0aW9uKCkgeyByZXR1cm4gbVtrXTsgfSB9O1xuICAgIH1cbiAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkobywgazIsIGRlc2MpO1xufSkgOiAoZnVuY3Rpb24obywgbSwgaywgazIpIHtcbiAgICBpZiAoazIgPT09IHVuZGVmaW5lZCkgazIgPSBrO1xuICAgIG9bazJdID0gbVtrXTtcbn0pKTtcbnZhciBfX3NldE1vZHVsZURlZmF1bHQgPSAodGhpcyAmJiB0aGlzLl9fc2V0TW9kdWxlRGVmYXVsdCkgfHwgKE9iamVjdC5jcmVhdGUgPyAoZnVuY3Rpb24obywgdikge1xuICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShvLCBcImRlZmF1bHRcIiwgeyBlbnVtZXJhYmxlOiB0cnVlLCB2YWx1ZTogdiB9KTtcbn0pIDogZnVuY3Rpb24obywgdikge1xuICAgIG9bXCJkZWZhdWx0XCJdID0gdjtcbn0pO1xudmFyIF9faW1wb3J0U3RhciA9ICh0aGlzICYmIHRoaXMuX19pbXBvcnRTdGFyKSB8fCBmdW5jdGlvbiAobW9kKSB7XG4gICAgaWYgKG1vZCAmJiBtb2QuX19lc01vZHVsZSkgcmV0dXJuIG1vZDtcbiAgICB2YXIgcmVzdWx0ID0ge307XG4gICAgaWYgKG1vZCAhPSBudWxsKSBmb3IgKHZhciBrIGluIG1vZCkgaWYgKGsgIT09IFwiZGVmYXVsdFwiICYmIE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChtb2QsIGspKSBfX2NyZWF0ZUJpbmRpbmcocmVzdWx0LCBtb2QsIGspO1xuICAgIF9fc2V0TW9kdWxlRGVmYXVsdChyZXN1bHQsIG1vZCk7XG4gICAgcmV0dXJuIHJlc3VsdDtcbn07XG52YXIgX19pbXBvcnREZWZhdWx0ID0gKHRoaXMgJiYgdGhpcy5fX2ltcG9ydERlZmF1bHQpIHx8IGZ1bmN0aW9uIChtb2QpIHtcbiAgICByZXR1cm4gKG1vZCAmJiBtb2QuX19lc01vZHVsZSkgPyBtb2QgOiB7IFwiZGVmYXVsdFwiOiBtb2QgfTtcbn07XG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJfX2VzTW9kdWxlXCIsIHsgdmFsdWU6IHRydWUgfSk7XG5leHBvcnRzLkh0dHBzUHJveHlBZ2VudCA9IHZvaWQgMDtcbmNvbnN0IG5ldCA9IF9faW1wb3J0U3RhcihyZXF1aXJlKFwibmV0XCIpKTtcbmNvbnN0IHRscyA9IF9faW1wb3J0U3RhcihyZXF1aXJlKFwidGxzXCIpKTtcbmNvbnN0IGFzc2VydF8xID0gX19pbXBvcnREZWZhdWx0KHJlcXVpcmUoXCJhc3NlcnRcIikpO1xuY29uc3QgZGVidWdfMSA9IF9faW1wb3J0RGVmYXVsdChyZXF1aXJlKFwiZGVidWdcIikpO1xuY29uc3QgYWdlbnRfYmFzZV8xID0gcmVxdWlyZShcImFnZW50LWJhc2VcIik7XG5jb25zdCB1cmxfMSA9IHJlcXVpcmUoXCJ1cmxcIik7XG5jb25zdCBwYXJzZV9wcm94eV9yZXNwb25zZV8xID0gcmVxdWlyZShcIi4vcGFyc2UtcHJveHktcmVzcG9uc2VcIik7XG5jb25zdCBkZWJ1ZyA9ICgwLCBkZWJ1Z18xLmRlZmF1bHQpKCdodHRwcy1wcm94eS1hZ2VudCcpO1xuLyoqXG4gKiBUaGUgYEh0dHBzUHJveHlBZ2VudGAgaW1wbGVtZW50cyBhbiBIVFRQIEFnZW50IHN1YmNsYXNzIHRoYXQgY29ubmVjdHMgdG9cbiAqIHRoZSBzcGVjaWZpZWQgXCJIVFRQKHMpIHByb3h5IHNlcnZlclwiIGluIG9yZGVyIHRvIHByb3h5IEhUVFBTIHJlcXVlc3RzLlxuICpcbiAqIE91dGdvaW5nIEhUVFAgcmVxdWVzdHMgYXJlIGZpcnN0IHR1bm5lbGVkIHRocm91Z2ggdGhlIHByb3h5IHNlcnZlciB1c2luZyB0aGVcbiAqIGBDT05ORUNUYCBIVFRQIHJlcXVlc3QgbWV0aG9kIHRvIGVzdGFibGlzaCBhIGNvbm5lY3Rpb24gdG8gdGhlIHByb3h5IHNlcnZlcixcbiAqIGFuZCB0aGVuIHRoZSBwcm94eSBzZXJ2ZXIgY29ubmVjdHMgdG8gdGhlIGRlc3RpbmF0aW9uIHRhcmdldCBhbmQgaXNzdWVzIHRoZVxuICogSFRUUCByZXF1ZXN0IGZyb20gdGhlIHByb3h5IHNlcnZlci5cbiAqXG4gKiBgaHR0cHM6YCByZXF1ZXN0cyBoYXZlIHRoZWlyIHNvY2tldCBjb25uZWN0aW9uIHVwZ3JhZGVkIHRvIFRMUyBvbmNlXG4gKiB0aGUgY29ubmVjdGlvbiB0byB0aGUgcHJveHkgc2VydmVyIGhhcyBiZWVuIGVzdGFibGlzaGVkLlxuICovXG5jbGFzcyBIdHRwc1Byb3h5QWdlbnQgZXh0ZW5kcyBhZ2VudF9iYXNlXzEuQWdlbnQge1xuICAgIGNvbnN0cnVjdG9yKHByb3h5LCBvcHRzKSB7XG4gICAgICAgIHN1cGVyKG9wdHMpO1xuICAgICAgICB0aGlzLm9wdGlvbnMgPSB7IHBhdGg6IHVuZGVmaW5lZCB9O1xuICAgICAgICB0aGlzLnByb3h5ID0gdHlwZW9mIHByb3h5ID09PSAnc3RyaW5nJyA/IG5ldyB1cmxfMS5VUkwocHJveHkpIDogcHJveHk7XG4gICAgICAgIHRoaXMucHJveHlIZWFkZXJzID0gb3B0cz8uaGVhZGVycyA/PyB7fTtcbiAgICAgICAgZGVidWcoJ0NyZWF0aW5nIG5ldyBIdHRwc1Byb3h5QWdlbnQgaW5zdGFuY2U6ICVvJywgdGhpcy5wcm94eS5ocmVmKTtcbiAgICAgICAgLy8gVHJpbSBvZmYgdGhlIGJyYWNrZXRzIGZyb20gSVB2NiBhZGRyZXNzZXNcbiAgICAgICAgY29uc3QgaG9zdCA9ICh0aGlzLnByb3h5Lmhvc3RuYW1lIHx8IHRoaXMucHJveHkuaG9zdCkucmVwbGFjZSgvXlxcW3xcXF0kL2csICcnKTtcbiAgICAgICAgY29uc3QgcG9ydCA9IHRoaXMucHJveHkucG9ydFxuICAgICAgICAgICAgPyBwYXJzZUludCh0aGlzLnByb3h5LnBvcnQsIDEwKVxuICAgICAgICAgICAgOiB0aGlzLnByb3h5LnByb3RvY29sID09PSAnaHR0cHM6J1xuICAgICAgICAgICAgICAgID8gNDQzXG4gICAgICAgICAgICAgICAgOiA4MDtcbiAgICAgICAgdGhpcy5jb25uZWN0T3B0cyA9IHtcbiAgICAgICAgICAgIC8vIEF0dGVtcHQgdG8gbmVnb3RpYXRlIGh0dHAvMS4xIGZvciBwcm94eSBzZXJ2ZXJzIHRoYXQgc3VwcG9ydCBodHRwLzJcbiAgICAgICAgICAgIEFMUE5Qcm90b2NvbHM6IFsnaHR0cC8xLjEnXSxcbiAgICAgICAgICAgIC4uLihvcHRzID8gb21pdChvcHRzLCAnaGVhZGVycycpIDogbnVsbCksXG4gICAgICAgICAgICBob3N0LFxuICAgICAgICAgICAgcG9ydCxcbiAgICAgICAgfTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogQ2FsbGVkIHdoZW4gdGhlIG5vZGUtY29yZSBIVFRQIGNsaWVudCBsaWJyYXJ5IGlzIGNyZWF0aW5nIGFcbiAgICAgKiBuZXcgSFRUUCByZXF1ZXN0LlxuICAgICAqL1xuICAgIGFzeW5jIGNvbm5lY3QocmVxLCBvcHRzKSB7XG4gICAgICAgIGNvbnN0IHsgcHJveHkgfSA9IHRoaXM7XG4gICAgICAgIGlmICghb3B0cy5ob3N0KSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCdObyBcImhvc3RcIiBwcm92aWRlZCcpO1xuICAgICAgICB9XG4gICAgICAgIC8vIENyZWF0ZSBhIHNvY2tldCBjb25uZWN0aW9uIHRvIHRoZSBwcm94eSBzZXJ2ZXIuXG4gICAgICAgIGxldCBzb2NrZXQ7XG4gICAgICAgIGlmIChwcm94eS5wcm90b2NvbCA9PT0gJ2h0dHBzOicpIHtcbiAgICAgICAgICAgIGRlYnVnKCdDcmVhdGluZyBgdGxzLlNvY2tldGA6ICVvJywgdGhpcy5jb25uZWN0T3B0cyk7XG4gICAgICAgICAgICBjb25zdCBzZXJ2ZXJuYW1lID0gdGhpcy5jb25uZWN0T3B0cy5zZXJ2ZXJuYW1lIHx8IHRoaXMuY29ubmVjdE9wdHMuaG9zdDtcbiAgICAgICAgICAgIHNvY2tldCA9IHRscy5jb25uZWN0KHtcbiAgICAgICAgICAgICAgICAuLi50aGlzLmNvbm5lY3RPcHRzLFxuICAgICAgICAgICAgICAgIHNlcnZlcm5hbWUsXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIGRlYnVnKCdDcmVhdGluZyBgbmV0LlNvY2tldGA6ICVvJywgdGhpcy5jb25uZWN0T3B0cyk7XG4gICAgICAgICAgICBzb2NrZXQgPSBuZXQuY29ubmVjdCh0aGlzLmNvbm5lY3RPcHRzKTtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBoZWFkZXJzID0gdHlwZW9mIHRoaXMucHJveHlIZWFkZXJzID09PSAnZnVuY3Rpb24nXG4gICAgICAgICAgICA/IHRoaXMucHJveHlIZWFkZXJzKClcbiAgICAgICAgICAgIDogeyAuLi50aGlzLnByb3h5SGVhZGVycyB9O1xuICAgICAgICBjb25zdCBob3N0ID0gbmV0LmlzSVB2NihvcHRzLmhvc3QpID8gYFske29wdHMuaG9zdH1dYCA6IG9wdHMuaG9zdDtcbiAgICAgICAgbGV0IHBheWxvYWQgPSBgQ09OTkVDVCAke2hvc3R9OiR7b3B0cy5wb3J0fSBIVFRQLzEuMVxcclxcbmA7XG4gICAgICAgIC8vIEluamVjdCB0aGUgYFByb3h5LUF1dGhvcml6YXRpb25gIGhlYWRlciBpZiBuZWNlc3NhcnkuXG4gICAgICAgIGlmIChwcm94eS51c2VybmFtZSB8fCBwcm94eS5wYXNzd29yZCkge1xuICAgICAgICAgICAgY29uc3QgYXV0aCA9IGAke2RlY29kZVVSSUNvbXBvbmVudChwcm94eS51c2VybmFtZSl9OiR7ZGVjb2RlVVJJQ29tcG9uZW50KHByb3h5LnBhc3N3b3JkKX1gO1xuICAgICAgICAgICAgaGVhZGVyc1snUHJveHktQXV0aG9yaXphdGlvbiddID0gYEJhc2ljICR7QnVmZmVyLmZyb20oYXV0aCkudG9TdHJpbmcoJ2Jhc2U2NCcpfWA7XG4gICAgICAgIH1cbiAgICAgICAgaGVhZGVycy5Ib3N0ID0gYCR7aG9zdH06JHtvcHRzLnBvcnR9YDtcbiAgICAgICAgaWYgKCFoZWFkZXJzWydQcm94eS1Db25uZWN0aW9uJ10pIHtcbiAgICAgICAgICAgIGhlYWRlcnNbJ1Byb3h5LUNvbm5lY3Rpb24nXSA9IHRoaXMua2VlcEFsaXZlXG4gICAgICAgICAgICAgICAgPyAnS2VlcC1BbGl2ZSdcbiAgICAgICAgICAgICAgICA6ICdjbG9zZSc7XG4gICAgICAgIH1cbiAgICAgICAgZm9yIChjb25zdCBuYW1lIG9mIE9iamVjdC5rZXlzKGhlYWRlcnMpKSB7XG4gICAgICAgICAgICBwYXlsb2FkICs9IGAke25hbWV9OiAke2hlYWRlcnNbbmFtZV19XFxyXFxuYDtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBwcm94eVJlc3BvbnNlUHJvbWlzZSA9ICgwLCBwYXJzZV9wcm94eV9yZXNwb25zZV8xLnBhcnNlUHJveHlSZXNwb25zZSkoc29ja2V0KTtcbiAgICAgICAgc29ja2V0LndyaXRlKGAke3BheWxvYWR9XFxyXFxuYCk7XG4gICAgICAgIGNvbnN0IHsgY29ubmVjdCwgYnVmZmVyZWQgfSA9IGF3YWl0IHByb3h5UmVzcG9uc2VQcm9taXNlO1xuICAgICAgICByZXEuZW1pdCgncHJveHlDb25uZWN0JywgY29ubmVjdCk7XG4gICAgICAgIHRoaXMuZW1pdCgncHJveHlDb25uZWN0JywgY29ubmVjdCwgcmVxKTtcbiAgICAgICAgaWYgKGNvbm5lY3Quc3RhdHVzQ29kZSA9PT0gMjAwKSB7XG4gICAgICAgICAgICByZXEub25jZSgnc29ja2V0JywgcmVzdW1lKTtcbiAgICAgICAgICAgIGlmIChvcHRzLnNlY3VyZUVuZHBvaW50KSB7XG4gICAgICAgICAgICAgICAgLy8gVGhlIHByb3h5IGlzIGNvbm5lY3RpbmcgdG8gYSBUTFMgc2VydmVyLCBzbyB1cGdyYWRlXG4gICAgICAgICAgICAgICAgLy8gdGhpcyBzb2NrZXQgY29ubmVjdGlvbiB0byBhIFRMUyBjb25uZWN0aW9uLlxuICAgICAgICAgICAgICAgIGRlYnVnKCdVcGdyYWRpbmcgc29ja2V0IGNvbm5lY3Rpb24gdG8gVExTJyk7XG4gICAgICAgICAgICAgICAgY29uc3Qgc2VydmVybmFtZSA9IG9wdHMuc2VydmVybmFtZSB8fCBvcHRzLmhvc3Q7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHRscy5jb25uZWN0KHtcbiAgICAgICAgICAgICAgICAgICAgLi4ub21pdChvcHRzLCAnaG9zdCcsICdwYXRoJywgJ3BvcnQnKSxcbiAgICAgICAgICAgICAgICAgICAgc29ja2V0LFxuICAgICAgICAgICAgICAgICAgICBzZXJ2ZXJuYW1lLFxuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIHNvY2tldDtcbiAgICAgICAgfVxuICAgICAgICAvLyBTb21lIG90aGVyIHN0YXR1cyBjb2RlIHRoYXQncyBub3QgMjAwLi4uIG5lZWQgdG8gcmUtcGxheSB0aGUgSFRUUFxuICAgICAgICAvLyBoZWFkZXIgXCJkYXRhXCIgZXZlbnRzIG9udG8gdGhlIHNvY2tldCBvbmNlIHRoZSBIVFRQIG1hY2hpbmVyeSBpc1xuICAgICAgICAvLyBhdHRhY2hlZCBzbyB0aGF0IHRoZSBub2RlIGNvcmUgYGh0dHBgIGNhbiBwYXJzZSBhbmQgaGFuZGxlIHRoZVxuICAgICAgICAvLyBlcnJvciBzdGF0dXMgY29kZS5cbiAgICAgICAgLy8gQ2xvc2UgdGhlIG9yaWdpbmFsIHNvY2tldCwgYW5kIGEgbmV3IFwiZmFrZVwiIHNvY2tldCBpcyByZXR1cm5lZFxuICAgICAgICAvLyBpbnN0ZWFkLCBzbyB0aGF0IHRoZSBwcm94eSBkb2Vzbid0IGdldCB0aGUgSFRUUCByZXF1ZXN0XG4gICAgICAgIC8vIHdyaXR0ZW4gdG8gaXQgKHdoaWNoIG1heSBjb250YWluIGBBdXRob3JpemF0aW9uYCBoZWFkZXJzIG9yIG90aGVyXG4gICAgICAgIC8vIHNlbnNpdGl2ZSBkYXRhKS5cbiAgICAgICAgLy9cbiAgICAgICAgLy8gU2VlOiBodHRwczovL2hhY2tlcm9uZS5jb20vcmVwb3J0cy81NDE1MDJcbiAgICAgICAgc29ja2V0LmRlc3Ryb3koKTtcbiAgICAgICAgY29uc3QgZmFrZVNvY2tldCA9IG5ldyBuZXQuU29ja2V0KHsgd3JpdGFibGU6IGZhbHNlIH0pO1xuICAgICAgICBmYWtlU29ja2V0LnJlYWRhYmxlID0gdHJ1ZTtcbiAgICAgICAgLy8gTmVlZCB0byB3YWl0IGZvciB0aGUgXCJzb2NrZXRcIiBldmVudCB0byByZS1wbGF5IHRoZSBcImRhdGFcIiBldmVudHMuXG4gICAgICAgIHJlcS5vbmNlKCdzb2NrZXQnLCAocykgPT4ge1xuICAgICAgICAgICAgZGVidWcoJ1JlcGxheWluZyBwcm94eSBidWZmZXIgZm9yIGZhaWxlZCByZXF1ZXN0Jyk7XG4gICAgICAgICAgICAoMCwgYXNzZXJ0XzEuZGVmYXVsdCkocy5saXN0ZW5lckNvdW50KCdkYXRhJykgPiAwKTtcbiAgICAgICAgICAgIC8vIFJlcGxheSB0aGUgXCJidWZmZXJlZFwiIEJ1ZmZlciBvbnRvIHRoZSBmYWtlIGBzb2NrZXRgLCBzaW5jZSBhdFxuICAgICAgICAgICAgLy8gdGhpcyBwb2ludCB0aGUgSFRUUCBtb2R1bGUgbWFjaGluZXJ5IGhhcyBiZWVuIGhvb2tlZCB1cCBmb3JcbiAgICAgICAgICAgIC8vIHRoZSB1c2VyLlxuICAgICAgICAgICAgcy5wdXNoKGJ1ZmZlcmVkKTtcbiAgICAgICAgICAgIHMucHVzaChudWxsKTtcbiAgICAgICAgfSk7XG4gICAgICAgIHJldHVybiBmYWtlU29ja2V0O1xuICAgIH1cbn1cbkh0dHBzUHJveHlBZ2VudC5wcm90b2NvbHMgPSBbJ2h0dHAnLCAnaHR0cHMnXTtcbmV4cG9ydHMuSHR0cHNQcm94eUFnZW50ID0gSHR0cHNQcm94eUFnZW50O1xuZnVuY3Rpb24gcmVzdW1lKHNvY2tldCkge1xuICAgIHNvY2tldC5yZXN1bWUoKTtcbn1cbmZ1bmN0aW9uIG9taXQob2JqLCAuLi5rZXlzKSB7XG4gICAgY29uc3QgcmV0ID0ge307XG4gICAgbGV0IGtleTtcbiAgICBmb3IgKGtleSBpbiBvYmopIHtcbiAgICAgICAgaWYgKCFrZXlzLmluY2x1ZGVzKGtleSkpIHtcbiAgICAgICAgICAgIHJldFtrZXldID0gb2JqW2tleV07XG4gICAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIHJldDtcbn1cbi8vIyBzb3VyY2VNYXBwaW5nVVJMPWluZGV4LmpzLm1hcCIsCiAgICAiXCJ1c2Ugc3RyaWN0XCI7XG52YXIgX19jcmVhdGVCaW5kaW5nID0gKHRoaXMgJiYgdGhpcy5fX2NyZWF0ZUJpbmRpbmcpIHx8IChPYmplY3QuY3JlYXRlID8gKGZ1bmN0aW9uKG8sIG0sIGssIGsyKSB7XG4gICAgaWYgKGsyID09PSB1bmRlZmluZWQpIGsyID0gaztcbiAgICB2YXIgZGVzYyA9IE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IobSwgayk7XG4gICAgaWYgKCFkZXNjIHx8IChcImdldFwiIGluIGRlc2MgPyAhbS5fX2VzTW9kdWxlIDogZGVzYy53cml0YWJsZSB8fCBkZXNjLmNvbmZpZ3VyYWJsZSkpIHtcbiAgICAgIGRlc2MgPSB7IGVudW1lcmFibGU6IHRydWUsIGdldDogZnVuY3Rpb24oKSB7IHJldHVybiBtW2tdOyB9IH07XG4gICAgfVxuICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShvLCBrMiwgZGVzYyk7XG59KSA6IChmdW5jdGlvbihvLCBtLCBrLCBrMikge1xuICAgIGlmIChrMiA9PT0gdW5kZWZpbmVkKSBrMiA9IGs7XG4gICAgb1trMl0gPSBtW2tdO1xufSkpO1xudmFyIF9fc2V0TW9kdWxlRGVmYXVsdCA9ICh0aGlzICYmIHRoaXMuX19zZXRNb2R1bGVEZWZhdWx0KSB8fCAoT2JqZWN0LmNyZWF0ZSA/IChmdW5jdGlvbihvLCB2KSB7XG4gICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KG8sIFwiZGVmYXVsdFwiLCB7IGVudW1lcmFibGU6IHRydWUsIHZhbHVlOiB2IH0pO1xufSkgOiBmdW5jdGlvbihvLCB2KSB7XG4gICAgb1tcImRlZmF1bHRcIl0gPSB2O1xufSk7XG52YXIgX19pbXBvcnRTdGFyID0gKHRoaXMgJiYgdGhpcy5fX2ltcG9ydFN0YXIpIHx8IGZ1bmN0aW9uIChtb2QpIHtcbiAgICBpZiAobW9kICYmIG1vZC5fX2VzTW9kdWxlKSByZXR1cm4gbW9kO1xuICAgIHZhciByZXN1bHQgPSB7fTtcbiAgICBpZiAobW9kICE9IG51bGwpIGZvciAodmFyIGsgaW4gbW9kKSBpZiAoayAhPT0gXCJkZWZhdWx0XCIgJiYgT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKG1vZCwgaykpIF9fY3JlYXRlQmluZGluZyhyZXN1bHQsIG1vZCwgayk7XG4gICAgX19zZXRNb2R1bGVEZWZhdWx0KHJlc3VsdCwgbW9kKTtcbiAgICByZXR1cm4gcmVzdWx0O1xufTtcbnZhciBfX2ltcG9ydERlZmF1bHQgPSAodGhpcyAmJiB0aGlzLl9faW1wb3J0RGVmYXVsdCkgfHwgZnVuY3Rpb24gKG1vZCkge1xuICAgIHJldHVybiAobW9kICYmIG1vZC5fX2VzTW9kdWxlKSA/IG1vZCA6IHsgXCJkZWZhdWx0XCI6IG1vZCB9O1xufTtcbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIl9fZXNNb2R1bGVcIiwgeyB2YWx1ZTogdHJ1ZSB9KTtcbmV4cG9ydHMuSHR0cFByb3h5QWdlbnQgPSB2b2lkIDA7XG5jb25zdCBuZXQgPSBfX2ltcG9ydFN0YXIocmVxdWlyZShcIm5ldFwiKSk7XG5jb25zdCB0bHMgPSBfX2ltcG9ydFN0YXIocmVxdWlyZShcInRsc1wiKSk7XG5jb25zdCBkZWJ1Z18xID0gX19pbXBvcnREZWZhdWx0KHJlcXVpcmUoXCJkZWJ1Z1wiKSk7XG5jb25zdCBldmVudHNfMSA9IHJlcXVpcmUoXCJldmVudHNcIik7XG5jb25zdCBhZ2VudF9iYXNlXzEgPSByZXF1aXJlKFwiYWdlbnQtYmFzZVwiKTtcbmNvbnN0IHVybF8xID0gcmVxdWlyZShcInVybFwiKTtcbmNvbnN0IGRlYnVnID0gKDAsIGRlYnVnXzEuZGVmYXVsdCkoJ2h0dHAtcHJveHktYWdlbnQnKTtcbi8qKlxuICogVGhlIGBIdHRwUHJveHlBZ2VudGAgaW1wbGVtZW50cyBhbiBIVFRQIEFnZW50IHN1YmNsYXNzIHRoYXQgY29ubmVjdHNcbiAqIHRvIHRoZSBzcGVjaWZpZWQgXCJIVFRQIHByb3h5IHNlcnZlclwiIGluIG9yZGVyIHRvIHByb3h5IEhUVFAgcmVxdWVzdHMuXG4gKi9cbmNsYXNzIEh0dHBQcm94eUFnZW50IGV4dGVuZHMgYWdlbnRfYmFzZV8xLkFnZW50IHtcbiAgICBjb25zdHJ1Y3Rvcihwcm94eSwgb3B0cykge1xuICAgICAgICBzdXBlcihvcHRzKTtcbiAgICAgICAgdGhpcy5wcm94eSA9IHR5cGVvZiBwcm94eSA9PT0gJ3N0cmluZycgPyBuZXcgdXJsXzEuVVJMKHByb3h5KSA6IHByb3h5O1xuICAgICAgICB0aGlzLnByb3h5SGVhZGVycyA9IG9wdHM/LmhlYWRlcnMgPz8ge307XG4gICAgICAgIGRlYnVnKCdDcmVhdGluZyBuZXcgSHR0cFByb3h5QWdlbnQgaW5zdGFuY2U6ICVvJywgdGhpcy5wcm94eS5ocmVmKTtcbiAgICAgICAgLy8gVHJpbSBvZmYgdGhlIGJyYWNrZXRzIGZyb20gSVB2NiBhZGRyZXNzZXNcbiAgICAgICAgY29uc3QgaG9zdCA9ICh0aGlzLnByb3h5Lmhvc3RuYW1lIHx8IHRoaXMucHJveHkuaG9zdCkucmVwbGFjZSgvXlxcW3xcXF0kL2csICcnKTtcbiAgICAgICAgY29uc3QgcG9ydCA9IHRoaXMucHJveHkucG9ydFxuICAgICAgICAgICAgPyBwYXJzZUludCh0aGlzLnByb3h5LnBvcnQsIDEwKVxuICAgICAgICAgICAgOiB0aGlzLnByb3h5LnByb3RvY29sID09PSAnaHR0cHM6J1xuICAgICAgICAgICAgICAgID8gNDQzXG4gICAgICAgICAgICAgICAgOiA4MDtcbiAgICAgICAgdGhpcy5jb25uZWN0T3B0cyA9IHtcbiAgICAgICAgICAgIC4uLihvcHRzID8gb21pdChvcHRzLCAnaGVhZGVycycpIDogbnVsbCksXG4gICAgICAgICAgICBob3N0LFxuICAgICAgICAgICAgcG9ydCxcbiAgICAgICAgfTtcbiAgICB9XG4gICAgYWRkUmVxdWVzdChyZXEsIG9wdHMpIHtcbiAgICAgICAgcmVxLl9oZWFkZXIgPSBudWxsO1xuICAgICAgICB0aGlzLnNldFJlcXVlc3RQcm9wcyhyZXEsIG9wdHMpO1xuICAgICAgICAvLyBAdHMtZXhwZWN0LWVycm9yIGBhZGRSZXF1ZXN0KClgIGlzbid0IGRlZmluZWQgaW4gYEB0eXBlcy9ub2RlYFxuICAgICAgICBzdXBlci5hZGRSZXF1ZXN0KHJlcSwgb3B0cyk7XG4gICAgfVxuICAgIHNldFJlcXVlc3RQcm9wcyhyZXEsIG9wdHMpIHtcbiAgICAgICAgY29uc3QgeyBwcm94eSB9ID0gdGhpcztcbiAgICAgICAgY29uc3QgcHJvdG9jb2wgPSBvcHRzLnNlY3VyZUVuZHBvaW50ID8gJ2h0dHBzOicgOiAnaHR0cDonO1xuICAgICAgICBjb25zdCBob3N0bmFtZSA9IHJlcS5nZXRIZWFkZXIoJ2hvc3QnKSB8fCAnbG9jYWxob3N0JztcbiAgICAgICAgY29uc3QgYmFzZSA9IGAke3Byb3RvY29sfS8vJHtob3N0bmFtZX1gO1xuICAgICAgICBjb25zdCB1cmwgPSBuZXcgdXJsXzEuVVJMKHJlcS5wYXRoLCBiYXNlKTtcbiAgICAgICAgaWYgKG9wdHMucG9ydCAhPT0gODApIHtcbiAgICAgICAgICAgIHVybC5wb3J0ID0gU3RyaW5nKG9wdHMucG9ydCk7XG4gICAgICAgIH1cbiAgICAgICAgLy8gQ2hhbmdlIHRoZSBgaHR0cC5DbGllbnRSZXF1ZXN0YCBpbnN0YW5jZSdzIFwicGF0aFwiIGZpZWxkXG4gICAgICAgIC8vIHRvIHRoZSBhYnNvbHV0ZSBwYXRoIG9mIHRoZSBVUkwgdGhhdCB3aWxsIGJlIHJlcXVlc3RlZC5cbiAgICAgICAgcmVxLnBhdGggPSBTdHJpbmcodXJsKTtcbiAgICAgICAgLy8gSW5qZWN0IHRoZSBgUHJveHktQXV0aG9yaXphdGlvbmAgaGVhZGVyIGlmIG5lY2Vzc2FyeS5cbiAgICAgICAgY29uc3QgaGVhZGVycyA9IHR5cGVvZiB0aGlzLnByb3h5SGVhZGVycyA9PT0gJ2Z1bmN0aW9uJ1xuICAgICAgICAgICAgPyB0aGlzLnByb3h5SGVhZGVycygpXG4gICAgICAgICAgICA6IHsgLi4udGhpcy5wcm94eUhlYWRlcnMgfTtcbiAgICAgICAgaWYgKHByb3h5LnVzZXJuYW1lIHx8IHByb3h5LnBhc3N3b3JkKSB7XG4gICAgICAgICAgICBjb25zdCBhdXRoID0gYCR7ZGVjb2RlVVJJQ29tcG9uZW50KHByb3h5LnVzZXJuYW1lKX06JHtkZWNvZGVVUklDb21wb25lbnQocHJveHkucGFzc3dvcmQpfWA7XG4gICAgICAgICAgICBoZWFkZXJzWydQcm94eS1BdXRob3JpemF0aW9uJ10gPSBgQmFzaWMgJHtCdWZmZXIuZnJvbShhdXRoKS50b1N0cmluZygnYmFzZTY0Jyl9YDtcbiAgICAgICAgfVxuICAgICAgICBpZiAoIWhlYWRlcnNbJ1Byb3h5LUNvbm5lY3Rpb24nXSkge1xuICAgICAgICAgICAgaGVhZGVyc1snUHJveHktQ29ubmVjdGlvbiddID0gdGhpcy5rZWVwQWxpdmVcbiAgICAgICAgICAgICAgICA/ICdLZWVwLUFsaXZlJ1xuICAgICAgICAgICAgICAgIDogJ2Nsb3NlJztcbiAgICAgICAgfVxuICAgICAgICBmb3IgKGNvbnN0IG5hbWUgb2YgT2JqZWN0LmtleXMoaGVhZGVycykpIHtcbiAgICAgICAgICAgIGNvbnN0IHZhbHVlID0gaGVhZGVyc1tuYW1lXTtcbiAgICAgICAgICAgIGlmICh2YWx1ZSkge1xuICAgICAgICAgICAgICAgIHJlcS5zZXRIZWFkZXIobmFtZSwgdmFsdWUpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxuICAgIGFzeW5jIGNvbm5lY3QocmVxLCBvcHRzKSB7XG4gICAgICAgIHJlcS5faGVhZGVyID0gbnVsbDtcbiAgICAgICAgaWYgKCFyZXEucGF0aC5pbmNsdWRlcygnOi8vJykpIHtcbiAgICAgICAgICAgIHRoaXMuc2V0UmVxdWVzdFByb3BzKHJlcSwgb3B0cyk7XG4gICAgICAgIH1cbiAgICAgICAgLy8gQXQgdGhpcyBwb2ludCwgdGhlIGh0dHAgQ2xpZW50UmVxdWVzdCdzIGludGVybmFsIGBfaGVhZGVyYCBmaWVsZFxuICAgICAgICAvLyBtaWdodCBoYXZlIGFscmVhZHkgYmVlbiBzZXQuIElmIHRoaXMgaXMgdGhlIGNhc2UgdGhlbiB3ZSdsbCBuZWVkXG4gICAgICAgIC8vIHRvIHJlLWdlbmVyYXRlIHRoZSBzdHJpbmcgc2luY2Ugd2UganVzdCBjaGFuZ2VkIHRoZSBgcmVxLnBhdGhgLlxuICAgICAgICBsZXQgZmlyc3Q7XG4gICAgICAgIGxldCBlbmRPZkhlYWRlcnM7XG4gICAgICAgIGRlYnVnKCdSZWdlbmVyYXRpbmcgc3RvcmVkIEhUVFAgaGVhZGVyIHN0cmluZyBmb3IgcmVxdWVzdCcpO1xuICAgICAgICByZXEuX2ltcGxpY2l0SGVhZGVyKCk7XG4gICAgICAgIGlmIChyZXEub3V0cHV0RGF0YSAmJiByZXEub3V0cHV0RGF0YS5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgICBkZWJ1ZygnUGF0Y2hpbmcgY29ubmVjdGlvbiB3cml0ZSgpIG91dHB1dCBidWZmZXIgd2l0aCB1cGRhdGVkIGhlYWRlcicpO1xuICAgICAgICAgICAgZmlyc3QgPSByZXEub3V0cHV0RGF0YVswXS5kYXRhO1xuICAgICAgICAgICAgZW5kT2ZIZWFkZXJzID0gZmlyc3QuaW5kZXhPZignXFxyXFxuXFxyXFxuJykgKyA0O1xuICAgICAgICAgICAgcmVxLm91dHB1dERhdGFbMF0uZGF0YSA9XG4gICAgICAgICAgICAgICAgcmVxLl9oZWFkZXIgKyBmaXJzdC5zdWJzdHJpbmcoZW5kT2ZIZWFkZXJzKTtcbiAgICAgICAgICAgIGRlYnVnKCdPdXRwdXQgYnVmZmVyOiAlbycsIHJlcS5vdXRwdXREYXRhWzBdLmRhdGEpO1xuICAgICAgICB9XG4gICAgICAgIC8vIENyZWF0ZSBhIHNvY2tldCBjb25uZWN0aW9uIHRvIHRoZSBwcm94eSBzZXJ2ZXIuXG4gICAgICAgIGxldCBzb2NrZXQ7XG4gICAgICAgIGlmICh0aGlzLnByb3h5LnByb3RvY29sID09PSAnaHR0cHM6Jykge1xuICAgICAgICAgICAgZGVidWcoJ0NyZWF0aW5nIGB0bHMuU29ja2V0YDogJW8nLCB0aGlzLmNvbm5lY3RPcHRzKTtcbiAgICAgICAgICAgIHNvY2tldCA9IHRscy5jb25uZWN0KHRoaXMuY29ubmVjdE9wdHMpO1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgZGVidWcoJ0NyZWF0aW5nIGBuZXQuU29ja2V0YDogJW8nLCB0aGlzLmNvbm5lY3RPcHRzKTtcbiAgICAgICAgICAgIHNvY2tldCA9IG5ldC5jb25uZWN0KHRoaXMuY29ubmVjdE9wdHMpO1xuICAgICAgICB9XG4gICAgICAgIC8vIFdhaXQgZm9yIHRoZSBzb2NrZXQncyBgY29ubmVjdGAgZXZlbnQsIHNvIHRoYXQgdGhpcyBgY2FsbGJhY2soKWBcbiAgICAgICAgLy8gZnVuY3Rpb24gdGhyb3dzIGluc3RlYWQgb2YgdGhlIGBodHRwYCByZXF1ZXN0IG1hY2hpbmVyeS4gVGhpcyBpc1xuICAgICAgICAvLyBpbXBvcnRhbnQgZm9yIGkuZS4gYFBhY1Byb3h5QWdlbnRgIHdoaWNoIGRldGVybWluZXMgYSBmYWlsZWQgcHJveHlcbiAgICAgICAgLy8gY29ubmVjdGlvbiB2aWEgdGhlIGBjYWxsYmFjaygpYCBmdW5jdGlvbiB0aHJvd2luZy5cbiAgICAgICAgYXdhaXQgKDAsIGV2ZW50c18xLm9uY2UpKHNvY2tldCwgJ2Nvbm5lY3QnKTtcbiAgICAgICAgcmV0dXJuIHNvY2tldDtcbiAgICB9XG59XG5IdHRwUHJveHlBZ2VudC5wcm90b2NvbHMgPSBbJ2h0dHAnLCAnaHR0cHMnXTtcbmV4cG9ydHMuSHR0cFByb3h5QWdlbnQgPSBIdHRwUHJveHlBZ2VudDtcbmZ1bmN0aW9uIG9taXQob2JqLCAuLi5rZXlzKSB7XG4gICAgY29uc3QgcmV0ID0ge307XG4gICAgbGV0IGtleTtcbiAgICBmb3IgKGtleSBpbiBvYmopIHtcbiAgICAgICAgaWYgKCFrZXlzLmluY2x1ZGVzKGtleSkpIHtcbiAgICAgICAgICAgIHJldFtrZXldID0gb2JqW2tleV07XG4gICAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIHJldDtcbn1cbi8vIyBzb3VyY2VNYXBwaW5nVVJMPWluZGV4LmpzLm1hcCIsCiAgICAiXCJ1c2Ugc3RyaWN0XCI7XG4vLyBDb3B5cmlnaHQgKGMpIE1pY3Jvc29mdCBDb3Jwb3JhdGlvbi5cbi8vIExpY2Vuc2VkIHVuZGVyIHRoZSBNSVQgTGljZW5zZS5cbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIl9fZXNNb2R1bGVcIiwgeyB2YWx1ZTogdHJ1ZSB9KTtcbmV4cG9ydHMuZ2xvYmFsTm9Qcm94eUxpc3QgPSBleHBvcnRzLnByb3h5UG9saWN5TmFtZSA9IHZvaWQgMDtcbmV4cG9ydHMubG9hZE5vUHJveHkgPSBsb2FkTm9Qcm94eTtcbmV4cG9ydHMuZ2V0RGVmYXVsdFByb3h5U2V0dGluZ3MgPSBnZXREZWZhdWx0UHJveHlTZXR0aW5ncztcbmV4cG9ydHMucHJveHlQb2xpY3kgPSBwcm94eVBvbGljeTtcbmNvbnN0IGh0dHBzX3Byb3h5X2FnZW50XzEgPSByZXF1aXJlKFwiaHR0cHMtcHJveHktYWdlbnRcIik7XG5jb25zdCBodHRwX3Byb3h5X2FnZW50XzEgPSByZXF1aXJlKFwiaHR0cC1wcm94eS1hZ2VudFwiKTtcbmNvbnN0IGxvZ19qc18xID0gcmVxdWlyZShcIi4uL2xvZy5qc1wiKTtcbmNvbnN0IEhUVFBTX1BST1hZID0gXCJIVFRQU19QUk9YWVwiO1xuY29uc3QgSFRUUF9QUk9YWSA9IFwiSFRUUF9QUk9YWVwiO1xuY29uc3QgQUxMX1BST1hZID0gXCJBTExfUFJPWFlcIjtcbmNvbnN0IE5PX1BST1hZID0gXCJOT19QUk9YWVwiO1xuLyoqXG4gKiBUaGUgcHJvZ3JhbW1hdGljIGlkZW50aWZpZXIgb2YgdGhlIHByb3h5UG9saWN5LlxuICovXG5leHBvcnRzLnByb3h5UG9saWN5TmFtZSA9IFwicHJveHlQb2xpY3lcIjtcbi8qKlxuICogU3RvcmVzIHRoZSBwYXR0ZXJucyBzcGVjaWZpZWQgaW4gTk9fUFJPWFkgZW52aXJvbm1lbnQgdmFyaWFibGUuXG4gKiBAaW50ZXJuYWxcbiAqL1xuZXhwb3J0cy5nbG9iYWxOb1Byb3h5TGlzdCA9IFtdO1xubGV0IG5vUHJveHlMaXN0TG9hZGVkID0gZmFsc2U7XG4vKiogQSBjYWNoZSBvZiB3aGV0aGVyIGEgaG9zdCBzaG91bGQgYnlwYXNzIHRoZSBwcm94eS4gKi9cbmNvbnN0IGdsb2JhbEJ5cGFzc2VkTWFwID0gbmV3IE1hcCgpO1xuZnVuY3Rpb24gZ2V0RW52aXJvbm1lbnRWYWx1ZShuYW1lKSB7XG4gICAgaWYgKHByb2Nlc3MuZW52W25hbWVdKSB7XG4gICAgICAgIHJldHVybiBwcm9jZXNzLmVudltuYW1lXTtcbiAgICB9XG4gICAgZWxzZSBpZiAocHJvY2Vzcy5lbnZbbmFtZS50b0xvd2VyQ2FzZSgpXSkge1xuICAgICAgICByZXR1cm4gcHJvY2Vzcy5lbnZbbmFtZS50b0xvd2VyQ2FzZSgpXTtcbiAgICB9XG4gICAgcmV0dXJuIHVuZGVmaW5lZDtcbn1cbmZ1bmN0aW9uIGxvYWRFbnZpcm9ubWVudFByb3h5VmFsdWUoKSB7XG4gICAgaWYgKCFwcm9jZXNzKSB7XG4gICAgICAgIHJldHVybiB1bmRlZmluZWQ7XG4gICAgfVxuICAgIGNvbnN0IGh0dHBzUHJveHkgPSBnZXRFbnZpcm9ubWVudFZhbHVlKEhUVFBTX1BST1hZKTtcbiAgICBjb25zdCBhbGxQcm94eSA9IGdldEVudmlyb25tZW50VmFsdWUoQUxMX1BST1hZKTtcbiAgICBjb25zdCBodHRwUHJveHkgPSBnZXRFbnZpcm9ubWVudFZhbHVlKEhUVFBfUFJPWFkpO1xuICAgIHJldHVybiBodHRwc1Byb3h5IHx8IGFsbFByb3h5IHx8IGh0dHBQcm94eTtcbn1cbi8qKlxuICogQ2hlY2sgd2hldGhlciB0aGUgaG9zdCBvZiBhIGdpdmVuIGB1cmlgIG1hdGNoZXMgYW55IHBhdHRlcm4gaW4gdGhlIG5vIHByb3h5IGxpc3QuXG4gKiBJZiB0aGVyZSdzIGEgbWF0Y2gsIGFueSByZXF1ZXN0IHNlbnQgdG8gdGhlIHNhbWUgaG9zdCBzaG91bGRuJ3QgaGF2ZSB0aGUgcHJveHkgc2V0dGluZ3Mgc2V0LlxuICogVGhpcyBpbXBsZW1lbnRhdGlvbiBpcyBhIHBvcnQgb2YgaHR0cHM6Ly9naXRodWIuY29tL0F6dXJlL2F6dXJlLXNkay1mb3ItbmV0L2Jsb2IvOGNjYTgxMTM3MTE1OWU1MjcxNTljN2ViNjU2MDI0Nzc4OTg2ODNlMi9zZGsvY29yZS9BenVyZS5Db3JlL3NyYy9QaXBlbGluZS9JbnRlcm5hbC9IdHRwRW52aXJvbm1lbnRQcm94eS5jcyNMMjEwXG4gKi9cbmZ1bmN0aW9uIGlzQnlwYXNzZWQodXJpLCBub1Byb3h5TGlzdCwgYnlwYXNzZWRNYXApIHtcbiAgICBpZiAobm9Qcm94eUxpc3QubGVuZ3RoID09PSAwKSB7XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gICAgY29uc3QgaG9zdCA9IG5ldyBVUkwodXJpKS5ob3N0bmFtZTtcbiAgICBpZiAoYnlwYXNzZWRNYXAgPT09IG51bGwgfHwgYnlwYXNzZWRNYXAgPT09IHZvaWQgMCA/IHZvaWQgMCA6IGJ5cGFzc2VkTWFwLmhhcyhob3N0KSkge1xuICAgICAgICByZXR1cm4gYnlwYXNzZWRNYXAuZ2V0KGhvc3QpO1xuICAgIH1cbiAgICBsZXQgaXNCeXBhc3NlZEZsYWcgPSBmYWxzZTtcbiAgICBmb3IgKGNvbnN0IHBhdHRlcm4gb2Ygbm9Qcm94eUxpc3QpIHtcbiAgICAgICAgaWYgKHBhdHRlcm5bMF0gPT09IFwiLlwiKSB7XG4gICAgICAgICAgICAvLyBUaGlzIHNob3VsZCBtYXRjaCBlaXRoZXIgZG9tYWluIGl0IHNlbGYgb3IgYW55IHN1YmRvbWFpbiBvciBob3N0XG4gICAgICAgICAgICAvLyAuZm9vLmNvbSB3aWxsIG1hdGNoIGZvby5jb20gaXQgc2VsZiBvciAqLmZvby5jb21cbiAgICAgICAgICAgIGlmIChob3N0LmVuZHNXaXRoKHBhdHRlcm4pKSB7XG4gICAgICAgICAgICAgICAgaXNCeXBhc3NlZEZsYWcgPSB0cnVlO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgaWYgKGhvc3QubGVuZ3RoID09PSBwYXR0ZXJuLmxlbmd0aCAtIDEgJiYgaG9zdCA9PT0gcGF0dGVybi5zbGljZSgxKSkge1xuICAgICAgICAgICAgICAgICAgICBpc0J5cGFzc2VkRmxhZyA9IHRydWU7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgaWYgKGhvc3QgPT09IHBhdHRlcm4pIHtcbiAgICAgICAgICAgICAgICBpc0J5cGFzc2VkRmxhZyA9IHRydWU7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG4gICAgYnlwYXNzZWRNYXAgPT09IG51bGwgfHwgYnlwYXNzZWRNYXAgPT09IHZvaWQgMCA/IHZvaWQgMCA6IGJ5cGFzc2VkTWFwLnNldChob3N0LCBpc0J5cGFzc2VkRmxhZyk7XG4gICAgcmV0dXJuIGlzQnlwYXNzZWRGbGFnO1xufVxuZnVuY3Rpb24gbG9hZE5vUHJveHkoKSB7XG4gICAgY29uc3Qgbm9Qcm94eSA9IGdldEVudmlyb25tZW50VmFsdWUoTk9fUFJPWFkpO1xuICAgIG5vUHJveHlMaXN0TG9hZGVkID0gdHJ1ZTtcbiAgICBpZiAobm9Qcm94eSkge1xuICAgICAgICByZXR1cm4gbm9Qcm94eVxuICAgICAgICAgICAgLnNwbGl0KFwiLFwiKVxuICAgICAgICAgICAgLm1hcCgoaXRlbSkgPT4gaXRlbS50cmltKCkpXG4gICAgICAgICAgICAuZmlsdGVyKChpdGVtKSA9PiBpdGVtLmxlbmd0aCk7XG4gICAgfVxuICAgIHJldHVybiBbXTtcbn1cbi8qKlxuICogVGhpcyBtZXRob2QgY29udmVydHMgYSBwcm94eSB1cmwgaW50byBgUHJveHlTZXR0aW5nc2AgZm9yIHVzZSB3aXRoIFByb3h5UG9saWN5LlxuICogSWYgbm8gYXJndW1lbnQgaXMgZ2l2ZW4sIGl0IGF0dGVtcHRzIHRvIHBhcnNlIGEgcHJveHkgVVJMIGZyb20gdGhlIGVudmlyb25tZW50XG4gKiB2YXJpYWJsZXMgYEhUVFBTX1BST1hZYCBvciBgSFRUUF9QUk9YWWAuXG4gKiBAcGFyYW0gcHJveHlVcmwgLSBUaGUgdXJsIG9mIHRoZSBwcm94eSB0byB1c2UuIE1heSBjb250YWluIGF1dGhlbnRpY2F0aW9uIGluZm9ybWF0aW9uLlxuICogQGRlcHJlY2F0ZWQgLSBJbnRlcm5hbGx5IHRoaXMgbWV0aG9kIGlzIG5vIGxvbmdlciBuZWNlc3Nhcnkgd2hlbiBzZXR0aW5nIHByb3h5IGluZm9ybWF0aW9uLlxuICovXG5mdW5jdGlvbiBnZXREZWZhdWx0UHJveHlTZXR0aW5ncyhwcm94eVVybCkge1xuICAgIGlmICghcHJveHlVcmwpIHtcbiAgICAgICAgcHJveHlVcmwgPSBsb2FkRW52aXJvbm1lbnRQcm94eVZhbHVlKCk7XG4gICAgICAgIGlmICghcHJveHlVcmwpIHtcbiAgICAgICAgICAgIHJldHVybiB1bmRlZmluZWQ7XG4gICAgICAgIH1cbiAgICB9XG4gICAgY29uc3QgcGFyc2VkVXJsID0gbmV3IFVSTChwcm94eVVybCk7XG4gICAgY29uc3Qgc2NoZW1hID0gcGFyc2VkVXJsLnByb3RvY29sID8gcGFyc2VkVXJsLnByb3RvY29sICsgXCIvL1wiIDogXCJcIjtcbiAgICByZXR1cm4ge1xuICAgICAgICBob3N0OiBzY2hlbWEgKyBwYXJzZWRVcmwuaG9zdG5hbWUsXG4gICAgICAgIHBvcnQ6IE51bWJlci5wYXJzZUludChwYXJzZWRVcmwucG9ydCB8fCBcIjgwXCIpLFxuICAgICAgICB1c2VybmFtZTogcGFyc2VkVXJsLnVzZXJuYW1lLFxuICAgICAgICBwYXNzd29yZDogcGFyc2VkVXJsLnBhc3N3b3JkLFxuICAgIH07XG59XG4vKipcbiAqIFRoaXMgbWV0aG9kIGF0dGVtcHRzIHRvIHBhcnNlIGEgcHJveHkgVVJMIGZyb20gdGhlIGVudmlyb25tZW50XG4gKiB2YXJpYWJsZXMgYEhUVFBTX1BST1hZYCBvciBgSFRUUF9QUk9YWWAuXG4gKi9cbmZ1bmN0aW9uIGdldERlZmF1bHRQcm94eVNldHRpbmdzSW50ZXJuYWwoKSB7XG4gICAgY29uc3QgZW52UHJveHkgPSBsb2FkRW52aXJvbm1lbnRQcm94eVZhbHVlKCk7XG4gICAgcmV0dXJuIGVudlByb3h5ID8gbmV3IFVSTChlbnZQcm94eSkgOiB1bmRlZmluZWQ7XG59XG5mdW5jdGlvbiBnZXRVcmxGcm9tUHJveHlTZXR0aW5ncyhzZXR0aW5ncykge1xuICAgIGxldCBwYXJzZWRQcm94eVVybDtcbiAgICB0cnkge1xuICAgICAgICBwYXJzZWRQcm94eVVybCA9IG5ldyBVUkwoc2V0dGluZ3MuaG9zdCk7XG4gICAgfVxuICAgIGNhdGNoIChfYSkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYEV4cGVjdGluZyBhIHZhbGlkIGhvc3Qgc3RyaW5nIGluIHByb3h5IHNldHRpbmdzLCBidXQgZm91bmQgXCIke3NldHRpbmdzLmhvc3R9XCIuYCk7XG4gICAgfVxuICAgIHBhcnNlZFByb3h5VXJsLnBvcnQgPSBTdHJpbmcoc2V0dGluZ3MucG9ydCk7XG4gICAgaWYgKHNldHRpbmdzLnVzZXJuYW1lKSB7XG4gICAgICAgIHBhcnNlZFByb3h5VXJsLnVzZXJuYW1lID0gc2V0dGluZ3MudXNlcm5hbWU7XG4gICAgfVxuICAgIGlmIChzZXR0aW5ncy5wYXNzd29yZCkge1xuICAgICAgICBwYXJzZWRQcm94eVVybC5wYXNzd29yZCA9IHNldHRpbmdzLnBhc3N3b3JkO1xuICAgIH1cbiAgICByZXR1cm4gcGFyc2VkUHJveHlVcmw7XG59XG5mdW5jdGlvbiBzZXRQcm94eUFnZW50T25SZXF1ZXN0KHJlcXVlc3QsIGNhY2hlZEFnZW50cywgcHJveHlVcmwpIHtcbiAgICAvLyBDdXN0b20gQWdlbnQgc2hvdWxkIHRha2UgcHJlY2VkZW5jZSBzbyBpZiBvbmUgaXMgcHJlc2VudFxuICAgIC8vIHdlIHNob3VsZCBza2lwIHRvIGF2b2lkIG92ZXJ3cml0aW5nIGl0LlxuICAgIGlmIChyZXF1ZXN0LmFnZW50KSB7XG4gICAgICAgIHJldHVybjtcbiAgICB9XG4gICAgY29uc3QgdXJsID0gbmV3IFVSTChyZXF1ZXN0LnVybCk7XG4gICAgY29uc3QgaXNJbnNlY3VyZSA9IHVybC5wcm90b2NvbCAhPT0gXCJodHRwczpcIjtcbiAgICBpZiAocmVxdWVzdC50bHNTZXR0aW5ncykge1xuICAgICAgICBsb2dfanNfMS5sb2dnZXIud2FybmluZyhcIlRMUyBzZXR0aW5ncyBhcmUgbm90IHN1cHBvcnRlZCBpbiBjb21iaW5hdGlvbiB3aXRoIGN1c3RvbSBQcm94eSwgY2VydGlmaWNhdGVzIHByb3ZpZGVkIHRvIHRoZSBjbGllbnQgd2lsbCBiZSBpZ25vcmVkLlwiKTtcbiAgICB9XG4gICAgY29uc3QgaGVhZGVycyA9IHJlcXVlc3QuaGVhZGVycy50b0pTT04oKTtcbiAgICBpZiAoaXNJbnNlY3VyZSkge1xuICAgICAgICBpZiAoIWNhY2hlZEFnZW50cy5odHRwUHJveHlBZ2VudCkge1xuICAgICAgICAgICAgY2FjaGVkQWdlbnRzLmh0dHBQcm94eUFnZW50ID0gbmV3IGh0dHBfcHJveHlfYWdlbnRfMS5IdHRwUHJveHlBZ2VudChwcm94eVVybCwgeyBoZWFkZXJzIH0pO1xuICAgICAgICB9XG4gICAgICAgIHJlcXVlc3QuYWdlbnQgPSBjYWNoZWRBZ2VudHMuaHR0cFByb3h5QWdlbnQ7XG4gICAgfVxuICAgIGVsc2Uge1xuICAgICAgICBpZiAoIWNhY2hlZEFnZW50cy5odHRwc1Byb3h5QWdlbnQpIHtcbiAgICAgICAgICAgIGNhY2hlZEFnZW50cy5odHRwc1Byb3h5QWdlbnQgPSBuZXcgaHR0cHNfcHJveHlfYWdlbnRfMS5IdHRwc1Byb3h5QWdlbnQocHJveHlVcmwsIHsgaGVhZGVycyB9KTtcbiAgICAgICAgfVxuICAgICAgICByZXF1ZXN0LmFnZW50ID0gY2FjaGVkQWdlbnRzLmh0dHBzUHJveHlBZ2VudDtcbiAgICB9XG59XG4vKipcbiAqIEEgcG9saWN5IHRoYXQgYWxsb3dzIG9uZSB0byBhcHBseSBwcm94eSBzZXR0aW5ncyB0byBhbGwgcmVxdWVzdHMuXG4gKiBJZiBub3QgcGFzc2VkIHN0YXRpYyBzZXR0aW5ncywgdGhleSB3aWxsIGJlIHJldHJpZXZlZCBmcm9tIHRoZSBIVFRQU19QUk9YWVxuICogb3IgSFRUUF9QUk9YWSBlbnZpcm9ubWVudCB2YXJpYWJsZXMuXG4gKiBAcGFyYW0gcHJveHlTZXR0aW5ncyAtIFByb3h5U2V0dGluZ3MgdG8gdXNlIG9uIGVhY2ggcmVxdWVzdC5cbiAqIEBwYXJhbSBvcHRpb25zIC0gYWRkaXRpb25hbCBzZXR0aW5ncywgZm9yIGV4YW1wbGUsIGN1c3RvbSBOT19QUk9YWSBwYXR0ZXJuc1xuICovXG5mdW5jdGlvbiBwcm94eVBvbGljeShwcm94eVNldHRpbmdzLCBvcHRpb25zKSB7XG4gICAgaWYgKCFub1Byb3h5TGlzdExvYWRlZCkge1xuICAgICAgICBleHBvcnRzLmdsb2JhbE5vUHJveHlMaXN0LnB1c2goLi4ubG9hZE5vUHJveHkoKSk7XG4gICAgfVxuICAgIGNvbnN0IGRlZmF1bHRQcm94eSA9IHByb3h5U2V0dGluZ3NcbiAgICAgICAgPyBnZXRVcmxGcm9tUHJveHlTZXR0aW5ncyhwcm94eVNldHRpbmdzKVxuICAgICAgICA6IGdldERlZmF1bHRQcm94eVNldHRpbmdzSW50ZXJuYWwoKTtcbiAgICBjb25zdCBjYWNoZWRBZ2VudHMgPSB7fTtcbiAgICByZXR1cm4ge1xuICAgICAgICBuYW1lOiBleHBvcnRzLnByb3h5UG9saWN5TmFtZSxcbiAgICAgICAgYXN5bmMgc2VuZFJlcXVlc3QocmVxdWVzdCwgbmV4dCkge1xuICAgICAgICAgICAgdmFyIF9hO1xuICAgICAgICAgICAgaWYgKCFyZXF1ZXN0LnByb3h5U2V0dGluZ3MgJiZcbiAgICAgICAgICAgICAgICBkZWZhdWx0UHJveHkgJiZcbiAgICAgICAgICAgICAgICAhaXNCeXBhc3NlZChyZXF1ZXN0LnVybCwgKF9hID0gb3B0aW9ucyA9PT0gbnVsbCB8fCBvcHRpb25zID09PSB2b2lkIDAgPyB2b2lkIDAgOiBvcHRpb25zLmN1c3RvbU5vUHJveHlMaXN0KSAhPT0gbnVsbCAmJiBfYSAhPT0gdm9pZCAwID8gX2EgOiBleHBvcnRzLmdsb2JhbE5vUHJveHlMaXN0LCAob3B0aW9ucyA9PT0gbnVsbCB8fCBvcHRpb25zID09PSB2b2lkIDAgPyB2b2lkIDAgOiBvcHRpb25zLmN1c3RvbU5vUHJveHlMaXN0KSA/IHVuZGVmaW5lZCA6IGdsb2JhbEJ5cGFzc2VkTWFwKSkge1xuICAgICAgICAgICAgICAgIHNldFByb3h5QWdlbnRPblJlcXVlc3QocmVxdWVzdCwgY2FjaGVkQWdlbnRzLCBkZWZhdWx0UHJveHkpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSBpZiAocmVxdWVzdC5wcm94eVNldHRpbmdzKSB7XG4gICAgICAgICAgICAgICAgc2V0UHJveHlBZ2VudE9uUmVxdWVzdChyZXF1ZXN0LCBjYWNoZWRBZ2VudHMsIGdldFVybEZyb21Qcm94eVNldHRpbmdzKHJlcXVlc3QucHJveHlTZXR0aW5ncykpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIG5leHQocmVxdWVzdCk7XG4gICAgICAgIH0sXG4gICAgfTtcbn1cbi8vIyBzb3VyY2VNYXBwaW5nVVJMPXByb3h5UG9saWN5LmpzLm1hcCIsCiAgICAiXCJ1c2Ugc3RyaWN0XCI7XG4vLyBDb3B5cmlnaHQgKGMpIE1pY3Jvc29mdCBDb3Jwb3JhdGlvbi5cbi8vIExpY2Vuc2VkIHVuZGVyIHRoZSBNSVQgTGljZW5zZS5cbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIl9fZXNNb2R1bGVcIiwgeyB2YWx1ZTogdHJ1ZSB9KTtcbmV4cG9ydHMuc2V0Q2xpZW50UmVxdWVzdElkUG9saWN5TmFtZSA9IHZvaWQgMDtcbmV4cG9ydHMuc2V0Q2xpZW50UmVxdWVzdElkUG9saWN5ID0gc2V0Q2xpZW50UmVxdWVzdElkUG9saWN5O1xuLyoqXG4gKiBUaGUgcHJvZ3JhbW1hdGljIGlkZW50aWZpZXIgb2YgdGhlIHNldENsaWVudFJlcXVlc3RJZFBvbGljeS5cbiAqL1xuZXhwb3J0cy5zZXRDbGllbnRSZXF1ZXN0SWRQb2xpY3lOYW1lID0gXCJzZXRDbGllbnRSZXF1ZXN0SWRQb2xpY3lcIjtcbi8qKlxuICogRWFjaCBQaXBlbGluZVJlcXVlc3QgZ2V0cyBhIHVuaXF1ZSBpZCB1cG9uIGNyZWF0aW9uLlxuICogVGhpcyBwb2xpY3kgcGFzc2VzIHRoYXQgdW5pcXVlIGlkIGFsb25nIHZpYSBhbiBIVFRQIGhlYWRlciB0byBlbmFibGUgYmV0dGVyXG4gKiB0ZWxlbWV0cnkgYW5kIHRyYWNpbmcuXG4gKiBAcGFyYW0gcmVxdWVzdElkSGVhZGVyTmFtZSAtIFRoZSBuYW1lIG9mIHRoZSBoZWFkZXIgdG8gcGFzcyB0aGUgcmVxdWVzdCBJRCB0by5cbiAqL1xuZnVuY3Rpb24gc2V0Q2xpZW50UmVxdWVzdElkUG9saWN5KHJlcXVlc3RJZEhlYWRlck5hbWUgPSBcIngtbXMtY2xpZW50LXJlcXVlc3QtaWRcIikge1xuICAgIHJldHVybiB7XG4gICAgICAgIG5hbWU6IGV4cG9ydHMuc2V0Q2xpZW50UmVxdWVzdElkUG9saWN5TmFtZSxcbiAgICAgICAgYXN5bmMgc2VuZFJlcXVlc3QocmVxdWVzdCwgbmV4dCkge1xuICAgICAgICAgICAgaWYgKCFyZXF1ZXN0LmhlYWRlcnMuaGFzKHJlcXVlc3RJZEhlYWRlck5hbWUpKSB7XG4gICAgICAgICAgICAgICAgcmVxdWVzdC5oZWFkZXJzLnNldChyZXF1ZXN0SWRIZWFkZXJOYW1lLCByZXF1ZXN0LnJlcXVlc3RJZCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4gbmV4dChyZXF1ZXN0KTtcbiAgICAgICAgfSxcbiAgICB9O1xufVxuLy8jIHNvdXJjZU1hcHBpbmdVUkw9c2V0Q2xpZW50UmVxdWVzdElkUG9saWN5LmpzLm1hcCIsCiAgICAiXCJ1c2Ugc3RyaWN0XCI7XG4vLyBDb3B5cmlnaHQgKGMpIE1pY3Jvc29mdCBDb3Jwb3JhdGlvbi5cbi8vIExpY2Vuc2VkIHVuZGVyIHRoZSBNSVQgTGljZW5zZS5cbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIl9fZXNNb2R1bGVcIiwgeyB2YWx1ZTogdHJ1ZSB9KTtcbmV4cG9ydHMudGxzUG9saWN5TmFtZSA9IHZvaWQgMDtcbmV4cG9ydHMudGxzUG9saWN5ID0gdGxzUG9saWN5O1xuLyoqXG4gKiBOYW1lIG9mIHRoZSBUTFMgUG9saWN5XG4gKi9cbmV4cG9ydHMudGxzUG9saWN5TmFtZSA9IFwidGxzUG9saWN5XCI7XG4vKipcbiAqIEdldHMgYSBwaXBlbGluZSBwb2xpY3kgdGhhdCBhZGRzIHRoZSBjbGllbnQgY2VydGlmaWNhdGUgdG8gdGhlIEh0dHBDbGllbnQgYWdlbnQgZm9yIGF1dGhlbnRpY2F0aW9uLlxuICovXG5mdW5jdGlvbiB0bHNQb2xpY3kodGxzU2V0dGluZ3MpIHtcbiAgICByZXR1cm4ge1xuICAgICAgICBuYW1lOiBleHBvcnRzLnRsc1BvbGljeU5hbWUsXG4gICAgICAgIHNlbmRSZXF1ZXN0OiBhc3luYyAocmVxLCBuZXh0KSA9PiB7XG4gICAgICAgICAgICAvLyBVc2VycyBtYXkgZGVmaW5lIGEgcmVxdWVzdCB0bHNTZXR0aW5ncywgaG9ub3IgdGhvc2Ugb3ZlciB0aGUgY2xpZW50IGxldmVsIG9uZVxuICAgICAgICAgICAgaWYgKCFyZXEudGxzU2V0dGluZ3MpIHtcbiAgICAgICAgICAgICAgICByZXEudGxzU2V0dGluZ3MgPSB0bHNTZXR0aW5ncztcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiBuZXh0KHJlcSk7XG4gICAgICAgIH0sXG4gICAgfTtcbn1cbi8vIyBzb3VyY2VNYXBwaW5nVVJMPXRsc1BvbGljeS5qcy5tYXAiLAogICAgIlwidXNlIHN0cmljdFwiO1xuLy8gQ29weXJpZ2h0IChjKSBNaWNyb3NvZnQgQ29ycG9yYXRpb24uXG4vLyBMaWNlbnNlZCB1bmRlciB0aGUgTUlUIExpY2Vuc2UuXG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJfX2VzTW9kdWxlXCIsIHsgdmFsdWU6IHRydWUgfSk7XG5leHBvcnRzLlRyYWNpbmdDb250ZXh0SW1wbCA9IGV4cG9ydHMua25vd25Db250ZXh0S2V5cyA9IHZvaWQgMDtcbmV4cG9ydHMuY3JlYXRlVHJhY2luZ0NvbnRleHQgPSBjcmVhdGVUcmFjaW5nQ29udGV4dDtcbi8qKiBAaW50ZXJuYWwgKi9cbmV4cG9ydHMua25vd25Db250ZXh0S2V5cyA9IHtcbiAgICBzcGFuOiBTeW1ib2wuZm9yKFwiQGF6dXJlL2NvcmUtdHJhY2luZyBzcGFuXCIpLFxuICAgIG5hbWVzcGFjZTogU3ltYm9sLmZvcihcIkBhenVyZS9jb3JlLXRyYWNpbmcgbmFtZXNwYWNlXCIpLFxufTtcbi8qKlxuICogQ3JlYXRlcyBhIG5ldyB7QGxpbmsgVHJhY2luZ0NvbnRleHR9IHdpdGggdGhlIGdpdmVuIG9wdGlvbnMuXG4gKiBAcGFyYW0gb3B0aW9ucyAtIEEgc2V0IG9mIGtub3duIGtleXMgdGhhdCBtYXkgYmUgc2V0IG9uIHRoZSBjb250ZXh0LlxuICogQHJldHVybnMgQSBuZXcge0BsaW5rIFRyYWNpbmdDb250ZXh0fSB3aXRoIHRoZSBnaXZlbiBvcHRpb25zLlxuICpcbiAqIEBpbnRlcm5hbFxuICovXG5mdW5jdGlvbiBjcmVhdGVUcmFjaW5nQ29udGV4dChvcHRpb25zID0ge30pIHtcbiAgICBsZXQgY29udGV4dCA9IG5ldyBUcmFjaW5nQ29udGV4dEltcGwob3B0aW9ucy5wYXJlbnRDb250ZXh0KTtcbiAgICBpZiAob3B0aW9ucy5zcGFuKSB7XG4gICAgICAgIGNvbnRleHQgPSBjb250ZXh0LnNldFZhbHVlKGV4cG9ydHMua25vd25Db250ZXh0S2V5cy5zcGFuLCBvcHRpb25zLnNwYW4pO1xuICAgIH1cbiAgICBpZiAob3B0aW9ucy5uYW1lc3BhY2UpIHtcbiAgICAgICAgY29udGV4dCA9IGNvbnRleHQuc2V0VmFsdWUoZXhwb3J0cy5rbm93bkNvbnRleHRLZXlzLm5hbWVzcGFjZSwgb3B0aW9ucy5uYW1lc3BhY2UpO1xuICAgIH1cbiAgICByZXR1cm4gY29udGV4dDtcbn1cbi8qKiBAaW50ZXJuYWwgKi9cbmNsYXNzIFRyYWNpbmdDb250ZXh0SW1wbCB7XG4gICAgY29uc3RydWN0b3IoaW5pdGlhbENvbnRleHQpIHtcbiAgICAgICAgdGhpcy5fY29udGV4dE1hcCA9XG4gICAgICAgICAgICBpbml0aWFsQ29udGV4dCBpbnN0YW5jZW9mIFRyYWNpbmdDb250ZXh0SW1wbFxuICAgICAgICAgICAgICAgID8gbmV3IE1hcChpbml0aWFsQ29udGV4dC5fY29udGV4dE1hcClcbiAgICAgICAgICAgICAgICA6IG5ldyBNYXAoKTtcbiAgICB9XG4gICAgc2V0VmFsdWUoa2V5LCB2YWx1ZSkge1xuICAgICAgICBjb25zdCBuZXdDb250ZXh0ID0gbmV3IFRyYWNpbmdDb250ZXh0SW1wbCh0aGlzKTtcbiAgICAgICAgbmV3Q29udGV4dC5fY29udGV4dE1hcC5zZXQoa2V5LCB2YWx1ZSk7XG4gICAgICAgIHJldHVybiBuZXdDb250ZXh0O1xuICAgIH1cbiAgICBnZXRWYWx1ZShrZXkpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX2NvbnRleHRNYXAuZ2V0KGtleSk7XG4gICAgfVxuICAgIGRlbGV0ZVZhbHVlKGtleSkge1xuICAgICAgICBjb25zdCBuZXdDb250ZXh0ID0gbmV3IFRyYWNpbmdDb250ZXh0SW1wbCh0aGlzKTtcbiAgICAgICAgbmV3Q29udGV4dC5fY29udGV4dE1hcC5kZWxldGUoa2V5KTtcbiAgICAgICAgcmV0dXJuIG5ld0NvbnRleHQ7XG4gICAgfVxufVxuZXhwb3J0cy5UcmFjaW5nQ29udGV4dEltcGwgPSBUcmFjaW5nQ29udGV4dEltcGw7XG4vLyMgc291cmNlTWFwcGluZ1VSTD10cmFjaW5nQ29udGV4dC5qcy5tYXAiLAogICAgIlwidXNlIHN0cmljdFwiO1xuLy8gQ29weXJpZ2h0IChjKSBNaWNyb3NvZnQgQ29ycG9yYXRpb24uXG4vLyBMaWNlbnNlZCB1bmRlciB0aGUgTUlUIExpY2Vuc2UuXG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJfX2VzTW9kdWxlXCIsIHsgdmFsdWU6IHRydWUgfSk7XG5leHBvcnRzLnN0YXRlID0gdm9pZCAwO1xuLyoqXG4gKiBAaW50ZXJuYWxcbiAqXG4gKiBIb2xkcyB0aGUgc2luZ2xldG9uIGluc3RydW1lbnRlciwgdG8gYmUgc2hhcmVkIGFjcm9zcyBDSlMgYW5kIEVTTSBpbXBvcnRzLlxuICovXG5leHBvcnRzLnN0YXRlID0ge1xuICAgIGluc3RydW1lbnRlckltcGxlbWVudGF0aW9uOiB1bmRlZmluZWQsXG59O1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9c3RhdGUtY2pzLmNqcy5tYXAiLAogICAgIlwidXNlIHN0cmljdFwiO1xuLy8gQ29weXJpZ2h0IChjKSBNaWNyb3NvZnQgQ29ycG9yYXRpb24uXG4vLyBMaWNlbnNlZCB1bmRlciB0aGUgTUlUIExpY2Vuc2UuXG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJfX2VzTW9kdWxlXCIsIHsgdmFsdWU6IHRydWUgfSk7XG5leHBvcnRzLmNyZWF0ZURlZmF1bHRUcmFjaW5nU3BhbiA9IGNyZWF0ZURlZmF1bHRUcmFjaW5nU3BhbjtcbmV4cG9ydHMuY3JlYXRlRGVmYXVsdEluc3RydW1lbnRlciA9IGNyZWF0ZURlZmF1bHRJbnN0cnVtZW50ZXI7XG5leHBvcnRzLnVzZUluc3RydW1lbnRlciA9IHVzZUluc3RydW1lbnRlcjtcbmV4cG9ydHMuZ2V0SW5zdHJ1bWVudGVyID0gZ2V0SW5zdHJ1bWVudGVyO1xuY29uc3QgdHJhY2luZ0NvbnRleHRfanNfMSA9IHJlcXVpcmUoXCIuL3RyYWNpbmdDb250ZXh0LmpzXCIpO1xuY29uc3Qgc3RhdGVfanNfMSA9IHJlcXVpcmUoXCIuL3N0YXRlLmpzXCIpO1xuZnVuY3Rpb24gY3JlYXRlRGVmYXVsdFRyYWNpbmdTcGFuKCkge1xuICAgIHJldHVybiB7XG4gICAgICAgIGVuZDogKCkgPT4ge1xuICAgICAgICAgICAgLy8gbm9vcFxuICAgICAgICB9LFxuICAgICAgICBpc1JlY29yZGluZzogKCkgPT4gZmFsc2UsXG4gICAgICAgIHJlY29yZEV4Y2VwdGlvbjogKCkgPT4ge1xuICAgICAgICAgICAgLy8gbm9vcFxuICAgICAgICB9LFxuICAgICAgICBzZXRBdHRyaWJ1dGU6ICgpID0+IHtcbiAgICAgICAgICAgIC8vIG5vb3BcbiAgICAgICAgfSxcbiAgICAgICAgc2V0U3RhdHVzOiAoKSA9PiB7XG4gICAgICAgICAgICAvLyBub29wXG4gICAgICAgIH0sXG4gICAgICAgIGFkZEV2ZW50OiAoKSA9PiB7XG4gICAgICAgICAgICAvLyBub29wXG4gICAgICAgIH0sXG4gICAgfTtcbn1cbmZ1bmN0aW9uIGNyZWF0ZURlZmF1bHRJbnN0cnVtZW50ZXIoKSB7XG4gICAgcmV0dXJuIHtcbiAgICAgICAgY3JlYXRlUmVxdWVzdEhlYWRlcnM6ICgpID0+IHtcbiAgICAgICAgICAgIHJldHVybiB7fTtcbiAgICAgICAgfSxcbiAgICAgICAgcGFyc2VUcmFjZXBhcmVudEhlYWRlcjogKCkgPT4ge1xuICAgICAgICAgICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICAgICAgfSxcbiAgICAgICAgc3RhcnRTcGFuOiAoX25hbWUsIHNwYW5PcHRpb25zKSA9PiB7XG4gICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICAgIHNwYW46IGNyZWF0ZURlZmF1bHRUcmFjaW5nU3BhbigpLFxuICAgICAgICAgICAgICAgIHRyYWNpbmdDb250ZXh0OiAoMCwgdHJhY2luZ0NvbnRleHRfanNfMS5jcmVhdGVUcmFjaW5nQ29udGV4dCkoeyBwYXJlbnRDb250ZXh0OiBzcGFuT3B0aW9ucy50cmFjaW5nQ29udGV4dCB9KSxcbiAgICAgICAgICAgIH07XG4gICAgICAgIH0sXG4gICAgICAgIHdpdGhDb250ZXh0KF9jb250ZXh0LCBjYWxsYmFjaywgLi4uY2FsbGJhY2tBcmdzKSB7XG4gICAgICAgICAgICByZXR1cm4gY2FsbGJhY2soLi4uY2FsbGJhY2tBcmdzKTtcbiAgICAgICAgfSxcbiAgICB9O1xufVxuLyoqXG4gKiBFeHRlbmRzIHRoZSBBenVyZSBTREsgd2l0aCBzdXBwb3J0IGZvciBhIGdpdmVuIGluc3RydW1lbnRlciBpbXBsZW1lbnRhdGlvbi5cbiAqXG4gKiBAcGFyYW0gaW5zdHJ1bWVudGVyIC0gVGhlIGluc3RydW1lbnRlciBpbXBsZW1lbnRhdGlvbiB0byB1c2UuXG4gKi9cbmZ1bmN0aW9uIHVzZUluc3RydW1lbnRlcihpbnN0cnVtZW50ZXIpIHtcbiAgICBzdGF0ZV9qc18xLnN0YXRlLmluc3RydW1lbnRlckltcGxlbWVudGF0aW9uID0gaW5zdHJ1bWVudGVyO1xufVxuLyoqXG4gKiBHZXRzIHRoZSBjdXJyZW50bHkgc2V0IGluc3RydW1lbnRlciwgYSBOby1PcCBpbnN0cnVtZW50ZXIgYnkgZGVmYXVsdC5cbiAqXG4gKiBAcmV0dXJucyBUaGUgY3VycmVudGx5IHNldCBpbnN0cnVtZW50ZXJcbiAqL1xuZnVuY3Rpb24gZ2V0SW5zdHJ1bWVudGVyKCkge1xuICAgIGlmICghc3RhdGVfanNfMS5zdGF0ZS5pbnN0cnVtZW50ZXJJbXBsZW1lbnRhdGlvbikge1xuICAgICAgICBzdGF0ZV9qc18xLnN0YXRlLmluc3RydW1lbnRlckltcGxlbWVudGF0aW9uID0gY3JlYXRlRGVmYXVsdEluc3RydW1lbnRlcigpO1xuICAgIH1cbiAgICByZXR1cm4gc3RhdGVfanNfMS5zdGF0ZS5pbnN0cnVtZW50ZXJJbXBsZW1lbnRhdGlvbjtcbn1cbi8vIyBzb3VyY2VNYXBwaW5nVVJMPWluc3RydW1lbnRlci5qcy5tYXAiLAogICAgIlwidXNlIHN0cmljdFwiO1xuLy8gQ29weXJpZ2h0IChjKSBNaWNyb3NvZnQgQ29ycG9yYXRpb24uXG4vLyBMaWNlbnNlZCB1bmRlciB0aGUgTUlUIExpY2Vuc2UuXG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJfX2VzTW9kdWxlXCIsIHsgdmFsdWU6IHRydWUgfSk7XG5leHBvcnRzLmNyZWF0ZVRyYWNpbmdDbGllbnQgPSBjcmVhdGVUcmFjaW5nQ2xpZW50O1xuY29uc3QgaW5zdHJ1bWVudGVyX2pzXzEgPSByZXF1aXJlKFwiLi9pbnN0cnVtZW50ZXIuanNcIik7XG5jb25zdCB0cmFjaW5nQ29udGV4dF9qc18xID0gcmVxdWlyZShcIi4vdHJhY2luZ0NvbnRleHQuanNcIik7XG4vKipcbiAqIENyZWF0ZXMgYSBuZXcgdHJhY2luZyBjbGllbnQuXG4gKlxuICogQHBhcmFtIG9wdGlvbnMgLSBPcHRpb25zIHVzZWQgdG8gY29uZmlndXJlIHRoZSB0cmFjaW5nIGNsaWVudC5cbiAqIEByZXR1cm5zIC0gQW4gaW5zdGFuY2Ugb2Yge0BsaW5rIFRyYWNpbmdDbGllbnR9LlxuICovXG5mdW5jdGlvbiBjcmVhdGVUcmFjaW5nQ2xpZW50KG9wdGlvbnMpIHtcbiAgICBjb25zdCB7IG5hbWVzcGFjZSwgcGFja2FnZU5hbWUsIHBhY2thZ2VWZXJzaW9uIH0gPSBvcHRpb25zO1xuICAgIGZ1bmN0aW9uIHN0YXJ0U3BhbihuYW1lLCBvcGVyYXRpb25PcHRpb25zLCBzcGFuT3B0aW9ucykge1xuICAgICAgICB2YXIgX2E7XG4gICAgICAgIGNvbnN0IHN0YXJ0U3BhblJlc3VsdCA9ICgwLCBpbnN0cnVtZW50ZXJfanNfMS5nZXRJbnN0cnVtZW50ZXIpKCkuc3RhcnRTcGFuKG5hbWUsIE9iamVjdC5hc3NpZ24oT2JqZWN0LmFzc2lnbih7fSwgc3Bhbk9wdGlvbnMpLCB7IHBhY2thZ2VOYW1lOiBwYWNrYWdlTmFtZSwgcGFja2FnZVZlcnNpb246IHBhY2thZ2VWZXJzaW9uLCB0cmFjaW5nQ29udGV4dDogKF9hID0gb3BlcmF0aW9uT3B0aW9ucyA9PT0gbnVsbCB8fCBvcGVyYXRpb25PcHRpb25zID09PSB2b2lkIDAgPyB2b2lkIDAgOiBvcGVyYXRpb25PcHRpb25zLnRyYWNpbmdPcHRpb25zKSA9PT0gbnVsbCB8fCBfYSA9PT0gdm9pZCAwID8gdm9pZCAwIDogX2EudHJhY2luZ0NvbnRleHQgfSkpO1xuICAgICAgICBsZXQgdHJhY2luZ0NvbnRleHQgPSBzdGFydFNwYW5SZXN1bHQudHJhY2luZ0NvbnRleHQ7XG4gICAgICAgIGNvbnN0IHNwYW4gPSBzdGFydFNwYW5SZXN1bHQuc3BhbjtcbiAgICAgICAgaWYgKCF0cmFjaW5nQ29udGV4dC5nZXRWYWx1ZSh0cmFjaW5nQ29udGV4dF9qc18xLmtub3duQ29udGV4dEtleXMubmFtZXNwYWNlKSkge1xuICAgICAgICAgICAgdHJhY2luZ0NvbnRleHQgPSB0cmFjaW5nQ29udGV4dC5zZXRWYWx1ZSh0cmFjaW5nQ29udGV4dF9qc18xLmtub3duQ29udGV4dEtleXMubmFtZXNwYWNlLCBuYW1lc3BhY2UpO1xuICAgICAgICB9XG4gICAgICAgIHNwYW4uc2V0QXR0cmlidXRlKFwiYXoubmFtZXNwYWNlXCIsIHRyYWNpbmdDb250ZXh0LmdldFZhbHVlKHRyYWNpbmdDb250ZXh0X2pzXzEua25vd25Db250ZXh0S2V5cy5uYW1lc3BhY2UpKTtcbiAgICAgICAgY29uc3QgdXBkYXRlZE9wdGlvbnMgPSBPYmplY3QuYXNzaWduKHt9LCBvcGVyYXRpb25PcHRpb25zLCB7XG4gICAgICAgICAgICB0cmFjaW5nT3B0aW9uczogT2JqZWN0LmFzc2lnbihPYmplY3QuYXNzaWduKHt9LCBvcGVyYXRpb25PcHRpb25zID09PSBudWxsIHx8IG9wZXJhdGlvbk9wdGlvbnMgPT09IHZvaWQgMCA/IHZvaWQgMCA6IG9wZXJhdGlvbk9wdGlvbnMudHJhY2luZ09wdGlvbnMpLCB7IHRyYWNpbmdDb250ZXh0IH0pLFxuICAgICAgICB9KTtcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgIHNwYW4sXG4gICAgICAgICAgICB1cGRhdGVkT3B0aW9ucyxcbiAgICAgICAgfTtcbiAgICB9XG4gICAgYXN5bmMgZnVuY3Rpb24gd2l0aFNwYW4obmFtZSwgb3BlcmF0aW9uT3B0aW9ucywgY2FsbGJhY2ssIHNwYW5PcHRpb25zKSB7XG4gICAgICAgIGNvbnN0IHsgc3BhbiwgdXBkYXRlZE9wdGlvbnMgfSA9IHN0YXJ0U3BhbihuYW1lLCBvcGVyYXRpb25PcHRpb25zLCBzcGFuT3B0aW9ucyk7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgICBjb25zdCByZXN1bHQgPSBhd2FpdCB3aXRoQ29udGV4dCh1cGRhdGVkT3B0aW9ucy50cmFjaW5nT3B0aW9ucy50cmFjaW5nQ29udGV4dCwgKCkgPT4gUHJvbWlzZS5yZXNvbHZlKGNhbGxiYWNrKHVwZGF0ZWRPcHRpb25zLCBzcGFuKSkpO1xuICAgICAgICAgICAgc3Bhbi5zZXRTdGF0dXMoeyBzdGF0dXM6IFwic3VjY2Vzc1wiIH0pO1xuICAgICAgICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICAgICAgfVxuICAgICAgICBjYXRjaCAoZXJyKSB7XG4gICAgICAgICAgICBzcGFuLnNldFN0YXR1cyh7IHN0YXR1czogXCJlcnJvclwiLCBlcnJvcjogZXJyIH0pO1xuICAgICAgICAgICAgdGhyb3cgZXJyO1xuICAgICAgICB9XG4gICAgICAgIGZpbmFsbHkge1xuICAgICAgICAgICAgc3Bhbi5lbmQoKTtcbiAgICAgICAgfVxuICAgIH1cbiAgICBmdW5jdGlvbiB3aXRoQ29udGV4dChjb250ZXh0LCBjYWxsYmFjaywgLi4uY2FsbGJhY2tBcmdzKSB7XG4gICAgICAgIHJldHVybiAoMCwgaW5zdHJ1bWVudGVyX2pzXzEuZ2V0SW5zdHJ1bWVudGVyKSgpLndpdGhDb250ZXh0KGNvbnRleHQsIGNhbGxiYWNrLCAuLi5jYWxsYmFja0FyZ3MpO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBQYXJzZXMgYSB0cmFjZXBhcmVudCBoZWFkZXIgdmFsdWUgaW50byBhIHNwYW4gaWRlbnRpZmllci5cbiAgICAgKlxuICAgICAqIEBwYXJhbSB0cmFjZXBhcmVudEhlYWRlciAtIFRoZSB0cmFjZXBhcmVudCBoZWFkZXIgdG8gcGFyc2UuXG4gICAgICogQHJldHVybnMgQW4gaW1wbGVtZW50YXRpb24tc3BlY2lmaWMgaWRlbnRpZmllciBmb3IgdGhlIHNwYW4uXG4gICAgICovXG4gICAgZnVuY3Rpb24gcGFyc2VUcmFjZXBhcmVudEhlYWRlcih0cmFjZXBhcmVudEhlYWRlcikge1xuICAgICAgICByZXR1cm4gKDAsIGluc3RydW1lbnRlcl9qc18xLmdldEluc3RydW1lbnRlcikoKS5wYXJzZVRyYWNlcGFyZW50SGVhZGVyKHRyYWNlcGFyZW50SGVhZGVyKTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogQ3JlYXRlcyBhIHNldCBvZiByZXF1ZXN0IGhlYWRlcnMgdG8gcHJvcGFnYXRlIHRyYWNpbmcgaW5mb3JtYXRpb24gdG8gYSBiYWNrZW5kLlxuICAgICAqXG4gICAgICogQHBhcmFtIHRyYWNpbmdDb250ZXh0IC0gVGhlIGNvbnRleHQgY29udGFpbmluZyB0aGUgc3BhbiB0byBzZXJpYWxpemUuXG4gICAgICogQHJldHVybnMgVGhlIHNldCBvZiBoZWFkZXJzIHRvIGFkZCB0byBhIHJlcXVlc3QuXG4gICAgICovXG4gICAgZnVuY3Rpb24gY3JlYXRlUmVxdWVzdEhlYWRlcnModHJhY2luZ0NvbnRleHQpIHtcbiAgICAgICAgcmV0dXJuICgwLCBpbnN0cnVtZW50ZXJfanNfMS5nZXRJbnN0cnVtZW50ZXIpKCkuY3JlYXRlUmVxdWVzdEhlYWRlcnModHJhY2luZ0NvbnRleHQpO1xuICAgIH1cbiAgICByZXR1cm4ge1xuICAgICAgICBzdGFydFNwYW4sXG4gICAgICAgIHdpdGhTcGFuLFxuICAgICAgICB3aXRoQ29udGV4dCxcbiAgICAgICAgcGFyc2VUcmFjZXBhcmVudEhlYWRlcixcbiAgICAgICAgY3JlYXRlUmVxdWVzdEhlYWRlcnMsXG4gICAgfTtcbn1cbi8vIyBzb3VyY2VNYXBwaW5nVVJMPXRyYWNpbmdDbGllbnQuanMubWFwIiwKICAgICJcInVzZSBzdHJpY3RcIjtcbi8vIENvcHlyaWdodCAoYykgTWljcm9zb2Z0IENvcnBvcmF0aW9uLlxuLy8gTGljZW5zZWQgdW5kZXIgdGhlIE1JVCBMaWNlbnNlLlxuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiX19lc01vZHVsZVwiLCB7IHZhbHVlOiB0cnVlIH0pO1xuZXhwb3J0cy5jcmVhdGVUcmFjaW5nQ2xpZW50ID0gZXhwb3J0cy51c2VJbnN0cnVtZW50ZXIgPSB2b2lkIDA7XG52YXIgaW5zdHJ1bWVudGVyX2pzXzEgPSByZXF1aXJlKFwiLi9pbnN0cnVtZW50ZXIuanNcIik7XG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJ1c2VJbnN0cnVtZW50ZXJcIiwgeyBlbnVtZXJhYmxlOiB0cnVlLCBnZXQ6IGZ1bmN0aW9uICgpIHsgcmV0dXJuIGluc3RydW1lbnRlcl9qc18xLnVzZUluc3RydW1lbnRlcjsgfSB9KTtcbnZhciB0cmFjaW5nQ2xpZW50X2pzXzEgPSByZXF1aXJlKFwiLi90cmFjaW5nQ2xpZW50LmpzXCIpO1xuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiY3JlYXRlVHJhY2luZ0NsaWVudFwiLCB7IGVudW1lcmFibGU6IHRydWUsIGdldDogZnVuY3Rpb24gKCkgeyByZXR1cm4gdHJhY2luZ0NsaWVudF9qc18xLmNyZWF0ZVRyYWNpbmdDbGllbnQ7IH0gfSk7XG4vLyMgc291cmNlTWFwcGluZ1VSTD1pbmRleC5qcy5tYXAiLAogICAgIlwidXNlIHN0cmljdFwiO1xuLy8gQ29weXJpZ2h0IChjKSBNaWNyb3NvZnQgQ29ycG9yYXRpb24uXG4vLyBMaWNlbnNlZCB1bmRlciB0aGUgTUlUIExpY2Vuc2UuXG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJfX2VzTW9kdWxlXCIsIHsgdmFsdWU6IHRydWUgfSk7XG5leHBvcnRzLmN1c3RvbSA9IHZvaWQgMDtcbmNvbnN0IG5vZGVfdXRpbF8xID0gcmVxdWlyZShcIm5vZGU6dXRpbFwiKTtcbmV4cG9ydHMuY3VzdG9tID0gbm9kZV91dGlsXzEuaW5zcGVjdC5jdXN0b207XG4vLyMgc291cmNlTWFwcGluZ1VSTD1pbnNwZWN0LmpzLm1hcCIsCiAgICAiXCJ1c2Ugc3RyaWN0XCI7XG4vLyBDb3B5cmlnaHQgKGMpIE1pY3Jvc29mdCBDb3Jwb3JhdGlvbi5cbi8vIExpY2Vuc2VkIHVuZGVyIHRoZSBNSVQgTGljZW5zZS5cbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIl9fZXNNb2R1bGVcIiwgeyB2YWx1ZTogdHJ1ZSB9KTtcbmV4cG9ydHMuUmVzdEVycm9yID0gdm9pZCAwO1xuZXhwb3J0cy5pc1Jlc3RFcnJvciA9IGlzUmVzdEVycm9yO1xuY29uc3QgY29yZV91dGlsXzEgPSByZXF1aXJlKFwiQGF6dXJlL2NvcmUtdXRpbFwiKTtcbmNvbnN0IGluc3BlY3RfanNfMSA9IHJlcXVpcmUoXCIuL3V0aWwvaW5zcGVjdC5qc1wiKTtcbmNvbnN0IHNhbml0aXplcl9qc18xID0gcmVxdWlyZShcIi4vdXRpbC9zYW5pdGl6ZXIuanNcIik7XG5jb25zdCBlcnJvclNhbml0aXplciA9IG5ldyBzYW5pdGl6ZXJfanNfMS5TYW5pdGl6ZXIoKTtcbi8qKlxuICogQSBjdXN0b20gZXJyb3IgdHlwZSBmb3IgZmFpbGVkIHBpcGVsaW5lIHJlcXVlc3RzLlxuICovXG5jbGFzcyBSZXN0RXJyb3IgZXh0ZW5kcyBFcnJvciB7XG4gICAgY29uc3RydWN0b3IobWVzc2FnZSwgb3B0aW9ucyA9IHt9KSB7XG4gICAgICAgIHN1cGVyKG1lc3NhZ2UpO1xuICAgICAgICB0aGlzLm5hbWUgPSBcIlJlc3RFcnJvclwiO1xuICAgICAgICB0aGlzLmNvZGUgPSBvcHRpb25zLmNvZGU7XG4gICAgICAgIHRoaXMuc3RhdHVzQ29kZSA9IG9wdGlvbnMuc3RhdHVzQ29kZTtcbiAgICAgICAgLy8gVGhlIHJlcXVlc3QgYW5kIHJlc3BvbnNlIG1heSBjb250YWluIHNlbnNpdGl2ZSBpbmZvcm1hdGlvbiBpbiB0aGUgaGVhZGVycyBvciBib2R5LlxuICAgICAgICAvLyBUbyBoZWxwIHByZXZlbnQgdGhpcyBzZW5zaXRpdmUgaW5mb3JtYXRpb24gYmVpbmcgYWNjaWRlbnRhbGx5IGxvZ2dlZCwgdGhlIHJlcXVlc3QgYW5kIHJlc3BvbnNlXG4gICAgICAgIC8vIHByb3BlcnRpZXMgYXJlIG1hcmtlZCBhcyBub24tZW51bWVyYWJsZSBoZXJlLiBUaGlzIHByZXZlbnRzIHRoZW0gc2hvd2luZyB1cCBpbiB0aGUgb3V0cHV0IG9mXG4gICAgICAgIC8vIEpTT04uc3RyaW5naWZ5IGFuZCBjb25zb2xlLmxvZy5cbiAgICAgICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KHRoaXMsIFwicmVxdWVzdFwiLCB7IHZhbHVlOiBvcHRpb25zLnJlcXVlc3QsIGVudW1lcmFibGU6IGZhbHNlIH0pO1xuICAgICAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkodGhpcywgXCJyZXNwb25zZVwiLCB7IHZhbHVlOiBvcHRpb25zLnJlc3BvbnNlLCBlbnVtZXJhYmxlOiBmYWxzZSB9KTtcbiAgICAgICAgT2JqZWN0LnNldFByb3RvdHlwZU9mKHRoaXMsIFJlc3RFcnJvci5wcm90b3R5cGUpO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBMb2dnaW5nIG1ldGhvZCBmb3IgdXRpbC5pbnNwZWN0IGluIE5vZGVcbiAgICAgKi9cbiAgICBbaW5zcGVjdF9qc18xLmN1c3RvbV0oKSB7XG4gICAgICAgIC8vIEV4dHJhY3Qgbm9uLWVudW1lcmFibGUgcHJvcGVydGllcyBhbmQgYWRkIHRoZW0gYmFjay4gVGhpcyBpcyBPSyBzaW5jZSBpbiB0aGlzIG91dHB1dCB0aGUgcmVxdWVzdCBhbmRcbiAgICAgICAgLy8gcmVzcG9uc2UgZ2V0IHNhbml0aXplZC5cbiAgICAgICAgcmV0dXJuIGBSZXN0RXJyb3I6ICR7dGhpcy5tZXNzYWdlfSBcXG4gJHtlcnJvclNhbml0aXplci5zYW5pdGl6ZShPYmplY3QuYXNzaWduKE9iamVjdC5hc3NpZ24oe30sIHRoaXMpLCB7IHJlcXVlc3Q6IHRoaXMucmVxdWVzdCwgcmVzcG9uc2U6IHRoaXMucmVzcG9uc2UgfSkpfWA7XG4gICAgfVxufVxuZXhwb3J0cy5SZXN0RXJyb3IgPSBSZXN0RXJyb3I7XG4vKipcbiAqIFNvbWV0aGluZyB3ZW50IHdyb25nIHdoZW4gbWFraW5nIHRoZSByZXF1ZXN0LlxuICogVGhpcyBtZWFucyB0aGUgYWN0dWFsIHJlcXVlc3QgZmFpbGVkIGZvciBzb21lIHJlYXNvbixcbiAqIHN1Y2ggYXMgYSBETlMgaXNzdWUgb3IgdGhlIGNvbm5lY3Rpb24gYmVpbmcgbG9zdC5cbiAqL1xuUmVzdEVycm9yLlJFUVVFU1RfU0VORF9FUlJPUiA9IFwiUkVRVUVTVF9TRU5EX0VSUk9SXCI7XG4vKipcbiAqIFRoaXMgbWVhbnMgdGhhdCBwYXJzaW5nIHRoZSByZXNwb25zZSBmcm9tIHRoZSBzZXJ2ZXIgZmFpbGVkLlxuICogSXQgbWF5IGhhdmUgYmVlbiBtYWxmb3JtZWQuXG4gKi9cblJlc3RFcnJvci5QQVJTRV9FUlJPUiA9IFwiUEFSU0VfRVJST1JcIjtcbi8qKlxuICogVHlwZWd1YXJkIGZvciBSZXN0RXJyb3JcbiAqIEBwYXJhbSBlIC0gU29tZXRoaW5nIGNhdWdodCBieSBhIGNhdGNoIGNsYXVzZS5cbiAqL1xuZnVuY3Rpb24gaXNSZXN0RXJyb3IoZSkge1xuICAgIGlmIChlIGluc3RhbmNlb2YgUmVzdEVycm9yKSB7XG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cbiAgICByZXR1cm4gKDAsIGNvcmVfdXRpbF8xLmlzRXJyb3IpKGUpICYmIGUubmFtZSA9PT0gXCJSZXN0RXJyb3JcIjtcbn1cbi8vIyBzb3VyY2VNYXBwaW5nVVJMPXJlc3RFcnJvci5qcy5tYXAiLAogICAgIlwidXNlIHN0cmljdFwiO1xuLy8gQ29weXJpZ2h0IChjKSBNaWNyb3NvZnQgQ29ycG9yYXRpb24uXG4vLyBMaWNlbnNlZCB1bmRlciB0aGUgTUlUIExpY2Vuc2UuXG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJfX2VzTW9kdWxlXCIsIHsgdmFsdWU6IHRydWUgfSk7XG5leHBvcnRzLnRyYWNpbmdQb2xpY3lOYW1lID0gdm9pZCAwO1xuZXhwb3J0cy50cmFjaW5nUG9saWN5ID0gdHJhY2luZ1BvbGljeTtcbmNvbnN0IGNvcmVfdHJhY2luZ18xID0gcmVxdWlyZShcIkBhenVyZS9jb3JlLXRyYWNpbmdcIik7XG5jb25zdCBjb25zdGFudHNfanNfMSA9IHJlcXVpcmUoXCIuLi9jb25zdGFudHMuanNcIik7XG5jb25zdCB1c2VyQWdlbnRfanNfMSA9IHJlcXVpcmUoXCIuLi91dGlsL3VzZXJBZ2VudC5qc1wiKTtcbmNvbnN0IGxvZ19qc18xID0gcmVxdWlyZShcIi4uL2xvZy5qc1wiKTtcbmNvbnN0IGNvcmVfdXRpbF8xID0gcmVxdWlyZShcIkBhenVyZS9jb3JlLXV0aWxcIik7XG5jb25zdCByZXN0RXJyb3JfanNfMSA9IHJlcXVpcmUoXCIuLi9yZXN0RXJyb3IuanNcIik7XG5jb25zdCBzYW5pdGl6ZXJfanNfMSA9IHJlcXVpcmUoXCIuLi91dGlsL3Nhbml0aXplci5qc1wiKTtcbi8qKlxuICogVGhlIHByb2dyYW1tYXRpYyBpZGVudGlmaWVyIG9mIHRoZSB0cmFjaW5nUG9saWN5LlxuICovXG5leHBvcnRzLnRyYWNpbmdQb2xpY3lOYW1lID0gXCJ0cmFjaW5nUG9saWN5XCI7XG4vKipcbiAqIEEgc2ltcGxlIHBvbGljeSB0byBjcmVhdGUgT3BlblRlbGVtZXRyeSBTcGFucyBmb3IgZWFjaCByZXF1ZXN0IG1hZGUgYnkgdGhlIHBpcGVsaW5lXG4gKiB0aGF0IGhhcyBTcGFuT3B0aW9ucyB3aXRoIGEgcGFyZW50LlxuICogUmVxdWVzdHMgbWFkZSB3aXRob3V0IGEgcGFyZW50IFNwYW4gd2lsbCBub3QgYmUgcmVjb3JkZWQuXG4gKiBAcGFyYW0gb3B0aW9ucyAtIE9wdGlvbnMgdG8gY29uZmlndXJlIHRoZSB0ZWxlbWV0cnkgbG9nZ2VkIGJ5IHRoZSB0cmFjaW5nIHBvbGljeS5cbiAqL1xuZnVuY3Rpb24gdHJhY2luZ1BvbGljeShvcHRpb25zID0ge30pIHtcbiAgICBjb25zdCB1c2VyQWdlbnRQcm9taXNlID0gKDAsIHVzZXJBZ2VudF9qc18xLmdldFVzZXJBZ2VudFZhbHVlKShvcHRpb25zLnVzZXJBZ2VudFByZWZpeCk7XG4gICAgY29uc3Qgc2FuaXRpemVyID0gbmV3IHNhbml0aXplcl9qc18xLlNhbml0aXplcih7XG4gICAgICAgIGFkZGl0aW9uYWxBbGxvd2VkUXVlcnlQYXJhbWV0ZXJzOiBvcHRpb25zLmFkZGl0aW9uYWxBbGxvd2VkUXVlcnlQYXJhbWV0ZXJzLFxuICAgIH0pO1xuICAgIGNvbnN0IHRyYWNpbmdDbGllbnQgPSB0cnlDcmVhdGVUcmFjaW5nQ2xpZW50KCk7XG4gICAgcmV0dXJuIHtcbiAgICAgICAgbmFtZTogZXhwb3J0cy50cmFjaW5nUG9saWN5TmFtZSxcbiAgICAgICAgYXN5bmMgc2VuZFJlcXVlc3QocmVxdWVzdCwgbmV4dCkge1xuICAgICAgICAgICAgdmFyIF9hO1xuICAgICAgICAgICAgaWYgKCF0cmFjaW5nQ2xpZW50KSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIG5leHQocmVxdWVzdCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBjb25zdCB1c2VyQWdlbnQgPSBhd2FpdCB1c2VyQWdlbnRQcm9taXNlO1xuICAgICAgICAgICAgY29uc3Qgc3BhbkF0dHJpYnV0ZXMgPSB7XG4gICAgICAgICAgICAgICAgXCJodHRwLnVybFwiOiBzYW5pdGl6ZXIuc2FuaXRpemVVcmwocmVxdWVzdC51cmwpLFxuICAgICAgICAgICAgICAgIFwiaHR0cC5tZXRob2RcIjogcmVxdWVzdC5tZXRob2QsXG4gICAgICAgICAgICAgICAgXCJodHRwLnVzZXJfYWdlbnRcIjogdXNlckFnZW50LFxuICAgICAgICAgICAgICAgIHJlcXVlc3RJZDogcmVxdWVzdC5yZXF1ZXN0SWQsXG4gICAgICAgICAgICB9O1xuICAgICAgICAgICAgaWYgKHVzZXJBZ2VudCkge1xuICAgICAgICAgICAgICAgIHNwYW5BdHRyaWJ1dGVzW1wiaHR0cC51c2VyX2FnZW50XCJdID0gdXNlckFnZW50O1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgY29uc3QgeyBzcGFuLCB0cmFjaW5nQ29udGV4dCB9ID0gKF9hID0gdHJ5Q3JlYXRlU3Bhbih0cmFjaW5nQ2xpZW50LCByZXF1ZXN0LCBzcGFuQXR0cmlidXRlcykpICE9PSBudWxsICYmIF9hICE9PSB2b2lkIDAgPyBfYSA6IHt9O1xuICAgICAgICAgICAgaWYgKCFzcGFuIHx8ICF0cmFjaW5nQ29udGV4dCkge1xuICAgICAgICAgICAgICAgIHJldHVybiBuZXh0KHJlcXVlc3QpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICBjb25zdCByZXNwb25zZSA9IGF3YWl0IHRyYWNpbmdDbGllbnQud2l0aENvbnRleHQodHJhY2luZ0NvbnRleHQsIG5leHQsIHJlcXVlc3QpO1xuICAgICAgICAgICAgICAgIHRyeVByb2Nlc3NSZXNwb25zZShzcGFuLCByZXNwb25zZSk7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHJlc3BvbnNlO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgY2F0Y2ggKGVycikge1xuICAgICAgICAgICAgICAgIHRyeVByb2Nlc3NFcnJvcihzcGFuLCBlcnIpO1xuICAgICAgICAgICAgICAgIHRocm93IGVycjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSxcbiAgICB9O1xufVxuZnVuY3Rpb24gdHJ5Q3JlYXRlVHJhY2luZ0NsaWVudCgpIHtcbiAgICB0cnkge1xuICAgICAgICByZXR1cm4gKDAsIGNvcmVfdHJhY2luZ18xLmNyZWF0ZVRyYWNpbmdDbGllbnQpKHtcbiAgICAgICAgICAgIG5hbWVzcGFjZTogXCJcIixcbiAgICAgICAgICAgIHBhY2thZ2VOYW1lOiBcIkBhenVyZS9jb3JlLXJlc3QtcGlwZWxpbmVcIixcbiAgICAgICAgICAgIHBhY2thZ2VWZXJzaW9uOiBjb25zdGFudHNfanNfMS5TREtfVkVSU0lPTixcbiAgICAgICAgfSk7XG4gICAgfVxuICAgIGNhdGNoIChlKSB7XG4gICAgICAgIGxvZ19qc18xLmxvZ2dlci53YXJuaW5nKGBFcnJvciB3aGVuIGNyZWF0aW5nIHRoZSBUcmFjaW5nQ2xpZW50OiAkeygwLCBjb3JlX3V0aWxfMS5nZXRFcnJvck1lc3NhZ2UpKGUpfWApO1xuICAgICAgICByZXR1cm4gdW5kZWZpbmVkO1xuICAgIH1cbn1cbmZ1bmN0aW9uIHRyeUNyZWF0ZVNwYW4odHJhY2luZ0NsaWVudCwgcmVxdWVzdCwgc3BhbkF0dHJpYnV0ZXMpIHtcbiAgICB0cnkge1xuICAgICAgICAvLyBBcyBwZXIgc3BlYywgd2UgZG8gbm90IG5lZWQgdG8gZGlmZmVyZW50aWF0ZSBiZXR3ZWVuIEhUVFAgYW5kIEhUVFBTIGluIHNwYW4gbmFtZS5cbiAgICAgICAgY29uc3QgeyBzcGFuLCB1cGRhdGVkT3B0aW9ucyB9ID0gdHJhY2luZ0NsaWVudC5zdGFydFNwYW4oYEhUVFAgJHtyZXF1ZXN0Lm1ldGhvZH1gLCB7IHRyYWNpbmdPcHRpb25zOiByZXF1ZXN0LnRyYWNpbmdPcHRpb25zIH0sIHtcbiAgICAgICAgICAgIHNwYW5LaW5kOiBcImNsaWVudFwiLFxuICAgICAgICAgICAgc3BhbkF0dHJpYnV0ZXMsXG4gICAgICAgIH0pO1xuICAgICAgICAvLyBJZiB0aGUgc3BhbiBpcyBub3QgcmVjb3JkaW5nLCBkb24ndCBkbyBhbnkgbW9yZSB3b3JrLlxuICAgICAgICBpZiAoIXNwYW4uaXNSZWNvcmRpbmcoKSkge1xuICAgICAgICAgICAgc3Bhbi5lbmQoKTtcbiAgICAgICAgICAgIHJldHVybiB1bmRlZmluZWQ7XG4gICAgICAgIH1cbiAgICAgICAgLy8gc2V0IGhlYWRlcnNcbiAgICAgICAgY29uc3QgaGVhZGVycyA9IHRyYWNpbmdDbGllbnQuY3JlYXRlUmVxdWVzdEhlYWRlcnModXBkYXRlZE9wdGlvbnMudHJhY2luZ09wdGlvbnMudHJhY2luZ0NvbnRleHQpO1xuICAgICAgICBmb3IgKGNvbnN0IFtrZXksIHZhbHVlXSBvZiBPYmplY3QuZW50cmllcyhoZWFkZXJzKSkge1xuICAgICAgICAgICAgcmVxdWVzdC5oZWFkZXJzLnNldChrZXksIHZhbHVlKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4geyBzcGFuLCB0cmFjaW5nQ29udGV4dDogdXBkYXRlZE9wdGlvbnMudHJhY2luZ09wdGlvbnMudHJhY2luZ0NvbnRleHQgfTtcbiAgICB9XG4gICAgY2F0Y2ggKGUpIHtcbiAgICAgICAgbG9nX2pzXzEubG9nZ2VyLndhcm5pbmcoYFNraXBwaW5nIGNyZWF0aW5nIGEgdHJhY2luZyBzcGFuIGR1ZSB0byBhbiBlcnJvcjogJHsoMCwgY29yZV91dGlsXzEuZ2V0RXJyb3JNZXNzYWdlKShlKX1gKTtcbiAgICAgICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICB9XG59XG5mdW5jdGlvbiB0cnlQcm9jZXNzRXJyb3Ioc3BhbiwgZXJyb3IpIHtcbiAgICB0cnkge1xuICAgICAgICBzcGFuLnNldFN0YXR1cyh7XG4gICAgICAgICAgICBzdGF0dXM6IFwiZXJyb3JcIixcbiAgICAgICAgICAgIGVycm9yOiAoMCwgY29yZV91dGlsXzEuaXNFcnJvcikoZXJyb3IpID8gZXJyb3IgOiB1bmRlZmluZWQsXG4gICAgICAgIH0pO1xuICAgICAgICBpZiAoKDAsIHJlc3RFcnJvcl9qc18xLmlzUmVzdEVycm9yKShlcnJvcikgJiYgZXJyb3Iuc3RhdHVzQ29kZSkge1xuICAgICAgICAgICAgc3Bhbi5zZXRBdHRyaWJ1dGUoXCJodHRwLnN0YXR1c19jb2RlXCIsIGVycm9yLnN0YXR1c0NvZGUpO1xuICAgICAgICB9XG4gICAgICAgIHNwYW4uZW5kKCk7XG4gICAgfVxuICAgIGNhdGNoIChlKSB7XG4gICAgICAgIGxvZ19qc18xLmxvZ2dlci53YXJuaW5nKGBTa2lwcGluZyB0cmFjaW5nIHNwYW4gcHJvY2Vzc2luZyBkdWUgdG8gYW4gZXJyb3I6ICR7KDAsIGNvcmVfdXRpbF8xLmdldEVycm9yTWVzc2FnZSkoZSl9YCk7XG4gICAgfVxufVxuZnVuY3Rpb24gdHJ5UHJvY2Vzc1Jlc3BvbnNlKHNwYW4sIHJlc3BvbnNlKSB7XG4gICAgdHJ5IHtcbiAgICAgICAgc3Bhbi5zZXRBdHRyaWJ1dGUoXCJodHRwLnN0YXR1c19jb2RlXCIsIHJlc3BvbnNlLnN0YXR1cyk7XG4gICAgICAgIGNvbnN0IHNlcnZpY2VSZXF1ZXN0SWQgPSByZXNwb25zZS5oZWFkZXJzLmdldChcIngtbXMtcmVxdWVzdC1pZFwiKTtcbiAgICAgICAgaWYgKHNlcnZpY2VSZXF1ZXN0SWQpIHtcbiAgICAgICAgICAgIHNwYW4uc2V0QXR0cmlidXRlKFwic2VydmljZVJlcXVlc3RJZFwiLCBzZXJ2aWNlUmVxdWVzdElkKTtcbiAgICAgICAgfVxuICAgICAgICBzcGFuLnNldFN0YXR1cyh7XG4gICAgICAgICAgICBzdGF0dXM6IFwic3VjY2Vzc1wiLFxuICAgICAgICB9KTtcbiAgICAgICAgc3Bhbi5lbmQoKTtcbiAgICB9XG4gICAgY2F0Y2ggKGUpIHtcbiAgICAgICAgbG9nX2pzXzEubG9nZ2VyLndhcm5pbmcoYFNraXBwaW5nIHRyYWNpbmcgc3BhbiBwcm9jZXNzaW5nIGR1ZSB0byBhbiBlcnJvcjogJHsoMCwgY29yZV91dGlsXzEuZ2V0RXJyb3JNZXNzYWdlKShlKX1gKTtcbiAgICB9XG59XG4vLyMgc291cmNlTWFwcGluZ1VSTD10cmFjaW5nUG9saWN5LmpzLm1hcCIsCiAgICAiXCJ1c2Ugc3RyaWN0XCI7XG4vLyBDb3B5cmlnaHQgKGMpIE1pY3Jvc29mdCBDb3Jwb3JhdGlvbi5cbi8vIExpY2Vuc2VkIHVuZGVyIHRoZSBNSVQgTGljZW5zZS5cbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIl9fZXNNb2R1bGVcIiwgeyB2YWx1ZTogdHJ1ZSB9KTtcbmV4cG9ydHMuY3JlYXRlUGlwZWxpbmVGcm9tT3B0aW9ucyA9IGNyZWF0ZVBpcGVsaW5lRnJvbU9wdGlvbnM7XG5jb25zdCBsb2dQb2xpY3lfanNfMSA9IHJlcXVpcmUoXCIuL3BvbGljaWVzL2xvZ1BvbGljeS5qc1wiKTtcbmNvbnN0IHBpcGVsaW5lX2pzXzEgPSByZXF1aXJlKFwiLi9waXBlbGluZS5qc1wiKTtcbmNvbnN0IHJlZGlyZWN0UG9saWN5X2pzXzEgPSByZXF1aXJlKFwiLi9wb2xpY2llcy9yZWRpcmVjdFBvbGljeS5qc1wiKTtcbmNvbnN0IHVzZXJBZ2VudFBvbGljeV9qc18xID0gcmVxdWlyZShcIi4vcG9saWNpZXMvdXNlckFnZW50UG9saWN5LmpzXCIpO1xuY29uc3QgbXVsdGlwYXJ0UG9saWN5X2pzXzEgPSByZXF1aXJlKFwiLi9wb2xpY2llcy9tdWx0aXBhcnRQb2xpY3kuanNcIik7XG5jb25zdCBkZWNvbXByZXNzUmVzcG9uc2VQb2xpY3lfanNfMSA9IHJlcXVpcmUoXCIuL3BvbGljaWVzL2RlY29tcHJlc3NSZXNwb25zZVBvbGljeS5qc1wiKTtcbmNvbnN0IGRlZmF1bHRSZXRyeVBvbGljeV9qc18xID0gcmVxdWlyZShcIi4vcG9saWNpZXMvZGVmYXVsdFJldHJ5UG9saWN5LmpzXCIpO1xuY29uc3QgZm9ybURhdGFQb2xpY3lfanNfMSA9IHJlcXVpcmUoXCIuL3BvbGljaWVzL2Zvcm1EYXRhUG9saWN5LmpzXCIpO1xuY29uc3QgY29yZV91dGlsXzEgPSByZXF1aXJlKFwiQGF6dXJlL2NvcmUtdXRpbFwiKTtcbmNvbnN0IHByb3h5UG9saWN5X2pzXzEgPSByZXF1aXJlKFwiLi9wb2xpY2llcy9wcm94eVBvbGljeS5qc1wiKTtcbmNvbnN0IHNldENsaWVudFJlcXVlc3RJZFBvbGljeV9qc18xID0gcmVxdWlyZShcIi4vcG9saWNpZXMvc2V0Q2xpZW50UmVxdWVzdElkUG9saWN5LmpzXCIpO1xuY29uc3QgdGxzUG9saWN5X2pzXzEgPSByZXF1aXJlKFwiLi9wb2xpY2llcy90bHNQb2xpY3kuanNcIik7XG5jb25zdCB0cmFjaW5nUG9saWN5X2pzXzEgPSByZXF1aXJlKFwiLi9wb2xpY2llcy90cmFjaW5nUG9saWN5LmpzXCIpO1xuLyoqXG4gKiBDcmVhdGUgYSBuZXcgcGlwZWxpbmUgd2l0aCBhIGRlZmF1bHQgc2V0IG9mIGN1c3RvbWl6YWJsZSBwb2xpY2llcy5cbiAqIEBwYXJhbSBvcHRpb25zIC0gT3B0aW9ucyB0byBjb25maWd1cmUgYSBjdXN0b20gcGlwZWxpbmUuXG4gKi9cbmZ1bmN0aW9uIGNyZWF0ZVBpcGVsaW5lRnJvbU9wdGlvbnMob3B0aW9ucykge1xuICAgIHZhciBfYTtcbiAgICBjb25zdCBwaXBlbGluZSA9ICgwLCBwaXBlbGluZV9qc18xLmNyZWF0ZUVtcHR5UGlwZWxpbmUpKCk7XG4gICAgaWYgKGNvcmVfdXRpbF8xLmlzTm9kZUxpa2UpIHtcbiAgICAgICAgaWYgKG9wdGlvbnMudGxzT3B0aW9ucykge1xuICAgICAgICAgICAgcGlwZWxpbmUuYWRkUG9saWN5KCgwLCB0bHNQb2xpY3lfanNfMS50bHNQb2xpY3kpKG9wdGlvbnMudGxzT3B0aW9ucykpO1xuICAgICAgICB9XG4gICAgICAgIHBpcGVsaW5lLmFkZFBvbGljeSgoMCwgcHJveHlQb2xpY3lfanNfMS5wcm94eVBvbGljeSkob3B0aW9ucy5wcm94eU9wdGlvbnMpKTtcbiAgICAgICAgcGlwZWxpbmUuYWRkUG9saWN5KCgwLCBkZWNvbXByZXNzUmVzcG9uc2VQb2xpY3lfanNfMS5kZWNvbXByZXNzUmVzcG9uc2VQb2xpY3kpKCkpO1xuICAgIH1cbiAgICBwaXBlbGluZS5hZGRQb2xpY3koKDAsIGZvcm1EYXRhUG9saWN5X2pzXzEuZm9ybURhdGFQb2xpY3kpKCksIHsgYmVmb3JlUG9saWNpZXM6IFttdWx0aXBhcnRQb2xpY3lfanNfMS5tdWx0aXBhcnRQb2xpY3lOYW1lXSB9KTtcbiAgICBwaXBlbGluZS5hZGRQb2xpY3koKDAsIHVzZXJBZ2VudFBvbGljeV9qc18xLnVzZXJBZ2VudFBvbGljeSkob3B0aW9ucy51c2VyQWdlbnRPcHRpb25zKSk7XG4gICAgcGlwZWxpbmUuYWRkUG9saWN5KCgwLCBzZXRDbGllbnRSZXF1ZXN0SWRQb2xpY3lfanNfMS5zZXRDbGllbnRSZXF1ZXN0SWRQb2xpY3kpKChfYSA9IG9wdGlvbnMudGVsZW1ldHJ5T3B0aW9ucykgPT09IG51bGwgfHwgX2EgPT09IHZvaWQgMCA/IHZvaWQgMCA6IF9hLmNsaWVudFJlcXVlc3RJZEhlYWRlck5hbWUpKTtcbiAgICAvLyBUaGUgbXVsdGlwYXJ0IHBvbGljeSBpcyBhZGRlZCBhZnRlciBwb2xpY2llcyB3aXRoIG5vIHBoYXNlLCBzbyB0aGF0XG4gICAgLy8gcG9saWNpZXMgY2FuIGJlIGFkZGVkIGJldHdlZW4gaXQgYW5kIGZvcm1EYXRhUG9saWN5IHRvIG1vZGlmeVxuICAgIC8vIHByb3BlcnRpZXMgKGUuZy4sIG1ha2luZyB0aGUgYm91bmRhcnkgY29uc3RhbnQgaW4gcmVjb3JkZWQgdGVzdHMpLlxuICAgIHBpcGVsaW5lLmFkZFBvbGljeSgoMCwgbXVsdGlwYXJ0UG9saWN5X2pzXzEubXVsdGlwYXJ0UG9saWN5KSgpLCB7IGFmdGVyUGhhc2U6IFwiRGVzZXJpYWxpemVcIiB9KTtcbiAgICBwaXBlbGluZS5hZGRQb2xpY3koKDAsIGRlZmF1bHRSZXRyeVBvbGljeV9qc18xLmRlZmF1bHRSZXRyeVBvbGljeSkob3B0aW9ucy5yZXRyeU9wdGlvbnMpLCB7IHBoYXNlOiBcIlJldHJ5XCIgfSk7XG4gICAgcGlwZWxpbmUuYWRkUG9saWN5KCgwLCB0cmFjaW5nUG9saWN5X2pzXzEudHJhY2luZ1BvbGljeSkoT2JqZWN0LmFzc2lnbihPYmplY3QuYXNzaWduKHt9LCBvcHRpb25zLnVzZXJBZ2VudE9wdGlvbnMpLCBvcHRpb25zLmxvZ2dpbmdPcHRpb25zKSksIHtcbiAgICAgICAgYWZ0ZXJQaGFzZTogXCJSZXRyeVwiLFxuICAgIH0pO1xuICAgIGlmIChjb3JlX3V0aWxfMS5pc05vZGVMaWtlKSB7XG4gICAgICAgIC8vIEJvdGggWEhSIGFuZCBGZXRjaCBleHBlY3QgdG8gaGFuZGxlIHJlZGlyZWN0cyBhdXRvbWF0aWNhbGx5LFxuICAgICAgICAvLyBzbyBvbmx5IGluY2x1ZGUgdGhpcyBwb2xpY3kgd2hlbiB3ZSdyZSBpbiBOb2RlLlxuICAgICAgICBwaXBlbGluZS5hZGRQb2xpY3koKDAsIHJlZGlyZWN0UG9saWN5X2pzXzEucmVkaXJlY3RQb2xpY3kpKG9wdGlvbnMucmVkaXJlY3RPcHRpb25zKSwgeyBhZnRlclBoYXNlOiBcIlJldHJ5XCIgfSk7XG4gICAgfVxuICAgIHBpcGVsaW5lLmFkZFBvbGljeSgoMCwgbG9nUG9saWN5X2pzXzEubG9nUG9saWN5KShvcHRpb25zLmxvZ2dpbmdPcHRpb25zKSwgeyBhZnRlclBoYXNlOiBcIlNpZ25cIiB9KTtcbiAgICByZXR1cm4gcGlwZWxpbmU7XG59XG4vLyMgc291cmNlTWFwcGluZ1VSTD1jcmVhdGVQaXBlbGluZUZyb21PcHRpb25zLmpzLm1hcCIsCiAgICAiXCJ1c2Ugc3RyaWN0XCI7XG4vLyBDb3B5cmlnaHQgKGMpIE1pY3Jvc29mdCBDb3Jwb3JhdGlvbi5cbi8vIExpY2Vuc2VkIHVuZGVyIHRoZSBNSVQgTGljZW5zZS5cbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIl9fZXNNb2R1bGVcIiwgeyB2YWx1ZTogdHJ1ZSB9KTtcbmV4cG9ydHMuZ2V0Qm9keUxlbmd0aCA9IGdldEJvZHlMZW5ndGg7XG5leHBvcnRzLmNyZWF0ZU5vZGVIdHRwQ2xpZW50ID0gY3JlYXRlTm9kZUh0dHBDbGllbnQ7XG5jb25zdCB0c2xpYl8xID0gcmVxdWlyZShcInRzbGliXCIpO1xuY29uc3QgaHR0cCA9IHRzbGliXzEuX19pbXBvcnRTdGFyKHJlcXVpcmUoXCJub2RlOmh0dHBcIikpO1xuY29uc3QgaHR0cHMgPSB0c2xpYl8xLl9faW1wb3J0U3RhcihyZXF1aXJlKFwibm9kZTpodHRwc1wiKSk7XG5jb25zdCB6bGliID0gdHNsaWJfMS5fX2ltcG9ydFN0YXIocmVxdWlyZShcIm5vZGU6emxpYlwiKSk7XG5jb25zdCBub2RlX3N0cmVhbV8xID0gcmVxdWlyZShcIm5vZGU6c3RyZWFtXCIpO1xuY29uc3QgYWJvcnRfY29udHJvbGxlcl8xID0gcmVxdWlyZShcIkBhenVyZS9hYm9ydC1jb250cm9sbGVyXCIpO1xuY29uc3QgaHR0cEhlYWRlcnNfanNfMSA9IHJlcXVpcmUoXCIuL2h0dHBIZWFkZXJzLmpzXCIpO1xuY29uc3QgcmVzdEVycm9yX2pzXzEgPSByZXF1aXJlKFwiLi9yZXN0RXJyb3IuanNcIik7XG5jb25zdCBsb2dfanNfMSA9IHJlcXVpcmUoXCIuL2xvZy5qc1wiKTtcbmNvbnN0IERFRkFVTFRfVExTX1NFVFRJTkdTID0ge307XG5mdW5jdGlvbiBpc1JlYWRhYmxlU3RyZWFtKGJvZHkpIHtcbiAgICByZXR1cm4gYm9keSAmJiB0eXBlb2YgYm9keS5waXBlID09PSBcImZ1bmN0aW9uXCI7XG59XG5mdW5jdGlvbiBpc1N0cmVhbUNvbXBsZXRlKHN0cmVhbSkge1xuICAgIHJldHVybiBuZXcgUHJvbWlzZSgocmVzb2x2ZSkgPT4ge1xuICAgICAgICBjb25zdCBoYW5kbGVyID0gKCkgPT4ge1xuICAgICAgICAgICAgcmVzb2x2ZSgpO1xuICAgICAgICAgICAgc3RyZWFtLnJlbW92ZUxpc3RlbmVyKFwiY2xvc2VcIiwgaGFuZGxlcik7XG4gICAgICAgICAgICBzdHJlYW0ucmVtb3ZlTGlzdGVuZXIoXCJlbmRcIiwgaGFuZGxlcik7XG4gICAgICAgICAgICBzdHJlYW0ucmVtb3ZlTGlzdGVuZXIoXCJlcnJvclwiLCBoYW5kbGVyKTtcbiAgICAgICAgfTtcbiAgICAgICAgc3RyZWFtLm9uKFwiY2xvc2VcIiwgaGFuZGxlcik7XG4gICAgICAgIHN0cmVhbS5vbihcImVuZFwiLCBoYW5kbGVyKTtcbiAgICAgICAgc3RyZWFtLm9uKFwiZXJyb3JcIiwgaGFuZGxlcik7XG4gICAgfSk7XG59XG5mdW5jdGlvbiBpc0FycmF5QnVmZmVyKGJvZHkpIHtcbiAgICByZXR1cm4gYm9keSAmJiB0eXBlb2YgYm9keS5ieXRlTGVuZ3RoID09PSBcIm51bWJlclwiO1xufVxuY2xhc3MgUmVwb3J0VHJhbnNmb3JtIGV4dGVuZHMgbm9kZV9zdHJlYW1fMS5UcmFuc2Zvcm0ge1xuICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tdW5zYWZlLWZ1bmN0aW9uLXR5cGVcbiAgICBfdHJhbnNmb3JtKGNodW5rLCBfZW5jb2RpbmcsIGNhbGxiYWNrKSB7XG4gICAgICAgIHRoaXMucHVzaChjaHVuayk7XG4gICAgICAgIHRoaXMubG9hZGVkQnl0ZXMgKz0gY2h1bmsubGVuZ3RoO1xuICAgICAgICB0cnkge1xuICAgICAgICAgICAgdGhpcy5wcm9ncmVzc0NhbGxiYWNrKHsgbG9hZGVkQnl0ZXM6IHRoaXMubG9hZGVkQnl0ZXMgfSk7XG4gICAgICAgICAgICBjYWxsYmFjaygpO1xuICAgICAgICB9XG4gICAgICAgIGNhdGNoIChlKSB7XG4gICAgICAgICAgICBjYWxsYmFjayhlKTtcbiAgICAgICAgfVxuICAgIH1cbiAgICBjb25zdHJ1Y3Rvcihwcm9ncmVzc0NhbGxiYWNrKSB7XG4gICAgICAgIHN1cGVyKCk7XG4gICAgICAgIHRoaXMubG9hZGVkQnl0ZXMgPSAwO1xuICAgICAgICB0aGlzLnByb2dyZXNzQ2FsbGJhY2sgPSBwcm9ncmVzc0NhbGxiYWNrO1xuICAgIH1cbn1cbi8qKlxuICogQSBIdHRwQ2xpZW50IGltcGxlbWVudGF0aW9uIHRoYXQgdXNlcyBOb2RlJ3MgXCJodHRwc1wiIG1vZHVsZSB0byBzZW5kIEhUVFBTIHJlcXVlc3RzLlxuICogQGludGVybmFsXG4gKi9cbmNsYXNzIE5vZGVIdHRwQ2xpZW50IHtcbiAgICBjb25zdHJ1Y3RvcigpIHtcbiAgICAgICAgdGhpcy5jYWNoZWRIdHRwc0FnZW50cyA9IG5ldyBXZWFrTWFwKCk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIE1ha2VzIGEgcmVxdWVzdCBvdmVyIGFuIHVuZGVybHlpbmcgdHJhbnNwb3J0IGxheWVyIGFuZCByZXR1cm5zIHRoZSByZXNwb25zZS5cbiAgICAgKiBAcGFyYW0gcmVxdWVzdCAtIFRoZSByZXF1ZXN0IHRvIGJlIG1hZGUuXG4gICAgICovXG4gICAgYXN5bmMgc2VuZFJlcXVlc3QocmVxdWVzdCkge1xuICAgICAgICB2YXIgX2EsIF9iLCBfYztcbiAgICAgICAgY29uc3QgYWJvcnRDb250cm9sbGVyID0gbmV3IEFib3J0Q29udHJvbGxlcigpO1xuICAgICAgICBsZXQgYWJvcnRMaXN0ZW5lcjtcbiAgICAgICAgaWYgKHJlcXVlc3QuYWJvcnRTaWduYWwpIHtcbiAgICAgICAgICAgIGlmIChyZXF1ZXN0LmFib3J0U2lnbmFsLmFib3J0ZWQpIHtcbiAgICAgICAgICAgICAgICB0aHJvdyBuZXcgYWJvcnRfY29udHJvbGxlcl8xLkFib3J0RXJyb3IoXCJUaGUgb3BlcmF0aW9uIHdhcyBhYm9ydGVkLlwiKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGFib3J0TGlzdGVuZXIgPSAoZXZlbnQpID0+IHtcbiAgICAgICAgICAgICAgICBpZiAoZXZlbnQudHlwZSA9PT0gXCJhYm9ydFwiKSB7XG4gICAgICAgICAgICAgICAgICAgIGFib3J0Q29udHJvbGxlci5hYm9ydCgpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH07XG4gICAgICAgICAgICByZXF1ZXN0LmFib3J0U2lnbmFsLmFkZEV2ZW50TGlzdGVuZXIoXCJhYm9ydFwiLCBhYm9ydExpc3RlbmVyKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAocmVxdWVzdC50aW1lb3V0ID4gMCkge1xuICAgICAgICAgICAgc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICAgICAgICAgICAgYWJvcnRDb250cm9sbGVyLmFib3J0KCk7XG4gICAgICAgICAgICB9LCByZXF1ZXN0LnRpbWVvdXQpO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IGFjY2VwdEVuY29kaW5nID0gcmVxdWVzdC5oZWFkZXJzLmdldChcIkFjY2VwdC1FbmNvZGluZ1wiKTtcbiAgICAgICAgY29uc3Qgc2hvdWxkRGVjb21wcmVzcyA9IChhY2NlcHRFbmNvZGluZyA9PT0gbnVsbCB8fCBhY2NlcHRFbmNvZGluZyA9PT0gdm9pZCAwID8gdm9pZCAwIDogYWNjZXB0RW5jb2RpbmcuaW5jbHVkZXMoXCJnemlwXCIpKSB8fCAoYWNjZXB0RW5jb2RpbmcgPT09IG51bGwgfHwgYWNjZXB0RW5jb2RpbmcgPT09IHZvaWQgMCA/IHZvaWQgMCA6IGFjY2VwdEVuY29kaW5nLmluY2x1ZGVzKFwiZGVmbGF0ZVwiKSk7XG4gICAgICAgIGxldCBib2R5ID0gdHlwZW9mIHJlcXVlc3QuYm9keSA9PT0gXCJmdW5jdGlvblwiID8gcmVxdWVzdC5ib2R5KCkgOiByZXF1ZXN0LmJvZHk7XG4gICAgICAgIGlmIChib2R5ICYmICFyZXF1ZXN0LmhlYWRlcnMuaGFzKFwiQ29udGVudC1MZW5ndGhcIikpIHtcbiAgICAgICAgICAgIGNvbnN0IGJvZHlMZW5ndGggPSBnZXRCb2R5TGVuZ3RoKGJvZHkpO1xuICAgICAgICAgICAgaWYgKGJvZHlMZW5ndGggIT09IG51bGwpIHtcbiAgICAgICAgICAgICAgICByZXF1ZXN0LmhlYWRlcnMuc2V0KFwiQ29udGVudC1MZW5ndGhcIiwgYm9keUxlbmd0aCk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgbGV0IHJlc3BvbnNlU3RyZWFtO1xuICAgICAgICB0cnkge1xuICAgICAgICAgICAgaWYgKGJvZHkgJiYgcmVxdWVzdC5vblVwbG9hZFByb2dyZXNzKSB7XG4gICAgICAgICAgICAgICAgY29uc3Qgb25VcGxvYWRQcm9ncmVzcyA9IHJlcXVlc3Qub25VcGxvYWRQcm9ncmVzcztcbiAgICAgICAgICAgICAgICBjb25zdCB1cGxvYWRSZXBvcnRTdHJlYW0gPSBuZXcgUmVwb3J0VHJhbnNmb3JtKG9uVXBsb2FkUHJvZ3Jlc3MpO1xuICAgICAgICAgICAgICAgIHVwbG9hZFJlcG9ydFN0cmVhbS5vbihcImVycm9yXCIsIChlKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgIGxvZ19qc18xLmxvZ2dlci5lcnJvcihcIkVycm9yIGluIHVwbG9hZCBwcm9ncmVzc1wiLCBlKTtcbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICBpZiAoaXNSZWFkYWJsZVN0cmVhbShib2R5KSkge1xuICAgICAgICAgICAgICAgICAgICBib2R5LnBpcGUodXBsb2FkUmVwb3J0U3RyZWFtKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIHVwbG9hZFJlcG9ydFN0cmVhbS5lbmQoYm9keSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGJvZHkgPSB1cGxvYWRSZXBvcnRTdHJlYW07XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBjb25zdCByZXMgPSBhd2FpdCB0aGlzLm1ha2VSZXF1ZXN0KHJlcXVlc3QsIGFib3J0Q29udHJvbGxlciwgYm9keSk7XG4gICAgICAgICAgICBjb25zdCBoZWFkZXJzID0gZ2V0UmVzcG9uc2VIZWFkZXJzKHJlcyk7XG4gICAgICAgICAgICBjb25zdCBzdGF0dXMgPSAoX2EgPSByZXMuc3RhdHVzQ29kZSkgIT09IG51bGwgJiYgX2EgIT09IHZvaWQgMCA/IF9hIDogMDtcbiAgICAgICAgICAgIGNvbnN0IHJlc3BvbnNlID0ge1xuICAgICAgICAgICAgICAgIHN0YXR1cyxcbiAgICAgICAgICAgICAgICBoZWFkZXJzLFxuICAgICAgICAgICAgICAgIHJlcXVlc3QsXG4gICAgICAgICAgICB9O1xuICAgICAgICAgICAgLy8gUmVzcG9uc2VzIHRvIEhFQUQgbXVzdCBub3QgaGF2ZSBhIGJvZHkuXG4gICAgICAgICAgICAvLyBJZiB0aGV5IGRvIHJldHVybiBhIGJvZHksIHRoYXQgYm9keSBtdXN0IGJlIGlnbm9yZWQuXG4gICAgICAgICAgICBpZiAocmVxdWVzdC5tZXRob2QgPT09IFwiSEVBRFwiKSB7XG4gICAgICAgICAgICAgICAgLy8gY2FsbCByZXN1bWUoKSBhbmQgbm90IGRlc3Ryb3koKSB0byBhdm9pZCBjbG9zaW5nIHRoZSBzb2NrZXRcbiAgICAgICAgICAgICAgICAvLyBhbmQgbG9zaW5nIGtlZXAgYWxpdmVcbiAgICAgICAgICAgICAgICByZXMucmVzdW1lKCk7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHJlc3BvbnNlO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmVzcG9uc2VTdHJlYW0gPSBzaG91bGREZWNvbXByZXNzID8gZ2V0RGVjb2RlZFJlc3BvbnNlU3RyZWFtKHJlcywgaGVhZGVycykgOiByZXM7XG4gICAgICAgICAgICBjb25zdCBvbkRvd25sb2FkUHJvZ3Jlc3MgPSByZXF1ZXN0Lm9uRG93bmxvYWRQcm9ncmVzcztcbiAgICAgICAgICAgIGlmIChvbkRvd25sb2FkUHJvZ3Jlc3MpIHtcbiAgICAgICAgICAgICAgICBjb25zdCBkb3dubG9hZFJlcG9ydFN0cmVhbSA9IG5ldyBSZXBvcnRUcmFuc2Zvcm0ob25Eb3dubG9hZFByb2dyZXNzKTtcbiAgICAgICAgICAgICAgICBkb3dubG9hZFJlcG9ydFN0cmVhbS5vbihcImVycm9yXCIsIChlKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgIGxvZ19qc18xLmxvZ2dlci5lcnJvcihcIkVycm9yIGluIGRvd25sb2FkIHByb2dyZXNzXCIsIGUpO1xuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgIHJlc3BvbnNlU3RyZWFtLnBpcGUoZG93bmxvYWRSZXBvcnRTdHJlYW0pO1xuICAgICAgICAgICAgICAgIHJlc3BvbnNlU3RyZWFtID0gZG93bmxvYWRSZXBvcnRTdHJlYW07XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAoXG4gICAgICAgICAgICAvLyBWYWx1ZSBvZiBQT1NJVElWRV9JTkZJTklUWSBpbiBzdHJlYW1SZXNwb25zZVN0YXR1c0NvZGVzIGlzIGNvbnNpZGVyZWQgYXMgYW55IHN0YXR1cyBjb2RlXG4gICAgICAgICAgICAoKF9iID0gcmVxdWVzdC5zdHJlYW1SZXNwb25zZVN0YXR1c0NvZGVzKSA9PT0gbnVsbCB8fCBfYiA9PT0gdm9pZCAwID8gdm9pZCAwIDogX2IuaGFzKE51bWJlci5QT1NJVElWRV9JTkZJTklUWSkpIHx8XG4gICAgICAgICAgICAgICAgKChfYyA9IHJlcXVlc3Quc3RyZWFtUmVzcG9uc2VTdGF0dXNDb2RlcykgPT09IG51bGwgfHwgX2MgPT09IHZvaWQgMCA/IHZvaWQgMCA6IF9jLmhhcyhyZXNwb25zZS5zdGF0dXMpKSkge1xuICAgICAgICAgICAgICAgIHJlc3BvbnNlLnJlYWRhYmxlU3RyZWFtQm9keSA9IHJlc3BvbnNlU3RyZWFtO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgcmVzcG9uc2UuYm9keUFzVGV4dCA9IGF3YWl0IHN0cmVhbVRvVGV4dChyZXNwb25zZVN0cmVhbSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4gcmVzcG9uc2U7XG4gICAgICAgIH1cbiAgICAgICAgZmluYWxseSB7XG4gICAgICAgICAgICAvLyBjbGVhbiB1cCBldmVudCBsaXN0ZW5lclxuICAgICAgICAgICAgaWYgKHJlcXVlc3QuYWJvcnRTaWduYWwgJiYgYWJvcnRMaXN0ZW5lcikge1xuICAgICAgICAgICAgICAgIGxldCB1cGxvYWRTdHJlYW1Eb25lID0gUHJvbWlzZS5yZXNvbHZlKCk7XG4gICAgICAgICAgICAgICAgaWYgKGlzUmVhZGFibGVTdHJlYW0oYm9keSkpIHtcbiAgICAgICAgICAgICAgICAgICAgdXBsb2FkU3RyZWFtRG9uZSA9IGlzU3RyZWFtQ29tcGxldGUoYm9keSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGxldCBkb3dubG9hZFN0cmVhbURvbmUgPSBQcm9taXNlLnJlc29sdmUoKTtcbiAgICAgICAgICAgICAgICBpZiAoaXNSZWFkYWJsZVN0cmVhbShyZXNwb25zZVN0cmVhbSkpIHtcbiAgICAgICAgICAgICAgICAgICAgZG93bmxvYWRTdHJlYW1Eb25lID0gaXNTdHJlYW1Db21wbGV0ZShyZXNwb25zZVN0cmVhbSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIFByb21pc2UuYWxsKFt1cGxvYWRTdHJlYW1Eb25lLCBkb3dubG9hZFN0cmVhbURvbmVdKVxuICAgICAgICAgICAgICAgICAgICAudGhlbigoKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgIHZhciBfYTtcbiAgICAgICAgICAgICAgICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIHByb21pc2UvYWx3YXlzLXJldHVyblxuICAgICAgICAgICAgICAgICAgICBpZiAoYWJvcnRMaXN0ZW5lcikge1xuICAgICAgICAgICAgICAgICAgICAgICAgKF9hID0gcmVxdWVzdC5hYm9ydFNpZ25hbCkgPT09IG51bGwgfHwgX2EgPT09IHZvaWQgMCA/IHZvaWQgMCA6IF9hLnJlbW92ZUV2ZW50TGlzdGVuZXIoXCJhYm9ydFwiLCBhYm9ydExpc3RlbmVyKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH0pXG4gICAgICAgICAgICAgICAgICAgIC5jYXRjaCgoZSkgPT4ge1xuICAgICAgICAgICAgICAgICAgICBsb2dfanNfMS5sb2dnZXIud2FybmluZyhcIkVycm9yIHdoZW4gY2xlYW5pbmcgdXAgYWJvcnRMaXN0ZW5lciBvbiBodHRwUmVxdWVzdFwiLCBlKTtcbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cbiAgICBtYWtlUmVxdWVzdChyZXF1ZXN0LCBhYm9ydENvbnRyb2xsZXIsIGJvZHkpIHtcbiAgICAgICAgdmFyIF9hO1xuICAgICAgICBjb25zdCB1cmwgPSBuZXcgVVJMKHJlcXVlc3QudXJsKTtcbiAgICAgICAgY29uc3QgaXNJbnNlY3VyZSA9IHVybC5wcm90b2NvbCAhPT0gXCJodHRwczpcIjtcbiAgICAgICAgaWYgKGlzSW5zZWN1cmUgJiYgIXJlcXVlc3QuYWxsb3dJbnNlY3VyZUNvbm5lY3Rpb24pIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihgQ2Fubm90IGNvbm5lY3QgdG8gJHtyZXF1ZXN0LnVybH0gd2hpbGUgYWxsb3dJbnNlY3VyZUNvbm5lY3Rpb24gaXMgZmFsc2UuYCk7XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgYWdlbnQgPSAoX2EgPSByZXF1ZXN0LmFnZW50KSAhPT0gbnVsbCAmJiBfYSAhPT0gdm9pZCAwID8gX2EgOiB0aGlzLmdldE9yQ3JlYXRlQWdlbnQocmVxdWVzdCwgaXNJbnNlY3VyZSk7XG4gICAgICAgIGNvbnN0IG9wdGlvbnMgPSB7XG4gICAgICAgICAgICBhZ2VudCxcbiAgICAgICAgICAgIGhvc3RuYW1lOiB1cmwuaG9zdG5hbWUsXG4gICAgICAgICAgICBwYXRoOiBgJHt1cmwucGF0aG5hbWV9JHt1cmwuc2VhcmNofWAsXG4gICAgICAgICAgICBwb3J0OiB1cmwucG9ydCxcbiAgICAgICAgICAgIG1ldGhvZDogcmVxdWVzdC5tZXRob2QsXG4gICAgICAgICAgICBoZWFkZXJzOiByZXF1ZXN0LmhlYWRlcnMudG9KU09OKHsgcHJlc2VydmVDYXNlOiB0cnVlIH0pLFxuICAgICAgICB9O1xuICAgICAgICByZXR1cm4gbmV3IFByb21pc2UoKHJlc29sdmUsIHJlamVjdCkgPT4ge1xuICAgICAgICAgICAgY29uc3QgcmVxID0gaXNJbnNlY3VyZSA/IGh0dHAucmVxdWVzdChvcHRpb25zLCByZXNvbHZlKSA6IGh0dHBzLnJlcXVlc3Qob3B0aW9ucywgcmVzb2x2ZSk7XG4gICAgICAgICAgICByZXEub25jZShcImVycm9yXCIsIChlcnIpID0+IHtcbiAgICAgICAgICAgICAgICB2YXIgX2E7XG4gICAgICAgICAgICAgICAgcmVqZWN0KG5ldyByZXN0RXJyb3JfanNfMS5SZXN0RXJyb3IoZXJyLm1lc3NhZ2UsIHsgY29kZTogKF9hID0gZXJyLmNvZGUpICE9PSBudWxsICYmIF9hICE9PSB2b2lkIDAgPyBfYSA6IHJlc3RFcnJvcl9qc18xLlJlc3RFcnJvci5SRVFVRVNUX1NFTkRfRVJST1IsIHJlcXVlc3QgfSkpO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICBhYm9ydENvbnRyb2xsZXIuc2lnbmFsLmFkZEV2ZW50TGlzdGVuZXIoXCJhYm9ydFwiLCAoKSA9PiB7XG4gICAgICAgICAgICAgICAgY29uc3QgYWJvcnRFcnJvciA9IG5ldyBhYm9ydF9jb250cm9sbGVyXzEuQWJvcnRFcnJvcihcIlRoZSBvcGVyYXRpb24gd2FzIGFib3J0ZWQuXCIpO1xuICAgICAgICAgICAgICAgIHJlcS5kZXN0cm95KGFib3J0RXJyb3IpO1xuICAgICAgICAgICAgICAgIHJlamVjdChhYm9ydEVycm9yKTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgaWYgKGJvZHkgJiYgaXNSZWFkYWJsZVN0cmVhbShib2R5KSkge1xuICAgICAgICAgICAgICAgIGJvZHkucGlwZShyZXEpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSBpZiAoYm9keSkge1xuICAgICAgICAgICAgICAgIGlmICh0eXBlb2YgYm9keSA9PT0gXCJzdHJpbmdcIiB8fCBCdWZmZXIuaXNCdWZmZXIoYm9keSkpIHtcbiAgICAgICAgICAgICAgICAgICAgcmVxLmVuZChib2R5KTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgZWxzZSBpZiAoaXNBcnJheUJ1ZmZlcihib2R5KSkge1xuICAgICAgICAgICAgICAgICAgICByZXEuZW5kKEFycmF5QnVmZmVyLmlzVmlldyhib2R5KSA/IEJ1ZmZlci5mcm9tKGJvZHkuYnVmZmVyKSA6IEJ1ZmZlci5mcm9tKGJvZHkpKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIGxvZ19qc18xLmxvZ2dlci5lcnJvcihcIlVucmVjb2duaXplZCBib2R5IHR5cGVcIiwgYm9keSk7XG4gICAgICAgICAgICAgICAgICAgIHJlamVjdChuZXcgcmVzdEVycm9yX2pzXzEuUmVzdEVycm9yKFwiVW5yZWNvZ25pemVkIGJvZHkgdHlwZVwiKSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgLy8gc3RyZWFtcyBkb24ndCBsaWtlIFwidW5kZWZpbmVkXCIgYmVpbmcgcGFzc2VkIGFzIGRhdGFcbiAgICAgICAgICAgICAgICByZXEuZW5kKCk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgIH1cbiAgICBnZXRPckNyZWF0ZUFnZW50KHJlcXVlc3QsIGlzSW5zZWN1cmUpIHtcbiAgICAgICAgdmFyIF9hO1xuICAgICAgICBjb25zdCBkaXNhYmxlS2VlcEFsaXZlID0gcmVxdWVzdC5kaXNhYmxlS2VlcEFsaXZlO1xuICAgICAgICAvLyBIYW5kbGUgSW5zZWN1cmUgcmVxdWVzdHMgZmlyc3RcbiAgICAgICAgaWYgKGlzSW5zZWN1cmUpIHtcbiAgICAgICAgICAgIGlmIChkaXNhYmxlS2VlcEFsaXZlKSB7XG4gICAgICAgICAgICAgICAgLy8ga2VlcEFsaXZlOmZhbHNlIGlzIHRoZSBkZWZhdWx0IHNvIHdlIGRvbid0IG5lZWQgYSBjdXN0b20gQWdlbnRcbiAgICAgICAgICAgICAgICByZXR1cm4gaHR0cC5nbG9iYWxBZ2VudDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmICghdGhpcy5jYWNoZWRIdHRwQWdlbnQpIHtcbiAgICAgICAgICAgICAgICAvLyBJZiB0aGVyZSBpcyBubyBjYWNoZWQgYWdlbnQgY3JlYXRlIGEgbmV3IG9uZSBhbmQgY2FjaGUgaXQuXG4gICAgICAgICAgICAgICAgdGhpcy5jYWNoZWRIdHRwQWdlbnQgPSBuZXcgaHR0cC5BZ2VudCh7IGtlZXBBbGl2ZTogdHJ1ZSB9KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiB0aGlzLmNhY2hlZEh0dHBBZ2VudDtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIGlmIChkaXNhYmxlS2VlcEFsaXZlICYmICFyZXF1ZXN0LnRsc1NldHRpbmdzKSB7XG4gICAgICAgICAgICAgICAgLy8gV2hlbiB0aGVyZSBhcmUgbm8gdGxzU2V0dGluZ3MgYW5kIGtlZXBBbGl2ZSBpcyBmYWxzZVxuICAgICAgICAgICAgICAgIC8vIHdlIGRvbid0IG5lZWQgYSBjdXN0b20gYWdlbnRcbiAgICAgICAgICAgICAgICByZXR1cm4gaHR0cHMuZ2xvYmFsQWdlbnQ7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICAvLyBXZSB1c2UgdGhlIHRsc1NldHRpbmdzIHRvIGluZGV4IGNhY2hlZCBjbGllbnRzXG4gICAgICAgICAgICBjb25zdCB0bHNTZXR0aW5ncyA9IChfYSA9IHJlcXVlc3QudGxzU2V0dGluZ3MpICE9PSBudWxsICYmIF9hICE9PSB2b2lkIDAgPyBfYSA6IERFRkFVTFRfVExTX1NFVFRJTkdTO1xuICAgICAgICAgICAgLy8gR2V0IHRoZSBjYWNoZWQgYWdlbnQgb3IgY3JlYXRlIGEgbmV3IG9uZSB3aXRoIHRoZVxuICAgICAgICAgICAgLy8gcHJvdmlkZWQgdmFsdWVzIGZvciBrZWVwQWxpdmUgYW5kIHRsc1NldHRpbmdzXG4gICAgICAgICAgICBsZXQgYWdlbnQgPSB0aGlzLmNhY2hlZEh0dHBzQWdlbnRzLmdldCh0bHNTZXR0aW5ncyk7XG4gICAgICAgICAgICBpZiAoYWdlbnQgJiYgYWdlbnQub3B0aW9ucy5rZWVwQWxpdmUgPT09ICFkaXNhYmxlS2VlcEFsaXZlKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGFnZW50O1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgbG9nX2pzXzEubG9nZ2VyLmluZm8oXCJObyBjYWNoZWQgVExTIEFnZW50IGV4aXN0LCBjcmVhdGluZyBhIG5ldyBBZ2VudFwiKTtcbiAgICAgICAgICAgIGFnZW50ID0gbmV3IGh0dHBzLkFnZW50KE9iamVjdC5hc3NpZ24oeyBcbiAgICAgICAgICAgICAgICAvLyBrZWVwQWxpdmUgaXMgdHJ1ZSBpZiBkaXNhYmxlS2VlcEFsaXZlIGlzIGZhbHNlLlxuICAgICAgICAgICAgICAgIGtlZXBBbGl2ZTogIWRpc2FibGVLZWVwQWxpdmUgfSwgdGxzU2V0dGluZ3MpKTtcbiAgICAgICAgICAgIHRoaXMuY2FjaGVkSHR0cHNBZ2VudHMuc2V0KHRsc1NldHRpbmdzLCBhZ2VudCk7XG4gICAgICAgICAgICByZXR1cm4gYWdlbnQ7XG4gICAgICAgIH1cbiAgICB9XG59XG5mdW5jdGlvbiBnZXRSZXNwb25zZUhlYWRlcnMocmVzKSB7XG4gICAgY29uc3QgaGVhZGVycyA9ICgwLCBodHRwSGVhZGVyc19qc18xLmNyZWF0ZUh0dHBIZWFkZXJzKSgpO1xuICAgIGZvciAoY29uc3QgaGVhZGVyIG9mIE9iamVjdC5rZXlzKHJlcy5oZWFkZXJzKSkge1xuICAgICAgICBjb25zdCB2YWx1ZSA9IHJlcy5oZWFkZXJzW2hlYWRlcl07XG4gICAgICAgIGlmIChBcnJheS5pc0FycmF5KHZhbHVlKSkge1xuICAgICAgICAgICAgaWYgKHZhbHVlLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgICAgICBoZWFkZXJzLnNldChoZWFkZXIsIHZhbHVlWzBdKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBlbHNlIGlmICh2YWx1ZSkge1xuICAgICAgICAgICAgaGVhZGVycy5zZXQoaGVhZGVyLCB2YWx1ZSk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIGhlYWRlcnM7XG59XG5mdW5jdGlvbiBnZXREZWNvZGVkUmVzcG9uc2VTdHJlYW0oc3RyZWFtLCBoZWFkZXJzKSB7XG4gICAgY29uc3QgY29udGVudEVuY29kaW5nID0gaGVhZGVycy5nZXQoXCJDb250ZW50LUVuY29kaW5nXCIpO1xuICAgIGlmIChjb250ZW50RW5jb2RpbmcgPT09IFwiZ3ppcFwiKSB7XG4gICAgICAgIGNvbnN0IHVuemlwID0gemxpYi5jcmVhdGVHdW56aXAoKTtcbiAgICAgICAgc3RyZWFtLnBpcGUodW56aXApO1xuICAgICAgICByZXR1cm4gdW56aXA7XG4gICAgfVxuICAgIGVsc2UgaWYgKGNvbnRlbnRFbmNvZGluZyA9PT0gXCJkZWZsYXRlXCIpIHtcbiAgICAgICAgY29uc3QgaW5mbGF0ZSA9IHpsaWIuY3JlYXRlSW5mbGF0ZSgpO1xuICAgICAgICBzdHJlYW0ucGlwZShpbmZsYXRlKTtcbiAgICAgICAgcmV0dXJuIGluZmxhdGU7XG4gICAgfVxuICAgIHJldHVybiBzdHJlYW07XG59XG5mdW5jdGlvbiBzdHJlYW1Ub1RleHQoc3RyZWFtKSB7XG4gICAgcmV0dXJuIG5ldyBQcm9taXNlKChyZXNvbHZlLCByZWplY3QpID0+IHtcbiAgICAgICAgY29uc3QgYnVmZmVyID0gW107XG4gICAgICAgIHN0cmVhbS5vbihcImRhdGFcIiwgKGNodW5rKSA9PiB7XG4gICAgICAgICAgICBpZiAoQnVmZmVyLmlzQnVmZmVyKGNodW5rKSkge1xuICAgICAgICAgICAgICAgIGJ1ZmZlci5wdXNoKGNodW5rKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgIGJ1ZmZlci5wdXNoKEJ1ZmZlci5mcm9tKGNodW5rKSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgICAgICBzdHJlYW0ub24oXCJlbmRcIiwgKCkgPT4ge1xuICAgICAgICAgICAgcmVzb2x2ZShCdWZmZXIuY29uY2F0KGJ1ZmZlcikudG9TdHJpbmcoXCJ1dGY4XCIpKTtcbiAgICAgICAgfSk7XG4gICAgICAgIHN0cmVhbS5vbihcImVycm9yXCIsIChlKSA9PiB7XG4gICAgICAgICAgICBpZiAoZSAmJiAoZSA9PT0gbnVsbCB8fCBlID09PSB2b2lkIDAgPyB2b2lkIDAgOiBlLm5hbWUpID09PSBcIkFib3J0RXJyb3JcIikge1xuICAgICAgICAgICAgICAgIHJlamVjdChlKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgIHJlamVjdChuZXcgcmVzdEVycm9yX2pzXzEuUmVzdEVycm9yKGBFcnJvciByZWFkaW5nIHJlc3BvbnNlIGFzIHRleHQ6ICR7ZS5tZXNzYWdlfWAsIHtcbiAgICAgICAgICAgICAgICAgICAgY29kZTogcmVzdEVycm9yX2pzXzEuUmVzdEVycm9yLlBBUlNFX0VSUk9SLFxuICAgICAgICAgICAgICAgIH0pKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgfSk7XG59XG4vKiogQGludGVybmFsICovXG5mdW5jdGlvbiBnZXRCb2R5TGVuZ3RoKGJvZHkpIHtcbiAgICBpZiAoIWJvZHkpIHtcbiAgICAgICAgcmV0dXJuIDA7XG4gICAgfVxuICAgIGVsc2UgaWYgKEJ1ZmZlci5pc0J1ZmZlcihib2R5KSkge1xuICAgICAgICByZXR1cm4gYm9keS5sZW5ndGg7XG4gICAgfVxuICAgIGVsc2UgaWYgKGlzUmVhZGFibGVTdHJlYW0oYm9keSkpIHtcbiAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuICAgIGVsc2UgaWYgKGlzQXJyYXlCdWZmZXIoYm9keSkpIHtcbiAgICAgICAgcmV0dXJuIGJvZHkuYnl0ZUxlbmd0aDtcbiAgICB9XG4gICAgZWxzZSBpZiAodHlwZW9mIGJvZHkgPT09IFwic3RyaW5nXCIpIHtcbiAgICAgICAgcmV0dXJuIEJ1ZmZlci5mcm9tKGJvZHkpLmxlbmd0aDtcbiAgICB9XG4gICAgZWxzZSB7XG4gICAgICAgIHJldHVybiBudWxsO1xuICAgIH1cbn1cbi8qKlxuICogQ3JlYXRlIGEgbmV3IEh0dHBDbGllbnQgaW5zdGFuY2UgZm9yIHRoZSBOb2RlSlMgZW52aXJvbm1lbnQuXG4gKiBAaW50ZXJuYWxcbiAqL1xuZnVuY3Rpb24gY3JlYXRlTm9kZUh0dHBDbGllbnQoKSB7XG4gICAgcmV0dXJuIG5ldyBOb2RlSHR0cENsaWVudCgpO1xufVxuLy8jIHNvdXJjZU1hcHBpbmdVUkw9bm9kZUh0dHBDbGllbnQuanMubWFwIiwKICAgICJcInVzZSBzdHJpY3RcIjtcbi8vIENvcHlyaWdodCAoYykgTWljcm9zb2Z0IENvcnBvcmF0aW9uLlxuLy8gTGljZW5zZWQgdW5kZXIgdGhlIE1JVCBMaWNlbnNlLlxuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiX19lc01vZHVsZVwiLCB7IHZhbHVlOiB0cnVlIH0pO1xuZXhwb3J0cy5jcmVhdGVEZWZhdWx0SHR0cENsaWVudCA9IGNyZWF0ZURlZmF1bHRIdHRwQ2xpZW50O1xuY29uc3Qgbm9kZUh0dHBDbGllbnRfanNfMSA9IHJlcXVpcmUoXCIuL25vZGVIdHRwQ2xpZW50LmpzXCIpO1xuLyoqXG4gKiBDcmVhdGUgdGhlIGNvcnJlY3QgSHR0cENsaWVudCBmb3IgdGhlIGN1cnJlbnQgZW52aXJvbm1lbnQuXG4gKi9cbmZ1bmN0aW9uIGNyZWF0ZURlZmF1bHRIdHRwQ2xpZW50KCkge1xuICAgIHJldHVybiAoMCwgbm9kZUh0dHBDbGllbnRfanNfMS5jcmVhdGVOb2RlSHR0cENsaWVudCkoKTtcbn1cbi8vIyBzb3VyY2VNYXBwaW5nVVJMPWRlZmF1bHRIdHRwQ2xpZW50LmpzLm1hcCIsCiAgICAiXCJ1c2Ugc3RyaWN0XCI7XG4vLyBDb3B5cmlnaHQgKGMpIE1pY3Jvc29mdCBDb3Jwb3JhdGlvbi5cbi8vIExpY2Vuc2VkIHVuZGVyIHRoZSBNSVQgTGljZW5zZS5cbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIl9fZXNNb2R1bGVcIiwgeyB2YWx1ZTogdHJ1ZSB9KTtcbmV4cG9ydHMuY3JlYXRlUGlwZWxpbmVSZXF1ZXN0ID0gY3JlYXRlUGlwZWxpbmVSZXF1ZXN0O1xuY29uc3QgaHR0cEhlYWRlcnNfanNfMSA9IHJlcXVpcmUoXCIuL2h0dHBIZWFkZXJzLmpzXCIpO1xuY29uc3QgY29yZV91dGlsXzEgPSByZXF1aXJlKFwiQGF6dXJlL2NvcmUtdXRpbFwiKTtcbmNsYXNzIFBpcGVsaW5lUmVxdWVzdEltcGwge1xuICAgIGNvbnN0cnVjdG9yKG9wdGlvbnMpIHtcbiAgICAgICAgdmFyIF9hLCBfYiwgX2MsIF9kLCBfZSwgX2YsIF9nO1xuICAgICAgICB0aGlzLnVybCA9IG9wdGlvbnMudXJsO1xuICAgICAgICB0aGlzLmJvZHkgPSBvcHRpb25zLmJvZHk7XG4gICAgICAgIHRoaXMuaGVhZGVycyA9IChfYSA9IG9wdGlvbnMuaGVhZGVycykgIT09IG51bGwgJiYgX2EgIT09IHZvaWQgMCA/IF9hIDogKDAsIGh0dHBIZWFkZXJzX2pzXzEuY3JlYXRlSHR0cEhlYWRlcnMpKCk7XG4gICAgICAgIHRoaXMubWV0aG9kID0gKF9iID0gb3B0aW9ucy5tZXRob2QpICE9PSBudWxsICYmIF9iICE9PSB2b2lkIDAgPyBfYiA6IFwiR0VUXCI7XG4gICAgICAgIHRoaXMudGltZW91dCA9IChfYyA9IG9wdGlvbnMudGltZW91dCkgIT09IG51bGwgJiYgX2MgIT09IHZvaWQgMCA/IF9jIDogMDtcbiAgICAgICAgdGhpcy5tdWx0aXBhcnRCb2R5ID0gb3B0aW9ucy5tdWx0aXBhcnRCb2R5O1xuICAgICAgICB0aGlzLmZvcm1EYXRhID0gb3B0aW9ucy5mb3JtRGF0YTtcbiAgICAgICAgdGhpcy5kaXNhYmxlS2VlcEFsaXZlID0gKF9kID0gb3B0aW9ucy5kaXNhYmxlS2VlcEFsaXZlKSAhPT0gbnVsbCAmJiBfZCAhPT0gdm9pZCAwID8gX2QgOiBmYWxzZTtcbiAgICAgICAgdGhpcy5wcm94eVNldHRpbmdzID0gb3B0aW9ucy5wcm94eVNldHRpbmdzO1xuICAgICAgICB0aGlzLnN0cmVhbVJlc3BvbnNlU3RhdHVzQ29kZXMgPSBvcHRpb25zLnN0cmVhbVJlc3BvbnNlU3RhdHVzQ29kZXM7XG4gICAgICAgIHRoaXMud2l0aENyZWRlbnRpYWxzID0gKF9lID0gb3B0aW9ucy53aXRoQ3JlZGVudGlhbHMpICE9PSBudWxsICYmIF9lICE9PSB2b2lkIDAgPyBfZSA6IGZhbHNlO1xuICAgICAgICB0aGlzLmFib3J0U2lnbmFsID0gb3B0aW9ucy5hYm9ydFNpZ25hbDtcbiAgICAgICAgdGhpcy50cmFjaW5nT3B0aW9ucyA9IG9wdGlvbnMudHJhY2luZ09wdGlvbnM7XG4gICAgICAgIHRoaXMub25VcGxvYWRQcm9ncmVzcyA9IG9wdGlvbnMub25VcGxvYWRQcm9ncmVzcztcbiAgICAgICAgdGhpcy5vbkRvd25sb2FkUHJvZ3Jlc3MgPSBvcHRpb25zLm9uRG93bmxvYWRQcm9ncmVzcztcbiAgICAgICAgdGhpcy5yZXF1ZXN0SWQgPSBvcHRpb25zLnJlcXVlc3RJZCB8fCAoMCwgY29yZV91dGlsXzEucmFuZG9tVVVJRCkoKTtcbiAgICAgICAgdGhpcy5hbGxvd0luc2VjdXJlQ29ubmVjdGlvbiA9IChfZiA9IG9wdGlvbnMuYWxsb3dJbnNlY3VyZUNvbm5lY3Rpb24pICE9PSBudWxsICYmIF9mICE9PSB2b2lkIDAgPyBfZiA6IGZhbHNlO1xuICAgICAgICB0aGlzLmVuYWJsZUJyb3dzZXJTdHJlYW1zID0gKF9nID0gb3B0aW9ucy5lbmFibGVCcm93c2VyU3RyZWFtcykgIT09IG51bGwgJiYgX2cgIT09IHZvaWQgMCA/IF9nIDogZmFsc2U7XG4gICAgfVxufVxuLyoqXG4gKiBDcmVhdGVzIGEgbmV3IHBpcGVsaW5lIHJlcXVlc3Qgd2l0aCB0aGUgZ2l2ZW4gb3B0aW9ucy5cbiAqIFRoaXMgbWV0aG9kIGlzIHRvIGFsbG93IGZvciB0aGUgZWFzeSBzZXR0aW5nIG9mIGRlZmF1bHQgdmFsdWVzIGFuZCBub3QgcmVxdWlyZWQuXG4gKiBAcGFyYW0gb3B0aW9ucyAtIFRoZSBvcHRpb25zIHRvIGNyZWF0ZSB0aGUgcmVxdWVzdCB3aXRoLlxuICovXG5mdW5jdGlvbiBjcmVhdGVQaXBlbGluZVJlcXVlc3Qob3B0aW9ucykge1xuICAgIHJldHVybiBuZXcgUGlwZWxpbmVSZXF1ZXN0SW1wbChvcHRpb25zKTtcbn1cbi8vIyBzb3VyY2VNYXBwaW5nVVJMPXBpcGVsaW5lUmVxdWVzdC5qcy5tYXAiLAogICAgIlwidXNlIHN0cmljdFwiO1xuLy8gQ29weXJpZ2h0IChjKSBNaWNyb3NvZnQgQ29ycG9yYXRpb24uXG4vLyBMaWNlbnNlZCB1bmRlciB0aGUgTUlUIExpY2Vuc2UuXG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJfX2VzTW9kdWxlXCIsIHsgdmFsdWU6IHRydWUgfSk7XG5leHBvcnRzLmV4cG9uZW50aWFsUmV0cnlQb2xpY3lOYW1lID0gdm9pZCAwO1xuZXhwb3J0cy5leHBvbmVudGlhbFJldHJ5UG9saWN5ID0gZXhwb25lbnRpYWxSZXRyeVBvbGljeTtcbmNvbnN0IGV4cG9uZW50aWFsUmV0cnlTdHJhdGVneV9qc18xID0gcmVxdWlyZShcIi4uL3JldHJ5U3RyYXRlZ2llcy9leHBvbmVudGlhbFJldHJ5U3RyYXRlZ3kuanNcIik7XG5jb25zdCByZXRyeVBvbGljeV9qc18xID0gcmVxdWlyZShcIi4vcmV0cnlQb2xpY3kuanNcIik7XG5jb25zdCBjb25zdGFudHNfanNfMSA9IHJlcXVpcmUoXCIuLi9jb25zdGFudHMuanNcIik7XG4vKipcbiAqIFRoZSBwcm9ncmFtbWF0aWMgaWRlbnRpZmllciBvZiB0aGUgZXhwb25lbnRpYWxSZXRyeVBvbGljeS5cbiAqL1xuZXhwb3J0cy5leHBvbmVudGlhbFJldHJ5UG9saWN5TmFtZSA9IFwiZXhwb25lbnRpYWxSZXRyeVBvbGljeVwiO1xuLyoqXG4gKiBBIHBvbGljeSB0aGF0IGF0dGVtcHRzIHRvIHJldHJ5IHJlcXVlc3RzIHdoaWxlIGludHJvZHVjaW5nIGFuIGV4cG9uZW50aWFsbHkgaW5jcmVhc2luZyBkZWxheS5cbiAqIEBwYXJhbSBvcHRpb25zIC0gT3B0aW9ucyB0aGF0IGNvbmZpZ3VyZSByZXRyeSBsb2dpYy5cbiAqL1xuZnVuY3Rpb24gZXhwb25lbnRpYWxSZXRyeVBvbGljeShvcHRpb25zID0ge30pIHtcbiAgICB2YXIgX2E7XG4gICAgcmV0dXJuICgwLCByZXRyeVBvbGljeV9qc18xLnJldHJ5UG9saWN5KShbXG4gICAgICAgICgwLCBleHBvbmVudGlhbFJldHJ5U3RyYXRlZ3lfanNfMS5leHBvbmVudGlhbFJldHJ5U3RyYXRlZ3kpKE9iamVjdC5hc3NpZ24oT2JqZWN0LmFzc2lnbih7fSwgb3B0aW9ucyksIHsgaWdub3JlU3lzdGVtRXJyb3JzOiB0cnVlIH0pKSxcbiAgICBdLCB7XG4gICAgICAgIG1heFJldHJpZXM6IChfYSA9IG9wdGlvbnMubWF4UmV0cmllcykgIT09IG51bGwgJiYgX2EgIT09IHZvaWQgMCA/IF9hIDogY29uc3RhbnRzX2pzXzEuREVGQVVMVF9SRVRSWV9QT0xJQ1lfQ09VTlQsXG4gICAgfSk7XG59XG4vLyMgc291cmNlTWFwcGluZ1VSTD1leHBvbmVudGlhbFJldHJ5UG9saWN5LmpzLm1hcCIsCiAgICAiXCJ1c2Ugc3RyaWN0XCI7XG4vLyBDb3B5cmlnaHQgKGMpIE1pY3Jvc29mdCBDb3Jwb3JhdGlvbi5cbi8vIExpY2Vuc2VkIHVuZGVyIHRoZSBNSVQgTGljZW5zZS5cbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIl9fZXNNb2R1bGVcIiwgeyB2YWx1ZTogdHJ1ZSB9KTtcbmV4cG9ydHMuc3lzdGVtRXJyb3JSZXRyeVBvbGljeU5hbWUgPSB2b2lkIDA7XG5leHBvcnRzLnN5c3RlbUVycm9yUmV0cnlQb2xpY3kgPSBzeXN0ZW1FcnJvclJldHJ5UG9saWN5O1xuY29uc3QgZXhwb25lbnRpYWxSZXRyeVN0cmF0ZWd5X2pzXzEgPSByZXF1aXJlKFwiLi4vcmV0cnlTdHJhdGVnaWVzL2V4cG9uZW50aWFsUmV0cnlTdHJhdGVneS5qc1wiKTtcbmNvbnN0IHJldHJ5UG9saWN5X2pzXzEgPSByZXF1aXJlKFwiLi9yZXRyeVBvbGljeS5qc1wiKTtcbmNvbnN0IGNvbnN0YW50c19qc18xID0gcmVxdWlyZShcIi4uL2NvbnN0YW50cy5qc1wiKTtcbi8qKlxuICogTmFtZSBvZiB0aGUge0BsaW5rIHN5c3RlbUVycm9yUmV0cnlQb2xpY3l9XG4gKi9cbmV4cG9ydHMuc3lzdGVtRXJyb3JSZXRyeVBvbGljeU5hbWUgPSBcInN5c3RlbUVycm9yUmV0cnlQb2xpY3lcIjtcbi8qKlxuICogQSByZXRyeSBwb2xpY3kgdGhhdCBzcGVjaWZpY2FsbHkgc2Vla3MgdG8gaGFuZGxlIGVycm9ycyBpbiB0aGVcbiAqIHVuZGVybHlpbmcgdHJhbnNwb3J0IGxheWVyIChlLmcuIEROUyBsb29rdXAgZmFpbHVyZXMpIHJhdGhlciB0aGFuXG4gKiByZXRyeWFibGUgZXJyb3IgY29kZXMgZnJvbSB0aGUgc2VydmVyIGl0c2VsZi5cbiAqIEBwYXJhbSBvcHRpb25zIC0gT3B0aW9ucyB0aGF0IGN1c3RvbWl6ZSB0aGUgcG9saWN5LlxuICovXG5mdW5jdGlvbiBzeXN0ZW1FcnJvclJldHJ5UG9saWN5KG9wdGlvbnMgPSB7fSkge1xuICAgIHZhciBfYTtcbiAgICByZXR1cm4ge1xuICAgICAgICBuYW1lOiBleHBvcnRzLnN5c3RlbUVycm9yUmV0cnlQb2xpY3lOYW1lLFxuICAgICAgICBzZW5kUmVxdWVzdDogKDAsIHJldHJ5UG9saWN5X2pzXzEucmV0cnlQb2xpY3kpKFtcbiAgICAgICAgICAgICgwLCBleHBvbmVudGlhbFJldHJ5U3RyYXRlZ3lfanNfMS5leHBvbmVudGlhbFJldHJ5U3RyYXRlZ3kpKE9iamVjdC5hc3NpZ24oT2JqZWN0LmFzc2lnbih7fSwgb3B0aW9ucyksIHsgaWdub3JlSHR0cFN0YXR1c0NvZGVzOiB0cnVlIH0pKSxcbiAgICAgICAgXSwge1xuICAgICAgICAgICAgbWF4UmV0cmllczogKF9hID0gb3B0aW9ucy5tYXhSZXRyaWVzKSAhPT0gbnVsbCAmJiBfYSAhPT0gdm9pZCAwID8gX2EgOiBjb25zdGFudHNfanNfMS5ERUZBVUxUX1JFVFJZX1BPTElDWV9DT1VOVCxcbiAgICAgICAgfSkuc2VuZFJlcXVlc3QsXG4gICAgfTtcbn1cbi8vIyBzb3VyY2VNYXBwaW5nVVJMPXN5c3RlbUVycm9yUmV0cnlQb2xpY3kuanMubWFwIiwKICAgICJcInVzZSBzdHJpY3RcIjtcbi8vIENvcHlyaWdodCAoYykgTWljcm9zb2Z0IENvcnBvcmF0aW9uLlxuLy8gTGljZW5zZWQgdW5kZXIgdGhlIE1JVCBMaWNlbnNlLlxuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiX19lc01vZHVsZVwiLCB7IHZhbHVlOiB0cnVlIH0pO1xuZXhwb3J0cy50aHJvdHRsaW5nUmV0cnlQb2xpY3lOYW1lID0gdm9pZCAwO1xuZXhwb3J0cy50aHJvdHRsaW5nUmV0cnlQb2xpY3kgPSB0aHJvdHRsaW5nUmV0cnlQb2xpY3k7XG5jb25zdCB0aHJvdHRsaW5nUmV0cnlTdHJhdGVneV9qc18xID0gcmVxdWlyZShcIi4uL3JldHJ5U3RyYXRlZ2llcy90aHJvdHRsaW5nUmV0cnlTdHJhdGVneS5qc1wiKTtcbmNvbnN0IHJldHJ5UG9saWN5X2pzXzEgPSByZXF1aXJlKFwiLi9yZXRyeVBvbGljeS5qc1wiKTtcbmNvbnN0IGNvbnN0YW50c19qc18xID0gcmVxdWlyZShcIi4uL2NvbnN0YW50cy5qc1wiKTtcbi8qKlxuICogTmFtZSBvZiB0aGUge0BsaW5rIHRocm90dGxpbmdSZXRyeVBvbGljeX1cbiAqL1xuZXhwb3J0cy50aHJvdHRsaW5nUmV0cnlQb2xpY3lOYW1lID0gXCJ0aHJvdHRsaW5nUmV0cnlQb2xpY3lcIjtcbi8qKlxuICogQSBwb2xpY3kgdGhhdCByZXRyaWVzIHdoZW4gdGhlIHNlcnZlciBzZW5kcyBhIDQyOSByZXNwb25zZSB3aXRoIGEgUmV0cnktQWZ0ZXIgaGVhZGVyLlxuICpcbiAqIFRvIGxlYXJuIG1vcmUsIHBsZWFzZSByZWZlciB0b1xuICogaHR0cHM6Ly9kb2NzLm1pY3Jvc29mdC5jb20vZW4tdXMvYXp1cmUvYXp1cmUtcmVzb3VyY2UtbWFuYWdlci9yZXNvdXJjZS1tYW5hZ2VyLXJlcXVlc3QtbGltaXRzLFxuICogaHR0cHM6Ly9kb2NzLm1pY3Jvc29mdC5jb20vZW4tdXMvYXp1cmUvYXp1cmUtc3Vic2NyaXB0aW9uLXNlcnZpY2UtbGltaXRzIGFuZFxuICogaHR0cHM6Ly9kb2NzLm1pY3Jvc29mdC5jb20vZW4tdXMvYXp1cmUvdmlydHVhbC1tYWNoaW5lcy90cm91Ymxlc2hvb3RpbmcvdHJvdWJsZXNob290aW5nLXRocm90dGxpbmctZXJyb3JzXG4gKlxuICogQHBhcmFtIG9wdGlvbnMgLSBPcHRpb25zIHRoYXQgY29uZmlndXJlIHJldHJ5IGxvZ2ljLlxuICovXG5mdW5jdGlvbiB0aHJvdHRsaW5nUmV0cnlQb2xpY3kob3B0aW9ucyA9IHt9KSB7XG4gICAgdmFyIF9hO1xuICAgIHJldHVybiB7XG4gICAgICAgIG5hbWU6IGV4cG9ydHMudGhyb3R0bGluZ1JldHJ5UG9saWN5TmFtZSxcbiAgICAgICAgc2VuZFJlcXVlc3Q6ICgwLCByZXRyeVBvbGljeV9qc18xLnJldHJ5UG9saWN5KShbKDAsIHRocm90dGxpbmdSZXRyeVN0cmF0ZWd5X2pzXzEudGhyb3R0bGluZ1JldHJ5U3RyYXRlZ3kpKCldLCB7XG4gICAgICAgICAgICBtYXhSZXRyaWVzOiAoX2EgPSBvcHRpb25zLm1heFJldHJpZXMpICE9PSBudWxsICYmIF9hICE9PSB2b2lkIDAgPyBfYSA6IGNvbnN0YW50c19qc18xLkRFRkFVTFRfUkVUUllfUE9MSUNZX0NPVU5ULFxuICAgICAgICB9KS5zZW5kUmVxdWVzdCxcbiAgICB9O1xufVxuLy8jIHNvdXJjZU1hcHBpbmdVUkw9dGhyb3R0bGluZ1JldHJ5UG9saWN5LmpzLm1hcCIsCiAgICAiXCJ1c2Ugc3RyaWN0XCI7XG4vLyBDb3B5cmlnaHQgKGMpIE1pY3Jvc29mdCBDb3Jwb3JhdGlvbi5cbi8vIExpY2Vuc2VkIHVuZGVyIHRoZSBNSVQgTGljZW5zZS5cbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIl9fZXNNb2R1bGVcIiwgeyB2YWx1ZTogdHJ1ZSB9KTtcbmV4cG9ydHMuREVGQVVMVF9DWUNMRVJfT1BUSU9OUyA9IHZvaWQgMDtcbmV4cG9ydHMuY3JlYXRlVG9rZW5DeWNsZXIgPSBjcmVhdGVUb2tlbkN5Y2xlcjtcbmNvbnN0IGhlbHBlcnNfanNfMSA9IHJlcXVpcmUoXCIuL2hlbHBlcnMuanNcIik7XG4vLyBEZWZhdWx0IG9wdGlvbnMgZm9yIHRoZSBjeWNsZXIgaWYgbm9uZSBhcmUgcHJvdmlkZWRcbmV4cG9ydHMuREVGQVVMVF9DWUNMRVJfT1BUSU9OUyA9IHtcbiAgICBmb3JjZWRSZWZyZXNoV2luZG93SW5NczogMTAwMCwgLy8gRm9yY2Ugd2FpdGluZyBmb3IgYSByZWZyZXNoIDFzIGJlZm9yZSB0aGUgdG9rZW4gZXhwaXJlc1xuICAgIHJldHJ5SW50ZXJ2YWxJbk1zOiAzMDAwLCAvLyBBbGxvdyByZWZyZXNoIGF0dGVtcHRzIGV2ZXJ5IDNzXG4gICAgcmVmcmVzaFdpbmRvd0luTXM6IDEwMDAgKiA2MCAqIDIsIC8vIFN0YXJ0IHJlZnJlc2hpbmcgMm0gYmVmb3JlIGV4cGlyeVxufTtcbi8qKlxuICogQ29udmVydHMgYW4gYW4gdW5yZWxpYWJsZSBhY2Nlc3MgdG9rZW4gZ2V0dGVyICh3aGljaCBtYXkgcmVzb2x2ZSB3aXRoIG51bGwpXG4gKiBpbnRvIGFuIEFjY2Vzc1Rva2VuR2V0dGVyIGJ5IHJldHJ5aW5nIHRoZSB1bnJlbGlhYmxlIGdldHRlciBpbiBhIHJlZ3VsYXJcbiAqIGludGVydmFsLlxuICpcbiAqIEBwYXJhbSBnZXRBY2Nlc3NUb2tlbiAtIEEgZnVuY3Rpb24gdGhhdCBwcm9kdWNlcyBhIHByb21pc2Ugb2YgYW4gYWNjZXNzIHRva2VuIHRoYXQgbWF5IGZhaWwgYnkgcmV0dXJuaW5nIG51bGwuXG4gKiBAcGFyYW0gcmV0cnlJbnRlcnZhbEluTXMgLSBUaGUgdGltZSAoaW4gbWlsbGlzZWNvbmRzKSB0byB3YWl0IGJldHdlZW4gcmV0cnkgYXR0ZW1wdHMuXG4gKiBAcGFyYW0gcmVmcmVzaFRpbWVvdXQgLSBUaGUgdGltZXN0YW1wIGFmdGVyIHdoaWNoIHRoZSByZWZyZXNoIGF0dGVtcHQgd2lsbCBmYWlsLCB0aHJvd2luZyBhbiBleGNlcHRpb24uXG4gKiBAcmV0dXJucyAtIEEgcHJvbWlzZSB0aGF0LCBpZiBpdCByZXNvbHZlcywgd2lsbCByZXNvbHZlIHdpdGggYW4gYWNjZXNzIHRva2VuLlxuICovXG5hc3luYyBmdW5jdGlvbiBiZWdpblJlZnJlc2goZ2V0QWNjZXNzVG9rZW4sIHJldHJ5SW50ZXJ2YWxJbk1zLCByZWZyZXNoVGltZW91dCkge1xuICAgIC8vIFRoaXMgd3JhcHBlciBoYW5kbGVzIGV4Y2VwdGlvbnMgZ3JhY2VmdWxseSBhcyBsb25nIGFzIHdlIGhhdmVuJ3QgZXhjZWVkZWRcbiAgICAvLyB0aGUgdGltZW91dC5cbiAgICBhc3luYyBmdW5jdGlvbiB0cnlHZXRBY2Nlc3NUb2tlbigpIHtcbiAgICAgICAgaWYgKERhdGUubm93KCkgPCByZWZyZXNoVGltZW91dCkge1xuICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICByZXR1cm4gYXdhaXQgZ2V0QWNjZXNzVG9rZW4oKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGNhdGNoIChfYSkge1xuICAgICAgICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgY29uc3QgZmluYWxUb2tlbiA9IGF3YWl0IGdldEFjY2Vzc1Rva2VuKCk7XG4gICAgICAgICAgICAvLyBUaW1lb3V0IGlzIHVwLCBzbyB0aHJvdyBpZiBpdCdzIHN0aWxsIG51bGxcbiAgICAgICAgICAgIGlmIChmaW5hbFRva2VuID09PSBudWxsKSB7XG4gICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwiRmFpbGVkIHRvIHJlZnJlc2ggYWNjZXNzIHRva2VuLlwiKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiBmaW5hbFRva2VuO1xuICAgICAgICB9XG4gICAgfVxuICAgIGxldCB0b2tlbiA9IGF3YWl0IHRyeUdldEFjY2Vzc1Rva2VuKCk7XG4gICAgd2hpbGUgKHRva2VuID09PSBudWxsKSB7XG4gICAgICAgIGF3YWl0ICgwLCBoZWxwZXJzX2pzXzEuZGVsYXkpKHJldHJ5SW50ZXJ2YWxJbk1zKTtcbiAgICAgICAgdG9rZW4gPSBhd2FpdCB0cnlHZXRBY2Nlc3NUb2tlbigpO1xuICAgIH1cbiAgICByZXR1cm4gdG9rZW47XG59XG4vKipcbiAqIENyZWF0ZXMgYSB0b2tlbiBjeWNsZXIgZnJvbSBhIGNyZWRlbnRpYWwsIHNjb3BlcywgYW5kIG9wdGlvbmFsIHNldHRpbmdzLlxuICpcbiAqIEEgdG9rZW4gY3ljbGVyIHJlcHJlc2VudHMgYSB3YXkgdG8gcmVsaWFibHkgcmV0cmlldmUgYSB2YWxpZCBhY2Nlc3MgdG9rZW5cbiAqIGZyb20gYSBUb2tlbkNyZWRlbnRpYWwuIEl0IHdpbGwgaGFuZGxlIGluaXRpYWxpemluZyB0aGUgdG9rZW4sIHJlZnJlc2hpbmcgaXRcbiAqIHdoZW4gaXQgbmVhcnMgZXhwaXJhdGlvbiwgYW5kIHN5bmNocm9uaXplcyByZWZyZXNoIGF0dGVtcHRzIHRvIGF2b2lkXG4gKiBjb25jdXJyZW5jeSBoYXphcmRzLlxuICpcbiAqIEBwYXJhbSBjcmVkZW50aWFsIC0gdGhlIHVuZGVybHlpbmcgVG9rZW5DcmVkZW50aWFsIHRoYXQgcHJvdmlkZXMgdGhlIGFjY2Vzc1xuICogdG9rZW5cbiAqIEBwYXJhbSB0b2tlbkN5Y2xlck9wdGlvbnMgLSBvcHRpb25hbGx5IG92ZXJyaWRlIGRlZmF1bHQgc2V0dGluZ3MgZm9yIHRoZSBjeWNsZXJcbiAqXG4gKiBAcmV0dXJucyAtIGEgZnVuY3Rpb24gdGhhdCByZWxpYWJseSBwcm9kdWNlcyBhIHZhbGlkIGFjY2VzcyB0b2tlblxuICovXG5mdW5jdGlvbiBjcmVhdGVUb2tlbkN5Y2xlcihjcmVkZW50aWFsLCB0b2tlbkN5Y2xlck9wdGlvbnMpIHtcbiAgICBsZXQgcmVmcmVzaFdvcmtlciA9IG51bGw7XG4gICAgbGV0IHRva2VuID0gbnVsbDtcbiAgICBsZXQgdGVuYW50SWQ7XG4gICAgY29uc3Qgb3B0aW9ucyA9IE9iamVjdC5hc3NpZ24oT2JqZWN0LmFzc2lnbih7fSwgZXhwb3J0cy5ERUZBVUxUX0NZQ0xFUl9PUFRJT05TKSwgdG9rZW5DeWNsZXJPcHRpb25zKTtcbiAgICAvKipcbiAgICAgKiBUaGlzIGxpdHRsZSBob2xkZXIgZGVmaW5lcyBzZXZlcmFsIHByZWRpY2F0ZXMgdGhhdCB3ZSB1c2UgdG8gY29uc3RydWN0XG4gICAgICogdGhlIHJ1bGVzIG9mIHJlZnJlc2hpbmcgdGhlIHRva2VuLlxuICAgICAqL1xuICAgIGNvbnN0IGN5Y2xlciA9IHtcbiAgICAgICAgLyoqXG4gICAgICAgICAqIFByb2R1Y2VzIHRydWUgaWYgYSByZWZyZXNoIGpvYiBpcyBjdXJyZW50bHkgaW4gcHJvZ3Jlc3MuXG4gICAgICAgICAqL1xuICAgICAgICBnZXQgaXNSZWZyZXNoaW5nKCkge1xuICAgICAgICAgICAgcmV0dXJuIHJlZnJlc2hXb3JrZXIgIT09IG51bGw7XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBQcm9kdWNlcyB0cnVlIGlmIHRoZSBjeWNsZXIgU0hPVUxEIHJlZnJlc2ggKHdlIGFyZSB3aXRoaW4gdGhlIHJlZnJlc2hcbiAgICAgICAgICogd2luZG93IGFuZCBub3QgYWxyZWFkeSByZWZyZXNoaW5nKVxuICAgICAgICAgKi9cbiAgICAgICAgZ2V0IHNob3VsZFJlZnJlc2goKSB7XG4gICAgICAgICAgICB2YXIgX2E7XG4gICAgICAgICAgICBpZiAoY3ljbGVyLmlzUmVmcmVzaGluZykge1xuICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmICgodG9rZW4gPT09IG51bGwgfHwgdG9rZW4gPT09IHZvaWQgMCA/IHZvaWQgMCA6IHRva2VuLnJlZnJlc2hBZnRlclRpbWVzdGFtcCkgJiYgdG9rZW4ucmVmcmVzaEFmdGVyVGltZXN0YW1wIDwgRGF0ZS5ub3coKSkge1xuICAgICAgICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuICgoX2EgPSB0b2tlbiA9PT0gbnVsbCB8fCB0b2tlbiA9PT0gdm9pZCAwID8gdm9pZCAwIDogdG9rZW4uZXhwaXJlc09uVGltZXN0YW1wKSAhPT0gbnVsbCAmJiBfYSAhPT0gdm9pZCAwID8gX2EgOiAwKSAtIG9wdGlvbnMucmVmcmVzaFdpbmRvd0luTXMgPCBEYXRlLm5vdygpO1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogUHJvZHVjZXMgdHJ1ZSBpZiB0aGUgY3ljbGVyIE1VU1QgcmVmcmVzaCAobnVsbCBvciBuZWFybHktZXhwaXJlZFxuICAgICAgICAgKiB0b2tlbikuXG4gICAgICAgICAqL1xuICAgICAgICBnZXQgbXVzdFJlZnJlc2goKSB7XG4gICAgICAgICAgICByZXR1cm4gKHRva2VuID09PSBudWxsIHx8IHRva2VuLmV4cGlyZXNPblRpbWVzdGFtcCAtIG9wdGlvbnMuZm9yY2VkUmVmcmVzaFdpbmRvd0luTXMgPCBEYXRlLm5vdygpKTtcbiAgICAgICAgfSxcbiAgICB9O1xuICAgIC8qKlxuICAgICAqIFN0YXJ0cyBhIHJlZnJlc2ggam9iIG9yIHJldHVybnMgdGhlIGV4aXN0aW5nIGpvYiBpZiBvbmUgaXMgYWxyZWFkeVxuICAgICAqIHJ1bm5pbmcuXG4gICAgICovXG4gICAgZnVuY3Rpb24gcmVmcmVzaChzY29wZXMsIGdldFRva2VuT3B0aW9ucykge1xuICAgICAgICB2YXIgX2E7XG4gICAgICAgIGlmICghY3ljbGVyLmlzUmVmcmVzaGluZykge1xuICAgICAgICAgICAgLy8gV2UgYmluZCBgc2NvcGVzYCBoZXJlIHRvIGF2b2lkIHBhc3NpbmcgaXQgYXJvdW5kIGEgbG90XG4gICAgICAgICAgICBjb25zdCB0cnlHZXRBY2Nlc3NUb2tlbiA9ICgpID0+IGNyZWRlbnRpYWwuZ2V0VG9rZW4oc2NvcGVzLCBnZXRUb2tlbk9wdGlvbnMpO1xuICAgICAgICAgICAgLy8gVGFrZSBhZHZhbnRhZ2Ugb2YgcHJvbWlzZSBjaGFpbmluZyB0byBpbnNlcnQgYW4gYXNzaWdubWVudCB0byBgdG9rZW5gXG4gICAgICAgICAgICAvLyBiZWZvcmUgdGhlIHJlZnJlc2ggY2FuIGJlIGNvbnNpZGVyZWQgZG9uZS5cbiAgICAgICAgICAgIHJlZnJlc2hXb3JrZXIgPSBiZWdpblJlZnJlc2godHJ5R2V0QWNjZXNzVG9rZW4sIG9wdGlvbnMucmV0cnlJbnRlcnZhbEluTXMsIFxuICAgICAgICAgICAgLy8gSWYgd2UgZG9uJ3QgaGF2ZSBhIHRva2VuLCB0aGVuIHdlIHNob3VsZCB0aW1lb3V0IGltbWVkaWF0ZWx5XG4gICAgICAgICAgICAoX2EgPSB0b2tlbiA9PT0gbnVsbCB8fCB0b2tlbiA9PT0gdm9pZCAwID8gdm9pZCAwIDogdG9rZW4uZXhwaXJlc09uVGltZXN0YW1wKSAhPT0gbnVsbCAmJiBfYSAhPT0gdm9pZCAwID8gX2EgOiBEYXRlLm5vdygpKVxuICAgICAgICAgICAgICAgIC50aGVuKChfdG9rZW4pID0+IHtcbiAgICAgICAgICAgICAgICByZWZyZXNoV29ya2VyID0gbnVsbDtcbiAgICAgICAgICAgICAgICB0b2tlbiA9IF90b2tlbjtcbiAgICAgICAgICAgICAgICB0ZW5hbnRJZCA9IGdldFRva2VuT3B0aW9ucy50ZW5hbnRJZDtcbiAgICAgICAgICAgICAgICByZXR1cm4gdG9rZW47XG4gICAgICAgICAgICB9KVxuICAgICAgICAgICAgICAgIC5jYXRjaCgocmVhc29uKSA9PiB7XG4gICAgICAgICAgICAgICAgLy8gV2UgYWxzbyBzaG91bGQgcmVzZXQgdGhlIHJlZnJlc2hlciBpZiB3ZSBlbnRlciBhIGZhaWxlZCBzdGF0ZS4gIEFsbFxuICAgICAgICAgICAgICAgIC8vIGV4aXN0aW5nIGF3YWl0ZXJzIHdpbGwgdGhyb3csIGJ1dCBzdWJzZXF1ZW50IHJlcXVlc3RzIHdpbGwgc3RhcnQgYVxuICAgICAgICAgICAgICAgIC8vIG5ldyByZXRyeSBjaGFpbi5cbiAgICAgICAgICAgICAgICByZWZyZXNoV29ya2VyID0gbnVsbDtcbiAgICAgICAgICAgICAgICB0b2tlbiA9IG51bGw7XG4gICAgICAgICAgICAgICAgdGVuYW50SWQgPSB1bmRlZmluZWQ7XG4gICAgICAgICAgICAgICAgdGhyb3cgcmVhc29uO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHJlZnJlc2hXb3JrZXI7XG4gICAgfVxuICAgIHJldHVybiBhc3luYyAoc2NvcGVzLCB0b2tlbk9wdGlvbnMpID0+IHtcbiAgICAgICAgLy9cbiAgICAgICAgLy8gU2ltcGxlIHJ1bGVzOlxuICAgICAgICAvLyAtIElmIHdlIE1VU1QgcmVmcmVzaCwgdGhlbiByZXR1cm4gdGhlIHJlZnJlc2ggdGFzaywgYmxvY2tpbmdcbiAgICAgICAgLy8gICB0aGUgcGlwZWxpbmUgdW50aWwgYSB0b2tlbiBpcyBhdmFpbGFibGUuXG4gICAgICAgIC8vIC0gSWYgd2UgU0hPVUxEIHJlZnJlc2gsIHRoZW4gcnVuIHJlZnJlc2ggYnV0IGRvbid0IHJldHVybiBpdFxuICAgICAgICAvLyAgICh3ZSBjYW4gc3RpbGwgdXNlIHRoZSBjYWNoZWQgdG9rZW4pLlxuICAgICAgICAvLyAtIFJldHVybiB0aGUgdG9rZW4sIHNpbmNlIGl0J3MgZmluZSBpZiB3ZSBkaWRuJ3QgcmV0dXJuIGluXG4gICAgICAgIC8vICAgc3RlcCAxLlxuICAgICAgICAvL1xuICAgICAgICBjb25zdCBoYXNDbGFpbUNoYWxsZW5nZSA9IEJvb2xlYW4odG9rZW5PcHRpb25zLmNsYWltcyk7XG4gICAgICAgIGNvbnN0IHRlbmFudElkQ2hhbmdlZCA9IHRlbmFudElkICE9PSB0b2tlbk9wdGlvbnMudGVuYW50SWQ7XG4gICAgICAgIGlmIChoYXNDbGFpbUNoYWxsZW5nZSkge1xuICAgICAgICAgICAgLy8gSWYgd2UndmUgcmVjZWl2ZWQgYSBjbGFpbSwgd2Uga25vdyB0aGUgZXhpc3RpbmcgdG9rZW4gaXNuJ3QgdmFsaWRcbiAgICAgICAgICAgIC8vIFdlIHdhbnQgdG8gY2xlYXIgaXQgc28gdGhhdCB0aGF0IHJlZnJlc2ggd29ya2VyIHdvbid0IHVzZSB0aGUgb2xkIGV4cGlyYXRpb24gdGltZSBhcyBhIHRpbWVvdXRcbiAgICAgICAgICAgIHRva2VuID0gbnVsbDtcbiAgICAgICAgfVxuICAgICAgICAvLyBJZiB0aGUgdGVuYW50SWQgcGFzc2VkIGluIHRva2VuIG9wdGlvbnMgaXMgZGlmZmVyZW50IHRvIHRoZSBvbmUgd2UgaGF2ZVxuICAgICAgICAvLyBPciBpZiB3ZSBhcmUgaW4gY2xhaW0gY2hhbGxlbmdlIGFuZCB0aGUgdG9rZW4gd2FzIHJlamVjdGVkIGFuZCBhIG5ldyBhY2Nlc3MgdG9rZW4gbmVlZCB0byBiZSBpc3N1ZWQsIHdlIG5lZWQgdG9cbiAgICAgICAgLy8gcmVmcmVzaCB0aGUgdG9rZW4gd2l0aCB0aGUgbmV3IHRlbmFudElkIG9yIHRva2VuLlxuICAgICAgICBjb25zdCBtdXN0UmVmcmVzaCA9IHRlbmFudElkQ2hhbmdlZCB8fCBoYXNDbGFpbUNoYWxsZW5nZSB8fCBjeWNsZXIubXVzdFJlZnJlc2g7XG4gICAgICAgIGlmIChtdXN0UmVmcmVzaCkge1xuICAgICAgICAgICAgcmV0dXJuIHJlZnJlc2goc2NvcGVzLCB0b2tlbk9wdGlvbnMpO1xuICAgICAgICB9XG4gICAgICAgIGlmIChjeWNsZXIuc2hvdWxkUmVmcmVzaCkge1xuICAgICAgICAgICAgcmVmcmVzaChzY29wZXMsIHRva2VuT3B0aW9ucyk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHRva2VuO1xuICAgIH07XG59XG4vLyMgc291cmNlTWFwcGluZ1VSTD10b2tlbkN5Y2xlci5qcy5tYXAiLAogICAgIlwidXNlIHN0cmljdFwiO1xuLy8gQ29weXJpZ2h0IChjKSBNaWNyb3NvZnQgQ29ycG9yYXRpb24uXG4vLyBMaWNlbnNlZCB1bmRlciB0aGUgTUlUIExpY2Vuc2UuXG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJfX2VzTW9kdWxlXCIsIHsgdmFsdWU6IHRydWUgfSk7XG5leHBvcnRzLmJlYXJlclRva2VuQXV0aGVudGljYXRpb25Qb2xpY3lOYW1lID0gdm9pZCAwO1xuZXhwb3J0cy5iZWFyZXJUb2tlbkF1dGhlbnRpY2F0aW9uUG9saWN5ID0gYmVhcmVyVG9rZW5BdXRoZW50aWNhdGlvblBvbGljeTtcbmNvbnN0IHRva2VuQ3ljbGVyX2pzXzEgPSByZXF1aXJlKFwiLi4vdXRpbC90b2tlbkN5Y2xlci5qc1wiKTtcbmNvbnN0IGxvZ19qc18xID0gcmVxdWlyZShcIi4uL2xvZy5qc1wiKTtcbi8qKlxuICogVGhlIHByb2dyYW1tYXRpYyBpZGVudGlmaWVyIG9mIHRoZSBiZWFyZXJUb2tlbkF1dGhlbnRpY2F0aW9uUG9saWN5LlxuICovXG5leHBvcnRzLmJlYXJlclRva2VuQXV0aGVudGljYXRpb25Qb2xpY3lOYW1lID0gXCJiZWFyZXJUb2tlbkF1dGhlbnRpY2F0aW9uUG9saWN5XCI7XG4vKipcbiAqIERlZmF1bHQgYXV0aG9yaXplIHJlcXVlc3QgaGFuZGxlclxuICovXG5hc3luYyBmdW5jdGlvbiBkZWZhdWx0QXV0aG9yaXplUmVxdWVzdChvcHRpb25zKSB7XG4gICAgY29uc3QgeyBzY29wZXMsIGdldEFjY2Vzc1Rva2VuLCByZXF1ZXN0IH0gPSBvcHRpb25zO1xuICAgIGNvbnN0IGdldFRva2VuT3B0aW9ucyA9IHtcbiAgICAgICAgYWJvcnRTaWduYWw6IHJlcXVlc3QuYWJvcnRTaWduYWwsXG4gICAgICAgIHRyYWNpbmdPcHRpb25zOiByZXF1ZXN0LnRyYWNpbmdPcHRpb25zLFxuICAgIH07XG4gICAgY29uc3QgYWNjZXNzVG9rZW4gPSBhd2FpdCBnZXRBY2Nlc3NUb2tlbihzY29wZXMsIGdldFRva2VuT3B0aW9ucyk7XG4gICAgaWYgKGFjY2Vzc1Rva2VuKSB7XG4gICAgICAgIG9wdGlvbnMucmVxdWVzdC5oZWFkZXJzLnNldChcIkF1dGhvcml6YXRpb25cIiwgYEJlYXJlciAke2FjY2Vzc1Rva2VuLnRva2VufWApO1xuICAgIH1cbn1cbi8qKlxuICogV2Ugd2lsbCByZXRyaWV2ZSB0aGUgY2hhbGxlbmdlIG9ubHkgaWYgdGhlIHJlc3BvbnNlIHN0YXR1cyBjb2RlIHdhcyA0MDEsXG4gKiBhbmQgaWYgdGhlIHJlc3BvbnNlIGNvbnRhaW5lZCB0aGUgaGVhZGVyIFwiV1dXLUF1dGhlbnRpY2F0ZVwiIHdpdGggYSBub24tZW1wdHkgdmFsdWUuXG4gKi9cbmZ1bmN0aW9uIGdldENoYWxsZW5nZShyZXNwb25zZSkge1xuICAgIGNvbnN0IGNoYWxsZW5nZSA9IHJlc3BvbnNlLmhlYWRlcnMuZ2V0KFwiV1dXLUF1dGhlbnRpY2F0ZVwiKTtcbiAgICBpZiAocmVzcG9uc2Uuc3RhdHVzID09PSA0MDEgJiYgY2hhbGxlbmdlKSB7XG4gICAgICAgIHJldHVybiBjaGFsbGVuZ2U7XG4gICAgfVxuICAgIHJldHVybjtcbn1cbi8qKlxuICogQSBwb2xpY3kgdGhhdCBjYW4gcmVxdWVzdCBhIHRva2VuIGZyb20gYSBUb2tlbkNyZWRlbnRpYWwgaW1wbGVtZW50YXRpb24gYW5kXG4gKiB0aGVuIGFwcGx5IGl0IHRvIHRoZSBBdXRob3JpemF0aW9uIGhlYWRlciBvZiBhIHJlcXVlc3QgYXMgYSBCZWFyZXIgdG9rZW4uXG4gKi9cbmZ1bmN0aW9uIGJlYXJlclRva2VuQXV0aGVudGljYXRpb25Qb2xpY3kob3B0aW9ucykge1xuICAgIHZhciBfYTtcbiAgICBjb25zdCB7IGNyZWRlbnRpYWwsIHNjb3BlcywgY2hhbGxlbmdlQ2FsbGJhY2tzIH0gPSBvcHRpb25zO1xuICAgIGNvbnN0IGxvZ2dlciA9IG9wdGlvbnMubG9nZ2VyIHx8IGxvZ19qc18xLmxvZ2dlcjtcbiAgICBjb25zdCBjYWxsYmFja3MgPSBPYmplY3QuYXNzaWduKHsgYXV0aG9yaXplUmVxdWVzdDogKF9hID0gY2hhbGxlbmdlQ2FsbGJhY2tzID09PSBudWxsIHx8IGNoYWxsZW5nZUNhbGxiYWNrcyA9PT0gdm9pZCAwID8gdm9pZCAwIDogY2hhbGxlbmdlQ2FsbGJhY2tzLmF1dGhvcml6ZVJlcXVlc3QpICE9PSBudWxsICYmIF9hICE9PSB2b2lkIDAgPyBfYSA6IGRlZmF1bHRBdXRob3JpemVSZXF1ZXN0LCBhdXRob3JpemVSZXF1ZXN0T25DaGFsbGVuZ2U6IGNoYWxsZW5nZUNhbGxiYWNrcyA9PT0gbnVsbCB8fCBjaGFsbGVuZ2VDYWxsYmFja3MgPT09IHZvaWQgMCA/IHZvaWQgMCA6IGNoYWxsZW5nZUNhbGxiYWNrcy5hdXRob3JpemVSZXF1ZXN0T25DaGFsbGVuZ2UgfSwgY2hhbGxlbmdlQ2FsbGJhY2tzKTtcbiAgICAvLyBUaGlzIGZ1bmN0aW9uIGVuY2Fwc3VsYXRlcyB0aGUgZW50aXJlIHByb2Nlc3Mgb2YgcmVsaWFibHkgcmV0cmlldmluZyB0aGUgdG9rZW5cbiAgICAvLyBUaGUgb3B0aW9ucyBhcmUgbGVmdCBvdXQgb2YgdGhlIHB1YmxpYyBBUEkgdW50aWwgdGhlcmUncyBkZW1hbmQgdG8gY29uZmlndXJlIHRoaXMuXG4gICAgLy8gUmVtZW1iZXIgdG8gZXh0ZW5kIGBCZWFyZXJUb2tlbkF1dGhlbnRpY2F0aW9uUG9saWN5T3B0aW9uc2Agd2l0aCBgVG9rZW5DeWNsZXJPcHRpb25zYFxuICAgIC8vIGluIG9yZGVyIHRvIHBhc3MgdGhyb3VnaCB0aGUgYG9wdGlvbnNgIG9iamVjdC5cbiAgICBjb25zdCBnZXRBY2Nlc3NUb2tlbiA9IGNyZWRlbnRpYWxcbiAgICAgICAgPyAoMCwgdG9rZW5DeWNsZXJfanNfMS5jcmVhdGVUb2tlbkN5Y2xlcikoY3JlZGVudGlhbCAvKiAsIG9wdGlvbnMgKi8pXG4gICAgICAgIDogKCkgPT4gUHJvbWlzZS5yZXNvbHZlKG51bGwpO1xuICAgIHJldHVybiB7XG4gICAgICAgIG5hbWU6IGV4cG9ydHMuYmVhcmVyVG9rZW5BdXRoZW50aWNhdGlvblBvbGljeU5hbWUsXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBJZiB0aGVyZSdzIG5vIGNoYWxsZW5nZSBwYXJhbWV0ZXI6XG4gICAgICAgICAqIC0gSXQgd2lsbCB0cnkgdG8gcmV0cmlldmUgdGhlIHRva2VuIHVzaW5nIHRoZSBjYWNoZSwgb3IgdGhlIGNyZWRlbnRpYWwncyBnZXRUb2tlbi5cbiAgICAgICAgICogLSBUaGVuIGl0IHdpbGwgdHJ5IHRoZSBuZXh0IHBvbGljeSB3aXRoIG9yIHdpdGhvdXQgdGhlIHJldHJpZXZlZCB0b2tlbi5cbiAgICAgICAgICpcbiAgICAgICAgICogSXQgdXNlcyB0aGUgY2hhbGxlbmdlIHBhcmFtZXRlcnMgdG86XG4gICAgICAgICAqIC0gU2tpcCBhIGZpcnN0IGF0dGVtcHQgdG8gZ2V0IHRoZSB0b2tlbiBmcm9tIHRoZSBjcmVkZW50aWFsIGlmIHRoZXJlJ3Mgbm8gY2FjaGVkIHRva2VuLFxuICAgICAgICAgKiAgIHNpbmNlIGl0IGV4cGVjdHMgdGhlIHRva2VuIHRvIGJlIHJldHJpZXZhYmxlIG9ubHkgYWZ0ZXIgdGhlIGNoYWxsZW5nZS5cbiAgICAgICAgICogLSBQcmVwYXJlIHRoZSBvdXRnb2luZyByZXF1ZXN0IGlmIHRoZSBgcHJlcGFyZVJlcXVlc3RgIG1ldGhvZCBoYXMgYmVlbiBwcm92aWRlZC5cbiAgICAgICAgICogLSBTZW5kIGFuIGluaXRpYWwgcmVxdWVzdCB0byByZWNlaXZlIHRoZSBjaGFsbGVuZ2UgaWYgaXQgZmFpbHMuXG4gICAgICAgICAqIC0gUHJvY2VzcyBhIGNoYWxsZW5nZSBpZiB0aGUgcmVzcG9uc2UgY29udGFpbnMgaXQuXG4gICAgICAgICAqIC0gUmV0cmlldmUgYSB0b2tlbiB3aXRoIHRoZSBjaGFsbGVuZ2UgaW5mb3JtYXRpb24sIHRoZW4gcmUtc2VuZCB0aGUgcmVxdWVzdC5cbiAgICAgICAgICovXG4gICAgICAgIGFzeW5jIHNlbmRSZXF1ZXN0KHJlcXVlc3QsIG5leHQpIHtcbiAgICAgICAgICAgIGlmICghcmVxdWVzdC51cmwudG9Mb3dlckNhc2UoKS5zdGFydHNXaXRoKFwiaHR0cHM6Ly9cIikpIHtcbiAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJCZWFyZXIgdG9rZW4gYXV0aGVudGljYXRpb24gaXMgbm90IHBlcm1pdHRlZCBmb3Igbm9uLVRMUyBwcm90ZWN0ZWQgKG5vbi1odHRwcykgVVJMcy5cIik7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBhd2FpdCBjYWxsYmFja3MuYXV0aG9yaXplUmVxdWVzdCh7XG4gICAgICAgICAgICAgICAgc2NvcGVzOiBBcnJheS5pc0FycmF5KHNjb3BlcykgPyBzY29wZXMgOiBbc2NvcGVzXSxcbiAgICAgICAgICAgICAgICByZXF1ZXN0LFxuICAgICAgICAgICAgICAgIGdldEFjY2Vzc1Rva2VuLFxuICAgICAgICAgICAgICAgIGxvZ2dlcixcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgbGV0IHJlc3BvbnNlO1xuICAgICAgICAgICAgbGV0IGVycm9yO1xuICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICByZXNwb25zZSA9IGF3YWl0IG5leHQocmVxdWVzdCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBjYXRjaCAoZXJyKSB7XG4gICAgICAgICAgICAgICAgZXJyb3IgPSBlcnI7XG4gICAgICAgICAgICAgICAgcmVzcG9uc2UgPSBlcnIucmVzcG9uc2U7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAoY2FsbGJhY2tzLmF1dGhvcml6ZVJlcXVlc3RPbkNoYWxsZW5nZSAmJlxuICAgICAgICAgICAgICAgIChyZXNwb25zZSA9PT0gbnVsbCB8fCByZXNwb25zZSA9PT0gdm9pZCAwID8gdm9pZCAwIDogcmVzcG9uc2Uuc3RhdHVzKSA9PT0gNDAxICYmXG4gICAgICAgICAgICAgICAgZ2V0Q2hhbGxlbmdlKHJlc3BvbnNlKSkge1xuICAgICAgICAgICAgICAgIC8vIHByb2Nlc3NlcyBjaGFsbGVuZ2VcbiAgICAgICAgICAgICAgICBjb25zdCBzaG91bGRTZW5kUmVxdWVzdCA9IGF3YWl0IGNhbGxiYWNrcy5hdXRob3JpemVSZXF1ZXN0T25DaGFsbGVuZ2Uoe1xuICAgICAgICAgICAgICAgICAgICBzY29wZXM6IEFycmF5LmlzQXJyYXkoc2NvcGVzKSA/IHNjb3BlcyA6IFtzY29wZXNdLFxuICAgICAgICAgICAgICAgICAgICByZXF1ZXN0LFxuICAgICAgICAgICAgICAgICAgICByZXNwb25zZSxcbiAgICAgICAgICAgICAgICAgICAgZ2V0QWNjZXNzVG9rZW4sXG4gICAgICAgICAgICAgICAgICAgIGxvZ2dlcixcbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICBpZiAoc2hvdWxkU2VuZFJlcXVlc3QpIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG5leHQocmVxdWVzdCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKGVycm9yKSB7XG4gICAgICAgICAgICAgICAgdGhyb3cgZXJyb3I7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gcmVzcG9uc2U7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0sXG4gICAgfTtcbn1cbi8vIyBzb3VyY2VNYXBwaW5nVVJMPWJlYXJlclRva2VuQXV0aGVudGljYXRpb25Qb2xpY3kuanMubWFwIiwKICAgICJcInVzZSBzdHJpY3RcIjtcbi8vIENvcHlyaWdodCAoYykgTWljcm9zb2Z0IENvcnBvcmF0aW9uLlxuLy8gTGljZW5zZWQgdW5kZXIgdGhlIE1JVCBMaWNlbnNlLlxuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiX19lc01vZHVsZVwiLCB7IHZhbHVlOiB0cnVlIH0pO1xuZXhwb3J0cy5uZEpzb25Qb2xpY3lOYW1lID0gdm9pZCAwO1xuZXhwb3J0cy5uZEpzb25Qb2xpY3kgPSBuZEpzb25Qb2xpY3k7XG4vKipcbiAqIFRoZSBwcm9ncmFtbWF0aWMgaWRlbnRpZmllciBvZiB0aGUgbmRKc29uUG9saWN5LlxuICovXG5leHBvcnRzLm5kSnNvblBvbGljeU5hbWUgPSBcIm5kSnNvblBvbGljeVwiO1xuLyoqXG4gKiBuZEpzb25Qb2xpY3kgaXMgYSBwb2xpY3kgdXNlZCB0byBjb250cm9sIGtlZXAgYWxpdmUgc2V0dGluZ3MgZm9yIGV2ZXJ5IHJlcXVlc3QuXG4gKi9cbmZ1bmN0aW9uIG5kSnNvblBvbGljeSgpIHtcbiAgICByZXR1cm4ge1xuICAgICAgICBuYW1lOiBleHBvcnRzLm5kSnNvblBvbGljeU5hbWUsXG4gICAgICAgIGFzeW5jIHNlbmRSZXF1ZXN0KHJlcXVlc3QsIG5leHQpIHtcbiAgICAgICAgICAgIC8vIFRoZXJlIGN1cnJlbnRseSBpc24ndCBhIGdvb2Qgd2F5IHRvIGJ5cGFzcyB0aGUgc2VyaWFsaXplclxuICAgICAgICAgICAgaWYgKHR5cGVvZiByZXF1ZXN0LmJvZHkgPT09IFwic3RyaW5nXCIgJiYgcmVxdWVzdC5ib2R5LnN0YXJ0c1dpdGgoXCJbXCIpKSB7XG4gICAgICAgICAgICAgICAgY29uc3QgYm9keSA9IEpTT04ucGFyc2UocmVxdWVzdC5ib2R5KTtcbiAgICAgICAgICAgICAgICBpZiAoQXJyYXkuaXNBcnJheShib2R5KSkge1xuICAgICAgICAgICAgICAgICAgICByZXF1ZXN0LmJvZHkgPSBib2R5Lm1hcCgoaXRlbSkgPT4gSlNPTi5zdHJpbmdpZnkoaXRlbSkgKyBcIlxcblwiKS5qb2luKFwiXCIpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiBuZXh0KHJlcXVlc3QpO1xuICAgICAgICB9LFxuICAgIH07XG59XG4vLyMgc291cmNlTWFwcGluZ1VSTD1uZEpzb25Qb2xpY3kuanMubWFwIiwKICAgICJcInVzZSBzdHJpY3RcIjtcbi8vIENvcHlyaWdodCAoYykgTWljcm9zb2Z0IENvcnBvcmF0aW9uLlxuLy8gTGljZW5zZWQgdW5kZXIgdGhlIE1JVCBMaWNlbnNlLlxuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiX19lc01vZHVsZVwiLCB7IHZhbHVlOiB0cnVlIH0pO1xuZXhwb3J0cy5hdXhpbGlhcnlBdXRoZW50aWNhdGlvbkhlYWRlclBvbGljeU5hbWUgPSB2b2lkIDA7XG5leHBvcnRzLmF1eGlsaWFyeUF1dGhlbnRpY2F0aW9uSGVhZGVyUG9saWN5ID0gYXV4aWxpYXJ5QXV0aGVudGljYXRpb25IZWFkZXJQb2xpY3k7XG5jb25zdCB0b2tlbkN5Y2xlcl9qc18xID0gcmVxdWlyZShcIi4uL3V0aWwvdG9rZW5DeWNsZXIuanNcIik7XG5jb25zdCBsb2dfanNfMSA9IHJlcXVpcmUoXCIuLi9sb2cuanNcIik7XG4vKipcbiAqIFRoZSBwcm9ncmFtbWF0aWMgaWRlbnRpZmllciBvZiB0aGUgYXV4aWxpYXJ5QXV0aGVudGljYXRpb25IZWFkZXJQb2xpY3kuXG4gKi9cbmV4cG9ydHMuYXV4aWxpYXJ5QXV0aGVudGljYXRpb25IZWFkZXJQb2xpY3lOYW1lID0gXCJhdXhpbGlhcnlBdXRoZW50aWNhdGlvbkhlYWRlclBvbGljeVwiO1xuY29uc3QgQVVUSE9SSVpBVElPTl9BVVhJTElBUllfSEVBREVSID0gXCJ4LW1zLWF1dGhvcml6YXRpb24tYXV4aWxpYXJ5XCI7XG5hc3luYyBmdW5jdGlvbiBzZW5kQXV0aG9yaXplUmVxdWVzdChvcHRpb25zKSB7XG4gICAgdmFyIF9hLCBfYjtcbiAgICBjb25zdCB7IHNjb3BlcywgZ2V0QWNjZXNzVG9rZW4sIHJlcXVlc3QgfSA9IG9wdGlvbnM7XG4gICAgY29uc3QgZ2V0VG9rZW5PcHRpb25zID0ge1xuICAgICAgICBhYm9ydFNpZ25hbDogcmVxdWVzdC5hYm9ydFNpZ25hbCxcbiAgICAgICAgdHJhY2luZ09wdGlvbnM6IHJlcXVlc3QudHJhY2luZ09wdGlvbnMsXG4gICAgfTtcbiAgICByZXR1cm4gKF9iID0gKF9hID0gKGF3YWl0IGdldEFjY2Vzc1Rva2VuKHNjb3BlcywgZ2V0VG9rZW5PcHRpb25zKSkpID09PSBudWxsIHx8IF9hID09PSB2b2lkIDAgPyB2b2lkIDAgOiBfYS50b2tlbikgIT09IG51bGwgJiYgX2IgIT09IHZvaWQgMCA/IF9iIDogXCJcIjtcbn1cbi8qKlxuICogQSBwb2xpY3kgZm9yIGV4dGVybmFsIHRva2VucyB0byBgeC1tcy1hdXRob3JpemF0aW9uLWF1eGlsaWFyeWAgaGVhZGVyLlxuICogVGhpcyBoZWFkZXIgd2lsbCBiZSB1c2VkIHdoZW4gY3JlYXRpbmcgYSBjcm9zcy10ZW5hbnQgYXBwbGljYXRpb24gd2UgbWF5IG5lZWQgdG8gaGFuZGxlIGF1dGhlbnRpY2F0aW9uIHJlcXVlc3RzXG4gKiBmb3IgcmVzb3VyY2VzIHRoYXQgYXJlIGluIGRpZmZlcmVudCB0ZW5hbnRzLlxuICogWW91IGNvdWxkIHNlZSBbQVJNIGRvY3NdKGh0dHBzOi8vbGVhcm4ubWljcm9zb2Z0LmNvbS9lbi11cy9henVyZS9henVyZS1yZXNvdXJjZS1tYW5hZ2VyL21hbmFnZW1lbnQvYXV0aGVudGljYXRlLW11bHRpLXRlbmFudCkgZm9yIGEgcnVuZG93biBvZiBob3cgdGhpcyBmZWF0dXJlIHdvcmtzXG4gKi9cbmZ1bmN0aW9uIGF1eGlsaWFyeUF1dGhlbnRpY2F0aW9uSGVhZGVyUG9saWN5KG9wdGlvbnMpIHtcbiAgICBjb25zdCB7IGNyZWRlbnRpYWxzLCBzY29wZXMgfSA9IG9wdGlvbnM7XG4gICAgY29uc3QgbG9nZ2VyID0gb3B0aW9ucy5sb2dnZXIgfHwgbG9nX2pzXzEubG9nZ2VyO1xuICAgIGNvbnN0IHRva2VuQ3ljbGVyTWFwID0gbmV3IFdlYWtNYXAoKTtcbiAgICByZXR1cm4ge1xuICAgICAgICBuYW1lOiBleHBvcnRzLmF1eGlsaWFyeUF1dGhlbnRpY2F0aW9uSGVhZGVyUG9saWN5TmFtZSxcbiAgICAgICAgYXN5bmMgc2VuZFJlcXVlc3QocmVxdWVzdCwgbmV4dCkge1xuICAgICAgICAgICAgaWYgKCFyZXF1ZXN0LnVybC50b0xvd2VyQ2FzZSgpLnN0YXJ0c1dpdGgoXCJodHRwczovL1wiKSkge1xuICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihcIkJlYXJlciB0b2tlbiBhdXRoZW50aWNhdGlvbiBmb3IgYXV4aWxpYXJ5IGhlYWRlciBpcyBub3QgcGVybWl0dGVkIGZvciBub24tVExTIHByb3RlY3RlZCAobm9uLWh0dHBzKSBVUkxzLlwiKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmICghY3JlZGVudGlhbHMgfHwgY3JlZGVudGlhbHMubGVuZ3RoID09PSAwKSB7XG4gICAgICAgICAgICAgICAgbG9nZ2VyLmluZm8oYCR7ZXhwb3J0cy5hdXhpbGlhcnlBdXRoZW50aWNhdGlvbkhlYWRlclBvbGljeU5hbWV9IGhlYWRlciB3aWxsIG5vdCBiZSBzZXQgZHVlIHRvIGVtcHR5IGNyZWRlbnRpYWxzLmApO1xuICAgICAgICAgICAgICAgIHJldHVybiBuZXh0KHJlcXVlc3QpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgY29uc3QgdG9rZW5Qcm9taXNlcyA9IFtdO1xuICAgICAgICAgICAgZm9yIChjb25zdCBjcmVkZW50aWFsIG9mIGNyZWRlbnRpYWxzKSB7XG4gICAgICAgICAgICAgICAgbGV0IGdldEFjY2Vzc1Rva2VuID0gdG9rZW5DeWNsZXJNYXAuZ2V0KGNyZWRlbnRpYWwpO1xuICAgICAgICAgICAgICAgIGlmICghZ2V0QWNjZXNzVG9rZW4pIHtcbiAgICAgICAgICAgICAgICAgICAgZ2V0QWNjZXNzVG9rZW4gPSAoMCwgdG9rZW5DeWNsZXJfanNfMS5jcmVhdGVUb2tlbkN5Y2xlcikoY3JlZGVudGlhbCk7XG4gICAgICAgICAgICAgICAgICAgIHRva2VuQ3ljbGVyTWFwLnNldChjcmVkZW50aWFsLCBnZXRBY2Nlc3NUb2tlbik7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHRva2VuUHJvbWlzZXMucHVzaChzZW5kQXV0aG9yaXplUmVxdWVzdCh7XG4gICAgICAgICAgICAgICAgICAgIHNjb3BlczogQXJyYXkuaXNBcnJheShzY29wZXMpID8gc2NvcGVzIDogW3Njb3Blc10sXG4gICAgICAgICAgICAgICAgICAgIHJlcXVlc3QsXG4gICAgICAgICAgICAgICAgICAgIGdldEFjY2Vzc1Rva2VuLFxuICAgICAgICAgICAgICAgICAgICBsb2dnZXIsXG4gICAgICAgICAgICAgICAgfSkpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgY29uc3QgYXV4aWxpYXJ5VG9rZW5zID0gKGF3YWl0IFByb21pc2UuYWxsKHRva2VuUHJvbWlzZXMpKS5maWx0ZXIoKHRva2VuKSA9PiBCb29sZWFuKHRva2VuKSk7XG4gICAgICAgICAgICBpZiAoYXV4aWxpYXJ5VG9rZW5zLmxlbmd0aCA9PT0gMCkge1xuICAgICAgICAgICAgICAgIGxvZ2dlci53YXJuaW5nKGBOb25lIG9mIHRoZSBhdXhpbGlhcnkgdG9rZW5zIGFyZSB2YWxpZC4gJHtBVVRIT1JJWkFUSU9OX0FVWElMSUFSWV9IRUFERVJ9IGhlYWRlciB3aWxsIG5vdCBiZSBzZXQuYCk7XG4gICAgICAgICAgICAgICAgcmV0dXJuIG5leHQocmVxdWVzdCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXF1ZXN0LmhlYWRlcnMuc2V0KEFVVEhPUklaQVRJT05fQVVYSUxJQVJZX0hFQURFUiwgYXV4aWxpYXJ5VG9rZW5zLm1hcCgodG9rZW4pID0+IGBCZWFyZXIgJHt0b2tlbn1gKS5qb2luKFwiLCBcIikpO1xuICAgICAgICAgICAgcmV0dXJuIG5leHQocmVxdWVzdCk7XG4gICAgICAgIH0sXG4gICAgfTtcbn1cbi8vIyBzb3VyY2VNYXBwaW5nVVJMPWF1eGlsaWFyeUF1dGhlbnRpY2F0aW9uSGVhZGVyUG9saWN5LmpzLm1hcCIsCiAgICAiXCJ1c2Ugc3RyaWN0XCI7XG4vLyBDb3B5cmlnaHQgKGMpIE1pY3Jvc29mdCBDb3Jwb3JhdGlvbi5cbi8vIExpY2Vuc2VkIHVuZGVyIHRoZSBNSVQgTGljZW5zZS5cbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIl9fZXNNb2R1bGVcIiwgeyB2YWx1ZTogdHJ1ZSB9KTtcbmV4cG9ydHMuY3JlYXRlRmlsZUZyb21TdHJlYW0gPSBleHBvcnRzLmNyZWF0ZUZpbGUgPSBleHBvcnRzLmF1eGlsaWFyeUF1dGhlbnRpY2F0aW9uSGVhZGVyUG9saWN5TmFtZSA9IGV4cG9ydHMuYXV4aWxpYXJ5QXV0aGVudGljYXRpb25IZWFkZXJQb2xpY3kgPSBleHBvcnRzLm5kSnNvblBvbGljeU5hbWUgPSBleHBvcnRzLm5kSnNvblBvbGljeSA9IGV4cG9ydHMuYmVhcmVyVG9rZW5BdXRoZW50aWNhdGlvblBvbGljeU5hbWUgPSBleHBvcnRzLmJlYXJlclRva2VuQXV0aGVudGljYXRpb25Qb2xpY3kgPSBleHBvcnRzLmZvcm1EYXRhUG9saWN5TmFtZSA9IGV4cG9ydHMuZm9ybURhdGFQb2xpY3kgPSBleHBvcnRzLnRsc1BvbGljeU5hbWUgPSBleHBvcnRzLnRsc1BvbGljeSA9IGV4cG9ydHMudXNlckFnZW50UG9saWN5TmFtZSA9IGV4cG9ydHMudXNlckFnZW50UG9saWN5ID0gZXhwb3J0cy5kZWZhdWx0UmV0cnlQb2xpY3kgPSBleHBvcnRzLnRyYWNpbmdQb2xpY3lOYW1lID0gZXhwb3J0cy50cmFjaW5nUG9saWN5ID0gZXhwb3J0cy5yZXRyeVBvbGljeSA9IGV4cG9ydHMudGhyb3R0bGluZ1JldHJ5UG9saWN5TmFtZSA9IGV4cG9ydHMudGhyb3R0bGluZ1JldHJ5UG9saWN5ID0gZXhwb3J0cy5zeXN0ZW1FcnJvclJldHJ5UG9saWN5TmFtZSA9IGV4cG9ydHMuc3lzdGVtRXJyb3JSZXRyeVBvbGljeSA9IGV4cG9ydHMucmVkaXJlY3RQb2xpY3lOYW1lID0gZXhwb3J0cy5yZWRpcmVjdFBvbGljeSA9IGV4cG9ydHMuZ2V0RGVmYXVsdFByb3h5U2V0dGluZ3MgPSBleHBvcnRzLnByb3h5UG9saWN5TmFtZSA9IGV4cG9ydHMucHJveHlQb2xpY3kgPSBleHBvcnRzLm11bHRpcGFydFBvbGljeU5hbWUgPSBleHBvcnRzLm11bHRpcGFydFBvbGljeSA9IGV4cG9ydHMubG9nUG9saWN5TmFtZSA9IGV4cG9ydHMubG9nUG9saWN5ID0gZXhwb3J0cy5zZXRDbGllbnRSZXF1ZXN0SWRQb2xpY3lOYW1lID0gZXhwb3J0cy5zZXRDbGllbnRSZXF1ZXN0SWRQb2xpY3kgPSBleHBvcnRzLmV4cG9uZW50aWFsUmV0cnlQb2xpY3lOYW1lID0gZXhwb3J0cy5leHBvbmVudGlhbFJldHJ5UG9saWN5ID0gZXhwb3J0cy5kZWNvbXByZXNzUmVzcG9uc2VQb2xpY3lOYW1lID0gZXhwb3J0cy5kZWNvbXByZXNzUmVzcG9uc2VQb2xpY3kgPSBleHBvcnRzLmlzUmVzdEVycm9yID0gZXhwb3J0cy5SZXN0RXJyb3IgPSBleHBvcnRzLmNyZWF0ZVBpcGVsaW5lUmVxdWVzdCA9IGV4cG9ydHMuY3JlYXRlSHR0cEhlYWRlcnMgPSBleHBvcnRzLmNyZWF0ZURlZmF1bHRIdHRwQ2xpZW50ID0gZXhwb3J0cy5jcmVhdGVQaXBlbGluZUZyb21PcHRpb25zID0gZXhwb3J0cy5jcmVhdGVFbXB0eVBpcGVsaW5lID0gdm9pZCAwO1xudmFyIHBpcGVsaW5lX2pzXzEgPSByZXF1aXJlKFwiLi9waXBlbGluZS5qc1wiKTtcbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcImNyZWF0ZUVtcHR5UGlwZWxpbmVcIiwgeyBlbnVtZXJhYmxlOiB0cnVlLCBnZXQ6IGZ1bmN0aW9uICgpIHsgcmV0dXJuIHBpcGVsaW5lX2pzXzEuY3JlYXRlRW1wdHlQaXBlbGluZTsgfSB9KTtcbnZhciBjcmVhdGVQaXBlbGluZUZyb21PcHRpb25zX2pzXzEgPSByZXF1aXJlKFwiLi9jcmVhdGVQaXBlbGluZUZyb21PcHRpb25zLmpzXCIpO1xuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiY3JlYXRlUGlwZWxpbmVGcm9tT3B0aW9uc1wiLCB7IGVudW1lcmFibGU6IHRydWUsIGdldDogZnVuY3Rpb24gKCkgeyByZXR1cm4gY3JlYXRlUGlwZWxpbmVGcm9tT3B0aW9uc19qc18xLmNyZWF0ZVBpcGVsaW5lRnJvbU9wdGlvbnM7IH0gfSk7XG52YXIgZGVmYXVsdEh0dHBDbGllbnRfanNfMSA9IHJlcXVpcmUoXCIuL2RlZmF1bHRIdHRwQ2xpZW50LmpzXCIpO1xuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiY3JlYXRlRGVmYXVsdEh0dHBDbGllbnRcIiwgeyBlbnVtZXJhYmxlOiB0cnVlLCBnZXQ6IGZ1bmN0aW9uICgpIHsgcmV0dXJuIGRlZmF1bHRIdHRwQ2xpZW50X2pzXzEuY3JlYXRlRGVmYXVsdEh0dHBDbGllbnQ7IH0gfSk7XG52YXIgaHR0cEhlYWRlcnNfanNfMSA9IHJlcXVpcmUoXCIuL2h0dHBIZWFkZXJzLmpzXCIpO1xuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiY3JlYXRlSHR0cEhlYWRlcnNcIiwgeyBlbnVtZXJhYmxlOiB0cnVlLCBnZXQ6IGZ1bmN0aW9uICgpIHsgcmV0dXJuIGh0dHBIZWFkZXJzX2pzXzEuY3JlYXRlSHR0cEhlYWRlcnM7IH0gfSk7XG52YXIgcGlwZWxpbmVSZXF1ZXN0X2pzXzEgPSByZXF1aXJlKFwiLi9waXBlbGluZVJlcXVlc3QuanNcIik7XG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJjcmVhdGVQaXBlbGluZVJlcXVlc3RcIiwgeyBlbnVtZXJhYmxlOiB0cnVlLCBnZXQ6IGZ1bmN0aW9uICgpIHsgcmV0dXJuIHBpcGVsaW5lUmVxdWVzdF9qc18xLmNyZWF0ZVBpcGVsaW5lUmVxdWVzdDsgfSB9KTtcbnZhciByZXN0RXJyb3JfanNfMSA9IHJlcXVpcmUoXCIuL3Jlc3RFcnJvci5qc1wiKTtcbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIlJlc3RFcnJvclwiLCB7IGVudW1lcmFibGU6IHRydWUsIGdldDogZnVuY3Rpb24gKCkgeyByZXR1cm4gcmVzdEVycm9yX2pzXzEuUmVzdEVycm9yOyB9IH0pO1xuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiaXNSZXN0RXJyb3JcIiwgeyBlbnVtZXJhYmxlOiB0cnVlLCBnZXQ6IGZ1bmN0aW9uICgpIHsgcmV0dXJuIHJlc3RFcnJvcl9qc18xLmlzUmVzdEVycm9yOyB9IH0pO1xudmFyIGRlY29tcHJlc3NSZXNwb25zZVBvbGljeV9qc18xID0gcmVxdWlyZShcIi4vcG9saWNpZXMvZGVjb21wcmVzc1Jlc3BvbnNlUG9saWN5LmpzXCIpO1xuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiZGVjb21wcmVzc1Jlc3BvbnNlUG9saWN5XCIsIHsgZW51bWVyYWJsZTogdHJ1ZSwgZ2V0OiBmdW5jdGlvbiAoKSB7IHJldHVybiBkZWNvbXByZXNzUmVzcG9uc2VQb2xpY3lfanNfMS5kZWNvbXByZXNzUmVzcG9uc2VQb2xpY3k7IH0gfSk7XG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJkZWNvbXByZXNzUmVzcG9uc2VQb2xpY3lOYW1lXCIsIHsgZW51bWVyYWJsZTogdHJ1ZSwgZ2V0OiBmdW5jdGlvbiAoKSB7IHJldHVybiBkZWNvbXByZXNzUmVzcG9uc2VQb2xpY3lfanNfMS5kZWNvbXByZXNzUmVzcG9uc2VQb2xpY3lOYW1lOyB9IH0pO1xudmFyIGV4cG9uZW50aWFsUmV0cnlQb2xpY3lfanNfMSA9IHJlcXVpcmUoXCIuL3BvbGljaWVzL2V4cG9uZW50aWFsUmV0cnlQb2xpY3kuanNcIik7XG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJleHBvbmVudGlhbFJldHJ5UG9saWN5XCIsIHsgZW51bWVyYWJsZTogdHJ1ZSwgZ2V0OiBmdW5jdGlvbiAoKSB7IHJldHVybiBleHBvbmVudGlhbFJldHJ5UG9saWN5X2pzXzEuZXhwb25lbnRpYWxSZXRyeVBvbGljeTsgfSB9KTtcbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcImV4cG9uZW50aWFsUmV0cnlQb2xpY3lOYW1lXCIsIHsgZW51bWVyYWJsZTogdHJ1ZSwgZ2V0OiBmdW5jdGlvbiAoKSB7IHJldHVybiBleHBvbmVudGlhbFJldHJ5UG9saWN5X2pzXzEuZXhwb25lbnRpYWxSZXRyeVBvbGljeU5hbWU7IH0gfSk7XG52YXIgc2V0Q2xpZW50UmVxdWVzdElkUG9saWN5X2pzXzEgPSByZXF1aXJlKFwiLi9wb2xpY2llcy9zZXRDbGllbnRSZXF1ZXN0SWRQb2xpY3kuanNcIik7XG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJzZXRDbGllbnRSZXF1ZXN0SWRQb2xpY3lcIiwgeyBlbnVtZXJhYmxlOiB0cnVlLCBnZXQ6IGZ1bmN0aW9uICgpIHsgcmV0dXJuIHNldENsaWVudFJlcXVlc3RJZFBvbGljeV9qc18xLnNldENsaWVudFJlcXVlc3RJZFBvbGljeTsgfSB9KTtcbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcInNldENsaWVudFJlcXVlc3RJZFBvbGljeU5hbWVcIiwgeyBlbnVtZXJhYmxlOiB0cnVlLCBnZXQ6IGZ1bmN0aW9uICgpIHsgcmV0dXJuIHNldENsaWVudFJlcXVlc3RJZFBvbGljeV9qc18xLnNldENsaWVudFJlcXVlc3RJZFBvbGljeU5hbWU7IH0gfSk7XG52YXIgbG9nUG9saWN5X2pzXzEgPSByZXF1aXJlKFwiLi9wb2xpY2llcy9sb2dQb2xpY3kuanNcIik7XG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJsb2dQb2xpY3lcIiwgeyBlbnVtZXJhYmxlOiB0cnVlLCBnZXQ6IGZ1bmN0aW9uICgpIHsgcmV0dXJuIGxvZ1BvbGljeV9qc18xLmxvZ1BvbGljeTsgfSB9KTtcbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcImxvZ1BvbGljeU5hbWVcIiwgeyBlbnVtZXJhYmxlOiB0cnVlLCBnZXQ6IGZ1bmN0aW9uICgpIHsgcmV0dXJuIGxvZ1BvbGljeV9qc18xLmxvZ1BvbGljeU5hbWU7IH0gfSk7XG52YXIgbXVsdGlwYXJ0UG9saWN5X2pzXzEgPSByZXF1aXJlKFwiLi9wb2xpY2llcy9tdWx0aXBhcnRQb2xpY3kuanNcIik7XG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJtdWx0aXBhcnRQb2xpY3lcIiwgeyBlbnVtZXJhYmxlOiB0cnVlLCBnZXQ6IGZ1bmN0aW9uICgpIHsgcmV0dXJuIG11bHRpcGFydFBvbGljeV9qc18xLm11bHRpcGFydFBvbGljeTsgfSB9KTtcbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIm11bHRpcGFydFBvbGljeU5hbWVcIiwgeyBlbnVtZXJhYmxlOiB0cnVlLCBnZXQ6IGZ1bmN0aW9uICgpIHsgcmV0dXJuIG11bHRpcGFydFBvbGljeV9qc18xLm11bHRpcGFydFBvbGljeU5hbWU7IH0gfSk7XG52YXIgcHJveHlQb2xpY3lfanNfMSA9IHJlcXVpcmUoXCIuL3BvbGljaWVzL3Byb3h5UG9saWN5LmpzXCIpO1xuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwicHJveHlQb2xpY3lcIiwgeyBlbnVtZXJhYmxlOiB0cnVlLCBnZXQ6IGZ1bmN0aW9uICgpIHsgcmV0dXJuIHByb3h5UG9saWN5X2pzXzEucHJveHlQb2xpY3k7IH0gfSk7XG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJwcm94eVBvbGljeU5hbWVcIiwgeyBlbnVtZXJhYmxlOiB0cnVlLCBnZXQ6IGZ1bmN0aW9uICgpIHsgcmV0dXJuIHByb3h5UG9saWN5X2pzXzEucHJveHlQb2xpY3lOYW1lOyB9IH0pO1xuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiZ2V0RGVmYXVsdFByb3h5U2V0dGluZ3NcIiwgeyBlbnVtZXJhYmxlOiB0cnVlLCBnZXQ6IGZ1bmN0aW9uICgpIHsgcmV0dXJuIHByb3h5UG9saWN5X2pzXzEuZ2V0RGVmYXVsdFByb3h5U2V0dGluZ3M7IH0gfSk7XG52YXIgcmVkaXJlY3RQb2xpY3lfanNfMSA9IHJlcXVpcmUoXCIuL3BvbGljaWVzL3JlZGlyZWN0UG9saWN5LmpzXCIpO1xuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwicmVkaXJlY3RQb2xpY3lcIiwgeyBlbnVtZXJhYmxlOiB0cnVlLCBnZXQ6IGZ1bmN0aW9uICgpIHsgcmV0dXJuIHJlZGlyZWN0UG9saWN5X2pzXzEucmVkaXJlY3RQb2xpY3k7IH0gfSk7XG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJyZWRpcmVjdFBvbGljeU5hbWVcIiwgeyBlbnVtZXJhYmxlOiB0cnVlLCBnZXQ6IGZ1bmN0aW9uICgpIHsgcmV0dXJuIHJlZGlyZWN0UG9saWN5X2pzXzEucmVkaXJlY3RQb2xpY3lOYW1lOyB9IH0pO1xudmFyIHN5c3RlbUVycm9yUmV0cnlQb2xpY3lfanNfMSA9IHJlcXVpcmUoXCIuL3BvbGljaWVzL3N5c3RlbUVycm9yUmV0cnlQb2xpY3kuanNcIik7XG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJzeXN0ZW1FcnJvclJldHJ5UG9saWN5XCIsIHsgZW51bWVyYWJsZTogdHJ1ZSwgZ2V0OiBmdW5jdGlvbiAoKSB7IHJldHVybiBzeXN0ZW1FcnJvclJldHJ5UG9saWN5X2pzXzEuc3lzdGVtRXJyb3JSZXRyeVBvbGljeTsgfSB9KTtcbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcInN5c3RlbUVycm9yUmV0cnlQb2xpY3lOYW1lXCIsIHsgZW51bWVyYWJsZTogdHJ1ZSwgZ2V0OiBmdW5jdGlvbiAoKSB7IHJldHVybiBzeXN0ZW1FcnJvclJldHJ5UG9saWN5X2pzXzEuc3lzdGVtRXJyb3JSZXRyeVBvbGljeU5hbWU7IH0gfSk7XG52YXIgdGhyb3R0bGluZ1JldHJ5UG9saWN5X2pzXzEgPSByZXF1aXJlKFwiLi9wb2xpY2llcy90aHJvdHRsaW5nUmV0cnlQb2xpY3kuanNcIik7XG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJ0aHJvdHRsaW5nUmV0cnlQb2xpY3lcIiwgeyBlbnVtZXJhYmxlOiB0cnVlLCBnZXQ6IGZ1bmN0aW9uICgpIHsgcmV0dXJuIHRocm90dGxpbmdSZXRyeVBvbGljeV9qc18xLnRocm90dGxpbmdSZXRyeVBvbGljeTsgfSB9KTtcbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcInRocm90dGxpbmdSZXRyeVBvbGljeU5hbWVcIiwgeyBlbnVtZXJhYmxlOiB0cnVlLCBnZXQ6IGZ1bmN0aW9uICgpIHsgcmV0dXJuIHRocm90dGxpbmdSZXRyeVBvbGljeV9qc18xLnRocm90dGxpbmdSZXRyeVBvbGljeU5hbWU7IH0gfSk7XG52YXIgcmV0cnlQb2xpY3lfanNfMSA9IHJlcXVpcmUoXCIuL3BvbGljaWVzL3JldHJ5UG9saWN5LmpzXCIpO1xuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwicmV0cnlQb2xpY3lcIiwgeyBlbnVtZXJhYmxlOiB0cnVlLCBnZXQ6IGZ1bmN0aW9uICgpIHsgcmV0dXJuIHJldHJ5UG9saWN5X2pzXzEucmV0cnlQb2xpY3k7IH0gfSk7XG52YXIgdHJhY2luZ1BvbGljeV9qc18xID0gcmVxdWlyZShcIi4vcG9saWNpZXMvdHJhY2luZ1BvbGljeS5qc1wiKTtcbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcInRyYWNpbmdQb2xpY3lcIiwgeyBlbnVtZXJhYmxlOiB0cnVlLCBnZXQ6IGZ1bmN0aW9uICgpIHsgcmV0dXJuIHRyYWNpbmdQb2xpY3lfanNfMS50cmFjaW5nUG9saWN5OyB9IH0pO1xuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwidHJhY2luZ1BvbGljeU5hbWVcIiwgeyBlbnVtZXJhYmxlOiB0cnVlLCBnZXQ6IGZ1bmN0aW9uICgpIHsgcmV0dXJuIHRyYWNpbmdQb2xpY3lfanNfMS50cmFjaW5nUG9saWN5TmFtZTsgfSB9KTtcbnZhciBkZWZhdWx0UmV0cnlQb2xpY3lfanNfMSA9IHJlcXVpcmUoXCIuL3BvbGljaWVzL2RlZmF1bHRSZXRyeVBvbGljeS5qc1wiKTtcbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcImRlZmF1bHRSZXRyeVBvbGljeVwiLCB7IGVudW1lcmFibGU6IHRydWUsIGdldDogZnVuY3Rpb24gKCkgeyByZXR1cm4gZGVmYXVsdFJldHJ5UG9saWN5X2pzXzEuZGVmYXVsdFJldHJ5UG9saWN5OyB9IH0pO1xudmFyIHVzZXJBZ2VudFBvbGljeV9qc18xID0gcmVxdWlyZShcIi4vcG9saWNpZXMvdXNlckFnZW50UG9saWN5LmpzXCIpO1xuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwidXNlckFnZW50UG9saWN5XCIsIHsgZW51bWVyYWJsZTogdHJ1ZSwgZ2V0OiBmdW5jdGlvbiAoKSB7IHJldHVybiB1c2VyQWdlbnRQb2xpY3lfanNfMS51c2VyQWdlbnRQb2xpY3k7IH0gfSk7XG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJ1c2VyQWdlbnRQb2xpY3lOYW1lXCIsIHsgZW51bWVyYWJsZTogdHJ1ZSwgZ2V0OiBmdW5jdGlvbiAoKSB7IHJldHVybiB1c2VyQWdlbnRQb2xpY3lfanNfMS51c2VyQWdlbnRQb2xpY3lOYW1lOyB9IH0pO1xudmFyIHRsc1BvbGljeV9qc18xID0gcmVxdWlyZShcIi4vcG9saWNpZXMvdGxzUG9saWN5LmpzXCIpO1xuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwidGxzUG9saWN5XCIsIHsgZW51bWVyYWJsZTogdHJ1ZSwgZ2V0OiBmdW5jdGlvbiAoKSB7IHJldHVybiB0bHNQb2xpY3lfanNfMS50bHNQb2xpY3k7IH0gfSk7XG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJ0bHNQb2xpY3lOYW1lXCIsIHsgZW51bWVyYWJsZTogdHJ1ZSwgZ2V0OiBmdW5jdGlvbiAoKSB7IHJldHVybiB0bHNQb2xpY3lfanNfMS50bHNQb2xpY3lOYW1lOyB9IH0pO1xudmFyIGZvcm1EYXRhUG9saWN5X2pzXzEgPSByZXF1aXJlKFwiLi9wb2xpY2llcy9mb3JtRGF0YVBvbGljeS5qc1wiKTtcbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcImZvcm1EYXRhUG9saWN5XCIsIHsgZW51bWVyYWJsZTogdHJ1ZSwgZ2V0OiBmdW5jdGlvbiAoKSB7IHJldHVybiBmb3JtRGF0YVBvbGljeV9qc18xLmZvcm1EYXRhUG9saWN5OyB9IH0pO1xuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiZm9ybURhdGFQb2xpY3lOYW1lXCIsIHsgZW51bWVyYWJsZTogdHJ1ZSwgZ2V0OiBmdW5jdGlvbiAoKSB7IHJldHVybiBmb3JtRGF0YVBvbGljeV9qc18xLmZvcm1EYXRhUG9saWN5TmFtZTsgfSB9KTtcbnZhciBiZWFyZXJUb2tlbkF1dGhlbnRpY2F0aW9uUG9saWN5X2pzXzEgPSByZXF1aXJlKFwiLi9wb2xpY2llcy9iZWFyZXJUb2tlbkF1dGhlbnRpY2F0aW9uUG9saWN5LmpzXCIpO1xuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiYmVhcmVyVG9rZW5BdXRoZW50aWNhdGlvblBvbGljeVwiLCB7IGVudW1lcmFibGU6IHRydWUsIGdldDogZnVuY3Rpb24gKCkgeyByZXR1cm4gYmVhcmVyVG9rZW5BdXRoZW50aWNhdGlvblBvbGljeV9qc18xLmJlYXJlclRva2VuQXV0aGVudGljYXRpb25Qb2xpY3k7IH0gfSk7XG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJiZWFyZXJUb2tlbkF1dGhlbnRpY2F0aW9uUG9saWN5TmFtZVwiLCB7IGVudW1lcmFibGU6IHRydWUsIGdldDogZnVuY3Rpb24gKCkgeyByZXR1cm4gYmVhcmVyVG9rZW5BdXRoZW50aWNhdGlvblBvbGljeV9qc18xLmJlYXJlclRva2VuQXV0aGVudGljYXRpb25Qb2xpY3lOYW1lOyB9IH0pO1xudmFyIG5kSnNvblBvbGljeV9qc18xID0gcmVxdWlyZShcIi4vcG9saWNpZXMvbmRKc29uUG9saWN5LmpzXCIpO1xuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwibmRKc29uUG9saWN5XCIsIHsgZW51bWVyYWJsZTogdHJ1ZSwgZ2V0OiBmdW5jdGlvbiAoKSB7IHJldHVybiBuZEpzb25Qb2xpY3lfanNfMS5uZEpzb25Qb2xpY3k7IH0gfSk7XG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJuZEpzb25Qb2xpY3lOYW1lXCIsIHsgZW51bWVyYWJsZTogdHJ1ZSwgZ2V0OiBmdW5jdGlvbiAoKSB7IHJldHVybiBuZEpzb25Qb2xpY3lfanNfMS5uZEpzb25Qb2xpY3lOYW1lOyB9IH0pO1xudmFyIGF1eGlsaWFyeUF1dGhlbnRpY2F0aW9uSGVhZGVyUG9saWN5X2pzXzEgPSByZXF1aXJlKFwiLi9wb2xpY2llcy9hdXhpbGlhcnlBdXRoZW50aWNhdGlvbkhlYWRlclBvbGljeS5qc1wiKTtcbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcImF1eGlsaWFyeUF1dGhlbnRpY2F0aW9uSGVhZGVyUG9saWN5XCIsIHsgZW51bWVyYWJsZTogdHJ1ZSwgZ2V0OiBmdW5jdGlvbiAoKSB7IHJldHVybiBhdXhpbGlhcnlBdXRoZW50aWNhdGlvbkhlYWRlclBvbGljeV9qc18xLmF1eGlsaWFyeUF1dGhlbnRpY2F0aW9uSGVhZGVyUG9saWN5OyB9IH0pO1xuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiYXV4aWxpYXJ5QXV0aGVudGljYXRpb25IZWFkZXJQb2xpY3lOYW1lXCIsIHsgZW51bWVyYWJsZTogdHJ1ZSwgZ2V0OiBmdW5jdGlvbiAoKSB7IHJldHVybiBhdXhpbGlhcnlBdXRoZW50aWNhdGlvbkhlYWRlclBvbGljeV9qc18xLmF1eGlsaWFyeUF1dGhlbnRpY2F0aW9uSGVhZGVyUG9saWN5TmFtZTsgfSB9KTtcbnZhciBmaWxlX2pzXzEgPSByZXF1aXJlKFwiLi91dGlsL2ZpbGUuanNcIik7XG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJjcmVhdGVGaWxlXCIsIHsgZW51bWVyYWJsZTogdHJ1ZSwgZ2V0OiBmdW5jdGlvbiAoKSB7IHJldHVybiBmaWxlX2pzXzEuY3JlYXRlRmlsZTsgfSB9KTtcbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcImNyZWF0ZUZpbGVGcm9tU3RyZWFtXCIsIHsgZW51bWVyYWJsZTogdHJ1ZSwgZ2V0OiBmdW5jdGlvbiAoKSB7IHJldHVybiBmaWxlX2pzXzEuY3JlYXRlRmlsZUZyb21TdHJlYW07IH0gfSk7XG4vLyMgc291cmNlTWFwcGluZ1VSTD1pbmRleC5qcy5tYXAiLAogICAgIlwidXNlIHN0cmljdFwiO1xuLy8gQ29weXJpZ2h0IChjKSBNaWNyb3NvZnQgQ29ycG9yYXRpb24uXG4vLyBMaWNlbnNlZCB1bmRlciB0aGUgTUlUIExpY2Vuc2UuXG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJfX2VzTW9kdWxlXCIsIHsgdmFsdWU6IHRydWUgfSk7XG5leHBvcnRzLkF6dXJlS2V5Q3JlZGVudGlhbCA9IHZvaWQgMDtcbi8qKlxuICogQSBzdGF0aWMta2V5LWJhc2VkIGNyZWRlbnRpYWwgdGhhdCBzdXBwb3J0cyB1cGRhdGluZ1xuICogdGhlIHVuZGVybHlpbmcga2V5IHZhbHVlLlxuICovXG5jbGFzcyBBenVyZUtleUNyZWRlbnRpYWwge1xuICAgIC8qKlxuICAgICAqIFRoZSB2YWx1ZSBvZiB0aGUga2V5IHRvIGJlIHVzZWQgaW4gYXV0aGVudGljYXRpb25cbiAgICAgKi9cbiAgICBnZXQga2V5KCkge1xuICAgICAgICByZXR1cm4gdGhpcy5fa2V5O1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBDcmVhdGUgYW4gaW5zdGFuY2Ugb2YgYW4gQXp1cmVLZXlDcmVkZW50aWFsIGZvciB1c2VcbiAgICAgKiB3aXRoIGEgc2VydmljZSBjbGllbnQuXG4gICAgICpcbiAgICAgKiBAcGFyYW0ga2V5IC0gVGhlIGluaXRpYWwgdmFsdWUgb2YgdGhlIGtleSB0byB1c2UgaW4gYXV0aGVudGljYXRpb25cbiAgICAgKi9cbiAgICBjb25zdHJ1Y3RvcihrZXkpIHtcbiAgICAgICAgaWYgKCFrZXkpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihcImtleSBtdXN0IGJlIGEgbm9uLWVtcHR5IHN0cmluZ1wiKTtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLl9rZXkgPSBrZXk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIENoYW5nZSB0aGUgdmFsdWUgb2YgdGhlIGtleS5cbiAgICAgKlxuICAgICAqIFVwZGF0ZXMgd2lsbCB0YWtlIGVmZmVjdCB1cG9uIHRoZSBuZXh0IHJlcXVlc3QgYWZ0ZXJcbiAgICAgKiB1cGRhdGluZyB0aGUga2V5IHZhbHVlLlxuICAgICAqXG4gICAgICogQHBhcmFtIG5ld0tleSAtIFRoZSBuZXcga2V5IHZhbHVlIHRvIGJlIHVzZWRcbiAgICAgKi9cbiAgICB1cGRhdGUobmV3S2V5KSB7XG4gICAgICAgIHRoaXMuX2tleSA9IG5ld0tleTtcbiAgICB9XG59XG5leHBvcnRzLkF6dXJlS2V5Q3JlZGVudGlhbCA9IEF6dXJlS2V5Q3JlZGVudGlhbDtcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPWF6dXJlS2V5Q3JlZGVudGlhbC5qcy5tYXAiLAogICAgIlwidXNlIHN0cmljdFwiO1xuLy8gQ29weXJpZ2h0IChjKSBNaWNyb3NvZnQgQ29ycG9yYXRpb24uXG4vLyBMaWNlbnNlZCB1bmRlciB0aGUgTUlUIExpY2Vuc2UuXG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJfX2VzTW9kdWxlXCIsIHsgdmFsdWU6IHRydWUgfSk7XG5leHBvcnRzLmlzS2V5Q3JlZGVudGlhbCA9IGlzS2V5Q3JlZGVudGlhbDtcbmNvbnN0IGNvcmVfdXRpbF8xID0gcmVxdWlyZShcIkBhenVyZS9jb3JlLXV0aWxcIik7XG4vKipcbiAqIFRlc3RzIGFuIG9iamVjdCB0byBkZXRlcm1pbmUgd2hldGhlciBpdCBpbXBsZW1lbnRzIEtleUNyZWRlbnRpYWwuXG4gKlxuICogQHBhcmFtIGNyZWRlbnRpYWwgLSBUaGUgYXNzdW1lZCBLZXlDcmVkZW50aWFsIHRvIGJlIHRlc3RlZC5cbiAqL1xuZnVuY3Rpb24gaXNLZXlDcmVkZW50aWFsKGNyZWRlbnRpYWwpIHtcbiAgICByZXR1cm4gKDAsIGNvcmVfdXRpbF8xLmlzT2JqZWN0V2l0aFByb3BlcnRpZXMpKGNyZWRlbnRpYWwsIFtcImtleVwiXSkgJiYgdHlwZW9mIGNyZWRlbnRpYWwua2V5ID09PSBcInN0cmluZ1wiO1xufVxuLy8jIHNvdXJjZU1hcHBpbmdVUkw9a2V5Q3JlZGVudGlhbC5qcy5tYXAiLAogICAgIlwidXNlIHN0cmljdFwiO1xuLy8gQ29weXJpZ2h0IChjKSBNaWNyb3NvZnQgQ29ycG9yYXRpb24uXG4vLyBMaWNlbnNlZCB1bmRlciB0aGUgTUlUIExpY2Vuc2UuXG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJfX2VzTW9kdWxlXCIsIHsgdmFsdWU6IHRydWUgfSk7XG5leHBvcnRzLkF6dXJlTmFtZWRLZXlDcmVkZW50aWFsID0gdm9pZCAwO1xuZXhwb3J0cy5pc05hbWVkS2V5Q3JlZGVudGlhbCA9IGlzTmFtZWRLZXlDcmVkZW50aWFsO1xuY29uc3QgY29yZV91dGlsXzEgPSByZXF1aXJlKFwiQGF6dXJlL2NvcmUtdXRpbFwiKTtcbi8qKlxuICogQSBzdGF0aWMgbmFtZS9rZXktYmFzZWQgY3JlZGVudGlhbCB0aGF0IHN1cHBvcnRzIHVwZGF0aW5nXG4gKiB0aGUgdW5kZXJseWluZyBuYW1lIGFuZCBrZXkgdmFsdWVzLlxuICovXG5jbGFzcyBBenVyZU5hbWVkS2V5Q3JlZGVudGlhbCB7XG4gICAgLyoqXG4gICAgICogVGhlIHZhbHVlIG9mIHRoZSBrZXkgdG8gYmUgdXNlZCBpbiBhdXRoZW50aWNhdGlvbi5cbiAgICAgKi9cbiAgICBnZXQga2V5KCkge1xuICAgICAgICByZXR1cm4gdGhpcy5fa2V5O1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBUaGUgdmFsdWUgb2YgdGhlIG5hbWUgdG8gYmUgdXNlZCBpbiBhdXRoZW50aWNhdGlvbi5cbiAgICAgKi9cbiAgICBnZXQgbmFtZSgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX25hbWU7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIENyZWF0ZSBhbiBpbnN0YW5jZSBvZiBhbiBBenVyZU5hbWVkS2V5Q3JlZGVudGlhbCBmb3IgdXNlXG4gICAgICogd2l0aCBhIHNlcnZpY2UgY2xpZW50LlxuICAgICAqXG4gICAgICogQHBhcmFtIG5hbWUgLSBUaGUgaW5pdGlhbCB2YWx1ZSBvZiB0aGUgbmFtZSB0byB1c2UgaW4gYXV0aGVudGljYXRpb24uXG4gICAgICogQHBhcmFtIGtleSAtIFRoZSBpbml0aWFsIHZhbHVlIG9mIHRoZSBrZXkgdG8gdXNlIGluIGF1dGhlbnRpY2F0aW9uLlxuICAgICAqL1xuICAgIGNvbnN0cnVjdG9yKG5hbWUsIGtleSkge1xuICAgICAgICBpZiAoIW5hbWUgfHwgIWtleSkge1xuICAgICAgICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcihcIm5hbWUgYW5kIGtleSBtdXN0IGJlIG5vbi1lbXB0eSBzdHJpbmdzXCIpO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMuX25hbWUgPSBuYW1lO1xuICAgICAgICB0aGlzLl9rZXkgPSBrZXk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIENoYW5nZSB0aGUgdmFsdWUgb2YgdGhlIGtleS5cbiAgICAgKlxuICAgICAqIFVwZGF0ZXMgd2lsbCB0YWtlIGVmZmVjdCB1cG9uIHRoZSBuZXh0IHJlcXVlc3QgYWZ0ZXJcbiAgICAgKiB1cGRhdGluZyB0aGUga2V5IHZhbHVlLlxuICAgICAqXG4gICAgICogQHBhcmFtIG5ld05hbWUgLSBUaGUgbmV3IG5hbWUgdmFsdWUgdG8gYmUgdXNlZC5cbiAgICAgKiBAcGFyYW0gbmV3S2V5IC0gVGhlIG5ldyBrZXkgdmFsdWUgdG8gYmUgdXNlZC5cbiAgICAgKi9cbiAgICB1cGRhdGUobmV3TmFtZSwgbmV3S2V5KSB7XG4gICAgICAgIGlmICghbmV3TmFtZSB8fCAhbmV3S2V5KSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKFwibmV3TmFtZSBhbmQgbmV3S2V5IG11c3QgYmUgbm9uLWVtcHR5IHN0cmluZ3NcIik7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5fbmFtZSA9IG5ld05hbWU7XG4gICAgICAgIHRoaXMuX2tleSA9IG5ld0tleTtcbiAgICB9XG59XG5leHBvcnRzLkF6dXJlTmFtZWRLZXlDcmVkZW50aWFsID0gQXp1cmVOYW1lZEtleUNyZWRlbnRpYWw7XG4vKipcbiAqIFRlc3RzIGFuIG9iamVjdCB0byBkZXRlcm1pbmUgd2hldGhlciBpdCBpbXBsZW1lbnRzIE5hbWVkS2V5Q3JlZGVudGlhbC5cbiAqXG4gKiBAcGFyYW0gY3JlZGVudGlhbCAtIFRoZSBhc3N1bWVkIE5hbWVkS2V5Q3JlZGVudGlhbCB0byBiZSB0ZXN0ZWQuXG4gKi9cbmZ1bmN0aW9uIGlzTmFtZWRLZXlDcmVkZW50aWFsKGNyZWRlbnRpYWwpIHtcbiAgICByZXR1cm4gKCgwLCBjb3JlX3V0aWxfMS5pc09iamVjdFdpdGhQcm9wZXJ0aWVzKShjcmVkZW50aWFsLCBbXCJuYW1lXCIsIFwia2V5XCJdKSAmJlxuICAgICAgICB0eXBlb2YgY3JlZGVudGlhbC5rZXkgPT09IFwic3RyaW5nXCIgJiZcbiAgICAgICAgdHlwZW9mIGNyZWRlbnRpYWwubmFtZSA9PT0gXCJzdHJpbmdcIik7XG59XG4vLyMgc291cmNlTWFwcGluZ1VSTD1henVyZU5hbWVkS2V5Q3JlZGVudGlhbC5qcy5tYXAiLAogICAgIlwidXNlIHN0cmljdFwiO1xuLy8gQ29weXJpZ2h0IChjKSBNaWNyb3NvZnQgQ29ycG9yYXRpb24uXG4vLyBMaWNlbnNlZCB1bmRlciB0aGUgTUlUIExpY2Vuc2UuXG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJfX2VzTW9kdWxlXCIsIHsgdmFsdWU6IHRydWUgfSk7XG5leHBvcnRzLkF6dXJlU0FTQ3JlZGVudGlhbCA9IHZvaWQgMDtcbmV4cG9ydHMuaXNTQVNDcmVkZW50aWFsID0gaXNTQVNDcmVkZW50aWFsO1xuY29uc3QgY29yZV91dGlsXzEgPSByZXF1aXJlKFwiQGF6dXJlL2NvcmUtdXRpbFwiKTtcbi8qKlxuICogQSBzdGF0aWMtc2lnbmF0dXJlLWJhc2VkIGNyZWRlbnRpYWwgdGhhdCBzdXBwb3J0cyB1cGRhdGluZ1xuICogdGhlIHVuZGVybHlpbmcgc2lnbmF0dXJlIHZhbHVlLlxuICovXG5jbGFzcyBBenVyZVNBU0NyZWRlbnRpYWwge1xuICAgIC8qKlxuICAgICAqIFRoZSB2YWx1ZSBvZiB0aGUgc2hhcmVkIGFjY2VzcyBzaWduYXR1cmUgdG8gYmUgdXNlZCBpbiBhdXRoZW50aWNhdGlvblxuICAgICAqL1xuICAgIGdldCBzaWduYXR1cmUoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLl9zaWduYXR1cmU7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIENyZWF0ZSBhbiBpbnN0YW5jZSBvZiBhbiBBenVyZVNBU0NyZWRlbnRpYWwgZm9yIHVzZVxuICAgICAqIHdpdGggYSBzZXJ2aWNlIGNsaWVudC5cbiAgICAgKlxuICAgICAqIEBwYXJhbSBzaWduYXR1cmUgLSBUaGUgaW5pdGlhbCB2YWx1ZSBvZiB0aGUgc2hhcmVkIGFjY2VzcyBzaWduYXR1cmUgdG8gdXNlIGluIGF1dGhlbnRpY2F0aW9uXG4gICAgICovXG4gICAgY29uc3RydWN0b3Ioc2lnbmF0dXJlKSB7XG4gICAgICAgIGlmICghc2lnbmF0dXJlKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJzaGFyZWQgYWNjZXNzIHNpZ25hdHVyZSBtdXN0IGJlIGEgbm9uLWVtcHR5IHN0cmluZ1wiKTtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLl9zaWduYXR1cmUgPSBzaWduYXR1cmU7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIENoYW5nZSB0aGUgdmFsdWUgb2YgdGhlIHNpZ25hdHVyZS5cbiAgICAgKlxuICAgICAqIFVwZGF0ZXMgd2lsbCB0YWtlIGVmZmVjdCB1cG9uIHRoZSBuZXh0IHJlcXVlc3QgYWZ0ZXJcbiAgICAgKiB1cGRhdGluZyB0aGUgc2lnbmF0dXJlIHZhbHVlLlxuICAgICAqXG4gICAgICogQHBhcmFtIG5ld1NpZ25hdHVyZSAtIFRoZSBuZXcgc2hhcmVkIGFjY2VzcyBzaWduYXR1cmUgdmFsdWUgdG8gYmUgdXNlZFxuICAgICAqL1xuICAgIHVwZGF0ZShuZXdTaWduYXR1cmUpIHtcbiAgICAgICAgaWYgKCFuZXdTaWduYXR1cmUpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihcInNoYXJlZCBhY2Nlc3Mgc2lnbmF0dXJlIG11c3QgYmUgYSBub24tZW1wdHkgc3RyaW5nXCIpO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMuX3NpZ25hdHVyZSA9IG5ld1NpZ25hdHVyZTtcbiAgICB9XG59XG5leHBvcnRzLkF6dXJlU0FTQ3JlZGVudGlhbCA9IEF6dXJlU0FTQ3JlZGVudGlhbDtcbi8qKlxuICogVGVzdHMgYW4gb2JqZWN0IHRvIGRldGVybWluZSB3aGV0aGVyIGl0IGltcGxlbWVudHMgU0FTQ3JlZGVudGlhbC5cbiAqXG4gKiBAcGFyYW0gY3JlZGVudGlhbCAtIFRoZSBhc3N1bWVkIFNBU0NyZWRlbnRpYWwgdG8gYmUgdGVzdGVkLlxuICovXG5mdW5jdGlvbiBpc1NBU0NyZWRlbnRpYWwoY3JlZGVudGlhbCkge1xuICAgIHJldHVybiAoKDAsIGNvcmVfdXRpbF8xLmlzT2JqZWN0V2l0aFByb3BlcnRpZXMpKGNyZWRlbnRpYWwsIFtcInNpZ25hdHVyZVwiXSkgJiYgdHlwZW9mIGNyZWRlbnRpYWwuc2lnbmF0dXJlID09PSBcInN0cmluZ1wiKTtcbn1cbi8vIyBzb3VyY2VNYXBwaW5nVVJMPWF6dXJlU0FTQ3JlZGVudGlhbC5qcy5tYXAiLAogICAgIlwidXNlIHN0cmljdFwiO1xuLy8gQ29weXJpZ2h0IChjKSBNaWNyb3NvZnQgQ29ycG9yYXRpb24uXG4vLyBMaWNlbnNlZCB1bmRlciB0aGUgTUlUIExpY2Vuc2UuXG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJfX2VzTW9kdWxlXCIsIHsgdmFsdWU6IHRydWUgfSk7XG5leHBvcnRzLmlzQmVhcmVyVG9rZW4gPSBpc0JlYXJlclRva2VuO1xuZXhwb3J0cy5pc1BvcFRva2VuID0gaXNQb3BUb2tlbjtcbmV4cG9ydHMuaXNUb2tlbkNyZWRlbnRpYWwgPSBpc1Rva2VuQ3JlZGVudGlhbDtcbi8qKlxuICogQGludGVybmFsXG4gKiBAcGFyYW0gYWNjZXNzVG9rZW4gLSBBY2Nlc3MgdG9rZW5cbiAqIEByZXR1cm5zIFdoZXRoZXIgYSB0b2tlbiBpcyBiZWFyZXIgdHlwZSBvciBub3RcbiAqL1xuZnVuY3Rpb24gaXNCZWFyZXJUb2tlbihhY2Nlc3NUb2tlbikge1xuICAgIHJldHVybiAhYWNjZXNzVG9rZW4udG9rZW5UeXBlIHx8IGFjY2Vzc1Rva2VuLnRva2VuVHlwZSA9PT0gXCJCZWFyZXJcIjtcbn1cbi8qKlxuICogQGludGVybmFsXG4gKiBAcGFyYW0gYWNjZXNzVG9rZW4gLSBBY2Nlc3MgdG9rZW5cbiAqIEByZXR1cm5zIFdoZXRoZXIgYSB0b2tlbiBpcyBQb3AgdG9rZW4gb3Igbm90XG4gKi9cbmZ1bmN0aW9uIGlzUG9wVG9rZW4oYWNjZXNzVG9rZW4pIHtcbiAgICByZXR1cm4gYWNjZXNzVG9rZW4udG9rZW5UeXBlID09PSBcInBvcFwiO1xufVxuLyoqXG4gKiBUZXN0cyBhbiBvYmplY3QgdG8gZGV0ZXJtaW5lIHdoZXRoZXIgaXQgaW1wbGVtZW50cyBUb2tlbkNyZWRlbnRpYWwuXG4gKlxuICogQHBhcmFtIGNyZWRlbnRpYWwgLSBUaGUgYXNzdW1lZCBUb2tlbkNyZWRlbnRpYWwgdG8gYmUgdGVzdGVkLlxuICovXG5mdW5jdGlvbiBpc1Rva2VuQ3JlZGVudGlhbChjcmVkZW50aWFsKSB7XG4gICAgLy8gQ2hlY2sgZm9yIGFuIG9iamVjdCB3aXRoIGEgJ2dldFRva2VuJyBmdW5jdGlvbiBhbmQgcG9zc2libHkgd2l0aFxuICAgIC8vIGEgJ3NpZ25SZXF1ZXN0JyBmdW5jdGlvbi4gIFdlIGRvIHRoaXMgY2hlY2sgdG8gbWFrZSBzdXJlIHRoYXRcbiAgICAvLyBhIFNlcnZpY2VDbGllbnRDcmVkZW50aWFscyBpbXBsZW1lbnRvciAobGlrZSBUb2tlbkNsaWVudENyZWRlbnRpYWxzXG4gICAgLy8gaW4gbXMtcmVzdC1ub2RlYXV0aCkgZG9lc24ndCBnZXQgbWlzdGFrZW4gZm9yIGEgVG9rZW5DcmVkZW50aWFsIGlmXG4gICAgLy8gaXQgZG9lc24ndCBhY3R1YWxseSBpbXBsZW1lbnQgVG9rZW5DcmVkZW50aWFsIGFsc28uXG4gICAgY29uc3QgY2FzdENyZWRlbnRpYWwgPSBjcmVkZW50aWFsO1xuICAgIHJldHVybiAoY2FzdENyZWRlbnRpYWwgJiZcbiAgICAgICAgdHlwZW9mIGNhc3RDcmVkZW50aWFsLmdldFRva2VuID09PSBcImZ1bmN0aW9uXCIgJiZcbiAgICAgICAgKGNhc3RDcmVkZW50aWFsLnNpZ25SZXF1ZXN0ID09PSB1bmRlZmluZWQgfHwgY2FzdENyZWRlbnRpYWwuZ2V0VG9rZW4ubGVuZ3RoID4gMCkpO1xufVxuLy8jIHNvdXJjZU1hcHBpbmdVUkw9dG9rZW5DcmVkZW50aWFsLmpzLm1hcCIsCiAgICAiXCJ1c2Ugc3RyaWN0XCI7XG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJfX2VzTW9kdWxlXCIsIHsgdmFsdWU6IHRydWUgfSk7XG5leHBvcnRzLmlzVG9rZW5DcmVkZW50aWFsID0gZXhwb3J0cy5pc1NBU0NyZWRlbnRpYWwgPSBleHBvcnRzLkF6dXJlU0FTQ3JlZGVudGlhbCA9IGV4cG9ydHMuaXNOYW1lZEtleUNyZWRlbnRpYWwgPSBleHBvcnRzLkF6dXJlTmFtZWRLZXlDcmVkZW50aWFsID0gZXhwb3J0cy5pc0tleUNyZWRlbnRpYWwgPSBleHBvcnRzLkF6dXJlS2V5Q3JlZGVudGlhbCA9IHZvaWQgMDtcbnZhciBhenVyZUtleUNyZWRlbnRpYWxfanNfMSA9IHJlcXVpcmUoXCIuL2F6dXJlS2V5Q3JlZGVudGlhbC5qc1wiKTtcbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIkF6dXJlS2V5Q3JlZGVudGlhbFwiLCB7IGVudW1lcmFibGU6IHRydWUsIGdldDogZnVuY3Rpb24gKCkgeyByZXR1cm4gYXp1cmVLZXlDcmVkZW50aWFsX2pzXzEuQXp1cmVLZXlDcmVkZW50aWFsOyB9IH0pO1xudmFyIGtleUNyZWRlbnRpYWxfanNfMSA9IHJlcXVpcmUoXCIuL2tleUNyZWRlbnRpYWwuanNcIik7XG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJpc0tleUNyZWRlbnRpYWxcIiwgeyBlbnVtZXJhYmxlOiB0cnVlLCBnZXQ6IGZ1bmN0aW9uICgpIHsgcmV0dXJuIGtleUNyZWRlbnRpYWxfanNfMS5pc0tleUNyZWRlbnRpYWw7IH0gfSk7XG52YXIgYXp1cmVOYW1lZEtleUNyZWRlbnRpYWxfanNfMSA9IHJlcXVpcmUoXCIuL2F6dXJlTmFtZWRLZXlDcmVkZW50aWFsLmpzXCIpO1xuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiQXp1cmVOYW1lZEtleUNyZWRlbnRpYWxcIiwgeyBlbnVtZXJhYmxlOiB0cnVlLCBnZXQ6IGZ1bmN0aW9uICgpIHsgcmV0dXJuIGF6dXJlTmFtZWRLZXlDcmVkZW50aWFsX2pzXzEuQXp1cmVOYW1lZEtleUNyZWRlbnRpYWw7IH0gfSk7XG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJpc05hbWVkS2V5Q3JlZGVudGlhbFwiLCB7IGVudW1lcmFibGU6IHRydWUsIGdldDogZnVuY3Rpb24gKCkgeyByZXR1cm4gYXp1cmVOYW1lZEtleUNyZWRlbnRpYWxfanNfMS5pc05hbWVkS2V5Q3JlZGVudGlhbDsgfSB9KTtcbnZhciBhenVyZVNBU0NyZWRlbnRpYWxfanNfMSA9IHJlcXVpcmUoXCIuL2F6dXJlU0FTQ3JlZGVudGlhbC5qc1wiKTtcbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIkF6dXJlU0FTQ3JlZGVudGlhbFwiLCB7IGVudW1lcmFibGU6IHRydWUsIGdldDogZnVuY3Rpb24gKCkgeyByZXR1cm4gYXp1cmVTQVNDcmVkZW50aWFsX2pzXzEuQXp1cmVTQVNDcmVkZW50aWFsOyB9IH0pO1xuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiaXNTQVNDcmVkZW50aWFsXCIsIHsgZW51bWVyYWJsZTogdHJ1ZSwgZ2V0OiBmdW5jdGlvbiAoKSB7IHJldHVybiBhenVyZVNBU0NyZWRlbnRpYWxfanNfMS5pc1NBU0NyZWRlbnRpYWw7IH0gfSk7XG52YXIgdG9rZW5DcmVkZW50aWFsX2pzXzEgPSByZXF1aXJlKFwiLi90b2tlbkNyZWRlbnRpYWwuanNcIik7XG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJpc1Rva2VuQ3JlZGVudGlhbFwiLCB7IGVudW1lcmFibGU6IHRydWUsIGdldDogZnVuY3Rpb24gKCkgeyByZXR1cm4gdG9rZW5DcmVkZW50aWFsX2pzXzEuaXNUb2tlbkNyZWRlbnRpYWw7IH0gfSk7XG4vLyMgc291cmNlTWFwcGluZ1VSTD1pbmRleC5qcy5tYXAiLAogICAgIlwidXNlIHN0cmljdFwiO1xuLy8gQ29weXJpZ2h0IChjKSBNaWNyb3NvZnQgQ29ycG9yYXRpb24uXG4vLyBMaWNlbnNlZCB1bmRlciB0aGUgTUlUIGxpY2Vuc2UuXG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJfX2VzTW9kdWxlXCIsIHsgdmFsdWU6IHRydWUgfSk7XG5leHBvcnRzLnBpcGVsaW5lQ29udGFpbnNEaXNhYmxlS2VlcEFsaXZlUG9saWN5ID0gZXhwb3J0cy5jcmVhdGVEaXNhYmxlS2VlcEFsaXZlUG9saWN5ID0gZXhwb3J0cy5kaXNhYmxlS2VlcEFsaXZlUG9saWN5TmFtZSA9IHZvaWQgMDtcbmV4cG9ydHMuZGlzYWJsZUtlZXBBbGl2ZVBvbGljeU5hbWUgPSBcIkRpc2FibGVLZWVwQWxpdmVQb2xpY3lcIjtcbmZ1bmN0aW9uIGNyZWF0ZURpc2FibGVLZWVwQWxpdmVQb2xpY3koKSB7XG4gICAgcmV0dXJuIHtcbiAgICAgICAgbmFtZTogZXhwb3J0cy5kaXNhYmxlS2VlcEFsaXZlUG9saWN5TmFtZSxcbiAgICAgICAgYXN5bmMgc2VuZFJlcXVlc3QocmVxdWVzdCwgbmV4dCkge1xuICAgICAgICAgICAgcmVxdWVzdC5kaXNhYmxlS2VlcEFsaXZlID0gdHJ1ZTtcbiAgICAgICAgICAgIHJldHVybiBuZXh0KHJlcXVlc3QpO1xuICAgICAgICB9LFxuICAgIH07XG59XG5leHBvcnRzLmNyZWF0ZURpc2FibGVLZWVwQWxpdmVQb2xpY3kgPSBjcmVhdGVEaXNhYmxlS2VlcEFsaXZlUG9saWN5O1xuLyoqXG4gKiBAaW50ZXJuYWxcbiAqL1xuZnVuY3Rpb24gcGlwZWxpbmVDb250YWluc0Rpc2FibGVLZWVwQWxpdmVQb2xpY3kocGlwZWxpbmUpIHtcbiAgICByZXR1cm4gcGlwZWxpbmUuZ2V0T3JkZXJlZFBvbGljaWVzKCkuc29tZSgocG9saWN5KSA9PiBwb2xpY3kubmFtZSA9PT0gZXhwb3J0cy5kaXNhYmxlS2VlcEFsaXZlUG9saWN5TmFtZSk7XG59XG5leHBvcnRzLnBpcGVsaW5lQ29udGFpbnNEaXNhYmxlS2VlcEFsaXZlUG9saWN5ID0gcGlwZWxpbmVDb250YWluc0Rpc2FibGVLZWVwQWxpdmVQb2xpY3k7XG4vLyMgc291cmNlTWFwcGluZ1VSTD1kaXNhYmxlS2VlcEFsaXZlUG9saWN5LmpzLm1hcCIsCiAgICAiXCJ1c2Ugc3RyaWN0XCI7XG4vLyBDb3B5cmlnaHQgKGMpIE1pY3Jvc29mdCBDb3Jwb3JhdGlvbi5cbi8vIExpY2Vuc2VkIHVuZGVyIHRoZSBNSVQgbGljZW5zZS5cbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIl9fZXNNb2R1bGVcIiwgeyB2YWx1ZTogdHJ1ZSB9KTtcbmV4cG9ydHMuZGVjb2RlU3RyaW5nVG9TdHJpbmcgPSBleHBvcnRzLmRlY29kZVN0cmluZyA9IGV4cG9ydHMuZW5jb2RlQnl0ZUFycmF5ID0gZXhwb3J0cy5lbmNvZGVTdHJpbmcgPSB2b2lkIDA7XG4vKipcbiAqIEVuY29kZXMgYSBzdHJpbmcgaW4gYmFzZTY0IGZvcm1hdC5cbiAqIEBwYXJhbSB2YWx1ZSAtIHRoZSBzdHJpbmcgdG8gZW5jb2RlXG4gKiBAaW50ZXJuYWxcbiAqL1xuZnVuY3Rpb24gZW5jb2RlU3RyaW5nKHZhbHVlKSB7XG4gICAgcmV0dXJuIEJ1ZmZlci5mcm9tKHZhbHVlKS50b1N0cmluZyhcImJhc2U2NFwiKTtcbn1cbmV4cG9ydHMuZW5jb2RlU3RyaW5nID0gZW5jb2RlU3RyaW5nO1xuLyoqXG4gKiBFbmNvZGVzIGEgYnl0ZSBhcnJheSBpbiBiYXNlNjQgZm9ybWF0LlxuICogQHBhcmFtIHZhbHVlIC0gdGhlIFVpbnQ4QXJheSB0byBlbmNvZGVcbiAqIEBpbnRlcm5hbFxuICovXG5mdW5jdGlvbiBlbmNvZGVCeXRlQXJyYXkodmFsdWUpIHtcbiAgICBjb25zdCBidWZmZXJWYWx1ZSA9IHZhbHVlIGluc3RhbmNlb2YgQnVmZmVyID8gdmFsdWUgOiBCdWZmZXIuZnJvbSh2YWx1ZS5idWZmZXIpO1xuICAgIHJldHVybiBidWZmZXJWYWx1ZS50b1N0cmluZyhcImJhc2U2NFwiKTtcbn1cbmV4cG9ydHMuZW5jb2RlQnl0ZUFycmF5ID0gZW5jb2RlQnl0ZUFycmF5O1xuLyoqXG4gKiBEZWNvZGVzIGEgYmFzZTY0IHN0cmluZyBpbnRvIGEgYnl0ZSBhcnJheS5cbiAqIEBwYXJhbSB2YWx1ZSAtIHRoZSBiYXNlNjQgc3RyaW5nIHRvIGRlY29kZVxuICogQGludGVybmFsXG4gKi9cbmZ1bmN0aW9uIGRlY29kZVN0cmluZyh2YWx1ZSkge1xuICAgIHJldHVybiBCdWZmZXIuZnJvbSh2YWx1ZSwgXCJiYXNlNjRcIik7XG59XG5leHBvcnRzLmRlY29kZVN0cmluZyA9IGRlY29kZVN0cmluZztcbi8qKlxuICogRGVjb2RlcyBhIGJhc2U2NCBzdHJpbmcgaW50byBhIHN0cmluZy5cbiAqIEBwYXJhbSB2YWx1ZSAtIHRoZSBiYXNlNjQgc3RyaW5nIHRvIGRlY29kZVxuICogQGludGVybmFsXG4gKi9cbmZ1bmN0aW9uIGRlY29kZVN0cmluZ1RvU3RyaW5nKHZhbHVlKSB7XG4gICAgcmV0dXJuIEJ1ZmZlci5mcm9tKHZhbHVlLCBcImJhc2U2NFwiKS50b1N0cmluZygpO1xufVxuZXhwb3J0cy5kZWNvZGVTdHJpbmdUb1N0cmluZyA9IGRlY29kZVN0cmluZ1RvU3RyaW5nO1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9YmFzZTY0LmpzLm1hcCIsCiAgICAiXCJ1c2Ugc3RyaWN0XCI7XG4vLyBDb3B5cmlnaHQgKGMpIE1pY3Jvc29mdCBDb3Jwb3JhdGlvbi5cbi8vIExpY2Vuc2VkIHVuZGVyIHRoZSBNSVQgbGljZW5zZS5cbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIl9fZXNNb2R1bGVcIiwgeyB2YWx1ZTogdHJ1ZSB9KTtcbmV4cG9ydHMuWE1MX0NIQVJLRVkgPSBleHBvcnRzLlhNTF9BVFRSS0VZID0gdm9pZCAwO1xuLyoqXG4gKiBEZWZhdWx0IGtleSB1c2VkIHRvIGFjY2VzcyB0aGUgWE1MIGF0dHJpYnV0ZXMuXG4gKi9cbmV4cG9ydHMuWE1MX0FUVFJLRVkgPSBcIiRcIjtcbi8qKlxuICogRGVmYXVsdCBrZXkgdXNlZCB0byBhY2Nlc3MgdGhlIFhNTCB2YWx1ZSBjb250ZW50LlxuICovXG5leHBvcnRzLlhNTF9DSEFSS0VZID0gXCJfXCI7XG4vLyMgc291cmNlTWFwcGluZ1VSTD1pbnRlcmZhY2VzLmpzLm1hcCIsCiAgICAiXCJ1c2Ugc3RyaWN0XCI7XG4vLyBDb3B5cmlnaHQgKGMpIE1pY3Jvc29mdCBDb3Jwb3JhdGlvbi5cbi8vIExpY2Vuc2VkIHVuZGVyIHRoZSBNSVQgbGljZW5zZS5cbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIl9fZXNNb2R1bGVcIiwgeyB2YWx1ZTogdHJ1ZSB9KTtcbmV4cG9ydHMuZmxhdHRlblJlc3BvbnNlID0gZXhwb3J0cy5pc1ZhbGlkVXVpZCA9IGV4cG9ydHMuaXNEdXJhdGlvbiA9IGV4cG9ydHMuaXNQcmltaXRpdmVCb2R5ID0gdm9pZCAwO1xuLyoqXG4gKiBBIHR5cGUgZ3VhcmQgZm9yIGEgcHJpbWl0aXZlIHJlc3BvbnNlIGJvZHkuXG4gKiBAcGFyYW0gdmFsdWUgLSBWYWx1ZSB0byB0ZXN0XG4gKlxuICogQGludGVybmFsXG4gKi9cbmZ1bmN0aW9uIGlzUHJpbWl0aXZlQm9keSh2YWx1ZSwgbWFwcGVyVHlwZU5hbWUpIHtcbiAgICByZXR1cm4gKG1hcHBlclR5cGVOYW1lICE9PSBcIkNvbXBvc2l0ZVwiICYmXG4gICAgICAgIG1hcHBlclR5cGVOYW1lICE9PSBcIkRpY3Rpb25hcnlcIiAmJlxuICAgICAgICAodHlwZW9mIHZhbHVlID09PSBcInN0cmluZ1wiIHx8XG4gICAgICAgICAgICB0eXBlb2YgdmFsdWUgPT09IFwibnVtYmVyXCIgfHxcbiAgICAgICAgICAgIHR5cGVvZiB2YWx1ZSA9PT0gXCJib29sZWFuXCIgfHxcbiAgICAgICAgICAgIChtYXBwZXJUeXBlTmFtZSA9PT0gbnVsbCB8fCBtYXBwZXJUeXBlTmFtZSA9PT0gdm9pZCAwID8gdm9pZCAwIDogbWFwcGVyVHlwZU5hbWUubWF0Y2goL14oRGF0ZXxEYXRlVGltZXxEYXRlVGltZVJmYzExMjN8VW5peFRpbWV8Qnl0ZUFycmF5fEJhc2U2NFVybCkkL2kpKSAhPT1cbiAgICAgICAgICAgICAgICBudWxsIHx8XG4gICAgICAgICAgICB2YWx1ZSA9PT0gdW5kZWZpbmVkIHx8XG4gICAgICAgICAgICB2YWx1ZSA9PT0gbnVsbCkpO1xufVxuZXhwb3J0cy5pc1ByaW1pdGl2ZUJvZHkgPSBpc1ByaW1pdGl2ZUJvZHk7XG5jb25zdCB2YWxpZGF0ZUlTT0R1cmF0aW9uID0gL14oLXxcXCspP1AoPzooWy0rXT9bMC05LC5dKilZKT8oPzooWy0rXT9bMC05LC5dKilNKT8oPzooWy0rXT9bMC05LC5dKilXKT8oPzooWy0rXT9bMC05LC5dKilEKT8oPzpUKD86KFstK10/WzAtOSwuXSopSCk/KD86KFstK10/WzAtOSwuXSopTSk/KD86KFstK10/WzAtOSwuXSopUyk/KT8kLztcbi8qKlxuICogUmV0dXJucyB0cnVlIGlmIHRoZSBnaXZlbiBzdHJpbmcgaXMgaW4gSVNPIDg2MDEgZm9ybWF0LlxuICogQHBhcmFtIHZhbHVlIC0gVGhlIHZhbHVlIHRvIGJlIHZhbGlkYXRlZCBmb3IgSVNPIDg2MDEgZHVyYXRpb24gZm9ybWF0LlxuICogQGludGVybmFsXG4gKi9cbmZ1bmN0aW9uIGlzRHVyYXRpb24odmFsdWUpIHtcbiAgICByZXR1cm4gdmFsaWRhdGVJU09EdXJhdGlvbi50ZXN0KHZhbHVlKTtcbn1cbmV4cG9ydHMuaXNEdXJhdGlvbiA9IGlzRHVyYXRpb247XG5jb25zdCB2YWxpZFV1aWRSZWdleCA9IC9eWzAtOWEtZkEtRl17OH0tWzAtOWEtZkEtRl17NH0tWzAtOWEtZkEtRl17NH0tWzAtOWEtZkEtRl17NH0tWzAtOWEtZkEtRl17MTJ9JC9pO1xuLyoqXG4gKiBSZXR1cm5zIHRydWUgaWYgdGhlIHByb3ZpZGVkIHV1aWQgaXMgdmFsaWQuXG4gKlxuICogQHBhcmFtIHV1aWQgLSBUaGUgdXVpZCB0aGF0IG5lZWRzIHRvIGJlIHZhbGlkYXRlZC5cbiAqXG4gKiBAaW50ZXJuYWxcbiAqL1xuZnVuY3Rpb24gaXNWYWxpZFV1aWQodXVpZCkge1xuICAgIHJldHVybiB2YWxpZFV1aWRSZWdleC50ZXN0KHV1aWQpO1xufVxuZXhwb3J0cy5pc1ZhbGlkVXVpZCA9IGlzVmFsaWRVdWlkO1xuLyoqXG4gKiBNYXBzIHRoZSByZXNwb25zZSBhcyBmb2xsb3dzOlxuICogLSB3cmFwcyB0aGUgcmVzcG9uc2UgYm9keSBpZiBuZWVkZWQgKHR5cGljYWxseSBpZiBpdHMgdHlwZSBpcyBwcmltaXRpdmUpLlxuICogLSByZXR1cm5zIG51bGwgaWYgdGhlIGNvbWJpbmF0aW9uIG9mIHRoZSBoZWFkZXJzIGFuZCB0aGUgYm9keSBpcyBlbXB0eS5cbiAqIC0gb3RoZXJ3aXNlLCByZXR1cm5zIHRoZSBjb21iaW5hdGlvbiBvZiB0aGUgaGVhZGVycyBhbmQgdGhlIGJvZHkuXG4gKlxuICogQHBhcmFtIHJlc3BvbnNlT2JqZWN0IC0gYSByZXByZXNlbnRhdGlvbiBvZiB0aGUgcGFyc2VkIHJlc3BvbnNlXG4gKiBAcmV0dXJucyB0aGUgcmVzcG9uc2UgdGhhdCB3aWxsIGJlIHJldHVybmVkIHRvIHRoZSB1c2VyIHdoaWNoIGNhbiBiZSBudWxsIGFuZC9vciB3cmFwcGVkXG4gKlxuICogQGludGVybmFsXG4gKi9cbmZ1bmN0aW9uIGhhbmRsZU51bGxhYmxlUmVzcG9uc2VBbmRXcmFwcGFibGVCb2R5KHJlc3BvbnNlT2JqZWN0KSB7XG4gICAgY29uc3QgY29tYmluZWRIZWFkZXJzQW5kQm9keSA9IE9iamVjdC5hc3NpZ24oT2JqZWN0LmFzc2lnbih7fSwgcmVzcG9uc2VPYmplY3QuaGVhZGVycyksIHJlc3BvbnNlT2JqZWN0LmJvZHkpO1xuICAgIGlmIChyZXNwb25zZU9iamVjdC5oYXNOdWxsYWJsZVR5cGUgJiZcbiAgICAgICAgT2JqZWN0LmdldE93blByb3BlcnR5TmFtZXMoY29tYmluZWRIZWFkZXJzQW5kQm9keSkubGVuZ3RoID09PSAwKSB7XG4gICAgICAgIHJldHVybiByZXNwb25zZU9iamVjdC5zaG91bGRXcmFwQm9keSA/IHsgYm9keTogbnVsbCB9IDogbnVsbDtcbiAgICB9XG4gICAgZWxzZSB7XG4gICAgICAgIHJldHVybiByZXNwb25zZU9iamVjdC5zaG91bGRXcmFwQm9keVxuICAgICAgICAgICAgPyBPYmplY3QuYXNzaWduKE9iamVjdC5hc3NpZ24oe30sIHJlc3BvbnNlT2JqZWN0LmhlYWRlcnMpLCB7IGJvZHk6IHJlc3BvbnNlT2JqZWN0LmJvZHkgfSkgOiBjb21iaW5lZEhlYWRlcnNBbmRCb2R5O1xuICAgIH1cbn1cbi8qKlxuICogVGFrZSBhIGBGdWxsT3BlcmF0aW9uUmVzcG9uc2VgIGFuZCB0dXJuIGl0IGludG8gYSBmbGF0XG4gKiByZXNwb25zZSBvYmplY3QgdG8gaGFuZCBiYWNrIHRvIHRoZSBjb25zdW1lci5cbiAqIEBwYXJhbSBmdWxsUmVzcG9uc2UgLSBUaGUgcHJvY2Vzc2VkIHJlc3BvbnNlIGZyb20gdGhlIG9wZXJhdGlvbiByZXF1ZXN0XG4gKiBAcGFyYW0gcmVzcG9uc2VTcGVjIC0gVGhlIHJlc3BvbnNlIG1hcCBmcm9tIHRoZSBPcGVyYXRpb25TcGVjXG4gKlxuICogQGludGVybmFsXG4gKi9cbmZ1bmN0aW9uIGZsYXR0ZW5SZXNwb25zZShmdWxsUmVzcG9uc2UsIHJlc3BvbnNlU3BlYykge1xuICAgIHZhciBfYSwgX2I7XG4gICAgY29uc3QgcGFyc2VkSGVhZGVycyA9IGZ1bGxSZXNwb25zZS5wYXJzZWRIZWFkZXJzO1xuICAgIC8vIGhlYWQgbWV0aG9kcyBuZXZlciBoYXZlIGEgYm9keSwgYnV0IHdlIHJldHVybiBhIGJvb2xlYW4gc2V0IHRvIGJvZHkgcHJvcGVydHlcbiAgICAvLyB0byBpbmRpY2F0ZSBwcmVzZW5jZS9hYnNlbmNlIG9mIHRoZSByZXNvdXJjZVxuICAgIGlmIChmdWxsUmVzcG9uc2UucmVxdWVzdC5tZXRob2QgPT09IFwiSEVBRFwiKSB7XG4gICAgICAgIHJldHVybiBPYmplY3QuYXNzaWduKE9iamVjdC5hc3NpZ24oe30sIHBhcnNlZEhlYWRlcnMpLCB7IGJvZHk6IGZ1bGxSZXNwb25zZS5wYXJzZWRCb2R5IH0pO1xuICAgIH1cbiAgICBjb25zdCBib2R5TWFwcGVyID0gcmVzcG9uc2VTcGVjICYmIHJlc3BvbnNlU3BlYy5ib2R5TWFwcGVyO1xuICAgIGNvbnN0IGlzTnVsbGFibGUgPSBCb29sZWFuKGJvZHlNYXBwZXIgPT09IG51bGwgfHwgYm9keU1hcHBlciA9PT0gdm9pZCAwID8gdm9pZCAwIDogYm9keU1hcHBlci5udWxsYWJsZSk7XG4gICAgY29uc3QgZXhwZWN0ZWRCb2R5VHlwZU5hbWUgPSBib2R5TWFwcGVyID09PSBudWxsIHx8IGJvZHlNYXBwZXIgPT09IHZvaWQgMCA/IHZvaWQgMCA6IGJvZHlNYXBwZXIudHlwZS5uYW1lO1xuICAgIC8qKiBJZiB0aGUgYm9keSBpcyBhc2tlZCBmb3IsIHdlIGxvb2sgYXQgdGhlIGV4cGVjdGVkIGJvZHkgdHlwZSB0byBoYW5kbGUgaXQgKi9cbiAgICBpZiAoZXhwZWN0ZWRCb2R5VHlwZU5hbWUgPT09IFwiU3RyZWFtXCIpIHtcbiAgICAgICAgcmV0dXJuIE9iamVjdC5hc3NpZ24oT2JqZWN0LmFzc2lnbih7fSwgcGFyc2VkSGVhZGVycyksIHsgYmxvYkJvZHk6IGZ1bGxSZXNwb25zZS5ibG9iQm9keSwgcmVhZGFibGVTdHJlYW1Cb2R5OiBmdWxsUmVzcG9uc2UucmVhZGFibGVTdHJlYW1Cb2R5IH0pO1xuICAgIH1cbiAgICBjb25zdCBtb2RlbFByb3BlcnRpZXMgPSAoZXhwZWN0ZWRCb2R5VHlwZU5hbWUgPT09IFwiQ29tcG9zaXRlXCIgJiZcbiAgICAgICAgYm9keU1hcHBlci50eXBlLm1vZGVsUHJvcGVydGllcykgfHxcbiAgICAgICAge307XG4gICAgY29uc3QgaXNQYWdlYWJsZVJlc3BvbnNlID0gT2JqZWN0LmtleXMobW9kZWxQcm9wZXJ0aWVzKS5zb21lKChrKSA9PiBtb2RlbFByb3BlcnRpZXNba10uc2VyaWFsaXplZE5hbWUgPT09IFwiXCIpO1xuICAgIGlmIChleHBlY3RlZEJvZHlUeXBlTmFtZSA9PT0gXCJTZXF1ZW5jZVwiIHx8IGlzUGFnZWFibGVSZXNwb25zZSkge1xuICAgICAgICBjb25zdCBhcnJheVJlc3BvbnNlID0gKF9hID0gZnVsbFJlc3BvbnNlLnBhcnNlZEJvZHkpICE9PSBudWxsICYmIF9hICE9PSB2b2lkIDAgPyBfYSA6IFtdO1xuICAgICAgICBmb3IgKGNvbnN0IGtleSBvZiBPYmplY3Qua2V5cyhtb2RlbFByb3BlcnRpZXMpKSB7XG4gICAgICAgICAgICBpZiAobW9kZWxQcm9wZXJ0aWVzW2tleV0uc2VyaWFsaXplZE5hbWUpIHtcbiAgICAgICAgICAgICAgICBhcnJheVJlc3BvbnNlW2tleV0gPSAoX2IgPSBmdWxsUmVzcG9uc2UucGFyc2VkQm9keSkgPT09IG51bGwgfHwgX2IgPT09IHZvaWQgMCA/IHZvaWQgMCA6IF9iW2tleV07XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHBhcnNlZEhlYWRlcnMpIHtcbiAgICAgICAgICAgIGZvciAoY29uc3Qga2V5IG9mIE9iamVjdC5rZXlzKHBhcnNlZEhlYWRlcnMpKSB7XG4gICAgICAgICAgICAgICAgYXJyYXlSZXNwb25zZVtrZXldID0gcGFyc2VkSGVhZGVyc1trZXldO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiBpc051bGxhYmxlICYmXG4gICAgICAgICAgICAhZnVsbFJlc3BvbnNlLnBhcnNlZEJvZHkgJiZcbiAgICAgICAgICAgICFwYXJzZWRIZWFkZXJzICYmXG4gICAgICAgICAgICBPYmplY3QuZ2V0T3duUHJvcGVydHlOYW1lcyhtb2RlbFByb3BlcnRpZXMpLmxlbmd0aCA9PT0gMFxuICAgICAgICAgICAgPyBudWxsXG4gICAgICAgICAgICA6IGFycmF5UmVzcG9uc2U7XG4gICAgfVxuICAgIHJldHVybiBoYW5kbGVOdWxsYWJsZVJlc3BvbnNlQW5kV3JhcHBhYmxlQm9keSh7XG4gICAgICAgIGJvZHk6IGZ1bGxSZXNwb25zZS5wYXJzZWRCb2R5LFxuICAgICAgICBoZWFkZXJzOiBwYXJzZWRIZWFkZXJzLFxuICAgICAgICBoYXNOdWxsYWJsZVR5cGU6IGlzTnVsbGFibGUsXG4gICAgICAgIHNob3VsZFdyYXBCb2R5OiBpc1ByaW1pdGl2ZUJvZHkoZnVsbFJlc3BvbnNlLnBhcnNlZEJvZHksIGV4cGVjdGVkQm9keVR5cGVOYW1lKSxcbiAgICB9KTtcbn1cbmV4cG9ydHMuZmxhdHRlblJlc3BvbnNlID0gZmxhdHRlblJlc3BvbnNlO1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9dXRpbHMuanMubWFwIiwKICAgICJcInVzZSBzdHJpY3RcIjtcbi8vIENvcHlyaWdodCAoYykgTWljcm9zb2Z0IENvcnBvcmF0aW9uLlxuLy8gTGljZW5zZWQgdW5kZXIgdGhlIE1JVCBsaWNlbnNlLlxuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiX19lc01vZHVsZVwiLCB7IHZhbHVlOiB0cnVlIH0pO1xuZXhwb3J0cy5NYXBwZXJUeXBlTmFtZXMgPSBleHBvcnRzLmNyZWF0ZVNlcmlhbGl6ZXIgPSB2b2lkIDA7XG5jb25zdCB0c2xpYl8xID0gcmVxdWlyZShcInRzbGliXCIpO1xuY29uc3QgYmFzZTY0ID0gdHNsaWJfMS5fX2ltcG9ydFN0YXIocmVxdWlyZShcIi4vYmFzZTY0LmpzXCIpKTtcbmNvbnN0IGludGVyZmFjZXNfanNfMSA9IHJlcXVpcmUoXCIuL2ludGVyZmFjZXMuanNcIik7XG5jb25zdCB1dGlsc19qc18xID0gcmVxdWlyZShcIi4vdXRpbHMuanNcIik7XG5jbGFzcyBTZXJpYWxpemVySW1wbCB7XG4gICAgY29uc3RydWN0b3IobW9kZWxNYXBwZXJzID0ge30sIGlzWE1MID0gZmFsc2UpIHtcbiAgICAgICAgdGhpcy5tb2RlbE1hcHBlcnMgPSBtb2RlbE1hcHBlcnM7XG4gICAgICAgIHRoaXMuaXNYTUwgPSBpc1hNTDtcbiAgICB9XG4gICAgLyoqXG4gICAgICogQGRlcHJlY2F0ZWQgUmVtb3ZpbmcgdGhlIGNvbnN0cmFpbnRzIHZhbGlkYXRpb24gb24gY2xpZW50IHNpZGUuXG4gICAgICovXG4gICAgdmFsaWRhdGVDb25zdHJhaW50cyhtYXBwZXIsIHZhbHVlLCBvYmplY3ROYW1lKSB7XG4gICAgICAgIGNvbnN0IGZhaWxWYWxpZGF0aW9uID0gKGNvbnN0cmFpbnROYW1lLCBjb25zdHJhaW50VmFsdWUpID0+IHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihgXCIke29iamVjdE5hbWV9XCIgd2l0aCB2YWx1ZSBcIiR7dmFsdWV9XCIgc2hvdWxkIHNhdGlzZnkgdGhlIGNvbnN0cmFpbnQgXCIke2NvbnN0cmFpbnROYW1lfVwiOiAke2NvbnN0cmFpbnRWYWx1ZX0uYCk7XG4gICAgICAgIH07XG4gICAgICAgIGlmIChtYXBwZXIuY29uc3RyYWludHMgJiYgdmFsdWUgIT09IHVuZGVmaW5lZCAmJiB2YWx1ZSAhPT0gbnVsbCkge1xuICAgICAgICAgICAgY29uc3QgeyBFeGNsdXNpdmVNYXhpbXVtLCBFeGNsdXNpdmVNaW5pbXVtLCBJbmNsdXNpdmVNYXhpbXVtLCBJbmNsdXNpdmVNaW5pbXVtLCBNYXhJdGVtcywgTWF4TGVuZ3RoLCBNaW5JdGVtcywgTWluTGVuZ3RoLCBNdWx0aXBsZU9mLCBQYXR0ZXJuLCBVbmlxdWVJdGVtcywgfSA9IG1hcHBlci5jb25zdHJhaW50cztcbiAgICAgICAgICAgIGlmIChFeGNsdXNpdmVNYXhpbXVtICE9PSB1bmRlZmluZWQgJiYgdmFsdWUgPj0gRXhjbHVzaXZlTWF4aW11bSkge1xuICAgICAgICAgICAgICAgIGZhaWxWYWxpZGF0aW9uKFwiRXhjbHVzaXZlTWF4aW11bVwiLCBFeGNsdXNpdmVNYXhpbXVtKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmIChFeGNsdXNpdmVNaW5pbXVtICE9PSB1bmRlZmluZWQgJiYgdmFsdWUgPD0gRXhjbHVzaXZlTWluaW11bSkge1xuICAgICAgICAgICAgICAgIGZhaWxWYWxpZGF0aW9uKFwiRXhjbHVzaXZlTWluaW11bVwiLCBFeGNsdXNpdmVNaW5pbXVtKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmIChJbmNsdXNpdmVNYXhpbXVtICE9PSB1bmRlZmluZWQgJiYgdmFsdWUgPiBJbmNsdXNpdmVNYXhpbXVtKSB7XG4gICAgICAgICAgICAgICAgZmFpbFZhbGlkYXRpb24oXCJJbmNsdXNpdmVNYXhpbXVtXCIsIEluY2x1c2l2ZU1heGltdW0pO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKEluY2x1c2l2ZU1pbmltdW0gIT09IHVuZGVmaW5lZCAmJiB2YWx1ZSA8IEluY2x1c2l2ZU1pbmltdW0pIHtcbiAgICAgICAgICAgICAgICBmYWlsVmFsaWRhdGlvbihcIkluY2x1c2l2ZU1pbmltdW1cIiwgSW5jbHVzaXZlTWluaW11bSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAoTWF4SXRlbXMgIT09IHVuZGVmaW5lZCAmJiB2YWx1ZS5sZW5ndGggPiBNYXhJdGVtcykge1xuICAgICAgICAgICAgICAgIGZhaWxWYWxpZGF0aW9uKFwiTWF4SXRlbXNcIiwgTWF4SXRlbXMpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKE1heExlbmd0aCAhPT0gdW5kZWZpbmVkICYmIHZhbHVlLmxlbmd0aCA+IE1heExlbmd0aCkge1xuICAgICAgICAgICAgICAgIGZhaWxWYWxpZGF0aW9uKFwiTWF4TGVuZ3RoXCIsIE1heExlbmd0aCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAoTWluSXRlbXMgIT09IHVuZGVmaW5lZCAmJiB2YWx1ZS5sZW5ndGggPCBNaW5JdGVtcykge1xuICAgICAgICAgICAgICAgIGZhaWxWYWxpZGF0aW9uKFwiTWluSXRlbXNcIiwgTWluSXRlbXMpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKE1pbkxlbmd0aCAhPT0gdW5kZWZpbmVkICYmIHZhbHVlLmxlbmd0aCA8IE1pbkxlbmd0aCkge1xuICAgICAgICAgICAgICAgIGZhaWxWYWxpZGF0aW9uKFwiTWluTGVuZ3RoXCIsIE1pbkxlbmd0aCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAoTXVsdGlwbGVPZiAhPT0gdW5kZWZpbmVkICYmIHZhbHVlICUgTXVsdGlwbGVPZiAhPT0gMCkge1xuICAgICAgICAgICAgICAgIGZhaWxWYWxpZGF0aW9uKFwiTXVsdGlwbGVPZlwiLCBNdWx0aXBsZU9mKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmIChQYXR0ZXJuKSB7XG4gICAgICAgICAgICAgICAgY29uc3QgcGF0dGVybiA9IHR5cGVvZiBQYXR0ZXJuID09PSBcInN0cmluZ1wiID8gbmV3IFJlZ0V4cChQYXR0ZXJuKSA6IFBhdHRlcm47XG4gICAgICAgICAgICAgICAgaWYgKHR5cGVvZiB2YWx1ZSAhPT0gXCJzdHJpbmdcIiB8fCB2YWx1ZS5tYXRjaChwYXR0ZXJuKSA9PT0gbnVsbCkge1xuICAgICAgICAgICAgICAgICAgICBmYWlsVmFsaWRhdGlvbihcIlBhdHRlcm5cIiwgUGF0dGVybik7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKFVuaXF1ZUl0ZW1zICYmXG4gICAgICAgICAgICAgICAgdmFsdWUuc29tZSgoaXRlbSwgaSwgYXIpID0+IGFyLmluZGV4T2YoaXRlbSkgIT09IGkpKSB7XG4gICAgICAgICAgICAgICAgZmFpbFZhbGlkYXRpb24oXCJVbmlxdWVJdGVtc1wiLCBVbmlxdWVJdGVtcyk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG4gICAgLyoqXG4gICAgICogU2VyaWFsaXplIHRoZSBnaXZlbiBvYmplY3QgYmFzZWQgb24gaXRzIG1ldGFkYXRhIGRlZmluZWQgaW4gdGhlIG1hcHBlclxuICAgICAqXG4gICAgICogQHBhcmFtIG1hcHBlciAtIFRoZSBtYXBwZXIgd2hpY2ggZGVmaW5lcyB0aGUgbWV0YWRhdGEgb2YgdGhlIHNlcmlhbGl6YWJsZSBvYmplY3RcbiAgICAgKlxuICAgICAqIEBwYXJhbSBvYmplY3QgLSBBIHZhbGlkIEphdmFzY3JpcHQgb2JqZWN0IHRvIGJlIHNlcmlhbGl6ZWRcbiAgICAgKlxuICAgICAqIEBwYXJhbSBvYmplY3ROYW1lIC0gTmFtZSBvZiB0aGUgc2VyaWFsaXplZCBvYmplY3RcbiAgICAgKlxuICAgICAqIEBwYXJhbSBvcHRpb25zIC0gYWRkaXRpb25hbCBvcHRpb25zIHRvIHNlcmlhbGl6YXRpb25cbiAgICAgKlxuICAgICAqIEByZXR1cm5zIEEgdmFsaWQgc2VyaWFsaXplZCBKYXZhc2NyaXB0IG9iamVjdFxuICAgICAqL1xuICAgIHNlcmlhbGl6ZShtYXBwZXIsIG9iamVjdCwgb2JqZWN0TmFtZSwgb3B0aW9ucyA9IHsgeG1sOiB7fSB9KSB7XG4gICAgICAgIHZhciBfYSwgX2IsIF9jO1xuICAgICAgICBjb25zdCB1cGRhdGVkT3B0aW9ucyA9IHtcbiAgICAgICAgICAgIHhtbDoge1xuICAgICAgICAgICAgICAgIHJvb3ROYW1lOiAoX2EgPSBvcHRpb25zLnhtbC5yb290TmFtZSkgIT09IG51bGwgJiYgX2EgIT09IHZvaWQgMCA/IF9hIDogXCJcIixcbiAgICAgICAgICAgICAgICBpbmNsdWRlUm9vdDogKF9iID0gb3B0aW9ucy54bWwuaW5jbHVkZVJvb3QpICE9PSBudWxsICYmIF9iICE9PSB2b2lkIDAgPyBfYiA6IGZhbHNlLFxuICAgICAgICAgICAgICAgIHhtbENoYXJLZXk6IChfYyA9IG9wdGlvbnMueG1sLnhtbENoYXJLZXkpICE9PSBudWxsICYmIF9jICE9PSB2b2lkIDAgPyBfYyA6IGludGVyZmFjZXNfanNfMS5YTUxfQ0hBUktFWSxcbiAgICAgICAgICAgIH0sXG4gICAgICAgIH07XG4gICAgICAgIGxldCBwYXlsb2FkID0ge307XG4gICAgICAgIGNvbnN0IG1hcHBlclR5cGUgPSBtYXBwZXIudHlwZS5uYW1lO1xuICAgICAgICBpZiAoIW9iamVjdE5hbWUpIHtcbiAgICAgICAgICAgIG9iamVjdE5hbWUgPSBtYXBwZXIuc2VyaWFsaXplZE5hbWU7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKG1hcHBlclR5cGUubWF0Y2goL15TZXF1ZW5jZSQvaSkgIT09IG51bGwpIHtcbiAgICAgICAgICAgIHBheWxvYWQgPSBbXTtcbiAgICAgICAgfVxuICAgICAgICBpZiAobWFwcGVyLmlzQ29uc3RhbnQpIHtcbiAgICAgICAgICAgIG9iamVjdCA9IG1hcHBlci5kZWZhdWx0VmFsdWU7XG4gICAgICAgIH1cbiAgICAgICAgLy8gVGhpcyB0YWJsZSBvZiBhbGxvd2VkIHZhbHVlcyBzaG91bGQgaGVscCBleHBsYWluXG4gICAgICAgIC8vIHRoZSBtYXBwZXIucmVxdWlyZWQgYW5kIG1hcHBlci5udWxsYWJsZSBwcm9wZXJ0aWVzLlxuICAgICAgICAvLyBYIG1lYW5zIFwibmVpdGhlciB1bmRlZmluZWQgb3IgbnVsbCBhcmUgYWxsb3dlZFwiLlxuICAgICAgICAvLyAgICAgICAgICAgfHwgcmVxdWlyZWRcbiAgICAgICAgLy8gICAgICAgICAgIHx8IHRydWUgICAgICB8IGZhbHNlXG4gICAgICAgIC8vICBudWxsYWJsZSB8fCA9PT09PT09PT09PT09PT09PT09PT09PT09PVxuICAgICAgICAvLyAgICAgIHRydWUgfHwgbnVsbCAgICAgIHwgdW5kZWZpbmVkL251bGxcbiAgICAgICAgLy8gICAgIGZhbHNlIHx8IFggICAgICAgICB8IHVuZGVmaW5lZFxuICAgICAgICAvLyB1bmRlZmluZWQgfHwgWCAgICAgICAgIHwgdW5kZWZpbmVkL251bGxcbiAgICAgICAgY29uc3QgeyByZXF1aXJlZCwgbnVsbGFibGUgfSA9IG1hcHBlcjtcbiAgICAgICAgaWYgKHJlcXVpcmVkICYmIG51bGxhYmxlICYmIG9iamVjdCA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYCR7b2JqZWN0TmFtZX0gY2Fubm90IGJlIHVuZGVmaW5lZC5gKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAocmVxdWlyZWQgJiYgIW51bGxhYmxlICYmIChvYmplY3QgPT09IHVuZGVmaW5lZCB8fCBvYmplY3QgPT09IG51bGwpKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYCR7b2JqZWN0TmFtZX0gY2Fubm90IGJlIG51bGwgb3IgdW5kZWZpbmVkLmApO1xuICAgICAgICB9XG4gICAgICAgIGlmICghcmVxdWlyZWQgJiYgbnVsbGFibGUgPT09IGZhbHNlICYmIG9iamVjdCA9PT0gbnVsbCkge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGAke29iamVjdE5hbWV9IGNhbm5vdCBiZSBudWxsLmApO1xuICAgICAgICB9XG4gICAgICAgIGlmIChvYmplY3QgPT09IHVuZGVmaW5lZCB8fCBvYmplY3QgPT09IG51bGwpIHtcbiAgICAgICAgICAgIHBheWxvYWQgPSBvYmplY3Q7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICBpZiAobWFwcGVyVHlwZS5tYXRjaCgvXmFueSQvaSkgIT09IG51bGwpIHtcbiAgICAgICAgICAgICAgICBwYXlsb2FkID0gb2JqZWN0O1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSBpZiAobWFwcGVyVHlwZS5tYXRjaCgvXihOdW1iZXJ8U3RyaW5nfEJvb2xlYW58T2JqZWN0fFN0cmVhbXxVdWlkKSQvaSkgIT09IG51bGwpIHtcbiAgICAgICAgICAgICAgICBwYXlsb2FkID0gc2VyaWFsaXplQmFzaWNUeXBlcyhtYXBwZXJUeXBlLCBvYmplY3ROYW1lLCBvYmplY3QpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSBpZiAobWFwcGVyVHlwZS5tYXRjaCgvXkVudW0kL2kpICE9PSBudWxsKSB7XG4gICAgICAgICAgICAgICAgY29uc3QgZW51bU1hcHBlciA9IG1hcHBlcjtcbiAgICAgICAgICAgICAgICBwYXlsb2FkID0gc2VyaWFsaXplRW51bVR5cGUob2JqZWN0TmFtZSwgZW51bU1hcHBlci50eXBlLmFsbG93ZWRWYWx1ZXMsIG9iamVjdCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIGlmIChtYXBwZXJUeXBlLm1hdGNoKC9eKERhdGV8RGF0ZVRpbWV8VGltZVNwYW58RGF0ZVRpbWVSZmMxMTIzfFVuaXhUaW1lKSQvaSkgIT09IG51bGwpIHtcbiAgICAgICAgICAgICAgICBwYXlsb2FkID0gc2VyaWFsaXplRGF0ZVR5cGVzKG1hcHBlclR5cGUsIG9iamVjdCwgb2JqZWN0TmFtZSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIGlmIChtYXBwZXJUeXBlLm1hdGNoKC9eQnl0ZUFycmF5JC9pKSAhPT0gbnVsbCkge1xuICAgICAgICAgICAgICAgIHBheWxvYWQgPSBzZXJpYWxpemVCeXRlQXJyYXlUeXBlKG9iamVjdE5hbWUsIG9iamVjdCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIGlmIChtYXBwZXJUeXBlLm1hdGNoKC9eQmFzZTY0VXJsJC9pKSAhPT0gbnVsbCkge1xuICAgICAgICAgICAgICAgIHBheWxvYWQgPSBzZXJpYWxpemVCYXNlNjRVcmxUeXBlKG9iamVjdE5hbWUsIG9iamVjdCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIGlmIChtYXBwZXJUeXBlLm1hdGNoKC9eU2VxdWVuY2UkL2kpICE9PSBudWxsKSB7XG4gICAgICAgICAgICAgICAgcGF5bG9hZCA9IHNlcmlhbGl6ZVNlcXVlbmNlVHlwZSh0aGlzLCBtYXBwZXIsIG9iamVjdCwgb2JqZWN0TmFtZSwgQm9vbGVhbih0aGlzLmlzWE1MKSwgdXBkYXRlZE9wdGlvbnMpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSBpZiAobWFwcGVyVHlwZS5tYXRjaCgvXkRpY3Rpb25hcnkkL2kpICE9PSBudWxsKSB7XG4gICAgICAgICAgICAgICAgcGF5bG9hZCA9IHNlcmlhbGl6ZURpY3Rpb25hcnlUeXBlKHRoaXMsIG1hcHBlciwgb2JqZWN0LCBvYmplY3ROYW1lLCBCb29sZWFuKHRoaXMuaXNYTUwpLCB1cGRhdGVkT3B0aW9ucyk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIGlmIChtYXBwZXJUeXBlLm1hdGNoKC9eQ29tcG9zaXRlJC9pKSAhPT0gbnVsbCkge1xuICAgICAgICAgICAgICAgIHBheWxvYWQgPSBzZXJpYWxpemVDb21wb3NpdGVUeXBlKHRoaXMsIG1hcHBlciwgb2JqZWN0LCBvYmplY3ROYW1lLCBCb29sZWFuKHRoaXMuaXNYTUwpLCB1cGRhdGVkT3B0aW9ucyk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHBheWxvYWQ7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIERlc2VyaWFsaXplIHRoZSBnaXZlbiBvYmplY3QgYmFzZWQgb24gaXRzIG1ldGFkYXRhIGRlZmluZWQgaW4gdGhlIG1hcHBlclxuICAgICAqXG4gICAgICogQHBhcmFtIG1hcHBlciAtIFRoZSBtYXBwZXIgd2hpY2ggZGVmaW5lcyB0aGUgbWV0YWRhdGEgb2YgdGhlIHNlcmlhbGl6YWJsZSBvYmplY3RcbiAgICAgKlxuICAgICAqIEBwYXJhbSByZXNwb25zZUJvZHkgLSBBIHZhbGlkIEphdmFzY3JpcHQgZW50aXR5IHRvIGJlIGRlc2VyaWFsaXplZFxuICAgICAqXG4gICAgICogQHBhcmFtIG9iamVjdE5hbWUgLSBOYW1lIG9mIHRoZSBkZXNlcmlhbGl6ZWQgb2JqZWN0XG4gICAgICpcbiAgICAgKiBAcGFyYW0gb3B0aW9ucyAtIENvbnRyb2xzIGJlaGF2aW9yIG9mIFhNTCBwYXJzZXIgYW5kIGJ1aWxkZXIuXG4gICAgICpcbiAgICAgKiBAcmV0dXJucyBBIHZhbGlkIGRlc2VyaWFsaXplZCBKYXZhc2NyaXB0IG9iamVjdFxuICAgICAqL1xuICAgIGRlc2VyaWFsaXplKG1hcHBlciwgcmVzcG9uc2VCb2R5LCBvYmplY3ROYW1lLCBvcHRpb25zID0geyB4bWw6IHt9IH0pIHtcbiAgICAgICAgdmFyIF9hLCBfYiwgX2MsIF9kO1xuICAgICAgICBjb25zdCB1cGRhdGVkT3B0aW9ucyA9IHtcbiAgICAgICAgICAgIHhtbDoge1xuICAgICAgICAgICAgICAgIHJvb3ROYW1lOiAoX2EgPSBvcHRpb25zLnhtbC5yb290TmFtZSkgIT09IG51bGwgJiYgX2EgIT09IHZvaWQgMCA/IF9hIDogXCJcIixcbiAgICAgICAgICAgICAgICBpbmNsdWRlUm9vdDogKF9iID0gb3B0aW9ucy54bWwuaW5jbHVkZVJvb3QpICE9PSBudWxsICYmIF9iICE9PSB2b2lkIDAgPyBfYiA6IGZhbHNlLFxuICAgICAgICAgICAgICAgIHhtbENoYXJLZXk6IChfYyA9IG9wdGlvbnMueG1sLnhtbENoYXJLZXkpICE9PSBudWxsICYmIF9jICE9PSB2b2lkIDAgPyBfYyA6IGludGVyZmFjZXNfanNfMS5YTUxfQ0hBUktFWSxcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBpZ25vcmVVbmtub3duUHJvcGVydGllczogKF9kID0gb3B0aW9ucy5pZ25vcmVVbmtub3duUHJvcGVydGllcykgIT09IG51bGwgJiYgX2QgIT09IHZvaWQgMCA/IF9kIDogZmFsc2UsXG4gICAgICAgIH07XG4gICAgICAgIGlmIChyZXNwb25zZUJvZHkgPT09IHVuZGVmaW5lZCB8fCByZXNwb25zZUJvZHkgPT09IG51bGwpIHtcbiAgICAgICAgICAgIGlmICh0aGlzLmlzWE1MICYmIG1hcHBlci50eXBlLm5hbWUgPT09IFwiU2VxdWVuY2VcIiAmJiAhbWFwcGVyLnhtbElzV3JhcHBlZCkge1xuICAgICAgICAgICAgICAgIC8vIEVkZ2UgY2FzZSBmb3IgZW1wdHkgWE1MIG5vbi13cmFwcGVkIGxpc3RzLiB4bWwyanMgY2FuJ3QgZGlzdGluZ3Vpc2hcbiAgICAgICAgICAgICAgICAvLyBiZXR3ZWVuIHRoZSBsaXN0IGJlaW5nIGVtcHR5IHZlcnN1cyBiZWluZyBtaXNzaW5nLFxuICAgICAgICAgICAgICAgIC8vIHNvIGxldCdzIGRvIHRoZSBtb3JlIHVzZXItZnJpZW5kbHkgdGhpbmcgYW5kIHJldHVybiBhbiBlbXB0eSBsaXN0LlxuICAgICAgICAgICAgICAgIHJlc3BvbnNlQm9keSA9IFtdO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgLy8gc3BlY2lmaWNhbGx5IGNoZWNrIGZvciB1bmRlZmluZWQgYXMgZGVmYXVsdCB2YWx1ZSBjYW4gYmUgYSBmYWxzZXkgdmFsdWUgYDAsIFwiXCIsIGZhbHNlLCBudWxsYFxuICAgICAgICAgICAgaWYgKG1hcHBlci5kZWZhdWx0VmFsdWUgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgICAgIHJlc3BvbnNlQm9keSA9IG1hcHBlci5kZWZhdWx0VmFsdWU7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4gcmVzcG9uc2VCb2R5O1xuICAgICAgICB9XG4gICAgICAgIGxldCBwYXlsb2FkO1xuICAgICAgICBjb25zdCBtYXBwZXJUeXBlID0gbWFwcGVyLnR5cGUubmFtZTtcbiAgICAgICAgaWYgKCFvYmplY3ROYW1lKSB7XG4gICAgICAgICAgICBvYmplY3ROYW1lID0gbWFwcGVyLnNlcmlhbGl6ZWROYW1lO1xuICAgICAgICB9XG4gICAgICAgIGlmIChtYXBwZXJUeXBlLm1hdGNoKC9eQ29tcG9zaXRlJC9pKSAhPT0gbnVsbCkge1xuICAgICAgICAgICAgcGF5bG9hZCA9IGRlc2VyaWFsaXplQ29tcG9zaXRlVHlwZSh0aGlzLCBtYXBwZXIsIHJlc3BvbnNlQm9keSwgb2JqZWN0TmFtZSwgdXBkYXRlZE9wdGlvbnMpO1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgaWYgKHRoaXMuaXNYTUwpIHtcbiAgICAgICAgICAgICAgICBjb25zdCB4bWxDaGFyS2V5ID0gdXBkYXRlZE9wdGlvbnMueG1sLnhtbENoYXJLZXk7XG4gICAgICAgICAgICAgICAgLyoqXG4gICAgICAgICAgICAgICAgICogSWYgdGhlIG1hcHBlciBzcGVjaWZpZXMgdGhpcyBhcyBhIG5vbi1jb21wb3NpdGUgdHlwZSB2YWx1ZSBidXQgdGhlIHJlc3BvbnNlQm9keSBjb250YWluc1xuICAgICAgICAgICAgICAgICAqIGJvdGggaGVhZGVyIChcIiRcIiBpLmUuLCBYTUxfQVRUUktFWSkgYW5kIGJvZHkgKFwiI1wiIGkuZS4sIFhNTF9DSEFSS0VZKSBwcm9wZXJ0aWVzLFxuICAgICAgICAgICAgICAgICAqIHRoZW4ganVzdCByZWR1Y2UgdGhlIHJlc3BvbnNlQm9keSB2YWx1ZSB0byB0aGUgYm9keSAoXCIjXCIgaS5lLiwgWE1MX0NIQVJLRVkpIHByb3BlcnR5LlxuICAgICAgICAgICAgICAgICAqL1xuICAgICAgICAgICAgICAgIGlmIChyZXNwb25zZUJvZHlbaW50ZXJmYWNlc19qc18xLlhNTF9BVFRSS0VZXSAhPT0gdW5kZWZpbmVkICYmIHJlc3BvbnNlQm9keVt4bWxDaGFyS2V5XSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICAgICAgICAgIHJlc3BvbnNlQm9keSA9IHJlc3BvbnNlQm9keVt4bWxDaGFyS2V5XTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAobWFwcGVyVHlwZS5tYXRjaCgvXk51bWJlciQvaSkgIT09IG51bGwpIHtcbiAgICAgICAgICAgICAgICBwYXlsb2FkID0gcGFyc2VGbG9hdChyZXNwb25zZUJvZHkpO1xuICAgICAgICAgICAgICAgIGlmIChpc05hTihwYXlsb2FkKSkge1xuICAgICAgICAgICAgICAgICAgICBwYXlsb2FkID0gcmVzcG9uc2VCb2R5O1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2UgaWYgKG1hcHBlclR5cGUubWF0Y2goL15Cb29sZWFuJC9pKSAhPT0gbnVsbCkge1xuICAgICAgICAgICAgICAgIGlmIChyZXNwb25zZUJvZHkgPT09IFwidHJ1ZVwiKSB7XG4gICAgICAgICAgICAgICAgICAgIHBheWxvYWQgPSB0cnVlO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBlbHNlIGlmIChyZXNwb25zZUJvZHkgPT09IFwiZmFsc2VcIikge1xuICAgICAgICAgICAgICAgICAgICBwYXlsb2FkID0gZmFsc2U7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICBwYXlsb2FkID0gcmVzcG9uc2VCb2R5O1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2UgaWYgKG1hcHBlclR5cGUubWF0Y2goL14oU3RyaW5nfEVudW18T2JqZWN0fFN0cmVhbXxVdWlkfFRpbWVTcGFufGFueSkkL2kpICE9PSBudWxsKSB7XG4gICAgICAgICAgICAgICAgcGF5bG9hZCA9IHJlc3BvbnNlQm9keTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2UgaWYgKG1hcHBlclR5cGUubWF0Y2goL14oRGF0ZXxEYXRlVGltZXxEYXRlVGltZVJmYzExMjMpJC9pKSAhPT0gbnVsbCkge1xuICAgICAgICAgICAgICAgIHBheWxvYWQgPSBuZXcgRGF0ZShyZXNwb25zZUJvZHkpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSBpZiAobWFwcGVyVHlwZS5tYXRjaCgvXlVuaXhUaW1lJC9pKSAhPT0gbnVsbCkge1xuICAgICAgICAgICAgICAgIHBheWxvYWQgPSB1bml4VGltZVRvRGF0ZShyZXNwb25zZUJvZHkpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSBpZiAobWFwcGVyVHlwZS5tYXRjaCgvXkJ5dGVBcnJheSQvaSkgIT09IG51bGwpIHtcbiAgICAgICAgICAgICAgICBwYXlsb2FkID0gYmFzZTY0LmRlY29kZVN0cmluZyhyZXNwb25zZUJvZHkpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSBpZiAobWFwcGVyVHlwZS5tYXRjaCgvXkJhc2U2NFVybCQvaSkgIT09IG51bGwpIHtcbiAgICAgICAgICAgICAgICBwYXlsb2FkID0gYmFzZTY0VXJsVG9CeXRlQXJyYXkocmVzcG9uc2VCb2R5KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2UgaWYgKG1hcHBlclR5cGUubWF0Y2goL15TZXF1ZW5jZSQvaSkgIT09IG51bGwpIHtcbiAgICAgICAgICAgICAgICBwYXlsb2FkID0gZGVzZXJpYWxpemVTZXF1ZW5jZVR5cGUodGhpcywgbWFwcGVyLCByZXNwb25zZUJvZHksIG9iamVjdE5hbWUsIHVwZGF0ZWRPcHRpb25zKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2UgaWYgKG1hcHBlclR5cGUubWF0Y2goL15EaWN0aW9uYXJ5JC9pKSAhPT0gbnVsbCkge1xuICAgICAgICAgICAgICAgIHBheWxvYWQgPSBkZXNlcmlhbGl6ZURpY3Rpb25hcnlUeXBlKHRoaXMsIG1hcHBlciwgcmVzcG9uc2VCb2R5LCBvYmplY3ROYW1lLCB1cGRhdGVkT3B0aW9ucyk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgaWYgKG1hcHBlci5pc0NvbnN0YW50KSB7XG4gICAgICAgICAgICBwYXlsb2FkID0gbWFwcGVyLmRlZmF1bHRWYWx1ZTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gcGF5bG9hZDtcbiAgICB9XG59XG4vKipcbiAqIE1ldGhvZCB0aGF0IGNyZWF0ZXMgYW5kIHJldHVybnMgYSBTZXJpYWxpemVyLlxuICogQHBhcmFtIG1vZGVsTWFwcGVycyAtIEtub3duIG1vZGVscyB0byBtYXBcbiAqIEBwYXJhbSBpc1hNTCAtIElmIFhNTCBzaG91bGQgYmUgc3VwcG9ydGVkXG4gKi9cbmZ1bmN0aW9uIGNyZWF0ZVNlcmlhbGl6ZXIobW9kZWxNYXBwZXJzID0ge30sIGlzWE1MID0gZmFsc2UpIHtcbiAgICByZXR1cm4gbmV3IFNlcmlhbGl6ZXJJbXBsKG1vZGVsTWFwcGVycywgaXNYTUwpO1xufVxuZXhwb3J0cy5jcmVhdGVTZXJpYWxpemVyID0gY3JlYXRlU2VyaWFsaXplcjtcbmZ1bmN0aW9uIHRyaW1FbmQoc3RyLCBjaCkge1xuICAgIGxldCBsZW4gPSBzdHIubGVuZ3RoO1xuICAgIHdoaWxlIChsZW4gLSAxID49IDAgJiYgc3RyW2xlbiAtIDFdID09PSBjaCkge1xuICAgICAgICAtLWxlbjtcbiAgICB9XG4gICAgcmV0dXJuIHN0ci5zdWJzdHIoMCwgbGVuKTtcbn1cbmZ1bmN0aW9uIGJ1ZmZlclRvQmFzZTY0VXJsKGJ1ZmZlcikge1xuICAgIGlmICghYnVmZmVyKSB7XG4gICAgICAgIHJldHVybiB1bmRlZmluZWQ7XG4gICAgfVxuICAgIGlmICghKGJ1ZmZlciBpbnN0YW5jZW9mIFVpbnQ4QXJyYXkpKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihgUGxlYXNlIHByb3ZpZGUgYW4gaW5wdXQgb2YgdHlwZSBVaW50OEFycmF5IGZvciBjb252ZXJ0aW5nIHRvIEJhc2U2NFVybC5gKTtcbiAgICB9XG4gICAgLy8gVWludDhBcnJheSB0byBCYXNlNjQuXG4gICAgY29uc3Qgc3RyID0gYmFzZTY0LmVuY29kZUJ5dGVBcnJheShidWZmZXIpO1xuICAgIC8vIEJhc2U2NCB0byBCYXNlNjRVcmwuXG4gICAgcmV0dXJuIHRyaW1FbmQoc3RyLCBcIj1cIikucmVwbGFjZSgvXFwrL2csIFwiLVwiKS5yZXBsYWNlKC9cXC8vZywgXCJfXCIpO1xufVxuZnVuY3Rpb24gYmFzZTY0VXJsVG9CeXRlQXJyYXkoc3RyKSB7XG4gICAgaWYgKCFzdHIpIHtcbiAgICAgICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICB9XG4gICAgaWYgKHN0ciAmJiB0eXBlb2Ygc3RyLnZhbHVlT2YoKSAhPT0gXCJzdHJpbmdcIikge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJQbGVhc2UgcHJvdmlkZSBhbiBpbnB1dCBvZiB0eXBlIHN0cmluZyBmb3IgY29udmVydGluZyB0byBVaW50OEFycmF5XCIpO1xuICAgIH1cbiAgICAvLyBCYXNlNjRVcmwgdG8gQmFzZTY0LlxuICAgIHN0ciA9IHN0ci5yZXBsYWNlKC8tL2csIFwiK1wiKS5yZXBsYWNlKC9fL2csIFwiL1wiKTtcbiAgICAvLyBCYXNlNjQgdG8gVWludDhBcnJheS5cbiAgICByZXR1cm4gYmFzZTY0LmRlY29kZVN0cmluZyhzdHIpO1xufVxuZnVuY3Rpb24gc3BsaXRTZXJpYWxpemVOYW1lKHByb3ApIHtcbiAgICBjb25zdCBjbGFzc2VzID0gW107XG4gICAgbGV0IHBhcnRpYWxjbGFzcyA9IFwiXCI7XG4gICAgaWYgKHByb3ApIHtcbiAgICAgICAgY29uc3Qgc3Vid29yZHMgPSBwcm9wLnNwbGl0KFwiLlwiKTtcbiAgICAgICAgZm9yIChjb25zdCBpdGVtIG9mIHN1YndvcmRzKSB7XG4gICAgICAgICAgICBpZiAoaXRlbS5jaGFyQXQoaXRlbS5sZW5ndGggLSAxKSA9PT0gXCJcXFxcXCIpIHtcbiAgICAgICAgICAgICAgICBwYXJ0aWFsY2xhc3MgKz0gaXRlbS5zdWJzdHIoMCwgaXRlbS5sZW5ndGggLSAxKSArIFwiLlwiO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgcGFydGlhbGNsYXNzICs9IGl0ZW07XG4gICAgICAgICAgICAgICAgY2xhc3Nlcy5wdXNoKHBhcnRpYWxjbGFzcyk7XG4gICAgICAgICAgICAgICAgcGFydGlhbGNsYXNzID0gXCJcIjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gY2xhc3Nlcztcbn1cbmZ1bmN0aW9uIGRhdGVUb1VuaXhUaW1lKGQpIHtcbiAgICBpZiAoIWQpIHtcbiAgICAgICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICB9XG4gICAgaWYgKHR5cGVvZiBkLnZhbHVlT2YoKSA9PT0gXCJzdHJpbmdcIikge1xuICAgICAgICBkID0gbmV3IERhdGUoZCk7XG4gICAgfVxuICAgIHJldHVybiBNYXRoLmZsb29yKGQuZ2V0VGltZSgpIC8gMTAwMCk7XG59XG5mdW5jdGlvbiB1bml4VGltZVRvRGF0ZShuKSB7XG4gICAgaWYgKCFuKSB7XG4gICAgICAgIHJldHVybiB1bmRlZmluZWQ7XG4gICAgfVxuICAgIHJldHVybiBuZXcgRGF0ZShuICogMTAwMCk7XG59XG5mdW5jdGlvbiBzZXJpYWxpemVCYXNpY1R5cGVzKHR5cGVOYW1lLCBvYmplY3ROYW1lLCB2YWx1ZSkge1xuICAgIGlmICh2YWx1ZSAhPT0gbnVsbCAmJiB2YWx1ZSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgIGlmICh0eXBlTmFtZS5tYXRjaCgvXk51bWJlciQvaSkgIT09IG51bGwpIHtcbiAgICAgICAgICAgIGlmICh0eXBlb2YgdmFsdWUgIT09IFwibnVtYmVyXCIpIHtcbiAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYCR7b2JqZWN0TmFtZX0gd2l0aCB2YWx1ZSAke3ZhbHVlfSBtdXN0IGJlIG9mIHR5cGUgbnVtYmVyLmApO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGVsc2UgaWYgKHR5cGVOYW1lLm1hdGNoKC9eU3RyaW5nJC9pKSAhPT0gbnVsbCkge1xuICAgICAgICAgICAgaWYgKHR5cGVvZiB2YWx1ZS52YWx1ZU9mKCkgIT09IFwic3RyaW5nXCIpIHtcbiAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYCR7b2JqZWN0TmFtZX0gd2l0aCB2YWx1ZSBcIiR7dmFsdWV9XCIgbXVzdCBiZSBvZiB0eXBlIHN0cmluZy5gKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBlbHNlIGlmICh0eXBlTmFtZS5tYXRjaCgvXlV1aWQkL2kpICE9PSBudWxsKSB7XG4gICAgICAgICAgICBpZiAoISh0eXBlb2YgdmFsdWUudmFsdWVPZigpID09PSBcInN0cmluZ1wiICYmICgwLCB1dGlsc19qc18xLmlzVmFsaWRVdWlkKSh2YWx1ZSkpKSB7XG4gICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGAke29iamVjdE5hbWV9IHdpdGggdmFsdWUgXCIke3ZhbHVlfVwiIG11c3QgYmUgb2YgdHlwZSBzdHJpbmcgYW5kIGEgdmFsaWQgdXVpZC5gKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBlbHNlIGlmICh0eXBlTmFtZS5tYXRjaCgvXkJvb2xlYW4kL2kpICE9PSBudWxsKSB7XG4gICAgICAgICAgICBpZiAodHlwZW9mIHZhbHVlICE9PSBcImJvb2xlYW5cIikge1xuICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihgJHtvYmplY3ROYW1lfSB3aXRoIHZhbHVlICR7dmFsdWV9IG11c3QgYmUgb2YgdHlwZSBib29sZWFuLmApO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGVsc2UgaWYgKHR5cGVOYW1lLm1hdGNoKC9eU3RyZWFtJC9pKSAhPT0gbnVsbCkge1xuICAgICAgICAgICAgY29uc3Qgb2JqZWN0VHlwZSA9IHR5cGVvZiB2YWx1ZTtcbiAgICAgICAgICAgIGlmIChvYmplY3RUeXBlICE9PSBcInN0cmluZ1wiICYmXG4gICAgICAgICAgICAgICAgdHlwZW9mIHZhbHVlLnBpcGUgIT09IFwiZnVuY3Rpb25cIiAmJiAvLyBOb2RlSlMuUmVhZGFibGVTdHJlYW1cbiAgICAgICAgICAgICAgICB0eXBlb2YgdmFsdWUudGVlICE9PSBcImZ1bmN0aW9uXCIgJiYgLy8gYnJvd3NlciBSZWFkYWJsZVN0cmVhbVxuICAgICAgICAgICAgICAgICEodmFsdWUgaW5zdGFuY2VvZiBBcnJheUJ1ZmZlcikgJiZcbiAgICAgICAgICAgICAgICAhQXJyYXlCdWZmZXIuaXNWaWV3KHZhbHVlKSAmJlxuICAgICAgICAgICAgICAgIC8vIEZpbGUgb2JqZWN0cyBjb3VudCBhcyBhIHR5cGUgb2YgQmxvYiwgc28gd2Ugd2FudCB0byB1c2UgaW5zdGFuY2VvZiBleHBsaWNpdGx5XG4gICAgICAgICAgICAgICAgISgodHlwZW9mIEJsb2IgPT09IFwiZnVuY3Rpb25cIiB8fCB0eXBlb2YgQmxvYiA9PT0gXCJvYmplY3RcIikgJiYgdmFsdWUgaW5zdGFuY2VvZiBCbG9iKSAmJlxuICAgICAgICAgICAgICAgIG9iamVjdFR5cGUgIT09IFwiZnVuY3Rpb25cIikge1xuICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihgJHtvYmplY3ROYW1lfSBtdXN0IGJlIGEgc3RyaW5nLCBCbG9iLCBBcnJheUJ1ZmZlciwgQXJyYXlCdWZmZXJWaWV3LCBSZWFkYWJsZVN0cmVhbSwgb3IgKCkgPT4gUmVhZGFibGVTdHJlYW0uYCk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIHZhbHVlO1xufVxuZnVuY3Rpb24gc2VyaWFsaXplRW51bVR5cGUob2JqZWN0TmFtZSwgYWxsb3dlZFZhbHVlcywgdmFsdWUpIHtcbiAgICBpZiAoIWFsbG93ZWRWYWx1ZXMpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBQbGVhc2UgcHJvdmlkZSBhIHNldCBvZiBhbGxvd2VkVmFsdWVzIHRvIHZhbGlkYXRlICR7b2JqZWN0TmFtZX0gYXMgYW4gRW51bSBUeXBlLmApO1xuICAgIH1cbiAgICBjb25zdCBpc1ByZXNlbnQgPSBhbGxvd2VkVmFsdWVzLnNvbWUoKGl0ZW0pID0+IHtcbiAgICAgICAgaWYgKHR5cGVvZiBpdGVtLnZhbHVlT2YoKSA9PT0gXCJzdHJpbmdcIikge1xuICAgICAgICAgICAgcmV0dXJuIGl0ZW0udG9Mb3dlckNhc2UoKSA9PT0gdmFsdWUudG9Mb3dlckNhc2UoKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gaXRlbSA9PT0gdmFsdWU7XG4gICAgfSk7XG4gICAgaWYgKCFpc1ByZXNlbnQpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKGAke3ZhbHVlfSBpcyBub3QgYSB2YWxpZCB2YWx1ZSBmb3IgJHtvYmplY3ROYW1lfS4gVGhlIHZhbGlkIHZhbHVlcyBhcmU6ICR7SlNPTi5zdHJpbmdpZnkoYWxsb3dlZFZhbHVlcyl9LmApO1xuICAgIH1cbiAgICByZXR1cm4gdmFsdWU7XG59XG5mdW5jdGlvbiBzZXJpYWxpemVCeXRlQXJyYXlUeXBlKG9iamVjdE5hbWUsIHZhbHVlKSB7XG4gICAgaWYgKHZhbHVlICE9PSB1bmRlZmluZWQgJiYgdmFsdWUgIT09IG51bGwpIHtcbiAgICAgICAgaWYgKCEodmFsdWUgaW5zdGFuY2VvZiBVaW50OEFycmF5KSkge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGAke29iamVjdE5hbWV9IG11c3QgYmUgb2YgdHlwZSBVaW50OEFycmF5LmApO1xuICAgICAgICB9XG4gICAgICAgIHZhbHVlID0gYmFzZTY0LmVuY29kZUJ5dGVBcnJheSh2YWx1ZSk7XG4gICAgfVxuICAgIHJldHVybiB2YWx1ZTtcbn1cbmZ1bmN0aW9uIHNlcmlhbGl6ZUJhc2U2NFVybFR5cGUob2JqZWN0TmFtZSwgdmFsdWUpIHtcbiAgICBpZiAodmFsdWUgIT09IHVuZGVmaW5lZCAmJiB2YWx1ZSAhPT0gbnVsbCkge1xuICAgICAgICBpZiAoISh2YWx1ZSBpbnN0YW5jZW9mIFVpbnQ4QXJyYXkpKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYCR7b2JqZWN0TmFtZX0gbXVzdCBiZSBvZiB0eXBlIFVpbnQ4QXJyYXkuYCk7XG4gICAgICAgIH1cbiAgICAgICAgdmFsdWUgPSBidWZmZXJUb0Jhc2U2NFVybCh2YWx1ZSk7XG4gICAgfVxuICAgIHJldHVybiB2YWx1ZTtcbn1cbmZ1bmN0aW9uIHNlcmlhbGl6ZURhdGVUeXBlcyh0eXBlTmFtZSwgdmFsdWUsIG9iamVjdE5hbWUpIHtcbiAgICBpZiAodmFsdWUgIT09IHVuZGVmaW5lZCAmJiB2YWx1ZSAhPT0gbnVsbCkge1xuICAgICAgICBpZiAodHlwZU5hbWUubWF0Y2goL15EYXRlJC9pKSAhPT0gbnVsbCkge1xuICAgICAgICAgICAgaWYgKCEodmFsdWUgaW5zdGFuY2VvZiBEYXRlIHx8XG4gICAgICAgICAgICAgICAgKHR5cGVvZiB2YWx1ZS52YWx1ZU9mKCkgPT09IFwic3RyaW5nXCIgJiYgIWlzTmFOKERhdGUucGFyc2UodmFsdWUpKSkpKSB7XG4gICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGAke29iamVjdE5hbWV9IG11c3QgYmUgYW4gaW5zdGFuY2VvZiBEYXRlIG9yIGEgc3RyaW5nIGluIElTTzg2MDEgZm9ybWF0LmApO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgdmFsdWUgPVxuICAgICAgICAgICAgICAgIHZhbHVlIGluc3RhbmNlb2YgRGF0ZVxuICAgICAgICAgICAgICAgICAgICA/IHZhbHVlLnRvSVNPU3RyaW5nKCkuc3Vic3RyaW5nKDAsIDEwKVxuICAgICAgICAgICAgICAgICAgICA6IG5ldyBEYXRlKHZhbHVlKS50b0lTT1N0cmluZygpLnN1YnN0cmluZygwLCAxMCk7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSBpZiAodHlwZU5hbWUubWF0Y2goL15EYXRlVGltZSQvaSkgIT09IG51bGwpIHtcbiAgICAgICAgICAgIGlmICghKHZhbHVlIGluc3RhbmNlb2YgRGF0ZSB8fFxuICAgICAgICAgICAgICAgICh0eXBlb2YgdmFsdWUudmFsdWVPZigpID09PSBcInN0cmluZ1wiICYmICFpc05hTihEYXRlLnBhcnNlKHZhbHVlKSkpKSkge1xuICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihgJHtvYmplY3ROYW1lfSBtdXN0IGJlIGFuIGluc3RhbmNlb2YgRGF0ZSBvciBhIHN0cmluZyBpbiBJU084NjAxIGZvcm1hdC5gKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHZhbHVlID0gdmFsdWUgaW5zdGFuY2VvZiBEYXRlID8gdmFsdWUudG9JU09TdHJpbmcoKSA6IG5ldyBEYXRlKHZhbHVlKS50b0lTT1N0cmluZygpO1xuICAgICAgICB9XG4gICAgICAgIGVsc2UgaWYgKHR5cGVOYW1lLm1hdGNoKC9eRGF0ZVRpbWVSZmMxMTIzJC9pKSAhPT0gbnVsbCkge1xuICAgICAgICAgICAgaWYgKCEodmFsdWUgaW5zdGFuY2VvZiBEYXRlIHx8XG4gICAgICAgICAgICAgICAgKHR5cGVvZiB2YWx1ZS52YWx1ZU9mKCkgPT09IFwic3RyaW5nXCIgJiYgIWlzTmFOKERhdGUucGFyc2UodmFsdWUpKSkpKSB7XG4gICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGAke29iamVjdE5hbWV9IG11c3QgYmUgYW4gaW5zdGFuY2VvZiBEYXRlIG9yIGEgc3RyaW5nIGluIFJGQy0xMTIzIGZvcm1hdC5gKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHZhbHVlID0gdmFsdWUgaW5zdGFuY2VvZiBEYXRlID8gdmFsdWUudG9VVENTdHJpbmcoKSA6IG5ldyBEYXRlKHZhbHVlKS50b1VUQ1N0cmluZygpO1xuICAgICAgICB9XG4gICAgICAgIGVsc2UgaWYgKHR5cGVOYW1lLm1hdGNoKC9eVW5peFRpbWUkL2kpICE9PSBudWxsKSB7XG4gICAgICAgICAgICBpZiAoISh2YWx1ZSBpbnN0YW5jZW9mIERhdGUgfHxcbiAgICAgICAgICAgICAgICAodHlwZW9mIHZhbHVlLnZhbHVlT2YoKSA9PT0gXCJzdHJpbmdcIiAmJiAhaXNOYU4oRGF0ZS5wYXJzZSh2YWx1ZSkpKSkpIHtcbiAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYCR7b2JqZWN0TmFtZX0gbXVzdCBiZSBhbiBpbnN0YW5jZW9mIERhdGUgb3IgYSBzdHJpbmcgaW4gUkZDLTExMjMvSVNPODYwMSBmb3JtYXQgYCArXG4gICAgICAgICAgICAgICAgICAgIGBmb3IgaXQgdG8gYmUgc2VyaWFsaXplZCBpbiBVbml4VGltZS9FcG9jaCBmb3JtYXQuYCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICB2YWx1ZSA9IGRhdGVUb1VuaXhUaW1lKHZhbHVlKTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIGlmICh0eXBlTmFtZS5tYXRjaCgvXlRpbWVTcGFuJC9pKSAhPT0gbnVsbCkge1xuICAgICAgICAgICAgaWYgKCEoMCwgdXRpbHNfanNfMS5pc0R1cmF0aW9uKSh2YWx1ZSkpIHtcbiAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYCR7b2JqZWN0TmFtZX0gbXVzdCBiZSBhIHN0cmluZyBpbiBJU08gODYwMSBmb3JtYXQuIEluc3RlYWQgd2FzIFwiJHt2YWx1ZX1cIi5gKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gdmFsdWU7XG59XG5mdW5jdGlvbiBzZXJpYWxpemVTZXF1ZW5jZVR5cGUoc2VyaWFsaXplciwgbWFwcGVyLCBvYmplY3QsIG9iamVjdE5hbWUsIGlzWG1sLCBvcHRpb25zKSB7XG4gICAgdmFyIF9hO1xuICAgIGlmICghQXJyYXkuaXNBcnJheShvYmplY3QpKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihgJHtvYmplY3ROYW1lfSBtdXN0IGJlIG9mIHR5cGUgQXJyYXkuYCk7XG4gICAgfVxuICAgIGxldCBlbGVtZW50VHlwZSA9IG1hcHBlci50eXBlLmVsZW1lbnQ7XG4gICAgaWYgKCFlbGVtZW50VHlwZSB8fCB0eXBlb2YgZWxlbWVudFR5cGUgIT09IFwib2JqZWN0XCIpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBlbGVtZW50XCIgbWV0YWRhdGEgZm9yIGFuIEFycmF5IG11c3QgYmUgZGVmaW5lZCBpbiB0aGUgYCArXG4gICAgICAgICAgICBgbWFwcGVyIGFuZCBpdCBtdXN0IG9mIHR5cGUgXCJvYmplY3RcIiBpbiAke29iamVjdE5hbWV9LmApO1xuICAgIH1cbiAgICAvLyBRdWlyazogQ29tcG9zaXRlIG1hcHBlcnMgcmVmZXJlbmNlZCBieSBgZWxlbWVudGAgbWlnaHRcbiAgICAvLyBub3QgaGF2ZSAqYWxsKiBwcm9wZXJ0aWVzIGRlY2xhcmVkIChsaWtlIHViZXJQYXJlbnQpLFxuICAgIC8vIHNvIGxldCdzIHRyeSB0byBsb29rIHVwIHRoZSBmdWxsIGRlZmluaXRpb24gYnkgbmFtZS5cbiAgICBpZiAoZWxlbWVudFR5cGUudHlwZS5uYW1lID09PSBcIkNvbXBvc2l0ZVwiICYmIGVsZW1lbnRUeXBlLnR5cGUuY2xhc3NOYW1lKSB7XG4gICAgICAgIGVsZW1lbnRUeXBlID0gKF9hID0gc2VyaWFsaXplci5tb2RlbE1hcHBlcnNbZWxlbWVudFR5cGUudHlwZS5jbGFzc05hbWVdKSAhPT0gbnVsbCAmJiBfYSAhPT0gdm9pZCAwID8gX2EgOiBlbGVtZW50VHlwZTtcbiAgICB9XG4gICAgY29uc3QgdGVtcEFycmF5ID0gW107XG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCBvYmplY3QubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgY29uc3Qgc2VyaWFsaXplZFZhbHVlID0gc2VyaWFsaXplci5zZXJpYWxpemUoZWxlbWVudFR5cGUsIG9iamVjdFtpXSwgb2JqZWN0TmFtZSwgb3B0aW9ucyk7XG4gICAgICAgIGlmIChpc1htbCAmJiBlbGVtZW50VHlwZS54bWxOYW1lc3BhY2UpIHtcbiAgICAgICAgICAgIGNvbnN0IHhtbG5zS2V5ID0gZWxlbWVudFR5cGUueG1sTmFtZXNwYWNlUHJlZml4XG4gICAgICAgICAgICAgICAgPyBgeG1sbnM6JHtlbGVtZW50VHlwZS54bWxOYW1lc3BhY2VQcmVmaXh9YFxuICAgICAgICAgICAgICAgIDogXCJ4bWxuc1wiO1xuICAgICAgICAgICAgaWYgKGVsZW1lbnRUeXBlLnR5cGUubmFtZSA9PT0gXCJDb21wb3NpdGVcIikge1xuICAgICAgICAgICAgICAgIHRlbXBBcnJheVtpXSA9IE9iamVjdC5hc3NpZ24oe30sIHNlcmlhbGl6ZWRWYWx1ZSk7XG4gICAgICAgICAgICAgICAgdGVtcEFycmF5W2ldW2ludGVyZmFjZXNfanNfMS5YTUxfQVRUUktFWV0gPSB7IFt4bWxuc0tleV06IGVsZW1lbnRUeXBlLnhtbE5hbWVzcGFjZSB9O1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgdGVtcEFycmF5W2ldID0ge307XG4gICAgICAgICAgICAgICAgdGVtcEFycmF5W2ldW29wdGlvbnMueG1sLnhtbENoYXJLZXldID0gc2VyaWFsaXplZFZhbHVlO1xuICAgICAgICAgICAgICAgIHRlbXBBcnJheVtpXVtpbnRlcmZhY2VzX2pzXzEuWE1MX0FUVFJLRVldID0geyBbeG1sbnNLZXldOiBlbGVtZW50VHlwZS54bWxOYW1lc3BhY2UgfTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIHRlbXBBcnJheVtpXSA9IHNlcmlhbGl6ZWRWYWx1ZTtcbiAgICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gdGVtcEFycmF5O1xufVxuZnVuY3Rpb24gc2VyaWFsaXplRGljdGlvbmFyeVR5cGUoc2VyaWFsaXplciwgbWFwcGVyLCBvYmplY3QsIG9iamVjdE5hbWUsIGlzWG1sLCBvcHRpb25zKSB7XG4gICAgaWYgKHR5cGVvZiBvYmplY3QgIT09IFwib2JqZWN0XCIpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKGAke29iamVjdE5hbWV9IG11c3QgYmUgb2YgdHlwZSBvYmplY3QuYCk7XG4gICAgfVxuICAgIGNvbnN0IHZhbHVlVHlwZSA9IG1hcHBlci50eXBlLnZhbHVlO1xuICAgIGlmICghdmFsdWVUeXBlIHx8IHR5cGVvZiB2YWx1ZVR5cGUgIT09IFwib2JqZWN0XCIpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBcInZhbHVlXCIgbWV0YWRhdGEgZm9yIGEgRGljdGlvbmFyeSBtdXN0IGJlIGRlZmluZWQgaW4gdGhlIGAgK1xuICAgICAgICAgICAgYG1hcHBlciBhbmQgaXQgbXVzdCBvZiB0eXBlIFwib2JqZWN0XCIgaW4gJHtvYmplY3ROYW1lfS5gKTtcbiAgICB9XG4gICAgY29uc3QgdGVtcERpY3Rpb25hcnkgPSB7fTtcbiAgICBmb3IgKGNvbnN0IGtleSBvZiBPYmplY3Qua2V5cyhvYmplY3QpKSB7XG4gICAgICAgIGNvbnN0IHNlcmlhbGl6ZWRWYWx1ZSA9IHNlcmlhbGl6ZXIuc2VyaWFsaXplKHZhbHVlVHlwZSwgb2JqZWN0W2tleV0sIG9iamVjdE5hbWUsIG9wdGlvbnMpO1xuICAgICAgICAvLyBJZiB0aGUgZWxlbWVudCBuZWVkcyBhbiBYTUwgbmFtZXNwYWNlIHdlIG5lZWQgdG8gYWRkIGl0IHdpdGhpbiB0aGUgJCBwcm9wZXJ0eVxuICAgICAgICB0ZW1wRGljdGlvbmFyeVtrZXldID0gZ2V0WG1sT2JqZWN0VmFsdWUodmFsdWVUeXBlLCBzZXJpYWxpemVkVmFsdWUsIGlzWG1sLCBvcHRpb25zKTtcbiAgICB9XG4gICAgLy8gQWRkIHRoZSBuYW1lc3BhY2UgdG8gdGhlIHJvb3QgZWxlbWVudCBpZiBuZWVkZWRcbiAgICBpZiAoaXNYbWwgJiYgbWFwcGVyLnhtbE5hbWVzcGFjZSkge1xuICAgICAgICBjb25zdCB4bWxuc0tleSA9IG1hcHBlci54bWxOYW1lc3BhY2VQcmVmaXggPyBgeG1sbnM6JHttYXBwZXIueG1sTmFtZXNwYWNlUHJlZml4fWAgOiBcInhtbG5zXCI7XG4gICAgICAgIGNvbnN0IHJlc3VsdCA9IHRlbXBEaWN0aW9uYXJ5O1xuICAgICAgICByZXN1bHRbaW50ZXJmYWNlc19qc18xLlhNTF9BVFRSS0VZXSA9IHsgW3htbG5zS2V5XTogbWFwcGVyLnhtbE5hbWVzcGFjZSB9O1xuICAgICAgICByZXR1cm4gcmVzdWx0O1xuICAgIH1cbiAgICByZXR1cm4gdGVtcERpY3Rpb25hcnk7XG59XG4vKipcbiAqIFJlc29sdmVzIHRoZSBhZGRpdGlvbmFsUHJvcGVydGllcyBwcm9wZXJ0eSBmcm9tIGEgcmVmZXJlbmNlZCBtYXBwZXJcbiAqIEBwYXJhbSBzZXJpYWxpemVyIC0gdGhlIHNlcmlhbGl6ZXIgY29udGFpbmluZyB0aGUgZW50aXJlIHNldCBvZiBtYXBwZXJzXG4gKiBAcGFyYW0gbWFwcGVyIC0gdGhlIGNvbXBvc2l0ZSBtYXBwZXIgdG8gcmVzb2x2ZVxuICogQHBhcmFtIG9iamVjdE5hbWUgLSBuYW1lIG9mIHRoZSBvYmplY3QgYmVpbmcgc2VyaWFsaXplZFxuICovXG5mdW5jdGlvbiByZXNvbHZlQWRkaXRpb25hbFByb3BlcnRpZXMoc2VyaWFsaXplciwgbWFwcGVyLCBvYmplY3ROYW1lKSB7XG4gICAgY29uc3QgYWRkaXRpb25hbFByb3BlcnRpZXMgPSBtYXBwZXIudHlwZS5hZGRpdGlvbmFsUHJvcGVydGllcztcbiAgICBpZiAoIWFkZGl0aW9uYWxQcm9wZXJ0aWVzICYmIG1hcHBlci50eXBlLmNsYXNzTmFtZSkge1xuICAgICAgICBjb25zdCBtb2RlbE1hcHBlciA9IHJlc29sdmVSZWZlcmVuY2VkTWFwcGVyKHNlcmlhbGl6ZXIsIG1hcHBlciwgb2JqZWN0TmFtZSk7XG4gICAgICAgIHJldHVybiBtb2RlbE1hcHBlciA9PT0gbnVsbCB8fCBtb2RlbE1hcHBlciA9PT0gdm9pZCAwID8gdm9pZCAwIDogbW9kZWxNYXBwZXIudHlwZS5hZGRpdGlvbmFsUHJvcGVydGllcztcbiAgICB9XG4gICAgcmV0dXJuIGFkZGl0aW9uYWxQcm9wZXJ0aWVzO1xufVxuLyoqXG4gKiBGaW5kcyB0aGUgbWFwcGVyIHJlZmVyZW5jZWQgYnkgY2xhc3NOYW1lXG4gKiBAcGFyYW0gc2VyaWFsaXplciAtIHRoZSBzZXJpYWxpemVyIGNvbnRhaW5pbmcgdGhlIGVudGlyZSBzZXQgb2YgbWFwcGVyc1xuICogQHBhcmFtIG1hcHBlciAtIHRoZSBjb21wb3NpdGUgbWFwcGVyIHRvIHJlc29sdmVcbiAqIEBwYXJhbSBvYmplY3ROYW1lIC0gbmFtZSBvZiB0aGUgb2JqZWN0IGJlaW5nIHNlcmlhbGl6ZWRcbiAqL1xuZnVuY3Rpb24gcmVzb2x2ZVJlZmVyZW5jZWRNYXBwZXIoc2VyaWFsaXplciwgbWFwcGVyLCBvYmplY3ROYW1lKSB7XG4gICAgY29uc3QgY2xhc3NOYW1lID0gbWFwcGVyLnR5cGUuY2xhc3NOYW1lO1xuICAgIGlmICghY2xhc3NOYW1lKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihgQ2xhc3MgbmFtZSBmb3IgbW9kZWwgXCIke29iamVjdE5hbWV9XCIgaXMgbm90IHByb3ZpZGVkIGluIHRoZSBtYXBwZXIgXCIke0pTT04uc3RyaW5naWZ5KG1hcHBlciwgdW5kZWZpbmVkLCAyKX1cIi5gKTtcbiAgICB9XG4gICAgcmV0dXJuIHNlcmlhbGl6ZXIubW9kZWxNYXBwZXJzW2NsYXNzTmFtZV07XG59XG4vKipcbiAqIFJlc29sdmVzIGEgY29tcG9zaXRlIG1hcHBlcidzIG1vZGVsUHJvcGVydGllcy5cbiAqIEBwYXJhbSBzZXJpYWxpemVyIC0gdGhlIHNlcmlhbGl6ZXIgY29udGFpbmluZyB0aGUgZW50aXJlIHNldCBvZiBtYXBwZXJzXG4gKiBAcGFyYW0gbWFwcGVyIC0gdGhlIGNvbXBvc2l0ZSBtYXBwZXIgdG8gcmVzb2x2ZVxuICovXG5mdW5jdGlvbiByZXNvbHZlTW9kZWxQcm9wZXJ0aWVzKHNlcmlhbGl6ZXIsIG1hcHBlciwgb2JqZWN0TmFtZSkge1xuICAgIGxldCBtb2RlbFByb3BzID0gbWFwcGVyLnR5cGUubW9kZWxQcm9wZXJ0aWVzO1xuICAgIGlmICghbW9kZWxQcm9wcykge1xuICAgICAgICBjb25zdCBtb2RlbE1hcHBlciA9IHJlc29sdmVSZWZlcmVuY2VkTWFwcGVyKHNlcmlhbGl6ZXIsIG1hcHBlciwgb2JqZWN0TmFtZSk7XG4gICAgICAgIGlmICghbW9kZWxNYXBwZXIpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihgbWFwcGVyKCkgY2Fubm90IGJlIG51bGwgb3IgdW5kZWZpbmVkIGZvciBtb2RlbCBcIiR7bWFwcGVyLnR5cGUuY2xhc3NOYW1lfVwiLmApO1xuICAgICAgICB9XG4gICAgICAgIG1vZGVsUHJvcHMgPSBtb2RlbE1hcHBlciA9PT0gbnVsbCB8fCBtb2RlbE1hcHBlciA9PT0gdm9pZCAwID8gdm9pZCAwIDogbW9kZWxNYXBwZXIudHlwZS5tb2RlbFByb3BlcnRpZXM7XG4gICAgICAgIGlmICghbW9kZWxQcm9wcykge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBtb2RlbFByb3BlcnRpZXMgY2Fubm90IGJlIG51bGwgb3IgdW5kZWZpbmVkIGluIHRoZSBgICtcbiAgICAgICAgICAgICAgICBgbWFwcGVyIFwiJHtKU09OLnN0cmluZ2lmeShtb2RlbE1hcHBlcil9XCIgb2YgdHlwZSBcIiR7bWFwcGVyLnR5cGUuY2xhc3NOYW1lfVwiIGZvciBvYmplY3QgXCIke29iamVjdE5hbWV9XCIuYCk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIG1vZGVsUHJvcHM7XG59XG5mdW5jdGlvbiBzZXJpYWxpemVDb21wb3NpdGVUeXBlKHNlcmlhbGl6ZXIsIG1hcHBlciwgb2JqZWN0LCBvYmplY3ROYW1lLCBpc1htbCwgb3B0aW9ucykge1xuICAgIGlmIChnZXRQb2x5bW9ycGhpY0Rpc2NyaW1pbmF0b3JSZWN1cnNpdmVseShzZXJpYWxpemVyLCBtYXBwZXIpKSB7XG4gICAgICAgIG1hcHBlciA9IGdldFBvbHltb3JwaGljTWFwcGVyKHNlcmlhbGl6ZXIsIG1hcHBlciwgb2JqZWN0LCBcImNsaWVudE5hbWVcIik7XG4gICAgfVxuICAgIGlmIChvYmplY3QgIT09IHVuZGVmaW5lZCAmJiBvYmplY3QgIT09IG51bGwpIHtcbiAgICAgICAgY29uc3QgcGF5bG9hZCA9IHt9O1xuICAgICAgICBjb25zdCBtb2RlbFByb3BzID0gcmVzb2x2ZU1vZGVsUHJvcGVydGllcyhzZXJpYWxpemVyLCBtYXBwZXIsIG9iamVjdE5hbWUpO1xuICAgICAgICBmb3IgKGNvbnN0IGtleSBvZiBPYmplY3Qua2V5cyhtb2RlbFByb3BzKSkge1xuICAgICAgICAgICAgY29uc3QgcHJvcGVydHlNYXBwZXIgPSBtb2RlbFByb3BzW2tleV07XG4gICAgICAgICAgICBpZiAocHJvcGVydHlNYXBwZXIucmVhZE9ubHkpIHtcbiAgICAgICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGxldCBwcm9wTmFtZTtcbiAgICAgICAgICAgIGxldCBwYXJlbnRPYmplY3QgPSBwYXlsb2FkO1xuICAgICAgICAgICAgaWYgKHNlcmlhbGl6ZXIuaXNYTUwpIHtcbiAgICAgICAgICAgICAgICBpZiAocHJvcGVydHlNYXBwZXIueG1sSXNXcmFwcGVkKSB7XG4gICAgICAgICAgICAgICAgICAgIHByb3BOYW1lID0gcHJvcGVydHlNYXBwZXIueG1sTmFtZTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIHByb3BOYW1lID0gcHJvcGVydHlNYXBwZXIueG1sRWxlbWVudE5hbWUgfHwgcHJvcGVydHlNYXBwZXIueG1sTmFtZTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICBjb25zdCBwYXRocyA9IHNwbGl0U2VyaWFsaXplTmFtZShwcm9wZXJ0eU1hcHBlci5zZXJpYWxpemVkTmFtZSk7XG4gICAgICAgICAgICAgICAgcHJvcE5hbWUgPSBwYXRocy5wb3AoKTtcbiAgICAgICAgICAgICAgICBmb3IgKGNvbnN0IHBhdGhOYW1lIG9mIHBhdGhzKSB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoaWxkT2JqZWN0ID0gcGFyZW50T2JqZWN0W3BhdGhOYW1lXTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKChjaGlsZE9iamVjdCA9PT0gdW5kZWZpbmVkIHx8IGNoaWxkT2JqZWN0ID09PSBudWxsKSAmJlxuICAgICAgICAgICAgICAgICAgICAgICAgKChvYmplY3Rba2V5XSAhPT0gdW5kZWZpbmVkICYmIG9iamVjdFtrZXldICE9PSBudWxsKSB8fFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByb3BlcnR5TWFwcGVyLmRlZmF1bHRWYWx1ZSAhPT0gdW5kZWZpbmVkKSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgcGFyZW50T2JqZWN0W3BhdGhOYW1lXSA9IHt9O1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIHBhcmVudE9iamVjdCA9IHBhcmVudE9iamVjdFtwYXRoTmFtZV07XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKHBhcmVudE9iamVjdCAhPT0gdW5kZWZpbmVkICYmIHBhcmVudE9iamVjdCAhPT0gbnVsbCkge1xuICAgICAgICAgICAgICAgIGlmIChpc1htbCAmJiBtYXBwZXIueG1sTmFtZXNwYWNlKSB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IHhtbG5zS2V5ID0gbWFwcGVyLnhtbE5hbWVzcGFjZVByZWZpeFxuICAgICAgICAgICAgICAgICAgICAgICAgPyBgeG1sbnM6JHttYXBwZXIueG1sTmFtZXNwYWNlUHJlZml4fWBcbiAgICAgICAgICAgICAgICAgICAgICAgIDogXCJ4bWxuc1wiO1xuICAgICAgICAgICAgICAgICAgICBwYXJlbnRPYmplY3RbaW50ZXJmYWNlc19qc18xLlhNTF9BVFRSS0VZXSA9IE9iamVjdC5hc3NpZ24oT2JqZWN0LmFzc2lnbih7fSwgcGFyZW50T2JqZWN0W2ludGVyZmFjZXNfanNfMS5YTUxfQVRUUktFWV0pLCB7IFt4bWxuc0tleV06IG1hcHBlci54bWxOYW1lc3BhY2UgfSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGNvbnN0IHByb3BlcnR5T2JqZWN0TmFtZSA9IHByb3BlcnR5TWFwcGVyLnNlcmlhbGl6ZWROYW1lICE9PSBcIlwiXG4gICAgICAgICAgICAgICAgICAgID8gb2JqZWN0TmFtZSArIFwiLlwiICsgcHJvcGVydHlNYXBwZXIuc2VyaWFsaXplZE5hbWVcbiAgICAgICAgICAgICAgICAgICAgOiBvYmplY3ROYW1lO1xuICAgICAgICAgICAgICAgIGxldCB0b1NlcmlhbGl6ZSA9IG9iamVjdFtrZXldO1xuICAgICAgICAgICAgICAgIGNvbnN0IHBvbHltb3JwaGljRGlzY3JpbWluYXRvciA9IGdldFBvbHltb3JwaGljRGlzY3JpbWluYXRvclJlY3Vyc2l2ZWx5KHNlcmlhbGl6ZXIsIG1hcHBlcik7XG4gICAgICAgICAgICAgICAgaWYgKHBvbHltb3JwaGljRGlzY3JpbWluYXRvciAmJlxuICAgICAgICAgICAgICAgICAgICBwb2x5bW9ycGhpY0Rpc2NyaW1pbmF0b3IuY2xpZW50TmFtZSA9PT0ga2V5ICYmXG4gICAgICAgICAgICAgICAgICAgICh0b1NlcmlhbGl6ZSA9PT0gdW5kZWZpbmVkIHx8IHRvU2VyaWFsaXplID09PSBudWxsKSkge1xuICAgICAgICAgICAgICAgICAgICB0b1NlcmlhbGl6ZSA9IG1hcHBlci5zZXJpYWxpemVkTmFtZTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgY29uc3Qgc2VyaWFsaXplZFZhbHVlID0gc2VyaWFsaXplci5zZXJpYWxpemUocHJvcGVydHlNYXBwZXIsIHRvU2VyaWFsaXplLCBwcm9wZXJ0eU9iamVjdE5hbWUsIG9wdGlvbnMpO1xuICAgICAgICAgICAgICAgIGlmIChzZXJpYWxpemVkVmFsdWUgIT09IHVuZGVmaW5lZCAmJiBwcm9wTmFtZSAhPT0gdW5kZWZpbmVkICYmIHByb3BOYW1lICE9PSBudWxsKSB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IHZhbHVlID0gZ2V0WG1sT2JqZWN0VmFsdWUocHJvcGVydHlNYXBwZXIsIHNlcmlhbGl6ZWRWYWx1ZSwgaXNYbWwsIG9wdGlvbnMpO1xuICAgICAgICAgICAgICAgICAgICBpZiAoaXNYbWwgJiYgcHJvcGVydHlNYXBwZXIueG1sSXNBdHRyaWJ1dGUpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIFhNTF9BVFRSS0VZLCBpLmUuLCAkIGlzIHRoZSBrZXkgYXR0cmlidXRlcyBhcmUga2VwdCB1bmRlciBpbiB4bWwyanMuXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBUaGlzIGtlZXBzIHRoaW5ncyBzaW1wbGUgd2hpbGUgcHJldmVudGluZyBuYW1lIGNvbGxpc2lvblxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gd2l0aCBuYW1lcyBpbiB1c2VyIGRvY3VtZW50cy5cbiAgICAgICAgICAgICAgICAgICAgICAgIHBhcmVudE9iamVjdFtpbnRlcmZhY2VzX2pzXzEuWE1MX0FUVFJLRVldID0gcGFyZW50T2JqZWN0W2ludGVyZmFjZXNfanNfMS5YTUxfQVRUUktFWV0gfHwge307XG4gICAgICAgICAgICAgICAgICAgICAgICBwYXJlbnRPYmplY3RbaW50ZXJmYWNlc19qc18xLlhNTF9BVFRSS0VZXVtwcm9wTmFtZV0gPSBzZXJpYWxpemVkVmFsdWU7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgZWxzZSBpZiAoaXNYbWwgJiYgcHJvcGVydHlNYXBwZXIueG1sSXNXcmFwcGVkKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBwYXJlbnRPYmplY3RbcHJvcE5hbWVdID0geyBbcHJvcGVydHlNYXBwZXIueG1sRWxlbWVudE5hbWVdOiB2YWx1ZSB9O1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgcGFyZW50T2JqZWN0W3Byb3BOYW1lXSA9IHZhbHVlO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGNvbnN0IGFkZGl0aW9uYWxQcm9wZXJ0aWVzTWFwcGVyID0gcmVzb2x2ZUFkZGl0aW9uYWxQcm9wZXJ0aWVzKHNlcmlhbGl6ZXIsIG1hcHBlciwgb2JqZWN0TmFtZSk7XG4gICAgICAgIGlmIChhZGRpdGlvbmFsUHJvcGVydGllc01hcHBlcikge1xuICAgICAgICAgICAgY29uc3QgcHJvcE5hbWVzID0gT2JqZWN0LmtleXMobW9kZWxQcm9wcyk7XG4gICAgICAgICAgICBmb3IgKGNvbnN0IGNsaWVudFByb3BOYW1lIGluIG9iamVjdCkge1xuICAgICAgICAgICAgICAgIGNvbnN0IGlzQWRkaXRpb25hbFByb3BlcnR5ID0gcHJvcE5hbWVzLmV2ZXJ5KChwbikgPT4gcG4gIT09IGNsaWVudFByb3BOYW1lKTtcbiAgICAgICAgICAgICAgICBpZiAoaXNBZGRpdGlvbmFsUHJvcGVydHkpIHtcbiAgICAgICAgICAgICAgICAgICAgcGF5bG9hZFtjbGllbnRQcm9wTmFtZV0gPSBzZXJpYWxpemVyLnNlcmlhbGl6ZShhZGRpdGlvbmFsUHJvcGVydGllc01hcHBlciwgb2JqZWN0W2NsaWVudFByb3BOYW1lXSwgb2JqZWN0TmFtZSArICdbXCInICsgY2xpZW50UHJvcE5hbWUgKyAnXCJdJywgb3B0aW9ucyk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiBwYXlsb2FkO1xuICAgIH1cbiAgICByZXR1cm4gb2JqZWN0O1xufVxuZnVuY3Rpb24gZ2V0WG1sT2JqZWN0VmFsdWUocHJvcGVydHlNYXBwZXIsIHNlcmlhbGl6ZWRWYWx1ZSwgaXNYbWwsIG9wdGlvbnMpIHtcbiAgICBpZiAoIWlzWG1sIHx8ICFwcm9wZXJ0eU1hcHBlci54bWxOYW1lc3BhY2UpIHtcbiAgICAgICAgcmV0dXJuIHNlcmlhbGl6ZWRWYWx1ZTtcbiAgICB9XG4gICAgY29uc3QgeG1sbnNLZXkgPSBwcm9wZXJ0eU1hcHBlci54bWxOYW1lc3BhY2VQcmVmaXhcbiAgICAgICAgPyBgeG1sbnM6JHtwcm9wZXJ0eU1hcHBlci54bWxOYW1lc3BhY2VQcmVmaXh9YFxuICAgICAgICA6IFwieG1sbnNcIjtcbiAgICBjb25zdCB4bWxOYW1lc3BhY2UgPSB7IFt4bWxuc0tleV06IHByb3BlcnR5TWFwcGVyLnhtbE5hbWVzcGFjZSB9O1xuICAgIGlmIChbXCJDb21wb3NpdGVcIl0uaW5jbHVkZXMocHJvcGVydHlNYXBwZXIudHlwZS5uYW1lKSkge1xuICAgICAgICBpZiAoc2VyaWFsaXplZFZhbHVlW2ludGVyZmFjZXNfanNfMS5YTUxfQVRUUktFWV0pIHtcbiAgICAgICAgICAgIHJldHVybiBzZXJpYWxpemVkVmFsdWU7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICBjb25zdCByZXN1bHQgPSBPYmplY3QuYXNzaWduKHt9LCBzZXJpYWxpemVkVmFsdWUpO1xuICAgICAgICAgICAgcmVzdWx0W2ludGVyZmFjZXNfanNfMS5YTUxfQVRUUktFWV0gPSB4bWxOYW1lc3BhY2U7XG4gICAgICAgICAgICByZXR1cm4gcmVzdWx0O1xuICAgICAgICB9XG4gICAgfVxuICAgIGNvbnN0IHJlc3VsdCA9IHt9O1xuICAgIHJlc3VsdFtvcHRpb25zLnhtbC54bWxDaGFyS2V5XSA9IHNlcmlhbGl6ZWRWYWx1ZTtcbiAgICByZXN1bHRbaW50ZXJmYWNlc19qc18xLlhNTF9BVFRSS0VZXSA9IHhtbE5hbWVzcGFjZTtcbiAgICByZXR1cm4gcmVzdWx0O1xufVxuZnVuY3Rpb24gaXNTcGVjaWFsWG1sUHJvcGVydHkocHJvcGVydHlOYW1lLCBvcHRpb25zKSB7XG4gICAgcmV0dXJuIFtpbnRlcmZhY2VzX2pzXzEuWE1MX0FUVFJLRVksIG9wdGlvbnMueG1sLnhtbENoYXJLZXldLmluY2x1ZGVzKHByb3BlcnR5TmFtZSk7XG59XG5mdW5jdGlvbiBkZXNlcmlhbGl6ZUNvbXBvc2l0ZVR5cGUoc2VyaWFsaXplciwgbWFwcGVyLCByZXNwb25zZUJvZHksIG9iamVjdE5hbWUsIG9wdGlvbnMpIHtcbiAgICB2YXIgX2EsIF9iO1xuICAgIGNvbnN0IHhtbENoYXJLZXkgPSAoX2EgPSBvcHRpb25zLnhtbC54bWxDaGFyS2V5KSAhPT0gbnVsbCAmJiBfYSAhPT0gdm9pZCAwID8gX2EgOiBpbnRlcmZhY2VzX2pzXzEuWE1MX0NIQVJLRVk7XG4gICAgaWYgKGdldFBvbHltb3JwaGljRGlzY3JpbWluYXRvclJlY3Vyc2l2ZWx5KHNlcmlhbGl6ZXIsIG1hcHBlcikpIHtcbiAgICAgICAgbWFwcGVyID0gZ2V0UG9seW1vcnBoaWNNYXBwZXIoc2VyaWFsaXplciwgbWFwcGVyLCByZXNwb25zZUJvZHksIFwic2VyaWFsaXplZE5hbWVcIik7XG4gICAgfVxuICAgIGNvbnN0IG1vZGVsUHJvcHMgPSByZXNvbHZlTW9kZWxQcm9wZXJ0aWVzKHNlcmlhbGl6ZXIsIG1hcHBlciwgb2JqZWN0TmFtZSk7XG4gICAgbGV0IGluc3RhbmNlID0ge307XG4gICAgY29uc3QgaGFuZGxlZFByb3BlcnR5TmFtZXMgPSBbXTtcbiAgICBmb3IgKGNvbnN0IGtleSBvZiBPYmplY3Qua2V5cyhtb2RlbFByb3BzKSkge1xuICAgICAgICBjb25zdCBwcm9wZXJ0eU1hcHBlciA9IG1vZGVsUHJvcHNba2V5XTtcbiAgICAgICAgY29uc3QgcGF0aHMgPSBzcGxpdFNlcmlhbGl6ZU5hbWUobW9kZWxQcm9wc1trZXldLnNlcmlhbGl6ZWROYW1lKTtcbiAgICAgICAgaGFuZGxlZFByb3BlcnR5TmFtZXMucHVzaChwYXRoc1swXSk7XG4gICAgICAgIGNvbnN0IHsgc2VyaWFsaXplZE5hbWUsIHhtbE5hbWUsIHhtbEVsZW1lbnROYW1lIH0gPSBwcm9wZXJ0eU1hcHBlcjtcbiAgICAgICAgbGV0IHByb3BlcnR5T2JqZWN0TmFtZSA9IG9iamVjdE5hbWU7XG4gICAgICAgIGlmIChzZXJpYWxpemVkTmFtZSAhPT0gXCJcIiAmJiBzZXJpYWxpemVkTmFtZSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICBwcm9wZXJ0eU9iamVjdE5hbWUgPSBvYmplY3ROYW1lICsgXCIuXCIgKyBzZXJpYWxpemVkTmFtZTtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBoZWFkZXJDb2xsZWN0aW9uUHJlZml4ID0gcHJvcGVydHlNYXBwZXIuaGVhZGVyQ29sbGVjdGlvblByZWZpeDtcbiAgICAgICAgaWYgKGhlYWRlckNvbGxlY3Rpb25QcmVmaXgpIHtcbiAgICAgICAgICAgIGNvbnN0IGRpY3Rpb25hcnkgPSB7fTtcbiAgICAgICAgICAgIGZvciAoY29uc3QgaGVhZGVyS2V5IG9mIE9iamVjdC5rZXlzKHJlc3BvbnNlQm9keSkpIHtcbiAgICAgICAgICAgICAgICBpZiAoaGVhZGVyS2V5LnN0YXJ0c1dpdGgoaGVhZGVyQ29sbGVjdGlvblByZWZpeCkpIHtcbiAgICAgICAgICAgICAgICAgICAgZGljdGlvbmFyeVtoZWFkZXJLZXkuc3Vic3RyaW5nKGhlYWRlckNvbGxlY3Rpb25QcmVmaXgubGVuZ3RoKV0gPSBzZXJpYWxpemVyLmRlc2VyaWFsaXplKHByb3BlcnR5TWFwcGVyLnR5cGUudmFsdWUsIHJlc3BvbnNlQm9keVtoZWFkZXJLZXldLCBwcm9wZXJ0eU9iamVjdE5hbWUsIG9wdGlvbnMpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBoYW5kbGVkUHJvcGVydHlOYW1lcy5wdXNoKGhlYWRlcktleSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpbnN0YW5jZVtrZXldID0gZGljdGlvbmFyeTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIGlmIChzZXJpYWxpemVyLmlzWE1MKSB7XG4gICAgICAgICAgICBpZiAocHJvcGVydHlNYXBwZXIueG1sSXNBdHRyaWJ1dGUgJiYgcmVzcG9uc2VCb2R5W2ludGVyZmFjZXNfanNfMS5YTUxfQVRUUktFWV0pIHtcbiAgICAgICAgICAgICAgICBpbnN0YW5jZVtrZXldID0gc2VyaWFsaXplci5kZXNlcmlhbGl6ZShwcm9wZXJ0eU1hcHBlciwgcmVzcG9uc2VCb2R5W2ludGVyZmFjZXNfanNfMS5YTUxfQVRUUktFWV1beG1sTmFtZV0sIHByb3BlcnR5T2JqZWN0TmFtZSwgb3B0aW9ucyk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIGlmIChwcm9wZXJ0eU1hcHBlci54bWxJc01zVGV4dCkge1xuICAgICAgICAgICAgICAgIGlmIChyZXNwb25zZUJvZHlbeG1sQ2hhcktleV0gIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgICAgICAgICBpbnN0YW5jZVtrZXldID0gcmVzcG9uc2VCb2R5W3htbENoYXJLZXldO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBlbHNlIGlmICh0eXBlb2YgcmVzcG9uc2VCb2R5ID09PSBcInN0cmluZ1wiKSB7XG4gICAgICAgICAgICAgICAgICAgIC8vIFRoZSBzcGVjaWFsIGNhc2Ugd2hlcmUgeG1sIHBhcnNlciBwYXJzZXMgXCI8TmFtZT5jb250ZW50PC9OYW1lPlwiIGludG8gSlNPTiBvZlxuICAgICAgICAgICAgICAgICAgICAvLyAgIGB7IG5hbWU6IFwiY29udGVudFwifWAgaW5zdGVhZCBvZiBgeyBuYW1lOiB7IFwiX1wiOiBcImNvbnRlbnRcIiB9fWBcbiAgICAgICAgICAgICAgICAgICAgaW5zdGFuY2Vba2V5XSA9IHJlc3BvbnNlQm9keTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICBjb25zdCBwcm9wZXJ0eU5hbWUgPSB4bWxFbGVtZW50TmFtZSB8fCB4bWxOYW1lIHx8IHNlcmlhbGl6ZWROYW1lO1xuICAgICAgICAgICAgICAgIGlmIChwcm9wZXJ0eU1hcHBlci54bWxJc1dyYXBwZWQpIHtcbiAgICAgICAgICAgICAgICAgICAgLyogYSBsaXN0IG9mIDx4bWxFbGVtZW50TmFtZT4gd3JhcHBlZCBieSA8eG1sTmFtZT5cbiAgICAgICAgICAgICAgICAgICAgICBGb3IgdGhlIHhtbCBleGFtcGxlIGJlbG93XG4gICAgICAgICAgICAgICAgICAgICAgICA8Q29ycz5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgPENvcnNSdWxlPi4uLjwvQ29yc1J1bGU+XG4gICAgICAgICAgICAgICAgICAgICAgICAgIDxDb3JzUnVsZT4uLi48L0NvcnNSdWxlPlxuICAgICAgICAgICAgICAgICAgICAgICAgPC9Db3JzPlxuICAgICAgICAgICAgICAgICAgICAgIHRoZSByZXNwb25zZUJvZHkgaGFzXG4gICAgICAgICAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgIENvcnM6IHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBDb3JzUnVsZTogW3suLi59LCB7Li4ufV1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgIHhtbE5hbWUgaXMgXCJDb3JzXCIgYW5kIHhtbEVsZW1lbnROYW1lIGlzXCJDb3JzUnVsZVwiLlxuICAgICAgICAgICAgICAgICAgICAqL1xuICAgICAgICAgICAgICAgICAgICBjb25zdCB3cmFwcGVkID0gcmVzcG9uc2VCb2R5W3htbE5hbWVdO1xuICAgICAgICAgICAgICAgICAgICBjb25zdCBlbGVtZW50TGlzdCA9IChfYiA9IHdyYXBwZWQgPT09IG51bGwgfHwgd3JhcHBlZCA9PT0gdm9pZCAwID8gdm9pZCAwIDogd3JhcHBlZFt4bWxFbGVtZW50TmFtZV0pICE9PSBudWxsICYmIF9iICE9PSB2b2lkIDAgPyBfYiA6IFtdO1xuICAgICAgICAgICAgICAgICAgICBpbnN0YW5jZVtrZXldID0gc2VyaWFsaXplci5kZXNlcmlhbGl6ZShwcm9wZXJ0eU1hcHBlciwgZWxlbWVudExpc3QsIHByb3BlcnR5T2JqZWN0TmFtZSwgb3B0aW9ucyk7XG4gICAgICAgICAgICAgICAgICAgIGhhbmRsZWRQcm9wZXJ0eU5hbWVzLnB1c2goeG1sTmFtZSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICBjb25zdCBwcm9wZXJ0eSA9IHJlc3BvbnNlQm9keVtwcm9wZXJ0eU5hbWVdO1xuICAgICAgICAgICAgICAgICAgICBpbnN0YW5jZVtrZXldID0gc2VyaWFsaXplci5kZXNlcmlhbGl6ZShwcm9wZXJ0eU1hcHBlciwgcHJvcGVydHksIHByb3BlcnR5T2JqZWN0TmFtZSwgb3B0aW9ucyk7XG4gICAgICAgICAgICAgICAgICAgIGhhbmRsZWRQcm9wZXJ0eU5hbWVzLnB1c2gocHJvcGVydHlOYW1lKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAvLyBkZXNlcmlhbGl6ZSB0aGUgcHJvcGVydHkgaWYgaXQgaXMgcHJlc2VudCBpbiB0aGUgcHJvdmlkZWQgcmVzcG9uc2VCb2R5IGluc3RhbmNlXG4gICAgICAgICAgICBsZXQgcHJvcGVydHlJbnN0YW5jZTtcbiAgICAgICAgICAgIGxldCByZXMgPSByZXNwb25zZUJvZHk7XG4gICAgICAgICAgICAvLyB0cmF2ZXJzaW5nIHRoZSBvYmplY3Qgc3RlcCBieSBzdGVwLlxuICAgICAgICAgICAgbGV0IHN0ZXBzID0gMDtcbiAgICAgICAgICAgIGZvciAoY29uc3QgaXRlbSBvZiBwYXRocykge1xuICAgICAgICAgICAgICAgIGlmICghcmVzKVxuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICBzdGVwcysrO1xuICAgICAgICAgICAgICAgIHJlcyA9IHJlc1tpdGVtXTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIC8vIG9ubHkgYWNjZXB0IG51bGwgd2hlbiByZWFjaGluZyB0aGUgbGFzdCBwb3NpdGlvbiBvZiBvYmplY3Qgb3RoZXJ3aXNlIGl0IHdvdWxkIGJlIHVuZGVmaW5lZFxuICAgICAgICAgICAgaWYgKHJlcyA9PT0gbnVsbCAmJiBzdGVwcyA8IHBhdGhzLmxlbmd0aCkge1xuICAgICAgICAgICAgICAgIHJlcyA9IHVuZGVmaW5lZDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHByb3BlcnR5SW5zdGFuY2UgPSByZXM7XG4gICAgICAgICAgICBjb25zdCBwb2x5bW9ycGhpY0Rpc2NyaW1pbmF0b3IgPSBtYXBwZXIudHlwZS5wb2x5bW9ycGhpY0Rpc2NyaW1pbmF0b3I7XG4gICAgICAgICAgICAvLyBjaGVja2luZyB0aGF0IHRoZSBtb2RlbCBwcm9wZXJ0eSBuYW1lIChrZXkpKGV4OiBcImZpc2h0eXBlXCIpIGFuZCB0aGVcbiAgICAgICAgICAgIC8vIGNsaWVudE5hbWUgb2YgdGhlIHBvbHltb3JwaGljRGlzY3JpbWluYXRvciB7bWV0YWRhdGF9IChleDogXCJmaXNodHlwZVwiKVxuICAgICAgICAgICAgLy8gaW5zdGVhZCBvZiB0aGUgc2VyaWFsaXplZE5hbWUgb2YgdGhlIHBvbHltb3JwaGljRGlzY3JpbWluYXRvciAoZXg6IFwiZmlzaC50eXBlXCIpXG4gICAgICAgICAgICAvLyBpcyBhIGJldHRlciBhcHByb2FjaC4gVGhlIGdlbmVyYXRvciBpcyBub3QgY29uc2lzdGVudCB3aXRoIGVzY2FwaW5nICdcXC4nIGluIHRoZVxuICAgICAgICAgICAgLy8gc2VyaWFsaXplZE5hbWUgb2YgdGhlIHByb3BlcnR5IChleDogXCJmaXNoXFwudHlwZVwiKSB0aGF0IGlzIG1hcmtlZCBhcyBwb2x5bW9ycGhpYyBkaXNjcmltaW5hdG9yXG4gICAgICAgICAgICAvLyBhbmQgdGhlIHNlcmlhbGl6ZWROYW1lIG9mIHRoZSBtZXRhZGF0YSBwb2x5bW9ycGhpY0Rpc2NyaW1pbmF0b3IgKGV4OiBcImZpc2gudHlwZVwiKS4gSG93ZXZlcixcbiAgICAgICAgICAgIC8vIHRoZSBjbGllbnROYW1lIHRyYW5zZm9ybWF0aW9uIG9mIHRoZSBwb2x5bW9ycGhpY0Rpc2NyaW1pbmF0b3IgKGV4OiBcImZpc2h0eXBlXCIpIGFuZFxuICAgICAgICAgICAgLy8gdGhlIHRyYW5zZm9ybWF0aW9uIG9mIG1vZGVsIHByb3BlcnR5IG5hbWUgKGV4OiBcImZpc2h0eXBlXCIpIGlzIGRvbmUgY29uc2lzdGVudGx5LlxuICAgICAgICAgICAgLy8gSGVuY2UsIGl0IGlzIGEgc2FmZXIgYmV0IHRvIHJlbHkgb24gdGhlIGNsaWVudE5hbWUgb2YgdGhlIHBvbHltb3JwaGljRGlzY3JpbWluYXRvci5cbiAgICAgICAgICAgIGlmIChwb2x5bW9ycGhpY0Rpc2NyaW1pbmF0b3IgJiZcbiAgICAgICAgICAgICAgICBrZXkgPT09IHBvbHltb3JwaGljRGlzY3JpbWluYXRvci5jbGllbnROYW1lICYmXG4gICAgICAgICAgICAgICAgKHByb3BlcnR5SW5zdGFuY2UgPT09IHVuZGVmaW5lZCB8fCBwcm9wZXJ0eUluc3RhbmNlID09PSBudWxsKSkge1xuICAgICAgICAgICAgICAgIHByb3BlcnR5SW5zdGFuY2UgPSBtYXBwZXIuc2VyaWFsaXplZE5hbWU7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBsZXQgc2VyaWFsaXplZFZhbHVlO1xuICAgICAgICAgICAgLy8gcGFnaW5nXG4gICAgICAgICAgICBpZiAoQXJyYXkuaXNBcnJheShyZXNwb25zZUJvZHlba2V5XSkgJiYgbW9kZWxQcm9wc1trZXldLnNlcmlhbGl6ZWROYW1lID09PSBcIlwiKSB7XG4gICAgICAgICAgICAgICAgcHJvcGVydHlJbnN0YW5jZSA9IHJlc3BvbnNlQm9keVtrZXldO1xuICAgICAgICAgICAgICAgIGNvbnN0IGFycmF5SW5zdGFuY2UgPSBzZXJpYWxpemVyLmRlc2VyaWFsaXplKHByb3BlcnR5TWFwcGVyLCBwcm9wZXJ0eUluc3RhbmNlLCBwcm9wZXJ0eU9iamVjdE5hbWUsIG9wdGlvbnMpO1xuICAgICAgICAgICAgICAgIC8vIENvcHkgb3ZlciBhbnkgcHJvcGVydGllcyB0aGF0IGhhdmUgYWxyZWFkeSBiZWVuIGFkZGVkIGludG8gdGhlIGluc3RhbmNlLCB3aGVyZSB0aGV5IGRvXG4gICAgICAgICAgICAgICAgLy8gbm90IGV4aXN0IG9uIHRoZSBuZXdseSBkZS1zZXJpYWxpemVkIGFycmF5XG4gICAgICAgICAgICAgICAgZm9yIChjb25zdCBbaywgdl0gb2YgT2JqZWN0LmVudHJpZXMoaW5zdGFuY2UpKSB7XG4gICAgICAgICAgICAgICAgICAgIGlmICghT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKGFycmF5SW5zdGFuY2UsIGspKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBhcnJheUluc3RhbmNlW2tdID0gdjtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBpbnN0YW5jZSA9IGFycmF5SW5zdGFuY2U7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIGlmIChwcm9wZXJ0eUluc3RhbmNlICE9PSB1bmRlZmluZWQgfHwgcHJvcGVydHlNYXBwZXIuZGVmYXVsdFZhbHVlICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgICAgICBzZXJpYWxpemVkVmFsdWUgPSBzZXJpYWxpemVyLmRlc2VyaWFsaXplKHByb3BlcnR5TWFwcGVyLCBwcm9wZXJ0eUluc3RhbmNlLCBwcm9wZXJ0eU9iamVjdE5hbWUsIG9wdGlvbnMpO1xuICAgICAgICAgICAgICAgIGluc3RhbmNlW2tleV0gPSBzZXJpYWxpemVkVmFsdWU7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG4gICAgY29uc3QgYWRkaXRpb25hbFByb3BlcnRpZXNNYXBwZXIgPSBtYXBwZXIudHlwZS5hZGRpdGlvbmFsUHJvcGVydGllcztcbiAgICBpZiAoYWRkaXRpb25hbFByb3BlcnRpZXNNYXBwZXIpIHtcbiAgICAgICAgY29uc3QgaXNBZGRpdGlvbmFsUHJvcGVydHkgPSAocmVzcG9uc2VQcm9wTmFtZSkgPT4ge1xuICAgICAgICAgICAgZm9yIChjb25zdCBjbGllbnRQcm9wTmFtZSBpbiBtb2RlbFByb3BzKSB7XG4gICAgICAgICAgICAgICAgY29uc3QgcGF0aHMgPSBzcGxpdFNlcmlhbGl6ZU5hbWUobW9kZWxQcm9wc1tjbGllbnRQcm9wTmFtZV0uc2VyaWFsaXplZE5hbWUpO1xuICAgICAgICAgICAgICAgIGlmIChwYXRoc1swXSA9PT0gcmVzcG9uc2VQcm9wTmFtZSkge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgIH07XG4gICAgICAgIGZvciAoY29uc3QgcmVzcG9uc2VQcm9wTmFtZSBpbiByZXNwb25zZUJvZHkpIHtcbiAgICAgICAgICAgIGlmIChpc0FkZGl0aW9uYWxQcm9wZXJ0eShyZXNwb25zZVByb3BOYW1lKSkge1xuICAgICAgICAgICAgICAgIGluc3RhbmNlW3Jlc3BvbnNlUHJvcE5hbWVdID0gc2VyaWFsaXplci5kZXNlcmlhbGl6ZShhZGRpdGlvbmFsUHJvcGVydGllc01hcHBlciwgcmVzcG9uc2VCb2R5W3Jlc3BvbnNlUHJvcE5hbWVdLCBvYmplY3ROYW1lICsgJ1tcIicgKyByZXNwb25zZVByb3BOYW1lICsgJ1wiXScsIG9wdGlvbnMpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxuICAgIGVsc2UgaWYgKHJlc3BvbnNlQm9keSAmJiAhb3B0aW9ucy5pZ25vcmVVbmtub3duUHJvcGVydGllcykge1xuICAgICAgICBmb3IgKGNvbnN0IGtleSBvZiBPYmplY3Qua2V5cyhyZXNwb25zZUJvZHkpKSB7XG4gICAgICAgICAgICBpZiAoaW5zdGFuY2Vba2V5XSA9PT0gdW5kZWZpbmVkICYmXG4gICAgICAgICAgICAgICAgIWhhbmRsZWRQcm9wZXJ0eU5hbWVzLmluY2x1ZGVzKGtleSkgJiZcbiAgICAgICAgICAgICAgICAhaXNTcGVjaWFsWG1sUHJvcGVydHkoa2V5LCBvcHRpb25zKSkge1xuICAgICAgICAgICAgICAgIGluc3RhbmNlW2tleV0gPSByZXNwb25zZUJvZHlba2V5XTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gaW5zdGFuY2U7XG59XG5mdW5jdGlvbiBkZXNlcmlhbGl6ZURpY3Rpb25hcnlUeXBlKHNlcmlhbGl6ZXIsIG1hcHBlciwgcmVzcG9uc2VCb2R5LCBvYmplY3ROYW1lLCBvcHRpb25zKSB7XG4gICAgLyoganNoaW50IHZhbGlkdGhpczogdHJ1ZSAqL1xuICAgIGNvbnN0IHZhbHVlID0gbWFwcGVyLnR5cGUudmFsdWU7XG4gICAgaWYgKCF2YWx1ZSB8fCB0eXBlb2YgdmFsdWUgIT09IFwib2JqZWN0XCIpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBcInZhbHVlXCIgbWV0YWRhdGEgZm9yIGEgRGljdGlvbmFyeSBtdXN0IGJlIGRlZmluZWQgaW4gdGhlIGAgK1xuICAgICAgICAgICAgYG1hcHBlciBhbmQgaXQgbXVzdCBvZiB0eXBlIFwib2JqZWN0XCIgaW4gJHtvYmplY3ROYW1lfWApO1xuICAgIH1cbiAgICBpZiAocmVzcG9uc2VCb2R5KSB7XG4gICAgICAgIGNvbnN0IHRlbXBEaWN0aW9uYXJ5ID0ge307XG4gICAgICAgIGZvciAoY29uc3Qga2V5IG9mIE9iamVjdC5rZXlzKHJlc3BvbnNlQm9keSkpIHtcbiAgICAgICAgICAgIHRlbXBEaWN0aW9uYXJ5W2tleV0gPSBzZXJpYWxpemVyLmRlc2VyaWFsaXplKHZhbHVlLCByZXNwb25zZUJvZHlba2V5XSwgb2JqZWN0TmFtZSwgb3B0aW9ucyk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHRlbXBEaWN0aW9uYXJ5O1xuICAgIH1cbiAgICByZXR1cm4gcmVzcG9uc2VCb2R5O1xufVxuZnVuY3Rpb24gZGVzZXJpYWxpemVTZXF1ZW5jZVR5cGUoc2VyaWFsaXplciwgbWFwcGVyLCByZXNwb25zZUJvZHksIG9iamVjdE5hbWUsIG9wdGlvbnMpIHtcbiAgICB2YXIgX2E7XG4gICAgbGV0IGVsZW1lbnQgPSBtYXBwZXIudHlwZS5lbGVtZW50O1xuICAgIGlmICghZWxlbWVudCB8fCB0eXBlb2YgZWxlbWVudCAhPT0gXCJvYmplY3RcIikge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYGVsZW1lbnRcIiBtZXRhZGF0YSBmb3IgYW4gQXJyYXkgbXVzdCBiZSBkZWZpbmVkIGluIHRoZSBgICtcbiAgICAgICAgICAgIGBtYXBwZXIgYW5kIGl0IG11c3Qgb2YgdHlwZSBcIm9iamVjdFwiIGluICR7b2JqZWN0TmFtZX1gKTtcbiAgICB9XG4gICAgaWYgKHJlc3BvbnNlQm9keSkge1xuICAgICAgICBpZiAoIUFycmF5LmlzQXJyYXkocmVzcG9uc2VCb2R5KSkge1xuICAgICAgICAgICAgLy8geG1sMmpzIHdpbGwgaW50ZXJwcmV0IGEgc2luZ2xlIGVsZW1lbnQgYXJyYXkgYXMganVzdCB0aGUgZWxlbWVudCwgc28gZm9yY2UgaXQgdG8gYmUgYW4gYXJyYXlcbiAgICAgICAgICAgIHJlc3BvbnNlQm9keSA9IFtyZXNwb25zZUJvZHldO1xuICAgICAgICB9XG4gICAgICAgIC8vIFF1aXJrOiBDb21wb3NpdGUgbWFwcGVycyByZWZlcmVuY2VkIGJ5IGBlbGVtZW50YCBtaWdodFxuICAgICAgICAvLyBub3QgaGF2ZSAqYWxsKiBwcm9wZXJ0aWVzIGRlY2xhcmVkIChsaWtlIHViZXJQYXJlbnQpLFxuICAgICAgICAvLyBzbyBsZXQncyB0cnkgdG8gbG9vayB1cCB0aGUgZnVsbCBkZWZpbml0aW9uIGJ5IG5hbWUuXG4gICAgICAgIGlmIChlbGVtZW50LnR5cGUubmFtZSA9PT0gXCJDb21wb3NpdGVcIiAmJiBlbGVtZW50LnR5cGUuY2xhc3NOYW1lKSB7XG4gICAgICAgICAgICBlbGVtZW50ID0gKF9hID0gc2VyaWFsaXplci5tb2RlbE1hcHBlcnNbZWxlbWVudC50eXBlLmNsYXNzTmFtZV0pICE9PSBudWxsICYmIF9hICE9PSB2b2lkIDAgPyBfYSA6IGVsZW1lbnQ7XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgdGVtcEFycmF5ID0gW107XG4gICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgcmVzcG9uc2VCb2R5Lmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICB0ZW1wQXJyYXlbaV0gPSBzZXJpYWxpemVyLmRlc2VyaWFsaXplKGVsZW1lbnQsIHJlc3BvbnNlQm9keVtpXSwgYCR7b2JqZWN0TmFtZX1bJHtpfV1gLCBvcHRpb25zKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gdGVtcEFycmF5O1xuICAgIH1cbiAgICByZXR1cm4gcmVzcG9uc2VCb2R5O1xufVxuZnVuY3Rpb24gZ2V0SW5kZXhEaXNjcmltaW5hdG9yKGRpc2NyaW1pbmF0b3JzLCBkaXNjcmltaW5hdG9yVmFsdWUsIHR5cGVOYW1lKSB7XG4gICAgY29uc3QgdHlwZU5hbWVzVG9DaGVjayA9IFt0eXBlTmFtZV07XG4gICAgd2hpbGUgKHR5cGVOYW1lc1RvQ2hlY2subGVuZ3RoKSB7XG4gICAgICAgIGNvbnN0IGN1cnJlbnROYW1lID0gdHlwZU5hbWVzVG9DaGVjay5zaGlmdCgpO1xuICAgICAgICBjb25zdCBpbmRleERpc2NyaW1pbmF0b3IgPSBkaXNjcmltaW5hdG9yVmFsdWUgPT09IGN1cnJlbnROYW1lXG4gICAgICAgICAgICA/IGRpc2NyaW1pbmF0b3JWYWx1ZVxuICAgICAgICAgICAgOiBjdXJyZW50TmFtZSArIFwiLlwiICsgZGlzY3JpbWluYXRvclZhbHVlO1xuICAgICAgICBpZiAoT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKGRpc2NyaW1pbmF0b3JzLCBpbmRleERpc2NyaW1pbmF0b3IpKSB7XG4gICAgICAgICAgICByZXR1cm4gZGlzY3JpbWluYXRvcnNbaW5kZXhEaXNjcmltaW5hdG9yXTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIGZvciAoY29uc3QgW25hbWUsIG1hcHBlcl0gb2YgT2JqZWN0LmVudHJpZXMoZGlzY3JpbWluYXRvcnMpKSB7XG4gICAgICAgICAgICAgICAgaWYgKG5hbWUuc3RhcnRzV2l0aChjdXJyZW50TmFtZSArIFwiLlwiKSAmJlxuICAgICAgICAgICAgICAgICAgICBtYXBwZXIudHlwZS51YmVyUGFyZW50ID09PSBjdXJyZW50TmFtZSAmJlxuICAgICAgICAgICAgICAgICAgICBtYXBwZXIudHlwZS5jbGFzc05hbWUpIHtcbiAgICAgICAgICAgICAgICAgICAgdHlwZU5hbWVzVG9DaGVjay5wdXNoKG1hcHBlci50eXBlLmNsYXNzTmFtZSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxuICAgIHJldHVybiB1bmRlZmluZWQ7XG59XG5mdW5jdGlvbiBnZXRQb2x5bW9ycGhpY01hcHBlcihzZXJpYWxpemVyLCBtYXBwZXIsIG9iamVjdCwgcG9seW1vcnBoaWNQcm9wZXJ0eU5hbWUpIHtcbiAgICB2YXIgX2E7XG4gICAgY29uc3QgcG9seW1vcnBoaWNEaXNjcmltaW5hdG9yID0gZ2V0UG9seW1vcnBoaWNEaXNjcmltaW5hdG9yUmVjdXJzaXZlbHkoc2VyaWFsaXplciwgbWFwcGVyKTtcbiAgICBpZiAocG9seW1vcnBoaWNEaXNjcmltaW5hdG9yKSB7XG4gICAgICAgIGxldCBkaXNjcmltaW5hdG9yTmFtZSA9IHBvbHltb3JwaGljRGlzY3JpbWluYXRvcltwb2x5bW9ycGhpY1Byb3BlcnR5TmFtZV07XG4gICAgICAgIGlmIChkaXNjcmltaW5hdG9yTmFtZSkge1xuICAgICAgICAgICAgLy8gVGhlIHNlcmlhbGl6ZWROYW1lIG1pZ2h0IGhhdmUgXFxcXCwgd2hpY2ggd2UganVzdCB3YW50IHRvIGlnbm9yZVxuICAgICAgICAgICAgaWYgKHBvbHltb3JwaGljUHJvcGVydHlOYW1lID09PSBcInNlcmlhbGl6ZWROYW1lXCIpIHtcbiAgICAgICAgICAgICAgICBkaXNjcmltaW5hdG9yTmFtZSA9IGRpc2NyaW1pbmF0b3JOYW1lLnJlcGxhY2UoL1xcXFwvZ2ksIFwiXCIpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgY29uc3QgZGlzY3JpbWluYXRvclZhbHVlID0gb2JqZWN0W2Rpc2NyaW1pbmF0b3JOYW1lXTtcbiAgICAgICAgICAgIGNvbnN0IHR5cGVOYW1lID0gKF9hID0gbWFwcGVyLnR5cGUudWJlclBhcmVudCkgIT09IG51bGwgJiYgX2EgIT09IHZvaWQgMCA/IF9hIDogbWFwcGVyLnR5cGUuY2xhc3NOYW1lO1xuICAgICAgICAgICAgaWYgKHR5cGVvZiBkaXNjcmltaW5hdG9yVmFsdWUgPT09IFwic3RyaW5nXCIgJiYgdHlwZU5hbWUpIHtcbiAgICAgICAgICAgICAgICBjb25zdCBwb2x5bW9ycGhpY01hcHBlciA9IGdldEluZGV4RGlzY3JpbWluYXRvcihzZXJpYWxpemVyLm1vZGVsTWFwcGVycy5kaXNjcmltaW5hdG9ycywgZGlzY3JpbWluYXRvclZhbHVlLCB0eXBlTmFtZSk7XG4gICAgICAgICAgICAgICAgaWYgKHBvbHltb3JwaGljTWFwcGVyKSB7XG4gICAgICAgICAgICAgICAgICAgIG1hcHBlciA9IHBvbHltb3JwaGljTWFwcGVyO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gbWFwcGVyO1xufVxuZnVuY3Rpb24gZ2V0UG9seW1vcnBoaWNEaXNjcmltaW5hdG9yUmVjdXJzaXZlbHkoc2VyaWFsaXplciwgbWFwcGVyKSB7XG4gICAgcmV0dXJuIChtYXBwZXIudHlwZS5wb2x5bW9ycGhpY0Rpc2NyaW1pbmF0b3IgfHxcbiAgICAgICAgZ2V0UG9seW1vcnBoaWNEaXNjcmltaW5hdG9yU2FmZWx5KHNlcmlhbGl6ZXIsIG1hcHBlci50eXBlLnViZXJQYXJlbnQpIHx8XG4gICAgICAgIGdldFBvbHltb3JwaGljRGlzY3JpbWluYXRvclNhZmVseShzZXJpYWxpemVyLCBtYXBwZXIudHlwZS5jbGFzc05hbWUpKTtcbn1cbmZ1bmN0aW9uIGdldFBvbHltb3JwaGljRGlzY3JpbWluYXRvclNhZmVseShzZXJpYWxpemVyLCB0eXBlTmFtZSkge1xuICAgIHJldHVybiAodHlwZU5hbWUgJiZcbiAgICAgICAgc2VyaWFsaXplci5tb2RlbE1hcHBlcnNbdHlwZU5hbWVdICYmXG4gICAgICAgIHNlcmlhbGl6ZXIubW9kZWxNYXBwZXJzW3R5cGVOYW1lXS50eXBlLnBvbHltb3JwaGljRGlzY3JpbWluYXRvcik7XG59XG4vKipcbiAqIEtub3duIHR5cGVzIG9mIE1hcHBlcnNcbiAqL1xuZXhwb3J0cy5NYXBwZXJUeXBlTmFtZXMgPSB7XG4gICAgQmFzZTY0VXJsOiBcIkJhc2U2NFVybFwiLFxuICAgIEJvb2xlYW46IFwiQm9vbGVhblwiLFxuICAgIEJ5dGVBcnJheTogXCJCeXRlQXJyYXlcIixcbiAgICBDb21wb3NpdGU6IFwiQ29tcG9zaXRlXCIsXG4gICAgRGF0ZTogXCJEYXRlXCIsXG4gICAgRGF0ZVRpbWU6IFwiRGF0ZVRpbWVcIixcbiAgICBEYXRlVGltZVJmYzExMjM6IFwiRGF0ZVRpbWVSZmMxMTIzXCIsXG4gICAgRGljdGlvbmFyeTogXCJEaWN0aW9uYXJ5XCIsXG4gICAgRW51bTogXCJFbnVtXCIsXG4gICAgTnVtYmVyOiBcIk51bWJlclwiLFxuICAgIE9iamVjdDogXCJPYmplY3RcIixcbiAgICBTZXF1ZW5jZTogXCJTZXF1ZW5jZVwiLFxuICAgIFN0cmluZzogXCJTdHJpbmdcIixcbiAgICBTdHJlYW06IFwiU3RyZWFtXCIsXG4gICAgVGltZVNwYW46IFwiVGltZVNwYW5cIixcbiAgICBVbml4VGltZTogXCJVbml4VGltZVwiLFxufTtcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPXNlcmlhbGl6ZXIuanMubWFwIiwKICAgICJcInVzZSBzdHJpY3RcIjtcbi8vIENvcHlyaWdodCAoYykgTWljcm9zb2Z0IENvcnBvcmF0aW9uLlxuLy8gTGljZW5zZWQgdW5kZXIgdGhlIE1JVCBsaWNlbnNlLlxuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiX19lc01vZHVsZVwiLCB7IHZhbHVlOiB0cnVlIH0pO1xuZXhwb3J0cy5zdGF0ZSA9IHZvaWQgMDtcbi8qKlxuICogSG9sZHMgdGhlIHNpbmdsZXRvbiBvcGVyYXRpb25SZXF1ZXN0TWFwLCB0byBiZSBzaGFyZWQgYWNyb3NzIENKUyBhbmQgRVNNIGltcG9ydHMuXG4gKi9cbmV4cG9ydHMuc3RhdGUgPSB7XG4gICAgb3BlcmF0aW9uUmVxdWVzdE1hcDogbmV3IFdlYWtNYXAoKSxcbn07XG4vLyMgc291cmNlTWFwcGluZ1VSTD1zdGF0ZS1janMuY2pzLm1hcCIsCiAgICAiXCJ1c2Ugc3RyaWN0XCI7XG4vLyBDb3B5cmlnaHQgKGMpIE1pY3Jvc29mdCBDb3Jwb3JhdGlvbi5cbi8vIExpY2Vuc2VkIHVuZGVyIHRoZSBNSVQgbGljZW5zZS5cbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIl9fZXNNb2R1bGVcIiwgeyB2YWx1ZTogdHJ1ZSB9KTtcbmV4cG9ydHMuZ2V0T3BlcmF0aW9uUmVxdWVzdEluZm8gPSBleHBvcnRzLmdldE9wZXJhdGlvbkFyZ3VtZW50VmFsdWVGcm9tUGFyYW1ldGVyID0gdm9pZCAwO1xuY29uc3Qgc3RhdGVfanNfMSA9IHJlcXVpcmUoXCIuL3N0YXRlLmpzXCIpO1xuLyoqXG4gKiBAaW50ZXJuYWxcbiAqIFJldHJpZXZlcyB0aGUgdmFsdWUgdG8gdXNlIGZvciBhIGdpdmVuIG9wZXJhdGlvbiBhcmd1bWVudFxuICogQHBhcmFtIG9wZXJhdGlvbkFyZ3VtZW50cyAtIFRoZSBhcmd1bWVudHMgcGFzc2VkIGZyb20gdGhlIGdlbmVyYXRlZCBjbGllbnRcbiAqIEBwYXJhbSBwYXJhbWV0ZXIgLSBUaGUgcGFyYW1ldGVyIGRlc2NyaXB0aW9uXG4gKiBAcGFyYW0gZmFsbGJhY2tPYmplY3QgLSBJZiBzb21ldGhpbmcgaXNuJ3QgZm91bmQgaW4gdGhlIGFyZ3VtZW50cyBiYWcsIGxvb2sgaGVyZS5cbiAqICBHZW5lcmFsbHkgdXNlZCB0byBsb29rIGF0IHRoZSBzZXJ2aWNlIGNsaWVudCBwcm9wZXJ0aWVzLlxuICovXG5mdW5jdGlvbiBnZXRPcGVyYXRpb25Bcmd1bWVudFZhbHVlRnJvbVBhcmFtZXRlcihvcGVyYXRpb25Bcmd1bWVudHMsIHBhcmFtZXRlciwgZmFsbGJhY2tPYmplY3QpIHtcbiAgICBsZXQgcGFyYW1ldGVyUGF0aCA9IHBhcmFtZXRlci5wYXJhbWV0ZXJQYXRoO1xuICAgIGNvbnN0IHBhcmFtZXRlck1hcHBlciA9IHBhcmFtZXRlci5tYXBwZXI7XG4gICAgbGV0IHZhbHVlO1xuICAgIGlmICh0eXBlb2YgcGFyYW1ldGVyUGF0aCA9PT0gXCJzdHJpbmdcIikge1xuICAgICAgICBwYXJhbWV0ZXJQYXRoID0gW3BhcmFtZXRlclBhdGhdO1xuICAgIH1cbiAgICBpZiAoQXJyYXkuaXNBcnJheShwYXJhbWV0ZXJQYXRoKSkge1xuICAgICAgICBpZiAocGFyYW1ldGVyUGF0aC5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgICBpZiAocGFyYW1ldGVyTWFwcGVyLmlzQ29uc3RhbnQpIHtcbiAgICAgICAgICAgICAgICB2YWx1ZSA9IHBhcmFtZXRlck1hcHBlci5kZWZhdWx0VmFsdWU7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICBsZXQgcHJvcGVydHlTZWFyY2hSZXN1bHQgPSBnZXRQcm9wZXJ0eUZyb21QYXJhbWV0ZXJQYXRoKG9wZXJhdGlvbkFyZ3VtZW50cywgcGFyYW1ldGVyUGF0aCk7XG4gICAgICAgICAgICAgICAgaWYgKCFwcm9wZXJ0eVNlYXJjaFJlc3VsdC5wcm9wZXJ0eUZvdW5kICYmIGZhbGxiYWNrT2JqZWN0KSB7XG4gICAgICAgICAgICAgICAgICAgIHByb3BlcnR5U2VhcmNoUmVzdWx0ID0gZ2V0UHJvcGVydHlGcm9tUGFyYW1ldGVyUGF0aChmYWxsYmFja09iamVjdCwgcGFyYW1ldGVyUGF0aCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGxldCB1c2VEZWZhdWx0VmFsdWUgPSBmYWxzZTtcbiAgICAgICAgICAgICAgICBpZiAoIXByb3BlcnR5U2VhcmNoUmVzdWx0LnByb3BlcnR5Rm91bmQpIHtcbiAgICAgICAgICAgICAgICAgICAgdXNlRGVmYXVsdFZhbHVlID1cbiAgICAgICAgICAgICAgICAgICAgICAgIHBhcmFtZXRlck1hcHBlci5yZXF1aXJlZCB8fFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIChwYXJhbWV0ZXJQYXRoWzBdID09PSBcIm9wdGlvbnNcIiAmJiBwYXJhbWV0ZXJQYXRoLmxlbmd0aCA9PT0gMik7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHZhbHVlID0gdXNlRGVmYXVsdFZhbHVlID8gcGFyYW1ldGVyTWFwcGVyLmRlZmF1bHRWYWx1ZSA6IHByb3BlcnR5U2VhcmNoUmVzdWx0LnByb3BlcnR5VmFsdWU7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG4gICAgZWxzZSB7XG4gICAgICAgIGlmIChwYXJhbWV0ZXJNYXBwZXIucmVxdWlyZWQpIHtcbiAgICAgICAgICAgIHZhbHVlID0ge307XG4gICAgICAgIH1cbiAgICAgICAgZm9yIChjb25zdCBwcm9wZXJ0eU5hbWUgaW4gcGFyYW1ldGVyUGF0aCkge1xuICAgICAgICAgICAgY29uc3QgcHJvcGVydHlNYXBwZXIgPSBwYXJhbWV0ZXJNYXBwZXIudHlwZS5tb2RlbFByb3BlcnRpZXNbcHJvcGVydHlOYW1lXTtcbiAgICAgICAgICAgIGNvbnN0IHByb3BlcnR5UGF0aCA9IHBhcmFtZXRlclBhdGhbcHJvcGVydHlOYW1lXTtcbiAgICAgICAgICAgIGNvbnN0IHByb3BlcnR5VmFsdWUgPSBnZXRPcGVyYXRpb25Bcmd1bWVudFZhbHVlRnJvbVBhcmFtZXRlcihvcGVyYXRpb25Bcmd1bWVudHMsIHtcbiAgICAgICAgICAgICAgICBwYXJhbWV0ZXJQYXRoOiBwcm9wZXJ0eVBhdGgsXG4gICAgICAgICAgICAgICAgbWFwcGVyOiBwcm9wZXJ0eU1hcHBlcixcbiAgICAgICAgICAgIH0sIGZhbGxiYWNrT2JqZWN0KTtcbiAgICAgICAgICAgIGlmIChwcm9wZXJ0eVZhbHVlICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgICAgICBpZiAoIXZhbHVlKSB7XG4gICAgICAgICAgICAgICAgICAgIHZhbHVlID0ge307XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHZhbHVlW3Byb3BlcnR5TmFtZV0gPSBwcm9wZXJ0eVZhbHVlO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxuICAgIHJldHVybiB2YWx1ZTtcbn1cbmV4cG9ydHMuZ2V0T3BlcmF0aW9uQXJndW1lbnRWYWx1ZUZyb21QYXJhbWV0ZXIgPSBnZXRPcGVyYXRpb25Bcmd1bWVudFZhbHVlRnJvbVBhcmFtZXRlcjtcbmZ1bmN0aW9uIGdldFByb3BlcnR5RnJvbVBhcmFtZXRlclBhdGgocGFyZW50LCBwYXJhbWV0ZXJQYXRoKSB7XG4gICAgY29uc3QgcmVzdWx0ID0geyBwcm9wZXJ0eUZvdW5kOiBmYWxzZSB9O1xuICAgIGxldCBpID0gMDtcbiAgICBmb3IgKDsgaSA8IHBhcmFtZXRlclBhdGgubGVuZ3RoOyArK2kpIHtcbiAgICAgICAgY29uc3QgcGFyYW1ldGVyUGF0aFBhcnQgPSBwYXJhbWV0ZXJQYXRoW2ldO1xuICAgICAgICAvLyBNYWtlIHN1cmUgdG8gY2hlY2sgaW5oZXJpdGVkIHByb3BlcnRpZXMgdG9vLCBzbyBkb24ndCB1c2UgaGFzT3duUHJvcGVydHkoKS5cbiAgICAgICAgaWYgKHBhcmVudCAmJiBwYXJhbWV0ZXJQYXRoUGFydCBpbiBwYXJlbnQpIHtcbiAgICAgICAgICAgIHBhcmVudCA9IHBhcmVudFtwYXJhbWV0ZXJQYXRoUGFydF07XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuICAgIH1cbiAgICBpZiAoaSA9PT0gcGFyYW1ldGVyUGF0aC5sZW5ndGgpIHtcbiAgICAgICAgcmVzdWx0LnByb3BlcnR5VmFsdWUgPSBwYXJlbnQ7XG4gICAgICAgIHJlc3VsdC5wcm9wZXJ0eUZvdW5kID0gdHJ1ZTtcbiAgICB9XG4gICAgcmV0dXJuIHJlc3VsdDtcbn1cbmNvbnN0IG9yaWdpbmFsUmVxdWVzdFN5bWJvbCA9IFN5bWJvbC5mb3IoXCJAYXp1cmUvY29yZS1jbGllbnQgb3JpZ2luYWwgcmVxdWVzdFwiKTtcbmZ1bmN0aW9uIGhhc09yaWdpbmFsUmVxdWVzdChyZXF1ZXN0KSB7XG4gICAgcmV0dXJuIG9yaWdpbmFsUmVxdWVzdFN5bWJvbCBpbiByZXF1ZXN0O1xufVxuZnVuY3Rpb24gZ2V0T3BlcmF0aW9uUmVxdWVzdEluZm8ocmVxdWVzdCkge1xuICAgIGlmIChoYXNPcmlnaW5hbFJlcXVlc3QocmVxdWVzdCkpIHtcbiAgICAgICAgcmV0dXJuIGdldE9wZXJhdGlvblJlcXVlc3RJbmZvKHJlcXVlc3Rbb3JpZ2luYWxSZXF1ZXN0U3ltYm9sXSk7XG4gICAgfVxuICAgIGxldCBpbmZvID0gc3RhdGVfanNfMS5zdGF0ZS5vcGVyYXRpb25SZXF1ZXN0TWFwLmdldChyZXF1ZXN0KTtcbiAgICBpZiAoIWluZm8pIHtcbiAgICAgICAgaW5mbyA9IHt9O1xuICAgICAgICBzdGF0ZV9qc18xLnN0YXRlLm9wZXJhdGlvblJlcXVlc3RNYXAuc2V0KHJlcXVlc3QsIGluZm8pO1xuICAgIH1cbiAgICByZXR1cm4gaW5mbztcbn1cbmV4cG9ydHMuZ2V0T3BlcmF0aW9uUmVxdWVzdEluZm8gPSBnZXRPcGVyYXRpb25SZXF1ZXN0SW5mbztcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPW9wZXJhdGlvbkhlbHBlcnMuanMubWFwIiwKICAgICJcInVzZSBzdHJpY3RcIjtcbi8vIENvcHlyaWdodCAoYykgTWljcm9zb2Z0IENvcnBvcmF0aW9uLlxuLy8gTGljZW5zZWQgdW5kZXIgdGhlIE1JVCBsaWNlbnNlLlxuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiX19lc01vZHVsZVwiLCB7IHZhbHVlOiB0cnVlIH0pO1xuZXhwb3J0cy5kZXNlcmlhbGl6YXRpb25Qb2xpY3kgPSBleHBvcnRzLmRlc2VyaWFsaXphdGlvblBvbGljeU5hbWUgPSB2b2lkIDA7XG5jb25zdCBpbnRlcmZhY2VzX2pzXzEgPSByZXF1aXJlKFwiLi9pbnRlcmZhY2VzLmpzXCIpO1xuY29uc3QgY29yZV9yZXN0X3BpcGVsaW5lXzEgPSByZXF1aXJlKFwiQGF6dXJlL2NvcmUtcmVzdC1waXBlbGluZVwiKTtcbmNvbnN0IHNlcmlhbGl6ZXJfanNfMSA9IHJlcXVpcmUoXCIuL3NlcmlhbGl6ZXIuanNcIik7XG5jb25zdCBvcGVyYXRpb25IZWxwZXJzX2pzXzEgPSByZXF1aXJlKFwiLi9vcGVyYXRpb25IZWxwZXJzLmpzXCIpO1xuY29uc3QgZGVmYXVsdEpzb25Db250ZW50VHlwZXMgPSBbXCJhcHBsaWNhdGlvbi9qc29uXCIsIFwidGV4dC9qc29uXCJdO1xuY29uc3QgZGVmYXVsdFhtbENvbnRlbnRUeXBlcyA9IFtcImFwcGxpY2F0aW9uL3htbFwiLCBcImFwcGxpY2F0aW9uL2F0b20reG1sXCJdO1xuLyoqXG4gKiBUaGUgcHJvZ3JhbW1hdGljIGlkZW50aWZpZXIgb2YgdGhlIGRlc2VyaWFsaXphdGlvblBvbGljeS5cbiAqL1xuZXhwb3J0cy5kZXNlcmlhbGl6YXRpb25Qb2xpY3lOYW1lID0gXCJkZXNlcmlhbGl6YXRpb25Qb2xpY3lcIjtcbi8qKlxuICogVGhpcyBwb2xpY3kgaGFuZGxlcyBwYXJzaW5nIG91dCByZXNwb25zZXMgYWNjb3JkaW5nIHRvIE9wZXJhdGlvblNwZWNzIG9uIHRoZSByZXF1ZXN0LlxuICovXG5mdW5jdGlvbiBkZXNlcmlhbGl6YXRpb25Qb2xpY3kob3B0aW9ucyA9IHt9KSB7XG4gICAgdmFyIF9hLCBfYiwgX2MsIF9kLCBfZSwgX2YsIF9nO1xuICAgIGNvbnN0IGpzb25Db250ZW50VHlwZXMgPSAoX2IgPSAoX2EgPSBvcHRpb25zLmV4cGVjdGVkQ29udGVudFR5cGVzKSA9PT0gbnVsbCB8fCBfYSA9PT0gdm9pZCAwID8gdm9pZCAwIDogX2EuanNvbikgIT09IG51bGwgJiYgX2IgIT09IHZvaWQgMCA/IF9iIDogZGVmYXVsdEpzb25Db250ZW50VHlwZXM7XG4gICAgY29uc3QgeG1sQ29udGVudFR5cGVzID0gKF9kID0gKF9jID0gb3B0aW9ucy5leHBlY3RlZENvbnRlbnRUeXBlcykgPT09IG51bGwgfHwgX2MgPT09IHZvaWQgMCA/IHZvaWQgMCA6IF9jLnhtbCkgIT09IG51bGwgJiYgX2QgIT09IHZvaWQgMCA/IF9kIDogZGVmYXVsdFhtbENvbnRlbnRUeXBlcztcbiAgICBjb25zdCBwYXJzZVhNTCA9IG9wdGlvbnMucGFyc2VYTUw7XG4gICAgY29uc3Qgc2VyaWFsaXplck9wdGlvbnMgPSBvcHRpb25zLnNlcmlhbGl6ZXJPcHRpb25zO1xuICAgIGNvbnN0IHVwZGF0ZWRPcHRpb25zID0ge1xuICAgICAgICB4bWw6IHtcbiAgICAgICAgICAgIHJvb3ROYW1lOiAoX2UgPSBzZXJpYWxpemVyT3B0aW9ucyA9PT0gbnVsbCB8fCBzZXJpYWxpemVyT3B0aW9ucyA9PT0gdm9pZCAwID8gdm9pZCAwIDogc2VyaWFsaXplck9wdGlvbnMueG1sLnJvb3ROYW1lKSAhPT0gbnVsbCAmJiBfZSAhPT0gdm9pZCAwID8gX2UgOiBcIlwiLFxuICAgICAgICAgICAgaW5jbHVkZVJvb3Q6IChfZiA9IHNlcmlhbGl6ZXJPcHRpb25zID09PSBudWxsIHx8IHNlcmlhbGl6ZXJPcHRpb25zID09PSB2b2lkIDAgPyB2b2lkIDAgOiBzZXJpYWxpemVyT3B0aW9ucy54bWwuaW5jbHVkZVJvb3QpICE9PSBudWxsICYmIF9mICE9PSB2b2lkIDAgPyBfZiA6IGZhbHNlLFxuICAgICAgICAgICAgeG1sQ2hhcktleTogKF9nID0gc2VyaWFsaXplck9wdGlvbnMgPT09IG51bGwgfHwgc2VyaWFsaXplck9wdGlvbnMgPT09IHZvaWQgMCA/IHZvaWQgMCA6IHNlcmlhbGl6ZXJPcHRpb25zLnhtbC54bWxDaGFyS2V5KSAhPT0gbnVsbCAmJiBfZyAhPT0gdm9pZCAwID8gX2cgOiBpbnRlcmZhY2VzX2pzXzEuWE1MX0NIQVJLRVksXG4gICAgICAgIH0sXG4gICAgfTtcbiAgICByZXR1cm4ge1xuICAgICAgICBuYW1lOiBleHBvcnRzLmRlc2VyaWFsaXphdGlvblBvbGljeU5hbWUsXG4gICAgICAgIGFzeW5jIHNlbmRSZXF1ZXN0KHJlcXVlc3QsIG5leHQpIHtcbiAgICAgICAgICAgIGNvbnN0IHJlc3BvbnNlID0gYXdhaXQgbmV4dChyZXF1ZXN0KTtcbiAgICAgICAgICAgIHJldHVybiBkZXNlcmlhbGl6ZVJlc3BvbnNlQm9keShqc29uQ29udGVudFR5cGVzLCB4bWxDb250ZW50VHlwZXMsIHJlc3BvbnNlLCB1cGRhdGVkT3B0aW9ucywgcGFyc2VYTUwpO1xuICAgICAgICB9LFxuICAgIH07XG59XG5leHBvcnRzLmRlc2VyaWFsaXphdGlvblBvbGljeSA9IGRlc2VyaWFsaXphdGlvblBvbGljeTtcbmZ1bmN0aW9uIGdldE9wZXJhdGlvblJlc3BvbnNlTWFwKHBhcnNlZFJlc3BvbnNlKSB7XG4gICAgbGV0IHJlc3VsdDtcbiAgICBjb25zdCByZXF1ZXN0ID0gcGFyc2VkUmVzcG9uc2UucmVxdWVzdDtcbiAgICBjb25zdCBvcGVyYXRpb25JbmZvID0gKDAsIG9wZXJhdGlvbkhlbHBlcnNfanNfMS5nZXRPcGVyYXRpb25SZXF1ZXN0SW5mbykocmVxdWVzdCk7XG4gICAgY29uc3Qgb3BlcmF0aW9uU3BlYyA9IG9wZXJhdGlvbkluZm8gPT09IG51bGwgfHwgb3BlcmF0aW9uSW5mbyA9PT0gdm9pZCAwID8gdm9pZCAwIDogb3BlcmF0aW9uSW5mby5vcGVyYXRpb25TcGVjO1xuICAgIGlmIChvcGVyYXRpb25TcGVjKSB7XG4gICAgICAgIGlmICghKG9wZXJhdGlvbkluZm8gPT09IG51bGwgfHwgb3BlcmF0aW9uSW5mbyA9PT0gdm9pZCAwID8gdm9pZCAwIDogb3BlcmF0aW9uSW5mby5vcGVyYXRpb25SZXNwb25zZUdldHRlcikpIHtcbiAgICAgICAgICAgIHJlc3VsdCA9IG9wZXJhdGlvblNwZWMucmVzcG9uc2VzW3BhcnNlZFJlc3BvbnNlLnN0YXR1c107XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICByZXN1bHQgPSBvcGVyYXRpb25JbmZvID09PSBudWxsIHx8IG9wZXJhdGlvbkluZm8gPT09IHZvaWQgMCA/IHZvaWQgMCA6IG9wZXJhdGlvbkluZm8ub3BlcmF0aW9uUmVzcG9uc2VHZXR0ZXIob3BlcmF0aW9uU3BlYywgcGFyc2VkUmVzcG9uc2UpO1xuICAgICAgICB9XG4gICAgfVxuICAgIHJldHVybiByZXN1bHQ7XG59XG5mdW5jdGlvbiBzaG91bGREZXNlcmlhbGl6ZVJlc3BvbnNlKHBhcnNlZFJlc3BvbnNlKSB7XG4gICAgY29uc3QgcmVxdWVzdCA9IHBhcnNlZFJlc3BvbnNlLnJlcXVlc3Q7XG4gICAgY29uc3Qgb3BlcmF0aW9uSW5mbyA9ICgwLCBvcGVyYXRpb25IZWxwZXJzX2pzXzEuZ2V0T3BlcmF0aW9uUmVxdWVzdEluZm8pKHJlcXVlc3QpO1xuICAgIGNvbnN0IHNob3VsZERlc2VyaWFsaXplID0gb3BlcmF0aW9uSW5mbyA9PT0gbnVsbCB8fCBvcGVyYXRpb25JbmZvID09PSB2b2lkIDAgPyB2b2lkIDAgOiBvcGVyYXRpb25JbmZvLnNob3VsZERlc2VyaWFsaXplO1xuICAgIGxldCByZXN1bHQ7XG4gICAgaWYgKHNob3VsZERlc2VyaWFsaXplID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgcmVzdWx0ID0gdHJ1ZTtcbiAgICB9XG4gICAgZWxzZSBpZiAodHlwZW9mIHNob3VsZERlc2VyaWFsaXplID09PSBcImJvb2xlYW5cIikge1xuICAgICAgICByZXN1bHQgPSBzaG91bGREZXNlcmlhbGl6ZTtcbiAgICB9XG4gICAgZWxzZSB7XG4gICAgICAgIHJlc3VsdCA9IHNob3VsZERlc2VyaWFsaXplKHBhcnNlZFJlc3BvbnNlKTtcbiAgICB9XG4gICAgcmV0dXJuIHJlc3VsdDtcbn1cbmFzeW5jIGZ1bmN0aW9uIGRlc2VyaWFsaXplUmVzcG9uc2VCb2R5KGpzb25Db250ZW50VHlwZXMsIHhtbENvbnRlbnRUeXBlcywgcmVzcG9uc2UsIG9wdGlvbnMsIHBhcnNlWE1MKSB7XG4gICAgY29uc3QgcGFyc2VkUmVzcG9uc2UgPSBhd2FpdCBwYXJzZShqc29uQ29udGVudFR5cGVzLCB4bWxDb250ZW50VHlwZXMsIHJlc3BvbnNlLCBvcHRpb25zLCBwYXJzZVhNTCk7XG4gICAgaWYgKCFzaG91bGREZXNlcmlhbGl6ZVJlc3BvbnNlKHBhcnNlZFJlc3BvbnNlKSkge1xuICAgICAgICByZXR1cm4gcGFyc2VkUmVzcG9uc2U7XG4gICAgfVxuICAgIGNvbnN0IG9wZXJhdGlvbkluZm8gPSAoMCwgb3BlcmF0aW9uSGVscGVyc19qc18xLmdldE9wZXJhdGlvblJlcXVlc3RJbmZvKShwYXJzZWRSZXNwb25zZS5yZXF1ZXN0KTtcbiAgICBjb25zdCBvcGVyYXRpb25TcGVjID0gb3BlcmF0aW9uSW5mbyA9PT0gbnVsbCB8fCBvcGVyYXRpb25JbmZvID09PSB2b2lkIDAgPyB2b2lkIDAgOiBvcGVyYXRpb25JbmZvLm9wZXJhdGlvblNwZWM7XG4gICAgaWYgKCFvcGVyYXRpb25TcGVjIHx8ICFvcGVyYXRpb25TcGVjLnJlc3BvbnNlcykge1xuICAgICAgICByZXR1cm4gcGFyc2VkUmVzcG9uc2U7XG4gICAgfVxuICAgIGNvbnN0IHJlc3BvbnNlU3BlYyA9IGdldE9wZXJhdGlvblJlc3BvbnNlTWFwKHBhcnNlZFJlc3BvbnNlKTtcbiAgICBjb25zdCB7IGVycm9yLCBzaG91bGRSZXR1cm5SZXNwb25zZSB9ID0gaGFuZGxlRXJyb3JSZXNwb25zZShwYXJzZWRSZXNwb25zZSwgb3BlcmF0aW9uU3BlYywgcmVzcG9uc2VTcGVjLCBvcHRpb25zKTtcbiAgICBpZiAoZXJyb3IpIHtcbiAgICAgICAgdGhyb3cgZXJyb3I7XG4gICAgfVxuICAgIGVsc2UgaWYgKHNob3VsZFJldHVyblJlc3BvbnNlKSB7XG4gICAgICAgIHJldHVybiBwYXJzZWRSZXNwb25zZTtcbiAgICB9XG4gICAgLy8gQW4gb3BlcmF0aW9uIHJlc3BvbnNlIHNwZWMgZG9lcyBleGlzdCBmb3IgY3VycmVudCBzdGF0dXMgY29kZSwgc29cbiAgICAvLyB1c2UgaXQgdG8gZGVzZXJpYWxpemUgdGhlIHJlc3BvbnNlLlxuICAgIGlmIChyZXNwb25zZVNwZWMpIHtcbiAgICAgICAgaWYgKHJlc3BvbnNlU3BlYy5ib2R5TWFwcGVyKSB7XG4gICAgICAgICAgICBsZXQgdmFsdWVUb0Rlc2VyaWFsaXplID0gcGFyc2VkUmVzcG9uc2UucGFyc2VkQm9keTtcbiAgICAgICAgICAgIGlmIChvcGVyYXRpb25TcGVjLmlzWE1MICYmIHJlc3BvbnNlU3BlYy5ib2R5TWFwcGVyLnR5cGUubmFtZSA9PT0gc2VyaWFsaXplcl9qc18xLk1hcHBlclR5cGVOYW1lcy5TZXF1ZW5jZSkge1xuICAgICAgICAgICAgICAgIHZhbHVlVG9EZXNlcmlhbGl6ZSA9XG4gICAgICAgICAgICAgICAgICAgIHR5cGVvZiB2YWx1ZVRvRGVzZXJpYWxpemUgPT09IFwib2JqZWN0XCJcbiAgICAgICAgICAgICAgICAgICAgICAgID8gdmFsdWVUb0Rlc2VyaWFsaXplW3Jlc3BvbnNlU3BlYy5ib2R5TWFwcGVyLnhtbEVsZW1lbnROYW1lXVxuICAgICAgICAgICAgICAgICAgICAgICAgOiBbXTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgcGFyc2VkUmVzcG9uc2UucGFyc2VkQm9keSA9IG9wZXJhdGlvblNwZWMuc2VyaWFsaXplci5kZXNlcmlhbGl6ZShyZXNwb25zZVNwZWMuYm9keU1hcHBlciwgdmFsdWVUb0Rlc2VyaWFsaXplLCBcIm9wZXJhdGlvblJlcy5wYXJzZWRCb2R5XCIsIG9wdGlvbnMpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgY2F0Y2ggKGRlc2VyaWFsaXplRXJyb3IpIHtcbiAgICAgICAgICAgICAgICBjb25zdCByZXN0RXJyb3IgPSBuZXcgY29yZV9yZXN0X3BpcGVsaW5lXzEuUmVzdEVycm9yKGBFcnJvciAke2Rlc2VyaWFsaXplRXJyb3J9IG9jY3VycmVkIGluIGRlc2VyaWFsaXppbmcgdGhlIHJlc3BvbnNlQm9keSAtICR7cGFyc2VkUmVzcG9uc2UuYm9keUFzVGV4dH1gLCB7XG4gICAgICAgICAgICAgICAgICAgIHN0YXR1c0NvZGU6IHBhcnNlZFJlc3BvbnNlLnN0YXR1cyxcbiAgICAgICAgICAgICAgICAgICAgcmVxdWVzdDogcGFyc2VkUmVzcG9uc2UucmVxdWVzdCxcbiAgICAgICAgICAgICAgICAgICAgcmVzcG9uc2U6IHBhcnNlZFJlc3BvbnNlLFxuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgIHRocm93IHJlc3RFcnJvcjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBlbHNlIGlmIChvcGVyYXRpb25TcGVjLmh0dHBNZXRob2QgPT09IFwiSEVBRFwiKSB7XG4gICAgICAgICAgICAvLyBoZWFkIG1ldGhvZHMgbmV2ZXIgaGF2ZSBhIGJvZHksIGJ1dCB3ZSByZXR1cm4gYSBib29sZWFuIHRvIGluZGljYXRlIHByZXNlbmNlL2Fic2VuY2Ugb2YgdGhlIHJlc291cmNlXG4gICAgICAgICAgICBwYXJzZWRSZXNwb25zZS5wYXJzZWRCb2R5ID0gcmVzcG9uc2Uuc3RhdHVzID49IDIwMCAmJiByZXNwb25zZS5zdGF0dXMgPCAzMDA7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHJlc3BvbnNlU3BlYy5oZWFkZXJzTWFwcGVyKSB7XG4gICAgICAgICAgICBwYXJzZWRSZXNwb25zZS5wYXJzZWRIZWFkZXJzID0gb3BlcmF0aW9uU3BlYy5zZXJpYWxpemVyLmRlc2VyaWFsaXplKHJlc3BvbnNlU3BlYy5oZWFkZXJzTWFwcGVyLCBwYXJzZWRSZXNwb25zZS5oZWFkZXJzLnRvSlNPTigpLCBcIm9wZXJhdGlvblJlcy5wYXJzZWRIZWFkZXJzXCIsIHsgeG1sOiB7fSwgaWdub3JlVW5rbm93blByb3BlcnRpZXM6IHRydWUgfSk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIHBhcnNlZFJlc3BvbnNlO1xufVxuZnVuY3Rpb24gaXNPcGVyYXRpb25TcGVjRW1wdHkob3BlcmF0aW9uU3BlYykge1xuICAgIGNvbnN0IGV4cGVjdGVkU3RhdHVzQ29kZXMgPSBPYmplY3Qua2V5cyhvcGVyYXRpb25TcGVjLnJlc3BvbnNlcyk7XG4gICAgcmV0dXJuIChleHBlY3RlZFN0YXR1c0NvZGVzLmxlbmd0aCA9PT0gMCB8fFxuICAgICAgICAoZXhwZWN0ZWRTdGF0dXNDb2Rlcy5sZW5ndGggPT09IDEgJiYgZXhwZWN0ZWRTdGF0dXNDb2Rlc1swXSA9PT0gXCJkZWZhdWx0XCIpKTtcbn1cbmZ1bmN0aW9uIGhhbmRsZUVycm9yUmVzcG9uc2UocGFyc2VkUmVzcG9uc2UsIG9wZXJhdGlvblNwZWMsIHJlc3BvbnNlU3BlYywgb3B0aW9ucykge1xuICAgIHZhciBfYTtcbiAgICBjb25zdCBpc1N1Y2Nlc3NCeVN0YXR1cyA9IDIwMCA8PSBwYXJzZWRSZXNwb25zZS5zdGF0dXMgJiYgcGFyc2VkUmVzcG9uc2Uuc3RhdHVzIDwgMzAwO1xuICAgIGNvbnN0IGlzRXhwZWN0ZWRTdGF0dXNDb2RlID0gaXNPcGVyYXRpb25TcGVjRW1wdHkob3BlcmF0aW9uU3BlYylcbiAgICAgICAgPyBpc1N1Y2Nlc3NCeVN0YXR1c1xuICAgICAgICA6ICEhcmVzcG9uc2VTcGVjO1xuICAgIGlmIChpc0V4cGVjdGVkU3RhdHVzQ29kZSkge1xuICAgICAgICBpZiAocmVzcG9uc2VTcGVjKSB7XG4gICAgICAgICAgICBpZiAoIXJlc3BvbnNlU3BlYy5pc0Vycm9yKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHsgZXJyb3I6IG51bGwsIHNob3VsZFJldHVyblJlc3BvbnNlOiBmYWxzZSB9O1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgcmV0dXJuIHsgZXJyb3I6IG51bGwsIHNob3VsZFJldHVyblJlc3BvbnNlOiBmYWxzZSB9O1xuICAgICAgICB9XG4gICAgfVxuICAgIGNvbnN0IGVycm9yUmVzcG9uc2VTcGVjID0gcmVzcG9uc2VTcGVjICE9PSBudWxsICYmIHJlc3BvbnNlU3BlYyAhPT0gdm9pZCAwID8gcmVzcG9uc2VTcGVjIDogb3BlcmF0aW9uU3BlYy5yZXNwb25zZXMuZGVmYXVsdDtcbiAgICBjb25zdCBpbml0aWFsRXJyb3JNZXNzYWdlID0gKChfYSA9IHBhcnNlZFJlc3BvbnNlLnJlcXVlc3Quc3RyZWFtUmVzcG9uc2VTdGF0dXNDb2RlcykgPT09IG51bGwgfHwgX2EgPT09IHZvaWQgMCA/IHZvaWQgMCA6IF9hLmhhcyhwYXJzZWRSZXNwb25zZS5zdGF0dXMpKVxuICAgICAgICA/IGBVbmV4cGVjdGVkIHN0YXR1cyBjb2RlOiAke3BhcnNlZFJlc3BvbnNlLnN0YXR1c31gXG4gICAgICAgIDogcGFyc2VkUmVzcG9uc2UuYm9keUFzVGV4dDtcbiAgICBjb25zdCBlcnJvciA9IG5ldyBjb3JlX3Jlc3RfcGlwZWxpbmVfMS5SZXN0RXJyb3IoaW5pdGlhbEVycm9yTWVzc2FnZSwge1xuICAgICAgICBzdGF0dXNDb2RlOiBwYXJzZWRSZXNwb25zZS5zdGF0dXMsXG4gICAgICAgIHJlcXVlc3Q6IHBhcnNlZFJlc3BvbnNlLnJlcXVlc3QsXG4gICAgICAgIHJlc3BvbnNlOiBwYXJzZWRSZXNwb25zZSxcbiAgICB9KTtcbiAgICAvLyBJZiB0aGUgaXRlbSBmYWlsZWQgYnV0IHRoZXJlJ3Mgbm8gZXJyb3Igc3BlYyBvciBkZWZhdWx0IHNwZWMgdG8gZGVzZXJpYWxpemUgdGhlIGVycm9yLFxuICAgIC8vIHdlIHNob3VsZCBmYWlsIHNvIHdlIGp1c3QgdGhyb3cgdGhlIHBhcnNlZCByZXNwb25zZVxuICAgIGlmICghZXJyb3JSZXNwb25zZVNwZWMpIHtcbiAgICAgICAgdGhyb3cgZXJyb3I7XG4gICAgfVxuICAgIGNvbnN0IGRlZmF1bHRCb2R5TWFwcGVyID0gZXJyb3JSZXNwb25zZVNwZWMuYm9keU1hcHBlcjtcbiAgICBjb25zdCBkZWZhdWx0SGVhZGVyc01hcHBlciA9IGVycm9yUmVzcG9uc2VTcGVjLmhlYWRlcnNNYXBwZXI7XG4gICAgdHJ5IHtcbiAgICAgICAgLy8gSWYgZXJyb3IgcmVzcG9uc2UgaGFzIGEgYm9keSwgdHJ5IHRvIGRlc2VyaWFsaXplIGl0IHVzaW5nIGRlZmF1bHQgYm9keSBtYXBwZXIuXG4gICAgICAgIC8vIFRoZW4gdHJ5IHRvIGV4dHJhY3QgZXJyb3IgY29kZSAmIG1lc3NhZ2UgZnJvbSBpdFxuICAgICAgICBpZiAocGFyc2VkUmVzcG9uc2UucGFyc2VkQm9keSkge1xuICAgICAgICAgICAgY29uc3QgcGFyc2VkQm9keSA9IHBhcnNlZFJlc3BvbnNlLnBhcnNlZEJvZHk7XG4gICAgICAgICAgICBsZXQgZGVzZXJpYWxpemVkRXJyb3I7XG4gICAgICAgICAgICBpZiAoZGVmYXVsdEJvZHlNYXBwZXIpIHtcbiAgICAgICAgICAgICAgICBsZXQgdmFsdWVUb0Rlc2VyaWFsaXplID0gcGFyc2VkQm9keTtcbiAgICAgICAgICAgICAgICBpZiAob3BlcmF0aW9uU3BlYy5pc1hNTCAmJiBkZWZhdWx0Qm9keU1hcHBlci50eXBlLm5hbWUgPT09IHNlcmlhbGl6ZXJfanNfMS5NYXBwZXJUeXBlTmFtZXMuU2VxdWVuY2UpIHtcbiAgICAgICAgICAgICAgICAgICAgdmFsdWVUb0Rlc2VyaWFsaXplID0gW107XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IGVsZW1lbnROYW1lID0gZGVmYXVsdEJvZHlNYXBwZXIueG1sRWxlbWVudE5hbWU7XG4gICAgICAgICAgICAgICAgICAgIGlmICh0eXBlb2YgcGFyc2VkQm9keSA9PT0gXCJvYmplY3RcIiAmJiBlbGVtZW50TmFtZSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWVUb0Rlc2VyaWFsaXplID0gcGFyc2VkQm9keVtlbGVtZW50TmFtZV07XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgZGVzZXJpYWxpemVkRXJyb3IgPSBvcGVyYXRpb25TcGVjLnNlcmlhbGl6ZXIuZGVzZXJpYWxpemUoZGVmYXVsdEJvZHlNYXBwZXIsIHZhbHVlVG9EZXNlcmlhbGl6ZSwgXCJlcnJvci5yZXNwb25zZS5wYXJzZWRCb2R5XCIsIG9wdGlvbnMpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgY29uc3QgaW50ZXJuYWxFcnJvciA9IHBhcnNlZEJvZHkuZXJyb3IgfHwgZGVzZXJpYWxpemVkRXJyb3IgfHwgcGFyc2VkQm9keTtcbiAgICAgICAgICAgIGVycm9yLmNvZGUgPSBpbnRlcm5hbEVycm9yLmNvZGU7XG4gICAgICAgICAgICBpZiAoaW50ZXJuYWxFcnJvci5tZXNzYWdlKSB7XG4gICAgICAgICAgICAgICAgZXJyb3IubWVzc2FnZSA9IGludGVybmFsRXJyb3IubWVzc2FnZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmIChkZWZhdWx0Qm9keU1hcHBlcikge1xuICAgICAgICAgICAgICAgIGVycm9yLnJlc3BvbnNlLnBhcnNlZEJvZHkgPSBkZXNlcmlhbGl6ZWRFcnJvcjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICAvLyBJZiBlcnJvciByZXNwb25zZSBoYXMgaGVhZGVycywgdHJ5IHRvIGRlc2VyaWFsaXplIGl0IHVzaW5nIGRlZmF1bHQgaGVhZGVyIG1hcHBlclxuICAgICAgICBpZiAocGFyc2VkUmVzcG9uc2UuaGVhZGVycyAmJiBkZWZhdWx0SGVhZGVyc01hcHBlcikge1xuICAgICAgICAgICAgZXJyb3IucmVzcG9uc2UucGFyc2VkSGVhZGVycyA9XG4gICAgICAgICAgICAgICAgb3BlcmF0aW9uU3BlYy5zZXJpYWxpemVyLmRlc2VyaWFsaXplKGRlZmF1bHRIZWFkZXJzTWFwcGVyLCBwYXJzZWRSZXNwb25zZS5oZWFkZXJzLnRvSlNPTigpLCBcIm9wZXJhdGlvblJlcy5wYXJzZWRIZWFkZXJzXCIpO1xuICAgICAgICB9XG4gICAgfVxuICAgIGNhdGNoIChkZWZhdWx0RXJyb3IpIHtcbiAgICAgICAgZXJyb3IubWVzc2FnZSA9IGBFcnJvciBcIiR7ZGVmYXVsdEVycm9yLm1lc3NhZ2V9XCIgb2NjdXJyZWQgaW4gZGVzZXJpYWxpemluZyB0aGUgcmVzcG9uc2VCb2R5IC0gXCIke3BhcnNlZFJlc3BvbnNlLmJvZHlBc1RleHR9XCIgZm9yIHRoZSBkZWZhdWx0IHJlc3BvbnNlLmA7XG4gICAgfVxuICAgIHJldHVybiB7IGVycm9yLCBzaG91bGRSZXR1cm5SZXNwb25zZTogZmFsc2UgfTtcbn1cbmFzeW5jIGZ1bmN0aW9uIHBhcnNlKGpzb25Db250ZW50VHlwZXMsIHhtbENvbnRlbnRUeXBlcywgb3BlcmF0aW9uUmVzcG9uc2UsIG9wdHMsIHBhcnNlWE1MKSB7XG4gICAgdmFyIF9hO1xuICAgIGlmICghKChfYSA9IG9wZXJhdGlvblJlc3BvbnNlLnJlcXVlc3Quc3RyZWFtUmVzcG9uc2VTdGF0dXNDb2RlcykgPT09IG51bGwgfHwgX2EgPT09IHZvaWQgMCA/IHZvaWQgMCA6IF9hLmhhcyhvcGVyYXRpb25SZXNwb25zZS5zdGF0dXMpKSAmJlxuICAgICAgICBvcGVyYXRpb25SZXNwb25zZS5ib2R5QXNUZXh0KSB7XG4gICAgICAgIGNvbnN0IHRleHQgPSBvcGVyYXRpb25SZXNwb25zZS5ib2R5QXNUZXh0O1xuICAgICAgICBjb25zdCBjb250ZW50VHlwZSA9IG9wZXJhdGlvblJlc3BvbnNlLmhlYWRlcnMuZ2V0KFwiQ29udGVudC1UeXBlXCIpIHx8IFwiXCI7XG4gICAgICAgIGNvbnN0IGNvbnRlbnRDb21wb25lbnRzID0gIWNvbnRlbnRUeXBlXG4gICAgICAgICAgICA/IFtdXG4gICAgICAgICAgICA6IGNvbnRlbnRUeXBlLnNwbGl0KFwiO1wiKS5tYXAoKGNvbXBvbmVudCkgPT4gY29tcG9uZW50LnRvTG93ZXJDYXNlKCkpO1xuICAgICAgICB0cnkge1xuICAgICAgICAgICAgaWYgKGNvbnRlbnRDb21wb25lbnRzLmxlbmd0aCA9PT0gMCB8fFxuICAgICAgICAgICAgICAgIGNvbnRlbnRDb21wb25lbnRzLnNvbWUoKGNvbXBvbmVudCkgPT4ganNvbkNvbnRlbnRUeXBlcy5pbmRleE9mKGNvbXBvbmVudCkgIT09IC0xKSkge1xuICAgICAgICAgICAgICAgIG9wZXJhdGlvblJlc3BvbnNlLnBhcnNlZEJvZHkgPSBKU09OLnBhcnNlKHRleHQpO1xuICAgICAgICAgICAgICAgIHJldHVybiBvcGVyYXRpb25SZXNwb25zZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2UgaWYgKGNvbnRlbnRDb21wb25lbnRzLnNvbWUoKGNvbXBvbmVudCkgPT4geG1sQ29udGVudFR5cGVzLmluZGV4T2YoY29tcG9uZW50KSAhPT0gLTEpKSB7XG4gICAgICAgICAgICAgICAgaWYgKCFwYXJzZVhNTCkge1xuICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJQYXJzaW5nIFhNTCBub3Qgc3VwcG9ydGVkLlwiKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgY29uc3QgYm9keSA9IGF3YWl0IHBhcnNlWE1MKHRleHQsIG9wdHMueG1sKTtcbiAgICAgICAgICAgICAgICBvcGVyYXRpb25SZXNwb25zZS5wYXJzZWRCb2R5ID0gYm9keTtcbiAgICAgICAgICAgICAgICByZXR1cm4gb3BlcmF0aW9uUmVzcG9uc2U7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgY2F0Y2ggKGVycikge1xuICAgICAgICAgICAgY29uc3QgbXNnID0gYEVycm9yIFwiJHtlcnJ9XCIgb2NjdXJyZWQgd2hpbGUgcGFyc2luZyB0aGUgcmVzcG9uc2UgYm9keSAtICR7b3BlcmF0aW9uUmVzcG9uc2UuYm9keUFzVGV4dH0uYDtcbiAgICAgICAgICAgIGNvbnN0IGVyckNvZGUgPSBlcnIuY29kZSB8fCBjb3JlX3Jlc3RfcGlwZWxpbmVfMS5SZXN0RXJyb3IuUEFSU0VfRVJST1I7XG4gICAgICAgICAgICBjb25zdCBlID0gbmV3IGNvcmVfcmVzdF9waXBlbGluZV8xLlJlc3RFcnJvcihtc2csIHtcbiAgICAgICAgICAgICAgICBjb2RlOiBlcnJDb2RlLFxuICAgICAgICAgICAgICAgIHN0YXR1c0NvZGU6IG9wZXJhdGlvblJlc3BvbnNlLnN0YXR1cyxcbiAgICAgICAgICAgICAgICByZXF1ZXN0OiBvcGVyYXRpb25SZXNwb25zZS5yZXF1ZXN0LFxuICAgICAgICAgICAgICAgIHJlc3BvbnNlOiBvcGVyYXRpb25SZXNwb25zZSxcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgdGhyb3cgZTtcbiAgICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gb3BlcmF0aW9uUmVzcG9uc2U7XG59XG4vLyMgc291cmNlTWFwcGluZ1VSTD1kZXNlcmlhbGl6YXRpb25Qb2xpY3kuanMubWFwIiwKICAgICJcInVzZSBzdHJpY3RcIjtcbi8vIENvcHlyaWdodCAoYykgTWljcm9zb2Z0IENvcnBvcmF0aW9uLlxuLy8gTGljZW5zZWQgdW5kZXIgdGhlIE1JVCBsaWNlbnNlLlxuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiX19lc01vZHVsZVwiLCB7IHZhbHVlOiB0cnVlIH0pO1xuZXhwb3J0cy5nZXRQYXRoU3RyaW5nRnJvbVBhcmFtZXRlciA9IGV4cG9ydHMuZ2V0U3RyZWFtaW5nUmVzcG9uc2VTdGF0dXNDb2RlcyA9IHZvaWQgMDtcbmNvbnN0IHNlcmlhbGl6ZXJfanNfMSA9IHJlcXVpcmUoXCIuL3NlcmlhbGl6ZXIuanNcIik7XG4vKipcbiAqIEdldHMgdGhlIGxpc3Qgb2Ygc3RhdHVzIGNvZGVzIGZvciBzdHJlYW1pbmcgcmVzcG9uc2VzLlxuICogQGludGVybmFsXG4gKi9cbmZ1bmN0aW9uIGdldFN0cmVhbWluZ1Jlc3BvbnNlU3RhdHVzQ29kZXMob3BlcmF0aW9uU3BlYykge1xuICAgIGNvbnN0IHJlc3VsdCA9IG5ldyBTZXQoKTtcbiAgICBmb3IgKGNvbnN0IHN0YXR1c0NvZGUgaW4gb3BlcmF0aW9uU3BlYy5yZXNwb25zZXMpIHtcbiAgICAgICAgY29uc3Qgb3BlcmF0aW9uUmVzcG9uc2UgPSBvcGVyYXRpb25TcGVjLnJlc3BvbnNlc1tzdGF0dXNDb2RlXTtcbiAgICAgICAgaWYgKG9wZXJhdGlvblJlc3BvbnNlLmJvZHlNYXBwZXIgJiZcbiAgICAgICAgICAgIG9wZXJhdGlvblJlc3BvbnNlLmJvZHlNYXBwZXIudHlwZS5uYW1lID09PSBzZXJpYWxpemVyX2pzXzEuTWFwcGVyVHlwZU5hbWVzLlN0cmVhbSkge1xuICAgICAgICAgICAgcmVzdWx0LmFkZChOdW1iZXIoc3RhdHVzQ29kZSkpO1xuICAgICAgICB9XG4gICAgfVxuICAgIHJldHVybiByZXN1bHQ7XG59XG5leHBvcnRzLmdldFN0cmVhbWluZ1Jlc3BvbnNlU3RhdHVzQ29kZXMgPSBnZXRTdHJlYW1pbmdSZXNwb25zZVN0YXR1c0NvZGVzO1xuLyoqXG4gKiBHZXQgdGhlIHBhdGggdG8gdGhpcyBwYXJhbWV0ZXIncyB2YWx1ZSBhcyBhIGRvdHRlZCBzdHJpbmcgKGEuYi5jKS5cbiAqIEBwYXJhbSBwYXJhbWV0ZXIgLSBUaGUgcGFyYW1ldGVyIHRvIGdldCB0aGUgcGF0aCBzdHJpbmcgZm9yLlxuICogQHJldHVybnMgVGhlIHBhdGggdG8gdGhpcyBwYXJhbWV0ZXIncyB2YWx1ZSBhcyBhIGRvdHRlZCBzdHJpbmcuXG4gKiBAaW50ZXJuYWxcbiAqL1xuZnVuY3Rpb24gZ2V0UGF0aFN0cmluZ0Zyb21QYXJhbWV0ZXIocGFyYW1ldGVyKSB7XG4gICAgY29uc3QgeyBwYXJhbWV0ZXJQYXRoLCBtYXBwZXIgfSA9IHBhcmFtZXRlcjtcbiAgICBsZXQgcmVzdWx0O1xuICAgIGlmICh0eXBlb2YgcGFyYW1ldGVyUGF0aCA9PT0gXCJzdHJpbmdcIikge1xuICAgICAgICByZXN1bHQgPSBwYXJhbWV0ZXJQYXRoO1xuICAgIH1cbiAgICBlbHNlIGlmIChBcnJheS5pc0FycmF5KHBhcmFtZXRlclBhdGgpKSB7XG4gICAgICAgIHJlc3VsdCA9IHBhcmFtZXRlclBhdGguam9pbihcIi5cIik7XG4gICAgfVxuICAgIGVsc2Uge1xuICAgICAgICByZXN1bHQgPSBtYXBwZXIuc2VyaWFsaXplZE5hbWU7XG4gICAgfVxuICAgIHJldHVybiByZXN1bHQ7XG59XG5leHBvcnRzLmdldFBhdGhTdHJpbmdGcm9tUGFyYW1ldGVyID0gZ2V0UGF0aFN0cmluZ0Zyb21QYXJhbWV0ZXI7XG4vLyMgc291cmNlTWFwcGluZ1VSTD1pbnRlcmZhY2VIZWxwZXJzLmpzLm1hcCIsCiAgICAiXCJ1c2Ugc3RyaWN0XCI7XG4vLyBDb3B5cmlnaHQgKGMpIE1pY3Jvc29mdCBDb3Jwb3JhdGlvbi5cbi8vIExpY2Vuc2VkIHVuZGVyIHRoZSBNSVQgbGljZW5zZS5cbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIl9fZXNNb2R1bGVcIiwgeyB2YWx1ZTogdHJ1ZSB9KTtcbmV4cG9ydHMuc2VyaWFsaXplUmVxdWVzdEJvZHkgPSBleHBvcnRzLnNlcmlhbGl6ZUhlYWRlcnMgPSBleHBvcnRzLnNlcmlhbGl6YXRpb25Qb2xpY3kgPSBleHBvcnRzLnNlcmlhbGl6YXRpb25Qb2xpY3lOYW1lID0gdm9pZCAwO1xuY29uc3QgaW50ZXJmYWNlc19qc18xID0gcmVxdWlyZShcIi4vaW50ZXJmYWNlcy5qc1wiKTtcbmNvbnN0IG9wZXJhdGlvbkhlbHBlcnNfanNfMSA9IHJlcXVpcmUoXCIuL29wZXJhdGlvbkhlbHBlcnMuanNcIik7XG5jb25zdCBzZXJpYWxpemVyX2pzXzEgPSByZXF1aXJlKFwiLi9zZXJpYWxpemVyLmpzXCIpO1xuY29uc3QgaW50ZXJmYWNlSGVscGVyc19qc18xID0gcmVxdWlyZShcIi4vaW50ZXJmYWNlSGVscGVycy5qc1wiKTtcbi8qKlxuICogVGhlIHByb2dyYW1tYXRpYyBpZGVudGlmaWVyIG9mIHRoZSBzZXJpYWxpemF0aW9uUG9saWN5LlxuICovXG5leHBvcnRzLnNlcmlhbGl6YXRpb25Qb2xpY3lOYW1lID0gXCJzZXJpYWxpemF0aW9uUG9saWN5XCI7XG4vKipcbiAqIFRoaXMgcG9saWN5IGhhbmRsZXMgYXNzZW1ibGluZyB0aGUgcmVxdWVzdCBib2R5IGFuZCBoZWFkZXJzIHVzaW5nXG4gKiBhbiBPcGVyYXRpb25TcGVjIGFuZCBPcGVyYXRpb25Bcmd1bWVudHMgb24gdGhlIHJlcXVlc3QuXG4gKi9cbmZ1bmN0aW9uIHNlcmlhbGl6YXRpb25Qb2xpY3kob3B0aW9ucyA9IHt9KSB7XG4gICAgY29uc3Qgc3RyaW5naWZ5WE1MID0gb3B0aW9ucy5zdHJpbmdpZnlYTUw7XG4gICAgcmV0dXJuIHtcbiAgICAgICAgbmFtZTogZXhwb3J0cy5zZXJpYWxpemF0aW9uUG9saWN5TmFtZSxcbiAgICAgICAgYXN5bmMgc2VuZFJlcXVlc3QocmVxdWVzdCwgbmV4dCkge1xuICAgICAgICAgICAgY29uc3Qgb3BlcmF0aW9uSW5mbyA9ICgwLCBvcGVyYXRpb25IZWxwZXJzX2pzXzEuZ2V0T3BlcmF0aW9uUmVxdWVzdEluZm8pKHJlcXVlc3QpO1xuICAgICAgICAgICAgY29uc3Qgb3BlcmF0aW9uU3BlYyA9IG9wZXJhdGlvbkluZm8gPT09IG51bGwgfHwgb3BlcmF0aW9uSW5mbyA9PT0gdm9pZCAwID8gdm9pZCAwIDogb3BlcmF0aW9uSW5mby5vcGVyYXRpb25TcGVjO1xuICAgICAgICAgICAgY29uc3Qgb3BlcmF0aW9uQXJndW1lbnRzID0gb3BlcmF0aW9uSW5mbyA9PT0gbnVsbCB8fCBvcGVyYXRpb25JbmZvID09PSB2b2lkIDAgPyB2b2lkIDAgOiBvcGVyYXRpb25JbmZvLm9wZXJhdGlvbkFyZ3VtZW50cztcbiAgICAgICAgICAgIGlmIChvcGVyYXRpb25TcGVjICYmIG9wZXJhdGlvbkFyZ3VtZW50cykge1xuICAgICAgICAgICAgICAgIHNlcmlhbGl6ZUhlYWRlcnMocmVxdWVzdCwgb3BlcmF0aW9uQXJndW1lbnRzLCBvcGVyYXRpb25TcGVjKTtcbiAgICAgICAgICAgICAgICBzZXJpYWxpemVSZXF1ZXN0Qm9keShyZXF1ZXN0LCBvcGVyYXRpb25Bcmd1bWVudHMsIG9wZXJhdGlvblNwZWMsIHN0cmluZ2lmeVhNTCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4gbmV4dChyZXF1ZXN0KTtcbiAgICAgICAgfSxcbiAgICB9O1xufVxuZXhwb3J0cy5zZXJpYWxpemF0aW9uUG9saWN5ID0gc2VyaWFsaXphdGlvblBvbGljeTtcbi8qKlxuICogQGludGVybmFsXG4gKi9cbmZ1bmN0aW9uIHNlcmlhbGl6ZUhlYWRlcnMocmVxdWVzdCwgb3BlcmF0aW9uQXJndW1lbnRzLCBvcGVyYXRpb25TcGVjKSB7XG4gICAgdmFyIF9hLCBfYjtcbiAgICBpZiAob3BlcmF0aW9uU3BlYy5oZWFkZXJQYXJhbWV0ZXJzKSB7XG4gICAgICAgIGZvciAoY29uc3QgaGVhZGVyUGFyYW1ldGVyIG9mIG9wZXJhdGlvblNwZWMuaGVhZGVyUGFyYW1ldGVycykge1xuICAgICAgICAgICAgbGV0IGhlYWRlclZhbHVlID0gKDAsIG9wZXJhdGlvbkhlbHBlcnNfanNfMS5nZXRPcGVyYXRpb25Bcmd1bWVudFZhbHVlRnJvbVBhcmFtZXRlcikob3BlcmF0aW9uQXJndW1lbnRzLCBoZWFkZXJQYXJhbWV0ZXIpO1xuICAgICAgICAgICAgaWYgKChoZWFkZXJWYWx1ZSAhPT0gbnVsbCAmJiBoZWFkZXJWYWx1ZSAhPT0gdW5kZWZpbmVkKSB8fCBoZWFkZXJQYXJhbWV0ZXIubWFwcGVyLnJlcXVpcmVkKSB7XG4gICAgICAgICAgICAgICAgaGVhZGVyVmFsdWUgPSBvcGVyYXRpb25TcGVjLnNlcmlhbGl6ZXIuc2VyaWFsaXplKGhlYWRlclBhcmFtZXRlci5tYXBwZXIsIGhlYWRlclZhbHVlLCAoMCwgaW50ZXJmYWNlSGVscGVyc19qc18xLmdldFBhdGhTdHJpbmdGcm9tUGFyYW1ldGVyKShoZWFkZXJQYXJhbWV0ZXIpKTtcbiAgICAgICAgICAgICAgICBjb25zdCBoZWFkZXJDb2xsZWN0aW9uUHJlZml4ID0gaGVhZGVyUGFyYW1ldGVyLm1hcHBlclxuICAgICAgICAgICAgICAgICAgICAuaGVhZGVyQ29sbGVjdGlvblByZWZpeDtcbiAgICAgICAgICAgICAgICBpZiAoaGVhZGVyQ29sbGVjdGlvblByZWZpeCkge1xuICAgICAgICAgICAgICAgICAgICBmb3IgKGNvbnN0IGtleSBvZiBPYmplY3Qua2V5cyhoZWFkZXJWYWx1ZSkpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJlcXVlc3QuaGVhZGVycy5zZXQoaGVhZGVyQ29sbGVjdGlvblByZWZpeCArIGtleSwgaGVhZGVyVmFsdWVba2V5XSk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIHJlcXVlc3QuaGVhZGVycy5zZXQoaGVhZGVyUGFyYW1ldGVyLm1hcHBlci5zZXJpYWxpemVkTmFtZSB8fCAoMCwgaW50ZXJmYWNlSGVscGVyc19qc18xLmdldFBhdGhTdHJpbmdGcm9tUGFyYW1ldGVyKShoZWFkZXJQYXJhbWV0ZXIpLCBoZWFkZXJWYWx1ZSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxuICAgIGNvbnN0IGN1c3RvbUhlYWRlcnMgPSAoX2IgPSAoX2EgPSBvcGVyYXRpb25Bcmd1bWVudHMub3B0aW9ucykgPT09IG51bGwgfHwgX2EgPT09IHZvaWQgMCA/IHZvaWQgMCA6IF9hLnJlcXVlc3RPcHRpb25zKSA9PT0gbnVsbCB8fCBfYiA9PT0gdm9pZCAwID8gdm9pZCAwIDogX2IuY3VzdG9tSGVhZGVycztcbiAgICBpZiAoY3VzdG9tSGVhZGVycykge1xuICAgICAgICBmb3IgKGNvbnN0IGN1c3RvbUhlYWRlck5hbWUgb2YgT2JqZWN0LmtleXMoY3VzdG9tSGVhZGVycykpIHtcbiAgICAgICAgICAgIHJlcXVlc3QuaGVhZGVycy5zZXQoY3VzdG9tSGVhZGVyTmFtZSwgY3VzdG9tSGVhZGVyc1tjdXN0b21IZWFkZXJOYW1lXSk7XG4gICAgICAgIH1cbiAgICB9XG59XG5leHBvcnRzLnNlcmlhbGl6ZUhlYWRlcnMgPSBzZXJpYWxpemVIZWFkZXJzO1xuLyoqXG4gKiBAaW50ZXJuYWxcbiAqL1xuZnVuY3Rpb24gc2VyaWFsaXplUmVxdWVzdEJvZHkocmVxdWVzdCwgb3BlcmF0aW9uQXJndW1lbnRzLCBvcGVyYXRpb25TcGVjLCBzdHJpbmdpZnlYTUwgPSBmdW5jdGlvbiAoKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKFwiWE1MIHNlcmlhbGl6YXRpb24gdW5zdXBwb3J0ZWQhXCIpO1xufSkge1xuICAgIHZhciBfYSwgX2IsIF9jLCBfZCwgX2U7XG4gICAgY29uc3Qgc2VyaWFsaXplck9wdGlvbnMgPSAoX2EgPSBvcGVyYXRpb25Bcmd1bWVudHMub3B0aW9ucykgPT09IG51bGwgfHwgX2EgPT09IHZvaWQgMCA/IHZvaWQgMCA6IF9hLnNlcmlhbGl6ZXJPcHRpb25zO1xuICAgIGNvbnN0IHVwZGF0ZWRPcHRpb25zID0ge1xuICAgICAgICB4bWw6IHtcbiAgICAgICAgICAgIHJvb3ROYW1lOiAoX2IgPSBzZXJpYWxpemVyT3B0aW9ucyA9PT0gbnVsbCB8fCBzZXJpYWxpemVyT3B0aW9ucyA9PT0gdm9pZCAwID8gdm9pZCAwIDogc2VyaWFsaXplck9wdGlvbnMueG1sLnJvb3ROYW1lKSAhPT0gbnVsbCAmJiBfYiAhPT0gdm9pZCAwID8gX2IgOiBcIlwiLFxuICAgICAgICAgICAgaW5jbHVkZVJvb3Q6IChfYyA9IHNlcmlhbGl6ZXJPcHRpb25zID09PSBudWxsIHx8IHNlcmlhbGl6ZXJPcHRpb25zID09PSB2b2lkIDAgPyB2b2lkIDAgOiBzZXJpYWxpemVyT3B0aW9ucy54bWwuaW5jbHVkZVJvb3QpICE9PSBudWxsICYmIF9jICE9PSB2b2lkIDAgPyBfYyA6IGZhbHNlLFxuICAgICAgICAgICAgeG1sQ2hhcktleTogKF9kID0gc2VyaWFsaXplck9wdGlvbnMgPT09IG51bGwgfHwgc2VyaWFsaXplck9wdGlvbnMgPT09IHZvaWQgMCA/IHZvaWQgMCA6IHNlcmlhbGl6ZXJPcHRpb25zLnhtbC54bWxDaGFyS2V5KSAhPT0gbnVsbCAmJiBfZCAhPT0gdm9pZCAwID8gX2QgOiBpbnRlcmZhY2VzX2pzXzEuWE1MX0NIQVJLRVksXG4gICAgICAgIH0sXG4gICAgfTtcbiAgICBjb25zdCB4bWxDaGFyS2V5ID0gdXBkYXRlZE9wdGlvbnMueG1sLnhtbENoYXJLZXk7XG4gICAgaWYgKG9wZXJhdGlvblNwZWMucmVxdWVzdEJvZHkgJiYgb3BlcmF0aW9uU3BlYy5yZXF1ZXN0Qm9keS5tYXBwZXIpIHtcbiAgICAgICAgcmVxdWVzdC5ib2R5ID0gKDAsIG9wZXJhdGlvbkhlbHBlcnNfanNfMS5nZXRPcGVyYXRpb25Bcmd1bWVudFZhbHVlRnJvbVBhcmFtZXRlcikob3BlcmF0aW9uQXJndW1lbnRzLCBvcGVyYXRpb25TcGVjLnJlcXVlc3RCb2R5KTtcbiAgICAgICAgY29uc3QgYm9keU1hcHBlciA9IG9wZXJhdGlvblNwZWMucmVxdWVzdEJvZHkubWFwcGVyO1xuICAgICAgICBjb25zdCB7IHJlcXVpcmVkLCBzZXJpYWxpemVkTmFtZSwgeG1sTmFtZSwgeG1sRWxlbWVudE5hbWUsIHhtbE5hbWVzcGFjZSwgeG1sTmFtZXNwYWNlUHJlZml4LCBudWxsYWJsZSwgfSA9IGJvZHlNYXBwZXI7XG4gICAgICAgIGNvbnN0IHR5cGVOYW1lID0gYm9keU1hcHBlci50eXBlLm5hbWU7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgICBpZiAoKHJlcXVlc3QuYm9keSAhPT0gdW5kZWZpbmVkICYmIHJlcXVlc3QuYm9keSAhPT0gbnVsbCkgfHxcbiAgICAgICAgICAgICAgICAobnVsbGFibGUgJiYgcmVxdWVzdC5ib2R5ID09PSBudWxsKSB8fFxuICAgICAgICAgICAgICAgIHJlcXVpcmVkKSB7XG4gICAgICAgICAgICAgICAgY29uc3QgcmVxdWVzdEJvZHlQYXJhbWV0ZXJQYXRoU3RyaW5nID0gKDAsIGludGVyZmFjZUhlbHBlcnNfanNfMS5nZXRQYXRoU3RyaW5nRnJvbVBhcmFtZXRlcikob3BlcmF0aW9uU3BlYy5yZXF1ZXN0Qm9keSk7XG4gICAgICAgICAgICAgICAgcmVxdWVzdC5ib2R5ID0gb3BlcmF0aW9uU3BlYy5zZXJpYWxpemVyLnNlcmlhbGl6ZShib2R5TWFwcGVyLCByZXF1ZXN0LmJvZHksIHJlcXVlc3RCb2R5UGFyYW1ldGVyUGF0aFN0cmluZywgdXBkYXRlZE9wdGlvbnMpO1xuICAgICAgICAgICAgICAgIGNvbnN0IGlzU3RyZWFtID0gdHlwZU5hbWUgPT09IHNlcmlhbGl6ZXJfanNfMS5NYXBwZXJUeXBlTmFtZXMuU3RyZWFtO1xuICAgICAgICAgICAgICAgIGlmIChvcGVyYXRpb25TcGVjLmlzWE1MKSB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IHhtbG5zS2V5ID0geG1sTmFtZXNwYWNlUHJlZml4ID8gYHhtbG5zOiR7eG1sTmFtZXNwYWNlUHJlZml4fWAgOiBcInhtbG5zXCI7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IHZhbHVlID0gZ2V0WG1sVmFsdWVXaXRoTmFtZXNwYWNlKHhtbE5hbWVzcGFjZSwgeG1sbnNLZXksIHR5cGVOYW1lLCByZXF1ZXN0LmJvZHksIHVwZGF0ZWRPcHRpb25zKTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKHR5cGVOYW1lID09PSBzZXJpYWxpemVyX2pzXzEuTWFwcGVyVHlwZU5hbWVzLlNlcXVlbmNlKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXF1ZXN0LmJvZHkgPSBzdHJpbmdpZnlYTUwocHJlcGFyZVhNTFJvb3RMaXN0KHZhbHVlLCB4bWxFbGVtZW50TmFtZSB8fCB4bWxOYW1lIHx8IHNlcmlhbGl6ZWROYW1lLCB4bWxuc0tleSwgeG1sTmFtZXNwYWNlKSwgeyByb290TmFtZTogeG1sTmFtZSB8fCBzZXJpYWxpemVkTmFtZSwgeG1sQ2hhcktleSB9KTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBlbHNlIGlmICghaXNTdHJlYW0pIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJlcXVlc3QuYm9keSA9IHN0cmluZ2lmeVhNTCh2YWx1ZSwge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJvb3ROYW1lOiB4bWxOYW1lIHx8IHNlcmlhbGl6ZWROYW1lLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHhtbENoYXJLZXksXG4gICAgICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBlbHNlIGlmICh0eXBlTmFtZSA9PT0gc2VyaWFsaXplcl9qc18xLk1hcHBlclR5cGVOYW1lcy5TdHJpbmcgJiZcbiAgICAgICAgICAgICAgICAgICAgKCgoX2UgPSBvcGVyYXRpb25TcGVjLmNvbnRlbnRUeXBlKSA9PT0gbnVsbCB8fCBfZSA9PT0gdm9pZCAwID8gdm9pZCAwIDogX2UubWF0Y2goXCJ0ZXh0L3BsYWluXCIpKSB8fCBvcGVyYXRpb25TcGVjLm1lZGlhVHlwZSA9PT0gXCJ0ZXh0XCIpKSB7XG4gICAgICAgICAgICAgICAgICAgIC8vIHRoZSBTdHJpbmcgc2VyaWFsaXplciBoYXMgdmFsaWRhdGVkIHRoYXQgcmVxdWVzdCBib2R5IGlzIGEgc3RyaW5nXG4gICAgICAgICAgICAgICAgICAgIC8vIHNvIGp1c3Qgc2VuZCB0aGUgc3RyaW5nLlxuICAgICAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGVsc2UgaWYgKCFpc1N0cmVhbSkge1xuICAgICAgICAgICAgICAgICAgICByZXF1ZXN0LmJvZHkgPSBKU09OLnN0cmluZ2lmeShyZXF1ZXN0LmJvZHkpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihgRXJyb3IgXCIke2Vycm9yLm1lc3NhZ2V9XCIgb2NjdXJyZWQgaW4gc2VyaWFsaXppbmcgdGhlIHBheWxvYWQgLSAke0pTT04uc3RyaW5naWZ5KHNlcmlhbGl6ZWROYW1lLCB1bmRlZmluZWQsIFwiICBcIil9LmApO1xuICAgICAgICB9XG4gICAgfVxuICAgIGVsc2UgaWYgKG9wZXJhdGlvblNwZWMuZm9ybURhdGFQYXJhbWV0ZXJzICYmIG9wZXJhdGlvblNwZWMuZm9ybURhdGFQYXJhbWV0ZXJzLmxlbmd0aCA+IDApIHtcbiAgICAgICAgcmVxdWVzdC5mb3JtRGF0YSA9IHt9O1xuICAgICAgICBmb3IgKGNvbnN0IGZvcm1EYXRhUGFyYW1ldGVyIG9mIG9wZXJhdGlvblNwZWMuZm9ybURhdGFQYXJhbWV0ZXJzKSB7XG4gICAgICAgICAgICBjb25zdCBmb3JtRGF0YVBhcmFtZXRlclZhbHVlID0gKDAsIG9wZXJhdGlvbkhlbHBlcnNfanNfMS5nZXRPcGVyYXRpb25Bcmd1bWVudFZhbHVlRnJvbVBhcmFtZXRlcikob3BlcmF0aW9uQXJndW1lbnRzLCBmb3JtRGF0YVBhcmFtZXRlcik7XG4gICAgICAgICAgICBpZiAoZm9ybURhdGFQYXJhbWV0ZXJWYWx1ZSAhPT0gdW5kZWZpbmVkICYmIGZvcm1EYXRhUGFyYW1ldGVyVmFsdWUgIT09IG51bGwpIHtcbiAgICAgICAgICAgICAgICBjb25zdCBmb3JtRGF0YVBhcmFtZXRlclByb3BlcnR5TmFtZSA9IGZvcm1EYXRhUGFyYW1ldGVyLm1hcHBlci5zZXJpYWxpemVkTmFtZSB8fCAoMCwgaW50ZXJmYWNlSGVscGVyc19qc18xLmdldFBhdGhTdHJpbmdGcm9tUGFyYW1ldGVyKShmb3JtRGF0YVBhcmFtZXRlcik7XG4gICAgICAgICAgICAgICAgcmVxdWVzdC5mb3JtRGF0YVtmb3JtRGF0YVBhcmFtZXRlclByb3BlcnR5TmFtZV0gPSBvcGVyYXRpb25TcGVjLnNlcmlhbGl6ZXIuc2VyaWFsaXplKGZvcm1EYXRhUGFyYW1ldGVyLm1hcHBlciwgZm9ybURhdGFQYXJhbWV0ZXJWYWx1ZSwgKDAsIGludGVyZmFjZUhlbHBlcnNfanNfMS5nZXRQYXRoU3RyaW5nRnJvbVBhcmFtZXRlcikoZm9ybURhdGFQYXJhbWV0ZXIpLCB1cGRhdGVkT3B0aW9ucyk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG59XG5leHBvcnRzLnNlcmlhbGl6ZVJlcXVlc3RCb2R5ID0gc2VyaWFsaXplUmVxdWVzdEJvZHk7XG4vKipcbiAqIEFkZHMgYW4geG1sIG5hbWVzcGFjZSB0byB0aGUgeG1sIHNlcmlhbGl6ZWQgb2JqZWN0IGlmIG5lZWRlZCwgb3RoZXJ3aXNlIGl0IGp1c3QgcmV0dXJucyB0aGUgdmFsdWUgaXRzZWxmXG4gKi9cbmZ1bmN0aW9uIGdldFhtbFZhbHVlV2l0aE5hbWVzcGFjZSh4bWxOYW1lc3BhY2UsIHhtbG5zS2V5LCB0eXBlTmFtZSwgc2VyaWFsaXplZFZhbHVlLCBvcHRpb25zKSB7XG4gICAgLy8gQ29tcG9zaXRlIGFuZCBTZXF1ZW5jZSBzY2hlbWFzIGFscmVhZHkgZ290IHRoZWlyIHJvb3QgbmFtZXNwYWNlIHNldCBkdXJpbmcgc2VyaWFsaXphdGlvblxuICAgIC8vIFdlIGp1c3QgbmVlZCB0byBhZGQgeG1sbnMgdG8gdGhlIG90aGVyIHNjaGVtYSB0eXBlc1xuICAgIGlmICh4bWxOYW1lc3BhY2UgJiYgIVtcIkNvbXBvc2l0ZVwiLCBcIlNlcXVlbmNlXCIsIFwiRGljdGlvbmFyeVwiXS5pbmNsdWRlcyh0eXBlTmFtZSkpIHtcbiAgICAgICAgY29uc3QgcmVzdWx0ID0ge307XG4gICAgICAgIHJlc3VsdFtvcHRpb25zLnhtbC54bWxDaGFyS2V5XSA9IHNlcmlhbGl6ZWRWYWx1ZTtcbiAgICAgICAgcmVzdWx0W2ludGVyZmFjZXNfanNfMS5YTUxfQVRUUktFWV0gPSB7IFt4bWxuc0tleV06IHhtbE5hbWVzcGFjZSB9O1xuICAgICAgICByZXR1cm4gcmVzdWx0O1xuICAgIH1cbiAgICByZXR1cm4gc2VyaWFsaXplZFZhbHVlO1xufVxuZnVuY3Rpb24gcHJlcGFyZVhNTFJvb3RMaXN0KG9iaiwgZWxlbWVudE5hbWUsIHhtbE5hbWVzcGFjZUtleSwgeG1sTmFtZXNwYWNlKSB7XG4gICAgaWYgKCFBcnJheS5pc0FycmF5KG9iaikpIHtcbiAgICAgICAgb2JqID0gW29ial07XG4gICAgfVxuICAgIGlmICgheG1sTmFtZXNwYWNlS2V5IHx8ICF4bWxOYW1lc3BhY2UpIHtcbiAgICAgICAgcmV0dXJuIHsgW2VsZW1lbnROYW1lXTogb2JqIH07XG4gICAgfVxuICAgIGNvbnN0IHJlc3VsdCA9IHsgW2VsZW1lbnROYW1lXTogb2JqIH07XG4gICAgcmVzdWx0W2ludGVyZmFjZXNfanNfMS5YTUxfQVRUUktFWV0gPSB7IFt4bWxOYW1lc3BhY2VLZXldOiB4bWxOYW1lc3BhY2UgfTtcbiAgICByZXR1cm4gcmVzdWx0O1xufVxuLy8jIHNvdXJjZU1hcHBpbmdVUkw9c2VyaWFsaXphdGlvblBvbGljeS5qcy5tYXAiLAogICAgIlwidXNlIHN0cmljdFwiO1xuLy8gQ29weXJpZ2h0IChjKSBNaWNyb3NvZnQgQ29ycG9yYXRpb24uXG4vLyBMaWNlbnNlZCB1bmRlciB0aGUgTUlUIGxpY2Vuc2UuXG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJfX2VzTW9kdWxlXCIsIHsgdmFsdWU6IHRydWUgfSk7XG5leHBvcnRzLmNyZWF0ZUNsaWVudFBpcGVsaW5lID0gdm9pZCAwO1xuY29uc3QgZGVzZXJpYWxpemF0aW9uUG9saWN5X2pzXzEgPSByZXF1aXJlKFwiLi9kZXNlcmlhbGl6YXRpb25Qb2xpY3kuanNcIik7XG5jb25zdCBjb3JlX3Jlc3RfcGlwZWxpbmVfMSA9IHJlcXVpcmUoXCJAYXp1cmUvY29yZS1yZXN0LXBpcGVsaW5lXCIpO1xuY29uc3Qgc2VyaWFsaXphdGlvblBvbGljeV9qc18xID0gcmVxdWlyZShcIi4vc2VyaWFsaXphdGlvblBvbGljeS5qc1wiKTtcbi8qKlxuICogQ3JlYXRlcyBhIG5ldyBQaXBlbGluZSBmb3IgdXNlIHdpdGggYSBTZXJ2aWNlIENsaWVudC5cbiAqIEFkZHMgaW4gZGVzZXJpYWxpemF0aW9uUG9saWN5IGJ5IGRlZmF1bHQuXG4gKiBBbHNvIGFkZHMgaW4gYmVhcmVyVG9rZW5BdXRoZW50aWNhdGlvblBvbGljeSBpZiBwYXNzZWQgYSBUb2tlbkNyZWRlbnRpYWwuXG4gKiBAcGFyYW0gb3B0aW9ucyAtIE9wdGlvbnMgdG8gY3VzdG9taXplIHRoZSBjcmVhdGVkIHBpcGVsaW5lLlxuICovXG5mdW5jdGlvbiBjcmVhdGVDbGllbnRQaXBlbGluZShvcHRpb25zID0ge30pIHtcbiAgICBjb25zdCBwaXBlbGluZSA9ICgwLCBjb3JlX3Jlc3RfcGlwZWxpbmVfMS5jcmVhdGVQaXBlbGluZUZyb21PcHRpb25zKShvcHRpb25zICE9PSBudWxsICYmIG9wdGlvbnMgIT09IHZvaWQgMCA/IG9wdGlvbnMgOiB7fSk7XG4gICAgaWYgKG9wdGlvbnMuY3JlZGVudGlhbE9wdGlvbnMpIHtcbiAgICAgICAgcGlwZWxpbmUuYWRkUG9saWN5KCgwLCBjb3JlX3Jlc3RfcGlwZWxpbmVfMS5iZWFyZXJUb2tlbkF1dGhlbnRpY2F0aW9uUG9saWN5KSh7XG4gICAgICAgICAgICBjcmVkZW50aWFsOiBvcHRpb25zLmNyZWRlbnRpYWxPcHRpb25zLmNyZWRlbnRpYWwsXG4gICAgICAgICAgICBzY29wZXM6IG9wdGlvbnMuY3JlZGVudGlhbE9wdGlvbnMuY3JlZGVudGlhbFNjb3BlcyxcbiAgICAgICAgfSkpO1xuICAgIH1cbiAgICBwaXBlbGluZS5hZGRQb2xpY3koKDAsIHNlcmlhbGl6YXRpb25Qb2xpY3lfanNfMS5zZXJpYWxpemF0aW9uUG9saWN5KShvcHRpb25zLnNlcmlhbGl6YXRpb25PcHRpb25zKSwgeyBwaGFzZTogXCJTZXJpYWxpemVcIiB9KTtcbiAgICBwaXBlbGluZS5hZGRQb2xpY3koKDAsIGRlc2VyaWFsaXphdGlvblBvbGljeV9qc18xLmRlc2VyaWFsaXphdGlvblBvbGljeSkob3B0aW9ucy5kZXNlcmlhbGl6YXRpb25PcHRpb25zKSwge1xuICAgICAgICBwaGFzZTogXCJEZXNlcmlhbGl6ZVwiLFxuICAgIH0pO1xuICAgIHJldHVybiBwaXBlbGluZTtcbn1cbmV4cG9ydHMuY3JlYXRlQ2xpZW50UGlwZWxpbmUgPSBjcmVhdGVDbGllbnRQaXBlbGluZTtcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPXBpcGVsaW5lLmpzLm1hcCIsCiAgICAiXCJ1c2Ugc3RyaWN0XCI7XG4vLyBDb3B5cmlnaHQgKGMpIE1pY3Jvc29mdCBDb3Jwb3JhdGlvbi5cbi8vIExpY2Vuc2VkIHVuZGVyIHRoZSBNSVQgbGljZW5zZS5cbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIl9fZXNNb2R1bGVcIiwgeyB2YWx1ZTogdHJ1ZSB9KTtcbmV4cG9ydHMuZ2V0Q2FjaGVkRGVmYXVsdEh0dHBDbGllbnQgPSB2b2lkIDA7XG5jb25zdCBjb3JlX3Jlc3RfcGlwZWxpbmVfMSA9IHJlcXVpcmUoXCJAYXp1cmUvY29yZS1yZXN0LXBpcGVsaW5lXCIpO1xubGV0IGNhY2hlZEh0dHBDbGllbnQ7XG5mdW5jdGlvbiBnZXRDYWNoZWREZWZhdWx0SHR0cENsaWVudCgpIHtcbiAgICBpZiAoIWNhY2hlZEh0dHBDbGllbnQpIHtcbiAgICAgICAgY2FjaGVkSHR0cENsaWVudCA9ICgwLCBjb3JlX3Jlc3RfcGlwZWxpbmVfMS5jcmVhdGVEZWZhdWx0SHR0cENsaWVudCkoKTtcbiAgICB9XG4gICAgcmV0dXJuIGNhY2hlZEh0dHBDbGllbnQ7XG59XG5leHBvcnRzLmdldENhY2hlZERlZmF1bHRIdHRwQ2xpZW50ID0gZ2V0Q2FjaGVkRGVmYXVsdEh0dHBDbGllbnQ7XG4vLyMgc291cmNlTWFwcGluZ1VSTD1odHRwQ2xpZW50Q2FjaGUuanMubWFwIiwKICAgICJcInVzZSBzdHJpY3RcIjtcbi8vIENvcHlyaWdodCAoYykgTWljcm9zb2Z0IENvcnBvcmF0aW9uLlxuLy8gTGljZW5zZWQgdW5kZXIgdGhlIE1JVCBsaWNlbnNlLlxuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiX19lc01vZHVsZVwiLCB7IHZhbHVlOiB0cnVlIH0pO1xuZXhwb3J0cy5hcHBlbmRRdWVyeVBhcmFtcyA9IGV4cG9ydHMuZ2V0UmVxdWVzdFVybCA9IHZvaWQgMDtcbmNvbnN0IG9wZXJhdGlvbkhlbHBlcnNfanNfMSA9IHJlcXVpcmUoXCIuL29wZXJhdGlvbkhlbHBlcnMuanNcIik7XG5jb25zdCBpbnRlcmZhY2VIZWxwZXJzX2pzXzEgPSByZXF1aXJlKFwiLi9pbnRlcmZhY2VIZWxwZXJzLmpzXCIpO1xuY29uc3QgQ29sbGVjdGlvbkZvcm1hdFRvRGVsaW1pdGVyTWFwID0ge1xuICAgIENTVjogXCIsXCIsXG4gICAgU1NWOiBcIiBcIixcbiAgICBNdWx0aTogXCJNdWx0aVwiLFxuICAgIFRTVjogXCJcXHRcIixcbiAgICBQaXBlczogXCJ8XCIsXG59O1xuZnVuY3Rpb24gZ2V0UmVxdWVzdFVybChiYXNlVXJpLCBvcGVyYXRpb25TcGVjLCBvcGVyYXRpb25Bcmd1bWVudHMsIGZhbGxiYWNrT2JqZWN0KSB7XG4gICAgY29uc3QgdXJsUmVwbGFjZW1lbnRzID0gY2FsY3VsYXRlVXJsUmVwbGFjZW1lbnRzKG9wZXJhdGlvblNwZWMsIG9wZXJhdGlvbkFyZ3VtZW50cywgZmFsbGJhY2tPYmplY3QpO1xuICAgIGxldCBpc0Fic29sdXRlUGF0aCA9IGZhbHNlO1xuICAgIGxldCByZXF1ZXN0VXJsID0gcmVwbGFjZUFsbChiYXNlVXJpLCB1cmxSZXBsYWNlbWVudHMpO1xuICAgIGlmIChvcGVyYXRpb25TcGVjLnBhdGgpIHtcbiAgICAgICAgbGV0IHBhdGggPSByZXBsYWNlQWxsKG9wZXJhdGlvblNwZWMucGF0aCwgdXJsUmVwbGFjZW1lbnRzKTtcbiAgICAgICAgLy8gUVVJUks6IHNvbWV0aW1lcyB3ZSBnZXQgYSBwYXRoIGNvbXBvbmVudCBsaWtlIC97bmV4dExpbmt9XG4gICAgICAgIC8vIHdoaWNoIG1heSBiZSBhIGZ1bGx5IGZvcm1lZCBVUkwgd2l0aCBhIGxlYWRpbmcgLy4gSW4gdGhhdCBjYXNlLCB3ZSBzaG91bGRcbiAgICAgICAgLy8gcmVtb3ZlIHRoZSBsZWFkaW5nIC9cbiAgICAgICAgaWYgKG9wZXJhdGlvblNwZWMucGF0aCA9PT0gXCIve25leHRMaW5rfVwiICYmIHBhdGguc3RhcnRzV2l0aChcIi9cIikpIHtcbiAgICAgICAgICAgIHBhdGggPSBwYXRoLnN1YnN0cmluZygxKTtcbiAgICAgICAgfVxuICAgICAgICAvLyBRVUlSSzogc29tZXRpbWVzIHdlIGdldCBhIHBhdGggY29tcG9uZW50IGxpa2Uge25leHRMaW5rfVxuICAgICAgICAvLyB3aGljaCBtYXkgYmUgYSBmdWxseSBmb3JtZWQgVVJMLiBJbiB0aGF0IGNhc2UsIHdlIHNob3VsZFxuICAgICAgICAvLyBpZ25vcmUgdGhlIGJhc2VVcmkuXG4gICAgICAgIGlmIChpc0Fic29sdXRlVXJsKHBhdGgpKSB7XG4gICAgICAgICAgICByZXF1ZXN0VXJsID0gcGF0aDtcbiAgICAgICAgICAgIGlzQWJzb2x1dGVQYXRoID0gdHJ1ZTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIHJlcXVlc3RVcmwgPSBhcHBlbmRQYXRoKHJlcXVlc3RVcmwsIHBhdGgpO1xuICAgICAgICB9XG4gICAgfVxuICAgIGNvbnN0IHsgcXVlcnlQYXJhbXMsIHNlcXVlbmNlUGFyYW1zIH0gPSBjYWxjdWxhdGVRdWVyeVBhcmFtZXRlcnMob3BlcmF0aW9uU3BlYywgb3BlcmF0aW9uQXJndW1lbnRzLCBmYWxsYmFja09iamVjdCk7XG4gICAgLyoqXG4gICAgICogTm90aWNlIHRoYXQgdGhpcyBjYWxsIHNldHMgdGhlIGBub092ZXJ3cml0ZWAgcGFyYW1ldGVyIHRvIHRydWUgaWYgdGhlIGByZXF1ZXN0VXJsYFxuICAgICAqIGlzIGFuIGFic29sdXRlIHBhdGguIFRoaXMgZW5zdXJlcyB0aGF0IGV4aXN0aW5nIHF1ZXJ5IHBhcmFtZXRlciB2YWx1ZXMgaW4gYHJlcXVlc3RVcmxgXG4gICAgICogZG8gbm90IGdldCBvdmVyd3JpdHRlbi4gT24gdGhlIG90aGVyIGhhbmQgd2hlbiBgcmVxdWVzdFVybGAgaXMgbm90IGFic29sdXRlIHBhdGgsIGl0XG4gICAgICogaXMgc3RpbGwgYmVpbmcgYnVpbHQgc28gdGhlcmUgaXMgbm90aGluZyB0byBvdmVyd3JpdGUuXG4gICAgICovXG4gICAgcmVxdWVzdFVybCA9IGFwcGVuZFF1ZXJ5UGFyYW1zKHJlcXVlc3RVcmwsIHF1ZXJ5UGFyYW1zLCBzZXF1ZW5jZVBhcmFtcywgaXNBYnNvbHV0ZVBhdGgpO1xuICAgIHJldHVybiByZXF1ZXN0VXJsO1xufVxuZXhwb3J0cy5nZXRSZXF1ZXN0VXJsID0gZ2V0UmVxdWVzdFVybDtcbmZ1bmN0aW9uIHJlcGxhY2VBbGwoaW5wdXQsIHJlcGxhY2VtZW50cykge1xuICAgIGxldCByZXN1bHQgPSBpbnB1dDtcbiAgICBmb3IgKGNvbnN0IFtzZWFyY2hWYWx1ZSwgcmVwbGFjZVZhbHVlXSBvZiByZXBsYWNlbWVudHMpIHtcbiAgICAgICAgcmVzdWx0ID0gcmVzdWx0LnNwbGl0KHNlYXJjaFZhbHVlKS5qb2luKHJlcGxhY2VWYWx1ZSk7XG4gICAgfVxuICAgIHJldHVybiByZXN1bHQ7XG59XG5mdW5jdGlvbiBjYWxjdWxhdGVVcmxSZXBsYWNlbWVudHMob3BlcmF0aW9uU3BlYywgb3BlcmF0aW9uQXJndW1lbnRzLCBmYWxsYmFja09iamVjdCkge1xuICAgIHZhciBfYTtcbiAgICBjb25zdCByZXN1bHQgPSBuZXcgTWFwKCk7XG4gICAgaWYgKChfYSA9IG9wZXJhdGlvblNwZWMudXJsUGFyYW1ldGVycykgPT09IG51bGwgfHwgX2EgPT09IHZvaWQgMCA/IHZvaWQgMCA6IF9hLmxlbmd0aCkge1xuICAgICAgICBmb3IgKGNvbnN0IHVybFBhcmFtZXRlciBvZiBvcGVyYXRpb25TcGVjLnVybFBhcmFtZXRlcnMpIHtcbiAgICAgICAgICAgIGxldCB1cmxQYXJhbWV0ZXJWYWx1ZSA9ICgwLCBvcGVyYXRpb25IZWxwZXJzX2pzXzEuZ2V0T3BlcmF0aW9uQXJndW1lbnRWYWx1ZUZyb21QYXJhbWV0ZXIpKG9wZXJhdGlvbkFyZ3VtZW50cywgdXJsUGFyYW1ldGVyLCBmYWxsYmFja09iamVjdCk7XG4gICAgICAgICAgICBjb25zdCBwYXJhbWV0ZXJQYXRoU3RyaW5nID0gKDAsIGludGVyZmFjZUhlbHBlcnNfanNfMS5nZXRQYXRoU3RyaW5nRnJvbVBhcmFtZXRlcikodXJsUGFyYW1ldGVyKTtcbiAgICAgICAgICAgIHVybFBhcmFtZXRlclZhbHVlID0gb3BlcmF0aW9uU3BlYy5zZXJpYWxpemVyLnNlcmlhbGl6ZSh1cmxQYXJhbWV0ZXIubWFwcGVyLCB1cmxQYXJhbWV0ZXJWYWx1ZSwgcGFyYW1ldGVyUGF0aFN0cmluZyk7XG4gICAgICAgICAgICBpZiAoIXVybFBhcmFtZXRlci5za2lwRW5jb2RpbmcpIHtcbiAgICAgICAgICAgICAgICB1cmxQYXJhbWV0ZXJWYWx1ZSA9IGVuY29kZVVSSUNvbXBvbmVudCh1cmxQYXJhbWV0ZXJWYWx1ZSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXN1bHQuc2V0KGB7JHt1cmxQYXJhbWV0ZXIubWFwcGVyLnNlcmlhbGl6ZWROYW1lIHx8IHBhcmFtZXRlclBhdGhTdHJpbmd9fWAsIHVybFBhcmFtZXRlclZhbHVlKTtcbiAgICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gcmVzdWx0O1xufVxuZnVuY3Rpb24gaXNBYnNvbHV0ZVVybCh1cmwpIHtcbiAgICByZXR1cm4gdXJsLmluY2x1ZGVzKFwiOi8vXCIpO1xufVxuZnVuY3Rpb24gYXBwZW5kUGF0aCh1cmwsIHBhdGhUb0FwcGVuZCkge1xuICAgIGlmICghcGF0aFRvQXBwZW5kKSB7XG4gICAgICAgIHJldHVybiB1cmw7XG4gICAgfVxuICAgIGNvbnN0IHBhcnNlZFVybCA9IG5ldyBVUkwodXJsKTtcbiAgICBsZXQgbmV3UGF0aCA9IHBhcnNlZFVybC5wYXRobmFtZTtcbiAgICBpZiAoIW5ld1BhdGguZW5kc1dpdGgoXCIvXCIpKSB7XG4gICAgICAgIG5ld1BhdGggPSBgJHtuZXdQYXRofS9gO1xuICAgIH1cbiAgICBpZiAocGF0aFRvQXBwZW5kLnN0YXJ0c1dpdGgoXCIvXCIpKSB7XG4gICAgICAgIHBhdGhUb0FwcGVuZCA9IHBhdGhUb0FwcGVuZC5zdWJzdHJpbmcoMSk7XG4gICAgfVxuICAgIGNvbnN0IHNlYXJjaFN0YXJ0ID0gcGF0aFRvQXBwZW5kLmluZGV4T2YoXCI/XCIpO1xuICAgIGlmIChzZWFyY2hTdGFydCAhPT0gLTEpIHtcbiAgICAgICAgY29uc3QgcGF0aCA9IHBhdGhUb0FwcGVuZC5zdWJzdHJpbmcoMCwgc2VhcmNoU3RhcnQpO1xuICAgICAgICBjb25zdCBzZWFyY2ggPSBwYXRoVG9BcHBlbmQuc3Vic3RyaW5nKHNlYXJjaFN0YXJ0ICsgMSk7XG4gICAgICAgIG5ld1BhdGggPSBuZXdQYXRoICsgcGF0aDtcbiAgICAgICAgaWYgKHNlYXJjaCkge1xuICAgICAgICAgICAgcGFyc2VkVXJsLnNlYXJjaCA9IHBhcnNlZFVybC5zZWFyY2ggPyBgJHtwYXJzZWRVcmwuc2VhcmNofSYke3NlYXJjaH1gIDogc2VhcmNoO1xuICAgICAgICB9XG4gICAgfVxuICAgIGVsc2Uge1xuICAgICAgICBuZXdQYXRoID0gbmV3UGF0aCArIHBhdGhUb0FwcGVuZDtcbiAgICB9XG4gICAgcGFyc2VkVXJsLnBhdGhuYW1lID0gbmV3UGF0aDtcbiAgICByZXR1cm4gcGFyc2VkVXJsLnRvU3RyaW5nKCk7XG59XG5mdW5jdGlvbiBjYWxjdWxhdGVRdWVyeVBhcmFtZXRlcnMob3BlcmF0aW9uU3BlYywgb3BlcmF0aW9uQXJndW1lbnRzLCBmYWxsYmFja09iamVjdCkge1xuICAgIHZhciBfYTtcbiAgICBjb25zdCByZXN1bHQgPSBuZXcgTWFwKCk7XG4gICAgY29uc3Qgc2VxdWVuY2VQYXJhbXMgPSBuZXcgU2V0KCk7XG4gICAgaWYgKChfYSA9IG9wZXJhdGlvblNwZWMucXVlcnlQYXJhbWV0ZXJzKSA9PT0gbnVsbCB8fCBfYSA9PT0gdm9pZCAwID8gdm9pZCAwIDogX2EubGVuZ3RoKSB7XG4gICAgICAgIGZvciAoY29uc3QgcXVlcnlQYXJhbWV0ZXIgb2Ygb3BlcmF0aW9uU3BlYy5xdWVyeVBhcmFtZXRlcnMpIHtcbiAgICAgICAgICAgIGlmIChxdWVyeVBhcmFtZXRlci5tYXBwZXIudHlwZS5uYW1lID09PSBcIlNlcXVlbmNlXCIgJiYgcXVlcnlQYXJhbWV0ZXIubWFwcGVyLnNlcmlhbGl6ZWROYW1lKSB7XG4gICAgICAgICAgICAgICAgc2VxdWVuY2VQYXJhbXMuYWRkKHF1ZXJ5UGFyYW1ldGVyLm1hcHBlci5zZXJpYWxpemVkTmFtZSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBsZXQgcXVlcnlQYXJhbWV0ZXJWYWx1ZSA9ICgwLCBvcGVyYXRpb25IZWxwZXJzX2pzXzEuZ2V0T3BlcmF0aW9uQXJndW1lbnRWYWx1ZUZyb21QYXJhbWV0ZXIpKG9wZXJhdGlvbkFyZ3VtZW50cywgcXVlcnlQYXJhbWV0ZXIsIGZhbGxiYWNrT2JqZWN0KTtcbiAgICAgICAgICAgIGlmICgocXVlcnlQYXJhbWV0ZXJWYWx1ZSAhPT0gdW5kZWZpbmVkICYmIHF1ZXJ5UGFyYW1ldGVyVmFsdWUgIT09IG51bGwpIHx8XG4gICAgICAgICAgICAgICAgcXVlcnlQYXJhbWV0ZXIubWFwcGVyLnJlcXVpcmVkKSB7XG4gICAgICAgICAgICAgICAgcXVlcnlQYXJhbWV0ZXJWYWx1ZSA9IG9wZXJhdGlvblNwZWMuc2VyaWFsaXplci5zZXJpYWxpemUocXVlcnlQYXJhbWV0ZXIubWFwcGVyLCBxdWVyeVBhcmFtZXRlclZhbHVlLCAoMCwgaW50ZXJmYWNlSGVscGVyc19qc18xLmdldFBhdGhTdHJpbmdGcm9tUGFyYW1ldGVyKShxdWVyeVBhcmFtZXRlcikpO1xuICAgICAgICAgICAgICAgIGNvbnN0IGRlbGltaXRlciA9IHF1ZXJ5UGFyYW1ldGVyLmNvbGxlY3Rpb25Gb3JtYXRcbiAgICAgICAgICAgICAgICAgICAgPyBDb2xsZWN0aW9uRm9ybWF0VG9EZWxpbWl0ZXJNYXBbcXVlcnlQYXJhbWV0ZXIuY29sbGVjdGlvbkZvcm1hdF1cbiAgICAgICAgICAgICAgICAgICAgOiBcIlwiO1xuICAgICAgICAgICAgICAgIGlmIChBcnJheS5pc0FycmF5KHF1ZXJ5UGFyYW1ldGVyVmFsdWUpKSB7XG4gICAgICAgICAgICAgICAgICAgIC8vIHJlcGxhY2UgbnVsbCBhbmQgdW5kZWZpbmVkXG4gICAgICAgICAgICAgICAgICAgIHF1ZXJ5UGFyYW1ldGVyVmFsdWUgPSBxdWVyeVBhcmFtZXRlclZhbHVlLm1hcCgoaXRlbSkgPT4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGl0ZW0gPT09IG51bGwgfHwgaXRlbSA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFwiXCI7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gaXRlbTtcbiAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGlmIChxdWVyeVBhcmFtZXRlci5jb2xsZWN0aW9uRm9ybWF0ID09PSBcIk11bHRpXCIgJiYgcXVlcnlQYXJhbWV0ZXJWYWx1ZS5sZW5ndGggPT09IDApIHtcbiAgICAgICAgICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGVsc2UgaWYgKEFycmF5LmlzQXJyYXkocXVlcnlQYXJhbWV0ZXJWYWx1ZSkgJiZcbiAgICAgICAgICAgICAgICAgICAgKHF1ZXJ5UGFyYW1ldGVyLmNvbGxlY3Rpb25Gb3JtYXQgPT09IFwiU1NWXCIgfHwgcXVlcnlQYXJhbWV0ZXIuY29sbGVjdGlvbkZvcm1hdCA9PT0gXCJUU1ZcIikpIHtcbiAgICAgICAgICAgICAgICAgICAgcXVlcnlQYXJhbWV0ZXJWYWx1ZSA9IHF1ZXJ5UGFyYW1ldGVyVmFsdWUuam9pbihkZWxpbWl0ZXIpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBpZiAoIXF1ZXJ5UGFyYW1ldGVyLnNraXBFbmNvZGluZykge1xuICAgICAgICAgICAgICAgICAgICBpZiAoQXJyYXkuaXNBcnJheShxdWVyeVBhcmFtZXRlclZhbHVlKSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgcXVlcnlQYXJhbWV0ZXJWYWx1ZSA9IHF1ZXJ5UGFyYW1ldGVyVmFsdWUubWFwKChpdGVtKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGVuY29kZVVSSUNvbXBvbmVudChpdGVtKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgcXVlcnlQYXJhbWV0ZXJWYWx1ZSA9IGVuY29kZVVSSUNvbXBvbmVudChxdWVyeVBhcmFtZXRlclZhbHVlKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAvLyBKb2luIHBpcGVzIGFuZCBDU1YgKmFmdGVyKiBlbmNvZGluZywgb3IgdGhlIHNlcnZlciB3aWxsIGJlIHVwc2V0LlxuICAgICAgICAgICAgICAgIGlmIChBcnJheS5pc0FycmF5KHF1ZXJ5UGFyYW1ldGVyVmFsdWUpICYmXG4gICAgICAgICAgICAgICAgICAgIChxdWVyeVBhcmFtZXRlci5jb2xsZWN0aW9uRm9ybWF0ID09PSBcIkNTVlwiIHx8IHF1ZXJ5UGFyYW1ldGVyLmNvbGxlY3Rpb25Gb3JtYXQgPT09IFwiUGlwZXNcIikpIHtcbiAgICAgICAgICAgICAgICAgICAgcXVlcnlQYXJhbWV0ZXJWYWx1ZSA9IHF1ZXJ5UGFyYW1ldGVyVmFsdWUuam9pbihkZWxpbWl0ZXIpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICByZXN1bHQuc2V0KHF1ZXJ5UGFyYW1ldGVyLm1hcHBlci5zZXJpYWxpemVkTmFtZSB8fCAoMCwgaW50ZXJmYWNlSGVscGVyc19qc18xLmdldFBhdGhTdHJpbmdGcm9tUGFyYW1ldGVyKShxdWVyeVBhcmFtZXRlciksIHF1ZXJ5UGFyYW1ldGVyVmFsdWUpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxuICAgIHJldHVybiB7XG4gICAgICAgIHF1ZXJ5UGFyYW1zOiByZXN1bHQsXG4gICAgICAgIHNlcXVlbmNlUGFyYW1zLFxuICAgIH07XG59XG5mdW5jdGlvbiBzaW1wbGVQYXJzZVF1ZXJ5UGFyYW1zKHF1ZXJ5U3RyaW5nKSB7XG4gICAgY29uc3QgcmVzdWx0ID0gbmV3IE1hcCgpO1xuICAgIGlmICghcXVlcnlTdHJpbmcgfHwgcXVlcnlTdHJpbmdbMF0gIT09IFwiP1wiKSB7XG4gICAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgfVxuICAgIC8vIHJlbW92ZSB0aGUgbGVhZGluZyA/XG4gICAgcXVlcnlTdHJpbmcgPSBxdWVyeVN0cmluZy5zbGljZSgxKTtcbiAgICBjb25zdCBwYWlycyA9IHF1ZXJ5U3RyaW5nLnNwbGl0KFwiJlwiKTtcbiAgICBmb3IgKGNvbnN0IHBhaXIgb2YgcGFpcnMpIHtcbiAgICAgICAgY29uc3QgW25hbWUsIHZhbHVlXSA9IHBhaXIuc3BsaXQoXCI9XCIsIDIpO1xuICAgICAgICBjb25zdCBleGlzdGluZ1ZhbHVlID0gcmVzdWx0LmdldChuYW1lKTtcbiAgICAgICAgaWYgKGV4aXN0aW5nVmFsdWUpIHtcbiAgICAgICAgICAgIGlmIChBcnJheS5pc0FycmF5KGV4aXN0aW5nVmFsdWUpKSB7XG4gICAgICAgICAgICAgICAgZXhpc3RpbmdWYWx1ZS5wdXNoKHZhbHVlKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgIHJlc3VsdC5zZXQobmFtZSwgW2V4aXN0aW5nVmFsdWUsIHZhbHVlXSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICByZXN1bHQuc2V0KG5hbWUsIHZhbHVlKTtcbiAgICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gcmVzdWx0O1xufVxuLyoqIEBpbnRlcm5hbCAqL1xuZnVuY3Rpb24gYXBwZW5kUXVlcnlQYXJhbXModXJsLCBxdWVyeVBhcmFtcywgc2VxdWVuY2VQYXJhbXMsIG5vT3ZlcndyaXRlID0gZmFsc2UpIHtcbiAgICBpZiAocXVlcnlQYXJhbXMuc2l6ZSA9PT0gMCkge1xuICAgICAgICByZXR1cm4gdXJsO1xuICAgIH1cbiAgICBjb25zdCBwYXJzZWRVcmwgPSBuZXcgVVJMKHVybCk7XG4gICAgLy8gUVVJUks6IHBhcnNlZFVybC5zZWFyY2hQYXJhbXMgd2lsbCBoYXZlIHRoZWlyIG5hbWUvdmFsdWUgcGFpcnMgZGVjb2RlZCwgd2hpY2hcbiAgICAvLyBjYW4gY2hhbmdlIHRoZWlyIG1lYW5pbmcgdG8gdGhlIHNlcnZlciwgc3VjaCBhcyBpbiB0aGUgY2FzZSBvZiBhIFNBUyBzaWduYXR1cmUuXG4gICAgLy8gVG8gYXZvaWQgYWNjaWRlbnRhbGx5IHVuLWVuY29kaW5nIGEgcXVlcnkgcGFyYW0sIHdlIHBhcnNlIHRoZSBrZXkvdmFsdWVzIG91cnNlbHZlc1xuICAgIGNvbnN0IGNvbWJpbmVkUGFyYW1zID0gc2ltcGxlUGFyc2VRdWVyeVBhcmFtcyhwYXJzZWRVcmwuc2VhcmNoKTtcbiAgICBmb3IgKGNvbnN0IFtuYW1lLCB2YWx1ZV0gb2YgcXVlcnlQYXJhbXMpIHtcbiAgICAgICAgY29uc3QgZXhpc3RpbmdWYWx1ZSA9IGNvbWJpbmVkUGFyYW1zLmdldChuYW1lKTtcbiAgICAgICAgaWYgKEFycmF5LmlzQXJyYXkoZXhpc3RpbmdWYWx1ZSkpIHtcbiAgICAgICAgICAgIGlmIChBcnJheS5pc0FycmF5KHZhbHVlKSkge1xuICAgICAgICAgICAgICAgIGV4aXN0aW5nVmFsdWUucHVzaCguLi52YWx1ZSk7XG4gICAgICAgICAgICAgICAgY29uc3QgdmFsdWVTZXQgPSBuZXcgU2V0KGV4aXN0aW5nVmFsdWUpO1xuICAgICAgICAgICAgICAgIGNvbWJpbmVkUGFyYW1zLnNldChuYW1lLCBBcnJheS5mcm9tKHZhbHVlU2V0KSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICBleGlzdGluZ1ZhbHVlLnB1c2godmFsdWUpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGVsc2UgaWYgKGV4aXN0aW5nVmFsdWUpIHtcbiAgICAgICAgICAgIGlmIChBcnJheS5pc0FycmF5KHZhbHVlKSkge1xuICAgICAgICAgICAgICAgIHZhbHVlLnVuc2hpZnQoZXhpc3RpbmdWYWx1ZSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIGlmIChzZXF1ZW5jZVBhcmFtcy5oYXMobmFtZSkpIHtcbiAgICAgICAgICAgICAgICBjb21iaW5lZFBhcmFtcy5zZXQobmFtZSwgW2V4aXN0aW5nVmFsdWUsIHZhbHVlXSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAoIW5vT3ZlcndyaXRlKSB7XG4gICAgICAgICAgICAgICAgY29tYmluZWRQYXJhbXMuc2V0KG5hbWUsIHZhbHVlKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIGNvbWJpbmVkUGFyYW1zLnNldChuYW1lLCB2YWx1ZSk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgY29uc3Qgc2VhcmNoUGllY2VzID0gW107XG4gICAgZm9yIChjb25zdCBbbmFtZSwgdmFsdWVdIG9mIGNvbWJpbmVkUGFyYW1zKSB7XG4gICAgICAgIGlmICh0eXBlb2YgdmFsdWUgPT09IFwic3RyaW5nXCIpIHtcbiAgICAgICAgICAgIHNlYXJjaFBpZWNlcy5wdXNoKGAke25hbWV9PSR7dmFsdWV9YCk7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSBpZiAoQXJyYXkuaXNBcnJheSh2YWx1ZSkpIHtcbiAgICAgICAgICAgIC8vIFFVSVJLOiBJZiB3ZSBnZXQgYW4gYXJyYXkgb2YgdmFsdWVzLCBpbmNsdWRlIG11bHRpcGxlIGtleS92YWx1ZSBwYWlyc1xuICAgICAgICAgICAgZm9yIChjb25zdCBzdWJWYWx1ZSBvZiB2YWx1ZSkge1xuICAgICAgICAgICAgICAgIHNlYXJjaFBpZWNlcy5wdXNoKGAke25hbWV9PSR7c3ViVmFsdWV9YCk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICBzZWFyY2hQaWVjZXMucHVzaChgJHtuYW1lfT0ke3ZhbHVlfWApO1xuICAgICAgICB9XG4gICAgfVxuICAgIC8vIFFVSVJLOiB3ZSBoYXZlIHRvIHNldCBzZWFyY2ggbWFudWFsbHkgYXMgc2VhcmNoUGFyYW1zIHdpbGwgZW5jb2RlIGNvbW1hIHdoZW4gaXQgc2hvdWxkbid0LlxuICAgIHBhcnNlZFVybC5zZWFyY2ggPSBzZWFyY2hQaWVjZXMubGVuZ3RoID8gYD8ke3NlYXJjaFBpZWNlcy5qb2luKFwiJlwiKX1gIDogXCJcIjtcbiAgICByZXR1cm4gcGFyc2VkVXJsLnRvU3RyaW5nKCk7XG59XG5leHBvcnRzLmFwcGVuZFF1ZXJ5UGFyYW1zID0gYXBwZW5kUXVlcnlQYXJhbXM7XG4vLyMgc291cmNlTWFwcGluZ1VSTD11cmxIZWxwZXJzLmpzLm1hcCIsCiAgICAiXCJ1c2Ugc3RyaWN0XCI7XG4vLyBDb3B5cmlnaHQgKGMpIE1pY3Jvc29mdCBDb3Jwb3JhdGlvbi5cbi8vIExpY2Vuc2VkIHVuZGVyIHRoZSBNSVQgbGljZW5zZS5cbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIl9fZXNNb2R1bGVcIiwgeyB2YWx1ZTogdHJ1ZSB9KTtcbmV4cG9ydHMubG9nZ2VyID0gdm9pZCAwO1xuY29uc3QgbG9nZ2VyXzEgPSByZXF1aXJlKFwiQGF6dXJlL2xvZ2dlclwiKTtcbmV4cG9ydHMubG9nZ2VyID0gKDAsIGxvZ2dlcl8xLmNyZWF0ZUNsaWVudExvZ2dlcikoXCJjb3JlLWNsaWVudFwiKTtcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPWxvZy5qcy5tYXAiLAogICAgIlwidXNlIHN0cmljdFwiO1xuLy8gQ29weXJpZ2h0IChjKSBNaWNyb3NvZnQgQ29ycG9yYXRpb24uXG4vLyBMaWNlbnNlZCB1bmRlciB0aGUgTUlUIGxpY2Vuc2UuXG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJfX2VzTW9kdWxlXCIsIHsgdmFsdWU6IHRydWUgfSk7XG5leHBvcnRzLlNlcnZpY2VDbGllbnQgPSB2b2lkIDA7XG5jb25zdCBjb3JlX3Jlc3RfcGlwZWxpbmVfMSA9IHJlcXVpcmUoXCJAYXp1cmUvY29yZS1yZXN0LXBpcGVsaW5lXCIpO1xuY29uc3QgcGlwZWxpbmVfanNfMSA9IHJlcXVpcmUoXCIuL3BpcGVsaW5lLmpzXCIpO1xuY29uc3QgdXRpbHNfanNfMSA9IHJlcXVpcmUoXCIuL3V0aWxzLmpzXCIpO1xuY29uc3QgaHR0cENsaWVudENhY2hlX2pzXzEgPSByZXF1aXJlKFwiLi9odHRwQ2xpZW50Q2FjaGUuanNcIik7XG5jb25zdCBvcGVyYXRpb25IZWxwZXJzX2pzXzEgPSByZXF1aXJlKFwiLi9vcGVyYXRpb25IZWxwZXJzLmpzXCIpO1xuY29uc3QgdXJsSGVscGVyc19qc18xID0gcmVxdWlyZShcIi4vdXJsSGVscGVycy5qc1wiKTtcbmNvbnN0IGludGVyZmFjZUhlbHBlcnNfanNfMSA9IHJlcXVpcmUoXCIuL2ludGVyZmFjZUhlbHBlcnMuanNcIik7XG5jb25zdCBsb2dfanNfMSA9IHJlcXVpcmUoXCIuL2xvZy5qc1wiKTtcbi8qKlxuICogSW5pdGlhbGl6ZXMgYSBuZXcgaW5zdGFuY2Ugb2YgdGhlIFNlcnZpY2VDbGllbnQuXG4gKi9cbmNsYXNzIFNlcnZpY2VDbGllbnQge1xuICAgIC8qKlxuICAgICAqIFRoZSBTZXJ2aWNlQ2xpZW50IGNvbnN0cnVjdG9yXG4gICAgICogQHBhcmFtIGNyZWRlbnRpYWwgLSBUaGUgY3JlZGVudGlhbHMgdXNlZCBmb3IgYXV0aGVudGljYXRpb24gd2l0aCB0aGUgc2VydmljZS5cbiAgICAgKiBAcGFyYW0gb3B0aW9ucyAtIFRoZSBzZXJ2aWNlIGNsaWVudCBvcHRpb25zIHRoYXQgZ292ZXJuIHRoZSBiZWhhdmlvciBvZiB0aGUgY2xpZW50LlxuICAgICAqL1xuICAgIGNvbnN0cnVjdG9yKG9wdGlvbnMgPSB7fSkge1xuICAgICAgICB2YXIgX2EsIF9iO1xuICAgICAgICB0aGlzLl9yZXF1ZXN0Q29udGVudFR5cGUgPSBvcHRpb25zLnJlcXVlc3RDb250ZW50VHlwZTtcbiAgICAgICAgdGhpcy5fZW5kcG9pbnQgPSAoX2EgPSBvcHRpb25zLmVuZHBvaW50KSAhPT0gbnVsbCAmJiBfYSAhPT0gdm9pZCAwID8gX2EgOiBvcHRpb25zLmJhc2VVcmk7XG4gICAgICAgIGlmIChvcHRpb25zLmJhc2VVcmkpIHtcbiAgICAgICAgICAgIGxvZ19qc18xLmxvZ2dlci53YXJuaW5nKFwiVGhlIGJhc2VVcmkgb3B0aW9uIGZvciBTREsgQ2xpZW50cyBoYXMgYmVlbiBkZXByZWNhdGVkLCBwbGVhc2UgdXNlIGVuZHBvaW50IGluc3RlYWQuXCIpO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMuX2FsbG93SW5zZWN1cmVDb25uZWN0aW9uID0gb3B0aW9ucy5hbGxvd0luc2VjdXJlQ29ubmVjdGlvbjtcbiAgICAgICAgdGhpcy5faHR0cENsaWVudCA9IG9wdGlvbnMuaHR0cENsaWVudCB8fCAoMCwgaHR0cENsaWVudENhY2hlX2pzXzEuZ2V0Q2FjaGVkRGVmYXVsdEh0dHBDbGllbnQpKCk7XG4gICAgICAgIHRoaXMucGlwZWxpbmUgPSBvcHRpb25zLnBpcGVsaW5lIHx8IGNyZWF0ZURlZmF1bHRQaXBlbGluZShvcHRpb25zKTtcbiAgICAgICAgaWYgKChfYiA9IG9wdGlvbnMuYWRkaXRpb25hbFBvbGljaWVzKSA9PT0gbnVsbCB8fCBfYiA9PT0gdm9pZCAwID8gdm9pZCAwIDogX2IubGVuZ3RoKSB7XG4gICAgICAgICAgICBmb3IgKGNvbnN0IHsgcG9saWN5LCBwb3NpdGlvbiB9IG9mIG9wdGlvbnMuYWRkaXRpb25hbFBvbGljaWVzKSB7XG4gICAgICAgICAgICAgICAgLy8gU2lnbiBoYXBwZW5zIGFmdGVyIFJldHJ5IGFuZCBpcyBjb21tb25seSBuZWVkZWQgdG8gb2NjdXJcbiAgICAgICAgICAgICAgICAvLyBiZWZvcmUgcG9saWNpZXMgdGhhdCBpbnRlcmNlcHQgcG9zdC1yZXRyeS5cbiAgICAgICAgICAgICAgICBjb25zdCBhZnRlclBoYXNlID0gcG9zaXRpb24gPT09IFwicGVyUmV0cnlcIiA/IFwiU2lnblwiIDogdW5kZWZpbmVkO1xuICAgICAgICAgICAgICAgIHRoaXMucGlwZWxpbmUuYWRkUG9saWN5KHBvbGljeSwge1xuICAgICAgICAgICAgICAgICAgICBhZnRlclBoYXNlLFxuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxuICAgIC8qKlxuICAgICAqIFNlbmQgdGhlIHByb3ZpZGVkIGh0dHBSZXF1ZXN0LlxuICAgICAqL1xuICAgIGFzeW5jIHNlbmRSZXF1ZXN0KHJlcXVlc3QpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMucGlwZWxpbmUuc2VuZFJlcXVlc3QodGhpcy5faHR0cENsaWVudCwgcmVxdWVzdCk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIFNlbmQgYW4gSFRUUCByZXF1ZXN0IHRoYXQgaXMgcG9wdWxhdGVkIHVzaW5nIHRoZSBwcm92aWRlZCBPcGVyYXRpb25TcGVjLlxuICAgICAqIEB0eXBlUGFyYW0gVCAtIFRoZSB0eXBlZCByZXN1bHQgb2YgdGhlIHJlcXVlc3QsIGJhc2VkIG9uIHRoZSBPcGVyYXRpb25TcGVjLlxuICAgICAqIEBwYXJhbSBvcGVyYXRpb25Bcmd1bWVudHMgLSBUaGUgYXJndW1lbnRzIHRoYXQgdGhlIEhUVFAgcmVxdWVzdCdzIHRlbXBsYXRlZCB2YWx1ZXMgd2lsbCBiZSBwb3B1bGF0ZWQgZnJvbS5cbiAgICAgKiBAcGFyYW0gb3BlcmF0aW9uU3BlYyAtIFRoZSBPcGVyYXRpb25TcGVjIHRvIHVzZSB0byBwb3B1bGF0ZSB0aGUgaHR0cFJlcXVlc3QuXG4gICAgICovXG4gICAgYXN5bmMgc2VuZE9wZXJhdGlvblJlcXVlc3Qob3BlcmF0aW9uQXJndW1lbnRzLCBvcGVyYXRpb25TcGVjKSB7XG4gICAgICAgIGNvbnN0IGVuZHBvaW50ID0gb3BlcmF0aW9uU3BlYy5iYXNlVXJsIHx8IHRoaXMuX2VuZHBvaW50O1xuICAgICAgICBpZiAoIWVuZHBvaW50KSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJJZiBvcGVyYXRpb25TcGVjLmJhc2VVcmwgaXMgbm90IHNwZWNpZmllZCwgdGhlbiB0aGUgU2VydmljZUNsaWVudCBtdXN0IGhhdmUgYSBlbmRwb2ludCBzdHJpbmcgcHJvcGVydHkgdGhhdCBjb250YWlucyB0aGUgYmFzZSBVUkwgdG8gdXNlLlwiKTtcbiAgICAgICAgfVxuICAgICAgICAvLyBUZW1wbGF0aXplZCBVUkxzIHNvbWV0aW1lcyByZWZlcmVuY2UgcHJvcGVydGllcyBvbiB0aGUgU2VydmljZUNsaWVudCBjaGlsZCBjbGFzcyxcbiAgICAgICAgLy8gc28gd2UgaGF2ZSB0byBwYXNzIGB0aGlzYCBiZWxvdyBpbiBvcmRlciB0byBzZWFyY2ggdGhlc2UgcHJvcGVydGllcyBpZiB0aGV5J3JlXG4gICAgICAgIC8vIG5vdCBwYXJ0IG9mIE9wZXJhdGlvbkFyZ3VtZW50c1xuICAgICAgICBjb25zdCB1cmwgPSAoMCwgdXJsSGVscGVyc19qc18xLmdldFJlcXVlc3RVcmwpKGVuZHBvaW50LCBvcGVyYXRpb25TcGVjLCBvcGVyYXRpb25Bcmd1bWVudHMsIHRoaXMpO1xuICAgICAgICBjb25zdCByZXF1ZXN0ID0gKDAsIGNvcmVfcmVzdF9waXBlbGluZV8xLmNyZWF0ZVBpcGVsaW5lUmVxdWVzdCkoe1xuICAgICAgICAgICAgdXJsLFxuICAgICAgICB9KTtcbiAgICAgICAgcmVxdWVzdC5tZXRob2QgPSBvcGVyYXRpb25TcGVjLmh0dHBNZXRob2Q7XG4gICAgICAgIGNvbnN0IG9wZXJhdGlvbkluZm8gPSAoMCwgb3BlcmF0aW9uSGVscGVyc19qc18xLmdldE9wZXJhdGlvblJlcXVlc3RJbmZvKShyZXF1ZXN0KTtcbiAgICAgICAgb3BlcmF0aW9uSW5mby5vcGVyYXRpb25TcGVjID0gb3BlcmF0aW9uU3BlYztcbiAgICAgICAgb3BlcmF0aW9uSW5mby5vcGVyYXRpb25Bcmd1bWVudHMgPSBvcGVyYXRpb25Bcmd1bWVudHM7XG4gICAgICAgIGNvbnN0IGNvbnRlbnRUeXBlID0gb3BlcmF0aW9uU3BlYy5jb250ZW50VHlwZSB8fCB0aGlzLl9yZXF1ZXN0Q29udGVudFR5cGU7XG4gICAgICAgIGlmIChjb250ZW50VHlwZSAmJiBvcGVyYXRpb25TcGVjLnJlcXVlc3RCb2R5KSB7XG4gICAgICAgICAgICByZXF1ZXN0LmhlYWRlcnMuc2V0KFwiQ29udGVudC1UeXBlXCIsIGNvbnRlbnRUeXBlKTtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBvcHRpb25zID0gb3BlcmF0aW9uQXJndW1lbnRzLm9wdGlvbnM7XG4gICAgICAgIGlmIChvcHRpb25zKSB7XG4gICAgICAgICAgICBjb25zdCByZXF1ZXN0T3B0aW9ucyA9IG9wdGlvbnMucmVxdWVzdE9wdGlvbnM7XG4gICAgICAgICAgICBpZiAocmVxdWVzdE9wdGlvbnMpIHtcbiAgICAgICAgICAgICAgICBpZiAocmVxdWVzdE9wdGlvbnMudGltZW91dCkge1xuICAgICAgICAgICAgICAgICAgICByZXF1ZXN0LnRpbWVvdXQgPSByZXF1ZXN0T3B0aW9ucy50aW1lb3V0O1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBpZiAocmVxdWVzdE9wdGlvbnMub25VcGxvYWRQcm9ncmVzcykge1xuICAgICAgICAgICAgICAgICAgICByZXF1ZXN0Lm9uVXBsb2FkUHJvZ3Jlc3MgPSByZXF1ZXN0T3B0aW9ucy5vblVwbG9hZFByb2dyZXNzO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBpZiAocmVxdWVzdE9wdGlvbnMub25Eb3dubG9hZFByb2dyZXNzKSB7XG4gICAgICAgICAgICAgICAgICAgIHJlcXVlc3Qub25Eb3dubG9hZFByb2dyZXNzID0gcmVxdWVzdE9wdGlvbnMub25Eb3dubG9hZFByb2dyZXNzO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBpZiAocmVxdWVzdE9wdGlvbnMuc2hvdWxkRGVzZXJpYWxpemUgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgICAgICAgICBvcGVyYXRpb25JbmZvLnNob3VsZERlc2VyaWFsaXplID0gcmVxdWVzdE9wdGlvbnMuc2hvdWxkRGVzZXJpYWxpemU7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGlmIChyZXF1ZXN0T3B0aW9ucy5hbGxvd0luc2VjdXJlQ29ubmVjdGlvbikge1xuICAgICAgICAgICAgICAgICAgICByZXF1ZXN0LmFsbG93SW5zZWN1cmVDb25uZWN0aW9uID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAob3B0aW9ucy5hYm9ydFNpZ25hbCkge1xuICAgICAgICAgICAgICAgIHJlcXVlc3QuYWJvcnRTaWduYWwgPSBvcHRpb25zLmFib3J0U2lnbmFsO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKG9wdGlvbnMudHJhY2luZ09wdGlvbnMpIHtcbiAgICAgICAgICAgICAgICByZXF1ZXN0LnRyYWNpbmdPcHRpb25zID0gb3B0aW9ucy50cmFjaW5nT3B0aW9ucztcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBpZiAodGhpcy5fYWxsb3dJbnNlY3VyZUNvbm5lY3Rpb24pIHtcbiAgICAgICAgICAgIHJlcXVlc3QuYWxsb3dJbnNlY3VyZUNvbm5lY3Rpb24gPSB0cnVlO1xuICAgICAgICB9XG4gICAgICAgIGlmIChyZXF1ZXN0LnN0cmVhbVJlc3BvbnNlU3RhdHVzQ29kZXMgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgcmVxdWVzdC5zdHJlYW1SZXNwb25zZVN0YXR1c0NvZGVzID0gKDAsIGludGVyZmFjZUhlbHBlcnNfanNfMS5nZXRTdHJlYW1pbmdSZXNwb25zZVN0YXR1c0NvZGVzKShvcGVyYXRpb25TcGVjKTtcbiAgICAgICAgfVxuICAgICAgICB0cnkge1xuICAgICAgICAgICAgY29uc3QgcmF3UmVzcG9uc2UgPSBhd2FpdCB0aGlzLnNlbmRSZXF1ZXN0KHJlcXVlc3QpO1xuICAgICAgICAgICAgY29uc3QgZmxhdFJlc3BvbnNlID0gKDAsIHV0aWxzX2pzXzEuZmxhdHRlblJlc3BvbnNlKShyYXdSZXNwb25zZSwgb3BlcmF0aW9uU3BlYy5yZXNwb25zZXNbcmF3UmVzcG9uc2Uuc3RhdHVzXSk7XG4gICAgICAgICAgICBpZiAob3B0aW9ucyA9PT0gbnVsbCB8fCBvcHRpb25zID09PSB2b2lkIDAgPyB2b2lkIDAgOiBvcHRpb25zLm9uUmVzcG9uc2UpIHtcbiAgICAgICAgICAgICAgICBvcHRpb25zLm9uUmVzcG9uc2UocmF3UmVzcG9uc2UsIGZsYXRSZXNwb25zZSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4gZmxhdFJlc3BvbnNlO1xuICAgICAgICB9XG4gICAgICAgIGNhdGNoIChlcnJvcikge1xuICAgICAgICAgICAgaWYgKHR5cGVvZiBlcnJvciA9PT0gXCJvYmplY3RcIiAmJiAoZXJyb3IgPT09IG51bGwgfHwgZXJyb3IgPT09IHZvaWQgMCA/IHZvaWQgMCA6IGVycm9yLnJlc3BvbnNlKSkge1xuICAgICAgICAgICAgICAgIGNvbnN0IHJhd1Jlc3BvbnNlID0gZXJyb3IucmVzcG9uc2U7XG4gICAgICAgICAgICAgICAgY29uc3QgZmxhdFJlc3BvbnNlID0gKDAsIHV0aWxzX2pzXzEuZmxhdHRlblJlc3BvbnNlKShyYXdSZXNwb25zZSwgb3BlcmF0aW9uU3BlYy5yZXNwb25zZXNbZXJyb3Iuc3RhdHVzQ29kZV0gfHwgb3BlcmF0aW9uU3BlYy5yZXNwb25zZXNbXCJkZWZhdWx0XCJdKTtcbiAgICAgICAgICAgICAgICBlcnJvci5kZXRhaWxzID0gZmxhdFJlc3BvbnNlO1xuICAgICAgICAgICAgICAgIGlmIChvcHRpb25zID09PSBudWxsIHx8IG9wdGlvbnMgPT09IHZvaWQgMCA/IHZvaWQgMCA6IG9wdGlvbnMub25SZXNwb25zZSkge1xuICAgICAgICAgICAgICAgICAgICBvcHRpb25zLm9uUmVzcG9uc2UocmF3UmVzcG9uc2UsIGZsYXRSZXNwb25zZSwgZXJyb3IpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHRocm93IGVycm9yO1xuICAgICAgICB9XG4gICAgfVxufVxuZXhwb3J0cy5TZXJ2aWNlQ2xpZW50ID0gU2VydmljZUNsaWVudDtcbmZ1bmN0aW9uIGNyZWF0ZURlZmF1bHRQaXBlbGluZShvcHRpb25zKSB7XG4gICAgY29uc3QgY3JlZGVudGlhbFNjb3BlcyA9IGdldENyZWRlbnRpYWxTY29wZXMob3B0aW9ucyk7XG4gICAgY29uc3QgY3JlZGVudGlhbE9wdGlvbnMgPSBvcHRpb25zLmNyZWRlbnRpYWwgJiYgY3JlZGVudGlhbFNjb3Blc1xuICAgICAgICA/IHsgY3JlZGVudGlhbFNjb3BlcywgY3JlZGVudGlhbDogb3B0aW9ucy5jcmVkZW50aWFsIH1cbiAgICAgICAgOiB1bmRlZmluZWQ7XG4gICAgcmV0dXJuICgwLCBwaXBlbGluZV9qc18xLmNyZWF0ZUNsaWVudFBpcGVsaW5lKShPYmplY3QuYXNzaWduKE9iamVjdC5hc3NpZ24oe30sIG9wdGlvbnMpLCB7IGNyZWRlbnRpYWxPcHRpb25zIH0pKTtcbn1cbmZ1bmN0aW9uIGdldENyZWRlbnRpYWxTY29wZXMob3B0aW9ucykge1xuICAgIGlmIChvcHRpb25zLmNyZWRlbnRpYWxTY29wZXMpIHtcbiAgICAgICAgcmV0dXJuIG9wdGlvbnMuY3JlZGVudGlhbFNjb3BlcztcbiAgICB9XG4gICAgaWYgKG9wdGlvbnMuZW5kcG9pbnQpIHtcbiAgICAgICAgcmV0dXJuIGAke29wdGlvbnMuZW5kcG9pbnR9Ly5kZWZhdWx0YDtcbiAgICB9XG4gICAgaWYgKG9wdGlvbnMuYmFzZVVyaSkge1xuICAgICAgICByZXR1cm4gYCR7b3B0aW9ucy5iYXNlVXJpfS8uZGVmYXVsdGA7XG4gICAgfVxuICAgIGlmIChvcHRpb25zLmNyZWRlbnRpYWwgJiYgIW9wdGlvbnMuY3JlZGVudGlhbFNjb3Blcykge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYFdoZW4gdXNpbmcgY3JlZGVudGlhbHMsIHRoZSBTZXJ2aWNlQ2xpZW50T3B0aW9ucyBtdXN0IGNvbnRhaW4gZWl0aGVyIGEgZW5kcG9pbnQgb3IgYSBjcmVkZW50aWFsU2NvcGVzLiBVbmFibGUgdG8gY3JlYXRlIGEgYmVhcmVyVG9rZW5BdXRoZW50aWNhdGlvblBvbGljeWApO1xuICAgIH1cbiAgICByZXR1cm4gdW5kZWZpbmVkO1xufVxuLy8jIHNvdXJjZU1hcHBpbmdVUkw9c2VydmljZUNsaWVudC5qcy5tYXAiLAogICAgIlwidXNlIHN0cmljdFwiO1xuLy8gQ29weXJpZ2h0IChjKSBNaWNyb3NvZnQgQ29ycG9yYXRpb24uXG4vLyBMaWNlbnNlZCB1bmRlciB0aGUgTUlUIGxpY2Vuc2UuXG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJfX2VzTW9kdWxlXCIsIHsgdmFsdWU6IHRydWUgfSk7XG5leHBvcnRzLmF1dGhvcml6ZVJlcXVlc3RPbkNsYWltQ2hhbGxlbmdlID0gZXhwb3J0cy5wYXJzZUNBRUNoYWxsZW5nZSA9IHZvaWQgMDtcbmNvbnN0IGxvZ19qc18xID0gcmVxdWlyZShcIi4vbG9nLmpzXCIpO1xuY29uc3QgYmFzZTY0X2pzXzEgPSByZXF1aXJlKFwiLi9iYXNlNjQuanNcIik7XG4vKipcbiAqIENvbnZlcnRzOiBgQmVhcmVyIGE9XCJiXCIsIGM9XCJkXCIsIEJlYXJlciBkPVwiZVwiLCBmPVwiZ1wiYC5cbiAqIEludG86IGBbIHsgYTogJ2InLCBjOiAnZCcgfSwgeyBkOiAnZScsIGY6ICdnJyB9IF1gLlxuICpcbiAqIEBpbnRlcm5hbFxuICovXG5mdW5jdGlvbiBwYXJzZUNBRUNoYWxsZW5nZShjaGFsbGVuZ2VzKSB7XG4gICAgY29uc3QgYmVhcmVyQ2hhbGxlbmdlcyA9IGAsICR7Y2hhbGxlbmdlcy50cmltKCl9YC5zcGxpdChcIiwgQmVhcmVyIFwiKS5maWx0ZXIoKHgpID0+IHgpO1xuICAgIHJldHVybiBiZWFyZXJDaGFsbGVuZ2VzLm1hcCgoY2hhbGxlbmdlKSA9PiB7XG4gICAgICAgIGNvbnN0IGNoYWxsZW5nZVBhcnRzID0gYCR7Y2hhbGxlbmdlLnRyaW0oKX0sIGAuc3BsaXQoJ1wiLCAnKS5maWx0ZXIoKHgpID0+IHgpO1xuICAgICAgICBjb25zdCBrZXlWYWx1ZVBhaXJzID0gY2hhbGxlbmdlUGFydHMubWFwKChrZXlWYWx1ZSkgPT4gKChba2V5LCB2YWx1ZV0pID0+ICh7IFtrZXldOiB2YWx1ZSB9KSkoa2V5VmFsdWUudHJpbSgpLnNwbGl0KCc9XCInKSkpO1xuICAgICAgICAvLyBLZXktdmFsdWUgcGFpcnMgdG8gcGxhaW4gb2JqZWN0OlxuICAgICAgICByZXR1cm4ga2V5VmFsdWVQYWlycy5yZWR1Y2UoKGEsIGIpID0+IChPYmplY3QuYXNzaWduKE9iamVjdC5hc3NpZ24oe30sIGEpLCBiKSksIHt9KTtcbiAgICB9KTtcbn1cbmV4cG9ydHMucGFyc2VDQUVDaGFsbGVuZ2UgPSBwYXJzZUNBRUNoYWxsZW5nZTtcbi8qKlxuICogVGhpcyBmdW5jdGlvbiBjYW4gYmUgdXNlZCBhcyBhIGNhbGxiYWNrIGZvciB0aGUgYGJlYXJlclRva2VuQXV0aGVudGljYXRpb25Qb2xpY3lgIG9mIGBAYXp1cmUvY29yZS1yZXN0LXBpcGVsaW5lYCwgdG8gc3VwcG9ydCBDQUUgY2hhbGxlbmdlczpcbiAqIFtDb250aW51b3VzIEFjY2VzcyBFdmFsdWF0aW9uXShodHRwczovL2RvY3MubWljcm9zb2Z0LmNvbS9henVyZS9hY3RpdmUtZGlyZWN0b3J5L2NvbmRpdGlvbmFsLWFjY2Vzcy9jb25jZXB0LWNvbnRpbnVvdXMtYWNjZXNzLWV2YWx1YXRpb24pLlxuICpcbiAqIENhbGwgdGhlIGBiZWFyZXJUb2tlbkF1dGhlbnRpY2F0aW9uUG9saWN5YCB3aXRoIHRoZSBmb2xsb3dpbmcgb3B0aW9uczpcbiAqXG4gKiBgYGB0c1xuICogaW1wb3J0IHsgYmVhcmVyVG9rZW5BdXRoZW50aWNhdGlvblBvbGljeSB9IGZyb20gXCJAYXp1cmUvY29yZS1yZXN0LXBpcGVsaW5lXCI7XG4gKiBpbXBvcnQgeyBhdXRob3JpemVSZXF1ZXN0T25DbGFpbUNoYWxsZW5nZSB9IGZyb20gXCJAYXp1cmUvY29yZS1jbGllbnRcIjtcbiAqXG4gKiBjb25zdCBiZWFyZXJUb2tlbkF1dGhlbnRpY2F0aW9uUG9saWN5ID0gYmVhcmVyVG9rZW5BdXRoZW50aWNhdGlvblBvbGljeSh7XG4gKiAgIGF1dGhvcml6ZVJlcXVlc3RPbkNoYWxsZW5nZTogYXV0aG9yaXplUmVxdWVzdE9uQ2xhaW1DaGFsbGVuZ2VcbiAqIH0pO1xuICogYGBgXG4gKlxuICogT25jZSBwcm92aWRlZCwgdGhlIGBiZWFyZXJUb2tlbkF1dGhlbnRpY2F0aW9uUG9saWN5YCBwb2xpY3kgd2lsbCBpbnRlcm5hbGx5IGhhbmRsZSBDb250aW51b3VzIEFjY2VzcyBFdmFsdWF0aW9uIChDQUUpIGNoYWxsZW5nZXMuXG4gKiBXaGVuIGl0IGNhbid0IGNvbXBsZXRlIGEgY2hhbGxlbmdlIGl0IHdpbGwgcmV0dXJuIHRoZSA0MDEgKHVuYXV0aG9yaXplZCkgcmVzcG9uc2UgZnJvbSBBUk0uXG4gKlxuICogRXhhbXBsZSBjaGFsbGVuZ2Ugd2l0aCBjbGFpbXM6XG4gKlxuICogYGBgXG4gKiBCZWFyZXIgYXV0aG9yaXphdGlvbl91cmk9XCJodHRwczovL2xvZ2luLndpbmRvd3MtcHBlLm5ldC9cIiwgZXJyb3I9XCJpbnZhbGlkX3Rva2VuXCIsXG4gKiBlcnJvcl9kZXNjcmlwdGlvbj1cIlVzZXIgc2Vzc2lvbiBoYXMgYmVlbiByZXZva2VkXCIsXG4gKiBjbGFpbXM9XCJleUpoWTJObGMzTmZkRzlyWlc0aU9uc2libUptSWpwN0ltVnpjMlZ1ZEdsaGJDSTZkSEoxWlN3Z0luWmhiSFZsSWpvaU1UWXdNemMwTWpnd01DSjlmWDA9XCJcbiAqIGBgYFxuICovXG5hc3luYyBmdW5jdGlvbiBhdXRob3JpemVSZXF1ZXN0T25DbGFpbUNoYWxsZW5nZShvbkNoYWxsZW5nZU9wdGlvbnMpIHtcbiAgICBjb25zdCB7IHNjb3BlcywgcmVzcG9uc2UgfSA9IG9uQ2hhbGxlbmdlT3B0aW9ucztcbiAgICBjb25zdCBsb2dnZXIgPSBvbkNoYWxsZW5nZU9wdGlvbnMubG9nZ2VyIHx8IGxvZ19qc18xLmxvZ2dlcjtcbiAgICBjb25zdCBjaGFsbGVuZ2UgPSByZXNwb25zZS5oZWFkZXJzLmdldChcIldXVy1BdXRoZW50aWNhdGVcIik7XG4gICAgaWYgKCFjaGFsbGVuZ2UpIHtcbiAgICAgICAgbG9nZ2VyLmluZm8oYFRoZSBXV1ctQXV0aGVudGljYXRlIGhlYWRlciB3YXMgbWlzc2luZy4gRmFpbGVkIHRvIHBlcmZvcm0gdGhlIENvbnRpbnVvdXMgQWNjZXNzIEV2YWx1YXRpb24gYXV0aGVudGljYXRpb24gZmxvdy5gKTtcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgICBjb25zdCBjaGFsbGVuZ2VzID0gcGFyc2VDQUVDaGFsbGVuZ2UoY2hhbGxlbmdlKSB8fCBbXTtcbiAgICBjb25zdCBwYXJzZWRDaGFsbGVuZ2UgPSBjaGFsbGVuZ2VzLmZpbmQoKHgpID0+IHguY2xhaW1zKTtcbiAgICBpZiAoIXBhcnNlZENoYWxsZW5nZSkge1xuICAgICAgICBsb2dnZXIuaW5mbyhgVGhlIFdXVy1BdXRoZW50aWNhdGUgaGVhZGVyIHdhcyBtaXNzaW5nIHRoZSBuZWNlc3NhcnkgXCJjbGFpbXNcIiB0byBwZXJmb3JtIHRoZSBDb250aW51b3VzIEFjY2VzcyBFdmFsdWF0aW9uIGF1dGhlbnRpY2F0aW9uIGZsb3cuYCk7XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gICAgY29uc3QgYWNjZXNzVG9rZW4gPSBhd2FpdCBvbkNoYWxsZW5nZU9wdGlvbnMuZ2V0QWNjZXNzVG9rZW4ocGFyc2VkQ2hhbGxlbmdlLnNjb3BlID8gW3BhcnNlZENoYWxsZW5nZS5zY29wZV0gOiBzY29wZXMsIHtcbiAgICAgICAgY2xhaW1zOiAoMCwgYmFzZTY0X2pzXzEuZGVjb2RlU3RyaW5nVG9TdHJpbmcpKHBhcnNlZENoYWxsZW5nZS5jbGFpbXMpLFxuICAgIH0pO1xuICAgIGlmICghYWNjZXNzVG9rZW4pIHtcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgICBvbkNoYWxsZW5nZU9wdGlvbnMucmVxdWVzdC5oZWFkZXJzLnNldChcIkF1dGhvcml6YXRpb25cIiwgYEJlYXJlciAke2FjY2Vzc1Rva2VuLnRva2VufWApO1xuICAgIHJldHVybiB0cnVlO1xufVxuZXhwb3J0cy5hdXRob3JpemVSZXF1ZXN0T25DbGFpbUNoYWxsZW5nZSA9IGF1dGhvcml6ZVJlcXVlc3RPbkNsYWltQ2hhbGxlbmdlO1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9YXV0aG9yaXplUmVxdWVzdE9uQ2xhaW1DaGFsbGVuZ2UuanMubWFwIiwKICAgICJcInVzZSBzdHJpY3RcIjtcbi8vIENvcHlyaWdodCAoYykgTWljcm9zb2Z0IENvcnBvcmF0aW9uLlxuLy8gTGljZW5zZWQgdW5kZXIgdGhlIE1JVCBsaWNlbnNlLlxuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiX19lc01vZHVsZVwiLCB7IHZhbHVlOiB0cnVlIH0pO1xuZXhwb3J0cy5hdXRob3JpemVSZXF1ZXN0T25UZW5hbnRDaGFsbGVuZ2UgPSB2b2lkIDA7XG4vKipcbiAqIEEgc2V0IG9mIGNvbnN0YW50cyB1c2VkIGludGVybmFsbHkgd2hlbiBwcm9jZXNzaW5nIHJlcXVlc3RzLlxuICovXG5jb25zdCBDb25zdGFudHMgPSB7XG4gICAgRGVmYXVsdFNjb3BlOiBcIi8uZGVmYXVsdFwiLFxuICAgIC8qKlxuICAgICAqIERlZmluZXMgY29uc3RhbnRzIGZvciB1c2Ugd2l0aCBIVFRQIGhlYWRlcnMuXG4gICAgICovXG4gICAgSGVhZGVyQ29uc3RhbnRzOiB7XG4gICAgICAgIC8qKlxuICAgICAgICAgKiBUaGUgQXV0aG9yaXphdGlvbiBoZWFkZXIuXG4gICAgICAgICAqL1xuICAgICAgICBBVVRIT1JJWkFUSU9OOiBcImF1dGhvcml6YXRpb25cIixcbiAgICB9LFxufTtcbmZ1bmN0aW9uIGlzVXVpZCh0ZXh0KSB7XG4gICAgcmV0dXJuIC9eWzAtOWEtZkEtRl17OH1cXGItWzAtOWEtZkEtRl17NH1cXGItWzAtOWEtZkEtRl17NH1cXGItWzAtOWEtZkEtRl17NH1cXGItWzAtOWEtZkEtRl17MTJ9JC8udGVzdCh0ZXh0KTtcbn1cbi8qKlxuICogRGVmaW5lcyBhIGNhbGxiYWNrIHRvIGhhbmRsZSBhdXRoIGNoYWxsZW5nZSBmb3IgU3RvcmFnZSBBUElzLlxuICogVGhpcyBpbXBsZW1lbnRzIHRoZSBiZWFyZXIgY2hhbGxlbmdlIHByb2Nlc3MgZGVzY3JpYmVkIGhlcmU6IGh0dHBzOi8vZG9jcy5taWNyb3NvZnQuY29tL3Jlc3QvYXBpL3N0b3JhZ2VzZXJ2aWNlcy9hdXRob3JpemUtd2l0aC1henVyZS1hY3RpdmUtZGlyZWN0b3J5I2JlYXJlci1jaGFsbGVuZ2VcbiAqIEhhbmRsaW5nIGhhcyBzcGVjaWZpYyBmZWF0dXJlcyBmb3Igc3RvcmFnZSB0aGF0IGRlcGFydHMgdG8gdGhlIGdlbmVyYWwgQUFEIGNoYWxsZW5nZSBkb2NzLlxuICoqL1xuY29uc3QgYXV0aG9yaXplUmVxdWVzdE9uVGVuYW50Q2hhbGxlbmdlID0gYXN5bmMgKGNoYWxsZW5nZU9wdGlvbnMpID0+IHtcbiAgICBjb25zdCByZXF1ZXN0T3B0aW9ucyA9IHJlcXVlc3RUb09wdGlvbnMoY2hhbGxlbmdlT3B0aW9ucy5yZXF1ZXN0KTtcbiAgICBjb25zdCBjaGFsbGVuZ2UgPSBnZXRDaGFsbGVuZ2UoY2hhbGxlbmdlT3B0aW9ucy5yZXNwb25zZSk7XG4gICAgaWYgKGNoYWxsZW5nZSkge1xuICAgICAgICBjb25zdCBjaGFsbGVuZ2VJbmZvID0gcGFyc2VDaGFsbGVuZ2UoY2hhbGxlbmdlKTtcbiAgICAgICAgY29uc3QgY2hhbGxlbmdlU2NvcGVzID0gYnVpbGRTY29wZXMoY2hhbGxlbmdlT3B0aW9ucywgY2hhbGxlbmdlSW5mbyk7XG4gICAgICAgIGNvbnN0IHRlbmFudElkID0gZXh0cmFjdFRlbmFudElkKGNoYWxsZW5nZUluZm8pO1xuICAgICAgICBpZiAoIXRlbmFudElkKSB7XG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgYWNjZXNzVG9rZW4gPSBhd2FpdCBjaGFsbGVuZ2VPcHRpb25zLmdldEFjY2Vzc1Rva2VuKGNoYWxsZW5nZVNjb3BlcywgT2JqZWN0LmFzc2lnbihPYmplY3QuYXNzaWduKHt9LCByZXF1ZXN0T3B0aW9ucyksIHsgdGVuYW50SWQgfSkpO1xuICAgICAgICBpZiAoIWFjY2Vzc1Rva2VuKSB7XG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgIH1cbiAgICAgICAgY2hhbGxlbmdlT3B0aW9ucy5yZXF1ZXN0LmhlYWRlcnMuc2V0KENvbnN0YW50cy5IZWFkZXJDb25zdGFudHMuQVVUSE9SSVpBVElPTiwgYEJlYXJlciAke2FjY2Vzc1Rva2VuLnRva2VufWApO1xuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG4gICAgcmV0dXJuIGZhbHNlO1xufTtcbmV4cG9ydHMuYXV0aG9yaXplUmVxdWVzdE9uVGVuYW50Q2hhbGxlbmdlID0gYXV0aG9yaXplUmVxdWVzdE9uVGVuYW50Q2hhbGxlbmdlO1xuLyoqXG4gKiBFeHRyYWN0cyB0aGUgdGVuYW50IGlkIGZyb20gdGhlIGNoYWxsZW5nZSBpbmZvcm1hdGlvblxuICogVGhlIHRlbmFudCBpZCBpcyBjb250YWluZWQgaW4gdGhlIGF1dGhvcml6YXRpb25fdXJpIGFzIHRoZSBmaXJzdFxuICogcGF0aCBwYXJ0LlxuICovXG5mdW5jdGlvbiBleHRyYWN0VGVuYW50SWQoY2hhbGxlbmdlSW5mbykge1xuICAgIGNvbnN0IHBhcnNlZEF1dGhVcmkgPSBuZXcgVVJMKGNoYWxsZW5nZUluZm8uYXV0aG9yaXphdGlvbl91cmkpO1xuICAgIGNvbnN0IHBhdGhTZWdtZW50cyA9IHBhcnNlZEF1dGhVcmkucGF0aG5hbWUuc3BsaXQoXCIvXCIpO1xuICAgIGNvbnN0IHRlbmFudElkID0gcGF0aFNlZ21lbnRzWzFdO1xuICAgIGlmICh0ZW5hbnRJZCAmJiBpc1V1aWQodGVuYW50SWQpKSB7XG4gICAgICAgIHJldHVybiB0ZW5hbnRJZDtcbiAgICB9XG4gICAgcmV0dXJuIHVuZGVmaW5lZDtcbn1cbi8qKlxuICogQnVpbGRzIHRoZSBhdXRoZW50aWNhdGlvbiBzY29wZXMgYmFzZWQgb24gdGhlIGluZm9ybWF0aW9uIHRoYXQgY29tZXMgaW4gdGhlXG4gKiBjaGFsbGVuZ2UgaW5mb3JtYXRpb24uIFNjb3BlcyB1cmwgaXMgcHJlc2VudCBpbiB0aGUgcmVzb3VyY2VfaWQsIGlmIGl0IGlzIGVtcHR5XG4gKiB3ZSBrZWVwIHVzaW5nIHRoZSBvcmlnaW5hbCBzY29wZXMuXG4gKi9cbmZ1bmN0aW9uIGJ1aWxkU2NvcGVzKGNoYWxsZW5nZU9wdGlvbnMsIGNoYWxsZW5nZUluZm8pIHtcbiAgICBpZiAoIWNoYWxsZW5nZUluZm8ucmVzb3VyY2VfaWQpIHtcbiAgICAgICAgcmV0dXJuIGNoYWxsZW5nZU9wdGlvbnMuc2NvcGVzO1xuICAgIH1cbiAgICBjb25zdCBjaGFsbGVuZ2VTY29wZXMgPSBuZXcgVVJMKGNoYWxsZW5nZUluZm8ucmVzb3VyY2VfaWQpO1xuICAgIGNoYWxsZW5nZVNjb3Blcy5wYXRobmFtZSA9IENvbnN0YW50cy5EZWZhdWx0U2NvcGU7XG4gICAgbGV0IHNjb3BlID0gY2hhbGxlbmdlU2NvcGVzLnRvU3RyaW5nKCk7XG4gICAgaWYgKHNjb3BlID09PSBcImh0dHBzOi8vZGlzay5henVyZS5jb20vLmRlZmF1bHRcIikge1xuICAgICAgICAvLyB0aGUgZXh0cmEgc2xhc2ggaXMgcmVxdWlyZWQgYnkgdGhlIHNlcnZpY2VcbiAgICAgICAgc2NvcGUgPSBcImh0dHBzOi8vZGlzay5henVyZS5jb20vLy5kZWZhdWx0XCI7XG4gICAgfVxuICAgIHJldHVybiBbc2NvcGVdO1xufVxuLyoqXG4gKiBXZSB3aWxsIHJldHJpZXZlIHRoZSBjaGFsbGVuZ2Ugb25seSBpZiB0aGUgcmVzcG9uc2Ugc3RhdHVzIGNvZGUgd2FzIDQwMSxcbiAqIGFuZCBpZiB0aGUgcmVzcG9uc2UgY29udGFpbmVkIHRoZSBoZWFkZXIgXCJXV1ctQXV0aGVudGljYXRlXCIgd2l0aCBhIG5vbi1lbXB0eSB2YWx1ZS5cbiAqL1xuZnVuY3Rpb24gZ2V0Q2hhbGxlbmdlKHJlc3BvbnNlKSB7XG4gICAgY29uc3QgY2hhbGxlbmdlID0gcmVzcG9uc2UuaGVhZGVycy5nZXQoXCJXV1ctQXV0aGVudGljYXRlXCIpO1xuICAgIGlmIChyZXNwb25zZS5zdGF0dXMgPT09IDQwMSAmJiBjaGFsbGVuZ2UpIHtcbiAgICAgICAgcmV0dXJuIGNoYWxsZW5nZTtcbiAgICB9XG4gICAgcmV0dXJuO1xufVxuLyoqXG4gKiBDb252ZXJ0czogYEJlYXJlciBhPVwiYlwiIGM9XCJkXCJgLlxuICogSW50bzogYFsgeyBhOiAnYicsIGM6ICdkJyB9XWAuXG4gKlxuICogQGludGVybmFsXG4gKi9cbmZ1bmN0aW9uIHBhcnNlQ2hhbGxlbmdlKGNoYWxsZW5nZSkge1xuICAgIGNvbnN0IGJlYXJlckNoYWxsZW5nZSA9IGNoYWxsZW5nZS5zbGljZShcIkJlYXJlciBcIi5sZW5ndGgpO1xuICAgIGNvbnN0IGNoYWxsZW5nZVBhcnRzID0gYCR7YmVhcmVyQ2hhbGxlbmdlLnRyaW0oKX0gYC5zcGxpdChcIiBcIikuZmlsdGVyKCh4KSA9PiB4KTtcbiAgICBjb25zdCBrZXlWYWx1ZVBhaXJzID0gY2hhbGxlbmdlUGFydHMubWFwKChrZXlWYWx1ZSkgPT4gKChba2V5LCB2YWx1ZV0pID0+ICh7IFtrZXldOiB2YWx1ZSB9KSkoa2V5VmFsdWUudHJpbSgpLnNwbGl0KFwiPVwiKSkpO1xuICAgIC8vIEtleS12YWx1ZSBwYWlycyB0byBwbGFpbiBvYmplY3Q6XG4gICAgcmV0dXJuIGtleVZhbHVlUGFpcnMucmVkdWNlKChhLCBiKSA9PiAoT2JqZWN0LmFzc2lnbihPYmplY3QuYXNzaWduKHt9LCBhKSwgYikpLCB7fSk7XG59XG4vKipcbiAqIEV4dHJhY3RzIHRoZSBvcHRpb25zIGZvcm0gYSBQaXBlbGluZSBSZXF1ZXN0IGZvciBsYXRlciByZS11c2VcbiAqL1xuZnVuY3Rpb24gcmVxdWVzdFRvT3B0aW9ucyhyZXF1ZXN0KSB7XG4gICAgcmV0dXJuIHtcbiAgICAgICAgYWJvcnRTaWduYWw6IHJlcXVlc3QuYWJvcnRTaWduYWwsXG4gICAgICAgIHJlcXVlc3RPcHRpb25zOiB7XG4gICAgICAgICAgICB0aW1lb3V0OiByZXF1ZXN0LnRpbWVvdXQsXG4gICAgICAgIH0sXG4gICAgICAgIHRyYWNpbmdPcHRpb25zOiByZXF1ZXN0LnRyYWNpbmdPcHRpb25zLFxuICAgIH07XG59XG4vLyMgc291cmNlTWFwcGluZ1VSTD1hdXRob3JpemVSZXF1ZXN0T25UZW5hbnRDaGFsbGVuZ2UuanMubWFwIiwKICAgICJcInVzZSBzdHJpY3RcIjtcbi8vIENvcHlyaWdodCAoYykgTWljcm9zb2Z0IENvcnBvcmF0aW9uLlxuLy8gTGljZW5zZWQgdW5kZXIgdGhlIE1JVCBsaWNlbnNlLlxuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiX19lc01vZHVsZVwiLCB7IHZhbHVlOiB0cnVlIH0pO1xuZXhwb3J0cy5hdXRob3JpemVSZXF1ZXN0T25UZW5hbnRDaGFsbGVuZ2UgPSBleHBvcnRzLmF1dGhvcml6ZVJlcXVlc3RPbkNsYWltQ2hhbGxlbmdlID0gZXhwb3J0cy5zZXJpYWxpemF0aW9uUG9saWN5TmFtZSA9IGV4cG9ydHMuc2VyaWFsaXphdGlvblBvbGljeSA9IGV4cG9ydHMuZGVzZXJpYWxpemF0aW9uUG9saWN5TmFtZSA9IGV4cG9ydHMuZGVzZXJpYWxpemF0aW9uUG9saWN5ID0gZXhwb3J0cy5YTUxfQ0hBUktFWSA9IGV4cG9ydHMuWE1MX0FUVFJLRVkgPSBleHBvcnRzLmNyZWF0ZUNsaWVudFBpcGVsaW5lID0gZXhwb3J0cy5TZXJ2aWNlQ2xpZW50ID0gZXhwb3J0cy5NYXBwZXJUeXBlTmFtZXMgPSBleHBvcnRzLmNyZWF0ZVNlcmlhbGl6ZXIgPSB2b2lkIDA7XG52YXIgc2VyaWFsaXplcl9qc18xID0gcmVxdWlyZShcIi4vc2VyaWFsaXplci5qc1wiKTtcbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcImNyZWF0ZVNlcmlhbGl6ZXJcIiwgeyBlbnVtZXJhYmxlOiB0cnVlLCBnZXQ6IGZ1bmN0aW9uICgpIHsgcmV0dXJuIHNlcmlhbGl6ZXJfanNfMS5jcmVhdGVTZXJpYWxpemVyOyB9IH0pO1xuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiTWFwcGVyVHlwZU5hbWVzXCIsIHsgZW51bWVyYWJsZTogdHJ1ZSwgZ2V0OiBmdW5jdGlvbiAoKSB7IHJldHVybiBzZXJpYWxpemVyX2pzXzEuTWFwcGVyVHlwZU5hbWVzOyB9IH0pO1xudmFyIHNlcnZpY2VDbGllbnRfanNfMSA9IHJlcXVpcmUoXCIuL3NlcnZpY2VDbGllbnQuanNcIik7XG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJTZXJ2aWNlQ2xpZW50XCIsIHsgZW51bWVyYWJsZTogdHJ1ZSwgZ2V0OiBmdW5jdGlvbiAoKSB7IHJldHVybiBzZXJ2aWNlQ2xpZW50X2pzXzEuU2VydmljZUNsaWVudDsgfSB9KTtcbnZhciBwaXBlbGluZV9qc18xID0gcmVxdWlyZShcIi4vcGlwZWxpbmUuanNcIik7XG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJjcmVhdGVDbGllbnRQaXBlbGluZVwiLCB7IGVudW1lcmFibGU6IHRydWUsIGdldDogZnVuY3Rpb24gKCkgeyByZXR1cm4gcGlwZWxpbmVfanNfMS5jcmVhdGVDbGllbnRQaXBlbGluZTsgfSB9KTtcbnZhciBpbnRlcmZhY2VzX2pzXzEgPSByZXF1aXJlKFwiLi9pbnRlcmZhY2VzLmpzXCIpO1xuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiWE1MX0FUVFJLRVlcIiwgeyBlbnVtZXJhYmxlOiB0cnVlLCBnZXQ6IGZ1bmN0aW9uICgpIHsgcmV0dXJuIGludGVyZmFjZXNfanNfMS5YTUxfQVRUUktFWTsgfSB9KTtcbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIlhNTF9DSEFSS0VZXCIsIHsgZW51bWVyYWJsZTogdHJ1ZSwgZ2V0OiBmdW5jdGlvbiAoKSB7IHJldHVybiBpbnRlcmZhY2VzX2pzXzEuWE1MX0NIQVJLRVk7IH0gfSk7XG52YXIgZGVzZXJpYWxpemF0aW9uUG9saWN5X2pzXzEgPSByZXF1aXJlKFwiLi9kZXNlcmlhbGl6YXRpb25Qb2xpY3kuanNcIik7XG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJkZXNlcmlhbGl6YXRpb25Qb2xpY3lcIiwgeyBlbnVtZXJhYmxlOiB0cnVlLCBnZXQ6IGZ1bmN0aW9uICgpIHsgcmV0dXJuIGRlc2VyaWFsaXphdGlvblBvbGljeV9qc18xLmRlc2VyaWFsaXphdGlvblBvbGljeTsgfSB9KTtcbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcImRlc2VyaWFsaXphdGlvblBvbGljeU5hbWVcIiwgeyBlbnVtZXJhYmxlOiB0cnVlLCBnZXQ6IGZ1bmN0aW9uICgpIHsgcmV0dXJuIGRlc2VyaWFsaXphdGlvblBvbGljeV9qc18xLmRlc2VyaWFsaXphdGlvblBvbGljeU5hbWU7IH0gfSk7XG52YXIgc2VyaWFsaXphdGlvblBvbGljeV9qc18xID0gcmVxdWlyZShcIi4vc2VyaWFsaXphdGlvblBvbGljeS5qc1wiKTtcbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcInNlcmlhbGl6YXRpb25Qb2xpY3lcIiwgeyBlbnVtZXJhYmxlOiB0cnVlLCBnZXQ6IGZ1bmN0aW9uICgpIHsgcmV0dXJuIHNlcmlhbGl6YXRpb25Qb2xpY3lfanNfMS5zZXJpYWxpemF0aW9uUG9saWN5OyB9IH0pO1xuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwic2VyaWFsaXphdGlvblBvbGljeU5hbWVcIiwgeyBlbnVtZXJhYmxlOiB0cnVlLCBnZXQ6IGZ1bmN0aW9uICgpIHsgcmV0dXJuIHNlcmlhbGl6YXRpb25Qb2xpY3lfanNfMS5zZXJpYWxpemF0aW9uUG9saWN5TmFtZTsgfSB9KTtcbnZhciBhdXRob3JpemVSZXF1ZXN0T25DbGFpbUNoYWxsZW5nZV9qc18xID0gcmVxdWlyZShcIi4vYXV0aG9yaXplUmVxdWVzdE9uQ2xhaW1DaGFsbGVuZ2UuanNcIik7XG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJhdXRob3JpemVSZXF1ZXN0T25DbGFpbUNoYWxsZW5nZVwiLCB7IGVudW1lcmFibGU6IHRydWUsIGdldDogZnVuY3Rpb24gKCkgeyByZXR1cm4gYXV0aG9yaXplUmVxdWVzdE9uQ2xhaW1DaGFsbGVuZ2VfanNfMS5hdXRob3JpemVSZXF1ZXN0T25DbGFpbUNoYWxsZW5nZTsgfSB9KTtcbnZhciBhdXRob3JpemVSZXF1ZXN0T25UZW5hbnRDaGFsbGVuZ2VfanNfMSA9IHJlcXVpcmUoXCIuL2F1dGhvcml6ZVJlcXVlc3RPblRlbmFudENoYWxsZW5nZS5qc1wiKTtcbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcImF1dGhvcml6ZVJlcXVlc3RPblRlbmFudENoYWxsZW5nZVwiLCB7IGVudW1lcmFibGU6IHRydWUsIGdldDogZnVuY3Rpb24gKCkgeyByZXR1cm4gYXV0aG9yaXplUmVxdWVzdE9uVGVuYW50Q2hhbGxlbmdlX2pzXzEuYXV0aG9yaXplUmVxdWVzdE9uVGVuYW50Q2hhbGxlbmdlOyB9IH0pO1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9aW5kZXguanMubWFwIiwKICAgICJcInVzZSBzdHJpY3RcIjtcbi8vIENvcHlyaWdodCAoYykgTWljcm9zb2Z0IENvcnBvcmF0aW9uLlxuLy8gTGljZW5zZWQgdW5kZXIgdGhlIE1JVCBsaWNlbnNlLlxuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiX19lc01vZHVsZVwiLCB7IHZhbHVlOiB0cnVlIH0pO1xuZXhwb3J0cy5IdHRwSGVhZGVycyA9IGV4cG9ydHMudG9IdHRwSGVhZGVyc0xpa2UgPSBleHBvcnRzLnRvV2ViUmVzb3VyY2VMaWtlID0gZXhwb3J0cy50b1BpcGVsaW5lUmVxdWVzdCA9IHZvaWQgMDtcbmNvbnN0IGNvcmVfcmVzdF9waXBlbGluZV8xID0gcmVxdWlyZShcIkBhenVyZS9jb3JlLXJlc3QtcGlwZWxpbmVcIik7XG4vLyBXZSB1c2UgYSBjdXN0b20gc3ltYm9sIHRvIGNhY2hlIGEgcmVmZXJlbmNlIHRvIHRoZSBvcmlnaW5hbCByZXF1ZXN0IHdpdGhvdXRcbi8vIGV4cG9zaW5nIGl0IG9uIHRoZSBwdWJsaWMgaW50ZXJmYWNlLlxuY29uc3Qgb3JpZ2luYWxSZXF1ZXN0U3ltYm9sID0gU3ltYm9sKFwiT3JpZ2luYWwgUGlwZWxpbmVSZXF1ZXN0XCIpO1xuLy8gU3ltYm9sLmZvcigpIHdpbGwgcmV0dXJuIHRoZSBzYW1lIHN5bWJvbCBpZiBpdCdzIGFscmVhZHkgYmVlbiBjcmVhdGVkXG4vLyBUaGlzIHBhcnRpY3VsYXIgb25lIGlzIHVzZWQgaW4gY29yZS1jbGllbnQgdG8gaGFuZGxlIHRoZSBjYXNlIG9mIHdoZW4gYSByZXF1ZXN0IGlzXG4vLyBjbG9uZWQgYnV0IHdlIG5lZWQgdG8gcmV0cmlldmUgdGhlIE9wZXJhdGlvblNwZWMgYW5kIE9wZXJhdGlvbkFyZ3VtZW50cyBmcm9tIHRoZVxuLy8gb3JpZ2luYWwgcmVxdWVzdC5cbmNvbnN0IG9yaWdpbmFsQ2xpZW50UmVxdWVzdFN5bWJvbCA9IFN5bWJvbC5mb3IoXCJAYXp1cmUvY29yZS1jbGllbnQgb3JpZ2luYWwgcmVxdWVzdFwiKTtcbmZ1bmN0aW9uIHRvUGlwZWxpbmVSZXF1ZXN0KHdlYlJlc291cmNlLCBvcHRpb25zID0ge30pIHtcbiAgICBjb25zdCBjb21wYXRXZWJSZXNvdXJjZSA9IHdlYlJlc291cmNlO1xuICAgIGNvbnN0IHJlcXVlc3QgPSBjb21wYXRXZWJSZXNvdXJjZVtvcmlnaW5hbFJlcXVlc3RTeW1ib2xdO1xuICAgIGNvbnN0IGhlYWRlcnMgPSAoMCwgY29yZV9yZXN0X3BpcGVsaW5lXzEuY3JlYXRlSHR0cEhlYWRlcnMpKHdlYlJlc291cmNlLmhlYWRlcnMudG9Kc29uKHsgcHJlc2VydmVDYXNlOiB0cnVlIH0pKTtcbiAgICBpZiAocmVxdWVzdCkge1xuICAgICAgICByZXF1ZXN0LmhlYWRlcnMgPSBoZWFkZXJzO1xuICAgICAgICByZXR1cm4gcmVxdWVzdDtcbiAgICB9XG4gICAgZWxzZSB7XG4gICAgICAgIGNvbnN0IG5ld1JlcXVlc3QgPSAoMCwgY29yZV9yZXN0X3BpcGVsaW5lXzEuY3JlYXRlUGlwZWxpbmVSZXF1ZXN0KSh7XG4gICAgICAgICAgICB1cmw6IHdlYlJlc291cmNlLnVybCxcbiAgICAgICAgICAgIG1ldGhvZDogd2ViUmVzb3VyY2UubWV0aG9kLFxuICAgICAgICAgICAgaGVhZGVycyxcbiAgICAgICAgICAgIHdpdGhDcmVkZW50aWFsczogd2ViUmVzb3VyY2Uud2l0aENyZWRlbnRpYWxzLFxuICAgICAgICAgICAgdGltZW91dDogd2ViUmVzb3VyY2UudGltZW91dCxcbiAgICAgICAgICAgIHJlcXVlc3RJZDogd2ViUmVzb3VyY2UucmVxdWVzdElkLFxuICAgICAgICAgICAgYWJvcnRTaWduYWw6IHdlYlJlc291cmNlLmFib3J0U2lnbmFsLFxuICAgICAgICAgICAgYm9keTogd2ViUmVzb3VyY2UuYm9keSxcbiAgICAgICAgICAgIGZvcm1EYXRhOiB3ZWJSZXNvdXJjZS5mb3JtRGF0YSxcbiAgICAgICAgICAgIGRpc2FibGVLZWVwQWxpdmU6ICEhd2ViUmVzb3VyY2Uua2VlcEFsaXZlLFxuICAgICAgICAgICAgb25Eb3dubG9hZFByb2dyZXNzOiB3ZWJSZXNvdXJjZS5vbkRvd25sb2FkUHJvZ3Jlc3MsXG4gICAgICAgICAgICBvblVwbG9hZFByb2dyZXNzOiB3ZWJSZXNvdXJjZS5vblVwbG9hZFByb2dyZXNzLFxuICAgICAgICAgICAgcHJveHlTZXR0aW5nczogd2ViUmVzb3VyY2UucHJveHlTZXR0aW5ncyxcbiAgICAgICAgICAgIHN0cmVhbVJlc3BvbnNlU3RhdHVzQ29kZXM6IHdlYlJlc291cmNlLnN0cmVhbVJlc3BvbnNlU3RhdHVzQ29kZXMsXG4gICAgICAgIH0pO1xuICAgICAgICBpZiAob3B0aW9ucy5vcmlnaW5hbFJlcXVlc3QpIHtcbiAgICAgICAgICAgIG5ld1JlcXVlc3Rbb3JpZ2luYWxDbGllbnRSZXF1ZXN0U3ltYm9sXSA9XG4gICAgICAgICAgICAgICAgb3B0aW9ucy5vcmlnaW5hbFJlcXVlc3Q7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIG5ld1JlcXVlc3Q7XG4gICAgfVxufVxuZXhwb3J0cy50b1BpcGVsaW5lUmVxdWVzdCA9IHRvUGlwZWxpbmVSZXF1ZXN0O1xuZnVuY3Rpb24gdG9XZWJSZXNvdXJjZUxpa2UocmVxdWVzdCwgb3B0aW9ucykge1xuICAgIHZhciBfYTtcbiAgICBjb25zdCBvcmlnaW5hbFJlcXVlc3QgPSAoX2EgPSBvcHRpb25zID09PSBudWxsIHx8IG9wdGlvbnMgPT09IHZvaWQgMCA/IHZvaWQgMCA6IG9wdGlvbnMub3JpZ2luYWxSZXF1ZXN0KSAhPT0gbnVsbCAmJiBfYSAhPT0gdm9pZCAwID8gX2EgOiByZXF1ZXN0O1xuICAgIGNvbnN0IHdlYlJlc291cmNlID0ge1xuICAgICAgICB1cmw6IHJlcXVlc3QudXJsLFxuICAgICAgICBtZXRob2Q6IHJlcXVlc3QubWV0aG9kLFxuICAgICAgICBoZWFkZXJzOiB0b0h0dHBIZWFkZXJzTGlrZShyZXF1ZXN0LmhlYWRlcnMpLFxuICAgICAgICB3aXRoQ3JlZGVudGlhbHM6IHJlcXVlc3Qud2l0aENyZWRlbnRpYWxzLFxuICAgICAgICB0aW1lb3V0OiByZXF1ZXN0LnRpbWVvdXQsXG4gICAgICAgIHJlcXVlc3RJZDogcmVxdWVzdC5oZWFkZXJzLmdldChcIngtbXMtY2xpZW50LXJlcXVlc3QtaWRcIikgfHwgcmVxdWVzdC5yZXF1ZXN0SWQsXG4gICAgICAgIGFib3J0U2lnbmFsOiByZXF1ZXN0LmFib3J0U2lnbmFsLFxuICAgICAgICBib2R5OiByZXF1ZXN0LmJvZHksXG4gICAgICAgIGZvcm1EYXRhOiByZXF1ZXN0LmZvcm1EYXRhLFxuICAgICAgICBrZWVwQWxpdmU6ICEhcmVxdWVzdC5kaXNhYmxlS2VlcEFsaXZlLFxuICAgICAgICBvbkRvd25sb2FkUHJvZ3Jlc3M6IHJlcXVlc3Qub25Eb3dubG9hZFByb2dyZXNzLFxuICAgICAgICBvblVwbG9hZFByb2dyZXNzOiByZXF1ZXN0Lm9uVXBsb2FkUHJvZ3Jlc3MsXG4gICAgICAgIHByb3h5U2V0dGluZ3M6IHJlcXVlc3QucHJveHlTZXR0aW5ncyxcbiAgICAgICAgc3RyZWFtUmVzcG9uc2VTdGF0dXNDb2RlczogcmVxdWVzdC5zdHJlYW1SZXNwb25zZVN0YXR1c0NvZGVzLFxuICAgICAgICBjbG9uZSgpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihcIkNhbm5vdCBjbG9uZSBhIG5vbi1wcm94aWVkIFdlYlJlc291cmNlTGlrZVwiKTtcbiAgICAgICAgfSxcbiAgICAgICAgcHJlcGFyZSgpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihcIldlYlJlc291cmNlTGlrZS5wcmVwYXJlKCkgaXMgbm90IHN1cHBvcnRlZCBieSBAYXp1cmUvY29yZS1odHRwLWNvbXBhdFwiKTtcbiAgICAgICAgfSxcbiAgICAgICAgdmFsaWRhdGVSZXF1ZXN0UHJvcGVydGllcygpIHtcbiAgICAgICAgICAgIC8qKiBkbyBub3RoaW5nICovXG4gICAgICAgIH0sXG4gICAgfTtcbiAgICBpZiAob3B0aW9ucyA9PT0gbnVsbCB8fCBvcHRpb25zID09PSB2b2lkIDAgPyB2b2lkIDAgOiBvcHRpb25zLmNyZWF0ZVByb3h5KSB7XG4gICAgICAgIHJldHVybiBuZXcgUHJveHkod2ViUmVzb3VyY2UsIHtcbiAgICAgICAgICAgIGdldCh0YXJnZXQsIHByb3AsIHJlY2VpdmVyKSB7XG4gICAgICAgICAgICAgICAgaWYgKHByb3AgPT09IG9yaWdpbmFsUmVxdWVzdFN5bWJvbCkge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gcmVxdWVzdDtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgZWxzZSBpZiAocHJvcCA9PT0gXCJjbG9uZVwiKSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiAoKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gdG9XZWJSZXNvdXJjZUxpa2UodG9QaXBlbGluZVJlcXVlc3Qod2ViUmVzb3VyY2UsIHsgb3JpZ2luYWxSZXF1ZXN0IH0pLCB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY3JlYXRlUHJveHk6IHRydWUsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgb3JpZ2luYWxSZXF1ZXN0LFxuICAgICAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgICAgIH07XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHJldHVybiBSZWZsZWN0LmdldCh0YXJnZXQsIHByb3AsIHJlY2VpdmVyKTtcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBzZXQodGFyZ2V0LCBwcm9wLCB2YWx1ZSwgcmVjZWl2ZXIpIHtcbiAgICAgICAgICAgICAgICBpZiAocHJvcCA9PT0gXCJrZWVwQWxpdmVcIikge1xuICAgICAgICAgICAgICAgICAgICByZXF1ZXN0LmRpc2FibGVLZWVwQWxpdmUgPSAhdmFsdWU7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGNvbnN0IHBhc3NUaHJvdWdoUHJvcHMgPSBbXG4gICAgICAgICAgICAgICAgICAgIFwidXJsXCIsXG4gICAgICAgICAgICAgICAgICAgIFwibWV0aG9kXCIsXG4gICAgICAgICAgICAgICAgICAgIFwid2l0aENyZWRlbnRpYWxzXCIsXG4gICAgICAgICAgICAgICAgICAgIFwidGltZW91dFwiLFxuICAgICAgICAgICAgICAgICAgICBcInJlcXVlc3RJZFwiLFxuICAgICAgICAgICAgICAgICAgICBcImFib3J0U2lnbmFsXCIsXG4gICAgICAgICAgICAgICAgICAgIFwiYm9keVwiLFxuICAgICAgICAgICAgICAgICAgICBcImZvcm1EYXRhXCIsXG4gICAgICAgICAgICAgICAgICAgIFwib25Eb3dubG9hZFByb2dyZXNzXCIsXG4gICAgICAgICAgICAgICAgICAgIFwib25VcGxvYWRQcm9ncmVzc1wiLFxuICAgICAgICAgICAgICAgICAgICBcInByb3h5U2V0dGluZ3NcIixcbiAgICAgICAgICAgICAgICAgICAgXCJzdHJlYW1SZXNwb25zZVN0YXR1c0NvZGVzXCIsXG4gICAgICAgICAgICAgICAgXTtcbiAgICAgICAgICAgICAgICBpZiAodHlwZW9mIHByb3AgPT09IFwic3RyaW5nXCIgJiYgcGFzc1Rocm91Z2hQcm9wcy5pbmNsdWRlcyhwcm9wKSkge1xuICAgICAgICAgICAgICAgICAgICByZXF1ZXN0W3Byb3BdID0gdmFsdWU7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHJldHVybiBSZWZsZWN0LnNldCh0YXJnZXQsIHByb3AsIHZhbHVlLCByZWNlaXZlcik7XG4gICAgICAgICAgICB9LFxuICAgICAgICB9KTtcbiAgICB9XG4gICAgZWxzZSB7XG4gICAgICAgIHJldHVybiB3ZWJSZXNvdXJjZTtcbiAgICB9XG59XG5leHBvcnRzLnRvV2ViUmVzb3VyY2VMaWtlID0gdG9XZWJSZXNvdXJjZUxpa2U7XG4vKipcbiAqIENvbnZlcnRzIEh0dHBIZWFkZXJzIGZyb20gY29yZS1yZXN0LXBpcGVsaW5lIHRvIGxvb2sgbGlrZVxuICogSHR0cEhlYWRlcnMgZnJvbSBjb3JlLWh0dHAuXG4gKiBAcGFyYW0gaGVhZGVycyAtIEh0dHBIZWFkZXJzIGZyb20gY29yZS1yZXN0LXBpcGVsaW5lXG4gKiBAcmV0dXJucyBIdHRwSGVhZGVycyBhcyB0aGV5IGxvb2tlZCBpbiBjb3JlLWh0dHBcbiAqL1xuZnVuY3Rpb24gdG9IdHRwSGVhZGVyc0xpa2UoaGVhZGVycykge1xuICAgIHJldHVybiBuZXcgSHR0cEhlYWRlcnMoaGVhZGVycy50b0pTT04oeyBwcmVzZXJ2ZUNhc2U6IHRydWUgfSkpO1xufVxuZXhwb3J0cy50b0h0dHBIZWFkZXJzTGlrZSA9IHRvSHR0cEhlYWRlcnNMaWtlO1xuLyoqXG4gKiBBIGNvbGxlY3Rpb24gb2YgSHR0cEhlYWRlcnMgdGhhdCBjYW4gYmUgc2VudCB3aXRoIGEgSFRUUCByZXF1ZXN0LlxuICovXG5mdW5jdGlvbiBnZXRIZWFkZXJLZXkoaGVhZGVyTmFtZSkge1xuICAgIHJldHVybiBoZWFkZXJOYW1lLnRvTG93ZXJDYXNlKCk7XG59XG4vKipcbiAqIEEgY29sbGVjdGlvbiBvZiBIVFRQIGhlYWRlciBrZXkvdmFsdWUgcGFpcnMuXG4gKi9cbmNsYXNzIEh0dHBIZWFkZXJzIHtcbiAgICBjb25zdHJ1Y3RvcihyYXdIZWFkZXJzKSB7XG4gICAgICAgIHRoaXMuX2hlYWRlcnNNYXAgPSB7fTtcbiAgICAgICAgaWYgKHJhd0hlYWRlcnMpIHtcbiAgICAgICAgICAgIGZvciAoY29uc3QgaGVhZGVyTmFtZSBpbiByYXdIZWFkZXJzKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5zZXQoaGVhZGVyTmFtZSwgcmF3SGVhZGVyc1toZWFkZXJOYW1lXSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG4gICAgLyoqXG4gICAgICogU2V0IGEgaGVhZGVyIGluIHRoaXMgY29sbGVjdGlvbiB3aXRoIHRoZSBwcm92aWRlZCBuYW1lIGFuZCB2YWx1ZS4gVGhlIG5hbWUgaXNcbiAgICAgKiBjYXNlLWluc2Vuc2l0aXZlLlxuICAgICAqIEBwYXJhbSBoZWFkZXJOYW1lIC0gVGhlIG5hbWUgb2YgdGhlIGhlYWRlciB0byBzZXQuIFRoaXMgdmFsdWUgaXMgY2FzZS1pbnNlbnNpdGl2ZS5cbiAgICAgKiBAcGFyYW0gaGVhZGVyVmFsdWUgLSBUaGUgdmFsdWUgb2YgdGhlIGhlYWRlciB0byBzZXQuXG4gICAgICovXG4gICAgc2V0KGhlYWRlck5hbWUsIGhlYWRlclZhbHVlKSB7XG4gICAgICAgIHRoaXMuX2hlYWRlcnNNYXBbZ2V0SGVhZGVyS2V5KGhlYWRlck5hbWUpXSA9IHtcbiAgICAgICAgICAgIG5hbWU6IGhlYWRlck5hbWUsXG4gICAgICAgICAgICB2YWx1ZTogaGVhZGVyVmFsdWUudG9TdHJpbmcoKSxcbiAgICAgICAgfTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogR2V0IHRoZSBoZWFkZXIgdmFsdWUgZm9yIHRoZSBwcm92aWRlZCBoZWFkZXIgbmFtZSwgb3IgdW5kZWZpbmVkIGlmIG5vIGhlYWRlciBleGlzdHMgaW4gdGhpc1xuICAgICAqIGNvbGxlY3Rpb24gd2l0aCB0aGUgcHJvdmlkZWQgbmFtZS5cbiAgICAgKiBAcGFyYW0gaGVhZGVyTmFtZSAtIFRoZSBuYW1lIG9mIHRoZSBoZWFkZXIuXG4gICAgICovXG4gICAgZ2V0KGhlYWRlck5hbWUpIHtcbiAgICAgICAgY29uc3QgaGVhZGVyID0gdGhpcy5faGVhZGVyc01hcFtnZXRIZWFkZXJLZXkoaGVhZGVyTmFtZSldO1xuICAgICAgICByZXR1cm4gIWhlYWRlciA/IHVuZGVmaW5lZCA6IGhlYWRlci52YWx1ZTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogR2V0IHdoZXRoZXIgb3Igbm90IHRoaXMgaGVhZGVyIGNvbGxlY3Rpb24gY29udGFpbnMgYSBoZWFkZXIgZW50cnkgZm9yIHRoZSBwcm92aWRlZCBoZWFkZXIgbmFtZS5cbiAgICAgKi9cbiAgICBjb250YWlucyhoZWFkZXJOYW1lKSB7XG4gICAgICAgIHJldHVybiAhIXRoaXMuX2hlYWRlcnNNYXBbZ2V0SGVhZGVyS2V5KGhlYWRlck5hbWUpXTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogUmVtb3ZlIHRoZSBoZWFkZXIgd2l0aCB0aGUgcHJvdmlkZWQgaGVhZGVyTmFtZS4gUmV0dXJuIHdoZXRoZXIgb3Igbm90IHRoZSBoZWFkZXIgZXhpc3RlZCBhbmRcbiAgICAgKiB3YXMgcmVtb3ZlZC5cbiAgICAgKiBAcGFyYW0gaGVhZGVyTmFtZSAtIFRoZSBuYW1lIG9mIHRoZSBoZWFkZXIgdG8gcmVtb3ZlLlxuICAgICAqL1xuICAgIHJlbW92ZShoZWFkZXJOYW1lKSB7XG4gICAgICAgIGNvbnN0IHJlc3VsdCA9IHRoaXMuY29udGFpbnMoaGVhZGVyTmFtZSk7XG4gICAgICAgIGRlbGV0ZSB0aGlzLl9oZWFkZXJzTWFwW2dldEhlYWRlcktleShoZWFkZXJOYW1lKV07XG4gICAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIEdldCB0aGUgaGVhZGVycyB0aGF0IGFyZSBjb250YWluZWQgdGhpcyBjb2xsZWN0aW9uIGFzIGFuIG9iamVjdC5cbiAgICAgKi9cbiAgICByYXdIZWFkZXJzKCkge1xuICAgICAgICByZXR1cm4gdGhpcy50b0pzb24oeyBwcmVzZXJ2ZUNhc2U6IHRydWUgfSk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIEdldCB0aGUgaGVhZGVycyB0aGF0IGFyZSBjb250YWluZWQgaW4gdGhpcyBjb2xsZWN0aW9uIGFzIGFuIGFycmF5LlxuICAgICAqL1xuICAgIGhlYWRlcnNBcnJheSgpIHtcbiAgICAgICAgY29uc3QgaGVhZGVycyA9IFtdO1xuICAgICAgICBmb3IgKGNvbnN0IGhlYWRlcktleSBpbiB0aGlzLl9oZWFkZXJzTWFwKSB7XG4gICAgICAgICAgICBoZWFkZXJzLnB1c2godGhpcy5faGVhZGVyc01hcFtoZWFkZXJLZXldKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gaGVhZGVycztcbiAgICB9XG4gICAgLyoqXG4gICAgICogR2V0IHRoZSBoZWFkZXIgbmFtZXMgdGhhdCBhcmUgY29udGFpbmVkIGluIHRoaXMgY29sbGVjdGlvbi5cbiAgICAgKi9cbiAgICBoZWFkZXJOYW1lcygpIHtcbiAgICAgICAgY29uc3QgaGVhZGVyTmFtZXMgPSBbXTtcbiAgICAgICAgY29uc3QgaGVhZGVycyA9IHRoaXMuaGVhZGVyc0FycmF5KCk7XG4gICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgaGVhZGVycy5sZW5ndGg7ICsraSkge1xuICAgICAgICAgICAgaGVhZGVyTmFtZXMucHVzaChoZWFkZXJzW2ldLm5hbWUpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBoZWFkZXJOYW1lcztcbiAgICB9XG4gICAgLyoqXG4gICAgICogR2V0IHRoZSBoZWFkZXIgdmFsdWVzIHRoYXQgYXJlIGNvbnRhaW5lZCBpbiB0aGlzIGNvbGxlY3Rpb24uXG4gICAgICovXG4gICAgaGVhZGVyVmFsdWVzKCkge1xuICAgICAgICBjb25zdCBoZWFkZXJWYWx1ZXMgPSBbXTtcbiAgICAgICAgY29uc3QgaGVhZGVycyA9IHRoaXMuaGVhZGVyc0FycmF5KCk7XG4gICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgaGVhZGVycy5sZW5ndGg7ICsraSkge1xuICAgICAgICAgICAgaGVhZGVyVmFsdWVzLnB1c2goaGVhZGVyc1tpXS52YWx1ZSk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGhlYWRlclZhbHVlcztcbiAgICB9XG4gICAgLyoqXG4gICAgICogR2V0IHRoZSBKU09OIG9iamVjdCByZXByZXNlbnRhdGlvbiBvZiB0aGlzIEhUVFAgaGVhZGVyIGNvbGxlY3Rpb24uXG4gICAgICovXG4gICAgdG9Kc29uKG9wdGlvbnMgPSB7fSkge1xuICAgICAgICBjb25zdCByZXN1bHQgPSB7fTtcbiAgICAgICAgaWYgKG9wdGlvbnMucHJlc2VydmVDYXNlKSB7XG4gICAgICAgICAgICBmb3IgKGNvbnN0IGhlYWRlcktleSBpbiB0aGlzLl9oZWFkZXJzTWFwKSB7XG4gICAgICAgICAgICAgICAgY29uc3QgaGVhZGVyID0gdGhpcy5faGVhZGVyc01hcFtoZWFkZXJLZXldO1xuICAgICAgICAgICAgICAgIHJlc3VsdFtoZWFkZXIubmFtZV0gPSBoZWFkZXIudmFsdWU7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICBmb3IgKGNvbnN0IGhlYWRlcktleSBpbiB0aGlzLl9oZWFkZXJzTWFwKSB7XG4gICAgICAgICAgICAgICAgY29uc3QgaGVhZGVyID0gdGhpcy5faGVhZGVyc01hcFtoZWFkZXJLZXldO1xuICAgICAgICAgICAgICAgIHJlc3VsdFtnZXRIZWFkZXJLZXkoaGVhZGVyLm5hbWUpXSA9IGhlYWRlci52YWx1ZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gcmVzdWx0O1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBHZXQgdGhlIHN0cmluZyByZXByZXNlbnRhdGlvbiBvZiB0aGlzIEhUVFAgaGVhZGVyIGNvbGxlY3Rpb24uXG4gICAgICovXG4gICAgdG9TdHJpbmcoKSB7XG4gICAgICAgIHJldHVybiBKU09OLnN0cmluZ2lmeSh0aGlzLnRvSnNvbih7IHByZXNlcnZlQ2FzZTogdHJ1ZSB9KSk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIENyZWF0ZSBhIGRlZXAgY2xvbmUvY29weSBvZiB0aGlzIEh0dHBIZWFkZXJzIGNvbGxlY3Rpb24uXG4gICAgICovXG4gICAgY2xvbmUoKSB7XG4gICAgICAgIGNvbnN0IHJlc3VsdFByZXNlcnZpbmdDYXNpbmcgPSB7fTtcbiAgICAgICAgZm9yIChjb25zdCBoZWFkZXJLZXkgaW4gdGhpcy5faGVhZGVyc01hcCkge1xuICAgICAgICAgICAgY29uc3QgaGVhZGVyID0gdGhpcy5faGVhZGVyc01hcFtoZWFkZXJLZXldO1xuICAgICAgICAgICAgcmVzdWx0UHJlc2VydmluZ0Nhc2luZ1toZWFkZXIubmFtZV0gPSBoZWFkZXIudmFsdWU7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIG5ldyBIdHRwSGVhZGVycyhyZXN1bHRQcmVzZXJ2aW5nQ2FzaW5nKTtcbiAgICB9XG59XG5leHBvcnRzLkh0dHBIZWFkZXJzID0gSHR0cEhlYWRlcnM7XG4vLyMgc291cmNlTWFwcGluZ1VSTD11dGlsLmpzLm1hcCIsCiAgICAiXCJ1c2Ugc3RyaWN0XCI7XG4vLyBDb3B5cmlnaHQgKGMpIE1pY3Jvc29mdCBDb3Jwb3JhdGlvbi5cbi8vIExpY2Vuc2VkIHVuZGVyIHRoZSBNSVQgbGljZW5zZS5cbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIl9fZXNNb2R1bGVcIiwgeyB2YWx1ZTogdHJ1ZSB9KTtcbmV4cG9ydHMudG9QaXBlbGluZVJlc3BvbnNlID0gZXhwb3J0cy50b0NvbXBhdFJlc3BvbnNlID0gdm9pZCAwO1xuY29uc3QgY29yZV9yZXN0X3BpcGVsaW5lXzEgPSByZXF1aXJlKFwiQGF6dXJlL2NvcmUtcmVzdC1waXBlbGluZVwiKTtcbmNvbnN0IHV0aWxfanNfMSA9IHJlcXVpcmUoXCIuL3V0aWwuanNcIik7XG5jb25zdCBvcmlnaW5hbFJlc3BvbnNlID0gU3ltYm9sKFwiT3JpZ2luYWwgRnVsbE9wZXJhdGlvblJlc3BvbnNlXCIpO1xuLyoqXG4gKiBBIGhlbHBlciB0byBjb252ZXJ0IHJlc3BvbnNlIG9iamVjdHMgZnJvbSB0aGUgbmV3IHBpcGVsaW5lIGJhY2sgdG8gdGhlIG9sZCBvbmUuXG4gKiBAcGFyYW0gcmVzcG9uc2UgLSBBIHJlc3BvbnNlIG9iamVjdCBmcm9tIGNvcmUtY2xpZW50LlxuICogQHJldHVybnMgQSByZXNwb25zZSBjb21wYXRpYmxlIHdpdGggYEh0dHBPcGVyYXRpb25SZXNwb25zZWAgZnJvbSBjb3JlLWh0dHAuXG4gKi9cbmZ1bmN0aW9uIHRvQ29tcGF0UmVzcG9uc2UocmVzcG9uc2UsIG9wdGlvbnMpIHtcbiAgICBsZXQgcmVxdWVzdCA9ICgwLCB1dGlsX2pzXzEudG9XZWJSZXNvdXJjZUxpa2UpKHJlc3BvbnNlLnJlcXVlc3QpO1xuICAgIGxldCBoZWFkZXJzID0gKDAsIHV0aWxfanNfMS50b0h0dHBIZWFkZXJzTGlrZSkocmVzcG9uc2UuaGVhZGVycyk7XG4gICAgaWYgKG9wdGlvbnMgPT09IG51bGwgfHwgb3B0aW9ucyA9PT0gdm9pZCAwID8gdm9pZCAwIDogb3B0aW9ucy5jcmVhdGVQcm94eSkge1xuICAgICAgICByZXR1cm4gbmV3IFByb3h5KHJlc3BvbnNlLCB7XG4gICAgICAgICAgICBnZXQodGFyZ2V0LCBwcm9wLCByZWNlaXZlcikge1xuICAgICAgICAgICAgICAgIGlmIChwcm9wID09PSBcImhlYWRlcnNcIikge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gaGVhZGVycztcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgZWxzZSBpZiAocHJvcCA9PT0gXCJyZXF1ZXN0XCIpIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHJlcXVlc3Q7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGVsc2UgaWYgKHByb3AgPT09IG9yaWdpbmFsUmVzcG9uc2UpIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHJlc3BvbnNlO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICByZXR1cm4gUmVmbGVjdC5nZXQodGFyZ2V0LCBwcm9wLCByZWNlaXZlcik7XG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgc2V0KHRhcmdldCwgcHJvcCwgdmFsdWUsIHJlY2VpdmVyKSB7XG4gICAgICAgICAgICAgICAgaWYgKHByb3AgPT09IFwiaGVhZGVyc1wiKSB7XG4gICAgICAgICAgICAgICAgICAgIGhlYWRlcnMgPSB2YWx1ZTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgZWxzZSBpZiAocHJvcCA9PT0gXCJyZXF1ZXN0XCIpIHtcbiAgICAgICAgICAgICAgICAgICAgcmVxdWVzdCA9IHZhbHVlO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICByZXR1cm4gUmVmbGVjdC5zZXQodGFyZ2V0LCBwcm9wLCB2YWx1ZSwgcmVjZWl2ZXIpO1xuICAgICAgICAgICAgfSxcbiAgICAgICAgfSk7XG4gICAgfVxuICAgIGVsc2Uge1xuICAgICAgICByZXR1cm4gT2JqZWN0LmFzc2lnbihPYmplY3QuYXNzaWduKHt9LCByZXNwb25zZSksIHsgcmVxdWVzdCxcbiAgICAgICAgICAgIGhlYWRlcnMgfSk7XG4gICAgfVxufVxuZXhwb3J0cy50b0NvbXBhdFJlc3BvbnNlID0gdG9Db21wYXRSZXNwb25zZTtcbi8qKlxuICogQSBoZWxwZXIgdG8gY29udmVydCBiYWNrIHRvIGEgUGlwZWxpbmVSZXNwb25zZVxuICogQHBhcmFtIGNvbXBhdFJlc3BvbnNlIC0gQSByZXNwb25zZSBjb21wYXRpYmxlIHdpdGggYEh0dHBPcGVyYXRpb25SZXNwb25zZWAgZnJvbSBjb3JlLWh0dHAuXG4gKi9cbmZ1bmN0aW9uIHRvUGlwZWxpbmVSZXNwb25zZShjb21wYXRSZXNwb25zZSkge1xuICAgIGNvbnN0IGV4dGVuZGVkQ29tcGF0UmVzcG9uc2UgPSBjb21wYXRSZXNwb25zZTtcbiAgICBjb25zdCByZXNwb25zZSA9IGV4dGVuZGVkQ29tcGF0UmVzcG9uc2Vbb3JpZ2luYWxSZXNwb25zZV07XG4gICAgY29uc3QgaGVhZGVycyA9ICgwLCBjb3JlX3Jlc3RfcGlwZWxpbmVfMS5jcmVhdGVIdHRwSGVhZGVycykoY29tcGF0UmVzcG9uc2UuaGVhZGVycy50b0pzb24oeyBwcmVzZXJ2ZUNhc2U6IHRydWUgfSkpO1xuICAgIGlmIChyZXNwb25zZSkge1xuICAgICAgICByZXNwb25zZS5oZWFkZXJzID0gaGVhZGVycztcbiAgICAgICAgcmV0dXJuIHJlc3BvbnNlO1xuICAgIH1cbiAgICBlbHNlIHtcbiAgICAgICAgcmV0dXJuIE9iamVjdC5hc3NpZ24oT2JqZWN0LmFzc2lnbih7fSwgY29tcGF0UmVzcG9uc2UpLCB7IGhlYWRlcnMsIHJlcXVlc3Q6ICgwLCB1dGlsX2pzXzEudG9QaXBlbGluZVJlcXVlc3QpKGNvbXBhdFJlc3BvbnNlLnJlcXVlc3QpIH0pO1xuICAgIH1cbn1cbmV4cG9ydHMudG9QaXBlbGluZVJlc3BvbnNlID0gdG9QaXBlbGluZVJlc3BvbnNlO1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9cmVzcG9uc2UuanMubWFwIiwKICAgICJcInVzZSBzdHJpY3RcIjtcbi8vIENvcHlyaWdodCAoYykgTWljcm9zb2Z0IENvcnBvcmF0aW9uLlxuLy8gTGljZW5zZWQgdW5kZXIgdGhlIE1JVCBsaWNlbnNlLlxuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiX19lc01vZHVsZVwiLCB7IHZhbHVlOiB0cnVlIH0pO1xuZXhwb3J0cy5FeHRlbmRlZFNlcnZpY2VDbGllbnQgPSB2b2lkIDA7XG5jb25zdCBkaXNhYmxlS2VlcEFsaXZlUG9saWN5X2pzXzEgPSByZXF1aXJlKFwiLi9wb2xpY2llcy9kaXNhYmxlS2VlcEFsaXZlUG9saWN5LmpzXCIpO1xuY29uc3QgY29yZV9yZXN0X3BpcGVsaW5lXzEgPSByZXF1aXJlKFwiQGF6dXJlL2NvcmUtcmVzdC1waXBlbGluZVwiKTtcbmNvbnN0IGNvcmVfY2xpZW50XzEgPSByZXF1aXJlKFwiQGF6dXJlL2NvcmUtY2xpZW50XCIpO1xuY29uc3QgcmVzcG9uc2VfanNfMSA9IHJlcXVpcmUoXCIuL3Jlc3BvbnNlLmpzXCIpO1xuLyoqXG4gKiBDbGllbnQgdG8gcHJvdmlkZSBjb21wYXRhYmlsaXR5IGJldHdlZW4gY29yZSBWMSAmIFYyLlxuICovXG5jbGFzcyBFeHRlbmRlZFNlcnZpY2VDbGllbnQgZXh0ZW5kcyBjb3JlX2NsaWVudF8xLlNlcnZpY2VDbGllbnQge1xuICAgIGNvbnN0cnVjdG9yKG9wdGlvbnMpIHtcbiAgICAgICAgdmFyIF9hLCBfYjtcbiAgICAgICAgc3VwZXIob3B0aW9ucyk7XG4gICAgICAgIGlmICgoKF9hID0gb3B0aW9ucy5rZWVwQWxpdmVPcHRpb25zKSA9PT0gbnVsbCB8fCBfYSA9PT0gdm9pZCAwID8gdm9pZCAwIDogX2EuZW5hYmxlKSA9PT0gZmFsc2UgJiZcbiAgICAgICAgICAgICEoMCwgZGlzYWJsZUtlZXBBbGl2ZVBvbGljeV9qc18xLnBpcGVsaW5lQ29udGFpbnNEaXNhYmxlS2VlcEFsaXZlUG9saWN5KSh0aGlzLnBpcGVsaW5lKSkge1xuICAgICAgICAgICAgdGhpcy5waXBlbGluZS5hZGRQb2xpY3koKDAsIGRpc2FibGVLZWVwQWxpdmVQb2xpY3lfanNfMS5jcmVhdGVEaXNhYmxlS2VlcEFsaXZlUG9saWN5KSgpKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoKChfYiA9IG9wdGlvbnMucmVkaXJlY3RPcHRpb25zKSA9PT0gbnVsbCB8fCBfYiA9PT0gdm9pZCAwID8gdm9pZCAwIDogX2IuaGFuZGxlUmVkaXJlY3RzKSA9PT0gZmFsc2UpIHtcbiAgICAgICAgICAgIHRoaXMucGlwZWxpbmUucmVtb3ZlUG9saWN5KHtcbiAgICAgICAgICAgICAgICBuYW1lOiBjb3JlX3Jlc3RfcGlwZWxpbmVfMS5yZWRpcmVjdFBvbGljeU5hbWUsXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgIH1cbiAgICAvKipcbiAgICAgKiBDb21wYXRpYmxlIHNlbmQgb3BlcmF0aW9uIHJlcXVlc3QgZnVuY3Rpb24uXG4gICAgICpcbiAgICAgKiBAcGFyYW0gb3BlcmF0aW9uQXJndW1lbnRzIC0gT3BlcmF0aW9uIGFyZ3VtZW50c1xuICAgICAqIEBwYXJhbSBvcGVyYXRpb25TcGVjIC0gT3BlcmF0aW9uIFNwZWNcbiAgICAgKiBAcmV0dXJuc1xuICAgICAqL1xuICAgIGFzeW5jIHNlbmRPcGVyYXRpb25SZXF1ZXN0KG9wZXJhdGlvbkFyZ3VtZW50cywgb3BlcmF0aW9uU3BlYykge1xuICAgICAgICB2YXIgX2E7XG4gICAgICAgIGNvbnN0IHVzZXJQcm92aWRlZENhbGxCYWNrID0gKF9hID0gb3BlcmF0aW9uQXJndW1lbnRzID09PSBudWxsIHx8IG9wZXJhdGlvbkFyZ3VtZW50cyA9PT0gdm9pZCAwID8gdm9pZCAwIDogb3BlcmF0aW9uQXJndW1lbnRzLm9wdGlvbnMpID09PSBudWxsIHx8IF9hID09PSB2b2lkIDAgPyB2b2lkIDAgOiBfYS5vblJlc3BvbnNlO1xuICAgICAgICBsZXQgbGFzdFJlc3BvbnNlO1xuICAgICAgICBmdW5jdGlvbiBvblJlc3BvbnNlKHJhd1Jlc3BvbnNlLCBmbGF0UmVzcG9uc2UsIGVycm9yKSB7XG4gICAgICAgICAgICBsYXN0UmVzcG9uc2UgPSByYXdSZXNwb25zZTtcbiAgICAgICAgICAgIGlmICh1c2VyUHJvdmlkZWRDYWxsQmFjaykge1xuICAgICAgICAgICAgICAgIHVzZXJQcm92aWRlZENhbGxCYWNrKHJhd1Jlc3BvbnNlLCBmbGF0UmVzcG9uc2UsIGVycm9yKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBvcGVyYXRpb25Bcmd1bWVudHMub3B0aW9ucyA9IE9iamVjdC5hc3NpZ24oT2JqZWN0LmFzc2lnbih7fSwgb3BlcmF0aW9uQXJndW1lbnRzLm9wdGlvbnMpLCB7IG9uUmVzcG9uc2UgfSk7XG4gICAgICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IHN1cGVyLnNlbmRPcGVyYXRpb25SZXF1ZXN0KG9wZXJhdGlvbkFyZ3VtZW50cywgb3BlcmF0aW9uU3BlYyk7XG4gICAgICAgIGlmIChsYXN0UmVzcG9uc2UpIHtcbiAgICAgICAgICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShyZXN1bHQsIFwiX3Jlc3BvbnNlXCIsIHtcbiAgICAgICAgICAgICAgICB2YWx1ZTogKDAsIHJlc3BvbnNlX2pzXzEudG9Db21wYXRSZXNwb25zZSkobGFzdFJlc3BvbnNlKSxcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgfVxufVxuZXhwb3J0cy5FeHRlbmRlZFNlcnZpY2VDbGllbnQgPSBFeHRlbmRlZFNlcnZpY2VDbGllbnQ7XG4vLyMgc291cmNlTWFwcGluZ1VSTD1leHRlbmRlZENsaWVudC5qcy5tYXAiLAogICAgIlwidXNlIHN0cmljdFwiO1xuLy8gQ29weXJpZ2h0IChjKSBNaWNyb3NvZnQgQ29ycG9yYXRpb24uXG4vLyBMaWNlbnNlZCB1bmRlciB0aGUgTUlUIGxpY2Vuc2UuXG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJfX2VzTW9kdWxlXCIsIHsgdmFsdWU6IHRydWUgfSk7XG5leHBvcnRzLmNyZWF0ZVJlcXVlc3RQb2xpY3lGYWN0b3J5UG9saWN5ID0gZXhwb3J0cy5yZXF1ZXN0UG9saWN5RmFjdG9yeVBvbGljeU5hbWUgPSBleHBvcnRzLkh0dHBQaXBlbGluZUxvZ0xldmVsID0gdm9pZCAwO1xuY29uc3QgdXRpbF9qc18xID0gcmVxdWlyZShcIi4uL3V0aWwuanNcIik7XG5jb25zdCByZXNwb25zZV9qc18xID0gcmVxdWlyZShcIi4uL3Jlc3BvbnNlLmpzXCIpO1xuLyoqXG4gKiBBbiBlbnVtIGZvciBjb21wYXRpYmlsaXR5IHdpdGggUmVxdWVzdFBvbGljeVxuICovXG52YXIgSHR0cFBpcGVsaW5lTG9nTGV2ZWw7XG4oZnVuY3Rpb24gKEh0dHBQaXBlbGluZUxvZ0xldmVsKSB7XG4gICAgSHR0cFBpcGVsaW5lTG9nTGV2ZWxbSHR0cFBpcGVsaW5lTG9nTGV2ZWxbXCJFUlJPUlwiXSA9IDFdID0gXCJFUlJPUlwiO1xuICAgIEh0dHBQaXBlbGluZUxvZ0xldmVsW0h0dHBQaXBlbGluZUxvZ0xldmVsW1wiSU5GT1wiXSA9IDNdID0gXCJJTkZPXCI7XG4gICAgSHR0cFBpcGVsaW5lTG9nTGV2ZWxbSHR0cFBpcGVsaW5lTG9nTGV2ZWxbXCJPRkZcIl0gPSAwXSA9IFwiT0ZGXCI7XG4gICAgSHR0cFBpcGVsaW5lTG9nTGV2ZWxbSHR0cFBpcGVsaW5lTG9nTGV2ZWxbXCJXQVJOSU5HXCJdID0gMl0gPSBcIldBUk5JTkdcIjtcbn0pKEh0dHBQaXBlbGluZUxvZ0xldmVsIHx8IChleHBvcnRzLkh0dHBQaXBlbGluZUxvZ0xldmVsID0gSHR0cFBpcGVsaW5lTG9nTGV2ZWwgPSB7fSkpO1xuY29uc3QgbW9ja1JlcXVlc3RQb2xpY3lPcHRpb25zID0ge1xuICAgIGxvZyhfbG9nTGV2ZWwsIF9tZXNzYWdlKSB7XG4gICAgICAgIC8qIGRvIG5vdGhpbmcgKi9cbiAgICB9LFxuICAgIHNob3VsZExvZyhfbG9nTGV2ZWwpIHtcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH0sXG59O1xuLyoqXG4gKiBUaGUgbmFtZSBvZiB0aGUgUmVxdWVzdFBvbGljeUZhY3RvcnlQb2xpY3lcbiAqL1xuZXhwb3J0cy5yZXF1ZXN0UG9saWN5RmFjdG9yeVBvbGljeU5hbWUgPSBcIlJlcXVlc3RQb2xpY3lGYWN0b3J5UG9saWN5XCI7XG4vKipcbiAqIEEgcG9saWN5IHRoYXQgd3JhcHMgcG9saWNpZXMgd3JpdHRlbiBmb3IgY29yZS1odHRwLlxuICogQHBhcmFtIGZhY3RvcmllcyAtIEFuIGFycmF5IG9mIGBSZXF1ZXN0UG9saWN5RmFjdG9yeWAgb2JqZWN0cyBmcm9tIGEgY29yZS1odHRwIHBpcGVsaW5lXG4gKi9cbmZ1bmN0aW9uIGNyZWF0ZVJlcXVlc3RQb2xpY3lGYWN0b3J5UG9saWN5KGZhY3Rvcmllcykge1xuICAgIGNvbnN0IG9yZGVyZWRGYWN0b3JpZXMgPSBmYWN0b3JpZXMuc2xpY2UoKS5yZXZlcnNlKCk7XG4gICAgcmV0dXJuIHtcbiAgICAgICAgbmFtZTogZXhwb3J0cy5yZXF1ZXN0UG9saWN5RmFjdG9yeVBvbGljeU5hbWUsXG4gICAgICAgIGFzeW5jIHNlbmRSZXF1ZXN0KHJlcXVlc3QsIG5leHQpIHtcbiAgICAgICAgICAgIGxldCBodHRwUGlwZWxpbmUgPSB7XG4gICAgICAgICAgICAgICAgYXN5bmMgc2VuZFJlcXVlc3QoaHR0cFJlcXVlc3QpIHtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgcmVzcG9uc2UgPSBhd2FpdCBuZXh0KCgwLCB1dGlsX2pzXzEudG9QaXBlbGluZVJlcXVlc3QpKGh0dHBSZXF1ZXN0KSk7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiAoMCwgcmVzcG9uc2VfanNfMS50b0NvbXBhdFJlc3BvbnNlKShyZXNwb25zZSwgeyBjcmVhdGVQcm94eTogdHJ1ZSB9KTtcbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgfTtcbiAgICAgICAgICAgIGZvciAoY29uc3QgZmFjdG9yeSBvZiBvcmRlcmVkRmFjdG9yaWVzKSB7XG4gICAgICAgICAgICAgICAgaHR0cFBpcGVsaW5lID0gZmFjdG9yeS5jcmVhdGUoaHR0cFBpcGVsaW5lLCBtb2NrUmVxdWVzdFBvbGljeU9wdGlvbnMpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgY29uc3Qgd2ViUmVzb3VyY2VMaWtlID0gKDAsIHV0aWxfanNfMS50b1dlYlJlc291cmNlTGlrZSkocmVxdWVzdCwgeyBjcmVhdGVQcm94eTogdHJ1ZSB9KTtcbiAgICAgICAgICAgIGNvbnN0IHJlc3BvbnNlID0gYXdhaXQgaHR0cFBpcGVsaW5lLnNlbmRSZXF1ZXN0KHdlYlJlc291cmNlTGlrZSk7XG4gICAgICAgICAgICByZXR1cm4gKDAsIHJlc3BvbnNlX2pzXzEudG9QaXBlbGluZVJlc3BvbnNlKShyZXNwb25zZSk7XG4gICAgICAgIH0sXG4gICAgfTtcbn1cbmV4cG9ydHMuY3JlYXRlUmVxdWVzdFBvbGljeUZhY3RvcnlQb2xpY3kgPSBjcmVhdGVSZXF1ZXN0UG9saWN5RmFjdG9yeVBvbGljeTtcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPXJlcXVlc3RQb2xpY3lGYWN0b3J5UG9saWN5LmpzLm1hcCIsCiAgICAiXCJ1c2Ugc3RyaWN0XCI7XG4vLyBDb3B5cmlnaHQgKGMpIE1pY3Jvc29mdCBDb3Jwb3JhdGlvbi5cbi8vIExpY2Vuc2VkIHVuZGVyIHRoZSBNSVQgbGljZW5zZS5cbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIl9fZXNNb2R1bGVcIiwgeyB2YWx1ZTogdHJ1ZSB9KTtcbmV4cG9ydHMuY29udmVydEh0dHBDbGllbnQgPSB2b2lkIDA7XG5jb25zdCByZXNwb25zZV9qc18xID0gcmVxdWlyZShcIi4vcmVzcG9uc2UuanNcIik7XG5jb25zdCB1dGlsX2pzXzEgPSByZXF1aXJlKFwiLi91dGlsLmpzXCIpO1xuLyoqXG4gKiBDb252ZXJ0cyBhIFJlcXVlc3RQb2xpY3kgYmFzZWQgSHR0cENsaWVudCB0byBhIFBpcGVsaW5lUmVxdWVzdCBiYXNlZCBIdHRwQ2xpZW50LlxuICogQHBhcmFtIHJlcXVlc3RQb2xpY3lDbGllbnQgLSBBIEh0dHBDbGllbnQgY29tcGF0aWJsZSB3aXRoIGNvcmUtaHR0cFxuICogQHJldHVybnMgQSBIdHRwQ2xpZW50IGNvbXBhdGlibGUgd2l0aCBjb3JlLXJlc3QtcGlwZWxpbmVcbiAqL1xuZnVuY3Rpb24gY29udmVydEh0dHBDbGllbnQocmVxdWVzdFBvbGljeUNsaWVudCkge1xuICAgIHJldHVybiB7XG4gICAgICAgIHNlbmRSZXF1ZXN0OiBhc3luYyAocmVxdWVzdCkgPT4ge1xuICAgICAgICAgICAgY29uc3QgcmVzcG9uc2UgPSBhd2FpdCByZXF1ZXN0UG9saWN5Q2xpZW50LnNlbmRSZXF1ZXN0KCgwLCB1dGlsX2pzXzEudG9XZWJSZXNvdXJjZUxpa2UpKHJlcXVlc3QsIHsgY3JlYXRlUHJveHk6IHRydWUgfSkpO1xuICAgICAgICAgICAgcmV0dXJuICgwLCByZXNwb25zZV9qc18xLnRvUGlwZWxpbmVSZXNwb25zZSkocmVzcG9uc2UpO1xuICAgICAgICB9LFxuICAgIH07XG59XG5leHBvcnRzLmNvbnZlcnRIdHRwQ2xpZW50ID0gY29udmVydEh0dHBDbGllbnQ7XG4vLyMgc291cmNlTWFwcGluZ1VSTD1odHRwQ2xpZW50QWRhcHRlci5qcy5tYXAiLAogICAgIlwidXNlIHN0cmljdFwiO1xuLy8gQ29weXJpZ2h0IChjKSBNaWNyb3NvZnQgQ29ycG9yYXRpb24uXG4vLyBMaWNlbnNlZCB1bmRlciB0aGUgTUlUIGxpY2Vuc2UuXG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJfX2VzTW9kdWxlXCIsIHsgdmFsdWU6IHRydWUgfSk7XG5leHBvcnRzLnRvSHR0cEhlYWRlcnNMaWtlID0gZXhwb3J0cy5jb252ZXJ0SHR0cENsaWVudCA9IGV4cG9ydHMuZGlzYWJsZUtlZXBBbGl2ZVBvbGljeU5hbWUgPSBleHBvcnRzLkh0dHBQaXBlbGluZUxvZ0xldmVsID0gZXhwb3J0cy5jcmVhdGVSZXF1ZXN0UG9saWN5RmFjdG9yeVBvbGljeSA9IGV4cG9ydHMucmVxdWVzdFBvbGljeUZhY3RvcnlQb2xpY3lOYW1lID0gZXhwb3J0cy5FeHRlbmRlZFNlcnZpY2VDbGllbnQgPSB2b2lkIDA7XG4vKipcbiAqIEEgU2hpbSBMaWJyYXJ5IHRoYXQgcHJvdmlkZXMgY29tcGF0aWJpbGl0eSBiZXR3ZWVuIENvcmUgVjEgJiBWMiBQYWNrYWdlcy5cbiAqXG4gKiBAcGFja2FnZURvY3VtZW50YXRpb25cbiAqL1xudmFyIGV4dGVuZGVkQ2xpZW50X2pzXzEgPSByZXF1aXJlKFwiLi9leHRlbmRlZENsaWVudC5qc1wiKTtcbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIkV4dGVuZGVkU2VydmljZUNsaWVudFwiLCB7IGVudW1lcmFibGU6IHRydWUsIGdldDogZnVuY3Rpb24gKCkgeyByZXR1cm4gZXh0ZW5kZWRDbGllbnRfanNfMS5FeHRlbmRlZFNlcnZpY2VDbGllbnQ7IH0gfSk7XG52YXIgcmVxdWVzdFBvbGljeUZhY3RvcnlQb2xpY3lfanNfMSA9IHJlcXVpcmUoXCIuL3BvbGljaWVzL3JlcXVlc3RQb2xpY3lGYWN0b3J5UG9saWN5LmpzXCIpO1xuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwicmVxdWVzdFBvbGljeUZhY3RvcnlQb2xpY3lOYW1lXCIsIHsgZW51bWVyYWJsZTogdHJ1ZSwgZ2V0OiBmdW5jdGlvbiAoKSB7IHJldHVybiByZXF1ZXN0UG9saWN5RmFjdG9yeVBvbGljeV9qc18xLnJlcXVlc3RQb2xpY3lGYWN0b3J5UG9saWN5TmFtZTsgfSB9KTtcbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcImNyZWF0ZVJlcXVlc3RQb2xpY3lGYWN0b3J5UG9saWN5XCIsIHsgZW51bWVyYWJsZTogdHJ1ZSwgZ2V0OiBmdW5jdGlvbiAoKSB7IHJldHVybiByZXF1ZXN0UG9saWN5RmFjdG9yeVBvbGljeV9qc18xLmNyZWF0ZVJlcXVlc3RQb2xpY3lGYWN0b3J5UG9saWN5OyB9IH0pO1xuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiSHR0cFBpcGVsaW5lTG9nTGV2ZWxcIiwgeyBlbnVtZXJhYmxlOiB0cnVlLCBnZXQ6IGZ1bmN0aW9uICgpIHsgcmV0dXJuIHJlcXVlc3RQb2xpY3lGYWN0b3J5UG9saWN5X2pzXzEuSHR0cFBpcGVsaW5lTG9nTGV2ZWw7IH0gfSk7XG52YXIgZGlzYWJsZUtlZXBBbGl2ZVBvbGljeV9qc18xID0gcmVxdWlyZShcIi4vcG9saWNpZXMvZGlzYWJsZUtlZXBBbGl2ZVBvbGljeS5qc1wiKTtcbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcImRpc2FibGVLZWVwQWxpdmVQb2xpY3lOYW1lXCIsIHsgZW51bWVyYWJsZTogdHJ1ZSwgZ2V0OiBmdW5jdGlvbiAoKSB7IHJldHVybiBkaXNhYmxlS2VlcEFsaXZlUG9saWN5X2pzXzEuZGlzYWJsZUtlZXBBbGl2ZVBvbGljeU5hbWU7IH0gfSk7XG52YXIgaHR0cENsaWVudEFkYXB0ZXJfanNfMSA9IHJlcXVpcmUoXCIuL2h0dHBDbGllbnRBZGFwdGVyLmpzXCIpO1xuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiY29udmVydEh0dHBDbGllbnRcIiwgeyBlbnVtZXJhYmxlOiB0cnVlLCBnZXQ6IGZ1bmN0aW9uICgpIHsgcmV0dXJuIGh0dHBDbGllbnRBZGFwdGVyX2pzXzEuY29udmVydEh0dHBDbGllbnQ7IH0gfSk7XG52YXIgdXRpbF9qc18xID0gcmVxdWlyZShcIi4vdXRpbC5qc1wiKTtcbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcInRvSHR0cEhlYWRlcnNMaWtlXCIsIHsgZW51bWVyYWJsZTogdHJ1ZSwgZ2V0OiBmdW5jdGlvbiAoKSB7IHJldHVybiB1dGlsX2pzXzEudG9IdHRwSGVhZGVyc0xpa2U7IH0gfSk7XG4vLyMgc291cmNlTWFwcGluZ1VSTD1pbmRleC5qcy5tYXAiLAogICAgIid1c2Ugc3RyaWN0JztcblxuY29uc3QgbmFtZVN0YXJ0Q2hhciA9ICc6QS1aYS16X1xcXFx1MDBDMC1cXFxcdTAwRDZcXFxcdTAwRDgtXFxcXHUwMEY2XFxcXHUwMEY4LVxcXFx1MDJGRlxcXFx1MDM3MC1cXFxcdTAzN0RcXFxcdTAzN0YtXFxcXHUxRkZGXFxcXHUyMDBDLVxcXFx1MjAwRFxcXFx1MjA3MC1cXFxcdTIxOEZcXFxcdTJDMDAtXFxcXHUyRkVGXFxcXHUzMDAxLVxcXFx1RDdGRlxcXFx1RjkwMC1cXFxcdUZEQ0ZcXFxcdUZERjAtXFxcXHVGRkZEJztcbmNvbnN0IG5hbWVDaGFyID0gbmFtZVN0YXJ0Q2hhciArICdcXFxcLS5cXFxcZFxcXFx1MDBCN1xcXFx1MDMwMC1cXFxcdTAzNkZcXFxcdTIwM0YtXFxcXHUyMDQwJztcbmNvbnN0IG5hbWVSZWdleHAgPSAnWycgKyBuYW1lU3RhcnRDaGFyICsgJ11bJyArIG5hbWVDaGFyICsgJ10qJ1xuY29uc3QgcmVnZXhOYW1lID0gbmV3IFJlZ0V4cCgnXicgKyBuYW1lUmVnZXhwICsgJyQnKTtcblxuY29uc3QgZ2V0QWxsTWF0Y2hlcyA9IGZ1bmN0aW9uKHN0cmluZywgcmVnZXgpIHtcbiAgY29uc3QgbWF0Y2hlcyA9IFtdO1xuICBsZXQgbWF0Y2ggPSByZWdleC5leGVjKHN0cmluZyk7XG4gIHdoaWxlIChtYXRjaCkge1xuICAgIGNvbnN0IGFsbG1hdGNoZXMgPSBbXTtcbiAgICBhbGxtYXRjaGVzLnN0YXJ0SW5kZXggPSByZWdleC5sYXN0SW5kZXggLSBtYXRjaFswXS5sZW5ndGg7XG4gICAgY29uc3QgbGVuID0gbWF0Y2gubGVuZ3RoO1xuICAgIGZvciAobGV0IGluZGV4ID0gMDsgaW5kZXggPCBsZW47IGluZGV4KyspIHtcbiAgICAgIGFsbG1hdGNoZXMucHVzaChtYXRjaFtpbmRleF0pO1xuICAgIH1cbiAgICBtYXRjaGVzLnB1c2goYWxsbWF0Y2hlcyk7XG4gICAgbWF0Y2ggPSByZWdleC5leGVjKHN0cmluZyk7XG4gIH1cbiAgcmV0dXJuIG1hdGNoZXM7XG59O1xuXG5jb25zdCBpc05hbWUgPSBmdW5jdGlvbihzdHJpbmcpIHtcbiAgY29uc3QgbWF0Y2ggPSByZWdleE5hbWUuZXhlYyhzdHJpbmcpO1xuICByZXR1cm4gIShtYXRjaCA9PT0gbnVsbCB8fCB0eXBlb2YgbWF0Y2ggPT09ICd1bmRlZmluZWQnKTtcbn07XG5cbmV4cG9ydHMuaXNFeGlzdCA9IGZ1bmN0aW9uKHYpIHtcbiAgcmV0dXJuIHR5cGVvZiB2ICE9PSAndW5kZWZpbmVkJztcbn07XG5cbmV4cG9ydHMuaXNFbXB0eU9iamVjdCA9IGZ1bmN0aW9uKG9iaikge1xuICByZXR1cm4gT2JqZWN0LmtleXMob2JqKS5sZW5ndGggPT09IDA7XG59O1xuXG4vKipcbiAqIENvcHkgYWxsIHRoZSBwcm9wZXJ0aWVzIG9mIGEgaW50byBiLlxuICogQHBhcmFtIHsqfSB0YXJnZXRcbiAqIEBwYXJhbSB7Kn0gYVxuICovXG5leHBvcnRzLm1lcmdlID0gZnVuY3Rpb24odGFyZ2V0LCBhLCBhcnJheU1vZGUpIHtcbiAgaWYgKGEpIHtcbiAgICBjb25zdCBrZXlzID0gT2JqZWN0LmtleXMoYSk7IC8vIHdpbGwgcmV0dXJuIGFuIGFycmF5IG9mIG93biBwcm9wZXJ0aWVzXG4gICAgY29uc3QgbGVuID0ga2V5cy5sZW5ndGg7IC8vZG9uJ3QgbWFrZSBpdCBpbmxpbmVcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IGxlbjsgaSsrKSB7XG4gICAgICBpZiAoYXJyYXlNb2RlID09PSAnc3RyaWN0Jykge1xuICAgICAgICB0YXJnZXRba2V5c1tpXV0gPSBbIGFba2V5c1tpXV0gXTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHRhcmdldFtrZXlzW2ldXSA9IGFba2V5c1tpXV07XG4gICAgICB9XG4gICAgfVxuICB9XG59O1xuLyogZXhwb3J0cy5tZXJnZSA9ZnVuY3Rpb24gKGIsYSl7XG4gIHJldHVybiBPYmplY3QuYXNzaWduKGIsYSk7XG59ICovXG5cbmV4cG9ydHMuZ2V0VmFsdWUgPSBmdW5jdGlvbih2KSB7XG4gIGlmIChleHBvcnRzLmlzRXhpc3QodikpIHtcbiAgICByZXR1cm4gdjtcbiAgfSBlbHNlIHtcbiAgICByZXR1cm4gJyc7XG4gIH1cbn07XG5cbi8vIGNvbnN0IGZha2VDYWxsID0gZnVuY3Rpb24oYSkge3JldHVybiBhO307XG4vLyBjb25zdCBmYWtlQ2FsbE5vUmV0dXJuID0gZnVuY3Rpb24oKSB7fTtcblxuZXhwb3J0cy5pc05hbWUgPSBpc05hbWU7XG5leHBvcnRzLmdldEFsbE1hdGNoZXMgPSBnZXRBbGxNYXRjaGVzO1xuZXhwb3J0cy5uYW1lUmVnZXhwID0gbmFtZVJlZ2V4cDtcbiIsCiAgICAiJ3VzZSBzdHJpY3QnO1xuXG5jb25zdCB1dGlsID0gcmVxdWlyZSgnLi91dGlsJyk7XG5cbmNvbnN0IGRlZmF1bHRPcHRpb25zID0ge1xuICBhbGxvd0Jvb2xlYW5BdHRyaWJ1dGVzOiBmYWxzZSwgLy9BIHRhZyBjYW4gaGF2ZSBhdHRyaWJ1dGVzIHdpdGhvdXQgYW55IHZhbHVlXG4gIHVucGFpcmVkVGFnczogW11cbn07XG5cbi8vY29uc3QgdGFnc1BhdHRlcm4gPSBuZXcgUmVnRXhwKFwiPFxcXFwvPyhbXFxcXHc6XFxcXC1fXFwuXSspXFxcXHMqXFwvPz5cIixcImdcIik7XG5leHBvcnRzLnZhbGlkYXRlID0gZnVuY3Rpb24gKHhtbERhdGEsIG9wdGlvbnMpIHtcbiAgb3B0aW9ucyA9IE9iamVjdC5hc3NpZ24oe30sIGRlZmF1bHRPcHRpb25zLCBvcHRpb25zKTtcblxuICAvL3htbERhdGEgPSB4bWxEYXRhLnJlcGxhY2UoLyhcXHJcXG58XFxufFxccikvZ20sXCJcIik7Ly9tYWtlIGl0IHNpbmdsZSBsaW5lXG4gIC8veG1sRGF0YSA9IHhtbERhdGEucmVwbGFjZSgvKF5cXHMqPFxcP3htbC4qP1xcPz4pL2csXCJcIik7Ly9SZW1vdmUgWE1MIHN0YXJ0aW5nIHRhZ1xuICAvL3htbERhdGEgPSB4bWxEYXRhLnJlcGxhY2UoLyg8IURPQ1RZUEVbXFxzXFx3XFxcIlxcLlxcL1xcLVxcOl0rKFxcWy4qXFxdKSpcXHMqPikvZyxcIlwiKTsvL1JlbW92ZSBET0NUWVBFXG4gIGNvbnN0IHRhZ3MgPSBbXTtcbiAgbGV0IHRhZ0ZvdW5kID0gZmFsc2U7XG5cbiAgLy9pbmRpY2F0ZXMgdGhhdCB0aGUgcm9vdCB0YWcgaGFzIGJlZW4gY2xvc2VkIChha2EuIGRlcHRoIDAgaGFzIGJlZW4gcmVhY2hlZClcbiAgbGV0IHJlYWNoZWRSb290ID0gZmFsc2U7XG5cbiAgaWYgKHhtbERhdGFbMF0gPT09ICdcXHVmZWZmJykge1xuICAgIC8vIGNoZWNrIGZvciBieXRlIG9yZGVyIG1hcmsgKEJPTSlcbiAgICB4bWxEYXRhID0geG1sRGF0YS5zdWJzdHIoMSk7XG4gIH1cbiAgXG4gIGZvciAobGV0IGkgPSAwOyBpIDwgeG1sRGF0YS5sZW5ndGg7IGkrKykge1xuXG4gICAgaWYgKHhtbERhdGFbaV0gPT09ICc8JyAmJiB4bWxEYXRhW2krMV0gPT09ICc/Jykge1xuICAgICAgaSs9MjtcbiAgICAgIGkgPSByZWFkUEkoeG1sRGF0YSxpKTtcbiAgICAgIGlmIChpLmVycikgcmV0dXJuIGk7XG4gICAgfWVsc2UgaWYgKHhtbERhdGFbaV0gPT09ICc8Jykge1xuICAgICAgLy9zdGFydGluZyBvZiB0YWdcbiAgICAgIC8vcmVhZCB1bnRpbCB5b3UgcmVhY2ggdG8gJz4nIGF2b2lkaW5nIGFueSAnPicgaW4gYXR0cmlidXRlIHZhbHVlXG4gICAgICBsZXQgdGFnU3RhcnRQb3MgPSBpO1xuICAgICAgaSsrO1xuICAgICAgXG4gICAgICBpZiAoeG1sRGF0YVtpXSA9PT0gJyEnKSB7XG4gICAgICAgIGkgPSByZWFkQ29tbWVudEFuZENEQVRBKHhtbERhdGEsIGkpO1xuICAgICAgICBjb250aW51ZTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGxldCBjbG9zaW5nVGFnID0gZmFsc2U7XG4gICAgICAgIGlmICh4bWxEYXRhW2ldID09PSAnLycpIHtcbiAgICAgICAgICAvL2Nsb3NpbmcgdGFnXG4gICAgICAgICAgY2xvc2luZ1RhZyA9IHRydWU7XG4gICAgICAgICAgaSsrO1xuICAgICAgICB9XG4gICAgICAgIC8vcmVhZCB0YWduYW1lXG4gICAgICAgIGxldCB0YWdOYW1lID0gJyc7XG4gICAgICAgIGZvciAoOyBpIDwgeG1sRGF0YS5sZW5ndGggJiZcbiAgICAgICAgICB4bWxEYXRhW2ldICE9PSAnPicgJiZcbiAgICAgICAgICB4bWxEYXRhW2ldICE9PSAnICcgJiZcbiAgICAgICAgICB4bWxEYXRhW2ldICE9PSAnXFx0JyAmJlxuICAgICAgICAgIHhtbERhdGFbaV0gIT09ICdcXG4nICYmXG4gICAgICAgICAgeG1sRGF0YVtpXSAhPT0gJ1xccic7IGkrK1xuICAgICAgICApIHtcbiAgICAgICAgICB0YWdOYW1lICs9IHhtbERhdGFbaV07XG4gICAgICAgIH1cbiAgICAgICAgdGFnTmFtZSA9IHRhZ05hbWUudHJpbSgpO1xuICAgICAgICAvL2NvbnNvbGUubG9nKHRhZ05hbWUpO1xuXG4gICAgICAgIGlmICh0YWdOYW1lW3RhZ05hbWUubGVuZ3RoIC0gMV0gPT09ICcvJykge1xuICAgICAgICAgIC8vc2VsZiBjbG9zaW5nIHRhZyB3aXRob3V0IGF0dHJpYnV0ZXNcbiAgICAgICAgICB0YWdOYW1lID0gdGFnTmFtZS5zdWJzdHJpbmcoMCwgdGFnTmFtZS5sZW5ndGggLSAxKTtcbiAgICAgICAgICAvL2NvbnRpbnVlO1xuICAgICAgICAgIGktLTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoIXZhbGlkYXRlVGFnTmFtZSh0YWdOYW1lKSkge1xuICAgICAgICAgIGxldCBtc2c7XG4gICAgICAgICAgaWYgKHRhZ05hbWUudHJpbSgpLmxlbmd0aCA9PT0gMCkge1xuICAgICAgICAgICAgbXNnID0gXCJJbnZhbGlkIHNwYWNlIGFmdGVyICc8Jy5cIjtcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgbXNnID0gXCJUYWcgJ1wiK3RhZ05hbWUrXCInIGlzIGFuIGludmFsaWQgbmFtZS5cIjtcbiAgICAgICAgICB9XG4gICAgICAgICAgcmV0dXJuIGdldEVycm9yT2JqZWN0KCdJbnZhbGlkVGFnJywgbXNnLCBnZXRMaW5lTnVtYmVyRm9yUG9zaXRpb24oeG1sRGF0YSwgaSkpO1xuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgcmVzdWx0ID0gcmVhZEF0dHJpYnV0ZVN0cih4bWxEYXRhLCBpKTtcbiAgICAgICAgaWYgKHJlc3VsdCA9PT0gZmFsc2UpIHtcbiAgICAgICAgICByZXR1cm4gZ2V0RXJyb3JPYmplY3QoJ0ludmFsaWRBdHRyJywgXCJBdHRyaWJ1dGVzIGZvciAnXCIrdGFnTmFtZStcIicgaGF2ZSBvcGVuIHF1b3RlLlwiLCBnZXRMaW5lTnVtYmVyRm9yUG9zaXRpb24oeG1sRGF0YSwgaSkpO1xuICAgICAgICB9XG4gICAgICAgIGxldCBhdHRyU3RyID0gcmVzdWx0LnZhbHVlO1xuICAgICAgICBpID0gcmVzdWx0LmluZGV4O1xuXG4gICAgICAgIGlmIChhdHRyU3RyW2F0dHJTdHIubGVuZ3RoIC0gMV0gPT09ICcvJykge1xuICAgICAgICAgIC8vc2VsZiBjbG9zaW5nIHRhZ1xuICAgICAgICAgIGNvbnN0IGF0dHJTdHJTdGFydCA9IGkgLSBhdHRyU3RyLmxlbmd0aDtcbiAgICAgICAgICBhdHRyU3RyID0gYXR0clN0ci5zdWJzdHJpbmcoMCwgYXR0clN0ci5sZW5ndGggLSAxKTtcbiAgICAgICAgICBjb25zdCBpc1ZhbGlkID0gdmFsaWRhdGVBdHRyaWJ1dGVTdHJpbmcoYXR0clN0ciwgb3B0aW9ucyk7XG4gICAgICAgICAgaWYgKGlzVmFsaWQgPT09IHRydWUpIHtcbiAgICAgICAgICAgIHRhZ0ZvdW5kID0gdHJ1ZTtcbiAgICAgICAgICAgIC8vY29udGludWU7IC8vdGV4dCBtYXkgcHJlc2VudHMgYWZ0ZXIgc2VsZiBjbG9zaW5nIHRhZ1xuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAvL3RoZSByZXN1bHQgZnJvbSB0aGUgbmVzdGVkIGZ1bmN0aW9uIHJldHVybnMgdGhlIHBvc2l0aW9uIG9mIHRoZSBlcnJvciB3aXRoaW4gdGhlIGF0dHJpYnV0ZVxuICAgICAgICAgICAgLy9pbiBvcmRlciB0byBnZXQgdGhlICd0cnVlJyBlcnJvciBsaW5lLCB3ZSBuZWVkIHRvIGNhbGN1bGF0ZSB0aGUgcG9zaXRpb24gd2hlcmUgdGhlIGF0dHJpYnV0ZSBiZWdpbnMgKGkgLSBhdHRyU3RyLmxlbmd0aCkgYW5kIHRoZW4gYWRkIHRoZSBwb3NpdGlvbiB3aXRoaW4gdGhlIGF0dHJpYnV0ZVxuICAgICAgICAgICAgLy90aGlzIGdpdmVzIHVzIHRoZSBhYnNvbHV0ZSBpbmRleCBpbiB0aGUgZW50aXJlIHhtbCwgd2hpY2ggd2UgY2FuIHVzZSB0byBmaW5kIHRoZSBsaW5lIGF0IGxhc3RcbiAgICAgICAgICAgIHJldHVybiBnZXRFcnJvck9iamVjdChpc1ZhbGlkLmVyci5jb2RlLCBpc1ZhbGlkLmVyci5tc2csIGdldExpbmVOdW1iZXJGb3JQb3NpdGlvbih4bWxEYXRhLCBhdHRyU3RyU3RhcnQgKyBpc1ZhbGlkLmVyci5saW5lKSk7XG4gICAgICAgICAgfVxuICAgICAgICB9IGVsc2UgaWYgKGNsb3NpbmdUYWcpIHtcbiAgICAgICAgICBpZiAoIXJlc3VsdC50YWdDbG9zZWQpIHtcbiAgICAgICAgICAgIHJldHVybiBnZXRFcnJvck9iamVjdCgnSW52YWxpZFRhZycsIFwiQ2xvc2luZyB0YWcgJ1wiK3RhZ05hbWUrXCInIGRvZXNuJ3QgaGF2ZSBwcm9wZXIgY2xvc2luZy5cIiwgZ2V0TGluZU51bWJlckZvclBvc2l0aW9uKHhtbERhdGEsIGkpKTtcbiAgICAgICAgICB9IGVsc2UgaWYgKGF0dHJTdHIudHJpbSgpLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgIHJldHVybiBnZXRFcnJvck9iamVjdCgnSW52YWxpZFRhZycsIFwiQ2xvc2luZyB0YWcgJ1wiK3RhZ05hbWUrXCInIGNhbid0IGhhdmUgYXR0cmlidXRlcyBvciBpbnZhbGlkIHN0YXJ0aW5nLlwiLCBnZXRMaW5lTnVtYmVyRm9yUG9zaXRpb24oeG1sRGF0YSwgdGFnU3RhcnRQb3MpKTtcbiAgICAgICAgICB9IGVsc2UgaWYgKHRhZ3MubGVuZ3RoID09PSAwKSB7XG4gICAgICAgICAgICByZXR1cm4gZ2V0RXJyb3JPYmplY3QoJ0ludmFsaWRUYWcnLCBcIkNsb3NpbmcgdGFnICdcIit0YWdOYW1lK1wiJyBoYXMgbm90IGJlZW4gb3BlbmVkLlwiLCBnZXRMaW5lTnVtYmVyRm9yUG9zaXRpb24oeG1sRGF0YSwgdGFnU3RhcnRQb3MpKTtcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgY29uc3Qgb3RnID0gdGFncy5wb3AoKTtcbiAgICAgICAgICAgIGlmICh0YWdOYW1lICE9PSBvdGcudGFnTmFtZSkge1xuICAgICAgICAgICAgICBsZXQgb3BlblBvcyA9IGdldExpbmVOdW1iZXJGb3JQb3NpdGlvbih4bWxEYXRhLCBvdGcudGFnU3RhcnRQb3MpO1xuICAgICAgICAgICAgICByZXR1cm4gZ2V0RXJyb3JPYmplY3QoJ0ludmFsaWRUYWcnLFxuICAgICAgICAgICAgICAgIFwiRXhwZWN0ZWQgY2xvc2luZyB0YWcgJ1wiK290Zy50YWdOYW1lK1wiJyAob3BlbmVkIGluIGxpbmUgXCIrb3BlblBvcy5saW5lK1wiLCBjb2wgXCIrb3BlblBvcy5jb2wrXCIpIGluc3RlYWQgb2YgY2xvc2luZyB0YWcgJ1wiK3RhZ05hbWUrXCInLlwiLFxuICAgICAgICAgICAgICAgIGdldExpbmVOdW1iZXJGb3JQb3NpdGlvbih4bWxEYXRhLCB0YWdTdGFydFBvcykpO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAvL3doZW4gdGhlcmUgYXJlIG5vIG1vcmUgdGFncywgd2UgcmVhY2hlZCB0aGUgcm9vdCBsZXZlbC5cbiAgICAgICAgICAgIGlmICh0YWdzLmxlbmd0aCA9PSAwKSB7XG4gICAgICAgICAgICAgIHJlYWNoZWRSb290ID0gdHJ1ZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgY29uc3QgaXNWYWxpZCA9IHZhbGlkYXRlQXR0cmlidXRlU3RyaW5nKGF0dHJTdHIsIG9wdGlvbnMpO1xuICAgICAgICAgIGlmIChpc1ZhbGlkICE9PSB0cnVlKSB7XG4gICAgICAgICAgICAvL3RoZSByZXN1bHQgZnJvbSB0aGUgbmVzdGVkIGZ1bmN0aW9uIHJldHVybnMgdGhlIHBvc2l0aW9uIG9mIHRoZSBlcnJvciB3aXRoaW4gdGhlIGF0dHJpYnV0ZVxuICAgICAgICAgICAgLy9pbiBvcmRlciB0byBnZXQgdGhlICd0cnVlJyBlcnJvciBsaW5lLCB3ZSBuZWVkIHRvIGNhbGN1bGF0ZSB0aGUgcG9zaXRpb24gd2hlcmUgdGhlIGF0dHJpYnV0ZSBiZWdpbnMgKGkgLSBhdHRyU3RyLmxlbmd0aCkgYW5kIHRoZW4gYWRkIHRoZSBwb3NpdGlvbiB3aXRoaW4gdGhlIGF0dHJpYnV0ZVxuICAgICAgICAgICAgLy90aGlzIGdpdmVzIHVzIHRoZSBhYnNvbHV0ZSBpbmRleCBpbiB0aGUgZW50aXJlIHhtbCwgd2hpY2ggd2UgY2FuIHVzZSB0byBmaW5kIHRoZSBsaW5lIGF0IGxhc3RcbiAgICAgICAgICAgIHJldHVybiBnZXRFcnJvck9iamVjdChpc1ZhbGlkLmVyci5jb2RlLCBpc1ZhbGlkLmVyci5tc2csIGdldExpbmVOdW1iZXJGb3JQb3NpdGlvbih4bWxEYXRhLCBpIC0gYXR0clN0ci5sZW5ndGggKyBpc1ZhbGlkLmVyci5saW5lKSk7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgLy9pZiB0aGUgcm9vdCBsZXZlbCBoYXMgYmVlbiByZWFjaGVkIGJlZm9yZSAuLi5cbiAgICAgICAgICBpZiAocmVhY2hlZFJvb3QgPT09IHRydWUpIHtcbiAgICAgICAgICAgIHJldHVybiBnZXRFcnJvck9iamVjdCgnSW52YWxpZFhtbCcsICdNdWx0aXBsZSBwb3NzaWJsZSByb290IG5vZGVzIGZvdW5kLicsIGdldExpbmVOdW1iZXJGb3JQb3NpdGlvbih4bWxEYXRhLCBpKSk7XG4gICAgICAgICAgfSBlbHNlIGlmKG9wdGlvbnMudW5wYWlyZWRUYWdzLmluZGV4T2YodGFnTmFtZSkgIT09IC0xKXtcbiAgICAgICAgICAgIC8vZG9uJ3QgcHVzaCBpbnRvIHN0YWNrXG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHRhZ3MucHVzaCh7dGFnTmFtZSwgdGFnU3RhcnRQb3N9KTtcbiAgICAgICAgICB9XG4gICAgICAgICAgdGFnRm91bmQgPSB0cnVlO1xuICAgICAgICB9XG5cbiAgICAgICAgLy9za2lwIHRhZyB0ZXh0IHZhbHVlXG4gICAgICAgIC8vSXQgbWF5IGluY2x1ZGUgY29tbWVudHMgYW5kIENEQVRBIHZhbHVlXG4gICAgICAgIGZvciAoaSsrOyBpIDwgeG1sRGF0YS5sZW5ndGg7IGkrKykge1xuICAgICAgICAgIGlmICh4bWxEYXRhW2ldID09PSAnPCcpIHtcbiAgICAgICAgICAgIGlmICh4bWxEYXRhW2kgKyAxXSA9PT0gJyEnKSB7XG4gICAgICAgICAgICAgIC8vY29tbWVudCBvciBDQURBVEFcbiAgICAgICAgICAgICAgaSsrO1xuICAgICAgICAgICAgICBpID0gcmVhZENvbW1lbnRBbmRDREFUQSh4bWxEYXRhLCBpKTtcbiAgICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgICB9IGVsc2UgaWYgKHhtbERhdGFbaSsxXSA9PT0gJz8nKSB7XG4gICAgICAgICAgICAgIGkgPSByZWFkUEkoeG1sRGF0YSwgKytpKTtcbiAgICAgICAgICAgICAgaWYgKGkuZXJyKSByZXR1cm4gaTtcbiAgICAgICAgICAgIH0gZWxzZXtcbiAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfSBlbHNlIGlmICh4bWxEYXRhW2ldID09PSAnJicpIHtcbiAgICAgICAgICAgIGNvbnN0IGFmdGVyQW1wID0gdmFsaWRhdGVBbXBlcnNhbmQoeG1sRGF0YSwgaSk7XG4gICAgICAgICAgICBpZiAoYWZ0ZXJBbXAgPT0gLTEpXG4gICAgICAgICAgICAgIHJldHVybiBnZXRFcnJvck9iamVjdCgnSW52YWxpZENoYXInLCBcImNoYXIgJyYnIGlzIG5vdCBleHBlY3RlZC5cIiwgZ2V0TGluZU51bWJlckZvclBvc2l0aW9uKHhtbERhdGEsIGkpKTtcbiAgICAgICAgICAgIGkgPSBhZnRlckFtcDtcbiAgICAgICAgICB9ZWxzZXtcbiAgICAgICAgICAgIGlmIChyZWFjaGVkUm9vdCA9PT0gdHJ1ZSAmJiAhaXNXaGl0ZVNwYWNlKHhtbERhdGFbaV0pKSB7XG4gICAgICAgICAgICAgIHJldHVybiBnZXRFcnJvck9iamVjdCgnSW52YWxpZFhtbCcsIFwiRXh0cmEgdGV4dCBhdCB0aGUgZW5kXCIsIGdldExpbmVOdW1iZXJGb3JQb3NpdGlvbih4bWxEYXRhLCBpKSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICB9IC8vZW5kIG9mIHJlYWRpbmcgdGFnIHRleHQgdmFsdWVcbiAgICAgICAgaWYgKHhtbERhdGFbaV0gPT09ICc8Jykge1xuICAgICAgICAgIGktLTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICBpZiAoIGlzV2hpdGVTcGFjZSh4bWxEYXRhW2ldKSkge1xuICAgICAgICBjb250aW51ZTtcbiAgICAgIH1cbiAgICAgIHJldHVybiBnZXRFcnJvck9iamVjdCgnSW52YWxpZENoYXInLCBcImNoYXIgJ1wiK3htbERhdGFbaV0rXCInIGlzIG5vdCBleHBlY3RlZC5cIiwgZ2V0TGluZU51bWJlckZvclBvc2l0aW9uKHhtbERhdGEsIGkpKTtcbiAgICB9XG4gIH1cblxuICBpZiAoIXRhZ0ZvdW5kKSB7XG4gICAgcmV0dXJuIGdldEVycm9yT2JqZWN0KCdJbnZhbGlkWG1sJywgJ1N0YXJ0IHRhZyBleHBlY3RlZC4nLCAxKTtcbiAgfWVsc2UgaWYgKHRhZ3MubGVuZ3RoID09IDEpIHtcbiAgICAgIHJldHVybiBnZXRFcnJvck9iamVjdCgnSW52YWxpZFRhZycsIFwiVW5jbG9zZWQgdGFnICdcIit0YWdzWzBdLnRhZ05hbWUrXCInLlwiLCBnZXRMaW5lTnVtYmVyRm9yUG9zaXRpb24oeG1sRGF0YSwgdGFnc1swXS50YWdTdGFydFBvcykpO1xuICB9ZWxzZSBpZiAodGFncy5sZW5ndGggPiAwKSB7XG4gICAgICByZXR1cm4gZ2V0RXJyb3JPYmplY3QoJ0ludmFsaWRYbWwnLCBcIkludmFsaWQgJ1wiK1xuICAgICAgICAgIEpTT04uc3RyaW5naWZ5KHRhZ3MubWFwKHQgPT4gdC50YWdOYW1lKSwgbnVsbCwgNCkucmVwbGFjZSgvXFxyP1xcbi9nLCAnJykrXG4gICAgICAgICAgXCInIGZvdW5kLlwiLCB7bGluZTogMSwgY29sOiAxfSk7XG4gIH1cblxuICByZXR1cm4gdHJ1ZTtcbn07XG5cbmZ1bmN0aW9uIGlzV2hpdGVTcGFjZShjaGFyKXtcbiAgcmV0dXJuIGNoYXIgPT09ICcgJyB8fCBjaGFyID09PSAnXFx0JyB8fCBjaGFyID09PSAnXFxuJyAgfHwgY2hhciA9PT0gJ1xccic7XG59XG4vKipcbiAqIFJlYWQgUHJvY2Vzc2luZyBpbnNzdHJ1Y3Rpb25zIGFuZCBza2lwXG4gKiBAcGFyYW0geyp9IHhtbERhdGFcbiAqIEBwYXJhbSB7Kn0gaVxuICovXG5mdW5jdGlvbiByZWFkUEkoeG1sRGF0YSwgaSkge1xuICBjb25zdCBzdGFydCA9IGk7XG4gIGZvciAoOyBpIDwgeG1sRGF0YS5sZW5ndGg7IGkrKykge1xuICAgIGlmICh4bWxEYXRhW2ldID09ICc/JyB8fCB4bWxEYXRhW2ldID09ICcgJykge1xuICAgICAgLy90YWduYW1lXG4gICAgICBjb25zdCB0YWduYW1lID0geG1sRGF0YS5zdWJzdHIoc3RhcnQsIGkgLSBzdGFydCk7XG4gICAgICBpZiAoaSA+IDUgJiYgdGFnbmFtZSA9PT0gJ3htbCcpIHtcbiAgICAgICAgcmV0dXJuIGdldEVycm9yT2JqZWN0KCdJbnZhbGlkWG1sJywgJ1hNTCBkZWNsYXJhdGlvbiBhbGxvd2VkIG9ubHkgYXQgdGhlIHN0YXJ0IG9mIHRoZSBkb2N1bWVudC4nLCBnZXRMaW5lTnVtYmVyRm9yUG9zaXRpb24oeG1sRGF0YSwgaSkpO1xuICAgICAgfSBlbHNlIGlmICh4bWxEYXRhW2ldID09ICc/JyAmJiB4bWxEYXRhW2kgKyAxXSA9PSAnPicpIHtcbiAgICAgICAgLy9jaGVjayBpZiB2YWxpZCBhdHRyaWJ1dCBzdHJpbmdcbiAgICAgICAgaSsrO1xuICAgICAgICBicmVhaztcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGNvbnRpbnVlO1xuICAgICAgfVxuICAgIH1cbiAgfVxuICByZXR1cm4gaTtcbn1cblxuZnVuY3Rpb24gcmVhZENvbW1lbnRBbmRDREFUQSh4bWxEYXRhLCBpKSB7XG4gIGlmICh4bWxEYXRhLmxlbmd0aCA+IGkgKyA1ICYmIHhtbERhdGFbaSArIDFdID09PSAnLScgJiYgeG1sRGF0YVtpICsgMl0gPT09ICctJykge1xuICAgIC8vY29tbWVudFxuICAgIGZvciAoaSArPSAzOyBpIDwgeG1sRGF0YS5sZW5ndGg7IGkrKykge1xuICAgICAgaWYgKHhtbERhdGFbaV0gPT09ICctJyAmJiB4bWxEYXRhW2kgKyAxXSA9PT0gJy0nICYmIHhtbERhdGFbaSArIDJdID09PSAnPicpIHtcbiAgICAgICAgaSArPSAyO1xuICAgICAgICBicmVhaztcbiAgICAgIH1cbiAgICB9XG4gIH0gZWxzZSBpZiAoXG4gICAgeG1sRGF0YS5sZW5ndGggPiBpICsgOCAmJlxuICAgIHhtbERhdGFbaSArIDFdID09PSAnRCcgJiZcbiAgICB4bWxEYXRhW2kgKyAyXSA9PT0gJ08nICYmXG4gICAgeG1sRGF0YVtpICsgM10gPT09ICdDJyAmJlxuICAgIHhtbERhdGFbaSArIDRdID09PSAnVCcgJiZcbiAgICB4bWxEYXRhW2kgKyA1XSA9PT0gJ1knICYmXG4gICAgeG1sRGF0YVtpICsgNl0gPT09ICdQJyAmJlxuICAgIHhtbERhdGFbaSArIDddID09PSAnRSdcbiAgKSB7XG4gICAgbGV0IGFuZ2xlQnJhY2tldHNDb3VudCA9IDE7XG4gICAgZm9yIChpICs9IDg7IGkgPCB4bWxEYXRhLmxlbmd0aDsgaSsrKSB7XG4gICAgICBpZiAoeG1sRGF0YVtpXSA9PT0gJzwnKSB7XG4gICAgICAgIGFuZ2xlQnJhY2tldHNDb3VudCsrO1xuICAgICAgfSBlbHNlIGlmICh4bWxEYXRhW2ldID09PSAnPicpIHtcbiAgICAgICAgYW5nbGVCcmFja2V0c0NvdW50LS07XG4gICAgICAgIGlmIChhbmdsZUJyYWNrZXRzQ291bnQgPT09IDApIHtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgfSBlbHNlIGlmIChcbiAgICB4bWxEYXRhLmxlbmd0aCA+IGkgKyA5ICYmXG4gICAgeG1sRGF0YVtpICsgMV0gPT09ICdbJyAmJlxuICAgIHhtbERhdGFbaSArIDJdID09PSAnQycgJiZcbiAgICB4bWxEYXRhW2kgKyAzXSA9PT0gJ0QnICYmXG4gICAgeG1sRGF0YVtpICsgNF0gPT09ICdBJyAmJlxuICAgIHhtbERhdGFbaSArIDVdID09PSAnVCcgJiZcbiAgICB4bWxEYXRhW2kgKyA2XSA9PT0gJ0EnICYmXG4gICAgeG1sRGF0YVtpICsgN10gPT09ICdbJ1xuICApIHtcbiAgICBmb3IgKGkgKz0gODsgaSA8IHhtbERhdGEubGVuZ3RoOyBpKyspIHtcbiAgICAgIGlmICh4bWxEYXRhW2ldID09PSAnXScgJiYgeG1sRGF0YVtpICsgMV0gPT09ICddJyAmJiB4bWxEYXRhW2kgKyAyXSA9PT0gJz4nKSB7XG4gICAgICAgIGkgKz0gMjtcbiAgICAgICAgYnJlYWs7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIGk7XG59XG5cbmNvbnN0IGRvdWJsZVF1b3RlID0gJ1wiJztcbmNvbnN0IHNpbmdsZVF1b3RlID0gXCInXCI7XG5cbi8qKlxuICogS2VlcCByZWFkaW5nIHhtbERhdGEgdW50aWwgJzwnIGlzIGZvdW5kIG91dHNpZGUgdGhlIGF0dHJpYnV0ZSB2YWx1ZS5cbiAqIEBwYXJhbSB7c3RyaW5nfSB4bWxEYXRhXG4gKiBAcGFyYW0ge251bWJlcn0gaVxuICovXG5mdW5jdGlvbiByZWFkQXR0cmlidXRlU3RyKHhtbERhdGEsIGkpIHtcbiAgbGV0IGF0dHJTdHIgPSAnJztcbiAgbGV0IHN0YXJ0Q2hhciA9ICcnO1xuICBsZXQgdGFnQ2xvc2VkID0gZmFsc2U7XG4gIGZvciAoOyBpIDwgeG1sRGF0YS5sZW5ndGg7IGkrKykge1xuICAgIGlmICh4bWxEYXRhW2ldID09PSBkb3VibGVRdW90ZSB8fCB4bWxEYXRhW2ldID09PSBzaW5nbGVRdW90ZSkge1xuICAgICAgaWYgKHN0YXJ0Q2hhciA9PT0gJycpIHtcbiAgICAgICAgc3RhcnRDaGFyID0geG1sRGF0YVtpXTtcbiAgICAgIH0gZWxzZSBpZiAoc3RhcnRDaGFyICE9PSB4bWxEYXRhW2ldKSB7XG4gICAgICAgIC8vaWYgdmF1ZSBpcyBlbmNsb3NlZCB3aXRoIGRvdWJsZSBxdW90ZSB0aGVuIHNpbmdsZSBxdW90ZXMgYXJlIGFsbG93ZWQgaW5zaWRlIHRoZSB2YWx1ZSBhbmQgdmljZSB2ZXJzYVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgc3RhcnRDaGFyID0gJyc7XG4gICAgICB9XG4gICAgfSBlbHNlIGlmICh4bWxEYXRhW2ldID09PSAnPicpIHtcbiAgICAgIGlmIChzdGFydENoYXIgPT09ICcnKSB7XG4gICAgICAgIHRhZ0Nsb3NlZCA9IHRydWU7XG4gICAgICAgIGJyZWFrO1xuICAgICAgfVxuICAgIH1cbiAgICBhdHRyU3RyICs9IHhtbERhdGFbaV07XG4gIH1cbiAgaWYgKHN0YXJ0Q2hhciAhPT0gJycpIHtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cblxuICByZXR1cm4ge1xuICAgIHZhbHVlOiBhdHRyU3RyLFxuICAgIGluZGV4OiBpLFxuICAgIHRhZ0Nsb3NlZDogdGFnQ2xvc2VkXG4gIH07XG59XG5cbi8qKlxuICogU2VsZWN0IGFsbCB0aGUgYXR0cmlidXRlcyB3aGV0aGVyIHZhbGlkIG9yIGludmFsaWQuXG4gKi9cbmNvbnN0IHZhbGlkQXR0clN0clJlZ3hwID0gbmV3IFJlZ0V4cCgnKFxcXFxzKikoW15cXFxccz1dKykoXFxcXHMqPSk/KFxcXFxzKihbXFwnXCJdKSgoW1xcXFxzXFxcXFNdKSo/KVxcXFw1KT8nLCAnZycpO1xuXG4vL2F0dHIsID1cInNkXCIsIGE9XCJhbWl0J3NcIiwgYT1cInNkXCJiPVwic2FmXCIsIGFiICBjZD1cIlwiXG5cbmZ1bmN0aW9uIHZhbGlkYXRlQXR0cmlidXRlU3RyaW5nKGF0dHJTdHIsIG9wdGlvbnMpIHtcbiAgLy9jb25zb2xlLmxvZyhcInN0YXJ0OlwiK2F0dHJTdHIrXCI6ZW5kXCIpO1xuXG4gIC8vaWYoYXR0clN0ci50cmltKCkubGVuZ3RoID09PSAwKSByZXR1cm4gdHJ1ZTsgLy9lbXB0eSBzdHJpbmdcblxuICBjb25zdCBtYXRjaGVzID0gdXRpbC5nZXRBbGxNYXRjaGVzKGF0dHJTdHIsIHZhbGlkQXR0clN0clJlZ3hwKTtcbiAgY29uc3QgYXR0ck5hbWVzID0ge307XG5cbiAgZm9yIChsZXQgaSA9IDA7IGkgPCBtYXRjaGVzLmxlbmd0aDsgaSsrKSB7XG4gICAgaWYgKG1hdGNoZXNbaV1bMV0ubGVuZ3RoID09PSAwKSB7XG4gICAgICAvL25vc3BhY2UgYmVmb3JlIGF0dHJpYnV0ZSBuYW1lOiBhPVwic2RcImI9XCJzYWZcIlxuICAgICAgcmV0dXJuIGdldEVycm9yT2JqZWN0KCdJbnZhbGlkQXR0cicsIFwiQXR0cmlidXRlICdcIittYXRjaGVzW2ldWzJdK1wiJyBoYXMgbm8gc3BhY2UgaW4gc3RhcnRpbmcuXCIsIGdldFBvc2l0aW9uRnJvbU1hdGNoKG1hdGNoZXNbaV0pKVxuICAgIH0gZWxzZSBpZiAobWF0Y2hlc1tpXVszXSAhPT0gdW5kZWZpbmVkICYmIG1hdGNoZXNbaV1bNF0gPT09IHVuZGVmaW5lZCkge1xuICAgICAgcmV0dXJuIGdldEVycm9yT2JqZWN0KCdJbnZhbGlkQXR0cicsIFwiQXR0cmlidXRlICdcIittYXRjaGVzW2ldWzJdK1wiJyBpcyB3aXRob3V0IHZhbHVlLlwiLCBnZXRQb3NpdGlvbkZyb21NYXRjaChtYXRjaGVzW2ldKSk7XG4gICAgfSBlbHNlIGlmIChtYXRjaGVzW2ldWzNdID09PSB1bmRlZmluZWQgJiYgIW9wdGlvbnMuYWxsb3dCb29sZWFuQXR0cmlidXRlcykge1xuICAgICAgLy9pbmRlcGVuZGVudCBhdHRyaWJ1dGU6IGFiXG4gICAgICByZXR1cm4gZ2V0RXJyb3JPYmplY3QoJ0ludmFsaWRBdHRyJywgXCJib29sZWFuIGF0dHJpYnV0ZSAnXCIrbWF0Y2hlc1tpXVsyXStcIicgaXMgbm90IGFsbG93ZWQuXCIsIGdldFBvc2l0aW9uRnJvbU1hdGNoKG1hdGNoZXNbaV0pKTtcbiAgICB9XG4gICAgLyogZWxzZSBpZihtYXRjaGVzW2ldWzZdID09PSB1bmRlZmluZWQpey8vYXR0cmlidXRlIHdpdGhvdXQgdmFsdWU6IGFiPVxuICAgICAgICAgICAgICAgICAgICByZXR1cm4geyBlcnI6IHsgY29kZTpcIkludmFsaWRBdHRyXCIsbXNnOlwiYXR0cmlidXRlIFwiICsgbWF0Y2hlc1tpXVsyXSArIFwiIGhhcyBubyB2YWx1ZSBhc3NpZ25lZC5cIn19O1xuICAgICAgICAgICAgICAgIH0gKi9cbiAgICBjb25zdCBhdHRyTmFtZSA9IG1hdGNoZXNbaV1bMl07XG4gICAgaWYgKCF2YWxpZGF0ZUF0dHJOYW1lKGF0dHJOYW1lKSkge1xuICAgICAgcmV0dXJuIGdldEVycm9yT2JqZWN0KCdJbnZhbGlkQXR0cicsIFwiQXR0cmlidXRlICdcIithdHRyTmFtZStcIicgaXMgYW4gaW52YWxpZCBuYW1lLlwiLCBnZXRQb3NpdGlvbkZyb21NYXRjaChtYXRjaGVzW2ldKSk7XG4gICAgfVxuICAgIGlmICghYXR0ck5hbWVzLmhhc093blByb3BlcnR5KGF0dHJOYW1lKSkge1xuICAgICAgLy9jaGVjayBmb3IgZHVwbGljYXRlIGF0dHJpYnV0ZS5cbiAgICAgIGF0dHJOYW1lc1thdHRyTmFtZV0gPSAxO1xuICAgIH0gZWxzZSB7XG4gICAgICByZXR1cm4gZ2V0RXJyb3JPYmplY3QoJ0ludmFsaWRBdHRyJywgXCJBdHRyaWJ1dGUgJ1wiK2F0dHJOYW1lK1wiJyBpcyByZXBlYXRlZC5cIiwgZ2V0UG9zaXRpb25Gcm9tTWF0Y2gobWF0Y2hlc1tpXSkpO1xuICAgIH1cbiAgfVxuXG4gIHJldHVybiB0cnVlO1xufVxuXG5mdW5jdGlvbiB2YWxpZGF0ZU51bWJlckFtcGVyc2FuZCh4bWxEYXRhLCBpKSB7XG4gIGxldCByZSA9IC9cXGQvO1xuICBpZiAoeG1sRGF0YVtpXSA9PT0gJ3gnKSB7XG4gICAgaSsrO1xuICAgIHJlID0gL1tcXGRhLWZBLUZdLztcbiAgfVxuICBmb3IgKDsgaSA8IHhtbERhdGEubGVuZ3RoOyBpKyspIHtcbiAgICBpZiAoeG1sRGF0YVtpXSA9PT0gJzsnKVxuICAgICAgcmV0dXJuIGk7XG4gICAgaWYgKCF4bWxEYXRhW2ldLm1hdGNoKHJlKSlcbiAgICAgIGJyZWFrO1xuICB9XG4gIHJldHVybiAtMTtcbn1cblxuZnVuY3Rpb24gdmFsaWRhdGVBbXBlcnNhbmQoeG1sRGF0YSwgaSkge1xuICAvLyBodHRwczovL3d3dy53My5vcmcvVFIveG1sLyNkdC1jaGFycmVmXG4gIGkrKztcbiAgaWYgKHhtbERhdGFbaV0gPT09ICc7JylcbiAgICByZXR1cm4gLTE7XG4gIGlmICh4bWxEYXRhW2ldID09PSAnIycpIHtcbiAgICBpKys7XG4gICAgcmV0dXJuIHZhbGlkYXRlTnVtYmVyQW1wZXJzYW5kKHhtbERhdGEsIGkpO1xuICB9XG4gIGxldCBjb3VudCA9IDA7XG4gIGZvciAoOyBpIDwgeG1sRGF0YS5sZW5ndGg7IGkrKywgY291bnQrKykge1xuICAgIGlmICh4bWxEYXRhW2ldLm1hdGNoKC9cXHcvKSAmJiBjb3VudCA8IDIwKVxuICAgICAgY29udGludWU7XG4gICAgaWYgKHhtbERhdGFbaV0gPT09ICc7JylcbiAgICAgIGJyZWFrO1xuICAgIHJldHVybiAtMTtcbiAgfVxuICByZXR1cm4gaTtcbn1cblxuZnVuY3Rpb24gZ2V0RXJyb3JPYmplY3QoY29kZSwgbWVzc2FnZSwgbGluZU51bWJlcikge1xuICByZXR1cm4ge1xuICAgIGVycjoge1xuICAgICAgY29kZTogY29kZSxcbiAgICAgIG1zZzogbWVzc2FnZSxcbiAgICAgIGxpbmU6IGxpbmVOdW1iZXIubGluZSB8fCBsaW5lTnVtYmVyLFxuICAgICAgY29sOiBsaW5lTnVtYmVyLmNvbCxcbiAgICB9LFxuICB9O1xufVxuXG5mdW5jdGlvbiB2YWxpZGF0ZUF0dHJOYW1lKGF0dHJOYW1lKSB7XG4gIHJldHVybiB1dGlsLmlzTmFtZShhdHRyTmFtZSk7XG59XG5cbi8vIGNvbnN0IHN0YXJ0c1dpdGhYTUwgPSAvXnhtbC9pO1xuXG5mdW5jdGlvbiB2YWxpZGF0ZVRhZ05hbWUodGFnbmFtZSkge1xuICByZXR1cm4gdXRpbC5pc05hbWUodGFnbmFtZSkgLyogJiYgIXRhZ25hbWUubWF0Y2goc3RhcnRzV2l0aFhNTCkgKi87XG59XG5cbi8vdGhpcyBmdW5jdGlvbiByZXR1cm5zIHRoZSBsaW5lIG51bWJlciBmb3IgdGhlIGNoYXJhY3RlciBhdCB0aGUgZ2l2ZW4gaW5kZXhcbmZ1bmN0aW9uIGdldExpbmVOdW1iZXJGb3JQb3NpdGlvbih4bWxEYXRhLCBpbmRleCkge1xuICBjb25zdCBsaW5lcyA9IHhtbERhdGEuc3Vic3RyaW5nKDAsIGluZGV4KS5zcGxpdCgvXFxyP1xcbi8pO1xuICByZXR1cm4ge1xuICAgIGxpbmU6IGxpbmVzLmxlbmd0aCxcblxuICAgIC8vIGNvbHVtbiBudW1iZXIgaXMgbGFzdCBsaW5lJ3MgbGVuZ3RoICsgMSwgYmVjYXVzZSBjb2x1bW4gbnVtYmVyaW5nIHN0YXJ0cyBhdCAxOlxuICAgIGNvbDogbGluZXNbbGluZXMubGVuZ3RoIC0gMV0ubGVuZ3RoICsgMVxuICB9O1xufVxuXG4vL3RoaXMgZnVuY3Rpb24gcmV0dXJucyB0aGUgcG9zaXRpb24gb2YgdGhlIGZpcnN0IGNoYXJhY3RlciBvZiBtYXRjaCB3aXRoaW4gYXR0clN0clxuZnVuY3Rpb24gZ2V0UG9zaXRpb25Gcm9tTWF0Y2gobWF0Y2gpIHtcbiAgcmV0dXJuIG1hdGNoLnN0YXJ0SW5kZXggKyBtYXRjaFsxXS5sZW5ndGg7XG59XG4iLAogICAgIlxuY29uc3QgZGVmYXVsdE9wdGlvbnMgPSB7XG4gICAgcHJlc2VydmVPcmRlcjogZmFsc2UsXG4gICAgYXR0cmlidXRlTmFtZVByZWZpeDogJ0BfJyxcbiAgICBhdHRyaWJ1dGVzR3JvdXBOYW1lOiBmYWxzZSxcbiAgICB0ZXh0Tm9kZU5hbWU6ICcjdGV4dCcsXG4gICAgaWdub3JlQXR0cmlidXRlczogdHJ1ZSxcbiAgICByZW1vdmVOU1ByZWZpeDogZmFsc2UsIC8vIHJlbW92ZSBOUyBmcm9tIHRhZyBuYW1lIG9yIGF0dHJpYnV0ZSBuYW1lIGlmIHRydWVcbiAgICBhbGxvd0Jvb2xlYW5BdHRyaWJ1dGVzOiBmYWxzZSwgLy9hIHRhZyBjYW4gaGF2ZSBhdHRyaWJ1dGVzIHdpdGhvdXQgYW55IHZhbHVlXG4gICAgLy9pZ25vcmVSb290RWxlbWVudCA6IGZhbHNlLFxuICAgIHBhcnNlVGFnVmFsdWU6IHRydWUsXG4gICAgcGFyc2VBdHRyaWJ1dGVWYWx1ZTogZmFsc2UsXG4gICAgdHJpbVZhbHVlczogdHJ1ZSwgLy9UcmltIHN0cmluZyB2YWx1ZXMgb2YgdGFnIGFuZCBhdHRyaWJ1dGVzXG4gICAgY2RhdGFQcm9wTmFtZTogZmFsc2UsXG4gICAgbnVtYmVyUGFyc2VPcHRpb25zOiB7XG4gICAgICBoZXg6IHRydWUsXG4gICAgICBsZWFkaW5nWmVyb3M6IHRydWUsXG4gICAgICBlTm90YXRpb246IHRydWVcbiAgICB9LFxuICAgIHRhZ1ZhbHVlUHJvY2Vzc29yOiBmdW5jdGlvbih0YWdOYW1lLCB2YWwpIHtcbiAgICAgIHJldHVybiB2YWw7XG4gICAgfSxcbiAgICBhdHRyaWJ1dGVWYWx1ZVByb2Nlc3NvcjogZnVuY3Rpb24oYXR0ck5hbWUsIHZhbCkge1xuICAgICAgcmV0dXJuIHZhbDtcbiAgICB9LFxuICAgIHN0b3BOb2RlczogW10sIC8vbmVzdGVkIHRhZ3Mgd2lsbCBub3QgYmUgcGFyc2VkIGV2ZW4gZm9yIGVycm9yc1xuICAgIGFsd2F5c0NyZWF0ZVRleHROb2RlOiBmYWxzZSxcbiAgICBpc0FycmF5OiAoKSA9PiBmYWxzZSxcbiAgICBjb21tZW50UHJvcE5hbWU6IGZhbHNlLFxuICAgIHVucGFpcmVkVGFnczogW10sXG4gICAgcHJvY2Vzc0VudGl0aWVzOiB0cnVlLFxuICAgIGh0bWxFbnRpdGllczogZmFsc2UsXG4gICAgaWdub3JlRGVjbGFyYXRpb246IGZhbHNlLFxuICAgIGlnbm9yZVBpVGFnczogZmFsc2UsXG4gICAgdHJhbnNmb3JtVGFnTmFtZTogZmFsc2UsXG4gICAgdHJhbnNmb3JtQXR0cmlidXRlTmFtZTogZmFsc2UsXG4gICAgdXBkYXRlVGFnOiBmdW5jdGlvbih0YWdOYW1lLCBqUGF0aCwgYXR0cnMpe1xuICAgICAgcmV0dXJuIHRhZ05hbWVcbiAgICB9LFxuICAgIC8vIHNraXBFbXB0eUxpc3RJdGVtOiBmYWxzZVxufTtcbiAgIFxuY29uc3QgYnVpbGRPcHRpb25zID0gZnVuY3Rpb24ob3B0aW9ucykge1xuICAgIHJldHVybiBPYmplY3QuYXNzaWduKHt9LCBkZWZhdWx0T3B0aW9ucywgb3B0aW9ucyk7XG59O1xuXG5leHBvcnRzLmJ1aWxkT3B0aW9ucyA9IGJ1aWxkT3B0aW9ucztcbmV4cG9ydHMuZGVmYXVsdE9wdGlvbnMgPSBkZWZhdWx0T3B0aW9uczsiLAogICAgIid1c2Ugc3RyaWN0JztcblxuY2xhc3MgWG1sTm9kZXtcbiAgY29uc3RydWN0b3IodGFnbmFtZSkge1xuICAgIHRoaXMudGFnbmFtZSA9IHRhZ25hbWU7XG4gICAgdGhpcy5jaGlsZCA9IFtdOyAvL25lc3RlZCB0YWdzLCB0ZXh0LCBjZGF0YSwgY29tbWVudHMgaW4gb3JkZXJcbiAgICB0aGlzW1wiOkBcIl0gPSB7fTsgLy9hdHRyaWJ1dGVzIG1hcFxuICB9XG4gIGFkZChrZXksdmFsKXtcbiAgICAvLyB0aGlzLmNoaWxkLnB1c2goIHtuYW1lIDoga2V5LCB2YWw6IHZhbCwgaXNDZGF0YTogaXNDZGF0YSB9KTtcbiAgICBpZihrZXkgPT09IFwiX19wcm90b19fXCIpIGtleSA9IFwiI19fcHJvdG9fX1wiO1xuICAgIHRoaXMuY2hpbGQucHVzaCgge1trZXldOiB2YWwgfSk7XG4gIH1cbiAgYWRkQ2hpbGQobm9kZSkge1xuICAgIGlmKG5vZGUudGFnbmFtZSA9PT0gXCJfX3Byb3RvX19cIikgbm9kZS50YWduYW1lID0gXCIjX19wcm90b19fXCI7XG4gICAgaWYobm9kZVtcIjpAXCJdICYmIE9iamVjdC5rZXlzKG5vZGVbXCI6QFwiXSkubGVuZ3RoID4gMCl7XG4gICAgICB0aGlzLmNoaWxkLnB1c2goIHsgW25vZGUudGFnbmFtZV06IG5vZGUuY2hpbGQsIFtcIjpAXCJdOiBub2RlW1wiOkBcIl0gfSk7XG4gICAgfWVsc2V7XG4gICAgICB0aGlzLmNoaWxkLnB1c2goIHsgW25vZGUudGFnbmFtZV06IG5vZGUuY2hpbGQgfSk7XG4gICAgfVxuICB9O1xufTtcblxuXG5tb2R1bGUuZXhwb3J0cyA9IFhtbE5vZGU7IiwKICAgICJjb25zdCB1dGlsID0gcmVxdWlyZSgnLi4vdXRpbCcpO1xuXG4vL1RPRE86IGhhbmRsZSBjb21tZW50c1xuZnVuY3Rpb24gcmVhZERvY1R5cGUoeG1sRGF0YSwgaSl7XG4gICAgXG4gICAgY29uc3QgZW50aXRpZXMgPSB7fTtcbiAgICBpZiggeG1sRGF0YVtpICsgM10gPT09ICdPJyAmJlxuICAgICAgICAgeG1sRGF0YVtpICsgNF0gPT09ICdDJyAmJlxuICAgICAgICAgeG1sRGF0YVtpICsgNV0gPT09ICdUJyAmJlxuICAgICAgICAgeG1sRGF0YVtpICsgNl0gPT09ICdZJyAmJlxuICAgICAgICAgeG1sRGF0YVtpICsgN10gPT09ICdQJyAmJlxuICAgICAgICAgeG1sRGF0YVtpICsgOF0gPT09ICdFJylcbiAgICB7ICAgIFxuICAgICAgICBpID0gaSs5O1xuICAgICAgICBsZXQgYW5nbGVCcmFja2V0c0NvdW50ID0gMTtcbiAgICAgICAgbGV0IGhhc0JvZHkgPSBmYWxzZSwgY29tbWVudCA9IGZhbHNlO1xuICAgICAgICBsZXQgZXhwID0gXCJcIjtcbiAgICAgICAgZm9yKDtpPHhtbERhdGEubGVuZ3RoO2krKyl7XG4gICAgICAgICAgICBpZiAoeG1sRGF0YVtpXSA9PT0gJzwnICYmICFjb21tZW50KSB7IC8vRGV0ZXJtaW5lIHRoZSB0YWcgdHlwZVxuICAgICAgICAgICAgICAgIGlmKCBoYXNCb2R5ICYmIGlzRW50aXR5KHhtbERhdGEsIGkpKXtcbiAgICAgICAgICAgICAgICAgICAgaSArPSA3OyBcbiAgICAgICAgICAgICAgICAgICAgW2VudGl0eU5hbWUsIHZhbCxpXSA9IHJlYWRFbnRpdHlFeHAoeG1sRGF0YSxpKzEpO1xuICAgICAgICAgICAgICAgICAgICBpZih2YWwuaW5kZXhPZihcIiZcIikgPT09IC0xKSAvL1BhcmFtZXRlciBlbnRpdGllcyBhcmUgbm90IHN1cHBvcnRlZFxuICAgICAgICAgICAgICAgICAgICAgICAgZW50aXRpZXNbIHZhbGlkYXRlRW50aXR5TmFtZShlbnRpdHlOYW1lKSBdID0ge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlZ3ggOiBSZWdFeHAoIGAmJHtlbnRpdHlOYW1lfTtgLFwiZ1wiKSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YWw6IHZhbFxuICAgICAgICAgICAgICAgICAgICAgICAgfTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgZWxzZSBpZiggaGFzQm9keSAmJiBpc0VsZW1lbnQoeG1sRGF0YSwgaSkpICBpICs9IDg7Ly9Ob3Qgc3VwcG9ydGVkXG4gICAgICAgICAgICAgICAgZWxzZSBpZiggaGFzQm9keSAmJiBpc0F0dGxpc3QoeG1sRGF0YSwgaSkpICBpICs9IDg7Ly9Ob3Qgc3VwcG9ydGVkXG4gICAgICAgICAgICAgICAgZWxzZSBpZiggaGFzQm9keSAmJiBpc05vdGF0aW9uKHhtbERhdGEsIGkpKSBpICs9IDk7Ly9Ob3Qgc3VwcG9ydGVkXG4gICAgICAgICAgICAgICAgZWxzZSBpZiggaXNDb21tZW50KSAgICAgICAgICAgICAgICAgICAgICAgICBjb21tZW50ID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICBlbHNlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihcIkludmFsaWQgRE9DVFlQRVwiKTtcblxuICAgICAgICAgICAgICAgIGFuZ2xlQnJhY2tldHNDb3VudCsrO1xuICAgICAgICAgICAgICAgIGV4cCA9IFwiXCI7XG4gICAgICAgICAgICB9IGVsc2UgaWYgKHhtbERhdGFbaV0gPT09ICc+JykgeyAvL1JlYWQgdGFnIGNvbnRlbnRcbiAgICAgICAgICAgICAgICBpZihjb21tZW50KXtcbiAgICAgICAgICAgICAgICAgICAgaWYoIHhtbERhdGFbaSAtIDFdID09PSBcIi1cIiAmJiB4bWxEYXRhW2kgLSAyXSA9PT0gXCItXCIpe1xuICAgICAgICAgICAgICAgICAgICAgICAgY29tbWVudCA9IGZhbHNlO1xuICAgICAgICAgICAgICAgICAgICAgICAgYW5nbGVCcmFja2V0c0NvdW50LS07XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9ZWxzZXtcbiAgICAgICAgICAgICAgICAgICAgYW5nbGVCcmFja2V0c0NvdW50LS07XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGlmIChhbmdsZUJyYWNrZXRzQ291bnQgPT09IDApIHtcbiAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1lbHNlIGlmKCB4bWxEYXRhW2ldID09PSAnWycpe1xuICAgICAgICAgICAgICAgIGhhc0JvZHkgPSB0cnVlO1xuICAgICAgICAgICAgfWVsc2V7XG4gICAgICAgICAgICAgICAgZXhwICs9IHhtbERhdGFbaV07XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgaWYoYW5nbGVCcmFja2V0c0NvdW50ICE9PSAwKXtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihgVW5jbG9zZWQgRE9DVFlQRWApO1xuICAgICAgICB9XG4gICAgfWVsc2V7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihgSW52YWxpZCBUYWcgaW5zdGVhZCBvZiBET0NUWVBFYCk7XG4gICAgfVxuICAgIHJldHVybiB7ZW50aXRpZXMsIGl9O1xufVxuXG5mdW5jdGlvbiByZWFkRW50aXR5RXhwKHhtbERhdGEsaSl7XG4gICAgLy9FeHRlcm5hbCBlbnRpdGllcyBhcmUgbm90IHN1cHBvcnRlZFxuICAgIC8vICAgIDwhRU5USVRZIGV4dCBTWVNURU0gXCJodHRwOi8vbm9ybWFsLXdlYnNpdGUuY29tXCIgPlxuXG4gICAgLy9QYXJhbWV0ZXIgZW50aXRpZXMgYXJlIG5vdCBzdXBwb3J0ZWRcbiAgICAvLyAgICA8IUVOVElUWSBlbnRpdHluYW1lIFwiJmFub3RoZXJFbGVtZW50O1wiPlxuXG4gICAgLy9JbnRlcm5hbCBlbnRpdGllcyBhcmUgc3VwcG9ydGVkXG4gICAgLy8gICAgPCFFTlRJVFkgZW50aXR5bmFtZSBcInJlcGxhY2VtZW50IHRleHRcIj5cbiAgICBcbiAgICAvL3JlYWQgRW50aXR5TmFtZVxuICAgIGxldCBlbnRpdHlOYW1lID0gXCJcIjtcbiAgICBmb3IgKDsgaSA8IHhtbERhdGEubGVuZ3RoICYmICh4bWxEYXRhW2ldICE9PSBcIidcIiAmJiB4bWxEYXRhW2ldICE9PSAnXCInICk7IGkrKykge1xuICAgICAgICAvLyBpZih4bWxEYXRhW2ldID09PSBcIiBcIikgY29udGludWU7XG4gICAgICAgIC8vIGVsc2UgXG4gICAgICAgIGVudGl0eU5hbWUgKz0geG1sRGF0YVtpXTtcbiAgICB9XG4gICAgZW50aXR5TmFtZSA9IGVudGl0eU5hbWUudHJpbSgpO1xuICAgIGlmKGVudGl0eU5hbWUuaW5kZXhPZihcIiBcIikgIT09IC0xKSB0aHJvdyBuZXcgRXJyb3IoXCJFeHRlcm5hbCBlbnRpdGVzIGFyZSBub3Qgc3VwcG9ydGVkXCIpO1xuXG4gICAgLy9yZWFkIEVudGl0eSBWYWx1ZVxuICAgIGNvbnN0IHN0YXJ0Q2hhciA9IHhtbERhdGFbaSsrXTtcbiAgICBsZXQgdmFsID0gXCJcIlxuICAgIGZvciAoOyBpIDwgeG1sRGF0YS5sZW5ndGggJiYgeG1sRGF0YVtpXSAhPT0gc3RhcnRDaGFyIDsgaSsrKSB7XG4gICAgICAgIHZhbCArPSB4bWxEYXRhW2ldO1xuICAgIH1cbiAgICByZXR1cm4gW2VudGl0eU5hbWUsIHZhbCwgaV07XG59XG5cbmZ1bmN0aW9uIGlzQ29tbWVudCh4bWxEYXRhLCBpKXtcbiAgICBpZih4bWxEYXRhW2krMV0gPT09ICchJyAmJlxuICAgIHhtbERhdGFbaSsyXSA9PT0gJy0nICYmXG4gICAgeG1sRGF0YVtpKzNdID09PSAnLScpIHJldHVybiB0cnVlXG4gICAgcmV0dXJuIGZhbHNlXG59XG5mdW5jdGlvbiBpc0VudGl0eSh4bWxEYXRhLCBpKXtcbiAgICBpZih4bWxEYXRhW2krMV0gPT09ICchJyAmJlxuICAgIHhtbERhdGFbaSsyXSA9PT0gJ0UnICYmXG4gICAgeG1sRGF0YVtpKzNdID09PSAnTicgJiZcbiAgICB4bWxEYXRhW2krNF0gPT09ICdUJyAmJlxuICAgIHhtbERhdGFbaSs1XSA9PT0gJ0knICYmXG4gICAgeG1sRGF0YVtpKzZdID09PSAnVCcgJiZcbiAgICB4bWxEYXRhW2krN10gPT09ICdZJykgcmV0dXJuIHRydWVcbiAgICByZXR1cm4gZmFsc2Vcbn1cbmZ1bmN0aW9uIGlzRWxlbWVudCh4bWxEYXRhLCBpKXtcbiAgICBpZih4bWxEYXRhW2krMV0gPT09ICchJyAmJlxuICAgIHhtbERhdGFbaSsyXSA9PT0gJ0UnICYmXG4gICAgeG1sRGF0YVtpKzNdID09PSAnTCcgJiZcbiAgICB4bWxEYXRhW2krNF0gPT09ICdFJyAmJlxuICAgIHhtbERhdGFbaSs1XSA9PT0gJ00nICYmXG4gICAgeG1sRGF0YVtpKzZdID09PSAnRScgJiZcbiAgICB4bWxEYXRhW2krN10gPT09ICdOJyAmJlxuICAgIHhtbERhdGFbaSs4XSA9PT0gJ1QnKSByZXR1cm4gdHJ1ZVxuICAgIHJldHVybiBmYWxzZVxufVxuXG5mdW5jdGlvbiBpc0F0dGxpc3QoeG1sRGF0YSwgaSl7XG4gICAgaWYoeG1sRGF0YVtpKzFdID09PSAnIScgJiZcbiAgICB4bWxEYXRhW2krMl0gPT09ICdBJyAmJlxuICAgIHhtbERhdGFbaSszXSA9PT0gJ1QnICYmXG4gICAgeG1sRGF0YVtpKzRdID09PSAnVCcgJiZcbiAgICB4bWxEYXRhW2krNV0gPT09ICdMJyAmJlxuICAgIHhtbERhdGFbaSs2XSA9PT0gJ0knICYmXG4gICAgeG1sRGF0YVtpKzddID09PSAnUycgJiZcbiAgICB4bWxEYXRhW2krOF0gPT09ICdUJykgcmV0dXJuIHRydWVcbiAgICByZXR1cm4gZmFsc2Vcbn1cbmZ1bmN0aW9uIGlzTm90YXRpb24oeG1sRGF0YSwgaSl7XG4gICAgaWYoeG1sRGF0YVtpKzFdID09PSAnIScgJiZcbiAgICB4bWxEYXRhW2krMl0gPT09ICdOJyAmJlxuICAgIHhtbERhdGFbaSszXSA9PT0gJ08nICYmXG4gICAgeG1sRGF0YVtpKzRdID09PSAnVCcgJiZcbiAgICB4bWxEYXRhW2krNV0gPT09ICdBJyAmJlxuICAgIHhtbERhdGFbaSs2XSA9PT0gJ1QnICYmXG4gICAgeG1sRGF0YVtpKzddID09PSAnSScgJiZcbiAgICB4bWxEYXRhW2krOF0gPT09ICdPJyAmJlxuICAgIHhtbERhdGFbaSs5XSA9PT0gJ04nKSByZXR1cm4gdHJ1ZVxuICAgIHJldHVybiBmYWxzZVxufVxuXG5mdW5jdGlvbiB2YWxpZGF0ZUVudGl0eU5hbWUobmFtZSl7XG4gICAgaWYgKHV0aWwuaXNOYW1lKG5hbWUpKVxuXHRyZXR1cm4gbmFtZTtcbiAgICBlbHNlXG4gICAgICAgIHRocm93IG5ldyBFcnJvcihgSW52YWxpZCBlbnRpdHkgbmFtZSAke25hbWV9YCk7XG59XG5cbm1vZHVsZS5leHBvcnRzID0gcmVhZERvY1R5cGU7XG4iLAogICAgImNvbnN0IGhleFJlZ2V4ID0gL15bLStdPzB4W2EtZkEtRjAtOV0rJC87XG5jb25zdCBudW1SZWdleCA9IC9eKFtcXC1cXCtdKT8oMCopKFxcLlswLTldKyhbZUVdXFwtP1swLTldKyk/fFswLTldKyhcXC5bMC05XSsoW2VFXVxcLT9bMC05XSspPyk/KSQvO1xuLy8gY29uc3Qgb2N0UmVnZXggPSAvMHhbYS16MC05XSsvO1xuLy8gY29uc3QgYmluUmVnZXggPSAvMHhbYS16MC05XSsvO1xuXG5cbi8vcG9seWZpbGxcbmlmICghTnVtYmVyLnBhcnNlSW50ICYmIHdpbmRvdy5wYXJzZUludCkge1xuICAgIE51bWJlci5wYXJzZUludCA9IHdpbmRvdy5wYXJzZUludDtcbn1cbmlmICghTnVtYmVyLnBhcnNlRmxvYXQgJiYgd2luZG93LnBhcnNlRmxvYXQpIHtcbiAgICBOdW1iZXIucGFyc2VGbG9hdCA9IHdpbmRvdy5wYXJzZUZsb2F0O1xufVxuXG4gIFxuY29uc3QgY29uc2lkZXIgPSB7XG4gICAgaGV4IDogIHRydWUsXG4gICAgbGVhZGluZ1plcm9zOiB0cnVlLFxuICAgIGRlY2ltYWxQb2ludDogXCJcXC5cIixcbiAgICBlTm90YXRpb246IHRydWVcbiAgICAvL3NraXBMaWtlOiAvcmVnZXgvXG59O1xuXG5mdW5jdGlvbiB0b051bWJlcihzdHIsIG9wdGlvbnMgPSB7fSl7XG4gICAgLy8gY29uc3Qgb3B0aW9ucyA9IE9iamVjdC5hc3NpZ24oe30sIGNvbnNpZGVyKTtcbiAgICAvLyBpZihvcHQubGVhZGluZ1plcm9zID09PSBmYWxzZSl7XG4gICAgLy8gICAgIG9wdGlvbnMubGVhZGluZ1plcm9zID0gZmFsc2U7XG4gICAgLy8gfWVsc2UgaWYob3B0LmhleCA9PT0gZmFsc2Upe1xuICAgIC8vICAgICBvcHRpb25zLmhleCA9IGZhbHNlO1xuICAgIC8vIH1cblxuICAgIG9wdGlvbnMgPSBPYmplY3QuYXNzaWduKHt9LCBjb25zaWRlciwgb3B0aW9ucyApO1xuICAgIGlmKCFzdHIgfHwgdHlwZW9mIHN0ciAhPT0gXCJzdHJpbmdcIiApIHJldHVybiBzdHI7XG4gICAgXG4gICAgbGV0IHRyaW1tZWRTdHIgID0gc3RyLnRyaW0oKTtcbiAgICAvLyBpZih0cmltbWVkU3RyID09PSBcIjAuMFwiKSByZXR1cm4gMDtcbiAgICAvLyBlbHNlIGlmKHRyaW1tZWRTdHIgPT09IFwiKzAuMFwiKSByZXR1cm4gMDtcbiAgICAvLyBlbHNlIGlmKHRyaW1tZWRTdHIgPT09IFwiLTAuMFwiKSByZXR1cm4gLTA7XG5cbiAgICBpZihvcHRpb25zLnNraXBMaWtlICE9PSB1bmRlZmluZWQgJiYgb3B0aW9ucy5za2lwTGlrZS50ZXN0KHRyaW1tZWRTdHIpKSByZXR1cm4gc3RyO1xuICAgIGVsc2UgaWYgKG9wdGlvbnMuaGV4ICYmIGhleFJlZ2V4LnRlc3QodHJpbW1lZFN0cikpIHtcbiAgICAgICAgcmV0dXJuIE51bWJlci5wYXJzZUludCh0cmltbWVkU3RyLCAxNik7XG4gICAgLy8gfSBlbHNlIGlmIChvcHRpb25zLnBhcnNlT2N0ICYmIG9jdFJlZ2V4LnRlc3Qoc3RyKSkge1xuICAgIC8vICAgICByZXR1cm4gTnVtYmVyLnBhcnNlSW50KHZhbCwgOCk7XG4gICAgLy8gfWVsc2UgaWYgKG9wdGlvbnMucGFyc2VCaW4gJiYgYmluUmVnZXgudGVzdChzdHIpKSB7XG4gICAgLy8gICAgIHJldHVybiBOdW1iZXIucGFyc2VJbnQodmFsLCAyKTtcbiAgICB9ZWxzZXtcbiAgICAgICAgLy9zZXBhcmF0ZSBuZWdhdGl2ZSBzaWduLCBsZWFkaW5nIHplcm9zLCBhbmQgcmVzdCBudW1iZXJcbiAgICAgICAgY29uc3QgbWF0Y2ggPSBudW1SZWdleC5leGVjKHRyaW1tZWRTdHIpO1xuICAgICAgICBpZihtYXRjaCl7XG4gICAgICAgICAgICBjb25zdCBzaWduID0gbWF0Y2hbMV07XG4gICAgICAgICAgICBjb25zdCBsZWFkaW5nWmVyb3MgPSBtYXRjaFsyXTtcbiAgICAgICAgICAgIGxldCBudW1UcmltbWVkQnlaZXJvcyA9IHRyaW1aZXJvcyhtYXRjaFszXSk7IC8vY29tcGxldGUgbnVtIHdpdGhvdXQgbGVhZGluZyB6ZXJvc1xuICAgICAgICAgICAgLy90cmltIGVuZGluZyB6ZXJvcyBmb3IgZmxvYXRpbmcgbnVtYmVyXG4gICAgICAgICAgICBcbiAgICAgICAgICAgIGNvbnN0IGVOb3RhdGlvbiA9IG1hdGNoWzRdIHx8IG1hdGNoWzZdO1xuICAgICAgICAgICAgaWYoIW9wdGlvbnMubGVhZGluZ1plcm9zICYmIGxlYWRpbmdaZXJvcy5sZW5ndGggPiAwICYmIHNpZ24gJiYgdHJpbW1lZFN0clsyXSAhPT0gXCIuXCIpIHJldHVybiBzdHI7IC8vLTAxMjNcbiAgICAgICAgICAgIGVsc2UgaWYoIW9wdGlvbnMubGVhZGluZ1plcm9zICYmIGxlYWRpbmdaZXJvcy5sZW5ndGggPiAwICYmICFzaWduICYmIHRyaW1tZWRTdHJbMV0gIT09IFwiLlwiKSByZXR1cm4gc3RyOyAvLzAxMjNcbiAgICAgICAgICAgIGVsc2V7Ly9ubyBsZWFkaW5nIHplcm9zIG9yIGxlYWRpbmcgemVyb3MgYXJlIGFsbG93ZWRcbiAgICAgICAgICAgICAgICBjb25zdCBudW0gPSBOdW1iZXIodHJpbW1lZFN0cik7XG4gICAgICAgICAgICAgICAgY29uc3QgbnVtU3RyID0gXCJcIiArIG51bTtcbiAgICAgICAgICAgICAgICBpZihudW1TdHIuc2VhcmNoKC9bZUVdLykgIT09IC0xKXsgLy9naXZlbiBudW1iZXIgaXMgbG9uZyBhbmQgcGFyc2VkIHRvIGVOb3RhdGlvblxuICAgICAgICAgICAgICAgICAgICBpZihvcHRpb25zLmVOb3RhdGlvbikgcmV0dXJuIG51bTtcbiAgICAgICAgICAgICAgICAgICAgZWxzZSByZXR1cm4gc3RyO1xuICAgICAgICAgICAgICAgIH1lbHNlIGlmKGVOb3RhdGlvbil7IC8vZ2l2ZW4gbnVtYmVyIGhhcyBlbm90YXRpb25cbiAgICAgICAgICAgICAgICAgICAgaWYob3B0aW9ucy5lTm90YXRpb24pIHJldHVybiBudW07XG4gICAgICAgICAgICAgICAgICAgIGVsc2UgcmV0dXJuIHN0cjtcbiAgICAgICAgICAgICAgICB9ZWxzZSBpZih0cmltbWVkU3RyLmluZGV4T2YoXCIuXCIpICE9PSAtMSl7IC8vZmxvYXRpbmcgbnVtYmVyXG4gICAgICAgICAgICAgICAgICAgIC8vIGNvbnN0IGRlY2ltYWxQYXJ0ID0gbWF0Y2hbNV0uc3Vic3RyKDEpO1xuICAgICAgICAgICAgICAgICAgICAvLyBjb25zdCBpbnRQYXJ0ID0gdHJpbW1lZFN0ci5zdWJzdHIoMCx0cmltbWVkU3RyLmluZGV4T2YoXCIuXCIpKTtcblxuICAgICAgICAgICAgICAgICAgICBcbiAgICAgICAgICAgICAgICAgICAgLy8gY29uc3QgcCA9IG51bVN0ci5pbmRleE9mKFwiLlwiKTtcbiAgICAgICAgICAgICAgICAgICAgLy8gY29uc3QgZ2l2ZW5JbnRQYXJ0ID0gbnVtU3RyLnN1YnN0cigwLHApO1xuICAgICAgICAgICAgICAgICAgICAvLyBjb25zdCBnaXZlbkRlY1BhcnQgPSBudW1TdHIuc3Vic3RyKHArMSk7XG4gICAgICAgICAgICAgICAgICAgIGlmKG51bVN0ciA9PT0gXCIwXCIgJiYgKG51bVRyaW1tZWRCeVplcm9zID09PSBcIlwiKSApIHJldHVybiBudW07IC8vMC4wXG4gICAgICAgICAgICAgICAgICAgIGVsc2UgaWYobnVtU3RyID09PSBudW1UcmltbWVkQnlaZXJvcykgcmV0dXJuIG51bTsgLy8wLjQ1Ni4gMC43OTAwMFxuICAgICAgICAgICAgICAgICAgICBlbHNlIGlmKCBzaWduICYmIG51bVN0ciA9PT0gXCItXCIrbnVtVHJpbW1lZEJ5WmVyb3MpIHJldHVybiBudW07XG4gICAgICAgICAgICAgICAgICAgIGVsc2UgcmV0dXJuIHN0cjtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgXG4gICAgICAgICAgICAgICAgaWYobGVhZGluZ1plcm9zKXtcbiAgICAgICAgICAgICAgICAgICAgLy8gaWYobnVtVHJpbW1lZEJ5WmVyb3MgPT09IG51bVN0cil7XG4gICAgICAgICAgICAgICAgICAgIC8vICAgICBpZihvcHRpb25zLmxlYWRpbmdaZXJvcykgcmV0dXJuIG51bTtcbiAgICAgICAgICAgICAgICAgICAgLy8gICAgIGVsc2UgcmV0dXJuIHN0cjtcbiAgICAgICAgICAgICAgICAgICAgLy8gfWVsc2UgcmV0dXJuIHN0cjtcbiAgICAgICAgICAgICAgICAgICAgaWYobnVtVHJpbW1lZEJ5WmVyb3MgPT09IG51bVN0cikgcmV0dXJuIG51bTtcbiAgICAgICAgICAgICAgICAgICAgZWxzZSBpZihzaWduK251bVRyaW1tZWRCeVplcm9zID09PSBudW1TdHIpIHJldHVybiBudW07XG4gICAgICAgICAgICAgICAgICAgIGVsc2UgcmV0dXJuIHN0cjtcbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICBpZih0cmltbWVkU3RyID09PSBudW1TdHIpIHJldHVybiBudW07XG4gICAgICAgICAgICAgICAgZWxzZSBpZih0cmltbWVkU3RyID09PSBzaWduK251bVN0cikgcmV0dXJuIG51bTtcbiAgICAgICAgICAgICAgICAvLyBlbHNle1xuICAgICAgICAgICAgICAgIC8vICAgICAvL251bWJlciB3aXRoICsvLSBzaWduXG4gICAgICAgICAgICAgICAgLy8gICAgIHRyaW1tZWRTdHIudGVzdCgvWy0rXVswLTldKTtcblxuICAgICAgICAgICAgICAgIC8vIH1cbiAgICAgICAgICAgICAgICByZXR1cm4gc3RyO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgLy8gZWxzZSBpZighZU5vdGF0aW9uICYmIHRyaW1tZWRTdHIgJiYgdHJpbW1lZFN0ciAhPT0gTnVtYmVyKHRyaW1tZWRTdHIpICkgcmV0dXJuIHN0cjtcbiAgICAgICAgICAgIFxuICAgICAgICB9ZWxzZXsgLy9ub24tbnVtZXJpYyBzdHJpbmdcbiAgICAgICAgICAgIHJldHVybiBzdHI7XG4gICAgICAgIH1cbiAgICB9XG59XG5cbi8qKlxuICogXG4gKiBAcGFyYW0ge3N0cmluZ30gbnVtU3RyIHdpdGhvdXQgbGVhZGluZyB6ZXJvc1xuICogQHJldHVybnMgXG4gKi9cbmZ1bmN0aW9uIHRyaW1aZXJvcyhudW1TdHIpe1xuICAgIGlmKG51bVN0ciAmJiBudW1TdHIuaW5kZXhPZihcIi5cIikgIT09IC0xKXsvL2Zsb2F0XG4gICAgICAgIG51bVN0ciA9IG51bVN0ci5yZXBsYWNlKC8wKyQvLCBcIlwiKTsgLy9yZW1vdmUgZW5kaW5nIHplcm9zXG4gICAgICAgIGlmKG51bVN0ciA9PT0gXCIuXCIpICBudW1TdHIgPSBcIjBcIjtcbiAgICAgICAgZWxzZSBpZihudW1TdHJbMF0gPT09IFwiLlwiKSAgbnVtU3RyID0gXCIwXCIrbnVtU3RyO1xuICAgICAgICBlbHNlIGlmKG51bVN0cltudW1TdHIubGVuZ3RoLTFdID09PSBcIi5cIikgIG51bVN0ciA9IG51bVN0ci5zdWJzdHIoMCxudW1TdHIubGVuZ3RoLTEpO1xuICAgICAgICByZXR1cm4gbnVtU3RyO1xuICAgIH1cbiAgICByZXR1cm4gbnVtU3RyO1xufVxubW9kdWxlLmV4cG9ydHMgPSB0b051bWJlclxuIiwKICAgICJmdW5jdGlvbiBnZXRJZ25vcmVBdHRyaWJ1dGVzRm4oaWdub3JlQXR0cmlidXRlcykge1xuICAgIGlmICh0eXBlb2YgaWdub3JlQXR0cmlidXRlcyA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICByZXR1cm4gaWdub3JlQXR0cmlidXRlc1xuICAgIH1cbiAgICBpZiAoQXJyYXkuaXNBcnJheShpZ25vcmVBdHRyaWJ1dGVzKSkge1xuICAgICAgICByZXR1cm4gKGF0dHJOYW1lKSA9PiB7XG4gICAgICAgICAgICBmb3IgKGNvbnN0IHBhdHRlcm4gb2YgaWdub3JlQXR0cmlidXRlcykge1xuICAgICAgICAgICAgICAgIGlmICh0eXBlb2YgcGF0dGVybiA9PT0gJ3N0cmluZycgJiYgYXR0ck5hbWUgPT09IHBhdHRlcm4pIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRydWVcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgaWYgKHBhdHRlcm4gaW5zdGFuY2VvZiBSZWdFeHAgJiYgcGF0dGVybi50ZXN0KGF0dHJOYW1lKSkge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gKCkgPT4gZmFsc2Vcbn1cblxubW9kdWxlLmV4cG9ydHMgPSBnZXRJZ25vcmVBdHRyaWJ1dGVzRm4iLAogICAgIid1c2Ugc3RyaWN0Jztcbi8vL0B0cy1jaGVja1xuXG5jb25zdCB1dGlsID0gcmVxdWlyZSgnLi4vdXRpbCcpO1xuY29uc3QgeG1sTm9kZSA9IHJlcXVpcmUoJy4veG1sTm9kZScpO1xuY29uc3QgcmVhZERvY1R5cGUgPSByZXF1aXJlKFwiLi9Eb2NUeXBlUmVhZGVyXCIpO1xuY29uc3QgdG9OdW1iZXIgPSByZXF1aXJlKFwic3RybnVtXCIpO1xuY29uc3QgZ2V0SWdub3JlQXR0cmlidXRlc0ZuID0gcmVxdWlyZSgnLi4vaWdub3JlQXR0cmlidXRlcycpXG5cbi8vIGNvbnN0IHJlZ3ggPVxuLy8gICAnPCgoIVxcXFxbQ0RBVEFcXFxcWyhbXFxcXHNcXFxcU10qPykoXV0+KSl8KChOQU1FOik/KE5BTUUpKShbXj5dKik+fCgoXFxcXC8pKE5BTUUpXFxcXHMqPikpKFtePF0qKSdcbi8vICAgLnJlcGxhY2UoL05BTUUvZywgdXRpbC5uYW1lUmVnZXhwKTtcblxuLy9jb25zdCB0YWdzUmVneCA9IG5ldyBSZWdFeHAoXCI8KFxcXFwvP1tcXFxcdzpcXFxcLVxcLl9dKykoW14+XSopPihcXFxccypcIitjZGF0YVJlZ3grXCIpKihbXjxdKyk/XCIsXCJnXCIpO1xuLy9jb25zdCB0YWdzUmVneCA9IG5ldyBSZWdFeHAoXCI8KFxcXFwvPykoKFxcXFx3KjopPyhbXFxcXHc6XFxcXC1cXC5fXSspKShbXj5dKik+KFtePF0qKShcIitjZGF0YVJlZ3grXCIoW148XSopKSooW148XSspP1wiLFwiZ1wiKTtcblxuY2xhc3MgT3JkZXJlZE9ialBhcnNlcntcbiAgY29uc3RydWN0b3Iob3B0aW9ucyl7XG4gICAgdGhpcy5vcHRpb25zID0gb3B0aW9ucztcbiAgICB0aGlzLmN1cnJlbnROb2RlID0gbnVsbDtcbiAgICB0aGlzLnRhZ3NOb2RlU3RhY2sgPSBbXTtcbiAgICB0aGlzLmRvY1R5cGVFbnRpdGllcyA9IHt9O1xuICAgIHRoaXMubGFzdEVudGl0aWVzID0ge1xuICAgICAgXCJhcG9zXCIgOiB7IHJlZ2V4OiAvJihhcG9zfCMzOXwjeDI3KTsvZywgdmFsIDogXCInXCJ9LFxuICAgICAgXCJndFwiIDogeyByZWdleDogLyYoZ3R8IzYyfCN4M0UpOy9nLCB2YWwgOiBcIj5cIn0sXG4gICAgICBcImx0XCIgOiB7IHJlZ2V4OiAvJihsdHwjNjB8I3gzQyk7L2csIHZhbCA6IFwiPFwifSxcbiAgICAgIFwicXVvdFwiIDogeyByZWdleDogLyYocXVvdHwjMzR8I3gyMik7L2csIHZhbCA6IFwiXFxcIlwifSxcbiAgICB9O1xuICAgIHRoaXMuYW1wRW50aXR5ID0geyByZWdleDogLyYoYW1wfCMzOHwjeDI2KTsvZywgdmFsIDogXCImXCJ9O1xuICAgIHRoaXMuaHRtbEVudGl0aWVzID0ge1xuICAgICAgXCJzcGFjZVwiOiB7IHJlZ2V4OiAvJihuYnNwfCMxNjApOy9nLCB2YWw6IFwiIFwiIH0sXG4gICAgICAvLyBcImx0XCIgOiB7IHJlZ2V4OiAvJihsdHwjNjApOy9nLCB2YWw6IFwiPFwiIH0sXG4gICAgICAvLyBcImd0XCIgOiB7IHJlZ2V4OiAvJihndHwjNjIpOy9nLCB2YWw6IFwiPlwiIH0sXG4gICAgICAvLyBcImFtcFwiIDogeyByZWdleDogLyYoYW1wfCMzOCk7L2csIHZhbDogXCImXCIgfSxcbiAgICAgIC8vIFwicXVvdFwiIDogeyByZWdleDogLyYocXVvdHwjMzQpOy9nLCB2YWw6IFwiXFxcIlwiIH0sXG4gICAgICAvLyBcImFwb3NcIiA6IHsgcmVnZXg6IC8mKGFwb3N8IzM5KTsvZywgdmFsOiBcIidcIiB9LFxuICAgICAgXCJjZW50XCIgOiB7IHJlZ2V4OiAvJihjZW50fCMxNjIpOy9nLCB2YWw6IFwiwqJcIiB9LFxuICAgICAgXCJwb3VuZFwiIDogeyByZWdleDogLyYocG91bmR8IzE2Myk7L2csIHZhbDogXCLCo1wiIH0sXG4gICAgICBcInllblwiIDogeyByZWdleDogLyYoeWVufCMxNjUpOy9nLCB2YWw6IFwiwqVcIiB9LFxuICAgICAgXCJldXJvXCIgOiB7IHJlZ2V4OiAvJihldXJvfCM4MzY0KTsvZywgdmFsOiBcIuKCrFwiIH0sXG4gICAgICBcImNvcHlyaWdodFwiIDogeyByZWdleDogLyYoY29weXwjMTY5KTsvZywgdmFsOiBcIsKpXCIgfSxcbiAgICAgIFwicmVnXCIgOiB7IHJlZ2V4OiAvJihyZWd8IzE3NCk7L2csIHZhbDogXCLCrlwiIH0sXG4gICAgICBcImluclwiIDogeyByZWdleDogLyYoaW5yfCM4Mzc3KTsvZywgdmFsOiBcIuKCuVwiIH0sXG4gICAgICBcIm51bV9kZWNcIjogeyByZWdleDogLyYjKFswLTldezEsN30pOy9nLCB2YWwgOiAoXywgc3RyKSA9PiBTdHJpbmcuZnJvbUNoYXJDb2RlKE51bWJlci5wYXJzZUludChzdHIsIDEwKSkgfSxcbiAgICAgIFwibnVtX2hleFwiOiB7IHJlZ2V4OiAvJiN4KFswLTlhLWZBLUZdezEsNn0pOy9nLCB2YWwgOiAoXywgc3RyKSA9PiBTdHJpbmcuZnJvbUNoYXJDb2RlKE51bWJlci5wYXJzZUludChzdHIsIDE2KSkgfSxcbiAgICB9O1xuICAgIHRoaXMuYWRkRXh0ZXJuYWxFbnRpdGllcyA9IGFkZEV4dGVybmFsRW50aXRpZXM7XG4gICAgdGhpcy5wYXJzZVhtbCA9IHBhcnNlWG1sO1xuICAgIHRoaXMucGFyc2VUZXh0RGF0YSA9IHBhcnNlVGV4dERhdGE7XG4gICAgdGhpcy5yZXNvbHZlTmFtZVNwYWNlID0gcmVzb2x2ZU5hbWVTcGFjZTtcbiAgICB0aGlzLmJ1aWxkQXR0cmlidXRlc01hcCA9IGJ1aWxkQXR0cmlidXRlc01hcDtcbiAgICB0aGlzLmlzSXRTdG9wTm9kZSA9IGlzSXRTdG9wTm9kZTtcbiAgICB0aGlzLnJlcGxhY2VFbnRpdGllc1ZhbHVlID0gcmVwbGFjZUVudGl0aWVzVmFsdWU7XG4gICAgdGhpcy5yZWFkU3RvcE5vZGVEYXRhID0gcmVhZFN0b3BOb2RlRGF0YTtcbiAgICB0aGlzLnNhdmVUZXh0VG9QYXJlbnRUYWcgPSBzYXZlVGV4dFRvUGFyZW50VGFnO1xuICAgIHRoaXMuYWRkQ2hpbGQgPSBhZGRDaGlsZDtcbiAgICB0aGlzLmlnbm9yZUF0dHJpYnV0ZXNGbiA9IGdldElnbm9yZUF0dHJpYnV0ZXNGbih0aGlzLm9wdGlvbnMuaWdub3JlQXR0cmlidXRlcylcbiAgfVxuXG59XG5cbmZ1bmN0aW9uIGFkZEV4dGVybmFsRW50aXRpZXMoZXh0ZXJuYWxFbnRpdGllcyl7XG4gIGNvbnN0IGVudEtleXMgPSBPYmplY3Qua2V5cyhleHRlcm5hbEVudGl0aWVzKTtcbiAgZm9yIChsZXQgaSA9IDA7IGkgPCBlbnRLZXlzLmxlbmd0aDsgaSsrKSB7XG4gICAgY29uc3QgZW50ID0gZW50S2V5c1tpXTtcbiAgICB0aGlzLmxhc3RFbnRpdGllc1tlbnRdID0ge1xuICAgICAgIHJlZ2V4OiBuZXcgUmVnRXhwKFwiJlwiK2VudCtcIjtcIixcImdcIiksXG4gICAgICAgdmFsIDogZXh0ZXJuYWxFbnRpdGllc1tlbnRdXG4gICAgfVxuICB9XG59XG5cbi8qKlxuICogQHBhcmFtIHtzdHJpbmd9IHZhbFxuICogQHBhcmFtIHtzdHJpbmd9IHRhZ05hbWVcbiAqIEBwYXJhbSB7c3RyaW5nfSBqUGF0aFxuICogQHBhcmFtIHtib29sZWFufSBkb250VHJpbVxuICogQHBhcmFtIHtib29sZWFufSBoYXNBdHRyaWJ1dGVzXG4gKiBAcGFyYW0ge2Jvb2xlYW59IGlzTGVhZk5vZGVcbiAqIEBwYXJhbSB7Ym9vbGVhbn0gZXNjYXBlRW50aXRpZXNcbiAqL1xuZnVuY3Rpb24gcGFyc2VUZXh0RGF0YSh2YWwsIHRhZ05hbWUsIGpQYXRoLCBkb250VHJpbSwgaGFzQXR0cmlidXRlcywgaXNMZWFmTm9kZSwgZXNjYXBlRW50aXRpZXMpIHtcbiAgaWYgKHZhbCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgaWYgKHRoaXMub3B0aW9ucy50cmltVmFsdWVzICYmICFkb250VHJpbSkge1xuICAgICAgdmFsID0gdmFsLnRyaW0oKTtcbiAgICB9XG4gICAgaWYodmFsLmxlbmd0aCA+IDApe1xuICAgICAgaWYoIWVzY2FwZUVudGl0aWVzKSB2YWwgPSB0aGlzLnJlcGxhY2VFbnRpdGllc1ZhbHVlKHZhbCk7XG4gICAgICBcbiAgICAgIGNvbnN0IG5ld3ZhbCA9IHRoaXMub3B0aW9ucy50YWdWYWx1ZVByb2Nlc3Nvcih0YWdOYW1lLCB2YWwsIGpQYXRoLCBoYXNBdHRyaWJ1dGVzLCBpc0xlYWZOb2RlKTtcbiAgICAgIGlmKG5ld3ZhbCA9PT0gbnVsbCB8fCBuZXd2YWwgPT09IHVuZGVmaW5lZCl7XG4gICAgICAgIC8vZG9uJ3QgcGFyc2VcbiAgICAgICAgcmV0dXJuIHZhbDtcbiAgICAgIH1lbHNlIGlmKHR5cGVvZiBuZXd2YWwgIT09IHR5cGVvZiB2YWwgfHwgbmV3dmFsICE9PSB2YWwpe1xuICAgICAgICAvL292ZXJ3cml0ZVxuICAgICAgICByZXR1cm4gbmV3dmFsO1xuICAgICAgfWVsc2UgaWYodGhpcy5vcHRpb25zLnRyaW1WYWx1ZXMpe1xuICAgICAgICByZXR1cm4gcGFyc2VWYWx1ZSh2YWwsIHRoaXMub3B0aW9ucy5wYXJzZVRhZ1ZhbHVlLCB0aGlzLm9wdGlvbnMubnVtYmVyUGFyc2VPcHRpb25zKTtcbiAgICAgIH1lbHNle1xuICAgICAgICBjb25zdCB0cmltbWVkVmFsID0gdmFsLnRyaW0oKTtcbiAgICAgICAgaWYodHJpbW1lZFZhbCA9PT0gdmFsKXtcbiAgICAgICAgICByZXR1cm4gcGFyc2VWYWx1ZSh2YWwsIHRoaXMub3B0aW9ucy5wYXJzZVRhZ1ZhbHVlLCB0aGlzLm9wdGlvbnMubnVtYmVyUGFyc2VPcHRpb25zKTtcbiAgICAgICAgfWVsc2V7XG4gICAgICAgICAgcmV0dXJuIHZhbDtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgfVxufVxuXG5mdW5jdGlvbiByZXNvbHZlTmFtZVNwYWNlKHRhZ25hbWUpIHtcbiAgaWYgKHRoaXMub3B0aW9ucy5yZW1vdmVOU1ByZWZpeCkge1xuICAgIGNvbnN0IHRhZ3MgPSB0YWduYW1lLnNwbGl0KCc6Jyk7XG4gICAgY29uc3QgcHJlZml4ID0gdGFnbmFtZS5jaGFyQXQoMCkgPT09ICcvJyA/ICcvJyA6ICcnO1xuICAgIGlmICh0YWdzWzBdID09PSAneG1sbnMnKSB7XG4gICAgICByZXR1cm4gJyc7XG4gICAgfVxuICAgIGlmICh0YWdzLmxlbmd0aCA9PT0gMikge1xuICAgICAgdGFnbmFtZSA9IHByZWZpeCArIHRhZ3NbMV07XG4gICAgfVxuICB9XG4gIHJldHVybiB0YWduYW1lO1xufVxuXG4vL1RPRE86IGNoYW5nZSByZWdleCB0byBjYXB0dXJlIE5TXG4vL2NvbnN0IGF0dHJzUmVneCA9IG5ldyBSZWdFeHAoXCIoW1xcXFx3XFxcXC1cXFxcLlxcXFw6XSspXFxcXHMqPVxcXFxzKihbJ1xcXCJdKSgoLnxcXG4pKj8pXFxcXDJcIixcImdtXCIpO1xuY29uc3QgYXR0cnNSZWd4ID0gbmV3IFJlZ0V4cCgnKFteXFxcXHM9XSspXFxcXHMqKD1cXFxccyooW1xcJ1wiXSkoW1xcXFxzXFxcXFNdKj8pXFxcXDMpPycsICdnbScpO1xuXG5mdW5jdGlvbiBidWlsZEF0dHJpYnV0ZXNNYXAoYXR0clN0ciwgalBhdGgsIHRhZ05hbWUpIHtcbiAgaWYgKHRoaXMub3B0aW9ucy5pZ25vcmVBdHRyaWJ1dGVzICE9PSB0cnVlICYmIHR5cGVvZiBhdHRyU3RyID09PSAnc3RyaW5nJykge1xuICAgIC8vIGF0dHJTdHIgPSBhdHRyU3RyLnJlcGxhY2UoL1xccj9cXG4vZywgJyAnKTtcbiAgICAvL2F0dHJTdHIgPSBhdHRyU3RyIHx8IGF0dHJTdHIudHJpbSgpO1xuXG4gICAgY29uc3QgbWF0Y2hlcyA9IHV0aWwuZ2V0QWxsTWF0Y2hlcyhhdHRyU3RyLCBhdHRyc1JlZ3gpO1xuICAgIGNvbnN0IGxlbiA9IG1hdGNoZXMubGVuZ3RoOyAvL2Rvbid0IG1ha2UgaXQgaW5saW5lXG4gICAgY29uc3QgYXR0cnMgPSB7fTtcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IGxlbjsgaSsrKSB7XG4gICAgICBjb25zdCBhdHRyTmFtZSA9IHRoaXMucmVzb2x2ZU5hbWVTcGFjZShtYXRjaGVzW2ldWzFdKTtcbiAgICAgIGlmICh0aGlzLmlnbm9yZUF0dHJpYnV0ZXNGbihhdHRyTmFtZSwgalBhdGgpKSB7XG4gICAgICAgIGNvbnRpbnVlXG4gICAgICB9XG4gICAgICBsZXQgb2xkVmFsID0gbWF0Y2hlc1tpXVs0XTtcbiAgICAgIGxldCBhTmFtZSA9IHRoaXMub3B0aW9ucy5hdHRyaWJ1dGVOYW1lUHJlZml4ICsgYXR0ck5hbWU7XG4gICAgICBpZiAoYXR0ck5hbWUubGVuZ3RoKSB7XG4gICAgICAgIGlmICh0aGlzLm9wdGlvbnMudHJhbnNmb3JtQXR0cmlidXRlTmFtZSkge1xuICAgICAgICAgIGFOYW1lID0gdGhpcy5vcHRpb25zLnRyYW5zZm9ybUF0dHJpYnV0ZU5hbWUoYU5hbWUpO1xuICAgICAgICB9XG4gICAgICAgIGlmKGFOYW1lID09PSBcIl9fcHJvdG9fX1wiKSBhTmFtZSAgPSBcIiNfX3Byb3RvX19cIjtcbiAgICAgICAgaWYgKG9sZFZhbCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgaWYgKHRoaXMub3B0aW9ucy50cmltVmFsdWVzKSB7XG4gICAgICAgICAgICBvbGRWYWwgPSBvbGRWYWwudHJpbSgpO1xuICAgICAgICAgIH1cbiAgICAgICAgICBvbGRWYWwgPSB0aGlzLnJlcGxhY2VFbnRpdGllc1ZhbHVlKG9sZFZhbCk7XG4gICAgICAgICAgY29uc3QgbmV3VmFsID0gdGhpcy5vcHRpb25zLmF0dHJpYnV0ZVZhbHVlUHJvY2Vzc29yKGF0dHJOYW1lLCBvbGRWYWwsIGpQYXRoKTtcbiAgICAgICAgICBpZihuZXdWYWwgPT09IG51bGwgfHwgbmV3VmFsID09PSB1bmRlZmluZWQpe1xuICAgICAgICAgICAgLy9kb24ndCBwYXJzZVxuICAgICAgICAgICAgYXR0cnNbYU5hbWVdID0gb2xkVmFsO1xuICAgICAgICAgIH1lbHNlIGlmKHR5cGVvZiBuZXdWYWwgIT09IHR5cGVvZiBvbGRWYWwgfHwgbmV3VmFsICE9PSBvbGRWYWwpe1xuICAgICAgICAgICAgLy9vdmVyd3JpdGVcbiAgICAgICAgICAgIGF0dHJzW2FOYW1lXSA9IG5ld1ZhbDtcbiAgICAgICAgICB9ZWxzZXtcbiAgICAgICAgICAgIC8vcGFyc2VcbiAgICAgICAgICAgIGF0dHJzW2FOYW1lXSA9IHBhcnNlVmFsdWUoXG4gICAgICAgICAgICAgIG9sZFZhbCxcbiAgICAgICAgICAgICAgdGhpcy5vcHRpb25zLnBhcnNlQXR0cmlidXRlVmFsdWUsXG4gICAgICAgICAgICAgIHRoaXMub3B0aW9ucy5udW1iZXJQYXJzZU9wdGlvbnNcbiAgICAgICAgICAgICk7XG4gICAgICAgICAgfVxuICAgICAgICB9IGVsc2UgaWYgKHRoaXMub3B0aW9ucy5hbGxvd0Jvb2xlYW5BdHRyaWJ1dGVzKSB7XG4gICAgICAgICAgYXR0cnNbYU5hbWVdID0gdHJ1ZTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgICBpZiAoIU9iamVjdC5rZXlzKGF0dHJzKS5sZW5ndGgpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgaWYgKHRoaXMub3B0aW9ucy5hdHRyaWJ1dGVzR3JvdXBOYW1lKSB7XG4gICAgICBjb25zdCBhdHRyQ29sbGVjdGlvbiA9IHt9O1xuICAgICAgYXR0ckNvbGxlY3Rpb25bdGhpcy5vcHRpb25zLmF0dHJpYnV0ZXNHcm91cE5hbWVdID0gYXR0cnM7XG4gICAgICByZXR1cm4gYXR0ckNvbGxlY3Rpb247XG4gICAgfVxuICAgIHJldHVybiBhdHRyc1xuICB9XG59XG5cbmNvbnN0IHBhcnNlWG1sID0gZnVuY3Rpb24oeG1sRGF0YSkge1xuICB4bWxEYXRhID0geG1sRGF0YS5yZXBsYWNlKC9cXHJcXG4/L2csIFwiXFxuXCIpOyAvL1RPRE86IHJlbW92ZSB0aGlzIGxpbmVcbiAgY29uc3QgeG1sT2JqID0gbmV3IHhtbE5vZGUoJyF4bWwnKTtcbiAgbGV0IGN1cnJlbnROb2RlID0geG1sT2JqO1xuICBsZXQgdGV4dERhdGEgPSBcIlwiO1xuICBsZXQgalBhdGggPSBcIlwiO1xuICBmb3IobGV0IGk9MDsgaTwgeG1sRGF0YS5sZW5ndGg7IGkrKyl7Ly9mb3IgZWFjaCBjaGFyIGluIFhNTCBkYXRhXG4gICAgY29uc3QgY2ggPSB4bWxEYXRhW2ldO1xuICAgIGlmKGNoID09PSAnPCcpe1xuICAgICAgLy8gY29uc3QgbmV4dEluZGV4ID0gaSsxO1xuICAgICAgLy8gY29uc3QgXzJuZENoYXIgPSB4bWxEYXRhW25leHRJbmRleF07XG4gICAgICBpZiggeG1sRGF0YVtpKzFdID09PSAnLycpIHsvL0Nsb3NpbmcgVGFnXG4gICAgICAgIGNvbnN0IGNsb3NlSW5kZXggPSBmaW5kQ2xvc2luZ0luZGV4KHhtbERhdGEsIFwiPlwiLCBpLCBcIkNsb3NpbmcgVGFnIGlzIG5vdCBjbG9zZWQuXCIpXG4gICAgICAgIGxldCB0YWdOYW1lID0geG1sRGF0YS5zdWJzdHJpbmcoaSsyLGNsb3NlSW5kZXgpLnRyaW0oKTtcblxuICAgICAgICBpZih0aGlzLm9wdGlvbnMucmVtb3ZlTlNQcmVmaXgpe1xuICAgICAgICAgIGNvbnN0IGNvbG9uSW5kZXggPSB0YWdOYW1lLmluZGV4T2YoXCI6XCIpO1xuICAgICAgICAgIGlmKGNvbG9uSW5kZXggIT09IC0xKXtcbiAgICAgICAgICAgIHRhZ05hbWUgPSB0YWdOYW1lLnN1YnN0cihjb2xvbkluZGV4KzEpO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIGlmKHRoaXMub3B0aW9ucy50cmFuc2Zvcm1UYWdOYW1lKSB7XG4gICAgICAgICAgdGFnTmFtZSA9IHRoaXMub3B0aW9ucy50cmFuc2Zvcm1UYWdOYW1lKHRhZ05hbWUpO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYoY3VycmVudE5vZGUpe1xuICAgICAgICAgIHRleHREYXRhID0gdGhpcy5zYXZlVGV4dFRvUGFyZW50VGFnKHRleHREYXRhLCBjdXJyZW50Tm9kZSwgalBhdGgpO1xuICAgICAgICB9XG5cbiAgICAgICAgLy9jaGVjayBpZiBsYXN0IHRhZyBvZiBuZXN0ZWQgdGFnIHdhcyB1bnBhaXJlZCB0YWdcbiAgICAgICAgY29uc3QgbGFzdFRhZ05hbWUgPSBqUGF0aC5zdWJzdHJpbmcoalBhdGgubGFzdEluZGV4T2YoXCIuXCIpKzEpO1xuICAgICAgICBpZih0YWdOYW1lICYmIHRoaXMub3B0aW9ucy51bnBhaXJlZFRhZ3MuaW5kZXhPZih0YWdOYW1lKSAhPT0gLTEgKXtcbiAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYFVucGFpcmVkIHRhZyBjYW4gbm90IGJlIHVzZWQgYXMgY2xvc2luZyB0YWc6IDwvJHt0YWdOYW1lfT5gKTtcbiAgICAgICAgfVxuICAgICAgICBsZXQgcHJvcEluZGV4ID0gMFxuICAgICAgICBpZihsYXN0VGFnTmFtZSAmJiB0aGlzLm9wdGlvbnMudW5wYWlyZWRUYWdzLmluZGV4T2YobGFzdFRhZ05hbWUpICE9PSAtMSApe1xuICAgICAgICAgIHByb3BJbmRleCA9IGpQYXRoLmxhc3RJbmRleE9mKCcuJywgalBhdGgubGFzdEluZGV4T2YoJy4nKS0xKVxuICAgICAgICAgIHRoaXMudGFnc05vZGVTdGFjay5wb3AoKTtcbiAgICAgICAgfWVsc2V7XG4gICAgICAgICAgcHJvcEluZGV4ID0galBhdGgubGFzdEluZGV4T2YoXCIuXCIpO1xuICAgICAgICB9XG4gICAgICAgIGpQYXRoID0galBhdGguc3Vic3RyaW5nKDAsIHByb3BJbmRleCk7XG5cbiAgICAgICAgY3VycmVudE5vZGUgPSB0aGlzLnRhZ3NOb2RlU3RhY2sucG9wKCk7Ly9hdm9pZCByZWN1cnNpb24sIHNldCB0aGUgcGFyZW50IHRhZyBzY29wZVxuICAgICAgICB0ZXh0RGF0YSA9IFwiXCI7XG4gICAgICAgIGkgPSBjbG9zZUluZGV4O1xuICAgICAgfSBlbHNlIGlmKCB4bWxEYXRhW2krMV0gPT09ICc/Jykge1xuXG4gICAgICAgIGxldCB0YWdEYXRhID0gcmVhZFRhZ0V4cCh4bWxEYXRhLGksIGZhbHNlLCBcIj8+XCIpO1xuICAgICAgICBpZighdGFnRGF0YSkgdGhyb3cgbmV3IEVycm9yKFwiUGkgVGFnIGlzIG5vdCBjbG9zZWQuXCIpO1xuXG4gICAgICAgIHRleHREYXRhID0gdGhpcy5zYXZlVGV4dFRvUGFyZW50VGFnKHRleHREYXRhLCBjdXJyZW50Tm9kZSwgalBhdGgpO1xuICAgICAgICBpZiggKHRoaXMub3B0aW9ucy5pZ25vcmVEZWNsYXJhdGlvbiAmJiB0YWdEYXRhLnRhZ05hbWUgPT09IFwiP3htbFwiKSB8fCB0aGlzLm9wdGlvbnMuaWdub3JlUGlUYWdzKXtcblxuICAgICAgICB9ZWxzZXtcbiAgXG4gICAgICAgICAgY29uc3QgY2hpbGROb2RlID0gbmV3IHhtbE5vZGUodGFnRGF0YS50YWdOYW1lKTtcbiAgICAgICAgICBjaGlsZE5vZGUuYWRkKHRoaXMub3B0aW9ucy50ZXh0Tm9kZU5hbWUsIFwiXCIpO1xuICAgICAgICAgIFxuICAgICAgICAgIGlmKHRhZ0RhdGEudGFnTmFtZSAhPT0gdGFnRGF0YS50YWdFeHAgJiYgdGFnRGF0YS5hdHRyRXhwUHJlc2VudCl7XG4gICAgICAgICAgICBjaGlsZE5vZGVbXCI6QFwiXSA9IHRoaXMuYnVpbGRBdHRyaWJ1dGVzTWFwKHRhZ0RhdGEudGFnRXhwLCBqUGF0aCwgdGFnRGF0YS50YWdOYW1lKTtcbiAgICAgICAgICB9XG4gICAgICAgICAgdGhpcy5hZGRDaGlsZChjdXJyZW50Tm9kZSwgY2hpbGROb2RlLCBqUGF0aClcblxuICAgICAgICB9XG5cblxuICAgICAgICBpID0gdGFnRGF0YS5jbG9zZUluZGV4ICsgMTtcbiAgICAgIH0gZWxzZSBpZih4bWxEYXRhLnN1YnN0cihpICsgMSwgMykgPT09ICchLS0nKSB7XG4gICAgICAgIGNvbnN0IGVuZEluZGV4ID0gZmluZENsb3NpbmdJbmRleCh4bWxEYXRhLCBcIi0tPlwiLCBpKzQsIFwiQ29tbWVudCBpcyBub3QgY2xvc2VkLlwiKVxuICAgICAgICBpZih0aGlzLm9wdGlvbnMuY29tbWVudFByb3BOYW1lKXtcbiAgICAgICAgICBjb25zdCBjb21tZW50ID0geG1sRGF0YS5zdWJzdHJpbmcoaSArIDQsIGVuZEluZGV4IC0gMik7XG5cbiAgICAgICAgICB0ZXh0RGF0YSA9IHRoaXMuc2F2ZVRleHRUb1BhcmVudFRhZyh0ZXh0RGF0YSwgY3VycmVudE5vZGUsIGpQYXRoKTtcblxuICAgICAgICAgIGN1cnJlbnROb2RlLmFkZCh0aGlzLm9wdGlvbnMuY29tbWVudFByb3BOYW1lLCBbIHsgW3RoaXMub3B0aW9ucy50ZXh0Tm9kZU5hbWVdIDogY29tbWVudCB9IF0pO1xuICAgICAgICB9XG4gICAgICAgIGkgPSBlbmRJbmRleDtcbiAgICAgIH0gZWxzZSBpZiggeG1sRGF0YS5zdWJzdHIoaSArIDEsIDIpID09PSAnIUQnKSB7XG4gICAgICAgIGNvbnN0IHJlc3VsdCA9IHJlYWREb2NUeXBlKHhtbERhdGEsIGkpO1xuICAgICAgICB0aGlzLmRvY1R5cGVFbnRpdGllcyA9IHJlc3VsdC5lbnRpdGllcztcbiAgICAgICAgaSA9IHJlc3VsdC5pO1xuICAgICAgfWVsc2UgaWYoeG1sRGF0YS5zdWJzdHIoaSArIDEsIDIpID09PSAnIVsnKSB7XG4gICAgICAgIGNvbnN0IGNsb3NlSW5kZXggPSBmaW5kQ2xvc2luZ0luZGV4KHhtbERhdGEsIFwiXV0+XCIsIGksIFwiQ0RBVEEgaXMgbm90IGNsb3NlZC5cIikgLSAyO1xuICAgICAgICBjb25zdCB0YWdFeHAgPSB4bWxEYXRhLnN1YnN0cmluZyhpICsgOSxjbG9zZUluZGV4KTtcblxuICAgICAgICB0ZXh0RGF0YSA9IHRoaXMuc2F2ZVRleHRUb1BhcmVudFRhZyh0ZXh0RGF0YSwgY3VycmVudE5vZGUsIGpQYXRoKTtcblxuICAgICAgICBsZXQgdmFsID0gdGhpcy5wYXJzZVRleHREYXRhKHRhZ0V4cCwgY3VycmVudE5vZGUudGFnbmFtZSwgalBhdGgsIHRydWUsIGZhbHNlLCB0cnVlLCB0cnVlKTtcbiAgICAgICAgaWYodmFsID09IHVuZGVmaW5lZCkgdmFsID0gXCJcIjtcblxuICAgICAgICAvL2NkYXRhIHNob3VsZCBiZSBzZXQgZXZlbiBpZiBpdCBpcyAwIGxlbmd0aCBzdHJpbmdcbiAgICAgICAgaWYodGhpcy5vcHRpb25zLmNkYXRhUHJvcE5hbWUpe1xuICAgICAgICAgIGN1cnJlbnROb2RlLmFkZCh0aGlzLm9wdGlvbnMuY2RhdGFQcm9wTmFtZSwgWyB7IFt0aGlzLm9wdGlvbnMudGV4dE5vZGVOYW1lXSA6IHRhZ0V4cCB9IF0pO1xuICAgICAgICB9ZWxzZXtcbiAgICAgICAgICBjdXJyZW50Tm9kZS5hZGQodGhpcy5vcHRpb25zLnRleHROb2RlTmFtZSwgdmFsKTtcbiAgICAgICAgfVxuICAgICAgICBcbiAgICAgICAgaSA9IGNsb3NlSW5kZXggKyAyO1xuICAgICAgfWVsc2Ugey8vT3BlbmluZyB0YWdcbiAgICAgICAgbGV0IHJlc3VsdCA9IHJlYWRUYWdFeHAoeG1sRGF0YSxpLCB0aGlzLm9wdGlvbnMucmVtb3ZlTlNQcmVmaXgpO1xuICAgICAgICBsZXQgdGFnTmFtZT0gcmVzdWx0LnRhZ05hbWU7XG4gICAgICAgIGNvbnN0IHJhd1RhZ05hbWUgPSByZXN1bHQucmF3VGFnTmFtZTtcbiAgICAgICAgbGV0IHRhZ0V4cCA9IHJlc3VsdC50YWdFeHA7XG4gICAgICAgIGxldCBhdHRyRXhwUHJlc2VudCA9IHJlc3VsdC5hdHRyRXhwUHJlc2VudDtcbiAgICAgICAgbGV0IGNsb3NlSW5kZXggPSByZXN1bHQuY2xvc2VJbmRleDtcblxuICAgICAgICBpZiAodGhpcy5vcHRpb25zLnRyYW5zZm9ybVRhZ05hbWUpIHtcbiAgICAgICAgICB0YWdOYW1lID0gdGhpcy5vcHRpb25zLnRyYW5zZm9ybVRhZ05hbWUodGFnTmFtZSk7XG4gICAgICAgIH1cbiAgICAgICAgXG4gICAgICAgIC8vc2F2ZSB0ZXh0IGFzIGNoaWxkIG5vZGVcbiAgICAgICAgaWYgKGN1cnJlbnROb2RlICYmIHRleHREYXRhKSB7XG4gICAgICAgICAgaWYoY3VycmVudE5vZGUudGFnbmFtZSAhPT0gJyF4bWwnKXtcbiAgICAgICAgICAgIC8vd2hlbiBuZXN0ZWQgdGFnIGlzIGZvdW5kXG4gICAgICAgICAgICB0ZXh0RGF0YSA9IHRoaXMuc2F2ZVRleHRUb1BhcmVudFRhZyh0ZXh0RGF0YSwgY3VycmVudE5vZGUsIGpQYXRoLCBmYWxzZSk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgLy9jaGVjayBpZiBsYXN0IHRhZyB3YXMgdW5wYWlyZWQgdGFnXG4gICAgICAgIGNvbnN0IGxhc3RUYWcgPSBjdXJyZW50Tm9kZTtcbiAgICAgICAgaWYobGFzdFRhZyAmJiB0aGlzLm9wdGlvbnMudW5wYWlyZWRUYWdzLmluZGV4T2YobGFzdFRhZy50YWduYW1lKSAhPT0gLTEgKXtcbiAgICAgICAgICBjdXJyZW50Tm9kZSA9IHRoaXMudGFnc05vZGVTdGFjay5wb3AoKTtcbiAgICAgICAgICBqUGF0aCA9IGpQYXRoLnN1YnN0cmluZygwLCBqUGF0aC5sYXN0SW5kZXhPZihcIi5cIikpO1xuICAgICAgICB9XG4gICAgICAgIGlmKHRhZ05hbWUgIT09IHhtbE9iai50YWduYW1lKXtcbiAgICAgICAgICBqUGF0aCArPSBqUGF0aCA/IFwiLlwiICsgdGFnTmFtZSA6IHRhZ05hbWU7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHRoaXMuaXNJdFN0b3BOb2RlKHRoaXMub3B0aW9ucy5zdG9wTm9kZXMsIGpQYXRoLCB0YWdOYW1lKSkge1xuICAgICAgICAgIGxldCB0YWdDb250ZW50ID0gXCJcIjtcbiAgICAgICAgICAvL3NlbGYtY2xvc2luZyB0YWdcbiAgICAgICAgICBpZih0YWdFeHAubGVuZ3RoID4gMCAmJiB0YWdFeHAubGFzdEluZGV4T2YoXCIvXCIpID09PSB0YWdFeHAubGVuZ3RoIC0gMSl7XG4gICAgICAgICAgICBpZih0YWdOYW1lW3RhZ05hbWUubGVuZ3RoIC0gMV0gPT09IFwiL1wiKXsgLy9yZW1vdmUgdHJhaWxpbmcgJy8nXG4gICAgICAgICAgICAgIHRhZ05hbWUgPSB0YWdOYW1lLnN1YnN0cigwLCB0YWdOYW1lLmxlbmd0aCAtIDEpO1xuICAgICAgICAgICAgICBqUGF0aCA9IGpQYXRoLnN1YnN0cigwLCBqUGF0aC5sZW5ndGggLSAxKTtcbiAgICAgICAgICAgICAgdGFnRXhwID0gdGFnTmFtZTtcbiAgICAgICAgICAgIH1lbHNle1xuICAgICAgICAgICAgICB0YWdFeHAgPSB0YWdFeHAuc3Vic3RyKDAsIHRhZ0V4cC5sZW5ndGggLSAxKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGkgPSByZXN1bHQuY2xvc2VJbmRleDtcbiAgICAgICAgICB9XG4gICAgICAgICAgLy91bnBhaXJlZCB0YWdcbiAgICAgICAgICBlbHNlIGlmKHRoaXMub3B0aW9ucy51bnBhaXJlZFRhZ3MuaW5kZXhPZih0YWdOYW1lKSAhPT0gLTEpe1xuICAgICAgICAgICAgXG4gICAgICAgICAgICBpID0gcmVzdWx0LmNsb3NlSW5kZXg7XG4gICAgICAgICAgfVxuICAgICAgICAgIC8vbm9ybWFsIHRhZ1xuICAgICAgICAgIGVsc2V7XG4gICAgICAgICAgICAvL3JlYWQgdW50aWwgY2xvc2luZyB0YWcgaXMgZm91bmRcbiAgICAgICAgICAgIGNvbnN0IHJlc3VsdCA9IHRoaXMucmVhZFN0b3BOb2RlRGF0YSh4bWxEYXRhLCByYXdUYWdOYW1lLCBjbG9zZUluZGV4ICsgMSk7XG4gICAgICAgICAgICBpZighcmVzdWx0KSB0aHJvdyBuZXcgRXJyb3IoYFVuZXhwZWN0ZWQgZW5kIG9mICR7cmF3VGFnTmFtZX1gKTtcbiAgICAgICAgICAgIGkgPSByZXN1bHQuaTtcbiAgICAgICAgICAgIHRhZ0NvbnRlbnQgPSByZXN1bHQudGFnQ29udGVudDtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICBjb25zdCBjaGlsZE5vZGUgPSBuZXcgeG1sTm9kZSh0YWdOYW1lKTtcbiAgICAgICAgICBpZih0YWdOYW1lICE9PSB0YWdFeHAgJiYgYXR0ckV4cFByZXNlbnQpe1xuICAgICAgICAgICAgY2hpbGROb2RlW1wiOkBcIl0gPSB0aGlzLmJ1aWxkQXR0cmlidXRlc01hcCh0YWdFeHAsIGpQYXRoLCB0YWdOYW1lKTtcbiAgICAgICAgICB9XG4gICAgICAgICAgaWYodGFnQ29udGVudCkge1xuICAgICAgICAgICAgdGFnQ29udGVudCA9IHRoaXMucGFyc2VUZXh0RGF0YSh0YWdDb250ZW50LCB0YWdOYW1lLCBqUGF0aCwgdHJ1ZSwgYXR0ckV4cFByZXNlbnQsIHRydWUsIHRydWUpO1xuICAgICAgICAgIH1cbiAgICAgICAgICBcbiAgICAgICAgICBqUGF0aCA9IGpQYXRoLnN1YnN0cigwLCBqUGF0aC5sYXN0SW5kZXhPZihcIi5cIikpO1xuICAgICAgICAgIGNoaWxkTm9kZS5hZGQodGhpcy5vcHRpb25zLnRleHROb2RlTmFtZSwgdGFnQ29udGVudCk7XG4gICAgICAgICAgXG4gICAgICAgICAgdGhpcy5hZGRDaGlsZChjdXJyZW50Tm9kZSwgY2hpbGROb2RlLCBqUGF0aClcbiAgICAgICAgfWVsc2V7XG4gIC8vc2VsZkNsb3NpbmcgdGFnXG4gICAgICAgICAgaWYodGFnRXhwLmxlbmd0aCA+IDAgJiYgdGFnRXhwLmxhc3RJbmRleE9mKFwiL1wiKSA9PT0gdGFnRXhwLmxlbmd0aCAtIDEpe1xuICAgICAgICAgICAgaWYodGFnTmFtZVt0YWdOYW1lLmxlbmd0aCAtIDFdID09PSBcIi9cIil7IC8vcmVtb3ZlIHRyYWlsaW5nICcvJ1xuICAgICAgICAgICAgICB0YWdOYW1lID0gdGFnTmFtZS5zdWJzdHIoMCwgdGFnTmFtZS5sZW5ndGggLSAxKTtcbiAgICAgICAgICAgICAgalBhdGggPSBqUGF0aC5zdWJzdHIoMCwgalBhdGgubGVuZ3RoIC0gMSk7XG4gICAgICAgICAgICAgIHRhZ0V4cCA9IHRhZ05hbWU7XG4gICAgICAgICAgICB9ZWxzZXtcbiAgICAgICAgICAgICAgdGFnRXhwID0gdGFnRXhwLnN1YnN0cigwLCB0YWdFeHAubGVuZ3RoIC0gMSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBcbiAgICAgICAgICAgIGlmKHRoaXMub3B0aW9ucy50cmFuc2Zvcm1UYWdOYW1lKSB7XG4gICAgICAgICAgICAgIHRhZ05hbWUgPSB0aGlzLm9wdGlvbnMudHJhbnNmb3JtVGFnTmFtZSh0YWdOYW1lKTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgY29uc3QgY2hpbGROb2RlID0gbmV3IHhtbE5vZGUodGFnTmFtZSk7XG4gICAgICAgICAgICBpZih0YWdOYW1lICE9PSB0YWdFeHAgJiYgYXR0ckV4cFByZXNlbnQpe1xuICAgICAgICAgICAgICBjaGlsZE5vZGVbXCI6QFwiXSA9IHRoaXMuYnVpbGRBdHRyaWJ1dGVzTWFwKHRhZ0V4cCwgalBhdGgsIHRhZ05hbWUpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgdGhpcy5hZGRDaGlsZChjdXJyZW50Tm9kZSwgY2hpbGROb2RlLCBqUGF0aClcbiAgICAgICAgICAgIGpQYXRoID0galBhdGguc3Vic3RyKDAsIGpQYXRoLmxhc3RJbmRleE9mKFwiLlwiKSk7XG4gICAgICAgICAgfVxuICAgIC8vb3BlbmluZyB0YWdcbiAgICAgICAgICBlbHNle1xuICAgICAgICAgICAgY29uc3QgY2hpbGROb2RlID0gbmV3IHhtbE5vZGUoIHRhZ05hbWUpO1xuICAgICAgICAgICAgdGhpcy50YWdzTm9kZVN0YWNrLnB1c2goY3VycmVudE5vZGUpO1xuICAgICAgICAgICAgXG4gICAgICAgICAgICBpZih0YWdOYW1lICE9PSB0YWdFeHAgJiYgYXR0ckV4cFByZXNlbnQpe1xuICAgICAgICAgICAgICBjaGlsZE5vZGVbXCI6QFwiXSA9IHRoaXMuYnVpbGRBdHRyaWJ1dGVzTWFwKHRhZ0V4cCwgalBhdGgsIHRhZ05hbWUpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgdGhpcy5hZGRDaGlsZChjdXJyZW50Tm9kZSwgY2hpbGROb2RlLCBqUGF0aClcbiAgICAgICAgICAgIGN1cnJlbnROb2RlID0gY2hpbGROb2RlO1xuICAgICAgICAgIH1cbiAgICAgICAgICB0ZXh0RGF0YSA9IFwiXCI7XG4gICAgICAgICAgaSA9IGNsb3NlSW5kZXg7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9ZWxzZXtcbiAgICAgIHRleHREYXRhICs9IHhtbERhdGFbaV07XG4gICAgfVxuICB9XG4gIHJldHVybiB4bWxPYmouY2hpbGQ7XG59XG5cbmZ1bmN0aW9uIGFkZENoaWxkKGN1cnJlbnROb2RlLCBjaGlsZE5vZGUsIGpQYXRoKXtcbiAgY29uc3QgcmVzdWx0ID0gdGhpcy5vcHRpb25zLnVwZGF0ZVRhZyhjaGlsZE5vZGUudGFnbmFtZSwgalBhdGgsIGNoaWxkTm9kZVtcIjpAXCJdKVxuICBpZihyZXN1bHQgPT09IGZhbHNlKXtcbiAgfWVsc2UgaWYodHlwZW9mIHJlc3VsdCA9PT0gXCJzdHJpbmdcIil7XG4gICAgY2hpbGROb2RlLnRhZ25hbWUgPSByZXN1bHRcbiAgICBjdXJyZW50Tm9kZS5hZGRDaGlsZChjaGlsZE5vZGUpO1xuICB9ZWxzZXtcbiAgICBjdXJyZW50Tm9kZS5hZGRDaGlsZChjaGlsZE5vZGUpO1xuICB9XG59XG5cbmNvbnN0IHJlcGxhY2VFbnRpdGllc1ZhbHVlID0gZnVuY3Rpb24odmFsKXtcblxuICBpZih0aGlzLm9wdGlvbnMucHJvY2Vzc0VudGl0aWVzKXtcbiAgICBmb3IobGV0IGVudGl0eU5hbWUgaW4gdGhpcy5kb2NUeXBlRW50aXRpZXMpe1xuICAgICAgY29uc3QgZW50aXR5ID0gdGhpcy5kb2NUeXBlRW50aXRpZXNbZW50aXR5TmFtZV07XG4gICAgICB2YWwgPSB2YWwucmVwbGFjZSggZW50aXR5LnJlZ3gsIGVudGl0eS52YWwpO1xuICAgIH1cbiAgICBmb3IobGV0IGVudGl0eU5hbWUgaW4gdGhpcy5sYXN0RW50aXRpZXMpe1xuICAgICAgY29uc3QgZW50aXR5ID0gdGhpcy5sYXN0RW50aXRpZXNbZW50aXR5TmFtZV07XG4gICAgICB2YWwgPSB2YWwucmVwbGFjZSggZW50aXR5LnJlZ2V4LCBlbnRpdHkudmFsKTtcbiAgICB9XG4gICAgaWYodGhpcy5vcHRpb25zLmh0bWxFbnRpdGllcyl7XG4gICAgICBmb3IobGV0IGVudGl0eU5hbWUgaW4gdGhpcy5odG1sRW50aXRpZXMpe1xuICAgICAgICBjb25zdCBlbnRpdHkgPSB0aGlzLmh0bWxFbnRpdGllc1tlbnRpdHlOYW1lXTtcbiAgICAgICAgdmFsID0gdmFsLnJlcGxhY2UoIGVudGl0eS5yZWdleCwgZW50aXR5LnZhbCk7XG4gICAgICB9XG4gICAgfVxuICAgIHZhbCA9IHZhbC5yZXBsYWNlKCB0aGlzLmFtcEVudGl0eS5yZWdleCwgdGhpcy5hbXBFbnRpdHkudmFsKTtcbiAgfVxuICByZXR1cm4gdmFsO1xufVxuZnVuY3Rpb24gc2F2ZVRleHRUb1BhcmVudFRhZyh0ZXh0RGF0YSwgY3VycmVudE5vZGUsIGpQYXRoLCBpc0xlYWZOb2RlKSB7XG4gIGlmICh0ZXh0RGF0YSkgeyAvL3N0b3JlIHByZXZpb3VzbHkgY29sbGVjdGVkIGRhdGEgYXMgdGV4dE5vZGVcbiAgICBpZihpc0xlYWZOb2RlID09PSB1bmRlZmluZWQpIGlzTGVhZk5vZGUgPSBPYmplY3Qua2V5cyhjdXJyZW50Tm9kZS5jaGlsZCkubGVuZ3RoID09PSAwXG4gICAgXG4gICAgdGV4dERhdGEgPSB0aGlzLnBhcnNlVGV4dERhdGEodGV4dERhdGEsXG4gICAgICBjdXJyZW50Tm9kZS50YWduYW1lLFxuICAgICAgalBhdGgsXG4gICAgICBmYWxzZSxcbiAgICAgIGN1cnJlbnROb2RlW1wiOkBcIl0gPyBPYmplY3Qua2V5cyhjdXJyZW50Tm9kZVtcIjpAXCJdKS5sZW5ndGggIT09IDAgOiBmYWxzZSxcbiAgICAgIGlzTGVhZk5vZGUpO1xuXG4gICAgaWYgKHRleHREYXRhICE9PSB1bmRlZmluZWQgJiYgdGV4dERhdGEgIT09IFwiXCIpXG4gICAgICBjdXJyZW50Tm9kZS5hZGQodGhpcy5vcHRpb25zLnRleHROb2RlTmFtZSwgdGV4dERhdGEpO1xuICAgIHRleHREYXRhID0gXCJcIjtcbiAgfVxuICByZXR1cm4gdGV4dERhdGE7XG59XG5cbi8vVE9ETzogdXNlIGpQYXRoIHRvIHNpbXBsaWZ5IHRoZSBsb2dpY1xuLyoqXG4gKiBcbiAqIEBwYXJhbSB7c3RyaW5nW119IHN0b3BOb2RlcyBcbiAqIEBwYXJhbSB7c3RyaW5nfSBqUGF0aFxuICogQHBhcmFtIHtzdHJpbmd9IGN1cnJlbnRUYWdOYW1lIFxuICovXG5mdW5jdGlvbiBpc0l0U3RvcE5vZGUoc3RvcE5vZGVzLCBqUGF0aCwgY3VycmVudFRhZ05hbWUpe1xuICBjb25zdCBhbGxOb2Rlc0V4cCA9IFwiKi5cIiArIGN1cnJlbnRUYWdOYW1lO1xuICBmb3IgKGNvbnN0IHN0b3BOb2RlUGF0aCBpbiBzdG9wTm9kZXMpIHtcbiAgICBjb25zdCBzdG9wTm9kZUV4cCA9IHN0b3BOb2Rlc1tzdG9wTm9kZVBhdGhdO1xuICAgIGlmKCBhbGxOb2Rlc0V4cCA9PT0gc3RvcE5vZGVFeHAgfHwgalBhdGggPT09IHN0b3BOb2RlRXhwICApIHJldHVybiB0cnVlO1xuICB9XG4gIHJldHVybiBmYWxzZTtcbn1cblxuLyoqXG4gKiBSZXR1cm5zIHRoZSB0YWcgRXhwcmVzc2lvbiBhbmQgd2hlcmUgaXQgaXMgZW5kaW5nIGhhbmRsaW5nIHNpbmdsZS1kb3VibGUgcXVvdGVzIHNpdHVhdGlvblxuICogQHBhcmFtIHtzdHJpbmd9IHhtbERhdGEgXG4gKiBAcGFyYW0ge251bWJlcn0gaSBzdGFydGluZyBpbmRleFxuICogQHJldHVybnMgXG4gKi9cbmZ1bmN0aW9uIHRhZ0V4cFdpdGhDbG9zaW5nSW5kZXgoeG1sRGF0YSwgaSwgY2xvc2luZ0NoYXIgPSBcIj5cIil7XG4gIGxldCBhdHRyQm91bmRhcnk7XG4gIGxldCB0YWdFeHAgPSBcIlwiO1xuICBmb3IgKGxldCBpbmRleCA9IGk7IGluZGV4IDwgeG1sRGF0YS5sZW5ndGg7IGluZGV4KyspIHtcbiAgICBsZXQgY2ggPSB4bWxEYXRhW2luZGV4XTtcbiAgICBpZiAoYXR0ckJvdW5kYXJ5KSB7XG4gICAgICAgIGlmIChjaCA9PT0gYXR0ckJvdW5kYXJ5KSBhdHRyQm91bmRhcnkgPSBcIlwiOy8vcmVzZXRcbiAgICB9IGVsc2UgaWYgKGNoID09PSAnXCInIHx8IGNoID09PSBcIidcIikge1xuICAgICAgICBhdHRyQm91bmRhcnkgPSBjaDtcbiAgICB9IGVsc2UgaWYgKGNoID09PSBjbG9zaW5nQ2hhclswXSkge1xuICAgICAgaWYoY2xvc2luZ0NoYXJbMV0pe1xuICAgICAgICBpZih4bWxEYXRhW2luZGV4ICsgMV0gPT09IGNsb3NpbmdDaGFyWzFdKXtcbiAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgZGF0YTogdGFnRXhwLFxuICAgICAgICAgICAgaW5kZXg6IGluZGV4XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9ZWxzZXtcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICBkYXRhOiB0YWdFeHAsXG4gICAgICAgICAgaW5kZXg6IGluZGV4XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9IGVsc2UgaWYgKGNoID09PSAnXFx0Jykge1xuICAgICAgY2ggPSBcIiBcIlxuICAgIH1cbiAgICB0YWdFeHAgKz0gY2g7XG4gIH1cbn1cblxuZnVuY3Rpb24gZmluZENsb3NpbmdJbmRleCh4bWxEYXRhLCBzdHIsIGksIGVyck1zZyl7XG4gIGNvbnN0IGNsb3NpbmdJbmRleCA9IHhtbERhdGEuaW5kZXhPZihzdHIsIGkpO1xuICBpZihjbG9zaW5nSW5kZXggPT09IC0xKXtcbiAgICB0aHJvdyBuZXcgRXJyb3IoZXJyTXNnKVxuICB9ZWxzZXtcbiAgICByZXR1cm4gY2xvc2luZ0luZGV4ICsgc3RyLmxlbmd0aCAtIDE7XG4gIH1cbn1cblxuZnVuY3Rpb24gcmVhZFRhZ0V4cCh4bWxEYXRhLGksIHJlbW92ZU5TUHJlZml4LCBjbG9zaW5nQ2hhciA9IFwiPlwiKXtcbiAgY29uc3QgcmVzdWx0ID0gdGFnRXhwV2l0aENsb3NpbmdJbmRleCh4bWxEYXRhLCBpKzEsIGNsb3NpbmdDaGFyKTtcbiAgaWYoIXJlc3VsdCkgcmV0dXJuO1xuICBsZXQgdGFnRXhwID0gcmVzdWx0LmRhdGE7XG4gIGNvbnN0IGNsb3NlSW5kZXggPSByZXN1bHQuaW5kZXg7XG4gIGNvbnN0IHNlcGFyYXRvckluZGV4ID0gdGFnRXhwLnNlYXJjaCgvXFxzLyk7XG4gIGxldCB0YWdOYW1lID0gdGFnRXhwO1xuICBsZXQgYXR0ckV4cFByZXNlbnQgPSB0cnVlO1xuICBpZihzZXBhcmF0b3JJbmRleCAhPT0gLTEpey8vc2VwYXJhdGUgdGFnIG5hbWUgYW5kIGF0dHJpYnV0ZXMgZXhwcmVzc2lvblxuICAgIHRhZ05hbWUgPSB0YWdFeHAuc3Vic3RyaW5nKDAsIHNlcGFyYXRvckluZGV4KTtcbiAgICB0YWdFeHAgPSB0YWdFeHAuc3Vic3RyaW5nKHNlcGFyYXRvckluZGV4ICsgMSkudHJpbVN0YXJ0KCk7XG4gIH1cblxuICBjb25zdCByYXdUYWdOYW1lID0gdGFnTmFtZTtcbiAgaWYocmVtb3ZlTlNQcmVmaXgpe1xuICAgIGNvbnN0IGNvbG9uSW5kZXggPSB0YWdOYW1lLmluZGV4T2YoXCI6XCIpO1xuICAgIGlmKGNvbG9uSW5kZXggIT09IC0xKXtcbiAgICAgIHRhZ05hbWUgPSB0YWdOYW1lLnN1YnN0cihjb2xvbkluZGV4KzEpO1xuICAgICAgYXR0ckV4cFByZXNlbnQgPSB0YWdOYW1lICE9PSByZXN1bHQuZGF0YS5zdWJzdHIoY29sb25JbmRleCArIDEpO1xuICAgIH1cbiAgfVxuXG4gIHJldHVybiB7XG4gICAgdGFnTmFtZTogdGFnTmFtZSxcbiAgICB0YWdFeHA6IHRhZ0V4cCxcbiAgICBjbG9zZUluZGV4OiBjbG9zZUluZGV4LFxuICAgIGF0dHJFeHBQcmVzZW50OiBhdHRyRXhwUHJlc2VudCxcbiAgICByYXdUYWdOYW1lOiByYXdUYWdOYW1lLFxuICB9XG59XG4vKipcbiAqIGZpbmQgcGFpcmVkIHRhZyBmb3IgYSBzdG9wIG5vZGVcbiAqIEBwYXJhbSB7c3RyaW5nfSB4bWxEYXRhIFxuICogQHBhcmFtIHtzdHJpbmd9IHRhZ05hbWUgXG4gKiBAcGFyYW0ge251bWJlcn0gaSBcbiAqL1xuZnVuY3Rpb24gcmVhZFN0b3BOb2RlRGF0YSh4bWxEYXRhLCB0YWdOYW1lLCBpKXtcbiAgY29uc3Qgc3RhcnRJbmRleCA9IGk7XG4gIC8vIFN0YXJ0aW5nIGF0IDEgc2luY2Ugd2UgYWxyZWFkeSBoYXZlIGFuIG9wZW4gdGFnXG4gIGxldCBvcGVuVGFnQ291bnQgPSAxO1xuXG4gIGZvciAoOyBpIDwgeG1sRGF0YS5sZW5ndGg7IGkrKykge1xuICAgIGlmKCB4bWxEYXRhW2ldID09PSBcIjxcIil7IFxuICAgICAgaWYgKHhtbERhdGFbaSsxXSA9PT0gXCIvXCIpIHsvL2Nsb3NlIHRhZ1xuICAgICAgICAgIGNvbnN0IGNsb3NlSW5kZXggPSBmaW5kQ2xvc2luZ0luZGV4KHhtbERhdGEsIFwiPlwiLCBpLCBgJHt0YWdOYW1lfSBpcyBub3QgY2xvc2VkYCk7XG4gICAgICAgICAgbGV0IGNsb3NlVGFnTmFtZSA9IHhtbERhdGEuc3Vic3RyaW5nKGkrMixjbG9zZUluZGV4KS50cmltKCk7XG4gICAgICAgICAgaWYoY2xvc2VUYWdOYW1lID09PSB0YWdOYW1lKXtcbiAgICAgICAgICAgIG9wZW5UYWdDb3VudC0tO1xuICAgICAgICAgICAgaWYgKG9wZW5UYWdDb3VudCA9PT0gMCkge1xuICAgICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICAgIHRhZ0NvbnRlbnQ6IHhtbERhdGEuc3Vic3RyaW5nKHN0YXJ0SW5kZXgsIGkpLFxuICAgICAgICAgICAgICAgIGkgOiBjbG9zZUluZGV4XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgICAgaT1jbG9zZUluZGV4O1xuICAgICAgICB9IGVsc2UgaWYoeG1sRGF0YVtpKzFdID09PSAnPycpIHsgXG4gICAgICAgICAgY29uc3QgY2xvc2VJbmRleCA9IGZpbmRDbG9zaW5nSW5kZXgoeG1sRGF0YSwgXCI/PlwiLCBpKzEsIFwiU3RvcE5vZGUgaXMgbm90IGNsb3NlZC5cIilcbiAgICAgICAgICBpPWNsb3NlSW5kZXg7XG4gICAgICAgIH0gZWxzZSBpZih4bWxEYXRhLnN1YnN0cihpICsgMSwgMykgPT09ICchLS0nKSB7IFxuICAgICAgICAgIGNvbnN0IGNsb3NlSW5kZXggPSBmaW5kQ2xvc2luZ0luZGV4KHhtbERhdGEsIFwiLS0+XCIsIGkrMywgXCJTdG9wTm9kZSBpcyBub3QgY2xvc2VkLlwiKVxuICAgICAgICAgIGk9Y2xvc2VJbmRleDtcbiAgICAgICAgfSBlbHNlIGlmKHhtbERhdGEuc3Vic3RyKGkgKyAxLCAyKSA9PT0gJyFbJykgeyBcbiAgICAgICAgICBjb25zdCBjbG9zZUluZGV4ID0gZmluZENsb3NpbmdJbmRleCh4bWxEYXRhLCBcIl1dPlwiLCBpLCBcIlN0b3BOb2RlIGlzIG5vdCBjbG9zZWQuXCIpIC0gMjtcbiAgICAgICAgICBpPWNsb3NlSW5kZXg7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgY29uc3QgdGFnRGF0YSA9IHJlYWRUYWdFeHAoeG1sRGF0YSwgaSwgJz4nKVxuXG4gICAgICAgICAgaWYgKHRhZ0RhdGEpIHtcbiAgICAgICAgICAgIGNvbnN0IG9wZW5UYWdOYW1lID0gdGFnRGF0YSAmJiB0YWdEYXRhLnRhZ05hbWU7XG4gICAgICAgICAgICBpZiAob3BlblRhZ05hbWUgPT09IHRhZ05hbWUgJiYgdGFnRGF0YS50YWdFeHBbdGFnRGF0YS50YWdFeHAubGVuZ3RoLTFdICE9PSBcIi9cIikge1xuICAgICAgICAgICAgICBvcGVuVGFnQ291bnQrKztcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGk9dGFnRGF0YS5jbG9zZUluZGV4O1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfVxuICB9Ly9lbmQgZm9yIGxvb3Bcbn1cblxuZnVuY3Rpb24gcGFyc2VWYWx1ZSh2YWwsIHNob3VsZFBhcnNlLCBvcHRpb25zKSB7XG4gIGlmIChzaG91bGRQYXJzZSAmJiB0eXBlb2YgdmFsID09PSAnc3RyaW5nJykge1xuICAgIC8vY29uc29sZS5sb2cob3B0aW9ucylcbiAgICBjb25zdCBuZXd2YWwgPSB2YWwudHJpbSgpO1xuICAgIGlmKG5ld3ZhbCA9PT0gJ3RydWUnICkgcmV0dXJuIHRydWU7XG4gICAgZWxzZSBpZihuZXd2YWwgPT09ICdmYWxzZScgKSByZXR1cm4gZmFsc2U7XG4gICAgZWxzZSByZXR1cm4gdG9OdW1iZXIodmFsLCBvcHRpb25zKTtcbiAgfSBlbHNlIHtcbiAgICBpZiAodXRpbC5pc0V4aXN0KHZhbCkpIHtcbiAgICAgIHJldHVybiB2YWw7XG4gICAgfSBlbHNlIHtcbiAgICAgIHJldHVybiAnJztcbiAgICB9XG4gIH1cbn1cblxuXG5tb2R1bGUuZXhwb3J0cyA9IE9yZGVyZWRPYmpQYXJzZXI7XG4iLAogICAgIid1c2Ugc3RyaWN0JztcblxuLyoqXG4gKiBcbiAqIEBwYXJhbSB7YXJyYXl9IG5vZGUgXG4gKiBAcGFyYW0ge2FueX0gb3B0aW9ucyBcbiAqIEByZXR1cm5zIFxuICovXG5mdW5jdGlvbiBwcmV0dGlmeShub2RlLCBvcHRpb25zKXtcbiAgcmV0dXJuIGNvbXByZXNzKCBub2RlLCBvcHRpb25zKTtcbn1cblxuLyoqXG4gKiBcbiAqIEBwYXJhbSB7YXJyYXl9IGFyciBcbiAqIEBwYXJhbSB7b2JqZWN0fSBvcHRpb25zIFxuICogQHBhcmFtIHtzdHJpbmd9IGpQYXRoIFxuICogQHJldHVybnMgb2JqZWN0XG4gKi9cbmZ1bmN0aW9uIGNvbXByZXNzKGFyciwgb3B0aW9ucywgalBhdGgpe1xuICBsZXQgdGV4dDtcbiAgY29uc3QgY29tcHJlc3NlZE9iaiA9IHt9O1xuICBmb3IgKGxldCBpID0gMDsgaSA8IGFyci5sZW5ndGg7IGkrKykge1xuICAgIGNvbnN0IHRhZ09iaiA9IGFycltpXTtcbiAgICBjb25zdCBwcm9wZXJ0eSA9IHByb3BOYW1lKHRhZ09iaik7XG4gICAgbGV0IG5ld0pwYXRoID0gXCJcIjtcbiAgICBpZihqUGF0aCA9PT0gdW5kZWZpbmVkKSBuZXdKcGF0aCA9IHByb3BlcnR5O1xuICAgIGVsc2UgbmV3SnBhdGggPSBqUGF0aCArIFwiLlwiICsgcHJvcGVydHk7XG5cbiAgICBpZihwcm9wZXJ0eSA9PT0gb3B0aW9ucy50ZXh0Tm9kZU5hbWUpe1xuICAgICAgaWYodGV4dCA9PT0gdW5kZWZpbmVkKSB0ZXh0ID0gdGFnT2JqW3Byb3BlcnR5XTtcbiAgICAgIGVsc2UgdGV4dCArPSBcIlwiICsgdGFnT2JqW3Byb3BlcnR5XTtcbiAgICB9ZWxzZSBpZihwcm9wZXJ0eSA9PT0gdW5kZWZpbmVkKXtcbiAgICAgIGNvbnRpbnVlO1xuICAgIH1lbHNlIGlmKHRhZ09ialtwcm9wZXJ0eV0pe1xuICAgICAgXG4gICAgICBsZXQgdmFsID0gY29tcHJlc3ModGFnT2JqW3Byb3BlcnR5XSwgb3B0aW9ucywgbmV3SnBhdGgpO1xuICAgICAgY29uc3QgaXNMZWFmID0gaXNMZWFmVGFnKHZhbCwgb3B0aW9ucyk7XG5cbiAgICAgIGlmKHRhZ09ialtcIjpAXCJdKXtcbiAgICAgICAgYXNzaWduQXR0cmlidXRlcyggdmFsLCB0YWdPYmpbXCI6QFwiXSwgbmV3SnBhdGgsIG9wdGlvbnMpO1xuICAgICAgfWVsc2UgaWYoT2JqZWN0LmtleXModmFsKS5sZW5ndGggPT09IDEgJiYgdmFsW29wdGlvbnMudGV4dE5vZGVOYW1lXSAhPT0gdW5kZWZpbmVkICYmICFvcHRpb25zLmFsd2F5c0NyZWF0ZVRleHROb2RlKXtcbiAgICAgICAgdmFsID0gdmFsW29wdGlvbnMudGV4dE5vZGVOYW1lXTtcbiAgICAgIH1lbHNlIGlmKE9iamVjdC5rZXlzKHZhbCkubGVuZ3RoID09PSAwKXtcbiAgICAgICAgaWYob3B0aW9ucy5hbHdheXNDcmVhdGVUZXh0Tm9kZSkgdmFsW29wdGlvbnMudGV4dE5vZGVOYW1lXSA9IFwiXCI7XG4gICAgICAgIGVsc2UgdmFsID0gXCJcIjtcbiAgICAgIH1cblxuICAgICAgaWYoY29tcHJlc3NlZE9ialtwcm9wZXJ0eV0gIT09IHVuZGVmaW5lZCAmJiBjb21wcmVzc2VkT2JqLmhhc093blByb3BlcnR5KHByb3BlcnR5KSkge1xuICAgICAgICBpZighQXJyYXkuaXNBcnJheShjb21wcmVzc2VkT2JqW3Byb3BlcnR5XSkpIHtcbiAgICAgICAgICAgIGNvbXByZXNzZWRPYmpbcHJvcGVydHldID0gWyBjb21wcmVzc2VkT2JqW3Byb3BlcnR5XSBdO1xuICAgICAgICB9XG4gICAgICAgIGNvbXByZXNzZWRPYmpbcHJvcGVydHldLnB1c2godmFsKTtcbiAgICAgIH1lbHNle1xuICAgICAgICAvL1RPRE86IGlmIGEgbm9kZSBpcyBub3QgYW4gYXJyYXksIHRoZW4gY2hlY2sgaWYgaXQgc2hvdWxkIGJlIGFuIGFycmF5XG4gICAgICAgIC8vYWxzbyBkZXRlcm1pbmUgaWYgaXQgaXMgYSBsZWFmIG5vZGVcbiAgICAgICAgaWYgKG9wdGlvbnMuaXNBcnJheShwcm9wZXJ0eSwgbmV3SnBhdGgsIGlzTGVhZiApKSB7XG4gICAgICAgICAgY29tcHJlc3NlZE9ialtwcm9wZXJ0eV0gPSBbdmFsXTtcbiAgICAgICAgfWVsc2V7XG4gICAgICAgICAgY29tcHJlc3NlZE9ialtwcm9wZXJ0eV0gPSB2YWw7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gICAgXG4gIH1cbiAgLy8gaWYodGV4dCAmJiB0ZXh0Lmxlbmd0aCA+IDApIGNvbXByZXNzZWRPYmpbb3B0aW9ucy50ZXh0Tm9kZU5hbWVdID0gdGV4dDtcbiAgaWYodHlwZW9mIHRleHQgPT09IFwic3RyaW5nXCIpe1xuICAgIGlmKHRleHQubGVuZ3RoID4gMCkgY29tcHJlc3NlZE9ialtvcHRpb25zLnRleHROb2RlTmFtZV0gPSB0ZXh0O1xuICB9ZWxzZSBpZih0ZXh0ICE9PSB1bmRlZmluZWQpIGNvbXByZXNzZWRPYmpbb3B0aW9ucy50ZXh0Tm9kZU5hbWVdID0gdGV4dDtcbiAgcmV0dXJuIGNvbXByZXNzZWRPYmo7XG59XG5cbmZ1bmN0aW9uIHByb3BOYW1lKG9iail7XG4gIGNvbnN0IGtleXMgPSBPYmplY3Qua2V5cyhvYmopO1xuICBmb3IgKGxldCBpID0gMDsgaSA8IGtleXMubGVuZ3RoOyBpKyspIHtcbiAgICBjb25zdCBrZXkgPSBrZXlzW2ldO1xuICAgIGlmKGtleSAhPT0gXCI6QFwiKSByZXR1cm4ga2V5O1xuICB9XG59XG5cbmZ1bmN0aW9uIGFzc2lnbkF0dHJpYnV0ZXMob2JqLCBhdHRyTWFwLCBqcGF0aCwgb3B0aW9ucyl7XG4gIGlmIChhdHRyTWFwKSB7XG4gICAgY29uc3Qga2V5cyA9IE9iamVjdC5rZXlzKGF0dHJNYXApO1xuICAgIGNvbnN0IGxlbiA9IGtleXMubGVuZ3RoOyAvL2Rvbid0IG1ha2UgaXQgaW5saW5lXG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCBsZW47IGkrKykge1xuICAgICAgY29uc3QgYXRyck5hbWUgPSBrZXlzW2ldO1xuICAgICAgaWYgKG9wdGlvbnMuaXNBcnJheShhdHJyTmFtZSwganBhdGggKyBcIi5cIiArIGF0cnJOYW1lLCB0cnVlLCB0cnVlKSkge1xuICAgICAgICBvYmpbYXRyck5hbWVdID0gWyBhdHRyTWFwW2F0cnJOYW1lXSBdO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgb2JqW2F0cnJOYW1lXSA9IGF0dHJNYXBbYXRyck5hbWVdO1xuICAgICAgfVxuICAgIH1cbiAgfVxufVxuXG5mdW5jdGlvbiBpc0xlYWZUYWcob2JqLCBvcHRpb25zKXtcbiAgY29uc3QgeyB0ZXh0Tm9kZU5hbWUgfSA9IG9wdGlvbnM7XG4gIGNvbnN0IHByb3BDb3VudCA9IE9iamVjdC5rZXlzKG9iaikubGVuZ3RoO1xuICBcbiAgaWYgKHByb3BDb3VudCA9PT0gMCkge1xuICAgIHJldHVybiB0cnVlO1xuICB9XG5cbiAgaWYgKFxuICAgIHByb3BDb3VudCA9PT0gMSAmJlxuICAgIChvYmpbdGV4dE5vZGVOYW1lXSB8fCB0eXBlb2Ygb2JqW3RleHROb2RlTmFtZV0gPT09IFwiYm9vbGVhblwiIHx8IG9ialt0ZXh0Tm9kZU5hbWVdID09PSAwKVxuICApIHtcbiAgICByZXR1cm4gdHJ1ZTtcbiAgfVxuXG4gIHJldHVybiBmYWxzZTtcbn1cbmV4cG9ydHMucHJldHRpZnkgPSBwcmV0dGlmeTtcbiIsCiAgICAiY29uc3QgeyBidWlsZE9wdGlvbnN9ID0gcmVxdWlyZShcIi4vT3B0aW9uc0J1aWxkZXJcIik7XG5jb25zdCBPcmRlcmVkT2JqUGFyc2VyID0gcmVxdWlyZShcIi4vT3JkZXJlZE9ialBhcnNlclwiKTtcbmNvbnN0IHsgcHJldHRpZnl9ID0gcmVxdWlyZShcIi4vbm9kZTJqc29uXCIpO1xuY29uc3QgdmFsaWRhdG9yID0gcmVxdWlyZSgnLi4vdmFsaWRhdG9yJyk7XG5cbmNsYXNzIFhNTFBhcnNlcntcbiAgICBcbiAgICBjb25zdHJ1Y3RvcihvcHRpb25zKXtcbiAgICAgICAgdGhpcy5leHRlcm5hbEVudGl0aWVzID0ge307XG4gICAgICAgIHRoaXMub3B0aW9ucyA9IGJ1aWxkT3B0aW9ucyhvcHRpb25zKTtcbiAgICAgICAgXG4gICAgfVxuICAgIC8qKlxuICAgICAqIFBhcnNlIFhNTCBkYXRzIHRvIEpTIG9iamVjdCBcbiAgICAgKiBAcGFyYW0ge3N0cmluZ3xCdWZmZXJ9IHhtbERhdGEgXG4gICAgICogQHBhcmFtIHtib29sZWFufE9iamVjdH0gdmFsaWRhdGlvbk9wdGlvbiBcbiAgICAgKi9cbiAgICBwYXJzZSh4bWxEYXRhLHZhbGlkYXRpb25PcHRpb24pe1xuICAgICAgICBpZih0eXBlb2YgeG1sRGF0YSA9PT0gXCJzdHJpbmdcIil7XG4gICAgICAgIH1lbHNlIGlmKCB4bWxEYXRhLnRvU3RyaW5nKXtcbiAgICAgICAgICAgIHhtbERhdGEgPSB4bWxEYXRhLnRvU3RyaW5nKCk7XG4gICAgICAgIH1lbHNle1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwiWE1MIGRhdGEgaXMgYWNjZXB0ZWQgaW4gU3RyaW5nIG9yIEJ5dGVzW10gZm9ybS5cIilcbiAgICAgICAgfVxuICAgICAgICBpZiggdmFsaWRhdGlvbk9wdGlvbil7XG4gICAgICAgICAgICBpZih2YWxpZGF0aW9uT3B0aW9uID09PSB0cnVlKSB2YWxpZGF0aW9uT3B0aW9uID0ge307IC8vdmFsaWRhdGUgd2l0aCBkZWZhdWx0IG9wdGlvbnNcbiAgICAgICAgICAgIFxuICAgICAgICAgICAgY29uc3QgcmVzdWx0ID0gdmFsaWRhdG9yLnZhbGlkYXRlKHhtbERhdGEsIHZhbGlkYXRpb25PcHRpb24pO1xuICAgICAgICAgICAgaWYgKHJlc3VsdCAhPT0gdHJ1ZSkge1xuICAgICAgICAgICAgICB0aHJvdyBFcnJvciggYCR7cmVzdWx0LmVyci5tc2d9OiR7cmVzdWx0LmVyci5saW5lfToke3Jlc3VsdC5lcnIuY29sfWAgKVxuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgY29uc3Qgb3JkZXJlZE9ialBhcnNlciA9IG5ldyBPcmRlcmVkT2JqUGFyc2VyKHRoaXMub3B0aW9ucyk7XG4gICAgICAgIG9yZGVyZWRPYmpQYXJzZXIuYWRkRXh0ZXJuYWxFbnRpdGllcyh0aGlzLmV4dGVybmFsRW50aXRpZXMpO1xuICAgICAgICBjb25zdCBvcmRlcmVkUmVzdWx0ID0gb3JkZXJlZE9ialBhcnNlci5wYXJzZVhtbCh4bWxEYXRhKTtcbiAgICAgICAgaWYodGhpcy5vcHRpb25zLnByZXNlcnZlT3JkZXIgfHwgb3JkZXJlZFJlc3VsdCA9PT0gdW5kZWZpbmVkKSByZXR1cm4gb3JkZXJlZFJlc3VsdDtcbiAgICAgICAgZWxzZSByZXR1cm4gcHJldHRpZnkob3JkZXJlZFJlc3VsdCwgdGhpcy5vcHRpb25zKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBBZGQgRW50aXR5IHdoaWNoIGlzIG5vdCBieSBkZWZhdWx0IHN1cHBvcnRlZCBieSB0aGlzIGxpYnJhcnlcbiAgICAgKiBAcGFyYW0ge3N0cmluZ30ga2V5IFxuICAgICAqIEBwYXJhbSB7c3RyaW5nfSB2YWx1ZSBcbiAgICAgKi9cbiAgICBhZGRFbnRpdHkoa2V5LCB2YWx1ZSl7XG4gICAgICAgIGlmKHZhbHVlLmluZGV4T2YoXCImXCIpICE9PSAtMSl7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJFbnRpdHkgdmFsdWUgY2FuJ3QgaGF2ZSAnJidcIilcbiAgICAgICAgfWVsc2UgaWYoa2V5LmluZGV4T2YoXCImXCIpICE9PSAtMSB8fCBrZXkuaW5kZXhPZihcIjtcIikgIT09IC0xKXtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihcIkFuIGVudGl0eSBtdXN0IGJlIHNldCB3aXRob3V0ICcmJyBhbmQgJzsnLiBFZy4gdXNlICcjeEQnIGZvciAnJiN4RDsnXCIpXG4gICAgICAgIH1lbHNlIGlmKHZhbHVlID09PSBcIiZcIil7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJBbiBlbnRpdHkgd2l0aCB2YWx1ZSAnJicgaXMgbm90IHBlcm1pdHRlZFwiKTtcbiAgICAgICAgfWVsc2V7XG4gICAgICAgICAgICB0aGlzLmV4dGVybmFsRW50aXRpZXNba2V5XSA9IHZhbHVlO1xuICAgICAgICB9XG4gICAgfVxufVxuXG5tb2R1bGUuZXhwb3J0cyA9IFhNTFBhcnNlcjsiLAogICAgImNvbnN0IEVPTCA9IFwiXFxuXCI7XG5cbi8qKlxuICogXG4gKiBAcGFyYW0ge2FycmF5fSBqQXJyYXkgXG4gKiBAcGFyYW0ge2FueX0gb3B0aW9ucyBcbiAqIEByZXR1cm5zIFxuICovXG5mdW5jdGlvbiB0b1htbChqQXJyYXksIG9wdGlvbnMpIHtcbiAgICBsZXQgaW5kZW50YXRpb24gPSBcIlwiO1xuICAgIGlmIChvcHRpb25zLmZvcm1hdCAmJiBvcHRpb25zLmluZGVudEJ5Lmxlbmd0aCA+IDApIHtcbiAgICAgICAgaW5kZW50YXRpb24gPSBFT0w7XG4gICAgfVxuICAgIHJldHVybiBhcnJUb1N0cihqQXJyYXksIG9wdGlvbnMsIFwiXCIsIGluZGVudGF0aW9uKTtcbn1cblxuZnVuY3Rpb24gYXJyVG9TdHIoYXJyLCBvcHRpb25zLCBqUGF0aCwgaW5kZW50YXRpb24pIHtcbiAgICBsZXQgeG1sU3RyID0gXCJcIjtcbiAgICBsZXQgaXNQcmV2aW91c0VsZW1lbnRUYWcgPSBmYWxzZTtcblxuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgYXJyLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgIGNvbnN0IHRhZ09iaiA9IGFycltpXTtcbiAgICAgICAgY29uc3QgdGFnTmFtZSA9IHByb3BOYW1lKHRhZ09iaik7XG4gICAgICAgIGlmKHRhZ05hbWUgPT09IHVuZGVmaW5lZCkgY29udGludWU7XG5cbiAgICAgICAgbGV0IG5ld0pQYXRoID0gXCJcIjtcbiAgICAgICAgaWYgKGpQYXRoLmxlbmd0aCA9PT0gMCkgbmV3SlBhdGggPSB0YWdOYW1lXG4gICAgICAgIGVsc2UgbmV3SlBhdGggPSBgJHtqUGF0aH0uJHt0YWdOYW1lfWA7XG5cbiAgICAgICAgaWYgKHRhZ05hbWUgPT09IG9wdGlvbnMudGV4dE5vZGVOYW1lKSB7XG4gICAgICAgICAgICBsZXQgdGFnVGV4dCA9IHRhZ09ialt0YWdOYW1lXTtcbiAgICAgICAgICAgIGlmICghaXNTdG9wTm9kZShuZXdKUGF0aCwgb3B0aW9ucykpIHtcbiAgICAgICAgICAgICAgICB0YWdUZXh0ID0gb3B0aW9ucy50YWdWYWx1ZVByb2Nlc3Nvcih0YWdOYW1lLCB0YWdUZXh0KTtcbiAgICAgICAgICAgICAgICB0YWdUZXh0ID0gcmVwbGFjZUVudGl0aWVzVmFsdWUodGFnVGV4dCwgb3B0aW9ucyk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAoaXNQcmV2aW91c0VsZW1lbnRUYWcpIHtcbiAgICAgICAgICAgICAgICB4bWxTdHIgKz0gaW5kZW50YXRpb247XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICB4bWxTdHIgKz0gdGFnVGV4dDtcbiAgICAgICAgICAgIGlzUHJldmlvdXNFbGVtZW50VGFnID0gZmFsc2U7XG4gICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgfSBlbHNlIGlmICh0YWdOYW1lID09PSBvcHRpb25zLmNkYXRhUHJvcE5hbWUpIHtcbiAgICAgICAgICAgIGlmIChpc1ByZXZpb3VzRWxlbWVudFRhZykge1xuICAgICAgICAgICAgICAgIHhtbFN0ciArPSBpbmRlbnRhdGlvbjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHhtbFN0ciArPSBgPCFbQ0RBVEFbJHt0YWdPYmpbdGFnTmFtZV1bMF1bb3B0aW9ucy50ZXh0Tm9kZU5hbWVdfV1dPmA7XG4gICAgICAgICAgICBpc1ByZXZpb3VzRWxlbWVudFRhZyA9IGZhbHNlO1xuICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgIH0gZWxzZSBpZiAodGFnTmFtZSA9PT0gb3B0aW9ucy5jb21tZW50UHJvcE5hbWUpIHtcbiAgICAgICAgICAgIHhtbFN0ciArPSBpbmRlbnRhdGlvbiArIGA8IS0tJHt0YWdPYmpbdGFnTmFtZV1bMF1bb3B0aW9ucy50ZXh0Tm9kZU5hbWVdfS0tPmA7XG4gICAgICAgICAgICBpc1ByZXZpb3VzRWxlbWVudFRhZyA9IHRydWU7XG4gICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgfSBlbHNlIGlmICh0YWdOYW1lWzBdID09PSBcIj9cIikge1xuICAgICAgICAgICAgY29uc3QgYXR0U3RyID0gYXR0cl90b19zdHIodGFnT2JqW1wiOkBcIl0sIG9wdGlvbnMpO1xuICAgICAgICAgICAgY29uc3QgdGVtcEluZCA9IHRhZ05hbWUgPT09IFwiP3htbFwiID8gXCJcIiA6IGluZGVudGF0aW9uO1xuICAgICAgICAgICAgbGV0IHBpVGV4dE5vZGVOYW1lID0gdGFnT2JqW3RhZ05hbWVdWzBdW29wdGlvbnMudGV4dE5vZGVOYW1lXTtcbiAgICAgICAgICAgIHBpVGV4dE5vZGVOYW1lID0gcGlUZXh0Tm9kZU5hbWUubGVuZ3RoICE9PSAwID8gXCIgXCIgKyBwaVRleHROb2RlTmFtZSA6IFwiXCI7IC8vcmVtb3ZlIGV4dHJhIHNwYWNpbmdcbiAgICAgICAgICAgIHhtbFN0ciArPSB0ZW1wSW5kICsgYDwke3RhZ05hbWV9JHtwaVRleHROb2RlTmFtZX0ke2F0dFN0cn0/PmA7XG4gICAgICAgICAgICBpc1ByZXZpb3VzRWxlbWVudFRhZyA9IHRydWU7XG4gICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgfVxuICAgICAgICBsZXQgbmV3SWRlbnRhdGlvbiA9IGluZGVudGF0aW9uO1xuICAgICAgICBpZiAobmV3SWRlbnRhdGlvbiAhPT0gXCJcIikge1xuICAgICAgICAgICAgbmV3SWRlbnRhdGlvbiArPSBvcHRpb25zLmluZGVudEJ5O1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IGF0dFN0ciA9IGF0dHJfdG9fc3RyKHRhZ09ialtcIjpAXCJdLCBvcHRpb25zKTtcbiAgICAgICAgY29uc3QgdGFnU3RhcnQgPSBpbmRlbnRhdGlvbiArIGA8JHt0YWdOYW1lfSR7YXR0U3RyfWA7XG4gICAgICAgIGNvbnN0IHRhZ1ZhbHVlID0gYXJyVG9TdHIodGFnT2JqW3RhZ05hbWVdLCBvcHRpb25zLCBuZXdKUGF0aCwgbmV3SWRlbnRhdGlvbik7XG4gICAgICAgIGlmIChvcHRpb25zLnVucGFpcmVkVGFncy5pbmRleE9mKHRhZ05hbWUpICE9PSAtMSkge1xuICAgICAgICAgICAgaWYgKG9wdGlvbnMuc3VwcHJlc3NVbnBhaXJlZE5vZGUpIHhtbFN0ciArPSB0YWdTdGFydCArIFwiPlwiO1xuICAgICAgICAgICAgZWxzZSB4bWxTdHIgKz0gdGFnU3RhcnQgKyBcIi8+XCI7XG4gICAgICAgIH0gZWxzZSBpZiAoKCF0YWdWYWx1ZSB8fCB0YWdWYWx1ZS5sZW5ndGggPT09IDApICYmIG9wdGlvbnMuc3VwcHJlc3NFbXB0eU5vZGUpIHtcbiAgICAgICAgICAgIHhtbFN0ciArPSB0YWdTdGFydCArIFwiLz5cIjtcbiAgICAgICAgfSBlbHNlIGlmICh0YWdWYWx1ZSAmJiB0YWdWYWx1ZS5lbmRzV2l0aChcIj5cIikpIHtcbiAgICAgICAgICAgIHhtbFN0ciArPSB0YWdTdGFydCArIGA+JHt0YWdWYWx1ZX0ke2luZGVudGF0aW9ufTwvJHt0YWdOYW1lfT5gO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgeG1sU3RyICs9IHRhZ1N0YXJ0ICsgXCI+XCI7XG4gICAgICAgICAgICBpZiAodGFnVmFsdWUgJiYgaW5kZW50YXRpb24gIT09IFwiXCIgJiYgKHRhZ1ZhbHVlLmluY2x1ZGVzKFwiLz5cIikgfHwgdGFnVmFsdWUuaW5jbHVkZXMoXCI8L1wiKSkpIHtcbiAgICAgICAgICAgICAgICB4bWxTdHIgKz0gaW5kZW50YXRpb24gKyBvcHRpb25zLmluZGVudEJ5ICsgdGFnVmFsdWUgKyBpbmRlbnRhdGlvbjtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgeG1sU3RyICs9IHRhZ1ZhbHVlO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgeG1sU3RyICs9IGA8LyR7dGFnTmFtZX0+YDtcbiAgICAgICAgfVxuICAgICAgICBpc1ByZXZpb3VzRWxlbWVudFRhZyA9IHRydWU7XG4gICAgfVxuXG4gICAgcmV0dXJuIHhtbFN0cjtcbn1cblxuZnVuY3Rpb24gcHJvcE5hbWUob2JqKSB7XG4gICAgY29uc3Qga2V5cyA9IE9iamVjdC5rZXlzKG9iaik7XG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCBrZXlzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgIGNvbnN0IGtleSA9IGtleXNbaV07XG4gICAgICAgIGlmKCFvYmouaGFzT3duUHJvcGVydHkoa2V5KSkgY29udGludWU7XG4gICAgICAgIGlmIChrZXkgIT09IFwiOkBcIikgcmV0dXJuIGtleTtcbiAgICB9XG59XG5cbmZ1bmN0aW9uIGF0dHJfdG9fc3RyKGF0dHJNYXAsIG9wdGlvbnMpIHtcbiAgICBsZXQgYXR0clN0ciA9IFwiXCI7XG4gICAgaWYgKGF0dHJNYXAgJiYgIW9wdGlvbnMuaWdub3JlQXR0cmlidXRlcykge1xuICAgICAgICBmb3IgKGxldCBhdHRyIGluIGF0dHJNYXApIHtcbiAgICAgICAgICAgIGlmKCFhdHRyTWFwLmhhc093blByb3BlcnR5KGF0dHIpKSBjb250aW51ZTtcbiAgICAgICAgICAgIGxldCBhdHRyVmFsID0gb3B0aW9ucy5hdHRyaWJ1dGVWYWx1ZVByb2Nlc3NvcihhdHRyLCBhdHRyTWFwW2F0dHJdKTtcbiAgICAgICAgICAgIGF0dHJWYWwgPSByZXBsYWNlRW50aXRpZXNWYWx1ZShhdHRyVmFsLCBvcHRpb25zKTtcbiAgICAgICAgICAgIGlmIChhdHRyVmFsID09PSB0cnVlICYmIG9wdGlvbnMuc3VwcHJlc3NCb29sZWFuQXR0cmlidXRlcykge1xuICAgICAgICAgICAgICAgIGF0dHJTdHIgKz0gYCAke2F0dHIuc3Vic3RyKG9wdGlvbnMuYXR0cmlidXRlTmFtZVByZWZpeC5sZW5ndGgpfWA7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIGF0dHJTdHIgKz0gYCAke2F0dHIuc3Vic3RyKG9wdGlvbnMuYXR0cmlidXRlTmFtZVByZWZpeC5sZW5ndGgpfT1cIiR7YXR0clZhbH1cImA7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIGF0dHJTdHI7XG59XG5cbmZ1bmN0aW9uIGlzU3RvcE5vZGUoalBhdGgsIG9wdGlvbnMpIHtcbiAgICBqUGF0aCA9IGpQYXRoLnN1YnN0cigwLCBqUGF0aC5sZW5ndGggLSBvcHRpb25zLnRleHROb2RlTmFtZS5sZW5ndGggLSAxKTtcbiAgICBsZXQgdGFnTmFtZSA9IGpQYXRoLnN1YnN0cihqUGF0aC5sYXN0SW5kZXhPZihcIi5cIikgKyAxKTtcbiAgICBmb3IgKGxldCBpbmRleCBpbiBvcHRpb25zLnN0b3BOb2Rlcykge1xuICAgICAgICBpZiAob3B0aW9ucy5zdG9wTm9kZXNbaW5kZXhdID09PSBqUGF0aCB8fCBvcHRpb25zLnN0b3BOb2Rlc1tpbmRleF0gPT09IFwiKi5cIiArIHRhZ05hbWUpIHJldHVybiB0cnVlO1xuICAgIH1cbiAgICByZXR1cm4gZmFsc2U7XG59XG5cbmZ1bmN0aW9uIHJlcGxhY2VFbnRpdGllc1ZhbHVlKHRleHRWYWx1ZSwgb3B0aW9ucykge1xuICAgIGlmICh0ZXh0VmFsdWUgJiYgdGV4dFZhbHVlLmxlbmd0aCA+IDAgJiYgb3B0aW9ucy5wcm9jZXNzRW50aXRpZXMpIHtcbiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBvcHRpb25zLmVudGl0aWVzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICBjb25zdCBlbnRpdHkgPSBvcHRpb25zLmVudGl0aWVzW2ldO1xuICAgICAgICAgICAgdGV4dFZhbHVlID0gdGV4dFZhbHVlLnJlcGxhY2UoZW50aXR5LnJlZ2V4LCBlbnRpdHkudmFsKTtcbiAgICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gdGV4dFZhbHVlO1xufVxubW9kdWxlLmV4cG9ydHMgPSB0b1htbDtcbiIsCiAgICAiJ3VzZSBzdHJpY3QnO1xuLy9wYXJzZSBFbXB0eSBOb2RlIGFzIHNlbGYgY2xvc2luZyBub2RlXG5jb25zdCBidWlsZEZyb21PcmRlcmVkSnMgPSByZXF1aXJlKCcuL29yZGVyZWRKczJYbWwnKTtcbmNvbnN0IGdldElnbm9yZUF0dHJpYnV0ZXNGbiA9IHJlcXVpcmUoJy4uL2lnbm9yZUF0dHJpYnV0ZXMnKVxuXG5jb25zdCBkZWZhdWx0T3B0aW9ucyA9IHtcbiAgYXR0cmlidXRlTmFtZVByZWZpeDogJ0BfJyxcbiAgYXR0cmlidXRlc0dyb3VwTmFtZTogZmFsc2UsXG4gIHRleHROb2RlTmFtZTogJyN0ZXh0JyxcbiAgaWdub3JlQXR0cmlidXRlczogdHJ1ZSxcbiAgY2RhdGFQcm9wTmFtZTogZmFsc2UsXG4gIGZvcm1hdDogZmFsc2UsXG4gIGluZGVudEJ5OiAnICAnLFxuICBzdXBwcmVzc0VtcHR5Tm9kZTogZmFsc2UsXG4gIHN1cHByZXNzVW5wYWlyZWROb2RlOiB0cnVlLFxuICBzdXBwcmVzc0Jvb2xlYW5BdHRyaWJ1dGVzOiB0cnVlLFxuICB0YWdWYWx1ZVByb2Nlc3NvcjogZnVuY3Rpb24oa2V5LCBhKSB7XG4gICAgcmV0dXJuIGE7XG4gIH0sXG4gIGF0dHJpYnV0ZVZhbHVlUHJvY2Vzc29yOiBmdW5jdGlvbihhdHRyTmFtZSwgYSkge1xuICAgIHJldHVybiBhO1xuICB9LFxuICBwcmVzZXJ2ZU9yZGVyOiBmYWxzZSxcbiAgY29tbWVudFByb3BOYW1lOiBmYWxzZSxcbiAgdW5wYWlyZWRUYWdzOiBbXSxcbiAgZW50aXRpZXM6IFtcbiAgICB7IHJlZ2V4OiBuZXcgUmVnRXhwKFwiJlwiLCBcImdcIiksIHZhbDogXCImYW1wO1wiIH0sLy9pdCBtdXN0IGJlIG9uIHRvcFxuICAgIHsgcmVnZXg6IG5ldyBSZWdFeHAoXCI+XCIsIFwiZ1wiKSwgdmFsOiBcIiZndDtcIiB9LFxuICAgIHsgcmVnZXg6IG5ldyBSZWdFeHAoXCI8XCIsIFwiZ1wiKSwgdmFsOiBcIiZsdDtcIiB9LFxuICAgIHsgcmVnZXg6IG5ldyBSZWdFeHAoXCJcXCdcIiwgXCJnXCIpLCB2YWw6IFwiJmFwb3M7XCIgfSxcbiAgICB7IHJlZ2V4OiBuZXcgUmVnRXhwKFwiXFxcIlwiLCBcImdcIiksIHZhbDogXCImcXVvdDtcIiB9XG4gIF0sXG4gIHByb2Nlc3NFbnRpdGllczogdHJ1ZSxcbiAgc3RvcE5vZGVzOiBbXSxcbiAgLy8gdHJhbnNmb3JtVGFnTmFtZTogZmFsc2UsXG4gIC8vIHRyYW5zZm9ybUF0dHJpYnV0ZU5hbWU6IGZhbHNlLFxuICBvbmVMaXN0R3JvdXA6IGZhbHNlXG59O1xuXG5mdW5jdGlvbiBCdWlsZGVyKG9wdGlvbnMpIHtcbiAgdGhpcy5vcHRpb25zID0gT2JqZWN0LmFzc2lnbih7fSwgZGVmYXVsdE9wdGlvbnMsIG9wdGlvbnMpO1xuICBpZiAodGhpcy5vcHRpb25zLmlnbm9yZUF0dHJpYnV0ZXMgPT09IHRydWUgfHwgdGhpcy5vcHRpb25zLmF0dHJpYnV0ZXNHcm91cE5hbWUpIHtcbiAgICB0aGlzLmlzQXR0cmlidXRlID0gZnVuY3Rpb24oLyphKi8pIHtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9O1xuICB9IGVsc2Uge1xuICAgIHRoaXMuaWdub3JlQXR0cmlidXRlc0ZuID0gZ2V0SWdub3JlQXR0cmlidXRlc0ZuKHRoaXMub3B0aW9ucy5pZ25vcmVBdHRyaWJ1dGVzKVxuICAgIHRoaXMuYXR0clByZWZpeExlbiA9IHRoaXMub3B0aW9ucy5hdHRyaWJ1dGVOYW1lUHJlZml4Lmxlbmd0aDtcbiAgICB0aGlzLmlzQXR0cmlidXRlID0gaXNBdHRyaWJ1dGU7XG4gIH1cblxuICB0aGlzLnByb2Nlc3NUZXh0T3JPYmpOb2RlID0gcHJvY2Vzc1RleHRPck9iak5vZGVcblxuICBpZiAodGhpcy5vcHRpb25zLmZvcm1hdCkge1xuICAgIHRoaXMuaW5kZW50YXRlID0gaW5kZW50YXRlO1xuICAgIHRoaXMudGFnRW5kQ2hhciA9ICc+XFxuJztcbiAgICB0aGlzLm5ld0xpbmUgPSAnXFxuJztcbiAgfSBlbHNlIHtcbiAgICB0aGlzLmluZGVudGF0ZSA9IGZ1bmN0aW9uKCkge1xuICAgICAgcmV0dXJuICcnO1xuICAgIH07XG4gICAgdGhpcy50YWdFbmRDaGFyID0gJz4nO1xuICAgIHRoaXMubmV3TGluZSA9ICcnO1xuICB9XG59XG5cbkJ1aWxkZXIucHJvdG90eXBlLmJ1aWxkID0gZnVuY3Rpb24oak9iaikge1xuICBpZih0aGlzLm9wdGlvbnMucHJlc2VydmVPcmRlcil7XG4gICAgcmV0dXJuIGJ1aWxkRnJvbU9yZGVyZWRKcyhqT2JqLCB0aGlzLm9wdGlvbnMpO1xuICB9ZWxzZSB7XG4gICAgaWYoQXJyYXkuaXNBcnJheShqT2JqKSAmJiB0aGlzLm9wdGlvbnMuYXJyYXlOb2RlTmFtZSAmJiB0aGlzLm9wdGlvbnMuYXJyYXlOb2RlTmFtZS5sZW5ndGggPiAxKXtcbiAgICAgIGpPYmogPSB7XG4gICAgICAgIFt0aGlzLm9wdGlvbnMuYXJyYXlOb2RlTmFtZV0gOiBqT2JqXG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiB0aGlzLmoyeChqT2JqLCAwLCBbXSkudmFsO1xuICB9XG59O1xuXG5CdWlsZGVyLnByb3RvdHlwZS5qMnggPSBmdW5jdGlvbihqT2JqLCBsZXZlbCwgYWpQYXRoKSB7XG4gIGxldCBhdHRyU3RyID0gJyc7XG4gIGxldCB2YWwgPSAnJztcbiAgY29uc3QgalBhdGggPSBhalBhdGguam9pbignLicpXG4gIGZvciAobGV0IGtleSBpbiBqT2JqKSB7XG4gICAgaWYoIU9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChqT2JqLCBrZXkpKSBjb250aW51ZTtcbiAgICBpZiAodHlwZW9mIGpPYmpba2V5XSA9PT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgIC8vIHN1cHJlc3MgdW5kZWZpbmVkIG5vZGUgb25seSBpZiBpdCBpcyBub3QgYW4gYXR0cmlidXRlXG4gICAgICBpZiAodGhpcy5pc0F0dHJpYnV0ZShrZXkpKSB7XG4gICAgICAgIHZhbCArPSAnJztcbiAgICAgIH1cbiAgICB9IGVsc2UgaWYgKGpPYmpba2V5XSA9PT0gbnVsbCkge1xuICAgICAgLy8gbnVsbCBhdHRyaWJ1dGUgc2hvdWxkIGJlIGlnbm9yZWQgYnkgdGhlIGF0dHJpYnV0ZSBsaXN0LCBidXQgc2hvdWxkIG5vdCBjYXVzZSB0aGUgdGFnIGNsb3NpbmdcbiAgICAgIGlmICh0aGlzLmlzQXR0cmlidXRlKGtleSkpIHtcbiAgICAgICAgdmFsICs9ICcnO1xuICAgICAgfSBlbHNlIGlmIChrZXlbMF0gPT09ICc/Jykge1xuICAgICAgICB2YWwgKz0gdGhpcy5pbmRlbnRhdGUobGV2ZWwpICsgJzwnICsga2V5ICsgJz8nICsgdGhpcy50YWdFbmRDaGFyO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdmFsICs9IHRoaXMuaW5kZW50YXRlKGxldmVsKSArICc8JyArIGtleSArICcvJyArIHRoaXMudGFnRW5kQ2hhcjtcbiAgICAgIH1cbiAgICAgIC8vIHZhbCArPSB0aGlzLmluZGVudGF0ZShsZXZlbCkgKyAnPCcgKyBrZXkgKyAnLycgKyB0aGlzLnRhZ0VuZENoYXI7XG4gICAgfSBlbHNlIGlmIChqT2JqW2tleV0gaW5zdGFuY2VvZiBEYXRlKSB7XG4gICAgICB2YWwgKz0gdGhpcy5idWlsZFRleHRWYWxOb2RlKGpPYmpba2V5XSwga2V5LCAnJywgbGV2ZWwpO1xuICAgIH0gZWxzZSBpZiAodHlwZW9mIGpPYmpba2V5XSAhPT0gJ29iamVjdCcpIHtcbiAgICAgIC8vcHJlbWl0aXZlIHR5cGVcbiAgICAgIGNvbnN0IGF0dHIgPSB0aGlzLmlzQXR0cmlidXRlKGtleSk7XG4gICAgICBpZiAoYXR0ciAmJiAhdGhpcy5pZ25vcmVBdHRyaWJ1dGVzRm4oYXR0ciwgalBhdGgpKSB7XG4gICAgICAgIGF0dHJTdHIgKz0gdGhpcy5idWlsZEF0dHJQYWlyU3RyKGF0dHIsICcnICsgak9ialtrZXldKTtcbiAgICAgIH0gZWxzZSBpZiAoIWF0dHIpIHtcbiAgICAgICAgLy90YWcgdmFsdWVcbiAgICAgICAgaWYgKGtleSA9PT0gdGhpcy5vcHRpb25zLnRleHROb2RlTmFtZSkge1xuICAgICAgICAgIGxldCBuZXd2YWwgPSB0aGlzLm9wdGlvbnMudGFnVmFsdWVQcm9jZXNzb3Ioa2V5LCAnJyArIGpPYmpba2V5XSk7XG4gICAgICAgICAgdmFsICs9IHRoaXMucmVwbGFjZUVudGl0aWVzVmFsdWUobmV3dmFsKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICB2YWwgKz0gdGhpcy5idWlsZFRleHRWYWxOb2RlKGpPYmpba2V5XSwga2V5LCAnJywgbGV2ZWwpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfSBlbHNlIGlmIChBcnJheS5pc0FycmF5KGpPYmpba2V5XSkpIHtcbiAgICAgIC8vcmVwZWF0ZWQgbm9kZXNcbiAgICAgIGNvbnN0IGFyckxlbiA9IGpPYmpba2V5XS5sZW5ndGg7XG4gICAgICBsZXQgbGlzdFRhZ1ZhbCA9IFwiXCI7XG4gICAgICBsZXQgbGlzdFRhZ0F0dHIgPSBcIlwiO1xuICAgICAgZm9yIChsZXQgaiA9IDA7IGogPCBhcnJMZW47IGorKykge1xuICAgICAgICBjb25zdCBpdGVtID0gak9ialtrZXldW2pdO1xuICAgICAgICBpZiAodHlwZW9mIGl0ZW0gPT09ICd1bmRlZmluZWQnKSB7XG4gICAgICAgICAgLy8gc3VwcmVzcyB1bmRlZmluZWQgbm9kZVxuICAgICAgICB9IGVsc2UgaWYgKGl0ZW0gPT09IG51bGwpIHtcbiAgICAgICAgICBpZihrZXlbMF0gPT09IFwiP1wiKSB2YWwgKz0gdGhpcy5pbmRlbnRhdGUobGV2ZWwpICsgJzwnICsga2V5ICsgJz8nICsgdGhpcy50YWdFbmRDaGFyO1xuICAgICAgICAgIGVsc2UgdmFsICs9IHRoaXMuaW5kZW50YXRlKGxldmVsKSArICc8JyArIGtleSArICcvJyArIHRoaXMudGFnRW5kQ2hhcjtcbiAgICAgICAgICAvLyB2YWwgKz0gdGhpcy5pbmRlbnRhdGUobGV2ZWwpICsgJzwnICsga2V5ICsgJy8nICsgdGhpcy50YWdFbmRDaGFyO1xuICAgICAgICB9IGVsc2UgaWYgKHR5cGVvZiBpdGVtID09PSAnb2JqZWN0Jykge1xuICAgICAgICAgIGlmKHRoaXMub3B0aW9ucy5vbmVMaXN0R3JvdXApe1xuICAgICAgICAgICAgY29uc3QgcmVzdWx0ID0gdGhpcy5qMngoaXRlbSwgbGV2ZWwgKyAxLCBhalBhdGguY29uY2F0KGtleSkpO1xuICAgICAgICAgICAgbGlzdFRhZ1ZhbCArPSByZXN1bHQudmFsO1xuICAgICAgICAgICAgaWYgKHRoaXMub3B0aW9ucy5hdHRyaWJ1dGVzR3JvdXBOYW1lICYmIGl0ZW0uaGFzT3duUHJvcGVydHkodGhpcy5vcHRpb25zLmF0dHJpYnV0ZXNHcm91cE5hbWUpKSB7XG4gICAgICAgICAgICAgIGxpc3RUYWdBdHRyICs9IHJlc3VsdC5hdHRyU3RyXG4gICAgICAgICAgICB9XG4gICAgICAgICAgfWVsc2V7XG4gICAgICAgICAgICBsaXN0VGFnVmFsICs9IHRoaXMucHJvY2Vzc1RleHRPck9iak5vZGUoaXRlbSwga2V5LCBsZXZlbCwgYWpQYXRoKVxuICAgICAgICAgIH1cbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBpZiAodGhpcy5vcHRpb25zLm9uZUxpc3RHcm91cCkge1xuICAgICAgICAgICAgbGV0IHRleHRWYWx1ZSA9IHRoaXMub3B0aW9ucy50YWdWYWx1ZVByb2Nlc3NvcihrZXksIGl0ZW0pO1xuICAgICAgICAgICAgdGV4dFZhbHVlID0gdGhpcy5yZXBsYWNlRW50aXRpZXNWYWx1ZSh0ZXh0VmFsdWUpO1xuICAgICAgICAgICAgbGlzdFRhZ1ZhbCArPSB0ZXh0VmFsdWU7XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGxpc3RUYWdWYWwgKz0gdGhpcy5idWlsZFRleHRWYWxOb2RlKGl0ZW0sIGtleSwgJycsIGxldmVsKTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIGlmKHRoaXMub3B0aW9ucy5vbmVMaXN0R3JvdXApe1xuICAgICAgICBsaXN0VGFnVmFsID0gdGhpcy5idWlsZE9iamVjdE5vZGUobGlzdFRhZ1ZhbCwga2V5LCBsaXN0VGFnQXR0ciwgbGV2ZWwpO1xuICAgICAgfVxuICAgICAgdmFsICs9IGxpc3RUYWdWYWw7XG4gICAgfSBlbHNlIHtcbiAgICAgIC8vbmVzdGVkIG5vZGVcbiAgICAgIGlmICh0aGlzLm9wdGlvbnMuYXR0cmlidXRlc0dyb3VwTmFtZSAmJiBrZXkgPT09IHRoaXMub3B0aW9ucy5hdHRyaWJ1dGVzR3JvdXBOYW1lKSB7XG4gICAgICAgIGNvbnN0IEtzID0gT2JqZWN0LmtleXMoak9ialtrZXldKTtcbiAgICAgICAgY29uc3QgTCA9IEtzLmxlbmd0aDtcbiAgICAgICAgZm9yIChsZXQgaiA9IDA7IGogPCBMOyBqKyspIHtcbiAgICAgICAgICBhdHRyU3RyICs9IHRoaXMuYnVpbGRBdHRyUGFpclN0cihLc1tqXSwgJycgKyBqT2JqW2tleV1bS3Nbal1dKTtcbiAgICAgICAgfVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdmFsICs9IHRoaXMucHJvY2Vzc1RleHRPck9iak5vZGUoak9ialtrZXldLCBrZXksIGxldmVsLCBhalBhdGgpXG4gICAgICB9XG4gICAgfVxuICB9XG4gIHJldHVybiB7YXR0clN0cjogYXR0clN0ciwgdmFsOiB2YWx9O1xufTtcblxuQnVpbGRlci5wcm90b3R5cGUuYnVpbGRBdHRyUGFpclN0ciA9IGZ1bmN0aW9uKGF0dHJOYW1lLCB2YWwpe1xuICB2YWwgPSB0aGlzLm9wdGlvbnMuYXR0cmlidXRlVmFsdWVQcm9jZXNzb3IoYXR0ck5hbWUsICcnICsgdmFsKTtcbiAgdmFsID0gdGhpcy5yZXBsYWNlRW50aXRpZXNWYWx1ZSh2YWwpO1xuICBpZiAodGhpcy5vcHRpb25zLnN1cHByZXNzQm9vbGVhbkF0dHJpYnV0ZXMgJiYgdmFsID09PSBcInRydWVcIikge1xuICAgIHJldHVybiAnICcgKyBhdHRyTmFtZTtcbiAgfSBlbHNlIHJldHVybiAnICcgKyBhdHRyTmFtZSArICc9XCInICsgdmFsICsgJ1wiJztcbn1cblxuZnVuY3Rpb24gcHJvY2Vzc1RleHRPck9iak5vZGUgKG9iamVjdCwga2V5LCBsZXZlbCwgYWpQYXRoKSB7XG4gIGNvbnN0IHJlc3VsdCA9IHRoaXMuajJ4KG9iamVjdCwgbGV2ZWwgKyAxLCBhalBhdGguY29uY2F0KGtleSkpO1xuICBpZiAob2JqZWN0W3RoaXMub3B0aW9ucy50ZXh0Tm9kZU5hbWVdICE9PSB1bmRlZmluZWQgJiYgT2JqZWN0LmtleXMob2JqZWN0KS5sZW5ndGggPT09IDEpIHtcbiAgICByZXR1cm4gdGhpcy5idWlsZFRleHRWYWxOb2RlKG9iamVjdFt0aGlzLm9wdGlvbnMudGV4dE5vZGVOYW1lXSwga2V5LCByZXN1bHQuYXR0clN0ciwgbGV2ZWwpO1xuICB9IGVsc2Uge1xuICAgIHJldHVybiB0aGlzLmJ1aWxkT2JqZWN0Tm9kZShyZXN1bHQudmFsLCBrZXksIHJlc3VsdC5hdHRyU3RyLCBsZXZlbCk7XG4gIH1cbn1cblxuQnVpbGRlci5wcm90b3R5cGUuYnVpbGRPYmplY3ROb2RlID0gZnVuY3Rpb24odmFsLCBrZXksIGF0dHJTdHIsIGxldmVsKSB7XG4gIGlmKHZhbCA9PT0gXCJcIil7XG4gICAgaWYoa2V5WzBdID09PSBcIj9cIikgcmV0dXJuICB0aGlzLmluZGVudGF0ZShsZXZlbCkgKyAnPCcgKyBrZXkgKyBhdHRyU3RyKyAnPycgKyB0aGlzLnRhZ0VuZENoYXI7XG4gICAgZWxzZSB7XG4gICAgICByZXR1cm4gdGhpcy5pbmRlbnRhdGUobGV2ZWwpICsgJzwnICsga2V5ICsgYXR0clN0ciArIHRoaXMuY2xvc2VUYWcoa2V5KSArIHRoaXMudGFnRW5kQ2hhcjtcbiAgICB9XG4gIH1lbHNle1xuXG4gICAgbGV0IHRhZ0VuZEV4cCA9ICc8LycgKyBrZXkgKyB0aGlzLnRhZ0VuZENoYXI7XG4gICAgbGV0IHBpQ2xvc2luZ0NoYXIgPSBcIlwiO1xuICAgIFxuICAgIGlmKGtleVswXSA9PT0gXCI/XCIpIHtcbiAgICAgIHBpQ2xvc2luZ0NoYXIgPSBcIj9cIjtcbiAgICAgIHRhZ0VuZEV4cCA9IFwiXCI7XG4gICAgfVxuICBcbiAgICAvLyBhdHRyU3RyIGlzIGFuIGVtcHR5IHN0cmluZyBpbiBjYXNlIHRoZSBhdHRyaWJ1dGUgY2FtZSBhcyB1bmRlZmluZWQgb3IgbnVsbFxuICAgIGlmICgoYXR0clN0ciB8fCBhdHRyU3RyID09PSAnJykgJiYgdmFsLmluZGV4T2YoJzwnKSA9PT0gLTEpIHtcbiAgICAgIHJldHVybiAoIHRoaXMuaW5kZW50YXRlKGxldmVsKSArICc8JyArICBrZXkgKyBhdHRyU3RyICsgcGlDbG9zaW5nQ2hhciArICc+JyArIHZhbCArIHRhZ0VuZEV4cCApO1xuICAgIH0gZWxzZSBpZiAodGhpcy5vcHRpb25zLmNvbW1lbnRQcm9wTmFtZSAhPT0gZmFsc2UgJiYga2V5ID09PSB0aGlzLm9wdGlvbnMuY29tbWVudFByb3BOYW1lICYmIHBpQ2xvc2luZ0NoYXIubGVuZ3RoID09PSAwKSB7XG4gICAgICByZXR1cm4gdGhpcy5pbmRlbnRhdGUobGV2ZWwpICsgYDwhLS0ke3ZhbH0tLT5gICsgdGhpcy5uZXdMaW5lO1xuICAgIH1lbHNlIHtcbiAgICAgIHJldHVybiAoXG4gICAgICAgIHRoaXMuaW5kZW50YXRlKGxldmVsKSArICc8JyArIGtleSArIGF0dHJTdHIgKyBwaUNsb3NpbmdDaGFyICsgdGhpcy50YWdFbmRDaGFyICtcbiAgICAgICAgdmFsICtcbiAgICAgICAgdGhpcy5pbmRlbnRhdGUobGV2ZWwpICsgdGFnRW5kRXhwICAgICk7XG4gICAgfVxuICB9XG59XG5cbkJ1aWxkZXIucHJvdG90eXBlLmNsb3NlVGFnID0gZnVuY3Rpb24oa2V5KXtcbiAgbGV0IGNsb3NlVGFnID0gXCJcIjtcbiAgaWYodGhpcy5vcHRpb25zLnVucGFpcmVkVGFncy5pbmRleE9mKGtleSkgIT09IC0xKXsgLy91bnBhaXJlZFxuICAgIGlmKCF0aGlzLm9wdGlvbnMuc3VwcHJlc3NVbnBhaXJlZE5vZGUpIGNsb3NlVGFnID0gXCIvXCJcbiAgfWVsc2UgaWYodGhpcy5vcHRpb25zLnN1cHByZXNzRW1wdHlOb2RlKXsgLy9lbXB0eVxuICAgIGNsb3NlVGFnID0gXCIvXCI7XG4gIH1lbHNle1xuICAgIGNsb3NlVGFnID0gYD48LyR7a2V5fWBcbiAgfVxuICByZXR1cm4gY2xvc2VUYWc7XG59XG5cbmZ1bmN0aW9uIGJ1aWxkRW1wdHlPYmpOb2RlKHZhbCwga2V5LCBhdHRyU3RyLCBsZXZlbCkge1xuICBpZiAodmFsICE9PSAnJykge1xuICAgIHJldHVybiB0aGlzLmJ1aWxkT2JqZWN0Tm9kZSh2YWwsIGtleSwgYXR0clN0ciwgbGV2ZWwpO1xuICB9IGVsc2Uge1xuICAgIGlmKGtleVswXSA9PT0gXCI/XCIpIHJldHVybiAgdGhpcy5pbmRlbnRhdGUobGV2ZWwpICsgJzwnICsga2V5ICsgYXR0clN0cisgJz8nICsgdGhpcy50YWdFbmRDaGFyO1xuICAgIGVsc2Uge1xuICAgICAgcmV0dXJuICB0aGlzLmluZGVudGF0ZShsZXZlbCkgKyAnPCcgKyBrZXkgKyBhdHRyU3RyICsgJy8nICsgdGhpcy50YWdFbmRDaGFyO1xuICAgICAgLy8gcmV0dXJuIHRoaXMuYnVpbGRUYWdTdHIobGV2ZWwsa2V5LCBhdHRyU3RyKTtcbiAgICB9XG4gIH1cbn1cblxuQnVpbGRlci5wcm90b3R5cGUuYnVpbGRUZXh0VmFsTm9kZSA9IGZ1bmN0aW9uKHZhbCwga2V5LCBhdHRyU3RyLCBsZXZlbCkge1xuICBpZiAodGhpcy5vcHRpb25zLmNkYXRhUHJvcE5hbWUgIT09IGZhbHNlICYmIGtleSA9PT0gdGhpcy5vcHRpb25zLmNkYXRhUHJvcE5hbWUpIHtcbiAgICByZXR1cm4gdGhpcy5pbmRlbnRhdGUobGV2ZWwpICsgYDwhW0NEQVRBWyR7dmFsfV1dPmAgKyAgdGhpcy5uZXdMaW5lO1xuICB9ZWxzZSBpZiAodGhpcy5vcHRpb25zLmNvbW1lbnRQcm9wTmFtZSAhPT0gZmFsc2UgJiYga2V5ID09PSB0aGlzLm9wdGlvbnMuY29tbWVudFByb3BOYW1lKSB7XG4gICAgcmV0dXJuIHRoaXMuaW5kZW50YXRlKGxldmVsKSArIGA8IS0tJHt2YWx9LS0+YCArICB0aGlzLm5ld0xpbmU7XG4gIH1lbHNlIGlmKGtleVswXSA9PT0gXCI/XCIpIHsvL1BJIHRhZ1xuICAgIHJldHVybiAgdGhpcy5pbmRlbnRhdGUobGV2ZWwpICsgJzwnICsga2V5ICsgYXR0clN0cisgJz8nICsgdGhpcy50YWdFbmRDaGFyOyBcbiAgfWVsc2V7XG4gICAgbGV0IHRleHRWYWx1ZSA9IHRoaXMub3B0aW9ucy50YWdWYWx1ZVByb2Nlc3NvcihrZXksIHZhbCk7XG4gICAgdGV4dFZhbHVlID0gdGhpcy5yZXBsYWNlRW50aXRpZXNWYWx1ZSh0ZXh0VmFsdWUpO1xuICBcbiAgICBpZiggdGV4dFZhbHVlID09PSAnJyl7XG4gICAgICByZXR1cm4gdGhpcy5pbmRlbnRhdGUobGV2ZWwpICsgJzwnICsga2V5ICsgYXR0clN0ciArIHRoaXMuY2xvc2VUYWcoa2V5KSArIHRoaXMudGFnRW5kQ2hhcjtcbiAgICB9ZWxzZXtcbiAgICAgIHJldHVybiB0aGlzLmluZGVudGF0ZShsZXZlbCkgKyAnPCcgKyBrZXkgKyBhdHRyU3RyICsgJz4nICtcbiAgICAgICAgIHRleHRWYWx1ZSArXG4gICAgICAgICc8LycgKyBrZXkgKyB0aGlzLnRhZ0VuZENoYXI7XG4gICAgfVxuICB9XG59XG5cbkJ1aWxkZXIucHJvdG90eXBlLnJlcGxhY2VFbnRpdGllc1ZhbHVlID0gZnVuY3Rpb24odGV4dFZhbHVlKXtcbiAgaWYodGV4dFZhbHVlICYmIHRleHRWYWx1ZS5sZW5ndGggPiAwICYmIHRoaXMub3B0aW9ucy5wcm9jZXNzRW50aXRpZXMpe1xuICAgIGZvciAobGV0IGk9MDsgaTx0aGlzLm9wdGlvbnMuZW50aXRpZXMubGVuZ3RoOyBpKyspIHtcbiAgICAgIGNvbnN0IGVudGl0eSA9IHRoaXMub3B0aW9ucy5lbnRpdGllc1tpXTtcbiAgICAgIHRleHRWYWx1ZSA9IHRleHRWYWx1ZS5yZXBsYWNlKGVudGl0eS5yZWdleCwgZW50aXR5LnZhbCk7XG4gICAgfVxuICB9XG4gIHJldHVybiB0ZXh0VmFsdWU7XG59XG5cbmZ1bmN0aW9uIGluZGVudGF0ZShsZXZlbCkge1xuICByZXR1cm4gdGhpcy5vcHRpb25zLmluZGVudEJ5LnJlcGVhdChsZXZlbCk7XG59XG5cbmZ1bmN0aW9uIGlzQXR0cmlidXRlKG5hbWUgLyosIG9wdGlvbnMqLykge1xuICBpZiAobmFtZS5zdGFydHNXaXRoKHRoaXMub3B0aW9ucy5hdHRyaWJ1dGVOYW1lUHJlZml4KSAmJiBuYW1lICE9PSB0aGlzLm9wdGlvbnMudGV4dE5vZGVOYW1lKSB7XG4gICAgcmV0dXJuIG5hbWUuc3Vic3RyKHRoaXMuYXR0clByZWZpeExlbik7XG4gIH0gZWxzZSB7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG59XG5cbm1vZHVsZS5leHBvcnRzID0gQnVpbGRlcjtcbiIsCiAgICAiJ3VzZSBzdHJpY3QnO1xuXG5jb25zdCB2YWxpZGF0b3IgPSByZXF1aXJlKCcuL3ZhbGlkYXRvcicpO1xuY29uc3QgWE1MUGFyc2VyID0gcmVxdWlyZSgnLi94bWxwYXJzZXIvWE1MUGFyc2VyJyk7XG5jb25zdCBYTUxCdWlsZGVyID0gcmVxdWlyZSgnLi94bWxidWlsZGVyL2pzb24yeG1sJyk7XG5cbm1vZHVsZS5leHBvcnRzID0ge1xuICBYTUxQYXJzZXI6IFhNTFBhcnNlcixcbiAgWE1MVmFsaWRhdG9yOiB2YWxpZGF0b3IsXG4gIFhNTEJ1aWxkZXI6IFhNTEJ1aWxkZXJcbn0iLAogICAgIlwidXNlIHN0cmljdFwiO1xuLy8gQ29weXJpZ2h0IChjKSBNaWNyb3NvZnQgQ29ycG9yYXRpb24uXG4vLyBMaWNlbnNlZCB1bmRlciB0aGUgTUlUIExpY2Vuc2UuXG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJfX2VzTW9kdWxlXCIsIHsgdmFsdWU6IHRydWUgfSk7XG5leHBvcnRzLlhNTF9DSEFSS0VZID0gZXhwb3J0cy5YTUxfQVRUUktFWSA9IHZvaWQgMDtcbi8qKlxuICogRGVmYXVsdCBrZXkgdXNlZCB0byBhY2Nlc3MgdGhlIFhNTCBhdHRyaWJ1dGVzLlxuICovXG5leHBvcnRzLlhNTF9BVFRSS0VZID0gXCIkXCI7XG4vKipcbiAqIERlZmF1bHQga2V5IHVzZWQgdG8gYWNjZXNzIHRoZSBYTUwgdmFsdWUgY29udGVudC5cbiAqL1xuZXhwb3J0cy5YTUxfQ0hBUktFWSA9IFwiX1wiO1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9eG1sLmNvbW1vbi5qcy5tYXAiLAogICAgIlwidXNlIHN0cmljdFwiO1xuLy8gQ29weXJpZ2h0IChjKSBNaWNyb3NvZnQgQ29ycG9yYXRpb24uXG4vLyBMaWNlbnNlZCB1bmRlciB0aGUgTUlUIExpY2Vuc2UuXG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJfX2VzTW9kdWxlXCIsIHsgdmFsdWU6IHRydWUgfSk7XG5leHBvcnRzLnN0cmluZ2lmeVhNTCA9IHN0cmluZ2lmeVhNTDtcbmV4cG9ydHMucGFyc2VYTUwgPSBwYXJzZVhNTDtcbmNvbnN0IGZhc3RfeG1sX3BhcnNlcl8xID0gcmVxdWlyZShcImZhc3QteG1sLXBhcnNlclwiKTtcbmNvbnN0IHhtbF9jb21tb25fanNfMSA9IHJlcXVpcmUoXCIuL3htbC5jb21tb24uanNcIik7XG5mdW5jdGlvbiBnZXRDb21tb25PcHRpb25zKG9wdGlvbnMpIHtcbiAgICB2YXIgX2E7XG4gICAgcmV0dXJuIHtcbiAgICAgICAgYXR0cmlidXRlc0dyb3VwTmFtZTogeG1sX2NvbW1vbl9qc18xLlhNTF9BVFRSS0VZLFxuICAgICAgICB0ZXh0Tm9kZU5hbWU6IChfYSA9IG9wdGlvbnMueG1sQ2hhcktleSkgIT09IG51bGwgJiYgX2EgIT09IHZvaWQgMCA/IF9hIDogeG1sX2NvbW1vbl9qc18xLlhNTF9DSEFSS0VZLFxuICAgICAgICBpZ25vcmVBdHRyaWJ1dGVzOiBmYWxzZSxcbiAgICAgICAgc3VwcHJlc3NCb29sZWFuQXR0cmlidXRlczogZmFsc2UsXG4gICAgfTtcbn1cbmZ1bmN0aW9uIGdldFNlcmlhbGl6ZXJPcHRpb25zKG9wdGlvbnMgPSB7fSkge1xuICAgIHZhciBfYSwgX2I7XG4gICAgcmV0dXJuIE9iamVjdC5hc3NpZ24oT2JqZWN0LmFzc2lnbih7fSwgZ2V0Q29tbW9uT3B0aW9ucyhvcHRpb25zKSksIHsgYXR0cmlidXRlTmFtZVByZWZpeDogXCJAX1wiLCBmb3JtYXQ6IHRydWUsIHN1cHByZXNzRW1wdHlOb2RlOiB0cnVlLCBpbmRlbnRCeTogXCJcIiwgcm9vdE5vZGVOYW1lOiAoX2EgPSBvcHRpb25zLnJvb3ROYW1lKSAhPT0gbnVsbCAmJiBfYSAhPT0gdm9pZCAwID8gX2EgOiBcInJvb3RcIiwgY2RhdGFQcm9wTmFtZTogKF9iID0gb3B0aW9ucy5jZGF0YVByb3BOYW1lKSAhPT0gbnVsbCAmJiBfYiAhPT0gdm9pZCAwID8gX2IgOiBcIl9fY2RhdGFcIiB9KTtcbn1cbmZ1bmN0aW9uIGdldFBhcnNlck9wdGlvbnMob3B0aW9ucyA9IHt9KSB7XG4gICAgcmV0dXJuIE9iamVjdC5hc3NpZ24oT2JqZWN0LmFzc2lnbih7fSwgZ2V0Q29tbW9uT3B0aW9ucyhvcHRpb25zKSksIHsgcGFyc2VBdHRyaWJ1dGVWYWx1ZTogZmFsc2UsIHBhcnNlVGFnVmFsdWU6IGZhbHNlLCBhdHRyaWJ1dGVOYW1lUHJlZml4OiBcIlwiLCBzdG9wTm9kZXM6IG9wdGlvbnMuc3RvcE5vZGVzLCBwcm9jZXNzRW50aXRpZXM6IHRydWUgfSk7XG59XG4vKipcbiAqIENvbnZlcnRzIGdpdmVuIEpTT04gb2JqZWN0IHRvIFhNTCBzdHJpbmdcbiAqIEBwYXJhbSBvYmogLSBKU09OIG9iamVjdCB0byBiZSBjb252ZXJ0ZWQgaW50byBYTUwgc3RyaW5nXG4gKiBAcGFyYW0gb3B0cyAtIE9wdGlvbnMgdGhhdCBnb3Zlcm4gdGhlIFhNTCBidWlsZGluZyBvZiBnaXZlbiBKU09OIG9iamVjdFxuICogYHJvb3ROYW1lYCBpbmRpY2F0ZXMgdGhlIG5hbWUgb2YgdGhlIHJvb3QgZWxlbWVudCBpbiB0aGUgcmVzdWx0aW5nIFhNTFxuICovXG5mdW5jdGlvbiBzdHJpbmdpZnlYTUwob2JqLCBvcHRzID0ge30pIHtcbiAgICBjb25zdCBwYXJzZXJPcHRpb25zID0gZ2V0U2VyaWFsaXplck9wdGlvbnMob3B0cyk7XG4gICAgY29uc3QgajJ4ID0gbmV3IGZhc3RfeG1sX3BhcnNlcl8xLlhNTEJ1aWxkZXIocGFyc2VyT3B0aW9ucyk7XG4gICAgY29uc3Qgbm9kZSA9IHsgW3BhcnNlck9wdGlvbnMucm9vdE5vZGVOYW1lXTogb2JqIH07XG4gICAgY29uc3QgeG1sRGF0YSA9IGoyeC5idWlsZChub2RlKTtcbiAgICByZXR1cm4gYDw/eG1sIHZlcnNpb249XCIxLjBcIiBlbmNvZGluZz1cIlVURi04XCIgc3RhbmRhbG9uZT1cInllc1wiPz4ke3htbERhdGF9YC5yZXBsYWNlKC9cXG4vZywgXCJcIik7XG59XG4vKipcbiAqIENvbnZlcnRzIGdpdmVuIFhNTCBzdHJpbmcgaW50byBKU09OXG4gKiBAcGFyYW0gc3RyIC0gU3RyaW5nIGNvbnRhaW5pbmcgdGhlIFhNTCBjb250ZW50IHRvIGJlIHBhcnNlZCBpbnRvIEpTT05cbiAqIEBwYXJhbSBvcHRzIC0gT3B0aW9ucyB0aGF0IGdvdmVybiB0aGUgcGFyc2luZyBvZiBnaXZlbiB4bWwgc3RyaW5nXG4gKiBgaW5jbHVkZVJvb3RgIGluZGljYXRlcyB3aGV0aGVyIHRoZSByb290IGVsZW1lbnQgaXMgdG8gYmUgaW5jbHVkZWQgb3Igbm90IGluIHRoZSBvdXRwdXRcbiAqL1xuYXN5bmMgZnVuY3Rpb24gcGFyc2VYTUwoc3RyLCBvcHRzID0ge30pIHtcbiAgICBpZiAoIXN0cikge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJEb2N1bWVudCBpcyBlbXB0eVwiKTtcbiAgICB9XG4gICAgY29uc3QgdmFsaWRhdGlvbiA9IGZhc3RfeG1sX3BhcnNlcl8xLlhNTFZhbGlkYXRvci52YWxpZGF0ZShzdHIpO1xuICAgIGlmICh2YWxpZGF0aW9uICE9PSB0cnVlKSB7XG4gICAgICAgIHRocm93IHZhbGlkYXRpb247XG4gICAgfVxuICAgIGNvbnN0IHBhcnNlciA9IG5ldyBmYXN0X3htbF9wYXJzZXJfMS5YTUxQYXJzZXIoZ2V0UGFyc2VyT3B0aW9ucyhvcHRzKSk7XG4gICAgY29uc3QgcGFyc2VkWG1sID0gcGFyc2VyLnBhcnNlKHN0cik7XG4gICAgLy8gUmVtb3ZlIHRoZSA8P3htbCB2ZXJzaW9uPVwiLi4uXCIgPz4gbm9kZS5cbiAgICAvLyBUaGlzIGlzIGEgY2hhbmdlIGluIGJlaGF2aW9yIG9uIGZ4cCB2NC4gSXNzdWUgIzQyNFxuICAgIGlmIChwYXJzZWRYbWxbXCI/eG1sXCJdKSB7XG4gICAgICAgIGRlbGV0ZSBwYXJzZWRYbWxbXCI/eG1sXCJdO1xuICAgIH1cbiAgICBpZiAoIW9wdHMuaW5jbHVkZVJvb3QpIHtcbiAgICAgICAgZm9yIChjb25zdCBrZXkgb2YgT2JqZWN0LmtleXMocGFyc2VkWG1sKSkge1xuICAgICAgICAgICAgY29uc3QgdmFsdWUgPSBwYXJzZWRYbWxba2V5XTtcbiAgICAgICAgICAgIHJldHVybiB0eXBlb2YgdmFsdWUgPT09IFwib2JqZWN0XCIgPyBPYmplY3QuYXNzaWduKHt9LCB2YWx1ZSkgOiB2YWx1ZTtcbiAgICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gcGFyc2VkWG1sO1xufVxuLy8jIHNvdXJjZU1hcHBpbmdVUkw9eG1sLmpzLm1hcCIsCiAgICAiXCJ1c2Ugc3RyaWN0XCI7XG4vLyBDb3B5cmlnaHQgKGMpIE1pY3Jvc29mdCBDb3Jwb3JhdGlvbi5cbi8vIExpY2Vuc2VkIHVuZGVyIHRoZSBNSVQgTGljZW5zZS5cbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIl9fZXNNb2R1bGVcIiwgeyB2YWx1ZTogdHJ1ZSB9KTtcbmV4cG9ydHMuWE1MX0NIQVJLRVkgPSBleHBvcnRzLlhNTF9BVFRSS0VZID0gZXhwb3J0cy5wYXJzZVhNTCA9IGV4cG9ydHMuc3RyaW5naWZ5WE1MID0gdm9pZCAwO1xudmFyIHhtbF9qc18xID0gcmVxdWlyZShcIi4veG1sLmpzXCIpO1xuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwic3RyaW5naWZ5WE1MXCIsIHsgZW51bWVyYWJsZTogdHJ1ZSwgZ2V0OiBmdW5jdGlvbiAoKSB7IHJldHVybiB4bWxfanNfMS5zdHJpbmdpZnlYTUw7IH0gfSk7XG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJwYXJzZVhNTFwiLCB7IGVudW1lcmFibGU6IHRydWUsIGdldDogZnVuY3Rpb24gKCkgeyByZXR1cm4geG1sX2pzXzEucGFyc2VYTUw7IH0gfSk7XG52YXIgeG1sX2NvbW1vbl9qc18xID0gcmVxdWlyZShcIi4veG1sLmNvbW1vbi5qc1wiKTtcbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIlhNTF9BVFRSS0VZXCIsIHsgZW51bWVyYWJsZTogdHJ1ZSwgZ2V0OiBmdW5jdGlvbiAoKSB7IHJldHVybiB4bWxfY29tbW9uX2pzXzEuWE1MX0FUVFJLRVk7IH0gfSk7XG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJYTUxfQ0hBUktFWVwiLCB7IGVudW1lcmFibGU6IHRydWUsIGdldDogZnVuY3Rpb24gKCkgeyByZXR1cm4geG1sX2NvbW1vbl9qc18xLlhNTF9DSEFSS0VZOyB9IH0pO1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9aW5kZXguanMubWFwIiwKICAgICJcInVzZSBzdHJpY3RcIjtcbi8vIENvcHlyaWdodCAoYykgTWljcm9zb2Z0IENvcnBvcmF0aW9uLlxuLy8gTGljZW5zZWQgdW5kZXIgdGhlIE1JVCBsaWNlbnNlLlxuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiX19lc01vZHVsZVwiLCB7IHZhbHVlOiB0cnVlIH0pO1xuZXhwb3J0cy5sb2dnZXIgPSB2b2lkIDA7XG5jb25zdCBsb2dnZXJfMSA9IHJlcXVpcmUoXCJAYXp1cmUvbG9nZ2VyXCIpO1xuLyoqXG4gKiBUaGUgYEBhenVyZS9sb2dnZXJgIGNvbmZpZ3VyYXRpb24gZm9yIHRoaXMgcGFja2FnZS5cbiAqIEBpbnRlcm5hbFxuICovXG5leHBvcnRzLmxvZ2dlciA9ICgwLCBsb2dnZXJfMS5jcmVhdGVDbGllbnRMb2dnZXIpKFwiY29yZS1scm9cIik7XG4vLyMgc291cmNlTWFwcGluZ1VSTD1sb2dnZXIuanMubWFwIiwKICAgICJcInVzZSBzdHJpY3RcIjtcbi8vIENvcHlyaWdodCAoYykgTWljcm9zb2Z0IENvcnBvcmF0aW9uLlxuLy8gTGljZW5zZWQgdW5kZXIgdGhlIE1JVCBsaWNlbnNlLlxuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiX19lc01vZHVsZVwiLCB7IHZhbHVlOiB0cnVlIH0pO1xuZXhwb3J0cy50ZXJtaW5hbFN0YXRlcyA9IGV4cG9ydHMuUE9MTF9JTlRFUlZBTF9JTl9NUyA9IHZvaWQgMDtcbi8qKlxuICogVGhlIGRlZmF1bHQgdGltZSBpbnRlcnZhbCB0byB3YWl0IGJlZm9yZSBzZW5kaW5nIHRoZSBuZXh0IHBvbGxpbmcgcmVxdWVzdC5cbiAqL1xuZXhwb3J0cy5QT0xMX0lOVEVSVkFMX0lOX01TID0gMjAwMDtcbi8qKlxuICogVGhlIGNsb3NlZCBzZXQgb2YgdGVybWluYWwgc3RhdGVzLlxuICovXG5leHBvcnRzLnRlcm1pbmFsU3RhdGVzID0gW1wic3VjY2VlZGVkXCIsIFwiY2FuY2VsZWRcIiwgXCJmYWlsZWRcIl07XG4vLyMgc291cmNlTWFwcGluZ1VSTD1jb25zdGFudHMuanMubWFwIiwKICAgICJcInVzZSBzdHJpY3RcIjtcbi8vIENvcHlyaWdodCAoYykgTWljcm9zb2Z0IENvcnBvcmF0aW9uLlxuLy8gTGljZW5zZWQgdW5kZXIgdGhlIE1JVCBsaWNlbnNlLlxuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiX19lc01vZHVsZVwiLCB7IHZhbHVlOiB0cnVlIH0pO1xuZXhwb3J0cy5wb2xsT3BlcmF0aW9uID0gZXhwb3J0cy5pbml0T3BlcmF0aW9uID0gZXhwb3J0cy5kZXNlcmlhbGl6ZVN0YXRlID0gdm9pZCAwO1xuY29uc3QgbG9nZ2VyX2pzXzEgPSByZXF1aXJlKFwiLi4vbG9nZ2VyLmpzXCIpO1xuY29uc3QgY29uc3RhbnRzX2pzXzEgPSByZXF1aXJlKFwiLi9jb25zdGFudHMuanNcIik7XG4vKipcbiAqIERlc2VyaWFsaXplcyB0aGUgc3RhdGVcbiAqL1xuZnVuY3Rpb24gZGVzZXJpYWxpemVTdGF0ZShzZXJpYWxpemVkU3RhdGUpIHtcbiAgICB0cnkge1xuICAgICAgICByZXR1cm4gSlNPTi5wYXJzZShzZXJpYWxpemVkU3RhdGUpLnN0YXRlO1xuICAgIH1cbiAgICBjYXRjaCAoZSkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYFVuYWJsZSB0byBkZXNlcmlhbGl6ZSBpbnB1dCBzdGF0ZTogJHtzZXJpYWxpemVkU3RhdGV9YCk7XG4gICAgfVxufVxuZXhwb3J0cy5kZXNlcmlhbGl6ZVN0YXRlID0gZGVzZXJpYWxpemVTdGF0ZTtcbmZ1bmN0aW9uIHNldFN0YXRlRXJyb3IoaW5wdXRzKSB7XG4gICAgY29uc3QgeyBzdGF0ZSwgc3RhdGVQcm94eSwgaXNPcGVyYXRpb25FcnJvciB9ID0gaW5wdXRzO1xuICAgIHJldHVybiAoZXJyb3IpID0+IHtcbiAgICAgICAgaWYgKGlzT3BlcmF0aW9uRXJyb3IoZXJyb3IpKSB7XG4gICAgICAgICAgICBzdGF0ZVByb3h5LnNldEVycm9yKHN0YXRlLCBlcnJvcik7XG4gICAgICAgICAgICBzdGF0ZVByb3h5LnNldEZhaWxlZChzdGF0ZSk7XG4gICAgICAgIH1cbiAgICAgICAgdGhyb3cgZXJyb3I7XG4gICAgfTtcbn1cbmZ1bmN0aW9uIGFwcGVuZFJlYWRhYmxlRXJyb3JNZXNzYWdlKGN1cnJlbnRNZXNzYWdlLCBpbm5lck1lc3NhZ2UpIHtcbiAgICBsZXQgbWVzc2FnZSA9IGN1cnJlbnRNZXNzYWdlO1xuICAgIGlmIChtZXNzYWdlLnNsaWNlKC0xKSAhPT0gXCIuXCIpIHtcbiAgICAgICAgbWVzc2FnZSA9IG1lc3NhZ2UgKyBcIi5cIjtcbiAgICB9XG4gICAgcmV0dXJuIG1lc3NhZ2UgKyBcIiBcIiArIGlubmVyTWVzc2FnZTtcbn1cbmZ1bmN0aW9uIHNpbXBsaWZ5RXJyb3IoZXJyKSB7XG4gICAgbGV0IG1lc3NhZ2UgPSBlcnIubWVzc2FnZTtcbiAgICBsZXQgY29kZSA9IGVyci5jb2RlO1xuICAgIGxldCBjdXJFcnIgPSBlcnI7XG4gICAgd2hpbGUgKGN1ckVyci5pbm5lcmVycm9yKSB7XG4gICAgICAgIGN1ckVyciA9IGN1ckVyci5pbm5lcmVycm9yO1xuICAgICAgICBjb2RlID0gY3VyRXJyLmNvZGU7XG4gICAgICAgIG1lc3NhZ2UgPSBhcHBlbmRSZWFkYWJsZUVycm9yTWVzc2FnZShtZXNzYWdlLCBjdXJFcnIubWVzc2FnZSk7XG4gICAgfVxuICAgIHJldHVybiB7XG4gICAgICAgIGNvZGUsXG4gICAgICAgIG1lc3NhZ2UsXG4gICAgfTtcbn1cbmZ1bmN0aW9uIHByb2Nlc3NPcGVyYXRpb25TdGF0dXMocmVzdWx0KSB7XG4gICAgY29uc3QgeyBzdGF0ZSwgc3RhdGVQcm94eSwgc3RhdHVzLCBpc0RvbmUsIHByb2Nlc3NSZXN1bHQsIGdldEVycm9yLCByZXNwb25zZSwgc2V0RXJyb3JBc1Jlc3VsdCB9ID0gcmVzdWx0O1xuICAgIHN3aXRjaCAoc3RhdHVzKSB7XG4gICAgICAgIGNhc2UgXCJzdWNjZWVkZWRcIjoge1xuICAgICAgICAgICAgc3RhdGVQcm94eS5zZXRTdWNjZWVkZWQoc3RhdGUpO1xuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cbiAgICAgICAgY2FzZSBcImZhaWxlZFwiOiB7XG4gICAgICAgICAgICBjb25zdCBlcnIgPSBnZXRFcnJvciA9PT0gbnVsbCB8fCBnZXRFcnJvciA9PT0gdm9pZCAwID8gdm9pZCAwIDogZ2V0RXJyb3IocmVzcG9uc2UpO1xuICAgICAgICAgICAgbGV0IHBvc3RmaXggPSBcIlwiO1xuICAgICAgICAgICAgaWYgKGVycikge1xuICAgICAgICAgICAgICAgIGNvbnN0IHsgY29kZSwgbWVzc2FnZSB9ID0gc2ltcGxpZnlFcnJvcihlcnIpO1xuICAgICAgICAgICAgICAgIHBvc3RmaXggPSBgLiAke2NvZGV9LiAke21lc3NhZ2V9YDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGNvbnN0IGVyclN0ciA9IGBUaGUgbG9uZy1ydW5uaW5nIG9wZXJhdGlvbiBoYXMgZmFpbGVkJHtwb3N0Zml4fWA7XG4gICAgICAgICAgICBzdGF0ZVByb3h5LnNldEVycm9yKHN0YXRlLCBuZXcgRXJyb3IoZXJyU3RyKSk7XG4gICAgICAgICAgICBzdGF0ZVByb3h5LnNldEZhaWxlZChzdGF0ZSk7XG4gICAgICAgICAgICBsb2dnZXJfanNfMS5sb2dnZXIud2FybmluZyhlcnJTdHIpO1xuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cbiAgICAgICAgY2FzZSBcImNhbmNlbGVkXCI6IHtcbiAgICAgICAgICAgIHN0YXRlUHJveHkuc2V0Q2FuY2VsZWQoc3RhdGUpO1xuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cbiAgICB9XG4gICAgaWYgKChpc0RvbmUgPT09IG51bGwgfHwgaXNEb25lID09PSB2b2lkIDAgPyB2b2lkIDAgOiBpc0RvbmUocmVzcG9uc2UsIHN0YXRlKSkgfHxcbiAgICAgICAgKGlzRG9uZSA9PT0gdW5kZWZpbmVkICYmXG4gICAgICAgICAgICBbXCJzdWNjZWVkZWRcIiwgXCJjYW5jZWxlZFwiXS5jb25jYXQoc2V0RXJyb3JBc1Jlc3VsdCA/IFtdIDogW1wiZmFpbGVkXCJdKS5pbmNsdWRlcyhzdGF0dXMpKSkge1xuICAgICAgICBzdGF0ZVByb3h5LnNldFJlc3VsdChzdGF0ZSwgYnVpbGRSZXN1bHQoe1xuICAgICAgICAgICAgcmVzcG9uc2UsXG4gICAgICAgICAgICBzdGF0ZSxcbiAgICAgICAgICAgIHByb2Nlc3NSZXN1bHQsXG4gICAgICAgIH0pKTtcbiAgICB9XG59XG5mdW5jdGlvbiBidWlsZFJlc3VsdChpbnB1dHMpIHtcbiAgICBjb25zdCB7IHByb2Nlc3NSZXN1bHQsIHJlc3BvbnNlLCBzdGF0ZSB9ID0gaW5wdXRzO1xuICAgIHJldHVybiBwcm9jZXNzUmVzdWx0ID8gcHJvY2Vzc1Jlc3VsdChyZXNwb25zZSwgc3RhdGUpIDogcmVzcG9uc2U7XG59XG4vKipcbiAqIEluaXRpYXRlcyB0aGUgbG9uZy1ydW5uaW5nIG9wZXJhdGlvbi5cbiAqL1xuYXN5bmMgZnVuY3Rpb24gaW5pdE9wZXJhdGlvbihpbnB1dHMpIHtcbiAgICBjb25zdCB7IGluaXQsIHN0YXRlUHJveHksIHByb2Nlc3NSZXN1bHQsIGdldE9wZXJhdGlvblN0YXR1cywgd2l0aE9wZXJhdGlvbkxvY2F0aW9uLCBzZXRFcnJvckFzUmVzdWx0LCB9ID0gaW5wdXRzO1xuICAgIGNvbnN0IHsgb3BlcmF0aW9uTG9jYXRpb24sIHJlc291cmNlTG9jYXRpb24sIG1ldGFkYXRhLCByZXNwb25zZSB9ID0gYXdhaXQgaW5pdCgpO1xuICAgIGlmIChvcGVyYXRpb25Mb2NhdGlvbilcbiAgICAgICAgd2l0aE9wZXJhdGlvbkxvY2F0aW9uID09PSBudWxsIHx8IHdpdGhPcGVyYXRpb25Mb2NhdGlvbiA9PT0gdm9pZCAwID8gdm9pZCAwIDogd2l0aE9wZXJhdGlvbkxvY2F0aW9uKG9wZXJhdGlvbkxvY2F0aW9uLCBmYWxzZSk7XG4gICAgY29uc3QgY29uZmlnID0ge1xuICAgICAgICBtZXRhZGF0YSxcbiAgICAgICAgb3BlcmF0aW9uTG9jYXRpb24sXG4gICAgICAgIHJlc291cmNlTG9jYXRpb24sXG4gICAgfTtcbiAgICBsb2dnZXJfanNfMS5sb2dnZXIudmVyYm9zZShgTFJPOiBPcGVyYXRpb24gZGVzY3JpcHRpb246YCwgY29uZmlnKTtcbiAgICBjb25zdCBzdGF0ZSA9IHN0YXRlUHJveHkuaW5pdFN0YXRlKGNvbmZpZyk7XG4gICAgY29uc3Qgc3RhdHVzID0gZ2V0T3BlcmF0aW9uU3RhdHVzKHsgcmVzcG9uc2UsIHN0YXRlLCBvcGVyYXRpb25Mb2NhdGlvbiB9KTtcbiAgICBwcm9jZXNzT3BlcmF0aW9uU3RhdHVzKHsgc3RhdGUsIHN0YXR1cywgc3RhdGVQcm94eSwgcmVzcG9uc2UsIHNldEVycm9yQXNSZXN1bHQsIHByb2Nlc3NSZXN1bHQgfSk7XG4gICAgcmV0dXJuIHN0YXRlO1xufVxuZXhwb3J0cy5pbml0T3BlcmF0aW9uID0gaW5pdE9wZXJhdGlvbjtcbmFzeW5jIGZ1bmN0aW9uIHBvbGxPcGVyYXRpb25IZWxwZXIoaW5wdXRzKSB7XG4gICAgY29uc3QgeyBwb2xsLCBzdGF0ZSwgc3RhdGVQcm94eSwgb3BlcmF0aW9uTG9jYXRpb24sIGdldE9wZXJhdGlvblN0YXR1cywgZ2V0UmVzb3VyY2VMb2NhdGlvbiwgaXNPcGVyYXRpb25FcnJvciwgb3B0aW9ucywgfSA9IGlucHV0cztcbiAgICBjb25zdCByZXNwb25zZSA9IGF3YWl0IHBvbGwob3BlcmF0aW9uTG9jYXRpb24sIG9wdGlvbnMpLmNhdGNoKHNldFN0YXRlRXJyb3Ioe1xuICAgICAgICBzdGF0ZSxcbiAgICAgICAgc3RhdGVQcm94eSxcbiAgICAgICAgaXNPcGVyYXRpb25FcnJvcixcbiAgICB9KSk7XG4gICAgY29uc3Qgc3RhdHVzID0gZ2V0T3BlcmF0aW9uU3RhdHVzKHJlc3BvbnNlLCBzdGF0ZSk7XG4gICAgbG9nZ2VyX2pzXzEubG9nZ2VyLnZlcmJvc2UoYExSTzogU3RhdHVzOlxcblxcdFBvbGxpbmcgZnJvbTogJHtzdGF0ZS5jb25maWcub3BlcmF0aW9uTG9jYXRpb259XFxuXFx0T3BlcmF0aW9uIHN0YXR1czogJHtzdGF0dXN9XFxuXFx0UG9sbGluZyBzdGF0dXM6ICR7Y29uc3RhbnRzX2pzXzEudGVybWluYWxTdGF0ZXMuaW5jbHVkZXMoc3RhdHVzKSA/IFwiU3RvcHBlZFwiIDogXCJSdW5uaW5nXCJ9YCk7XG4gICAgaWYgKHN0YXR1cyA9PT0gXCJzdWNjZWVkZWRcIikge1xuICAgICAgICBjb25zdCByZXNvdXJjZUxvY2F0aW9uID0gZ2V0UmVzb3VyY2VMb2NhdGlvbihyZXNwb25zZSwgc3RhdGUpO1xuICAgICAgICBpZiAocmVzb3VyY2VMb2NhdGlvbiAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICAgIHJlc3BvbnNlOiBhd2FpdCBwb2xsKHJlc291cmNlTG9jYXRpb24pLmNhdGNoKHNldFN0YXRlRXJyb3IoeyBzdGF0ZSwgc3RhdGVQcm94eSwgaXNPcGVyYXRpb25FcnJvciB9KSksXG4gICAgICAgICAgICAgICAgc3RhdHVzLFxuICAgICAgICAgICAgfTtcbiAgICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4geyByZXNwb25zZSwgc3RhdHVzIH07XG59XG4vKiogUG9sbHMgdGhlIGxvbmctcnVubmluZyBvcGVyYXRpb24uICovXG5hc3luYyBmdW5jdGlvbiBwb2xsT3BlcmF0aW9uKGlucHV0cykge1xuICAgIGNvbnN0IHsgcG9sbCwgc3RhdGUsIHN0YXRlUHJveHksIG9wdGlvbnMsIGdldE9wZXJhdGlvblN0YXR1cywgZ2V0UmVzb3VyY2VMb2NhdGlvbiwgZ2V0T3BlcmF0aW9uTG9jYXRpb24sIGlzT3BlcmF0aW9uRXJyb3IsIHdpdGhPcGVyYXRpb25Mb2NhdGlvbiwgZ2V0UG9sbGluZ0ludGVydmFsLCBwcm9jZXNzUmVzdWx0LCBnZXRFcnJvciwgdXBkYXRlU3RhdGUsIHNldERlbGF5LCBpc0RvbmUsIHNldEVycm9yQXNSZXN1bHQsIH0gPSBpbnB1dHM7XG4gICAgY29uc3QgeyBvcGVyYXRpb25Mb2NhdGlvbiB9ID0gc3RhdGUuY29uZmlnO1xuICAgIGlmIChvcGVyYXRpb25Mb2NhdGlvbiAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgIGNvbnN0IHsgcmVzcG9uc2UsIHN0YXR1cyB9ID0gYXdhaXQgcG9sbE9wZXJhdGlvbkhlbHBlcih7XG4gICAgICAgICAgICBwb2xsLFxuICAgICAgICAgICAgZ2V0T3BlcmF0aW9uU3RhdHVzLFxuICAgICAgICAgICAgc3RhdGUsXG4gICAgICAgICAgICBzdGF0ZVByb3h5LFxuICAgICAgICAgICAgb3BlcmF0aW9uTG9jYXRpb24sXG4gICAgICAgICAgICBnZXRSZXNvdXJjZUxvY2F0aW9uLFxuICAgICAgICAgICAgaXNPcGVyYXRpb25FcnJvcixcbiAgICAgICAgICAgIG9wdGlvbnMsXG4gICAgICAgIH0pO1xuICAgICAgICBwcm9jZXNzT3BlcmF0aW9uU3RhdHVzKHtcbiAgICAgICAgICAgIHN0YXR1cyxcbiAgICAgICAgICAgIHJlc3BvbnNlLFxuICAgICAgICAgICAgc3RhdGUsXG4gICAgICAgICAgICBzdGF0ZVByb3h5LFxuICAgICAgICAgICAgaXNEb25lLFxuICAgICAgICAgICAgcHJvY2Vzc1Jlc3VsdCxcbiAgICAgICAgICAgIGdldEVycm9yLFxuICAgICAgICAgICAgc2V0RXJyb3JBc1Jlc3VsdCxcbiAgICAgICAgfSk7XG4gICAgICAgIGlmICghY29uc3RhbnRzX2pzXzEudGVybWluYWxTdGF0ZXMuaW5jbHVkZXMoc3RhdHVzKSkge1xuICAgICAgICAgICAgY29uc3QgaW50ZXJ2YWxJbk1zID0gZ2V0UG9sbGluZ0ludGVydmFsID09PSBudWxsIHx8IGdldFBvbGxpbmdJbnRlcnZhbCA9PT0gdm9pZCAwID8gdm9pZCAwIDogZ2V0UG9sbGluZ0ludGVydmFsKHJlc3BvbnNlKTtcbiAgICAgICAgICAgIGlmIChpbnRlcnZhbEluTXMpXG4gICAgICAgICAgICAgICAgc2V0RGVsYXkoaW50ZXJ2YWxJbk1zKTtcbiAgICAgICAgICAgIGNvbnN0IGxvY2F0aW9uID0gZ2V0T3BlcmF0aW9uTG9jYXRpb24gPT09IG51bGwgfHwgZ2V0T3BlcmF0aW9uTG9jYXRpb24gPT09IHZvaWQgMCA/IHZvaWQgMCA6IGdldE9wZXJhdGlvbkxvY2F0aW9uKHJlc3BvbnNlLCBzdGF0ZSk7XG4gICAgICAgICAgICBpZiAobG9jYXRpb24gIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgICAgIGNvbnN0IGlzVXBkYXRlZCA9IG9wZXJhdGlvbkxvY2F0aW9uICE9PSBsb2NhdGlvbjtcbiAgICAgICAgICAgICAgICBzdGF0ZS5jb25maWcub3BlcmF0aW9uTG9jYXRpb24gPSBsb2NhdGlvbjtcbiAgICAgICAgICAgICAgICB3aXRoT3BlcmF0aW9uTG9jYXRpb24gPT09IG51bGwgfHwgd2l0aE9wZXJhdGlvbkxvY2F0aW9uID09PSB2b2lkIDAgPyB2b2lkIDAgOiB3aXRoT3BlcmF0aW9uTG9jYXRpb24obG9jYXRpb24sIGlzVXBkYXRlZCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlXG4gICAgICAgICAgICAgICAgd2l0aE9wZXJhdGlvbkxvY2F0aW9uID09PSBudWxsIHx8IHdpdGhPcGVyYXRpb25Mb2NhdGlvbiA9PT0gdm9pZCAwID8gdm9pZCAwIDogd2l0aE9wZXJhdGlvbkxvY2F0aW9uKG9wZXJhdGlvbkxvY2F0aW9uLCBmYWxzZSk7XG4gICAgICAgIH1cbiAgICAgICAgdXBkYXRlU3RhdGUgPT09IG51bGwgfHwgdXBkYXRlU3RhdGUgPT09IHZvaWQgMCA/IHZvaWQgMCA6IHVwZGF0ZVN0YXRlKHN0YXRlLCByZXNwb25zZSk7XG4gICAgfVxufVxuZXhwb3J0cy5wb2xsT3BlcmF0aW9uID0gcG9sbE9wZXJhdGlvbjtcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPW9wZXJhdGlvbi5qcy5tYXAiLAogICAgIlwidXNlIHN0cmljdFwiO1xuLy8gQ29weXJpZ2h0IChjKSBNaWNyb3NvZnQgQ29ycG9yYXRpb24uXG4vLyBMaWNlbnNlZCB1bmRlciB0aGUgTUlUIGxpY2Vuc2UuXG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJfX2VzTW9kdWxlXCIsIHsgdmFsdWU6IHRydWUgfSk7XG5leHBvcnRzLnBvbGxIdHRwT3BlcmF0aW9uID0gZXhwb3J0cy5pc09wZXJhdGlvbkVycm9yID0gZXhwb3J0cy5nZXRSZXNvdXJjZUxvY2F0aW9uID0gZXhwb3J0cy5nZXRPcGVyYXRpb25TdGF0dXMgPSBleHBvcnRzLmdldE9wZXJhdGlvbkxvY2F0aW9uID0gZXhwb3J0cy5pbml0SHR0cE9wZXJhdGlvbiA9IGV4cG9ydHMuZ2V0U3RhdHVzRnJvbUluaXRpYWxSZXNwb25zZSA9IGV4cG9ydHMuZ2V0RXJyb3JGcm9tUmVzcG9uc2UgPSBleHBvcnRzLnBhcnNlUmV0cnlBZnRlciA9IGV4cG9ydHMuaW5mZXJMcm9Nb2RlID0gdm9pZCAwO1xuY29uc3Qgb3BlcmF0aW9uX2pzXzEgPSByZXF1aXJlKFwiLi4vcG9sbGVyL29wZXJhdGlvbi5qc1wiKTtcbmNvbnN0IGxvZ2dlcl9qc18xID0gcmVxdWlyZShcIi4uL2xvZ2dlci5qc1wiKTtcbmZ1bmN0aW9uIGdldE9wZXJhdGlvbkxvY2F0aW9uUG9sbGluZ1VybChpbnB1dHMpIHtcbiAgICBjb25zdCB7IGF6dXJlQXN5bmNPcGVyYXRpb24sIG9wZXJhdGlvbkxvY2F0aW9uIH0gPSBpbnB1dHM7XG4gICAgcmV0dXJuIG9wZXJhdGlvbkxvY2F0aW9uICE9PSBudWxsICYmIG9wZXJhdGlvbkxvY2F0aW9uICE9PSB2b2lkIDAgPyBvcGVyYXRpb25Mb2NhdGlvbiA6IGF6dXJlQXN5bmNPcGVyYXRpb247XG59XG5mdW5jdGlvbiBnZXRMb2NhdGlvbkhlYWRlcihyYXdSZXNwb25zZSkge1xuICAgIHJldHVybiByYXdSZXNwb25zZS5oZWFkZXJzW1wibG9jYXRpb25cIl07XG59XG5mdW5jdGlvbiBnZXRPcGVyYXRpb25Mb2NhdGlvbkhlYWRlcihyYXdSZXNwb25zZSkge1xuICAgIHJldHVybiByYXdSZXNwb25zZS5oZWFkZXJzW1wib3BlcmF0aW9uLWxvY2F0aW9uXCJdO1xufVxuZnVuY3Rpb24gZ2V0QXp1cmVBc3luY09wZXJhdGlvbkhlYWRlcihyYXdSZXNwb25zZSkge1xuICAgIHJldHVybiByYXdSZXNwb25zZS5oZWFkZXJzW1wiYXp1cmUtYXN5bmNvcGVyYXRpb25cIl07XG59XG5mdW5jdGlvbiBmaW5kUmVzb3VyY2VMb2NhdGlvbihpbnB1dHMpIHtcbiAgICB2YXIgX2E7XG4gICAgY29uc3QgeyBsb2NhdGlvbiwgcmVxdWVzdE1ldGhvZCwgcmVxdWVzdFBhdGgsIHJlc291cmNlTG9jYXRpb25Db25maWcgfSA9IGlucHV0cztcbiAgICBzd2l0Y2ggKHJlcXVlc3RNZXRob2QpIHtcbiAgICAgICAgY2FzZSBcIlBVVFwiOiB7XG4gICAgICAgICAgICByZXR1cm4gcmVxdWVzdFBhdGg7XG4gICAgICAgIH1cbiAgICAgICAgY2FzZSBcIkRFTEVURVwiOiB7XG4gICAgICAgICAgICByZXR1cm4gdW5kZWZpbmVkO1xuICAgICAgICB9XG4gICAgICAgIGNhc2UgXCJQQVRDSFwiOiB7XG4gICAgICAgICAgICByZXR1cm4gKF9hID0gZ2V0RGVmYXVsdCgpKSAhPT0gbnVsbCAmJiBfYSAhPT0gdm9pZCAwID8gX2EgOiByZXF1ZXN0UGF0aDtcbiAgICAgICAgfVxuICAgICAgICBkZWZhdWx0OiB7XG4gICAgICAgICAgICByZXR1cm4gZ2V0RGVmYXVsdCgpO1xuICAgICAgICB9XG4gICAgfVxuICAgIGZ1bmN0aW9uIGdldERlZmF1bHQoKSB7XG4gICAgICAgIHN3aXRjaCAocmVzb3VyY2VMb2NhdGlvbkNvbmZpZykge1xuICAgICAgICAgICAgY2FzZSBcImF6dXJlLWFzeW5jLW9wZXJhdGlvblwiOiB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGNhc2UgXCJvcmlnaW5hbC11cmlcIjoge1xuICAgICAgICAgICAgICAgIHJldHVybiByZXF1ZXN0UGF0aDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGNhc2UgXCJsb2NhdGlvblwiOlxuICAgICAgICAgICAgZGVmYXVsdDoge1xuICAgICAgICAgICAgICAgIHJldHVybiBsb2NhdGlvbjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cbn1cbmZ1bmN0aW9uIGluZmVyTHJvTW9kZShpbnB1dHMpIHtcbiAgICBjb25zdCB7IHJhd1Jlc3BvbnNlLCByZXF1ZXN0TWV0aG9kLCByZXF1ZXN0UGF0aCwgcmVzb3VyY2VMb2NhdGlvbkNvbmZpZyB9ID0gaW5wdXRzO1xuICAgIGNvbnN0IG9wZXJhdGlvbkxvY2F0aW9uID0gZ2V0T3BlcmF0aW9uTG9jYXRpb25IZWFkZXIocmF3UmVzcG9uc2UpO1xuICAgIGNvbnN0IGF6dXJlQXN5bmNPcGVyYXRpb24gPSBnZXRBenVyZUFzeW5jT3BlcmF0aW9uSGVhZGVyKHJhd1Jlc3BvbnNlKTtcbiAgICBjb25zdCBwb2xsaW5nVXJsID0gZ2V0T3BlcmF0aW9uTG9jYXRpb25Qb2xsaW5nVXJsKHsgb3BlcmF0aW9uTG9jYXRpb24sIGF6dXJlQXN5bmNPcGVyYXRpb24gfSk7XG4gICAgY29uc3QgbG9jYXRpb24gPSBnZXRMb2NhdGlvbkhlYWRlcihyYXdSZXNwb25zZSk7XG4gICAgY29uc3Qgbm9ybWFsaXplZFJlcXVlc3RNZXRob2QgPSByZXF1ZXN0TWV0aG9kID09PSBudWxsIHx8IHJlcXVlc3RNZXRob2QgPT09IHZvaWQgMCA/IHZvaWQgMCA6IHJlcXVlc3RNZXRob2QudG9Mb2NhbGVVcHBlckNhc2UoKTtcbiAgICBpZiAocG9sbGluZ1VybCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICBtb2RlOiBcIk9wZXJhdGlvbkxvY2F0aW9uXCIsXG4gICAgICAgICAgICBvcGVyYXRpb25Mb2NhdGlvbjogcG9sbGluZ1VybCxcbiAgICAgICAgICAgIHJlc291cmNlTG9jYXRpb246IGZpbmRSZXNvdXJjZUxvY2F0aW9uKHtcbiAgICAgICAgICAgICAgICByZXF1ZXN0TWV0aG9kOiBub3JtYWxpemVkUmVxdWVzdE1ldGhvZCxcbiAgICAgICAgICAgICAgICBsb2NhdGlvbixcbiAgICAgICAgICAgICAgICByZXF1ZXN0UGF0aCxcbiAgICAgICAgICAgICAgICByZXNvdXJjZUxvY2F0aW9uQ29uZmlnLFxuICAgICAgICAgICAgfSksXG4gICAgICAgIH07XG4gICAgfVxuICAgIGVsc2UgaWYgKGxvY2F0aW9uICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgIG1vZGU6IFwiUmVzb3VyY2VMb2NhdGlvblwiLFxuICAgICAgICAgICAgb3BlcmF0aW9uTG9jYXRpb246IGxvY2F0aW9uLFxuICAgICAgICB9O1xuICAgIH1cbiAgICBlbHNlIGlmIChub3JtYWxpemVkUmVxdWVzdE1ldGhvZCA9PT0gXCJQVVRcIiAmJiByZXF1ZXN0UGF0aCkge1xuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgbW9kZTogXCJCb2R5XCIsXG4gICAgICAgICAgICBvcGVyYXRpb25Mb2NhdGlvbjogcmVxdWVzdFBhdGgsXG4gICAgICAgIH07XG4gICAgfVxuICAgIGVsc2Uge1xuICAgICAgICByZXR1cm4gdW5kZWZpbmVkO1xuICAgIH1cbn1cbmV4cG9ydHMuaW5mZXJMcm9Nb2RlID0gaW5mZXJMcm9Nb2RlO1xuZnVuY3Rpb24gdHJhbnNmb3JtU3RhdHVzKGlucHV0cykge1xuICAgIGNvbnN0IHsgc3RhdHVzLCBzdGF0dXNDb2RlIH0gPSBpbnB1dHM7XG4gICAgaWYgKHR5cGVvZiBzdGF0dXMgIT09IFwic3RyaW5nXCIgJiYgc3RhdHVzICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBQb2xsaW5nIHdhcyB1bnN1Y2Nlc3NmdWwuIEV4cGVjdGVkIHN0YXR1cyB0byBoYXZlIGEgc3RyaW5nIHZhbHVlIG9yIG5vIHZhbHVlIGJ1dCBpdCBoYXMgaW5zdGVhZDogJHtzdGF0dXN9LiBUaGlzIGRvZXNuJ3QgbmVjZXNzYXJpbHkgaW5kaWNhdGUgdGhlIG9wZXJhdGlvbiBoYXMgZmFpbGVkLiBDaGVjayB5b3VyIEF6dXJlIHN1YnNjcmlwdGlvbiBvciByZXNvdXJjZSBzdGF0dXMgZm9yIG1vcmUgaW5mb3JtYXRpb24uYCk7XG4gICAgfVxuICAgIHN3aXRjaCAoc3RhdHVzID09PSBudWxsIHx8IHN0YXR1cyA9PT0gdm9pZCAwID8gdm9pZCAwIDogc3RhdHVzLnRvTG9jYWxlTG93ZXJDYXNlKCkpIHtcbiAgICAgICAgY2FzZSB1bmRlZmluZWQ6XG4gICAgICAgICAgICByZXR1cm4gdG9PcGVyYXRpb25TdGF0dXMoc3RhdHVzQ29kZSk7XG4gICAgICAgIGNhc2UgXCJzdWNjZWVkZWRcIjpcbiAgICAgICAgICAgIHJldHVybiBcInN1Y2NlZWRlZFwiO1xuICAgICAgICBjYXNlIFwiZmFpbGVkXCI6XG4gICAgICAgICAgICByZXR1cm4gXCJmYWlsZWRcIjtcbiAgICAgICAgY2FzZSBcInJ1bm5pbmdcIjpcbiAgICAgICAgY2FzZSBcImFjY2VwdGVkXCI6XG4gICAgICAgIGNhc2UgXCJzdGFydGVkXCI6XG4gICAgICAgIGNhc2UgXCJjYW5jZWxpbmdcIjpcbiAgICAgICAgY2FzZSBcImNhbmNlbGxpbmdcIjpcbiAgICAgICAgICAgIHJldHVybiBcInJ1bm5pbmdcIjtcbiAgICAgICAgY2FzZSBcImNhbmNlbGVkXCI6XG4gICAgICAgIGNhc2UgXCJjYW5jZWxsZWRcIjpcbiAgICAgICAgICAgIHJldHVybiBcImNhbmNlbGVkXCI7XG4gICAgICAgIGRlZmF1bHQ6IHtcbiAgICAgICAgICAgIGxvZ2dlcl9qc18xLmxvZ2dlci52ZXJib3NlKGBMUk86IHVucmVjb2duaXplZCBvcGVyYXRpb24gc3RhdHVzOiAke3N0YXR1c31gKTtcbiAgICAgICAgICAgIHJldHVybiBzdGF0dXM7XG4gICAgICAgIH1cbiAgICB9XG59XG5mdW5jdGlvbiBnZXRTdGF0dXMocmF3UmVzcG9uc2UpIHtcbiAgICB2YXIgX2E7XG4gICAgY29uc3QgeyBzdGF0dXMgfSA9IChfYSA9IHJhd1Jlc3BvbnNlLmJvZHkpICE9PSBudWxsICYmIF9hICE9PSB2b2lkIDAgPyBfYSA6IHt9O1xuICAgIHJldHVybiB0cmFuc2Zvcm1TdGF0dXMoeyBzdGF0dXMsIHN0YXR1c0NvZGU6IHJhd1Jlc3BvbnNlLnN0YXR1c0NvZGUgfSk7XG59XG5mdW5jdGlvbiBnZXRQcm92aXNpb25pbmdTdGF0ZShyYXdSZXNwb25zZSkge1xuICAgIHZhciBfYSwgX2I7XG4gICAgY29uc3QgeyBwcm9wZXJ0aWVzLCBwcm92aXNpb25pbmdTdGF0ZSB9ID0gKF9hID0gcmF3UmVzcG9uc2UuYm9keSkgIT09IG51bGwgJiYgX2EgIT09IHZvaWQgMCA/IF9hIDoge307XG4gICAgY29uc3Qgc3RhdHVzID0gKF9iID0gcHJvcGVydGllcyA9PT0gbnVsbCB8fCBwcm9wZXJ0aWVzID09PSB2b2lkIDAgPyB2b2lkIDAgOiBwcm9wZXJ0aWVzLnByb3Zpc2lvbmluZ1N0YXRlKSAhPT0gbnVsbCAmJiBfYiAhPT0gdm9pZCAwID8gX2IgOiBwcm92aXNpb25pbmdTdGF0ZTtcbiAgICByZXR1cm4gdHJhbnNmb3JtU3RhdHVzKHsgc3RhdHVzLCBzdGF0dXNDb2RlOiByYXdSZXNwb25zZS5zdGF0dXNDb2RlIH0pO1xufVxuZnVuY3Rpb24gdG9PcGVyYXRpb25TdGF0dXMoc3RhdHVzQ29kZSkge1xuICAgIGlmIChzdGF0dXNDb2RlID09PSAyMDIpIHtcbiAgICAgICAgcmV0dXJuIFwicnVubmluZ1wiO1xuICAgIH1cbiAgICBlbHNlIGlmIChzdGF0dXNDb2RlIDwgMzAwKSB7XG4gICAgICAgIHJldHVybiBcInN1Y2NlZWRlZFwiO1xuICAgIH1cbiAgICBlbHNlIHtcbiAgICAgICAgcmV0dXJuIFwiZmFpbGVkXCI7XG4gICAgfVxufVxuZnVuY3Rpb24gcGFyc2VSZXRyeUFmdGVyKHsgcmF3UmVzcG9uc2UgfSkge1xuICAgIGNvbnN0IHJldHJ5QWZ0ZXIgPSByYXdSZXNwb25zZS5oZWFkZXJzW1wicmV0cnktYWZ0ZXJcIl07XG4gICAgaWYgKHJldHJ5QWZ0ZXIgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAvLyBSZXRyeS1BZnRlciBoZWFkZXIgdmFsdWUgaXMgZWl0aGVyIGluIEhUVFAgZGF0ZSBmb3JtYXQsIG9yIGluIHNlY29uZHNcbiAgICAgICAgY29uc3QgcmV0cnlBZnRlckluU2Vjb25kcyA9IHBhcnNlSW50KHJldHJ5QWZ0ZXIpO1xuICAgICAgICByZXR1cm4gaXNOYU4ocmV0cnlBZnRlckluU2Vjb25kcylcbiAgICAgICAgICAgID8gY2FsY3VsYXRlUG9sbGluZ0ludGVydmFsRnJvbURhdGUobmV3IERhdGUocmV0cnlBZnRlcikpXG4gICAgICAgICAgICA6IHJldHJ5QWZ0ZXJJblNlY29uZHMgKiAxMDAwO1xuICAgIH1cbiAgICByZXR1cm4gdW5kZWZpbmVkO1xufVxuZXhwb3J0cy5wYXJzZVJldHJ5QWZ0ZXIgPSBwYXJzZVJldHJ5QWZ0ZXI7XG5mdW5jdGlvbiBnZXRFcnJvckZyb21SZXNwb25zZShyZXNwb25zZSkge1xuICAgIGNvbnN0IGVycm9yID0gYWNjZXNzQm9keVByb3BlcnR5KHJlc3BvbnNlLCBcImVycm9yXCIpO1xuICAgIGlmICghZXJyb3IpIHtcbiAgICAgICAgbG9nZ2VyX2pzXzEubG9nZ2VyLndhcm5pbmcoYFRoZSBsb25nLXJ1bm5pbmcgb3BlcmF0aW9uIGZhaWxlZCBidXQgdGhlcmUgaXMgbm8gZXJyb3IgcHJvcGVydHkgaW4gdGhlIHJlc3BvbnNlJ3MgYm9keWApO1xuICAgICAgICByZXR1cm47XG4gICAgfVxuICAgIGlmICghZXJyb3IuY29kZSB8fCAhZXJyb3IubWVzc2FnZSkge1xuICAgICAgICBsb2dnZXJfanNfMS5sb2dnZXIud2FybmluZyhgVGhlIGxvbmctcnVubmluZyBvcGVyYXRpb24gZmFpbGVkIGJ1dCB0aGUgZXJyb3IgcHJvcGVydHkgaW4gdGhlIHJlc3BvbnNlJ3MgYm9keSBkb2Vzbid0IGNvbnRhaW4gY29kZSBvciBtZXNzYWdlYCk7XG4gICAgICAgIHJldHVybjtcbiAgICB9XG4gICAgcmV0dXJuIGVycm9yO1xufVxuZXhwb3J0cy5nZXRFcnJvckZyb21SZXNwb25zZSA9IGdldEVycm9yRnJvbVJlc3BvbnNlO1xuZnVuY3Rpb24gY2FsY3VsYXRlUG9sbGluZ0ludGVydmFsRnJvbURhdGUocmV0cnlBZnRlckRhdGUpIHtcbiAgICBjb25zdCB0aW1lTm93ID0gTWF0aC5mbG9vcihuZXcgRGF0ZSgpLmdldFRpbWUoKSk7XG4gICAgY29uc3QgcmV0cnlBZnRlclRpbWUgPSByZXRyeUFmdGVyRGF0ZS5nZXRUaW1lKCk7XG4gICAgaWYgKHRpbWVOb3cgPCByZXRyeUFmdGVyVGltZSkge1xuICAgICAgICByZXR1cm4gcmV0cnlBZnRlclRpbWUgLSB0aW1lTm93O1xuICAgIH1cbiAgICByZXR1cm4gdW5kZWZpbmVkO1xufVxuZnVuY3Rpb24gZ2V0U3RhdHVzRnJvbUluaXRpYWxSZXNwb25zZShpbnB1dHMpIHtcbiAgICBjb25zdCB7IHJlc3BvbnNlLCBzdGF0ZSwgb3BlcmF0aW9uTG9jYXRpb24gfSA9IGlucHV0cztcbiAgICBmdW5jdGlvbiBoZWxwZXIoKSB7XG4gICAgICAgIHZhciBfYTtcbiAgICAgICAgY29uc3QgbW9kZSA9IChfYSA9IHN0YXRlLmNvbmZpZy5tZXRhZGF0YSkgPT09IG51bGwgfHwgX2EgPT09IHZvaWQgMCA/IHZvaWQgMCA6IF9hW1wibW9kZVwiXTtcbiAgICAgICAgc3dpdGNoIChtb2RlKSB7XG4gICAgICAgICAgICBjYXNlIHVuZGVmaW5lZDpcbiAgICAgICAgICAgICAgICByZXR1cm4gdG9PcGVyYXRpb25TdGF0dXMocmVzcG9uc2UucmF3UmVzcG9uc2Uuc3RhdHVzQ29kZSk7XG4gICAgICAgICAgICBjYXNlIFwiQm9keVwiOlxuICAgICAgICAgICAgICAgIHJldHVybiBnZXRPcGVyYXRpb25TdGF0dXMocmVzcG9uc2UsIHN0YXRlKTtcbiAgICAgICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgICAgICAgcmV0dXJuIFwicnVubmluZ1wiO1xuICAgICAgICB9XG4gICAgfVxuICAgIGNvbnN0IHN0YXR1cyA9IGhlbHBlcigpO1xuICAgIHJldHVybiBzdGF0dXMgPT09IFwicnVubmluZ1wiICYmIG9wZXJhdGlvbkxvY2F0aW9uID09PSB1bmRlZmluZWQgPyBcInN1Y2NlZWRlZFwiIDogc3RhdHVzO1xufVxuZXhwb3J0cy5nZXRTdGF0dXNGcm9tSW5pdGlhbFJlc3BvbnNlID0gZ2V0U3RhdHVzRnJvbUluaXRpYWxSZXNwb25zZTtcbi8qKlxuICogSW5pdGlhdGVzIHRoZSBsb25nLXJ1bm5pbmcgb3BlcmF0aW9uLlxuICovXG5hc3luYyBmdW5jdGlvbiBpbml0SHR0cE9wZXJhdGlvbihpbnB1dHMpIHtcbiAgICBjb25zdCB7IHN0YXRlUHJveHksIHJlc291cmNlTG9jYXRpb25Db25maWcsIHByb2Nlc3NSZXN1bHQsIGxybywgc2V0RXJyb3JBc1Jlc3VsdCB9ID0gaW5wdXRzO1xuICAgIHJldHVybiAoMCwgb3BlcmF0aW9uX2pzXzEuaW5pdE9wZXJhdGlvbikoe1xuICAgICAgICBpbml0OiBhc3luYyAoKSA9PiB7XG4gICAgICAgICAgICBjb25zdCByZXNwb25zZSA9IGF3YWl0IGxyby5zZW5kSW5pdGlhbFJlcXVlc3QoKTtcbiAgICAgICAgICAgIGNvbnN0IGNvbmZpZyA9IGluZmVyTHJvTW9kZSh7XG4gICAgICAgICAgICAgICAgcmF3UmVzcG9uc2U6IHJlc3BvbnNlLnJhd1Jlc3BvbnNlLFxuICAgICAgICAgICAgICAgIHJlcXVlc3RQYXRoOiBscm8ucmVxdWVzdFBhdGgsXG4gICAgICAgICAgICAgICAgcmVxdWVzdE1ldGhvZDogbHJvLnJlcXVlc3RNZXRob2QsXG4gICAgICAgICAgICAgICAgcmVzb3VyY2VMb2NhdGlvbkNvbmZpZyxcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgcmV0dXJuIE9iamVjdC5hc3NpZ24oeyByZXNwb25zZSwgb3BlcmF0aW9uTG9jYXRpb246IGNvbmZpZyA9PT0gbnVsbCB8fCBjb25maWcgPT09IHZvaWQgMCA/IHZvaWQgMCA6IGNvbmZpZy5vcGVyYXRpb25Mb2NhdGlvbiwgcmVzb3VyY2VMb2NhdGlvbjogY29uZmlnID09PSBudWxsIHx8IGNvbmZpZyA9PT0gdm9pZCAwID8gdm9pZCAwIDogY29uZmlnLnJlc291cmNlTG9jYXRpb24gfSwgKChjb25maWcgPT09IG51bGwgfHwgY29uZmlnID09PSB2b2lkIDAgPyB2b2lkIDAgOiBjb25maWcubW9kZSkgPyB7IG1ldGFkYXRhOiB7IG1vZGU6IGNvbmZpZy5tb2RlIH0gfSA6IHt9KSk7XG4gICAgICAgIH0sXG4gICAgICAgIHN0YXRlUHJveHksXG4gICAgICAgIHByb2Nlc3NSZXN1bHQ6IHByb2Nlc3NSZXN1bHRcbiAgICAgICAgICAgID8gKHsgZmxhdFJlc3BvbnNlIH0sIHN0YXRlKSA9PiBwcm9jZXNzUmVzdWx0KGZsYXRSZXNwb25zZSwgc3RhdGUpXG4gICAgICAgICAgICA6ICh7IGZsYXRSZXNwb25zZSB9KSA9PiBmbGF0UmVzcG9uc2UsXG4gICAgICAgIGdldE9wZXJhdGlvblN0YXR1czogZ2V0U3RhdHVzRnJvbUluaXRpYWxSZXNwb25zZSxcbiAgICAgICAgc2V0RXJyb3JBc1Jlc3VsdCxcbiAgICB9KTtcbn1cbmV4cG9ydHMuaW5pdEh0dHBPcGVyYXRpb24gPSBpbml0SHR0cE9wZXJhdGlvbjtcbmZ1bmN0aW9uIGdldE9wZXJhdGlvbkxvY2F0aW9uKHsgcmF3UmVzcG9uc2UgfSwgc3RhdGUpIHtcbiAgICB2YXIgX2E7XG4gICAgY29uc3QgbW9kZSA9IChfYSA9IHN0YXRlLmNvbmZpZy5tZXRhZGF0YSkgPT09IG51bGwgfHwgX2EgPT09IHZvaWQgMCA/IHZvaWQgMCA6IF9hW1wibW9kZVwiXTtcbiAgICBzd2l0Y2ggKG1vZGUpIHtcbiAgICAgICAgY2FzZSBcIk9wZXJhdGlvbkxvY2F0aW9uXCI6IHtcbiAgICAgICAgICAgIHJldHVybiBnZXRPcGVyYXRpb25Mb2NhdGlvblBvbGxpbmdVcmwoe1xuICAgICAgICAgICAgICAgIG9wZXJhdGlvbkxvY2F0aW9uOiBnZXRPcGVyYXRpb25Mb2NhdGlvbkhlYWRlcihyYXdSZXNwb25zZSksXG4gICAgICAgICAgICAgICAgYXp1cmVBc3luY09wZXJhdGlvbjogZ2V0QXp1cmVBc3luY09wZXJhdGlvbkhlYWRlcihyYXdSZXNwb25zZSksXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgICAgICBjYXNlIFwiUmVzb3VyY2VMb2NhdGlvblwiOiB7XG4gICAgICAgICAgICByZXR1cm4gZ2V0TG9jYXRpb25IZWFkZXIocmF3UmVzcG9uc2UpO1xuICAgICAgICB9XG4gICAgICAgIGNhc2UgXCJCb2R5XCI6XG4gICAgICAgIGRlZmF1bHQ6IHtcbiAgICAgICAgICAgIHJldHVybiB1bmRlZmluZWQ7XG4gICAgICAgIH1cbiAgICB9XG59XG5leHBvcnRzLmdldE9wZXJhdGlvbkxvY2F0aW9uID0gZ2V0T3BlcmF0aW9uTG9jYXRpb247XG5mdW5jdGlvbiBnZXRPcGVyYXRpb25TdGF0dXMoeyByYXdSZXNwb25zZSB9LCBzdGF0ZSkge1xuICAgIHZhciBfYTtcbiAgICBjb25zdCBtb2RlID0gKF9hID0gc3RhdGUuY29uZmlnLm1ldGFkYXRhKSA9PT0gbnVsbCB8fCBfYSA9PT0gdm9pZCAwID8gdm9pZCAwIDogX2FbXCJtb2RlXCJdO1xuICAgIHN3aXRjaCAobW9kZSkge1xuICAgICAgICBjYXNlIFwiT3BlcmF0aW9uTG9jYXRpb25cIjoge1xuICAgICAgICAgICAgcmV0dXJuIGdldFN0YXR1cyhyYXdSZXNwb25zZSk7XG4gICAgICAgIH1cbiAgICAgICAgY2FzZSBcIlJlc291cmNlTG9jYXRpb25cIjoge1xuICAgICAgICAgICAgcmV0dXJuIHRvT3BlcmF0aW9uU3RhdHVzKHJhd1Jlc3BvbnNlLnN0YXR1c0NvZGUpO1xuICAgICAgICB9XG4gICAgICAgIGNhc2UgXCJCb2R5XCI6IHtcbiAgICAgICAgICAgIHJldHVybiBnZXRQcm92aXNpb25pbmdTdGF0ZShyYXdSZXNwb25zZSk7XG4gICAgICAgIH1cbiAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihgSW50ZXJuYWwgZXJyb3I6IFVuZXhwZWN0ZWQgb3BlcmF0aW9uIG1vZGU6ICR7bW9kZX1gKTtcbiAgICB9XG59XG5leHBvcnRzLmdldE9wZXJhdGlvblN0YXR1cyA9IGdldE9wZXJhdGlvblN0YXR1cztcbmZ1bmN0aW9uIGFjY2Vzc0JvZHlQcm9wZXJ0eSh7IGZsYXRSZXNwb25zZSwgcmF3UmVzcG9uc2UgfSwgcHJvcCkge1xuICAgIHZhciBfYSwgX2I7XG4gICAgcmV0dXJuIChfYSA9IGZsYXRSZXNwb25zZSA9PT0gbnVsbCB8fCBmbGF0UmVzcG9uc2UgPT09IHZvaWQgMCA/IHZvaWQgMCA6IGZsYXRSZXNwb25zZVtwcm9wXSkgIT09IG51bGwgJiYgX2EgIT09IHZvaWQgMCA/IF9hIDogKF9iID0gcmF3UmVzcG9uc2UuYm9keSkgPT09IG51bGwgfHwgX2IgPT09IHZvaWQgMCA/IHZvaWQgMCA6IF9iW3Byb3BdO1xufVxuZnVuY3Rpb24gZ2V0UmVzb3VyY2VMb2NhdGlvbihyZXMsIHN0YXRlKSB7XG4gICAgY29uc3QgbG9jID0gYWNjZXNzQm9keVByb3BlcnR5KHJlcywgXCJyZXNvdXJjZUxvY2F0aW9uXCIpO1xuICAgIGlmIChsb2MgJiYgdHlwZW9mIGxvYyA9PT0gXCJzdHJpbmdcIikge1xuICAgICAgICBzdGF0ZS5jb25maWcucmVzb3VyY2VMb2NhdGlvbiA9IGxvYztcbiAgICB9XG4gICAgcmV0dXJuIHN0YXRlLmNvbmZpZy5yZXNvdXJjZUxvY2F0aW9uO1xufVxuZXhwb3J0cy5nZXRSZXNvdXJjZUxvY2F0aW9uID0gZ2V0UmVzb3VyY2VMb2NhdGlvbjtcbmZ1bmN0aW9uIGlzT3BlcmF0aW9uRXJyb3IoZSkge1xuICAgIHJldHVybiBlLm5hbWUgPT09IFwiUmVzdEVycm9yXCI7XG59XG5leHBvcnRzLmlzT3BlcmF0aW9uRXJyb3IgPSBpc09wZXJhdGlvbkVycm9yO1xuLyoqIFBvbGxzIHRoZSBsb25nLXJ1bm5pbmcgb3BlcmF0aW9uLiAqL1xuYXN5bmMgZnVuY3Rpb24gcG9sbEh0dHBPcGVyYXRpb24oaW5wdXRzKSB7XG4gICAgY29uc3QgeyBscm8sIHN0YXRlUHJveHksIG9wdGlvbnMsIHByb2Nlc3NSZXN1bHQsIHVwZGF0ZVN0YXRlLCBzZXREZWxheSwgc3RhdGUsIHNldEVycm9yQXNSZXN1bHQsIH0gPSBpbnB1dHM7XG4gICAgcmV0dXJuICgwLCBvcGVyYXRpb25fanNfMS5wb2xsT3BlcmF0aW9uKSh7XG4gICAgICAgIHN0YXRlLFxuICAgICAgICBzdGF0ZVByb3h5LFxuICAgICAgICBzZXREZWxheSxcbiAgICAgICAgcHJvY2Vzc1Jlc3VsdDogcHJvY2Vzc1Jlc3VsdFxuICAgICAgICAgICAgPyAoeyBmbGF0UmVzcG9uc2UgfSwgaW5wdXRTdGF0ZSkgPT4gcHJvY2Vzc1Jlc3VsdChmbGF0UmVzcG9uc2UsIGlucHV0U3RhdGUpXG4gICAgICAgICAgICA6ICh7IGZsYXRSZXNwb25zZSB9KSA9PiBmbGF0UmVzcG9uc2UsXG4gICAgICAgIGdldEVycm9yOiBnZXRFcnJvckZyb21SZXNwb25zZSxcbiAgICAgICAgdXBkYXRlU3RhdGUsXG4gICAgICAgIGdldFBvbGxpbmdJbnRlcnZhbDogcGFyc2VSZXRyeUFmdGVyLFxuICAgICAgICBnZXRPcGVyYXRpb25Mb2NhdGlvbixcbiAgICAgICAgZ2V0T3BlcmF0aW9uU3RhdHVzLFxuICAgICAgICBpc09wZXJhdGlvbkVycm9yLFxuICAgICAgICBnZXRSZXNvdXJjZUxvY2F0aW9uLFxuICAgICAgICBvcHRpb25zLFxuICAgICAgICAvKipcbiAgICAgICAgICogVGhlIGV4cGFuc2lvbiBoZXJlIGlzIGludGVudGlvbmFsIGJlY2F1c2UgYGxyb2AgY291bGQgYmUgYW4gb2JqZWN0IHRoYXRcbiAgICAgICAgICogcmVmZXJlbmNlcyBhbiBpbm5lciB0aGlzLCBzbyB3ZSBuZWVkIHRvIHByZXNlcnZlIGEgcmVmZXJlbmNlIHRvIGl0LlxuICAgICAgICAgKi9cbiAgICAgICAgcG9sbDogYXN5bmMgKGxvY2F0aW9uLCBpbnB1dE9wdGlvbnMpID0+IGxyby5zZW5kUG9sbFJlcXVlc3QobG9jYXRpb24sIGlucHV0T3B0aW9ucyksXG4gICAgICAgIHNldEVycm9yQXNSZXN1bHQsXG4gICAgfSk7XG59XG5leHBvcnRzLnBvbGxIdHRwT3BlcmF0aW9uID0gcG9sbEh0dHBPcGVyYXRpb247XG4vLyMgc291cmNlTWFwcGluZ1VSTD1vcGVyYXRpb24uanMubWFwIiwKICAgICJcInVzZSBzdHJpY3RcIjtcbi8vIENvcHlyaWdodCAoYykgTWljcm9zb2Z0IENvcnBvcmF0aW9uLlxuLy8gTGljZW5zZWQgdW5kZXIgdGhlIE1JVCBsaWNlbnNlLlxuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiX19lc01vZHVsZVwiLCB7IHZhbHVlOiB0cnVlIH0pO1xuZXhwb3J0cy5idWlsZENyZWF0ZVBvbGxlciA9IHZvaWQgMDtcbmNvbnN0IG9wZXJhdGlvbl9qc18xID0gcmVxdWlyZShcIi4vb3BlcmF0aW9uLmpzXCIpO1xuY29uc3QgY29uc3RhbnRzX2pzXzEgPSByZXF1aXJlKFwiLi9jb25zdGFudHMuanNcIik7XG5jb25zdCBjb3JlX3V0aWxfMSA9IHJlcXVpcmUoXCJAYXp1cmUvY29yZS11dGlsXCIpO1xuY29uc3QgY3JlYXRlU3RhdGVQcm94eSA9ICgpID0+ICh7XG4gICAgLyoqXG4gICAgICogVGhlIHN0YXRlIGF0IHRoaXMgcG9pbnQgaXMgY3JlYXRlZCB0byBiZSBvZiB0eXBlIE9wZXJhdGlvblN0YXRlPFRSZXN1bHQ+LlxuICAgICAqIEl0IHdpbGwgYmUgdXBkYXRlZCBsYXRlciB0byBiZSBvZiB0eXBlIFRTdGF0ZSB3aGVuIHRoZVxuICAgICAqIGN1c3RvbWVyLXByb3ZpZGVkIGNhbGxiYWNrLCBgdXBkYXRlU3RhdGVgLCBpcyBjYWxsZWQgZHVyaW5nIHBvbGxpbmcuXG4gICAgICovXG4gICAgaW5pdFN0YXRlOiAoY29uZmlnKSA9PiAoeyBzdGF0dXM6IFwicnVubmluZ1wiLCBjb25maWcgfSksXG4gICAgc2V0Q2FuY2VsZWQ6IChzdGF0ZSkgPT4gKHN0YXRlLnN0YXR1cyA9IFwiY2FuY2VsZWRcIiksXG4gICAgc2V0RXJyb3I6IChzdGF0ZSwgZXJyb3IpID0+IChzdGF0ZS5lcnJvciA9IGVycm9yKSxcbiAgICBzZXRSZXN1bHQ6IChzdGF0ZSwgcmVzdWx0KSA9PiAoc3RhdGUucmVzdWx0ID0gcmVzdWx0KSxcbiAgICBzZXRSdW5uaW5nOiAoc3RhdGUpID0+IChzdGF0ZS5zdGF0dXMgPSBcInJ1bm5pbmdcIiksXG4gICAgc2V0U3VjY2VlZGVkOiAoc3RhdGUpID0+IChzdGF0ZS5zdGF0dXMgPSBcInN1Y2NlZWRlZFwiKSxcbiAgICBzZXRGYWlsZWQ6IChzdGF0ZSkgPT4gKHN0YXRlLnN0YXR1cyA9IFwiZmFpbGVkXCIpLFxuICAgIGdldEVycm9yOiAoc3RhdGUpID0+IHN0YXRlLmVycm9yLFxuICAgIGdldFJlc3VsdDogKHN0YXRlKSA9PiBzdGF0ZS5yZXN1bHQsXG4gICAgaXNDYW5jZWxlZDogKHN0YXRlKSA9PiBzdGF0ZS5zdGF0dXMgPT09IFwiY2FuY2VsZWRcIixcbiAgICBpc0ZhaWxlZDogKHN0YXRlKSA9PiBzdGF0ZS5zdGF0dXMgPT09IFwiZmFpbGVkXCIsXG4gICAgaXNSdW5uaW5nOiAoc3RhdGUpID0+IHN0YXRlLnN0YXR1cyA9PT0gXCJydW5uaW5nXCIsXG4gICAgaXNTdWNjZWVkZWQ6IChzdGF0ZSkgPT4gc3RhdGUuc3RhdHVzID09PSBcInN1Y2NlZWRlZFwiLFxufSk7XG4vKipcbiAqIFJldHVybnMgYSBwb2xsZXIgZmFjdG9yeS5cbiAqL1xuZnVuY3Rpb24gYnVpbGRDcmVhdGVQb2xsZXIoaW5wdXRzKSB7XG4gICAgY29uc3QgeyBnZXRPcGVyYXRpb25Mb2NhdGlvbiwgZ2V0U3RhdHVzRnJvbUluaXRpYWxSZXNwb25zZSwgZ2V0U3RhdHVzRnJvbVBvbGxSZXNwb25zZSwgaXNPcGVyYXRpb25FcnJvciwgZ2V0UmVzb3VyY2VMb2NhdGlvbiwgZ2V0UG9sbGluZ0ludGVydmFsLCBnZXRFcnJvciwgcmVzb2x2ZU9uVW5zdWNjZXNzZnVsLCB9ID0gaW5wdXRzO1xuICAgIHJldHVybiBhc3luYyAoeyBpbml0LCBwb2xsIH0sIG9wdGlvbnMpID0+IHtcbiAgICAgICAgY29uc3QgeyBwcm9jZXNzUmVzdWx0LCB1cGRhdGVTdGF0ZSwgd2l0aE9wZXJhdGlvbkxvY2F0aW9uOiB3aXRoT3BlcmF0aW9uTG9jYXRpb25DYWxsYmFjaywgaW50ZXJ2YWxJbk1zID0gY29uc3RhbnRzX2pzXzEuUE9MTF9JTlRFUlZBTF9JTl9NUywgcmVzdG9yZUZyb20sIH0gPSBvcHRpb25zIHx8IHt9O1xuICAgICAgICBjb25zdCBzdGF0ZVByb3h5ID0gY3JlYXRlU3RhdGVQcm94eSgpO1xuICAgICAgICBjb25zdCB3aXRoT3BlcmF0aW9uTG9jYXRpb24gPSB3aXRoT3BlcmF0aW9uTG9jYXRpb25DYWxsYmFja1xuICAgICAgICAgICAgPyAoKCkgPT4ge1xuICAgICAgICAgICAgICAgIGxldCBjYWxsZWQgPSBmYWxzZTtcbiAgICAgICAgICAgICAgICByZXR1cm4gKG9wZXJhdGlvbkxvY2F0aW9uLCBpc1VwZGF0ZWQpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKGlzVXBkYXRlZClcbiAgICAgICAgICAgICAgICAgICAgICAgIHdpdGhPcGVyYXRpb25Mb2NhdGlvbkNhbGxiYWNrKG9wZXJhdGlvbkxvY2F0aW9uKTtcbiAgICAgICAgICAgICAgICAgICAgZWxzZSBpZiAoIWNhbGxlZClcbiAgICAgICAgICAgICAgICAgICAgICAgIHdpdGhPcGVyYXRpb25Mb2NhdGlvbkNhbGxiYWNrKG9wZXJhdGlvbkxvY2F0aW9uKTtcbiAgICAgICAgICAgICAgICAgICAgY2FsbGVkID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICB9O1xuICAgICAgICAgICAgfSkoKVxuICAgICAgICAgICAgOiB1bmRlZmluZWQ7XG4gICAgICAgIGNvbnN0IHN0YXRlID0gcmVzdG9yZUZyb21cbiAgICAgICAgICAgID8gKDAsIG9wZXJhdGlvbl9qc18xLmRlc2VyaWFsaXplU3RhdGUpKHJlc3RvcmVGcm9tKVxuICAgICAgICAgICAgOiBhd2FpdCAoMCwgb3BlcmF0aW9uX2pzXzEuaW5pdE9wZXJhdGlvbikoe1xuICAgICAgICAgICAgICAgIGluaXQsXG4gICAgICAgICAgICAgICAgc3RhdGVQcm94eSxcbiAgICAgICAgICAgICAgICBwcm9jZXNzUmVzdWx0LFxuICAgICAgICAgICAgICAgIGdldE9wZXJhdGlvblN0YXR1czogZ2V0U3RhdHVzRnJvbUluaXRpYWxSZXNwb25zZSxcbiAgICAgICAgICAgICAgICB3aXRoT3BlcmF0aW9uTG9jYXRpb24sXG4gICAgICAgICAgICAgICAgc2V0RXJyb3JBc1Jlc3VsdDogIXJlc29sdmVPblVuc3VjY2Vzc2Z1bCxcbiAgICAgICAgICAgIH0pO1xuICAgICAgICBsZXQgcmVzdWx0UHJvbWlzZTtcbiAgICAgICAgY29uc3QgYWJvcnRDb250cm9sbGVyID0gbmV3IEFib3J0Q29udHJvbGxlcigpO1xuICAgICAgICBjb25zdCBoYW5kbGVycyA9IG5ldyBNYXAoKTtcbiAgICAgICAgY29uc3QgaGFuZGxlUHJvZ3Jlc3NFdmVudHMgPSBhc3luYyAoKSA9PiBoYW5kbGVycy5mb3JFYWNoKChoKSA9PiBoKHN0YXRlKSk7XG4gICAgICAgIGNvbnN0IGNhbmNlbEVyck1zZyA9IFwiT3BlcmF0aW9uIHdhcyBjYW5jZWxlZFwiO1xuICAgICAgICBsZXQgY3VycmVudFBvbGxJbnRlcnZhbEluTXMgPSBpbnRlcnZhbEluTXM7XG4gICAgICAgIGNvbnN0IHBvbGxlciA9IHtcbiAgICAgICAgICAgIGdldE9wZXJhdGlvblN0YXRlOiAoKSA9PiBzdGF0ZSxcbiAgICAgICAgICAgIGdldFJlc3VsdDogKCkgPT4gc3RhdGUucmVzdWx0LFxuICAgICAgICAgICAgaXNEb25lOiAoKSA9PiBbXCJzdWNjZWVkZWRcIiwgXCJmYWlsZWRcIiwgXCJjYW5jZWxlZFwiXS5pbmNsdWRlcyhzdGF0ZS5zdGF0dXMpLFxuICAgICAgICAgICAgaXNTdG9wcGVkOiAoKSA9PiByZXN1bHRQcm9taXNlID09PSB1bmRlZmluZWQsXG4gICAgICAgICAgICBzdG9wUG9sbGluZzogKCkgPT4ge1xuICAgICAgICAgICAgICAgIGFib3J0Q29udHJvbGxlci5hYm9ydCgpO1xuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIHRvU3RyaW5nOiAoKSA9PiBKU09OLnN0cmluZ2lmeSh7XG4gICAgICAgICAgICAgICAgc3RhdGUsXG4gICAgICAgICAgICB9KSxcbiAgICAgICAgICAgIG9uUHJvZ3Jlc3M6IChjYWxsYmFjaykgPT4ge1xuICAgICAgICAgICAgICAgIGNvbnN0IHMgPSBTeW1ib2woKTtcbiAgICAgICAgICAgICAgICBoYW5kbGVycy5zZXQocywgY2FsbGJhY2spO1xuICAgICAgICAgICAgICAgIHJldHVybiAoKSA9PiBoYW5kbGVycy5kZWxldGUocyk7XG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgcG9sbFVudGlsRG9uZTogKHBvbGxPcHRpb25zKSA9PiAocmVzdWx0UHJvbWlzZSAhPT0gbnVsbCAmJiByZXN1bHRQcm9taXNlICE9PSB2b2lkIDAgPyByZXN1bHRQcm9taXNlIDogKHJlc3VsdFByb21pc2UgPSAoYXN5bmMgKCkgPT4ge1xuICAgICAgICAgICAgICAgIGNvbnN0IHsgYWJvcnRTaWduYWw6IGlucHV0QWJvcnRTaWduYWwgfSA9IHBvbGxPcHRpb25zIHx8IHt9O1xuICAgICAgICAgICAgICAgIC8vIEluIHRoZSBmdXR1cmUgd2UgY2FuIHVzZSBBYm9ydFNpZ25hbC5hbnkoKSBpbnN0ZWFkXG4gICAgICAgICAgICAgICAgZnVuY3Rpb24gYWJvcnRMaXN0ZW5lcigpIHtcbiAgICAgICAgICAgICAgICAgICAgYWJvcnRDb250cm9sbGVyLmFib3J0KCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGNvbnN0IGFib3J0U2lnbmFsID0gYWJvcnRDb250cm9sbGVyLnNpZ25hbDtcbiAgICAgICAgICAgICAgICBpZiAoaW5wdXRBYm9ydFNpZ25hbCA9PT0gbnVsbCB8fCBpbnB1dEFib3J0U2lnbmFsID09PSB2b2lkIDAgPyB2b2lkIDAgOiBpbnB1dEFib3J0U2lnbmFsLmFib3J0ZWQpIHtcbiAgICAgICAgICAgICAgICAgICAgYWJvcnRDb250cm9sbGVyLmFib3J0KCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGVsc2UgaWYgKCFhYm9ydFNpZ25hbC5hYm9ydGVkKSB7XG4gICAgICAgICAgICAgICAgICAgIGlucHV0QWJvcnRTaWduYWwgPT09IG51bGwgfHwgaW5wdXRBYm9ydFNpZ25hbCA9PT0gdm9pZCAwID8gdm9pZCAwIDogaW5wdXRBYm9ydFNpZ25hbC5hZGRFdmVudExpc3RlbmVyKFwiYWJvcnRcIiwgYWJvcnRMaXN0ZW5lciwgeyBvbmNlOiB0cnVlIH0pO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgICAgICBpZiAoIXBvbGxlci5pc0RvbmUoKSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgYXdhaXQgcG9sbGVyLnBvbGwoeyBhYm9ydFNpZ25hbCB9KTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHdoaWxlICghcG9sbGVyLmlzRG9uZSgpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgYXdhaXQgKDAsIGNvcmVfdXRpbF8xLmRlbGF5KShjdXJyZW50UG9sbEludGVydmFsSW5NcywgeyBhYm9ydFNpZ25hbCB9KTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBhd2FpdCBwb2xsZXIucG9sbCh7IGFib3J0U2lnbmFsIH0pO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGZpbmFsbHkge1xuICAgICAgICAgICAgICAgICAgICBpbnB1dEFib3J0U2lnbmFsID09PSBudWxsIHx8IGlucHV0QWJvcnRTaWduYWwgPT09IHZvaWQgMCA/IHZvaWQgMCA6IGlucHV0QWJvcnRTaWduYWwucmVtb3ZlRXZlbnRMaXN0ZW5lcihcImFib3J0XCIsIGFib3J0TGlzdGVuZXIpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBpZiAocmVzb2x2ZU9uVW5zdWNjZXNzZnVsKSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBwb2xsZXIuZ2V0UmVzdWx0KCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICBzd2l0Y2ggKHN0YXRlLnN0YXR1cykge1xuICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBcInN1Y2NlZWRlZFwiOlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBwb2xsZXIuZ2V0UmVzdWx0KCk7XG4gICAgICAgICAgICAgICAgICAgICAgICBjYXNlIFwiY2FuY2VsZWRcIjpcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoY2FuY2VsRXJyTXNnKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgXCJmYWlsZWRcIjpcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aHJvdyBzdGF0ZS5lcnJvcjtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgXCJub3RTdGFydGVkXCI6XG4gICAgICAgICAgICAgICAgICAgICAgICBjYXNlIFwicnVubmluZ1wiOlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihgUG9sbGluZyBjb21wbGV0ZWQgd2l0aG91dCBzdWNjZWVkaW5nIG9yIGZhaWxpbmdgKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0pKCkuZmluYWxseSgoKSA9PiB7XG4gICAgICAgICAgICAgICAgcmVzdWx0UHJvbWlzZSA9IHVuZGVmaW5lZDtcbiAgICAgICAgICAgIH0pKSksXG4gICAgICAgICAgICBhc3luYyBwb2xsKHBvbGxPcHRpb25zKSB7XG4gICAgICAgICAgICAgICAgaWYgKHJlc29sdmVPblVuc3VjY2Vzc2Z1bCkge1xuICAgICAgICAgICAgICAgICAgICBpZiAocG9sbGVyLmlzRG9uZSgpKVxuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgc3dpdGNoIChzdGF0ZS5zdGF0dXMpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgXCJzdWNjZWVkZWRcIjpcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICAgICAgICAgICAgICBjYXNlIFwiY2FuY2VsZWRcIjpcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoY2FuY2VsRXJyTXNnKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgXCJmYWlsZWRcIjpcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aHJvdyBzdGF0ZS5lcnJvcjtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBhd2FpdCAoMCwgb3BlcmF0aW9uX2pzXzEucG9sbE9wZXJhdGlvbikoe1xuICAgICAgICAgICAgICAgICAgICBwb2xsLFxuICAgICAgICAgICAgICAgICAgICBzdGF0ZSxcbiAgICAgICAgICAgICAgICAgICAgc3RhdGVQcm94eSxcbiAgICAgICAgICAgICAgICAgICAgZ2V0T3BlcmF0aW9uTG9jYXRpb24sXG4gICAgICAgICAgICAgICAgICAgIGlzT3BlcmF0aW9uRXJyb3IsXG4gICAgICAgICAgICAgICAgICAgIHdpdGhPcGVyYXRpb25Mb2NhdGlvbixcbiAgICAgICAgICAgICAgICAgICAgZ2V0UG9sbGluZ0ludGVydmFsLFxuICAgICAgICAgICAgICAgICAgICBnZXRPcGVyYXRpb25TdGF0dXM6IGdldFN0YXR1c0Zyb21Qb2xsUmVzcG9uc2UsXG4gICAgICAgICAgICAgICAgICAgIGdldFJlc291cmNlTG9jYXRpb24sXG4gICAgICAgICAgICAgICAgICAgIHByb2Nlc3NSZXN1bHQsXG4gICAgICAgICAgICAgICAgICAgIGdldEVycm9yLFxuICAgICAgICAgICAgICAgICAgICB1cGRhdGVTdGF0ZSxcbiAgICAgICAgICAgICAgICAgICAgb3B0aW9uczogcG9sbE9wdGlvbnMsXG4gICAgICAgICAgICAgICAgICAgIHNldERlbGF5OiAocG9sbEludGVydmFsSW5NcykgPT4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgY3VycmVudFBvbGxJbnRlcnZhbEluTXMgPSBwb2xsSW50ZXJ2YWxJbk1zO1xuICAgICAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgICAgICBzZXRFcnJvckFzUmVzdWx0OiAhcmVzb2x2ZU9uVW5zdWNjZXNzZnVsLFxuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgIGF3YWl0IGhhbmRsZVByb2dyZXNzRXZlbnRzKCk7XG4gICAgICAgICAgICAgICAgaWYgKCFyZXNvbHZlT25VbnN1Y2Nlc3NmdWwpIHtcbiAgICAgICAgICAgICAgICAgICAgc3dpdGNoIChzdGF0ZS5zdGF0dXMpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgXCJjYW5jZWxlZFwiOlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihjYW5jZWxFcnJNc2cpO1xuICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBcImZhaWxlZFwiOlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRocm93IHN0YXRlLmVycm9yO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSxcbiAgICAgICAgfTtcbiAgICAgICAgcmV0dXJuIHBvbGxlcjtcbiAgICB9O1xufVxuZXhwb3J0cy5idWlsZENyZWF0ZVBvbGxlciA9IGJ1aWxkQ3JlYXRlUG9sbGVyO1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9cG9sbGVyLmpzLm1hcCIsCiAgICAiXCJ1c2Ugc3RyaWN0XCI7XG4vLyBDb3B5cmlnaHQgKGMpIE1pY3Jvc29mdCBDb3Jwb3JhdGlvbi5cbi8vIExpY2Vuc2VkIHVuZGVyIHRoZSBNSVQgbGljZW5zZS5cbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIl9fZXNNb2R1bGVcIiwgeyB2YWx1ZTogdHJ1ZSB9KTtcbmV4cG9ydHMuY3JlYXRlSHR0cFBvbGxlciA9IHZvaWQgMDtcbmNvbnN0IG9wZXJhdGlvbl9qc18xID0gcmVxdWlyZShcIi4vb3BlcmF0aW9uLmpzXCIpO1xuY29uc3QgcG9sbGVyX2pzXzEgPSByZXF1aXJlKFwiLi4vcG9sbGVyL3BvbGxlci5qc1wiKTtcbi8qKlxuICogQ3JlYXRlcyBhIHBvbGxlciB0aGF0IGNhbiBiZSB1c2VkIHRvIHBvbGwgYSBsb25nLXJ1bm5pbmcgb3BlcmF0aW9uLlxuICogQHBhcmFtIGxybyAtIERlc2NyaXB0aW9uIG9mIHRoZSBsb25nLXJ1bm5pbmcgb3BlcmF0aW9uXG4gKiBAcGFyYW0gb3B0aW9ucyAtIG9wdGlvbnMgdG8gY29uZmlndXJlIHRoZSBwb2xsZXJcbiAqIEByZXR1cm5zIGFuIGluaXRpYWxpemVkIHBvbGxlclxuICovXG5hc3luYyBmdW5jdGlvbiBjcmVhdGVIdHRwUG9sbGVyKGxybywgb3B0aW9ucykge1xuICAgIGNvbnN0IHsgcmVzb3VyY2VMb2NhdGlvbkNvbmZpZywgaW50ZXJ2YWxJbk1zLCBwcm9jZXNzUmVzdWx0LCByZXN0b3JlRnJvbSwgdXBkYXRlU3RhdGUsIHdpdGhPcGVyYXRpb25Mb2NhdGlvbiwgcmVzb2x2ZU9uVW5zdWNjZXNzZnVsID0gZmFsc2UsIH0gPSBvcHRpb25zIHx8IHt9O1xuICAgIHJldHVybiAoMCwgcG9sbGVyX2pzXzEuYnVpbGRDcmVhdGVQb2xsZXIpKHtcbiAgICAgICAgZ2V0U3RhdHVzRnJvbUluaXRpYWxSZXNwb25zZTogb3BlcmF0aW9uX2pzXzEuZ2V0U3RhdHVzRnJvbUluaXRpYWxSZXNwb25zZSxcbiAgICAgICAgZ2V0U3RhdHVzRnJvbVBvbGxSZXNwb25zZTogb3BlcmF0aW9uX2pzXzEuZ2V0T3BlcmF0aW9uU3RhdHVzLFxuICAgICAgICBpc09wZXJhdGlvbkVycm9yOiBvcGVyYXRpb25fanNfMS5pc09wZXJhdGlvbkVycm9yLFxuICAgICAgICBnZXRPcGVyYXRpb25Mb2NhdGlvbjogb3BlcmF0aW9uX2pzXzEuZ2V0T3BlcmF0aW9uTG9jYXRpb24sXG4gICAgICAgIGdldFJlc291cmNlTG9jYXRpb246IG9wZXJhdGlvbl9qc18xLmdldFJlc291cmNlTG9jYXRpb24sXG4gICAgICAgIGdldFBvbGxpbmdJbnRlcnZhbDogb3BlcmF0aW9uX2pzXzEucGFyc2VSZXRyeUFmdGVyLFxuICAgICAgICBnZXRFcnJvcjogb3BlcmF0aW9uX2pzXzEuZ2V0RXJyb3JGcm9tUmVzcG9uc2UsXG4gICAgICAgIHJlc29sdmVPblVuc3VjY2Vzc2Z1bCxcbiAgICB9KSh7XG4gICAgICAgIGluaXQ6IGFzeW5jICgpID0+IHtcbiAgICAgICAgICAgIGNvbnN0IHJlc3BvbnNlID0gYXdhaXQgbHJvLnNlbmRJbml0aWFsUmVxdWVzdCgpO1xuICAgICAgICAgICAgY29uc3QgY29uZmlnID0gKDAsIG9wZXJhdGlvbl9qc18xLmluZmVyTHJvTW9kZSkoe1xuICAgICAgICAgICAgICAgIHJhd1Jlc3BvbnNlOiByZXNwb25zZS5yYXdSZXNwb25zZSxcbiAgICAgICAgICAgICAgICByZXF1ZXN0UGF0aDogbHJvLnJlcXVlc3RQYXRoLFxuICAgICAgICAgICAgICAgIHJlcXVlc3RNZXRob2Q6IGxyby5yZXF1ZXN0TWV0aG9kLFxuICAgICAgICAgICAgICAgIHJlc291cmNlTG9jYXRpb25Db25maWcsXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIHJldHVybiBPYmplY3QuYXNzaWduKHsgcmVzcG9uc2UsIG9wZXJhdGlvbkxvY2F0aW9uOiBjb25maWcgPT09IG51bGwgfHwgY29uZmlnID09PSB2b2lkIDAgPyB2b2lkIDAgOiBjb25maWcub3BlcmF0aW9uTG9jYXRpb24sIHJlc291cmNlTG9jYXRpb246IGNvbmZpZyA9PT0gbnVsbCB8fCBjb25maWcgPT09IHZvaWQgMCA/IHZvaWQgMCA6IGNvbmZpZy5yZXNvdXJjZUxvY2F0aW9uIH0sICgoY29uZmlnID09PSBudWxsIHx8IGNvbmZpZyA9PT0gdm9pZCAwID8gdm9pZCAwIDogY29uZmlnLm1vZGUpID8geyBtZXRhZGF0YTogeyBtb2RlOiBjb25maWcubW9kZSB9IH0gOiB7fSkpO1xuICAgICAgICB9LFxuICAgICAgICBwb2xsOiBscm8uc2VuZFBvbGxSZXF1ZXN0LFxuICAgIH0sIHtcbiAgICAgICAgaW50ZXJ2YWxJbk1zLFxuICAgICAgICB3aXRoT3BlcmF0aW9uTG9jYXRpb24sXG4gICAgICAgIHJlc3RvcmVGcm9tLFxuICAgICAgICB1cGRhdGVTdGF0ZSxcbiAgICAgICAgcHJvY2Vzc1Jlc3VsdDogcHJvY2Vzc1Jlc3VsdFxuICAgICAgICAgICAgPyAoeyBmbGF0UmVzcG9uc2UgfSwgc3RhdGUpID0+IHByb2Nlc3NSZXN1bHQoZmxhdFJlc3BvbnNlLCBzdGF0ZSlcbiAgICAgICAgICAgIDogKHsgZmxhdFJlc3BvbnNlIH0pID0+IGZsYXRSZXNwb25zZSxcbiAgICB9KTtcbn1cbmV4cG9ydHMuY3JlYXRlSHR0cFBvbGxlciA9IGNyZWF0ZUh0dHBQb2xsZXI7XG4vLyMgc291cmNlTWFwcGluZ1VSTD1wb2xsZXIuanMubWFwIiwKICAgICJcInVzZSBzdHJpY3RcIjtcbi8vIENvcHlyaWdodCAoYykgTWljcm9zb2Z0IENvcnBvcmF0aW9uLlxuLy8gTGljZW5zZWQgdW5kZXIgdGhlIE1JVCBsaWNlbnNlLlxuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiX19lc01vZHVsZVwiLCB7IHZhbHVlOiB0cnVlIH0pO1xuZXhwb3J0cy5HZW5lcmljUG9sbE9wZXJhdGlvbiA9IHZvaWQgMDtcbmNvbnN0IG9wZXJhdGlvbl9qc18xID0gcmVxdWlyZShcIi4uLy4uL2h0dHAvb3BlcmF0aW9uLmpzXCIpO1xuY29uc3QgbG9nZ2VyX2pzXzEgPSByZXF1aXJlKFwiLi4vLi4vbG9nZ2VyLmpzXCIpO1xuY29uc3QgY3JlYXRlU3RhdGVQcm94eSA9ICgpID0+ICh7XG4gICAgaW5pdFN0YXRlOiAoY29uZmlnKSA9PiAoeyBjb25maWcsIGlzU3RhcnRlZDogdHJ1ZSB9KSxcbiAgICBzZXRDYW5jZWxlZDogKHN0YXRlKSA9PiAoc3RhdGUuaXNDYW5jZWxsZWQgPSB0cnVlKSxcbiAgICBzZXRFcnJvcjogKHN0YXRlLCBlcnJvcikgPT4gKHN0YXRlLmVycm9yID0gZXJyb3IpLFxuICAgIHNldFJlc3VsdDogKHN0YXRlLCByZXN1bHQpID0+IChzdGF0ZS5yZXN1bHQgPSByZXN1bHQpLFxuICAgIHNldFJ1bm5pbmc6IChzdGF0ZSkgPT4gKHN0YXRlLmlzU3RhcnRlZCA9IHRydWUpLFxuICAgIHNldFN1Y2NlZWRlZDogKHN0YXRlKSA9PiAoc3RhdGUuaXNDb21wbGV0ZWQgPSB0cnVlKSxcbiAgICBzZXRGYWlsZWQ6ICgpID0+IHtcbiAgICAgICAgLyoqIGVtcHR5IGJvZHkgKi9cbiAgICB9LFxuICAgIGdldEVycm9yOiAoc3RhdGUpID0+IHN0YXRlLmVycm9yLFxuICAgIGdldFJlc3VsdDogKHN0YXRlKSA9PiBzdGF0ZS5yZXN1bHQsXG4gICAgaXNDYW5jZWxlZDogKHN0YXRlKSA9PiAhIXN0YXRlLmlzQ2FuY2VsbGVkLFxuICAgIGlzRmFpbGVkOiAoc3RhdGUpID0+ICEhc3RhdGUuZXJyb3IsXG4gICAgaXNSdW5uaW5nOiAoc3RhdGUpID0+ICEhc3RhdGUuaXNTdGFydGVkLFxuICAgIGlzU3VjY2VlZGVkOiAoc3RhdGUpID0+IEJvb2xlYW4oc3RhdGUuaXNDb21wbGV0ZWQgJiYgIXN0YXRlLmlzQ2FuY2VsbGVkICYmICFzdGF0ZS5lcnJvciksXG59KTtcbmNsYXNzIEdlbmVyaWNQb2xsT3BlcmF0aW9uIHtcbiAgICBjb25zdHJ1Y3RvcihzdGF0ZSwgbHJvLCBzZXRFcnJvckFzUmVzdWx0LCBscm9SZXNvdXJjZUxvY2F0aW9uQ29uZmlnLCBwcm9jZXNzUmVzdWx0LCB1cGRhdGVTdGF0ZSwgaXNEb25lKSB7XG4gICAgICAgIHRoaXMuc3RhdGUgPSBzdGF0ZTtcbiAgICAgICAgdGhpcy5scm8gPSBscm87XG4gICAgICAgIHRoaXMuc2V0RXJyb3JBc1Jlc3VsdCA9IHNldEVycm9yQXNSZXN1bHQ7XG4gICAgICAgIHRoaXMubHJvUmVzb3VyY2VMb2NhdGlvbkNvbmZpZyA9IGxyb1Jlc291cmNlTG9jYXRpb25Db25maWc7XG4gICAgICAgIHRoaXMucHJvY2Vzc1Jlc3VsdCA9IHByb2Nlc3NSZXN1bHQ7XG4gICAgICAgIHRoaXMudXBkYXRlU3RhdGUgPSB1cGRhdGVTdGF0ZTtcbiAgICAgICAgdGhpcy5pc0RvbmUgPSBpc0RvbmU7XG4gICAgfVxuICAgIHNldFBvbGxlckNvbmZpZyhwb2xsZXJDb25maWcpIHtcbiAgICAgICAgdGhpcy5wb2xsZXJDb25maWcgPSBwb2xsZXJDb25maWc7XG4gICAgfVxuICAgIGFzeW5jIHVwZGF0ZShvcHRpb25zKSB7XG4gICAgICAgIHZhciBfYTtcbiAgICAgICAgY29uc3Qgc3RhdGVQcm94eSA9IGNyZWF0ZVN0YXRlUHJveHkoKTtcbiAgICAgICAgaWYgKCF0aGlzLnN0YXRlLmlzU3RhcnRlZCkge1xuICAgICAgICAgICAgdGhpcy5zdGF0ZSA9IE9iamVjdC5hc3NpZ24oT2JqZWN0LmFzc2lnbih7fSwgdGhpcy5zdGF0ZSksIChhd2FpdCAoMCwgb3BlcmF0aW9uX2pzXzEuaW5pdEh0dHBPcGVyYXRpb24pKHtcbiAgICAgICAgICAgICAgICBscm86IHRoaXMubHJvLFxuICAgICAgICAgICAgICAgIHN0YXRlUHJveHksXG4gICAgICAgICAgICAgICAgcmVzb3VyY2VMb2NhdGlvbkNvbmZpZzogdGhpcy5scm9SZXNvdXJjZUxvY2F0aW9uQ29uZmlnLFxuICAgICAgICAgICAgICAgIHByb2Nlc3NSZXN1bHQ6IHRoaXMucHJvY2Vzc1Jlc3VsdCxcbiAgICAgICAgICAgICAgICBzZXRFcnJvckFzUmVzdWx0OiB0aGlzLnNldEVycm9yQXNSZXN1bHQsXG4gICAgICAgICAgICB9KSkpO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IHVwZGF0ZVN0YXRlID0gdGhpcy51cGRhdGVTdGF0ZTtcbiAgICAgICAgY29uc3QgaXNEb25lID0gdGhpcy5pc0RvbmU7XG4gICAgICAgIGlmICghdGhpcy5zdGF0ZS5pc0NvbXBsZXRlZCAmJiB0aGlzLnN0YXRlLmVycm9yID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgIGF3YWl0ICgwLCBvcGVyYXRpb25fanNfMS5wb2xsSHR0cE9wZXJhdGlvbikoe1xuICAgICAgICAgICAgICAgIGxybzogdGhpcy5scm8sXG4gICAgICAgICAgICAgICAgc3RhdGU6IHRoaXMuc3RhdGUsXG4gICAgICAgICAgICAgICAgc3RhdGVQcm94eSxcbiAgICAgICAgICAgICAgICBwcm9jZXNzUmVzdWx0OiB0aGlzLnByb2Nlc3NSZXN1bHQsXG4gICAgICAgICAgICAgICAgdXBkYXRlU3RhdGU6IHVwZGF0ZVN0YXRlXG4gICAgICAgICAgICAgICAgICAgID8gKHN0YXRlLCB7IHJhd1Jlc3BvbnNlIH0pID0+IHVwZGF0ZVN0YXRlKHN0YXRlLCByYXdSZXNwb25zZSlcbiAgICAgICAgICAgICAgICAgICAgOiB1bmRlZmluZWQsXG4gICAgICAgICAgICAgICAgaXNEb25lOiBpc0RvbmVcbiAgICAgICAgICAgICAgICAgICAgPyAoeyBmbGF0UmVzcG9uc2UgfSwgc3RhdGUpID0+IGlzRG9uZShmbGF0UmVzcG9uc2UsIHN0YXRlKVxuICAgICAgICAgICAgICAgICAgICA6IHVuZGVmaW5lZCxcbiAgICAgICAgICAgICAgICBvcHRpb25zLFxuICAgICAgICAgICAgICAgIHNldERlbGF5OiAoaW50ZXJ2YWxJbk1zKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMucG9sbGVyQ29uZmlnLmludGVydmFsSW5NcyA9IGludGVydmFsSW5NcztcbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgIHNldEVycm9yQXNSZXN1bHQ6IHRoaXMuc2V0RXJyb3JBc1Jlc3VsdCxcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgICAgIChfYSA9IG9wdGlvbnMgPT09IG51bGwgfHwgb3B0aW9ucyA9PT0gdm9pZCAwID8gdm9pZCAwIDogb3B0aW9ucy5maXJlUHJvZ3Jlc3MpID09PSBudWxsIHx8IF9hID09PSB2b2lkIDAgPyB2b2lkIDAgOiBfYS5jYWxsKG9wdGlvbnMsIHRoaXMuc3RhdGUpO1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9XG4gICAgYXN5bmMgY2FuY2VsKCkge1xuICAgICAgICBsb2dnZXJfanNfMS5sb2dnZXIuZXJyb3IoXCJgY2FuY2VsT3BlcmF0aW9uYCBpcyBkZXByZWNhdGVkIGJlY2F1c2UgaXQgd2Fzbid0IGltcGxlbWVudGVkXCIpO1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9XG4gICAgLyoqXG4gICAgICogU2VyaWFsaXplcyB0aGUgUG9sbGVyIG9wZXJhdGlvbi5cbiAgICAgKi9cbiAgICB0b1N0cmluZygpIHtcbiAgICAgICAgcmV0dXJuIEpTT04uc3RyaW5naWZ5KHtcbiAgICAgICAgICAgIHN0YXRlOiB0aGlzLnN0YXRlLFxuICAgICAgICB9KTtcbiAgICB9XG59XG5leHBvcnRzLkdlbmVyaWNQb2xsT3BlcmF0aW9uID0gR2VuZXJpY1BvbGxPcGVyYXRpb247XG4vLyMgc291cmNlTWFwcGluZ1VSTD1vcGVyYXRpb24uanMubWFwIiwKICAgICJcInVzZSBzdHJpY3RcIjtcbi8vIENvcHlyaWdodCAoYykgTWljcm9zb2Z0IENvcnBvcmF0aW9uLlxuLy8gTGljZW5zZWQgdW5kZXIgdGhlIE1JVCBsaWNlbnNlLlxuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiX19lc01vZHVsZVwiLCB7IHZhbHVlOiB0cnVlIH0pO1xuZXhwb3J0cy5Qb2xsZXIgPSBleHBvcnRzLlBvbGxlckNhbmNlbGxlZEVycm9yID0gZXhwb3J0cy5Qb2xsZXJTdG9wcGVkRXJyb3IgPSB2b2lkIDA7XG4vKipcbiAqIFdoZW4gYSBwb2xsZXIgaXMgbWFudWFsbHkgc3RvcHBlZCB0aHJvdWdoIHRoZSBgc3RvcFBvbGxpbmdgIG1ldGhvZCxcbiAqIHRoZSBwb2xsZXIgd2lsbCBiZSByZWplY3RlZCB3aXRoIGFuIGluc3RhbmNlIG9mIHRoZSBQb2xsZXJTdG9wcGVkRXJyb3IuXG4gKi9cbmNsYXNzIFBvbGxlclN0b3BwZWRFcnJvciBleHRlbmRzIEVycm9yIHtcbiAgICBjb25zdHJ1Y3RvcihtZXNzYWdlKSB7XG4gICAgICAgIHN1cGVyKG1lc3NhZ2UpO1xuICAgICAgICB0aGlzLm5hbWUgPSBcIlBvbGxlclN0b3BwZWRFcnJvclwiO1xuICAgICAgICBPYmplY3Quc2V0UHJvdG90eXBlT2YodGhpcywgUG9sbGVyU3RvcHBlZEVycm9yLnByb3RvdHlwZSk7XG4gICAgfVxufVxuZXhwb3J0cy5Qb2xsZXJTdG9wcGVkRXJyb3IgPSBQb2xsZXJTdG9wcGVkRXJyb3I7XG4vKipcbiAqIFdoZW4gdGhlIG9wZXJhdGlvbiBpcyBjYW5jZWxsZWQsIHRoZSBwb2xsZXIgd2lsbCBiZSByZWplY3RlZCB3aXRoIGFuIGluc3RhbmNlXG4gKiBvZiB0aGUgUG9sbGVyQ2FuY2VsbGVkRXJyb3IuXG4gKi9cbmNsYXNzIFBvbGxlckNhbmNlbGxlZEVycm9yIGV4dGVuZHMgRXJyb3Ige1xuICAgIGNvbnN0cnVjdG9yKG1lc3NhZ2UpIHtcbiAgICAgICAgc3VwZXIobWVzc2FnZSk7XG4gICAgICAgIHRoaXMubmFtZSA9IFwiUG9sbGVyQ2FuY2VsbGVkRXJyb3JcIjtcbiAgICAgICAgT2JqZWN0LnNldFByb3RvdHlwZU9mKHRoaXMsIFBvbGxlckNhbmNlbGxlZEVycm9yLnByb3RvdHlwZSk7XG4gICAgfVxufVxuZXhwb3J0cy5Qb2xsZXJDYW5jZWxsZWRFcnJvciA9IFBvbGxlckNhbmNlbGxlZEVycm9yO1xuLyoqXG4gKiBBIGNsYXNzIHRoYXQgcmVwcmVzZW50cyB0aGUgZGVmaW5pdGlvbiBvZiBhIHByb2dyYW0gdGhhdCBwb2xscyB0aHJvdWdoIGNvbnNlY3V0aXZlIHJlcXVlc3RzXG4gKiB1bnRpbCBpdCByZWFjaGVzIGEgc3RhdGUgb2YgY29tcGxldGlvbi5cbiAqXG4gKiBBIHBvbGxlciBjYW4gYmUgZXhlY3V0ZWQgbWFudWFsbHksIGJ5IHBvbGxpbmcgcmVxdWVzdCBieSByZXF1ZXN0IGJ5IGNhbGxpbmcgdG8gdGhlIGBwb2xsKClgIG1ldGhvZCByZXBlYXRlZGx5LCB1bnRpbCBpdHMgb3BlcmF0aW9uIGlzIGNvbXBsZXRlZC5cbiAqIEl0IGFsc28gcHJvdmlkZXMgYSB3YXkgdG8gd2FpdCB1bnRpbCB0aGUgb3BlcmF0aW9uIGNvbXBsZXRlcywgYnkgY2FsbGluZyBgcG9sbFVudGlsRG9uZSgpYCBhbmQgd2FpdGluZyB1bnRpbCB0aGUgb3BlcmF0aW9uIGZpbmlzaGVzLlxuICogUG9sbGVycyBjYW4gYWxzbyByZXF1ZXN0IHRoZSBjYW5jZWxsYXRpb24gb2YgdGhlIG9uZ29pbmcgcHJvY2VzcyB0byB3aG9tIGlzIHByb3ZpZGluZyB0aGUgdW5kZXJseWluZyBsb25nIHJ1bm5pbmcgb3BlcmF0aW9uLlxuICpcbiAqIGBgYHRzXG4gKiBjb25zdCBwb2xsZXIgPSBuZXcgTXlQb2xsZXIoKTtcbiAqXG4gKiAvLyBQb2xsaW5nIGp1c3Qgb25jZTpcbiAqIGF3YWl0IHBvbGxlci5wb2xsKCk7XG4gKlxuICogLy8gV2UgY2FuIHRyeSB0byBjYW5jZWwgdGhlIHJlcXVlc3QgaGVyZSwgYnkgY2FsbGluZzpcbiAqIC8vXG4gKiAvLyAgICAgYXdhaXQgcG9sbGVyLmNhbmNlbE9wZXJhdGlvbigpO1xuICogLy9cbiAqXG4gKiAvLyBHZXR0aW5nIHRoZSBmaW5hbCByZXN1bHQ6XG4gKiBjb25zdCByZXN1bHQgPSBhd2FpdCBwb2xsZXIucG9sbFVudGlsRG9uZSgpO1xuICogYGBgXG4gKlxuICogVGhlIFBvbGxlciBpcyBkZWZpbmVkIGJ5IHR3byB0eXBlcywgYSB0eXBlIHJlcHJlc2VudGluZyB0aGUgc3RhdGUgb2YgdGhlIHBvbGxlciwgd2hpY2hcbiAqIG11c3QgaW5jbHVkZSBhIGJhc2ljIHNldCBvZiBwcm9wZXJ0aWVzIGZyb20gYFBvbGxPcGVyYXRpb25TdGF0ZTxUUmVzdWx0PmAsXG4gKiBhbmQgYSByZXR1cm4gdHlwZSBkZWZpbmVkIGJ5IGBUUmVzdWx0YCwgd2hpY2ggY2FuIGJlIGFueXRoaW5nLlxuICpcbiAqIFRoZSBQb2xsZXIgY2xhc3MgaW1wbGVtZW50cyB0aGUgYFBvbGxlckxpa2VgIGludGVyZmFjZSwgd2hpY2ggYWxsb3dzIHBvbGxlciBpbXBsZW1lbnRhdGlvbnMgdG8gYXZvaWQgaGF2aW5nXG4gKiB0byBleHBvcnQgdGhlIFBvbGxlcidzIGNsYXNzIGRpcmVjdGx5LCBhbmQgaW5zdGVhZCBvbmx5IGV4cG9ydCB0aGUgYWxyZWFkeSBpbnN0YW50aWF0ZWQgcG9sbGVyIHdpdGggdGhlIFBvbGxlckxpa2UgdHlwZS5cbiAqXG4gKiBgYGB0c1xuICogY2xhc3MgQ2xpZW50IHtcbiAqICAgcHVibGljIGFzeW5jIG1ha2VQb2xsZXI6IFBvbGxlckxpa2U8TXlPcGVyYXRpb25TdGF0ZSwgTXlSZXN1bHQ+IHtcbiAqICAgICBjb25zdCBwb2xsZXIgPSBuZXcgTXlQb2xsZXIoe30pO1xuICogICAgIC8vIEl0IG1pZ2h0IGJlIHByZWZlcnJlZCB0byByZXR1cm4gdGhlIHBvbGxlciBhZnRlciB0aGUgZmlyc3QgcmVxdWVzdCBpcyBtYWRlLFxuICogICAgIC8vIHNvIHRoYXQgc29tZSBpbmZvcm1hdGlvbiBjYW4gYmUgb2J0YWluZWQgcmlnaHQgYXdheS5cbiAqICAgICBhd2FpdCBwb2xsZXIucG9sbCgpO1xuICogICAgIHJldHVybiBwb2xsZXI7XG4gKiAgIH1cbiAqIH1cbiAqXG4gKiBjb25zdCBwb2xsZXI6IFBvbGxlckxpa2U8TXlPcGVyYXRpb25TdGF0ZSwgTXlSZXN1bHQ+ID0gbXlDbGllbnQubWFrZVBvbGxlcigpO1xuICogYGBgXG4gKlxuICogQSBwb2xsZXIgY2FuIGJlIGNyZWF0ZWQgdGhyb3VnaCBpdHMgY29uc3RydWN0b3IsIHRoZW4gaXQgY2FuIGJlIHBvbGxlZCB1bnRpbCBpdCdzIGNvbXBsZXRlZC5cbiAqIEF0IGFueSBwb2ludCBpbiB0aW1lLCB0aGUgc3RhdGUgb2YgdGhlIHBvbGxlciBjYW4gYmUgb2J0YWluZWQgd2l0aG91dCBkZWxheSB0aHJvdWdoIHRoZSBnZXRPcGVyYXRpb25TdGF0ZSBtZXRob2QuXG4gKiBBdCBhbnkgcG9pbnQgaW4gdGltZSwgdGhlIGludGVybWVkaWF0ZSBmb3JtcyBvZiB0aGUgcmVzdWx0IHR5cGUgY2FuIGJlIHJlcXVlc3RlZCB3aXRob3V0IGRlbGF5LlxuICogT25jZSB0aGUgdW5kZXJseWluZyBvcGVyYXRpb24gaXMgbWFya2VkIGFzIGNvbXBsZXRlZCwgdGhlIHBvbGxlciB3aWxsIHN0b3AgYW5kIHRoZSBmaW5hbCB2YWx1ZSB3aWxsIGJlIHJldHVybmVkLlxuICpcbiAqIGBgYHRzXG4gKiBjb25zdCBwb2xsZXIgPSBteUNsaWVudC5tYWtlUG9sbGVyKCk7XG4gKiBjb25zdCBzdGF0ZTogTXlPcGVyYXRpb25TdGF0ZSA9IHBvbGxlci5nZXRPcGVyYXRpb25TdGF0ZSgpO1xuICpcbiAqIC8vIFRoZSBpbnRlcm1lZGlhdGUgcmVzdWx0IGNhbiBiZSBvYnRhaW5lZCBhdCBhbnkgdGltZS5cbiAqIGNvbnN0IHJlc3VsdDogTXlSZXN1bHQgfCB1bmRlZmluZWQgPSBwb2xsZXIuZ2V0UmVzdWx0KCk7XG4gKlxuICogLy8gVGhlIGZpbmFsIHJlc3VsdCBjYW4gb25seSBiZSBvYnRhaW5lZCBhZnRlciB0aGUgcG9sbGVyIGZpbmlzaGVzLlxuICogY29uc3QgcmVzdWx0OiBNeVJlc3VsdCA9IGF3YWl0IHBvbGxlci5wb2xsVW50aWxEb25lKCk7XG4gKiBgYGBcbiAqXG4gKi9cbi8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby11c2UtYmVmb3JlLWRlZmluZVxuY2xhc3MgUG9sbGVyIHtcbiAgICAvKipcbiAgICAgKiBBIHBvbGxlciBuZWVkcyB0byBiZSBpbml0aWFsaXplZCBieSBwYXNzaW5nIGluIGF0IGxlYXN0IHRoZSBiYXNpYyBwcm9wZXJ0aWVzIG9mIHRoZSBgUG9sbE9wZXJhdGlvbjxUU3RhdGUsIFRSZXN1bHQ+YC5cbiAgICAgKlxuICAgICAqIFdoZW4gd3JpdGluZyBhbiBpbXBsZW1lbnRhdGlvbiBvZiBhIFBvbGxlciwgdGhpcyBpbXBsZW1lbnRhdGlvbiBuZWVkcyB0byBkZWFsIHdpdGggdGhlIGluaXRpYWxpemF0aW9uXG4gICAgICogb2YgYW55IGN1c3RvbSBzdGF0ZSBiZXlvbmQgdGhlIGJhc2ljIGRlZmluaXRpb24gb2YgdGhlIHBvbGxlci4gVGhlIGJhc2ljIHBvbGxlciBhc3N1bWVzIHRoYXQgdGhlIHBvbGxlcidzXG4gICAgICogb3BlcmF0aW9uIGhhcyBhbHJlYWR5IGJlZW4gZGVmaW5lZCwgYXQgbGVhc3QgaXRzIGJhc2ljIHByb3BlcnRpZXMuIFRoZSBjb2RlIGJlbG93IHNob3dzIGhvdyB0byBhcHByb2FjaFxuICAgICAqIHRoZSBkZWZpbml0aW9uIG9mIHRoZSBjb25zdHJ1Y3RvciBvZiBhIG5ldyBjdXN0b20gcG9sbGVyLlxuICAgICAqXG4gICAgICogYGBgdHNcbiAgICAgKiBleHBvcnQgY2xhc3MgTXlQb2xsZXIgZXh0ZW5kcyBQb2xsZXI8TXlPcGVyYXRpb25TdGF0ZSwgc3RyaW5nPiB7XG4gICAgICogICBjb25zdHJ1Y3Rvcih7XG4gICAgICogICAgIC8vIEFueXRoaW5nIHlvdSBtaWdodCBuZWVkIG91dHNpZGUgb2YgdGhlIGJhc2ljc1xuICAgICAqICAgfSkge1xuICAgICAqICAgICBsZXQgc3RhdGU6IE15T3BlcmF0aW9uU3RhdGUgPSB7XG4gICAgICogICAgICAgcHJpdmF0ZVByb3BlcnR5OiBwcml2YXRlLFxuICAgICAqICAgICAgIHB1YmxpY1Byb3BlcnR5OiBwdWJsaWMsXG4gICAgICogICAgIH07XG4gICAgICpcbiAgICAgKiAgICAgY29uc3Qgb3BlcmF0aW9uID0ge1xuICAgICAqICAgICAgIHN0YXRlLFxuICAgICAqICAgICAgIHVwZGF0ZSxcbiAgICAgKiAgICAgICBjYW5jZWwsXG4gICAgICogICAgICAgdG9TdHJpbmdcbiAgICAgKiAgICAgfVxuICAgICAqXG4gICAgICogICAgIC8vIFNlbmRpbmcgdGhlIG9wZXJhdGlvbiB0byB0aGUgcGFyZW50J3MgY29uc3RydWN0b3IuXG4gICAgICogICAgIHN1cGVyKG9wZXJhdGlvbik7XG4gICAgICpcbiAgICAgKiAgICAgLy8gWW91IGNhbiBhc3NpZ24gbW9yZSBsb2NhbCBwcm9wZXJ0aWVzIGhlcmUuXG4gICAgICogICB9XG4gICAgICogfVxuICAgICAqIGBgYFxuICAgICAqXG4gICAgICogSW5zaWRlIG9mIHRoaXMgY29uc3RydWN0b3IsIGEgbmV3IHByb21pc2UgaXMgY3JlYXRlZC4gVGhpcyB3aWxsIGJlIHVzZWQgdG9cbiAgICAgKiB0ZWxsIHRoZSB1c2VyIHdoZW4gdGhlIHBvbGxlciBmaW5pc2hlcyAoc2VlIGBwb2xsVW50aWxEb25lKClgKS4gVGhlIHByb21pc2Unc1xuICAgICAqIHJlc29sdmUgYW5kIHJlamVjdCBtZXRob2RzIGFyZSBhbHNvIHVzZWQgaW50ZXJuYWxseSB0byBjb250cm9sIHdoZW4gdG8gcmVzb2x2ZVxuICAgICAqIG9yIHJlamVjdCBhbnlvbmUgd2FpdGluZyBmb3IgdGhlIHBvbGxlciB0byBmaW5pc2guXG4gICAgICpcbiAgICAgKiBUaGUgY29uc3RydWN0b3Igb2YgYSBjdXN0b20gaW1wbGVtZW50YXRpb24gb2YgYSBwb2xsZXIgaXMgd2hlcmUgYW55IHNlcmlhbGl6ZWQgdmVyc2lvbiBvZlxuICAgICAqIGEgcHJldmlvdXMgcG9sbGVyJ3Mgb3BlcmF0aW9uIHNob3VsZCBiZSBkZXNlcmlhbGl6ZWQgaW50byB0aGUgb3BlcmF0aW9uIHNlbnQgdG8gdGhlXG4gICAgICogYmFzZSBjb25zdHJ1Y3Rvci4gRm9yIGV4YW1wbGU6XG4gICAgICpcbiAgICAgKiBgYGB0c1xuICAgICAqIGV4cG9ydCBjbGFzcyBNeVBvbGxlciBleHRlbmRzIFBvbGxlcjxNeU9wZXJhdGlvblN0YXRlLCBzdHJpbmc+IHtcbiAgICAgKiAgIGNvbnN0cnVjdG9yKFxuICAgICAqICAgICBiYXNlT3BlcmF0aW9uOiBzdHJpbmcgfCB1bmRlZmluZWRcbiAgICAgKiAgICkge1xuICAgICAqICAgICBsZXQgc3RhdGU6IE15T3BlcmF0aW9uU3RhdGUgPSB7fTtcbiAgICAgKiAgICAgaWYgKGJhc2VPcGVyYXRpb24pIHtcbiAgICAgKiAgICAgICBzdGF0ZSA9IHtcbiAgICAgKiAgICAgICAgIC4uLkpTT04ucGFyc2UoYmFzZU9wZXJhdGlvbikuc3RhdGUsXG4gICAgICogICAgICAgICAuLi5zdGF0ZVxuICAgICAqICAgICAgIH07XG4gICAgICogICAgIH1cbiAgICAgKiAgICAgY29uc3Qgb3BlcmF0aW9uID0ge1xuICAgICAqICAgICAgIHN0YXRlLFxuICAgICAqICAgICAgIC8vIC4uLlxuICAgICAqICAgICB9XG4gICAgICogICAgIHN1cGVyKG9wZXJhdGlvbik7XG4gICAgICogICB9XG4gICAgICogfVxuICAgICAqIGBgYFxuICAgICAqXG4gICAgICogQHBhcmFtIG9wZXJhdGlvbiAtIE11c3QgY29udGFpbiB0aGUgYmFzaWMgcHJvcGVydGllcyBvZiBgUG9sbE9wZXJhdGlvbjxTdGF0ZSwgVFJlc3VsdD5gLlxuICAgICAqL1xuICAgIGNvbnN0cnVjdG9yKG9wZXJhdGlvbikge1xuICAgICAgICAvKiogY29udHJvbHMgd2hldGhlciB0byB0aHJvdyBhbiBlcnJvciBpZiB0aGUgb3BlcmF0aW9uIGZhaWxlZCBvciB3YXMgY2FuY2VsZWQuICovXG4gICAgICAgIHRoaXMucmVzb2x2ZU9uVW5zdWNjZXNzZnVsID0gZmFsc2U7XG4gICAgICAgIHRoaXMuc3RvcHBlZCA9IHRydWU7XG4gICAgICAgIHRoaXMucG9sbFByb2dyZXNzQ2FsbGJhY2tzID0gW107XG4gICAgICAgIHRoaXMub3BlcmF0aW9uID0gb3BlcmF0aW9uO1xuICAgICAgICB0aGlzLnByb21pc2UgPSBuZXcgUHJvbWlzZSgocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XG4gICAgICAgICAgICB0aGlzLnJlc29sdmUgPSByZXNvbHZlO1xuICAgICAgICAgICAgdGhpcy5yZWplY3QgPSByZWplY3Q7XG4gICAgICAgIH0pO1xuICAgICAgICAvLyBUaGlzIHByZXZlbnRzIHRoZSBVbmhhbmRsZWRQcm9taXNlUmVqZWN0aW9uV2FybmluZyBpbiBub2RlLmpzIGZyb20gYmVpbmcgdGhyb3duLlxuICAgICAgICAvLyBUaGUgYWJvdmUgd2FybmluZyB3b3VsZCBnZXQgdGhyb3duIGlmIGBwb2xsZXIucG9sbGAgaXMgY2FsbGVkLCBpdCByZXR1cm5zIGFuIGVycm9yLFxuICAgICAgICAvLyBhbmQgcHVsbFVudGlsRG9uZSBkaWQgbm90IGhhdmUgYSAuY2F0Y2ggb3IgYXdhaXQgdHJ5L2NhdGNoIG9uIGl0J3MgcmV0dXJuIHZhbHVlLlxuICAgICAgICB0aGlzLnByb21pc2UuY2F0Y2goKCkgPT4ge1xuICAgICAgICAgICAgLyogaW50ZW50aW9uYWxseSBibGFuayAqL1xuICAgICAgICB9KTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogU3RhcnRzIGEgbG9vcCB0aGF0IHdpbGwgYnJlYWsgb25seSBpZiB0aGUgcG9sbGVyIGlzIGRvbmVcbiAgICAgKiBvciBpZiB0aGUgcG9sbGVyIGlzIHN0b3BwZWQuXG4gICAgICovXG4gICAgYXN5bmMgc3RhcnRQb2xsaW5nKHBvbGxPcHRpb25zID0ge30pIHtcbiAgICAgICAgaWYgKHRoaXMuc3RvcHBlZCkge1xuICAgICAgICAgICAgdGhpcy5zdG9wcGVkID0gZmFsc2U7XG4gICAgICAgIH1cbiAgICAgICAgd2hpbGUgKCF0aGlzLmlzU3RvcHBlZCgpICYmICF0aGlzLmlzRG9uZSgpKSB7XG4gICAgICAgICAgICBhd2FpdCB0aGlzLnBvbGwocG9sbE9wdGlvbnMpO1xuICAgICAgICAgICAgYXdhaXQgdGhpcy5kZWxheSgpO1xuICAgICAgICB9XG4gICAgfVxuICAgIC8qKlxuICAgICAqIHBvbGxPbmNlIGRvZXMgb25lIHBvbGxpbmcsIGJ5IGNhbGxpbmcgdG8gdGhlIHVwZGF0ZSBtZXRob2Qgb2YgdGhlIHVuZGVybHlpbmdcbiAgICAgKiBwb2xsIG9wZXJhdGlvbiB0byBtYWtlIGFueSByZWxldmFudCBjaGFuZ2UgZWZmZWN0aXZlLlxuICAgICAqXG4gICAgICogSXQgb25seSBvcHRpb25hbGx5IHJlY2VpdmVzIGFuIG9iamVjdCB3aXRoIGFuIGFib3J0U2lnbmFsIHByb3BlcnR5LCBmcm9tIFxcQGF6dXJlL2Fib3J0LWNvbnRyb2xsZXIncyBBYm9ydFNpZ25hbExpa2UuXG4gICAgICpcbiAgICAgKiBAcGFyYW0gb3B0aW9ucyAtIE9wdGlvbmFsIHByb3BlcnRpZXMgcGFzc2VkIHRvIHRoZSBvcGVyYXRpb24ncyB1cGRhdGUgbWV0aG9kLlxuICAgICAqL1xuICAgIGFzeW5jIHBvbGxPbmNlKG9wdGlvbnMgPSB7fSkge1xuICAgICAgICBpZiAoIXRoaXMuaXNEb25lKCkpIHtcbiAgICAgICAgICAgIHRoaXMub3BlcmF0aW9uID0gYXdhaXQgdGhpcy5vcGVyYXRpb24udXBkYXRlKHtcbiAgICAgICAgICAgICAgICBhYm9ydFNpZ25hbDogb3B0aW9ucy5hYm9ydFNpZ25hbCxcbiAgICAgICAgICAgICAgICBmaXJlUHJvZ3Jlc3M6IHRoaXMuZmlyZVByb2dyZXNzLmJpbmQodGhpcyksXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLnByb2Nlc3NVcGRhdGVkU3RhdGUoKTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogZmlyZVByb2dyZXNzIGNhbGxzIHRoZSBmdW5jdGlvbnMgcGFzc2VkIGluIHZpYSBvblByb2dyZXNzIHRoZSBtZXRob2Qgb2YgdGhlIHBvbGxlci5cbiAgICAgKlxuICAgICAqIEl0IGxvb3BzIG92ZXIgYWxsIG9mIHRoZSBjYWxsYmFja3MgcmVjZWl2ZWQgZnJvbSBvblByb2dyZXNzLCBhbmQgZXhlY3V0ZXMgdGhlbSwgc2VuZGluZyB0aGVtXG4gICAgICogdGhlIGN1cnJlbnQgb3BlcmF0aW9uIHN0YXRlLlxuICAgICAqXG4gICAgICogQHBhcmFtIHN0YXRlIC0gVGhlIGN1cnJlbnQgb3BlcmF0aW9uIHN0YXRlLlxuICAgICAqL1xuICAgIGZpcmVQcm9ncmVzcyhzdGF0ZSkge1xuICAgICAgICBmb3IgKGNvbnN0IGNhbGxiYWNrIG9mIHRoaXMucG9sbFByb2dyZXNzQ2FsbGJhY2tzKSB7XG4gICAgICAgICAgICBjYWxsYmFjayhzdGF0ZSk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgLyoqXG4gICAgICogSW52b2tlcyB0aGUgdW5kZXJseWluZyBvcGVyYXRpb24ncyBjYW5jZWwgbWV0aG9kLlxuICAgICAqL1xuICAgIGFzeW5jIGNhbmNlbE9uY2Uob3B0aW9ucyA9IHt9KSB7XG4gICAgICAgIHRoaXMub3BlcmF0aW9uID0gYXdhaXQgdGhpcy5vcGVyYXRpb24uY2FuY2VsKG9wdGlvbnMpO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBSZXR1cm5zIGEgcHJvbWlzZSB0aGF0IHdpbGwgcmVzb2x2ZSBvbmNlIGEgc2luZ2xlIHBvbGxpbmcgcmVxdWVzdCBmaW5pc2hlcy5cbiAgICAgKiBJdCBkb2VzIHRoaXMgYnkgY2FsbGluZyB0aGUgdXBkYXRlIG1ldGhvZCBvZiB0aGUgUG9sbGVyJ3Mgb3BlcmF0aW9uLlxuICAgICAqXG4gICAgICogSXQgb25seSBvcHRpb25hbGx5IHJlY2VpdmVzIGFuIG9iamVjdCB3aXRoIGFuIGFib3J0U2lnbmFsIHByb3BlcnR5LCBmcm9tIFxcQGF6dXJlL2Fib3J0LWNvbnRyb2xsZXIncyBBYm9ydFNpZ25hbExpa2UuXG4gICAgICpcbiAgICAgKiBAcGFyYW0gb3B0aW9ucyAtIE9wdGlvbmFsIHByb3BlcnRpZXMgcGFzc2VkIHRvIHRoZSBvcGVyYXRpb24ncyB1cGRhdGUgbWV0aG9kLlxuICAgICAqL1xuICAgIHBvbGwob3B0aW9ucyA9IHt9KSB7XG4gICAgICAgIGlmICghdGhpcy5wb2xsT25jZVByb21pc2UpIHtcbiAgICAgICAgICAgIHRoaXMucG9sbE9uY2VQcm9taXNlID0gdGhpcy5wb2xsT25jZShvcHRpb25zKTtcbiAgICAgICAgICAgIGNvbnN0IGNsZWFyUG9sbE9uY2VQcm9taXNlID0gKCkgPT4ge1xuICAgICAgICAgICAgICAgIHRoaXMucG9sbE9uY2VQcm9taXNlID0gdW5kZWZpbmVkO1xuICAgICAgICAgICAgfTtcbiAgICAgICAgICAgIHRoaXMucG9sbE9uY2VQcm9taXNlLnRoZW4oY2xlYXJQb2xsT25jZVByb21pc2UsIGNsZWFyUG9sbE9uY2VQcm9taXNlKS5jYXRjaCh0aGlzLnJlamVjdCk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHRoaXMucG9sbE9uY2VQcm9taXNlO1xuICAgIH1cbiAgICBwcm9jZXNzVXBkYXRlZFN0YXRlKCkge1xuICAgICAgICBpZiAodGhpcy5vcGVyYXRpb24uc3RhdGUuZXJyb3IpIHtcbiAgICAgICAgICAgIHRoaXMuc3RvcHBlZCA9IHRydWU7XG4gICAgICAgICAgICBpZiAoIXRoaXMucmVzb2x2ZU9uVW5zdWNjZXNzZnVsKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5yZWplY3QodGhpcy5vcGVyYXRpb24uc3RhdGUuZXJyb3IpO1xuICAgICAgICAgICAgICAgIHRocm93IHRoaXMub3BlcmF0aW9uLnN0YXRlLmVycm9yO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGlmICh0aGlzLm9wZXJhdGlvbi5zdGF0ZS5pc0NhbmNlbGxlZCkge1xuICAgICAgICAgICAgdGhpcy5zdG9wcGVkID0gdHJ1ZTtcbiAgICAgICAgICAgIGlmICghdGhpcy5yZXNvbHZlT25VbnN1Y2Nlc3NmdWwpIHtcbiAgICAgICAgICAgICAgICBjb25zdCBlcnJvciA9IG5ldyBQb2xsZXJDYW5jZWxsZWRFcnJvcihcIk9wZXJhdGlvbiB3YXMgY2FuY2VsZWRcIik7XG4gICAgICAgICAgICAgICAgdGhpcy5yZWplY3QoZXJyb3IpO1xuICAgICAgICAgICAgICAgIHRocm93IGVycm9yO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGlmICh0aGlzLmlzRG9uZSgpICYmIHRoaXMucmVzb2x2ZSkge1xuICAgICAgICAgICAgLy8gSWYgdGhlIHBvbGxlciBoYXMgZmluaXNoZWQgcG9sbGluZywgdGhpcyBtZWFucyB3ZSBub3cgaGF2ZSBhIHJlc3VsdC5cbiAgICAgICAgICAgIC8vIEhvd2V2ZXIsIGl0IGNhbiBiZSB0aGUgY2FzZSB0aGF0IFRSZXN1bHQgaXMgaW5zdGFudGlhdGVkIHRvIHZvaWQsIHNvXG4gICAgICAgICAgICAvLyB3ZSBhcmUgbm90IGV4cGVjdGluZyBhIHJlc3VsdCBhbnl3YXkuIFRvIGFzc2VydCB0aGF0IHdlIG1pZ2h0IG5vdFxuICAgICAgICAgICAgLy8gaGF2ZSBhIHJlc3VsdCBldmVudHVhbGx5IGFmdGVyIGZpbmlzaGluZyBwb2xsaW5nLCB3ZSBjYXN0IHRoZSByZXN1bHRcbiAgICAgICAgICAgIC8vIHRvIFRSZXN1bHQuXG4gICAgICAgICAgICB0aGlzLnJlc29sdmUodGhpcy5nZXRSZXN1bHQoKSk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgLyoqXG4gICAgICogUmV0dXJucyBhIHByb21pc2UgdGhhdCB3aWxsIHJlc29sdmUgb25jZSB0aGUgdW5kZXJseWluZyBvcGVyYXRpb24gaXMgY29tcGxldGVkLlxuICAgICAqL1xuICAgIGFzeW5jIHBvbGxVbnRpbERvbmUocG9sbE9wdGlvbnMgPSB7fSkge1xuICAgICAgICBpZiAodGhpcy5zdG9wcGVkKSB7XG4gICAgICAgICAgICB0aGlzLnN0YXJ0UG9sbGluZyhwb2xsT3B0aW9ucykuY2F0Y2godGhpcy5yZWplY3QpO1xuICAgICAgICB9XG4gICAgICAgIC8vIFRoaXMgaXMgbmVlZGVkIGJlY2F1c2UgdGhlIHN0YXRlIGNvdWxkIGhhdmUgYmVlbiB1cGRhdGVkIGJ5XG4gICAgICAgIC8vIGBjYW5jZWxPcGVyYXRpb25gLCBlLmcuIHRoZSBvcGVyYXRpb24gaXMgY2FuY2VsZWQgb3IgYW4gZXJyb3Igb2NjdXJyZWQuXG4gICAgICAgIHRoaXMucHJvY2Vzc1VwZGF0ZWRTdGF0ZSgpO1xuICAgICAgICByZXR1cm4gdGhpcy5wcm9taXNlO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBJbnZva2VzIHRoZSBwcm92aWRlZCBjYWxsYmFjayBhZnRlciBlYWNoIHBvbGxpbmcgaXMgY29tcGxldGVkLFxuICAgICAqIHNlbmRpbmcgdGhlIGN1cnJlbnQgc3RhdGUgb2YgdGhlIHBvbGxlcidzIG9wZXJhdGlvbi5cbiAgICAgKlxuICAgICAqIEl0IHJldHVybnMgYSBtZXRob2QgdGhhdCBjYW4gYmUgdXNlZCB0byBzdG9wIHJlY2VpdmluZyB1cGRhdGVzIG9uIHRoZSBnaXZlbiBjYWxsYmFjayBmdW5jdGlvbi5cbiAgICAgKi9cbiAgICBvblByb2dyZXNzKGNhbGxiYWNrKSB7XG4gICAgICAgIHRoaXMucG9sbFByb2dyZXNzQ2FsbGJhY2tzLnB1c2goY2FsbGJhY2spO1xuICAgICAgICByZXR1cm4gKCkgPT4ge1xuICAgICAgICAgICAgdGhpcy5wb2xsUHJvZ3Jlc3NDYWxsYmFja3MgPSB0aGlzLnBvbGxQcm9ncmVzc0NhbGxiYWNrcy5maWx0ZXIoKGMpID0+IGMgIT09IGNhbGxiYWNrKTtcbiAgICAgICAgfTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogUmV0dXJucyB0cnVlIGlmIHRoZSBwb2xsZXIgaGFzIGZpbmlzaGVkIHBvbGxpbmcuXG4gICAgICovXG4gICAgaXNEb25lKCkge1xuICAgICAgICBjb25zdCBzdGF0ZSA9IHRoaXMub3BlcmF0aW9uLnN0YXRlO1xuICAgICAgICByZXR1cm4gQm9vbGVhbihzdGF0ZS5pc0NvbXBsZXRlZCB8fCBzdGF0ZS5pc0NhbmNlbGxlZCB8fCBzdGF0ZS5lcnJvcik7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIFN0b3BzIHRoZSBwb2xsZXIgZnJvbSBjb250aW51aW5nIHRvIHBvbGwuXG4gICAgICovXG4gICAgc3RvcFBvbGxpbmcoKSB7XG4gICAgICAgIGlmICghdGhpcy5zdG9wcGVkKSB7XG4gICAgICAgICAgICB0aGlzLnN0b3BwZWQgPSB0cnVlO1xuICAgICAgICAgICAgaWYgKHRoaXMucmVqZWN0KSB7XG4gICAgICAgICAgICAgICAgdGhpcy5yZWplY3QobmV3IFBvbGxlclN0b3BwZWRFcnJvcihcIlRoaXMgcG9sbGVyIGlzIGFscmVhZHkgc3RvcHBlZFwiKSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG4gICAgLyoqXG4gICAgICogUmV0dXJucyB0cnVlIGlmIHRoZSBwb2xsZXIgaXMgc3RvcHBlZC5cbiAgICAgKi9cbiAgICBpc1N0b3BwZWQoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLnN0b3BwZWQ7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIEF0dGVtcHRzIHRvIGNhbmNlbCB0aGUgdW5kZXJseWluZyBvcGVyYXRpb24uXG4gICAgICpcbiAgICAgKiBJdCBvbmx5IG9wdGlvbmFsbHkgcmVjZWl2ZXMgYW4gb2JqZWN0IHdpdGggYW4gYWJvcnRTaWduYWwgcHJvcGVydHksIGZyb20gXFxAYXp1cmUvYWJvcnQtY29udHJvbGxlcidzIEFib3J0U2lnbmFsTGlrZS5cbiAgICAgKlxuICAgICAqIElmIGl0J3MgY2FsbGVkIGFnYWluIGJlZm9yZSBpdCBmaW5pc2hlcywgaXQgd2lsbCB0aHJvdyBhbiBlcnJvci5cbiAgICAgKlxuICAgICAqIEBwYXJhbSBvcHRpb25zIC0gT3B0aW9uYWwgcHJvcGVydGllcyBwYXNzZWQgdG8gdGhlIG9wZXJhdGlvbidzIHVwZGF0ZSBtZXRob2QuXG4gICAgICovXG4gICAgY2FuY2VsT3BlcmF0aW9uKG9wdGlvbnMgPSB7fSkge1xuICAgICAgICBpZiAoIXRoaXMuY2FuY2VsUHJvbWlzZSkge1xuICAgICAgICAgICAgdGhpcy5jYW5jZWxQcm9taXNlID0gdGhpcy5jYW5jZWxPbmNlKG9wdGlvbnMpO1xuICAgICAgICB9XG4gICAgICAgIGVsc2UgaWYgKG9wdGlvbnMuYWJvcnRTaWduYWwpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihcIkEgY2FuY2VsIHJlcXVlc3QgaXMgY3VycmVudGx5IHBlbmRpbmdcIik7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHRoaXMuY2FuY2VsUHJvbWlzZTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogUmV0dXJucyB0aGUgc3RhdGUgb2YgdGhlIG9wZXJhdGlvbi5cbiAgICAgKlxuICAgICAqIEV2ZW4gdGhvdWdoIFRTdGF0ZSB3aWxsIGJlIHRoZSBzYW1lIHR5cGUgaW5zaWRlIGFueSBvZiB0aGUgbWV0aG9kcyBvZiBhbnkgZXh0ZW5zaW9uIG9mIHRoZSBQb2xsZXIgY2xhc3MsXG4gICAgICogaW1wbGVtZW50YXRpb25zIG9mIHRoZSBwb2xsZXJzIGNhbiBjdXN0b21pemUgd2hhdCdzIHNoYXJlZCB3aXRoIHRoZSBwdWJsaWMgYnkgd3JpdGluZyB0aGVpciBvd25cbiAgICAgKiB2ZXJzaW9uIG9mIHRoZSBgZ2V0T3BlcmF0aW9uU3RhdGVgIG1ldGhvZCwgYW5kIGJ5IGRlZmluaW5nIHR3byB0eXBlcywgb25lIHJlcHJlc2VudGluZyB0aGUgaW50ZXJuYWwgc3RhdGUgb2YgdGhlIHBvbGxlclxuICAgICAqIGFuZCBhIHB1YmxpYyB0eXBlIHJlcHJlc2VudGluZyBhIHNhZmUgdG8gc2hhcmUgc3Vic2V0IG9mIHRoZSBwcm9wZXJ0aWVzIG9mIHRoZSBpbnRlcm5hbCBzdGF0ZS5cbiAgICAgKiBUaGVpciBkZWZpbml0aW9uIG9mIGdldE9wZXJhdGlvblN0YXRlIGNhbiB0aGVuIHJldHVybiB0aGVpciBwdWJsaWMgdHlwZS5cbiAgICAgKlxuICAgICAqIEV4YW1wbGU6XG4gICAgICpcbiAgICAgKiBgYGB0c1xuICAgICAqIC8vIExldCdzIHNheSB3ZSBoYXZlIG91ciBwb2xsZXIncyBvcGVyYXRpb24gc3RhdGUgZGVmaW5lZCBhczpcbiAgICAgKiBpbnRlcmZhY2UgTXlPcGVyYXRpb25TdGF0ZSBleHRlbmRzIFBvbGxPcGVyYXRpb25TdGF0ZTxSZXN1bHRUeXBlPiB7XG4gICAgICogICBwcml2YXRlUHJvcGVydHk/OiBzdHJpbmc7XG4gICAgICogICBwdWJsaWNQcm9wZXJ0eT86IHN0cmluZztcbiAgICAgKiB9XG4gICAgICpcbiAgICAgKiAvLyBUbyBhbGxvdyB1cyB0byBoYXZlIGEgdHJ1ZSBzZXBhcmF0aW9uIG9mIHB1YmxpYyBhbmQgcHJpdmF0ZSBzdGF0ZSwgd2UgaGF2ZSB0byBkZWZpbmUgYW5vdGhlciBpbnRlcmZhY2U6XG4gICAgICogaW50ZXJmYWNlIFB1YmxpY1N0YXRlIGV4dGVuZHMgUG9sbE9wZXJhdGlvblN0YXRlPFJlc3VsdFR5cGU+IHtcbiAgICAgKiAgIHB1YmxpY1Byb3BlcnR5Pzogc3RyaW5nO1xuICAgICAqIH1cbiAgICAgKlxuICAgICAqIC8vIFRoZW4sIHdlIGRlZmluZSBvdXIgUG9sbGVyIGFzIGZvbGxvd3M6XG4gICAgICogZXhwb3J0IGNsYXNzIE15UG9sbGVyIGV4dGVuZHMgUG9sbGVyPE15T3BlcmF0aW9uU3RhdGUsIFJlc3VsdFR5cGU+IHtcbiAgICAgKiAgIC8vIC4uLiBNb3JlIGNvbnRlbnQgaXMgbmVlZGVkIGhlcmUgLi4uXG4gICAgICpcbiAgICAgKiAgIHB1YmxpYyBnZXRPcGVyYXRpb25TdGF0ZSgpOiBQdWJsaWNTdGF0ZSB7XG4gICAgICogICAgIGNvbnN0IHN0YXRlOiBQdWJsaWNTdGF0ZSA9IHRoaXMub3BlcmF0aW9uLnN0YXRlO1xuICAgICAqICAgICByZXR1cm4ge1xuICAgICAqICAgICAgIC8vIFByb3BlcnRpZXMgZnJvbSBQb2xsT3BlcmF0aW9uU3RhdGU8VFJlc3VsdD5cbiAgICAgKiAgICAgICBpc1N0YXJ0ZWQ6IHN0YXRlLmlzU3RhcnRlZCxcbiAgICAgKiAgICAgICBpc0NvbXBsZXRlZDogc3RhdGUuaXNDb21wbGV0ZWQsXG4gICAgICogICAgICAgaXNDYW5jZWxsZWQ6IHN0YXRlLmlzQ2FuY2VsbGVkLFxuICAgICAqICAgICAgIGVycm9yOiBzdGF0ZS5lcnJvcixcbiAgICAgKiAgICAgICByZXN1bHQ6IHN0YXRlLnJlc3VsdCxcbiAgICAgKlxuICAgICAqICAgICAgIC8vIFRoZSBvbmx5IG90aGVyIHByb3BlcnR5IG5lZWRlZCBieSBQdWJsaWNTdGF0ZS5cbiAgICAgKiAgICAgICBwdWJsaWNQcm9wZXJ0eTogc3RhdGUucHVibGljUHJvcGVydHlcbiAgICAgKiAgICAgfVxuICAgICAqICAgfVxuICAgICAqIH1cbiAgICAgKiBgYGBcbiAgICAgKlxuICAgICAqIFlvdSBjYW4gc2VlIHRoaXMgaW4gdGhlIHRlc3RzIG9mIHRoaXMgcmVwb3NpdG9yeSwgZ28gdG8gdGhlIGZpbGU6XG4gICAgICogYC4uL3Rlc3QvdXRpbHMvdGVzdFBvbGxlci50c2BcbiAgICAgKiBhbmQgbG9vayBmb3IgdGhlIGdldE9wZXJhdGlvblN0YXRlIGltcGxlbWVudGF0aW9uLlxuICAgICAqL1xuICAgIGdldE9wZXJhdGlvblN0YXRlKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5vcGVyYXRpb24uc3RhdGU7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIFJldHVybnMgdGhlIHJlc3VsdCB2YWx1ZSBvZiB0aGUgb3BlcmF0aW9uLFxuICAgICAqIHJlZ2FyZGxlc3Mgb2YgdGhlIHN0YXRlIG9mIHRoZSBwb2xsZXIuXG4gICAgICogSXQgY2FuIHJldHVybiB1bmRlZmluZWQgb3IgYW4gaW5jb21wbGV0ZSBmb3JtIG9mIHRoZSBmaW5hbCBUUmVzdWx0IHZhbHVlXG4gICAgICogZGVwZW5kaW5nIG9uIHRoZSBpbXBsZW1lbnRhdGlvbi5cbiAgICAgKi9cbiAgICBnZXRSZXN1bHQoKSB7XG4gICAgICAgIGNvbnN0IHN0YXRlID0gdGhpcy5vcGVyYXRpb24uc3RhdGU7XG4gICAgICAgIHJldHVybiBzdGF0ZS5yZXN1bHQ7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIFJldHVybnMgYSBzZXJpYWxpemVkIHZlcnNpb24gb2YgdGhlIHBvbGxlcidzIG9wZXJhdGlvblxuICAgICAqIGJ5IGludm9raW5nIHRoZSBvcGVyYXRpb24ncyB0b1N0cmluZyBtZXRob2QuXG4gICAgICovXG4gICAgdG9TdHJpbmcoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLm9wZXJhdGlvbi50b1N0cmluZygpO1xuICAgIH1cbn1cbmV4cG9ydHMuUG9sbGVyID0gUG9sbGVyO1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9cG9sbGVyLmpzLm1hcCIsCiAgICAiXCJ1c2Ugc3RyaWN0XCI7XG4vLyBDb3B5cmlnaHQgKGMpIE1pY3Jvc29mdCBDb3Jwb3JhdGlvbi5cbi8vIExpY2Vuc2VkIHVuZGVyIHRoZSBNSVQgbGljZW5zZS5cbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIl9fZXNNb2R1bGVcIiwgeyB2YWx1ZTogdHJ1ZSB9KTtcbmV4cG9ydHMuTHJvRW5naW5lID0gdm9pZCAwO1xuY29uc3Qgb3BlcmF0aW9uX2pzXzEgPSByZXF1aXJlKFwiLi9vcGVyYXRpb24uanNcIik7XG5jb25zdCBjb25zdGFudHNfanNfMSA9IHJlcXVpcmUoXCIuLi8uLi9wb2xsZXIvY29uc3RhbnRzLmpzXCIpO1xuY29uc3QgcG9sbGVyX2pzXzEgPSByZXF1aXJlKFwiLi4vcG9sbGVyLmpzXCIpO1xuY29uc3Qgb3BlcmF0aW9uX2pzXzIgPSByZXF1aXJlKFwiLi4vLi4vcG9sbGVyL29wZXJhdGlvbi5qc1wiKTtcbi8qKlxuICogVGhlIExSTyBFbmdpbmUsIGEgY2xhc3MgdGhhdCBwZXJmb3JtcyBwb2xsaW5nLlxuICovXG5jbGFzcyBMcm9FbmdpbmUgZXh0ZW5kcyBwb2xsZXJfanNfMS5Qb2xsZXIge1xuICAgIGNvbnN0cnVjdG9yKGxybywgb3B0aW9ucykge1xuICAgICAgICBjb25zdCB7IGludGVydmFsSW5NcyA9IGNvbnN0YW50c19qc18xLlBPTExfSU5URVJWQUxfSU5fTVMsIHJlc3VtZUZyb20sIHJlc29sdmVPblVuc3VjY2Vzc2Z1bCA9IGZhbHNlLCBpc0RvbmUsIGxyb1Jlc291cmNlTG9jYXRpb25Db25maWcsIHByb2Nlc3NSZXN1bHQsIHVwZGF0ZVN0YXRlLCB9ID0gb3B0aW9ucyB8fCB7fTtcbiAgICAgICAgY29uc3Qgc3RhdGUgPSByZXN1bWVGcm9tXG4gICAgICAgICAgICA/ICgwLCBvcGVyYXRpb25fanNfMi5kZXNlcmlhbGl6ZVN0YXRlKShyZXN1bWVGcm9tKVxuICAgICAgICAgICAgOiB7fTtcbiAgICAgICAgY29uc3Qgb3BlcmF0aW9uID0gbmV3IG9wZXJhdGlvbl9qc18xLkdlbmVyaWNQb2xsT3BlcmF0aW9uKHN0YXRlLCBscm8sICFyZXNvbHZlT25VbnN1Y2Nlc3NmdWwsIGxyb1Jlc291cmNlTG9jYXRpb25Db25maWcsIHByb2Nlc3NSZXN1bHQsIHVwZGF0ZVN0YXRlLCBpc0RvbmUpO1xuICAgICAgICBzdXBlcihvcGVyYXRpb24pO1xuICAgICAgICB0aGlzLnJlc29sdmVPblVuc3VjY2Vzc2Z1bCA9IHJlc29sdmVPblVuc3VjY2Vzc2Z1bDtcbiAgICAgICAgdGhpcy5jb25maWcgPSB7IGludGVydmFsSW5NczogaW50ZXJ2YWxJbk1zIH07XG4gICAgICAgIG9wZXJhdGlvbi5zZXRQb2xsZXJDb25maWcodGhpcy5jb25maWcpO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBUaGUgbWV0aG9kIHVzZWQgYnkgdGhlIHBvbGxlciB0byB3YWl0IGJlZm9yZSBhdHRlbXB0aW5nIHRvIHVwZGF0ZSBpdHMgb3BlcmF0aW9uLlxuICAgICAqL1xuICAgIGRlbGF5KCkge1xuICAgICAgICByZXR1cm4gbmV3IFByb21pc2UoKHJlc29sdmUpID0+IHNldFRpbWVvdXQoKCkgPT4gcmVzb2x2ZSgpLCB0aGlzLmNvbmZpZy5pbnRlcnZhbEluTXMpKTtcbiAgICB9XG59XG5leHBvcnRzLkxyb0VuZ2luZSA9IExyb0VuZ2luZTtcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPWxyb0VuZ2luZS5qcy5tYXAiLAogICAgIlwidXNlIHN0cmljdFwiO1xuLy8gQ29weXJpZ2h0IChjKSBNaWNyb3NvZnQgQ29ycG9yYXRpb24uXG4vLyBMaWNlbnNlZCB1bmRlciB0aGUgTUlUIGxpY2Vuc2UuXG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJfX2VzTW9kdWxlXCIsIHsgdmFsdWU6IHRydWUgfSk7XG5leHBvcnRzLkxyb0VuZ2luZSA9IHZvaWQgMDtcbnZhciBscm9FbmdpbmVfanNfMSA9IHJlcXVpcmUoXCIuL2xyb0VuZ2luZS5qc1wiKTtcbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIkxyb0VuZ2luZVwiLCB7IGVudW1lcmFibGU6IHRydWUsIGdldDogZnVuY3Rpb24gKCkgeyByZXR1cm4gbHJvRW5naW5lX2pzXzEuTHJvRW5naW5lOyB9IH0pO1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9aW5kZXguanMubWFwIiwKICAgICJcInVzZSBzdHJpY3RcIjtcbi8vIENvcHlyaWdodCAoYykgTWljcm9zb2Z0IENvcnBvcmF0aW9uLlxuLy8gTGljZW5zZWQgdW5kZXIgdGhlIE1JVCBsaWNlbnNlLlxuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiX19lc01vZHVsZVwiLCB7IHZhbHVlOiB0cnVlIH0pO1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9cG9sbE9wZXJhdGlvbi5qcy5tYXAiLAogICAgIlwidXNlIHN0cmljdFwiO1xuLy8gQ29weXJpZ2h0IChjKSBNaWNyb3NvZnQgQ29ycG9yYXRpb24uXG4vLyBMaWNlbnNlZCB1bmRlciB0aGUgTUlUIGxpY2Vuc2UuXG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJfX2VzTW9kdWxlXCIsIHsgdmFsdWU6IHRydWUgfSk7XG5leHBvcnRzLmNyZWF0ZUh0dHBQb2xsZXIgPSB2b2lkIDA7XG5jb25zdCB0c2xpYl8xID0gcmVxdWlyZShcInRzbGliXCIpO1xudmFyIHBvbGxlcl9qc18xID0gcmVxdWlyZShcIi4vaHR0cC9wb2xsZXIuanNcIik7XG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJjcmVhdGVIdHRwUG9sbGVyXCIsIHsgZW51bWVyYWJsZTogdHJ1ZSwgZ2V0OiBmdW5jdGlvbiAoKSB7IHJldHVybiBwb2xsZXJfanNfMS5jcmVhdGVIdHRwUG9sbGVyOyB9IH0pO1xuLyoqXG4gKiBUaGlzIGNhbiBiZSB1bmNvbW1lbnRlZCB0byBleHBvc2UgdGhlIHByb3RvY29sLWFnbm9zdGljIHBvbGxlclxuICovXG4vLyBleHBvcnQge1xuLy8gICBCdWlsZENyZWF0ZVBvbGxlck9wdGlvbnMsXG4vLyAgIE9wZXJhdGlvbixcbi8vICAgQ3JlYXRlUG9sbGVyT3B0aW9ucyxcbi8vICAgT3BlcmF0aW9uQ29uZmlnLFxuLy8gICBSZXN0b3JhYmxlT3BlcmF0aW9uU3RhdGUsXG4vLyB9IGZyb20gXCIuL3BvbGxlci9tb2RlbHNcIjtcbi8vIGV4cG9ydCB7IGJ1aWxkQ3JlYXRlUG9sbGVyIH0gZnJvbSBcIi4vcG9sbGVyL3BvbGxlclwiO1xuLyoqIGxlZ2FjeSAqL1xudHNsaWJfMS5fX2V4cG9ydFN0YXIocmVxdWlyZShcIi4vbGVnYWN5L2xyb0VuZ2luZS9pbmRleC5qc1wiKSwgZXhwb3J0cyk7XG50c2xpYl8xLl9fZXhwb3J0U3RhcihyZXF1aXJlKFwiLi9sZWdhY3kvcG9sbGVyLmpzXCIpLCBleHBvcnRzKTtcbnRzbGliXzEuX19leHBvcnRTdGFyKHJlcXVpcmUoXCIuL2xlZ2FjeS9wb2xsT3BlcmF0aW9uLmpzXCIpLCBleHBvcnRzKTtcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPWluZGV4LmpzLm1hcCIsCiAgICAiJ3VzZSBzdHJpY3QnO1xuXG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgJ19fZXNNb2R1bGUnLCB7IHZhbHVlOiB0cnVlIH0pO1xuXG52YXIgY29yZVJlc3RQaXBlbGluZSA9IHJlcXVpcmUoJ0BhenVyZS9jb3JlLXJlc3QtcGlwZWxpbmUnKTtcbnZhciB0c2xpYiA9IHJlcXVpcmUoJ3RzbGliJyk7XG52YXIgY29yZUF1dGggPSByZXF1aXJlKCdAYXp1cmUvY29yZS1hdXRoJyk7XG52YXIgY29yZVV0aWwgPSByZXF1aXJlKCdAYXp1cmUvY29yZS11dGlsJyk7XG52YXIgY29yZUh0dHBDb21wYXQgPSByZXF1aXJlKCdAYXp1cmUvY29yZS1odHRwLWNvbXBhdCcpO1xudmFyIGNvcmVDbGllbnQgPSByZXF1aXJlKCdAYXp1cmUvY29yZS1jbGllbnQnKTtcbnZhciBjb3JlWG1sID0gcmVxdWlyZSgnQGF6dXJlL2NvcmUteG1sJyk7XG52YXIgbG9nZ2VyJDEgPSByZXF1aXJlKCdAYXp1cmUvbG9nZ2VyJyk7XG52YXIgYWJvcnRDb250cm9sbGVyID0gcmVxdWlyZSgnQGF6dXJlL2Fib3J0LWNvbnRyb2xsZXInKTtcbnZhciBjcnlwdG8gPSByZXF1aXJlKCdjcnlwdG8nKTtcbnZhciBjb3JlVHJhY2luZyA9IHJlcXVpcmUoJ0BhenVyZS9jb3JlLXRyYWNpbmcnKTtcbnZhciBzdHJlYW0gPSByZXF1aXJlKCdzdHJlYW0nKTtcbnZhciBjb3JlTHJvID0gcmVxdWlyZSgnQGF6dXJlL2NvcmUtbHJvJyk7XG52YXIgZXZlbnRzID0gcmVxdWlyZSgnZXZlbnRzJyk7XG52YXIgZnMgPSByZXF1aXJlKCdmcycpO1xudmFyIHV0aWwgPSByZXF1aXJlKCd1dGlsJyk7XG52YXIgYnVmZmVyID0gcmVxdWlyZSgnYnVmZmVyJyk7XG5cbmZ1bmN0aW9uIF9pbnRlcm9wTmFtZXNwYWNlRGVmYXVsdChlKSB7XG4gICAgdmFyIG4gPSBPYmplY3QuY3JlYXRlKG51bGwpO1xuICAgIGlmIChlKSB7XG4gICAgICAgIE9iamVjdC5rZXlzKGUpLmZvckVhY2goZnVuY3Rpb24gKGspIHtcbiAgICAgICAgICAgIGlmIChrICE9PSAnZGVmYXVsdCcpIHtcbiAgICAgICAgICAgICAgICB2YXIgZCA9IE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IoZSwgayk7XG4gICAgICAgICAgICAgICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KG4sIGssIGQuZ2V0ID8gZCA6IHtcbiAgICAgICAgICAgICAgICAgICAgZW51bWVyYWJsZTogdHJ1ZSxcbiAgICAgICAgICAgICAgICAgICAgZ2V0OiBmdW5jdGlvbiAoKSB7IHJldHVybiBlW2tdOyB9XG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgIH1cbiAgICBuLmRlZmF1bHQgPSBlO1xuICAgIHJldHVybiBPYmplY3QuZnJlZXplKG4pO1xufVxuXG52YXIgY29yZUh0dHBDb21wYXRfX25hbWVzcGFjZSA9IC8qI19fUFVSRV9fKi9faW50ZXJvcE5hbWVzcGFjZURlZmF1bHQoY29yZUh0dHBDb21wYXQpO1xudmFyIGNvcmVDbGllbnRfX25hbWVzcGFjZSA9IC8qI19fUFVSRV9fKi9faW50ZXJvcE5hbWVzcGFjZURlZmF1bHQoY29yZUNsaWVudCk7XG52YXIgZnNfX25hbWVzcGFjZSA9IC8qI19fUFVSRV9fKi9faW50ZXJvcE5hbWVzcGFjZURlZmF1bHQoZnMpO1xudmFyIHV0aWxfX25hbWVzcGFjZSA9IC8qI19fUFVSRV9fKi9faW50ZXJvcE5hbWVzcGFjZURlZmF1bHQodXRpbCk7XG5cbi8vIENvcHlyaWdodCAoYykgTWljcm9zb2Z0IENvcnBvcmF0aW9uLlxuLy8gTGljZW5zZWQgdW5kZXIgdGhlIE1JVCBMaWNlbnNlLlxuLyoqXG4gKiBUaGUgYEBhenVyZS9sb2dnZXJgIGNvbmZpZ3VyYXRpb24gZm9yIHRoaXMgcGFja2FnZS5cbiAqL1xuY29uc3QgbG9nZ2VyID0gbG9nZ2VyJDEuY3JlYXRlQ2xpZW50TG9nZ2VyKFwic3RvcmFnZS1ibG9iXCIpO1xuXG4vLyBDb3B5cmlnaHQgKGMpIE1pY3Jvc29mdCBDb3Jwb3JhdGlvbi5cbi8vIExpY2Vuc2VkIHVuZGVyIHRoZSBNSVQgTGljZW5zZS5cbi8qKlxuICogVGhlIGJhc2UgY2xhc3MgZnJvbSB3aGljaCBhbGwgcmVxdWVzdCBwb2xpY2llcyBkZXJpdmUuXG4gKi9cbmNsYXNzIEJhc2VSZXF1ZXN0UG9saWN5IHtcbiAgICAvKipcbiAgICAgKiBUaGUgbWFpbiBtZXRob2QgdG8gaW1wbGVtZW50IHRoYXQgbWFuaXB1bGF0ZXMgYSByZXF1ZXN0L3Jlc3BvbnNlLlxuICAgICAqL1xuICAgIGNvbnN0cnVjdG9yKFxuICAgIC8qKlxuICAgICAqIFRoZSBuZXh0IHBvbGljeSBpbiB0aGUgcGlwZWxpbmUuIEVhY2ggcG9saWN5IGlzIHJlc3BvbnNpYmxlIGZvciBleGVjdXRpbmcgdGhlIG5leHQgb25lIGlmIHRoZSByZXF1ZXN0IGlzIHRvIGNvbnRpbnVlIHRocm91Z2ggdGhlIHBpcGVsaW5lLlxuICAgICAqL1xuICAgIF9uZXh0UG9saWN5LCBcbiAgICAvKipcbiAgICAgKiBUaGUgb3B0aW9ucyB0aGF0IGNhbiBiZSBwYXNzZWQgdG8gYSBnaXZlbiByZXF1ZXN0IHBvbGljeS5cbiAgICAgKi9cbiAgICBfb3B0aW9ucykge1xuICAgICAgICB0aGlzLl9uZXh0UG9saWN5ID0gX25leHRQb2xpY3k7XG4gICAgICAgIHRoaXMuX29wdGlvbnMgPSBfb3B0aW9ucztcbiAgICB9XG4gICAgLyoqXG4gICAgICogR2V0IHdoZXRoZXIgb3Igbm90IGEgbG9nIHdpdGggdGhlIHByb3ZpZGVkIGxvZyBsZXZlbCBzaG91bGQgYmUgbG9nZ2VkLlxuICAgICAqIEBwYXJhbSBsb2dMZXZlbCAtIFRoZSBsb2cgbGV2ZWwgb2YgdGhlIGxvZyB0aGF0IHdpbGwgYmUgbG9nZ2VkLlxuICAgICAqIEByZXR1cm5zIFdoZXRoZXIgb3Igbm90IGEgbG9nIHdpdGggdGhlIHByb3ZpZGVkIGxvZyBsZXZlbCBzaG91bGQgYmUgbG9nZ2VkLlxuICAgICAqL1xuICAgIHNob3VsZExvZyhsb2dMZXZlbCkge1xuICAgICAgICByZXR1cm4gdGhpcy5fb3B0aW9ucy5zaG91bGRMb2cobG9nTGV2ZWwpO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBBdHRlbXB0IHRvIGxvZyB0aGUgcHJvdmlkZWQgbWVzc2FnZSB0byB0aGUgcHJvdmlkZWQgbG9nZ2VyLiBJZiBubyBsb2dnZXIgd2FzIHByb3ZpZGVkIG9yIGlmXG4gICAgICogdGhlIGxvZyBsZXZlbCBkb2VzIG5vdCBtZWF0IHRoZSBsb2dnZXIncyB0aHJlc2hvbGQsIHRoZW4gbm90aGluZyB3aWxsIGJlIGxvZ2dlZC5cbiAgICAgKiBAcGFyYW0gbG9nTGV2ZWwgLSBUaGUgbG9nIGxldmVsIG9mIHRoaXMgbG9nLlxuICAgICAqIEBwYXJhbSBtZXNzYWdlIC0gVGhlIG1lc3NhZ2Ugb2YgdGhpcyBsb2cuXG4gICAgICovXG4gICAgbG9nKGxvZ0xldmVsLCBtZXNzYWdlKSB7XG4gICAgICAgIHRoaXMuX29wdGlvbnMubG9nKGxvZ0xldmVsLCBtZXNzYWdlKTtcbiAgICB9XG59XG5cbi8vIENvcHlyaWdodCAoYykgTWljcm9zb2Z0IENvcnBvcmF0aW9uLlxuLy8gTGljZW5zZWQgdW5kZXIgdGhlIE1JVCBMaWNlbnNlLlxuY29uc3QgU0RLX1ZFUlNJT04gPSBcIjEyLjI1LjBcIjtcbmNvbnN0IFNFUlZJQ0VfVkVSU0lPTiA9IFwiMjAyNC0xMS0wNFwiO1xuY29uc3QgQkxPQ0tfQkxPQl9NQVhfVVBMT0FEX0JMT0JfQllURVMgPSAyNTYgKiAxMDI0ICogMTAyNDsgLy8gMjU2TUJcbmNvbnN0IEJMT0NLX0JMT0JfTUFYX1NUQUdFX0JMT0NLX0JZVEVTID0gNDAwMCAqIDEwMjQgKiAxMDI0OyAvLyA0MDAwTUJcbmNvbnN0IEJMT0NLX0JMT0JfTUFYX0JMT0NLUyA9IDUwMDAwO1xuY29uc3QgREVGQVVMVF9CTE9DS19CVUZGRVJfU0laRV9CWVRFUyA9IDggKiAxMDI0ICogMTAyNDsgLy8gOE1CXG5jb25zdCBERUZBVUxUX0JMT0JfRE9XTkxPQURfQkxPQ0tfQllURVMgPSA0ICogMTAyNCAqIDEwMjQ7IC8vIDRNQlxuY29uc3QgREVGQVVMVF9NQVhfRE9XTkxPQURfUkVUUllfUkVRVUVTVFMgPSA1O1xuY29uc3QgUkVRVUVTVF9USU1FT1VUID0gMTAwICogMTAwMDsgLy8gSW4gbXNcbi8qKlxuICogVGhlIE9BdXRoIHNjb3BlIHRvIHVzZSB3aXRoIEF6dXJlIFN0b3JhZ2UuXG4gKi9cbmNvbnN0IFN0b3JhZ2VPQXV0aFNjb3BlcyA9IFwiaHR0cHM6Ly9zdG9yYWdlLmF6dXJlLmNvbS8uZGVmYXVsdFwiO1xuY29uc3QgVVJMQ29uc3RhbnRzID0ge1xuICAgIFBhcmFtZXRlcnM6IHtcbiAgICAgICAgRk9SQ0VfQlJPV1NFUl9OT19DQUNIRTogXCJfXCIsXG4gICAgICAgIFNJR05BVFVSRTogXCJzaWdcIixcbiAgICAgICAgU05BUFNIT1Q6IFwic25hcHNob3RcIixcbiAgICAgICAgVkVSU0lPTklEOiBcInZlcnNpb25pZFwiLFxuICAgICAgICBUSU1FT1VUOiBcInRpbWVvdXRcIixcbiAgICB9LFxufTtcbmNvbnN0IEhUVFBVUkxDb25uZWN0aW9uID0ge1xuICAgIEhUVFBfQUNDRVBURUQ6IDIwMixcbiAgICBIVFRQX0NPTkZMSUNUOiA0MDksXG4gICAgSFRUUF9OT1RfRk9VTkQ6IDQwNCxcbiAgICBIVFRQX1BSRUNPTl9GQUlMRUQ6IDQxMixcbiAgICBIVFRQX1JBTkdFX05PVF9TQVRJU0ZJQUJMRTogNDE2LFxufTtcbmNvbnN0IEhlYWRlckNvbnN0YW50cyA9IHtcbiAgICBBVVRIT1JJWkFUSU9OOiBcIkF1dGhvcml6YXRpb25cIixcbiAgICBBVVRIT1JJWkFUSU9OX1NDSEVNRTogXCJCZWFyZXJcIixcbiAgICBDT05URU5UX0VOQ09ESU5HOiBcIkNvbnRlbnQtRW5jb2RpbmdcIixcbiAgICBDT05URU5UX0lEOiBcIkNvbnRlbnQtSURcIixcbiAgICBDT05URU5UX0xBTkdVQUdFOiBcIkNvbnRlbnQtTGFuZ3VhZ2VcIixcbiAgICBDT05URU5UX0xFTkdUSDogXCJDb250ZW50LUxlbmd0aFwiLFxuICAgIENPTlRFTlRfTUQ1OiBcIkNvbnRlbnQtTWQ1XCIsXG4gICAgQ09OVEVOVF9UUkFOU0ZFUl9FTkNPRElORzogXCJDb250ZW50LVRyYW5zZmVyLUVuY29kaW5nXCIsXG4gICAgQ09OVEVOVF9UWVBFOiBcIkNvbnRlbnQtVHlwZVwiLFxuICAgIENPT0tJRTogXCJDb29raWVcIixcbiAgICBEQVRFOiBcImRhdGVcIixcbiAgICBJRl9NQVRDSDogXCJpZi1tYXRjaFwiLFxuICAgIElGX01PRElGSUVEX1NJTkNFOiBcImlmLW1vZGlmaWVkLXNpbmNlXCIsXG4gICAgSUZfTk9ORV9NQVRDSDogXCJpZi1ub25lLW1hdGNoXCIsXG4gICAgSUZfVU5NT0RJRklFRF9TSU5DRTogXCJpZi11bm1vZGlmaWVkLXNpbmNlXCIsXG4gICAgUFJFRklYX0ZPUl9TVE9SQUdFOiBcIngtbXMtXCIsXG4gICAgUkFOR0U6IFwiUmFuZ2VcIixcbiAgICBVU0VSX0FHRU5UOiBcIlVzZXItQWdlbnRcIixcbiAgICBYX01TX0NMSUVOVF9SRVFVRVNUX0lEOiBcIngtbXMtY2xpZW50LXJlcXVlc3QtaWRcIixcbiAgICBYX01TX0NPUFlfU09VUkNFOiBcIngtbXMtY29weS1zb3VyY2VcIixcbiAgICBYX01TX0RBVEU6IFwieC1tcy1kYXRlXCIsXG4gICAgWF9NU19FUlJPUl9DT0RFOiBcIngtbXMtZXJyb3ItY29kZVwiLFxuICAgIFhfTVNfVkVSU0lPTjogXCJ4LW1zLXZlcnNpb25cIixcbiAgICBYX01TX0NvcHlTb3VyY2VFcnJvckNvZGU6IFwieC1tcy1jb3B5LXNvdXJjZS1lcnJvci1jb2RlXCIsXG59O1xuY29uc3QgRVRhZ05vbmUgPSBcIlwiO1xuY29uc3QgRVRhZ0FueSA9IFwiKlwiO1xuY29uc3QgU0laRV8xX01CID0gMSAqIDEwMjQgKiAxMDI0O1xuY29uc3QgQkFUQ0hfTUFYX1JFUVVFU1QgPSAyNTY7XG5jb25zdCBCQVRDSF9NQVhfUEFZTE9BRF9JTl9CWVRFUyA9IDQgKiBTSVpFXzFfTUI7XG5jb25zdCBIVFRQX0xJTkVfRU5ESU5HID0gXCJcXHJcXG5cIjtcbmNvbnN0IEhUVFBfVkVSU0lPTl8xXzEgPSBcIkhUVFAvMS4xXCI7XG5jb25zdCBFbmNyeXB0aW9uQWxnb3JpdGhtQUVTMjUgPSBcIkFFUzI1NlwiO1xuY29uc3QgRGV2ZWxvcG1lbnRDb25uZWN0aW9uU3RyaW5nID0gYERlZmF1bHRFbmRwb2ludHNQcm90b2NvbD1odHRwO0FjY291bnROYW1lPWRldnN0b3JlYWNjb3VudDE7QWNjb3VudEtleT1FYnk4dmRNMDJ4Tk9jcUZscVV3SlBMbG1FdGxDRFhKMU9VekZUNTB1U1JaNklGc3VGcTJVVkVyQ3o0STZ0cS9LMVNaRlBUT3RyL0tCSEJla3NvR01Hdz09O0Jsb2JFbmRwb2ludD1odHRwOi8vMTI3LjAuMC4xOjEwMDAwL2RldnN0b3JlYWNjb3VudDE7YDtcbmNvbnN0IFN0b3JhZ2VCbG9iTG9nZ2luZ0FsbG93ZWRIZWFkZXJOYW1lcyA9IFtcbiAgICBcIkFjY2Vzcy1Db250cm9sLUFsbG93LU9yaWdpblwiLFxuICAgIFwiQ2FjaGUtQ29udHJvbFwiLFxuICAgIFwiQ29udGVudC1MZW5ndGhcIixcbiAgICBcIkNvbnRlbnQtVHlwZVwiLFxuICAgIFwiRGF0ZVwiLFxuICAgIFwiUmVxdWVzdC1JZFwiLFxuICAgIFwidHJhY2VwYXJlbnRcIixcbiAgICBcIlRyYW5zZmVyLUVuY29kaW5nXCIsXG4gICAgXCJVc2VyLUFnZW50XCIsXG4gICAgXCJ4LW1zLWNsaWVudC1yZXF1ZXN0LWlkXCIsXG4gICAgXCJ4LW1zLWRhdGVcIixcbiAgICBcIngtbXMtZXJyb3ItY29kZVwiLFxuICAgIFwieC1tcy1yZXF1ZXN0LWlkXCIsXG4gICAgXCJ4LW1zLXJldHVybi1jbGllbnQtcmVxdWVzdC1pZFwiLFxuICAgIFwieC1tcy12ZXJzaW9uXCIsXG4gICAgXCJBY2NlcHQtUmFuZ2VzXCIsXG4gICAgXCJDb250ZW50LURpc3Bvc2l0aW9uXCIsXG4gICAgXCJDb250ZW50LUVuY29kaW5nXCIsXG4gICAgXCJDb250ZW50LUxhbmd1YWdlXCIsXG4gICAgXCJDb250ZW50LU1ENVwiLFxuICAgIFwiQ29udGVudC1SYW5nZVwiLFxuICAgIFwiRVRhZ1wiLFxuICAgIFwiTGFzdC1Nb2RpZmllZFwiLFxuICAgIFwiU2VydmVyXCIsXG4gICAgXCJWYXJ5XCIsXG4gICAgXCJ4LW1zLWNvbnRlbnQtY3JjNjRcIixcbiAgICBcIngtbXMtY29weS1hY3Rpb25cIixcbiAgICBcIngtbXMtY29weS1jb21wbGV0aW9uLXRpbWVcIixcbiAgICBcIngtbXMtY29weS1pZFwiLFxuICAgIFwieC1tcy1jb3B5LXByb2dyZXNzXCIsXG4gICAgXCJ4LW1zLWNvcHktc3RhdHVzXCIsXG4gICAgXCJ4LW1zLWhhcy1pbW11dGFiaWxpdHktcG9saWN5XCIsXG4gICAgXCJ4LW1zLWhhcy1sZWdhbC1ob2xkXCIsXG4gICAgXCJ4LW1zLWxlYXNlLXN0YXRlXCIsXG4gICAgXCJ4LW1zLWxlYXNlLXN0YXR1c1wiLFxuICAgIFwieC1tcy1yYW5nZVwiLFxuICAgIFwieC1tcy1yZXF1ZXN0LXNlcnZlci1lbmNyeXB0ZWRcIixcbiAgICBcIngtbXMtc2VydmVyLWVuY3J5cHRlZFwiLFxuICAgIFwieC1tcy1zbmFwc2hvdFwiLFxuICAgIFwieC1tcy1zb3VyY2UtcmFuZ2VcIixcbiAgICBcIklmLU1hdGNoXCIsXG4gICAgXCJJZi1Nb2RpZmllZC1TaW5jZVwiLFxuICAgIFwiSWYtTm9uZS1NYXRjaFwiLFxuICAgIFwiSWYtVW5tb2RpZmllZC1TaW5jZVwiLFxuICAgIFwieC1tcy1hY2Nlc3MtdGllclwiLFxuICAgIFwieC1tcy1hY2Nlc3MtdGllci1jaGFuZ2UtdGltZVwiLFxuICAgIFwieC1tcy1hY2Nlc3MtdGllci1pbmZlcnJlZFwiLFxuICAgIFwieC1tcy1hY2NvdW50LWtpbmRcIixcbiAgICBcIngtbXMtYXJjaGl2ZS1zdGF0dXNcIixcbiAgICBcIngtbXMtYmxvYi1hcHBlbmQtb2Zmc2V0XCIsXG4gICAgXCJ4LW1zLWJsb2ItY2FjaGUtY29udHJvbFwiLFxuICAgIFwieC1tcy1ibG9iLWNvbW1pdHRlZC1ibG9jay1jb3VudFwiLFxuICAgIFwieC1tcy1ibG9iLWNvbmRpdGlvbi1hcHBlbmRwb3NcIixcbiAgICBcIngtbXMtYmxvYi1jb25kaXRpb24tbWF4c2l6ZVwiLFxuICAgIFwieC1tcy1ibG9iLWNvbnRlbnQtZGlzcG9zaXRpb25cIixcbiAgICBcIngtbXMtYmxvYi1jb250ZW50LWVuY29kaW5nXCIsXG4gICAgXCJ4LW1zLWJsb2ItY29udGVudC1sYW5ndWFnZVwiLFxuICAgIFwieC1tcy1ibG9iLWNvbnRlbnQtbGVuZ3RoXCIsXG4gICAgXCJ4LW1zLWJsb2ItY29udGVudC1tZDVcIixcbiAgICBcIngtbXMtYmxvYi1jb250ZW50LXR5cGVcIixcbiAgICBcIngtbXMtYmxvYi1wdWJsaWMtYWNjZXNzXCIsXG4gICAgXCJ4LW1zLWJsb2Itc2VxdWVuY2UtbnVtYmVyXCIsXG4gICAgXCJ4LW1zLWJsb2ItdHlwZVwiLFxuICAgIFwieC1tcy1jb3B5LWRlc3RpbmF0aW9uLXNuYXBzaG90XCIsXG4gICAgXCJ4LW1zLWNyZWF0aW9uLXRpbWVcIixcbiAgICBcIngtbXMtZGVmYXVsdC1lbmNyeXB0aW9uLXNjb3BlXCIsXG4gICAgXCJ4LW1zLWRlbGV0ZS1zbmFwc2hvdHNcIixcbiAgICBcIngtbXMtZGVsZXRlLXR5cGUtcGVybWFuZW50XCIsXG4gICAgXCJ4LW1zLWRlbnktZW5jcnlwdGlvbi1zY29wZS1vdmVycmlkZVwiLFxuICAgIFwieC1tcy1lbmNyeXB0aW9uLWFsZ29yaXRobVwiLFxuICAgIFwieC1tcy1pZi1zZXF1ZW5jZS1udW1iZXItZXFcIixcbiAgICBcIngtbXMtaWYtc2VxdWVuY2UtbnVtYmVyLWxlXCIsXG4gICAgXCJ4LW1zLWlmLXNlcXVlbmNlLW51bWJlci1sdFwiLFxuICAgIFwieC1tcy1pbmNyZW1lbnRhbC1jb3B5XCIsXG4gICAgXCJ4LW1zLWxlYXNlLWFjdGlvblwiLFxuICAgIFwieC1tcy1sZWFzZS1icmVhay1wZXJpb2RcIixcbiAgICBcIngtbXMtbGVhc2UtZHVyYXRpb25cIixcbiAgICBcIngtbXMtbGVhc2UtaWRcIixcbiAgICBcIngtbXMtbGVhc2UtdGltZVwiLFxuICAgIFwieC1tcy1wYWdlLXdyaXRlXCIsXG4gICAgXCJ4LW1zLXByb3Bvc2VkLWxlYXNlLWlkXCIsXG4gICAgXCJ4LW1zLXJhbmdlLWdldC1jb250ZW50LW1kNVwiLFxuICAgIFwieC1tcy1yZWh5ZHJhdGUtcHJpb3JpdHlcIixcbiAgICBcIngtbXMtc2VxdWVuY2UtbnVtYmVyLWFjdGlvblwiLFxuICAgIFwieC1tcy1za3UtbmFtZVwiLFxuICAgIFwieC1tcy1zb3VyY2UtY29udGVudC1tZDVcIixcbiAgICBcIngtbXMtc291cmNlLWlmLW1hdGNoXCIsXG4gICAgXCJ4LW1zLXNvdXJjZS1pZi1tb2RpZmllZC1zaW5jZVwiLFxuICAgIFwieC1tcy1zb3VyY2UtaWYtbm9uZS1tYXRjaFwiLFxuICAgIFwieC1tcy1zb3VyY2UtaWYtdW5tb2RpZmllZC1zaW5jZVwiLFxuICAgIFwieC1tcy10YWctY291bnRcIixcbiAgICBcIngtbXMtZW5jcnlwdGlvbi1rZXktc2hhMjU2XCIsXG4gICAgXCJ4LW1zLWNvcHktc291cmNlLWVycm9yLWNvZGVcIixcbiAgICBcIngtbXMtY29weS1zb3VyY2Utc3RhdHVzLWNvZGVcIixcbiAgICBcIngtbXMtaWYtdGFnc1wiLFxuICAgIFwieC1tcy1zb3VyY2UtaWYtdGFnc1wiLFxuXTtcbmNvbnN0IFN0b3JhZ2VCbG9iTG9nZ2luZ0FsbG93ZWRRdWVyeVBhcmFtZXRlcnMgPSBbXG4gICAgXCJjb21wXCIsXG4gICAgXCJtYXhyZXN1bHRzXCIsXG4gICAgXCJyc2NjXCIsXG4gICAgXCJyc2NkXCIsXG4gICAgXCJyc2NlXCIsXG4gICAgXCJyc2NsXCIsXG4gICAgXCJyc2N0XCIsXG4gICAgXCJzZVwiLFxuICAgIFwic2lcIixcbiAgICBcInNpcFwiLFxuICAgIFwic3BcIixcbiAgICBcInNwclwiLFxuICAgIFwic3JcIixcbiAgICBcInNydFwiLFxuICAgIFwic3NcIixcbiAgICBcInN0XCIsXG4gICAgXCJzdlwiLFxuICAgIFwiaW5jbHVkZVwiLFxuICAgIFwibWFya2VyXCIsXG4gICAgXCJwcmVmaXhcIixcbiAgICBcImNvcHlpZFwiLFxuICAgIFwicmVzdHlwZVwiLFxuICAgIFwiYmxvY2tpZFwiLFxuICAgIFwiYmxvY2tsaXN0dHlwZVwiLFxuICAgIFwiZGVsaW1pdGVyXCIsXG4gICAgXCJwcmV2c25hcHNob3RcIixcbiAgICBcInNrZVwiLFxuICAgIFwic2tvaWRcIixcbiAgICBcInNrc1wiLFxuICAgIFwic2t0XCIsXG4gICAgXCJza3RpZFwiLFxuICAgIFwic2t2XCIsXG4gICAgXCJzbmFwc2hvdFwiLFxuXTtcbmNvbnN0IEJsb2JVc2VzQ3VzdG9tZXJTcGVjaWZpZWRFbmNyeXB0aW9uTXNnID0gXCJCbG9iVXNlc0N1c3RvbWVyU3BlY2lmaWVkRW5jcnlwdGlvblwiO1xuY29uc3QgQmxvYkRvZXNOb3RVc2VDdXN0b21lclNwZWNpZmllZEVuY3J5cHRpb24gPSBcIkJsb2JEb2VzTm90VXNlQ3VzdG9tZXJTcGVjaWZpZWRFbmNyeXB0aW9uXCI7XG4vLy8gTGlzdCBvZiBwb3J0cyB1c2VkIGZvciBwYXRoIHN0eWxlIGFkZHJlc3NpbmcuXG4vLy8gUGF0aCBzdHlsZSBhZGRyZXNzaW5nIG1lYW5zIHRoYXQgc3RvcmFnZSBhY2NvdW50IGlzIHB1dCBpbiBVUkkncyBQYXRoIHNlZ21lbnQgaW4gaW5zdGVhZCBvZiBpbiBob3N0LlxuY29uc3QgUGF0aFN0eWxlUG9ydHMgPSBbXG4gICAgXCIxMDAwMFwiLFxuICAgIFwiMTAwMDFcIixcbiAgICBcIjEwMDAyXCIsXG4gICAgXCIxMDAwM1wiLFxuICAgIFwiMTAwMDRcIixcbiAgICBcIjEwMTAwXCIsXG4gICAgXCIxMDEwMVwiLFxuICAgIFwiMTAxMDJcIixcbiAgICBcIjEwMTAzXCIsXG4gICAgXCIxMDEwNFwiLFxuICAgIFwiMTEwMDBcIixcbiAgICBcIjExMDAxXCIsXG4gICAgXCIxMTAwMlwiLFxuICAgIFwiMTEwMDNcIixcbiAgICBcIjExMDA0XCIsXG4gICAgXCIxMTEwMFwiLFxuICAgIFwiMTExMDFcIixcbiAgICBcIjExMTAyXCIsXG4gICAgXCIxMTEwM1wiLFxuICAgIFwiMTExMDRcIixcbl07XG5cbi8vIENvcHlyaWdodCAoYykgTWljcm9zb2Z0IENvcnBvcmF0aW9uLlxuLy8gTGljZW5zZWQgdW5kZXIgdGhlIE1JVCBMaWNlbnNlLlxuLyoqXG4gKiBSZXNlcnZlZCBVUkwgY2hhcmFjdGVycyBtdXN0IGJlIHByb3Blcmx5IGVzY2FwZWQgZm9yIFN0b3JhZ2Ugc2VydmljZXMgbGlrZSBCbG9iIG9yIEZpbGUuXG4gKlxuICogIyMgVVJMIGVuY29kZSBhbmQgZXNjYXBlIHN0cmF0ZWd5IGZvciBKUyBTREtzXG4gKlxuICogV2hlbiBjdXN0b21lcnMgcGFzcyBhIFVSTCBzdHJpbmcgaW50byBYeHhDbGllbnQgY2xhc3NlcyBjb25zdHJ1Y3RvciwgdGhlIFVSTCBzdHJpbmcgbWF5IGFscmVhZHkgYmUgVVJMIGVuY29kZWQgb3Igbm90LlxuICogQnV0IGJlZm9yZSBzZW5kaW5nIHRvIEF6dXJlIFN0b3JhZ2Ugc2VydmVyLCB0aGUgVVJMIG11c3QgYmUgZW5jb2RlZC4gSG93ZXZlciwgaXQncyBoYXJkIGZvciBhIFNESyB0byBndWVzcyB3aGV0aGVyIHRoZSBVUkxcbiAqIHN0cmluZyBoYXMgYmVlbiBlbmNvZGVkIG9yIG5vdC4gV2UgaGF2ZSAyIHBvdGVudGlhbCBzdHJhdGVnaWVzLCBhbmQgY2hvc2Ugc3RyYXRlZ3kgdHdvIGZvciB0aGUgWHh4Q2xpZW50IGNvbnN0cnVjdG9ycy5cbiAqXG4gKiAjIyMgU3RyYXRlZ3kgT25lOiBBc3N1bWUgdGhlIGN1c3RvbWVyIFVSTCBzdHJpbmcgaXMgbm90IGVuY29kZWQsIGFuZCBhbHdheXMgZW5jb2RlIFVSTCBzdHJpbmcgaW4gU0RLLlxuICpcbiAqIFRoaXMgaXMgd2hhdCBsZWdhY3kgVjIgU0RLIGRvZXMsIHNpbXBsZSBhbmQgd29ya3MgZm9yIG1vc3Qgb2YgdGhlIGNhc2VzLlxuICogLSBXaGVuIGN1c3RvbWVyIFVSTCBzdHJpbmcgaXMgXCJodHRwOi8vYWNjb3VudC5ibG9iLmNvcmUud2luZG93cy5uZXQvY29uL2I6XCIsXG4gKiAgIFNESyB3aWxsIGVuY29kZSBpdCB0byBcImh0dHA6Ly9hY2NvdW50LmJsb2IuY29yZS53aW5kb3dzLm5ldC9jb24vYiUzQVwiIGFuZCBzZW5kIHRvIHNlcnZlci4gQSBibG9iIG5hbWVkIFwiYjpcIiB3aWxsIGJlIGNyZWF0ZWQuXG4gKiAtIFdoZW4gY3VzdG9tZXIgVVJMIHN0cmluZyBpcyBcImh0dHA6Ly9hY2NvdW50LmJsb2IuY29yZS53aW5kb3dzLm5ldC9jb24vYiUzQVwiLFxuICogICBTREsgd2lsbCBlbmNvZGUgaXQgdG8gXCJodHRwOi8vYWNjb3VudC5ibG9iLmNvcmUud2luZG93cy5uZXQvY29uL2IlMjUzQVwiIGFuZCBzZW5kIHRvIHNlcnZlci4gQSBibG9iIG5hbWVkIFwiYiUzQVwiIHdpbGwgYmUgY3JlYXRlZC5cbiAqXG4gKiBCdXQgdGhpcyBzdHJhdGVneSB3aWxsIG1ha2UgaXQgbm90IHBvc3NpYmxlIHRvIGNyZWF0ZSBhIGJsb2Igd2l0aCBcIj9cIiBpbiBpdCdzIG5hbWUuIEJlY2F1c2Ugd2hlbiBjdXN0b21lciBVUkwgc3RyaW5nIGlzXG4gKiBcImh0dHA6Ly9hY2NvdW50LmJsb2IuY29yZS53aW5kb3dzLm5ldC9jb24vYmxvYj9uYW1lXCIsIHRoZSBcIj9uYW1lXCIgd2lsbCBiZSB0cmVhdGVkIGFzIFVSTCBwYXJhbXRlciBpbnN0ZWFkIG9mIGJsb2IgbmFtZS5cbiAqIElmIGN1c3RvbWVyIFVSTCBzdHJpbmcgaXMgXCJodHRwOi8vYWNjb3VudC5ibG9iLmNvcmUud2luZG93cy5uZXQvY29uL2Jsb2IlM0ZuYW1lXCIsIGEgYmxvYiBuYW1lZCBcImJsb2IlM0ZuYW1lXCIgd2lsbCBiZSBjcmVhdGVkLlxuICogVjIgU0RLIGRvZXNuJ3QgaGF2ZSB0aGlzIGlzc3VlIGJlY2F1c2UgaXQgZG9lc24ndCBhbGxvdyBjdXN0b21lciBwYXNzIGluIGEgZnVsbCBVUkwsIGl0IGFjY2VwdHMgYSBzZXBhcmF0ZSBibG9iIG5hbWUgYW5kIGVuY29kZVVSSUNvbXBvbmVudCBmb3IgaXQuXG4gKiBXZSBjYW5ub3QgYWNjZXB0IGEgU0RLIGNhbm5vdCBjcmVhdGUgYSBibG9iIG5hbWUgd2l0aCBcIj9cIi4gU28gd2UgaW1wbGVtZW50IHN0cmF0ZWd5IHR3bzpcbiAqXG4gKiAjIyMgU3RyYXRlZ3kgVHdvOiBTREsgZG9lc24ndCBhc3N1bWUgdGhlIFVSTCBoYXMgYmVlbiBlbmNvZGVkIG9yIG5vdC4gSXQgd2lsbCBqdXN0IGVzY2FwZSB0aGUgc3BlY2lhbCBjaGFyYWN0ZXJzLlxuICpcbiAqIFRoaXMgaXMgd2hhdCBWMTAgQmxvYiBHbyBTREsgZG9lcy4gSXQgYWNjZXB0cyBhIFVSTCB0eXBlIGluIEdvLCBhbmQgY2FsbCB1cmwuRXNjYXBlZFBhdGgoKSB0byBlc2NhcGUgdGhlIHNwZWNpYWwgY2hhcnMgdW5lc2NhcGVkLlxuICogLSBXaGVuIGN1c3RvbWVyIFVSTCBzdHJpbmcgaXMgXCJodHRwOi8vYWNjb3VudC5ibG9iLmNvcmUud2luZG93cy5uZXQvY29uL2I6XCIsXG4gKiAgIFNESyB3aWxsIGVzY2FwZSBcIjpcIiBsaWtlIFwiaHR0cDovL2FjY291bnQuYmxvYi5jb3JlLndpbmRvd3MubmV0L2Nvbi9iJTNBXCIgYW5kIHNlbmQgdG8gc2VydmVyLiBBIGJsb2IgbmFtZWQgXCJiOlwiIHdpbGwgYmUgY3JlYXRlZC5cbiAqIC0gV2hlbiBjdXN0b21lciBVUkwgc3RyaW5nIGlzIFwiaHR0cDovL2FjY291bnQuYmxvYi5jb3JlLndpbmRvd3MubmV0L2Nvbi9iJTNBXCIsXG4gKiAgIFRoZXJlIGlzIG5vIHNwZWNpYWwgY2hhcmFjdGVycywgc28gc2VuZCBcImh0dHA6Ly9hY2NvdW50LmJsb2IuY29yZS53aW5kb3dzLm5ldC9jb24vYiUzQVwiIHRvIHNlcnZlci4gQSBibG9iIG5hbWVkIFwiYjpcIiB3aWxsIGJlIGNyZWF0ZWQuXG4gKiAtIFdoZW4gY3VzdG9tZXIgVVJMIHN0cmluZyBpcyBcImh0dHA6Ly9hY2NvdW50LmJsb2IuY29yZS53aW5kb3dzLm5ldC9jb24vYiUyNTNBXCIsXG4gKiAgIFRoZXJlIGlzIG5vIHNwZWNpYWwgY2hhcmFjdGVycywgc28gc2VuZCBcImh0dHA6Ly9hY2NvdW50LmJsb2IuY29yZS53aW5kb3dzLm5ldC9jb24vYiUyNTNBXCIgdG8gc2VydmVyLiBBIGJsb2IgbmFtZWQgXCJiJTNBXCIgd2lsbCBiZSBjcmVhdGVkLlxuICpcbiAqIFRoaXMgc3RyYXRlZ3kgZ2l2ZXMgdXMgZmxleGliaWxpdHkgdG8gY3JlYXRlIHdpdGggYW55IHNwZWNpYWwgY2hhcmFjdGVycy4gQnV0IFwiJVwiIHdpbGwgYmUgdHJlYXRlZCBhcyBhIHNwZWNpYWwgY2hhcmFjdGVycywgaWYgdGhlIFVSTCBzdHJpbmdcbiAqIGlzIG5vdCBlbmNvZGVkLCB0aGVyZSBzaG91bGRuJ3QgYSBcIiVcIiBpbiB0aGUgVVJMIHN0cmluZywgb3RoZXJ3aXNlIHRoZSBVUkwgaXMgbm90IGEgdmFsaWQgVVJMLlxuICogSWYgY3VzdG9tZXIgbmVlZHMgdG8gY3JlYXRlIGEgYmxvYiB3aXRoIFwiJVwiIGluIGl0J3MgYmxvYiBuYW1lLCB1c2UgXCIlMjVcIiBpbnN0ZWFkIG9mIFwiJVwiLiBKdXN0IGxpa2UgYWJvdmUgM3JkIHNhbXBsZS5cbiAqIEFuZCBmb2xsb3dpbmcgVVJMIHN0cmluZ3MgYXJlIGludmFsaWQ6XG4gKiAtIFwiaHR0cDovL2FjY291bnQuYmxvYi5jb3JlLndpbmRvd3MubmV0L2Nvbi9iJVwiXG4gKiAtIFwiaHR0cDovL2FjY291bnQuYmxvYi5jb3JlLndpbmRvd3MubmV0L2Nvbi9iJTJcIlxuICogLSBcImh0dHA6Ly9hY2NvdW50LmJsb2IuY29yZS53aW5kb3dzLm5ldC9jb24vYiVHXCJcbiAqXG4gKiBBbm90aGVyIHNwZWNpYWwgY2hhcmFjdGVyIGlzIFwiP1wiLCB1c2UgXCIlMkZcIiB0byByZXByZXNlbnQgYSBibG9iIG5hbWUgd2l0aCBcIj9cIiBpbiBhIFVSTCBzdHJpbmcuXG4gKlxuICogIyMjIFN0cmF0ZWd5IGZvciBjb250YWluZXJOYW1lLCBibG9iTmFtZSBvciBvdGhlciBzcGVjaWZpYyBYWFhOYW1lIHBhcmFtZXRlcnMgaW4gbWV0aG9kcyBzdWNoIGFzIGBjb250YWluZXJDbGllbnQuZ2V0QmxvYkNsaWVudChibG9iTmFtZSlgXG4gKlxuICogV2Ugd2lsbCBhcHBseSBzdHJhdGVneSBvbmUsIGFuZCBjYWxsIGVuY29kZVVSSUNvbXBvbmVudCBmb3IgdGhlc2UgcGFyYW1ldGVycyBsaWtlIGJsb2JOYW1lLiBCZWNhdXNlIHdoYXQgY3VzdG9tZXJzIHBhc3NlcyBpbiBpcyBhIHBsYWluIG5hbWUgaW5zdGVhZCBvZiBhIFVSTC5cbiAqXG4gKiBAc2VlIGh0dHBzOi8vZG9jcy5taWNyb3NvZnQuY29tL2VuLXVzL3Jlc3QvYXBpL3N0b3JhZ2VzZXJ2aWNlcy9uYW1pbmctYW5kLXJlZmVyZW5jaW5nLWNvbnRhaW5lcnMtLWJsb2JzLS1hbmQtbWV0YWRhdGFcbiAqIEBzZWUgaHR0cHM6Ly9kb2NzLm1pY3Jvc29mdC5jb20vZW4tdXMvcmVzdC9hcGkvc3RvcmFnZXNlcnZpY2VzL25hbWluZy1hbmQtcmVmZXJlbmNpbmctc2hhcmVzLS1kaXJlY3Rvcmllcy0tZmlsZXMtLWFuZC1tZXRhZGF0YVxuICpcbiAqIEBwYXJhbSB1cmwgLVxuICovXG5mdW5jdGlvbiBlc2NhcGVVUkxQYXRoKHVybCkge1xuICAgIGNvbnN0IHVybFBhcnNlZCA9IG5ldyBVUkwodXJsKTtcbiAgICBsZXQgcGF0aCA9IHVybFBhcnNlZC5wYXRobmFtZTtcbiAgICBwYXRoID0gcGF0aCB8fCBcIi9cIjtcbiAgICBwYXRoID0gZXNjYXBlKHBhdGgpO1xuICAgIHVybFBhcnNlZC5wYXRobmFtZSA9IHBhdGg7XG4gICAgcmV0dXJuIHVybFBhcnNlZC50b1N0cmluZygpO1xufVxuZnVuY3Rpb24gZ2V0UHJveHlVcmlGcm9tRGV2Q29ublN0cmluZyhjb25uZWN0aW9uU3RyaW5nKSB7XG4gICAgLy8gRGV2ZWxvcG1lbnQgQ29ubmVjdGlvbiBTdHJpbmdcbiAgICAvLyBodHRwczovL2RvY3MubWljcm9zb2Z0LmNvbS9lbi11cy9henVyZS9zdG9yYWdlL2NvbW1vbi9zdG9yYWdlLWNvbmZpZ3VyZS1jb25uZWN0aW9uLXN0cmluZyNjb25uZWN0LXRvLXRoZS1lbXVsYXRvci1hY2NvdW50LXVzaW5nLXRoZS13ZWxsLWtub3duLWFjY291bnQtbmFtZS1hbmQta2V5XG4gICAgbGV0IHByb3h5VXJpID0gXCJcIjtcbiAgICBpZiAoY29ubmVjdGlvblN0cmluZy5zZWFyY2goXCJEZXZlbG9wbWVudFN0b3JhZ2VQcm94eVVyaT1cIikgIT09IC0xKSB7XG4gICAgICAgIC8vIENPTk5FQ1RJT05fU1RSSU5HPVVzZURldmVsb3BtZW50U3RvcmFnZT10cnVlO0RldmVsb3BtZW50U3RvcmFnZVByb3h5VXJpPWh0dHA6Ly9teVByb3h5VXJpXG4gICAgICAgIGNvbnN0IG1hdGNoQ3JlZGVudGlhbHMgPSBjb25uZWN0aW9uU3RyaW5nLnNwbGl0KFwiO1wiKTtcbiAgICAgICAgZm9yIChjb25zdCBlbGVtZW50IG9mIG1hdGNoQ3JlZGVudGlhbHMpIHtcbiAgICAgICAgICAgIGlmIChlbGVtZW50LnRyaW0oKS5zdGFydHNXaXRoKFwiRGV2ZWxvcG1lbnRTdG9yYWdlUHJveHlVcmk9XCIpKSB7XG4gICAgICAgICAgICAgICAgcHJveHlVcmkgPSBlbGVtZW50LnRyaW0oKS5tYXRjaChcIkRldmVsb3BtZW50U3RvcmFnZVByb3h5VXJpPSguKilcIilbMV07XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIHByb3h5VXJpO1xufVxuZnVuY3Rpb24gZ2V0VmFsdWVJbkNvbm5TdHJpbmcoY29ubmVjdGlvblN0cmluZywgYXJndW1lbnQpIHtcbiAgICBjb25zdCBlbGVtZW50cyA9IGNvbm5lY3Rpb25TdHJpbmcuc3BsaXQoXCI7XCIpO1xuICAgIGZvciAoY29uc3QgZWxlbWVudCBvZiBlbGVtZW50cykge1xuICAgICAgICBpZiAoZWxlbWVudC50cmltKCkuc3RhcnRzV2l0aChhcmd1bWVudCkpIHtcbiAgICAgICAgICAgIHJldHVybiBlbGVtZW50LnRyaW0oKS5tYXRjaChhcmd1bWVudCArIFwiPSguKilcIilbMV07XG4gICAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIFwiXCI7XG59XG4vKipcbiAqIEV4dHJhY3RzIHRoZSBwYXJ0cyBvZiBhbiBBenVyZSBTdG9yYWdlIGFjY291bnQgY29ubmVjdGlvbiBzdHJpbmcuXG4gKlxuICogQHBhcmFtIGNvbm5lY3Rpb25TdHJpbmcgLSBDb25uZWN0aW9uIHN0cmluZy5cbiAqIEByZXR1cm5zIFN0cmluZyBrZXkgdmFsdWUgcGFpcnMgb2YgdGhlIHN0b3JhZ2UgYWNjb3VudCdzIHVybCBhbmQgY3JlZGVudGlhbHMuXG4gKi9cbmZ1bmN0aW9uIGV4dHJhY3RDb25uZWN0aW9uU3RyaW5nUGFydHMoY29ubmVjdGlvblN0cmluZykge1xuICAgIGxldCBwcm94eVVyaSA9IFwiXCI7XG4gICAgaWYgKGNvbm5lY3Rpb25TdHJpbmcuc3RhcnRzV2l0aChcIlVzZURldmVsb3BtZW50U3RvcmFnZT10cnVlXCIpKSB7XG4gICAgICAgIC8vIERldmVsb3BtZW50IGNvbm5lY3Rpb24gc3RyaW5nXG4gICAgICAgIHByb3h5VXJpID0gZ2V0UHJveHlVcmlGcm9tRGV2Q29ublN0cmluZyhjb25uZWN0aW9uU3RyaW5nKTtcbiAgICAgICAgY29ubmVjdGlvblN0cmluZyA9IERldmVsb3BtZW50Q29ubmVjdGlvblN0cmluZztcbiAgICB9XG4gICAgLy8gTWF0Y2hpbmcgQmxvYkVuZHBvaW50IGluIHRoZSBBY2NvdW50IGNvbm5lY3Rpb24gc3RyaW5nXG4gICAgbGV0IGJsb2JFbmRwb2ludCA9IGdldFZhbHVlSW5Db25uU3RyaW5nKGNvbm5lY3Rpb25TdHJpbmcsIFwiQmxvYkVuZHBvaW50XCIpO1xuICAgIC8vIFNsaWNpbmcgb2ZmICcvJyBhdCB0aGUgZW5kIGlmIGV4aXN0c1xuICAgIC8vIChUaGUgbWV0aG9kcyB0aGF0IHVzZSBgZXh0cmFjdENvbm5lY3Rpb25TdHJpbmdQYXJ0c2AgZXhwZWN0IHRoZSB1cmwgdG8gbm90IGhhdmUgYC9gIGF0IHRoZSBlbmQpXG4gICAgYmxvYkVuZHBvaW50ID0gYmxvYkVuZHBvaW50LmVuZHNXaXRoKFwiL1wiKSA/IGJsb2JFbmRwb2ludC5zbGljZSgwLCAtMSkgOiBibG9iRW5kcG9pbnQ7XG4gICAgaWYgKGNvbm5lY3Rpb25TdHJpbmcuc2VhcmNoKFwiRGVmYXVsdEVuZHBvaW50c1Byb3RvY29sPVwiKSAhPT0gLTEgJiZcbiAgICAgICAgY29ubmVjdGlvblN0cmluZy5zZWFyY2goXCJBY2NvdW50S2V5PVwiKSAhPT0gLTEpIHtcbiAgICAgICAgLy8gQWNjb3VudCBjb25uZWN0aW9uIHN0cmluZ1xuICAgICAgICBsZXQgZGVmYXVsdEVuZHBvaW50c1Byb3RvY29sID0gXCJcIjtcbiAgICAgICAgbGV0IGFjY291bnROYW1lID0gXCJcIjtcbiAgICAgICAgbGV0IGFjY291bnRLZXkgPSBCdWZmZXIuZnJvbShcImFjY291bnRLZXlcIiwgXCJiYXNlNjRcIik7XG4gICAgICAgIGxldCBlbmRwb2ludFN1ZmZpeCA9IFwiXCI7XG4gICAgICAgIC8vIEdldCBhY2NvdW50IG5hbWUgYW5kIGtleVxuICAgICAgICBhY2NvdW50TmFtZSA9IGdldFZhbHVlSW5Db25uU3RyaW5nKGNvbm5lY3Rpb25TdHJpbmcsIFwiQWNjb3VudE5hbWVcIik7XG4gICAgICAgIGFjY291bnRLZXkgPSBCdWZmZXIuZnJvbShnZXRWYWx1ZUluQ29ublN0cmluZyhjb25uZWN0aW9uU3RyaW5nLCBcIkFjY291bnRLZXlcIiksIFwiYmFzZTY0XCIpO1xuICAgICAgICBpZiAoIWJsb2JFbmRwb2ludCkge1xuICAgICAgICAgICAgLy8gQmxvYkVuZHBvaW50IGlzIG5vdCBwcmVzZW50IGluIHRoZSBBY2NvdW50IGNvbm5lY3Rpb24gc3RyaW5nXG4gICAgICAgICAgICAvLyBDYW4gYmUgb2J0YWluZWQgZnJvbSBgJHtkZWZhdWx0RW5kcG9pbnRzUHJvdG9jb2x9Oi8vJHthY2NvdW50TmFtZX0uYmxvYi4ke2VuZHBvaW50U3VmZml4fWBcbiAgICAgICAgICAgIGRlZmF1bHRFbmRwb2ludHNQcm90b2NvbCA9IGdldFZhbHVlSW5Db25uU3RyaW5nKGNvbm5lY3Rpb25TdHJpbmcsIFwiRGVmYXVsdEVuZHBvaW50c1Byb3RvY29sXCIpO1xuICAgICAgICAgICAgY29uc3QgcHJvdG9jb2wgPSBkZWZhdWx0RW5kcG9pbnRzUHJvdG9jb2wudG9Mb3dlckNhc2UoKTtcbiAgICAgICAgICAgIGlmIChwcm90b2NvbCAhPT0gXCJodHRwc1wiICYmIHByb3RvY29sICE9PSBcImh0dHBcIikge1xuICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihcIkludmFsaWQgRGVmYXVsdEVuZHBvaW50c1Byb3RvY29sIGluIHRoZSBwcm92aWRlZCBDb25uZWN0aW9uIFN0cmluZy4gRXhwZWN0aW5nICdodHRwcycgb3IgJ2h0dHAnXCIpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZW5kcG9pbnRTdWZmaXggPSBnZXRWYWx1ZUluQ29ublN0cmluZyhjb25uZWN0aW9uU3RyaW5nLCBcIkVuZHBvaW50U3VmZml4XCIpO1xuICAgICAgICAgICAgaWYgKCFlbmRwb2ludFN1ZmZpeCkge1xuICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihcIkludmFsaWQgRW5kcG9pbnRTdWZmaXggaW4gdGhlIHByb3ZpZGVkIENvbm5lY3Rpb24gU3RyaW5nXCIpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgYmxvYkVuZHBvaW50ID0gYCR7ZGVmYXVsdEVuZHBvaW50c1Byb3RvY29sfTovLyR7YWNjb3VudE5hbWV9LmJsb2IuJHtlbmRwb2ludFN1ZmZpeH1gO1xuICAgICAgICB9XG4gICAgICAgIGlmICghYWNjb3VudE5hbWUpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihcIkludmFsaWQgQWNjb3VudE5hbWUgaW4gdGhlIHByb3ZpZGVkIENvbm5lY3Rpb24gU3RyaW5nXCIpO1xuICAgICAgICB9XG4gICAgICAgIGVsc2UgaWYgKGFjY291bnRLZXkubGVuZ3RoID09PSAwKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJJbnZhbGlkIEFjY291bnRLZXkgaW4gdGhlIHByb3ZpZGVkIENvbm5lY3Rpb24gU3RyaW5nXCIpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICBraW5kOiBcIkFjY291bnRDb25uU3RyaW5nXCIsXG4gICAgICAgICAgICB1cmw6IGJsb2JFbmRwb2ludCxcbiAgICAgICAgICAgIGFjY291bnROYW1lLFxuICAgICAgICAgICAgYWNjb3VudEtleSxcbiAgICAgICAgICAgIHByb3h5VXJpLFxuICAgICAgICB9O1xuICAgIH1cbiAgICBlbHNlIHtcbiAgICAgICAgLy8gU0FTIGNvbm5lY3Rpb24gc3RyaW5nXG4gICAgICAgIGxldCBhY2NvdW50U2FzID0gZ2V0VmFsdWVJbkNvbm5TdHJpbmcoY29ubmVjdGlvblN0cmluZywgXCJTaGFyZWRBY2Nlc3NTaWduYXR1cmVcIik7XG4gICAgICAgIGxldCBhY2NvdW50TmFtZSA9IGdldFZhbHVlSW5Db25uU3RyaW5nKGNvbm5lY3Rpb25TdHJpbmcsIFwiQWNjb3VudE5hbWVcIik7XG4gICAgICAgIC8vIGlmIGFjY291bnROYW1lIGlzIGVtcHR5LCB0cnkgdG8gcmVhZCBpdCBmcm9tIEJsb2JFbmRwb2ludFxuICAgICAgICBpZiAoIWFjY291bnROYW1lKSB7XG4gICAgICAgICAgICBhY2NvdW50TmFtZSA9IGdldEFjY291bnROYW1lRnJvbVVybChibG9iRW5kcG9pbnQpO1xuICAgICAgICB9XG4gICAgICAgIGlmICghYmxvYkVuZHBvaW50KSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJJbnZhbGlkIEJsb2JFbmRwb2ludCBpbiB0aGUgcHJvdmlkZWQgU0FTIENvbm5lY3Rpb24gU3RyaW5nXCIpO1xuICAgICAgICB9XG4gICAgICAgIGVsc2UgaWYgKCFhY2NvdW50U2FzKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJJbnZhbGlkIFNoYXJlZEFjY2Vzc1NpZ25hdHVyZSBpbiB0aGUgcHJvdmlkZWQgU0FTIENvbm5lY3Rpb24gU3RyaW5nXCIpO1xuICAgICAgICB9XG4gICAgICAgIC8vIGNsaWVudCBjb25zdHJ1Y3RvcnMgYXNzdW1lIGFjY291bnRTYXMgZG9lcyAqbm90KiBzdGFydCB3aXRoID9cbiAgICAgICAgaWYgKGFjY291bnRTYXMuc3RhcnRzV2l0aChcIj9cIikpIHtcbiAgICAgICAgICAgIGFjY291bnRTYXMgPSBhY2NvdW50U2FzLnN1YnN0cmluZygxKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4geyBraW5kOiBcIlNBU0Nvbm5TdHJpbmdcIiwgdXJsOiBibG9iRW5kcG9pbnQsIGFjY291bnROYW1lLCBhY2NvdW50U2FzIH07XG4gICAgfVxufVxuLyoqXG4gKiBJbnRlcm5hbCBlc2NhcGUgbWV0aG9kIGltcGxlbWVudGVkIFN0cmF0ZWd5IFR3byBtZW50aW9uZWQgaW4gZXNjYXBlVVJMKCkgZGVzY3JpcHRpb24uXG4gKlxuICogQHBhcmFtIHRleHQgLVxuICovXG5mdW5jdGlvbiBlc2NhcGUodGV4dCkge1xuICAgIHJldHVybiBlbmNvZGVVUklDb21wb25lbnQodGV4dClcbiAgICAgICAgLnJlcGxhY2UoLyUyRi9nLCBcIi9cIikgLy8gRG9uJ3QgZXNjYXBlIGZvciBcIi9cIlxuICAgICAgICAucmVwbGFjZSgvJy9nLCBcIiUyN1wiKSAvLyBFc2NhcGUgZm9yIFwiJ1wiXG4gICAgICAgIC5yZXBsYWNlKC9cXCsvZywgXCIlMjBcIilcbiAgICAgICAgLnJlcGxhY2UoLyUyNS9nLCBcIiVcIik7IC8vIFJldmVydCBlbmNvZGVkIFwiJVwiXG59XG4vKipcbiAqIEFwcGVuZCBhIHN0cmluZyB0byBVUkwgcGF0aC4gV2lsbCByZW1vdmUgZHVwbGljYXRlZCBcIi9cIiBpbiBmcm9udCBvZiB0aGUgc3RyaW5nXG4gKiB3aGVuIFVSTCBwYXRoIGVuZHMgd2l0aCBhIFwiL1wiLlxuICpcbiAqIEBwYXJhbSB1cmwgLSBTb3VyY2UgVVJMIHN0cmluZ1xuICogQHBhcmFtIG5hbWUgLSBTdHJpbmcgdG8gYmUgYXBwZW5kZWQgdG8gVVJMXG4gKiBAcmV0dXJucyBBbiB1cGRhdGVkIFVSTCBzdHJpbmdcbiAqL1xuZnVuY3Rpb24gYXBwZW5kVG9VUkxQYXRoKHVybCwgbmFtZSkge1xuICAgIGNvbnN0IHVybFBhcnNlZCA9IG5ldyBVUkwodXJsKTtcbiAgICBsZXQgcGF0aCA9IHVybFBhcnNlZC5wYXRobmFtZTtcbiAgICBwYXRoID0gcGF0aCA/IChwYXRoLmVuZHNXaXRoKFwiL1wiKSA/IGAke3BhdGh9JHtuYW1lfWAgOiBgJHtwYXRofS8ke25hbWV9YCkgOiBuYW1lO1xuICAgIHVybFBhcnNlZC5wYXRobmFtZSA9IHBhdGg7XG4gICAgcmV0dXJuIHVybFBhcnNlZC50b1N0cmluZygpO1xufVxuLyoqXG4gKiBTZXQgVVJMIHBhcmFtZXRlciBuYW1lIGFuZCB2YWx1ZS4gSWYgbmFtZSBleGlzdHMgaW4gVVJMIHBhcmFtZXRlcnMsIG9sZCB2YWx1ZVxuICogd2lsbCBiZSByZXBsYWNlZCBieSBuYW1lIGtleS4gSWYgbm90IHByb3ZpZGUgdmFsdWUsIHRoZSBwYXJhbWV0ZXIgd2lsbCBiZSBkZWxldGVkLlxuICpcbiAqIEBwYXJhbSB1cmwgLSBTb3VyY2UgVVJMIHN0cmluZ1xuICogQHBhcmFtIG5hbWUgLSBQYXJhbWV0ZXIgbmFtZVxuICogQHBhcmFtIHZhbHVlIC0gUGFyYW1ldGVyIHZhbHVlXG4gKiBAcmV0dXJucyBBbiB1cGRhdGVkIFVSTCBzdHJpbmdcbiAqL1xuZnVuY3Rpb24gc2V0VVJMUGFyYW1ldGVyKHVybCwgbmFtZSwgdmFsdWUpIHtcbiAgICBjb25zdCB1cmxQYXJzZWQgPSBuZXcgVVJMKHVybCk7XG4gICAgY29uc3QgZW5jb2RlZE5hbWUgPSBlbmNvZGVVUklDb21wb25lbnQobmFtZSk7XG4gICAgY29uc3QgZW5jb2RlZFZhbHVlID0gdmFsdWUgPyBlbmNvZGVVUklDb21wb25lbnQodmFsdWUpIDogdW5kZWZpbmVkO1xuICAgIC8vIG11dGF0aW5nIHNlYXJjaFBhcmFtcyB3aWxsIGNoYW5nZSB0aGUgZW5jb2RpbmcsIHNvIHdlIGhhdmUgdG8gZG8gdGhpcyBvdXJzZWx2ZXNcbiAgICBjb25zdCBzZWFyY2hTdHJpbmcgPSB1cmxQYXJzZWQuc2VhcmNoID09PSBcIlwiID8gXCI/XCIgOiB1cmxQYXJzZWQuc2VhcmNoO1xuICAgIGNvbnN0IHNlYXJjaFBpZWNlcyA9IFtdO1xuICAgIGZvciAoY29uc3QgcGFpciBvZiBzZWFyY2hTdHJpbmcuc2xpY2UoMSkuc3BsaXQoXCImXCIpKSB7XG4gICAgICAgIGlmIChwYWlyKSB7XG4gICAgICAgICAgICBjb25zdCBba2V5XSA9IHBhaXIuc3BsaXQoXCI9XCIsIDIpO1xuICAgICAgICAgICAgaWYgKGtleSAhPT0gZW5jb2RlZE5hbWUpIHtcbiAgICAgICAgICAgICAgICBzZWFyY2hQaWVjZXMucHVzaChwYWlyKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cbiAgICBpZiAoZW5jb2RlZFZhbHVlKSB7XG4gICAgICAgIHNlYXJjaFBpZWNlcy5wdXNoKGAke2VuY29kZWROYW1lfT0ke2VuY29kZWRWYWx1ZX1gKTtcbiAgICB9XG4gICAgdXJsUGFyc2VkLnNlYXJjaCA9IHNlYXJjaFBpZWNlcy5sZW5ndGggPyBgPyR7c2VhcmNoUGllY2VzLmpvaW4oXCImXCIpfWAgOiBcIlwiO1xuICAgIHJldHVybiB1cmxQYXJzZWQudG9TdHJpbmcoKTtcbn1cbi8qKlxuICogR2V0IFVSTCBwYXJhbWV0ZXIgYnkgbmFtZS5cbiAqXG4gKiBAcGFyYW0gdXJsIC1cbiAqIEBwYXJhbSBuYW1lIC1cbiAqL1xuZnVuY3Rpb24gZ2V0VVJMUGFyYW1ldGVyKHVybCwgbmFtZSkge1xuICAgIHZhciBfYTtcbiAgICBjb25zdCB1cmxQYXJzZWQgPSBuZXcgVVJMKHVybCk7XG4gICAgcmV0dXJuIChfYSA9IHVybFBhcnNlZC5zZWFyY2hQYXJhbXMuZ2V0KG5hbWUpKSAhPT0gbnVsbCAmJiBfYSAhPT0gdm9pZCAwID8gX2EgOiB1bmRlZmluZWQ7XG59XG4vKipcbiAqIFNldCBVUkwgaG9zdC5cbiAqXG4gKiBAcGFyYW0gdXJsIC0gU291cmNlIFVSTCBzdHJpbmdcbiAqIEBwYXJhbSBob3N0IC0gTmV3IGhvc3Qgc3RyaW5nXG4gKiBAcmV0dXJucyBBbiB1cGRhdGVkIFVSTCBzdHJpbmdcbiAqL1xuZnVuY3Rpb24gc2V0VVJMSG9zdCh1cmwsIGhvc3QpIHtcbiAgICBjb25zdCB1cmxQYXJzZWQgPSBuZXcgVVJMKHVybCk7XG4gICAgdXJsUGFyc2VkLmhvc3RuYW1lID0gaG9zdDtcbiAgICByZXR1cm4gdXJsUGFyc2VkLnRvU3RyaW5nKCk7XG59XG4vKipcbiAqIEdldCBVUkwgcGF0aCBmcm9tIGFuIFVSTCBzdHJpbmcuXG4gKlxuICogQHBhcmFtIHVybCAtIFNvdXJjZSBVUkwgc3RyaW5nXG4gKi9cbmZ1bmN0aW9uIGdldFVSTFBhdGgodXJsKSB7XG4gICAgdHJ5IHtcbiAgICAgICAgY29uc3QgdXJsUGFyc2VkID0gbmV3IFVSTCh1cmwpO1xuICAgICAgICByZXR1cm4gdXJsUGFyc2VkLnBhdGhuYW1lO1xuICAgIH1cbiAgICBjYXRjaCAoZSkge1xuICAgICAgICByZXR1cm4gdW5kZWZpbmVkO1xuICAgIH1cbn1cbi8qKlxuICogR2V0IFVSTCBzY2hlbWUgZnJvbSBhbiBVUkwgc3RyaW5nLlxuICpcbiAqIEBwYXJhbSB1cmwgLSBTb3VyY2UgVVJMIHN0cmluZ1xuICovXG5mdW5jdGlvbiBnZXRVUkxTY2hlbWUodXJsKSB7XG4gICAgdHJ5IHtcbiAgICAgICAgY29uc3QgdXJsUGFyc2VkID0gbmV3IFVSTCh1cmwpO1xuICAgICAgICByZXR1cm4gdXJsUGFyc2VkLnByb3RvY29sLmVuZHNXaXRoKFwiOlwiKSA/IHVybFBhcnNlZC5wcm90b2NvbC5zbGljZSgwLCAtMSkgOiB1cmxQYXJzZWQucHJvdG9jb2w7XG4gICAgfVxuICAgIGNhdGNoIChlKSB7XG4gICAgICAgIHJldHVybiB1bmRlZmluZWQ7XG4gICAgfVxufVxuLyoqXG4gKiBHZXQgVVJMIHBhdGggYW5kIHF1ZXJ5IGZyb20gYW4gVVJMIHN0cmluZy5cbiAqXG4gKiBAcGFyYW0gdXJsIC0gU291cmNlIFVSTCBzdHJpbmdcbiAqL1xuZnVuY3Rpb24gZ2V0VVJMUGF0aEFuZFF1ZXJ5KHVybCkge1xuICAgIGNvbnN0IHVybFBhcnNlZCA9IG5ldyBVUkwodXJsKTtcbiAgICBjb25zdCBwYXRoU3RyaW5nID0gdXJsUGFyc2VkLnBhdGhuYW1lO1xuICAgIGlmICghcGF0aFN0cmluZykge1xuICAgICAgICB0aHJvdyBuZXcgUmFuZ2VFcnJvcihcIkludmFsaWQgdXJsIHdpdGhvdXQgdmFsaWQgcGF0aC5cIik7XG4gICAgfVxuICAgIGxldCBxdWVyeVN0cmluZyA9IHVybFBhcnNlZC5zZWFyY2ggfHwgXCJcIjtcbiAgICBxdWVyeVN0cmluZyA9IHF1ZXJ5U3RyaW5nLnRyaW0oKTtcbiAgICBpZiAocXVlcnlTdHJpbmcgIT09IFwiXCIpIHtcbiAgICAgICAgcXVlcnlTdHJpbmcgPSBxdWVyeVN0cmluZy5zdGFydHNXaXRoKFwiP1wiKSA/IHF1ZXJ5U3RyaW5nIDogYD8ke3F1ZXJ5U3RyaW5nfWA7IC8vIEVuc3VyZSBxdWVyeSBzdHJpbmcgc3RhcnQgd2l0aCAnPydcbiAgICB9XG4gICAgcmV0dXJuIGAke3BhdGhTdHJpbmd9JHtxdWVyeVN0cmluZ31gO1xufVxuLyoqXG4gKiBHZXQgVVJMIHF1ZXJ5IGtleSB2YWx1ZSBwYWlycyBmcm9tIGFuIFVSTCBzdHJpbmcuXG4gKlxuICogQHBhcmFtIHVybCAtXG4gKi9cbmZ1bmN0aW9uIGdldFVSTFF1ZXJpZXModXJsKSB7XG4gICAgbGV0IHF1ZXJ5U3RyaW5nID0gbmV3IFVSTCh1cmwpLnNlYXJjaDtcbiAgICBpZiAoIXF1ZXJ5U3RyaW5nKSB7XG4gICAgICAgIHJldHVybiB7fTtcbiAgICB9XG4gICAgcXVlcnlTdHJpbmcgPSBxdWVyeVN0cmluZy50cmltKCk7XG4gICAgcXVlcnlTdHJpbmcgPSBxdWVyeVN0cmluZy5zdGFydHNXaXRoKFwiP1wiKSA/IHF1ZXJ5U3RyaW5nLnN1YnN0cmluZygxKSA6IHF1ZXJ5U3RyaW5nO1xuICAgIGxldCBxdWVyeVN1YlN0cmluZ3MgPSBxdWVyeVN0cmluZy5zcGxpdChcIiZcIik7XG4gICAgcXVlcnlTdWJTdHJpbmdzID0gcXVlcnlTdWJTdHJpbmdzLmZpbHRlcigodmFsdWUpID0+IHtcbiAgICAgICAgY29uc3QgaW5kZXhPZkVxdWFsID0gdmFsdWUuaW5kZXhPZihcIj1cIik7XG4gICAgICAgIGNvbnN0IGxhc3RJbmRleE9mRXF1YWwgPSB2YWx1ZS5sYXN0SW5kZXhPZihcIj1cIik7XG4gICAgICAgIHJldHVybiAoaW5kZXhPZkVxdWFsID4gMCAmJiBpbmRleE9mRXF1YWwgPT09IGxhc3RJbmRleE9mRXF1YWwgJiYgbGFzdEluZGV4T2ZFcXVhbCA8IHZhbHVlLmxlbmd0aCAtIDEpO1xuICAgIH0pO1xuICAgIGNvbnN0IHF1ZXJpZXMgPSB7fTtcbiAgICBmb3IgKGNvbnN0IHF1ZXJ5U3ViU3RyaW5nIG9mIHF1ZXJ5U3ViU3RyaW5ncykge1xuICAgICAgICBjb25zdCBzcGxpdFJlc3VsdHMgPSBxdWVyeVN1YlN0cmluZy5zcGxpdChcIj1cIik7XG4gICAgICAgIGNvbnN0IGtleSA9IHNwbGl0UmVzdWx0c1swXTtcbiAgICAgICAgY29uc3QgdmFsdWUgPSBzcGxpdFJlc3VsdHNbMV07XG4gICAgICAgIHF1ZXJpZXNba2V5XSA9IHZhbHVlO1xuICAgIH1cbiAgICByZXR1cm4gcXVlcmllcztcbn1cbi8qKlxuICogQXBwZW5kIGEgc3RyaW5nIHRvIFVSTCBxdWVyeS5cbiAqXG4gKiBAcGFyYW0gdXJsIC0gU291cmNlIFVSTCBzdHJpbmcuXG4gKiBAcGFyYW0gcXVlcnlQYXJ0cyAtIFN0cmluZyB0byBiZSBhcHBlbmRlZCB0byB0aGUgVVJMIHF1ZXJ5LlxuICogQHJldHVybnMgQW4gdXBkYXRlZCBVUkwgc3RyaW5nLlxuICovXG5mdW5jdGlvbiBhcHBlbmRUb1VSTFF1ZXJ5KHVybCwgcXVlcnlQYXJ0cykge1xuICAgIGNvbnN0IHVybFBhcnNlZCA9IG5ldyBVUkwodXJsKTtcbiAgICBsZXQgcXVlcnkgPSB1cmxQYXJzZWQuc2VhcmNoO1xuICAgIGlmIChxdWVyeSkge1xuICAgICAgICBxdWVyeSArPSBcIiZcIiArIHF1ZXJ5UGFydHM7XG4gICAgfVxuICAgIGVsc2Uge1xuICAgICAgICBxdWVyeSA9IHF1ZXJ5UGFydHM7XG4gICAgfVxuICAgIHVybFBhcnNlZC5zZWFyY2ggPSBxdWVyeTtcbiAgICByZXR1cm4gdXJsUGFyc2VkLnRvU3RyaW5nKCk7XG59XG4vKipcbiAqIFJvdW5kcyBhIGRhdGUgb2ZmIHRvIHNlY29uZHMuXG4gKlxuICogQHBhcmFtIGRhdGUgLVxuICogQHBhcmFtIHdpdGhNaWxsaXNlY29uZHMgLSBJZiB0cnVlLCBZWVlZLU1NLUREVGhoOm1tOnNzLmZmZmZmZmZaIHdpbGwgYmUgcmV0dXJuZWQ7XG4gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElmIGZhbHNlLCBZWVlZLU1NLUREVGhoOm1tOnNzWiB3aWxsIGJlIHJldHVybmVkLlxuICogQHJldHVybnMgRGF0ZSBzdHJpbmcgaW4gSVNPODA2MSBmb3JtYXQsIHdpdGggb3Igd2l0aG91dCA3IG1pbGxpc2Vjb25kcyBjb21wb25lbnRcbiAqL1xuZnVuY3Rpb24gdHJ1bmNhdGVkSVNPODA2MURhdGUoZGF0ZSwgd2l0aE1pbGxpc2Vjb25kcyA9IHRydWUpIHtcbiAgICAvLyBEYXRlLnRvSVNPU3RyaW5nKCkgd2lsbCByZXR1cm4gbGlrZSBcIjIwMTgtMTAtMjlUMDY6MzQ6MzYuMTM5WlwiXG4gICAgY29uc3QgZGF0ZVN0cmluZyA9IGRhdGUudG9JU09TdHJpbmcoKTtcbiAgICByZXR1cm4gd2l0aE1pbGxpc2Vjb25kc1xuICAgICAgICA/IGRhdGVTdHJpbmcuc3Vic3RyaW5nKDAsIGRhdGVTdHJpbmcubGVuZ3RoIC0gMSkgKyBcIjAwMDBcIiArIFwiWlwiXG4gICAgICAgIDogZGF0ZVN0cmluZy5zdWJzdHJpbmcoMCwgZGF0ZVN0cmluZy5sZW5ndGggLSA1KSArIFwiWlwiO1xufVxuLyoqXG4gKiBCYXNlNjQgZW5jb2RlLlxuICpcbiAqIEBwYXJhbSBjb250ZW50IC1cbiAqL1xuZnVuY3Rpb24gYmFzZTY0ZW5jb2RlKGNvbnRlbnQpIHtcbiAgICByZXR1cm4gIWNvcmVVdGlsLmlzTm9kZSA/IGJ0b2EoY29udGVudCkgOiBCdWZmZXIuZnJvbShjb250ZW50KS50b1N0cmluZyhcImJhc2U2NFwiKTtcbn1cbi8qKlxuICogR2VuZXJhdGUgYSA2NCBieXRlcyBiYXNlNjQgYmxvY2sgSUQgc3RyaW5nLlxuICpcbiAqIEBwYXJhbSBibG9ja0luZGV4IC1cbiAqL1xuZnVuY3Rpb24gZ2VuZXJhdGVCbG9ja0lEKGJsb2NrSURQcmVmaXgsIGJsb2NrSW5kZXgpIHtcbiAgICAvLyBUbyBnZW5lcmF0ZSBhIDY0IGJ5dGVzIGJhc2U2NCBzdHJpbmcsIHNvdXJjZSBzdHJpbmcgc2hvdWxkIGJlIDQ4XG4gICAgY29uc3QgbWF4U291cmNlU3RyaW5nTGVuZ3RoID0gNDg7XG4gICAgLy8gQSBibG9iIGNhbiBoYXZlIGEgbWF4aW11bSBvZiAxMDAsMDAwIHVuY29tbWl0dGVkIGJsb2NrcyBhdCBhbnkgZ2l2ZW4gdGltZVxuICAgIGNvbnN0IG1heEJsb2NrSW5kZXhMZW5ndGggPSA2O1xuICAgIGNvbnN0IG1heEFsbG93ZWRCbG9ja0lEUHJlZml4TGVuZ3RoID0gbWF4U291cmNlU3RyaW5nTGVuZ3RoIC0gbWF4QmxvY2tJbmRleExlbmd0aDtcbiAgICBpZiAoYmxvY2tJRFByZWZpeC5sZW5ndGggPiBtYXhBbGxvd2VkQmxvY2tJRFByZWZpeExlbmd0aCkge1xuICAgICAgICBibG9ja0lEUHJlZml4ID0gYmxvY2tJRFByZWZpeC5zbGljZSgwLCBtYXhBbGxvd2VkQmxvY2tJRFByZWZpeExlbmd0aCk7XG4gICAgfVxuICAgIGNvbnN0IHJlcyA9IGJsb2NrSURQcmVmaXggK1xuICAgICAgICBwYWRTdGFydChibG9ja0luZGV4LnRvU3RyaW5nKCksIG1heFNvdXJjZVN0cmluZ0xlbmd0aCAtIGJsb2NrSURQcmVmaXgubGVuZ3RoLCBcIjBcIik7XG4gICAgcmV0dXJuIGJhc2U2NGVuY29kZShyZXMpO1xufVxuLyoqXG4gKiBEZWxheSBzcGVjaWZpZWQgdGltZSBpbnRlcnZhbC5cbiAqXG4gKiBAcGFyYW0gdGltZUluTXMgLVxuICogQHBhcmFtIGFib3J0ZXIgLVxuICogQHBhcmFtIGFib3J0RXJyb3IgLVxuICovXG5hc3luYyBmdW5jdGlvbiBkZWxheSh0aW1lSW5NcywgYWJvcnRlciwgYWJvcnRFcnJvcikge1xuICAgIHJldHVybiBuZXcgUHJvbWlzZSgocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XG4gICAgICAgIC8qIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBwcmVmZXItY29uc3QgKi9cbiAgICAgICAgbGV0IHRpbWVvdXQ7XG4gICAgICAgIGNvbnN0IGFib3J0SGFuZGxlciA9ICgpID0+IHtcbiAgICAgICAgICAgIGlmICh0aW1lb3V0ICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgICAgICBjbGVhclRpbWVvdXQodGltZW91dCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZWplY3QoYWJvcnRFcnJvcik7XG4gICAgICAgIH07XG4gICAgICAgIGNvbnN0IHJlc29sdmVIYW5kbGVyID0gKCkgPT4ge1xuICAgICAgICAgICAgaWYgKGFib3J0ZXIgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgICAgIGFib3J0ZXIucmVtb3ZlRXZlbnRMaXN0ZW5lcihcImFib3J0XCIsIGFib3J0SGFuZGxlcik7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXNvbHZlKCk7XG4gICAgICAgIH07XG4gICAgICAgIHRpbWVvdXQgPSBzZXRUaW1lb3V0KHJlc29sdmVIYW5kbGVyLCB0aW1lSW5Ncyk7XG4gICAgICAgIGlmIChhYm9ydGVyICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgIGFib3J0ZXIuYWRkRXZlbnRMaXN0ZW5lcihcImFib3J0XCIsIGFib3J0SGFuZGxlcik7XG4gICAgICAgIH1cbiAgICB9KTtcbn1cbi8qKlxuICogU3RyaW5nLnByb3RvdHlwZS5wYWRTdGFydCgpXG4gKlxuICogQHBhcmFtIGN1cnJlbnRTdHJpbmcgLVxuICogQHBhcmFtIHRhcmdldExlbmd0aCAtXG4gKiBAcGFyYW0gcGFkU3RyaW5nIC1cbiAqL1xuZnVuY3Rpb24gcGFkU3RhcnQoY3VycmVudFN0cmluZywgdGFyZ2V0TGVuZ3RoLCBwYWRTdHJpbmcgPSBcIiBcIikge1xuICAgIC8vIEB0cy1leHBlY3QtZXJyb3I6IFRTIGRvZXNuJ3Qga25vdyB0aGlzIGNvZGUgbmVlZHMgdG8gcnVuIGRvd25sZXZlbCBzb21ldGltZXNcbiAgICBpZiAoU3RyaW5nLnByb3RvdHlwZS5wYWRTdGFydCkge1xuICAgICAgICByZXR1cm4gY3VycmVudFN0cmluZy5wYWRTdGFydCh0YXJnZXRMZW5ndGgsIHBhZFN0cmluZyk7XG4gICAgfVxuICAgIHBhZFN0cmluZyA9IHBhZFN0cmluZyB8fCBcIiBcIjtcbiAgICBpZiAoY3VycmVudFN0cmluZy5sZW5ndGggPiB0YXJnZXRMZW5ndGgpIHtcbiAgICAgICAgcmV0dXJuIGN1cnJlbnRTdHJpbmc7XG4gICAgfVxuICAgIGVsc2Uge1xuICAgICAgICB0YXJnZXRMZW5ndGggPSB0YXJnZXRMZW5ndGggLSBjdXJyZW50U3RyaW5nLmxlbmd0aDtcbiAgICAgICAgaWYgKHRhcmdldExlbmd0aCA+IHBhZFN0cmluZy5sZW5ndGgpIHtcbiAgICAgICAgICAgIHBhZFN0cmluZyArPSBwYWRTdHJpbmcucmVwZWF0KHRhcmdldExlbmd0aCAvIHBhZFN0cmluZy5sZW5ndGgpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBwYWRTdHJpbmcuc2xpY2UoMCwgdGFyZ2V0TGVuZ3RoKSArIGN1cnJlbnRTdHJpbmc7XG4gICAgfVxufVxuLyoqXG4gKiBJZiB0d28gc3RyaW5ncyBhcmUgZXF1YWwgd2hlbiBjb21wYXJlZCBjYXNlIGluc2Vuc2l0aXZlLlxuICpcbiAqIEBwYXJhbSBzdHIxIC1cbiAqIEBwYXJhbSBzdHIyIC1cbiAqL1xuZnVuY3Rpb24gaUVxdWFsKHN0cjEsIHN0cjIpIHtcbiAgICByZXR1cm4gc3RyMS50b0xvY2FsZUxvd2VyQ2FzZSgpID09PSBzdHIyLnRvTG9jYWxlTG93ZXJDYXNlKCk7XG59XG4vKipcbiAqIEV4dHJhY3RzIGFjY291bnQgbmFtZSBmcm9tIHRoZSB1cmxcbiAqIEBwYXJhbSB1cmwgLSB1cmwgdG8gZXh0cmFjdCB0aGUgYWNjb3VudCBuYW1lIGZyb21cbiAqIEByZXR1cm5zIHdpdGggdGhlIGFjY291bnQgbmFtZVxuICovXG5mdW5jdGlvbiBnZXRBY2NvdW50TmFtZUZyb21VcmwodXJsKSB7XG4gICAgY29uc3QgcGFyc2VkVXJsID0gbmV3IFVSTCh1cmwpO1xuICAgIGxldCBhY2NvdW50TmFtZTtcbiAgICB0cnkge1xuICAgICAgICBpZiAocGFyc2VkVXJsLmhvc3RuYW1lLnNwbGl0KFwiLlwiKVsxXSA9PT0gXCJibG9iXCIpIHtcbiAgICAgICAgICAgIC8vIGAke2RlZmF1bHRFbmRwb2ludHNQcm90b2NvbH06Ly8ke2FjY291bnROYW1lfS5ibG9iLiR7ZW5kcG9pbnRTdWZmaXh9YDtcbiAgICAgICAgICAgIGFjY291bnROYW1lID0gcGFyc2VkVXJsLmhvc3RuYW1lLnNwbGl0KFwiLlwiKVswXTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIGlmIChpc0lwRW5kcG9pbnRTdHlsZShwYXJzZWRVcmwpKSB7XG4gICAgICAgICAgICAvLyBJUHY0L0lQdjYgYWRkcmVzcyBob3N0cy4uLiBFeGFtcGxlIC0gaHR0cDovLzE5Mi4wLjAuMTA6MTAwMDEvZGV2c3RvcmVhY2NvdW50MS9cbiAgICAgICAgICAgIC8vIFNpbmdsZSB3b3JkIGRvbWFpbiB3aXRob3V0IGEgW2RvdF0gaW4gdGhlIGVuZHBvaW50Li4uIEV4YW1wbGUgLSBodHRwOi8vbG9jYWxob3N0OjEwMDAxL2RldnN0b3JlYWNjb3VudDEvXG4gICAgICAgICAgICAvLyAuZ2V0UGF0aCgpIC0+IC9kZXZzdG9yZWFjY291bnQxL1xuICAgICAgICAgICAgYWNjb3VudE5hbWUgPSBwYXJzZWRVcmwucGF0aG5hbWUuc3BsaXQoXCIvXCIpWzFdO1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgLy8gQ3VzdG9tIGRvbWFpbiBjYXNlOiBcImh0dHBzOi8vY3VzdG9tZG9tYWluLmNvbS9jb250YWluZXJuYW1lL2Jsb2JcIi5cbiAgICAgICAgICAgIGFjY291bnROYW1lID0gXCJcIjtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gYWNjb3VudE5hbWU7XG4gICAgfVxuICAgIGNhdGNoIChlcnJvcikge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJVbmFibGUgdG8gZXh0cmFjdCBhY2NvdW50TmFtZSB3aXRoIHByb3ZpZGVkIGluZm9ybWF0aW9uLlwiKTtcbiAgICB9XG59XG5mdW5jdGlvbiBpc0lwRW5kcG9pbnRTdHlsZShwYXJzZWRVcmwpIHtcbiAgICBjb25zdCBob3N0ID0gcGFyc2VkVXJsLmhvc3Q7XG4gICAgLy8gQ2FzZSAxOiBJcHY2LCB1c2UgYSBicm9hZCByZWdleCB0byBmaW5kIG91dCBjYW5kaWRhdGVzIHdob3NlIGhvc3QgY29udGFpbnMgdHdvICc6Jy5cbiAgICAvLyBDYXNlIDI6IGxvY2FsaG9zdCg6cG9ydCkgb3IgaG9zdC5kb2NrZXIuaW50ZXJuYWwsIHVzZSBicm9hZCByZWdleCB0byBtYXRjaCBwb3J0IHBhcnQuXG4gICAgLy8gQ2FzZSAzOiBJcHY0LCB1c2UgYnJvYWQgcmVnZXggd2hpY2gganVzdCBjaGVjayBpZiBob3N0IGNvbnRhaW5zIElwdjQuXG4gICAgLy8gRm9yIHZhbGlkIGhvc3QgcGxlYXNlIHJlZmVyIHRvIGh0dHBzOi8vbWFuNy5vcmcvbGludXgvbWFuLXBhZ2VzL21hbjcvaG9zdG5hbWUuNy5odG1sLlxuICAgIHJldHVybiAoL14uKjouKjouKiR8Xihsb2NhbGhvc3R8aG9zdC5kb2NrZXIuaW50ZXJuYWwpKDpbMC05XSspPyR8XihcXGR8WzEtOV1cXGR8MVxcZFxcZHwyWzAtNF1cXGR8MjVbMC01XSkoXFwuKFxcZHxbMS05XVxcZHwxXFxkXFxkfDJbMC00XVxcZHwyNVswLTVdKSl7M30oOlswLTldKyk/JC8udGVzdChob3N0KSB8fFxuICAgICAgICAoQm9vbGVhbihwYXJzZWRVcmwucG9ydCkgJiYgUGF0aFN0eWxlUG9ydHMuaW5jbHVkZXMocGFyc2VkVXJsLnBvcnQpKSk7XG59XG4vKipcbiAqIENvbnZlcnQgVGFncyB0byBlbmNvZGVkIHN0cmluZy5cbiAqXG4gKiBAcGFyYW0gdGFncyAtXG4gKi9cbmZ1bmN0aW9uIHRvQmxvYlRhZ3NTdHJpbmcodGFncykge1xuICAgIGlmICh0YWdzID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICB9XG4gICAgY29uc3QgdGFnUGFpcnMgPSBbXTtcbiAgICBmb3IgKGNvbnN0IGtleSBpbiB0YWdzKSB7XG4gICAgICAgIGlmIChPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwodGFncywga2V5KSkge1xuICAgICAgICAgICAgY29uc3QgdmFsdWUgPSB0YWdzW2tleV07XG4gICAgICAgICAgICB0YWdQYWlycy5wdXNoKGAke2VuY29kZVVSSUNvbXBvbmVudChrZXkpfT0ke2VuY29kZVVSSUNvbXBvbmVudCh2YWx1ZSl9YCk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIHRhZ1BhaXJzLmpvaW4oXCImXCIpO1xufVxuLyoqXG4gKiBDb252ZXJ0IFRhZ3MgdHlwZSB0byBCbG9iVGFncy5cbiAqXG4gKiBAcGFyYW0gdGFncyAtXG4gKi9cbmZ1bmN0aW9uIHRvQmxvYlRhZ3ModGFncykge1xuICAgIGlmICh0YWdzID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICB9XG4gICAgY29uc3QgcmVzID0ge1xuICAgICAgICBibG9iVGFnU2V0OiBbXSxcbiAgICB9O1xuICAgIGZvciAoY29uc3Qga2V5IGluIHRhZ3MpIHtcbiAgICAgICAgaWYgKE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbCh0YWdzLCBrZXkpKSB7XG4gICAgICAgICAgICBjb25zdCB2YWx1ZSA9IHRhZ3Nba2V5XTtcbiAgICAgICAgICAgIHJlcy5ibG9iVGFnU2V0LnB1c2goe1xuICAgICAgICAgICAgICAgIGtleSxcbiAgICAgICAgICAgICAgICB2YWx1ZSxcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgfVxuICAgIHJldHVybiByZXM7XG59XG4vKipcbiAqIENvdmVydCBCbG9iVGFncyB0byBUYWdzIHR5cGUuXG4gKlxuICogQHBhcmFtIHRhZ3MgLVxuICovXG5mdW5jdGlvbiB0b1RhZ3ModGFncykge1xuICAgIGlmICh0YWdzID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICB9XG4gICAgY29uc3QgcmVzID0ge307XG4gICAgZm9yIChjb25zdCBibG9iVGFnIG9mIHRhZ3MuYmxvYlRhZ1NldCkge1xuICAgICAgICByZXNbYmxvYlRhZy5rZXldID0gYmxvYlRhZy52YWx1ZTtcbiAgICB9XG4gICAgcmV0dXJuIHJlcztcbn1cbi8qKlxuICogQ29udmVydCBCbG9iUXVlcnlUZXh0Q29uZmlndXJhdGlvbiB0byBRdWVyeVNlcmlhbGl6YXRpb24gdHlwZS5cbiAqXG4gKiBAcGFyYW0gdGV4dENvbmZpZ3VyYXRpb24gLVxuICovXG5mdW5jdGlvbiB0b1F1ZXJ5U2VyaWFsaXphdGlvbih0ZXh0Q29uZmlndXJhdGlvbikge1xuICAgIGlmICh0ZXh0Q29uZmlndXJhdGlvbiA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgIHJldHVybiB1bmRlZmluZWQ7XG4gICAgfVxuICAgIHN3aXRjaCAodGV4dENvbmZpZ3VyYXRpb24ua2luZCkge1xuICAgICAgICBjYXNlIFwiY3N2XCI6XG4gICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICAgIGZvcm1hdDoge1xuICAgICAgICAgICAgICAgICAgICB0eXBlOiBcImRlbGltaXRlZFwiLFxuICAgICAgICAgICAgICAgICAgICBkZWxpbWl0ZWRUZXh0Q29uZmlndXJhdGlvbjoge1xuICAgICAgICAgICAgICAgICAgICAgICAgY29sdW1uU2VwYXJhdG9yOiB0ZXh0Q29uZmlndXJhdGlvbi5jb2x1bW5TZXBhcmF0b3IgfHwgXCIsXCIsXG4gICAgICAgICAgICAgICAgICAgICAgICBmaWVsZFF1b3RlOiB0ZXh0Q29uZmlndXJhdGlvbi5maWVsZFF1b3RlIHx8IFwiXCIsXG4gICAgICAgICAgICAgICAgICAgICAgICByZWNvcmRTZXBhcmF0b3I6IHRleHRDb25maWd1cmF0aW9uLnJlY29yZFNlcGFyYXRvcixcbiAgICAgICAgICAgICAgICAgICAgICAgIGVzY2FwZUNoYXI6IHRleHRDb25maWd1cmF0aW9uLmVzY2FwZUNoYXJhY3RlciB8fCBcIlwiLFxuICAgICAgICAgICAgICAgICAgICAgICAgaGVhZGVyc1ByZXNlbnQ6IHRleHRDb25maWd1cmF0aW9uLmhhc0hlYWRlcnMgfHwgZmFsc2UsXG4gICAgICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIH07XG4gICAgICAgIGNhc2UgXCJqc29uXCI6XG4gICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICAgIGZvcm1hdDoge1xuICAgICAgICAgICAgICAgICAgICB0eXBlOiBcImpzb25cIixcbiAgICAgICAgICAgICAgICAgICAganNvblRleHRDb25maWd1cmF0aW9uOiB7XG4gICAgICAgICAgICAgICAgICAgICAgICByZWNvcmRTZXBhcmF0b3I6IHRleHRDb25maWd1cmF0aW9uLnJlY29yZFNlcGFyYXRvcixcbiAgICAgICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgfTtcbiAgICAgICAgY2FzZSBcImFycm93XCI6XG4gICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICAgIGZvcm1hdDoge1xuICAgICAgICAgICAgICAgICAgICB0eXBlOiBcImFycm93XCIsXG4gICAgICAgICAgICAgICAgICAgIGFycm93Q29uZmlndXJhdGlvbjoge1xuICAgICAgICAgICAgICAgICAgICAgICAgc2NoZW1hOiB0ZXh0Q29uZmlndXJhdGlvbi5zY2hlbWEsXG4gICAgICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIH07XG4gICAgICAgIGNhc2UgXCJwYXJxdWV0XCI6XG4gICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICAgIGZvcm1hdDoge1xuICAgICAgICAgICAgICAgICAgICB0eXBlOiBcInBhcnF1ZXRcIixcbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgfTtcbiAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICAgIHRocm93IEVycm9yKFwiSW52YWxpZCBCbG9iUXVlcnlUZXh0Q29uZmlndXJhdGlvbi5cIik7XG4gICAgfVxufVxuZnVuY3Rpb24gcGFyc2VPYmplY3RSZXBsaWNhdGlvblJlY29yZChvYmplY3RSZXBsaWNhdGlvblJlY29yZCkge1xuICAgIGlmICghb2JqZWN0UmVwbGljYXRpb25SZWNvcmQpIHtcbiAgICAgICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICB9XG4gICAgaWYgKFwicG9saWN5LWlkXCIgaW4gb2JqZWN0UmVwbGljYXRpb25SZWNvcmQpIHtcbiAgICAgICAgLy8gSWYgdGhlIGRpY3Rpb25hcnkgY29udGFpbnMgYSBrZXkgd2l0aCBwb2xpY3kgaWQsIHdlIGFyZSBub3QgcmVxdWlyZWQgdG8gZG8gYW55IHBhcnNpbmcgc2luY2VcbiAgICAgICAgLy8gdGhlIHBvbGljeSBpZCBzaG91bGQgYWxyZWFkeSBiZSBzdG9yZWQgaW4gdGhlIE9iamVjdFJlcGxpY2F0aW9uRGVzdGluYXRpb25Qb2xpY3lJZC5cbiAgICAgICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICB9XG4gICAgY29uc3Qgb3JQcm9wZXJ0aWVzID0gW107XG4gICAgZm9yIChjb25zdCBrZXkgaW4gb2JqZWN0UmVwbGljYXRpb25SZWNvcmQpIHtcbiAgICAgICAgY29uc3QgaWRzID0ga2V5LnNwbGl0KFwiX1wiKTtcbiAgICAgICAgY29uc3QgcG9saWN5UHJlZml4ID0gXCJvci1cIjtcbiAgICAgICAgaWYgKGlkc1swXS5zdGFydHNXaXRoKHBvbGljeVByZWZpeCkpIHtcbiAgICAgICAgICAgIGlkc1swXSA9IGlkc1swXS5zdWJzdHJpbmcocG9saWN5UHJlZml4Lmxlbmd0aCk7XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgcnVsZSA9IHtcbiAgICAgICAgICAgIHJ1bGVJZDogaWRzWzFdLFxuICAgICAgICAgICAgcmVwbGljYXRpb25TdGF0dXM6IG9iamVjdFJlcGxpY2F0aW9uUmVjb3JkW2tleV0sXG4gICAgICAgIH07XG4gICAgICAgIGNvbnN0IHBvbGljeUluZGV4ID0gb3JQcm9wZXJ0aWVzLmZpbmRJbmRleCgocG9saWN5KSA9PiBwb2xpY3kucG9saWN5SWQgPT09IGlkc1swXSk7XG4gICAgICAgIGlmIChwb2xpY3lJbmRleCA+IC0xKSB7XG4gICAgICAgICAgICBvclByb3BlcnRpZXNbcG9saWN5SW5kZXhdLnJ1bGVzLnB1c2gocnVsZSk7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICBvclByb3BlcnRpZXMucHVzaCh7XG4gICAgICAgICAgICAgICAgcG9saWN5SWQ6IGlkc1swXSxcbiAgICAgICAgICAgICAgICBydWxlczogW3J1bGVdLFxuICAgICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIG9yUHJvcGVydGllcztcbn1cbmZ1bmN0aW9uIGh0dHBBdXRob3JpemF0aW9uVG9TdHJpbmcoaHR0cEF1dGhvcml6YXRpb24pIHtcbiAgICByZXR1cm4gaHR0cEF1dGhvcml6YXRpb24gPyBodHRwQXV0aG9yaXphdGlvbi5zY2hlbWUgKyBcIiBcIiArIGh0dHBBdXRob3JpemF0aW9uLnZhbHVlIDogdW5kZWZpbmVkO1xufVxuZnVuY3Rpb24gQmxvYk5hbWVUb1N0cmluZyhuYW1lKSB7XG4gICAgaWYgKG5hbWUuZW5jb2RlZCkge1xuICAgICAgICByZXR1cm4gZGVjb2RlVVJJQ29tcG9uZW50KG5hbWUuY29udGVudCk7XG4gICAgfVxuICAgIGVsc2Uge1xuICAgICAgICByZXR1cm4gbmFtZS5jb250ZW50O1xuICAgIH1cbn1cbmZ1bmN0aW9uIENvbnZlcnRJbnRlcm5hbFJlc3BvbnNlT2ZMaXN0QmxvYkZsYXQoaW50ZXJuYWxSZXNwb25zZSkge1xuICAgIHJldHVybiBPYmplY3QuYXNzaWduKE9iamVjdC5hc3NpZ24oe30sIGludGVybmFsUmVzcG9uc2UpLCB7IHNlZ21lbnQ6IHtcbiAgICAgICAgICAgIGJsb2JJdGVtczogaW50ZXJuYWxSZXNwb25zZS5zZWdtZW50LmJsb2JJdGVtcy5tYXAoKGJsb2JJdGVtSW50ZXJhbCkgPT4ge1xuICAgICAgICAgICAgICAgIGNvbnN0IGJsb2JJdGVtID0gT2JqZWN0LmFzc2lnbihPYmplY3QuYXNzaWduKHt9LCBibG9iSXRlbUludGVyYWwpLCB7IG5hbWU6IEJsb2JOYW1lVG9TdHJpbmcoYmxvYkl0ZW1JbnRlcmFsLm5hbWUpIH0pO1xuICAgICAgICAgICAgICAgIHJldHVybiBibG9iSXRlbTtcbiAgICAgICAgICAgIH0pLFxuICAgICAgICB9IH0pO1xufVxuZnVuY3Rpb24gQ29udmVydEludGVybmFsUmVzcG9uc2VPZkxpc3RCbG9iSGllcmFyY2h5KGludGVybmFsUmVzcG9uc2UpIHtcbiAgICB2YXIgX2E7XG4gICAgcmV0dXJuIE9iamVjdC5hc3NpZ24oT2JqZWN0LmFzc2lnbih7fSwgaW50ZXJuYWxSZXNwb25zZSksIHsgc2VnbWVudDoge1xuICAgICAgICAgICAgYmxvYlByZWZpeGVzOiAoX2EgPSBpbnRlcm5hbFJlc3BvbnNlLnNlZ21lbnQuYmxvYlByZWZpeGVzKSA9PT0gbnVsbCB8fCBfYSA9PT0gdm9pZCAwID8gdm9pZCAwIDogX2EubWFwKChibG9iUHJlZml4SW50ZXJuYWwpID0+IHtcbiAgICAgICAgICAgICAgICBjb25zdCBibG9iUHJlZml4ID0gT2JqZWN0LmFzc2lnbihPYmplY3QuYXNzaWduKHt9LCBibG9iUHJlZml4SW50ZXJuYWwpLCB7IG5hbWU6IEJsb2JOYW1lVG9TdHJpbmcoYmxvYlByZWZpeEludGVybmFsLm5hbWUpIH0pO1xuICAgICAgICAgICAgICAgIHJldHVybiBibG9iUHJlZml4O1xuICAgICAgICAgICAgfSksXG4gICAgICAgICAgICBibG9iSXRlbXM6IGludGVybmFsUmVzcG9uc2Uuc2VnbWVudC5ibG9iSXRlbXMubWFwKChibG9iSXRlbUludGVyYWwpID0+IHtcbiAgICAgICAgICAgICAgICBjb25zdCBibG9iSXRlbSA9IE9iamVjdC5hc3NpZ24oT2JqZWN0LmFzc2lnbih7fSwgYmxvYkl0ZW1JbnRlcmFsKSwgeyBuYW1lOiBCbG9iTmFtZVRvU3RyaW5nKGJsb2JJdGVtSW50ZXJhbC5uYW1lKSB9KTtcbiAgICAgICAgICAgICAgICByZXR1cm4gYmxvYkl0ZW07XG4gICAgICAgICAgICB9KSxcbiAgICAgICAgfSB9KTtcbn1cbmZ1bmN0aW9uKiBFeHRyYWN0UGFnZVJhbmdlSW5mb0l0ZW1zKGdldFBhZ2VSYW5nZXNTZWdtZW50KSB7XG4gICAgbGV0IHBhZ2VSYW5nZSA9IFtdO1xuICAgIGxldCBjbGVhclJhbmdlID0gW107XG4gICAgaWYgKGdldFBhZ2VSYW5nZXNTZWdtZW50LnBhZ2VSYW5nZSlcbiAgICAgICAgcGFnZVJhbmdlID0gZ2V0UGFnZVJhbmdlc1NlZ21lbnQucGFnZVJhbmdlO1xuICAgIGlmIChnZXRQYWdlUmFuZ2VzU2VnbWVudC5jbGVhclJhbmdlKVxuICAgICAgICBjbGVhclJhbmdlID0gZ2V0UGFnZVJhbmdlc1NlZ21lbnQuY2xlYXJSYW5nZTtcbiAgICBsZXQgcGFnZVJhbmdlSW5kZXggPSAwO1xuICAgIGxldCBjbGVhclJhbmdlSW5kZXggPSAwO1xuICAgIHdoaWxlIChwYWdlUmFuZ2VJbmRleCA8IHBhZ2VSYW5nZS5sZW5ndGggJiYgY2xlYXJSYW5nZUluZGV4IDwgY2xlYXJSYW5nZS5sZW5ndGgpIHtcbiAgICAgICAgaWYgKHBhZ2VSYW5nZVtwYWdlUmFuZ2VJbmRleF0uc3RhcnQgPCBjbGVhclJhbmdlW2NsZWFyUmFuZ2VJbmRleF0uc3RhcnQpIHtcbiAgICAgICAgICAgIHlpZWxkIHtcbiAgICAgICAgICAgICAgICBzdGFydDogcGFnZVJhbmdlW3BhZ2VSYW5nZUluZGV4XS5zdGFydCxcbiAgICAgICAgICAgICAgICBlbmQ6IHBhZ2VSYW5nZVtwYWdlUmFuZ2VJbmRleF0uZW5kLFxuICAgICAgICAgICAgICAgIGlzQ2xlYXI6IGZhbHNlLFxuICAgICAgICAgICAgfTtcbiAgICAgICAgICAgICsrcGFnZVJhbmdlSW5kZXg7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICB5aWVsZCB7XG4gICAgICAgICAgICAgICAgc3RhcnQ6IGNsZWFyUmFuZ2VbY2xlYXJSYW5nZUluZGV4XS5zdGFydCxcbiAgICAgICAgICAgICAgICBlbmQ6IGNsZWFyUmFuZ2VbY2xlYXJSYW5nZUluZGV4XS5lbmQsXG4gICAgICAgICAgICAgICAgaXNDbGVhcjogdHJ1ZSxcbiAgICAgICAgICAgIH07XG4gICAgICAgICAgICArK2NsZWFyUmFuZ2VJbmRleDtcbiAgICAgICAgfVxuICAgIH1cbiAgICBmb3IgKDsgcGFnZVJhbmdlSW5kZXggPCBwYWdlUmFuZ2UubGVuZ3RoOyArK3BhZ2VSYW5nZUluZGV4KSB7XG4gICAgICAgIHlpZWxkIHtcbiAgICAgICAgICAgIHN0YXJ0OiBwYWdlUmFuZ2VbcGFnZVJhbmdlSW5kZXhdLnN0YXJ0LFxuICAgICAgICAgICAgZW5kOiBwYWdlUmFuZ2VbcGFnZVJhbmdlSW5kZXhdLmVuZCxcbiAgICAgICAgICAgIGlzQ2xlYXI6IGZhbHNlLFxuICAgICAgICB9O1xuICAgIH1cbiAgICBmb3IgKDsgY2xlYXJSYW5nZUluZGV4IDwgY2xlYXJSYW5nZS5sZW5ndGg7ICsrY2xlYXJSYW5nZUluZGV4KSB7XG4gICAgICAgIHlpZWxkIHtcbiAgICAgICAgICAgIHN0YXJ0OiBjbGVhclJhbmdlW2NsZWFyUmFuZ2VJbmRleF0uc3RhcnQsXG4gICAgICAgICAgICBlbmQ6IGNsZWFyUmFuZ2VbY2xlYXJSYW5nZUluZGV4XS5lbmQsXG4gICAgICAgICAgICBpc0NsZWFyOiB0cnVlLFxuICAgICAgICB9O1xuICAgIH1cbn1cbi8qKlxuICogRXNjYXBlIHRoZSBibG9iTmFtZSBidXQga2VlcCBwYXRoIHNlcGFyYXRvciAoJy8nKS5cbiAqL1xuZnVuY3Rpb24gRXNjYXBlUGF0aChibG9iTmFtZSkge1xuICAgIGNvbnN0IHNwbGl0ID0gYmxvYk5hbWUuc3BsaXQoXCIvXCIpO1xuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgc3BsaXQubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgc3BsaXRbaV0gPSBlbmNvZGVVUklDb21wb25lbnQoc3BsaXRbaV0pO1xuICAgIH1cbiAgICByZXR1cm4gc3BsaXQuam9pbihcIi9cIik7XG59XG4vKipcbiAqIEEgdHlwZXNhZmUgaGVscGVyIGZvciBlbnN1cmluZyB0aGF0IGEgZ2l2ZW4gcmVzcG9uc2Ugb2JqZWN0IGhhc1xuICogdGhlIG9yaWdpbmFsIF9yZXNwb25zZSBhdHRhY2hlZC5cbiAqIEBwYXJhbSByZXNwb25zZSAtIEEgcmVzcG9uc2Ugb2JqZWN0IGZyb20gY2FsbGluZyBhIGNsaWVudCBvcGVyYXRpb25cbiAqIEByZXR1cm5zIFRoZSBzYW1lIG9iamVjdCwgYnV0IHdpdGgga25vd24gX3Jlc3BvbnNlIHByb3BlcnR5XG4gKi9cbmZ1bmN0aW9uIGFzc2VydFJlc3BvbnNlKHJlc3BvbnNlKSB7XG4gICAgaWYgKGBfcmVzcG9uc2VgIGluIHJlc3BvbnNlKSB7XG4gICAgICAgIHJldHVybiByZXNwb25zZTtcbiAgICB9XG4gICAgdGhyb3cgbmV3IFR5cGVFcnJvcihgVW5leHBlY3RlZCByZXNwb25zZSBvYmplY3QgJHtyZXNwb25zZX1gKTtcbn1cblxuLy8gQ29weXJpZ2h0IChjKSBNaWNyb3NvZnQgQ29ycG9yYXRpb24uXG4vLyBMaWNlbnNlZCB1bmRlciB0aGUgTUlUIExpY2Vuc2UuXG4vKipcbiAqIFJldHJ5UG9saWN5IHR5cGVzLlxuICovXG5leHBvcnRzLlN0b3JhZ2VSZXRyeVBvbGljeVR5cGUgPSB2b2lkIDA7XG4oZnVuY3Rpb24gKFN0b3JhZ2VSZXRyeVBvbGljeVR5cGUpIHtcbiAgICAvKipcbiAgICAgKiBFeHBvbmVudGlhbCByZXRyeS4gUmV0cnkgdGltZSBkZWxheSBncm93cyBleHBvbmVudGlhbGx5LlxuICAgICAqL1xuICAgIFN0b3JhZ2VSZXRyeVBvbGljeVR5cGVbU3RvcmFnZVJldHJ5UG9saWN5VHlwZVtcIkVYUE9ORU5USUFMXCJdID0gMF0gPSBcIkVYUE9ORU5USUFMXCI7XG4gICAgLyoqXG4gICAgICogTGluZWFyIHJldHJ5LiBSZXRyeSB0aW1lIGRlbGF5IGdyb3dzIGxpbmVhcmx5LlxuICAgICAqL1xuICAgIFN0b3JhZ2VSZXRyeVBvbGljeVR5cGVbU3RvcmFnZVJldHJ5UG9saWN5VHlwZVtcIkZJWEVEXCJdID0gMV0gPSBcIkZJWEVEXCI7XG59KShleHBvcnRzLlN0b3JhZ2VSZXRyeVBvbGljeVR5cGUgfHwgKGV4cG9ydHMuU3RvcmFnZVJldHJ5UG9saWN5VHlwZSA9IHt9KSk7XG4vLyBEZWZhdWx0IHZhbHVlcyBvZiBTdG9yYWdlUmV0cnlPcHRpb25zXG5jb25zdCBERUZBVUxUX1JFVFJZX09QVElPTlMkMSA9IHtcbiAgICBtYXhSZXRyeURlbGF5SW5NczogMTIwICogMTAwMCxcbiAgICBtYXhUcmllczogNCxcbiAgICByZXRyeURlbGF5SW5NczogNCAqIDEwMDAsXG4gICAgcmV0cnlQb2xpY3lUeXBlOiBleHBvcnRzLlN0b3JhZ2VSZXRyeVBvbGljeVR5cGUuRVhQT05FTlRJQUwsXG4gICAgc2Vjb25kYXJ5SG9zdDogXCJcIixcbiAgICB0cnlUaW1lb3V0SW5NczogdW5kZWZpbmVkLCAvLyBVc2Ugc2VydmVyIHNpZGUgZGVmYXVsdCB0aW1lb3V0IHN0cmF0ZWd5XG59O1xuY29uc3QgUkVUUllfQUJPUlRfRVJST1IkMSA9IG5ldyBhYm9ydENvbnRyb2xsZXIuQWJvcnRFcnJvcihcIlRoZSBvcGVyYXRpb24gd2FzIGFib3J0ZWQuXCIpO1xuLyoqXG4gKiBSZXRyeSBwb2xpY3kgd2l0aCBleHBvbmVudGlhbCByZXRyeSBhbmQgbGluZWFyIHJldHJ5IGltcGxlbWVudGVkLlxuICovXG5jbGFzcyBTdG9yYWdlUmV0cnlQb2xpY3kgZXh0ZW5kcyBCYXNlUmVxdWVzdFBvbGljeSB7XG4gICAgLyoqXG4gICAgICogQ3JlYXRlcyBhbiBpbnN0YW5jZSBvZiBSZXRyeVBvbGljeS5cbiAgICAgKlxuICAgICAqIEBwYXJhbSBuZXh0UG9saWN5IC1cbiAgICAgKiBAcGFyYW0gb3B0aW9ucyAtXG4gICAgICogQHBhcmFtIHJldHJ5T3B0aW9ucyAtXG4gICAgICovXG4gICAgY29uc3RydWN0b3IobmV4dFBvbGljeSwgb3B0aW9ucywgcmV0cnlPcHRpb25zID0gREVGQVVMVF9SRVRSWV9PUFRJT05TJDEpIHtcbiAgICAgICAgc3VwZXIobmV4dFBvbGljeSwgb3B0aW9ucyk7XG4gICAgICAgIC8vIEluaXRpYWxpemUgcmV0cnkgb3B0aW9uc1xuICAgICAgICB0aGlzLnJldHJ5T3B0aW9ucyA9IHtcbiAgICAgICAgICAgIHJldHJ5UG9saWN5VHlwZTogcmV0cnlPcHRpb25zLnJldHJ5UG9saWN5VHlwZVxuICAgICAgICAgICAgICAgID8gcmV0cnlPcHRpb25zLnJldHJ5UG9saWN5VHlwZVxuICAgICAgICAgICAgICAgIDogREVGQVVMVF9SRVRSWV9PUFRJT05TJDEucmV0cnlQb2xpY3lUeXBlLFxuICAgICAgICAgICAgbWF4VHJpZXM6IHJldHJ5T3B0aW9ucy5tYXhUcmllcyAmJiByZXRyeU9wdGlvbnMubWF4VHJpZXMgPj0gMVxuICAgICAgICAgICAgICAgID8gTWF0aC5mbG9vcihyZXRyeU9wdGlvbnMubWF4VHJpZXMpXG4gICAgICAgICAgICAgICAgOiBERUZBVUxUX1JFVFJZX09QVElPTlMkMS5tYXhUcmllcyxcbiAgICAgICAgICAgIHRyeVRpbWVvdXRJbk1zOiByZXRyeU9wdGlvbnMudHJ5VGltZW91dEluTXMgJiYgcmV0cnlPcHRpb25zLnRyeVRpbWVvdXRJbk1zID49IDBcbiAgICAgICAgICAgICAgICA/IHJldHJ5T3B0aW9ucy50cnlUaW1lb3V0SW5Nc1xuICAgICAgICAgICAgICAgIDogREVGQVVMVF9SRVRSWV9PUFRJT05TJDEudHJ5VGltZW91dEluTXMsXG4gICAgICAgICAgICByZXRyeURlbGF5SW5NczogcmV0cnlPcHRpb25zLnJldHJ5RGVsYXlJbk1zICYmIHJldHJ5T3B0aW9ucy5yZXRyeURlbGF5SW5NcyA+PSAwXG4gICAgICAgICAgICAgICAgPyBNYXRoLm1pbihyZXRyeU9wdGlvbnMucmV0cnlEZWxheUluTXMsIHJldHJ5T3B0aW9ucy5tYXhSZXRyeURlbGF5SW5Nc1xuICAgICAgICAgICAgICAgICAgICA/IHJldHJ5T3B0aW9ucy5tYXhSZXRyeURlbGF5SW5Nc1xuICAgICAgICAgICAgICAgICAgICA6IERFRkFVTFRfUkVUUllfT1BUSU9OUyQxLm1heFJldHJ5RGVsYXlJbk1zKVxuICAgICAgICAgICAgICAgIDogREVGQVVMVF9SRVRSWV9PUFRJT05TJDEucmV0cnlEZWxheUluTXMsXG4gICAgICAgICAgICBtYXhSZXRyeURlbGF5SW5NczogcmV0cnlPcHRpb25zLm1heFJldHJ5RGVsYXlJbk1zICYmIHJldHJ5T3B0aW9ucy5tYXhSZXRyeURlbGF5SW5NcyA+PSAwXG4gICAgICAgICAgICAgICAgPyByZXRyeU9wdGlvbnMubWF4UmV0cnlEZWxheUluTXNcbiAgICAgICAgICAgICAgICA6IERFRkFVTFRfUkVUUllfT1BUSU9OUyQxLm1heFJldHJ5RGVsYXlJbk1zLFxuICAgICAgICAgICAgc2Vjb25kYXJ5SG9zdDogcmV0cnlPcHRpb25zLnNlY29uZGFyeUhvc3RcbiAgICAgICAgICAgICAgICA/IHJldHJ5T3B0aW9ucy5zZWNvbmRhcnlIb3N0XG4gICAgICAgICAgICAgICAgOiBERUZBVUxUX1JFVFJZX09QVElPTlMkMS5zZWNvbmRhcnlIb3N0LFxuICAgICAgICB9O1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBTZW5kcyByZXF1ZXN0LlxuICAgICAqXG4gICAgICogQHBhcmFtIHJlcXVlc3QgLVxuICAgICAqL1xuICAgIGFzeW5jIHNlbmRSZXF1ZXN0KHJlcXVlc3QpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuYXR0ZW1wdFNlbmRSZXF1ZXN0KHJlcXVlc3QsIGZhbHNlLCAxKTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogRGVjaWRlIGFuZCBwZXJmb3JtIG5leHQgcmV0cnkuIFdvbid0IG11dGF0ZSByZXF1ZXN0IHBhcmFtZXRlci5cbiAgICAgKlxuICAgICAqIEBwYXJhbSByZXF1ZXN0IC1cbiAgICAgKiBAcGFyYW0gc2Vjb25kYXJ5SGFzNDA0IC0gIElmIGF0dGVtcHQgd2FzIGFnYWluc3QgdGhlIHNlY29uZGFyeSAmIGl0IHJldHVybmVkIGEgU3RhdHVzTm90Rm91bmQgKDQwNCksIHRoZW5cbiAgICAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhlIHJlc291cmNlIHdhcyBub3QgZm91bmQuIFRoaXMgbWF5IGJlIGR1ZSB0byByZXBsaWNhdGlvbiBkZWxheS4gU28sIGluIHRoaXNcbiAgICAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSwgd2UnbGwgbmV2ZXIgdHJ5IHRoZSBzZWNvbmRhcnkgYWdhaW4gZm9yIHRoaXMgb3BlcmF0aW9uLlxuICAgICAqIEBwYXJhbSBhdHRlbXB0IC0gICAgICAgICAgIEhvdyBtYW55IHJldHJpZXMgaGFzIGJlZW4gYXR0ZW1wdGVkIHRvIHBlcmZvcm1lZCwgc3RhcnRpbmcgZnJvbSAxLCB3aGljaCBpbmNsdWRlc1xuICAgICAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGUgYXR0ZW1wdCB3aWxsIGJlIHBlcmZvcm1lZCBieSB0aGlzIG1ldGhvZCBjYWxsLlxuICAgICAqL1xuICAgIGFzeW5jIGF0dGVtcHRTZW5kUmVxdWVzdChyZXF1ZXN0LCBzZWNvbmRhcnlIYXM0MDQsIGF0dGVtcHQpIHtcbiAgICAgICAgY29uc3QgbmV3UmVxdWVzdCA9IHJlcXVlc3QuY2xvbmUoKTtcbiAgICAgICAgY29uc3QgaXNQcmltYXJ5UmV0cnkgPSBzZWNvbmRhcnlIYXM0MDQgfHxcbiAgICAgICAgICAgICF0aGlzLnJldHJ5T3B0aW9ucy5zZWNvbmRhcnlIb3N0IHx8XG4gICAgICAgICAgICAhKHJlcXVlc3QubWV0aG9kID09PSBcIkdFVFwiIHx8IHJlcXVlc3QubWV0aG9kID09PSBcIkhFQURcIiB8fCByZXF1ZXN0Lm1ldGhvZCA9PT0gXCJPUFRJT05TXCIpIHx8XG4gICAgICAgICAgICBhdHRlbXB0ICUgMiA9PT0gMTtcbiAgICAgICAgaWYgKCFpc1ByaW1hcnlSZXRyeSkge1xuICAgICAgICAgICAgbmV3UmVxdWVzdC51cmwgPSBzZXRVUkxIb3N0KG5ld1JlcXVlc3QudXJsLCB0aGlzLnJldHJ5T3B0aW9ucy5zZWNvbmRhcnlIb3N0KTtcbiAgICAgICAgfVxuICAgICAgICAvLyBTZXQgdGhlIHNlcnZlci1zaWRlIHRpbWVvdXQgcXVlcnkgcGFyYW1ldGVyIFwidGltZW91dD1bc2Vjb25kc11cIlxuICAgICAgICBpZiAodGhpcy5yZXRyeU9wdGlvbnMudHJ5VGltZW91dEluTXMpIHtcbiAgICAgICAgICAgIG5ld1JlcXVlc3QudXJsID0gc2V0VVJMUGFyYW1ldGVyKG5ld1JlcXVlc3QudXJsLCBVUkxDb25zdGFudHMuUGFyYW1ldGVycy5USU1FT1VULCBNYXRoLmZsb29yKHRoaXMucmV0cnlPcHRpb25zLnRyeVRpbWVvdXRJbk1zIC8gMTAwMCkudG9TdHJpbmcoKSk7XG4gICAgICAgIH1cbiAgICAgICAgbGV0IHJlc3BvbnNlO1xuICAgICAgICB0cnkge1xuICAgICAgICAgICAgbG9nZ2VyLmluZm8oYFJldHJ5UG9saWN5OiA9PT09PT4gVHJ5PSR7YXR0ZW1wdH0gJHtpc1ByaW1hcnlSZXRyeSA/IFwiUHJpbWFyeVwiIDogXCJTZWNvbmRhcnlcIn1gKTtcbiAgICAgICAgICAgIHJlc3BvbnNlID0gYXdhaXQgdGhpcy5fbmV4dFBvbGljeS5zZW5kUmVxdWVzdChuZXdSZXF1ZXN0KTtcbiAgICAgICAgICAgIGlmICghdGhpcy5zaG91bGRSZXRyeShpc1ByaW1hcnlSZXRyeSwgYXR0ZW1wdCwgcmVzcG9uc2UpKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHJlc3BvbnNlO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgc2Vjb25kYXJ5SGFzNDA0ID0gc2Vjb25kYXJ5SGFzNDA0IHx8ICghaXNQcmltYXJ5UmV0cnkgJiYgcmVzcG9uc2Uuc3RhdHVzID09PSA0MDQpO1xuICAgICAgICB9XG4gICAgICAgIGNhdGNoIChlcnIpIHtcbiAgICAgICAgICAgIGxvZ2dlci5lcnJvcihgUmV0cnlQb2xpY3k6IENhdWdodCBlcnJvciwgbWVzc2FnZTogJHtlcnIubWVzc2FnZX0sIGNvZGU6ICR7ZXJyLmNvZGV9YCk7XG4gICAgICAgICAgICBpZiAoIXRoaXMuc2hvdWxkUmV0cnkoaXNQcmltYXJ5UmV0cnksIGF0dGVtcHQsIHJlc3BvbnNlLCBlcnIpKSB7XG4gICAgICAgICAgICAgICAgdGhyb3cgZXJyO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGF3YWl0IHRoaXMuZGVsYXkoaXNQcmltYXJ5UmV0cnksIGF0dGVtcHQsIHJlcXVlc3QuYWJvcnRTaWduYWwpO1xuICAgICAgICByZXR1cm4gdGhpcy5hdHRlbXB0U2VuZFJlcXVlc3QocmVxdWVzdCwgc2Vjb25kYXJ5SGFzNDA0LCArK2F0dGVtcHQpO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBEZWNpZGUgd2hldGhlciB0byByZXRyeSBhY2NvcmRpbmcgdG8gbGFzdCBIVFRQIHJlc3BvbnNlIGFuZCByZXRyeSBjb3VudGVycy5cbiAgICAgKlxuICAgICAqIEBwYXJhbSBpc1ByaW1hcnlSZXRyeSAtXG4gICAgICogQHBhcmFtIGF0dGVtcHQgLVxuICAgICAqIEBwYXJhbSByZXNwb25zZSAtXG4gICAgICogQHBhcmFtIGVyciAtXG4gICAgICovXG4gICAgc2hvdWxkUmV0cnkoaXNQcmltYXJ5UmV0cnksIGF0dGVtcHQsIHJlc3BvbnNlLCBlcnIpIHtcbiAgICAgICAgaWYgKGF0dGVtcHQgPj0gdGhpcy5yZXRyeU9wdGlvbnMubWF4VHJpZXMpIHtcbiAgICAgICAgICAgIGxvZ2dlci5pbmZvKGBSZXRyeVBvbGljeTogQXR0ZW1wdChzKSAke2F0dGVtcHR9ID49IG1heFRyaWVzICR7dGhpcy5yZXRyeU9wdGlvbnNcbiAgICAgICAgICAgICAgICAubWF4VHJpZXN9LCBubyBmdXJ0aGVyIHRyeS5gKTtcbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgfVxuICAgICAgICAvLyBIYW5kbGUgbmV0d29yayBmYWlsdXJlcywgeW91IG1heSBuZWVkIHRvIGN1c3RvbWl6ZSB0aGUgbGlzdCB3aGVuIHlvdSBpbXBsZW1lbnRcbiAgICAgICAgLy8geW91ciBvd24gaHR0cCBjbGllbnRcbiAgICAgICAgY29uc3QgcmV0cmlhYmxlRXJyb3JzID0gW1xuICAgICAgICAgICAgXCJFVElNRURPVVRcIixcbiAgICAgICAgICAgIFwiRVNPQ0tFVFRJTUVET1VUXCIsXG4gICAgICAgICAgICBcIkVDT05OUkVGVVNFRFwiLFxuICAgICAgICAgICAgXCJFQ09OTlJFU0VUXCIsXG4gICAgICAgICAgICBcIkVOT0VOVFwiLFxuICAgICAgICAgICAgXCJFTk9URk9VTkRcIixcbiAgICAgICAgICAgIFwiVElNRU9VVFwiLFxuICAgICAgICAgICAgXCJFUElQRVwiLFxuICAgICAgICAgICAgXCJSRVFVRVNUX1NFTkRfRVJST1JcIiwgLy8gRm9yIGRlZmF1bHQgeGhyIGJhc2VkIGh0dHAgY2xpZW50IHByb3ZpZGVkIGluIG1zLXJlc3QtanNcbiAgICAgICAgXTtcbiAgICAgICAgaWYgKGVycikge1xuICAgICAgICAgICAgZm9yIChjb25zdCByZXRyaWFibGVFcnJvciBvZiByZXRyaWFibGVFcnJvcnMpIHtcbiAgICAgICAgICAgICAgICBpZiAoZXJyLm5hbWUudG9VcHBlckNhc2UoKS5pbmNsdWRlcyhyZXRyaWFibGVFcnJvcikgfHxcbiAgICAgICAgICAgICAgICAgICAgZXJyLm1lc3NhZ2UudG9VcHBlckNhc2UoKS5pbmNsdWRlcyhyZXRyaWFibGVFcnJvcikgfHxcbiAgICAgICAgICAgICAgICAgICAgKGVyci5jb2RlICYmIGVyci5jb2RlLnRvU3RyaW5nKCkudG9VcHBlckNhc2UoKSA9PT0gcmV0cmlhYmxlRXJyb3IpKSB7XG4gICAgICAgICAgICAgICAgICAgIGxvZ2dlci5pbmZvKGBSZXRyeVBvbGljeTogTmV0d29yayBlcnJvciAke3JldHJpYWJsZUVycm9yfSBmb3VuZCwgd2lsbCByZXRyeS5gKTtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIC8vIElmIGF0dGVtcHQgd2FzIGFnYWluc3QgdGhlIHNlY29uZGFyeSAmIGl0IHJldHVybmVkIGEgU3RhdHVzTm90Rm91bmQgKDQwNCksIHRoZW5cbiAgICAgICAgLy8gdGhlIHJlc291cmNlIHdhcyBub3QgZm91bmQuIFRoaXMgbWF5IGJlIGR1ZSB0byByZXBsaWNhdGlvbiBkZWxheS4gU28sIGluIHRoaXNcbiAgICAgICAgLy8gY2FzZSwgd2UnbGwgbmV2ZXIgdHJ5IHRoZSBzZWNvbmRhcnkgYWdhaW4gZm9yIHRoaXMgb3BlcmF0aW9uLlxuICAgICAgICBpZiAocmVzcG9uc2UgfHwgZXJyKSB7XG4gICAgICAgICAgICBjb25zdCBzdGF0dXNDb2RlID0gcmVzcG9uc2UgPyByZXNwb25zZS5zdGF0dXMgOiBlcnIgPyBlcnIuc3RhdHVzQ29kZSA6IDA7XG4gICAgICAgICAgICBpZiAoIWlzUHJpbWFyeVJldHJ5ICYmIHN0YXR1c0NvZGUgPT09IDQwNCkge1xuICAgICAgICAgICAgICAgIGxvZ2dlci5pbmZvKGBSZXRyeVBvbGljeTogU2Vjb25kYXJ5IGFjY2VzcyB3aXRoIDQwNCwgd2lsbCByZXRyeS5gKTtcbiAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIC8vIFNlcnZlciBpbnRlcm5hbCBlcnJvciBvciBzZXJ2ZXIgdGltZW91dFxuICAgICAgICAgICAgaWYgKHN0YXR1c0NvZGUgPT09IDUwMyB8fCBzdGF0dXNDb2RlID09PSA1MDApIHtcbiAgICAgICAgICAgICAgICBsb2dnZXIuaW5mbyhgUmV0cnlQb2xpY3k6IFdpbGwgcmV0cnkgZm9yIHN0YXR1cyBjb2RlICR7c3RhdHVzQ29kZX0uYCk7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgLy8gW0NvcHkgc291cmNlIGVycm9yIGNvZGVdIEZlYXR1cmUgaXMgcGVuZGluZyBvbiBzZXJ2aWNlIHNpZGUsIHNraXAgcmV0cnkgb24gY29weSBzb3VyY2UgZXJyb3IgZm9yIG5vdy5cbiAgICAgICAgLy8gaWYgKHJlc3BvbnNlKSB7XG4gICAgICAgIC8vICAgLy8gUmV0cnkgc2VsZWN0IENvcHkgU291cmNlIEVycm9yIENvZGVzLlxuICAgICAgICAvLyAgIGlmIChyZXNwb25zZT8uc3RhdHVzID49IDQwMCkge1xuICAgICAgICAvLyAgICAgY29uc3QgY29weVNvdXJjZUVycm9yID0gcmVzcG9uc2UuaGVhZGVycy5nZXQoSGVhZGVyQ29uc3RhbnRzLlhfTVNfQ29weVNvdXJjZUVycm9yQ29kZSk7XG4gICAgICAgIC8vICAgICBpZiAoY29weVNvdXJjZUVycm9yICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgLy8gICAgICAgc3dpdGNoIChjb3B5U291cmNlRXJyb3IpIHtcbiAgICAgICAgLy8gICAgICAgICBjYXNlIFwiSW50ZXJuYWxFcnJvclwiOlxuICAgICAgICAvLyAgICAgICAgIGNhc2UgXCJPcGVyYXRpb25UaW1lZE91dFwiOlxuICAgICAgICAvLyAgICAgICAgIGNhc2UgXCJTZXJ2ZXJCdXN5XCI6XG4gICAgICAgIC8vICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgLy8gICAgICAgfVxuICAgICAgICAvLyAgICAgfVxuICAgICAgICAvLyAgIH1cbiAgICAgICAgLy8gfVxuICAgICAgICBpZiAoKGVyciA9PT0gbnVsbCB8fCBlcnIgPT09IHZvaWQgMCA/IHZvaWQgMCA6IGVyci5jb2RlKSA9PT0gXCJQQVJTRV9FUlJPUlwiICYmIChlcnIgPT09IG51bGwgfHwgZXJyID09PSB2b2lkIDAgPyB2b2lkIDAgOiBlcnIubWVzc2FnZS5zdGFydHNXaXRoKGBFcnJvciBcIkVycm9yOiBVbmNsb3NlZCByb290IHRhZ2ApKSkge1xuICAgICAgICAgICAgbG9nZ2VyLmluZm8oXCJSZXRyeVBvbGljeTogSW5jb21wbGV0ZSBYTUwgcmVzcG9uc2UgbGlrZWx5IGR1ZSB0byBzZXJ2aWNlIHRpbWVvdXQsIHdpbGwgcmV0cnkuXCIpO1xuICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBEZWxheSBhIGNhbGN1bGF0ZWQgdGltZSBiZXR3ZWVuIHJldHJpZXMuXG4gICAgICpcbiAgICAgKiBAcGFyYW0gaXNQcmltYXJ5UmV0cnkgLVxuICAgICAqIEBwYXJhbSBhdHRlbXB0IC1cbiAgICAgKiBAcGFyYW0gYWJvcnRTaWduYWwgLVxuICAgICAqL1xuICAgIGFzeW5jIGRlbGF5KGlzUHJpbWFyeVJldHJ5LCBhdHRlbXB0LCBhYm9ydFNpZ25hbCkge1xuICAgICAgICBsZXQgZGVsYXlUaW1lSW5NcyA9IDA7XG4gICAgICAgIGlmIChpc1ByaW1hcnlSZXRyeSkge1xuICAgICAgICAgICAgc3dpdGNoICh0aGlzLnJldHJ5T3B0aW9ucy5yZXRyeVBvbGljeVR5cGUpIHtcbiAgICAgICAgICAgICAgICBjYXNlIGV4cG9ydHMuU3RvcmFnZVJldHJ5UG9saWN5VHlwZS5FWFBPTkVOVElBTDpcbiAgICAgICAgICAgICAgICAgICAgZGVsYXlUaW1lSW5NcyA9IE1hdGgubWluKChNYXRoLnBvdygyLCBhdHRlbXB0IC0gMSkgLSAxKSAqIHRoaXMucmV0cnlPcHRpb25zLnJldHJ5RGVsYXlJbk1zLCB0aGlzLnJldHJ5T3B0aW9ucy5tYXhSZXRyeURlbGF5SW5Ncyk7XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIGNhc2UgZXhwb3J0cy5TdG9yYWdlUmV0cnlQb2xpY3lUeXBlLkZJWEVEOlxuICAgICAgICAgICAgICAgICAgICBkZWxheVRpbWVJbk1zID0gdGhpcy5yZXRyeU9wdGlvbnMucmV0cnlEZWxheUluTXM7XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgZGVsYXlUaW1lSW5NcyA9IE1hdGgucmFuZG9tKCkgKiAxMDAwO1xuICAgICAgICB9XG4gICAgICAgIGxvZ2dlci5pbmZvKGBSZXRyeVBvbGljeTogRGVsYXkgZm9yICR7ZGVsYXlUaW1lSW5Nc31tc2ApO1xuICAgICAgICByZXR1cm4gZGVsYXkoZGVsYXlUaW1lSW5NcywgYWJvcnRTaWduYWwsIFJFVFJZX0FCT1JUX0VSUk9SJDEpO1xuICAgIH1cbn1cblxuLy8gQ29weXJpZ2h0IChjKSBNaWNyb3NvZnQgQ29ycG9yYXRpb24uXG4vLyBMaWNlbnNlZCB1bmRlciB0aGUgTUlUIExpY2Vuc2UuXG4vKipcbiAqIFN0b3JhZ2VSZXRyeVBvbGljeUZhY3RvcnkgaXMgYSBmYWN0b3J5IGNsYXNzIGhlbHBpbmcgZ2VuZXJhdGluZyB7QGxpbmsgU3RvcmFnZVJldHJ5UG9saWN5fSBvYmplY3RzLlxuICovXG5jbGFzcyBTdG9yYWdlUmV0cnlQb2xpY3lGYWN0b3J5IHtcbiAgICAvKipcbiAgICAgKiBDcmVhdGVzIGFuIGluc3RhbmNlIG9mIFN0b3JhZ2VSZXRyeVBvbGljeUZhY3RvcnkuXG4gICAgICogQHBhcmFtIHJldHJ5T3B0aW9ucyAtXG4gICAgICovXG4gICAgY29uc3RydWN0b3IocmV0cnlPcHRpb25zKSB7XG4gICAgICAgIHRoaXMucmV0cnlPcHRpb25zID0gcmV0cnlPcHRpb25zO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBDcmVhdGVzIGEgU3RvcmFnZVJldHJ5UG9saWN5IG9iamVjdC5cbiAgICAgKlxuICAgICAqIEBwYXJhbSBuZXh0UG9saWN5IC1cbiAgICAgKiBAcGFyYW0gb3B0aW9ucyAtXG4gICAgICovXG4gICAgY3JlYXRlKG5leHRQb2xpY3ksIG9wdGlvbnMpIHtcbiAgICAgICAgcmV0dXJuIG5ldyBTdG9yYWdlUmV0cnlQb2xpY3kobmV4dFBvbGljeSwgb3B0aW9ucywgdGhpcy5yZXRyeU9wdGlvbnMpO1xuICAgIH1cbn1cblxuLy8gQ29weXJpZ2h0IChjKSBNaWNyb3NvZnQgQ29ycG9yYXRpb24uXG4vLyBMaWNlbnNlZCB1bmRlciB0aGUgTUlUIExpY2Vuc2UuXG4vKipcbiAqIENyZWRlbnRpYWwgcG9saWN5IHVzZWQgdG8gc2lnbiBIVFRQKFMpIHJlcXVlc3RzIGJlZm9yZSBzZW5kaW5nLiBUaGlzIGlzIGFuXG4gKiBhYnN0cmFjdCBjbGFzcy5cbiAqL1xuY2xhc3MgQ3JlZGVudGlhbFBvbGljeSBleHRlbmRzIEJhc2VSZXF1ZXN0UG9saWN5IHtcbiAgICAvKipcbiAgICAgKiBTZW5kcyBvdXQgcmVxdWVzdC5cbiAgICAgKlxuICAgICAqIEBwYXJhbSByZXF1ZXN0IC1cbiAgICAgKi9cbiAgICBzZW5kUmVxdWVzdChyZXF1ZXN0KSB7XG4gICAgICAgIHJldHVybiB0aGlzLl9uZXh0UG9saWN5LnNlbmRSZXF1ZXN0KHRoaXMuc2lnblJlcXVlc3QocmVxdWVzdCkpO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBDaGlsZCBjbGFzc2VzIG11c3QgaW1wbGVtZW50IHRoaXMgbWV0aG9kIHdpdGggcmVxdWVzdCBzaWduaW5nLiBUaGlzIG1ldGhvZFxuICAgICAqIHdpbGwgYmUgZXhlY3V0ZWQgaW4ge0BsaW5rIHNlbmRSZXF1ZXN0fS5cbiAgICAgKlxuICAgICAqIEBwYXJhbSByZXF1ZXN0IC1cbiAgICAgKi9cbiAgICBzaWduUmVxdWVzdChyZXF1ZXN0KSB7XG4gICAgICAgIC8vIENoaWxkIGNsYXNzZXMgbXVzdCBvdmVycmlkZSB0aGlzIG1ldGhvZCB3aXRoIHJlcXVlc3Qgc2lnbmluZy4gVGhpcyBtZXRob2RcbiAgICAgICAgLy8gd2lsbCBiZSBleGVjdXRlZCBpbiBzZW5kUmVxdWVzdCgpLlxuICAgICAgICByZXR1cm4gcmVxdWVzdDtcbiAgICB9XG59XG5cbi8vIENvcHlyaWdodCAoYykgTWljcm9zb2Z0IENvcnBvcmF0aW9uLlxuLy8gTGljZW5zZWQgdW5kZXIgdGhlIE1JVCBMaWNlbnNlLlxuLypcbiAqIFdlIG5lZWQgdG8gaW1pdGF0ZSAuTmV0IGN1bHR1cmUtYXdhcmUgc29ydGluZywgd2hpY2ggaXMgdXNlZCBpbiBzdG9yYWdlIHNlcnZpY2UuXG4gKiBCZWxvdyB0YWJsZXMgY29udGFpbiBzb3J0LWtleXMgZm9yIGVuLVVTIGN1bHR1cmUuXG4gKi9cbmNvbnN0IHRhYmxlX2x2MCA9IG5ldyBVaW50MzJBcnJheShbXG4gICAgMHgwLCAweDAsIDB4MCwgMHgwLCAweDAsIDB4MCwgMHgwLCAweDAsIDB4MCwgMHgwLCAweDAsIDB4MCwgMHgwLCAweDAsIDB4MCwgMHgwLCAweDAsIDB4MCwgMHgwLFxuICAgIDB4MCwgMHgwLCAweDAsIDB4MCwgMHgwLCAweDAsIDB4MCwgMHgwLCAweDAsIDB4MCwgMHgwLCAweDAsIDB4MCwgMHgwLCAweDcxYywgMHgwLCAweDcxZiwgMHg3MjEsXG4gICAgMHg3MjMsIDB4NzI1LCAweDAsIDB4MCwgMHgwLCAweDcyZCwgMHg4MDMsIDB4MCwgMHgwLCAweDczMywgMHgwLCAweGQwMywgMHhkMWEsIDB4ZDFjLCAweGQxZSxcbiAgICAweGQyMCwgMHhkMjIsIDB4ZDI0LCAweGQyNiwgMHhkMjgsIDB4ZDJhLCAweDAsIDB4MCwgMHgwLCAweDAsIDB4MCwgMHgwLCAweDAsIDB4ZTAyLCAweGUwOSwgMHhlMGEsXG4gICAgMHhlMWEsIDB4ZTIxLCAweGUyMywgMHhlMjUsIDB4ZTJjLCAweGUzMiwgMHhlMzUsIDB4ZTM2LCAweGU0OCwgMHhlNTEsIDB4ZTcwLCAweGU3YywgMHhlN2UsIDB4ZTg5LFxuICAgIDB4ZThhLCAweGU5MSwgMHhlOTksIDB4ZTlmLCAweGVhMiwgMHhlYTQsIDB4ZWE2LCAweGVhNywgMHhlYTksIDB4MCwgMHgwLCAweDAsIDB4NzQzLCAweDc0NCwgMHg3NDgsXG4gICAgMHhlMDIsIDB4ZTA5LCAweGUwYSwgMHhlMWEsIDB4ZTIxLCAweGUyMywgMHhlMjUsIDB4ZTJjLCAweGUzMiwgMHhlMzUsIDB4ZTM2LCAweGU0OCwgMHhlNTEsIDB4ZTcwLFxuICAgIDB4ZTdjLCAweGU3ZSwgMHhlODksIDB4ZThhLCAweGU5MSwgMHhlOTksIDB4ZTlmLCAweGVhMiwgMHhlYTQsIDB4ZWE2LCAweGVhNywgMHhlYTksIDB4MCwgMHg3NGMsXG4gICAgMHgwLCAweDc1MCwgMHgwLFxuXSk7XG5jb25zdCB0YWJsZV9sdjIgPSBuZXcgVWludDMyQXJyYXkoW1xuICAgIDB4MCwgMHgwLCAweDAsIDB4MCwgMHgwLCAweDAsIDB4MCwgMHgwLCAweDAsIDB4MCwgMHgwLCAweDAsIDB4MCwgMHgwLCAweDAsIDB4MCwgMHgwLCAweDAsIDB4MCxcbiAgICAweDAsIDB4MCwgMHgwLCAweDAsIDB4MCwgMHgwLCAweDAsIDB4MCwgMHgwLCAweDAsIDB4MCwgMHgwLCAweDAsIDB4MCwgMHgwLCAweDAsIDB4MCwgMHgwLCAweDAsXG4gICAgMHgwLCAweDAsIDB4MCwgMHgwLCAweDAsIDB4MCwgMHgwLCAweDAsIDB4MCwgMHgwLCAweDAsIDB4MCwgMHgwLCAweDAsIDB4MCwgMHgwLCAweDAsIDB4MCwgMHgwLFxuICAgIDB4MCwgMHgwLCAweDAsIDB4MCwgMHgwLCAweDAsIDB4MCwgMHgwLCAweDEyLCAweDEyLCAweDEyLCAweDEyLCAweDEyLCAweDEyLCAweDEyLCAweDEyLCAweDEyLFxuICAgIDB4MTIsIDB4MTIsIDB4MTIsIDB4MTIsIDB4MTIsIDB4MTIsIDB4MTIsIDB4MTIsIDB4MTIsIDB4MTIsIDB4MTIsIDB4MTIsIDB4MTIsIDB4MTIsIDB4MTIsIDB4MTIsXG4gICAgMHgxMiwgMHgwLCAweDAsIDB4MCwgMHgwLCAweDAsIDB4MCwgMHgwLCAweDAsIDB4MCwgMHgwLCAweDAsIDB4MCwgMHgwLCAweDAsIDB4MCwgMHgwLCAweDAsIDB4MCxcbiAgICAweDAsIDB4MCwgMHgwLCAweDAsIDB4MCwgMHgwLCAweDAsIDB4MCwgMHgwLCAweDAsIDB4MCwgMHgwLCAweDAsIDB4MCwgMHgwLCAweDAsIDB4MCwgMHgwLCAweDAsXG5dKTtcbmNvbnN0IHRhYmxlX2x2NCA9IG5ldyBVaW50MzJBcnJheShbXG4gICAgMHgwLCAweDAsIDB4MCwgMHgwLCAweDAsIDB4MCwgMHgwLCAweDAsIDB4MCwgMHgwLCAweDAsIDB4MCwgMHgwLCAweDAsIDB4MCwgMHgwLCAweDAsIDB4MCwgMHgwLFxuICAgIDB4MCwgMHgwLCAweDAsIDB4MCwgMHgwLCAweDAsIDB4MCwgMHgwLCAweDAsIDB4MCwgMHgwLCAweDAsIDB4MCwgMHgwLCAweDAsIDB4MCwgMHgwLCAweDAsIDB4MCxcbiAgICAweDAsIDB4ODAxMiwgMHgwLCAweDAsIDB4MCwgMHgwLCAweDAsIDB4ODIxMiwgMHgwLCAweDAsIDB4MCwgMHgwLCAweDAsIDB4MCwgMHgwLCAweDAsIDB4MCwgMHgwLFxuICAgIDB4MCwgMHgwLCAweDAsIDB4MCwgMHgwLCAweDAsIDB4MCwgMHgwLCAweDAsIDB4MCwgMHgwLCAweDAsIDB4MCwgMHgwLCAweDAsIDB4MCwgMHgwLCAweDAsIDB4MCxcbiAgICAweDAsIDB4MCwgMHgwLCAweDAsIDB4MCwgMHgwLCAweDAsIDB4MCwgMHgwLCAweDAsIDB4MCwgMHgwLCAweDAsIDB4MCwgMHgwLCAweDAsIDB4MCwgMHgwLCAweDAsXG4gICAgMHgwLCAweDAsIDB4MCwgMHgwLCAweDAsIDB4MCwgMHgwLCAweDAsIDB4MCwgMHgwLCAweDAsIDB4MCwgMHgwLCAweDAsIDB4MCwgMHgwLCAweDAsIDB4MCwgMHgwLFxuICAgIDB4MCwgMHgwLCAweDAsIDB4MCwgMHgwLCAweDAsIDB4MCwgMHgwLCAweDAsIDB4MCwgMHgwLCAweDAsIDB4MCwgMHgwLCAweDAsXG5dKTtcbmZ1bmN0aW9uIGNvbXBhcmVIZWFkZXIobGhzLCByaHMpIHtcbiAgICBpZiAoaXNMZXNzVGhhbihsaHMsIHJocykpXG4gICAgICAgIHJldHVybiAtMTtcbiAgICByZXR1cm4gMTtcbn1cbmZ1bmN0aW9uIGlzTGVzc1RoYW4obGhzLCByaHMpIHtcbiAgICBjb25zdCB0YWJsZXMgPSBbdGFibGVfbHYwLCB0YWJsZV9sdjIsIHRhYmxlX2x2NF07XG4gICAgbGV0IGN1cnJfbGV2ZWwgPSAwO1xuICAgIGxldCBpID0gMDtcbiAgICBsZXQgaiA9IDA7XG4gICAgd2hpbGUgKGN1cnJfbGV2ZWwgPCB0YWJsZXMubGVuZ3RoKSB7XG4gICAgICAgIGlmIChjdXJyX2xldmVsID09PSB0YWJsZXMubGVuZ3RoIC0gMSAmJiBpICE9PSBqKSB7XG4gICAgICAgICAgICByZXR1cm4gaSA+IGo7XG4gICAgICAgIH1cbiAgICAgICAgY29uc3Qgd2VpZ2h0MSA9IGkgPCBsaHMubGVuZ3RoID8gdGFibGVzW2N1cnJfbGV2ZWxdW2xoc1tpXS5jaGFyQ29kZUF0KDApXSA6IDB4MTtcbiAgICAgICAgY29uc3Qgd2VpZ2h0MiA9IGogPCByaHMubGVuZ3RoID8gdGFibGVzW2N1cnJfbGV2ZWxdW3Joc1tqXS5jaGFyQ29kZUF0KDApXSA6IDB4MTtcbiAgICAgICAgaWYgKHdlaWdodDEgPT09IDB4MSAmJiB3ZWlnaHQyID09PSAweDEpIHtcbiAgICAgICAgICAgIGkgPSAwO1xuICAgICAgICAgICAgaiA9IDA7XG4gICAgICAgICAgICArK2N1cnJfbGV2ZWw7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSBpZiAod2VpZ2h0MSA9PT0gd2VpZ2h0Mikge1xuICAgICAgICAgICAgKytpO1xuICAgICAgICAgICAgKytqO1xuICAgICAgICB9XG4gICAgICAgIGVsc2UgaWYgKHdlaWdodDEgPT09IDApIHtcbiAgICAgICAgICAgICsraTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIGlmICh3ZWlnaHQyID09PSAwKSB7XG4gICAgICAgICAgICArK2o7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICByZXR1cm4gd2VpZ2h0MSA8IHdlaWdodDI7XG4gICAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIGZhbHNlO1xufVxuXG4vLyBDb3B5cmlnaHQgKGMpIE1pY3Jvc29mdCBDb3Jwb3JhdGlvbi5cbi8vIExpY2Vuc2VkIHVuZGVyIHRoZSBNSVQgTGljZW5zZS5cbi8qKlxuICogU3RvcmFnZVNoYXJlZEtleUNyZWRlbnRpYWxQb2xpY3kgaXMgYSBwb2xpY3kgdXNlZCB0byBzaWduIEhUVFAgcmVxdWVzdCB3aXRoIGEgc2hhcmVkIGtleS5cbiAqL1xuY2xhc3MgU3RvcmFnZVNoYXJlZEtleUNyZWRlbnRpYWxQb2xpY3kgZXh0ZW5kcyBDcmVkZW50aWFsUG9saWN5IHtcbiAgICAvKipcbiAgICAgKiBDcmVhdGVzIGFuIGluc3RhbmNlIG9mIFN0b3JhZ2VTaGFyZWRLZXlDcmVkZW50aWFsUG9saWN5LlxuICAgICAqIEBwYXJhbSBuZXh0UG9saWN5IC1cbiAgICAgKiBAcGFyYW0gb3B0aW9ucyAtXG4gICAgICogQHBhcmFtIGZhY3RvcnkgLVxuICAgICAqL1xuICAgIGNvbnN0cnVjdG9yKG5leHRQb2xpY3ksIG9wdGlvbnMsIGZhY3RvcnkpIHtcbiAgICAgICAgc3VwZXIobmV4dFBvbGljeSwgb3B0aW9ucyk7XG4gICAgICAgIHRoaXMuZmFjdG9yeSA9IGZhY3Rvcnk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIFNpZ25zIHJlcXVlc3QuXG4gICAgICpcbiAgICAgKiBAcGFyYW0gcmVxdWVzdCAtXG4gICAgICovXG4gICAgc2lnblJlcXVlc3QocmVxdWVzdCkge1xuICAgICAgICByZXF1ZXN0LmhlYWRlcnMuc2V0KEhlYWRlckNvbnN0YW50cy5YX01TX0RBVEUsIG5ldyBEYXRlKCkudG9VVENTdHJpbmcoKSk7XG4gICAgICAgIGlmIChyZXF1ZXN0LmJvZHkgJiZcbiAgICAgICAgICAgICh0eXBlb2YgcmVxdWVzdC5ib2R5ID09PSBcInN0cmluZ1wiIHx8IHJlcXVlc3QuYm9keSAhPT0gdW5kZWZpbmVkKSAmJlxuICAgICAgICAgICAgcmVxdWVzdC5ib2R5Lmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgIHJlcXVlc3QuaGVhZGVycy5zZXQoSGVhZGVyQ29uc3RhbnRzLkNPTlRFTlRfTEVOR1RILCBCdWZmZXIuYnl0ZUxlbmd0aChyZXF1ZXN0LmJvZHkpKTtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBzdHJpbmdUb1NpZ24gPSBbXG4gICAgICAgICAgICByZXF1ZXN0Lm1ldGhvZC50b1VwcGVyQ2FzZSgpLFxuICAgICAgICAgICAgdGhpcy5nZXRIZWFkZXJWYWx1ZVRvU2lnbihyZXF1ZXN0LCBIZWFkZXJDb25zdGFudHMuQ09OVEVOVF9MQU5HVUFHRSksXG4gICAgICAgICAgICB0aGlzLmdldEhlYWRlclZhbHVlVG9TaWduKHJlcXVlc3QsIEhlYWRlckNvbnN0YW50cy5DT05URU5UX0VOQ09ESU5HKSxcbiAgICAgICAgICAgIHRoaXMuZ2V0SGVhZGVyVmFsdWVUb1NpZ24ocmVxdWVzdCwgSGVhZGVyQ29uc3RhbnRzLkNPTlRFTlRfTEVOR1RIKSxcbiAgICAgICAgICAgIHRoaXMuZ2V0SGVhZGVyVmFsdWVUb1NpZ24ocmVxdWVzdCwgSGVhZGVyQ29uc3RhbnRzLkNPTlRFTlRfTUQ1KSxcbiAgICAgICAgICAgIHRoaXMuZ2V0SGVhZGVyVmFsdWVUb1NpZ24ocmVxdWVzdCwgSGVhZGVyQ29uc3RhbnRzLkNPTlRFTlRfVFlQRSksXG4gICAgICAgICAgICB0aGlzLmdldEhlYWRlclZhbHVlVG9TaWduKHJlcXVlc3QsIEhlYWRlckNvbnN0YW50cy5EQVRFKSxcbiAgICAgICAgICAgIHRoaXMuZ2V0SGVhZGVyVmFsdWVUb1NpZ24ocmVxdWVzdCwgSGVhZGVyQ29uc3RhbnRzLklGX01PRElGSUVEX1NJTkNFKSxcbiAgICAgICAgICAgIHRoaXMuZ2V0SGVhZGVyVmFsdWVUb1NpZ24ocmVxdWVzdCwgSGVhZGVyQ29uc3RhbnRzLklGX01BVENIKSxcbiAgICAgICAgICAgIHRoaXMuZ2V0SGVhZGVyVmFsdWVUb1NpZ24ocmVxdWVzdCwgSGVhZGVyQ29uc3RhbnRzLklGX05PTkVfTUFUQ0gpLFxuICAgICAgICAgICAgdGhpcy5nZXRIZWFkZXJWYWx1ZVRvU2lnbihyZXF1ZXN0LCBIZWFkZXJDb25zdGFudHMuSUZfVU5NT0RJRklFRF9TSU5DRSksXG4gICAgICAgICAgICB0aGlzLmdldEhlYWRlclZhbHVlVG9TaWduKHJlcXVlc3QsIEhlYWRlckNvbnN0YW50cy5SQU5HRSksXG4gICAgICAgIF0uam9pbihcIlxcblwiKSArXG4gICAgICAgICAgICBcIlxcblwiICtcbiAgICAgICAgICAgIHRoaXMuZ2V0Q2Fub25pY2FsaXplZEhlYWRlcnNTdHJpbmcocmVxdWVzdCkgK1xuICAgICAgICAgICAgdGhpcy5nZXRDYW5vbmljYWxpemVkUmVzb3VyY2VTdHJpbmcocmVxdWVzdCk7XG4gICAgICAgIGNvbnN0IHNpZ25hdHVyZSA9IHRoaXMuZmFjdG9yeS5jb21wdXRlSE1BQ1NIQTI1NihzdHJpbmdUb1NpZ24pO1xuICAgICAgICByZXF1ZXN0LmhlYWRlcnMuc2V0KEhlYWRlckNvbnN0YW50cy5BVVRIT1JJWkFUSU9OLCBgU2hhcmVkS2V5ICR7dGhpcy5mYWN0b3J5LmFjY291bnROYW1lfToke3NpZ25hdHVyZX1gKTtcbiAgICAgICAgLy8gY29uc29sZS5sb2coYFtVUkxdOiR7cmVxdWVzdC51cmx9YCk7XG4gICAgICAgIC8vIGNvbnNvbGUubG9nKGBbSEVBREVSU106JHtyZXF1ZXN0LmhlYWRlcnMudG9TdHJpbmcoKX1gKTtcbiAgICAgICAgLy8gY29uc29sZS5sb2coYFtTVFJJTkcgVE8gU0lHTl06JHtKU09OLnN0cmluZ2lmeShzdHJpbmdUb1NpZ24pfWApO1xuICAgICAgICAvLyBjb25zb2xlLmxvZyhgW0tFWV06ICR7cmVxdWVzdC5oZWFkZXJzLmdldChIZWFkZXJDb25zdGFudHMuQVVUSE9SSVpBVElPTil9YCk7XG4gICAgICAgIHJldHVybiByZXF1ZXN0O1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBSZXRyaWV2ZSBoZWFkZXIgdmFsdWUgYWNjb3JkaW5nIHRvIHNoYXJlZCBrZXkgc2lnbiBydWxlcy5cbiAgICAgKiBAc2VlIGh0dHBzOi8vZG9jcy5taWNyb3NvZnQuY29tL2VuLXVzL3Jlc3QvYXBpL3N0b3JhZ2VzZXJ2aWNlcy9hdXRoZW50aWNhdGUtd2l0aC1zaGFyZWQta2V5XG4gICAgICpcbiAgICAgKiBAcGFyYW0gcmVxdWVzdCAtXG4gICAgICogQHBhcmFtIGhlYWRlck5hbWUgLVxuICAgICAqL1xuICAgIGdldEhlYWRlclZhbHVlVG9TaWduKHJlcXVlc3QsIGhlYWRlck5hbWUpIHtcbiAgICAgICAgY29uc3QgdmFsdWUgPSByZXF1ZXN0LmhlYWRlcnMuZ2V0KGhlYWRlck5hbWUpO1xuICAgICAgICBpZiAoIXZhbHVlKSB7XG4gICAgICAgICAgICByZXR1cm4gXCJcIjtcbiAgICAgICAgfVxuICAgICAgICAvLyBXaGVuIHVzaW5nIHZlcnNpb24gMjAxNS0wMi0yMSBvciBsYXRlciwgaWYgQ29udGVudC1MZW5ndGggaXMgemVybywgdGhlblxuICAgICAgICAvLyBzZXQgdGhlIENvbnRlbnQtTGVuZ3RoIHBhcnQgb2YgdGhlIFN0cmluZ1RvU2lnbiB0byBhbiBlbXB0eSBzdHJpbmcuXG4gICAgICAgIC8vIGh0dHBzOi8vZG9jcy5taWNyb3NvZnQuY29tL2VuLXVzL3Jlc3QvYXBpL3N0b3JhZ2VzZXJ2aWNlcy9hdXRoZW50aWNhdGUtd2l0aC1zaGFyZWQta2V5XG4gICAgICAgIGlmIChoZWFkZXJOYW1lID09PSBIZWFkZXJDb25zdGFudHMuQ09OVEVOVF9MRU5HVEggJiYgdmFsdWUgPT09IFwiMFwiKSB7XG4gICAgICAgICAgICByZXR1cm4gXCJcIjtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gdmFsdWU7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIFRvIGNvbnN0cnVjdCB0aGUgQ2Fub25pY2FsaXplZEhlYWRlcnMgcG9ydGlvbiBvZiB0aGUgc2lnbmF0dXJlIHN0cmluZywgZm9sbG93IHRoZXNlIHN0ZXBzOlxuICAgICAqIDEuIFJldHJpZXZlIGFsbCBoZWFkZXJzIGZvciB0aGUgcmVzb3VyY2UgdGhhdCBiZWdpbiB3aXRoIHgtbXMtLCBpbmNsdWRpbmcgdGhlIHgtbXMtZGF0ZSBoZWFkZXIuXG4gICAgICogMi4gQ29udmVydCBlYWNoIEhUVFAgaGVhZGVyIG5hbWUgdG8gbG93ZXJjYXNlLlxuICAgICAqIDMuIFNvcnQgdGhlIGhlYWRlcnMgbGV4aWNvZ3JhcGhpY2FsbHkgYnkgaGVhZGVyIG5hbWUsIGluIGFzY2VuZGluZyBvcmRlci5cbiAgICAgKiAgICBFYWNoIGhlYWRlciBtYXkgYXBwZWFyIG9ubHkgb25jZSBpbiB0aGUgc3RyaW5nLlxuICAgICAqIDQuIFJlcGxhY2UgYW55IGxpbmVhciB3aGl0ZXNwYWNlIGluIHRoZSBoZWFkZXIgdmFsdWUgd2l0aCBhIHNpbmdsZSBzcGFjZS5cbiAgICAgKiA1LiBUcmltIGFueSB3aGl0ZXNwYWNlIGFyb3VuZCB0aGUgY29sb24gaW4gdGhlIGhlYWRlci5cbiAgICAgKiA2LiBGaW5hbGx5LCBhcHBlbmQgYSBuZXctbGluZSBjaGFyYWN0ZXIgdG8gZWFjaCBjYW5vbmljYWxpemVkIGhlYWRlciBpbiB0aGUgcmVzdWx0aW5nIGxpc3QuXG4gICAgICogICAgQ29uc3RydWN0IHRoZSBDYW5vbmljYWxpemVkSGVhZGVycyBzdHJpbmcgYnkgY29uY2F0ZW5hdGluZyBhbGwgaGVhZGVycyBpbiB0aGlzIGxpc3QgaW50byBhIHNpbmdsZSBzdHJpbmcuXG4gICAgICpcbiAgICAgKiBAcGFyYW0gcmVxdWVzdCAtXG4gICAgICovXG4gICAgZ2V0Q2Fub25pY2FsaXplZEhlYWRlcnNTdHJpbmcocmVxdWVzdCkge1xuICAgICAgICBsZXQgaGVhZGVyc0FycmF5ID0gcmVxdWVzdC5oZWFkZXJzLmhlYWRlcnNBcnJheSgpLmZpbHRlcigodmFsdWUpID0+IHtcbiAgICAgICAgICAgIHJldHVybiB2YWx1ZS5uYW1lLnRvTG93ZXJDYXNlKCkuc3RhcnRzV2l0aChIZWFkZXJDb25zdGFudHMuUFJFRklYX0ZPUl9TVE9SQUdFKTtcbiAgICAgICAgfSk7XG4gICAgICAgIGhlYWRlcnNBcnJheS5zb3J0KChhLCBiKSA9PiB7XG4gICAgICAgICAgICByZXR1cm4gY29tcGFyZUhlYWRlcihhLm5hbWUudG9Mb3dlckNhc2UoKSwgYi5uYW1lLnRvTG93ZXJDYXNlKCkpO1xuICAgICAgICB9KTtcbiAgICAgICAgLy8gUmVtb3ZlIGR1cGxpY2F0ZSBoZWFkZXJzXG4gICAgICAgIGhlYWRlcnNBcnJheSA9IGhlYWRlcnNBcnJheS5maWx0ZXIoKHZhbHVlLCBpbmRleCwgYXJyYXkpID0+IHtcbiAgICAgICAgICAgIGlmIChpbmRleCA+IDAgJiYgdmFsdWUubmFtZS50b0xvd2VyQ2FzZSgpID09PSBhcnJheVtpbmRleCAtIDFdLm5hbWUudG9Mb3dlckNhc2UoKSkge1xuICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICB9KTtcbiAgICAgICAgbGV0IGNhbm9uaWNhbGl6ZWRIZWFkZXJzU3RyaW5nVG9TaWduID0gXCJcIjtcbiAgICAgICAgaGVhZGVyc0FycmF5LmZvckVhY2goKGhlYWRlcikgPT4ge1xuICAgICAgICAgICAgY2Fub25pY2FsaXplZEhlYWRlcnNTdHJpbmdUb1NpZ24gKz0gYCR7aGVhZGVyLm5hbWVcbiAgICAgICAgICAgICAgICAudG9Mb3dlckNhc2UoKVxuICAgICAgICAgICAgICAgIC50cmltUmlnaHQoKX06JHtoZWFkZXIudmFsdWUudHJpbUxlZnQoKX1cXG5gO1xuICAgICAgICB9KTtcbiAgICAgICAgcmV0dXJuIGNhbm9uaWNhbGl6ZWRIZWFkZXJzU3RyaW5nVG9TaWduO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBSZXRyaWV2ZXMgdGhlIHdlYlJlc291cmNlIGNhbm9uaWNhbGl6ZWQgcmVzb3VyY2Ugc3RyaW5nLlxuICAgICAqXG4gICAgICogQHBhcmFtIHJlcXVlc3QgLVxuICAgICAqL1xuICAgIGdldENhbm9uaWNhbGl6ZWRSZXNvdXJjZVN0cmluZyhyZXF1ZXN0KSB7XG4gICAgICAgIGNvbnN0IHBhdGggPSBnZXRVUkxQYXRoKHJlcXVlc3QudXJsKSB8fCBcIi9cIjtcbiAgICAgICAgbGV0IGNhbm9uaWNhbGl6ZWRSZXNvdXJjZVN0cmluZyA9IFwiXCI7XG4gICAgICAgIGNhbm9uaWNhbGl6ZWRSZXNvdXJjZVN0cmluZyArPSBgLyR7dGhpcy5mYWN0b3J5LmFjY291bnROYW1lfSR7cGF0aH1gO1xuICAgICAgICBjb25zdCBxdWVyaWVzID0gZ2V0VVJMUXVlcmllcyhyZXF1ZXN0LnVybCk7XG4gICAgICAgIGNvbnN0IGxvd2VyY2FzZVF1ZXJpZXMgPSB7fTtcbiAgICAgICAgaWYgKHF1ZXJpZXMpIHtcbiAgICAgICAgICAgIGNvbnN0IHF1ZXJ5S2V5cyA9IFtdO1xuICAgICAgICAgICAgZm9yIChjb25zdCBrZXkgaW4gcXVlcmllcykge1xuICAgICAgICAgICAgICAgIGlmIChPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwocXVlcmllcywga2V5KSkge1xuICAgICAgICAgICAgICAgICAgICBjb25zdCBsb3dlcmNhc2VLZXkgPSBrZXkudG9Mb3dlckNhc2UoKTtcbiAgICAgICAgICAgICAgICAgICAgbG93ZXJjYXNlUXVlcmllc1tsb3dlcmNhc2VLZXldID0gcXVlcmllc1trZXldO1xuICAgICAgICAgICAgICAgICAgICBxdWVyeUtleXMucHVzaChsb3dlcmNhc2VLZXkpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHF1ZXJ5S2V5cy5zb3J0KCk7XG4gICAgICAgICAgICBmb3IgKGNvbnN0IGtleSBvZiBxdWVyeUtleXMpIHtcbiAgICAgICAgICAgICAgICBjYW5vbmljYWxpemVkUmVzb3VyY2VTdHJpbmcgKz0gYFxcbiR7a2V5fToke2RlY29kZVVSSUNvbXBvbmVudChsb3dlcmNhc2VRdWVyaWVzW2tleV0pfWA7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGNhbm9uaWNhbGl6ZWRSZXNvdXJjZVN0cmluZztcbiAgICB9XG59XG5cbi8vIENvcHlyaWdodCAoYykgTWljcm9zb2Z0IENvcnBvcmF0aW9uLlxuLy8gTGljZW5zZWQgdW5kZXIgdGhlIE1JVCBMaWNlbnNlLlxuLyoqXG4gKiBDcmVkZW50aWFsIGlzIGFuIGFic3RyYWN0IGNsYXNzIGZvciBBenVyZSBTdG9yYWdlIEhUVFAgcmVxdWVzdHMgc2lnbmluZy4gVGhpc1xuICogY2xhc3Mgd2lsbCBob3N0IGFuIGNyZWRlbnRpYWxQb2xpY3lDcmVhdG9yIGZhY3Rvcnkgd2hpY2ggZ2VuZXJhdGVzIENyZWRlbnRpYWxQb2xpY3kuXG4gKi9cbmNsYXNzIENyZWRlbnRpYWwge1xuICAgIC8qKlxuICAgICAqIENyZWF0ZXMgYSBSZXF1ZXN0UG9saWN5IG9iamVjdC5cbiAgICAgKlxuICAgICAqIEBwYXJhbSBfbmV4dFBvbGljeSAtXG4gICAgICogQHBhcmFtIF9vcHRpb25zIC1cbiAgICAgKi9cbiAgICBjcmVhdGUoX25leHRQb2xpY3ksIF9vcHRpb25zKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihcIk1ldGhvZCBzaG91bGQgYmUgaW1wbGVtZW50ZWQgaW4gY2hpbGRyZW4gY2xhc3Nlcy5cIik7XG4gICAgfVxufVxuXG4vLyBDb3B5cmlnaHQgKGMpIE1pY3Jvc29mdCBDb3Jwb3JhdGlvbi5cbi8vIExpY2Vuc2VkIHVuZGVyIHRoZSBNSVQgTGljZW5zZS5cbi8qKlxuICogT05MWSBBVkFJTEFCTEUgSU4gTk9ERS5KUyBSVU5USU1FLlxuICpcbiAqIFN0b3JhZ2VTaGFyZWRLZXlDcmVkZW50aWFsIGZvciBhY2NvdW50IGtleSBhdXRob3JpemF0aW9uIG9mIEF6dXJlIFN0b3JhZ2Ugc2VydmljZS5cbiAqL1xuY2xhc3MgU3RvcmFnZVNoYXJlZEtleUNyZWRlbnRpYWwgZXh0ZW5kcyBDcmVkZW50aWFsIHtcbiAgICAvKipcbiAgICAgKiBDcmVhdGVzIGFuIGluc3RhbmNlIG9mIFN0b3JhZ2VTaGFyZWRLZXlDcmVkZW50aWFsLlxuICAgICAqIEBwYXJhbSBhY2NvdW50TmFtZSAtXG4gICAgICogQHBhcmFtIGFjY291bnRLZXkgLVxuICAgICAqL1xuICAgIGNvbnN0cnVjdG9yKGFjY291bnROYW1lLCBhY2NvdW50S2V5KSB7XG4gICAgICAgIHN1cGVyKCk7XG4gICAgICAgIHRoaXMuYWNjb3VudE5hbWUgPSBhY2NvdW50TmFtZTtcbiAgICAgICAgdGhpcy5hY2NvdW50S2V5ID0gQnVmZmVyLmZyb20oYWNjb3VudEtleSwgXCJiYXNlNjRcIik7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIENyZWF0ZXMgYSBTdG9yYWdlU2hhcmVkS2V5Q3JlZGVudGlhbFBvbGljeSBvYmplY3QuXG4gICAgICpcbiAgICAgKiBAcGFyYW0gbmV4dFBvbGljeSAtXG4gICAgICogQHBhcmFtIG9wdGlvbnMgLVxuICAgICAqL1xuICAgIGNyZWF0ZShuZXh0UG9saWN5LCBvcHRpb25zKSB7XG4gICAgICAgIHJldHVybiBuZXcgU3RvcmFnZVNoYXJlZEtleUNyZWRlbnRpYWxQb2xpY3kobmV4dFBvbGljeSwgb3B0aW9ucywgdGhpcyk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIEdlbmVyYXRlcyBhIGhhc2ggc2lnbmF0dXJlIGZvciBhbiBIVFRQIHJlcXVlc3Qgb3IgZm9yIGEgU0FTLlxuICAgICAqXG4gICAgICogQHBhcmFtIHN0cmluZ1RvU2lnbiAtXG4gICAgICovXG4gICAgY29tcHV0ZUhNQUNTSEEyNTYoc3RyaW5nVG9TaWduKSB7XG4gICAgICAgIHJldHVybiBjcnlwdG8uY3JlYXRlSG1hYyhcInNoYTI1NlwiLCB0aGlzLmFjY291bnRLZXkpLnVwZGF0ZShzdHJpbmdUb1NpZ24sIFwidXRmOFwiKS5kaWdlc3QoXCJiYXNlNjRcIik7XG4gICAgfVxufVxuXG4vLyBDb3B5cmlnaHQgKGMpIE1pY3Jvc29mdCBDb3Jwb3JhdGlvbi5cbi8vIExpY2Vuc2VkIHVuZGVyIHRoZSBNSVQgTGljZW5zZS5cbi8qKlxuICogQW5vbnltb3VzQ3JlZGVudGlhbFBvbGljeSBpcyB1c2VkIHdpdGggSFRUUChTKSByZXF1ZXN0cyB0aGF0IHJlYWQgcHVibGljIHJlc291cmNlc1xuICogb3IgZm9yIHVzZSB3aXRoIFNoYXJlZCBBY2Nlc3MgU2lnbmF0dXJlcyAoU0FTKS5cbiAqL1xuY2xhc3MgQW5vbnltb3VzQ3JlZGVudGlhbFBvbGljeSBleHRlbmRzIENyZWRlbnRpYWxQb2xpY3kge1xuICAgIC8qKlxuICAgICAqIENyZWF0ZXMgYW4gaW5zdGFuY2Ugb2YgQW5vbnltb3VzQ3JlZGVudGlhbFBvbGljeS5cbiAgICAgKiBAcGFyYW0gbmV4dFBvbGljeSAtXG4gICAgICogQHBhcmFtIG9wdGlvbnMgLVxuICAgICAqL1xuICAgIC8vIFRoZSBiYXNlIGNsYXNzIGhhcyBhIHByb3RlY3RlZCBjb25zdHJ1Y3Rvci4gQWRkaW5nIGEgcHVibGljIG9uZSB0byBlbmFibGUgY29uc3RydWN0aW5nIG9mIHRoaXMgY2xhc3MuXG4gICAgLyogZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby11c2VsZXNzLWNvbnN0cnVjdG9yKi9cbiAgICBjb25zdHJ1Y3RvcihuZXh0UG9saWN5LCBvcHRpb25zKSB7XG4gICAgICAgIHN1cGVyKG5leHRQb2xpY3ksIG9wdGlvbnMpO1xuICAgIH1cbn1cblxuLy8gQ29weXJpZ2h0IChjKSBNaWNyb3NvZnQgQ29ycG9yYXRpb24uXG4vLyBMaWNlbnNlZCB1bmRlciB0aGUgTUlUIExpY2Vuc2UuXG4vKipcbiAqIEFub255bW91c0NyZWRlbnRpYWwgcHJvdmlkZXMgYSBjcmVkZW50aWFsUG9saWN5Q3JlYXRvciBtZW1iZXIgdXNlZCB0byBjcmVhdGVcbiAqIEFub255bW91c0NyZWRlbnRpYWxQb2xpY3kgb2JqZWN0cy4gQW5vbnltb3VzQ3JlZGVudGlhbFBvbGljeSBpcyB1c2VkIHdpdGhcbiAqIEhUVFAoUykgcmVxdWVzdHMgdGhhdCByZWFkIHB1YmxpYyByZXNvdXJjZXMgb3IgZm9yIHVzZSB3aXRoIFNoYXJlZCBBY2Nlc3NcbiAqIFNpZ25hdHVyZXMgKFNBUykuXG4gKi9cbmNsYXNzIEFub255bW91c0NyZWRlbnRpYWwgZXh0ZW5kcyBDcmVkZW50aWFsIHtcbiAgICAvKipcbiAgICAgKiBDcmVhdGVzIGFuIHtAbGluayBBbm9ueW1vdXNDcmVkZW50aWFsUG9saWN5fSBvYmplY3QuXG4gICAgICpcbiAgICAgKiBAcGFyYW0gbmV4dFBvbGljeSAtXG4gICAgICogQHBhcmFtIG9wdGlvbnMgLVxuICAgICAqL1xuICAgIGNyZWF0ZShuZXh0UG9saWN5LCBvcHRpb25zKSB7XG4gICAgICAgIHJldHVybiBuZXcgQW5vbnltb3VzQ3JlZGVudGlhbFBvbGljeShuZXh0UG9saWN5LCBvcHRpb25zKTtcbiAgICB9XG59XG5cbi8vIENvcHlyaWdodCAoYykgTWljcm9zb2Z0IENvcnBvcmF0aW9uLlxuLy8gTGljZW5zZWQgdW5kZXIgdGhlIE1JVCBMaWNlbnNlLlxubGV0IF9kZWZhdWx0SHR0cENsaWVudDtcbmZ1bmN0aW9uIGdldENhY2hlZERlZmF1bHRIdHRwQ2xpZW50KCkge1xuICAgIGlmICghX2RlZmF1bHRIdHRwQ2xpZW50KSB7XG4gICAgICAgIF9kZWZhdWx0SHR0cENsaWVudCA9IGNvcmVSZXN0UGlwZWxpbmUuY3JlYXRlRGVmYXVsdEh0dHBDbGllbnQoKTtcbiAgICB9XG4gICAgcmV0dXJuIF9kZWZhdWx0SHR0cENsaWVudDtcbn1cblxuLy8gQ29weXJpZ2h0IChjKSBNaWNyb3NvZnQgQ29ycG9yYXRpb24uXG4vLyBMaWNlbnNlZCB1bmRlciB0aGUgTUlUIExpY2Vuc2UuXG4vKipcbiAqIFRoZSBwcm9ncmFtbWF0aWMgaWRlbnRpZmllciBvZiB0aGUgU3RvcmFnZUJyb3dzZXJQb2xpY3kuXG4gKi9cbmNvbnN0IHN0b3JhZ2VCcm93c2VyUG9saWN5TmFtZSA9IFwic3RvcmFnZUJyb3dzZXJQb2xpY3lcIjtcbi8qKlxuICogc3RvcmFnZUJyb3dzZXJQb2xpY3kgaXMgYSBwb2xpY3kgdXNlZCB0byBwcmV2ZW50IGJyb3dzZXJzIGZyb20gY2FjaGluZyByZXF1ZXN0c1xuICogYW5kIHRvIHJlbW92ZSBjb29raWVzIGFuZCBleHBsaWNpdCBjb250ZW50LWxlbmd0aCBoZWFkZXJzLlxuICovXG5mdW5jdGlvbiBzdG9yYWdlQnJvd3NlclBvbGljeSgpIHtcbiAgICByZXR1cm4ge1xuICAgICAgICBuYW1lOiBzdG9yYWdlQnJvd3NlclBvbGljeU5hbWUsXG4gICAgICAgIGFzeW5jIHNlbmRSZXF1ZXN0KHJlcXVlc3QsIG5leHQpIHtcbiAgICAgICAgICAgIGlmIChjb3JlVXRpbC5pc05vZGUpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gbmV4dChyZXF1ZXN0KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmIChyZXF1ZXN0Lm1ldGhvZCA9PT0gXCJHRVRcIiB8fCByZXF1ZXN0Lm1ldGhvZCA9PT0gXCJIRUFEXCIpIHtcbiAgICAgICAgICAgICAgICByZXF1ZXN0LnVybCA9IHNldFVSTFBhcmFtZXRlcihyZXF1ZXN0LnVybCwgVVJMQ29uc3RhbnRzLlBhcmFtZXRlcnMuRk9SQ0VfQlJPV1NFUl9OT19DQUNIRSwgbmV3IERhdGUoKS5nZXRUaW1lKCkudG9TdHJpbmcoKSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXF1ZXN0LmhlYWRlcnMuZGVsZXRlKEhlYWRlckNvbnN0YW50cy5DT09LSUUpO1xuICAgICAgICAgICAgLy8gQWNjb3JkaW5nIHRvIFhIUiBzdGFuZGFyZHMsIGNvbnRlbnQtbGVuZ3RoIHNob3VsZCBiZSBmdWxseSBjb250cm9sbGVkIGJ5IGJyb3dzZXJzXG4gICAgICAgICAgICByZXF1ZXN0LmhlYWRlcnMuZGVsZXRlKEhlYWRlckNvbnN0YW50cy5DT05URU5UX0xFTkdUSCk7XG4gICAgICAgICAgICByZXR1cm4gbmV4dChyZXF1ZXN0KTtcbiAgICAgICAgfSxcbiAgICB9O1xufVxuXG4vLyBDb3B5cmlnaHQgKGMpIE1pY3Jvc29mdCBDb3Jwb3JhdGlvbi5cbi8vIExpY2Vuc2VkIHVuZGVyIHRoZSBNSVQgTGljZW5zZS5cbi8qKlxuICogTmFtZSBvZiB0aGUge0BsaW5rIHN0b3JhZ2VSZXRyeVBvbGljeX1cbiAqL1xuY29uc3Qgc3RvcmFnZVJldHJ5UG9saWN5TmFtZSA9IFwic3RvcmFnZVJldHJ5UG9saWN5XCI7XG4vKipcbiAqIFJldHJ5UG9saWN5IHR5cGVzLlxuICovXG52YXIgU3RvcmFnZVJldHJ5UG9saWN5VHlwZTtcbihmdW5jdGlvbiAoU3RvcmFnZVJldHJ5UG9saWN5VHlwZSkge1xuICAgIC8qKlxuICAgICAqIEV4cG9uZW50aWFsIHJldHJ5LiBSZXRyeSB0aW1lIGRlbGF5IGdyb3dzIGV4cG9uZW50aWFsbHkuXG4gICAgICovXG4gICAgU3RvcmFnZVJldHJ5UG9saWN5VHlwZVtTdG9yYWdlUmV0cnlQb2xpY3lUeXBlW1wiRVhQT05FTlRJQUxcIl0gPSAwXSA9IFwiRVhQT05FTlRJQUxcIjtcbiAgICAvKipcbiAgICAgKiBMaW5lYXIgcmV0cnkuIFJldHJ5IHRpbWUgZGVsYXkgZ3Jvd3MgbGluZWFybHkuXG4gICAgICovXG4gICAgU3RvcmFnZVJldHJ5UG9saWN5VHlwZVtTdG9yYWdlUmV0cnlQb2xpY3lUeXBlW1wiRklYRURcIl0gPSAxXSA9IFwiRklYRURcIjtcbn0pKFN0b3JhZ2VSZXRyeVBvbGljeVR5cGUgfHwgKFN0b3JhZ2VSZXRyeVBvbGljeVR5cGUgPSB7fSkpO1xuLy8gRGVmYXVsdCB2YWx1ZXMgb2YgU3RvcmFnZVJldHJ5T3B0aW9uc1xuY29uc3QgREVGQVVMVF9SRVRSWV9PUFRJT05TID0ge1xuICAgIG1heFJldHJ5RGVsYXlJbk1zOiAxMjAgKiAxMDAwLFxuICAgIG1heFRyaWVzOiA0LFxuICAgIHJldHJ5RGVsYXlJbk1zOiA0ICogMTAwMCxcbiAgICByZXRyeVBvbGljeVR5cGU6IFN0b3JhZ2VSZXRyeVBvbGljeVR5cGUuRVhQT05FTlRJQUwsXG4gICAgc2Vjb25kYXJ5SG9zdDogXCJcIixcbiAgICB0cnlUaW1lb3V0SW5NczogdW5kZWZpbmVkLCAvLyBVc2Ugc2VydmVyIHNpZGUgZGVmYXVsdCB0aW1lb3V0IHN0cmF0ZWd5XG59O1xuY29uc3QgcmV0cmlhYmxlRXJyb3JzID0gW1xuICAgIFwiRVRJTUVET1VUXCIsXG4gICAgXCJFU09DS0VUVElNRURPVVRcIixcbiAgICBcIkVDT05OUkVGVVNFRFwiLFxuICAgIFwiRUNPTk5SRVNFVFwiLFxuICAgIFwiRU5PRU5UXCIsXG4gICAgXCJFTk9URk9VTkRcIixcbiAgICBcIlRJTUVPVVRcIixcbiAgICBcIkVQSVBFXCIsXG4gICAgXCJSRVFVRVNUX1NFTkRfRVJST1JcIixcbl07XG5jb25zdCBSRVRSWV9BQk9SVF9FUlJPUiA9IG5ldyBhYm9ydENvbnRyb2xsZXIuQWJvcnRFcnJvcihcIlRoZSBvcGVyYXRpb24gd2FzIGFib3J0ZWQuXCIpO1xuLyoqXG4gKiBSZXRyeSBwb2xpY3kgd2l0aCBleHBvbmVudGlhbCByZXRyeSBhbmQgbGluZWFyIHJldHJ5IGltcGxlbWVudGVkLlxuICovXG5mdW5jdGlvbiBzdG9yYWdlUmV0cnlQb2xpY3kob3B0aW9ucyA9IHt9KSB7XG4gICAgdmFyIF9hLCBfYiwgX2MsIF9kLCBfZSwgX2Y7XG4gICAgY29uc3QgcmV0cnlQb2xpY3lUeXBlID0gKF9hID0gb3B0aW9ucy5yZXRyeVBvbGljeVR5cGUpICE9PSBudWxsICYmIF9hICE9PSB2b2lkIDAgPyBfYSA6IERFRkFVTFRfUkVUUllfT1BUSU9OUy5yZXRyeVBvbGljeVR5cGU7XG4gICAgY29uc3QgbWF4VHJpZXMgPSAoX2IgPSBvcHRpb25zLm1heFRyaWVzKSAhPT0gbnVsbCAmJiBfYiAhPT0gdm9pZCAwID8gX2IgOiBERUZBVUxUX1JFVFJZX09QVElPTlMubWF4VHJpZXM7XG4gICAgY29uc3QgcmV0cnlEZWxheUluTXMgPSAoX2MgPSBvcHRpb25zLnJldHJ5RGVsYXlJbk1zKSAhPT0gbnVsbCAmJiBfYyAhPT0gdm9pZCAwID8gX2MgOiBERUZBVUxUX1JFVFJZX09QVElPTlMucmV0cnlEZWxheUluTXM7XG4gICAgY29uc3QgbWF4UmV0cnlEZWxheUluTXMgPSAoX2QgPSBvcHRpb25zLm1heFJldHJ5RGVsYXlJbk1zKSAhPT0gbnVsbCAmJiBfZCAhPT0gdm9pZCAwID8gX2QgOiBERUZBVUxUX1JFVFJZX09QVElPTlMubWF4UmV0cnlEZWxheUluTXM7XG4gICAgY29uc3Qgc2Vjb25kYXJ5SG9zdCA9IChfZSA9IG9wdGlvbnMuc2Vjb25kYXJ5SG9zdCkgIT09IG51bGwgJiYgX2UgIT09IHZvaWQgMCA/IF9lIDogREVGQVVMVF9SRVRSWV9PUFRJT05TLnNlY29uZGFyeUhvc3Q7XG4gICAgY29uc3QgdHJ5VGltZW91dEluTXMgPSAoX2YgPSBvcHRpb25zLnRyeVRpbWVvdXRJbk1zKSAhPT0gbnVsbCAmJiBfZiAhPT0gdm9pZCAwID8gX2YgOiBERUZBVUxUX1JFVFJZX09QVElPTlMudHJ5VGltZW91dEluTXM7XG4gICAgZnVuY3Rpb24gc2hvdWxkUmV0cnkoeyBpc1ByaW1hcnlSZXRyeSwgYXR0ZW1wdCwgcmVzcG9uc2UsIGVycm9yLCB9KSB7XG4gICAgICAgIHZhciBfYSwgX2I7XG4gICAgICAgIGlmIChhdHRlbXB0ID49IG1heFRyaWVzKSB7XG4gICAgICAgICAgICBsb2dnZXIuaW5mbyhgUmV0cnlQb2xpY3k6IEF0dGVtcHQocykgJHthdHRlbXB0fSA+PSBtYXhUcmllcyAke21heFRyaWVzfSwgbm8gZnVydGhlciB0cnkuYCk7XG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGVycm9yKSB7XG4gICAgICAgICAgICBmb3IgKGNvbnN0IHJldHJpYWJsZUVycm9yIG9mIHJldHJpYWJsZUVycm9ycykge1xuICAgICAgICAgICAgICAgIGlmIChlcnJvci5uYW1lLnRvVXBwZXJDYXNlKCkuaW5jbHVkZXMocmV0cmlhYmxlRXJyb3IpIHx8XG4gICAgICAgICAgICAgICAgICAgIGVycm9yLm1lc3NhZ2UudG9VcHBlckNhc2UoKS5pbmNsdWRlcyhyZXRyaWFibGVFcnJvcikgfHxcbiAgICAgICAgICAgICAgICAgICAgKGVycm9yLmNvZGUgJiYgZXJyb3IuY29kZS50b1N0cmluZygpLnRvVXBwZXJDYXNlKCkgPT09IHJldHJpYWJsZUVycm9yKSkge1xuICAgICAgICAgICAgICAgICAgICBsb2dnZXIuaW5mbyhgUmV0cnlQb2xpY3k6IE5ldHdvcmsgZXJyb3IgJHtyZXRyaWFibGVFcnJvcn0gZm91bmQsIHdpbGwgcmV0cnkuYCk7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmICgoZXJyb3IgPT09IG51bGwgfHwgZXJyb3IgPT09IHZvaWQgMCA/IHZvaWQgMCA6IGVycm9yLmNvZGUpID09PSBcIlBBUlNFX0VSUk9SXCIgJiZcbiAgICAgICAgICAgICAgICAoZXJyb3IgPT09IG51bGwgfHwgZXJyb3IgPT09IHZvaWQgMCA/IHZvaWQgMCA6IGVycm9yLm1lc3NhZ2Uuc3RhcnRzV2l0aChgRXJyb3IgXCJFcnJvcjogVW5jbG9zZWQgcm9vdCB0YWdgKSkpIHtcbiAgICAgICAgICAgICAgICBsb2dnZXIuaW5mbyhcIlJldHJ5UG9saWN5OiBJbmNvbXBsZXRlIFhNTCByZXNwb25zZSBsaWtlbHkgZHVlIHRvIHNlcnZpY2UgdGltZW91dCwgd2lsbCByZXRyeS5cIik7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgLy8gSWYgYXR0ZW1wdCB3YXMgYWdhaW5zdCB0aGUgc2Vjb25kYXJ5ICYgaXQgcmV0dXJuZWQgYSBTdGF0dXNOb3RGb3VuZCAoNDA0KSwgdGhlblxuICAgICAgICAvLyB0aGUgcmVzb3VyY2Ugd2FzIG5vdCBmb3VuZC4gVGhpcyBtYXkgYmUgZHVlIHRvIHJlcGxpY2F0aW9uIGRlbGF5LiBTbywgaW4gdGhpc1xuICAgICAgICAvLyBjYXNlLCB3ZSdsbCBuZXZlciB0cnkgdGhlIHNlY29uZGFyeSBhZ2FpbiBmb3IgdGhpcyBvcGVyYXRpb24uXG4gICAgICAgIGlmIChyZXNwb25zZSB8fCBlcnJvcikge1xuICAgICAgICAgICAgY29uc3Qgc3RhdHVzQ29kZSA9IChfYiA9IChfYSA9IHJlc3BvbnNlID09PSBudWxsIHx8IHJlc3BvbnNlID09PSB2b2lkIDAgPyB2b2lkIDAgOiByZXNwb25zZS5zdGF0dXMpICE9PSBudWxsICYmIF9hICE9PSB2b2lkIDAgPyBfYSA6IGVycm9yID09PSBudWxsIHx8IGVycm9yID09PSB2b2lkIDAgPyB2b2lkIDAgOiBlcnJvci5zdGF0dXNDb2RlKSAhPT0gbnVsbCAmJiBfYiAhPT0gdm9pZCAwID8gX2IgOiAwO1xuICAgICAgICAgICAgaWYgKCFpc1ByaW1hcnlSZXRyeSAmJiBzdGF0dXNDb2RlID09PSA0MDQpIHtcbiAgICAgICAgICAgICAgICBsb2dnZXIuaW5mbyhgUmV0cnlQb2xpY3k6IFNlY29uZGFyeSBhY2Nlc3Mgd2l0aCA0MDQsIHdpbGwgcmV0cnkuYCk7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICAvLyBTZXJ2ZXIgaW50ZXJuYWwgZXJyb3Igb3Igc2VydmVyIHRpbWVvdXRcbiAgICAgICAgICAgIGlmIChzdGF0dXNDb2RlID09PSA1MDMgfHwgc3RhdHVzQ29kZSA9PT0gNTAwKSB7XG4gICAgICAgICAgICAgICAgbG9nZ2VyLmluZm8oYFJldHJ5UG9saWN5OiBXaWxsIHJldHJ5IGZvciBzdGF0dXMgY29kZSAke3N0YXR1c0NvZGV9LmApO1xuICAgICAgICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIC8vIFtDb3B5IHNvdXJjZSBlcnJvciBjb2RlXSBGZWF0dXJlIGlzIHBlbmRpbmcgb24gc2VydmljZSBzaWRlLCBza2lwIHJldHJ5IG9uIGNvcHkgc291cmNlIGVycm9yIGZvciBub3cuXG4gICAgICAgIC8vIGlmIChyZXNwb25zZSkge1xuICAgICAgICAvLyAgIC8vIFJldHJ5IHNlbGVjdCBDb3B5IFNvdXJjZSBFcnJvciBDb2Rlcy5cbiAgICAgICAgLy8gICBpZiAocmVzcG9uc2U/LnN0YXR1cyA+PSA0MDApIHtcbiAgICAgICAgLy8gICAgIGNvbnN0IGNvcHlTb3VyY2VFcnJvciA9IHJlc3BvbnNlLmhlYWRlcnMuZ2V0KEhlYWRlckNvbnN0YW50cy5YX01TX0NvcHlTb3VyY2VFcnJvckNvZGUpO1xuICAgICAgICAvLyAgICAgaWYgKGNvcHlTb3VyY2VFcnJvciAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgIC8vICAgICAgIHN3aXRjaCAoY29weVNvdXJjZUVycm9yKSB7XG4gICAgICAgIC8vICAgICAgICAgY2FzZSBcIkludGVybmFsRXJyb3JcIjpcbiAgICAgICAgLy8gICAgICAgICBjYXNlIFwiT3BlcmF0aW9uVGltZWRPdXRcIjpcbiAgICAgICAgLy8gICAgICAgICBjYXNlIFwiU2VydmVyQnVzeVwiOlxuICAgICAgICAvLyAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgIC8vICAgICAgIH1cbiAgICAgICAgLy8gICAgIH1cbiAgICAgICAgLy8gICB9XG4gICAgICAgIC8vIH1cbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgICBmdW5jdGlvbiBjYWxjdWxhdGVEZWxheShpc1ByaW1hcnlSZXRyeSwgYXR0ZW1wdCkge1xuICAgICAgICBsZXQgZGVsYXlUaW1lSW5NcyA9IDA7XG4gICAgICAgIGlmIChpc1ByaW1hcnlSZXRyeSkge1xuICAgICAgICAgICAgc3dpdGNoIChyZXRyeVBvbGljeVR5cGUpIHtcbiAgICAgICAgICAgICAgICBjYXNlIFN0b3JhZ2VSZXRyeVBvbGljeVR5cGUuRVhQT05FTlRJQUw6XG4gICAgICAgICAgICAgICAgICAgIGRlbGF5VGltZUluTXMgPSBNYXRoLm1pbigoTWF0aC5wb3coMiwgYXR0ZW1wdCAtIDEpIC0gMSkgKiByZXRyeURlbGF5SW5NcywgbWF4UmV0cnlEZWxheUluTXMpO1xuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICBjYXNlIFN0b3JhZ2VSZXRyeVBvbGljeVR5cGUuRklYRUQ6XG4gICAgICAgICAgICAgICAgICAgIGRlbGF5VGltZUluTXMgPSByZXRyeURlbGF5SW5NcztcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICBkZWxheVRpbWVJbk1zID0gTWF0aC5yYW5kb20oKSAqIDEwMDA7XG4gICAgICAgIH1cbiAgICAgICAgbG9nZ2VyLmluZm8oYFJldHJ5UG9saWN5OiBEZWxheSBmb3IgJHtkZWxheVRpbWVJbk1zfW1zYCk7XG4gICAgICAgIHJldHVybiBkZWxheVRpbWVJbk1zO1xuICAgIH1cbiAgICByZXR1cm4ge1xuICAgICAgICBuYW1lOiBzdG9yYWdlUmV0cnlQb2xpY3lOYW1lLFxuICAgICAgICBhc3luYyBzZW5kUmVxdWVzdChyZXF1ZXN0LCBuZXh0KSB7XG4gICAgICAgICAgICAvLyBTZXQgdGhlIHNlcnZlci1zaWRlIHRpbWVvdXQgcXVlcnkgcGFyYW1ldGVyIFwidGltZW91dD1bc2Vjb25kc11cIlxuICAgICAgICAgICAgaWYgKHRyeVRpbWVvdXRJbk1zKSB7XG4gICAgICAgICAgICAgICAgcmVxdWVzdC51cmwgPSBzZXRVUkxQYXJhbWV0ZXIocmVxdWVzdC51cmwsIFVSTENvbnN0YW50cy5QYXJhbWV0ZXJzLlRJTUVPVVQsIFN0cmluZyhNYXRoLmZsb29yKHRyeVRpbWVvdXRJbk1zIC8gMTAwMCkpKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGNvbnN0IHByaW1hcnlVcmwgPSByZXF1ZXN0LnVybDtcbiAgICAgICAgICAgIGNvbnN0IHNlY29uZGFyeVVybCA9IHNlY29uZGFyeUhvc3QgPyBzZXRVUkxIb3N0KHJlcXVlc3QudXJsLCBzZWNvbmRhcnlIb3N0KSA6IHVuZGVmaW5lZDtcbiAgICAgICAgICAgIGxldCBzZWNvbmRhcnlIYXM0MDQgPSBmYWxzZTtcbiAgICAgICAgICAgIGxldCBhdHRlbXB0ID0gMTtcbiAgICAgICAgICAgIGxldCByZXRyeUFnYWluID0gdHJ1ZTtcbiAgICAgICAgICAgIGxldCByZXNwb25zZTtcbiAgICAgICAgICAgIGxldCBlcnJvcjtcbiAgICAgICAgICAgIHdoaWxlIChyZXRyeUFnYWluKSB7XG4gICAgICAgICAgICAgICAgY29uc3QgaXNQcmltYXJ5UmV0cnkgPSBzZWNvbmRhcnlIYXM0MDQgfHxcbiAgICAgICAgICAgICAgICAgICAgIXNlY29uZGFyeVVybCB8fFxuICAgICAgICAgICAgICAgICAgICAhW1wiR0VUXCIsIFwiSEVBRFwiLCBcIk9QVElPTlNcIl0uaW5jbHVkZXMocmVxdWVzdC5tZXRob2QpIHx8XG4gICAgICAgICAgICAgICAgICAgIGF0dGVtcHQgJSAyID09PSAxO1xuICAgICAgICAgICAgICAgIHJlcXVlc3QudXJsID0gaXNQcmltYXJ5UmV0cnkgPyBwcmltYXJ5VXJsIDogc2Vjb25kYXJ5VXJsO1xuICAgICAgICAgICAgICAgIHJlc3BvbnNlID0gdW5kZWZpbmVkO1xuICAgICAgICAgICAgICAgIGVycm9yID0gdW5kZWZpbmVkO1xuICAgICAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgICAgIGxvZ2dlci5pbmZvKGBSZXRyeVBvbGljeTogPT09PT0+IFRyeT0ke2F0dGVtcHR9ICR7aXNQcmltYXJ5UmV0cnkgPyBcIlByaW1hcnlcIiA6IFwiU2Vjb25kYXJ5XCJ9YCk7XG4gICAgICAgICAgICAgICAgICAgIHJlc3BvbnNlID0gYXdhaXQgbmV4dChyZXF1ZXN0KTtcbiAgICAgICAgICAgICAgICAgICAgc2Vjb25kYXJ5SGFzNDA0ID0gc2Vjb25kYXJ5SGFzNDA0IHx8ICghaXNQcmltYXJ5UmV0cnkgJiYgcmVzcG9uc2Uuc3RhdHVzID09PSA0MDQpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBjYXRjaCAoZSkge1xuICAgICAgICAgICAgICAgICAgICBpZiAoY29yZVJlc3RQaXBlbGluZS5pc1Jlc3RFcnJvcihlKSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgbG9nZ2VyLmVycm9yKGBSZXRyeVBvbGljeTogQ2F1Z2h0IGVycm9yLCBtZXNzYWdlOiAke2UubWVzc2FnZX0sIGNvZGU6ICR7ZS5jb2RlfWApO1xuICAgICAgICAgICAgICAgICAgICAgICAgZXJyb3IgPSBlO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgbG9nZ2VyLmVycm9yKGBSZXRyeVBvbGljeTogQ2F1Z2h0IGVycm9yLCBtZXNzYWdlOiAke2NvcmVVdGlsLmdldEVycm9yTWVzc2FnZShlKX1gKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRocm93IGU7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgcmV0cnlBZ2FpbiA9IHNob3VsZFJldHJ5KHsgaXNQcmltYXJ5UmV0cnksIGF0dGVtcHQsIHJlc3BvbnNlLCBlcnJvciB9KTtcbiAgICAgICAgICAgICAgICBpZiAocmV0cnlBZ2Fpbikge1xuICAgICAgICAgICAgICAgICAgICBhd2FpdCBkZWxheShjYWxjdWxhdGVEZWxheShpc1ByaW1hcnlSZXRyeSwgYXR0ZW1wdCksIHJlcXVlc3QuYWJvcnRTaWduYWwsIFJFVFJZX0FCT1JUX0VSUk9SKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgYXR0ZW1wdCsrO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKHJlc3BvbnNlKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHJlc3BvbnNlO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgdGhyb3cgZXJyb3IgIT09IG51bGwgJiYgZXJyb3IgIT09IHZvaWQgMCA/IGVycm9yIDogbmV3IGNvcmVSZXN0UGlwZWxpbmUuUmVzdEVycm9yKFwiUmV0cnlQb2xpY3kgZmFpbGVkIHdpdGhvdXQga25vd24gZXJyb3IuXCIpO1xuICAgICAgICB9LFxuICAgIH07XG59XG5cbi8vIENvcHlyaWdodCAoYykgTWljcm9zb2Z0IENvcnBvcmF0aW9uLlxuLy8gTGljZW5zZWQgdW5kZXIgdGhlIE1JVCBMaWNlbnNlLlxuLyoqXG4gKiBUaGUgcHJvZ3JhbW1hdGljIGlkZW50aWZpZXIgb2YgdGhlIHN0b3JhZ2VTaGFyZWRLZXlDcmVkZW50aWFsUG9saWN5LlxuICovXG5jb25zdCBzdG9yYWdlU2hhcmVkS2V5Q3JlZGVudGlhbFBvbGljeU5hbWUgPSBcInN0b3JhZ2VTaGFyZWRLZXlDcmVkZW50aWFsUG9saWN5XCI7XG4vKipcbiAqIHN0b3JhZ2VTaGFyZWRLZXlDcmVkZW50aWFsUG9saWN5IGhhbmRsZXMgc2lnbmluZyByZXF1ZXN0cyB1c2luZyBzdG9yYWdlIGFjY291bnQga2V5cy5cbiAqL1xuZnVuY3Rpb24gc3RvcmFnZVNoYXJlZEtleUNyZWRlbnRpYWxQb2xpY3kob3B0aW9ucykge1xuICAgIGZ1bmN0aW9uIHNpZ25SZXF1ZXN0KHJlcXVlc3QpIHtcbiAgICAgICAgcmVxdWVzdC5oZWFkZXJzLnNldChIZWFkZXJDb25zdGFudHMuWF9NU19EQVRFLCBuZXcgRGF0ZSgpLnRvVVRDU3RyaW5nKCkpO1xuICAgICAgICBpZiAocmVxdWVzdC5ib2R5ICYmXG4gICAgICAgICAgICAodHlwZW9mIHJlcXVlc3QuYm9keSA9PT0gXCJzdHJpbmdcIiB8fCBCdWZmZXIuaXNCdWZmZXIocmVxdWVzdC5ib2R5KSkgJiZcbiAgICAgICAgICAgIHJlcXVlc3QuYm9keS5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgICByZXF1ZXN0LmhlYWRlcnMuc2V0KEhlYWRlckNvbnN0YW50cy5DT05URU5UX0xFTkdUSCwgQnVmZmVyLmJ5dGVMZW5ndGgocmVxdWVzdC5ib2R5KSk7XG4gICAgICAgIH1cbiAgICAgICAgY29uc3Qgc3RyaW5nVG9TaWduID0gW1xuICAgICAgICAgICAgcmVxdWVzdC5tZXRob2QudG9VcHBlckNhc2UoKSxcbiAgICAgICAgICAgIGdldEhlYWRlclZhbHVlVG9TaWduKHJlcXVlc3QsIEhlYWRlckNvbnN0YW50cy5DT05URU5UX0xBTkdVQUdFKSxcbiAgICAgICAgICAgIGdldEhlYWRlclZhbHVlVG9TaWduKHJlcXVlc3QsIEhlYWRlckNvbnN0YW50cy5DT05URU5UX0VOQ09ESU5HKSxcbiAgICAgICAgICAgIGdldEhlYWRlclZhbHVlVG9TaWduKHJlcXVlc3QsIEhlYWRlckNvbnN0YW50cy5DT05URU5UX0xFTkdUSCksXG4gICAgICAgICAgICBnZXRIZWFkZXJWYWx1ZVRvU2lnbihyZXF1ZXN0LCBIZWFkZXJDb25zdGFudHMuQ09OVEVOVF9NRDUpLFxuICAgICAgICAgICAgZ2V0SGVhZGVyVmFsdWVUb1NpZ24ocmVxdWVzdCwgSGVhZGVyQ29uc3RhbnRzLkNPTlRFTlRfVFlQRSksXG4gICAgICAgICAgICBnZXRIZWFkZXJWYWx1ZVRvU2lnbihyZXF1ZXN0LCBIZWFkZXJDb25zdGFudHMuREFURSksXG4gICAgICAgICAgICBnZXRIZWFkZXJWYWx1ZVRvU2lnbihyZXF1ZXN0LCBIZWFkZXJDb25zdGFudHMuSUZfTU9ESUZJRURfU0lOQ0UpLFxuICAgICAgICAgICAgZ2V0SGVhZGVyVmFsdWVUb1NpZ24ocmVxdWVzdCwgSGVhZGVyQ29uc3RhbnRzLklGX01BVENIKSxcbiAgICAgICAgICAgIGdldEhlYWRlclZhbHVlVG9TaWduKHJlcXVlc3QsIEhlYWRlckNvbnN0YW50cy5JRl9OT05FX01BVENIKSxcbiAgICAgICAgICAgIGdldEhlYWRlclZhbHVlVG9TaWduKHJlcXVlc3QsIEhlYWRlckNvbnN0YW50cy5JRl9VTk1PRElGSUVEX1NJTkNFKSxcbiAgICAgICAgICAgIGdldEhlYWRlclZhbHVlVG9TaWduKHJlcXVlc3QsIEhlYWRlckNvbnN0YW50cy5SQU5HRSksXG4gICAgICAgIF0uam9pbihcIlxcblwiKSArXG4gICAgICAgICAgICBcIlxcblwiICtcbiAgICAgICAgICAgIGdldENhbm9uaWNhbGl6ZWRIZWFkZXJzU3RyaW5nKHJlcXVlc3QpICtcbiAgICAgICAgICAgIGdldENhbm9uaWNhbGl6ZWRSZXNvdXJjZVN0cmluZyhyZXF1ZXN0KTtcbiAgICAgICAgY29uc3Qgc2lnbmF0dXJlID0gY3J5cHRvLmNyZWF0ZUhtYWMoXCJzaGEyNTZcIiwgb3B0aW9ucy5hY2NvdW50S2V5KVxuICAgICAgICAgICAgLnVwZGF0ZShzdHJpbmdUb1NpZ24sIFwidXRmOFwiKVxuICAgICAgICAgICAgLmRpZ2VzdChcImJhc2U2NFwiKTtcbiAgICAgICAgcmVxdWVzdC5oZWFkZXJzLnNldChIZWFkZXJDb25zdGFudHMuQVVUSE9SSVpBVElPTiwgYFNoYXJlZEtleSAke29wdGlvbnMuYWNjb3VudE5hbWV9OiR7c2lnbmF0dXJlfWApO1xuICAgICAgICAvLyBjb25zb2xlLmxvZyhgW1VSTF06JHtyZXF1ZXN0LnVybH1gKTtcbiAgICAgICAgLy8gY29uc29sZS5sb2coYFtIRUFERVJTXToke3JlcXVlc3QuaGVhZGVycy50b1N0cmluZygpfWApO1xuICAgICAgICAvLyBjb25zb2xlLmxvZyhgW1NUUklORyBUTyBTSUdOXToke0pTT04uc3RyaW5naWZ5KHN0cmluZ1RvU2lnbil9YCk7XG4gICAgICAgIC8vIGNvbnNvbGUubG9nKGBbS0VZXTogJHtyZXF1ZXN0LmhlYWRlcnMuZ2V0KEhlYWRlckNvbnN0YW50cy5BVVRIT1JJWkFUSU9OKX1gKTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogUmV0cmlldmUgaGVhZGVyIHZhbHVlIGFjY29yZGluZyB0byBzaGFyZWQga2V5IHNpZ24gcnVsZXMuXG4gICAgICogQHNlZSBodHRwczovL2RvY3MubWljcm9zb2Z0LmNvbS9lbi11cy9yZXN0L2FwaS9zdG9yYWdlc2VydmljZXMvYXV0aGVudGljYXRlLXdpdGgtc2hhcmVkLWtleVxuICAgICAqL1xuICAgIGZ1bmN0aW9uIGdldEhlYWRlclZhbHVlVG9TaWduKHJlcXVlc3QsIGhlYWRlck5hbWUpIHtcbiAgICAgICAgY29uc3QgdmFsdWUgPSByZXF1ZXN0LmhlYWRlcnMuZ2V0KGhlYWRlck5hbWUpO1xuICAgICAgICBpZiAoIXZhbHVlKSB7XG4gICAgICAgICAgICByZXR1cm4gXCJcIjtcbiAgICAgICAgfVxuICAgICAgICAvLyBXaGVuIHVzaW5nIHZlcnNpb24gMjAxNS0wMi0yMSBvciBsYXRlciwgaWYgQ29udGVudC1MZW5ndGggaXMgemVybywgdGhlblxuICAgICAgICAvLyBzZXQgdGhlIENvbnRlbnQtTGVuZ3RoIHBhcnQgb2YgdGhlIFN0cmluZ1RvU2lnbiB0byBhbiBlbXB0eSBzdHJpbmcuXG4gICAgICAgIC8vIGh0dHBzOi8vZG9jcy5taWNyb3NvZnQuY29tL2VuLXVzL3Jlc3QvYXBpL3N0b3JhZ2VzZXJ2aWNlcy9hdXRoZW50aWNhdGUtd2l0aC1zaGFyZWQta2V5XG4gICAgICAgIGlmIChoZWFkZXJOYW1lID09PSBIZWFkZXJDb25zdGFudHMuQ09OVEVOVF9MRU5HVEggJiYgdmFsdWUgPT09IFwiMFwiKSB7XG4gICAgICAgICAgICByZXR1cm4gXCJcIjtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gdmFsdWU7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIFRvIGNvbnN0cnVjdCB0aGUgQ2Fub25pY2FsaXplZEhlYWRlcnMgcG9ydGlvbiBvZiB0aGUgc2lnbmF0dXJlIHN0cmluZywgZm9sbG93IHRoZXNlIHN0ZXBzOlxuICAgICAqIDEuIFJldHJpZXZlIGFsbCBoZWFkZXJzIGZvciB0aGUgcmVzb3VyY2UgdGhhdCBiZWdpbiB3aXRoIHgtbXMtLCBpbmNsdWRpbmcgdGhlIHgtbXMtZGF0ZSBoZWFkZXIuXG4gICAgICogMi4gQ29udmVydCBlYWNoIEhUVFAgaGVhZGVyIG5hbWUgdG8gbG93ZXJjYXNlLlxuICAgICAqIDMuIFNvcnQgdGhlIGhlYWRlcnMgbGV4aWNvZ3JhcGhpY2FsbHkgYnkgaGVhZGVyIG5hbWUsIGluIGFzY2VuZGluZyBvcmRlci5cbiAgICAgKiAgICBFYWNoIGhlYWRlciBtYXkgYXBwZWFyIG9ubHkgb25jZSBpbiB0aGUgc3RyaW5nLlxuICAgICAqIDQuIFJlcGxhY2UgYW55IGxpbmVhciB3aGl0ZXNwYWNlIGluIHRoZSBoZWFkZXIgdmFsdWUgd2l0aCBhIHNpbmdsZSBzcGFjZS5cbiAgICAgKiA1LiBUcmltIGFueSB3aGl0ZXNwYWNlIGFyb3VuZCB0aGUgY29sb24gaW4gdGhlIGhlYWRlci5cbiAgICAgKiA2LiBGaW5hbGx5LCBhcHBlbmQgYSBuZXctbGluZSBjaGFyYWN0ZXIgdG8gZWFjaCBjYW5vbmljYWxpemVkIGhlYWRlciBpbiB0aGUgcmVzdWx0aW5nIGxpc3QuXG4gICAgICogICAgQ29uc3RydWN0IHRoZSBDYW5vbmljYWxpemVkSGVhZGVycyBzdHJpbmcgYnkgY29uY2F0ZW5hdGluZyBhbGwgaGVhZGVycyBpbiB0aGlzIGxpc3QgaW50byBhIHNpbmdsZSBzdHJpbmcuXG4gICAgICpcbiAgICAgKi9cbiAgICBmdW5jdGlvbiBnZXRDYW5vbmljYWxpemVkSGVhZGVyc1N0cmluZyhyZXF1ZXN0KSB7XG4gICAgICAgIGxldCBoZWFkZXJzQXJyYXkgPSBbXTtcbiAgICAgICAgZm9yIChjb25zdCBbbmFtZSwgdmFsdWVdIG9mIHJlcXVlc3QuaGVhZGVycykge1xuICAgICAgICAgICAgaWYgKG5hbWUudG9Mb3dlckNhc2UoKS5zdGFydHNXaXRoKEhlYWRlckNvbnN0YW50cy5QUkVGSVhfRk9SX1NUT1JBR0UpKSB7XG4gICAgICAgICAgICAgICAgaGVhZGVyc0FycmF5LnB1c2goeyBuYW1lLCB2YWx1ZSB9KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBoZWFkZXJzQXJyYXkuc29ydCgoYSwgYikgPT4ge1xuICAgICAgICAgICAgcmV0dXJuIGNvbXBhcmVIZWFkZXIoYS5uYW1lLnRvTG93ZXJDYXNlKCksIGIubmFtZS50b0xvd2VyQ2FzZSgpKTtcbiAgICAgICAgfSk7XG4gICAgICAgIC8vIFJlbW92ZSBkdXBsaWNhdGUgaGVhZGVyc1xuICAgICAgICBoZWFkZXJzQXJyYXkgPSBoZWFkZXJzQXJyYXkuZmlsdGVyKCh2YWx1ZSwgaW5kZXgsIGFycmF5KSA9PiB7XG4gICAgICAgICAgICBpZiAoaW5kZXggPiAwICYmIHZhbHVlLm5hbWUudG9Mb3dlckNhc2UoKSA9PT0gYXJyYXlbaW5kZXggLSAxXS5uYW1lLnRvTG93ZXJDYXNlKCkpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgfSk7XG4gICAgICAgIGxldCBjYW5vbmljYWxpemVkSGVhZGVyc1N0cmluZ1RvU2lnbiA9IFwiXCI7XG4gICAgICAgIGhlYWRlcnNBcnJheS5mb3JFYWNoKChoZWFkZXIpID0+IHtcbiAgICAgICAgICAgIGNhbm9uaWNhbGl6ZWRIZWFkZXJzU3RyaW5nVG9TaWduICs9IGAke2hlYWRlci5uYW1lXG4gICAgICAgICAgICAgICAgLnRvTG93ZXJDYXNlKClcbiAgICAgICAgICAgICAgICAudHJpbVJpZ2h0KCl9OiR7aGVhZGVyLnZhbHVlLnRyaW1MZWZ0KCl9XFxuYDtcbiAgICAgICAgfSk7XG4gICAgICAgIHJldHVybiBjYW5vbmljYWxpemVkSGVhZGVyc1N0cmluZ1RvU2lnbjtcbiAgICB9XG4gICAgZnVuY3Rpb24gZ2V0Q2Fub25pY2FsaXplZFJlc291cmNlU3RyaW5nKHJlcXVlc3QpIHtcbiAgICAgICAgY29uc3QgcGF0aCA9IGdldFVSTFBhdGgocmVxdWVzdC51cmwpIHx8IFwiL1wiO1xuICAgICAgICBsZXQgY2Fub25pY2FsaXplZFJlc291cmNlU3RyaW5nID0gXCJcIjtcbiAgICAgICAgY2Fub25pY2FsaXplZFJlc291cmNlU3RyaW5nICs9IGAvJHtvcHRpb25zLmFjY291bnROYW1lfSR7cGF0aH1gO1xuICAgICAgICBjb25zdCBxdWVyaWVzID0gZ2V0VVJMUXVlcmllcyhyZXF1ZXN0LnVybCk7XG4gICAgICAgIGNvbnN0IGxvd2VyY2FzZVF1ZXJpZXMgPSB7fTtcbiAgICAgICAgaWYgKHF1ZXJpZXMpIHtcbiAgICAgICAgICAgIGNvbnN0IHF1ZXJ5S2V5cyA9IFtdO1xuICAgICAgICAgICAgZm9yIChjb25zdCBrZXkgaW4gcXVlcmllcykge1xuICAgICAgICAgICAgICAgIGlmIChPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwocXVlcmllcywga2V5KSkge1xuICAgICAgICAgICAgICAgICAgICBjb25zdCBsb3dlcmNhc2VLZXkgPSBrZXkudG9Mb3dlckNhc2UoKTtcbiAgICAgICAgICAgICAgICAgICAgbG93ZXJjYXNlUXVlcmllc1tsb3dlcmNhc2VLZXldID0gcXVlcmllc1trZXldO1xuICAgICAgICAgICAgICAgICAgICBxdWVyeUtleXMucHVzaChsb3dlcmNhc2VLZXkpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHF1ZXJ5S2V5cy5zb3J0KCk7XG4gICAgICAgICAgICBmb3IgKGNvbnN0IGtleSBvZiBxdWVyeUtleXMpIHtcbiAgICAgICAgICAgICAgICBjYW5vbmljYWxpemVkUmVzb3VyY2VTdHJpbmcgKz0gYFxcbiR7a2V5fToke2RlY29kZVVSSUNvbXBvbmVudChsb3dlcmNhc2VRdWVyaWVzW2tleV0pfWA7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGNhbm9uaWNhbGl6ZWRSZXNvdXJjZVN0cmluZztcbiAgICB9XG4gICAgcmV0dXJuIHtcbiAgICAgICAgbmFtZTogc3RvcmFnZVNoYXJlZEtleUNyZWRlbnRpYWxQb2xpY3lOYW1lLFxuICAgICAgICBhc3luYyBzZW5kUmVxdWVzdChyZXF1ZXN0LCBuZXh0KSB7XG4gICAgICAgICAgICBzaWduUmVxdWVzdChyZXF1ZXN0KTtcbiAgICAgICAgICAgIHJldHVybiBuZXh0KHJlcXVlc3QpO1xuICAgICAgICB9LFxuICAgIH07XG59XG5cbi8vIENvcHlyaWdodCAoYykgTWljcm9zb2Z0IENvcnBvcmF0aW9uLlxuLy8gTGljZW5zZWQgdW5kZXIgdGhlIE1JVCBMaWNlbnNlLlxuLyoqXG4gKiBTdG9yYWdlQnJvd3NlclBvbGljeSB3aWxsIGhhbmRsZSBkaWZmZXJlbmNlcyBiZXR3ZWVuIE5vZGUuanMgYW5kIGJyb3dzZXIgcnVudGltZSwgaW5jbHVkaW5nOlxuICpcbiAqIDEuIEJyb3dzZXJzIGNhY2hlIEdFVC9IRUFEIHJlcXVlc3RzIGJ5IGFkZGluZyBjb25kaXRpb25hbCBoZWFkZXJzIHN1Y2ggYXMgJ0lGX01PRElGSUVEX1NJTkNFJy5cbiAqIFN0b3JhZ2VCcm93c2VyUG9saWN5IGlzIGEgcG9saWN5IHVzZWQgdG8gYWRkIGEgdGltZXN0YW1wIHF1ZXJ5IHRvIEdFVC9IRUFEIHJlcXVlc3QgVVJMXG4gKiB0aHVzIGF2b2lkIHRoZSBicm93c2VyIGNhY2hlLlxuICpcbiAqIDIuIFJlbW92ZSBjb29raWUgaGVhZGVyIGZvciBzZWN1cml0eVxuICpcbiAqIDMuIFJlbW92ZSBjb250ZW50LWxlbmd0aCBoZWFkZXIgdG8gYXZvaWQgYnJvd3NlcnMgd2FybmluZ1xuICovXG5jbGFzcyBTdG9yYWdlQnJvd3NlclBvbGljeSBleHRlbmRzIEJhc2VSZXF1ZXN0UG9saWN5IHtcbiAgICAvKipcbiAgICAgKiBDcmVhdGVzIGFuIGluc3RhbmNlIG9mIFN0b3JhZ2VCcm93c2VyUG9saWN5LlxuICAgICAqIEBwYXJhbSBuZXh0UG9saWN5IC1cbiAgICAgKiBAcGFyYW0gb3B0aW9ucyAtXG4gICAgICovXG4gICAgLy8gVGhlIGJhc2UgY2xhc3MgaGFzIGEgcHJvdGVjdGVkIGNvbnN0cnVjdG9yLiBBZGRpbmcgYSBwdWJsaWMgb25lIHRvIGVuYWJsZSBjb25zdHJ1Y3Rpbmcgb2YgdGhpcyBjbGFzcy5cbiAgICAvKiBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLXVzZWxlc3MtY29uc3RydWN0b3IqL1xuICAgIGNvbnN0cnVjdG9yKG5leHRQb2xpY3ksIG9wdGlvbnMpIHtcbiAgICAgICAgc3VwZXIobmV4dFBvbGljeSwgb3B0aW9ucyk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIFNlbmRzIG91dCByZXF1ZXN0LlxuICAgICAqXG4gICAgICogQHBhcmFtIHJlcXVlc3QgLVxuICAgICAqL1xuICAgIGFzeW5jIHNlbmRSZXF1ZXN0KHJlcXVlc3QpIHtcbiAgICAgICAgaWYgKGNvcmVVdGlsLmlzTm9kZSkge1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMuX25leHRQb2xpY3kuc2VuZFJlcXVlc3QocmVxdWVzdCk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHJlcXVlc3QubWV0aG9kLnRvVXBwZXJDYXNlKCkgPT09IFwiR0VUXCIgfHwgcmVxdWVzdC5tZXRob2QudG9VcHBlckNhc2UoKSA9PT0gXCJIRUFEXCIpIHtcbiAgICAgICAgICAgIHJlcXVlc3QudXJsID0gc2V0VVJMUGFyYW1ldGVyKHJlcXVlc3QudXJsLCBVUkxDb25zdGFudHMuUGFyYW1ldGVycy5GT1JDRV9CUk9XU0VSX05PX0NBQ0hFLCBuZXcgRGF0ZSgpLmdldFRpbWUoKS50b1N0cmluZygpKTtcbiAgICAgICAgfVxuICAgICAgICByZXF1ZXN0LmhlYWRlcnMucmVtb3ZlKEhlYWRlckNvbnN0YW50cy5DT09LSUUpO1xuICAgICAgICAvLyBBY2NvcmRpbmcgdG8gWEhSIHN0YW5kYXJkcywgY29udGVudC1sZW5ndGggc2hvdWxkIGJlIGZ1bGx5IGNvbnRyb2xsZWQgYnkgYnJvd3NlcnNcbiAgICAgICAgcmVxdWVzdC5oZWFkZXJzLnJlbW92ZShIZWFkZXJDb25zdGFudHMuQ09OVEVOVF9MRU5HVEgpO1xuICAgICAgICByZXR1cm4gdGhpcy5fbmV4dFBvbGljeS5zZW5kUmVxdWVzdChyZXF1ZXN0KTtcbiAgICB9XG59XG5cbi8vIENvcHlyaWdodCAoYykgTWljcm9zb2Z0IENvcnBvcmF0aW9uLlxuLy8gTGljZW5zZWQgdW5kZXIgdGhlIE1JVCBMaWNlbnNlLlxuLyoqXG4gKiBTdG9yYWdlQnJvd3NlclBvbGljeUZhY3RvcnkgaXMgYSBmYWN0b3J5IGNsYXNzIGhlbHBpbmcgZ2VuZXJhdGluZyBTdG9yYWdlQnJvd3NlclBvbGljeSBvYmplY3RzLlxuICovXG5jbGFzcyBTdG9yYWdlQnJvd3NlclBvbGljeUZhY3Rvcnkge1xuICAgIC8qKlxuICAgICAqIENyZWF0ZXMgYSBTdG9yYWdlQnJvd3NlclBvbGljeUZhY3Rvcnkgb2JqZWN0LlxuICAgICAqXG4gICAgICogQHBhcmFtIG5leHRQb2xpY3kgLVxuICAgICAqIEBwYXJhbSBvcHRpb25zIC1cbiAgICAgKi9cbiAgICBjcmVhdGUobmV4dFBvbGljeSwgb3B0aW9ucykge1xuICAgICAgICByZXR1cm4gbmV3IFN0b3JhZ2VCcm93c2VyUG9saWN5KG5leHRQb2xpY3ksIG9wdGlvbnMpO1xuICAgIH1cbn1cblxuLy8gQ29weXJpZ2h0IChjKSBNaWNyb3NvZnQgQ29ycG9yYXRpb24uXG4vLyBMaWNlbnNlZCB1bmRlciB0aGUgTUlUIExpY2Vuc2UuXG4vKipcbiAqIFRoZSBwcm9ncmFtbWF0aWMgaWRlbnRpZmllciBvZiB0aGUgc3RvcmFnZUNvcnJlY3RDb250ZW50TGVuZ3RoUG9saWN5LlxuICovXG5jb25zdCBzdG9yYWdlQ29ycmVjdENvbnRlbnRMZW5ndGhQb2xpY3lOYW1lID0gXCJTdG9yYWdlQ29ycmVjdENvbnRlbnRMZW5ndGhQb2xpY3lcIjtcbi8qKlxuICogc3RvcmFnZUNvcnJlY3RDb250ZW50TGVuZ3RoUG9saWN5IHRvIGNvcnJlY3RseSBzZXQgQ29udGVudC1MZW5ndGggaGVhZGVyIHdpdGggcmVxdWVzdCBib2R5IGxlbmd0aC5cbiAqL1xuZnVuY3Rpb24gc3RvcmFnZUNvcnJlY3RDb250ZW50TGVuZ3RoUG9saWN5KCkge1xuICAgIGZ1bmN0aW9uIGNvcnJlY3RDb250ZW50TGVuZ3RoKHJlcXVlc3QpIHtcbiAgICAgICAgaWYgKHJlcXVlc3QuYm9keSAmJlxuICAgICAgICAgICAgKHR5cGVvZiByZXF1ZXN0LmJvZHkgPT09IFwic3RyaW5nXCIgfHwgQnVmZmVyLmlzQnVmZmVyKHJlcXVlc3QuYm9keSkpICYmXG4gICAgICAgICAgICByZXF1ZXN0LmJvZHkubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgcmVxdWVzdC5oZWFkZXJzLnNldChIZWFkZXJDb25zdGFudHMuQ09OVEVOVF9MRU5HVEgsIEJ1ZmZlci5ieXRlTGVuZ3RoKHJlcXVlc3QuYm9keSkpO1xuICAgICAgICB9XG4gICAgfVxuICAgIHJldHVybiB7XG4gICAgICAgIG5hbWU6IHN0b3JhZ2VDb3JyZWN0Q29udGVudExlbmd0aFBvbGljeU5hbWUsXG4gICAgICAgIGFzeW5jIHNlbmRSZXF1ZXN0KHJlcXVlc3QsIG5leHQpIHtcbiAgICAgICAgICAgIGNvcnJlY3RDb250ZW50TGVuZ3RoKHJlcXVlc3QpO1xuICAgICAgICAgICAgcmV0dXJuIG5leHQocmVxdWVzdCk7XG4gICAgICAgIH0sXG4gICAgfTtcbn1cblxuLy8gQ29weXJpZ2h0IChjKSBNaWNyb3NvZnQgQ29ycG9yYXRpb24uXG4vLyBMaWNlbnNlZCB1bmRlciB0aGUgTUlUIExpY2Vuc2UuXG4vKipcbiAqIEEgaGVscGVyIHRvIGRlY2lkZSBpZiBhIGdpdmVuIGFyZ3VtZW50IHNhdGlzZmllcyB0aGUgUGlwZWxpbmUgY29udHJhY3RcbiAqIEBwYXJhbSBwaXBlbGluZSAtIEFuIGFyZ3VtZW50IHRoYXQgbWF5IGJlIGEgUGlwZWxpbmVcbiAqIEByZXR1cm5zIHRydWUgd2hlbiB0aGUgYXJndW1lbnQgc2F0aXNmaWVzIHRoZSBQaXBlbGluZSBjb250cmFjdFxuICovXG5mdW5jdGlvbiBpc1BpcGVsaW5lTGlrZShwaXBlbGluZSkge1xuICAgIGlmICghcGlwZWxpbmUgfHwgdHlwZW9mIHBpcGVsaW5lICE9PSBcIm9iamVjdFwiKSB7XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gICAgY29uc3QgY2FzdFBpcGVsaW5lID0gcGlwZWxpbmU7XG4gICAgcmV0dXJuIChBcnJheS5pc0FycmF5KGNhc3RQaXBlbGluZS5mYWN0b3JpZXMpICYmXG4gICAgICAgIHR5cGVvZiBjYXN0UGlwZWxpbmUub3B0aW9ucyA9PT0gXCJvYmplY3RcIiAmJlxuICAgICAgICB0eXBlb2YgY2FzdFBpcGVsaW5lLnRvU2VydmljZUNsaWVudE9wdGlvbnMgPT09IFwiZnVuY3Rpb25cIik7XG59XG4vKipcbiAqIEEgUGlwZWxpbmUgY2xhc3MgY29udGFpbmluZyBIVFRQIHJlcXVlc3QgcG9saWNpZXMuXG4gKiBZb3UgY2FuIGNyZWF0ZSBhIGRlZmF1bHQgUGlwZWxpbmUgYnkgY2FsbGluZyB7QGxpbmsgbmV3UGlwZWxpbmV9LlxuICogT3IgeW91IGNhbiBjcmVhdGUgYSBQaXBlbGluZSB3aXRoIHlvdXIgb3duIHBvbGljaWVzIGJ5IHRoZSBjb25zdHJ1Y3RvciBvZiBQaXBlbGluZS5cbiAqXG4gKiBSZWZlciB0byB7QGxpbmsgbmV3UGlwZWxpbmV9IGFuZCBwcm92aWRlZCBwb2xpY2llcyBiZWZvcmUgaW1wbGVtZW50aW5nIHlvdXJcbiAqIGN1c3RvbWl6ZWQgUGlwZWxpbmUuXG4gKi9cbmNsYXNzIFBpcGVsaW5lIHtcbiAgICAvKipcbiAgICAgKiBDcmVhdGVzIGFuIGluc3RhbmNlIG9mIFBpcGVsaW5lLiBDdXN0b21pemUgSFRUUENsaWVudCBieSBpbXBsZW1lbnRpbmcgSUh0dHBDbGllbnQgaW50ZXJmYWNlLlxuICAgICAqXG4gICAgICogQHBhcmFtIGZhY3RvcmllcyAtXG4gICAgICogQHBhcmFtIG9wdGlvbnMgLVxuICAgICAqL1xuICAgIGNvbnN0cnVjdG9yKGZhY3Rvcmllcywgb3B0aW9ucyA9IHt9KSB7XG4gICAgICAgIHRoaXMuZmFjdG9yaWVzID0gZmFjdG9yaWVzO1xuICAgICAgICB0aGlzLm9wdGlvbnMgPSBvcHRpb25zO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBUcmFuc2ZlciBQaXBlbGluZSBvYmplY3QgdG8gU2VydmljZUNsaWVudE9wdGlvbnMgb2JqZWN0IHdoaWNoIGlzIHJlcXVpcmVkIGJ5XG4gICAgICogU2VydmljZUNsaWVudCBjb25zdHJ1Y3Rvci5cbiAgICAgKlxuICAgICAqIEByZXR1cm5zIFRoZSBTZXJ2aWNlQ2xpZW50T3B0aW9ucyBvYmplY3QgZnJvbSB0aGlzIFBpcGVsaW5lLlxuICAgICAqL1xuICAgIHRvU2VydmljZUNsaWVudE9wdGlvbnMoKSB7XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICBodHRwQ2xpZW50OiB0aGlzLm9wdGlvbnMuaHR0cENsaWVudCxcbiAgICAgICAgICAgIHJlcXVlc3RQb2xpY3lGYWN0b3JpZXM6IHRoaXMuZmFjdG9yaWVzLFxuICAgICAgICB9O1xuICAgIH1cbn1cbi8qKlxuICogQ3JlYXRlcyBhIG5ldyBQaXBlbGluZSBvYmplY3Qgd2l0aCBDcmVkZW50aWFsIHByb3ZpZGVkLlxuICpcbiAqIEBwYXJhbSBjcmVkZW50aWFsIC0gIFN1Y2ggYXMgQW5vbnltb3VzQ3JlZGVudGlhbCwgU3RvcmFnZVNoYXJlZEtleUNyZWRlbnRpYWwgb3IgYW55IGNyZWRlbnRpYWwgZnJvbSB0aGUgYEBhenVyZS9pZGVudGl0eWAgcGFja2FnZSB0byBhdXRoZW50aWNhdGUgcmVxdWVzdHMgdG8gdGhlIHNlcnZpY2UuIFlvdSBjYW4gYWxzbyBwcm92aWRlIGFuIG9iamVjdCB0aGF0IGltcGxlbWVudHMgdGhlIFRva2VuQ3JlZGVudGlhbCBpbnRlcmZhY2UuIElmIG5vdCBzcGVjaWZpZWQsIEFub255bW91c0NyZWRlbnRpYWwgaXMgdXNlZC5cbiAqIEBwYXJhbSBwaXBlbGluZU9wdGlvbnMgLSBPcHRpb25hbC4gT3B0aW9ucy5cbiAqIEByZXR1cm5zIEEgbmV3IFBpcGVsaW5lIG9iamVjdC5cbiAqL1xuZnVuY3Rpb24gbmV3UGlwZWxpbmUoY3JlZGVudGlhbCwgcGlwZWxpbmVPcHRpb25zID0ge30pIHtcbiAgICBpZiAoIWNyZWRlbnRpYWwpIHtcbiAgICAgICAgY3JlZGVudGlhbCA9IG5ldyBBbm9ueW1vdXNDcmVkZW50aWFsKCk7XG4gICAgfVxuICAgIGNvbnN0IHBpcGVsaW5lID0gbmV3IFBpcGVsaW5lKFtdLCBwaXBlbGluZU9wdGlvbnMpO1xuICAgIHBpcGVsaW5lLl9jcmVkZW50aWFsID0gY3JlZGVudGlhbDtcbiAgICByZXR1cm4gcGlwZWxpbmU7XG59XG5mdW5jdGlvbiBwcm9jZXNzRG93bmxldmVsUGlwZWxpbmUocGlwZWxpbmUpIHtcbiAgICBjb25zdCBrbm93bkZhY3RvcnlGdW5jdGlvbnMgPSBbXG4gICAgICAgIGlzQW5vbnltb3VzQ3JlZGVudGlhbCxcbiAgICAgICAgaXNTdG9yYWdlU2hhcmVkS2V5Q3JlZGVudGlhbCxcbiAgICAgICAgaXNDb3JlSHR0cEJlYXJlclRva2VuRmFjdG9yeSxcbiAgICAgICAgaXNTdG9yYWdlQnJvd3NlclBvbGljeUZhY3RvcnksXG4gICAgICAgIGlzU3RvcmFnZVJldHJ5UG9saWN5RmFjdG9yeSxcbiAgICAgICAgaXNTdG9yYWdlVGVsZW1ldHJ5UG9saWN5RmFjdG9yeSxcbiAgICAgICAgaXNDb3JlSHR0cFBvbGljeUZhY3RvcnksXG4gICAgXTtcbiAgICBpZiAocGlwZWxpbmUuZmFjdG9yaWVzLmxlbmd0aCkge1xuICAgICAgICBjb25zdCBub3ZlbEZhY3RvcmllcyA9IHBpcGVsaW5lLmZhY3Rvcmllcy5maWx0ZXIoKGZhY3RvcnkpID0+IHtcbiAgICAgICAgICAgIHJldHVybiAha25vd25GYWN0b3J5RnVuY3Rpb25zLnNvbWUoKGtub3duRmFjdG9yeSkgPT4ga25vd25GYWN0b3J5KGZhY3RvcnkpKTtcbiAgICAgICAgfSk7XG4gICAgICAgIGlmIChub3ZlbEZhY3Rvcmllcy5sZW5ndGgpIHtcbiAgICAgICAgICAgIGNvbnN0IGhhc0luamVjdG9yID0gbm92ZWxGYWN0b3JpZXMuc29tZSgoZmFjdG9yeSkgPT4gaXNJbmplY3RvclBvbGljeUZhY3RvcnkoZmFjdG9yeSkpO1xuICAgICAgICAgICAgLy8gaWYgdGhlcmUgYXJlIGFueSBsZWZ0IG92ZXIsIHdyYXAgaW4gYSByZXF1ZXN0UG9saWN5RmFjdG9yeVBvbGljeVxuICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgICB3cmFwcGVkUG9saWNpZXM6IGNvcmVIdHRwQ29tcGF0LmNyZWF0ZVJlcXVlc3RQb2xpY3lGYWN0b3J5UG9saWN5KG5vdmVsRmFjdG9yaWVzKSxcbiAgICAgICAgICAgICAgICBhZnRlclJldHJ5OiBoYXNJbmplY3RvcixcbiAgICAgICAgICAgIH07XG4gICAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIHVuZGVmaW5lZDtcbn1cbmZ1bmN0aW9uIGdldENvcmVDbGllbnRPcHRpb25zKHBpcGVsaW5lKSB7XG4gICAgdmFyIF9hO1xuICAgIGNvbnN0IF9iID0gcGlwZWxpbmUub3B0aW9ucywgeyBodHRwQ2xpZW50OiB2MUNsaWVudCB9ID0gX2IsIHJlc3RPcHRpb25zID0gdHNsaWIuX19yZXN0KF9iLCBbXCJodHRwQ2xpZW50XCJdKTtcbiAgICBsZXQgaHR0cENsaWVudCA9IHBpcGVsaW5lLl9jb3JlSHR0cENsaWVudDtcbiAgICBpZiAoIWh0dHBDbGllbnQpIHtcbiAgICAgICAgaHR0cENsaWVudCA9IHYxQ2xpZW50ID8gY29yZUh0dHBDb21wYXQuY29udmVydEh0dHBDbGllbnQodjFDbGllbnQpIDogZ2V0Q2FjaGVkRGVmYXVsdEh0dHBDbGllbnQoKTtcbiAgICAgICAgcGlwZWxpbmUuX2NvcmVIdHRwQ2xpZW50ID0gaHR0cENsaWVudDtcbiAgICB9XG4gICAgbGV0IGNvcmVQaXBlbGluZSA9IHBpcGVsaW5lLl9jb3JlUGlwZWxpbmU7XG4gICAgaWYgKCFjb3JlUGlwZWxpbmUpIHtcbiAgICAgICAgY29uc3QgcGFja2FnZURldGFpbHMgPSBgYXpzZGstanMtYXp1cmUtc3RvcmFnZS1ibG9iLyR7U0RLX1ZFUlNJT059YDtcbiAgICAgICAgY29uc3QgdXNlckFnZW50UHJlZml4ID0gcmVzdE9wdGlvbnMudXNlckFnZW50T3B0aW9ucyAmJiByZXN0T3B0aW9ucy51c2VyQWdlbnRPcHRpb25zLnVzZXJBZ2VudFByZWZpeFxuICAgICAgICAgICAgPyBgJHtyZXN0T3B0aW9ucy51c2VyQWdlbnRPcHRpb25zLnVzZXJBZ2VudFByZWZpeH0gJHtwYWNrYWdlRGV0YWlsc31gXG4gICAgICAgICAgICA6IGAke3BhY2thZ2VEZXRhaWxzfWA7XG4gICAgICAgIGNvcmVQaXBlbGluZSA9IGNvcmVDbGllbnQuY3JlYXRlQ2xpZW50UGlwZWxpbmUoT2JqZWN0LmFzc2lnbihPYmplY3QuYXNzaWduKHt9LCByZXN0T3B0aW9ucyksIHsgbG9nZ2luZ09wdGlvbnM6IHtcbiAgICAgICAgICAgICAgICBhZGRpdGlvbmFsQWxsb3dlZEhlYWRlck5hbWVzOiBTdG9yYWdlQmxvYkxvZ2dpbmdBbGxvd2VkSGVhZGVyTmFtZXMsXG4gICAgICAgICAgICAgICAgYWRkaXRpb25hbEFsbG93ZWRRdWVyeVBhcmFtZXRlcnM6IFN0b3JhZ2VCbG9iTG9nZ2luZ0FsbG93ZWRRdWVyeVBhcmFtZXRlcnMsXG4gICAgICAgICAgICAgICAgbG9nZ2VyOiBsb2dnZXIuaW5mbyxcbiAgICAgICAgICAgIH0sIHVzZXJBZ2VudE9wdGlvbnM6IHtcbiAgICAgICAgICAgICAgICB1c2VyQWdlbnRQcmVmaXgsXG4gICAgICAgICAgICB9LCBzZXJpYWxpemF0aW9uT3B0aW9uczoge1xuICAgICAgICAgICAgICAgIHN0cmluZ2lmeVhNTDogY29yZVhtbC5zdHJpbmdpZnlYTUwsXG4gICAgICAgICAgICAgICAgc2VyaWFsaXplck9wdGlvbnM6IHtcbiAgICAgICAgICAgICAgICAgICAgeG1sOiB7XG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBVc2UgY3VzdG9taXplZCBYTUwgY2hhciBrZXkgb2YgXCIjXCIgc28gd2UgY2FuIGRlc2VyaWFsaXplIG1ldGFkYXRhXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyB3aXRoIFwiX1wiIGtleVxuICAgICAgICAgICAgICAgICAgICAgICAgeG1sQ2hhcktleTogXCIjXCIsXG4gICAgICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIH0sIGRlc2VyaWFsaXphdGlvbk9wdGlvbnM6IHtcbiAgICAgICAgICAgICAgICBwYXJzZVhNTDogY29yZVhtbC5wYXJzZVhNTCxcbiAgICAgICAgICAgICAgICBzZXJpYWxpemVyT3B0aW9uczoge1xuICAgICAgICAgICAgICAgICAgICB4bWw6IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIFVzZSBjdXN0b21pemVkIFhNTCBjaGFyIGtleSBvZiBcIiNcIiBzbyB3ZSBjYW4gZGVzZXJpYWxpemUgbWV0YWRhdGFcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIHdpdGggXCJfXCIga2V5XG4gICAgICAgICAgICAgICAgICAgICAgICB4bWxDaGFyS2V5OiBcIiNcIixcbiAgICAgICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgfSB9KSk7XG4gICAgICAgIGNvcmVQaXBlbGluZS5yZW1vdmVQb2xpY3koeyBwaGFzZTogXCJSZXRyeVwiIH0pO1xuICAgICAgICBjb3JlUGlwZWxpbmUucmVtb3ZlUG9saWN5KHsgbmFtZTogY29yZVJlc3RQaXBlbGluZS5kZWNvbXByZXNzUmVzcG9uc2VQb2xpY3lOYW1lIH0pO1xuICAgICAgICBjb3JlUGlwZWxpbmUuYWRkUG9saWN5KHN0b3JhZ2VDb3JyZWN0Q29udGVudExlbmd0aFBvbGljeSgpKTtcbiAgICAgICAgY29yZVBpcGVsaW5lLmFkZFBvbGljeShzdG9yYWdlUmV0cnlQb2xpY3kocmVzdE9wdGlvbnMucmV0cnlPcHRpb25zKSwgeyBwaGFzZTogXCJSZXRyeVwiIH0pO1xuICAgICAgICBjb3JlUGlwZWxpbmUuYWRkUG9saWN5KHN0b3JhZ2VCcm93c2VyUG9saWN5KCkpO1xuICAgICAgICBjb25zdCBkb3dubGV2ZWxSZXN1bHRzID0gcHJvY2Vzc0Rvd25sZXZlbFBpcGVsaW5lKHBpcGVsaW5lKTtcbiAgICAgICAgaWYgKGRvd25sZXZlbFJlc3VsdHMpIHtcbiAgICAgICAgICAgIGNvcmVQaXBlbGluZS5hZGRQb2xpY3koZG93bmxldmVsUmVzdWx0cy53cmFwcGVkUG9saWNpZXMsIGRvd25sZXZlbFJlc3VsdHMuYWZ0ZXJSZXRyeSA/IHsgYWZ0ZXJQaGFzZTogXCJSZXRyeVwiIH0gOiB1bmRlZmluZWQpO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IGNyZWRlbnRpYWwgPSBnZXRDcmVkZW50aWFsRnJvbVBpcGVsaW5lKHBpcGVsaW5lKTtcbiAgICAgICAgaWYgKGNvcmVBdXRoLmlzVG9rZW5DcmVkZW50aWFsKGNyZWRlbnRpYWwpKSB7XG4gICAgICAgICAgICBjb3JlUGlwZWxpbmUuYWRkUG9saWN5KGNvcmVSZXN0UGlwZWxpbmUuYmVhcmVyVG9rZW5BdXRoZW50aWNhdGlvblBvbGljeSh7XG4gICAgICAgICAgICAgICAgY3JlZGVudGlhbCxcbiAgICAgICAgICAgICAgICBzY29wZXM6IChfYSA9IHJlc3RPcHRpb25zLmF1ZGllbmNlKSAhPT0gbnVsbCAmJiBfYSAhPT0gdm9pZCAwID8gX2EgOiBTdG9yYWdlT0F1dGhTY29wZXMsXG4gICAgICAgICAgICAgICAgY2hhbGxlbmdlQ2FsbGJhY2tzOiB7IGF1dGhvcml6ZVJlcXVlc3RPbkNoYWxsZW5nZTogY29yZUNsaWVudC5hdXRob3JpemVSZXF1ZXN0T25UZW5hbnRDaGFsbGVuZ2UgfSxcbiAgICAgICAgICAgIH0pLCB7IHBoYXNlOiBcIlNpZ25cIiB9KTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIGlmIChjcmVkZW50aWFsIGluc3RhbmNlb2YgU3RvcmFnZVNoYXJlZEtleUNyZWRlbnRpYWwpIHtcbiAgICAgICAgICAgIGNvcmVQaXBlbGluZS5hZGRQb2xpY3koc3RvcmFnZVNoYXJlZEtleUNyZWRlbnRpYWxQb2xpY3koe1xuICAgICAgICAgICAgICAgIGFjY291bnROYW1lOiBjcmVkZW50aWFsLmFjY291bnROYW1lLFxuICAgICAgICAgICAgICAgIGFjY291bnRLZXk6IGNyZWRlbnRpYWwuYWNjb3VudEtleSxcbiAgICAgICAgICAgIH0pLCB7IHBoYXNlOiBcIlNpZ25cIiB9KTtcbiAgICAgICAgfVxuICAgICAgICBwaXBlbGluZS5fY29yZVBpcGVsaW5lID0gY29yZVBpcGVsaW5lO1xuICAgIH1cbiAgICByZXR1cm4gT2JqZWN0LmFzc2lnbihPYmplY3QuYXNzaWduKHt9LCByZXN0T3B0aW9ucyksIHsgYWxsb3dJbnNlY3VyZUNvbm5lY3Rpb246IHRydWUsIGh0dHBDbGllbnQsIHBpcGVsaW5lOiBjb3JlUGlwZWxpbmUgfSk7XG59XG5mdW5jdGlvbiBnZXRDcmVkZW50aWFsRnJvbVBpcGVsaW5lKHBpcGVsaW5lKSB7XG4gICAgLy8gc2VlIGlmIHdlIHNxdWlycmVsZWQgb25lIGF3YXkgb24gdGhlIHR5cGUgaXRzZWxmXG4gICAgaWYgKHBpcGVsaW5lLl9jcmVkZW50aWFsKSB7XG4gICAgICAgIHJldHVybiBwaXBlbGluZS5fY3JlZGVudGlhbDtcbiAgICB9XG4gICAgLy8gaWYgaXQgY2FtZSBmcm9tIGFub3RoZXIgcGFja2FnZSwgbG9vcCBvdmVyIHRoZSBmYWN0b3JpZXMgYW5kIGxvb2sgZm9yIG9uZSBsaWtlIGJlZm9yZVxuICAgIGxldCBjcmVkZW50aWFsID0gbmV3IEFub255bW91c0NyZWRlbnRpYWwoKTtcbiAgICBmb3IgKGNvbnN0IGZhY3Rvcnkgb2YgcGlwZWxpbmUuZmFjdG9yaWVzKSB7XG4gICAgICAgIGlmIChjb3JlQXV0aC5pc1Rva2VuQ3JlZGVudGlhbChmYWN0b3J5LmNyZWRlbnRpYWwpKSB7XG4gICAgICAgICAgICAvLyBPbmx5IHdvcmtzIGlmIHRoZSBmYWN0b3J5IGhhcyBiZWVuIGF0dGFjaGVkIGEgXCJjcmVkZW50aWFsXCIgcHJvcGVydHkuXG4gICAgICAgICAgICAvLyBXZSBkbyB0aGF0IGluIG5ld1BpcGVsaW5lKCkgd2hlbiB1c2luZyBUb2tlbkNyZWRlbnRpYWwuXG4gICAgICAgICAgICBjcmVkZW50aWFsID0gZmFjdG9yeS5jcmVkZW50aWFsO1xuICAgICAgICB9XG4gICAgICAgIGVsc2UgaWYgKGlzU3RvcmFnZVNoYXJlZEtleUNyZWRlbnRpYWwoZmFjdG9yeSkpIHtcbiAgICAgICAgICAgIHJldHVybiBmYWN0b3J5O1xuICAgICAgICB9XG4gICAgfVxuICAgIHJldHVybiBjcmVkZW50aWFsO1xufVxuZnVuY3Rpb24gaXNTdG9yYWdlU2hhcmVkS2V5Q3JlZGVudGlhbChmYWN0b3J5KSB7XG4gICAgaWYgKGZhY3RvcnkgaW5zdGFuY2VvZiBTdG9yYWdlU2hhcmVkS2V5Q3JlZGVudGlhbCkge1xuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG4gICAgcmV0dXJuIGZhY3RvcnkuY29uc3RydWN0b3IubmFtZSA9PT0gXCJTdG9yYWdlU2hhcmVkS2V5Q3JlZGVudGlhbFwiO1xufVxuZnVuY3Rpb24gaXNBbm9ueW1vdXNDcmVkZW50aWFsKGZhY3RvcnkpIHtcbiAgICBpZiAoZmFjdG9yeSBpbnN0YW5jZW9mIEFub255bW91c0NyZWRlbnRpYWwpIHtcbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuICAgIHJldHVybiBmYWN0b3J5LmNvbnN0cnVjdG9yLm5hbWUgPT09IFwiQW5vbnltb3VzQ3JlZGVudGlhbFwiO1xufVxuZnVuY3Rpb24gaXNDb3JlSHR0cEJlYXJlclRva2VuRmFjdG9yeShmYWN0b3J5KSB7XG4gICAgcmV0dXJuIGNvcmVBdXRoLmlzVG9rZW5DcmVkZW50aWFsKGZhY3RvcnkuY3JlZGVudGlhbCk7XG59XG5mdW5jdGlvbiBpc1N0b3JhZ2VCcm93c2VyUG9saWN5RmFjdG9yeShmYWN0b3J5KSB7XG4gICAgaWYgKGZhY3RvcnkgaW5zdGFuY2VvZiBTdG9yYWdlQnJvd3NlclBvbGljeUZhY3RvcnkpIHtcbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuICAgIHJldHVybiBmYWN0b3J5LmNvbnN0cnVjdG9yLm5hbWUgPT09IFwiU3RvcmFnZUJyb3dzZXJQb2xpY3lGYWN0b3J5XCI7XG59XG5mdW5jdGlvbiBpc1N0b3JhZ2VSZXRyeVBvbGljeUZhY3RvcnkoZmFjdG9yeSkge1xuICAgIGlmIChmYWN0b3J5IGluc3RhbmNlb2YgU3RvcmFnZVJldHJ5UG9saWN5RmFjdG9yeSkge1xuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG4gICAgcmV0dXJuIGZhY3RvcnkuY29uc3RydWN0b3IubmFtZSA9PT0gXCJTdG9yYWdlUmV0cnlQb2xpY3lGYWN0b3J5XCI7XG59XG5mdW5jdGlvbiBpc1N0b3JhZ2VUZWxlbWV0cnlQb2xpY3lGYWN0b3J5KGZhY3RvcnkpIHtcbiAgICByZXR1cm4gZmFjdG9yeS5jb25zdHJ1Y3Rvci5uYW1lID09PSBcIlRlbGVtZXRyeVBvbGljeUZhY3RvcnlcIjtcbn1cbmZ1bmN0aW9uIGlzSW5qZWN0b3JQb2xpY3lGYWN0b3J5KGZhY3RvcnkpIHtcbiAgICByZXR1cm4gZmFjdG9yeS5jb25zdHJ1Y3Rvci5uYW1lID09PSBcIkluamVjdG9yUG9saWN5RmFjdG9yeVwiO1xufVxuZnVuY3Rpb24gaXNDb3JlSHR0cFBvbGljeUZhY3RvcnkoZmFjdG9yeSkge1xuICAgIGNvbnN0IGtub3duUG9saWNpZXMgPSBbXG4gICAgICAgIFwiR2VuZXJhdGVDbGllbnRSZXF1ZXN0SWRQb2xpY3lcIixcbiAgICAgICAgXCJUcmFjaW5nUG9saWN5XCIsXG4gICAgICAgIFwiTG9nUG9saWN5XCIsXG4gICAgICAgIFwiUHJveHlQb2xpY3lcIixcbiAgICAgICAgXCJEaXNhYmxlUmVzcG9uc2VEZWNvbXByZXNzaW9uUG9saWN5XCIsXG4gICAgICAgIFwiS2VlcEFsaXZlUG9saWN5XCIsXG4gICAgICAgIFwiRGVzZXJpYWxpemF0aW9uUG9saWN5XCIsXG4gICAgXTtcbiAgICBjb25zdCBtb2NrSHR0cENsaWVudCA9IHtcbiAgICAgICAgc2VuZFJlcXVlc3Q6IGFzeW5jIChyZXF1ZXN0KSA9PiB7XG4gICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICAgIHJlcXVlc3QsXG4gICAgICAgICAgICAgICAgaGVhZGVyczogcmVxdWVzdC5oZWFkZXJzLmNsb25lKCksXG4gICAgICAgICAgICAgICAgc3RhdHVzOiA1MDAsXG4gICAgICAgICAgICB9O1xuICAgICAgICB9LFxuICAgIH07XG4gICAgY29uc3QgbW9ja1JlcXVlc3RQb2xpY3lPcHRpb25zID0ge1xuICAgICAgICBsb2coX2xvZ0xldmVsLCBfbWVzc2FnZSkge1xuICAgICAgICAgICAgLyogZG8gbm90aGluZyAqL1xuICAgICAgICB9LFxuICAgICAgICBzaG91bGRMb2coX2xvZ0xldmVsKSB7XG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgIH0sXG4gICAgfTtcbiAgICBjb25zdCBwb2xpY3lJbnN0YW5jZSA9IGZhY3RvcnkuY3JlYXRlKG1vY2tIdHRwQ2xpZW50LCBtb2NrUmVxdWVzdFBvbGljeU9wdGlvbnMpO1xuICAgIGNvbnN0IHBvbGljeU5hbWUgPSBwb2xpY3lJbnN0YW5jZS5jb25zdHJ1Y3Rvci5uYW1lO1xuICAgIC8vIGJ1bmRsZXJzIHNvbWV0aW1lcyBhZGQgYSBjdXN0b20gc3VmZml4IHRvIHRoZSBjbGFzcyBuYW1lIHRvIG1ha2UgaXQgdW5pcXVlXG4gICAgcmV0dXJuIGtub3duUG9saWNpZXMuc29tZSgoa25vd25Qb2xpY3lOYW1lKSA9PiB7XG4gICAgICAgIHJldHVybiBwb2xpY3lOYW1lLnN0YXJ0c1dpdGgoa25vd25Qb2xpY3lOYW1lKTtcbiAgICB9KTtcbn1cblxuLypcbiAqIENvcHlyaWdodCAoYykgTWljcm9zb2Z0IENvcnBvcmF0aW9uLlxuICogTGljZW5zZWQgdW5kZXIgdGhlIE1JVCBMaWNlbnNlLlxuICpcbiAqIENvZGUgZ2VuZXJhdGVkIGJ5IE1pY3Jvc29mdCAoUikgQXV0b1Jlc3QgQ29kZSBHZW5lcmF0b3IuXG4gKiBDaGFuZ2VzIG1heSBjYXVzZSBpbmNvcnJlY3QgYmVoYXZpb3IgYW5kIHdpbGwgYmUgbG9zdCBpZiB0aGUgY29kZSBpcyByZWdlbmVyYXRlZC5cbiAqL1xuY29uc3QgQmxvYlNlcnZpY2VQcm9wZXJ0aWVzID0ge1xuICAgIHNlcmlhbGl6ZWROYW1lOiBcIkJsb2JTZXJ2aWNlUHJvcGVydGllc1wiLFxuICAgIHhtbE5hbWU6IFwiU3RvcmFnZVNlcnZpY2VQcm9wZXJ0aWVzXCIsXG4gICAgdHlwZToge1xuICAgICAgICBuYW1lOiBcIkNvbXBvc2l0ZVwiLFxuICAgICAgICBjbGFzc05hbWU6IFwiQmxvYlNlcnZpY2VQcm9wZXJ0aWVzXCIsXG4gICAgICAgIG1vZGVsUHJvcGVydGllczoge1xuICAgICAgICAgICAgYmxvYkFuYWx5dGljc0xvZ2dpbmc6IHtcbiAgICAgICAgICAgICAgICBzZXJpYWxpemVkTmFtZTogXCJMb2dnaW5nXCIsXG4gICAgICAgICAgICAgICAgeG1sTmFtZTogXCJMb2dnaW5nXCIsXG4gICAgICAgICAgICAgICAgdHlwZToge1xuICAgICAgICAgICAgICAgICAgICBuYW1lOiBcIkNvbXBvc2l0ZVwiLFxuICAgICAgICAgICAgICAgICAgICBjbGFzc05hbWU6IFwiTG9nZ2luZ1wiLFxuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgaG91ck1ldHJpY3M6IHtcbiAgICAgICAgICAgICAgICBzZXJpYWxpemVkTmFtZTogXCJIb3VyTWV0cmljc1wiLFxuICAgICAgICAgICAgICAgIHhtbE5hbWU6IFwiSG91ck1ldHJpY3NcIixcbiAgICAgICAgICAgICAgICB0eXBlOiB7XG4gICAgICAgICAgICAgICAgICAgIG5hbWU6IFwiQ29tcG9zaXRlXCIsXG4gICAgICAgICAgICAgICAgICAgIGNsYXNzTmFtZTogXCJNZXRyaWNzXCIsXG4gICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBtaW51dGVNZXRyaWNzOiB7XG4gICAgICAgICAgICAgICAgc2VyaWFsaXplZE5hbWU6IFwiTWludXRlTWV0cmljc1wiLFxuICAgICAgICAgICAgICAgIHhtbE5hbWU6IFwiTWludXRlTWV0cmljc1wiLFxuICAgICAgICAgICAgICAgIHR5cGU6IHtcbiAgICAgICAgICAgICAgICAgICAgbmFtZTogXCJDb21wb3NpdGVcIixcbiAgICAgICAgICAgICAgICAgICAgY2xhc3NOYW1lOiBcIk1ldHJpY3NcIixcbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIGNvcnM6IHtcbiAgICAgICAgICAgICAgICBzZXJpYWxpemVkTmFtZTogXCJDb3JzXCIsXG4gICAgICAgICAgICAgICAgeG1sTmFtZTogXCJDb3JzXCIsXG4gICAgICAgICAgICAgICAgeG1sSXNXcmFwcGVkOiB0cnVlLFxuICAgICAgICAgICAgICAgIHhtbEVsZW1lbnROYW1lOiBcIkNvcnNSdWxlXCIsXG4gICAgICAgICAgICAgICAgdHlwZToge1xuICAgICAgICAgICAgICAgICAgICBuYW1lOiBcIlNlcXVlbmNlXCIsXG4gICAgICAgICAgICAgICAgICAgIGVsZW1lbnQ6IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHR5cGU6IHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBuYW1lOiBcIkNvbXBvc2l0ZVwiLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNsYXNzTmFtZTogXCJDb3JzUnVsZVwiLFxuICAgICAgICAgICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIGRlZmF1bHRTZXJ2aWNlVmVyc2lvbjoge1xuICAgICAgICAgICAgICAgIHNlcmlhbGl6ZWROYW1lOiBcIkRlZmF1bHRTZXJ2aWNlVmVyc2lvblwiLFxuICAgICAgICAgICAgICAgIHhtbE5hbWU6IFwiRGVmYXVsdFNlcnZpY2VWZXJzaW9uXCIsXG4gICAgICAgICAgICAgICAgdHlwZToge1xuICAgICAgICAgICAgICAgICAgICBuYW1lOiBcIlN0cmluZ1wiLFxuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgZGVsZXRlUmV0ZW50aW9uUG9saWN5OiB7XG4gICAgICAgICAgICAgICAgc2VyaWFsaXplZE5hbWU6IFwiRGVsZXRlUmV0ZW50aW9uUG9saWN5XCIsXG4gICAgICAgICAgICAgICAgeG1sTmFtZTogXCJEZWxldGVSZXRlbnRpb25Qb2xpY3lcIixcbiAgICAgICAgICAgICAgICB0eXBlOiB7XG4gICAgICAgICAgICAgICAgICAgIG5hbWU6IFwiQ29tcG9zaXRlXCIsXG4gICAgICAgICAgICAgICAgICAgIGNsYXNzTmFtZTogXCJSZXRlbnRpb25Qb2xpY3lcIixcbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIHN0YXRpY1dlYnNpdGU6IHtcbiAgICAgICAgICAgICAgICBzZXJpYWxpemVkTmFtZTogXCJTdGF0aWNXZWJzaXRlXCIsXG4gICAgICAgICAgICAgICAgeG1sTmFtZTogXCJTdGF0aWNXZWJzaXRlXCIsXG4gICAgICAgICAgICAgICAgdHlwZToge1xuICAgICAgICAgICAgICAgICAgICBuYW1lOiBcIkNvbXBvc2l0ZVwiLFxuICAgICAgICAgICAgICAgICAgICBjbGFzc05hbWU6IFwiU3RhdGljV2Vic2l0ZVwiLFxuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICB9LFxuICAgICAgICB9LFxuICAgIH0sXG59O1xuY29uc3QgTG9nZ2luZyA9IHtcbiAgICBzZXJpYWxpemVkTmFtZTogXCJMb2dnaW5nXCIsXG4gICAgdHlwZToge1xuICAgICAgICBuYW1lOiBcIkNvbXBvc2l0ZVwiLFxuICAgICAgICBjbGFzc05hbWU6IFwiTG9nZ2luZ1wiLFxuICAgICAgICBtb2RlbFByb3BlcnRpZXM6IHtcbiAgICAgICAgICAgIHZlcnNpb246IHtcbiAgICAgICAgICAgICAgICBzZXJpYWxpemVkTmFtZTogXCJWZXJzaW9uXCIsXG4gICAgICAgICAgICAgICAgcmVxdWlyZWQ6IHRydWUsXG4gICAgICAgICAgICAgICAgeG1sTmFtZTogXCJWZXJzaW9uXCIsXG4gICAgICAgICAgICAgICAgdHlwZToge1xuICAgICAgICAgICAgICAgICAgICBuYW1lOiBcIlN0cmluZ1wiLFxuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgZGVsZXRlUHJvcGVydHk6IHtcbiAgICAgICAgICAgICAgICBzZXJpYWxpemVkTmFtZTogXCJEZWxldGVcIixcbiAgICAgICAgICAgICAgICByZXF1aXJlZDogdHJ1ZSxcbiAgICAgICAgICAgICAgICB4bWxOYW1lOiBcIkRlbGV0ZVwiLFxuICAgICAgICAgICAgICAgIHR5cGU6IHtcbiAgICAgICAgICAgICAgICAgICAgbmFtZTogXCJCb29sZWFuXCIsXG4gICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICByZWFkOiB7XG4gICAgICAgICAgICAgICAgc2VyaWFsaXplZE5hbWU6IFwiUmVhZFwiLFxuICAgICAgICAgICAgICAgIHJlcXVpcmVkOiB0cnVlLFxuICAgICAgICAgICAgICAgIHhtbE5hbWU6IFwiUmVhZFwiLFxuICAgICAgICAgICAgICAgIHR5cGU6IHtcbiAgICAgICAgICAgICAgICAgICAgbmFtZTogXCJCb29sZWFuXCIsXG4gICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICB3cml0ZToge1xuICAgICAgICAgICAgICAgIHNlcmlhbGl6ZWROYW1lOiBcIldyaXRlXCIsXG4gICAgICAgICAgICAgICAgcmVxdWlyZWQ6IHRydWUsXG4gICAgICAgICAgICAgICAgeG1sTmFtZTogXCJXcml0ZVwiLFxuICAgICAgICAgICAgICAgIHR5cGU6IHtcbiAgICAgICAgICAgICAgICAgICAgbmFtZTogXCJCb29sZWFuXCIsXG4gICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICByZXRlbnRpb25Qb2xpY3k6IHtcbiAgICAgICAgICAgICAgICBzZXJpYWxpemVkTmFtZTogXCJSZXRlbnRpb25Qb2xpY3lcIixcbiAgICAgICAgICAgICAgICB4bWxOYW1lOiBcIlJldGVudGlvblBvbGljeVwiLFxuICAgICAgICAgICAgICAgIHR5cGU6IHtcbiAgICAgICAgICAgICAgICAgICAgbmFtZTogXCJDb21wb3NpdGVcIixcbiAgICAgICAgICAgICAgICAgICAgY2xhc3NOYW1lOiBcIlJldGVudGlvblBvbGljeVwiLFxuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICB9LFxuICAgICAgICB9LFxuICAgIH0sXG59O1xuY29uc3QgUmV0ZW50aW9uUG9saWN5ID0ge1xuICAgIHNlcmlhbGl6ZWROYW1lOiBcIlJldGVudGlvblBvbGljeVwiLFxuICAgIHR5cGU6IHtcbiAgICAgICAgbmFtZTogXCJDb21wb3NpdGVcIixcbiAgICAgICAgY2xhc3NOYW1lOiBcIlJldGVudGlvblBvbGljeVwiLFxuICAgICAgICBtb2RlbFByb3BlcnRpZXM6IHtcbiAgICAgICAgICAgIGVuYWJsZWQ6IHtcbiAgICAgICAgICAgICAgICBzZXJpYWxpemVkTmFtZTogXCJFbmFibGVkXCIsXG4gICAgICAgICAgICAgICAgcmVxdWlyZWQ6IHRydWUsXG4gICAgICAgICAgICAgICAgeG1sTmFtZTogXCJFbmFibGVkXCIsXG4gICAgICAgICAgICAgICAgdHlwZToge1xuICAgICAgICAgICAgICAgICAgICBuYW1lOiBcIkJvb2xlYW5cIixcbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIGRheXM6IHtcbiAgICAgICAgICAgICAgICBjb25zdHJhaW50czoge1xuICAgICAgICAgICAgICAgICAgICBJbmNsdXNpdmVNaW5pbXVtOiAxLFxuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgc2VyaWFsaXplZE5hbWU6IFwiRGF5c1wiLFxuICAgICAgICAgICAgICAgIHhtbE5hbWU6IFwiRGF5c1wiLFxuICAgICAgICAgICAgICAgIHR5cGU6IHtcbiAgICAgICAgICAgICAgICAgICAgbmFtZTogXCJOdW1iZXJcIixcbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgfSxcbiAgICAgICAgfSxcbiAgICB9LFxufTtcbmNvbnN0IE1ldHJpY3MgPSB7XG4gICAgc2VyaWFsaXplZE5hbWU6IFwiTWV0cmljc1wiLFxuICAgIHR5cGU6IHtcbiAgICAgICAgbmFtZTogXCJDb21wb3NpdGVcIixcbiAgICAgICAgY2xhc3NOYW1lOiBcIk1ldHJpY3NcIixcbiAgICAgICAgbW9kZWxQcm9wZXJ0aWVzOiB7XG4gICAgICAgICAgICB2ZXJzaW9uOiB7XG4gICAgICAgICAgICAgICAgc2VyaWFsaXplZE5hbWU6IFwiVmVyc2lvblwiLFxuICAgICAgICAgICAgICAgIHhtbE5hbWU6IFwiVmVyc2lvblwiLFxuICAgICAgICAgICAgICAgIHR5cGU6IHtcbiAgICAgICAgICAgICAgICAgICAgbmFtZTogXCJTdHJpbmdcIixcbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIGVuYWJsZWQ6IHtcbiAgICAgICAgICAgICAgICBzZXJpYWxpemVkTmFtZTogXCJFbmFibGVkXCIsXG4gICAgICAgICAgICAgICAgcmVxdWlyZWQ6IHRydWUsXG4gICAgICAgICAgICAgICAgeG1sTmFtZTogXCJFbmFibGVkXCIsXG4gICAgICAgICAgICAgICAgdHlwZToge1xuICAgICAgICAgICAgICAgICAgICBuYW1lOiBcIkJvb2xlYW5cIixcbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIGluY2x1ZGVBUElzOiB7XG4gICAgICAgICAgICAgICAgc2VyaWFsaXplZE5hbWU6IFwiSW5jbHVkZUFQSXNcIixcbiAgICAgICAgICAgICAgICB4bWxOYW1lOiBcIkluY2x1ZGVBUElzXCIsXG4gICAgICAgICAgICAgICAgdHlwZToge1xuICAgICAgICAgICAgICAgICAgICBuYW1lOiBcIkJvb2xlYW5cIixcbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIHJldGVudGlvblBvbGljeToge1xuICAgICAgICAgICAgICAgIHNlcmlhbGl6ZWROYW1lOiBcIlJldGVudGlvblBvbGljeVwiLFxuICAgICAgICAgICAgICAgIHhtbE5hbWU6IFwiUmV0ZW50aW9uUG9saWN5XCIsXG4gICAgICAgICAgICAgICAgdHlwZToge1xuICAgICAgICAgICAgICAgICAgICBuYW1lOiBcIkNvbXBvc2l0ZVwiLFxuICAgICAgICAgICAgICAgICAgICBjbGFzc05hbWU6IFwiUmV0ZW50aW9uUG9saWN5XCIsXG4gICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIH0sXG4gICAgICAgIH0sXG4gICAgfSxcbn07XG5jb25zdCBDb3JzUnVsZSA9IHtcbiAgICBzZXJpYWxpemVkTmFtZTogXCJDb3JzUnVsZVwiLFxuICAgIHR5cGU6IHtcbiAgICAgICAgbmFtZTogXCJDb21wb3NpdGVcIixcbiAgICAgICAgY2xhc3NOYW1lOiBcIkNvcnNSdWxlXCIsXG4gICAgICAgIG1vZGVsUHJvcGVydGllczoge1xuICAgICAgICAgICAgYWxsb3dlZE9yaWdpbnM6IHtcbiAgICAgICAgICAgICAgICBzZXJpYWxpemVkTmFtZTogXCJBbGxvd2VkT3JpZ2luc1wiLFxuICAgICAgICAgICAgICAgIHJlcXVpcmVkOiB0cnVlLFxuICAgICAgICAgICAgICAgIHhtbE5hbWU6IFwiQWxsb3dlZE9yaWdpbnNcIixcbiAgICAgICAgICAgICAgICB0eXBlOiB7XG4gICAgICAgICAgICAgICAgICAgIG5hbWU6IFwiU3RyaW5nXCIsXG4gICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBhbGxvd2VkTWV0aG9kczoge1xuICAgICAgICAgICAgICAgIHNlcmlhbGl6ZWROYW1lOiBcIkFsbG93ZWRNZXRob2RzXCIsXG4gICAgICAgICAgICAgICAgcmVxdWlyZWQ6IHRydWUsXG4gICAgICAgICAgICAgICAgeG1sTmFtZTogXCJBbGxvd2VkTWV0aG9kc1wiLFxuICAgICAgICAgICAgICAgIHR5cGU6IHtcbiAgICAgICAgICAgICAgICAgICAgbmFtZTogXCJTdHJpbmdcIixcbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIGFsbG93ZWRIZWFkZXJzOiB7XG4gICAgICAgICAgICAgICAgc2VyaWFsaXplZE5hbWU6IFwiQWxsb3dlZEhlYWRlcnNcIixcbiAgICAgICAgICAgICAgICByZXF1aXJlZDogdHJ1ZSxcbiAgICAgICAgICAgICAgICB4bWxOYW1lOiBcIkFsbG93ZWRIZWFkZXJzXCIsXG4gICAgICAgICAgICAgICAgdHlwZToge1xuICAgICAgICAgICAgICAgICAgICBuYW1lOiBcIlN0cmluZ1wiLFxuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgZXhwb3NlZEhlYWRlcnM6IHtcbiAgICAgICAgICAgICAgICBzZXJpYWxpemVkTmFtZTogXCJFeHBvc2VkSGVhZGVyc1wiLFxuICAgICAgICAgICAgICAgIHJlcXVpcmVkOiB0cnVlLFxuICAgICAgICAgICAgICAgIHhtbE5hbWU6IFwiRXhwb3NlZEhlYWRlcnNcIixcbiAgICAgICAgICAgICAgICB0eXBlOiB7XG4gICAgICAgICAgICAgICAgICAgIG5hbWU6IFwiU3RyaW5nXCIsXG4gICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBtYXhBZ2VJblNlY29uZHM6IHtcbiAgICAgICAgICAgICAgICBjb25zdHJhaW50czoge1xuICAgICAgICAgICAgICAgICAgICBJbmNsdXNpdmVNaW5pbXVtOiAwLFxuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgc2VyaWFsaXplZE5hbWU6IFwiTWF4QWdlSW5TZWNvbmRzXCIsXG4gICAgICAgICAgICAgICAgcmVxdWlyZWQ6IHRydWUsXG4gICAgICAgICAgICAgICAgeG1sTmFtZTogXCJNYXhBZ2VJblNlY29uZHNcIixcbiAgICAgICAgICAgICAgICB0eXBlOiB7XG4gICAgICAgICAgICAgICAgICAgIG5hbWU6IFwiTnVtYmVyXCIsXG4gICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIH0sXG4gICAgICAgIH0sXG4gICAgfSxcbn07XG5jb25zdCBTdGF0aWNXZWJzaXRlID0ge1xuICAgIHNlcmlhbGl6ZWROYW1lOiBcIlN0YXRpY1dlYnNpdGVcIixcbiAgICB0eXBlOiB7XG4gICAgICAgIG5hbWU6IFwiQ29tcG9zaXRlXCIsXG4gICAgICAgIGNsYXNzTmFtZTogXCJTdGF0aWNXZWJzaXRlXCIsXG4gICAgICAgIG1vZGVsUHJvcGVydGllczoge1xuICAgICAgICAgICAgZW5hYmxlZDoge1xuICAgICAgICAgICAgICAgIHNlcmlhbGl6ZWROYW1lOiBcIkVuYWJsZWRcIixcbiAgICAgICAgICAgICAgICByZXF1aXJlZDogdHJ1ZSxcbiAgICAgICAgICAgICAgICB4bWxOYW1lOiBcIkVuYWJsZWRcIixcbiAgICAgICAgICAgICAgICB0eXBlOiB7XG4gICAgICAgICAgICAgICAgICAgIG5hbWU6IFwiQm9vbGVhblwiLFxuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgaW5kZXhEb2N1bWVudDoge1xuICAgICAgICAgICAgICAgIHNlcmlhbGl6ZWROYW1lOiBcIkluZGV4RG9jdW1lbnRcIixcbiAgICAgICAgICAgICAgICB4bWxOYW1lOiBcIkluZGV4RG9jdW1lbnRcIixcbiAgICAgICAgICAgICAgICB0eXBlOiB7XG4gICAgICAgICAgICAgICAgICAgIG5hbWU6IFwiU3RyaW5nXCIsXG4gICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBlcnJvckRvY3VtZW50NDA0UGF0aDoge1xuICAgICAgICAgICAgICAgIHNlcmlhbGl6ZWROYW1lOiBcIkVycm9yRG9jdW1lbnQ0MDRQYXRoXCIsXG4gICAgICAgICAgICAgICAgeG1sTmFtZTogXCJFcnJvckRvY3VtZW50NDA0UGF0aFwiLFxuICAgICAgICAgICAgICAgIHR5cGU6IHtcbiAgICAgICAgICAgICAgICAgICAgbmFtZTogXCJTdHJpbmdcIixcbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIGRlZmF1bHRJbmRleERvY3VtZW50UGF0aDoge1xuICAgICAgICAgICAgICAgIHNlcmlhbGl6ZWROYW1lOiBcIkRlZmF1bHRJbmRleERvY3VtZW50UGF0aFwiLFxuICAgICAgICAgICAgICAgIHhtbE5hbWU6IFwiRGVmYXVsdEluZGV4RG9jdW1lbnRQYXRoXCIsXG4gICAgICAgICAgICAgICAgdHlwZToge1xuICAgICAgICAgICAgICAgICAgICBuYW1lOiBcIlN0cmluZ1wiLFxuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICB9LFxuICAgICAgICB9LFxuICAgIH0sXG59O1xuY29uc3QgU3RvcmFnZUVycm9yID0ge1xuICAgIHNlcmlhbGl6ZWROYW1lOiBcIlN0b3JhZ2VFcnJvclwiLFxuICAgIHR5cGU6IHtcbiAgICAgICAgbmFtZTogXCJDb21wb3NpdGVcIixcbiAgICAgICAgY2xhc3NOYW1lOiBcIlN0b3JhZ2VFcnJvclwiLFxuICAgICAgICBtb2RlbFByb3BlcnRpZXM6IHtcbiAgICAgICAgICAgIG1lc3NhZ2U6IHtcbiAgICAgICAgICAgICAgICBzZXJpYWxpemVkTmFtZTogXCJNZXNzYWdlXCIsXG4gICAgICAgICAgICAgICAgeG1sTmFtZTogXCJNZXNzYWdlXCIsXG4gICAgICAgICAgICAgICAgdHlwZToge1xuICAgICAgICAgICAgICAgICAgICBuYW1lOiBcIlN0cmluZ1wiLFxuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgY29kZToge1xuICAgICAgICAgICAgICAgIHNlcmlhbGl6ZWROYW1lOiBcIkNvZGVcIixcbiAgICAgICAgICAgICAgICB4bWxOYW1lOiBcIkNvZGVcIixcbiAgICAgICAgICAgICAgICB0eXBlOiB7XG4gICAgICAgICAgICAgICAgICAgIG5hbWU6IFwiU3RyaW5nXCIsXG4gICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBhdXRoZW50aWNhdGlvbkVycm9yRGV0YWlsOiB7XG4gICAgICAgICAgICAgICAgc2VyaWFsaXplZE5hbWU6IFwiQXV0aGVudGljYXRpb25FcnJvckRldGFpbFwiLFxuICAgICAgICAgICAgICAgIHhtbE5hbWU6IFwiQXV0aGVudGljYXRpb25FcnJvckRldGFpbFwiLFxuICAgICAgICAgICAgICAgIHR5cGU6IHtcbiAgICAgICAgICAgICAgICAgICAgbmFtZTogXCJTdHJpbmdcIixcbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgfSxcbiAgICAgICAgfSxcbiAgICB9LFxufTtcbmNvbnN0IEJsb2JTZXJ2aWNlU3RhdGlzdGljcyA9IHtcbiAgICBzZXJpYWxpemVkTmFtZTogXCJCbG9iU2VydmljZVN0YXRpc3RpY3NcIixcbiAgICB4bWxOYW1lOiBcIlN0b3JhZ2VTZXJ2aWNlU3RhdHNcIixcbiAgICB0eXBlOiB7XG4gICAgICAgIG5hbWU6IFwiQ29tcG9zaXRlXCIsXG4gICAgICAgIGNsYXNzTmFtZTogXCJCbG9iU2VydmljZVN0YXRpc3RpY3NcIixcbiAgICAgICAgbW9kZWxQcm9wZXJ0aWVzOiB7XG4gICAgICAgICAgICBnZW9SZXBsaWNhdGlvbjoge1xuICAgICAgICAgICAgICAgIHNlcmlhbGl6ZWROYW1lOiBcIkdlb1JlcGxpY2F0aW9uXCIsXG4gICAgICAgICAgICAgICAgeG1sTmFtZTogXCJHZW9SZXBsaWNhdGlvblwiLFxuICAgICAgICAgICAgICAgIHR5cGU6IHtcbiAgICAgICAgICAgICAgICAgICAgbmFtZTogXCJDb21wb3NpdGVcIixcbiAgICAgICAgICAgICAgICAgICAgY2xhc3NOYW1lOiBcIkdlb1JlcGxpY2F0aW9uXCIsXG4gICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIH0sXG4gICAgICAgIH0sXG4gICAgfSxcbn07XG5jb25zdCBHZW9SZXBsaWNhdGlvbiA9IHtcbiAgICBzZXJpYWxpemVkTmFtZTogXCJHZW9SZXBsaWNhdGlvblwiLFxuICAgIHR5cGU6IHtcbiAgICAgICAgbmFtZTogXCJDb21wb3NpdGVcIixcbiAgICAgICAgY2xhc3NOYW1lOiBcIkdlb1JlcGxpY2F0aW9uXCIsXG4gICAgICAgIG1vZGVsUHJvcGVydGllczoge1xuICAgICAgICAgICAgc3RhdHVzOiB7XG4gICAgICAgICAgICAgICAgc2VyaWFsaXplZE5hbWU6IFwiU3RhdHVzXCIsXG4gICAgICAgICAgICAgICAgcmVxdWlyZWQ6IHRydWUsXG4gICAgICAgICAgICAgICAgeG1sTmFtZTogXCJTdGF0dXNcIixcbiAgICAgICAgICAgICAgICB0eXBlOiB7XG4gICAgICAgICAgICAgICAgICAgIG5hbWU6IFwiRW51bVwiLFxuICAgICAgICAgICAgICAgICAgICBhbGxvd2VkVmFsdWVzOiBbXCJsaXZlXCIsIFwiYm9vdHN0cmFwXCIsIFwidW5hdmFpbGFibGVcIl0sXG4gICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBsYXN0U3luY09uOiB7XG4gICAgICAgICAgICAgICAgc2VyaWFsaXplZE5hbWU6IFwiTGFzdFN5bmNUaW1lXCIsXG4gICAgICAgICAgICAgICAgcmVxdWlyZWQ6IHRydWUsXG4gICAgICAgICAgICAgICAgeG1sTmFtZTogXCJMYXN0U3luY1RpbWVcIixcbiAgICAgICAgICAgICAgICB0eXBlOiB7XG4gICAgICAgICAgICAgICAgICAgIG5hbWU6IFwiRGF0ZVRpbWVSZmMxMTIzXCIsXG4gICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIH0sXG4gICAgICAgIH0sXG4gICAgfSxcbn07XG5jb25zdCBMaXN0Q29udGFpbmVyc1NlZ21lbnRSZXNwb25zZSA9IHtcbiAgICBzZXJpYWxpemVkTmFtZTogXCJMaXN0Q29udGFpbmVyc1NlZ21lbnRSZXNwb25zZVwiLFxuICAgIHhtbE5hbWU6IFwiRW51bWVyYXRpb25SZXN1bHRzXCIsXG4gICAgdHlwZToge1xuICAgICAgICBuYW1lOiBcIkNvbXBvc2l0ZVwiLFxuICAgICAgICBjbGFzc05hbWU6IFwiTGlzdENvbnRhaW5lcnNTZWdtZW50UmVzcG9uc2VcIixcbiAgICAgICAgbW9kZWxQcm9wZXJ0aWVzOiB7XG4gICAgICAgICAgICBzZXJ2aWNlRW5kcG9pbnQ6IHtcbiAgICAgICAgICAgICAgICBzZXJpYWxpemVkTmFtZTogXCJTZXJ2aWNlRW5kcG9pbnRcIixcbiAgICAgICAgICAgICAgICByZXF1aXJlZDogdHJ1ZSxcbiAgICAgICAgICAgICAgICB4bWxOYW1lOiBcIlNlcnZpY2VFbmRwb2ludFwiLFxuICAgICAgICAgICAgICAgIHhtbElzQXR0cmlidXRlOiB0cnVlLFxuICAgICAgICAgICAgICAgIHR5cGU6IHtcbiAgICAgICAgICAgICAgICAgICAgbmFtZTogXCJTdHJpbmdcIixcbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIHByZWZpeDoge1xuICAgICAgICAgICAgICAgIHNlcmlhbGl6ZWROYW1lOiBcIlByZWZpeFwiLFxuICAgICAgICAgICAgICAgIHhtbE5hbWU6IFwiUHJlZml4XCIsXG4gICAgICAgICAgICAgICAgdHlwZToge1xuICAgICAgICAgICAgICAgICAgICBuYW1lOiBcIlN0cmluZ1wiLFxuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgbWFya2VyOiB7XG4gICAgICAgICAgICAgICAgc2VyaWFsaXplZE5hbWU6IFwiTWFya2VyXCIsXG4gICAgICAgICAgICAgICAgeG1sTmFtZTogXCJNYXJrZXJcIixcbiAgICAgICAgICAgICAgICB0eXBlOiB7XG4gICAgICAgICAgICAgICAgICAgIG5hbWU6IFwiU3RyaW5nXCIsXG4gICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBtYXhQYWdlU2l6ZToge1xuICAgICAgICAgICAgICAgIHNlcmlhbGl6ZWROYW1lOiBcIk1heFJlc3VsdHNcIixcbiAgICAgICAgICAgICAgICB4bWxOYW1lOiBcIk1heFJlc3VsdHNcIixcbiAgICAgICAgICAgICAgICB0eXBlOiB7XG4gICAgICAgICAgICAgICAgICAgIG5hbWU6IFwiTnVtYmVyXCIsXG4gICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBjb250YWluZXJJdGVtczoge1xuICAgICAgICAgICAgICAgIHNlcmlhbGl6ZWROYW1lOiBcIkNvbnRhaW5lckl0ZW1zXCIsXG4gICAgICAgICAgICAgICAgcmVxdWlyZWQ6IHRydWUsXG4gICAgICAgICAgICAgICAgeG1sTmFtZTogXCJDb250YWluZXJzXCIsXG4gICAgICAgICAgICAgICAgeG1sSXNXcmFwcGVkOiB0cnVlLFxuICAgICAgICAgICAgICAgIHhtbEVsZW1lbnROYW1lOiBcIkNvbnRhaW5lclwiLFxuICAgICAgICAgICAgICAgIHR5cGU6IHtcbiAgICAgICAgICAgICAgICAgICAgbmFtZTogXCJTZXF1ZW5jZVwiLFxuICAgICAgICAgICAgICAgICAgICBlbGVtZW50OiB7XG4gICAgICAgICAgICAgICAgICAgICAgICB0eXBlOiB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgbmFtZTogXCJDb21wb3NpdGVcIixcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbGFzc05hbWU6IFwiQ29udGFpbmVySXRlbVwiLFxuICAgICAgICAgICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIGNvbnRpbnVhdGlvblRva2VuOiB7XG4gICAgICAgICAgICAgICAgc2VyaWFsaXplZE5hbWU6IFwiTmV4dE1hcmtlclwiLFxuICAgICAgICAgICAgICAgIHhtbE5hbWU6IFwiTmV4dE1hcmtlclwiLFxuICAgICAgICAgICAgICAgIHR5cGU6IHtcbiAgICAgICAgICAgICAgICAgICAgbmFtZTogXCJTdHJpbmdcIixcbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgfSxcbiAgICAgICAgfSxcbiAgICB9LFxufTtcbmNvbnN0IENvbnRhaW5lckl0ZW0gPSB7XG4gICAgc2VyaWFsaXplZE5hbWU6IFwiQ29udGFpbmVySXRlbVwiLFxuICAgIHhtbE5hbWU6IFwiQ29udGFpbmVyXCIsXG4gICAgdHlwZToge1xuICAgICAgICBuYW1lOiBcIkNvbXBvc2l0ZVwiLFxuICAgICAgICBjbGFzc05hbWU6IFwiQ29udGFpbmVySXRlbVwiLFxuICAgICAgICBtb2RlbFByb3BlcnRpZXM6IHtcbiAgICAgICAgICAgIG5hbWU6IHtcbiAgICAgICAgICAgICAgICBzZXJpYWxpemVkTmFtZTogXCJOYW1lXCIsXG4gICAgICAgICAgICAgICAgcmVxdWlyZWQ6IHRydWUsXG4gICAgICAgICAgICAgICAgeG1sTmFtZTogXCJOYW1lXCIsXG4gICAgICAgICAgICAgICAgdHlwZToge1xuICAgICAgICAgICAgICAgICAgICBuYW1lOiBcIlN0cmluZ1wiLFxuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgZGVsZXRlZDoge1xuICAgICAgICAgICAgICAgIHNlcmlhbGl6ZWROYW1lOiBcIkRlbGV0ZWRcIixcbiAgICAgICAgICAgICAgICB4bWxOYW1lOiBcIkRlbGV0ZWRcIixcbiAgICAgICAgICAgICAgICB0eXBlOiB7XG4gICAgICAgICAgICAgICAgICAgIG5hbWU6IFwiQm9vbGVhblwiLFxuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgdmVyc2lvbjoge1xuICAgICAgICAgICAgICAgIHNlcmlhbGl6ZWROYW1lOiBcIlZlcnNpb25cIixcbiAgICAgICAgICAgICAgICB4bWxOYW1lOiBcIlZlcnNpb25cIixcbiAgICAgICAgICAgICAgICB0eXBlOiB7XG4gICAgICAgICAgICAgICAgICAgIG5hbWU6IFwiU3RyaW5nXCIsXG4gICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBwcm9wZXJ0aWVzOiB7XG4gICAgICAgICAgICAgICAgc2VyaWFsaXplZE5hbWU6IFwiUHJvcGVydGllc1wiLFxuICAgICAgICAgICAgICAgIHhtbE5hbWU6IFwiUHJvcGVydGllc1wiLFxuICAgICAgICAgICAgICAgIHR5cGU6IHtcbiAgICAgICAgICAgICAgICAgICAgbmFtZTogXCJDb21wb3NpdGVcIixcbiAgICAgICAgICAgICAgICAgICAgY2xhc3NOYW1lOiBcIkNvbnRhaW5lclByb3BlcnRpZXNcIixcbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIG1ldGFkYXRhOiB7XG4gICAgICAgICAgICAgICAgc2VyaWFsaXplZE5hbWU6IFwiTWV0YWRhdGFcIixcbiAgICAgICAgICAgICAgICB4bWxOYW1lOiBcIk1ldGFkYXRhXCIsXG4gICAgICAgICAgICAgICAgdHlwZToge1xuICAgICAgICAgICAgICAgICAgICBuYW1lOiBcIkRpY3Rpb25hcnlcIixcbiAgICAgICAgICAgICAgICAgICAgdmFsdWU6IHsgdHlwZTogeyBuYW1lOiBcIlN0cmluZ1wiIH0gfSxcbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgfSxcbiAgICAgICAgfSxcbiAgICB9LFxufTtcbmNvbnN0IENvbnRhaW5lclByb3BlcnRpZXMgPSB7XG4gICAgc2VyaWFsaXplZE5hbWU6IFwiQ29udGFpbmVyUHJvcGVydGllc1wiLFxuICAgIHR5cGU6IHtcbiAgICAgICAgbmFtZTogXCJDb21wb3NpdGVcIixcbiAgICAgICAgY2xhc3NOYW1lOiBcIkNvbnRhaW5lclByb3BlcnRpZXNcIixcbiAgICAgICAgbW9kZWxQcm9wZXJ0aWVzOiB7XG4gICAgICAgICAgICBsYXN0TW9kaWZpZWQ6IHtcbiAgICAgICAgICAgICAgICBzZXJpYWxpemVkTmFtZTogXCJMYXN0LU1vZGlmaWVkXCIsXG4gICAgICAgICAgICAgICAgcmVxdWlyZWQ6IHRydWUsXG4gICAgICAgICAgICAgICAgeG1sTmFtZTogXCJMYXN0LU1vZGlmaWVkXCIsXG4gICAgICAgICAgICAgICAgdHlwZToge1xuICAgICAgICAgICAgICAgICAgICBuYW1lOiBcIkRhdGVUaW1lUmZjMTEyM1wiLFxuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgZXRhZzoge1xuICAgICAgICAgICAgICAgIHNlcmlhbGl6ZWROYW1lOiBcIkV0YWdcIixcbiAgICAgICAgICAgICAgICByZXF1aXJlZDogdHJ1ZSxcbiAgICAgICAgICAgICAgICB4bWxOYW1lOiBcIkV0YWdcIixcbiAgICAgICAgICAgICAgICB0eXBlOiB7XG4gICAgICAgICAgICAgICAgICAgIG5hbWU6IFwiU3RyaW5nXCIsXG4gICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBsZWFzZVN0YXR1czoge1xuICAgICAgICAgICAgICAgIHNlcmlhbGl6ZWROYW1lOiBcIkxlYXNlU3RhdHVzXCIsXG4gICAgICAgICAgICAgICAgeG1sTmFtZTogXCJMZWFzZVN0YXR1c1wiLFxuICAgICAgICAgICAgICAgIHR5cGU6IHtcbiAgICAgICAgICAgICAgICAgICAgbmFtZTogXCJFbnVtXCIsXG4gICAgICAgICAgICAgICAgICAgIGFsbG93ZWRWYWx1ZXM6IFtcImxvY2tlZFwiLCBcInVubG9ja2VkXCJdLFxuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgbGVhc2VTdGF0ZToge1xuICAgICAgICAgICAgICAgIHNlcmlhbGl6ZWROYW1lOiBcIkxlYXNlU3RhdGVcIixcbiAgICAgICAgICAgICAgICB4bWxOYW1lOiBcIkxlYXNlU3RhdGVcIixcbiAgICAgICAgICAgICAgICB0eXBlOiB7XG4gICAgICAgICAgICAgICAgICAgIG5hbWU6IFwiRW51bVwiLFxuICAgICAgICAgICAgICAgICAgICBhbGxvd2VkVmFsdWVzOiBbXG4gICAgICAgICAgICAgICAgICAgICAgICBcImF2YWlsYWJsZVwiLFxuICAgICAgICAgICAgICAgICAgICAgICAgXCJsZWFzZWRcIixcbiAgICAgICAgICAgICAgICAgICAgICAgIFwiZXhwaXJlZFwiLFxuICAgICAgICAgICAgICAgICAgICAgICAgXCJicmVha2luZ1wiLFxuICAgICAgICAgICAgICAgICAgICAgICAgXCJicm9rZW5cIixcbiAgICAgICAgICAgICAgICAgICAgXSxcbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIGxlYXNlRHVyYXRpb246IHtcbiAgICAgICAgICAgICAgICBzZXJpYWxpemVkTmFtZTogXCJMZWFzZUR1cmF0aW9uXCIsXG4gICAgICAgICAgICAgICAgeG1sTmFtZTogXCJMZWFzZUR1cmF0aW9uXCIsXG4gICAgICAgICAgICAgICAgdHlwZToge1xuICAgICAgICAgICAgICAgICAgICBuYW1lOiBcIkVudW1cIixcbiAgICAgICAgICAgICAgICAgICAgYWxsb3dlZFZhbHVlczogW1wiaW5maW5pdGVcIiwgXCJmaXhlZFwiXSxcbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIHB1YmxpY0FjY2Vzczoge1xuICAgICAgICAgICAgICAgIHNlcmlhbGl6ZWROYW1lOiBcIlB1YmxpY0FjY2Vzc1wiLFxuICAgICAgICAgICAgICAgIHhtbE5hbWU6IFwiUHVibGljQWNjZXNzXCIsXG4gICAgICAgICAgICAgICAgdHlwZToge1xuICAgICAgICAgICAgICAgICAgICBuYW1lOiBcIkVudW1cIixcbiAgICAgICAgICAgICAgICAgICAgYWxsb3dlZFZhbHVlczogW1wiY29udGFpbmVyXCIsIFwiYmxvYlwiXSxcbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIGhhc0ltbXV0YWJpbGl0eVBvbGljeToge1xuICAgICAgICAgICAgICAgIHNlcmlhbGl6ZWROYW1lOiBcIkhhc0ltbXV0YWJpbGl0eVBvbGljeVwiLFxuICAgICAgICAgICAgICAgIHhtbE5hbWU6IFwiSGFzSW1tdXRhYmlsaXR5UG9saWN5XCIsXG4gICAgICAgICAgICAgICAgdHlwZToge1xuICAgICAgICAgICAgICAgICAgICBuYW1lOiBcIkJvb2xlYW5cIixcbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIGhhc0xlZ2FsSG9sZDoge1xuICAgICAgICAgICAgICAgIHNlcmlhbGl6ZWROYW1lOiBcIkhhc0xlZ2FsSG9sZFwiLFxuICAgICAgICAgICAgICAgIHhtbE5hbWU6IFwiSGFzTGVnYWxIb2xkXCIsXG4gICAgICAgICAgICAgICAgdHlwZToge1xuICAgICAgICAgICAgICAgICAgICBuYW1lOiBcIkJvb2xlYW5cIixcbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIGRlZmF1bHRFbmNyeXB0aW9uU2NvcGU6IHtcbiAgICAgICAgICAgICAgICBzZXJpYWxpemVkTmFtZTogXCJEZWZhdWx0RW5jcnlwdGlvblNjb3BlXCIsXG4gICAgICAgICAgICAgICAgeG1sTmFtZTogXCJEZWZhdWx0RW5jcnlwdGlvblNjb3BlXCIsXG4gICAgICAgICAgICAgICAgdHlwZToge1xuICAgICAgICAgICAgICAgICAgICBuYW1lOiBcIlN0cmluZ1wiLFxuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgcHJldmVudEVuY3J5cHRpb25TY29wZU92ZXJyaWRlOiB7XG4gICAgICAgICAgICAgICAgc2VyaWFsaXplZE5hbWU6IFwiRGVueUVuY3J5cHRpb25TY29wZU92ZXJyaWRlXCIsXG4gICAgICAgICAgICAgICAgeG1sTmFtZTogXCJEZW55RW5jcnlwdGlvblNjb3BlT3ZlcnJpZGVcIixcbiAgICAgICAgICAgICAgICB0eXBlOiB7XG4gICAgICAgICAgICAgICAgICAgIG5hbWU6IFwiQm9vbGVhblwiLFxuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgZGVsZXRlZE9uOiB7XG4gICAgICAgICAgICAgICAgc2VyaWFsaXplZE5hbWU6IFwiRGVsZXRlZFRpbWVcIixcbiAgICAgICAgICAgICAgICB4bWxOYW1lOiBcIkRlbGV0ZWRUaW1lXCIsXG4gICAgICAgICAgICAgICAgdHlwZToge1xuICAgICAgICAgICAgICAgICAgICBuYW1lOiBcIkRhdGVUaW1lUmZjMTEyM1wiLFxuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgcmVtYWluaW5nUmV0ZW50aW9uRGF5czoge1xuICAgICAgICAgICAgICAgIHNlcmlhbGl6ZWROYW1lOiBcIlJlbWFpbmluZ1JldGVudGlvbkRheXNcIixcbiAgICAgICAgICAgICAgICB4bWxOYW1lOiBcIlJlbWFpbmluZ1JldGVudGlvbkRheXNcIixcbiAgICAgICAgICAgICAgICB0eXBlOiB7XG4gICAgICAgICAgICAgICAgICAgIG5hbWU6IFwiTnVtYmVyXCIsXG4gICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBpc0ltbXV0YWJsZVN0b3JhZ2VXaXRoVmVyc2lvbmluZ0VuYWJsZWQ6IHtcbiAgICAgICAgICAgICAgICBzZXJpYWxpemVkTmFtZTogXCJJbW11dGFibGVTdG9yYWdlV2l0aFZlcnNpb25pbmdFbmFibGVkXCIsXG4gICAgICAgICAgICAgICAgeG1sTmFtZTogXCJJbW11dGFibGVTdG9yYWdlV2l0aFZlcnNpb25pbmdFbmFibGVkXCIsXG4gICAgICAgICAgICAgICAgdHlwZToge1xuICAgICAgICAgICAgICAgICAgICBuYW1lOiBcIkJvb2xlYW5cIixcbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgfSxcbiAgICAgICAgfSxcbiAgICB9LFxufTtcbmNvbnN0IEtleUluZm8gPSB7XG4gICAgc2VyaWFsaXplZE5hbWU6IFwiS2V5SW5mb1wiLFxuICAgIHR5cGU6IHtcbiAgICAgICAgbmFtZTogXCJDb21wb3NpdGVcIixcbiAgICAgICAgY2xhc3NOYW1lOiBcIktleUluZm9cIixcbiAgICAgICAgbW9kZWxQcm9wZXJ0aWVzOiB7XG4gICAgICAgICAgICBzdGFydHNPbjoge1xuICAgICAgICAgICAgICAgIHNlcmlhbGl6ZWROYW1lOiBcIlN0YXJ0XCIsXG4gICAgICAgICAgICAgICAgcmVxdWlyZWQ6IHRydWUsXG4gICAgICAgICAgICAgICAgeG1sTmFtZTogXCJTdGFydFwiLFxuICAgICAgICAgICAgICAgIHR5cGU6IHtcbiAgICAgICAgICAgICAgICAgICAgbmFtZTogXCJTdHJpbmdcIixcbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIGV4cGlyZXNPbjoge1xuICAgICAgICAgICAgICAgIHNlcmlhbGl6ZWROYW1lOiBcIkV4cGlyeVwiLFxuICAgICAgICAgICAgICAgIHJlcXVpcmVkOiB0cnVlLFxuICAgICAgICAgICAgICAgIHhtbE5hbWU6IFwiRXhwaXJ5XCIsXG4gICAgICAgICAgICAgICAgdHlwZToge1xuICAgICAgICAgICAgICAgICAgICBuYW1lOiBcIlN0cmluZ1wiLFxuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICB9LFxuICAgICAgICB9LFxuICAgIH0sXG59O1xuY29uc3QgVXNlckRlbGVnYXRpb25LZXkgPSB7XG4gICAgc2VyaWFsaXplZE5hbWU6IFwiVXNlckRlbGVnYXRpb25LZXlcIixcbiAgICB0eXBlOiB7XG4gICAgICAgIG5hbWU6IFwiQ29tcG9zaXRlXCIsXG4gICAgICAgIGNsYXNzTmFtZTogXCJVc2VyRGVsZWdhdGlvbktleVwiLFxuICAgICAgICBtb2RlbFByb3BlcnRpZXM6IHtcbiAgICAgICAgICAgIHNpZ25lZE9iamVjdElkOiB7XG4gICAgICAgICAgICAgICAgc2VyaWFsaXplZE5hbWU6IFwiU2lnbmVkT2lkXCIsXG4gICAgICAgICAgICAgICAgcmVxdWlyZWQ6IHRydWUsXG4gICAgICAgICAgICAgICAgeG1sTmFtZTogXCJTaWduZWRPaWRcIixcbiAgICAgICAgICAgICAgICB0eXBlOiB7XG4gICAgICAgICAgICAgICAgICAgIG5hbWU6IFwiU3RyaW5nXCIsXG4gICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBzaWduZWRUZW5hbnRJZDoge1xuICAgICAgICAgICAgICAgIHNlcmlhbGl6ZWROYW1lOiBcIlNpZ25lZFRpZFwiLFxuICAgICAgICAgICAgICAgIHJlcXVpcmVkOiB0cnVlLFxuICAgICAgICAgICAgICAgIHhtbE5hbWU6IFwiU2lnbmVkVGlkXCIsXG4gICAgICAgICAgICAgICAgdHlwZToge1xuICAgICAgICAgICAgICAgICAgICBuYW1lOiBcIlN0cmluZ1wiLFxuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgc2lnbmVkU3RhcnRzT246IHtcbiAgICAgICAgICAgICAgICBzZXJpYWxpemVkTmFtZTogXCJTaWduZWRTdGFydFwiLFxuICAgICAgICAgICAgICAgIHJlcXVpcmVkOiB0cnVlLFxuICAgICAgICAgICAgICAgIHhtbE5hbWU6IFwiU2lnbmVkU3RhcnRcIixcbiAgICAgICAgICAgICAgICB0eXBlOiB7XG4gICAgICAgICAgICAgICAgICAgIG5hbWU6IFwiU3RyaW5nXCIsXG4gICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBzaWduZWRFeHBpcmVzT246IHtcbiAgICAgICAgICAgICAgICBzZXJpYWxpemVkTmFtZTogXCJTaWduZWRFeHBpcnlcIixcbiAgICAgICAgICAgICAgICByZXF1aXJlZDogdHJ1ZSxcbiAgICAgICAgICAgICAgICB4bWxOYW1lOiBcIlNpZ25lZEV4cGlyeVwiLFxuICAgICAgICAgICAgICAgIHR5cGU6IHtcbiAgICAgICAgICAgICAgICAgICAgbmFtZTogXCJTdHJpbmdcIixcbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIHNpZ25lZFNlcnZpY2U6IHtcbiAgICAgICAgICAgICAgICBzZXJpYWxpemVkTmFtZTogXCJTaWduZWRTZXJ2aWNlXCIsXG4gICAgICAgICAgICAgICAgcmVxdWlyZWQ6IHRydWUsXG4gICAgICAgICAgICAgICAgeG1sTmFtZTogXCJTaWduZWRTZXJ2aWNlXCIsXG4gICAgICAgICAgICAgICAgdHlwZToge1xuICAgICAgICAgICAgICAgICAgICBuYW1lOiBcIlN0cmluZ1wiLFxuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgc2lnbmVkVmVyc2lvbjoge1xuICAgICAgICAgICAgICAgIHNlcmlhbGl6ZWROYW1lOiBcIlNpZ25lZFZlcnNpb25cIixcbiAgICAgICAgICAgICAgICByZXF1aXJlZDogdHJ1ZSxcbiAgICAgICAgICAgICAgICB4bWxOYW1lOiBcIlNpZ25lZFZlcnNpb25cIixcbiAgICAgICAgICAgICAgICB0eXBlOiB7XG4gICAgICAgICAgICAgICAgICAgIG5hbWU6IFwiU3RyaW5nXCIsXG4gICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICB2YWx1ZToge1xuICAgICAgICAgICAgICAgIHNlcmlhbGl6ZWROYW1lOiBcIlZhbHVlXCIsXG4gICAgICAgICAgICAgICAgcmVxdWlyZWQ6IHRydWUsXG4gICAgICAgICAgICAgICAgeG1sTmFtZTogXCJWYWx1ZVwiLFxuICAgICAgICAgICAgICAgIHR5cGU6IHtcbiAgICAgICAgICAgICAgICAgICAgbmFtZTogXCJTdHJpbmdcIixcbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgfSxcbiAgICAgICAgfSxcbiAgICB9LFxufTtcbmNvbnN0IEZpbHRlckJsb2JTZWdtZW50ID0ge1xuICAgIHNlcmlhbGl6ZWROYW1lOiBcIkZpbHRlckJsb2JTZWdtZW50XCIsXG4gICAgeG1sTmFtZTogXCJFbnVtZXJhdGlvblJlc3VsdHNcIixcbiAgICB0eXBlOiB7XG4gICAgICAgIG5hbWU6IFwiQ29tcG9zaXRlXCIsXG4gICAgICAgIGNsYXNzTmFtZTogXCJGaWx0ZXJCbG9iU2VnbWVudFwiLFxuICAgICAgICBtb2RlbFByb3BlcnRpZXM6IHtcbiAgICAgICAgICAgIHNlcnZpY2VFbmRwb2ludDoge1xuICAgICAgICAgICAgICAgIHNlcmlhbGl6ZWROYW1lOiBcIlNlcnZpY2VFbmRwb2ludFwiLFxuICAgICAgICAgICAgICAgIHJlcXVpcmVkOiB0cnVlLFxuICAgICAgICAgICAgICAgIHhtbE5hbWU6IFwiU2VydmljZUVuZHBvaW50XCIsXG4gICAgICAgICAgICAgICAgeG1sSXNBdHRyaWJ1dGU6IHRydWUsXG4gICAgICAgICAgICAgICAgdHlwZToge1xuICAgICAgICAgICAgICAgICAgICBuYW1lOiBcIlN0cmluZ1wiLFxuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgd2hlcmU6IHtcbiAgICAgICAgICAgICAgICBzZXJpYWxpemVkTmFtZTogXCJXaGVyZVwiLFxuICAgICAgICAgICAgICAgIHJlcXVpcmVkOiB0cnVlLFxuICAgICAgICAgICAgICAgIHhtbE5hbWU6IFwiV2hlcmVcIixcbiAgICAgICAgICAgICAgICB0eXBlOiB7XG4gICAgICAgICAgICAgICAgICAgIG5hbWU6IFwiU3RyaW5nXCIsXG4gICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBibG9iczoge1xuICAgICAgICAgICAgICAgIHNlcmlhbGl6ZWROYW1lOiBcIkJsb2JzXCIsXG4gICAgICAgICAgICAgICAgcmVxdWlyZWQ6IHRydWUsXG4gICAgICAgICAgICAgICAgeG1sTmFtZTogXCJCbG9ic1wiLFxuICAgICAgICAgICAgICAgIHhtbElzV3JhcHBlZDogdHJ1ZSxcbiAgICAgICAgICAgICAgICB4bWxFbGVtZW50TmFtZTogXCJCbG9iXCIsXG4gICAgICAgICAgICAgICAgdHlwZToge1xuICAgICAgICAgICAgICAgICAgICBuYW1lOiBcIlNlcXVlbmNlXCIsXG4gICAgICAgICAgICAgICAgICAgIGVsZW1lbnQ6IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHR5cGU6IHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBuYW1lOiBcIkNvbXBvc2l0ZVwiLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNsYXNzTmFtZTogXCJGaWx0ZXJCbG9iSXRlbVwiLFxuICAgICAgICAgICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIGNvbnRpbnVhdGlvblRva2VuOiB7XG4gICAgICAgICAgICAgICAgc2VyaWFsaXplZE5hbWU6IFwiTmV4dE1hcmtlclwiLFxuICAgICAgICAgICAgICAgIHhtbE5hbWU6IFwiTmV4dE1hcmtlclwiLFxuICAgICAgICAgICAgICAgIHR5cGU6IHtcbiAgICAgICAgICAgICAgICAgICAgbmFtZTogXCJTdHJpbmdcIixcbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgfSxcbiAgICAgICAgfSxcbiAgICB9LFxufTtcbmNvbnN0IEZpbHRlckJsb2JJdGVtID0ge1xuICAgIHNlcmlhbGl6ZWROYW1lOiBcIkZpbHRlckJsb2JJdGVtXCIsXG4gICAgeG1sTmFtZTogXCJCbG9iXCIsXG4gICAgdHlwZToge1xuICAgICAgICBuYW1lOiBcIkNvbXBvc2l0ZVwiLFxuICAgICAgICBjbGFzc05hbWU6IFwiRmlsdGVyQmxvYkl0ZW1cIixcbiAgICAgICAgbW9kZWxQcm9wZXJ0aWVzOiB7XG4gICAgICAgICAgICBuYW1lOiB7XG4gICAgICAgICAgICAgICAgc2VyaWFsaXplZE5hbWU6IFwiTmFtZVwiLFxuICAgICAgICAgICAgICAgIHJlcXVpcmVkOiB0cnVlLFxuICAgICAgICAgICAgICAgIHhtbE5hbWU6IFwiTmFtZVwiLFxuICAgICAgICAgICAgICAgIHR5cGU6IHtcbiAgICAgICAgICAgICAgICAgICAgbmFtZTogXCJTdHJpbmdcIixcbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIGNvbnRhaW5lck5hbWU6IHtcbiAgICAgICAgICAgICAgICBzZXJpYWxpemVkTmFtZTogXCJDb250YWluZXJOYW1lXCIsXG4gICAgICAgICAgICAgICAgcmVxdWlyZWQ6IHRydWUsXG4gICAgICAgICAgICAgICAgeG1sTmFtZTogXCJDb250YWluZXJOYW1lXCIsXG4gICAgICAgICAgICAgICAgdHlwZToge1xuICAgICAgICAgICAgICAgICAgICBuYW1lOiBcIlN0cmluZ1wiLFxuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgdGFnczoge1xuICAgICAgICAgICAgICAgIHNlcmlhbGl6ZWROYW1lOiBcIlRhZ3NcIixcbiAgICAgICAgICAgICAgICB4bWxOYW1lOiBcIlRhZ3NcIixcbiAgICAgICAgICAgICAgICB0eXBlOiB7XG4gICAgICAgICAgICAgICAgICAgIG5hbWU6IFwiQ29tcG9zaXRlXCIsXG4gICAgICAgICAgICAgICAgICAgIGNsYXNzTmFtZTogXCJCbG9iVGFnc1wiLFxuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICB9LFxuICAgICAgICB9LFxuICAgIH0sXG59O1xuY29uc3QgQmxvYlRhZ3MgPSB7XG4gICAgc2VyaWFsaXplZE5hbWU6IFwiQmxvYlRhZ3NcIixcbiAgICB4bWxOYW1lOiBcIlRhZ3NcIixcbiAgICB0eXBlOiB7XG4gICAgICAgIG5hbWU6IFwiQ29tcG9zaXRlXCIsXG4gICAgICAgIGNsYXNzTmFtZTogXCJCbG9iVGFnc1wiLFxuICAgICAgICBtb2RlbFByb3BlcnRpZXM6IHtcbiAgICAgICAgICAgIGJsb2JUYWdTZXQ6IHtcbiAgICAgICAgICAgICAgICBzZXJpYWxpemVkTmFtZTogXCJCbG9iVGFnU2V0XCIsXG4gICAgICAgICAgICAgICAgcmVxdWlyZWQ6IHRydWUsXG4gICAgICAgICAgICAgICAgeG1sTmFtZTogXCJUYWdTZXRcIixcbiAgICAgICAgICAgICAgICB4bWxJc1dyYXBwZWQ6IHRydWUsXG4gICAgICAgICAgICAgICAgeG1sRWxlbWVudE5hbWU6IFwiVGFnXCIsXG4gICAgICAgICAgICAgICAgdHlwZToge1xuICAgICAgICAgICAgICAgICAgICBuYW1lOiBcIlNlcXVlbmNlXCIsXG4gICAgICAgICAgICAgICAgICAgIGVsZW1lbnQ6IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHR5cGU6IHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBuYW1lOiBcIkNvbXBvc2l0ZVwiLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNsYXNzTmFtZTogXCJCbG9iVGFnXCIsXG4gICAgICAgICAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICB9LFxuICAgICAgICB9LFxuICAgIH0sXG59O1xuY29uc3QgQmxvYlRhZyA9IHtcbiAgICBzZXJpYWxpemVkTmFtZTogXCJCbG9iVGFnXCIsXG4gICAgeG1sTmFtZTogXCJUYWdcIixcbiAgICB0eXBlOiB7XG4gICAgICAgIG5hbWU6IFwiQ29tcG9zaXRlXCIsXG4gICAgICAgIGNsYXNzTmFtZTogXCJCbG9iVGFnXCIsXG4gICAgICAgIG1vZGVsUHJvcGVydGllczoge1xuICAgICAgICAgICAga2V5OiB7XG4gICAgICAgICAgICAgICAgc2VyaWFsaXplZE5hbWU6IFwiS2V5XCIsXG4gICAgICAgICAgICAgICAgcmVxdWlyZWQ6IHRydWUsXG4gICAgICAgICAgICAgICAgeG1sTmFtZTogXCJLZXlcIixcbiAgICAgICAgICAgICAgICB0eXBlOiB7XG4gICAgICAgICAgICAgICAgICAgIG5hbWU6IFwiU3RyaW5nXCIsXG4gICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICB2YWx1ZToge1xuICAgICAgICAgICAgICAgIHNlcmlhbGl6ZWROYW1lOiBcIlZhbHVlXCIsXG4gICAgICAgICAgICAgICAgcmVxdWlyZWQ6IHRydWUsXG4gICAgICAgICAgICAgICAgeG1sTmFtZTogXCJWYWx1ZVwiLFxuICAgICAgICAgICAgICAgIHR5cGU6IHtcbiAgICAgICAgICAgICAgICAgICAgbmFtZTogXCJTdHJpbmdcIixcbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgfSxcbiAgICAgICAgfSxcbiAgICB9LFxufTtcbmNvbnN0IFNpZ25lZElkZW50aWZpZXIgPSB7XG4gICAgc2VyaWFsaXplZE5hbWU6IFwiU2lnbmVkSWRlbnRpZmllclwiLFxuICAgIHhtbE5hbWU6IFwiU2lnbmVkSWRlbnRpZmllclwiLFxuICAgIHR5cGU6IHtcbiAgICAgICAgbmFtZTogXCJDb21wb3NpdGVcIixcbiAgICAgICAgY2xhc3NOYW1lOiBcIlNpZ25lZElkZW50aWZpZXJcIixcbiAgICAgICAgbW9kZWxQcm9wZXJ0aWVzOiB7XG4gICAgICAgICAgICBpZDoge1xuICAgICAgICAgICAgICAgIHNlcmlhbGl6ZWROYW1lOiBcIklkXCIsXG4gICAgICAgICAgICAgICAgcmVxdWlyZWQ6IHRydWUsXG4gICAgICAgICAgICAgICAgeG1sTmFtZTogXCJJZFwiLFxuICAgICAgICAgICAgICAgIHR5cGU6IHtcbiAgICAgICAgICAgICAgICAgICAgbmFtZTogXCJTdHJpbmdcIixcbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIGFjY2Vzc1BvbGljeToge1xuICAgICAgICAgICAgICAgIHNlcmlhbGl6ZWROYW1lOiBcIkFjY2Vzc1BvbGljeVwiLFxuICAgICAgICAgICAgICAgIHhtbE5hbWU6IFwiQWNjZXNzUG9saWN5XCIsXG4gICAgICAgICAgICAgICAgdHlwZToge1xuICAgICAgICAgICAgICAgICAgICBuYW1lOiBcIkNvbXBvc2l0ZVwiLFxuICAgICAgICAgICAgICAgICAgICBjbGFzc05hbWU6IFwiQWNjZXNzUG9saWN5XCIsXG4gICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIH0sXG4gICAgICAgIH0sXG4gICAgfSxcbn07XG5jb25zdCBBY2Nlc3NQb2xpY3kgPSB7XG4gICAgc2VyaWFsaXplZE5hbWU6IFwiQWNjZXNzUG9saWN5XCIsXG4gICAgdHlwZToge1xuICAgICAgICBuYW1lOiBcIkNvbXBvc2l0ZVwiLFxuICAgICAgICBjbGFzc05hbWU6IFwiQWNjZXNzUG9saWN5XCIsXG4gICAgICAgIG1vZGVsUHJvcGVydGllczoge1xuICAgICAgICAgICAgc3RhcnRzT246IHtcbiAgICAgICAgICAgICAgICBzZXJpYWxpemVkTmFtZTogXCJTdGFydFwiLFxuICAgICAgICAgICAgICAgIHhtbE5hbWU6IFwiU3RhcnRcIixcbiAgICAgICAgICAgICAgICB0eXBlOiB7XG4gICAgICAgICAgICAgICAgICAgIG5hbWU6IFwiU3RyaW5nXCIsXG4gICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBleHBpcmVzT246IHtcbiAgICAgICAgICAgICAgICBzZXJpYWxpemVkTmFtZTogXCJFeHBpcnlcIixcbiAgICAgICAgICAgICAgICB4bWxOYW1lOiBcIkV4cGlyeVwiLFxuICAgICAgICAgICAgICAgIHR5cGU6IHtcbiAgICAgICAgICAgICAgICAgICAgbmFtZTogXCJTdHJpbmdcIixcbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIHBlcm1pc3Npb25zOiB7XG4gICAgICAgICAgICAgICAgc2VyaWFsaXplZE5hbWU6IFwiUGVybWlzc2lvblwiLFxuICAgICAgICAgICAgICAgIHhtbE5hbWU6IFwiUGVybWlzc2lvblwiLFxuICAgICAgICAgICAgICAgIHR5cGU6IHtcbiAgICAgICAgICAgICAgICAgICAgbmFtZTogXCJTdHJpbmdcIixcbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgfSxcbiAgICAgICAgfSxcbiAgICB9LFxufTtcbmNvbnN0IExpc3RCbG9ic0ZsYXRTZWdtZW50UmVzcG9uc2UgPSB7XG4gICAgc2VyaWFsaXplZE5hbWU6IFwiTGlzdEJsb2JzRmxhdFNlZ21lbnRSZXNwb25zZVwiLFxuICAgIHhtbE5hbWU6IFwiRW51bWVyYXRpb25SZXN1bHRzXCIsXG4gICAgdHlwZToge1xuICAgICAgICBuYW1lOiBcIkNvbXBvc2l0ZVwiLFxuICAgICAgICBjbGFzc05hbWU6IFwiTGlzdEJsb2JzRmxhdFNlZ21lbnRSZXNwb25zZVwiLFxuICAgICAgICBtb2RlbFByb3BlcnRpZXM6IHtcbiAgICAgICAgICAgIHNlcnZpY2VFbmRwb2ludDoge1xuICAgICAgICAgICAgICAgIHNlcmlhbGl6ZWROYW1lOiBcIlNlcnZpY2VFbmRwb2ludFwiLFxuICAgICAgICAgICAgICAgIHJlcXVpcmVkOiB0cnVlLFxuICAgICAgICAgICAgICAgIHhtbE5hbWU6IFwiU2VydmljZUVuZHBvaW50XCIsXG4gICAgICAgICAgICAgICAgeG1sSXNBdHRyaWJ1dGU6IHRydWUsXG4gICAgICAgICAgICAgICAgdHlwZToge1xuICAgICAgICAgICAgICAgICAgICBuYW1lOiBcIlN0cmluZ1wiLFxuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgY29udGFpbmVyTmFtZToge1xuICAgICAgICAgICAgICAgIHNlcmlhbGl6ZWROYW1lOiBcIkNvbnRhaW5lck5hbWVcIixcbiAgICAgICAgICAgICAgICByZXF1aXJlZDogdHJ1ZSxcbiAgICAgICAgICAgICAgICB4bWxOYW1lOiBcIkNvbnRhaW5lck5hbWVcIixcbiAgICAgICAgICAgICAgICB4bWxJc0F0dHJpYnV0ZTogdHJ1ZSxcbiAgICAgICAgICAgICAgICB0eXBlOiB7XG4gICAgICAgICAgICAgICAgICAgIG5hbWU6IFwiU3RyaW5nXCIsXG4gICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBwcmVmaXg6IHtcbiAgICAgICAgICAgICAgICBzZXJpYWxpemVkTmFtZTogXCJQcmVmaXhcIixcbiAgICAgICAgICAgICAgICB4bWxOYW1lOiBcIlByZWZpeFwiLFxuICAgICAgICAgICAgICAgIHR5cGU6IHtcbiAgICAgICAgICAgICAgICAgICAgbmFtZTogXCJTdHJpbmdcIixcbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIG1hcmtlcjoge1xuICAgICAgICAgICAgICAgIHNlcmlhbGl6ZWROYW1lOiBcIk1hcmtlclwiLFxuICAgICAgICAgICAgICAgIHhtbE5hbWU6IFwiTWFya2VyXCIsXG4gICAgICAgICAgICAgICAgdHlwZToge1xuICAgICAgICAgICAgICAgICAgICBuYW1lOiBcIlN0cmluZ1wiLFxuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgbWF4UGFnZVNpemU6IHtcbiAgICAgICAgICAgICAgICBzZXJpYWxpemVkTmFtZTogXCJNYXhSZXN1bHRzXCIsXG4gICAgICAgICAgICAgICAgeG1sTmFtZTogXCJNYXhSZXN1bHRzXCIsXG4gICAgICAgICAgICAgICAgdHlwZToge1xuICAgICAgICAgICAgICAgICAgICBuYW1lOiBcIk51bWJlclwiLFxuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgc2VnbWVudDoge1xuICAgICAgICAgICAgICAgIHNlcmlhbGl6ZWROYW1lOiBcIlNlZ21lbnRcIixcbiAgICAgICAgICAgICAgICB4bWxOYW1lOiBcIkJsb2JzXCIsXG4gICAgICAgICAgICAgICAgdHlwZToge1xuICAgICAgICAgICAgICAgICAgICBuYW1lOiBcIkNvbXBvc2l0ZVwiLFxuICAgICAgICAgICAgICAgICAgICBjbGFzc05hbWU6IFwiQmxvYkZsYXRMaXN0U2VnbWVudFwiLFxuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgY29udGludWF0aW9uVG9rZW46IHtcbiAgICAgICAgICAgICAgICBzZXJpYWxpemVkTmFtZTogXCJOZXh0TWFya2VyXCIsXG4gICAgICAgICAgICAgICAgeG1sTmFtZTogXCJOZXh0TWFya2VyXCIsXG4gICAgICAgICAgICAgICAgdHlwZToge1xuICAgICAgICAgICAgICAgICAgICBuYW1lOiBcIlN0cmluZ1wiLFxuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICB9LFxuICAgICAgICB9LFxuICAgIH0sXG59O1xuY29uc3QgQmxvYkZsYXRMaXN0U2VnbWVudCA9IHtcbiAgICBzZXJpYWxpemVkTmFtZTogXCJCbG9iRmxhdExpc3RTZWdtZW50XCIsXG4gICAgeG1sTmFtZTogXCJCbG9ic1wiLFxuICAgIHR5cGU6IHtcbiAgICAgICAgbmFtZTogXCJDb21wb3NpdGVcIixcbiAgICAgICAgY2xhc3NOYW1lOiBcIkJsb2JGbGF0TGlzdFNlZ21lbnRcIixcbiAgICAgICAgbW9kZWxQcm9wZXJ0aWVzOiB7XG4gICAgICAgICAgICBibG9iSXRlbXM6IHtcbiAgICAgICAgICAgICAgICBzZXJpYWxpemVkTmFtZTogXCJCbG9iSXRlbXNcIixcbiAgICAgICAgICAgICAgICByZXF1aXJlZDogdHJ1ZSxcbiAgICAgICAgICAgICAgICB4bWxOYW1lOiBcIkJsb2JJdGVtc1wiLFxuICAgICAgICAgICAgICAgIHhtbEVsZW1lbnROYW1lOiBcIkJsb2JcIixcbiAgICAgICAgICAgICAgICB0eXBlOiB7XG4gICAgICAgICAgICAgICAgICAgIG5hbWU6IFwiU2VxdWVuY2VcIixcbiAgICAgICAgICAgICAgICAgICAgZWxlbWVudDoge1xuICAgICAgICAgICAgICAgICAgICAgICAgdHlwZToge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5hbWU6IFwiQ29tcG9zaXRlXCIsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY2xhc3NOYW1lOiBcIkJsb2JJdGVtSW50ZXJuYWxcIixcbiAgICAgICAgICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIH0sXG4gICAgICAgIH0sXG4gICAgfSxcbn07XG5jb25zdCBCbG9iSXRlbUludGVybmFsID0ge1xuICAgIHNlcmlhbGl6ZWROYW1lOiBcIkJsb2JJdGVtSW50ZXJuYWxcIixcbiAgICB4bWxOYW1lOiBcIkJsb2JcIixcbiAgICB0eXBlOiB7XG4gICAgICAgIG5hbWU6IFwiQ29tcG9zaXRlXCIsXG4gICAgICAgIGNsYXNzTmFtZTogXCJCbG9iSXRlbUludGVybmFsXCIsXG4gICAgICAgIG1vZGVsUHJvcGVydGllczoge1xuICAgICAgICAgICAgbmFtZToge1xuICAgICAgICAgICAgICAgIHNlcmlhbGl6ZWROYW1lOiBcIk5hbWVcIixcbiAgICAgICAgICAgICAgICB4bWxOYW1lOiBcIk5hbWVcIixcbiAgICAgICAgICAgICAgICB0eXBlOiB7XG4gICAgICAgICAgICAgICAgICAgIG5hbWU6IFwiQ29tcG9zaXRlXCIsXG4gICAgICAgICAgICAgICAgICAgIGNsYXNzTmFtZTogXCJCbG9iTmFtZVwiLFxuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgZGVsZXRlZDoge1xuICAgICAgICAgICAgICAgIHNlcmlhbGl6ZWROYW1lOiBcIkRlbGV0ZWRcIixcbiAgICAgICAgICAgICAgICByZXF1aXJlZDogdHJ1ZSxcbiAgICAgICAgICAgICAgICB4bWxOYW1lOiBcIkRlbGV0ZWRcIixcbiAgICAgICAgICAgICAgICB0eXBlOiB7XG4gICAgICAgICAgICAgICAgICAgIG5hbWU6IFwiQm9vbGVhblwiLFxuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgc25hcHNob3Q6IHtcbiAgICAgICAgICAgICAgICBzZXJpYWxpemVkTmFtZTogXCJTbmFwc2hvdFwiLFxuICAgICAgICAgICAgICAgIHJlcXVpcmVkOiB0cnVlLFxuICAgICAgICAgICAgICAgIHhtbE5hbWU6IFwiU25hcHNob3RcIixcbiAgICAgICAgICAgICAgICB0eXBlOiB7XG4gICAgICAgICAgICAgICAgICAgIG5hbWU6IFwiU3RyaW5nXCIsXG4gICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICB2ZXJzaW9uSWQ6IHtcbiAgICAgICAgICAgICAgICBzZXJpYWxpemVkTmFtZTogXCJWZXJzaW9uSWRcIixcbiAgICAgICAgICAgICAgICB4bWxOYW1lOiBcIlZlcnNpb25JZFwiLFxuICAgICAgICAgICAgICAgIHR5cGU6IHtcbiAgICAgICAgICAgICAgICAgICAgbmFtZTogXCJTdHJpbmdcIixcbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIGlzQ3VycmVudFZlcnNpb246IHtcbiAgICAgICAgICAgICAgICBzZXJpYWxpemVkTmFtZTogXCJJc0N1cnJlbnRWZXJzaW9uXCIsXG4gICAgICAgICAgICAgICAgeG1sTmFtZTogXCJJc0N1cnJlbnRWZXJzaW9uXCIsXG4gICAgICAgICAgICAgICAgdHlwZToge1xuICAgICAgICAgICAgICAgICAgICBuYW1lOiBcIkJvb2xlYW5cIixcbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIHByb3BlcnRpZXM6IHtcbiAgICAgICAgICAgICAgICBzZXJpYWxpemVkTmFtZTogXCJQcm9wZXJ0aWVzXCIsXG4gICAgICAgICAgICAgICAgeG1sTmFtZTogXCJQcm9wZXJ0aWVzXCIsXG4gICAgICAgICAgICAgICAgdHlwZToge1xuICAgICAgICAgICAgICAgICAgICBuYW1lOiBcIkNvbXBvc2l0ZVwiLFxuICAgICAgICAgICAgICAgICAgICBjbGFzc05hbWU6IFwiQmxvYlByb3BlcnRpZXNJbnRlcm5hbFwiLFxuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgbWV0YWRhdGE6IHtcbiAgICAgICAgICAgICAgICBzZXJpYWxpemVkTmFtZTogXCJNZXRhZGF0YVwiLFxuICAgICAgICAgICAgICAgIHhtbE5hbWU6IFwiTWV0YWRhdGFcIixcbiAgICAgICAgICAgICAgICB0eXBlOiB7XG4gICAgICAgICAgICAgICAgICAgIG5hbWU6IFwiRGljdGlvbmFyeVwiLFxuICAgICAgICAgICAgICAgICAgICB2YWx1ZTogeyB0eXBlOiB7IG5hbWU6IFwiU3RyaW5nXCIgfSB9LFxuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgYmxvYlRhZ3M6IHtcbiAgICAgICAgICAgICAgICBzZXJpYWxpemVkTmFtZTogXCJCbG9iVGFnc1wiLFxuICAgICAgICAgICAgICAgIHhtbE5hbWU6IFwiVGFnc1wiLFxuICAgICAgICAgICAgICAgIHR5cGU6IHtcbiAgICAgICAgICAgICAgICAgICAgbmFtZTogXCJDb21wb3NpdGVcIixcbiAgICAgICAgICAgICAgICAgICAgY2xhc3NOYW1lOiBcIkJsb2JUYWdzXCIsXG4gICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBvYmplY3RSZXBsaWNhdGlvbk1ldGFkYXRhOiB7XG4gICAgICAgICAgICAgICAgc2VyaWFsaXplZE5hbWU6IFwiT2JqZWN0UmVwbGljYXRpb25NZXRhZGF0YVwiLFxuICAgICAgICAgICAgICAgIHhtbE5hbWU6IFwiT3JNZXRhZGF0YVwiLFxuICAgICAgICAgICAgICAgIHR5cGU6IHtcbiAgICAgICAgICAgICAgICAgICAgbmFtZTogXCJEaWN0aW9uYXJ5XCIsXG4gICAgICAgICAgICAgICAgICAgIHZhbHVlOiB7IHR5cGU6IHsgbmFtZTogXCJTdHJpbmdcIiB9IH0sXG4gICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBoYXNWZXJzaW9uc09ubHk6IHtcbiAgICAgICAgICAgICAgICBzZXJpYWxpemVkTmFtZTogXCJIYXNWZXJzaW9uc09ubHlcIixcbiAgICAgICAgICAgICAgICB4bWxOYW1lOiBcIkhhc1ZlcnNpb25zT25seVwiLFxuICAgICAgICAgICAgICAgIHR5cGU6IHtcbiAgICAgICAgICAgICAgICAgICAgbmFtZTogXCJCb29sZWFuXCIsXG4gICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIH0sXG4gICAgICAgIH0sXG4gICAgfSxcbn07XG5jb25zdCBCbG9iTmFtZSA9IHtcbiAgICBzZXJpYWxpemVkTmFtZTogXCJCbG9iTmFtZVwiLFxuICAgIHR5cGU6IHtcbiAgICAgICAgbmFtZTogXCJDb21wb3NpdGVcIixcbiAgICAgICAgY2xhc3NOYW1lOiBcIkJsb2JOYW1lXCIsXG4gICAgICAgIG1vZGVsUHJvcGVydGllczoge1xuICAgICAgICAgICAgZW5jb2RlZDoge1xuICAgICAgICAgICAgICAgIHNlcmlhbGl6ZWROYW1lOiBcIkVuY29kZWRcIixcbiAgICAgICAgICAgICAgICB4bWxOYW1lOiBcIkVuY29kZWRcIixcbiAgICAgICAgICAgICAgICB4bWxJc0F0dHJpYnV0ZTogdHJ1ZSxcbiAgICAgICAgICAgICAgICB0eXBlOiB7XG4gICAgICAgICAgICAgICAgICAgIG5hbWU6IFwiQm9vbGVhblwiLFxuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgY29udGVudDoge1xuICAgICAgICAgICAgICAgIHNlcmlhbGl6ZWROYW1lOiBcImNvbnRlbnRcIixcbiAgICAgICAgICAgICAgICB4bWxOYW1lOiBcImNvbnRlbnRcIixcbiAgICAgICAgICAgICAgICB4bWxJc01zVGV4dDogdHJ1ZSxcbiAgICAgICAgICAgICAgICB0eXBlOiB7XG4gICAgICAgICAgICAgICAgICAgIG5hbWU6IFwiU3RyaW5nXCIsXG4gICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIH0sXG4gICAgICAgIH0sXG4gICAgfSxcbn07XG5jb25zdCBCbG9iUHJvcGVydGllc0ludGVybmFsID0ge1xuICAgIHNlcmlhbGl6ZWROYW1lOiBcIkJsb2JQcm9wZXJ0aWVzSW50ZXJuYWxcIixcbiAgICB4bWxOYW1lOiBcIlByb3BlcnRpZXNcIixcbiAgICB0eXBlOiB7XG4gICAgICAgIG5hbWU6IFwiQ29tcG9zaXRlXCIsXG4gICAgICAgIGNsYXNzTmFtZTogXCJCbG9iUHJvcGVydGllc0ludGVybmFsXCIsXG4gICAgICAgIG1vZGVsUHJvcGVydGllczoge1xuICAgICAgICAgICAgY3JlYXRlZE9uOiB7XG4gICAgICAgICAgICAgICAgc2VyaWFsaXplZE5hbWU6IFwiQ3JlYXRpb24tVGltZVwiLFxuICAgICAgICAgICAgICAgIHhtbE5hbWU6IFwiQ3JlYXRpb24tVGltZVwiLFxuICAgICAgICAgICAgICAgIHR5cGU6IHtcbiAgICAgICAgICAgICAgICAgICAgbmFtZTogXCJEYXRlVGltZVJmYzExMjNcIixcbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIGxhc3RNb2RpZmllZDoge1xuICAgICAgICAgICAgICAgIHNlcmlhbGl6ZWROYW1lOiBcIkxhc3QtTW9kaWZpZWRcIixcbiAgICAgICAgICAgICAgICByZXF1aXJlZDogdHJ1ZSxcbiAgICAgICAgICAgICAgICB4bWxOYW1lOiBcIkxhc3QtTW9kaWZpZWRcIixcbiAgICAgICAgICAgICAgICB0eXBlOiB7XG4gICAgICAgICAgICAgICAgICAgIG5hbWU6IFwiRGF0ZVRpbWVSZmMxMTIzXCIsXG4gICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBldGFnOiB7XG4gICAgICAgICAgICAgICAgc2VyaWFsaXplZE5hbWU6IFwiRXRhZ1wiLFxuICAgICAgICAgICAgICAgIHJlcXVpcmVkOiB0cnVlLFxuICAgICAgICAgICAgICAgIHhtbE5hbWU6IFwiRXRhZ1wiLFxuICAgICAgICAgICAgICAgIHR5cGU6IHtcbiAgICAgICAgICAgICAgICAgICAgbmFtZTogXCJTdHJpbmdcIixcbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIGNvbnRlbnRMZW5ndGg6IHtcbiAgICAgICAgICAgICAgICBzZXJpYWxpemVkTmFtZTogXCJDb250ZW50LUxlbmd0aFwiLFxuICAgICAgICAgICAgICAgIHhtbE5hbWU6IFwiQ29udGVudC1MZW5ndGhcIixcbiAgICAgICAgICAgICAgICB0eXBlOiB7XG4gICAgICAgICAgICAgICAgICAgIG5hbWU6IFwiTnVtYmVyXCIsXG4gICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBjb250ZW50VHlwZToge1xuICAgICAgICAgICAgICAgIHNlcmlhbGl6ZWROYW1lOiBcIkNvbnRlbnQtVHlwZVwiLFxuICAgICAgICAgICAgICAgIHhtbE5hbWU6IFwiQ29udGVudC1UeXBlXCIsXG4gICAgICAgICAgICAgICAgdHlwZToge1xuICAgICAgICAgICAgICAgICAgICBuYW1lOiBcIlN0cmluZ1wiLFxuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgY29udGVudEVuY29kaW5nOiB7XG4gICAgICAgICAgICAgICAgc2VyaWFsaXplZE5hbWU6IFwiQ29udGVudC1FbmNvZGluZ1wiLFxuICAgICAgICAgICAgICAgIHhtbE5hbWU6IFwiQ29udGVudC1FbmNvZGluZ1wiLFxuICAgICAgICAgICAgICAgIHR5cGU6IHtcbiAgICAgICAgICAgICAgICAgICAgbmFtZTogXCJTdHJpbmdcIixcbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIGNvbnRlbnRMYW5ndWFnZToge1xuICAgICAgICAgICAgICAgIHNlcmlhbGl6ZWROYW1lOiBcIkNvbnRlbnQtTGFuZ3VhZ2VcIixcbiAgICAgICAgICAgICAgICB4bWxOYW1lOiBcIkNvbnRlbnQtTGFuZ3VhZ2VcIixcbiAgICAgICAgICAgICAgICB0eXBlOiB7XG4gICAgICAgICAgICAgICAgICAgIG5hbWU6IFwiU3RyaW5nXCIsXG4gICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBjb250ZW50TUQ1OiB7XG4gICAgICAgICAgICAgICAgc2VyaWFsaXplZE5hbWU6IFwiQ29udGVudC1NRDVcIixcbiAgICAgICAgICAgICAgICB4bWxOYW1lOiBcIkNvbnRlbnQtTUQ1XCIsXG4gICAgICAgICAgICAgICAgdHlwZToge1xuICAgICAgICAgICAgICAgICAgICBuYW1lOiBcIkJ5dGVBcnJheVwiLFxuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgY29udGVudERpc3Bvc2l0aW9uOiB7XG4gICAgICAgICAgICAgICAgc2VyaWFsaXplZE5hbWU6IFwiQ29udGVudC1EaXNwb3NpdGlvblwiLFxuICAgICAgICAgICAgICAgIHhtbE5hbWU6IFwiQ29udGVudC1EaXNwb3NpdGlvblwiLFxuICAgICAgICAgICAgICAgIHR5cGU6IHtcbiAgICAgICAgICAgICAgICAgICAgbmFtZTogXCJTdHJpbmdcIixcbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIGNhY2hlQ29udHJvbDoge1xuICAgICAgICAgICAgICAgIHNlcmlhbGl6ZWROYW1lOiBcIkNhY2hlLUNvbnRyb2xcIixcbiAgICAgICAgICAgICAgICB4bWxOYW1lOiBcIkNhY2hlLUNvbnRyb2xcIixcbiAgICAgICAgICAgICAgICB0eXBlOiB7XG4gICAgICAgICAgICAgICAgICAgIG5hbWU6IFwiU3RyaW5nXCIsXG4gICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBibG9iU2VxdWVuY2VOdW1iZXI6IHtcbiAgICAgICAgICAgICAgICBzZXJpYWxpemVkTmFtZTogXCJ4LW1zLWJsb2Itc2VxdWVuY2UtbnVtYmVyXCIsXG4gICAgICAgICAgICAgICAgeG1sTmFtZTogXCJ4LW1zLWJsb2Itc2VxdWVuY2UtbnVtYmVyXCIsXG4gICAgICAgICAgICAgICAgdHlwZToge1xuICAgICAgICAgICAgICAgICAgICBuYW1lOiBcIk51bWJlclwiLFxuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgYmxvYlR5cGU6IHtcbiAgICAgICAgICAgICAgICBzZXJpYWxpemVkTmFtZTogXCJCbG9iVHlwZVwiLFxuICAgICAgICAgICAgICAgIHhtbE5hbWU6IFwiQmxvYlR5cGVcIixcbiAgICAgICAgICAgICAgICB0eXBlOiB7XG4gICAgICAgICAgICAgICAgICAgIG5hbWU6IFwiRW51bVwiLFxuICAgICAgICAgICAgICAgICAgICBhbGxvd2VkVmFsdWVzOiBbXCJCbG9ja0Jsb2JcIiwgXCJQYWdlQmxvYlwiLCBcIkFwcGVuZEJsb2JcIl0sXG4gICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBsZWFzZVN0YXR1czoge1xuICAgICAgICAgICAgICAgIHNlcmlhbGl6ZWROYW1lOiBcIkxlYXNlU3RhdHVzXCIsXG4gICAgICAgICAgICAgICAgeG1sTmFtZTogXCJMZWFzZVN0YXR1c1wiLFxuICAgICAgICAgICAgICAgIHR5cGU6IHtcbiAgICAgICAgICAgICAgICAgICAgbmFtZTogXCJFbnVtXCIsXG4gICAgICAgICAgICAgICAgICAgIGFsbG93ZWRWYWx1ZXM6IFtcImxvY2tlZFwiLCBcInVubG9ja2VkXCJdLFxuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgbGVhc2VTdGF0ZToge1xuICAgICAgICAgICAgICAgIHNlcmlhbGl6ZWROYW1lOiBcIkxlYXNlU3RhdGVcIixcbiAgICAgICAgICAgICAgICB4bWxOYW1lOiBcIkxlYXNlU3RhdGVcIixcbiAgICAgICAgICAgICAgICB0eXBlOiB7XG4gICAgICAgICAgICAgICAgICAgIG5hbWU6IFwiRW51bVwiLFxuICAgICAgICAgICAgICAgICAgICBhbGxvd2VkVmFsdWVzOiBbXG4gICAgICAgICAgICAgICAgICAgICAgICBcImF2YWlsYWJsZVwiLFxuICAgICAgICAgICAgICAgICAgICAgICAgXCJsZWFzZWRcIixcbiAgICAgICAgICAgICAgICAgICAgICAgIFwiZXhwaXJlZFwiLFxuICAgICAgICAgICAgICAgICAgICAgICAgXCJicmVha2luZ1wiLFxuICAgICAgICAgICAgICAgICAgICAgICAgXCJicm9rZW5cIixcbiAgICAgICAgICAgICAgICAgICAgXSxcbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIGxlYXNlRHVyYXRpb246IHtcbiAgICAgICAgICAgICAgICBzZXJpYWxpemVkTmFtZTogXCJMZWFzZUR1cmF0aW9uXCIsXG4gICAgICAgICAgICAgICAgeG1sTmFtZTogXCJMZWFzZUR1cmF0aW9uXCIsXG4gICAgICAgICAgICAgICAgdHlwZToge1xuICAgICAgICAgICAgICAgICAgICBuYW1lOiBcIkVudW1cIixcbiAgICAgICAgICAgICAgICAgICAgYWxsb3dlZFZhbHVlczogW1wiaW5maW5pdGVcIiwgXCJmaXhlZFwiXSxcbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIGNvcHlJZDoge1xuICAgICAgICAgICAgICAgIHNlcmlhbGl6ZWROYW1lOiBcIkNvcHlJZFwiLFxuICAgICAgICAgICAgICAgIHhtbE5hbWU6IFwiQ29weUlkXCIsXG4gICAgICAgICAgICAgICAgdHlwZToge1xuICAgICAgICAgICAgICAgICAgICBuYW1lOiBcIlN0cmluZ1wiLFxuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgY29weVN0YXR1czoge1xuICAgICAgICAgICAgICAgIHNlcmlhbGl6ZWROYW1lOiBcIkNvcHlTdGF0dXNcIixcbiAgICAgICAgICAgICAgICB4bWxOYW1lOiBcIkNvcHlTdGF0dXNcIixcbiAgICAgICAgICAgICAgICB0eXBlOiB7XG4gICAgICAgICAgICAgICAgICAgIG5hbWU6IFwiRW51bVwiLFxuICAgICAgICAgICAgICAgICAgICBhbGxvd2VkVmFsdWVzOiBbXCJwZW5kaW5nXCIsIFwic3VjY2Vzc1wiLCBcImFib3J0ZWRcIiwgXCJmYWlsZWRcIl0sXG4gICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBjb3B5U291cmNlOiB7XG4gICAgICAgICAgICAgICAgc2VyaWFsaXplZE5hbWU6IFwiQ29weVNvdXJjZVwiLFxuICAgICAgICAgICAgICAgIHhtbE5hbWU6IFwiQ29weVNvdXJjZVwiLFxuICAgICAgICAgICAgICAgIHR5cGU6IHtcbiAgICAgICAgICAgICAgICAgICAgbmFtZTogXCJTdHJpbmdcIixcbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIGNvcHlQcm9ncmVzczoge1xuICAgICAgICAgICAgICAgIHNlcmlhbGl6ZWROYW1lOiBcIkNvcHlQcm9ncmVzc1wiLFxuICAgICAgICAgICAgICAgIHhtbE5hbWU6IFwiQ29weVByb2dyZXNzXCIsXG4gICAgICAgICAgICAgICAgdHlwZToge1xuICAgICAgICAgICAgICAgICAgICBuYW1lOiBcIlN0cmluZ1wiLFxuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgY29weUNvbXBsZXRlZE9uOiB7XG4gICAgICAgICAgICAgICAgc2VyaWFsaXplZE5hbWU6IFwiQ29weUNvbXBsZXRpb25UaW1lXCIsXG4gICAgICAgICAgICAgICAgeG1sTmFtZTogXCJDb3B5Q29tcGxldGlvblRpbWVcIixcbiAgICAgICAgICAgICAgICB0eXBlOiB7XG4gICAgICAgICAgICAgICAgICAgIG5hbWU6IFwiRGF0ZVRpbWVSZmMxMTIzXCIsXG4gICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBjb3B5U3RhdHVzRGVzY3JpcHRpb246IHtcbiAgICAgICAgICAgICAgICBzZXJpYWxpemVkTmFtZTogXCJDb3B5U3RhdHVzRGVzY3JpcHRpb25cIixcbiAgICAgICAgICAgICAgICB4bWxOYW1lOiBcIkNvcHlTdGF0dXNEZXNjcmlwdGlvblwiLFxuICAgICAgICAgICAgICAgIHR5cGU6IHtcbiAgICAgICAgICAgICAgICAgICAgbmFtZTogXCJTdHJpbmdcIixcbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIHNlcnZlckVuY3J5cHRlZDoge1xuICAgICAgICAgICAgICAgIHNlcmlhbGl6ZWROYW1lOiBcIlNlcnZlckVuY3J5cHRlZFwiLFxuICAgICAgICAgICAgICAgIHhtbE5hbWU6IFwiU2VydmVyRW5jcnlwdGVkXCIsXG4gICAgICAgICAgICAgICAgdHlwZToge1xuICAgICAgICAgICAgICAgICAgICBuYW1lOiBcIkJvb2xlYW5cIixcbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIGluY3JlbWVudGFsQ29weToge1xuICAgICAgICAgICAgICAgIHNlcmlhbGl6ZWROYW1lOiBcIkluY3JlbWVudGFsQ29weVwiLFxuICAgICAgICAgICAgICAgIHhtbE5hbWU6IFwiSW5jcmVtZW50YWxDb3B5XCIsXG4gICAgICAgICAgICAgICAgdHlwZToge1xuICAgICAgICAgICAgICAgICAgICBuYW1lOiBcIkJvb2xlYW5cIixcbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIGRlc3RpbmF0aW9uU25hcHNob3Q6IHtcbiAgICAgICAgICAgICAgICBzZXJpYWxpemVkTmFtZTogXCJEZXN0aW5hdGlvblNuYXBzaG90XCIsXG4gICAgICAgICAgICAgICAgeG1sTmFtZTogXCJEZXN0aW5hdGlvblNuYXBzaG90XCIsXG4gICAgICAgICAgICAgICAgdHlwZToge1xuICAgICAgICAgICAgICAgICAgICBuYW1lOiBcIlN0cmluZ1wiLFxuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgZGVsZXRlZE9uOiB7XG4gICAgICAgICAgICAgICAgc2VyaWFsaXplZE5hbWU6IFwiRGVsZXRlZFRpbWVcIixcbiAgICAgICAgICAgICAgICB4bWxOYW1lOiBcIkRlbGV0ZWRUaW1lXCIsXG4gICAgICAgICAgICAgICAgdHlwZToge1xuICAgICAgICAgICAgICAgICAgICBuYW1lOiBcIkRhdGVUaW1lUmZjMTEyM1wiLFxuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgcmVtYWluaW5nUmV0ZW50aW9uRGF5czoge1xuICAgICAgICAgICAgICAgIHNlcmlhbGl6ZWROYW1lOiBcIlJlbWFpbmluZ1JldGVudGlvbkRheXNcIixcbiAgICAgICAgICAgICAgICB4bWxOYW1lOiBcIlJlbWFpbmluZ1JldGVudGlvbkRheXNcIixcbiAgICAgICAgICAgICAgICB0eXBlOiB7XG4gICAgICAgICAgICAgICAgICAgIG5hbWU6IFwiTnVtYmVyXCIsXG4gICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBhY2Nlc3NUaWVyOiB7XG4gICAgICAgICAgICAgICAgc2VyaWFsaXplZE5hbWU6IFwiQWNjZXNzVGllclwiLFxuICAgICAgICAgICAgICAgIHhtbE5hbWU6IFwiQWNjZXNzVGllclwiLFxuICAgICAgICAgICAgICAgIHR5cGU6IHtcbiAgICAgICAgICAgICAgICAgICAgbmFtZTogXCJFbnVtXCIsXG4gICAgICAgICAgICAgICAgICAgIGFsbG93ZWRWYWx1ZXM6IFtcbiAgICAgICAgICAgICAgICAgICAgICAgIFwiUDRcIixcbiAgICAgICAgICAgICAgICAgICAgICAgIFwiUDZcIixcbiAgICAgICAgICAgICAgICAgICAgICAgIFwiUDEwXCIsXG4gICAgICAgICAgICAgICAgICAgICAgICBcIlAxNVwiLFxuICAgICAgICAgICAgICAgICAgICAgICAgXCJQMjBcIixcbiAgICAgICAgICAgICAgICAgICAgICAgIFwiUDMwXCIsXG4gICAgICAgICAgICAgICAgICAgICAgICBcIlA0MFwiLFxuICAgICAgICAgICAgICAgICAgICAgICAgXCJQNTBcIixcbiAgICAgICAgICAgICAgICAgICAgICAgIFwiUDYwXCIsXG4gICAgICAgICAgICAgICAgICAgICAgICBcIlA3MFwiLFxuICAgICAgICAgICAgICAgICAgICAgICAgXCJQODBcIixcbiAgICAgICAgICAgICAgICAgICAgICAgIFwiSG90XCIsXG4gICAgICAgICAgICAgICAgICAgICAgICBcIkNvb2xcIixcbiAgICAgICAgICAgICAgICAgICAgICAgIFwiQXJjaGl2ZVwiLFxuICAgICAgICAgICAgICAgICAgICAgICAgXCJDb2xkXCIsXG4gICAgICAgICAgICAgICAgICAgIF0sXG4gICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBhY2Nlc3NUaWVySW5mZXJyZWQ6IHtcbiAgICAgICAgICAgICAgICBzZXJpYWxpemVkTmFtZTogXCJBY2Nlc3NUaWVySW5mZXJyZWRcIixcbiAgICAgICAgICAgICAgICB4bWxOYW1lOiBcIkFjY2Vzc1RpZXJJbmZlcnJlZFwiLFxuICAgICAgICAgICAgICAgIHR5cGU6IHtcbiAgICAgICAgICAgICAgICAgICAgbmFtZTogXCJCb29sZWFuXCIsXG4gICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBhcmNoaXZlU3RhdHVzOiB7XG4gICAgICAgICAgICAgICAgc2VyaWFsaXplZE5hbWU6IFwiQXJjaGl2ZVN0YXR1c1wiLFxuICAgICAgICAgICAgICAgIHhtbE5hbWU6IFwiQXJjaGl2ZVN0YXR1c1wiLFxuICAgICAgICAgICAgICAgIHR5cGU6IHtcbiAgICAgICAgICAgICAgICAgICAgbmFtZTogXCJFbnVtXCIsXG4gICAgICAgICAgICAgICAgICAgIGFsbG93ZWRWYWx1ZXM6IFtcbiAgICAgICAgICAgICAgICAgICAgICAgIFwicmVoeWRyYXRlLXBlbmRpbmctdG8taG90XCIsXG4gICAgICAgICAgICAgICAgICAgICAgICBcInJlaHlkcmF0ZS1wZW5kaW5nLXRvLWNvb2xcIixcbiAgICAgICAgICAgICAgICAgICAgICAgIFwicmVoeWRyYXRlLXBlbmRpbmctdG8tY29sZFwiLFxuICAgICAgICAgICAgICAgICAgICBdLFxuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgY3VzdG9tZXJQcm92aWRlZEtleVNoYTI1Njoge1xuICAgICAgICAgICAgICAgIHNlcmlhbGl6ZWROYW1lOiBcIkN1c3RvbWVyUHJvdmlkZWRLZXlTaGEyNTZcIixcbiAgICAgICAgICAgICAgICB4bWxOYW1lOiBcIkN1c3RvbWVyUHJvdmlkZWRLZXlTaGEyNTZcIixcbiAgICAgICAgICAgICAgICB0eXBlOiB7XG4gICAgICAgICAgICAgICAgICAgIG5hbWU6IFwiU3RyaW5nXCIsXG4gICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBlbmNyeXB0aW9uU2NvcGU6IHtcbiAgICAgICAgICAgICAgICBzZXJpYWxpemVkTmFtZTogXCJFbmNyeXB0aW9uU2NvcGVcIixcbiAgICAgICAgICAgICAgICB4bWxOYW1lOiBcIkVuY3J5cHRpb25TY29wZVwiLFxuICAgICAgICAgICAgICAgIHR5cGU6IHtcbiAgICAgICAgICAgICAgICAgICAgbmFtZTogXCJTdHJpbmdcIixcbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIGFjY2Vzc1RpZXJDaGFuZ2VkT246IHtcbiAgICAgICAgICAgICAgICBzZXJpYWxpemVkTmFtZTogXCJBY2Nlc3NUaWVyQ2hhbmdlVGltZVwiLFxuICAgICAgICAgICAgICAgIHhtbE5hbWU6IFwiQWNjZXNzVGllckNoYW5nZVRpbWVcIixcbiAgICAgICAgICAgICAgICB0eXBlOiB7XG4gICAgICAgICAgICAgICAgICAgIG5hbWU6IFwiRGF0ZVRpbWVSZmMxMTIzXCIsXG4gICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICB0YWdDb3VudDoge1xuICAgICAgICAgICAgICAgIHNlcmlhbGl6ZWROYW1lOiBcIlRhZ0NvdW50XCIsXG4gICAgICAgICAgICAgICAgeG1sTmFtZTogXCJUYWdDb3VudFwiLFxuICAgICAgICAgICAgICAgIHR5cGU6IHtcbiAgICAgICAgICAgICAgICAgICAgbmFtZTogXCJOdW1iZXJcIixcbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIGV4cGlyZXNPbjoge1xuICAgICAgICAgICAgICAgIHNlcmlhbGl6ZWROYW1lOiBcIkV4cGlyeS1UaW1lXCIsXG4gICAgICAgICAgICAgICAgeG1sTmFtZTogXCJFeHBpcnktVGltZVwiLFxuICAgICAgICAgICAgICAgIHR5cGU6IHtcbiAgICAgICAgICAgICAgICAgICAgbmFtZTogXCJEYXRlVGltZVJmYzExMjNcIixcbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIGlzU2VhbGVkOiB7XG4gICAgICAgICAgICAgICAgc2VyaWFsaXplZE5hbWU6IFwiU2VhbGVkXCIsXG4gICAgICAgICAgICAgICAgeG1sTmFtZTogXCJTZWFsZWRcIixcbiAgICAgICAgICAgICAgICB0eXBlOiB7XG4gICAgICAgICAgICAgICAgICAgIG5hbWU6IFwiQm9vbGVhblwiLFxuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgcmVoeWRyYXRlUHJpb3JpdHk6IHtcbiAgICAgICAgICAgICAgICBzZXJpYWxpemVkTmFtZTogXCJSZWh5ZHJhdGVQcmlvcml0eVwiLFxuICAgICAgICAgICAgICAgIHhtbE5hbWU6IFwiUmVoeWRyYXRlUHJpb3JpdHlcIixcbiAgICAgICAgICAgICAgICB0eXBlOiB7XG4gICAgICAgICAgICAgICAgICAgIG5hbWU6IFwiRW51bVwiLFxuICAgICAgICAgICAgICAgICAgICBhbGxvd2VkVmFsdWVzOiBbXCJIaWdoXCIsIFwiU3RhbmRhcmRcIl0sXG4gICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBsYXN0QWNjZXNzZWRPbjoge1xuICAgICAgICAgICAgICAgIHNlcmlhbGl6ZWROYW1lOiBcIkxhc3RBY2Nlc3NUaW1lXCIsXG4gICAgICAgICAgICAgICAgeG1sTmFtZTogXCJMYXN0QWNjZXNzVGltZVwiLFxuICAgICAgICAgICAgICAgIHR5cGU6IHtcbiAgICAgICAgICAgICAgICAgICAgbmFtZTogXCJEYXRlVGltZVJmYzExMjNcIixcbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIGltbXV0YWJpbGl0eVBvbGljeUV4cGlyZXNPbjoge1xuICAgICAgICAgICAgICAgIHNlcmlhbGl6ZWROYW1lOiBcIkltbXV0YWJpbGl0eVBvbGljeVVudGlsRGF0ZVwiLFxuICAgICAgICAgICAgICAgIHhtbE5hbWU6IFwiSW1tdXRhYmlsaXR5UG9saWN5VW50aWxEYXRlXCIsXG4gICAgICAgICAgICAgICAgdHlwZToge1xuICAgICAgICAgICAgICAgICAgICBuYW1lOiBcIkRhdGVUaW1lUmZjMTEyM1wiLFxuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgaW1tdXRhYmlsaXR5UG9saWN5TW9kZToge1xuICAgICAgICAgICAgICAgIHNlcmlhbGl6ZWROYW1lOiBcIkltbXV0YWJpbGl0eVBvbGljeU1vZGVcIixcbiAgICAgICAgICAgICAgICB4bWxOYW1lOiBcIkltbXV0YWJpbGl0eVBvbGljeU1vZGVcIixcbiAgICAgICAgICAgICAgICB0eXBlOiB7XG4gICAgICAgICAgICAgICAgICAgIG5hbWU6IFwiRW51bVwiLFxuICAgICAgICAgICAgICAgICAgICBhbGxvd2VkVmFsdWVzOiBbXCJNdXRhYmxlXCIsIFwiVW5sb2NrZWRcIiwgXCJMb2NrZWRcIl0sXG4gICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBsZWdhbEhvbGQ6IHtcbiAgICAgICAgICAgICAgICBzZXJpYWxpemVkTmFtZTogXCJMZWdhbEhvbGRcIixcbiAgICAgICAgICAgICAgICB4bWxOYW1lOiBcIkxlZ2FsSG9sZFwiLFxuICAgICAgICAgICAgICAgIHR5cGU6IHtcbiAgICAgICAgICAgICAgICAgICAgbmFtZTogXCJCb29sZWFuXCIsXG4gICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIH0sXG4gICAgICAgIH0sXG4gICAgfSxcbn07XG5jb25zdCBMaXN0QmxvYnNIaWVyYXJjaHlTZWdtZW50UmVzcG9uc2UgPSB7XG4gICAgc2VyaWFsaXplZE5hbWU6IFwiTGlzdEJsb2JzSGllcmFyY2h5U2VnbWVudFJlc3BvbnNlXCIsXG4gICAgeG1sTmFtZTogXCJFbnVtZXJhdGlvblJlc3VsdHNcIixcbiAgICB0eXBlOiB7XG4gICAgICAgIG5hbWU6IFwiQ29tcG9zaXRlXCIsXG4gICAgICAgIGNsYXNzTmFtZTogXCJMaXN0QmxvYnNIaWVyYXJjaHlTZWdtZW50UmVzcG9uc2VcIixcbiAgICAgICAgbW9kZWxQcm9wZXJ0aWVzOiB7XG4gICAgICAgICAgICBzZXJ2aWNlRW5kcG9pbnQ6IHtcbiAgICAgICAgICAgICAgICBzZXJpYWxpemVkTmFtZTogXCJTZXJ2aWNlRW5kcG9pbnRcIixcbiAgICAgICAgICAgICAgICByZXF1aXJlZDogdHJ1ZSxcbiAgICAgICAgICAgICAgICB4bWxOYW1lOiBcIlNlcnZpY2VFbmRwb2ludFwiLFxuICAgICAgICAgICAgICAgIHhtbElzQXR0cmlidXRlOiB0cnVlLFxuICAgICAgICAgICAgICAgIHR5cGU6IHtcbiAgICAgICAgICAgICAgICAgICAgbmFtZTogXCJTdHJpbmdcIixcbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIGNvbnRhaW5lck5hbWU6IHtcbiAgICAgICAgICAgICAgICBzZXJpYWxpemVkTmFtZTogXCJDb250YWluZXJOYW1lXCIsXG4gICAgICAgICAgICAgICAgcmVxdWlyZWQ6IHRydWUsXG4gICAgICAgICAgICAgICAgeG1sTmFtZTogXCJDb250YWluZXJOYW1lXCIsXG4gICAgICAgICAgICAgICAgeG1sSXNBdHRyaWJ1dGU6IHRydWUsXG4gICAgICAgICAgICAgICAgdHlwZToge1xuICAgICAgICAgICAgICAgICAgICBuYW1lOiBcIlN0cmluZ1wiLFxuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgcHJlZml4OiB7XG4gICAgICAgICAgICAgICAgc2VyaWFsaXplZE5hbWU6IFwiUHJlZml4XCIsXG4gICAgICAgICAgICAgICAgeG1sTmFtZTogXCJQcmVmaXhcIixcbiAgICAgICAgICAgICAgICB0eXBlOiB7XG4gICAgICAgICAgICAgICAgICAgIG5hbWU6IFwiU3RyaW5nXCIsXG4gICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBtYXJrZXI6IHtcbiAgICAgICAgICAgICAgICBzZXJpYWxpemVkTmFtZTogXCJNYXJrZXJcIixcbiAgICAgICAgICAgICAgICB4bWxOYW1lOiBcIk1hcmtlclwiLFxuICAgICAgICAgICAgICAgIHR5cGU6IHtcbiAgICAgICAgICAgICAgICAgICAgbmFtZTogXCJTdHJpbmdcIixcbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIG1heFBhZ2VTaXplOiB7XG4gICAgICAgICAgICAgICAgc2VyaWFsaXplZE5hbWU6IFwiTWF4UmVzdWx0c1wiLFxuICAgICAgICAgICAgICAgIHhtbE5hbWU6IFwiTWF4UmVzdWx0c1wiLFxuICAgICAgICAgICAgICAgIHR5cGU6IHtcbiAgICAgICAgICAgICAgICAgICAgbmFtZTogXCJOdW1iZXJcIixcbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIGRlbGltaXRlcjoge1xuICAgICAgICAgICAgICAgIHNlcmlhbGl6ZWROYW1lOiBcIkRlbGltaXRlclwiLFxuICAgICAgICAgICAgICAgIHhtbE5hbWU6IFwiRGVsaW1pdGVyXCIsXG4gICAgICAgICAgICAgICAgdHlwZToge1xuICAgICAgICAgICAgICAgICAgICBuYW1lOiBcIlN0cmluZ1wiLFxuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgc2VnbWVudDoge1xuICAgICAgICAgICAgICAgIHNlcmlhbGl6ZWROYW1lOiBcIlNlZ21lbnRcIixcbiAgICAgICAgICAgICAgICB4bWxOYW1lOiBcIkJsb2JzXCIsXG4gICAgICAgICAgICAgICAgdHlwZToge1xuICAgICAgICAgICAgICAgICAgICBuYW1lOiBcIkNvbXBvc2l0ZVwiLFxuICAgICAgICAgICAgICAgICAgICBjbGFzc05hbWU6IFwiQmxvYkhpZXJhcmNoeUxpc3RTZWdtZW50XCIsXG4gICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBjb250aW51YXRpb25Ub2tlbjoge1xuICAgICAgICAgICAgICAgIHNlcmlhbGl6ZWROYW1lOiBcIk5leHRNYXJrZXJcIixcbiAgICAgICAgICAgICAgICB4bWxOYW1lOiBcIk5leHRNYXJrZXJcIixcbiAgICAgICAgICAgICAgICB0eXBlOiB7XG4gICAgICAgICAgICAgICAgICAgIG5hbWU6IFwiU3RyaW5nXCIsXG4gICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIH0sXG4gICAgICAgIH0sXG4gICAgfSxcbn07XG5jb25zdCBCbG9iSGllcmFyY2h5TGlzdFNlZ21lbnQgPSB7XG4gICAgc2VyaWFsaXplZE5hbWU6IFwiQmxvYkhpZXJhcmNoeUxpc3RTZWdtZW50XCIsXG4gICAgeG1sTmFtZTogXCJCbG9ic1wiLFxuICAgIHR5cGU6IHtcbiAgICAgICAgbmFtZTogXCJDb21wb3NpdGVcIixcbiAgICAgICAgY2xhc3NOYW1lOiBcIkJsb2JIaWVyYXJjaHlMaXN0U2VnbWVudFwiLFxuICAgICAgICBtb2RlbFByb3BlcnRpZXM6IHtcbiAgICAgICAgICAgIGJsb2JQcmVmaXhlczoge1xuICAgICAgICAgICAgICAgIHNlcmlhbGl6ZWROYW1lOiBcIkJsb2JQcmVmaXhlc1wiLFxuICAgICAgICAgICAgICAgIHhtbE5hbWU6IFwiQmxvYlByZWZpeGVzXCIsXG4gICAgICAgICAgICAgICAgeG1sRWxlbWVudE5hbWU6IFwiQmxvYlByZWZpeFwiLFxuICAgICAgICAgICAgICAgIHR5cGU6IHtcbiAgICAgICAgICAgICAgICAgICAgbmFtZTogXCJTZXF1ZW5jZVwiLFxuICAgICAgICAgICAgICAgICAgICBlbGVtZW50OiB7XG4gICAgICAgICAgICAgICAgICAgICAgICB0eXBlOiB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgbmFtZTogXCJDb21wb3NpdGVcIixcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbGFzc05hbWU6IFwiQmxvYlByZWZpeFwiLFxuICAgICAgICAgICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIGJsb2JJdGVtczoge1xuICAgICAgICAgICAgICAgIHNlcmlhbGl6ZWROYW1lOiBcIkJsb2JJdGVtc1wiLFxuICAgICAgICAgICAgICAgIHJlcXVpcmVkOiB0cnVlLFxuICAgICAgICAgICAgICAgIHhtbE5hbWU6IFwiQmxvYkl0ZW1zXCIsXG4gICAgICAgICAgICAgICAgeG1sRWxlbWVudE5hbWU6IFwiQmxvYlwiLFxuICAgICAgICAgICAgICAgIHR5cGU6IHtcbiAgICAgICAgICAgICAgICAgICAgbmFtZTogXCJTZXF1ZW5jZVwiLFxuICAgICAgICAgICAgICAgICAgICBlbGVtZW50OiB7XG4gICAgICAgICAgICAgICAgICAgICAgICB0eXBlOiB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgbmFtZTogXCJDb21wb3NpdGVcIixcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbGFzc05hbWU6IFwiQmxvYkl0ZW1JbnRlcm5hbFwiLFxuICAgICAgICAgICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgfSxcbiAgICAgICAgfSxcbiAgICB9LFxufTtcbmNvbnN0IEJsb2JQcmVmaXggPSB7XG4gICAgc2VyaWFsaXplZE5hbWU6IFwiQmxvYlByZWZpeFwiLFxuICAgIHR5cGU6IHtcbiAgICAgICAgbmFtZTogXCJDb21wb3NpdGVcIixcbiAgICAgICAgY2xhc3NOYW1lOiBcIkJsb2JQcmVmaXhcIixcbiAgICAgICAgbW9kZWxQcm9wZXJ0aWVzOiB7XG4gICAgICAgICAgICBuYW1lOiB7XG4gICAgICAgICAgICAgICAgc2VyaWFsaXplZE5hbWU6IFwiTmFtZVwiLFxuICAgICAgICAgICAgICAgIHhtbE5hbWU6IFwiTmFtZVwiLFxuICAgICAgICAgICAgICAgIHR5cGU6IHtcbiAgICAgICAgICAgICAgICAgICAgbmFtZTogXCJDb21wb3NpdGVcIixcbiAgICAgICAgICAgICAgICAgICAgY2xhc3NOYW1lOiBcIkJsb2JOYW1lXCIsXG4gICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIH0sXG4gICAgICAgIH0sXG4gICAgfSxcbn07XG5jb25zdCBCbG9ja0xvb2t1cExpc3QgPSB7XG4gICAgc2VyaWFsaXplZE5hbWU6IFwiQmxvY2tMb29rdXBMaXN0XCIsXG4gICAgeG1sTmFtZTogXCJCbG9ja0xpc3RcIixcbiAgICB0eXBlOiB7XG4gICAgICAgIG5hbWU6IFwiQ29tcG9zaXRlXCIsXG4gICAgICAgIGNsYXNzTmFtZTogXCJCbG9ja0xvb2t1cExpc3RcIixcbiAgICAgICAgbW9kZWxQcm9wZXJ0aWVzOiB7XG4gICAgICAgICAgICBjb21taXR0ZWQ6IHtcbiAgICAgICAgICAgICAgICBzZXJpYWxpemVkTmFtZTogXCJDb21taXR0ZWRcIixcbiAgICAgICAgICAgICAgICB4bWxOYW1lOiBcIkNvbW1pdHRlZFwiLFxuICAgICAgICAgICAgICAgIHhtbEVsZW1lbnROYW1lOiBcIkNvbW1pdHRlZFwiLFxuICAgICAgICAgICAgICAgIHR5cGU6IHtcbiAgICAgICAgICAgICAgICAgICAgbmFtZTogXCJTZXF1ZW5jZVwiLFxuICAgICAgICAgICAgICAgICAgICBlbGVtZW50OiB7XG4gICAgICAgICAgICAgICAgICAgICAgICB0eXBlOiB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgbmFtZTogXCJTdHJpbmdcIixcbiAgICAgICAgICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICB1bmNvbW1pdHRlZDoge1xuICAgICAgICAgICAgICAgIHNlcmlhbGl6ZWROYW1lOiBcIlVuY29tbWl0dGVkXCIsXG4gICAgICAgICAgICAgICAgeG1sTmFtZTogXCJVbmNvbW1pdHRlZFwiLFxuICAgICAgICAgICAgICAgIHhtbEVsZW1lbnROYW1lOiBcIlVuY29tbWl0dGVkXCIsXG4gICAgICAgICAgICAgICAgdHlwZToge1xuICAgICAgICAgICAgICAgICAgICBuYW1lOiBcIlNlcXVlbmNlXCIsXG4gICAgICAgICAgICAgICAgICAgIGVsZW1lbnQ6IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHR5cGU6IHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBuYW1lOiBcIlN0cmluZ1wiLFxuICAgICAgICAgICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIGxhdGVzdDoge1xuICAgICAgICAgICAgICAgIHNlcmlhbGl6ZWROYW1lOiBcIkxhdGVzdFwiLFxuICAgICAgICAgICAgICAgIHhtbE5hbWU6IFwiTGF0ZXN0XCIsXG4gICAgICAgICAgICAgICAgeG1sRWxlbWVudE5hbWU6IFwiTGF0ZXN0XCIsXG4gICAgICAgICAgICAgICAgdHlwZToge1xuICAgICAgICAgICAgICAgICAgICBuYW1lOiBcIlNlcXVlbmNlXCIsXG4gICAgICAgICAgICAgICAgICAgIGVsZW1lbnQ6IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHR5cGU6IHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBuYW1lOiBcIlN0cmluZ1wiLFxuICAgICAgICAgICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgfSxcbiAgICAgICAgfSxcbiAgICB9LFxufTtcbmNvbnN0IEJsb2NrTGlzdCA9IHtcbiAgICBzZXJpYWxpemVkTmFtZTogXCJCbG9ja0xpc3RcIixcbiAgICB0eXBlOiB7XG4gICAgICAgIG5hbWU6IFwiQ29tcG9zaXRlXCIsXG4gICAgICAgIGNsYXNzTmFtZTogXCJCbG9ja0xpc3RcIixcbiAgICAgICAgbW9kZWxQcm9wZXJ0aWVzOiB7XG4gICAgICAgICAgICBjb21taXR0ZWRCbG9ja3M6IHtcbiAgICAgICAgICAgICAgICBzZXJpYWxpemVkTmFtZTogXCJDb21taXR0ZWRCbG9ja3NcIixcbiAgICAgICAgICAgICAgICB4bWxOYW1lOiBcIkNvbW1pdHRlZEJsb2Nrc1wiLFxuICAgICAgICAgICAgICAgIHhtbElzV3JhcHBlZDogdHJ1ZSxcbiAgICAgICAgICAgICAgICB4bWxFbGVtZW50TmFtZTogXCJCbG9ja1wiLFxuICAgICAgICAgICAgICAgIHR5cGU6IHtcbiAgICAgICAgICAgICAgICAgICAgbmFtZTogXCJTZXF1ZW5jZVwiLFxuICAgICAgICAgICAgICAgICAgICBlbGVtZW50OiB7XG4gICAgICAgICAgICAgICAgICAgICAgICB0eXBlOiB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgbmFtZTogXCJDb21wb3NpdGVcIixcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbGFzc05hbWU6IFwiQmxvY2tcIixcbiAgICAgICAgICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICB1bmNvbW1pdHRlZEJsb2Nrczoge1xuICAgICAgICAgICAgICAgIHNlcmlhbGl6ZWROYW1lOiBcIlVuY29tbWl0dGVkQmxvY2tzXCIsXG4gICAgICAgICAgICAgICAgeG1sTmFtZTogXCJVbmNvbW1pdHRlZEJsb2Nrc1wiLFxuICAgICAgICAgICAgICAgIHhtbElzV3JhcHBlZDogdHJ1ZSxcbiAgICAgICAgICAgICAgICB4bWxFbGVtZW50TmFtZTogXCJCbG9ja1wiLFxuICAgICAgICAgICAgICAgIHR5cGU6IHtcbiAgICAgICAgICAgICAgICAgICAgbmFtZTogXCJTZXF1ZW5jZVwiLFxuICAgICAgICAgICAgICAgICAgICBlbGVtZW50OiB7XG4gICAgICAgICAgICAgICAgICAgICAgICB0eXBlOiB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgbmFtZTogXCJDb21wb3NpdGVcIixcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbGFzc05hbWU6IFwiQmxvY2tcIixcbiAgICAgICAgICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIH0sXG4gICAgICAgIH0sXG4gICAgfSxcbn07XG5jb25zdCBCbG9jayA9IHtcbiAgICBzZXJpYWxpemVkTmFtZTogXCJCbG9ja1wiLFxuICAgIHR5cGU6IHtcbiAgICAgICAgbmFtZTogXCJDb21wb3NpdGVcIixcbiAgICAgICAgY2xhc3NOYW1lOiBcIkJsb2NrXCIsXG4gICAgICAgIG1vZGVsUHJvcGVydGllczoge1xuICAgICAgICAgICAgbmFtZToge1xuICAgICAgICAgICAgICAgIHNlcmlhbGl6ZWROYW1lOiBcIk5hbWVcIixcbiAgICAgICAgICAgICAgICByZXF1aXJlZDogdHJ1ZSxcbiAgICAgICAgICAgICAgICB4bWxOYW1lOiBcIk5hbWVcIixcbiAgICAgICAgICAgICAgICB0eXBlOiB7XG4gICAgICAgICAgICAgICAgICAgIG5hbWU6IFwiU3RyaW5nXCIsXG4gICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBzaXplOiB7XG4gICAgICAgICAgICAgICAgc2VyaWFsaXplZE5hbWU6IFwiU2l6ZVwiLFxuICAgICAgICAgICAgICAgIHJlcXVpcmVkOiB0cnVlLFxuICAgICAgICAgICAgICAgIHhtbE5hbWU6IFwiU2l6ZVwiLFxuICAgICAgICAgICAgICAgIHR5cGU6IHtcbiAgICAgICAgICAgICAgICAgICAgbmFtZTogXCJOdW1iZXJcIixcbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgfSxcbiAgICAgICAgfSxcbiAgICB9LFxufTtcbmNvbnN0IFBhZ2VMaXN0ID0ge1xuICAgIHNlcmlhbGl6ZWROYW1lOiBcIlBhZ2VMaXN0XCIsXG4gICAgdHlwZToge1xuICAgICAgICBuYW1lOiBcIkNvbXBvc2l0ZVwiLFxuICAgICAgICBjbGFzc05hbWU6IFwiUGFnZUxpc3RcIixcbiAgICAgICAgbW9kZWxQcm9wZXJ0aWVzOiB7XG4gICAgICAgICAgICBwYWdlUmFuZ2U6IHtcbiAgICAgICAgICAgICAgICBzZXJpYWxpemVkTmFtZTogXCJQYWdlUmFuZ2VcIixcbiAgICAgICAgICAgICAgICB4bWxOYW1lOiBcIlBhZ2VSYW5nZVwiLFxuICAgICAgICAgICAgICAgIHhtbEVsZW1lbnROYW1lOiBcIlBhZ2VSYW5nZVwiLFxuICAgICAgICAgICAgICAgIHR5cGU6IHtcbiAgICAgICAgICAgICAgICAgICAgbmFtZTogXCJTZXF1ZW5jZVwiLFxuICAgICAgICAgICAgICAgICAgICBlbGVtZW50OiB7XG4gICAgICAgICAgICAgICAgICAgICAgICB0eXBlOiB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgbmFtZTogXCJDb21wb3NpdGVcIixcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbGFzc05hbWU6IFwiUGFnZVJhbmdlXCIsXG4gICAgICAgICAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgY2xlYXJSYW5nZToge1xuICAgICAgICAgICAgICAgIHNlcmlhbGl6ZWROYW1lOiBcIkNsZWFyUmFuZ2VcIixcbiAgICAgICAgICAgICAgICB4bWxOYW1lOiBcIkNsZWFyUmFuZ2VcIixcbiAgICAgICAgICAgICAgICB4bWxFbGVtZW50TmFtZTogXCJDbGVhclJhbmdlXCIsXG4gICAgICAgICAgICAgICAgdHlwZToge1xuICAgICAgICAgICAgICAgICAgICBuYW1lOiBcIlNlcXVlbmNlXCIsXG4gICAgICAgICAgICAgICAgICAgIGVsZW1lbnQ6IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHR5cGU6IHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBuYW1lOiBcIkNvbXBvc2l0ZVwiLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNsYXNzTmFtZTogXCJDbGVhclJhbmdlXCIsXG4gICAgICAgICAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgY29udGludWF0aW9uVG9rZW46IHtcbiAgICAgICAgICAgICAgICBzZXJpYWxpemVkTmFtZTogXCJOZXh0TWFya2VyXCIsXG4gICAgICAgICAgICAgICAgeG1sTmFtZTogXCJOZXh0TWFya2VyXCIsXG4gICAgICAgICAgICAgICAgdHlwZToge1xuICAgICAgICAgICAgICAgICAgICBuYW1lOiBcIlN0cmluZ1wiLFxuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICB9LFxuICAgICAgICB9LFxuICAgIH0sXG59O1xuY29uc3QgUGFnZVJhbmdlID0ge1xuICAgIHNlcmlhbGl6ZWROYW1lOiBcIlBhZ2VSYW5nZVwiLFxuICAgIHhtbE5hbWU6IFwiUGFnZVJhbmdlXCIsXG4gICAgdHlwZToge1xuICAgICAgICBuYW1lOiBcIkNvbXBvc2l0ZVwiLFxuICAgICAgICBjbGFzc05hbWU6IFwiUGFnZVJhbmdlXCIsXG4gICAgICAgIG1vZGVsUHJvcGVydGllczoge1xuICAgICAgICAgICAgc3RhcnQ6IHtcbiAgICAgICAgICAgICAgICBzZXJpYWxpemVkTmFtZTogXCJTdGFydFwiLFxuICAgICAgICAgICAgICAgIHJlcXVpcmVkOiB0cnVlLFxuICAgICAgICAgICAgICAgIHhtbE5hbWU6IFwiU3RhcnRcIixcbiAgICAgICAgICAgICAgICB0eXBlOiB7XG4gICAgICAgICAgICAgICAgICAgIG5hbWU6IFwiTnVtYmVyXCIsXG4gICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBlbmQ6IHtcbiAgICAgICAgICAgICAgICBzZXJpYWxpemVkTmFtZTogXCJFbmRcIixcbiAgICAgICAgICAgICAgICByZXF1aXJlZDogdHJ1ZSxcbiAgICAgICAgICAgICAgICB4bWxOYW1lOiBcIkVuZFwiLFxuICAgICAgICAgICAgICAgIHR5cGU6IHtcbiAgICAgICAgICAgICAgICAgICAgbmFtZTogXCJOdW1iZXJcIixcbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgfSxcbiAgICAgICAgfSxcbiAgICB9LFxufTtcbmNvbnN0IENsZWFyUmFuZ2UgPSB7XG4gICAgc2VyaWFsaXplZE5hbWU6IFwiQ2xlYXJSYW5nZVwiLFxuICAgIHhtbE5hbWU6IFwiQ2xlYXJSYW5nZVwiLFxuICAgIHR5cGU6IHtcbiAgICAgICAgbmFtZTogXCJDb21wb3NpdGVcIixcbiAgICAgICAgY2xhc3NOYW1lOiBcIkNsZWFyUmFuZ2VcIixcbiAgICAgICAgbW9kZWxQcm9wZXJ0aWVzOiB7XG4gICAgICAgICAgICBzdGFydDoge1xuICAgICAgICAgICAgICAgIHNlcmlhbGl6ZWROYW1lOiBcIlN0YXJ0XCIsXG4gICAgICAgICAgICAgICAgcmVxdWlyZWQ6IHRydWUsXG4gICAgICAgICAgICAgICAgeG1sTmFtZTogXCJTdGFydFwiLFxuICAgICAgICAgICAgICAgIHR5cGU6IHtcbiAgICAgICAgICAgICAgICAgICAgbmFtZTogXCJOdW1iZXJcIixcbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIGVuZDoge1xuICAgICAgICAgICAgICAgIHNlcmlhbGl6ZWROYW1lOiBcIkVuZFwiLFxuICAgICAgICAgICAgICAgIHJlcXVpcmVkOiB0cnVlLFxuICAgICAgICAgICAgICAgIHhtbE5hbWU6IFwiRW5kXCIsXG4gICAgICAgICAgICAgICAgdHlwZToge1xuICAgICAgICAgICAgICAgICAgICBuYW1lOiBcIk51bWJlclwiLFxuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICB9LFxuICAgICAgICB9LFxuICAgIH0sXG59O1xuY29uc3QgUXVlcnlSZXF1ZXN0ID0ge1xuICAgIHNlcmlhbGl6ZWROYW1lOiBcIlF1ZXJ5UmVxdWVzdFwiLFxuICAgIHhtbE5hbWU6IFwiUXVlcnlSZXF1ZXN0XCIsXG4gICAgdHlwZToge1xuICAgICAgICBuYW1lOiBcIkNvbXBvc2l0ZVwiLFxuICAgICAgICBjbGFzc05hbWU6IFwiUXVlcnlSZXF1ZXN0XCIsXG4gICAgICAgIG1vZGVsUHJvcGVydGllczoge1xuICAgICAgICAgICAgcXVlcnlUeXBlOiB7XG4gICAgICAgICAgICAgICAgc2VyaWFsaXplZE5hbWU6IFwiUXVlcnlUeXBlXCIsXG4gICAgICAgICAgICAgICAgcmVxdWlyZWQ6IHRydWUsXG4gICAgICAgICAgICAgICAgeG1sTmFtZTogXCJRdWVyeVR5cGVcIixcbiAgICAgICAgICAgICAgICB0eXBlOiB7XG4gICAgICAgICAgICAgICAgICAgIG5hbWU6IFwiU3RyaW5nXCIsXG4gICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBleHByZXNzaW9uOiB7XG4gICAgICAgICAgICAgICAgc2VyaWFsaXplZE5hbWU6IFwiRXhwcmVzc2lvblwiLFxuICAgICAgICAgICAgICAgIHJlcXVpcmVkOiB0cnVlLFxuICAgICAgICAgICAgICAgIHhtbE5hbWU6IFwiRXhwcmVzc2lvblwiLFxuICAgICAgICAgICAgICAgIHR5cGU6IHtcbiAgICAgICAgICAgICAgICAgICAgbmFtZTogXCJTdHJpbmdcIixcbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIGlucHV0U2VyaWFsaXphdGlvbjoge1xuICAgICAgICAgICAgICAgIHNlcmlhbGl6ZWROYW1lOiBcIklucHV0U2VyaWFsaXphdGlvblwiLFxuICAgICAgICAgICAgICAgIHhtbE5hbWU6IFwiSW5wdXRTZXJpYWxpemF0aW9uXCIsXG4gICAgICAgICAgICAgICAgdHlwZToge1xuICAgICAgICAgICAgICAgICAgICBuYW1lOiBcIkNvbXBvc2l0ZVwiLFxuICAgICAgICAgICAgICAgICAgICBjbGFzc05hbWU6IFwiUXVlcnlTZXJpYWxpemF0aW9uXCIsXG4gICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBvdXRwdXRTZXJpYWxpemF0aW9uOiB7XG4gICAgICAgICAgICAgICAgc2VyaWFsaXplZE5hbWU6IFwiT3V0cHV0U2VyaWFsaXphdGlvblwiLFxuICAgICAgICAgICAgICAgIHhtbE5hbWU6IFwiT3V0cHV0U2VyaWFsaXphdGlvblwiLFxuICAgICAgICAgICAgICAgIHR5cGU6IHtcbiAgICAgICAgICAgICAgICAgICAgbmFtZTogXCJDb21wb3NpdGVcIixcbiAgICAgICAgICAgICAgICAgICAgY2xhc3NOYW1lOiBcIlF1ZXJ5U2VyaWFsaXphdGlvblwiLFxuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICB9LFxuICAgICAgICB9LFxuICAgIH0sXG59O1xuY29uc3QgUXVlcnlTZXJpYWxpemF0aW9uID0ge1xuICAgIHNlcmlhbGl6ZWROYW1lOiBcIlF1ZXJ5U2VyaWFsaXphdGlvblwiLFxuICAgIHR5cGU6IHtcbiAgICAgICAgbmFtZTogXCJDb21wb3NpdGVcIixcbiAgICAgICAgY2xhc3NOYW1lOiBcIlF1ZXJ5U2VyaWFsaXphdGlvblwiLFxuICAgICAgICBtb2RlbFByb3BlcnRpZXM6IHtcbiAgICAgICAgICAgIGZvcm1hdDoge1xuICAgICAgICAgICAgICAgIHNlcmlhbGl6ZWROYW1lOiBcIkZvcm1hdFwiLFxuICAgICAgICAgICAgICAgIHhtbE5hbWU6IFwiRm9ybWF0XCIsXG4gICAgICAgICAgICAgICAgdHlwZToge1xuICAgICAgICAgICAgICAgICAgICBuYW1lOiBcIkNvbXBvc2l0ZVwiLFxuICAgICAgICAgICAgICAgICAgICBjbGFzc05hbWU6IFwiUXVlcnlGb3JtYXRcIixcbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgfSxcbiAgICAgICAgfSxcbiAgICB9LFxufTtcbmNvbnN0IFF1ZXJ5Rm9ybWF0ID0ge1xuICAgIHNlcmlhbGl6ZWROYW1lOiBcIlF1ZXJ5Rm9ybWF0XCIsXG4gICAgdHlwZToge1xuICAgICAgICBuYW1lOiBcIkNvbXBvc2l0ZVwiLFxuICAgICAgICBjbGFzc05hbWU6IFwiUXVlcnlGb3JtYXRcIixcbiAgICAgICAgbW9kZWxQcm9wZXJ0aWVzOiB7XG4gICAgICAgICAgICB0eXBlOiB7XG4gICAgICAgICAgICAgICAgc2VyaWFsaXplZE5hbWU6IFwiVHlwZVwiLFxuICAgICAgICAgICAgICAgIHJlcXVpcmVkOiB0cnVlLFxuICAgICAgICAgICAgICAgIHhtbE5hbWU6IFwiVHlwZVwiLFxuICAgICAgICAgICAgICAgIHR5cGU6IHtcbiAgICAgICAgICAgICAgICAgICAgbmFtZTogXCJFbnVtXCIsXG4gICAgICAgICAgICAgICAgICAgIGFsbG93ZWRWYWx1ZXM6IFtcImRlbGltaXRlZFwiLCBcImpzb25cIiwgXCJhcnJvd1wiLCBcInBhcnF1ZXRcIl0sXG4gICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBkZWxpbWl0ZWRUZXh0Q29uZmlndXJhdGlvbjoge1xuICAgICAgICAgICAgICAgIHNlcmlhbGl6ZWROYW1lOiBcIkRlbGltaXRlZFRleHRDb25maWd1cmF0aW9uXCIsXG4gICAgICAgICAgICAgICAgeG1sTmFtZTogXCJEZWxpbWl0ZWRUZXh0Q29uZmlndXJhdGlvblwiLFxuICAgICAgICAgICAgICAgIHR5cGU6IHtcbiAgICAgICAgICAgICAgICAgICAgbmFtZTogXCJDb21wb3NpdGVcIixcbiAgICAgICAgICAgICAgICAgICAgY2xhc3NOYW1lOiBcIkRlbGltaXRlZFRleHRDb25maWd1cmF0aW9uXCIsXG4gICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBqc29uVGV4dENvbmZpZ3VyYXRpb246IHtcbiAgICAgICAgICAgICAgICBzZXJpYWxpemVkTmFtZTogXCJKc29uVGV4dENvbmZpZ3VyYXRpb25cIixcbiAgICAgICAgICAgICAgICB4bWxOYW1lOiBcIkpzb25UZXh0Q29uZmlndXJhdGlvblwiLFxuICAgICAgICAgICAgICAgIHR5cGU6IHtcbiAgICAgICAgICAgICAgICAgICAgbmFtZTogXCJDb21wb3NpdGVcIixcbiAgICAgICAgICAgICAgICAgICAgY2xhc3NOYW1lOiBcIkpzb25UZXh0Q29uZmlndXJhdGlvblwiLFxuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgYXJyb3dDb25maWd1cmF0aW9uOiB7XG4gICAgICAgICAgICAgICAgc2VyaWFsaXplZE5hbWU6IFwiQXJyb3dDb25maWd1cmF0aW9uXCIsXG4gICAgICAgICAgICAgICAgeG1sTmFtZTogXCJBcnJvd0NvbmZpZ3VyYXRpb25cIixcbiAgICAgICAgICAgICAgICB0eXBlOiB7XG4gICAgICAgICAgICAgICAgICAgIG5hbWU6IFwiQ29tcG9zaXRlXCIsXG4gICAgICAgICAgICAgICAgICAgIGNsYXNzTmFtZTogXCJBcnJvd0NvbmZpZ3VyYXRpb25cIixcbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIHBhcnF1ZXRUZXh0Q29uZmlndXJhdGlvbjoge1xuICAgICAgICAgICAgICAgIHNlcmlhbGl6ZWROYW1lOiBcIlBhcnF1ZXRUZXh0Q29uZmlndXJhdGlvblwiLFxuICAgICAgICAgICAgICAgIHhtbE5hbWU6IFwiUGFycXVldFRleHRDb25maWd1cmF0aW9uXCIsXG4gICAgICAgICAgICAgICAgdHlwZToge1xuICAgICAgICAgICAgICAgICAgICBuYW1lOiBcIkRpY3Rpb25hcnlcIixcbiAgICAgICAgICAgICAgICAgICAgdmFsdWU6IHsgdHlwZTogeyBuYW1lOiBcImFueVwiIH0gfSxcbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgfSxcbiAgICAgICAgfSxcbiAgICB9LFxufTtcbmNvbnN0IERlbGltaXRlZFRleHRDb25maWd1cmF0aW9uID0ge1xuICAgIHNlcmlhbGl6ZWROYW1lOiBcIkRlbGltaXRlZFRleHRDb25maWd1cmF0aW9uXCIsXG4gICAgeG1sTmFtZTogXCJEZWxpbWl0ZWRUZXh0Q29uZmlndXJhdGlvblwiLFxuICAgIHR5cGU6IHtcbiAgICAgICAgbmFtZTogXCJDb21wb3NpdGVcIixcbiAgICAgICAgY2xhc3NOYW1lOiBcIkRlbGltaXRlZFRleHRDb25maWd1cmF0aW9uXCIsXG4gICAgICAgIG1vZGVsUHJvcGVydGllczoge1xuICAgICAgICAgICAgY29sdW1uU2VwYXJhdG9yOiB7XG4gICAgICAgICAgICAgICAgc2VyaWFsaXplZE5hbWU6IFwiQ29sdW1uU2VwYXJhdG9yXCIsXG4gICAgICAgICAgICAgICAgeG1sTmFtZTogXCJDb2x1bW5TZXBhcmF0b3JcIixcbiAgICAgICAgICAgICAgICB0eXBlOiB7XG4gICAgICAgICAgICAgICAgICAgIG5hbWU6IFwiU3RyaW5nXCIsXG4gICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBmaWVsZFF1b3RlOiB7XG4gICAgICAgICAgICAgICAgc2VyaWFsaXplZE5hbWU6IFwiRmllbGRRdW90ZVwiLFxuICAgICAgICAgICAgICAgIHhtbE5hbWU6IFwiRmllbGRRdW90ZVwiLFxuICAgICAgICAgICAgICAgIHR5cGU6IHtcbiAgICAgICAgICAgICAgICAgICAgbmFtZTogXCJTdHJpbmdcIixcbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIHJlY29yZFNlcGFyYXRvcjoge1xuICAgICAgICAgICAgICAgIHNlcmlhbGl6ZWROYW1lOiBcIlJlY29yZFNlcGFyYXRvclwiLFxuICAgICAgICAgICAgICAgIHhtbE5hbWU6IFwiUmVjb3JkU2VwYXJhdG9yXCIsXG4gICAgICAgICAgICAgICAgdHlwZToge1xuICAgICAgICAgICAgICAgICAgICBuYW1lOiBcIlN0cmluZ1wiLFxuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgZXNjYXBlQ2hhcjoge1xuICAgICAgICAgICAgICAgIHNlcmlhbGl6ZWROYW1lOiBcIkVzY2FwZUNoYXJcIixcbiAgICAgICAgICAgICAgICB4bWxOYW1lOiBcIkVzY2FwZUNoYXJcIixcbiAgICAgICAgICAgICAgICB0eXBlOiB7XG4gICAgICAgICAgICAgICAgICAgIG5hbWU6IFwiU3RyaW5nXCIsXG4gICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBoZWFkZXJzUHJlc2VudDoge1xuICAgICAgICAgICAgICAgIHNlcmlhbGl6ZWROYW1lOiBcIkhlYWRlcnNQcmVzZW50XCIsXG4gICAgICAgICAgICAgICAgeG1sTmFtZTogXCJIYXNIZWFkZXJzXCIsXG4gICAgICAgICAgICAgICAgdHlwZToge1xuICAgICAgICAgICAgICAgICAgICBuYW1lOiBcIkJvb2xlYW5cIixcbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgfSxcbiAgICAgICAgfSxcbiAgICB9LFxufTtcbmNvbnN0IEpzb25UZXh0Q29uZmlndXJhdGlvbiA9IHtcbiAgICBzZXJpYWxpemVkTmFtZTogXCJKc29uVGV4dENvbmZpZ3VyYXRpb25cIixcbiAgICB4bWxOYW1lOiBcIkpzb25UZXh0Q29uZmlndXJhdGlvblwiLFxuICAgIHR5cGU6IHtcbiAgICAgICAgbmFtZTogXCJDb21wb3NpdGVcIixcbiAgICAgICAgY2xhc3NOYW1lOiBcIkpzb25UZXh0Q29uZmlndXJhdGlvblwiLFxuICAgICAgICBtb2RlbFByb3BlcnRpZXM6IHtcbiAgICAgICAgICAgIHJlY29yZFNlcGFyYXRvcjoge1xuICAgICAgICAgICAgICAgIHNlcmlhbGl6ZWROYW1lOiBcIlJlY29yZFNlcGFyYXRvclwiLFxuICAgICAgICAgICAgICAgIHhtbE5hbWU6IFwiUmVjb3JkU2VwYXJhdG9yXCIsXG4gICAgICAgICAgICAgICAgdHlwZToge1xuICAgICAgICAgICAgICAgICAgICBuYW1lOiBcIlN0cmluZ1wiLFxuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICB9LFxuICAgICAgICB9LFxuICAgIH0sXG59O1xuY29uc3QgQXJyb3dDb25maWd1cmF0aW9uID0ge1xuICAgIHNlcmlhbGl6ZWROYW1lOiBcIkFycm93Q29uZmlndXJhdGlvblwiLFxuICAgIHhtbE5hbWU6IFwiQXJyb3dDb25maWd1cmF0aW9uXCIsXG4gICAgdHlwZToge1xuICAgICAgICBuYW1lOiBcIkNvbXBvc2l0ZVwiLFxuICAgICAgICBjbGFzc05hbWU6IFwiQXJyb3dDb25maWd1cmF0aW9uXCIsXG4gICAgICAgIG1vZGVsUHJvcGVydGllczoge1xuICAgICAgICAgICAgc2NoZW1hOiB7XG4gICAgICAgICAgICAgICAgc2VyaWFsaXplZE5hbWU6IFwiU2NoZW1hXCIsXG4gICAgICAgICAgICAgICAgcmVxdWlyZWQ6IHRydWUsXG4gICAgICAgICAgICAgICAgeG1sTmFtZTogXCJTY2hlbWFcIixcbiAgICAgICAgICAgICAgICB4bWxJc1dyYXBwZWQ6IHRydWUsXG4gICAgICAgICAgICAgICAgeG1sRWxlbWVudE5hbWU6IFwiRmllbGRcIixcbiAgICAgICAgICAgICAgICB0eXBlOiB7XG4gICAgICAgICAgICAgICAgICAgIG5hbWU6IFwiU2VxdWVuY2VcIixcbiAgICAgICAgICAgICAgICAgICAgZWxlbWVudDoge1xuICAgICAgICAgICAgICAgICAgICAgICAgdHlwZToge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5hbWU6IFwiQ29tcG9zaXRlXCIsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY2xhc3NOYW1lOiBcIkFycm93RmllbGRcIixcbiAgICAgICAgICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIH0sXG4gICAgICAgIH0sXG4gICAgfSxcbn07XG5jb25zdCBBcnJvd0ZpZWxkID0ge1xuICAgIHNlcmlhbGl6ZWROYW1lOiBcIkFycm93RmllbGRcIixcbiAgICB4bWxOYW1lOiBcIkZpZWxkXCIsXG4gICAgdHlwZToge1xuICAgICAgICBuYW1lOiBcIkNvbXBvc2l0ZVwiLFxuICAgICAgICBjbGFzc05hbWU6IFwiQXJyb3dGaWVsZFwiLFxuICAgICAgICBtb2RlbFByb3BlcnRpZXM6IHtcbiAgICAgICAgICAgIHR5cGU6IHtcbiAgICAgICAgICAgICAgICBzZXJpYWxpemVkTmFtZTogXCJUeXBlXCIsXG4gICAgICAgICAgICAgICAgcmVxdWlyZWQ6IHRydWUsXG4gICAgICAgICAgICAgICAgeG1sTmFtZTogXCJUeXBlXCIsXG4gICAgICAgICAgICAgICAgdHlwZToge1xuICAgICAgICAgICAgICAgICAgICBuYW1lOiBcIlN0cmluZ1wiLFxuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgbmFtZToge1xuICAgICAgICAgICAgICAgIHNlcmlhbGl6ZWROYW1lOiBcIk5hbWVcIixcbiAgICAgICAgICAgICAgICB4bWxOYW1lOiBcIk5hbWVcIixcbiAgICAgICAgICAgICAgICB0eXBlOiB7XG4gICAgICAgICAgICAgICAgICAgIG5hbWU6IFwiU3RyaW5nXCIsXG4gICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBwcmVjaXNpb246IHtcbiAgICAgICAgICAgICAgICBzZXJpYWxpemVkTmFtZTogXCJQcmVjaXNpb25cIixcbiAgICAgICAgICAgICAgICB4bWxOYW1lOiBcIlByZWNpc2lvblwiLFxuICAgICAgICAgICAgICAgIHR5cGU6IHtcbiAgICAgICAgICAgICAgICAgICAgbmFtZTogXCJOdW1iZXJcIixcbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIHNjYWxlOiB7XG4gICAgICAgICAgICAgICAgc2VyaWFsaXplZE5hbWU6IFwiU2NhbGVcIixcbiAgICAgICAgICAgICAgICB4bWxOYW1lOiBcIlNjYWxlXCIsXG4gICAgICAgICAgICAgICAgdHlwZToge1xuICAgICAgICAgICAgICAgICAgICBuYW1lOiBcIk51bWJlclwiLFxuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICB9LFxuICAgICAgICB9LFxuICAgIH0sXG59O1xuY29uc3QgU2VydmljZVNldFByb3BlcnRpZXNIZWFkZXJzID0ge1xuICAgIHNlcmlhbGl6ZWROYW1lOiBcIlNlcnZpY2Vfc2V0UHJvcGVydGllc0hlYWRlcnNcIixcbiAgICB0eXBlOiB7XG4gICAgICAgIG5hbWU6IFwiQ29tcG9zaXRlXCIsXG4gICAgICAgIGNsYXNzTmFtZTogXCJTZXJ2aWNlU2V0UHJvcGVydGllc0hlYWRlcnNcIixcbiAgICAgICAgbW9kZWxQcm9wZXJ0aWVzOiB7XG4gICAgICAgICAgICBjbGllbnRSZXF1ZXN0SWQ6IHtcbiAgICAgICAgICAgICAgICBzZXJpYWxpemVkTmFtZTogXCJ4LW1zLWNsaWVudC1yZXF1ZXN0LWlkXCIsXG4gICAgICAgICAgICAgICAgeG1sTmFtZTogXCJ4LW1zLWNsaWVudC1yZXF1ZXN0LWlkXCIsXG4gICAgICAgICAgICAgICAgdHlwZToge1xuICAgICAgICAgICAgICAgICAgICBuYW1lOiBcIlN0cmluZ1wiLFxuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgcmVxdWVzdElkOiB7XG4gICAgICAgICAgICAgICAgc2VyaWFsaXplZE5hbWU6IFwieC1tcy1yZXF1ZXN0LWlkXCIsXG4gICAgICAgICAgICAgICAgeG1sTmFtZTogXCJ4LW1zLXJlcXVlc3QtaWRcIixcbiAgICAgICAgICAgICAgICB0eXBlOiB7XG4gICAgICAgICAgICAgICAgICAgIG5hbWU6IFwiU3RyaW5nXCIsXG4gICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICB2ZXJzaW9uOiB7XG4gICAgICAgICAgICAgICAgc2VyaWFsaXplZE5hbWU6IFwieC1tcy12ZXJzaW9uXCIsXG4gICAgICAgICAgICAgICAgeG1sTmFtZTogXCJ4LW1zLXZlcnNpb25cIixcbiAgICAgICAgICAgICAgICB0eXBlOiB7XG4gICAgICAgICAgICAgICAgICAgIG5hbWU6IFwiU3RyaW5nXCIsXG4gICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBlcnJvckNvZGU6IHtcbiAgICAgICAgICAgICAgICBzZXJpYWxpemVkTmFtZTogXCJ4LW1zLWVycm9yLWNvZGVcIixcbiAgICAgICAgICAgICAgICB4bWxOYW1lOiBcIngtbXMtZXJyb3ItY29kZVwiLFxuICAgICAgICAgICAgICAgIHR5cGU6IHtcbiAgICAgICAgICAgICAgICAgICAgbmFtZTogXCJTdHJpbmdcIixcbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgfSxcbiAgICAgICAgfSxcbiAgICB9LFxufTtcbmNvbnN0IFNlcnZpY2VTZXRQcm9wZXJ0aWVzRXhjZXB0aW9uSGVhZGVycyA9IHtcbiAgICBzZXJpYWxpemVkTmFtZTogXCJTZXJ2aWNlX3NldFByb3BlcnRpZXNFeGNlcHRpb25IZWFkZXJzXCIsXG4gICAgdHlwZToge1xuICAgICAgICBuYW1lOiBcIkNvbXBvc2l0ZVwiLFxuICAgICAgICBjbGFzc05hbWU6IFwiU2VydmljZVNldFByb3BlcnRpZXNFeGNlcHRpb25IZWFkZXJzXCIsXG4gICAgICAgIG1vZGVsUHJvcGVydGllczoge1xuICAgICAgICAgICAgZXJyb3JDb2RlOiB7XG4gICAgICAgICAgICAgICAgc2VyaWFsaXplZE5hbWU6IFwieC1tcy1lcnJvci1jb2RlXCIsXG4gICAgICAgICAgICAgICAgeG1sTmFtZTogXCJ4LW1zLWVycm9yLWNvZGVcIixcbiAgICAgICAgICAgICAgICB0eXBlOiB7XG4gICAgICAgICAgICAgICAgICAgIG5hbWU6IFwiU3RyaW5nXCIsXG4gICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIH0sXG4gICAgICAgIH0sXG4gICAgfSxcbn07XG5jb25zdCBTZXJ2aWNlR2V0UHJvcGVydGllc0hlYWRlcnMgPSB7XG4gICAgc2VyaWFsaXplZE5hbWU6IFwiU2VydmljZV9nZXRQcm9wZXJ0aWVzSGVhZGVyc1wiLFxuICAgIHR5cGU6IHtcbiAgICAgICAgbmFtZTogXCJDb21wb3NpdGVcIixcbiAgICAgICAgY2xhc3NOYW1lOiBcIlNlcnZpY2VHZXRQcm9wZXJ0aWVzSGVhZGVyc1wiLFxuICAgICAgICBtb2RlbFByb3BlcnRpZXM6IHtcbiAgICAgICAgICAgIGNsaWVudFJlcXVlc3RJZDoge1xuICAgICAgICAgICAgICAgIHNlcmlhbGl6ZWROYW1lOiBcIngtbXMtY2xpZW50LXJlcXVlc3QtaWRcIixcbiAgICAgICAgICAgICAgICB4bWxOYW1lOiBcIngtbXMtY2xpZW50LXJlcXVlc3QtaWRcIixcbiAgICAgICAgICAgICAgICB0eXBlOiB7XG4gICAgICAgICAgICAgICAgICAgIG5hbWU6IFwiU3RyaW5nXCIsXG4gICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICByZXF1ZXN0SWQ6IHtcbiAgICAgICAgICAgICAgICBzZXJpYWxpemVkTmFtZTogXCJ4LW1zLXJlcXVlc3QtaWRcIixcbiAgICAgICAgICAgICAgICB4bWxOYW1lOiBcIngtbXMtcmVxdWVzdC1pZFwiLFxuICAgICAgICAgICAgICAgIHR5cGU6IHtcbiAgICAgICAgICAgICAgICAgICAgbmFtZTogXCJTdHJpbmdcIixcbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIHZlcnNpb246IHtcbiAgICAgICAgICAgICAgICBzZXJpYWxpemVkTmFtZTogXCJ4LW1zLXZlcnNpb25cIixcbiAgICAgICAgICAgICAgICB4bWxOYW1lOiBcIngtbXMtdmVyc2lvblwiLFxuICAgICAgICAgICAgICAgIHR5cGU6IHtcbiAgICAgICAgICAgICAgICAgICAgbmFtZTogXCJTdHJpbmdcIixcbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIGVycm9yQ29kZToge1xuICAgICAgICAgICAgICAgIHNlcmlhbGl6ZWROYW1lOiBcIngtbXMtZXJyb3ItY29kZVwiLFxuICAgICAgICAgICAgICAgIHhtbE5hbWU6IFwieC1tcy1lcnJvci1jb2RlXCIsXG4gICAgICAgICAgICAgICAgdHlwZToge1xuICAgICAgICAgICAgICAgICAgICBuYW1lOiBcIlN0cmluZ1wiLFxuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICB9LFxuICAgICAgICB9LFxuICAgIH0sXG59O1xuY29uc3QgU2VydmljZUdldFByb3BlcnRpZXNFeGNlcHRpb25IZWFkZXJzID0ge1xuICAgIHNlcmlhbGl6ZWROYW1lOiBcIlNlcnZpY2VfZ2V0UHJvcGVydGllc0V4Y2VwdGlvbkhlYWRlcnNcIixcbiAgICB0eXBlOiB7XG4gICAgICAgIG5hbWU6IFwiQ29tcG9zaXRlXCIsXG4gICAgICAgIGNsYXNzTmFtZTogXCJTZXJ2aWNlR2V0UHJvcGVydGllc0V4Y2VwdGlvbkhlYWRlcnNcIixcbiAgICAgICAgbW9kZWxQcm9wZXJ0aWVzOiB7XG4gICAgICAgICAgICBlcnJvckNvZGU6IHtcbiAgICAgICAgICAgICAgICBzZXJpYWxpemVkTmFtZTogXCJ4LW1zLWVycm9yLWNvZGVcIixcbiAgICAgICAgICAgICAgICB4bWxOYW1lOiBcIngtbXMtZXJyb3ItY29kZVwiLFxuICAgICAgICAgICAgICAgIHR5cGU6IHtcbiAgICAgICAgICAgICAgICAgICAgbmFtZTogXCJTdHJpbmdcIixcbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgfSxcbiAgICAgICAgfSxcbiAgICB9LFxufTtcbmNvbnN0IFNlcnZpY2VHZXRTdGF0aXN0aWNzSGVhZGVycyA9IHtcbiAgICBzZXJpYWxpemVkTmFtZTogXCJTZXJ2aWNlX2dldFN0YXRpc3RpY3NIZWFkZXJzXCIsXG4gICAgdHlwZToge1xuICAgICAgICBuYW1lOiBcIkNvbXBvc2l0ZVwiLFxuICAgICAgICBjbGFzc05hbWU6IFwiU2VydmljZUdldFN0YXRpc3RpY3NIZWFkZXJzXCIsXG4gICAgICAgIG1vZGVsUHJvcGVydGllczoge1xuICAgICAgICAgICAgY2xpZW50UmVxdWVzdElkOiB7XG4gICAgICAgICAgICAgICAgc2VyaWFsaXplZE5hbWU6IFwieC1tcy1jbGllbnQtcmVxdWVzdC1pZFwiLFxuICAgICAgICAgICAgICAgIHhtbE5hbWU6IFwieC1tcy1jbGllbnQtcmVxdWVzdC1pZFwiLFxuICAgICAgICAgICAgICAgIHR5cGU6IHtcbiAgICAgICAgICAgICAgICAgICAgbmFtZTogXCJTdHJpbmdcIixcbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIHJlcXVlc3RJZDoge1xuICAgICAgICAgICAgICAgIHNlcmlhbGl6ZWROYW1lOiBcIngtbXMtcmVxdWVzdC1pZFwiLFxuICAgICAgICAgICAgICAgIHhtbE5hbWU6IFwieC1tcy1yZXF1ZXN0LWlkXCIsXG4gICAgICAgICAgICAgICAgdHlwZToge1xuICAgICAgICAgICAgICAgICAgICBuYW1lOiBcIlN0cmluZ1wiLFxuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgdmVyc2lvbjoge1xuICAgICAgICAgICAgICAgIHNlcmlhbGl6ZWROYW1lOiBcIngtbXMtdmVyc2lvblwiLFxuICAgICAgICAgICAgICAgIHhtbE5hbWU6IFwieC1tcy12ZXJzaW9uXCIsXG4gICAgICAgICAgICAgICAgdHlwZToge1xuICAgICAgICAgICAgICAgICAgICBuYW1lOiBcIlN0cmluZ1wiLFxuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgZGF0ZToge1xuICAgICAgICAgICAgICAgIHNlcmlhbGl6ZWROYW1lOiBcImRhdGVcIixcbiAgICAgICAgICAgICAgICB4bWxOYW1lOiBcImRhdGVcIixcbiAgICAgICAgICAgICAgICB0eXBlOiB7XG4gICAgICAgICAgICAgICAgICAgIG5hbWU6IFwiRGF0ZVRpbWVSZmMxMTIzXCIsXG4gICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBlcnJvckNvZGU6IHtcbiAgICAgICAgICAgICAgICBzZXJpYWxpemVkTmFtZTogXCJ4LW1zLWVycm9yLWNvZGVcIixcbiAgICAgICAgICAgICAgICB4bWxOYW1lOiBcIngtbXMtZXJyb3ItY29kZVwiLFxuICAgICAgICAgICAgICAgIHR5cGU6IHtcbiAgICAgICAgICAgICAgICAgICAgbmFtZTogXCJTdHJpbmdcIixcbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgfSxcbiAgICAgICAgfSxcbiAgICB9LFxufTtcbmNvbnN0IFNlcnZpY2VHZXRTdGF0aXN0aWNzRXhjZXB0aW9uSGVhZGVycyA9IHtcbiAgICBzZXJpYWxpemVkTmFtZTogXCJTZXJ2aWNlX2dldFN0YXRpc3RpY3NFeGNlcHRpb25IZWFkZXJzXCIsXG4gICAgdHlwZToge1xuICAgICAgICBuYW1lOiBcIkNvbXBvc2l0ZVwiLFxuICAgICAgICBjbGFzc05hbWU6IFwiU2VydmljZUdldFN0YXRpc3RpY3NFeGNlcHRpb25IZWFkZXJzXCIsXG4gICAgICAgIG1vZGVsUHJvcGVydGllczoge1xuICAgICAgICAgICAgZXJyb3JDb2RlOiB7XG4gICAgICAgICAgICAgICAgc2VyaWFsaXplZE5hbWU6IFwieC1tcy1lcnJvci1jb2RlXCIsXG4gICAgICAgICAgICAgICAgeG1sTmFtZTogXCJ4LW1zLWVycm9yLWNvZGVcIixcbiAgICAgICAgICAgICAgICB0eXBlOiB7XG4gICAgICAgICAgICAgICAgICAgIG5hbWU6IFwiU3RyaW5nXCIsXG4gICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIH0sXG4gICAgICAgIH0sXG4gICAgfSxcbn07XG5jb25zdCBTZXJ2aWNlTGlzdENvbnRhaW5lcnNTZWdtZW50SGVhZGVycyA9IHtcbiAgICBzZXJpYWxpemVkTmFtZTogXCJTZXJ2aWNlX2xpc3RDb250YWluZXJzU2VnbWVudEhlYWRlcnNcIixcbiAgICB0eXBlOiB7XG4gICAgICAgIG5hbWU6IFwiQ29tcG9zaXRlXCIsXG4gICAgICAgIGNsYXNzTmFtZTogXCJTZXJ2aWNlTGlzdENvbnRhaW5lcnNTZWdtZW50SGVhZGVyc1wiLFxuICAgICAgICBtb2RlbFByb3BlcnRpZXM6IHtcbiAgICAgICAgICAgIGNsaWVudFJlcXVlc3RJZDoge1xuICAgICAgICAgICAgICAgIHNlcmlhbGl6ZWROYW1lOiBcIngtbXMtY2xpZW50LXJlcXVlc3QtaWRcIixcbiAgICAgICAgICAgICAgICB4bWxOYW1lOiBcIngtbXMtY2xpZW50LXJlcXVlc3QtaWRcIixcbiAgICAgICAgICAgICAgICB0eXBlOiB7XG4gICAgICAgICAgICAgICAgICAgIG5hbWU6IFwiU3RyaW5nXCIsXG4gICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICByZXF1ZXN0SWQ6IHtcbiAgICAgICAgICAgICAgICBzZXJpYWxpemVkTmFtZTogXCJ4LW1zLXJlcXVlc3QtaWRcIixcbiAgICAgICAgICAgICAgICB4bWxOYW1lOiBcIngtbXMtcmVxdWVzdC1pZFwiLFxuICAgICAgICAgICAgICAgIHR5cGU6IHtcbiAgICAgICAgICAgICAgICAgICAgbmFtZTogXCJTdHJpbmdcIixcbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIHZlcnNpb246IHtcbiAgICAgICAgICAgICAgICBzZXJpYWxpemVkTmFtZTogXCJ4LW1zLXZlcnNpb25cIixcbiAgICAgICAgICAgICAgICB4bWxOYW1lOiBcIngtbXMtdmVyc2lvblwiLFxuICAgICAgICAgICAgICAgIHR5cGU6IHtcbiAgICAgICAgICAgICAgICAgICAgbmFtZTogXCJTdHJpbmdcIixcbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIGVycm9yQ29kZToge1xuICAgICAgICAgICAgICAgIHNlcmlhbGl6ZWROYW1lOiBcIngtbXMtZXJyb3ItY29kZVwiLFxuICAgICAgICAgICAgICAgIHhtbE5hbWU6IFwieC1tcy1lcnJvci1jb2RlXCIsXG4gICAgICAgICAgICAgICAgdHlwZToge1xuICAgICAgICAgICAgICAgICAgICBuYW1lOiBcIlN0cmluZ1wiLFxuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICB9LFxuICAgICAgICB9LFxuICAgIH0sXG59O1xuY29uc3QgU2VydmljZUxpc3RDb250YWluZXJzU2VnbWVudEV4Y2VwdGlvbkhlYWRlcnMgPSB7XG4gICAgc2VyaWFsaXplZE5hbWU6IFwiU2VydmljZV9saXN0Q29udGFpbmVyc1NlZ21lbnRFeGNlcHRpb25IZWFkZXJzXCIsXG4gICAgdHlwZToge1xuICAgICAgICBuYW1lOiBcIkNvbXBvc2l0ZVwiLFxuICAgICAgICBjbGFzc05hbWU6IFwiU2VydmljZUxpc3RDb250YWluZXJzU2VnbWVudEV4Y2VwdGlvbkhlYWRlcnNcIixcbiAgICAgICAgbW9kZWxQcm9wZXJ0aWVzOiB7XG4gICAgICAgICAgICBlcnJvckNvZGU6IHtcbiAgICAgICAgICAgICAgICBzZXJpYWxpemVkTmFtZTogXCJ4LW1zLWVycm9yLWNvZGVcIixcbiAgICAgICAgICAgICAgICB4bWxOYW1lOiBcIngtbXMtZXJyb3ItY29kZVwiLFxuICAgICAgICAgICAgICAgIHR5cGU6IHtcbiAgICAgICAgICAgICAgICAgICAgbmFtZTogXCJTdHJpbmdcIixcbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgfSxcbiAgICAgICAgfSxcbiAgICB9LFxufTtcbmNvbnN0IFNlcnZpY2VHZXRVc2VyRGVsZWdhdGlvbktleUhlYWRlcnMgPSB7XG4gICAgc2VyaWFsaXplZE5hbWU6IFwiU2VydmljZV9nZXRVc2VyRGVsZWdhdGlvbktleUhlYWRlcnNcIixcbiAgICB0eXBlOiB7XG4gICAgICAgIG5hbWU6IFwiQ29tcG9zaXRlXCIsXG4gICAgICAgIGNsYXNzTmFtZTogXCJTZXJ2aWNlR2V0VXNlckRlbGVnYXRpb25LZXlIZWFkZXJzXCIsXG4gICAgICAgIG1vZGVsUHJvcGVydGllczoge1xuICAgICAgICAgICAgY2xpZW50UmVxdWVzdElkOiB7XG4gICAgICAgICAgICAgICAgc2VyaWFsaXplZE5hbWU6IFwieC1tcy1jbGllbnQtcmVxdWVzdC1pZFwiLFxuICAgICAgICAgICAgICAgIHhtbE5hbWU6IFwieC1tcy1jbGllbnQtcmVxdWVzdC1pZFwiLFxuICAgICAgICAgICAgICAgIHR5cGU6IHtcbiAgICAgICAgICAgICAgICAgICAgbmFtZTogXCJTdHJpbmdcIixcbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIHJlcXVlc3RJZDoge1xuICAgICAgICAgICAgICAgIHNlcmlhbGl6ZWROYW1lOiBcIngtbXMtcmVxdWVzdC1pZFwiLFxuICAgICAgICAgICAgICAgIHhtbE5hbWU6IFwieC1tcy1yZXF1ZXN0LWlkXCIsXG4gICAgICAgICAgICAgICAgdHlwZToge1xuICAgICAgICAgICAgICAgICAgICBuYW1lOiBcIlN0cmluZ1wiLFxuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgdmVyc2lvbjoge1xuICAgICAgICAgICAgICAgIHNlcmlhbGl6ZWROYW1lOiBcIngtbXMtdmVyc2lvblwiLFxuICAgICAgICAgICAgICAgIHhtbE5hbWU6IFwieC1tcy12ZXJzaW9uXCIsXG4gICAgICAgICAgICAgICAgdHlwZToge1xuICAgICAgICAgICAgICAgICAgICBuYW1lOiBcIlN0cmluZ1wiLFxuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgZGF0ZToge1xuICAgICAgICAgICAgICAgIHNlcmlhbGl6ZWROYW1lOiBcImRhdGVcIixcbiAgICAgICAgICAgICAgICB4bWxOYW1lOiBcImRhdGVcIixcbiAgICAgICAgICAgICAgICB0eXBlOiB7XG4gICAgICAgICAgICAgICAgICAgIG5hbWU6IFwiRGF0ZVRpbWVSZmMxMTIzXCIsXG4gICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBlcnJvckNvZGU6IHtcbiAgICAgICAgICAgICAgICBzZXJpYWxpemVkTmFtZTogXCJ4LW1zLWVycm9yLWNvZGVcIixcbiAgICAgICAgICAgICAgICB4bWxOYW1lOiBcIngtbXMtZXJyb3ItY29kZVwiLFxuICAgICAgICAgICAgICAgIHR5cGU6IHtcbiAgICAgICAgICAgICAgICAgICAgbmFtZTogXCJTdHJpbmdcIixcbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgfSxcbiAgICAgICAgfSxcbiAgICB9LFxufTtcbmNvbnN0IFNlcnZpY2VHZXRVc2VyRGVsZWdhdGlvbktleUV4Y2VwdGlvbkhlYWRlcnMgPSB7XG4gICAgc2VyaWFsaXplZE5hbWU6IFwiU2VydmljZV9nZXRVc2VyRGVsZWdhdGlvbktleUV4Y2VwdGlvbkhlYWRlcnNcIixcbiAgICB0eXBlOiB7XG4gICAgICAgIG5hbWU6IFwiQ29tcG9zaXRlXCIsXG4gICAgICAgIGNsYXNzTmFtZTogXCJTZXJ2aWNlR2V0VXNlckRlbGVnYXRpb25LZXlFeGNlcHRpb25IZWFkZXJzXCIsXG4gICAgICAgIG1vZGVsUHJvcGVydGllczoge1xuICAgICAgICAgICAgZXJyb3JDb2RlOiB7XG4gICAgICAgICAgICAgICAgc2VyaWFsaXplZE5hbWU6IFwieC1tcy1lcnJvci1jb2RlXCIsXG4gICAgICAgICAgICAgICAgeG1sTmFtZTogXCJ4LW1zLWVycm9yLWNvZGVcIixcbiAgICAgICAgICAgICAgICB0eXBlOiB7XG4gICAgICAgICAgICAgICAgICAgIG5hbWU6IFwiU3RyaW5nXCIsXG4gICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIH0sXG4gICAgICAgIH0sXG4gICAgfSxcbn07XG5jb25zdCBTZXJ2aWNlR2V0QWNjb3VudEluZm9IZWFkZXJzID0ge1xuICAgIHNlcmlhbGl6ZWROYW1lOiBcIlNlcnZpY2VfZ2V0QWNjb3VudEluZm9IZWFkZXJzXCIsXG4gICAgdHlwZToge1xuICAgICAgICBuYW1lOiBcIkNvbXBvc2l0ZVwiLFxuICAgICAgICBjbGFzc05hbWU6IFwiU2VydmljZUdldEFjY291bnRJbmZvSGVhZGVyc1wiLFxuICAgICAgICBtb2RlbFByb3BlcnRpZXM6IHtcbiAgICAgICAgICAgIGNsaWVudFJlcXVlc3RJZDoge1xuICAgICAgICAgICAgICAgIHNlcmlhbGl6ZWROYW1lOiBcIngtbXMtY2xpZW50LXJlcXVlc3QtaWRcIixcbiAgICAgICAgICAgICAgICB4bWxOYW1lOiBcIngtbXMtY2xpZW50LXJlcXVlc3QtaWRcIixcbiAgICAgICAgICAgICAgICB0eXBlOiB7XG4gICAgICAgICAgICAgICAgICAgIG5hbWU6IFwiU3RyaW5nXCIsXG4gICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICByZXF1ZXN0SWQ6IHtcbiAgICAgICAgICAgICAgICBzZXJpYWxpemVkTmFtZTogXCJ4LW1zLXJlcXVlc3QtaWRcIixcbiAgICAgICAgICAgICAgICB4bWxOYW1lOiBcIngtbXMtcmVxdWVzdC1pZFwiLFxuICAgICAgICAgICAgICAgIHR5cGU6IHtcbiAgICAgICAgICAgICAgICAgICAgbmFtZTogXCJTdHJpbmdcIixcbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIHZlcnNpb246IHtcbiAgICAgICAgICAgICAgICBzZXJpYWxpemVkTmFtZTogXCJ4LW1zLXZlcnNpb25cIixcbiAgICAgICAgICAgICAgICB4bWxOYW1lOiBcIngtbXMtdmVyc2lvblwiLFxuICAgICAgICAgICAgICAgIHR5cGU6IHtcbiAgICAgICAgICAgICAgICAgICAgbmFtZTogXCJTdHJpbmdcIixcbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIGRhdGU6IHtcbiAgICAgICAgICAgICAgICBzZXJpYWxpemVkTmFtZTogXCJkYXRlXCIsXG4gICAgICAgICAgICAgICAgeG1sTmFtZTogXCJkYXRlXCIsXG4gICAgICAgICAgICAgICAgdHlwZToge1xuICAgICAgICAgICAgICAgICAgICBuYW1lOiBcIkRhdGVUaW1lUmZjMTEyM1wiLFxuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgc2t1TmFtZToge1xuICAgICAgICAgICAgICAgIHNlcmlhbGl6ZWROYW1lOiBcIngtbXMtc2t1LW5hbWVcIixcbiAgICAgICAgICAgICAgICB4bWxOYW1lOiBcIngtbXMtc2t1LW5hbWVcIixcbiAgICAgICAgICAgICAgICB0eXBlOiB7XG4gICAgICAgICAgICAgICAgICAgIG5hbWU6IFwiRW51bVwiLFxuICAgICAgICAgICAgICAgICAgICBhbGxvd2VkVmFsdWVzOiBbXG4gICAgICAgICAgICAgICAgICAgICAgICBcIlN0YW5kYXJkX0xSU1wiLFxuICAgICAgICAgICAgICAgICAgICAgICAgXCJTdGFuZGFyZF9HUlNcIixcbiAgICAgICAgICAgICAgICAgICAgICAgIFwiU3RhbmRhcmRfUkFHUlNcIixcbiAgICAgICAgICAgICAgICAgICAgICAgIFwiU3RhbmRhcmRfWlJTXCIsXG4gICAgICAgICAgICAgICAgICAgICAgICBcIlByZW1pdW1fTFJTXCIsXG4gICAgICAgICAgICAgICAgICAgIF0sXG4gICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBhY2NvdW50S2luZDoge1xuICAgICAgICAgICAgICAgIHNlcmlhbGl6ZWROYW1lOiBcIngtbXMtYWNjb3VudC1raW5kXCIsXG4gICAgICAgICAgICAgICAgeG1sTmFtZTogXCJ4LW1zLWFjY291bnQta2luZFwiLFxuICAgICAgICAgICAgICAgIHR5cGU6IHtcbiAgICAgICAgICAgICAgICAgICAgbmFtZTogXCJFbnVtXCIsXG4gICAgICAgICAgICAgICAgICAgIGFsbG93ZWRWYWx1ZXM6IFtcbiAgICAgICAgICAgICAgICAgICAgICAgIFwiU3RvcmFnZVwiLFxuICAgICAgICAgICAgICAgICAgICAgICAgXCJCbG9iU3RvcmFnZVwiLFxuICAgICAgICAgICAgICAgICAgICAgICAgXCJTdG9yYWdlVjJcIixcbiAgICAgICAgICAgICAgICAgICAgICAgIFwiRmlsZVN0b3JhZ2VcIixcbiAgICAgICAgICAgICAgICAgICAgICAgIFwiQmxvY2tCbG9iU3RvcmFnZVwiLFxuICAgICAgICAgICAgICAgICAgICBdLFxuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgaXNIaWVyYXJjaGljYWxOYW1lc3BhY2VFbmFibGVkOiB7XG4gICAgICAgICAgICAgICAgc2VyaWFsaXplZE5hbWU6IFwieC1tcy1pcy1obnMtZW5hYmxlZFwiLFxuICAgICAgICAgICAgICAgIHhtbE5hbWU6IFwieC1tcy1pcy1obnMtZW5hYmxlZFwiLFxuICAgICAgICAgICAgICAgIHR5cGU6IHtcbiAgICAgICAgICAgICAgICAgICAgbmFtZTogXCJCb29sZWFuXCIsXG4gICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBlcnJvckNvZGU6IHtcbiAgICAgICAgICAgICAgICBzZXJpYWxpemVkTmFtZTogXCJ4LW1zLWVycm9yLWNvZGVcIixcbiAgICAgICAgICAgICAgICB4bWxOYW1lOiBcIngtbXMtZXJyb3ItY29kZVwiLFxuICAgICAgICAgICAgICAgIHR5cGU6IHtcbiAgICAgICAgICAgICAgICAgICAgbmFtZTogXCJTdHJpbmdcIixcbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgfSxcbiAgICAgICAgfSxcbiAgICB9LFxufTtcbmNvbnN0IFNlcnZpY2VHZXRBY2NvdW50SW5mb0V4Y2VwdGlvbkhlYWRlcnMgPSB7XG4gICAgc2VyaWFsaXplZE5hbWU6IFwiU2VydmljZV9nZXRBY2NvdW50SW5mb0V4Y2VwdGlvbkhlYWRlcnNcIixcbiAgICB0eXBlOiB7XG4gICAgICAgIG5hbWU6IFwiQ29tcG9zaXRlXCIsXG4gICAgICAgIGNsYXNzTmFtZTogXCJTZXJ2aWNlR2V0QWNjb3VudEluZm9FeGNlcHRpb25IZWFkZXJzXCIsXG4gICAgICAgIG1vZGVsUHJvcGVydGllczoge1xuICAgICAgICAgICAgZXJyb3JDb2RlOiB7XG4gICAgICAgICAgICAgICAgc2VyaWFsaXplZE5hbWU6IFwieC1tcy1lcnJvci1jb2RlXCIsXG4gICAgICAgICAgICAgICAgeG1sTmFtZTogXCJ4LW1zLWVycm9yLWNvZGVcIixcbiAgICAgICAgICAgICAgICB0eXBlOiB7XG4gICAgICAgICAgICAgICAgICAgIG5hbWU6IFwiU3RyaW5nXCIsXG4gICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIH0sXG4gICAgICAgIH0sXG4gICAgfSxcbn07XG5jb25zdCBTZXJ2aWNlU3VibWl0QmF0Y2hIZWFkZXJzID0ge1xuICAgIHNlcmlhbGl6ZWROYW1lOiBcIlNlcnZpY2Vfc3VibWl0QmF0Y2hIZWFkZXJzXCIsXG4gICAgdHlwZToge1xuICAgICAgICBuYW1lOiBcIkNvbXBvc2l0ZVwiLFxuICAgICAgICBjbGFzc05hbWU6IFwiU2VydmljZVN1Ym1pdEJhdGNoSGVhZGVyc1wiLFxuICAgICAgICBtb2RlbFByb3BlcnRpZXM6IHtcbiAgICAgICAgICAgIGNvbnRlbnRUeXBlOiB7XG4gICAgICAgICAgICAgICAgc2VyaWFsaXplZE5hbWU6IFwiY29udGVudC10eXBlXCIsXG4gICAgICAgICAgICAgICAgeG1sTmFtZTogXCJjb250ZW50LXR5cGVcIixcbiAgICAgICAgICAgICAgICB0eXBlOiB7XG4gICAgICAgICAgICAgICAgICAgIG5hbWU6IFwiU3RyaW5nXCIsXG4gICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICByZXF1ZXN0SWQ6IHtcbiAgICAgICAgICAgICAgICBzZXJpYWxpemVkTmFtZTogXCJ4LW1zLXJlcXVlc3QtaWRcIixcbiAgICAgICAgICAgICAgICB4bWxOYW1lOiBcIngtbXMtcmVxdWVzdC1pZFwiLFxuICAgICAgICAgICAgICAgIHR5cGU6IHtcbiAgICAgICAgICAgICAgICAgICAgbmFtZTogXCJTdHJpbmdcIixcbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIHZlcnNpb246IHtcbiAgICAgICAgICAgICAgICBzZXJpYWxpemVkTmFtZTogXCJ4LW1zLXZlcnNpb25cIixcbiAgICAgICAgICAgICAgICB4bWxOYW1lOiBcIngtbXMtdmVyc2lvblwiLFxuICAgICAgICAgICAgICAgIHR5cGU6IHtcbiAgICAgICAgICAgICAgICAgICAgbmFtZTogXCJTdHJpbmdcIixcbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIGNsaWVudFJlcXVlc3RJZDoge1xuICAgICAgICAgICAgICAgIHNlcmlhbGl6ZWROYW1lOiBcIngtbXMtY2xpZW50LXJlcXVlc3QtaWRcIixcbiAgICAgICAgICAgICAgICB4bWxOYW1lOiBcIngtbXMtY2xpZW50LXJlcXVlc3QtaWRcIixcbiAgICAgICAgICAgICAgICB0eXBlOiB7XG4gICAgICAgICAgICAgICAgICAgIG5hbWU6IFwiU3RyaW5nXCIsXG4gICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBlcnJvckNvZGU6IHtcbiAgICAgICAgICAgICAgICBzZXJpYWxpemVkTmFtZTogXCJ4LW1zLWVycm9yLWNvZGVcIixcbiAgICAgICAgICAgICAgICB4bWxOYW1lOiBcIngtbXMtZXJyb3ItY29kZVwiLFxuICAgICAgICAgICAgICAgIHR5cGU6IHtcbiAgICAgICAgICAgICAgICAgICAgbmFtZTogXCJTdHJpbmdcIixcbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgfSxcbiAgICAgICAgfSxcbiAgICB9LFxufTtcbmNvbnN0IFNlcnZpY2VTdWJtaXRCYXRjaEV4Y2VwdGlvbkhlYWRlcnMgPSB7XG4gICAgc2VyaWFsaXplZE5hbWU6IFwiU2VydmljZV9zdWJtaXRCYXRjaEV4Y2VwdGlvbkhlYWRlcnNcIixcbiAgICB0eXBlOiB7XG4gICAgICAgIG5hbWU6IFwiQ29tcG9zaXRlXCIsXG4gICAgICAgIGNsYXNzTmFtZTogXCJTZXJ2aWNlU3VibWl0QmF0Y2hFeGNlcHRpb25IZWFkZXJzXCIsXG4gICAgICAgIG1vZGVsUHJvcGVydGllczoge1xuICAgICAgICAgICAgZXJyb3JDb2RlOiB7XG4gICAgICAgICAgICAgICAgc2VyaWFsaXplZE5hbWU6IFwieC1tcy1lcnJvci1jb2RlXCIsXG4gICAgICAgICAgICAgICAgeG1sTmFtZTogXCJ4LW1zLWVycm9yLWNvZGVcIixcbiAgICAgICAgICAgICAgICB0eXBlOiB7XG4gICAgICAgICAgICAgICAgICAgIG5hbWU6IFwiU3RyaW5nXCIsXG4gICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIH0sXG4gICAgICAgIH0sXG4gICAgfSxcbn07XG5jb25zdCBTZXJ2aWNlRmlsdGVyQmxvYnNIZWFkZXJzID0ge1xuICAgIHNlcmlhbGl6ZWROYW1lOiBcIlNlcnZpY2VfZmlsdGVyQmxvYnNIZWFkZXJzXCIsXG4gICAgdHlwZToge1xuICAgICAgICBuYW1lOiBcIkNvbXBvc2l0ZVwiLFxuICAgICAgICBjbGFzc05hbWU6IFwiU2VydmljZUZpbHRlckJsb2JzSGVhZGVyc1wiLFxuICAgICAgICBtb2RlbFByb3BlcnRpZXM6IHtcbiAgICAgICAgICAgIGNsaWVudFJlcXVlc3RJZDoge1xuICAgICAgICAgICAgICAgIHNlcmlhbGl6ZWROYW1lOiBcIngtbXMtY2xpZW50LXJlcXVlc3QtaWRcIixcbiAgICAgICAgICAgICAgICB4bWxOYW1lOiBcIngtbXMtY2xpZW50LXJlcXVlc3QtaWRcIixcbiAgICAgICAgICAgICAgICB0eXBlOiB7XG4gICAgICAgICAgICAgICAgICAgIG5hbWU6IFwiU3RyaW5nXCIsXG4gICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICByZXF1ZXN0SWQ6IHtcbiAgICAgICAgICAgICAgICBzZXJpYWxpemVkTmFtZTogXCJ4LW1zLXJlcXVlc3QtaWRcIixcbiAgICAgICAgICAgICAgICB4bWxOYW1lOiBcIngtbXMtcmVxdWVzdC1pZFwiLFxuICAgICAgICAgICAgICAgIHR5cGU6IHtcbiAgICAgICAgICAgICAgICAgICAgbmFtZTogXCJTdHJpbmdcIixcbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIHZlcnNpb246IHtcbiAgICAgICAgICAgICAgICBzZXJpYWxpemVkTmFtZTogXCJ4LW1zLXZlcnNpb25cIixcbiAgICAgICAgICAgICAgICB4bWxOYW1lOiBcIngtbXMtdmVyc2lvblwiLFxuICAgICAgICAgICAgICAgIHR5cGU6IHtcbiAgICAgICAgICAgICAgICAgICAgbmFtZTogXCJTdHJpbmdcIixcbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIGRhdGU6IHtcbiAgICAgICAgICAgICAgICBzZXJpYWxpemVkTmFtZTogXCJkYXRlXCIsXG4gICAgICAgICAgICAgICAgeG1sTmFtZTogXCJkYXRlXCIsXG4gICAgICAgICAgICAgICAgdHlwZToge1xuICAgICAgICAgICAgICAgICAgICBuYW1lOiBcIkRhdGVUaW1lUmZjMTEyM1wiLFxuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgZXJyb3JDb2RlOiB7XG4gICAgICAgICAgICAgICAgc2VyaWFsaXplZE5hbWU6IFwieC1tcy1lcnJvci1jb2RlXCIsXG4gICAgICAgICAgICAgICAgeG1sTmFtZTogXCJ4LW1zLWVycm9yLWNvZGVcIixcbiAgICAgICAgICAgICAgICB0eXBlOiB7XG4gICAgICAgICAgICAgICAgICAgIG5hbWU6IFwiU3RyaW5nXCIsXG4gICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIH0sXG4gICAgICAgIH0sXG4gICAgfSxcbn07XG5jb25zdCBTZXJ2aWNlRmlsdGVyQmxvYnNFeGNlcHRpb25IZWFkZXJzID0ge1xuICAgIHNlcmlhbGl6ZWROYW1lOiBcIlNlcnZpY2VfZmlsdGVyQmxvYnNFeGNlcHRpb25IZWFkZXJzXCIsXG4gICAgdHlwZToge1xuICAgICAgICBuYW1lOiBcIkNvbXBvc2l0ZVwiLFxuICAgICAgICBjbGFzc05hbWU6IFwiU2VydmljZUZpbHRlckJsb2JzRXhjZXB0aW9uSGVhZGVyc1wiLFxuICAgICAgICBtb2RlbFByb3BlcnRpZXM6IHtcbiAgICAgICAgICAgIGVycm9yQ29kZToge1xuICAgICAgICAgICAgICAgIHNlcmlhbGl6ZWROYW1lOiBcIngtbXMtZXJyb3ItY29kZVwiLFxuICAgICAgICAgICAgICAgIHhtbE5hbWU6IFwieC1tcy1lcnJvci1jb2RlXCIsXG4gICAgICAgICAgICAgICAgdHlwZToge1xuICAgICAgICAgICAgICAgICAgICBuYW1lOiBcIlN0cmluZ1wiLFxuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICB9LFxuICAgICAgICB9LFxuICAgIH0sXG59O1xuY29uc3QgQ29udGFpbmVyQ3JlYXRlSGVhZGVycyA9IHtcbiAgICBzZXJpYWxpemVkTmFtZTogXCJDb250YWluZXJfY3JlYXRlSGVhZGVyc1wiLFxuICAgIHR5cGU6IHtcbiAgICAgICAgbmFtZTogXCJDb21wb3NpdGVcIixcbiAgICAgICAgY2xhc3NOYW1lOiBcIkNvbnRhaW5lckNyZWF0ZUhlYWRlcnNcIixcbiAgICAgICAgbW9kZWxQcm9wZXJ0aWVzOiB7XG4gICAgICAgICAgICBldGFnOiB7XG4gICAgICAgICAgICAgICAgc2VyaWFsaXplZE5hbWU6IFwiZXRhZ1wiLFxuICAgICAgICAgICAgICAgIHhtbE5hbWU6IFwiZXRhZ1wiLFxuICAgICAgICAgICAgICAgIHR5cGU6IHtcbiAgICAgICAgICAgICAgICAgICAgbmFtZTogXCJTdHJpbmdcIixcbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIGxhc3RNb2RpZmllZDoge1xuICAgICAgICAgICAgICAgIHNlcmlhbGl6ZWROYW1lOiBcImxhc3QtbW9kaWZpZWRcIixcbiAgICAgICAgICAgICAgICB4bWxOYW1lOiBcImxhc3QtbW9kaWZpZWRcIixcbiAgICAgICAgICAgICAgICB0eXBlOiB7XG4gICAgICAgICAgICAgICAgICAgIG5hbWU6IFwiRGF0ZVRpbWVSZmMxMTIzXCIsXG4gICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBjbGllbnRSZXF1ZXN0SWQ6IHtcbiAgICAgICAgICAgICAgICBzZXJpYWxpemVkTmFtZTogXCJ4LW1zLWNsaWVudC1yZXF1ZXN0LWlkXCIsXG4gICAgICAgICAgICAgICAgeG1sTmFtZTogXCJ4LW1zLWNsaWVudC1yZXF1ZXN0LWlkXCIsXG4gICAgICAgICAgICAgICAgdHlwZToge1xuICAgICAgICAgICAgICAgICAgICBuYW1lOiBcIlN0cmluZ1wiLFxuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgcmVxdWVzdElkOiB7XG4gICAgICAgICAgICAgICAgc2VyaWFsaXplZE5hbWU6IFwieC1tcy1yZXF1ZXN0LWlkXCIsXG4gICAgICAgICAgICAgICAgeG1sTmFtZTogXCJ4LW1zLXJlcXVlc3QtaWRcIixcbiAgICAgICAgICAgICAgICB0eXBlOiB7XG4gICAgICAgICAgICAgICAgICAgIG5hbWU6IFwiU3RyaW5nXCIsXG4gICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICB2ZXJzaW9uOiB7XG4gICAgICAgICAgICAgICAgc2VyaWFsaXplZE5hbWU6IFwieC1tcy12ZXJzaW9uXCIsXG4gICAgICAgICAgICAgICAgeG1sTmFtZTogXCJ4LW1zLXZlcnNpb25cIixcbiAgICAgICAgICAgICAgICB0eXBlOiB7XG4gICAgICAgICAgICAgICAgICAgIG5hbWU6IFwiU3RyaW5nXCIsXG4gICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBkYXRlOiB7XG4gICAgICAgICAgICAgICAgc2VyaWFsaXplZE5hbWU6IFwiZGF0ZVwiLFxuICAgICAgICAgICAgICAgIHhtbE5hbWU6IFwiZGF0ZVwiLFxuICAgICAgICAgICAgICAgIHR5cGU6IHtcbiAgICAgICAgICAgICAgICAgICAgbmFtZTogXCJEYXRlVGltZVJmYzExMjNcIixcbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIGVycm9yQ29kZToge1xuICAgICAgICAgICAgICAgIHNlcmlhbGl6ZWROYW1lOiBcIngtbXMtZXJyb3ItY29kZVwiLFxuICAgICAgICAgICAgICAgIHhtbE5hbWU6IFwieC1tcy1lcnJvci1jb2RlXCIsXG4gICAgICAgICAgICAgICAgdHlwZToge1xuICAgICAgICAgICAgICAgICAgICBuYW1lOiBcIlN0cmluZ1wiLFxuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICB9LFxuICAgICAgICB9LFxuICAgIH0sXG59O1xuY29uc3QgQ29udGFpbmVyQ3JlYXRlRXhjZXB0aW9uSGVhZGVycyA9IHtcbiAgICBzZXJpYWxpemVkTmFtZTogXCJDb250YWluZXJfY3JlYXRlRXhjZXB0aW9uSGVhZGVyc1wiLFxuICAgIHR5cGU6IHtcbiAgICAgICAgbmFtZTogXCJDb21wb3NpdGVcIixcbiAgICAgICAgY2xhc3NOYW1lOiBcIkNvbnRhaW5lckNyZWF0ZUV4Y2VwdGlvbkhlYWRlcnNcIixcbiAgICAgICAgbW9kZWxQcm9wZXJ0aWVzOiB7XG4gICAgICAgICAgICBlcnJvckNvZGU6IHtcbiAgICAgICAgICAgICAgICBzZXJpYWxpemVkTmFtZTogXCJ4LW1zLWVycm9yLWNvZGVcIixcbiAgICAgICAgICAgICAgICB4bWxOYW1lOiBcIngtbXMtZXJyb3ItY29kZVwiLFxuICAgICAgICAgICAgICAgIHR5cGU6IHtcbiAgICAgICAgICAgICAgICAgICAgbmFtZTogXCJTdHJpbmdcIixcbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgfSxcbiAgICAgICAgfSxcbiAgICB9LFxufTtcbmNvbnN0IENvbnRhaW5lckdldFByb3BlcnRpZXNIZWFkZXJzID0ge1xuICAgIHNlcmlhbGl6ZWROYW1lOiBcIkNvbnRhaW5lcl9nZXRQcm9wZXJ0aWVzSGVhZGVyc1wiLFxuICAgIHR5cGU6IHtcbiAgICAgICAgbmFtZTogXCJDb21wb3NpdGVcIixcbiAgICAgICAgY2xhc3NOYW1lOiBcIkNvbnRhaW5lckdldFByb3BlcnRpZXNIZWFkZXJzXCIsXG4gICAgICAgIG1vZGVsUHJvcGVydGllczoge1xuICAgICAgICAgICAgbWV0YWRhdGE6IHtcbiAgICAgICAgICAgICAgICBzZXJpYWxpemVkTmFtZTogXCJ4LW1zLW1ldGFcIixcbiAgICAgICAgICAgICAgICBoZWFkZXJDb2xsZWN0aW9uUHJlZml4OiBcIngtbXMtbWV0YS1cIixcbiAgICAgICAgICAgICAgICB4bWxOYW1lOiBcIngtbXMtbWV0YVwiLFxuICAgICAgICAgICAgICAgIHR5cGU6IHtcbiAgICAgICAgICAgICAgICAgICAgbmFtZTogXCJEaWN0aW9uYXJ5XCIsXG4gICAgICAgICAgICAgICAgICAgIHZhbHVlOiB7IHR5cGU6IHsgbmFtZTogXCJTdHJpbmdcIiB9IH0sXG4gICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBldGFnOiB7XG4gICAgICAgICAgICAgICAgc2VyaWFsaXplZE5hbWU6IFwiZXRhZ1wiLFxuICAgICAgICAgICAgICAgIHhtbE5hbWU6IFwiZXRhZ1wiLFxuICAgICAgICAgICAgICAgIHR5cGU6IHtcbiAgICAgICAgICAgICAgICAgICAgbmFtZTogXCJTdHJpbmdcIixcbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIGxhc3RNb2RpZmllZDoge1xuICAgICAgICAgICAgICAgIHNlcmlhbGl6ZWROYW1lOiBcImxhc3QtbW9kaWZpZWRcIixcbiAgICAgICAgICAgICAgICB4bWxOYW1lOiBcImxhc3QtbW9kaWZpZWRcIixcbiAgICAgICAgICAgICAgICB0eXBlOiB7XG4gICAgICAgICAgICAgICAgICAgIG5hbWU6IFwiRGF0ZVRpbWVSZmMxMTIzXCIsXG4gICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBsZWFzZUR1cmF0aW9uOiB7XG4gICAgICAgICAgICAgICAgc2VyaWFsaXplZE5hbWU6IFwieC1tcy1sZWFzZS1kdXJhdGlvblwiLFxuICAgICAgICAgICAgICAgIHhtbE5hbWU6IFwieC1tcy1sZWFzZS1kdXJhdGlvblwiLFxuICAgICAgICAgICAgICAgIHR5cGU6IHtcbiAgICAgICAgICAgICAgICAgICAgbmFtZTogXCJFbnVtXCIsXG4gICAgICAgICAgICAgICAgICAgIGFsbG93ZWRWYWx1ZXM6IFtcImluZmluaXRlXCIsIFwiZml4ZWRcIl0sXG4gICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBsZWFzZVN0YXRlOiB7XG4gICAgICAgICAgICAgICAgc2VyaWFsaXplZE5hbWU6IFwieC1tcy1sZWFzZS1zdGF0ZVwiLFxuICAgICAgICAgICAgICAgIHhtbE5hbWU6IFwieC1tcy1sZWFzZS1zdGF0ZVwiLFxuICAgICAgICAgICAgICAgIHR5cGU6IHtcbiAgICAgICAgICAgICAgICAgICAgbmFtZTogXCJFbnVtXCIsXG4gICAgICAgICAgICAgICAgICAgIGFsbG93ZWRWYWx1ZXM6IFtcbiAgICAgICAgICAgICAgICAgICAgICAgIFwiYXZhaWxhYmxlXCIsXG4gICAgICAgICAgICAgICAgICAgICAgICBcImxlYXNlZFwiLFxuICAgICAgICAgICAgICAgICAgICAgICAgXCJleHBpcmVkXCIsXG4gICAgICAgICAgICAgICAgICAgICAgICBcImJyZWFraW5nXCIsXG4gICAgICAgICAgICAgICAgICAgICAgICBcImJyb2tlblwiLFxuICAgICAgICAgICAgICAgICAgICBdLFxuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgbGVhc2VTdGF0dXM6IHtcbiAgICAgICAgICAgICAgICBzZXJpYWxpemVkTmFtZTogXCJ4LW1zLWxlYXNlLXN0YXR1c1wiLFxuICAgICAgICAgICAgICAgIHhtbE5hbWU6IFwieC1tcy1sZWFzZS1zdGF0dXNcIixcbiAgICAgICAgICAgICAgICB0eXBlOiB7XG4gICAgICAgICAgICAgICAgICAgIG5hbWU6IFwiRW51bVwiLFxuICAgICAgICAgICAgICAgICAgICBhbGxvd2VkVmFsdWVzOiBbXCJsb2NrZWRcIiwgXCJ1bmxvY2tlZFwiXSxcbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIGNsaWVudFJlcXVlc3RJZDoge1xuICAgICAgICAgICAgICAgIHNlcmlhbGl6ZWROYW1lOiBcIngtbXMtY2xpZW50LXJlcXVlc3QtaWRcIixcbiAgICAgICAgICAgICAgICB4bWxOYW1lOiBcIngtbXMtY2xpZW50LXJlcXVlc3QtaWRcIixcbiAgICAgICAgICAgICAgICB0eXBlOiB7XG4gICAgICAgICAgICAgICAgICAgIG5hbWU6IFwiU3RyaW5nXCIsXG4gICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICByZXF1ZXN0SWQ6IHtcbiAgICAgICAgICAgICAgICBzZXJpYWxpemVkTmFtZTogXCJ4LW1zLXJlcXVlc3QtaWRcIixcbiAgICAgICAgICAgICAgICB4bWxOYW1lOiBcIngtbXMtcmVxdWVzdC1pZFwiLFxuICAgICAgICAgICAgICAgIHR5cGU6IHtcbiAgICAgICAgICAgICAgICAgICAgbmFtZTogXCJTdHJpbmdcIixcbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIHZlcnNpb246IHtcbiAgICAgICAgICAgICAgICBzZXJpYWxpemVkTmFtZTogXCJ4LW1zLXZlcnNpb25cIixcbiAgICAgICAgICAgICAgICB4bWxOYW1lOiBcIngtbXMtdmVyc2lvblwiLFxuICAgICAgICAgICAgICAgIHR5cGU6IHtcbiAgICAgICAgICAgICAgICAgICAgbmFtZTogXCJTdHJpbmdcIixcbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIGRhdGU6IHtcbiAgICAgICAgICAgICAgICBzZXJpYWxpemVkTmFtZTogXCJkYXRlXCIsXG4gICAgICAgICAgICAgICAgeG1sTmFtZTogXCJkYXRlXCIsXG4gICAgICAgICAgICAgICAgdHlwZToge1xuICAgICAgICAgICAgICAgICAgICBuYW1lOiBcIkRhdGVUaW1lUmZjMTEyM1wiLFxuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgYmxvYlB1YmxpY0FjY2Vzczoge1xuICAgICAgICAgICAgICAgIHNlcmlhbGl6ZWROYW1lOiBcIngtbXMtYmxvYi1wdWJsaWMtYWNjZXNzXCIsXG4gICAgICAgICAgICAgICAgeG1sTmFtZTogXCJ4LW1zLWJsb2ItcHVibGljLWFjY2Vzc1wiLFxuICAgICAgICAgICAgICAgIHR5cGU6IHtcbiAgICAgICAgICAgICAgICAgICAgbmFtZTogXCJFbnVtXCIsXG4gICAgICAgICAgICAgICAgICAgIGFsbG93ZWRWYWx1ZXM6IFtcImNvbnRhaW5lclwiLCBcImJsb2JcIl0sXG4gICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBoYXNJbW11dGFiaWxpdHlQb2xpY3k6IHtcbiAgICAgICAgICAgICAgICBzZXJpYWxpemVkTmFtZTogXCJ4LW1zLWhhcy1pbW11dGFiaWxpdHktcG9saWN5XCIsXG4gICAgICAgICAgICAgICAgeG1sTmFtZTogXCJ4LW1zLWhhcy1pbW11dGFiaWxpdHktcG9saWN5XCIsXG4gICAgICAgICAgICAgICAgdHlwZToge1xuICAgICAgICAgICAgICAgICAgICBuYW1lOiBcIkJvb2xlYW5cIixcbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIGhhc0xlZ2FsSG9sZDoge1xuICAgICAgICAgICAgICAgIHNlcmlhbGl6ZWROYW1lOiBcIngtbXMtaGFzLWxlZ2FsLWhvbGRcIixcbiAgICAgICAgICAgICAgICB4bWxOYW1lOiBcIngtbXMtaGFzLWxlZ2FsLWhvbGRcIixcbiAgICAgICAgICAgICAgICB0eXBlOiB7XG4gICAgICAgICAgICAgICAgICAgIG5hbWU6IFwiQm9vbGVhblwiLFxuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgZGVmYXVsdEVuY3J5cHRpb25TY29wZToge1xuICAgICAgICAgICAgICAgIHNlcmlhbGl6ZWROYW1lOiBcIngtbXMtZGVmYXVsdC1lbmNyeXB0aW9uLXNjb3BlXCIsXG4gICAgICAgICAgICAgICAgeG1sTmFtZTogXCJ4LW1zLWRlZmF1bHQtZW5jcnlwdGlvbi1zY29wZVwiLFxuICAgICAgICAgICAgICAgIHR5cGU6IHtcbiAgICAgICAgICAgICAgICAgICAgbmFtZTogXCJTdHJpbmdcIixcbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIGRlbnlFbmNyeXB0aW9uU2NvcGVPdmVycmlkZToge1xuICAgICAgICAgICAgICAgIHNlcmlhbGl6ZWROYW1lOiBcIngtbXMtZGVueS1lbmNyeXB0aW9uLXNjb3BlLW92ZXJyaWRlXCIsXG4gICAgICAgICAgICAgICAgeG1sTmFtZTogXCJ4LW1zLWRlbnktZW5jcnlwdGlvbi1zY29wZS1vdmVycmlkZVwiLFxuICAgICAgICAgICAgICAgIHR5cGU6IHtcbiAgICAgICAgICAgICAgICAgICAgbmFtZTogXCJCb29sZWFuXCIsXG4gICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBpc0ltbXV0YWJsZVN0b3JhZ2VXaXRoVmVyc2lvbmluZ0VuYWJsZWQ6IHtcbiAgICAgICAgICAgICAgICBzZXJpYWxpemVkTmFtZTogXCJ4LW1zLWltbXV0YWJsZS1zdG9yYWdlLXdpdGgtdmVyc2lvbmluZy1lbmFibGVkXCIsXG4gICAgICAgICAgICAgICAgeG1sTmFtZTogXCJ4LW1zLWltbXV0YWJsZS1zdG9yYWdlLXdpdGgtdmVyc2lvbmluZy1lbmFibGVkXCIsXG4gICAgICAgICAgICAgICAgdHlwZToge1xuICAgICAgICAgICAgICAgICAgICBuYW1lOiBcIkJvb2xlYW5cIixcbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIGVycm9yQ29kZToge1xuICAgICAgICAgICAgICAgIHNlcmlhbGl6ZWROYW1lOiBcIngtbXMtZXJyb3ItY29kZVwiLFxuICAgICAgICAgICAgICAgIHhtbE5hbWU6IFwieC1tcy1lcnJvci1jb2RlXCIsXG4gICAgICAgICAgICAgICAgdHlwZToge1xuICAgICAgICAgICAgICAgICAgICBuYW1lOiBcIlN0cmluZ1wiLFxuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICB9LFxuICAgICAgICB9LFxuICAgIH0sXG59O1xuY29uc3QgQ29udGFpbmVyR2V0UHJvcGVydGllc0V4Y2VwdGlvbkhlYWRlcnMgPSB7XG4gICAgc2VyaWFsaXplZE5hbWU6IFwiQ29udGFpbmVyX2dldFByb3BlcnRpZXNFeGNlcHRpb25IZWFkZXJzXCIsXG4gICAgdHlwZToge1xuICAgICAgICBuYW1lOiBcIkNvbXBvc2l0ZVwiLFxuICAgICAgICBjbGFzc05hbWU6IFwiQ29udGFpbmVyR2V0UHJvcGVydGllc0V4Y2VwdGlvbkhlYWRlcnNcIixcbiAgICAgICAgbW9kZWxQcm9wZXJ0aWVzOiB7XG4gICAgICAgICAgICBlcnJvckNvZGU6IHtcbiAgICAgICAgICAgICAgICBzZXJpYWxpemVkTmFtZTogXCJ4LW1zLWVycm9yLWNvZGVcIixcbiAgICAgICAgICAgICAgICB4bWxOYW1lOiBcIngtbXMtZXJyb3ItY29kZVwiLFxuICAgICAgICAgICAgICAgIHR5cGU6IHtcbiAgICAgICAgICAgICAgICAgICAgbmFtZTogXCJTdHJpbmdcIixcbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgfSxcbiAgICAgICAgfSxcbiAgICB9LFxufTtcbmNvbnN0IENvbnRhaW5lckRlbGV0ZUhlYWRlcnMgPSB7XG4gICAgc2VyaWFsaXplZE5hbWU6IFwiQ29udGFpbmVyX2RlbGV0ZUhlYWRlcnNcIixcbiAgICB0eXBlOiB7XG4gICAgICAgIG5hbWU6IFwiQ29tcG9zaXRlXCIsXG4gICAgICAgIGNsYXNzTmFtZTogXCJDb250YWluZXJEZWxldGVIZWFkZXJzXCIsXG4gICAgICAgIG1vZGVsUHJvcGVydGllczoge1xuICAgICAgICAgICAgY2xpZW50UmVxdWVzdElkOiB7XG4gICAgICAgICAgICAgICAgc2VyaWFsaXplZE5hbWU6IFwieC1tcy1jbGllbnQtcmVxdWVzdC1pZFwiLFxuICAgICAgICAgICAgICAgIHhtbE5hbWU6IFwieC1tcy1jbGllbnQtcmVxdWVzdC1pZFwiLFxuICAgICAgICAgICAgICAgIHR5cGU6IHtcbiAgICAgICAgICAgICAgICAgICAgbmFtZTogXCJTdHJpbmdcIixcbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIHJlcXVlc3RJZDoge1xuICAgICAgICAgICAgICAgIHNlcmlhbGl6ZWROYW1lOiBcIngtbXMtcmVxdWVzdC1pZFwiLFxuICAgICAgICAgICAgICAgIHhtbE5hbWU6IFwieC1tcy1yZXF1ZXN0LWlkXCIsXG4gICAgICAgICAgICAgICAgdHlwZToge1xuICAgICAgICAgICAgICAgICAgICBuYW1lOiBcIlN0cmluZ1wiLFxuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgdmVyc2lvbjoge1xuICAgICAgICAgICAgICAgIHNlcmlhbGl6ZWROYW1lOiBcIngtbXMtdmVyc2lvblwiLFxuICAgICAgICAgICAgICAgIHhtbE5hbWU6IFwieC1tcy12ZXJzaW9uXCIsXG4gICAgICAgICAgICAgICAgdHlwZToge1xuICAgICAgICAgICAgICAgICAgICBuYW1lOiBcIlN0cmluZ1wiLFxuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgZGF0ZToge1xuICAgICAgICAgICAgICAgIHNlcmlhbGl6ZWROYW1lOiBcImRhdGVcIixcbiAgICAgICAgICAgICAgICB4bWxOYW1lOiBcImRhdGVcIixcbiAgICAgICAgICAgICAgICB0eXBlOiB7XG4gICAgICAgICAgICAgICAgICAgIG5hbWU6IFwiRGF0ZVRpbWVSZmMxMTIzXCIsXG4gICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBlcnJvckNvZGU6IHtcbiAgICAgICAgICAgICAgICBzZXJpYWxpemVkTmFtZTogXCJ4LW1zLWVycm9yLWNvZGVcIixcbiAgICAgICAgICAgICAgICB4bWxOYW1lOiBcIngtbXMtZXJyb3ItY29kZVwiLFxuICAgICAgICAgICAgICAgIHR5cGU6IHtcbiAgICAgICAgICAgICAgICAgICAgbmFtZTogXCJTdHJpbmdcIixcbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgfSxcbiAgICAgICAgfSxcbiAgICB9LFxufTtcbmNvbnN0IENvbnRhaW5lckRlbGV0ZUV4Y2VwdGlvbkhlYWRlcnMgPSB7XG4gICAgc2VyaWFsaXplZE5hbWU6IFwiQ29udGFpbmVyX2RlbGV0ZUV4Y2VwdGlvbkhlYWRlcnNcIixcbiAgICB0eXBlOiB7XG4gICAgICAgIG5hbWU6IFwiQ29tcG9zaXRlXCIsXG4gICAgICAgIGNsYXNzTmFtZTogXCJDb250YWluZXJEZWxldGVFeGNlcHRpb25IZWFkZXJzXCIsXG4gICAgICAgIG1vZGVsUHJvcGVydGllczoge1xuICAgICAgICAgICAgZXJyb3JDb2RlOiB7XG4gICAgICAgICAgICAgICAgc2VyaWFsaXplZE5hbWU6IFwieC1tcy1lcnJvci1jb2RlXCIsXG4gICAgICAgICAgICAgICAgeG1sTmFtZTogXCJ4LW1zLWVycm9yLWNvZGVcIixcbiAgICAgICAgICAgICAgICB0eXBlOiB7XG4gICAgICAgICAgICAgICAgICAgIG5hbWU6IFwiU3RyaW5nXCIsXG4gICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIH0sXG4gICAgICAgIH0sXG4gICAgfSxcbn07XG5jb25zdCBDb250YWluZXJTZXRNZXRhZGF0YUhlYWRlcnMgPSB7XG4gICAgc2VyaWFsaXplZE5hbWU6IFwiQ29udGFpbmVyX3NldE1ldGFkYXRhSGVhZGVyc1wiLFxuICAgIHR5cGU6IHtcbiAgICAgICAgbmFtZTogXCJDb21wb3NpdGVcIixcbiAgICAgICAgY2xhc3NOYW1lOiBcIkNvbnRhaW5lclNldE1ldGFkYXRhSGVhZGVyc1wiLFxuICAgICAgICBtb2RlbFByb3BlcnRpZXM6IHtcbiAgICAgICAgICAgIGV0YWc6IHtcbiAgICAgICAgICAgICAgICBzZXJpYWxpemVkTmFtZTogXCJldGFnXCIsXG4gICAgICAgICAgICAgICAgeG1sTmFtZTogXCJldGFnXCIsXG4gICAgICAgICAgICAgICAgdHlwZToge1xuICAgICAgICAgICAgICAgICAgICBuYW1lOiBcIlN0cmluZ1wiLFxuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgbGFzdE1vZGlmaWVkOiB7XG4gICAgICAgICAgICAgICAgc2VyaWFsaXplZE5hbWU6IFwibGFzdC1tb2RpZmllZFwiLFxuICAgICAgICAgICAgICAgIHhtbE5hbWU6IFwibGFzdC1tb2RpZmllZFwiLFxuICAgICAgICAgICAgICAgIHR5cGU6IHtcbiAgICAgICAgICAgICAgICAgICAgbmFtZTogXCJEYXRlVGltZVJmYzExMjNcIixcbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIGNsaWVudFJlcXVlc3RJZDoge1xuICAgICAgICAgICAgICAgIHNlcmlhbGl6ZWROYW1lOiBcIngtbXMtY2xpZW50LXJlcXVlc3QtaWRcIixcbiAgICAgICAgICAgICAgICB4bWxOYW1lOiBcIngtbXMtY2xpZW50LXJlcXVlc3QtaWRcIixcbiAgICAgICAgICAgICAgICB0eXBlOiB7XG4gICAgICAgICAgICAgICAgICAgIG5hbWU6IFwiU3RyaW5nXCIsXG4gICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICByZXF1ZXN0SWQ6IHtcbiAgICAgICAgICAgICAgICBzZXJpYWxpemVkTmFtZTogXCJ4LW1zLXJlcXVlc3QtaWRcIixcbiAgICAgICAgICAgICAgICB4bWxOYW1lOiBcIngtbXMtcmVxdWVzdC1pZFwiLFxuICAgICAgICAgICAgICAgIHR5cGU6IHtcbiAgICAgICAgICAgICAgICAgICAgbmFtZTogXCJTdHJpbmdcIixcbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIHZlcnNpb246IHtcbiAgICAgICAgICAgICAgICBzZXJpYWxpemVkTmFtZTogXCJ4LW1zLXZlcnNpb25cIixcbiAgICAgICAgICAgICAgICB4bWxOYW1lOiBcIngtbXMtdmVyc2lvblwiLFxuICAgICAgICAgICAgICAgIHR5cGU6IHtcbiAgICAgICAgICAgICAgICAgICAgbmFtZTogXCJTdHJpbmdcIixcbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIGRhdGU6IHtcbiAgICAgICAgICAgICAgICBzZXJpYWxpemVkTmFtZTogXCJkYXRlXCIsXG4gICAgICAgICAgICAgICAgeG1sTmFtZTogXCJkYXRlXCIsXG4gICAgICAgICAgICAgICAgdHlwZToge1xuICAgICAgICAgICAgICAgICAgICBuYW1lOiBcIkRhdGVUaW1lUmZjMTEyM1wiLFxuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgZXJyb3JDb2RlOiB7XG4gICAgICAgICAgICAgICAgc2VyaWFsaXplZE5hbWU6IFwieC1tcy1lcnJvci1jb2RlXCIsXG4gICAgICAgICAgICAgICAgeG1sTmFtZTogXCJ4LW1zLWVycm9yLWNvZGVcIixcbiAgICAgICAgICAgICAgICB0eXBlOiB7XG4gICAgICAgICAgICAgICAgICAgIG5hbWU6IFwiU3RyaW5nXCIsXG4gICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIH0sXG4gICAgICAgIH0sXG4gICAgfSxcbn07XG5jb25zdCBDb250YWluZXJTZXRNZXRhZGF0YUV4Y2VwdGlvbkhlYWRlcnMgPSB7XG4gICAgc2VyaWFsaXplZE5hbWU6IFwiQ29udGFpbmVyX3NldE1ldGFkYXRhRXhjZXB0aW9uSGVhZGVyc1wiLFxuICAgIHR5cGU6IHtcbiAgICAgICAgbmFtZTogXCJDb21wb3NpdGVcIixcbiAgICAgICAgY2xhc3NOYW1lOiBcIkNvbnRhaW5lclNldE1ldGFkYXRhRXhjZXB0aW9uSGVhZGVyc1wiLFxuICAgICAgICBtb2RlbFByb3BlcnRpZXM6IHtcbiAgICAgICAgICAgIGVycm9yQ29kZToge1xuICAgICAgICAgICAgICAgIHNlcmlhbGl6ZWROYW1lOiBcIngtbXMtZXJyb3ItY29kZVwiLFxuICAgICAgICAgICAgICAgIHhtbE5hbWU6IFwieC1tcy1lcnJvci1jb2RlXCIsXG4gICAgICAgICAgICAgICAgdHlwZToge1xuICAgICAgICAgICAgICAgICAgICBuYW1lOiBcIlN0cmluZ1wiLFxuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICB9LFxuICAgICAgICB9LFxuICAgIH0sXG59O1xuY29uc3QgQ29udGFpbmVyR2V0QWNjZXNzUG9saWN5SGVhZGVycyA9IHtcbiAgICBzZXJpYWxpemVkTmFtZTogXCJDb250YWluZXJfZ2V0QWNjZXNzUG9saWN5SGVhZGVyc1wiLFxuICAgIHR5cGU6IHtcbiAgICAgICAgbmFtZTogXCJDb21wb3NpdGVcIixcbiAgICAgICAgY2xhc3NOYW1lOiBcIkNvbnRhaW5lckdldEFjY2Vzc1BvbGljeUhlYWRlcnNcIixcbiAgICAgICAgbW9kZWxQcm9wZXJ0aWVzOiB7XG4gICAgICAgICAgICBibG9iUHVibGljQWNjZXNzOiB7XG4gICAgICAgICAgICAgICAgc2VyaWFsaXplZE5hbWU6IFwieC1tcy1ibG9iLXB1YmxpYy1hY2Nlc3NcIixcbiAgICAgICAgICAgICAgICB4bWxOYW1lOiBcIngtbXMtYmxvYi1wdWJsaWMtYWNjZXNzXCIsXG4gICAgICAgICAgICAgICAgdHlwZToge1xuICAgICAgICAgICAgICAgICAgICBuYW1lOiBcIkVudW1cIixcbiAgICAgICAgICAgICAgICAgICAgYWxsb3dlZFZhbHVlczogW1wiY29udGFpbmVyXCIsIFwiYmxvYlwiXSxcbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIGV0YWc6IHtcbiAgICAgICAgICAgICAgICBzZXJpYWxpemVkTmFtZTogXCJldGFnXCIsXG4gICAgICAgICAgICAgICAgeG1sTmFtZTogXCJldGFnXCIsXG4gICAgICAgICAgICAgICAgdHlwZToge1xuICAgICAgICAgICAgICAgICAgICBuYW1lOiBcIlN0cmluZ1wiLFxuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgbGFzdE1vZGlmaWVkOiB7XG4gICAgICAgICAgICAgICAgc2VyaWFsaXplZE5hbWU6IFwibGFzdC1tb2RpZmllZFwiLFxuICAgICAgICAgICAgICAgIHhtbE5hbWU6IFwibGFzdC1tb2RpZmllZFwiLFxuICAgICAgICAgICAgICAgIHR5cGU6IHtcbiAgICAgICAgICAgICAgICAgICAgbmFtZTogXCJEYXRlVGltZVJmYzExMjNcIixcbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIGNsaWVudFJlcXVlc3RJZDoge1xuICAgICAgICAgICAgICAgIHNlcmlhbGl6ZWROYW1lOiBcIngtbXMtY2xpZW50LXJlcXVlc3QtaWRcIixcbiAgICAgICAgICAgICAgICB4bWxOYW1lOiBcIngtbXMtY2xpZW50LXJlcXVlc3QtaWRcIixcbiAgICAgICAgICAgICAgICB0eXBlOiB7XG4gICAgICAgICAgICAgICAgICAgIG5hbWU6IFwiU3RyaW5nXCIsXG4gICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICByZXF1ZXN0SWQ6IHtcbiAgICAgICAgICAgICAgICBzZXJpYWxpemVkTmFtZTogXCJ4LW1zLXJlcXVlc3QtaWRcIixcbiAgICAgICAgICAgICAgICB4bWxOYW1lOiBcIngtbXMtcmVxdWVzdC1pZFwiLFxuICAgICAgICAgICAgICAgIHR5cGU6IHtcbiAgICAgICAgICAgICAgICAgICAgbmFtZTogXCJTdHJpbmdcIixcbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIHZlcnNpb246IHtcbiAgICAgICAgICAgICAgICBzZXJpYWxpemVkTmFtZTogXCJ4LW1zLXZlcnNpb25cIixcbiAgICAgICAgICAgICAgICB4bWxOYW1lOiBcIngtbXMtdmVyc2lvblwiLFxuICAgICAgICAgICAgICAgIHR5cGU6IHtcbiAgICAgICAgICAgICAgICAgICAgbmFtZTogXCJTdHJpbmdcIixcbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIGRhdGU6IHtcbiAgICAgICAgICAgICAgICBzZXJpYWxpemVkTmFtZTogXCJkYXRlXCIsXG4gICAgICAgICAgICAgICAgeG1sTmFtZTogXCJkYXRlXCIsXG4gICAgICAgICAgICAgICAgdHlwZToge1xuICAgICAgICAgICAgICAgICAgICBuYW1lOiBcIkRhdGVUaW1lUmZjMTEyM1wiLFxuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgZXJyb3JDb2RlOiB7XG4gICAgICAgICAgICAgICAgc2VyaWFsaXplZE5hbWU6IFwieC1tcy1lcnJvci1jb2RlXCIsXG4gICAgICAgICAgICAgICAgeG1sTmFtZTogXCJ4LW1zLWVycm9yLWNvZGVcIixcbiAgICAgICAgICAgICAgICB0eXBlOiB7XG4gICAgICAgICAgICAgICAgICAgIG5hbWU6IFwiU3RyaW5nXCIsXG4gICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIH0sXG4gICAgICAgIH0sXG4gICAgfSxcbn07XG5jb25zdCBDb250YWluZXJHZXRBY2Nlc3NQb2xpY3lFeGNlcHRpb25IZWFkZXJzID0ge1xuICAgIHNlcmlhbGl6ZWROYW1lOiBcIkNvbnRhaW5lcl9nZXRBY2Nlc3NQb2xpY3lFeGNlcHRpb25IZWFkZXJzXCIsXG4gICAgdHlwZToge1xuICAgICAgICBuYW1lOiBcIkNvbXBvc2l0ZVwiLFxuICAgICAgICBjbGFzc05hbWU6IFwiQ29udGFpbmVyR2V0QWNjZXNzUG9saWN5RXhjZXB0aW9uSGVhZGVyc1wiLFxuICAgICAgICBtb2RlbFByb3BlcnRpZXM6IHtcbiAgICAgICAgICAgIGVycm9yQ29kZToge1xuICAgICAgICAgICAgICAgIHNlcmlhbGl6ZWROYW1lOiBcIngtbXMtZXJyb3ItY29kZVwiLFxuICAgICAgICAgICAgICAgIHhtbE5hbWU6IFwieC1tcy1lcnJvci1jb2RlXCIsXG4gICAgICAgICAgICAgICAgdHlwZToge1xuICAgICAgICAgICAgICAgICAgICBuYW1lOiBcIlN0cmluZ1wiLFxuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICB9LFxuICAgICAgICB9LFxuICAgIH0sXG59O1xuY29uc3QgQ29udGFpbmVyU2V0QWNjZXNzUG9saWN5SGVhZGVycyA9IHtcbiAgICBzZXJpYWxpemVkTmFtZTogXCJDb250YWluZXJfc2V0QWNjZXNzUG9saWN5SGVhZGVyc1wiLFxuICAgIHR5cGU6IHtcbiAgICAgICAgbmFtZTogXCJDb21wb3NpdGVcIixcbiAgICAgICAgY2xhc3NOYW1lOiBcIkNvbnRhaW5lclNldEFjY2Vzc1BvbGljeUhlYWRlcnNcIixcbiAgICAgICAgbW9kZWxQcm9wZXJ0aWVzOiB7XG4gICAgICAgICAgICBldGFnOiB7XG4gICAgICAgICAgICAgICAgc2VyaWFsaXplZE5hbWU6IFwiZXRhZ1wiLFxuICAgICAgICAgICAgICAgIHhtbE5hbWU6IFwiZXRhZ1wiLFxuICAgICAgICAgICAgICAgIHR5cGU6IHtcbiAgICAgICAgICAgICAgICAgICAgbmFtZTogXCJTdHJpbmdcIixcbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIGxhc3RNb2RpZmllZDoge1xuICAgICAgICAgICAgICAgIHNlcmlhbGl6ZWROYW1lOiBcImxhc3QtbW9kaWZpZWRcIixcbiAgICAgICAgICAgICAgICB4bWxOYW1lOiBcImxhc3QtbW9kaWZpZWRcIixcbiAgICAgICAgICAgICAgICB0eXBlOiB7XG4gICAgICAgICAgICAgICAgICAgIG5hbWU6IFwiRGF0ZVRpbWVSZmMxMTIzXCIsXG4gICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBjbGllbnRSZXF1ZXN0SWQ6IHtcbiAgICAgICAgICAgICAgICBzZXJpYWxpemVkTmFtZTogXCJ4LW1zLWNsaWVudC1yZXF1ZXN0LWlkXCIsXG4gICAgICAgICAgICAgICAgeG1sTmFtZTogXCJ4LW1zLWNsaWVudC1yZXF1ZXN0LWlkXCIsXG4gICAgICAgICAgICAgICAgdHlwZToge1xuICAgICAgICAgICAgICAgICAgICBuYW1lOiBcIlN0cmluZ1wiLFxuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgcmVxdWVzdElkOiB7XG4gICAgICAgICAgICAgICAgc2VyaWFsaXplZE5hbWU6IFwieC1tcy1yZXF1ZXN0LWlkXCIsXG4gICAgICAgICAgICAgICAgeG1sTmFtZTogXCJ4LW1zLXJlcXVlc3QtaWRcIixcbiAgICAgICAgICAgICAgICB0eXBlOiB7XG4gICAgICAgICAgICAgICAgICAgIG5hbWU6IFwiU3RyaW5nXCIsXG4gICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICB2ZXJzaW9uOiB7XG4gICAgICAgICAgICAgICAgc2VyaWFsaXplZE5hbWU6IFwieC1tcy12ZXJzaW9uXCIsXG4gICAgICAgICAgICAgICAgeG1sTmFtZTogXCJ4LW1zLXZlcnNpb25cIixcbiAgICAgICAgICAgICAgICB0eXBlOiB7XG4gICAgICAgICAgICAgICAgICAgIG5hbWU6IFwiU3RyaW5nXCIsXG4gICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBkYXRlOiB7XG4gICAgICAgICAgICAgICAgc2VyaWFsaXplZE5hbWU6IFwiZGF0ZVwiLFxuICAgICAgICAgICAgICAgIHhtbE5hbWU6IFwiZGF0ZVwiLFxuICAgICAgICAgICAgICAgIHR5cGU6IHtcbiAgICAgICAgICAgICAgICAgICAgbmFtZTogXCJEYXRlVGltZVJmYzExMjNcIixcbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIGVycm9yQ29kZToge1xuICAgICAgICAgICAgICAgIHNlcmlhbGl6ZWROYW1lOiBcIngtbXMtZXJyb3ItY29kZVwiLFxuICAgICAgICAgICAgICAgIHhtbE5hbWU6IFwieC1tcy1lcnJvci1jb2RlXCIsXG4gICAgICAgICAgICAgICAgdHlwZToge1xuICAgICAgICAgICAgICAgICAgICBuYW1lOiBcIlN0cmluZ1wiLFxuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICB9LFxuICAgICAgICB9LFxuICAgIH0sXG59O1xuY29uc3QgQ29udGFpbmVyU2V0QWNjZXNzUG9saWN5RXhjZXB0aW9uSGVhZGVycyA9IHtcbiAgICBzZXJpYWxpemVkTmFtZTogXCJDb250YWluZXJfc2V0QWNjZXNzUG9saWN5RXhjZXB0aW9uSGVhZGVyc1wiLFxuICAgIHR5cGU6IHtcbiAgICAgICAgbmFtZTogXCJDb21wb3NpdGVcIixcbiAgICAgICAgY2xhc3NOYW1lOiBcIkNvbnRhaW5lclNldEFjY2Vzc1BvbGljeUV4Y2VwdGlvbkhlYWRlcnNcIixcbiAgICAgICAgbW9kZWxQcm9wZXJ0aWVzOiB7XG4gICAgICAgICAgICBlcnJvckNvZGU6IHtcbiAgICAgICAgICAgICAgICBzZXJpYWxpemVkTmFtZTogXCJ4LW1zLWVycm9yLWNvZGVcIixcbiAgICAgICAgICAgICAgICB4bWxOYW1lOiBcIngtbXMtZXJyb3ItY29kZVwiLFxuICAgICAgICAgICAgICAgIHR5cGU6IHtcbiAgICAgICAgICAgICAgICAgICAgbmFtZTogXCJTdHJpbmdcIixcbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgfSxcbiAgICAgICAgfSxcbiAgICB9LFxufTtcbmNvbnN0IENvbnRhaW5lclJlc3RvcmVIZWFkZXJzID0ge1xuICAgIHNlcmlhbGl6ZWROYW1lOiBcIkNvbnRhaW5lcl9yZXN0b3JlSGVhZGVyc1wiLFxuICAgIHR5cGU6IHtcbiAgICAgICAgbmFtZTogXCJDb21wb3NpdGVcIixcbiAgICAgICAgY2xhc3NOYW1lOiBcIkNvbnRhaW5lclJlc3RvcmVIZWFkZXJzXCIsXG4gICAgICAgIG1vZGVsUHJvcGVydGllczoge1xuICAgICAgICAgICAgY2xpZW50UmVxdWVzdElkOiB7XG4gICAgICAgICAgICAgICAgc2VyaWFsaXplZE5hbWU6IFwieC1tcy1jbGllbnQtcmVxdWVzdC1pZFwiLFxuICAgICAgICAgICAgICAgIHhtbE5hbWU6IFwieC1tcy1jbGllbnQtcmVxdWVzdC1pZFwiLFxuICAgICAgICAgICAgICAgIHR5cGU6IHtcbiAgICAgICAgICAgICAgICAgICAgbmFtZTogXCJTdHJpbmdcIixcbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIHJlcXVlc3RJZDoge1xuICAgICAgICAgICAgICAgIHNlcmlhbGl6ZWROYW1lOiBcIngtbXMtcmVxdWVzdC1pZFwiLFxuICAgICAgICAgICAgICAgIHhtbE5hbWU6IFwieC1tcy1yZXF1ZXN0LWlkXCIsXG4gICAgICAgICAgICAgICAgdHlwZToge1xuICAgICAgICAgICAgICAgICAgICBuYW1lOiBcIlN0cmluZ1wiLFxuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgdmVyc2lvbjoge1xuICAgICAgICAgICAgICAgIHNlcmlhbGl6ZWROYW1lOiBcIngtbXMtdmVyc2lvblwiLFxuICAgICAgICAgICAgICAgIHhtbE5hbWU6IFwieC1tcy12ZXJzaW9uXCIsXG4gICAgICAgICAgICAgICAgdHlwZToge1xuICAgICAgICAgICAgICAgICAgICBuYW1lOiBcIlN0cmluZ1wiLFxuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgZGF0ZToge1xuICAgICAgICAgICAgICAgIHNlcmlhbGl6ZWROYW1lOiBcImRhdGVcIixcbiAgICAgICAgICAgICAgICB4bWxOYW1lOiBcImRhdGVcIixcbiAgICAgICAgICAgICAgICB0eXBlOiB7XG4gICAgICAgICAgICAgICAgICAgIG5hbWU6IFwiRGF0ZVRpbWVSZmMxMTIzXCIsXG4gICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBlcnJvckNvZGU6IHtcbiAgICAgICAgICAgICAgICBzZXJpYWxpemVkTmFtZTogXCJ4LW1zLWVycm9yLWNvZGVcIixcbiAgICAgICAgICAgICAgICB4bWxOYW1lOiBcIngtbXMtZXJyb3ItY29kZVwiLFxuICAgICAgICAgICAgICAgIHR5cGU6IHtcbiAgICAgICAgICAgICAgICAgICAgbmFtZTogXCJTdHJpbmdcIixcbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgfSxcbiAgICAgICAgfSxcbiAgICB9LFxufTtcbmNvbnN0IENvbnRhaW5lclJlc3RvcmVFeGNlcHRpb25IZWFkZXJzID0ge1xuICAgIHNlcmlhbGl6ZWROYW1lOiBcIkNvbnRhaW5lcl9yZXN0b3JlRXhjZXB0aW9uSGVhZGVyc1wiLFxuICAgIHR5cGU6IHtcbiAgICAgICAgbmFtZTogXCJDb21wb3NpdGVcIixcbiAgICAgICAgY2xhc3NOYW1lOiBcIkNvbnRhaW5lclJlc3RvcmVFeGNlcHRpb25IZWFkZXJzXCIsXG4gICAgICAgIG1vZGVsUHJvcGVydGllczoge1xuICAgICAgICAgICAgZXJyb3JDb2RlOiB7XG4gICAgICAgICAgICAgICAgc2VyaWFsaXplZE5hbWU6IFwieC1tcy1lcnJvci1jb2RlXCIsXG4gICAgICAgICAgICAgICAgeG1sTmFtZTogXCJ4LW1zLWVycm9yLWNvZGVcIixcbiAgICAgICAgICAgICAgICB0eXBlOiB7XG4gICAgICAgICAgICAgICAgICAgIG5hbWU6IFwiU3RyaW5nXCIsXG4gICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIH0sXG4gICAgICAgIH0sXG4gICAgfSxcbn07XG5jb25zdCBDb250YWluZXJSZW5hbWVIZWFkZXJzID0ge1xuICAgIHNlcmlhbGl6ZWROYW1lOiBcIkNvbnRhaW5lcl9yZW5hbWVIZWFkZXJzXCIsXG4gICAgdHlwZToge1xuICAgICAgICBuYW1lOiBcIkNvbXBvc2l0ZVwiLFxuICAgICAgICBjbGFzc05hbWU6IFwiQ29udGFpbmVyUmVuYW1lSGVhZGVyc1wiLFxuICAgICAgICBtb2RlbFByb3BlcnRpZXM6IHtcbiAgICAgICAgICAgIGNsaWVudFJlcXVlc3RJZDoge1xuICAgICAgICAgICAgICAgIHNlcmlhbGl6ZWROYW1lOiBcIngtbXMtY2xpZW50LXJlcXVlc3QtaWRcIixcbiAgICAgICAgICAgICAgICB4bWxOYW1lOiBcIngtbXMtY2xpZW50LXJlcXVlc3QtaWRcIixcbiAgICAgICAgICAgICAgICB0eXBlOiB7XG4gICAgICAgICAgICAgICAgICAgIG5hbWU6IFwiU3RyaW5nXCIsXG4gICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICByZXF1ZXN0SWQ6IHtcbiAgICAgICAgICAgICAgICBzZXJpYWxpemVkTmFtZTogXCJ4LW1zLXJlcXVlc3QtaWRcIixcbiAgICAgICAgICAgICAgICB4bWxOYW1lOiBcIngtbXMtcmVxdWVzdC1pZFwiLFxuICAgICAgICAgICAgICAgIHR5cGU6IHtcbiAgICAgICAgICAgICAgICAgICAgbmFtZTogXCJTdHJpbmdcIixcbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIHZlcnNpb246IHtcbiAgICAgICAgICAgICAgICBzZXJpYWxpemVkTmFtZTogXCJ4LW1zLXZlcnNpb25cIixcbiAgICAgICAgICAgICAgICB4bWxOYW1lOiBcIngtbXMtdmVyc2lvblwiLFxuICAgICAgICAgICAgICAgIHR5cGU6IHtcbiAgICAgICAgICAgICAgICAgICAgbmFtZTogXCJTdHJpbmdcIixcbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIGRhdGU6IHtcbiAgICAgICAgICAgICAgICBzZXJpYWxpemVkTmFtZTogXCJkYXRlXCIsXG4gICAgICAgICAgICAgICAgeG1sTmFtZTogXCJkYXRlXCIsXG4gICAgICAgICAgICAgICAgdHlwZToge1xuICAgICAgICAgICAgICAgICAgICBuYW1lOiBcIkRhdGVUaW1lUmZjMTEyM1wiLFxuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgZXJyb3JDb2RlOiB7XG4gICAgICAgICAgICAgICAgc2VyaWFsaXplZE5hbWU6IFwieC1tcy1lcnJvci1jb2RlXCIsXG4gICAgICAgICAgICAgICAgeG1sTmFtZTogXCJ4LW1zLWVycm9yLWNvZGVcIixcbiAgICAgICAgICAgICAgICB0eXBlOiB7XG4gICAgICAgICAgICAgICAgICAgIG5hbWU6IFwiU3RyaW5nXCIsXG4gICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIH0sXG4gICAgICAgIH0sXG4gICAgfSxcbn07XG5jb25zdCBDb250YWluZXJSZW5hbWVFeGNlcHRpb25IZWFkZXJzID0ge1xuICAgIHNlcmlhbGl6ZWROYW1lOiBcIkNvbnRhaW5lcl9yZW5hbWVFeGNlcHRpb25IZWFkZXJzXCIsXG4gICAgdHlwZToge1xuICAgICAgICBuYW1lOiBcIkNvbXBvc2l0ZVwiLFxuICAgICAgICBjbGFzc05hbWU6IFwiQ29udGFpbmVyUmVuYW1lRXhjZXB0aW9uSGVhZGVyc1wiLFxuICAgICAgICBtb2RlbFByb3BlcnRpZXM6IHtcbiAgICAgICAgICAgIGVycm9yQ29kZToge1xuICAgICAgICAgICAgICAgIHNlcmlhbGl6ZWROYW1lOiBcIngtbXMtZXJyb3ItY29kZVwiLFxuICAgICAgICAgICAgICAgIHhtbE5hbWU6IFwieC1tcy1lcnJvci1jb2RlXCIsXG4gICAgICAgICAgICAgICAgdHlwZToge1xuICAgICAgICAgICAgICAgICAgICBuYW1lOiBcIlN0cmluZ1wiLFxuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICB9LFxuICAgICAgICB9LFxuICAgIH0sXG59O1xuY29uc3QgQ29udGFpbmVyU3VibWl0QmF0Y2hIZWFkZXJzID0ge1xuICAgIHNlcmlhbGl6ZWROYW1lOiBcIkNvbnRhaW5lcl9zdWJtaXRCYXRjaEhlYWRlcnNcIixcbiAgICB0eXBlOiB7XG4gICAgICAgIG5hbWU6IFwiQ29tcG9zaXRlXCIsXG4gICAgICAgIGNsYXNzTmFtZTogXCJDb250YWluZXJTdWJtaXRCYXRjaEhlYWRlcnNcIixcbiAgICAgICAgbW9kZWxQcm9wZXJ0aWVzOiB7XG4gICAgICAgICAgICBjb250ZW50VHlwZToge1xuICAgICAgICAgICAgICAgIHNlcmlhbGl6ZWROYW1lOiBcImNvbnRlbnQtdHlwZVwiLFxuICAgICAgICAgICAgICAgIHhtbE5hbWU6IFwiY29udGVudC10eXBlXCIsXG4gICAgICAgICAgICAgICAgdHlwZToge1xuICAgICAgICAgICAgICAgICAgICBuYW1lOiBcIlN0cmluZ1wiLFxuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgcmVxdWVzdElkOiB7XG4gICAgICAgICAgICAgICAgc2VyaWFsaXplZE5hbWU6IFwieC1tcy1yZXF1ZXN0LWlkXCIsXG4gICAgICAgICAgICAgICAgeG1sTmFtZTogXCJ4LW1zLXJlcXVlc3QtaWRcIixcbiAgICAgICAgICAgICAgICB0eXBlOiB7XG4gICAgICAgICAgICAgICAgICAgIG5hbWU6IFwiU3RyaW5nXCIsXG4gICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICB2ZXJzaW9uOiB7XG4gICAgICAgICAgICAgICAgc2VyaWFsaXplZE5hbWU6IFwieC1tcy12ZXJzaW9uXCIsXG4gICAgICAgICAgICAgICAgeG1sTmFtZTogXCJ4LW1zLXZlcnNpb25cIixcbiAgICAgICAgICAgICAgICB0eXBlOiB7XG4gICAgICAgICAgICAgICAgICAgIG5hbWU6IFwiU3RyaW5nXCIsXG4gICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIH0sXG4gICAgICAgIH0sXG4gICAgfSxcbn07XG5jb25zdCBDb250YWluZXJTdWJtaXRCYXRjaEV4Y2VwdGlvbkhlYWRlcnMgPSB7XG4gICAgc2VyaWFsaXplZE5hbWU6IFwiQ29udGFpbmVyX3N1Ym1pdEJhdGNoRXhjZXB0aW9uSGVhZGVyc1wiLFxuICAgIHR5cGU6IHtcbiAgICAgICAgbmFtZTogXCJDb21wb3NpdGVcIixcbiAgICAgICAgY2xhc3NOYW1lOiBcIkNvbnRhaW5lclN1Ym1pdEJhdGNoRXhjZXB0aW9uSGVhZGVyc1wiLFxuICAgICAgICBtb2RlbFByb3BlcnRpZXM6IHtcbiAgICAgICAgICAgIGVycm9yQ29kZToge1xuICAgICAgICAgICAgICAgIHNlcmlhbGl6ZWROYW1lOiBcIngtbXMtZXJyb3ItY29kZVwiLFxuICAgICAgICAgICAgICAgIHhtbE5hbWU6IFwieC1tcy1lcnJvci1jb2RlXCIsXG4gICAgICAgICAgICAgICAgdHlwZToge1xuICAgICAgICAgICAgICAgICAgICBuYW1lOiBcIlN0cmluZ1wiLFxuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICB9LFxuICAgICAgICB9LFxuICAgIH0sXG59O1xuY29uc3QgQ29udGFpbmVyRmlsdGVyQmxvYnNIZWFkZXJzID0ge1xuICAgIHNlcmlhbGl6ZWROYW1lOiBcIkNvbnRhaW5lcl9maWx0ZXJCbG9ic0hlYWRlcnNcIixcbiAgICB0eXBlOiB7XG4gICAgICAgIG5hbWU6IFwiQ29tcG9zaXRlXCIsXG4gICAgICAgIGNsYXNzTmFtZTogXCJDb250YWluZXJGaWx0ZXJCbG9ic0hlYWRlcnNcIixcbiAgICAgICAgbW9kZWxQcm9wZXJ0aWVzOiB7XG4gICAgICAgICAgICBjbGllbnRSZXF1ZXN0SWQ6IHtcbiAgICAgICAgICAgICAgICBzZXJpYWxpemVkTmFtZTogXCJ4LW1zLWNsaWVudC1yZXF1ZXN0LWlkXCIsXG4gICAgICAgICAgICAgICAgeG1sTmFtZTogXCJ4LW1zLWNsaWVudC1yZXF1ZXN0LWlkXCIsXG4gICAgICAgICAgICAgICAgdHlwZToge1xuICAgICAgICAgICAgICAgICAgICBuYW1lOiBcIlN0cmluZ1wiLFxuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgcmVxdWVzdElkOiB7XG4gICAgICAgICAgICAgICAgc2VyaWFsaXplZE5hbWU6IFwieC1tcy1yZXF1ZXN0LWlkXCIsXG4gICAgICAgICAgICAgICAgeG1sTmFtZTogXCJ4LW1zLXJlcXVlc3QtaWRcIixcbiAgICAgICAgICAgICAgICB0eXBlOiB7XG4gICAgICAgICAgICAgICAgICAgIG5hbWU6IFwiU3RyaW5nXCIsXG4gICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICB2ZXJzaW9uOiB7XG4gICAgICAgICAgICAgICAgc2VyaWFsaXplZE5hbWU6IFwieC1tcy12ZXJzaW9uXCIsXG4gICAgICAgICAgICAgICAgeG1sTmFtZTogXCJ4LW1zLXZlcnNpb25cIixcbiAgICAgICAgICAgICAgICB0eXBlOiB7XG4gICAgICAgICAgICAgICAgICAgIG5hbWU6IFwiU3RyaW5nXCIsXG4gICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBkYXRlOiB7XG4gICAgICAgICAgICAgICAgc2VyaWFsaXplZE5hbWU6IFwiZGF0ZVwiLFxuICAgICAgICAgICAgICAgIHhtbE5hbWU6IFwiZGF0ZVwiLFxuICAgICAgICAgICAgICAgIHR5cGU6IHtcbiAgICAgICAgICAgICAgICAgICAgbmFtZTogXCJEYXRlVGltZVJmYzExMjNcIixcbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgfSxcbiAgICAgICAgfSxcbiAgICB9LFxufTtcbmNvbnN0IENvbnRhaW5lckZpbHRlckJsb2JzRXhjZXB0aW9uSGVhZGVycyA9IHtcbiAgICBzZXJpYWxpemVkTmFtZTogXCJDb250YWluZXJfZmlsdGVyQmxvYnNFeGNlcHRpb25IZWFkZXJzXCIsXG4gICAgdHlwZToge1xuICAgICAgICBuYW1lOiBcIkNvbXBvc2l0ZVwiLFxuICAgICAgICBjbGFzc05hbWU6IFwiQ29udGFpbmVyRmlsdGVyQmxvYnNFeGNlcHRpb25IZWFkZXJzXCIsXG4gICAgICAgIG1vZGVsUHJvcGVydGllczoge1xuICAgICAgICAgICAgZXJyb3JDb2RlOiB7XG4gICAgICAgICAgICAgICAgc2VyaWFsaXplZE5hbWU6IFwieC1tcy1lcnJvci1jb2RlXCIsXG4gICAgICAgICAgICAgICAgeG1sTmFtZTogXCJ4LW1zLWVycm9yLWNvZGVcIixcbiAgICAgICAgICAgICAgICB0eXBlOiB7XG4gICAgICAgICAgICAgICAgICAgIG5hbWU6IFwiU3RyaW5nXCIsXG4gICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIH0sXG4gICAgICAgIH0sXG4gICAgfSxcbn07XG5jb25zdCBDb250YWluZXJBY3F1aXJlTGVhc2VIZWFkZXJzID0ge1xuICAgIHNlcmlhbGl6ZWROYW1lOiBcIkNvbnRhaW5lcl9hY3F1aXJlTGVhc2VIZWFkZXJzXCIsXG4gICAgdHlwZToge1xuICAgICAgICBuYW1lOiBcIkNvbXBvc2l0ZVwiLFxuICAgICAgICBjbGFzc05hbWU6IFwiQ29udGFpbmVyQWNxdWlyZUxlYXNlSGVhZGVyc1wiLFxuICAgICAgICBtb2RlbFByb3BlcnRpZXM6IHtcbiAgICAgICAgICAgIGV0YWc6IHtcbiAgICAgICAgICAgICAgICBzZXJpYWxpemVkTmFtZTogXCJldGFnXCIsXG4gICAgICAgICAgICAgICAgeG1sTmFtZTogXCJldGFnXCIsXG4gICAgICAgICAgICAgICAgdHlwZToge1xuICAgICAgICAgICAgICAgICAgICBuYW1lOiBcIlN0cmluZ1wiLFxuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgbGFzdE1vZGlmaWVkOiB7XG4gICAgICAgICAgICAgICAgc2VyaWFsaXplZE5hbWU6IFwibGFzdC1tb2RpZmllZFwiLFxuICAgICAgICAgICAgICAgIHhtbE5hbWU6IFwibGFzdC1tb2RpZmllZFwiLFxuICAgICAgICAgICAgICAgIHR5cGU6IHtcbiAgICAgICAgICAgICAgICAgICAgbmFtZTogXCJEYXRlVGltZVJmYzExMjNcIixcbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIGxlYXNlSWQ6IHtcbiAgICAgICAgICAgICAgICBzZXJpYWxpemVkTmFtZTogXCJ4LW1zLWxlYXNlLWlkXCIsXG4gICAgICAgICAgICAgICAgeG1sTmFtZTogXCJ4LW1zLWxlYXNlLWlkXCIsXG4gICAgICAgICAgICAgICAgdHlwZToge1xuICAgICAgICAgICAgICAgICAgICBuYW1lOiBcIlN0cmluZ1wiLFxuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgY2xpZW50UmVxdWVzdElkOiB7XG4gICAgICAgICAgICAgICAgc2VyaWFsaXplZE5hbWU6IFwieC1tcy1jbGllbnQtcmVxdWVzdC1pZFwiLFxuICAgICAgICAgICAgICAgIHhtbE5hbWU6IFwieC1tcy1jbGllbnQtcmVxdWVzdC1pZFwiLFxuICAgICAgICAgICAgICAgIHR5cGU6IHtcbiAgICAgICAgICAgICAgICAgICAgbmFtZTogXCJTdHJpbmdcIixcbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIHJlcXVlc3RJZDoge1xuICAgICAgICAgICAgICAgIHNlcmlhbGl6ZWROYW1lOiBcIngtbXMtcmVxdWVzdC1pZFwiLFxuICAgICAgICAgICAgICAgIHhtbE5hbWU6IFwieC1tcy1yZXF1ZXN0LWlkXCIsXG4gICAgICAgICAgICAgICAgdHlwZToge1xuICAgICAgICAgICAgICAgICAgICBuYW1lOiBcIlN0cmluZ1wiLFxuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgdmVyc2lvbjoge1xuICAgICAgICAgICAgICAgIHNlcmlhbGl6ZWROYW1lOiBcIngtbXMtdmVyc2lvblwiLFxuICAgICAgICAgICAgICAgIHhtbE5hbWU6IFwieC1tcy12ZXJzaW9uXCIsXG4gICAgICAgICAgICAgICAgdHlwZToge1xuICAgICAgICAgICAgICAgICAgICBuYW1lOiBcIlN0cmluZ1wiLFxuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgZGF0ZToge1xuICAgICAgICAgICAgICAgIHNlcmlhbGl6ZWROYW1lOiBcImRhdGVcIixcbiAgICAgICAgICAgICAgICB4bWxOYW1lOiBcImRhdGVcIixcbiAgICAgICAgICAgICAgICB0eXBlOiB7XG4gICAgICAgICAgICAgICAgICAgIG5hbWU6IFwiRGF0ZVRpbWVSZmMxMTIzXCIsXG4gICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIH0sXG4gICAgICAgIH0sXG4gICAgfSxcbn07XG5jb25zdCBDb250YWluZXJBY3F1aXJlTGVhc2VFeGNlcHRpb25IZWFkZXJzID0ge1xuICAgIHNlcmlhbGl6ZWROYW1lOiBcIkNvbnRhaW5lcl9hY3F1aXJlTGVhc2VFeGNlcHRpb25IZWFkZXJzXCIsXG4gICAgdHlwZToge1xuICAgICAgICBuYW1lOiBcIkNvbXBvc2l0ZVwiLFxuICAgICAgICBjbGFzc05hbWU6IFwiQ29udGFpbmVyQWNxdWlyZUxlYXNlRXhjZXB0aW9uSGVhZGVyc1wiLFxuICAgICAgICBtb2RlbFByb3BlcnRpZXM6IHtcbiAgICAgICAgICAgIGVycm9yQ29kZToge1xuICAgICAgICAgICAgICAgIHNlcmlhbGl6ZWROYW1lOiBcIngtbXMtZXJyb3ItY29kZVwiLFxuICAgICAgICAgICAgICAgIHhtbE5hbWU6IFwieC1tcy1lcnJvci1jb2RlXCIsXG4gICAgICAgICAgICAgICAgdHlwZToge1xuICAgICAgICAgICAgICAgICAgICBuYW1lOiBcIlN0cmluZ1wiLFxuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICB9LFxuICAgICAgICB9LFxuICAgIH0sXG59O1xuY29uc3QgQ29udGFpbmVyUmVsZWFzZUxlYXNlSGVhZGVycyA9IHtcbiAgICBzZXJpYWxpemVkTmFtZTogXCJDb250YWluZXJfcmVsZWFzZUxlYXNlSGVhZGVyc1wiLFxuICAgIHR5cGU6IHtcbiAgICAgICAgbmFtZTogXCJDb21wb3NpdGVcIixcbiAgICAgICAgY2xhc3NOYW1lOiBcIkNvbnRhaW5lclJlbGVhc2VMZWFzZUhlYWRlcnNcIixcbiAgICAgICAgbW9kZWxQcm9wZXJ0aWVzOiB7XG4gICAgICAgICAgICBldGFnOiB7XG4gICAgICAgICAgICAgICAgc2VyaWFsaXplZE5hbWU6IFwiZXRhZ1wiLFxuICAgICAgICAgICAgICAgIHhtbE5hbWU6IFwiZXRhZ1wiLFxuICAgICAgICAgICAgICAgIHR5cGU6IHtcbiAgICAgICAgICAgICAgICAgICAgbmFtZTogXCJTdHJpbmdcIixcbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIGxhc3RNb2RpZmllZDoge1xuICAgICAgICAgICAgICAgIHNlcmlhbGl6ZWROYW1lOiBcImxhc3QtbW9kaWZpZWRcIixcbiAgICAgICAgICAgICAgICB4bWxOYW1lOiBcImxhc3QtbW9kaWZpZWRcIixcbiAgICAgICAgICAgICAgICB0eXBlOiB7XG4gICAgICAgICAgICAgICAgICAgIG5hbWU6IFwiRGF0ZVRpbWVSZmMxMTIzXCIsXG4gICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBjbGllbnRSZXF1ZXN0SWQ6IHtcbiAgICAgICAgICAgICAgICBzZXJpYWxpemVkTmFtZTogXCJ4LW1zLWNsaWVudC1yZXF1ZXN0LWlkXCIsXG4gICAgICAgICAgICAgICAgeG1sTmFtZTogXCJ4LW1zLWNsaWVudC1yZXF1ZXN0LWlkXCIsXG4gICAgICAgICAgICAgICAgdHlwZToge1xuICAgICAgICAgICAgICAgICAgICBuYW1lOiBcIlN0cmluZ1wiLFxuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgcmVxdWVzdElkOiB7XG4gICAgICAgICAgICAgICAgc2VyaWFsaXplZE5hbWU6IFwieC1tcy1yZXF1ZXN0LWlkXCIsXG4gICAgICAgICAgICAgICAgeG1sTmFtZTogXCJ4LW1zLXJlcXVlc3QtaWRcIixcbiAgICAgICAgICAgICAgICB0eXBlOiB7XG4gICAgICAgICAgICAgICAgICAgIG5hbWU6IFwiU3RyaW5nXCIsXG4gICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICB2ZXJzaW9uOiB7XG4gICAgICAgICAgICAgICAgc2VyaWFsaXplZE5hbWU6IFwieC1tcy12ZXJzaW9uXCIsXG4gICAgICAgICAgICAgICAgeG1sTmFtZTogXCJ4LW1zLXZlcnNpb25cIixcbiAgICAgICAgICAgICAgICB0eXBlOiB7XG4gICAgICAgICAgICAgICAgICAgIG5hbWU6IFwiU3RyaW5nXCIsXG4gICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBkYXRlOiB7XG4gICAgICAgICAgICAgICAgc2VyaWFsaXplZE5hbWU6IFwiZGF0ZVwiLFxuICAgICAgICAgICAgICAgIHhtbE5hbWU6IFwiZGF0ZVwiLFxuICAgICAgICAgICAgICAgIHR5cGU6IHtcbiAgICAgICAgICAgICAgICAgICAgbmFtZTogXCJEYXRlVGltZVJmYzExMjNcIixcbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgfSxcbiAgICAgICAgfSxcbiAgICB9LFxufTtcbmNvbnN0IENvbnRhaW5lclJlbGVhc2VMZWFzZUV4Y2VwdGlvbkhlYWRlcnMgPSB7XG4gICAgc2VyaWFsaXplZE5hbWU6IFwiQ29udGFpbmVyX3JlbGVhc2VMZWFzZUV4Y2VwdGlvbkhlYWRlcnNcIixcbiAgICB0eXBlOiB7XG4gICAgICAgIG5hbWU6IFwiQ29tcG9zaXRlXCIsXG4gICAgICAgIGNsYXNzTmFtZTogXCJDb250YWluZXJSZWxlYXNlTGVhc2VFeGNlcHRpb25IZWFkZXJzXCIsXG4gICAgICAgIG1vZGVsUHJvcGVydGllczoge1xuICAgICAgICAgICAgZXJyb3JDb2RlOiB7XG4gICAgICAgICAgICAgICAgc2VyaWFsaXplZE5hbWU6IFwieC1tcy1lcnJvci1jb2RlXCIsXG4gICAgICAgICAgICAgICAgeG1sTmFtZTogXCJ4LW1zLWVycm9yLWNvZGVcIixcbiAgICAgICAgICAgICAgICB0eXBlOiB7XG4gICAgICAgICAgICAgICAgICAgIG5hbWU6IFwiU3RyaW5nXCIsXG4gICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIH0sXG4gICAgICAgIH0sXG4gICAgfSxcbn07XG5jb25zdCBDb250YWluZXJSZW5ld0xlYXNlSGVhZGVycyA9IHtcbiAgICBzZXJpYWxpemVkTmFtZTogXCJDb250YWluZXJfcmVuZXdMZWFzZUhlYWRlcnNcIixcbiAgICB0eXBlOiB7XG4gICAgICAgIG5hbWU6IFwiQ29tcG9zaXRlXCIsXG4gICAgICAgIGNsYXNzTmFtZTogXCJDb250YWluZXJSZW5ld0xlYXNlSGVhZGVyc1wiLFxuICAgICAgICBtb2RlbFByb3BlcnRpZXM6IHtcbiAgICAgICAgICAgIGV0YWc6IHtcbiAgICAgICAgICAgICAgICBzZXJpYWxpemVkTmFtZTogXCJldGFnXCIsXG4gICAgICAgICAgICAgICAgeG1sTmFtZTogXCJldGFnXCIsXG4gICAgICAgICAgICAgICAgdHlwZToge1xuICAgICAgICAgICAgICAgICAgICBuYW1lOiBcIlN0cmluZ1wiLFxuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgbGFzdE1vZGlmaWVkOiB7XG4gICAgICAgICAgICAgICAgc2VyaWFsaXplZE5hbWU6IFwibGFzdC1tb2RpZmllZFwiLFxuICAgICAgICAgICAgICAgIHhtbE5hbWU6IFwibGFzdC1tb2RpZmllZFwiLFxuICAgICAgICAgICAgICAgIHR5cGU6IHtcbiAgICAgICAgICAgICAgICAgICAgbmFtZTogXCJEYXRlVGltZVJmYzExMjNcIixcbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIGxlYXNlSWQ6IHtcbiAgICAgICAgICAgICAgICBzZXJpYWxpemVkTmFtZTogXCJ4LW1zLWxlYXNlLWlkXCIsXG4gICAgICAgICAgICAgICAgeG1sTmFtZTogXCJ4LW1zLWxlYXNlLWlkXCIsXG4gICAgICAgICAgICAgICAgdHlwZToge1xuICAgICAgICAgICAgICAgICAgICBuYW1lOiBcIlN0cmluZ1wiLFxuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgY2xpZW50UmVxdWVzdElkOiB7XG4gICAgICAgICAgICAgICAgc2VyaWFsaXplZE5hbWU6IFwieC1tcy1jbGllbnQtcmVxdWVzdC1pZFwiLFxuICAgICAgICAgICAgICAgIHhtbE5hbWU6IFwieC1tcy1jbGllbnQtcmVxdWVzdC1pZFwiLFxuICAgICAgICAgICAgICAgIHR5cGU6IHtcbiAgICAgICAgICAgICAgICAgICAgbmFtZTogXCJTdHJpbmdcIixcbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIHJlcXVlc3RJZDoge1xuICAgICAgICAgICAgICAgIHNlcmlhbGl6ZWROYW1lOiBcIngtbXMtcmVxdWVzdC1pZFwiLFxuICAgICAgICAgICAgICAgIHhtbE5hbWU6IFwieC1tcy1yZXF1ZXN0LWlkXCIsXG4gICAgICAgICAgICAgICAgdHlwZToge1xuICAgICAgICAgICAgICAgICAgICBuYW1lOiBcIlN0cmluZ1wiLFxuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgdmVyc2lvbjoge1xuICAgICAgICAgICAgICAgIHNlcmlhbGl6ZWROYW1lOiBcIngtbXMtdmVyc2lvblwiLFxuICAgICAgICAgICAgICAgIHhtbE5hbWU6IFwieC1tcy12ZXJzaW9uXCIsXG4gICAgICAgICAgICAgICAgdHlwZToge1xuICAgICAgICAgICAgICAgICAgICBuYW1lOiBcIlN0cmluZ1wiLFxuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgZGF0ZToge1xuICAgICAgICAgICAgICAgIHNlcmlhbGl6ZWROYW1lOiBcImRhdGVcIixcbiAgICAgICAgICAgICAgICB4bWxOYW1lOiBcImRhdGVcIixcbiAgICAgICAgICAgICAgICB0eXBlOiB7XG4gICAgICAgICAgICAgICAgICAgIG5hbWU6IFwiRGF0ZVRpbWVSZmMxMTIzXCIsXG4gICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIH0sXG4gICAgICAgIH0sXG4gICAgfSxcbn07XG5jb25zdCBDb250YWluZXJSZW5ld0xlYXNlRXhjZXB0aW9uSGVhZGVycyA9IHtcbiAgICBzZXJpYWxpemVkTmFtZTogXCJDb250YWluZXJfcmVuZXdMZWFzZUV4Y2VwdGlvbkhlYWRlcnNcIixcbiAgICB0eXBlOiB7XG4gICAgICAgIG5hbWU6IFwiQ29tcG9zaXRlXCIsXG4gICAgICAgIGNsYXNzTmFtZTogXCJDb250YWluZXJSZW5ld0xlYXNlRXhjZXB0aW9uSGVhZGVyc1wiLFxuICAgICAgICBtb2RlbFByb3BlcnRpZXM6IHtcbiAgICAgICAgICAgIGVycm9yQ29kZToge1xuICAgICAgICAgICAgICAgIHNlcmlhbGl6ZWROYW1lOiBcIngtbXMtZXJyb3ItY29kZVwiLFxuICAgICAgICAgICAgICAgIHhtbE5hbWU6IFwieC1tcy1lcnJvci1jb2RlXCIsXG4gICAgICAgICAgICAgICAgdHlwZToge1xuICAgICAgICAgICAgICAgICAgICBuYW1lOiBcIlN0cmluZ1wiLFxuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICB9LFxuICAgICAgICB9LFxuICAgIH0sXG59O1xuY29uc3QgQ29udGFpbmVyQnJlYWtMZWFzZUhlYWRlcnMgPSB7XG4gICAgc2VyaWFsaXplZE5hbWU6IFwiQ29udGFpbmVyX2JyZWFrTGVhc2VIZWFkZXJzXCIsXG4gICAgdHlwZToge1xuICAgICAgICBuYW1lOiBcIkNvbXBvc2l0ZVwiLFxuICAgICAgICBjbGFzc05hbWU6IFwiQ29udGFpbmVyQnJlYWtMZWFzZUhlYWRlcnNcIixcbiAgICAgICAgbW9kZWxQcm9wZXJ0aWVzOiB7XG4gICAgICAgICAgICBldGFnOiB7XG4gICAgICAgICAgICAgICAgc2VyaWFsaXplZE5hbWU6IFwiZXRhZ1wiLFxuICAgICAgICAgICAgICAgIHhtbE5hbWU6IFwiZXRhZ1wiLFxuICAgICAgICAgICAgICAgIHR5cGU6IHtcbiAgICAgICAgICAgICAgICAgICAgbmFtZTogXCJTdHJpbmdcIixcbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIGxhc3RNb2RpZmllZDoge1xuICAgICAgICAgICAgICAgIHNlcmlhbGl6ZWROYW1lOiBcImxhc3QtbW9kaWZpZWRcIixcbiAgICAgICAgICAgICAgICB4bWxOYW1lOiBcImxhc3QtbW9kaWZpZWRcIixcbiAgICAgICAgICAgICAgICB0eXBlOiB7XG4gICAgICAgICAgICAgICAgICAgIG5hbWU6IFwiRGF0ZVRpbWVSZmMxMTIzXCIsXG4gICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBsZWFzZVRpbWU6IHtcbiAgICAgICAgICAgICAgICBzZXJpYWxpemVkTmFtZTogXCJ4LW1zLWxlYXNlLXRpbWVcIixcbiAgICAgICAgICAgICAgICB4bWxOYW1lOiBcIngtbXMtbGVhc2UtdGltZVwiLFxuICAgICAgICAgICAgICAgIHR5cGU6IHtcbiAgICAgICAgICAgICAgICAgICAgbmFtZTogXCJOdW1iZXJcIixcbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIGNsaWVudFJlcXVlc3RJZDoge1xuICAgICAgICAgICAgICAgIHNlcmlhbGl6ZWROYW1lOiBcIngtbXMtY2xpZW50LXJlcXVlc3QtaWRcIixcbiAgICAgICAgICAgICAgICB4bWxOYW1lOiBcIngtbXMtY2xpZW50LXJlcXVlc3QtaWRcIixcbiAgICAgICAgICAgICAgICB0eXBlOiB7XG4gICAgICAgICAgICAgICAgICAgIG5hbWU6IFwiU3RyaW5nXCIsXG4gICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICByZXF1ZXN0SWQ6IHtcbiAgICAgICAgICAgICAgICBzZXJpYWxpemVkTmFtZTogXCJ4LW1zLXJlcXVlc3QtaWRcIixcbiAgICAgICAgICAgICAgICB4bWxOYW1lOiBcIngtbXMtcmVxdWVzdC1pZFwiLFxuICAgICAgICAgICAgICAgIHR5cGU6IHtcbiAgICAgICAgICAgICAgICAgICAgbmFtZTogXCJTdHJpbmdcIixcbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIHZlcnNpb246IHtcbiAgICAgICAgICAgICAgICBzZXJpYWxpemVkTmFtZTogXCJ4LW1zLXZlcnNpb25cIixcbiAgICAgICAgICAgICAgICB4bWxOYW1lOiBcIngtbXMtdmVyc2lvblwiLFxuICAgICAgICAgICAgICAgIHR5cGU6IHtcbiAgICAgICAgICAgICAgICAgICAgbmFtZTogXCJTdHJpbmdcIixcbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIGRhdGU6IHtcbiAgICAgICAgICAgICAgICBzZXJpYWxpemVkTmFtZTogXCJkYXRlXCIsXG4gICAgICAgICAgICAgICAgeG1sTmFtZTogXCJkYXRlXCIsXG4gICAgICAgICAgICAgICAgdHlwZToge1xuICAgICAgICAgICAgICAgICAgICBuYW1lOiBcIkRhdGVUaW1lUmZjMTEyM1wiLFxuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICB9LFxuICAgICAgICB9LFxuICAgIH0sXG59O1xuY29uc3QgQ29udGFpbmVyQnJlYWtMZWFzZUV4Y2VwdGlvbkhlYWRlcnMgPSB7XG4gICAgc2VyaWFsaXplZE5hbWU6IFwiQ29udGFpbmVyX2JyZWFrTGVhc2VFeGNlcHRpb25IZWFkZXJzXCIsXG4gICAgdHlwZToge1xuICAgICAgICBuYW1lOiBcIkNvbXBvc2l0ZVwiLFxuICAgICAgICBjbGFzc05hbWU6IFwiQ29udGFpbmVyQnJlYWtMZWFzZUV4Y2VwdGlvbkhlYWRlcnNcIixcbiAgICAgICAgbW9kZWxQcm9wZXJ0aWVzOiB7XG4gICAgICAgICAgICBlcnJvckNvZGU6IHtcbiAgICAgICAgICAgICAgICBzZXJpYWxpemVkTmFtZTogXCJ4LW1zLWVycm9yLWNvZGVcIixcbiAgICAgICAgICAgICAgICB4bWxOYW1lOiBcIngtbXMtZXJyb3ItY29kZVwiLFxuICAgICAgICAgICAgICAgIHR5cGU6IHtcbiAgICAgICAgICAgICAgICAgICAgbmFtZTogXCJTdHJpbmdcIixcbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgfSxcbiAgICAgICAgfSxcbiAgICB9LFxufTtcbmNvbnN0IENvbnRhaW5lckNoYW5nZUxlYXNlSGVhZGVycyA9IHtcbiAgICBzZXJpYWxpemVkTmFtZTogXCJDb250YWluZXJfY2hhbmdlTGVhc2VIZWFkZXJzXCIsXG4gICAgdHlwZToge1xuICAgICAgICBuYW1lOiBcIkNvbXBvc2l0ZVwiLFxuICAgICAgICBjbGFzc05hbWU6IFwiQ29udGFpbmVyQ2hhbmdlTGVhc2VIZWFkZXJzXCIsXG4gICAgICAgIG1vZGVsUHJvcGVydGllczoge1xuICAgICAgICAgICAgZXRhZzoge1xuICAgICAgICAgICAgICAgIHNlcmlhbGl6ZWROYW1lOiBcImV0YWdcIixcbiAgICAgICAgICAgICAgICB4bWxOYW1lOiBcImV0YWdcIixcbiAgICAgICAgICAgICAgICB0eXBlOiB7XG4gICAgICAgICAgICAgICAgICAgIG5hbWU6IFwiU3RyaW5nXCIsXG4gICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBsYXN0TW9kaWZpZWQ6IHtcbiAgICAgICAgICAgICAgICBzZXJpYWxpemVkTmFtZTogXCJsYXN0LW1vZGlmaWVkXCIsXG4gICAgICAgICAgICAgICAgeG1sTmFtZTogXCJsYXN0LW1vZGlmaWVkXCIsXG4gICAgICAgICAgICAgICAgdHlwZToge1xuICAgICAgICAgICAgICAgICAgICBuYW1lOiBcIkRhdGVUaW1lUmZjMTEyM1wiLFxuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgbGVhc2VJZDoge1xuICAgICAgICAgICAgICAgIHNlcmlhbGl6ZWROYW1lOiBcIngtbXMtbGVhc2UtaWRcIixcbiAgICAgICAgICAgICAgICB4bWxOYW1lOiBcIngtbXMtbGVhc2UtaWRcIixcbiAgICAgICAgICAgICAgICB0eXBlOiB7XG4gICAgICAgICAgICAgICAgICAgIG5hbWU6IFwiU3RyaW5nXCIsXG4gICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBjbGllbnRSZXF1ZXN0SWQ6IHtcbiAgICAgICAgICAgICAgICBzZXJpYWxpemVkTmFtZTogXCJ4LW1zLWNsaWVudC1yZXF1ZXN0LWlkXCIsXG4gICAgICAgICAgICAgICAgeG1sTmFtZTogXCJ4LW1zLWNsaWVudC1yZXF1ZXN0LWlkXCIsXG4gICAgICAgICAgICAgICAgdHlwZToge1xuICAgICAgICAgICAgICAgICAgICBuYW1lOiBcIlN0cmluZ1wiLFxuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgcmVxdWVzdElkOiB7XG4gICAgICAgICAgICAgICAgc2VyaWFsaXplZE5hbWU6IFwieC1tcy1yZXF1ZXN0LWlkXCIsXG4gICAgICAgICAgICAgICAgeG1sTmFtZTogXCJ4LW1zLXJlcXVlc3QtaWRcIixcbiAgICAgICAgICAgICAgICB0eXBlOiB7XG4gICAgICAgICAgICAgICAgICAgIG5hbWU6IFwiU3RyaW5nXCIsXG4gICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICB2ZXJzaW9uOiB7XG4gICAgICAgICAgICAgICAgc2VyaWFsaXplZE5hbWU6IFwieC1tcy12ZXJzaW9uXCIsXG4gICAgICAgICAgICAgICAgeG1sTmFtZTogXCJ4LW1zLXZlcnNpb25cIixcbiAgICAgICAgICAgICAgICB0eXBlOiB7XG4gICAgICAgICAgICAgICAgICAgIG5hbWU6IFwiU3RyaW5nXCIsXG4gICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBkYXRlOiB7XG4gICAgICAgICAgICAgICAgc2VyaWFsaXplZE5hbWU6IFwiZGF0ZVwiLFxuICAgICAgICAgICAgICAgIHhtbE5hbWU6IFwiZGF0ZVwiLFxuICAgICAgICAgICAgICAgIHR5cGU6IHtcbiAgICAgICAgICAgICAgICAgICAgbmFtZTogXCJEYXRlVGltZVJmYzExMjNcIixcbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgfSxcbiAgICAgICAgfSxcbiAgICB9LFxufTtcbmNvbnN0IENvbnRhaW5lckNoYW5nZUxlYXNlRXhjZXB0aW9uSGVhZGVycyA9IHtcbiAgICBzZXJpYWxpemVkTmFtZTogXCJDb250YWluZXJfY2hhbmdlTGVhc2VFeGNlcHRpb25IZWFkZXJzXCIsXG4gICAgdHlwZToge1xuICAgICAgICBuYW1lOiBcIkNvbXBvc2l0ZVwiLFxuICAgICAgICBjbGFzc05hbWU6IFwiQ29udGFpbmVyQ2hhbmdlTGVhc2VFeGNlcHRpb25IZWFkZXJzXCIsXG4gICAgICAgIG1vZGVsUHJvcGVydGllczoge1xuICAgICAgICAgICAgZXJyb3JDb2RlOiB7XG4gICAgICAgICAgICAgICAgc2VyaWFsaXplZE5hbWU6IFwieC1tcy1lcnJvci1jb2RlXCIsXG4gICAgICAgICAgICAgICAgeG1sTmFtZTogXCJ4LW1zLWVycm9yLWNvZGVcIixcbiAgICAgICAgICAgICAgICB0eXBlOiB7XG4gICAgICAgICAgICAgICAgICAgIG5hbWU6IFwiU3RyaW5nXCIsXG4gICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIH0sXG4gICAgICAgIH0sXG4gICAgfSxcbn07XG5jb25zdCBDb250YWluZXJMaXN0QmxvYkZsYXRTZWdtZW50SGVhZGVycyA9IHtcbiAgICBzZXJpYWxpemVkTmFtZTogXCJDb250YWluZXJfbGlzdEJsb2JGbGF0U2VnbWVudEhlYWRlcnNcIixcbiAgICB0eXBlOiB7XG4gICAgICAgIG5hbWU6IFwiQ29tcG9zaXRlXCIsXG4gICAgICAgIGNsYXNzTmFtZTogXCJDb250YWluZXJMaXN0QmxvYkZsYXRTZWdtZW50SGVhZGVyc1wiLFxuICAgICAgICBtb2RlbFByb3BlcnRpZXM6IHtcbiAgICAgICAgICAgIGNvbnRlbnRUeXBlOiB7XG4gICAgICAgICAgICAgICAgc2VyaWFsaXplZE5hbWU6IFwiY29udGVudC10eXBlXCIsXG4gICAgICAgICAgICAgICAgeG1sTmFtZTogXCJjb250ZW50LXR5cGVcIixcbiAgICAgICAgICAgICAgICB0eXBlOiB7XG4gICAgICAgICAgICAgICAgICAgIG5hbWU6IFwiU3RyaW5nXCIsXG4gICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBjbGllbnRSZXF1ZXN0SWQ6IHtcbiAgICAgICAgICAgICAgICBzZXJpYWxpemVkTmFtZTogXCJ4LW1zLWNsaWVudC1yZXF1ZXN0LWlkXCIsXG4gICAgICAgICAgICAgICAgeG1sTmFtZTogXCJ4LW1zLWNsaWVudC1yZXF1ZXN0LWlkXCIsXG4gICAgICAgICAgICAgICAgdHlwZToge1xuICAgICAgICAgICAgICAgICAgICBuYW1lOiBcIlN0cmluZ1wiLFxuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgcmVxdWVzdElkOiB7XG4gICAgICAgICAgICAgICAgc2VyaWFsaXplZE5hbWU6IFwieC1tcy1yZXF1ZXN0LWlkXCIsXG4gICAgICAgICAgICAgICAgeG1sTmFtZTogXCJ4LW1zLXJlcXVlc3QtaWRcIixcbiAgICAgICAgICAgICAgICB0eXBlOiB7XG4gICAgICAgICAgICAgICAgICAgIG5hbWU6IFwiU3RyaW5nXCIsXG4gICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICB2ZXJzaW9uOiB7XG4gICAgICAgICAgICAgICAgc2VyaWFsaXplZE5hbWU6IFwieC1tcy12ZXJzaW9uXCIsXG4gICAgICAgICAgICAgICAgeG1sTmFtZTogXCJ4LW1zLXZlcnNpb25cIixcbiAgICAgICAgICAgICAgICB0eXBlOiB7XG4gICAgICAgICAgICAgICAgICAgIG5hbWU6IFwiU3RyaW5nXCIsXG4gICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBkYXRlOiB7XG4gICAgICAgICAgICAgICAgc2VyaWFsaXplZE5hbWU6IFwiZGF0ZVwiLFxuICAgICAgICAgICAgICAgIHhtbE5hbWU6IFwiZGF0ZVwiLFxuICAgICAgICAgICAgICAgIHR5cGU6IHtcbiAgICAgICAgICAgICAgICAgICAgbmFtZTogXCJEYXRlVGltZVJmYzExMjNcIixcbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIGVycm9yQ29kZToge1xuICAgICAgICAgICAgICAgIHNlcmlhbGl6ZWROYW1lOiBcIngtbXMtZXJyb3ItY29kZVwiLFxuICAgICAgICAgICAgICAgIHhtbE5hbWU6IFwieC1tcy1lcnJvci1jb2RlXCIsXG4gICAgICAgICAgICAgICAgdHlwZToge1xuICAgICAgICAgICAgICAgICAgICBuYW1lOiBcIlN0cmluZ1wiLFxuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICB9LFxuICAgICAgICB9LFxuICAgIH0sXG59O1xuY29uc3QgQ29udGFpbmVyTGlzdEJsb2JGbGF0U2VnbWVudEV4Y2VwdGlvbkhlYWRlcnMgPSB7XG4gICAgc2VyaWFsaXplZE5hbWU6IFwiQ29udGFpbmVyX2xpc3RCbG9iRmxhdFNlZ21lbnRFeGNlcHRpb25IZWFkZXJzXCIsXG4gICAgdHlwZToge1xuICAgICAgICBuYW1lOiBcIkNvbXBvc2l0ZVwiLFxuICAgICAgICBjbGFzc05hbWU6IFwiQ29udGFpbmVyTGlzdEJsb2JGbGF0U2VnbWVudEV4Y2VwdGlvbkhlYWRlcnNcIixcbiAgICAgICAgbW9kZWxQcm9wZXJ0aWVzOiB7XG4gICAgICAgICAgICBlcnJvckNvZGU6IHtcbiAgICAgICAgICAgICAgICBzZXJpYWxpemVkTmFtZTogXCJ4LW1zLWVycm9yLWNvZGVcIixcbiAgICAgICAgICAgICAgICB4bWxOYW1lOiBcIngtbXMtZXJyb3ItY29kZVwiLFxuICAgICAgICAgICAgICAgIHR5cGU6IHtcbiAgICAgICAgICAgICAgICAgICAgbmFtZTogXCJTdHJpbmdcIixcbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgfSxcbiAgICAgICAgfSxcbiAgICB9LFxufTtcbmNvbnN0IENvbnRhaW5lckxpc3RCbG9iSGllcmFyY2h5U2VnbWVudEhlYWRlcnMgPSB7XG4gICAgc2VyaWFsaXplZE5hbWU6IFwiQ29udGFpbmVyX2xpc3RCbG9iSGllcmFyY2h5U2VnbWVudEhlYWRlcnNcIixcbiAgICB0eXBlOiB7XG4gICAgICAgIG5hbWU6IFwiQ29tcG9zaXRlXCIsXG4gICAgICAgIGNsYXNzTmFtZTogXCJDb250YWluZXJMaXN0QmxvYkhpZXJhcmNoeVNlZ21lbnRIZWFkZXJzXCIsXG4gICAgICAgIG1vZGVsUHJvcGVydGllczoge1xuICAgICAgICAgICAgY29udGVudFR5cGU6IHtcbiAgICAgICAgICAgICAgICBzZXJpYWxpemVkTmFtZTogXCJjb250ZW50LXR5cGVcIixcbiAgICAgICAgICAgICAgICB4bWxOYW1lOiBcImNvbnRlbnQtdHlwZVwiLFxuICAgICAgICAgICAgICAgIHR5cGU6IHtcbiAgICAgICAgICAgICAgICAgICAgbmFtZTogXCJTdHJpbmdcIixcbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIGNsaWVudFJlcXVlc3RJZDoge1xuICAgICAgICAgICAgICAgIHNlcmlhbGl6ZWROYW1lOiBcIngtbXMtY2xpZW50LXJlcXVlc3QtaWRcIixcbiAgICAgICAgICAgICAgICB4bWxOYW1lOiBcIngtbXMtY2xpZW50LXJlcXVlc3QtaWRcIixcbiAgICAgICAgICAgICAgICB0eXBlOiB7XG4gICAgICAgICAgICAgICAgICAgIG5hbWU6IFwiU3RyaW5nXCIsXG4gICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICByZXF1ZXN0SWQ6IHtcbiAgICAgICAgICAgICAgICBzZXJpYWxpemVkTmFtZTogXCJ4LW1zLXJlcXVlc3QtaWRcIixcbiAgICAgICAgICAgICAgICB4bWxOYW1lOiBcIngtbXMtcmVxdWVzdC1pZFwiLFxuICAgICAgICAgICAgICAgIHR5cGU6IHtcbiAgICAgICAgICAgICAgICAgICAgbmFtZTogXCJTdHJpbmdcIixcbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIHZlcnNpb246IHtcbiAgICAgICAgICAgICAgICBzZXJpYWxpemVkTmFtZTogXCJ4LW1zLXZlcnNpb25cIixcbiAgICAgICAgICAgICAgICB4bWxOYW1lOiBcIngtbXMtdmVyc2lvblwiLFxuICAgICAgICAgICAgICAgIHR5cGU6IHtcbiAgICAgICAgICAgICAgICAgICAgbmFtZTogXCJTdHJpbmdcIixcbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIGRhdGU6IHtcbiAgICAgICAgICAgICAgICBzZXJpYWxpemVkTmFtZTogXCJkYXRlXCIsXG4gICAgICAgICAgICAgICAgeG1sTmFtZTogXCJkYXRlXCIsXG4gICAgICAgICAgICAgICAgdHlwZToge1xuICAgICAgICAgICAgICAgICAgICBuYW1lOiBcIkRhdGVUaW1lUmZjMTEyM1wiLFxuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgZXJyb3JDb2RlOiB7XG4gICAgICAgICAgICAgICAgc2VyaWFsaXplZE5hbWU6IFwieC1tcy1lcnJvci1jb2RlXCIsXG4gICAgICAgICAgICAgICAgeG1sTmFtZTogXCJ4LW1zLWVycm9yLWNvZGVcIixcbiAgICAgICAgICAgICAgICB0eXBlOiB7XG4gICAgICAgICAgICAgICAgICAgIG5hbWU6IFwiU3RyaW5nXCIsXG4gICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIH0sXG4gICAgICAgIH0sXG4gICAgfSxcbn07XG5jb25zdCBDb250YWluZXJMaXN0QmxvYkhpZXJhcmNoeVNlZ21lbnRFeGNlcHRpb25IZWFkZXJzID0ge1xuICAgIHNlcmlhbGl6ZWROYW1lOiBcIkNvbnRhaW5lcl9saXN0QmxvYkhpZXJhcmNoeVNlZ21lbnRFeGNlcHRpb25IZWFkZXJzXCIsXG4gICAgdHlwZToge1xuICAgICAgICBuYW1lOiBcIkNvbXBvc2l0ZVwiLFxuICAgICAgICBjbGFzc05hbWU6IFwiQ29udGFpbmVyTGlzdEJsb2JIaWVyYXJjaHlTZWdtZW50RXhjZXB0aW9uSGVhZGVyc1wiLFxuICAgICAgICBtb2RlbFByb3BlcnRpZXM6IHtcbiAgICAgICAgICAgIGVycm9yQ29kZToge1xuICAgICAgICAgICAgICAgIHNlcmlhbGl6ZWROYW1lOiBcIngtbXMtZXJyb3ItY29kZVwiLFxuICAgICAgICAgICAgICAgIHhtbE5hbWU6IFwieC1tcy1lcnJvci1jb2RlXCIsXG4gICAgICAgICAgICAgICAgdHlwZToge1xuICAgICAgICAgICAgICAgICAgICBuYW1lOiBcIlN0cmluZ1wiLFxuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICB9LFxuICAgICAgICB9LFxuICAgIH0sXG59O1xuY29uc3QgQ29udGFpbmVyR2V0QWNjb3VudEluZm9IZWFkZXJzID0ge1xuICAgIHNlcmlhbGl6ZWROYW1lOiBcIkNvbnRhaW5lcl9nZXRBY2NvdW50SW5mb0hlYWRlcnNcIixcbiAgICB0eXBlOiB7XG4gICAgICAgIG5hbWU6IFwiQ29tcG9zaXRlXCIsXG4gICAgICAgIGNsYXNzTmFtZTogXCJDb250YWluZXJHZXRBY2NvdW50SW5mb0hlYWRlcnNcIixcbiAgICAgICAgbW9kZWxQcm9wZXJ0aWVzOiB7XG4gICAgICAgICAgICBjbGllbnRSZXF1ZXN0SWQ6IHtcbiAgICAgICAgICAgICAgICBzZXJpYWxpemVkTmFtZTogXCJ4LW1zLWNsaWVudC1yZXF1ZXN0LWlkXCIsXG4gICAgICAgICAgICAgICAgeG1sTmFtZTogXCJ4LW1zLWNsaWVudC1yZXF1ZXN0LWlkXCIsXG4gICAgICAgICAgICAgICAgdHlwZToge1xuICAgICAgICAgICAgICAgICAgICBuYW1lOiBcIlN0cmluZ1wiLFxuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgcmVxdWVzdElkOiB7XG4gICAgICAgICAgICAgICAgc2VyaWFsaXplZE5hbWU6IFwieC1tcy1yZXF1ZXN0LWlkXCIsXG4gICAgICAgICAgICAgICAgeG1sTmFtZTogXCJ4LW1zLXJlcXVlc3QtaWRcIixcbiAgICAgICAgICAgICAgICB0eXBlOiB7XG4gICAgICAgICAgICAgICAgICAgIG5hbWU6IFwiU3RyaW5nXCIsXG4gICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICB2ZXJzaW9uOiB7XG4gICAgICAgICAgICAgICAgc2VyaWFsaXplZE5hbWU6IFwieC1tcy12ZXJzaW9uXCIsXG4gICAgICAgICAgICAgICAgeG1sTmFtZTogXCJ4LW1zLXZlcnNpb25cIixcbiAgICAgICAgICAgICAgICB0eXBlOiB7XG4gICAgICAgICAgICAgICAgICAgIG5hbWU6IFwiU3RyaW5nXCIsXG4gICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBkYXRlOiB7XG4gICAgICAgICAgICAgICAgc2VyaWFsaXplZE5hbWU6IFwiZGF0ZVwiLFxuICAgICAgICAgICAgICAgIHhtbE5hbWU6IFwiZGF0ZVwiLFxuICAgICAgICAgICAgICAgIHR5cGU6IHtcbiAgICAgICAgICAgICAgICAgICAgbmFtZTogXCJEYXRlVGltZVJmYzExMjNcIixcbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIHNrdU5hbWU6IHtcbiAgICAgICAgICAgICAgICBzZXJpYWxpemVkTmFtZTogXCJ4LW1zLXNrdS1uYW1lXCIsXG4gICAgICAgICAgICAgICAgeG1sTmFtZTogXCJ4LW1zLXNrdS1uYW1lXCIsXG4gICAgICAgICAgICAgICAgdHlwZToge1xuICAgICAgICAgICAgICAgICAgICBuYW1lOiBcIkVudW1cIixcbiAgICAgICAgICAgICAgICAgICAgYWxsb3dlZFZhbHVlczogW1xuICAgICAgICAgICAgICAgICAgICAgICAgXCJTdGFuZGFyZF9MUlNcIixcbiAgICAgICAgICAgICAgICAgICAgICAgIFwiU3RhbmRhcmRfR1JTXCIsXG4gICAgICAgICAgICAgICAgICAgICAgICBcIlN0YW5kYXJkX1JBR1JTXCIsXG4gICAgICAgICAgICAgICAgICAgICAgICBcIlN0YW5kYXJkX1pSU1wiLFxuICAgICAgICAgICAgICAgICAgICAgICAgXCJQcmVtaXVtX0xSU1wiLFxuICAgICAgICAgICAgICAgICAgICBdLFxuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgYWNjb3VudEtpbmQ6IHtcbiAgICAgICAgICAgICAgICBzZXJpYWxpemVkTmFtZTogXCJ4LW1zLWFjY291bnQta2luZFwiLFxuICAgICAgICAgICAgICAgIHhtbE5hbWU6IFwieC1tcy1hY2NvdW50LWtpbmRcIixcbiAgICAgICAgICAgICAgICB0eXBlOiB7XG4gICAgICAgICAgICAgICAgICAgIG5hbWU6IFwiRW51bVwiLFxuICAgICAgICAgICAgICAgICAgICBhbGxvd2VkVmFsdWVzOiBbXG4gICAgICAgICAgICAgICAgICAgICAgICBcIlN0b3JhZ2VcIixcbiAgICAgICAgICAgICAgICAgICAgICAgIFwiQmxvYlN0b3JhZ2VcIixcbiAgICAgICAgICAgICAgICAgICAgICAgIFwiU3RvcmFnZVYyXCIsXG4gICAgICAgICAgICAgICAgICAgICAgICBcIkZpbGVTdG9yYWdlXCIsXG4gICAgICAgICAgICAgICAgICAgICAgICBcIkJsb2NrQmxvYlN0b3JhZ2VcIixcbiAgICAgICAgICAgICAgICAgICAgXSxcbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIGlzSGllcmFyY2hpY2FsTmFtZXNwYWNlRW5hYmxlZDoge1xuICAgICAgICAgICAgICAgIHNlcmlhbGl6ZWROYW1lOiBcIngtbXMtaXMtaG5zLWVuYWJsZWRcIixcbiAgICAgICAgICAgICAgICB4bWxOYW1lOiBcIngtbXMtaXMtaG5zLWVuYWJsZWRcIixcbiAgICAgICAgICAgICAgICB0eXBlOiB7XG4gICAgICAgICAgICAgICAgICAgIG5hbWU6IFwiQm9vbGVhblwiLFxuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICB9LFxuICAgICAgICB9LFxuICAgIH0sXG59O1xuY29uc3QgQ29udGFpbmVyR2V0QWNjb3VudEluZm9FeGNlcHRpb25IZWFkZXJzID0ge1xuICAgIHNlcmlhbGl6ZWROYW1lOiBcIkNvbnRhaW5lcl9nZXRBY2NvdW50SW5mb0V4Y2VwdGlvbkhlYWRlcnNcIixcbiAgICB0eXBlOiB7XG4gICAgICAgIG5hbWU6IFwiQ29tcG9zaXRlXCIsXG4gICAgICAgIGNsYXNzTmFtZTogXCJDb250YWluZXJHZXRBY2NvdW50SW5mb0V4Y2VwdGlvbkhlYWRlcnNcIixcbiAgICAgICAgbW9kZWxQcm9wZXJ0aWVzOiB7XG4gICAgICAgICAgICBlcnJvckNvZGU6IHtcbiAgICAgICAgICAgICAgICBzZXJpYWxpemVkTmFtZTogXCJ4LW1zLWVycm9yLWNvZGVcIixcbiAgICAgICAgICAgICAgICB4bWxOYW1lOiBcIngtbXMtZXJyb3ItY29kZVwiLFxuICAgICAgICAgICAgICAgIHR5cGU6IHtcbiAgICAgICAgICAgICAgICAgICAgbmFtZTogXCJTdHJpbmdcIixcbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgfSxcbiAgICAgICAgfSxcbiAgICB9LFxufTtcbmNvbnN0IEJsb2JEb3dubG9hZEhlYWRlcnMgPSB7XG4gICAgc2VyaWFsaXplZE5hbWU6IFwiQmxvYl9kb3dubG9hZEhlYWRlcnNcIixcbiAgICB0eXBlOiB7XG4gICAgICAgIG5hbWU6IFwiQ29tcG9zaXRlXCIsXG4gICAgICAgIGNsYXNzTmFtZTogXCJCbG9iRG93bmxvYWRIZWFkZXJzXCIsXG4gICAgICAgIG1vZGVsUHJvcGVydGllczoge1xuICAgICAgICAgICAgbGFzdE1vZGlmaWVkOiB7XG4gICAgICAgICAgICAgICAgc2VyaWFsaXplZE5hbWU6IFwibGFzdC1tb2RpZmllZFwiLFxuICAgICAgICAgICAgICAgIHhtbE5hbWU6IFwibGFzdC1tb2RpZmllZFwiLFxuICAgICAgICAgICAgICAgIHR5cGU6IHtcbiAgICAgICAgICAgICAgICAgICAgbmFtZTogXCJEYXRlVGltZVJmYzExMjNcIixcbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIGNyZWF0ZWRPbjoge1xuICAgICAgICAgICAgICAgIHNlcmlhbGl6ZWROYW1lOiBcIngtbXMtY3JlYXRpb24tdGltZVwiLFxuICAgICAgICAgICAgICAgIHhtbE5hbWU6IFwieC1tcy1jcmVhdGlvbi10aW1lXCIsXG4gICAgICAgICAgICAgICAgdHlwZToge1xuICAgICAgICAgICAgICAgICAgICBuYW1lOiBcIkRhdGVUaW1lUmZjMTEyM1wiLFxuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgbWV0YWRhdGE6IHtcbiAgICAgICAgICAgICAgICBzZXJpYWxpemVkTmFtZTogXCJ4LW1zLW1ldGFcIixcbiAgICAgICAgICAgICAgICBoZWFkZXJDb2xsZWN0aW9uUHJlZml4OiBcIngtbXMtbWV0YS1cIixcbiAgICAgICAgICAgICAgICB4bWxOYW1lOiBcIngtbXMtbWV0YVwiLFxuICAgICAgICAgICAgICAgIHR5cGU6IHtcbiAgICAgICAgICAgICAgICAgICAgbmFtZTogXCJEaWN0aW9uYXJ5XCIsXG4gICAgICAgICAgICAgICAgICAgIHZhbHVlOiB7IHR5cGU6IHsgbmFtZTogXCJTdHJpbmdcIiB9IH0sXG4gICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBvYmplY3RSZXBsaWNhdGlvblBvbGljeUlkOiB7XG4gICAgICAgICAgICAgICAgc2VyaWFsaXplZE5hbWU6IFwieC1tcy1vci1wb2xpY3ktaWRcIixcbiAgICAgICAgICAgICAgICB4bWxOYW1lOiBcIngtbXMtb3ItcG9saWN5LWlkXCIsXG4gICAgICAgICAgICAgICAgdHlwZToge1xuICAgICAgICAgICAgICAgICAgICBuYW1lOiBcIlN0cmluZ1wiLFxuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgb2JqZWN0UmVwbGljYXRpb25SdWxlczoge1xuICAgICAgICAgICAgICAgIHNlcmlhbGl6ZWROYW1lOiBcIngtbXMtb3JcIixcbiAgICAgICAgICAgICAgICBoZWFkZXJDb2xsZWN0aW9uUHJlZml4OiBcIngtbXMtb3ItXCIsXG4gICAgICAgICAgICAgICAgeG1sTmFtZTogXCJ4LW1zLW9yXCIsXG4gICAgICAgICAgICAgICAgdHlwZToge1xuICAgICAgICAgICAgICAgICAgICBuYW1lOiBcIkRpY3Rpb25hcnlcIixcbiAgICAgICAgICAgICAgICAgICAgdmFsdWU6IHsgdHlwZTogeyBuYW1lOiBcIlN0cmluZ1wiIH0gfSxcbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIGNvbnRlbnRMZW5ndGg6IHtcbiAgICAgICAgICAgICAgICBzZXJpYWxpemVkTmFtZTogXCJjb250ZW50LWxlbmd0aFwiLFxuICAgICAgICAgICAgICAgIHhtbE5hbWU6IFwiY29udGVudC1sZW5ndGhcIixcbiAgICAgICAgICAgICAgICB0eXBlOiB7XG4gICAgICAgICAgICAgICAgICAgIG5hbWU6IFwiTnVtYmVyXCIsXG4gICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBjb250ZW50VHlwZToge1xuICAgICAgICAgICAgICAgIHNlcmlhbGl6ZWROYW1lOiBcImNvbnRlbnQtdHlwZVwiLFxuICAgICAgICAgICAgICAgIHhtbE5hbWU6IFwiY29udGVudC10eXBlXCIsXG4gICAgICAgICAgICAgICAgdHlwZToge1xuICAgICAgICAgICAgICAgICAgICBuYW1lOiBcIlN0cmluZ1wiLFxuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgY29udGVudFJhbmdlOiB7XG4gICAgICAgICAgICAgICAgc2VyaWFsaXplZE5hbWU6IFwiY29udGVudC1yYW5nZVwiLFxuICAgICAgICAgICAgICAgIHhtbE5hbWU6IFwiY29udGVudC1yYW5nZVwiLFxuICAgICAgICAgICAgICAgIHR5cGU6IHtcbiAgICAgICAgICAgICAgICAgICAgbmFtZTogXCJTdHJpbmdcIixcbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIGV0YWc6IHtcbiAgICAgICAgICAgICAgICBzZXJpYWxpemVkTmFtZTogXCJldGFnXCIsXG4gICAgICAgICAgICAgICAgeG1sTmFtZTogXCJldGFnXCIsXG4gICAgICAgICAgICAgICAgdHlwZToge1xuICAgICAgICAgICAgICAgICAgICBuYW1lOiBcIlN0cmluZ1wiLFxuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgY29udGVudE1ENToge1xuICAgICAgICAgICAgICAgIHNlcmlhbGl6ZWROYW1lOiBcImNvbnRlbnQtbWQ1XCIsXG4gICAgICAgICAgICAgICAgeG1sTmFtZTogXCJjb250ZW50LW1kNVwiLFxuICAgICAgICAgICAgICAgIHR5cGU6IHtcbiAgICAgICAgICAgICAgICAgICAgbmFtZTogXCJCeXRlQXJyYXlcIixcbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIGNvbnRlbnRFbmNvZGluZzoge1xuICAgICAgICAgICAgICAgIHNlcmlhbGl6ZWROYW1lOiBcImNvbnRlbnQtZW5jb2RpbmdcIixcbiAgICAgICAgICAgICAgICB4bWxOYW1lOiBcImNvbnRlbnQtZW5jb2RpbmdcIixcbiAgICAgICAgICAgICAgICB0eXBlOiB7XG4gICAgICAgICAgICAgICAgICAgIG5hbWU6IFwiU3RyaW5nXCIsXG4gICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBjYWNoZUNvbnRyb2w6IHtcbiAgICAgICAgICAgICAgICBzZXJpYWxpemVkTmFtZTogXCJjYWNoZS1jb250cm9sXCIsXG4gICAgICAgICAgICAgICAgeG1sTmFtZTogXCJjYWNoZS1jb250cm9sXCIsXG4gICAgICAgICAgICAgICAgdHlwZToge1xuICAgICAgICAgICAgICAgICAgICBuYW1lOiBcIlN0cmluZ1wiLFxuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgY29udGVudERpc3Bvc2l0aW9uOiB7XG4gICAgICAgICAgICAgICAgc2VyaWFsaXplZE5hbWU6IFwiY29udGVudC1kaXNwb3NpdGlvblwiLFxuICAgICAgICAgICAgICAgIHhtbE5hbWU6IFwiY29udGVudC1kaXNwb3NpdGlvblwiLFxuICAgICAgICAgICAgICAgIHR5cGU6IHtcbiAgICAgICAgICAgICAgICAgICAgbmFtZTogXCJTdHJpbmdcIixcbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIGNvbnRlbnRMYW5ndWFnZToge1xuICAgICAgICAgICAgICAgIHNlcmlhbGl6ZWROYW1lOiBcImNvbnRlbnQtbGFuZ3VhZ2VcIixcbiAgICAgICAgICAgICAgICB4bWxOYW1lOiBcImNvbnRlbnQtbGFuZ3VhZ2VcIixcbiAgICAgICAgICAgICAgICB0eXBlOiB7XG4gICAgICAgICAgICAgICAgICAgIG5hbWU6IFwiU3RyaW5nXCIsXG4gICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBibG9iU2VxdWVuY2VOdW1iZXI6IHtcbiAgICAgICAgICAgICAgICBzZXJpYWxpemVkTmFtZTogXCJ4LW1zLWJsb2Itc2VxdWVuY2UtbnVtYmVyXCIsXG4gICAgICAgICAgICAgICAgeG1sTmFtZTogXCJ4LW1zLWJsb2Itc2VxdWVuY2UtbnVtYmVyXCIsXG4gICAgICAgICAgICAgICAgdHlwZToge1xuICAgICAgICAgICAgICAgICAgICBuYW1lOiBcIk51bWJlclwiLFxuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgYmxvYlR5cGU6IHtcbiAgICAgICAgICAgICAgICBzZXJpYWxpemVkTmFtZTogXCJ4LW1zLWJsb2ItdHlwZVwiLFxuICAgICAgICAgICAgICAgIHhtbE5hbWU6IFwieC1tcy1ibG9iLXR5cGVcIixcbiAgICAgICAgICAgICAgICB0eXBlOiB7XG4gICAgICAgICAgICAgICAgICAgIG5hbWU6IFwiRW51bVwiLFxuICAgICAgICAgICAgICAgICAgICBhbGxvd2VkVmFsdWVzOiBbXCJCbG9ja0Jsb2JcIiwgXCJQYWdlQmxvYlwiLCBcIkFwcGVuZEJsb2JcIl0sXG4gICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBjb3B5Q29tcGxldGVkT246IHtcbiAgICAgICAgICAgICAgICBzZXJpYWxpemVkTmFtZTogXCJ4LW1zLWNvcHktY29tcGxldGlvbi10aW1lXCIsXG4gICAgICAgICAgICAgICAgeG1sTmFtZTogXCJ4LW1zLWNvcHktY29tcGxldGlvbi10aW1lXCIsXG4gICAgICAgICAgICAgICAgdHlwZToge1xuICAgICAgICAgICAgICAgICAgICBuYW1lOiBcIkRhdGVUaW1lUmZjMTEyM1wiLFxuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgY29weVN0YXR1c0Rlc2NyaXB0aW9uOiB7XG4gICAgICAgICAgICAgICAgc2VyaWFsaXplZE5hbWU6IFwieC1tcy1jb3B5LXN0YXR1cy1kZXNjcmlwdGlvblwiLFxuICAgICAgICAgICAgICAgIHhtbE5hbWU6IFwieC1tcy1jb3B5LXN0YXR1cy1kZXNjcmlwdGlvblwiLFxuICAgICAgICAgICAgICAgIHR5cGU6IHtcbiAgICAgICAgICAgICAgICAgICAgbmFtZTogXCJTdHJpbmdcIixcbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIGNvcHlJZDoge1xuICAgICAgICAgICAgICAgIHNlcmlhbGl6ZWROYW1lOiBcIngtbXMtY29weS1pZFwiLFxuICAgICAgICAgICAgICAgIHhtbE5hbWU6IFwieC1tcy1jb3B5LWlkXCIsXG4gICAgICAgICAgICAgICAgdHlwZToge1xuICAgICAgICAgICAgICAgICAgICBuYW1lOiBcIlN0cmluZ1wiLFxuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgY29weVByb2dyZXNzOiB7XG4gICAgICAgICAgICAgICAgc2VyaWFsaXplZE5hbWU6IFwieC1tcy1jb3B5LXByb2dyZXNzXCIsXG4gICAgICAgICAgICAgICAgeG1sTmFtZTogXCJ4LW1zLWNvcHktcHJvZ3Jlc3NcIixcbiAgICAgICAgICAgICAgICB0eXBlOiB7XG4gICAgICAgICAgICAgICAgICAgIG5hbWU6IFwiU3RyaW5nXCIsXG4gICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBjb3B5U291cmNlOiB7XG4gICAgICAgICAgICAgICAgc2VyaWFsaXplZE5hbWU6IFwieC1tcy1jb3B5LXNvdXJjZVwiLFxuICAgICAgICAgICAgICAgIHhtbE5hbWU6IFwieC1tcy1jb3B5LXNvdXJjZVwiLFxuICAgICAgICAgICAgICAgIHR5cGU6IHtcbiAgICAgICAgICAgICAgICAgICAgbmFtZTogXCJTdHJpbmdcIixcbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIGNvcHlTdGF0dXM6IHtcbiAgICAgICAgICAgICAgICBzZXJpYWxpemVkTmFtZTogXCJ4LW1zLWNvcHktc3RhdHVzXCIsXG4gICAgICAgICAgICAgICAgeG1sTmFtZTogXCJ4LW1zLWNvcHktc3RhdHVzXCIsXG4gICAgICAgICAgICAgICAgdHlwZToge1xuICAgICAgICAgICAgICAgICAgICBuYW1lOiBcIkVudW1cIixcbiAgICAgICAgICAgICAgICAgICAgYWxsb3dlZFZhbHVlczogW1wicGVuZGluZ1wiLCBcInN1Y2Nlc3NcIiwgXCJhYm9ydGVkXCIsIFwiZmFpbGVkXCJdLFxuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgbGVhc2VEdXJhdGlvbjoge1xuICAgICAgICAgICAgICAgIHNlcmlhbGl6ZWROYW1lOiBcIngtbXMtbGVhc2UtZHVyYXRpb25cIixcbiAgICAgICAgICAgICAgICB4bWxOYW1lOiBcIngtbXMtbGVhc2UtZHVyYXRpb25cIixcbiAgICAgICAgICAgICAgICB0eXBlOiB7XG4gICAgICAgICAgICAgICAgICAgIG5hbWU6IFwiRW51bVwiLFxuICAgICAgICAgICAgICAgICAgICBhbGxvd2VkVmFsdWVzOiBbXCJpbmZpbml0ZVwiLCBcImZpeGVkXCJdLFxuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgbGVhc2VTdGF0ZToge1xuICAgICAgICAgICAgICAgIHNlcmlhbGl6ZWROYW1lOiBcIngtbXMtbGVhc2Utc3RhdGVcIixcbiAgICAgICAgICAgICAgICB4bWxOYW1lOiBcIngtbXMtbGVhc2Utc3RhdGVcIixcbiAgICAgICAgICAgICAgICB0eXBlOiB7XG4gICAgICAgICAgICAgICAgICAgIG5hbWU6IFwiRW51bVwiLFxuICAgICAgICAgICAgICAgICAgICBhbGxvd2VkVmFsdWVzOiBbXG4gICAgICAgICAgICAgICAgICAgICAgICBcImF2YWlsYWJsZVwiLFxuICAgICAgICAgICAgICAgICAgICAgICAgXCJsZWFzZWRcIixcbiAgICAgICAgICAgICAgICAgICAgICAgIFwiZXhwaXJlZFwiLFxuICAgICAgICAgICAgICAgICAgICAgICAgXCJicmVha2luZ1wiLFxuICAgICAgICAgICAgICAgICAgICAgICAgXCJicm9rZW5cIixcbiAgICAgICAgICAgICAgICAgICAgXSxcbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIGxlYXNlU3RhdHVzOiB7XG4gICAgICAgICAgICAgICAgc2VyaWFsaXplZE5hbWU6IFwieC1tcy1sZWFzZS1zdGF0dXNcIixcbiAgICAgICAgICAgICAgICB4bWxOYW1lOiBcIngtbXMtbGVhc2Utc3RhdHVzXCIsXG4gICAgICAgICAgICAgICAgdHlwZToge1xuICAgICAgICAgICAgICAgICAgICBuYW1lOiBcIkVudW1cIixcbiAgICAgICAgICAgICAgICAgICAgYWxsb3dlZFZhbHVlczogW1wibG9ja2VkXCIsIFwidW5sb2NrZWRcIl0sXG4gICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBjbGllbnRSZXF1ZXN0SWQ6IHtcbiAgICAgICAgICAgICAgICBzZXJpYWxpemVkTmFtZTogXCJ4LW1zLWNsaWVudC1yZXF1ZXN0LWlkXCIsXG4gICAgICAgICAgICAgICAgeG1sTmFtZTogXCJ4LW1zLWNsaWVudC1yZXF1ZXN0LWlkXCIsXG4gICAgICAgICAgICAgICAgdHlwZToge1xuICAgICAgICAgICAgICAgICAgICBuYW1lOiBcIlN0cmluZ1wiLFxuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgcmVxdWVzdElkOiB7XG4gICAgICAgICAgICAgICAgc2VyaWFsaXplZE5hbWU6IFwieC1tcy1yZXF1ZXN0LWlkXCIsXG4gICAgICAgICAgICAgICAgeG1sTmFtZTogXCJ4LW1zLXJlcXVlc3QtaWRcIixcbiAgICAgICAgICAgICAgICB0eXBlOiB7XG4gICAgICAgICAgICAgICAgICAgIG5hbWU6IFwiU3RyaW5nXCIsXG4gICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICB2ZXJzaW9uOiB7XG4gICAgICAgICAgICAgICAgc2VyaWFsaXplZE5hbWU6IFwieC1tcy12ZXJzaW9uXCIsXG4gICAgICAgICAgICAgICAgeG1sTmFtZTogXCJ4LW1zLXZlcnNpb25cIixcbiAgICAgICAgICAgICAgICB0eXBlOiB7XG4gICAgICAgICAgICAgICAgICAgIG5hbWU6IFwiU3RyaW5nXCIsXG4gICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICB2ZXJzaW9uSWQ6IHtcbiAgICAgICAgICAgICAgICBzZXJpYWxpemVkTmFtZTogXCJ4LW1zLXZlcnNpb24taWRcIixcbiAgICAgICAgICAgICAgICB4bWxOYW1lOiBcIngtbXMtdmVyc2lvbi1pZFwiLFxuICAgICAgICAgICAgICAgIHR5cGU6IHtcbiAgICAgICAgICAgICAgICAgICAgbmFtZTogXCJTdHJpbmdcIixcbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIGlzQ3VycmVudFZlcnNpb246IHtcbiAgICAgICAgICAgICAgICBzZXJpYWxpemVkTmFtZTogXCJ4LW1zLWlzLWN1cnJlbnQtdmVyc2lvblwiLFxuICAgICAgICAgICAgICAgIHhtbE5hbWU6IFwieC1tcy1pcy1jdXJyZW50LXZlcnNpb25cIixcbiAgICAgICAgICAgICAgICB0eXBlOiB7XG4gICAgICAgICAgICAgICAgICAgIG5hbWU6IFwiQm9vbGVhblwiLFxuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgYWNjZXB0UmFuZ2VzOiB7XG4gICAgICAgICAgICAgICAgc2VyaWFsaXplZE5hbWU6IFwiYWNjZXB0LXJhbmdlc1wiLFxuICAgICAgICAgICAgICAgIHhtbE5hbWU6IFwiYWNjZXB0LXJhbmdlc1wiLFxuICAgICAgICAgICAgICAgIHR5cGU6IHtcbiAgICAgICAgICAgICAgICAgICAgbmFtZTogXCJTdHJpbmdcIixcbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIGRhdGU6IHtcbiAgICAgICAgICAgICAgICBzZXJpYWxpemVkTmFtZTogXCJkYXRlXCIsXG4gICAgICAgICAgICAgICAgeG1sTmFtZTogXCJkYXRlXCIsXG4gICAgICAgICAgICAgICAgdHlwZToge1xuICAgICAgICAgICAgICAgICAgICBuYW1lOiBcIkRhdGVUaW1lUmZjMTEyM1wiLFxuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgYmxvYkNvbW1pdHRlZEJsb2NrQ291bnQ6IHtcbiAgICAgICAgICAgICAgICBzZXJpYWxpemVkTmFtZTogXCJ4LW1zLWJsb2ItY29tbWl0dGVkLWJsb2NrLWNvdW50XCIsXG4gICAgICAgICAgICAgICAgeG1sTmFtZTogXCJ4LW1zLWJsb2ItY29tbWl0dGVkLWJsb2NrLWNvdW50XCIsXG4gICAgICAgICAgICAgICAgdHlwZToge1xuICAgICAgICAgICAgICAgICAgICBuYW1lOiBcIk51bWJlclwiLFxuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgaXNTZXJ2ZXJFbmNyeXB0ZWQ6IHtcbiAgICAgICAgICAgICAgICBzZXJpYWxpemVkTmFtZTogXCJ4LW1zLXNlcnZlci1lbmNyeXB0ZWRcIixcbiAgICAgICAgICAgICAgICB4bWxOYW1lOiBcIngtbXMtc2VydmVyLWVuY3J5cHRlZFwiLFxuICAgICAgICAgICAgICAgIHR5cGU6IHtcbiAgICAgICAgICAgICAgICAgICAgbmFtZTogXCJCb29sZWFuXCIsXG4gICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBlbmNyeXB0aW9uS2V5U2hhMjU2OiB7XG4gICAgICAgICAgICAgICAgc2VyaWFsaXplZE5hbWU6IFwieC1tcy1lbmNyeXB0aW9uLWtleS1zaGEyNTZcIixcbiAgICAgICAgICAgICAgICB4bWxOYW1lOiBcIngtbXMtZW5jcnlwdGlvbi1rZXktc2hhMjU2XCIsXG4gICAgICAgICAgICAgICAgdHlwZToge1xuICAgICAgICAgICAgICAgICAgICBuYW1lOiBcIlN0cmluZ1wiLFxuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgZW5jcnlwdGlvblNjb3BlOiB7XG4gICAgICAgICAgICAgICAgc2VyaWFsaXplZE5hbWU6IFwieC1tcy1lbmNyeXB0aW9uLXNjb3BlXCIsXG4gICAgICAgICAgICAgICAgeG1sTmFtZTogXCJ4LW1zLWVuY3J5cHRpb24tc2NvcGVcIixcbiAgICAgICAgICAgICAgICB0eXBlOiB7XG4gICAgICAgICAgICAgICAgICAgIG5hbWU6IFwiU3RyaW5nXCIsXG4gICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBibG9iQ29udGVudE1ENToge1xuICAgICAgICAgICAgICAgIHNlcmlhbGl6ZWROYW1lOiBcIngtbXMtYmxvYi1jb250ZW50LW1kNVwiLFxuICAgICAgICAgICAgICAgIHhtbE5hbWU6IFwieC1tcy1ibG9iLWNvbnRlbnQtbWQ1XCIsXG4gICAgICAgICAgICAgICAgdHlwZToge1xuICAgICAgICAgICAgICAgICAgICBuYW1lOiBcIkJ5dGVBcnJheVwiLFxuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgdGFnQ291bnQ6IHtcbiAgICAgICAgICAgICAgICBzZXJpYWxpemVkTmFtZTogXCJ4LW1zLXRhZy1jb3VudFwiLFxuICAgICAgICAgICAgICAgIHhtbE5hbWU6IFwieC1tcy10YWctY291bnRcIixcbiAgICAgICAgICAgICAgICB0eXBlOiB7XG4gICAgICAgICAgICAgICAgICAgIG5hbWU6IFwiTnVtYmVyXCIsXG4gICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBpc1NlYWxlZDoge1xuICAgICAgICAgICAgICAgIHNlcmlhbGl6ZWROYW1lOiBcIngtbXMtYmxvYi1zZWFsZWRcIixcbiAgICAgICAgICAgICAgICB4bWxOYW1lOiBcIngtbXMtYmxvYi1zZWFsZWRcIixcbiAgICAgICAgICAgICAgICB0eXBlOiB7XG4gICAgICAgICAgICAgICAgICAgIG5hbWU6IFwiQm9vbGVhblwiLFxuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgbGFzdEFjY2Vzc2VkOiB7XG4gICAgICAgICAgICAgICAgc2VyaWFsaXplZE5hbWU6IFwieC1tcy1sYXN0LWFjY2Vzcy10aW1lXCIsXG4gICAgICAgICAgICAgICAgeG1sTmFtZTogXCJ4LW1zLWxhc3QtYWNjZXNzLXRpbWVcIixcbiAgICAgICAgICAgICAgICB0eXBlOiB7XG4gICAgICAgICAgICAgICAgICAgIG5hbWU6IFwiRGF0ZVRpbWVSZmMxMTIzXCIsXG4gICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBpbW11dGFiaWxpdHlQb2xpY3lFeHBpcmVzT246IHtcbiAgICAgICAgICAgICAgICBzZXJpYWxpemVkTmFtZTogXCJ4LW1zLWltbXV0YWJpbGl0eS1wb2xpY3ktdW50aWwtZGF0ZVwiLFxuICAgICAgICAgICAgICAgIHhtbE5hbWU6IFwieC1tcy1pbW11dGFiaWxpdHktcG9saWN5LXVudGlsLWRhdGVcIixcbiAgICAgICAgICAgICAgICB0eXBlOiB7XG4gICAgICAgICAgICAgICAgICAgIG5hbWU6IFwiRGF0ZVRpbWVSZmMxMTIzXCIsXG4gICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBpbW11dGFiaWxpdHlQb2xpY3lNb2RlOiB7XG4gICAgICAgICAgICAgICAgc2VyaWFsaXplZE5hbWU6IFwieC1tcy1pbW11dGFiaWxpdHktcG9saWN5LW1vZGVcIixcbiAgICAgICAgICAgICAgICB4bWxOYW1lOiBcIngtbXMtaW1tdXRhYmlsaXR5LXBvbGljeS1tb2RlXCIsXG4gICAgICAgICAgICAgICAgdHlwZToge1xuICAgICAgICAgICAgICAgICAgICBuYW1lOiBcIkVudW1cIixcbiAgICAgICAgICAgICAgICAgICAgYWxsb3dlZFZhbHVlczogW1wiTXV0YWJsZVwiLCBcIlVubG9ja2VkXCIsIFwiTG9ja2VkXCJdLFxuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgbGVnYWxIb2xkOiB7XG4gICAgICAgICAgICAgICAgc2VyaWFsaXplZE5hbWU6IFwieC1tcy1sZWdhbC1ob2xkXCIsXG4gICAgICAgICAgICAgICAgeG1sTmFtZTogXCJ4LW1zLWxlZ2FsLWhvbGRcIixcbiAgICAgICAgICAgICAgICB0eXBlOiB7XG4gICAgICAgICAgICAgICAgICAgIG5hbWU6IFwiQm9vbGVhblwiLFxuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgZXJyb3JDb2RlOiB7XG4gICAgICAgICAgICAgICAgc2VyaWFsaXplZE5hbWU6IFwieC1tcy1lcnJvci1jb2RlXCIsXG4gICAgICAgICAgICAgICAgeG1sTmFtZTogXCJ4LW1zLWVycm9yLWNvZGVcIixcbiAgICAgICAgICAgICAgICB0eXBlOiB7XG4gICAgICAgICAgICAgICAgICAgIG5hbWU6IFwiU3RyaW5nXCIsXG4gICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBjb250ZW50Q3JjNjQ6IHtcbiAgICAgICAgICAgICAgICBzZXJpYWxpemVkTmFtZTogXCJ4LW1zLWNvbnRlbnQtY3JjNjRcIixcbiAgICAgICAgICAgICAgICB4bWxOYW1lOiBcIngtbXMtY29udGVudC1jcmM2NFwiLFxuICAgICAgICAgICAgICAgIHR5cGU6IHtcbiAgICAgICAgICAgICAgICAgICAgbmFtZTogXCJCeXRlQXJyYXlcIixcbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgfSxcbiAgICAgICAgfSxcbiAgICB9LFxufTtcbmNvbnN0IEJsb2JEb3dubG9hZEV4Y2VwdGlvbkhlYWRlcnMgPSB7XG4gICAgc2VyaWFsaXplZE5hbWU6IFwiQmxvYl9kb3dubG9hZEV4Y2VwdGlvbkhlYWRlcnNcIixcbiAgICB0eXBlOiB7XG4gICAgICAgIG5hbWU6IFwiQ29tcG9zaXRlXCIsXG4gICAgICAgIGNsYXNzTmFtZTogXCJCbG9iRG93bmxvYWRFeGNlcHRpb25IZWFkZXJzXCIsXG4gICAgICAgIG1vZGVsUHJvcGVydGllczoge1xuICAgICAgICAgICAgZXJyb3JDb2RlOiB7XG4gICAgICAgICAgICAgICAgc2VyaWFsaXplZE5hbWU6IFwieC1tcy1lcnJvci1jb2RlXCIsXG4gICAgICAgICAgICAgICAgeG1sTmFtZTogXCJ4LW1zLWVycm9yLWNvZGVcIixcbiAgICAgICAgICAgICAgICB0eXBlOiB7XG4gICAgICAgICAgICAgICAgICAgIG5hbWU6IFwiU3RyaW5nXCIsXG4gICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIH0sXG4gICAgICAgIH0sXG4gICAgfSxcbn07XG5jb25zdCBCbG9iR2V0UHJvcGVydGllc0hlYWRlcnMgPSB7XG4gICAgc2VyaWFsaXplZE5hbWU6IFwiQmxvYl9nZXRQcm9wZXJ0aWVzSGVhZGVyc1wiLFxuICAgIHR5cGU6IHtcbiAgICAgICAgbmFtZTogXCJDb21wb3NpdGVcIixcbiAgICAgICAgY2xhc3NOYW1lOiBcIkJsb2JHZXRQcm9wZXJ0aWVzSGVhZGVyc1wiLFxuICAgICAgICBtb2RlbFByb3BlcnRpZXM6IHtcbiAgICAgICAgICAgIGxhc3RNb2RpZmllZDoge1xuICAgICAgICAgICAgICAgIHNlcmlhbGl6ZWROYW1lOiBcImxhc3QtbW9kaWZpZWRcIixcbiAgICAgICAgICAgICAgICB4bWxOYW1lOiBcImxhc3QtbW9kaWZpZWRcIixcbiAgICAgICAgICAgICAgICB0eXBlOiB7XG4gICAgICAgICAgICAgICAgICAgIG5hbWU6IFwiRGF0ZVRpbWVSZmMxMTIzXCIsXG4gICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBjcmVhdGVkT246IHtcbiAgICAgICAgICAgICAgICBzZXJpYWxpemVkTmFtZTogXCJ4LW1zLWNyZWF0aW9uLXRpbWVcIixcbiAgICAgICAgICAgICAgICB4bWxOYW1lOiBcIngtbXMtY3JlYXRpb24tdGltZVwiLFxuICAgICAgICAgICAgICAgIHR5cGU6IHtcbiAgICAgICAgICAgICAgICAgICAgbmFtZTogXCJEYXRlVGltZVJmYzExMjNcIixcbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIG1ldGFkYXRhOiB7XG4gICAgICAgICAgICAgICAgc2VyaWFsaXplZE5hbWU6IFwieC1tcy1tZXRhXCIsXG4gICAgICAgICAgICAgICAgaGVhZGVyQ29sbGVjdGlvblByZWZpeDogXCJ4LW1zLW1ldGEtXCIsXG4gICAgICAgICAgICAgICAgeG1sTmFtZTogXCJ4LW1zLW1ldGFcIixcbiAgICAgICAgICAgICAgICB0eXBlOiB7XG4gICAgICAgICAgICAgICAgICAgIG5hbWU6IFwiRGljdGlvbmFyeVwiLFxuICAgICAgICAgICAgICAgICAgICB2YWx1ZTogeyB0eXBlOiB7IG5hbWU6IFwiU3RyaW5nXCIgfSB9LFxuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgb2JqZWN0UmVwbGljYXRpb25Qb2xpY3lJZDoge1xuICAgICAgICAgICAgICAgIHNlcmlhbGl6ZWROYW1lOiBcIngtbXMtb3ItcG9saWN5LWlkXCIsXG4gICAgICAgICAgICAgICAgeG1sTmFtZTogXCJ4LW1zLW9yLXBvbGljeS1pZFwiLFxuICAgICAgICAgICAgICAgIHR5cGU6IHtcbiAgICAgICAgICAgICAgICAgICAgbmFtZTogXCJTdHJpbmdcIixcbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIG9iamVjdFJlcGxpY2F0aW9uUnVsZXM6IHtcbiAgICAgICAgICAgICAgICBzZXJpYWxpemVkTmFtZTogXCJ4LW1zLW9yXCIsXG4gICAgICAgICAgICAgICAgaGVhZGVyQ29sbGVjdGlvblByZWZpeDogXCJ4LW1zLW9yLVwiLFxuICAgICAgICAgICAgICAgIHhtbE5hbWU6IFwieC1tcy1vclwiLFxuICAgICAgICAgICAgICAgIHR5cGU6IHtcbiAgICAgICAgICAgICAgICAgICAgbmFtZTogXCJEaWN0aW9uYXJ5XCIsXG4gICAgICAgICAgICAgICAgICAgIHZhbHVlOiB7IHR5cGU6IHsgbmFtZTogXCJTdHJpbmdcIiB9IH0sXG4gICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBibG9iVHlwZToge1xuICAgICAgICAgICAgICAgIHNlcmlhbGl6ZWROYW1lOiBcIngtbXMtYmxvYi10eXBlXCIsXG4gICAgICAgICAgICAgICAgeG1sTmFtZTogXCJ4LW1zLWJsb2ItdHlwZVwiLFxuICAgICAgICAgICAgICAgIHR5cGU6IHtcbiAgICAgICAgICAgICAgICAgICAgbmFtZTogXCJFbnVtXCIsXG4gICAgICAgICAgICAgICAgICAgIGFsbG93ZWRWYWx1ZXM6IFtcIkJsb2NrQmxvYlwiLCBcIlBhZ2VCbG9iXCIsIFwiQXBwZW5kQmxvYlwiXSxcbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIGNvcHlDb21wbGV0ZWRPbjoge1xuICAgICAgICAgICAgICAgIHNlcmlhbGl6ZWROYW1lOiBcIngtbXMtY29weS1jb21wbGV0aW9uLXRpbWVcIixcbiAgICAgICAgICAgICAgICB4bWxOYW1lOiBcIngtbXMtY29weS1jb21wbGV0aW9uLXRpbWVcIixcbiAgICAgICAgICAgICAgICB0eXBlOiB7XG4gICAgICAgICAgICAgICAgICAgIG5hbWU6IFwiRGF0ZVRpbWVSZmMxMTIzXCIsXG4gICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBjb3B5U3RhdHVzRGVzY3JpcHRpb246IHtcbiAgICAgICAgICAgICAgICBzZXJpYWxpemVkTmFtZTogXCJ4LW1zLWNvcHktc3RhdHVzLWRlc2NyaXB0aW9uXCIsXG4gICAgICAgICAgICAgICAgeG1sTmFtZTogXCJ4LW1zLWNvcHktc3RhdHVzLWRlc2NyaXB0aW9uXCIsXG4gICAgICAgICAgICAgICAgdHlwZToge1xuICAgICAgICAgICAgICAgICAgICBuYW1lOiBcIlN0cmluZ1wiLFxuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgY29weUlkOiB7XG4gICAgICAgICAgICAgICAgc2VyaWFsaXplZE5hbWU6IFwieC1tcy1jb3B5LWlkXCIsXG4gICAgICAgICAgICAgICAgeG1sTmFtZTogXCJ4LW1zLWNvcHktaWRcIixcbiAgICAgICAgICAgICAgICB0eXBlOiB7XG4gICAgICAgICAgICAgICAgICAgIG5hbWU6IFwiU3RyaW5nXCIsXG4gICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBjb3B5UHJvZ3Jlc3M6IHtcbiAgICAgICAgICAgICAgICBzZXJpYWxpemVkTmFtZTogXCJ4LW1zLWNvcHktcHJvZ3Jlc3NcIixcbiAgICAgICAgICAgICAgICB4bWxOYW1lOiBcIngtbXMtY29weS1wcm9ncmVzc1wiLFxuICAgICAgICAgICAgICAgIHR5cGU6IHtcbiAgICAgICAgICAgICAgICAgICAgbmFtZTogXCJTdHJpbmdcIixcbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIGNvcHlTb3VyY2U6IHtcbiAgICAgICAgICAgICAgICBzZXJpYWxpemVkTmFtZTogXCJ4LW1zLWNvcHktc291cmNlXCIsXG4gICAgICAgICAgICAgICAgeG1sTmFtZTogXCJ4LW1zLWNvcHktc291cmNlXCIsXG4gICAgICAgICAgICAgICAgdHlwZToge1xuICAgICAgICAgICAgICAgICAgICBuYW1lOiBcIlN0cmluZ1wiLFxuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgY29weVN0YXR1czoge1xuICAgICAgICAgICAgICAgIHNlcmlhbGl6ZWROYW1lOiBcIngtbXMtY29weS1zdGF0dXNcIixcbiAgICAgICAgICAgICAgICB4bWxOYW1lOiBcIngtbXMtY29weS1zdGF0dXNcIixcbiAgICAgICAgICAgICAgICB0eXBlOiB7XG4gICAgICAgICAgICAgICAgICAgIG5hbWU6IFwiRW51bVwiLFxuICAgICAgICAgICAgICAgICAgICBhbGxvd2VkVmFsdWVzOiBbXCJwZW5kaW5nXCIsIFwic3VjY2Vzc1wiLCBcImFib3J0ZWRcIiwgXCJmYWlsZWRcIl0sXG4gICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBpc0luY3JlbWVudGFsQ29weToge1xuICAgICAgICAgICAgICAgIHNlcmlhbGl6ZWROYW1lOiBcIngtbXMtaW5jcmVtZW50YWwtY29weVwiLFxuICAgICAgICAgICAgICAgIHhtbE5hbWU6IFwieC1tcy1pbmNyZW1lbnRhbC1jb3B5XCIsXG4gICAgICAgICAgICAgICAgdHlwZToge1xuICAgICAgICAgICAgICAgICAgICBuYW1lOiBcIkJvb2xlYW5cIixcbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIGRlc3RpbmF0aW9uU25hcHNob3Q6IHtcbiAgICAgICAgICAgICAgICBzZXJpYWxpemVkTmFtZTogXCJ4LW1zLWNvcHktZGVzdGluYXRpb24tc25hcHNob3RcIixcbiAgICAgICAgICAgICAgICB4bWxOYW1lOiBcIngtbXMtY29weS1kZXN0aW5hdGlvbi1zbmFwc2hvdFwiLFxuICAgICAgICAgICAgICAgIHR5cGU6IHtcbiAgICAgICAgICAgICAgICAgICAgbmFtZTogXCJTdHJpbmdcIixcbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIGxlYXNlRHVyYXRpb246IHtcbiAgICAgICAgICAgICAgICBzZXJpYWxpemVkTmFtZTogXCJ4LW1zLWxlYXNlLWR1cmF0aW9uXCIsXG4gICAgICAgICAgICAgICAgeG1sTmFtZTogXCJ4LW1zLWxlYXNlLWR1cmF0aW9uXCIsXG4gICAgICAgICAgICAgICAgdHlwZToge1xuICAgICAgICAgICAgICAgICAgICBuYW1lOiBcIkVudW1cIixcbiAgICAgICAgICAgICAgICAgICAgYWxsb3dlZFZhbHVlczogW1wiaW5maW5pdGVcIiwgXCJmaXhlZFwiXSxcbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIGxlYXNlU3RhdGU6IHtcbiAgICAgICAgICAgICAgICBzZXJpYWxpemVkTmFtZTogXCJ4LW1zLWxlYXNlLXN0YXRlXCIsXG4gICAgICAgICAgICAgICAgeG1sTmFtZTogXCJ4LW1zLWxlYXNlLXN0YXRlXCIsXG4gICAgICAgICAgICAgICAgdHlwZToge1xuICAgICAgICAgICAgICAgICAgICBuYW1lOiBcIkVudW1cIixcbiAgICAgICAgICAgICAgICAgICAgYWxsb3dlZFZhbHVlczogW1xuICAgICAgICAgICAgICAgICAgICAgICAgXCJhdmFpbGFibGVcIixcbiAgICAgICAgICAgICAgICAgICAgICAgIFwibGVhc2VkXCIsXG4gICAgICAgICAgICAgICAgICAgICAgICBcImV4cGlyZWRcIixcbiAgICAgICAgICAgICAgICAgICAgICAgIFwiYnJlYWtpbmdcIixcbiAgICAgICAgICAgICAgICAgICAgICAgIFwiYnJva2VuXCIsXG4gICAgICAgICAgICAgICAgICAgIF0sXG4gICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBsZWFzZVN0YXR1czoge1xuICAgICAgICAgICAgICAgIHNlcmlhbGl6ZWROYW1lOiBcIngtbXMtbGVhc2Utc3RhdHVzXCIsXG4gICAgICAgICAgICAgICAgeG1sTmFtZTogXCJ4LW1zLWxlYXNlLXN0YXR1c1wiLFxuICAgICAgICAgICAgICAgIHR5cGU6IHtcbiAgICAgICAgICAgICAgICAgICAgbmFtZTogXCJFbnVtXCIsXG4gICAgICAgICAgICAgICAgICAgIGFsbG93ZWRWYWx1ZXM6IFtcImxvY2tlZFwiLCBcInVubG9ja2VkXCJdLFxuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgY29udGVudExlbmd0aDoge1xuICAgICAgICAgICAgICAgIHNlcmlhbGl6ZWROYW1lOiBcImNvbnRlbnQtbGVuZ3RoXCIsXG4gICAgICAgICAgICAgICAgeG1sTmFtZTogXCJjb250ZW50LWxlbmd0aFwiLFxuICAgICAgICAgICAgICAgIHR5cGU6IHtcbiAgICAgICAgICAgICAgICAgICAgbmFtZTogXCJOdW1iZXJcIixcbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIGNvbnRlbnRUeXBlOiB7XG4gICAgICAgICAgICAgICAgc2VyaWFsaXplZE5hbWU6IFwiY29udGVudC10eXBlXCIsXG4gICAgICAgICAgICAgICAgeG1sTmFtZTogXCJjb250ZW50LXR5cGVcIixcbiAgICAgICAgICAgICAgICB0eXBlOiB7XG4gICAgICAgICAgICAgICAgICAgIG5hbWU6IFwiU3RyaW5nXCIsXG4gICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBldGFnOiB7XG4gICAgICAgICAgICAgICAgc2VyaWFsaXplZE5hbWU6IFwiZXRhZ1wiLFxuICAgICAgICAgICAgICAgIHhtbE5hbWU6IFwiZXRhZ1wiLFxuICAgICAgICAgICAgICAgIHR5cGU6IHtcbiAgICAgICAgICAgICAgICAgICAgbmFtZTogXCJTdHJpbmdcIixcbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIGNvbnRlbnRNRDU6IHtcbiAgICAgICAgICAgICAgICBzZXJpYWxpemVkTmFtZTogXCJjb250ZW50LW1kNVwiLFxuICAgICAgICAgICAgICAgIHhtbE5hbWU6IFwiY29udGVudC1tZDVcIixcbiAgICAgICAgICAgICAgICB0eXBlOiB7XG4gICAgICAgICAgICAgICAgICAgIG5hbWU6IFwiQnl0ZUFycmF5XCIsXG4gICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBjb250ZW50RW5jb2Rpbmc6IHtcbiAgICAgICAgICAgICAgICBzZXJpYWxpemVkTmFtZTogXCJjb250ZW50LWVuY29kaW5nXCIsXG4gICAgICAgICAgICAgICAgeG1sTmFtZTogXCJjb250ZW50LWVuY29kaW5nXCIsXG4gICAgICAgICAgICAgICAgdHlwZToge1xuICAgICAgICAgICAgICAgICAgICBuYW1lOiBcIlN0cmluZ1wiLFxuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgY29udGVudERpc3Bvc2l0aW9uOiB7XG4gICAgICAgICAgICAgICAgc2VyaWFsaXplZE5hbWU6IFwiY29udGVudC1kaXNwb3NpdGlvblwiLFxuICAgICAgICAgICAgICAgIHhtbE5hbWU6IFwiY29udGVudC1kaXNwb3NpdGlvblwiLFxuICAgICAgICAgICAgICAgIHR5cGU6IHtcbiAgICAgICAgICAgICAgICAgICAgbmFtZTogXCJTdHJpbmdcIixcbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIGNvbnRlbnRMYW5ndWFnZToge1xuICAgICAgICAgICAgICAgIHNlcmlhbGl6ZWROYW1lOiBcImNvbnRlbnQtbGFuZ3VhZ2VcIixcbiAgICAgICAgICAgICAgICB4bWxOYW1lOiBcImNvbnRlbnQtbGFuZ3VhZ2VcIixcbiAgICAgICAgICAgICAgICB0eXBlOiB7XG4gICAgICAgICAgICAgICAgICAgIG5hbWU6IFwiU3RyaW5nXCIsXG4gICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBjYWNoZUNvbnRyb2w6IHtcbiAgICAgICAgICAgICAgICBzZXJpYWxpemVkTmFtZTogXCJjYWNoZS1jb250cm9sXCIsXG4gICAgICAgICAgICAgICAgeG1sTmFtZTogXCJjYWNoZS1jb250cm9sXCIsXG4gICAgICAgICAgICAgICAgdHlwZToge1xuICAgICAgICAgICAgICAgICAgICBuYW1lOiBcIlN0cmluZ1wiLFxuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgYmxvYlNlcXVlbmNlTnVtYmVyOiB7XG4gICAgICAgICAgICAgICAgc2VyaWFsaXplZE5hbWU6IFwieC1tcy1ibG9iLXNlcXVlbmNlLW51bWJlclwiLFxuICAgICAgICAgICAgICAgIHhtbE5hbWU6IFwieC1tcy1ibG9iLXNlcXVlbmNlLW51bWJlclwiLFxuICAgICAgICAgICAgICAgIHR5cGU6IHtcbiAgICAgICAgICAgICAgICAgICAgbmFtZTogXCJOdW1iZXJcIixcbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIGNsaWVudFJlcXVlc3RJZDoge1xuICAgICAgICAgICAgICAgIHNlcmlhbGl6ZWROYW1lOiBcIngtbXMtY2xpZW50LXJlcXVlc3QtaWRcIixcbiAgICAgICAgICAgICAgICB4bWxOYW1lOiBcIngtbXMtY2xpZW50LXJlcXVlc3QtaWRcIixcbiAgICAgICAgICAgICAgICB0eXBlOiB7XG4gICAgICAgICAgICAgICAgICAgIG5hbWU6IFwiU3RyaW5nXCIsXG4gICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICByZXF1ZXN0SWQ6IHtcbiAgICAgICAgICAgICAgICBzZXJpYWxpemVkTmFtZTogXCJ4LW1zLXJlcXVlc3QtaWRcIixcbiAgICAgICAgICAgICAgICB4bWxOYW1lOiBcIngtbXMtcmVxdWVzdC1pZFwiLFxuICAgICAgICAgICAgICAgIHR5cGU6IHtcbiAgICAgICAgICAgICAgICAgICAgbmFtZTogXCJTdHJpbmdcIixcbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIHZlcnNpb246IHtcbiAgICAgICAgICAgICAgICBzZXJpYWxpemVkTmFtZTogXCJ4LW1zLXZlcnNpb25cIixcbiAgICAgICAgICAgICAgICB4bWxOYW1lOiBcIngtbXMtdmVyc2lvblwiLFxuICAgICAgICAgICAgICAgIHR5cGU6IHtcbiAgICAgICAgICAgICAgICAgICAgbmFtZTogXCJTdHJpbmdcIixcbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIGRhdGU6IHtcbiAgICAgICAgICAgICAgICBzZXJpYWxpemVkTmFtZTogXCJkYXRlXCIsXG4gICAgICAgICAgICAgICAgeG1sTmFtZTogXCJkYXRlXCIsXG4gICAgICAgICAgICAgICAgdHlwZToge1xuICAgICAgICAgICAgICAgICAgICBuYW1lOiBcIkRhdGVUaW1lUmZjMTEyM1wiLFxuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgYWNjZXB0UmFuZ2VzOiB7XG4gICAgICAgICAgICAgICAgc2VyaWFsaXplZE5hbWU6IFwiYWNjZXB0LXJhbmdlc1wiLFxuICAgICAgICAgICAgICAgIHhtbE5hbWU6IFwiYWNjZXB0LXJhbmdlc1wiLFxuICAgICAgICAgICAgICAgIHR5cGU6IHtcbiAgICAgICAgICAgICAgICAgICAgbmFtZTogXCJTdHJpbmdcIixcbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIGJsb2JDb21taXR0ZWRCbG9ja0NvdW50OiB7XG4gICAgICAgICAgICAgICAgc2VyaWFsaXplZE5hbWU6IFwieC1tcy1ibG9iLWNvbW1pdHRlZC1ibG9jay1jb3VudFwiLFxuICAgICAgICAgICAgICAgIHhtbE5hbWU6IFwieC1tcy1ibG9iLWNvbW1pdHRlZC1ibG9jay1jb3VudFwiLFxuICAgICAgICAgICAgICAgIHR5cGU6IHtcbiAgICAgICAgICAgICAgICAgICAgbmFtZTogXCJOdW1iZXJcIixcbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIGlzU2VydmVyRW5jcnlwdGVkOiB7XG4gICAgICAgICAgICAgICAgc2VyaWFsaXplZE5hbWU6IFwieC1tcy1zZXJ2ZXItZW5jcnlwdGVkXCIsXG4gICAgICAgICAgICAgICAgeG1sTmFtZTogXCJ4LW1zLXNlcnZlci1lbmNyeXB0ZWRcIixcbiAgICAgICAgICAgICAgICB0eXBlOiB7XG4gICAgICAgICAgICAgICAgICAgIG5hbWU6IFwiQm9vbGVhblwiLFxuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgZW5jcnlwdGlvbktleVNoYTI1Njoge1xuICAgICAgICAgICAgICAgIHNlcmlhbGl6ZWROYW1lOiBcIngtbXMtZW5jcnlwdGlvbi1rZXktc2hhMjU2XCIsXG4gICAgICAgICAgICAgICAgeG1sTmFtZTogXCJ4LW1zLWVuY3J5cHRpb24ta2V5LXNoYTI1NlwiLFxuICAgICAgICAgICAgICAgIHR5cGU6IHtcbiAgICAgICAgICAgICAgICAgICAgbmFtZTogXCJTdHJpbmdcIixcbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIGVuY3J5cHRpb25TY29wZToge1xuICAgICAgICAgICAgICAgIHNlcmlhbGl6ZWROYW1lOiBcIngtbXMtZW5jcnlwdGlvbi1zY29wZVwiLFxuICAgICAgICAgICAgICAgIHhtbE5hbWU6IFwieC1tcy1lbmNyeXB0aW9uLXNjb3BlXCIsXG4gICAgICAgICAgICAgICAgdHlwZToge1xuICAgICAgICAgICAgICAgICAgICBuYW1lOiBcIlN0cmluZ1wiLFxuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgYWNjZXNzVGllcjoge1xuICAgICAgICAgICAgICAgIHNlcmlhbGl6ZWROYW1lOiBcIngtbXMtYWNjZXNzLXRpZXJcIixcbiAgICAgICAgICAgICAgICB4bWxOYW1lOiBcIngtbXMtYWNjZXNzLXRpZXJcIixcbiAgICAgICAgICAgICAgICB0eXBlOiB7XG4gICAgICAgICAgICAgICAgICAgIG5hbWU6IFwiU3RyaW5nXCIsXG4gICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBhY2Nlc3NUaWVySW5mZXJyZWQ6IHtcbiAgICAgICAgICAgICAgICBzZXJpYWxpemVkTmFtZTogXCJ4LW1zLWFjY2Vzcy10aWVyLWluZmVycmVkXCIsXG4gICAgICAgICAgICAgICAgeG1sTmFtZTogXCJ4LW1zLWFjY2Vzcy10aWVyLWluZmVycmVkXCIsXG4gICAgICAgICAgICAgICAgdHlwZToge1xuICAgICAgICAgICAgICAgICAgICBuYW1lOiBcIkJvb2xlYW5cIixcbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIGFyY2hpdmVTdGF0dXM6IHtcbiAgICAgICAgICAgICAgICBzZXJpYWxpemVkTmFtZTogXCJ4LW1zLWFyY2hpdmUtc3RhdHVzXCIsXG4gICAgICAgICAgICAgICAgeG1sTmFtZTogXCJ4LW1zLWFyY2hpdmUtc3RhdHVzXCIsXG4gICAgICAgICAgICAgICAgdHlwZToge1xuICAgICAgICAgICAgICAgICAgICBuYW1lOiBcIlN0cmluZ1wiLFxuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgYWNjZXNzVGllckNoYW5nZWRPbjoge1xuICAgICAgICAgICAgICAgIHNlcmlhbGl6ZWROYW1lOiBcIngtbXMtYWNjZXNzLXRpZXItY2hhbmdlLXRpbWVcIixcbiAgICAgICAgICAgICAgICB4bWxOYW1lOiBcIngtbXMtYWNjZXNzLXRpZXItY2hhbmdlLXRpbWVcIixcbiAgICAgICAgICAgICAgICB0eXBlOiB7XG4gICAgICAgICAgICAgICAgICAgIG5hbWU6IFwiRGF0ZVRpbWVSZmMxMTIzXCIsXG4gICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICB2ZXJzaW9uSWQ6IHtcbiAgICAgICAgICAgICAgICBzZXJpYWxpemVkTmFtZTogXCJ4LW1zLXZlcnNpb24taWRcIixcbiAgICAgICAgICAgICAgICB4bWxOYW1lOiBcIngtbXMtdmVyc2lvbi1pZFwiLFxuICAgICAgICAgICAgICAgIHR5cGU6IHtcbiAgICAgICAgICAgICAgICAgICAgbmFtZTogXCJTdHJpbmdcIixcbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIGlzQ3VycmVudFZlcnNpb246IHtcbiAgICAgICAgICAgICAgICBzZXJpYWxpemVkTmFtZTogXCJ4LW1zLWlzLWN1cnJlbnQtdmVyc2lvblwiLFxuICAgICAgICAgICAgICAgIHhtbE5hbWU6IFwieC1tcy1pcy1jdXJyZW50LXZlcnNpb25cIixcbiAgICAgICAgICAgICAgICB0eXBlOiB7XG4gICAgICAgICAgICAgICAgICAgIG5hbWU6IFwiQm9vbGVhblwiLFxuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgdGFnQ291bnQ6IHtcbiAgICAgICAgICAgICAgICBzZXJpYWxpemVkTmFtZTogXCJ4LW1zLXRhZy1jb3VudFwiLFxuICAgICAgICAgICAgICAgIHhtbE5hbWU6IFwieC1tcy10YWctY291bnRcIixcbiAgICAgICAgICAgICAgICB0eXBlOiB7XG4gICAgICAgICAgICAgICAgICAgIG5hbWU6IFwiTnVtYmVyXCIsXG4gICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBleHBpcmVzT246IHtcbiAgICAgICAgICAgICAgICBzZXJpYWxpemVkTmFtZTogXCJ4LW1zLWV4cGlyeS10aW1lXCIsXG4gICAgICAgICAgICAgICAgeG1sTmFtZTogXCJ4LW1zLWV4cGlyeS10aW1lXCIsXG4gICAgICAgICAgICAgICAgdHlwZToge1xuICAgICAgICAgICAgICAgICAgICBuYW1lOiBcIkRhdGVUaW1lUmZjMTEyM1wiLFxuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgaXNTZWFsZWQ6IHtcbiAgICAgICAgICAgICAgICBzZXJpYWxpemVkTmFtZTogXCJ4LW1zLWJsb2Itc2VhbGVkXCIsXG4gICAgICAgICAgICAgICAgeG1sTmFtZTogXCJ4LW1zLWJsb2Itc2VhbGVkXCIsXG4gICAgICAgICAgICAgICAgdHlwZToge1xuICAgICAgICAgICAgICAgICAgICBuYW1lOiBcIkJvb2xlYW5cIixcbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIHJlaHlkcmF0ZVByaW9yaXR5OiB7XG4gICAgICAgICAgICAgICAgc2VyaWFsaXplZE5hbWU6IFwieC1tcy1yZWh5ZHJhdGUtcHJpb3JpdHlcIixcbiAgICAgICAgICAgICAgICB4bWxOYW1lOiBcIngtbXMtcmVoeWRyYXRlLXByaW9yaXR5XCIsXG4gICAgICAgICAgICAgICAgdHlwZToge1xuICAgICAgICAgICAgICAgICAgICBuYW1lOiBcIkVudW1cIixcbiAgICAgICAgICAgICAgICAgICAgYWxsb3dlZFZhbHVlczogW1wiSGlnaFwiLCBcIlN0YW5kYXJkXCJdLFxuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgbGFzdEFjY2Vzc2VkOiB7XG4gICAgICAgICAgICAgICAgc2VyaWFsaXplZE5hbWU6IFwieC1tcy1sYXN0LWFjY2Vzcy10aW1lXCIsXG4gICAgICAgICAgICAgICAgeG1sTmFtZTogXCJ4LW1zLWxhc3QtYWNjZXNzLXRpbWVcIixcbiAgICAgICAgICAgICAgICB0eXBlOiB7XG4gICAgICAgICAgICAgICAgICAgIG5hbWU6IFwiRGF0ZVRpbWVSZmMxMTIzXCIsXG4gICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBpbW11dGFiaWxpdHlQb2xpY3lFeHBpcmVzT246IHtcbiAgICAgICAgICAgICAgICBzZXJpYWxpemVkTmFtZTogXCJ4LW1zLWltbXV0YWJpbGl0eS1wb2xpY3ktdW50aWwtZGF0ZVwiLFxuICAgICAgICAgICAgICAgIHhtbE5hbWU6IFwieC1tcy1pbW11dGFiaWxpdHktcG9saWN5LXVudGlsLWRhdGVcIixcbiAgICAgICAgICAgICAgICB0eXBlOiB7XG4gICAgICAgICAgICAgICAgICAgIG5hbWU6IFwiRGF0ZVRpbWVSZmMxMTIzXCIsXG4gICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBpbW11dGFiaWxpdHlQb2xpY3lNb2RlOiB7XG4gICAgICAgICAgICAgICAgc2VyaWFsaXplZE5hbWU6IFwieC1tcy1pbW11dGFiaWxpdHktcG9saWN5LW1vZGVcIixcbiAgICAgICAgICAgICAgICB4bWxOYW1lOiBcIngtbXMtaW1tdXRhYmlsaXR5LXBvbGljeS1tb2RlXCIsXG4gICAgICAgICAgICAgICAgdHlwZToge1xuICAgICAgICAgICAgICAgICAgICBuYW1lOiBcIkVudW1cIixcbiAgICAgICAgICAgICAgICAgICAgYWxsb3dlZFZhbHVlczogW1wiTXV0YWJsZVwiLCBcIlVubG9ja2VkXCIsIFwiTG9ja2VkXCJdLFxuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgbGVnYWxIb2xkOiB7XG4gICAgICAgICAgICAgICAgc2VyaWFsaXplZE5hbWU6IFwieC1tcy1sZWdhbC1ob2xkXCIsXG4gICAgICAgICAgICAgICAgeG1sTmFtZTogXCJ4LW1zLWxlZ2FsLWhvbGRcIixcbiAgICAgICAgICAgICAgICB0eXBlOiB7XG4gICAgICAgICAgICAgICAgICAgIG5hbWU6IFwiQm9vbGVhblwiLFxuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgZXJyb3JDb2RlOiB7XG4gICAgICAgICAgICAgICAgc2VyaWFsaXplZE5hbWU6IFwieC1tcy1lcnJvci1jb2RlXCIsXG4gICAgICAgICAgICAgICAgeG1sTmFtZTogXCJ4LW1zLWVycm9yLWNvZGVcIixcbiAgICAgICAgICAgICAgICB0eXBlOiB7XG4gICAgICAgICAgICAgICAgICAgIG5hbWU6IFwiU3RyaW5nXCIsXG4gICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIH0sXG4gICAgICAgIH0sXG4gICAgfSxcbn07XG5jb25zdCBCbG9iR2V0UHJvcGVydGllc0V4Y2VwdGlvbkhlYWRlcnMgPSB7XG4gICAgc2VyaWFsaXplZE5hbWU6IFwiQmxvYl9nZXRQcm9wZXJ0aWVzRXhjZXB0aW9uSGVhZGVyc1wiLFxuICAgIHR5cGU6IHtcbiAgICAgICAgbmFtZTogXCJDb21wb3NpdGVcIixcbiAgICAgICAgY2xhc3NOYW1lOiBcIkJsb2JHZXRQcm9wZXJ0aWVzRXhjZXB0aW9uSGVhZGVyc1wiLFxuICAgICAgICBtb2RlbFByb3BlcnRpZXM6IHtcbiAgICAgICAgICAgIGVycm9yQ29kZToge1xuICAgICAgICAgICAgICAgIHNlcmlhbGl6ZWROYW1lOiBcIngtbXMtZXJyb3ItY29kZVwiLFxuICAgICAgICAgICAgICAgIHhtbE5hbWU6IFwieC1tcy1lcnJvci1jb2RlXCIsXG4gICAgICAgICAgICAgICAgdHlwZToge1xuICAgICAgICAgICAgICAgICAgICBuYW1lOiBcIlN0cmluZ1wiLFxuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICB9LFxuICAgICAgICB9LFxuICAgIH0sXG59O1xuY29uc3QgQmxvYkRlbGV0ZUhlYWRlcnMgPSB7XG4gICAgc2VyaWFsaXplZE5hbWU6IFwiQmxvYl9kZWxldGVIZWFkZXJzXCIsXG4gICAgdHlwZToge1xuICAgICAgICBuYW1lOiBcIkNvbXBvc2l0ZVwiLFxuICAgICAgICBjbGFzc05hbWU6IFwiQmxvYkRlbGV0ZUhlYWRlcnNcIixcbiAgICAgICAgbW9kZWxQcm9wZXJ0aWVzOiB7XG4gICAgICAgICAgICBjbGllbnRSZXF1ZXN0SWQ6IHtcbiAgICAgICAgICAgICAgICBzZXJpYWxpemVkTmFtZTogXCJ4LW1zLWNsaWVudC1yZXF1ZXN0LWlkXCIsXG4gICAgICAgICAgICAgICAgeG1sTmFtZTogXCJ4LW1zLWNsaWVudC1yZXF1ZXN0LWlkXCIsXG4gICAgICAgICAgICAgICAgdHlwZToge1xuICAgICAgICAgICAgICAgICAgICBuYW1lOiBcIlN0cmluZ1wiLFxuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgcmVxdWVzdElkOiB7XG4gICAgICAgICAgICAgICAgc2VyaWFsaXplZE5hbWU6IFwieC1tcy1yZXF1ZXN0LWlkXCIsXG4gICAgICAgICAgICAgICAgeG1sTmFtZTogXCJ4LW1zLXJlcXVlc3QtaWRcIixcbiAgICAgICAgICAgICAgICB0eXBlOiB7XG4gICAgICAgICAgICAgICAgICAgIG5hbWU6IFwiU3RyaW5nXCIsXG4gICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICB2ZXJzaW9uOiB7XG4gICAgICAgICAgICAgICAgc2VyaWFsaXplZE5hbWU6IFwieC1tcy12ZXJzaW9uXCIsXG4gICAgICAgICAgICAgICAgeG1sTmFtZTogXCJ4LW1zLXZlcnNpb25cIixcbiAgICAgICAgICAgICAgICB0eXBlOiB7XG4gICAgICAgICAgICAgICAgICAgIG5hbWU6IFwiU3RyaW5nXCIsXG4gICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBkYXRlOiB7XG4gICAgICAgICAgICAgICAgc2VyaWFsaXplZE5hbWU6IFwiZGF0ZVwiLFxuICAgICAgICAgICAgICAgIHhtbE5hbWU6IFwiZGF0ZVwiLFxuICAgICAgICAgICAgICAgIHR5cGU6IHtcbiAgICAgICAgICAgICAgICAgICAgbmFtZTogXCJEYXRlVGltZVJmYzExMjNcIixcbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIGVycm9yQ29kZToge1xuICAgICAgICAgICAgICAgIHNlcmlhbGl6ZWROYW1lOiBcIngtbXMtZXJyb3ItY29kZVwiLFxuICAgICAgICAgICAgICAgIHhtbE5hbWU6IFwieC1tcy1lcnJvci1jb2RlXCIsXG4gICAgICAgICAgICAgICAgdHlwZToge1xuICAgICAgICAgICAgICAgICAgICBuYW1lOiBcIlN0cmluZ1wiLFxuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICB9LFxuICAgICAgICB9LFxuICAgIH0sXG59O1xuY29uc3QgQmxvYkRlbGV0ZUV4Y2VwdGlvbkhlYWRlcnMgPSB7XG4gICAgc2VyaWFsaXplZE5hbWU6IFwiQmxvYl9kZWxldGVFeGNlcHRpb25IZWFkZXJzXCIsXG4gICAgdHlwZToge1xuICAgICAgICBuYW1lOiBcIkNvbXBvc2l0ZVwiLFxuICAgICAgICBjbGFzc05hbWU6IFwiQmxvYkRlbGV0ZUV4Y2VwdGlvbkhlYWRlcnNcIixcbiAgICAgICAgbW9kZWxQcm9wZXJ0aWVzOiB7XG4gICAgICAgICAgICBlcnJvckNvZGU6IHtcbiAgICAgICAgICAgICAgICBzZXJpYWxpemVkTmFtZTogXCJ4LW1zLWVycm9yLWNvZGVcIixcbiAgICAgICAgICAgICAgICB4bWxOYW1lOiBcIngtbXMtZXJyb3ItY29kZVwiLFxuICAgICAgICAgICAgICAgIHR5cGU6IHtcbiAgICAgICAgICAgICAgICAgICAgbmFtZTogXCJTdHJpbmdcIixcbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgfSxcbiAgICAgICAgfSxcbiAgICB9LFxufTtcbmNvbnN0IEJsb2JVbmRlbGV0ZUhlYWRlcnMgPSB7XG4gICAgc2VyaWFsaXplZE5hbWU6IFwiQmxvYl91bmRlbGV0ZUhlYWRlcnNcIixcbiAgICB0eXBlOiB7XG4gICAgICAgIG5hbWU6IFwiQ29tcG9zaXRlXCIsXG4gICAgICAgIGNsYXNzTmFtZTogXCJCbG9iVW5kZWxldGVIZWFkZXJzXCIsXG4gICAgICAgIG1vZGVsUHJvcGVydGllczoge1xuICAgICAgICAgICAgY2xpZW50UmVxdWVzdElkOiB7XG4gICAgICAgICAgICAgICAgc2VyaWFsaXplZE5hbWU6IFwieC1tcy1jbGllbnQtcmVxdWVzdC1pZFwiLFxuICAgICAgICAgICAgICAgIHhtbE5hbWU6IFwieC1tcy1jbGllbnQtcmVxdWVzdC1pZFwiLFxuICAgICAgICAgICAgICAgIHR5cGU6IHtcbiAgICAgICAgICAgICAgICAgICAgbmFtZTogXCJTdHJpbmdcIixcbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIHJlcXVlc3RJZDoge1xuICAgICAgICAgICAgICAgIHNlcmlhbGl6ZWROYW1lOiBcIngtbXMtcmVxdWVzdC1pZFwiLFxuICAgICAgICAgICAgICAgIHhtbE5hbWU6IFwieC1tcy1yZXF1ZXN0LWlkXCIsXG4gICAgICAgICAgICAgICAgdHlwZToge1xuICAgICAgICAgICAgICAgICAgICBuYW1lOiBcIlN0cmluZ1wiLFxuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgdmVyc2lvbjoge1xuICAgICAgICAgICAgICAgIHNlcmlhbGl6ZWROYW1lOiBcIngtbXMtdmVyc2lvblwiLFxuICAgICAgICAgICAgICAgIHhtbE5hbWU6IFwieC1tcy12ZXJzaW9uXCIsXG4gICAgICAgICAgICAgICAgdHlwZToge1xuICAgICAgICAgICAgICAgICAgICBuYW1lOiBcIlN0cmluZ1wiLFxuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgZGF0ZToge1xuICAgICAgICAgICAgICAgIHNlcmlhbGl6ZWROYW1lOiBcImRhdGVcIixcbiAgICAgICAgICAgICAgICB4bWxOYW1lOiBcImRhdGVcIixcbiAgICAgICAgICAgICAgICB0eXBlOiB7XG4gICAgICAgICAgICAgICAgICAgIG5hbWU6IFwiRGF0ZVRpbWVSZmMxMTIzXCIsXG4gICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBlcnJvckNvZGU6IHtcbiAgICAgICAgICAgICAgICBzZXJpYWxpemVkTmFtZTogXCJ4LW1zLWVycm9yLWNvZGVcIixcbiAgICAgICAgICAgICAgICB4bWxOYW1lOiBcIngtbXMtZXJyb3ItY29kZVwiLFxuICAgICAgICAgICAgICAgIHR5cGU6IHtcbiAgICAgICAgICAgICAgICAgICAgbmFtZTogXCJTdHJpbmdcIixcbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgfSxcbiAgICAgICAgfSxcbiAgICB9LFxufTtcbmNvbnN0IEJsb2JVbmRlbGV0ZUV4Y2VwdGlvbkhlYWRlcnMgPSB7XG4gICAgc2VyaWFsaXplZE5hbWU6IFwiQmxvYl91bmRlbGV0ZUV4Y2VwdGlvbkhlYWRlcnNcIixcbiAgICB0eXBlOiB7XG4gICAgICAgIG5hbWU6IFwiQ29tcG9zaXRlXCIsXG4gICAgICAgIGNsYXNzTmFtZTogXCJCbG9iVW5kZWxldGVFeGNlcHRpb25IZWFkZXJzXCIsXG4gICAgICAgIG1vZGVsUHJvcGVydGllczoge1xuICAgICAgICAgICAgZXJyb3JDb2RlOiB7XG4gICAgICAgICAgICAgICAgc2VyaWFsaXplZE5hbWU6IFwieC1tcy1lcnJvci1jb2RlXCIsXG4gICAgICAgICAgICAgICAgeG1sTmFtZTogXCJ4LW1zLWVycm9yLWNvZGVcIixcbiAgICAgICAgICAgICAgICB0eXBlOiB7XG4gICAgICAgICAgICAgICAgICAgIG5hbWU6IFwiU3RyaW5nXCIsXG4gICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIH0sXG4gICAgICAgIH0sXG4gICAgfSxcbn07XG5jb25zdCBCbG9iU2V0RXhwaXJ5SGVhZGVycyA9IHtcbiAgICBzZXJpYWxpemVkTmFtZTogXCJCbG9iX3NldEV4cGlyeUhlYWRlcnNcIixcbiAgICB0eXBlOiB7XG4gICAgICAgIG5hbWU6IFwiQ29tcG9zaXRlXCIsXG4gICAgICAgIGNsYXNzTmFtZTogXCJCbG9iU2V0RXhwaXJ5SGVhZGVyc1wiLFxuICAgICAgICBtb2RlbFByb3BlcnRpZXM6IHtcbiAgICAgICAgICAgIGV0YWc6IHtcbiAgICAgICAgICAgICAgICBzZXJpYWxpemVkTmFtZTogXCJldGFnXCIsXG4gICAgICAgICAgICAgICAgeG1sTmFtZTogXCJldGFnXCIsXG4gICAgICAgICAgICAgICAgdHlwZToge1xuICAgICAgICAgICAgICAgICAgICBuYW1lOiBcIlN0cmluZ1wiLFxuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgbGFzdE1vZGlmaWVkOiB7XG4gICAgICAgICAgICAgICAgc2VyaWFsaXplZE5hbWU6IFwibGFzdC1tb2RpZmllZFwiLFxuICAgICAgICAgICAgICAgIHhtbE5hbWU6IFwibGFzdC1tb2RpZmllZFwiLFxuICAgICAgICAgICAgICAgIHR5cGU6IHtcbiAgICAgICAgICAgICAgICAgICAgbmFtZTogXCJEYXRlVGltZVJmYzExMjNcIixcbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIGNsaWVudFJlcXVlc3RJZDoge1xuICAgICAgICAgICAgICAgIHNlcmlhbGl6ZWROYW1lOiBcIngtbXMtY2xpZW50LXJlcXVlc3QtaWRcIixcbiAgICAgICAgICAgICAgICB4bWxOYW1lOiBcIngtbXMtY2xpZW50LXJlcXVlc3QtaWRcIixcbiAgICAgICAgICAgICAgICB0eXBlOiB7XG4gICAgICAgICAgICAgICAgICAgIG5hbWU6IFwiU3RyaW5nXCIsXG4gICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICByZXF1ZXN0SWQ6IHtcbiAgICAgICAgICAgICAgICBzZXJpYWxpemVkTmFtZTogXCJ4LW1zLXJlcXVlc3QtaWRcIixcbiAgICAgICAgICAgICAgICB4bWxOYW1lOiBcIngtbXMtcmVxdWVzdC1pZFwiLFxuICAgICAgICAgICAgICAgIHR5cGU6IHtcbiAgICAgICAgICAgICAgICAgICAgbmFtZTogXCJTdHJpbmdcIixcbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIHZlcnNpb246IHtcbiAgICAgICAgICAgICAgICBzZXJpYWxpemVkTmFtZTogXCJ4LW1zLXZlcnNpb25cIixcbiAgICAgICAgICAgICAgICB4bWxOYW1lOiBcIngtbXMtdmVyc2lvblwiLFxuICAgICAgICAgICAgICAgIHR5cGU6IHtcbiAgICAgICAgICAgICAgICAgICAgbmFtZTogXCJTdHJpbmdcIixcbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIGRhdGU6IHtcbiAgICAgICAgICAgICAgICBzZXJpYWxpemVkTmFtZTogXCJkYXRlXCIsXG4gICAgICAgICAgICAgICAgeG1sTmFtZTogXCJkYXRlXCIsXG4gICAgICAgICAgICAgICAgdHlwZToge1xuICAgICAgICAgICAgICAgICAgICBuYW1lOiBcIkRhdGVUaW1lUmZjMTEyM1wiLFxuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICB9LFxuICAgICAgICB9LFxuICAgIH0sXG59O1xuY29uc3QgQmxvYlNldEV4cGlyeUV4Y2VwdGlvbkhlYWRlcnMgPSB7XG4gICAgc2VyaWFsaXplZE5hbWU6IFwiQmxvYl9zZXRFeHBpcnlFeGNlcHRpb25IZWFkZXJzXCIsXG4gICAgdHlwZToge1xuICAgICAgICBuYW1lOiBcIkNvbXBvc2l0ZVwiLFxuICAgICAgICBjbGFzc05hbWU6IFwiQmxvYlNldEV4cGlyeUV4Y2VwdGlvbkhlYWRlcnNcIixcbiAgICAgICAgbW9kZWxQcm9wZXJ0aWVzOiB7XG4gICAgICAgICAgICBlcnJvckNvZGU6IHtcbiAgICAgICAgICAgICAgICBzZXJpYWxpemVkTmFtZTogXCJ4LW1zLWVycm9yLWNvZGVcIixcbiAgICAgICAgICAgICAgICB4bWxOYW1lOiBcIngtbXMtZXJyb3ItY29kZVwiLFxuICAgICAgICAgICAgICAgIHR5cGU6IHtcbiAgICAgICAgICAgICAgICAgICAgbmFtZTogXCJTdHJpbmdcIixcbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgfSxcbiAgICAgICAgfSxcbiAgICB9LFxufTtcbmNvbnN0IEJsb2JTZXRIdHRwSGVhZGVyc0hlYWRlcnMgPSB7XG4gICAgc2VyaWFsaXplZE5hbWU6IFwiQmxvYl9zZXRIdHRwSGVhZGVyc0hlYWRlcnNcIixcbiAgICB0eXBlOiB7XG4gICAgICAgIG5hbWU6IFwiQ29tcG9zaXRlXCIsXG4gICAgICAgIGNsYXNzTmFtZTogXCJCbG9iU2V0SHR0cEhlYWRlcnNIZWFkZXJzXCIsXG4gICAgICAgIG1vZGVsUHJvcGVydGllczoge1xuICAgICAgICAgICAgZXRhZzoge1xuICAgICAgICAgICAgICAgIHNlcmlhbGl6ZWROYW1lOiBcImV0YWdcIixcbiAgICAgICAgICAgICAgICB4bWxOYW1lOiBcImV0YWdcIixcbiAgICAgICAgICAgICAgICB0eXBlOiB7XG4gICAgICAgICAgICAgICAgICAgIG5hbWU6IFwiU3RyaW5nXCIsXG4gICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBsYXN0TW9kaWZpZWQ6IHtcbiAgICAgICAgICAgICAgICBzZXJpYWxpemVkTmFtZTogXCJsYXN0LW1vZGlmaWVkXCIsXG4gICAgICAgICAgICAgICAgeG1sTmFtZTogXCJsYXN0LW1vZGlmaWVkXCIsXG4gICAgICAgICAgICAgICAgdHlwZToge1xuICAgICAgICAgICAgICAgICAgICBuYW1lOiBcIkRhdGVUaW1lUmZjMTEyM1wiLFxuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgYmxvYlNlcXVlbmNlTnVtYmVyOiB7XG4gICAgICAgICAgICAgICAgc2VyaWFsaXplZE5hbWU6IFwieC1tcy1ibG9iLXNlcXVlbmNlLW51bWJlclwiLFxuICAgICAgICAgICAgICAgIHhtbE5hbWU6IFwieC1tcy1ibG9iLXNlcXVlbmNlLW51bWJlclwiLFxuICAgICAgICAgICAgICAgIHR5cGU6IHtcbiAgICAgICAgICAgICAgICAgICAgbmFtZTogXCJOdW1iZXJcIixcbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIGNsaWVudFJlcXVlc3RJZDoge1xuICAgICAgICAgICAgICAgIHNlcmlhbGl6ZWROYW1lOiBcIngtbXMtY2xpZW50LXJlcXVlc3QtaWRcIixcbiAgICAgICAgICAgICAgICB4bWxOYW1lOiBcIngtbXMtY2xpZW50LXJlcXVlc3QtaWRcIixcbiAgICAgICAgICAgICAgICB0eXBlOiB7XG4gICAgICAgICAgICAgICAgICAgIG5hbWU6IFwiU3RyaW5nXCIsXG4gICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICByZXF1ZXN0SWQ6IHtcbiAgICAgICAgICAgICAgICBzZXJpYWxpemVkTmFtZTogXCJ4LW1zLXJlcXVlc3QtaWRcIixcbiAgICAgICAgICAgICAgICB4bWxOYW1lOiBcIngtbXMtcmVxdWVzdC1pZFwiLFxuICAgICAgICAgICAgICAgIHR5cGU6IHtcbiAgICAgICAgICAgICAgICAgICAgbmFtZTogXCJTdHJpbmdcIixcbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIHZlcnNpb246IHtcbiAgICAgICAgICAgICAgICBzZXJpYWxpemVkTmFtZTogXCJ4LW1zLXZlcnNpb25cIixcbiAgICAgICAgICAgICAgICB4bWxOYW1lOiBcIngtbXMtdmVyc2lvblwiLFxuICAgICAgICAgICAgICAgIHR5cGU6IHtcbiAgICAgICAgICAgICAgICAgICAgbmFtZTogXCJTdHJpbmdcIixcbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIGRhdGU6IHtcbiAgICAgICAgICAgICAgICBzZXJpYWxpemVkTmFtZTogXCJkYXRlXCIsXG4gICAgICAgICAgICAgICAgeG1sTmFtZTogXCJkYXRlXCIsXG4gICAgICAgICAgICAgICAgdHlwZToge1xuICAgICAgICAgICAgICAgICAgICBuYW1lOiBcIkRhdGVUaW1lUmZjMTEyM1wiLFxuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgZXJyb3JDb2RlOiB7XG4gICAgICAgICAgICAgICAgc2VyaWFsaXplZE5hbWU6IFwieC1tcy1lcnJvci1jb2RlXCIsXG4gICAgICAgICAgICAgICAgeG1sTmFtZTogXCJ4LW1zLWVycm9yLWNvZGVcIixcbiAgICAgICAgICAgICAgICB0eXBlOiB7XG4gICAgICAgICAgICAgICAgICAgIG5hbWU6IFwiU3RyaW5nXCIsXG4gICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIH0sXG4gICAgICAgIH0sXG4gICAgfSxcbn07XG5jb25zdCBCbG9iU2V0SHR0cEhlYWRlcnNFeGNlcHRpb25IZWFkZXJzID0ge1xuICAgIHNlcmlhbGl6ZWROYW1lOiBcIkJsb2Jfc2V0SHR0cEhlYWRlcnNFeGNlcHRpb25IZWFkZXJzXCIsXG4gICAgdHlwZToge1xuICAgICAgICBuYW1lOiBcIkNvbXBvc2l0ZVwiLFxuICAgICAgICBjbGFzc05hbWU6IFwiQmxvYlNldEh0dHBIZWFkZXJzRXhjZXB0aW9uSGVhZGVyc1wiLFxuICAgICAgICBtb2RlbFByb3BlcnRpZXM6IHtcbiAgICAgICAgICAgIGVycm9yQ29kZToge1xuICAgICAgICAgICAgICAgIHNlcmlhbGl6ZWROYW1lOiBcIngtbXMtZXJyb3ItY29kZVwiLFxuICAgICAgICAgICAgICAgIHhtbE5hbWU6IFwieC1tcy1lcnJvci1jb2RlXCIsXG4gICAgICAgICAgICAgICAgdHlwZToge1xuICAgICAgICAgICAgICAgICAgICBuYW1lOiBcIlN0cmluZ1wiLFxuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICB9LFxuICAgICAgICB9LFxuICAgIH0sXG59O1xuY29uc3QgQmxvYlNldEltbXV0YWJpbGl0eVBvbGljeUhlYWRlcnMgPSB7XG4gICAgc2VyaWFsaXplZE5hbWU6IFwiQmxvYl9zZXRJbW11dGFiaWxpdHlQb2xpY3lIZWFkZXJzXCIsXG4gICAgdHlwZToge1xuICAgICAgICBuYW1lOiBcIkNvbXBvc2l0ZVwiLFxuICAgICAgICBjbGFzc05hbWU6IFwiQmxvYlNldEltbXV0YWJpbGl0eVBvbGljeUhlYWRlcnNcIixcbiAgICAgICAgbW9kZWxQcm9wZXJ0aWVzOiB7XG4gICAgICAgICAgICBjbGllbnRSZXF1ZXN0SWQ6IHtcbiAgICAgICAgICAgICAgICBzZXJpYWxpemVkTmFtZTogXCJ4LW1zLWNsaWVudC1yZXF1ZXN0LWlkXCIsXG4gICAgICAgICAgICAgICAgeG1sTmFtZTogXCJ4LW1zLWNsaWVudC1yZXF1ZXN0LWlkXCIsXG4gICAgICAgICAgICAgICAgdHlwZToge1xuICAgICAgICAgICAgICAgICAgICBuYW1lOiBcIlN0cmluZ1wiLFxuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgcmVxdWVzdElkOiB7XG4gICAgICAgICAgICAgICAgc2VyaWFsaXplZE5hbWU6IFwieC1tcy1yZXF1ZXN0LWlkXCIsXG4gICAgICAgICAgICAgICAgeG1sTmFtZTogXCJ4LW1zLXJlcXVlc3QtaWRcIixcbiAgICAgICAgICAgICAgICB0eXBlOiB7XG4gICAgICAgICAgICAgICAgICAgIG5hbWU6IFwiU3RyaW5nXCIsXG4gICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICB2ZXJzaW9uOiB7XG4gICAgICAgICAgICAgICAgc2VyaWFsaXplZE5hbWU6IFwieC1tcy12ZXJzaW9uXCIsXG4gICAgICAgICAgICAgICAgeG1sTmFtZTogXCJ4LW1zLXZlcnNpb25cIixcbiAgICAgICAgICAgICAgICB0eXBlOiB7XG4gICAgICAgICAgICAgICAgICAgIG5hbWU6IFwiU3RyaW5nXCIsXG4gICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBkYXRlOiB7XG4gICAgICAgICAgICAgICAgc2VyaWFsaXplZE5hbWU6IFwiZGF0ZVwiLFxuICAgICAgICAgICAgICAgIHhtbE5hbWU6IFwiZGF0ZVwiLFxuICAgICAgICAgICAgICAgIHR5cGU6IHtcbiAgICAgICAgICAgICAgICAgICAgbmFtZTogXCJEYXRlVGltZVJmYzExMjNcIixcbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIGltbXV0YWJpbGl0eVBvbGljeUV4cGlyeToge1xuICAgICAgICAgICAgICAgIHNlcmlhbGl6ZWROYW1lOiBcIngtbXMtaW1tdXRhYmlsaXR5LXBvbGljeS11bnRpbC1kYXRlXCIsXG4gICAgICAgICAgICAgICAgeG1sTmFtZTogXCJ4LW1zLWltbXV0YWJpbGl0eS1wb2xpY3ktdW50aWwtZGF0ZVwiLFxuICAgICAgICAgICAgICAgIHR5cGU6IHtcbiAgICAgICAgICAgICAgICAgICAgbmFtZTogXCJEYXRlVGltZVJmYzExMjNcIixcbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIGltbXV0YWJpbGl0eVBvbGljeU1vZGU6IHtcbiAgICAgICAgICAgICAgICBzZXJpYWxpemVkTmFtZTogXCJ4LW1zLWltbXV0YWJpbGl0eS1wb2xpY3ktbW9kZVwiLFxuICAgICAgICAgICAgICAgIHhtbE5hbWU6IFwieC1tcy1pbW11dGFiaWxpdHktcG9saWN5LW1vZGVcIixcbiAgICAgICAgICAgICAgICB0eXBlOiB7XG4gICAgICAgICAgICAgICAgICAgIG5hbWU6IFwiRW51bVwiLFxuICAgICAgICAgICAgICAgICAgICBhbGxvd2VkVmFsdWVzOiBbXCJNdXRhYmxlXCIsIFwiVW5sb2NrZWRcIiwgXCJMb2NrZWRcIl0sXG4gICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIH0sXG4gICAgICAgIH0sXG4gICAgfSxcbn07XG5jb25zdCBCbG9iU2V0SW1tdXRhYmlsaXR5UG9saWN5RXhjZXB0aW9uSGVhZGVycyA9IHtcbiAgICBzZXJpYWxpemVkTmFtZTogXCJCbG9iX3NldEltbXV0YWJpbGl0eVBvbGljeUV4Y2VwdGlvbkhlYWRlcnNcIixcbiAgICB0eXBlOiB7XG4gICAgICAgIG5hbWU6IFwiQ29tcG9zaXRlXCIsXG4gICAgICAgIGNsYXNzTmFtZTogXCJCbG9iU2V0SW1tdXRhYmlsaXR5UG9saWN5RXhjZXB0aW9uSGVhZGVyc1wiLFxuICAgICAgICBtb2RlbFByb3BlcnRpZXM6IHtcbiAgICAgICAgICAgIGVycm9yQ29kZToge1xuICAgICAgICAgICAgICAgIHNlcmlhbGl6ZWROYW1lOiBcIngtbXMtZXJyb3ItY29kZVwiLFxuICAgICAgICAgICAgICAgIHhtbE5hbWU6IFwieC1tcy1lcnJvci1jb2RlXCIsXG4gICAgICAgICAgICAgICAgdHlwZToge1xuICAgICAgICAgICAgICAgICAgICBuYW1lOiBcIlN0cmluZ1wiLFxuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICB9LFxuICAgICAgICB9LFxuICAgIH0sXG59O1xuY29uc3QgQmxvYkRlbGV0ZUltbXV0YWJpbGl0eVBvbGljeUhlYWRlcnMgPSB7XG4gICAgc2VyaWFsaXplZE5hbWU6IFwiQmxvYl9kZWxldGVJbW11dGFiaWxpdHlQb2xpY3lIZWFkZXJzXCIsXG4gICAgdHlwZToge1xuICAgICAgICBuYW1lOiBcIkNvbXBvc2l0ZVwiLFxuICAgICAgICBjbGFzc05hbWU6IFwiQmxvYkRlbGV0ZUltbXV0YWJpbGl0eVBvbGljeUhlYWRlcnNcIixcbiAgICAgICAgbW9kZWxQcm9wZXJ0aWVzOiB7XG4gICAgICAgICAgICBjbGllbnRSZXF1ZXN0SWQ6IHtcbiAgICAgICAgICAgICAgICBzZXJpYWxpemVkTmFtZTogXCJ4LW1zLWNsaWVudC1yZXF1ZXN0LWlkXCIsXG4gICAgICAgICAgICAgICAgeG1sTmFtZTogXCJ4LW1zLWNsaWVudC1yZXF1ZXN0LWlkXCIsXG4gICAgICAgICAgICAgICAgdHlwZToge1xuICAgICAgICAgICAgICAgICAgICBuYW1lOiBcIlN0cmluZ1wiLFxuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgcmVxdWVzdElkOiB7XG4gICAgICAgICAgICAgICAgc2VyaWFsaXplZE5hbWU6IFwieC1tcy1yZXF1ZXN0LWlkXCIsXG4gICAgICAgICAgICAgICAgeG1sTmFtZTogXCJ4LW1zLXJlcXVlc3QtaWRcIixcbiAgICAgICAgICAgICAgICB0eXBlOiB7XG4gICAgICAgICAgICAgICAgICAgIG5hbWU6IFwiU3RyaW5nXCIsXG4gICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICB2ZXJzaW9uOiB7XG4gICAgICAgICAgICAgICAgc2VyaWFsaXplZE5hbWU6IFwieC1tcy12ZXJzaW9uXCIsXG4gICAgICAgICAgICAgICAgeG1sTmFtZTogXCJ4LW1zLXZlcnNpb25cIixcbiAgICAgICAgICAgICAgICB0eXBlOiB7XG4gICAgICAgICAgICAgICAgICAgIG5hbWU6IFwiU3RyaW5nXCIsXG4gICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBkYXRlOiB7XG4gICAgICAgICAgICAgICAgc2VyaWFsaXplZE5hbWU6IFwiZGF0ZVwiLFxuICAgICAgICAgICAgICAgIHhtbE5hbWU6IFwiZGF0ZVwiLFxuICAgICAgICAgICAgICAgIHR5cGU6IHtcbiAgICAgICAgICAgICAgICAgICAgbmFtZTogXCJEYXRlVGltZVJmYzExMjNcIixcbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgfSxcbiAgICAgICAgfSxcbiAgICB9LFxufTtcbmNvbnN0IEJsb2JEZWxldGVJbW11dGFiaWxpdHlQb2xpY3lFeGNlcHRpb25IZWFkZXJzID0ge1xuICAgIHNlcmlhbGl6ZWROYW1lOiBcIkJsb2JfZGVsZXRlSW1tdXRhYmlsaXR5UG9saWN5RXhjZXB0aW9uSGVhZGVyc1wiLFxuICAgIHR5cGU6IHtcbiAgICAgICAgbmFtZTogXCJDb21wb3NpdGVcIixcbiAgICAgICAgY2xhc3NOYW1lOiBcIkJsb2JEZWxldGVJbW11dGFiaWxpdHlQb2xpY3lFeGNlcHRpb25IZWFkZXJzXCIsXG4gICAgICAgIG1vZGVsUHJvcGVydGllczoge1xuICAgICAgICAgICAgZXJyb3JDb2RlOiB7XG4gICAgICAgICAgICAgICAgc2VyaWFsaXplZE5hbWU6IFwieC1tcy1lcnJvci1jb2RlXCIsXG4gICAgICAgICAgICAgICAgeG1sTmFtZTogXCJ4LW1zLWVycm9yLWNvZGVcIixcbiAgICAgICAgICAgICAgICB0eXBlOiB7XG4gICAgICAgICAgICAgICAgICAgIG5hbWU6IFwiU3RyaW5nXCIsXG4gICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIH0sXG4gICAgICAgIH0sXG4gICAgfSxcbn07XG5jb25zdCBCbG9iU2V0TGVnYWxIb2xkSGVhZGVycyA9IHtcbiAgICBzZXJpYWxpemVkTmFtZTogXCJCbG9iX3NldExlZ2FsSG9sZEhlYWRlcnNcIixcbiAgICB0eXBlOiB7XG4gICAgICAgIG5hbWU6IFwiQ29tcG9zaXRlXCIsXG4gICAgICAgIGNsYXNzTmFtZTogXCJCbG9iU2V0TGVnYWxIb2xkSGVhZGVyc1wiLFxuICAgICAgICBtb2RlbFByb3BlcnRpZXM6IHtcbiAgICAgICAgICAgIGNsaWVudFJlcXVlc3RJZDoge1xuICAgICAgICAgICAgICAgIHNlcmlhbGl6ZWROYW1lOiBcIngtbXMtY2xpZW50LXJlcXVlc3QtaWRcIixcbiAgICAgICAgICAgICAgICB4bWxOYW1lOiBcIngtbXMtY2xpZW50LXJlcXVlc3QtaWRcIixcbiAgICAgICAgICAgICAgICB0eXBlOiB7XG4gICAgICAgICAgICAgICAgICAgIG5hbWU6IFwiU3RyaW5nXCIsXG4gICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICByZXF1ZXN0SWQ6IHtcbiAgICAgICAgICAgICAgICBzZXJpYWxpemVkTmFtZTogXCJ4LW1zLXJlcXVlc3QtaWRcIixcbiAgICAgICAgICAgICAgICB4bWxOYW1lOiBcIngtbXMtcmVxdWVzdC1pZFwiLFxuICAgICAgICAgICAgICAgIHR5cGU6IHtcbiAgICAgICAgICAgICAgICAgICAgbmFtZTogXCJTdHJpbmdcIixcbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIHZlcnNpb246IHtcbiAgICAgICAgICAgICAgICBzZXJpYWxpemVkTmFtZTogXCJ4LW1zLXZlcnNpb25cIixcbiAgICAgICAgICAgICAgICB4bWxOYW1lOiBcIngtbXMtdmVyc2lvblwiLFxuICAgICAgICAgICAgICAgIHR5cGU6IHtcbiAgICAgICAgICAgICAgICAgICAgbmFtZTogXCJTdHJpbmdcIixcbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIGRhdGU6IHtcbiAgICAgICAgICAgICAgICBzZXJpYWxpemVkTmFtZTogXCJkYXRlXCIsXG4gICAgICAgICAgICAgICAgeG1sTmFtZTogXCJkYXRlXCIsXG4gICAgICAgICAgICAgICAgdHlwZToge1xuICAgICAgICAgICAgICAgICAgICBuYW1lOiBcIkRhdGVUaW1lUmZjMTEyM1wiLFxuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgbGVnYWxIb2xkOiB7XG4gICAgICAgICAgICAgICAgc2VyaWFsaXplZE5hbWU6IFwieC1tcy1sZWdhbC1ob2xkXCIsXG4gICAgICAgICAgICAgICAgeG1sTmFtZTogXCJ4LW1zLWxlZ2FsLWhvbGRcIixcbiAgICAgICAgICAgICAgICB0eXBlOiB7XG4gICAgICAgICAgICAgICAgICAgIG5hbWU6IFwiQm9vbGVhblwiLFxuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICB9LFxuICAgICAgICB9LFxuICAgIH0sXG59O1xuY29uc3QgQmxvYlNldExlZ2FsSG9sZEV4Y2VwdGlvbkhlYWRlcnMgPSB7XG4gICAgc2VyaWFsaXplZE5hbWU6IFwiQmxvYl9zZXRMZWdhbEhvbGRFeGNlcHRpb25IZWFkZXJzXCIsXG4gICAgdHlwZToge1xuICAgICAgICBuYW1lOiBcIkNvbXBvc2l0ZVwiLFxuICAgICAgICBjbGFzc05hbWU6IFwiQmxvYlNldExlZ2FsSG9sZEV4Y2VwdGlvbkhlYWRlcnNcIixcbiAgICAgICAgbW9kZWxQcm9wZXJ0aWVzOiB7XG4gICAgICAgICAgICBlcnJvckNvZGU6IHtcbiAgICAgICAgICAgICAgICBzZXJpYWxpemVkTmFtZTogXCJ4LW1zLWVycm9yLWNvZGVcIixcbiAgICAgICAgICAgICAgICB4bWxOYW1lOiBcIngtbXMtZXJyb3ItY29kZVwiLFxuICAgICAgICAgICAgICAgIHR5cGU6IHtcbiAgICAgICAgICAgICAgICAgICAgbmFtZTogXCJTdHJpbmdcIixcbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgfSxcbiAgICAgICAgfSxcbiAgICB9LFxufTtcbmNvbnN0IEJsb2JTZXRNZXRhZGF0YUhlYWRlcnMgPSB7XG4gICAgc2VyaWFsaXplZE5hbWU6IFwiQmxvYl9zZXRNZXRhZGF0YUhlYWRlcnNcIixcbiAgICB0eXBlOiB7XG4gICAgICAgIG5hbWU6IFwiQ29tcG9zaXRlXCIsXG4gICAgICAgIGNsYXNzTmFtZTogXCJCbG9iU2V0TWV0YWRhdGFIZWFkZXJzXCIsXG4gICAgICAgIG1vZGVsUHJvcGVydGllczoge1xuICAgICAgICAgICAgZXRhZzoge1xuICAgICAgICAgICAgICAgIHNlcmlhbGl6ZWROYW1lOiBcImV0YWdcIixcbiAgICAgICAgICAgICAgICB4bWxOYW1lOiBcImV0YWdcIixcbiAgICAgICAgICAgICAgICB0eXBlOiB7XG4gICAgICAgICAgICAgICAgICAgIG5hbWU6IFwiU3RyaW5nXCIsXG4gICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBsYXN0TW9kaWZpZWQ6IHtcbiAgICAgICAgICAgICAgICBzZXJpYWxpemVkTmFtZTogXCJsYXN0LW1vZGlmaWVkXCIsXG4gICAgICAgICAgICAgICAgeG1sTmFtZTogXCJsYXN0LW1vZGlmaWVkXCIsXG4gICAgICAgICAgICAgICAgdHlwZToge1xuICAgICAgICAgICAgICAgICAgICBuYW1lOiBcIkRhdGVUaW1lUmZjMTEyM1wiLFxuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgY2xpZW50UmVxdWVzdElkOiB7XG4gICAgICAgICAgICAgICAgc2VyaWFsaXplZE5hbWU6IFwieC1tcy1jbGllbnQtcmVxdWVzdC1pZFwiLFxuICAgICAgICAgICAgICAgIHhtbE5hbWU6IFwieC1tcy1jbGllbnQtcmVxdWVzdC1pZFwiLFxuICAgICAgICAgICAgICAgIHR5cGU6IHtcbiAgICAgICAgICAgICAgICAgICAgbmFtZTogXCJTdHJpbmdcIixcbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIHJlcXVlc3RJZDoge1xuICAgICAgICAgICAgICAgIHNlcmlhbGl6ZWROYW1lOiBcIngtbXMtcmVxdWVzdC1pZFwiLFxuICAgICAgICAgICAgICAgIHhtbE5hbWU6IFwieC1tcy1yZXF1ZXN0LWlkXCIsXG4gICAgICAgICAgICAgICAgdHlwZToge1xuICAgICAgICAgICAgICAgICAgICBuYW1lOiBcIlN0cmluZ1wiLFxuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgdmVyc2lvbjoge1xuICAgICAgICAgICAgICAgIHNlcmlhbGl6ZWROYW1lOiBcIngtbXMtdmVyc2lvblwiLFxuICAgICAgICAgICAgICAgIHhtbE5hbWU6IFwieC1tcy12ZXJzaW9uXCIsXG4gICAgICAgICAgICAgICAgdHlwZToge1xuICAgICAgICAgICAgICAgICAgICBuYW1lOiBcIlN0cmluZ1wiLFxuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgdmVyc2lvbklkOiB7XG4gICAgICAgICAgICAgICAgc2VyaWFsaXplZE5hbWU6IFwieC1tcy12ZXJzaW9uLWlkXCIsXG4gICAgICAgICAgICAgICAgeG1sTmFtZTogXCJ4LW1zLXZlcnNpb24taWRcIixcbiAgICAgICAgICAgICAgICB0eXBlOiB7XG4gICAgICAgICAgICAgICAgICAgIG5hbWU6IFwiU3RyaW5nXCIsXG4gICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBkYXRlOiB7XG4gICAgICAgICAgICAgICAgc2VyaWFsaXplZE5hbWU6IFwiZGF0ZVwiLFxuICAgICAgICAgICAgICAgIHhtbE5hbWU6IFwiZGF0ZVwiLFxuICAgICAgICAgICAgICAgIHR5cGU6IHtcbiAgICAgICAgICAgICAgICAgICAgbmFtZTogXCJEYXRlVGltZVJmYzExMjNcIixcbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIGlzU2VydmVyRW5jcnlwdGVkOiB7XG4gICAgICAgICAgICAgICAgc2VyaWFsaXplZE5hbWU6IFwieC1tcy1yZXF1ZXN0LXNlcnZlci1lbmNyeXB0ZWRcIixcbiAgICAgICAgICAgICAgICB4bWxOYW1lOiBcIngtbXMtcmVxdWVzdC1zZXJ2ZXItZW5jcnlwdGVkXCIsXG4gICAgICAgICAgICAgICAgdHlwZToge1xuICAgICAgICAgICAgICAgICAgICBuYW1lOiBcIkJvb2xlYW5cIixcbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIGVuY3J5cHRpb25LZXlTaGEyNTY6IHtcbiAgICAgICAgICAgICAgICBzZXJpYWxpemVkTmFtZTogXCJ4LW1zLWVuY3J5cHRpb24ta2V5LXNoYTI1NlwiLFxuICAgICAgICAgICAgICAgIHhtbE5hbWU6IFwieC1tcy1lbmNyeXB0aW9uLWtleS1zaGEyNTZcIixcbiAgICAgICAgICAgICAgICB0eXBlOiB7XG4gICAgICAgICAgICAgICAgICAgIG5hbWU6IFwiU3RyaW5nXCIsXG4gICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBlbmNyeXB0aW9uU2NvcGU6IHtcbiAgICAgICAgICAgICAgICBzZXJpYWxpemVkTmFtZTogXCJ4LW1zLWVuY3J5cHRpb24tc2NvcGVcIixcbiAgICAgICAgICAgICAgICB4bWxOYW1lOiBcIngtbXMtZW5jcnlwdGlvbi1zY29wZVwiLFxuICAgICAgICAgICAgICAgIHR5cGU6IHtcbiAgICAgICAgICAgICAgICAgICAgbmFtZTogXCJTdHJpbmdcIixcbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIGVycm9yQ29kZToge1xuICAgICAgICAgICAgICAgIHNlcmlhbGl6ZWROYW1lOiBcIngtbXMtZXJyb3ItY29kZVwiLFxuICAgICAgICAgICAgICAgIHhtbE5hbWU6IFwieC1tcy1lcnJvci1jb2RlXCIsXG4gICAgICAgICAgICAgICAgdHlwZToge1xuICAgICAgICAgICAgICAgICAgICBuYW1lOiBcIlN0cmluZ1wiLFxuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICB9LFxuICAgICAgICB9LFxuICAgIH0sXG59O1xuY29uc3QgQmxvYlNldE1ldGFkYXRhRXhjZXB0aW9uSGVhZGVycyA9IHtcbiAgICBzZXJpYWxpemVkTmFtZTogXCJCbG9iX3NldE1ldGFkYXRhRXhjZXB0aW9uSGVhZGVyc1wiLFxuICAgIHR5cGU6IHtcbiAgICAgICAgbmFtZTogXCJDb21wb3NpdGVcIixcbiAgICAgICAgY2xhc3NOYW1lOiBcIkJsb2JTZXRNZXRhZGF0YUV4Y2VwdGlvbkhlYWRlcnNcIixcbiAgICAgICAgbW9kZWxQcm9wZXJ0aWVzOiB7XG4gICAgICAgICAgICBlcnJvckNvZGU6IHtcbiAgICAgICAgICAgICAgICBzZXJpYWxpemVkTmFtZTogXCJ4LW1zLWVycm9yLWNvZGVcIixcbiAgICAgICAgICAgICAgICB4bWxOYW1lOiBcIngtbXMtZXJyb3ItY29kZVwiLFxuICAgICAgICAgICAgICAgIHR5cGU6IHtcbiAgICAgICAgICAgICAgICAgICAgbmFtZTogXCJTdHJpbmdcIixcbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgfSxcbiAgICAgICAgfSxcbiAgICB9LFxufTtcbmNvbnN0IEJsb2JBY3F1aXJlTGVhc2VIZWFkZXJzID0ge1xuICAgIHNlcmlhbGl6ZWROYW1lOiBcIkJsb2JfYWNxdWlyZUxlYXNlSGVhZGVyc1wiLFxuICAgIHR5cGU6IHtcbiAgICAgICAgbmFtZTogXCJDb21wb3NpdGVcIixcbiAgICAgICAgY2xhc3NOYW1lOiBcIkJsb2JBY3F1aXJlTGVhc2VIZWFkZXJzXCIsXG4gICAgICAgIG1vZGVsUHJvcGVydGllczoge1xuICAgICAgICAgICAgZXRhZzoge1xuICAgICAgICAgICAgICAgIHNlcmlhbGl6ZWROYW1lOiBcImV0YWdcIixcbiAgICAgICAgICAgICAgICB4bWxOYW1lOiBcImV0YWdcIixcbiAgICAgICAgICAgICAgICB0eXBlOiB7XG4gICAgICAgICAgICAgICAgICAgIG5hbWU6IFwiU3RyaW5nXCIsXG4gICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBsYXN0TW9kaWZpZWQ6IHtcbiAgICAgICAgICAgICAgICBzZXJpYWxpemVkTmFtZTogXCJsYXN0LW1vZGlmaWVkXCIsXG4gICAgICAgICAgICAgICAgeG1sTmFtZTogXCJsYXN0LW1vZGlmaWVkXCIsXG4gICAgICAgICAgICAgICAgdHlwZToge1xuICAgICAgICAgICAgICAgICAgICBuYW1lOiBcIkRhdGVUaW1lUmZjMTEyM1wiLFxuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgbGVhc2VJZDoge1xuICAgICAgICAgICAgICAgIHNlcmlhbGl6ZWROYW1lOiBcIngtbXMtbGVhc2UtaWRcIixcbiAgICAgICAgICAgICAgICB4bWxOYW1lOiBcIngtbXMtbGVhc2UtaWRcIixcbiAgICAgICAgICAgICAgICB0eXBlOiB7XG4gICAgICAgICAgICAgICAgICAgIG5hbWU6IFwiU3RyaW5nXCIsXG4gICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBjbGllbnRSZXF1ZXN0SWQ6IHtcbiAgICAgICAgICAgICAgICBzZXJpYWxpemVkTmFtZTogXCJ4LW1zLWNsaWVudC1yZXF1ZXN0LWlkXCIsXG4gICAgICAgICAgICAgICAgeG1sTmFtZTogXCJ4LW1zLWNsaWVudC1yZXF1ZXN0LWlkXCIsXG4gICAgICAgICAgICAgICAgdHlwZToge1xuICAgICAgICAgICAgICAgICAgICBuYW1lOiBcIlN0cmluZ1wiLFxuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgcmVxdWVzdElkOiB7XG4gICAgICAgICAgICAgICAgc2VyaWFsaXplZE5hbWU6IFwieC1tcy1yZXF1ZXN0LWlkXCIsXG4gICAgICAgICAgICAgICAgeG1sTmFtZTogXCJ4LW1zLXJlcXVlc3QtaWRcIixcbiAgICAgICAgICAgICAgICB0eXBlOiB7XG4gICAgICAgICAgICAgICAgICAgIG5hbWU6IFwiU3RyaW5nXCIsXG4gICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICB2ZXJzaW9uOiB7XG4gICAgICAgICAgICAgICAgc2VyaWFsaXplZE5hbWU6IFwieC1tcy12ZXJzaW9uXCIsXG4gICAgICAgICAgICAgICAgeG1sTmFtZTogXCJ4LW1zLXZlcnNpb25cIixcbiAgICAgICAgICAgICAgICB0eXBlOiB7XG4gICAgICAgICAgICAgICAgICAgIG5hbWU6IFwiU3RyaW5nXCIsXG4gICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBkYXRlOiB7XG4gICAgICAgICAgICAgICAgc2VyaWFsaXplZE5hbWU6IFwiZGF0ZVwiLFxuICAgICAgICAgICAgICAgIHhtbE5hbWU6IFwiZGF0ZVwiLFxuICAgICAgICAgICAgICAgIHR5cGU6IHtcbiAgICAgICAgICAgICAgICAgICAgbmFtZTogXCJEYXRlVGltZVJmYzExMjNcIixcbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgfSxcbiAgICAgICAgfSxcbiAgICB9LFxufTtcbmNvbnN0IEJsb2JBY3F1aXJlTGVhc2VFeGNlcHRpb25IZWFkZXJzID0ge1xuICAgIHNlcmlhbGl6ZWROYW1lOiBcIkJsb2JfYWNxdWlyZUxlYXNlRXhjZXB0aW9uSGVhZGVyc1wiLFxuICAgIHR5cGU6IHtcbiAgICAgICAgbmFtZTogXCJDb21wb3NpdGVcIixcbiAgICAgICAgY2xhc3NOYW1lOiBcIkJsb2JBY3F1aXJlTGVhc2VFeGNlcHRpb25IZWFkZXJzXCIsXG4gICAgICAgIG1vZGVsUHJvcGVydGllczoge1xuICAgICAgICAgICAgZXJyb3JDb2RlOiB7XG4gICAgICAgICAgICAgICAgc2VyaWFsaXplZE5hbWU6IFwieC1tcy1lcnJvci1jb2RlXCIsXG4gICAgICAgICAgICAgICAgeG1sTmFtZTogXCJ4LW1zLWVycm9yLWNvZGVcIixcbiAgICAgICAgICAgICAgICB0eXBlOiB7XG4gICAgICAgICAgICAgICAgICAgIG5hbWU6IFwiU3RyaW5nXCIsXG4gICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIH0sXG4gICAgICAgIH0sXG4gICAgfSxcbn07XG5jb25zdCBCbG9iUmVsZWFzZUxlYXNlSGVhZGVycyA9IHtcbiAgICBzZXJpYWxpemVkTmFtZTogXCJCbG9iX3JlbGVhc2VMZWFzZUhlYWRlcnNcIixcbiAgICB0eXBlOiB7XG4gICAgICAgIG5hbWU6IFwiQ29tcG9zaXRlXCIsXG4gICAgICAgIGNsYXNzTmFtZTogXCJCbG9iUmVsZWFzZUxlYXNlSGVhZGVyc1wiLFxuICAgICAgICBtb2RlbFByb3BlcnRpZXM6IHtcbiAgICAgICAgICAgIGV0YWc6IHtcbiAgICAgICAgICAgICAgICBzZXJpYWxpemVkTmFtZTogXCJldGFnXCIsXG4gICAgICAgICAgICAgICAgeG1sTmFtZTogXCJldGFnXCIsXG4gICAgICAgICAgICAgICAgdHlwZToge1xuICAgICAgICAgICAgICAgICAgICBuYW1lOiBcIlN0cmluZ1wiLFxuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgbGFzdE1vZGlmaWVkOiB7XG4gICAgICAgICAgICAgICAgc2VyaWFsaXplZE5hbWU6IFwibGFzdC1tb2RpZmllZFwiLFxuICAgICAgICAgICAgICAgIHhtbE5hbWU6IFwibGFzdC1tb2RpZmllZFwiLFxuICAgICAgICAgICAgICAgIHR5cGU6IHtcbiAgICAgICAgICAgICAgICAgICAgbmFtZTogXCJEYXRlVGltZVJmYzExMjNcIixcbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIGNsaWVudFJlcXVlc3RJZDoge1xuICAgICAgICAgICAgICAgIHNlcmlhbGl6ZWROYW1lOiBcIngtbXMtY2xpZW50LXJlcXVlc3QtaWRcIixcbiAgICAgICAgICAgICAgICB4bWxOYW1lOiBcIngtbXMtY2xpZW50LXJlcXVlc3QtaWRcIixcbiAgICAgICAgICAgICAgICB0eXBlOiB7XG4gICAgICAgICAgICAgICAgICAgIG5hbWU6IFwiU3RyaW5nXCIsXG4gICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICByZXF1ZXN0SWQ6IHtcbiAgICAgICAgICAgICAgICBzZXJpYWxpemVkTmFtZTogXCJ4LW1zLXJlcXVlc3QtaWRcIixcbiAgICAgICAgICAgICAgICB4bWxOYW1lOiBcIngtbXMtcmVxdWVzdC1pZFwiLFxuICAgICAgICAgICAgICAgIHR5cGU6IHtcbiAgICAgICAgICAgICAgICAgICAgbmFtZTogXCJTdHJpbmdcIixcbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIHZlcnNpb246IHtcbiAgICAgICAgICAgICAgICBzZXJpYWxpemVkTmFtZTogXCJ4LW1zLXZlcnNpb25cIixcbiAgICAgICAgICAgICAgICB4bWxOYW1lOiBcIngtbXMtdmVyc2lvblwiLFxuICAgICAgICAgICAgICAgIHR5cGU6IHtcbiAgICAgICAgICAgICAgICAgICAgbmFtZTogXCJTdHJpbmdcIixcbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIGRhdGU6IHtcbiAgICAgICAgICAgICAgICBzZXJpYWxpemVkTmFtZTogXCJkYXRlXCIsXG4gICAgICAgICAgICAgICAgeG1sTmFtZTogXCJkYXRlXCIsXG4gICAgICAgICAgICAgICAgdHlwZToge1xuICAgICAgICAgICAgICAgICAgICBuYW1lOiBcIkRhdGVUaW1lUmZjMTEyM1wiLFxuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICB9LFxuICAgICAgICB9LFxuICAgIH0sXG59O1xuY29uc3QgQmxvYlJlbGVhc2VMZWFzZUV4Y2VwdGlvbkhlYWRlcnMgPSB7XG4gICAgc2VyaWFsaXplZE5hbWU6IFwiQmxvYl9yZWxlYXNlTGVhc2VFeGNlcHRpb25IZWFkZXJzXCIsXG4gICAgdHlwZToge1xuICAgICAgICBuYW1lOiBcIkNvbXBvc2l0ZVwiLFxuICAgICAgICBjbGFzc05hbWU6IFwiQmxvYlJlbGVhc2VMZWFzZUV4Y2VwdGlvbkhlYWRlcnNcIixcbiAgICAgICAgbW9kZWxQcm9wZXJ0aWVzOiB7XG4gICAgICAgICAgICBlcnJvckNvZGU6IHtcbiAgICAgICAgICAgICAgICBzZXJpYWxpemVkTmFtZTogXCJ4LW1zLWVycm9yLWNvZGVcIixcbiAgICAgICAgICAgICAgICB4bWxOYW1lOiBcIngtbXMtZXJyb3ItY29kZVwiLFxuICAgICAgICAgICAgICAgIHR5cGU6IHtcbiAgICAgICAgICAgICAgICAgICAgbmFtZTogXCJTdHJpbmdcIixcbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgfSxcbiAgICAgICAgfSxcbiAgICB9LFxufTtcbmNvbnN0IEJsb2JSZW5ld0xlYXNlSGVhZGVycyA9IHtcbiAgICBzZXJpYWxpemVkTmFtZTogXCJCbG9iX3JlbmV3TGVhc2VIZWFkZXJzXCIsXG4gICAgdHlwZToge1xuICAgICAgICBuYW1lOiBcIkNvbXBvc2l0ZVwiLFxuICAgICAgICBjbGFzc05hbWU6IFwiQmxvYlJlbmV3TGVhc2VIZWFkZXJzXCIsXG4gICAgICAgIG1vZGVsUHJvcGVydGllczoge1xuICAgICAgICAgICAgZXRhZzoge1xuICAgICAgICAgICAgICAgIHNlcmlhbGl6ZWROYW1lOiBcImV0YWdcIixcbiAgICAgICAgICAgICAgICB4bWxOYW1lOiBcImV0YWdcIixcbiAgICAgICAgICAgICAgICB0eXBlOiB7XG4gICAgICAgICAgICAgICAgICAgIG5hbWU6IFwiU3RyaW5nXCIsXG4gICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBsYXN0TW9kaWZpZWQ6IHtcbiAgICAgICAgICAgICAgICBzZXJpYWxpemVkTmFtZTogXCJsYXN0LW1vZGlmaWVkXCIsXG4gICAgICAgICAgICAgICAgeG1sTmFtZTogXCJsYXN0LW1vZGlmaWVkXCIsXG4gICAgICAgICAgICAgICAgdHlwZToge1xuICAgICAgICAgICAgICAgICAgICBuYW1lOiBcIkRhdGVUaW1lUmZjMTEyM1wiLFxuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgbGVhc2VJZDoge1xuICAgICAgICAgICAgICAgIHNlcmlhbGl6ZWROYW1lOiBcIngtbXMtbGVhc2UtaWRcIixcbiAgICAgICAgICAgICAgICB4bWxOYW1lOiBcIngtbXMtbGVhc2UtaWRcIixcbiAgICAgICAgICAgICAgICB0eXBlOiB7XG4gICAgICAgICAgICAgICAgICAgIG5hbWU6IFwiU3RyaW5nXCIsXG4gICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBjbGllbnRSZXF1ZXN0SWQ6IHtcbiAgICAgICAgICAgICAgICBzZXJpYWxpemVkTmFtZTogXCJ4LW1zLWNsaWVudC1yZXF1ZXN0LWlkXCIsXG4gICAgICAgICAgICAgICAgeG1sTmFtZTogXCJ4LW1zLWNsaWVudC1yZXF1ZXN0LWlkXCIsXG4gICAgICAgICAgICAgICAgdHlwZToge1xuICAgICAgICAgICAgICAgICAgICBuYW1lOiBcIlN0cmluZ1wiLFxuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgcmVxdWVzdElkOiB7XG4gICAgICAgICAgICAgICAgc2VyaWFsaXplZE5hbWU6IFwieC1tcy1yZXF1ZXN0LWlkXCIsXG4gICAgICAgICAgICAgICAgeG1sTmFtZTogXCJ4LW1zLXJlcXVlc3QtaWRcIixcbiAgICAgICAgICAgICAgICB0eXBlOiB7XG4gICAgICAgICAgICAgICAgICAgIG5hbWU6IFwiU3RyaW5nXCIsXG4gICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICB2ZXJzaW9uOiB7XG4gICAgICAgICAgICAgICAgc2VyaWFsaXplZE5hbWU6IFwieC1tcy12ZXJzaW9uXCIsXG4gICAgICAgICAgICAgICAgeG1sTmFtZTogXCJ4LW1zLXZlcnNpb25cIixcbiAgICAgICAgICAgICAgICB0eXBlOiB7XG4gICAgICAgICAgICAgICAgICAgIG5hbWU6IFwiU3RyaW5nXCIsXG4gICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBkYXRlOiB7XG4gICAgICAgICAgICAgICAgc2VyaWFsaXplZE5hbWU6IFwiZGF0ZVwiLFxuICAgICAgICAgICAgICAgIHhtbE5hbWU6IFwiZGF0ZVwiLFxuICAgICAgICAgICAgICAgIHR5cGU6IHtcbiAgICAgICAgICAgICAgICAgICAgbmFtZTogXCJEYXRlVGltZVJmYzExMjNcIixcbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgfSxcbiAgICAgICAgfSxcbiAgICB9LFxufTtcbmNvbnN0IEJsb2JSZW5ld0xlYXNlRXhjZXB0aW9uSGVhZGVycyA9IHtcbiAgICBzZXJpYWxpemVkTmFtZTogXCJCbG9iX3JlbmV3TGVhc2VFeGNlcHRpb25IZWFkZXJzXCIsXG4gICAgdHlwZToge1xuICAgICAgICBuYW1lOiBcIkNvbXBvc2l0ZVwiLFxuICAgICAgICBjbGFzc05hbWU6IFwiQmxvYlJlbmV3TGVhc2VFeGNlcHRpb25IZWFkZXJzXCIsXG4gICAgICAgIG1vZGVsUHJvcGVydGllczoge1xuICAgICAgICAgICAgZXJyb3JDb2RlOiB7XG4gICAgICAgICAgICAgICAgc2VyaWFsaXplZE5hbWU6IFwieC1tcy1lcnJvci1jb2RlXCIsXG4gICAgICAgICAgICAgICAgeG1sTmFtZTogXCJ4LW1zLWVycm9yLWNvZGVcIixcbiAgICAgICAgICAgICAgICB0eXBlOiB7XG4gICAgICAgICAgICAgICAgICAgIG5hbWU6IFwiU3RyaW5nXCIsXG4gICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIH0sXG4gICAgICAgIH0sXG4gICAgfSxcbn07XG5jb25zdCBCbG9iQ2hhbmdlTGVhc2VIZWFkZXJzID0ge1xuICAgIHNlcmlhbGl6ZWROYW1lOiBcIkJsb2JfY2hhbmdlTGVhc2VIZWFkZXJzXCIsXG4gICAgdHlwZToge1xuICAgICAgICBuYW1lOiBcIkNvbXBvc2l0ZVwiLFxuICAgICAgICBjbGFzc05hbWU6IFwiQmxvYkNoYW5nZUxlYXNlSGVhZGVyc1wiLFxuICAgICAgICBtb2RlbFByb3BlcnRpZXM6IHtcbiAgICAgICAgICAgIGV0YWc6IHtcbiAgICAgICAgICAgICAgICBzZXJpYWxpemVkTmFtZTogXCJldGFnXCIsXG4gICAgICAgICAgICAgICAgeG1sTmFtZTogXCJldGFnXCIsXG4gICAgICAgICAgICAgICAgdHlwZToge1xuICAgICAgICAgICAgICAgICAgICBuYW1lOiBcIlN0cmluZ1wiLFxuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgbGFzdE1vZGlmaWVkOiB7XG4gICAgICAgICAgICAgICAgc2VyaWFsaXplZE5hbWU6IFwibGFzdC1tb2RpZmllZFwiLFxuICAgICAgICAgICAgICAgIHhtbE5hbWU6IFwibGFzdC1tb2RpZmllZFwiLFxuICAgICAgICAgICAgICAgIHR5cGU6IHtcbiAgICAgICAgICAgICAgICAgICAgbmFtZTogXCJEYXRlVGltZVJmYzExMjNcIixcbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIGNsaWVudFJlcXVlc3RJZDoge1xuICAgICAgICAgICAgICAgIHNlcmlhbGl6ZWROYW1lOiBcIngtbXMtY2xpZW50LXJlcXVlc3QtaWRcIixcbiAgICAgICAgICAgICAgICB4bWxOYW1lOiBcIngtbXMtY2xpZW50LXJlcXVlc3QtaWRcIixcbiAgICAgICAgICAgICAgICB0eXBlOiB7XG4gICAgICAgICAgICAgICAgICAgIG5hbWU6IFwiU3RyaW5nXCIsXG4gICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICByZXF1ZXN0SWQ6IHtcbiAgICAgICAgICAgICAgICBzZXJpYWxpemVkTmFtZTogXCJ4LW1zLXJlcXVlc3QtaWRcIixcbiAgICAgICAgICAgICAgICB4bWxOYW1lOiBcIngtbXMtcmVxdWVzdC1pZFwiLFxuICAgICAgICAgICAgICAgIHR5cGU6IHtcbiAgICAgICAgICAgICAgICAgICAgbmFtZTogXCJTdHJpbmdcIixcbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIGxlYXNlSWQ6IHtcbiAgICAgICAgICAgICAgICBzZXJpYWxpemVkTmFtZTogXCJ4LW1zLWxlYXNlLWlkXCIsXG4gICAgICAgICAgICAgICAgeG1sTmFtZTogXCJ4LW1zLWxlYXNlLWlkXCIsXG4gICAgICAgICAgICAgICAgdHlwZToge1xuICAgICAgICAgICAgICAgICAgICBuYW1lOiBcIlN0cmluZ1wiLFxuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgdmVyc2lvbjoge1xuICAgICAgICAgICAgICAgIHNlcmlhbGl6ZWROYW1lOiBcIngtbXMtdmVyc2lvblwiLFxuICAgICAgICAgICAgICAgIHhtbE5hbWU6IFwieC1tcy12ZXJzaW9uXCIsXG4gICAgICAgICAgICAgICAgdHlwZToge1xuICAgICAgICAgICAgICAgICAgICBuYW1lOiBcIlN0cmluZ1wiLFxuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgZGF0ZToge1xuICAgICAgICAgICAgICAgIHNlcmlhbGl6ZWROYW1lOiBcImRhdGVcIixcbiAgICAgICAgICAgICAgICB4bWxOYW1lOiBcImRhdGVcIixcbiAgICAgICAgICAgICAgICB0eXBlOiB7XG4gICAgICAgICAgICAgICAgICAgIG5hbWU6IFwiRGF0ZVRpbWVSZmMxMTIzXCIsXG4gICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIH0sXG4gICAgICAgIH0sXG4gICAgfSxcbn07XG5jb25zdCBCbG9iQ2hhbmdlTGVhc2VFeGNlcHRpb25IZWFkZXJzID0ge1xuICAgIHNlcmlhbGl6ZWROYW1lOiBcIkJsb2JfY2hhbmdlTGVhc2VFeGNlcHRpb25IZWFkZXJzXCIsXG4gICAgdHlwZToge1xuICAgICAgICBuYW1lOiBcIkNvbXBvc2l0ZVwiLFxuICAgICAgICBjbGFzc05hbWU6IFwiQmxvYkNoYW5nZUxlYXNlRXhjZXB0aW9uSGVhZGVyc1wiLFxuICAgICAgICBtb2RlbFByb3BlcnRpZXM6IHtcbiAgICAgICAgICAgIGVycm9yQ29kZToge1xuICAgICAgICAgICAgICAgIHNlcmlhbGl6ZWROYW1lOiBcIngtbXMtZXJyb3ItY29kZVwiLFxuICAgICAgICAgICAgICAgIHhtbE5hbWU6IFwieC1tcy1lcnJvci1jb2RlXCIsXG4gICAgICAgICAgICAgICAgdHlwZToge1xuICAgICAgICAgICAgICAgICAgICBuYW1lOiBcIlN0cmluZ1wiLFxuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICB9LFxuICAgICAgICB9LFxuICAgIH0sXG59O1xuY29uc3QgQmxvYkJyZWFrTGVhc2VIZWFkZXJzID0ge1xuICAgIHNlcmlhbGl6ZWROYW1lOiBcIkJsb2JfYnJlYWtMZWFzZUhlYWRlcnNcIixcbiAgICB0eXBlOiB7XG4gICAgICAgIG5hbWU6IFwiQ29tcG9zaXRlXCIsXG4gICAgICAgIGNsYXNzTmFtZTogXCJCbG9iQnJlYWtMZWFzZUhlYWRlcnNcIixcbiAgICAgICAgbW9kZWxQcm9wZXJ0aWVzOiB7XG4gICAgICAgICAgICBldGFnOiB7XG4gICAgICAgICAgICAgICAgc2VyaWFsaXplZE5hbWU6IFwiZXRhZ1wiLFxuICAgICAgICAgICAgICAgIHhtbE5hbWU6IFwiZXRhZ1wiLFxuICAgICAgICAgICAgICAgIHR5cGU6IHtcbiAgICAgICAgICAgICAgICAgICAgbmFtZTogXCJTdHJpbmdcIixcbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIGxhc3RNb2RpZmllZDoge1xuICAgICAgICAgICAgICAgIHNlcmlhbGl6ZWROYW1lOiBcImxhc3QtbW9kaWZpZWRcIixcbiAgICAgICAgICAgICAgICB4bWxOYW1lOiBcImxhc3QtbW9kaWZpZWRcIixcbiAgICAgICAgICAgICAgICB0eXBlOiB7XG4gICAgICAgICAgICAgICAgICAgIG5hbWU6IFwiRGF0ZVRpbWVSZmMxMTIzXCIsXG4gICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBsZWFzZVRpbWU6IHtcbiAgICAgICAgICAgICAgICBzZXJpYWxpemVkTmFtZTogXCJ4LW1zLWxlYXNlLXRpbWVcIixcbiAgICAgICAgICAgICAgICB4bWxOYW1lOiBcIngtbXMtbGVhc2UtdGltZVwiLFxuICAgICAgICAgICAgICAgIHR5cGU6IHtcbiAgICAgICAgICAgICAgICAgICAgbmFtZTogXCJOdW1iZXJcIixcbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIGNsaWVudFJlcXVlc3RJZDoge1xuICAgICAgICAgICAgICAgIHNlcmlhbGl6ZWROYW1lOiBcIngtbXMtY2xpZW50LXJlcXVlc3QtaWRcIixcbiAgICAgICAgICAgICAgICB4bWxOYW1lOiBcIngtbXMtY2xpZW50LXJlcXVlc3QtaWRcIixcbiAgICAgICAgICAgICAgICB0eXBlOiB7XG4gICAgICAgICAgICAgICAgICAgIG5hbWU6IFwiU3RyaW5nXCIsXG4gICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICByZXF1ZXN0SWQ6IHtcbiAgICAgICAgICAgICAgICBzZXJpYWxpemVkTmFtZTogXCJ4LW1zLXJlcXVlc3QtaWRcIixcbiAgICAgICAgICAgICAgICB4bWxOYW1lOiBcIngtbXMtcmVxdWVzdC1pZFwiLFxuICAgICAgICAgICAgICAgIHR5cGU6IHtcbiAgICAgICAgICAgICAgICAgICAgbmFtZTogXCJTdHJpbmdcIixcbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIHZlcnNpb246IHtcbiAgICAgICAgICAgICAgICBzZXJpYWxpemVkTmFtZTogXCJ4LW1zLXZlcnNpb25cIixcbiAgICAgICAgICAgICAgICB4bWxOYW1lOiBcIngtbXMtdmVyc2lvblwiLFxuICAgICAgICAgICAgICAgIHR5cGU6IHtcbiAgICAgICAgICAgICAgICAgICAgbmFtZTogXCJTdHJpbmdcIixcbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIGRhdGU6IHtcbiAgICAgICAgICAgICAgICBzZXJpYWxpemVkTmFtZTogXCJkYXRlXCIsXG4gICAgICAgICAgICAgICAgeG1sTmFtZTogXCJkYXRlXCIsXG4gICAgICAgICAgICAgICAgdHlwZToge1xuICAgICAgICAgICAgICAgICAgICBuYW1lOiBcIkRhdGVUaW1lUmZjMTEyM1wiLFxuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICB9LFxuICAgICAgICB9LFxuICAgIH0sXG59O1xuY29uc3QgQmxvYkJyZWFrTGVhc2VFeGNlcHRpb25IZWFkZXJzID0ge1xuICAgIHNlcmlhbGl6ZWROYW1lOiBcIkJsb2JfYnJlYWtMZWFzZUV4Y2VwdGlvbkhlYWRlcnNcIixcbiAgICB0eXBlOiB7XG4gICAgICAgIG5hbWU6IFwiQ29tcG9zaXRlXCIsXG4gICAgICAgIGNsYXNzTmFtZTogXCJCbG9iQnJlYWtMZWFzZUV4Y2VwdGlvbkhlYWRlcnNcIixcbiAgICAgICAgbW9kZWxQcm9wZXJ0aWVzOiB7XG4gICAgICAgICAgICBlcnJvckNvZGU6IHtcbiAgICAgICAgICAgICAgICBzZXJpYWxpemVkTmFtZTogXCJ4LW1zLWVycm9yLWNvZGVcIixcbiAgICAgICAgICAgICAgICB4bWxOYW1lOiBcIngtbXMtZXJyb3ItY29kZVwiLFxuICAgICAgICAgICAgICAgIHR5cGU6IHtcbiAgICAgICAgICAgICAgICAgICAgbmFtZTogXCJTdHJpbmdcIixcbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgfSxcbiAgICAgICAgfSxcbiAgICB9LFxufTtcbmNvbnN0IEJsb2JDcmVhdGVTbmFwc2hvdEhlYWRlcnMgPSB7XG4gICAgc2VyaWFsaXplZE5hbWU6IFwiQmxvYl9jcmVhdGVTbmFwc2hvdEhlYWRlcnNcIixcbiAgICB0eXBlOiB7XG4gICAgICAgIG5hbWU6IFwiQ29tcG9zaXRlXCIsXG4gICAgICAgIGNsYXNzTmFtZTogXCJCbG9iQ3JlYXRlU25hcHNob3RIZWFkZXJzXCIsXG4gICAgICAgIG1vZGVsUHJvcGVydGllczoge1xuICAgICAgICAgICAgc25hcHNob3Q6IHtcbiAgICAgICAgICAgICAgICBzZXJpYWxpemVkTmFtZTogXCJ4LW1zLXNuYXBzaG90XCIsXG4gICAgICAgICAgICAgICAgeG1sTmFtZTogXCJ4LW1zLXNuYXBzaG90XCIsXG4gICAgICAgICAgICAgICAgdHlwZToge1xuICAgICAgICAgICAgICAgICAgICBuYW1lOiBcIlN0cmluZ1wiLFxuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgZXRhZzoge1xuICAgICAgICAgICAgICAgIHNlcmlhbGl6ZWROYW1lOiBcImV0YWdcIixcbiAgICAgICAgICAgICAgICB4bWxOYW1lOiBcImV0YWdcIixcbiAgICAgICAgICAgICAgICB0eXBlOiB7XG4gICAgICAgICAgICAgICAgICAgIG5hbWU6IFwiU3RyaW5nXCIsXG4gICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBsYXN0TW9kaWZpZWQ6IHtcbiAgICAgICAgICAgICAgICBzZXJpYWxpemVkTmFtZTogXCJsYXN0LW1vZGlmaWVkXCIsXG4gICAgICAgICAgICAgICAgeG1sTmFtZTogXCJsYXN0LW1vZGlmaWVkXCIsXG4gICAgICAgICAgICAgICAgdHlwZToge1xuICAgICAgICAgICAgICAgICAgICBuYW1lOiBcIkRhdGVUaW1lUmZjMTEyM1wiLFxuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgY2xpZW50UmVxdWVzdElkOiB7XG4gICAgICAgICAgICAgICAgc2VyaWFsaXplZE5hbWU6IFwieC1tcy1jbGllbnQtcmVxdWVzdC1pZFwiLFxuICAgICAgICAgICAgICAgIHhtbE5hbWU6IFwieC1tcy1jbGllbnQtcmVxdWVzdC1pZFwiLFxuICAgICAgICAgICAgICAgIHR5cGU6IHtcbiAgICAgICAgICAgICAgICAgICAgbmFtZTogXCJTdHJpbmdcIixcbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIHJlcXVlc3RJZDoge1xuICAgICAgICAgICAgICAgIHNlcmlhbGl6ZWROYW1lOiBcIngtbXMtcmVxdWVzdC1pZFwiLFxuICAgICAgICAgICAgICAgIHhtbE5hbWU6IFwieC1tcy1yZXF1ZXN0LWlkXCIsXG4gICAgICAgICAgICAgICAgdHlwZToge1xuICAgICAgICAgICAgICAgICAgICBuYW1lOiBcIlN0cmluZ1wiLFxuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgdmVyc2lvbjoge1xuICAgICAgICAgICAgICAgIHNlcmlhbGl6ZWROYW1lOiBcIngtbXMtdmVyc2lvblwiLFxuICAgICAgICAgICAgICAgIHhtbE5hbWU6IFwieC1tcy12ZXJzaW9uXCIsXG4gICAgICAgICAgICAgICAgdHlwZToge1xuICAgICAgICAgICAgICAgICAgICBuYW1lOiBcIlN0cmluZ1wiLFxuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgdmVyc2lvbklkOiB7XG4gICAgICAgICAgICAgICAgc2VyaWFsaXplZE5hbWU6IFwieC1tcy12ZXJzaW9uLWlkXCIsXG4gICAgICAgICAgICAgICAgeG1sTmFtZTogXCJ4LW1zLXZlcnNpb24taWRcIixcbiAgICAgICAgICAgICAgICB0eXBlOiB7XG4gICAgICAgICAgICAgICAgICAgIG5hbWU6IFwiU3RyaW5nXCIsXG4gICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBkYXRlOiB7XG4gICAgICAgICAgICAgICAgc2VyaWFsaXplZE5hbWU6IFwiZGF0ZVwiLFxuICAgICAgICAgICAgICAgIHhtbE5hbWU6IFwiZGF0ZVwiLFxuICAgICAgICAgICAgICAgIHR5cGU6IHtcbiAgICAgICAgICAgICAgICAgICAgbmFtZTogXCJEYXRlVGltZVJmYzExMjNcIixcbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIGlzU2VydmVyRW5jcnlwdGVkOiB7XG4gICAgICAgICAgICAgICAgc2VyaWFsaXplZE5hbWU6IFwieC1tcy1yZXF1ZXN0LXNlcnZlci1lbmNyeXB0ZWRcIixcbiAgICAgICAgICAgICAgICB4bWxOYW1lOiBcIngtbXMtcmVxdWVzdC1zZXJ2ZXItZW5jcnlwdGVkXCIsXG4gICAgICAgICAgICAgICAgdHlwZToge1xuICAgICAgICAgICAgICAgICAgICBuYW1lOiBcIkJvb2xlYW5cIixcbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIGVycm9yQ29kZToge1xuICAgICAgICAgICAgICAgIHNlcmlhbGl6ZWROYW1lOiBcIngtbXMtZXJyb3ItY29kZVwiLFxuICAgICAgICAgICAgICAgIHhtbE5hbWU6IFwieC1tcy1lcnJvci1jb2RlXCIsXG4gICAgICAgICAgICAgICAgdHlwZToge1xuICAgICAgICAgICAgICAgICAgICBuYW1lOiBcIlN0cmluZ1wiLFxuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICB9LFxuICAgICAgICB9LFxuICAgIH0sXG59O1xuY29uc3QgQmxvYkNyZWF0ZVNuYXBzaG90RXhjZXB0aW9uSGVhZGVycyA9IHtcbiAgICBzZXJpYWxpemVkTmFtZTogXCJCbG9iX2NyZWF0ZVNuYXBzaG90RXhjZXB0aW9uSGVhZGVyc1wiLFxuICAgIHR5cGU6IHtcbiAgICAgICAgbmFtZTogXCJDb21wb3NpdGVcIixcbiAgICAgICAgY2xhc3NOYW1lOiBcIkJsb2JDcmVhdGVTbmFwc2hvdEV4Y2VwdGlvbkhlYWRlcnNcIixcbiAgICAgICAgbW9kZWxQcm9wZXJ0aWVzOiB7XG4gICAgICAgICAgICBlcnJvckNvZGU6IHtcbiAgICAgICAgICAgICAgICBzZXJpYWxpemVkTmFtZTogXCJ4LW1zLWVycm9yLWNvZGVcIixcbiAgICAgICAgICAgICAgICB4bWxOYW1lOiBcIngtbXMtZXJyb3ItY29kZVwiLFxuICAgICAgICAgICAgICAgIHR5cGU6IHtcbiAgICAgICAgICAgICAgICAgICAgbmFtZTogXCJTdHJpbmdcIixcbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgfSxcbiAgICAgICAgfSxcbiAgICB9LFxufTtcbmNvbnN0IEJsb2JTdGFydENvcHlGcm9tVVJMSGVhZGVycyA9IHtcbiAgICBzZXJpYWxpemVkTmFtZTogXCJCbG9iX3N0YXJ0Q29weUZyb21VUkxIZWFkZXJzXCIsXG4gICAgdHlwZToge1xuICAgICAgICBuYW1lOiBcIkNvbXBvc2l0ZVwiLFxuICAgICAgICBjbGFzc05hbWU6IFwiQmxvYlN0YXJ0Q29weUZyb21VUkxIZWFkZXJzXCIsXG4gICAgICAgIG1vZGVsUHJvcGVydGllczoge1xuICAgICAgICAgICAgZXRhZzoge1xuICAgICAgICAgICAgICAgIHNlcmlhbGl6ZWROYW1lOiBcImV0YWdcIixcbiAgICAgICAgICAgICAgICB4bWxOYW1lOiBcImV0YWdcIixcbiAgICAgICAgICAgICAgICB0eXBlOiB7XG4gICAgICAgICAgICAgICAgICAgIG5hbWU6IFwiU3RyaW5nXCIsXG4gICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBsYXN0TW9kaWZpZWQ6IHtcbiAgICAgICAgICAgICAgICBzZXJpYWxpemVkTmFtZTogXCJsYXN0LW1vZGlmaWVkXCIsXG4gICAgICAgICAgICAgICAgeG1sTmFtZTogXCJsYXN0LW1vZGlmaWVkXCIsXG4gICAgICAgICAgICAgICAgdHlwZToge1xuICAgICAgICAgICAgICAgICAgICBuYW1lOiBcIkRhdGVUaW1lUmZjMTEyM1wiLFxuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgY2xpZW50UmVxdWVzdElkOiB7XG4gICAgICAgICAgICAgICAgc2VyaWFsaXplZE5hbWU6IFwieC1tcy1jbGllbnQtcmVxdWVzdC1pZFwiLFxuICAgICAgICAgICAgICAgIHhtbE5hbWU6IFwieC1tcy1jbGllbnQtcmVxdWVzdC1pZFwiLFxuICAgICAgICAgICAgICAgIHR5cGU6IHtcbiAgICAgICAgICAgICAgICAgICAgbmFtZTogXCJTdHJpbmdcIixcbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIHJlcXVlc3RJZDoge1xuICAgICAgICAgICAgICAgIHNlcmlhbGl6ZWROYW1lOiBcIngtbXMtcmVxdWVzdC1pZFwiLFxuICAgICAgICAgICAgICAgIHhtbE5hbWU6IFwieC1tcy1yZXF1ZXN0LWlkXCIsXG4gICAgICAgICAgICAgICAgdHlwZToge1xuICAgICAgICAgICAgICAgICAgICBuYW1lOiBcIlN0cmluZ1wiLFxuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgdmVyc2lvbjoge1xuICAgICAgICAgICAgICAgIHNlcmlhbGl6ZWROYW1lOiBcIngtbXMtdmVyc2lvblwiLFxuICAgICAgICAgICAgICAgIHhtbE5hbWU6IFwieC1tcy12ZXJzaW9uXCIsXG4gICAgICAgICAgICAgICAgdHlwZToge1xuICAgICAgICAgICAgICAgICAgICBuYW1lOiBcIlN0cmluZ1wiLFxuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgdmVyc2lvbklkOiB7XG4gICAgICAgICAgICAgICAgc2VyaWFsaXplZE5hbWU6IFwieC1tcy12ZXJzaW9uLWlkXCIsXG4gICAgICAgICAgICAgICAgeG1sTmFtZTogXCJ4LW1zLXZlcnNpb24taWRcIixcbiAgICAgICAgICAgICAgICB0eXBlOiB7XG4gICAgICAgICAgICAgICAgICAgIG5hbWU6IFwiU3RyaW5nXCIsXG4gICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBkYXRlOiB7XG4gICAgICAgICAgICAgICAgc2VyaWFsaXplZE5hbWU6IFwiZGF0ZVwiLFxuICAgICAgICAgICAgICAgIHhtbE5hbWU6IFwiZGF0ZVwiLFxuICAgICAgICAgICAgICAgIHR5cGU6IHtcbiAgICAgICAgICAgICAgICAgICAgbmFtZTogXCJEYXRlVGltZVJmYzExMjNcIixcbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIGNvcHlJZDoge1xuICAgICAgICAgICAgICAgIHNlcmlhbGl6ZWROYW1lOiBcIngtbXMtY29weS1pZFwiLFxuICAgICAgICAgICAgICAgIHhtbE5hbWU6IFwieC1tcy1jb3B5LWlkXCIsXG4gICAgICAgICAgICAgICAgdHlwZToge1xuICAgICAgICAgICAgICAgICAgICBuYW1lOiBcIlN0cmluZ1wiLFxuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgY29weVN0YXR1czoge1xuICAgICAgICAgICAgICAgIHNlcmlhbGl6ZWROYW1lOiBcIngtbXMtY29weS1zdGF0dXNcIixcbiAgICAgICAgICAgICAgICB4bWxOYW1lOiBcIngtbXMtY29weS1zdGF0dXNcIixcbiAgICAgICAgICAgICAgICB0eXBlOiB7XG4gICAgICAgICAgICAgICAgICAgIG5hbWU6IFwiRW51bVwiLFxuICAgICAgICAgICAgICAgICAgICBhbGxvd2VkVmFsdWVzOiBbXCJwZW5kaW5nXCIsIFwic3VjY2Vzc1wiLCBcImFib3J0ZWRcIiwgXCJmYWlsZWRcIl0sXG4gICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBlcnJvckNvZGU6IHtcbiAgICAgICAgICAgICAgICBzZXJpYWxpemVkTmFtZTogXCJ4LW1zLWVycm9yLWNvZGVcIixcbiAgICAgICAgICAgICAgICB4bWxOYW1lOiBcIngtbXMtZXJyb3ItY29kZVwiLFxuICAgICAgICAgICAgICAgIHR5cGU6IHtcbiAgICAgICAgICAgICAgICAgICAgbmFtZTogXCJTdHJpbmdcIixcbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgfSxcbiAgICAgICAgfSxcbiAgICB9LFxufTtcbmNvbnN0IEJsb2JTdGFydENvcHlGcm9tVVJMRXhjZXB0aW9uSGVhZGVycyA9IHtcbiAgICBzZXJpYWxpemVkTmFtZTogXCJCbG9iX3N0YXJ0Q29weUZyb21VUkxFeGNlcHRpb25IZWFkZXJzXCIsXG4gICAgdHlwZToge1xuICAgICAgICBuYW1lOiBcIkNvbXBvc2l0ZVwiLFxuICAgICAgICBjbGFzc05hbWU6IFwiQmxvYlN0YXJ0Q29weUZyb21VUkxFeGNlcHRpb25IZWFkZXJzXCIsXG4gICAgICAgIG1vZGVsUHJvcGVydGllczoge1xuICAgICAgICAgICAgZXJyb3JDb2RlOiB7XG4gICAgICAgICAgICAgICAgc2VyaWFsaXplZE5hbWU6IFwieC1tcy1lcnJvci1jb2RlXCIsXG4gICAgICAgICAgICAgICAgeG1sTmFtZTogXCJ4LW1zLWVycm9yLWNvZGVcIixcbiAgICAgICAgICAgICAgICB0eXBlOiB7XG4gICAgICAgICAgICAgICAgICAgIG5hbWU6IFwiU3RyaW5nXCIsXG4gICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIH0sXG4gICAgICAgIH0sXG4gICAgfSxcbn07XG5jb25zdCBCbG9iQ29weUZyb21VUkxIZWFkZXJzID0ge1xuICAgIHNlcmlhbGl6ZWROYW1lOiBcIkJsb2JfY29weUZyb21VUkxIZWFkZXJzXCIsXG4gICAgdHlwZToge1xuICAgICAgICBuYW1lOiBcIkNvbXBvc2l0ZVwiLFxuICAgICAgICBjbGFzc05hbWU6IFwiQmxvYkNvcHlGcm9tVVJMSGVhZGVyc1wiLFxuICAgICAgICBtb2RlbFByb3BlcnRpZXM6IHtcbiAgICAgICAgICAgIGV0YWc6IHtcbiAgICAgICAgICAgICAgICBzZXJpYWxpemVkTmFtZTogXCJldGFnXCIsXG4gICAgICAgICAgICAgICAgeG1sTmFtZTogXCJldGFnXCIsXG4gICAgICAgICAgICAgICAgdHlwZToge1xuICAgICAgICAgICAgICAgICAgICBuYW1lOiBcIlN0cmluZ1wiLFxuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgbGFzdE1vZGlmaWVkOiB7XG4gICAgICAgICAgICAgICAgc2VyaWFsaXplZE5hbWU6IFwibGFzdC1tb2RpZmllZFwiLFxuICAgICAgICAgICAgICAgIHhtbE5hbWU6IFwibGFzdC1tb2RpZmllZFwiLFxuICAgICAgICAgICAgICAgIHR5cGU6IHtcbiAgICAgICAgICAgICAgICAgICAgbmFtZTogXCJEYXRlVGltZVJmYzExMjNcIixcbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIGNsaWVudFJlcXVlc3RJZDoge1xuICAgICAgICAgICAgICAgIHNlcmlhbGl6ZWROYW1lOiBcIngtbXMtY2xpZW50LXJlcXVlc3QtaWRcIixcbiAgICAgICAgICAgICAgICB4bWxOYW1lOiBcIngtbXMtY2xpZW50LXJlcXVlc3QtaWRcIixcbiAgICAgICAgICAgICAgICB0eXBlOiB7XG4gICAgICAgICAgICAgICAgICAgIG5hbWU6IFwiU3RyaW5nXCIsXG4gICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICByZXF1ZXN0SWQ6IHtcbiAgICAgICAgICAgICAgICBzZXJpYWxpemVkTmFtZTogXCJ4LW1zLXJlcXVlc3QtaWRcIixcbiAgICAgICAgICAgICAgICB4bWxOYW1lOiBcIngtbXMtcmVxdWVzdC1pZFwiLFxuICAgICAgICAgICAgICAgIHR5cGU6IHtcbiAgICAgICAgICAgICAgICAgICAgbmFtZTogXCJTdHJpbmdcIixcbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIHZlcnNpb246IHtcbiAgICAgICAgICAgICAgICBzZXJpYWxpemVkTmFtZTogXCJ4LW1zLXZlcnNpb25cIixcbiAgICAgICAgICAgICAgICB4bWxOYW1lOiBcIngtbXMtdmVyc2lvblwiLFxuICAgICAgICAgICAgICAgIHR5cGU6IHtcbiAgICAgICAgICAgICAgICAgICAgbmFtZTogXCJTdHJpbmdcIixcbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIHZlcnNpb25JZDoge1xuICAgICAgICAgICAgICAgIHNlcmlhbGl6ZWROYW1lOiBcIngtbXMtdmVyc2lvbi1pZFwiLFxuICAgICAgICAgICAgICAgIHhtbE5hbWU6IFwieC1tcy12ZXJzaW9uLWlkXCIsXG4gICAgICAgICAgICAgICAgdHlwZToge1xuICAgICAgICAgICAgICAgICAgICBuYW1lOiBcIlN0cmluZ1wiLFxuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgZGF0ZToge1xuICAgICAgICAgICAgICAgIHNlcmlhbGl6ZWROYW1lOiBcImRhdGVcIixcbiAgICAgICAgICAgICAgICB4bWxOYW1lOiBcImRhdGVcIixcbiAgICAgICAgICAgICAgICB0eXBlOiB7XG4gICAgICAgICAgICAgICAgICAgIG5hbWU6IFwiRGF0ZVRpbWVSZmMxMTIzXCIsXG4gICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBjb3B5SWQ6IHtcbiAgICAgICAgICAgICAgICBzZXJpYWxpemVkTmFtZTogXCJ4LW1zLWNvcHktaWRcIixcbiAgICAgICAgICAgICAgICB4bWxOYW1lOiBcIngtbXMtY29weS1pZFwiLFxuICAgICAgICAgICAgICAgIHR5cGU6IHtcbiAgICAgICAgICAgICAgICAgICAgbmFtZTogXCJTdHJpbmdcIixcbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIGNvcHlTdGF0dXM6IHtcbiAgICAgICAgICAgICAgICBkZWZhdWx0VmFsdWU6IFwic3VjY2Vzc1wiLFxuICAgICAgICAgICAgICAgIGlzQ29uc3RhbnQ6IHRydWUsXG4gICAgICAgICAgICAgICAgc2VyaWFsaXplZE5hbWU6IFwieC1tcy1jb3B5LXN0YXR1c1wiLFxuICAgICAgICAgICAgICAgIHR5cGU6IHtcbiAgICAgICAgICAgICAgICAgICAgbmFtZTogXCJTdHJpbmdcIixcbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIGNvbnRlbnRNRDU6IHtcbiAgICAgICAgICAgICAgICBzZXJpYWxpemVkTmFtZTogXCJjb250ZW50LW1kNVwiLFxuICAgICAgICAgICAgICAgIHhtbE5hbWU6IFwiY29udGVudC1tZDVcIixcbiAgICAgICAgICAgICAgICB0eXBlOiB7XG4gICAgICAgICAgICAgICAgICAgIG5hbWU6IFwiQnl0ZUFycmF5XCIsXG4gICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICB4TXNDb250ZW50Q3JjNjQ6IHtcbiAgICAgICAgICAgICAgICBzZXJpYWxpemVkTmFtZTogXCJ4LW1zLWNvbnRlbnQtY3JjNjRcIixcbiAgICAgICAgICAgICAgICB4bWxOYW1lOiBcIngtbXMtY29udGVudC1jcmM2NFwiLFxuICAgICAgICAgICAgICAgIHR5cGU6IHtcbiAgICAgICAgICAgICAgICAgICAgbmFtZTogXCJCeXRlQXJyYXlcIixcbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIGVuY3J5cHRpb25TY29wZToge1xuICAgICAgICAgICAgICAgIHNlcmlhbGl6ZWROYW1lOiBcIngtbXMtZW5jcnlwdGlvbi1zY29wZVwiLFxuICAgICAgICAgICAgICAgIHhtbE5hbWU6IFwieC1tcy1lbmNyeXB0aW9uLXNjb3BlXCIsXG4gICAgICAgICAgICAgICAgdHlwZToge1xuICAgICAgICAgICAgICAgICAgICBuYW1lOiBcIlN0cmluZ1wiLFxuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgZXJyb3JDb2RlOiB7XG4gICAgICAgICAgICAgICAgc2VyaWFsaXplZE5hbWU6IFwieC1tcy1lcnJvci1jb2RlXCIsXG4gICAgICAgICAgICAgICAgeG1sTmFtZTogXCJ4LW1zLWVycm9yLWNvZGVcIixcbiAgICAgICAgICAgICAgICB0eXBlOiB7XG4gICAgICAgICAgICAgICAgICAgIG5hbWU6IFwiU3RyaW5nXCIsXG4gICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIH0sXG4gICAgICAgIH0sXG4gICAgfSxcbn07XG5jb25zdCBCbG9iQ29weUZyb21VUkxFeGNlcHRpb25IZWFkZXJzID0ge1xuICAgIHNlcmlhbGl6ZWROYW1lOiBcIkJsb2JfY29weUZyb21VUkxFeGNlcHRpb25IZWFkZXJzXCIsXG4gICAgdHlwZToge1xuICAgICAgICBuYW1lOiBcIkNvbXBvc2l0ZVwiLFxuICAgICAgICBjbGFzc05hbWU6IFwiQmxvYkNvcHlGcm9tVVJMRXhjZXB0aW9uSGVhZGVyc1wiLFxuICAgICAgICBtb2RlbFByb3BlcnRpZXM6IHtcbiAgICAgICAgICAgIGVycm9yQ29kZToge1xuICAgICAgICAgICAgICAgIHNlcmlhbGl6ZWROYW1lOiBcIngtbXMtZXJyb3ItY29kZVwiLFxuICAgICAgICAgICAgICAgIHhtbE5hbWU6IFwieC1tcy1lcnJvci1jb2RlXCIsXG4gICAgICAgICAgICAgICAgdHlwZToge1xuICAgICAgICAgICAgICAgICAgICBuYW1lOiBcIlN0cmluZ1wiLFxuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICB9LFxuICAgICAgICB9LFxuICAgIH0sXG59O1xuY29uc3QgQmxvYkFib3J0Q29weUZyb21VUkxIZWFkZXJzID0ge1xuICAgIHNlcmlhbGl6ZWROYW1lOiBcIkJsb2JfYWJvcnRDb3B5RnJvbVVSTEhlYWRlcnNcIixcbiAgICB0eXBlOiB7XG4gICAgICAgIG5hbWU6IFwiQ29tcG9zaXRlXCIsXG4gICAgICAgIGNsYXNzTmFtZTogXCJCbG9iQWJvcnRDb3B5RnJvbVVSTEhlYWRlcnNcIixcbiAgICAgICAgbW9kZWxQcm9wZXJ0aWVzOiB7XG4gICAgICAgICAgICBjbGllbnRSZXF1ZXN0SWQ6IHtcbiAgICAgICAgICAgICAgICBzZXJpYWxpemVkTmFtZTogXCJ4LW1zLWNsaWVudC1yZXF1ZXN0LWlkXCIsXG4gICAgICAgICAgICAgICAgeG1sTmFtZTogXCJ4LW1zLWNsaWVudC1yZXF1ZXN0LWlkXCIsXG4gICAgICAgICAgICAgICAgdHlwZToge1xuICAgICAgICAgICAgICAgICAgICBuYW1lOiBcIlN0cmluZ1wiLFxuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgcmVxdWVzdElkOiB7XG4gICAgICAgICAgICAgICAgc2VyaWFsaXplZE5hbWU6IFwieC1tcy1yZXF1ZXN0LWlkXCIsXG4gICAgICAgICAgICAgICAgeG1sTmFtZTogXCJ4LW1zLXJlcXVlc3QtaWRcIixcbiAgICAgICAgICAgICAgICB0eXBlOiB7XG4gICAgICAgICAgICAgICAgICAgIG5hbWU6IFwiU3RyaW5nXCIsXG4gICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICB2ZXJzaW9uOiB7XG4gICAgICAgICAgICAgICAgc2VyaWFsaXplZE5hbWU6IFwieC1tcy12ZXJzaW9uXCIsXG4gICAgICAgICAgICAgICAgeG1sTmFtZTogXCJ4LW1zLXZlcnNpb25cIixcbiAgICAgICAgICAgICAgICB0eXBlOiB7XG4gICAgICAgICAgICAgICAgICAgIG5hbWU6IFwiU3RyaW5nXCIsXG4gICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBkYXRlOiB7XG4gICAgICAgICAgICAgICAgc2VyaWFsaXplZE5hbWU6IFwiZGF0ZVwiLFxuICAgICAgICAgICAgICAgIHhtbE5hbWU6IFwiZGF0ZVwiLFxuICAgICAgICAgICAgICAgIHR5cGU6IHtcbiAgICAgICAgICAgICAgICAgICAgbmFtZTogXCJEYXRlVGltZVJmYzExMjNcIixcbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIGVycm9yQ29kZToge1xuICAgICAgICAgICAgICAgIHNlcmlhbGl6ZWROYW1lOiBcIngtbXMtZXJyb3ItY29kZVwiLFxuICAgICAgICAgICAgICAgIHhtbE5hbWU6IFwieC1tcy1lcnJvci1jb2RlXCIsXG4gICAgICAgICAgICAgICAgdHlwZToge1xuICAgICAgICAgICAgICAgICAgICBuYW1lOiBcIlN0cmluZ1wiLFxuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICB9LFxuICAgICAgICB9LFxuICAgIH0sXG59O1xuY29uc3QgQmxvYkFib3J0Q29weUZyb21VUkxFeGNlcHRpb25IZWFkZXJzID0ge1xuICAgIHNlcmlhbGl6ZWROYW1lOiBcIkJsb2JfYWJvcnRDb3B5RnJvbVVSTEV4Y2VwdGlvbkhlYWRlcnNcIixcbiAgICB0eXBlOiB7XG4gICAgICAgIG5hbWU6IFwiQ29tcG9zaXRlXCIsXG4gICAgICAgIGNsYXNzTmFtZTogXCJCbG9iQWJvcnRDb3B5RnJvbVVSTEV4Y2VwdGlvbkhlYWRlcnNcIixcbiAgICAgICAgbW9kZWxQcm9wZXJ0aWVzOiB7XG4gICAgICAgICAgICBlcnJvckNvZGU6IHtcbiAgICAgICAgICAgICAgICBzZXJpYWxpemVkTmFtZTogXCJ4LW1zLWVycm9yLWNvZGVcIixcbiAgICAgICAgICAgICAgICB4bWxOYW1lOiBcIngtbXMtZXJyb3ItY29kZVwiLFxuICAgICAgICAgICAgICAgIHR5cGU6IHtcbiAgICAgICAgICAgICAgICAgICAgbmFtZTogXCJTdHJpbmdcIixcbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgfSxcbiAgICAgICAgfSxcbiAgICB9LFxufTtcbmNvbnN0IEJsb2JTZXRUaWVySGVhZGVycyA9IHtcbiAgICBzZXJpYWxpemVkTmFtZTogXCJCbG9iX3NldFRpZXJIZWFkZXJzXCIsXG4gICAgdHlwZToge1xuICAgICAgICBuYW1lOiBcIkNvbXBvc2l0ZVwiLFxuICAgICAgICBjbGFzc05hbWU6IFwiQmxvYlNldFRpZXJIZWFkZXJzXCIsXG4gICAgICAgIG1vZGVsUHJvcGVydGllczoge1xuICAgICAgICAgICAgY2xpZW50UmVxdWVzdElkOiB7XG4gICAgICAgICAgICAgICAgc2VyaWFsaXplZE5hbWU6IFwieC1tcy1jbGllbnQtcmVxdWVzdC1pZFwiLFxuICAgICAgICAgICAgICAgIHhtbE5hbWU6IFwieC1tcy1jbGllbnQtcmVxdWVzdC1pZFwiLFxuICAgICAgICAgICAgICAgIHR5cGU6IHtcbiAgICAgICAgICAgICAgICAgICAgbmFtZTogXCJTdHJpbmdcIixcbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIHJlcXVlc3RJZDoge1xuICAgICAgICAgICAgICAgIHNlcmlhbGl6ZWROYW1lOiBcIngtbXMtcmVxdWVzdC1pZFwiLFxuICAgICAgICAgICAgICAgIHhtbE5hbWU6IFwieC1tcy1yZXF1ZXN0LWlkXCIsXG4gICAgICAgICAgICAgICAgdHlwZToge1xuICAgICAgICAgICAgICAgICAgICBuYW1lOiBcIlN0cmluZ1wiLFxuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgdmVyc2lvbjoge1xuICAgICAgICAgICAgICAgIHNlcmlhbGl6ZWROYW1lOiBcIngtbXMtdmVyc2lvblwiLFxuICAgICAgICAgICAgICAgIHhtbE5hbWU6IFwieC1tcy12ZXJzaW9uXCIsXG4gICAgICAgICAgICAgICAgdHlwZToge1xuICAgICAgICAgICAgICAgICAgICBuYW1lOiBcIlN0cmluZ1wiLFxuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgZXJyb3JDb2RlOiB7XG4gICAgICAgICAgICAgICAgc2VyaWFsaXplZE5hbWU6IFwieC1tcy1lcnJvci1jb2RlXCIsXG4gICAgICAgICAgICAgICAgeG1sTmFtZTogXCJ4LW1zLWVycm9yLWNvZGVcIixcbiAgICAgICAgICAgICAgICB0eXBlOiB7XG4gICAgICAgICAgICAgICAgICAgIG5hbWU6IFwiU3RyaW5nXCIsXG4gICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIH0sXG4gICAgICAgIH0sXG4gICAgfSxcbn07XG5jb25zdCBCbG9iU2V0VGllckV4Y2VwdGlvbkhlYWRlcnMgPSB7XG4gICAgc2VyaWFsaXplZE5hbWU6IFwiQmxvYl9zZXRUaWVyRXhjZXB0aW9uSGVhZGVyc1wiLFxuICAgIHR5cGU6IHtcbiAgICAgICAgbmFtZTogXCJDb21wb3NpdGVcIixcbiAgICAgICAgY2xhc3NOYW1lOiBcIkJsb2JTZXRUaWVyRXhjZXB0aW9uSGVhZGVyc1wiLFxuICAgICAgICBtb2RlbFByb3BlcnRpZXM6IHtcbiAgICAgICAgICAgIGVycm9yQ29kZToge1xuICAgICAgICAgICAgICAgIHNlcmlhbGl6ZWROYW1lOiBcIngtbXMtZXJyb3ItY29kZVwiLFxuICAgICAgICAgICAgICAgIHhtbE5hbWU6IFwieC1tcy1lcnJvci1jb2RlXCIsXG4gICAgICAgICAgICAgICAgdHlwZToge1xuICAgICAgICAgICAgICAgICAgICBuYW1lOiBcIlN0cmluZ1wiLFxuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICB9LFxuICAgICAgICB9LFxuICAgIH0sXG59O1xuY29uc3QgQmxvYkdldEFjY291bnRJbmZvSGVhZGVycyA9IHtcbiAgICBzZXJpYWxpemVkTmFtZTogXCJCbG9iX2dldEFjY291bnRJbmZvSGVhZGVyc1wiLFxuICAgIHR5cGU6IHtcbiAgICAgICAgbmFtZTogXCJDb21wb3NpdGVcIixcbiAgICAgICAgY2xhc3NOYW1lOiBcIkJsb2JHZXRBY2NvdW50SW5mb0hlYWRlcnNcIixcbiAgICAgICAgbW9kZWxQcm9wZXJ0aWVzOiB7XG4gICAgICAgICAgICBjbGllbnRSZXF1ZXN0SWQ6IHtcbiAgICAgICAgICAgICAgICBzZXJpYWxpemVkTmFtZTogXCJ4LW1zLWNsaWVudC1yZXF1ZXN0LWlkXCIsXG4gICAgICAgICAgICAgICAgeG1sTmFtZTogXCJ4LW1zLWNsaWVudC1yZXF1ZXN0LWlkXCIsXG4gICAgICAgICAgICAgICAgdHlwZToge1xuICAgICAgICAgICAgICAgICAgICBuYW1lOiBcIlN0cmluZ1wiLFxuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgcmVxdWVzdElkOiB7XG4gICAgICAgICAgICAgICAgc2VyaWFsaXplZE5hbWU6IFwieC1tcy1yZXF1ZXN0LWlkXCIsXG4gICAgICAgICAgICAgICAgeG1sTmFtZTogXCJ4LW1zLXJlcXVlc3QtaWRcIixcbiAgICAgICAgICAgICAgICB0eXBlOiB7XG4gICAgICAgICAgICAgICAgICAgIG5hbWU6IFwiU3RyaW5nXCIsXG4gICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICB2ZXJzaW9uOiB7XG4gICAgICAgICAgICAgICAgc2VyaWFsaXplZE5hbWU6IFwieC1tcy12ZXJzaW9uXCIsXG4gICAgICAgICAgICAgICAgeG1sTmFtZTogXCJ4LW1zLXZlcnNpb25cIixcbiAgICAgICAgICAgICAgICB0eXBlOiB7XG4gICAgICAgICAgICAgICAgICAgIG5hbWU6IFwiU3RyaW5nXCIsXG4gICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBkYXRlOiB7XG4gICAgICAgICAgICAgICAgc2VyaWFsaXplZE5hbWU6IFwiZGF0ZVwiLFxuICAgICAgICAgICAgICAgIHhtbE5hbWU6IFwiZGF0ZVwiLFxuICAgICAgICAgICAgICAgIHR5cGU6IHtcbiAgICAgICAgICAgICAgICAgICAgbmFtZTogXCJEYXRlVGltZVJmYzExMjNcIixcbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIHNrdU5hbWU6IHtcbiAgICAgICAgICAgICAgICBzZXJpYWxpemVkTmFtZTogXCJ4LW1zLXNrdS1uYW1lXCIsXG4gICAgICAgICAgICAgICAgeG1sTmFtZTogXCJ4LW1zLXNrdS1uYW1lXCIsXG4gICAgICAgICAgICAgICAgdHlwZToge1xuICAgICAgICAgICAgICAgICAgICBuYW1lOiBcIkVudW1cIixcbiAgICAgICAgICAgICAgICAgICAgYWxsb3dlZFZhbHVlczogW1xuICAgICAgICAgICAgICAgICAgICAgICAgXCJTdGFuZGFyZF9MUlNcIixcbiAgICAgICAgICAgICAgICAgICAgICAgIFwiU3RhbmRhcmRfR1JTXCIsXG4gICAgICAgICAgICAgICAgICAgICAgICBcIlN0YW5kYXJkX1JBR1JTXCIsXG4gICAgICAgICAgICAgICAgICAgICAgICBcIlN0YW5kYXJkX1pSU1wiLFxuICAgICAgICAgICAgICAgICAgICAgICAgXCJQcmVtaXVtX0xSU1wiLFxuICAgICAgICAgICAgICAgICAgICBdLFxuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgYWNjb3VudEtpbmQ6IHtcbiAgICAgICAgICAgICAgICBzZXJpYWxpemVkTmFtZTogXCJ4LW1zLWFjY291bnQta2luZFwiLFxuICAgICAgICAgICAgICAgIHhtbE5hbWU6IFwieC1tcy1hY2NvdW50LWtpbmRcIixcbiAgICAgICAgICAgICAgICB0eXBlOiB7XG4gICAgICAgICAgICAgICAgICAgIG5hbWU6IFwiRW51bVwiLFxuICAgICAgICAgICAgICAgICAgICBhbGxvd2VkVmFsdWVzOiBbXG4gICAgICAgICAgICAgICAgICAgICAgICBcIlN0b3JhZ2VcIixcbiAgICAgICAgICAgICAgICAgICAgICAgIFwiQmxvYlN0b3JhZ2VcIixcbiAgICAgICAgICAgICAgICAgICAgICAgIFwiU3RvcmFnZVYyXCIsXG4gICAgICAgICAgICAgICAgICAgICAgICBcIkZpbGVTdG9yYWdlXCIsXG4gICAgICAgICAgICAgICAgICAgICAgICBcIkJsb2NrQmxvYlN0b3JhZ2VcIixcbiAgICAgICAgICAgICAgICAgICAgXSxcbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIGlzSGllcmFyY2hpY2FsTmFtZXNwYWNlRW5hYmxlZDoge1xuICAgICAgICAgICAgICAgIHNlcmlhbGl6ZWROYW1lOiBcIngtbXMtaXMtaG5zLWVuYWJsZWRcIixcbiAgICAgICAgICAgICAgICB4bWxOYW1lOiBcIngtbXMtaXMtaG5zLWVuYWJsZWRcIixcbiAgICAgICAgICAgICAgICB0eXBlOiB7XG4gICAgICAgICAgICAgICAgICAgIG5hbWU6IFwiQm9vbGVhblwiLFxuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICB9LFxuICAgICAgICB9LFxuICAgIH0sXG59O1xuY29uc3QgQmxvYkdldEFjY291bnRJbmZvRXhjZXB0aW9uSGVhZGVycyA9IHtcbiAgICBzZXJpYWxpemVkTmFtZTogXCJCbG9iX2dldEFjY291bnRJbmZvRXhjZXB0aW9uSGVhZGVyc1wiLFxuICAgIHR5cGU6IHtcbiAgICAgICAgbmFtZTogXCJDb21wb3NpdGVcIixcbiAgICAgICAgY2xhc3NOYW1lOiBcIkJsb2JHZXRBY2NvdW50SW5mb0V4Y2VwdGlvbkhlYWRlcnNcIixcbiAgICAgICAgbW9kZWxQcm9wZXJ0aWVzOiB7XG4gICAgICAgICAgICBlcnJvckNvZGU6IHtcbiAgICAgICAgICAgICAgICBzZXJpYWxpemVkTmFtZTogXCJ4LW1zLWVycm9yLWNvZGVcIixcbiAgICAgICAgICAgICAgICB4bWxOYW1lOiBcIngtbXMtZXJyb3ItY29kZVwiLFxuICAgICAgICAgICAgICAgIHR5cGU6IHtcbiAgICAgICAgICAgICAgICAgICAgbmFtZTogXCJTdHJpbmdcIixcbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgfSxcbiAgICAgICAgfSxcbiAgICB9LFxufTtcbmNvbnN0IEJsb2JRdWVyeUhlYWRlcnMgPSB7XG4gICAgc2VyaWFsaXplZE5hbWU6IFwiQmxvYl9xdWVyeUhlYWRlcnNcIixcbiAgICB0eXBlOiB7XG4gICAgICAgIG5hbWU6IFwiQ29tcG9zaXRlXCIsXG4gICAgICAgIGNsYXNzTmFtZTogXCJCbG9iUXVlcnlIZWFkZXJzXCIsXG4gICAgICAgIG1vZGVsUHJvcGVydGllczoge1xuICAgICAgICAgICAgbGFzdE1vZGlmaWVkOiB7XG4gICAgICAgICAgICAgICAgc2VyaWFsaXplZE5hbWU6IFwibGFzdC1tb2RpZmllZFwiLFxuICAgICAgICAgICAgICAgIHhtbE5hbWU6IFwibGFzdC1tb2RpZmllZFwiLFxuICAgICAgICAgICAgICAgIHR5cGU6IHtcbiAgICAgICAgICAgICAgICAgICAgbmFtZTogXCJEYXRlVGltZVJmYzExMjNcIixcbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIG1ldGFkYXRhOiB7XG4gICAgICAgICAgICAgICAgc2VyaWFsaXplZE5hbWU6IFwieC1tcy1tZXRhXCIsXG4gICAgICAgICAgICAgICAgaGVhZGVyQ29sbGVjdGlvblByZWZpeDogXCJ4LW1zLW1ldGEtXCIsXG4gICAgICAgICAgICAgICAgeG1sTmFtZTogXCJ4LW1zLW1ldGFcIixcbiAgICAgICAgICAgICAgICB0eXBlOiB7XG4gICAgICAgICAgICAgICAgICAgIG5hbWU6IFwiRGljdGlvbmFyeVwiLFxuICAgICAgICAgICAgICAgICAgICB2YWx1ZTogeyB0eXBlOiB7IG5hbWU6IFwiU3RyaW5nXCIgfSB9LFxuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgY29udGVudExlbmd0aDoge1xuICAgICAgICAgICAgICAgIHNlcmlhbGl6ZWROYW1lOiBcImNvbnRlbnQtbGVuZ3RoXCIsXG4gICAgICAgICAgICAgICAgeG1sTmFtZTogXCJjb250ZW50LWxlbmd0aFwiLFxuICAgICAgICAgICAgICAgIHR5cGU6IHtcbiAgICAgICAgICAgICAgICAgICAgbmFtZTogXCJOdW1iZXJcIixcbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIGNvbnRlbnRUeXBlOiB7XG4gICAgICAgICAgICAgICAgc2VyaWFsaXplZE5hbWU6IFwiY29udGVudC10eXBlXCIsXG4gICAgICAgICAgICAgICAgeG1sTmFtZTogXCJjb250ZW50LXR5cGVcIixcbiAgICAgICAgICAgICAgICB0eXBlOiB7XG4gICAgICAgICAgICAgICAgICAgIG5hbWU6IFwiU3RyaW5nXCIsXG4gICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBjb250ZW50UmFuZ2U6IHtcbiAgICAgICAgICAgICAgICBzZXJpYWxpemVkTmFtZTogXCJjb250ZW50LXJhbmdlXCIsXG4gICAgICAgICAgICAgICAgeG1sTmFtZTogXCJjb250ZW50LXJhbmdlXCIsXG4gICAgICAgICAgICAgICAgdHlwZToge1xuICAgICAgICAgICAgICAgICAgICBuYW1lOiBcIlN0cmluZ1wiLFxuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgZXRhZzoge1xuICAgICAgICAgICAgICAgIHNlcmlhbGl6ZWROYW1lOiBcImV0YWdcIixcbiAgICAgICAgICAgICAgICB4bWxOYW1lOiBcImV0YWdcIixcbiAgICAgICAgICAgICAgICB0eXBlOiB7XG4gICAgICAgICAgICAgICAgICAgIG5hbWU6IFwiU3RyaW5nXCIsXG4gICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBjb250ZW50TUQ1OiB7XG4gICAgICAgICAgICAgICAgc2VyaWFsaXplZE5hbWU6IFwiY29udGVudC1tZDVcIixcbiAgICAgICAgICAgICAgICB4bWxOYW1lOiBcImNvbnRlbnQtbWQ1XCIsXG4gICAgICAgICAgICAgICAgdHlwZToge1xuICAgICAgICAgICAgICAgICAgICBuYW1lOiBcIkJ5dGVBcnJheVwiLFxuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgY29udGVudEVuY29kaW5nOiB7XG4gICAgICAgICAgICAgICAgc2VyaWFsaXplZE5hbWU6IFwiY29udGVudC1lbmNvZGluZ1wiLFxuICAgICAgICAgICAgICAgIHhtbE5hbWU6IFwiY29udGVudC1lbmNvZGluZ1wiLFxuICAgICAgICAgICAgICAgIHR5cGU6IHtcbiAgICAgICAgICAgICAgICAgICAgbmFtZTogXCJTdHJpbmdcIixcbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIGNhY2hlQ29udHJvbDoge1xuICAgICAgICAgICAgICAgIHNlcmlhbGl6ZWROYW1lOiBcImNhY2hlLWNvbnRyb2xcIixcbiAgICAgICAgICAgICAgICB4bWxOYW1lOiBcImNhY2hlLWNvbnRyb2xcIixcbiAgICAgICAgICAgICAgICB0eXBlOiB7XG4gICAgICAgICAgICAgICAgICAgIG5hbWU6IFwiU3RyaW5nXCIsXG4gICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBjb250ZW50RGlzcG9zaXRpb246IHtcbiAgICAgICAgICAgICAgICBzZXJpYWxpemVkTmFtZTogXCJjb250ZW50LWRpc3Bvc2l0aW9uXCIsXG4gICAgICAgICAgICAgICAgeG1sTmFtZTogXCJjb250ZW50LWRpc3Bvc2l0aW9uXCIsXG4gICAgICAgICAgICAgICAgdHlwZToge1xuICAgICAgICAgICAgICAgICAgICBuYW1lOiBcIlN0cmluZ1wiLFxuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgY29udGVudExhbmd1YWdlOiB7XG4gICAgICAgICAgICAgICAgc2VyaWFsaXplZE5hbWU6IFwiY29udGVudC1sYW5ndWFnZVwiLFxuICAgICAgICAgICAgICAgIHhtbE5hbWU6IFwiY29udGVudC1sYW5ndWFnZVwiLFxuICAgICAgICAgICAgICAgIHR5cGU6IHtcbiAgICAgICAgICAgICAgICAgICAgbmFtZTogXCJTdHJpbmdcIixcbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIGJsb2JTZXF1ZW5jZU51bWJlcjoge1xuICAgICAgICAgICAgICAgIHNlcmlhbGl6ZWROYW1lOiBcIngtbXMtYmxvYi1zZXF1ZW5jZS1udW1iZXJcIixcbiAgICAgICAgICAgICAgICB4bWxOYW1lOiBcIngtbXMtYmxvYi1zZXF1ZW5jZS1udW1iZXJcIixcbiAgICAgICAgICAgICAgICB0eXBlOiB7XG4gICAgICAgICAgICAgICAgICAgIG5hbWU6IFwiTnVtYmVyXCIsXG4gICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBibG9iVHlwZToge1xuICAgICAgICAgICAgICAgIHNlcmlhbGl6ZWROYW1lOiBcIngtbXMtYmxvYi10eXBlXCIsXG4gICAgICAgICAgICAgICAgeG1sTmFtZTogXCJ4LW1zLWJsb2ItdHlwZVwiLFxuICAgICAgICAgICAgICAgIHR5cGU6IHtcbiAgICAgICAgICAgICAgICAgICAgbmFtZTogXCJFbnVtXCIsXG4gICAgICAgICAgICAgICAgICAgIGFsbG93ZWRWYWx1ZXM6IFtcIkJsb2NrQmxvYlwiLCBcIlBhZ2VCbG9iXCIsIFwiQXBwZW5kQmxvYlwiXSxcbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIGNvcHlDb21wbGV0aW9uVGltZToge1xuICAgICAgICAgICAgICAgIHNlcmlhbGl6ZWROYW1lOiBcIngtbXMtY29weS1jb21wbGV0aW9uLXRpbWVcIixcbiAgICAgICAgICAgICAgICB4bWxOYW1lOiBcIngtbXMtY29weS1jb21wbGV0aW9uLXRpbWVcIixcbiAgICAgICAgICAgICAgICB0eXBlOiB7XG4gICAgICAgICAgICAgICAgICAgIG5hbWU6IFwiRGF0ZVRpbWVSZmMxMTIzXCIsXG4gICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBjb3B5U3RhdHVzRGVzY3JpcHRpb246IHtcbiAgICAgICAgICAgICAgICBzZXJpYWxpemVkTmFtZTogXCJ4LW1zLWNvcHktc3RhdHVzLWRlc2NyaXB0aW9uXCIsXG4gICAgICAgICAgICAgICAgeG1sTmFtZTogXCJ4LW1zLWNvcHktc3RhdHVzLWRlc2NyaXB0aW9uXCIsXG4gICAgICAgICAgICAgICAgdHlwZToge1xuICAgICAgICAgICAgICAgICAgICBuYW1lOiBcIlN0cmluZ1wiLFxuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgY29weUlkOiB7XG4gICAgICAgICAgICAgICAgc2VyaWFsaXplZE5hbWU6IFwieC1tcy1jb3B5LWlkXCIsXG4gICAgICAgICAgICAgICAgeG1sTmFtZTogXCJ4LW1zLWNvcHktaWRcIixcbiAgICAgICAgICAgICAgICB0eXBlOiB7XG4gICAgICAgICAgICAgICAgICAgIG5hbWU6IFwiU3RyaW5nXCIsXG4gICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBjb3B5UHJvZ3Jlc3M6IHtcbiAgICAgICAgICAgICAgICBzZXJpYWxpemVkTmFtZTogXCJ4LW1zLWNvcHktcHJvZ3Jlc3NcIixcbiAgICAgICAgICAgICAgICB4bWxOYW1lOiBcIngtbXMtY29weS1wcm9ncmVzc1wiLFxuICAgICAgICAgICAgICAgIHR5cGU6IHtcbiAgICAgICAgICAgICAgICAgICAgbmFtZTogXCJTdHJpbmdcIixcbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIGNvcHlTb3VyY2U6IHtcbiAgICAgICAgICAgICAgICBzZXJpYWxpemVkTmFtZTogXCJ4LW1zLWNvcHktc291cmNlXCIsXG4gICAgICAgICAgICAgICAgeG1sTmFtZTogXCJ4LW1zLWNvcHktc291cmNlXCIsXG4gICAgICAgICAgICAgICAgdHlwZToge1xuICAgICAgICAgICAgICAgICAgICBuYW1lOiBcIlN0cmluZ1wiLFxuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgY29weVN0YXR1czoge1xuICAgICAgICAgICAgICAgIHNlcmlhbGl6ZWROYW1lOiBcIngtbXMtY29weS1zdGF0dXNcIixcbiAgICAgICAgICAgICAgICB4bWxOYW1lOiBcIngtbXMtY29weS1zdGF0dXNcIixcbiAgICAgICAgICAgICAgICB0eXBlOiB7XG4gICAgICAgICAgICAgICAgICAgIG5hbWU6IFwiRW51bVwiLFxuICAgICAgICAgICAgICAgICAgICBhbGxvd2VkVmFsdWVzOiBbXCJwZW5kaW5nXCIsIFwic3VjY2Vzc1wiLCBcImFib3J0ZWRcIiwgXCJmYWlsZWRcIl0sXG4gICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBsZWFzZUR1cmF0aW9uOiB7XG4gICAgICAgICAgICAgICAgc2VyaWFsaXplZE5hbWU6IFwieC1tcy1sZWFzZS1kdXJhdGlvblwiLFxuICAgICAgICAgICAgICAgIHhtbE5hbWU6IFwieC1tcy1sZWFzZS1kdXJhdGlvblwiLFxuICAgICAgICAgICAgICAgIHR5cGU6IHtcbiAgICAgICAgICAgICAgICAgICAgbmFtZTogXCJFbnVtXCIsXG4gICAgICAgICAgICAgICAgICAgIGFsbG93ZWRWYWx1ZXM6IFtcImluZmluaXRlXCIsIFwiZml4ZWRcIl0sXG4gICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBsZWFzZVN0YXRlOiB7XG4gICAgICAgICAgICAgICAgc2VyaWFsaXplZE5hbWU6IFwieC1tcy1sZWFzZS1zdGF0ZVwiLFxuICAgICAgICAgICAgICAgIHhtbE5hbWU6IFwieC1tcy1sZWFzZS1zdGF0ZVwiLFxuICAgICAgICAgICAgICAgIHR5cGU6IHtcbiAgICAgICAgICAgICAgICAgICAgbmFtZTogXCJFbnVtXCIsXG4gICAgICAgICAgICAgICAgICAgIGFsbG93ZWRWYWx1ZXM6IFtcbiAgICAgICAgICAgICAgICAgICAgICAgIFwiYXZhaWxhYmxlXCIsXG4gICAgICAgICAgICAgICAgICAgICAgICBcImxlYXNlZFwiLFxuICAgICAgICAgICAgICAgICAgICAgICAgXCJleHBpcmVkXCIsXG4gICAgICAgICAgICAgICAgICAgICAgICBcImJyZWFraW5nXCIsXG4gICAgICAgICAgICAgICAgICAgICAgICBcImJyb2tlblwiLFxuICAgICAgICAgICAgICAgICAgICBdLFxuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgbGVhc2VTdGF0dXM6IHtcbiAgICAgICAgICAgICAgICBzZXJpYWxpemVkTmFtZTogXCJ4LW1zLWxlYXNlLXN0YXR1c1wiLFxuICAgICAgICAgICAgICAgIHhtbE5hbWU6IFwieC1tcy1sZWFzZS1zdGF0dXNcIixcbiAgICAgICAgICAgICAgICB0eXBlOiB7XG4gICAgICAgICAgICAgICAgICAgIG5hbWU6IFwiRW51bVwiLFxuICAgICAgICAgICAgICAgICAgICBhbGxvd2VkVmFsdWVzOiBbXCJsb2NrZWRcIiwgXCJ1bmxvY2tlZFwiXSxcbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIGNsaWVudFJlcXVlc3RJZDoge1xuICAgICAgICAgICAgICAgIHNlcmlhbGl6ZWROYW1lOiBcIngtbXMtY2xpZW50LXJlcXVlc3QtaWRcIixcbiAgICAgICAgICAgICAgICB4bWxOYW1lOiBcIngtbXMtY2xpZW50LXJlcXVlc3QtaWRcIixcbiAgICAgICAgICAgICAgICB0eXBlOiB7XG4gICAgICAgICAgICAgICAgICAgIG5hbWU6IFwiU3RyaW5nXCIsXG4gICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICByZXF1ZXN0SWQ6IHtcbiAgICAgICAgICAgICAgICBzZXJpYWxpemVkTmFtZTogXCJ4LW1zLXJlcXVlc3QtaWRcIixcbiAgICAgICAgICAgICAgICB4bWxOYW1lOiBcIngtbXMtcmVxdWVzdC1pZFwiLFxuICAgICAgICAgICAgICAgIHR5cGU6IHtcbiAgICAgICAgICAgICAgICAgICAgbmFtZTogXCJTdHJpbmdcIixcbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIHZlcnNpb246IHtcbiAgICAgICAgICAgICAgICBzZXJpYWxpemVkTmFtZTogXCJ4LW1zLXZlcnNpb25cIixcbiAgICAgICAgICAgICAgICB4bWxOYW1lOiBcIngtbXMtdmVyc2lvblwiLFxuICAgICAgICAgICAgICAgIHR5cGU6IHtcbiAgICAgICAgICAgICAgICAgICAgbmFtZTogXCJTdHJpbmdcIixcbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIGFjY2VwdFJhbmdlczoge1xuICAgICAgICAgICAgICAgIHNlcmlhbGl6ZWROYW1lOiBcImFjY2VwdC1yYW5nZXNcIixcbiAgICAgICAgICAgICAgICB4bWxOYW1lOiBcImFjY2VwdC1yYW5nZXNcIixcbiAgICAgICAgICAgICAgICB0eXBlOiB7XG4gICAgICAgICAgICAgICAgICAgIG5hbWU6IFwiU3RyaW5nXCIsXG4gICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBkYXRlOiB7XG4gICAgICAgICAgICAgICAgc2VyaWFsaXplZE5hbWU6IFwiZGF0ZVwiLFxuICAgICAgICAgICAgICAgIHhtbE5hbWU6IFwiZGF0ZVwiLFxuICAgICAgICAgICAgICAgIHR5cGU6IHtcbiAgICAgICAgICAgICAgICAgICAgbmFtZTogXCJEYXRlVGltZVJmYzExMjNcIixcbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIGJsb2JDb21taXR0ZWRCbG9ja0NvdW50OiB7XG4gICAgICAgICAgICAgICAgc2VyaWFsaXplZE5hbWU6IFwieC1tcy1ibG9iLWNvbW1pdHRlZC1ibG9jay1jb3VudFwiLFxuICAgICAgICAgICAgICAgIHhtbE5hbWU6IFwieC1tcy1ibG9iLWNvbW1pdHRlZC1ibG9jay1jb3VudFwiLFxuICAgICAgICAgICAgICAgIHR5cGU6IHtcbiAgICAgICAgICAgICAgICAgICAgbmFtZTogXCJOdW1iZXJcIixcbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIGlzU2VydmVyRW5jcnlwdGVkOiB7XG4gICAgICAgICAgICAgICAgc2VyaWFsaXplZE5hbWU6IFwieC1tcy1zZXJ2ZXItZW5jcnlwdGVkXCIsXG4gICAgICAgICAgICAgICAgeG1sTmFtZTogXCJ4LW1zLXNlcnZlci1lbmNyeXB0ZWRcIixcbiAgICAgICAgICAgICAgICB0eXBlOiB7XG4gICAgICAgICAgICAgICAgICAgIG5hbWU6IFwiQm9vbGVhblwiLFxuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgZW5jcnlwdGlvbktleVNoYTI1Njoge1xuICAgICAgICAgICAgICAgIHNlcmlhbGl6ZWROYW1lOiBcIngtbXMtZW5jcnlwdGlvbi1rZXktc2hhMjU2XCIsXG4gICAgICAgICAgICAgICAgeG1sTmFtZTogXCJ4LW1zLWVuY3J5cHRpb24ta2V5LXNoYTI1NlwiLFxuICAgICAgICAgICAgICAgIHR5cGU6IHtcbiAgICAgICAgICAgICAgICAgICAgbmFtZTogXCJTdHJpbmdcIixcbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIGVuY3J5cHRpb25TY29wZToge1xuICAgICAgICAgICAgICAgIHNlcmlhbGl6ZWROYW1lOiBcIngtbXMtZW5jcnlwdGlvbi1zY29wZVwiLFxuICAgICAgICAgICAgICAgIHhtbE5hbWU6IFwieC1tcy1lbmNyeXB0aW9uLXNjb3BlXCIsXG4gICAgICAgICAgICAgICAgdHlwZToge1xuICAgICAgICAgICAgICAgICAgICBuYW1lOiBcIlN0cmluZ1wiLFxuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgYmxvYkNvbnRlbnRNRDU6IHtcbiAgICAgICAgICAgICAgICBzZXJpYWxpemVkTmFtZTogXCJ4LW1zLWJsb2ItY29udGVudC1tZDVcIixcbiAgICAgICAgICAgICAgICB4bWxOYW1lOiBcIngtbXMtYmxvYi1jb250ZW50LW1kNVwiLFxuICAgICAgICAgICAgICAgIHR5cGU6IHtcbiAgICAgICAgICAgICAgICAgICAgbmFtZTogXCJCeXRlQXJyYXlcIixcbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIGVycm9yQ29kZToge1xuICAgICAgICAgICAgICAgIHNlcmlhbGl6ZWROYW1lOiBcIngtbXMtZXJyb3ItY29kZVwiLFxuICAgICAgICAgICAgICAgIHhtbE5hbWU6IFwieC1tcy1lcnJvci1jb2RlXCIsXG4gICAgICAgICAgICAgICAgdHlwZToge1xuICAgICAgICAgICAgICAgICAgICBuYW1lOiBcIlN0cmluZ1wiLFxuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgY29udGVudENyYzY0OiB7XG4gICAgICAgICAgICAgICAgc2VyaWFsaXplZE5hbWU6IFwieC1tcy1jb250ZW50LWNyYzY0XCIsXG4gICAgICAgICAgICAgICAgeG1sTmFtZTogXCJ4LW1zLWNvbnRlbnQtY3JjNjRcIixcbiAgICAgICAgICAgICAgICB0eXBlOiB7XG4gICAgICAgICAgICAgICAgICAgIG5hbWU6IFwiQnl0ZUFycmF5XCIsXG4gICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIH0sXG4gICAgICAgIH0sXG4gICAgfSxcbn07XG5jb25zdCBCbG9iUXVlcnlFeGNlcHRpb25IZWFkZXJzID0ge1xuICAgIHNlcmlhbGl6ZWROYW1lOiBcIkJsb2JfcXVlcnlFeGNlcHRpb25IZWFkZXJzXCIsXG4gICAgdHlwZToge1xuICAgICAgICBuYW1lOiBcIkNvbXBvc2l0ZVwiLFxuICAgICAgICBjbGFzc05hbWU6IFwiQmxvYlF1ZXJ5RXhjZXB0aW9uSGVhZGVyc1wiLFxuICAgICAgICBtb2RlbFByb3BlcnRpZXM6IHtcbiAgICAgICAgICAgIGVycm9yQ29kZToge1xuICAgICAgICAgICAgICAgIHNlcmlhbGl6ZWROYW1lOiBcIngtbXMtZXJyb3ItY29kZVwiLFxuICAgICAgICAgICAgICAgIHhtbE5hbWU6IFwieC1tcy1lcnJvci1jb2RlXCIsXG4gICAgICAgICAgICAgICAgdHlwZToge1xuICAgICAgICAgICAgICAgICAgICBuYW1lOiBcIlN0cmluZ1wiLFxuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICB9LFxuICAgICAgICB9LFxuICAgIH0sXG59O1xuY29uc3QgQmxvYkdldFRhZ3NIZWFkZXJzID0ge1xuICAgIHNlcmlhbGl6ZWROYW1lOiBcIkJsb2JfZ2V0VGFnc0hlYWRlcnNcIixcbiAgICB0eXBlOiB7XG4gICAgICAgIG5hbWU6IFwiQ29tcG9zaXRlXCIsXG4gICAgICAgIGNsYXNzTmFtZTogXCJCbG9iR2V0VGFnc0hlYWRlcnNcIixcbiAgICAgICAgbW9kZWxQcm9wZXJ0aWVzOiB7XG4gICAgICAgICAgICBjbGllbnRSZXF1ZXN0SWQ6IHtcbiAgICAgICAgICAgICAgICBzZXJpYWxpemVkTmFtZTogXCJ4LW1zLWNsaWVudC1yZXF1ZXN0LWlkXCIsXG4gICAgICAgICAgICAgICAgeG1sTmFtZTogXCJ4LW1zLWNsaWVudC1yZXF1ZXN0LWlkXCIsXG4gICAgICAgICAgICAgICAgdHlwZToge1xuICAgICAgICAgICAgICAgICAgICBuYW1lOiBcIlN0cmluZ1wiLFxuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgcmVxdWVzdElkOiB7XG4gICAgICAgICAgICAgICAgc2VyaWFsaXplZE5hbWU6IFwieC1tcy1yZXF1ZXN0LWlkXCIsXG4gICAgICAgICAgICAgICAgeG1sTmFtZTogXCJ4LW1zLXJlcXVlc3QtaWRcIixcbiAgICAgICAgICAgICAgICB0eXBlOiB7XG4gICAgICAgICAgICAgICAgICAgIG5hbWU6IFwiU3RyaW5nXCIsXG4gICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICB2ZXJzaW9uOiB7XG4gICAgICAgICAgICAgICAgc2VyaWFsaXplZE5hbWU6IFwieC1tcy12ZXJzaW9uXCIsXG4gICAgICAgICAgICAgICAgeG1sTmFtZTogXCJ4LW1zLXZlcnNpb25cIixcbiAgICAgICAgICAgICAgICB0eXBlOiB7XG4gICAgICAgICAgICAgICAgICAgIG5hbWU6IFwiU3RyaW5nXCIsXG4gICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBkYXRlOiB7XG4gICAgICAgICAgICAgICAgc2VyaWFsaXplZE5hbWU6IFwiZGF0ZVwiLFxuICAgICAgICAgICAgICAgIHhtbE5hbWU6IFwiZGF0ZVwiLFxuICAgICAgICAgICAgICAgIHR5cGU6IHtcbiAgICAgICAgICAgICAgICAgICAgbmFtZTogXCJEYXRlVGltZVJmYzExMjNcIixcbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIGVycm9yQ29kZToge1xuICAgICAgICAgICAgICAgIHNlcmlhbGl6ZWROYW1lOiBcIngtbXMtZXJyb3ItY29kZVwiLFxuICAgICAgICAgICAgICAgIHhtbE5hbWU6IFwieC1tcy1lcnJvci1jb2RlXCIsXG4gICAgICAgICAgICAgICAgdHlwZToge1xuICAgICAgICAgICAgICAgICAgICBuYW1lOiBcIlN0cmluZ1wiLFxuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICB9LFxuICAgICAgICB9LFxuICAgIH0sXG59O1xuY29uc3QgQmxvYkdldFRhZ3NFeGNlcHRpb25IZWFkZXJzID0ge1xuICAgIHNlcmlhbGl6ZWROYW1lOiBcIkJsb2JfZ2V0VGFnc0V4Y2VwdGlvbkhlYWRlcnNcIixcbiAgICB0eXBlOiB7XG4gICAgICAgIG5hbWU6IFwiQ29tcG9zaXRlXCIsXG4gICAgICAgIGNsYXNzTmFtZTogXCJCbG9iR2V0VGFnc0V4Y2VwdGlvbkhlYWRlcnNcIixcbiAgICAgICAgbW9kZWxQcm9wZXJ0aWVzOiB7XG4gICAgICAgICAgICBlcnJvckNvZGU6IHtcbiAgICAgICAgICAgICAgICBzZXJpYWxpemVkTmFtZTogXCJ4LW1zLWVycm9yLWNvZGVcIixcbiAgICAgICAgICAgICAgICB4bWxOYW1lOiBcIngtbXMtZXJyb3ItY29kZVwiLFxuICAgICAgICAgICAgICAgIHR5cGU6IHtcbiAgICAgICAgICAgICAgICAgICAgbmFtZTogXCJTdHJpbmdcIixcbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgfSxcbiAgICAgICAgfSxcbiAgICB9LFxufTtcbmNvbnN0IEJsb2JTZXRUYWdzSGVhZGVycyA9IHtcbiAgICBzZXJpYWxpemVkTmFtZTogXCJCbG9iX3NldFRhZ3NIZWFkZXJzXCIsXG4gICAgdHlwZToge1xuICAgICAgICBuYW1lOiBcIkNvbXBvc2l0ZVwiLFxuICAgICAgICBjbGFzc05hbWU6IFwiQmxvYlNldFRhZ3NIZWFkZXJzXCIsXG4gICAgICAgIG1vZGVsUHJvcGVydGllczoge1xuICAgICAgICAgICAgY2xpZW50UmVxdWVzdElkOiB7XG4gICAgICAgICAgICAgICAgc2VyaWFsaXplZE5hbWU6IFwieC1tcy1jbGllbnQtcmVxdWVzdC1pZFwiLFxuICAgICAgICAgICAgICAgIHhtbE5hbWU6IFwieC1tcy1jbGllbnQtcmVxdWVzdC1pZFwiLFxuICAgICAgICAgICAgICAgIHR5cGU6IHtcbiAgICAgICAgICAgICAgICAgICAgbmFtZTogXCJTdHJpbmdcIixcbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIHJlcXVlc3RJZDoge1xuICAgICAgICAgICAgICAgIHNlcmlhbGl6ZWROYW1lOiBcIngtbXMtcmVxdWVzdC1pZFwiLFxuICAgICAgICAgICAgICAgIHhtbE5hbWU6IFwieC1tcy1yZXF1ZXN0LWlkXCIsXG4gICAgICAgICAgICAgICAgdHlwZToge1xuICAgICAgICAgICAgICAgICAgICBuYW1lOiBcIlN0cmluZ1wiLFxuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgdmVyc2lvbjoge1xuICAgICAgICAgICAgICAgIHNlcmlhbGl6ZWROYW1lOiBcIngtbXMtdmVyc2lvblwiLFxuICAgICAgICAgICAgICAgIHhtbE5hbWU6IFwieC1tcy12ZXJzaW9uXCIsXG4gICAgICAgICAgICAgICAgdHlwZToge1xuICAgICAgICAgICAgICAgICAgICBuYW1lOiBcIlN0cmluZ1wiLFxuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgZGF0ZToge1xuICAgICAgICAgICAgICAgIHNlcmlhbGl6ZWROYW1lOiBcImRhdGVcIixcbiAgICAgICAgICAgICAgICB4bWxOYW1lOiBcImRhdGVcIixcbiAgICAgICAgICAgICAgICB0eXBlOiB7XG4gICAgICAgICAgICAgICAgICAgIG5hbWU6IFwiRGF0ZVRpbWVSZmMxMTIzXCIsXG4gICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBlcnJvckNvZGU6IHtcbiAgICAgICAgICAgICAgICBzZXJpYWxpemVkTmFtZTogXCJ4LW1zLWVycm9yLWNvZGVcIixcbiAgICAgICAgICAgICAgICB4bWxOYW1lOiBcIngtbXMtZXJyb3ItY29kZVwiLFxuICAgICAgICAgICAgICAgIHR5cGU6IHtcbiAgICAgICAgICAgICAgICAgICAgbmFtZTogXCJTdHJpbmdcIixcbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgfSxcbiAgICAgICAgfSxcbiAgICB9LFxufTtcbmNvbnN0IEJsb2JTZXRUYWdzRXhjZXB0aW9uSGVhZGVycyA9IHtcbiAgICBzZXJpYWxpemVkTmFtZTogXCJCbG9iX3NldFRhZ3NFeGNlcHRpb25IZWFkZXJzXCIsXG4gICAgdHlwZToge1xuICAgICAgICBuYW1lOiBcIkNvbXBvc2l0ZVwiLFxuICAgICAgICBjbGFzc05hbWU6IFwiQmxvYlNldFRhZ3NFeGNlcHRpb25IZWFkZXJzXCIsXG4gICAgICAgIG1vZGVsUHJvcGVydGllczoge1xuICAgICAgICAgICAgZXJyb3JDb2RlOiB7XG4gICAgICAgICAgICAgICAgc2VyaWFsaXplZE5hbWU6IFwieC1tcy1lcnJvci1jb2RlXCIsXG4gICAgICAgICAgICAgICAgeG1sTmFtZTogXCJ4LW1zLWVycm9yLWNvZGVcIixcbiAgICAgICAgICAgICAgICB0eXBlOiB7XG4gICAgICAgICAgICAgICAgICAgIG5hbWU6IFwiU3RyaW5nXCIsXG4gICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIH0sXG4gICAgICAgIH0sXG4gICAgfSxcbn07XG5jb25zdCBQYWdlQmxvYkNyZWF0ZUhlYWRlcnMgPSB7XG4gICAgc2VyaWFsaXplZE5hbWU6IFwiUGFnZUJsb2JfY3JlYXRlSGVhZGVyc1wiLFxuICAgIHR5cGU6IHtcbiAgICAgICAgbmFtZTogXCJDb21wb3NpdGVcIixcbiAgICAgICAgY2xhc3NOYW1lOiBcIlBhZ2VCbG9iQ3JlYXRlSGVhZGVyc1wiLFxuICAgICAgICBtb2RlbFByb3BlcnRpZXM6IHtcbiAgICAgICAgICAgIGV0YWc6IHtcbiAgICAgICAgICAgICAgICBzZXJpYWxpemVkTmFtZTogXCJldGFnXCIsXG4gICAgICAgICAgICAgICAgeG1sTmFtZTogXCJldGFnXCIsXG4gICAgICAgICAgICAgICAgdHlwZToge1xuICAgICAgICAgICAgICAgICAgICBuYW1lOiBcIlN0cmluZ1wiLFxuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgbGFzdE1vZGlmaWVkOiB7XG4gICAgICAgICAgICAgICAgc2VyaWFsaXplZE5hbWU6IFwibGFzdC1tb2RpZmllZFwiLFxuICAgICAgICAgICAgICAgIHhtbE5hbWU6IFwibGFzdC1tb2RpZmllZFwiLFxuICAgICAgICAgICAgICAgIHR5cGU6IHtcbiAgICAgICAgICAgICAgICAgICAgbmFtZTogXCJEYXRlVGltZVJmYzExMjNcIixcbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIGNvbnRlbnRNRDU6IHtcbiAgICAgICAgICAgICAgICBzZXJpYWxpemVkTmFtZTogXCJjb250ZW50LW1kNVwiLFxuICAgICAgICAgICAgICAgIHhtbE5hbWU6IFwiY29udGVudC1tZDVcIixcbiAgICAgICAgICAgICAgICB0eXBlOiB7XG4gICAgICAgICAgICAgICAgICAgIG5hbWU6IFwiQnl0ZUFycmF5XCIsXG4gICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBjbGllbnRSZXF1ZXN0SWQ6IHtcbiAgICAgICAgICAgICAgICBzZXJpYWxpemVkTmFtZTogXCJ4LW1zLWNsaWVudC1yZXF1ZXN0LWlkXCIsXG4gICAgICAgICAgICAgICAgeG1sTmFtZTogXCJ4LW1zLWNsaWVudC1yZXF1ZXN0LWlkXCIsXG4gICAgICAgICAgICAgICAgdHlwZToge1xuICAgICAgICAgICAgICAgICAgICBuYW1lOiBcIlN0cmluZ1wiLFxuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgcmVxdWVzdElkOiB7XG4gICAgICAgICAgICAgICAgc2VyaWFsaXplZE5hbWU6IFwieC1tcy1yZXF1ZXN0LWlkXCIsXG4gICAgICAgICAgICAgICAgeG1sTmFtZTogXCJ4LW1zLXJlcXVlc3QtaWRcIixcbiAgICAgICAgICAgICAgICB0eXBlOiB7XG4gICAgICAgICAgICAgICAgICAgIG5hbWU6IFwiU3RyaW5nXCIsXG4gICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICB2ZXJzaW9uOiB7XG4gICAgICAgICAgICAgICAgc2VyaWFsaXplZE5hbWU6IFwieC1tcy12ZXJzaW9uXCIsXG4gICAgICAgICAgICAgICAgeG1sTmFtZTogXCJ4LW1zLXZlcnNpb25cIixcbiAgICAgICAgICAgICAgICB0eXBlOiB7XG4gICAgICAgICAgICAgICAgICAgIG5hbWU6IFwiU3RyaW5nXCIsXG4gICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICB2ZXJzaW9uSWQ6IHtcbiAgICAgICAgICAgICAgICBzZXJpYWxpemVkTmFtZTogXCJ4LW1zLXZlcnNpb24taWRcIixcbiAgICAgICAgICAgICAgICB4bWxOYW1lOiBcIngtbXMtdmVyc2lvbi1pZFwiLFxuICAgICAgICAgICAgICAgIHR5cGU6IHtcbiAgICAgICAgICAgICAgICAgICAgbmFtZTogXCJTdHJpbmdcIixcbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIGRhdGU6IHtcbiAgICAgICAgICAgICAgICBzZXJpYWxpemVkTmFtZTogXCJkYXRlXCIsXG4gICAgICAgICAgICAgICAgeG1sTmFtZTogXCJkYXRlXCIsXG4gICAgICAgICAgICAgICAgdHlwZToge1xuICAgICAgICAgICAgICAgICAgICBuYW1lOiBcIkRhdGVUaW1lUmZjMTEyM1wiLFxuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgaXNTZXJ2ZXJFbmNyeXB0ZWQ6IHtcbiAgICAgICAgICAgICAgICBzZXJpYWxpemVkTmFtZTogXCJ4LW1zLXJlcXVlc3Qtc2VydmVyLWVuY3J5cHRlZFwiLFxuICAgICAgICAgICAgICAgIHhtbE5hbWU6IFwieC1tcy1yZXF1ZXN0LXNlcnZlci1lbmNyeXB0ZWRcIixcbiAgICAgICAgICAgICAgICB0eXBlOiB7XG4gICAgICAgICAgICAgICAgICAgIG5hbWU6IFwiQm9vbGVhblwiLFxuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgZW5jcnlwdGlvbktleVNoYTI1Njoge1xuICAgICAgICAgICAgICAgIHNlcmlhbGl6ZWROYW1lOiBcIngtbXMtZW5jcnlwdGlvbi1rZXktc2hhMjU2XCIsXG4gICAgICAgICAgICAgICAgeG1sTmFtZTogXCJ4LW1zLWVuY3J5cHRpb24ta2V5LXNoYTI1NlwiLFxuICAgICAgICAgICAgICAgIHR5cGU6IHtcbiAgICAgICAgICAgICAgICAgICAgbmFtZTogXCJTdHJpbmdcIixcbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIGVuY3J5cHRpb25TY29wZToge1xuICAgICAgICAgICAgICAgIHNlcmlhbGl6ZWROYW1lOiBcIngtbXMtZW5jcnlwdGlvbi1zY29wZVwiLFxuICAgICAgICAgICAgICAgIHhtbE5hbWU6IFwieC1tcy1lbmNyeXB0aW9uLXNjb3BlXCIsXG4gICAgICAgICAgICAgICAgdHlwZToge1xuICAgICAgICAgICAgICAgICAgICBuYW1lOiBcIlN0cmluZ1wiLFxuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgZXJyb3JDb2RlOiB7XG4gICAgICAgICAgICAgICAgc2VyaWFsaXplZE5hbWU6IFwieC1tcy1lcnJvci1jb2RlXCIsXG4gICAgICAgICAgICAgICAgeG1sTmFtZTogXCJ4LW1zLWVycm9yLWNvZGVcIixcbiAgICAgICAgICAgICAgICB0eXBlOiB7XG4gICAgICAgICAgICAgICAgICAgIG5hbWU6IFwiU3RyaW5nXCIsXG4gICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIH0sXG4gICAgICAgIH0sXG4gICAgfSxcbn07XG5jb25zdCBQYWdlQmxvYkNyZWF0ZUV4Y2VwdGlvbkhlYWRlcnMgPSB7XG4gICAgc2VyaWFsaXplZE5hbWU6IFwiUGFnZUJsb2JfY3JlYXRlRXhjZXB0aW9uSGVhZGVyc1wiLFxuICAgIHR5cGU6IHtcbiAgICAgICAgbmFtZTogXCJDb21wb3NpdGVcIixcbiAgICAgICAgY2xhc3NOYW1lOiBcIlBhZ2VCbG9iQ3JlYXRlRXhjZXB0aW9uSGVhZGVyc1wiLFxuICAgICAgICBtb2RlbFByb3BlcnRpZXM6IHtcbiAgICAgICAgICAgIGVycm9yQ29kZToge1xuICAgICAgICAgICAgICAgIHNlcmlhbGl6ZWROYW1lOiBcIngtbXMtZXJyb3ItY29kZVwiLFxuICAgICAgICAgICAgICAgIHhtbE5hbWU6IFwieC1tcy1lcnJvci1jb2RlXCIsXG4gICAgICAgICAgICAgICAgdHlwZToge1xuICAgICAgICAgICAgICAgICAgICBuYW1lOiBcIlN0cmluZ1wiLFxuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICB9LFxuICAgICAgICB9LFxuICAgIH0sXG59O1xuY29uc3QgUGFnZUJsb2JVcGxvYWRQYWdlc0hlYWRlcnMgPSB7XG4gICAgc2VyaWFsaXplZE5hbWU6IFwiUGFnZUJsb2JfdXBsb2FkUGFnZXNIZWFkZXJzXCIsXG4gICAgdHlwZToge1xuICAgICAgICBuYW1lOiBcIkNvbXBvc2l0ZVwiLFxuICAgICAgICBjbGFzc05hbWU6IFwiUGFnZUJsb2JVcGxvYWRQYWdlc0hlYWRlcnNcIixcbiAgICAgICAgbW9kZWxQcm9wZXJ0aWVzOiB7XG4gICAgICAgICAgICBldGFnOiB7XG4gICAgICAgICAgICAgICAgc2VyaWFsaXplZE5hbWU6IFwiZXRhZ1wiLFxuICAgICAgICAgICAgICAgIHhtbE5hbWU6IFwiZXRhZ1wiLFxuICAgICAgICAgICAgICAgIHR5cGU6IHtcbiAgICAgICAgICAgICAgICAgICAgbmFtZTogXCJTdHJpbmdcIixcbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIGxhc3RNb2RpZmllZDoge1xuICAgICAgICAgICAgICAgIHNlcmlhbGl6ZWROYW1lOiBcImxhc3QtbW9kaWZpZWRcIixcbiAgICAgICAgICAgICAgICB4bWxOYW1lOiBcImxhc3QtbW9kaWZpZWRcIixcbiAgICAgICAgICAgICAgICB0eXBlOiB7XG4gICAgICAgICAgICAgICAgICAgIG5hbWU6IFwiRGF0ZVRpbWVSZmMxMTIzXCIsXG4gICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBjb250ZW50TUQ1OiB7XG4gICAgICAgICAgICAgICAgc2VyaWFsaXplZE5hbWU6IFwiY29udGVudC1tZDVcIixcbiAgICAgICAgICAgICAgICB4bWxOYW1lOiBcImNvbnRlbnQtbWQ1XCIsXG4gICAgICAgICAgICAgICAgdHlwZToge1xuICAgICAgICAgICAgICAgICAgICBuYW1lOiBcIkJ5dGVBcnJheVwiLFxuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgeE1zQ29udGVudENyYzY0OiB7XG4gICAgICAgICAgICAgICAgc2VyaWFsaXplZE5hbWU6IFwieC1tcy1jb250ZW50LWNyYzY0XCIsXG4gICAgICAgICAgICAgICAgeG1sTmFtZTogXCJ4LW1zLWNvbnRlbnQtY3JjNjRcIixcbiAgICAgICAgICAgICAgICB0eXBlOiB7XG4gICAgICAgICAgICAgICAgICAgIG5hbWU6IFwiQnl0ZUFycmF5XCIsXG4gICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBibG9iU2VxdWVuY2VOdW1iZXI6IHtcbiAgICAgICAgICAgICAgICBzZXJpYWxpemVkTmFtZTogXCJ4LW1zLWJsb2Itc2VxdWVuY2UtbnVtYmVyXCIsXG4gICAgICAgICAgICAgICAgeG1sTmFtZTogXCJ4LW1zLWJsb2Itc2VxdWVuY2UtbnVtYmVyXCIsXG4gICAgICAgICAgICAgICAgdHlwZToge1xuICAgICAgICAgICAgICAgICAgICBuYW1lOiBcIk51bWJlclwiLFxuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgY2xpZW50UmVxdWVzdElkOiB7XG4gICAgICAgICAgICAgICAgc2VyaWFsaXplZE5hbWU6IFwieC1tcy1jbGllbnQtcmVxdWVzdC1pZFwiLFxuICAgICAgICAgICAgICAgIHhtbE5hbWU6IFwieC1tcy1jbGllbnQtcmVxdWVzdC1pZFwiLFxuICAgICAgICAgICAgICAgIHR5cGU6IHtcbiAgICAgICAgICAgICAgICAgICAgbmFtZTogXCJTdHJpbmdcIixcbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIHJlcXVlc3RJZDoge1xuICAgICAgICAgICAgICAgIHNlcmlhbGl6ZWROYW1lOiBcIngtbXMtcmVxdWVzdC1pZFwiLFxuICAgICAgICAgICAgICAgIHhtbE5hbWU6IFwieC1tcy1yZXF1ZXN0LWlkXCIsXG4gICAgICAgICAgICAgICAgdHlwZToge1xuICAgICAgICAgICAgICAgICAgICBuYW1lOiBcIlN0cmluZ1wiLFxuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgdmVyc2lvbjoge1xuICAgICAgICAgICAgICAgIHNlcmlhbGl6ZWROYW1lOiBcIngtbXMtdmVyc2lvblwiLFxuICAgICAgICAgICAgICAgIHhtbE5hbWU6IFwieC1tcy12ZXJzaW9uXCIsXG4gICAgICAgICAgICAgICAgdHlwZToge1xuICAgICAgICAgICAgICAgICAgICBuYW1lOiBcIlN0cmluZ1wiLFxuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgZGF0ZToge1xuICAgICAgICAgICAgICAgIHNlcmlhbGl6ZWROYW1lOiBcImRhdGVcIixcbiAgICAgICAgICAgICAgICB4bWxOYW1lOiBcImRhdGVcIixcbiAgICAgICAgICAgICAgICB0eXBlOiB7XG4gICAgICAgICAgICAgICAgICAgIG5hbWU6IFwiRGF0ZVRpbWVSZmMxMTIzXCIsXG4gICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBpc1NlcnZlckVuY3J5cHRlZDoge1xuICAgICAgICAgICAgICAgIHNlcmlhbGl6ZWROYW1lOiBcIngtbXMtcmVxdWVzdC1zZXJ2ZXItZW5jcnlwdGVkXCIsXG4gICAgICAgICAgICAgICAgeG1sTmFtZTogXCJ4LW1zLXJlcXVlc3Qtc2VydmVyLWVuY3J5cHRlZFwiLFxuICAgICAgICAgICAgICAgIHR5cGU6IHtcbiAgICAgICAgICAgICAgICAgICAgbmFtZTogXCJCb29sZWFuXCIsXG4gICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBlbmNyeXB0aW9uS2V5U2hhMjU2OiB7XG4gICAgICAgICAgICAgICAgc2VyaWFsaXplZE5hbWU6IFwieC1tcy1lbmNyeXB0aW9uLWtleS1zaGEyNTZcIixcbiAgICAgICAgICAgICAgICB4bWxOYW1lOiBcIngtbXMtZW5jcnlwdGlvbi1rZXktc2hhMjU2XCIsXG4gICAgICAgICAgICAgICAgdHlwZToge1xuICAgICAgICAgICAgICAgICAgICBuYW1lOiBcIlN0cmluZ1wiLFxuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgZW5jcnlwdGlvblNjb3BlOiB7XG4gICAgICAgICAgICAgICAgc2VyaWFsaXplZE5hbWU6IFwieC1tcy1lbmNyeXB0aW9uLXNjb3BlXCIsXG4gICAgICAgICAgICAgICAgeG1sTmFtZTogXCJ4LW1zLWVuY3J5cHRpb24tc2NvcGVcIixcbiAgICAgICAgICAgICAgICB0eXBlOiB7XG4gICAgICAgICAgICAgICAgICAgIG5hbWU6IFwiU3RyaW5nXCIsXG4gICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBlcnJvckNvZGU6IHtcbiAgICAgICAgICAgICAgICBzZXJpYWxpemVkTmFtZTogXCJ4LW1zLWVycm9yLWNvZGVcIixcbiAgICAgICAgICAgICAgICB4bWxOYW1lOiBcIngtbXMtZXJyb3ItY29kZVwiLFxuICAgICAgICAgICAgICAgIHR5cGU6IHtcbiAgICAgICAgICAgICAgICAgICAgbmFtZTogXCJTdHJpbmdcIixcbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgfSxcbiAgICAgICAgfSxcbiAgICB9LFxufTtcbmNvbnN0IFBhZ2VCbG9iVXBsb2FkUGFnZXNFeGNlcHRpb25IZWFkZXJzID0ge1xuICAgIHNlcmlhbGl6ZWROYW1lOiBcIlBhZ2VCbG9iX3VwbG9hZFBhZ2VzRXhjZXB0aW9uSGVhZGVyc1wiLFxuICAgIHR5cGU6IHtcbiAgICAgICAgbmFtZTogXCJDb21wb3NpdGVcIixcbiAgICAgICAgY2xhc3NOYW1lOiBcIlBhZ2VCbG9iVXBsb2FkUGFnZXNFeGNlcHRpb25IZWFkZXJzXCIsXG4gICAgICAgIG1vZGVsUHJvcGVydGllczoge1xuICAgICAgICAgICAgZXJyb3JDb2RlOiB7XG4gICAgICAgICAgICAgICAgc2VyaWFsaXplZE5hbWU6IFwieC1tcy1lcnJvci1jb2RlXCIsXG4gICAgICAgICAgICAgICAgeG1sTmFtZTogXCJ4LW1zLWVycm9yLWNvZGVcIixcbiAgICAgICAgICAgICAgICB0eXBlOiB7XG4gICAgICAgICAgICAgICAgICAgIG5hbWU6IFwiU3RyaW5nXCIsXG4gICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIH0sXG4gICAgICAgIH0sXG4gICAgfSxcbn07XG5jb25zdCBQYWdlQmxvYkNsZWFyUGFnZXNIZWFkZXJzID0ge1xuICAgIHNlcmlhbGl6ZWROYW1lOiBcIlBhZ2VCbG9iX2NsZWFyUGFnZXNIZWFkZXJzXCIsXG4gICAgdHlwZToge1xuICAgICAgICBuYW1lOiBcIkNvbXBvc2l0ZVwiLFxuICAgICAgICBjbGFzc05hbWU6IFwiUGFnZUJsb2JDbGVhclBhZ2VzSGVhZGVyc1wiLFxuICAgICAgICBtb2RlbFByb3BlcnRpZXM6IHtcbiAgICAgICAgICAgIGV0YWc6IHtcbiAgICAgICAgICAgICAgICBzZXJpYWxpemVkTmFtZTogXCJldGFnXCIsXG4gICAgICAgICAgICAgICAgeG1sTmFtZTogXCJldGFnXCIsXG4gICAgICAgICAgICAgICAgdHlwZToge1xuICAgICAgICAgICAgICAgICAgICBuYW1lOiBcIlN0cmluZ1wiLFxuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgbGFzdE1vZGlmaWVkOiB7XG4gICAgICAgICAgICAgICAgc2VyaWFsaXplZE5hbWU6IFwibGFzdC1tb2RpZmllZFwiLFxuICAgICAgICAgICAgICAgIHhtbE5hbWU6IFwibGFzdC1tb2RpZmllZFwiLFxuICAgICAgICAgICAgICAgIHR5cGU6IHtcbiAgICAgICAgICAgICAgICAgICAgbmFtZTogXCJEYXRlVGltZVJmYzExMjNcIixcbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIGNvbnRlbnRNRDU6IHtcbiAgICAgICAgICAgICAgICBzZXJpYWxpemVkTmFtZTogXCJjb250ZW50LW1kNVwiLFxuICAgICAgICAgICAgICAgIHhtbE5hbWU6IFwiY29udGVudC1tZDVcIixcbiAgICAgICAgICAgICAgICB0eXBlOiB7XG4gICAgICAgICAgICAgICAgICAgIG5hbWU6IFwiQnl0ZUFycmF5XCIsXG4gICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICB4TXNDb250ZW50Q3JjNjQ6IHtcbiAgICAgICAgICAgICAgICBzZXJpYWxpemVkTmFtZTogXCJ4LW1zLWNvbnRlbnQtY3JjNjRcIixcbiAgICAgICAgICAgICAgICB4bWxOYW1lOiBcIngtbXMtY29udGVudC1jcmM2NFwiLFxuICAgICAgICAgICAgICAgIHR5cGU6IHtcbiAgICAgICAgICAgICAgICAgICAgbmFtZTogXCJCeXRlQXJyYXlcIixcbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIGJsb2JTZXF1ZW5jZU51bWJlcjoge1xuICAgICAgICAgICAgICAgIHNlcmlhbGl6ZWROYW1lOiBcIngtbXMtYmxvYi1zZXF1ZW5jZS1udW1iZXJcIixcbiAgICAgICAgICAgICAgICB4bWxOYW1lOiBcIngtbXMtYmxvYi1zZXF1ZW5jZS1udW1iZXJcIixcbiAgICAgICAgICAgICAgICB0eXBlOiB7XG4gICAgICAgICAgICAgICAgICAgIG5hbWU6IFwiTnVtYmVyXCIsXG4gICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBjbGllbnRSZXF1ZXN0SWQ6IHtcbiAgICAgICAgICAgICAgICBzZXJpYWxpemVkTmFtZTogXCJ4LW1zLWNsaWVudC1yZXF1ZXN0LWlkXCIsXG4gICAgICAgICAgICAgICAgeG1sTmFtZTogXCJ4LW1zLWNsaWVudC1yZXF1ZXN0LWlkXCIsXG4gICAgICAgICAgICAgICAgdHlwZToge1xuICAgICAgICAgICAgICAgICAgICBuYW1lOiBcIlN0cmluZ1wiLFxuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgcmVxdWVzdElkOiB7XG4gICAgICAgICAgICAgICAgc2VyaWFsaXplZE5hbWU6IFwieC1tcy1yZXF1ZXN0LWlkXCIsXG4gICAgICAgICAgICAgICAgeG1sTmFtZTogXCJ4LW1zLXJlcXVlc3QtaWRcIixcbiAgICAgICAgICAgICAgICB0eXBlOiB7XG4gICAgICAgICAgICAgICAgICAgIG5hbWU6IFwiU3RyaW5nXCIsXG4gICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICB2ZXJzaW9uOiB7XG4gICAgICAgICAgICAgICAgc2VyaWFsaXplZE5hbWU6IFwieC1tcy12ZXJzaW9uXCIsXG4gICAgICAgICAgICAgICAgeG1sTmFtZTogXCJ4LW1zLXZlcnNpb25cIixcbiAgICAgICAgICAgICAgICB0eXBlOiB7XG4gICAgICAgICAgICAgICAgICAgIG5hbWU6IFwiU3RyaW5nXCIsXG4gICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBkYXRlOiB7XG4gICAgICAgICAgICAgICAgc2VyaWFsaXplZE5hbWU6IFwiZGF0ZVwiLFxuICAgICAgICAgICAgICAgIHhtbE5hbWU6IFwiZGF0ZVwiLFxuICAgICAgICAgICAgICAgIHR5cGU6IHtcbiAgICAgICAgICAgICAgICAgICAgbmFtZTogXCJEYXRlVGltZVJmYzExMjNcIixcbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIGVycm9yQ29kZToge1xuICAgICAgICAgICAgICAgIHNlcmlhbGl6ZWROYW1lOiBcIngtbXMtZXJyb3ItY29kZVwiLFxuICAgICAgICAgICAgICAgIHhtbE5hbWU6IFwieC1tcy1lcnJvci1jb2RlXCIsXG4gICAgICAgICAgICAgICAgdHlwZToge1xuICAgICAgICAgICAgICAgICAgICBuYW1lOiBcIlN0cmluZ1wiLFxuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICB9LFxuICAgICAgICB9LFxuICAgIH0sXG59O1xuY29uc3QgUGFnZUJsb2JDbGVhclBhZ2VzRXhjZXB0aW9uSGVhZGVycyA9IHtcbiAgICBzZXJpYWxpemVkTmFtZTogXCJQYWdlQmxvYl9jbGVhclBhZ2VzRXhjZXB0aW9uSGVhZGVyc1wiLFxuICAgIHR5cGU6IHtcbiAgICAgICAgbmFtZTogXCJDb21wb3NpdGVcIixcbiAgICAgICAgY2xhc3NOYW1lOiBcIlBhZ2VCbG9iQ2xlYXJQYWdlc0V4Y2VwdGlvbkhlYWRlcnNcIixcbiAgICAgICAgbW9kZWxQcm9wZXJ0aWVzOiB7XG4gICAgICAgICAgICBlcnJvckNvZGU6IHtcbiAgICAgICAgICAgICAgICBzZXJpYWxpemVkTmFtZTogXCJ4LW1zLWVycm9yLWNvZGVcIixcbiAgICAgICAgICAgICAgICB4bWxOYW1lOiBcIngtbXMtZXJyb3ItY29kZVwiLFxuICAgICAgICAgICAgICAgIHR5cGU6IHtcbiAgICAgICAgICAgICAgICAgICAgbmFtZTogXCJTdHJpbmdcIixcbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgfSxcbiAgICAgICAgfSxcbiAgICB9LFxufTtcbmNvbnN0IFBhZ2VCbG9iVXBsb2FkUGFnZXNGcm9tVVJMSGVhZGVycyA9IHtcbiAgICBzZXJpYWxpemVkTmFtZTogXCJQYWdlQmxvYl91cGxvYWRQYWdlc0Zyb21VUkxIZWFkZXJzXCIsXG4gICAgdHlwZToge1xuICAgICAgICBuYW1lOiBcIkNvbXBvc2l0ZVwiLFxuICAgICAgICBjbGFzc05hbWU6IFwiUGFnZUJsb2JVcGxvYWRQYWdlc0Zyb21VUkxIZWFkZXJzXCIsXG4gICAgICAgIG1vZGVsUHJvcGVydGllczoge1xuICAgICAgICAgICAgZXRhZzoge1xuICAgICAgICAgICAgICAgIHNlcmlhbGl6ZWROYW1lOiBcImV0YWdcIixcbiAgICAgICAgICAgICAgICB4bWxOYW1lOiBcImV0YWdcIixcbiAgICAgICAgICAgICAgICB0eXBlOiB7XG4gICAgICAgICAgICAgICAgICAgIG5hbWU6IFwiU3RyaW5nXCIsXG4gICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBsYXN0TW9kaWZpZWQ6IHtcbiAgICAgICAgICAgICAgICBzZXJpYWxpemVkTmFtZTogXCJsYXN0LW1vZGlmaWVkXCIsXG4gICAgICAgICAgICAgICAgeG1sTmFtZTogXCJsYXN0LW1vZGlmaWVkXCIsXG4gICAgICAgICAgICAgICAgdHlwZToge1xuICAgICAgICAgICAgICAgICAgICBuYW1lOiBcIkRhdGVUaW1lUmZjMTEyM1wiLFxuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgY29udGVudE1ENToge1xuICAgICAgICAgICAgICAgIHNlcmlhbGl6ZWROYW1lOiBcImNvbnRlbnQtbWQ1XCIsXG4gICAgICAgICAgICAgICAgeG1sTmFtZTogXCJjb250ZW50LW1kNVwiLFxuICAgICAgICAgICAgICAgIHR5cGU6IHtcbiAgICAgICAgICAgICAgICAgICAgbmFtZTogXCJCeXRlQXJyYXlcIixcbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIHhNc0NvbnRlbnRDcmM2NDoge1xuICAgICAgICAgICAgICAgIHNlcmlhbGl6ZWROYW1lOiBcIngtbXMtY29udGVudC1jcmM2NFwiLFxuICAgICAgICAgICAgICAgIHhtbE5hbWU6IFwieC1tcy1jb250ZW50LWNyYzY0XCIsXG4gICAgICAgICAgICAgICAgdHlwZToge1xuICAgICAgICAgICAgICAgICAgICBuYW1lOiBcIkJ5dGVBcnJheVwiLFxuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgYmxvYlNlcXVlbmNlTnVtYmVyOiB7XG4gICAgICAgICAgICAgICAgc2VyaWFsaXplZE5hbWU6IFwieC1tcy1ibG9iLXNlcXVlbmNlLW51bWJlclwiLFxuICAgICAgICAgICAgICAgIHhtbE5hbWU6IFwieC1tcy1ibG9iLXNlcXVlbmNlLW51bWJlclwiLFxuICAgICAgICAgICAgICAgIHR5cGU6IHtcbiAgICAgICAgICAgICAgICAgICAgbmFtZTogXCJOdW1iZXJcIixcbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIHJlcXVlc3RJZDoge1xuICAgICAgICAgICAgICAgIHNlcmlhbGl6ZWROYW1lOiBcIngtbXMtcmVxdWVzdC1pZFwiLFxuICAgICAgICAgICAgICAgIHhtbE5hbWU6IFwieC1tcy1yZXF1ZXN0LWlkXCIsXG4gICAgICAgICAgICAgICAgdHlwZToge1xuICAgICAgICAgICAgICAgICAgICBuYW1lOiBcIlN0cmluZ1wiLFxuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgdmVyc2lvbjoge1xuICAgICAgICAgICAgICAgIHNlcmlhbGl6ZWROYW1lOiBcIngtbXMtdmVyc2lvblwiLFxuICAgICAgICAgICAgICAgIHhtbE5hbWU6IFwieC1tcy12ZXJzaW9uXCIsXG4gICAgICAgICAgICAgICAgdHlwZToge1xuICAgICAgICAgICAgICAgICAgICBuYW1lOiBcIlN0cmluZ1wiLFxuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgZGF0ZToge1xuICAgICAgICAgICAgICAgIHNlcmlhbGl6ZWROYW1lOiBcImRhdGVcIixcbiAgICAgICAgICAgICAgICB4bWxOYW1lOiBcImRhdGVcIixcbiAgICAgICAgICAgICAgICB0eXBlOiB7XG4gICAgICAgICAgICAgICAgICAgIG5hbWU6IFwiRGF0ZVRpbWVSZmMxMTIzXCIsXG4gICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBpc1NlcnZlckVuY3J5cHRlZDoge1xuICAgICAgICAgICAgICAgIHNlcmlhbGl6ZWROYW1lOiBcIngtbXMtcmVxdWVzdC1zZXJ2ZXItZW5jcnlwdGVkXCIsXG4gICAgICAgICAgICAgICAgeG1sTmFtZTogXCJ4LW1zLXJlcXVlc3Qtc2VydmVyLWVuY3J5cHRlZFwiLFxuICAgICAgICAgICAgICAgIHR5cGU6IHtcbiAgICAgICAgICAgICAgICAgICAgbmFtZTogXCJCb29sZWFuXCIsXG4gICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBlbmNyeXB0aW9uS2V5U2hhMjU2OiB7XG4gICAgICAgICAgICAgICAgc2VyaWFsaXplZE5hbWU6IFwieC1tcy1lbmNyeXB0aW9uLWtleS1zaGEyNTZcIixcbiAgICAgICAgICAgICAgICB4bWxOYW1lOiBcIngtbXMtZW5jcnlwdGlvbi1rZXktc2hhMjU2XCIsXG4gICAgICAgICAgICAgICAgdHlwZToge1xuICAgICAgICAgICAgICAgICAgICBuYW1lOiBcIlN0cmluZ1wiLFxuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgZW5jcnlwdGlvblNjb3BlOiB7XG4gICAgICAgICAgICAgICAgc2VyaWFsaXplZE5hbWU6IFwieC1tcy1lbmNyeXB0aW9uLXNjb3BlXCIsXG4gICAgICAgICAgICAgICAgeG1sTmFtZTogXCJ4LW1zLWVuY3J5cHRpb24tc2NvcGVcIixcbiAgICAgICAgICAgICAgICB0eXBlOiB7XG4gICAgICAgICAgICAgICAgICAgIG5hbWU6IFwiU3RyaW5nXCIsXG4gICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBlcnJvckNvZGU6IHtcbiAgICAgICAgICAgICAgICBzZXJpYWxpemVkTmFtZTogXCJ4LW1zLWVycm9yLWNvZGVcIixcbiAgICAgICAgICAgICAgICB4bWxOYW1lOiBcIngtbXMtZXJyb3ItY29kZVwiLFxuICAgICAgICAgICAgICAgIHR5cGU6IHtcbiAgICAgICAgICAgICAgICAgICAgbmFtZTogXCJTdHJpbmdcIixcbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgfSxcbiAgICAgICAgfSxcbiAgICB9LFxufTtcbmNvbnN0IFBhZ2VCbG9iVXBsb2FkUGFnZXNGcm9tVVJMRXhjZXB0aW9uSGVhZGVycyA9IHtcbiAgICBzZXJpYWxpemVkTmFtZTogXCJQYWdlQmxvYl91cGxvYWRQYWdlc0Zyb21VUkxFeGNlcHRpb25IZWFkZXJzXCIsXG4gICAgdHlwZToge1xuICAgICAgICBuYW1lOiBcIkNvbXBvc2l0ZVwiLFxuICAgICAgICBjbGFzc05hbWU6IFwiUGFnZUJsb2JVcGxvYWRQYWdlc0Zyb21VUkxFeGNlcHRpb25IZWFkZXJzXCIsXG4gICAgICAgIG1vZGVsUHJvcGVydGllczoge1xuICAgICAgICAgICAgZXJyb3JDb2RlOiB7XG4gICAgICAgICAgICAgICAgc2VyaWFsaXplZE5hbWU6IFwieC1tcy1lcnJvci1jb2RlXCIsXG4gICAgICAgICAgICAgICAgeG1sTmFtZTogXCJ4LW1zLWVycm9yLWNvZGVcIixcbiAgICAgICAgICAgICAgICB0eXBlOiB7XG4gICAgICAgICAgICAgICAgICAgIG5hbWU6IFwiU3RyaW5nXCIsXG4gICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIH0sXG4gICAgICAgIH0sXG4gICAgfSxcbn07XG5jb25zdCBQYWdlQmxvYkdldFBhZ2VSYW5nZXNIZWFkZXJzID0ge1xuICAgIHNlcmlhbGl6ZWROYW1lOiBcIlBhZ2VCbG9iX2dldFBhZ2VSYW5nZXNIZWFkZXJzXCIsXG4gICAgdHlwZToge1xuICAgICAgICBuYW1lOiBcIkNvbXBvc2l0ZVwiLFxuICAgICAgICBjbGFzc05hbWU6IFwiUGFnZUJsb2JHZXRQYWdlUmFuZ2VzSGVhZGVyc1wiLFxuICAgICAgICBtb2RlbFByb3BlcnRpZXM6IHtcbiAgICAgICAgICAgIGxhc3RNb2RpZmllZDoge1xuICAgICAgICAgICAgICAgIHNlcmlhbGl6ZWROYW1lOiBcImxhc3QtbW9kaWZpZWRcIixcbiAgICAgICAgICAgICAgICB4bWxOYW1lOiBcImxhc3QtbW9kaWZpZWRcIixcbiAgICAgICAgICAgICAgICB0eXBlOiB7XG4gICAgICAgICAgICAgICAgICAgIG5hbWU6IFwiRGF0ZVRpbWVSZmMxMTIzXCIsXG4gICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBldGFnOiB7XG4gICAgICAgICAgICAgICAgc2VyaWFsaXplZE5hbWU6IFwiZXRhZ1wiLFxuICAgICAgICAgICAgICAgIHhtbE5hbWU6IFwiZXRhZ1wiLFxuICAgICAgICAgICAgICAgIHR5cGU6IHtcbiAgICAgICAgICAgICAgICAgICAgbmFtZTogXCJTdHJpbmdcIixcbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIGJsb2JDb250ZW50TGVuZ3RoOiB7XG4gICAgICAgICAgICAgICAgc2VyaWFsaXplZE5hbWU6IFwieC1tcy1ibG9iLWNvbnRlbnQtbGVuZ3RoXCIsXG4gICAgICAgICAgICAgICAgeG1sTmFtZTogXCJ4LW1zLWJsb2ItY29udGVudC1sZW5ndGhcIixcbiAgICAgICAgICAgICAgICB0eXBlOiB7XG4gICAgICAgICAgICAgICAgICAgIG5hbWU6IFwiTnVtYmVyXCIsXG4gICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBjbGllbnRSZXF1ZXN0SWQ6IHtcbiAgICAgICAgICAgICAgICBzZXJpYWxpemVkTmFtZTogXCJ4LW1zLWNsaWVudC1yZXF1ZXN0LWlkXCIsXG4gICAgICAgICAgICAgICAgeG1sTmFtZTogXCJ4LW1zLWNsaWVudC1yZXF1ZXN0LWlkXCIsXG4gICAgICAgICAgICAgICAgdHlwZToge1xuICAgICAgICAgICAgICAgICAgICBuYW1lOiBcIlN0cmluZ1wiLFxuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgcmVxdWVzdElkOiB7XG4gICAgICAgICAgICAgICAgc2VyaWFsaXplZE5hbWU6IFwieC1tcy1yZXF1ZXN0LWlkXCIsXG4gICAgICAgICAgICAgICAgeG1sTmFtZTogXCJ4LW1zLXJlcXVlc3QtaWRcIixcbiAgICAgICAgICAgICAgICB0eXBlOiB7XG4gICAgICAgICAgICAgICAgICAgIG5hbWU6IFwiU3RyaW5nXCIsXG4gICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICB2ZXJzaW9uOiB7XG4gICAgICAgICAgICAgICAgc2VyaWFsaXplZE5hbWU6IFwieC1tcy12ZXJzaW9uXCIsXG4gICAgICAgICAgICAgICAgeG1sTmFtZTogXCJ4LW1zLXZlcnNpb25cIixcbiAgICAgICAgICAgICAgICB0eXBlOiB7XG4gICAgICAgICAgICAgICAgICAgIG5hbWU6IFwiU3RyaW5nXCIsXG4gICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBkYXRlOiB7XG4gICAgICAgICAgICAgICAgc2VyaWFsaXplZE5hbWU6IFwiZGF0ZVwiLFxuICAgICAgICAgICAgICAgIHhtbE5hbWU6IFwiZGF0ZVwiLFxuICAgICAgICAgICAgICAgIHR5cGU6IHtcbiAgICAgICAgICAgICAgICAgICAgbmFtZTogXCJEYXRlVGltZVJmYzExMjNcIixcbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIGVycm9yQ29kZToge1xuICAgICAgICAgICAgICAgIHNlcmlhbGl6ZWROYW1lOiBcIngtbXMtZXJyb3ItY29kZVwiLFxuICAgICAgICAgICAgICAgIHhtbE5hbWU6IFwieC1tcy1lcnJvci1jb2RlXCIsXG4gICAgICAgICAgICAgICAgdHlwZToge1xuICAgICAgICAgICAgICAgICAgICBuYW1lOiBcIlN0cmluZ1wiLFxuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICB9LFxuICAgICAgICB9LFxuICAgIH0sXG59O1xuY29uc3QgUGFnZUJsb2JHZXRQYWdlUmFuZ2VzRXhjZXB0aW9uSGVhZGVycyA9IHtcbiAgICBzZXJpYWxpemVkTmFtZTogXCJQYWdlQmxvYl9nZXRQYWdlUmFuZ2VzRXhjZXB0aW9uSGVhZGVyc1wiLFxuICAgIHR5cGU6IHtcbiAgICAgICAgbmFtZTogXCJDb21wb3NpdGVcIixcbiAgICAgICAgY2xhc3NOYW1lOiBcIlBhZ2VCbG9iR2V0UGFnZVJhbmdlc0V4Y2VwdGlvbkhlYWRlcnNcIixcbiAgICAgICAgbW9kZWxQcm9wZXJ0aWVzOiB7XG4gICAgICAgICAgICBlcnJvckNvZGU6IHtcbiAgICAgICAgICAgICAgICBzZXJpYWxpemVkTmFtZTogXCJ4LW1zLWVycm9yLWNvZGVcIixcbiAgICAgICAgICAgICAgICB4bWxOYW1lOiBcIngtbXMtZXJyb3ItY29kZVwiLFxuICAgICAgICAgICAgICAgIHR5cGU6IHtcbiAgICAgICAgICAgICAgICAgICAgbmFtZTogXCJTdHJpbmdcIixcbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgfSxcbiAgICAgICAgfSxcbiAgICB9LFxufTtcbmNvbnN0IFBhZ2VCbG9iR2V0UGFnZVJhbmdlc0RpZmZIZWFkZXJzID0ge1xuICAgIHNlcmlhbGl6ZWROYW1lOiBcIlBhZ2VCbG9iX2dldFBhZ2VSYW5nZXNEaWZmSGVhZGVyc1wiLFxuICAgIHR5cGU6IHtcbiAgICAgICAgbmFtZTogXCJDb21wb3NpdGVcIixcbiAgICAgICAgY2xhc3NOYW1lOiBcIlBhZ2VCbG9iR2V0UGFnZVJhbmdlc0RpZmZIZWFkZXJzXCIsXG4gICAgICAgIG1vZGVsUHJvcGVydGllczoge1xuICAgICAgICAgICAgbGFzdE1vZGlmaWVkOiB7XG4gICAgICAgICAgICAgICAgc2VyaWFsaXplZE5hbWU6IFwibGFzdC1tb2RpZmllZFwiLFxuICAgICAgICAgICAgICAgIHhtbE5hbWU6IFwibGFzdC1tb2RpZmllZFwiLFxuICAgICAgICAgICAgICAgIHR5cGU6IHtcbiAgICAgICAgICAgICAgICAgICAgbmFtZTogXCJEYXRlVGltZVJmYzExMjNcIixcbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIGV0YWc6IHtcbiAgICAgICAgICAgICAgICBzZXJpYWxpemVkTmFtZTogXCJldGFnXCIsXG4gICAgICAgICAgICAgICAgeG1sTmFtZTogXCJldGFnXCIsXG4gICAgICAgICAgICAgICAgdHlwZToge1xuICAgICAgICAgICAgICAgICAgICBuYW1lOiBcIlN0cmluZ1wiLFxuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgYmxvYkNvbnRlbnRMZW5ndGg6IHtcbiAgICAgICAgICAgICAgICBzZXJpYWxpemVkTmFtZTogXCJ4LW1zLWJsb2ItY29udGVudC1sZW5ndGhcIixcbiAgICAgICAgICAgICAgICB4bWxOYW1lOiBcIngtbXMtYmxvYi1jb250ZW50LWxlbmd0aFwiLFxuICAgICAgICAgICAgICAgIHR5cGU6IHtcbiAgICAgICAgICAgICAgICAgICAgbmFtZTogXCJOdW1iZXJcIixcbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIGNsaWVudFJlcXVlc3RJZDoge1xuICAgICAgICAgICAgICAgIHNlcmlhbGl6ZWROYW1lOiBcIngtbXMtY2xpZW50LXJlcXVlc3QtaWRcIixcbiAgICAgICAgICAgICAgICB4bWxOYW1lOiBcIngtbXMtY2xpZW50LXJlcXVlc3QtaWRcIixcbiAgICAgICAgICAgICAgICB0eXBlOiB7XG4gICAgICAgICAgICAgICAgICAgIG5hbWU6IFwiU3RyaW5nXCIsXG4gICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICByZXF1ZXN0SWQ6IHtcbiAgICAgICAgICAgICAgICBzZXJpYWxpemVkTmFtZTogXCJ4LW1zLXJlcXVlc3QtaWRcIixcbiAgICAgICAgICAgICAgICB4bWxOYW1lOiBcIngtbXMtcmVxdWVzdC1pZFwiLFxuICAgICAgICAgICAgICAgIHR5cGU6IHtcbiAgICAgICAgICAgICAgICAgICAgbmFtZTogXCJTdHJpbmdcIixcbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIHZlcnNpb246IHtcbiAgICAgICAgICAgICAgICBzZXJpYWxpemVkTmFtZTogXCJ4LW1zLXZlcnNpb25cIixcbiAgICAgICAgICAgICAgICB4bWxOYW1lOiBcIngtbXMtdmVyc2lvblwiLFxuICAgICAgICAgICAgICAgIHR5cGU6IHtcbiAgICAgICAgICAgICAgICAgICAgbmFtZTogXCJTdHJpbmdcIixcbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIGRhdGU6IHtcbiAgICAgICAgICAgICAgICBzZXJpYWxpemVkTmFtZTogXCJkYXRlXCIsXG4gICAgICAgICAgICAgICAgeG1sTmFtZTogXCJkYXRlXCIsXG4gICAgICAgICAgICAgICAgdHlwZToge1xuICAgICAgICAgICAgICAgICAgICBuYW1lOiBcIkRhdGVUaW1lUmZjMTEyM1wiLFxuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgZXJyb3JDb2RlOiB7XG4gICAgICAgICAgICAgICAgc2VyaWFsaXplZE5hbWU6IFwieC1tcy1lcnJvci1jb2RlXCIsXG4gICAgICAgICAgICAgICAgeG1sTmFtZTogXCJ4LW1zLWVycm9yLWNvZGVcIixcbiAgICAgICAgICAgICAgICB0eXBlOiB7XG4gICAgICAgICAgICAgICAgICAgIG5hbWU6IFwiU3RyaW5nXCIsXG4gICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIH0sXG4gICAgICAgIH0sXG4gICAgfSxcbn07XG5jb25zdCBQYWdlQmxvYkdldFBhZ2VSYW5nZXNEaWZmRXhjZXB0aW9uSGVhZGVycyA9IHtcbiAgICBzZXJpYWxpemVkTmFtZTogXCJQYWdlQmxvYl9nZXRQYWdlUmFuZ2VzRGlmZkV4Y2VwdGlvbkhlYWRlcnNcIixcbiAgICB0eXBlOiB7XG4gICAgICAgIG5hbWU6IFwiQ29tcG9zaXRlXCIsXG4gICAgICAgIGNsYXNzTmFtZTogXCJQYWdlQmxvYkdldFBhZ2VSYW5nZXNEaWZmRXhjZXB0aW9uSGVhZGVyc1wiLFxuICAgICAgICBtb2RlbFByb3BlcnRpZXM6IHtcbiAgICAgICAgICAgIGVycm9yQ29kZToge1xuICAgICAgICAgICAgICAgIHNlcmlhbGl6ZWROYW1lOiBcIngtbXMtZXJyb3ItY29kZVwiLFxuICAgICAgICAgICAgICAgIHhtbE5hbWU6IFwieC1tcy1lcnJvci1jb2RlXCIsXG4gICAgICAgICAgICAgICAgdHlwZToge1xuICAgICAgICAgICAgICAgICAgICBuYW1lOiBcIlN0cmluZ1wiLFxuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICB9LFxuICAgICAgICB9LFxuICAgIH0sXG59O1xuY29uc3QgUGFnZUJsb2JSZXNpemVIZWFkZXJzID0ge1xuICAgIHNlcmlhbGl6ZWROYW1lOiBcIlBhZ2VCbG9iX3Jlc2l6ZUhlYWRlcnNcIixcbiAgICB0eXBlOiB7XG4gICAgICAgIG5hbWU6IFwiQ29tcG9zaXRlXCIsXG4gICAgICAgIGNsYXNzTmFtZTogXCJQYWdlQmxvYlJlc2l6ZUhlYWRlcnNcIixcbiAgICAgICAgbW9kZWxQcm9wZXJ0aWVzOiB7XG4gICAgICAgICAgICBldGFnOiB7XG4gICAgICAgICAgICAgICAgc2VyaWFsaXplZE5hbWU6IFwiZXRhZ1wiLFxuICAgICAgICAgICAgICAgIHhtbE5hbWU6IFwiZXRhZ1wiLFxuICAgICAgICAgICAgICAgIHR5cGU6IHtcbiAgICAgICAgICAgICAgICAgICAgbmFtZTogXCJTdHJpbmdcIixcbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIGxhc3RNb2RpZmllZDoge1xuICAgICAgICAgICAgICAgIHNlcmlhbGl6ZWROYW1lOiBcImxhc3QtbW9kaWZpZWRcIixcbiAgICAgICAgICAgICAgICB4bWxOYW1lOiBcImxhc3QtbW9kaWZpZWRcIixcbiAgICAgICAgICAgICAgICB0eXBlOiB7XG4gICAgICAgICAgICAgICAgICAgIG5hbWU6IFwiRGF0ZVRpbWVSZmMxMTIzXCIsXG4gICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBibG9iU2VxdWVuY2VOdW1iZXI6IHtcbiAgICAgICAgICAgICAgICBzZXJpYWxpemVkTmFtZTogXCJ4LW1zLWJsb2Itc2VxdWVuY2UtbnVtYmVyXCIsXG4gICAgICAgICAgICAgICAgeG1sTmFtZTogXCJ4LW1zLWJsb2Itc2VxdWVuY2UtbnVtYmVyXCIsXG4gICAgICAgICAgICAgICAgdHlwZToge1xuICAgICAgICAgICAgICAgICAgICBuYW1lOiBcIk51bWJlclwiLFxuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgY2xpZW50UmVxdWVzdElkOiB7XG4gICAgICAgICAgICAgICAgc2VyaWFsaXplZE5hbWU6IFwieC1tcy1jbGllbnQtcmVxdWVzdC1pZFwiLFxuICAgICAgICAgICAgICAgIHhtbE5hbWU6IFwieC1tcy1jbGllbnQtcmVxdWVzdC1pZFwiLFxuICAgICAgICAgICAgICAgIHR5cGU6IHtcbiAgICAgICAgICAgICAgICAgICAgbmFtZTogXCJTdHJpbmdcIixcbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIHJlcXVlc3RJZDoge1xuICAgICAgICAgICAgICAgIHNlcmlhbGl6ZWROYW1lOiBcIngtbXMtcmVxdWVzdC1pZFwiLFxuICAgICAgICAgICAgICAgIHhtbE5hbWU6IFwieC1tcy1yZXF1ZXN0LWlkXCIsXG4gICAgICAgICAgICAgICAgdHlwZToge1xuICAgICAgICAgICAgICAgICAgICBuYW1lOiBcIlN0cmluZ1wiLFxuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgdmVyc2lvbjoge1xuICAgICAgICAgICAgICAgIHNlcmlhbGl6ZWROYW1lOiBcIngtbXMtdmVyc2lvblwiLFxuICAgICAgICAgICAgICAgIHhtbE5hbWU6IFwieC1tcy12ZXJzaW9uXCIsXG4gICAgICAgICAgICAgICAgdHlwZToge1xuICAgICAgICAgICAgICAgICAgICBuYW1lOiBcIlN0cmluZ1wiLFxuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgZGF0ZToge1xuICAgICAgICAgICAgICAgIHNlcmlhbGl6ZWROYW1lOiBcImRhdGVcIixcbiAgICAgICAgICAgICAgICB4bWxOYW1lOiBcImRhdGVcIixcbiAgICAgICAgICAgICAgICB0eXBlOiB7XG4gICAgICAgICAgICAgICAgICAgIG5hbWU6IFwiRGF0ZVRpbWVSZmMxMTIzXCIsXG4gICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBlcnJvckNvZGU6IHtcbiAgICAgICAgICAgICAgICBzZXJpYWxpemVkTmFtZTogXCJ4LW1zLWVycm9yLWNvZGVcIixcbiAgICAgICAgICAgICAgICB4bWxOYW1lOiBcIngtbXMtZXJyb3ItY29kZVwiLFxuICAgICAgICAgICAgICAgIHR5cGU6IHtcbiAgICAgICAgICAgICAgICAgICAgbmFtZTogXCJTdHJpbmdcIixcbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgfSxcbiAgICAgICAgfSxcbiAgICB9LFxufTtcbmNvbnN0IFBhZ2VCbG9iUmVzaXplRXhjZXB0aW9uSGVhZGVycyA9IHtcbiAgICBzZXJpYWxpemVkTmFtZTogXCJQYWdlQmxvYl9yZXNpemVFeGNlcHRpb25IZWFkZXJzXCIsXG4gICAgdHlwZToge1xuICAgICAgICBuYW1lOiBcIkNvbXBvc2l0ZVwiLFxuICAgICAgICBjbGFzc05hbWU6IFwiUGFnZUJsb2JSZXNpemVFeGNlcHRpb25IZWFkZXJzXCIsXG4gICAgICAgIG1vZGVsUHJvcGVydGllczoge1xuICAgICAgICAgICAgZXJyb3JDb2RlOiB7XG4gICAgICAgICAgICAgICAgc2VyaWFsaXplZE5hbWU6IFwieC1tcy1lcnJvci1jb2RlXCIsXG4gICAgICAgICAgICAgICAgeG1sTmFtZTogXCJ4LW1zLWVycm9yLWNvZGVcIixcbiAgICAgICAgICAgICAgICB0eXBlOiB7XG4gICAgICAgICAgICAgICAgICAgIG5hbWU6IFwiU3RyaW5nXCIsXG4gICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIH0sXG4gICAgICAgIH0sXG4gICAgfSxcbn07XG5jb25zdCBQYWdlQmxvYlVwZGF0ZVNlcXVlbmNlTnVtYmVySGVhZGVycyA9IHtcbiAgICBzZXJpYWxpemVkTmFtZTogXCJQYWdlQmxvYl91cGRhdGVTZXF1ZW5jZU51bWJlckhlYWRlcnNcIixcbiAgICB0eXBlOiB7XG4gICAgICAgIG5hbWU6IFwiQ29tcG9zaXRlXCIsXG4gICAgICAgIGNsYXNzTmFtZTogXCJQYWdlQmxvYlVwZGF0ZVNlcXVlbmNlTnVtYmVySGVhZGVyc1wiLFxuICAgICAgICBtb2RlbFByb3BlcnRpZXM6IHtcbiAgICAgICAgICAgIGV0YWc6IHtcbiAgICAgICAgICAgICAgICBzZXJpYWxpemVkTmFtZTogXCJldGFnXCIsXG4gICAgICAgICAgICAgICAgeG1sTmFtZTogXCJldGFnXCIsXG4gICAgICAgICAgICAgICAgdHlwZToge1xuICAgICAgICAgICAgICAgICAgICBuYW1lOiBcIlN0cmluZ1wiLFxuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgbGFzdE1vZGlmaWVkOiB7XG4gICAgICAgICAgICAgICAgc2VyaWFsaXplZE5hbWU6IFwibGFzdC1tb2RpZmllZFwiLFxuICAgICAgICAgICAgICAgIHhtbE5hbWU6IFwibGFzdC1tb2RpZmllZFwiLFxuICAgICAgICAgICAgICAgIHR5cGU6IHtcbiAgICAgICAgICAgICAgICAgICAgbmFtZTogXCJEYXRlVGltZVJmYzExMjNcIixcbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIGJsb2JTZXF1ZW5jZU51bWJlcjoge1xuICAgICAgICAgICAgICAgIHNlcmlhbGl6ZWROYW1lOiBcIngtbXMtYmxvYi1zZXF1ZW5jZS1udW1iZXJcIixcbiAgICAgICAgICAgICAgICB4bWxOYW1lOiBcIngtbXMtYmxvYi1zZXF1ZW5jZS1udW1iZXJcIixcbiAgICAgICAgICAgICAgICB0eXBlOiB7XG4gICAgICAgICAgICAgICAgICAgIG5hbWU6IFwiTnVtYmVyXCIsXG4gICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBjbGllbnRSZXF1ZXN0SWQ6IHtcbiAgICAgICAgICAgICAgICBzZXJpYWxpemVkTmFtZTogXCJ4LW1zLWNsaWVudC1yZXF1ZXN0LWlkXCIsXG4gICAgICAgICAgICAgICAgeG1sTmFtZTogXCJ4LW1zLWNsaWVudC1yZXF1ZXN0LWlkXCIsXG4gICAgICAgICAgICAgICAgdHlwZToge1xuICAgICAgICAgICAgICAgICAgICBuYW1lOiBcIlN0cmluZ1wiLFxuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgcmVxdWVzdElkOiB7XG4gICAgICAgICAgICAgICAgc2VyaWFsaXplZE5hbWU6IFwieC1tcy1yZXF1ZXN0LWlkXCIsXG4gICAgICAgICAgICAgICAgeG1sTmFtZTogXCJ4LW1zLXJlcXVlc3QtaWRcIixcbiAgICAgICAgICAgICAgICB0eXBlOiB7XG4gICAgICAgICAgICAgICAgICAgIG5hbWU6IFwiU3RyaW5nXCIsXG4gICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICB2ZXJzaW9uOiB7XG4gICAgICAgICAgICAgICAgc2VyaWFsaXplZE5hbWU6IFwieC1tcy12ZXJzaW9uXCIsXG4gICAgICAgICAgICAgICAgeG1sTmFtZTogXCJ4LW1zLXZlcnNpb25cIixcbiAgICAgICAgICAgICAgICB0eXBlOiB7XG4gICAgICAgICAgICAgICAgICAgIG5hbWU6IFwiU3RyaW5nXCIsXG4gICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBkYXRlOiB7XG4gICAgICAgICAgICAgICAgc2VyaWFsaXplZE5hbWU6IFwiZGF0ZVwiLFxuICAgICAgICAgICAgICAgIHhtbE5hbWU6IFwiZGF0ZVwiLFxuICAgICAgICAgICAgICAgIHR5cGU6IHtcbiAgICAgICAgICAgICAgICAgICAgbmFtZTogXCJEYXRlVGltZVJmYzExMjNcIixcbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIGVycm9yQ29kZToge1xuICAgICAgICAgICAgICAgIHNlcmlhbGl6ZWROYW1lOiBcIngtbXMtZXJyb3ItY29kZVwiLFxuICAgICAgICAgICAgICAgIHhtbE5hbWU6IFwieC1tcy1lcnJvci1jb2RlXCIsXG4gICAgICAgICAgICAgICAgdHlwZToge1xuICAgICAgICAgICAgICAgICAgICBuYW1lOiBcIlN0cmluZ1wiLFxuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICB9LFxuICAgICAgICB9LFxuICAgIH0sXG59O1xuY29uc3QgUGFnZUJsb2JVcGRhdGVTZXF1ZW5jZU51bWJlckV4Y2VwdGlvbkhlYWRlcnMgPSB7XG4gICAgc2VyaWFsaXplZE5hbWU6IFwiUGFnZUJsb2JfdXBkYXRlU2VxdWVuY2VOdW1iZXJFeGNlcHRpb25IZWFkZXJzXCIsXG4gICAgdHlwZToge1xuICAgICAgICBuYW1lOiBcIkNvbXBvc2l0ZVwiLFxuICAgICAgICBjbGFzc05hbWU6IFwiUGFnZUJsb2JVcGRhdGVTZXF1ZW5jZU51bWJlckV4Y2VwdGlvbkhlYWRlcnNcIixcbiAgICAgICAgbW9kZWxQcm9wZXJ0aWVzOiB7XG4gICAgICAgICAgICBlcnJvckNvZGU6IHtcbiAgICAgICAgICAgICAgICBzZXJpYWxpemVkTmFtZTogXCJ4LW1zLWVycm9yLWNvZGVcIixcbiAgICAgICAgICAgICAgICB4bWxOYW1lOiBcIngtbXMtZXJyb3ItY29kZVwiLFxuICAgICAgICAgICAgICAgIHR5cGU6IHtcbiAgICAgICAgICAgICAgICAgICAgbmFtZTogXCJTdHJpbmdcIixcbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgfSxcbiAgICAgICAgfSxcbiAgICB9LFxufTtcbmNvbnN0IFBhZ2VCbG9iQ29weUluY3JlbWVudGFsSGVhZGVycyA9IHtcbiAgICBzZXJpYWxpemVkTmFtZTogXCJQYWdlQmxvYl9jb3B5SW5jcmVtZW50YWxIZWFkZXJzXCIsXG4gICAgdHlwZToge1xuICAgICAgICBuYW1lOiBcIkNvbXBvc2l0ZVwiLFxuICAgICAgICBjbGFzc05hbWU6IFwiUGFnZUJsb2JDb3B5SW5jcmVtZW50YWxIZWFkZXJzXCIsXG4gICAgICAgIG1vZGVsUHJvcGVydGllczoge1xuICAgICAgICAgICAgZXRhZzoge1xuICAgICAgICAgICAgICAgIHNlcmlhbGl6ZWROYW1lOiBcImV0YWdcIixcbiAgICAgICAgICAgICAgICB4bWxOYW1lOiBcImV0YWdcIixcbiAgICAgICAgICAgICAgICB0eXBlOiB7XG4gICAgICAgICAgICAgICAgICAgIG5hbWU6IFwiU3RyaW5nXCIsXG4gICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBsYXN0TW9kaWZpZWQ6IHtcbiAgICAgICAgICAgICAgICBzZXJpYWxpemVkTmFtZTogXCJsYXN0LW1vZGlmaWVkXCIsXG4gICAgICAgICAgICAgICAgeG1sTmFtZTogXCJsYXN0LW1vZGlmaWVkXCIsXG4gICAgICAgICAgICAgICAgdHlwZToge1xuICAgICAgICAgICAgICAgICAgICBuYW1lOiBcIkRhdGVUaW1lUmZjMTEyM1wiLFxuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgY2xpZW50UmVxdWVzdElkOiB7XG4gICAgICAgICAgICAgICAgc2VyaWFsaXplZE5hbWU6IFwieC1tcy1jbGllbnQtcmVxdWVzdC1pZFwiLFxuICAgICAgICAgICAgICAgIHhtbE5hbWU6IFwieC1tcy1jbGllbnQtcmVxdWVzdC1pZFwiLFxuICAgICAgICAgICAgICAgIHR5cGU6IHtcbiAgICAgICAgICAgICAgICAgICAgbmFtZTogXCJTdHJpbmdcIixcbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIHJlcXVlc3RJZDoge1xuICAgICAgICAgICAgICAgIHNlcmlhbGl6ZWROYW1lOiBcIngtbXMtcmVxdWVzdC1pZFwiLFxuICAgICAgICAgICAgICAgIHhtbE5hbWU6IFwieC1tcy1yZXF1ZXN0LWlkXCIsXG4gICAgICAgICAgICAgICAgdHlwZToge1xuICAgICAgICAgICAgICAgICAgICBuYW1lOiBcIlN0cmluZ1wiLFxuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgdmVyc2lvbjoge1xuICAgICAgICAgICAgICAgIHNlcmlhbGl6ZWROYW1lOiBcIngtbXMtdmVyc2lvblwiLFxuICAgICAgICAgICAgICAgIHhtbE5hbWU6IFwieC1tcy12ZXJzaW9uXCIsXG4gICAgICAgICAgICAgICAgdHlwZToge1xuICAgICAgICAgICAgICAgICAgICBuYW1lOiBcIlN0cmluZ1wiLFxuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgZGF0ZToge1xuICAgICAgICAgICAgICAgIHNlcmlhbGl6ZWROYW1lOiBcImRhdGVcIixcbiAgICAgICAgICAgICAgICB4bWxOYW1lOiBcImRhdGVcIixcbiAgICAgICAgICAgICAgICB0eXBlOiB7XG4gICAgICAgICAgICAgICAgICAgIG5hbWU6IFwiRGF0ZVRpbWVSZmMxMTIzXCIsXG4gICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBjb3B5SWQ6IHtcbiAgICAgICAgICAgICAgICBzZXJpYWxpemVkTmFtZTogXCJ4LW1zLWNvcHktaWRcIixcbiAgICAgICAgICAgICAgICB4bWxOYW1lOiBcIngtbXMtY29weS1pZFwiLFxuICAgICAgICAgICAgICAgIHR5cGU6IHtcbiAgICAgICAgICAgICAgICAgICAgbmFtZTogXCJTdHJpbmdcIixcbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIGNvcHlTdGF0dXM6IHtcbiAgICAgICAgICAgICAgICBzZXJpYWxpemVkTmFtZTogXCJ4LW1zLWNvcHktc3RhdHVzXCIsXG4gICAgICAgICAgICAgICAgeG1sTmFtZTogXCJ4LW1zLWNvcHktc3RhdHVzXCIsXG4gICAgICAgICAgICAgICAgdHlwZToge1xuICAgICAgICAgICAgICAgICAgICBuYW1lOiBcIkVudW1cIixcbiAgICAgICAgICAgICAgICAgICAgYWxsb3dlZFZhbHVlczogW1wicGVuZGluZ1wiLCBcInN1Y2Nlc3NcIiwgXCJhYm9ydGVkXCIsIFwiZmFpbGVkXCJdLFxuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgZXJyb3JDb2RlOiB7XG4gICAgICAgICAgICAgICAgc2VyaWFsaXplZE5hbWU6IFwieC1tcy1lcnJvci1jb2RlXCIsXG4gICAgICAgICAgICAgICAgeG1sTmFtZTogXCJ4LW1zLWVycm9yLWNvZGVcIixcbiAgICAgICAgICAgICAgICB0eXBlOiB7XG4gICAgICAgICAgICAgICAgICAgIG5hbWU6IFwiU3RyaW5nXCIsXG4gICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIH0sXG4gICAgICAgIH0sXG4gICAgfSxcbn07XG5jb25zdCBQYWdlQmxvYkNvcHlJbmNyZW1lbnRhbEV4Y2VwdGlvbkhlYWRlcnMgPSB7XG4gICAgc2VyaWFsaXplZE5hbWU6IFwiUGFnZUJsb2JfY29weUluY3JlbWVudGFsRXhjZXB0aW9uSGVhZGVyc1wiLFxuICAgIHR5cGU6IHtcbiAgICAgICAgbmFtZTogXCJDb21wb3NpdGVcIixcbiAgICAgICAgY2xhc3NOYW1lOiBcIlBhZ2VCbG9iQ29weUluY3JlbWVudGFsRXhjZXB0aW9uSGVhZGVyc1wiLFxuICAgICAgICBtb2RlbFByb3BlcnRpZXM6IHtcbiAgICAgICAgICAgIGVycm9yQ29kZToge1xuICAgICAgICAgICAgICAgIHNlcmlhbGl6ZWROYW1lOiBcIngtbXMtZXJyb3ItY29kZVwiLFxuICAgICAgICAgICAgICAgIHhtbE5hbWU6IFwieC1tcy1lcnJvci1jb2RlXCIsXG4gICAgICAgICAgICAgICAgdHlwZToge1xuICAgICAgICAgICAgICAgICAgICBuYW1lOiBcIlN0cmluZ1wiLFxuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICB9LFxuICAgICAgICB9LFxuICAgIH0sXG59O1xuY29uc3QgQXBwZW5kQmxvYkNyZWF0ZUhlYWRlcnMgPSB7XG4gICAgc2VyaWFsaXplZE5hbWU6IFwiQXBwZW5kQmxvYl9jcmVhdGVIZWFkZXJzXCIsXG4gICAgdHlwZToge1xuICAgICAgICBuYW1lOiBcIkNvbXBvc2l0ZVwiLFxuICAgICAgICBjbGFzc05hbWU6IFwiQXBwZW5kQmxvYkNyZWF0ZUhlYWRlcnNcIixcbiAgICAgICAgbW9kZWxQcm9wZXJ0aWVzOiB7XG4gICAgICAgICAgICBldGFnOiB7XG4gICAgICAgICAgICAgICAgc2VyaWFsaXplZE5hbWU6IFwiZXRhZ1wiLFxuICAgICAgICAgICAgICAgIHhtbE5hbWU6IFwiZXRhZ1wiLFxuICAgICAgICAgICAgICAgIHR5cGU6IHtcbiAgICAgICAgICAgICAgICAgICAgbmFtZTogXCJTdHJpbmdcIixcbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIGxhc3RNb2RpZmllZDoge1xuICAgICAgICAgICAgICAgIHNlcmlhbGl6ZWROYW1lOiBcImxhc3QtbW9kaWZpZWRcIixcbiAgICAgICAgICAgICAgICB4bWxOYW1lOiBcImxhc3QtbW9kaWZpZWRcIixcbiAgICAgICAgICAgICAgICB0eXBlOiB7XG4gICAgICAgICAgICAgICAgICAgIG5hbWU6IFwiRGF0ZVRpbWVSZmMxMTIzXCIsXG4gICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBjb250ZW50TUQ1OiB7XG4gICAgICAgICAgICAgICAgc2VyaWFsaXplZE5hbWU6IFwiY29udGVudC1tZDVcIixcbiAgICAgICAgICAgICAgICB4bWxOYW1lOiBcImNvbnRlbnQtbWQ1XCIsXG4gICAgICAgICAgICAgICAgdHlwZToge1xuICAgICAgICAgICAgICAgICAgICBuYW1lOiBcIkJ5dGVBcnJheVwiLFxuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgY2xpZW50UmVxdWVzdElkOiB7XG4gICAgICAgICAgICAgICAgc2VyaWFsaXplZE5hbWU6IFwieC1tcy1jbGllbnQtcmVxdWVzdC1pZFwiLFxuICAgICAgICAgICAgICAgIHhtbE5hbWU6IFwieC1tcy1jbGllbnQtcmVxdWVzdC1pZFwiLFxuICAgICAgICAgICAgICAgIHR5cGU6IHtcbiAgICAgICAgICAgICAgICAgICAgbmFtZTogXCJTdHJpbmdcIixcbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIHJlcXVlc3RJZDoge1xuICAgICAgICAgICAgICAgIHNlcmlhbGl6ZWROYW1lOiBcIngtbXMtcmVxdWVzdC1pZFwiLFxuICAgICAgICAgICAgICAgIHhtbE5hbWU6IFwieC1tcy1yZXF1ZXN0LWlkXCIsXG4gICAgICAgICAgICAgICAgdHlwZToge1xuICAgICAgICAgICAgICAgICAgICBuYW1lOiBcIlN0cmluZ1wiLFxuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgdmVyc2lvbjoge1xuICAgICAgICAgICAgICAgIHNlcmlhbGl6ZWROYW1lOiBcIngtbXMtdmVyc2lvblwiLFxuICAgICAgICAgICAgICAgIHhtbE5hbWU6IFwieC1tcy12ZXJzaW9uXCIsXG4gICAgICAgICAgICAgICAgdHlwZToge1xuICAgICAgICAgICAgICAgICAgICBuYW1lOiBcIlN0cmluZ1wiLFxuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgdmVyc2lvbklkOiB7XG4gICAgICAgICAgICAgICAgc2VyaWFsaXplZE5hbWU6IFwieC1tcy12ZXJzaW9uLWlkXCIsXG4gICAgICAgICAgICAgICAgeG1sTmFtZTogXCJ4LW1zLXZlcnNpb24taWRcIixcbiAgICAgICAgICAgICAgICB0eXBlOiB7XG4gICAgICAgICAgICAgICAgICAgIG5hbWU6IFwiU3RyaW5nXCIsXG4gICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBkYXRlOiB7XG4gICAgICAgICAgICAgICAgc2VyaWFsaXplZE5hbWU6IFwiZGF0ZVwiLFxuICAgICAgICAgICAgICAgIHhtbE5hbWU6IFwiZGF0ZVwiLFxuICAgICAgICAgICAgICAgIHR5cGU6IHtcbiAgICAgICAgICAgICAgICAgICAgbmFtZTogXCJEYXRlVGltZVJmYzExMjNcIixcbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIGlzU2VydmVyRW5jcnlwdGVkOiB7XG4gICAgICAgICAgICAgICAgc2VyaWFsaXplZE5hbWU6IFwieC1tcy1yZXF1ZXN0LXNlcnZlci1lbmNyeXB0ZWRcIixcbiAgICAgICAgICAgICAgICB4bWxOYW1lOiBcIngtbXMtcmVxdWVzdC1zZXJ2ZXItZW5jcnlwdGVkXCIsXG4gICAgICAgICAgICAgICAgdHlwZToge1xuICAgICAgICAgICAgICAgICAgICBuYW1lOiBcIkJvb2xlYW5cIixcbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIGVuY3J5cHRpb25LZXlTaGEyNTY6IHtcbiAgICAgICAgICAgICAgICBzZXJpYWxpemVkTmFtZTogXCJ4LW1zLWVuY3J5cHRpb24ta2V5LXNoYTI1NlwiLFxuICAgICAgICAgICAgICAgIHhtbE5hbWU6IFwieC1tcy1lbmNyeXB0aW9uLWtleS1zaGEyNTZcIixcbiAgICAgICAgICAgICAgICB0eXBlOiB7XG4gICAgICAgICAgICAgICAgICAgIG5hbWU6IFwiU3RyaW5nXCIsXG4gICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBlbmNyeXB0aW9uU2NvcGU6IHtcbiAgICAgICAgICAgICAgICBzZXJpYWxpemVkTmFtZTogXCJ4LW1zLWVuY3J5cHRpb24tc2NvcGVcIixcbiAgICAgICAgICAgICAgICB4bWxOYW1lOiBcIngtbXMtZW5jcnlwdGlvbi1zY29wZVwiLFxuICAgICAgICAgICAgICAgIHR5cGU6IHtcbiAgICAgICAgICAgICAgICAgICAgbmFtZTogXCJTdHJpbmdcIixcbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIGVycm9yQ29kZToge1xuICAgICAgICAgICAgICAgIHNlcmlhbGl6ZWROYW1lOiBcIngtbXMtZXJyb3ItY29kZVwiLFxuICAgICAgICAgICAgICAgIHhtbE5hbWU6IFwieC1tcy1lcnJvci1jb2RlXCIsXG4gICAgICAgICAgICAgICAgdHlwZToge1xuICAgICAgICAgICAgICAgICAgICBuYW1lOiBcIlN0cmluZ1wiLFxuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICB9LFxuICAgICAgICB9LFxuICAgIH0sXG59O1xuY29uc3QgQXBwZW5kQmxvYkNyZWF0ZUV4Y2VwdGlvbkhlYWRlcnMgPSB7XG4gICAgc2VyaWFsaXplZE5hbWU6IFwiQXBwZW5kQmxvYl9jcmVhdGVFeGNlcHRpb25IZWFkZXJzXCIsXG4gICAgdHlwZToge1xuICAgICAgICBuYW1lOiBcIkNvbXBvc2l0ZVwiLFxuICAgICAgICBjbGFzc05hbWU6IFwiQXBwZW5kQmxvYkNyZWF0ZUV4Y2VwdGlvbkhlYWRlcnNcIixcbiAgICAgICAgbW9kZWxQcm9wZXJ0aWVzOiB7XG4gICAgICAgICAgICBlcnJvckNvZGU6IHtcbiAgICAgICAgICAgICAgICBzZXJpYWxpemVkTmFtZTogXCJ4LW1zLWVycm9yLWNvZGVcIixcbiAgICAgICAgICAgICAgICB4bWxOYW1lOiBcIngtbXMtZXJyb3ItY29kZVwiLFxuICAgICAgICAgICAgICAgIHR5cGU6IHtcbiAgICAgICAgICAgICAgICAgICAgbmFtZTogXCJTdHJpbmdcIixcbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgfSxcbiAgICAgICAgfSxcbiAgICB9LFxufTtcbmNvbnN0IEFwcGVuZEJsb2JBcHBlbmRCbG9ja0hlYWRlcnMgPSB7XG4gICAgc2VyaWFsaXplZE5hbWU6IFwiQXBwZW5kQmxvYl9hcHBlbmRCbG9ja0hlYWRlcnNcIixcbiAgICB0eXBlOiB7XG4gICAgICAgIG5hbWU6IFwiQ29tcG9zaXRlXCIsXG4gICAgICAgIGNsYXNzTmFtZTogXCJBcHBlbmRCbG9iQXBwZW5kQmxvY2tIZWFkZXJzXCIsXG4gICAgICAgIG1vZGVsUHJvcGVydGllczoge1xuICAgICAgICAgICAgZXRhZzoge1xuICAgICAgICAgICAgICAgIHNlcmlhbGl6ZWROYW1lOiBcImV0YWdcIixcbiAgICAgICAgICAgICAgICB4bWxOYW1lOiBcImV0YWdcIixcbiAgICAgICAgICAgICAgICB0eXBlOiB7XG4gICAgICAgICAgICAgICAgICAgIG5hbWU6IFwiU3RyaW5nXCIsXG4gICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBsYXN0TW9kaWZpZWQ6IHtcbiAgICAgICAgICAgICAgICBzZXJpYWxpemVkTmFtZTogXCJsYXN0LW1vZGlmaWVkXCIsXG4gICAgICAgICAgICAgICAgeG1sTmFtZTogXCJsYXN0LW1vZGlmaWVkXCIsXG4gICAgICAgICAgICAgICAgdHlwZToge1xuICAgICAgICAgICAgICAgICAgICBuYW1lOiBcIkRhdGVUaW1lUmZjMTEyM1wiLFxuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgY29udGVudE1ENToge1xuICAgICAgICAgICAgICAgIHNlcmlhbGl6ZWROYW1lOiBcImNvbnRlbnQtbWQ1XCIsXG4gICAgICAgICAgICAgICAgeG1sTmFtZTogXCJjb250ZW50LW1kNVwiLFxuICAgICAgICAgICAgICAgIHR5cGU6IHtcbiAgICAgICAgICAgICAgICAgICAgbmFtZTogXCJCeXRlQXJyYXlcIixcbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIHhNc0NvbnRlbnRDcmM2NDoge1xuICAgICAgICAgICAgICAgIHNlcmlhbGl6ZWROYW1lOiBcIngtbXMtY29udGVudC1jcmM2NFwiLFxuICAgICAgICAgICAgICAgIHhtbE5hbWU6IFwieC1tcy1jb250ZW50LWNyYzY0XCIsXG4gICAgICAgICAgICAgICAgdHlwZToge1xuICAgICAgICAgICAgICAgICAgICBuYW1lOiBcIkJ5dGVBcnJheVwiLFxuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgY2xpZW50UmVxdWVzdElkOiB7XG4gICAgICAgICAgICAgICAgc2VyaWFsaXplZE5hbWU6IFwieC1tcy1jbGllbnQtcmVxdWVzdC1pZFwiLFxuICAgICAgICAgICAgICAgIHhtbE5hbWU6IFwieC1tcy1jbGllbnQtcmVxdWVzdC1pZFwiLFxuICAgICAgICAgICAgICAgIHR5cGU6IHtcbiAgICAgICAgICAgICAgICAgICAgbmFtZTogXCJTdHJpbmdcIixcbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIHJlcXVlc3RJZDoge1xuICAgICAgICAgICAgICAgIHNlcmlhbGl6ZWROYW1lOiBcIngtbXMtcmVxdWVzdC1pZFwiLFxuICAgICAgICAgICAgICAgIHhtbE5hbWU6IFwieC1tcy1yZXF1ZXN0LWlkXCIsXG4gICAgICAgICAgICAgICAgdHlwZToge1xuICAgICAgICAgICAgICAgICAgICBuYW1lOiBcIlN0cmluZ1wiLFxuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgdmVyc2lvbjoge1xuICAgICAgICAgICAgICAgIHNlcmlhbGl6ZWROYW1lOiBcIngtbXMtdmVyc2lvblwiLFxuICAgICAgICAgICAgICAgIHhtbE5hbWU6IFwieC1tcy12ZXJzaW9uXCIsXG4gICAgICAgICAgICAgICAgdHlwZToge1xuICAgICAgICAgICAgICAgICAgICBuYW1lOiBcIlN0cmluZ1wiLFxuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgZGF0ZToge1xuICAgICAgICAgICAgICAgIHNlcmlhbGl6ZWROYW1lOiBcImRhdGVcIixcbiAgICAgICAgICAgICAgICB4bWxOYW1lOiBcImRhdGVcIixcbiAgICAgICAgICAgICAgICB0eXBlOiB7XG4gICAgICAgICAgICAgICAgICAgIG5hbWU6IFwiRGF0ZVRpbWVSZmMxMTIzXCIsXG4gICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBibG9iQXBwZW5kT2Zmc2V0OiB7XG4gICAgICAgICAgICAgICAgc2VyaWFsaXplZE5hbWU6IFwieC1tcy1ibG9iLWFwcGVuZC1vZmZzZXRcIixcbiAgICAgICAgICAgICAgICB4bWxOYW1lOiBcIngtbXMtYmxvYi1hcHBlbmQtb2Zmc2V0XCIsXG4gICAgICAgICAgICAgICAgdHlwZToge1xuICAgICAgICAgICAgICAgICAgICBuYW1lOiBcIlN0cmluZ1wiLFxuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgYmxvYkNvbW1pdHRlZEJsb2NrQ291bnQ6IHtcbiAgICAgICAgICAgICAgICBzZXJpYWxpemVkTmFtZTogXCJ4LW1zLWJsb2ItY29tbWl0dGVkLWJsb2NrLWNvdW50XCIsXG4gICAgICAgICAgICAgICAgeG1sTmFtZTogXCJ4LW1zLWJsb2ItY29tbWl0dGVkLWJsb2NrLWNvdW50XCIsXG4gICAgICAgICAgICAgICAgdHlwZToge1xuICAgICAgICAgICAgICAgICAgICBuYW1lOiBcIk51bWJlclwiLFxuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgaXNTZXJ2ZXJFbmNyeXB0ZWQ6IHtcbiAgICAgICAgICAgICAgICBzZXJpYWxpemVkTmFtZTogXCJ4LW1zLXJlcXVlc3Qtc2VydmVyLWVuY3J5cHRlZFwiLFxuICAgICAgICAgICAgICAgIHhtbE5hbWU6IFwieC1tcy1yZXF1ZXN0LXNlcnZlci1lbmNyeXB0ZWRcIixcbiAgICAgICAgICAgICAgICB0eXBlOiB7XG4gICAgICAgICAgICAgICAgICAgIG5hbWU6IFwiQm9vbGVhblwiLFxuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgZW5jcnlwdGlvbktleVNoYTI1Njoge1xuICAgICAgICAgICAgICAgIHNlcmlhbGl6ZWROYW1lOiBcIngtbXMtZW5jcnlwdGlvbi1rZXktc2hhMjU2XCIsXG4gICAgICAgICAgICAgICAgeG1sTmFtZTogXCJ4LW1zLWVuY3J5cHRpb24ta2V5LXNoYTI1NlwiLFxuICAgICAgICAgICAgICAgIHR5cGU6IHtcbiAgICAgICAgICAgICAgICAgICAgbmFtZTogXCJTdHJpbmdcIixcbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIGVuY3J5cHRpb25TY29wZToge1xuICAgICAgICAgICAgICAgIHNlcmlhbGl6ZWROYW1lOiBcIngtbXMtZW5jcnlwdGlvbi1zY29wZVwiLFxuICAgICAgICAgICAgICAgIHhtbE5hbWU6IFwieC1tcy1lbmNyeXB0aW9uLXNjb3BlXCIsXG4gICAgICAgICAgICAgICAgdHlwZToge1xuICAgICAgICAgICAgICAgICAgICBuYW1lOiBcIlN0cmluZ1wiLFxuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgZXJyb3JDb2RlOiB7XG4gICAgICAgICAgICAgICAgc2VyaWFsaXplZE5hbWU6IFwieC1tcy1lcnJvci1jb2RlXCIsXG4gICAgICAgICAgICAgICAgeG1sTmFtZTogXCJ4LW1zLWVycm9yLWNvZGVcIixcbiAgICAgICAgICAgICAgICB0eXBlOiB7XG4gICAgICAgICAgICAgICAgICAgIG5hbWU6IFwiU3RyaW5nXCIsXG4gICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIH0sXG4gICAgICAgIH0sXG4gICAgfSxcbn07XG5jb25zdCBBcHBlbmRCbG9iQXBwZW5kQmxvY2tFeGNlcHRpb25IZWFkZXJzID0ge1xuICAgIHNlcmlhbGl6ZWROYW1lOiBcIkFwcGVuZEJsb2JfYXBwZW5kQmxvY2tFeGNlcHRpb25IZWFkZXJzXCIsXG4gICAgdHlwZToge1xuICAgICAgICBuYW1lOiBcIkNvbXBvc2l0ZVwiLFxuICAgICAgICBjbGFzc05hbWU6IFwiQXBwZW5kQmxvYkFwcGVuZEJsb2NrRXhjZXB0aW9uSGVhZGVyc1wiLFxuICAgICAgICBtb2RlbFByb3BlcnRpZXM6IHtcbiAgICAgICAgICAgIGVycm9yQ29kZToge1xuICAgICAgICAgICAgICAgIHNlcmlhbGl6ZWROYW1lOiBcIngtbXMtZXJyb3ItY29kZVwiLFxuICAgICAgICAgICAgICAgIHhtbE5hbWU6IFwieC1tcy1lcnJvci1jb2RlXCIsXG4gICAgICAgICAgICAgICAgdHlwZToge1xuICAgICAgICAgICAgICAgICAgICBuYW1lOiBcIlN0cmluZ1wiLFxuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICB9LFxuICAgICAgICB9LFxuICAgIH0sXG59O1xuY29uc3QgQXBwZW5kQmxvYkFwcGVuZEJsb2NrRnJvbVVybEhlYWRlcnMgPSB7XG4gICAgc2VyaWFsaXplZE5hbWU6IFwiQXBwZW5kQmxvYl9hcHBlbmRCbG9ja0Zyb21VcmxIZWFkZXJzXCIsXG4gICAgdHlwZToge1xuICAgICAgICBuYW1lOiBcIkNvbXBvc2l0ZVwiLFxuICAgICAgICBjbGFzc05hbWU6IFwiQXBwZW5kQmxvYkFwcGVuZEJsb2NrRnJvbVVybEhlYWRlcnNcIixcbiAgICAgICAgbW9kZWxQcm9wZXJ0aWVzOiB7XG4gICAgICAgICAgICBldGFnOiB7XG4gICAgICAgICAgICAgICAgc2VyaWFsaXplZE5hbWU6IFwiZXRhZ1wiLFxuICAgICAgICAgICAgICAgIHhtbE5hbWU6IFwiZXRhZ1wiLFxuICAgICAgICAgICAgICAgIHR5cGU6IHtcbiAgICAgICAgICAgICAgICAgICAgbmFtZTogXCJTdHJpbmdcIixcbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIGxhc3RNb2RpZmllZDoge1xuICAgICAgICAgICAgICAgIHNlcmlhbGl6ZWROYW1lOiBcImxhc3QtbW9kaWZpZWRcIixcbiAgICAgICAgICAgICAgICB4bWxOYW1lOiBcImxhc3QtbW9kaWZpZWRcIixcbiAgICAgICAgICAgICAgICB0eXBlOiB7XG4gICAgICAgICAgICAgICAgICAgIG5hbWU6IFwiRGF0ZVRpbWVSZmMxMTIzXCIsXG4gICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBjb250ZW50TUQ1OiB7XG4gICAgICAgICAgICAgICAgc2VyaWFsaXplZE5hbWU6IFwiY29udGVudC1tZDVcIixcbiAgICAgICAgICAgICAgICB4bWxOYW1lOiBcImNvbnRlbnQtbWQ1XCIsXG4gICAgICAgICAgICAgICAgdHlwZToge1xuICAgICAgICAgICAgICAgICAgICBuYW1lOiBcIkJ5dGVBcnJheVwiLFxuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgeE1zQ29udGVudENyYzY0OiB7XG4gICAgICAgICAgICAgICAgc2VyaWFsaXplZE5hbWU6IFwieC1tcy1jb250ZW50LWNyYzY0XCIsXG4gICAgICAgICAgICAgICAgeG1sTmFtZTogXCJ4LW1zLWNvbnRlbnQtY3JjNjRcIixcbiAgICAgICAgICAgICAgICB0eXBlOiB7XG4gICAgICAgICAgICAgICAgICAgIG5hbWU6IFwiQnl0ZUFycmF5XCIsXG4gICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICByZXF1ZXN0SWQ6IHtcbiAgICAgICAgICAgICAgICBzZXJpYWxpemVkTmFtZTogXCJ4LW1zLXJlcXVlc3QtaWRcIixcbiAgICAgICAgICAgICAgICB4bWxOYW1lOiBcIngtbXMtcmVxdWVzdC1pZFwiLFxuICAgICAgICAgICAgICAgIHR5cGU6IHtcbiAgICAgICAgICAgICAgICAgICAgbmFtZTogXCJTdHJpbmdcIixcbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIHZlcnNpb246IHtcbiAgICAgICAgICAgICAgICBzZXJpYWxpemVkTmFtZTogXCJ4LW1zLXZlcnNpb25cIixcbiAgICAgICAgICAgICAgICB4bWxOYW1lOiBcIngtbXMtdmVyc2lvblwiLFxuICAgICAgICAgICAgICAgIHR5cGU6IHtcbiAgICAgICAgICAgICAgICAgICAgbmFtZTogXCJTdHJpbmdcIixcbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIGRhdGU6IHtcbiAgICAgICAgICAgICAgICBzZXJpYWxpemVkTmFtZTogXCJkYXRlXCIsXG4gICAgICAgICAgICAgICAgeG1sTmFtZTogXCJkYXRlXCIsXG4gICAgICAgICAgICAgICAgdHlwZToge1xuICAgICAgICAgICAgICAgICAgICBuYW1lOiBcIkRhdGVUaW1lUmZjMTEyM1wiLFxuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgYmxvYkFwcGVuZE9mZnNldDoge1xuICAgICAgICAgICAgICAgIHNlcmlhbGl6ZWROYW1lOiBcIngtbXMtYmxvYi1hcHBlbmQtb2Zmc2V0XCIsXG4gICAgICAgICAgICAgICAgeG1sTmFtZTogXCJ4LW1zLWJsb2ItYXBwZW5kLW9mZnNldFwiLFxuICAgICAgICAgICAgICAgIHR5cGU6IHtcbiAgICAgICAgICAgICAgICAgICAgbmFtZTogXCJTdHJpbmdcIixcbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIGJsb2JDb21taXR0ZWRCbG9ja0NvdW50OiB7XG4gICAgICAgICAgICAgICAgc2VyaWFsaXplZE5hbWU6IFwieC1tcy1ibG9iLWNvbW1pdHRlZC1ibG9jay1jb3VudFwiLFxuICAgICAgICAgICAgICAgIHhtbE5hbWU6IFwieC1tcy1ibG9iLWNvbW1pdHRlZC1ibG9jay1jb3VudFwiLFxuICAgICAgICAgICAgICAgIHR5cGU6IHtcbiAgICAgICAgICAgICAgICAgICAgbmFtZTogXCJOdW1iZXJcIixcbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIGVuY3J5cHRpb25LZXlTaGEyNTY6IHtcbiAgICAgICAgICAgICAgICBzZXJpYWxpemVkTmFtZTogXCJ4LW1zLWVuY3J5cHRpb24ta2V5LXNoYTI1NlwiLFxuICAgICAgICAgICAgICAgIHhtbE5hbWU6IFwieC1tcy1lbmNyeXB0aW9uLWtleS1zaGEyNTZcIixcbiAgICAgICAgICAgICAgICB0eXBlOiB7XG4gICAgICAgICAgICAgICAgICAgIG5hbWU6IFwiU3RyaW5nXCIsXG4gICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBlbmNyeXB0aW9uU2NvcGU6IHtcbiAgICAgICAgICAgICAgICBzZXJpYWxpemVkTmFtZTogXCJ4LW1zLWVuY3J5cHRpb24tc2NvcGVcIixcbiAgICAgICAgICAgICAgICB4bWxOYW1lOiBcIngtbXMtZW5jcnlwdGlvbi1zY29wZVwiLFxuICAgICAgICAgICAgICAgIHR5cGU6IHtcbiAgICAgICAgICAgICAgICAgICAgbmFtZTogXCJTdHJpbmdcIixcbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIGlzU2VydmVyRW5jcnlwdGVkOiB7XG4gICAgICAgICAgICAgICAgc2VyaWFsaXplZE5hbWU6IFwieC1tcy1yZXF1ZXN0LXNlcnZlci1lbmNyeXB0ZWRcIixcbiAgICAgICAgICAgICAgICB4bWxOYW1lOiBcIngtbXMtcmVxdWVzdC1zZXJ2ZXItZW5jcnlwdGVkXCIsXG4gICAgICAgICAgICAgICAgdHlwZToge1xuICAgICAgICAgICAgICAgICAgICBuYW1lOiBcIkJvb2xlYW5cIixcbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIGVycm9yQ29kZToge1xuICAgICAgICAgICAgICAgIHNlcmlhbGl6ZWROYW1lOiBcIngtbXMtZXJyb3ItY29kZVwiLFxuICAgICAgICAgICAgICAgIHhtbE5hbWU6IFwieC1tcy1lcnJvci1jb2RlXCIsXG4gICAgICAgICAgICAgICAgdHlwZToge1xuICAgICAgICAgICAgICAgICAgICBuYW1lOiBcIlN0cmluZ1wiLFxuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICB9LFxuICAgICAgICB9LFxuICAgIH0sXG59O1xuY29uc3QgQXBwZW5kQmxvYkFwcGVuZEJsb2NrRnJvbVVybEV4Y2VwdGlvbkhlYWRlcnMgPSB7XG4gICAgc2VyaWFsaXplZE5hbWU6IFwiQXBwZW5kQmxvYl9hcHBlbmRCbG9ja0Zyb21VcmxFeGNlcHRpb25IZWFkZXJzXCIsXG4gICAgdHlwZToge1xuICAgICAgICBuYW1lOiBcIkNvbXBvc2l0ZVwiLFxuICAgICAgICBjbGFzc05hbWU6IFwiQXBwZW5kQmxvYkFwcGVuZEJsb2NrRnJvbVVybEV4Y2VwdGlvbkhlYWRlcnNcIixcbiAgICAgICAgbW9kZWxQcm9wZXJ0aWVzOiB7XG4gICAgICAgICAgICBlcnJvckNvZGU6IHtcbiAgICAgICAgICAgICAgICBzZXJpYWxpemVkTmFtZTogXCJ4LW1zLWVycm9yLWNvZGVcIixcbiAgICAgICAgICAgICAgICB4bWxOYW1lOiBcIngtbXMtZXJyb3ItY29kZVwiLFxuICAgICAgICAgICAgICAgIHR5cGU6IHtcbiAgICAgICAgICAgICAgICAgICAgbmFtZTogXCJTdHJpbmdcIixcbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgfSxcbiAgICAgICAgfSxcbiAgICB9LFxufTtcbmNvbnN0IEFwcGVuZEJsb2JTZWFsSGVhZGVycyA9IHtcbiAgICBzZXJpYWxpemVkTmFtZTogXCJBcHBlbmRCbG9iX3NlYWxIZWFkZXJzXCIsXG4gICAgdHlwZToge1xuICAgICAgICBuYW1lOiBcIkNvbXBvc2l0ZVwiLFxuICAgICAgICBjbGFzc05hbWU6IFwiQXBwZW5kQmxvYlNlYWxIZWFkZXJzXCIsXG4gICAgICAgIG1vZGVsUHJvcGVydGllczoge1xuICAgICAgICAgICAgZXRhZzoge1xuICAgICAgICAgICAgICAgIHNlcmlhbGl6ZWROYW1lOiBcImV0YWdcIixcbiAgICAgICAgICAgICAgICB4bWxOYW1lOiBcImV0YWdcIixcbiAgICAgICAgICAgICAgICB0eXBlOiB7XG4gICAgICAgICAgICAgICAgICAgIG5hbWU6IFwiU3RyaW5nXCIsXG4gICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBsYXN0TW9kaWZpZWQ6IHtcbiAgICAgICAgICAgICAgICBzZXJpYWxpemVkTmFtZTogXCJsYXN0LW1vZGlmaWVkXCIsXG4gICAgICAgICAgICAgICAgeG1sTmFtZTogXCJsYXN0LW1vZGlmaWVkXCIsXG4gICAgICAgICAgICAgICAgdHlwZToge1xuICAgICAgICAgICAgICAgICAgICBuYW1lOiBcIkRhdGVUaW1lUmZjMTEyM1wiLFxuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgY2xpZW50UmVxdWVzdElkOiB7XG4gICAgICAgICAgICAgICAgc2VyaWFsaXplZE5hbWU6IFwieC1tcy1jbGllbnQtcmVxdWVzdC1pZFwiLFxuICAgICAgICAgICAgICAgIHhtbE5hbWU6IFwieC1tcy1jbGllbnQtcmVxdWVzdC1pZFwiLFxuICAgICAgICAgICAgICAgIHR5cGU6IHtcbiAgICAgICAgICAgICAgICAgICAgbmFtZTogXCJTdHJpbmdcIixcbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIHJlcXVlc3RJZDoge1xuICAgICAgICAgICAgICAgIHNlcmlhbGl6ZWROYW1lOiBcIngtbXMtcmVxdWVzdC1pZFwiLFxuICAgICAgICAgICAgICAgIHhtbE5hbWU6IFwieC1tcy1yZXF1ZXN0LWlkXCIsXG4gICAgICAgICAgICAgICAgdHlwZToge1xuICAgICAgICAgICAgICAgICAgICBuYW1lOiBcIlN0cmluZ1wiLFxuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgdmVyc2lvbjoge1xuICAgICAgICAgICAgICAgIHNlcmlhbGl6ZWROYW1lOiBcIngtbXMtdmVyc2lvblwiLFxuICAgICAgICAgICAgICAgIHhtbE5hbWU6IFwieC1tcy12ZXJzaW9uXCIsXG4gICAgICAgICAgICAgICAgdHlwZToge1xuICAgICAgICAgICAgICAgICAgICBuYW1lOiBcIlN0cmluZ1wiLFxuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgZGF0ZToge1xuICAgICAgICAgICAgICAgIHNlcmlhbGl6ZWROYW1lOiBcImRhdGVcIixcbiAgICAgICAgICAgICAgICB4bWxOYW1lOiBcImRhdGVcIixcbiAgICAgICAgICAgICAgICB0eXBlOiB7XG4gICAgICAgICAgICAgICAgICAgIG5hbWU6IFwiRGF0ZVRpbWVSZmMxMTIzXCIsXG4gICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBpc1NlYWxlZDoge1xuICAgICAgICAgICAgICAgIHNlcmlhbGl6ZWROYW1lOiBcIngtbXMtYmxvYi1zZWFsZWRcIixcbiAgICAgICAgICAgICAgICB4bWxOYW1lOiBcIngtbXMtYmxvYi1zZWFsZWRcIixcbiAgICAgICAgICAgICAgICB0eXBlOiB7XG4gICAgICAgICAgICAgICAgICAgIG5hbWU6IFwiQm9vbGVhblwiLFxuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICB9LFxuICAgICAgICB9LFxuICAgIH0sXG59O1xuY29uc3QgQXBwZW5kQmxvYlNlYWxFeGNlcHRpb25IZWFkZXJzID0ge1xuICAgIHNlcmlhbGl6ZWROYW1lOiBcIkFwcGVuZEJsb2Jfc2VhbEV4Y2VwdGlvbkhlYWRlcnNcIixcbiAgICB0eXBlOiB7XG4gICAgICAgIG5hbWU6IFwiQ29tcG9zaXRlXCIsXG4gICAgICAgIGNsYXNzTmFtZTogXCJBcHBlbmRCbG9iU2VhbEV4Y2VwdGlvbkhlYWRlcnNcIixcbiAgICAgICAgbW9kZWxQcm9wZXJ0aWVzOiB7XG4gICAgICAgICAgICBlcnJvckNvZGU6IHtcbiAgICAgICAgICAgICAgICBzZXJpYWxpemVkTmFtZTogXCJ4LW1zLWVycm9yLWNvZGVcIixcbiAgICAgICAgICAgICAgICB4bWxOYW1lOiBcIngtbXMtZXJyb3ItY29kZVwiLFxuICAgICAgICAgICAgICAgIHR5cGU6IHtcbiAgICAgICAgICAgICAgICAgICAgbmFtZTogXCJTdHJpbmdcIixcbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgfSxcbiAgICAgICAgfSxcbiAgICB9LFxufTtcbmNvbnN0IEJsb2NrQmxvYlVwbG9hZEhlYWRlcnMgPSB7XG4gICAgc2VyaWFsaXplZE5hbWU6IFwiQmxvY2tCbG9iX3VwbG9hZEhlYWRlcnNcIixcbiAgICB0eXBlOiB7XG4gICAgICAgIG5hbWU6IFwiQ29tcG9zaXRlXCIsXG4gICAgICAgIGNsYXNzTmFtZTogXCJCbG9ja0Jsb2JVcGxvYWRIZWFkZXJzXCIsXG4gICAgICAgIG1vZGVsUHJvcGVydGllczoge1xuICAgICAgICAgICAgZXRhZzoge1xuICAgICAgICAgICAgICAgIHNlcmlhbGl6ZWROYW1lOiBcImV0YWdcIixcbiAgICAgICAgICAgICAgICB4bWxOYW1lOiBcImV0YWdcIixcbiAgICAgICAgICAgICAgICB0eXBlOiB7XG4gICAgICAgICAgICAgICAgICAgIG5hbWU6IFwiU3RyaW5nXCIsXG4gICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBsYXN0TW9kaWZpZWQ6IHtcbiAgICAgICAgICAgICAgICBzZXJpYWxpemVkTmFtZTogXCJsYXN0LW1vZGlmaWVkXCIsXG4gICAgICAgICAgICAgICAgeG1sTmFtZTogXCJsYXN0LW1vZGlmaWVkXCIsXG4gICAgICAgICAgICAgICAgdHlwZToge1xuICAgICAgICAgICAgICAgICAgICBuYW1lOiBcIkRhdGVUaW1lUmZjMTEyM1wiLFxuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgY29udGVudE1ENToge1xuICAgICAgICAgICAgICAgIHNlcmlhbGl6ZWROYW1lOiBcImNvbnRlbnQtbWQ1XCIsXG4gICAgICAgICAgICAgICAgeG1sTmFtZTogXCJjb250ZW50LW1kNVwiLFxuICAgICAgICAgICAgICAgIHR5cGU6IHtcbiAgICAgICAgICAgICAgICAgICAgbmFtZTogXCJCeXRlQXJyYXlcIixcbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIGNsaWVudFJlcXVlc3RJZDoge1xuICAgICAgICAgICAgICAgIHNlcmlhbGl6ZWROYW1lOiBcIngtbXMtY2xpZW50LXJlcXVlc3QtaWRcIixcbiAgICAgICAgICAgICAgICB4bWxOYW1lOiBcIngtbXMtY2xpZW50LXJlcXVlc3QtaWRcIixcbiAgICAgICAgICAgICAgICB0eXBlOiB7XG4gICAgICAgICAgICAgICAgICAgIG5hbWU6IFwiU3RyaW5nXCIsXG4gICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICByZXF1ZXN0SWQ6IHtcbiAgICAgICAgICAgICAgICBzZXJpYWxpemVkTmFtZTogXCJ4LW1zLXJlcXVlc3QtaWRcIixcbiAgICAgICAgICAgICAgICB4bWxOYW1lOiBcIngtbXMtcmVxdWVzdC1pZFwiLFxuICAgICAgICAgICAgICAgIHR5cGU6IHtcbiAgICAgICAgICAgICAgICAgICAgbmFtZTogXCJTdHJpbmdcIixcbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIHZlcnNpb246IHtcbiAgICAgICAgICAgICAgICBzZXJpYWxpemVkTmFtZTogXCJ4LW1zLXZlcnNpb25cIixcbiAgICAgICAgICAgICAgICB4bWxOYW1lOiBcIngtbXMtdmVyc2lvblwiLFxuICAgICAgICAgICAgICAgIHR5cGU6IHtcbiAgICAgICAgICAgICAgICAgICAgbmFtZTogXCJTdHJpbmdcIixcbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIHZlcnNpb25JZDoge1xuICAgICAgICAgICAgICAgIHNlcmlhbGl6ZWROYW1lOiBcIngtbXMtdmVyc2lvbi1pZFwiLFxuICAgICAgICAgICAgICAgIHhtbE5hbWU6IFwieC1tcy12ZXJzaW9uLWlkXCIsXG4gICAgICAgICAgICAgICAgdHlwZToge1xuICAgICAgICAgICAgICAgICAgICBuYW1lOiBcIlN0cmluZ1wiLFxuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgZGF0ZToge1xuICAgICAgICAgICAgICAgIHNlcmlhbGl6ZWROYW1lOiBcImRhdGVcIixcbiAgICAgICAgICAgICAgICB4bWxOYW1lOiBcImRhdGVcIixcbiAgICAgICAgICAgICAgICB0eXBlOiB7XG4gICAgICAgICAgICAgICAgICAgIG5hbWU6IFwiRGF0ZVRpbWVSZmMxMTIzXCIsXG4gICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBpc1NlcnZlckVuY3J5cHRlZDoge1xuICAgICAgICAgICAgICAgIHNlcmlhbGl6ZWROYW1lOiBcIngtbXMtcmVxdWVzdC1zZXJ2ZXItZW5jcnlwdGVkXCIsXG4gICAgICAgICAgICAgICAgeG1sTmFtZTogXCJ4LW1zLXJlcXVlc3Qtc2VydmVyLWVuY3J5cHRlZFwiLFxuICAgICAgICAgICAgICAgIHR5cGU6IHtcbiAgICAgICAgICAgICAgICAgICAgbmFtZTogXCJCb29sZWFuXCIsXG4gICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBlbmNyeXB0aW9uS2V5U2hhMjU2OiB7XG4gICAgICAgICAgICAgICAgc2VyaWFsaXplZE5hbWU6IFwieC1tcy1lbmNyeXB0aW9uLWtleS1zaGEyNTZcIixcbiAgICAgICAgICAgICAgICB4bWxOYW1lOiBcIngtbXMtZW5jcnlwdGlvbi1rZXktc2hhMjU2XCIsXG4gICAgICAgICAgICAgICAgdHlwZToge1xuICAgICAgICAgICAgICAgICAgICBuYW1lOiBcIlN0cmluZ1wiLFxuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgZW5jcnlwdGlvblNjb3BlOiB7XG4gICAgICAgICAgICAgICAgc2VyaWFsaXplZE5hbWU6IFwieC1tcy1lbmNyeXB0aW9uLXNjb3BlXCIsXG4gICAgICAgICAgICAgICAgeG1sTmFtZTogXCJ4LW1zLWVuY3J5cHRpb24tc2NvcGVcIixcbiAgICAgICAgICAgICAgICB0eXBlOiB7XG4gICAgICAgICAgICAgICAgICAgIG5hbWU6IFwiU3RyaW5nXCIsXG4gICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBlcnJvckNvZGU6IHtcbiAgICAgICAgICAgICAgICBzZXJpYWxpemVkTmFtZTogXCJ4LW1zLWVycm9yLWNvZGVcIixcbiAgICAgICAgICAgICAgICB4bWxOYW1lOiBcIngtbXMtZXJyb3ItY29kZVwiLFxuICAgICAgICAgICAgICAgIHR5cGU6IHtcbiAgICAgICAgICAgICAgICAgICAgbmFtZTogXCJTdHJpbmdcIixcbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgfSxcbiAgICAgICAgfSxcbiAgICB9LFxufTtcbmNvbnN0IEJsb2NrQmxvYlVwbG9hZEV4Y2VwdGlvbkhlYWRlcnMgPSB7XG4gICAgc2VyaWFsaXplZE5hbWU6IFwiQmxvY2tCbG9iX3VwbG9hZEV4Y2VwdGlvbkhlYWRlcnNcIixcbiAgICB0eXBlOiB7XG4gICAgICAgIG5hbWU6IFwiQ29tcG9zaXRlXCIsXG4gICAgICAgIGNsYXNzTmFtZTogXCJCbG9ja0Jsb2JVcGxvYWRFeGNlcHRpb25IZWFkZXJzXCIsXG4gICAgICAgIG1vZGVsUHJvcGVydGllczoge1xuICAgICAgICAgICAgZXJyb3JDb2RlOiB7XG4gICAgICAgICAgICAgICAgc2VyaWFsaXplZE5hbWU6IFwieC1tcy1lcnJvci1jb2RlXCIsXG4gICAgICAgICAgICAgICAgeG1sTmFtZTogXCJ4LW1zLWVycm9yLWNvZGVcIixcbiAgICAgICAgICAgICAgICB0eXBlOiB7XG4gICAgICAgICAgICAgICAgICAgIG5hbWU6IFwiU3RyaW5nXCIsXG4gICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIH0sXG4gICAgICAgIH0sXG4gICAgfSxcbn07XG5jb25zdCBCbG9ja0Jsb2JQdXRCbG9iRnJvbVVybEhlYWRlcnMgPSB7XG4gICAgc2VyaWFsaXplZE5hbWU6IFwiQmxvY2tCbG9iX3B1dEJsb2JGcm9tVXJsSGVhZGVyc1wiLFxuICAgIHR5cGU6IHtcbiAgICAgICAgbmFtZTogXCJDb21wb3NpdGVcIixcbiAgICAgICAgY2xhc3NOYW1lOiBcIkJsb2NrQmxvYlB1dEJsb2JGcm9tVXJsSGVhZGVyc1wiLFxuICAgICAgICBtb2RlbFByb3BlcnRpZXM6IHtcbiAgICAgICAgICAgIGV0YWc6IHtcbiAgICAgICAgICAgICAgICBzZXJpYWxpemVkTmFtZTogXCJldGFnXCIsXG4gICAgICAgICAgICAgICAgeG1sTmFtZTogXCJldGFnXCIsXG4gICAgICAgICAgICAgICAgdHlwZToge1xuICAgICAgICAgICAgICAgICAgICBuYW1lOiBcIlN0cmluZ1wiLFxuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgbGFzdE1vZGlmaWVkOiB7XG4gICAgICAgICAgICAgICAgc2VyaWFsaXplZE5hbWU6IFwibGFzdC1tb2RpZmllZFwiLFxuICAgICAgICAgICAgICAgIHhtbE5hbWU6IFwibGFzdC1tb2RpZmllZFwiLFxuICAgICAgICAgICAgICAgIHR5cGU6IHtcbiAgICAgICAgICAgICAgICAgICAgbmFtZTogXCJEYXRlVGltZVJmYzExMjNcIixcbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIGNvbnRlbnRNRDU6IHtcbiAgICAgICAgICAgICAgICBzZXJpYWxpemVkTmFtZTogXCJjb250ZW50LW1kNVwiLFxuICAgICAgICAgICAgICAgIHhtbE5hbWU6IFwiY29udGVudC1tZDVcIixcbiAgICAgICAgICAgICAgICB0eXBlOiB7XG4gICAgICAgICAgICAgICAgICAgIG5hbWU6IFwiQnl0ZUFycmF5XCIsXG4gICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBjbGllbnRSZXF1ZXN0SWQ6IHtcbiAgICAgICAgICAgICAgICBzZXJpYWxpemVkTmFtZTogXCJ4LW1zLWNsaWVudC1yZXF1ZXN0LWlkXCIsXG4gICAgICAgICAgICAgICAgeG1sTmFtZTogXCJ4LW1zLWNsaWVudC1yZXF1ZXN0LWlkXCIsXG4gICAgICAgICAgICAgICAgdHlwZToge1xuICAgICAgICAgICAgICAgICAgICBuYW1lOiBcIlN0cmluZ1wiLFxuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgcmVxdWVzdElkOiB7XG4gICAgICAgICAgICAgICAgc2VyaWFsaXplZE5hbWU6IFwieC1tcy1yZXF1ZXN0LWlkXCIsXG4gICAgICAgICAgICAgICAgeG1sTmFtZTogXCJ4LW1zLXJlcXVlc3QtaWRcIixcbiAgICAgICAgICAgICAgICB0eXBlOiB7XG4gICAgICAgICAgICAgICAgICAgIG5hbWU6IFwiU3RyaW5nXCIsXG4gICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICB2ZXJzaW9uOiB7XG4gICAgICAgICAgICAgICAgc2VyaWFsaXplZE5hbWU6IFwieC1tcy12ZXJzaW9uXCIsXG4gICAgICAgICAgICAgICAgeG1sTmFtZTogXCJ4LW1zLXZlcnNpb25cIixcbiAgICAgICAgICAgICAgICB0eXBlOiB7XG4gICAgICAgICAgICAgICAgICAgIG5hbWU6IFwiU3RyaW5nXCIsXG4gICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICB2ZXJzaW9uSWQ6IHtcbiAgICAgICAgICAgICAgICBzZXJpYWxpemVkTmFtZTogXCJ4LW1zLXZlcnNpb24taWRcIixcbiAgICAgICAgICAgICAgICB4bWxOYW1lOiBcIngtbXMtdmVyc2lvbi1pZFwiLFxuICAgICAgICAgICAgICAgIHR5cGU6IHtcbiAgICAgICAgICAgICAgICAgICAgbmFtZTogXCJTdHJpbmdcIixcbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIGRhdGU6IHtcbiAgICAgICAgICAgICAgICBzZXJpYWxpemVkTmFtZTogXCJkYXRlXCIsXG4gICAgICAgICAgICAgICAgeG1sTmFtZTogXCJkYXRlXCIsXG4gICAgICAgICAgICAgICAgdHlwZToge1xuICAgICAgICAgICAgICAgICAgICBuYW1lOiBcIkRhdGVUaW1lUmZjMTEyM1wiLFxuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgaXNTZXJ2ZXJFbmNyeXB0ZWQ6IHtcbiAgICAgICAgICAgICAgICBzZXJpYWxpemVkTmFtZTogXCJ4LW1zLXJlcXVlc3Qtc2VydmVyLWVuY3J5cHRlZFwiLFxuICAgICAgICAgICAgICAgIHhtbE5hbWU6IFwieC1tcy1yZXF1ZXN0LXNlcnZlci1lbmNyeXB0ZWRcIixcbiAgICAgICAgICAgICAgICB0eXBlOiB7XG4gICAgICAgICAgICAgICAgICAgIG5hbWU6IFwiQm9vbGVhblwiLFxuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgZW5jcnlwdGlvbktleVNoYTI1Njoge1xuICAgICAgICAgICAgICAgIHNlcmlhbGl6ZWROYW1lOiBcIngtbXMtZW5jcnlwdGlvbi1rZXktc2hhMjU2XCIsXG4gICAgICAgICAgICAgICAgeG1sTmFtZTogXCJ4LW1zLWVuY3J5cHRpb24ta2V5LXNoYTI1NlwiLFxuICAgICAgICAgICAgICAgIHR5cGU6IHtcbiAgICAgICAgICAgICAgICAgICAgbmFtZTogXCJTdHJpbmdcIixcbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIGVuY3J5cHRpb25TY29wZToge1xuICAgICAgICAgICAgICAgIHNlcmlhbGl6ZWROYW1lOiBcIngtbXMtZW5jcnlwdGlvbi1zY29wZVwiLFxuICAgICAgICAgICAgICAgIHhtbE5hbWU6IFwieC1tcy1lbmNyeXB0aW9uLXNjb3BlXCIsXG4gICAgICAgICAgICAgICAgdHlwZToge1xuICAgICAgICAgICAgICAgICAgICBuYW1lOiBcIlN0cmluZ1wiLFxuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgZXJyb3JDb2RlOiB7XG4gICAgICAgICAgICAgICAgc2VyaWFsaXplZE5hbWU6IFwieC1tcy1lcnJvci1jb2RlXCIsXG4gICAgICAgICAgICAgICAgeG1sTmFtZTogXCJ4LW1zLWVycm9yLWNvZGVcIixcbiAgICAgICAgICAgICAgICB0eXBlOiB7XG4gICAgICAgICAgICAgICAgICAgIG5hbWU6IFwiU3RyaW5nXCIsXG4gICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIH0sXG4gICAgICAgIH0sXG4gICAgfSxcbn07XG5jb25zdCBCbG9ja0Jsb2JQdXRCbG9iRnJvbVVybEV4Y2VwdGlvbkhlYWRlcnMgPSB7XG4gICAgc2VyaWFsaXplZE5hbWU6IFwiQmxvY2tCbG9iX3B1dEJsb2JGcm9tVXJsRXhjZXB0aW9uSGVhZGVyc1wiLFxuICAgIHR5cGU6IHtcbiAgICAgICAgbmFtZTogXCJDb21wb3NpdGVcIixcbiAgICAgICAgY2xhc3NOYW1lOiBcIkJsb2NrQmxvYlB1dEJsb2JGcm9tVXJsRXhjZXB0aW9uSGVhZGVyc1wiLFxuICAgICAgICBtb2RlbFByb3BlcnRpZXM6IHtcbiAgICAgICAgICAgIGVycm9yQ29kZToge1xuICAgICAgICAgICAgICAgIHNlcmlhbGl6ZWROYW1lOiBcIngtbXMtZXJyb3ItY29kZVwiLFxuICAgICAgICAgICAgICAgIHhtbE5hbWU6IFwieC1tcy1lcnJvci1jb2RlXCIsXG4gICAgICAgICAgICAgICAgdHlwZToge1xuICAgICAgICAgICAgICAgICAgICBuYW1lOiBcIlN0cmluZ1wiLFxuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICB9LFxuICAgICAgICB9LFxuICAgIH0sXG59O1xuY29uc3QgQmxvY2tCbG9iU3RhZ2VCbG9ja0hlYWRlcnMgPSB7XG4gICAgc2VyaWFsaXplZE5hbWU6IFwiQmxvY2tCbG9iX3N0YWdlQmxvY2tIZWFkZXJzXCIsXG4gICAgdHlwZToge1xuICAgICAgICBuYW1lOiBcIkNvbXBvc2l0ZVwiLFxuICAgICAgICBjbGFzc05hbWU6IFwiQmxvY2tCbG9iU3RhZ2VCbG9ja0hlYWRlcnNcIixcbiAgICAgICAgbW9kZWxQcm9wZXJ0aWVzOiB7XG4gICAgICAgICAgICBjb250ZW50TUQ1OiB7XG4gICAgICAgICAgICAgICAgc2VyaWFsaXplZE5hbWU6IFwiY29udGVudC1tZDVcIixcbiAgICAgICAgICAgICAgICB4bWxOYW1lOiBcImNvbnRlbnQtbWQ1XCIsXG4gICAgICAgICAgICAgICAgdHlwZToge1xuICAgICAgICAgICAgICAgICAgICBuYW1lOiBcIkJ5dGVBcnJheVwiLFxuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgY2xpZW50UmVxdWVzdElkOiB7XG4gICAgICAgICAgICAgICAgc2VyaWFsaXplZE5hbWU6IFwieC1tcy1jbGllbnQtcmVxdWVzdC1pZFwiLFxuICAgICAgICAgICAgICAgIHhtbE5hbWU6IFwieC1tcy1jbGllbnQtcmVxdWVzdC1pZFwiLFxuICAgICAgICAgICAgICAgIHR5cGU6IHtcbiAgICAgICAgICAgICAgICAgICAgbmFtZTogXCJTdHJpbmdcIixcbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIHJlcXVlc3RJZDoge1xuICAgICAgICAgICAgICAgIHNlcmlhbGl6ZWROYW1lOiBcIngtbXMtcmVxdWVzdC1pZFwiLFxuICAgICAgICAgICAgICAgIHhtbE5hbWU6IFwieC1tcy1yZXF1ZXN0LWlkXCIsXG4gICAgICAgICAgICAgICAgdHlwZToge1xuICAgICAgICAgICAgICAgICAgICBuYW1lOiBcIlN0cmluZ1wiLFxuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgdmVyc2lvbjoge1xuICAgICAgICAgICAgICAgIHNlcmlhbGl6ZWROYW1lOiBcIngtbXMtdmVyc2lvblwiLFxuICAgICAgICAgICAgICAgIHhtbE5hbWU6IFwieC1tcy12ZXJzaW9uXCIsXG4gICAgICAgICAgICAgICAgdHlwZToge1xuICAgICAgICAgICAgICAgICAgICBuYW1lOiBcIlN0cmluZ1wiLFxuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgZGF0ZToge1xuICAgICAgICAgICAgICAgIHNlcmlhbGl6ZWROYW1lOiBcImRhdGVcIixcbiAgICAgICAgICAgICAgICB4bWxOYW1lOiBcImRhdGVcIixcbiAgICAgICAgICAgICAgICB0eXBlOiB7XG4gICAgICAgICAgICAgICAgICAgIG5hbWU6IFwiRGF0ZVRpbWVSZmMxMTIzXCIsXG4gICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICB4TXNDb250ZW50Q3JjNjQ6IHtcbiAgICAgICAgICAgICAgICBzZXJpYWxpemVkTmFtZTogXCJ4LW1zLWNvbnRlbnQtY3JjNjRcIixcbiAgICAgICAgICAgICAgICB4bWxOYW1lOiBcIngtbXMtY29udGVudC1jcmM2NFwiLFxuICAgICAgICAgICAgICAgIHR5cGU6IHtcbiAgICAgICAgICAgICAgICAgICAgbmFtZTogXCJCeXRlQXJyYXlcIixcbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIGlzU2VydmVyRW5jcnlwdGVkOiB7XG4gICAgICAgICAgICAgICAgc2VyaWFsaXplZE5hbWU6IFwieC1tcy1yZXF1ZXN0LXNlcnZlci1lbmNyeXB0ZWRcIixcbiAgICAgICAgICAgICAgICB4bWxOYW1lOiBcIngtbXMtcmVxdWVzdC1zZXJ2ZXItZW5jcnlwdGVkXCIsXG4gICAgICAgICAgICAgICAgdHlwZToge1xuICAgICAgICAgICAgICAgICAgICBuYW1lOiBcIkJvb2xlYW5cIixcbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIGVuY3J5cHRpb25LZXlTaGEyNTY6IHtcbiAgICAgICAgICAgICAgICBzZXJpYWxpemVkTmFtZTogXCJ4LW1zLWVuY3J5cHRpb24ta2V5LXNoYTI1NlwiLFxuICAgICAgICAgICAgICAgIHhtbE5hbWU6IFwieC1tcy1lbmNyeXB0aW9uLWtleS1zaGEyNTZcIixcbiAgICAgICAgICAgICAgICB0eXBlOiB7XG4gICAgICAgICAgICAgICAgICAgIG5hbWU6IFwiU3RyaW5nXCIsXG4gICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBlbmNyeXB0aW9uU2NvcGU6IHtcbiAgICAgICAgICAgICAgICBzZXJpYWxpemVkTmFtZTogXCJ4LW1zLWVuY3J5cHRpb24tc2NvcGVcIixcbiAgICAgICAgICAgICAgICB4bWxOYW1lOiBcIngtbXMtZW5jcnlwdGlvbi1zY29wZVwiLFxuICAgICAgICAgICAgICAgIHR5cGU6IHtcbiAgICAgICAgICAgICAgICAgICAgbmFtZTogXCJTdHJpbmdcIixcbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIGVycm9yQ29kZToge1xuICAgICAgICAgICAgICAgIHNlcmlhbGl6ZWROYW1lOiBcIngtbXMtZXJyb3ItY29kZVwiLFxuICAgICAgICAgICAgICAgIHhtbE5hbWU6IFwieC1tcy1lcnJvci1jb2RlXCIsXG4gICAgICAgICAgICAgICAgdHlwZToge1xuICAgICAgICAgICAgICAgICAgICBuYW1lOiBcIlN0cmluZ1wiLFxuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICB9LFxuICAgICAgICB9LFxuICAgIH0sXG59O1xuY29uc3QgQmxvY2tCbG9iU3RhZ2VCbG9ja0V4Y2VwdGlvbkhlYWRlcnMgPSB7XG4gICAgc2VyaWFsaXplZE5hbWU6IFwiQmxvY2tCbG9iX3N0YWdlQmxvY2tFeGNlcHRpb25IZWFkZXJzXCIsXG4gICAgdHlwZToge1xuICAgICAgICBuYW1lOiBcIkNvbXBvc2l0ZVwiLFxuICAgICAgICBjbGFzc05hbWU6IFwiQmxvY2tCbG9iU3RhZ2VCbG9ja0V4Y2VwdGlvbkhlYWRlcnNcIixcbiAgICAgICAgbW9kZWxQcm9wZXJ0aWVzOiB7XG4gICAgICAgICAgICBlcnJvckNvZGU6IHtcbiAgICAgICAgICAgICAgICBzZXJpYWxpemVkTmFtZTogXCJ4LW1zLWVycm9yLWNvZGVcIixcbiAgICAgICAgICAgICAgICB4bWxOYW1lOiBcIngtbXMtZXJyb3ItY29kZVwiLFxuICAgICAgICAgICAgICAgIHR5cGU6IHtcbiAgICAgICAgICAgICAgICAgICAgbmFtZTogXCJTdHJpbmdcIixcbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgfSxcbiAgICAgICAgfSxcbiAgICB9LFxufTtcbmNvbnN0IEJsb2NrQmxvYlN0YWdlQmxvY2tGcm9tVVJMSGVhZGVycyA9IHtcbiAgICBzZXJpYWxpemVkTmFtZTogXCJCbG9ja0Jsb2Jfc3RhZ2VCbG9ja0Zyb21VUkxIZWFkZXJzXCIsXG4gICAgdHlwZToge1xuICAgICAgICBuYW1lOiBcIkNvbXBvc2l0ZVwiLFxuICAgICAgICBjbGFzc05hbWU6IFwiQmxvY2tCbG9iU3RhZ2VCbG9ja0Zyb21VUkxIZWFkZXJzXCIsXG4gICAgICAgIG1vZGVsUHJvcGVydGllczoge1xuICAgICAgICAgICAgY29udGVudE1ENToge1xuICAgICAgICAgICAgICAgIHNlcmlhbGl6ZWROYW1lOiBcImNvbnRlbnQtbWQ1XCIsXG4gICAgICAgICAgICAgICAgeG1sTmFtZTogXCJjb250ZW50LW1kNVwiLFxuICAgICAgICAgICAgICAgIHR5cGU6IHtcbiAgICAgICAgICAgICAgICAgICAgbmFtZTogXCJCeXRlQXJyYXlcIixcbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIHhNc0NvbnRlbnRDcmM2NDoge1xuICAgICAgICAgICAgICAgIHNlcmlhbGl6ZWROYW1lOiBcIngtbXMtY29udGVudC1jcmM2NFwiLFxuICAgICAgICAgICAgICAgIHhtbE5hbWU6IFwieC1tcy1jb250ZW50LWNyYzY0XCIsXG4gICAgICAgICAgICAgICAgdHlwZToge1xuICAgICAgICAgICAgICAgICAgICBuYW1lOiBcIkJ5dGVBcnJheVwiLFxuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgY2xpZW50UmVxdWVzdElkOiB7XG4gICAgICAgICAgICAgICAgc2VyaWFsaXplZE5hbWU6IFwieC1tcy1jbGllbnQtcmVxdWVzdC1pZFwiLFxuICAgICAgICAgICAgICAgIHhtbE5hbWU6IFwieC1tcy1jbGllbnQtcmVxdWVzdC1pZFwiLFxuICAgICAgICAgICAgICAgIHR5cGU6IHtcbiAgICAgICAgICAgICAgICAgICAgbmFtZTogXCJTdHJpbmdcIixcbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIHJlcXVlc3RJZDoge1xuICAgICAgICAgICAgICAgIHNlcmlhbGl6ZWROYW1lOiBcIngtbXMtcmVxdWVzdC1pZFwiLFxuICAgICAgICAgICAgICAgIHhtbE5hbWU6IFwieC1tcy1yZXF1ZXN0LWlkXCIsXG4gICAgICAgICAgICAgICAgdHlwZToge1xuICAgICAgICAgICAgICAgICAgICBuYW1lOiBcIlN0cmluZ1wiLFxuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgdmVyc2lvbjoge1xuICAgICAgICAgICAgICAgIHNlcmlhbGl6ZWROYW1lOiBcIngtbXMtdmVyc2lvblwiLFxuICAgICAgICAgICAgICAgIHhtbE5hbWU6IFwieC1tcy12ZXJzaW9uXCIsXG4gICAgICAgICAgICAgICAgdHlwZToge1xuICAgICAgICAgICAgICAgICAgICBuYW1lOiBcIlN0cmluZ1wiLFxuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgZGF0ZToge1xuICAgICAgICAgICAgICAgIHNlcmlhbGl6ZWROYW1lOiBcImRhdGVcIixcbiAgICAgICAgICAgICAgICB4bWxOYW1lOiBcImRhdGVcIixcbiAgICAgICAgICAgICAgICB0eXBlOiB7XG4gICAgICAgICAgICAgICAgICAgIG5hbWU6IFwiRGF0ZVRpbWVSZmMxMTIzXCIsXG4gICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBpc1NlcnZlckVuY3J5cHRlZDoge1xuICAgICAgICAgICAgICAgIHNlcmlhbGl6ZWROYW1lOiBcIngtbXMtcmVxdWVzdC1zZXJ2ZXItZW5jcnlwdGVkXCIsXG4gICAgICAgICAgICAgICAgeG1sTmFtZTogXCJ4LW1zLXJlcXVlc3Qtc2VydmVyLWVuY3J5cHRlZFwiLFxuICAgICAgICAgICAgICAgIHR5cGU6IHtcbiAgICAgICAgICAgICAgICAgICAgbmFtZTogXCJCb29sZWFuXCIsXG4gICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBlbmNyeXB0aW9uS2V5U2hhMjU2OiB7XG4gICAgICAgICAgICAgICAgc2VyaWFsaXplZE5hbWU6IFwieC1tcy1lbmNyeXB0aW9uLWtleS1zaGEyNTZcIixcbiAgICAgICAgICAgICAgICB4bWxOYW1lOiBcIngtbXMtZW5jcnlwdGlvbi1rZXktc2hhMjU2XCIsXG4gICAgICAgICAgICAgICAgdHlwZToge1xuICAgICAgICAgICAgICAgICAgICBuYW1lOiBcIlN0cmluZ1wiLFxuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgZW5jcnlwdGlvblNjb3BlOiB7XG4gICAgICAgICAgICAgICAgc2VyaWFsaXplZE5hbWU6IFwieC1tcy1lbmNyeXB0aW9uLXNjb3BlXCIsXG4gICAgICAgICAgICAgICAgeG1sTmFtZTogXCJ4LW1zLWVuY3J5cHRpb24tc2NvcGVcIixcbiAgICAgICAgICAgICAgICB0eXBlOiB7XG4gICAgICAgICAgICAgICAgICAgIG5hbWU6IFwiU3RyaW5nXCIsXG4gICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBlcnJvckNvZGU6IHtcbiAgICAgICAgICAgICAgICBzZXJpYWxpemVkTmFtZTogXCJ4LW1zLWVycm9yLWNvZGVcIixcbiAgICAgICAgICAgICAgICB4bWxOYW1lOiBcIngtbXMtZXJyb3ItY29kZVwiLFxuICAgICAgICAgICAgICAgIHR5cGU6IHtcbiAgICAgICAgICAgICAgICAgICAgbmFtZTogXCJTdHJpbmdcIixcbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgfSxcbiAgICAgICAgfSxcbiAgICB9LFxufTtcbmNvbnN0IEJsb2NrQmxvYlN0YWdlQmxvY2tGcm9tVVJMRXhjZXB0aW9uSGVhZGVycyA9IHtcbiAgICBzZXJpYWxpemVkTmFtZTogXCJCbG9ja0Jsb2Jfc3RhZ2VCbG9ja0Zyb21VUkxFeGNlcHRpb25IZWFkZXJzXCIsXG4gICAgdHlwZToge1xuICAgICAgICBuYW1lOiBcIkNvbXBvc2l0ZVwiLFxuICAgICAgICBjbGFzc05hbWU6IFwiQmxvY2tCbG9iU3RhZ2VCbG9ja0Zyb21VUkxFeGNlcHRpb25IZWFkZXJzXCIsXG4gICAgICAgIG1vZGVsUHJvcGVydGllczoge1xuICAgICAgICAgICAgZXJyb3JDb2RlOiB7XG4gICAgICAgICAgICAgICAgc2VyaWFsaXplZE5hbWU6IFwieC1tcy1lcnJvci1jb2RlXCIsXG4gICAgICAgICAgICAgICAgeG1sTmFtZTogXCJ4LW1zLWVycm9yLWNvZGVcIixcbiAgICAgICAgICAgICAgICB0eXBlOiB7XG4gICAgICAgICAgICAgICAgICAgIG5hbWU6IFwiU3RyaW5nXCIsXG4gICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIH0sXG4gICAgICAgIH0sXG4gICAgfSxcbn07XG5jb25zdCBCbG9ja0Jsb2JDb21taXRCbG9ja0xpc3RIZWFkZXJzID0ge1xuICAgIHNlcmlhbGl6ZWROYW1lOiBcIkJsb2NrQmxvYl9jb21taXRCbG9ja0xpc3RIZWFkZXJzXCIsXG4gICAgdHlwZToge1xuICAgICAgICBuYW1lOiBcIkNvbXBvc2l0ZVwiLFxuICAgICAgICBjbGFzc05hbWU6IFwiQmxvY2tCbG9iQ29tbWl0QmxvY2tMaXN0SGVhZGVyc1wiLFxuICAgICAgICBtb2RlbFByb3BlcnRpZXM6IHtcbiAgICAgICAgICAgIGV0YWc6IHtcbiAgICAgICAgICAgICAgICBzZXJpYWxpemVkTmFtZTogXCJldGFnXCIsXG4gICAgICAgICAgICAgICAgeG1sTmFtZTogXCJldGFnXCIsXG4gICAgICAgICAgICAgICAgdHlwZToge1xuICAgICAgICAgICAgICAgICAgICBuYW1lOiBcIlN0cmluZ1wiLFxuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgbGFzdE1vZGlmaWVkOiB7XG4gICAgICAgICAgICAgICAgc2VyaWFsaXplZE5hbWU6IFwibGFzdC1tb2RpZmllZFwiLFxuICAgICAgICAgICAgICAgIHhtbE5hbWU6IFwibGFzdC1tb2RpZmllZFwiLFxuICAgICAgICAgICAgICAgIHR5cGU6IHtcbiAgICAgICAgICAgICAgICAgICAgbmFtZTogXCJEYXRlVGltZVJmYzExMjNcIixcbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIGNvbnRlbnRNRDU6IHtcbiAgICAgICAgICAgICAgICBzZXJpYWxpemVkTmFtZTogXCJjb250ZW50LW1kNVwiLFxuICAgICAgICAgICAgICAgIHhtbE5hbWU6IFwiY29udGVudC1tZDVcIixcbiAgICAgICAgICAgICAgICB0eXBlOiB7XG4gICAgICAgICAgICAgICAgICAgIG5hbWU6IFwiQnl0ZUFycmF5XCIsXG4gICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICB4TXNDb250ZW50Q3JjNjQ6IHtcbiAgICAgICAgICAgICAgICBzZXJpYWxpemVkTmFtZTogXCJ4LW1zLWNvbnRlbnQtY3JjNjRcIixcbiAgICAgICAgICAgICAgICB4bWxOYW1lOiBcIngtbXMtY29udGVudC1jcmM2NFwiLFxuICAgICAgICAgICAgICAgIHR5cGU6IHtcbiAgICAgICAgICAgICAgICAgICAgbmFtZTogXCJCeXRlQXJyYXlcIixcbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIGNsaWVudFJlcXVlc3RJZDoge1xuICAgICAgICAgICAgICAgIHNlcmlhbGl6ZWROYW1lOiBcIngtbXMtY2xpZW50LXJlcXVlc3QtaWRcIixcbiAgICAgICAgICAgICAgICB4bWxOYW1lOiBcIngtbXMtY2xpZW50LXJlcXVlc3QtaWRcIixcbiAgICAgICAgICAgICAgICB0eXBlOiB7XG4gICAgICAgICAgICAgICAgICAgIG5hbWU6IFwiU3RyaW5nXCIsXG4gICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICByZXF1ZXN0SWQ6IHtcbiAgICAgICAgICAgICAgICBzZXJpYWxpemVkTmFtZTogXCJ4LW1zLXJlcXVlc3QtaWRcIixcbiAgICAgICAgICAgICAgICB4bWxOYW1lOiBcIngtbXMtcmVxdWVzdC1pZFwiLFxuICAgICAgICAgICAgICAgIHR5cGU6IHtcbiAgICAgICAgICAgICAgICAgICAgbmFtZTogXCJTdHJpbmdcIixcbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIHZlcnNpb246IHtcbiAgICAgICAgICAgICAgICBzZXJpYWxpemVkTmFtZTogXCJ4LW1zLXZlcnNpb25cIixcbiAgICAgICAgICAgICAgICB4bWxOYW1lOiBcIngtbXMtdmVyc2lvblwiLFxuICAgICAgICAgICAgICAgIHR5cGU6IHtcbiAgICAgICAgICAgICAgICAgICAgbmFtZTogXCJTdHJpbmdcIixcbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIHZlcnNpb25JZDoge1xuICAgICAgICAgICAgICAgIHNlcmlhbGl6ZWROYW1lOiBcIngtbXMtdmVyc2lvbi1pZFwiLFxuICAgICAgICAgICAgICAgIHhtbE5hbWU6IFwieC1tcy12ZXJzaW9uLWlkXCIsXG4gICAgICAgICAgICAgICAgdHlwZToge1xuICAgICAgICAgICAgICAgICAgICBuYW1lOiBcIlN0cmluZ1wiLFxuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgZGF0ZToge1xuICAgICAgICAgICAgICAgIHNlcmlhbGl6ZWROYW1lOiBcImRhdGVcIixcbiAgICAgICAgICAgICAgICB4bWxOYW1lOiBcImRhdGVcIixcbiAgICAgICAgICAgICAgICB0eXBlOiB7XG4gICAgICAgICAgICAgICAgICAgIG5hbWU6IFwiRGF0ZVRpbWVSZmMxMTIzXCIsXG4gICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBpc1NlcnZlckVuY3J5cHRlZDoge1xuICAgICAgICAgICAgICAgIHNlcmlhbGl6ZWROYW1lOiBcIngtbXMtcmVxdWVzdC1zZXJ2ZXItZW5jcnlwdGVkXCIsXG4gICAgICAgICAgICAgICAgeG1sTmFtZTogXCJ4LW1zLXJlcXVlc3Qtc2VydmVyLWVuY3J5cHRlZFwiLFxuICAgICAgICAgICAgICAgIHR5cGU6IHtcbiAgICAgICAgICAgICAgICAgICAgbmFtZTogXCJCb29sZWFuXCIsXG4gICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBlbmNyeXB0aW9uS2V5U2hhMjU2OiB7XG4gICAgICAgICAgICAgICAgc2VyaWFsaXplZE5hbWU6IFwieC1tcy1lbmNyeXB0aW9uLWtleS1zaGEyNTZcIixcbiAgICAgICAgICAgICAgICB4bWxOYW1lOiBcIngtbXMtZW5jcnlwdGlvbi1rZXktc2hhMjU2XCIsXG4gICAgICAgICAgICAgICAgdHlwZToge1xuICAgICAgICAgICAgICAgICAgICBuYW1lOiBcIlN0cmluZ1wiLFxuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgZW5jcnlwdGlvblNjb3BlOiB7XG4gICAgICAgICAgICAgICAgc2VyaWFsaXplZE5hbWU6IFwieC1tcy1lbmNyeXB0aW9uLXNjb3BlXCIsXG4gICAgICAgICAgICAgICAgeG1sTmFtZTogXCJ4LW1zLWVuY3J5cHRpb24tc2NvcGVcIixcbiAgICAgICAgICAgICAgICB0eXBlOiB7XG4gICAgICAgICAgICAgICAgICAgIG5hbWU6IFwiU3RyaW5nXCIsXG4gICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBlcnJvckNvZGU6IHtcbiAgICAgICAgICAgICAgICBzZXJpYWxpemVkTmFtZTogXCJ4LW1zLWVycm9yLWNvZGVcIixcbiAgICAgICAgICAgICAgICB4bWxOYW1lOiBcIngtbXMtZXJyb3ItY29kZVwiLFxuICAgICAgICAgICAgICAgIHR5cGU6IHtcbiAgICAgICAgICAgICAgICAgICAgbmFtZTogXCJTdHJpbmdcIixcbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgfSxcbiAgICAgICAgfSxcbiAgICB9LFxufTtcbmNvbnN0IEJsb2NrQmxvYkNvbW1pdEJsb2NrTGlzdEV4Y2VwdGlvbkhlYWRlcnMgPSB7XG4gICAgc2VyaWFsaXplZE5hbWU6IFwiQmxvY2tCbG9iX2NvbW1pdEJsb2NrTGlzdEV4Y2VwdGlvbkhlYWRlcnNcIixcbiAgICB0eXBlOiB7XG4gICAgICAgIG5hbWU6IFwiQ29tcG9zaXRlXCIsXG4gICAgICAgIGNsYXNzTmFtZTogXCJCbG9ja0Jsb2JDb21taXRCbG9ja0xpc3RFeGNlcHRpb25IZWFkZXJzXCIsXG4gICAgICAgIG1vZGVsUHJvcGVydGllczoge1xuICAgICAgICAgICAgZXJyb3JDb2RlOiB7XG4gICAgICAgICAgICAgICAgc2VyaWFsaXplZE5hbWU6IFwieC1tcy1lcnJvci1jb2RlXCIsXG4gICAgICAgICAgICAgICAgeG1sTmFtZTogXCJ4LW1zLWVycm9yLWNvZGVcIixcbiAgICAgICAgICAgICAgICB0eXBlOiB7XG4gICAgICAgICAgICAgICAgICAgIG5hbWU6IFwiU3RyaW5nXCIsXG4gICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIH0sXG4gICAgICAgIH0sXG4gICAgfSxcbn07XG5jb25zdCBCbG9ja0Jsb2JHZXRCbG9ja0xpc3RIZWFkZXJzID0ge1xuICAgIHNlcmlhbGl6ZWROYW1lOiBcIkJsb2NrQmxvYl9nZXRCbG9ja0xpc3RIZWFkZXJzXCIsXG4gICAgdHlwZToge1xuICAgICAgICBuYW1lOiBcIkNvbXBvc2l0ZVwiLFxuICAgICAgICBjbGFzc05hbWU6IFwiQmxvY2tCbG9iR2V0QmxvY2tMaXN0SGVhZGVyc1wiLFxuICAgICAgICBtb2RlbFByb3BlcnRpZXM6IHtcbiAgICAgICAgICAgIGxhc3RNb2RpZmllZDoge1xuICAgICAgICAgICAgICAgIHNlcmlhbGl6ZWROYW1lOiBcImxhc3QtbW9kaWZpZWRcIixcbiAgICAgICAgICAgICAgICB4bWxOYW1lOiBcImxhc3QtbW9kaWZpZWRcIixcbiAgICAgICAgICAgICAgICB0eXBlOiB7XG4gICAgICAgICAgICAgICAgICAgIG5hbWU6IFwiRGF0ZVRpbWVSZmMxMTIzXCIsXG4gICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBldGFnOiB7XG4gICAgICAgICAgICAgICAgc2VyaWFsaXplZE5hbWU6IFwiZXRhZ1wiLFxuICAgICAgICAgICAgICAgIHhtbE5hbWU6IFwiZXRhZ1wiLFxuICAgICAgICAgICAgICAgIHR5cGU6IHtcbiAgICAgICAgICAgICAgICAgICAgbmFtZTogXCJTdHJpbmdcIixcbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIGNvbnRlbnRUeXBlOiB7XG4gICAgICAgICAgICAgICAgc2VyaWFsaXplZE5hbWU6IFwiY29udGVudC10eXBlXCIsXG4gICAgICAgICAgICAgICAgeG1sTmFtZTogXCJjb250ZW50LXR5cGVcIixcbiAgICAgICAgICAgICAgICB0eXBlOiB7XG4gICAgICAgICAgICAgICAgICAgIG5hbWU6IFwiU3RyaW5nXCIsXG4gICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBibG9iQ29udGVudExlbmd0aDoge1xuICAgICAgICAgICAgICAgIHNlcmlhbGl6ZWROYW1lOiBcIngtbXMtYmxvYi1jb250ZW50LWxlbmd0aFwiLFxuICAgICAgICAgICAgICAgIHhtbE5hbWU6IFwieC1tcy1ibG9iLWNvbnRlbnQtbGVuZ3RoXCIsXG4gICAgICAgICAgICAgICAgdHlwZToge1xuICAgICAgICAgICAgICAgICAgICBuYW1lOiBcIk51bWJlclwiLFxuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgY2xpZW50UmVxdWVzdElkOiB7XG4gICAgICAgICAgICAgICAgc2VyaWFsaXplZE5hbWU6IFwieC1tcy1jbGllbnQtcmVxdWVzdC1pZFwiLFxuICAgICAgICAgICAgICAgIHhtbE5hbWU6IFwieC1tcy1jbGllbnQtcmVxdWVzdC1pZFwiLFxuICAgICAgICAgICAgICAgIHR5cGU6IHtcbiAgICAgICAgICAgICAgICAgICAgbmFtZTogXCJTdHJpbmdcIixcbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIHJlcXVlc3RJZDoge1xuICAgICAgICAgICAgICAgIHNlcmlhbGl6ZWROYW1lOiBcIngtbXMtcmVxdWVzdC1pZFwiLFxuICAgICAgICAgICAgICAgIHhtbE5hbWU6IFwieC1tcy1yZXF1ZXN0LWlkXCIsXG4gICAgICAgICAgICAgICAgdHlwZToge1xuICAgICAgICAgICAgICAgICAgICBuYW1lOiBcIlN0cmluZ1wiLFxuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgdmVyc2lvbjoge1xuICAgICAgICAgICAgICAgIHNlcmlhbGl6ZWROYW1lOiBcIngtbXMtdmVyc2lvblwiLFxuICAgICAgICAgICAgICAgIHhtbE5hbWU6IFwieC1tcy12ZXJzaW9uXCIsXG4gICAgICAgICAgICAgICAgdHlwZToge1xuICAgICAgICAgICAgICAgICAgICBuYW1lOiBcIlN0cmluZ1wiLFxuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgZGF0ZToge1xuICAgICAgICAgICAgICAgIHNlcmlhbGl6ZWROYW1lOiBcImRhdGVcIixcbiAgICAgICAgICAgICAgICB4bWxOYW1lOiBcImRhdGVcIixcbiAgICAgICAgICAgICAgICB0eXBlOiB7XG4gICAgICAgICAgICAgICAgICAgIG5hbWU6IFwiRGF0ZVRpbWVSZmMxMTIzXCIsXG4gICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBlcnJvckNvZGU6IHtcbiAgICAgICAgICAgICAgICBzZXJpYWxpemVkTmFtZTogXCJ4LW1zLWVycm9yLWNvZGVcIixcbiAgICAgICAgICAgICAgICB4bWxOYW1lOiBcIngtbXMtZXJyb3ItY29kZVwiLFxuICAgICAgICAgICAgICAgIHR5cGU6IHtcbiAgICAgICAgICAgICAgICAgICAgbmFtZTogXCJTdHJpbmdcIixcbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgfSxcbiAgICAgICAgfSxcbiAgICB9LFxufTtcbmNvbnN0IEJsb2NrQmxvYkdldEJsb2NrTGlzdEV4Y2VwdGlvbkhlYWRlcnMgPSB7XG4gICAgc2VyaWFsaXplZE5hbWU6IFwiQmxvY2tCbG9iX2dldEJsb2NrTGlzdEV4Y2VwdGlvbkhlYWRlcnNcIixcbiAgICB0eXBlOiB7XG4gICAgICAgIG5hbWU6IFwiQ29tcG9zaXRlXCIsXG4gICAgICAgIGNsYXNzTmFtZTogXCJCbG9ja0Jsb2JHZXRCbG9ja0xpc3RFeGNlcHRpb25IZWFkZXJzXCIsXG4gICAgICAgIG1vZGVsUHJvcGVydGllczoge1xuICAgICAgICAgICAgZXJyb3JDb2RlOiB7XG4gICAgICAgICAgICAgICAgc2VyaWFsaXplZE5hbWU6IFwieC1tcy1lcnJvci1jb2RlXCIsXG4gICAgICAgICAgICAgICAgeG1sTmFtZTogXCJ4LW1zLWVycm9yLWNvZGVcIixcbiAgICAgICAgICAgICAgICB0eXBlOiB7XG4gICAgICAgICAgICAgICAgICAgIG5hbWU6IFwiU3RyaW5nXCIsXG4gICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIH0sXG4gICAgICAgIH0sXG4gICAgfSxcbn07XG5cbnZhciBNYXBwZXJzID0gLyojX19QVVJFX18qL09iamVjdC5mcmVlemUoe1xuICAgIF9fcHJvdG9fXzogbnVsbCxcbiAgICBBY2Nlc3NQb2xpY3k6IEFjY2Vzc1BvbGljeSxcbiAgICBBcHBlbmRCbG9iQXBwZW5kQmxvY2tFeGNlcHRpb25IZWFkZXJzOiBBcHBlbmRCbG9iQXBwZW5kQmxvY2tFeGNlcHRpb25IZWFkZXJzLFxuICAgIEFwcGVuZEJsb2JBcHBlbmRCbG9ja0Zyb21VcmxFeGNlcHRpb25IZWFkZXJzOiBBcHBlbmRCbG9iQXBwZW5kQmxvY2tGcm9tVXJsRXhjZXB0aW9uSGVhZGVycyxcbiAgICBBcHBlbmRCbG9iQXBwZW5kQmxvY2tGcm9tVXJsSGVhZGVyczogQXBwZW5kQmxvYkFwcGVuZEJsb2NrRnJvbVVybEhlYWRlcnMsXG4gICAgQXBwZW5kQmxvYkFwcGVuZEJsb2NrSGVhZGVyczogQXBwZW5kQmxvYkFwcGVuZEJsb2NrSGVhZGVycyxcbiAgICBBcHBlbmRCbG9iQ3JlYXRlRXhjZXB0aW9uSGVhZGVyczogQXBwZW5kQmxvYkNyZWF0ZUV4Y2VwdGlvbkhlYWRlcnMsXG4gICAgQXBwZW5kQmxvYkNyZWF0ZUhlYWRlcnM6IEFwcGVuZEJsb2JDcmVhdGVIZWFkZXJzLFxuICAgIEFwcGVuZEJsb2JTZWFsRXhjZXB0aW9uSGVhZGVyczogQXBwZW5kQmxvYlNlYWxFeGNlcHRpb25IZWFkZXJzLFxuICAgIEFwcGVuZEJsb2JTZWFsSGVhZGVyczogQXBwZW5kQmxvYlNlYWxIZWFkZXJzLFxuICAgIEFycm93Q29uZmlndXJhdGlvbjogQXJyb3dDb25maWd1cmF0aW9uLFxuICAgIEFycm93RmllbGQ6IEFycm93RmllbGQsXG4gICAgQmxvYkFib3J0Q29weUZyb21VUkxFeGNlcHRpb25IZWFkZXJzOiBCbG9iQWJvcnRDb3B5RnJvbVVSTEV4Y2VwdGlvbkhlYWRlcnMsXG4gICAgQmxvYkFib3J0Q29weUZyb21VUkxIZWFkZXJzOiBCbG9iQWJvcnRDb3B5RnJvbVVSTEhlYWRlcnMsXG4gICAgQmxvYkFjcXVpcmVMZWFzZUV4Y2VwdGlvbkhlYWRlcnM6IEJsb2JBY3F1aXJlTGVhc2VFeGNlcHRpb25IZWFkZXJzLFxuICAgIEJsb2JBY3F1aXJlTGVhc2VIZWFkZXJzOiBCbG9iQWNxdWlyZUxlYXNlSGVhZGVycyxcbiAgICBCbG9iQnJlYWtMZWFzZUV4Y2VwdGlvbkhlYWRlcnM6IEJsb2JCcmVha0xlYXNlRXhjZXB0aW9uSGVhZGVycyxcbiAgICBCbG9iQnJlYWtMZWFzZUhlYWRlcnM6IEJsb2JCcmVha0xlYXNlSGVhZGVycyxcbiAgICBCbG9iQ2hhbmdlTGVhc2VFeGNlcHRpb25IZWFkZXJzOiBCbG9iQ2hhbmdlTGVhc2VFeGNlcHRpb25IZWFkZXJzLFxuICAgIEJsb2JDaGFuZ2VMZWFzZUhlYWRlcnM6IEJsb2JDaGFuZ2VMZWFzZUhlYWRlcnMsXG4gICAgQmxvYkNvcHlGcm9tVVJMRXhjZXB0aW9uSGVhZGVyczogQmxvYkNvcHlGcm9tVVJMRXhjZXB0aW9uSGVhZGVycyxcbiAgICBCbG9iQ29weUZyb21VUkxIZWFkZXJzOiBCbG9iQ29weUZyb21VUkxIZWFkZXJzLFxuICAgIEJsb2JDcmVhdGVTbmFwc2hvdEV4Y2VwdGlvbkhlYWRlcnM6IEJsb2JDcmVhdGVTbmFwc2hvdEV4Y2VwdGlvbkhlYWRlcnMsXG4gICAgQmxvYkNyZWF0ZVNuYXBzaG90SGVhZGVyczogQmxvYkNyZWF0ZVNuYXBzaG90SGVhZGVycyxcbiAgICBCbG9iRGVsZXRlRXhjZXB0aW9uSGVhZGVyczogQmxvYkRlbGV0ZUV4Y2VwdGlvbkhlYWRlcnMsXG4gICAgQmxvYkRlbGV0ZUhlYWRlcnM6IEJsb2JEZWxldGVIZWFkZXJzLFxuICAgIEJsb2JEZWxldGVJbW11dGFiaWxpdHlQb2xpY3lFeGNlcHRpb25IZWFkZXJzOiBCbG9iRGVsZXRlSW1tdXRhYmlsaXR5UG9saWN5RXhjZXB0aW9uSGVhZGVycyxcbiAgICBCbG9iRGVsZXRlSW1tdXRhYmlsaXR5UG9saWN5SGVhZGVyczogQmxvYkRlbGV0ZUltbXV0YWJpbGl0eVBvbGljeUhlYWRlcnMsXG4gICAgQmxvYkRvd25sb2FkRXhjZXB0aW9uSGVhZGVyczogQmxvYkRvd25sb2FkRXhjZXB0aW9uSGVhZGVycyxcbiAgICBCbG9iRG93bmxvYWRIZWFkZXJzOiBCbG9iRG93bmxvYWRIZWFkZXJzLFxuICAgIEJsb2JGbGF0TGlzdFNlZ21lbnQ6IEJsb2JGbGF0TGlzdFNlZ21lbnQsXG4gICAgQmxvYkdldEFjY291bnRJbmZvRXhjZXB0aW9uSGVhZGVyczogQmxvYkdldEFjY291bnRJbmZvRXhjZXB0aW9uSGVhZGVycyxcbiAgICBCbG9iR2V0QWNjb3VudEluZm9IZWFkZXJzOiBCbG9iR2V0QWNjb3VudEluZm9IZWFkZXJzLFxuICAgIEJsb2JHZXRQcm9wZXJ0aWVzRXhjZXB0aW9uSGVhZGVyczogQmxvYkdldFByb3BlcnRpZXNFeGNlcHRpb25IZWFkZXJzLFxuICAgIEJsb2JHZXRQcm9wZXJ0aWVzSGVhZGVyczogQmxvYkdldFByb3BlcnRpZXNIZWFkZXJzLFxuICAgIEJsb2JHZXRUYWdzRXhjZXB0aW9uSGVhZGVyczogQmxvYkdldFRhZ3NFeGNlcHRpb25IZWFkZXJzLFxuICAgIEJsb2JHZXRUYWdzSGVhZGVyczogQmxvYkdldFRhZ3NIZWFkZXJzLFxuICAgIEJsb2JIaWVyYXJjaHlMaXN0U2VnbWVudDogQmxvYkhpZXJhcmNoeUxpc3RTZWdtZW50LFxuICAgIEJsb2JJdGVtSW50ZXJuYWw6IEJsb2JJdGVtSW50ZXJuYWwsXG4gICAgQmxvYk5hbWU6IEJsb2JOYW1lLFxuICAgIEJsb2JQcmVmaXg6IEJsb2JQcmVmaXgsXG4gICAgQmxvYlByb3BlcnRpZXNJbnRlcm5hbDogQmxvYlByb3BlcnRpZXNJbnRlcm5hbCxcbiAgICBCbG9iUXVlcnlFeGNlcHRpb25IZWFkZXJzOiBCbG9iUXVlcnlFeGNlcHRpb25IZWFkZXJzLFxuICAgIEJsb2JRdWVyeUhlYWRlcnM6IEJsb2JRdWVyeUhlYWRlcnMsXG4gICAgQmxvYlJlbGVhc2VMZWFzZUV4Y2VwdGlvbkhlYWRlcnM6IEJsb2JSZWxlYXNlTGVhc2VFeGNlcHRpb25IZWFkZXJzLFxuICAgIEJsb2JSZWxlYXNlTGVhc2VIZWFkZXJzOiBCbG9iUmVsZWFzZUxlYXNlSGVhZGVycyxcbiAgICBCbG9iUmVuZXdMZWFzZUV4Y2VwdGlvbkhlYWRlcnM6IEJsb2JSZW5ld0xlYXNlRXhjZXB0aW9uSGVhZGVycyxcbiAgICBCbG9iUmVuZXdMZWFzZUhlYWRlcnM6IEJsb2JSZW5ld0xlYXNlSGVhZGVycyxcbiAgICBCbG9iU2VydmljZVByb3BlcnRpZXM6IEJsb2JTZXJ2aWNlUHJvcGVydGllcyxcbiAgICBCbG9iU2VydmljZVN0YXRpc3RpY3M6IEJsb2JTZXJ2aWNlU3RhdGlzdGljcyxcbiAgICBCbG9iU2V0RXhwaXJ5RXhjZXB0aW9uSGVhZGVyczogQmxvYlNldEV4cGlyeUV4Y2VwdGlvbkhlYWRlcnMsXG4gICAgQmxvYlNldEV4cGlyeUhlYWRlcnM6IEJsb2JTZXRFeHBpcnlIZWFkZXJzLFxuICAgIEJsb2JTZXRIdHRwSGVhZGVyc0V4Y2VwdGlvbkhlYWRlcnM6IEJsb2JTZXRIdHRwSGVhZGVyc0V4Y2VwdGlvbkhlYWRlcnMsXG4gICAgQmxvYlNldEh0dHBIZWFkZXJzSGVhZGVyczogQmxvYlNldEh0dHBIZWFkZXJzSGVhZGVycyxcbiAgICBCbG9iU2V0SW1tdXRhYmlsaXR5UG9saWN5RXhjZXB0aW9uSGVhZGVyczogQmxvYlNldEltbXV0YWJpbGl0eVBvbGljeUV4Y2VwdGlvbkhlYWRlcnMsXG4gICAgQmxvYlNldEltbXV0YWJpbGl0eVBvbGljeUhlYWRlcnM6IEJsb2JTZXRJbW11dGFiaWxpdHlQb2xpY3lIZWFkZXJzLFxuICAgIEJsb2JTZXRMZWdhbEhvbGRFeGNlcHRpb25IZWFkZXJzOiBCbG9iU2V0TGVnYWxIb2xkRXhjZXB0aW9uSGVhZGVycyxcbiAgICBCbG9iU2V0TGVnYWxIb2xkSGVhZGVyczogQmxvYlNldExlZ2FsSG9sZEhlYWRlcnMsXG4gICAgQmxvYlNldE1ldGFkYXRhRXhjZXB0aW9uSGVhZGVyczogQmxvYlNldE1ldGFkYXRhRXhjZXB0aW9uSGVhZGVycyxcbiAgICBCbG9iU2V0TWV0YWRhdGFIZWFkZXJzOiBCbG9iU2V0TWV0YWRhdGFIZWFkZXJzLFxuICAgIEJsb2JTZXRUYWdzRXhjZXB0aW9uSGVhZGVyczogQmxvYlNldFRhZ3NFeGNlcHRpb25IZWFkZXJzLFxuICAgIEJsb2JTZXRUYWdzSGVhZGVyczogQmxvYlNldFRhZ3NIZWFkZXJzLFxuICAgIEJsb2JTZXRUaWVyRXhjZXB0aW9uSGVhZGVyczogQmxvYlNldFRpZXJFeGNlcHRpb25IZWFkZXJzLFxuICAgIEJsb2JTZXRUaWVySGVhZGVyczogQmxvYlNldFRpZXJIZWFkZXJzLFxuICAgIEJsb2JTdGFydENvcHlGcm9tVVJMRXhjZXB0aW9uSGVhZGVyczogQmxvYlN0YXJ0Q29weUZyb21VUkxFeGNlcHRpb25IZWFkZXJzLFxuICAgIEJsb2JTdGFydENvcHlGcm9tVVJMSGVhZGVyczogQmxvYlN0YXJ0Q29weUZyb21VUkxIZWFkZXJzLFxuICAgIEJsb2JUYWc6IEJsb2JUYWcsXG4gICAgQmxvYlRhZ3M6IEJsb2JUYWdzLFxuICAgIEJsb2JVbmRlbGV0ZUV4Y2VwdGlvbkhlYWRlcnM6IEJsb2JVbmRlbGV0ZUV4Y2VwdGlvbkhlYWRlcnMsXG4gICAgQmxvYlVuZGVsZXRlSGVhZGVyczogQmxvYlVuZGVsZXRlSGVhZGVycyxcbiAgICBCbG9jazogQmxvY2ssXG4gICAgQmxvY2tCbG9iQ29tbWl0QmxvY2tMaXN0RXhjZXB0aW9uSGVhZGVyczogQmxvY2tCbG9iQ29tbWl0QmxvY2tMaXN0RXhjZXB0aW9uSGVhZGVycyxcbiAgICBCbG9ja0Jsb2JDb21taXRCbG9ja0xpc3RIZWFkZXJzOiBCbG9ja0Jsb2JDb21taXRCbG9ja0xpc3RIZWFkZXJzLFxuICAgIEJsb2NrQmxvYkdldEJsb2NrTGlzdEV4Y2VwdGlvbkhlYWRlcnM6IEJsb2NrQmxvYkdldEJsb2NrTGlzdEV4Y2VwdGlvbkhlYWRlcnMsXG4gICAgQmxvY2tCbG9iR2V0QmxvY2tMaXN0SGVhZGVyczogQmxvY2tCbG9iR2V0QmxvY2tMaXN0SGVhZGVycyxcbiAgICBCbG9ja0Jsb2JQdXRCbG9iRnJvbVVybEV4Y2VwdGlvbkhlYWRlcnM6IEJsb2NrQmxvYlB1dEJsb2JGcm9tVXJsRXhjZXB0aW9uSGVhZGVycyxcbiAgICBCbG9ja0Jsb2JQdXRCbG9iRnJvbVVybEhlYWRlcnM6IEJsb2NrQmxvYlB1dEJsb2JGcm9tVXJsSGVhZGVycyxcbiAgICBCbG9ja0Jsb2JTdGFnZUJsb2NrRXhjZXB0aW9uSGVhZGVyczogQmxvY2tCbG9iU3RhZ2VCbG9ja0V4Y2VwdGlvbkhlYWRlcnMsXG4gICAgQmxvY2tCbG9iU3RhZ2VCbG9ja0Zyb21VUkxFeGNlcHRpb25IZWFkZXJzOiBCbG9ja0Jsb2JTdGFnZUJsb2NrRnJvbVVSTEV4Y2VwdGlvbkhlYWRlcnMsXG4gICAgQmxvY2tCbG9iU3RhZ2VCbG9ja0Zyb21VUkxIZWFkZXJzOiBCbG9ja0Jsb2JTdGFnZUJsb2NrRnJvbVVSTEhlYWRlcnMsXG4gICAgQmxvY2tCbG9iU3RhZ2VCbG9ja0hlYWRlcnM6IEJsb2NrQmxvYlN0YWdlQmxvY2tIZWFkZXJzLFxuICAgIEJsb2NrQmxvYlVwbG9hZEV4Y2VwdGlvbkhlYWRlcnM6IEJsb2NrQmxvYlVwbG9hZEV4Y2VwdGlvbkhlYWRlcnMsXG4gICAgQmxvY2tCbG9iVXBsb2FkSGVhZGVyczogQmxvY2tCbG9iVXBsb2FkSGVhZGVycyxcbiAgICBCbG9ja0xpc3Q6IEJsb2NrTGlzdCxcbiAgICBCbG9ja0xvb2t1cExpc3Q6IEJsb2NrTG9va3VwTGlzdCxcbiAgICBDbGVhclJhbmdlOiBDbGVhclJhbmdlLFxuICAgIENvbnRhaW5lckFjcXVpcmVMZWFzZUV4Y2VwdGlvbkhlYWRlcnM6IENvbnRhaW5lckFjcXVpcmVMZWFzZUV4Y2VwdGlvbkhlYWRlcnMsXG4gICAgQ29udGFpbmVyQWNxdWlyZUxlYXNlSGVhZGVyczogQ29udGFpbmVyQWNxdWlyZUxlYXNlSGVhZGVycyxcbiAgICBDb250YWluZXJCcmVha0xlYXNlRXhjZXB0aW9uSGVhZGVyczogQ29udGFpbmVyQnJlYWtMZWFzZUV4Y2VwdGlvbkhlYWRlcnMsXG4gICAgQ29udGFpbmVyQnJlYWtMZWFzZUhlYWRlcnM6IENvbnRhaW5lckJyZWFrTGVhc2VIZWFkZXJzLFxuICAgIENvbnRhaW5lckNoYW5nZUxlYXNlRXhjZXB0aW9uSGVhZGVyczogQ29udGFpbmVyQ2hhbmdlTGVhc2VFeGNlcHRpb25IZWFkZXJzLFxuICAgIENvbnRhaW5lckNoYW5nZUxlYXNlSGVhZGVyczogQ29udGFpbmVyQ2hhbmdlTGVhc2VIZWFkZXJzLFxuICAgIENvbnRhaW5lckNyZWF0ZUV4Y2VwdGlvbkhlYWRlcnM6IENvbnRhaW5lckNyZWF0ZUV4Y2VwdGlvbkhlYWRlcnMsXG4gICAgQ29udGFpbmVyQ3JlYXRlSGVhZGVyczogQ29udGFpbmVyQ3JlYXRlSGVhZGVycyxcbiAgICBDb250YWluZXJEZWxldGVFeGNlcHRpb25IZWFkZXJzOiBDb250YWluZXJEZWxldGVFeGNlcHRpb25IZWFkZXJzLFxuICAgIENvbnRhaW5lckRlbGV0ZUhlYWRlcnM6IENvbnRhaW5lckRlbGV0ZUhlYWRlcnMsXG4gICAgQ29udGFpbmVyRmlsdGVyQmxvYnNFeGNlcHRpb25IZWFkZXJzOiBDb250YWluZXJGaWx0ZXJCbG9ic0V4Y2VwdGlvbkhlYWRlcnMsXG4gICAgQ29udGFpbmVyRmlsdGVyQmxvYnNIZWFkZXJzOiBDb250YWluZXJGaWx0ZXJCbG9ic0hlYWRlcnMsXG4gICAgQ29udGFpbmVyR2V0QWNjZXNzUG9saWN5RXhjZXB0aW9uSGVhZGVyczogQ29udGFpbmVyR2V0QWNjZXNzUG9saWN5RXhjZXB0aW9uSGVhZGVycyxcbiAgICBDb250YWluZXJHZXRBY2Nlc3NQb2xpY3lIZWFkZXJzOiBDb250YWluZXJHZXRBY2Nlc3NQb2xpY3lIZWFkZXJzLFxuICAgIENvbnRhaW5lckdldEFjY291bnRJbmZvRXhjZXB0aW9uSGVhZGVyczogQ29udGFpbmVyR2V0QWNjb3VudEluZm9FeGNlcHRpb25IZWFkZXJzLFxuICAgIENvbnRhaW5lckdldEFjY291bnRJbmZvSGVhZGVyczogQ29udGFpbmVyR2V0QWNjb3VudEluZm9IZWFkZXJzLFxuICAgIENvbnRhaW5lckdldFByb3BlcnRpZXNFeGNlcHRpb25IZWFkZXJzOiBDb250YWluZXJHZXRQcm9wZXJ0aWVzRXhjZXB0aW9uSGVhZGVycyxcbiAgICBDb250YWluZXJHZXRQcm9wZXJ0aWVzSGVhZGVyczogQ29udGFpbmVyR2V0UHJvcGVydGllc0hlYWRlcnMsXG4gICAgQ29udGFpbmVySXRlbTogQ29udGFpbmVySXRlbSxcbiAgICBDb250YWluZXJMaXN0QmxvYkZsYXRTZWdtZW50RXhjZXB0aW9uSGVhZGVyczogQ29udGFpbmVyTGlzdEJsb2JGbGF0U2VnbWVudEV4Y2VwdGlvbkhlYWRlcnMsXG4gICAgQ29udGFpbmVyTGlzdEJsb2JGbGF0U2VnbWVudEhlYWRlcnM6IENvbnRhaW5lckxpc3RCbG9iRmxhdFNlZ21lbnRIZWFkZXJzLFxuICAgIENvbnRhaW5lckxpc3RCbG9iSGllcmFyY2h5U2VnbWVudEV4Y2VwdGlvbkhlYWRlcnM6IENvbnRhaW5lckxpc3RCbG9iSGllcmFyY2h5U2VnbWVudEV4Y2VwdGlvbkhlYWRlcnMsXG4gICAgQ29udGFpbmVyTGlzdEJsb2JIaWVyYXJjaHlTZWdtZW50SGVhZGVyczogQ29udGFpbmVyTGlzdEJsb2JIaWVyYXJjaHlTZWdtZW50SGVhZGVycyxcbiAgICBDb250YWluZXJQcm9wZXJ0aWVzOiBDb250YWluZXJQcm9wZXJ0aWVzLFxuICAgIENvbnRhaW5lclJlbGVhc2VMZWFzZUV4Y2VwdGlvbkhlYWRlcnM6IENvbnRhaW5lclJlbGVhc2VMZWFzZUV4Y2VwdGlvbkhlYWRlcnMsXG4gICAgQ29udGFpbmVyUmVsZWFzZUxlYXNlSGVhZGVyczogQ29udGFpbmVyUmVsZWFzZUxlYXNlSGVhZGVycyxcbiAgICBDb250YWluZXJSZW5hbWVFeGNlcHRpb25IZWFkZXJzOiBDb250YWluZXJSZW5hbWVFeGNlcHRpb25IZWFkZXJzLFxuICAgIENvbnRhaW5lclJlbmFtZUhlYWRlcnM6IENvbnRhaW5lclJlbmFtZUhlYWRlcnMsXG4gICAgQ29udGFpbmVyUmVuZXdMZWFzZUV4Y2VwdGlvbkhlYWRlcnM6IENvbnRhaW5lclJlbmV3TGVhc2VFeGNlcHRpb25IZWFkZXJzLFxuICAgIENvbnRhaW5lclJlbmV3TGVhc2VIZWFkZXJzOiBDb250YWluZXJSZW5ld0xlYXNlSGVhZGVycyxcbiAgICBDb250YWluZXJSZXN0b3JlRXhjZXB0aW9uSGVhZGVyczogQ29udGFpbmVyUmVzdG9yZUV4Y2VwdGlvbkhlYWRlcnMsXG4gICAgQ29udGFpbmVyUmVzdG9yZUhlYWRlcnM6IENvbnRhaW5lclJlc3RvcmVIZWFkZXJzLFxuICAgIENvbnRhaW5lclNldEFjY2Vzc1BvbGljeUV4Y2VwdGlvbkhlYWRlcnM6IENvbnRhaW5lclNldEFjY2Vzc1BvbGljeUV4Y2VwdGlvbkhlYWRlcnMsXG4gICAgQ29udGFpbmVyU2V0QWNjZXNzUG9saWN5SGVhZGVyczogQ29udGFpbmVyU2V0QWNjZXNzUG9saWN5SGVhZGVycyxcbiAgICBDb250YWluZXJTZXRNZXRhZGF0YUV4Y2VwdGlvbkhlYWRlcnM6IENvbnRhaW5lclNldE1ldGFkYXRhRXhjZXB0aW9uSGVhZGVycyxcbiAgICBDb250YWluZXJTZXRNZXRhZGF0YUhlYWRlcnM6IENvbnRhaW5lclNldE1ldGFkYXRhSGVhZGVycyxcbiAgICBDb250YWluZXJTdWJtaXRCYXRjaEV4Y2VwdGlvbkhlYWRlcnM6IENvbnRhaW5lclN1Ym1pdEJhdGNoRXhjZXB0aW9uSGVhZGVycyxcbiAgICBDb250YWluZXJTdWJtaXRCYXRjaEhlYWRlcnM6IENvbnRhaW5lclN1Ym1pdEJhdGNoSGVhZGVycyxcbiAgICBDb3JzUnVsZTogQ29yc1J1bGUsXG4gICAgRGVsaW1pdGVkVGV4dENvbmZpZ3VyYXRpb246IERlbGltaXRlZFRleHRDb25maWd1cmF0aW9uLFxuICAgIEZpbHRlckJsb2JJdGVtOiBGaWx0ZXJCbG9iSXRlbSxcbiAgICBGaWx0ZXJCbG9iU2VnbWVudDogRmlsdGVyQmxvYlNlZ21lbnQsXG4gICAgR2VvUmVwbGljYXRpb246IEdlb1JlcGxpY2F0aW9uLFxuICAgIEpzb25UZXh0Q29uZmlndXJhdGlvbjogSnNvblRleHRDb25maWd1cmF0aW9uLFxuICAgIEtleUluZm86IEtleUluZm8sXG4gICAgTGlzdEJsb2JzRmxhdFNlZ21lbnRSZXNwb25zZTogTGlzdEJsb2JzRmxhdFNlZ21lbnRSZXNwb25zZSxcbiAgICBMaXN0QmxvYnNIaWVyYXJjaHlTZWdtZW50UmVzcG9uc2U6IExpc3RCbG9ic0hpZXJhcmNoeVNlZ21lbnRSZXNwb25zZSxcbiAgICBMaXN0Q29udGFpbmVyc1NlZ21lbnRSZXNwb25zZTogTGlzdENvbnRhaW5lcnNTZWdtZW50UmVzcG9uc2UsXG4gICAgTG9nZ2luZzogTG9nZ2luZyxcbiAgICBNZXRyaWNzOiBNZXRyaWNzLFxuICAgIFBhZ2VCbG9iQ2xlYXJQYWdlc0V4Y2VwdGlvbkhlYWRlcnM6IFBhZ2VCbG9iQ2xlYXJQYWdlc0V4Y2VwdGlvbkhlYWRlcnMsXG4gICAgUGFnZUJsb2JDbGVhclBhZ2VzSGVhZGVyczogUGFnZUJsb2JDbGVhclBhZ2VzSGVhZGVycyxcbiAgICBQYWdlQmxvYkNvcHlJbmNyZW1lbnRhbEV4Y2VwdGlvbkhlYWRlcnM6IFBhZ2VCbG9iQ29weUluY3JlbWVudGFsRXhjZXB0aW9uSGVhZGVycyxcbiAgICBQYWdlQmxvYkNvcHlJbmNyZW1lbnRhbEhlYWRlcnM6IFBhZ2VCbG9iQ29weUluY3JlbWVudGFsSGVhZGVycyxcbiAgICBQYWdlQmxvYkNyZWF0ZUV4Y2VwdGlvbkhlYWRlcnM6IFBhZ2VCbG9iQ3JlYXRlRXhjZXB0aW9uSGVhZGVycyxcbiAgICBQYWdlQmxvYkNyZWF0ZUhlYWRlcnM6IFBhZ2VCbG9iQ3JlYXRlSGVhZGVycyxcbiAgICBQYWdlQmxvYkdldFBhZ2VSYW5nZXNEaWZmRXhjZXB0aW9uSGVhZGVyczogUGFnZUJsb2JHZXRQYWdlUmFuZ2VzRGlmZkV4Y2VwdGlvbkhlYWRlcnMsXG4gICAgUGFnZUJsb2JHZXRQYWdlUmFuZ2VzRGlmZkhlYWRlcnM6IFBhZ2VCbG9iR2V0UGFnZVJhbmdlc0RpZmZIZWFkZXJzLFxuICAgIFBhZ2VCbG9iR2V0UGFnZVJhbmdlc0V4Y2VwdGlvbkhlYWRlcnM6IFBhZ2VCbG9iR2V0UGFnZVJhbmdlc0V4Y2VwdGlvbkhlYWRlcnMsXG4gICAgUGFnZUJsb2JHZXRQYWdlUmFuZ2VzSGVhZGVyczogUGFnZUJsb2JHZXRQYWdlUmFuZ2VzSGVhZGVycyxcbiAgICBQYWdlQmxvYlJlc2l6ZUV4Y2VwdGlvbkhlYWRlcnM6IFBhZ2VCbG9iUmVzaXplRXhjZXB0aW9uSGVhZGVycyxcbiAgICBQYWdlQmxvYlJlc2l6ZUhlYWRlcnM6IFBhZ2VCbG9iUmVzaXplSGVhZGVycyxcbiAgICBQYWdlQmxvYlVwZGF0ZVNlcXVlbmNlTnVtYmVyRXhjZXB0aW9uSGVhZGVyczogUGFnZUJsb2JVcGRhdGVTZXF1ZW5jZU51bWJlckV4Y2VwdGlvbkhlYWRlcnMsXG4gICAgUGFnZUJsb2JVcGRhdGVTZXF1ZW5jZU51bWJlckhlYWRlcnM6IFBhZ2VCbG9iVXBkYXRlU2VxdWVuY2VOdW1iZXJIZWFkZXJzLFxuICAgIFBhZ2VCbG9iVXBsb2FkUGFnZXNFeGNlcHRpb25IZWFkZXJzOiBQYWdlQmxvYlVwbG9hZFBhZ2VzRXhjZXB0aW9uSGVhZGVycyxcbiAgICBQYWdlQmxvYlVwbG9hZFBhZ2VzRnJvbVVSTEV4Y2VwdGlvbkhlYWRlcnM6IFBhZ2VCbG9iVXBsb2FkUGFnZXNGcm9tVVJMRXhjZXB0aW9uSGVhZGVycyxcbiAgICBQYWdlQmxvYlVwbG9hZFBhZ2VzRnJvbVVSTEhlYWRlcnM6IFBhZ2VCbG9iVXBsb2FkUGFnZXNGcm9tVVJMSGVhZGVycyxcbiAgICBQYWdlQmxvYlVwbG9hZFBhZ2VzSGVhZGVyczogUGFnZUJsb2JVcGxvYWRQYWdlc0hlYWRlcnMsXG4gICAgUGFnZUxpc3Q6IFBhZ2VMaXN0LFxuICAgIFBhZ2VSYW5nZTogUGFnZVJhbmdlLFxuICAgIFF1ZXJ5Rm9ybWF0OiBRdWVyeUZvcm1hdCxcbiAgICBRdWVyeVJlcXVlc3Q6IFF1ZXJ5UmVxdWVzdCxcbiAgICBRdWVyeVNlcmlhbGl6YXRpb246IFF1ZXJ5U2VyaWFsaXphdGlvbixcbiAgICBSZXRlbnRpb25Qb2xpY3k6IFJldGVudGlvblBvbGljeSxcbiAgICBTZXJ2aWNlRmlsdGVyQmxvYnNFeGNlcHRpb25IZWFkZXJzOiBTZXJ2aWNlRmlsdGVyQmxvYnNFeGNlcHRpb25IZWFkZXJzLFxuICAgIFNlcnZpY2VGaWx0ZXJCbG9ic0hlYWRlcnM6IFNlcnZpY2VGaWx0ZXJCbG9ic0hlYWRlcnMsXG4gICAgU2VydmljZUdldEFjY291bnRJbmZvRXhjZXB0aW9uSGVhZGVyczogU2VydmljZUdldEFjY291bnRJbmZvRXhjZXB0aW9uSGVhZGVycyxcbiAgICBTZXJ2aWNlR2V0QWNjb3VudEluZm9IZWFkZXJzOiBTZXJ2aWNlR2V0QWNjb3VudEluZm9IZWFkZXJzLFxuICAgIFNlcnZpY2VHZXRQcm9wZXJ0aWVzRXhjZXB0aW9uSGVhZGVyczogU2VydmljZUdldFByb3BlcnRpZXNFeGNlcHRpb25IZWFkZXJzLFxuICAgIFNlcnZpY2VHZXRQcm9wZXJ0aWVzSGVhZGVyczogU2VydmljZUdldFByb3BlcnRpZXNIZWFkZXJzLFxuICAgIFNlcnZpY2VHZXRTdGF0aXN0aWNzRXhjZXB0aW9uSGVhZGVyczogU2VydmljZUdldFN0YXRpc3RpY3NFeGNlcHRpb25IZWFkZXJzLFxuICAgIFNlcnZpY2VHZXRTdGF0aXN0aWNzSGVhZGVyczogU2VydmljZUdldFN0YXRpc3RpY3NIZWFkZXJzLFxuICAgIFNlcnZpY2VHZXRVc2VyRGVsZWdhdGlvbktleUV4Y2VwdGlvbkhlYWRlcnM6IFNlcnZpY2VHZXRVc2VyRGVsZWdhdGlvbktleUV4Y2VwdGlvbkhlYWRlcnMsXG4gICAgU2VydmljZUdldFVzZXJEZWxlZ2F0aW9uS2V5SGVhZGVyczogU2VydmljZUdldFVzZXJEZWxlZ2F0aW9uS2V5SGVhZGVycyxcbiAgICBTZXJ2aWNlTGlzdENvbnRhaW5lcnNTZWdtZW50RXhjZXB0aW9uSGVhZGVyczogU2VydmljZUxpc3RDb250YWluZXJzU2VnbWVudEV4Y2VwdGlvbkhlYWRlcnMsXG4gICAgU2VydmljZUxpc3RDb250YWluZXJzU2VnbWVudEhlYWRlcnM6IFNlcnZpY2VMaXN0Q29udGFpbmVyc1NlZ21lbnRIZWFkZXJzLFxuICAgIFNlcnZpY2VTZXRQcm9wZXJ0aWVzRXhjZXB0aW9uSGVhZGVyczogU2VydmljZVNldFByb3BlcnRpZXNFeGNlcHRpb25IZWFkZXJzLFxuICAgIFNlcnZpY2VTZXRQcm9wZXJ0aWVzSGVhZGVyczogU2VydmljZVNldFByb3BlcnRpZXNIZWFkZXJzLFxuICAgIFNlcnZpY2VTdWJtaXRCYXRjaEV4Y2VwdGlvbkhlYWRlcnM6IFNlcnZpY2VTdWJtaXRCYXRjaEV4Y2VwdGlvbkhlYWRlcnMsXG4gICAgU2VydmljZVN1Ym1pdEJhdGNoSGVhZGVyczogU2VydmljZVN1Ym1pdEJhdGNoSGVhZGVycyxcbiAgICBTaWduZWRJZGVudGlmaWVyOiBTaWduZWRJZGVudGlmaWVyLFxuICAgIFN0YXRpY1dlYnNpdGU6IFN0YXRpY1dlYnNpdGUsXG4gICAgU3RvcmFnZUVycm9yOiBTdG9yYWdlRXJyb3IsXG4gICAgVXNlckRlbGVnYXRpb25LZXk6IFVzZXJEZWxlZ2F0aW9uS2V5XG59KTtcblxuLypcbiAqIENvcHlyaWdodCAoYykgTWljcm9zb2Z0IENvcnBvcmF0aW9uLlxuICogTGljZW5zZWQgdW5kZXIgdGhlIE1JVCBMaWNlbnNlLlxuICpcbiAqIENvZGUgZ2VuZXJhdGVkIGJ5IE1pY3Jvc29mdCAoUikgQXV0b1Jlc3QgQ29kZSBHZW5lcmF0b3IuXG4gKiBDaGFuZ2VzIG1heSBjYXVzZSBpbmNvcnJlY3QgYmVoYXZpb3IgYW5kIHdpbGwgYmUgbG9zdCBpZiB0aGUgY29kZSBpcyByZWdlbmVyYXRlZC5cbiAqL1xuY29uc3QgY29udGVudFR5cGUgPSB7XG4gICAgcGFyYW1ldGVyUGF0aDogW1wib3B0aW9uc1wiLCBcImNvbnRlbnRUeXBlXCJdLFxuICAgIG1hcHBlcjoge1xuICAgICAgICBkZWZhdWx0VmFsdWU6IFwiYXBwbGljYXRpb24veG1sXCIsXG4gICAgICAgIGlzQ29uc3RhbnQ6IHRydWUsXG4gICAgICAgIHNlcmlhbGl6ZWROYW1lOiBcIkNvbnRlbnQtVHlwZVwiLFxuICAgICAgICB0eXBlOiB7XG4gICAgICAgICAgICBuYW1lOiBcIlN0cmluZ1wiLFxuICAgICAgICB9LFxuICAgIH0sXG59O1xuY29uc3QgYmxvYlNlcnZpY2VQcm9wZXJ0aWVzID0ge1xuICAgIHBhcmFtZXRlclBhdGg6IFwiYmxvYlNlcnZpY2VQcm9wZXJ0aWVzXCIsXG4gICAgbWFwcGVyOiBCbG9iU2VydmljZVByb3BlcnRpZXMsXG59O1xuY29uc3QgYWNjZXB0ID0ge1xuICAgIHBhcmFtZXRlclBhdGg6IFwiYWNjZXB0XCIsXG4gICAgbWFwcGVyOiB7XG4gICAgICAgIGRlZmF1bHRWYWx1ZTogXCJhcHBsaWNhdGlvbi94bWxcIixcbiAgICAgICAgaXNDb25zdGFudDogdHJ1ZSxcbiAgICAgICAgc2VyaWFsaXplZE5hbWU6IFwiQWNjZXB0XCIsXG4gICAgICAgIHR5cGU6IHtcbiAgICAgICAgICAgIG5hbWU6IFwiU3RyaW5nXCIsXG4gICAgICAgIH0sXG4gICAgfSxcbn07XG5jb25zdCB1cmwgPSB7XG4gICAgcGFyYW1ldGVyUGF0aDogXCJ1cmxcIixcbiAgICBtYXBwZXI6IHtcbiAgICAgICAgc2VyaWFsaXplZE5hbWU6IFwidXJsXCIsXG4gICAgICAgIHJlcXVpcmVkOiB0cnVlLFxuICAgICAgICB4bWxOYW1lOiBcInVybFwiLFxuICAgICAgICB0eXBlOiB7XG4gICAgICAgICAgICBuYW1lOiBcIlN0cmluZ1wiLFxuICAgICAgICB9LFxuICAgIH0sXG4gICAgc2tpcEVuY29kaW5nOiB0cnVlLFxufTtcbmNvbnN0IHJlc3R5cGUgPSB7XG4gICAgcGFyYW1ldGVyUGF0aDogXCJyZXN0eXBlXCIsXG4gICAgbWFwcGVyOiB7XG4gICAgICAgIGRlZmF1bHRWYWx1ZTogXCJzZXJ2aWNlXCIsXG4gICAgICAgIGlzQ29uc3RhbnQ6IHRydWUsXG4gICAgICAgIHNlcmlhbGl6ZWROYW1lOiBcInJlc3R5cGVcIixcbiAgICAgICAgdHlwZToge1xuICAgICAgICAgICAgbmFtZTogXCJTdHJpbmdcIixcbiAgICAgICAgfSxcbiAgICB9LFxufTtcbmNvbnN0IGNvbXAgPSB7XG4gICAgcGFyYW1ldGVyUGF0aDogXCJjb21wXCIsXG4gICAgbWFwcGVyOiB7XG4gICAgICAgIGRlZmF1bHRWYWx1ZTogXCJwcm9wZXJ0aWVzXCIsXG4gICAgICAgIGlzQ29uc3RhbnQ6IHRydWUsXG4gICAgICAgIHNlcmlhbGl6ZWROYW1lOiBcImNvbXBcIixcbiAgICAgICAgdHlwZToge1xuICAgICAgICAgICAgbmFtZTogXCJTdHJpbmdcIixcbiAgICAgICAgfSxcbiAgICB9LFxufTtcbmNvbnN0IHRpbWVvdXRJblNlY29uZHMgPSB7XG4gICAgcGFyYW1ldGVyUGF0aDogW1wib3B0aW9uc1wiLCBcInRpbWVvdXRJblNlY29uZHNcIl0sXG4gICAgbWFwcGVyOiB7XG4gICAgICAgIGNvbnN0cmFpbnRzOiB7XG4gICAgICAgICAgICBJbmNsdXNpdmVNaW5pbXVtOiAwLFxuICAgICAgICB9LFxuICAgICAgICBzZXJpYWxpemVkTmFtZTogXCJ0aW1lb3V0XCIsXG4gICAgICAgIHhtbE5hbWU6IFwidGltZW91dFwiLFxuICAgICAgICB0eXBlOiB7XG4gICAgICAgICAgICBuYW1lOiBcIk51bWJlclwiLFxuICAgICAgICB9LFxuICAgIH0sXG59O1xuY29uc3QgdmVyc2lvbiA9IHtcbiAgICBwYXJhbWV0ZXJQYXRoOiBcInZlcnNpb25cIixcbiAgICBtYXBwZXI6IHtcbiAgICAgICAgZGVmYXVsdFZhbHVlOiBcIjIwMjQtMTEtMDRcIixcbiAgICAgICAgaXNDb25zdGFudDogdHJ1ZSxcbiAgICAgICAgc2VyaWFsaXplZE5hbWU6IFwieC1tcy12ZXJzaW9uXCIsXG4gICAgICAgIHR5cGU6IHtcbiAgICAgICAgICAgIG5hbWU6IFwiU3RyaW5nXCIsXG4gICAgICAgIH0sXG4gICAgfSxcbn07XG5jb25zdCByZXF1ZXN0SWQgPSB7XG4gICAgcGFyYW1ldGVyUGF0aDogW1wib3B0aW9uc1wiLCBcInJlcXVlc3RJZFwiXSxcbiAgICBtYXBwZXI6IHtcbiAgICAgICAgc2VyaWFsaXplZE5hbWU6IFwieC1tcy1jbGllbnQtcmVxdWVzdC1pZFwiLFxuICAgICAgICB4bWxOYW1lOiBcIngtbXMtY2xpZW50LXJlcXVlc3QtaWRcIixcbiAgICAgICAgdHlwZToge1xuICAgICAgICAgICAgbmFtZTogXCJTdHJpbmdcIixcbiAgICAgICAgfSxcbiAgICB9LFxufTtcbmNvbnN0IGFjY2VwdDEgPSB7XG4gICAgcGFyYW1ldGVyUGF0aDogXCJhY2NlcHRcIixcbiAgICBtYXBwZXI6IHtcbiAgICAgICAgZGVmYXVsdFZhbHVlOiBcImFwcGxpY2F0aW9uL3htbFwiLFxuICAgICAgICBpc0NvbnN0YW50OiB0cnVlLFxuICAgICAgICBzZXJpYWxpemVkTmFtZTogXCJBY2NlcHRcIixcbiAgICAgICAgdHlwZToge1xuICAgICAgICAgICAgbmFtZTogXCJTdHJpbmdcIixcbiAgICAgICAgfSxcbiAgICB9LFxufTtcbmNvbnN0IGNvbXAxID0ge1xuICAgIHBhcmFtZXRlclBhdGg6IFwiY29tcFwiLFxuICAgIG1hcHBlcjoge1xuICAgICAgICBkZWZhdWx0VmFsdWU6IFwic3RhdHNcIixcbiAgICAgICAgaXNDb25zdGFudDogdHJ1ZSxcbiAgICAgICAgc2VyaWFsaXplZE5hbWU6IFwiY29tcFwiLFxuICAgICAgICB0eXBlOiB7XG4gICAgICAgICAgICBuYW1lOiBcIlN0cmluZ1wiLFxuICAgICAgICB9LFxuICAgIH0sXG59O1xuY29uc3QgY29tcDIgPSB7XG4gICAgcGFyYW1ldGVyUGF0aDogXCJjb21wXCIsXG4gICAgbWFwcGVyOiB7XG4gICAgICAgIGRlZmF1bHRWYWx1ZTogXCJsaXN0XCIsXG4gICAgICAgIGlzQ29uc3RhbnQ6IHRydWUsXG4gICAgICAgIHNlcmlhbGl6ZWROYW1lOiBcImNvbXBcIixcbiAgICAgICAgdHlwZToge1xuICAgICAgICAgICAgbmFtZTogXCJTdHJpbmdcIixcbiAgICAgICAgfSxcbiAgICB9LFxufTtcbmNvbnN0IHByZWZpeCA9IHtcbiAgICBwYXJhbWV0ZXJQYXRoOiBbXCJvcHRpb25zXCIsIFwicHJlZml4XCJdLFxuICAgIG1hcHBlcjoge1xuICAgICAgICBzZXJpYWxpemVkTmFtZTogXCJwcmVmaXhcIixcbiAgICAgICAgeG1sTmFtZTogXCJwcmVmaXhcIixcbiAgICAgICAgdHlwZToge1xuICAgICAgICAgICAgbmFtZTogXCJTdHJpbmdcIixcbiAgICAgICAgfSxcbiAgICB9LFxufTtcbmNvbnN0IG1hcmtlciA9IHtcbiAgICBwYXJhbWV0ZXJQYXRoOiBbXCJvcHRpb25zXCIsIFwibWFya2VyXCJdLFxuICAgIG1hcHBlcjoge1xuICAgICAgICBzZXJpYWxpemVkTmFtZTogXCJtYXJrZXJcIixcbiAgICAgICAgeG1sTmFtZTogXCJtYXJrZXJcIixcbiAgICAgICAgdHlwZToge1xuICAgICAgICAgICAgbmFtZTogXCJTdHJpbmdcIixcbiAgICAgICAgfSxcbiAgICB9LFxufTtcbmNvbnN0IG1heFBhZ2VTaXplID0ge1xuICAgIHBhcmFtZXRlclBhdGg6IFtcIm9wdGlvbnNcIiwgXCJtYXhQYWdlU2l6ZVwiXSxcbiAgICBtYXBwZXI6IHtcbiAgICAgICAgY29uc3RyYWludHM6IHtcbiAgICAgICAgICAgIEluY2x1c2l2ZU1pbmltdW06IDEsXG4gICAgICAgIH0sXG4gICAgICAgIHNlcmlhbGl6ZWROYW1lOiBcIm1heHJlc3VsdHNcIixcbiAgICAgICAgeG1sTmFtZTogXCJtYXhyZXN1bHRzXCIsXG4gICAgICAgIHR5cGU6IHtcbiAgICAgICAgICAgIG5hbWU6IFwiTnVtYmVyXCIsXG4gICAgICAgIH0sXG4gICAgfSxcbn07XG5jb25zdCBpbmNsdWRlID0ge1xuICAgIHBhcmFtZXRlclBhdGg6IFtcIm9wdGlvbnNcIiwgXCJpbmNsdWRlXCJdLFxuICAgIG1hcHBlcjoge1xuICAgICAgICBzZXJpYWxpemVkTmFtZTogXCJpbmNsdWRlXCIsXG4gICAgICAgIHhtbE5hbWU6IFwiaW5jbHVkZVwiLFxuICAgICAgICB4bWxFbGVtZW50TmFtZTogXCJMaXN0Q29udGFpbmVyc0luY2x1ZGVUeXBlXCIsXG4gICAgICAgIHR5cGU6IHtcbiAgICAgICAgICAgIG5hbWU6IFwiU2VxdWVuY2VcIixcbiAgICAgICAgICAgIGVsZW1lbnQ6IHtcbiAgICAgICAgICAgICAgICB0eXBlOiB7XG4gICAgICAgICAgICAgICAgICAgIG5hbWU6IFwiRW51bVwiLFxuICAgICAgICAgICAgICAgICAgICBhbGxvd2VkVmFsdWVzOiBbXCJtZXRhZGF0YVwiLCBcImRlbGV0ZWRcIiwgXCJzeXN0ZW1cIl0sXG4gICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIH0sXG4gICAgICAgIH0sXG4gICAgfSxcbiAgICBjb2xsZWN0aW9uRm9ybWF0OiBcIkNTVlwiLFxufTtcbmNvbnN0IGtleUluZm8gPSB7XG4gICAgcGFyYW1ldGVyUGF0aDogXCJrZXlJbmZvXCIsXG4gICAgbWFwcGVyOiBLZXlJbmZvLFxufTtcbmNvbnN0IGNvbXAzID0ge1xuICAgIHBhcmFtZXRlclBhdGg6IFwiY29tcFwiLFxuICAgIG1hcHBlcjoge1xuICAgICAgICBkZWZhdWx0VmFsdWU6IFwidXNlcmRlbGVnYXRpb25rZXlcIixcbiAgICAgICAgaXNDb25zdGFudDogdHJ1ZSxcbiAgICAgICAgc2VyaWFsaXplZE5hbWU6IFwiY29tcFwiLFxuICAgICAgICB0eXBlOiB7XG4gICAgICAgICAgICBuYW1lOiBcIlN0cmluZ1wiLFxuICAgICAgICB9LFxuICAgIH0sXG59O1xuY29uc3QgcmVzdHlwZTEgPSB7XG4gICAgcGFyYW1ldGVyUGF0aDogXCJyZXN0eXBlXCIsXG4gICAgbWFwcGVyOiB7XG4gICAgICAgIGRlZmF1bHRWYWx1ZTogXCJhY2NvdW50XCIsXG4gICAgICAgIGlzQ29uc3RhbnQ6IHRydWUsXG4gICAgICAgIHNlcmlhbGl6ZWROYW1lOiBcInJlc3R5cGVcIixcbiAgICAgICAgdHlwZToge1xuICAgICAgICAgICAgbmFtZTogXCJTdHJpbmdcIixcbiAgICAgICAgfSxcbiAgICB9LFxufTtcbmNvbnN0IGJvZHkgPSB7XG4gICAgcGFyYW1ldGVyUGF0aDogXCJib2R5XCIsXG4gICAgbWFwcGVyOiB7XG4gICAgICAgIHNlcmlhbGl6ZWROYW1lOiBcImJvZHlcIixcbiAgICAgICAgcmVxdWlyZWQ6IHRydWUsXG4gICAgICAgIHhtbE5hbWU6IFwiYm9keVwiLFxuICAgICAgICB0eXBlOiB7XG4gICAgICAgICAgICBuYW1lOiBcIlN0cmVhbVwiLFxuICAgICAgICB9LFxuICAgIH0sXG59O1xuY29uc3QgY29tcDQgPSB7XG4gICAgcGFyYW1ldGVyUGF0aDogXCJjb21wXCIsXG4gICAgbWFwcGVyOiB7XG4gICAgICAgIGRlZmF1bHRWYWx1ZTogXCJiYXRjaFwiLFxuICAgICAgICBpc0NvbnN0YW50OiB0cnVlLFxuICAgICAgICBzZXJpYWxpemVkTmFtZTogXCJjb21wXCIsXG4gICAgICAgIHR5cGU6IHtcbiAgICAgICAgICAgIG5hbWU6IFwiU3RyaW5nXCIsXG4gICAgICAgIH0sXG4gICAgfSxcbn07XG5jb25zdCBjb250ZW50TGVuZ3RoID0ge1xuICAgIHBhcmFtZXRlclBhdGg6IFwiY29udGVudExlbmd0aFwiLFxuICAgIG1hcHBlcjoge1xuICAgICAgICBzZXJpYWxpemVkTmFtZTogXCJDb250ZW50LUxlbmd0aFwiLFxuICAgICAgICByZXF1aXJlZDogdHJ1ZSxcbiAgICAgICAgeG1sTmFtZTogXCJDb250ZW50LUxlbmd0aFwiLFxuICAgICAgICB0eXBlOiB7XG4gICAgICAgICAgICBuYW1lOiBcIk51bWJlclwiLFxuICAgICAgICB9LFxuICAgIH0sXG59O1xuY29uc3QgbXVsdGlwYXJ0Q29udGVudFR5cGUgPSB7XG4gICAgcGFyYW1ldGVyUGF0aDogXCJtdWx0aXBhcnRDb250ZW50VHlwZVwiLFxuICAgIG1hcHBlcjoge1xuICAgICAgICBzZXJpYWxpemVkTmFtZTogXCJDb250ZW50LVR5cGVcIixcbiAgICAgICAgcmVxdWlyZWQ6IHRydWUsXG4gICAgICAgIHhtbE5hbWU6IFwiQ29udGVudC1UeXBlXCIsXG4gICAgICAgIHR5cGU6IHtcbiAgICAgICAgICAgIG5hbWU6IFwiU3RyaW5nXCIsXG4gICAgICAgIH0sXG4gICAgfSxcbn07XG5jb25zdCBjb21wNSA9IHtcbiAgICBwYXJhbWV0ZXJQYXRoOiBcImNvbXBcIixcbiAgICBtYXBwZXI6IHtcbiAgICAgICAgZGVmYXVsdFZhbHVlOiBcImJsb2JzXCIsXG4gICAgICAgIGlzQ29uc3RhbnQ6IHRydWUsXG4gICAgICAgIHNlcmlhbGl6ZWROYW1lOiBcImNvbXBcIixcbiAgICAgICAgdHlwZToge1xuICAgICAgICAgICAgbmFtZTogXCJTdHJpbmdcIixcbiAgICAgICAgfSxcbiAgICB9LFxufTtcbmNvbnN0IHdoZXJlID0ge1xuICAgIHBhcmFtZXRlclBhdGg6IFtcIm9wdGlvbnNcIiwgXCJ3aGVyZVwiXSxcbiAgICBtYXBwZXI6IHtcbiAgICAgICAgc2VyaWFsaXplZE5hbWU6IFwid2hlcmVcIixcbiAgICAgICAgeG1sTmFtZTogXCJ3aGVyZVwiLFxuICAgICAgICB0eXBlOiB7XG4gICAgICAgICAgICBuYW1lOiBcIlN0cmluZ1wiLFxuICAgICAgICB9LFxuICAgIH0sXG59O1xuY29uc3QgcmVzdHlwZTIgPSB7XG4gICAgcGFyYW1ldGVyUGF0aDogXCJyZXN0eXBlXCIsXG4gICAgbWFwcGVyOiB7XG4gICAgICAgIGRlZmF1bHRWYWx1ZTogXCJjb250YWluZXJcIixcbiAgICAgICAgaXNDb25zdGFudDogdHJ1ZSxcbiAgICAgICAgc2VyaWFsaXplZE5hbWU6IFwicmVzdHlwZVwiLFxuICAgICAgICB0eXBlOiB7XG4gICAgICAgICAgICBuYW1lOiBcIlN0cmluZ1wiLFxuICAgICAgICB9LFxuICAgIH0sXG59O1xuY29uc3QgbWV0YWRhdGEgPSB7XG4gICAgcGFyYW1ldGVyUGF0aDogW1wib3B0aW9uc1wiLCBcIm1ldGFkYXRhXCJdLFxuICAgIG1hcHBlcjoge1xuICAgICAgICBzZXJpYWxpemVkTmFtZTogXCJ4LW1zLW1ldGFcIixcbiAgICAgICAgeG1sTmFtZTogXCJ4LW1zLW1ldGFcIixcbiAgICAgICAgaGVhZGVyQ29sbGVjdGlvblByZWZpeDogXCJ4LW1zLW1ldGEtXCIsXG4gICAgICAgIHR5cGU6IHtcbiAgICAgICAgICAgIG5hbWU6IFwiRGljdGlvbmFyeVwiLFxuICAgICAgICAgICAgdmFsdWU6IHsgdHlwZTogeyBuYW1lOiBcIlN0cmluZ1wiIH0gfSxcbiAgICAgICAgfSxcbiAgICB9LFxufTtcbmNvbnN0IGFjY2VzcyA9IHtcbiAgICBwYXJhbWV0ZXJQYXRoOiBbXCJvcHRpb25zXCIsIFwiYWNjZXNzXCJdLFxuICAgIG1hcHBlcjoge1xuICAgICAgICBzZXJpYWxpemVkTmFtZTogXCJ4LW1zLWJsb2ItcHVibGljLWFjY2Vzc1wiLFxuICAgICAgICB4bWxOYW1lOiBcIngtbXMtYmxvYi1wdWJsaWMtYWNjZXNzXCIsXG4gICAgICAgIHR5cGU6IHtcbiAgICAgICAgICAgIG5hbWU6IFwiRW51bVwiLFxuICAgICAgICAgICAgYWxsb3dlZFZhbHVlczogW1wiY29udGFpbmVyXCIsIFwiYmxvYlwiXSxcbiAgICAgICAgfSxcbiAgICB9LFxufTtcbmNvbnN0IGRlZmF1bHRFbmNyeXB0aW9uU2NvcGUgPSB7XG4gICAgcGFyYW1ldGVyUGF0aDogW1xuICAgICAgICBcIm9wdGlvbnNcIixcbiAgICAgICAgXCJjb250YWluZXJFbmNyeXB0aW9uU2NvcGVcIixcbiAgICAgICAgXCJkZWZhdWx0RW5jcnlwdGlvblNjb3BlXCIsXG4gICAgXSxcbiAgICBtYXBwZXI6IHtcbiAgICAgICAgc2VyaWFsaXplZE5hbWU6IFwieC1tcy1kZWZhdWx0LWVuY3J5cHRpb24tc2NvcGVcIixcbiAgICAgICAgeG1sTmFtZTogXCJ4LW1zLWRlZmF1bHQtZW5jcnlwdGlvbi1zY29wZVwiLFxuICAgICAgICB0eXBlOiB7XG4gICAgICAgICAgICBuYW1lOiBcIlN0cmluZ1wiLFxuICAgICAgICB9LFxuICAgIH0sXG59O1xuY29uc3QgcHJldmVudEVuY3J5cHRpb25TY29wZU92ZXJyaWRlID0ge1xuICAgIHBhcmFtZXRlclBhdGg6IFtcbiAgICAgICAgXCJvcHRpb25zXCIsXG4gICAgICAgIFwiY29udGFpbmVyRW5jcnlwdGlvblNjb3BlXCIsXG4gICAgICAgIFwicHJldmVudEVuY3J5cHRpb25TY29wZU92ZXJyaWRlXCIsXG4gICAgXSxcbiAgICBtYXBwZXI6IHtcbiAgICAgICAgc2VyaWFsaXplZE5hbWU6IFwieC1tcy1kZW55LWVuY3J5cHRpb24tc2NvcGUtb3ZlcnJpZGVcIixcbiAgICAgICAgeG1sTmFtZTogXCJ4LW1zLWRlbnktZW5jcnlwdGlvbi1zY29wZS1vdmVycmlkZVwiLFxuICAgICAgICB0eXBlOiB7XG4gICAgICAgICAgICBuYW1lOiBcIkJvb2xlYW5cIixcbiAgICAgICAgfSxcbiAgICB9LFxufTtcbmNvbnN0IGxlYXNlSWQgPSB7XG4gICAgcGFyYW1ldGVyUGF0aDogW1wib3B0aW9uc1wiLCBcImxlYXNlQWNjZXNzQ29uZGl0aW9uc1wiLCBcImxlYXNlSWRcIl0sXG4gICAgbWFwcGVyOiB7XG4gICAgICAgIHNlcmlhbGl6ZWROYW1lOiBcIngtbXMtbGVhc2UtaWRcIixcbiAgICAgICAgeG1sTmFtZTogXCJ4LW1zLWxlYXNlLWlkXCIsXG4gICAgICAgIHR5cGU6IHtcbiAgICAgICAgICAgIG5hbWU6IFwiU3RyaW5nXCIsXG4gICAgICAgIH0sXG4gICAgfSxcbn07XG5jb25zdCBpZk1vZGlmaWVkU2luY2UgPSB7XG4gICAgcGFyYW1ldGVyUGF0aDogW1wib3B0aW9uc1wiLCBcIm1vZGlmaWVkQWNjZXNzQ29uZGl0aW9uc1wiLCBcImlmTW9kaWZpZWRTaW5jZVwiXSxcbiAgICBtYXBwZXI6IHtcbiAgICAgICAgc2VyaWFsaXplZE5hbWU6IFwiSWYtTW9kaWZpZWQtU2luY2VcIixcbiAgICAgICAgeG1sTmFtZTogXCJJZi1Nb2RpZmllZC1TaW5jZVwiLFxuICAgICAgICB0eXBlOiB7XG4gICAgICAgICAgICBuYW1lOiBcIkRhdGVUaW1lUmZjMTEyM1wiLFxuICAgICAgICB9LFxuICAgIH0sXG59O1xuY29uc3QgaWZVbm1vZGlmaWVkU2luY2UgPSB7XG4gICAgcGFyYW1ldGVyUGF0aDogW1wib3B0aW9uc1wiLCBcIm1vZGlmaWVkQWNjZXNzQ29uZGl0aW9uc1wiLCBcImlmVW5tb2RpZmllZFNpbmNlXCJdLFxuICAgIG1hcHBlcjoge1xuICAgICAgICBzZXJpYWxpemVkTmFtZTogXCJJZi1Vbm1vZGlmaWVkLVNpbmNlXCIsXG4gICAgICAgIHhtbE5hbWU6IFwiSWYtVW5tb2RpZmllZC1TaW5jZVwiLFxuICAgICAgICB0eXBlOiB7XG4gICAgICAgICAgICBuYW1lOiBcIkRhdGVUaW1lUmZjMTEyM1wiLFxuICAgICAgICB9LFxuICAgIH0sXG59O1xuY29uc3QgY29tcDYgPSB7XG4gICAgcGFyYW1ldGVyUGF0aDogXCJjb21wXCIsXG4gICAgbWFwcGVyOiB7XG4gICAgICAgIGRlZmF1bHRWYWx1ZTogXCJtZXRhZGF0YVwiLFxuICAgICAgICBpc0NvbnN0YW50OiB0cnVlLFxuICAgICAgICBzZXJpYWxpemVkTmFtZTogXCJjb21wXCIsXG4gICAgICAgIHR5cGU6IHtcbiAgICAgICAgICAgIG5hbWU6IFwiU3RyaW5nXCIsXG4gICAgICAgIH0sXG4gICAgfSxcbn07XG5jb25zdCBjb21wNyA9IHtcbiAgICBwYXJhbWV0ZXJQYXRoOiBcImNvbXBcIixcbiAgICBtYXBwZXI6IHtcbiAgICAgICAgZGVmYXVsdFZhbHVlOiBcImFjbFwiLFxuICAgICAgICBpc0NvbnN0YW50OiB0cnVlLFxuICAgICAgICBzZXJpYWxpemVkTmFtZTogXCJjb21wXCIsXG4gICAgICAgIHR5cGU6IHtcbiAgICAgICAgICAgIG5hbWU6IFwiU3RyaW5nXCIsXG4gICAgICAgIH0sXG4gICAgfSxcbn07XG5jb25zdCBjb250YWluZXJBY2wgPSB7XG4gICAgcGFyYW1ldGVyUGF0aDogW1wib3B0aW9uc1wiLCBcImNvbnRhaW5lckFjbFwiXSxcbiAgICBtYXBwZXI6IHtcbiAgICAgICAgc2VyaWFsaXplZE5hbWU6IFwiY29udGFpbmVyQWNsXCIsXG4gICAgICAgIHhtbE5hbWU6IFwiU2lnbmVkSWRlbnRpZmllcnNcIixcbiAgICAgICAgeG1sSXNXcmFwcGVkOiB0cnVlLFxuICAgICAgICB4bWxFbGVtZW50TmFtZTogXCJTaWduZWRJZGVudGlmaWVyXCIsXG4gICAgICAgIHR5cGU6IHtcbiAgICAgICAgICAgIG5hbWU6IFwiU2VxdWVuY2VcIixcbiAgICAgICAgICAgIGVsZW1lbnQ6IHtcbiAgICAgICAgICAgICAgICB0eXBlOiB7XG4gICAgICAgICAgICAgICAgICAgIG5hbWU6IFwiQ29tcG9zaXRlXCIsXG4gICAgICAgICAgICAgICAgICAgIGNsYXNzTmFtZTogXCJTaWduZWRJZGVudGlmaWVyXCIsXG4gICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIH0sXG4gICAgICAgIH0sXG4gICAgfSxcbn07XG5jb25zdCBjb21wOCA9IHtcbiAgICBwYXJhbWV0ZXJQYXRoOiBcImNvbXBcIixcbiAgICBtYXBwZXI6IHtcbiAgICAgICAgZGVmYXVsdFZhbHVlOiBcInVuZGVsZXRlXCIsXG4gICAgICAgIGlzQ29uc3RhbnQ6IHRydWUsXG4gICAgICAgIHNlcmlhbGl6ZWROYW1lOiBcImNvbXBcIixcbiAgICAgICAgdHlwZToge1xuICAgICAgICAgICAgbmFtZTogXCJTdHJpbmdcIixcbiAgICAgICAgfSxcbiAgICB9LFxufTtcbmNvbnN0IGRlbGV0ZWRDb250YWluZXJOYW1lID0ge1xuICAgIHBhcmFtZXRlclBhdGg6IFtcIm9wdGlvbnNcIiwgXCJkZWxldGVkQ29udGFpbmVyTmFtZVwiXSxcbiAgICBtYXBwZXI6IHtcbiAgICAgICAgc2VyaWFsaXplZE5hbWU6IFwieC1tcy1kZWxldGVkLWNvbnRhaW5lci1uYW1lXCIsXG4gICAgICAgIHhtbE5hbWU6IFwieC1tcy1kZWxldGVkLWNvbnRhaW5lci1uYW1lXCIsXG4gICAgICAgIHR5cGU6IHtcbiAgICAgICAgICAgIG5hbWU6IFwiU3RyaW5nXCIsXG4gICAgICAgIH0sXG4gICAgfSxcbn07XG5jb25zdCBkZWxldGVkQ29udGFpbmVyVmVyc2lvbiA9IHtcbiAgICBwYXJhbWV0ZXJQYXRoOiBbXCJvcHRpb25zXCIsIFwiZGVsZXRlZENvbnRhaW5lclZlcnNpb25cIl0sXG4gICAgbWFwcGVyOiB7XG4gICAgICAgIHNlcmlhbGl6ZWROYW1lOiBcIngtbXMtZGVsZXRlZC1jb250YWluZXItdmVyc2lvblwiLFxuICAgICAgICB4bWxOYW1lOiBcIngtbXMtZGVsZXRlZC1jb250YWluZXItdmVyc2lvblwiLFxuICAgICAgICB0eXBlOiB7XG4gICAgICAgICAgICBuYW1lOiBcIlN0cmluZ1wiLFxuICAgICAgICB9LFxuICAgIH0sXG59O1xuY29uc3QgY29tcDkgPSB7XG4gICAgcGFyYW1ldGVyUGF0aDogXCJjb21wXCIsXG4gICAgbWFwcGVyOiB7XG4gICAgICAgIGRlZmF1bHRWYWx1ZTogXCJyZW5hbWVcIixcbiAgICAgICAgaXNDb25zdGFudDogdHJ1ZSxcbiAgICAgICAgc2VyaWFsaXplZE5hbWU6IFwiY29tcFwiLFxuICAgICAgICB0eXBlOiB7XG4gICAgICAgICAgICBuYW1lOiBcIlN0cmluZ1wiLFxuICAgICAgICB9LFxuICAgIH0sXG59O1xuY29uc3Qgc291cmNlQ29udGFpbmVyTmFtZSA9IHtcbiAgICBwYXJhbWV0ZXJQYXRoOiBcInNvdXJjZUNvbnRhaW5lck5hbWVcIixcbiAgICBtYXBwZXI6IHtcbiAgICAgICAgc2VyaWFsaXplZE5hbWU6IFwieC1tcy1zb3VyY2UtY29udGFpbmVyLW5hbWVcIixcbiAgICAgICAgcmVxdWlyZWQ6IHRydWUsXG4gICAgICAgIHhtbE5hbWU6IFwieC1tcy1zb3VyY2UtY29udGFpbmVyLW5hbWVcIixcbiAgICAgICAgdHlwZToge1xuICAgICAgICAgICAgbmFtZTogXCJTdHJpbmdcIixcbiAgICAgICAgfSxcbiAgICB9LFxufTtcbmNvbnN0IHNvdXJjZUxlYXNlSWQgPSB7XG4gICAgcGFyYW1ldGVyUGF0aDogW1wib3B0aW9uc1wiLCBcInNvdXJjZUxlYXNlSWRcIl0sXG4gICAgbWFwcGVyOiB7XG4gICAgICAgIHNlcmlhbGl6ZWROYW1lOiBcIngtbXMtc291cmNlLWxlYXNlLWlkXCIsXG4gICAgICAgIHhtbE5hbWU6IFwieC1tcy1zb3VyY2UtbGVhc2UtaWRcIixcbiAgICAgICAgdHlwZToge1xuICAgICAgICAgICAgbmFtZTogXCJTdHJpbmdcIixcbiAgICAgICAgfSxcbiAgICB9LFxufTtcbmNvbnN0IGNvbXAxMCA9IHtcbiAgICBwYXJhbWV0ZXJQYXRoOiBcImNvbXBcIixcbiAgICBtYXBwZXI6IHtcbiAgICAgICAgZGVmYXVsdFZhbHVlOiBcImxlYXNlXCIsXG4gICAgICAgIGlzQ29uc3RhbnQ6IHRydWUsXG4gICAgICAgIHNlcmlhbGl6ZWROYW1lOiBcImNvbXBcIixcbiAgICAgICAgdHlwZToge1xuICAgICAgICAgICAgbmFtZTogXCJTdHJpbmdcIixcbiAgICAgICAgfSxcbiAgICB9LFxufTtcbmNvbnN0IGFjdGlvbiA9IHtcbiAgICBwYXJhbWV0ZXJQYXRoOiBcImFjdGlvblwiLFxuICAgIG1hcHBlcjoge1xuICAgICAgICBkZWZhdWx0VmFsdWU6IFwiYWNxdWlyZVwiLFxuICAgICAgICBpc0NvbnN0YW50OiB0cnVlLFxuICAgICAgICBzZXJpYWxpemVkTmFtZTogXCJ4LW1zLWxlYXNlLWFjdGlvblwiLFxuICAgICAgICB0eXBlOiB7XG4gICAgICAgICAgICBuYW1lOiBcIlN0cmluZ1wiLFxuICAgICAgICB9LFxuICAgIH0sXG59O1xuY29uc3QgZHVyYXRpb24gPSB7XG4gICAgcGFyYW1ldGVyUGF0aDogW1wib3B0aW9uc1wiLCBcImR1cmF0aW9uXCJdLFxuICAgIG1hcHBlcjoge1xuICAgICAgICBzZXJpYWxpemVkTmFtZTogXCJ4LW1zLWxlYXNlLWR1cmF0aW9uXCIsXG4gICAgICAgIHhtbE5hbWU6IFwieC1tcy1sZWFzZS1kdXJhdGlvblwiLFxuICAgICAgICB0eXBlOiB7XG4gICAgICAgICAgICBuYW1lOiBcIk51bWJlclwiLFxuICAgICAgICB9LFxuICAgIH0sXG59O1xuY29uc3QgcHJvcG9zZWRMZWFzZUlkID0ge1xuICAgIHBhcmFtZXRlclBhdGg6IFtcIm9wdGlvbnNcIiwgXCJwcm9wb3NlZExlYXNlSWRcIl0sXG4gICAgbWFwcGVyOiB7XG4gICAgICAgIHNlcmlhbGl6ZWROYW1lOiBcIngtbXMtcHJvcG9zZWQtbGVhc2UtaWRcIixcbiAgICAgICAgeG1sTmFtZTogXCJ4LW1zLXByb3Bvc2VkLWxlYXNlLWlkXCIsXG4gICAgICAgIHR5cGU6IHtcbiAgICAgICAgICAgIG5hbWU6IFwiU3RyaW5nXCIsXG4gICAgICAgIH0sXG4gICAgfSxcbn07XG5jb25zdCBhY3Rpb24xID0ge1xuICAgIHBhcmFtZXRlclBhdGg6IFwiYWN0aW9uXCIsXG4gICAgbWFwcGVyOiB7XG4gICAgICAgIGRlZmF1bHRWYWx1ZTogXCJyZWxlYXNlXCIsXG4gICAgICAgIGlzQ29uc3RhbnQ6IHRydWUsXG4gICAgICAgIHNlcmlhbGl6ZWROYW1lOiBcIngtbXMtbGVhc2UtYWN0aW9uXCIsXG4gICAgICAgIHR5cGU6IHtcbiAgICAgICAgICAgIG5hbWU6IFwiU3RyaW5nXCIsXG4gICAgICAgIH0sXG4gICAgfSxcbn07XG5jb25zdCBsZWFzZUlkMSA9IHtcbiAgICBwYXJhbWV0ZXJQYXRoOiBcImxlYXNlSWRcIixcbiAgICBtYXBwZXI6IHtcbiAgICAgICAgc2VyaWFsaXplZE5hbWU6IFwieC1tcy1sZWFzZS1pZFwiLFxuICAgICAgICByZXF1aXJlZDogdHJ1ZSxcbiAgICAgICAgeG1sTmFtZTogXCJ4LW1zLWxlYXNlLWlkXCIsXG4gICAgICAgIHR5cGU6IHtcbiAgICAgICAgICAgIG5hbWU6IFwiU3RyaW5nXCIsXG4gICAgICAgIH0sXG4gICAgfSxcbn07XG5jb25zdCBhY3Rpb24yID0ge1xuICAgIHBhcmFtZXRlclBhdGg6IFwiYWN0aW9uXCIsXG4gICAgbWFwcGVyOiB7XG4gICAgICAgIGRlZmF1bHRWYWx1ZTogXCJyZW5ld1wiLFxuICAgICAgICBpc0NvbnN0YW50OiB0cnVlLFxuICAgICAgICBzZXJpYWxpemVkTmFtZTogXCJ4LW1zLWxlYXNlLWFjdGlvblwiLFxuICAgICAgICB0eXBlOiB7XG4gICAgICAgICAgICBuYW1lOiBcIlN0cmluZ1wiLFxuICAgICAgICB9LFxuICAgIH0sXG59O1xuY29uc3QgYWN0aW9uMyA9IHtcbiAgICBwYXJhbWV0ZXJQYXRoOiBcImFjdGlvblwiLFxuICAgIG1hcHBlcjoge1xuICAgICAgICBkZWZhdWx0VmFsdWU6IFwiYnJlYWtcIixcbiAgICAgICAgaXNDb25zdGFudDogdHJ1ZSxcbiAgICAgICAgc2VyaWFsaXplZE5hbWU6IFwieC1tcy1sZWFzZS1hY3Rpb25cIixcbiAgICAgICAgdHlwZToge1xuICAgICAgICAgICAgbmFtZTogXCJTdHJpbmdcIixcbiAgICAgICAgfSxcbiAgICB9LFxufTtcbmNvbnN0IGJyZWFrUGVyaW9kID0ge1xuICAgIHBhcmFtZXRlclBhdGg6IFtcIm9wdGlvbnNcIiwgXCJicmVha1BlcmlvZFwiXSxcbiAgICBtYXBwZXI6IHtcbiAgICAgICAgc2VyaWFsaXplZE5hbWU6IFwieC1tcy1sZWFzZS1icmVhay1wZXJpb2RcIixcbiAgICAgICAgeG1sTmFtZTogXCJ4LW1zLWxlYXNlLWJyZWFrLXBlcmlvZFwiLFxuICAgICAgICB0eXBlOiB7XG4gICAgICAgICAgICBuYW1lOiBcIk51bWJlclwiLFxuICAgICAgICB9LFxuICAgIH0sXG59O1xuY29uc3QgYWN0aW9uNCA9IHtcbiAgICBwYXJhbWV0ZXJQYXRoOiBcImFjdGlvblwiLFxuICAgIG1hcHBlcjoge1xuICAgICAgICBkZWZhdWx0VmFsdWU6IFwiY2hhbmdlXCIsXG4gICAgICAgIGlzQ29uc3RhbnQ6IHRydWUsXG4gICAgICAgIHNlcmlhbGl6ZWROYW1lOiBcIngtbXMtbGVhc2UtYWN0aW9uXCIsXG4gICAgICAgIHR5cGU6IHtcbiAgICAgICAgICAgIG5hbWU6IFwiU3RyaW5nXCIsXG4gICAgICAgIH0sXG4gICAgfSxcbn07XG5jb25zdCBwcm9wb3NlZExlYXNlSWQxID0ge1xuICAgIHBhcmFtZXRlclBhdGg6IFwicHJvcG9zZWRMZWFzZUlkXCIsXG4gICAgbWFwcGVyOiB7XG4gICAgICAgIHNlcmlhbGl6ZWROYW1lOiBcIngtbXMtcHJvcG9zZWQtbGVhc2UtaWRcIixcbiAgICAgICAgcmVxdWlyZWQ6IHRydWUsXG4gICAgICAgIHhtbE5hbWU6IFwieC1tcy1wcm9wb3NlZC1sZWFzZS1pZFwiLFxuICAgICAgICB0eXBlOiB7XG4gICAgICAgICAgICBuYW1lOiBcIlN0cmluZ1wiLFxuICAgICAgICB9LFxuICAgIH0sXG59O1xuY29uc3QgaW5jbHVkZTEgPSB7XG4gICAgcGFyYW1ldGVyUGF0aDogW1wib3B0aW9uc1wiLCBcImluY2x1ZGVcIl0sXG4gICAgbWFwcGVyOiB7XG4gICAgICAgIHNlcmlhbGl6ZWROYW1lOiBcImluY2x1ZGVcIixcbiAgICAgICAgeG1sTmFtZTogXCJpbmNsdWRlXCIsXG4gICAgICAgIHhtbEVsZW1lbnROYW1lOiBcIkxpc3RCbG9ic0luY2x1ZGVJdGVtXCIsXG4gICAgICAgIHR5cGU6IHtcbiAgICAgICAgICAgIG5hbWU6IFwiU2VxdWVuY2VcIixcbiAgICAgICAgICAgIGVsZW1lbnQ6IHtcbiAgICAgICAgICAgICAgICB0eXBlOiB7XG4gICAgICAgICAgICAgICAgICAgIG5hbWU6IFwiRW51bVwiLFxuICAgICAgICAgICAgICAgICAgICBhbGxvd2VkVmFsdWVzOiBbXG4gICAgICAgICAgICAgICAgICAgICAgICBcImNvcHlcIixcbiAgICAgICAgICAgICAgICAgICAgICAgIFwiZGVsZXRlZFwiLFxuICAgICAgICAgICAgICAgICAgICAgICAgXCJtZXRhZGF0YVwiLFxuICAgICAgICAgICAgICAgICAgICAgICAgXCJzbmFwc2hvdHNcIixcbiAgICAgICAgICAgICAgICAgICAgICAgIFwidW5jb21taXR0ZWRibG9ic1wiLFxuICAgICAgICAgICAgICAgICAgICAgICAgXCJ2ZXJzaW9uc1wiLFxuICAgICAgICAgICAgICAgICAgICAgICAgXCJ0YWdzXCIsXG4gICAgICAgICAgICAgICAgICAgICAgICBcImltbXV0YWJpbGl0eXBvbGljeVwiLFxuICAgICAgICAgICAgICAgICAgICAgICAgXCJsZWdhbGhvbGRcIixcbiAgICAgICAgICAgICAgICAgICAgICAgIFwiZGVsZXRlZHdpdGh2ZXJzaW9uc1wiLFxuICAgICAgICAgICAgICAgICAgICBdLFxuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICB9LFxuICAgICAgICB9LFxuICAgIH0sXG4gICAgY29sbGVjdGlvbkZvcm1hdDogXCJDU1ZcIixcbn07XG5jb25zdCBkZWxpbWl0ZXIgPSB7XG4gICAgcGFyYW1ldGVyUGF0aDogXCJkZWxpbWl0ZXJcIixcbiAgICBtYXBwZXI6IHtcbiAgICAgICAgc2VyaWFsaXplZE5hbWU6IFwiZGVsaW1pdGVyXCIsXG4gICAgICAgIHJlcXVpcmVkOiB0cnVlLFxuICAgICAgICB4bWxOYW1lOiBcImRlbGltaXRlclwiLFxuICAgICAgICB0eXBlOiB7XG4gICAgICAgICAgICBuYW1lOiBcIlN0cmluZ1wiLFxuICAgICAgICB9LFxuICAgIH0sXG59O1xuY29uc3Qgc25hcHNob3QgPSB7XG4gICAgcGFyYW1ldGVyUGF0aDogW1wib3B0aW9uc1wiLCBcInNuYXBzaG90XCJdLFxuICAgIG1hcHBlcjoge1xuICAgICAgICBzZXJpYWxpemVkTmFtZTogXCJzbmFwc2hvdFwiLFxuICAgICAgICB4bWxOYW1lOiBcInNuYXBzaG90XCIsXG4gICAgICAgIHR5cGU6IHtcbiAgICAgICAgICAgIG5hbWU6IFwiU3RyaW5nXCIsXG4gICAgICAgIH0sXG4gICAgfSxcbn07XG5jb25zdCB2ZXJzaW9uSWQgPSB7XG4gICAgcGFyYW1ldGVyUGF0aDogW1wib3B0aW9uc1wiLCBcInZlcnNpb25JZFwiXSxcbiAgICBtYXBwZXI6IHtcbiAgICAgICAgc2VyaWFsaXplZE5hbWU6IFwidmVyc2lvbmlkXCIsXG4gICAgICAgIHhtbE5hbWU6IFwidmVyc2lvbmlkXCIsXG4gICAgICAgIHR5cGU6IHtcbiAgICAgICAgICAgIG5hbWU6IFwiU3RyaW5nXCIsXG4gICAgICAgIH0sXG4gICAgfSxcbn07XG5jb25zdCByYW5nZSA9IHtcbiAgICBwYXJhbWV0ZXJQYXRoOiBbXCJvcHRpb25zXCIsIFwicmFuZ2VcIl0sXG4gICAgbWFwcGVyOiB7XG4gICAgICAgIHNlcmlhbGl6ZWROYW1lOiBcIngtbXMtcmFuZ2VcIixcbiAgICAgICAgeG1sTmFtZTogXCJ4LW1zLXJhbmdlXCIsXG4gICAgICAgIHR5cGU6IHtcbiAgICAgICAgICAgIG5hbWU6IFwiU3RyaW5nXCIsXG4gICAgICAgIH0sXG4gICAgfSxcbn07XG5jb25zdCByYW5nZUdldENvbnRlbnRNRDUgPSB7XG4gICAgcGFyYW1ldGVyUGF0aDogW1wib3B0aW9uc1wiLCBcInJhbmdlR2V0Q29udGVudE1ENVwiXSxcbiAgICBtYXBwZXI6IHtcbiAgICAgICAgc2VyaWFsaXplZE5hbWU6IFwieC1tcy1yYW5nZS1nZXQtY29udGVudC1tZDVcIixcbiAgICAgICAgeG1sTmFtZTogXCJ4LW1zLXJhbmdlLWdldC1jb250ZW50LW1kNVwiLFxuICAgICAgICB0eXBlOiB7XG4gICAgICAgICAgICBuYW1lOiBcIkJvb2xlYW5cIixcbiAgICAgICAgfSxcbiAgICB9LFxufTtcbmNvbnN0IHJhbmdlR2V0Q29udGVudENSQzY0ID0ge1xuICAgIHBhcmFtZXRlclBhdGg6IFtcIm9wdGlvbnNcIiwgXCJyYW5nZUdldENvbnRlbnRDUkM2NFwiXSxcbiAgICBtYXBwZXI6IHtcbiAgICAgICAgc2VyaWFsaXplZE5hbWU6IFwieC1tcy1yYW5nZS1nZXQtY29udGVudC1jcmM2NFwiLFxuICAgICAgICB4bWxOYW1lOiBcIngtbXMtcmFuZ2UtZ2V0LWNvbnRlbnQtY3JjNjRcIixcbiAgICAgICAgdHlwZToge1xuICAgICAgICAgICAgbmFtZTogXCJCb29sZWFuXCIsXG4gICAgICAgIH0sXG4gICAgfSxcbn07XG5jb25zdCBlbmNyeXB0aW9uS2V5ID0ge1xuICAgIHBhcmFtZXRlclBhdGg6IFtcIm9wdGlvbnNcIiwgXCJjcGtJbmZvXCIsIFwiZW5jcnlwdGlvbktleVwiXSxcbiAgICBtYXBwZXI6IHtcbiAgICAgICAgc2VyaWFsaXplZE5hbWU6IFwieC1tcy1lbmNyeXB0aW9uLWtleVwiLFxuICAgICAgICB4bWxOYW1lOiBcIngtbXMtZW5jcnlwdGlvbi1rZXlcIixcbiAgICAgICAgdHlwZToge1xuICAgICAgICAgICAgbmFtZTogXCJTdHJpbmdcIixcbiAgICAgICAgfSxcbiAgICB9LFxufTtcbmNvbnN0IGVuY3J5cHRpb25LZXlTaGEyNTYgPSB7XG4gICAgcGFyYW1ldGVyUGF0aDogW1wib3B0aW9uc1wiLCBcImNwa0luZm9cIiwgXCJlbmNyeXB0aW9uS2V5U2hhMjU2XCJdLFxuICAgIG1hcHBlcjoge1xuICAgICAgICBzZXJpYWxpemVkTmFtZTogXCJ4LW1zLWVuY3J5cHRpb24ta2V5LXNoYTI1NlwiLFxuICAgICAgICB4bWxOYW1lOiBcIngtbXMtZW5jcnlwdGlvbi1rZXktc2hhMjU2XCIsXG4gICAgICAgIHR5cGU6IHtcbiAgICAgICAgICAgIG5hbWU6IFwiU3RyaW5nXCIsXG4gICAgICAgIH0sXG4gICAgfSxcbn07XG5jb25zdCBlbmNyeXB0aW9uQWxnb3JpdGhtID0ge1xuICAgIHBhcmFtZXRlclBhdGg6IFtcIm9wdGlvbnNcIiwgXCJjcGtJbmZvXCIsIFwiZW5jcnlwdGlvbkFsZ29yaXRobVwiXSxcbiAgICBtYXBwZXI6IHtcbiAgICAgICAgc2VyaWFsaXplZE5hbWU6IFwieC1tcy1lbmNyeXB0aW9uLWFsZ29yaXRobVwiLFxuICAgICAgICB4bWxOYW1lOiBcIngtbXMtZW5jcnlwdGlvbi1hbGdvcml0aG1cIixcbiAgICAgICAgdHlwZToge1xuICAgICAgICAgICAgbmFtZTogXCJTdHJpbmdcIixcbiAgICAgICAgfSxcbiAgICB9LFxufTtcbmNvbnN0IGlmTWF0Y2ggPSB7XG4gICAgcGFyYW1ldGVyUGF0aDogW1wib3B0aW9uc1wiLCBcIm1vZGlmaWVkQWNjZXNzQ29uZGl0aW9uc1wiLCBcImlmTWF0Y2hcIl0sXG4gICAgbWFwcGVyOiB7XG4gICAgICAgIHNlcmlhbGl6ZWROYW1lOiBcIklmLU1hdGNoXCIsXG4gICAgICAgIHhtbE5hbWU6IFwiSWYtTWF0Y2hcIixcbiAgICAgICAgdHlwZToge1xuICAgICAgICAgICAgbmFtZTogXCJTdHJpbmdcIixcbiAgICAgICAgfSxcbiAgICB9LFxufTtcbmNvbnN0IGlmTm9uZU1hdGNoID0ge1xuICAgIHBhcmFtZXRlclBhdGg6IFtcIm9wdGlvbnNcIiwgXCJtb2RpZmllZEFjY2Vzc0NvbmRpdGlvbnNcIiwgXCJpZk5vbmVNYXRjaFwiXSxcbiAgICBtYXBwZXI6IHtcbiAgICAgICAgc2VyaWFsaXplZE5hbWU6IFwiSWYtTm9uZS1NYXRjaFwiLFxuICAgICAgICB4bWxOYW1lOiBcIklmLU5vbmUtTWF0Y2hcIixcbiAgICAgICAgdHlwZToge1xuICAgICAgICAgICAgbmFtZTogXCJTdHJpbmdcIixcbiAgICAgICAgfSxcbiAgICB9LFxufTtcbmNvbnN0IGlmVGFncyA9IHtcbiAgICBwYXJhbWV0ZXJQYXRoOiBbXCJvcHRpb25zXCIsIFwibW9kaWZpZWRBY2Nlc3NDb25kaXRpb25zXCIsIFwiaWZUYWdzXCJdLFxuICAgIG1hcHBlcjoge1xuICAgICAgICBzZXJpYWxpemVkTmFtZTogXCJ4LW1zLWlmLXRhZ3NcIixcbiAgICAgICAgeG1sTmFtZTogXCJ4LW1zLWlmLXRhZ3NcIixcbiAgICAgICAgdHlwZToge1xuICAgICAgICAgICAgbmFtZTogXCJTdHJpbmdcIixcbiAgICAgICAgfSxcbiAgICB9LFxufTtcbmNvbnN0IGRlbGV0ZVNuYXBzaG90cyA9IHtcbiAgICBwYXJhbWV0ZXJQYXRoOiBbXCJvcHRpb25zXCIsIFwiZGVsZXRlU25hcHNob3RzXCJdLFxuICAgIG1hcHBlcjoge1xuICAgICAgICBzZXJpYWxpemVkTmFtZTogXCJ4LW1zLWRlbGV0ZS1zbmFwc2hvdHNcIixcbiAgICAgICAgeG1sTmFtZTogXCJ4LW1zLWRlbGV0ZS1zbmFwc2hvdHNcIixcbiAgICAgICAgdHlwZToge1xuICAgICAgICAgICAgbmFtZTogXCJFbnVtXCIsXG4gICAgICAgICAgICBhbGxvd2VkVmFsdWVzOiBbXCJpbmNsdWRlXCIsIFwib25seVwiXSxcbiAgICAgICAgfSxcbiAgICB9LFxufTtcbmNvbnN0IGJsb2JEZWxldGVUeXBlID0ge1xuICAgIHBhcmFtZXRlclBhdGg6IFtcIm9wdGlvbnNcIiwgXCJibG9iRGVsZXRlVHlwZVwiXSxcbiAgICBtYXBwZXI6IHtcbiAgICAgICAgc2VyaWFsaXplZE5hbWU6IFwiZGVsZXRldHlwZVwiLFxuICAgICAgICB4bWxOYW1lOiBcImRlbGV0ZXR5cGVcIixcbiAgICAgICAgdHlwZToge1xuICAgICAgICAgICAgbmFtZTogXCJTdHJpbmdcIixcbiAgICAgICAgfSxcbiAgICB9LFxufTtcbmNvbnN0IGNvbXAxMSA9IHtcbiAgICBwYXJhbWV0ZXJQYXRoOiBcImNvbXBcIixcbiAgICBtYXBwZXI6IHtcbiAgICAgICAgZGVmYXVsdFZhbHVlOiBcImV4cGlyeVwiLFxuICAgICAgICBpc0NvbnN0YW50OiB0cnVlLFxuICAgICAgICBzZXJpYWxpemVkTmFtZTogXCJjb21wXCIsXG4gICAgICAgIHR5cGU6IHtcbiAgICAgICAgICAgIG5hbWU6IFwiU3RyaW5nXCIsXG4gICAgICAgIH0sXG4gICAgfSxcbn07XG5jb25zdCBleHBpcnlPcHRpb25zID0ge1xuICAgIHBhcmFtZXRlclBhdGg6IFwiZXhwaXJ5T3B0aW9uc1wiLFxuICAgIG1hcHBlcjoge1xuICAgICAgICBzZXJpYWxpemVkTmFtZTogXCJ4LW1zLWV4cGlyeS1vcHRpb25cIixcbiAgICAgICAgcmVxdWlyZWQ6IHRydWUsXG4gICAgICAgIHhtbE5hbWU6IFwieC1tcy1leHBpcnktb3B0aW9uXCIsXG4gICAgICAgIHR5cGU6IHtcbiAgICAgICAgICAgIG5hbWU6IFwiU3RyaW5nXCIsXG4gICAgICAgIH0sXG4gICAgfSxcbn07XG5jb25zdCBleHBpcmVzT24gPSB7XG4gICAgcGFyYW1ldGVyUGF0aDogW1wib3B0aW9uc1wiLCBcImV4cGlyZXNPblwiXSxcbiAgICBtYXBwZXI6IHtcbiAgICAgICAgc2VyaWFsaXplZE5hbWU6IFwieC1tcy1leHBpcnktdGltZVwiLFxuICAgICAgICB4bWxOYW1lOiBcIngtbXMtZXhwaXJ5LXRpbWVcIixcbiAgICAgICAgdHlwZToge1xuICAgICAgICAgICAgbmFtZTogXCJTdHJpbmdcIixcbiAgICAgICAgfSxcbiAgICB9LFxufTtcbmNvbnN0IGJsb2JDYWNoZUNvbnRyb2wgPSB7XG4gICAgcGFyYW1ldGVyUGF0aDogW1wib3B0aW9uc1wiLCBcImJsb2JIdHRwSGVhZGVyc1wiLCBcImJsb2JDYWNoZUNvbnRyb2xcIl0sXG4gICAgbWFwcGVyOiB7XG4gICAgICAgIHNlcmlhbGl6ZWROYW1lOiBcIngtbXMtYmxvYi1jYWNoZS1jb250cm9sXCIsXG4gICAgICAgIHhtbE5hbWU6IFwieC1tcy1ibG9iLWNhY2hlLWNvbnRyb2xcIixcbiAgICAgICAgdHlwZToge1xuICAgICAgICAgICAgbmFtZTogXCJTdHJpbmdcIixcbiAgICAgICAgfSxcbiAgICB9LFxufTtcbmNvbnN0IGJsb2JDb250ZW50VHlwZSA9IHtcbiAgICBwYXJhbWV0ZXJQYXRoOiBbXCJvcHRpb25zXCIsIFwiYmxvYkh0dHBIZWFkZXJzXCIsIFwiYmxvYkNvbnRlbnRUeXBlXCJdLFxuICAgIG1hcHBlcjoge1xuICAgICAgICBzZXJpYWxpemVkTmFtZTogXCJ4LW1zLWJsb2ItY29udGVudC10eXBlXCIsXG4gICAgICAgIHhtbE5hbWU6IFwieC1tcy1ibG9iLWNvbnRlbnQtdHlwZVwiLFxuICAgICAgICB0eXBlOiB7XG4gICAgICAgICAgICBuYW1lOiBcIlN0cmluZ1wiLFxuICAgICAgICB9LFxuICAgIH0sXG59O1xuY29uc3QgYmxvYkNvbnRlbnRNRDUgPSB7XG4gICAgcGFyYW1ldGVyUGF0aDogW1wib3B0aW9uc1wiLCBcImJsb2JIdHRwSGVhZGVyc1wiLCBcImJsb2JDb250ZW50TUQ1XCJdLFxuICAgIG1hcHBlcjoge1xuICAgICAgICBzZXJpYWxpemVkTmFtZTogXCJ4LW1zLWJsb2ItY29udGVudC1tZDVcIixcbiAgICAgICAgeG1sTmFtZTogXCJ4LW1zLWJsb2ItY29udGVudC1tZDVcIixcbiAgICAgICAgdHlwZToge1xuICAgICAgICAgICAgbmFtZTogXCJCeXRlQXJyYXlcIixcbiAgICAgICAgfSxcbiAgICB9LFxufTtcbmNvbnN0IGJsb2JDb250ZW50RW5jb2RpbmcgPSB7XG4gICAgcGFyYW1ldGVyUGF0aDogW1wib3B0aW9uc1wiLCBcImJsb2JIdHRwSGVhZGVyc1wiLCBcImJsb2JDb250ZW50RW5jb2RpbmdcIl0sXG4gICAgbWFwcGVyOiB7XG4gICAgICAgIHNlcmlhbGl6ZWROYW1lOiBcIngtbXMtYmxvYi1jb250ZW50LWVuY29kaW5nXCIsXG4gICAgICAgIHhtbE5hbWU6IFwieC1tcy1ibG9iLWNvbnRlbnQtZW5jb2RpbmdcIixcbiAgICAgICAgdHlwZToge1xuICAgICAgICAgICAgbmFtZTogXCJTdHJpbmdcIixcbiAgICAgICAgfSxcbiAgICB9LFxufTtcbmNvbnN0IGJsb2JDb250ZW50TGFuZ3VhZ2UgPSB7XG4gICAgcGFyYW1ldGVyUGF0aDogW1wib3B0aW9uc1wiLCBcImJsb2JIdHRwSGVhZGVyc1wiLCBcImJsb2JDb250ZW50TGFuZ3VhZ2VcIl0sXG4gICAgbWFwcGVyOiB7XG4gICAgICAgIHNlcmlhbGl6ZWROYW1lOiBcIngtbXMtYmxvYi1jb250ZW50LWxhbmd1YWdlXCIsXG4gICAgICAgIHhtbE5hbWU6IFwieC1tcy1ibG9iLWNvbnRlbnQtbGFuZ3VhZ2VcIixcbiAgICAgICAgdHlwZToge1xuICAgICAgICAgICAgbmFtZTogXCJTdHJpbmdcIixcbiAgICAgICAgfSxcbiAgICB9LFxufTtcbmNvbnN0IGJsb2JDb250ZW50RGlzcG9zaXRpb24gPSB7XG4gICAgcGFyYW1ldGVyUGF0aDogW1wib3B0aW9uc1wiLCBcImJsb2JIdHRwSGVhZGVyc1wiLCBcImJsb2JDb250ZW50RGlzcG9zaXRpb25cIl0sXG4gICAgbWFwcGVyOiB7XG4gICAgICAgIHNlcmlhbGl6ZWROYW1lOiBcIngtbXMtYmxvYi1jb250ZW50LWRpc3Bvc2l0aW9uXCIsXG4gICAgICAgIHhtbE5hbWU6IFwieC1tcy1ibG9iLWNvbnRlbnQtZGlzcG9zaXRpb25cIixcbiAgICAgICAgdHlwZToge1xuICAgICAgICAgICAgbmFtZTogXCJTdHJpbmdcIixcbiAgICAgICAgfSxcbiAgICB9LFxufTtcbmNvbnN0IGNvbXAxMiA9IHtcbiAgICBwYXJhbWV0ZXJQYXRoOiBcImNvbXBcIixcbiAgICBtYXBwZXI6IHtcbiAgICAgICAgZGVmYXVsdFZhbHVlOiBcImltbXV0YWJpbGl0eVBvbGljaWVzXCIsXG4gICAgICAgIGlzQ29uc3RhbnQ6IHRydWUsXG4gICAgICAgIHNlcmlhbGl6ZWROYW1lOiBcImNvbXBcIixcbiAgICAgICAgdHlwZToge1xuICAgICAgICAgICAgbmFtZTogXCJTdHJpbmdcIixcbiAgICAgICAgfSxcbiAgICB9LFxufTtcbmNvbnN0IGltbXV0YWJpbGl0eVBvbGljeUV4cGlyeSA9IHtcbiAgICBwYXJhbWV0ZXJQYXRoOiBbXCJvcHRpb25zXCIsIFwiaW1tdXRhYmlsaXR5UG9saWN5RXhwaXJ5XCJdLFxuICAgIG1hcHBlcjoge1xuICAgICAgICBzZXJpYWxpemVkTmFtZTogXCJ4LW1zLWltbXV0YWJpbGl0eS1wb2xpY3ktdW50aWwtZGF0ZVwiLFxuICAgICAgICB4bWxOYW1lOiBcIngtbXMtaW1tdXRhYmlsaXR5LXBvbGljeS11bnRpbC1kYXRlXCIsXG4gICAgICAgIHR5cGU6IHtcbiAgICAgICAgICAgIG5hbWU6IFwiRGF0ZVRpbWVSZmMxMTIzXCIsXG4gICAgICAgIH0sXG4gICAgfSxcbn07XG5jb25zdCBpbW11dGFiaWxpdHlQb2xpY3lNb2RlID0ge1xuICAgIHBhcmFtZXRlclBhdGg6IFtcIm9wdGlvbnNcIiwgXCJpbW11dGFiaWxpdHlQb2xpY3lNb2RlXCJdLFxuICAgIG1hcHBlcjoge1xuICAgICAgICBzZXJpYWxpemVkTmFtZTogXCJ4LW1zLWltbXV0YWJpbGl0eS1wb2xpY3ktbW9kZVwiLFxuICAgICAgICB4bWxOYW1lOiBcIngtbXMtaW1tdXRhYmlsaXR5LXBvbGljeS1tb2RlXCIsXG4gICAgICAgIHR5cGU6IHtcbiAgICAgICAgICAgIG5hbWU6IFwiRW51bVwiLFxuICAgICAgICAgICAgYWxsb3dlZFZhbHVlczogW1wiTXV0YWJsZVwiLCBcIlVubG9ja2VkXCIsIFwiTG9ja2VkXCJdLFxuICAgICAgICB9LFxuICAgIH0sXG59O1xuY29uc3QgY29tcDEzID0ge1xuICAgIHBhcmFtZXRlclBhdGg6IFwiY29tcFwiLFxuICAgIG1hcHBlcjoge1xuICAgICAgICBkZWZhdWx0VmFsdWU6IFwibGVnYWxob2xkXCIsXG4gICAgICAgIGlzQ29uc3RhbnQ6IHRydWUsXG4gICAgICAgIHNlcmlhbGl6ZWROYW1lOiBcImNvbXBcIixcbiAgICAgICAgdHlwZToge1xuICAgICAgICAgICAgbmFtZTogXCJTdHJpbmdcIixcbiAgICAgICAgfSxcbiAgICB9LFxufTtcbmNvbnN0IGxlZ2FsSG9sZCA9IHtcbiAgICBwYXJhbWV0ZXJQYXRoOiBcImxlZ2FsSG9sZFwiLFxuICAgIG1hcHBlcjoge1xuICAgICAgICBzZXJpYWxpemVkTmFtZTogXCJ4LW1zLWxlZ2FsLWhvbGRcIixcbiAgICAgICAgcmVxdWlyZWQ6IHRydWUsXG4gICAgICAgIHhtbE5hbWU6IFwieC1tcy1sZWdhbC1ob2xkXCIsXG4gICAgICAgIHR5cGU6IHtcbiAgICAgICAgICAgIG5hbWU6IFwiQm9vbGVhblwiLFxuICAgICAgICB9LFxuICAgIH0sXG59O1xuY29uc3QgZW5jcnlwdGlvblNjb3BlID0ge1xuICAgIHBhcmFtZXRlclBhdGg6IFtcIm9wdGlvbnNcIiwgXCJlbmNyeXB0aW9uU2NvcGVcIl0sXG4gICAgbWFwcGVyOiB7XG4gICAgICAgIHNlcmlhbGl6ZWROYW1lOiBcIngtbXMtZW5jcnlwdGlvbi1zY29wZVwiLFxuICAgICAgICB4bWxOYW1lOiBcIngtbXMtZW5jcnlwdGlvbi1zY29wZVwiLFxuICAgICAgICB0eXBlOiB7XG4gICAgICAgICAgICBuYW1lOiBcIlN0cmluZ1wiLFxuICAgICAgICB9LFxuICAgIH0sXG59O1xuY29uc3QgY29tcDE0ID0ge1xuICAgIHBhcmFtZXRlclBhdGg6IFwiY29tcFwiLFxuICAgIG1hcHBlcjoge1xuICAgICAgICBkZWZhdWx0VmFsdWU6IFwic25hcHNob3RcIixcbiAgICAgICAgaXNDb25zdGFudDogdHJ1ZSxcbiAgICAgICAgc2VyaWFsaXplZE5hbWU6IFwiY29tcFwiLFxuICAgICAgICB0eXBlOiB7XG4gICAgICAgICAgICBuYW1lOiBcIlN0cmluZ1wiLFxuICAgICAgICB9LFxuICAgIH0sXG59O1xuY29uc3QgdGllciA9IHtcbiAgICBwYXJhbWV0ZXJQYXRoOiBbXCJvcHRpb25zXCIsIFwidGllclwiXSxcbiAgICBtYXBwZXI6IHtcbiAgICAgICAgc2VyaWFsaXplZE5hbWU6IFwieC1tcy1hY2Nlc3MtdGllclwiLFxuICAgICAgICB4bWxOYW1lOiBcIngtbXMtYWNjZXNzLXRpZXJcIixcbiAgICAgICAgdHlwZToge1xuICAgICAgICAgICAgbmFtZTogXCJFbnVtXCIsXG4gICAgICAgICAgICBhbGxvd2VkVmFsdWVzOiBbXG4gICAgICAgICAgICAgICAgXCJQNFwiLFxuICAgICAgICAgICAgICAgIFwiUDZcIixcbiAgICAgICAgICAgICAgICBcIlAxMFwiLFxuICAgICAgICAgICAgICAgIFwiUDE1XCIsXG4gICAgICAgICAgICAgICAgXCJQMjBcIixcbiAgICAgICAgICAgICAgICBcIlAzMFwiLFxuICAgICAgICAgICAgICAgIFwiUDQwXCIsXG4gICAgICAgICAgICAgICAgXCJQNTBcIixcbiAgICAgICAgICAgICAgICBcIlA2MFwiLFxuICAgICAgICAgICAgICAgIFwiUDcwXCIsXG4gICAgICAgICAgICAgICAgXCJQODBcIixcbiAgICAgICAgICAgICAgICBcIkhvdFwiLFxuICAgICAgICAgICAgICAgIFwiQ29vbFwiLFxuICAgICAgICAgICAgICAgIFwiQXJjaGl2ZVwiLFxuICAgICAgICAgICAgICAgIFwiQ29sZFwiLFxuICAgICAgICAgICAgXSxcbiAgICAgICAgfSxcbiAgICB9LFxufTtcbmNvbnN0IHJlaHlkcmF0ZVByaW9yaXR5ID0ge1xuICAgIHBhcmFtZXRlclBhdGg6IFtcIm9wdGlvbnNcIiwgXCJyZWh5ZHJhdGVQcmlvcml0eVwiXSxcbiAgICBtYXBwZXI6IHtcbiAgICAgICAgc2VyaWFsaXplZE5hbWU6IFwieC1tcy1yZWh5ZHJhdGUtcHJpb3JpdHlcIixcbiAgICAgICAgeG1sTmFtZTogXCJ4LW1zLXJlaHlkcmF0ZS1wcmlvcml0eVwiLFxuICAgICAgICB0eXBlOiB7XG4gICAgICAgICAgICBuYW1lOiBcIkVudW1cIixcbiAgICAgICAgICAgIGFsbG93ZWRWYWx1ZXM6IFtcIkhpZ2hcIiwgXCJTdGFuZGFyZFwiXSxcbiAgICAgICAgfSxcbiAgICB9LFxufTtcbmNvbnN0IHNvdXJjZUlmTW9kaWZpZWRTaW5jZSA9IHtcbiAgICBwYXJhbWV0ZXJQYXRoOiBbXG4gICAgICAgIFwib3B0aW9uc1wiLFxuICAgICAgICBcInNvdXJjZU1vZGlmaWVkQWNjZXNzQ29uZGl0aW9uc1wiLFxuICAgICAgICBcInNvdXJjZUlmTW9kaWZpZWRTaW5jZVwiLFxuICAgIF0sXG4gICAgbWFwcGVyOiB7XG4gICAgICAgIHNlcmlhbGl6ZWROYW1lOiBcIngtbXMtc291cmNlLWlmLW1vZGlmaWVkLXNpbmNlXCIsXG4gICAgICAgIHhtbE5hbWU6IFwieC1tcy1zb3VyY2UtaWYtbW9kaWZpZWQtc2luY2VcIixcbiAgICAgICAgdHlwZToge1xuICAgICAgICAgICAgbmFtZTogXCJEYXRlVGltZVJmYzExMjNcIixcbiAgICAgICAgfSxcbiAgICB9LFxufTtcbmNvbnN0IHNvdXJjZUlmVW5tb2RpZmllZFNpbmNlID0ge1xuICAgIHBhcmFtZXRlclBhdGg6IFtcbiAgICAgICAgXCJvcHRpb25zXCIsXG4gICAgICAgIFwic291cmNlTW9kaWZpZWRBY2Nlc3NDb25kaXRpb25zXCIsXG4gICAgICAgIFwic291cmNlSWZVbm1vZGlmaWVkU2luY2VcIixcbiAgICBdLFxuICAgIG1hcHBlcjoge1xuICAgICAgICBzZXJpYWxpemVkTmFtZTogXCJ4LW1zLXNvdXJjZS1pZi11bm1vZGlmaWVkLXNpbmNlXCIsXG4gICAgICAgIHhtbE5hbWU6IFwieC1tcy1zb3VyY2UtaWYtdW5tb2RpZmllZC1zaW5jZVwiLFxuICAgICAgICB0eXBlOiB7XG4gICAgICAgICAgICBuYW1lOiBcIkRhdGVUaW1lUmZjMTEyM1wiLFxuICAgICAgICB9LFxuICAgIH0sXG59O1xuY29uc3Qgc291cmNlSWZNYXRjaCA9IHtcbiAgICBwYXJhbWV0ZXJQYXRoOiBbXCJvcHRpb25zXCIsIFwic291cmNlTW9kaWZpZWRBY2Nlc3NDb25kaXRpb25zXCIsIFwic291cmNlSWZNYXRjaFwiXSxcbiAgICBtYXBwZXI6IHtcbiAgICAgICAgc2VyaWFsaXplZE5hbWU6IFwieC1tcy1zb3VyY2UtaWYtbWF0Y2hcIixcbiAgICAgICAgeG1sTmFtZTogXCJ4LW1zLXNvdXJjZS1pZi1tYXRjaFwiLFxuICAgICAgICB0eXBlOiB7XG4gICAgICAgICAgICBuYW1lOiBcIlN0cmluZ1wiLFxuICAgICAgICB9LFxuICAgIH0sXG59O1xuY29uc3Qgc291cmNlSWZOb25lTWF0Y2ggPSB7XG4gICAgcGFyYW1ldGVyUGF0aDogW1xuICAgICAgICBcIm9wdGlvbnNcIixcbiAgICAgICAgXCJzb3VyY2VNb2RpZmllZEFjY2Vzc0NvbmRpdGlvbnNcIixcbiAgICAgICAgXCJzb3VyY2VJZk5vbmVNYXRjaFwiLFxuICAgIF0sXG4gICAgbWFwcGVyOiB7XG4gICAgICAgIHNlcmlhbGl6ZWROYW1lOiBcIngtbXMtc291cmNlLWlmLW5vbmUtbWF0Y2hcIixcbiAgICAgICAgeG1sTmFtZTogXCJ4LW1zLXNvdXJjZS1pZi1ub25lLW1hdGNoXCIsXG4gICAgICAgIHR5cGU6IHtcbiAgICAgICAgICAgIG5hbWU6IFwiU3RyaW5nXCIsXG4gICAgICAgIH0sXG4gICAgfSxcbn07XG5jb25zdCBzb3VyY2VJZlRhZ3MgPSB7XG4gICAgcGFyYW1ldGVyUGF0aDogW1wib3B0aW9uc1wiLCBcInNvdXJjZU1vZGlmaWVkQWNjZXNzQ29uZGl0aW9uc1wiLCBcInNvdXJjZUlmVGFnc1wiXSxcbiAgICBtYXBwZXI6IHtcbiAgICAgICAgc2VyaWFsaXplZE5hbWU6IFwieC1tcy1zb3VyY2UtaWYtdGFnc1wiLFxuICAgICAgICB4bWxOYW1lOiBcIngtbXMtc291cmNlLWlmLXRhZ3NcIixcbiAgICAgICAgdHlwZToge1xuICAgICAgICAgICAgbmFtZTogXCJTdHJpbmdcIixcbiAgICAgICAgfSxcbiAgICB9LFxufTtcbmNvbnN0IGNvcHlTb3VyY2UgPSB7XG4gICAgcGFyYW1ldGVyUGF0aDogXCJjb3B5U291cmNlXCIsXG4gICAgbWFwcGVyOiB7XG4gICAgICAgIHNlcmlhbGl6ZWROYW1lOiBcIngtbXMtY29weS1zb3VyY2VcIixcbiAgICAgICAgcmVxdWlyZWQ6IHRydWUsXG4gICAgICAgIHhtbE5hbWU6IFwieC1tcy1jb3B5LXNvdXJjZVwiLFxuICAgICAgICB0eXBlOiB7XG4gICAgICAgICAgICBuYW1lOiBcIlN0cmluZ1wiLFxuICAgICAgICB9LFxuICAgIH0sXG59O1xuY29uc3QgYmxvYlRhZ3NTdHJpbmcgPSB7XG4gICAgcGFyYW1ldGVyUGF0aDogW1wib3B0aW9uc1wiLCBcImJsb2JUYWdzU3RyaW5nXCJdLFxuICAgIG1hcHBlcjoge1xuICAgICAgICBzZXJpYWxpemVkTmFtZTogXCJ4LW1zLXRhZ3NcIixcbiAgICAgICAgeG1sTmFtZTogXCJ4LW1zLXRhZ3NcIixcbiAgICAgICAgdHlwZToge1xuICAgICAgICAgICAgbmFtZTogXCJTdHJpbmdcIixcbiAgICAgICAgfSxcbiAgICB9LFxufTtcbmNvbnN0IHNlYWxCbG9iID0ge1xuICAgIHBhcmFtZXRlclBhdGg6IFtcIm9wdGlvbnNcIiwgXCJzZWFsQmxvYlwiXSxcbiAgICBtYXBwZXI6IHtcbiAgICAgICAgc2VyaWFsaXplZE5hbWU6IFwieC1tcy1zZWFsLWJsb2JcIixcbiAgICAgICAgeG1sTmFtZTogXCJ4LW1zLXNlYWwtYmxvYlwiLFxuICAgICAgICB0eXBlOiB7XG4gICAgICAgICAgICBuYW1lOiBcIkJvb2xlYW5cIixcbiAgICAgICAgfSxcbiAgICB9LFxufTtcbmNvbnN0IGxlZ2FsSG9sZDEgPSB7XG4gICAgcGFyYW1ldGVyUGF0aDogW1wib3B0aW9uc1wiLCBcImxlZ2FsSG9sZFwiXSxcbiAgICBtYXBwZXI6IHtcbiAgICAgICAgc2VyaWFsaXplZE5hbWU6IFwieC1tcy1sZWdhbC1ob2xkXCIsXG4gICAgICAgIHhtbE5hbWU6IFwieC1tcy1sZWdhbC1ob2xkXCIsXG4gICAgICAgIHR5cGU6IHtcbiAgICAgICAgICAgIG5hbWU6IFwiQm9vbGVhblwiLFxuICAgICAgICB9LFxuICAgIH0sXG59O1xuY29uc3QgeE1zUmVxdWlyZXNTeW5jID0ge1xuICAgIHBhcmFtZXRlclBhdGg6IFwieE1zUmVxdWlyZXNTeW5jXCIsXG4gICAgbWFwcGVyOiB7XG4gICAgICAgIGRlZmF1bHRWYWx1ZTogXCJ0cnVlXCIsXG4gICAgICAgIGlzQ29uc3RhbnQ6IHRydWUsXG4gICAgICAgIHNlcmlhbGl6ZWROYW1lOiBcIngtbXMtcmVxdWlyZXMtc3luY1wiLFxuICAgICAgICB0eXBlOiB7XG4gICAgICAgICAgICBuYW1lOiBcIlN0cmluZ1wiLFxuICAgICAgICB9LFxuICAgIH0sXG59O1xuY29uc3Qgc291cmNlQ29udGVudE1ENSA9IHtcbiAgICBwYXJhbWV0ZXJQYXRoOiBbXCJvcHRpb25zXCIsIFwic291cmNlQ29udGVudE1ENVwiXSxcbiAgICBtYXBwZXI6IHtcbiAgICAgICAgc2VyaWFsaXplZE5hbWU6IFwieC1tcy1zb3VyY2UtY29udGVudC1tZDVcIixcbiAgICAgICAgeG1sTmFtZTogXCJ4LW1zLXNvdXJjZS1jb250ZW50LW1kNVwiLFxuICAgICAgICB0eXBlOiB7XG4gICAgICAgICAgICBuYW1lOiBcIkJ5dGVBcnJheVwiLFxuICAgICAgICB9LFxuICAgIH0sXG59O1xuY29uc3QgY29weVNvdXJjZUF1dGhvcml6YXRpb24gPSB7XG4gICAgcGFyYW1ldGVyUGF0aDogW1wib3B0aW9uc1wiLCBcImNvcHlTb3VyY2VBdXRob3JpemF0aW9uXCJdLFxuICAgIG1hcHBlcjoge1xuICAgICAgICBzZXJpYWxpemVkTmFtZTogXCJ4LW1zLWNvcHktc291cmNlLWF1dGhvcml6YXRpb25cIixcbiAgICAgICAgeG1sTmFtZTogXCJ4LW1zLWNvcHktc291cmNlLWF1dGhvcml6YXRpb25cIixcbiAgICAgICAgdHlwZToge1xuICAgICAgICAgICAgbmFtZTogXCJTdHJpbmdcIixcbiAgICAgICAgfSxcbiAgICB9LFxufTtcbmNvbnN0IGNvcHlTb3VyY2VUYWdzID0ge1xuICAgIHBhcmFtZXRlclBhdGg6IFtcIm9wdGlvbnNcIiwgXCJjb3B5U291cmNlVGFnc1wiXSxcbiAgICBtYXBwZXI6IHtcbiAgICAgICAgc2VyaWFsaXplZE5hbWU6IFwieC1tcy1jb3B5LXNvdXJjZS10YWctb3B0aW9uXCIsXG4gICAgICAgIHhtbE5hbWU6IFwieC1tcy1jb3B5LXNvdXJjZS10YWctb3B0aW9uXCIsXG4gICAgICAgIHR5cGU6IHtcbiAgICAgICAgICAgIG5hbWU6IFwiRW51bVwiLFxuICAgICAgICAgICAgYWxsb3dlZFZhbHVlczogW1wiUkVQTEFDRVwiLCBcIkNPUFlcIl0sXG4gICAgICAgIH0sXG4gICAgfSxcbn07XG5jb25zdCBjb21wMTUgPSB7XG4gICAgcGFyYW1ldGVyUGF0aDogXCJjb21wXCIsXG4gICAgbWFwcGVyOiB7XG4gICAgICAgIGRlZmF1bHRWYWx1ZTogXCJjb3B5XCIsXG4gICAgICAgIGlzQ29uc3RhbnQ6IHRydWUsXG4gICAgICAgIHNlcmlhbGl6ZWROYW1lOiBcImNvbXBcIixcbiAgICAgICAgdHlwZToge1xuICAgICAgICAgICAgbmFtZTogXCJTdHJpbmdcIixcbiAgICAgICAgfSxcbiAgICB9LFxufTtcbmNvbnN0IGNvcHlBY3Rpb25BYm9ydENvbnN0YW50ID0ge1xuICAgIHBhcmFtZXRlclBhdGg6IFwiY29weUFjdGlvbkFib3J0Q29uc3RhbnRcIixcbiAgICBtYXBwZXI6IHtcbiAgICAgICAgZGVmYXVsdFZhbHVlOiBcImFib3J0XCIsXG4gICAgICAgIGlzQ29uc3RhbnQ6IHRydWUsXG4gICAgICAgIHNlcmlhbGl6ZWROYW1lOiBcIngtbXMtY29weS1hY3Rpb25cIixcbiAgICAgICAgdHlwZToge1xuICAgICAgICAgICAgbmFtZTogXCJTdHJpbmdcIixcbiAgICAgICAgfSxcbiAgICB9LFxufTtcbmNvbnN0IGNvcHlJZCA9IHtcbiAgICBwYXJhbWV0ZXJQYXRoOiBcImNvcHlJZFwiLFxuICAgIG1hcHBlcjoge1xuICAgICAgICBzZXJpYWxpemVkTmFtZTogXCJjb3B5aWRcIixcbiAgICAgICAgcmVxdWlyZWQ6IHRydWUsXG4gICAgICAgIHhtbE5hbWU6IFwiY29weWlkXCIsXG4gICAgICAgIHR5cGU6IHtcbiAgICAgICAgICAgIG5hbWU6IFwiU3RyaW5nXCIsXG4gICAgICAgIH0sXG4gICAgfSxcbn07XG5jb25zdCBjb21wMTYgPSB7XG4gICAgcGFyYW1ldGVyUGF0aDogXCJjb21wXCIsXG4gICAgbWFwcGVyOiB7XG4gICAgICAgIGRlZmF1bHRWYWx1ZTogXCJ0aWVyXCIsXG4gICAgICAgIGlzQ29uc3RhbnQ6IHRydWUsXG4gICAgICAgIHNlcmlhbGl6ZWROYW1lOiBcImNvbXBcIixcbiAgICAgICAgdHlwZToge1xuICAgICAgICAgICAgbmFtZTogXCJTdHJpbmdcIixcbiAgICAgICAgfSxcbiAgICB9LFxufTtcbmNvbnN0IHRpZXIxID0ge1xuICAgIHBhcmFtZXRlclBhdGg6IFwidGllclwiLFxuICAgIG1hcHBlcjoge1xuICAgICAgICBzZXJpYWxpemVkTmFtZTogXCJ4LW1zLWFjY2Vzcy10aWVyXCIsXG4gICAgICAgIHJlcXVpcmVkOiB0cnVlLFxuICAgICAgICB4bWxOYW1lOiBcIngtbXMtYWNjZXNzLXRpZXJcIixcbiAgICAgICAgdHlwZToge1xuICAgICAgICAgICAgbmFtZTogXCJFbnVtXCIsXG4gICAgICAgICAgICBhbGxvd2VkVmFsdWVzOiBbXG4gICAgICAgICAgICAgICAgXCJQNFwiLFxuICAgICAgICAgICAgICAgIFwiUDZcIixcbiAgICAgICAgICAgICAgICBcIlAxMFwiLFxuICAgICAgICAgICAgICAgIFwiUDE1XCIsXG4gICAgICAgICAgICAgICAgXCJQMjBcIixcbiAgICAgICAgICAgICAgICBcIlAzMFwiLFxuICAgICAgICAgICAgICAgIFwiUDQwXCIsXG4gICAgICAgICAgICAgICAgXCJQNTBcIixcbiAgICAgICAgICAgICAgICBcIlA2MFwiLFxuICAgICAgICAgICAgICAgIFwiUDcwXCIsXG4gICAgICAgICAgICAgICAgXCJQODBcIixcbiAgICAgICAgICAgICAgICBcIkhvdFwiLFxuICAgICAgICAgICAgICAgIFwiQ29vbFwiLFxuICAgICAgICAgICAgICAgIFwiQXJjaGl2ZVwiLFxuICAgICAgICAgICAgICAgIFwiQ29sZFwiLFxuICAgICAgICAgICAgXSxcbiAgICAgICAgfSxcbiAgICB9LFxufTtcbmNvbnN0IHF1ZXJ5UmVxdWVzdCA9IHtcbiAgICBwYXJhbWV0ZXJQYXRoOiBbXCJvcHRpb25zXCIsIFwicXVlcnlSZXF1ZXN0XCJdLFxuICAgIG1hcHBlcjogUXVlcnlSZXF1ZXN0LFxufTtcbmNvbnN0IGNvbXAxNyA9IHtcbiAgICBwYXJhbWV0ZXJQYXRoOiBcImNvbXBcIixcbiAgICBtYXBwZXI6IHtcbiAgICAgICAgZGVmYXVsdFZhbHVlOiBcInF1ZXJ5XCIsXG4gICAgICAgIGlzQ29uc3RhbnQ6IHRydWUsXG4gICAgICAgIHNlcmlhbGl6ZWROYW1lOiBcImNvbXBcIixcbiAgICAgICAgdHlwZToge1xuICAgICAgICAgICAgbmFtZTogXCJTdHJpbmdcIixcbiAgICAgICAgfSxcbiAgICB9LFxufTtcbmNvbnN0IGNvbXAxOCA9IHtcbiAgICBwYXJhbWV0ZXJQYXRoOiBcImNvbXBcIixcbiAgICBtYXBwZXI6IHtcbiAgICAgICAgZGVmYXVsdFZhbHVlOiBcInRhZ3NcIixcbiAgICAgICAgaXNDb25zdGFudDogdHJ1ZSxcbiAgICAgICAgc2VyaWFsaXplZE5hbWU6IFwiY29tcFwiLFxuICAgICAgICB0eXBlOiB7XG4gICAgICAgICAgICBuYW1lOiBcIlN0cmluZ1wiLFxuICAgICAgICB9LFxuICAgIH0sXG59O1xuY29uc3QgdGFncyA9IHtcbiAgICBwYXJhbWV0ZXJQYXRoOiBbXCJvcHRpb25zXCIsIFwidGFnc1wiXSxcbiAgICBtYXBwZXI6IEJsb2JUYWdzLFxufTtcbmNvbnN0IHRyYW5zYWN0aW9uYWxDb250ZW50TUQ1ID0ge1xuICAgIHBhcmFtZXRlclBhdGg6IFtcIm9wdGlvbnNcIiwgXCJ0cmFuc2FjdGlvbmFsQ29udGVudE1ENVwiXSxcbiAgICBtYXBwZXI6IHtcbiAgICAgICAgc2VyaWFsaXplZE5hbWU6IFwiQ29udGVudC1NRDVcIixcbiAgICAgICAgeG1sTmFtZTogXCJDb250ZW50LU1ENVwiLFxuICAgICAgICB0eXBlOiB7XG4gICAgICAgICAgICBuYW1lOiBcIkJ5dGVBcnJheVwiLFxuICAgICAgICB9LFxuICAgIH0sXG59O1xuY29uc3QgdHJhbnNhY3Rpb25hbENvbnRlbnRDcmM2NCA9IHtcbiAgICBwYXJhbWV0ZXJQYXRoOiBbXCJvcHRpb25zXCIsIFwidHJhbnNhY3Rpb25hbENvbnRlbnRDcmM2NFwiXSxcbiAgICBtYXBwZXI6IHtcbiAgICAgICAgc2VyaWFsaXplZE5hbWU6IFwieC1tcy1jb250ZW50LWNyYzY0XCIsXG4gICAgICAgIHhtbE5hbWU6IFwieC1tcy1jb250ZW50LWNyYzY0XCIsXG4gICAgICAgIHR5cGU6IHtcbiAgICAgICAgICAgIG5hbWU6IFwiQnl0ZUFycmF5XCIsXG4gICAgICAgIH0sXG4gICAgfSxcbn07XG5jb25zdCBibG9iVHlwZSA9IHtcbiAgICBwYXJhbWV0ZXJQYXRoOiBcImJsb2JUeXBlXCIsXG4gICAgbWFwcGVyOiB7XG4gICAgICAgIGRlZmF1bHRWYWx1ZTogXCJQYWdlQmxvYlwiLFxuICAgICAgICBpc0NvbnN0YW50OiB0cnVlLFxuICAgICAgICBzZXJpYWxpemVkTmFtZTogXCJ4LW1zLWJsb2ItdHlwZVwiLFxuICAgICAgICB0eXBlOiB7XG4gICAgICAgICAgICBuYW1lOiBcIlN0cmluZ1wiLFxuICAgICAgICB9LFxuICAgIH0sXG59O1xuY29uc3QgYmxvYkNvbnRlbnRMZW5ndGggPSB7XG4gICAgcGFyYW1ldGVyUGF0aDogXCJibG9iQ29udGVudExlbmd0aFwiLFxuICAgIG1hcHBlcjoge1xuICAgICAgICBzZXJpYWxpemVkTmFtZTogXCJ4LW1zLWJsb2ItY29udGVudC1sZW5ndGhcIixcbiAgICAgICAgcmVxdWlyZWQ6IHRydWUsXG4gICAgICAgIHhtbE5hbWU6IFwieC1tcy1ibG9iLWNvbnRlbnQtbGVuZ3RoXCIsXG4gICAgICAgIHR5cGU6IHtcbiAgICAgICAgICAgIG5hbWU6IFwiTnVtYmVyXCIsXG4gICAgICAgIH0sXG4gICAgfSxcbn07XG5jb25zdCBibG9iU2VxdWVuY2VOdW1iZXIgPSB7XG4gICAgcGFyYW1ldGVyUGF0aDogW1wib3B0aW9uc1wiLCBcImJsb2JTZXF1ZW5jZU51bWJlclwiXSxcbiAgICBtYXBwZXI6IHtcbiAgICAgICAgZGVmYXVsdFZhbHVlOiAwLFxuICAgICAgICBzZXJpYWxpemVkTmFtZTogXCJ4LW1zLWJsb2Itc2VxdWVuY2UtbnVtYmVyXCIsXG4gICAgICAgIHhtbE5hbWU6IFwieC1tcy1ibG9iLXNlcXVlbmNlLW51bWJlclwiLFxuICAgICAgICB0eXBlOiB7XG4gICAgICAgICAgICBuYW1lOiBcIk51bWJlclwiLFxuICAgICAgICB9LFxuICAgIH0sXG59O1xuY29uc3QgY29udGVudFR5cGUxID0ge1xuICAgIHBhcmFtZXRlclBhdGg6IFtcIm9wdGlvbnNcIiwgXCJjb250ZW50VHlwZVwiXSxcbiAgICBtYXBwZXI6IHtcbiAgICAgICAgZGVmYXVsdFZhbHVlOiBcImFwcGxpY2F0aW9uL29jdGV0LXN0cmVhbVwiLFxuICAgICAgICBpc0NvbnN0YW50OiB0cnVlLFxuICAgICAgICBzZXJpYWxpemVkTmFtZTogXCJDb250ZW50LVR5cGVcIixcbiAgICAgICAgdHlwZToge1xuICAgICAgICAgICAgbmFtZTogXCJTdHJpbmdcIixcbiAgICAgICAgfSxcbiAgICB9LFxufTtcbmNvbnN0IGJvZHkxID0ge1xuICAgIHBhcmFtZXRlclBhdGg6IFwiYm9keVwiLFxuICAgIG1hcHBlcjoge1xuICAgICAgICBzZXJpYWxpemVkTmFtZTogXCJib2R5XCIsXG4gICAgICAgIHJlcXVpcmVkOiB0cnVlLFxuICAgICAgICB4bWxOYW1lOiBcImJvZHlcIixcbiAgICAgICAgdHlwZToge1xuICAgICAgICAgICAgbmFtZTogXCJTdHJlYW1cIixcbiAgICAgICAgfSxcbiAgICB9LFxufTtcbmNvbnN0IGFjY2VwdDIgPSB7XG4gICAgcGFyYW1ldGVyUGF0aDogXCJhY2NlcHRcIixcbiAgICBtYXBwZXI6IHtcbiAgICAgICAgZGVmYXVsdFZhbHVlOiBcImFwcGxpY2F0aW9uL3htbFwiLFxuICAgICAgICBpc0NvbnN0YW50OiB0cnVlLFxuICAgICAgICBzZXJpYWxpemVkTmFtZTogXCJBY2NlcHRcIixcbiAgICAgICAgdHlwZToge1xuICAgICAgICAgICAgbmFtZTogXCJTdHJpbmdcIixcbiAgICAgICAgfSxcbiAgICB9LFxufTtcbmNvbnN0IGNvbXAxOSA9IHtcbiAgICBwYXJhbWV0ZXJQYXRoOiBcImNvbXBcIixcbiAgICBtYXBwZXI6IHtcbiAgICAgICAgZGVmYXVsdFZhbHVlOiBcInBhZ2VcIixcbiAgICAgICAgaXNDb25zdGFudDogdHJ1ZSxcbiAgICAgICAgc2VyaWFsaXplZE5hbWU6IFwiY29tcFwiLFxuICAgICAgICB0eXBlOiB7XG4gICAgICAgICAgICBuYW1lOiBcIlN0cmluZ1wiLFxuICAgICAgICB9LFxuICAgIH0sXG59O1xuY29uc3QgcGFnZVdyaXRlID0ge1xuICAgIHBhcmFtZXRlclBhdGg6IFwicGFnZVdyaXRlXCIsXG4gICAgbWFwcGVyOiB7XG4gICAgICAgIGRlZmF1bHRWYWx1ZTogXCJ1cGRhdGVcIixcbiAgICAgICAgaXNDb25zdGFudDogdHJ1ZSxcbiAgICAgICAgc2VyaWFsaXplZE5hbWU6IFwieC1tcy1wYWdlLXdyaXRlXCIsXG4gICAgICAgIHR5cGU6IHtcbiAgICAgICAgICAgIG5hbWU6IFwiU3RyaW5nXCIsXG4gICAgICAgIH0sXG4gICAgfSxcbn07XG5jb25zdCBpZlNlcXVlbmNlTnVtYmVyTGVzc1RoYW5PckVxdWFsVG8gPSB7XG4gICAgcGFyYW1ldGVyUGF0aDogW1xuICAgICAgICBcIm9wdGlvbnNcIixcbiAgICAgICAgXCJzZXF1ZW5jZU51bWJlckFjY2Vzc0NvbmRpdGlvbnNcIixcbiAgICAgICAgXCJpZlNlcXVlbmNlTnVtYmVyTGVzc1RoYW5PckVxdWFsVG9cIixcbiAgICBdLFxuICAgIG1hcHBlcjoge1xuICAgICAgICBzZXJpYWxpemVkTmFtZTogXCJ4LW1zLWlmLXNlcXVlbmNlLW51bWJlci1sZVwiLFxuICAgICAgICB4bWxOYW1lOiBcIngtbXMtaWYtc2VxdWVuY2UtbnVtYmVyLWxlXCIsXG4gICAgICAgIHR5cGU6IHtcbiAgICAgICAgICAgIG5hbWU6IFwiTnVtYmVyXCIsXG4gICAgICAgIH0sXG4gICAgfSxcbn07XG5jb25zdCBpZlNlcXVlbmNlTnVtYmVyTGVzc1RoYW4gPSB7XG4gICAgcGFyYW1ldGVyUGF0aDogW1xuICAgICAgICBcIm9wdGlvbnNcIixcbiAgICAgICAgXCJzZXF1ZW5jZU51bWJlckFjY2Vzc0NvbmRpdGlvbnNcIixcbiAgICAgICAgXCJpZlNlcXVlbmNlTnVtYmVyTGVzc1RoYW5cIixcbiAgICBdLFxuICAgIG1hcHBlcjoge1xuICAgICAgICBzZXJpYWxpemVkTmFtZTogXCJ4LW1zLWlmLXNlcXVlbmNlLW51bWJlci1sdFwiLFxuICAgICAgICB4bWxOYW1lOiBcIngtbXMtaWYtc2VxdWVuY2UtbnVtYmVyLWx0XCIsXG4gICAgICAgIHR5cGU6IHtcbiAgICAgICAgICAgIG5hbWU6IFwiTnVtYmVyXCIsXG4gICAgICAgIH0sXG4gICAgfSxcbn07XG5jb25zdCBpZlNlcXVlbmNlTnVtYmVyRXF1YWxUbyA9IHtcbiAgICBwYXJhbWV0ZXJQYXRoOiBbXG4gICAgICAgIFwib3B0aW9uc1wiLFxuICAgICAgICBcInNlcXVlbmNlTnVtYmVyQWNjZXNzQ29uZGl0aW9uc1wiLFxuICAgICAgICBcImlmU2VxdWVuY2VOdW1iZXJFcXVhbFRvXCIsXG4gICAgXSxcbiAgICBtYXBwZXI6IHtcbiAgICAgICAgc2VyaWFsaXplZE5hbWU6IFwieC1tcy1pZi1zZXF1ZW5jZS1udW1iZXItZXFcIixcbiAgICAgICAgeG1sTmFtZTogXCJ4LW1zLWlmLXNlcXVlbmNlLW51bWJlci1lcVwiLFxuICAgICAgICB0eXBlOiB7XG4gICAgICAgICAgICBuYW1lOiBcIk51bWJlclwiLFxuICAgICAgICB9LFxuICAgIH0sXG59O1xuY29uc3QgcGFnZVdyaXRlMSA9IHtcbiAgICBwYXJhbWV0ZXJQYXRoOiBcInBhZ2VXcml0ZVwiLFxuICAgIG1hcHBlcjoge1xuICAgICAgICBkZWZhdWx0VmFsdWU6IFwiY2xlYXJcIixcbiAgICAgICAgaXNDb25zdGFudDogdHJ1ZSxcbiAgICAgICAgc2VyaWFsaXplZE5hbWU6IFwieC1tcy1wYWdlLXdyaXRlXCIsXG4gICAgICAgIHR5cGU6IHtcbiAgICAgICAgICAgIG5hbWU6IFwiU3RyaW5nXCIsXG4gICAgICAgIH0sXG4gICAgfSxcbn07XG5jb25zdCBzb3VyY2VVcmwgPSB7XG4gICAgcGFyYW1ldGVyUGF0aDogXCJzb3VyY2VVcmxcIixcbiAgICBtYXBwZXI6IHtcbiAgICAgICAgc2VyaWFsaXplZE5hbWU6IFwieC1tcy1jb3B5LXNvdXJjZVwiLFxuICAgICAgICByZXF1aXJlZDogdHJ1ZSxcbiAgICAgICAgeG1sTmFtZTogXCJ4LW1zLWNvcHktc291cmNlXCIsXG4gICAgICAgIHR5cGU6IHtcbiAgICAgICAgICAgIG5hbWU6IFwiU3RyaW5nXCIsXG4gICAgICAgIH0sXG4gICAgfSxcbn07XG5jb25zdCBzb3VyY2VSYW5nZSA9IHtcbiAgICBwYXJhbWV0ZXJQYXRoOiBcInNvdXJjZVJhbmdlXCIsXG4gICAgbWFwcGVyOiB7XG4gICAgICAgIHNlcmlhbGl6ZWROYW1lOiBcIngtbXMtc291cmNlLXJhbmdlXCIsXG4gICAgICAgIHJlcXVpcmVkOiB0cnVlLFxuICAgICAgICB4bWxOYW1lOiBcIngtbXMtc291cmNlLXJhbmdlXCIsXG4gICAgICAgIHR5cGU6IHtcbiAgICAgICAgICAgIG5hbWU6IFwiU3RyaW5nXCIsXG4gICAgICAgIH0sXG4gICAgfSxcbn07XG5jb25zdCBzb3VyY2VDb250ZW50Q3JjNjQgPSB7XG4gICAgcGFyYW1ldGVyUGF0aDogW1wib3B0aW9uc1wiLCBcInNvdXJjZUNvbnRlbnRDcmM2NFwiXSxcbiAgICBtYXBwZXI6IHtcbiAgICAgICAgc2VyaWFsaXplZE5hbWU6IFwieC1tcy1zb3VyY2UtY29udGVudC1jcmM2NFwiLFxuICAgICAgICB4bWxOYW1lOiBcIngtbXMtc291cmNlLWNvbnRlbnQtY3JjNjRcIixcbiAgICAgICAgdHlwZToge1xuICAgICAgICAgICAgbmFtZTogXCJCeXRlQXJyYXlcIixcbiAgICAgICAgfSxcbiAgICB9LFxufTtcbmNvbnN0IHJhbmdlMSA9IHtcbiAgICBwYXJhbWV0ZXJQYXRoOiBcInJhbmdlXCIsXG4gICAgbWFwcGVyOiB7XG4gICAgICAgIHNlcmlhbGl6ZWROYW1lOiBcIngtbXMtcmFuZ2VcIixcbiAgICAgICAgcmVxdWlyZWQ6IHRydWUsXG4gICAgICAgIHhtbE5hbWU6IFwieC1tcy1yYW5nZVwiLFxuICAgICAgICB0eXBlOiB7XG4gICAgICAgICAgICBuYW1lOiBcIlN0cmluZ1wiLFxuICAgICAgICB9LFxuICAgIH0sXG59O1xuY29uc3QgY29tcDIwID0ge1xuICAgIHBhcmFtZXRlclBhdGg6IFwiY29tcFwiLFxuICAgIG1hcHBlcjoge1xuICAgICAgICBkZWZhdWx0VmFsdWU6IFwicGFnZWxpc3RcIixcbiAgICAgICAgaXNDb25zdGFudDogdHJ1ZSxcbiAgICAgICAgc2VyaWFsaXplZE5hbWU6IFwiY29tcFwiLFxuICAgICAgICB0eXBlOiB7XG4gICAgICAgICAgICBuYW1lOiBcIlN0cmluZ1wiLFxuICAgICAgICB9LFxuICAgIH0sXG59O1xuY29uc3QgcHJldnNuYXBzaG90ID0ge1xuICAgIHBhcmFtZXRlclBhdGg6IFtcIm9wdGlvbnNcIiwgXCJwcmV2c25hcHNob3RcIl0sXG4gICAgbWFwcGVyOiB7XG4gICAgICAgIHNlcmlhbGl6ZWROYW1lOiBcInByZXZzbmFwc2hvdFwiLFxuICAgICAgICB4bWxOYW1lOiBcInByZXZzbmFwc2hvdFwiLFxuICAgICAgICB0eXBlOiB7XG4gICAgICAgICAgICBuYW1lOiBcIlN0cmluZ1wiLFxuICAgICAgICB9LFxuICAgIH0sXG59O1xuY29uc3QgcHJldlNuYXBzaG90VXJsID0ge1xuICAgIHBhcmFtZXRlclBhdGg6IFtcIm9wdGlvbnNcIiwgXCJwcmV2U25hcHNob3RVcmxcIl0sXG4gICAgbWFwcGVyOiB7XG4gICAgICAgIHNlcmlhbGl6ZWROYW1lOiBcIngtbXMtcHJldmlvdXMtc25hcHNob3QtdXJsXCIsXG4gICAgICAgIHhtbE5hbWU6IFwieC1tcy1wcmV2aW91cy1zbmFwc2hvdC11cmxcIixcbiAgICAgICAgdHlwZToge1xuICAgICAgICAgICAgbmFtZTogXCJTdHJpbmdcIixcbiAgICAgICAgfSxcbiAgICB9LFxufTtcbmNvbnN0IHNlcXVlbmNlTnVtYmVyQWN0aW9uID0ge1xuICAgIHBhcmFtZXRlclBhdGg6IFwic2VxdWVuY2VOdW1iZXJBY3Rpb25cIixcbiAgICBtYXBwZXI6IHtcbiAgICAgICAgc2VyaWFsaXplZE5hbWU6IFwieC1tcy1zZXF1ZW5jZS1udW1iZXItYWN0aW9uXCIsXG4gICAgICAgIHJlcXVpcmVkOiB0cnVlLFxuICAgICAgICB4bWxOYW1lOiBcIngtbXMtc2VxdWVuY2UtbnVtYmVyLWFjdGlvblwiLFxuICAgICAgICB0eXBlOiB7XG4gICAgICAgICAgICBuYW1lOiBcIkVudW1cIixcbiAgICAgICAgICAgIGFsbG93ZWRWYWx1ZXM6IFtcIm1heFwiLCBcInVwZGF0ZVwiLCBcImluY3JlbWVudFwiXSxcbiAgICAgICAgfSxcbiAgICB9LFxufTtcbmNvbnN0IGNvbXAyMSA9IHtcbiAgICBwYXJhbWV0ZXJQYXRoOiBcImNvbXBcIixcbiAgICBtYXBwZXI6IHtcbiAgICAgICAgZGVmYXVsdFZhbHVlOiBcImluY3JlbWVudGFsY29weVwiLFxuICAgICAgICBpc0NvbnN0YW50OiB0cnVlLFxuICAgICAgICBzZXJpYWxpemVkTmFtZTogXCJjb21wXCIsXG4gICAgICAgIHR5cGU6IHtcbiAgICAgICAgICAgIG5hbWU6IFwiU3RyaW5nXCIsXG4gICAgICAgIH0sXG4gICAgfSxcbn07XG5jb25zdCBibG9iVHlwZTEgPSB7XG4gICAgcGFyYW1ldGVyUGF0aDogXCJibG9iVHlwZVwiLFxuICAgIG1hcHBlcjoge1xuICAgICAgICBkZWZhdWx0VmFsdWU6IFwiQXBwZW5kQmxvYlwiLFxuICAgICAgICBpc0NvbnN0YW50OiB0cnVlLFxuICAgICAgICBzZXJpYWxpemVkTmFtZTogXCJ4LW1zLWJsb2ItdHlwZVwiLFxuICAgICAgICB0eXBlOiB7XG4gICAgICAgICAgICBuYW1lOiBcIlN0cmluZ1wiLFxuICAgICAgICB9LFxuICAgIH0sXG59O1xuY29uc3QgY29tcDIyID0ge1xuICAgIHBhcmFtZXRlclBhdGg6IFwiY29tcFwiLFxuICAgIG1hcHBlcjoge1xuICAgICAgICBkZWZhdWx0VmFsdWU6IFwiYXBwZW5kYmxvY2tcIixcbiAgICAgICAgaXNDb25zdGFudDogdHJ1ZSxcbiAgICAgICAgc2VyaWFsaXplZE5hbWU6IFwiY29tcFwiLFxuICAgICAgICB0eXBlOiB7XG4gICAgICAgICAgICBuYW1lOiBcIlN0cmluZ1wiLFxuICAgICAgICB9LFxuICAgIH0sXG59O1xuY29uc3QgbWF4U2l6ZSA9IHtcbiAgICBwYXJhbWV0ZXJQYXRoOiBbXCJvcHRpb25zXCIsIFwiYXBwZW5kUG9zaXRpb25BY2Nlc3NDb25kaXRpb25zXCIsIFwibWF4U2l6ZVwiXSxcbiAgICBtYXBwZXI6IHtcbiAgICAgICAgc2VyaWFsaXplZE5hbWU6IFwieC1tcy1ibG9iLWNvbmRpdGlvbi1tYXhzaXplXCIsXG4gICAgICAgIHhtbE5hbWU6IFwieC1tcy1ibG9iLWNvbmRpdGlvbi1tYXhzaXplXCIsXG4gICAgICAgIHR5cGU6IHtcbiAgICAgICAgICAgIG5hbWU6IFwiTnVtYmVyXCIsXG4gICAgICAgIH0sXG4gICAgfSxcbn07XG5jb25zdCBhcHBlbmRQb3NpdGlvbiA9IHtcbiAgICBwYXJhbWV0ZXJQYXRoOiBbXG4gICAgICAgIFwib3B0aW9uc1wiLFxuICAgICAgICBcImFwcGVuZFBvc2l0aW9uQWNjZXNzQ29uZGl0aW9uc1wiLFxuICAgICAgICBcImFwcGVuZFBvc2l0aW9uXCIsXG4gICAgXSxcbiAgICBtYXBwZXI6IHtcbiAgICAgICAgc2VyaWFsaXplZE5hbWU6IFwieC1tcy1ibG9iLWNvbmRpdGlvbi1hcHBlbmRwb3NcIixcbiAgICAgICAgeG1sTmFtZTogXCJ4LW1zLWJsb2ItY29uZGl0aW9uLWFwcGVuZHBvc1wiLFxuICAgICAgICB0eXBlOiB7XG4gICAgICAgICAgICBuYW1lOiBcIk51bWJlclwiLFxuICAgICAgICB9LFxuICAgIH0sXG59O1xuY29uc3Qgc291cmNlUmFuZ2UxID0ge1xuICAgIHBhcmFtZXRlclBhdGg6IFtcIm9wdGlvbnNcIiwgXCJzb3VyY2VSYW5nZVwiXSxcbiAgICBtYXBwZXI6IHtcbiAgICAgICAgc2VyaWFsaXplZE5hbWU6IFwieC1tcy1zb3VyY2UtcmFuZ2VcIixcbiAgICAgICAgeG1sTmFtZTogXCJ4LW1zLXNvdXJjZS1yYW5nZVwiLFxuICAgICAgICB0eXBlOiB7XG4gICAgICAgICAgICBuYW1lOiBcIlN0cmluZ1wiLFxuICAgICAgICB9LFxuICAgIH0sXG59O1xuY29uc3QgY29tcDIzID0ge1xuICAgIHBhcmFtZXRlclBhdGg6IFwiY29tcFwiLFxuICAgIG1hcHBlcjoge1xuICAgICAgICBkZWZhdWx0VmFsdWU6IFwic2VhbFwiLFxuICAgICAgICBpc0NvbnN0YW50OiB0cnVlLFxuICAgICAgICBzZXJpYWxpemVkTmFtZTogXCJjb21wXCIsXG4gICAgICAgIHR5cGU6IHtcbiAgICAgICAgICAgIG5hbWU6IFwiU3RyaW5nXCIsXG4gICAgICAgIH0sXG4gICAgfSxcbn07XG5jb25zdCBibG9iVHlwZTIgPSB7XG4gICAgcGFyYW1ldGVyUGF0aDogXCJibG9iVHlwZVwiLFxuICAgIG1hcHBlcjoge1xuICAgICAgICBkZWZhdWx0VmFsdWU6IFwiQmxvY2tCbG9iXCIsXG4gICAgICAgIGlzQ29uc3RhbnQ6IHRydWUsXG4gICAgICAgIHNlcmlhbGl6ZWROYW1lOiBcIngtbXMtYmxvYi10eXBlXCIsXG4gICAgICAgIHR5cGU6IHtcbiAgICAgICAgICAgIG5hbWU6IFwiU3RyaW5nXCIsXG4gICAgICAgIH0sXG4gICAgfSxcbn07XG5jb25zdCBjb3B5U291cmNlQmxvYlByb3BlcnRpZXMgPSB7XG4gICAgcGFyYW1ldGVyUGF0aDogW1wib3B0aW9uc1wiLCBcImNvcHlTb3VyY2VCbG9iUHJvcGVydGllc1wiXSxcbiAgICBtYXBwZXI6IHtcbiAgICAgICAgc2VyaWFsaXplZE5hbWU6IFwieC1tcy1jb3B5LXNvdXJjZS1ibG9iLXByb3BlcnRpZXNcIixcbiAgICAgICAgeG1sTmFtZTogXCJ4LW1zLWNvcHktc291cmNlLWJsb2ItcHJvcGVydGllc1wiLFxuICAgICAgICB0eXBlOiB7XG4gICAgICAgICAgICBuYW1lOiBcIkJvb2xlYW5cIixcbiAgICAgICAgfSxcbiAgICB9LFxufTtcbmNvbnN0IGNvbXAyNCA9IHtcbiAgICBwYXJhbWV0ZXJQYXRoOiBcImNvbXBcIixcbiAgICBtYXBwZXI6IHtcbiAgICAgICAgZGVmYXVsdFZhbHVlOiBcImJsb2NrXCIsXG4gICAgICAgIGlzQ29uc3RhbnQ6IHRydWUsXG4gICAgICAgIHNlcmlhbGl6ZWROYW1lOiBcImNvbXBcIixcbiAgICAgICAgdHlwZToge1xuICAgICAgICAgICAgbmFtZTogXCJTdHJpbmdcIixcbiAgICAgICAgfSxcbiAgICB9LFxufTtcbmNvbnN0IGJsb2NrSWQgPSB7XG4gICAgcGFyYW1ldGVyUGF0aDogXCJibG9ja0lkXCIsXG4gICAgbWFwcGVyOiB7XG4gICAgICAgIHNlcmlhbGl6ZWROYW1lOiBcImJsb2NraWRcIixcbiAgICAgICAgcmVxdWlyZWQ6IHRydWUsXG4gICAgICAgIHhtbE5hbWU6IFwiYmxvY2tpZFwiLFxuICAgICAgICB0eXBlOiB7XG4gICAgICAgICAgICBuYW1lOiBcIlN0cmluZ1wiLFxuICAgICAgICB9LFxuICAgIH0sXG59O1xuY29uc3QgYmxvY2tzID0ge1xuICAgIHBhcmFtZXRlclBhdGg6IFwiYmxvY2tzXCIsXG4gICAgbWFwcGVyOiBCbG9ja0xvb2t1cExpc3QsXG59O1xuY29uc3QgY29tcDI1ID0ge1xuICAgIHBhcmFtZXRlclBhdGg6IFwiY29tcFwiLFxuICAgIG1hcHBlcjoge1xuICAgICAgICBkZWZhdWx0VmFsdWU6IFwiYmxvY2tsaXN0XCIsXG4gICAgICAgIGlzQ29uc3RhbnQ6IHRydWUsXG4gICAgICAgIHNlcmlhbGl6ZWROYW1lOiBcImNvbXBcIixcbiAgICAgICAgdHlwZToge1xuICAgICAgICAgICAgbmFtZTogXCJTdHJpbmdcIixcbiAgICAgICAgfSxcbiAgICB9LFxufTtcbmNvbnN0IGxpc3RUeXBlID0ge1xuICAgIHBhcmFtZXRlclBhdGg6IFwibGlzdFR5cGVcIixcbiAgICBtYXBwZXI6IHtcbiAgICAgICAgZGVmYXVsdFZhbHVlOiBcImNvbW1pdHRlZFwiLFxuICAgICAgICBzZXJpYWxpemVkTmFtZTogXCJibG9ja2xpc3R0eXBlXCIsXG4gICAgICAgIHJlcXVpcmVkOiB0cnVlLFxuICAgICAgICB4bWxOYW1lOiBcImJsb2NrbGlzdHR5cGVcIixcbiAgICAgICAgdHlwZToge1xuICAgICAgICAgICAgbmFtZTogXCJFbnVtXCIsXG4gICAgICAgICAgICBhbGxvd2VkVmFsdWVzOiBbXCJjb21taXR0ZWRcIiwgXCJ1bmNvbW1pdHRlZFwiLCBcImFsbFwiXSxcbiAgICAgICAgfSxcbiAgICB9LFxufTtcblxuLypcbiAqIENvcHlyaWdodCAoYykgTWljcm9zb2Z0IENvcnBvcmF0aW9uLlxuICogTGljZW5zZWQgdW5kZXIgdGhlIE1JVCBMaWNlbnNlLlxuICpcbiAqIENvZGUgZ2VuZXJhdGVkIGJ5IE1pY3Jvc29mdCAoUikgQXV0b1Jlc3QgQ29kZSBHZW5lcmF0b3IuXG4gKiBDaGFuZ2VzIG1heSBjYXVzZSBpbmNvcnJlY3QgYmVoYXZpb3IgYW5kIHdpbGwgYmUgbG9zdCBpZiB0aGUgY29kZSBpcyByZWdlbmVyYXRlZC5cbiAqL1xuLyoqIENsYXNzIGNvbnRhaW5pbmcgU2VydmljZSBvcGVyYXRpb25zLiAqL1xuY2xhc3MgU2VydmljZUltcGwge1xuICAgIC8qKlxuICAgICAqIEluaXRpYWxpemUgYSBuZXcgaW5zdGFuY2Ugb2YgdGhlIGNsYXNzIFNlcnZpY2UgY2xhc3MuXG4gICAgICogQHBhcmFtIGNsaWVudCBSZWZlcmVuY2UgdG8gdGhlIHNlcnZpY2UgY2xpZW50XG4gICAgICovXG4gICAgY29uc3RydWN0b3IoY2xpZW50KSB7XG4gICAgICAgIHRoaXMuY2xpZW50ID0gY2xpZW50O1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBTZXRzIHByb3BlcnRpZXMgZm9yIGEgc3RvcmFnZSBhY2NvdW50J3MgQmxvYiBzZXJ2aWNlIGVuZHBvaW50LCBpbmNsdWRpbmcgcHJvcGVydGllcyBmb3IgU3RvcmFnZVxuICAgICAqIEFuYWx5dGljcyBhbmQgQ09SUyAoQ3Jvc3MtT3JpZ2luIFJlc291cmNlIFNoYXJpbmcpIHJ1bGVzXG4gICAgICogQHBhcmFtIGJsb2JTZXJ2aWNlUHJvcGVydGllcyBUaGUgU3RvcmFnZVNlcnZpY2UgcHJvcGVydGllcy5cbiAgICAgKiBAcGFyYW0gb3B0aW9ucyBUaGUgb3B0aW9ucyBwYXJhbWV0ZXJzLlxuICAgICAqL1xuICAgIHNldFByb3BlcnRpZXMoYmxvYlNlcnZpY2VQcm9wZXJ0aWVzLCBvcHRpb25zKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmNsaWVudC5zZW5kT3BlcmF0aW9uUmVxdWVzdCh7IGJsb2JTZXJ2aWNlUHJvcGVydGllcywgb3B0aW9ucyB9LCBzZXRQcm9wZXJ0aWVzT3BlcmF0aW9uU3BlYyk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIGdldHMgdGhlIHByb3BlcnRpZXMgb2YgYSBzdG9yYWdlIGFjY291bnQncyBCbG9iIHNlcnZpY2UsIGluY2x1ZGluZyBwcm9wZXJ0aWVzIGZvciBTdG9yYWdlIEFuYWx5dGljc1xuICAgICAqIGFuZCBDT1JTIChDcm9zcy1PcmlnaW4gUmVzb3VyY2UgU2hhcmluZykgcnVsZXMuXG4gICAgICogQHBhcmFtIG9wdGlvbnMgVGhlIG9wdGlvbnMgcGFyYW1ldGVycy5cbiAgICAgKi9cbiAgICBnZXRQcm9wZXJ0aWVzKG9wdGlvbnMpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuY2xpZW50LnNlbmRPcGVyYXRpb25SZXF1ZXN0KHsgb3B0aW9ucyB9LCBnZXRQcm9wZXJ0aWVzT3BlcmF0aW9uU3BlYyQyKTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogUmV0cmlldmVzIHN0YXRpc3RpY3MgcmVsYXRlZCB0byByZXBsaWNhdGlvbiBmb3IgdGhlIEJsb2Igc2VydmljZS4gSXQgaXMgb25seSBhdmFpbGFibGUgb24gdGhlXG4gICAgICogc2Vjb25kYXJ5IGxvY2F0aW9uIGVuZHBvaW50IHdoZW4gcmVhZC1hY2Nlc3MgZ2VvLXJlZHVuZGFudCByZXBsaWNhdGlvbiBpcyBlbmFibGVkIGZvciB0aGUgc3RvcmFnZVxuICAgICAqIGFjY291bnQuXG4gICAgICogQHBhcmFtIG9wdGlvbnMgVGhlIG9wdGlvbnMgcGFyYW1ldGVycy5cbiAgICAgKi9cbiAgICBnZXRTdGF0aXN0aWNzKG9wdGlvbnMpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuY2xpZW50LnNlbmRPcGVyYXRpb25SZXF1ZXN0KHsgb3B0aW9ucyB9LCBnZXRTdGF0aXN0aWNzT3BlcmF0aW9uU3BlYyk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIFRoZSBMaXN0IENvbnRhaW5lcnMgU2VnbWVudCBvcGVyYXRpb24gcmV0dXJucyBhIGxpc3Qgb2YgdGhlIGNvbnRhaW5lcnMgdW5kZXIgdGhlIHNwZWNpZmllZCBhY2NvdW50XG4gICAgICogQHBhcmFtIG9wdGlvbnMgVGhlIG9wdGlvbnMgcGFyYW1ldGVycy5cbiAgICAgKi9cbiAgICBsaXN0Q29udGFpbmVyc1NlZ21lbnQob3B0aW9ucykge1xuICAgICAgICByZXR1cm4gdGhpcy5jbGllbnQuc2VuZE9wZXJhdGlvblJlcXVlc3QoeyBvcHRpb25zIH0sIGxpc3RDb250YWluZXJzU2VnbWVudE9wZXJhdGlvblNwZWMpO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBSZXRyaWV2ZXMgYSB1c2VyIGRlbGVnYXRpb24ga2V5IGZvciB0aGUgQmxvYiBzZXJ2aWNlLiBUaGlzIGlzIG9ubHkgYSB2YWxpZCBvcGVyYXRpb24gd2hlbiB1c2luZ1xuICAgICAqIGJlYXJlciB0b2tlbiBhdXRoZW50aWNhdGlvbi5cbiAgICAgKiBAcGFyYW0ga2V5SW5mbyBLZXkgaW5mb3JtYXRpb25cbiAgICAgKiBAcGFyYW0gb3B0aW9ucyBUaGUgb3B0aW9ucyBwYXJhbWV0ZXJzLlxuICAgICAqL1xuICAgIGdldFVzZXJEZWxlZ2F0aW9uS2V5KGtleUluZm8sIG9wdGlvbnMpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuY2xpZW50LnNlbmRPcGVyYXRpb25SZXF1ZXN0KHsga2V5SW5mbywgb3B0aW9ucyB9LCBnZXRVc2VyRGVsZWdhdGlvbktleU9wZXJhdGlvblNwZWMpO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBSZXR1cm5zIHRoZSBza3UgbmFtZSBhbmQgYWNjb3VudCBraW5kXG4gICAgICogQHBhcmFtIG9wdGlvbnMgVGhlIG9wdGlvbnMgcGFyYW1ldGVycy5cbiAgICAgKi9cbiAgICBnZXRBY2NvdW50SW5mbyhvcHRpb25zKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmNsaWVudC5zZW5kT3BlcmF0aW9uUmVxdWVzdCh7IG9wdGlvbnMgfSwgZ2V0QWNjb3VudEluZm9PcGVyYXRpb25TcGVjJDIpO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBUaGUgQmF0Y2ggb3BlcmF0aW9uIGFsbG93cyBtdWx0aXBsZSBBUEkgY2FsbHMgdG8gYmUgZW1iZWRkZWQgaW50byBhIHNpbmdsZSBIVFRQIHJlcXVlc3QuXG4gICAgICogQHBhcmFtIGNvbnRlbnRMZW5ndGggVGhlIGxlbmd0aCBvZiB0aGUgcmVxdWVzdC5cbiAgICAgKiBAcGFyYW0gbXVsdGlwYXJ0Q29udGVudFR5cGUgUmVxdWlyZWQuIFRoZSB2YWx1ZSBvZiB0aGlzIGhlYWRlciBtdXN0IGJlIG11bHRpcGFydC9taXhlZCB3aXRoIGEgYmF0Y2hcbiAgICAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm91bmRhcnkuIEV4YW1wbGUgaGVhZGVyIHZhbHVlOiBtdWx0aXBhcnQvbWl4ZWQ7IGJvdW5kYXJ5PWJhdGNoXzxHVUlEPlxuICAgICAqIEBwYXJhbSBib2R5IEluaXRpYWwgZGF0YVxuICAgICAqIEBwYXJhbSBvcHRpb25zIFRoZSBvcHRpb25zIHBhcmFtZXRlcnMuXG4gICAgICovXG4gICAgc3VibWl0QmF0Y2goY29udGVudExlbmd0aCwgbXVsdGlwYXJ0Q29udGVudFR5cGUsIGJvZHksIG9wdGlvbnMpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuY2xpZW50LnNlbmRPcGVyYXRpb25SZXF1ZXN0KHsgY29udGVudExlbmd0aCwgbXVsdGlwYXJ0Q29udGVudFR5cGUsIGJvZHksIG9wdGlvbnMgfSwgc3VibWl0QmF0Y2hPcGVyYXRpb25TcGVjJDEpO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBUaGUgRmlsdGVyIEJsb2JzIG9wZXJhdGlvbiBlbmFibGVzIGNhbGxlcnMgdG8gbGlzdCBibG9icyBhY3Jvc3MgYWxsIGNvbnRhaW5lcnMgd2hvc2UgdGFncyBtYXRjaCBhXG4gICAgICogZ2l2ZW4gc2VhcmNoIGV4cHJlc3Npb24uICBGaWx0ZXIgYmxvYnMgc2VhcmNoZXMgYWNyb3NzIGFsbCBjb250YWluZXJzIHdpdGhpbiBhIHN0b3JhZ2UgYWNjb3VudCBidXRcbiAgICAgKiBjYW4gYmUgc2NvcGVkIHdpdGhpbiB0aGUgZXhwcmVzc2lvbiB0byBhIHNpbmdsZSBjb250YWluZXIuXG4gICAgICogQHBhcmFtIG9wdGlvbnMgVGhlIG9wdGlvbnMgcGFyYW1ldGVycy5cbiAgICAgKi9cbiAgICBmaWx0ZXJCbG9icyhvcHRpb25zKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmNsaWVudC5zZW5kT3BlcmF0aW9uUmVxdWVzdCh7IG9wdGlvbnMgfSwgZmlsdGVyQmxvYnNPcGVyYXRpb25TcGVjJDEpO1xuICAgIH1cbn1cbi8vIE9wZXJhdGlvbiBTcGVjaWZpY2F0aW9uc1xuY29uc3QgeG1sU2VyaWFsaXplciQ1ID0gY29yZUNsaWVudF9fbmFtZXNwYWNlLmNyZWF0ZVNlcmlhbGl6ZXIoTWFwcGVycywgLyogaXNYbWwgKi8gdHJ1ZSk7XG5jb25zdCBzZXRQcm9wZXJ0aWVzT3BlcmF0aW9uU3BlYyA9IHtcbiAgICBwYXRoOiBcIi9cIixcbiAgICBodHRwTWV0aG9kOiBcIlBVVFwiLFxuICAgIHJlc3BvbnNlczoge1xuICAgICAgICAyMDI6IHtcbiAgICAgICAgICAgIGhlYWRlcnNNYXBwZXI6IFNlcnZpY2VTZXRQcm9wZXJ0aWVzSGVhZGVycyxcbiAgICAgICAgfSxcbiAgICAgICAgZGVmYXVsdDoge1xuICAgICAgICAgICAgYm9keU1hcHBlcjogU3RvcmFnZUVycm9yLFxuICAgICAgICAgICAgaGVhZGVyc01hcHBlcjogU2VydmljZVNldFByb3BlcnRpZXNFeGNlcHRpb25IZWFkZXJzLFxuICAgICAgICB9LFxuICAgIH0sXG4gICAgcmVxdWVzdEJvZHk6IGJsb2JTZXJ2aWNlUHJvcGVydGllcyxcbiAgICBxdWVyeVBhcmFtZXRlcnM6IFtcbiAgICAgICAgcmVzdHlwZSxcbiAgICAgICAgY29tcCxcbiAgICAgICAgdGltZW91dEluU2Vjb25kcyxcbiAgICBdLFxuICAgIHVybFBhcmFtZXRlcnM6IFt1cmxdLFxuICAgIGhlYWRlclBhcmFtZXRlcnM6IFtcbiAgICAgICAgY29udGVudFR5cGUsXG4gICAgICAgIGFjY2VwdCxcbiAgICAgICAgdmVyc2lvbixcbiAgICAgICAgcmVxdWVzdElkLFxuICAgIF0sXG4gICAgaXNYTUw6IHRydWUsXG4gICAgY29udGVudFR5cGU6IFwiYXBwbGljYXRpb24veG1sOyBjaGFyc2V0PXV0Zi04XCIsXG4gICAgbWVkaWFUeXBlOiBcInhtbFwiLFxuICAgIHNlcmlhbGl6ZXI6IHhtbFNlcmlhbGl6ZXIkNSxcbn07XG5jb25zdCBnZXRQcm9wZXJ0aWVzT3BlcmF0aW9uU3BlYyQyID0ge1xuICAgIHBhdGg6IFwiL1wiLFxuICAgIGh0dHBNZXRob2Q6IFwiR0VUXCIsXG4gICAgcmVzcG9uc2VzOiB7XG4gICAgICAgIDIwMDoge1xuICAgICAgICAgICAgYm9keU1hcHBlcjogQmxvYlNlcnZpY2VQcm9wZXJ0aWVzLFxuICAgICAgICAgICAgaGVhZGVyc01hcHBlcjogU2VydmljZUdldFByb3BlcnRpZXNIZWFkZXJzLFxuICAgICAgICB9LFxuICAgICAgICBkZWZhdWx0OiB7XG4gICAgICAgICAgICBib2R5TWFwcGVyOiBTdG9yYWdlRXJyb3IsXG4gICAgICAgICAgICBoZWFkZXJzTWFwcGVyOiBTZXJ2aWNlR2V0UHJvcGVydGllc0V4Y2VwdGlvbkhlYWRlcnMsXG4gICAgICAgIH0sXG4gICAgfSxcbiAgICBxdWVyeVBhcmFtZXRlcnM6IFtcbiAgICAgICAgcmVzdHlwZSxcbiAgICAgICAgY29tcCxcbiAgICAgICAgdGltZW91dEluU2Vjb25kcyxcbiAgICBdLFxuICAgIHVybFBhcmFtZXRlcnM6IFt1cmxdLFxuICAgIGhlYWRlclBhcmFtZXRlcnM6IFtcbiAgICAgICAgdmVyc2lvbixcbiAgICAgICAgcmVxdWVzdElkLFxuICAgICAgICBhY2NlcHQxLFxuICAgIF0sXG4gICAgaXNYTUw6IHRydWUsXG4gICAgc2VyaWFsaXplcjogeG1sU2VyaWFsaXplciQ1LFxufTtcbmNvbnN0IGdldFN0YXRpc3RpY3NPcGVyYXRpb25TcGVjID0ge1xuICAgIHBhdGg6IFwiL1wiLFxuICAgIGh0dHBNZXRob2Q6IFwiR0VUXCIsXG4gICAgcmVzcG9uc2VzOiB7XG4gICAgICAgIDIwMDoge1xuICAgICAgICAgICAgYm9keU1hcHBlcjogQmxvYlNlcnZpY2VTdGF0aXN0aWNzLFxuICAgICAgICAgICAgaGVhZGVyc01hcHBlcjogU2VydmljZUdldFN0YXRpc3RpY3NIZWFkZXJzLFxuICAgICAgICB9LFxuICAgICAgICBkZWZhdWx0OiB7XG4gICAgICAgICAgICBib2R5TWFwcGVyOiBTdG9yYWdlRXJyb3IsXG4gICAgICAgICAgICBoZWFkZXJzTWFwcGVyOiBTZXJ2aWNlR2V0U3RhdGlzdGljc0V4Y2VwdGlvbkhlYWRlcnMsXG4gICAgICAgIH0sXG4gICAgfSxcbiAgICBxdWVyeVBhcmFtZXRlcnM6IFtcbiAgICAgICAgcmVzdHlwZSxcbiAgICAgICAgdGltZW91dEluU2Vjb25kcyxcbiAgICAgICAgY29tcDEsXG4gICAgXSxcbiAgICB1cmxQYXJhbWV0ZXJzOiBbdXJsXSxcbiAgICBoZWFkZXJQYXJhbWV0ZXJzOiBbXG4gICAgICAgIHZlcnNpb24sXG4gICAgICAgIHJlcXVlc3RJZCxcbiAgICAgICAgYWNjZXB0MSxcbiAgICBdLFxuICAgIGlzWE1MOiB0cnVlLFxuICAgIHNlcmlhbGl6ZXI6IHhtbFNlcmlhbGl6ZXIkNSxcbn07XG5jb25zdCBsaXN0Q29udGFpbmVyc1NlZ21lbnRPcGVyYXRpb25TcGVjID0ge1xuICAgIHBhdGg6IFwiL1wiLFxuICAgIGh0dHBNZXRob2Q6IFwiR0VUXCIsXG4gICAgcmVzcG9uc2VzOiB7XG4gICAgICAgIDIwMDoge1xuICAgICAgICAgICAgYm9keU1hcHBlcjogTGlzdENvbnRhaW5lcnNTZWdtZW50UmVzcG9uc2UsXG4gICAgICAgICAgICBoZWFkZXJzTWFwcGVyOiBTZXJ2aWNlTGlzdENvbnRhaW5lcnNTZWdtZW50SGVhZGVycyxcbiAgICAgICAgfSxcbiAgICAgICAgZGVmYXVsdDoge1xuICAgICAgICAgICAgYm9keU1hcHBlcjogU3RvcmFnZUVycm9yLFxuICAgICAgICAgICAgaGVhZGVyc01hcHBlcjogU2VydmljZUxpc3RDb250YWluZXJzU2VnbWVudEV4Y2VwdGlvbkhlYWRlcnMsXG4gICAgICAgIH0sXG4gICAgfSxcbiAgICBxdWVyeVBhcmFtZXRlcnM6IFtcbiAgICAgICAgdGltZW91dEluU2Vjb25kcyxcbiAgICAgICAgY29tcDIsXG4gICAgICAgIHByZWZpeCxcbiAgICAgICAgbWFya2VyLFxuICAgICAgICBtYXhQYWdlU2l6ZSxcbiAgICAgICAgaW5jbHVkZSxcbiAgICBdLFxuICAgIHVybFBhcmFtZXRlcnM6IFt1cmxdLFxuICAgIGhlYWRlclBhcmFtZXRlcnM6IFtcbiAgICAgICAgdmVyc2lvbixcbiAgICAgICAgcmVxdWVzdElkLFxuICAgICAgICBhY2NlcHQxLFxuICAgIF0sXG4gICAgaXNYTUw6IHRydWUsXG4gICAgc2VyaWFsaXplcjogeG1sU2VyaWFsaXplciQ1LFxufTtcbmNvbnN0IGdldFVzZXJEZWxlZ2F0aW9uS2V5T3BlcmF0aW9uU3BlYyA9IHtcbiAgICBwYXRoOiBcIi9cIixcbiAgICBodHRwTWV0aG9kOiBcIlBPU1RcIixcbiAgICByZXNwb25zZXM6IHtcbiAgICAgICAgMjAwOiB7XG4gICAgICAgICAgICBib2R5TWFwcGVyOiBVc2VyRGVsZWdhdGlvbktleSxcbiAgICAgICAgICAgIGhlYWRlcnNNYXBwZXI6IFNlcnZpY2VHZXRVc2VyRGVsZWdhdGlvbktleUhlYWRlcnMsXG4gICAgICAgIH0sXG4gICAgICAgIGRlZmF1bHQ6IHtcbiAgICAgICAgICAgIGJvZHlNYXBwZXI6IFN0b3JhZ2VFcnJvcixcbiAgICAgICAgICAgIGhlYWRlcnNNYXBwZXI6IFNlcnZpY2VHZXRVc2VyRGVsZWdhdGlvbktleUV4Y2VwdGlvbkhlYWRlcnMsXG4gICAgICAgIH0sXG4gICAgfSxcbiAgICByZXF1ZXN0Qm9keToga2V5SW5mbyxcbiAgICBxdWVyeVBhcmFtZXRlcnM6IFtcbiAgICAgICAgcmVzdHlwZSxcbiAgICAgICAgdGltZW91dEluU2Vjb25kcyxcbiAgICAgICAgY29tcDMsXG4gICAgXSxcbiAgICB1cmxQYXJhbWV0ZXJzOiBbdXJsXSxcbiAgICBoZWFkZXJQYXJhbWV0ZXJzOiBbXG4gICAgICAgIGNvbnRlbnRUeXBlLFxuICAgICAgICBhY2NlcHQsXG4gICAgICAgIHZlcnNpb24sXG4gICAgICAgIHJlcXVlc3RJZCxcbiAgICBdLFxuICAgIGlzWE1MOiB0cnVlLFxuICAgIGNvbnRlbnRUeXBlOiBcImFwcGxpY2F0aW9uL3htbDsgY2hhcnNldD11dGYtOFwiLFxuICAgIG1lZGlhVHlwZTogXCJ4bWxcIixcbiAgICBzZXJpYWxpemVyOiB4bWxTZXJpYWxpemVyJDUsXG59O1xuY29uc3QgZ2V0QWNjb3VudEluZm9PcGVyYXRpb25TcGVjJDIgPSB7XG4gICAgcGF0aDogXCIvXCIsXG4gICAgaHR0cE1ldGhvZDogXCJHRVRcIixcbiAgICByZXNwb25zZXM6IHtcbiAgICAgICAgMjAwOiB7XG4gICAgICAgICAgICBoZWFkZXJzTWFwcGVyOiBTZXJ2aWNlR2V0QWNjb3VudEluZm9IZWFkZXJzLFxuICAgICAgICB9LFxuICAgICAgICBkZWZhdWx0OiB7XG4gICAgICAgICAgICBib2R5TWFwcGVyOiBTdG9yYWdlRXJyb3IsXG4gICAgICAgICAgICBoZWFkZXJzTWFwcGVyOiBTZXJ2aWNlR2V0QWNjb3VudEluZm9FeGNlcHRpb25IZWFkZXJzLFxuICAgICAgICB9LFxuICAgIH0sXG4gICAgcXVlcnlQYXJhbWV0ZXJzOiBbXG4gICAgICAgIGNvbXAsXG4gICAgICAgIHRpbWVvdXRJblNlY29uZHMsXG4gICAgICAgIHJlc3R5cGUxLFxuICAgIF0sXG4gICAgdXJsUGFyYW1ldGVyczogW3VybF0sXG4gICAgaGVhZGVyUGFyYW1ldGVyczogW1xuICAgICAgICB2ZXJzaW9uLFxuICAgICAgICByZXF1ZXN0SWQsXG4gICAgICAgIGFjY2VwdDEsXG4gICAgXSxcbiAgICBpc1hNTDogdHJ1ZSxcbiAgICBzZXJpYWxpemVyOiB4bWxTZXJpYWxpemVyJDUsXG59O1xuY29uc3Qgc3VibWl0QmF0Y2hPcGVyYXRpb25TcGVjJDEgPSB7XG4gICAgcGF0aDogXCIvXCIsXG4gICAgaHR0cE1ldGhvZDogXCJQT1NUXCIsXG4gICAgcmVzcG9uc2VzOiB7XG4gICAgICAgIDIwMjoge1xuICAgICAgICAgICAgYm9keU1hcHBlcjoge1xuICAgICAgICAgICAgICAgIHR5cGU6IHsgbmFtZTogXCJTdHJlYW1cIiB9LFxuICAgICAgICAgICAgICAgIHNlcmlhbGl6ZWROYW1lOiBcInBhcnNlZFJlc3BvbnNlXCIsXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgaGVhZGVyc01hcHBlcjogU2VydmljZVN1Ym1pdEJhdGNoSGVhZGVycyxcbiAgICAgICAgfSxcbiAgICAgICAgZGVmYXVsdDoge1xuICAgICAgICAgICAgYm9keU1hcHBlcjogU3RvcmFnZUVycm9yLFxuICAgICAgICAgICAgaGVhZGVyc01hcHBlcjogU2VydmljZVN1Ym1pdEJhdGNoRXhjZXB0aW9uSGVhZGVycyxcbiAgICAgICAgfSxcbiAgICB9LFxuICAgIHJlcXVlc3RCb2R5OiBib2R5LFxuICAgIHF1ZXJ5UGFyYW1ldGVyczogW3RpbWVvdXRJblNlY29uZHMsIGNvbXA0XSxcbiAgICB1cmxQYXJhbWV0ZXJzOiBbdXJsXSxcbiAgICBoZWFkZXJQYXJhbWV0ZXJzOiBbXG4gICAgICAgIGFjY2VwdCxcbiAgICAgICAgdmVyc2lvbixcbiAgICAgICAgcmVxdWVzdElkLFxuICAgICAgICBjb250ZW50TGVuZ3RoLFxuICAgICAgICBtdWx0aXBhcnRDb250ZW50VHlwZSxcbiAgICBdLFxuICAgIGlzWE1MOiB0cnVlLFxuICAgIGNvbnRlbnRUeXBlOiBcImFwcGxpY2F0aW9uL3htbDsgY2hhcnNldD11dGYtOFwiLFxuICAgIG1lZGlhVHlwZTogXCJ4bWxcIixcbiAgICBzZXJpYWxpemVyOiB4bWxTZXJpYWxpemVyJDUsXG59O1xuY29uc3QgZmlsdGVyQmxvYnNPcGVyYXRpb25TcGVjJDEgPSB7XG4gICAgcGF0aDogXCIvXCIsXG4gICAgaHR0cE1ldGhvZDogXCJHRVRcIixcbiAgICByZXNwb25zZXM6IHtcbiAgICAgICAgMjAwOiB7XG4gICAgICAgICAgICBib2R5TWFwcGVyOiBGaWx0ZXJCbG9iU2VnbWVudCxcbiAgICAgICAgICAgIGhlYWRlcnNNYXBwZXI6IFNlcnZpY2VGaWx0ZXJCbG9ic0hlYWRlcnMsXG4gICAgICAgIH0sXG4gICAgICAgIGRlZmF1bHQ6IHtcbiAgICAgICAgICAgIGJvZHlNYXBwZXI6IFN0b3JhZ2VFcnJvcixcbiAgICAgICAgICAgIGhlYWRlcnNNYXBwZXI6IFNlcnZpY2VGaWx0ZXJCbG9ic0V4Y2VwdGlvbkhlYWRlcnMsXG4gICAgICAgIH0sXG4gICAgfSxcbiAgICBxdWVyeVBhcmFtZXRlcnM6IFtcbiAgICAgICAgdGltZW91dEluU2Vjb25kcyxcbiAgICAgICAgbWFya2VyLFxuICAgICAgICBtYXhQYWdlU2l6ZSxcbiAgICAgICAgY29tcDUsXG4gICAgICAgIHdoZXJlLFxuICAgIF0sXG4gICAgdXJsUGFyYW1ldGVyczogW3VybF0sXG4gICAgaGVhZGVyUGFyYW1ldGVyczogW1xuICAgICAgICB2ZXJzaW9uLFxuICAgICAgICByZXF1ZXN0SWQsXG4gICAgICAgIGFjY2VwdDEsXG4gICAgXSxcbiAgICBpc1hNTDogdHJ1ZSxcbiAgICBzZXJpYWxpemVyOiB4bWxTZXJpYWxpemVyJDUsXG59O1xuXG4vKlxuICogQ29weXJpZ2h0IChjKSBNaWNyb3NvZnQgQ29ycG9yYXRpb24uXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgTUlUIExpY2Vuc2UuXG4gKlxuICogQ29kZSBnZW5lcmF0ZWQgYnkgTWljcm9zb2Z0IChSKSBBdXRvUmVzdCBDb2RlIEdlbmVyYXRvci5cbiAqIENoYW5nZXMgbWF5IGNhdXNlIGluY29ycmVjdCBiZWhhdmlvciBhbmQgd2lsbCBiZSBsb3N0IGlmIHRoZSBjb2RlIGlzIHJlZ2VuZXJhdGVkLlxuICovXG4vKiogQ2xhc3MgY29udGFpbmluZyBDb250YWluZXIgb3BlcmF0aW9ucy4gKi9cbmNsYXNzIENvbnRhaW5lckltcGwge1xuICAgIC8qKlxuICAgICAqIEluaXRpYWxpemUgYSBuZXcgaW5zdGFuY2Ugb2YgdGhlIGNsYXNzIENvbnRhaW5lciBjbGFzcy5cbiAgICAgKiBAcGFyYW0gY2xpZW50IFJlZmVyZW5jZSB0byB0aGUgc2VydmljZSBjbGllbnRcbiAgICAgKi9cbiAgICBjb25zdHJ1Y3RvcihjbGllbnQpIHtcbiAgICAgICAgdGhpcy5jbGllbnQgPSBjbGllbnQ7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIGNyZWF0ZXMgYSBuZXcgY29udGFpbmVyIHVuZGVyIHRoZSBzcGVjaWZpZWQgYWNjb3VudC4gSWYgdGhlIGNvbnRhaW5lciB3aXRoIHRoZSBzYW1lIG5hbWUgYWxyZWFkeVxuICAgICAqIGV4aXN0cywgdGhlIG9wZXJhdGlvbiBmYWlsc1xuICAgICAqIEBwYXJhbSBvcHRpb25zIFRoZSBvcHRpb25zIHBhcmFtZXRlcnMuXG4gICAgICovXG4gICAgY3JlYXRlKG9wdGlvbnMpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuY2xpZW50LnNlbmRPcGVyYXRpb25SZXF1ZXN0KHsgb3B0aW9ucyB9LCBjcmVhdGVPcGVyYXRpb25TcGVjJDIpO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiByZXR1cm5zIGFsbCB1c2VyLWRlZmluZWQgbWV0YWRhdGEgYW5kIHN5c3RlbSBwcm9wZXJ0aWVzIGZvciB0aGUgc3BlY2lmaWVkIGNvbnRhaW5lci4gVGhlIGRhdGFcbiAgICAgKiByZXR1cm5lZCBkb2VzIG5vdCBpbmNsdWRlIHRoZSBjb250YWluZXIncyBsaXN0IG9mIGJsb2JzXG4gICAgICogQHBhcmFtIG9wdGlvbnMgVGhlIG9wdGlvbnMgcGFyYW1ldGVycy5cbiAgICAgKi9cbiAgICBnZXRQcm9wZXJ0aWVzKG9wdGlvbnMpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuY2xpZW50LnNlbmRPcGVyYXRpb25SZXF1ZXN0KHsgb3B0aW9ucyB9LCBnZXRQcm9wZXJ0aWVzT3BlcmF0aW9uU3BlYyQxKTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogb3BlcmF0aW9uIG1hcmtzIHRoZSBzcGVjaWZpZWQgY29udGFpbmVyIGZvciBkZWxldGlvbi4gVGhlIGNvbnRhaW5lciBhbmQgYW55IGJsb2JzIGNvbnRhaW5lZCB3aXRoaW5cbiAgICAgKiBpdCBhcmUgbGF0ZXIgZGVsZXRlZCBkdXJpbmcgZ2FyYmFnZSBjb2xsZWN0aW9uXG4gICAgICogQHBhcmFtIG9wdGlvbnMgVGhlIG9wdGlvbnMgcGFyYW1ldGVycy5cbiAgICAgKi9cbiAgICBkZWxldGUob3B0aW9ucykge1xuICAgICAgICByZXR1cm4gdGhpcy5jbGllbnQuc2VuZE9wZXJhdGlvblJlcXVlc3QoeyBvcHRpb25zIH0sIGRlbGV0ZU9wZXJhdGlvblNwZWMkMSk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIG9wZXJhdGlvbiBzZXRzIG9uZSBvciBtb3JlIHVzZXItZGVmaW5lZCBuYW1lLXZhbHVlIHBhaXJzIGZvciB0aGUgc3BlY2lmaWVkIGNvbnRhaW5lci5cbiAgICAgKiBAcGFyYW0gb3B0aW9ucyBUaGUgb3B0aW9ucyBwYXJhbWV0ZXJzLlxuICAgICAqL1xuICAgIHNldE1ldGFkYXRhKG9wdGlvbnMpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuY2xpZW50LnNlbmRPcGVyYXRpb25SZXF1ZXN0KHsgb3B0aW9ucyB9LCBzZXRNZXRhZGF0YU9wZXJhdGlvblNwZWMkMSk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIGdldHMgdGhlIHBlcm1pc3Npb25zIGZvciB0aGUgc3BlY2lmaWVkIGNvbnRhaW5lci4gVGhlIHBlcm1pc3Npb25zIGluZGljYXRlIHdoZXRoZXIgY29udGFpbmVyIGRhdGFcbiAgICAgKiBtYXkgYmUgYWNjZXNzZWQgcHVibGljbHkuXG4gICAgICogQHBhcmFtIG9wdGlvbnMgVGhlIG9wdGlvbnMgcGFyYW1ldGVycy5cbiAgICAgKi9cbiAgICBnZXRBY2Nlc3NQb2xpY3kob3B0aW9ucykge1xuICAgICAgICByZXR1cm4gdGhpcy5jbGllbnQuc2VuZE9wZXJhdGlvblJlcXVlc3QoeyBvcHRpb25zIH0sIGdldEFjY2Vzc1BvbGljeU9wZXJhdGlvblNwZWMpO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBzZXRzIHRoZSBwZXJtaXNzaW9ucyBmb3IgdGhlIHNwZWNpZmllZCBjb250YWluZXIuIFRoZSBwZXJtaXNzaW9ucyBpbmRpY2F0ZSB3aGV0aGVyIGJsb2JzIGluIGFcbiAgICAgKiBjb250YWluZXIgbWF5IGJlIGFjY2Vzc2VkIHB1YmxpY2x5LlxuICAgICAqIEBwYXJhbSBvcHRpb25zIFRoZSBvcHRpb25zIHBhcmFtZXRlcnMuXG4gICAgICovXG4gICAgc2V0QWNjZXNzUG9saWN5KG9wdGlvbnMpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuY2xpZW50LnNlbmRPcGVyYXRpb25SZXF1ZXN0KHsgb3B0aW9ucyB9LCBzZXRBY2Nlc3NQb2xpY3lPcGVyYXRpb25TcGVjKTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogUmVzdG9yZXMgYSBwcmV2aW91c2x5LWRlbGV0ZWQgY29udGFpbmVyLlxuICAgICAqIEBwYXJhbSBvcHRpb25zIFRoZSBvcHRpb25zIHBhcmFtZXRlcnMuXG4gICAgICovXG4gICAgcmVzdG9yZShvcHRpb25zKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmNsaWVudC5zZW5kT3BlcmF0aW9uUmVxdWVzdCh7IG9wdGlvbnMgfSwgcmVzdG9yZU9wZXJhdGlvblNwZWMpO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBSZW5hbWVzIGFuIGV4aXN0aW5nIGNvbnRhaW5lci5cbiAgICAgKiBAcGFyYW0gc291cmNlQ29udGFpbmVyTmFtZSBSZXF1aXJlZC4gIFNwZWNpZmllcyB0aGUgbmFtZSBvZiB0aGUgY29udGFpbmVyIHRvIHJlbmFtZS5cbiAgICAgKiBAcGFyYW0gb3B0aW9ucyBUaGUgb3B0aW9ucyBwYXJhbWV0ZXJzLlxuICAgICAqL1xuICAgIHJlbmFtZShzb3VyY2VDb250YWluZXJOYW1lLCBvcHRpb25zKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmNsaWVudC5zZW5kT3BlcmF0aW9uUmVxdWVzdCh7IHNvdXJjZUNvbnRhaW5lck5hbWUsIG9wdGlvbnMgfSwgcmVuYW1lT3BlcmF0aW9uU3BlYyk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIFRoZSBCYXRjaCBvcGVyYXRpb24gYWxsb3dzIG11bHRpcGxlIEFQSSBjYWxscyB0byBiZSBlbWJlZGRlZCBpbnRvIGEgc2luZ2xlIEhUVFAgcmVxdWVzdC5cbiAgICAgKiBAcGFyYW0gY29udGVudExlbmd0aCBUaGUgbGVuZ3RoIG9mIHRoZSByZXF1ZXN0LlxuICAgICAqIEBwYXJhbSBtdWx0aXBhcnRDb250ZW50VHlwZSBSZXF1aXJlZC4gVGhlIHZhbHVlIG9mIHRoaXMgaGVhZGVyIG11c3QgYmUgbXVsdGlwYXJ0L21peGVkIHdpdGggYSBiYXRjaFxuICAgICAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib3VuZGFyeS4gRXhhbXBsZSBoZWFkZXIgdmFsdWU6IG11bHRpcGFydC9taXhlZDsgYm91bmRhcnk9YmF0Y2hfPEdVSUQ+XG4gICAgICogQHBhcmFtIGJvZHkgSW5pdGlhbCBkYXRhXG4gICAgICogQHBhcmFtIG9wdGlvbnMgVGhlIG9wdGlvbnMgcGFyYW1ldGVycy5cbiAgICAgKi9cbiAgICBzdWJtaXRCYXRjaChjb250ZW50TGVuZ3RoLCBtdWx0aXBhcnRDb250ZW50VHlwZSwgYm9keSwgb3B0aW9ucykge1xuICAgICAgICByZXR1cm4gdGhpcy5jbGllbnQuc2VuZE9wZXJhdGlvblJlcXVlc3QoeyBjb250ZW50TGVuZ3RoLCBtdWx0aXBhcnRDb250ZW50VHlwZSwgYm9keSwgb3B0aW9ucyB9LCBzdWJtaXRCYXRjaE9wZXJhdGlvblNwZWMpO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBUaGUgRmlsdGVyIEJsb2JzIG9wZXJhdGlvbiBlbmFibGVzIGNhbGxlcnMgdG8gbGlzdCBibG9icyBpbiBhIGNvbnRhaW5lciB3aG9zZSB0YWdzIG1hdGNoIGEgZ2l2ZW5cbiAgICAgKiBzZWFyY2ggZXhwcmVzc2lvbi4gIEZpbHRlciBibG9icyBzZWFyY2hlcyB3aXRoaW4gdGhlIGdpdmVuIGNvbnRhaW5lci5cbiAgICAgKiBAcGFyYW0gb3B0aW9ucyBUaGUgb3B0aW9ucyBwYXJhbWV0ZXJzLlxuICAgICAqL1xuICAgIGZpbHRlckJsb2JzKG9wdGlvbnMpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuY2xpZW50LnNlbmRPcGVyYXRpb25SZXF1ZXN0KHsgb3B0aW9ucyB9LCBmaWx0ZXJCbG9ic09wZXJhdGlvblNwZWMpO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBbVXBkYXRlXSBlc3RhYmxpc2hlcyBhbmQgbWFuYWdlcyBhIGxvY2sgb24gYSBjb250YWluZXIgZm9yIGRlbGV0ZSBvcGVyYXRpb25zLiBUaGUgbG9jayBkdXJhdGlvbiBjYW5cbiAgICAgKiBiZSAxNSB0byA2MCBzZWNvbmRzLCBvciBjYW4gYmUgaW5maW5pdGVcbiAgICAgKiBAcGFyYW0gb3B0aW9ucyBUaGUgb3B0aW9ucyBwYXJhbWV0ZXJzLlxuICAgICAqL1xuICAgIGFjcXVpcmVMZWFzZShvcHRpb25zKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmNsaWVudC5zZW5kT3BlcmF0aW9uUmVxdWVzdCh7IG9wdGlvbnMgfSwgYWNxdWlyZUxlYXNlT3BlcmF0aW9uU3BlYyQxKTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogW1VwZGF0ZV0gZXN0YWJsaXNoZXMgYW5kIG1hbmFnZXMgYSBsb2NrIG9uIGEgY29udGFpbmVyIGZvciBkZWxldGUgb3BlcmF0aW9ucy4gVGhlIGxvY2sgZHVyYXRpb24gY2FuXG4gICAgICogYmUgMTUgdG8gNjAgc2Vjb25kcywgb3IgY2FuIGJlIGluZmluaXRlXG4gICAgICogQHBhcmFtIGxlYXNlSWQgU3BlY2lmaWVzIHRoZSBjdXJyZW50IGxlYXNlIElEIG9uIHRoZSByZXNvdXJjZS5cbiAgICAgKiBAcGFyYW0gb3B0aW9ucyBUaGUgb3B0aW9ucyBwYXJhbWV0ZXJzLlxuICAgICAqL1xuICAgIHJlbGVhc2VMZWFzZShsZWFzZUlkLCBvcHRpb25zKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmNsaWVudC5zZW5kT3BlcmF0aW9uUmVxdWVzdCh7IGxlYXNlSWQsIG9wdGlvbnMgfSwgcmVsZWFzZUxlYXNlT3BlcmF0aW9uU3BlYyQxKTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogW1VwZGF0ZV0gZXN0YWJsaXNoZXMgYW5kIG1hbmFnZXMgYSBsb2NrIG9uIGEgY29udGFpbmVyIGZvciBkZWxldGUgb3BlcmF0aW9ucy4gVGhlIGxvY2sgZHVyYXRpb24gY2FuXG4gICAgICogYmUgMTUgdG8gNjAgc2Vjb25kcywgb3IgY2FuIGJlIGluZmluaXRlXG4gICAgICogQHBhcmFtIGxlYXNlSWQgU3BlY2lmaWVzIHRoZSBjdXJyZW50IGxlYXNlIElEIG9uIHRoZSByZXNvdXJjZS5cbiAgICAgKiBAcGFyYW0gb3B0aW9ucyBUaGUgb3B0aW9ucyBwYXJhbWV0ZXJzLlxuICAgICAqL1xuICAgIHJlbmV3TGVhc2UobGVhc2VJZCwgb3B0aW9ucykge1xuICAgICAgICByZXR1cm4gdGhpcy5jbGllbnQuc2VuZE9wZXJhdGlvblJlcXVlc3QoeyBsZWFzZUlkLCBvcHRpb25zIH0sIHJlbmV3TGVhc2VPcGVyYXRpb25TcGVjJDEpO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBbVXBkYXRlXSBlc3RhYmxpc2hlcyBhbmQgbWFuYWdlcyBhIGxvY2sgb24gYSBjb250YWluZXIgZm9yIGRlbGV0ZSBvcGVyYXRpb25zLiBUaGUgbG9jayBkdXJhdGlvbiBjYW5cbiAgICAgKiBiZSAxNSB0byA2MCBzZWNvbmRzLCBvciBjYW4gYmUgaW5maW5pdGVcbiAgICAgKiBAcGFyYW0gb3B0aW9ucyBUaGUgb3B0aW9ucyBwYXJhbWV0ZXJzLlxuICAgICAqL1xuICAgIGJyZWFrTGVhc2Uob3B0aW9ucykge1xuICAgICAgICByZXR1cm4gdGhpcy5jbGllbnQuc2VuZE9wZXJhdGlvblJlcXVlc3QoeyBvcHRpb25zIH0sIGJyZWFrTGVhc2VPcGVyYXRpb25TcGVjJDEpO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBbVXBkYXRlXSBlc3RhYmxpc2hlcyBhbmQgbWFuYWdlcyBhIGxvY2sgb24gYSBjb250YWluZXIgZm9yIGRlbGV0ZSBvcGVyYXRpb25zLiBUaGUgbG9jayBkdXJhdGlvbiBjYW5cbiAgICAgKiBiZSAxNSB0byA2MCBzZWNvbmRzLCBvciBjYW4gYmUgaW5maW5pdGVcbiAgICAgKiBAcGFyYW0gbGVhc2VJZCBTcGVjaWZpZXMgdGhlIGN1cnJlbnQgbGVhc2UgSUQgb24gdGhlIHJlc291cmNlLlxuICAgICAqIEBwYXJhbSBwcm9wb3NlZExlYXNlSWQgUHJvcG9zZWQgbGVhc2UgSUQsIGluIGEgR1VJRCBzdHJpbmcgZm9ybWF0LiBUaGUgQmxvYiBzZXJ2aWNlIHJldHVybnMgNDAwXG4gICAgICogICAgICAgICAgICAgICAgICAgICAgICAoSW52YWxpZCByZXF1ZXN0KSBpZiB0aGUgcHJvcG9zZWQgbGVhc2UgSUQgaXMgbm90IGluIHRoZSBjb3JyZWN0IGZvcm1hdC4gU2VlIEd1aWQgQ29uc3RydWN0b3JcbiAgICAgKiAgICAgICAgICAgICAgICAgICAgICAgIChTdHJpbmcpIGZvciBhIGxpc3Qgb2YgdmFsaWQgR1VJRCBzdHJpbmcgZm9ybWF0cy5cbiAgICAgKiBAcGFyYW0gb3B0aW9ucyBUaGUgb3B0aW9ucyBwYXJhbWV0ZXJzLlxuICAgICAqL1xuICAgIGNoYW5nZUxlYXNlKGxlYXNlSWQsIHByb3Bvc2VkTGVhc2VJZCwgb3B0aW9ucykge1xuICAgICAgICByZXR1cm4gdGhpcy5jbGllbnQuc2VuZE9wZXJhdGlvblJlcXVlc3QoeyBsZWFzZUlkLCBwcm9wb3NlZExlYXNlSWQsIG9wdGlvbnMgfSwgY2hhbmdlTGVhc2VPcGVyYXRpb25TcGVjJDEpO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBbVXBkYXRlXSBUaGUgTGlzdCBCbG9icyBvcGVyYXRpb24gcmV0dXJucyBhIGxpc3Qgb2YgdGhlIGJsb2JzIHVuZGVyIHRoZSBzcGVjaWZpZWQgY29udGFpbmVyXG4gICAgICogQHBhcmFtIG9wdGlvbnMgVGhlIG9wdGlvbnMgcGFyYW1ldGVycy5cbiAgICAgKi9cbiAgICBsaXN0QmxvYkZsYXRTZWdtZW50KG9wdGlvbnMpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuY2xpZW50LnNlbmRPcGVyYXRpb25SZXF1ZXN0KHsgb3B0aW9ucyB9LCBsaXN0QmxvYkZsYXRTZWdtZW50T3BlcmF0aW9uU3BlYyk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIFtVcGRhdGVdIFRoZSBMaXN0IEJsb2JzIG9wZXJhdGlvbiByZXR1cm5zIGEgbGlzdCBvZiB0aGUgYmxvYnMgdW5kZXIgdGhlIHNwZWNpZmllZCBjb250YWluZXJcbiAgICAgKiBAcGFyYW0gZGVsaW1pdGVyIFdoZW4gdGhlIHJlcXVlc3QgaW5jbHVkZXMgdGhpcyBwYXJhbWV0ZXIsIHRoZSBvcGVyYXRpb24gcmV0dXJucyBhIEJsb2JQcmVmaXhcbiAgICAgKiAgICAgICAgICAgICAgICAgIGVsZW1lbnQgaW4gdGhlIHJlc3BvbnNlIGJvZHkgdGhhdCBhY3RzIGFzIGEgcGxhY2Vob2xkZXIgZm9yIGFsbCBibG9icyB3aG9zZSBuYW1lcyBiZWdpbiB3aXRoIHRoZVxuICAgICAqICAgICAgICAgICAgICAgICAgc2FtZSBzdWJzdHJpbmcgdXAgdG8gdGhlIGFwcGVhcmFuY2Ugb2YgdGhlIGRlbGltaXRlciBjaGFyYWN0ZXIuIFRoZSBkZWxpbWl0ZXIgbWF5IGJlIGEgc2luZ2xlXG4gICAgICogICAgICAgICAgICAgICAgICBjaGFyYWN0ZXIgb3IgYSBzdHJpbmcuXG4gICAgICogQHBhcmFtIG9wdGlvbnMgVGhlIG9wdGlvbnMgcGFyYW1ldGVycy5cbiAgICAgKi9cbiAgICBsaXN0QmxvYkhpZXJhcmNoeVNlZ21lbnQoZGVsaW1pdGVyLCBvcHRpb25zKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmNsaWVudC5zZW5kT3BlcmF0aW9uUmVxdWVzdCh7IGRlbGltaXRlciwgb3B0aW9ucyB9LCBsaXN0QmxvYkhpZXJhcmNoeVNlZ21lbnRPcGVyYXRpb25TcGVjKTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogUmV0dXJucyB0aGUgc2t1IG5hbWUgYW5kIGFjY291bnQga2luZFxuICAgICAqIEBwYXJhbSBvcHRpb25zIFRoZSBvcHRpb25zIHBhcmFtZXRlcnMuXG4gICAgICovXG4gICAgZ2V0QWNjb3VudEluZm8ob3B0aW9ucykge1xuICAgICAgICByZXR1cm4gdGhpcy5jbGllbnQuc2VuZE9wZXJhdGlvblJlcXVlc3QoeyBvcHRpb25zIH0sIGdldEFjY291bnRJbmZvT3BlcmF0aW9uU3BlYyQxKTtcbiAgICB9XG59XG4vLyBPcGVyYXRpb24gU3BlY2lmaWNhdGlvbnNcbmNvbnN0IHhtbFNlcmlhbGl6ZXIkNCA9IGNvcmVDbGllbnRfX25hbWVzcGFjZS5jcmVhdGVTZXJpYWxpemVyKE1hcHBlcnMsIC8qIGlzWG1sICovIHRydWUpO1xuY29uc3QgY3JlYXRlT3BlcmF0aW9uU3BlYyQyID0ge1xuICAgIHBhdGg6IFwiL3tjb250YWluZXJOYW1lfVwiLFxuICAgIGh0dHBNZXRob2Q6IFwiUFVUXCIsXG4gICAgcmVzcG9uc2VzOiB7XG4gICAgICAgIDIwMToge1xuICAgICAgICAgICAgaGVhZGVyc01hcHBlcjogQ29udGFpbmVyQ3JlYXRlSGVhZGVycyxcbiAgICAgICAgfSxcbiAgICAgICAgZGVmYXVsdDoge1xuICAgICAgICAgICAgYm9keU1hcHBlcjogU3RvcmFnZUVycm9yLFxuICAgICAgICAgICAgaGVhZGVyc01hcHBlcjogQ29udGFpbmVyQ3JlYXRlRXhjZXB0aW9uSGVhZGVycyxcbiAgICAgICAgfSxcbiAgICB9LFxuICAgIHF1ZXJ5UGFyYW1ldGVyczogW3RpbWVvdXRJblNlY29uZHMsIHJlc3R5cGUyXSxcbiAgICB1cmxQYXJhbWV0ZXJzOiBbdXJsXSxcbiAgICBoZWFkZXJQYXJhbWV0ZXJzOiBbXG4gICAgICAgIHZlcnNpb24sXG4gICAgICAgIHJlcXVlc3RJZCxcbiAgICAgICAgYWNjZXB0MSxcbiAgICAgICAgbWV0YWRhdGEsXG4gICAgICAgIGFjY2VzcyxcbiAgICAgICAgZGVmYXVsdEVuY3J5cHRpb25TY29wZSxcbiAgICAgICAgcHJldmVudEVuY3J5cHRpb25TY29wZU92ZXJyaWRlLFxuICAgIF0sXG4gICAgaXNYTUw6IHRydWUsXG4gICAgc2VyaWFsaXplcjogeG1sU2VyaWFsaXplciQ0LFxufTtcbmNvbnN0IGdldFByb3BlcnRpZXNPcGVyYXRpb25TcGVjJDEgPSB7XG4gICAgcGF0aDogXCIve2NvbnRhaW5lck5hbWV9XCIsXG4gICAgaHR0cE1ldGhvZDogXCJHRVRcIixcbiAgICByZXNwb25zZXM6IHtcbiAgICAgICAgMjAwOiB7XG4gICAgICAgICAgICBoZWFkZXJzTWFwcGVyOiBDb250YWluZXJHZXRQcm9wZXJ0aWVzSGVhZGVycyxcbiAgICAgICAgfSxcbiAgICAgICAgZGVmYXVsdDoge1xuICAgICAgICAgICAgYm9keU1hcHBlcjogU3RvcmFnZUVycm9yLFxuICAgICAgICAgICAgaGVhZGVyc01hcHBlcjogQ29udGFpbmVyR2V0UHJvcGVydGllc0V4Y2VwdGlvbkhlYWRlcnMsXG4gICAgICAgIH0sXG4gICAgfSxcbiAgICBxdWVyeVBhcmFtZXRlcnM6IFt0aW1lb3V0SW5TZWNvbmRzLCByZXN0eXBlMl0sXG4gICAgdXJsUGFyYW1ldGVyczogW3VybF0sXG4gICAgaGVhZGVyUGFyYW1ldGVyczogW1xuICAgICAgICB2ZXJzaW9uLFxuICAgICAgICByZXF1ZXN0SWQsXG4gICAgICAgIGFjY2VwdDEsXG4gICAgICAgIGxlYXNlSWQsXG4gICAgXSxcbiAgICBpc1hNTDogdHJ1ZSxcbiAgICBzZXJpYWxpemVyOiB4bWxTZXJpYWxpemVyJDQsXG59O1xuY29uc3QgZGVsZXRlT3BlcmF0aW9uU3BlYyQxID0ge1xuICAgIHBhdGg6IFwiL3tjb250YWluZXJOYW1lfVwiLFxuICAgIGh0dHBNZXRob2Q6IFwiREVMRVRFXCIsXG4gICAgcmVzcG9uc2VzOiB7XG4gICAgICAgIDIwMjoge1xuICAgICAgICAgICAgaGVhZGVyc01hcHBlcjogQ29udGFpbmVyRGVsZXRlSGVhZGVycyxcbiAgICAgICAgfSxcbiAgICAgICAgZGVmYXVsdDoge1xuICAgICAgICAgICAgYm9keU1hcHBlcjogU3RvcmFnZUVycm9yLFxuICAgICAgICAgICAgaGVhZGVyc01hcHBlcjogQ29udGFpbmVyRGVsZXRlRXhjZXB0aW9uSGVhZGVycyxcbiAgICAgICAgfSxcbiAgICB9LFxuICAgIHF1ZXJ5UGFyYW1ldGVyczogW3RpbWVvdXRJblNlY29uZHMsIHJlc3R5cGUyXSxcbiAgICB1cmxQYXJhbWV0ZXJzOiBbdXJsXSxcbiAgICBoZWFkZXJQYXJhbWV0ZXJzOiBbXG4gICAgICAgIHZlcnNpb24sXG4gICAgICAgIHJlcXVlc3RJZCxcbiAgICAgICAgYWNjZXB0MSxcbiAgICAgICAgbGVhc2VJZCxcbiAgICAgICAgaWZNb2RpZmllZFNpbmNlLFxuICAgICAgICBpZlVubW9kaWZpZWRTaW5jZSxcbiAgICBdLFxuICAgIGlzWE1MOiB0cnVlLFxuICAgIHNlcmlhbGl6ZXI6IHhtbFNlcmlhbGl6ZXIkNCxcbn07XG5jb25zdCBzZXRNZXRhZGF0YU9wZXJhdGlvblNwZWMkMSA9IHtcbiAgICBwYXRoOiBcIi97Y29udGFpbmVyTmFtZX1cIixcbiAgICBodHRwTWV0aG9kOiBcIlBVVFwiLFxuICAgIHJlc3BvbnNlczoge1xuICAgICAgICAyMDA6IHtcbiAgICAgICAgICAgIGhlYWRlcnNNYXBwZXI6IENvbnRhaW5lclNldE1ldGFkYXRhSGVhZGVycyxcbiAgICAgICAgfSxcbiAgICAgICAgZGVmYXVsdDoge1xuICAgICAgICAgICAgYm9keU1hcHBlcjogU3RvcmFnZUVycm9yLFxuICAgICAgICAgICAgaGVhZGVyc01hcHBlcjogQ29udGFpbmVyU2V0TWV0YWRhdGFFeGNlcHRpb25IZWFkZXJzLFxuICAgICAgICB9LFxuICAgIH0sXG4gICAgcXVlcnlQYXJhbWV0ZXJzOiBbXG4gICAgICAgIHRpbWVvdXRJblNlY29uZHMsXG4gICAgICAgIHJlc3R5cGUyLFxuICAgICAgICBjb21wNixcbiAgICBdLFxuICAgIHVybFBhcmFtZXRlcnM6IFt1cmxdLFxuICAgIGhlYWRlclBhcmFtZXRlcnM6IFtcbiAgICAgICAgdmVyc2lvbixcbiAgICAgICAgcmVxdWVzdElkLFxuICAgICAgICBhY2NlcHQxLFxuICAgICAgICBtZXRhZGF0YSxcbiAgICAgICAgbGVhc2VJZCxcbiAgICAgICAgaWZNb2RpZmllZFNpbmNlLFxuICAgIF0sXG4gICAgaXNYTUw6IHRydWUsXG4gICAgc2VyaWFsaXplcjogeG1sU2VyaWFsaXplciQ0LFxufTtcbmNvbnN0IGdldEFjY2Vzc1BvbGljeU9wZXJhdGlvblNwZWMgPSB7XG4gICAgcGF0aDogXCIve2NvbnRhaW5lck5hbWV9XCIsXG4gICAgaHR0cE1ldGhvZDogXCJHRVRcIixcbiAgICByZXNwb25zZXM6IHtcbiAgICAgICAgMjAwOiB7XG4gICAgICAgICAgICBib2R5TWFwcGVyOiB7XG4gICAgICAgICAgICAgICAgdHlwZToge1xuICAgICAgICAgICAgICAgICAgICBuYW1lOiBcIlNlcXVlbmNlXCIsXG4gICAgICAgICAgICAgICAgICAgIGVsZW1lbnQ6IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHR5cGU6IHsgbmFtZTogXCJDb21wb3NpdGVcIiwgY2xhc3NOYW1lOiBcIlNpZ25lZElkZW50aWZpZXJcIiB9LFxuICAgICAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgc2VyaWFsaXplZE5hbWU6IFwiU2lnbmVkSWRlbnRpZmllcnNcIixcbiAgICAgICAgICAgICAgICB4bWxOYW1lOiBcIlNpZ25lZElkZW50aWZpZXJzXCIsXG4gICAgICAgICAgICAgICAgeG1sSXNXcmFwcGVkOiB0cnVlLFxuICAgICAgICAgICAgICAgIHhtbEVsZW1lbnROYW1lOiBcIlNpZ25lZElkZW50aWZpZXJcIixcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBoZWFkZXJzTWFwcGVyOiBDb250YWluZXJHZXRBY2Nlc3NQb2xpY3lIZWFkZXJzLFxuICAgICAgICB9LFxuICAgICAgICBkZWZhdWx0OiB7XG4gICAgICAgICAgICBib2R5TWFwcGVyOiBTdG9yYWdlRXJyb3IsXG4gICAgICAgICAgICBoZWFkZXJzTWFwcGVyOiBDb250YWluZXJHZXRBY2Nlc3NQb2xpY3lFeGNlcHRpb25IZWFkZXJzLFxuICAgICAgICB9LFxuICAgIH0sXG4gICAgcXVlcnlQYXJhbWV0ZXJzOiBbXG4gICAgICAgIHRpbWVvdXRJblNlY29uZHMsXG4gICAgICAgIHJlc3R5cGUyLFxuICAgICAgICBjb21wNyxcbiAgICBdLFxuICAgIHVybFBhcmFtZXRlcnM6IFt1cmxdLFxuICAgIGhlYWRlclBhcmFtZXRlcnM6IFtcbiAgICAgICAgdmVyc2lvbixcbiAgICAgICAgcmVxdWVzdElkLFxuICAgICAgICBhY2NlcHQxLFxuICAgICAgICBsZWFzZUlkLFxuICAgIF0sXG4gICAgaXNYTUw6IHRydWUsXG4gICAgc2VyaWFsaXplcjogeG1sU2VyaWFsaXplciQ0LFxufTtcbmNvbnN0IHNldEFjY2Vzc1BvbGljeU9wZXJhdGlvblNwZWMgPSB7XG4gICAgcGF0aDogXCIve2NvbnRhaW5lck5hbWV9XCIsXG4gICAgaHR0cE1ldGhvZDogXCJQVVRcIixcbiAgICByZXNwb25zZXM6IHtcbiAgICAgICAgMjAwOiB7XG4gICAgICAgICAgICBoZWFkZXJzTWFwcGVyOiBDb250YWluZXJTZXRBY2Nlc3NQb2xpY3lIZWFkZXJzLFxuICAgICAgICB9LFxuICAgICAgICBkZWZhdWx0OiB7XG4gICAgICAgICAgICBib2R5TWFwcGVyOiBTdG9yYWdlRXJyb3IsXG4gICAgICAgICAgICBoZWFkZXJzTWFwcGVyOiBDb250YWluZXJTZXRBY2Nlc3NQb2xpY3lFeGNlcHRpb25IZWFkZXJzLFxuICAgICAgICB9LFxuICAgIH0sXG4gICAgcmVxdWVzdEJvZHk6IGNvbnRhaW5lckFjbCxcbiAgICBxdWVyeVBhcmFtZXRlcnM6IFtcbiAgICAgICAgdGltZW91dEluU2Vjb25kcyxcbiAgICAgICAgcmVzdHlwZTIsXG4gICAgICAgIGNvbXA3LFxuICAgIF0sXG4gICAgdXJsUGFyYW1ldGVyczogW3VybF0sXG4gICAgaGVhZGVyUGFyYW1ldGVyczogW1xuICAgICAgICBjb250ZW50VHlwZSxcbiAgICAgICAgYWNjZXB0LFxuICAgICAgICB2ZXJzaW9uLFxuICAgICAgICByZXF1ZXN0SWQsXG4gICAgICAgIGFjY2VzcyxcbiAgICAgICAgbGVhc2VJZCxcbiAgICAgICAgaWZNb2RpZmllZFNpbmNlLFxuICAgICAgICBpZlVubW9kaWZpZWRTaW5jZSxcbiAgICBdLFxuICAgIGlzWE1MOiB0cnVlLFxuICAgIGNvbnRlbnRUeXBlOiBcImFwcGxpY2F0aW9uL3htbDsgY2hhcnNldD11dGYtOFwiLFxuICAgIG1lZGlhVHlwZTogXCJ4bWxcIixcbiAgICBzZXJpYWxpemVyOiB4bWxTZXJpYWxpemVyJDQsXG59O1xuY29uc3QgcmVzdG9yZU9wZXJhdGlvblNwZWMgPSB7XG4gICAgcGF0aDogXCIve2NvbnRhaW5lck5hbWV9XCIsXG4gICAgaHR0cE1ldGhvZDogXCJQVVRcIixcbiAgICByZXNwb25zZXM6IHtcbiAgICAgICAgMjAxOiB7XG4gICAgICAgICAgICBoZWFkZXJzTWFwcGVyOiBDb250YWluZXJSZXN0b3JlSGVhZGVycyxcbiAgICAgICAgfSxcbiAgICAgICAgZGVmYXVsdDoge1xuICAgICAgICAgICAgYm9keU1hcHBlcjogU3RvcmFnZUVycm9yLFxuICAgICAgICAgICAgaGVhZGVyc01hcHBlcjogQ29udGFpbmVyUmVzdG9yZUV4Y2VwdGlvbkhlYWRlcnMsXG4gICAgICAgIH0sXG4gICAgfSxcbiAgICBxdWVyeVBhcmFtZXRlcnM6IFtcbiAgICAgICAgdGltZW91dEluU2Vjb25kcyxcbiAgICAgICAgcmVzdHlwZTIsXG4gICAgICAgIGNvbXA4LFxuICAgIF0sXG4gICAgdXJsUGFyYW1ldGVyczogW3VybF0sXG4gICAgaGVhZGVyUGFyYW1ldGVyczogW1xuICAgICAgICB2ZXJzaW9uLFxuICAgICAgICByZXF1ZXN0SWQsXG4gICAgICAgIGFjY2VwdDEsXG4gICAgICAgIGRlbGV0ZWRDb250YWluZXJOYW1lLFxuICAgICAgICBkZWxldGVkQ29udGFpbmVyVmVyc2lvbixcbiAgICBdLFxuICAgIGlzWE1MOiB0cnVlLFxuICAgIHNlcmlhbGl6ZXI6IHhtbFNlcmlhbGl6ZXIkNCxcbn07XG5jb25zdCByZW5hbWVPcGVyYXRpb25TcGVjID0ge1xuICAgIHBhdGg6IFwiL3tjb250YWluZXJOYW1lfVwiLFxuICAgIGh0dHBNZXRob2Q6IFwiUFVUXCIsXG4gICAgcmVzcG9uc2VzOiB7XG4gICAgICAgIDIwMDoge1xuICAgICAgICAgICAgaGVhZGVyc01hcHBlcjogQ29udGFpbmVyUmVuYW1lSGVhZGVycyxcbiAgICAgICAgfSxcbiAgICAgICAgZGVmYXVsdDoge1xuICAgICAgICAgICAgYm9keU1hcHBlcjogU3RvcmFnZUVycm9yLFxuICAgICAgICAgICAgaGVhZGVyc01hcHBlcjogQ29udGFpbmVyUmVuYW1lRXhjZXB0aW9uSGVhZGVycyxcbiAgICAgICAgfSxcbiAgICB9LFxuICAgIHF1ZXJ5UGFyYW1ldGVyczogW1xuICAgICAgICB0aW1lb3V0SW5TZWNvbmRzLFxuICAgICAgICByZXN0eXBlMixcbiAgICAgICAgY29tcDksXG4gICAgXSxcbiAgICB1cmxQYXJhbWV0ZXJzOiBbdXJsXSxcbiAgICBoZWFkZXJQYXJhbWV0ZXJzOiBbXG4gICAgICAgIHZlcnNpb24sXG4gICAgICAgIHJlcXVlc3RJZCxcbiAgICAgICAgYWNjZXB0MSxcbiAgICAgICAgc291cmNlQ29udGFpbmVyTmFtZSxcbiAgICAgICAgc291cmNlTGVhc2VJZCxcbiAgICBdLFxuICAgIGlzWE1MOiB0cnVlLFxuICAgIHNlcmlhbGl6ZXI6IHhtbFNlcmlhbGl6ZXIkNCxcbn07XG5jb25zdCBzdWJtaXRCYXRjaE9wZXJhdGlvblNwZWMgPSB7XG4gICAgcGF0aDogXCIve2NvbnRhaW5lck5hbWV9XCIsXG4gICAgaHR0cE1ldGhvZDogXCJQT1NUXCIsXG4gICAgcmVzcG9uc2VzOiB7XG4gICAgICAgIDIwMjoge1xuICAgICAgICAgICAgYm9keU1hcHBlcjoge1xuICAgICAgICAgICAgICAgIHR5cGU6IHsgbmFtZTogXCJTdHJlYW1cIiB9LFxuICAgICAgICAgICAgICAgIHNlcmlhbGl6ZWROYW1lOiBcInBhcnNlZFJlc3BvbnNlXCIsXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgaGVhZGVyc01hcHBlcjogQ29udGFpbmVyU3VibWl0QmF0Y2hIZWFkZXJzLFxuICAgICAgICB9LFxuICAgICAgICBkZWZhdWx0OiB7XG4gICAgICAgICAgICBib2R5TWFwcGVyOiBTdG9yYWdlRXJyb3IsXG4gICAgICAgICAgICBoZWFkZXJzTWFwcGVyOiBDb250YWluZXJTdWJtaXRCYXRjaEV4Y2VwdGlvbkhlYWRlcnMsXG4gICAgICAgIH0sXG4gICAgfSxcbiAgICByZXF1ZXN0Qm9keTogYm9keSxcbiAgICBxdWVyeVBhcmFtZXRlcnM6IFtcbiAgICAgICAgdGltZW91dEluU2Vjb25kcyxcbiAgICAgICAgY29tcDQsXG4gICAgICAgIHJlc3R5cGUyLFxuICAgIF0sXG4gICAgdXJsUGFyYW1ldGVyczogW3VybF0sXG4gICAgaGVhZGVyUGFyYW1ldGVyczogW1xuICAgICAgICBhY2NlcHQsXG4gICAgICAgIHZlcnNpb24sXG4gICAgICAgIHJlcXVlc3RJZCxcbiAgICAgICAgY29udGVudExlbmd0aCxcbiAgICAgICAgbXVsdGlwYXJ0Q29udGVudFR5cGUsXG4gICAgXSxcbiAgICBpc1hNTDogdHJ1ZSxcbiAgICBjb250ZW50VHlwZTogXCJhcHBsaWNhdGlvbi94bWw7IGNoYXJzZXQ9dXRmLThcIixcbiAgICBtZWRpYVR5cGU6IFwieG1sXCIsXG4gICAgc2VyaWFsaXplcjogeG1sU2VyaWFsaXplciQ0LFxufTtcbmNvbnN0IGZpbHRlckJsb2JzT3BlcmF0aW9uU3BlYyA9IHtcbiAgICBwYXRoOiBcIi97Y29udGFpbmVyTmFtZX1cIixcbiAgICBodHRwTWV0aG9kOiBcIkdFVFwiLFxuICAgIHJlc3BvbnNlczoge1xuICAgICAgICAyMDA6IHtcbiAgICAgICAgICAgIGJvZHlNYXBwZXI6IEZpbHRlckJsb2JTZWdtZW50LFxuICAgICAgICAgICAgaGVhZGVyc01hcHBlcjogQ29udGFpbmVyRmlsdGVyQmxvYnNIZWFkZXJzLFxuICAgICAgICB9LFxuICAgICAgICBkZWZhdWx0OiB7XG4gICAgICAgICAgICBib2R5TWFwcGVyOiBTdG9yYWdlRXJyb3IsXG4gICAgICAgICAgICBoZWFkZXJzTWFwcGVyOiBDb250YWluZXJGaWx0ZXJCbG9ic0V4Y2VwdGlvbkhlYWRlcnMsXG4gICAgICAgIH0sXG4gICAgfSxcbiAgICBxdWVyeVBhcmFtZXRlcnM6IFtcbiAgICAgICAgdGltZW91dEluU2Vjb25kcyxcbiAgICAgICAgbWFya2VyLFxuICAgICAgICBtYXhQYWdlU2l6ZSxcbiAgICAgICAgY29tcDUsXG4gICAgICAgIHdoZXJlLFxuICAgICAgICByZXN0eXBlMixcbiAgICBdLFxuICAgIHVybFBhcmFtZXRlcnM6IFt1cmxdLFxuICAgIGhlYWRlclBhcmFtZXRlcnM6IFtcbiAgICAgICAgdmVyc2lvbixcbiAgICAgICAgcmVxdWVzdElkLFxuICAgICAgICBhY2NlcHQxLFxuICAgIF0sXG4gICAgaXNYTUw6IHRydWUsXG4gICAgc2VyaWFsaXplcjogeG1sU2VyaWFsaXplciQ0LFxufTtcbmNvbnN0IGFjcXVpcmVMZWFzZU9wZXJhdGlvblNwZWMkMSA9IHtcbiAgICBwYXRoOiBcIi97Y29udGFpbmVyTmFtZX1cIixcbiAgICBodHRwTWV0aG9kOiBcIlBVVFwiLFxuICAgIHJlc3BvbnNlczoge1xuICAgICAgICAyMDE6IHtcbiAgICAgICAgICAgIGhlYWRlcnNNYXBwZXI6IENvbnRhaW5lckFjcXVpcmVMZWFzZUhlYWRlcnMsXG4gICAgICAgIH0sXG4gICAgICAgIGRlZmF1bHQ6IHtcbiAgICAgICAgICAgIGJvZHlNYXBwZXI6IFN0b3JhZ2VFcnJvcixcbiAgICAgICAgICAgIGhlYWRlcnNNYXBwZXI6IENvbnRhaW5lckFjcXVpcmVMZWFzZUV4Y2VwdGlvbkhlYWRlcnMsXG4gICAgICAgIH0sXG4gICAgfSxcbiAgICBxdWVyeVBhcmFtZXRlcnM6IFtcbiAgICAgICAgdGltZW91dEluU2Vjb25kcyxcbiAgICAgICAgcmVzdHlwZTIsXG4gICAgICAgIGNvbXAxMCxcbiAgICBdLFxuICAgIHVybFBhcmFtZXRlcnM6IFt1cmxdLFxuICAgIGhlYWRlclBhcmFtZXRlcnM6IFtcbiAgICAgICAgdmVyc2lvbixcbiAgICAgICAgcmVxdWVzdElkLFxuICAgICAgICBhY2NlcHQxLFxuICAgICAgICBpZk1vZGlmaWVkU2luY2UsXG4gICAgICAgIGlmVW5tb2RpZmllZFNpbmNlLFxuICAgICAgICBhY3Rpb24sXG4gICAgICAgIGR1cmF0aW9uLFxuICAgICAgICBwcm9wb3NlZExlYXNlSWQsXG4gICAgXSxcbiAgICBpc1hNTDogdHJ1ZSxcbiAgICBzZXJpYWxpemVyOiB4bWxTZXJpYWxpemVyJDQsXG59O1xuY29uc3QgcmVsZWFzZUxlYXNlT3BlcmF0aW9uU3BlYyQxID0ge1xuICAgIHBhdGg6IFwiL3tjb250YWluZXJOYW1lfVwiLFxuICAgIGh0dHBNZXRob2Q6IFwiUFVUXCIsXG4gICAgcmVzcG9uc2VzOiB7XG4gICAgICAgIDIwMDoge1xuICAgICAgICAgICAgaGVhZGVyc01hcHBlcjogQ29udGFpbmVyUmVsZWFzZUxlYXNlSGVhZGVycyxcbiAgICAgICAgfSxcbiAgICAgICAgZGVmYXVsdDoge1xuICAgICAgICAgICAgYm9keU1hcHBlcjogU3RvcmFnZUVycm9yLFxuICAgICAgICAgICAgaGVhZGVyc01hcHBlcjogQ29udGFpbmVyUmVsZWFzZUxlYXNlRXhjZXB0aW9uSGVhZGVycyxcbiAgICAgICAgfSxcbiAgICB9LFxuICAgIHF1ZXJ5UGFyYW1ldGVyczogW1xuICAgICAgICB0aW1lb3V0SW5TZWNvbmRzLFxuICAgICAgICByZXN0eXBlMixcbiAgICAgICAgY29tcDEwLFxuICAgIF0sXG4gICAgdXJsUGFyYW1ldGVyczogW3VybF0sXG4gICAgaGVhZGVyUGFyYW1ldGVyczogW1xuICAgICAgICB2ZXJzaW9uLFxuICAgICAgICByZXF1ZXN0SWQsXG4gICAgICAgIGFjY2VwdDEsXG4gICAgICAgIGlmTW9kaWZpZWRTaW5jZSxcbiAgICAgICAgaWZVbm1vZGlmaWVkU2luY2UsXG4gICAgICAgIGFjdGlvbjEsXG4gICAgICAgIGxlYXNlSWQxLFxuICAgIF0sXG4gICAgaXNYTUw6IHRydWUsXG4gICAgc2VyaWFsaXplcjogeG1sU2VyaWFsaXplciQ0LFxufTtcbmNvbnN0IHJlbmV3TGVhc2VPcGVyYXRpb25TcGVjJDEgPSB7XG4gICAgcGF0aDogXCIve2NvbnRhaW5lck5hbWV9XCIsXG4gICAgaHR0cE1ldGhvZDogXCJQVVRcIixcbiAgICByZXNwb25zZXM6IHtcbiAgICAgICAgMjAwOiB7XG4gICAgICAgICAgICBoZWFkZXJzTWFwcGVyOiBDb250YWluZXJSZW5ld0xlYXNlSGVhZGVycyxcbiAgICAgICAgfSxcbiAgICAgICAgZGVmYXVsdDoge1xuICAgICAgICAgICAgYm9keU1hcHBlcjogU3RvcmFnZUVycm9yLFxuICAgICAgICAgICAgaGVhZGVyc01hcHBlcjogQ29udGFpbmVyUmVuZXdMZWFzZUV4Y2VwdGlvbkhlYWRlcnMsXG4gICAgICAgIH0sXG4gICAgfSxcbiAgICBxdWVyeVBhcmFtZXRlcnM6IFtcbiAgICAgICAgdGltZW91dEluU2Vjb25kcyxcbiAgICAgICAgcmVzdHlwZTIsXG4gICAgICAgIGNvbXAxMCxcbiAgICBdLFxuICAgIHVybFBhcmFtZXRlcnM6IFt1cmxdLFxuICAgIGhlYWRlclBhcmFtZXRlcnM6IFtcbiAgICAgICAgdmVyc2lvbixcbiAgICAgICAgcmVxdWVzdElkLFxuICAgICAgICBhY2NlcHQxLFxuICAgICAgICBpZk1vZGlmaWVkU2luY2UsXG4gICAgICAgIGlmVW5tb2RpZmllZFNpbmNlLFxuICAgICAgICBsZWFzZUlkMSxcbiAgICAgICAgYWN0aW9uMixcbiAgICBdLFxuICAgIGlzWE1MOiB0cnVlLFxuICAgIHNlcmlhbGl6ZXI6IHhtbFNlcmlhbGl6ZXIkNCxcbn07XG5jb25zdCBicmVha0xlYXNlT3BlcmF0aW9uU3BlYyQxID0ge1xuICAgIHBhdGg6IFwiL3tjb250YWluZXJOYW1lfVwiLFxuICAgIGh0dHBNZXRob2Q6IFwiUFVUXCIsXG4gICAgcmVzcG9uc2VzOiB7XG4gICAgICAgIDIwMjoge1xuICAgICAgICAgICAgaGVhZGVyc01hcHBlcjogQ29udGFpbmVyQnJlYWtMZWFzZUhlYWRlcnMsXG4gICAgICAgIH0sXG4gICAgICAgIGRlZmF1bHQ6IHtcbiAgICAgICAgICAgIGJvZHlNYXBwZXI6IFN0b3JhZ2VFcnJvcixcbiAgICAgICAgICAgIGhlYWRlcnNNYXBwZXI6IENvbnRhaW5lckJyZWFrTGVhc2VFeGNlcHRpb25IZWFkZXJzLFxuICAgICAgICB9LFxuICAgIH0sXG4gICAgcXVlcnlQYXJhbWV0ZXJzOiBbXG4gICAgICAgIHRpbWVvdXRJblNlY29uZHMsXG4gICAgICAgIHJlc3R5cGUyLFxuICAgICAgICBjb21wMTAsXG4gICAgXSxcbiAgICB1cmxQYXJhbWV0ZXJzOiBbdXJsXSxcbiAgICBoZWFkZXJQYXJhbWV0ZXJzOiBbXG4gICAgICAgIHZlcnNpb24sXG4gICAgICAgIHJlcXVlc3RJZCxcbiAgICAgICAgYWNjZXB0MSxcbiAgICAgICAgaWZNb2RpZmllZFNpbmNlLFxuICAgICAgICBpZlVubW9kaWZpZWRTaW5jZSxcbiAgICAgICAgYWN0aW9uMyxcbiAgICAgICAgYnJlYWtQZXJpb2QsXG4gICAgXSxcbiAgICBpc1hNTDogdHJ1ZSxcbiAgICBzZXJpYWxpemVyOiB4bWxTZXJpYWxpemVyJDQsXG59O1xuY29uc3QgY2hhbmdlTGVhc2VPcGVyYXRpb25TcGVjJDEgPSB7XG4gICAgcGF0aDogXCIve2NvbnRhaW5lck5hbWV9XCIsXG4gICAgaHR0cE1ldGhvZDogXCJQVVRcIixcbiAgICByZXNwb25zZXM6IHtcbiAgICAgICAgMjAwOiB7XG4gICAgICAgICAgICBoZWFkZXJzTWFwcGVyOiBDb250YWluZXJDaGFuZ2VMZWFzZUhlYWRlcnMsXG4gICAgICAgIH0sXG4gICAgICAgIGRlZmF1bHQ6IHtcbiAgICAgICAgICAgIGJvZHlNYXBwZXI6IFN0b3JhZ2VFcnJvcixcbiAgICAgICAgICAgIGhlYWRlcnNNYXBwZXI6IENvbnRhaW5lckNoYW5nZUxlYXNlRXhjZXB0aW9uSGVhZGVycyxcbiAgICAgICAgfSxcbiAgICB9LFxuICAgIHF1ZXJ5UGFyYW1ldGVyczogW1xuICAgICAgICB0aW1lb3V0SW5TZWNvbmRzLFxuICAgICAgICByZXN0eXBlMixcbiAgICAgICAgY29tcDEwLFxuICAgIF0sXG4gICAgdXJsUGFyYW1ldGVyczogW3VybF0sXG4gICAgaGVhZGVyUGFyYW1ldGVyczogW1xuICAgICAgICB2ZXJzaW9uLFxuICAgICAgICByZXF1ZXN0SWQsXG4gICAgICAgIGFjY2VwdDEsXG4gICAgICAgIGlmTW9kaWZpZWRTaW5jZSxcbiAgICAgICAgaWZVbm1vZGlmaWVkU2luY2UsXG4gICAgICAgIGxlYXNlSWQxLFxuICAgICAgICBhY3Rpb240LFxuICAgICAgICBwcm9wb3NlZExlYXNlSWQxLFxuICAgIF0sXG4gICAgaXNYTUw6IHRydWUsXG4gICAgc2VyaWFsaXplcjogeG1sU2VyaWFsaXplciQ0LFxufTtcbmNvbnN0IGxpc3RCbG9iRmxhdFNlZ21lbnRPcGVyYXRpb25TcGVjID0ge1xuICAgIHBhdGg6IFwiL3tjb250YWluZXJOYW1lfVwiLFxuICAgIGh0dHBNZXRob2Q6IFwiR0VUXCIsXG4gICAgcmVzcG9uc2VzOiB7XG4gICAgICAgIDIwMDoge1xuICAgICAgICAgICAgYm9keU1hcHBlcjogTGlzdEJsb2JzRmxhdFNlZ21lbnRSZXNwb25zZSxcbiAgICAgICAgICAgIGhlYWRlcnNNYXBwZXI6IENvbnRhaW5lckxpc3RCbG9iRmxhdFNlZ21lbnRIZWFkZXJzLFxuICAgICAgICB9LFxuICAgICAgICBkZWZhdWx0OiB7XG4gICAgICAgICAgICBib2R5TWFwcGVyOiBTdG9yYWdlRXJyb3IsXG4gICAgICAgICAgICBoZWFkZXJzTWFwcGVyOiBDb250YWluZXJMaXN0QmxvYkZsYXRTZWdtZW50RXhjZXB0aW9uSGVhZGVycyxcbiAgICAgICAgfSxcbiAgICB9LFxuICAgIHF1ZXJ5UGFyYW1ldGVyczogW1xuICAgICAgICB0aW1lb3V0SW5TZWNvbmRzLFxuICAgICAgICBjb21wMixcbiAgICAgICAgcHJlZml4LFxuICAgICAgICBtYXJrZXIsXG4gICAgICAgIG1heFBhZ2VTaXplLFxuICAgICAgICByZXN0eXBlMixcbiAgICAgICAgaW5jbHVkZTEsXG4gICAgXSxcbiAgICB1cmxQYXJhbWV0ZXJzOiBbdXJsXSxcbiAgICBoZWFkZXJQYXJhbWV0ZXJzOiBbXG4gICAgICAgIHZlcnNpb24sXG4gICAgICAgIHJlcXVlc3RJZCxcbiAgICAgICAgYWNjZXB0MSxcbiAgICBdLFxuICAgIGlzWE1MOiB0cnVlLFxuICAgIHNlcmlhbGl6ZXI6IHhtbFNlcmlhbGl6ZXIkNCxcbn07XG5jb25zdCBsaXN0QmxvYkhpZXJhcmNoeVNlZ21lbnRPcGVyYXRpb25TcGVjID0ge1xuICAgIHBhdGg6IFwiL3tjb250YWluZXJOYW1lfVwiLFxuICAgIGh0dHBNZXRob2Q6IFwiR0VUXCIsXG4gICAgcmVzcG9uc2VzOiB7XG4gICAgICAgIDIwMDoge1xuICAgICAgICAgICAgYm9keU1hcHBlcjogTGlzdEJsb2JzSGllcmFyY2h5U2VnbWVudFJlc3BvbnNlLFxuICAgICAgICAgICAgaGVhZGVyc01hcHBlcjogQ29udGFpbmVyTGlzdEJsb2JIaWVyYXJjaHlTZWdtZW50SGVhZGVycyxcbiAgICAgICAgfSxcbiAgICAgICAgZGVmYXVsdDoge1xuICAgICAgICAgICAgYm9keU1hcHBlcjogU3RvcmFnZUVycm9yLFxuICAgICAgICAgICAgaGVhZGVyc01hcHBlcjogQ29udGFpbmVyTGlzdEJsb2JIaWVyYXJjaHlTZWdtZW50RXhjZXB0aW9uSGVhZGVycyxcbiAgICAgICAgfSxcbiAgICB9LFxuICAgIHF1ZXJ5UGFyYW1ldGVyczogW1xuICAgICAgICB0aW1lb3V0SW5TZWNvbmRzLFxuICAgICAgICBjb21wMixcbiAgICAgICAgcHJlZml4LFxuICAgICAgICBtYXJrZXIsXG4gICAgICAgIG1heFBhZ2VTaXplLFxuICAgICAgICByZXN0eXBlMixcbiAgICAgICAgaW5jbHVkZTEsXG4gICAgICAgIGRlbGltaXRlcixcbiAgICBdLFxuICAgIHVybFBhcmFtZXRlcnM6IFt1cmxdLFxuICAgIGhlYWRlclBhcmFtZXRlcnM6IFtcbiAgICAgICAgdmVyc2lvbixcbiAgICAgICAgcmVxdWVzdElkLFxuICAgICAgICBhY2NlcHQxLFxuICAgIF0sXG4gICAgaXNYTUw6IHRydWUsXG4gICAgc2VyaWFsaXplcjogeG1sU2VyaWFsaXplciQ0LFxufTtcbmNvbnN0IGdldEFjY291bnRJbmZvT3BlcmF0aW9uU3BlYyQxID0ge1xuICAgIHBhdGg6IFwiL3tjb250YWluZXJOYW1lfVwiLFxuICAgIGh0dHBNZXRob2Q6IFwiR0VUXCIsXG4gICAgcmVzcG9uc2VzOiB7XG4gICAgICAgIDIwMDoge1xuICAgICAgICAgICAgaGVhZGVyc01hcHBlcjogQ29udGFpbmVyR2V0QWNjb3VudEluZm9IZWFkZXJzLFxuICAgICAgICB9LFxuICAgICAgICBkZWZhdWx0OiB7XG4gICAgICAgICAgICBib2R5TWFwcGVyOiBTdG9yYWdlRXJyb3IsXG4gICAgICAgICAgICBoZWFkZXJzTWFwcGVyOiBDb250YWluZXJHZXRBY2NvdW50SW5mb0V4Y2VwdGlvbkhlYWRlcnMsXG4gICAgICAgIH0sXG4gICAgfSxcbiAgICBxdWVyeVBhcmFtZXRlcnM6IFtcbiAgICAgICAgY29tcCxcbiAgICAgICAgdGltZW91dEluU2Vjb25kcyxcbiAgICAgICAgcmVzdHlwZTEsXG4gICAgXSxcbiAgICB1cmxQYXJhbWV0ZXJzOiBbdXJsXSxcbiAgICBoZWFkZXJQYXJhbWV0ZXJzOiBbXG4gICAgICAgIHZlcnNpb24sXG4gICAgICAgIHJlcXVlc3RJZCxcbiAgICAgICAgYWNjZXB0MSxcbiAgICBdLFxuICAgIGlzWE1MOiB0cnVlLFxuICAgIHNlcmlhbGl6ZXI6IHhtbFNlcmlhbGl6ZXIkNCxcbn07XG5cbi8qXG4gKiBDb3B5cmlnaHQgKGMpIE1pY3Jvc29mdCBDb3Jwb3JhdGlvbi5cbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBNSVQgTGljZW5zZS5cbiAqXG4gKiBDb2RlIGdlbmVyYXRlZCBieSBNaWNyb3NvZnQgKFIpIEF1dG9SZXN0IENvZGUgR2VuZXJhdG9yLlxuICogQ2hhbmdlcyBtYXkgY2F1c2UgaW5jb3JyZWN0IGJlaGF2aW9yIGFuZCB3aWxsIGJlIGxvc3QgaWYgdGhlIGNvZGUgaXMgcmVnZW5lcmF0ZWQuXG4gKi9cbi8qKiBDbGFzcyBjb250YWluaW5nIEJsb2Igb3BlcmF0aW9ucy4gKi9cbmNsYXNzIEJsb2JJbXBsIHtcbiAgICAvKipcbiAgICAgKiBJbml0aWFsaXplIGEgbmV3IGluc3RhbmNlIG9mIHRoZSBjbGFzcyBCbG9iIGNsYXNzLlxuICAgICAqIEBwYXJhbSBjbGllbnQgUmVmZXJlbmNlIHRvIHRoZSBzZXJ2aWNlIGNsaWVudFxuICAgICAqL1xuICAgIGNvbnN0cnVjdG9yKGNsaWVudCkge1xuICAgICAgICB0aGlzLmNsaWVudCA9IGNsaWVudDtcbiAgICB9XG4gICAgLyoqXG4gICAgICogVGhlIERvd25sb2FkIG9wZXJhdGlvbiByZWFkcyBvciBkb3dubG9hZHMgYSBibG9iIGZyb20gdGhlIHN5c3RlbSwgaW5jbHVkaW5nIGl0cyBtZXRhZGF0YSBhbmRcbiAgICAgKiBwcm9wZXJ0aWVzLiBZb3UgY2FuIGFsc28gY2FsbCBEb3dubG9hZCB0byByZWFkIGEgc25hcHNob3QuXG4gICAgICogQHBhcmFtIG9wdGlvbnMgVGhlIG9wdGlvbnMgcGFyYW1ldGVycy5cbiAgICAgKi9cbiAgICBkb3dubG9hZChvcHRpb25zKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmNsaWVudC5zZW5kT3BlcmF0aW9uUmVxdWVzdCh7IG9wdGlvbnMgfSwgZG93bmxvYWRPcGVyYXRpb25TcGVjKTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogVGhlIEdldCBQcm9wZXJ0aWVzIG9wZXJhdGlvbiByZXR1cm5zIGFsbCB1c2VyLWRlZmluZWQgbWV0YWRhdGEsIHN0YW5kYXJkIEhUVFAgcHJvcGVydGllcywgYW5kIHN5c3RlbVxuICAgICAqIHByb3BlcnRpZXMgZm9yIHRoZSBibG9iLiBJdCBkb2VzIG5vdCByZXR1cm4gdGhlIGNvbnRlbnQgb2YgdGhlIGJsb2IuXG4gICAgICogQHBhcmFtIG9wdGlvbnMgVGhlIG9wdGlvbnMgcGFyYW1ldGVycy5cbiAgICAgKi9cbiAgICBnZXRQcm9wZXJ0aWVzKG9wdGlvbnMpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuY2xpZW50LnNlbmRPcGVyYXRpb25SZXF1ZXN0KHsgb3B0aW9ucyB9LCBnZXRQcm9wZXJ0aWVzT3BlcmF0aW9uU3BlYyk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIElmIHRoZSBzdG9yYWdlIGFjY291bnQncyBzb2Z0IGRlbGV0ZSBmZWF0dXJlIGlzIGRpc2FibGVkIHRoZW4sIHdoZW4gYSBibG9iIGlzIGRlbGV0ZWQsIGl0IGlzXG4gICAgICogcGVybWFuZW50bHkgcmVtb3ZlZCBmcm9tIHRoZSBzdG9yYWdlIGFjY291bnQuIElmIHRoZSBzdG9yYWdlIGFjY291bnQncyBzb2Z0IGRlbGV0ZSBmZWF0dXJlIGlzXG4gICAgICogZW5hYmxlZCwgdGhlbiwgd2hlbiBhIGJsb2IgaXMgZGVsZXRlZCwgaXQgaXMgbWFya2VkIGZvciBkZWxldGlvbiBhbmQgYmVjb21lcyBpbmFjY2Vzc2libGVcbiAgICAgKiBpbW1lZGlhdGVseS4gSG93ZXZlciwgdGhlIGJsb2Igc2VydmljZSByZXRhaW5zIHRoZSBibG9iIG9yIHNuYXBzaG90IGZvciB0aGUgbnVtYmVyIG9mIGRheXMgc3BlY2lmaWVkXG4gICAgICogYnkgdGhlIERlbGV0ZVJldGVudGlvblBvbGljeSBzZWN0aW9uIG9mIFtTdG9yYWdlIHNlcnZpY2UgcHJvcGVydGllc11cbiAgICAgKiAoU2V0LUJsb2ItU2VydmljZS1Qcm9wZXJ0aWVzLm1kKS4gQWZ0ZXIgdGhlIHNwZWNpZmllZCBudW1iZXIgb2YgZGF5cyBoYXMgcGFzc2VkLCB0aGUgYmxvYidzIGRhdGEgaXNcbiAgICAgKiBwZXJtYW5lbnRseSByZW1vdmVkIGZyb20gdGhlIHN0b3JhZ2UgYWNjb3VudC4gTm90ZSB0aGF0IHlvdSBjb250aW51ZSB0byBiZSBjaGFyZ2VkIGZvciB0aGVcbiAgICAgKiBzb2Z0LWRlbGV0ZWQgYmxvYidzIHN0b3JhZ2UgdW50aWwgaXQgaXMgcGVybWFuZW50bHkgcmVtb3ZlZC4gVXNlIHRoZSBMaXN0IEJsb2JzIEFQSSBhbmQgc3BlY2lmeSB0aGVcbiAgICAgKiBcImluY2x1ZGU9ZGVsZXRlZFwiIHF1ZXJ5IHBhcmFtZXRlciB0byBkaXNjb3ZlciB3aGljaCBibG9icyBhbmQgc25hcHNob3RzIGhhdmUgYmVlbiBzb2Z0IGRlbGV0ZWQuIFlvdVxuICAgICAqIGNhbiB0aGVuIHVzZSB0aGUgVW5kZWxldGUgQmxvYiBBUEkgdG8gcmVzdG9yZSBhIHNvZnQtZGVsZXRlZCBibG9iLiBBbGwgb3RoZXIgb3BlcmF0aW9ucyBvbiBhXG4gICAgICogc29mdC1kZWxldGVkIGJsb2Igb3Igc25hcHNob3QgY2F1c2VzIHRoZSBzZXJ2aWNlIHRvIHJldHVybiBhbiBIVFRQIHN0YXR1cyBjb2RlIG9mIDQwNFxuICAgICAqIChSZXNvdXJjZU5vdEZvdW5kKS5cbiAgICAgKiBAcGFyYW0gb3B0aW9ucyBUaGUgb3B0aW9ucyBwYXJhbWV0ZXJzLlxuICAgICAqL1xuICAgIGRlbGV0ZShvcHRpb25zKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmNsaWVudC5zZW5kT3BlcmF0aW9uUmVxdWVzdCh7IG9wdGlvbnMgfSwgZGVsZXRlT3BlcmF0aW9uU3BlYyk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIFVuZGVsZXRlIGEgYmxvYiB0aGF0IHdhcyBwcmV2aW91c2x5IHNvZnQgZGVsZXRlZFxuICAgICAqIEBwYXJhbSBvcHRpb25zIFRoZSBvcHRpb25zIHBhcmFtZXRlcnMuXG4gICAgICovXG4gICAgdW5kZWxldGUob3B0aW9ucykge1xuICAgICAgICByZXR1cm4gdGhpcy5jbGllbnQuc2VuZE9wZXJhdGlvblJlcXVlc3QoeyBvcHRpb25zIH0sIHVuZGVsZXRlT3BlcmF0aW9uU3BlYyk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIFNldHMgdGhlIHRpbWUgYSBibG9iIHdpbGwgZXhwaXJlIGFuZCBiZSBkZWxldGVkLlxuICAgICAqIEBwYXJhbSBleHBpcnlPcHRpb25zIFJlcXVpcmVkLiBJbmRpY2F0ZXMgbW9kZSBvZiB0aGUgZXhwaXJ5IHRpbWVcbiAgICAgKiBAcGFyYW0gb3B0aW9ucyBUaGUgb3B0aW9ucyBwYXJhbWV0ZXJzLlxuICAgICAqL1xuICAgIHNldEV4cGlyeShleHBpcnlPcHRpb25zLCBvcHRpb25zKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmNsaWVudC5zZW5kT3BlcmF0aW9uUmVxdWVzdCh7IGV4cGlyeU9wdGlvbnMsIG9wdGlvbnMgfSwgc2V0RXhwaXJ5T3BlcmF0aW9uU3BlYyk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIFRoZSBTZXQgSFRUUCBIZWFkZXJzIG9wZXJhdGlvbiBzZXRzIHN5c3RlbSBwcm9wZXJ0aWVzIG9uIHRoZSBibG9iXG4gICAgICogQHBhcmFtIG9wdGlvbnMgVGhlIG9wdGlvbnMgcGFyYW1ldGVycy5cbiAgICAgKi9cbiAgICBzZXRIdHRwSGVhZGVycyhvcHRpb25zKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmNsaWVudC5zZW5kT3BlcmF0aW9uUmVxdWVzdCh7IG9wdGlvbnMgfSwgc2V0SHR0cEhlYWRlcnNPcGVyYXRpb25TcGVjKTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogVGhlIFNldCBJbW11dGFiaWxpdHkgUG9saWN5IG9wZXJhdGlvbiBzZXRzIHRoZSBpbW11dGFiaWxpdHkgcG9saWN5IG9uIHRoZSBibG9iXG4gICAgICogQHBhcmFtIG9wdGlvbnMgVGhlIG9wdGlvbnMgcGFyYW1ldGVycy5cbiAgICAgKi9cbiAgICBzZXRJbW11dGFiaWxpdHlQb2xpY3kob3B0aW9ucykge1xuICAgICAgICByZXR1cm4gdGhpcy5jbGllbnQuc2VuZE9wZXJhdGlvblJlcXVlc3QoeyBvcHRpb25zIH0sIHNldEltbXV0YWJpbGl0eVBvbGljeU9wZXJhdGlvblNwZWMpO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBUaGUgRGVsZXRlIEltbXV0YWJpbGl0eSBQb2xpY3kgb3BlcmF0aW9uIGRlbGV0ZXMgdGhlIGltbXV0YWJpbGl0eSBwb2xpY3kgb24gdGhlIGJsb2JcbiAgICAgKiBAcGFyYW0gb3B0aW9ucyBUaGUgb3B0aW9ucyBwYXJhbWV0ZXJzLlxuICAgICAqL1xuICAgIGRlbGV0ZUltbXV0YWJpbGl0eVBvbGljeShvcHRpb25zKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmNsaWVudC5zZW5kT3BlcmF0aW9uUmVxdWVzdCh7IG9wdGlvbnMgfSwgZGVsZXRlSW1tdXRhYmlsaXR5UG9saWN5T3BlcmF0aW9uU3BlYyk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIFRoZSBTZXQgTGVnYWwgSG9sZCBvcGVyYXRpb24gc2V0cyBhIGxlZ2FsIGhvbGQgb24gdGhlIGJsb2IuXG4gICAgICogQHBhcmFtIGxlZ2FsSG9sZCBTcGVjaWZpZWQgaWYgYSBsZWdhbCBob2xkIHNob3VsZCBiZSBzZXQgb24gdGhlIGJsb2IuXG4gICAgICogQHBhcmFtIG9wdGlvbnMgVGhlIG9wdGlvbnMgcGFyYW1ldGVycy5cbiAgICAgKi9cbiAgICBzZXRMZWdhbEhvbGQobGVnYWxIb2xkLCBvcHRpb25zKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmNsaWVudC5zZW5kT3BlcmF0aW9uUmVxdWVzdCh7IGxlZ2FsSG9sZCwgb3B0aW9ucyB9LCBzZXRMZWdhbEhvbGRPcGVyYXRpb25TcGVjKTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogVGhlIFNldCBCbG9iIE1ldGFkYXRhIG9wZXJhdGlvbiBzZXRzIHVzZXItZGVmaW5lZCBtZXRhZGF0YSBmb3IgdGhlIHNwZWNpZmllZCBibG9iIGFzIG9uZSBvciBtb3JlXG4gICAgICogbmFtZS12YWx1ZSBwYWlyc1xuICAgICAqIEBwYXJhbSBvcHRpb25zIFRoZSBvcHRpb25zIHBhcmFtZXRlcnMuXG4gICAgICovXG4gICAgc2V0TWV0YWRhdGEob3B0aW9ucykge1xuICAgICAgICByZXR1cm4gdGhpcy5jbGllbnQuc2VuZE9wZXJhdGlvblJlcXVlc3QoeyBvcHRpb25zIH0sIHNldE1ldGFkYXRhT3BlcmF0aW9uU3BlYyk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIFtVcGRhdGVdIFRoZSBMZWFzZSBCbG9iIG9wZXJhdGlvbiBlc3RhYmxpc2hlcyBhbmQgbWFuYWdlcyBhIGxvY2sgb24gYSBibG9iIGZvciB3cml0ZSBhbmQgZGVsZXRlXG4gICAgICogb3BlcmF0aW9uc1xuICAgICAqIEBwYXJhbSBvcHRpb25zIFRoZSBvcHRpb25zIHBhcmFtZXRlcnMuXG4gICAgICovXG4gICAgYWNxdWlyZUxlYXNlKG9wdGlvbnMpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuY2xpZW50LnNlbmRPcGVyYXRpb25SZXF1ZXN0KHsgb3B0aW9ucyB9LCBhY3F1aXJlTGVhc2VPcGVyYXRpb25TcGVjKTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogW1VwZGF0ZV0gVGhlIExlYXNlIEJsb2Igb3BlcmF0aW9uIGVzdGFibGlzaGVzIGFuZCBtYW5hZ2VzIGEgbG9jayBvbiBhIGJsb2IgZm9yIHdyaXRlIGFuZCBkZWxldGVcbiAgICAgKiBvcGVyYXRpb25zXG4gICAgICogQHBhcmFtIGxlYXNlSWQgU3BlY2lmaWVzIHRoZSBjdXJyZW50IGxlYXNlIElEIG9uIHRoZSByZXNvdXJjZS5cbiAgICAgKiBAcGFyYW0gb3B0aW9ucyBUaGUgb3B0aW9ucyBwYXJhbWV0ZXJzLlxuICAgICAqL1xuICAgIHJlbGVhc2VMZWFzZShsZWFzZUlkLCBvcHRpb25zKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmNsaWVudC5zZW5kT3BlcmF0aW9uUmVxdWVzdCh7IGxlYXNlSWQsIG9wdGlvbnMgfSwgcmVsZWFzZUxlYXNlT3BlcmF0aW9uU3BlYyk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIFtVcGRhdGVdIFRoZSBMZWFzZSBCbG9iIG9wZXJhdGlvbiBlc3RhYmxpc2hlcyBhbmQgbWFuYWdlcyBhIGxvY2sgb24gYSBibG9iIGZvciB3cml0ZSBhbmQgZGVsZXRlXG4gICAgICogb3BlcmF0aW9uc1xuICAgICAqIEBwYXJhbSBsZWFzZUlkIFNwZWNpZmllcyB0aGUgY3VycmVudCBsZWFzZSBJRCBvbiB0aGUgcmVzb3VyY2UuXG4gICAgICogQHBhcmFtIG9wdGlvbnMgVGhlIG9wdGlvbnMgcGFyYW1ldGVycy5cbiAgICAgKi9cbiAgICByZW5ld0xlYXNlKGxlYXNlSWQsIG9wdGlvbnMpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuY2xpZW50LnNlbmRPcGVyYXRpb25SZXF1ZXN0KHsgbGVhc2VJZCwgb3B0aW9ucyB9LCByZW5ld0xlYXNlT3BlcmF0aW9uU3BlYyk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIFtVcGRhdGVdIFRoZSBMZWFzZSBCbG9iIG9wZXJhdGlvbiBlc3RhYmxpc2hlcyBhbmQgbWFuYWdlcyBhIGxvY2sgb24gYSBibG9iIGZvciB3cml0ZSBhbmQgZGVsZXRlXG4gICAgICogb3BlcmF0aW9uc1xuICAgICAqIEBwYXJhbSBsZWFzZUlkIFNwZWNpZmllcyB0aGUgY3VycmVudCBsZWFzZSBJRCBvbiB0aGUgcmVzb3VyY2UuXG4gICAgICogQHBhcmFtIHByb3Bvc2VkTGVhc2VJZCBQcm9wb3NlZCBsZWFzZSBJRCwgaW4gYSBHVUlEIHN0cmluZyBmb3JtYXQuIFRoZSBCbG9iIHNlcnZpY2UgcmV0dXJucyA0MDBcbiAgICAgKiAgICAgICAgICAgICAgICAgICAgICAgIChJbnZhbGlkIHJlcXVlc3QpIGlmIHRoZSBwcm9wb3NlZCBsZWFzZSBJRCBpcyBub3QgaW4gdGhlIGNvcnJlY3QgZm9ybWF0LiBTZWUgR3VpZCBDb25zdHJ1Y3RvclxuICAgICAqICAgICAgICAgICAgICAgICAgICAgICAgKFN0cmluZykgZm9yIGEgbGlzdCBvZiB2YWxpZCBHVUlEIHN0cmluZyBmb3JtYXRzLlxuICAgICAqIEBwYXJhbSBvcHRpb25zIFRoZSBvcHRpb25zIHBhcmFtZXRlcnMuXG4gICAgICovXG4gICAgY2hhbmdlTGVhc2UobGVhc2VJZCwgcHJvcG9zZWRMZWFzZUlkLCBvcHRpb25zKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmNsaWVudC5zZW5kT3BlcmF0aW9uUmVxdWVzdCh7IGxlYXNlSWQsIHByb3Bvc2VkTGVhc2VJZCwgb3B0aW9ucyB9LCBjaGFuZ2VMZWFzZU9wZXJhdGlvblNwZWMpO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBbVXBkYXRlXSBUaGUgTGVhc2UgQmxvYiBvcGVyYXRpb24gZXN0YWJsaXNoZXMgYW5kIG1hbmFnZXMgYSBsb2NrIG9uIGEgYmxvYiBmb3Igd3JpdGUgYW5kIGRlbGV0ZVxuICAgICAqIG9wZXJhdGlvbnNcbiAgICAgKiBAcGFyYW0gb3B0aW9ucyBUaGUgb3B0aW9ucyBwYXJhbWV0ZXJzLlxuICAgICAqL1xuICAgIGJyZWFrTGVhc2Uob3B0aW9ucykge1xuICAgICAgICByZXR1cm4gdGhpcy5jbGllbnQuc2VuZE9wZXJhdGlvblJlcXVlc3QoeyBvcHRpb25zIH0sIGJyZWFrTGVhc2VPcGVyYXRpb25TcGVjKTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogVGhlIENyZWF0ZSBTbmFwc2hvdCBvcGVyYXRpb24gY3JlYXRlcyBhIHJlYWQtb25seSBzbmFwc2hvdCBvZiBhIGJsb2JcbiAgICAgKiBAcGFyYW0gb3B0aW9ucyBUaGUgb3B0aW9ucyBwYXJhbWV0ZXJzLlxuICAgICAqL1xuICAgIGNyZWF0ZVNuYXBzaG90KG9wdGlvbnMpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuY2xpZW50LnNlbmRPcGVyYXRpb25SZXF1ZXN0KHsgb3B0aW9ucyB9LCBjcmVhdGVTbmFwc2hvdE9wZXJhdGlvblNwZWMpO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBUaGUgU3RhcnQgQ29weSBGcm9tIFVSTCBvcGVyYXRpb24gY29waWVzIGEgYmxvYiBvciBhbiBpbnRlcm5ldCByZXNvdXJjZSB0byBhIG5ldyBibG9iLlxuICAgICAqIEBwYXJhbSBjb3B5U291cmNlIFNwZWNpZmllcyB0aGUgbmFtZSBvZiB0aGUgc291cmNlIHBhZ2UgYmxvYiBzbmFwc2hvdC4gVGhpcyB2YWx1ZSBpcyBhIFVSTCBvZiB1cCB0b1xuICAgICAqICAgICAgICAgICAgICAgICAgIDIgS0IgaW4gbGVuZ3RoIHRoYXQgc3BlY2lmaWVzIGEgcGFnZSBibG9iIHNuYXBzaG90LiBUaGUgdmFsdWUgc2hvdWxkIGJlIFVSTC1lbmNvZGVkIGFzIGl0IHdvdWxkXG4gICAgICogICAgICAgICAgICAgICAgICAgYXBwZWFyIGluIGEgcmVxdWVzdCBVUkkuIFRoZSBzb3VyY2UgYmxvYiBtdXN0IGVpdGhlciBiZSBwdWJsaWMgb3IgbXVzdCBiZSBhdXRoZW50aWNhdGVkIHZpYSBhIHNoYXJlZFxuICAgICAqICAgICAgICAgICAgICAgICAgIGFjY2VzcyBzaWduYXR1cmUuXG4gICAgICogQHBhcmFtIG9wdGlvbnMgVGhlIG9wdGlvbnMgcGFyYW1ldGVycy5cbiAgICAgKi9cbiAgICBzdGFydENvcHlGcm9tVVJMKGNvcHlTb3VyY2UsIG9wdGlvbnMpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuY2xpZW50LnNlbmRPcGVyYXRpb25SZXF1ZXN0KHsgY29weVNvdXJjZSwgb3B0aW9ucyB9LCBzdGFydENvcHlGcm9tVVJMT3BlcmF0aW9uU3BlYyk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIFRoZSBDb3B5IEZyb20gVVJMIG9wZXJhdGlvbiBjb3BpZXMgYSBibG9iIG9yIGFuIGludGVybmV0IHJlc291cmNlIHRvIGEgbmV3IGJsb2IuIEl0IHdpbGwgbm90IHJldHVyblxuICAgICAqIGEgcmVzcG9uc2UgdW50aWwgdGhlIGNvcHkgaXMgY29tcGxldGUuXG4gICAgICogQHBhcmFtIGNvcHlTb3VyY2UgU3BlY2lmaWVzIHRoZSBuYW1lIG9mIHRoZSBzb3VyY2UgcGFnZSBibG9iIHNuYXBzaG90LiBUaGlzIHZhbHVlIGlzIGEgVVJMIG9mIHVwIHRvXG4gICAgICogICAgICAgICAgICAgICAgICAgMiBLQiBpbiBsZW5ndGggdGhhdCBzcGVjaWZpZXMgYSBwYWdlIGJsb2Igc25hcHNob3QuIFRoZSB2YWx1ZSBzaG91bGQgYmUgVVJMLWVuY29kZWQgYXMgaXQgd291bGRcbiAgICAgKiAgICAgICAgICAgICAgICAgICBhcHBlYXIgaW4gYSByZXF1ZXN0IFVSSS4gVGhlIHNvdXJjZSBibG9iIG11c3QgZWl0aGVyIGJlIHB1YmxpYyBvciBtdXN0IGJlIGF1dGhlbnRpY2F0ZWQgdmlhIGEgc2hhcmVkXG4gICAgICogICAgICAgICAgICAgICAgICAgYWNjZXNzIHNpZ25hdHVyZS5cbiAgICAgKiBAcGFyYW0gb3B0aW9ucyBUaGUgb3B0aW9ucyBwYXJhbWV0ZXJzLlxuICAgICAqL1xuICAgIGNvcHlGcm9tVVJMKGNvcHlTb3VyY2UsIG9wdGlvbnMpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuY2xpZW50LnNlbmRPcGVyYXRpb25SZXF1ZXN0KHsgY29weVNvdXJjZSwgb3B0aW9ucyB9LCBjb3B5RnJvbVVSTE9wZXJhdGlvblNwZWMpO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBUaGUgQWJvcnQgQ29weSBGcm9tIFVSTCBvcGVyYXRpb24gYWJvcnRzIGEgcGVuZGluZyBDb3B5IEZyb20gVVJMIG9wZXJhdGlvbiwgYW5kIGxlYXZlcyBhIGRlc3RpbmF0aW9uXG4gICAgICogYmxvYiB3aXRoIHplcm8gbGVuZ3RoIGFuZCBmdWxsIG1ldGFkYXRhLlxuICAgICAqIEBwYXJhbSBjb3B5SWQgVGhlIGNvcHkgaWRlbnRpZmllciBwcm92aWRlZCBpbiB0aGUgeC1tcy1jb3B5LWlkIGhlYWRlciBvZiB0aGUgb3JpZ2luYWwgQ29weSBCbG9iXG4gICAgICogICAgICAgICAgICAgICBvcGVyYXRpb24uXG4gICAgICogQHBhcmFtIG9wdGlvbnMgVGhlIG9wdGlvbnMgcGFyYW1ldGVycy5cbiAgICAgKi9cbiAgICBhYm9ydENvcHlGcm9tVVJMKGNvcHlJZCwgb3B0aW9ucykge1xuICAgICAgICByZXR1cm4gdGhpcy5jbGllbnQuc2VuZE9wZXJhdGlvblJlcXVlc3QoeyBjb3B5SWQsIG9wdGlvbnMgfSwgYWJvcnRDb3B5RnJvbVVSTE9wZXJhdGlvblNwZWMpO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBUaGUgU2V0IFRpZXIgb3BlcmF0aW9uIHNldHMgdGhlIHRpZXIgb24gYSBibG9iLiBUaGUgb3BlcmF0aW9uIGlzIGFsbG93ZWQgb24gYSBwYWdlIGJsb2IgaW4gYSBwcmVtaXVtXG4gICAgICogc3RvcmFnZSBhY2NvdW50IGFuZCBvbiBhIGJsb2NrIGJsb2IgaW4gYSBibG9iIHN0b3JhZ2UgYWNjb3VudCAobG9jYWxseSByZWR1bmRhbnQgc3RvcmFnZSBvbmx5KS4gQVxuICAgICAqIHByZW1pdW0gcGFnZSBibG9iJ3MgdGllciBkZXRlcm1pbmVzIHRoZSBhbGxvd2VkIHNpemUsIElPUFMsIGFuZCBiYW5kd2lkdGggb2YgdGhlIGJsb2IuIEEgYmxvY2tcbiAgICAgKiBibG9iJ3MgdGllciBkZXRlcm1pbmVzIEhvdC9Db29sL0FyY2hpdmUgc3RvcmFnZSB0eXBlLiBUaGlzIG9wZXJhdGlvbiBkb2VzIG5vdCB1cGRhdGUgdGhlIGJsb2Inc1xuICAgICAqIEVUYWcuXG4gICAgICogQHBhcmFtIHRpZXIgSW5kaWNhdGVzIHRoZSB0aWVyIHRvIGJlIHNldCBvbiB0aGUgYmxvYi5cbiAgICAgKiBAcGFyYW0gb3B0aW9ucyBUaGUgb3B0aW9ucyBwYXJhbWV0ZXJzLlxuICAgICAqL1xuICAgIHNldFRpZXIodGllciwgb3B0aW9ucykge1xuICAgICAgICByZXR1cm4gdGhpcy5jbGllbnQuc2VuZE9wZXJhdGlvblJlcXVlc3QoeyB0aWVyLCBvcHRpb25zIH0sIHNldFRpZXJPcGVyYXRpb25TcGVjKTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogUmV0dXJucyB0aGUgc2t1IG5hbWUgYW5kIGFjY291bnQga2luZFxuICAgICAqIEBwYXJhbSBvcHRpb25zIFRoZSBvcHRpb25zIHBhcmFtZXRlcnMuXG4gICAgICovXG4gICAgZ2V0QWNjb3VudEluZm8ob3B0aW9ucykge1xuICAgICAgICByZXR1cm4gdGhpcy5jbGllbnQuc2VuZE9wZXJhdGlvblJlcXVlc3QoeyBvcHRpb25zIH0sIGdldEFjY291bnRJbmZvT3BlcmF0aW9uU3BlYyk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIFRoZSBRdWVyeSBvcGVyYXRpb24gZW5hYmxlcyB1c2VycyB0byBzZWxlY3QvcHJvamVjdCBvbiBibG9iIGRhdGEgYnkgcHJvdmlkaW5nIHNpbXBsZSBxdWVyeVxuICAgICAqIGV4cHJlc3Npb25zLlxuICAgICAqIEBwYXJhbSBvcHRpb25zIFRoZSBvcHRpb25zIHBhcmFtZXRlcnMuXG4gICAgICovXG4gICAgcXVlcnkob3B0aW9ucykge1xuICAgICAgICByZXR1cm4gdGhpcy5jbGllbnQuc2VuZE9wZXJhdGlvblJlcXVlc3QoeyBvcHRpb25zIH0sIHF1ZXJ5T3BlcmF0aW9uU3BlYyk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIFRoZSBHZXQgVGFncyBvcGVyYXRpb24gZW5hYmxlcyB1c2VycyB0byBnZXQgdGhlIHRhZ3MgYXNzb2NpYXRlZCB3aXRoIGEgYmxvYi5cbiAgICAgKiBAcGFyYW0gb3B0aW9ucyBUaGUgb3B0aW9ucyBwYXJhbWV0ZXJzLlxuICAgICAqL1xuICAgIGdldFRhZ3Mob3B0aW9ucykge1xuICAgICAgICByZXR1cm4gdGhpcy5jbGllbnQuc2VuZE9wZXJhdGlvblJlcXVlc3QoeyBvcHRpb25zIH0sIGdldFRhZ3NPcGVyYXRpb25TcGVjKTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogVGhlIFNldCBUYWdzIG9wZXJhdGlvbiBlbmFibGVzIHVzZXJzIHRvIHNldCB0YWdzIG9uIGEgYmxvYi5cbiAgICAgKiBAcGFyYW0gb3B0aW9ucyBUaGUgb3B0aW9ucyBwYXJhbWV0ZXJzLlxuICAgICAqL1xuICAgIHNldFRhZ3Mob3B0aW9ucykge1xuICAgICAgICByZXR1cm4gdGhpcy5jbGllbnQuc2VuZE9wZXJhdGlvblJlcXVlc3QoeyBvcHRpb25zIH0sIHNldFRhZ3NPcGVyYXRpb25TcGVjKTtcbiAgICB9XG59XG4vLyBPcGVyYXRpb24gU3BlY2lmaWNhdGlvbnNcbmNvbnN0IHhtbFNlcmlhbGl6ZXIkMyA9IGNvcmVDbGllbnRfX25hbWVzcGFjZS5jcmVhdGVTZXJpYWxpemVyKE1hcHBlcnMsIC8qIGlzWG1sICovIHRydWUpO1xuY29uc3QgZG93bmxvYWRPcGVyYXRpb25TcGVjID0ge1xuICAgIHBhdGg6IFwiL3tjb250YWluZXJOYW1lfS97YmxvYn1cIixcbiAgICBodHRwTWV0aG9kOiBcIkdFVFwiLFxuICAgIHJlc3BvbnNlczoge1xuICAgICAgICAyMDA6IHtcbiAgICAgICAgICAgIGJvZHlNYXBwZXI6IHtcbiAgICAgICAgICAgICAgICB0eXBlOiB7IG5hbWU6IFwiU3RyZWFtXCIgfSxcbiAgICAgICAgICAgICAgICBzZXJpYWxpemVkTmFtZTogXCJwYXJzZWRSZXNwb25zZVwiLFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIGhlYWRlcnNNYXBwZXI6IEJsb2JEb3dubG9hZEhlYWRlcnMsXG4gICAgICAgIH0sXG4gICAgICAgIDIwNjoge1xuICAgICAgICAgICAgYm9keU1hcHBlcjoge1xuICAgICAgICAgICAgICAgIHR5cGU6IHsgbmFtZTogXCJTdHJlYW1cIiB9LFxuICAgICAgICAgICAgICAgIHNlcmlhbGl6ZWROYW1lOiBcInBhcnNlZFJlc3BvbnNlXCIsXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgaGVhZGVyc01hcHBlcjogQmxvYkRvd25sb2FkSGVhZGVycyxcbiAgICAgICAgfSxcbiAgICAgICAgZGVmYXVsdDoge1xuICAgICAgICAgICAgYm9keU1hcHBlcjogU3RvcmFnZUVycm9yLFxuICAgICAgICAgICAgaGVhZGVyc01hcHBlcjogQmxvYkRvd25sb2FkRXhjZXB0aW9uSGVhZGVycyxcbiAgICAgICAgfSxcbiAgICB9LFxuICAgIHF1ZXJ5UGFyYW1ldGVyczogW1xuICAgICAgICB0aW1lb3V0SW5TZWNvbmRzLFxuICAgICAgICBzbmFwc2hvdCxcbiAgICAgICAgdmVyc2lvbklkLFxuICAgIF0sXG4gICAgdXJsUGFyYW1ldGVyczogW3VybF0sXG4gICAgaGVhZGVyUGFyYW1ldGVyczogW1xuICAgICAgICB2ZXJzaW9uLFxuICAgICAgICByZXF1ZXN0SWQsXG4gICAgICAgIGFjY2VwdDEsXG4gICAgICAgIGxlYXNlSWQsXG4gICAgICAgIGlmTW9kaWZpZWRTaW5jZSxcbiAgICAgICAgaWZVbm1vZGlmaWVkU2luY2UsXG4gICAgICAgIHJhbmdlLFxuICAgICAgICByYW5nZUdldENvbnRlbnRNRDUsXG4gICAgICAgIHJhbmdlR2V0Q29udGVudENSQzY0LFxuICAgICAgICBlbmNyeXB0aW9uS2V5LFxuICAgICAgICBlbmNyeXB0aW9uS2V5U2hhMjU2LFxuICAgICAgICBlbmNyeXB0aW9uQWxnb3JpdGhtLFxuICAgICAgICBpZk1hdGNoLFxuICAgICAgICBpZk5vbmVNYXRjaCxcbiAgICAgICAgaWZUYWdzLFxuICAgIF0sXG4gICAgaXNYTUw6IHRydWUsXG4gICAgc2VyaWFsaXplcjogeG1sU2VyaWFsaXplciQzLFxufTtcbmNvbnN0IGdldFByb3BlcnRpZXNPcGVyYXRpb25TcGVjID0ge1xuICAgIHBhdGg6IFwiL3tjb250YWluZXJOYW1lfS97YmxvYn1cIixcbiAgICBodHRwTWV0aG9kOiBcIkhFQURcIixcbiAgICByZXNwb25zZXM6IHtcbiAgICAgICAgMjAwOiB7XG4gICAgICAgICAgICBoZWFkZXJzTWFwcGVyOiBCbG9iR2V0UHJvcGVydGllc0hlYWRlcnMsXG4gICAgICAgIH0sXG4gICAgICAgIGRlZmF1bHQ6IHtcbiAgICAgICAgICAgIGJvZHlNYXBwZXI6IFN0b3JhZ2VFcnJvcixcbiAgICAgICAgICAgIGhlYWRlcnNNYXBwZXI6IEJsb2JHZXRQcm9wZXJ0aWVzRXhjZXB0aW9uSGVhZGVycyxcbiAgICAgICAgfSxcbiAgICB9LFxuICAgIHF1ZXJ5UGFyYW1ldGVyczogW1xuICAgICAgICB0aW1lb3V0SW5TZWNvbmRzLFxuICAgICAgICBzbmFwc2hvdCxcbiAgICAgICAgdmVyc2lvbklkLFxuICAgIF0sXG4gICAgdXJsUGFyYW1ldGVyczogW3VybF0sXG4gICAgaGVhZGVyUGFyYW1ldGVyczogW1xuICAgICAgICB2ZXJzaW9uLFxuICAgICAgICByZXF1ZXN0SWQsXG4gICAgICAgIGFjY2VwdDEsXG4gICAgICAgIGxlYXNlSWQsXG4gICAgICAgIGlmTW9kaWZpZWRTaW5jZSxcbiAgICAgICAgaWZVbm1vZGlmaWVkU2luY2UsXG4gICAgICAgIGVuY3J5cHRpb25LZXksXG4gICAgICAgIGVuY3J5cHRpb25LZXlTaGEyNTYsXG4gICAgICAgIGVuY3J5cHRpb25BbGdvcml0aG0sXG4gICAgICAgIGlmTWF0Y2gsXG4gICAgICAgIGlmTm9uZU1hdGNoLFxuICAgICAgICBpZlRhZ3MsXG4gICAgXSxcbiAgICBpc1hNTDogdHJ1ZSxcbiAgICBzZXJpYWxpemVyOiB4bWxTZXJpYWxpemVyJDMsXG59O1xuY29uc3QgZGVsZXRlT3BlcmF0aW9uU3BlYyA9IHtcbiAgICBwYXRoOiBcIi97Y29udGFpbmVyTmFtZX0ve2Jsb2J9XCIsXG4gICAgaHR0cE1ldGhvZDogXCJERUxFVEVcIixcbiAgICByZXNwb25zZXM6IHtcbiAgICAgICAgMjAyOiB7XG4gICAgICAgICAgICBoZWFkZXJzTWFwcGVyOiBCbG9iRGVsZXRlSGVhZGVycyxcbiAgICAgICAgfSxcbiAgICAgICAgZGVmYXVsdDoge1xuICAgICAgICAgICAgYm9keU1hcHBlcjogU3RvcmFnZUVycm9yLFxuICAgICAgICAgICAgaGVhZGVyc01hcHBlcjogQmxvYkRlbGV0ZUV4Y2VwdGlvbkhlYWRlcnMsXG4gICAgICAgIH0sXG4gICAgfSxcbiAgICBxdWVyeVBhcmFtZXRlcnM6IFtcbiAgICAgICAgdGltZW91dEluU2Vjb25kcyxcbiAgICAgICAgc25hcHNob3QsXG4gICAgICAgIHZlcnNpb25JZCxcbiAgICAgICAgYmxvYkRlbGV0ZVR5cGUsXG4gICAgXSxcbiAgICB1cmxQYXJhbWV0ZXJzOiBbdXJsXSxcbiAgICBoZWFkZXJQYXJhbWV0ZXJzOiBbXG4gICAgICAgIHZlcnNpb24sXG4gICAgICAgIHJlcXVlc3RJZCxcbiAgICAgICAgYWNjZXB0MSxcbiAgICAgICAgbGVhc2VJZCxcbiAgICAgICAgaWZNb2RpZmllZFNpbmNlLFxuICAgICAgICBpZlVubW9kaWZpZWRTaW5jZSxcbiAgICAgICAgaWZNYXRjaCxcbiAgICAgICAgaWZOb25lTWF0Y2gsXG4gICAgICAgIGlmVGFncyxcbiAgICAgICAgZGVsZXRlU25hcHNob3RzLFxuICAgIF0sXG4gICAgaXNYTUw6IHRydWUsXG4gICAgc2VyaWFsaXplcjogeG1sU2VyaWFsaXplciQzLFxufTtcbmNvbnN0IHVuZGVsZXRlT3BlcmF0aW9uU3BlYyA9IHtcbiAgICBwYXRoOiBcIi97Y29udGFpbmVyTmFtZX0ve2Jsb2J9XCIsXG4gICAgaHR0cE1ldGhvZDogXCJQVVRcIixcbiAgICByZXNwb25zZXM6IHtcbiAgICAgICAgMjAwOiB7XG4gICAgICAgICAgICBoZWFkZXJzTWFwcGVyOiBCbG9iVW5kZWxldGVIZWFkZXJzLFxuICAgICAgICB9LFxuICAgICAgICBkZWZhdWx0OiB7XG4gICAgICAgICAgICBib2R5TWFwcGVyOiBTdG9yYWdlRXJyb3IsXG4gICAgICAgICAgICBoZWFkZXJzTWFwcGVyOiBCbG9iVW5kZWxldGVFeGNlcHRpb25IZWFkZXJzLFxuICAgICAgICB9LFxuICAgIH0sXG4gICAgcXVlcnlQYXJhbWV0ZXJzOiBbdGltZW91dEluU2Vjb25kcywgY29tcDhdLFxuICAgIHVybFBhcmFtZXRlcnM6IFt1cmxdLFxuICAgIGhlYWRlclBhcmFtZXRlcnM6IFtcbiAgICAgICAgdmVyc2lvbixcbiAgICAgICAgcmVxdWVzdElkLFxuICAgICAgICBhY2NlcHQxLFxuICAgIF0sXG4gICAgaXNYTUw6IHRydWUsXG4gICAgc2VyaWFsaXplcjogeG1sU2VyaWFsaXplciQzLFxufTtcbmNvbnN0IHNldEV4cGlyeU9wZXJhdGlvblNwZWMgPSB7XG4gICAgcGF0aDogXCIve2NvbnRhaW5lck5hbWV9L3tibG9ifVwiLFxuICAgIGh0dHBNZXRob2Q6IFwiUFVUXCIsXG4gICAgcmVzcG9uc2VzOiB7XG4gICAgICAgIDIwMDoge1xuICAgICAgICAgICAgaGVhZGVyc01hcHBlcjogQmxvYlNldEV4cGlyeUhlYWRlcnMsXG4gICAgICAgIH0sXG4gICAgICAgIGRlZmF1bHQ6IHtcbiAgICAgICAgICAgIGJvZHlNYXBwZXI6IFN0b3JhZ2VFcnJvcixcbiAgICAgICAgICAgIGhlYWRlcnNNYXBwZXI6IEJsb2JTZXRFeHBpcnlFeGNlcHRpb25IZWFkZXJzLFxuICAgICAgICB9LFxuICAgIH0sXG4gICAgcXVlcnlQYXJhbWV0ZXJzOiBbdGltZW91dEluU2Vjb25kcywgY29tcDExXSxcbiAgICB1cmxQYXJhbWV0ZXJzOiBbdXJsXSxcbiAgICBoZWFkZXJQYXJhbWV0ZXJzOiBbXG4gICAgICAgIHZlcnNpb24sXG4gICAgICAgIHJlcXVlc3RJZCxcbiAgICAgICAgYWNjZXB0MSxcbiAgICAgICAgZXhwaXJ5T3B0aW9ucyxcbiAgICAgICAgZXhwaXJlc09uLFxuICAgIF0sXG4gICAgaXNYTUw6IHRydWUsXG4gICAgc2VyaWFsaXplcjogeG1sU2VyaWFsaXplciQzLFxufTtcbmNvbnN0IHNldEh0dHBIZWFkZXJzT3BlcmF0aW9uU3BlYyA9IHtcbiAgICBwYXRoOiBcIi97Y29udGFpbmVyTmFtZX0ve2Jsb2J9XCIsXG4gICAgaHR0cE1ldGhvZDogXCJQVVRcIixcbiAgICByZXNwb25zZXM6IHtcbiAgICAgICAgMjAwOiB7XG4gICAgICAgICAgICBoZWFkZXJzTWFwcGVyOiBCbG9iU2V0SHR0cEhlYWRlcnNIZWFkZXJzLFxuICAgICAgICB9LFxuICAgICAgICBkZWZhdWx0OiB7XG4gICAgICAgICAgICBib2R5TWFwcGVyOiBTdG9yYWdlRXJyb3IsXG4gICAgICAgICAgICBoZWFkZXJzTWFwcGVyOiBCbG9iU2V0SHR0cEhlYWRlcnNFeGNlcHRpb25IZWFkZXJzLFxuICAgICAgICB9LFxuICAgIH0sXG4gICAgcXVlcnlQYXJhbWV0ZXJzOiBbY29tcCwgdGltZW91dEluU2Vjb25kc10sXG4gICAgdXJsUGFyYW1ldGVyczogW3VybF0sXG4gICAgaGVhZGVyUGFyYW1ldGVyczogW1xuICAgICAgICB2ZXJzaW9uLFxuICAgICAgICByZXF1ZXN0SWQsXG4gICAgICAgIGFjY2VwdDEsXG4gICAgICAgIGxlYXNlSWQsXG4gICAgICAgIGlmTW9kaWZpZWRTaW5jZSxcbiAgICAgICAgaWZVbm1vZGlmaWVkU2luY2UsXG4gICAgICAgIGlmTWF0Y2gsXG4gICAgICAgIGlmTm9uZU1hdGNoLFxuICAgICAgICBpZlRhZ3MsXG4gICAgICAgIGJsb2JDYWNoZUNvbnRyb2wsXG4gICAgICAgIGJsb2JDb250ZW50VHlwZSxcbiAgICAgICAgYmxvYkNvbnRlbnRNRDUsXG4gICAgICAgIGJsb2JDb250ZW50RW5jb2RpbmcsXG4gICAgICAgIGJsb2JDb250ZW50TGFuZ3VhZ2UsXG4gICAgICAgIGJsb2JDb250ZW50RGlzcG9zaXRpb24sXG4gICAgXSxcbiAgICBpc1hNTDogdHJ1ZSxcbiAgICBzZXJpYWxpemVyOiB4bWxTZXJpYWxpemVyJDMsXG59O1xuY29uc3Qgc2V0SW1tdXRhYmlsaXR5UG9saWN5T3BlcmF0aW9uU3BlYyA9IHtcbiAgICBwYXRoOiBcIi97Y29udGFpbmVyTmFtZX0ve2Jsb2J9XCIsXG4gICAgaHR0cE1ldGhvZDogXCJQVVRcIixcbiAgICByZXNwb25zZXM6IHtcbiAgICAgICAgMjAwOiB7XG4gICAgICAgICAgICBoZWFkZXJzTWFwcGVyOiBCbG9iU2V0SW1tdXRhYmlsaXR5UG9saWN5SGVhZGVycyxcbiAgICAgICAgfSxcbiAgICAgICAgZGVmYXVsdDoge1xuICAgICAgICAgICAgYm9keU1hcHBlcjogU3RvcmFnZUVycm9yLFxuICAgICAgICAgICAgaGVhZGVyc01hcHBlcjogQmxvYlNldEltbXV0YWJpbGl0eVBvbGljeUV4Y2VwdGlvbkhlYWRlcnMsXG4gICAgICAgIH0sXG4gICAgfSxcbiAgICBxdWVyeVBhcmFtZXRlcnM6IFt0aW1lb3V0SW5TZWNvbmRzLCBjb21wMTJdLFxuICAgIHVybFBhcmFtZXRlcnM6IFt1cmxdLFxuICAgIGhlYWRlclBhcmFtZXRlcnM6IFtcbiAgICAgICAgdmVyc2lvbixcbiAgICAgICAgcmVxdWVzdElkLFxuICAgICAgICBhY2NlcHQxLFxuICAgICAgICBpZlVubW9kaWZpZWRTaW5jZSxcbiAgICAgICAgaW1tdXRhYmlsaXR5UG9saWN5RXhwaXJ5LFxuICAgICAgICBpbW11dGFiaWxpdHlQb2xpY3lNb2RlLFxuICAgIF0sXG4gICAgaXNYTUw6IHRydWUsXG4gICAgc2VyaWFsaXplcjogeG1sU2VyaWFsaXplciQzLFxufTtcbmNvbnN0IGRlbGV0ZUltbXV0YWJpbGl0eVBvbGljeU9wZXJhdGlvblNwZWMgPSB7XG4gICAgcGF0aDogXCIve2NvbnRhaW5lck5hbWV9L3tibG9ifVwiLFxuICAgIGh0dHBNZXRob2Q6IFwiREVMRVRFXCIsXG4gICAgcmVzcG9uc2VzOiB7XG4gICAgICAgIDIwMDoge1xuICAgICAgICAgICAgaGVhZGVyc01hcHBlcjogQmxvYkRlbGV0ZUltbXV0YWJpbGl0eVBvbGljeUhlYWRlcnMsXG4gICAgICAgIH0sXG4gICAgICAgIGRlZmF1bHQ6IHtcbiAgICAgICAgICAgIGJvZHlNYXBwZXI6IFN0b3JhZ2VFcnJvcixcbiAgICAgICAgICAgIGhlYWRlcnNNYXBwZXI6IEJsb2JEZWxldGVJbW11dGFiaWxpdHlQb2xpY3lFeGNlcHRpb25IZWFkZXJzLFxuICAgICAgICB9LFxuICAgIH0sXG4gICAgcXVlcnlQYXJhbWV0ZXJzOiBbdGltZW91dEluU2Vjb25kcywgY29tcDEyXSxcbiAgICB1cmxQYXJhbWV0ZXJzOiBbdXJsXSxcbiAgICBoZWFkZXJQYXJhbWV0ZXJzOiBbXG4gICAgICAgIHZlcnNpb24sXG4gICAgICAgIHJlcXVlc3RJZCxcbiAgICAgICAgYWNjZXB0MSxcbiAgICBdLFxuICAgIGlzWE1MOiB0cnVlLFxuICAgIHNlcmlhbGl6ZXI6IHhtbFNlcmlhbGl6ZXIkMyxcbn07XG5jb25zdCBzZXRMZWdhbEhvbGRPcGVyYXRpb25TcGVjID0ge1xuICAgIHBhdGg6IFwiL3tjb250YWluZXJOYW1lfS97YmxvYn1cIixcbiAgICBodHRwTWV0aG9kOiBcIlBVVFwiLFxuICAgIHJlc3BvbnNlczoge1xuICAgICAgICAyMDA6IHtcbiAgICAgICAgICAgIGhlYWRlcnNNYXBwZXI6IEJsb2JTZXRMZWdhbEhvbGRIZWFkZXJzLFxuICAgICAgICB9LFxuICAgICAgICBkZWZhdWx0OiB7XG4gICAgICAgICAgICBib2R5TWFwcGVyOiBTdG9yYWdlRXJyb3IsXG4gICAgICAgICAgICBoZWFkZXJzTWFwcGVyOiBCbG9iU2V0TGVnYWxIb2xkRXhjZXB0aW9uSGVhZGVycyxcbiAgICAgICAgfSxcbiAgICB9LFxuICAgIHF1ZXJ5UGFyYW1ldGVyczogW3RpbWVvdXRJblNlY29uZHMsIGNvbXAxM10sXG4gICAgdXJsUGFyYW1ldGVyczogW3VybF0sXG4gICAgaGVhZGVyUGFyYW1ldGVyczogW1xuICAgICAgICB2ZXJzaW9uLFxuICAgICAgICByZXF1ZXN0SWQsXG4gICAgICAgIGFjY2VwdDEsXG4gICAgICAgIGxlZ2FsSG9sZCxcbiAgICBdLFxuICAgIGlzWE1MOiB0cnVlLFxuICAgIHNlcmlhbGl6ZXI6IHhtbFNlcmlhbGl6ZXIkMyxcbn07XG5jb25zdCBzZXRNZXRhZGF0YU9wZXJhdGlvblNwZWMgPSB7XG4gICAgcGF0aDogXCIve2NvbnRhaW5lck5hbWV9L3tibG9ifVwiLFxuICAgIGh0dHBNZXRob2Q6IFwiUFVUXCIsXG4gICAgcmVzcG9uc2VzOiB7XG4gICAgICAgIDIwMDoge1xuICAgICAgICAgICAgaGVhZGVyc01hcHBlcjogQmxvYlNldE1ldGFkYXRhSGVhZGVycyxcbiAgICAgICAgfSxcbiAgICAgICAgZGVmYXVsdDoge1xuICAgICAgICAgICAgYm9keU1hcHBlcjogU3RvcmFnZUVycm9yLFxuICAgICAgICAgICAgaGVhZGVyc01hcHBlcjogQmxvYlNldE1ldGFkYXRhRXhjZXB0aW9uSGVhZGVycyxcbiAgICAgICAgfSxcbiAgICB9LFxuICAgIHF1ZXJ5UGFyYW1ldGVyczogW3RpbWVvdXRJblNlY29uZHMsIGNvbXA2XSxcbiAgICB1cmxQYXJhbWV0ZXJzOiBbdXJsXSxcbiAgICBoZWFkZXJQYXJhbWV0ZXJzOiBbXG4gICAgICAgIHZlcnNpb24sXG4gICAgICAgIHJlcXVlc3RJZCxcbiAgICAgICAgYWNjZXB0MSxcbiAgICAgICAgbWV0YWRhdGEsXG4gICAgICAgIGxlYXNlSWQsXG4gICAgICAgIGlmTW9kaWZpZWRTaW5jZSxcbiAgICAgICAgaWZVbm1vZGlmaWVkU2luY2UsXG4gICAgICAgIGVuY3J5cHRpb25LZXksXG4gICAgICAgIGVuY3J5cHRpb25LZXlTaGEyNTYsXG4gICAgICAgIGVuY3J5cHRpb25BbGdvcml0aG0sXG4gICAgICAgIGlmTWF0Y2gsXG4gICAgICAgIGlmTm9uZU1hdGNoLFxuICAgICAgICBpZlRhZ3MsXG4gICAgICAgIGVuY3J5cHRpb25TY29wZSxcbiAgICBdLFxuICAgIGlzWE1MOiB0cnVlLFxuICAgIHNlcmlhbGl6ZXI6IHhtbFNlcmlhbGl6ZXIkMyxcbn07XG5jb25zdCBhY3F1aXJlTGVhc2VPcGVyYXRpb25TcGVjID0ge1xuICAgIHBhdGg6IFwiL3tjb250YWluZXJOYW1lfS97YmxvYn1cIixcbiAgICBodHRwTWV0aG9kOiBcIlBVVFwiLFxuICAgIHJlc3BvbnNlczoge1xuICAgICAgICAyMDE6IHtcbiAgICAgICAgICAgIGhlYWRlcnNNYXBwZXI6IEJsb2JBY3F1aXJlTGVhc2VIZWFkZXJzLFxuICAgICAgICB9LFxuICAgICAgICBkZWZhdWx0OiB7XG4gICAgICAgICAgICBib2R5TWFwcGVyOiBTdG9yYWdlRXJyb3IsXG4gICAgICAgICAgICBoZWFkZXJzTWFwcGVyOiBCbG9iQWNxdWlyZUxlYXNlRXhjZXB0aW9uSGVhZGVycyxcbiAgICAgICAgfSxcbiAgICB9LFxuICAgIHF1ZXJ5UGFyYW1ldGVyczogW3RpbWVvdXRJblNlY29uZHMsIGNvbXAxMF0sXG4gICAgdXJsUGFyYW1ldGVyczogW3VybF0sXG4gICAgaGVhZGVyUGFyYW1ldGVyczogW1xuICAgICAgICB2ZXJzaW9uLFxuICAgICAgICByZXF1ZXN0SWQsXG4gICAgICAgIGFjY2VwdDEsXG4gICAgICAgIGlmTW9kaWZpZWRTaW5jZSxcbiAgICAgICAgaWZVbm1vZGlmaWVkU2luY2UsXG4gICAgICAgIGFjdGlvbixcbiAgICAgICAgZHVyYXRpb24sXG4gICAgICAgIHByb3Bvc2VkTGVhc2VJZCxcbiAgICAgICAgaWZNYXRjaCxcbiAgICAgICAgaWZOb25lTWF0Y2gsXG4gICAgICAgIGlmVGFncyxcbiAgICBdLFxuICAgIGlzWE1MOiB0cnVlLFxuICAgIHNlcmlhbGl6ZXI6IHhtbFNlcmlhbGl6ZXIkMyxcbn07XG5jb25zdCByZWxlYXNlTGVhc2VPcGVyYXRpb25TcGVjID0ge1xuICAgIHBhdGg6IFwiL3tjb250YWluZXJOYW1lfS97YmxvYn1cIixcbiAgICBodHRwTWV0aG9kOiBcIlBVVFwiLFxuICAgIHJlc3BvbnNlczoge1xuICAgICAgICAyMDA6IHtcbiAgICAgICAgICAgIGhlYWRlcnNNYXBwZXI6IEJsb2JSZWxlYXNlTGVhc2VIZWFkZXJzLFxuICAgICAgICB9LFxuICAgICAgICBkZWZhdWx0OiB7XG4gICAgICAgICAgICBib2R5TWFwcGVyOiBTdG9yYWdlRXJyb3IsXG4gICAgICAgICAgICBoZWFkZXJzTWFwcGVyOiBCbG9iUmVsZWFzZUxlYXNlRXhjZXB0aW9uSGVhZGVycyxcbiAgICAgICAgfSxcbiAgICB9LFxuICAgIHF1ZXJ5UGFyYW1ldGVyczogW3RpbWVvdXRJblNlY29uZHMsIGNvbXAxMF0sXG4gICAgdXJsUGFyYW1ldGVyczogW3VybF0sXG4gICAgaGVhZGVyUGFyYW1ldGVyczogW1xuICAgICAgICB2ZXJzaW9uLFxuICAgICAgICByZXF1ZXN0SWQsXG4gICAgICAgIGFjY2VwdDEsXG4gICAgICAgIGlmTW9kaWZpZWRTaW5jZSxcbiAgICAgICAgaWZVbm1vZGlmaWVkU2luY2UsXG4gICAgICAgIGFjdGlvbjEsXG4gICAgICAgIGxlYXNlSWQxLFxuICAgICAgICBpZk1hdGNoLFxuICAgICAgICBpZk5vbmVNYXRjaCxcbiAgICAgICAgaWZUYWdzLFxuICAgIF0sXG4gICAgaXNYTUw6IHRydWUsXG4gICAgc2VyaWFsaXplcjogeG1sU2VyaWFsaXplciQzLFxufTtcbmNvbnN0IHJlbmV3TGVhc2VPcGVyYXRpb25TcGVjID0ge1xuICAgIHBhdGg6IFwiL3tjb250YWluZXJOYW1lfS97YmxvYn1cIixcbiAgICBodHRwTWV0aG9kOiBcIlBVVFwiLFxuICAgIHJlc3BvbnNlczoge1xuICAgICAgICAyMDA6IHtcbiAgICAgICAgICAgIGhlYWRlcnNNYXBwZXI6IEJsb2JSZW5ld0xlYXNlSGVhZGVycyxcbiAgICAgICAgfSxcbiAgICAgICAgZGVmYXVsdDoge1xuICAgICAgICAgICAgYm9keU1hcHBlcjogU3RvcmFnZUVycm9yLFxuICAgICAgICAgICAgaGVhZGVyc01hcHBlcjogQmxvYlJlbmV3TGVhc2VFeGNlcHRpb25IZWFkZXJzLFxuICAgICAgICB9LFxuICAgIH0sXG4gICAgcXVlcnlQYXJhbWV0ZXJzOiBbdGltZW91dEluU2Vjb25kcywgY29tcDEwXSxcbiAgICB1cmxQYXJhbWV0ZXJzOiBbdXJsXSxcbiAgICBoZWFkZXJQYXJhbWV0ZXJzOiBbXG4gICAgICAgIHZlcnNpb24sXG4gICAgICAgIHJlcXVlc3RJZCxcbiAgICAgICAgYWNjZXB0MSxcbiAgICAgICAgaWZNb2RpZmllZFNpbmNlLFxuICAgICAgICBpZlVubW9kaWZpZWRTaW5jZSxcbiAgICAgICAgbGVhc2VJZDEsXG4gICAgICAgIGFjdGlvbjIsXG4gICAgICAgIGlmTWF0Y2gsXG4gICAgICAgIGlmTm9uZU1hdGNoLFxuICAgICAgICBpZlRhZ3MsXG4gICAgXSxcbiAgICBpc1hNTDogdHJ1ZSxcbiAgICBzZXJpYWxpemVyOiB4bWxTZXJpYWxpemVyJDMsXG59O1xuY29uc3QgY2hhbmdlTGVhc2VPcGVyYXRpb25TcGVjID0ge1xuICAgIHBhdGg6IFwiL3tjb250YWluZXJOYW1lfS97YmxvYn1cIixcbiAgICBodHRwTWV0aG9kOiBcIlBVVFwiLFxuICAgIHJlc3BvbnNlczoge1xuICAgICAgICAyMDA6IHtcbiAgICAgICAgICAgIGhlYWRlcnNNYXBwZXI6IEJsb2JDaGFuZ2VMZWFzZUhlYWRlcnMsXG4gICAgICAgIH0sXG4gICAgICAgIGRlZmF1bHQ6IHtcbiAgICAgICAgICAgIGJvZHlNYXBwZXI6IFN0b3JhZ2VFcnJvcixcbiAgICAgICAgICAgIGhlYWRlcnNNYXBwZXI6IEJsb2JDaGFuZ2VMZWFzZUV4Y2VwdGlvbkhlYWRlcnMsXG4gICAgICAgIH0sXG4gICAgfSxcbiAgICBxdWVyeVBhcmFtZXRlcnM6IFt0aW1lb3V0SW5TZWNvbmRzLCBjb21wMTBdLFxuICAgIHVybFBhcmFtZXRlcnM6IFt1cmxdLFxuICAgIGhlYWRlclBhcmFtZXRlcnM6IFtcbiAgICAgICAgdmVyc2lvbixcbiAgICAgICAgcmVxdWVzdElkLFxuICAgICAgICBhY2NlcHQxLFxuICAgICAgICBpZk1vZGlmaWVkU2luY2UsXG4gICAgICAgIGlmVW5tb2RpZmllZFNpbmNlLFxuICAgICAgICBsZWFzZUlkMSxcbiAgICAgICAgYWN0aW9uNCxcbiAgICAgICAgcHJvcG9zZWRMZWFzZUlkMSxcbiAgICAgICAgaWZNYXRjaCxcbiAgICAgICAgaWZOb25lTWF0Y2gsXG4gICAgICAgIGlmVGFncyxcbiAgICBdLFxuICAgIGlzWE1MOiB0cnVlLFxuICAgIHNlcmlhbGl6ZXI6IHhtbFNlcmlhbGl6ZXIkMyxcbn07XG5jb25zdCBicmVha0xlYXNlT3BlcmF0aW9uU3BlYyA9IHtcbiAgICBwYXRoOiBcIi97Y29udGFpbmVyTmFtZX0ve2Jsb2J9XCIsXG4gICAgaHR0cE1ldGhvZDogXCJQVVRcIixcbiAgICByZXNwb25zZXM6IHtcbiAgICAgICAgMjAyOiB7XG4gICAgICAgICAgICBoZWFkZXJzTWFwcGVyOiBCbG9iQnJlYWtMZWFzZUhlYWRlcnMsXG4gICAgICAgIH0sXG4gICAgICAgIGRlZmF1bHQ6IHtcbiAgICAgICAgICAgIGJvZHlNYXBwZXI6IFN0b3JhZ2VFcnJvcixcbiAgICAgICAgICAgIGhlYWRlcnNNYXBwZXI6IEJsb2JCcmVha0xlYXNlRXhjZXB0aW9uSGVhZGVycyxcbiAgICAgICAgfSxcbiAgICB9LFxuICAgIHF1ZXJ5UGFyYW1ldGVyczogW3RpbWVvdXRJblNlY29uZHMsIGNvbXAxMF0sXG4gICAgdXJsUGFyYW1ldGVyczogW3VybF0sXG4gICAgaGVhZGVyUGFyYW1ldGVyczogW1xuICAgICAgICB2ZXJzaW9uLFxuICAgICAgICByZXF1ZXN0SWQsXG4gICAgICAgIGFjY2VwdDEsXG4gICAgICAgIGlmTW9kaWZpZWRTaW5jZSxcbiAgICAgICAgaWZVbm1vZGlmaWVkU2luY2UsXG4gICAgICAgIGFjdGlvbjMsXG4gICAgICAgIGJyZWFrUGVyaW9kLFxuICAgICAgICBpZk1hdGNoLFxuICAgICAgICBpZk5vbmVNYXRjaCxcbiAgICAgICAgaWZUYWdzLFxuICAgIF0sXG4gICAgaXNYTUw6IHRydWUsXG4gICAgc2VyaWFsaXplcjogeG1sU2VyaWFsaXplciQzLFxufTtcbmNvbnN0IGNyZWF0ZVNuYXBzaG90T3BlcmF0aW9uU3BlYyA9IHtcbiAgICBwYXRoOiBcIi97Y29udGFpbmVyTmFtZX0ve2Jsb2J9XCIsXG4gICAgaHR0cE1ldGhvZDogXCJQVVRcIixcbiAgICByZXNwb25zZXM6IHtcbiAgICAgICAgMjAxOiB7XG4gICAgICAgICAgICBoZWFkZXJzTWFwcGVyOiBCbG9iQ3JlYXRlU25hcHNob3RIZWFkZXJzLFxuICAgICAgICB9LFxuICAgICAgICBkZWZhdWx0OiB7XG4gICAgICAgICAgICBib2R5TWFwcGVyOiBTdG9yYWdlRXJyb3IsXG4gICAgICAgICAgICBoZWFkZXJzTWFwcGVyOiBCbG9iQ3JlYXRlU25hcHNob3RFeGNlcHRpb25IZWFkZXJzLFxuICAgICAgICB9LFxuICAgIH0sXG4gICAgcXVlcnlQYXJhbWV0ZXJzOiBbdGltZW91dEluU2Vjb25kcywgY29tcDE0XSxcbiAgICB1cmxQYXJhbWV0ZXJzOiBbdXJsXSxcbiAgICBoZWFkZXJQYXJhbWV0ZXJzOiBbXG4gICAgICAgIHZlcnNpb24sXG4gICAgICAgIHJlcXVlc3RJZCxcbiAgICAgICAgYWNjZXB0MSxcbiAgICAgICAgbWV0YWRhdGEsXG4gICAgICAgIGxlYXNlSWQsXG4gICAgICAgIGlmTW9kaWZpZWRTaW5jZSxcbiAgICAgICAgaWZVbm1vZGlmaWVkU2luY2UsXG4gICAgICAgIGVuY3J5cHRpb25LZXksXG4gICAgICAgIGVuY3J5cHRpb25LZXlTaGEyNTYsXG4gICAgICAgIGVuY3J5cHRpb25BbGdvcml0aG0sXG4gICAgICAgIGlmTWF0Y2gsXG4gICAgICAgIGlmTm9uZU1hdGNoLFxuICAgICAgICBpZlRhZ3MsXG4gICAgICAgIGVuY3J5cHRpb25TY29wZSxcbiAgICBdLFxuICAgIGlzWE1MOiB0cnVlLFxuICAgIHNlcmlhbGl6ZXI6IHhtbFNlcmlhbGl6ZXIkMyxcbn07XG5jb25zdCBzdGFydENvcHlGcm9tVVJMT3BlcmF0aW9uU3BlYyA9IHtcbiAgICBwYXRoOiBcIi97Y29udGFpbmVyTmFtZX0ve2Jsb2J9XCIsXG4gICAgaHR0cE1ldGhvZDogXCJQVVRcIixcbiAgICByZXNwb25zZXM6IHtcbiAgICAgICAgMjAyOiB7XG4gICAgICAgICAgICBoZWFkZXJzTWFwcGVyOiBCbG9iU3RhcnRDb3B5RnJvbVVSTEhlYWRlcnMsXG4gICAgICAgIH0sXG4gICAgICAgIGRlZmF1bHQ6IHtcbiAgICAgICAgICAgIGJvZHlNYXBwZXI6IFN0b3JhZ2VFcnJvcixcbiAgICAgICAgICAgIGhlYWRlcnNNYXBwZXI6IEJsb2JTdGFydENvcHlGcm9tVVJMRXhjZXB0aW9uSGVhZGVycyxcbiAgICAgICAgfSxcbiAgICB9LFxuICAgIHF1ZXJ5UGFyYW1ldGVyczogW3RpbWVvdXRJblNlY29uZHNdLFxuICAgIHVybFBhcmFtZXRlcnM6IFt1cmxdLFxuICAgIGhlYWRlclBhcmFtZXRlcnM6IFtcbiAgICAgICAgdmVyc2lvbixcbiAgICAgICAgcmVxdWVzdElkLFxuICAgICAgICBhY2NlcHQxLFxuICAgICAgICBtZXRhZGF0YSxcbiAgICAgICAgbGVhc2VJZCxcbiAgICAgICAgaWZNb2RpZmllZFNpbmNlLFxuICAgICAgICBpZlVubW9kaWZpZWRTaW5jZSxcbiAgICAgICAgaWZNYXRjaCxcbiAgICAgICAgaWZOb25lTWF0Y2gsXG4gICAgICAgIGlmVGFncyxcbiAgICAgICAgaW1tdXRhYmlsaXR5UG9saWN5RXhwaXJ5LFxuICAgICAgICBpbW11dGFiaWxpdHlQb2xpY3lNb2RlLFxuICAgICAgICB0aWVyLFxuICAgICAgICByZWh5ZHJhdGVQcmlvcml0eSxcbiAgICAgICAgc291cmNlSWZNb2RpZmllZFNpbmNlLFxuICAgICAgICBzb3VyY2VJZlVubW9kaWZpZWRTaW5jZSxcbiAgICAgICAgc291cmNlSWZNYXRjaCxcbiAgICAgICAgc291cmNlSWZOb25lTWF0Y2gsXG4gICAgICAgIHNvdXJjZUlmVGFncyxcbiAgICAgICAgY29weVNvdXJjZSxcbiAgICAgICAgYmxvYlRhZ3NTdHJpbmcsXG4gICAgICAgIHNlYWxCbG9iLFxuICAgICAgICBsZWdhbEhvbGQxLFxuICAgIF0sXG4gICAgaXNYTUw6IHRydWUsXG4gICAgc2VyaWFsaXplcjogeG1sU2VyaWFsaXplciQzLFxufTtcbmNvbnN0IGNvcHlGcm9tVVJMT3BlcmF0aW9uU3BlYyA9IHtcbiAgICBwYXRoOiBcIi97Y29udGFpbmVyTmFtZX0ve2Jsb2J9XCIsXG4gICAgaHR0cE1ldGhvZDogXCJQVVRcIixcbiAgICByZXNwb25zZXM6IHtcbiAgICAgICAgMjAyOiB7XG4gICAgICAgICAgICBoZWFkZXJzTWFwcGVyOiBCbG9iQ29weUZyb21VUkxIZWFkZXJzLFxuICAgICAgICB9LFxuICAgICAgICBkZWZhdWx0OiB7XG4gICAgICAgICAgICBib2R5TWFwcGVyOiBTdG9yYWdlRXJyb3IsXG4gICAgICAgICAgICBoZWFkZXJzTWFwcGVyOiBCbG9iQ29weUZyb21VUkxFeGNlcHRpb25IZWFkZXJzLFxuICAgICAgICB9LFxuICAgIH0sXG4gICAgcXVlcnlQYXJhbWV0ZXJzOiBbdGltZW91dEluU2Vjb25kc10sXG4gICAgdXJsUGFyYW1ldGVyczogW3VybF0sXG4gICAgaGVhZGVyUGFyYW1ldGVyczogW1xuICAgICAgICB2ZXJzaW9uLFxuICAgICAgICByZXF1ZXN0SWQsXG4gICAgICAgIGFjY2VwdDEsXG4gICAgICAgIG1ldGFkYXRhLFxuICAgICAgICBsZWFzZUlkLFxuICAgICAgICBpZk1vZGlmaWVkU2luY2UsXG4gICAgICAgIGlmVW5tb2RpZmllZFNpbmNlLFxuICAgICAgICBpZk1hdGNoLFxuICAgICAgICBpZk5vbmVNYXRjaCxcbiAgICAgICAgaWZUYWdzLFxuICAgICAgICBpbW11dGFiaWxpdHlQb2xpY3lFeHBpcnksXG4gICAgICAgIGltbXV0YWJpbGl0eVBvbGljeU1vZGUsXG4gICAgICAgIGVuY3J5cHRpb25TY29wZSxcbiAgICAgICAgdGllcixcbiAgICAgICAgc291cmNlSWZNb2RpZmllZFNpbmNlLFxuICAgICAgICBzb3VyY2VJZlVubW9kaWZpZWRTaW5jZSxcbiAgICAgICAgc291cmNlSWZNYXRjaCxcbiAgICAgICAgc291cmNlSWZOb25lTWF0Y2gsXG4gICAgICAgIGNvcHlTb3VyY2UsXG4gICAgICAgIGJsb2JUYWdzU3RyaW5nLFxuICAgICAgICBsZWdhbEhvbGQxLFxuICAgICAgICB4TXNSZXF1aXJlc1N5bmMsXG4gICAgICAgIHNvdXJjZUNvbnRlbnRNRDUsXG4gICAgICAgIGNvcHlTb3VyY2VBdXRob3JpemF0aW9uLFxuICAgICAgICBjb3B5U291cmNlVGFncyxcbiAgICBdLFxuICAgIGlzWE1MOiB0cnVlLFxuICAgIHNlcmlhbGl6ZXI6IHhtbFNlcmlhbGl6ZXIkMyxcbn07XG5jb25zdCBhYm9ydENvcHlGcm9tVVJMT3BlcmF0aW9uU3BlYyA9IHtcbiAgICBwYXRoOiBcIi97Y29udGFpbmVyTmFtZX0ve2Jsb2J9XCIsXG4gICAgaHR0cE1ldGhvZDogXCJQVVRcIixcbiAgICByZXNwb25zZXM6IHtcbiAgICAgICAgMjA0OiB7XG4gICAgICAgICAgICBoZWFkZXJzTWFwcGVyOiBCbG9iQWJvcnRDb3B5RnJvbVVSTEhlYWRlcnMsXG4gICAgICAgIH0sXG4gICAgICAgIGRlZmF1bHQ6IHtcbiAgICAgICAgICAgIGJvZHlNYXBwZXI6IFN0b3JhZ2VFcnJvcixcbiAgICAgICAgICAgIGhlYWRlcnNNYXBwZXI6IEJsb2JBYm9ydENvcHlGcm9tVVJMRXhjZXB0aW9uSGVhZGVycyxcbiAgICAgICAgfSxcbiAgICB9LFxuICAgIHF1ZXJ5UGFyYW1ldGVyczogW1xuICAgICAgICB0aW1lb3V0SW5TZWNvbmRzLFxuICAgICAgICBjb21wMTUsXG4gICAgICAgIGNvcHlJZCxcbiAgICBdLFxuICAgIHVybFBhcmFtZXRlcnM6IFt1cmxdLFxuICAgIGhlYWRlclBhcmFtZXRlcnM6IFtcbiAgICAgICAgdmVyc2lvbixcbiAgICAgICAgcmVxdWVzdElkLFxuICAgICAgICBhY2NlcHQxLFxuICAgICAgICBsZWFzZUlkLFxuICAgICAgICBjb3B5QWN0aW9uQWJvcnRDb25zdGFudCxcbiAgICBdLFxuICAgIGlzWE1MOiB0cnVlLFxuICAgIHNlcmlhbGl6ZXI6IHhtbFNlcmlhbGl6ZXIkMyxcbn07XG5jb25zdCBzZXRUaWVyT3BlcmF0aW9uU3BlYyA9IHtcbiAgICBwYXRoOiBcIi97Y29udGFpbmVyTmFtZX0ve2Jsb2J9XCIsXG4gICAgaHR0cE1ldGhvZDogXCJQVVRcIixcbiAgICByZXNwb25zZXM6IHtcbiAgICAgICAgMjAwOiB7XG4gICAgICAgICAgICBoZWFkZXJzTWFwcGVyOiBCbG9iU2V0VGllckhlYWRlcnMsXG4gICAgICAgIH0sXG4gICAgICAgIDIwMjoge1xuICAgICAgICAgICAgaGVhZGVyc01hcHBlcjogQmxvYlNldFRpZXJIZWFkZXJzLFxuICAgICAgICB9LFxuICAgICAgICBkZWZhdWx0OiB7XG4gICAgICAgICAgICBib2R5TWFwcGVyOiBTdG9yYWdlRXJyb3IsXG4gICAgICAgICAgICBoZWFkZXJzTWFwcGVyOiBCbG9iU2V0VGllckV4Y2VwdGlvbkhlYWRlcnMsXG4gICAgICAgIH0sXG4gICAgfSxcbiAgICBxdWVyeVBhcmFtZXRlcnM6IFtcbiAgICAgICAgdGltZW91dEluU2Vjb25kcyxcbiAgICAgICAgc25hcHNob3QsXG4gICAgICAgIHZlcnNpb25JZCxcbiAgICAgICAgY29tcDE2LFxuICAgIF0sXG4gICAgdXJsUGFyYW1ldGVyczogW3VybF0sXG4gICAgaGVhZGVyUGFyYW1ldGVyczogW1xuICAgICAgICB2ZXJzaW9uLFxuICAgICAgICByZXF1ZXN0SWQsXG4gICAgICAgIGFjY2VwdDEsXG4gICAgICAgIGxlYXNlSWQsXG4gICAgICAgIGlmVGFncyxcbiAgICAgICAgcmVoeWRyYXRlUHJpb3JpdHksXG4gICAgICAgIHRpZXIxLFxuICAgIF0sXG4gICAgaXNYTUw6IHRydWUsXG4gICAgc2VyaWFsaXplcjogeG1sU2VyaWFsaXplciQzLFxufTtcbmNvbnN0IGdldEFjY291bnRJbmZvT3BlcmF0aW9uU3BlYyA9IHtcbiAgICBwYXRoOiBcIi97Y29udGFpbmVyTmFtZX0ve2Jsb2J9XCIsXG4gICAgaHR0cE1ldGhvZDogXCJHRVRcIixcbiAgICByZXNwb25zZXM6IHtcbiAgICAgICAgMjAwOiB7XG4gICAgICAgICAgICBoZWFkZXJzTWFwcGVyOiBCbG9iR2V0QWNjb3VudEluZm9IZWFkZXJzLFxuICAgICAgICB9LFxuICAgICAgICBkZWZhdWx0OiB7XG4gICAgICAgICAgICBib2R5TWFwcGVyOiBTdG9yYWdlRXJyb3IsXG4gICAgICAgICAgICBoZWFkZXJzTWFwcGVyOiBCbG9iR2V0QWNjb3VudEluZm9FeGNlcHRpb25IZWFkZXJzLFxuICAgICAgICB9LFxuICAgIH0sXG4gICAgcXVlcnlQYXJhbWV0ZXJzOiBbXG4gICAgICAgIGNvbXAsXG4gICAgICAgIHRpbWVvdXRJblNlY29uZHMsXG4gICAgICAgIHJlc3R5cGUxLFxuICAgIF0sXG4gICAgdXJsUGFyYW1ldGVyczogW3VybF0sXG4gICAgaGVhZGVyUGFyYW1ldGVyczogW1xuICAgICAgICB2ZXJzaW9uLFxuICAgICAgICByZXF1ZXN0SWQsXG4gICAgICAgIGFjY2VwdDEsXG4gICAgXSxcbiAgICBpc1hNTDogdHJ1ZSxcbiAgICBzZXJpYWxpemVyOiB4bWxTZXJpYWxpemVyJDMsXG59O1xuY29uc3QgcXVlcnlPcGVyYXRpb25TcGVjID0ge1xuICAgIHBhdGg6IFwiL3tjb250YWluZXJOYW1lfS97YmxvYn1cIixcbiAgICBodHRwTWV0aG9kOiBcIlBPU1RcIixcbiAgICByZXNwb25zZXM6IHtcbiAgICAgICAgMjAwOiB7XG4gICAgICAgICAgICBib2R5TWFwcGVyOiB7XG4gICAgICAgICAgICAgICAgdHlwZTogeyBuYW1lOiBcIlN0cmVhbVwiIH0sXG4gICAgICAgICAgICAgICAgc2VyaWFsaXplZE5hbWU6IFwicGFyc2VkUmVzcG9uc2VcIixcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBoZWFkZXJzTWFwcGVyOiBCbG9iUXVlcnlIZWFkZXJzLFxuICAgICAgICB9LFxuICAgICAgICAyMDY6IHtcbiAgICAgICAgICAgIGJvZHlNYXBwZXI6IHtcbiAgICAgICAgICAgICAgICB0eXBlOiB7IG5hbWU6IFwiU3RyZWFtXCIgfSxcbiAgICAgICAgICAgICAgICBzZXJpYWxpemVkTmFtZTogXCJwYXJzZWRSZXNwb25zZVwiLFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIGhlYWRlcnNNYXBwZXI6IEJsb2JRdWVyeUhlYWRlcnMsXG4gICAgICAgIH0sXG4gICAgICAgIGRlZmF1bHQ6IHtcbiAgICAgICAgICAgIGJvZHlNYXBwZXI6IFN0b3JhZ2VFcnJvcixcbiAgICAgICAgICAgIGhlYWRlcnNNYXBwZXI6IEJsb2JRdWVyeUV4Y2VwdGlvbkhlYWRlcnMsXG4gICAgICAgIH0sXG4gICAgfSxcbiAgICByZXF1ZXN0Qm9keTogcXVlcnlSZXF1ZXN0LFxuICAgIHF1ZXJ5UGFyYW1ldGVyczogW1xuICAgICAgICB0aW1lb3V0SW5TZWNvbmRzLFxuICAgICAgICBzbmFwc2hvdCxcbiAgICAgICAgY29tcDE3LFxuICAgIF0sXG4gICAgdXJsUGFyYW1ldGVyczogW3VybF0sXG4gICAgaGVhZGVyUGFyYW1ldGVyczogW1xuICAgICAgICBjb250ZW50VHlwZSxcbiAgICAgICAgYWNjZXB0LFxuICAgICAgICB2ZXJzaW9uLFxuICAgICAgICByZXF1ZXN0SWQsXG4gICAgICAgIGxlYXNlSWQsXG4gICAgICAgIGlmTW9kaWZpZWRTaW5jZSxcbiAgICAgICAgaWZVbm1vZGlmaWVkU2luY2UsXG4gICAgICAgIGVuY3J5cHRpb25LZXksXG4gICAgICAgIGVuY3J5cHRpb25LZXlTaGEyNTYsXG4gICAgICAgIGVuY3J5cHRpb25BbGdvcml0aG0sXG4gICAgICAgIGlmTWF0Y2gsXG4gICAgICAgIGlmTm9uZU1hdGNoLFxuICAgICAgICBpZlRhZ3MsXG4gICAgXSxcbiAgICBpc1hNTDogdHJ1ZSxcbiAgICBjb250ZW50VHlwZTogXCJhcHBsaWNhdGlvbi94bWw7IGNoYXJzZXQ9dXRmLThcIixcbiAgICBtZWRpYVR5cGU6IFwieG1sXCIsXG4gICAgc2VyaWFsaXplcjogeG1sU2VyaWFsaXplciQzLFxufTtcbmNvbnN0IGdldFRhZ3NPcGVyYXRpb25TcGVjID0ge1xuICAgIHBhdGg6IFwiL3tjb250YWluZXJOYW1lfS97YmxvYn1cIixcbiAgICBodHRwTWV0aG9kOiBcIkdFVFwiLFxuICAgIHJlc3BvbnNlczoge1xuICAgICAgICAyMDA6IHtcbiAgICAgICAgICAgIGJvZHlNYXBwZXI6IEJsb2JUYWdzLFxuICAgICAgICAgICAgaGVhZGVyc01hcHBlcjogQmxvYkdldFRhZ3NIZWFkZXJzLFxuICAgICAgICB9LFxuICAgICAgICBkZWZhdWx0OiB7XG4gICAgICAgICAgICBib2R5TWFwcGVyOiBTdG9yYWdlRXJyb3IsXG4gICAgICAgICAgICBoZWFkZXJzTWFwcGVyOiBCbG9iR2V0VGFnc0V4Y2VwdGlvbkhlYWRlcnMsXG4gICAgICAgIH0sXG4gICAgfSxcbiAgICBxdWVyeVBhcmFtZXRlcnM6IFtcbiAgICAgICAgdGltZW91dEluU2Vjb25kcyxcbiAgICAgICAgc25hcHNob3QsXG4gICAgICAgIHZlcnNpb25JZCxcbiAgICAgICAgY29tcDE4LFxuICAgIF0sXG4gICAgdXJsUGFyYW1ldGVyczogW3VybF0sXG4gICAgaGVhZGVyUGFyYW1ldGVyczogW1xuICAgICAgICB2ZXJzaW9uLFxuICAgICAgICByZXF1ZXN0SWQsXG4gICAgICAgIGFjY2VwdDEsXG4gICAgICAgIGxlYXNlSWQsXG4gICAgICAgIGlmVGFncyxcbiAgICBdLFxuICAgIGlzWE1MOiB0cnVlLFxuICAgIHNlcmlhbGl6ZXI6IHhtbFNlcmlhbGl6ZXIkMyxcbn07XG5jb25zdCBzZXRUYWdzT3BlcmF0aW9uU3BlYyA9IHtcbiAgICBwYXRoOiBcIi97Y29udGFpbmVyTmFtZX0ve2Jsb2J9XCIsXG4gICAgaHR0cE1ldGhvZDogXCJQVVRcIixcbiAgICByZXNwb25zZXM6IHtcbiAgICAgICAgMjA0OiB7XG4gICAgICAgICAgICBoZWFkZXJzTWFwcGVyOiBCbG9iU2V0VGFnc0hlYWRlcnMsXG4gICAgICAgIH0sXG4gICAgICAgIGRlZmF1bHQ6IHtcbiAgICAgICAgICAgIGJvZHlNYXBwZXI6IFN0b3JhZ2VFcnJvcixcbiAgICAgICAgICAgIGhlYWRlcnNNYXBwZXI6IEJsb2JTZXRUYWdzRXhjZXB0aW9uSGVhZGVycyxcbiAgICAgICAgfSxcbiAgICB9LFxuICAgIHJlcXVlc3RCb2R5OiB0YWdzLFxuICAgIHF1ZXJ5UGFyYW1ldGVyczogW1xuICAgICAgICB0aW1lb3V0SW5TZWNvbmRzLFxuICAgICAgICB2ZXJzaW9uSWQsXG4gICAgICAgIGNvbXAxOCxcbiAgICBdLFxuICAgIHVybFBhcmFtZXRlcnM6IFt1cmxdLFxuICAgIGhlYWRlclBhcmFtZXRlcnM6IFtcbiAgICAgICAgY29udGVudFR5cGUsXG4gICAgICAgIGFjY2VwdCxcbiAgICAgICAgdmVyc2lvbixcbiAgICAgICAgcmVxdWVzdElkLFxuICAgICAgICBsZWFzZUlkLFxuICAgICAgICBpZlRhZ3MsXG4gICAgICAgIHRyYW5zYWN0aW9uYWxDb250ZW50TUQ1LFxuICAgICAgICB0cmFuc2FjdGlvbmFsQ29udGVudENyYzY0LFxuICAgIF0sXG4gICAgaXNYTUw6IHRydWUsXG4gICAgY29udGVudFR5cGU6IFwiYXBwbGljYXRpb24veG1sOyBjaGFyc2V0PXV0Zi04XCIsXG4gICAgbWVkaWFUeXBlOiBcInhtbFwiLFxuICAgIHNlcmlhbGl6ZXI6IHhtbFNlcmlhbGl6ZXIkMyxcbn07XG5cbi8qXG4gKiBDb3B5cmlnaHQgKGMpIE1pY3Jvc29mdCBDb3Jwb3JhdGlvbi5cbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBNSVQgTGljZW5zZS5cbiAqXG4gKiBDb2RlIGdlbmVyYXRlZCBieSBNaWNyb3NvZnQgKFIpIEF1dG9SZXN0IENvZGUgR2VuZXJhdG9yLlxuICogQ2hhbmdlcyBtYXkgY2F1c2UgaW5jb3JyZWN0IGJlaGF2aW9yIGFuZCB3aWxsIGJlIGxvc3QgaWYgdGhlIGNvZGUgaXMgcmVnZW5lcmF0ZWQuXG4gKi9cbi8qKiBDbGFzcyBjb250YWluaW5nIFBhZ2VCbG9iIG9wZXJhdGlvbnMuICovXG5jbGFzcyBQYWdlQmxvYkltcGwge1xuICAgIC8qKlxuICAgICAqIEluaXRpYWxpemUgYSBuZXcgaW5zdGFuY2Ugb2YgdGhlIGNsYXNzIFBhZ2VCbG9iIGNsYXNzLlxuICAgICAqIEBwYXJhbSBjbGllbnQgUmVmZXJlbmNlIHRvIHRoZSBzZXJ2aWNlIGNsaWVudFxuICAgICAqL1xuICAgIGNvbnN0cnVjdG9yKGNsaWVudCkge1xuICAgICAgICB0aGlzLmNsaWVudCA9IGNsaWVudDtcbiAgICB9XG4gICAgLyoqXG4gICAgICogVGhlIENyZWF0ZSBvcGVyYXRpb24gY3JlYXRlcyBhIG5ldyBwYWdlIGJsb2IuXG4gICAgICogQHBhcmFtIGNvbnRlbnRMZW5ndGggVGhlIGxlbmd0aCBvZiB0aGUgcmVxdWVzdC5cbiAgICAgKiBAcGFyYW0gYmxvYkNvbnRlbnRMZW5ndGggVGhpcyBoZWFkZXIgc3BlY2lmaWVzIHRoZSBtYXhpbXVtIHNpemUgZm9yIHRoZSBwYWdlIGJsb2IsIHVwIHRvIDEgVEIuIFRoZVxuICAgICAqICAgICAgICAgICAgICAgICAgICAgICAgICBwYWdlIGJsb2Igc2l6ZSBtdXN0IGJlIGFsaWduZWQgdG8gYSA1MTItYnl0ZSBib3VuZGFyeS5cbiAgICAgKiBAcGFyYW0gb3B0aW9ucyBUaGUgb3B0aW9ucyBwYXJhbWV0ZXJzLlxuICAgICAqL1xuICAgIGNyZWF0ZShjb250ZW50TGVuZ3RoLCBibG9iQ29udGVudExlbmd0aCwgb3B0aW9ucykge1xuICAgICAgICByZXR1cm4gdGhpcy5jbGllbnQuc2VuZE9wZXJhdGlvblJlcXVlc3QoeyBjb250ZW50TGVuZ3RoLCBibG9iQ29udGVudExlbmd0aCwgb3B0aW9ucyB9LCBjcmVhdGVPcGVyYXRpb25TcGVjJDEpO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBUaGUgVXBsb2FkIFBhZ2VzIG9wZXJhdGlvbiB3cml0ZXMgYSByYW5nZSBvZiBwYWdlcyB0byBhIHBhZ2UgYmxvYlxuICAgICAqIEBwYXJhbSBjb250ZW50TGVuZ3RoIFRoZSBsZW5ndGggb2YgdGhlIHJlcXVlc3QuXG4gICAgICogQHBhcmFtIGJvZHkgSW5pdGlhbCBkYXRhXG4gICAgICogQHBhcmFtIG9wdGlvbnMgVGhlIG9wdGlvbnMgcGFyYW1ldGVycy5cbiAgICAgKi9cbiAgICB1cGxvYWRQYWdlcyhjb250ZW50TGVuZ3RoLCBib2R5LCBvcHRpb25zKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmNsaWVudC5zZW5kT3BlcmF0aW9uUmVxdWVzdCh7IGNvbnRlbnRMZW5ndGgsIGJvZHksIG9wdGlvbnMgfSwgdXBsb2FkUGFnZXNPcGVyYXRpb25TcGVjKTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogVGhlIENsZWFyIFBhZ2VzIG9wZXJhdGlvbiBjbGVhcnMgYSBzZXQgb2YgcGFnZXMgZnJvbSBhIHBhZ2UgYmxvYlxuICAgICAqIEBwYXJhbSBjb250ZW50TGVuZ3RoIFRoZSBsZW5ndGggb2YgdGhlIHJlcXVlc3QuXG4gICAgICogQHBhcmFtIG9wdGlvbnMgVGhlIG9wdGlvbnMgcGFyYW1ldGVycy5cbiAgICAgKi9cbiAgICBjbGVhclBhZ2VzKGNvbnRlbnRMZW5ndGgsIG9wdGlvbnMpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuY2xpZW50LnNlbmRPcGVyYXRpb25SZXF1ZXN0KHsgY29udGVudExlbmd0aCwgb3B0aW9ucyB9LCBjbGVhclBhZ2VzT3BlcmF0aW9uU3BlYyk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIFRoZSBVcGxvYWQgUGFnZXMgb3BlcmF0aW9uIHdyaXRlcyBhIHJhbmdlIG9mIHBhZ2VzIHRvIGEgcGFnZSBibG9iIHdoZXJlIHRoZSBjb250ZW50cyBhcmUgcmVhZCBmcm9tIGFcbiAgICAgKiBVUkxcbiAgICAgKiBAcGFyYW0gc291cmNlVXJsIFNwZWNpZnkgYSBVUkwgdG8gdGhlIGNvcHkgc291cmNlLlxuICAgICAqIEBwYXJhbSBzb3VyY2VSYW5nZSBCeXRlcyBvZiBzb3VyY2UgZGF0YSBpbiB0aGUgc3BlY2lmaWVkIHJhbmdlLiBUaGUgbGVuZ3RoIG9mIHRoaXMgcmFuZ2Ugc2hvdWxkXG4gICAgICogICAgICAgICAgICAgICAgICAgIG1hdGNoIHRoZSBDb250ZW50TGVuZ3RoIGhlYWRlciBhbmQgeC1tcy1yYW5nZS9SYW5nZSBkZXN0aW5hdGlvbiByYW5nZSBoZWFkZXIuXG4gICAgICogQHBhcmFtIGNvbnRlbnRMZW5ndGggVGhlIGxlbmd0aCBvZiB0aGUgcmVxdWVzdC5cbiAgICAgKiBAcGFyYW0gcmFuZ2UgVGhlIHJhbmdlIG9mIGJ5dGVzIHRvIHdoaWNoIHRoZSBzb3VyY2UgcmFuZ2Ugd291bGQgYmUgd3JpdHRlbi4gVGhlIHJhbmdlIHNob3VsZCBiZSA1MTJcbiAgICAgKiAgICAgICAgICAgICAgYWxpZ25lZCBhbmQgcmFuZ2UtZW5kIGlzIHJlcXVpcmVkLlxuICAgICAqIEBwYXJhbSBvcHRpb25zIFRoZSBvcHRpb25zIHBhcmFtZXRlcnMuXG4gICAgICovXG4gICAgdXBsb2FkUGFnZXNGcm9tVVJMKHNvdXJjZVVybCwgc291cmNlUmFuZ2UsIGNvbnRlbnRMZW5ndGgsIHJhbmdlLCBvcHRpb25zKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmNsaWVudC5zZW5kT3BlcmF0aW9uUmVxdWVzdCh7IHNvdXJjZVVybCwgc291cmNlUmFuZ2UsIGNvbnRlbnRMZW5ndGgsIHJhbmdlLCBvcHRpb25zIH0sIHVwbG9hZFBhZ2VzRnJvbVVSTE9wZXJhdGlvblNwZWMpO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBUaGUgR2V0IFBhZ2UgUmFuZ2VzIG9wZXJhdGlvbiByZXR1cm5zIHRoZSBsaXN0IG9mIHZhbGlkIHBhZ2UgcmFuZ2VzIGZvciBhIHBhZ2UgYmxvYiBvciBzbmFwc2hvdCBvZiBhXG4gICAgICogcGFnZSBibG9iXG4gICAgICogQHBhcmFtIG9wdGlvbnMgVGhlIG9wdGlvbnMgcGFyYW1ldGVycy5cbiAgICAgKi9cbiAgICBnZXRQYWdlUmFuZ2VzKG9wdGlvbnMpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuY2xpZW50LnNlbmRPcGVyYXRpb25SZXF1ZXN0KHsgb3B0aW9ucyB9LCBnZXRQYWdlUmFuZ2VzT3BlcmF0aW9uU3BlYyk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIFRoZSBHZXQgUGFnZSBSYW5nZXMgRGlmZiBvcGVyYXRpb24gcmV0dXJucyB0aGUgbGlzdCBvZiB2YWxpZCBwYWdlIHJhbmdlcyBmb3IgYSBwYWdlIGJsb2IgdGhhdCB3ZXJlXG4gICAgICogY2hhbmdlZCBiZXR3ZWVuIHRhcmdldCBibG9iIGFuZCBwcmV2aW91cyBzbmFwc2hvdC5cbiAgICAgKiBAcGFyYW0gb3B0aW9ucyBUaGUgb3B0aW9ucyBwYXJhbWV0ZXJzLlxuICAgICAqL1xuICAgIGdldFBhZ2VSYW5nZXNEaWZmKG9wdGlvbnMpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuY2xpZW50LnNlbmRPcGVyYXRpb25SZXF1ZXN0KHsgb3B0aW9ucyB9LCBnZXRQYWdlUmFuZ2VzRGlmZk9wZXJhdGlvblNwZWMpO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBSZXNpemUgdGhlIEJsb2JcbiAgICAgKiBAcGFyYW0gYmxvYkNvbnRlbnRMZW5ndGggVGhpcyBoZWFkZXIgc3BlY2lmaWVzIHRoZSBtYXhpbXVtIHNpemUgZm9yIHRoZSBwYWdlIGJsb2IsIHVwIHRvIDEgVEIuIFRoZVxuICAgICAqICAgICAgICAgICAgICAgICAgICAgICAgICBwYWdlIGJsb2Igc2l6ZSBtdXN0IGJlIGFsaWduZWQgdG8gYSA1MTItYnl0ZSBib3VuZGFyeS5cbiAgICAgKiBAcGFyYW0gb3B0aW9ucyBUaGUgb3B0aW9ucyBwYXJhbWV0ZXJzLlxuICAgICAqL1xuICAgIHJlc2l6ZShibG9iQ29udGVudExlbmd0aCwgb3B0aW9ucykge1xuICAgICAgICByZXR1cm4gdGhpcy5jbGllbnQuc2VuZE9wZXJhdGlvblJlcXVlc3QoeyBibG9iQ29udGVudExlbmd0aCwgb3B0aW9ucyB9LCByZXNpemVPcGVyYXRpb25TcGVjKTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogVXBkYXRlIHRoZSBzZXF1ZW5jZSBudW1iZXIgb2YgdGhlIGJsb2JcbiAgICAgKiBAcGFyYW0gc2VxdWVuY2VOdW1iZXJBY3Rpb24gUmVxdWlyZWQgaWYgdGhlIHgtbXMtYmxvYi1zZXF1ZW5jZS1udW1iZXIgaGVhZGVyIGlzIHNldCBmb3IgdGhlIHJlcXVlc3QuXG4gICAgICogICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRoaXMgcHJvcGVydHkgYXBwbGllcyB0byBwYWdlIGJsb2JzIG9ubHkuIFRoaXMgcHJvcGVydHkgaW5kaWNhdGVzIGhvdyB0aGUgc2VydmljZSBzaG91bGQgbW9kaWZ5IHRoZVxuICAgICAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICBibG9iJ3Mgc2VxdWVuY2UgbnVtYmVyXG4gICAgICogQHBhcmFtIG9wdGlvbnMgVGhlIG9wdGlvbnMgcGFyYW1ldGVycy5cbiAgICAgKi9cbiAgICB1cGRhdGVTZXF1ZW5jZU51bWJlcihzZXF1ZW5jZU51bWJlckFjdGlvbiwgb3B0aW9ucykge1xuICAgICAgICByZXR1cm4gdGhpcy5jbGllbnQuc2VuZE9wZXJhdGlvblJlcXVlc3QoeyBzZXF1ZW5jZU51bWJlckFjdGlvbiwgb3B0aW9ucyB9LCB1cGRhdGVTZXF1ZW5jZU51bWJlck9wZXJhdGlvblNwZWMpO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBUaGUgQ29weSBJbmNyZW1lbnRhbCBvcGVyYXRpb24gY29waWVzIGEgc25hcHNob3Qgb2YgdGhlIHNvdXJjZSBwYWdlIGJsb2IgdG8gYSBkZXN0aW5hdGlvbiBwYWdlIGJsb2IuXG4gICAgICogVGhlIHNuYXBzaG90IGlzIGNvcGllZCBzdWNoIHRoYXQgb25seSB0aGUgZGlmZmVyZW50aWFsIGNoYW5nZXMgYmV0d2VlbiB0aGUgcHJldmlvdXNseSBjb3BpZWRcbiAgICAgKiBzbmFwc2hvdCBhcmUgdHJhbnNmZXJyZWQgdG8gdGhlIGRlc3RpbmF0aW9uLiBUaGUgY29waWVkIHNuYXBzaG90cyBhcmUgY29tcGxldGUgY29waWVzIG9mIHRoZVxuICAgICAqIG9yaWdpbmFsIHNuYXBzaG90IGFuZCBjYW4gYmUgcmVhZCBvciBjb3BpZWQgZnJvbSBhcyB1c3VhbC4gVGhpcyBBUEkgaXMgc3VwcG9ydGVkIHNpbmNlIFJFU1QgdmVyc2lvblxuICAgICAqIDIwMTYtMDUtMzEuXG4gICAgICogQHBhcmFtIGNvcHlTb3VyY2UgU3BlY2lmaWVzIHRoZSBuYW1lIG9mIHRoZSBzb3VyY2UgcGFnZSBibG9iIHNuYXBzaG90LiBUaGlzIHZhbHVlIGlzIGEgVVJMIG9mIHVwIHRvXG4gICAgICogICAgICAgICAgICAgICAgICAgMiBLQiBpbiBsZW5ndGggdGhhdCBzcGVjaWZpZXMgYSBwYWdlIGJsb2Igc25hcHNob3QuIFRoZSB2YWx1ZSBzaG91bGQgYmUgVVJMLWVuY29kZWQgYXMgaXQgd291bGRcbiAgICAgKiAgICAgICAgICAgICAgICAgICBhcHBlYXIgaW4gYSByZXF1ZXN0IFVSSS4gVGhlIHNvdXJjZSBibG9iIG11c3QgZWl0aGVyIGJlIHB1YmxpYyBvciBtdXN0IGJlIGF1dGhlbnRpY2F0ZWQgdmlhIGEgc2hhcmVkXG4gICAgICogICAgICAgICAgICAgICAgICAgYWNjZXNzIHNpZ25hdHVyZS5cbiAgICAgKiBAcGFyYW0gb3B0aW9ucyBUaGUgb3B0aW9ucyBwYXJhbWV0ZXJzLlxuICAgICAqL1xuICAgIGNvcHlJbmNyZW1lbnRhbChjb3B5U291cmNlLCBvcHRpb25zKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmNsaWVudC5zZW5kT3BlcmF0aW9uUmVxdWVzdCh7IGNvcHlTb3VyY2UsIG9wdGlvbnMgfSwgY29weUluY3JlbWVudGFsT3BlcmF0aW9uU3BlYyk7XG4gICAgfVxufVxuLy8gT3BlcmF0aW9uIFNwZWNpZmljYXRpb25zXG5jb25zdCB4bWxTZXJpYWxpemVyJDIgPSBjb3JlQ2xpZW50X19uYW1lc3BhY2UuY3JlYXRlU2VyaWFsaXplcihNYXBwZXJzLCAvKiBpc1htbCAqLyB0cnVlKTtcbmNvbnN0IGNyZWF0ZU9wZXJhdGlvblNwZWMkMSA9IHtcbiAgICBwYXRoOiBcIi97Y29udGFpbmVyTmFtZX0ve2Jsb2J9XCIsXG4gICAgaHR0cE1ldGhvZDogXCJQVVRcIixcbiAgICByZXNwb25zZXM6IHtcbiAgICAgICAgMjAxOiB7XG4gICAgICAgICAgICBoZWFkZXJzTWFwcGVyOiBQYWdlQmxvYkNyZWF0ZUhlYWRlcnMsXG4gICAgICAgIH0sXG4gICAgICAgIGRlZmF1bHQ6IHtcbiAgICAgICAgICAgIGJvZHlNYXBwZXI6IFN0b3JhZ2VFcnJvcixcbiAgICAgICAgICAgIGhlYWRlcnNNYXBwZXI6IFBhZ2VCbG9iQ3JlYXRlRXhjZXB0aW9uSGVhZGVycyxcbiAgICAgICAgfSxcbiAgICB9LFxuICAgIHF1ZXJ5UGFyYW1ldGVyczogW3RpbWVvdXRJblNlY29uZHNdLFxuICAgIHVybFBhcmFtZXRlcnM6IFt1cmxdLFxuICAgIGhlYWRlclBhcmFtZXRlcnM6IFtcbiAgICAgICAgdmVyc2lvbixcbiAgICAgICAgcmVxdWVzdElkLFxuICAgICAgICBhY2NlcHQxLFxuICAgICAgICBjb250ZW50TGVuZ3RoLFxuICAgICAgICBtZXRhZGF0YSxcbiAgICAgICAgbGVhc2VJZCxcbiAgICAgICAgaWZNb2RpZmllZFNpbmNlLFxuICAgICAgICBpZlVubW9kaWZpZWRTaW5jZSxcbiAgICAgICAgZW5jcnlwdGlvbktleSxcbiAgICAgICAgZW5jcnlwdGlvbktleVNoYTI1NixcbiAgICAgICAgZW5jcnlwdGlvbkFsZ29yaXRobSxcbiAgICAgICAgaWZNYXRjaCxcbiAgICAgICAgaWZOb25lTWF0Y2gsXG4gICAgICAgIGlmVGFncyxcbiAgICAgICAgYmxvYkNhY2hlQ29udHJvbCxcbiAgICAgICAgYmxvYkNvbnRlbnRUeXBlLFxuICAgICAgICBibG9iQ29udGVudE1ENSxcbiAgICAgICAgYmxvYkNvbnRlbnRFbmNvZGluZyxcbiAgICAgICAgYmxvYkNvbnRlbnRMYW5ndWFnZSxcbiAgICAgICAgYmxvYkNvbnRlbnREaXNwb3NpdGlvbixcbiAgICAgICAgaW1tdXRhYmlsaXR5UG9saWN5RXhwaXJ5LFxuICAgICAgICBpbW11dGFiaWxpdHlQb2xpY3lNb2RlLFxuICAgICAgICBlbmNyeXB0aW9uU2NvcGUsXG4gICAgICAgIHRpZXIsXG4gICAgICAgIGJsb2JUYWdzU3RyaW5nLFxuICAgICAgICBsZWdhbEhvbGQxLFxuICAgICAgICBibG9iVHlwZSxcbiAgICAgICAgYmxvYkNvbnRlbnRMZW5ndGgsXG4gICAgICAgIGJsb2JTZXF1ZW5jZU51bWJlcixcbiAgICBdLFxuICAgIGlzWE1MOiB0cnVlLFxuICAgIHNlcmlhbGl6ZXI6IHhtbFNlcmlhbGl6ZXIkMixcbn07XG5jb25zdCB1cGxvYWRQYWdlc09wZXJhdGlvblNwZWMgPSB7XG4gICAgcGF0aDogXCIve2NvbnRhaW5lck5hbWV9L3tibG9ifVwiLFxuICAgIGh0dHBNZXRob2Q6IFwiUFVUXCIsXG4gICAgcmVzcG9uc2VzOiB7XG4gICAgICAgIDIwMToge1xuICAgICAgICAgICAgaGVhZGVyc01hcHBlcjogUGFnZUJsb2JVcGxvYWRQYWdlc0hlYWRlcnMsXG4gICAgICAgIH0sXG4gICAgICAgIGRlZmF1bHQ6IHtcbiAgICAgICAgICAgIGJvZHlNYXBwZXI6IFN0b3JhZ2VFcnJvcixcbiAgICAgICAgICAgIGhlYWRlcnNNYXBwZXI6IFBhZ2VCbG9iVXBsb2FkUGFnZXNFeGNlcHRpb25IZWFkZXJzLFxuICAgICAgICB9LFxuICAgIH0sXG4gICAgcmVxdWVzdEJvZHk6IGJvZHkxLFxuICAgIHF1ZXJ5UGFyYW1ldGVyczogW3RpbWVvdXRJblNlY29uZHMsIGNvbXAxOV0sXG4gICAgdXJsUGFyYW1ldGVyczogW3VybF0sXG4gICAgaGVhZGVyUGFyYW1ldGVyczogW1xuICAgICAgICB2ZXJzaW9uLFxuICAgICAgICByZXF1ZXN0SWQsXG4gICAgICAgIGNvbnRlbnRMZW5ndGgsXG4gICAgICAgIGxlYXNlSWQsXG4gICAgICAgIGlmTW9kaWZpZWRTaW5jZSxcbiAgICAgICAgaWZVbm1vZGlmaWVkU2luY2UsXG4gICAgICAgIHJhbmdlLFxuICAgICAgICBlbmNyeXB0aW9uS2V5LFxuICAgICAgICBlbmNyeXB0aW9uS2V5U2hhMjU2LFxuICAgICAgICBlbmNyeXB0aW9uQWxnb3JpdGhtLFxuICAgICAgICBpZk1hdGNoLFxuICAgICAgICBpZk5vbmVNYXRjaCxcbiAgICAgICAgaWZUYWdzLFxuICAgICAgICBlbmNyeXB0aW9uU2NvcGUsXG4gICAgICAgIHRyYW5zYWN0aW9uYWxDb250ZW50TUQ1LFxuICAgICAgICB0cmFuc2FjdGlvbmFsQ29udGVudENyYzY0LFxuICAgICAgICBjb250ZW50VHlwZTEsXG4gICAgICAgIGFjY2VwdDIsXG4gICAgICAgIHBhZ2VXcml0ZSxcbiAgICAgICAgaWZTZXF1ZW5jZU51bWJlckxlc3NUaGFuT3JFcXVhbFRvLFxuICAgICAgICBpZlNlcXVlbmNlTnVtYmVyTGVzc1RoYW4sXG4gICAgICAgIGlmU2VxdWVuY2VOdW1iZXJFcXVhbFRvLFxuICAgIF0sXG4gICAgaXNYTUw6IHRydWUsXG4gICAgY29udGVudFR5cGU6IFwiYXBwbGljYXRpb24veG1sOyBjaGFyc2V0PXV0Zi04XCIsXG4gICAgbWVkaWFUeXBlOiBcImJpbmFyeVwiLFxuICAgIHNlcmlhbGl6ZXI6IHhtbFNlcmlhbGl6ZXIkMixcbn07XG5jb25zdCBjbGVhclBhZ2VzT3BlcmF0aW9uU3BlYyA9IHtcbiAgICBwYXRoOiBcIi97Y29udGFpbmVyTmFtZX0ve2Jsb2J9XCIsXG4gICAgaHR0cE1ldGhvZDogXCJQVVRcIixcbiAgICByZXNwb25zZXM6IHtcbiAgICAgICAgMjAxOiB7XG4gICAgICAgICAgICBoZWFkZXJzTWFwcGVyOiBQYWdlQmxvYkNsZWFyUGFnZXNIZWFkZXJzLFxuICAgICAgICB9LFxuICAgICAgICBkZWZhdWx0OiB7XG4gICAgICAgICAgICBib2R5TWFwcGVyOiBTdG9yYWdlRXJyb3IsXG4gICAgICAgICAgICBoZWFkZXJzTWFwcGVyOiBQYWdlQmxvYkNsZWFyUGFnZXNFeGNlcHRpb25IZWFkZXJzLFxuICAgICAgICB9LFxuICAgIH0sXG4gICAgcXVlcnlQYXJhbWV0ZXJzOiBbdGltZW91dEluU2Vjb25kcywgY29tcDE5XSxcbiAgICB1cmxQYXJhbWV0ZXJzOiBbdXJsXSxcbiAgICBoZWFkZXJQYXJhbWV0ZXJzOiBbXG4gICAgICAgIHZlcnNpb24sXG4gICAgICAgIHJlcXVlc3RJZCxcbiAgICAgICAgYWNjZXB0MSxcbiAgICAgICAgY29udGVudExlbmd0aCxcbiAgICAgICAgbGVhc2VJZCxcbiAgICAgICAgaWZNb2RpZmllZFNpbmNlLFxuICAgICAgICBpZlVubW9kaWZpZWRTaW5jZSxcbiAgICAgICAgcmFuZ2UsXG4gICAgICAgIGVuY3J5cHRpb25LZXksXG4gICAgICAgIGVuY3J5cHRpb25LZXlTaGEyNTYsXG4gICAgICAgIGVuY3J5cHRpb25BbGdvcml0aG0sXG4gICAgICAgIGlmTWF0Y2gsXG4gICAgICAgIGlmTm9uZU1hdGNoLFxuICAgICAgICBpZlRhZ3MsXG4gICAgICAgIGVuY3J5cHRpb25TY29wZSxcbiAgICAgICAgaWZTZXF1ZW5jZU51bWJlckxlc3NUaGFuT3JFcXVhbFRvLFxuICAgICAgICBpZlNlcXVlbmNlTnVtYmVyTGVzc1RoYW4sXG4gICAgICAgIGlmU2VxdWVuY2VOdW1iZXJFcXVhbFRvLFxuICAgICAgICBwYWdlV3JpdGUxLFxuICAgIF0sXG4gICAgaXNYTUw6IHRydWUsXG4gICAgc2VyaWFsaXplcjogeG1sU2VyaWFsaXplciQyLFxufTtcbmNvbnN0IHVwbG9hZFBhZ2VzRnJvbVVSTE9wZXJhdGlvblNwZWMgPSB7XG4gICAgcGF0aDogXCIve2NvbnRhaW5lck5hbWV9L3tibG9ifVwiLFxuICAgIGh0dHBNZXRob2Q6IFwiUFVUXCIsXG4gICAgcmVzcG9uc2VzOiB7XG4gICAgICAgIDIwMToge1xuICAgICAgICAgICAgaGVhZGVyc01hcHBlcjogUGFnZUJsb2JVcGxvYWRQYWdlc0Zyb21VUkxIZWFkZXJzLFxuICAgICAgICB9LFxuICAgICAgICBkZWZhdWx0OiB7XG4gICAgICAgICAgICBib2R5TWFwcGVyOiBTdG9yYWdlRXJyb3IsXG4gICAgICAgICAgICBoZWFkZXJzTWFwcGVyOiBQYWdlQmxvYlVwbG9hZFBhZ2VzRnJvbVVSTEV4Y2VwdGlvbkhlYWRlcnMsXG4gICAgICAgIH0sXG4gICAgfSxcbiAgICBxdWVyeVBhcmFtZXRlcnM6IFt0aW1lb3V0SW5TZWNvbmRzLCBjb21wMTldLFxuICAgIHVybFBhcmFtZXRlcnM6IFt1cmxdLFxuICAgIGhlYWRlclBhcmFtZXRlcnM6IFtcbiAgICAgICAgdmVyc2lvbixcbiAgICAgICAgcmVxdWVzdElkLFxuICAgICAgICBhY2NlcHQxLFxuICAgICAgICBjb250ZW50TGVuZ3RoLFxuICAgICAgICBsZWFzZUlkLFxuICAgICAgICBpZk1vZGlmaWVkU2luY2UsXG4gICAgICAgIGlmVW5tb2RpZmllZFNpbmNlLFxuICAgICAgICBlbmNyeXB0aW9uS2V5LFxuICAgICAgICBlbmNyeXB0aW9uS2V5U2hhMjU2LFxuICAgICAgICBlbmNyeXB0aW9uQWxnb3JpdGhtLFxuICAgICAgICBpZk1hdGNoLFxuICAgICAgICBpZk5vbmVNYXRjaCxcbiAgICAgICAgaWZUYWdzLFxuICAgICAgICBlbmNyeXB0aW9uU2NvcGUsXG4gICAgICAgIHNvdXJjZUlmTW9kaWZpZWRTaW5jZSxcbiAgICAgICAgc291cmNlSWZVbm1vZGlmaWVkU2luY2UsXG4gICAgICAgIHNvdXJjZUlmTWF0Y2gsXG4gICAgICAgIHNvdXJjZUlmTm9uZU1hdGNoLFxuICAgICAgICBzb3VyY2VDb250ZW50TUQ1LFxuICAgICAgICBjb3B5U291cmNlQXV0aG9yaXphdGlvbixcbiAgICAgICAgcGFnZVdyaXRlLFxuICAgICAgICBpZlNlcXVlbmNlTnVtYmVyTGVzc1RoYW5PckVxdWFsVG8sXG4gICAgICAgIGlmU2VxdWVuY2VOdW1iZXJMZXNzVGhhbixcbiAgICAgICAgaWZTZXF1ZW5jZU51bWJlckVxdWFsVG8sXG4gICAgICAgIHNvdXJjZVVybCxcbiAgICAgICAgc291cmNlUmFuZ2UsXG4gICAgICAgIHNvdXJjZUNvbnRlbnRDcmM2NCxcbiAgICAgICAgcmFuZ2UxLFxuICAgIF0sXG4gICAgaXNYTUw6IHRydWUsXG4gICAgc2VyaWFsaXplcjogeG1sU2VyaWFsaXplciQyLFxufTtcbmNvbnN0IGdldFBhZ2VSYW5nZXNPcGVyYXRpb25TcGVjID0ge1xuICAgIHBhdGg6IFwiL3tjb250YWluZXJOYW1lfS97YmxvYn1cIixcbiAgICBodHRwTWV0aG9kOiBcIkdFVFwiLFxuICAgIHJlc3BvbnNlczoge1xuICAgICAgICAyMDA6IHtcbiAgICAgICAgICAgIGJvZHlNYXBwZXI6IFBhZ2VMaXN0LFxuICAgICAgICAgICAgaGVhZGVyc01hcHBlcjogUGFnZUJsb2JHZXRQYWdlUmFuZ2VzSGVhZGVycyxcbiAgICAgICAgfSxcbiAgICAgICAgZGVmYXVsdDoge1xuICAgICAgICAgICAgYm9keU1hcHBlcjogU3RvcmFnZUVycm9yLFxuICAgICAgICAgICAgaGVhZGVyc01hcHBlcjogUGFnZUJsb2JHZXRQYWdlUmFuZ2VzRXhjZXB0aW9uSGVhZGVycyxcbiAgICAgICAgfSxcbiAgICB9LFxuICAgIHF1ZXJ5UGFyYW1ldGVyczogW1xuICAgICAgICB0aW1lb3V0SW5TZWNvbmRzLFxuICAgICAgICBtYXJrZXIsXG4gICAgICAgIG1heFBhZ2VTaXplLFxuICAgICAgICBzbmFwc2hvdCxcbiAgICAgICAgY29tcDIwLFxuICAgIF0sXG4gICAgdXJsUGFyYW1ldGVyczogW3VybF0sXG4gICAgaGVhZGVyUGFyYW1ldGVyczogW1xuICAgICAgICB2ZXJzaW9uLFxuICAgICAgICByZXF1ZXN0SWQsXG4gICAgICAgIGFjY2VwdDEsXG4gICAgICAgIGxlYXNlSWQsXG4gICAgICAgIGlmTW9kaWZpZWRTaW5jZSxcbiAgICAgICAgaWZVbm1vZGlmaWVkU2luY2UsXG4gICAgICAgIHJhbmdlLFxuICAgICAgICBpZk1hdGNoLFxuICAgICAgICBpZk5vbmVNYXRjaCxcbiAgICAgICAgaWZUYWdzLFxuICAgIF0sXG4gICAgaXNYTUw6IHRydWUsXG4gICAgc2VyaWFsaXplcjogeG1sU2VyaWFsaXplciQyLFxufTtcbmNvbnN0IGdldFBhZ2VSYW5nZXNEaWZmT3BlcmF0aW9uU3BlYyA9IHtcbiAgICBwYXRoOiBcIi97Y29udGFpbmVyTmFtZX0ve2Jsb2J9XCIsXG4gICAgaHR0cE1ldGhvZDogXCJHRVRcIixcbiAgICByZXNwb25zZXM6IHtcbiAgICAgICAgMjAwOiB7XG4gICAgICAgICAgICBib2R5TWFwcGVyOiBQYWdlTGlzdCxcbiAgICAgICAgICAgIGhlYWRlcnNNYXBwZXI6IFBhZ2VCbG9iR2V0UGFnZVJhbmdlc0RpZmZIZWFkZXJzLFxuICAgICAgICB9LFxuICAgICAgICBkZWZhdWx0OiB7XG4gICAgICAgICAgICBib2R5TWFwcGVyOiBTdG9yYWdlRXJyb3IsXG4gICAgICAgICAgICBoZWFkZXJzTWFwcGVyOiBQYWdlQmxvYkdldFBhZ2VSYW5nZXNEaWZmRXhjZXB0aW9uSGVhZGVycyxcbiAgICAgICAgfSxcbiAgICB9LFxuICAgIHF1ZXJ5UGFyYW1ldGVyczogW1xuICAgICAgICB0aW1lb3V0SW5TZWNvbmRzLFxuICAgICAgICBtYXJrZXIsXG4gICAgICAgIG1heFBhZ2VTaXplLFxuICAgICAgICBzbmFwc2hvdCxcbiAgICAgICAgY29tcDIwLFxuICAgICAgICBwcmV2c25hcHNob3QsXG4gICAgXSxcbiAgICB1cmxQYXJhbWV0ZXJzOiBbdXJsXSxcbiAgICBoZWFkZXJQYXJhbWV0ZXJzOiBbXG4gICAgICAgIHZlcnNpb24sXG4gICAgICAgIHJlcXVlc3RJZCxcbiAgICAgICAgYWNjZXB0MSxcbiAgICAgICAgbGVhc2VJZCxcbiAgICAgICAgaWZNb2RpZmllZFNpbmNlLFxuICAgICAgICBpZlVubW9kaWZpZWRTaW5jZSxcbiAgICAgICAgcmFuZ2UsXG4gICAgICAgIGlmTWF0Y2gsXG4gICAgICAgIGlmTm9uZU1hdGNoLFxuICAgICAgICBpZlRhZ3MsXG4gICAgICAgIHByZXZTbmFwc2hvdFVybCxcbiAgICBdLFxuICAgIGlzWE1MOiB0cnVlLFxuICAgIHNlcmlhbGl6ZXI6IHhtbFNlcmlhbGl6ZXIkMixcbn07XG5jb25zdCByZXNpemVPcGVyYXRpb25TcGVjID0ge1xuICAgIHBhdGg6IFwiL3tjb250YWluZXJOYW1lfS97YmxvYn1cIixcbiAgICBodHRwTWV0aG9kOiBcIlBVVFwiLFxuICAgIHJlc3BvbnNlczoge1xuICAgICAgICAyMDA6IHtcbiAgICAgICAgICAgIGhlYWRlcnNNYXBwZXI6IFBhZ2VCbG9iUmVzaXplSGVhZGVycyxcbiAgICAgICAgfSxcbiAgICAgICAgZGVmYXVsdDoge1xuICAgICAgICAgICAgYm9keU1hcHBlcjogU3RvcmFnZUVycm9yLFxuICAgICAgICAgICAgaGVhZGVyc01hcHBlcjogUGFnZUJsb2JSZXNpemVFeGNlcHRpb25IZWFkZXJzLFxuICAgICAgICB9LFxuICAgIH0sXG4gICAgcXVlcnlQYXJhbWV0ZXJzOiBbY29tcCwgdGltZW91dEluU2Vjb25kc10sXG4gICAgdXJsUGFyYW1ldGVyczogW3VybF0sXG4gICAgaGVhZGVyUGFyYW1ldGVyczogW1xuICAgICAgICB2ZXJzaW9uLFxuICAgICAgICByZXF1ZXN0SWQsXG4gICAgICAgIGFjY2VwdDEsXG4gICAgICAgIGxlYXNlSWQsXG4gICAgICAgIGlmTW9kaWZpZWRTaW5jZSxcbiAgICAgICAgaWZVbm1vZGlmaWVkU2luY2UsXG4gICAgICAgIGVuY3J5cHRpb25LZXksXG4gICAgICAgIGVuY3J5cHRpb25LZXlTaGEyNTYsXG4gICAgICAgIGVuY3J5cHRpb25BbGdvcml0aG0sXG4gICAgICAgIGlmTWF0Y2gsXG4gICAgICAgIGlmTm9uZU1hdGNoLFxuICAgICAgICBpZlRhZ3MsXG4gICAgICAgIGVuY3J5cHRpb25TY29wZSxcbiAgICAgICAgYmxvYkNvbnRlbnRMZW5ndGgsXG4gICAgXSxcbiAgICBpc1hNTDogdHJ1ZSxcbiAgICBzZXJpYWxpemVyOiB4bWxTZXJpYWxpemVyJDIsXG59O1xuY29uc3QgdXBkYXRlU2VxdWVuY2VOdW1iZXJPcGVyYXRpb25TcGVjID0ge1xuICAgIHBhdGg6IFwiL3tjb250YWluZXJOYW1lfS97YmxvYn1cIixcbiAgICBodHRwTWV0aG9kOiBcIlBVVFwiLFxuICAgIHJlc3BvbnNlczoge1xuICAgICAgICAyMDA6IHtcbiAgICAgICAgICAgIGhlYWRlcnNNYXBwZXI6IFBhZ2VCbG9iVXBkYXRlU2VxdWVuY2VOdW1iZXJIZWFkZXJzLFxuICAgICAgICB9LFxuICAgICAgICBkZWZhdWx0OiB7XG4gICAgICAgICAgICBib2R5TWFwcGVyOiBTdG9yYWdlRXJyb3IsXG4gICAgICAgICAgICBoZWFkZXJzTWFwcGVyOiBQYWdlQmxvYlVwZGF0ZVNlcXVlbmNlTnVtYmVyRXhjZXB0aW9uSGVhZGVycyxcbiAgICAgICAgfSxcbiAgICB9LFxuICAgIHF1ZXJ5UGFyYW1ldGVyczogW2NvbXAsIHRpbWVvdXRJblNlY29uZHNdLFxuICAgIHVybFBhcmFtZXRlcnM6IFt1cmxdLFxuICAgIGhlYWRlclBhcmFtZXRlcnM6IFtcbiAgICAgICAgdmVyc2lvbixcbiAgICAgICAgcmVxdWVzdElkLFxuICAgICAgICBhY2NlcHQxLFxuICAgICAgICBsZWFzZUlkLFxuICAgICAgICBpZk1vZGlmaWVkU2luY2UsXG4gICAgICAgIGlmVW5tb2RpZmllZFNpbmNlLFxuICAgICAgICBpZk1hdGNoLFxuICAgICAgICBpZk5vbmVNYXRjaCxcbiAgICAgICAgaWZUYWdzLFxuICAgICAgICBibG9iU2VxdWVuY2VOdW1iZXIsXG4gICAgICAgIHNlcXVlbmNlTnVtYmVyQWN0aW9uLFxuICAgIF0sXG4gICAgaXNYTUw6IHRydWUsXG4gICAgc2VyaWFsaXplcjogeG1sU2VyaWFsaXplciQyLFxufTtcbmNvbnN0IGNvcHlJbmNyZW1lbnRhbE9wZXJhdGlvblNwZWMgPSB7XG4gICAgcGF0aDogXCIve2NvbnRhaW5lck5hbWV9L3tibG9ifVwiLFxuICAgIGh0dHBNZXRob2Q6IFwiUFVUXCIsXG4gICAgcmVzcG9uc2VzOiB7XG4gICAgICAgIDIwMjoge1xuICAgICAgICAgICAgaGVhZGVyc01hcHBlcjogUGFnZUJsb2JDb3B5SW5jcmVtZW50YWxIZWFkZXJzLFxuICAgICAgICB9LFxuICAgICAgICBkZWZhdWx0OiB7XG4gICAgICAgICAgICBib2R5TWFwcGVyOiBTdG9yYWdlRXJyb3IsXG4gICAgICAgICAgICBoZWFkZXJzTWFwcGVyOiBQYWdlQmxvYkNvcHlJbmNyZW1lbnRhbEV4Y2VwdGlvbkhlYWRlcnMsXG4gICAgICAgIH0sXG4gICAgfSxcbiAgICBxdWVyeVBhcmFtZXRlcnM6IFt0aW1lb3V0SW5TZWNvbmRzLCBjb21wMjFdLFxuICAgIHVybFBhcmFtZXRlcnM6IFt1cmxdLFxuICAgIGhlYWRlclBhcmFtZXRlcnM6IFtcbiAgICAgICAgdmVyc2lvbixcbiAgICAgICAgcmVxdWVzdElkLFxuICAgICAgICBhY2NlcHQxLFxuICAgICAgICBpZk1vZGlmaWVkU2luY2UsXG4gICAgICAgIGlmVW5tb2RpZmllZFNpbmNlLFxuICAgICAgICBpZk1hdGNoLFxuICAgICAgICBpZk5vbmVNYXRjaCxcbiAgICAgICAgaWZUYWdzLFxuICAgICAgICBjb3B5U291cmNlLFxuICAgIF0sXG4gICAgaXNYTUw6IHRydWUsXG4gICAgc2VyaWFsaXplcjogeG1sU2VyaWFsaXplciQyLFxufTtcblxuLypcbiAqIENvcHlyaWdodCAoYykgTWljcm9zb2Z0IENvcnBvcmF0aW9uLlxuICogTGljZW5zZWQgdW5kZXIgdGhlIE1JVCBMaWNlbnNlLlxuICpcbiAqIENvZGUgZ2VuZXJhdGVkIGJ5IE1pY3Jvc29mdCAoUikgQXV0b1Jlc3QgQ29kZSBHZW5lcmF0b3IuXG4gKiBDaGFuZ2VzIG1heSBjYXVzZSBpbmNvcnJlY3QgYmVoYXZpb3IgYW5kIHdpbGwgYmUgbG9zdCBpZiB0aGUgY29kZSBpcyByZWdlbmVyYXRlZC5cbiAqL1xuLyoqIENsYXNzIGNvbnRhaW5pbmcgQXBwZW5kQmxvYiBvcGVyYXRpb25zLiAqL1xuY2xhc3MgQXBwZW5kQmxvYkltcGwge1xuICAgIC8qKlxuICAgICAqIEluaXRpYWxpemUgYSBuZXcgaW5zdGFuY2Ugb2YgdGhlIGNsYXNzIEFwcGVuZEJsb2IgY2xhc3MuXG4gICAgICogQHBhcmFtIGNsaWVudCBSZWZlcmVuY2UgdG8gdGhlIHNlcnZpY2UgY2xpZW50XG4gICAgICovXG4gICAgY29uc3RydWN0b3IoY2xpZW50KSB7XG4gICAgICAgIHRoaXMuY2xpZW50ID0gY2xpZW50O1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBUaGUgQ3JlYXRlIEFwcGVuZCBCbG9iIG9wZXJhdGlvbiBjcmVhdGVzIGEgbmV3IGFwcGVuZCBibG9iLlxuICAgICAqIEBwYXJhbSBjb250ZW50TGVuZ3RoIFRoZSBsZW5ndGggb2YgdGhlIHJlcXVlc3QuXG4gICAgICogQHBhcmFtIG9wdGlvbnMgVGhlIG9wdGlvbnMgcGFyYW1ldGVycy5cbiAgICAgKi9cbiAgICBjcmVhdGUoY29udGVudExlbmd0aCwgb3B0aW9ucykge1xuICAgICAgICByZXR1cm4gdGhpcy5jbGllbnQuc2VuZE9wZXJhdGlvblJlcXVlc3QoeyBjb250ZW50TGVuZ3RoLCBvcHRpb25zIH0sIGNyZWF0ZU9wZXJhdGlvblNwZWMpO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBUaGUgQXBwZW5kIEJsb2NrIG9wZXJhdGlvbiBjb21taXRzIGEgbmV3IGJsb2NrIG9mIGRhdGEgdG8gdGhlIGVuZCBvZiBhbiBleGlzdGluZyBhcHBlbmQgYmxvYi4gVGhlXG4gICAgICogQXBwZW5kIEJsb2NrIG9wZXJhdGlvbiBpcyBwZXJtaXR0ZWQgb25seSBpZiB0aGUgYmxvYiB3YXMgY3JlYXRlZCB3aXRoIHgtbXMtYmxvYi10eXBlIHNldCB0b1xuICAgICAqIEFwcGVuZEJsb2IuIEFwcGVuZCBCbG9jayBpcyBzdXBwb3J0ZWQgb25seSBvbiB2ZXJzaW9uIDIwMTUtMDItMjEgdmVyc2lvbiBvciBsYXRlci5cbiAgICAgKiBAcGFyYW0gY29udGVudExlbmd0aCBUaGUgbGVuZ3RoIG9mIHRoZSByZXF1ZXN0LlxuICAgICAqIEBwYXJhbSBib2R5IEluaXRpYWwgZGF0YVxuICAgICAqIEBwYXJhbSBvcHRpb25zIFRoZSBvcHRpb25zIHBhcmFtZXRlcnMuXG4gICAgICovXG4gICAgYXBwZW5kQmxvY2soY29udGVudExlbmd0aCwgYm9keSwgb3B0aW9ucykge1xuICAgICAgICByZXR1cm4gdGhpcy5jbGllbnQuc2VuZE9wZXJhdGlvblJlcXVlc3QoeyBjb250ZW50TGVuZ3RoLCBib2R5LCBvcHRpb25zIH0sIGFwcGVuZEJsb2NrT3BlcmF0aW9uU3BlYyk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIFRoZSBBcHBlbmQgQmxvY2sgb3BlcmF0aW9uIGNvbW1pdHMgYSBuZXcgYmxvY2sgb2YgZGF0YSB0byB0aGUgZW5kIG9mIGFuIGV4aXN0aW5nIGFwcGVuZCBibG9iIHdoZXJlXG4gICAgICogdGhlIGNvbnRlbnRzIGFyZSByZWFkIGZyb20gYSBzb3VyY2UgdXJsLiBUaGUgQXBwZW5kIEJsb2NrIG9wZXJhdGlvbiBpcyBwZXJtaXR0ZWQgb25seSBpZiB0aGUgYmxvYlxuICAgICAqIHdhcyBjcmVhdGVkIHdpdGggeC1tcy1ibG9iLXR5cGUgc2V0IHRvIEFwcGVuZEJsb2IuIEFwcGVuZCBCbG9jayBpcyBzdXBwb3J0ZWQgb25seSBvbiB2ZXJzaW9uXG4gICAgICogMjAxNS0wMi0yMSB2ZXJzaW9uIG9yIGxhdGVyLlxuICAgICAqIEBwYXJhbSBzb3VyY2VVcmwgU3BlY2lmeSBhIFVSTCB0byB0aGUgY29weSBzb3VyY2UuXG4gICAgICogQHBhcmFtIGNvbnRlbnRMZW5ndGggVGhlIGxlbmd0aCBvZiB0aGUgcmVxdWVzdC5cbiAgICAgKiBAcGFyYW0gb3B0aW9ucyBUaGUgb3B0aW9ucyBwYXJhbWV0ZXJzLlxuICAgICAqL1xuICAgIGFwcGVuZEJsb2NrRnJvbVVybChzb3VyY2VVcmwsIGNvbnRlbnRMZW5ndGgsIG9wdGlvbnMpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuY2xpZW50LnNlbmRPcGVyYXRpb25SZXF1ZXN0KHsgc291cmNlVXJsLCBjb250ZW50TGVuZ3RoLCBvcHRpb25zIH0sIGFwcGVuZEJsb2NrRnJvbVVybE9wZXJhdGlvblNwZWMpO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBUaGUgU2VhbCBvcGVyYXRpb24gc2VhbHMgdGhlIEFwcGVuZCBCbG9iIHRvIG1ha2UgaXQgcmVhZC1vbmx5LiBTZWFsIGlzIHN1cHBvcnRlZCBvbmx5IG9uIHZlcnNpb25cbiAgICAgKiAyMDE5LTEyLTEyIHZlcnNpb24gb3IgbGF0ZXIuXG4gICAgICogQHBhcmFtIG9wdGlvbnMgVGhlIG9wdGlvbnMgcGFyYW1ldGVycy5cbiAgICAgKi9cbiAgICBzZWFsKG9wdGlvbnMpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuY2xpZW50LnNlbmRPcGVyYXRpb25SZXF1ZXN0KHsgb3B0aW9ucyB9LCBzZWFsT3BlcmF0aW9uU3BlYyk7XG4gICAgfVxufVxuLy8gT3BlcmF0aW9uIFNwZWNpZmljYXRpb25zXG5jb25zdCB4bWxTZXJpYWxpemVyJDEgPSBjb3JlQ2xpZW50X19uYW1lc3BhY2UuY3JlYXRlU2VyaWFsaXplcihNYXBwZXJzLCAvKiBpc1htbCAqLyB0cnVlKTtcbmNvbnN0IGNyZWF0ZU9wZXJhdGlvblNwZWMgPSB7XG4gICAgcGF0aDogXCIve2NvbnRhaW5lck5hbWV9L3tibG9ifVwiLFxuICAgIGh0dHBNZXRob2Q6IFwiUFVUXCIsXG4gICAgcmVzcG9uc2VzOiB7XG4gICAgICAgIDIwMToge1xuICAgICAgICAgICAgaGVhZGVyc01hcHBlcjogQXBwZW5kQmxvYkNyZWF0ZUhlYWRlcnMsXG4gICAgICAgIH0sXG4gICAgICAgIGRlZmF1bHQ6IHtcbiAgICAgICAgICAgIGJvZHlNYXBwZXI6IFN0b3JhZ2VFcnJvcixcbiAgICAgICAgICAgIGhlYWRlcnNNYXBwZXI6IEFwcGVuZEJsb2JDcmVhdGVFeGNlcHRpb25IZWFkZXJzLFxuICAgICAgICB9LFxuICAgIH0sXG4gICAgcXVlcnlQYXJhbWV0ZXJzOiBbdGltZW91dEluU2Vjb25kc10sXG4gICAgdXJsUGFyYW1ldGVyczogW3VybF0sXG4gICAgaGVhZGVyUGFyYW1ldGVyczogW1xuICAgICAgICB2ZXJzaW9uLFxuICAgICAgICByZXF1ZXN0SWQsXG4gICAgICAgIGFjY2VwdDEsXG4gICAgICAgIGNvbnRlbnRMZW5ndGgsXG4gICAgICAgIG1ldGFkYXRhLFxuICAgICAgICBsZWFzZUlkLFxuICAgICAgICBpZk1vZGlmaWVkU2luY2UsXG4gICAgICAgIGlmVW5tb2RpZmllZFNpbmNlLFxuICAgICAgICBlbmNyeXB0aW9uS2V5LFxuICAgICAgICBlbmNyeXB0aW9uS2V5U2hhMjU2LFxuICAgICAgICBlbmNyeXB0aW9uQWxnb3JpdGhtLFxuICAgICAgICBpZk1hdGNoLFxuICAgICAgICBpZk5vbmVNYXRjaCxcbiAgICAgICAgaWZUYWdzLFxuICAgICAgICBibG9iQ2FjaGVDb250cm9sLFxuICAgICAgICBibG9iQ29udGVudFR5cGUsXG4gICAgICAgIGJsb2JDb250ZW50TUQ1LFxuICAgICAgICBibG9iQ29udGVudEVuY29kaW5nLFxuICAgICAgICBibG9iQ29udGVudExhbmd1YWdlLFxuICAgICAgICBibG9iQ29udGVudERpc3Bvc2l0aW9uLFxuICAgICAgICBpbW11dGFiaWxpdHlQb2xpY3lFeHBpcnksXG4gICAgICAgIGltbXV0YWJpbGl0eVBvbGljeU1vZGUsXG4gICAgICAgIGVuY3J5cHRpb25TY29wZSxcbiAgICAgICAgYmxvYlRhZ3NTdHJpbmcsXG4gICAgICAgIGxlZ2FsSG9sZDEsXG4gICAgICAgIGJsb2JUeXBlMSxcbiAgICBdLFxuICAgIGlzWE1MOiB0cnVlLFxuICAgIHNlcmlhbGl6ZXI6IHhtbFNlcmlhbGl6ZXIkMSxcbn07XG5jb25zdCBhcHBlbmRCbG9ja09wZXJhdGlvblNwZWMgPSB7XG4gICAgcGF0aDogXCIve2NvbnRhaW5lck5hbWV9L3tibG9ifVwiLFxuICAgIGh0dHBNZXRob2Q6IFwiUFVUXCIsXG4gICAgcmVzcG9uc2VzOiB7XG4gICAgICAgIDIwMToge1xuICAgICAgICAgICAgaGVhZGVyc01hcHBlcjogQXBwZW5kQmxvYkFwcGVuZEJsb2NrSGVhZGVycyxcbiAgICAgICAgfSxcbiAgICAgICAgZGVmYXVsdDoge1xuICAgICAgICAgICAgYm9keU1hcHBlcjogU3RvcmFnZUVycm9yLFxuICAgICAgICAgICAgaGVhZGVyc01hcHBlcjogQXBwZW5kQmxvYkFwcGVuZEJsb2NrRXhjZXB0aW9uSGVhZGVycyxcbiAgICAgICAgfSxcbiAgICB9LFxuICAgIHJlcXVlc3RCb2R5OiBib2R5MSxcbiAgICBxdWVyeVBhcmFtZXRlcnM6IFt0aW1lb3V0SW5TZWNvbmRzLCBjb21wMjJdLFxuICAgIHVybFBhcmFtZXRlcnM6IFt1cmxdLFxuICAgIGhlYWRlclBhcmFtZXRlcnM6IFtcbiAgICAgICAgdmVyc2lvbixcbiAgICAgICAgcmVxdWVzdElkLFxuICAgICAgICBjb250ZW50TGVuZ3RoLFxuICAgICAgICBsZWFzZUlkLFxuICAgICAgICBpZk1vZGlmaWVkU2luY2UsXG4gICAgICAgIGlmVW5tb2RpZmllZFNpbmNlLFxuICAgICAgICBlbmNyeXB0aW9uS2V5LFxuICAgICAgICBlbmNyeXB0aW9uS2V5U2hhMjU2LFxuICAgICAgICBlbmNyeXB0aW9uQWxnb3JpdGhtLFxuICAgICAgICBpZk1hdGNoLFxuICAgICAgICBpZk5vbmVNYXRjaCxcbiAgICAgICAgaWZUYWdzLFxuICAgICAgICBlbmNyeXB0aW9uU2NvcGUsXG4gICAgICAgIHRyYW5zYWN0aW9uYWxDb250ZW50TUQ1LFxuICAgICAgICB0cmFuc2FjdGlvbmFsQ29udGVudENyYzY0LFxuICAgICAgICBjb250ZW50VHlwZTEsXG4gICAgICAgIGFjY2VwdDIsXG4gICAgICAgIG1heFNpemUsXG4gICAgICAgIGFwcGVuZFBvc2l0aW9uLFxuICAgIF0sXG4gICAgaXNYTUw6IHRydWUsXG4gICAgY29udGVudFR5cGU6IFwiYXBwbGljYXRpb24veG1sOyBjaGFyc2V0PXV0Zi04XCIsXG4gICAgbWVkaWFUeXBlOiBcImJpbmFyeVwiLFxuICAgIHNlcmlhbGl6ZXI6IHhtbFNlcmlhbGl6ZXIkMSxcbn07XG5jb25zdCBhcHBlbmRCbG9ja0Zyb21VcmxPcGVyYXRpb25TcGVjID0ge1xuICAgIHBhdGg6IFwiL3tjb250YWluZXJOYW1lfS97YmxvYn1cIixcbiAgICBodHRwTWV0aG9kOiBcIlBVVFwiLFxuICAgIHJlc3BvbnNlczoge1xuICAgICAgICAyMDE6IHtcbiAgICAgICAgICAgIGhlYWRlcnNNYXBwZXI6IEFwcGVuZEJsb2JBcHBlbmRCbG9ja0Zyb21VcmxIZWFkZXJzLFxuICAgICAgICB9LFxuICAgICAgICBkZWZhdWx0OiB7XG4gICAgICAgICAgICBib2R5TWFwcGVyOiBTdG9yYWdlRXJyb3IsXG4gICAgICAgICAgICBoZWFkZXJzTWFwcGVyOiBBcHBlbmRCbG9iQXBwZW5kQmxvY2tGcm9tVXJsRXhjZXB0aW9uSGVhZGVycyxcbiAgICAgICAgfSxcbiAgICB9LFxuICAgIHF1ZXJ5UGFyYW1ldGVyczogW3RpbWVvdXRJblNlY29uZHMsIGNvbXAyMl0sXG4gICAgdXJsUGFyYW1ldGVyczogW3VybF0sXG4gICAgaGVhZGVyUGFyYW1ldGVyczogW1xuICAgICAgICB2ZXJzaW9uLFxuICAgICAgICByZXF1ZXN0SWQsXG4gICAgICAgIGFjY2VwdDEsXG4gICAgICAgIGNvbnRlbnRMZW5ndGgsXG4gICAgICAgIGxlYXNlSWQsXG4gICAgICAgIGlmTW9kaWZpZWRTaW5jZSxcbiAgICAgICAgaWZVbm1vZGlmaWVkU2luY2UsXG4gICAgICAgIGVuY3J5cHRpb25LZXksXG4gICAgICAgIGVuY3J5cHRpb25LZXlTaGEyNTYsXG4gICAgICAgIGVuY3J5cHRpb25BbGdvcml0aG0sXG4gICAgICAgIGlmTWF0Y2gsXG4gICAgICAgIGlmTm9uZU1hdGNoLFxuICAgICAgICBpZlRhZ3MsXG4gICAgICAgIGVuY3J5cHRpb25TY29wZSxcbiAgICAgICAgc291cmNlSWZNb2RpZmllZFNpbmNlLFxuICAgICAgICBzb3VyY2VJZlVubW9kaWZpZWRTaW5jZSxcbiAgICAgICAgc291cmNlSWZNYXRjaCxcbiAgICAgICAgc291cmNlSWZOb25lTWF0Y2gsXG4gICAgICAgIHNvdXJjZUNvbnRlbnRNRDUsXG4gICAgICAgIGNvcHlTb3VyY2VBdXRob3JpemF0aW9uLFxuICAgICAgICB0cmFuc2FjdGlvbmFsQ29udGVudE1ENSxcbiAgICAgICAgc291cmNlVXJsLFxuICAgICAgICBzb3VyY2VDb250ZW50Q3JjNjQsXG4gICAgICAgIG1heFNpemUsXG4gICAgICAgIGFwcGVuZFBvc2l0aW9uLFxuICAgICAgICBzb3VyY2VSYW5nZTEsXG4gICAgXSxcbiAgICBpc1hNTDogdHJ1ZSxcbiAgICBzZXJpYWxpemVyOiB4bWxTZXJpYWxpemVyJDEsXG59O1xuY29uc3Qgc2VhbE9wZXJhdGlvblNwZWMgPSB7XG4gICAgcGF0aDogXCIve2NvbnRhaW5lck5hbWV9L3tibG9ifVwiLFxuICAgIGh0dHBNZXRob2Q6IFwiUFVUXCIsXG4gICAgcmVzcG9uc2VzOiB7XG4gICAgICAgIDIwMDoge1xuICAgICAgICAgICAgaGVhZGVyc01hcHBlcjogQXBwZW5kQmxvYlNlYWxIZWFkZXJzLFxuICAgICAgICB9LFxuICAgICAgICBkZWZhdWx0OiB7XG4gICAgICAgICAgICBib2R5TWFwcGVyOiBTdG9yYWdlRXJyb3IsXG4gICAgICAgICAgICBoZWFkZXJzTWFwcGVyOiBBcHBlbmRCbG9iU2VhbEV4Y2VwdGlvbkhlYWRlcnMsXG4gICAgICAgIH0sXG4gICAgfSxcbiAgICBxdWVyeVBhcmFtZXRlcnM6IFt0aW1lb3V0SW5TZWNvbmRzLCBjb21wMjNdLFxuICAgIHVybFBhcmFtZXRlcnM6IFt1cmxdLFxuICAgIGhlYWRlclBhcmFtZXRlcnM6IFtcbiAgICAgICAgdmVyc2lvbixcbiAgICAgICAgcmVxdWVzdElkLFxuICAgICAgICBhY2NlcHQxLFxuICAgICAgICBsZWFzZUlkLFxuICAgICAgICBpZk1vZGlmaWVkU2luY2UsXG4gICAgICAgIGlmVW5tb2RpZmllZFNpbmNlLFxuICAgICAgICBpZk1hdGNoLFxuICAgICAgICBpZk5vbmVNYXRjaCxcbiAgICAgICAgYXBwZW5kUG9zaXRpb24sXG4gICAgXSxcbiAgICBpc1hNTDogdHJ1ZSxcbiAgICBzZXJpYWxpemVyOiB4bWxTZXJpYWxpemVyJDEsXG59O1xuXG4vKlxuICogQ29weXJpZ2h0IChjKSBNaWNyb3NvZnQgQ29ycG9yYXRpb24uXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgTUlUIExpY2Vuc2UuXG4gKlxuICogQ29kZSBnZW5lcmF0ZWQgYnkgTWljcm9zb2Z0IChSKSBBdXRvUmVzdCBDb2RlIEdlbmVyYXRvci5cbiAqIENoYW5nZXMgbWF5IGNhdXNlIGluY29ycmVjdCBiZWhhdmlvciBhbmQgd2lsbCBiZSBsb3N0IGlmIHRoZSBjb2RlIGlzIHJlZ2VuZXJhdGVkLlxuICovXG4vKiogQ2xhc3MgY29udGFpbmluZyBCbG9ja0Jsb2Igb3BlcmF0aW9ucy4gKi9cbmNsYXNzIEJsb2NrQmxvYkltcGwge1xuICAgIC8qKlxuICAgICAqIEluaXRpYWxpemUgYSBuZXcgaW5zdGFuY2Ugb2YgdGhlIGNsYXNzIEJsb2NrQmxvYiBjbGFzcy5cbiAgICAgKiBAcGFyYW0gY2xpZW50IFJlZmVyZW5jZSB0byB0aGUgc2VydmljZSBjbGllbnRcbiAgICAgKi9cbiAgICBjb25zdHJ1Y3RvcihjbGllbnQpIHtcbiAgICAgICAgdGhpcy5jbGllbnQgPSBjbGllbnQ7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIFRoZSBVcGxvYWQgQmxvY2sgQmxvYiBvcGVyYXRpb24gdXBkYXRlcyB0aGUgY29udGVudCBvZiBhbiBleGlzdGluZyBibG9jayBibG9iLiBVcGRhdGluZyBhbiBleGlzdGluZ1xuICAgICAqIGJsb2NrIGJsb2Igb3ZlcndyaXRlcyBhbnkgZXhpc3RpbmcgbWV0YWRhdGEgb24gdGhlIGJsb2IuIFBhcnRpYWwgdXBkYXRlcyBhcmUgbm90IHN1cHBvcnRlZCB3aXRoIFB1dFxuICAgICAqIEJsb2I7IHRoZSBjb250ZW50IG9mIHRoZSBleGlzdGluZyBibG9iIGlzIG92ZXJ3cml0dGVuIHdpdGggdGhlIGNvbnRlbnQgb2YgdGhlIG5ldyBibG9iLiBUbyBwZXJmb3JtIGFcbiAgICAgKiBwYXJ0aWFsIHVwZGF0ZSBvZiB0aGUgY29udGVudCBvZiBhIGJsb2NrIGJsb2IsIHVzZSB0aGUgUHV0IEJsb2NrIExpc3Qgb3BlcmF0aW9uLlxuICAgICAqIEBwYXJhbSBjb250ZW50TGVuZ3RoIFRoZSBsZW5ndGggb2YgdGhlIHJlcXVlc3QuXG4gICAgICogQHBhcmFtIGJvZHkgSW5pdGlhbCBkYXRhXG4gICAgICogQHBhcmFtIG9wdGlvbnMgVGhlIG9wdGlvbnMgcGFyYW1ldGVycy5cbiAgICAgKi9cbiAgICB1cGxvYWQoY29udGVudExlbmd0aCwgYm9keSwgb3B0aW9ucykge1xuICAgICAgICByZXR1cm4gdGhpcy5jbGllbnQuc2VuZE9wZXJhdGlvblJlcXVlc3QoeyBjb250ZW50TGVuZ3RoLCBib2R5LCBvcHRpb25zIH0sIHVwbG9hZE9wZXJhdGlvblNwZWMpO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBUaGUgUHV0IEJsb2IgZnJvbSBVUkwgb3BlcmF0aW9uIGNyZWF0ZXMgYSBuZXcgQmxvY2sgQmxvYiB3aGVyZSB0aGUgY29udGVudHMgb2YgdGhlIGJsb2IgYXJlIHJlYWRcbiAgICAgKiBmcm9tIGEgZ2l2ZW4gVVJMLiAgVGhpcyBBUEkgaXMgc3VwcG9ydGVkIGJlZ2lubmluZyB3aXRoIHRoZSAyMDIwLTA0LTA4IHZlcnNpb24uIFBhcnRpYWwgdXBkYXRlcyBhcmVcbiAgICAgKiBub3Qgc3VwcG9ydGVkIHdpdGggUHV0IEJsb2IgZnJvbSBVUkw7IHRoZSBjb250ZW50IG9mIGFuIGV4aXN0aW5nIGJsb2IgaXMgb3ZlcndyaXR0ZW4gd2l0aCB0aGVcbiAgICAgKiBjb250ZW50IG9mIHRoZSBuZXcgYmxvYi4gIFRvIHBlcmZvcm0gcGFydGlhbCB1cGRhdGVzIHRvIGEgYmxvY2sgYmxvYuKAmXMgY29udGVudHMgdXNpbmcgYSBzb3VyY2UgVVJMLFxuICAgICAqIHVzZSB0aGUgUHV0IEJsb2NrIGZyb20gVVJMIEFQSSBpbiBjb25qdW5jdGlvbiB3aXRoIFB1dCBCbG9jayBMaXN0LlxuICAgICAqIEBwYXJhbSBjb250ZW50TGVuZ3RoIFRoZSBsZW5ndGggb2YgdGhlIHJlcXVlc3QuXG4gICAgICogQHBhcmFtIGNvcHlTb3VyY2UgU3BlY2lmaWVzIHRoZSBuYW1lIG9mIHRoZSBzb3VyY2UgcGFnZSBibG9iIHNuYXBzaG90LiBUaGlzIHZhbHVlIGlzIGEgVVJMIG9mIHVwIHRvXG4gICAgICogICAgICAgICAgICAgICAgICAgMiBLQiBpbiBsZW5ndGggdGhhdCBzcGVjaWZpZXMgYSBwYWdlIGJsb2Igc25hcHNob3QuIFRoZSB2YWx1ZSBzaG91bGQgYmUgVVJMLWVuY29kZWQgYXMgaXQgd291bGRcbiAgICAgKiAgICAgICAgICAgICAgICAgICBhcHBlYXIgaW4gYSByZXF1ZXN0IFVSSS4gVGhlIHNvdXJjZSBibG9iIG11c3QgZWl0aGVyIGJlIHB1YmxpYyBvciBtdXN0IGJlIGF1dGhlbnRpY2F0ZWQgdmlhIGEgc2hhcmVkXG4gICAgICogICAgICAgICAgICAgICAgICAgYWNjZXNzIHNpZ25hdHVyZS5cbiAgICAgKiBAcGFyYW0gb3B0aW9ucyBUaGUgb3B0aW9ucyBwYXJhbWV0ZXJzLlxuICAgICAqL1xuICAgIHB1dEJsb2JGcm9tVXJsKGNvbnRlbnRMZW5ndGgsIGNvcHlTb3VyY2UsIG9wdGlvbnMpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuY2xpZW50LnNlbmRPcGVyYXRpb25SZXF1ZXN0KHsgY29udGVudExlbmd0aCwgY29weVNvdXJjZSwgb3B0aW9ucyB9LCBwdXRCbG9iRnJvbVVybE9wZXJhdGlvblNwZWMpO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBUaGUgU3RhZ2UgQmxvY2sgb3BlcmF0aW9uIGNyZWF0ZXMgYSBuZXcgYmxvY2sgdG8gYmUgY29tbWl0dGVkIGFzIHBhcnQgb2YgYSBibG9iXG4gICAgICogQHBhcmFtIGJsb2NrSWQgQSB2YWxpZCBCYXNlNjQgc3RyaW5nIHZhbHVlIHRoYXQgaWRlbnRpZmllcyB0aGUgYmxvY2suIFByaW9yIHRvIGVuY29kaW5nLCB0aGUgc3RyaW5nXG4gICAgICogICAgICAgICAgICAgICAgbXVzdCBiZSBsZXNzIHRoYW4gb3IgZXF1YWwgdG8gNjQgYnl0ZXMgaW4gc2l6ZS4gRm9yIGEgZ2l2ZW4gYmxvYiwgdGhlIGxlbmd0aCBvZiB0aGUgdmFsdWUgc3BlY2lmaWVkXG4gICAgICogICAgICAgICAgICAgICAgZm9yIHRoZSBibG9ja2lkIHBhcmFtZXRlciBtdXN0IGJlIHRoZSBzYW1lIHNpemUgZm9yIGVhY2ggYmxvY2suXG4gICAgICogQHBhcmFtIGNvbnRlbnRMZW5ndGggVGhlIGxlbmd0aCBvZiB0aGUgcmVxdWVzdC5cbiAgICAgKiBAcGFyYW0gYm9keSBJbml0aWFsIGRhdGFcbiAgICAgKiBAcGFyYW0gb3B0aW9ucyBUaGUgb3B0aW9ucyBwYXJhbWV0ZXJzLlxuICAgICAqL1xuICAgIHN0YWdlQmxvY2soYmxvY2tJZCwgY29udGVudExlbmd0aCwgYm9keSwgb3B0aW9ucykge1xuICAgICAgICByZXR1cm4gdGhpcy5jbGllbnQuc2VuZE9wZXJhdGlvblJlcXVlc3QoeyBibG9ja0lkLCBjb250ZW50TGVuZ3RoLCBib2R5LCBvcHRpb25zIH0sIHN0YWdlQmxvY2tPcGVyYXRpb25TcGVjKTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogVGhlIFN0YWdlIEJsb2NrIG9wZXJhdGlvbiBjcmVhdGVzIGEgbmV3IGJsb2NrIHRvIGJlIGNvbW1pdHRlZCBhcyBwYXJ0IG9mIGEgYmxvYiB3aGVyZSB0aGUgY29udGVudHNcbiAgICAgKiBhcmUgcmVhZCBmcm9tIGEgVVJMLlxuICAgICAqIEBwYXJhbSBibG9ja0lkIEEgdmFsaWQgQmFzZTY0IHN0cmluZyB2YWx1ZSB0aGF0IGlkZW50aWZpZXMgdGhlIGJsb2NrLiBQcmlvciB0byBlbmNvZGluZywgdGhlIHN0cmluZ1xuICAgICAqICAgICAgICAgICAgICAgIG11c3QgYmUgbGVzcyB0aGFuIG9yIGVxdWFsIHRvIDY0IGJ5dGVzIGluIHNpemUuIEZvciBhIGdpdmVuIGJsb2IsIHRoZSBsZW5ndGggb2YgdGhlIHZhbHVlIHNwZWNpZmllZFxuICAgICAqICAgICAgICAgICAgICAgIGZvciB0aGUgYmxvY2tpZCBwYXJhbWV0ZXIgbXVzdCBiZSB0aGUgc2FtZSBzaXplIGZvciBlYWNoIGJsb2NrLlxuICAgICAqIEBwYXJhbSBjb250ZW50TGVuZ3RoIFRoZSBsZW5ndGggb2YgdGhlIHJlcXVlc3QuXG4gICAgICogQHBhcmFtIHNvdXJjZVVybCBTcGVjaWZ5IGEgVVJMIHRvIHRoZSBjb3B5IHNvdXJjZS5cbiAgICAgKiBAcGFyYW0gb3B0aW9ucyBUaGUgb3B0aW9ucyBwYXJhbWV0ZXJzLlxuICAgICAqL1xuICAgIHN0YWdlQmxvY2tGcm9tVVJMKGJsb2NrSWQsIGNvbnRlbnRMZW5ndGgsIHNvdXJjZVVybCwgb3B0aW9ucykge1xuICAgICAgICByZXR1cm4gdGhpcy5jbGllbnQuc2VuZE9wZXJhdGlvblJlcXVlc3QoeyBibG9ja0lkLCBjb250ZW50TGVuZ3RoLCBzb3VyY2VVcmwsIG9wdGlvbnMgfSwgc3RhZ2VCbG9ja0Zyb21VUkxPcGVyYXRpb25TcGVjKTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogVGhlIENvbW1pdCBCbG9jayBMaXN0IG9wZXJhdGlvbiB3cml0ZXMgYSBibG9iIGJ5IHNwZWNpZnlpbmcgdGhlIGxpc3Qgb2YgYmxvY2sgSURzIHRoYXQgbWFrZSB1cCB0aGVcbiAgICAgKiBibG9iLiBJbiBvcmRlciB0byBiZSB3cml0dGVuIGFzIHBhcnQgb2YgYSBibG9iLCBhIGJsb2NrIG11c3QgaGF2ZSBiZWVuIHN1Y2Nlc3NmdWxseSB3cml0dGVuIHRvIHRoZVxuICAgICAqIHNlcnZlciBpbiBhIHByaW9yIFB1dCBCbG9jayBvcGVyYXRpb24uIFlvdSBjYW4gY2FsbCBQdXQgQmxvY2sgTGlzdCB0byB1cGRhdGUgYSBibG9iIGJ5IHVwbG9hZGluZ1xuICAgICAqIG9ubHkgdGhvc2UgYmxvY2tzIHRoYXQgaGF2ZSBjaGFuZ2VkLCB0aGVuIGNvbW1pdHRpbmcgdGhlIG5ldyBhbmQgZXhpc3RpbmcgYmxvY2tzIHRvZ2V0aGVyLiBZb3UgY2FuXG4gICAgICogZG8gdGhpcyBieSBzcGVjaWZ5aW5nIHdoZXRoZXIgdG8gY29tbWl0IGEgYmxvY2sgZnJvbSB0aGUgY29tbWl0dGVkIGJsb2NrIGxpc3Qgb3IgZnJvbSB0aGVcbiAgICAgKiB1bmNvbW1pdHRlZCBibG9jayBsaXN0LCBvciB0byBjb21taXQgdGhlIG1vc3QgcmVjZW50bHkgdXBsb2FkZWQgdmVyc2lvbiBvZiB0aGUgYmxvY2ssIHdoaWNoZXZlciBsaXN0XG4gICAgICogaXQgbWF5IGJlbG9uZyB0by5cbiAgICAgKiBAcGFyYW0gYmxvY2tzIEJsb2IgQmxvY2tzLlxuICAgICAqIEBwYXJhbSBvcHRpb25zIFRoZSBvcHRpb25zIHBhcmFtZXRlcnMuXG4gICAgICovXG4gICAgY29tbWl0QmxvY2tMaXN0KGJsb2Nrcywgb3B0aW9ucykge1xuICAgICAgICByZXR1cm4gdGhpcy5jbGllbnQuc2VuZE9wZXJhdGlvblJlcXVlc3QoeyBibG9ja3MsIG9wdGlvbnMgfSwgY29tbWl0QmxvY2tMaXN0T3BlcmF0aW9uU3BlYyk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIFRoZSBHZXQgQmxvY2sgTGlzdCBvcGVyYXRpb24gcmV0cmlldmVzIHRoZSBsaXN0IG9mIGJsb2NrcyB0aGF0IGhhdmUgYmVlbiB1cGxvYWRlZCBhcyBwYXJ0IG9mIGEgYmxvY2tcbiAgICAgKiBibG9iXG4gICAgICogQHBhcmFtIGxpc3RUeXBlIFNwZWNpZmllcyB3aGV0aGVyIHRvIHJldHVybiB0aGUgbGlzdCBvZiBjb21taXR0ZWQgYmxvY2tzLCB0aGUgbGlzdCBvZiB1bmNvbW1pdHRlZFxuICAgICAqICAgICAgICAgICAgICAgICBibG9ja3MsIG9yIGJvdGggbGlzdHMgdG9nZXRoZXIuXG4gICAgICogQHBhcmFtIG9wdGlvbnMgVGhlIG9wdGlvbnMgcGFyYW1ldGVycy5cbiAgICAgKi9cbiAgICBnZXRCbG9ja0xpc3QobGlzdFR5cGUsIG9wdGlvbnMpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuY2xpZW50LnNlbmRPcGVyYXRpb25SZXF1ZXN0KHsgbGlzdFR5cGUsIG9wdGlvbnMgfSwgZ2V0QmxvY2tMaXN0T3BlcmF0aW9uU3BlYyk7XG4gICAgfVxufVxuLy8gT3BlcmF0aW9uIFNwZWNpZmljYXRpb25zXG5jb25zdCB4bWxTZXJpYWxpemVyID0gY29yZUNsaWVudF9fbmFtZXNwYWNlLmNyZWF0ZVNlcmlhbGl6ZXIoTWFwcGVycywgLyogaXNYbWwgKi8gdHJ1ZSk7XG5jb25zdCB1cGxvYWRPcGVyYXRpb25TcGVjID0ge1xuICAgIHBhdGg6IFwiL3tjb250YWluZXJOYW1lfS97YmxvYn1cIixcbiAgICBodHRwTWV0aG9kOiBcIlBVVFwiLFxuICAgIHJlc3BvbnNlczoge1xuICAgICAgICAyMDE6IHtcbiAgICAgICAgICAgIGhlYWRlcnNNYXBwZXI6IEJsb2NrQmxvYlVwbG9hZEhlYWRlcnMsXG4gICAgICAgIH0sXG4gICAgICAgIGRlZmF1bHQ6IHtcbiAgICAgICAgICAgIGJvZHlNYXBwZXI6IFN0b3JhZ2VFcnJvcixcbiAgICAgICAgICAgIGhlYWRlcnNNYXBwZXI6IEJsb2NrQmxvYlVwbG9hZEV4Y2VwdGlvbkhlYWRlcnMsXG4gICAgICAgIH0sXG4gICAgfSxcbiAgICByZXF1ZXN0Qm9keTogYm9keTEsXG4gICAgcXVlcnlQYXJhbWV0ZXJzOiBbdGltZW91dEluU2Vjb25kc10sXG4gICAgdXJsUGFyYW1ldGVyczogW3VybF0sXG4gICAgaGVhZGVyUGFyYW1ldGVyczogW1xuICAgICAgICB2ZXJzaW9uLFxuICAgICAgICByZXF1ZXN0SWQsXG4gICAgICAgIGNvbnRlbnRMZW5ndGgsXG4gICAgICAgIG1ldGFkYXRhLFxuICAgICAgICBsZWFzZUlkLFxuICAgICAgICBpZk1vZGlmaWVkU2luY2UsXG4gICAgICAgIGlmVW5tb2RpZmllZFNpbmNlLFxuICAgICAgICBlbmNyeXB0aW9uS2V5LFxuICAgICAgICBlbmNyeXB0aW9uS2V5U2hhMjU2LFxuICAgICAgICBlbmNyeXB0aW9uQWxnb3JpdGhtLFxuICAgICAgICBpZk1hdGNoLFxuICAgICAgICBpZk5vbmVNYXRjaCxcbiAgICAgICAgaWZUYWdzLFxuICAgICAgICBibG9iQ2FjaGVDb250cm9sLFxuICAgICAgICBibG9iQ29udGVudFR5cGUsXG4gICAgICAgIGJsb2JDb250ZW50TUQ1LFxuICAgICAgICBibG9iQ29udGVudEVuY29kaW5nLFxuICAgICAgICBibG9iQ29udGVudExhbmd1YWdlLFxuICAgICAgICBibG9iQ29udGVudERpc3Bvc2l0aW9uLFxuICAgICAgICBpbW11dGFiaWxpdHlQb2xpY3lFeHBpcnksXG4gICAgICAgIGltbXV0YWJpbGl0eVBvbGljeU1vZGUsXG4gICAgICAgIGVuY3J5cHRpb25TY29wZSxcbiAgICAgICAgdGllcixcbiAgICAgICAgYmxvYlRhZ3NTdHJpbmcsXG4gICAgICAgIGxlZ2FsSG9sZDEsXG4gICAgICAgIHRyYW5zYWN0aW9uYWxDb250ZW50TUQ1LFxuICAgICAgICB0cmFuc2FjdGlvbmFsQ29udGVudENyYzY0LFxuICAgICAgICBjb250ZW50VHlwZTEsXG4gICAgICAgIGFjY2VwdDIsXG4gICAgICAgIGJsb2JUeXBlMixcbiAgICBdLFxuICAgIGlzWE1MOiB0cnVlLFxuICAgIGNvbnRlbnRUeXBlOiBcImFwcGxpY2F0aW9uL3htbDsgY2hhcnNldD11dGYtOFwiLFxuICAgIG1lZGlhVHlwZTogXCJiaW5hcnlcIixcbiAgICBzZXJpYWxpemVyOiB4bWxTZXJpYWxpemVyLFxufTtcbmNvbnN0IHB1dEJsb2JGcm9tVXJsT3BlcmF0aW9uU3BlYyA9IHtcbiAgICBwYXRoOiBcIi97Y29udGFpbmVyTmFtZX0ve2Jsb2J9XCIsXG4gICAgaHR0cE1ldGhvZDogXCJQVVRcIixcbiAgICByZXNwb25zZXM6IHtcbiAgICAgICAgMjAxOiB7XG4gICAgICAgICAgICBoZWFkZXJzTWFwcGVyOiBCbG9ja0Jsb2JQdXRCbG9iRnJvbVVybEhlYWRlcnMsXG4gICAgICAgIH0sXG4gICAgICAgIGRlZmF1bHQ6IHtcbiAgICAgICAgICAgIGJvZHlNYXBwZXI6IFN0b3JhZ2VFcnJvcixcbiAgICAgICAgICAgIGhlYWRlcnNNYXBwZXI6IEJsb2NrQmxvYlB1dEJsb2JGcm9tVXJsRXhjZXB0aW9uSGVhZGVycyxcbiAgICAgICAgfSxcbiAgICB9LFxuICAgIHF1ZXJ5UGFyYW1ldGVyczogW3RpbWVvdXRJblNlY29uZHNdLFxuICAgIHVybFBhcmFtZXRlcnM6IFt1cmxdLFxuICAgIGhlYWRlclBhcmFtZXRlcnM6IFtcbiAgICAgICAgdmVyc2lvbixcbiAgICAgICAgcmVxdWVzdElkLFxuICAgICAgICBhY2NlcHQxLFxuICAgICAgICBjb250ZW50TGVuZ3RoLFxuICAgICAgICBtZXRhZGF0YSxcbiAgICAgICAgbGVhc2VJZCxcbiAgICAgICAgaWZNb2RpZmllZFNpbmNlLFxuICAgICAgICBpZlVubW9kaWZpZWRTaW5jZSxcbiAgICAgICAgZW5jcnlwdGlvbktleSxcbiAgICAgICAgZW5jcnlwdGlvbktleVNoYTI1NixcbiAgICAgICAgZW5jcnlwdGlvbkFsZ29yaXRobSxcbiAgICAgICAgaWZNYXRjaCxcbiAgICAgICAgaWZOb25lTWF0Y2gsXG4gICAgICAgIGlmVGFncyxcbiAgICAgICAgYmxvYkNhY2hlQ29udHJvbCxcbiAgICAgICAgYmxvYkNvbnRlbnRUeXBlLFxuICAgICAgICBibG9iQ29udGVudE1ENSxcbiAgICAgICAgYmxvYkNvbnRlbnRFbmNvZGluZyxcbiAgICAgICAgYmxvYkNvbnRlbnRMYW5ndWFnZSxcbiAgICAgICAgYmxvYkNvbnRlbnREaXNwb3NpdGlvbixcbiAgICAgICAgZW5jcnlwdGlvblNjb3BlLFxuICAgICAgICB0aWVyLFxuICAgICAgICBzb3VyY2VJZk1vZGlmaWVkU2luY2UsXG4gICAgICAgIHNvdXJjZUlmVW5tb2RpZmllZFNpbmNlLFxuICAgICAgICBzb3VyY2VJZk1hdGNoLFxuICAgICAgICBzb3VyY2VJZk5vbmVNYXRjaCxcbiAgICAgICAgc291cmNlSWZUYWdzLFxuICAgICAgICBjb3B5U291cmNlLFxuICAgICAgICBibG9iVGFnc1N0cmluZyxcbiAgICAgICAgc291cmNlQ29udGVudE1ENSxcbiAgICAgICAgY29weVNvdXJjZUF1dGhvcml6YXRpb24sXG4gICAgICAgIGNvcHlTb3VyY2VUYWdzLFxuICAgICAgICB0cmFuc2FjdGlvbmFsQ29udGVudE1ENSxcbiAgICAgICAgYmxvYlR5cGUyLFxuICAgICAgICBjb3B5U291cmNlQmxvYlByb3BlcnRpZXMsXG4gICAgXSxcbiAgICBpc1hNTDogdHJ1ZSxcbiAgICBzZXJpYWxpemVyOiB4bWxTZXJpYWxpemVyLFxufTtcbmNvbnN0IHN0YWdlQmxvY2tPcGVyYXRpb25TcGVjID0ge1xuICAgIHBhdGg6IFwiL3tjb250YWluZXJOYW1lfS97YmxvYn1cIixcbiAgICBodHRwTWV0aG9kOiBcIlBVVFwiLFxuICAgIHJlc3BvbnNlczoge1xuICAgICAgICAyMDE6IHtcbiAgICAgICAgICAgIGhlYWRlcnNNYXBwZXI6IEJsb2NrQmxvYlN0YWdlQmxvY2tIZWFkZXJzLFxuICAgICAgICB9LFxuICAgICAgICBkZWZhdWx0OiB7XG4gICAgICAgICAgICBib2R5TWFwcGVyOiBTdG9yYWdlRXJyb3IsXG4gICAgICAgICAgICBoZWFkZXJzTWFwcGVyOiBCbG9ja0Jsb2JTdGFnZUJsb2NrRXhjZXB0aW9uSGVhZGVycyxcbiAgICAgICAgfSxcbiAgICB9LFxuICAgIHJlcXVlc3RCb2R5OiBib2R5MSxcbiAgICBxdWVyeVBhcmFtZXRlcnM6IFtcbiAgICAgICAgdGltZW91dEluU2Vjb25kcyxcbiAgICAgICAgY29tcDI0LFxuICAgICAgICBibG9ja0lkLFxuICAgIF0sXG4gICAgdXJsUGFyYW1ldGVyczogW3VybF0sXG4gICAgaGVhZGVyUGFyYW1ldGVyczogW1xuICAgICAgICB2ZXJzaW9uLFxuICAgICAgICByZXF1ZXN0SWQsXG4gICAgICAgIGNvbnRlbnRMZW5ndGgsXG4gICAgICAgIGxlYXNlSWQsXG4gICAgICAgIGVuY3J5cHRpb25LZXksXG4gICAgICAgIGVuY3J5cHRpb25LZXlTaGEyNTYsXG4gICAgICAgIGVuY3J5cHRpb25BbGdvcml0aG0sXG4gICAgICAgIGVuY3J5cHRpb25TY29wZSxcbiAgICAgICAgdHJhbnNhY3Rpb25hbENvbnRlbnRNRDUsXG4gICAgICAgIHRyYW5zYWN0aW9uYWxDb250ZW50Q3JjNjQsXG4gICAgICAgIGNvbnRlbnRUeXBlMSxcbiAgICAgICAgYWNjZXB0MixcbiAgICBdLFxuICAgIGlzWE1MOiB0cnVlLFxuICAgIGNvbnRlbnRUeXBlOiBcImFwcGxpY2F0aW9uL3htbDsgY2hhcnNldD11dGYtOFwiLFxuICAgIG1lZGlhVHlwZTogXCJiaW5hcnlcIixcbiAgICBzZXJpYWxpemVyOiB4bWxTZXJpYWxpemVyLFxufTtcbmNvbnN0IHN0YWdlQmxvY2tGcm9tVVJMT3BlcmF0aW9uU3BlYyA9IHtcbiAgICBwYXRoOiBcIi97Y29udGFpbmVyTmFtZX0ve2Jsb2J9XCIsXG4gICAgaHR0cE1ldGhvZDogXCJQVVRcIixcbiAgICByZXNwb25zZXM6IHtcbiAgICAgICAgMjAxOiB7XG4gICAgICAgICAgICBoZWFkZXJzTWFwcGVyOiBCbG9ja0Jsb2JTdGFnZUJsb2NrRnJvbVVSTEhlYWRlcnMsXG4gICAgICAgIH0sXG4gICAgICAgIGRlZmF1bHQ6IHtcbiAgICAgICAgICAgIGJvZHlNYXBwZXI6IFN0b3JhZ2VFcnJvcixcbiAgICAgICAgICAgIGhlYWRlcnNNYXBwZXI6IEJsb2NrQmxvYlN0YWdlQmxvY2tGcm9tVVJMRXhjZXB0aW9uSGVhZGVycyxcbiAgICAgICAgfSxcbiAgICB9LFxuICAgIHF1ZXJ5UGFyYW1ldGVyczogW1xuICAgICAgICB0aW1lb3V0SW5TZWNvbmRzLFxuICAgICAgICBjb21wMjQsXG4gICAgICAgIGJsb2NrSWQsXG4gICAgXSxcbiAgICB1cmxQYXJhbWV0ZXJzOiBbdXJsXSxcbiAgICBoZWFkZXJQYXJhbWV0ZXJzOiBbXG4gICAgICAgIHZlcnNpb24sXG4gICAgICAgIHJlcXVlc3RJZCxcbiAgICAgICAgYWNjZXB0MSxcbiAgICAgICAgY29udGVudExlbmd0aCxcbiAgICAgICAgbGVhc2VJZCxcbiAgICAgICAgZW5jcnlwdGlvbktleSxcbiAgICAgICAgZW5jcnlwdGlvbktleVNoYTI1NixcbiAgICAgICAgZW5jcnlwdGlvbkFsZ29yaXRobSxcbiAgICAgICAgZW5jcnlwdGlvblNjb3BlLFxuICAgICAgICBzb3VyY2VJZk1vZGlmaWVkU2luY2UsXG4gICAgICAgIHNvdXJjZUlmVW5tb2RpZmllZFNpbmNlLFxuICAgICAgICBzb3VyY2VJZk1hdGNoLFxuICAgICAgICBzb3VyY2VJZk5vbmVNYXRjaCxcbiAgICAgICAgc291cmNlQ29udGVudE1ENSxcbiAgICAgICAgY29weVNvdXJjZUF1dGhvcml6YXRpb24sXG4gICAgICAgIHNvdXJjZVVybCxcbiAgICAgICAgc291cmNlQ29udGVudENyYzY0LFxuICAgICAgICBzb3VyY2VSYW5nZTEsXG4gICAgXSxcbiAgICBpc1hNTDogdHJ1ZSxcbiAgICBzZXJpYWxpemVyOiB4bWxTZXJpYWxpemVyLFxufTtcbmNvbnN0IGNvbW1pdEJsb2NrTGlzdE9wZXJhdGlvblNwZWMgPSB7XG4gICAgcGF0aDogXCIve2NvbnRhaW5lck5hbWV9L3tibG9ifVwiLFxuICAgIGh0dHBNZXRob2Q6IFwiUFVUXCIsXG4gICAgcmVzcG9uc2VzOiB7XG4gICAgICAgIDIwMToge1xuICAgICAgICAgICAgaGVhZGVyc01hcHBlcjogQmxvY2tCbG9iQ29tbWl0QmxvY2tMaXN0SGVhZGVycyxcbiAgICAgICAgfSxcbiAgICAgICAgZGVmYXVsdDoge1xuICAgICAgICAgICAgYm9keU1hcHBlcjogU3RvcmFnZUVycm9yLFxuICAgICAgICAgICAgaGVhZGVyc01hcHBlcjogQmxvY2tCbG9iQ29tbWl0QmxvY2tMaXN0RXhjZXB0aW9uSGVhZGVycyxcbiAgICAgICAgfSxcbiAgICB9LFxuICAgIHJlcXVlc3RCb2R5OiBibG9ja3MsXG4gICAgcXVlcnlQYXJhbWV0ZXJzOiBbdGltZW91dEluU2Vjb25kcywgY29tcDI1XSxcbiAgICB1cmxQYXJhbWV0ZXJzOiBbdXJsXSxcbiAgICBoZWFkZXJQYXJhbWV0ZXJzOiBbXG4gICAgICAgIGNvbnRlbnRUeXBlLFxuICAgICAgICBhY2NlcHQsXG4gICAgICAgIHZlcnNpb24sXG4gICAgICAgIHJlcXVlc3RJZCxcbiAgICAgICAgbWV0YWRhdGEsXG4gICAgICAgIGxlYXNlSWQsXG4gICAgICAgIGlmTW9kaWZpZWRTaW5jZSxcbiAgICAgICAgaWZVbm1vZGlmaWVkU2luY2UsXG4gICAgICAgIGVuY3J5cHRpb25LZXksXG4gICAgICAgIGVuY3J5cHRpb25LZXlTaGEyNTYsXG4gICAgICAgIGVuY3J5cHRpb25BbGdvcml0aG0sXG4gICAgICAgIGlmTWF0Y2gsXG4gICAgICAgIGlmTm9uZU1hdGNoLFxuICAgICAgICBpZlRhZ3MsXG4gICAgICAgIGJsb2JDYWNoZUNvbnRyb2wsXG4gICAgICAgIGJsb2JDb250ZW50VHlwZSxcbiAgICAgICAgYmxvYkNvbnRlbnRNRDUsXG4gICAgICAgIGJsb2JDb250ZW50RW5jb2RpbmcsXG4gICAgICAgIGJsb2JDb250ZW50TGFuZ3VhZ2UsXG4gICAgICAgIGJsb2JDb250ZW50RGlzcG9zaXRpb24sXG4gICAgICAgIGltbXV0YWJpbGl0eVBvbGljeUV4cGlyeSxcbiAgICAgICAgaW1tdXRhYmlsaXR5UG9saWN5TW9kZSxcbiAgICAgICAgZW5jcnlwdGlvblNjb3BlLFxuICAgICAgICB0aWVyLFxuICAgICAgICBibG9iVGFnc1N0cmluZyxcbiAgICAgICAgbGVnYWxIb2xkMSxcbiAgICAgICAgdHJhbnNhY3Rpb25hbENvbnRlbnRNRDUsXG4gICAgICAgIHRyYW5zYWN0aW9uYWxDb250ZW50Q3JjNjQsXG4gICAgXSxcbiAgICBpc1hNTDogdHJ1ZSxcbiAgICBjb250ZW50VHlwZTogXCJhcHBsaWNhdGlvbi94bWw7IGNoYXJzZXQ9dXRmLThcIixcbiAgICBtZWRpYVR5cGU6IFwieG1sXCIsXG4gICAgc2VyaWFsaXplcjogeG1sU2VyaWFsaXplcixcbn07XG5jb25zdCBnZXRCbG9ja0xpc3RPcGVyYXRpb25TcGVjID0ge1xuICAgIHBhdGg6IFwiL3tjb250YWluZXJOYW1lfS97YmxvYn1cIixcbiAgICBodHRwTWV0aG9kOiBcIkdFVFwiLFxuICAgIHJlc3BvbnNlczoge1xuICAgICAgICAyMDA6IHtcbiAgICAgICAgICAgIGJvZHlNYXBwZXI6IEJsb2NrTGlzdCxcbiAgICAgICAgICAgIGhlYWRlcnNNYXBwZXI6IEJsb2NrQmxvYkdldEJsb2NrTGlzdEhlYWRlcnMsXG4gICAgICAgIH0sXG4gICAgICAgIGRlZmF1bHQ6IHtcbiAgICAgICAgICAgIGJvZHlNYXBwZXI6IFN0b3JhZ2VFcnJvcixcbiAgICAgICAgICAgIGhlYWRlcnNNYXBwZXI6IEJsb2NrQmxvYkdldEJsb2NrTGlzdEV4Y2VwdGlvbkhlYWRlcnMsXG4gICAgICAgIH0sXG4gICAgfSxcbiAgICBxdWVyeVBhcmFtZXRlcnM6IFtcbiAgICAgICAgdGltZW91dEluU2Vjb25kcyxcbiAgICAgICAgc25hcHNob3QsXG4gICAgICAgIGNvbXAyNSxcbiAgICAgICAgbGlzdFR5cGUsXG4gICAgXSxcbiAgICB1cmxQYXJhbWV0ZXJzOiBbdXJsXSxcbiAgICBoZWFkZXJQYXJhbWV0ZXJzOiBbXG4gICAgICAgIHZlcnNpb24sXG4gICAgICAgIHJlcXVlc3RJZCxcbiAgICAgICAgYWNjZXB0MSxcbiAgICAgICAgbGVhc2VJZCxcbiAgICAgICAgaWZUYWdzLFxuICAgIF0sXG4gICAgaXNYTUw6IHRydWUsXG4gICAgc2VyaWFsaXplcjogeG1sU2VyaWFsaXplcixcbn07XG5cbi8qXG4gKiBDb3B5cmlnaHQgKGMpIE1pY3Jvc29mdCBDb3Jwb3JhdGlvbi5cbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBNSVQgTGljZW5zZS5cbiAqXG4gKiBDb2RlIGdlbmVyYXRlZCBieSBNaWNyb3NvZnQgKFIpIEF1dG9SZXN0IENvZGUgR2VuZXJhdG9yLlxuICogQ2hhbmdlcyBtYXkgY2F1c2UgaW5jb3JyZWN0IGJlaGF2aW9yIGFuZCB3aWxsIGJlIGxvc3QgaWYgdGhlIGNvZGUgaXMgcmVnZW5lcmF0ZWQuXG4gKi9cbmxldCBTdG9yYWdlQ2xpZW50JDEgPSBjbGFzcyBTdG9yYWdlQ2xpZW50IGV4dGVuZHMgY29yZUh0dHBDb21wYXRfX25hbWVzcGFjZS5FeHRlbmRlZFNlcnZpY2VDbGllbnQge1xuICAgIC8qKlxuICAgICAqIEluaXRpYWxpemVzIGEgbmV3IGluc3RhbmNlIG9mIHRoZSBTdG9yYWdlQ2xpZW50IGNsYXNzLlxuICAgICAqIEBwYXJhbSB1cmwgVGhlIFVSTCBvZiB0aGUgc2VydmljZSBhY2NvdW50LCBjb250YWluZXIsIG9yIGJsb2IgdGhhdCBpcyB0aGUgdGFyZ2V0IG9mIHRoZSBkZXNpcmVkXG4gICAgICogICAgICAgICAgICBvcGVyYXRpb24uXG4gICAgICogQHBhcmFtIG9wdGlvbnMgVGhlIHBhcmFtZXRlciBvcHRpb25zXG4gICAgICovXG4gICAgY29uc3RydWN0b3IodXJsLCBvcHRpb25zKSB7XG4gICAgICAgIHZhciBfYSwgX2I7XG4gICAgICAgIGlmICh1cmwgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwiJ3VybCcgY2Fubm90IGJlIG51bGxcIik7XG4gICAgICAgIH1cbiAgICAgICAgLy8gSW5pdGlhbGl6aW5nIGRlZmF1bHQgdmFsdWVzIGZvciBvcHRpb25zXG4gICAgICAgIGlmICghb3B0aW9ucykge1xuICAgICAgICAgICAgb3B0aW9ucyA9IHt9O1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IGRlZmF1bHRzID0ge1xuICAgICAgICAgICAgcmVxdWVzdENvbnRlbnRUeXBlOiBcImFwcGxpY2F0aW9uL2pzb247IGNoYXJzZXQ9dXRmLThcIixcbiAgICAgICAgfTtcbiAgICAgICAgY29uc3QgcGFja2FnZURldGFpbHMgPSBgYXpzZGstanMtYXp1cmUtc3RvcmFnZS1ibG9iLzEyLjI1LjBgO1xuICAgICAgICBjb25zdCB1c2VyQWdlbnRQcmVmaXggPSBvcHRpb25zLnVzZXJBZ2VudE9wdGlvbnMgJiYgb3B0aW9ucy51c2VyQWdlbnRPcHRpb25zLnVzZXJBZ2VudFByZWZpeFxuICAgICAgICAgICAgPyBgJHtvcHRpb25zLnVzZXJBZ2VudE9wdGlvbnMudXNlckFnZW50UHJlZml4fSAke3BhY2thZ2VEZXRhaWxzfWBcbiAgICAgICAgICAgIDogYCR7cGFja2FnZURldGFpbHN9YDtcbiAgICAgICAgY29uc3Qgb3B0aW9uc1dpdGhEZWZhdWx0cyA9IE9iamVjdC5hc3NpZ24oT2JqZWN0LmFzc2lnbihPYmplY3QuYXNzaWduKHt9LCBkZWZhdWx0cyksIG9wdGlvbnMpLCB7IHVzZXJBZ2VudE9wdGlvbnM6IHtcbiAgICAgICAgICAgICAgICB1c2VyQWdlbnRQcmVmaXgsXG4gICAgICAgICAgICB9LCBlbmRwb2ludDogKF9iID0gKF9hID0gb3B0aW9ucy5lbmRwb2ludCkgIT09IG51bGwgJiYgX2EgIT09IHZvaWQgMCA/IF9hIDogb3B0aW9ucy5iYXNlVXJpKSAhPT0gbnVsbCAmJiBfYiAhPT0gdm9pZCAwID8gX2IgOiBcInt1cmx9XCIgfSk7XG4gICAgICAgIHN1cGVyKG9wdGlvbnNXaXRoRGVmYXVsdHMpO1xuICAgICAgICAvLyBQYXJhbWV0ZXIgYXNzaWdubWVudHNcbiAgICAgICAgdGhpcy51cmwgPSB1cmw7XG4gICAgICAgIC8vIEFzc2lnbmluZyB2YWx1ZXMgdG8gQ29uc3RhbnQgcGFyYW1ldGVyc1xuICAgICAgICB0aGlzLnZlcnNpb24gPSBvcHRpb25zLnZlcnNpb24gfHwgXCIyMDI0LTExLTA0XCI7XG4gICAgICAgIHRoaXMuc2VydmljZSA9IG5ldyBTZXJ2aWNlSW1wbCh0aGlzKTtcbiAgICAgICAgdGhpcy5jb250YWluZXIgPSBuZXcgQ29udGFpbmVySW1wbCh0aGlzKTtcbiAgICAgICAgdGhpcy5ibG9iID0gbmV3IEJsb2JJbXBsKHRoaXMpO1xuICAgICAgICB0aGlzLnBhZ2VCbG9iID0gbmV3IFBhZ2VCbG9iSW1wbCh0aGlzKTtcbiAgICAgICAgdGhpcy5hcHBlbmRCbG9iID0gbmV3IEFwcGVuZEJsb2JJbXBsKHRoaXMpO1xuICAgICAgICB0aGlzLmJsb2NrQmxvYiA9IG5ldyBCbG9ja0Jsb2JJbXBsKHRoaXMpO1xuICAgIH1cbn07XG5cbi8vIENvcHlyaWdodCAoYykgTWljcm9zb2Z0IENvcnBvcmF0aW9uLlxuLy8gTGljZW5zZWQgdW5kZXIgdGhlIE1JVCBMaWNlbnNlLlxuLyoqXG4gKiBAaW50ZXJuYWxcbiAqL1xuY2xhc3MgU3RvcmFnZUNvbnRleHRDbGllbnQgZXh0ZW5kcyBTdG9yYWdlQ2xpZW50JDEge1xuICAgIGFzeW5jIHNlbmRPcGVyYXRpb25SZXF1ZXN0KG9wZXJhdGlvbkFyZ3VtZW50cywgb3BlcmF0aW9uU3BlYykge1xuICAgICAgICBjb25zdCBvcGVyYXRpb25TcGVjVG9TZW5kID0gT2JqZWN0LmFzc2lnbih7fSwgb3BlcmF0aW9uU3BlYyk7XG4gICAgICAgIGlmIChvcGVyYXRpb25TcGVjVG9TZW5kLnBhdGggPT09IFwiL3tjb250YWluZXJOYW1lfVwiIHx8XG4gICAgICAgICAgICBvcGVyYXRpb25TcGVjVG9TZW5kLnBhdGggPT09IFwiL3tjb250YWluZXJOYW1lfS97YmxvYn1cIikge1xuICAgICAgICAgICAgb3BlcmF0aW9uU3BlY1RvU2VuZC5wYXRoID0gXCJcIjtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gc3VwZXIuc2VuZE9wZXJhdGlvblJlcXVlc3Qob3BlcmF0aW9uQXJndW1lbnRzLCBvcGVyYXRpb25TcGVjVG9TZW5kKTtcbiAgICB9XG59XG5cbi8vIENvcHlyaWdodCAoYykgTWljcm9zb2Z0IENvcnBvcmF0aW9uLlxuLy8gTGljZW5zZWQgdW5kZXIgdGhlIE1JVCBMaWNlbnNlLlxuLyoqXG4gKiBBIFN0b3JhZ2VDbGllbnQgcmVwcmVzZW50cyBhIGJhc2VkIFVSTCBjbGFzcyBmb3Ige0BsaW5rIEJsb2JTZXJ2aWNlQ2xpZW50fSwge0BsaW5rIENvbnRhaW5lckNsaWVudH1cbiAqIGFuZCBldGMuXG4gKi9cbmNsYXNzIFN0b3JhZ2VDbGllbnQge1xuICAgIC8qKlxuICAgICAqIENyZWF0ZXMgYW4gaW5zdGFuY2Ugb2YgU3RvcmFnZUNsaWVudC5cbiAgICAgKiBAcGFyYW0gdXJsIC0gdXJsIHRvIHJlc291cmNlXG4gICAgICogQHBhcmFtIHBpcGVsaW5lIC0gcmVxdWVzdCBwb2xpY3kgcGlwZWxpbmUuXG4gICAgICovXG4gICAgY29uc3RydWN0b3IodXJsLCBwaXBlbGluZSkge1xuICAgICAgICAvLyBVUkwgc2hvdWxkIGJlIGVuY29kZWQgYW5kIG9ubHkgb25jZSwgcHJvdG9jb2wgbGF5ZXIgc2hvdWxkbid0IGVuY29kZSBVUkwgYWdhaW5cbiAgICAgICAgdGhpcy51cmwgPSBlc2NhcGVVUkxQYXRoKHVybCk7XG4gICAgICAgIHRoaXMuYWNjb3VudE5hbWUgPSBnZXRBY2NvdW50TmFtZUZyb21VcmwodXJsKTtcbiAgICAgICAgdGhpcy5waXBlbGluZSA9IHBpcGVsaW5lO1xuICAgICAgICB0aGlzLnN0b3JhZ2VDbGllbnRDb250ZXh0ID0gbmV3IFN0b3JhZ2VDb250ZXh0Q2xpZW50KHRoaXMudXJsLCBnZXRDb3JlQ2xpZW50T3B0aW9ucyhwaXBlbGluZSkpO1xuICAgICAgICB0aGlzLmlzSHR0cHMgPSBpRXF1YWwoZ2V0VVJMU2NoZW1lKHRoaXMudXJsKSB8fCBcIlwiLCBcImh0dHBzXCIpO1xuICAgICAgICB0aGlzLmNyZWRlbnRpYWwgPSBnZXRDcmVkZW50aWFsRnJvbVBpcGVsaW5lKHBpcGVsaW5lKTtcbiAgICAgICAgLy8gT3ZlcnJpZGUgcHJvdG9jb2wgbGF5ZXIncyBkZWZhdWx0IGNvbnRlbnQtdHlwZVxuICAgICAgICBjb25zdCBzdG9yYWdlQ2xpZW50Q29udGV4dCA9IHRoaXMuc3RvcmFnZUNsaWVudENvbnRleHQ7XG4gICAgICAgIHN0b3JhZ2VDbGllbnRDb250ZXh0LnJlcXVlc3RDb250ZW50VHlwZSA9IHVuZGVmaW5lZDtcbiAgICB9XG59XG5cbi8vIENvcHlyaWdodCAoYykgTWljcm9zb2Z0IENvcnBvcmF0aW9uLlxuLy8gTGljZW5zZWQgdW5kZXIgdGhlIE1JVCBMaWNlbnNlLlxuLyoqXG4gKiBDcmVhdGVzIGEgc3BhbiB1c2luZyB0aGUgZ2xvYmFsIHRyYWNlci5cbiAqIEBpbnRlcm5hbFxuICovXG5jb25zdCB0cmFjaW5nQ2xpZW50ID0gY29yZVRyYWNpbmcuY3JlYXRlVHJhY2luZ0NsaWVudCh7XG4gICAgcGFja2FnZU5hbWU6IFwiQGF6dXJlL3N0b3JhZ2UtYmxvYlwiLFxuICAgIHBhY2thZ2VWZXJzaW9uOiBTREtfVkVSU0lPTixcbiAgICBuYW1lc3BhY2U6IFwiTWljcm9zb2Z0LlN0b3JhZ2VcIixcbn0pO1xuXG4vLyBDb3B5cmlnaHQgKGMpIE1pY3Jvc29mdCBDb3Jwb3JhdGlvbi5cbi8vIExpY2Vuc2VkIHVuZGVyIHRoZSBNSVQgTGljZW5zZS5cbi8qKlxuICogT05MWSBBVkFJTEFCTEUgSU4gTk9ERS5KUyBSVU5USU1FLlxuICpcbiAqIFRoaXMgaXMgYSBoZWxwZXIgY2xhc3MgdG8gY29uc3RydWN0IGEgc3RyaW5nIHJlcHJlc2VudGluZyB0aGUgcGVybWlzc2lvbnMgZ3JhbnRlZCBieSBhIFNlcnZpY2VTQVMgdG8gYSBibG9iLiBTZXR0aW5nXG4gKiBhIHZhbHVlIHRvIHRydWUgbWVhbnMgdGhhdCBhbnkgU0FTIHdoaWNoIHVzZXMgdGhlc2UgcGVybWlzc2lvbnMgd2lsbCBncmFudCBwZXJtaXNzaW9ucyBmb3IgdGhhdCBvcGVyYXRpb24uIE9uY2UgYWxsXG4gKiB0aGUgdmFsdWVzIGFyZSBzZXQsIHRoaXMgc2hvdWxkIGJlIHNlcmlhbGl6ZWQgd2l0aCB0b1N0cmluZyBhbmQgc2V0IGFzIHRoZSBwZXJtaXNzaW9ucyBmaWVsZCBvbiBhXG4gKiB7QGxpbmsgQmxvYlNBU1NpZ25hdHVyZVZhbHVlc30gb2JqZWN0LiBJdCBpcyBwb3NzaWJsZSB0byBjb25zdHJ1Y3QgdGhlIHBlcm1pc3Npb25zIHN0cmluZyB3aXRob3V0IHRoaXMgY2xhc3MsIGJ1dFxuICogdGhlIG9yZGVyIG9mIHRoZSBwZXJtaXNzaW9ucyBpcyBwYXJ0aWN1bGFyIGFuZCB0aGlzIGNsYXNzIGd1YXJhbnRlZXMgY29ycmVjdG5lc3MuXG4gKi9cbmNsYXNzIEJsb2JTQVNQZXJtaXNzaW9ucyB7XG4gICAgY29uc3RydWN0b3IoKSB7XG4gICAgICAgIC8qKlxuICAgICAgICAgKiBTcGVjaWZpZXMgUmVhZCBhY2Nlc3MgZ3JhbnRlZC5cbiAgICAgICAgICovXG4gICAgICAgIHRoaXMucmVhZCA9IGZhbHNlO1xuICAgICAgICAvKipcbiAgICAgICAgICogU3BlY2lmaWVzIEFkZCBhY2Nlc3MgZ3JhbnRlZC5cbiAgICAgICAgICovXG4gICAgICAgIHRoaXMuYWRkID0gZmFsc2U7XG4gICAgICAgIC8qKlxuICAgICAgICAgKiBTcGVjaWZpZXMgQ3JlYXRlIGFjY2VzcyBncmFudGVkLlxuICAgICAgICAgKi9cbiAgICAgICAgdGhpcy5jcmVhdGUgPSBmYWxzZTtcbiAgICAgICAgLyoqXG4gICAgICAgICAqIFNwZWNpZmllcyBXcml0ZSBhY2Nlc3MgZ3JhbnRlZC5cbiAgICAgICAgICovXG4gICAgICAgIHRoaXMud3JpdGUgPSBmYWxzZTtcbiAgICAgICAgLyoqXG4gICAgICAgICAqIFNwZWNpZmllcyBEZWxldGUgYWNjZXNzIGdyYW50ZWQuXG4gICAgICAgICAqL1xuICAgICAgICB0aGlzLmRlbGV0ZSA9IGZhbHNlO1xuICAgICAgICAvKipcbiAgICAgICAgICogU3BlY2lmaWVzIERlbGV0ZSB2ZXJzaW9uIGFjY2VzcyBncmFudGVkLlxuICAgICAgICAgKi9cbiAgICAgICAgdGhpcy5kZWxldGVWZXJzaW9uID0gZmFsc2U7XG4gICAgICAgIC8qKlxuICAgICAgICAgKiBTcGVjZmllcyBUYWcgYWNjZXNzIGdyYW50ZWQuXG4gICAgICAgICAqL1xuICAgICAgICB0aGlzLnRhZyA9IGZhbHNlO1xuICAgICAgICAvKipcbiAgICAgICAgICogU3BlY2lmaWVzIE1vdmUgYWNjZXNzIGdyYW50ZWQuXG4gICAgICAgICAqL1xuICAgICAgICB0aGlzLm1vdmUgPSBmYWxzZTtcbiAgICAgICAgLyoqXG4gICAgICAgICAqIFNwZWNpZmllcyBFeGVjdXRlIGFjY2VzcyBncmFudGVkLlxuICAgICAgICAgKi9cbiAgICAgICAgdGhpcy5leGVjdXRlID0gZmFsc2U7XG4gICAgICAgIC8qKlxuICAgICAgICAgKiBTcGVjaWZpZXMgU2V0SW1tdXRhYmlsaXR5UG9saWN5IGFjY2VzcyBncmFudGVkLlxuICAgICAgICAgKi9cbiAgICAgICAgdGhpcy5zZXRJbW11dGFiaWxpdHlQb2xpY3kgPSBmYWxzZTtcbiAgICAgICAgLyoqXG4gICAgICAgICAqIFNwZWNpZmllcyB0aGF0IFBlcm1hbmVudCBEZWxldGUgaXMgcGVybWl0dGVkLlxuICAgICAgICAgKi9cbiAgICAgICAgdGhpcy5wZXJtYW5lbnREZWxldGUgPSBmYWxzZTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogQ3JlYXRlcyBhIHtAbGluayBCbG9iU0FTUGVybWlzc2lvbnN9IGZyb20gdGhlIHNwZWNpZmllZCBwZXJtaXNzaW9ucyBzdHJpbmcuIFRoaXMgbWV0aG9kIHdpbGwgdGhyb3cgYW5cbiAgICAgKiBFcnJvciBpZiBpdCBlbmNvdW50ZXJzIGEgY2hhcmFjdGVyIHRoYXQgZG9lcyBub3QgY29ycmVzcG9uZCB0byBhIHZhbGlkIHBlcm1pc3Npb24uXG4gICAgICpcbiAgICAgKiBAcGFyYW0gcGVybWlzc2lvbnMgLVxuICAgICAqL1xuICAgIHN0YXRpYyBwYXJzZShwZXJtaXNzaW9ucykge1xuICAgICAgICBjb25zdCBibG9iU0FTUGVybWlzc2lvbnMgPSBuZXcgQmxvYlNBU1Blcm1pc3Npb25zKCk7XG4gICAgICAgIGZvciAoY29uc3QgY2hhciBvZiBwZXJtaXNzaW9ucykge1xuICAgICAgICAgICAgc3dpdGNoIChjaGFyKSB7XG4gICAgICAgICAgICAgICAgY2FzZSBcInJcIjpcbiAgICAgICAgICAgICAgICAgICAgYmxvYlNBU1Blcm1pc3Npb25zLnJlYWQgPSB0cnVlO1xuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICBjYXNlIFwiYVwiOlxuICAgICAgICAgICAgICAgICAgICBibG9iU0FTUGVybWlzc2lvbnMuYWRkID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgY2FzZSBcImNcIjpcbiAgICAgICAgICAgICAgICAgICAgYmxvYlNBU1Blcm1pc3Npb25zLmNyZWF0ZSA9IHRydWU7XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIGNhc2UgXCJ3XCI6XG4gICAgICAgICAgICAgICAgICAgIGJsb2JTQVNQZXJtaXNzaW9ucy53cml0ZSA9IHRydWU7XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIGNhc2UgXCJkXCI6XG4gICAgICAgICAgICAgICAgICAgIGJsb2JTQVNQZXJtaXNzaW9ucy5kZWxldGUgPSB0cnVlO1xuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICBjYXNlIFwieFwiOlxuICAgICAgICAgICAgICAgICAgICBibG9iU0FTUGVybWlzc2lvbnMuZGVsZXRlVmVyc2lvbiA9IHRydWU7XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIGNhc2UgXCJ0XCI6XG4gICAgICAgICAgICAgICAgICAgIGJsb2JTQVNQZXJtaXNzaW9ucy50YWcgPSB0cnVlO1xuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICBjYXNlIFwibVwiOlxuICAgICAgICAgICAgICAgICAgICBibG9iU0FTUGVybWlzc2lvbnMubW92ZSA9IHRydWU7XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIGNhc2UgXCJlXCI6XG4gICAgICAgICAgICAgICAgICAgIGJsb2JTQVNQZXJtaXNzaW9ucy5leGVjdXRlID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgY2FzZSBcImlcIjpcbiAgICAgICAgICAgICAgICAgICAgYmxvYlNBU1Blcm1pc3Npb25zLnNldEltbXV0YWJpbGl0eVBvbGljeSA9IHRydWU7XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIGNhc2UgXCJ5XCI6XG4gICAgICAgICAgICAgICAgICAgIGJsb2JTQVNQZXJtaXNzaW9ucy5wZXJtYW5lbnREZWxldGUgPSB0cnVlO1xuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgUmFuZ2VFcnJvcihgSW52YWxpZCBwZXJtaXNzaW9uOiAke2NoYXJ9YCk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGJsb2JTQVNQZXJtaXNzaW9ucztcbiAgICB9XG4gICAgLyoqXG4gICAgICogQ3JlYXRlcyBhIHtAbGluayBCbG9iU0FTUGVybWlzc2lvbnN9IGZyb20gYSByYXcgb2JqZWN0IHdoaWNoIGNvbnRhaW5zIHNhbWUga2V5cyBhcyBpdFxuICAgICAqIGFuZCBib29sZWFuIHZhbHVlcyBmb3IgdGhlbS5cbiAgICAgKlxuICAgICAqIEBwYXJhbSBwZXJtaXNzaW9uTGlrZSAtXG4gICAgICovXG4gICAgc3RhdGljIGZyb20ocGVybWlzc2lvbkxpa2UpIHtcbiAgICAgICAgY29uc3QgYmxvYlNBU1Blcm1pc3Npb25zID0gbmV3IEJsb2JTQVNQZXJtaXNzaW9ucygpO1xuICAgICAgICBpZiAocGVybWlzc2lvbkxpa2UucmVhZCkge1xuICAgICAgICAgICAgYmxvYlNBU1Blcm1pc3Npb25zLnJlYWQgPSB0cnVlO1xuICAgICAgICB9XG4gICAgICAgIGlmIChwZXJtaXNzaW9uTGlrZS5hZGQpIHtcbiAgICAgICAgICAgIGJsb2JTQVNQZXJtaXNzaW9ucy5hZGQgPSB0cnVlO1xuICAgICAgICB9XG4gICAgICAgIGlmIChwZXJtaXNzaW9uTGlrZS5jcmVhdGUpIHtcbiAgICAgICAgICAgIGJsb2JTQVNQZXJtaXNzaW9ucy5jcmVhdGUgPSB0cnVlO1xuICAgICAgICB9XG4gICAgICAgIGlmIChwZXJtaXNzaW9uTGlrZS53cml0ZSkge1xuICAgICAgICAgICAgYmxvYlNBU1Blcm1pc3Npb25zLndyaXRlID0gdHJ1ZTtcbiAgICAgICAgfVxuICAgICAgICBpZiAocGVybWlzc2lvbkxpa2UuZGVsZXRlKSB7XG4gICAgICAgICAgICBibG9iU0FTUGVybWlzc2lvbnMuZGVsZXRlID0gdHJ1ZTtcbiAgICAgICAgfVxuICAgICAgICBpZiAocGVybWlzc2lvbkxpa2UuZGVsZXRlVmVyc2lvbikge1xuICAgICAgICAgICAgYmxvYlNBU1Blcm1pc3Npb25zLmRlbGV0ZVZlcnNpb24gPSB0cnVlO1xuICAgICAgICB9XG4gICAgICAgIGlmIChwZXJtaXNzaW9uTGlrZS50YWcpIHtcbiAgICAgICAgICAgIGJsb2JTQVNQZXJtaXNzaW9ucy50YWcgPSB0cnVlO1xuICAgICAgICB9XG4gICAgICAgIGlmIChwZXJtaXNzaW9uTGlrZS5tb3ZlKSB7XG4gICAgICAgICAgICBibG9iU0FTUGVybWlzc2lvbnMubW92ZSA9IHRydWU7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHBlcm1pc3Npb25MaWtlLmV4ZWN1dGUpIHtcbiAgICAgICAgICAgIGJsb2JTQVNQZXJtaXNzaW9ucy5leGVjdXRlID0gdHJ1ZTtcbiAgICAgICAgfVxuICAgICAgICBpZiAocGVybWlzc2lvbkxpa2Uuc2V0SW1tdXRhYmlsaXR5UG9saWN5KSB7XG4gICAgICAgICAgICBibG9iU0FTUGVybWlzc2lvbnMuc2V0SW1tdXRhYmlsaXR5UG9saWN5ID0gdHJ1ZTtcbiAgICAgICAgfVxuICAgICAgICBpZiAocGVybWlzc2lvbkxpa2UucGVybWFuZW50RGVsZXRlKSB7XG4gICAgICAgICAgICBibG9iU0FTUGVybWlzc2lvbnMucGVybWFuZW50RGVsZXRlID0gdHJ1ZTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gYmxvYlNBU1Blcm1pc3Npb25zO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBDb252ZXJ0cyB0aGUgZ2l2ZW4gcGVybWlzc2lvbnMgdG8gYSBzdHJpbmcuIFVzaW5nIHRoaXMgbWV0aG9kIHdpbGwgZ3VhcmFudGVlIHRoZSBwZXJtaXNzaW9ucyBhcmUgaW4gYW5cbiAgICAgKiBvcmRlciBhY2NlcHRlZCBieSB0aGUgc2VydmljZS5cbiAgICAgKlxuICAgICAqIEByZXR1cm5zIEEgc3RyaW5nIHdoaWNoIHJlcHJlc2VudHMgdGhlIEJsb2JTQVNQZXJtaXNzaW9uc1xuICAgICAqL1xuICAgIHRvU3RyaW5nKCkge1xuICAgICAgICBjb25zdCBwZXJtaXNzaW9ucyA9IFtdO1xuICAgICAgICBpZiAodGhpcy5yZWFkKSB7XG4gICAgICAgICAgICBwZXJtaXNzaW9ucy5wdXNoKFwiclwiKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAodGhpcy5hZGQpIHtcbiAgICAgICAgICAgIHBlcm1pc3Npb25zLnB1c2goXCJhXCIpO1xuICAgICAgICB9XG4gICAgICAgIGlmICh0aGlzLmNyZWF0ZSkge1xuICAgICAgICAgICAgcGVybWlzc2lvbnMucHVzaChcImNcIik7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHRoaXMud3JpdGUpIHtcbiAgICAgICAgICAgIHBlcm1pc3Npb25zLnB1c2goXCJ3XCIpO1xuICAgICAgICB9XG4gICAgICAgIGlmICh0aGlzLmRlbGV0ZSkge1xuICAgICAgICAgICAgcGVybWlzc2lvbnMucHVzaChcImRcIik7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHRoaXMuZGVsZXRlVmVyc2lvbikge1xuICAgICAgICAgICAgcGVybWlzc2lvbnMucHVzaChcInhcIik7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHRoaXMudGFnKSB7XG4gICAgICAgICAgICBwZXJtaXNzaW9ucy5wdXNoKFwidFwiKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAodGhpcy5tb3ZlKSB7XG4gICAgICAgICAgICBwZXJtaXNzaW9ucy5wdXNoKFwibVwiKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAodGhpcy5leGVjdXRlKSB7XG4gICAgICAgICAgICBwZXJtaXNzaW9ucy5wdXNoKFwiZVwiKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAodGhpcy5zZXRJbW11dGFiaWxpdHlQb2xpY3kpIHtcbiAgICAgICAgICAgIHBlcm1pc3Npb25zLnB1c2goXCJpXCIpO1xuICAgICAgICB9XG4gICAgICAgIGlmICh0aGlzLnBlcm1hbmVudERlbGV0ZSkge1xuICAgICAgICAgICAgcGVybWlzc2lvbnMucHVzaChcInlcIik7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHBlcm1pc3Npb25zLmpvaW4oXCJcIik7XG4gICAgfVxufVxuXG4vLyBDb3B5cmlnaHQgKGMpIE1pY3Jvc29mdCBDb3Jwb3JhdGlvbi5cbi8vIExpY2Vuc2VkIHVuZGVyIHRoZSBNSVQgTGljZW5zZS5cbi8qKlxuICogVGhpcyBpcyBhIGhlbHBlciBjbGFzcyB0byBjb25zdHJ1Y3QgYSBzdHJpbmcgcmVwcmVzZW50aW5nIHRoZSBwZXJtaXNzaW9ucyBncmFudGVkIGJ5IGEgU2VydmljZVNBUyB0byBhIGNvbnRhaW5lci5cbiAqIFNldHRpbmcgYSB2YWx1ZSB0byB0cnVlIG1lYW5zIHRoYXQgYW55IFNBUyB3aGljaCB1c2VzIHRoZXNlIHBlcm1pc3Npb25zIHdpbGwgZ3JhbnQgcGVybWlzc2lvbnMgZm9yIHRoYXQgb3BlcmF0aW9uLlxuICogT25jZSBhbGwgdGhlIHZhbHVlcyBhcmUgc2V0LCB0aGlzIHNob3VsZCBiZSBzZXJpYWxpemVkIHdpdGggdG9TdHJpbmcgYW5kIHNldCBhcyB0aGUgcGVybWlzc2lvbnMgZmllbGQgb24gYVxuICoge0BsaW5rIEJsb2JTQVNTaWduYXR1cmVWYWx1ZXN9IG9iamVjdC4gSXQgaXMgcG9zc2libGUgdG8gY29uc3RydWN0IHRoZSBwZXJtaXNzaW9ucyBzdHJpbmcgd2l0aG91dCB0aGlzIGNsYXNzLCBidXRcbiAqIHRoZSBvcmRlciBvZiB0aGUgcGVybWlzc2lvbnMgaXMgcGFydGljdWxhciBhbmQgdGhpcyBjbGFzcyBndWFyYW50ZWVzIGNvcnJlY3RuZXNzLlxuICovXG5jbGFzcyBDb250YWluZXJTQVNQZXJtaXNzaW9ucyB7XG4gICAgY29uc3RydWN0b3IoKSB7XG4gICAgICAgIC8qKlxuICAgICAgICAgKiBTcGVjaWZpZXMgUmVhZCBhY2Nlc3MgZ3JhbnRlZC5cbiAgICAgICAgICovXG4gICAgICAgIHRoaXMucmVhZCA9IGZhbHNlO1xuICAgICAgICAvKipcbiAgICAgICAgICogU3BlY2lmaWVzIEFkZCBhY2Nlc3MgZ3JhbnRlZC5cbiAgICAgICAgICovXG4gICAgICAgIHRoaXMuYWRkID0gZmFsc2U7XG4gICAgICAgIC8qKlxuICAgICAgICAgKiBTcGVjaWZpZXMgQ3JlYXRlIGFjY2VzcyBncmFudGVkLlxuICAgICAgICAgKi9cbiAgICAgICAgdGhpcy5jcmVhdGUgPSBmYWxzZTtcbiAgICAgICAgLyoqXG4gICAgICAgICAqIFNwZWNpZmllcyBXcml0ZSBhY2Nlc3MgZ3JhbnRlZC5cbiAgICAgICAgICovXG4gICAgICAgIHRoaXMud3JpdGUgPSBmYWxzZTtcbiAgICAgICAgLyoqXG4gICAgICAgICAqIFNwZWNpZmllcyBEZWxldGUgYWNjZXNzIGdyYW50ZWQuXG4gICAgICAgICAqL1xuICAgICAgICB0aGlzLmRlbGV0ZSA9IGZhbHNlO1xuICAgICAgICAvKipcbiAgICAgICAgICogU3BlY2lmaWVzIERlbGV0ZSB2ZXJzaW9uIGFjY2VzcyBncmFudGVkLlxuICAgICAgICAgKi9cbiAgICAgICAgdGhpcy5kZWxldGVWZXJzaW9uID0gZmFsc2U7XG4gICAgICAgIC8qKlxuICAgICAgICAgKiBTcGVjaWZpZXMgTGlzdCBhY2Nlc3MgZ3JhbnRlZC5cbiAgICAgICAgICovXG4gICAgICAgIHRoaXMubGlzdCA9IGZhbHNlO1xuICAgICAgICAvKipcbiAgICAgICAgICogU3BlY2ZpZXMgVGFnIGFjY2VzcyBncmFudGVkLlxuICAgICAgICAgKi9cbiAgICAgICAgdGhpcy50YWcgPSBmYWxzZTtcbiAgICAgICAgLyoqXG4gICAgICAgICAqIFNwZWNpZmllcyBNb3ZlIGFjY2VzcyBncmFudGVkLlxuICAgICAgICAgKi9cbiAgICAgICAgdGhpcy5tb3ZlID0gZmFsc2U7XG4gICAgICAgIC8qKlxuICAgICAgICAgKiBTcGVjaWZpZXMgRXhlY3V0ZSBhY2Nlc3MgZ3JhbnRlZC5cbiAgICAgICAgICovXG4gICAgICAgIHRoaXMuZXhlY3V0ZSA9IGZhbHNlO1xuICAgICAgICAvKipcbiAgICAgICAgICogU3BlY2lmaWVzIFNldEltbXV0YWJpbGl0eVBvbGljeSBhY2Nlc3MgZ3JhbnRlZC5cbiAgICAgICAgICovXG4gICAgICAgIHRoaXMuc2V0SW1tdXRhYmlsaXR5UG9saWN5ID0gZmFsc2U7XG4gICAgICAgIC8qKlxuICAgICAgICAgKiBTcGVjaWZpZXMgdGhhdCBQZXJtYW5lbnQgRGVsZXRlIGlzIHBlcm1pdHRlZC5cbiAgICAgICAgICovXG4gICAgICAgIHRoaXMucGVybWFuZW50RGVsZXRlID0gZmFsc2U7XG4gICAgICAgIC8qKlxuICAgICAgICAgKiBTcGVjaWZpZXMgdGhhdCBGaWx0ZXIgQmxvYnMgYnkgVGFncyBpcyBwZXJtaXR0ZWQuXG4gICAgICAgICAqL1xuICAgICAgICB0aGlzLmZpbHRlckJ5VGFncyA9IGZhbHNlO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBDcmVhdGVzIGFuIHtAbGluayBDb250YWluZXJTQVNQZXJtaXNzaW9uc30gZnJvbSB0aGUgc3BlY2lmaWVkIHBlcm1pc3Npb25zIHN0cmluZy4gVGhpcyBtZXRob2Qgd2lsbCB0aHJvdyBhblxuICAgICAqIEVycm9yIGlmIGl0IGVuY291bnRlcnMgYSBjaGFyYWN0ZXIgdGhhdCBkb2VzIG5vdCBjb3JyZXNwb25kIHRvIGEgdmFsaWQgcGVybWlzc2lvbi5cbiAgICAgKlxuICAgICAqIEBwYXJhbSBwZXJtaXNzaW9ucyAtXG4gICAgICovXG4gICAgc3RhdGljIHBhcnNlKHBlcm1pc3Npb25zKSB7XG4gICAgICAgIGNvbnN0IGNvbnRhaW5lclNBU1Blcm1pc3Npb25zID0gbmV3IENvbnRhaW5lclNBU1Blcm1pc3Npb25zKCk7XG4gICAgICAgIGZvciAoY29uc3QgY2hhciBvZiBwZXJtaXNzaW9ucykge1xuICAgICAgICAgICAgc3dpdGNoIChjaGFyKSB7XG4gICAgICAgICAgICAgICAgY2FzZSBcInJcIjpcbiAgICAgICAgICAgICAgICAgICAgY29udGFpbmVyU0FTUGVybWlzc2lvbnMucmVhZCA9IHRydWU7XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIGNhc2UgXCJhXCI6XG4gICAgICAgICAgICAgICAgICAgIGNvbnRhaW5lclNBU1Blcm1pc3Npb25zLmFkZCA9IHRydWU7XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIGNhc2UgXCJjXCI6XG4gICAgICAgICAgICAgICAgICAgIGNvbnRhaW5lclNBU1Blcm1pc3Npb25zLmNyZWF0ZSA9IHRydWU7XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIGNhc2UgXCJ3XCI6XG4gICAgICAgICAgICAgICAgICAgIGNvbnRhaW5lclNBU1Blcm1pc3Npb25zLndyaXRlID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgY2FzZSBcImRcIjpcbiAgICAgICAgICAgICAgICAgICAgY29udGFpbmVyU0FTUGVybWlzc2lvbnMuZGVsZXRlID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgY2FzZSBcImxcIjpcbiAgICAgICAgICAgICAgICAgICAgY29udGFpbmVyU0FTUGVybWlzc2lvbnMubGlzdCA9IHRydWU7XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIGNhc2UgXCJ0XCI6XG4gICAgICAgICAgICAgICAgICAgIGNvbnRhaW5lclNBU1Blcm1pc3Npb25zLnRhZyA9IHRydWU7XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIGNhc2UgXCJ4XCI6XG4gICAgICAgICAgICAgICAgICAgIGNvbnRhaW5lclNBU1Blcm1pc3Npb25zLmRlbGV0ZVZlcnNpb24gPSB0cnVlO1xuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICBjYXNlIFwibVwiOlxuICAgICAgICAgICAgICAgICAgICBjb250YWluZXJTQVNQZXJtaXNzaW9ucy5tb3ZlID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgY2FzZSBcImVcIjpcbiAgICAgICAgICAgICAgICAgICAgY29udGFpbmVyU0FTUGVybWlzc2lvbnMuZXhlY3V0ZSA9IHRydWU7XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIGNhc2UgXCJpXCI6XG4gICAgICAgICAgICAgICAgICAgIGNvbnRhaW5lclNBU1Blcm1pc3Npb25zLnNldEltbXV0YWJpbGl0eVBvbGljeSA9IHRydWU7XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIGNhc2UgXCJ5XCI6XG4gICAgICAgICAgICAgICAgICAgIGNvbnRhaW5lclNBU1Blcm1pc3Npb25zLnBlcm1hbmVudERlbGV0ZSA9IHRydWU7XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIGNhc2UgXCJmXCI6XG4gICAgICAgICAgICAgICAgICAgIGNvbnRhaW5lclNBU1Blcm1pc3Npb25zLmZpbHRlckJ5VGFncyA9IHRydWU7XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBSYW5nZUVycm9yKGBJbnZhbGlkIHBlcm1pc3Npb24gJHtjaGFyfWApO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiBjb250YWluZXJTQVNQZXJtaXNzaW9ucztcbiAgICB9XG4gICAgLyoqXG4gICAgICogQ3JlYXRlcyBhIHtAbGluayBDb250YWluZXJTQVNQZXJtaXNzaW9uc30gZnJvbSBhIHJhdyBvYmplY3Qgd2hpY2ggY29udGFpbnMgc2FtZSBrZXlzIGFzIGl0XG4gICAgICogYW5kIGJvb2xlYW4gdmFsdWVzIGZvciB0aGVtLlxuICAgICAqXG4gICAgICogQHBhcmFtIHBlcm1pc3Npb25MaWtlIC1cbiAgICAgKi9cbiAgICBzdGF0aWMgZnJvbShwZXJtaXNzaW9uTGlrZSkge1xuICAgICAgICBjb25zdCBjb250YWluZXJTQVNQZXJtaXNzaW9ucyA9IG5ldyBDb250YWluZXJTQVNQZXJtaXNzaW9ucygpO1xuICAgICAgICBpZiAocGVybWlzc2lvbkxpa2UucmVhZCkge1xuICAgICAgICAgICAgY29udGFpbmVyU0FTUGVybWlzc2lvbnMucmVhZCA9IHRydWU7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHBlcm1pc3Npb25MaWtlLmFkZCkge1xuICAgICAgICAgICAgY29udGFpbmVyU0FTUGVybWlzc2lvbnMuYWRkID0gdHJ1ZTtcbiAgICAgICAgfVxuICAgICAgICBpZiAocGVybWlzc2lvbkxpa2UuY3JlYXRlKSB7XG4gICAgICAgICAgICBjb250YWluZXJTQVNQZXJtaXNzaW9ucy5jcmVhdGUgPSB0cnVlO1xuICAgICAgICB9XG4gICAgICAgIGlmIChwZXJtaXNzaW9uTGlrZS53cml0ZSkge1xuICAgICAgICAgICAgY29udGFpbmVyU0FTUGVybWlzc2lvbnMud3JpdGUgPSB0cnVlO1xuICAgICAgICB9XG4gICAgICAgIGlmIChwZXJtaXNzaW9uTGlrZS5kZWxldGUpIHtcbiAgICAgICAgICAgIGNvbnRhaW5lclNBU1Blcm1pc3Npb25zLmRlbGV0ZSA9IHRydWU7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHBlcm1pc3Npb25MaWtlLmxpc3QpIHtcbiAgICAgICAgICAgIGNvbnRhaW5lclNBU1Blcm1pc3Npb25zLmxpc3QgPSB0cnVlO1xuICAgICAgICB9XG4gICAgICAgIGlmIChwZXJtaXNzaW9uTGlrZS5kZWxldGVWZXJzaW9uKSB7XG4gICAgICAgICAgICBjb250YWluZXJTQVNQZXJtaXNzaW9ucy5kZWxldGVWZXJzaW9uID0gdHJ1ZTtcbiAgICAgICAgfVxuICAgICAgICBpZiAocGVybWlzc2lvbkxpa2UudGFnKSB7XG4gICAgICAgICAgICBjb250YWluZXJTQVNQZXJtaXNzaW9ucy50YWcgPSB0cnVlO1xuICAgICAgICB9XG4gICAgICAgIGlmIChwZXJtaXNzaW9uTGlrZS5tb3ZlKSB7XG4gICAgICAgICAgICBjb250YWluZXJTQVNQZXJtaXNzaW9ucy5tb3ZlID0gdHJ1ZTtcbiAgICAgICAgfVxuICAgICAgICBpZiAocGVybWlzc2lvbkxpa2UuZXhlY3V0ZSkge1xuICAgICAgICAgICAgY29udGFpbmVyU0FTUGVybWlzc2lvbnMuZXhlY3V0ZSA9IHRydWU7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHBlcm1pc3Npb25MaWtlLnNldEltbXV0YWJpbGl0eVBvbGljeSkge1xuICAgICAgICAgICAgY29udGFpbmVyU0FTUGVybWlzc2lvbnMuc2V0SW1tdXRhYmlsaXR5UG9saWN5ID0gdHJ1ZTtcbiAgICAgICAgfVxuICAgICAgICBpZiAocGVybWlzc2lvbkxpa2UucGVybWFuZW50RGVsZXRlKSB7XG4gICAgICAgICAgICBjb250YWluZXJTQVNQZXJtaXNzaW9ucy5wZXJtYW5lbnREZWxldGUgPSB0cnVlO1xuICAgICAgICB9XG4gICAgICAgIGlmIChwZXJtaXNzaW9uTGlrZS5maWx0ZXJCeVRhZ3MpIHtcbiAgICAgICAgICAgIGNvbnRhaW5lclNBU1Blcm1pc3Npb25zLmZpbHRlckJ5VGFncyA9IHRydWU7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGNvbnRhaW5lclNBU1Blcm1pc3Npb25zO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBDb252ZXJ0cyB0aGUgZ2l2ZW4gcGVybWlzc2lvbnMgdG8gYSBzdHJpbmcuIFVzaW5nIHRoaXMgbWV0aG9kIHdpbGwgZ3VhcmFudGVlIHRoZSBwZXJtaXNzaW9ucyBhcmUgaW4gYW5cbiAgICAgKiBvcmRlciBhY2NlcHRlZCBieSB0aGUgc2VydmljZS5cbiAgICAgKlxuICAgICAqIFRoZSBvcmRlciBvZiB0aGUgY2hhcmFjdGVycyBzaG91bGQgYmUgYXMgc3BlY2lmaWVkIGhlcmUgdG8gZW5zdXJlIGNvcnJlY3RuZXNzLlxuICAgICAqIEBzZWUgaHR0cHM6Ly9kb2NzLm1pY3Jvc29mdC5jb20vZW4tdXMvcmVzdC9hcGkvc3RvcmFnZXNlcnZpY2VzL2NvbnN0cnVjdGluZy1hLXNlcnZpY2Utc2FzXG4gICAgICpcbiAgICAgKi9cbiAgICB0b1N0cmluZygpIHtcbiAgICAgICAgY29uc3QgcGVybWlzc2lvbnMgPSBbXTtcbiAgICAgICAgaWYgKHRoaXMucmVhZCkge1xuICAgICAgICAgICAgcGVybWlzc2lvbnMucHVzaChcInJcIik7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHRoaXMuYWRkKSB7XG4gICAgICAgICAgICBwZXJtaXNzaW9ucy5wdXNoKFwiYVwiKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAodGhpcy5jcmVhdGUpIHtcbiAgICAgICAgICAgIHBlcm1pc3Npb25zLnB1c2goXCJjXCIpO1xuICAgICAgICB9XG4gICAgICAgIGlmICh0aGlzLndyaXRlKSB7XG4gICAgICAgICAgICBwZXJtaXNzaW9ucy5wdXNoKFwid1wiKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAodGhpcy5kZWxldGUpIHtcbiAgICAgICAgICAgIHBlcm1pc3Npb25zLnB1c2goXCJkXCIpO1xuICAgICAgICB9XG4gICAgICAgIGlmICh0aGlzLmRlbGV0ZVZlcnNpb24pIHtcbiAgICAgICAgICAgIHBlcm1pc3Npb25zLnB1c2goXCJ4XCIpO1xuICAgICAgICB9XG4gICAgICAgIGlmICh0aGlzLmxpc3QpIHtcbiAgICAgICAgICAgIHBlcm1pc3Npb25zLnB1c2goXCJsXCIpO1xuICAgICAgICB9XG4gICAgICAgIGlmICh0aGlzLnRhZykge1xuICAgICAgICAgICAgcGVybWlzc2lvbnMucHVzaChcInRcIik7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHRoaXMubW92ZSkge1xuICAgICAgICAgICAgcGVybWlzc2lvbnMucHVzaChcIm1cIik7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHRoaXMuZXhlY3V0ZSkge1xuICAgICAgICAgICAgcGVybWlzc2lvbnMucHVzaChcImVcIik7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHRoaXMuc2V0SW1tdXRhYmlsaXR5UG9saWN5KSB7XG4gICAgICAgICAgICBwZXJtaXNzaW9ucy5wdXNoKFwiaVwiKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAodGhpcy5wZXJtYW5lbnREZWxldGUpIHtcbiAgICAgICAgICAgIHBlcm1pc3Npb25zLnB1c2goXCJ5XCIpO1xuICAgICAgICB9XG4gICAgICAgIGlmICh0aGlzLmZpbHRlckJ5VGFncykge1xuICAgICAgICAgICAgcGVybWlzc2lvbnMucHVzaChcImZcIik7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHBlcm1pc3Npb25zLmpvaW4oXCJcIik7XG4gICAgfVxufVxuXG4vLyBDb3B5cmlnaHQgKGMpIE1pY3Jvc29mdCBDb3Jwb3JhdGlvbi5cbi8vIExpY2Vuc2VkIHVuZGVyIHRoZSBNSVQgTGljZW5zZS5cbi8qKlxuICogT05MWSBBVkFJTEFCTEUgSU4gTk9ERS5KUyBSVU5USU1FLlxuICpcbiAqIFVzZXJEZWxlZ2F0aW9uS2V5Q3JlZGVudGlhbCBpcyBvbmx5IHVzZWQgZm9yIGdlbmVyYXRpb24gb2YgdXNlciBkZWxlZ2F0aW9uIFNBUy5cbiAqIEBzZWUgaHR0cHM6Ly9kb2NzLm1pY3Jvc29mdC5jb20vZW4tdXMvcmVzdC9hcGkvc3RvcmFnZXNlcnZpY2VzL2NyZWF0ZS11c2VyLWRlbGVnYXRpb24tc2FzXG4gKi9cbmNsYXNzIFVzZXJEZWxlZ2F0aW9uS2V5Q3JlZGVudGlhbCB7XG4gICAgLyoqXG4gICAgICogQ3JlYXRlcyBhbiBpbnN0YW5jZSBvZiBVc2VyRGVsZWdhdGlvbktleUNyZWRlbnRpYWwuXG4gICAgICogQHBhcmFtIGFjY291bnROYW1lIC1cbiAgICAgKiBAcGFyYW0gdXNlckRlbGVnYXRpb25LZXkgLVxuICAgICAqL1xuICAgIGNvbnN0cnVjdG9yKGFjY291bnROYW1lLCB1c2VyRGVsZWdhdGlvbktleSkge1xuICAgICAgICB0aGlzLmFjY291bnROYW1lID0gYWNjb3VudE5hbWU7XG4gICAgICAgIHRoaXMudXNlckRlbGVnYXRpb25LZXkgPSB1c2VyRGVsZWdhdGlvbktleTtcbiAgICAgICAgdGhpcy5rZXkgPSBCdWZmZXIuZnJvbSh1c2VyRGVsZWdhdGlvbktleS52YWx1ZSwgXCJiYXNlNjRcIik7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIEdlbmVyYXRlcyBhIGhhc2ggc2lnbmF0dXJlIGZvciBhbiBIVFRQIHJlcXVlc3Qgb3IgZm9yIGEgU0FTLlxuICAgICAqXG4gICAgICogQHBhcmFtIHN0cmluZ1RvU2lnbiAtXG4gICAgICovXG4gICAgY29tcHV0ZUhNQUNTSEEyNTYoc3RyaW5nVG9TaWduKSB7XG4gICAgICAgIC8vIGNvbnNvbGUubG9nKGBzdHJpbmdUb1NpZ246ICR7SlNPTi5zdHJpbmdpZnkoc3RyaW5nVG9TaWduKX1gKTtcbiAgICAgICAgcmV0dXJuIGNyeXB0by5jcmVhdGVIbWFjKFwic2hhMjU2XCIsIHRoaXMua2V5KS51cGRhdGUoc3RyaW5nVG9TaWduLCBcInV0ZjhcIikuZGlnZXN0KFwiYmFzZTY0XCIpO1xuICAgIH1cbn1cblxuLy8gQ29weXJpZ2h0IChjKSBNaWNyb3NvZnQgQ29ycG9yYXRpb24uXG4vLyBMaWNlbnNlZCB1bmRlciB0aGUgTUlUIExpY2Vuc2UuXG4vKipcbiAqIEdlbmVyYXRlIFNhc0lQUmFuZ2UgZm9ybWF0IHN0cmluZy4gRm9yIGV4YW1wbGU6XG4gKlxuICogXCI4LjguOC44XCIgb3IgXCIxLjEuMS4xLTI1NS4yNTUuMjU1LjI1NVwiXG4gKlxuICogQHBhcmFtIGlwUmFuZ2UgLVxuICovXG5mdW5jdGlvbiBpcFJhbmdlVG9TdHJpbmcoaXBSYW5nZSkge1xuICAgIHJldHVybiBpcFJhbmdlLmVuZCA/IGAke2lwUmFuZ2Uuc3RhcnR9LSR7aXBSYW5nZS5lbmR9YCA6IGlwUmFuZ2Uuc3RhcnQ7XG59XG5cbi8vIENvcHlyaWdodCAoYykgTWljcm9zb2Z0IENvcnBvcmF0aW9uLlxuLy8gTGljZW5zZWQgdW5kZXIgdGhlIE1JVCBMaWNlbnNlLlxuLyoqXG4gKiBQcm90b2NvbHMgZm9yIGdlbmVyYXRlZCBTQVMuXG4gKi9cbmV4cG9ydHMuU0FTUHJvdG9jb2wgPSB2b2lkIDA7XG4oZnVuY3Rpb24gKFNBU1Byb3RvY29sKSB7XG4gICAgLyoqXG4gICAgICogUHJvdG9jb2wgdGhhdCBhbGxvd3MgSFRUUFMgb25seVxuICAgICAqL1xuICAgIFNBU1Byb3RvY29sW1wiSHR0cHNcIl0gPSBcImh0dHBzXCI7XG4gICAgLyoqXG4gICAgICogUHJvdG9jb2wgdGhhdCBhbGxvd3MgYm90aCBIVFRQUyBhbmQgSFRUUFxuICAgICAqL1xuICAgIFNBU1Byb3RvY29sW1wiSHR0cHNBbmRIdHRwXCJdID0gXCJodHRwcyxodHRwXCI7XG59KShleHBvcnRzLlNBU1Byb3RvY29sIHx8IChleHBvcnRzLlNBU1Byb3RvY29sID0ge30pKTtcbi8qKlxuICogUmVwcmVzZW50cyB0aGUgY29tcG9uZW50cyB0aGF0IG1ha2UgdXAgYW4gQXp1cmUgU3RvcmFnZSBTQVMnIHF1ZXJ5IHBhcmFtZXRlcnMuIFRoaXMgdHlwZSBpcyBub3QgY29uc3RydWN0ZWQgZGlyZWN0bHlcbiAqIGJ5IHRoZSB1c2VyOyBpdCBpcyBvbmx5IGdlbmVyYXRlZCBieSB0aGUge0BsaW5rIEFjY291bnRTQVNTaWduYXR1cmVWYWx1ZXN9IGFuZCB7QGxpbmsgQmxvYlNBU1NpZ25hdHVyZVZhbHVlc31cbiAqIHR5cGVzLiBPbmNlIGdlbmVyYXRlZCwgaXQgY2FuIGJlIGVuY29kZWQgaW50byBhIHtAbGluayBTdHJpbmd9IGFuZCBhcHBlbmRlZCB0byBhIFVSTCBkaXJlY3RseSAodGhvdWdoIGNhdXRpb24gc2hvdWxkXG4gKiBiZSB0YWtlbiBoZXJlIGluIGNhc2UgdGhlcmUgYXJlIGV4aXN0aW5nIHF1ZXJ5IHBhcmFtZXRlcnMsIHdoaWNoIG1pZ2h0IGFmZmVjdCB0aGUgYXBwcm9wcmlhdGUgbWVhbnMgb2YgYXBwZW5kaW5nXG4gKiB0aGVzZSBxdWVyeSBwYXJhbWV0ZXJzKS5cbiAqXG4gKiBOT1RFOiBJbnN0YW5jZXMgb2YgdGhpcyBjbGFzcyBhcmUgaW1tdXRhYmxlLlxuICovXG5jbGFzcyBTQVNRdWVyeVBhcmFtZXRlcnMge1xuICAgIC8qKlxuICAgICAqIE9wdGlvbmFsLiBJUCByYW5nZSBhbGxvd2VkIGZvciB0aGlzIFNBUy5cbiAgICAgKlxuICAgICAqIEByZWFkb25seVxuICAgICAqL1xuICAgIGdldCBpcFJhbmdlKCkge1xuICAgICAgICBpZiAodGhpcy5pcFJhbmdlSW5uZXIpIHtcbiAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgZW5kOiB0aGlzLmlwUmFuZ2VJbm5lci5lbmQsXG4gICAgICAgICAgICAgICAgc3RhcnQ6IHRoaXMuaXBSYW5nZUlubmVyLnN0YXJ0LFxuICAgICAgICAgICAgfTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gdW5kZWZpbmVkO1xuICAgIH1cbiAgICBjb25zdHJ1Y3Rvcih2ZXJzaW9uLCBzaWduYXR1cmUsIHBlcm1pc3Npb25zT3JPcHRpb25zLCBzZXJ2aWNlcywgcmVzb3VyY2VUeXBlcywgcHJvdG9jb2wsIHN0YXJ0c09uLCBleHBpcmVzT24sIGlwUmFuZ2UsIGlkZW50aWZpZXIsIHJlc291cmNlLCBjYWNoZUNvbnRyb2wsIGNvbnRlbnREaXNwb3NpdGlvbiwgY29udGVudEVuY29kaW5nLCBjb250ZW50TGFuZ3VhZ2UsIGNvbnRlbnRUeXBlLCB1c2VyRGVsZWdhdGlvbktleSwgcHJlYXV0aG9yaXplZEFnZW50T2JqZWN0SWQsIGNvcnJlbGF0aW9uSWQsIGVuY3J5cHRpb25TY29wZSkge1xuICAgICAgICB0aGlzLnZlcnNpb24gPSB2ZXJzaW9uO1xuICAgICAgICB0aGlzLnNpZ25hdHVyZSA9IHNpZ25hdHVyZTtcbiAgICAgICAgaWYgKHBlcm1pc3Npb25zT3JPcHRpb25zICE9PSB1bmRlZmluZWQgJiYgdHlwZW9mIHBlcm1pc3Npb25zT3JPcHRpb25zICE9PSBcInN0cmluZ1wiKSB7XG4gICAgICAgICAgICAvLyBTQVNRdWVyeVBhcmFtZXRlcnNPcHRpb25zXG4gICAgICAgICAgICB0aGlzLnBlcm1pc3Npb25zID0gcGVybWlzc2lvbnNPck9wdGlvbnMucGVybWlzc2lvbnM7XG4gICAgICAgICAgICB0aGlzLnNlcnZpY2VzID0gcGVybWlzc2lvbnNPck9wdGlvbnMuc2VydmljZXM7XG4gICAgICAgICAgICB0aGlzLnJlc291cmNlVHlwZXMgPSBwZXJtaXNzaW9uc09yT3B0aW9ucy5yZXNvdXJjZVR5cGVzO1xuICAgICAgICAgICAgdGhpcy5wcm90b2NvbCA9IHBlcm1pc3Npb25zT3JPcHRpb25zLnByb3RvY29sO1xuICAgICAgICAgICAgdGhpcy5zdGFydHNPbiA9IHBlcm1pc3Npb25zT3JPcHRpb25zLnN0YXJ0c09uO1xuICAgICAgICAgICAgdGhpcy5leHBpcmVzT24gPSBwZXJtaXNzaW9uc09yT3B0aW9ucy5leHBpcmVzT247XG4gICAgICAgICAgICB0aGlzLmlwUmFuZ2VJbm5lciA9IHBlcm1pc3Npb25zT3JPcHRpb25zLmlwUmFuZ2U7XG4gICAgICAgICAgICB0aGlzLmlkZW50aWZpZXIgPSBwZXJtaXNzaW9uc09yT3B0aW9ucy5pZGVudGlmaWVyO1xuICAgICAgICAgICAgdGhpcy5lbmNyeXB0aW9uU2NvcGUgPSBwZXJtaXNzaW9uc09yT3B0aW9ucy5lbmNyeXB0aW9uU2NvcGU7XG4gICAgICAgICAgICB0aGlzLnJlc291cmNlID0gcGVybWlzc2lvbnNPck9wdGlvbnMucmVzb3VyY2U7XG4gICAgICAgICAgICB0aGlzLmNhY2hlQ29udHJvbCA9IHBlcm1pc3Npb25zT3JPcHRpb25zLmNhY2hlQ29udHJvbDtcbiAgICAgICAgICAgIHRoaXMuY29udGVudERpc3Bvc2l0aW9uID0gcGVybWlzc2lvbnNPck9wdGlvbnMuY29udGVudERpc3Bvc2l0aW9uO1xuICAgICAgICAgICAgdGhpcy5jb250ZW50RW5jb2RpbmcgPSBwZXJtaXNzaW9uc09yT3B0aW9ucy5jb250ZW50RW5jb2Rpbmc7XG4gICAgICAgICAgICB0aGlzLmNvbnRlbnRMYW5ndWFnZSA9IHBlcm1pc3Npb25zT3JPcHRpb25zLmNvbnRlbnRMYW5ndWFnZTtcbiAgICAgICAgICAgIHRoaXMuY29udGVudFR5cGUgPSBwZXJtaXNzaW9uc09yT3B0aW9ucy5jb250ZW50VHlwZTtcbiAgICAgICAgICAgIGlmIChwZXJtaXNzaW9uc09yT3B0aW9ucy51c2VyRGVsZWdhdGlvbktleSkge1xuICAgICAgICAgICAgICAgIHRoaXMuc2lnbmVkT2lkID0gcGVybWlzc2lvbnNPck9wdGlvbnMudXNlckRlbGVnYXRpb25LZXkuc2lnbmVkT2JqZWN0SWQ7XG4gICAgICAgICAgICAgICAgdGhpcy5zaWduZWRUZW5hbnRJZCA9IHBlcm1pc3Npb25zT3JPcHRpb25zLnVzZXJEZWxlZ2F0aW9uS2V5LnNpZ25lZFRlbmFudElkO1xuICAgICAgICAgICAgICAgIHRoaXMuc2lnbmVkU3RhcnRzT24gPSBwZXJtaXNzaW9uc09yT3B0aW9ucy51c2VyRGVsZWdhdGlvbktleS5zaWduZWRTdGFydHNPbjtcbiAgICAgICAgICAgICAgICB0aGlzLnNpZ25lZEV4cGlyZXNPbiA9IHBlcm1pc3Npb25zT3JPcHRpb25zLnVzZXJEZWxlZ2F0aW9uS2V5LnNpZ25lZEV4cGlyZXNPbjtcbiAgICAgICAgICAgICAgICB0aGlzLnNpZ25lZFNlcnZpY2UgPSBwZXJtaXNzaW9uc09yT3B0aW9ucy51c2VyRGVsZWdhdGlvbktleS5zaWduZWRTZXJ2aWNlO1xuICAgICAgICAgICAgICAgIHRoaXMuc2lnbmVkVmVyc2lvbiA9IHBlcm1pc3Npb25zT3JPcHRpb25zLnVzZXJEZWxlZ2F0aW9uS2V5LnNpZ25lZFZlcnNpb247XG4gICAgICAgICAgICAgICAgdGhpcy5wcmVhdXRob3JpemVkQWdlbnRPYmplY3RJZCA9IHBlcm1pc3Npb25zT3JPcHRpb25zLnByZWF1dGhvcml6ZWRBZ2VudE9iamVjdElkO1xuICAgICAgICAgICAgICAgIHRoaXMuY29ycmVsYXRpb25JZCA9IHBlcm1pc3Npb25zT3JPcHRpb25zLmNvcnJlbGF0aW9uSWQ7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICB0aGlzLnNlcnZpY2VzID0gc2VydmljZXM7XG4gICAgICAgICAgICB0aGlzLnJlc291cmNlVHlwZXMgPSByZXNvdXJjZVR5cGVzO1xuICAgICAgICAgICAgdGhpcy5leHBpcmVzT24gPSBleHBpcmVzT247XG4gICAgICAgICAgICB0aGlzLnBlcm1pc3Npb25zID0gcGVybWlzc2lvbnNPck9wdGlvbnM7XG4gICAgICAgICAgICB0aGlzLnByb3RvY29sID0gcHJvdG9jb2w7XG4gICAgICAgICAgICB0aGlzLnN0YXJ0c09uID0gc3RhcnRzT247XG4gICAgICAgICAgICB0aGlzLmlwUmFuZ2VJbm5lciA9IGlwUmFuZ2U7XG4gICAgICAgICAgICB0aGlzLmVuY3J5cHRpb25TY29wZSA9IGVuY3J5cHRpb25TY29wZTtcbiAgICAgICAgICAgIHRoaXMuaWRlbnRpZmllciA9IGlkZW50aWZpZXI7XG4gICAgICAgICAgICB0aGlzLnJlc291cmNlID0gcmVzb3VyY2U7XG4gICAgICAgICAgICB0aGlzLmNhY2hlQ29udHJvbCA9IGNhY2hlQ29udHJvbDtcbiAgICAgICAgICAgIHRoaXMuY29udGVudERpc3Bvc2l0aW9uID0gY29udGVudERpc3Bvc2l0aW9uO1xuICAgICAgICAgICAgdGhpcy5jb250ZW50RW5jb2RpbmcgPSBjb250ZW50RW5jb2Rpbmc7XG4gICAgICAgICAgICB0aGlzLmNvbnRlbnRMYW5ndWFnZSA9IGNvbnRlbnRMYW5ndWFnZTtcbiAgICAgICAgICAgIHRoaXMuY29udGVudFR5cGUgPSBjb250ZW50VHlwZTtcbiAgICAgICAgICAgIGlmICh1c2VyRGVsZWdhdGlvbktleSkge1xuICAgICAgICAgICAgICAgIHRoaXMuc2lnbmVkT2lkID0gdXNlckRlbGVnYXRpb25LZXkuc2lnbmVkT2JqZWN0SWQ7XG4gICAgICAgICAgICAgICAgdGhpcy5zaWduZWRUZW5hbnRJZCA9IHVzZXJEZWxlZ2F0aW9uS2V5LnNpZ25lZFRlbmFudElkO1xuICAgICAgICAgICAgICAgIHRoaXMuc2lnbmVkU3RhcnRzT24gPSB1c2VyRGVsZWdhdGlvbktleS5zaWduZWRTdGFydHNPbjtcbiAgICAgICAgICAgICAgICB0aGlzLnNpZ25lZEV4cGlyZXNPbiA9IHVzZXJEZWxlZ2F0aW9uS2V5LnNpZ25lZEV4cGlyZXNPbjtcbiAgICAgICAgICAgICAgICB0aGlzLnNpZ25lZFNlcnZpY2UgPSB1c2VyRGVsZWdhdGlvbktleS5zaWduZWRTZXJ2aWNlO1xuICAgICAgICAgICAgICAgIHRoaXMuc2lnbmVkVmVyc2lvbiA9IHVzZXJEZWxlZ2F0aW9uS2V5LnNpZ25lZFZlcnNpb247XG4gICAgICAgICAgICAgICAgdGhpcy5wcmVhdXRob3JpemVkQWdlbnRPYmplY3RJZCA9IHByZWF1dGhvcml6ZWRBZ2VudE9iamVjdElkO1xuICAgICAgICAgICAgICAgIHRoaXMuY29ycmVsYXRpb25JZCA9IGNvcnJlbGF0aW9uSWQ7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG4gICAgLyoqXG4gICAgICogRW5jb2RlcyBhbGwgU0FTIHF1ZXJ5IHBhcmFtZXRlcnMgaW50byBhIHN0cmluZyB0aGF0IGNhbiBiZSBhcHBlbmRlZCB0byBhIFVSTC5cbiAgICAgKlxuICAgICAqL1xuICAgIHRvU3RyaW5nKCkge1xuICAgICAgICBjb25zdCBwYXJhbXMgPSBbXG4gICAgICAgICAgICBcInN2XCIsXG4gICAgICAgICAgICBcInNzXCIsXG4gICAgICAgICAgICBcInNydFwiLFxuICAgICAgICAgICAgXCJzcHJcIixcbiAgICAgICAgICAgIFwic3RcIixcbiAgICAgICAgICAgIFwic2VcIixcbiAgICAgICAgICAgIFwic2lwXCIsXG4gICAgICAgICAgICBcInNpXCIsXG4gICAgICAgICAgICBcInNlc1wiLFxuICAgICAgICAgICAgXCJza29pZFwiLCAvLyBTaWduZWQgb2JqZWN0IElEXG4gICAgICAgICAgICBcInNrdGlkXCIsIC8vIFNpZ25lZCB0ZW5hbnQgSURcbiAgICAgICAgICAgIFwic2t0XCIsIC8vIFNpZ25lZCBrZXkgc3RhcnQgdGltZVxuICAgICAgICAgICAgXCJza2VcIiwgLy8gU2lnbmVkIGtleSBleHBpcnkgdGltZVxuICAgICAgICAgICAgXCJza3NcIiwgLy8gU2lnbmVkIGtleSBzZXJ2aWNlXG4gICAgICAgICAgICBcInNrdlwiLCAvLyBTaWduZWQga2V5IHZlcnNpb25cbiAgICAgICAgICAgIFwic3JcIixcbiAgICAgICAgICAgIFwic3BcIixcbiAgICAgICAgICAgIFwic2lnXCIsXG4gICAgICAgICAgICBcInJzY2NcIixcbiAgICAgICAgICAgIFwicnNjZFwiLFxuICAgICAgICAgICAgXCJyc2NlXCIsXG4gICAgICAgICAgICBcInJzY2xcIixcbiAgICAgICAgICAgIFwicnNjdFwiLFxuICAgICAgICAgICAgXCJzYW9pZFwiLFxuICAgICAgICAgICAgXCJzY2lkXCIsXG4gICAgICAgIF07XG4gICAgICAgIGNvbnN0IHF1ZXJpZXMgPSBbXTtcbiAgICAgICAgZm9yIChjb25zdCBwYXJhbSBvZiBwYXJhbXMpIHtcbiAgICAgICAgICAgIHN3aXRjaCAocGFyYW0pIHtcbiAgICAgICAgICAgICAgICBjYXNlIFwic3ZcIjpcbiAgICAgICAgICAgICAgICAgICAgdGhpcy50cnlBcHBlbmRRdWVyeVBhcmFtZXRlcihxdWVyaWVzLCBwYXJhbSwgdGhpcy52ZXJzaW9uKTtcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgY2FzZSBcInNzXCI6XG4gICAgICAgICAgICAgICAgICAgIHRoaXMudHJ5QXBwZW5kUXVlcnlQYXJhbWV0ZXIocXVlcmllcywgcGFyYW0sIHRoaXMuc2VydmljZXMpO1xuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICBjYXNlIFwic3J0XCI6XG4gICAgICAgICAgICAgICAgICAgIHRoaXMudHJ5QXBwZW5kUXVlcnlQYXJhbWV0ZXIocXVlcmllcywgcGFyYW0sIHRoaXMucmVzb3VyY2VUeXBlcyk7XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIGNhc2UgXCJzcHJcIjpcbiAgICAgICAgICAgICAgICAgICAgdGhpcy50cnlBcHBlbmRRdWVyeVBhcmFtZXRlcihxdWVyaWVzLCBwYXJhbSwgdGhpcy5wcm90b2NvbCk7XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIGNhc2UgXCJzdFwiOlxuICAgICAgICAgICAgICAgICAgICB0aGlzLnRyeUFwcGVuZFF1ZXJ5UGFyYW1ldGVyKHF1ZXJpZXMsIHBhcmFtLCB0aGlzLnN0YXJ0c09uID8gdHJ1bmNhdGVkSVNPODA2MURhdGUodGhpcy5zdGFydHNPbiwgZmFsc2UpIDogdW5kZWZpbmVkKTtcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgY2FzZSBcInNlXCI6XG4gICAgICAgICAgICAgICAgICAgIHRoaXMudHJ5QXBwZW5kUXVlcnlQYXJhbWV0ZXIocXVlcmllcywgcGFyYW0sIHRoaXMuZXhwaXJlc09uID8gdHJ1bmNhdGVkSVNPODA2MURhdGUodGhpcy5leHBpcmVzT24sIGZhbHNlKSA6IHVuZGVmaW5lZCk7XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIGNhc2UgXCJzaXBcIjpcbiAgICAgICAgICAgICAgICAgICAgdGhpcy50cnlBcHBlbmRRdWVyeVBhcmFtZXRlcihxdWVyaWVzLCBwYXJhbSwgdGhpcy5pcFJhbmdlID8gaXBSYW5nZVRvU3RyaW5nKHRoaXMuaXBSYW5nZSkgOiB1bmRlZmluZWQpO1xuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICBjYXNlIFwic2lcIjpcbiAgICAgICAgICAgICAgICAgICAgdGhpcy50cnlBcHBlbmRRdWVyeVBhcmFtZXRlcihxdWVyaWVzLCBwYXJhbSwgdGhpcy5pZGVudGlmaWVyKTtcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgY2FzZSBcInNlc1wiOlxuICAgICAgICAgICAgICAgICAgICB0aGlzLnRyeUFwcGVuZFF1ZXJ5UGFyYW1ldGVyKHF1ZXJpZXMsIHBhcmFtLCB0aGlzLmVuY3J5cHRpb25TY29wZSk7XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIGNhc2UgXCJza29pZFwiOiAvLyBTaWduZWQgb2JqZWN0IElEXG4gICAgICAgICAgICAgICAgICAgIHRoaXMudHJ5QXBwZW5kUXVlcnlQYXJhbWV0ZXIocXVlcmllcywgcGFyYW0sIHRoaXMuc2lnbmVkT2lkKTtcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgY2FzZSBcInNrdGlkXCI6IC8vIFNpZ25lZCB0ZW5hbnQgSURcbiAgICAgICAgICAgICAgICAgICAgdGhpcy50cnlBcHBlbmRRdWVyeVBhcmFtZXRlcihxdWVyaWVzLCBwYXJhbSwgdGhpcy5zaWduZWRUZW5hbnRJZCk7XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIGNhc2UgXCJza3RcIjogLy8gU2lnbmVkIGtleSBzdGFydCB0aW1lXG4gICAgICAgICAgICAgICAgICAgIHRoaXMudHJ5QXBwZW5kUXVlcnlQYXJhbWV0ZXIocXVlcmllcywgcGFyYW0sIHRoaXMuc2lnbmVkU3RhcnRzT24gPyB0cnVuY2F0ZWRJU084MDYxRGF0ZSh0aGlzLnNpZ25lZFN0YXJ0c09uLCBmYWxzZSkgOiB1bmRlZmluZWQpO1xuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICBjYXNlIFwic2tlXCI6IC8vIFNpZ25lZCBrZXkgZXhwaXJ5IHRpbWVcbiAgICAgICAgICAgICAgICAgICAgdGhpcy50cnlBcHBlbmRRdWVyeVBhcmFtZXRlcihxdWVyaWVzLCBwYXJhbSwgdGhpcy5zaWduZWRFeHBpcmVzT24gPyB0cnVuY2F0ZWRJU084MDYxRGF0ZSh0aGlzLnNpZ25lZEV4cGlyZXNPbiwgZmFsc2UpIDogdW5kZWZpbmVkKTtcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgY2FzZSBcInNrc1wiOiAvLyBTaWduZWQga2V5IHNlcnZpY2VcbiAgICAgICAgICAgICAgICAgICAgdGhpcy50cnlBcHBlbmRRdWVyeVBhcmFtZXRlcihxdWVyaWVzLCBwYXJhbSwgdGhpcy5zaWduZWRTZXJ2aWNlKTtcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgY2FzZSBcInNrdlwiOiAvLyBTaWduZWQga2V5IHZlcnNpb25cbiAgICAgICAgICAgICAgICAgICAgdGhpcy50cnlBcHBlbmRRdWVyeVBhcmFtZXRlcihxdWVyaWVzLCBwYXJhbSwgdGhpcy5zaWduZWRWZXJzaW9uKTtcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgY2FzZSBcInNyXCI6XG4gICAgICAgICAgICAgICAgICAgIHRoaXMudHJ5QXBwZW5kUXVlcnlQYXJhbWV0ZXIocXVlcmllcywgcGFyYW0sIHRoaXMucmVzb3VyY2UpO1xuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICBjYXNlIFwic3BcIjpcbiAgICAgICAgICAgICAgICAgICAgdGhpcy50cnlBcHBlbmRRdWVyeVBhcmFtZXRlcihxdWVyaWVzLCBwYXJhbSwgdGhpcy5wZXJtaXNzaW9ucyk7XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIGNhc2UgXCJzaWdcIjpcbiAgICAgICAgICAgICAgICAgICAgdGhpcy50cnlBcHBlbmRRdWVyeVBhcmFtZXRlcihxdWVyaWVzLCBwYXJhbSwgdGhpcy5zaWduYXR1cmUpO1xuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICBjYXNlIFwicnNjY1wiOlxuICAgICAgICAgICAgICAgICAgICB0aGlzLnRyeUFwcGVuZFF1ZXJ5UGFyYW1ldGVyKHF1ZXJpZXMsIHBhcmFtLCB0aGlzLmNhY2hlQ29udHJvbCk7XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIGNhc2UgXCJyc2NkXCI6XG4gICAgICAgICAgICAgICAgICAgIHRoaXMudHJ5QXBwZW5kUXVlcnlQYXJhbWV0ZXIocXVlcmllcywgcGFyYW0sIHRoaXMuY29udGVudERpc3Bvc2l0aW9uKTtcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgY2FzZSBcInJzY2VcIjpcbiAgICAgICAgICAgICAgICAgICAgdGhpcy50cnlBcHBlbmRRdWVyeVBhcmFtZXRlcihxdWVyaWVzLCBwYXJhbSwgdGhpcy5jb250ZW50RW5jb2RpbmcpO1xuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICBjYXNlIFwicnNjbFwiOlxuICAgICAgICAgICAgICAgICAgICB0aGlzLnRyeUFwcGVuZFF1ZXJ5UGFyYW1ldGVyKHF1ZXJpZXMsIHBhcmFtLCB0aGlzLmNvbnRlbnRMYW5ndWFnZSk7XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIGNhc2UgXCJyc2N0XCI6XG4gICAgICAgICAgICAgICAgICAgIHRoaXMudHJ5QXBwZW5kUXVlcnlQYXJhbWV0ZXIocXVlcmllcywgcGFyYW0sIHRoaXMuY29udGVudFR5cGUpO1xuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICBjYXNlIFwic2FvaWRcIjpcbiAgICAgICAgICAgICAgICAgICAgdGhpcy50cnlBcHBlbmRRdWVyeVBhcmFtZXRlcihxdWVyaWVzLCBwYXJhbSwgdGhpcy5wcmVhdXRob3JpemVkQWdlbnRPYmplY3RJZCk7XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIGNhc2UgXCJzY2lkXCI6XG4gICAgICAgICAgICAgICAgICAgIHRoaXMudHJ5QXBwZW5kUXVlcnlQYXJhbWV0ZXIocXVlcmllcywgcGFyYW0sIHRoaXMuY29ycmVsYXRpb25JZCk7XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiBxdWVyaWVzLmpvaW4oXCImXCIpO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBBIHByaXZhdGUgaGVscGVyIG1ldGhvZCB1c2VkIHRvIGZpbHRlciBhbmQgYXBwZW5kIHF1ZXJ5IGtleS92YWx1ZSBwYWlycyBpbnRvIGFuIGFycmF5LlxuICAgICAqXG4gICAgICogQHBhcmFtIHF1ZXJpZXMgLVxuICAgICAqIEBwYXJhbSBrZXkgLVxuICAgICAqIEBwYXJhbSB2YWx1ZSAtXG4gICAgICovXG4gICAgdHJ5QXBwZW5kUXVlcnlQYXJhbWV0ZXIocXVlcmllcywga2V5LCB2YWx1ZSkge1xuICAgICAgICBpZiAoIXZhbHVlKSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAga2V5ID0gZW5jb2RlVVJJQ29tcG9uZW50KGtleSk7XG4gICAgICAgIHZhbHVlID0gZW5jb2RlVVJJQ29tcG9uZW50KHZhbHVlKTtcbiAgICAgICAgaWYgKGtleS5sZW5ndGggPiAwICYmIHZhbHVlLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgIHF1ZXJpZXMucHVzaChgJHtrZXl9PSR7dmFsdWV9YCk7XG4gICAgICAgIH1cbiAgICB9XG59XG5cbi8vIENvcHlyaWdodCAoYykgTWljcm9zb2Z0IENvcnBvcmF0aW9uLlxuLy8gTGljZW5zZWQgdW5kZXIgdGhlIE1JVCBMaWNlbnNlLlxuZnVuY3Rpb24gZ2VuZXJhdGVCbG9iU0FTUXVlcnlQYXJhbWV0ZXJzKGJsb2JTQVNTaWduYXR1cmVWYWx1ZXMsIHNoYXJlZEtleUNyZWRlbnRpYWxPclVzZXJEZWxlZ2F0aW9uS2V5LCBhY2NvdW50TmFtZSkge1xuICAgIHJldHVybiBnZW5lcmF0ZUJsb2JTQVNRdWVyeVBhcmFtZXRlcnNJbnRlcm5hbChibG9iU0FTU2lnbmF0dXJlVmFsdWVzLCBzaGFyZWRLZXlDcmVkZW50aWFsT3JVc2VyRGVsZWdhdGlvbktleSwgYWNjb3VudE5hbWUpLnNhc1F1ZXJ5UGFyYW1ldGVycztcbn1cbmZ1bmN0aW9uIGdlbmVyYXRlQmxvYlNBU1F1ZXJ5UGFyYW1ldGVyc0ludGVybmFsKGJsb2JTQVNTaWduYXR1cmVWYWx1ZXMsIHNoYXJlZEtleUNyZWRlbnRpYWxPclVzZXJEZWxlZ2F0aW9uS2V5LCBhY2NvdW50TmFtZSkge1xuICAgIGNvbnN0IHZlcnNpb24gPSBibG9iU0FTU2lnbmF0dXJlVmFsdWVzLnZlcnNpb24gPyBibG9iU0FTU2lnbmF0dXJlVmFsdWVzLnZlcnNpb24gOiBTRVJWSUNFX1ZFUlNJT047XG4gICAgY29uc3Qgc2hhcmVkS2V5Q3JlZGVudGlhbCA9IHNoYXJlZEtleUNyZWRlbnRpYWxPclVzZXJEZWxlZ2F0aW9uS2V5IGluc3RhbmNlb2YgU3RvcmFnZVNoYXJlZEtleUNyZWRlbnRpYWxcbiAgICAgICAgPyBzaGFyZWRLZXlDcmVkZW50aWFsT3JVc2VyRGVsZWdhdGlvbktleVxuICAgICAgICA6IHVuZGVmaW5lZDtcbiAgICBsZXQgdXNlckRlbGVnYXRpb25LZXlDcmVkZW50aWFsO1xuICAgIGlmIChzaGFyZWRLZXlDcmVkZW50aWFsID09PSB1bmRlZmluZWQgJiYgYWNjb3VudE5hbWUgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICB1c2VyRGVsZWdhdGlvbktleUNyZWRlbnRpYWwgPSBuZXcgVXNlckRlbGVnYXRpb25LZXlDcmVkZW50aWFsKGFjY291bnROYW1lLCBzaGFyZWRLZXlDcmVkZW50aWFsT3JVc2VyRGVsZWdhdGlvbktleSk7XG4gICAgfVxuICAgIGlmIChzaGFyZWRLZXlDcmVkZW50aWFsID09PSB1bmRlZmluZWQgJiYgdXNlckRlbGVnYXRpb25LZXlDcmVkZW50aWFsID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgdGhyb3cgVHlwZUVycm9yKFwiSW52YWxpZCBzaGFyZWRLZXlDcmVkZW50aWFsLCB1c2VyRGVsZWdhdGlvbktleSBvciBhY2NvdW50TmFtZS5cIik7XG4gICAgfVxuICAgIC8vIFZlcnNpb24gMjAyMC0xMi0wNiBhZGRzIHN1cHBvcnQgZm9yIGVuY3J5cHRpb25zY29wZSBpbiBTQVMuXG4gICAgaWYgKHZlcnNpb24gPj0gXCIyMDIwLTEyLTA2XCIpIHtcbiAgICAgICAgaWYgKHNoYXJlZEtleUNyZWRlbnRpYWwgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgcmV0dXJuIGdlbmVyYXRlQmxvYlNBU1F1ZXJ5UGFyYW1ldGVyczIwMjAxMjA2KGJsb2JTQVNTaWduYXR1cmVWYWx1ZXMsIHNoYXJlZEtleUNyZWRlbnRpYWwpO1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgcmV0dXJuIGdlbmVyYXRlQmxvYlNBU1F1ZXJ5UGFyYW1ldGVyc1VESzIwMjAxMjA2KGJsb2JTQVNTaWduYXR1cmVWYWx1ZXMsIHVzZXJEZWxlZ2F0aW9uS2V5Q3JlZGVudGlhbCk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgLy8gVmVyc2lvbiAyMDE5LTEyLTEyIGFkZHMgc3VwcG9ydCBmb3IgdGhlIGJsb2IgdGFncyBwZXJtaXNzaW9uLlxuICAgIC8vIFZlcnNpb24gMjAxOC0xMS0wOSBhZGRzIHN1cHBvcnQgZm9yIHRoZSBzaWduZWQgcmVzb3VyY2UgYW5kIHNpZ25lZCBibG9iIHNuYXBzaG90IHRpbWUgZmllbGRzLlxuICAgIC8vIGh0dHBzOi8vZG9jcy5taWNyb3NvZnQuY29tL2VuLXVzL3Jlc3QvYXBpL3N0b3JhZ2VzZXJ2aWNlcy9jb25zdHJ1Y3RpbmctYS1zZXJ2aWNlLXNhcyNjb25zdHJ1Y3RpbmctdGhlLXNpZ25hdHVyZS1zdHJpbmdcbiAgICBpZiAodmVyc2lvbiA+PSBcIjIwMTgtMTEtMDlcIikge1xuICAgICAgICBpZiAoc2hhcmVkS2V5Q3JlZGVudGlhbCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICByZXR1cm4gZ2VuZXJhdGVCbG9iU0FTUXVlcnlQYXJhbWV0ZXJzMjAxODExMDkoYmxvYlNBU1NpZ25hdHVyZVZhbHVlcywgc2hhcmVkS2V5Q3JlZGVudGlhbCk7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAvLyBWZXJzaW9uIDIwMjAtMDItMTAgZGVsZWdhdGlvbiBTQVMgc2lnbmF0dXJlIGNvbnN0cnVjdGlvbiBpbmNsdWRlcyBwcmVhdXRob3JpemVkQWdlbnRPYmplY3RJZCwgYWdlbnRPYmplY3RJZCwgY29ycmVsYXRpb25JZC5cbiAgICAgICAgICAgIGlmICh2ZXJzaW9uID49IFwiMjAyMC0wMi0xMFwiKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGdlbmVyYXRlQmxvYlNBU1F1ZXJ5UGFyYW1ldGVyc1VESzIwMjAwMjEwKGJsb2JTQVNTaWduYXR1cmVWYWx1ZXMsIHVzZXJEZWxlZ2F0aW9uS2V5Q3JlZGVudGlhbCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gZ2VuZXJhdGVCbG9iU0FTUXVlcnlQYXJhbWV0ZXJzVURLMjAxODExMDkoYmxvYlNBU1NpZ25hdHVyZVZhbHVlcywgdXNlckRlbGVnYXRpb25LZXlDcmVkZW50aWFsKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cbiAgICBpZiAodmVyc2lvbiA+PSBcIjIwMTUtMDQtMDVcIikge1xuICAgICAgICBpZiAoc2hhcmVkS2V5Q3JlZGVudGlhbCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICByZXR1cm4gZ2VuZXJhdGVCbG9iU0FTUXVlcnlQYXJhbWV0ZXJzMjAxNTA0MDUoYmxvYlNBU1NpZ25hdHVyZVZhbHVlcywgc2hhcmVkS2V5Q3JlZGVudGlhbCk7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgUmFuZ2VFcnJvcihcIid2ZXJzaW9uJyBtdXN0IGJlID49ICcyMDE4LTExLTA5JyB3aGVuIGdlbmVyYXRpbmcgdXNlciBkZWxlZ2F0aW9uIFNBUyB1c2luZyB1c2VyIGRlbGVnYXRpb24ga2V5LlwiKTtcbiAgICAgICAgfVxuICAgIH1cbiAgICB0aHJvdyBuZXcgUmFuZ2VFcnJvcihcIid2ZXJzaW9uJyBtdXN0IGJlID49ICcyMDE1LTA0LTA1Jy5cIik7XG59XG4vKipcbiAqIE9OTFkgQVZBSUxBQkxFIElOIE5PREUuSlMgUlVOVElNRS5cbiAqIElNUExFTUVOVEFUSU9OIEZPUiBBUEkgVkVSU0lPTiBGUk9NIDIwMTUtMDQtMDUgQU5EIEJFRk9SRSAyMDE4LTExLTA5LlxuICpcbiAqIENyZWF0ZXMgYW4gaW5zdGFuY2Ugb2YgU0FTUXVlcnlQYXJhbWV0ZXJzLlxuICpcbiAqIE9ubHkgYWNjZXB0cyByZXF1aXJlZCBzZXR0aW5ncyBuZWVkZWQgdG8gY3JlYXRlIGEgU0FTLiBGb3Igb3B0aW9uYWwgc2V0dGluZ3MgcGxlYXNlXG4gKiBzZXQgY29ycmVzcG9uZGluZyBwcm9wZXJ0aWVzIGRpcmVjdGx5LCBzdWNoIGFzIHBlcm1pc3Npb25zLCBzdGFydHNPbiBhbmQgaWRlbnRpZmllci5cbiAqXG4gKiBXQVJOSU5HOiBXaGVuIGlkZW50aWZpZXIgaXMgbm90IHByb3ZpZGVkLCBwZXJtaXNzaW9ucyBhbmQgZXhwaXJlc09uIGFyZSByZXF1aXJlZC5cbiAqIFlvdSBNVVNUIGFzc2lnbiB2YWx1ZSB0byBpZGVudGlmaWVyIG9yIGV4cGlyZXNPbiAmIHBlcm1pc3Npb25zIG1hbnVhbGx5IGlmIHlvdSBpbml0aWFsIHdpdGhcbiAqIHRoaXMgY29uc3RydWN0b3IuXG4gKlxuICogQHBhcmFtIGJsb2JTQVNTaWduYXR1cmVWYWx1ZXMgLVxuICogQHBhcmFtIHNoYXJlZEtleUNyZWRlbnRpYWwgLVxuICovXG5mdW5jdGlvbiBnZW5lcmF0ZUJsb2JTQVNRdWVyeVBhcmFtZXRlcnMyMDE1MDQwNShibG9iU0FTU2lnbmF0dXJlVmFsdWVzLCBzaGFyZWRLZXlDcmVkZW50aWFsKSB7XG4gICAgYmxvYlNBU1NpZ25hdHVyZVZhbHVlcyA9IFNBU1NpZ25hdHVyZVZhbHVlc1Nhbml0eUNoZWNrQW5kQXV0b2ZpbGwoYmxvYlNBU1NpZ25hdHVyZVZhbHVlcyk7XG4gICAgaWYgKCFibG9iU0FTU2lnbmF0dXJlVmFsdWVzLmlkZW50aWZpZXIgJiZcbiAgICAgICAgIShibG9iU0FTU2lnbmF0dXJlVmFsdWVzLnBlcm1pc3Npb25zICYmIGJsb2JTQVNTaWduYXR1cmVWYWx1ZXMuZXhwaXJlc09uKSkge1xuICAgICAgICB0aHJvdyBuZXcgUmFuZ2VFcnJvcihcIk11c3QgcHJvdmlkZSAncGVybWlzc2lvbnMnIGFuZCAnZXhwaXJlc09uJyBmb3IgQmxvYiBTQVMgZ2VuZXJhdGlvbiB3aGVuICdpZGVudGlmaWVyJyBpcyBub3QgcHJvdmlkZWQuXCIpO1xuICAgIH1cbiAgICBsZXQgcmVzb3VyY2UgPSBcImNcIjtcbiAgICBpZiAoYmxvYlNBU1NpZ25hdHVyZVZhbHVlcy5ibG9iTmFtZSkge1xuICAgICAgICByZXNvdXJjZSA9IFwiYlwiO1xuICAgIH1cbiAgICAvLyBDYWxsaW5nIHBhcnNlIGFuZCB0b1N0cmluZyBndWFyYW50ZWVzIHRoZSBwcm9wZXIgb3JkZXJpbmcgYW5kIHRocm93cyBvbiBpbnZhbGlkIGNoYXJhY3RlcnMuXG4gICAgbGV0IHZlcmlmaWVkUGVybWlzc2lvbnM7XG4gICAgaWYgKGJsb2JTQVNTaWduYXR1cmVWYWx1ZXMucGVybWlzc2lvbnMpIHtcbiAgICAgICAgaWYgKGJsb2JTQVNTaWduYXR1cmVWYWx1ZXMuYmxvYk5hbWUpIHtcbiAgICAgICAgICAgIHZlcmlmaWVkUGVybWlzc2lvbnMgPSBCbG9iU0FTUGVybWlzc2lvbnMucGFyc2UoYmxvYlNBU1NpZ25hdHVyZVZhbHVlcy5wZXJtaXNzaW9ucy50b1N0cmluZygpKS50b1N0cmluZygpO1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgdmVyaWZpZWRQZXJtaXNzaW9ucyA9IENvbnRhaW5lclNBU1Blcm1pc3Npb25zLnBhcnNlKGJsb2JTQVNTaWduYXR1cmVWYWx1ZXMucGVybWlzc2lvbnMudG9TdHJpbmcoKSkudG9TdHJpbmcoKTtcbiAgICAgICAgfVxuICAgIH1cbiAgICAvLyBTaWduYXR1cmUgaXMgZ2VuZXJhdGVkIG9uIHRoZSB1bi11cmwtZW5jb2RlZCB2YWx1ZXMuXG4gICAgY29uc3Qgc3RyaW5nVG9TaWduID0gW1xuICAgICAgICB2ZXJpZmllZFBlcm1pc3Npb25zID8gdmVyaWZpZWRQZXJtaXNzaW9ucyA6IFwiXCIsXG4gICAgICAgIGJsb2JTQVNTaWduYXR1cmVWYWx1ZXMuc3RhcnRzT25cbiAgICAgICAgICAgID8gdHJ1bmNhdGVkSVNPODA2MURhdGUoYmxvYlNBU1NpZ25hdHVyZVZhbHVlcy5zdGFydHNPbiwgZmFsc2UpXG4gICAgICAgICAgICA6IFwiXCIsXG4gICAgICAgIGJsb2JTQVNTaWduYXR1cmVWYWx1ZXMuZXhwaXJlc09uXG4gICAgICAgICAgICA/IHRydW5jYXRlZElTTzgwNjFEYXRlKGJsb2JTQVNTaWduYXR1cmVWYWx1ZXMuZXhwaXJlc09uLCBmYWxzZSlcbiAgICAgICAgICAgIDogXCJcIixcbiAgICAgICAgZ2V0Q2Fub25pY2FsTmFtZShzaGFyZWRLZXlDcmVkZW50aWFsLmFjY291bnROYW1lLCBibG9iU0FTU2lnbmF0dXJlVmFsdWVzLmNvbnRhaW5lck5hbWUsIGJsb2JTQVNTaWduYXR1cmVWYWx1ZXMuYmxvYk5hbWUpLFxuICAgICAgICBibG9iU0FTU2lnbmF0dXJlVmFsdWVzLmlkZW50aWZpZXIsXG4gICAgICAgIGJsb2JTQVNTaWduYXR1cmVWYWx1ZXMuaXBSYW5nZSA/IGlwUmFuZ2VUb1N0cmluZyhibG9iU0FTU2lnbmF0dXJlVmFsdWVzLmlwUmFuZ2UpIDogXCJcIixcbiAgICAgICAgYmxvYlNBU1NpZ25hdHVyZVZhbHVlcy5wcm90b2NvbCA/IGJsb2JTQVNTaWduYXR1cmVWYWx1ZXMucHJvdG9jb2wgOiBcIlwiLFxuICAgICAgICBibG9iU0FTU2lnbmF0dXJlVmFsdWVzLnZlcnNpb24sXG4gICAgICAgIGJsb2JTQVNTaWduYXR1cmVWYWx1ZXMuY2FjaGVDb250cm9sID8gYmxvYlNBU1NpZ25hdHVyZVZhbHVlcy5jYWNoZUNvbnRyb2wgOiBcIlwiLFxuICAgICAgICBibG9iU0FTU2lnbmF0dXJlVmFsdWVzLmNvbnRlbnREaXNwb3NpdGlvbiA/IGJsb2JTQVNTaWduYXR1cmVWYWx1ZXMuY29udGVudERpc3Bvc2l0aW9uIDogXCJcIixcbiAgICAgICAgYmxvYlNBU1NpZ25hdHVyZVZhbHVlcy5jb250ZW50RW5jb2RpbmcgPyBibG9iU0FTU2lnbmF0dXJlVmFsdWVzLmNvbnRlbnRFbmNvZGluZyA6IFwiXCIsXG4gICAgICAgIGJsb2JTQVNTaWduYXR1cmVWYWx1ZXMuY29udGVudExhbmd1YWdlID8gYmxvYlNBU1NpZ25hdHVyZVZhbHVlcy5jb250ZW50TGFuZ3VhZ2UgOiBcIlwiLFxuICAgICAgICBibG9iU0FTU2lnbmF0dXJlVmFsdWVzLmNvbnRlbnRUeXBlID8gYmxvYlNBU1NpZ25hdHVyZVZhbHVlcy5jb250ZW50VHlwZSA6IFwiXCIsXG4gICAgXS5qb2luKFwiXFxuXCIpO1xuICAgIGNvbnN0IHNpZ25hdHVyZSA9IHNoYXJlZEtleUNyZWRlbnRpYWwuY29tcHV0ZUhNQUNTSEEyNTYoc3RyaW5nVG9TaWduKTtcbiAgICByZXR1cm4ge1xuICAgICAgICBzYXNRdWVyeVBhcmFtZXRlcnM6IG5ldyBTQVNRdWVyeVBhcmFtZXRlcnMoYmxvYlNBU1NpZ25hdHVyZVZhbHVlcy52ZXJzaW9uLCBzaWduYXR1cmUsIHZlcmlmaWVkUGVybWlzc2lvbnMsIHVuZGVmaW5lZCwgdW5kZWZpbmVkLCBibG9iU0FTU2lnbmF0dXJlVmFsdWVzLnByb3RvY29sLCBibG9iU0FTU2lnbmF0dXJlVmFsdWVzLnN0YXJ0c09uLCBibG9iU0FTU2lnbmF0dXJlVmFsdWVzLmV4cGlyZXNPbiwgYmxvYlNBU1NpZ25hdHVyZVZhbHVlcy5pcFJhbmdlLCBibG9iU0FTU2lnbmF0dXJlVmFsdWVzLmlkZW50aWZpZXIsIHJlc291cmNlLCBibG9iU0FTU2lnbmF0dXJlVmFsdWVzLmNhY2hlQ29udHJvbCwgYmxvYlNBU1NpZ25hdHVyZVZhbHVlcy5jb250ZW50RGlzcG9zaXRpb24sIGJsb2JTQVNTaWduYXR1cmVWYWx1ZXMuY29udGVudEVuY29kaW5nLCBibG9iU0FTU2lnbmF0dXJlVmFsdWVzLmNvbnRlbnRMYW5ndWFnZSwgYmxvYlNBU1NpZ25hdHVyZVZhbHVlcy5jb250ZW50VHlwZSksXG4gICAgICAgIHN0cmluZ1RvU2lnbjogc3RyaW5nVG9TaWduLFxuICAgIH07XG59XG4vKipcbiAqIE9OTFkgQVZBSUxBQkxFIElOIE5PREUuSlMgUlVOVElNRS5cbiAqIElNUExFTUVOVEFUSU9OIEZPUiBBUEkgVkVSU0lPTiBGUk9NIDIwMTgtMTEtMDkuXG4gKlxuICogQ3JlYXRlcyBhbiBpbnN0YW5jZSBvZiBTQVNRdWVyeVBhcmFtZXRlcnMuXG4gKlxuICogT25seSBhY2NlcHRzIHJlcXVpcmVkIHNldHRpbmdzIG5lZWRlZCB0byBjcmVhdGUgYSBTQVMuIEZvciBvcHRpb25hbCBzZXR0aW5ncyBwbGVhc2VcbiAqIHNldCBjb3JyZXNwb25kaW5nIHByb3BlcnRpZXMgZGlyZWN0bHksIHN1Y2ggYXMgcGVybWlzc2lvbnMsIHN0YXJ0c09uIGFuZCBpZGVudGlmaWVyLlxuICpcbiAqIFdBUk5JTkc6IFdoZW4gaWRlbnRpZmllciBpcyBub3QgcHJvdmlkZWQsIHBlcm1pc3Npb25zIGFuZCBleHBpcmVzT24gYXJlIHJlcXVpcmVkLlxuICogWW91IE1VU1QgYXNzaWduIHZhbHVlIHRvIGlkZW50aWZpZXIgb3IgZXhwaXJlc09uICYgcGVybWlzc2lvbnMgbWFudWFsbHkgaWYgeW91IGluaXRpYWwgd2l0aFxuICogdGhpcyBjb25zdHJ1Y3Rvci5cbiAqXG4gKiBAcGFyYW0gYmxvYlNBU1NpZ25hdHVyZVZhbHVlcyAtXG4gKiBAcGFyYW0gc2hhcmVkS2V5Q3JlZGVudGlhbCAtXG4gKi9cbmZ1bmN0aW9uIGdlbmVyYXRlQmxvYlNBU1F1ZXJ5UGFyYW1ldGVyczIwMTgxMTA5KGJsb2JTQVNTaWduYXR1cmVWYWx1ZXMsIHNoYXJlZEtleUNyZWRlbnRpYWwpIHtcbiAgICBibG9iU0FTU2lnbmF0dXJlVmFsdWVzID0gU0FTU2lnbmF0dXJlVmFsdWVzU2FuaXR5Q2hlY2tBbmRBdXRvZmlsbChibG9iU0FTU2lnbmF0dXJlVmFsdWVzKTtcbiAgICBpZiAoIWJsb2JTQVNTaWduYXR1cmVWYWx1ZXMuaWRlbnRpZmllciAmJlxuICAgICAgICAhKGJsb2JTQVNTaWduYXR1cmVWYWx1ZXMucGVybWlzc2lvbnMgJiYgYmxvYlNBU1NpZ25hdHVyZVZhbHVlcy5leHBpcmVzT24pKSB7XG4gICAgICAgIHRocm93IG5ldyBSYW5nZUVycm9yKFwiTXVzdCBwcm92aWRlICdwZXJtaXNzaW9ucycgYW5kICdleHBpcmVzT24nIGZvciBCbG9iIFNBUyBnZW5lcmF0aW9uIHdoZW4gJ2lkZW50aWZpZXInIGlzIG5vdCBwcm92aWRlZC5cIik7XG4gICAgfVxuICAgIGxldCByZXNvdXJjZSA9IFwiY1wiO1xuICAgIGxldCB0aW1lc3RhbXAgPSBibG9iU0FTU2lnbmF0dXJlVmFsdWVzLnNuYXBzaG90VGltZTtcbiAgICBpZiAoYmxvYlNBU1NpZ25hdHVyZVZhbHVlcy5ibG9iTmFtZSkge1xuICAgICAgICByZXNvdXJjZSA9IFwiYlwiO1xuICAgICAgICBpZiAoYmxvYlNBU1NpZ25hdHVyZVZhbHVlcy5zbmFwc2hvdFRpbWUpIHtcbiAgICAgICAgICAgIHJlc291cmNlID0gXCJic1wiO1xuICAgICAgICB9XG4gICAgICAgIGVsc2UgaWYgKGJsb2JTQVNTaWduYXR1cmVWYWx1ZXMudmVyc2lvbklkKSB7XG4gICAgICAgICAgICByZXNvdXJjZSA9IFwiYnZcIjtcbiAgICAgICAgICAgIHRpbWVzdGFtcCA9IGJsb2JTQVNTaWduYXR1cmVWYWx1ZXMudmVyc2lvbklkO1xuICAgICAgICB9XG4gICAgfVxuICAgIC8vIENhbGxpbmcgcGFyc2UgYW5kIHRvU3RyaW5nIGd1YXJhbnRlZXMgdGhlIHByb3BlciBvcmRlcmluZyBhbmQgdGhyb3dzIG9uIGludmFsaWQgY2hhcmFjdGVycy5cbiAgICBsZXQgdmVyaWZpZWRQZXJtaXNzaW9ucztcbiAgICBpZiAoYmxvYlNBU1NpZ25hdHVyZVZhbHVlcy5wZXJtaXNzaW9ucykge1xuICAgICAgICBpZiAoYmxvYlNBU1NpZ25hdHVyZVZhbHVlcy5ibG9iTmFtZSkge1xuICAgICAgICAgICAgdmVyaWZpZWRQZXJtaXNzaW9ucyA9IEJsb2JTQVNQZXJtaXNzaW9ucy5wYXJzZShibG9iU0FTU2lnbmF0dXJlVmFsdWVzLnBlcm1pc3Npb25zLnRvU3RyaW5nKCkpLnRvU3RyaW5nKCk7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICB2ZXJpZmllZFBlcm1pc3Npb25zID0gQ29udGFpbmVyU0FTUGVybWlzc2lvbnMucGFyc2UoYmxvYlNBU1NpZ25hdHVyZVZhbHVlcy5wZXJtaXNzaW9ucy50b1N0cmluZygpKS50b1N0cmluZygpO1xuICAgICAgICB9XG4gICAgfVxuICAgIC8vIFNpZ25hdHVyZSBpcyBnZW5lcmF0ZWQgb24gdGhlIHVuLXVybC1lbmNvZGVkIHZhbHVlcy5cbiAgICBjb25zdCBzdHJpbmdUb1NpZ24gPSBbXG4gICAgICAgIHZlcmlmaWVkUGVybWlzc2lvbnMgPyB2ZXJpZmllZFBlcm1pc3Npb25zIDogXCJcIixcbiAgICAgICAgYmxvYlNBU1NpZ25hdHVyZVZhbHVlcy5zdGFydHNPblxuICAgICAgICAgICAgPyB0cnVuY2F0ZWRJU084MDYxRGF0ZShibG9iU0FTU2lnbmF0dXJlVmFsdWVzLnN0YXJ0c09uLCBmYWxzZSlcbiAgICAgICAgICAgIDogXCJcIixcbiAgICAgICAgYmxvYlNBU1NpZ25hdHVyZVZhbHVlcy5leHBpcmVzT25cbiAgICAgICAgICAgID8gdHJ1bmNhdGVkSVNPODA2MURhdGUoYmxvYlNBU1NpZ25hdHVyZVZhbHVlcy5leHBpcmVzT24sIGZhbHNlKVxuICAgICAgICAgICAgOiBcIlwiLFxuICAgICAgICBnZXRDYW5vbmljYWxOYW1lKHNoYXJlZEtleUNyZWRlbnRpYWwuYWNjb3VudE5hbWUsIGJsb2JTQVNTaWduYXR1cmVWYWx1ZXMuY29udGFpbmVyTmFtZSwgYmxvYlNBU1NpZ25hdHVyZVZhbHVlcy5ibG9iTmFtZSksXG4gICAgICAgIGJsb2JTQVNTaWduYXR1cmVWYWx1ZXMuaWRlbnRpZmllcixcbiAgICAgICAgYmxvYlNBU1NpZ25hdHVyZVZhbHVlcy5pcFJhbmdlID8gaXBSYW5nZVRvU3RyaW5nKGJsb2JTQVNTaWduYXR1cmVWYWx1ZXMuaXBSYW5nZSkgOiBcIlwiLFxuICAgICAgICBibG9iU0FTU2lnbmF0dXJlVmFsdWVzLnByb3RvY29sID8gYmxvYlNBU1NpZ25hdHVyZVZhbHVlcy5wcm90b2NvbCA6IFwiXCIsXG4gICAgICAgIGJsb2JTQVNTaWduYXR1cmVWYWx1ZXMudmVyc2lvbixcbiAgICAgICAgcmVzb3VyY2UsXG4gICAgICAgIHRpbWVzdGFtcCxcbiAgICAgICAgYmxvYlNBU1NpZ25hdHVyZVZhbHVlcy5jYWNoZUNvbnRyb2wgPyBibG9iU0FTU2lnbmF0dXJlVmFsdWVzLmNhY2hlQ29udHJvbCA6IFwiXCIsXG4gICAgICAgIGJsb2JTQVNTaWduYXR1cmVWYWx1ZXMuY29udGVudERpc3Bvc2l0aW9uID8gYmxvYlNBU1NpZ25hdHVyZVZhbHVlcy5jb250ZW50RGlzcG9zaXRpb24gOiBcIlwiLFxuICAgICAgICBibG9iU0FTU2lnbmF0dXJlVmFsdWVzLmNvbnRlbnRFbmNvZGluZyA/IGJsb2JTQVNTaWduYXR1cmVWYWx1ZXMuY29udGVudEVuY29kaW5nIDogXCJcIixcbiAgICAgICAgYmxvYlNBU1NpZ25hdHVyZVZhbHVlcy5jb250ZW50TGFuZ3VhZ2UgPyBibG9iU0FTU2lnbmF0dXJlVmFsdWVzLmNvbnRlbnRMYW5ndWFnZSA6IFwiXCIsXG4gICAgICAgIGJsb2JTQVNTaWduYXR1cmVWYWx1ZXMuY29udGVudFR5cGUgPyBibG9iU0FTU2lnbmF0dXJlVmFsdWVzLmNvbnRlbnRUeXBlIDogXCJcIixcbiAgICBdLmpvaW4oXCJcXG5cIik7XG4gICAgY29uc3Qgc2lnbmF0dXJlID0gc2hhcmVkS2V5Q3JlZGVudGlhbC5jb21wdXRlSE1BQ1NIQTI1NihzdHJpbmdUb1NpZ24pO1xuICAgIHJldHVybiB7XG4gICAgICAgIHNhc1F1ZXJ5UGFyYW1ldGVyczogbmV3IFNBU1F1ZXJ5UGFyYW1ldGVycyhibG9iU0FTU2lnbmF0dXJlVmFsdWVzLnZlcnNpb24sIHNpZ25hdHVyZSwgdmVyaWZpZWRQZXJtaXNzaW9ucywgdW5kZWZpbmVkLCB1bmRlZmluZWQsIGJsb2JTQVNTaWduYXR1cmVWYWx1ZXMucHJvdG9jb2wsIGJsb2JTQVNTaWduYXR1cmVWYWx1ZXMuc3RhcnRzT24sIGJsb2JTQVNTaWduYXR1cmVWYWx1ZXMuZXhwaXJlc09uLCBibG9iU0FTU2lnbmF0dXJlVmFsdWVzLmlwUmFuZ2UsIGJsb2JTQVNTaWduYXR1cmVWYWx1ZXMuaWRlbnRpZmllciwgcmVzb3VyY2UsIGJsb2JTQVNTaWduYXR1cmVWYWx1ZXMuY2FjaGVDb250cm9sLCBibG9iU0FTU2lnbmF0dXJlVmFsdWVzLmNvbnRlbnREaXNwb3NpdGlvbiwgYmxvYlNBU1NpZ25hdHVyZVZhbHVlcy5jb250ZW50RW5jb2RpbmcsIGJsb2JTQVNTaWduYXR1cmVWYWx1ZXMuY29udGVudExhbmd1YWdlLCBibG9iU0FTU2lnbmF0dXJlVmFsdWVzLmNvbnRlbnRUeXBlKSxcbiAgICAgICAgc3RyaW5nVG9TaWduOiBzdHJpbmdUb1NpZ24sXG4gICAgfTtcbn1cbi8qKlxuICogT05MWSBBVkFJTEFCTEUgSU4gTk9ERS5KUyBSVU5USU1FLlxuICogSU1QTEVNRU5UQVRJT04gRk9SIEFQSSBWRVJTSU9OIEZST00gMjAyMC0xMi0wNi5cbiAqXG4gKiBDcmVhdGVzIGFuIGluc3RhbmNlIG9mIFNBU1F1ZXJ5UGFyYW1ldGVycy5cbiAqXG4gKiBPbmx5IGFjY2VwdHMgcmVxdWlyZWQgc2V0dGluZ3MgbmVlZGVkIHRvIGNyZWF0ZSBhIFNBUy4gRm9yIG9wdGlvbmFsIHNldHRpbmdzIHBsZWFzZVxuICogc2V0IGNvcnJlc3BvbmRpbmcgcHJvcGVydGllcyBkaXJlY3RseSwgc3VjaCBhcyBwZXJtaXNzaW9ucywgc3RhcnRzT24gYW5kIGlkZW50aWZpZXIuXG4gKlxuICogV0FSTklORzogV2hlbiBpZGVudGlmaWVyIGlzIG5vdCBwcm92aWRlZCwgcGVybWlzc2lvbnMgYW5kIGV4cGlyZXNPbiBhcmUgcmVxdWlyZWQuXG4gKiBZb3UgTVVTVCBhc3NpZ24gdmFsdWUgdG8gaWRlbnRpZmllciBvciBleHBpcmVzT24gJiBwZXJtaXNzaW9ucyBtYW51YWxseSBpZiB5b3UgaW5pdGlhbCB3aXRoXG4gKiB0aGlzIGNvbnN0cnVjdG9yLlxuICpcbiAqIEBwYXJhbSBibG9iU0FTU2lnbmF0dXJlVmFsdWVzIC1cbiAqIEBwYXJhbSBzaGFyZWRLZXlDcmVkZW50aWFsIC1cbiAqL1xuZnVuY3Rpb24gZ2VuZXJhdGVCbG9iU0FTUXVlcnlQYXJhbWV0ZXJzMjAyMDEyMDYoYmxvYlNBU1NpZ25hdHVyZVZhbHVlcywgc2hhcmVkS2V5Q3JlZGVudGlhbCkge1xuICAgIGJsb2JTQVNTaWduYXR1cmVWYWx1ZXMgPSBTQVNTaWduYXR1cmVWYWx1ZXNTYW5pdHlDaGVja0FuZEF1dG9maWxsKGJsb2JTQVNTaWduYXR1cmVWYWx1ZXMpO1xuICAgIGlmICghYmxvYlNBU1NpZ25hdHVyZVZhbHVlcy5pZGVudGlmaWVyICYmXG4gICAgICAgICEoYmxvYlNBU1NpZ25hdHVyZVZhbHVlcy5wZXJtaXNzaW9ucyAmJiBibG9iU0FTU2lnbmF0dXJlVmFsdWVzLmV4cGlyZXNPbikpIHtcbiAgICAgICAgdGhyb3cgbmV3IFJhbmdlRXJyb3IoXCJNdXN0IHByb3ZpZGUgJ3Blcm1pc3Npb25zJyBhbmQgJ2V4cGlyZXNPbicgZm9yIEJsb2IgU0FTIGdlbmVyYXRpb24gd2hlbiAnaWRlbnRpZmllcicgaXMgbm90IHByb3ZpZGVkLlwiKTtcbiAgICB9XG4gICAgbGV0IHJlc291cmNlID0gXCJjXCI7XG4gICAgbGV0IHRpbWVzdGFtcCA9IGJsb2JTQVNTaWduYXR1cmVWYWx1ZXMuc25hcHNob3RUaW1lO1xuICAgIGlmIChibG9iU0FTU2lnbmF0dXJlVmFsdWVzLmJsb2JOYW1lKSB7XG4gICAgICAgIHJlc291cmNlID0gXCJiXCI7XG4gICAgICAgIGlmIChibG9iU0FTU2lnbmF0dXJlVmFsdWVzLnNuYXBzaG90VGltZSkge1xuICAgICAgICAgICAgcmVzb3VyY2UgPSBcImJzXCI7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSBpZiAoYmxvYlNBU1NpZ25hdHVyZVZhbHVlcy52ZXJzaW9uSWQpIHtcbiAgICAgICAgICAgIHJlc291cmNlID0gXCJidlwiO1xuICAgICAgICAgICAgdGltZXN0YW1wID0gYmxvYlNBU1NpZ25hdHVyZVZhbHVlcy52ZXJzaW9uSWQ7XG4gICAgICAgIH1cbiAgICB9XG4gICAgLy8gQ2FsbGluZyBwYXJzZSBhbmQgdG9TdHJpbmcgZ3VhcmFudGVlcyB0aGUgcHJvcGVyIG9yZGVyaW5nIGFuZCB0aHJvd3Mgb24gaW52YWxpZCBjaGFyYWN0ZXJzLlxuICAgIGxldCB2ZXJpZmllZFBlcm1pc3Npb25zO1xuICAgIGlmIChibG9iU0FTU2lnbmF0dXJlVmFsdWVzLnBlcm1pc3Npb25zKSB7XG4gICAgICAgIGlmIChibG9iU0FTU2lnbmF0dXJlVmFsdWVzLmJsb2JOYW1lKSB7XG4gICAgICAgICAgICB2ZXJpZmllZFBlcm1pc3Npb25zID0gQmxvYlNBU1Blcm1pc3Npb25zLnBhcnNlKGJsb2JTQVNTaWduYXR1cmVWYWx1ZXMucGVybWlzc2lvbnMudG9TdHJpbmcoKSkudG9TdHJpbmcoKTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIHZlcmlmaWVkUGVybWlzc2lvbnMgPSBDb250YWluZXJTQVNQZXJtaXNzaW9ucy5wYXJzZShibG9iU0FTU2lnbmF0dXJlVmFsdWVzLnBlcm1pc3Npb25zLnRvU3RyaW5nKCkpLnRvU3RyaW5nKCk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgLy8gU2lnbmF0dXJlIGlzIGdlbmVyYXRlZCBvbiB0aGUgdW4tdXJsLWVuY29kZWQgdmFsdWVzLlxuICAgIGNvbnN0IHN0cmluZ1RvU2lnbiA9IFtcbiAgICAgICAgdmVyaWZpZWRQZXJtaXNzaW9ucyA/IHZlcmlmaWVkUGVybWlzc2lvbnMgOiBcIlwiLFxuICAgICAgICBibG9iU0FTU2lnbmF0dXJlVmFsdWVzLnN0YXJ0c09uXG4gICAgICAgICAgICA/IHRydW5jYXRlZElTTzgwNjFEYXRlKGJsb2JTQVNTaWduYXR1cmVWYWx1ZXMuc3RhcnRzT24sIGZhbHNlKVxuICAgICAgICAgICAgOiBcIlwiLFxuICAgICAgICBibG9iU0FTU2lnbmF0dXJlVmFsdWVzLmV4cGlyZXNPblxuICAgICAgICAgICAgPyB0cnVuY2F0ZWRJU084MDYxRGF0ZShibG9iU0FTU2lnbmF0dXJlVmFsdWVzLmV4cGlyZXNPbiwgZmFsc2UpXG4gICAgICAgICAgICA6IFwiXCIsXG4gICAgICAgIGdldENhbm9uaWNhbE5hbWUoc2hhcmVkS2V5Q3JlZGVudGlhbC5hY2NvdW50TmFtZSwgYmxvYlNBU1NpZ25hdHVyZVZhbHVlcy5jb250YWluZXJOYW1lLCBibG9iU0FTU2lnbmF0dXJlVmFsdWVzLmJsb2JOYW1lKSxcbiAgICAgICAgYmxvYlNBU1NpZ25hdHVyZVZhbHVlcy5pZGVudGlmaWVyLFxuICAgICAgICBibG9iU0FTU2lnbmF0dXJlVmFsdWVzLmlwUmFuZ2UgPyBpcFJhbmdlVG9TdHJpbmcoYmxvYlNBU1NpZ25hdHVyZVZhbHVlcy5pcFJhbmdlKSA6IFwiXCIsXG4gICAgICAgIGJsb2JTQVNTaWduYXR1cmVWYWx1ZXMucHJvdG9jb2wgPyBibG9iU0FTU2lnbmF0dXJlVmFsdWVzLnByb3RvY29sIDogXCJcIixcbiAgICAgICAgYmxvYlNBU1NpZ25hdHVyZVZhbHVlcy52ZXJzaW9uLFxuICAgICAgICByZXNvdXJjZSxcbiAgICAgICAgdGltZXN0YW1wLFxuICAgICAgICBibG9iU0FTU2lnbmF0dXJlVmFsdWVzLmVuY3J5cHRpb25TY29wZSxcbiAgICAgICAgYmxvYlNBU1NpZ25hdHVyZVZhbHVlcy5jYWNoZUNvbnRyb2wgPyBibG9iU0FTU2lnbmF0dXJlVmFsdWVzLmNhY2hlQ29udHJvbCA6IFwiXCIsXG4gICAgICAgIGJsb2JTQVNTaWduYXR1cmVWYWx1ZXMuY29udGVudERpc3Bvc2l0aW9uID8gYmxvYlNBU1NpZ25hdHVyZVZhbHVlcy5jb250ZW50RGlzcG9zaXRpb24gOiBcIlwiLFxuICAgICAgICBibG9iU0FTU2lnbmF0dXJlVmFsdWVzLmNvbnRlbnRFbmNvZGluZyA/IGJsb2JTQVNTaWduYXR1cmVWYWx1ZXMuY29udGVudEVuY29kaW5nIDogXCJcIixcbiAgICAgICAgYmxvYlNBU1NpZ25hdHVyZVZhbHVlcy5jb250ZW50TGFuZ3VhZ2UgPyBibG9iU0FTU2lnbmF0dXJlVmFsdWVzLmNvbnRlbnRMYW5ndWFnZSA6IFwiXCIsXG4gICAgICAgIGJsb2JTQVNTaWduYXR1cmVWYWx1ZXMuY29udGVudFR5cGUgPyBibG9iU0FTU2lnbmF0dXJlVmFsdWVzLmNvbnRlbnRUeXBlIDogXCJcIixcbiAgICBdLmpvaW4oXCJcXG5cIik7XG4gICAgY29uc3Qgc2lnbmF0dXJlID0gc2hhcmVkS2V5Q3JlZGVudGlhbC5jb21wdXRlSE1BQ1NIQTI1NihzdHJpbmdUb1NpZ24pO1xuICAgIHJldHVybiB7XG4gICAgICAgIHNhc1F1ZXJ5UGFyYW1ldGVyczogbmV3IFNBU1F1ZXJ5UGFyYW1ldGVycyhibG9iU0FTU2lnbmF0dXJlVmFsdWVzLnZlcnNpb24sIHNpZ25hdHVyZSwgdmVyaWZpZWRQZXJtaXNzaW9ucywgdW5kZWZpbmVkLCB1bmRlZmluZWQsIGJsb2JTQVNTaWduYXR1cmVWYWx1ZXMucHJvdG9jb2wsIGJsb2JTQVNTaWduYXR1cmVWYWx1ZXMuc3RhcnRzT24sIGJsb2JTQVNTaWduYXR1cmVWYWx1ZXMuZXhwaXJlc09uLCBibG9iU0FTU2lnbmF0dXJlVmFsdWVzLmlwUmFuZ2UsIGJsb2JTQVNTaWduYXR1cmVWYWx1ZXMuaWRlbnRpZmllciwgcmVzb3VyY2UsIGJsb2JTQVNTaWduYXR1cmVWYWx1ZXMuY2FjaGVDb250cm9sLCBibG9iU0FTU2lnbmF0dXJlVmFsdWVzLmNvbnRlbnREaXNwb3NpdGlvbiwgYmxvYlNBU1NpZ25hdHVyZVZhbHVlcy5jb250ZW50RW5jb2RpbmcsIGJsb2JTQVNTaWduYXR1cmVWYWx1ZXMuY29udGVudExhbmd1YWdlLCBibG9iU0FTU2lnbmF0dXJlVmFsdWVzLmNvbnRlbnRUeXBlLCB1bmRlZmluZWQsIHVuZGVmaW5lZCwgdW5kZWZpbmVkLCBibG9iU0FTU2lnbmF0dXJlVmFsdWVzLmVuY3J5cHRpb25TY29wZSksXG4gICAgICAgIHN0cmluZ1RvU2lnbjogc3RyaW5nVG9TaWduLFxuICAgIH07XG59XG4vKipcbiAqIE9OTFkgQVZBSUxBQkxFIElOIE5PREUuSlMgUlVOVElNRS5cbiAqIElNUExFTUVOVEFUSU9OIEZPUiBBUEkgVkVSU0lPTiBGUk9NIDIwMTgtMTEtMDkuXG4gKlxuICogQ3JlYXRlcyBhbiBpbnN0YW5jZSBvZiBTQVNRdWVyeVBhcmFtZXRlcnMuXG4gKlxuICogT25seSBhY2NlcHRzIHJlcXVpcmVkIHNldHRpbmdzIG5lZWRlZCB0byBjcmVhdGUgYSBTQVMuIEZvciBvcHRpb25hbCBzZXR0aW5ncyBwbGVhc2VcbiAqIHNldCBjb3JyZXNwb25kaW5nIHByb3BlcnRpZXMgZGlyZWN0bHksIHN1Y2ggYXMgcGVybWlzc2lvbnMsIHN0YXJ0c09uLlxuICpcbiAqIFdBUk5JTkc6IGlkZW50aWZpZXIgd2lsbCBiZSBpZ25vcmVkLCBwZXJtaXNzaW9ucyBhbmQgZXhwaXJlc09uIGFyZSByZXF1aXJlZC5cbiAqXG4gKiBAcGFyYW0gYmxvYlNBU1NpZ25hdHVyZVZhbHVlcyAtXG4gKiBAcGFyYW0gdXNlckRlbGVnYXRpb25LZXlDcmVkZW50aWFsIC1cbiAqL1xuZnVuY3Rpb24gZ2VuZXJhdGVCbG9iU0FTUXVlcnlQYXJhbWV0ZXJzVURLMjAxODExMDkoYmxvYlNBU1NpZ25hdHVyZVZhbHVlcywgdXNlckRlbGVnYXRpb25LZXlDcmVkZW50aWFsKSB7XG4gICAgYmxvYlNBU1NpZ25hdHVyZVZhbHVlcyA9IFNBU1NpZ25hdHVyZVZhbHVlc1Nhbml0eUNoZWNrQW5kQXV0b2ZpbGwoYmxvYlNBU1NpZ25hdHVyZVZhbHVlcyk7XG4gICAgLy8gU3RvcmVkIGFjY2VzcyBwb2xpY2llcyBhcmUgbm90IHN1cHBvcnRlZCBmb3IgYSB1c2VyIGRlbGVnYXRpb24gU0FTLlxuICAgIGlmICghYmxvYlNBU1NpZ25hdHVyZVZhbHVlcy5wZXJtaXNzaW9ucyB8fCAhYmxvYlNBU1NpZ25hdHVyZVZhbHVlcy5leHBpcmVzT24pIHtcbiAgICAgICAgdGhyb3cgbmV3IFJhbmdlRXJyb3IoXCJNdXN0IHByb3ZpZGUgJ3Blcm1pc3Npb25zJyBhbmQgJ2V4cGlyZXNPbicgZm9yIEJsb2IgU0FTIGdlbmVyYXRpb24gd2hlbiBnZW5lcmF0aW5nIHVzZXIgZGVsZWdhdGlvbiBTQVMuXCIpO1xuICAgIH1cbiAgICBsZXQgcmVzb3VyY2UgPSBcImNcIjtcbiAgICBsZXQgdGltZXN0YW1wID0gYmxvYlNBU1NpZ25hdHVyZVZhbHVlcy5zbmFwc2hvdFRpbWU7XG4gICAgaWYgKGJsb2JTQVNTaWduYXR1cmVWYWx1ZXMuYmxvYk5hbWUpIHtcbiAgICAgICAgcmVzb3VyY2UgPSBcImJcIjtcbiAgICAgICAgaWYgKGJsb2JTQVNTaWduYXR1cmVWYWx1ZXMuc25hcHNob3RUaW1lKSB7XG4gICAgICAgICAgICByZXNvdXJjZSA9IFwiYnNcIjtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIGlmIChibG9iU0FTU2lnbmF0dXJlVmFsdWVzLnZlcnNpb25JZCkge1xuICAgICAgICAgICAgcmVzb3VyY2UgPSBcImJ2XCI7XG4gICAgICAgICAgICB0aW1lc3RhbXAgPSBibG9iU0FTU2lnbmF0dXJlVmFsdWVzLnZlcnNpb25JZDtcbiAgICAgICAgfVxuICAgIH1cbiAgICAvLyBDYWxsaW5nIHBhcnNlIGFuZCB0b1N0cmluZyBndWFyYW50ZWVzIHRoZSBwcm9wZXIgb3JkZXJpbmcgYW5kIHRocm93cyBvbiBpbnZhbGlkIGNoYXJhY3RlcnMuXG4gICAgbGV0IHZlcmlmaWVkUGVybWlzc2lvbnM7XG4gICAgaWYgKGJsb2JTQVNTaWduYXR1cmVWYWx1ZXMucGVybWlzc2lvbnMpIHtcbiAgICAgICAgaWYgKGJsb2JTQVNTaWduYXR1cmVWYWx1ZXMuYmxvYk5hbWUpIHtcbiAgICAgICAgICAgIHZlcmlmaWVkUGVybWlzc2lvbnMgPSBCbG9iU0FTUGVybWlzc2lvbnMucGFyc2UoYmxvYlNBU1NpZ25hdHVyZVZhbHVlcy5wZXJtaXNzaW9ucy50b1N0cmluZygpKS50b1N0cmluZygpO1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgdmVyaWZpZWRQZXJtaXNzaW9ucyA9IENvbnRhaW5lclNBU1Blcm1pc3Npb25zLnBhcnNlKGJsb2JTQVNTaWduYXR1cmVWYWx1ZXMucGVybWlzc2lvbnMudG9TdHJpbmcoKSkudG9TdHJpbmcoKTtcbiAgICAgICAgfVxuICAgIH1cbiAgICAvLyBTaWduYXR1cmUgaXMgZ2VuZXJhdGVkIG9uIHRoZSB1bi11cmwtZW5jb2RlZCB2YWx1ZXMuXG4gICAgY29uc3Qgc3RyaW5nVG9TaWduID0gW1xuICAgICAgICB2ZXJpZmllZFBlcm1pc3Npb25zID8gdmVyaWZpZWRQZXJtaXNzaW9ucyA6IFwiXCIsXG4gICAgICAgIGJsb2JTQVNTaWduYXR1cmVWYWx1ZXMuc3RhcnRzT25cbiAgICAgICAgICAgID8gdHJ1bmNhdGVkSVNPODA2MURhdGUoYmxvYlNBU1NpZ25hdHVyZVZhbHVlcy5zdGFydHNPbiwgZmFsc2UpXG4gICAgICAgICAgICA6IFwiXCIsXG4gICAgICAgIGJsb2JTQVNTaWduYXR1cmVWYWx1ZXMuZXhwaXJlc09uXG4gICAgICAgICAgICA/IHRydW5jYXRlZElTTzgwNjFEYXRlKGJsb2JTQVNTaWduYXR1cmVWYWx1ZXMuZXhwaXJlc09uLCBmYWxzZSlcbiAgICAgICAgICAgIDogXCJcIixcbiAgICAgICAgZ2V0Q2Fub25pY2FsTmFtZSh1c2VyRGVsZWdhdGlvbktleUNyZWRlbnRpYWwuYWNjb3VudE5hbWUsIGJsb2JTQVNTaWduYXR1cmVWYWx1ZXMuY29udGFpbmVyTmFtZSwgYmxvYlNBU1NpZ25hdHVyZVZhbHVlcy5ibG9iTmFtZSksXG4gICAgICAgIHVzZXJEZWxlZ2F0aW9uS2V5Q3JlZGVudGlhbC51c2VyRGVsZWdhdGlvbktleS5zaWduZWRPYmplY3RJZCxcbiAgICAgICAgdXNlckRlbGVnYXRpb25LZXlDcmVkZW50aWFsLnVzZXJEZWxlZ2F0aW9uS2V5LnNpZ25lZFRlbmFudElkLFxuICAgICAgICB1c2VyRGVsZWdhdGlvbktleUNyZWRlbnRpYWwudXNlckRlbGVnYXRpb25LZXkuc2lnbmVkU3RhcnRzT25cbiAgICAgICAgICAgID8gdHJ1bmNhdGVkSVNPODA2MURhdGUodXNlckRlbGVnYXRpb25LZXlDcmVkZW50aWFsLnVzZXJEZWxlZ2F0aW9uS2V5LnNpZ25lZFN0YXJ0c09uLCBmYWxzZSlcbiAgICAgICAgICAgIDogXCJcIixcbiAgICAgICAgdXNlckRlbGVnYXRpb25LZXlDcmVkZW50aWFsLnVzZXJEZWxlZ2F0aW9uS2V5LnNpZ25lZEV4cGlyZXNPblxuICAgICAgICAgICAgPyB0cnVuY2F0ZWRJU084MDYxRGF0ZSh1c2VyRGVsZWdhdGlvbktleUNyZWRlbnRpYWwudXNlckRlbGVnYXRpb25LZXkuc2lnbmVkRXhwaXJlc09uLCBmYWxzZSlcbiAgICAgICAgICAgIDogXCJcIixcbiAgICAgICAgdXNlckRlbGVnYXRpb25LZXlDcmVkZW50aWFsLnVzZXJEZWxlZ2F0aW9uS2V5LnNpZ25lZFNlcnZpY2UsXG4gICAgICAgIHVzZXJEZWxlZ2F0aW9uS2V5Q3JlZGVudGlhbC51c2VyRGVsZWdhdGlvbktleS5zaWduZWRWZXJzaW9uLFxuICAgICAgICBibG9iU0FTU2lnbmF0dXJlVmFsdWVzLmlwUmFuZ2UgPyBpcFJhbmdlVG9TdHJpbmcoYmxvYlNBU1NpZ25hdHVyZVZhbHVlcy5pcFJhbmdlKSA6IFwiXCIsXG4gICAgICAgIGJsb2JTQVNTaWduYXR1cmVWYWx1ZXMucHJvdG9jb2wgPyBibG9iU0FTU2lnbmF0dXJlVmFsdWVzLnByb3RvY29sIDogXCJcIixcbiAgICAgICAgYmxvYlNBU1NpZ25hdHVyZVZhbHVlcy52ZXJzaW9uLFxuICAgICAgICByZXNvdXJjZSxcbiAgICAgICAgdGltZXN0YW1wLFxuICAgICAgICBibG9iU0FTU2lnbmF0dXJlVmFsdWVzLmNhY2hlQ29udHJvbCxcbiAgICAgICAgYmxvYlNBU1NpZ25hdHVyZVZhbHVlcy5jb250ZW50RGlzcG9zaXRpb24sXG4gICAgICAgIGJsb2JTQVNTaWduYXR1cmVWYWx1ZXMuY29udGVudEVuY29kaW5nLFxuICAgICAgICBibG9iU0FTU2lnbmF0dXJlVmFsdWVzLmNvbnRlbnRMYW5ndWFnZSxcbiAgICAgICAgYmxvYlNBU1NpZ25hdHVyZVZhbHVlcy5jb250ZW50VHlwZSxcbiAgICBdLmpvaW4oXCJcXG5cIik7XG4gICAgY29uc3Qgc2lnbmF0dXJlID0gdXNlckRlbGVnYXRpb25LZXlDcmVkZW50aWFsLmNvbXB1dGVITUFDU0hBMjU2KHN0cmluZ1RvU2lnbik7XG4gICAgcmV0dXJuIHtcbiAgICAgICAgc2FzUXVlcnlQYXJhbWV0ZXJzOiBuZXcgU0FTUXVlcnlQYXJhbWV0ZXJzKGJsb2JTQVNTaWduYXR1cmVWYWx1ZXMudmVyc2lvbiwgc2lnbmF0dXJlLCB2ZXJpZmllZFBlcm1pc3Npb25zLCB1bmRlZmluZWQsIHVuZGVmaW5lZCwgYmxvYlNBU1NpZ25hdHVyZVZhbHVlcy5wcm90b2NvbCwgYmxvYlNBU1NpZ25hdHVyZVZhbHVlcy5zdGFydHNPbiwgYmxvYlNBU1NpZ25hdHVyZVZhbHVlcy5leHBpcmVzT24sIGJsb2JTQVNTaWduYXR1cmVWYWx1ZXMuaXBSYW5nZSwgYmxvYlNBU1NpZ25hdHVyZVZhbHVlcy5pZGVudGlmaWVyLCByZXNvdXJjZSwgYmxvYlNBU1NpZ25hdHVyZVZhbHVlcy5jYWNoZUNvbnRyb2wsIGJsb2JTQVNTaWduYXR1cmVWYWx1ZXMuY29udGVudERpc3Bvc2l0aW9uLCBibG9iU0FTU2lnbmF0dXJlVmFsdWVzLmNvbnRlbnRFbmNvZGluZywgYmxvYlNBU1NpZ25hdHVyZVZhbHVlcy5jb250ZW50TGFuZ3VhZ2UsIGJsb2JTQVNTaWduYXR1cmVWYWx1ZXMuY29udGVudFR5cGUsIHVzZXJEZWxlZ2F0aW9uS2V5Q3JlZGVudGlhbC51c2VyRGVsZWdhdGlvbktleSksXG4gICAgICAgIHN0cmluZ1RvU2lnbjogc3RyaW5nVG9TaWduLFxuICAgIH07XG59XG4vKipcbiAqIE9OTFkgQVZBSUxBQkxFIElOIE5PREUuSlMgUlVOVElNRS5cbiAqIElNUExFTUVOVEFUSU9OIEZPUiBBUEkgVkVSU0lPTiBGUk9NIDIwMjAtMDItMTAuXG4gKlxuICogQ3JlYXRlcyBhbiBpbnN0YW5jZSBvZiBTQVNRdWVyeVBhcmFtZXRlcnMuXG4gKlxuICogT25seSBhY2NlcHRzIHJlcXVpcmVkIHNldHRpbmdzIG5lZWRlZCB0byBjcmVhdGUgYSBTQVMuIEZvciBvcHRpb25hbCBzZXR0aW5ncyBwbGVhc2VcbiAqIHNldCBjb3JyZXNwb25kaW5nIHByb3BlcnRpZXMgZGlyZWN0bHksIHN1Y2ggYXMgcGVybWlzc2lvbnMsIHN0YXJ0c09uLlxuICpcbiAqIFdBUk5JTkc6IGlkZW50aWZpZXIgd2lsbCBiZSBpZ25vcmVkLCBwZXJtaXNzaW9ucyBhbmQgZXhwaXJlc09uIGFyZSByZXF1aXJlZC5cbiAqXG4gKiBAcGFyYW0gYmxvYlNBU1NpZ25hdHVyZVZhbHVlcyAtXG4gKiBAcGFyYW0gdXNlckRlbGVnYXRpb25LZXlDcmVkZW50aWFsIC1cbiAqL1xuZnVuY3Rpb24gZ2VuZXJhdGVCbG9iU0FTUXVlcnlQYXJhbWV0ZXJzVURLMjAyMDAyMTAoYmxvYlNBU1NpZ25hdHVyZVZhbHVlcywgdXNlckRlbGVnYXRpb25LZXlDcmVkZW50aWFsKSB7XG4gICAgYmxvYlNBU1NpZ25hdHVyZVZhbHVlcyA9IFNBU1NpZ25hdHVyZVZhbHVlc1Nhbml0eUNoZWNrQW5kQXV0b2ZpbGwoYmxvYlNBU1NpZ25hdHVyZVZhbHVlcyk7XG4gICAgLy8gU3RvcmVkIGFjY2VzcyBwb2xpY2llcyBhcmUgbm90IHN1cHBvcnRlZCBmb3IgYSB1c2VyIGRlbGVnYXRpb24gU0FTLlxuICAgIGlmICghYmxvYlNBU1NpZ25hdHVyZVZhbHVlcy5wZXJtaXNzaW9ucyB8fCAhYmxvYlNBU1NpZ25hdHVyZVZhbHVlcy5leHBpcmVzT24pIHtcbiAgICAgICAgdGhyb3cgbmV3IFJhbmdlRXJyb3IoXCJNdXN0IHByb3ZpZGUgJ3Blcm1pc3Npb25zJyBhbmQgJ2V4cGlyZXNPbicgZm9yIEJsb2IgU0FTIGdlbmVyYXRpb24gd2hlbiBnZW5lcmF0aW5nIHVzZXIgZGVsZWdhdGlvbiBTQVMuXCIpO1xuICAgIH1cbiAgICBsZXQgcmVzb3VyY2UgPSBcImNcIjtcbiAgICBsZXQgdGltZXN0YW1wID0gYmxvYlNBU1NpZ25hdHVyZVZhbHVlcy5zbmFwc2hvdFRpbWU7XG4gICAgaWYgKGJsb2JTQVNTaWduYXR1cmVWYWx1ZXMuYmxvYk5hbWUpIHtcbiAgICAgICAgcmVzb3VyY2UgPSBcImJcIjtcbiAgICAgICAgaWYgKGJsb2JTQVNTaWduYXR1cmVWYWx1ZXMuc25hcHNob3RUaW1lKSB7XG4gICAgICAgICAgICByZXNvdXJjZSA9IFwiYnNcIjtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIGlmIChibG9iU0FTU2lnbmF0dXJlVmFsdWVzLnZlcnNpb25JZCkge1xuICAgICAgICAgICAgcmVzb3VyY2UgPSBcImJ2XCI7XG4gICAgICAgICAgICB0aW1lc3RhbXAgPSBibG9iU0FTU2lnbmF0dXJlVmFsdWVzLnZlcnNpb25JZDtcbiAgICAgICAgfVxuICAgIH1cbiAgICAvLyBDYWxsaW5nIHBhcnNlIGFuZCB0b1N0cmluZyBndWFyYW50ZWVzIHRoZSBwcm9wZXIgb3JkZXJpbmcgYW5kIHRocm93cyBvbiBpbnZhbGlkIGNoYXJhY3RlcnMuXG4gICAgbGV0IHZlcmlmaWVkUGVybWlzc2lvbnM7XG4gICAgaWYgKGJsb2JTQVNTaWduYXR1cmVWYWx1ZXMucGVybWlzc2lvbnMpIHtcbiAgICAgICAgaWYgKGJsb2JTQVNTaWduYXR1cmVWYWx1ZXMuYmxvYk5hbWUpIHtcbiAgICAgICAgICAgIHZlcmlmaWVkUGVybWlzc2lvbnMgPSBCbG9iU0FTUGVybWlzc2lvbnMucGFyc2UoYmxvYlNBU1NpZ25hdHVyZVZhbHVlcy5wZXJtaXNzaW9ucy50b1N0cmluZygpKS50b1N0cmluZygpO1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgdmVyaWZpZWRQZXJtaXNzaW9ucyA9IENvbnRhaW5lclNBU1Blcm1pc3Npb25zLnBhcnNlKGJsb2JTQVNTaWduYXR1cmVWYWx1ZXMucGVybWlzc2lvbnMudG9TdHJpbmcoKSkudG9TdHJpbmcoKTtcbiAgICAgICAgfVxuICAgIH1cbiAgICAvLyBTaWduYXR1cmUgaXMgZ2VuZXJhdGVkIG9uIHRoZSB1bi11cmwtZW5jb2RlZCB2YWx1ZXMuXG4gICAgY29uc3Qgc3RyaW5nVG9TaWduID0gW1xuICAgICAgICB2ZXJpZmllZFBlcm1pc3Npb25zID8gdmVyaWZpZWRQZXJtaXNzaW9ucyA6IFwiXCIsXG4gICAgICAgIGJsb2JTQVNTaWduYXR1cmVWYWx1ZXMuc3RhcnRzT25cbiAgICAgICAgICAgID8gdHJ1bmNhdGVkSVNPODA2MURhdGUoYmxvYlNBU1NpZ25hdHVyZVZhbHVlcy5zdGFydHNPbiwgZmFsc2UpXG4gICAgICAgICAgICA6IFwiXCIsXG4gICAgICAgIGJsb2JTQVNTaWduYXR1cmVWYWx1ZXMuZXhwaXJlc09uXG4gICAgICAgICAgICA/IHRydW5jYXRlZElTTzgwNjFEYXRlKGJsb2JTQVNTaWduYXR1cmVWYWx1ZXMuZXhwaXJlc09uLCBmYWxzZSlcbiAgICAgICAgICAgIDogXCJcIixcbiAgICAgICAgZ2V0Q2Fub25pY2FsTmFtZSh1c2VyRGVsZWdhdGlvbktleUNyZWRlbnRpYWwuYWNjb3VudE5hbWUsIGJsb2JTQVNTaWduYXR1cmVWYWx1ZXMuY29udGFpbmVyTmFtZSwgYmxvYlNBU1NpZ25hdHVyZVZhbHVlcy5ibG9iTmFtZSksXG4gICAgICAgIHVzZXJEZWxlZ2F0aW9uS2V5Q3JlZGVudGlhbC51c2VyRGVsZWdhdGlvbktleS5zaWduZWRPYmplY3RJZCxcbiAgICAgICAgdXNlckRlbGVnYXRpb25LZXlDcmVkZW50aWFsLnVzZXJEZWxlZ2F0aW9uS2V5LnNpZ25lZFRlbmFudElkLFxuICAgICAgICB1c2VyRGVsZWdhdGlvbktleUNyZWRlbnRpYWwudXNlckRlbGVnYXRpb25LZXkuc2lnbmVkU3RhcnRzT25cbiAgICAgICAgICAgID8gdHJ1bmNhdGVkSVNPODA2MURhdGUodXNlckRlbGVnYXRpb25LZXlDcmVkZW50aWFsLnVzZXJEZWxlZ2F0aW9uS2V5LnNpZ25lZFN0YXJ0c09uLCBmYWxzZSlcbiAgICAgICAgICAgIDogXCJcIixcbiAgICAgICAgdXNlckRlbGVnYXRpb25LZXlDcmVkZW50aWFsLnVzZXJEZWxlZ2F0aW9uS2V5LnNpZ25lZEV4cGlyZXNPblxuICAgICAgICAgICAgPyB0cnVuY2F0ZWRJU084MDYxRGF0ZSh1c2VyRGVsZWdhdGlvbktleUNyZWRlbnRpYWwudXNlckRlbGVnYXRpb25LZXkuc2lnbmVkRXhwaXJlc09uLCBmYWxzZSlcbiAgICAgICAgICAgIDogXCJcIixcbiAgICAgICAgdXNlckRlbGVnYXRpb25LZXlDcmVkZW50aWFsLnVzZXJEZWxlZ2F0aW9uS2V5LnNpZ25lZFNlcnZpY2UsXG4gICAgICAgIHVzZXJEZWxlZ2F0aW9uS2V5Q3JlZGVudGlhbC51c2VyRGVsZWdhdGlvbktleS5zaWduZWRWZXJzaW9uLFxuICAgICAgICBibG9iU0FTU2lnbmF0dXJlVmFsdWVzLnByZWF1dGhvcml6ZWRBZ2VudE9iamVjdElkLFxuICAgICAgICB1bmRlZmluZWQsIC8vIGFnZW50T2JqZWN0SWRcbiAgICAgICAgYmxvYlNBU1NpZ25hdHVyZVZhbHVlcy5jb3JyZWxhdGlvbklkLFxuICAgICAgICBibG9iU0FTU2lnbmF0dXJlVmFsdWVzLmlwUmFuZ2UgPyBpcFJhbmdlVG9TdHJpbmcoYmxvYlNBU1NpZ25hdHVyZVZhbHVlcy5pcFJhbmdlKSA6IFwiXCIsXG4gICAgICAgIGJsb2JTQVNTaWduYXR1cmVWYWx1ZXMucHJvdG9jb2wgPyBibG9iU0FTU2lnbmF0dXJlVmFsdWVzLnByb3RvY29sIDogXCJcIixcbiAgICAgICAgYmxvYlNBU1NpZ25hdHVyZVZhbHVlcy52ZXJzaW9uLFxuICAgICAgICByZXNvdXJjZSxcbiAgICAgICAgdGltZXN0YW1wLFxuICAgICAgICBibG9iU0FTU2lnbmF0dXJlVmFsdWVzLmNhY2hlQ29udHJvbCxcbiAgICAgICAgYmxvYlNBU1NpZ25hdHVyZVZhbHVlcy5jb250ZW50RGlzcG9zaXRpb24sXG4gICAgICAgIGJsb2JTQVNTaWduYXR1cmVWYWx1ZXMuY29udGVudEVuY29kaW5nLFxuICAgICAgICBibG9iU0FTU2lnbmF0dXJlVmFsdWVzLmNvbnRlbnRMYW5ndWFnZSxcbiAgICAgICAgYmxvYlNBU1NpZ25hdHVyZVZhbHVlcy5jb250ZW50VHlwZSxcbiAgICBdLmpvaW4oXCJcXG5cIik7XG4gICAgY29uc3Qgc2lnbmF0dXJlID0gdXNlckRlbGVnYXRpb25LZXlDcmVkZW50aWFsLmNvbXB1dGVITUFDU0hBMjU2KHN0cmluZ1RvU2lnbik7XG4gICAgcmV0dXJuIHtcbiAgICAgICAgc2FzUXVlcnlQYXJhbWV0ZXJzOiBuZXcgU0FTUXVlcnlQYXJhbWV0ZXJzKGJsb2JTQVNTaWduYXR1cmVWYWx1ZXMudmVyc2lvbiwgc2lnbmF0dXJlLCB2ZXJpZmllZFBlcm1pc3Npb25zLCB1bmRlZmluZWQsIHVuZGVmaW5lZCwgYmxvYlNBU1NpZ25hdHVyZVZhbHVlcy5wcm90b2NvbCwgYmxvYlNBU1NpZ25hdHVyZVZhbHVlcy5zdGFydHNPbiwgYmxvYlNBU1NpZ25hdHVyZVZhbHVlcy5leHBpcmVzT24sIGJsb2JTQVNTaWduYXR1cmVWYWx1ZXMuaXBSYW5nZSwgYmxvYlNBU1NpZ25hdHVyZVZhbHVlcy5pZGVudGlmaWVyLCByZXNvdXJjZSwgYmxvYlNBU1NpZ25hdHVyZVZhbHVlcy5jYWNoZUNvbnRyb2wsIGJsb2JTQVNTaWduYXR1cmVWYWx1ZXMuY29udGVudERpc3Bvc2l0aW9uLCBibG9iU0FTU2lnbmF0dXJlVmFsdWVzLmNvbnRlbnRFbmNvZGluZywgYmxvYlNBU1NpZ25hdHVyZVZhbHVlcy5jb250ZW50TGFuZ3VhZ2UsIGJsb2JTQVNTaWduYXR1cmVWYWx1ZXMuY29udGVudFR5cGUsIHVzZXJEZWxlZ2F0aW9uS2V5Q3JlZGVudGlhbC51c2VyRGVsZWdhdGlvbktleSwgYmxvYlNBU1NpZ25hdHVyZVZhbHVlcy5wcmVhdXRob3JpemVkQWdlbnRPYmplY3RJZCwgYmxvYlNBU1NpZ25hdHVyZVZhbHVlcy5jb3JyZWxhdGlvbklkKSxcbiAgICAgICAgc3RyaW5nVG9TaWduOiBzdHJpbmdUb1NpZ24sXG4gICAgfTtcbn1cbi8qKlxuICogT05MWSBBVkFJTEFCTEUgSU4gTk9ERS5KUyBSVU5USU1FLlxuICogSU1QTEVNRU5UQVRJT04gRk9SIEFQSSBWRVJTSU9OIEZST00gMjAyMC0xMi0wNi5cbiAqXG4gKiBDcmVhdGVzIGFuIGluc3RhbmNlIG9mIFNBU1F1ZXJ5UGFyYW1ldGVycy5cbiAqXG4gKiBPbmx5IGFjY2VwdHMgcmVxdWlyZWQgc2V0dGluZ3MgbmVlZGVkIHRvIGNyZWF0ZSBhIFNBUy4gRm9yIG9wdGlvbmFsIHNldHRpbmdzIHBsZWFzZVxuICogc2V0IGNvcnJlc3BvbmRpbmcgcHJvcGVydGllcyBkaXJlY3RseSwgc3VjaCBhcyBwZXJtaXNzaW9ucywgc3RhcnRzT24uXG4gKlxuICogV0FSTklORzogaWRlbnRpZmllciB3aWxsIGJlIGlnbm9yZWQsIHBlcm1pc3Npb25zIGFuZCBleHBpcmVzT24gYXJlIHJlcXVpcmVkLlxuICpcbiAqIEBwYXJhbSBibG9iU0FTU2lnbmF0dXJlVmFsdWVzIC1cbiAqIEBwYXJhbSB1c2VyRGVsZWdhdGlvbktleUNyZWRlbnRpYWwgLVxuICovXG5mdW5jdGlvbiBnZW5lcmF0ZUJsb2JTQVNRdWVyeVBhcmFtZXRlcnNVREsyMDIwMTIwNihibG9iU0FTU2lnbmF0dXJlVmFsdWVzLCB1c2VyRGVsZWdhdGlvbktleUNyZWRlbnRpYWwpIHtcbiAgICBibG9iU0FTU2lnbmF0dXJlVmFsdWVzID0gU0FTU2lnbmF0dXJlVmFsdWVzU2FuaXR5Q2hlY2tBbmRBdXRvZmlsbChibG9iU0FTU2lnbmF0dXJlVmFsdWVzKTtcbiAgICAvLyBTdG9yZWQgYWNjZXNzIHBvbGljaWVzIGFyZSBub3Qgc3VwcG9ydGVkIGZvciBhIHVzZXIgZGVsZWdhdGlvbiBTQVMuXG4gICAgaWYgKCFibG9iU0FTU2lnbmF0dXJlVmFsdWVzLnBlcm1pc3Npb25zIHx8ICFibG9iU0FTU2lnbmF0dXJlVmFsdWVzLmV4cGlyZXNPbikge1xuICAgICAgICB0aHJvdyBuZXcgUmFuZ2VFcnJvcihcIk11c3QgcHJvdmlkZSAncGVybWlzc2lvbnMnIGFuZCAnZXhwaXJlc09uJyBmb3IgQmxvYiBTQVMgZ2VuZXJhdGlvbiB3aGVuIGdlbmVyYXRpbmcgdXNlciBkZWxlZ2F0aW9uIFNBUy5cIik7XG4gICAgfVxuICAgIGxldCByZXNvdXJjZSA9IFwiY1wiO1xuICAgIGxldCB0aW1lc3RhbXAgPSBibG9iU0FTU2lnbmF0dXJlVmFsdWVzLnNuYXBzaG90VGltZTtcbiAgICBpZiAoYmxvYlNBU1NpZ25hdHVyZVZhbHVlcy5ibG9iTmFtZSkge1xuICAgICAgICByZXNvdXJjZSA9IFwiYlwiO1xuICAgICAgICBpZiAoYmxvYlNBU1NpZ25hdHVyZVZhbHVlcy5zbmFwc2hvdFRpbWUpIHtcbiAgICAgICAgICAgIHJlc291cmNlID0gXCJic1wiO1xuICAgICAgICB9XG4gICAgICAgIGVsc2UgaWYgKGJsb2JTQVNTaWduYXR1cmVWYWx1ZXMudmVyc2lvbklkKSB7XG4gICAgICAgICAgICByZXNvdXJjZSA9IFwiYnZcIjtcbiAgICAgICAgICAgIHRpbWVzdGFtcCA9IGJsb2JTQVNTaWduYXR1cmVWYWx1ZXMudmVyc2lvbklkO1xuICAgICAgICB9XG4gICAgfVxuICAgIC8vIENhbGxpbmcgcGFyc2UgYW5kIHRvU3RyaW5nIGd1YXJhbnRlZXMgdGhlIHByb3BlciBvcmRlcmluZyBhbmQgdGhyb3dzIG9uIGludmFsaWQgY2hhcmFjdGVycy5cbiAgICBsZXQgdmVyaWZpZWRQZXJtaXNzaW9ucztcbiAgICBpZiAoYmxvYlNBU1NpZ25hdHVyZVZhbHVlcy5wZXJtaXNzaW9ucykge1xuICAgICAgICBpZiAoYmxvYlNBU1NpZ25hdHVyZVZhbHVlcy5ibG9iTmFtZSkge1xuICAgICAgICAgICAgdmVyaWZpZWRQZXJtaXNzaW9ucyA9IEJsb2JTQVNQZXJtaXNzaW9ucy5wYXJzZShibG9iU0FTU2lnbmF0dXJlVmFsdWVzLnBlcm1pc3Npb25zLnRvU3RyaW5nKCkpLnRvU3RyaW5nKCk7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICB2ZXJpZmllZFBlcm1pc3Npb25zID0gQ29udGFpbmVyU0FTUGVybWlzc2lvbnMucGFyc2UoYmxvYlNBU1NpZ25hdHVyZVZhbHVlcy5wZXJtaXNzaW9ucy50b1N0cmluZygpKS50b1N0cmluZygpO1xuICAgICAgICB9XG4gICAgfVxuICAgIC8vIFNpZ25hdHVyZSBpcyBnZW5lcmF0ZWQgb24gdGhlIHVuLXVybC1lbmNvZGVkIHZhbHVlcy5cbiAgICBjb25zdCBzdHJpbmdUb1NpZ24gPSBbXG4gICAgICAgIHZlcmlmaWVkUGVybWlzc2lvbnMgPyB2ZXJpZmllZFBlcm1pc3Npb25zIDogXCJcIixcbiAgICAgICAgYmxvYlNBU1NpZ25hdHVyZVZhbHVlcy5zdGFydHNPblxuICAgICAgICAgICAgPyB0cnVuY2F0ZWRJU084MDYxRGF0ZShibG9iU0FTU2lnbmF0dXJlVmFsdWVzLnN0YXJ0c09uLCBmYWxzZSlcbiAgICAgICAgICAgIDogXCJcIixcbiAgICAgICAgYmxvYlNBU1NpZ25hdHVyZVZhbHVlcy5leHBpcmVzT25cbiAgICAgICAgICAgID8gdHJ1bmNhdGVkSVNPODA2MURhdGUoYmxvYlNBU1NpZ25hdHVyZVZhbHVlcy5leHBpcmVzT24sIGZhbHNlKVxuICAgICAgICAgICAgOiBcIlwiLFxuICAgICAgICBnZXRDYW5vbmljYWxOYW1lKHVzZXJEZWxlZ2F0aW9uS2V5Q3JlZGVudGlhbC5hY2NvdW50TmFtZSwgYmxvYlNBU1NpZ25hdHVyZVZhbHVlcy5jb250YWluZXJOYW1lLCBibG9iU0FTU2lnbmF0dXJlVmFsdWVzLmJsb2JOYW1lKSxcbiAgICAgICAgdXNlckRlbGVnYXRpb25LZXlDcmVkZW50aWFsLnVzZXJEZWxlZ2F0aW9uS2V5LnNpZ25lZE9iamVjdElkLFxuICAgICAgICB1c2VyRGVsZWdhdGlvbktleUNyZWRlbnRpYWwudXNlckRlbGVnYXRpb25LZXkuc2lnbmVkVGVuYW50SWQsXG4gICAgICAgIHVzZXJEZWxlZ2F0aW9uS2V5Q3JlZGVudGlhbC51c2VyRGVsZWdhdGlvbktleS5zaWduZWRTdGFydHNPblxuICAgICAgICAgICAgPyB0cnVuY2F0ZWRJU084MDYxRGF0ZSh1c2VyRGVsZWdhdGlvbktleUNyZWRlbnRpYWwudXNlckRlbGVnYXRpb25LZXkuc2lnbmVkU3RhcnRzT24sIGZhbHNlKVxuICAgICAgICAgICAgOiBcIlwiLFxuICAgICAgICB1c2VyRGVsZWdhdGlvbktleUNyZWRlbnRpYWwudXNlckRlbGVnYXRpb25LZXkuc2lnbmVkRXhwaXJlc09uXG4gICAgICAgICAgICA/IHRydW5jYXRlZElTTzgwNjFEYXRlKHVzZXJEZWxlZ2F0aW9uS2V5Q3JlZGVudGlhbC51c2VyRGVsZWdhdGlvbktleS5zaWduZWRFeHBpcmVzT24sIGZhbHNlKVxuICAgICAgICAgICAgOiBcIlwiLFxuICAgICAgICB1c2VyRGVsZWdhdGlvbktleUNyZWRlbnRpYWwudXNlckRlbGVnYXRpb25LZXkuc2lnbmVkU2VydmljZSxcbiAgICAgICAgdXNlckRlbGVnYXRpb25LZXlDcmVkZW50aWFsLnVzZXJEZWxlZ2F0aW9uS2V5LnNpZ25lZFZlcnNpb24sXG4gICAgICAgIGJsb2JTQVNTaWduYXR1cmVWYWx1ZXMucHJlYXV0aG9yaXplZEFnZW50T2JqZWN0SWQsXG4gICAgICAgIHVuZGVmaW5lZCwgLy8gYWdlbnRPYmplY3RJZFxuICAgICAgICBibG9iU0FTU2lnbmF0dXJlVmFsdWVzLmNvcnJlbGF0aW9uSWQsXG4gICAgICAgIGJsb2JTQVNTaWduYXR1cmVWYWx1ZXMuaXBSYW5nZSA/IGlwUmFuZ2VUb1N0cmluZyhibG9iU0FTU2lnbmF0dXJlVmFsdWVzLmlwUmFuZ2UpIDogXCJcIixcbiAgICAgICAgYmxvYlNBU1NpZ25hdHVyZVZhbHVlcy5wcm90b2NvbCA/IGJsb2JTQVNTaWduYXR1cmVWYWx1ZXMucHJvdG9jb2wgOiBcIlwiLFxuICAgICAgICBibG9iU0FTU2lnbmF0dXJlVmFsdWVzLnZlcnNpb24sXG4gICAgICAgIHJlc291cmNlLFxuICAgICAgICB0aW1lc3RhbXAsXG4gICAgICAgIGJsb2JTQVNTaWduYXR1cmVWYWx1ZXMuZW5jcnlwdGlvblNjb3BlLFxuICAgICAgICBibG9iU0FTU2lnbmF0dXJlVmFsdWVzLmNhY2hlQ29udHJvbCxcbiAgICAgICAgYmxvYlNBU1NpZ25hdHVyZVZhbHVlcy5jb250ZW50RGlzcG9zaXRpb24sXG4gICAgICAgIGJsb2JTQVNTaWduYXR1cmVWYWx1ZXMuY29udGVudEVuY29kaW5nLFxuICAgICAgICBibG9iU0FTU2lnbmF0dXJlVmFsdWVzLmNvbnRlbnRMYW5ndWFnZSxcbiAgICAgICAgYmxvYlNBU1NpZ25hdHVyZVZhbHVlcy5jb250ZW50VHlwZSxcbiAgICBdLmpvaW4oXCJcXG5cIik7XG4gICAgY29uc3Qgc2lnbmF0dXJlID0gdXNlckRlbGVnYXRpb25LZXlDcmVkZW50aWFsLmNvbXB1dGVITUFDU0hBMjU2KHN0cmluZ1RvU2lnbik7XG4gICAgcmV0dXJuIHtcbiAgICAgICAgc2FzUXVlcnlQYXJhbWV0ZXJzOiBuZXcgU0FTUXVlcnlQYXJhbWV0ZXJzKGJsb2JTQVNTaWduYXR1cmVWYWx1ZXMudmVyc2lvbiwgc2lnbmF0dXJlLCB2ZXJpZmllZFBlcm1pc3Npb25zLCB1bmRlZmluZWQsIHVuZGVmaW5lZCwgYmxvYlNBU1NpZ25hdHVyZVZhbHVlcy5wcm90b2NvbCwgYmxvYlNBU1NpZ25hdHVyZVZhbHVlcy5zdGFydHNPbiwgYmxvYlNBU1NpZ25hdHVyZVZhbHVlcy5leHBpcmVzT24sIGJsb2JTQVNTaWduYXR1cmVWYWx1ZXMuaXBSYW5nZSwgYmxvYlNBU1NpZ25hdHVyZVZhbHVlcy5pZGVudGlmaWVyLCByZXNvdXJjZSwgYmxvYlNBU1NpZ25hdHVyZVZhbHVlcy5jYWNoZUNvbnRyb2wsIGJsb2JTQVNTaWduYXR1cmVWYWx1ZXMuY29udGVudERpc3Bvc2l0aW9uLCBibG9iU0FTU2lnbmF0dXJlVmFsdWVzLmNvbnRlbnRFbmNvZGluZywgYmxvYlNBU1NpZ25hdHVyZVZhbHVlcy5jb250ZW50TGFuZ3VhZ2UsIGJsb2JTQVNTaWduYXR1cmVWYWx1ZXMuY29udGVudFR5cGUsIHVzZXJEZWxlZ2F0aW9uS2V5Q3JlZGVudGlhbC51c2VyRGVsZWdhdGlvbktleSwgYmxvYlNBU1NpZ25hdHVyZVZhbHVlcy5wcmVhdXRob3JpemVkQWdlbnRPYmplY3RJZCwgYmxvYlNBU1NpZ25hdHVyZVZhbHVlcy5jb3JyZWxhdGlvbklkLCBibG9iU0FTU2lnbmF0dXJlVmFsdWVzLmVuY3J5cHRpb25TY29wZSksXG4gICAgICAgIHN0cmluZ1RvU2lnbjogc3RyaW5nVG9TaWduLFxuICAgIH07XG59XG5mdW5jdGlvbiBnZXRDYW5vbmljYWxOYW1lKGFjY291bnROYW1lLCBjb250YWluZXJOYW1lLCBibG9iTmFtZSkge1xuICAgIC8vIENvbnRhaW5lcjogXCIvYmxvYi9hY2NvdW50L2NvbnRhaW5lck5hbWVcIlxuICAgIC8vIEJsb2I6ICAgICAgXCIvYmxvYi9hY2NvdW50L2NvbnRhaW5lck5hbWUvYmxvYk5hbWVcIlxuICAgIGNvbnN0IGVsZW1lbnRzID0gW2AvYmxvYi8ke2FjY291bnROYW1lfS8ke2NvbnRhaW5lck5hbWV9YF07XG4gICAgaWYgKGJsb2JOYW1lKSB7XG4gICAgICAgIGVsZW1lbnRzLnB1c2goYC8ke2Jsb2JOYW1lfWApO1xuICAgIH1cbiAgICByZXR1cm4gZWxlbWVudHMuam9pbihcIlwiKTtcbn1cbmZ1bmN0aW9uIFNBU1NpZ25hdHVyZVZhbHVlc1Nhbml0eUNoZWNrQW5kQXV0b2ZpbGwoYmxvYlNBU1NpZ25hdHVyZVZhbHVlcykge1xuICAgIGNvbnN0IHZlcnNpb24gPSBibG9iU0FTU2lnbmF0dXJlVmFsdWVzLnZlcnNpb24gPyBibG9iU0FTU2lnbmF0dXJlVmFsdWVzLnZlcnNpb24gOiBTRVJWSUNFX1ZFUlNJT047XG4gICAgaWYgKGJsb2JTQVNTaWduYXR1cmVWYWx1ZXMuc25hcHNob3RUaW1lICYmIHZlcnNpb24gPCBcIjIwMTgtMTEtMDlcIikge1xuICAgICAgICB0aHJvdyBSYW5nZUVycm9yKFwiJ3ZlcnNpb24nIG11c3QgYmUgPj0gJzIwMTgtMTEtMDknIHdoZW4gcHJvdmlkaW5nICdzbmFwc2hvdFRpbWUnLlwiKTtcbiAgICB9XG4gICAgaWYgKGJsb2JTQVNTaWduYXR1cmVWYWx1ZXMuYmxvYk5hbWUgPT09IHVuZGVmaW5lZCAmJiBibG9iU0FTU2lnbmF0dXJlVmFsdWVzLnNuYXBzaG90VGltZSkge1xuICAgICAgICB0aHJvdyBSYW5nZUVycm9yKFwiTXVzdCBwcm92aWRlICdibG9iTmFtZScgd2hlbiBwcm92aWRpbmcgJ3NuYXBzaG90VGltZScuXCIpO1xuICAgIH1cbiAgICBpZiAoYmxvYlNBU1NpZ25hdHVyZVZhbHVlcy52ZXJzaW9uSWQgJiYgdmVyc2lvbiA8IFwiMjAxOS0xMC0xMFwiKSB7XG4gICAgICAgIHRocm93IFJhbmdlRXJyb3IoXCIndmVyc2lvbicgbXVzdCBiZSA+PSAnMjAxOS0xMC0xMCcgd2hlbiBwcm92aWRpbmcgJ3ZlcnNpb25JZCcuXCIpO1xuICAgIH1cbiAgICBpZiAoYmxvYlNBU1NpZ25hdHVyZVZhbHVlcy5ibG9iTmFtZSA9PT0gdW5kZWZpbmVkICYmIGJsb2JTQVNTaWduYXR1cmVWYWx1ZXMudmVyc2lvbklkKSB7XG4gICAgICAgIHRocm93IFJhbmdlRXJyb3IoXCJNdXN0IHByb3ZpZGUgJ2Jsb2JOYW1lJyB3aGVuIHByb3ZpZGluZyAndmVyc2lvbklkJy5cIik7XG4gICAgfVxuICAgIGlmIChibG9iU0FTU2lnbmF0dXJlVmFsdWVzLnBlcm1pc3Npb25zICYmXG4gICAgICAgIGJsb2JTQVNTaWduYXR1cmVWYWx1ZXMucGVybWlzc2lvbnMuc2V0SW1tdXRhYmlsaXR5UG9saWN5ICYmXG4gICAgICAgIHZlcnNpb24gPCBcIjIwMjAtMDgtMDRcIikge1xuICAgICAgICB0aHJvdyBSYW5nZUVycm9yKFwiJ3ZlcnNpb24nIG11c3QgYmUgPj0gJzIwMjAtMDgtMDQnIHdoZW4gcHJvdmlkZWQgJ2knIHBlcm1pc3Npb24uXCIpO1xuICAgIH1cbiAgICBpZiAoYmxvYlNBU1NpZ25hdHVyZVZhbHVlcy5wZXJtaXNzaW9ucyAmJlxuICAgICAgICBibG9iU0FTU2lnbmF0dXJlVmFsdWVzLnBlcm1pc3Npb25zLmRlbGV0ZVZlcnNpb24gJiZcbiAgICAgICAgdmVyc2lvbiA8IFwiMjAxOS0xMC0xMFwiKSB7XG4gICAgICAgIHRocm93IFJhbmdlRXJyb3IoXCIndmVyc2lvbicgbXVzdCBiZSA+PSAnMjAxOS0xMC0xMCcgd2hlbiBwcm92aWRpbmcgJ3gnIHBlcm1pc3Npb24uXCIpO1xuICAgIH1cbiAgICBpZiAoYmxvYlNBU1NpZ25hdHVyZVZhbHVlcy5wZXJtaXNzaW9ucyAmJlxuICAgICAgICBibG9iU0FTU2lnbmF0dXJlVmFsdWVzLnBlcm1pc3Npb25zLnBlcm1hbmVudERlbGV0ZSAmJlxuICAgICAgICB2ZXJzaW9uIDwgXCIyMDE5LTEwLTEwXCIpIHtcbiAgICAgICAgdGhyb3cgUmFuZ2VFcnJvcihcIid2ZXJzaW9uJyBtdXN0IGJlID49ICcyMDE5LTEwLTEwJyB3aGVuIHByb3ZpZGluZyAneScgcGVybWlzc2lvbi5cIik7XG4gICAgfVxuICAgIGlmIChibG9iU0FTU2lnbmF0dXJlVmFsdWVzLnBlcm1pc3Npb25zICYmXG4gICAgICAgIGJsb2JTQVNTaWduYXR1cmVWYWx1ZXMucGVybWlzc2lvbnMudGFnICYmXG4gICAgICAgIHZlcnNpb24gPCBcIjIwMTktMTItMTJcIikge1xuICAgICAgICB0aHJvdyBSYW5nZUVycm9yKFwiJ3ZlcnNpb24nIG11c3QgYmUgPj0gJzIwMTktMTItMTInIHdoZW4gcHJvdmlkaW5nICd0JyBwZXJtaXNzaW9uLlwiKTtcbiAgICB9XG4gICAgaWYgKHZlcnNpb24gPCBcIjIwMjAtMDItMTBcIiAmJlxuICAgICAgICBibG9iU0FTU2lnbmF0dXJlVmFsdWVzLnBlcm1pc3Npb25zICYmXG4gICAgICAgIChibG9iU0FTU2lnbmF0dXJlVmFsdWVzLnBlcm1pc3Npb25zLm1vdmUgfHwgYmxvYlNBU1NpZ25hdHVyZVZhbHVlcy5wZXJtaXNzaW9ucy5leGVjdXRlKSkge1xuICAgICAgICB0aHJvdyBSYW5nZUVycm9yKFwiJ3ZlcnNpb24nIG11c3QgYmUgPj0gJzIwMjAtMDItMTAnIHdoZW4gcHJvdmlkaW5nIHRoZSAnbScgb3IgJ2UnIHBlcm1pc3Npb24uXCIpO1xuICAgIH1cbiAgICBpZiAodmVyc2lvbiA8IFwiMjAyMS0wNC0xMFwiICYmXG4gICAgICAgIGJsb2JTQVNTaWduYXR1cmVWYWx1ZXMucGVybWlzc2lvbnMgJiZcbiAgICAgICAgYmxvYlNBU1NpZ25hdHVyZVZhbHVlcy5wZXJtaXNzaW9ucy5maWx0ZXJCeVRhZ3MpIHtcbiAgICAgICAgdGhyb3cgUmFuZ2VFcnJvcihcIid2ZXJzaW9uJyBtdXN0IGJlID49ICcyMDIxLTA0LTEwJyB3aGVuIHByb3ZpZGluZyB0aGUgJ2YnIHBlcm1pc3Npb24uXCIpO1xuICAgIH1cbiAgICBpZiAodmVyc2lvbiA8IFwiMjAyMC0wMi0xMFwiICYmXG4gICAgICAgIChibG9iU0FTU2lnbmF0dXJlVmFsdWVzLnByZWF1dGhvcml6ZWRBZ2VudE9iamVjdElkIHx8IGJsb2JTQVNTaWduYXR1cmVWYWx1ZXMuY29ycmVsYXRpb25JZCkpIHtcbiAgICAgICAgdGhyb3cgUmFuZ2VFcnJvcihcIid2ZXJzaW9uJyBtdXN0IGJlID49ICcyMDIwLTAyLTEwJyB3aGVuIHByb3ZpZGluZyAncHJlYXV0aG9yaXplZEFnZW50T2JqZWN0SWQnIG9yICdjb3JyZWxhdGlvbklkJy5cIik7XG4gICAgfVxuICAgIGlmIChibG9iU0FTU2lnbmF0dXJlVmFsdWVzLmVuY3J5cHRpb25TY29wZSAmJiB2ZXJzaW9uIDwgXCIyMDIwLTEyLTA2XCIpIHtcbiAgICAgICAgdGhyb3cgUmFuZ2VFcnJvcihcIid2ZXJzaW9uJyBtdXN0IGJlID49ICcyMDIwLTEyLTA2JyB3aGVuIHByb3ZpZGVkICdlbmNyeXB0aW9uU2NvcGUnIGluIFNBUy5cIik7XG4gICAgfVxuICAgIGJsb2JTQVNTaWduYXR1cmVWYWx1ZXMudmVyc2lvbiA9IHZlcnNpb247XG4gICAgcmV0dXJuIGJsb2JTQVNTaWduYXR1cmVWYWx1ZXM7XG59XG5cbi8vIENvcHlyaWdodCAoYykgTWljcm9zb2Z0IENvcnBvcmF0aW9uLlxuLy8gTGljZW5zZWQgdW5kZXIgdGhlIE1JVCBMaWNlbnNlLlxuLyoqXG4gKiBBIGNsaWVudCB0aGF0IG1hbmFnZXMgbGVhc2VzIGZvciBhIHtAbGluayBDb250YWluZXJDbGllbnR9IG9yIGEge0BsaW5rIEJsb2JDbGllbnR9LlxuICovXG5jbGFzcyBCbG9iTGVhc2VDbGllbnQge1xuICAgIC8qKlxuICAgICAqIEdldHMgdGhlIGxlYXNlIElkLlxuICAgICAqXG4gICAgICogQHJlYWRvbmx5XG4gICAgICovXG4gICAgZ2V0IGxlYXNlSWQoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLl9sZWFzZUlkO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBHZXRzIHRoZSB1cmwuXG4gICAgICpcbiAgICAgKiBAcmVhZG9ubHlcbiAgICAgKi9cbiAgICBnZXQgdXJsKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5fdXJsO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBDcmVhdGVzIGFuIGluc3RhbmNlIG9mIEJsb2JMZWFzZUNsaWVudC5cbiAgICAgKiBAcGFyYW0gY2xpZW50IC0gVGhlIGNsaWVudCB0byBtYWtlIHRoZSBsZWFzZSBvcGVyYXRpb24gcmVxdWVzdHMuXG4gICAgICogQHBhcmFtIGxlYXNlSWQgLSBJbml0aWFsIHByb3Bvc2VkIGxlYXNlIGlkLlxuICAgICAqL1xuICAgIGNvbnN0cnVjdG9yKGNsaWVudCwgbGVhc2VJZCkge1xuICAgICAgICBjb25zdCBjbGllbnRDb250ZXh0ID0gY2xpZW50LnN0b3JhZ2VDbGllbnRDb250ZXh0O1xuICAgICAgICB0aGlzLl91cmwgPSBjbGllbnQudXJsO1xuICAgICAgICBpZiAoY2xpZW50Lm5hbWUgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgdGhpcy5faXNDb250YWluZXIgPSB0cnVlO1xuICAgICAgICAgICAgdGhpcy5fY29udGFpbmVyT3JCbG9iT3BlcmF0aW9uID0gY2xpZW50Q29udGV4dC5jb250YWluZXI7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICB0aGlzLl9pc0NvbnRhaW5lciA9IGZhbHNlO1xuICAgICAgICAgICAgdGhpcy5fY29udGFpbmVyT3JCbG9iT3BlcmF0aW9uID0gY2xpZW50Q29udGV4dC5ibG9iO1xuICAgICAgICB9XG4gICAgICAgIGlmICghbGVhc2VJZCkge1xuICAgICAgICAgICAgbGVhc2VJZCA9IGNvcmVVdGlsLnJhbmRvbVVVSUQoKTtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLl9sZWFzZUlkID0gbGVhc2VJZDtcbiAgICB9XG4gICAgLyoqXG4gICAgICogRXN0YWJsaXNoZXMgYW5kIG1hbmFnZXMgYSBsb2NrIG9uIGEgY29udGFpbmVyIGZvciBkZWxldGUgb3BlcmF0aW9ucywgb3Igb24gYSBibG9iXG4gICAgICogZm9yIHdyaXRlIGFuZCBkZWxldGUgb3BlcmF0aW9ucy5cbiAgICAgKiBUaGUgbG9jayBkdXJhdGlvbiBjYW4gYmUgMTUgdG8gNjAgc2Vjb25kcywgb3IgY2FuIGJlIGluZmluaXRlLlxuICAgICAqIEBzZWUgaHR0cHM6Ly9kb2NzLm1pY3Jvc29mdC5jb20vZW4tdXMvcmVzdC9hcGkvc3RvcmFnZXNlcnZpY2VzL2xlYXNlLWNvbnRhaW5lclxuICAgICAqIGFuZFxuICAgICAqIEBzZWUgaHR0cHM6Ly9kb2NzLm1pY3Jvc29mdC5jb20vZW4tdXMvcmVzdC9hcGkvc3RvcmFnZXNlcnZpY2VzL2xlYXNlLWJsb2JcbiAgICAgKlxuICAgICAqIEBwYXJhbSBkdXJhdGlvbiAtIE11c3QgYmUgYmV0d2VlbiAxNSB0byA2MCBzZWNvbmRzLCBvciBpbmZpbml0ZSAoLTEpXG4gICAgICogQHBhcmFtIG9wdGlvbnMgLSBvcHRpb24gdG8gY29uZmlndXJlIGxlYXNlIG1hbmFnZW1lbnQgb3BlcmF0aW9ucy5cbiAgICAgKiBAcmV0dXJucyBSZXNwb25zZSBkYXRhIGZvciBhY3F1aXJlIGxlYXNlIG9wZXJhdGlvbi5cbiAgICAgKi9cbiAgICBhc3luYyBhY3F1aXJlTGVhc2UoZHVyYXRpb24sIG9wdGlvbnMgPSB7fSkge1xuICAgICAgICB2YXIgX2EsIF9iLCBfYywgX2QsIF9lO1xuICAgICAgICBpZiAodGhpcy5faXNDb250YWluZXIgJiZcbiAgICAgICAgICAgICgoKChfYSA9IG9wdGlvbnMuY29uZGl0aW9ucykgPT09IG51bGwgfHwgX2EgPT09IHZvaWQgMCA/IHZvaWQgMCA6IF9hLmlmTWF0Y2gpICYmICgoX2IgPSBvcHRpb25zLmNvbmRpdGlvbnMpID09PSBudWxsIHx8IF9iID09PSB2b2lkIDAgPyB2b2lkIDAgOiBfYi5pZk1hdGNoKSAhPT0gRVRhZ05vbmUpIHx8XG4gICAgICAgICAgICAgICAgKCgoX2MgPSBvcHRpb25zLmNvbmRpdGlvbnMpID09PSBudWxsIHx8IF9jID09PSB2b2lkIDAgPyB2b2lkIDAgOiBfYy5pZk5vbmVNYXRjaCkgJiYgKChfZCA9IG9wdGlvbnMuY29uZGl0aW9ucykgPT09IG51bGwgfHwgX2QgPT09IHZvaWQgMCA/IHZvaWQgMCA6IF9kLmlmTm9uZU1hdGNoKSAhPT0gRVRhZ05vbmUpIHx8XG4gICAgICAgICAgICAgICAgKChfZSA9IG9wdGlvbnMuY29uZGl0aW9ucykgPT09IG51bGwgfHwgX2UgPT09IHZvaWQgMCA/IHZvaWQgMCA6IF9lLnRhZ0NvbmRpdGlvbnMpKSkge1xuICAgICAgICAgICAgdGhyb3cgbmV3IFJhbmdlRXJyb3IoXCJUaGUgSWZNYXRjaCwgSWZOb25lTWF0Y2ggYW5kIHRhZ3MgYWNjZXNzIGNvbmRpdGlvbnMgYXJlIGlnbm9yZWQgYnkgdGhlIHNlcnZpY2UuIFZhbHVlcyBvdGhlciB0aGFuIHVuZGVmaW5lZCBvciB0aGVpciBkZWZhdWx0IHZhbHVlcyBhcmUgbm90IGFjY2VwdGFibGUuXCIpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB0cmFjaW5nQ2xpZW50LndpdGhTcGFuKFwiQmxvYkxlYXNlQ2xpZW50LWFjcXVpcmVMZWFzZVwiLCBvcHRpb25zLCBhc3luYyAodXBkYXRlZE9wdGlvbnMpID0+IHtcbiAgICAgICAgICAgIHZhciBfYTtcbiAgICAgICAgICAgIHJldHVybiBhc3NlcnRSZXNwb25zZShhd2FpdCB0aGlzLl9jb250YWluZXJPckJsb2JPcGVyYXRpb24uYWNxdWlyZUxlYXNlKHtcbiAgICAgICAgICAgICAgICBhYm9ydFNpZ25hbDogb3B0aW9ucy5hYm9ydFNpZ25hbCxcbiAgICAgICAgICAgICAgICBkdXJhdGlvbixcbiAgICAgICAgICAgICAgICBtb2RpZmllZEFjY2Vzc0NvbmRpdGlvbnM6IE9iamVjdC5hc3NpZ24oT2JqZWN0LmFzc2lnbih7fSwgb3B0aW9ucy5jb25kaXRpb25zKSwgeyBpZlRhZ3M6IChfYSA9IG9wdGlvbnMuY29uZGl0aW9ucykgPT09IG51bGwgfHwgX2EgPT09IHZvaWQgMCA/IHZvaWQgMCA6IF9hLnRhZ0NvbmRpdGlvbnMgfSksXG4gICAgICAgICAgICAgICAgcHJvcG9zZWRMZWFzZUlkOiB0aGlzLl9sZWFzZUlkLFxuICAgICAgICAgICAgICAgIHRyYWNpbmdPcHRpb25zOiB1cGRhdGVkT3B0aW9ucy50cmFjaW5nT3B0aW9ucyxcbiAgICAgICAgICAgIH0pKTtcbiAgICAgICAgfSk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIFRvIGNoYW5nZSB0aGUgSUQgb2YgdGhlIGxlYXNlLlxuICAgICAqIEBzZWUgaHR0cHM6Ly9kb2NzLm1pY3Jvc29mdC5jb20vZW4tdXMvcmVzdC9hcGkvc3RvcmFnZXNlcnZpY2VzL2xlYXNlLWNvbnRhaW5lclxuICAgICAqIGFuZFxuICAgICAqIEBzZWUgaHR0cHM6Ly9kb2NzLm1pY3Jvc29mdC5jb20vZW4tdXMvcmVzdC9hcGkvc3RvcmFnZXNlcnZpY2VzL2xlYXNlLWJsb2JcbiAgICAgKlxuICAgICAqIEBwYXJhbSBwcm9wb3NlZExlYXNlSWQgLSB0aGUgcHJvcG9zZWQgbmV3IGxlYXNlIElkLlxuICAgICAqIEBwYXJhbSBvcHRpb25zIC0gb3B0aW9uIHRvIGNvbmZpZ3VyZSBsZWFzZSBtYW5hZ2VtZW50IG9wZXJhdGlvbnMuXG4gICAgICogQHJldHVybnMgUmVzcG9uc2UgZGF0YSBmb3IgY2hhbmdlIGxlYXNlIG9wZXJhdGlvbi5cbiAgICAgKi9cbiAgICBhc3luYyBjaGFuZ2VMZWFzZShwcm9wb3NlZExlYXNlSWQsIG9wdGlvbnMgPSB7fSkge1xuICAgICAgICB2YXIgX2EsIF9iLCBfYywgX2QsIF9lO1xuICAgICAgICBpZiAodGhpcy5faXNDb250YWluZXIgJiZcbiAgICAgICAgICAgICgoKChfYSA9IG9wdGlvbnMuY29uZGl0aW9ucykgPT09IG51bGwgfHwgX2EgPT09IHZvaWQgMCA/IHZvaWQgMCA6IF9hLmlmTWF0Y2gpICYmICgoX2IgPSBvcHRpb25zLmNvbmRpdGlvbnMpID09PSBudWxsIHx8IF9iID09PSB2b2lkIDAgPyB2b2lkIDAgOiBfYi5pZk1hdGNoKSAhPT0gRVRhZ05vbmUpIHx8XG4gICAgICAgICAgICAgICAgKCgoX2MgPSBvcHRpb25zLmNvbmRpdGlvbnMpID09PSBudWxsIHx8IF9jID09PSB2b2lkIDAgPyB2b2lkIDAgOiBfYy5pZk5vbmVNYXRjaCkgJiYgKChfZCA9IG9wdGlvbnMuY29uZGl0aW9ucykgPT09IG51bGwgfHwgX2QgPT09IHZvaWQgMCA/IHZvaWQgMCA6IF9kLmlmTm9uZU1hdGNoKSAhPT0gRVRhZ05vbmUpIHx8XG4gICAgICAgICAgICAgICAgKChfZSA9IG9wdGlvbnMuY29uZGl0aW9ucykgPT09IG51bGwgfHwgX2UgPT09IHZvaWQgMCA/IHZvaWQgMCA6IF9lLnRhZ0NvbmRpdGlvbnMpKSkge1xuICAgICAgICAgICAgdGhyb3cgbmV3IFJhbmdlRXJyb3IoXCJUaGUgSWZNYXRjaCwgSWZOb25lTWF0Y2ggYW5kIHRhZ3MgYWNjZXNzIGNvbmRpdGlvbnMgYXJlIGlnbm9yZWQgYnkgdGhlIHNlcnZpY2UuIFZhbHVlcyBvdGhlciB0aGFuIHVuZGVmaW5lZCBvciB0aGVpciBkZWZhdWx0IHZhbHVlcyBhcmUgbm90IGFjY2VwdGFibGUuXCIpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB0cmFjaW5nQ2xpZW50LndpdGhTcGFuKFwiQmxvYkxlYXNlQ2xpZW50LWNoYW5nZUxlYXNlXCIsIG9wdGlvbnMsIGFzeW5jICh1cGRhdGVkT3B0aW9ucykgPT4ge1xuICAgICAgICAgICAgdmFyIF9hO1xuICAgICAgICAgICAgY29uc3QgcmVzcG9uc2UgPSBhc3NlcnRSZXNwb25zZShhd2FpdCB0aGlzLl9jb250YWluZXJPckJsb2JPcGVyYXRpb24uY2hhbmdlTGVhc2UodGhpcy5fbGVhc2VJZCwgcHJvcG9zZWRMZWFzZUlkLCB7XG4gICAgICAgICAgICAgICAgYWJvcnRTaWduYWw6IG9wdGlvbnMuYWJvcnRTaWduYWwsXG4gICAgICAgICAgICAgICAgbW9kaWZpZWRBY2Nlc3NDb25kaXRpb25zOiBPYmplY3QuYXNzaWduKE9iamVjdC5hc3NpZ24oe30sIG9wdGlvbnMuY29uZGl0aW9ucyksIHsgaWZUYWdzOiAoX2EgPSBvcHRpb25zLmNvbmRpdGlvbnMpID09PSBudWxsIHx8IF9hID09PSB2b2lkIDAgPyB2b2lkIDAgOiBfYS50YWdDb25kaXRpb25zIH0pLFxuICAgICAgICAgICAgICAgIHRyYWNpbmdPcHRpb25zOiB1cGRhdGVkT3B0aW9ucy50cmFjaW5nT3B0aW9ucyxcbiAgICAgICAgICAgIH0pKTtcbiAgICAgICAgICAgIHRoaXMuX2xlYXNlSWQgPSBwcm9wb3NlZExlYXNlSWQ7XG4gICAgICAgICAgICByZXR1cm4gcmVzcG9uc2U7XG4gICAgICAgIH0pO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBUbyBmcmVlIHRoZSBsZWFzZSBpZiBpdCBpcyBubyBsb25nZXIgbmVlZGVkIHNvIHRoYXQgYW5vdGhlciBjbGllbnQgbWF5XG4gICAgICogaW1tZWRpYXRlbHkgYWNxdWlyZSBhIGxlYXNlIGFnYWluc3QgdGhlIGNvbnRhaW5lciBvciB0aGUgYmxvYi5cbiAgICAgKiBAc2VlIGh0dHBzOi8vZG9jcy5taWNyb3NvZnQuY29tL2VuLXVzL3Jlc3QvYXBpL3N0b3JhZ2VzZXJ2aWNlcy9sZWFzZS1jb250YWluZXJcbiAgICAgKiBhbmRcbiAgICAgKiBAc2VlIGh0dHBzOi8vZG9jcy5taWNyb3NvZnQuY29tL2VuLXVzL3Jlc3QvYXBpL3N0b3JhZ2VzZXJ2aWNlcy9sZWFzZS1ibG9iXG4gICAgICpcbiAgICAgKiBAcGFyYW0gb3B0aW9ucyAtIG9wdGlvbiB0byBjb25maWd1cmUgbGVhc2UgbWFuYWdlbWVudCBvcGVyYXRpb25zLlxuICAgICAqIEByZXR1cm5zIFJlc3BvbnNlIGRhdGEgZm9yIHJlbGVhc2UgbGVhc2Ugb3BlcmF0aW9uLlxuICAgICAqL1xuICAgIGFzeW5jIHJlbGVhc2VMZWFzZShvcHRpb25zID0ge30pIHtcbiAgICAgICAgdmFyIF9hLCBfYiwgX2MsIF9kLCBfZTtcbiAgICAgICAgaWYgKHRoaXMuX2lzQ29udGFpbmVyICYmXG4gICAgICAgICAgICAoKCgoX2EgPSBvcHRpb25zLmNvbmRpdGlvbnMpID09PSBudWxsIHx8IF9hID09PSB2b2lkIDAgPyB2b2lkIDAgOiBfYS5pZk1hdGNoKSAmJiAoKF9iID0gb3B0aW9ucy5jb25kaXRpb25zKSA9PT0gbnVsbCB8fCBfYiA9PT0gdm9pZCAwID8gdm9pZCAwIDogX2IuaWZNYXRjaCkgIT09IEVUYWdOb25lKSB8fFxuICAgICAgICAgICAgICAgICgoKF9jID0gb3B0aW9ucy5jb25kaXRpb25zKSA9PT0gbnVsbCB8fCBfYyA9PT0gdm9pZCAwID8gdm9pZCAwIDogX2MuaWZOb25lTWF0Y2gpICYmICgoX2QgPSBvcHRpb25zLmNvbmRpdGlvbnMpID09PSBudWxsIHx8IF9kID09PSB2b2lkIDAgPyB2b2lkIDAgOiBfZC5pZk5vbmVNYXRjaCkgIT09IEVUYWdOb25lKSB8fFxuICAgICAgICAgICAgICAgICgoX2UgPSBvcHRpb25zLmNvbmRpdGlvbnMpID09PSBudWxsIHx8IF9lID09PSB2b2lkIDAgPyB2b2lkIDAgOiBfZS50YWdDb25kaXRpb25zKSkpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBSYW5nZUVycm9yKFwiVGhlIElmTWF0Y2gsIElmTm9uZU1hdGNoIGFuZCB0YWdzIGFjY2VzcyBjb25kaXRpb25zIGFyZSBpZ25vcmVkIGJ5IHRoZSBzZXJ2aWNlLiBWYWx1ZXMgb3RoZXIgdGhhbiB1bmRlZmluZWQgb3IgdGhlaXIgZGVmYXVsdCB2YWx1ZXMgYXJlIG5vdCBhY2NlcHRhYmxlLlwiKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gdHJhY2luZ0NsaWVudC53aXRoU3BhbihcIkJsb2JMZWFzZUNsaWVudC1yZWxlYXNlTGVhc2VcIiwgb3B0aW9ucywgYXN5bmMgKHVwZGF0ZWRPcHRpb25zKSA9PiB7XG4gICAgICAgICAgICB2YXIgX2E7XG4gICAgICAgICAgICByZXR1cm4gYXNzZXJ0UmVzcG9uc2UoYXdhaXQgdGhpcy5fY29udGFpbmVyT3JCbG9iT3BlcmF0aW9uLnJlbGVhc2VMZWFzZSh0aGlzLl9sZWFzZUlkLCB7XG4gICAgICAgICAgICAgICAgYWJvcnRTaWduYWw6IG9wdGlvbnMuYWJvcnRTaWduYWwsXG4gICAgICAgICAgICAgICAgbW9kaWZpZWRBY2Nlc3NDb25kaXRpb25zOiBPYmplY3QuYXNzaWduKE9iamVjdC5hc3NpZ24oe30sIG9wdGlvbnMuY29uZGl0aW9ucyksIHsgaWZUYWdzOiAoX2EgPSBvcHRpb25zLmNvbmRpdGlvbnMpID09PSBudWxsIHx8IF9hID09PSB2b2lkIDAgPyB2b2lkIDAgOiBfYS50YWdDb25kaXRpb25zIH0pLFxuICAgICAgICAgICAgICAgIHRyYWNpbmdPcHRpb25zOiB1cGRhdGVkT3B0aW9ucy50cmFjaW5nT3B0aW9ucyxcbiAgICAgICAgICAgIH0pKTtcbiAgICAgICAgfSk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIFRvIHJlbmV3IHRoZSBsZWFzZS5cbiAgICAgKiBAc2VlIGh0dHBzOi8vZG9jcy5taWNyb3NvZnQuY29tL2VuLXVzL3Jlc3QvYXBpL3N0b3JhZ2VzZXJ2aWNlcy9sZWFzZS1jb250YWluZXJcbiAgICAgKiBhbmRcbiAgICAgKiBAc2VlIGh0dHBzOi8vZG9jcy5taWNyb3NvZnQuY29tL2VuLXVzL3Jlc3QvYXBpL3N0b3JhZ2VzZXJ2aWNlcy9sZWFzZS1ibG9iXG4gICAgICpcbiAgICAgKiBAcGFyYW0gb3B0aW9ucyAtIE9wdGlvbmFsIG9wdGlvbiB0byBjb25maWd1cmUgbGVhc2UgbWFuYWdlbWVudCBvcGVyYXRpb25zLlxuICAgICAqIEByZXR1cm5zIFJlc3BvbnNlIGRhdGEgZm9yIHJlbmV3IGxlYXNlIG9wZXJhdGlvbi5cbiAgICAgKi9cbiAgICBhc3luYyByZW5ld0xlYXNlKG9wdGlvbnMgPSB7fSkge1xuICAgICAgICB2YXIgX2EsIF9iLCBfYywgX2QsIF9lO1xuICAgICAgICBpZiAodGhpcy5faXNDb250YWluZXIgJiZcbiAgICAgICAgICAgICgoKChfYSA9IG9wdGlvbnMuY29uZGl0aW9ucykgPT09IG51bGwgfHwgX2EgPT09IHZvaWQgMCA/IHZvaWQgMCA6IF9hLmlmTWF0Y2gpICYmICgoX2IgPSBvcHRpb25zLmNvbmRpdGlvbnMpID09PSBudWxsIHx8IF9iID09PSB2b2lkIDAgPyB2b2lkIDAgOiBfYi5pZk1hdGNoKSAhPT0gRVRhZ05vbmUpIHx8XG4gICAgICAgICAgICAgICAgKCgoX2MgPSBvcHRpb25zLmNvbmRpdGlvbnMpID09PSBudWxsIHx8IF9jID09PSB2b2lkIDAgPyB2b2lkIDAgOiBfYy5pZk5vbmVNYXRjaCkgJiYgKChfZCA9IG9wdGlvbnMuY29uZGl0aW9ucykgPT09IG51bGwgfHwgX2QgPT09IHZvaWQgMCA/IHZvaWQgMCA6IF9kLmlmTm9uZU1hdGNoKSAhPT0gRVRhZ05vbmUpIHx8XG4gICAgICAgICAgICAgICAgKChfZSA9IG9wdGlvbnMuY29uZGl0aW9ucykgPT09IG51bGwgfHwgX2UgPT09IHZvaWQgMCA/IHZvaWQgMCA6IF9lLnRhZ0NvbmRpdGlvbnMpKSkge1xuICAgICAgICAgICAgdGhyb3cgbmV3IFJhbmdlRXJyb3IoXCJUaGUgSWZNYXRjaCwgSWZOb25lTWF0Y2ggYW5kIHRhZ3MgYWNjZXNzIGNvbmRpdGlvbnMgYXJlIGlnbm9yZWQgYnkgdGhlIHNlcnZpY2UuIFZhbHVlcyBvdGhlciB0aGFuIHVuZGVmaW5lZCBvciB0aGVpciBkZWZhdWx0IHZhbHVlcyBhcmUgbm90IGFjY2VwdGFibGUuXCIpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB0cmFjaW5nQ2xpZW50LndpdGhTcGFuKFwiQmxvYkxlYXNlQ2xpZW50LXJlbmV3TGVhc2VcIiwgb3B0aW9ucywgYXN5bmMgKHVwZGF0ZWRPcHRpb25zKSA9PiB7XG4gICAgICAgICAgICB2YXIgX2E7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy5fY29udGFpbmVyT3JCbG9iT3BlcmF0aW9uLnJlbmV3TGVhc2UodGhpcy5fbGVhc2VJZCwge1xuICAgICAgICAgICAgICAgIGFib3J0U2lnbmFsOiBvcHRpb25zLmFib3J0U2lnbmFsLFxuICAgICAgICAgICAgICAgIG1vZGlmaWVkQWNjZXNzQ29uZGl0aW9uczogT2JqZWN0LmFzc2lnbihPYmplY3QuYXNzaWduKHt9LCBvcHRpb25zLmNvbmRpdGlvbnMpLCB7IGlmVGFnczogKF9hID0gb3B0aW9ucy5jb25kaXRpb25zKSA9PT0gbnVsbCB8fCBfYSA9PT0gdm9pZCAwID8gdm9pZCAwIDogX2EudGFnQ29uZGl0aW9ucyB9KSxcbiAgICAgICAgICAgICAgICB0cmFjaW5nT3B0aW9uczogdXBkYXRlZE9wdGlvbnMudHJhY2luZ09wdGlvbnMsXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfSk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIFRvIGVuZCB0aGUgbGVhc2UgYnV0IGVuc3VyZSB0aGF0IGFub3RoZXIgY2xpZW50IGNhbm5vdCBhY3F1aXJlIGEgbmV3IGxlYXNlXG4gICAgICogdW50aWwgdGhlIGN1cnJlbnQgbGVhc2UgcGVyaW9kIGhhcyBleHBpcmVkLlxuICAgICAqIEBzZWUgaHR0cHM6Ly9kb2NzLm1pY3Jvc29mdC5jb20vZW4tdXMvcmVzdC9hcGkvc3RvcmFnZXNlcnZpY2VzL2xlYXNlLWNvbnRhaW5lclxuICAgICAqIGFuZFxuICAgICAqIEBzZWUgaHR0cHM6Ly9kb2NzLm1pY3Jvc29mdC5jb20vZW4tdXMvcmVzdC9hcGkvc3RvcmFnZXNlcnZpY2VzL2xlYXNlLWJsb2JcbiAgICAgKlxuICAgICAqIEBwYXJhbSBicmVha1BlcmlvZCAtIEJyZWFrIHBlcmlvZFxuICAgICAqIEBwYXJhbSBvcHRpb25zIC0gT3B0aW9uYWwgb3B0aW9ucyB0byBjb25maWd1cmUgbGVhc2UgbWFuYWdlbWVudCBvcGVyYXRpb25zLlxuICAgICAqIEByZXR1cm5zIFJlc3BvbnNlIGRhdGEgZm9yIGJyZWFrIGxlYXNlIG9wZXJhdGlvbi5cbiAgICAgKi9cbiAgICBhc3luYyBicmVha0xlYXNlKGJyZWFrUGVyaW9kLCBvcHRpb25zID0ge30pIHtcbiAgICAgICAgdmFyIF9hLCBfYiwgX2MsIF9kLCBfZTtcbiAgICAgICAgaWYgKHRoaXMuX2lzQ29udGFpbmVyICYmXG4gICAgICAgICAgICAoKCgoX2EgPSBvcHRpb25zLmNvbmRpdGlvbnMpID09PSBudWxsIHx8IF9hID09PSB2b2lkIDAgPyB2b2lkIDAgOiBfYS5pZk1hdGNoKSAmJiAoKF9iID0gb3B0aW9ucy5jb25kaXRpb25zKSA9PT0gbnVsbCB8fCBfYiA9PT0gdm9pZCAwID8gdm9pZCAwIDogX2IuaWZNYXRjaCkgIT09IEVUYWdOb25lKSB8fFxuICAgICAgICAgICAgICAgICgoKF9jID0gb3B0aW9ucy5jb25kaXRpb25zKSA9PT0gbnVsbCB8fCBfYyA9PT0gdm9pZCAwID8gdm9pZCAwIDogX2MuaWZOb25lTWF0Y2gpICYmICgoX2QgPSBvcHRpb25zLmNvbmRpdGlvbnMpID09PSBudWxsIHx8IF9kID09PSB2b2lkIDAgPyB2b2lkIDAgOiBfZC5pZk5vbmVNYXRjaCkgIT09IEVUYWdOb25lKSB8fFxuICAgICAgICAgICAgICAgICgoX2UgPSBvcHRpb25zLmNvbmRpdGlvbnMpID09PSBudWxsIHx8IF9lID09PSB2b2lkIDAgPyB2b2lkIDAgOiBfZS50YWdDb25kaXRpb25zKSkpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBSYW5nZUVycm9yKFwiVGhlIElmTWF0Y2gsIElmTm9uZU1hdGNoIGFuZCB0YWdzIGFjY2VzcyBjb25kaXRpb25zIGFyZSBpZ25vcmVkIGJ5IHRoZSBzZXJ2aWNlLiBWYWx1ZXMgb3RoZXIgdGhhbiB1bmRlZmluZWQgb3IgdGhlaXIgZGVmYXVsdCB2YWx1ZXMgYXJlIG5vdCBhY2NlcHRhYmxlLlwiKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gdHJhY2luZ0NsaWVudC53aXRoU3BhbihcIkJsb2JMZWFzZUNsaWVudC1icmVha0xlYXNlXCIsIG9wdGlvbnMsIGFzeW5jICh1cGRhdGVkT3B0aW9ucykgPT4ge1xuICAgICAgICAgICAgdmFyIF9hO1xuICAgICAgICAgICAgY29uc3Qgb3BlcmF0aW9uT3B0aW9ucyA9IHtcbiAgICAgICAgICAgICAgICBhYm9ydFNpZ25hbDogb3B0aW9ucy5hYm9ydFNpZ25hbCxcbiAgICAgICAgICAgICAgICBicmVha1BlcmlvZCxcbiAgICAgICAgICAgICAgICBtb2RpZmllZEFjY2Vzc0NvbmRpdGlvbnM6IE9iamVjdC5hc3NpZ24oT2JqZWN0LmFzc2lnbih7fSwgb3B0aW9ucy5jb25kaXRpb25zKSwgeyBpZlRhZ3M6IChfYSA9IG9wdGlvbnMuY29uZGl0aW9ucykgPT09IG51bGwgfHwgX2EgPT09IHZvaWQgMCA/IHZvaWQgMCA6IF9hLnRhZ0NvbmRpdGlvbnMgfSksXG4gICAgICAgICAgICAgICAgdHJhY2luZ09wdGlvbnM6IHVwZGF0ZWRPcHRpb25zLnRyYWNpbmdPcHRpb25zLFxuICAgICAgICAgICAgfTtcbiAgICAgICAgICAgIHJldHVybiBhc3NlcnRSZXNwb25zZShhd2FpdCB0aGlzLl9jb250YWluZXJPckJsb2JPcGVyYXRpb24uYnJlYWtMZWFzZShvcGVyYXRpb25PcHRpb25zKSk7XG4gICAgICAgIH0pO1xuICAgIH1cbn1cblxuLy8gQ29weXJpZ2h0IChjKSBNaWNyb3NvZnQgQ29ycG9yYXRpb24uXG4vLyBMaWNlbnNlZCB1bmRlciB0aGUgTUlUIExpY2Vuc2UuXG4vKipcbiAqIE9OTFkgQVZBSUxBQkxFIElOIE5PREUuSlMgUlVOVElNRS5cbiAqXG4gKiBBIE5vZGUuanMgUmVhZGFibGVTdHJlYW0gd2lsbCBpbnRlcm5hbGx5IHJldHJ5IHdoZW4gaW50ZXJuYWwgUmVhZGFibGVTdHJlYW0gdW5leHBlY3RlZCBlbmRzLlxuICovXG5jbGFzcyBSZXRyaWFibGVSZWFkYWJsZVN0cmVhbSBleHRlbmRzIHN0cmVhbS5SZWFkYWJsZSB7XG4gICAgLyoqXG4gICAgICogQ3JlYXRlcyBhbiBpbnN0YW5jZSBvZiBSZXRyaWFibGVSZWFkYWJsZVN0cmVhbS5cbiAgICAgKlxuICAgICAqIEBwYXJhbSBzb3VyY2UgLSBUaGUgY3VycmVudCBSZWFkYWJsZVN0cmVhbSByZXR1cm5lZCBmcm9tIGdldHRlclxuICAgICAqIEBwYXJhbSBnZXR0ZXIgLSBBIG1ldGhvZCBjYWxsaW5nIGRvd25sb2FkaW5nIHJlcXVlc3QgcmV0dXJuaW5nXG4gICAgICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGEgbmV3IFJlYWRhYmxlU3RyZWFtIGZyb20gc3BlY2lmaWVkIG9mZnNldFxuICAgICAqIEBwYXJhbSBvZmZzZXQgLSBPZmZzZXQgcG9zaXRpb24gaW4gb3JpZ2luYWwgZGF0YSBzb3VyY2UgdG8gcmVhZFxuICAgICAqIEBwYXJhbSBjb3VudCAtIEhvdyBtdWNoIGRhdGEgaW4gb3JpZ2luYWwgZGF0YSBzb3VyY2UgdG8gcmVhZFxuICAgICAqIEBwYXJhbSBvcHRpb25zIC1cbiAgICAgKi9cbiAgICBjb25zdHJ1Y3Rvcihzb3VyY2UsIGdldHRlciwgb2Zmc2V0LCBjb3VudCwgb3B0aW9ucyA9IHt9KSB7XG4gICAgICAgIHN1cGVyKHsgaGlnaFdhdGVyTWFyazogb3B0aW9ucy5oaWdoV2F0ZXJNYXJrIH0pO1xuICAgICAgICB0aGlzLnJldHJpZXMgPSAwO1xuICAgICAgICB0aGlzLnNvdXJjZURhdGFIYW5kbGVyID0gKGRhdGEpID0+IHtcbiAgICAgICAgICAgIGlmICh0aGlzLm9wdGlvbnMuZG9JbmplY3RFcnJvck9uY2UpIHtcbiAgICAgICAgICAgICAgICB0aGlzLm9wdGlvbnMuZG9JbmplY3RFcnJvck9uY2UgPSB1bmRlZmluZWQ7XG4gICAgICAgICAgICAgICAgdGhpcy5zb3VyY2UucGF1c2UoKTtcbiAgICAgICAgICAgICAgICB0aGlzLnNvdXJjZUVycm9yT3JFbmRIYW5kbGVyKCk7XG4gICAgICAgICAgICAgICAgdGhpcy5zb3VyY2UuZGVzdHJveSgpO1xuICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIC8vIGNvbnNvbGUubG9nKFxuICAgICAgICAgICAgLy8gICBgT2Zmc2V0OiAke3RoaXMub2Zmc2V0fSwgUmVjZWl2ZWQgJHtkYXRhLmxlbmd0aH0gZnJvbSBpbnRlcm5hbCBzdHJlYW1gXG4gICAgICAgICAgICAvLyApO1xuICAgICAgICAgICAgdGhpcy5vZmZzZXQgKz0gZGF0YS5sZW5ndGg7XG4gICAgICAgICAgICBpZiAodGhpcy5vblByb2dyZXNzKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5vblByb2dyZXNzKHsgbG9hZGVkQnl0ZXM6IHRoaXMub2Zmc2V0IC0gdGhpcy5zdGFydCB9KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmICghdGhpcy5wdXNoKGRhdGEpKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5zb3VyY2UucGF1c2UoKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfTtcbiAgICAgICAgdGhpcy5zb3VyY2VBYm9ydGVkSGFuZGxlciA9ICgpID0+IHtcbiAgICAgICAgICAgIGNvbnN0IGFib3J0RXJyb3IgPSBuZXcgYWJvcnRDb250cm9sbGVyLkFib3J0RXJyb3IoXCJUaGUgb3BlcmF0aW9uIHdhcyBhYm9ydGVkLlwiKTtcbiAgICAgICAgICAgIHRoaXMuZGVzdHJveShhYm9ydEVycm9yKTtcbiAgICAgICAgfTtcbiAgICAgICAgdGhpcy5zb3VyY2VFcnJvck9yRW5kSGFuZGxlciA9IChlcnIpID0+IHtcbiAgICAgICAgICAgIGlmIChlcnIgJiYgZXJyLm5hbWUgPT09IFwiQWJvcnRFcnJvclwiKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5kZXN0cm95KGVycik7XG4gICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgLy8gY29uc29sZS5sb2coXG4gICAgICAgICAgICAvLyAgIGBTb3VyY2Ugc3RyZWFtIGVtaXRzIGVuZCBvciBlcnJvciwgb2Zmc2V0OiAke1xuICAgICAgICAgICAgLy8gICAgIHRoaXMub2Zmc2V0XG4gICAgICAgICAgICAvLyAgIH0sIGRlc3QgZW5kIDogJHt0aGlzLmVuZH1gXG4gICAgICAgICAgICAvLyApO1xuICAgICAgICAgICAgdGhpcy5yZW1vdmVTb3VyY2VFdmVudEhhbmRsZXJzKCk7XG4gICAgICAgICAgICBpZiAodGhpcy5vZmZzZXQgLSAxID09PSB0aGlzLmVuZCkge1xuICAgICAgICAgICAgICAgIHRoaXMucHVzaChudWxsKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2UgaWYgKHRoaXMub2Zmc2V0IDw9IHRoaXMuZW5kKSB7XG4gICAgICAgICAgICAgICAgLy8gY29uc29sZS5sb2coXG4gICAgICAgICAgICAgICAgLy8gICBgcmV0cmllczogJHt0aGlzLnJldHJpZXN9LCBtYXggcmV0cmllczogJHt0aGlzLm1heFJldHJpZXN9YFxuICAgICAgICAgICAgICAgIC8vICk7XG4gICAgICAgICAgICAgICAgaWYgKHRoaXMucmV0cmllcyA8IHRoaXMubWF4UmV0cnlSZXF1ZXN0cykge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLnJldHJpZXMgKz0gMTtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5nZXR0ZXIodGhpcy5vZmZzZXQpXG4gICAgICAgICAgICAgICAgICAgICAgICAudGhlbigobmV3U291cmNlKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnNvdXJjZSA9IG5ld1NvdXJjZTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuc2V0U291cmNlRXZlbnRIYW5kbGVycygpO1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgICAgICAgICB9KVxuICAgICAgICAgICAgICAgICAgICAgICAgLmNhdGNoKChlcnJvcikgPT4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5kZXN0cm95KGVycm9yKTtcbiAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLmRlc3Ryb3kobmV3IEVycm9yKGBEYXRhIGNvcnJ1cHRpb24gZmFpbHVyZTogcmVjZWl2ZWQgbGVzcyBkYXRhIHRoYW4gcmVxdWlyZWQgYW5kIHJlYWNoZWQgbWF4UmV0aXJlcyBsaW1pdGF0aW9uLiBSZWNlaXZlZCBkYXRhIG9mZnNldDogJHt0aGlzLm9mZnNldCAtIDF9LCBkYXRhIG5lZWRlZCBvZmZzZXQ6ICR7dGhpcy5lbmR9LCByZXRyaWVzOiAke3RoaXMucmV0cmllc30sIG1heCByZXRyaWVzOiAke3RoaXMubWF4UmV0cnlSZXF1ZXN0c31gKSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgdGhpcy5kZXN0cm95KG5ldyBFcnJvcihgRGF0YSBjb3JydXB0aW9uIGZhaWx1cmU6IFJlY2VpdmVkIG1vcmUgZGF0YSB0aGFuIG9yaWdpbmFsIHJlcXVlc3QsIGRhdGEgbmVlZGVkIG9mZnNldCBpcyAke3RoaXMuZW5kfSwgcmVjZWl2ZWQgb2Zmc2V0OiAke3RoaXMub2Zmc2V0IC0gMX1gKSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH07XG4gICAgICAgIHRoaXMuZ2V0dGVyID0gZ2V0dGVyO1xuICAgICAgICB0aGlzLnNvdXJjZSA9IHNvdXJjZTtcbiAgICAgICAgdGhpcy5zdGFydCA9IG9mZnNldDtcbiAgICAgICAgdGhpcy5vZmZzZXQgPSBvZmZzZXQ7XG4gICAgICAgIHRoaXMuZW5kID0gb2Zmc2V0ICsgY291bnQgLSAxO1xuICAgICAgICB0aGlzLm1heFJldHJ5UmVxdWVzdHMgPVxuICAgICAgICAgICAgb3B0aW9ucy5tYXhSZXRyeVJlcXVlc3RzICYmIG9wdGlvbnMubWF4UmV0cnlSZXF1ZXN0cyA+PSAwID8gb3B0aW9ucy5tYXhSZXRyeVJlcXVlc3RzIDogMDtcbiAgICAgICAgdGhpcy5vblByb2dyZXNzID0gb3B0aW9ucy5vblByb2dyZXNzO1xuICAgICAgICB0aGlzLm9wdGlvbnMgPSBvcHRpb25zO1xuICAgICAgICB0aGlzLnNldFNvdXJjZUV2ZW50SGFuZGxlcnMoKTtcbiAgICB9XG4gICAgX3JlYWQoKSB7XG4gICAgICAgIHRoaXMuc291cmNlLnJlc3VtZSgpO1xuICAgIH1cbiAgICBzZXRTb3VyY2VFdmVudEhhbmRsZXJzKCkge1xuICAgICAgICB0aGlzLnNvdXJjZS5vbihcImRhdGFcIiwgdGhpcy5zb3VyY2VEYXRhSGFuZGxlcik7XG4gICAgICAgIHRoaXMuc291cmNlLm9uKFwiZW5kXCIsIHRoaXMuc291cmNlRXJyb3JPckVuZEhhbmRsZXIpO1xuICAgICAgICB0aGlzLnNvdXJjZS5vbihcImVycm9yXCIsIHRoaXMuc291cmNlRXJyb3JPckVuZEhhbmRsZXIpO1xuICAgICAgICAvLyBuZWVkZWQgZm9yIE5vZGUxNFxuICAgICAgICB0aGlzLnNvdXJjZS5vbihcImFib3J0ZWRcIiwgdGhpcy5zb3VyY2VBYm9ydGVkSGFuZGxlcik7XG4gICAgfVxuICAgIHJlbW92ZVNvdXJjZUV2ZW50SGFuZGxlcnMoKSB7XG4gICAgICAgIHRoaXMuc291cmNlLnJlbW92ZUxpc3RlbmVyKFwiZGF0YVwiLCB0aGlzLnNvdXJjZURhdGFIYW5kbGVyKTtcbiAgICAgICAgdGhpcy5zb3VyY2UucmVtb3ZlTGlzdGVuZXIoXCJlbmRcIiwgdGhpcy5zb3VyY2VFcnJvck9yRW5kSGFuZGxlcik7XG4gICAgICAgIHRoaXMuc291cmNlLnJlbW92ZUxpc3RlbmVyKFwiZXJyb3JcIiwgdGhpcy5zb3VyY2VFcnJvck9yRW5kSGFuZGxlcik7XG4gICAgICAgIHRoaXMuc291cmNlLnJlbW92ZUxpc3RlbmVyKFwiYWJvcnRlZFwiLCB0aGlzLnNvdXJjZUFib3J0ZWRIYW5kbGVyKTtcbiAgICB9XG4gICAgX2Rlc3Ryb3koZXJyb3IsIGNhbGxiYWNrKSB7XG4gICAgICAgIC8vIHJlbW92ZSBsaXN0ZW5lciBmcm9tIHNvdXJjZSBhbmQgcmVsZWFzZSBzb3VyY2VcbiAgICAgICAgdGhpcy5yZW1vdmVTb3VyY2VFdmVudEhhbmRsZXJzKCk7XG4gICAgICAgIHRoaXMuc291cmNlLmRlc3Ryb3koKTtcbiAgICAgICAgY2FsbGJhY2soZXJyb3IgPT09IG51bGwgPyB1bmRlZmluZWQgOiBlcnJvcik7XG4gICAgfVxufVxuXG4vLyBDb3B5cmlnaHQgKGMpIE1pY3Jvc29mdCBDb3Jwb3JhdGlvbi5cbi8vIExpY2Vuc2VkIHVuZGVyIHRoZSBNSVQgTGljZW5zZS5cbi8qKlxuICogT05MWSBBVkFJTEFCTEUgSU4gTk9ERS5KUyBSVU5USU1FLlxuICpcbiAqIEJsb2JEb3dubG9hZFJlc3BvbnNlIGltcGxlbWVudHMgQmxvYkRvd25sb2FkUmVzcG9uc2VQYXJzZWQgaW50ZXJmYWNlLCBhbmQgaW4gTm9kZS5qcyBydW50aW1lIGl0IHdpbGxcbiAqIGF1dG9tYXRpY2FsbHkgcmV0cnkgd2hlbiBpbnRlcm5hbCByZWFkIHN0cmVhbSB1bmV4cGVjdGVkIGVuZHMuIChUaGlzIGtpbmQgb2YgdW5leHBlY3RlZCBlbmRzIGNhbm5vdFxuICogdHJpZ2dlciByZXRyaWVzIGRlZmluZWQgaW4gcGlwZWxpbmUgcmV0cnkgcG9saWN5LilcbiAqXG4gKiBUaGUge0BsaW5rIHJlYWRhYmxlU3RyZWFtQm9keX0gc3RyZWFtIHdpbGwgcmV0cnkgdW5kZXJsYXllciwgeW91IGNhbiBqdXN0IHVzZSBpdCBhcyBhIG5vcm1hbCBOb2RlLmpzXG4gKiBSZWFkYWJsZSBzdHJlYW0uXG4gKi9cbmNsYXNzIEJsb2JEb3dubG9hZFJlc3BvbnNlIHtcbiAgICAvKipcbiAgICAgKiBJbmRpY2F0ZXMgdGhhdCB0aGUgc2VydmljZSBzdXBwb3J0c1xuICAgICAqIHJlcXVlc3RzIGZvciBwYXJ0aWFsIGZpbGUgY29udGVudC5cbiAgICAgKlxuICAgICAqIEByZWFkb25seVxuICAgICAqL1xuICAgIGdldCBhY2NlcHRSYW5nZXMoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLm9yaWdpbmFsUmVzcG9uc2UuYWNjZXB0UmFuZ2VzO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBSZXR1cm5zIGlmIGl0IHdhcyBwcmV2aW91c2x5IHNwZWNpZmllZFxuICAgICAqIGZvciB0aGUgZmlsZS5cbiAgICAgKlxuICAgICAqIEByZWFkb25seVxuICAgICAqL1xuICAgIGdldCBjYWNoZUNvbnRyb2woKSB7XG4gICAgICAgIHJldHVybiB0aGlzLm9yaWdpbmFsUmVzcG9uc2UuY2FjaGVDb250cm9sO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBSZXR1cm5zIHRoZSB2YWx1ZSB0aGF0IHdhcyBzcGVjaWZpZWRcbiAgICAgKiBmb3IgdGhlICd4LW1zLWNvbnRlbnQtZGlzcG9zaXRpb24nIGhlYWRlciBhbmQgc3BlY2lmaWVzIGhvdyB0byBwcm9jZXNzIHRoZVxuICAgICAqIHJlc3BvbnNlLlxuICAgICAqXG4gICAgICogQHJlYWRvbmx5XG4gICAgICovXG4gICAgZ2V0IGNvbnRlbnREaXNwb3NpdGlvbigpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMub3JpZ2luYWxSZXNwb25zZS5jb250ZW50RGlzcG9zaXRpb247XG4gICAgfVxuICAgIC8qKlxuICAgICAqIFJldHVybnMgdGhlIHZhbHVlIHRoYXQgd2FzIHNwZWNpZmllZFxuICAgICAqIGZvciB0aGUgQ29udGVudC1FbmNvZGluZyByZXF1ZXN0IGhlYWRlci5cbiAgICAgKlxuICAgICAqIEByZWFkb25seVxuICAgICAqL1xuICAgIGdldCBjb250ZW50RW5jb2RpbmcoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLm9yaWdpbmFsUmVzcG9uc2UuY29udGVudEVuY29kaW5nO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBSZXR1cm5zIHRoZSB2YWx1ZSB0aGF0IHdhcyBzcGVjaWZpZWRcbiAgICAgKiBmb3IgdGhlIENvbnRlbnQtTGFuZ3VhZ2UgcmVxdWVzdCBoZWFkZXIuXG4gICAgICpcbiAgICAgKiBAcmVhZG9ubHlcbiAgICAgKi9cbiAgICBnZXQgY29udGVudExhbmd1YWdlKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5vcmlnaW5hbFJlc3BvbnNlLmNvbnRlbnRMYW5ndWFnZTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogVGhlIGN1cnJlbnQgc2VxdWVuY2UgbnVtYmVyIGZvciBhXG4gICAgICogcGFnZSBibG9iLiBUaGlzIGhlYWRlciBpcyBub3QgcmV0dXJuZWQgZm9yIGJsb2NrIGJsb2JzIG9yIGFwcGVuZCBibG9icy5cbiAgICAgKlxuICAgICAqIEByZWFkb25seVxuICAgICAqL1xuICAgIGdldCBibG9iU2VxdWVuY2VOdW1iZXIoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLm9yaWdpbmFsUmVzcG9uc2UuYmxvYlNlcXVlbmNlTnVtYmVyO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBUaGUgYmxvYidzIHR5cGUuIFBvc3NpYmxlIHZhbHVlcyBpbmNsdWRlOlxuICAgICAqICdCbG9ja0Jsb2InLCAnUGFnZUJsb2InLCAnQXBwZW5kQmxvYicuXG4gICAgICpcbiAgICAgKiBAcmVhZG9ubHlcbiAgICAgKi9cbiAgICBnZXQgYmxvYlR5cGUoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLm9yaWdpbmFsUmVzcG9uc2UuYmxvYlR5cGU7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIFRoZSBudW1iZXIgb2YgYnl0ZXMgcHJlc2VudCBpbiB0aGVcbiAgICAgKiByZXNwb25zZSBib2R5LlxuICAgICAqXG4gICAgICogQHJlYWRvbmx5XG4gICAgICovXG4gICAgZ2V0IGNvbnRlbnRMZW5ndGgoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLm9yaWdpbmFsUmVzcG9uc2UuY29udGVudExlbmd0aDtcbiAgICB9XG4gICAgLyoqXG4gICAgICogSWYgdGhlIGZpbGUgaGFzIGFuIE1ENSBoYXNoIGFuZCB0aGVcbiAgICAgKiByZXF1ZXN0IGlzIHRvIHJlYWQgdGhlIGZ1bGwgZmlsZSwgdGhpcyByZXNwb25zZSBoZWFkZXIgaXMgcmV0dXJuZWQgc28gdGhhdFxuICAgICAqIHRoZSBjbGllbnQgY2FuIGNoZWNrIGZvciBtZXNzYWdlIGNvbnRlbnQgaW50ZWdyaXR5LiBJZiB0aGUgcmVxdWVzdCBpcyB0b1xuICAgICAqIHJlYWQgYSBzcGVjaWZpZWQgcmFuZ2UgYW5kIHRoZSAneC1tcy1yYW5nZS1nZXQtY29udGVudC1tZDUnIGlzIHNldCB0b1xuICAgICAqIHRydWUsIHRoZW4gdGhlIHJlcXVlc3QgcmV0dXJucyBhbiBNRDUgaGFzaCBmb3IgdGhlIHJhbmdlLCBhcyBsb25nIGFzIHRoZVxuICAgICAqIHJhbmdlIHNpemUgaXMgbGVzcyB0aGFuIG9yIGVxdWFsIHRvIDQgTUIuIElmIG5laXRoZXIgb2YgdGhlc2Ugc2V0cyBvZlxuICAgICAqIGNvbmRpdGlvbnMgaXMgdHJ1ZSwgdGhlbiBubyB2YWx1ZSBpcyByZXR1cm5lZCBmb3IgdGhlICdDb250ZW50LU1ENSdcbiAgICAgKiBoZWFkZXIuXG4gICAgICpcbiAgICAgKiBAcmVhZG9ubHlcbiAgICAgKi9cbiAgICBnZXQgY29udGVudE1ENSgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMub3JpZ2luYWxSZXNwb25zZS5jb250ZW50TUQ1O1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBJbmRpY2F0ZXMgdGhlIHJhbmdlIG9mIGJ5dGVzIHJldHVybmVkIGlmXG4gICAgICogdGhlIGNsaWVudCByZXF1ZXN0ZWQgYSBzdWJzZXQgb2YgdGhlIGZpbGUgYnkgc2V0dGluZyB0aGUgUmFuZ2UgcmVxdWVzdFxuICAgICAqIGhlYWRlci5cbiAgICAgKlxuICAgICAqIEByZWFkb25seVxuICAgICAqL1xuICAgIGdldCBjb250ZW50UmFuZ2UoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLm9yaWdpbmFsUmVzcG9uc2UuY29udGVudFJhbmdlO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBUaGUgY29udGVudCB0eXBlIHNwZWNpZmllZCBmb3IgdGhlIGZpbGUuXG4gICAgICogVGhlIGRlZmF1bHQgY29udGVudCB0eXBlIGlzICdhcHBsaWNhdGlvbi9vY3RldC1zdHJlYW0nXG4gICAgICpcbiAgICAgKiBAcmVhZG9ubHlcbiAgICAgKi9cbiAgICBnZXQgY29udGVudFR5cGUoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLm9yaWdpbmFsUmVzcG9uc2UuY29udGVudFR5cGU7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIENvbmNsdXNpb24gdGltZSBvZiB0aGUgbGFzdCBhdHRlbXB0ZWRcbiAgICAgKiBDb3B5IEZpbGUgb3BlcmF0aW9uIHdoZXJlIHRoaXMgZmlsZSB3YXMgdGhlIGRlc3RpbmF0aW9uIGZpbGUuIFRoaXMgdmFsdWVcbiAgICAgKiBjYW4gc3BlY2lmeSB0aGUgdGltZSBvZiBhIGNvbXBsZXRlZCwgYWJvcnRlZCwgb3IgZmFpbGVkIGNvcHkgYXR0ZW1wdC5cbiAgICAgKlxuICAgICAqIEByZWFkb25seVxuICAgICAqL1xuICAgIGdldCBjb3B5Q29tcGxldGVkT24oKSB7XG4gICAgICAgIHJldHVybiB0aGlzLm9yaWdpbmFsUmVzcG9uc2UuY29weUNvbXBsZXRlZE9uO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBTdHJpbmcgaWRlbnRpZmllciBmb3IgdGhlIGxhc3QgYXR0ZW1wdGVkIENvcHlcbiAgICAgKiBGaWxlIG9wZXJhdGlvbiB3aGVyZSB0aGlzIGZpbGUgd2FzIHRoZSBkZXN0aW5hdGlvbiBmaWxlLlxuICAgICAqXG4gICAgICogQHJlYWRvbmx5XG4gICAgICovXG4gICAgZ2V0IGNvcHlJZCgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMub3JpZ2luYWxSZXNwb25zZS5jb3B5SWQ7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIENvbnRhaW5zIHRoZSBudW1iZXIgb2YgYnl0ZXMgY29waWVkIGFuZFxuICAgICAqIHRoZSB0b3RhbCBieXRlcyBpbiB0aGUgc291cmNlIGluIHRoZSBsYXN0IGF0dGVtcHRlZCBDb3B5IEZpbGUgb3BlcmF0aW9uXG4gICAgICogd2hlcmUgdGhpcyBmaWxlIHdhcyB0aGUgZGVzdGluYXRpb24gZmlsZS4gQ2FuIHNob3cgYmV0d2VlbiAwIGFuZFxuICAgICAqIENvbnRlbnQtTGVuZ3RoIGJ5dGVzIGNvcGllZC5cbiAgICAgKlxuICAgICAqIEByZWFkb25seVxuICAgICAqL1xuICAgIGdldCBjb3B5UHJvZ3Jlc3MoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLm9yaWdpbmFsUmVzcG9uc2UuY29weVByb2dyZXNzO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBVUkwgdXAgdG8gMktCIGluIGxlbmd0aCB0aGF0IHNwZWNpZmllcyB0aGVcbiAgICAgKiBzb3VyY2UgZmlsZSB1c2VkIGluIHRoZSBsYXN0IGF0dGVtcHRlZCBDb3B5IEZpbGUgb3BlcmF0aW9uIHdoZXJlIHRoaXMgZmlsZVxuICAgICAqIHdhcyB0aGUgZGVzdGluYXRpb24gZmlsZS5cbiAgICAgKlxuICAgICAqIEByZWFkb25seVxuICAgICAqL1xuICAgIGdldCBjb3B5U291cmNlKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5vcmlnaW5hbFJlc3BvbnNlLmNvcHlTb3VyY2U7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIFN0YXRlIG9mIHRoZSBjb3B5IG9wZXJhdGlvblxuICAgICAqIGlkZW50aWZpZWQgYnkgJ3gtbXMtY29weS1pZCcuIFBvc3NpYmxlIHZhbHVlcyBpbmNsdWRlOiAncGVuZGluZycsXG4gICAgICogJ3N1Y2Nlc3MnLCAnYWJvcnRlZCcsICdmYWlsZWQnXG4gICAgICpcbiAgICAgKiBAcmVhZG9ubHlcbiAgICAgKi9cbiAgICBnZXQgY29weVN0YXR1cygpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMub3JpZ2luYWxSZXNwb25zZS5jb3B5U3RhdHVzO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBPbmx5IGFwcGVhcnMgd2hlblxuICAgICAqIHgtbXMtY29weS1zdGF0dXMgaXMgZmFpbGVkIG9yIHBlbmRpbmcuIERlc2NyaWJlcyBjYXVzZSBvZiBmYXRhbCBvclxuICAgICAqIG5vbi1mYXRhbCBjb3B5IG9wZXJhdGlvbiBmYWlsdXJlLlxuICAgICAqXG4gICAgICogQHJlYWRvbmx5XG4gICAgICovXG4gICAgZ2V0IGNvcHlTdGF0dXNEZXNjcmlwdGlvbigpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMub3JpZ2luYWxSZXNwb25zZS5jb3B5U3RhdHVzRGVzY3JpcHRpb247XG4gICAgfVxuICAgIC8qKlxuICAgICAqIFdoZW4gYSBibG9iIGlzIGxlYXNlZCxcbiAgICAgKiBzcGVjaWZpZXMgd2hldGhlciB0aGUgbGVhc2UgaXMgb2YgaW5maW5pdGUgb3IgZml4ZWQgZHVyYXRpb24uIFBvc3NpYmxlXG4gICAgICogdmFsdWVzIGluY2x1ZGU6ICdpbmZpbml0ZScsICdmaXhlZCcuXG4gICAgICpcbiAgICAgKiBAcmVhZG9ubHlcbiAgICAgKi9cbiAgICBnZXQgbGVhc2VEdXJhdGlvbigpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMub3JpZ2luYWxSZXNwb25zZS5sZWFzZUR1cmF0aW9uO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBMZWFzZSBzdGF0ZSBvZiB0aGUgYmxvYi4gUG9zc2libGVcbiAgICAgKiB2YWx1ZXMgaW5jbHVkZTogJ2F2YWlsYWJsZScsICdsZWFzZWQnLCAnZXhwaXJlZCcsICdicmVha2luZycsICdicm9rZW4nLlxuICAgICAqXG4gICAgICogQHJlYWRvbmx5XG4gICAgICovXG4gICAgZ2V0IGxlYXNlU3RhdGUoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLm9yaWdpbmFsUmVzcG9uc2UubGVhc2VTdGF0ZTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogVGhlIGN1cnJlbnQgbGVhc2Ugc3RhdHVzIG9mIHRoZVxuICAgICAqIGJsb2IuIFBvc3NpYmxlIHZhbHVlcyBpbmNsdWRlOiAnbG9ja2VkJywgJ3VubG9ja2VkJy5cbiAgICAgKlxuICAgICAqIEByZWFkb25seVxuICAgICAqL1xuICAgIGdldCBsZWFzZVN0YXR1cygpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMub3JpZ2luYWxSZXNwb25zZS5sZWFzZVN0YXR1cztcbiAgICB9XG4gICAgLyoqXG4gICAgICogQSBVVEMgZGF0ZS90aW1lIHZhbHVlIGdlbmVyYXRlZCBieSB0aGUgc2VydmljZSB0aGF0XG4gICAgICogaW5kaWNhdGVzIHRoZSB0aW1lIGF0IHdoaWNoIHRoZSByZXNwb25zZSB3YXMgaW5pdGlhdGVkLlxuICAgICAqXG4gICAgICogQHJlYWRvbmx5XG4gICAgICovXG4gICAgZ2V0IGRhdGUoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLm9yaWdpbmFsUmVzcG9uc2UuZGF0ZTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogVGhlIG51bWJlciBvZiBjb21taXR0ZWQgYmxvY2tzXG4gICAgICogcHJlc2VudCBpbiB0aGUgYmxvYi4gVGhpcyBoZWFkZXIgaXMgcmV0dXJuZWQgb25seSBmb3IgYXBwZW5kIGJsb2JzLlxuICAgICAqXG4gICAgICogQHJlYWRvbmx5XG4gICAgICovXG4gICAgZ2V0IGJsb2JDb21taXR0ZWRCbG9ja0NvdW50KCkge1xuICAgICAgICByZXR1cm4gdGhpcy5vcmlnaW5hbFJlc3BvbnNlLmJsb2JDb21taXR0ZWRCbG9ja0NvdW50O1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBUaGUgRVRhZyBjb250YWlucyBhIHZhbHVlIHRoYXQgeW91IGNhbiB1c2UgdG9cbiAgICAgKiBwZXJmb3JtIG9wZXJhdGlvbnMgY29uZGl0aW9uYWxseSwgaW4gcXVvdGVzLlxuICAgICAqXG4gICAgICogQHJlYWRvbmx5XG4gICAgICovXG4gICAgZ2V0IGV0YWcoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLm9yaWdpbmFsUmVzcG9uc2UuZXRhZztcbiAgICB9XG4gICAgLyoqXG4gICAgICogVGhlIG51bWJlciBvZiB0YWdzIGFzc29jaWF0ZWQgd2l0aCB0aGUgYmxvYlxuICAgICAqXG4gICAgICogQHJlYWRvbmx5XG4gICAgICovXG4gICAgZ2V0IHRhZ0NvdW50KCkge1xuICAgICAgICByZXR1cm4gdGhpcy5vcmlnaW5hbFJlc3BvbnNlLnRhZ0NvdW50O1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBUaGUgZXJyb3IgY29kZS5cbiAgICAgKlxuICAgICAqIEByZWFkb25seVxuICAgICAqL1xuICAgIGdldCBlcnJvckNvZGUoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLm9yaWdpbmFsUmVzcG9uc2UuZXJyb3JDb2RlO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBUaGUgdmFsdWUgb2YgdGhpcyBoZWFkZXIgaXMgc2V0IHRvXG4gICAgICogdHJ1ZSBpZiB0aGUgZmlsZSBkYXRhIGFuZCBhcHBsaWNhdGlvbiBtZXRhZGF0YSBhcmUgY29tcGxldGVseSBlbmNyeXB0ZWRcbiAgICAgKiB1c2luZyB0aGUgc3BlY2lmaWVkIGFsZ29yaXRobS4gT3RoZXJ3aXNlLCB0aGUgdmFsdWUgaXMgc2V0IHRvIGZhbHNlICh3aGVuXG4gICAgICogdGhlIGZpbGUgaXMgdW5lbmNyeXB0ZWQsIG9yIGlmIG9ubHkgcGFydHMgb2YgdGhlIGZpbGUvYXBwbGljYXRpb24gbWV0YWRhdGFcbiAgICAgKiBhcmUgZW5jcnlwdGVkKS5cbiAgICAgKlxuICAgICAqIEByZWFkb25seVxuICAgICAqL1xuICAgIGdldCBpc1NlcnZlckVuY3J5cHRlZCgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMub3JpZ2luYWxSZXNwb25zZS5pc1NlcnZlckVuY3J5cHRlZDtcbiAgICB9XG4gICAgLyoqXG4gICAgICogSWYgdGhlIGJsb2IgaGFzIGEgTUQ1IGhhc2gsIGFuZCBpZlxuICAgICAqIHJlcXVlc3QgY29udGFpbnMgcmFuZ2UgaGVhZGVyIChSYW5nZSBvciB4LW1zLXJhbmdlKSwgdGhpcyByZXNwb25zZSBoZWFkZXJcbiAgICAgKiBpcyByZXR1cm5lZCB3aXRoIHRoZSB2YWx1ZSBvZiB0aGUgd2hvbGUgYmxvYidzIE1ENSB2YWx1ZS4gVGhpcyB2YWx1ZSBtYXlcbiAgICAgKiBvciBtYXkgbm90IGJlIGVxdWFsIHRvIHRoZSB2YWx1ZSByZXR1cm5lZCBpbiBDb250ZW50LU1ENSBoZWFkZXIsIHdpdGggdGhlXG4gICAgICogbGF0dGVyIGNhbGN1bGF0ZWQgZnJvbSB0aGUgcmVxdWVzdGVkIHJhbmdlLlxuICAgICAqXG4gICAgICogQHJlYWRvbmx5XG4gICAgICovXG4gICAgZ2V0IGJsb2JDb250ZW50TUQ1KCkge1xuICAgICAgICByZXR1cm4gdGhpcy5vcmlnaW5hbFJlc3BvbnNlLmJsb2JDb250ZW50TUQ1O1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBSZXR1cm5zIHRoZSBkYXRlIGFuZCB0aW1lIHRoZSBmaWxlIHdhcyBsYXN0XG4gICAgICogbW9kaWZpZWQuIEFueSBvcGVyYXRpb24gdGhhdCBtb2RpZmllcyB0aGUgZmlsZSBvciBpdHMgcHJvcGVydGllcyB1cGRhdGVzXG4gICAgICogdGhlIGxhc3QgbW9kaWZpZWQgdGltZS5cbiAgICAgKlxuICAgICAqIEByZWFkb25seVxuICAgICAqL1xuICAgIGdldCBsYXN0TW9kaWZpZWQoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLm9yaWdpbmFsUmVzcG9uc2UubGFzdE1vZGlmaWVkO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBSZXR1cm5zIHRoZSBVVEMgZGF0ZSBhbmQgdGltZSBnZW5lcmF0ZWQgYnkgdGhlIHNlcnZpY2UgdGhhdCBpbmRpY2F0ZXMgdGhlIHRpbWUgYXQgd2hpY2ggdGhlIGJsb2Igd2FzXG4gICAgICogbGFzdCByZWFkIG9yIHdyaXR0ZW4gdG8uXG4gICAgICpcbiAgICAgKiBAcmVhZG9ubHlcbiAgICAgKi9cbiAgICBnZXQgbGFzdEFjY2Vzc2VkKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5vcmlnaW5hbFJlc3BvbnNlLmxhc3RBY2Nlc3NlZDtcbiAgICB9XG4gICAgLyoqXG4gICAgICogUmV0dXJucyB0aGUgZGF0ZSBhbmQgdGltZSB0aGUgYmxvYiB3YXMgY3JlYXRlZC5cbiAgICAgKlxuICAgICAqIEByZWFkb25seVxuICAgICAqL1xuICAgIGdldCBjcmVhdGVkT24oKSB7XG4gICAgICAgIHJldHVybiB0aGlzLm9yaWdpbmFsUmVzcG9uc2UuY3JlYXRlZE9uO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBBIG5hbWUtdmFsdWUgcGFpclxuICAgICAqIHRvIGFzc29jaWF0ZSB3aXRoIGEgZmlsZSBzdG9yYWdlIG9iamVjdC5cbiAgICAgKlxuICAgICAqIEByZWFkb25seVxuICAgICAqL1xuICAgIGdldCBtZXRhZGF0YSgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMub3JpZ2luYWxSZXNwb25zZS5tZXRhZGF0YTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogVGhpcyBoZWFkZXIgdW5pcXVlbHkgaWRlbnRpZmllcyB0aGUgcmVxdWVzdFxuICAgICAqIHRoYXQgd2FzIG1hZGUgYW5kIGNhbiBiZSB1c2VkIGZvciB0cm91Ymxlc2hvb3RpbmcgdGhlIHJlcXVlc3QuXG4gICAgICpcbiAgICAgKiBAcmVhZG9ubHlcbiAgICAgKi9cbiAgICBnZXQgcmVxdWVzdElkKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5vcmlnaW5hbFJlc3BvbnNlLnJlcXVlc3RJZDtcbiAgICB9XG4gICAgLyoqXG4gICAgICogSWYgYSBjbGllbnQgcmVxdWVzdCBpZCBoZWFkZXIgaXMgc2VudCBpbiB0aGUgcmVxdWVzdCwgdGhpcyBoZWFkZXIgd2lsbCBiZSBwcmVzZW50IGluIHRoZVxuICAgICAqIHJlc3BvbnNlIHdpdGggdGhlIHNhbWUgdmFsdWUuXG4gICAgICpcbiAgICAgKiBAcmVhZG9ubHlcbiAgICAgKi9cbiAgICBnZXQgY2xpZW50UmVxdWVzdElkKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5vcmlnaW5hbFJlc3BvbnNlLmNsaWVudFJlcXVlc3RJZDtcbiAgICB9XG4gICAgLyoqXG4gICAgICogSW5kaWNhdGVzIHRoZSB2ZXJzaW9uIG9mIHRoZSBCbG9iIHNlcnZpY2UgdXNlZFxuICAgICAqIHRvIGV4ZWN1dGUgdGhlIHJlcXVlc3QuXG4gICAgICpcbiAgICAgKiBAcmVhZG9ubHlcbiAgICAgKi9cbiAgICBnZXQgdmVyc2lvbigpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMub3JpZ2luYWxSZXNwb25zZS52ZXJzaW9uO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBJbmRpY2F0ZXMgdGhlIHZlcnNpb25JZCBvZiB0aGUgZG93bmxvYWRlZCBibG9iIHZlcnNpb24uXG4gICAgICpcbiAgICAgKiBAcmVhZG9ubHlcbiAgICAgKi9cbiAgICBnZXQgdmVyc2lvbklkKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5vcmlnaW5hbFJlc3BvbnNlLnZlcnNpb25JZDtcbiAgICB9XG4gICAgLyoqXG4gICAgICogSW5kaWNhdGVzIHdoZXRoZXIgdmVyc2lvbiBvZiB0aGlzIGJsb2IgaXMgYSBjdXJyZW50IHZlcnNpb24uXG4gICAgICpcbiAgICAgKiBAcmVhZG9ubHlcbiAgICAgKi9cbiAgICBnZXQgaXNDdXJyZW50VmVyc2lvbigpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMub3JpZ2luYWxSZXNwb25zZS5pc0N1cnJlbnRWZXJzaW9uO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBUaGUgU0hBLTI1NiBoYXNoIG9mIHRoZSBlbmNyeXB0aW9uIGtleSB1c2VkIHRvIGVuY3J5cHQgdGhlIGJsb2IuIFRoaXMgdmFsdWUgaXMgb25seSByZXR1cm5lZFxuICAgICAqIHdoZW4gdGhlIGJsb2Igd2FzIGVuY3J5cHRlZCB3aXRoIGEgY3VzdG9tZXItcHJvdmlkZWQga2V5LlxuICAgICAqXG4gICAgICogQHJlYWRvbmx5XG4gICAgICovXG4gICAgZ2V0IGVuY3J5cHRpb25LZXlTaGEyNTYoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLm9yaWdpbmFsUmVzcG9uc2UuZW5jcnlwdGlvbktleVNoYTI1NjtcbiAgICB9XG4gICAgLyoqXG4gICAgICogSWYgdGhlIHJlcXVlc3QgaXMgdG8gcmVhZCBhIHNwZWNpZmllZCByYW5nZSBhbmQgdGhlIHgtbXMtcmFuZ2UtZ2V0LWNvbnRlbnQtY3JjNjQgaXMgc2V0IHRvXG4gICAgICogdHJ1ZSwgdGhlbiB0aGUgcmVxdWVzdCByZXR1cm5zIGEgY3JjNjQgZm9yIHRoZSByYW5nZSwgYXMgbG9uZyBhcyB0aGUgcmFuZ2Ugc2l6ZSBpcyBsZXNzIHRoYW5cbiAgICAgKiBvciBlcXVhbCB0byA0IE1CLiBJZiBib3RoIHgtbXMtcmFuZ2UtZ2V0LWNvbnRlbnQtY3JjNjQgJiB4LW1zLXJhbmdlLWdldC1jb250ZW50LW1kNSBpc1xuICAgICAqIHNwZWNpZmllZCBpbiB0aGUgc2FtZSByZXF1ZXN0LCBpdCB3aWxsIGZhaWwgd2l0aCA0MDAoQmFkIFJlcXVlc3QpXG4gICAgICovXG4gICAgZ2V0IGNvbnRlbnRDcmM2NCgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMub3JpZ2luYWxSZXNwb25zZS5jb250ZW50Q3JjNjQ7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIE9iamVjdCBSZXBsaWNhdGlvbiBQb2xpY3kgSWQgb2YgdGhlIGRlc3RpbmF0aW9uIGJsb2IuXG4gICAgICpcbiAgICAgKiBAcmVhZG9ubHlcbiAgICAgKi9cbiAgICBnZXQgb2JqZWN0UmVwbGljYXRpb25EZXN0aW5hdGlvblBvbGljeUlkKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5vcmlnaW5hbFJlc3BvbnNlLm9iamVjdFJlcGxpY2F0aW9uRGVzdGluYXRpb25Qb2xpY3lJZDtcbiAgICB9XG4gICAgLyoqXG4gICAgICogUGFyc2VkIE9iamVjdCBSZXBsaWNhdGlvbiBQb2xpY3kgSWQsIFJ1bGUgSWQocykgYW5kIHN0YXR1cyBvZiB0aGUgc291cmNlIGJsb2IuXG4gICAgICpcbiAgICAgKiBAcmVhZG9ubHlcbiAgICAgKi9cbiAgICBnZXQgb2JqZWN0UmVwbGljYXRpb25Tb3VyY2VQcm9wZXJ0aWVzKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5vcmlnaW5hbFJlc3BvbnNlLm9iamVjdFJlcGxpY2F0aW9uU291cmNlUHJvcGVydGllcztcbiAgICB9XG4gICAgLyoqXG4gICAgICogSWYgdGhpcyBibG9iIGhhcyBiZWVuIHNlYWxlZC5cbiAgICAgKlxuICAgICAqIEByZWFkb25seVxuICAgICAqL1xuICAgIGdldCBpc1NlYWxlZCgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMub3JpZ2luYWxSZXNwb25zZS5pc1NlYWxlZDtcbiAgICB9XG4gICAgLyoqXG4gICAgICogVVRDIGRhdGUvdGltZSB2YWx1ZSBnZW5lcmF0ZWQgYnkgdGhlIHNlcnZpY2UgdGhhdCBpbmRpY2F0ZXMgdGhlIHRpbWUgYXQgd2hpY2ggdGhlIGJsb2IgaW1tdXRhYmlsaXR5IHBvbGljeSB3aWxsIGV4cGlyZS5cbiAgICAgKlxuICAgICAqIEByZWFkb25seVxuICAgICAqL1xuICAgIGdldCBpbW11dGFiaWxpdHlQb2xpY3lFeHBpcmVzT24oKSB7XG4gICAgICAgIHJldHVybiB0aGlzLm9yaWdpbmFsUmVzcG9uc2UuaW1tdXRhYmlsaXR5UG9saWN5RXhwaXJlc09uO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBJbmRpY2F0ZXMgaW1tdXRhYmlsaXR5IHBvbGljeSBtb2RlLlxuICAgICAqXG4gICAgICogQHJlYWRvbmx5XG4gICAgICovXG4gICAgZ2V0IGltbXV0YWJpbGl0eVBvbGljeU1vZGUoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLm9yaWdpbmFsUmVzcG9uc2UuaW1tdXRhYmlsaXR5UG9saWN5TW9kZTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogSW5kaWNhdGVzIGlmIGEgbGVnYWwgaG9sZCBpcyBwcmVzZW50IG9uIHRoZSBibG9iLlxuICAgICAqXG4gICAgICogQHJlYWRvbmx5XG4gICAgICovXG4gICAgZ2V0IGxlZ2FsSG9sZCgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMub3JpZ2luYWxSZXNwb25zZS5sZWdhbEhvbGQ7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIFRoZSByZXNwb25zZSBib2R5IGFzIGEgYnJvd3NlciBCbG9iLlxuICAgICAqIEFsd2F5cyB1bmRlZmluZWQgaW4gbm9kZS5qcy5cbiAgICAgKlxuICAgICAqIEByZWFkb25seVxuICAgICAqL1xuICAgIGdldCBjb250ZW50QXNCbG9iKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5vcmlnaW5hbFJlc3BvbnNlLmJsb2JCb2R5O1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBUaGUgcmVzcG9uc2UgYm9keSBhcyBhIG5vZGUuanMgUmVhZGFibGUgc3RyZWFtLlxuICAgICAqIEFsd2F5cyB1bmRlZmluZWQgaW4gdGhlIGJyb3dzZXIuXG4gICAgICpcbiAgICAgKiBJdCB3aWxsIGF1dG9tYXRpY2FsbHkgcmV0cnkgd2hlbiBpbnRlcm5hbCByZWFkIHN0cmVhbSB1bmV4cGVjdGVkIGVuZHMuXG4gICAgICpcbiAgICAgKiBAcmVhZG9ubHlcbiAgICAgKi9cbiAgICBnZXQgcmVhZGFibGVTdHJlYW1Cb2R5KCkge1xuICAgICAgICByZXR1cm4gY29yZVV0aWwuaXNOb2RlID8gdGhpcy5ibG9iRG93bmxvYWRTdHJlYW0gOiB1bmRlZmluZWQ7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIFRoZSBIVFRQIHJlc3BvbnNlLlxuICAgICAqL1xuICAgIGdldCBfcmVzcG9uc2UoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLm9yaWdpbmFsUmVzcG9uc2UuX3Jlc3BvbnNlO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBDcmVhdGVzIGFuIGluc3RhbmNlIG9mIEJsb2JEb3dubG9hZFJlc3BvbnNlLlxuICAgICAqXG4gICAgICogQHBhcmFtIG9yaWdpbmFsUmVzcG9uc2UgLVxuICAgICAqIEBwYXJhbSBnZXR0ZXIgLVxuICAgICAqIEBwYXJhbSBvZmZzZXQgLVxuICAgICAqIEBwYXJhbSBjb3VudCAtXG4gICAgICogQHBhcmFtIG9wdGlvbnMgLVxuICAgICAqL1xuICAgIGNvbnN0cnVjdG9yKG9yaWdpbmFsUmVzcG9uc2UsIGdldHRlciwgb2Zmc2V0LCBjb3VudCwgb3B0aW9ucyA9IHt9KSB7XG4gICAgICAgIHRoaXMub3JpZ2luYWxSZXNwb25zZSA9IG9yaWdpbmFsUmVzcG9uc2U7XG4gICAgICAgIHRoaXMuYmxvYkRvd25sb2FkU3RyZWFtID0gbmV3IFJldHJpYWJsZVJlYWRhYmxlU3RyZWFtKHRoaXMub3JpZ2luYWxSZXNwb25zZS5yZWFkYWJsZVN0cmVhbUJvZHksIGdldHRlciwgb2Zmc2V0LCBjb3VudCwgb3B0aW9ucyk7XG4gICAgfVxufVxuXG4vLyBDb3B5cmlnaHQgKGMpIE1pY3Jvc29mdCBDb3Jwb3JhdGlvbi5cbi8vIExpY2Vuc2VkIHVuZGVyIHRoZSBNSVQgTGljZW5zZS5cbmNvbnN0IEFWUk9fU1lOQ19NQVJLRVJfU0laRSA9IDE2O1xuY29uc3QgQVZST19JTklUX0JZVEVTID0gbmV3IFVpbnQ4QXJyYXkoWzc5LCA5OCwgMTA2LCAxXSk7XG5jb25zdCBBVlJPX0NPREVDX0tFWSA9IFwiYXZyby5jb2RlY1wiO1xuY29uc3QgQVZST19TQ0hFTUFfS0VZID0gXCJhdnJvLnNjaGVtYVwiO1xuXG4vLyBDb3B5cmlnaHQgKGMpIE1pY3Jvc29mdCBDb3Jwb3JhdGlvbi5cbi8vIExpY2Vuc2VkIHVuZGVyIHRoZSBNSVQgTGljZW5zZS5cbmNsYXNzIEF2cm9QYXJzZXIge1xuICAgIC8qKlxuICAgICAqIFJlYWRzIGEgZml4ZWQgbnVtYmVyIG9mIGJ5dGVzIGZyb20gdGhlIHN0cmVhbS5cbiAgICAgKlxuICAgICAqIEBwYXJhbSBzdHJlYW0gLVxuICAgICAqIEBwYXJhbSBsZW5ndGggLVxuICAgICAqIEBwYXJhbSBvcHRpb25zIC1cbiAgICAgKi9cbiAgICBzdGF0aWMgYXN5bmMgcmVhZEZpeGVkQnl0ZXMoc3RyZWFtLCBsZW5ndGgsIG9wdGlvbnMgPSB7fSkge1xuICAgICAgICBjb25zdCBieXRlcyA9IGF3YWl0IHN0cmVhbS5yZWFkKGxlbmd0aCwgeyBhYm9ydFNpZ25hbDogb3B0aW9ucy5hYm9ydFNpZ25hbCB9KTtcbiAgICAgICAgaWYgKGJ5dGVzLmxlbmd0aCAhPT0gbGVuZ3RoKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJIaXQgc3RyZWFtIGVuZC5cIik7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGJ5dGVzO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBSZWFkcyBhIHNpbmdsZSBieXRlIGZyb20gdGhlIHN0cmVhbS5cbiAgICAgKlxuICAgICAqIEBwYXJhbSBzdHJlYW0gLVxuICAgICAqIEBwYXJhbSBvcHRpb25zIC1cbiAgICAgKi9cbiAgICBzdGF0aWMgYXN5bmMgcmVhZEJ5dGUoc3RyZWFtLCBvcHRpb25zID0ge30pIHtcbiAgICAgICAgY29uc3QgYnVmID0gYXdhaXQgQXZyb1BhcnNlci5yZWFkRml4ZWRCeXRlcyhzdHJlYW0sIDEsIG9wdGlvbnMpO1xuICAgICAgICByZXR1cm4gYnVmWzBdO1xuICAgIH1cbiAgICAvLyBpbnQgYW5kIGxvbmcgYXJlIHN0b3JlZCBpbiB2YXJpYWJsZS1sZW5ndGggemlnLXphZyBjb2RpbmcuXG4gICAgLy8gdmFyaWFibGUtbGVuZ3RoOiBodHRwczovL2x1Y2VuZS5hcGFjaGUub3JnL2NvcmUvM181XzAvZmlsZWZvcm1hdHMuaHRtbCNWSW50XG4gICAgLy8gemlnLXphZzogaHR0cHM6Ly9kZXZlbG9wZXJzLmdvb2dsZS5jb20vcHJvdG9jb2wtYnVmZmVycy9kb2NzL2VuY29kaW5nP2Nzdz0xI3R5cGVzXG4gICAgc3RhdGljIGFzeW5jIHJlYWRaaWdaYWdMb25nKHN0cmVhbSwgb3B0aW9ucyA9IHt9KSB7XG4gICAgICAgIGxldCB6aWdaYWdFbmNvZGVkID0gMDtcbiAgICAgICAgbGV0IHNpZ25pZmljYW5jZUluQml0ID0gMDtcbiAgICAgICAgbGV0IGJ5dGUsIGhhdmVNb3JlQnl0ZSwgc2lnbmlmaWNhbmNlSW5GbG9hdDtcbiAgICAgICAgZG8ge1xuICAgICAgICAgICAgYnl0ZSA9IGF3YWl0IEF2cm9QYXJzZXIucmVhZEJ5dGUoc3RyZWFtLCBvcHRpb25zKTtcbiAgICAgICAgICAgIGhhdmVNb3JlQnl0ZSA9IGJ5dGUgJiAweDgwO1xuICAgICAgICAgICAgemlnWmFnRW5jb2RlZCB8PSAoYnl0ZSAmIDB4N2YpIDw8IHNpZ25pZmljYW5jZUluQml0O1xuICAgICAgICAgICAgc2lnbmlmaWNhbmNlSW5CaXQgKz0gNztcbiAgICAgICAgfSB3aGlsZSAoaGF2ZU1vcmVCeXRlICYmIHNpZ25pZmljYW5jZUluQml0IDwgMjgpOyAvLyBiaXR3aXNlIG9wZXJhdGlvbiBvbmx5IHdvcmtzIGZvciAzMi1iaXQgaW50ZWdlcnNcbiAgICAgICAgaWYgKGhhdmVNb3JlQnl0ZSkge1xuICAgICAgICAgICAgLy8gU3dpdGNoIHRvIGZsb2F0IGFyaXRobWV0aWNcbiAgICAgICAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby1zZWxmLWFzc2lnblxuICAgICAgICAgICAgemlnWmFnRW5jb2RlZCA9IHppZ1phZ0VuY29kZWQ7XG4gICAgICAgICAgICBzaWduaWZpY2FuY2VJbkZsb2F0ID0gMjY4NDM1NDU2OyAvLyAyICoqIDI4LlxuICAgICAgICAgICAgZG8ge1xuICAgICAgICAgICAgICAgIGJ5dGUgPSBhd2FpdCBBdnJvUGFyc2VyLnJlYWRCeXRlKHN0cmVhbSwgb3B0aW9ucyk7XG4gICAgICAgICAgICAgICAgemlnWmFnRW5jb2RlZCArPSAoYnl0ZSAmIDB4N2YpICogc2lnbmlmaWNhbmNlSW5GbG9hdDtcbiAgICAgICAgICAgICAgICBzaWduaWZpY2FuY2VJbkZsb2F0ICo9IDEyODsgLy8gMiAqKiA3XG4gICAgICAgICAgICB9IHdoaWxlIChieXRlICYgMHg4MCk7XG4gICAgICAgICAgICBjb25zdCByZXMgPSAoemlnWmFnRW5jb2RlZCAlIDIgPyAtKHppZ1phZ0VuY29kZWQgKyAxKSA6IHppZ1phZ0VuY29kZWQpIC8gMjtcbiAgICAgICAgICAgIGlmIChyZXMgPCBOdW1iZXIuTUlOX1NBRkVfSU5URUdFUiB8fCByZXMgPiBOdW1iZXIuTUFYX1NBRkVfSU5URUdFUikge1xuICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihcIkludGVnZXIgb3ZlcmZsb3cuXCIpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIHJlcztcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gKHppZ1phZ0VuY29kZWQgPj4gMSkgXiAtKHppZ1phZ0VuY29kZWQgJiAxKTtcbiAgICB9XG4gICAgc3RhdGljIGFzeW5jIHJlYWRMb25nKHN0cmVhbSwgb3B0aW9ucyA9IHt9KSB7XG4gICAgICAgIHJldHVybiBBdnJvUGFyc2VyLnJlYWRaaWdaYWdMb25nKHN0cmVhbSwgb3B0aW9ucyk7XG4gICAgfVxuICAgIHN0YXRpYyBhc3luYyByZWFkSW50KHN0cmVhbSwgb3B0aW9ucyA9IHt9KSB7XG4gICAgICAgIHJldHVybiBBdnJvUGFyc2VyLnJlYWRaaWdaYWdMb25nKHN0cmVhbSwgb3B0aW9ucyk7XG4gICAgfVxuICAgIHN0YXRpYyBhc3luYyByZWFkTnVsbCgpIHtcbiAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuICAgIHN0YXRpYyBhc3luYyByZWFkQm9vbGVhbihzdHJlYW0sIG9wdGlvbnMgPSB7fSkge1xuICAgICAgICBjb25zdCBiID0gYXdhaXQgQXZyb1BhcnNlci5yZWFkQnl0ZShzdHJlYW0sIG9wdGlvbnMpO1xuICAgICAgICBpZiAoYiA9PT0gMSkge1xuICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSBpZiAoYiA9PT0gMCkge1xuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwiQnl0ZSB3YXMgbm90IGEgYm9vbGVhbi5cIik7XG4gICAgICAgIH1cbiAgICB9XG4gICAgc3RhdGljIGFzeW5jIHJlYWRGbG9hdChzdHJlYW0sIG9wdGlvbnMgPSB7fSkge1xuICAgICAgICBjb25zdCB1OGFyciA9IGF3YWl0IEF2cm9QYXJzZXIucmVhZEZpeGVkQnl0ZXMoc3RyZWFtLCA0LCBvcHRpb25zKTtcbiAgICAgICAgY29uc3QgdmlldyA9IG5ldyBEYXRhVmlldyh1OGFyci5idWZmZXIsIHU4YXJyLmJ5dGVPZmZzZXQsIHU4YXJyLmJ5dGVMZW5ndGgpO1xuICAgICAgICByZXR1cm4gdmlldy5nZXRGbG9hdDMyKDAsIHRydWUpOyAvLyBsaXR0bGVFbmRpYW4gPSB0cnVlXG4gICAgfVxuICAgIHN0YXRpYyBhc3luYyByZWFkRG91YmxlKHN0cmVhbSwgb3B0aW9ucyA9IHt9KSB7XG4gICAgICAgIGNvbnN0IHU4YXJyID0gYXdhaXQgQXZyb1BhcnNlci5yZWFkRml4ZWRCeXRlcyhzdHJlYW0sIDgsIG9wdGlvbnMpO1xuICAgICAgICBjb25zdCB2aWV3ID0gbmV3IERhdGFWaWV3KHU4YXJyLmJ1ZmZlciwgdThhcnIuYnl0ZU9mZnNldCwgdThhcnIuYnl0ZUxlbmd0aCk7XG4gICAgICAgIHJldHVybiB2aWV3LmdldEZsb2F0NjQoMCwgdHJ1ZSk7IC8vIGxpdHRsZUVuZGlhbiA9IHRydWVcbiAgICB9XG4gICAgc3RhdGljIGFzeW5jIHJlYWRCeXRlcyhzdHJlYW0sIG9wdGlvbnMgPSB7fSkge1xuICAgICAgICBjb25zdCBzaXplID0gYXdhaXQgQXZyb1BhcnNlci5yZWFkTG9uZyhzdHJlYW0sIG9wdGlvbnMpO1xuICAgICAgICBpZiAoc2l6ZSA8IDApIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihcIkJ5dGVzIHNpemUgd2FzIG5lZ2F0aXZlLlwiKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gc3RyZWFtLnJlYWQoc2l6ZSwgeyBhYm9ydFNpZ25hbDogb3B0aW9ucy5hYm9ydFNpZ25hbCB9KTtcbiAgICB9XG4gICAgc3RhdGljIGFzeW5jIHJlYWRTdHJpbmcoc3RyZWFtLCBvcHRpb25zID0ge30pIHtcbiAgICAgICAgY29uc3QgdThhcnIgPSBhd2FpdCBBdnJvUGFyc2VyLnJlYWRCeXRlcyhzdHJlYW0sIG9wdGlvbnMpO1xuICAgICAgICBjb25zdCB1dGY4ZGVjb2RlciA9IG5ldyBUZXh0RGVjb2RlcigpO1xuICAgICAgICByZXR1cm4gdXRmOGRlY29kZXIuZGVjb2RlKHU4YXJyKTtcbiAgICB9XG4gICAgc3RhdGljIGFzeW5jIHJlYWRNYXBQYWlyKHN0cmVhbSwgcmVhZEl0ZW1NZXRob2QsIG9wdGlvbnMgPSB7fSkge1xuICAgICAgICBjb25zdCBrZXkgPSBhd2FpdCBBdnJvUGFyc2VyLnJlYWRTdHJpbmcoc3RyZWFtLCBvcHRpb25zKTtcbiAgICAgICAgLy8gRlVUVVJFOiB0aGlzIHdvbid0IHdvcmsgd2l0aCByZWFkRml4ZWQgKGN1cnJlbnRseSBub3Qgc3VwcG9ydGVkKSB3aGljaCBuZWVkcyBhIGxlbmd0aCBhcyB0aGUgcGFyYW1ldGVyLlxuICAgICAgICBjb25zdCB2YWx1ZSA9IGF3YWl0IHJlYWRJdGVtTWV0aG9kKHN0cmVhbSwgb3B0aW9ucyk7XG4gICAgICAgIHJldHVybiB7IGtleSwgdmFsdWUgfTtcbiAgICB9XG4gICAgc3RhdGljIGFzeW5jIHJlYWRNYXAoc3RyZWFtLCByZWFkSXRlbU1ldGhvZCwgb3B0aW9ucyA9IHt9KSB7XG4gICAgICAgIGNvbnN0IHJlYWRQYWlyTWV0aG9kID0gKHMsIG9wdHMgPSB7fSkgPT4ge1xuICAgICAgICAgICAgcmV0dXJuIEF2cm9QYXJzZXIucmVhZE1hcFBhaXIocywgcmVhZEl0ZW1NZXRob2QsIG9wdHMpO1xuICAgICAgICB9O1xuICAgICAgICBjb25zdCBwYWlycyA9IGF3YWl0IEF2cm9QYXJzZXIucmVhZEFycmF5KHN0cmVhbSwgcmVhZFBhaXJNZXRob2QsIG9wdGlvbnMpO1xuICAgICAgICBjb25zdCBkaWN0ID0ge307XG4gICAgICAgIGZvciAoY29uc3QgcGFpciBvZiBwYWlycykge1xuICAgICAgICAgICAgZGljdFtwYWlyLmtleV0gPSBwYWlyLnZhbHVlO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBkaWN0O1xuICAgIH1cbiAgICBzdGF0aWMgYXN5bmMgcmVhZEFycmF5KHN0cmVhbSwgcmVhZEl0ZW1NZXRob2QsIG9wdGlvbnMgPSB7fSkge1xuICAgICAgICBjb25zdCBpdGVtcyA9IFtdO1xuICAgICAgICBmb3IgKGxldCBjb3VudCA9IGF3YWl0IEF2cm9QYXJzZXIucmVhZExvbmcoc3RyZWFtLCBvcHRpb25zKTsgY291bnQgIT09IDA7IGNvdW50ID0gYXdhaXQgQXZyb1BhcnNlci5yZWFkTG9uZyhzdHJlYW0sIG9wdGlvbnMpKSB7XG4gICAgICAgICAgICBpZiAoY291bnQgPCAwKSB7XG4gICAgICAgICAgICAgICAgLy8gSWdub3JlIGJsb2NrIHNpemVzXG4gICAgICAgICAgICAgICAgYXdhaXQgQXZyb1BhcnNlci5yZWFkTG9uZyhzdHJlYW0sIG9wdGlvbnMpO1xuICAgICAgICAgICAgICAgIGNvdW50ID0gLWNvdW50O1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgd2hpbGUgKGNvdW50LS0pIHtcbiAgICAgICAgICAgICAgICBjb25zdCBpdGVtID0gYXdhaXQgcmVhZEl0ZW1NZXRob2Qoc3RyZWFtLCBvcHRpb25zKTtcbiAgICAgICAgICAgICAgICBpdGVtcy5wdXNoKGl0ZW0pO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiBpdGVtcztcbiAgICB9XG59XG52YXIgQXZyb0NvbXBsZXg7XG4oZnVuY3Rpb24gKEF2cm9Db21wbGV4KSB7XG4gICAgQXZyb0NvbXBsZXhbXCJSRUNPUkRcIl0gPSBcInJlY29yZFwiO1xuICAgIEF2cm9Db21wbGV4W1wiRU5VTVwiXSA9IFwiZW51bVwiO1xuICAgIEF2cm9Db21wbGV4W1wiQVJSQVlcIl0gPSBcImFycmF5XCI7XG4gICAgQXZyb0NvbXBsZXhbXCJNQVBcIl0gPSBcIm1hcFwiO1xuICAgIEF2cm9Db21wbGV4W1wiVU5JT05cIl0gPSBcInVuaW9uXCI7XG4gICAgQXZyb0NvbXBsZXhbXCJGSVhFRFwiXSA9IFwiZml4ZWRcIjtcbn0pKEF2cm9Db21wbGV4IHx8IChBdnJvQ29tcGxleCA9IHt9KSk7XG52YXIgQXZyb1ByaW1pdGl2ZTtcbihmdW5jdGlvbiAoQXZyb1ByaW1pdGl2ZSkge1xuICAgIEF2cm9QcmltaXRpdmVbXCJOVUxMXCJdID0gXCJudWxsXCI7XG4gICAgQXZyb1ByaW1pdGl2ZVtcIkJPT0xFQU5cIl0gPSBcImJvb2xlYW5cIjtcbiAgICBBdnJvUHJpbWl0aXZlW1wiSU5UXCJdID0gXCJpbnRcIjtcbiAgICBBdnJvUHJpbWl0aXZlW1wiTE9OR1wiXSA9IFwibG9uZ1wiO1xuICAgIEF2cm9QcmltaXRpdmVbXCJGTE9BVFwiXSA9IFwiZmxvYXRcIjtcbiAgICBBdnJvUHJpbWl0aXZlW1wiRE9VQkxFXCJdID0gXCJkb3VibGVcIjtcbiAgICBBdnJvUHJpbWl0aXZlW1wiQllURVNcIl0gPSBcImJ5dGVzXCI7XG4gICAgQXZyb1ByaW1pdGl2ZVtcIlNUUklOR1wiXSA9IFwic3RyaW5nXCI7XG59KShBdnJvUHJpbWl0aXZlIHx8IChBdnJvUHJpbWl0aXZlID0ge30pKTtcbmNsYXNzIEF2cm9UeXBlIHtcbiAgICAvKipcbiAgICAgKiBEZXRlcm1pbmVzIHRoZSBBdnJvVHlwZSBmcm9tIHRoZSBBdnJvIFNjaGVtYS5cbiAgICAgKi9cbiAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLXdyYXBwZXItb2JqZWN0LXR5cGVzXG4gICAgc3RhdGljIGZyb21TY2hlbWEoc2NoZW1hKSB7XG4gICAgICAgIGlmICh0eXBlb2Ygc2NoZW1hID09PSBcInN0cmluZ1wiKSB7XG4gICAgICAgICAgICByZXR1cm4gQXZyb1R5cGUuZnJvbVN0cmluZ1NjaGVtYShzY2hlbWEpO1xuICAgICAgICB9XG4gICAgICAgIGVsc2UgaWYgKEFycmF5LmlzQXJyYXkoc2NoZW1hKSkge1xuICAgICAgICAgICAgcmV0dXJuIEF2cm9UeXBlLmZyb21BcnJheVNjaGVtYShzY2hlbWEpO1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgcmV0dXJuIEF2cm9UeXBlLmZyb21PYmplY3RTY2hlbWEoc2NoZW1hKTtcbiAgICAgICAgfVxuICAgIH1cbiAgICBzdGF0aWMgZnJvbVN0cmluZ1NjaGVtYShzY2hlbWEpIHtcbiAgICAgICAgc3dpdGNoIChzY2hlbWEpIHtcbiAgICAgICAgICAgIGNhc2UgQXZyb1ByaW1pdGl2ZS5OVUxMOlxuICAgICAgICAgICAgY2FzZSBBdnJvUHJpbWl0aXZlLkJPT0xFQU46XG4gICAgICAgICAgICBjYXNlIEF2cm9QcmltaXRpdmUuSU5UOlxuICAgICAgICAgICAgY2FzZSBBdnJvUHJpbWl0aXZlLkxPTkc6XG4gICAgICAgICAgICBjYXNlIEF2cm9QcmltaXRpdmUuRkxPQVQ6XG4gICAgICAgICAgICBjYXNlIEF2cm9QcmltaXRpdmUuRE9VQkxFOlxuICAgICAgICAgICAgY2FzZSBBdnJvUHJpbWl0aXZlLkJZVEVTOlxuICAgICAgICAgICAgY2FzZSBBdnJvUHJpbWl0aXZlLlNUUklORzpcbiAgICAgICAgICAgICAgICByZXR1cm4gbmV3IEF2cm9QcmltaXRpdmVUeXBlKHNjaGVtYSk7XG4gICAgICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihgVW5leHBlY3RlZCBBdnJvIHR5cGUgJHtzY2hlbWF9YCk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgc3RhdGljIGZyb21BcnJheVNjaGVtYShzY2hlbWEpIHtcbiAgICAgICAgcmV0dXJuIG5ldyBBdnJvVW5pb25UeXBlKHNjaGVtYS5tYXAoQXZyb1R5cGUuZnJvbVNjaGVtYSkpO1xuICAgIH1cbiAgICBzdGF0aWMgZnJvbU9iamVjdFNjaGVtYShzY2hlbWEpIHtcbiAgICAgICAgY29uc3QgdHlwZSA9IHNjaGVtYS50eXBlO1xuICAgICAgICAvLyBQcmltaXRpdmVzIGNhbiBiZSBkZWZpbmVkIGFzIHN0cmluZ3Mgb3Igb2JqZWN0c1xuICAgICAgICB0cnkge1xuICAgICAgICAgICAgcmV0dXJuIEF2cm9UeXBlLmZyb21TdHJpbmdTY2hlbWEodHlwZSk7XG4gICAgICAgIH1cbiAgICAgICAgY2F0Y2ggKF9hKSB7XG4gICAgICAgICAgICAvLyBlc2xpbnQtZGlzYWJsZS1saW5lIG5vLWVtcHR5XG4gICAgICAgIH1cbiAgICAgICAgc3dpdGNoICh0eXBlKSB7XG4gICAgICAgICAgICBjYXNlIEF2cm9Db21wbGV4LlJFQ09SRDpcbiAgICAgICAgICAgICAgICBpZiAoc2NoZW1hLmFsaWFzZXMpIHtcbiAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBhbGlhc2VzIGN1cnJlbnRseSBpcyBub3Qgc3VwcG9ydGVkLCBzY2hlbWE6ICR7c2NoZW1hfWApO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBpZiAoIXNjaGVtYS5uYW1lKSB7XG4gICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihgUmVxdWlyZWQgYXR0cmlidXRlICduYW1lJyBkb2Vzbid0IGV4aXN0IG9uIHNjaGVtYTogJHtzY2hlbWF9YCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby1jYXNlLWRlY2xhcmF0aW9uc1xuICAgICAgICAgICAgICAgIGNvbnN0IGZpZWxkcyA9IHt9O1xuICAgICAgICAgICAgICAgIGlmICghc2NoZW1hLmZpZWxkcykge1xuICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYFJlcXVpcmVkIGF0dHJpYnV0ZSAnZmllbGRzJyBkb2Vzbid0IGV4aXN0IG9uIHNjaGVtYTogJHtzY2hlbWF9YCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGZvciAoY29uc3QgZmllbGQgb2Ygc2NoZW1hLmZpZWxkcykge1xuICAgICAgICAgICAgICAgICAgICBmaWVsZHNbZmllbGQubmFtZV0gPSBBdnJvVHlwZS5mcm9tU2NoZW1hKGZpZWxkLnR5cGUpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICByZXR1cm4gbmV3IEF2cm9SZWNvcmRUeXBlKGZpZWxkcywgc2NoZW1hLm5hbWUpO1xuICAgICAgICAgICAgY2FzZSBBdnJvQ29tcGxleC5FTlVNOlxuICAgICAgICAgICAgICAgIGlmIChzY2hlbWEuYWxpYXNlcykge1xuICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYGFsaWFzZXMgY3VycmVudGx5IGlzIG5vdCBzdXBwb3J0ZWQsIHNjaGVtYTogJHtzY2hlbWF9YCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGlmICghc2NoZW1hLnN5bWJvbHMpIHtcbiAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBSZXF1aXJlZCBhdHRyaWJ1dGUgJ3N5bWJvbHMnIGRvZXNuJ3QgZXhpc3Qgb24gc2NoZW1hOiAke3NjaGVtYX1gKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBBdnJvRW51bVR5cGUoc2NoZW1hLnN5bWJvbHMpO1xuICAgICAgICAgICAgY2FzZSBBdnJvQ29tcGxleC5NQVA6XG4gICAgICAgICAgICAgICAgaWYgKCFzY2hlbWEudmFsdWVzKSB7XG4gICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihgUmVxdWlyZWQgYXR0cmlidXRlICd2YWx1ZXMnIGRvZXNuJ3QgZXhpc3Qgb24gc2NoZW1hOiAke3NjaGVtYX1gKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBBdnJvTWFwVHlwZShBdnJvVHlwZS5mcm9tU2NoZW1hKHNjaGVtYS52YWx1ZXMpKTtcbiAgICAgICAgICAgIGNhc2UgQXZyb0NvbXBsZXguQVJSQVk6IC8vIFVudXNlZCB0b2RheVxuICAgICAgICAgICAgY2FzZSBBdnJvQ29tcGxleC5GSVhFRDogLy8gVW51c2VkIHRvZGF5XG4gICAgICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihgVW5leHBlY3RlZCBBdnJvIHR5cGUgJHt0eXBlfSBpbiAke3NjaGVtYX1gKTtcbiAgICAgICAgfVxuICAgIH1cbn1cbmNsYXNzIEF2cm9QcmltaXRpdmVUeXBlIGV4dGVuZHMgQXZyb1R5cGUge1xuICAgIGNvbnN0cnVjdG9yKHByaW1pdGl2ZSkge1xuICAgICAgICBzdXBlcigpO1xuICAgICAgICB0aGlzLl9wcmltaXRpdmUgPSBwcmltaXRpdmU7XG4gICAgfVxuICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8td3JhcHBlci1vYmplY3QtdHlwZXNcbiAgICByZWFkKHN0cmVhbSwgb3B0aW9ucyA9IHt9KSB7XG4gICAgICAgIHN3aXRjaCAodGhpcy5fcHJpbWl0aXZlKSB7XG4gICAgICAgICAgICBjYXNlIEF2cm9QcmltaXRpdmUuTlVMTDpcbiAgICAgICAgICAgICAgICByZXR1cm4gQXZyb1BhcnNlci5yZWFkTnVsbCgpO1xuICAgICAgICAgICAgY2FzZSBBdnJvUHJpbWl0aXZlLkJPT0xFQU46XG4gICAgICAgICAgICAgICAgcmV0dXJuIEF2cm9QYXJzZXIucmVhZEJvb2xlYW4oc3RyZWFtLCBvcHRpb25zKTtcbiAgICAgICAgICAgIGNhc2UgQXZyb1ByaW1pdGl2ZS5JTlQ6XG4gICAgICAgICAgICAgICAgcmV0dXJuIEF2cm9QYXJzZXIucmVhZEludChzdHJlYW0sIG9wdGlvbnMpO1xuICAgICAgICAgICAgY2FzZSBBdnJvUHJpbWl0aXZlLkxPTkc6XG4gICAgICAgICAgICAgICAgcmV0dXJuIEF2cm9QYXJzZXIucmVhZExvbmcoc3RyZWFtLCBvcHRpb25zKTtcbiAgICAgICAgICAgIGNhc2UgQXZyb1ByaW1pdGl2ZS5GTE9BVDpcbiAgICAgICAgICAgICAgICByZXR1cm4gQXZyb1BhcnNlci5yZWFkRmxvYXQoc3RyZWFtLCBvcHRpb25zKTtcbiAgICAgICAgICAgIGNhc2UgQXZyb1ByaW1pdGl2ZS5ET1VCTEU6XG4gICAgICAgICAgICAgICAgcmV0dXJuIEF2cm9QYXJzZXIucmVhZERvdWJsZShzdHJlYW0sIG9wdGlvbnMpO1xuICAgICAgICAgICAgY2FzZSBBdnJvUHJpbWl0aXZlLkJZVEVTOlxuICAgICAgICAgICAgICAgIHJldHVybiBBdnJvUGFyc2VyLnJlYWRCeXRlcyhzdHJlYW0sIG9wdGlvbnMpO1xuICAgICAgICAgICAgY2FzZSBBdnJvUHJpbWl0aXZlLlNUUklORzpcbiAgICAgICAgICAgICAgICByZXR1cm4gQXZyb1BhcnNlci5yZWFkU3RyaW5nKHN0cmVhbSwgb3B0aW9ucyk7XG4gICAgICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihcIlVua25vd24gQXZybyBQcmltaXRpdmVcIik7XG4gICAgICAgIH1cbiAgICB9XG59XG5jbGFzcyBBdnJvRW51bVR5cGUgZXh0ZW5kcyBBdnJvVHlwZSB7XG4gICAgY29uc3RydWN0b3Ioc3ltYm9scykge1xuICAgICAgICBzdXBlcigpO1xuICAgICAgICB0aGlzLl9zeW1ib2xzID0gc3ltYm9scztcbiAgICB9XG4gICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby13cmFwcGVyLW9iamVjdC10eXBlc1xuICAgIGFzeW5jIHJlYWQoc3RyZWFtLCBvcHRpb25zID0ge30pIHtcbiAgICAgICAgY29uc3QgdmFsdWUgPSBhd2FpdCBBdnJvUGFyc2VyLnJlYWRJbnQoc3RyZWFtLCBvcHRpb25zKTtcbiAgICAgICAgcmV0dXJuIHRoaXMuX3N5bWJvbHNbdmFsdWVdO1xuICAgIH1cbn1cbmNsYXNzIEF2cm9VbmlvblR5cGUgZXh0ZW5kcyBBdnJvVHlwZSB7XG4gICAgY29uc3RydWN0b3IodHlwZXMpIHtcbiAgICAgICAgc3VwZXIoKTtcbiAgICAgICAgdGhpcy5fdHlwZXMgPSB0eXBlcztcbiAgICB9XG4gICAgYXN5bmMgcmVhZChzdHJlYW0sIG9wdGlvbnMgPSB7fSkge1xuICAgICAgICBjb25zdCB0eXBlSW5kZXggPSBhd2FpdCBBdnJvUGFyc2VyLnJlYWRJbnQoc3RyZWFtLCBvcHRpb25zKTtcbiAgICAgICAgcmV0dXJuIHRoaXMuX3R5cGVzW3R5cGVJbmRleF0ucmVhZChzdHJlYW0sIG9wdGlvbnMpO1xuICAgIH1cbn1cbmNsYXNzIEF2cm9NYXBUeXBlIGV4dGVuZHMgQXZyb1R5cGUge1xuICAgIGNvbnN0cnVjdG9yKGl0ZW1UeXBlKSB7XG4gICAgICAgIHN1cGVyKCk7XG4gICAgICAgIHRoaXMuX2l0ZW1UeXBlID0gaXRlbVR5cGU7XG4gICAgfVxuICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8td3JhcHBlci1vYmplY3QtdHlwZXNcbiAgICByZWFkKHN0cmVhbSwgb3B0aW9ucyA9IHt9KSB7XG4gICAgICAgIGNvbnN0IHJlYWRJdGVtTWV0aG9kID0gKHMsIG9wdHMpID0+IHtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLl9pdGVtVHlwZS5yZWFkKHMsIG9wdHMpO1xuICAgICAgICB9O1xuICAgICAgICByZXR1cm4gQXZyb1BhcnNlci5yZWFkTWFwKHN0cmVhbSwgcmVhZEl0ZW1NZXRob2QsIG9wdGlvbnMpO1xuICAgIH1cbn1cbmNsYXNzIEF2cm9SZWNvcmRUeXBlIGV4dGVuZHMgQXZyb1R5cGUge1xuICAgIGNvbnN0cnVjdG9yKGZpZWxkcywgbmFtZSkge1xuICAgICAgICBzdXBlcigpO1xuICAgICAgICB0aGlzLl9maWVsZHMgPSBmaWVsZHM7XG4gICAgICAgIHRoaXMuX25hbWUgPSBuYW1lO1xuICAgIH1cbiAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLXdyYXBwZXItb2JqZWN0LXR5cGVzXG4gICAgYXN5bmMgcmVhZChzdHJlYW0sIG9wdGlvbnMgPSB7fSkge1xuICAgICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLXdyYXBwZXItb2JqZWN0LXR5cGVzXG4gICAgICAgIGNvbnN0IHJlY29yZCA9IHt9O1xuICAgICAgICByZWNvcmRbXCIkc2NoZW1hXCJdID0gdGhpcy5fbmFtZTtcbiAgICAgICAgZm9yIChjb25zdCBrZXkgaW4gdGhpcy5fZmllbGRzKSB7XG4gICAgICAgICAgICBpZiAoT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKHRoaXMuX2ZpZWxkcywga2V5KSkge1xuICAgICAgICAgICAgICAgIHJlY29yZFtrZXldID0gYXdhaXQgdGhpcy5fZmllbGRzW2tleV0ucmVhZChzdHJlYW0sIG9wdGlvbnMpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiByZWNvcmQ7XG4gICAgfVxufVxuXG4vLyBDb3B5cmlnaHQgKGMpIE1pY3Jvc29mdCBDb3Jwb3JhdGlvbi5cbi8vIExpY2Vuc2VkIHVuZGVyIHRoZSBNSVQgTGljZW5zZS5cbmZ1bmN0aW9uIGFycmF5c0VxdWFsKGEsIGIpIHtcbiAgICBpZiAoYSA9PT0gYilcbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIGVxZXFlcVxuICAgIGlmIChhID09IG51bGwgfHwgYiA9PSBudWxsKVxuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgaWYgKGEubGVuZ3RoICE9PSBiLmxlbmd0aClcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgYS5sZW5ndGg7ICsraSkge1xuICAgICAgICBpZiAoYVtpXSAhPT0gYltpXSlcbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gICAgcmV0dXJuIHRydWU7XG59XG5cbi8vIENvcHlyaWdodCAoYykgTWljcm9zb2Z0IENvcnBvcmF0aW9uLlxuLy8gTGljZW5zZWQgdW5kZXIgdGhlIE1JVCBMaWNlbnNlLlxuY2xhc3MgQXZyb1JlYWRlciB7XG4gICAgZ2V0IGJsb2NrT2Zmc2V0KCkge1xuICAgICAgICByZXR1cm4gdGhpcy5fYmxvY2tPZmZzZXQ7XG4gICAgfVxuICAgIGdldCBvYmplY3RJbmRleCgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX29iamVjdEluZGV4O1xuICAgIH1cbiAgICBjb25zdHJ1Y3RvcihkYXRhU3RyZWFtLCBoZWFkZXJTdHJlYW0sIGN1cnJlbnRCbG9ja09mZnNldCwgaW5kZXhXaXRoaW5DdXJyZW50QmxvY2spIHtcbiAgICAgICAgdGhpcy5fZGF0YVN0cmVhbSA9IGRhdGFTdHJlYW07XG4gICAgICAgIHRoaXMuX2hlYWRlclN0cmVhbSA9IGhlYWRlclN0cmVhbSB8fCBkYXRhU3RyZWFtO1xuICAgICAgICB0aGlzLl9pbml0aWFsaXplZCA9IGZhbHNlO1xuICAgICAgICB0aGlzLl9ibG9ja09mZnNldCA9IGN1cnJlbnRCbG9ja09mZnNldCB8fCAwO1xuICAgICAgICB0aGlzLl9vYmplY3RJbmRleCA9IGluZGV4V2l0aGluQ3VycmVudEJsb2NrIHx8IDA7XG4gICAgICAgIHRoaXMuX2luaXRpYWxCbG9ja09mZnNldCA9IGN1cnJlbnRCbG9ja09mZnNldCB8fCAwO1xuICAgIH1cbiAgICBhc3luYyBpbml0aWFsaXplKG9wdGlvbnMgPSB7fSkge1xuICAgICAgICBjb25zdCBoZWFkZXIgPSBhd2FpdCBBdnJvUGFyc2VyLnJlYWRGaXhlZEJ5dGVzKHRoaXMuX2hlYWRlclN0cmVhbSwgQVZST19JTklUX0JZVEVTLmxlbmd0aCwge1xuICAgICAgICAgICAgYWJvcnRTaWduYWw6IG9wdGlvbnMuYWJvcnRTaWduYWwsXG4gICAgICAgIH0pO1xuICAgICAgICBpZiAoIWFycmF5c0VxdWFsKGhlYWRlciwgQVZST19JTklUX0JZVEVTKSkge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwiU3RyZWFtIGlzIG5vdCBhbiBBdnJvIGZpbGUuXCIpO1xuICAgICAgICB9XG4gICAgICAgIC8vIEZpbGUgbWV0YWRhdGEgaXMgd3JpdHRlbiBhcyBpZiBkZWZpbmVkIGJ5IHRoZSBmb2xsb3dpbmcgbWFwIHNjaGVtYTpcbiAgICAgICAgLy8geyBcInR5cGVcIjogXCJtYXBcIiwgXCJ2YWx1ZXNcIjogXCJieXRlc1wifVxuICAgICAgICB0aGlzLl9tZXRhZGF0YSA9IGF3YWl0IEF2cm9QYXJzZXIucmVhZE1hcCh0aGlzLl9oZWFkZXJTdHJlYW0sIEF2cm9QYXJzZXIucmVhZFN0cmluZywge1xuICAgICAgICAgICAgYWJvcnRTaWduYWw6IG9wdGlvbnMuYWJvcnRTaWduYWwsXG4gICAgICAgIH0pO1xuICAgICAgICAvLyBWYWxpZGF0ZSBjb2RlY1xuICAgICAgICBjb25zdCBjb2RlYyA9IHRoaXMuX21ldGFkYXRhW0FWUk9fQ09ERUNfS0VZXTtcbiAgICAgICAgaWYgKCEoY29kZWMgPT09IHVuZGVmaW5lZCB8fCBjb2RlYyA9PT0gbnVsbCB8fCBjb2RlYyA9PT0gXCJudWxsXCIpKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJDb2RlY3MgYXJlIG5vdCBzdXBwb3J0ZWRcIik7XG4gICAgICAgIH1cbiAgICAgICAgLy8gVGhlIDE2LWJ5dGUsIHJhbmRvbWx5LWdlbmVyYXRlZCBzeW5jIG1hcmtlciBmb3IgdGhpcyBmaWxlLlxuICAgICAgICB0aGlzLl9zeW5jTWFya2VyID0gYXdhaXQgQXZyb1BhcnNlci5yZWFkRml4ZWRCeXRlcyh0aGlzLl9oZWFkZXJTdHJlYW0sIEFWUk9fU1lOQ19NQVJLRVJfU0laRSwge1xuICAgICAgICAgICAgYWJvcnRTaWduYWw6IG9wdGlvbnMuYWJvcnRTaWduYWwsXG4gICAgICAgIH0pO1xuICAgICAgICAvLyBQYXJzZSB0aGUgc2NoZW1hXG4gICAgICAgIGNvbnN0IHNjaGVtYSA9IEpTT04ucGFyc2UodGhpcy5fbWV0YWRhdGFbQVZST19TQ0hFTUFfS0VZXSk7XG4gICAgICAgIHRoaXMuX2l0ZW1UeXBlID0gQXZyb1R5cGUuZnJvbVNjaGVtYShzY2hlbWEpO1xuICAgICAgICBpZiAodGhpcy5fYmxvY2tPZmZzZXQgPT09IDApIHtcbiAgICAgICAgICAgIHRoaXMuX2Jsb2NrT2Zmc2V0ID0gdGhpcy5faW5pdGlhbEJsb2NrT2Zmc2V0ICsgdGhpcy5fZGF0YVN0cmVhbS5wb3NpdGlvbjtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLl9pdGVtc1JlbWFpbmluZ0luQmxvY2sgPSBhd2FpdCBBdnJvUGFyc2VyLnJlYWRMb25nKHRoaXMuX2RhdGFTdHJlYW0sIHtcbiAgICAgICAgICAgIGFib3J0U2lnbmFsOiBvcHRpb25zLmFib3J0U2lnbmFsLFxuICAgICAgICB9KTtcbiAgICAgICAgLy8gc2tpcCBibG9jayBsZW5ndGhcbiAgICAgICAgYXdhaXQgQXZyb1BhcnNlci5yZWFkTG9uZyh0aGlzLl9kYXRhU3RyZWFtLCB7IGFib3J0U2lnbmFsOiBvcHRpb25zLmFib3J0U2lnbmFsIH0pO1xuICAgICAgICB0aGlzLl9pbml0aWFsaXplZCA9IHRydWU7XG4gICAgICAgIGlmICh0aGlzLl9vYmplY3RJbmRleCAmJiB0aGlzLl9vYmplY3RJbmRleCA+IDApIHtcbiAgICAgICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgdGhpcy5fb2JqZWN0SW5kZXg7IGkrKykge1xuICAgICAgICAgICAgICAgIGF3YWl0IHRoaXMuX2l0ZW1UeXBlLnJlYWQodGhpcy5fZGF0YVN0cmVhbSwgeyBhYm9ydFNpZ25hbDogb3B0aW9ucy5hYm9ydFNpZ25hbCB9KTtcbiAgICAgICAgICAgICAgICB0aGlzLl9pdGVtc1JlbWFpbmluZ0luQmxvY2stLTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cbiAgICBoYXNOZXh0KCkge1xuICAgICAgICByZXR1cm4gIXRoaXMuX2luaXRpYWxpemVkIHx8IHRoaXMuX2l0ZW1zUmVtYWluaW5nSW5CbG9jayA+IDA7XG4gICAgfVxuICAgIHBhcnNlT2JqZWN0cygpIHtcbiAgICAgICAgcmV0dXJuIHRzbGliLl9fYXN5bmNHZW5lcmF0b3IodGhpcywgYXJndW1lbnRzLCBmdW5jdGlvbiogcGFyc2VPYmplY3RzXzEob3B0aW9ucyA9IHt9KSB7XG4gICAgICAgICAgICBpZiAoIXRoaXMuX2luaXRpYWxpemVkKSB7XG4gICAgICAgICAgICAgICAgeWllbGQgdHNsaWIuX19hd2FpdCh0aGlzLmluaXRpYWxpemUob3B0aW9ucykpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgd2hpbGUgKHRoaXMuaGFzTmV4dCgpKSB7XG4gICAgICAgICAgICAgICAgY29uc3QgcmVzdWx0ID0geWllbGQgdHNsaWIuX19hd2FpdCh0aGlzLl9pdGVtVHlwZS5yZWFkKHRoaXMuX2RhdGFTdHJlYW0sIHtcbiAgICAgICAgICAgICAgICAgICAgYWJvcnRTaWduYWw6IG9wdGlvbnMuYWJvcnRTaWduYWwsXG4gICAgICAgICAgICAgICAgfSkpO1xuICAgICAgICAgICAgICAgIHRoaXMuX2l0ZW1zUmVtYWluaW5nSW5CbG9jay0tO1xuICAgICAgICAgICAgICAgIHRoaXMuX29iamVjdEluZGV4Kys7XG4gICAgICAgICAgICAgICAgaWYgKHRoaXMuX2l0ZW1zUmVtYWluaW5nSW5CbG9jayA9PT0gMCkge1xuICAgICAgICAgICAgICAgICAgICBjb25zdCBtYXJrZXIgPSB5aWVsZCB0c2xpYi5fX2F3YWl0KEF2cm9QYXJzZXIucmVhZEZpeGVkQnl0ZXModGhpcy5fZGF0YVN0cmVhbSwgQVZST19TWU5DX01BUktFUl9TSVpFLCB7XG4gICAgICAgICAgICAgICAgICAgICAgICBhYm9ydFNpZ25hbDogb3B0aW9ucy5hYm9ydFNpZ25hbCxcbiAgICAgICAgICAgICAgICAgICAgfSkpO1xuICAgICAgICAgICAgICAgICAgICB0aGlzLl9ibG9ja09mZnNldCA9IHRoaXMuX2luaXRpYWxCbG9ja09mZnNldCArIHRoaXMuX2RhdGFTdHJlYW0ucG9zaXRpb247XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuX29iamVjdEluZGV4ID0gMDtcbiAgICAgICAgICAgICAgICAgICAgaWYgKCFhcnJheXNFcXVhbCh0aGlzLl9zeW5jTWFya2VyLCBtYXJrZXIpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJTdHJlYW0gaXMgbm90IGEgdmFsaWQgQXZybyBmaWxlLlwiKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5faXRlbXNSZW1haW5pbmdJbkJsb2NrID0geWllbGQgdHNsaWIuX19hd2FpdChBdnJvUGFyc2VyLnJlYWRMb25nKHRoaXMuX2RhdGFTdHJlYW0sIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBhYm9ydFNpZ25hbDogb3B0aW9ucy5hYm9ydFNpZ25hbCxcbiAgICAgICAgICAgICAgICAgICAgICAgIH0pKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBjYXRjaCAoX2EpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIFdlIGhpdCB0aGUgZW5kIG9mIHRoZSBzdHJlYW0uXG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLl9pdGVtc1JlbWFpbmluZ0luQmxvY2sgPSAwO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIGlmICh0aGlzLl9pdGVtc1JlbWFpbmluZ0luQmxvY2sgPiAwKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBJZ25vcmUgYmxvY2sgc2l6ZVxuICAgICAgICAgICAgICAgICAgICAgICAgeWllbGQgdHNsaWIuX19hd2FpdChBdnJvUGFyc2VyLnJlYWRMb25nKHRoaXMuX2RhdGFTdHJlYW0sIHsgYWJvcnRTaWduYWw6IG9wdGlvbnMuYWJvcnRTaWduYWwgfSkpO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHlpZWxkIHlpZWxkIHRzbGliLl9fYXdhaXQocmVzdWx0KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgfVxufVxuXG4vLyBDb3B5cmlnaHQgKGMpIE1pY3Jvc29mdCBDb3Jwb3JhdGlvbi5cbi8vIExpY2Vuc2VkIHVuZGVyIHRoZSBNSVQgTGljZW5zZS5cbmNsYXNzIEF2cm9SZWFkYWJsZSB7XG59XG5cbi8vIENvcHlyaWdodCAoYykgTWljcm9zb2Z0IENvcnBvcmF0aW9uLlxuLy8gTGljZW5zZWQgdW5kZXIgdGhlIE1JVCBMaWNlbnNlLlxuY29uc3QgQUJPUlRfRVJST1IgPSBuZXcgYWJvcnRDb250cm9sbGVyLkFib3J0RXJyb3IoXCJSZWFkaW5nIGZyb20gdGhlIGF2cm8gc3RyZWFtIHdhcyBhYm9ydGVkLlwiKTtcbmNsYXNzIEF2cm9SZWFkYWJsZUZyb21TdHJlYW0gZXh0ZW5kcyBBdnJvUmVhZGFibGUge1xuICAgIHRvVWludDhBcnJheShkYXRhKSB7XG4gICAgICAgIGlmICh0eXBlb2YgZGF0YSA9PT0gXCJzdHJpbmdcIikge1xuICAgICAgICAgICAgcmV0dXJuIEJ1ZmZlci5mcm9tKGRhdGEpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBkYXRhO1xuICAgIH1cbiAgICBjb25zdHJ1Y3RvcihyZWFkYWJsZSkge1xuICAgICAgICBzdXBlcigpO1xuICAgICAgICB0aGlzLl9yZWFkYWJsZSA9IHJlYWRhYmxlO1xuICAgICAgICB0aGlzLl9wb3NpdGlvbiA9IDA7XG4gICAgfVxuICAgIGdldCBwb3NpdGlvbigpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX3Bvc2l0aW9uO1xuICAgIH1cbiAgICBhc3luYyByZWFkKHNpemUsIG9wdGlvbnMgPSB7fSkge1xuICAgICAgICB2YXIgX2E7XG4gICAgICAgIGlmICgoX2EgPSBvcHRpb25zLmFib3J0U2lnbmFsKSA9PT0gbnVsbCB8fCBfYSA9PT0gdm9pZCAwID8gdm9pZCAwIDogX2EuYWJvcnRlZCkge1xuICAgICAgICAgICAgdGhyb3cgQUJPUlRfRVJST1I7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHNpemUgPCAwKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYHNpemUgcGFyYW1ldGVyIHNob3VsZCBiZSBwb3NpdGl2ZTogJHtzaXplfWApO1xuICAgICAgICB9XG4gICAgICAgIGlmIChzaXplID09PSAwKSB7XG4gICAgICAgICAgICByZXR1cm4gbmV3IFVpbnQ4QXJyYXkoKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoIXRoaXMuX3JlYWRhYmxlLnJlYWRhYmxlKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJTdHJlYW0gbm8gbG9uZ2VyIHJlYWRhYmxlLlwiKTtcbiAgICAgICAgfVxuICAgICAgICAvLyBTZWUgaWYgdGhlcmUgaXMgYWxyZWFkeSBlbm91Z2ggZGF0YS5cbiAgICAgICAgY29uc3QgY2h1bmsgPSB0aGlzLl9yZWFkYWJsZS5yZWFkKHNpemUpO1xuICAgICAgICBpZiAoY2h1bmspIHtcbiAgICAgICAgICAgIHRoaXMuX3Bvc2l0aW9uICs9IGNodW5rLmxlbmd0aDtcbiAgICAgICAgICAgIC8vIGNodW5rLmxlbmd0aCBtYXliZSBsZXNzIHRoYW4gZGVzaXJlZCBzaXplIGlmIHRoZSBzdHJlYW0gZW5kcy5cbiAgICAgICAgICAgIHJldHVybiB0aGlzLnRvVWludDhBcnJheShjaHVuayk7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAvLyByZWdpc3RlciBjYWxsYmFjayB0byB3YWl0IGZvciBlbm91Z2ggZGF0YSB0byByZWFkXG4gICAgICAgICAgICByZXR1cm4gbmV3IFByb21pc2UoKHJlc29sdmUsIHJlamVjdCkgPT4ge1xuICAgICAgICAgICAgICAgIC8qIGVzbGludC1kaXNhYmxlIEB0eXBlc2NyaXB0LWVzbGludC9uby11c2UtYmVmb3JlLWRlZmluZSAqL1xuICAgICAgICAgICAgICAgIGNvbnN0IGNsZWFuVXAgPSAoKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuX3JlYWRhYmxlLnJlbW92ZUxpc3RlbmVyKFwicmVhZGFibGVcIiwgcmVhZGFibGVDYWxsYmFjayk7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuX3JlYWRhYmxlLnJlbW92ZUxpc3RlbmVyKFwiZXJyb3JcIiwgcmVqZWN0Q2FsbGJhY2spO1xuICAgICAgICAgICAgICAgICAgICB0aGlzLl9yZWFkYWJsZS5yZW1vdmVMaXN0ZW5lcihcImVuZFwiLCByZWplY3RDYWxsYmFjayk7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuX3JlYWRhYmxlLnJlbW92ZUxpc3RlbmVyKFwiY2xvc2VcIiwgcmVqZWN0Q2FsbGJhY2spO1xuICAgICAgICAgICAgICAgICAgICBpZiAob3B0aW9ucy5hYm9ydFNpZ25hbCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgb3B0aW9ucy5hYm9ydFNpZ25hbC5yZW1vdmVFdmVudExpc3RlbmVyKFwiYWJvcnRcIiwgYWJvcnRIYW5kbGVyKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH07XG4gICAgICAgICAgICAgICAgY29uc3QgcmVhZGFibGVDYWxsYmFjayA9ICgpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgY2FsbGJhY2tDaHVuayA9IHRoaXMuX3JlYWRhYmxlLnJlYWQoc2l6ZSk7XG4gICAgICAgICAgICAgICAgICAgIGlmIChjYWxsYmFja0NodW5rKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLl9wb3NpdGlvbiArPSBjYWxsYmFja0NodW5rLmxlbmd0aDtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNsZWFuVXAoKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIGNhbGxiYWNrQ2h1bmsubGVuZ3RoIG1heWJlIGxlc3MgdGhhbiBkZXNpcmVkIHNpemUgaWYgdGhlIHN0cmVhbSBlbmRzLlxuICAgICAgICAgICAgICAgICAgICAgICAgcmVzb2x2ZSh0aGlzLnRvVWludDhBcnJheShjYWxsYmFja0NodW5rKSk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9O1xuICAgICAgICAgICAgICAgIGNvbnN0IHJlamVjdENhbGxiYWNrID0gKCkgPT4ge1xuICAgICAgICAgICAgICAgICAgICBjbGVhblVwKCk7XG4gICAgICAgICAgICAgICAgICAgIHJlamVjdCgpO1xuICAgICAgICAgICAgICAgIH07XG4gICAgICAgICAgICAgICAgY29uc3QgYWJvcnRIYW5kbGVyID0gKCkgPT4ge1xuICAgICAgICAgICAgICAgICAgICBjbGVhblVwKCk7XG4gICAgICAgICAgICAgICAgICAgIHJlamVjdChBQk9SVF9FUlJPUik7XG4gICAgICAgICAgICAgICAgfTtcbiAgICAgICAgICAgICAgICB0aGlzLl9yZWFkYWJsZS5vbihcInJlYWRhYmxlXCIsIHJlYWRhYmxlQ2FsbGJhY2spO1xuICAgICAgICAgICAgICAgIHRoaXMuX3JlYWRhYmxlLm9uY2UoXCJlcnJvclwiLCByZWplY3RDYWxsYmFjayk7XG4gICAgICAgICAgICAgICAgdGhpcy5fcmVhZGFibGUub25jZShcImVuZFwiLCByZWplY3RDYWxsYmFjayk7XG4gICAgICAgICAgICAgICAgdGhpcy5fcmVhZGFibGUub25jZShcImNsb3NlXCIsIHJlamVjdENhbGxiYWNrKTtcbiAgICAgICAgICAgICAgICBpZiAob3B0aW9ucy5hYm9ydFNpZ25hbCkge1xuICAgICAgICAgICAgICAgICAgICBvcHRpb25zLmFib3J0U2lnbmFsLmFkZEV2ZW50TGlzdGVuZXIoXCJhYm9ydFwiLCBhYm9ydEhhbmRsZXIpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAvKiBlc2xpbnQtZW5hYmxlIEB0eXBlc2NyaXB0LWVzbGludC9uby11c2UtYmVmb3JlLWRlZmluZSAqL1xuICAgICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICB9XG59XG5cbi8vIENvcHlyaWdodCAoYykgTWljcm9zb2Z0IENvcnBvcmF0aW9uLlxuLy8gTGljZW5zZWQgdW5kZXIgdGhlIE1JVCBMaWNlbnNlLlxuLyoqXG4gKiBPTkxZIEFWQUlMQUJMRSBJTiBOT0RFLkpTIFJVTlRJTUUuXG4gKlxuICogQSBOb2RlLmpzIEJsb2JRdWlja1F1ZXJ5U3RyZWFtIHdpbGwgaW50ZXJuYWxseSBwYXJzZSBhdnJvIGRhdGEgc3RyZWFtIGZvciBibG9iIHF1ZXJ5LlxuICovXG5jbGFzcyBCbG9iUXVpY2tRdWVyeVN0cmVhbSBleHRlbmRzIHN0cmVhbS5SZWFkYWJsZSB7XG4gICAgLyoqXG4gICAgICogQ3JlYXRlcyBhbiBpbnN0YW5jZSBvZiBCbG9iUXVpY2tRdWVyeVN0cmVhbS5cbiAgICAgKlxuICAgICAqIEBwYXJhbSBzb3VyY2UgLSBUaGUgY3VycmVudCBSZWFkYWJsZVN0cmVhbSByZXR1cm5lZCBmcm9tIGdldHRlclxuICAgICAqIEBwYXJhbSBvcHRpb25zIC1cbiAgICAgKi9cbiAgICBjb25zdHJ1Y3Rvcihzb3VyY2UsIG9wdGlvbnMgPSB7fSkge1xuICAgICAgICBzdXBlcigpO1xuICAgICAgICB0aGlzLmF2cm9QYXVzZWQgPSB0cnVlO1xuICAgICAgICB0aGlzLnNvdXJjZSA9IHNvdXJjZTtcbiAgICAgICAgdGhpcy5vblByb2dyZXNzID0gb3B0aW9ucy5vblByb2dyZXNzO1xuICAgICAgICB0aGlzLm9uRXJyb3IgPSBvcHRpb25zLm9uRXJyb3I7XG4gICAgICAgIHRoaXMuYXZyb1JlYWRlciA9IG5ldyBBdnJvUmVhZGVyKG5ldyBBdnJvUmVhZGFibGVGcm9tU3RyZWFtKHRoaXMuc291cmNlKSk7XG4gICAgICAgIHRoaXMuYXZyb0l0ZXIgPSB0aGlzLmF2cm9SZWFkZXIucGFyc2VPYmplY3RzKHsgYWJvcnRTaWduYWw6IG9wdGlvbnMuYWJvcnRTaWduYWwgfSk7XG4gICAgfVxuICAgIF9yZWFkKCkge1xuICAgICAgICBpZiAodGhpcy5hdnJvUGF1c2VkKSB7XG4gICAgICAgICAgICB0aGlzLnJlYWRJbnRlcm5hbCgpLmNhdGNoKChlcnIpID0+IHtcbiAgICAgICAgICAgICAgICB0aGlzLmVtaXQoXCJlcnJvclwiLCBlcnIpO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgYXN5bmMgcmVhZEludGVybmFsKCkge1xuICAgICAgICB0aGlzLmF2cm9QYXVzZWQgPSBmYWxzZTtcbiAgICAgICAgbGV0IGF2cm9OZXh0O1xuICAgICAgICBkbyB7XG4gICAgICAgICAgICBhdnJvTmV4dCA9IGF3YWl0IHRoaXMuYXZyb0l0ZXIubmV4dCgpO1xuICAgICAgICAgICAgaWYgKGF2cm9OZXh0LmRvbmUpIHtcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGNvbnN0IG9iaiA9IGF2cm9OZXh0LnZhbHVlO1xuICAgICAgICAgICAgY29uc3Qgc2NoZW1hID0gb2JqLiRzY2hlbWE7XG4gICAgICAgICAgICBpZiAodHlwZW9mIHNjaGVtYSAhPT0gXCJzdHJpbmdcIikge1xuICAgICAgICAgICAgICAgIHRocm93IEVycm9yKFwiTWlzc2luZyBzY2hlbWEgaW4gYXZybyByZWNvcmQuXCIpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgc3dpdGNoIChzY2hlbWEpIHtcbiAgICAgICAgICAgICAgICBjYXNlIFwiY29tLm1pY3Jvc29mdC5henVyZS5zdG9yYWdlLnF1ZXJ5QmxvYkNvbnRlbnRzLnJlc3VsdERhdGFcIjpcbiAgICAgICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgZGF0YSA9IG9iai5kYXRhO1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGRhdGEgaW5zdGFuY2VvZiBVaW50OEFycmF5ID09PSBmYWxzZSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRocm93IEVycm9yKFwiSW52YWxpZCBkYXRhIGluIGF2cm8gcmVzdWx0IHJlY29yZC5cIik7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoIXRoaXMucHVzaChCdWZmZXIuZnJvbShkYXRhKSkpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmF2cm9QYXVzZWQgPSB0cnVlO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIGNhc2UgXCJjb20ubWljcm9zb2Z0LmF6dXJlLnN0b3JhZ2UucXVlcnlCbG9iQ29udGVudHMucHJvZ3Jlc3NcIjpcbiAgICAgICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgYnl0ZXNTY2FubmVkID0gb2JqLmJ5dGVzU2Nhbm5lZDtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmICh0eXBlb2YgYnl0ZXNTY2FubmVkICE9PSBcIm51bWJlclwiKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cgRXJyb3IoXCJJbnZhbGlkIGJ5dGVzU2Nhbm5lZCBpbiBhdnJvIHByb2dyZXNzIHJlY29yZC5cIik7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAodGhpcy5vblByb2dyZXNzKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5vblByb2dyZXNzKHsgbG9hZGVkQnl0ZXM6IGJ5dGVzU2Nhbm5lZCB9KTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICBjYXNlIFwiY29tLm1pY3Jvc29mdC5henVyZS5zdG9yYWdlLnF1ZXJ5QmxvYkNvbnRlbnRzLmVuZFwiOlxuICAgICAgICAgICAgICAgICAgICBpZiAodGhpcy5vblByb2dyZXNzKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB0b3RhbEJ5dGVzID0gb2JqLnRvdGFsQnl0ZXM7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAodHlwZW9mIHRvdGFsQnl0ZXMgIT09IFwibnVtYmVyXCIpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aHJvdyBFcnJvcihcIkludmFsaWQgdG90YWxCeXRlcyBpbiBhdnJvIGVuZCByZWNvcmQuXCIpO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5vblByb2dyZXNzKHsgbG9hZGVkQnl0ZXM6IHRvdGFsQnl0ZXMgfSk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgdGhpcy5wdXNoKG51bGwpO1xuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICBjYXNlIFwiY29tLm1pY3Jvc29mdC5henVyZS5zdG9yYWdlLnF1ZXJ5QmxvYkNvbnRlbnRzLmVycm9yXCI6XG4gICAgICAgICAgICAgICAgICAgIGlmICh0aGlzLm9uRXJyb3IpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGZhdGFsID0gb2JqLmZhdGFsO1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHR5cGVvZiBmYXRhbCAhPT0gXCJib29sZWFuXCIpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aHJvdyBFcnJvcihcIkludmFsaWQgZmF0YWwgaW4gYXZybyBlcnJvciByZWNvcmQuXCIpO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgbmFtZSA9IG9iai5uYW1lO1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHR5cGVvZiBuYW1lICE9PSBcInN0cmluZ1wiKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cgRXJyb3IoXCJJbnZhbGlkIG5hbWUgaW4gYXZybyBlcnJvciByZWNvcmQuXCIpO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgZGVzY3JpcHRpb24gPSBvYmouZGVzY3JpcHRpb247XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAodHlwZW9mIGRlc2NyaXB0aW9uICE9PSBcInN0cmluZ1wiKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cgRXJyb3IoXCJJbnZhbGlkIGRlc2NyaXB0aW9uIGluIGF2cm8gZXJyb3IgcmVjb3JkLlwiKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHBvc2l0aW9uID0gb2JqLnBvc2l0aW9uO1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHR5cGVvZiBwb3NpdGlvbiAhPT0gXCJudW1iZXJcIikge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRocm93IEVycm9yKFwiSW52YWxpZCBwb3NpdGlvbiBpbiBhdnJvIGVycm9yIHJlY29yZC5cIik7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLm9uRXJyb3Ioe1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBvc2l0aW9uLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5hbWUsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaXNGYXRhbDogZmF0YWwsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVzY3JpcHRpb24sXG4gICAgICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgICAgICAgICAgICB0aHJvdyBFcnJvcihgVW5rbm93biBzY2hlbWEgJHtzY2hlbWF9IGluIGF2cm8gcHJvZ3Jlc3MgcmVjb3JkLmApO1xuICAgICAgICAgICAgfVxuICAgICAgICB9IHdoaWxlICghYXZyb05leHQuZG9uZSAmJiAhdGhpcy5hdnJvUGF1c2VkKTtcbiAgICB9XG59XG5cbi8vIENvcHlyaWdodCAoYykgTWljcm9zb2Z0IENvcnBvcmF0aW9uLlxuLy8gTGljZW5zZWQgdW5kZXIgdGhlIE1JVCBMaWNlbnNlLlxuLyoqXG4gKiBPTkxZIEFWQUlMQUJMRSBJTiBOT0RFLkpTIFJVTlRJTUUuXG4gKlxuICogQmxvYlF1ZXJ5UmVzcG9uc2UgaW1wbGVtZW50cyBCbG9iRG93bmxvYWRSZXNwb25zZU1vZGVsIGludGVyZmFjZSwgYW5kIGluIE5vZGUuanMgcnVudGltZSBpdCB3aWxsXG4gKiBwYXJzZSBhdm9yIGRhdGEgcmV0dXJuZWQgYnkgYmxvYiBxdWVyeS5cbiAqL1xuY2xhc3MgQmxvYlF1ZXJ5UmVzcG9uc2Uge1xuICAgIC8qKlxuICAgICAqIEluZGljYXRlcyB0aGF0IHRoZSBzZXJ2aWNlIHN1cHBvcnRzXG4gICAgICogcmVxdWVzdHMgZm9yIHBhcnRpYWwgZmlsZSBjb250ZW50LlxuICAgICAqXG4gICAgICogQHJlYWRvbmx5XG4gICAgICovXG4gICAgZ2V0IGFjY2VwdFJhbmdlcygpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMub3JpZ2luYWxSZXNwb25zZS5hY2NlcHRSYW5nZXM7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIFJldHVybnMgaWYgaXQgd2FzIHByZXZpb3VzbHkgc3BlY2lmaWVkXG4gICAgICogZm9yIHRoZSBmaWxlLlxuICAgICAqXG4gICAgICogQHJlYWRvbmx5XG4gICAgICovXG4gICAgZ2V0IGNhY2hlQ29udHJvbCgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMub3JpZ2luYWxSZXNwb25zZS5jYWNoZUNvbnRyb2w7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIFJldHVybnMgdGhlIHZhbHVlIHRoYXQgd2FzIHNwZWNpZmllZFxuICAgICAqIGZvciB0aGUgJ3gtbXMtY29udGVudC1kaXNwb3NpdGlvbicgaGVhZGVyIGFuZCBzcGVjaWZpZXMgaG93IHRvIHByb2Nlc3MgdGhlXG4gICAgICogcmVzcG9uc2UuXG4gICAgICpcbiAgICAgKiBAcmVhZG9ubHlcbiAgICAgKi9cbiAgICBnZXQgY29udGVudERpc3Bvc2l0aW9uKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5vcmlnaW5hbFJlc3BvbnNlLmNvbnRlbnREaXNwb3NpdGlvbjtcbiAgICB9XG4gICAgLyoqXG4gICAgICogUmV0dXJucyB0aGUgdmFsdWUgdGhhdCB3YXMgc3BlY2lmaWVkXG4gICAgICogZm9yIHRoZSBDb250ZW50LUVuY29kaW5nIHJlcXVlc3QgaGVhZGVyLlxuICAgICAqXG4gICAgICogQHJlYWRvbmx5XG4gICAgICovXG4gICAgZ2V0IGNvbnRlbnRFbmNvZGluZygpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMub3JpZ2luYWxSZXNwb25zZS5jb250ZW50RW5jb2Rpbmc7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIFJldHVybnMgdGhlIHZhbHVlIHRoYXQgd2FzIHNwZWNpZmllZFxuICAgICAqIGZvciB0aGUgQ29udGVudC1MYW5ndWFnZSByZXF1ZXN0IGhlYWRlci5cbiAgICAgKlxuICAgICAqIEByZWFkb25seVxuICAgICAqL1xuICAgIGdldCBjb250ZW50TGFuZ3VhZ2UoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLm9yaWdpbmFsUmVzcG9uc2UuY29udGVudExhbmd1YWdlO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBUaGUgY3VycmVudCBzZXF1ZW5jZSBudW1iZXIgZm9yIGFcbiAgICAgKiBwYWdlIGJsb2IuIFRoaXMgaGVhZGVyIGlzIG5vdCByZXR1cm5lZCBmb3IgYmxvY2sgYmxvYnMgb3IgYXBwZW5kIGJsb2JzLlxuICAgICAqXG4gICAgICogQHJlYWRvbmx5XG4gICAgICovXG4gICAgZ2V0IGJsb2JTZXF1ZW5jZU51bWJlcigpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMub3JpZ2luYWxSZXNwb25zZS5ibG9iU2VxdWVuY2VOdW1iZXI7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIFRoZSBibG9iJ3MgdHlwZS4gUG9zc2libGUgdmFsdWVzIGluY2x1ZGU6XG4gICAgICogJ0Jsb2NrQmxvYicsICdQYWdlQmxvYicsICdBcHBlbmRCbG9iJy5cbiAgICAgKlxuICAgICAqIEByZWFkb25seVxuICAgICAqL1xuICAgIGdldCBibG9iVHlwZSgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMub3JpZ2luYWxSZXNwb25zZS5ibG9iVHlwZTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogVGhlIG51bWJlciBvZiBieXRlcyBwcmVzZW50IGluIHRoZVxuICAgICAqIHJlc3BvbnNlIGJvZHkuXG4gICAgICpcbiAgICAgKiBAcmVhZG9ubHlcbiAgICAgKi9cbiAgICBnZXQgY29udGVudExlbmd0aCgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMub3JpZ2luYWxSZXNwb25zZS5jb250ZW50TGVuZ3RoO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBJZiB0aGUgZmlsZSBoYXMgYW4gTUQ1IGhhc2ggYW5kIHRoZVxuICAgICAqIHJlcXVlc3QgaXMgdG8gcmVhZCB0aGUgZnVsbCBmaWxlLCB0aGlzIHJlc3BvbnNlIGhlYWRlciBpcyByZXR1cm5lZCBzbyB0aGF0XG4gICAgICogdGhlIGNsaWVudCBjYW4gY2hlY2sgZm9yIG1lc3NhZ2UgY29udGVudCBpbnRlZ3JpdHkuIElmIHRoZSByZXF1ZXN0IGlzIHRvXG4gICAgICogcmVhZCBhIHNwZWNpZmllZCByYW5nZSBhbmQgdGhlICd4LW1zLXJhbmdlLWdldC1jb250ZW50LW1kNScgaXMgc2V0IHRvXG4gICAgICogdHJ1ZSwgdGhlbiB0aGUgcmVxdWVzdCByZXR1cm5zIGFuIE1ENSBoYXNoIGZvciB0aGUgcmFuZ2UsIGFzIGxvbmcgYXMgdGhlXG4gICAgICogcmFuZ2Ugc2l6ZSBpcyBsZXNzIHRoYW4gb3IgZXF1YWwgdG8gNCBNQi4gSWYgbmVpdGhlciBvZiB0aGVzZSBzZXRzIG9mXG4gICAgICogY29uZGl0aW9ucyBpcyB0cnVlLCB0aGVuIG5vIHZhbHVlIGlzIHJldHVybmVkIGZvciB0aGUgJ0NvbnRlbnQtTUQ1J1xuICAgICAqIGhlYWRlci5cbiAgICAgKlxuICAgICAqIEByZWFkb25seVxuICAgICAqL1xuICAgIGdldCBjb250ZW50TUQ1KCkge1xuICAgICAgICByZXR1cm4gdGhpcy5vcmlnaW5hbFJlc3BvbnNlLmNvbnRlbnRNRDU7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIEluZGljYXRlcyB0aGUgcmFuZ2Ugb2YgYnl0ZXMgcmV0dXJuZWQgaWZcbiAgICAgKiB0aGUgY2xpZW50IHJlcXVlc3RlZCBhIHN1YnNldCBvZiB0aGUgZmlsZSBieSBzZXR0aW5nIHRoZSBSYW5nZSByZXF1ZXN0XG4gICAgICogaGVhZGVyLlxuICAgICAqXG4gICAgICogQHJlYWRvbmx5XG4gICAgICovXG4gICAgZ2V0IGNvbnRlbnRSYW5nZSgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMub3JpZ2luYWxSZXNwb25zZS5jb250ZW50UmFuZ2U7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIFRoZSBjb250ZW50IHR5cGUgc3BlY2lmaWVkIGZvciB0aGUgZmlsZS5cbiAgICAgKiBUaGUgZGVmYXVsdCBjb250ZW50IHR5cGUgaXMgJ2FwcGxpY2F0aW9uL29jdGV0LXN0cmVhbSdcbiAgICAgKlxuICAgICAqIEByZWFkb25seVxuICAgICAqL1xuICAgIGdldCBjb250ZW50VHlwZSgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMub3JpZ2luYWxSZXNwb25zZS5jb250ZW50VHlwZTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogQ29uY2x1c2lvbiB0aW1lIG9mIHRoZSBsYXN0IGF0dGVtcHRlZFxuICAgICAqIENvcHkgRmlsZSBvcGVyYXRpb24gd2hlcmUgdGhpcyBmaWxlIHdhcyB0aGUgZGVzdGluYXRpb24gZmlsZS4gVGhpcyB2YWx1ZVxuICAgICAqIGNhbiBzcGVjaWZ5IHRoZSB0aW1lIG9mIGEgY29tcGxldGVkLCBhYm9ydGVkLCBvciBmYWlsZWQgY29weSBhdHRlbXB0LlxuICAgICAqXG4gICAgICogQHJlYWRvbmx5XG4gICAgICovXG4gICAgZ2V0IGNvcHlDb21wbGV0ZWRPbigpIHtcbiAgICAgICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICB9XG4gICAgLyoqXG4gICAgICogU3RyaW5nIGlkZW50aWZpZXIgZm9yIHRoZSBsYXN0IGF0dGVtcHRlZCBDb3B5XG4gICAgICogRmlsZSBvcGVyYXRpb24gd2hlcmUgdGhpcyBmaWxlIHdhcyB0aGUgZGVzdGluYXRpb24gZmlsZS5cbiAgICAgKlxuICAgICAqIEByZWFkb25seVxuICAgICAqL1xuICAgIGdldCBjb3B5SWQoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLm9yaWdpbmFsUmVzcG9uc2UuY29weUlkO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBDb250YWlucyB0aGUgbnVtYmVyIG9mIGJ5dGVzIGNvcGllZCBhbmRcbiAgICAgKiB0aGUgdG90YWwgYnl0ZXMgaW4gdGhlIHNvdXJjZSBpbiB0aGUgbGFzdCBhdHRlbXB0ZWQgQ29weSBGaWxlIG9wZXJhdGlvblxuICAgICAqIHdoZXJlIHRoaXMgZmlsZSB3YXMgdGhlIGRlc3RpbmF0aW9uIGZpbGUuIENhbiBzaG93IGJldHdlZW4gMCBhbmRcbiAgICAgKiBDb250ZW50LUxlbmd0aCBieXRlcyBjb3BpZWQuXG4gICAgICpcbiAgICAgKiBAcmVhZG9ubHlcbiAgICAgKi9cbiAgICBnZXQgY29weVByb2dyZXNzKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5vcmlnaW5hbFJlc3BvbnNlLmNvcHlQcm9ncmVzcztcbiAgICB9XG4gICAgLyoqXG4gICAgICogVVJMIHVwIHRvIDJLQiBpbiBsZW5ndGggdGhhdCBzcGVjaWZpZXMgdGhlXG4gICAgICogc291cmNlIGZpbGUgdXNlZCBpbiB0aGUgbGFzdCBhdHRlbXB0ZWQgQ29weSBGaWxlIG9wZXJhdGlvbiB3aGVyZSB0aGlzIGZpbGVcbiAgICAgKiB3YXMgdGhlIGRlc3RpbmF0aW9uIGZpbGUuXG4gICAgICpcbiAgICAgKiBAcmVhZG9ubHlcbiAgICAgKi9cbiAgICBnZXQgY29weVNvdXJjZSgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMub3JpZ2luYWxSZXNwb25zZS5jb3B5U291cmNlO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBTdGF0ZSBvZiB0aGUgY29weSBvcGVyYXRpb25cbiAgICAgKiBpZGVudGlmaWVkIGJ5ICd4LW1zLWNvcHktaWQnLiBQb3NzaWJsZSB2YWx1ZXMgaW5jbHVkZTogJ3BlbmRpbmcnLFxuICAgICAqICdzdWNjZXNzJywgJ2Fib3J0ZWQnLCAnZmFpbGVkJ1xuICAgICAqXG4gICAgICogQHJlYWRvbmx5XG4gICAgICovXG4gICAgZ2V0IGNvcHlTdGF0dXMoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLm9yaWdpbmFsUmVzcG9uc2UuY29weVN0YXR1cztcbiAgICB9XG4gICAgLyoqXG4gICAgICogT25seSBhcHBlYXJzIHdoZW5cbiAgICAgKiB4LW1zLWNvcHktc3RhdHVzIGlzIGZhaWxlZCBvciBwZW5kaW5nLiBEZXNjcmliZXMgY2F1c2Ugb2YgZmF0YWwgb3JcbiAgICAgKiBub24tZmF0YWwgY29weSBvcGVyYXRpb24gZmFpbHVyZS5cbiAgICAgKlxuICAgICAqIEByZWFkb25seVxuICAgICAqL1xuICAgIGdldCBjb3B5U3RhdHVzRGVzY3JpcHRpb24oKSB7XG4gICAgICAgIHJldHVybiB0aGlzLm9yaWdpbmFsUmVzcG9uc2UuY29weVN0YXR1c0Rlc2NyaXB0aW9uO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBXaGVuIGEgYmxvYiBpcyBsZWFzZWQsXG4gICAgICogc3BlY2lmaWVzIHdoZXRoZXIgdGhlIGxlYXNlIGlzIG9mIGluZmluaXRlIG9yIGZpeGVkIGR1cmF0aW9uLiBQb3NzaWJsZVxuICAgICAqIHZhbHVlcyBpbmNsdWRlOiAnaW5maW5pdGUnLCAnZml4ZWQnLlxuICAgICAqXG4gICAgICogQHJlYWRvbmx5XG4gICAgICovXG4gICAgZ2V0IGxlYXNlRHVyYXRpb24oKSB7XG4gICAgICAgIHJldHVybiB0aGlzLm9yaWdpbmFsUmVzcG9uc2UubGVhc2VEdXJhdGlvbjtcbiAgICB9XG4gICAgLyoqXG4gICAgICogTGVhc2Ugc3RhdGUgb2YgdGhlIGJsb2IuIFBvc3NpYmxlXG4gICAgICogdmFsdWVzIGluY2x1ZGU6ICdhdmFpbGFibGUnLCAnbGVhc2VkJywgJ2V4cGlyZWQnLCAnYnJlYWtpbmcnLCAnYnJva2VuJy5cbiAgICAgKlxuICAgICAqIEByZWFkb25seVxuICAgICAqL1xuICAgIGdldCBsZWFzZVN0YXRlKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5vcmlnaW5hbFJlc3BvbnNlLmxlYXNlU3RhdGU7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIFRoZSBjdXJyZW50IGxlYXNlIHN0YXR1cyBvZiB0aGVcbiAgICAgKiBibG9iLiBQb3NzaWJsZSB2YWx1ZXMgaW5jbHVkZTogJ2xvY2tlZCcsICd1bmxvY2tlZCcuXG4gICAgICpcbiAgICAgKiBAcmVhZG9ubHlcbiAgICAgKi9cbiAgICBnZXQgbGVhc2VTdGF0dXMoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLm9yaWdpbmFsUmVzcG9uc2UubGVhc2VTdGF0dXM7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIEEgVVRDIGRhdGUvdGltZSB2YWx1ZSBnZW5lcmF0ZWQgYnkgdGhlIHNlcnZpY2UgdGhhdFxuICAgICAqIGluZGljYXRlcyB0aGUgdGltZSBhdCB3aGljaCB0aGUgcmVzcG9uc2Ugd2FzIGluaXRpYXRlZC5cbiAgICAgKlxuICAgICAqIEByZWFkb25seVxuICAgICAqL1xuICAgIGdldCBkYXRlKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5vcmlnaW5hbFJlc3BvbnNlLmRhdGU7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIFRoZSBudW1iZXIgb2YgY29tbWl0dGVkIGJsb2Nrc1xuICAgICAqIHByZXNlbnQgaW4gdGhlIGJsb2IuIFRoaXMgaGVhZGVyIGlzIHJldHVybmVkIG9ubHkgZm9yIGFwcGVuZCBibG9icy5cbiAgICAgKlxuICAgICAqIEByZWFkb25seVxuICAgICAqL1xuICAgIGdldCBibG9iQ29tbWl0dGVkQmxvY2tDb3VudCgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMub3JpZ2luYWxSZXNwb25zZS5ibG9iQ29tbWl0dGVkQmxvY2tDb3VudDtcbiAgICB9XG4gICAgLyoqXG4gICAgICogVGhlIEVUYWcgY29udGFpbnMgYSB2YWx1ZSB0aGF0IHlvdSBjYW4gdXNlIHRvXG4gICAgICogcGVyZm9ybSBvcGVyYXRpb25zIGNvbmRpdGlvbmFsbHksIGluIHF1b3Rlcy5cbiAgICAgKlxuICAgICAqIEByZWFkb25seVxuICAgICAqL1xuICAgIGdldCBldGFnKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5vcmlnaW5hbFJlc3BvbnNlLmV0YWc7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIFRoZSBlcnJvciBjb2RlLlxuICAgICAqXG4gICAgICogQHJlYWRvbmx5XG4gICAgICovXG4gICAgZ2V0IGVycm9yQ29kZSgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMub3JpZ2luYWxSZXNwb25zZS5lcnJvckNvZGU7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIFRoZSB2YWx1ZSBvZiB0aGlzIGhlYWRlciBpcyBzZXQgdG9cbiAgICAgKiB0cnVlIGlmIHRoZSBmaWxlIGRhdGEgYW5kIGFwcGxpY2F0aW9uIG1ldGFkYXRhIGFyZSBjb21wbGV0ZWx5IGVuY3J5cHRlZFxuICAgICAqIHVzaW5nIHRoZSBzcGVjaWZpZWQgYWxnb3JpdGhtLiBPdGhlcndpc2UsIHRoZSB2YWx1ZSBpcyBzZXQgdG8gZmFsc2UgKHdoZW5cbiAgICAgKiB0aGUgZmlsZSBpcyB1bmVuY3J5cHRlZCwgb3IgaWYgb25seSBwYXJ0cyBvZiB0aGUgZmlsZS9hcHBsaWNhdGlvbiBtZXRhZGF0YVxuICAgICAqIGFyZSBlbmNyeXB0ZWQpLlxuICAgICAqXG4gICAgICogQHJlYWRvbmx5XG4gICAgICovXG4gICAgZ2V0IGlzU2VydmVyRW5jcnlwdGVkKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5vcmlnaW5hbFJlc3BvbnNlLmlzU2VydmVyRW5jcnlwdGVkO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBJZiB0aGUgYmxvYiBoYXMgYSBNRDUgaGFzaCwgYW5kIGlmXG4gICAgICogcmVxdWVzdCBjb250YWlucyByYW5nZSBoZWFkZXIgKFJhbmdlIG9yIHgtbXMtcmFuZ2UpLCB0aGlzIHJlc3BvbnNlIGhlYWRlclxuICAgICAqIGlzIHJldHVybmVkIHdpdGggdGhlIHZhbHVlIG9mIHRoZSB3aG9sZSBibG9iJ3MgTUQ1IHZhbHVlLiBUaGlzIHZhbHVlIG1heVxuICAgICAqIG9yIG1heSBub3QgYmUgZXF1YWwgdG8gdGhlIHZhbHVlIHJldHVybmVkIGluIENvbnRlbnQtTUQ1IGhlYWRlciwgd2l0aCB0aGVcbiAgICAgKiBsYXR0ZXIgY2FsY3VsYXRlZCBmcm9tIHRoZSByZXF1ZXN0ZWQgcmFuZ2UuXG4gICAgICpcbiAgICAgKiBAcmVhZG9ubHlcbiAgICAgKi9cbiAgICBnZXQgYmxvYkNvbnRlbnRNRDUoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLm9yaWdpbmFsUmVzcG9uc2UuYmxvYkNvbnRlbnRNRDU7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIFJldHVybnMgdGhlIGRhdGUgYW5kIHRpbWUgdGhlIGZpbGUgd2FzIGxhc3RcbiAgICAgKiBtb2RpZmllZC4gQW55IG9wZXJhdGlvbiB0aGF0IG1vZGlmaWVzIHRoZSBmaWxlIG9yIGl0cyBwcm9wZXJ0aWVzIHVwZGF0ZXNcbiAgICAgKiB0aGUgbGFzdCBtb2RpZmllZCB0aW1lLlxuICAgICAqXG4gICAgICogQHJlYWRvbmx5XG4gICAgICovXG4gICAgZ2V0IGxhc3RNb2RpZmllZCgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMub3JpZ2luYWxSZXNwb25zZS5sYXN0TW9kaWZpZWQ7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIEEgbmFtZS12YWx1ZSBwYWlyXG4gICAgICogdG8gYXNzb2NpYXRlIHdpdGggYSBmaWxlIHN0b3JhZ2Ugb2JqZWN0LlxuICAgICAqXG4gICAgICogQHJlYWRvbmx5XG4gICAgICovXG4gICAgZ2V0IG1ldGFkYXRhKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5vcmlnaW5hbFJlc3BvbnNlLm1ldGFkYXRhO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBUaGlzIGhlYWRlciB1bmlxdWVseSBpZGVudGlmaWVzIHRoZSByZXF1ZXN0XG4gICAgICogdGhhdCB3YXMgbWFkZSBhbmQgY2FuIGJlIHVzZWQgZm9yIHRyb3VibGVzaG9vdGluZyB0aGUgcmVxdWVzdC5cbiAgICAgKlxuICAgICAqIEByZWFkb25seVxuICAgICAqL1xuICAgIGdldCByZXF1ZXN0SWQoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLm9yaWdpbmFsUmVzcG9uc2UucmVxdWVzdElkO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBJZiBhIGNsaWVudCByZXF1ZXN0IGlkIGhlYWRlciBpcyBzZW50IGluIHRoZSByZXF1ZXN0LCB0aGlzIGhlYWRlciB3aWxsIGJlIHByZXNlbnQgaW4gdGhlXG4gICAgICogcmVzcG9uc2Ugd2l0aCB0aGUgc2FtZSB2YWx1ZS5cbiAgICAgKlxuICAgICAqIEByZWFkb25seVxuICAgICAqL1xuICAgIGdldCBjbGllbnRSZXF1ZXN0SWQoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLm9yaWdpbmFsUmVzcG9uc2UuY2xpZW50UmVxdWVzdElkO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBJbmRpY2F0ZXMgdGhlIHZlcnNpb24gb2YgdGhlIEZpbGUgc2VydmljZSB1c2VkXG4gICAgICogdG8gZXhlY3V0ZSB0aGUgcmVxdWVzdC5cbiAgICAgKlxuICAgICAqIEByZWFkb25seVxuICAgICAqL1xuICAgIGdldCB2ZXJzaW9uKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5vcmlnaW5hbFJlc3BvbnNlLnZlcnNpb247XG4gICAgfVxuICAgIC8qKlxuICAgICAqIFRoZSBTSEEtMjU2IGhhc2ggb2YgdGhlIGVuY3J5cHRpb24ga2V5IHVzZWQgdG8gZW5jcnlwdCB0aGUgYmxvYi4gVGhpcyB2YWx1ZSBpcyBvbmx5IHJldHVybmVkXG4gICAgICogd2hlbiB0aGUgYmxvYiB3YXMgZW5jcnlwdGVkIHdpdGggYSBjdXN0b21lci1wcm92aWRlZCBrZXkuXG4gICAgICpcbiAgICAgKiBAcmVhZG9ubHlcbiAgICAgKi9cbiAgICBnZXQgZW5jcnlwdGlvbktleVNoYTI1NigpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMub3JpZ2luYWxSZXNwb25zZS5lbmNyeXB0aW9uS2V5U2hhMjU2O1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBJZiB0aGUgcmVxdWVzdCBpcyB0byByZWFkIGEgc3BlY2lmaWVkIHJhbmdlIGFuZCB0aGUgeC1tcy1yYW5nZS1nZXQtY29udGVudC1jcmM2NCBpcyBzZXQgdG9cbiAgICAgKiB0cnVlLCB0aGVuIHRoZSByZXF1ZXN0IHJldHVybnMgYSBjcmM2NCBmb3IgdGhlIHJhbmdlLCBhcyBsb25nIGFzIHRoZSByYW5nZSBzaXplIGlzIGxlc3MgdGhhblxuICAgICAqIG9yIGVxdWFsIHRvIDQgTUIuIElmIGJvdGggeC1tcy1yYW5nZS1nZXQtY29udGVudC1jcmM2NCAmIHgtbXMtcmFuZ2UtZ2V0LWNvbnRlbnQtbWQ1IGlzXG4gICAgICogc3BlY2lmaWVkIGluIHRoZSBzYW1lIHJlcXVlc3QsIGl0IHdpbGwgZmFpbCB3aXRoIDQwMChCYWQgUmVxdWVzdClcbiAgICAgKi9cbiAgICBnZXQgY29udGVudENyYzY0KCkge1xuICAgICAgICByZXR1cm4gdGhpcy5vcmlnaW5hbFJlc3BvbnNlLmNvbnRlbnRDcmM2NDtcbiAgICB9XG4gICAgLyoqXG4gICAgICogVGhlIHJlc3BvbnNlIGJvZHkgYXMgYSBicm93c2VyIEJsb2IuXG4gICAgICogQWx3YXlzIHVuZGVmaW5lZCBpbiBub2RlLmpzLlxuICAgICAqXG4gICAgICogQHJlYWRvbmx5XG4gICAgICovXG4gICAgZ2V0IGJsb2JCb2R5KCkge1xuICAgICAgICByZXR1cm4gdW5kZWZpbmVkO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBUaGUgcmVzcG9uc2UgYm9keSBhcyBhIG5vZGUuanMgUmVhZGFibGUgc3RyZWFtLlxuICAgICAqIEFsd2F5cyB1bmRlZmluZWQgaW4gdGhlIGJyb3dzZXIuXG4gICAgICpcbiAgICAgKiBJdCB3aWxsIHBhcnNlIGF2b3IgZGF0YSByZXR1cm5lZCBieSBibG9iIHF1ZXJ5LlxuICAgICAqXG4gICAgICogQHJlYWRvbmx5XG4gICAgICovXG4gICAgZ2V0IHJlYWRhYmxlU3RyZWFtQm9keSgpIHtcbiAgICAgICAgcmV0dXJuIGNvcmVVdGlsLmlzTm9kZSA/IHRoaXMuYmxvYkRvd25sb2FkU3RyZWFtIDogdW5kZWZpbmVkO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBUaGUgSFRUUCByZXNwb25zZS5cbiAgICAgKi9cbiAgICBnZXQgX3Jlc3BvbnNlKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5vcmlnaW5hbFJlc3BvbnNlLl9yZXNwb25zZTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogQ3JlYXRlcyBhbiBpbnN0YW5jZSBvZiBCbG9iUXVlcnlSZXNwb25zZS5cbiAgICAgKlxuICAgICAqIEBwYXJhbSBvcmlnaW5hbFJlc3BvbnNlIC1cbiAgICAgKiBAcGFyYW0gb3B0aW9ucyAtXG4gICAgICovXG4gICAgY29uc3RydWN0b3Iob3JpZ2luYWxSZXNwb25zZSwgb3B0aW9ucyA9IHt9KSB7XG4gICAgICAgIHRoaXMub3JpZ2luYWxSZXNwb25zZSA9IG9yaWdpbmFsUmVzcG9uc2U7XG4gICAgICAgIHRoaXMuYmxvYkRvd25sb2FkU3RyZWFtID0gbmV3IEJsb2JRdWlja1F1ZXJ5U3RyZWFtKHRoaXMub3JpZ2luYWxSZXNwb25zZS5yZWFkYWJsZVN0cmVhbUJvZHksIG9wdGlvbnMpO1xuICAgIH1cbn1cblxuLy8gQ29weXJpZ2h0IChjKSBNaWNyb3NvZnQgQ29ycG9yYXRpb24uXG4vLyBMaWNlbnNlZCB1bmRlciB0aGUgTUlUIExpY2Vuc2UuXG4vKipcbiAqIFJlcHJlc2VudHMgdGhlIGFjY2VzcyB0aWVyIG9uIGEgYmxvYi5cbiAqIEZvciBkZXRhaWxlZCBpbmZvcm1hdGlvbiBhYm91dCBibG9jayBibG9iIGxldmVsIHRpZXJpbmcgc2VlIHtAbGluayBodHRwczovL2RvY3MubWljcm9zb2Z0LmNvbS9henVyZS9zdG9yYWdlL2Jsb2JzL3N0b3JhZ2UtYmxvYi1zdG9yYWdlLXRpZXJzfEhvdCwgY29vbCBhbmQgYXJjaGl2ZSBzdG9yYWdlIHRpZXJzLn1cbiAqL1xuZXhwb3J0cy5CbG9ja0Jsb2JUaWVyID0gdm9pZCAwO1xuKGZ1bmN0aW9uIChCbG9ja0Jsb2JUaWVyKSB7XG4gICAgLyoqXG4gICAgICogT3B0aW1pemVkIGZvciBzdG9yaW5nIGRhdGEgdGhhdCBpcyBhY2Nlc3NlZCBmcmVxdWVudGx5LlxuICAgICAqL1xuICAgIEJsb2NrQmxvYlRpZXJbXCJIb3RcIl0gPSBcIkhvdFwiO1xuICAgIC8qKlxuICAgICAqIE9wdGltaXplZCBmb3Igc3RvcmluZyBkYXRhIHRoYXQgaXMgaW5mcmVxdWVudGx5IGFjY2Vzc2VkIGFuZCBzdG9yZWQgZm9yIGF0IGxlYXN0IDMwIGRheXMuXG4gICAgICovXG4gICAgQmxvY2tCbG9iVGllcltcIkNvb2xcIl0gPSBcIkNvb2xcIjtcbiAgICAvKipcbiAgICAgKiBPcHRpbWl6ZWQgZm9yIHN0b3JpbmcgZGF0YSB0aGF0IGlzIHJhcmVseSBhY2Nlc3NlZC5cbiAgICAgKi9cbiAgICBCbG9ja0Jsb2JUaWVyW1wiQ29sZFwiXSA9IFwiQ29sZFwiO1xuICAgIC8qKlxuICAgICAqIE9wdGltaXplZCBmb3Igc3RvcmluZyBkYXRhIHRoYXQgaXMgcmFyZWx5IGFjY2Vzc2VkIGFuZCBzdG9yZWQgZm9yIGF0IGxlYXN0IDE4MCBkYXlzXG4gICAgICogd2l0aCBmbGV4aWJsZSBsYXRlbmN5IHJlcXVpcmVtZW50cyAob24gdGhlIG9yZGVyIG9mIGhvdXJzKS5cbiAgICAgKi9cbiAgICBCbG9ja0Jsb2JUaWVyW1wiQXJjaGl2ZVwiXSA9IFwiQXJjaGl2ZVwiO1xufSkoZXhwb3J0cy5CbG9ja0Jsb2JUaWVyIHx8IChleHBvcnRzLkJsb2NrQmxvYlRpZXIgPSB7fSkpO1xuLyoqXG4gKiBTcGVjaWZpZXMgdGhlIHBhZ2UgYmxvYiB0aWVyIHRvIHNldCB0aGUgYmxvYiB0by4gVGhpcyBpcyBvbmx5IGFwcGxpY2FibGUgdG8gcGFnZSBibG9icyBvbiBwcmVtaXVtIHN0b3JhZ2UgYWNjb3VudHMuXG4gKiBQbGVhc2Ugc2VlIHtAbGluayBodHRwczovL2RvY3MubWljcm9zb2Z0LmNvbS9henVyZS9zdG9yYWdlL3N0b3JhZ2UtcHJlbWl1bS1zdG9yYWdlI3NjYWxhYmlsaXR5LWFuZC1wZXJmb3JtYW5jZS10YXJnZXRzfGhlcmV9XG4gKiBmb3IgZGV0YWlsZWQgaW5mb3JtYXRpb24gb24gdGhlIGNvcnJlc3BvbmRpbmcgSU9QUyBhbmQgdGhyb3VnaHB1dCBwZXIgUGFnZUJsb2JUaWVyLlxuICovXG5leHBvcnRzLlByZW1pdW1QYWdlQmxvYlRpZXIgPSB2b2lkIDA7XG4oZnVuY3Rpb24gKFByZW1pdW1QYWdlQmxvYlRpZXIpIHtcbiAgICAvKipcbiAgICAgKiBQNCBUaWVyLlxuICAgICAqL1xuICAgIFByZW1pdW1QYWdlQmxvYlRpZXJbXCJQNFwiXSA9IFwiUDRcIjtcbiAgICAvKipcbiAgICAgKiBQNiBUaWVyLlxuICAgICAqL1xuICAgIFByZW1pdW1QYWdlQmxvYlRpZXJbXCJQNlwiXSA9IFwiUDZcIjtcbiAgICAvKipcbiAgICAgKiBQMTAgVGllci5cbiAgICAgKi9cbiAgICBQcmVtaXVtUGFnZUJsb2JUaWVyW1wiUDEwXCJdID0gXCJQMTBcIjtcbiAgICAvKipcbiAgICAgKiBQMTUgVGllci5cbiAgICAgKi9cbiAgICBQcmVtaXVtUGFnZUJsb2JUaWVyW1wiUDE1XCJdID0gXCJQMTVcIjtcbiAgICAvKipcbiAgICAgKiBQMjAgVGllci5cbiAgICAgKi9cbiAgICBQcmVtaXVtUGFnZUJsb2JUaWVyW1wiUDIwXCJdID0gXCJQMjBcIjtcbiAgICAvKipcbiAgICAgKiBQMzAgVGllci5cbiAgICAgKi9cbiAgICBQcmVtaXVtUGFnZUJsb2JUaWVyW1wiUDMwXCJdID0gXCJQMzBcIjtcbiAgICAvKipcbiAgICAgKiBQNDAgVGllci5cbiAgICAgKi9cbiAgICBQcmVtaXVtUGFnZUJsb2JUaWVyW1wiUDQwXCJdID0gXCJQNDBcIjtcbiAgICAvKipcbiAgICAgKiBQNTAgVGllci5cbiAgICAgKi9cbiAgICBQcmVtaXVtUGFnZUJsb2JUaWVyW1wiUDUwXCJdID0gXCJQNTBcIjtcbiAgICAvKipcbiAgICAgKiBQNjAgVGllci5cbiAgICAgKi9cbiAgICBQcmVtaXVtUGFnZUJsb2JUaWVyW1wiUDYwXCJdID0gXCJQNjBcIjtcbiAgICAvKipcbiAgICAgKiBQNzAgVGllci5cbiAgICAgKi9cbiAgICBQcmVtaXVtUGFnZUJsb2JUaWVyW1wiUDcwXCJdID0gXCJQNzBcIjtcbiAgICAvKipcbiAgICAgKiBQODAgVGllci5cbiAgICAgKi9cbiAgICBQcmVtaXVtUGFnZUJsb2JUaWVyW1wiUDgwXCJdID0gXCJQODBcIjtcbn0pKGV4cG9ydHMuUHJlbWl1bVBhZ2VCbG9iVGllciB8fCAoZXhwb3J0cy5QcmVtaXVtUGFnZUJsb2JUaWVyID0ge30pKTtcbmZ1bmN0aW9uIHRvQWNjZXNzVGllcih0aWVyKSB7XG4gICAgaWYgKHRpZXIgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICByZXR1cm4gdW5kZWZpbmVkO1xuICAgIH1cbiAgICByZXR1cm4gdGllcjsgLy8gTm8gbW9yZSBjaGVjayBpZiBzdHJpbmcgaXMgYSB2YWxpZCBBY2Nlc3NUaWVyLCBhbmQgbGVmdCB0aGlzIHRvIHVuZGVybGF5IGxvZ2ljIHRvIGRlY2lkZShzZXJ2aWNlKS5cbn1cbmZ1bmN0aW9uIGVuc3VyZUNwa0lmU3BlY2lmaWVkKGNwaywgaXNIdHRwcykge1xuICAgIGlmIChjcGsgJiYgIWlzSHR0cHMpIHtcbiAgICAgICAgdGhyb3cgbmV3IFJhbmdlRXJyb3IoXCJDdXN0b21lci1wcm92aWRlZCBlbmNyeXB0aW9uIGtleSBtdXN0IGJlIHVzZWQgb3ZlciBIVFRQUy5cIik7XG4gICAgfVxuICAgIGlmIChjcGsgJiYgIWNway5lbmNyeXB0aW9uQWxnb3JpdGhtKSB7XG4gICAgICAgIGNway5lbmNyeXB0aW9uQWxnb3JpdGhtID0gRW5jcnlwdGlvbkFsZ29yaXRobUFFUzI1O1xuICAgIH1cbn1cbi8qKlxuICogRGVmaW5lcyB0aGUga25vd24gY2xvdWQgYXVkaWVuY2VzIGZvciBTdG9yYWdlLlxuICovXG5leHBvcnRzLlN0b3JhZ2VCbG9iQXVkaWVuY2UgPSB2b2lkIDA7XG4oZnVuY3Rpb24gKFN0b3JhZ2VCbG9iQXVkaWVuY2UpIHtcbiAgICAvKipcbiAgICAgKiBUaGUgT0F1dGggc2NvcGUgdG8gdXNlIHRvIHJldHJpZXZlIGFuIEFBRCB0b2tlbiBmb3IgQXp1cmUgU3RvcmFnZS5cbiAgICAgKi9cbiAgICBTdG9yYWdlQmxvYkF1ZGllbmNlW1wiU3RvcmFnZU9BdXRoU2NvcGVzXCJdID0gXCJodHRwczovL3N0b3JhZ2UuYXp1cmUuY29tLy5kZWZhdWx0XCI7XG4gICAgLyoqXG4gICAgICogVGhlIE9BdXRoIHNjb3BlIHRvIHVzZSB0byByZXRyaWV2ZSBhbiBBQUQgdG9rZW4gZm9yIEF6dXJlIERpc2suXG4gICAgICovXG4gICAgU3RvcmFnZUJsb2JBdWRpZW5jZVtcIkRpc2tDb21wdXRlT0F1dGhTY29wZXNcIl0gPSBcImh0dHBzOi8vZGlzay5jb21wdXRlLmF6dXJlLmNvbS8uZGVmYXVsdFwiO1xufSkoZXhwb3J0cy5TdG9yYWdlQmxvYkF1ZGllbmNlIHx8IChleHBvcnRzLlN0b3JhZ2VCbG9iQXVkaWVuY2UgPSB7fSkpO1xuLyoqXG4gKlxuICogVG8gZ2V0IE9BdXRoIGF1ZGllbmNlIGZvciBhIHN0b3JhZ2UgYWNjb3VudCBmb3IgYmxvYiBzZXJ2aWNlLlxuICovXG5mdW5jdGlvbiBnZXRCbG9iU2VydmljZUFjY291bnRBdWRpZW5jZShzdG9yYWdlQWNjb3VudE5hbWUpIHtcbiAgICByZXR1cm4gYGh0dHBzOi8vJHtzdG9yYWdlQWNjb3VudE5hbWV9LmJsb2IuY29yZS53aW5kb3dzLm5ldC8uZGVmYXVsdGA7XG59XG5cbi8vIENvcHlyaWdodCAoYykgTWljcm9zb2Z0IENvcnBvcmF0aW9uLlxuLy8gTGljZW5zZWQgdW5kZXIgdGhlIE1JVCBMaWNlbnNlLlxuLyoqXG4gKiBGdW5jdGlvbiB0aGF0IGNvbnZlcnRzIFBhZ2VSYW5nZSBhbmQgQ2xlYXJSYW5nZSB0byBhIGNvbW1vbiBSYW5nZSBvYmplY3QuXG4gKiBQYWdlUmFuZ2UgYW5kIENsZWFyUmFuZ2UgaGF2ZSBzdGFydCBhbmQgZW5kIHdoaWxlIFJhbmdlIG9mZnNldCBhbmQgY291bnRcbiAqIHRoaXMgZnVuY3Rpb24gbm9ybWFsaXplcyB0byBSYW5nZS5cbiAqIEBwYXJhbSByZXNwb25zZSAtIE1vZGVsIFBhZ2VCbG9iIFJhbmdlIHJlc3BvbnNlXG4gKi9cbmZ1bmN0aW9uIHJhbmdlUmVzcG9uc2VGcm9tTW9kZWwocmVzcG9uc2UpIHtcbiAgICBjb25zdCBwYWdlUmFuZ2UgPSAocmVzcG9uc2UuX3Jlc3BvbnNlLnBhcnNlZEJvZHkucGFnZVJhbmdlIHx8IFtdKS5tYXAoKHgpID0+ICh7XG4gICAgICAgIG9mZnNldDogeC5zdGFydCxcbiAgICAgICAgY291bnQ6IHguZW5kIC0geC5zdGFydCxcbiAgICB9KSk7XG4gICAgY29uc3QgY2xlYXJSYW5nZSA9IChyZXNwb25zZS5fcmVzcG9uc2UucGFyc2VkQm9keS5jbGVhclJhbmdlIHx8IFtdKS5tYXAoKHgpID0+ICh7XG4gICAgICAgIG9mZnNldDogeC5zdGFydCxcbiAgICAgICAgY291bnQ6IHguZW5kIC0geC5zdGFydCxcbiAgICB9KSk7XG4gICAgcmV0dXJuIE9iamVjdC5hc3NpZ24oT2JqZWN0LmFzc2lnbih7fSwgcmVzcG9uc2UpLCB7IHBhZ2VSYW5nZSxcbiAgICAgICAgY2xlYXJSYW5nZSwgX3Jlc3BvbnNlOiBPYmplY3QuYXNzaWduKE9iamVjdC5hc3NpZ24oe30sIHJlc3BvbnNlLl9yZXNwb25zZSksIHsgcGFyc2VkQm9keToge1xuICAgICAgICAgICAgICAgIHBhZ2VSYW5nZSxcbiAgICAgICAgICAgICAgICBjbGVhclJhbmdlLFxuICAgICAgICAgICAgfSB9KSB9KTtcbn1cblxuLy8gQ29weXJpZ2h0IChjKSBNaWNyb3NvZnQgQ29ycG9yYXRpb24uXG4vLyBMaWNlbnNlZCB1bmRlciB0aGUgTUlUIExpY2Vuc2UuXG4vKipcbiAqIFRoaXMgaXMgdGhlIHBvbGxlciByZXR1cm5lZCBieSB7QGxpbmsgQmxvYkNsaWVudC5iZWdpbkNvcHlGcm9tVVJMfS5cbiAqIFRoaXMgY2FuIG5vdCBiZSBpbnN0YW50aWF0ZWQgZGlyZWN0bHkgb3V0c2lkZSBvZiB0aGlzIHBhY2thZ2UuXG4gKlxuICogQGhpZGRlblxuICovXG5jbGFzcyBCbG9iQmVnaW5Db3B5RnJvbVVybFBvbGxlciBleHRlbmRzIGNvcmVMcm8uUG9sbGVyIHtcbiAgICBjb25zdHJ1Y3RvcihvcHRpb25zKSB7XG4gICAgICAgIGNvbnN0IHsgYmxvYkNsaWVudCwgY29weVNvdXJjZSwgaW50ZXJ2YWxJbk1zID0gMTUwMDAsIG9uUHJvZ3Jlc3MsIHJlc3VtZUZyb20sIHN0YXJ0Q29weUZyb21VUkxPcHRpb25zLCB9ID0gb3B0aW9ucztcbiAgICAgICAgbGV0IHN0YXRlO1xuICAgICAgICBpZiAocmVzdW1lRnJvbSkge1xuICAgICAgICAgICAgc3RhdGUgPSBKU09OLnBhcnNlKHJlc3VtZUZyb20pLnN0YXRlO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IG9wZXJhdGlvbiA9IG1ha2VCbG9iQmVnaW5Db3B5RnJvbVVSTFBvbGxPcGVyYXRpb24oT2JqZWN0LmFzc2lnbihPYmplY3QuYXNzaWduKHt9LCBzdGF0ZSksIHsgYmxvYkNsaWVudCxcbiAgICAgICAgICAgIGNvcHlTb3VyY2UsXG4gICAgICAgICAgICBzdGFydENvcHlGcm9tVVJMT3B0aW9ucyB9KSk7XG4gICAgICAgIHN1cGVyKG9wZXJhdGlvbik7XG4gICAgICAgIGlmICh0eXBlb2Ygb25Qcm9ncmVzcyA9PT0gXCJmdW5jdGlvblwiKSB7XG4gICAgICAgICAgICB0aGlzLm9uUHJvZ3Jlc3Mob25Qcm9ncmVzcyk7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5pbnRlcnZhbEluTXMgPSBpbnRlcnZhbEluTXM7XG4gICAgfVxuICAgIGRlbGF5KCkge1xuICAgICAgICByZXR1cm4gY29yZVV0aWwuZGVsYXkodGhpcy5pbnRlcnZhbEluTXMpO1xuICAgIH1cbn1cbi8qKlxuICogTm90ZTogSW50ZW50aW9uYWxseSB1c2luZyBmdW5jdGlvbiBleHByZXNzaW9uIG92ZXIgYXJyb3cgZnVuY3Rpb24gZXhwcmVzc2lvblxuICogc28gdGhhdCB0aGUgZnVuY3Rpb24gY2FuIGJlIGludm9rZWQgd2l0aCBhIGRpZmZlcmVudCBjb250ZXh0LlxuICogVGhpcyBhZmZlY3RzIHdoYXQgYHRoaXNgIHJlZmVycyB0by5cbiAqIEBoaWRkZW5cbiAqL1xuY29uc3QgY2FuY2VsID0gYXN5bmMgZnVuY3Rpb24gY2FuY2VsKG9wdGlvbnMgPSB7fSkge1xuICAgIGNvbnN0IHN0YXRlID0gdGhpcy5zdGF0ZTtcbiAgICBjb25zdCB7IGNvcHlJZCB9ID0gc3RhdGU7XG4gICAgaWYgKHN0YXRlLmlzQ29tcGxldGVkKSB7XG4gICAgICAgIHJldHVybiBtYWtlQmxvYkJlZ2luQ29weUZyb21VUkxQb2xsT3BlcmF0aW9uKHN0YXRlKTtcbiAgICB9XG4gICAgaWYgKCFjb3B5SWQpIHtcbiAgICAgICAgc3RhdGUuaXNDYW5jZWxsZWQgPSB0cnVlO1xuICAgICAgICByZXR1cm4gbWFrZUJsb2JCZWdpbkNvcHlGcm9tVVJMUG9sbE9wZXJhdGlvbihzdGF0ZSk7XG4gICAgfVxuICAgIC8vIGlmIGFib3J0Q29weUZyb21VUkwgdGhyb3dzLCBpdCB3aWxsIGJ1YmJsZSB1cCB0byB1c2VyJ3MgcG9sbGVyLmNhbmNlbE9wZXJhdGlvbiBjYWxsXG4gICAgYXdhaXQgc3RhdGUuYmxvYkNsaWVudC5hYm9ydENvcHlGcm9tVVJMKGNvcHlJZCwge1xuICAgICAgICBhYm9ydFNpZ25hbDogb3B0aW9ucy5hYm9ydFNpZ25hbCxcbiAgICB9KTtcbiAgICBzdGF0ZS5pc0NhbmNlbGxlZCA9IHRydWU7XG4gICAgcmV0dXJuIG1ha2VCbG9iQmVnaW5Db3B5RnJvbVVSTFBvbGxPcGVyYXRpb24oc3RhdGUpO1xufTtcbi8qKlxuICogTm90ZTogSW50ZW50aW9uYWxseSB1c2luZyBmdW5jdGlvbiBleHByZXNzaW9uIG92ZXIgYXJyb3cgZnVuY3Rpb24gZXhwcmVzc2lvblxuICogc28gdGhhdCB0aGUgZnVuY3Rpb24gY2FuIGJlIGludm9rZWQgd2l0aCBhIGRpZmZlcmVudCBjb250ZXh0LlxuICogVGhpcyBhZmZlY3RzIHdoYXQgYHRoaXNgIHJlZmVycyB0by5cbiAqIEBoaWRkZW5cbiAqL1xuY29uc3QgdXBkYXRlID0gYXN5bmMgZnVuY3Rpb24gdXBkYXRlKG9wdGlvbnMgPSB7fSkge1xuICAgIGNvbnN0IHN0YXRlID0gdGhpcy5zdGF0ZTtcbiAgICBjb25zdCB7IGJsb2JDbGllbnQsIGNvcHlTb3VyY2UsIHN0YXJ0Q29weUZyb21VUkxPcHRpb25zIH0gPSBzdGF0ZTtcbiAgICBpZiAoIXN0YXRlLmlzU3RhcnRlZCkge1xuICAgICAgICBzdGF0ZS5pc1N0YXJ0ZWQgPSB0cnVlO1xuICAgICAgICBjb25zdCByZXN1bHQgPSBhd2FpdCBibG9iQ2xpZW50LnN0YXJ0Q29weUZyb21VUkwoY29weVNvdXJjZSwgc3RhcnRDb3B5RnJvbVVSTE9wdGlvbnMpO1xuICAgICAgICAvLyBjb3B5SWQgaXMgbmVlZGVkIHRvIGFib3J0XG4gICAgICAgIHN0YXRlLmNvcHlJZCA9IHJlc3VsdC5jb3B5SWQ7XG4gICAgICAgIGlmIChyZXN1bHQuY29weVN0YXR1cyA9PT0gXCJzdWNjZXNzXCIpIHtcbiAgICAgICAgICAgIHN0YXRlLnJlc3VsdCA9IHJlc3VsdDtcbiAgICAgICAgICAgIHN0YXRlLmlzQ29tcGxldGVkID0gdHJ1ZTtcbiAgICAgICAgfVxuICAgIH1cbiAgICBlbHNlIGlmICghc3RhdGUuaXNDb21wbGV0ZWQpIHtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IHN0YXRlLmJsb2JDbGllbnQuZ2V0UHJvcGVydGllcyh7IGFib3J0U2lnbmFsOiBvcHRpb25zLmFib3J0U2lnbmFsIH0pO1xuICAgICAgICAgICAgY29uc3QgeyBjb3B5U3RhdHVzLCBjb3B5UHJvZ3Jlc3MgfSA9IHJlc3VsdDtcbiAgICAgICAgICAgIGNvbnN0IHByZXZDb3B5UHJvZ3Jlc3MgPSBzdGF0ZS5jb3B5UHJvZ3Jlc3M7XG4gICAgICAgICAgICBpZiAoY29weVByb2dyZXNzKSB7XG4gICAgICAgICAgICAgICAgc3RhdGUuY29weVByb2dyZXNzID0gY29weVByb2dyZXNzO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKGNvcHlTdGF0dXMgPT09IFwicGVuZGluZ1wiICYmXG4gICAgICAgICAgICAgICAgY29weVByb2dyZXNzICE9PSBwcmV2Q29weVByb2dyZXNzICYmXG4gICAgICAgICAgICAgICAgdHlwZW9mIG9wdGlvbnMuZmlyZVByb2dyZXNzID09PSBcImZ1bmN0aW9uXCIpIHtcbiAgICAgICAgICAgICAgICAvLyB0cmlnZ2VyIGluIHNldFRpbWVvdXQsIG9yIHN3YWxsb3cgZXJyb3I/XG4gICAgICAgICAgICAgICAgb3B0aW9ucy5maXJlUHJvZ3Jlc3Moc3RhdGUpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSBpZiAoY29weVN0YXR1cyA9PT0gXCJzdWNjZXNzXCIpIHtcbiAgICAgICAgICAgICAgICBzdGF0ZS5yZXN1bHQgPSByZXN1bHQ7XG4gICAgICAgICAgICAgICAgc3RhdGUuaXNDb21wbGV0ZWQgPSB0cnVlO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSBpZiAoY29weVN0YXR1cyA9PT0gXCJmYWlsZWRcIikge1xuICAgICAgICAgICAgICAgIHN0YXRlLmVycm9yID0gbmV3IEVycm9yKGBCbG9iIGNvcHkgZmFpbGVkIHdpdGggcmVhc29uOiBcIiR7cmVzdWx0LmNvcHlTdGF0dXNEZXNjcmlwdGlvbiB8fCBcInVua25vd25cIn1cImApO1xuICAgICAgICAgICAgICAgIHN0YXRlLmlzQ29tcGxldGVkID0gdHJ1ZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBjYXRjaCAoZXJyKSB7XG4gICAgICAgICAgICBzdGF0ZS5lcnJvciA9IGVycjtcbiAgICAgICAgICAgIHN0YXRlLmlzQ29tcGxldGVkID0gdHJ1ZTtcbiAgICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gbWFrZUJsb2JCZWdpbkNvcHlGcm9tVVJMUG9sbE9wZXJhdGlvbihzdGF0ZSk7XG59O1xuLyoqXG4gKiBOb3RlOiBJbnRlbnRpb25hbGx5IHVzaW5nIGZ1bmN0aW9uIGV4cHJlc3Npb24gb3ZlciBhcnJvdyBmdW5jdGlvbiBleHByZXNzaW9uXG4gKiBzbyB0aGF0IHRoZSBmdW5jdGlvbiBjYW4gYmUgaW52b2tlZCB3aXRoIGEgZGlmZmVyZW50IGNvbnRleHQuXG4gKiBUaGlzIGFmZmVjdHMgd2hhdCBgdGhpc2AgcmVmZXJzIHRvLlxuICogQGhpZGRlblxuICovXG5jb25zdCB0b1N0cmluZyA9IGZ1bmN0aW9uIHRvU3RyaW5nKCkge1xuICAgIHJldHVybiBKU09OLnN0cmluZ2lmeSh7IHN0YXRlOiB0aGlzLnN0YXRlIH0sIChrZXksIHZhbHVlKSA9PiB7XG4gICAgICAgIC8vIHJlbW92ZSBibG9iQ2xpZW50IGZyb20gc2VyaWFsaXplZCBzdGF0ZSBzaW5jZSBhIGNsaWVudCBjYW4ndCBiZSBoeWRyYXRlZCBmcm9tIHRoaXMgaW5mby5cbiAgICAgICAgaWYgKGtleSA9PT0gXCJibG9iQ2xpZW50XCIpIHtcbiAgICAgICAgICAgIHJldHVybiB1bmRlZmluZWQ7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHZhbHVlO1xuICAgIH0pO1xufTtcbi8qKlxuICogQ3JlYXRlcyBhIHBvbGwgb3BlcmF0aW9uIGdpdmVuIHRoZSBwcm92aWRlZCBzdGF0ZS5cbiAqIEBoaWRkZW5cbiAqL1xuZnVuY3Rpb24gbWFrZUJsb2JCZWdpbkNvcHlGcm9tVVJMUG9sbE9wZXJhdGlvbihzdGF0ZSkge1xuICAgIHJldHVybiB7XG4gICAgICAgIHN0YXRlOiBPYmplY3QuYXNzaWduKHt9LCBzdGF0ZSksXG4gICAgICAgIGNhbmNlbCxcbiAgICAgICAgdG9TdHJpbmcsXG4gICAgICAgIHVwZGF0ZSxcbiAgICB9O1xufVxuXG4vLyBDb3B5cmlnaHQgKGMpIE1pY3Jvc29mdCBDb3Jwb3JhdGlvbi5cbi8vIExpY2Vuc2VkIHVuZGVyIHRoZSBNSVQgTGljZW5zZS5cbi8qKlxuICogR2VuZXJhdGUgYSByYW5nZSBzdHJpbmcuIEZvciBleGFtcGxlOlxuICpcbiAqIFwiYnl0ZXM9MjU1LVwiIG9yIFwiYnl0ZXM9MC01MTFcIlxuICpcbiAqIEBwYXJhbSBpUmFuZ2UgLVxuICovXG5mdW5jdGlvbiByYW5nZVRvU3RyaW5nKGlSYW5nZSkge1xuICAgIGlmIChpUmFuZ2Uub2Zmc2V0IDwgMCkge1xuICAgICAgICB0aHJvdyBuZXcgUmFuZ2VFcnJvcihgUmFuZ2Uub2Zmc2V0IGNhbm5vdCBiZSBzbWFsbGVyIHRoYW4gMC5gKTtcbiAgICB9XG4gICAgaWYgKGlSYW5nZS5jb3VudCAmJiBpUmFuZ2UuY291bnQgPD0gMCkge1xuICAgICAgICB0aHJvdyBuZXcgUmFuZ2VFcnJvcihgUmFuZ2UuY291bnQgbXVzdCBiZSBsYXJnZXIgdGhhbiAwLiBMZWF2ZSBpdCB1bmRlZmluZWQgaWYgeW91IHdhbnQgYSByYW5nZSBmcm9tIG9mZnNldCB0byB0aGUgZW5kLmApO1xuICAgIH1cbiAgICByZXR1cm4gaVJhbmdlLmNvdW50XG4gICAgICAgID8gYGJ5dGVzPSR7aVJhbmdlLm9mZnNldH0tJHtpUmFuZ2Uub2Zmc2V0ICsgaVJhbmdlLmNvdW50IC0gMX1gXG4gICAgICAgIDogYGJ5dGVzPSR7aVJhbmdlLm9mZnNldH0tYDtcbn1cblxuLy8gQ29weXJpZ2h0IChjKSBNaWNyb3NvZnQgQ29ycG9yYXRpb24uXG4vLyBMaWNlbnNlZCB1bmRlciB0aGUgTUlUIExpY2Vuc2UuXG4vLyBJbiBicm93c2VyLCBkdXJpbmcgd2VicGFjayBvciBicm93c2VyaWZ5IGJ1bmRsaW5nLCB0aGlzIG1vZHVsZSB3aWxsIGJlIHJlcGxhY2VkIGJ5ICdldmVudHMnXG4vLyBodHRwczovL2dpdGh1Yi5jb20vR296YWxhL2V2ZW50c1xuLyoqXG4gKiBTdGF0ZXMgZm9yIEJhdGNoLlxuICovXG52YXIgQmF0Y2hTdGF0ZXM7XG4oZnVuY3Rpb24gKEJhdGNoU3RhdGVzKSB7XG4gICAgQmF0Y2hTdGF0ZXNbQmF0Y2hTdGF0ZXNbXCJHb29kXCJdID0gMF0gPSBcIkdvb2RcIjtcbiAgICBCYXRjaFN0YXRlc1tCYXRjaFN0YXRlc1tcIkVycm9yXCJdID0gMV0gPSBcIkVycm9yXCI7XG59KShCYXRjaFN0YXRlcyB8fCAoQmF0Y2hTdGF0ZXMgPSB7fSkpO1xuLyoqXG4gKiBCYXRjaCBwcm92aWRlcyBiYXNpYyBwYXJhbGxlbCBleGVjdXRpb24gd2l0aCBjb25jdXJyZW5jeSBsaW1pdHMuXG4gKiBXaWxsIHN0b3AgZXhlY3V0ZSBsZWZ0IG9wZXJhdGlvbnMgd2hlbiBvbmUgb2YgdGhlIGV4ZWN1dGVkIG9wZXJhdGlvbiB0aHJvd3MgYW4gZXJyb3IuXG4gKiBCdXQgQmF0Y2ggY2Fubm90IGNhbmNlbCBvbmdvaW5nIG9wZXJhdGlvbnMsIHlvdSBuZWVkIHRvIGNhbmNlbCB0aGVtIGJ5IHlvdXJzZWxmLlxuICovXG5jbGFzcyBCYXRjaCB7XG4gICAgLyoqXG4gICAgICogQ3JlYXRlcyBhbiBpbnN0YW5jZSBvZiBCYXRjaC5cbiAgICAgKiBAcGFyYW0gY29uY3VycmVuY3kgLVxuICAgICAqL1xuICAgIGNvbnN0cnVjdG9yKGNvbmN1cnJlbmN5ID0gNSkge1xuICAgICAgICAvKipcbiAgICAgICAgICogTnVtYmVyIG9mIGFjdGl2ZSBvcGVyYXRpb25zIHVuZGVyIGV4ZWN1dGlvbi5cbiAgICAgICAgICovXG4gICAgICAgIHRoaXMuYWN0aXZlcyA9IDA7XG4gICAgICAgIC8qKlxuICAgICAgICAgKiBOdW1iZXIgb2YgY29tcGxldGVkIG9wZXJhdGlvbnMgdW5kZXIgZXhlY3V0aW9uLlxuICAgICAgICAgKi9cbiAgICAgICAgdGhpcy5jb21wbGV0ZWQgPSAwO1xuICAgICAgICAvKipcbiAgICAgICAgICogT2Zmc2V0IG9mIG5leHQgb3BlcmF0aW9uIHRvIGJlIGV4ZWN1dGVkLlxuICAgICAgICAgKi9cbiAgICAgICAgdGhpcy5vZmZzZXQgPSAwO1xuICAgICAgICAvKipcbiAgICAgICAgICogT3BlcmF0aW9uIGFycmF5IHRvIGJlIGV4ZWN1dGVkLlxuICAgICAgICAgKi9cbiAgICAgICAgdGhpcy5vcGVyYXRpb25zID0gW107XG4gICAgICAgIC8qKlxuICAgICAgICAgKiBTdGF0ZXMgb2YgQmF0Y2guIFdoZW4gYW4gZXJyb3IgaGFwcGVucywgc3RhdGUgd2lsbCB0dXJuIGludG8gZXJyb3IuXG4gICAgICAgICAqIEJhdGNoIHdpbGwgc3RvcCBleGVjdXRlIGxlZnQgb3BlcmF0aW9ucy5cbiAgICAgICAgICovXG4gICAgICAgIHRoaXMuc3RhdGUgPSBCYXRjaFN0YXRlcy5Hb29kO1xuICAgICAgICBpZiAoY29uY3VycmVuY3kgPCAxKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgUmFuZ2VFcnJvcihcImNvbmN1cnJlbmN5IG11c3QgYmUgbGFyZ2VyIHRoYW4gMFwiKTtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLmNvbmN1cnJlbmN5ID0gY29uY3VycmVuY3k7XG4gICAgICAgIHRoaXMuZW1pdHRlciA9IG5ldyBldmVudHMuRXZlbnRFbWl0dGVyKCk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIEFkZCBhIG9wZXJhdGlvbiBpbnRvIHF1ZXVlLlxuICAgICAqXG4gICAgICogQHBhcmFtIG9wZXJhdGlvbiAtXG4gICAgICovXG4gICAgYWRkT3BlcmF0aW9uKG9wZXJhdGlvbikge1xuICAgICAgICB0aGlzLm9wZXJhdGlvbnMucHVzaChhc3luYyAoKSA9PiB7XG4gICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgIHRoaXMuYWN0aXZlcysrO1xuICAgICAgICAgICAgICAgIGF3YWl0IG9wZXJhdGlvbigpO1xuICAgICAgICAgICAgICAgIHRoaXMuYWN0aXZlcy0tO1xuICAgICAgICAgICAgICAgIHRoaXMuY29tcGxldGVkKys7XG4gICAgICAgICAgICAgICAgdGhpcy5wYXJhbGxlbEV4ZWN1dGUoKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGNhdGNoIChlcnJvcikge1xuICAgICAgICAgICAgICAgIHRoaXMuZW1pdHRlci5lbWl0KFwiZXJyb3JcIiwgZXJyb3IpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogU3RhcnQgZXhlY3V0ZSBvcGVyYXRpb25zIGluIHRoZSBxdWV1ZS5cbiAgICAgKlxuICAgICAqL1xuICAgIGFzeW5jIGRvKCkge1xuICAgICAgICBpZiAodGhpcy5vcGVyYXRpb25zLmxlbmd0aCA9PT0gMCkge1xuICAgICAgICAgICAgcmV0dXJuIFByb21pc2UucmVzb2x2ZSgpO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMucGFyYWxsZWxFeGVjdXRlKCk7XG4gICAgICAgIHJldHVybiBuZXcgUHJvbWlzZSgocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XG4gICAgICAgICAgICB0aGlzLmVtaXR0ZXIub24oXCJmaW5pc2hcIiwgcmVzb2x2ZSk7XG4gICAgICAgICAgICB0aGlzLmVtaXR0ZXIub24oXCJlcnJvclwiLCAoZXJyb3IpID0+IHtcbiAgICAgICAgICAgICAgICB0aGlzLnN0YXRlID0gQmF0Y2hTdGF0ZXMuRXJyb3I7XG4gICAgICAgICAgICAgICAgcmVqZWN0KGVycm9yKTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9KTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogR2V0IG5leHQgb3BlcmF0aW9uIHRvIGJlIGV4ZWN1dGVkLiBSZXR1cm4gbnVsbCB3aGVuIHJlYWNoaW5nIGVuZHMuXG4gICAgICpcbiAgICAgKi9cbiAgICBuZXh0T3BlcmF0aW9uKCkge1xuICAgICAgICBpZiAodGhpcy5vZmZzZXQgPCB0aGlzLm9wZXJhdGlvbnMubGVuZ3RoKSB7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy5vcGVyYXRpb25zW3RoaXMub2Zmc2V0KytdO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBudWxsO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBTdGFydCBleGVjdXRlIG9wZXJhdGlvbnMuIE9uZSBvbmUgdGhlIG1vc3QgaW1wb3J0YW50IGRpZmZlcmVuY2UgYmV0d2VlblxuICAgICAqIHRoaXMgbWV0aG9kIHdpdGggZG8oKSBpcyB0aGF0IGRvKCkgd3JhcHMgYXMgYW4gc3luYyBtZXRob2QuXG4gICAgICpcbiAgICAgKi9cbiAgICBwYXJhbGxlbEV4ZWN1dGUoKSB7XG4gICAgICAgIGlmICh0aGlzLnN0YXRlID09PSBCYXRjaFN0YXRlcy5FcnJvcikge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIGlmICh0aGlzLmNvbXBsZXRlZCA+PSB0aGlzLm9wZXJhdGlvbnMubGVuZ3RoKSB7XG4gICAgICAgICAgICB0aGlzLmVtaXR0ZXIuZW1pdChcImZpbmlzaFwiKTtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICB3aGlsZSAodGhpcy5hY3RpdmVzIDwgdGhpcy5jb25jdXJyZW5jeSkge1xuICAgICAgICAgICAgY29uc3Qgb3BlcmF0aW9uID0gdGhpcy5uZXh0T3BlcmF0aW9uKCk7XG4gICAgICAgICAgICBpZiAob3BlcmF0aW9uKSB7XG4gICAgICAgICAgICAgICAgb3BlcmF0aW9uKCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG59XG5cbi8vIENvcHlyaWdodCAoYykgTWljcm9zb2Z0IENvcnBvcmF0aW9uLlxuLy8gTGljZW5zZWQgdW5kZXIgdGhlIE1JVCBMaWNlbnNlLlxuLyoqXG4gKiBUaGlzIGNsYXNzIGdlbmVyYXRlcyBhIHJlYWRhYmxlIHN0cmVhbSBmcm9tIHRoZSBkYXRhIGluIGFuIGFycmF5IG9mIGJ1ZmZlcnMuXG4gKi9cbmNsYXNzIEJ1ZmZlcnNTdHJlYW0gZXh0ZW5kcyBzdHJlYW0uUmVhZGFibGUge1xuICAgIC8qKlxuICAgICAqIENyZWF0ZXMgYW4gaW5zdGFuY2Ugb2YgQnVmZmVyc1N0cmVhbSB0aGF0IHdpbGwgZW1pdCB0aGUgZGF0YVxuICAgICAqIGNvbnRhaW5lZCBpbiB0aGUgYXJyYXkgb2YgYnVmZmVycy5cbiAgICAgKlxuICAgICAqIEBwYXJhbSBidWZmZXJzIC0gQXJyYXkgb2YgYnVmZmVycyBjb250YWluaW5nIHRoZSBkYXRhXG4gICAgICogQHBhcmFtIGJ5dGVMZW5ndGggLSBUaGUgdG90YWwgbGVuZ3RoIG9mIGRhdGEgY29udGFpbmVkIGluIHRoZSBidWZmZXJzXG4gICAgICovXG4gICAgY29uc3RydWN0b3IoYnVmZmVycywgYnl0ZUxlbmd0aCwgb3B0aW9ucykge1xuICAgICAgICBzdXBlcihvcHRpb25zKTtcbiAgICAgICAgdGhpcy5idWZmZXJzID0gYnVmZmVycztcbiAgICAgICAgdGhpcy5ieXRlTGVuZ3RoID0gYnl0ZUxlbmd0aDtcbiAgICAgICAgdGhpcy5ieXRlT2Zmc2V0SW5DdXJyZW50QnVmZmVyID0gMDtcbiAgICAgICAgdGhpcy5idWZmZXJJbmRleCA9IDA7XG4gICAgICAgIHRoaXMucHVzaGVkQnl0ZXNMZW5ndGggPSAwO1xuICAgICAgICAvLyBjaGVjayBieXRlTGVuZ3RoIGlzIG5vIGxhcmdlciB0aGFuIGJ1ZmZlcnNbXSB0b3RhbCBsZW5ndGhcbiAgICAgICAgbGV0IGJ1ZmZlcnNMZW5ndGggPSAwO1xuICAgICAgICBmb3IgKGNvbnN0IGJ1ZiBvZiB0aGlzLmJ1ZmZlcnMpIHtcbiAgICAgICAgICAgIGJ1ZmZlcnNMZW5ndGggKz0gYnVmLmJ5dGVMZW5ndGg7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGJ1ZmZlcnNMZW5ndGggPCB0aGlzLmJ5dGVMZW5ndGgpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihcIkRhdGEgc2l6ZSBzaG91bGRuJ3QgYmUgbGFyZ2VyIHRoYW4gdGhlIHRvdGFsIGxlbmd0aCBvZiBidWZmZXJzLlwiKTtcbiAgICAgICAgfVxuICAgIH1cbiAgICAvKipcbiAgICAgKiBJbnRlcm5hbCBfcmVhZCgpIHRoYXQgd2lsbCBiZSBjYWxsZWQgd2hlbiB0aGUgc3RyZWFtIHdhbnRzIHRvIHB1bGwgbW9yZSBkYXRhIGluLlxuICAgICAqXG4gICAgICogQHBhcmFtIHNpemUgLSBPcHRpb25hbC4gVGhlIHNpemUgb2YgZGF0YSB0byBiZSByZWFkXG4gICAgICovXG4gICAgX3JlYWQoc2l6ZSkge1xuICAgICAgICBpZiAodGhpcy5wdXNoZWRCeXRlc0xlbmd0aCA+PSB0aGlzLmJ5dGVMZW5ndGgpIHtcbiAgICAgICAgICAgIHRoaXMucHVzaChudWxsKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoIXNpemUpIHtcbiAgICAgICAgICAgIHNpemUgPSB0aGlzLnJlYWRhYmxlSGlnaFdhdGVyTWFyaztcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBvdXRCdWZmZXJzID0gW107XG4gICAgICAgIGxldCBpID0gMDtcbiAgICAgICAgd2hpbGUgKGkgPCBzaXplICYmIHRoaXMucHVzaGVkQnl0ZXNMZW5ndGggPCB0aGlzLmJ5dGVMZW5ndGgpIHtcbiAgICAgICAgICAgIC8vIFRoZSBsYXN0IGJ1ZmZlciBtYXkgYmUgbG9uZ2VyIHRoYW4gdGhlIGRhdGEgaXQgY29udGFpbnMuXG4gICAgICAgICAgICBjb25zdCByZW1haW5pbmdEYXRhSW5BbGxCdWZmZXJzID0gdGhpcy5ieXRlTGVuZ3RoIC0gdGhpcy5wdXNoZWRCeXRlc0xlbmd0aDtcbiAgICAgICAgICAgIGNvbnN0IHJlbWFpbmluZ0NhcGFjaXR5SW5UaGlzQnVmZmVyID0gdGhpcy5idWZmZXJzW3RoaXMuYnVmZmVySW5kZXhdLmJ5dGVMZW5ndGggLSB0aGlzLmJ5dGVPZmZzZXRJbkN1cnJlbnRCdWZmZXI7XG4gICAgICAgICAgICBjb25zdCByZW1haW5pbmcgPSBNYXRoLm1pbihyZW1haW5pbmdDYXBhY2l0eUluVGhpc0J1ZmZlciwgcmVtYWluaW5nRGF0YUluQWxsQnVmZmVycyk7XG4gICAgICAgICAgICBpZiAocmVtYWluaW5nID4gc2l6ZSAtIGkpIHtcbiAgICAgICAgICAgICAgICAvLyBjaHVua1NpemUgPSBzaXplIC0gaVxuICAgICAgICAgICAgICAgIGNvbnN0IGVuZCA9IHRoaXMuYnl0ZU9mZnNldEluQ3VycmVudEJ1ZmZlciArIHNpemUgLSBpO1xuICAgICAgICAgICAgICAgIG91dEJ1ZmZlcnMucHVzaCh0aGlzLmJ1ZmZlcnNbdGhpcy5idWZmZXJJbmRleF0uc2xpY2UodGhpcy5ieXRlT2Zmc2V0SW5DdXJyZW50QnVmZmVyLCBlbmQpKTtcbiAgICAgICAgICAgICAgICB0aGlzLnB1c2hlZEJ5dGVzTGVuZ3RoICs9IHNpemUgLSBpO1xuICAgICAgICAgICAgICAgIHRoaXMuYnl0ZU9mZnNldEluQ3VycmVudEJ1ZmZlciA9IGVuZDtcbiAgICAgICAgICAgICAgICBpID0gc2l6ZTtcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgIC8vIGNodW5rU2l6ZSA9IHJlbWFpbmluZ1xuICAgICAgICAgICAgICAgIGNvbnN0IGVuZCA9IHRoaXMuYnl0ZU9mZnNldEluQ3VycmVudEJ1ZmZlciArIHJlbWFpbmluZztcbiAgICAgICAgICAgICAgICBvdXRCdWZmZXJzLnB1c2godGhpcy5idWZmZXJzW3RoaXMuYnVmZmVySW5kZXhdLnNsaWNlKHRoaXMuYnl0ZU9mZnNldEluQ3VycmVudEJ1ZmZlciwgZW5kKSk7XG4gICAgICAgICAgICAgICAgaWYgKHJlbWFpbmluZyA9PT0gcmVtYWluaW5nQ2FwYWNpdHlJblRoaXNCdWZmZXIpIHtcbiAgICAgICAgICAgICAgICAgICAgLy8gdGhpcy5idWZmZXJzW3RoaXMuYnVmZmVySW5kZXhdIHVzZWQgdXAsIHNoaWZ0IHRvIG5leHQgb25lXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuYnl0ZU9mZnNldEluQ3VycmVudEJ1ZmZlciA9IDA7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuYnVmZmVySW5kZXgrKztcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuYnl0ZU9mZnNldEluQ3VycmVudEJ1ZmZlciA9IGVuZDtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgdGhpcy5wdXNoZWRCeXRlc0xlbmd0aCArPSByZW1haW5pbmc7XG4gICAgICAgICAgICAgICAgaSArPSByZW1haW5pbmc7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgaWYgKG91dEJ1ZmZlcnMubGVuZ3RoID4gMSkge1xuICAgICAgICAgICAgdGhpcy5wdXNoKEJ1ZmZlci5jb25jYXQob3V0QnVmZmVycykpO1xuICAgICAgICB9XG4gICAgICAgIGVsc2UgaWYgKG91dEJ1ZmZlcnMubGVuZ3RoID09PSAxKSB7XG4gICAgICAgICAgICB0aGlzLnB1c2gob3V0QnVmZmVyc1swXSk7XG4gICAgICAgIH1cbiAgICB9XG59XG5cbi8vIENvcHlyaWdodCAoYykgTWljcm9zb2Z0IENvcnBvcmF0aW9uLlxuLy8gTGljZW5zZWQgdW5kZXIgdGhlIE1JVCBMaWNlbnNlLlxuY29uc3QgbWF4QnVmZmVyTGVuZ3RoID0gYnVmZmVyLmNvbnN0YW50cy5NQVhfTEVOR1RIO1xuLyoqXG4gKiBUaGlzIGNsYXNzIHByb3ZpZGVzIGEgYnVmZmVyIGNvbnRhaW5lciB3aGljaCBjb25jZXB0dWFsbHkgaGFzIG5vIGhhcmQgc2l6ZSBsaW1pdC5cbiAqIEl0IGFjY2VwdHMgYSBjYXBhY2l0eSwgYW4gYXJyYXkgb2YgaW5wdXQgYnVmZmVycyBhbmQgdGhlIHRvdGFsIGxlbmd0aCBvZiBpbnB1dCBkYXRhLlxuICogSXQgd2lsbCBhbGxvY2F0ZSBhbiBpbnRlcm5hbCBcImJ1ZmZlclwiIG9mIHRoZSBjYXBhY2l0eSBhbmQgZmlsbCB0aGUgZGF0YSBpbiB0aGUgaW5wdXQgYnVmZmVyc1xuICogaW50byB0aGUgaW50ZXJuYWwgXCJidWZmZXJcIiBzZXJpYWxseSB3aXRoIHJlc3BlY3QgdG8gdGhlIHRvdGFsIGxlbmd0aC5cbiAqIFRoZW4gYnkgY2FsbGluZyBQb29sZWRCdWZmZXIuZ2V0UmVhZGFibGVTdHJlYW0oKSwgeW91IGNhbiBnZXQgYSByZWFkYWJsZSBzdHJlYW1cbiAqIGFzc2VtYmxlZCBmcm9tIGFsbCB0aGUgZGF0YSBpbiB0aGUgaW50ZXJuYWwgXCJidWZmZXJcIi5cbiAqL1xuY2xhc3MgUG9vbGVkQnVmZmVyIHtcbiAgICAvKipcbiAgICAgKiBUaGUgc2l6ZSBvZiB0aGUgZGF0YSBjb250YWluZWQgaW4gdGhlIHBvb2xlZCBidWZmZXJzLlxuICAgICAqL1xuICAgIGdldCBzaXplKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5fc2l6ZTtcbiAgICB9XG4gICAgY29uc3RydWN0b3IoY2FwYWNpdHksIGJ1ZmZlcnMsIHRvdGFsTGVuZ3RoKSB7XG4gICAgICAgIC8qKlxuICAgICAgICAgKiBJbnRlcm5hbCBidWZmZXJzIHVzZWQgdG8ga2VlcCB0aGUgZGF0YS5cbiAgICAgICAgICogRWFjaCBidWZmZXIgaGFzIGEgbGVuZ3RoIG9mIHRoZSBtYXhCdWZmZXJMZW5ndGggZXhjZXB0IGxhc3Qgb25lLlxuICAgICAgICAgKi9cbiAgICAgICAgdGhpcy5idWZmZXJzID0gW107XG4gICAgICAgIHRoaXMuY2FwYWNpdHkgPSBjYXBhY2l0eTtcbiAgICAgICAgdGhpcy5fc2l6ZSA9IDA7XG4gICAgICAgIC8vIGFsbG9jYXRlXG4gICAgICAgIGNvbnN0IGJ1ZmZlck51bSA9IE1hdGguY2VpbChjYXBhY2l0eSAvIG1heEJ1ZmZlckxlbmd0aCk7XG4gICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgYnVmZmVyTnVtOyBpKyspIHtcbiAgICAgICAgICAgIGxldCBsZW4gPSBpID09PSBidWZmZXJOdW0gLSAxID8gY2FwYWNpdHkgJSBtYXhCdWZmZXJMZW5ndGggOiBtYXhCdWZmZXJMZW5ndGg7XG4gICAgICAgICAgICBpZiAobGVuID09PSAwKSB7XG4gICAgICAgICAgICAgICAgbGVuID0gbWF4QnVmZmVyTGVuZ3RoO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgdGhpcy5idWZmZXJzLnB1c2goQnVmZmVyLmFsbG9jVW5zYWZlKGxlbikpO1xuICAgICAgICB9XG4gICAgICAgIGlmIChidWZmZXJzKSB7XG4gICAgICAgICAgICB0aGlzLmZpbGwoYnVmZmVycywgdG90YWxMZW5ndGgpO1xuICAgICAgICB9XG4gICAgfVxuICAgIC8qKlxuICAgICAqIEZpbGwgdGhlIGludGVybmFsIGJ1ZmZlcnMgd2l0aCBkYXRhIGluIHRoZSBpbnB1dCBidWZmZXJzIHNlcmlhbGx5XG4gICAgICogd2l0aCByZXNwZWN0IHRvIHRoZSB0b3RhbCBsZW5ndGggYW5kIHRoZSB0b3RhbCBjYXBhY2l0eSBvZiB0aGUgaW50ZXJuYWwgYnVmZmVycy5cbiAgICAgKiBEYXRhIGNvcGllZCB3aWxsIGJlIHNoaWZ0IG91dCBvZiB0aGUgaW5wdXQgYnVmZmVycy5cbiAgICAgKlxuICAgICAqIEBwYXJhbSBidWZmZXJzIC0gSW5wdXQgYnVmZmVycyBjb250YWluaW5nIHRoZSBkYXRhIHRvIGJlIGZpbGxlZCBpbiB0aGUgcG9vbGVkIGJ1ZmZlclxuICAgICAqIEBwYXJhbSB0b3RhbExlbmd0aCAtIFRvdGFsIGxlbmd0aCBvZiB0aGUgZGF0YSB0byBiZSBmaWxsZWQgaW4uXG4gICAgICpcbiAgICAgKi9cbiAgICBmaWxsKGJ1ZmZlcnMsIHRvdGFsTGVuZ3RoKSB7XG4gICAgICAgIHRoaXMuX3NpemUgPSBNYXRoLm1pbih0aGlzLmNhcGFjaXR5LCB0b3RhbExlbmd0aCk7XG4gICAgICAgIGxldCBpID0gMCwgaiA9IDAsIHRhcmdldE9mZnNldCA9IDAsIHNvdXJjZU9mZnNldCA9IDAsIHRvdGFsQ29waWVkTnVtID0gMDtcbiAgICAgICAgd2hpbGUgKHRvdGFsQ29waWVkTnVtIDwgdGhpcy5fc2l6ZSkge1xuICAgICAgICAgICAgY29uc3Qgc291cmNlID0gYnVmZmVyc1tpXTtcbiAgICAgICAgICAgIGNvbnN0IHRhcmdldCA9IHRoaXMuYnVmZmVyc1tqXTtcbiAgICAgICAgICAgIGNvbnN0IGNvcGllZE51bSA9IHNvdXJjZS5jb3B5KHRhcmdldCwgdGFyZ2V0T2Zmc2V0LCBzb3VyY2VPZmZzZXQpO1xuICAgICAgICAgICAgdG90YWxDb3BpZWROdW0gKz0gY29waWVkTnVtO1xuICAgICAgICAgICAgc291cmNlT2Zmc2V0ICs9IGNvcGllZE51bTtcbiAgICAgICAgICAgIHRhcmdldE9mZnNldCArPSBjb3BpZWROdW07XG4gICAgICAgICAgICBpZiAoc291cmNlT2Zmc2V0ID09PSBzb3VyY2UubGVuZ3RoKSB7XG4gICAgICAgICAgICAgICAgaSsrO1xuICAgICAgICAgICAgICAgIHNvdXJjZU9mZnNldCA9IDA7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAodGFyZ2V0T2Zmc2V0ID09PSB0YXJnZXQubGVuZ3RoKSB7XG4gICAgICAgICAgICAgICAgaisrO1xuICAgICAgICAgICAgICAgIHRhcmdldE9mZnNldCA9IDA7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgLy8gY2xlYXIgY29waWVkIGZyb20gc291cmNlIGJ1ZmZlcnNcbiAgICAgICAgYnVmZmVycy5zcGxpY2UoMCwgaSk7XG4gICAgICAgIGlmIChidWZmZXJzLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgIGJ1ZmZlcnNbMF0gPSBidWZmZXJzWzBdLnNsaWNlKHNvdXJjZU9mZnNldCk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgLyoqXG4gICAgICogR2V0IHRoZSByZWFkYWJsZSBzdHJlYW0gYXNzZW1ibGVkIGZyb20gYWxsIHRoZSBkYXRhIGluIHRoZSBpbnRlcm5hbCBidWZmZXJzLlxuICAgICAqXG4gICAgICovXG4gICAgZ2V0UmVhZGFibGVTdHJlYW0oKSB7XG4gICAgICAgIHJldHVybiBuZXcgQnVmZmVyc1N0cmVhbSh0aGlzLmJ1ZmZlcnMsIHRoaXMuc2l6ZSk7XG4gICAgfVxufVxuXG4vLyBDb3B5cmlnaHQgKGMpIE1pY3Jvc29mdCBDb3Jwb3JhdGlvbi5cbi8vIExpY2Vuc2VkIHVuZGVyIHRoZSBNSVQgTGljZW5zZS5cbi8qKlxuICogVGhpcyBjbGFzcyBhY2NlcHRzIGEgTm9kZS5qcyBSZWFkYWJsZSBzdHJlYW0gYXMgaW5wdXQsIGFuZCBrZWVwcyByZWFkaW5nIGRhdGFcbiAqIGZyb20gdGhlIHN0cmVhbSBpbnRvIHRoZSBpbnRlcm5hbCBidWZmZXIgc3RydWN0dXJlLCB1bnRpbCBpdCByZWFjaGVzIG1heEJ1ZmZlcnMuXG4gKiBFdmVyeSBhdmFpbGFibGUgYnVmZmVyIHdpbGwgdHJ5IHRvIHRyaWdnZXIgb3V0Z29pbmdIYW5kbGVyLlxuICpcbiAqIFRoZSBpbnRlcm5hbCBidWZmZXIgc3RydWN0dXJlIGluY2x1ZGVzIGFuIGluY29taW5nIGJ1ZmZlciBhcnJheSwgYW5kIGEgb3V0Z29pbmdcbiAqIGJ1ZmZlciBhcnJheS4gVGhlIGluY29taW5nIGJ1ZmZlciBhcnJheSBpbmNsdWRlcyB0aGUgXCJlbXB0eVwiIGJ1ZmZlcnMgY2FuIGJlIGZpbGxlZFxuICogd2l0aCBuZXcgaW5jb21pbmcgZGF0YS4gVGhlIG91dGdvaW5nIGFycmF5IGluY2x1ZGVzIHRoZSBmaWxsZWQgYnVmZmVycyB0byBiZVxuICogaGFuZGxlZCBieSBvdXRnb2luZ0hhbmRsZXIuIEV2ZXJ5IGFib3ZlIGJ1ZmZlciBzaXplIGlzIGRlZmluZWQgYnkgcGFyYW1ldGVyIGJ1ZmZlclNpemUuXG4gKlxuICogTlVNX09GX0FMTF9CVUZGRVJTID0gQlVGRkVSU19JTl9JTkNPTUlORyArIEJVRkZFUlNfSU5fT1VUR09JTkcgKyBCVUZGRVJTX1VOREVSX0hBTkRMSU5HXG4gKlxuICogTlVNX09GX0FMTF9CVUZGRVJTIGxlc3NlciB0aGFuIG9yIGVxdWFsIHRvIG1heEJ1ZmZlcnNcbiAqXG4gKiBQRVJGT1JNQU5DRSBJTVBST1ZFTUVOVCBUSVBTOlxuICogMS4gSW5wdXQgc3RyZWFtIGhpZ2hXYXRlck1hcmsgaXMgYmV0dGVyIHRvIHNldCBhIHNhbWUgdmFsdWUgd2l0aCBidWZmZXJTaXplXG4gKiAgICBwYXJhbWV0ZXIsIHdoaWNoIHdpbGwgYXZvaWQgQnVmZmVyLmNvbmNhdCgpIG9wZXJhdGlvbnMuXG4gKiAyLiBjb25jdXJyZW5jeSBzaG91bGQgc2V0IGEgc21hbGxlciB2YWx1ZSB0aGFuIG1heEJ1ZmZlcnMsIHdoaWNoIGlzIGhlbHBmdWwgdG9cbiAqICAgIHJlZHVjZSB0aGUgcG9zc2liaWxpdHkgd2hlbiBhIG91dGdvaW5nIGhhbmRsZXIgd2FpdHMgZm9yIHRoZSBzdHJlYW0gZGF0YS5cbiAqICAgIGluIHRoaXMgc2l0dWF0aW9uLCBvdXRnb2luZyBoYW5kbGVycyBhcmUgYmxvY2tlZC5cbiAqICAgIE91dGdvaW5nIHF1ZXVlIHNob3VsZG4ndCBiZSBlbXB0eS5cbiAqL1xuY2xhc3MgQnVmZmVyU2NoZWR1bGVyIHtcbiAgICAvKipcbiAgICAgKiBDcmVhdGVzIGFuIGluc3RhbmNlIG9mIEJ1ZmZlclNjaGVkdWxlci5cbiAgICAgKlxuICAgICAqIEBwYXJhbSByZWFkYWJsZSAtIEEgTm9kZS5qcyBSZWFkYWJsZSBzdHJlYW1cbiAgICAgKiBAcGFyYW0gYnVmZmVyU2l6ZSAtIEJ1ZmZlciBzaXplIG9mIGV2ZXJ5IG1haW50YWluZWQgYnVmZmVyXG4gICAgICogQHBhcmFtIG1heEJ1ZmZlcnMgLSBIb3cgbWFueSBidWZmZXJzIGNhbiBiZSBhbGxvY2F0ZWRcbiAgICAgKiBAcGFyYW0gb3V0Z29pbmdIYW5kbGVyIC0gQW4gYXN5bmMgZnVuY3Rpb24gc2NoZWR1bGVkIHRvIGJlXG4gICAgICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0cmlnZ2VyZWQgd2hlbiBhIGJ1ZmZlciBmdWxseSBmaWxsZWRcbiAgICAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdpdGggc3RyZWFtIGRhdGFcbiAgICAgKiBAcGFyYW0gY29uY3VycmVuY3kgLSBDb25jdXJyZW5jeSBvZiBleGVjdXRpbmcgb3V0Z29pbmdIYW5kbGVycyAoPjApXG4gICAgICogQHBhcmFtIGVuY29kaW5nIC0gW09wdGlvbmFsXSBFbmNvZGluZyBvZiBSZWFkYWJsZSBzdHJlYW0gd2hlbiBpdCdzIGEgc3RyaW5nIHN0cmVhbVxuICAgICAqL1xuICAgIGNvbnN0cnVjdG9yKHJlYWRhYmxlLCBidWZmZXJTaXplLCBtYXhCdWZmZXJzLCBvdXRnb2luZ0hhbmRsZXIsIGNvbmN1cnJlbmN5LCBlbmNvZGluZykge1xuICAgICAgICAvKipcbiAgICAgICAgICogQW4gaW50ZXJuYWwgZXZlbnQgZW1pdHRlci5cbiAgICAgICAgICovXG4gICAgICAgIHRoaXMuZW1pdHRlciA9IG5ldyBldmVudHMuRXZlbnRFbWl0dGVyKCk7XG4gICAgICAgIC8qKlxuICAgICAgICAgKiBBbiBpbnRlcm5hbCBvZmZzZXQgbWFya2VyIHRvIHRyYWNrIGRhdGEgb2Zmc2V0IGluIGJ5dGVzIG9mIG5leHQgb3V0Z29pbmdIYW5kbGVyLlxuICAgICAgICAgKi9cbiAgICAgICAgdGhpcy5vZmZzZXQgPSAwO1xuICAgICAgICAvKipcbiAgICAgICAgICogQW4gaW50ZXJuYWwgbWFya2VyIHRvIHRyYWNrIHdoZXRoZXIgc3RyZWFtIGlzIGVuZC5cbiAgICAgICAgICovXG4gICAgICAgIHRoaXMuaXNTdHJlYW1FbmQgPSBmYWxzZTtcbiAgICAgICAgLyoqXG4gICAgICAgICAqIEFuIGludGVybmFsIG1hcmtlciB0byB0cmFjayB3aGV0aGVyIHN0cmVhbSBvciBvdXRnb2luZ0hhbmRsZXIgcmV0dXJucyBlcnJvci5cbiAgICAgICAgICovXG4gICAgICAgIHRoaXMuaXNFcnJvciA9IGZhbHNlO1xuICAgICAgICAvKipcbiAgICAgICAgICogSG93IG1hbnkgaGFuZGxlcnMgYXJlIGV4ZWN1dGluZy5cbiAgICAgICAgICovXG4gICAgICAgIHRoaXMuZXhlY3V0aW5nT3V0Z29pbmdIYW5kbGVycyA9IDA7XG4gICAgICAgIC8qKlxuICAgICAgICAgKiBIb3cgbWFueSBidWZmZXJzIGhhdmUgYmVlbiBhbGxvY2F0ZWQuXG4gICAgICAgICAqL1xuICAgICAgICB0aGlzLm51bUJ1ZmZlcnMgPSAwO1xuICAgICAgICAvKipcbiAgICAgICAgICogQmVjYXVzZSB0aGlzIGNsYXNzIGRvZXNuJ3Qga25vdyBob3cgbXVjaCBkYXRhIGV2ZXJ5IHRpbWUgc3RyZWFtIHBvcHMsIHdoaWNoXG4gICAgICAgICAqIGlzIGRlZmluZWQgYnkgaGlnaFdhdGVyTWFya2VyIG9mIHRoZSBzdHJlYW0uIFNvIEJ1ZmZlclNjaGVkdWxlciB3aWxsIGNhY2hlXG4gICAgICAgICAqIGRhdGEgcmVjZWl2ZWQgZnJvbSB0aGUgc3RyZWFtLCB3aGVuIGRhdGEgaW4gdW5yZXNvbHZlZERhdGFBcnJheSBleGNlZWRzIHRoZVxuICAgICAgICAgKiBibG9ja1NpemUgZGVmaW5lZCwgaXQgd2lsbCB0cnkgdG8gY29uY2F0IGEgYmxvY2tTaXplIG9mIGJ1ZmZlciwgZmlsbCBpbnRvIGF2YWlsYWJsZVxuICAgICAgICAgKiBidWZmZXJzIGZyb20gaW5jb21pbmcgYW5kIHB1c2ggdG8gb3V0Z29pbmcgYXJyYXkuXG4gICAgICAgICAqL1xuICAgICAgICB0aGlzLnVucmVzb2x2ZWREYXRhQXJyYXkgPSBbXTtcbiAgICAgICAgLyoqXG4gICAgICAgICAqIEhvdyBtdWNoIGRhdGEgY29uc2lzdGVkIGluIHVucmVzb2x2ZWREYXRhQXJyYXkuXG4gICAgICAgICAqL1xuICAgICAgICB0aGlzLnVucmVzb2x2ZWRMZW5ndGggPSAwO1xuICAgICAgICAvKipcbiAgICAgICAgICogVGhlIGFycmF5IGluY2x1ZGVzIGFsbCB0aGUgYXZhaWxhYmxlIGJ1ZmZlcnMgY2FuIGJlIHVzZWQgdG8gZmlsbCBkYXRhIGZyb20gc3RyZWFtLlxuICAgICAgICAgKi9cbiAgICAgICAgdGhpcy5pbmNvbWluZyA9IFtdO1xuICAgICAgICAvKipcbiAgICAgICAgICogVGhlIGFycmF5IChxdWV1ZSkgaW5jbHVkZXMgYWxsIHRoZSBidWZmZXJzIGZpbGxlZCBmcm9tIHN0cmVhbSBkYXRhLlxuICAgICAgICAgKi9cbiAgICAgICAgdGhpcy5vdXRnb2luZyA9IFtdO1xuICAgICAgICBpZiAoYnVmZmVyU2l6ZSA8PSAwKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgUmFuZ2VFcnJvcihgYnVmZmVyU2l6ZSBtdXN0IGJlIGxhcmdlciB0aGFuIDAsIGN1cnJlbnQgaXMgJHtidWZmZXJTaXplfWApO1xuICAgICAgICB9XG4gICAgICAgIGlmIChtYXhCdWZmZXJzIDw9IDApIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBSYW5nZUVycm9yKGBtYXhCdWZmZXJzIG11c3QgYmUgbGFyZ2VyIHRoYW4gMCwgY3VycmVudCBpcyAke21heEJ1ZmZlcnN9YCk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGNvbmN1cnJlbmN5IDw9IDApIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBSYW5nZUVycm9yKGBjb25jdXJyZW5jeSBtdXN0IGJlIGxhcmdlciB0aGFuIDAsIGN1cnJlbnQgaXMgJHtjb25jdXJyZW5jeX1gKTtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLmJ1ZmZlclNpemUgPSBidWZmZXJTaXplO1xuICAgICAgICB0aGlzLm1heEJ1ZmZlcnMgPSBtYXhCdWZmZXJzO1xuICAgICAgICB0aGlzLnJlYWRhYmxlID0gcmVhZGFibGU7XG4gICAgICAgIHRoaXMub3V0Z29pbmdIYW5kbGVyID0gb3V0Z29pbmdIYW5kbGVyO1xuICAgICAgICB0aGlzLmNvbmN1cnJlbmN5ID0gY29uY3VycmVuY3k7XG4gICAgICAgIHRoaXMuZW5jb2RpbmcgPSBlbmNvZGluZztcbiAgICB9XG4gICAgLyoqXG4gICAgICogU3RhcnQgdGhlIHNjaGVkdWxlciwgd2lsbCByZXR1cm4gZXJyb3Igd2hlbiBzdHJlYW0gb2YgYW55IG9mIHRoZSBvdXRnb2luZ0hhbmRsZXJzXG4gICAgICogcmV0dXJucyBlcnJvci5cbiAgICAgKlxuICAgICAqL1xuICAgIGFzeW5jIGRvKCkge1xuICAgICAgICByZXR1cm4gbmV3IFByb21pc2UoKHJlc29sdmUsIHJlamVjdCkgPT4ge1xuICAgICAgICAgICAgdGhpcy5yZWFkYWJsZS5vbihcImRhdGFcIiwgKGRhdGEpID0+IHtcbiAgICAgICAgICAgICAgICBkYXRhID0gdHlwZW9mIGRhdGEgPT09IFwic3RyaW5nXCIgPyBCdWZmZXIuZnJvbShkYXRhLCB0aGlzLmVuY29kaW5nKSA6IGRhdGE7XG4gICAgICAgICAgICAgICAgdGhpcy5hcHBlbmRVbnJlc29sdmVkRGF0YShkYXRhKTtcbiAgICAgICAgICAgICAgICBpZiAoIXRoaXMucmVzb2x2ZURhdGEoKSkge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLnJlYWRhYmxlLnBhdXNlKCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB0aGlzLnJlYWRhYmxlLm9uKFwiZXJyb3JcIiwgKGVycikgPT4ge1xuICAgICAgICAgICAgICAgIHRoaXMuZW1pdHRlci5lbWl0KFwiZXJyb3JcIiwgZXJyKTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgdGhpcy5yZWFkYWJsZS5vbihcImVuZFwiLCAoKSA9PiB7XG4gICAgICAgICAgICAgICAgdGhpcy5pc1N0cmVhbUVuZCA9IHRydWU7XG4gICAgICAgICAgICAgICAgdGhpcy5lbWl0dGVyLmVtaXQoXCJjaGVja0VuZFwiKTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgdGhpcy5lbWl0dGVyLm9uKFwiZXJyb3JcIiwgKGVycikgPT4ge1xuICAgICAgICAgICAgICAgIHRoaXMuaXNFcnJvciA9IHRydWU7XG4gICAgICAgICAgICAgICAgdGhpcy5yZWFkYWJsZS5wYXVzZSgpO1xuICAgICAgICAgICAgICAgIHJlamVjdChlcnIpO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB0aGlzLmVtaXR0ZXIub24oXCJjaGVja0VuZFwiLCAoKSA9PiB7XG4gICAgICAgICAgICAgICAgaWYgKHRoaXMub3V0Z29pbmcubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLnRyaWdnZXJPdXRnb2luZ0hhbmRsZXJzKCk7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgaWYgKHRoaXMuaXNTdHJlYW1FbmQgJiYgdGhpcy5leGVjdXRpbmdPdXRnb2luZ0hhbmRsZXJzID09PSAwKSB7XG4gICAgICAgICAgICAgICAgICAgIGlmICh0aGlzLnVucmVzb2x2ZWRMZW5ndGggPiAwICYmIHRoaXMudW5yZXNvbHZlZExlbmd0aCA8IHRoaXMuYnVmZmVyU2l6ZSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgYnVmZmVyID0gdGhpcy5zaGlmdEJ1ZmZlckZyb21VbnJlc29sdmVkRGF0YUFycmF5KCk7XG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLm91dGdvaW5nSGFuZGxlcigoKSA9PiBidWZmZXIuZ2V0UmVhZGFibGVTdHJlYW0oKSwgYnVmZmVyLnNpemUsIHRoaXMub2Zmc2V0KVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIC50aGVuKHJlc29sdmUpXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgLmNhdGNoKHJlamVjdCk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgZWxzZSBpZiAodGhpcy51bnJlc29sdmVkTGVuZ3RoID49IHRoaXMuYnVmZmVyU2l6ZSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgcmVzb2x2ZSgpO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSk7XG4gICAgICAgIH0pO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBJbnNlcnQgYSBuZXcgZGF0YSBpbnRvIHVucmVzb2x2ZWQgYXJyYXkuXG4gICAgICpcbiAgICAgKiBAcGFyYW0gZGF0YSAtXG4gICAgICovXG4gICAgYXBwZW5kVW5yZXNvbHZlZERhdGEoZGF0YSkge1xuICAgICAgICB0aGlzLnVucmVzb2x2ZWREYXRhQXJyYXkucHVzaChkYXRhKTtcbiAgICAgICAgdGhpcy51bnJlc29sdmVkTGVuZ3RoICs9IGRhdGEubGVuZ3RoO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBUcnkgdG8gc2hpZnQgYSBidWZmZXIgd2l0aCBzaXplIGluIGJsb2NrU2l6ZS4gVGhlIGJ1ZmZlciByZXR1cm5lZCBtYXkgYmUgbGVzc1xuICAgICAqIHRoYW4gYmxvY2tTaXplIHdoZW4gZGF0YSBpbiB1bnJlc29sdmVkRGF0YUFycmF5IGlzIGxlc3MgdGhhbiBidWZmZXJTaXplLlxuICAgICAqXG4gICAgICovXG4gICAgc2hpZnRCdWZmZXJGcm9tVW5yZXNvbHZlZERhdGFBcnJheShidWZmZXIpIHtcbiAgICAgICAgaWYgKCFidWZmZXIpIHtcbiAgICAgICAgICAgIGJ1ZmZlciA9IG5ldyBQb29sZWRCdWZmZXIodGhpcy5idWZmZXJTaXplLCB0aGlzLnVucmVzb2x2ZWREYXRhQXJyYXksIHRoaXMudW5yZXNvbHZlZExlbmd0aCk7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICBidWZmZXIuZmlsbCh0aGlzLnVucmVzb2x2ZWREYXRhQXJyYXksIHRoaXMudW5yZXNvbHZlZExlbmd0aCk7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy51bnJlc29sdmVkTGVuZ3RoIC09IGJ1ZmZlci5zaXplO1xuICAgICAgICByZXR1cm4gYnVmZmVyO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBSZXNvbHZlIGRhdGEgaW4gdW5yZXNvbHZlZERhdGFBcnJheS4gRm9yIGV2ZXJ5IGJ1ZmZlciB3aXRoIHNpemUgaW4gYmxvY2tTaXplXG4gICAgICogc2hpZnRlZCwgaXQgd2lsbCB0cnkgdG8gZ2V0IChvciBhbGxvY2F0ZSBhIGJ1ZmZlcikgZnJvbSBpbmNvbWluZywgYW5kIGZpbGwgaXQsXG4gICAgICogdGhlbiBwdXNoIGl0IGludG8gb3V0Z29pbmcgdG8gYmUgaGFuZGxlZCBieSBvdXRnb2luZyBoYW5kbGVyLlxuICAgICAqXG4gICAgICogUmV0dXJuIGZhbHNlIHdoZW4gYXZhaWxhYmxlIGJ1ZmZlcnMgaW4gaW5jb21pbmcgYXJlIG5vdCBlbm91Z2gsIGVsc2UgdHJ1ZS5cbiAgICAgKlxuICAgICAqIEByZXR1cm5zIFJldHVybiBmYWxzZSB3aGVuIGJ1ZmZlcnMgaW4gaW5jb21pbmcgYXJlIG5vdCBlbm91Z2gsIGVsc2UgdHJ1ZS5cbiAgICAgKi9cbiAgICByZXNvbHZlRGF0YSgpIHtcbiAgICAgICAgd2hpbGUgKHRoaXMudW5yZXNvbHZlZExlbmd0aCA+PSB0aGlzLmJ1ZmZlclNpemUpIHtcbiAgICAgICAgICAgIGxldCBidWZmZXI7XG4gICAgICAgICAgICBpZiAodGhpcy5pbmNvbWluZy5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgICAgICAgYnVmZmVyID0gdGhpcy5pbmNvbWluZy5zaGlmdCgpO1xuICAgICAgICAgICAgICAgIHRoaXMuc2hpZnRCdWZmZXJGcm9tVW5yZXNvbHZlZERhdGFBcnJheShidWZmZXIpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgaWYgKHRoaXMubnVtQnVmZmVycyA8IHRoaXMubWF4QnVmZmVycykge1xuICAgICAgICAgICAgICAgICAgICBidWZmZXIgPSB0aGlzLnNoaWZ0QnVmZmVyRnJvbVVucmVzb2x2ZWREYXRhQXJyYXkoKTtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5udW1CdWZmZXJzKys7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAvLyBObyBhdmFpbGFibGUgYnVmZmVyLCB3YWl0IGZvciBidWZmZXIgcmV0dXJuZWRcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHRoaXMub3V0Z29pbmcucHVzaChidWZmZXIpO1xuICAgICAgICAgICAgdGhpcy50cmlnZ2VyT3V0Z29pbmdIYW5kbGVycygpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBUcnkgdG8gdHJpZ2dlciBhIG91dGdvaW5nIGhhbmRsZXIgZm9yIGV2ZXJ5IGJ1ZmZlciBpbiBvdXRnb2luZy4gU3RvcCB3aGVuXG4gICAgICogY29uY3VycmVuY3kgcmVhY2hlcy5cbiAgICAgKi9cbiAgICBhc3luYyB0cmlnZ2VyT3V0Z29pbmdIYW5kbGVycygpIHtcbiAgICAgICAgbGV0IGJ1ZmZlcjtcbiAgICAgICAgZG8ge1xuICAgICAgICAgICAgaWYgKHRoaXMuZXhlY3V0aW5nT3V0Z29pbmdIYW5kbGVycyA+PSB0aGlzLmNvbmN1cnJlbmN5KSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgYnVmZmVyID0gdGhpcy5vdXRnb2luZy5zaGlmdCgpO1xuICAgICAgICAgICAgaWYgKGJ1ZmZlcikge1xuICAgICAgICAgICAgICAgIHRoaXMudHJpZ2dlck91dGdvaW5nSGFuZGxlcihidWZmZXIpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9IHdoaWxlIChidWZmZXIpO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBUcmlnZ2VyIGEgb3V0Z29pbmcgaGFuZGxlciBmb3IgYSBidWZmZXIgc2hpZnRlZCBmcm9tIG91dGdvaW5nLlxuICAgICAqXG4gICAgICogQHBhcmFtIGJ1ZmZlciAtXG4gICAgICovXG4gICAgYXN5bmMgdHJpZ2dlck91dGdvaW5nSGFuZGxlcihidWZmZXIpIHtcbiAgICAgICAgY29uc3QgYnVmZmVyTGVuZ3RoID0gYnVmZmVyLnNpemU7XG4gICAgICAgIHRoaXMuZXhlY3V0aW5nT3V0Z29pbmdIYW5kbGVycysrO1xuICAgICAgICB0aGlzLm9mZnNldCArPSBidWZmZXJMZW5ndGg7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgICBhd2FpdCB0aGlzLm91dGdvaW5nSGFuZGxlcigoKSA9PiBidWZmZXIuZ2V0UmVhZGFibGVTdHJlYW0oKSwgYnVmZmVyTGVuZ3RoLCB0aGlzLm9mZnNldCAtIGJ1ZmZlckxlbmd0aCk7XG4gICAgICAgIH1cbiAgICAgICAgY2F0Y2ggKGVycikge1xuICAgICAgICAgICAgdGhpcy5lbWl0dGVyLmVtaXQoXCJlcnJvclwiLCBlcnIpO1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMuZXhlY3V0aW5nT3V0Z29pbmdIYW5kbGVycy0tO1xuICAgICAgICB0aGlzLnJldXNlQnVmZmVyKGJ1ZmZlcik7XG4gICAgICAgIHRoaXMuZW1pdHRlci5lbWl0KFwiY2hlY2tFbmRcIik7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIFJldHVybiBidWZmZXIgdXNlZCBieSBvdXRnb2luZyBoYW5kbGVyIGludG8gaW5jb21pbmcuXG4gICAgICpcbiAgICAgKiBAcGFyYW0gYnVmZmVyIC1cbiAgICAgKi9cbiAgICByZXVzZUJ1ZmZlcihidWZmZXIpIHtcbiAgICAgICAgdGhpcy5pbmNvbWluZy5wdXNoKGJ1ZmZlcik7XG4gICAgICAgIGlmICghdGhpcy5pc0Vycm9yICYmIHRoaXMucmVzb2x2ZURhdGEoKSAmJiAhdGhpcy5pc1N0cmVhbUVuZCkge1xuICAgICAgICAgICAgdGhpcy5yZWFkYWJsZS5yZXN1bWUoKTtcbiAgICAgICAgfVxuICAgIH1cbn1cblxuLy8gQ29weXJpZ2h0IChjKSBNaWNyb3NvZnQgQ29ycG9yYXRpb24uXG4vLyBMaWNlbnNlZCB1bmRlciB0aGUgTUlUIExpY2Vuc2UuXG4vKipcbiAqIFJlYWRzIGEgcmVhZGFibGUgc3RyZWFtIGludG8gYnVmZmVyLiBGaWxsIHRoZSBidWZmZXIgZnJvbSBvZmZzZXQgdG8gZW5kLlxuICpcbiAqIEBwYXJhbSBzdHJlYW0gLSBBIE5vZGUuanMgUmVhZGFibGUgc3RyZWFtXG4gKiBAcGFyYW0gYnVmZmVyIC0gQnVmZmVyIHRvIGJlIGZpbGxlZCwgbGVuZ3RoIG11c3QgZ3JlYXRlciB0aGFuIG9yIGVxdWFsIHRvIG9mZnNldFxuICogQHBhcmFtIG9mZnNldCAtIEZyb20gd2hpY2ggcG9zaXRpb24gaW4gdGhlIGJ1ZmZlciB0byBiZSBmaWxsZWQsIGluY2x1c2l2ZVxuICogQHBhcmFtIGVuZCAtIFRvIHdoaWNoIHBvc2l0aW9uIGluIHRoZSBidWZmZXIgdG8gYmUgZmlsbGVkLCBleGNsdXNpdmVcbiAqIEBwYXJhbSBlbmNvZGluZyAtIEVuY29kaW5nIG9mIHRoZSBSZWFkYWJsZSBzdHJlYW1cbiAqL1xuYXN5bmMgZnVuY3Rpb24gc3RyZWFtVG9CdWZmZXIoc3RyZWFtLCBidWZmZXIsIG9mZnNldCwgZW5kLCBlbmNvZGluZykge1xuICAgIGxldCBwb3MgPSAwOyAvLyBQb3NpdGlvbiBpbiBzdHJlYW1cbiAgICBjb25zdCBjb3VudCA9IGVuZCAtIG9mZnNldDsgLy8gVG90YWwgYW1vdW50IG9mIGRhdGEgbmVlZGVkIGluIHN0cmVhbVxuICAgIHJldHVybiBuZXcgUHJvbWlzZSgocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XG4gICAgICAgIGNvbnN0IHRpbWVvdXQgPSBzZXRUaW1lb3V0KCgpID0+IHJlamVjdChuZXcgRXJyb3IoYFRoZSBvcGVyYXRpb24gY2Fubm90IGJlIGNvbXBsZXRlZCBpbiB0aW1lb3V0LmApKSwgUkVRVUVTVF9USU1FT1VUKTtcbiAgICAgICAgc3RyZWFtLm9uKFwicmVhZGFibGVcIiwgKCkgPT4ge1xuICAgICAgICAgICAgaWYgKHBvcyA+PSBjb3VudCkge1xuICAgICAgICAgICAgICAgIGNsZWFyVGltZW91dCh0aW1lb3V0KTtcbiAgICAgICAgICAgICAgICByZXNvbHZlKCk7XG4gICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgbGV0IGNodW5rID0gc3RyZWFtLnJlYWQoKTtcbiAgICAgICAgICAgIGlmICghY2h1bmspIHtcbiAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAodHlwZW9mIGNodW5rID09PSBcInN0cmluZ1wiKSB7XG4gICAgICAgICAgICAgICAgY2h1bmsgPSBCdWZmZXIuZnJvbShjaHVuaywgZW5jb2RpbmcpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgLy8gSG93IG11Y2ggZGF0YSBuZWVkZWQgaW4gdGhpcyBjaHVua1xuICAgICAgICAgICAgY29uc3QgY2h1bmtMZW5ndGggPSBwb3MgKyBjaHVuay5sZW5ndGggPiBjb3VudCA/IGNvdW50IC0gcG9zIDogY2h1bmsubGVuZ3RoO1xuICAgICAgICAgICAgYnVmZmVyLmZpbGwoY2h1bmsuc2xpY2UoMCwgY2h1bmtMZW5ndGgpLCBvZmZzZXQgKyBwb3MsIG9mZnNldCArIHBvcyArIGNodW5rTGVuZ3RoKTtcbiAgICAgICAgICAgIHBvcyArPSBjaHVua0xlbmd0aDtcbiAgICAgICAgfSk7XG4gICAgICAgIHN0cmVhbS5vbihcImVuZFwiLCAoKSA9PiB7XG4gICAgICAgICAgICBjbGVhclRpbWVvdXQodGltZW91dCk7XG4gICAgICAgICAgICBpZiAocG9zIDwgY291bnQpIHtcbiAgICAgICAgICAgICAgICByZWplY3QobmV3IEVycm9yKGBTdHJlYW0gZHJhaW5zIGJlZm9yZSBnZXR0aW5nIGVub3VnaCBkYXRhIG5lZWRlZC4gRGF0YSByZWFkOiAke3Bvc30sIGRhdGEgbmVlZDogJHtjb3VudH1gKSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXNvbHZlKCk7XG4gICAgICAgIH0pO1xuICAgICAgICBzdHJlYW0ub24oXCJlcnJvclwiLCAobXNnKSA9PiB7XG4gICAgICAgICAgICBjbGVhclRpbWVvdXQodGltZW91dCk7XG4gICAgICAgICAgICByZWplY3QobXNnKTtcbiAgICAgICAgfSk7XG4gICAgfSk7XG59XG4vKipcbiAqIFJlYWRzIGEgcmVhZGFibGUgc3RyZWFtIGludG8gYnVmZmVyIGVudGlyZWx5LlxuICpcbiAqIEBwYXJhbSBzdHJlYW0gLSBBIE5vZGUuanMgUmVhZGFibGUgc3RyZWFtXG4gKiBAcGFyYW0gYnVmZmVyIC0gQnVmZmVyIHRvIGJlIGZpbGxlZCwgbGVuZ3RoIG11c3QgZ3JlYXRlciB0aGFuIG9yIGVxdWFsIHRvIG9mZnNldFxuICogQHBhcmFtIGVuY29kaW5nIC0gRW5jb2Rpbmcgb2YgdGhlIFJlYWRhYmxlIHN0cmVhbVxuICogQHJldHVybnMgd2l0aCB0aGUgY291bnQgb2YgYnl0ZXMgcmVhZC5cbiAqIEB0aHJvd3MgYFJhbmdlRXJyb3JgIElmIGJ1ZmZlciBzaXplIGlzIG5vdCBiaWcgZW5vdWdoLlxuICovXG5hc3luYyBmdW5jdGlvbiBzdHJlYW1Ub0J1ZmZlcjIoc3RyZWFtLCBidWZmZXIsIGVuY29kaW5nKSB7XG4gICAgbGV0IHBvcyA9IDA7IC8vIFBvc2l0aW9uIGluIHN0cmVhbVxuICAgIGNvbnN0IGJ1ZmZlclNpemUgPSBidWZmZXIubGVuZ3RoO1xuICAgIHJldHVybiBuZXcgUHJvbWlzZSgocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XG4gICAgICAgIHN0cmVhbS5vbihcInJlYWRhYmxlXCIsICgpID0+IHtcbiAgICAgICAgICAgIGxldCBjaHVuayA9IHN0cmVhbS5yZWFkKCk7XG4gICAgICAgICAgICBpZiAoIWNodW5rKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKHR5cGVvZiBjaHVuayA9PT0gXCJzdHJpbmdcIikge1xuICAgICAgICAgICAgICAgIGNodW5rID0gQnVmZmVyLmZyb20oY2h1bmssIGVuY29kaW5nKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmIChwb3MgKyBjaHVuay5sZW5ndGggPiBidWZmZXJTaXplKSB7XG4gICAgICAgICAgICAgICAgcmVqZWN0KG5ldyBFcnJvcihgU3RyZWFtIGV4Y2VlZHMgYnVmZmVyIHNpemUuIEJ1ZmZlciBzaXplOiAke2J1ZmZlclNpemV9YCkpO1xuICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGJ1ZmZlci5maWxsKGNodW5rLCBwb3MsIHBvcyArIGNodW5rLmxlbmd0aCk7XG4gICAgICAgICAgICBwb3MgKz0gY2h1bmsubGVuZ3RoO1xuICAgICAgICB9KTtcbiAgICAgICAgc3RyZWFtLm9uKFwiZW5kXCIsICgpID0+IHtcbiAgICAgICAgICAgIHJlc29sdmUocG9zKTtcbiAgICAgICAgfSk7XG4gICAgICAgIHN0cmVhbS5vbihcImVycm9yXCIsIHJlamVjdCk7XG4gICAgfSk7XG59XG4vKipcbiAqIE9OTFkgQVZBSUxBQkxFIElOIE5PREUuSlMgUlVOVElNRS5cbiAqXG4gKiBXcml0ZXMgdGhlIGNvbnRlbnQgb2YgYSByZWFkc3RyZWFtIHRvIGEgbG9jYWwgZmlsZS4gUmV0dXJucyBhIFByb21pc2Ugd2hpY2ggaXMgY29tcGxldGVkIGFmdGVyIHRoZSBmaWxlIGhhbmRsZSBpcyBjbG9zZWQuXG4gKlxuICogQHBhcmFtIHJzIC0gVGhlIHJlYWQgc3RyZWFtLlxuICogQHBhcmFtIGZpbGUgLSBEZXN0aW5hdGlvbiBmaWxlIHBhdGguXG4gKi9cbmFzeW5jIGZ1bmN0aW9uIHJlYWRTdHJlYW1Ub0xvY2FsRmlsZShycywgZmlsZSkge1xuICAgIHJldHVybiBuZXcgUHJvbWlzZSgocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XG4gICAgICAgIGNvbnN0IHdzID0gZnNfX25hbWVzcGFjZS5jcmVhdGVXcml0ZVN0cmVhbShmaWxlKTtcbiAgICAgICAgcnMub24oXCJlcnJvclwiLCAoZXJyKSA9PiB7XG4gICAgICAgICAgICByZWplY3QoZXJyKTtcbiAgICAgICAgfSk7XG4gICAgICAgIHdzLm9uKFwiZXJyb3JcIiwgKGVycikgPT4ge1xuICAgICAgICAgICAgcmVqZWN0KGVycik7XG4gICAgICAgIH0pO1xuICAgICAgICB3cy5vbihcImNsb3NlXCIsIHJlc29sdmUpO1xuICAgICAgICBycy5waXBlKHdzKTtcbiAgICB9KTtcbn1cbi8qKlxuICogT05MWSBBVkFJTEFCTEUgSU4gTk9ERS5KUyBSVU5USU1FLlxuICpcbiAqIFByb21pc2lmaWVkIHZlcnNpb24gb2YgZnMuc3RhdCgpLlxuICovXG5jb25zdCBmc1N0YXQgPSB1dGlsX19uYW1lc3BhY2UucHJvbWlzaWZ5KGZzX19uYW1lc3BhY2Uuc3RhdCk7XG5jb25zdCBmc0NyZWF0ZVJlYWRTdHJlYW0gPSBmc19fbmFtZXNwYWNlLmNyZWF0ZVJlYWRTdHJlYW07XG5cbi8vIENvcHlyaWdodCAoYykgTWljcm9zb2Z0IENvcnBvcmF0aW9uLlxuLy8gTGljZW5zZWQgdW5kZXIgdGhlIE1JVCBMaWNlbnNlLlxuLyoqXG4gKiBBIEJsb2JDbGllbnQgcmVwcmVzZW50cyBhIFVSTCB0byBhbiBBenVyZSBTdG9yYWdlIGJsb2I7IHRoZSBibG9iIG1heSBiZSBhIGJsb2NrIGJsb2IsXG4gKiBhcHBlbmQgYmxvYiwgb3IgcGFnZSBibG9iLlxuICovXG5jbGFzcyBCbG9iQ2xpZW50IGV4dGVuZHMgU3RvcmFnZUNsaWVudCB7XG4gICAgLyoqXG4gICAgICogVGhlIG5hbWUgb2YgdGhlIGJsb2IuXG4gICAgICovXG4gICAgZ2V0IG5hbWUoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLl9uYW1lO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBUaGUgbmFtZSBvZiB0aGUgc3RvcmFnZSBjb250YWluZXIgdGhlIGJsb2IgaXMgYXNzb2NpYXRlZCB3aXRoLlxuICAgICAqL1xuICAgIGdldCBjb250YWluZXJOYW1lKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5fY29udGFpbmVyTmFtZTtcbiAgICB9XG4gICAgY29uc3RydWN0b3IodXJsT3JDb25uZWN0aW9uU3RyaW5nLCBjcmVkZW50aWFsT3JQaXBlbGluZU9yQ29udGFpbmVyTmFtZSwgYmxvYk5hbWVPck9wdGlvbnMsIFxuICAgIC8vIExlZ2FjeSwgbm8gZml4IGZvciBlc2xpbnQgZXJyb3Igd2l0aG91dCBicmVha2luZy4gRGlzYWJsZSBpdCBmb3IgdGhpcyBpbnRlcmZhY2UuXG4gICAgLyogZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEBhenVyZS9henVyZS1zZGsvdHMtbmFtaW5nLW9wdGlvbnMqL1xuICAgIG9wdGlvbnMpIHtcbiAgICAgICAgb3B0aW9ucyA9IG9wdGlvbnMgfHwge307XG4gICAgICAgIGxldCBwaXBlbGluZTtcbiAgICAgICAgbGV0IHVybDtcbiAgICAgICAgaWYgKGlzUGlwZWxpbmVMaWtlKGNyZWRlbnRpYWxPclBpcGVsaW5lT3JDb250YWluZXJOYW1lKSkge1xuICAgICAgICAgICAgLy8gKHVybDogc3RyaW5nLCBwaXBlbGluZTogUGlwZWxpbmUpXG4gICAgICAgICAgICB1cmwgPSB1cmxPckNvbm5lY3Rpb25TdHJpbmc7XG4gICAgICAgICAgICBwaXBlbGluZSA9IGNyZWRlbnRpYWxPclBpcGVsaW5lT3JDb250YWluZXJOYW1lO1xuICAgICAgICB9XG4gICAgICAgIGVsc2UgaWYgKChjb3JlVXRpbC5pc05vZGUgJiYgY3JlZGVudGlhbE9yUGlwZWxpbmVPckNvbnRhaW5lck5hbWUgaW5zdGFuY2VvZiBTdG9yYWdlU2hhcmVkS2V5Q3JlZGVudGlhbCkgfHxcbiAgICAgICAgICAgIGNyZWRlbnRpYWxPclBpcGVsaW5lT3JDb250YWluZXJOYW1lIGluc3RhbmNlb2YgQW5vbnltb3VzQ3JlZGVudGlhbCB8fFxuICAgICAgICAgICAgY29yZUF1dGguaXNUb2tlbkNyZWRlbnRpYWwoY3JlZGVudGlhbE9yUGlwZWxpbmVPckNvbnRhaW5lck5hbWUpKSB7XG4gICAgICAgICAgICAvLyAodXJsOiBzdHJpbmcsIGNyZWRlbnRpYWw/OiBTdG9yYWdlU2hhcmVkS2V5Q3JlZGVudGlhbCB8IEFub255bW91c0NyZWRlbnRpYWwgfCBUb2tlbkNyZWRlbnRpYWwsIG9wdGlvbnM/OiBTdG9yYWdlUGlwZWxpbmVPcHRpb25zKVxuICAgICAgICAgICAgdXJsID0gdXJsT3JDb25uZWN0aW9uU3RyaW5nO1xuICAgICAgICAgICAgb3B0aW9ucyA9IGJsb2JOYW1lT3JPcHRpb25zO1xuICAgICAgICAgICAgcGlwZWxpbmUgPSBuZXdQaXBlbGluZShjcmVkZW50aWFsT3JQaXBlbGluZU9yQ29udGFpbmVyTmFtZSwgb3B0aW9ucyk7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSBpZiAoIWNyZWRlbnRpYWxPclBpcGVsaW5lT3JDb250YWluZXJOYW1lICYmXG4gICAgICAgICAgICB0eXBlb2YgY3JlZGVudGlhbE9yUGlwZWxpbmVPckNvbnRhaW5lck5hbWUgIT09IFwic3RyaW5nXCIpIHtcbiAgICAgICAgICAgIC8vICh1cmw6IHN0cmluZywgY3JlZGVudGlhbD86IFN0b3JhZ2VTaGFyZWRLZXlDcmVkZW50aWFsIHwgQW5vbnltb3VzQ3JlZGVudGlhbCB8IFRva2VuQ3JlZGVudGlhbCwgb3B0aW9ucz86IFN0b3JhZ2VQaXBlbGluZU9wdGlvbnMpXG4gICAgICAgICAgICAvLyBUaGUgc2Vjb25kIHBhcmFtZXRlciBpcyB1bmRlZmluZWQuIFVzZSBhbm9ueW1vdXMgY3JlZGVudGlhbC5cbiAgICAgICAgICAgIHVybCA9IHVybE9yQ29ubmVjdGlvblN0cmluZztcbiAgICAgICAgICAgIGlmIChibG9iTmFtZU9yT3B0aW9ucyAmJiB0eXBlb2YgYmxvYk5hbWVPck9wdGlvbnMgIT09IFwic3RyaW5nXCIpIHtcbiAgICAgICAgICAgICAgICBvcHRpb25zID0gYmxvYk5hbWVPck9wdGlvbnM7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBwaXBlbGluZSA9IG5ld1BpcGVsaW5lKG5ldyBBbm9ueW1vdXNDcmVkZW50aWFsKCksIG9wdGlvbnMpO1xuICAgICAgICB9XG4gICAgICAgIGVsc2UgaWYgKGNyZWRlbnRpYWxPclBpcGVsaW5lT3JDb250YWluZXJOYW1lICYmXG4gICAgICAgICAgICB0eXBlb2YgY3JlZGVudGlhbE9yUGlwZWxpbmVPckNvbnRhaW5lck5hbWUgPT09IFwic3RyaW5nXCIgJiZcbiAgICAgICAgICAgIGJsb2JOYW1lT3JPcHRpb25zICYmXG4gICAgICAgICAgICB0eXBlb2YgYmxvYk5hbWVPck9wdGlvbnMgPT09IFwic3RyaW5nXCIpIHtcbiAgICAgICAgICAgIC8vIChjb25uZWN0aW9uU3RyaW5nOiBzdHJpbmcsIGNvbnRhaW5lck5hbWU6IHN0cmluZywgYmxvYk5hbWU6IHN0cmluZywgb3B0aW9ucz86IFN0b3JhZ2VQaXBlbGluZU9wdGlvbnMpXG4gICAgICAgICAgICBjb25zdCBjb250YWluZXJOYW1lID0gY3JlZGVudGlhbE9yUGlwZWxpbmVPckNvbnRhaW5lck5hbWU7XG4gICAgICAgICAgICBjb25zdCBibG9iTmFtZSA9IGJsb2JOYW1lT3JPcHRpb25zO1xuICAgICAgICAgICAgY29uc3QgZXh0cmFjdGVkQ3JlZHMgPSBleHRyYWN0Q29ubmVjdGlvblN0cmluZ1BhcnRzKHVybE9yQ29ubmVjdGlvblN0cmluZyk7XG4gICAgICAgICAgICBpZiAoZXh0cmFjdGVkQ3JlZHMua2luZCA9PT0gXCJBY2NvdW50Q29ublN0cmluZ1wiKSB7XG4gICAgICAgICAgICAgICAgaWYgKGNvcmVVdGlsLmlzTm9kZSkge1xuICAgICAgICAgICAgICAgICAgICBjb25zdCBzaGFyZWRLZXlDcmVkZW50aWFsID0gbmV3IFN0b3JhZ2VTaGFyZWRLZXlDcmVkZW50aWFsKGV4dHJhY3RlZENyZWRzLmFjY291bnROYW1lLCBleHRyYWN0ZWRDcmVkcy5hY2NvdW50S2V5KTtcbiAgICAgICAgICAgICAgICAgICAgdXJsID0gYXBwZW5kVG9VUkxQYXRoKGFwcGVuZFRvVVJMUGF0aChleHRyYWN0ZWRDcmVkcy51cmwsIGVuY29kZVVSSUNvbXBvbmVudChjb250YWluZXJOYW1lKSksIGVuY29kZVVSSUNvbXBvbmVudChibG9iTmFtZSkpO1xuICAgICAgICAgICAgICAgICAgICBpZiAoIW9wdGlvbnMucHJveHlPcHRpb25zKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBvcHRpb25zLnByb3h5T3B0aW9ucyA9IGNvcmVSZXN0UGlwZWxpbmUuZ2V0RGVmYXVsdFByb3h5U2V0dGluZ3MoZXh0cmFjdGVkQ3JlZHMucHJveHlVcmkpO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIHBpcGVsaW5lID0gbmV3UGlwZWxpbmUoc2hhcmVkS2V5Q3JlZGVudGlhbCwgb3B0aW9ucyk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJBY2NvdW50IGNvbm5lY3Rpb24gc3RyaW5nIGlzIG9ubHkgc3VwcG9ydGVkIGluIE5vZGUuanMgZW52aXJvbm1lbnRcIik7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSBpZiAoZXh0cmFjdGVkQ3JlZHMua2luZCA9PT0gXCJTQVNDb25uU3RyaW5nXCIpIHtcbiAgICAgICAgICAgICAgICB1cmwgPVxuICAgICAgICAgICAgICAgICAgICBhcHBlbmRUb1VSTFBhdGgoYXBwZW5kVG9VUkxQYXRoKGV4dHJhY3RlZENyZWRzLnVybCwgZW5jb2RlVVJJQ29tcG9uZW50KGNvbnRhaW5lck5hbWUpKSwgZW5jb2RlVVJJQ29tcG9uZW50KGJsb2JOYW1lKSkgK1xuICAgICAgICAgICAgICAgICAgICAgICAgXCI/XCIgK1xuICAgICAgICAgICAgICAgICAgICAgICAgZXh0cmFjdGVkQ3JlZHMuYWNjb3VudFNhcztcbiAgICAgICAgICAgICAgICBwaXBlbGluZSA9IG5ld1BpcGVsaW5lKG5ldyBBbm9ueW1vdXNDcmVkZW50aWFsKCksIG9wdGlvbnMpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwiQ29ubmVjdGlvbiBzdHJpbmcgbXVzdCBiZSBlaXRoZXIgYW4gQWNjb3VudCBjb25uZWN0aW9uIHN0cmluZyBvciBhIFNBUyBjb25uZWN0aW9uIHN0cmluZ1wiKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihcIkV4cGVjdGluZyBub24tZW1wdHkgc3RyaW5ncyBmb3IgY29udGFpbmVyTmFtZSBhbmQgYmxvYk5hbWUgcGFyYW1ldGVyc1wiKTtcbiAgICAgICAgfVxuICAgICAgICBzdXBlcih1cmwsIHBpcGVsaW5lKTtcbiAgICAgICAgKHsgYmxvYk5hbWU6IHRoaXMuX25hbWUsIGNvbnRhaW5lck5hbWU6IHRoaXMuX2NvbnRhaW5lck5hbWUgfSA9XG4gICAgICAgICAgICB0aGlzLmdldEJsb2JBbmRDb250YWluZXJOYW1lc0Zyb21VcmwoKSk7XG4gICAgICAgIHRoaXMuYmxvYkNvbnRleHQgPSB0aGlzLnN0b3JhZ2VDbGllbnRDb250ZXh0LmJsb2I7XG4gICAgICAgIHRoaXMuX3NuYXBzaG90ID0gZ2V0VVJMUGFyYW1ldGVyKHRoaXMudXJsLCBVUkxDb25zdGFudHMuUGFyYW1ldGVycy5TTkFQU0hPVCk7XG4gICAgICAgIHRoaXMuX3ZlcnNpb25JZCA9IGdldFVSTFBhcmFtZXRlcih0aGlzLnVybCwgVVJMQ29uc3RhbnRzLlBhcmFtZXRlcnMuVkVSU0lPTklEKTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogQ3JlYXRlcyBhIG5ldyBCbG9iQ2xpZW50IG9iamVjdCBpZGVudGljYWwgdG8gdGhlIHNvdXJjZSBidXQgd2l0aCB0aGUgc3BlY2lmaWVkIHNuYXBzaG90IHRpbWVzdGFtcC5cbiAgICAgKiBQcm92aWRlIFwiXCIgd2lsbCByZW1vdmUgdGhlIHNuYXBzaG90IGFuZCByZXR1cm4gYSBDbGllbnQgdG8gdGhlIGJhc2UgYmxvYi5cbiAgICAgKlxuICAgICAqIEBwYXJhbSBzbmFwc2hvdCAtIFRoZSBzbmFwc2hvdCB0aW1lc3RhbXAuXG4gICAgICogQHJldHVybnMgQSBuZXcgQmxvYkNsaWVudCBvYmplY3QgaWRlbnRpY2FsIHRvIHRoZSBzb3VyY2UgYnV0IHdpdGggdGhlIHNwZWNpZmllZCBzbmFwc2hvdCB0aW1lc3RhbXBcbiAgICAgKi9cbiAgICB3aXRoU25hcHNob3Qoc25hcHNob3QpIHtcbiAgICAgICAgcmV0dXJuIG5ldyBCbG9iQ2xpZW50KHNldFVSTFBhcmFtZXRlcih0aGlzLnVybCwgVVJMQ29uc3RhbnRzLlBhcmFtZXRlcnMuU05BUFNIT1QsIHNuYXBzaG90Lmxlbmd0aCA9PT0gMCA/IHVuZGVmaW5lZCA6IHNuYXBzaG90KSwgdGhpcy5waXBlbGluZSk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIENyZWF0ZXMgYSBuZXcgQmxvYkNsaWVudCBvYmplY3QgcG9pbnRpbmcgdG8gYSB2ZXJzaW9uIG9mIHRoaXMgYmxvYi5cbiAgICAgKiBQcm92aWRlIFwiXCIgd2lsbCByZW1vdmUgdGhlIHZlcnNpb25JZCBhbmQgcmV0dXJuIGEgQ2xpZW50IHRvIHRoZSBiYXNlIGJsb2IuXG4gICAgICpcbiAgICAgKiBAcGFyYW0gdmVyc2lvbklkIC0gVGhlIHZlcnNpb25JZC5cbiAgICAgKiBAcmV0dXJucyBBIG5ldyBCbG9iQ2xpZW50IG9iamVjdCBwb2ludGluZyB0byB0aGUgdmVyc2lvbiBvZiB0aGlzIGJsb2IuXG4gICAgICovXG4gICAgd2l0aFZlcnNpb24odmVyc2lvbklkKSB7XG4gICAgICAgIHJldHVybiBuZXcgQmxvYkNsaWVudChzZXRVUkxQYXJhbWV0ZXIodGhpcy51cmwsIFVSTENvbnN0YW50cy5QYXJhbWV0ZXJzLlZFUlNJT05JRCwgdmVyc2lvbklkLmxlbmd0aCA9PT0gMCA/IHVuZGVmaW5lZCA6IHZlcnNpb25JZCksIHRoaXMucGlwZWxpbmUpO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBDcmVhdGVzIGEgQXBwZW5kQmxvYkNsaWVudCBvYmplY3QuXG4gICAgICpcbiAgICAgKi9cbiAgICBnZXRBcHBlbmRCbG9iQ2xpZW50KCkge1xuICAgICAgICByZXR1cm4gbmV3IEFwcGVuZEJsb2JDbGllbnQodGhpcy51cmwsIHRoaXMucGlwZWxpbmUpO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBDcmVhdGVzIGEgQmxvY2tCbG9iQ2xpZW50IG9iamVjdC5cbiAgICAgKlxuICAgICAqL1xuICAgIGdldEJsb2NrQmxvYkNsaWVudCgpIHtcbiAgICAgICAgcmV0dXJuIG5ldyBCbG9ja0Jsb2JDbGllbnQodGhpcy51cmwsIHRoaXMucGlwZWxpbmUpO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBDcmVhdGVzIGEgUGFnZUJsb2JDbGllbnQgb2JqZWN0LlxuICAgICAqXG4gICAgICovXG4gICAgZ2V0UGFnZUJsb2JDbGllbnQoKSB7XG4gICAgICAgIHJldHVybiBuZXcgUGFnZUJsb2JDbGllbnQodGhpcy51cmwsIHRoaXMucGlwZWxpbmUpO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBSZWFkcyBvciBkb3dubG9hZHMgYSBibG9iIGZyb20gdGhlIHN5c3RlbSwgaW5jbHVkaW5nIGl0cyBtZXRhZGF0YSBhbmQgcHJvcGVydGllcy5cbiAgICAgKiBZb3UgY2FuIGFsc28gY2FsbCBHZXQgQmxvYiB0byByZWFkIGEgc25hcHNob3QuXG4gICAgICpcbiAgICAgKiAqIEluIE5vZGUuanMsIGRhdGEgcmV0dXJucyBpbiBhIFJlYWRhYmxlIHN0cmVhbSByZWFkYWJsZVN0cmVhbUJvZHlcbiAgICAgKiAqIEluIGJyb3dzZXJzLCBkYXRhIHJldHVybnMgaW4gYSBwcm9taXNlIGJsb2JCb2R5XG4gICAgICpcbiAgICAgKiBAc2VlIGh0dHBzOi8vZG9jcy5taWNyb3NvZnQuY29tL2VuLXVzL3Jlc3QvYXBpL3N0b3JhZ2VzZXJ2aWNlcy9nZXQtYmxvYlxuICAgICAqXG4gICAgICogQHBhcmFtIG9mZnNldCAtIEZyb20gd2hpY2ggcG9zaXRpb24gb2YgdGhlIGJsb2IgdG8gZG93bmxvYWQsIGdyZWF0ZXIgdGhhbiBvciBlcXVhbCB0byAwXG4gICAgICogQHBhcmFtIGNvdW50IC0gSG93IG11Y2ggZGF0YSB0byBiZSBkb3dubG9hZGVkLCBncmVhdGVyIHRoYW4gMC4gV2lsbCBkb3dubG9hZCB0byB0aGUgZW5kIHdoZW4gdW5kZWZpbmVkXG4gICAgICogQHBhcmFtIG9wdGlvbnMgLSBPcHRpb25hbCBvcHRpb25zIHRvIEJsb2IgRG93bmxvYWQgb3BlcmF0aW9uLlxuICAgICAqXG4gICAgICpcbiAgICAgKiBFeGFtcGxlIHVzYWdlIChOb2RlLmpzKTpcbiAgICAgKlxuICAgICAqIGBgYGpzXG4gICAgICogLy8gRG93bmxvYWQgYW5kIGNvbnZlcnQgYSBibG9iIHRvIGEgc3RyaW5nXG4gICAgICogY29uc3QgZG93bmxvYWRCbG9ja0Jsb2JSZXNwb25zZSA9IGF3YWl0IGJsb2JDbGllbnQuZG93bmxvYWQoKTtcbiAgICAgKiBjb25zdCBkb3dubG9hZGVkID0gYXdhaXQgc3RyZWFtVG9CdWZmZXIoZG93bmxvYWRCbG9ja0Jsb2JSZXNwb25zZS5yZWFkYWJsZVN0cmVhbUJvZHkpO1xuICAgICAqIGNvbnNvbGUubG9nKFwiRG93bmxvYWRlZCBibG9iIGNvbnRlbnQ6XCIsIGRvd25sb2FkZWQudG9TdHJpbmcoKSk7XG4gICAgICpcbiAgICAgKiBhc3luYyBmdW5jdGlvbiBzdHJlYW1Ub0J1ZmZlcihyZWFkYWJsZVN0cmVhbSkge1xuICAgICAqIHJldHVybiBuZXcgUHJvbWlzZSgocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XG4gICAgICogY29uc3QgY2h1bmtzID0gW107XG4gICAgICogcmVhZGFibGVTdHJlYW0ub24oXCJkYXRhXCIsIChkYXRhKSA9PiB7XG4gICAgICogY2h1bmtzLnB1c2goZGF0YSBpbnN0YW5jZW9mIEJ1ZmZlciA/IGRhdGEgOiBCdWZmZXIuZnJvbShkYXRhKSk7XG4gICAgICogfSk7XG4gICAgICogcmVhZGFibGVTdHJlYW0ub24oXCJlbmRcIiwgKCkgPT4ge1xuICAgICAqIHJlc29sdmUoQnVmZmVyLmNvbmNhdChjaHVua3MpKTtcbiAgICAgKiB9KTtcbiAgICAgKiByZWFkYWJsZVN0cmVhbS5vbihcImVycm9yXCIsIHJlamVjdCk7XG4gICAgICogfSk7XG4gICAgICogfVxuICAgICAqIGBgYFxuICAgICAqXG4gICAgICogRXhhbXBsZSB1c2FnZSAoYnJvd3Nlcik6XG4gICAgICpcbiAgICAgKiBgYGBqc1xuICAgICAqIC8vIERvd25sb2FkIGFuZCBjb252ZXJ0IGEgYmxvYiB0byBhIHN0cmluZ1xuICAgICAqIGNvbnN0IGRvd25sb2FkQmxvY2tCbG9iUmVzcG9uc2UgPSBhd2FpdCBibG9iQ2xpZW50LmRvd25sb2FkKCk7XG4gICAgICogY29uc3QgZG93bmxvYWRlZCA9IGF3YWl0IGJsb2JUb1N0cmluZyhhd2FpdCBkb3dubG9hZEJsb2NrQmxvYlJlc3BvbnNlLmJsb2JCb2R5KTtcbiAgICAgKiBjb25zb2xlLmxvZyhcbiAgICAgKiAgIFwiRG93bmxvYWRlZCBibG9iIGNvbnRlbnRcIixcbiAgICAgKiAgIGRvd25sb2FkZWRcbiAgICAgKiApO1xuICAgICAqXG4gICAgICogYXN5bmMgZnVuY3Rpb24gYmxvYlRvU3RyaW5nKGJsb2I6IEJsb2IpOiBQcm9taXNlPHN0cmluZz4ge1xuICAgICAqICAgY29uc3QgZmlsZVJlYWRlciA9IG5ldyBGaWxlUmVhZGVyKCk7XG4gICAgICogICByZXR1cm4gbmV3IFByb21pc2U8c3RyaW5nPigocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XG4gICAgICogICAgIGZpbGVSZWFkZXIub25sb2FkZW5kID0gKGV2OiBhbnkpID0+IHtcbiAgICAgKiAgICAgICByZXNvbHZlKGV2LnRhcmdldCEucmVzdWx0KTtcbiAgICAgKiAgICAgfTtcbiAgICAgKiAgICAgZmlsZVJlYWRlci5vbmVycm9yID0gcmVqZWN0O1xuICAgICAqICAgICBmaWxlUmVhZGVyLnJlYWRBc1RleHQoYmxvYik7XG4gICAgICogICB9KTtcbiAgICAgKiB9XG4gICAgICogYGBgXG4gICAgICovXG4gICAgYXN5bmMgZG93bmxvYWQob2Zmc2V0ID0gMCwgY291bnQsIG9wdGlvbnMgPSB7fSkge1xuICAgICAgICBvcHRpb25zLmNvbmRpdGlvbnMgPSBvcHRpb25zLmNvbmRpdGlvbnMgfHwge307XG4gICAgICAgIG9wdGlvbnMuY29uZGl0aW9ucyA9IG9wdGlvbnMuY29uZGl0aW9ucyB8fCB7fTtcbiAgICAgICAgZW5zdXJlQ3BrSWZTcGVjaWZpZWQob3B0aW9ucy5jdXN0b21lclByb3ZpZGVkS2V5LCB0aGlzLmlzSHR0cHMpO1xuICAgICAgICByZXR1cm4gdHJhY2luZ0NsaWVudC53aXRoU3BhbihcIkJsb2JDbGllbnQtZG93bmxvYWRcIiwgb3B0aW9ucywgYXN5bmMgKHVwZGF0ZWRPcHRpb25zKSA9PiB7XG4gICAgICAgICAgICB2YXIgX2E7XG4gICAgICAgICAgICBjb25zdCByZXMgPSBhc3NlcnRSZXNwb25zZShhd2FpdCB0aGlzLmJsb2JDb250ZXh0LmRvd25sb2FkKHtcbiAgICAgICAgICAgICAgICBhYm9ydFNpZ25hbDogb3B0aW9ucy5hYm9ydFNpZ25hbCxcbiAgICAgICAgICAgICAgICBsZWFzZUFjY2Vzc0NvbmRpdGlvbnM6IG9wdGlvbnMuY29uZGl0aW9ucyxcbiAgICAgICAgICAgICAgICBtb2RpZmllZEFjY2Vzc0NvbmRpdGlvbnM6IE9iamVjdC5hc3NpZ24oT2JqZWN0LmFzc2lnbih7fSwgb3B0aW9ucy5jb25kaXRpb25zKSwgeyBpZlRhZ3M6IChfYSA9IG9wdGlvbnMuY29uZGl0aW9ucykgPT09IG51bGwgfHwgX2EgPT09IHZvaWQgMCA/IHZvaWQgMCA6IF9hLnRhZ0NvbmRpdGlvbnMgfSksXG4gICAgICAgICAgICAgICAgcmVxdWVzdE9wdGlvbnM6IHtcbiAgICAgICAgICAgICAgICAgICAgb25Eb3dubG9hZFByb2dyZXNzOiBjb3JlVXRpbC5pc05vZGUgPyB1bmRlZmluZWQgOiBvcHRpb25zLm9uUHJvZ3Jlc3MsIC8vIGZvciBOb2RlLmpzLCBwcm9ncmVzcyBpcyByZXBvcnRlZCBieSBSZXRyaWFibGVSZWFkYWJsZVN0cmVhbVxuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgcmFuZ2U6IG9mZnNldCA9PT0gMCAmJiAhY291bnQgPyB1bmRlZmluZWQgOiByYW5nZVRvU3RyaW5nKHsgb2Zmc2V0LCBjb3VudCB9KSxcbiAgICAgICAgICAgICAgICByYW5nZUdldENvbnRlbnRNRDU6IG9wdGlvbnMucmFuZ2VHZXRDb250ZW50TUQ1LFxuICAgICAgICAgICAgICAgIHJhbmdlR2V0Q29udGVudENSQzY0OiBvcHRpb25zLnJhbmdlR2V0Q29udGVudENyYzY0LFxuICAgICAgICAgICAgICAgIHNuYXBzaG90OiBvcHRpb25zLnNuYXBzaG90LFxuICAgICAgICAgICAgICAgIGNwa0luZm86IG9wdGlvbnMuY3VzdG9tZXJQcm92aWRlZEtleSxcbiAgICAgICAgICAgICAgICB0cmFjaW5nT3B0aW9uczogdXBkYXRlZE9wdGlvbnMudHJhY2luZ09wdGlvbnMsXG4gICAgICAgICAgICB9KSk7XG4gICAgICAgICAgICBjb25zdCB3cmFwcGVkUmVzID0gT2JqZWN0LmFzc2lnbihPYmplY3QuYXNzaWduKHt9LCByZXMpLCB7IF9yZXNwb25zZTogcmVzLl9yZXNwb25zZSwgb2JqZWN0UmVwbGljYXRpb25EZXN0aW5hdGlvblBvbGljeUlkOiByZXMub2JqZWN0UmVwbGljYXRpb25Qb2xpY3lJZCwgb2JqZWN0UmVwbGljYXRpb25Tb3VyY2VQcm9wZXJ0aWVzOiBwYXJzZU9iamVjdFJlcGxpY2F0aW9uUmVjb3JkKHJlcy5vYmplY3RSZXBsaWNhdGlvblJ1bGVzKSB9KTtcbiAgICAgICAgICAgIC8vIFJldHVybiBicm93c2VyIHJlc3BvbnNlIGltbWVkaWF0ZWx5XG4gICAgICAgICAgICBpZiAoIWNvcmVVdGlsLmlzTm9kZSkge1xuICAgICAgICAgICAgICAgIHJldHVybiB3cmFwcGVkUmVzO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgLy8gV2Ugc3VwcG9ydCByZXRyeWluZyB3aGVuIGRvd25sb2FkIHN0cmVhbSB1bmV4cGVjdGVkIGVuZHMgaW4gTm9kZS5qcyBydW50aW1lXG4gICAgICAgICAgICAvLyBGb2xsb3dpbmcgY29kZSBzaG91bGRuJ3QgYmUgYnVuZGxlZCBpbnRvIGJyb3dzZXIgYnVpbGQsIGhvd2V2ZXIgc29tZVxuICAgICAgICAgICAgLy8gYnVuZGxlcnMgbWF5IHRyeSB0byBidW5kbGUgZm9sbG93aW5nIGNvZGUgYW5kIFwiRmlsZVJlYWRSZXNwb25zZS50c1wiLlxuICAgICAgICAgICAgLy8gSW4gdGhpcyBjYXNlLCBcIkZpbGVEb3dubG9hZFJlc3BvbnNlLmJyb3dzZXIudHNcIiB3aWxsIGJlIHVzZWQgYXMgYSBzaGltIG9mIFwiRmlsZURvd25sb2FkUmVzcG9uc2UudHNcIlxuICAgICAgICAgICAgLy8gVGhlIGNvbmZpZyBpcyBpbiBwYWNrYWdlLmpzb24gXCJicm93c2VyXCIgZmllbGRcbiAgICAgICAgICAgIGlmIChvcHRpb25zLm1heFJldHJ5UmVxdWVzdHMgPT09IHVuZGVmaW5lZCB8fCBvcHRpb25zLm1heFJldHJ5UmVxdWVzdHMgPCAwKSB7XG4gICAgICAgICAgICAgICAgLy8gVE9ETzogRGVmYXVsdCB2YWx1ZSBvciBtYWtlIGl0IGEgcmVxdWlyZWQgcGFyYW1ldGVyP1xuICAgICAgICAgICAgICAgIG9wdGlvbnMubWF4UmV0cnlSZXF1ZXN0cyA9IERFRkFVTFRfTUFYX0RPV05MT0FEX1JFVFJZX1JFUVVFU1RTO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKHJlcy5jb250ZW50TGVuZ3RoID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgICAgICB0aHJvdyBuZXcgUmFuZ2VFcnJvcihgRmlsZSBkb3dubG9hZCByZXNwb25zZSBkb2Vzbid0IGNvbnRhaW4gdmFsaWQgY29udGVudCBsZW5ndGggaGVhZGVyYCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAoIXJlcy5ldGFnKSB7XG4gICAgICAgICAgICAgICAgdGhyb3cgbmV3IFJhbmdlRXJyb3IoYEZpbGUgZG93bmxvYWQgcmVzcG9uc2UgZG9lc24ndCBjb250YWluIHZhbGlkIGV0YWcgaGVhZGVyYCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4gbmV3IEJsb2JEb3dubG9hZFJlc3BvbnNlKHdyYXBwZWRSZXMsIGFzeW5jIChzdGFydCkgPT4ge1xuICAgICAgICAgICAgICAgIHZhciBfYTtcbiAgICAgICAgICAgICAgICBjb25zdCB1cGRhdGVkRG93bmxvYWRPcHRpb25zID0ge1xuICAgICAgICAgICAgICAgICAgICBsZWFzZUFjY2Vzc0NvbmRpdGlvbnM6IG9wdGlvbnMuY29uZGl0aW9ucyxcbiAgICAgICAgICAgICAgICAgICAgbW9kaWZpZWRBY2Nlc3NDb25kaXRpb25zOiB7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZk1hdGNoOiBvcHRpb25zLmNvbmRpdGlvbnMuaWZNYXRjaCB8fCByZXMuZXRhZyxcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmTW9kaWZpZWRTaW5jZTogb3B0aW9ucy5jb25kaXRpb25zLmlmTW9kaWZpZWRTaW5jZSxcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmTm9uZU1hdGNoOiBvcHRpb25zLmNvbmRpdGlvbnMuaWZOb25lTWF0Y2gsXG4gICAgICAgICAgICAgICAgICAgICAgICBpZlVubW9kaWZpZWRTaW5jZTogb3B0aW9ucy5jb25kaXRpb25zLmlmVW5tb2RpZmllZFNpbmNlLFxuICAgICAgICAgICAgICAgICAgICAgICAgaWZUYWdzOiAoX2EgPSBvcHRpb25zLmNvbmRpdGlvbnMpID09PSBudWxsIHx8IF9hID09PSB2b2lkIDAgPyB2b2lkIDAgOiBfYS50YWdDb25kaXRpb25zLFxuICAgICAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgICAgICByYW5nZTogcmFuZ2VUb1N0cmluZyh7XG4gICAgICAgICAgICAgICAgICAgICAgICBjb3VudDogb2Zmc2V0ICsgcmVzLmNvbnRlbnRMZW5ndGggLSBzdGFydCxcbiAgICAgICAgICAgICAgICAgICAgICAgIG9mZnNldDogc3RhcnQsXG4gICAgICAgICAgICAgICAgICAgIH0pLFxuICAgICAgICAgICAgICAgICAgICByYW5nZUdldENvbnRlbnRNRDU6IG9wdGlvbnMucmFuZ2VHZXRDb250ZW50TUQ1LFxuICAgICAgICAgICAgICAgICAgICByYW5nZUdldENvbnRlbnRDUkM2NDogb3B0aW9ucy5yYW5nZUdldENvbnRlbnRDcmM2NCxcbiAgICAgICAgICAgICAgICAgICAgc25hcHNob3Q6IG9wdGlvbnMuc25hcHNob3QsXG4gICAgICAgICAgICAgICAgICAgIGNwa0luZm86IG9wdGlvbnMuY3VzdG9tZXJQcm92aWRlZEtleSxcbiAgICAgICAgICAgICAgICB9O1xuICAgICAgICAgICAgICAgIC8vIERlYnVnIHB1cnBvc2Ugb25seVxuICAgICAgICAgICAgICAgIC8vIGNvbnNvbGUubG9nKFxuICAgICAgICAgICAgICAgIC8vICAgYFJlYWQgZnJvbSBpbnRlcm5hbCBzdHJlYW0sIHJhbmdlOiAke1xuICAgICAgICAgICAgICAgIC8vICAgICB1cGRhdGVkT3B0aW9ucy5yYW5nZVxuICAgICAgICAgICAgICAgIC8vICAgfSwgb3B0aW9uczogJHtKU09OLnN0cmluZ2lmeSh1cGRhdGVkT3B0aW9ucyl9YFxuICAgICAgICAgICAgICAgIC8vICk7XG4gICAgICAgICAgICAgICAgcmV0dXJuIChhd2FpdCB0aGlzLmJsb2JDb250ZXh0LmRvd25sb2FkKE9iamVjdC5hc3NpZ24oeyBhYm9ydFNpZ25hbDogb3B0aW9ucy5hYm9ydFNpZ25hbCB9LCB1cGRhdGVkRG93bmxvYWRPcHRpb25zKSkpLnJlYWRhYmxlU3RyZWFtQm9keTtcbiAgICAgICAgICAgIH0sIG9mZnNldCwgcmVzLmNvbnRlbnRMZW5ndGgsIHtcbiAgICAgICAgICAgICAgICBtYXhSZXRyeVJlcXVlc3RzOiBvcHRpb25zLm1heFJldHJ5UmVxdWVzdHMsXG4gICAgICAgICAgICAgICAgb25Qcm9ncmVzczogb3B0aW9ucy5vblByb2dyZXNzLFxuICAgICAgICAgICAgfSk7XG4gICAgICAgIH0pO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBSZXR1cm5zIHRydWUgaWYgdGhlIEF6dXJlIGJsb2IgcmVzb3VyY2UgcmVwcmVzZW50ZWQgYnkgdGhpcyBjbGllbnQgZXhpc3RzOyBmYWxzZSBvdGhlcndpc2UuXG4gICAgICpcbiAgICAgKiBOT1RFOiB1c2UgdGhpcyBmdW5jdGlvbiB3aXRoIGNhcmUgc2luY2UgYW4gZXhpc3RpbmcgYmxvYiBtaWdodCBiZSBkZWxldGVkIGJ5IG90aGVyIGNsaWVudHMgb3JcbiAgICAgKiBhcHBsaWNhdGlvbnMuIFZpY2UgdmVyc2EgbmV3IGJsb2JzIG1pZ2h0IGJlIGFkZGVkIGJ5IG90aGVyIGNsaWVudHMgb3IgYXBwbGljYXRpb25zIGFmdGVyIHRoaXNcbiAgICAgKiBmdW5jdGlvbiBjb21wbGV0ZXMuXG4gICAgICpcbiAgICAgKiBAcGFyYW0gb3B0aW9ucyAtIG9wdGlvbnMgdG8gRXhpc3RzIG9wZXJhdGlvbi5cbiAgICAgKi9cbiAgICBhc3luYyBleGlzdHMob3B0aW9ucyA9IHt9KSB7XG4gICAgICAgIHJldHVybiB0cmFjaW5nQ2xpZW50LndpdGhTcGFuKFwiQmxvYkNsaWVudC1leGlzdHNcIiwgb3B0aW9ucywgYXN5bmMgKHVwZGF0ZWRPcHRpb25zKSA9PiB7XG4gICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgIGVuc3VyZUNwa0lmU3BlY2lmaWVkKG9wdGlvbnMuY3VzdG9tZXJQcm92aWRlZEtleSwgdGhpcy5pc0h0dHBzKTtcbiAgICAgICAgICAgICAgICBhd2FpdCB0aGlzLmdldFByb3BlcnRpZXMoe1xuICAgICAgICAgICAgICAgICAgICBhYm9ydFNpZ25hbDogb3B0aW9ucy5hYm9ydFNpZ25hbCxcbiAgICAgICAgICAgICAgICAgICAgY3VzdG9tZXJQcm92aWRlZEtleTogb3B0aW9ucy5jdXN0b21lclByb3ZpZGVkS2V5LFxuICAgICAgICAgICAgICAgICAgICBjb25kaXRpb25zOiBvcHRpb25zLmNvbmRpdGlvbnMsXG4gICAgICAgICAgICAgICAgICAgIHRyYWNpbmdPcHRpb25zOiB1cGRhdGVkT3B0aW9ucy50cmFjaW5nT3B0aW9ucyxcbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGNhdGNoIChlKSB7XG4gICAgICAgICAgICAgICAgaWYgKGUuc3RhdHVzQ29kZSA9PT0gNDA0KSB7XG4gICAgICAgICAgICAgICAgICAgIC8vIEV4cGVjdGVkIGV4Y2VwdGlvbiB3aGVuIGNoZWNraW5nIGJsb2IgZXhpc3RlbmNlXG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgZWxzZSBpZiAoZS5zdGF0dXNDb2RlID09PSA0MDkgJiZcbiAgICAgICAgICAgICAgICAgICAgKGUuZGV0YWlscy5lcnJvckNvZGUgPT09IEJsb2JVc2VzQ3VzdG9tZXJTcGVjaWZpZWRFbmNyeXB0aW9uTXNnIHx8XG4gICAgICAgICAgICAgICAgICAgICAgICBlLmRldGFpbHMuZXJyb3JDb2RlID09PSBCbG9iRG9lc05vdFVzZUN1c3RvbWVyU3BlY2lmaWVkRW5jcnlwdGlvbikpIHtcbiAgICAgICAgICAgICAgICAgICAgLy8gRXhwZWN0ZWQgZXhjZXB0aW9uIHdoZW4gY2hlY2tpbmcgYmxvYiBleGlzdGVuY2VcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHRocm93IGU7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBSZXR1cm5zIGFsbCB1c2VyLWRlZmluZWQgbWV0YWRhdGEsIHN0YW5kYXJkIEhUVFAgcHJvcGVydGllcywgYW5kIHN5c3RlbSBwcm9wZXJ0aWVzXG4gICAgICogZm9yIHRoZSBibG9iLiBJdCBkb2VzIG5vdCByZXR1cm4gdGhlIGNvbnRlbnQgb2YgdGhlIGJsb2IuXG4gICAgICogQHNlZSBodHRwczovL2RvY3MubWljcm9zb2Z0LmNvbS9lbi11cy9yZXN0L2FwaS9zdG9yYWdlc2VydmljZXMvZ2V0LWJsb2ItcHJvcGVydGllc1xuICAgICAqXG4gICAgICogV0FSTklORzogVGhlIGBtZXRhZGF0YWAgb2JqZWN0IHJldHVybmVkIGluIHRoZSByZXNwb25zZSB3aWxsIGhhdmUgaXRzIGtleXMgaW4gbG93ZXJjYXNlLCBldmVuIGlmXG4gICAgICogdGhleSBvcmlnaW5hbGx5IGNvbnRhaW5lZCB1cHBlcmNhc2UgY2hhcmFjdGVycy4gVGhpcyBkaWZmZXJzIGZyb20gdGhlIG1ldGFkYXRhIGtleXMgcmV0dXJuZWQgYnlcbiAgICAgKiB0aGUgbWV0aG9kcyBvZiB7QGxpbmsgQ29udGFpbmVyQ2xpZW50fSB0aGF0IGxpc3QgYmxvYnMgdXNpbmcgdGhlIGBpbmNsdWRlTWV0YWRhdGFgIG9wdGlvbiwgd2hpY2hcbiAgICAgKiB3aWxsIHJldGFpbiB0aGVpciBvcmlnaW5hbCBjYXNpbmcuXG4gICAgICpcbiAgICAgKiBAcGFyYW0gb3B0aW9ucyAtIE9wdGlvbmFsIG9wdGlvbnMgdG8gR2V0IFByb3BlcnRpZXMgb3BlcmF0aW9uLlxuICAgICAqL1xuICAgIGFzeW5jIGdldFByb3BlcnRpZXMob3B0aW9ucyA9IHt9KSB7XG4gICAgICAgIG9wdGlvbnMuY29uZGl0aW9ucyA9IG9wdGlvbnMuY29uZGl0aW9ucyB8fCB7fTtcbiAgICAgICAgZW5zdXJlQ3BrSWZTcGVjaWZpZWQob3B0aW9ucy5jdXN0b21lclByb3ZpZGVkS2V5LCB0aGlzLmlzSHR0cHMpO1xuICAgICAgICByZXR1cm4gdHJhY2luZ0NsaWVudC53aXRoU3BhbihcIkJsb2JDbGllbnQtZ2V0UHJvcGVydGllc1wiLCBvcHRpb25zLCBhc3luYyAodXBkYXRlZE9wdGlvbnMpID0+IHtcbiAgICAgICAgICAgIHZhciBfYTtcbiAgICAgICAgICAgIGNvbnN0IHJlcyA9IGFzc2VydFJlc3BvbnNlKGF3YWl0IHRoaXMuYmxvYkNvbnRleHQuZ2V0UHJvcGVydGllcyh7XG4gICAgICAgICAgICAgICAgYWJvcnRTaWduYWw6IG9wdGlvbnMuYWJvcnRTaWduYWwsXG4gICAgICAgICAgICAgICAgbGVhc2VBY2Nlc3NDb25kaXRpb25zOiBvcHRpb25zLmNvbmRpdGlvbnMsXG4gICAgICAgICAgICAgICAgbW9kaWZpZWRBY2Nlc3NDb25kaXRpb25zOiBPYmplY3QuYXNzaWduKE9iamVjdC5hc3NpZ24oe30sIG9wdGlvbnMuY29uZGl0aW9ucyksIHsgaWZUYWdzOiAoX2EgPSBvcHRpb25zLmNvbmRpdGlvbnMpID09PSBudWxsIHx8IF9hID09PSB2b2lkIDAgPyB2b2lkIDAgOiBfYS50YWdDb25kaXRpb25zIH0pLFxuICAgICAgICAgICAgICAgIGNwa0luZm86IG9wdGlvbnMuY3VzdG9tZXJQcm92aWRlZEtleSxcbiAgICAgICAgICAgICAgICB0cmFjaW5nT3B0aW9uczogdXBkYXRlZE9wdGlvbnMudHJhY2luZ09wdGlvbnMsXG4gICAgICAgICAgICB9KSk7XG4gICAgICAgICAgICByZXR1cm4gT2JqZWN0LmFzc2lnbihPYmplY3QuYXNzaWduKHt9LCByZXMpLCB7IF9yZXNwb25zZTogcmVzLl9yZXNwb25zZSwgb2JqZWN0UmVwbGljYXRpb25EZXN0aW5hdGlvblBvbGljeUlkOiByZXMub2JqZWN0UmVwbGljYXRpb25Qb2xpY3lJZCwgb2JqZWN0UmVwbGljYXRpb25Tb3VyY2VQcm9wZXJ0aWVzOiBwYXJzZU9iamVjdFJlcGxpY2F0aW9uUmVjb3JkKHJlcy5vYmplY3RSZXBsaWNhdGlvblJ1bGVzKSB9KTtcbiAgICAgICAgfSk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIE1hcmtzIHRoZSBzcGVjaWZpZWQgYmxvYiBvciBzbmFwc2hvdCBmb3IgZGVsZXRpb24uIFRoZSBibG9iIGlzIGxhdGVyIGRlbGV0ZWRcbiAgICAgKiBkdXJpbmcgZ2FyYmFnZSBjb2xsZWN0aW9uLiBOb3RlIHRoYXQgaW4gb3JkZXIgdG8gZGVsZXRlIGEgYmxvYiwgeW91IG11c3QgZGVsZXRlXG4gICAgICogYWxsIG9mIGl0cyBzbmFwc2hvdHMuIFlvdSBjYW4gZGVsZXRlIGJvdGggYXQgdGhlIHNhbWUgdGltZSB3aXRoIHRoZSBEZWxldGVcbiAgICAgKiBCbG9iIG9wZXJhdGlvbi5cbiAgICAgKiBAc2VlIGh0dHBzOi8vZG9jcy5taWNyb3NvZnQuY29tL2VuLXVzL3Jlc3QvYXBpL3N0b3JhZ2VzZXJ2aWNlcy9kZWxldGUtYmxvYlxuICAgICAqXG4gICAgICogQHBhcmFtIG9wdGlvbnMgLSBPcHRpb25hbCBvcHRpb25zIHRvIEJsb2IgRGVsZXRlIG9wZXJhdGlvbi5cbiAgICAgKi9cbiAgICBhc3luYyBkZWxldGUob3B0aW9ucyA9IHt9KSB7XG4gICAgICAgIG9wdGlvbnMuY29uZGl0aW9ucyA9IG9wdGlvbnMuY29uZGl0aW9ucyB8fCB7fTtcbiAgICAgICAgcmV0dXJuIHRyYWNpbmdDbGllbnQud2l0aFNwYW4oXCJCbG9iQ2xpZW50LWRlbGV0ZVwiLCBvcHRpb25zLCBhc3luYyAodXBkYXRlZE9wdGlvbnMpID0+IHtcbiAgICAgICAgICAgIHZhciBfYTtcbiAgICAgICAgICAgIHJldHVybiBhc3NlcnRSZXNwb25zZShhd2FpdCB0aGlzLmJsb2JDb250ZXh0LmRlbGV0ZSh7XG4gICAgICAgICAgICAgICAgYWJvcnRTaWduYWw6IG9wdGlvbnMuYWJvcnRTaWduYWwsXG4gICAgICAgICAgICAgICAgZGVsZXRlU25hcHNob3RzOiBvcHRpb25zLmRlbGV0ZVNuYXBzaG90cyxcbiAgICAgICAgICAgICAgICBsZWFzZUFjY2Vzc0NvbmRpdGlvbnM6IG9wdGlvbnMuY29uZGl0aW9ucyxcbiAgICAgICAgICAgICAgICBtb2RpZmllZEFjY2Vzc0NvbmRpdGlvbnM6IE9iamVjdC5hc3NpZ24oT2JqZWN0LmFzc2lnbih7fSwgb3B0aW9ucy5jb25kaXRpb25zKSwgeyBpZlRhZ3M6IChfYSA9IG9wdGlvbnMuY29uZGl0aW9ucykgPT09IG51bGwgfHwgX2EgPT09IHZvaWQgMCA/IHZvaWQgMCA6IF9hLnRhZ0NvbmRpdGlvbnMgfSksXG4gICAgICAgICAgICAgICAgdHJhY2luZ09wdGlvbnM6IHVwZGF0ZWRPcHRpb25zLnRyYWNpbmdPcHRpb25zLFxuICAgICAgICAgICAgfSkpO1xuICAgICAgICB9KTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogTWFya3MgdGhlIHNwZWNpZmllZCBibG9iIG9yIHNuYXBzaG90IGZvciBkZWxldGlvbiBpZiBpdCBleGlzdHMuIFRoZSBibG9iIGlzIGxhdGVyIGRlbGV0ZWRcbiAgICAgKiBkdXJpbmcgZ2FyYmFnZSBjb2xsZWN0aW9uLiBOb3RlIHRoYXQgaW4gb3JkZXIgdG8gZGVsZXRlIGEgYmxvYiwgeW91IG11c3QgZGVsZXRlXG4gICAgICogYWxsIG9mIGl0cyBzbmFwc2hvdHMuIFlvdSBjYW4gZGVsZXRlIGJvdGggYXQgdGhlIHNhbWUgdGltZSB3aXRoIHRoZSBEZWxldGVcbiAgICAgKiBCbG9iIG9wZXJhdGlvbi5cbiAgICAgKiBAc2VlIGh0dHBzOi8vZG9jcy5taWNyb3NvZnQuY29tL2VuLXVzL3Jlc3QvYXBpL3N0b3JhZ2VzZXJ2aWNlcy9kZWxldGUtYmxvYlxuICAgICAqXG4gICAgICogQHBhcmFtIG9wdGlvbnMgLSBPcHRpb25hbCBvcHRpb25zIHRvIEJsb2IgRGVsZXRlIG9wZXJhdGlvbi5cbiAgICAgKi9cbiAgICBhc3luYyBkZWxldGVJZkV4aXN0cyhvcHRpb25zID0ge30pIHtcbiAgICAgICAgcmV0dXJuIHRyYWNpbmdDbGllbnQud2l0aFNwYW4oXCJCbG9iQ2xpZW50LWRlbGV0ZUlmRXhpc3RzXCIsIG9wdGlvbnMsIGFzeW5jICh1cGRhdGVkT3B0aW9ucykgPT4ge1xuICAgICAgICAgICAgdmFyIF9hLCBfYjtcbiAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgY29uc3QgcmVzID0gYXNzZXJ0UmVzcG9uc2UoYXdhaXQgdGhpcy5kZWxldGUodXBkYXRlZE9wdGlvbnMpKTtcbiAgICAgICAgICAgICAgICByZXR1cm4gT2JqZWN0LmFzc2lnbihPYmplY3QuYXNzaWduKHsgc3VjY2VlZGVkOiB0cnVlIH0sIHJlcyksIHsgX3Jlc3BvbnNlOiByZXMuX3Jlc3BvbnNlIH0pO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgY2F0Y2ggKGUpIHtcbiAgICAgICAgICAgICAgICBpZiAoKChfYSA9IGUuZGV0YWlscykgPT09IG51bGwgfHwgX2EgPT09IHZvaWQgMCA/IHZvaWQgMCA6IF9hLmVycm9yQ29kZSkgPT09IFwiQmxvYk5vdEZvdW5kXCIpIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIE9iamVjdC5hc3NpZ24oT2JqZWN0LmFzc2lnbih7IHN1Y2NlZWRlZDogZmFsc2UgfSwgKF9iID0gZS5yZXNwb25zZSkgPT09IG51bGwgfHwgX2IgPT09IHZvaWQgMCA/IHZvaWQgMCA6IF9iLnBhcnNlZEhlYWRlcnMpLCB7IF9yZXNwb25zZTogZS5yZXNwb25zZSB9KTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgdGhyb3cgZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIFJlc3RvcmVzIHRoZSBjb250ZW50cyBhbmQgbWV0YWRhdGEgb2Ygc29mdCBkZWxldGVkIGJsb2IgYW5kIGFueSBhc3NvY2lhdGVkXG4gICAgICogc29mdCBkZWxldGVkIHNuYXBzaG90cy4gVW5kZWxldGUgQmxvYiBpcyBzdXBwb3J0ZWQgb25seSBvbiB2ZXJzaW9uIDIwMTctMDctMjlcbiAgICAgKiBvciBsYXRlci5cbiAgICAgKiBAc2VlIGh0dHBzOi8vZG9jcy5taWNyb3NvZnQuY29tL2VuLXVzL3Jlc3QvYXBpL3N0b3JhZ2VzZXJ2aWNlcy91bmRlbGV0ZS1ibG9iXG4gICAgICpcbiAgICAgKiBAcGFyYW0gb3B0aW9ucyAtIE9wdGlvbmFsIG9wdGlvbnMgdG8gQmxvYiBVbmRlbGV0ZSBvcGVyYXRpb24uXG4gICAgICovXG4gICAgYXN5bmMgdW5kZWxldGUob3B0aW9ucyA9IHt9KSB7XG4gICAgICAgIHJldHVybiB0cmFjaW5nQ2xpZW50LndpdGhTcGFuKFwiQmxvYkNsaWVudC11bmRlbGV0ZVwiLCBvcHRpb25zLCBhc3luYyAodXBkYXRlZE9wdGlvbnMpID0+IHtcbiAgICAgICAgICAgIHJldHVybiBhc3NlcnRSZXNwb25zZShhd2FpdCB0aGlzLmJsb2JDb250ZXh0LnVuZGVsZXRlKHtcbiAgICAgICAgICAgICAgICBhYm9ydFNpZ25hbDogb3B0aW9ucy5hYm9ydFNpZ25hbCxcbiAgICAgICAgICAgICAgICB0cmFjaW5nT3B0aW9uczogdXBkYXRlZE9wdGlvbnMudHJhY2luZ09wdGlvbnMsXG4gICAgICAgICAgICB9KSk7XG4gICAgICAgIH0pO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBTZXRzIHN5c3RlbSBwcm9wZXJ0aWVzIG9uIHRoZSBibG9iLlxuICAgICAqXG4gICAgICogSWYgbm8gdmFsdWUgcHJvdmlkZWQsIG9yIG5vIHZhbHVlIHByb3ZpZGVkIGZvciB0aGUgc3BlY2lmaWVkIGJsb2IgSFRUUCBoZWFkZXJzLFxuICAgICAqIHRoZXNlIGJsb2IgSFRUUCBoZWFkZXJzIHdpdGhvdXQgYSB2YWx1ZSB3aWxsIGJlIGNsZWFyZWQuXG4gICAgICogQHNlZSBodHRwczovL2RvY3MubWljcm9zb2Z0LmNvbS9lbi11cy9yZXN0L2FwaS9zdG9yYWdlc2VydmljZXMvc2V0LWJsb2ItcHJvcGVydGllc1xuICAgICAqXG4gICAgICogQHBhcmFtIGJsb2JIVFRQSGVhZGVycyAtIElmIG5vIHZhbHVlIHByb3ZpZGVkLCBvciBubyB2YWx1ZSBwcm92aWRlZCBmb3JcbiAgICAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoZSBzcGVjaWZpZWQgYmxvYiBIVFRQIGhlYWRlcnMsIHRoZXNlIGJsb2IgSFRUUFxuICAgICAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaGVhZGVycyB3aXRob3V0IGEgdmFsdWUgd2lsbCBiZSBjbGVhcmVkLlxuICAgICAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQSBjb21tb24gaGVhZGVyIHRvIHNldCBpcyBgYmxvYkNvbnRlbnRUeXBlYFxuICAgICAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZW5hYmxpbmcgdGhlIGJyb3dzZXIgdG8gcHJvdmlkZSBmdW5jdGlvbmFsaXR5XG4gICAgICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiYXNlZCBvbiBmaWxlIHR5cGUuXG4gICAgICogQHBhcmFtIG9wdGlvbnMgLSBPcHRpb25hbCBvcHRpb25zIHRvIEJsb2IgU2V0IEhUVFAgSGVhZGVycyBvcGVyYXRpb24uXG4gICAgICovXG4gICAgYXN5bmMgc2V0SFRUUEhlYWRlcnMoYmxvYkhUVFBIZWFkZXJzLCBvcHRpb25zID0ge30pIHtcbiAgICAgICAgb3B0aW9ucy5jb25kaXRpb25zID0gb3B0aW9ucy5jb25kaXRpb25zIHx8IHt9O1xuICAgICAgICBlbnN1cmVDcGtJZlNwZWNpZmllZChvcHRpb25zLmN1c3RvbWVyUHJvdmlkZWRLZXksIHRoaXMuaXNIdHRwcyk7XG4gICAgICAgIHJldHVybiB0cmFjaW5nQ2xpZW50LndpdGhTcGFuKFwiQmxvYkNsaWVudC1zZXRIVFRQSGVhZGVyc1wiLCBvcHRpb25zLCBhc3luYyAodXBkYXRlZE9wdGlvbnMpID0+IHtcbiAgICAgICAgICAgIHZhciBfYTtcbiAgICAgICAgICAgIHJldHVybiBhc3NlcnRSZXNwb25zZShhd2FpdCB0aGlzLmJsb2JDb250ZXh0LnNldEh0dHBIZWFkZXJzKHtcbiAgICAgICAgICAgICAgICBhYm9ydFNpZ25hbDogb3B0aW9ucy5hYm9ydFNpZ25hbCxcbiAgICAgICAgICAgICAgICBibG9iSHR0cEhlYWRlcnM6IGJsb2JIVFRQSGVhZGVycyxcbiAgICAgICAgICAgICAgICBsZWFzZUFjY2Vzc0NvbmRpdGlvbnM6IG9wdGlvbnMuY29uZGl0aW9ucyxcbiAgICAgICAgICAgICAgICBtb2RpZmllZEFjY2Vzc0NvbmRpdGlvbnM6IE9iamVjdC5hc3NpZ24oT2JqZWN0LmFzc2lnbih7fSwgb3B0aW9ucy5jb25kaXRpb25zKSwgeyBpZlRhZ3M6IChfYSA9IG9wdGlvbnMuY29uZGl0aW9ucykgPT09IG51bGwgfHwgX2EgPT09IHZvaWQgMCA/IHZvaWQgMCA6IF9hLnRhZ0NvbmRpdGlvbnMgfSksXG4gICAgICAgICAgICAgICAgLy8gY3BrSW5mbzogb3B0aW9ucy5jdXN0b21lclByb3ZpZGVkS2V5LCAvLyBDUEsgaXMgbm90IGluY2x1ZGVkIGluIFN3YWdnZXIsIHNob3VsZCBjaGFuZ2UgdGhpcyBiYWNrIHdoZW4gdGhpcyBpc3N1ZSBpcyBmaXhlZCBpbiBTd2FnZ2VyLlxuICAgICAgICAgICAgICAgIHRyYWNpbmdPcHRpb25zOiB1cGRhdGVkT3B0aW9ucy50cmFjaW5nT3B0aW9ucyxcbiAgICAgICAgICAgIH0pKTtcbiAgICAgICAgfSk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIFNldHMgdXNlci1kZWZpbmVkIG1ldGFkYXRhIGZvciB0aGUgc3BlY2lmaWVkIGJsb2IgYXMgb25lIG9yIG1vcmUgbmFtZS12YWx1ZSBwYWlycy5cbiAgICAgKlxuICAgICAqIElmIG5vIG9wdGlvbiBwcm92aWRlZCwgb3Igbm8gbWV0YWRhdGEgZGVmaW5lZCBpbiB0aGUgcGFyYW1ldGVyLCB0aGUgYmxvYlxuICAgICAqIG1ldGFkYXRhIHdpbGwgYmUgcmVtb3ZlZC5cbiAgICAgKiBAc2VlIGh0dHBzOi8vZG9jcy5taWNyb3NvZnQuY29tL2VuLXVzL3Jlc3QvYXBpL3N0b3JhZ2VzZXJ2aWNlcy9zZXQtYmxvYi1tZXRhZGF0YVxuICAgICAqXG4gICAgICogQHBhcmFtIG1ldGFkYXRhIC0gUmVwbGFjZSBleGlzdGluZyBtZXRhZGF0YSB3aXRoIHRoaXMgdmFsdWUuXG4gICAgICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSWYgbm8gdmFsdWUgcHJvdmlkZWQgdGhlIGV4aXN0aW5nIG1ldGFkYXRhIHdpbGwgYmUgcmVtb3ZlZC5cbiAgICAgKiBAcGFyYW0gb3B0aW9ucyAtIE9wdGlvbmFsIG9wdGlvbnMgdG8gU2V0IE1ldGFkYXRhIG9wZXJhdGlvbi5cbiAgICAgKi9cbiAgICBhc3luYyBzZXRNZXRhZGF0YShtZXRhZGF0YSwgb3B0aW9ucyA9IHt9KSB7XG4gICAgICAgIG9wdGlvbnMuY29uZGl0aW9ucyA9IG9wdGlvbnMuY29uZGl0aW9ucyB8fCB7fTtcbiAgICAgICAgZW5zdXJlQ3BrSWZTcGVjaWZpZWQob3B0aW9ucy5jdXN0b21lclByb3ZpZGVkS2V5LCB0aGlzLmlzSHR0cHMpO1xuICAgICAgICByZXR1cm4gdHJhY2luZ0NsaWVudC53aXRoU3BhbihcIkJsb2JDbGllbnQtc2V0TWV0YWRhdGFcIiwgb3B0aW9ucywgYXN5bmMgKHVwZGF0ZWRPcHRpb25zKSA9PiB7XG4gICAgICAgICAgICB2YXIgX2E7XG4gICAgICAgICAgICByZXR1cm4gYXNzZXJ0UmVzcG9uc2UoYXdhaXQgdGhpcy5ibG9iQ29udGV4dC5zZXRNZXRhZGF0YSh7XG4gICAgICAgICAgICAgICAgYWJvcnRTaWduYWw6IG9wdGlvbnMuYWJvcnRTaWduYWwsXG4gICAgICAgICAgICAgICAgbGVhc2VBY2Nlc3NDb25kaXRpb25zOiBvcHRpb25zLmNvbmRpdGlvbnMsXG4gICAgICAgICAgICAgICAgbWV0YWRhdGEsXG4gICAgICAgICAgICAgICAgbW9kaWZpZWRBY2Nlc3NDb25kaXRpb25zOiBPYmplY3QuYXNzaWduKE9iamVjdC5hc3NpZ24oe30sIG9wdGlvbnMuY29uZGl0aW9ucyksIHsgaWZUYWdzOiAoX2EgPSBvcHRpb25zLmNvbmRpdGlvbnMpID09PSBudWxsIHx8IF9hID09PSB2b2lkIDAgPyB2b2lkIDAgOiBfYS50YWdDb25kaXRpb25zIH0pLFxuICAgICAgICAgICAgICAgIGNwa0luZm86IG9wdGlvbnMuY3VzdG9tZXJQcm92aWRlZEtleSxcbiAgICAgICAgICAgICAgICBlbmNyeXB0aW9uU2NvcGU6IG9wdGlvbnMuZW5jcnlwdGlvblNjb3BlLFxuICAgICAgICAgICAgICAgIHRyYWNpbmdPcHRpb25zOiB1cGRhdGVkT3B0aW9ucy50cmFjaW5nT3B0aW9ucyxcbiAgICAgICAgICAgIH0pKTtcbiAgICAgICAgfSk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIFNldHMgdGFncyBvbiB0aGUgdW5kZXJseWluZyBibG9iLlxuICAgICAqIEEgYmxvYiBjYW4gaGF2ZSB1cCB0byAxMCB0YWdzLiBUYWcga2V5cyBtdXN0IGJlIGJldHdlZW4gMSBhbmQgMTI4IGNoYXJhY3RlcnMuICBUYWcgdmFsdWVzIG11c3QgYmUgYmV0d2VlbiAwIGFuZCAyNTYgY2hhcmFjdGVycy5cbiAgICAgKiBWYWxpZCB0YWcga2V5IGFuZCB2YWx1ZSBjaGFyYWN0ZXJzIGluY2x1ZGUgbG93ZXIgYW5kIHVwcGVyIGNhc2UgbGV0dGVycywgZGlnaXRzICgwLTkpLFxuICAgICAqIHNwYWNlICgnICcpLCBwbHVzICgnKycpLCBtaW51cyAoJy0nKSwgcGVyaW9kICgnLicpLCBmb3dhcmQgc2xhc2ggKCcvJyksIGNvbG9uICgnOicpLCBlcXVhbHMgKCc9JyksIGFuZCB1bmRlcnNjb3JlICgnXycpLlxuICAgICAqXG4gICAgICogQHBhcmFtIHRhZ3MgLVxuICAgICAqIEBwYXJhbSBvcHRpb25zIC1cbiAgICAgKi9cbiAgICBhc3luYyBzZXRUYWdzKHRhZ3MsIG9wdGlvbnMgPSB7fSkge1xuICAgICAgICByZXR1cm4gdHJhY2luZ0NsaWVudC53aXRoU3BhbihcIkJsb2JDbGllbnQtc2V0VGFnc1wiLCBvcHRpb25zLCBhc3luYyAodXBkYXRlZE9wdGlvbnMpID0+IHtcbiAgICAgICAgICAgIHZhciBfYTtcbiAgICAgICAgICAgIHJldHVybiBhc3NlcnRSZXNwb25zZShhd2FpdCB0aGlzLmJsb2JDb250ZXh0LnNldFRhZ3Moe1xuICAgICAgICAgICAgICAgIGFib3J0U2lnbmFsOiBvcHRpb25zLmFib3J0U2lnbmFsLFxuICAgICAgICAgICAgICAgIGxlYXNlQWNjZXNzQ29uZGl0aW9uczogb3B0aW9ucy5jb25kaXRpb25zLFxuICAgICAgICAgICAgICAgIG1vZGlmaWVkQWNjZXNzQ29uZGl0aW9uczogT2JqZWN0LmFzc2lnbihPYmplY3QuYXNzaWduKHt9LCBvcHRpb25zLmNvbmRpdGlvbnMpLCB7IGlmVGFnczogKF9hID0gb3B0aW9ucy5jb25kaXRpb25zKSA9PT0gbnVsbCB8fCBfYSA9PT0gdm9pZCAwID8gdm9pZCAwIDogX2EudGFnQ29uZGl0aW9ucyB9KSxcbiAgICAgICAgICAgICAgICB0cmFjaW5nT3B0aW9uczogdXBkYXRlZE9wdGlvbnMudHJhY2luZ09wdGlvbnMsXG4gICAgICAgICAgICAgICAgdGFnczogdG9CbG9iVGFncyh0YWdzKSxcbiAgICAgICAgICAgIH0pKTtcbiAgICAgICAgfSk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIEdldHMgdGhlIHRhZ3MgYXNzb2NpYXRlZCB3aXRoIHRoZSB1bmRlcmx5aW5nIGJsb2IuXG4gICAgICpcbiAgICAgKiBAcGFyYW0gb3B0aW9ucyAtXG4gICAgICovXG4gICAgYXN5bmMgZ2V0VGFncyhvcHRpb25zID0ge30pIHtcbiAgICAgICAgcmV0dXJuIHRyYWNpbmdDbGllbnQud2l0aFNwYW4oXCJCbG9iQ2xpZW50LWdldFRhZ3NcIiwgb3B0aW9ucywgYXN5bmMgKHVwZGF0ZWRPcHRpb25zKSA9PiB7XG4gICAgICAgICAgICB2YXIgX2E7XG4gICAgICAgICAgICBjb25zdCByZXNwb25zZSA9IGFzc2VydFJlc3BvbnNlKGF3YWl0IHRoaXMuYmxvYkNvbnRleHQuZ2V0VGFncyh7XG4gICAgICAgICAgICAgICAgYWJvcnRTaWduYWw6IG9wdGlvbnMuYWJvcnRTaWduYWwsXG4gICAgICAgICAgICAgICAgbGVhc2VBY2Nlc3NDb25kaXRpb25zOiBvcHRpb25zLmNvbmRpdGlvbnMsXG4gICAgICAgICAgICAgICAgbW9kaWZpZWRBY2Nlc3NDb25kaXRpb25zOiBPYmplY3QuYXNzaWduKE9iamVjdC5hc3NpZ24oe30sIG9wdGlvbnMuY29uZGl0aW9ucyksIHsgaWZUYWdzOiAoX2EgPSBvcHRpb25zLmNvbmRpdGlvbnMpID09PSBudWxsIHx8IF9hID09PSB2b2lkIDAgPyB2b2lkIDAgOiBfYS50YWdDb25kaXRpb25zIH0pLFxuICAgICAgICAgICAgICAgIHRyYWNpbmdPcHRpb25zOiB1cGRhdGVkT3B0aW9ucy50cmFjaW5nT3B0aW9ucyxcbiAgICAgICAgICAgIH0pKTtcbiAgICAgICAgICAgIGNvbnN0IHdyYXBwZWRSZXNwb25zZSA9IE9iamVjdC5hc3NpZ24oT2JqZWN0LmFzc2lnbih7fSwgcmVzcG9uc2UpLCB7IF9yZXNwb25zZTogcmVzcG9uc2UuX3Jlc3BvbnNlLCB0YWdzOiB0b1RhZ3MoeyBibG9iVGFnU2V0OiByZXNwb25zZS5ibG9iVGFnU2V0IH0pIHx8IHt9IH0pO1xuICAgICAgICAgICAgcmV0dXJuIHdyYXBwZWRSZXNwb25zZTtcbiAgICAgICAgfSk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIEdldCBhIHtAbGluayBCbG9iTGVhc2VDbGllbnR9IHRoYXQgbWFuYWdlcyBsZWFzZXMgb24gdGhlIGJsb2IuXG4gICAgICpcbiAgICAgKiBAcGFyYW0gcHJvcG9zZUxlYXNlSWQgLSBJbml0aWFsIHByb3Bvc2VkIGxlYXNlIElkLlxuICAgICAqIEByZXR1cm5zIEEgbmV3IEJsb2JMZWFzZUNsaWVudCBvYmplY3QgZm9yIG1hbmFnaW5nIGxlYXNlcyBvbiB0aGUgYmxvYi5cbiAgICAgKi9cbiAgICBnZXRCbG9iTGVhc2VDbGllbnQocHJvcG9zZUxlYXNlSWQpIHtcbiAgICAgICAgcmV0dXJuIG5ldyBCbG9iTGVhc2VDbGllbnQodGhpcywgcHJvcG9zZUxlYXNlSWQpO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBDcmVhdGVzIGEgcmVhZC1vbmx5IHNuYXBzaG90IG9mIGEgYmxvYi5cbiAgICAgKiBAc2VlIGh0dHBzOi8vZG9jcy5taWNyb3NvZnQuY29tL2VuLXVzL3Jlc3QvYXBpL3N0b3JhZ2VzZXJ2aWNlcy9zbmFwc2hvdC1ibG9iXG4gICAgICpcbiAgICAgKiBAcGFyYW0gb3B0aW9ucyAtIE9wdGlvbmFsIG9wdGlvbnMgdG8gdGhlIEJsb2IgQ3JlYXRlIFNuYXBzaG90IG9wZXJhdGlvbi5cbiAgICAgKi9cbiAgICBhc3luYyBjcmVhdGVTbmFwc2hvdChvcHRpb25zID0ge30pIHtcbiAgICAgICAgb3B0aW9ucy5jb25kaXRpb25zID0gb3B0aW9ucy5jb25kaXRpb25zIHx8IHt9O1xuICAgICAgICBlbnN1cmVDcGtJZlNwZWNpZmllZChvcHRpb25zLmN1c3RvbWVyUHJvdmlkZWRLZXksIHRoaXMuaXNIdHRwcyk7XG4gICAgICAgIHJldHVybiB0cmFjaW5nQ2xpZW50LndpdGhTcGFuKFwiQmxvYkNsaWVudC1jcmVhdGVTbmFwc2hvdFwiLCBvcHRpb25zLCBhc3luYyAodXBkYXRlZE9wdGlvbnMpID0+IHtcbiAgICAgICAgICAgIHZhciBfYTtcbiAgICAgICAgICAgIHJldHVybiBhc3NlcnRSZXNwb25zZShhd2FpdCB0aGlzLmJsb2JDb250ZXh0LmNyZWF0ZVNuYXBzaG90KHtcbiAgICAgICAgICAgICAgICBhYm9ydFNpZ25hbDogb3B0aW9ucy5hYm9ydFNpZ25hbCxcbiAgICAgICAgICAgICAgICBsZWFzZUFjY2Vzc0NvbmRpdGlvbnM6IG9wdGlvbnMuY29uZGl0aW9ucyxcbiAgICAgICAgICAgICAgICBtZXRhZGF0YTogb3B0aW9ucy5tZXRhZGF0YSxcbiAgICAgICAgICAgICAgICBtb2RpZmllZEFjY2Vzc0NvbmRpdGlvbnM6IE9iamVjdC5hc3NpZ24oT2JqZWN0LmFzc2lnbih7fSwgb3B0aW9ucy5jb25kaXRpb25zKSwgeyBpZlRhZ3M6IChfYSA9IG9wdGlvbnMuY29uZGl0aW9ucykgPT09IG51bGwgfHwgX2EgPT09IHZvaWQgMCA/IHZvaWQgMCA6IF9hLnRhZ0NvbmRpdGlvbnMgfSksXG4gICAgICAgICAgICAgICAgY3BrSW5mbzogb3B0aW9ucy5jdXN0b21lclByb3ZpZGVkS2V5LFxuICAgICAgICAgICAgICAgIGVuY3J5cHRpb25TY29wZTogb3B0aW9ucy5lbmNyeXB0aW9uU2NvcGUsXG4gICAgICAgICAgICAgICAgdHJhY2luZ09wdGlvbnM6IHVwZGF0ZWRPcHRpb25zLnRyYWNpbmdPcHRpb25zLFxuICAgICAgICAgICAgfSkpO1xuICAgICAgICB9KTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogQXN5bmNocm9ub3VzbHkgY29waWVzIGEgYmxvYiB0byBhIGRlc3RpbmF0aW9uIHdpdGhpbiB0aGUgc3RvcmFnZSBhY2NvdW50LlxuICAgICAqIFRoaXMgbWV0aG9kIHJldHVybnMgYSBsb25nIHJ1bm5pbmcgb3BlcmF0aW9uIHBvbGxlciB0aGF0IGFsbG93cyB5b3UgdG8gd2FpdFxuICAgICAqIGluZGVmaW5pdGVseSB1bnRpbCB0aGUgY29weSBpcyBjb21wbGV0ZWQuXG4gICAgICogWW91IGNhbiBhbHNvIGNhbmNlbCBhIGNvcHkgYmVmb3JlIGl0IGlzIGNvbXBsZXRlZCBieSBjYWxsaW5nIGBjYW5jZWxPcGVyYXRpb25gIG9uIHRoZSBwb2xsZXIuXG4gICAgICogTm90ZSB0aGF0IHRoZSBvblByb2dyZXNzIGNhbGxiYWNrIHdpbGwgbm90IGJlIGludm9rZWQgaWYgdGhlIG9wZXJhdGlvbiBjb21wbGV0ZXMgaW4gdGhlIGZpcnN0XG4gICAgICogcmVxdWVzdCwgYW5kIGF0dGVtcHRpbmcgdG8gY2FuY2VsIGEgY29tcGxldGVkIGNvcHkgd2lsbCByZXN1bHQgaW4gYW4gZXJyb3IgYmVpbmcgdGhyb3duLlxuICAgICAqXG4gICAgICogSW4gdmVyc2lvbiAyMDEyLTAyLTEyIGFuZCBsYXRlciwgdGhlIHNvdXJjZSBmb3IgYSBDb3B5IEJsb2Igb3BlcmF0aW9uIGNhbiBiZVxuICAgICAqIGEgY29tbWl0dGVkIGJsb2IgaW4gYW55IEF6dXJlIHN0b3JhZ2UgYWNjb3VudC5cbiAgICAgKiBCZWdpbm5pbmcgd2l0aCB2ZXJzaW9uIDIwMTUtMDItMjEsIHRoZSBzb3VyY2UgZm9yIGEgQ29weSBCbG9iIG9wZXJhdGlvbiBjYW4gYmVcbiAgICAgKiBhbiBBenVyZSBmaWxlIGluIGFueSBBenVyZSBzdG9yYWdlIGFjY291bnQuXG4gICAgICogT25seSBzdG9yYWdlIGFjY291bnRzIGNyZWF0ZWQgb24gb3IgYWZ0ZXIgSnVuZSA3dGgsIDIwMTIgYWxsb3cgdGhlIENvcHkgQmxvYlxuICAgICAqIG9wZXJhdGlvbiB0byBjb3B5IGZyb20gYW5vdGhlciBzdG9yYWdlIGFjY291bnQuXG4gICAgICogQHNlZSBodHRwczovL2RvY3MubWljcm9zb2Z0LmNvbS9lbi11cy9yZXN0L2FwaS9zdG9yYWdlc2VydmljZXMvY29weS1ibG9iXG4gICAgICpcbiAgICAgKiBFeGFtcGxlIHVzaW5nIGF1dG9tYXRpYyBwb2xsaW5nOlxuICAgICAqXG4gICAgICogYGBganNcbiAgICAgKiBjb25zdCBjb3B5UG9sbGVyID0gYXdhaXQgYmxvYkNsaWVudC5iZWdpbkNvcHlGcm9tVVJMKCd1cmwnKTtcbiAgICAgKiBjb25zdCByZXN1bHQgPSBhd2FpdCBjb3B5UG9sbGVyLnBvbGxVbnRpbERvbmUoKTtcbiAgICAgKiBgYGBcbiAgICAgKlxuICAgICAqIEV4YW1wbGUgdXNpbmcgbWFudWFsIHBvbGxpbmc6XG4gICAgICpcbiAgICAgKiBgYGBqc1xuICAgICAqIGNvbnN0IGNvcHlQb2xsZXIgPSBhd2FpdCBibG9iQ2xpZW50LmJlZ2luQ29weUZyb21VUkwoJ3VybCcpO1xuICAgICAqIHdoaWxlICghcG9sbGVyLmlzRG9uZSgpKSB7XG4gICAgICogICAgYXdhaXQgcG9sbGVyLnBvbGwoKTtcbiAgICAgKiB9XG4gICAgICogY29uc3QgcmVzdWx0ID0gY29weVBvbGxlci5nZXRSZXN1bHQoKTtcbiAgICAgKiBgYGBcbiAgICAgKlxuICAgICAqIEV4YW1wbGUgdXNpbmcgcHJvZ3Jlc3MgdXBkYXRlczpcbiAgICAgKlxuICAgICAqIGBgYGpzXG4gICAgICogY29uc3QgY29weVBvbGxlciA9IGF3YWl0IGJsb2JDbGllbnQuYmVnaW5Db3B5RnJvbVVSTCgndXJsJywge1xuICAgICAqICAgb25Qcm9ncmVzcyhzdGF0ZSkge1xuICAgICAqICAgICBjb25zb2xlLmxvZyhgUHJvZ3Jlc3M6ICR7c3RhdGUuY29weVByb2dyZXNzfWApO1xuICAgICAqICAgfVxuICAgICAqIH0pO1xuICAgICAqIGNvbnN0IHJlc3VsdCA9IGF3YWl0IGNvcHlQb2xsZXIucG9sbFVudGlsRG9uZSgpO1xuICAgICAqIGBgYFxuICAgICAqXG4gICAgICogRXhhbXBsZSB1c2luZyBhIGNoYW5naW5nIHBvbGxpbmcgaW50ZXJ2YWwgKGRlZmF1bHQgMTUgc2Vjb25kcyk6XG4gICAgICpcbiAgICAgKiBgYGBqc1xuICAgICAqIGNvbnN0IGNvcHlQb2xsZXIgPSBhd2FpdCBibG9iQ2xpZW50LmJlZ2luQ29weUZyb21VUkwoJ3VybCcsIHtcbiAgICAgKiAgIGludGVydmFsSW5NczogMTAwMCAvLyBwb2xsIGJsb2IgZXZlcnkgMSBzZWNvbmQgZm9yIGNvcHkgcHJvZ3Jlc3NcbiAgICAgKiB9KTtcbiAgICAgKiBjb25zdCByZXN1bHQgPSBhd2FpdCBjb3B5UG9sbGVyLnBvbGxVbnRpbERvbmUoKTtcbiAgICAgKiBgYGBcbiAgICAgKlxuICAgICAqIEV4YW1wbGUgdXNpbmcgY29weSBjYW5jZWxsYXRpb246XG4gICAgICpcbiAgICAgKiBgYGBqc1xuICAgICAqIGNvbnN0IGNvcHlQb2xsZXIgPSBhd2FpdCBibG9iQ2xpZW50LmJlZ2luQ29weUZyb21VUkwoJ3VybCcpO1xuICAgICAqIC8vIGNhbmNlbCBvcGVyYXRpb24gYWZ0ZXIgc3RhcnRpbmcgaXQuXG4gICAgICogdHJ5IHtcbiAgICAgKiAgIGF3YWl0IGNvcHlQb2xsZXIuY2FuY2VsT3BlcmF0aW9uKCk7XG4gICAgICogICAvLyBjYWxscyB0byBnZXQgdGhlIHJlc3VsdCBub3cgdGhyb3cgUG9sbGVyQ2FuY2VsbGVkRXJyb3JcbiAgICAgKiAgIGF3YWl0IGNvcHlQb2xsZXIuZ2V0UmVzdWx0KCk7XG4gICAgICogfSBjYXRjaCAoZXJyKSB7XG4gICAgICogICBpZiAoZXJyLm5hbWUgPT09ICdQb2xsZXJDYW5jZWxsZWRFcnJvcicpIHtcbiAgICAgKiAgICAgY29uc29sZS5sb2coJ1RoZSBjb3B5IHdhcyBjYW5jZWxsZWQuJyk7XG4gICAgICogICB9XG4gICAgICogfVxuICAgICAqIGBgYFxuICAgICAqXG4gICAgICogQHBhcmFtIGNvcHlTb3VyY2UgLSB1cmwgdG8gdGhlIHNvdXJjZSBBenVyZSBCbG9iL0ZpbGUuXG4gICAgICogQHBhcmFtIG9wdGlvbnMgLSBPcHRpb25hbCBvcHRpb25zIHRvIHRoZSBCbG9iIFN0YXJ0IENvcHkgRnJvbSBVUkwgb3BlcmF0aW9uLlxuICAgICAqL1xuICAgIGFzeW5jIGJlZ2luQ29weUZyb21VUkwoY29weVNvdXJjZSwgb3B0aW9ucyA9IHt9KSB7XG4gICAgICAgIGNvbnN0IGNsaWVudCA9IHtcbiAgICAgICAgICAgIGFib3J0Q29weUZyb21VUkw6ICguLi5hcmdzKSA9PiB0aGlzLmFib3J0Q29weUZyb21VUkwoLi4uYXJncyksXG4gICAgICAgICAgICBnZXRQcm9wZXJ0aWVzOiAoLi4uYXJncykgPT4gdGhpcy5nZXRQcm9wZXJ0aWVzKC4uLmFyZ3MpLFxuICAgICAgICAgICAgc3RhcnRDb3B5RnJvbVVSTDogKC4uLmFyZ3MpID0+IHRoaXMuc3RhcnRDb3B5RnJvbVVSTCguLi5hcmdzKSxcbiAgICAgICAgfTtcbiAgICAgICAgY29uc3QgcG9sbGVyID0gbmV3IEJsb2JCZWdpbkNvcHlGcm9tVXJsUG9sbGVyKHtcbiAgICAgICAgICAgIGJsb2JDbGllbnQ6IGNsaWVudCxcbiAgICAgICAgICAgIGNvcHlTb3VyY2UsXG4gICAgICAgICAgICBpbnRlcnZhbEluTXM6IG9wdGlvbnMuaW50ZXJ2YWxJbk1zLFxuICAgICAgICAgICAgb25Qcm9ncmVzczogb3B0aW9ucy5vblByb2dyZXNzLFxuICAgICAgICAgICAgcmVzdW1lRnJvbTogb3B0aW9ucy5yZXN1bWVGcm9tLFxuICAgICAgICAgICAgc3RhcnRDb3B5RnJvbVVSTE9wdGlvbnM6IG9wdGlvbnMsXG4gICAgICAgIH0pO1xuICAgICAgICAvLyBUcmlnZ2VyIHRoZSBzdGFydENvcHlGcm9tVVJMIGNhbGwgYnkgY2FsbGluZyBwb2xsLlxuICAgICAgICAvLyBBbnkgZXJyb3JzIGZyb20gdGhpcyBtZXRob2Qgc2hvdWxkIGJlIHN1cmZhY2VkIHRvIHRoZSB1c2VyLlxuICAgICAgICBhd2FpdCBwb2xsZXIucG9sbCgpO1xuICAgICAgICByZXR1cm4gcG9sbGVyO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBBYm9ydHMgYSBwZW5kaW5nIGFzeW5jaHJvbm91cyBDb3B5IEJsb2Igb3BlcmF0aW9uLCBhbmQgbGVhdmVzIGEgZGVzdGluYXRpb24gYmxvYiB3aXRoIHplcm9cbiAgICAgKiBsZW5ndGggYW5kIGZ1bGwgbWV0YWRhdGEuIFZlcnNpb24gMjAxMi0wMi0xMiBhbmQgbmV3ZXIuXG4gICAgICogQHNlZSBodHRwczovL2RvY3MubWljcm9zb2Z0LmNvbS9lbi11cy9yZXN0L2FwaS9zdG9yYWdlc2VydmljZXMvYWJvcnQtY29weS1ibG9iXG4gICAgICpcbiAgICAgKiBAcGFyYW0gY29weUlkIC0gSWQgb2YgdGhlIENvcHkgRnJvbSBVUkwgb3BlcmF0aW9uLlxuICAgICAqIEBwYXJhbSBvcHRpb25zIC0gT3B0aW9uYWwgb3B0aW9ucyB0byB0aGUgQmxvYiBBYm9ydCBDb3B5IEZyb20gVVJMIG9wZXJhdGlvbi5cbiAgICAgKi9cbiAgICBhc3luYyBhYm9ydENvcHlGcm9tVVJMKGNvcHlJZCwgb3B0aW9ucyA9IHt9KSB7XG4gICAgICAgIHJldHVybiB0cmFjaW5nQ2xpZW50LndpdGhTcGFuKFwiQmxvYkNsaWVudC1hYm9ydENvcHlGcm9tVVJMXCIsIG9wdGlvbnMsIGFzeW5jICh1cGRhdGVkT3B0aW9ucykgPT4ge1xuICAgICAgICAgICAgcmV0dXJuIGFzc2VydFJlc3BvbnNlKGF3YWl0IHRoaXMuYmxvYkNvbnRleHQuYWJvcnRDb3B5RnJvbVVSTChjb3B5SWQsIHtcbiAgICAgICAgICAgICAgICBhYm9ydFNpZ25hbDogb3B0aW9ucy5hYm9ydFNpZ25hbCxcbiAgICAgICAgICAgICAgICBsZWFzZUFjY2Vzc0NvbmRpdGlvbnM6IG9wdGlvbnMuY29uZGl0aW9ucyxcbiAgICAgICAgICAgICAgICB0cmFjaW5nT3B0aW9uczogdXBkYXRlZE9wdGlvbnMudHJhY2luZ09wdGlvbnMsXG4gICAgICAgICAgICB9KSk7XG4gICAgICAgIH0pO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBUaGUgc3luY2hyb25vdXMgQ29weSBGcm9tIFVSTCBvcGVyYXRpb24gY29waWVzIGEgYmxvYiBvciBhbiBpbnRlcm5ldCByZXNvdXJjZSB0byBhIG5ldyBibG9iLiBJdCB3aWxsIG5vdFxuICAgICAqIHJldHVybiBhIHJlc3BvbnNlIHVudGlsIHRoZSBjb3B5IGlzIGNvbXBsZXRlLlxuICAgICAqIEBzZWUgaHR0cHM6Ly9kb2NzLm1pY3Jvc29mdC5jb20vZW4tdXMvcmVzdC9hcGkvc3RvcmFnZXNlcnZpY2VzL2NvcHktYmxvYi1mcm9tLXVybFxuICAgICAqXG4gICAgICogQHBhcmFtIGNvcHlTb3VyY2UgLSBUaGUgc291cmNlIFVSTCB0byBjb3B5IGZyb20sIFNoYXJlZCBBY2Nlc3MgU2lnbmF0dXJlKFNBUykgbWF5YmUgbmVlZGVkIGZvciBhdXRoZW50aWNhdGlvblxuICAgICAqIEBwYXJhbSBvcHRpb25zIC1cbiAgICAgKi9cbiAgICBhc3luYyBzeW5jQ29weUZyb21VUkwoY29weVNvdXJjZSwgb3B0aW9ucyA9IHt9KSB7XG4gICAgICAgIG9wdGlvbnMuY29uZGl0aW9ucyA9IG9wdGlvbnMuY29uZGl0aW9ucyB8fCB7fTtcbiAgICAgICAgb3B0aW9ucy5zb3VyY2VDb25kaXRpb25zID0gb3B0aW9ucy5zb3VyY2VDb25kaXRpb25zIHx8IHt9O1xuICAgICAgICByZXR1cm4gdHJhY2luZ0NsaWVudC53aXRoU3BhbihcIkJsb2JDbGllbnQtc3luY0NvcHlGcm9tVVJMXCIsIG9wdGlvbnMsIGFzeW5jICh1cGRhdGVkT3B0aW9ucykgPT4ge1xuICAgICAgICAgICAgdmFyIF9hLCBfYiwgX2MsIF9kLCBfZSwgX2YsIF9nO1xuICAgICAgICAgICAgcmV0dXJuIGFzc2VydFJlc3BvbnNlKGF3YWl0IHRoaXMuYmxvYkNvbnRleHQuY29weUZyb21VUkwoY29weVNvdXJjZSwge1xuICAgICAgICAgICAgICAgIGFib3J0U2lnbmFsOiBvcHRpb25zLmFib3J0U2lnbmFsLFxuICAgICAgICAgICAgICAgIG1ldGFkYXRhOiBvcHRpb25zLm1ldGFkYXRhLFxuICAgICAgICAgICAgICAgIGxlYXNlQWNjZXNzQ29uZGl0aW9uczogb3B0aW9ucy5jb25kaXRpb25zLFxuICAgICAgICAgICAgICAgIG1vZGlmaWVkQWNjZXNzQ29uZGl0aW9uczogT2JqZWN0LmFzc2lnbihPYmplY3QuYXNzaWduKHt9LCBvcHRpb25zLmNvbmRpdGlvbnMpLCB7IGlmVGFnczogKF9hID0gb3B0aW9ucy5jb25kaXRpb25zKSA9PT0gbnVsbCB8fCBfYSA9PT0gdm9pZCAwID8gdm9pZCAwIDogX2EudGFnQ29uZGl0aW9ucyB9KSxcbiAgICAgICAgICAgICAgICBzb3VyY2VNb2RpZmllZEFjY2Vzc0NvbmRpdGlvbnM6IHtcbiAgICAgICAgICAgICAgICAgICAgc291cmNlSWZNYXRjaDogKF9iID0gb3B0aW9ucy5zb3VyY2VDb25kaXRpb25zKSA9PT0gbnVsbCB8fCBfYiA9PT0gdm9pZCAwID8gdm9pZCAwIDogX2IuaWZNYXRjaCxcbiAgICAgICAgICAgICAgICAgICAgc291cmNlSWZNb2RpZmllZFNpbmNlOiAoX2MgPSBvcHRpb25zLnNvdXJjZUNvbmRpdGlvbnMpID09PSBudWxsIHx8IF9jID09PSB2b2lkIDAgPyB2b2lkIDAgOiBfYy5pZk1vZGlmaWVkU2luY2UsXG4gICAgICAgICAgICAgICAgICAgIHNvdXJjZUlmTm9uZU1hdGNoOiAoX2QgPSBvcHRpb25zLnNvdXJjZUNvbmRpdGlvbnMpID09PSBudWxsIHx8IF9kID09PSB2b2lkIDAgPyB2b2lkIDAgOiBfZC5pZk5vbmVNYXRjaCxcbiAgICAgICAgICAgICAgICAgICAgc291cmNlSWZVbm1vZGlmaWVkU2luY2U6IChfZSA9IG9wdGlvbnMuc291cmNlQ29uZGl0aW9ucykgPT09IG51bGwgfHwgX2UgPT09IHZvaWQgMCA/IHZvaWQgMCA6IF9lLmlmVW5tb2RpZmllZFNpbmNlLFxuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgc291cmNlQ29udGVudE1ENTogb3B0aW9ucy5zb3VyY2VDb250ZW50TUQ1LFxuICAgICAgICAgICAgICAgIGNvcHlTb3VyY2VBdXRob3JpemF0aW9uOiBodHRwQXV0aG9yaXphdGlvblRvU3RyaW5nKG9wdGlvbnMuc291cmNlQXV0aG9yaXphdGlvbiksXG4gICAgICAgICAgICAgICAgdGllcjogdG9BY2Nlc3NUaWVyKG9wdGlvbnMudGllciksXG4gICAgICAgICAgICAgICAgYmxvYlRhZ3NTdHJpbmc6IHRvQmxvYlRhZ3NTdHJpbmcob3B0aW9ucy50YWdzKSxcbiAgICAgICAgICAgICAgICBpbW11dGFiaWxpdHlQb2xpY3lFeHBpcnk6IChfZiA9IG9wdGlvbnMuaW1tdXRhYmlsaXR5UG9saWN5KSA9PT0gbnVsbCB8fCBfZiA9PT0gdm9pZCAwID8gdm9pZCAwIDogX2YuZXhwaXJpZXNPbixcbiAgICAgICAgICAgICAgICBpbW11dGFiaWxpdHlQb2xpY3lNb2RlOiAoX2cgPSBvcHRpb25zLmltbXV0YWJpbGl0eVBvbGljeSkgPT09IG51bGwgfHwgX2cgPT09IHZvaWQgMCA/IHZvaWQgMCA6IF9nLnBvbGljeU1vZGUsXG4gICAgICAgICAgICAgICAgbGVnYWxIb2xkOiBvcHRpb25zLmxlZ2FsSG9sZCxcbiAgICAgICAgICAgICAgICBlbmNyeXB0aW9uU2NvcGU6IG9wdGlvbnMuZW5jcnlwdGlvblNjb3BlLFxuICAgICAgICAgICAgICAgIGNvcHlTb3VyY2VUYWdzOiBvcHRpb25zLmNvcHlTb3VyY2VUYWdzLFxuICAgICAgICAgICAgICAgIHRyYWNpbmdPcHRpb25zOiB1cGRhdGVkT3B0aW9ucy50cmFjaW5nT3B0aW9ucyxcbiAgICAgICAgICAgIH0pKTtcbiAgICAgICAgfSk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIFNldHMgdGhlIHRpZXIgb24gYSBibG9iLiBUaGUgb3BlcmF0aW9uIGlzIGFsbG93ZWQgb24gYSBwYWdlIGJsb2IgaW4gYSBwcmVtaXVtXG4gICAgICogc3RvcmFnZSBhY2NvdW50IGFuZCBvbiBhIGJsb2NrIGJsb2IgaW4gYSBibG9iIHN0b3JhZ2UgYWNjb3VudCAobG9jYWxseSByZWR1bmRhbnRcbiAgICAgKiBzdG9yYWdlIG9ubHkpLiBBIHByZW1pdW0gcGFnZSBibG9iJ3MgdGllciBkZXRlcm1pbmVzIHRoZSBhbGxvd2VkIHNpemUsIElPUFMsXG4gICAgICogYW5kIGJhbmR3aWR0aCBvZiB0aGUgYmxvYi4gQSBibG9jayBibG9iJ3MgdGllciBkZXRlcm1pbmVzIEhvdC9Db29sL0FyY2hpdmVcbiAgICAgKiBzdG9yYWdlIHR5cGUuIFRoaXMgb3BlcmF0aW9uIGRvZXMgbm90IHVwZGF0ZSB0aGUgYmxvYidzIEVUYWcuXG4gICAgICogQHNlZSBodHRwczovL2RvY3MubWljcm9zb2Z0LmNvbS9lbi11cy9yZXN0L2FwaS9zdG9yYWdlc2VydmljZXMvc2V0LWJsb2ItdGllclxuICAgICAqXG4gICAgICogQHBhcmFtIHRpZXIgLSBUaGUgdGllciB0byBiZSBzZXQgb24gdGhlIGJsb2IuIFZhbGlkIHZhbHVlcyBhcmUgSG90LCBDb29sLCBvciBBcmNoaXZlLlxuICAgICAqIEBwYXJhbSBvcHRpb25zIC0gT3B0aW9uYWwgb3B0aW9ucyB0byB0aGUgQmxvYiBTZXQgVGllciBvcGVyYXRpb24uXG4gICAgICovXG4gICAgYXN5bmMgc2V0QWNjZXNzVGllcih0aWVyLCBvcHRpb25zID0ge30pIHtcbiAgICAgICAgcmV0dXJuIHRyYWNpbmdDbGllbnQud2l0aFNwYW4oXCJCbG9iQ2xpZW50LXNldEFjY2Vzc1RpZXJcIiwgb3B0aW9ucywgYXN5bmMgKHVwZGF0ZWRPcHRpb25zKSA9PiB7XG4gICAgICAgICAgICB2YXIgX2E7XG4gICAgICAgICAgICByZXR1cm4gYXNzZXJ0UmVzcG9uc2UoYXdhaXQgdGhpcy5ibG9iQ29udGV4dC5zZXRUaWVyKHRvQWNjZXNzVGllcih0aWVyKSwge1xuICAgICAgICAgICAgICAgIGFib3J0U2lnbmFsOiBvcHRpb25zLmFib3J0U2lnbmFsLFxuICAgICAgICAgICAgICAgIGxlYXNlQWNjZXNzQ29uZGl0aW9uczogb3B0aW9ucy5jb25kaXRpb25zLFxuICAgICAgICAgICAgICAgIG1vZGlmaWVkQWNjZXNzQ29uZGl0aW9uczogT2JqZWN0LmFzc2lnbihPYmplY3QuYXNzaWduKHt9LCBvcHRpb25zLmNvbmRpdGlvbnMpLCB7IGlmVGFnczogKF9hID0gb3B0aW9ucy5jb25kaXRpb25zKSA9PT0gbnVsbCB8fCBfYSA9PT0gdm9pZCAwID8gdm9pZCAwIDogX2EudGFnQ29uZGl0aW9ucyB9KSxcbiAgICAgICAgICAgICAgICByZWh5ZHJhdGVQcmlvcml0eTogb3B0aW9ucy5yZWh5ZHJhdGVQcmlvcml0eSxcbiAgICAgICAgICAgICAgICB0cmFjaW5nT3B0aW9uczogdXBkYXRlZE9wdGlvbnMudHJhY2luZ09wdGlvbnMsXG4gICAgICAgICAgICB9KSk7XG4gICAgICAgIH0pO1xuICAgIH1cbiAgICBhc3luYyBkb3dubG9hZFRvQnVmZmVyKHBhcmFtMSwgcGFyYW0yLCBwYXJhbTMsIHBhcmFtNCA9IHt9KSB7XG4gICAgICAgIHZhciBfYTtcbiAgICAgICAgbGV0IGJ1ZmZlcjtcbiAgICAgICAgbGV0IG9mZnNldCA9IDA7XG4gICAgICAgIGxldCBjb3VudCA9IDA7XG4gICAgICAgIGxldCBvcHRpb25zID0gcGFyYW00O1xuICAgICAgICBpZiAocGFyYW0xIGluc3RhbmNlb2YgQnVmZmVyKSB7XG4gICAgICAgICAgICBidWZmZXIgPSBwYXJhbTE7XG4gICAgICAgICAgICBvZmZzZXQgPSBwYXJhbTIgfHwgMDtcbiAgICAgICAgICAgIGNvdW50ID0gdHlwZW9mIHBhcmFtMyA9PT0gXCJudW1iZXJcIiA/IHBhcmFtMyA6IDA7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICBvZmZzZXQgPSB0eXBlb2YgcGFyYW0xID09PSBcIm51bWJlclwiID8gcGFyYW0xIDogMDtcbiAgICAgICAgICAgIGNvdW50ID0gdHlwZW9mIHBhcmFtMiA9PT0gXCJudW1iZXJcIiA/IHBhcmFtMiA6IDA7XG4gICAgICAgICAgICBvcHRpb25zID0gcGFyYW0zIHx8IHt9O1xuICAgICAgICB9XG4gICAgICAgIGxldCBibG9ja1NpemUgPSAoX2EgPSBvcHRpb25zLmJsb2NrU2l6ZSkgIT09IG51bGwgJiYgX2EgIT09IHZvaWQgMCA/IF9hIDogMDtcbiAgICAgICAgaWYgKGJsb2NrU2l6ZSA8IDApIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBSYW5nZUVycm9yKFwiYmxvY2tTaXplIG9wdGlvbiBtdXN0IGJlID49IDBcIik7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGJsb2NrU2l6ZSA9PT0gMCkge1xuICAgICAgICAgICAgYmxvY2tTaXplID0gREVGQVVMVF9CTE9CX0RPV05MT0FEX0JMT0NLX0JZVEVTO1xuICAgICAgICB9XG4gICAgICAgIGlmIChvZmZzZXQgPCAwKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgUmFuZ2VFcnJvcihcIm9mZnNldCBvcHRpb24gbXVzdCBiZSA+PSAwXCIpO1xuICAgICAgICB9XG4gICAgICAgIGlmIChjb3VudCAmJiBjb3VudCA8PSAwKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgUmFuZ2VFcnJvcihcImNvdW50IG9wdGlvbiBtdXN0IGJlIGdyZWF0ZXIgdGhhbiAwXCIpO1xuICAgICAgICB9XG4gICAgICAgIGlmICghb3B0aW9ucy5jb25kaXRpb25zKSB7XG4gICAgICAgICAgICBvcHRpb25zLmNvbmRpdGlvbnMgPSB7fTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gdHJhY2luZ0NsaWVudC53aXRoU3BhbihcIkJsb2JDbGllbnQtZG93bmxvYWRUb0J1ZmZlclwiLCBvcHRpb25zLCBhc3luYyAodXBkYXRlZE9wdGlvbnMpID0+IHtcbiAgICAgICAgICAgIC8vIEN1c3RvbWVyIGRvZXNuJ3Qgc3BlY2lmeSBsZW5ndGgsIGdldCBpdFxuICAgICAgICAgICAgaWYgKCFjb3VudCkge1xuICAgICAgICAgICAgICAgIGNvbnN0IHJlc3BvbnNlID0gYXdhaXQgdGhpcy5nZXRQcm9wZXJ0aWVzKE9iamVjdC5hc3NpZ24oT2JqZWN0LmFzc2lnbih7fSwgb3B0aW9ucyksIHsgdHJhY2luZ09wdGlvbnM6IHVwZGF0ZWRPcHRpb25zLnRyYWNpbmdPcHRpb25zIH0pKTtcbiAgICAgICAgICAgICAgICBjb3VudCA9IHJlc3BvbnNlLmNvbnRlbnRMZW5ndGggLSBvZmZzZXQ7XG4gICAgICAgICAgICAgICAgaWYgKGNvdW50IDwgMCkge1xuICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgUmFuZ2VFcnJvcihgb2Zmc2V0ICR7b2Zmc2V0fSBzaG91bGRuJ3QgYmUgbGFyZ2VyIHRoYW4gYmxvYiBzaXplICR7cmVzcG9uc2UuY29udGVudExlbmd0aH1gKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICAvLyBBbGxvY2F0ZSB0aGUgYnVmZmVyIG9mIHNpemUgPSBjb3VudCBpZiB0aGUgYnVmZmVyIGlzIG5vdCBwcm92aWRlZFxuICAgICAgICAgICAgaWYgKCFidWZmZXIpIHtcbiAgICAgICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgICAgICBidWZmZXIgPSBCdWZmZXIuYWxsb2MoY291bnQpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBVbmFibGUgdG8gYWxsb2NhdGUgdGhlIGJ1ZmZlciBvZiBzaXplOiAke2NvdW50fShpbiBieXRlcykuIFBsZWFzZSB0cnkgcGFzc2luZyB5b3VyIG93biBidWZmZXIgdG8gdGhlIFwiZG93bmxvYWRUb0J1ZmZlclwiIG1ldGhvZCBvciB0cnkgdXNpbmcgb3RoZXIgbWV0aG9kcyBsaWtlIFwiZG93bmxvYWRcIiBvciBcImRvd25sb2FkVG9GaWxlXCIuXFx0ICR7ZXJyb3IubWVzc2FnZX1gKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAoYnVmZmVyLmxlbmd0aCA8IGNvdW50KSB7XG4gICAgICAgICAgICAgICAgdGhyb3cgbmV3IFJhbmdlRXJyb3IoYFRoZSBidWZmZXIncyBzaXplIHNob3VsZCBiZSBlcXVhbCB0byBvciBsYXJnZXIgdGhhbiB0aGUgcmVxdWVzdCBjb3VudCBvZiBieXRlczogJHtjb3VudH1gKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGxldCB0cmFuc2ZlclByb2dyZXNzID0gMDtcbiAgICAgICAgICAgIGNvbnN0IGJhdGNoID0gbmV3IEJhdGNoKG9wdGlvbnMuY29uY3VycmVuY3kpO1xuICAgICAgICAgICAgZm9yIChsZXQgb2ZmID0gb2Zmc2V0OyBvZmYgPCBvZmZzZXQgKyBjb3VudDsgb2ZmID0gb2ZmICsgYmxvY2tTaXplKSB7XG4gICAgICAgICAgICAgICAgYmF0Y2guYWRkT3BlcmF0aW9uKGFzeW5jICgpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgLy8gRXhjbHVzaXZlIGNodW5rIGVuZCBwb3NpdGlvblxuICAgICAgICAgICAgICAgICAgICBsZXQgY2h1bmtFbmQgPSBvZmZzZXQgKyBjb3VudDtcbiAgICAgICAgICAgICAgICAgICAgaWYgKG9mZiArIGJsb2NrU2l6ZSA8IGNodW5rRW5kKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBjaHVua0VuZCA9IG9mZiArIGJsb2NrU2l6ZTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBjb25zdCByZXNwb25zZSA9IGF3YWl0IHRoaXMuZG93bmxvYWQob2ZmLCBjaHVua0VuZCAtIG9mZiwge1xuICAgICAgICAgICAgICAgICAgICAgICAgYWJvcnRTaWduYWw6IG9wdGlvbnMuYWJvcnRTaWduYWwsXG4gICAgICAgICAgICAgICAgICAgICAgICBjb25kaXRpb25zOiBvcHRpb25zLmNvbmRpdGlvbnMsXG4gICAgICAgICAgICAgICAgICAgICAgICBtYXhSZXRyeVJlcXVlc3RzOiBvcHRpb25zLm1heFJldHJ5UmVxdWVzdHNQZXJCbG9jayxcbiAgICAgICAgICAgICAgICAgICAgICAgIGN1c3RvbWVyUHJvdmlkZWRLZXk6IG9wdGlvbnMuY3VzdG9tZXJQcm92aWRlZEtleSxcbiAgICAgICAgICAgICAgICAgICAgICAgIHRyYWNpbmdPcHRpb25zOiB1cGRhdGVkT3B0aW9ucy50cmFjaW5nT3B0aW9ucyxcbiAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0cmVhbSA9IHJlc3BvbnNlLnJlYWRhYmxlU3RyZWFtQm9keTtcbiAgICAgICAgICAgICAgICAgICAgYXdhaXQgc3RyZWFtVG9CdWZmZXIoc3RyZWFtLCBidWZmZXIsIG9mZiAtIG9mZnNldCwgY2h1bmtFbmQgLSBvZmZzZXQpO1xuICAgICAgICAgICAgICAgICAgICAvLyBVcGRhdGUgcHJvZ3Jlc3MgYWZ0ZXIgYmxvY2sgaXMgZG93bmxvYWRlZCwgaW4gY2FzZSBvZiBibG9jayB0cnlpbmdcbiAgICAgICAgICAgICAgICAgICAgLy8gQ291bGQgcHJvdmlkZSBmaW5lciBncmFpbmVkIHByb2dyZXNzIHVwZGF0aW5nIGluc2lkZSBIVFRQIHJlcXVlc3RzLFxuICAgICAgICAgICAgICAgICAgICAvLyBvbmx5IGlmIGNvbnZlbmllbmNlIGxheWVyIGRvd25sb2FkIHRyeSBpcyBlbmFibGVkXG4gICAgICAgICAgICAgICAgICAgIHRyYW5zZmVyUHJvZ3Jlc3MgKz0gY2h1bmtFbmQgLSBvZmY7XG4gICAgICAgICAgICAgICAgICAgIGlmIChvcHRpb25zLm9uUHJvZ3Jlc3MpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIG9wdGlvbnMub25Qcm9ncmVzcyh7IGxvYWRlZEJ5dGVzOiB0cmFuc2ZlclByb2dyZXNzIH0pO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBhd2FpdCBiYXRjaC5kbygpO1xuICAgICAgICAgICAgcmV0dXJuIGJ1ZmZlcjtcbiAgICAgICAgfSk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIE9OTFkgQVZBSUxBQkxFIElOIE5PREUuSlMgUlVOVElNRS5cbiAgICAgKlxuICAgICAqIERvd25sb2FkcyBhbiBBenVyZSBCbG9iIHRvIGEgbG9jYWwgZmlsZS5cbiAgICAgKiBGYWlscyBpZiB0aGUgdGhlIGdpdmVuIGZpbGUgcGF0aCBhbHJlYWR5IGV4aXRzLlxuICAgICAqIE9mZnNldCBhbmQgY291bnQgYXJlIG9wdGlvbmFsLCBwYXNzIDAgYW5kIHVuZGVmaW5lZCByZXNwZWN0aXZlbHkgdG8gZG93bmxvYWQgdGhlIGVudGlyZSBibG9iLlxuICAgICAqXG4gICAgICogQHBhcmFtIGZpbGVQYXRoIC1cbiAgICAgKiBAcGFyYW0gb2Zmc2V0IC0gRnJvbSB3aGljaCBwb3NpdGlvbiBvZiB0aGUgYmxvY2sgYmxvYiB0byBkb3dubG9hZC5cbiAgICAgKiBAcGFyYW0gY291bnQgLSBIb3cgbXVjaCBkYXRhIHRvIGJlIGRvd25sb2FkZWQuIFdpbGwgZG93bmxvYWQgdG8gdGhlIGVuZCB3aGVuIHBhc3NpbmcgdW5kZWZpbmVkLlxuICAgICAqIEBwYXJhbSBvcHRpb25zIC0gT3B0aW9ucyB0byBCbG9iIGRvd25sb2FkIG9wdGlvbnMuXG4gICAgICogQHJldHVybnMgVGhlIHJlc3BvbnNlIGRhdGEgZm9yIGJsb2IgZG93bmxvYWQgb3BlcmF0aW9uLFxuICAgICAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJ1dCB3aXRoIHJlYWRhYmxlU3RyZWFtQm9keSBzZXQgdG8gdW5kZWZpbmVkIHNpbmNlIGl0c1xuICAgICAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRlbnQgaXMgYWxyZWFkeSByZWFkIGFuZCB3cml0dGVuIGludG8gYSBsb2NhbCBmaWxlXG4gICAgICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXQgdGhlIHNwZWNpZmllZCBwYXRoLlxuICAgICAqL1xuICAgIGFzeW5jIGRvd25sb2FkVG9GaWxlKGZpbGVQYXRoLCBvZmZzZXQgPSAwLCBjb3VudCwgb3B0aW9ucyA9IHt9KSB7XG4gICAgICAgIHJldHVybiB0cmFjaW5nQ2xpZW50LndpdGhTcGFuKFwiQmxvYkNsaWVudC1kb3dubG9hZFRvRmlsZVwiLCBvcHRpb25zLCBhc3luYyAodXBkYXRlZE9wdGlvbnMpID0+IHtcbiAgICAgICAgICAgIGNvbnN0IHJlc3BvbnNlID0gYXdhaXQgdGhpcy5kb3dubG9hZChvZmZzZXQsIGNvdW50LCBPYmplY3QuYXNzaWduKE9iamVjdC5hc3NpZ24oe30sIG9wdGlvbnMpLCB7IHRyYWNpbmdPcHRpb25zOiB1cGRhdGVkT3B0aW9ucy50cmFjaW5nT3B0aW9ucyB9KSk7XG4gICAgICAgICAgICBpZiAocmVzcG9uc2UucmVhZGFibGVTdHJlYW1Cb2R5KSB7XG4gICAgICAgICAgICAgICAgYXdhaXQgcmVhZFN0cmVhbVRvTG9jYWxGaWxlKHJlc3BvbnNlLnJlYWRhYmxlU3RyZWFtQm9keSwgZmlsZVBhdGgpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgLy8gVGhlIHN0cmVhbSBpcyBubyBsb25nZXIgYWNjZXNzaWJsZSBzbyBzZXR0aW5nIGl0IHRvIHVuZGVmaW5lZC5cbiAgICAgICAgICAgIHJlc3BvbnNlLmJsb2JEb3dubG9hZFN0cmVhbSA9IHVuZGVmaW5lZDtcbiAgICAgICAgICAgIHJldHVybiByZXNwb25zZTtcbiAgICAgICAgfSk7XG4gICAgfVxuICAgIGdldEJsb2JBbmRDb250YWluZXJOYW1lc0Zyb21VcmwoKSB7XG4gICAgICAgIGxldCBjb250YWluZXJOYW1lO1xuICAgICAgICBsZXQgYmxvYk5hbWU7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgICAvLyAgVVJMIG1heSBsb29rIGxpa2UgdGhlIGZvbGxvd2luZ1xuICAgICAgICAgICAgLy8gXCJodHRwczovL215YWNjb3VudC5ibG9iLmNvcmUud2luZG93cy5uZXQvbXljb250YWluZXIvYmxvYj9zYXNTdHJpbmdcIjtcbiAgICAgICAgICAgIC8vIFwiaHR0cHM6Ly9teWFjY291bnQuYmxvYi5jb3JlLndpbmRvd3MubmV0L215Y29udGFpbmVyL2Jsb2JcIjtcbiAgICAgICAgICAgIC8vIFwiaHR0cHM6Ly9teWFjY291bnQuYmxvYi5jb3JlLndpbmRvd3MubmV0L215Y29udGFpbmVyL2Jsb2IvYS50eHQ/c2FzU3RyaW5nXCI7XG4gICAgICAgICAgICAvLyBcImh0dHBzOi8vbXlhY2NvdW50LmJsb2IuY29yZS53aW5kb3dzLm5ldC9teWNvbnRhaW5lci9ibG9iL2EudHh0XCI7XG4gICAgICAgICAgICAvLyBJUHY0L0lQdjYgYWRkcmVzcyBob3N0cywgRW5kcG9pbnRzIC0gYGh0dHA6Ly8xMjcuMC4wLjE6MTAwMDAvZGV2c3RvcmVhY2NvdW50MS9jb250YWluZXJuYW1lL2Jsb2JgXG4gICAgICAgICAgICAvLyBodHRwOi8vbG9jYWxob3N0OjEwMDAxL2RldnN0b3JlYWNjb3VudDEvY29udGFpbmVybmFtZS9ibG9iXG4gICAgICAgICAgICBjb25zdCBwYXJzZWRVcmwgPSBuZXcgVVJMKHRoaXMudXJsKTtcbiAgICAgICAgICAgIGlmIChwYXJzZWRVcmwuaG9zdC5zcGxpdChcIi5cIilbMV0gPT09IFwiYmxvYlwiKSB7XG4gICAgICAgICAgICAgICAgLy8gXCJodHRwczovL215YWNjb3VudC5ibG9iLmNvcmUud2luZG93cy5uZXQvY29udGFpbmVybmFtZS9ibG9iXCIuXG4gICAgICAgICAgICAgICAgLy8gLmdldFBhdGgoKSAtPiAvY29udGFpbmVybmFtZS9ibG9iXG4gICAgICAgICAgICAgICAgY29uc3QgcGF0aENvbXBvbmVudHMgPSBwYXJzZWRVcmwucGF0aG5hbWUubWF0Y2goXCIvKFteL10qKSgvKC4qKSk/XCIpO1xuICAgICAgICAgICAgICAgIGNvbnRhaW5lck5hbWUgPSBwYXRoQ29tcG9uZW50c1sxXTtcbiAgICAgICAgICAgICAgICBibG9iTmFtZSA9IHBhdGhDb21wb25lbnRzWzNdO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSBpZiAoaXNJcEVuZHBvaW50U3R5bGUocGFyc2VkVXJsKSkge1xuICAgICAgICAgICAgICAgIC8vIElQdjQvSVB2NiBhZGRyZXNzIGhvc3RzLi4uIEV4YW1wbGUgLSBodHRwOi8vMTkyLjAuMC4xMDoxMDAwMS9kZXZzdG9yZWFjY291bnQxL2NvbnRhaW5lcm5hbWUvYmxvYlxuICAgICAgICAgICAgICAgIC8vIFNpbmdsZSB3b3JkIGRvbWFpbiB3aXRob3V0IGEgW2RvdF0gaW4gdGhlIGVuZHBvaW50Li4uIEV4YW1wbGUgLSBodHRwOi8vbG9jYWxob3N0OjEwMDAxL2RldnN0b3JlYWNjb3VudDEvY29udGFpbmVybmFtZS9ibG9iXG4gICAgICAgICAgICAgICAgLy8gLmdldFBhdGgoKSAtPiAvZGV2c3RvcmVhY2NvdW50MS9jb250YWluZXJuYW1lL2Jsb2JcbiAgICAgICAgICAgICAgICBjb25zdCBwYXRoQ29tcG9uZW50cyA9IHBhcnNlZFVybC5wYXRobmFtZS5tYXRjaChcIi8oW14vXSopLyhbXi9dKikoLyguKikpP1wiKTtcbiAgICAgICAgICAgICAgICBjb250YWluZXJOYW1lID0gcGF0aENvbXBvbmVudHNbMl07XG4gICAgICAgICAgICAgICAgYmxvYk5hbWUgPSBwYXRoQ29tcG9uZW50c1s0XTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgIC8vIFwiaHR0cHM6Ly9jdXN0b21kb21haW4uY29tL2NvbnRhaW5lcm5hbWUvYmxvYlwiLlxuICAgICAgICAgICAgICAgIC8vIC5nZXRQYXRoKCkgLT4gL2NvbnRhaW5lcm5hbWUvYmxvYlxuICAgICAgICAgICAgICAgIGNvbnN0IHBhdGhDb21wb25lbnRzID0gcGFyc2VkVXJsLnBhdGhuYW1lLm1hdGNoKFwiLyhbXi9dKikoLyguKikpP1wiKTtcbiAgICAgICAgICAgICAgICBjb250YWluZXJOYW1lID0gcGF0aENvbXBvbmVudHNbMV07XG4gICAgICAgICAgICAgICAgYmxvYk5hbWUgPSBwYXRoQ29tcG9uZW50c1szXTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIC8vIGRlY29kZSB0aGUgZW5jb2RlZCBibG9iTmFtZSwgY29udGFpbmVyTmFtZSAtIHRvIGdldCBhbGwgdGhlIHNwZWNpYWwgY2hhcmFjdGVycyB0aGF0IG1pZ2h0IGJlIHByZXNlbnQgaW4gdGhlbVxuICAgICAgICAgICAgY29udGFpbmVyTmFtZSA9IGRlY29kZVVSSUNvbXBvbmVudChjb250YWluZXJOYW1lKTtcbiAgICAgICAgICAgIGJsb2JOYW1lID0gZGVjb2RlVVJJQ29tcG9uZW50KGJsb2JOYW1lKTtcbiAgICAgICAgICAgIC8vIEF6dXJlIFN0b3JhZ2UgU2VydmVyIHdpbGwgcmVwbGFjZSBcIlxcXCIgd2l0aCBcIi9cIiBpbiB0aGUgYmxvYiBuYW1lc1xuICAgICAgICAgICAgLy8gICBkb2luZyB0aGUgc2FtZSBpbiB0aGUgU0RLIHNpZGUgc28gdGhhdCB0aGUgdXNlciBkb2Vzbid0IGhhdmUgdG8gcmVwbGFjZSBcIlxcXCIgaW5zdGFuY2VzIGluIHRoZSBibG9iTmFtZVxuICAgICAgICAgICAgYmxvYk5hbWUgPSBibG9iTmFtZS5yZXBsYWNlKC9cXFxcL2csIFwiL1wiKTtcbiAgICAgICAgICAgIGlmICghY29udGFpbmVyTmFtZSkge1xuICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihcIlByb3ZpZGVkIGNvbnRhaW5lck5hbWUgaXMgaW52YWxpZC5cIik7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4geyBibG9iTmFtZSwgY29udGFpbmVyTmFtZSB9O1xuICAgICAgICB9XG4gICAgICAgIGNhdGNoIChlcnJvcikge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwiVW5hYmxlIHRvIGV4dHJhY3QgYmxvYk5hbWUgYW5kIGNvbnRhaW5lck5hbWUgd2l0aCBwcm92aWRlZCBpbmZvcm1hdGlvbi5cIik7XG4gICAgICAgIH1cbiAgICB9XG4gICAgLyoqXG4gICAgICogQXN5bmNocm9ub3VzbHkgY29waWVzIGEgYmxvYiB0byBhIGRlc3RpbmF0aW9uIHdpdGhpbiB0aGUgc3RvcmFnZSBhY2NvdW50LlxuICAgICAqIEluIHZlcnNpb24gMjAxMi0wMi0xMiBhbmQgbGF0ZXIsIHRoZSBzb3VyY2UgZm9yIGEgQ29weSBCbG9iIG9wZXJhdGlvbiBjYW4gYmVcbiAgICAgKiBhIGNvbW1pdHRlZCBibG9iIGluIGFueSBBenVyZSBzdG9yYWdlIGFjY291bnQuXG4gICAgICogQmVnaW5uaW5nIHdpdGggdmVyc2lvbiAyMDE1LTAyLTIxLCB0aGUgc291cmNlIGZvciBhIENvcHkgQmxvYiBvcGVyYXRpb24gY2FuIGJlXG4gICAgICogYW4gQXp1cmUgZmlsZSBpbiBhbnkgQXp1cmUgc3RvcmFnZSBhY2NvdW50LlxuICAgICAqIE9ubHkgc3RvcmFnZSBhY2NvdW50cyBjcmVhdGVkIG9uIG9yIGFmdGVyIEp1bmUgN3RoLCAyMDEyIGFsbG93IHRoZSBDb3B5IEJsb2JcbiAgICAgKiBvcGVyYXRpb24gdG8gY29weSBmcm9tIGFub3RoZXIgc3RvcmFnZSBhY2NvdW50LlxuICAgICAqIEBzZWUgaHR0cHM6Ly9kb2NzLm1pY3Jvc29mdC5jb20vZW4tdXMvcmVzdC9hcGkvc3RvcmFnZXNlcnZpY2VzL2NvcHktYmxvYlxuICAgICAqXG4gICAgICogQHBhcmFtIGNvcHlTb3VyY2UgLSB1cmwgdG8gdGhlIHNvdXJjZSBBenVyZSBCbG9iL0ZpbGUuXG4gICAgICogQHBhcmFtIG9wdGlvbnMgLSBPcHRpb25hbCBvcHRpb25zIHRvIHRoZSBCbG9iIFN0YXJ0IENvcHkgRnJvbSBVUkwgb3BlcmF0aW9uLlxuICAgICAqL1xuICAgIGFzeW5jIHN0YXJ0Q29weUZyb21VUkwoY29weVNvdXJjZSwgb3B0aW9ucyA9IHt9KSB7XG4gICAgICAgIHJldHVybiB0cmFjaW5nQ2xpZW50LndpdGhTcGFuKFwiQmxvYkNsaWVudC1zdGFydENvcHlGcm9tVVJMXCIsIG9wdGlvbnMsIGFzeW5jICh1cGRhdGVkT3B0aW9ucykgPT4ge1xuICAgICAgICAgICAgdmFyIF9hLCBfYiwgX2M7XG4gICAgICAgICAgICBvcHRpb25zLmNvbmRpdGlvbnMgPSBvcHRpb25zLmNvbmRpdGlvbnMgfHwge307XG4gICAgICAgICAgICBvcHRpb25zLnNvdXJjZUNvbmRpdGlvbnMgPSBvcHRpb25zLnNvdXJjZUNvbmRpdGlvbnMgfHwge307XG4gICAgICAgICAgICByZXR1cm4gYXNzZXJ0UmVzcG9uc2UoYXdhaXQgdGhpcy5ibG9iQ29udGV4dC5zdGFydENvcHlGcm9tVVJMKGNvcHlTb3VyY2UsIHtcbiAgICAgICAgICAgICAgICBhYm9ydFNpZ25hbDogb3B0aW9ucy5hYm9ydFNpZ25hbCxcbiAgICAgICAgICAgICAgICBsZWFzZUFjY2Vzc0NvbmRpdGlvbnM6IG9wdGlvbnMuY29uZGl0aW9ucyxcbiAgICAgICAgICAgICAgICBtZXRhZGF0YTogb3B0aW9ucy5tZXRhZGF0YSxcbiAgICAgICAgICAgICAgICBtb2RpZmllZEFjY2Vzc0NvbmRpdGlvbnM6IE9iamVjdC5hc3NpZ24oT2JqZWN0LmFzc2lnbih7fSwgb3B0aW9ucy5jb25kaXRpb25zKSwgeyBpZlRhZ3M6IChfYSA9IG9wdGlvbnMuY29uZGl0aW9ucykgPT09IG51bGwgfHwgX2EgPT09IHZvaWQgMCA/IHZvaWQgMCA6IF9hLnRhZ0NvbmRpdGlvbnMgfSksXG4gICAgICAgICAgICAgICAgc291cmNlTW9kaWZpZWRBY2Nlc3NDb25kaXRpb25zOiB7XG4gICAgICAgICAgICAgICAgICAgIHNvdXJjZUlmTWF0Y2g6IG9wdGlvbnMuc291cmNlQ29uZGl0aW9ucy5pZk1hdGNoLFxuICAgICAgICAgICAgICAgICAgICBzb3VyY2VJZk1vZGlmaWVkU2luY2U6IG9wdGlvbnMuc291cmNlQ29uZGl0aW9ucy5pZk1vZGlmaWVkU2luY2UsXG4gICAgICAgICAgICAgICAgICAgIHNvdXJjZUlmTm9uZU1hdGNoOiBvcHRpb25zLnNvdXJjZUNvbmRpdGlvbnMuaWZOb25lTWF0Y2gsXG4gICAgICAgICAgICAgICAgICAgIHNvdXJjZUlmVW5tb2RpZmllZFNpbmNlOiBvcHRpb25zLnNvdXJjZUNvbmRpdGlvbnMuaWZVbm1vZGlmaWVkU2luY2UsXG4gICAgICAgICAgICAgICAgICAgIHNvdXJjZUlmVGFnczogb3B0aW9ucy5zb3VyY2VDb25kaXRpb25zLnRhZ0NvbmRpdGlvbnMsXG4gICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICBpbW11dGFiaWxpdHlQb2xpY3lFeHBpcnk6IChfYiA9IG9wdGlvbnMuaW1tdXRhYmlsaXR5UG9saWN5KSA9PT0gbnVsbCB8fCBfYiA9PT0gdm9pZCAwID8gdm9pZCAwIDogX2IuZXhwaXJpZXNPbixcbiAgICAgICAgICAgICAgICBpbW11dGFiaWxpdHlQb2xpY3lNb2RlOiAoX2MgPSBvcHRpb25zLmltbXV0YWJpbGl0eVBvbGljeSkgPT09IG51bGwgfHwgX2MgPT09IHZvaWQgMCA/IHZvaWQgMCA6IF9jLnBvbGljeU1vZGUsXG4gICAgICAgICAgICAgICAgbGVnYWxIb2xkOiBvcHRpb25zLmxlZ2FsSG9sZCxcbiAgICAgICAgICAgICAgICByZWh5ZHJhdGVQcmlvcml0eTogb3B0aW9ucy5yZWh5ZHJhdGVQcmlvcml0eSxcbiAgICAgICAgICAgICAgICB0aWVyOiB0b0FjY2Vzc1RpZXIob3B0aW9ucy50aWVyKSxcbiAgICAgICAgICAgICAgICBibG9iVGFnc1N0cmluZzogdG9CbG9iVGFnc1N0cmluZyhvcHRpb25zLnRhZ3MpLFxuICAgICAgICAgICAgICAgIHNlYWxCbG9iOiBvcHRpb25zLnNlYWxCbG9iLFxuICAgICAgICAgICAgICAgIHRyYWNpbmdPcHRpb25zOiB1cGRhdGVkT3B0aW9ucy50cmFjaW5nT3B0aW9ucyxcbiAgICAgICAgICAgIH0pKTtcbiAgICAgICAgfSk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIE9ubHkgYXZhaWxhYmxlIGZvciBCbG9iQ2xpZW50IGNvbnN0cnVjdGVkIHdpdGggYSBzaGFyZWQga2V5IGNyZWRlbnRpYWwuXG4gICAgICpcbiAgICAgKiBHZW5lcmF0ZXMgYSBCbG9iIFNlcnZpY2UgU2hhcmVkIEFjY2VzcyBTaWduYXR1cmUgKFNBUykgVVJJIGJhc2VkIG9uIHRoZSBjbGllbnQgcHJvcGVydGllc1xuICAgICAqIGFuZCBwYXJhbWV0ZXJzIHBhc3NlZCBpbi4gVGhlIFNBUyBpcyBzaWduZWQgYnkgdGhlIHNoYXJlZCBrZXkgY3JlZGVudGlhbCBvZiB0aGUgY2xpZW50LlxuICAgICAqXG4gICAgICogQHNlZSBodHRwczovL2RvY3MubWljcm9zb2Z0LmNvbS9lbi11cy9yZXN0L2FwaS9zdG9yYWdlc2VydmljZXMvY29uc3RydWN0aW5nLWEtc2VydmljZS1zYXNcbiAgICAgKlxuICAgICAqIEBwYXJhbSBvcHRpb25zIC0gT3B0aW9uYWwgcGFyYW1ldGVycy5cbiAgICAgKiBAcmV0dXJucyBUaGUgU0FTIFVSSSBjb25zaXN0aW5nIG9mIHRoZSBVUkkgdG8gdGhlIHJlc291cmNlIHJlcHJlc2VudGVkIGJ5IHRoaXMgY2xpZW50LCBmb2xsb3dlZCBieSB0aGUgZ2VuZXJhdGVkIFNBUyB0b2tlbi5cbiAgICAgKi9cbiAgICBnZW5lcmF0ZVNhc1VybChvcHRpb25zKSB7XG4gICAgICAgIHJldHVybiBuZXcgUHJvbWlzZSgocmVzb2x2ZSkgPT4ge1xuICAgICAgICAgICAgaWYgKCEodGhpcy5jcmVkZW50aWFsIGluc3RhbmNlb2YgU3RvcmFnZVNoYXJlZEtleUNyZWRlbnRpYWwpKSB7XG4gICAgICAgICAgICAgICAgdGhyb3cgbmV3IFJhbmdlRXJyb3IoXCJDYW4gb25seSBnZW5lcmF0ZSB0aGUgU0FTIHdoZW4gdGhlIGNsaWVudCBpcyBpbml0aWFsaXplZCB3aXRoIGEgc2hhcmVkIGtleSBjcmVkZW50aWFsXCIpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgY29uc3Qgc2FzID0gZ2VuZXJhdGVCbG9iU0FTUXVlcnlQYXJhbWV0ZXJzKE9iamVjdC5hc3NpZ24oeyBjb250YWluZXJOYW1lOiB0aGlzLl9jb250YWluZXJOYW1lLCBibG9iTmFtZTogdGhpcy5fbmFtZSwgc25hcHNob3RUaW1lOiB0aGlzLl9zbmFwc2hvdCwgdmVyc2lvbklkOiB0aGlzLl92ZXJzaW9uSWQgfSwgb3B0aW9ucyksIHRoaXMuY3JlZGVudGlhbCkudG9TdHJpbmcoKTtcbiAgICAgICAgICAgIHJlc29sdmUoYXBwZW5kVG9VUkxRdWVyeSh0aGlzLnVybCwgc2FzKSk7XG4gICAgICAgIH0pO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBPbmx5IGF2YWlsYWJsZSBmb3IgQmxvYkNsaWVudCBjb25zdHJ1Y3RlZCB3aXRoIGEgc2hhcmVkIGtleSBjcmVkZW50aWFsLlxuICAgICAqXG4gICAgICogR2VuZXJhdGVzIHN0cmluZyB0byBzaWduIGZvciBhIEJsb2IgU2VydmljZSBTaGFyZWQgQWNjZXNzIFNpZ25hdHVyZSAoU0FTKSBVUkkgYmFzZWQgb25cbiAgICAgKiB0aGUgY2xpZW50IHByb3BlcnRpZXMgYW5kIHBhcmFtZXRlcnMgcGFzc2VkIGluLiBUaGUgU0FTIGlzIHNpZ25lZCBieSB0aGUgc2hhcmVkIGtleSBjcmVkZW50aWFsIG9mIHRoZSBjbGllbnQuXG4gICAgICpcbiAgICAgKiBAc2VlIGh0dHBzOi8vZG9jcy5taWNyb3NvZnQuY29tL2VuLXVzL3Jlc3QvYXBpL3N0b3JhZ2VzZXJ2aWNlcy9jb25zdHJ1Y3RpbmctYS1zZXJ2aWNlLXNhc1xuICAgICAqXG4gICAgICogQHBhcmFtIG9wdGlvbnMgLSBPcHRpb25hbCBwYXJhbWV0ZXJzLlxuICAgICAqIEByZXR1cm5zIFRoZSBTQVMgVVJJIGNvbnNpc3Rpbmcgb2YgdGhlIFVSSSB0byB0aGUgcmVzb3VyY2UgcmVwcmVzZW50ZWQgYnkgdGhpcyBjbGllbnQsIGZvbGxvd2VkIGJ5IHRoZSBnZW5lcmF0ZWQgU0FTIHRva2VuLlxuICAgICAqL1xuICAgIC8qIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAYXp1cmUvYXp1cmUtc2RrL3RzLW5hbWluZy1vcHRpb25zKi9cbiAgICBnZW5lcmF0ZVNhc1N0cmluZ1RvU2lnbihvcHRpb25zKSB7XG4gICAgICAgIGlmICghKHRoaXMuY3JlZGVudGlhbCBpbnN0YW5jZW9mIFN0b3JhZ2VTaGFyZWRLZXlDcmVkZW50aWFsKSkge1xuICAgICAgICAgICAgdGhyb3cgbmV3IFJhbmdlRXJyb3IoXCJDYW4gb25seSBnZW5lcmF0ZSB0aGUgU0FTIHdoZW4gdGhlIGNsaWVudCBpcyBpbml0aWFsaXplZCB3aXRoIGEgc2hhcmVkIGtleSBjcmVkZW50aWFsXCIpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBnZW5lcmF0ZUJsb2JTQVNRdWVyeVBhcmFtZXRlcnNJbnRlcm5hbChPYmplY3QuYXNzaWduKHsgY29udGFpbmVyTmFtZTogdGhpcy5fY29udGFpbmVyTmFtZSwgYmxvYk5hbWU6IHRoaXMuX25hbWUsIHNuYXBzaG90VGltZTogdGhpcy5fc25hcHNob3QsIHZlcnNpb25JZDogdGhpcy5fdmVyc2lvbklkIH0sIG9wdGlvbnMpLCB0aGlzLmNyZWRlbnRpYWwpLnN0cmluZ1RvU2lnbjtcbiAgICB9XG4gICAgLyoqXG4gICAgICogRGVsZXRlIHRoZSBpbW11dGFibGlsaXR5IHBvbGljeSBvbiB0aGUgYmxvYi5cbiAgICAgKlxuICAgICAqIEBwYXJhbSBvcHRpb25zIC0gT3B0aW9uYWwgb3B0aW9ucyB0byBkZWxldGUgaW1tdXRhYmlsaXR5IHBvbGljeSBvbiB0aGUgYmxvYi5cbiAgICAgKi9cbiAgICBhc3luYyBkZWxldGVJbW11dGFiaWxpdHlQb2xpY3kob3B0aW9ucyA9IHt9KSB7XG4gICAgICAgIHJldHVybiB0cmFjaW5nQ2xpZW50LndpdGhTcGFuKFwiQmxvYkNsaWVudC1kZWxldGVJbW11dGFiaWxpdHlQb2xpY3lcIiwgb3B0aW9ucywgYXN5bmMgKHVwZGF0ZWRPcHRpb25zKSA9PiB7XG4gICAgICAgICAgICByZXR1cm4gYXNzZXJ0UmVzcG9uc2UoYXdhaXQgdGhpcy5ibG9iQ29udGV4dC5kZWxldGVJbW11dGFiaWxpdHlQb2xpY3koe1xuICAgICAgICAgICAgICAgIHRyYWNpbmdPcHRpb25zOiB1cGRhdGVkT3B0aW9ucy50cmFjaW5nT3B0aW9ucyxcbiAgICAgICAgICAgIH0pKTtcbiAgICAgICAgfSk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIFNldCBpbW11dGFiaWxpdHkgcG9saWN5IG9uIHRoZSBibG9iLlxuICAgICAqXG4gICAgICogQHBhcmFtIG9wdGlvbnMgLSBPcHRpb25hbCBvcHRpb25zIHRvIHNldCBpbW11dGFiaWxpdHkgcG9saWN5IG9uIHRoZSBibG9iLlxuICAgICAqL1xuICAgIGFzeW5jIHNldEltbXV0YWJpbGl0eVBvbGljeShpbW11dGFiaWxpdHlQb2xpY3ksIG9wdGlvbnMgPSB7fSkge1xuICAgICAgICByZXR1cm4gdHJhY2luZ0NsaWVudC53aXRoU3BhbihcIkJsb2JDbGllbnQtc2V0SW1tdXRhYmlsaXR5UG9saWN5XCIsIG9wdGlvbnMsIGFzeW5jICh1cGRhdGVkT3B0aW9ucykgPT4ge1xuICAgICAgICAgICAgcmV0dXJuIGFzc2VydFJlc3BvbnNlKGF3YWl0IHRoaXMuYmxvYkNvbnRleHQuc2V0SW1tdXRhYmlsaXR5UG9saWN5KHtcbiAgICAgICAgICAgICAgICBpbW11dGFiaWxpdHlQb2xpY3lFeHBpcnk6IGltbXV0YWJpbGl0eVBvbGljeS5leHBpcmllc09uLFxuICAgICAgICAgICAgICAgIGltbXV0YWJpbGl0eVBvbGljeU1vZGU6IGltbXV0YWJpbGl0eVBvbGljeS5wb2xpY3lNb2RlLFxuICAgICAgICAgICAgICAgIHRyYWNpbmdPcHRpb25zOiB1cGRhdGVkT3B0aW9ucy50cmFjaW5nT3B0aW9ucyxcbiAgICAgICAgICAgIH0pKTtcbiAgICAgICAgfSk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIFNldCBsZWdhbCBob2xkIG9uIHRoZSBibG9iLlxuICAgICAqXG4gICAgICogQHBhcmFtIG9wdGlvbnMgLSBPcHRpb25hbCBvcHRpb25zIHRvIHNldCBsZWdhbCBob2xkIG9uIHRoZSBibG9iLlxuICAgICAqL1xuICAgIGFzeW5jIHNldExlZ2FsSG9sZChsZWdhbEhvbGRFbmFibGVkLCBvcHRpb25zID0ge30pIHtcbiAgICAgICAgcmV0dXJuIHRyYWNpbmdDbGllbnQud2l0aFNwYW4oXCJCbG9iQ2xpZW50LXNldExlZ2FsSG9sZFwiLCBvcHRpb25zLCBhc3luYyAodXBkYXRlZE9wdGlvbnMpID0+IHtcbiAgICAgICAgICAgIHJldHVybiBhc3NlcnRSZXNwb25zZShhd2FpdCB0aGlzLmJsb2JDb250ZXh0LnNldExlZ2FsSG9sZChsZWdhbEhvbGRFbmFibGVkLCB7XG4gICAgICAgICAgICAgICAgdHJhY2luZ09wdGlvbnM6IHVwZGF0ZWRPcHRpb25zLnRyYWNpbmdPcHRpb25zLFxuICAgICAgICAgICAgfSkpO1xuICAgICAgICB9KTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogVGhlIEdldCBBY2NvdW50IEluZm9ybWF0aW9uIG9wZXJhdGlvbiByZXR1cm5zIHRoZSBza3UgbmFtZSBhbmQgYWNjb3VudCBraW5kXG4gICAgICogZm9yIHRoZSBzcGVjaWZpZWQgYWNjb3VudC5cbiAgICAgKiBUaGUgR2V0IEFjY291bnQgSW5mb3JtYXRpb24gb3BlcmF0aW9uIGlzIGF2YWlsYWJsZSBvbiBzZXJ2aWNlIHZlcnNpb25zIGJlZ2lubmluZ1xuICAgICAqIHdpdGggdmVyc2lvbiAyMDE4LTAzLTI4LlxuICAgICAqIEBzZWUgaHR0cHM6Ly9kb2NzLm1pY3Jvc29mdC5jb20vZW4tdXMvcmVzdC9hcGkvc3RvcmFnZXNlcnZpY2VzL2dldC1hY2NvdW50LWluZm9ybWF0aW9uXG4gICAgICpcbiAgICAgKiBAcGFyYW0gb3B0aW9ucyAtIE9wdGlvbnMgdG8gdGhlIFNlcnZpY2UgR2V0IEFjY291bnQgSW5mbyBvcGVyYXRpb24uXG4gICAgICogQHJldHVybnMgUmVzcG9uc2UgZGF0YSBmb3IgdGhlIFNlcnZpY2UgR2V0IEFjY291bnQgSW5mbyBvcGVyYXRpb24uXG4gICAgICovXG4gICAgYXN5bmMgZ2V0QWNjb3VudEluZm8ob3B0aW9ucyA9IHt9KSB7XG4gICAgICAgIHJldHVybiB0cmFjaW5nQ2xpZW50LndpdGhTcGFuKFwiQmxvYkNsaWVudC1nZXRBY2NvdW50SW5mb1wiLCBvcHRpb25zLCBhc3luYyAodXBkYXRlZE9wdGlvbnMpID0+IHtcbiAgICAgICAgICAgIHJldHVybiBhc3NlcnRSZXNwb25zZShhd2FpdCB0aGlzLmJsb2JDb250ZXh0LmdldEFjY291bnRJbmZvKHtcbiAgICAgICAgICAgICAgICBhYm9ydFNpZ25hbDogb3B0aW9ucy5hYm9ydFNpZ25hbCxcbiAgICAgICAgICAgICAgICB0cmFjaW5nT3B0aW9uczogdXBkYXRlZE9wdGlvbnMudHJhY2luZ09wdGlvbnMsXG4gICAgICAgICAgICB9KSk7XG4gICAgICAgIH0pO1xuICAgIH1cbn1cbi8qKlxuICogQXBwZW5kQmxvYkNsaWVudCBkZWZpbmVzIGEgc2V0IG9mIG9wZXJhdGlvbnMgYXBwbGljYWJsZSB0byBhcHBlbmQgYmxvYnMuXG4gKi9cbmNsYXNzIEFwcGVuZEJsb2JDbGllbnQgZXh0ZW5kcyBCbG9iQ2xpZW50IHtcbiAgICBjb25zdHJ1Y3Rvcih1cmxPckNvbm5lY3Rpb25TdHJpbmcsIGNyZWRlbnRpYWxPclBpcGVsaW5lT3JDb250YWluZXJOYW1lLCBibG9iTmFtZU9yT3B0aW9ucywgXG4gICAgLy8gTGVnYWN5LCBubyBmaXggZm9yIGVzbGludCBlcnJvciB3aXRob3V0IGJyZWFraW5nLiBEaXNhYmxlIGl0IGZvciB0aGlzIGludGVyZmFjZS5cbiAgICAvKiBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQGF6dXJlL2F6dXJlLXNkay90cy1uYW1pbmctb3B0aW9ucyovXG4gICAgb3B0aW9ucykge1xuICAgICAgICAvLyBJbiBUeXBlU2NyaXB0IHdlIGNhbm5vdCBzaW1wbHkgcGFzcyBhbGwgcGFyYW1ldGVycyB0byBzdXBlcigpIGxpa2UgYmVsb3cgc28gaGF2ZSB0byBkdXBsaWNhdGUgdGhlIGNvZGUgaW5zdGVhZC5cbiAgICAgICAgLy8gICBzdXBlcihzLCBjcmVkZW50aWFsT3JQaXBlbGluZU9yQ29udGFpbmVyTmFtZU9yT3B0aW9ucywgYmxvYk5hbWVPck9wdGlvbnMsIG9wdGlvbnMpO1xuICAgICAgICBsZXQgcGlwZWxpbmU7XG4gICAgICAgIGxldCB1cmw7XG4gICAgICAgIG9wdGlvbnMgPSBvcHRpb25zIHx8IHt9O1xuICAgICAgICBpZiAoaXNQaXBlbGluZUxpa2UoY3JlZGVudGlhbE9yUGlwZWxpbmVPckNvbnRhaW5lck5hbWUpKSB7XG4gICAgICAgICAgICAvLyAodXJsOiBzdHJpbmcsIHBpcGVsaW5lOiBQaXBlbGluZSlcbiAgICAgICAgICAgIHVybCA9IHVybE9yQ29ubmVjdGlvblN0cmluZztcbiAgICAgICAgICAgIHBpcGVsaW5lID0gY3JlZGVudGlhbE9yUGlwZWxpbmVPckNvbnRhaW5lck5hbWU7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSBpZiAoKGNvcmVVdGlsLmlzTm9kZSAmJiBjcmVkZW50aWFsT3JQaXBlbGluZU9yQ29udGFpbmVyTmFtZSBpbnN0YW5jZW9mIFN0b3JhZ2VTaGFyZWRLZXlDcmVkZW50aWFsKSB8fFxuICAgICAgICAgICAgY3JlZGVudGlhbE9yUGlwZWxpbmVPckNvbnRhaW5lck5hbWUgaW5zdGFuY2VvZiBBbm9ueW1vdXNDcmVkZW50aWFsIHx8XG4gICAgICAgICAgICBjb3JlQXV0aC5pc1Rva2VuQ3JlZGVudGlhbChjcmVkZW50aWFsT3JQaXBlbGluZU9yQ29udGFpbmVyTmFtZSkpIHtcbiAgICAgICAgICAgIC8vICh1cmw6IHN0cmluZywgY3JlZGVudGlhbD86IFN0b3JhZ2VTaGFyZWRLZXlDcmVkZW50aWFsIHwgQW5vbnltb3VzQ3JlZGVudGlhbCB8IFRva2VuQ3JlZGVudGlhbCwgb3B0aW9ucz86IFN0b3JhZ2VQaXBlbGluZU9wdGlvbnMpICAgICAgdXJsID0gdXJsT3JDb25uZWN0aW9uU3RyaW5nO1xuICAgICAgICAgICAgdXJsID0gdXJsT3JDb25uZWN0aW9uU3RyaW5nO1xuICAgICAgICAgICAgb3B0aW9ucyA9IGJsb2JOYW1lT3JPcHRpb25zO1xuICAgICAgICAgICAgcGlwZWxpbmUgPSBuZXdQaXBlbGluZShjcmVkZW50aWFsT3JQaXBlbGluZU9yQ29udGFpbmVyTmFtZSwgb3B0aW9ucyk7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSBpZiAoIWNyZWRlbnRpYWxPclBpcGVsaW5lT3JDb250YWluZXJOYW1lICYmXG4gICAgICAgICAgICB0eXBlb2YgY3JlZGVudGlhbE9yUGlwZWxpbmVPckNvbnRhaW5lck5hbWUgIT09IFwic3RyaW5nXCIpIHtcbiAgICAgICAgICAgIC8vICh1cmw6IHN0cmluZywgY3JlZGVudGlhbD86IFN0b3JhZ2VTaGFyZWRLZXlDcmVkZW50aWFsIHwgQW5vbnltb3VzQ3JlZGVudGlhbCB8IFRva2VuQ3JlZGVudGlhbCwgb3B0aW9ucz86IFN0b3JhZ2VQaXBlbGluZU9wdGlvbnMpXG4gICAgICAgICAgICB1cmwgPSB1cmxPckNvbm5lY3Rpb25TdHJpbmc7XG4gICAgICAgICAgICAvLyBUaGUgc2Vjb25kIHBhcmFtZXRlciBpcyB1bmRlZmluZWQuIFVzZSBhbm9ueW1vdXMgY3JlZGVudGlhbC5cbiAgICAgICAgICAgIHBpcGVsaW5lID0gbmV3UGlwZWxpbmUobmV3IEFub255bW91c0NyZWRlbnRpYWwoKSwgb3B0aW9ucyk7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSBpZiAoY3JlZGVudGlhbE9yUGlwZWxpbmVPckNvbnRhaW5lck5hbWUgJiZcbiAgICAgICAgICAgIHR5cGVvZiBjcmVkZW50aWFsT3JQaXBlbGluZU9yQ29udGFpbmVyTmFtZSA9PT0gXCJzdHJpbmdcIiAmJlxuICAgICAgICAgICAgYmxvYk5hbWVPck9wdGlvbnMgJiZcbiAgICAgICAgICAgIHR5cGVvZiBibG9iTmFtZU9yT3B0aW9ucyA9PT0gXCJzdHJpbmdcIikge1xuICAgICAgICAgICAgLy8gKGNvbm5lY3Rpb25TdHJpbmc6IHN0cmluZywgY29udGFpbmVyTmFtZTogc3RyaW5nLCBibG9iTmFtZTogc3RyaW5nLCBvcHRpb25zPzogU3RvcmFnZVBpcGVsaW5lT3B0aW9ucylcbiAgICAgICAgICAgIGNvbnN0IGNvbnRhaW5lck5hbWUgPSBjcmVkZW50aWFsT3JQaXBlbGluZU9yQ29udGFpbmVyTmFtZTtcbiAgICAgICAgICAgIGNvbnN0IGJsb2JOYW1lID0gYmxvYk5hbWVPck9wdGlvbnM7XG4gICAgICAgICAgICBjb25zdCBleHRyYWN0ZWRDcmVkcyA9IGV4dHJhY3RDb25uZWN0aW9uU3RyaW5nUGFydHModXJsT3JDb25uZWN0aW9uU3RyaW5nKTtcbiAgICAgICAgICAgIGlmIChleHRyYWN0ZWRDcmVkcy5raW5kID09PSBcIkFjY291bnRDb25uU3RyaW5nXCIpIHtcbiAgICAgICAgICAgICAgICBpZiAoY29yZVV0aWwuaXNOb2RlKSB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IHNoYXJlZEtleUNyZWRlbnRpYWwgPSBuZXcgU3RvcmFnZVNoYXJlZEtleUNyZWRlbnRpYWwoZXh0cmFjdGVkQ3JlZHMuYWNjb3VudE5hbWUsIGV4dHJhY3RlZENyZWRzLmFjY291bnRLZXkpO1xuICAgICAgICAgICAgICAgICAgICB1cmwgPSBhcHBlbmRUb1VSTFBhdGgoYXBwZW5kVG9VUkxQYXRoKGV4dHJhY3RlZENyZWRzLnVybCwgZW5jb2RlVVJJQ29tcG9uZW50KGNvbnRhaW5lck5hbWUpKSwgZW5jb2RlVVJJQ29tcG9uZW50KGJsb2JOYW1lKSk7XG4gICAgICAgICAgICAgICAgICAgIGlmICghb3B0aW9ucy5wcm94eU9wdGlvbnMpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIG9wdGlvbnMucHJveHlPcHRpb25zID0gY29yZVJlc3RQaXBlbGluZS5nZXREZWZhdWx0UHJveHlTZXR0aW5ncyhleHRyYWN0ZWRDcmVkcy5wcm94eVVyaSk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgcGlwZWxpbmUgPSBuZXdQaXBlbGluZShzaGFyZWRLZXlDcmVkZW50aWFsLCBvcHRpb25zKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihcIkFjY291bnQgY29ubmVjdGlvbiBzdHJpbmcgaXMgb25seSBzdXBwb3J0ZWQgaW4gTm9kZS5qcyBlbnZpcm9ubWVudFwiKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIGlmIChleHRyYWN0ZWRDcmVkcy5raW5kID09PSBcIlNBU0Nvbm5TdHJpbmdcIikge1xuICAgICAgICAgICAgICAgIHVybCA9XG4gICAgICAgICAgICAgICAgICAgIGFwcGVuZFRvVVJMUGF0aChhcHBlbmRUb1VSTFBhdGgoZXh0cmFjdGVkQ3JlZHMudXJsLCBlbmNvZGVVUklDb21wb25lbnQoY29udGFpbmVyTmFtZSkpLCBlbmNvZGVVUklDb21wb25lbnQoYmxvYk5hbWUpKSArXG4gICAgICAgICAgICAgICAgICAgICAgICBcIj9cIiArXG4gICAgICAgICAgICAgICAgICAgICAgICBleHRyYWN0ZWRDcmVkcy5hY2NvdW50U2FzO1xuICAgICAgICAgICAgICAgIHBpcGVsaW5lID0gbmV3UGlwZWxpbmUobmV3IEFub255bW91c0NyZWRlbnRpYWwoKSwgb3B0aW9ucyk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJDb25uZWN0aW9uIHN0cmluZyBtdXN0IGJlIGVpdGhlciBhbiBBY2NvdW50IGNvbm5lY3Rpb24gc3RyaW5nIG9yIGEgU0FTIGNvbm5lY3Rpb24gc3RyaW5nXCIpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwiRXhwZWN0aW5nIG5vbi1lbXB0eSBzdHJpbmdzIGZvciBjb250YWluZXJOYW1lIGFuZCBibG9iTmFtZSBwYXJhbWV0ZXJzXCIpO1xuICAgICAgICB9XG4gICAgICAgIHN1cGVyKHVybCwgcGlwZWxpbmUpO1xuICAgICAgICB0aGlzLmFwcGVuZEJsb2JDb250ZXh0ID0gdGhpcy5zdG9yYWdlQ2xpZW50Q29udGV4dC5hcHBlbmRCbG9iO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBDcmVhdGVzIGEgbmV3IEFwcGVuZEJsb2JDbGllbnQgb2JqZWN0IGlkZW50aWNhbCB0byB0aGUgc291cmNlIGJ1dCB3aXRoIHRoZVxuICAgICAqIHNwZWNpZmllZCBzbmFwc2hvdCB0aW1lc3RhbXAuXG4gICAgICogUHJvdmlkZSBcIlwiIHdpbGwgcmVtb3ZlIHRoZSBzbmFwc2hvdCBhbmQgcmV0dXJuIGEgQ2xpZW50IHRvIHRoZSBiYXNlIGJsb2IuXG4gICAgICpcbiAgICAgKiBAcGFyYW0gc25hcHNob3QgLSBUaGUgc25hcHNob3QgdGltZXN0YW1wLlxuICAgICAqIEByZXR1cm5zIEEgbmV3IEFwcGVuZEJsb2JDbGllbnQgb2JqZWN0IGlkZW50aWNhbCB0byB0aGUgc291cmNlIGJ1dCB3aXRoIHRoZSBzcGVjaWZpZWQgc25hcHNob3QgdGltZXN0YW1wLlxuICAgICAqL1xuICAgIHdpdGhTbmFwc2hvdChzbmFwc2hvdCkge1xuICAgICAgICByZXR1cm4gbmV3IEFwcGVuZEJsb2JDbGllbnQoc2V0VVJMUGFyYW1ldGVyKHRoaXMudXJsLCBVUkxDb25zdGFudHMuUGFyYW1ldGVycy5TTkFQU0hPVCwgc25hcHNob3QubGVuZ3RoID09PSAwID8gdW5kZWZpbmVkIDogc25hcHNob3QpLCB0aGlzLnBpcGVsaW5lKTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogQ3JlYXRlcyBhIDAtbGVuZ3RoIGFwcGVuZCBibG9iLiBDYWxsIEFwcGVuZEJsb2NrIHRvIGFwcGVuZCBkYXRhIHRvIGFuIGFwcGVuZCBibG9iLlxuICAgICAqIEBzZWUgaHR0cHM6Ly9kb2NzLm1pY3Jvc29mdC5jb20vcmVzdC9hcGkvc3RvcmFnZXNlcnZpY2VzL3B1dC1ibG9iXG4gICAgICpcbiAgICAgKiBAcGFyYW0gb3B0aW9ucyAtIE9wdGlvbnMgdG8gdGhlIEFwcGVuZCBCbG9jayBDcmVhdGUgb3BlcmF0aW9uLlxuICAgICAqXG4gICAgICpcbiAgICAgKiBFeGFtcGxlIHVzYWdlOlxuICAgICAqXG4gICAgICogYGBganNcbiAgICAgKiBjb25zdCBhcHBlbmRCbG9iQ2xpZW50ID0gY29udGFpbmVyQ2xpZW50LmdldEFwcGVuZEJsb2JDbGllbnQoXCI8YmxvYiBuYW1lPlwiKTtcbiAgICAgKiBhd2FpdCBhcHBlbmRCbG9iQ2xpZW50LmNyZWF0ZSgpO1xuICAgICAqIGBgYFxuICAgICAqL1xuICAgIGFzeW5jIGNyZWF0ZShvcHRpb25zID0ge30pIHtcbiAgICAgICAgb3B0aW9ucy5jb25kaXRpb25zID0gb3B0aW9ucy5jb25kaXRpb25zIHx8IHt9O1xuICAgICAgICBlbnN1cmVDcGtJZlNwZWNpZmllZChvcHRpb25zLmN1c3RvbWVyUHJvdmlkZWRLZXksIHRoaXMuaXNIdHRwcyk7XG4gICAgICAgIHJldHVybiB0cmFjaW5nQ2xpZW50LndpdGhTcGFuKFwiQXBwZW5kQmxvYkNsaWVudC1jcmVhdGVcIiwgb3B0aW9ucywgYXN5bmMgKHVwZGF0ZWRPcHRpb25zKSA9PiB7XG4gICAgICAgICAgICB2YXIgX2EsIF9iLCBfYztcbiAgICAgICAgICAgIHJldHVybiBhc3NlcnRSZXNwb25zZShhd2FpdCB0aGlzLmFwcGVuZEJsb2JDb250ZXh0LmNyZWF0ZSgwLCB7XG4gICAgICAgICAgICAgICAgYWJvcnRTaWduYWw6IG9wdGlvbnMuYWJvcnRTaWduYWwsXG4gICAgICAgICAgICAgICAgYmxvYkh0dHBIZWFkZXJzOiBvcHRpb25zLmJsb2JIVFRQSGVhZGVycyxcbiAgICAgICAgICAgICAgICBsZWFzZUFjY2Vzc0NvbmRpdGlvbnM6IG9wdGlvbnMuY29uZGl0aW9ucyxcbiAgICAgICAgICAgICAgICBtZXRhZGF0YTogb3B0aW9ucy5tZXRhZGF0YSxcbiAgICAgICAgICAgICAgICBtb2RpZmllZEFjY2Vzc0NvbmRpdGlvbnM6IE9iamVjdC5hc3NpZ24oT2JqZWN0LmFzc2lnbih7fSwgb3B0aW9ucy5jb25kaXRpb25zKSwgeyBpZlRhZ3M6IChfYSA9IG9wdGlvbnMuY29uZGl0aW9ucykgPT09IG51bGwgfHwgX2EgPT09IHZvaWQgMCA/IHZvaWQgMCA6IF9hLnRhZ0NvbmRpdGlvbnMgfSksXG4gICAgICAgICAgICAgICAgY3BrSW5mbzogb3B0aW9ucy5jdXN0b21lclByb3ZpZGVkS2V5LFxuICAgICAgICAgICAgICAgIGVuY3J5cHRpb25TY29wZTogb3B0aW9ucy5lbmNyeXB0aW9uU2NvcGUsXG4gICAgICAgICAgICAgICAgaW1tdXRhYmlsaXR5UG9saWN5RXhwaXJ5OiAoX2IgPSBvcHRpb25zLmltbXV0YWJpbGl0eVBvbGljeSkgPT09IG51bGwgfHwgX2IgPT09IHZvaWQgMCA/IHZvaWQgMCA6IF9iLmV4cGlyaWVzT24sXG4gICAgICAgICAgICAgICAgaW1tdXRhYmlsaXR5UG9saWN5TW9kZTogKF9jID0gb3B0aW9ucy5pbW11dGFiaWxpdHlQb2xpY3kpID09PSBudWxsIHx8IF9jID09PSB2b2lkIDAgPyB2b2lkIDAgOiBfYy5wb2xpY3lNb2RlLFxuICAgICAgICAgICAgICAgIGxlZ2FsSG9sZDogb3B0aW9ucy5sZWdhbEhvbGQsXG4gICAgICAgICAgICAgICAgYmxvYlRhZ3NTdHJpbmc6IHRvQmxvYlRhZ3NTdHJpbmcob3B0aW9ucy50YWdzKSxcbiAgICAgICAgICAgICAgICB0cmFjaW5nT3B0aW9uczogdXBkYXRlZE9wdGlvbnMudHJhY2luZ09wdGlvbnMsXG4gICAgICAgICAgICB9KSk7XG4gICAgICAgIH0pO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBDcmVhdGVzIGEgMC1sZW5ndGggYXBwZW5kIGJsb2IuIENhbGwgQXBwZW5kQmxvY2sgdG8gYXBwZW5kIGRhdGEgdG8gYW4gYXBwZW5kIGJsb2IuXG4gICAgICogSWYgdGhlIGJsb2Igd2l0aCB0aGUgc2FtZSBuYW1lIGFscmVhZHkgZXhpc3RzLCB0aGUgY29udGVudCBvZiB0aGUgZXhpc3RpbmcgYmxvYiB3aWxsIHJlbWFpbiB1bmNoYW5nZWQuXG4gICAgICogQHNlZSBodHRwczovL2RvY3MubWljcm9zb2Z0LmNvbS9yZXN0L2FwaS9zdG9yYWdlc2VydmljZXMvcHV0LWJsb2JcbiAgICAgKlxuICAgICAqIEBwYXJhbSBvcHRpb25zIC1cbiAgICAgKi9cbiAgICBhc3luYyBjcmVhdGVJZk5vdEV4aXN0cyhvcHRpb25zID0ge30pIHtcbiAgICAgICAgY29uc3QgY29uZGl0aW9ucyA9IHsgaWZOb25lTWF0Y2g6IEVUYWdBbnkgfTtcbiAgICAgICAgcmV0dXJuIHRyYWNpbmdDbGllbnQud2l0aFNwYW4oXCJBcHBlbmRCbG9iQ2xpZW50LWNyZWF0ZUlmTm90RXhpc3RzXCIsIG9wdGlvbnMsIGFzeW5jICh1cGRhdGVkT3B0aW9ucykgPT4ge1xuICAgICAgICAgICAgdmFyIF9hLCBfYjtcbiAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgY29uc3QgcmVzID0gYXNzZXJ0UmVzcG9uc2UoYXdhaXQgdGhpcy5jcmVhdGUoT2JqZWN0LmFzc2lnbihPYmplY3QuYXNzaWduKHt9LCB1cGRhdGVkT3B0aW9ucyksIHsgY29uZGl0aW9ucyB9KSkpO1xuICAgICAgICAgICAgICAgIHJldHVybiBPYmplY3QuYXNzaWduKE9iamVjdC5hc3NpZ24oeyBzdWNjZWVkZWQ6IHRydWUgfSwgcmVzKSwgeyBfcmVzcG9uc2U6IHJlcy5fcmVzcG9uc2UgfSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBjYXRjaCAoZSkge1xuICAgICAgICAgICAgICAgIGlmICgoKF9hID0gZS5kZXRhaWxzKSA9PT0gbnVsbCB8fCBfYSA9PT0gdm9pZCAwID8gdm9pZCAwIDogX2EuZXJyb3JDb2RlKSA9PT0gXCJCbG9iQWxyZWFkeUV4aXN0c1wiKSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBPYmplY3QuYXNzaWduKE9iamVjdC5hc3NpZ24oeyBzdWNjZWVkZWQ6IGZhbHNlIH0sIChfYiA9IGUucmVzcG9uc2UpID09PSBudWxsIHx8IF9iID09PSB2b2lkIDAgPyB2b2lkIDAgOiBfYi5wYXJzZWRIZWFkZXJzKSwgeyBfcmVzcG9uc2U6IGUucmVzcG9uc2UgfSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHRocm93IGU7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBTZWFscyB0aGUgYXBwZW5kIGJsb2IsIG1ha2luZyBpdCByZWFkIG9ubHkuXG4gICAgICpcbiAgICAgKiBAcGFyYW0gb3B0aW9ucyAtXG4gICAgICovXG4gICAgYXN5bmMgc2VhbChvcHRpb25zID0ge30pIHtcbiAgICAgICAgb3B0aW9ucy5jb25kaXRpb25zID0gb3B0aW9ucy5jb25kaXRpb25zIHx8IHt9O1xuICAgICAgICByZXR1cm4gdHJhY2luZ0NsaWVudC53aXRoU3BhbihcIkFwcGVuZEJsb2JDbGllbnQtc2VhbFwiLCBvcHRpb25zLCBhc3luYyAodXBkYXRlZE9wdGlvbnMpID0+IHtcbiAgICAgICAgICAgIHZhciBfYTtcbiAgICAgICAgICAgIHJldHVybiBhc3NlcnRSZXNwb25zZShhd2FpdCB0aGlzLmFwcGVuZEJsb2JDb250ZXh0LnNlYWwoe1xuICAgICAgICAgICAgICAgIGFib3J0U2lnbmFsOiBvcHRpb25zLmFib3J0U2lnbmFsLFxuICAgICAgICAgICAgICAgIGFwcGVuZFBvc2l0aW9uQWNjZXNzQ29uZGl0aW9uczogb3B0aW9ucy5jb25kaXRpb25zLFxuICAgICAgICAgICAgICAgIGxlYXNlQWNjZXNzQ29uZGl0aW9uczogb3B0aW9ucy5jb25kaXRpb25zLFxuICAgICAgICAgICAgICAgIG1vZGlmaWVkQWNjZXNzQ29uZGl0aW9uczogT2JqZWN0LmFzc2lnbihPYmplY3QuYXNzaWduKHt9LCBvcHRpb25zLmNvbmRpdGlvbnMpLCB7IGlmVGFnczogKF9hID0gb3B0aW9ucy5jb25kaXRpb25zKSA9PT0gbnVsbCB8fCBfYSA9PT0gdm9pZCAwID8gdm9pZCAwIDogX2EudGFnQ29uZGl0aW9ucyB9KSxcbiAgICAgICAgICAgICAgICB0cmFjaW5nT3B0aW9uczogdXBkYXRlZE9wdGlvbnMudHJhY2luZ09wdGlvbnMsXG4gICAgICAgICAgICB9KSk7XG4gICAgICAgIH0pO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBDb21taXRzIGEgbmV3IGJsb2NrIG9mIGRhdGEgdG8gdGhlIGVuZCBvZiB0aGUgZXhpc3RpbmcgYXBwZW5kIGJsb2IuXG4gICAgICogQHNlZSBodHRwczovL2RvY3MubWljcm9zb2Z0LmNvbS9yZXN0L2FwaS9zdG9yYWdlc2VydmljZXMvYXBwZW5kLWJsb2NrXG4gICAgICpcbiAgICAgKiBAcGFyYW0gYm9keSAtIERhdGEgdG8gYmUgYXBwZW5kZWQuXG4gICAgICogQHBhcmFtIGNvbnRlbnRMZW5ndGggLSBMZW5ndGggb2YgdGhlIGJvZHkgaW4gYnl0ZXMuXG4gICAgICogQHBhcmFtIG9wdGlvbnMgLSBPcHRpb25zIHRvIHRoZSBBcHBlbmQgQmxvY2sgb3BlcmF0aW9uLlxuICAgICAqXG4gICAgICpcbiAgICAgKiBFeGFtcGxlIHVzYWdlOlxuICAgICAqXG4gICAgICogYGBganNcbiAgICAgKiBjb25zdCBjb250ZW50ID0gXCJIZWxsbyBXb3JsZCFcIjtcbiAgICAgKlxuICAgICAqIC8vIENyZWF0ZSBhIG5ldyBhcHBlbmQgYmxvYiBhbmQgYXBwZW5kIGRhdGEgdG8gdGhlIGJsb2IuXG4gICAgICogY29uc3QgbmV3QXBwZW5kQmxvYkNsaWVudCA9IGNvbnRhaW5lckNsaWVudC5nZXRBcHBlbmRCbG9iQ2xpZW50KFwiPGJsb2IgbmFtZT5cIik7XG4gICAgICogYXdhaXQgbmV3QXBwZW5kQmxvYkNsaWVudC5jcmVhdGUoKTtcbiAgICAgKiBhd2FpdCBuZXdBcHBlbmRCbG9iQ2xpZW50LmFwcGVuZEJsb2NrKGNvbnRlbnQsIGNvbnRlbnQubGVuZ3RoKTtcbiAgICAgKlxuICAgICAqIC8vIEFwcGVuZCBkYXRhIHRvIGFuIGV4aXN0aW5nIGFwcGVuZCBibG9iLlxuICAgICAqIGNvbnN0IGV4aXN0aW5nQXBwZW5kQmxvYkNsaWVudCA9IGNvbnRhaW5lckNsaWVudC5nZXRBcHBlbmRCbG9iQ2xpZW50KFwiPGJsb2IgbmFtZT5cIik7XG4gICAgICogYXdhaXQgZXhpc3RpbmdBcHBlbmRCbG9iQ2xpZW50LmFwcGVuZEJsb2NrKGNvbnRlbnQsIGNvbnRlbnQubGVuZ3RoKTtcbiAgICAgKiBgYGBcbiAgICAgKi9cbiAgICBhc3luYyBhcHBlbmRCbG9jayhib2R5LCBjb250ZW50TGVuZ3RoLCBvcHRpb25zID0ge30pIHtcbiAgICAgICAgb3B0aW9ucy5jb25kaXRpb25zID0gb3B0aW9ucy5jb25kaXRpb25zIHx8IHt9O1xuICAgICAgICBlbnN1cmVDcGtJZlNwZWNpZmllZChvcHRpb25zLmN1c3RvbWVyUHJvdmlkZWRLZXksIHRoaXMuaXNIdHRwcyk7XG4gICAgICAgIHJldHVybiB0cmFjaW5nQ2xpZW50LndpdGhTcGFuKFwiQXBwZW5kQmxvYkNsaWVudC1hcHBlbmRCbG9ja1wiLCBvcHRpb25zLCBhc3luYyAodXBkYXRlZE9wdGlvbnMpID0+IHtcbiAgICAgICAgICAgIHZhciBfYTtcbiAgICAgICAgICAgIHJldHVybiBhc3NlcnRSZXNwb25zZShhd2FpdCB0aGlzLmFwcGVuZEJsb2JDb250ZXh0LmFwcGVuZEJsb2NrKGNvbnRlbnRMZW5ndGgsIGJvZHksIHtcbiAgICAgICAgICAgICAgICBhYm9ydFNpZ25hbDogb3B0aW9ucy5hYm9ydFNpZ25hbCxcbiAgICAgICAgICAgICAgICBhcHBlbmRQb3NpdGlvbkFjY2Vzc0NvbmRpdGlvbnM6IG9wdGlvbnMuY29uZGl0aW9ucyxcbiAgICAgICAgICAgICAgICBsZWFzZUFjY2Vzc0NvbmRpdGlvbnM6IG9wdGlvbnMuY29uZGl0aW9ucyxcbiAgICAgICAgICAgICAgICBtb2RpZmllZEFjY2Vzc0NvbmRpdGlvbnM6IE9iamVjdC5hc3NpZ24oT2JqZWN0LmFzc2lnbih7fSwgb3B0aW9ucy5jb25kaXRpb25zKSwgeyBpZlRhZ3M6IChfYSA9IG9wdGlvbnMuY29uZGl0aW9ucykgPT09IG51bGwgfHwgX2EgPT09IHZvaWQgMCA/IHZvaWQgMCA6IF9hLnRhZ0NvbmRpdGlvbnMgfSksXG4gICAgICAgICAgICAgICAgcmVxdWVzdE9wdGlvbnM6IHtcbiAgICAgICAgICAgICAgICAgICAgb25VcGxvYWRQcm9ncmVzczogb3B0aW9ucy5vblByb2dyZXNzLFxuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgdHJhbnNhY3Rpb25hbENvbnRlbnRNRDU6IG9wdGlvbnMudHJhbnNhY3Rpb25hbENvbnRlbnRNRDUsXG4gICAgICAgICAgICAgICAgdHJhbnNhY3Rpb25hbENvbnRlbnRDcmM2NDogb3B0aW9ucy50cmFuc2FjdGlvbmFsQ29udGVudENyYzY0LFxuICAgICAgICAgICAgICAgIGNwa0luZm86IG9wdGlvbnMuY3VzdG9tZXJQcm92aWRlZEtleSxcbiAgICAgICAgICAgICAgICBlbmNyeXB0aW9uU2NvcGU6IG9wdGlvbnMuZW5jcnlwdGlvblNjb3BlLFxuICAgICAgICAgICAgICAgIHRyYWNpbmdPcHRpb25zOiB1cGRhdGVkT3B0aW9ucy50cmFjaW5nT3B0aW9ucyxcbiAgICAgICAgICAgIH0pKTtcbiAgICAgICAgfSk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIFRoZSBBcHBlbmQgQmxvY2sgb3BlcmF0aW9uIGNvbW1pdHMgYSBuZXcgYmxvY2sgb2YgZGF0YSB0byB0aGUgZW5kIG9mIGFuIGV4aXN0aW5nIGFwcGVuZCBibG9iXG4gICAgICogd2hlcmUgdGhlIGNvbnRlbnRzIGFyZSByZWFkIGZyb20gYSBzb3VyY2UgdXJsLlxuICAgICAqIEBzZWUgaHR0cHM6Ly9kb2NzLm1pY3Jvc29mdC5jb20vZW4tdXMvcmVzdC9hcGkvc3RvcmFnZXNlcnZpY2VzL2FwcGVuZC1ibG9jay1mcm9tLXVybFxuICAgICAqXG4gICAgICogQHBhcmFtIHNvdXJjZVVSTCAtXG4gICAgICogICAgICAgICAgICAgICAgIFRoZSB1cmwgdG8gdGhlIGJsb2IgdGhhdCB3aWxsIGJlIHRoZSBzb3VyY2Ugb2YgdGhlIGNvcHkuIEEgc291cmNlIGJsb2IgaW4gdGhlIHNhbWUgc3RvcmFnZSBhY2NvdW50IGNhblxuICAgICAqICAgICAgICAgICAgICAgICBiZSBhdXRoZW50aWNhdGVkIHZpYSBTaGFyZWQgS2V5LiBIb3dldmVyLCBpZiB0aGUgc291cmNlIGlzIGEgYmxvYiBpbiBhbm90aGVyIGFjY291bnQsIHRoZSBzb3VyY2UgYmxvYlxuICAgICAqICAgICAgICAgICAgICAgICBtdXN0IGVpdGhlciBiZSBwdWJsaWMgb3IgbXVzdCBiZSBhdXRoZW50aWNhdGVkIHZpYSBhIHNoYXJlZCBhY2Nlc3Mgc2lnbmF0dXJlLiBJZiB0aGUgc291cmNlIGJsb2IgaXNcbiAgICAgKiAgICAgICAgICAgICAgICAgcHVibGljLCBubyBhdXRoZW50aWNhdGlvbiBpcyByZXF1aXJlZCB0byBwZXJmb3JtIHRoZSBvcGVyYXRpb24uXG4gICAgICogQHBhcmFtIHNvdXJjZU9mZnNldCAtIE9mZnNldCBpbiBzb3VyY2UgdG8gYmUgYXBwZW5kZWRcbiAgICAgKiBAcGFyYW0gY291bnQgLSBOdW1iZXIgb2YgYnl0ZXMgdG8gYmUgYXBwZW5kZWQgYXMgYSBibG9ja1xuICAgICAqIEBwYXJhbSBvcHRpb25zIC1cbiAgICAgKi9cbiAgICBhc3luYyBhcHBlbmRCbG9ja0Zyb21VUkwoc291cmNlVVJMLCBzb3VyY2VPZmZzZXQsIGNvdW50LCBvcHRpb25zID0ge30pIHtcbiAgICAgICAgb3B0aW9ucy5jb25kaXRpb25zID0gb3B0aW9ucy5jb25kaXRpb25zIHx8IHt9O1xuICAgICAgICBvcHRpb25zLnNvdXJjZUNvbmRpdGlvbnMgPSBvcHRpb25zLnNvdXJjZUNvbmRpdGlvbnMgfHwge307XG4gICAgICAgIGVuc3VyZUNwa0lmU3BlY2lmaWVkKG9wdGlvbnMuY3VzdG9tZXJQcm92aWRlZEtleSwgdGhpcy5pc0h0dHBzKTtcbiAgICAgICAgcmV0dXJuIHRyYWNpbmdDbGllbnQud2l0aFNwYW4oXCJBcHBlbmRCbG9iQ2xpZW50LWFwcGVuZEJsb2NrRnJvbVVSTFwiLCBvcHRpb25zLCBhc3luYyAodXBkYXRlZE9wdGlvbnMpID0+IHtcbiAgICAgICAgICAgIHZhciBfYSwgX2IsIF9jLCBfZCwgX2U7XG4gICAgICAgICAgICByZXR1cm4gYXNzZXJ0UmVzcG9uc2UoYXdhaXQgdGhpcy5hcHBlbmRCbG9iQ29udGV4dC5hcHBlbmRCbG9ja0Zyb21Vcmwoc291cmNlVVJMLCAwLCB7XG4gICAgICAgICAgICAgICAgYWJvcnRTaWduYWw6IG9wdGlvbnMuYWJvcnRTaWduYWwsXG4gICAgICAgICAgICAgICAgc291cmNlUmFuZ2U6IHJhbmdlVG9TdHJpbmcoeyBvZmZzZXQ6IHNvdXJjZU9mZnNldCwgY291bnQgfSksXG4gICAgICAgICAgICAgICAgc291cmNlQ29udGVudE1ENTogb3B0aW9ucy5zb3VyY2VDb250ZW50TUQ1LFxuICAgICAgICAgICAgICAgIHNvdXJjZUNvbnRlbnRDcmM2NDogb3B0aW9ucy5zb3VyY2VDb250ZW50Q3JjNjQsXG4gICAgICAgICAgICAgICAgbGVhc2VBY2Nlc3NDb25kaXRpb25zOiBvcHRpb25zLmNvbmRpdGlvbnMsXG4gICAgICAgICAgICAgICAgYXBwZW5kUG9zaXRpb25BY2Nlc3NDb25kaXRpb25zOiBvcHRpb25zLmNvbmRpdGlvbnMsXG4gICAgICAgICAgICAgICAgbW9kaWZpZWRBY2Nlc3NDb25kaXRpb25zOiBPYmplY3QuYXNzaWduKE9iamVjdC5hc3NpZ24oe30sIG9wdGlvbnMuY29uZGl0aW9ucyksIHsgaWZUYWdzOiAoX2EgPSBvcHRpb25zLmNvbmRpdGlvbnMpID09PSBudWxsIHx8IF9hID09PSB2b2lkIDAgPyB2b2lkIDAgOiBfYS50YWdDb25kaXRpb25zIH0pLFxuICAgICAgICAgICAgICAgIHNvdXJjZU1vZGlmaWVkQWNjZXNzQ29uZGl0aW9uczoge1xuICAgICAgICAgICAgICAgICAgICBzb3VyY2VJZk1hdGNoOiAoX2IgPSBvcHRpb25zLnNvdXJjZUNvbmRpdGlvbnMpID09PSBudWxsIHx8IF9iID09PSB2b2lkIDAgPyB2b2lkIDAgOiBfYi5pZk1hdGNoLFxuICAgICAgICAgICAgICAgICAgICBzb3VyY2VJZk1vZGlmaWVkU2luY2U6IChfYyA9IG9wdGlvbnMuc291cmNlQ29uZGl0aW9ucykgPT09IG51bGwgfHwgX2MgPT09IHZvaWQgMCA/IHZvaWQgMCA6IF9jLmlmTW9kaWZpZWRTaW5jZSxcbiAgICAgICAgICAgICAgICAgICAgc291cmNlSWZOb25lTWF0Y2g6IChfZCA9IG9wdGlvbnMuc291cmNlQ29uZGl0aW9ucykgPT09IG51bGwgfHwgX2QgPT09IHZvaWQgMCA/IHZvaWQgMCA6IF9kLmlmTm9uZU1hdGNoLFxuICAgICAgICAgICAgICAgICAgICBzb3VyY2VJZlVubW9kaWZpZWRTaW5jZTogKF9lID0gb3B0aW9ucy5zb3VyY2VDb25kaXRpb25zKSA9PT0gbnVsbCB8fCBfZSA9PT0gdm9pZCAwID8gdm9pZCAwIDogX2UuaWZVbm1vZGlmaWVkU2luY2UsXG4gICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICBjb3B5U291cmNlQXV0aG9yaXphdGlvbjogaHR0cEF1dGhvcml6YXRpb25Ub1N0cmluZyhvcHRpb25zLnNvdXJjZUF1dGhvcml6YXRpb24pLFxuICAgICAgICAgICAgICAgIGNwa0luZm86IG9wdGlvbnMuY3VzdG9tZXJQcm92aWRlZEtleSxcbiAgICAgICAgICAgICAgICBlbmNyeXB0aW9uU2NvcGU6IG9wdGlvbnMuZW5jcnlwdGlvblNjb3BlLFxuICAgICAgICAgICAgICAgIHRyYWNpbmdPcHRpb25zOiB1cGRhdGVkT3B0aW9ucy50cmFjaW5nT3B0aW9ucyxcbiAgICAgICAgICAgIH0pKTtcbiAgICAgICAgfSk7XG4gICAgfVxufVxuLyoqXG4gKiBCbG9ja0Jsb2JDbGllbnQgZGVmaW5lcyBhIHNldCBvZiBvcGVyYXRpb25zIGFwcGxpY2FibGUgdG8gYmxvY2sgYmxvYnMuXG4gKi9cbmNsYXNzIEJsb2NrQmxvYkNsaWVudCBleHRlbmRzIEJsb2JDbGllbnQge1xuICAgIGNvbnN0cnVjdG9yKHVybE9yQ29ubmVjdGlvblN0cmluZywgY3JlZGVudGlhbE9yUGlwZWxpbmVPckNvbnRhaW5lck5hbWUsIGJsb2JOYW1lT3JPcHRpb25zLCBcbiAgICAvLyBMZWdhY3ksIG5vIGZpeCBmb3IgZXNsaW50IGVycm9yIHdpdGhvdXQgYnJlYWtpbmcuIERpc2FibGUgaXQgZm9yIHRoaXMgaW50ZXJmYWNlLlxuICAgIC8qIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAYXp1cmUvYXp1cmUtc2RrL3RzLW5hbWluZy1vcHRpb25zKi9cbiAgICBvcHRpb25zKSB7XG4gICAgICAgIC8vIEluIFR5cGVTY3JpcHQgd2UgY2Fubm90IHNpbXBseSBwYXNzIGFsbCBwYXJhbWV0ZXJzIHRvIHN1cGVyKCkgbGlrZSBiZWxvdyBzbyBoYXZlIHRvIGR1cGxpY2F0ZSB0aGUgY29kZSBpbnN0ZWFkLlxuICAgICAgICAvLyAgIHN1cGVyKHMsIGNyZWRlbnRpYWxPclBpcGVsaW5lT3JDb250YWluZXJOYW1lT3JPcHRpb25zLCBibG9iTmFtZU9yT3B0aW9ucywgb3B0aW9ucyk7XG4gICAgICAgIGxldCBwaXBlbGluZTtcbiAgICAgICAgbGV0IHVybDtcbiAgICAgICAgb3B0aW9ucyA9IG9wdGlvbnMgfHwge307XG4gICAgICAgIGlmIChpc1BpcGVsaW5lTGlrZShjcmVkZW50aWFsT3JQaXBlbGluZU9yQ29udGFpbmVyTmFtZSkpIHtcbiAgICAgICAgICAgIC8vICh1cmw6IHN0cmluZywgcGlwZWxpbmU6IFBpcGVsaW5lKVxuICAgICAgICAgICAgdXJsID0gdXJsT3JDb25uZWN0aW9uU3RyaW5nO1xuICAgICAgICAgICAgcGlwZWxpbmUgPSBjcmVkZW50aWFsT3JQaXBlbGluZU9yQ29udGFpbmVyTmFtZTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIGlmICgoY29yZVV0aWwuaXNOb2RlICYmIGNyZWRlbnRpYWxPclBpcGVsaW5lT3JDb250YWluZXJOYW1lIGluc3RhbmNlb2YgU3RvcmFnZVNoYXJlZEtleUNyZWRlbnRpYWwpIHx8XG4gICAgICAgICAgICBjcmVkZW50aWFsT3JQaXBlbGluZU9yQ29udGFpbmVyTmFtZSBpbnN0YW5jZW9mIEFub255bW91c0NyZWRlbnRpYWwgfHxcbiAgICAgICAgICAgIGNvcmVBdXRoLmlzVG9rZW5DcmVkZW50aWFsKGNyZWRlbnRpYWxPclBpcGVsaW5lT3JDb250YWluZXJOYW1lKSkge1xuICAgICAgICAgICAgLy8gKHVybDogc3RyaW5nLCBjcmVkZW50aWFsPzogU3RvcmFnZVNoYXJlZEtleUNyZWRlbnRpYWwgfCBBbm9ueW1vdXNDcmVkZW50aWFsIHwgVG9rZW5DcmVkZW50aWFsLCBvcHRpb25zPzogU3RvcmFnZVBpcGVsaW5lT3B0aW9ucylcbiAgICAgICAgICAgIHVybCA9IHVybE9yQ29ubmVjdGlvblN0cmluZztcbiAgICAgICAgICAgIG9wdGlvbnMgPSBibG9iTmFtZU9yT3B0aW9ucztcbiAgICAgICAgICAgIHBpcGVsaW5lID0gbmV3UGlwZWxpbmUoY3JlZGVudGlhbE9yUGlwZWxpbmVPckNvbnRhaW5lck5hbWUsIG9wdGlvbnMpO1xuICAgICAgICB9XG4gICAgICAgIGVsc2UgaWYgKCFjcmVkZW50aWFsT3JQaXBlbGluZU9yQ29udGFpbmVyTmFtZSAmJlxuICAgICAgICAgICAgdHlwZW9mIGNyZWRlbnRpYWxPclBpcGVsaW5lT3JDb250YWluZXJOYW1lICE9PSBcInN0cmluZ1wiKSB7XG4gICAgICAgICAgICAvLyAodXJsOiBzdHJpbmcsIGNyZWRlbnRpYWw/OiBTdG9yYWdlU2hhcmVkS2V5Q3JlZGVudGlhbCB8IEFub255bW91c0NyZWRlbnRpYWwgfCBUb2tlbkNyZWRlbnRpYWwsIG9wdGlvbnM/OiBTdG9yYWdlUGlwZWxpbmVPcHRpb25zKVxuICAgICAgICAgICAgLy8gVGhlIHNlY29uZCBwYXJhbWV0ZXIgaXMgdW5kZWZpbmVkLiBVc2UgYW5vbnltb3VzIGNyZWRlbnRpYWwuXG4gICAgICAgICAgICB1cmwgPSB1cmxPckNvbm5lY3Rpb25TdHJpbmc7XG4gICAgICAgICAgICBpZiAoYmxvYk5hbWVPck9wdGlvbnMgJiYgdHlwZW9mIGJsb2JOYW1lT3JPcHRpb25zICE9PSBcInN0cmluZ1wiKSB7XG4gICAgICAgICAgICAgICAgb3B0aW9ucyA9IGJsb2JOYW1lT3JPcHRpb25zO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcGlwZWxpbmUgPSBuZXdQaXBlbGluZShuZXcgQW5vbnltb3VzQ3JlZGVudGlhbCgpLCBvcHRpb25zKTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIGlmIChjcmVkZW50aWFsT3JQaXBlbGluZU9yQ29udGFpbmVyTmFtZSAmJlxuICAgICAgICAgICAgdHlwZW9mIGNyZWRlbnRpYWxPclBpcGVsaW5lT3JDb250YWluZXJOYW1lID09PSBcInN0cmluZ1wiICYmXG4gICAgICAgICAgICBibG9iTmFtZU9yT3B0aW9ucyAmJlxuICAgICAgICAgICAgdHlwZW9mIGJsb2JOYW1lT3JPcHRpb25zID09PSBcInN0cmluZ1wiKSB7XG4gICAgICAgICAgICAvLyAoY29ubmVjdGlvblN0cmluZzogc3RyaW5nLCBjb250YWluZXJOYW1lOiBzdHJpbmcsIGJsb2JOYW1lOiBzdHJpbmcsIG9wdGlvbnM/OiBTdG9yYWdlUGlwZWxpbmVPcHRpb25zKVxuICAgICAgICAgICAgY29uc3QgY29udGFpbmVyTmFtZSA9IGNyZWRlbnRpYWxPclBpcGVsaW5lT3JDb250YWluZXJOYW1lO1xuICAgICAgICAgICAgY29uc3QgYmxvYk5hbWUgPSBibG9iTmFtZU9yT3B0aW9ucztcbiAgICAgICAgICAgIGNvbnN0IGV4dHJhY3RlZENyZWRzID0gZXh0cmFjdENvbm5lY3Rpb25TdHJpbmdQYXJ0cyh1cmxPckNvbm5lY3Rpb25TdHJpbmcpO1xuICAgICAgICAgICAgaWYgKGV4dHJhY3RlZENyZWRzLmtpbmQgPT09IFwiQWNjb3VudENvbm5TdHJpbmdcIikge1xuICAgICAgICAgICAgICAgIGlmIChjb3JlVXRpbC5pc05vZGUpIHtcbiAgICAgICAgICAgICAgICAgICAgY29uc3Qgc2hhcmVkS2V5Q3JlZGVudGlhbCA9IG5ldyBTdG9yYWdlU2hhcmVkS2V5Q3JlZGVudGlhbChleHRyYWN0ZWRDcmVkcy5hY2NvdW50TmFtZSwgZXh0cmFjdGVkQ3JlZHMuYWNjb3VudEtleSk7XG4gICAgICAgICAgICAgICAgICAgIHVybCA9IGFwcGVuZFRvVVJMUGF0aChhcHBlbmRUb1VSTFBhdGgoZXh0cmFjdGVkQ3JlZHMudXJsLCBlbmNvZGVVUklDb21wb25lbnQoY29udGFpbmVyTmFtZSkpLCBlbmNvZGVVUklDb21wb25lbnQoYmxvYk5hbWUpKTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKCFvcHRpb25zLnByb3h5T3B0aW9ucykge1xuICAgICAgICAgICAgICAgICAgICAgICAgb3B0aW9ucy5wcm94eU9wdGlvbnMgPSBjb3JlUmVzdFBpcGVsaW5lLmdldERlZmF1bHRQcm94eVNldHRpbmdzKGV4dHJhY3RlZENyZWRzLnByb3h5VXJpKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBwaXBlbGluZSA9IG5ld1BpcGVsaW5lKHNoYXJlZEtleUNyZWRlbnRpYWwsIG9wdGlvbnMpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwiQWNjb3VudCBjb25uZWN0aW9uIHN0cmluZyBpcyBvbmx5IHN1cHBvcnRlZCBpbiBOb2RlLmpzIGVudmlyb25tZW50XCIpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2UgaWYgKGV4dHJhY3RlZENyZWRzLmtpbmQgPT09IFwiU0FTQ29ublN0cmluZ1wiKSB7XG4gICAgICAgICAgICAgICAgdXJsID1cbiAgICAgICAgICAgICAgICAgICAgYXBwZW5kVG9VUkxQYXRoKGFwcGVuZFRvVVJMUGF0aChleHRyYWN0ZWRDcmVkcy51cmwsIGVuY29kZVVSSUNvbXBvbmVudChjb250YWluZXJOYW1lKSksIGVuY29kZVVSSUNvbXBvbmVudChibG9iTmFtZSkpICtcbiAgICAgICAgICAgICAgICAgICAgICAgIFwiP1wiICtcbiAgICAgICAgICAgICAgICAgICAgICAgIGV4dHJhY3RlZENyZWRzLmFjY291bnRTYXM7XG4gICAgICAgICAgICAgICAgcGlwZWxpbmUgPSBuZXdQaXBlbGluZShuZXcgQW5vbnltb3VzQ3JlZGVudGlhbCgpLCBvcHRpb25zKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihcIkNvbm5lY3Rpb24gc3RyaW5nIG11c3QgYmUgZWl0aGVyIGFuIEFjY291bnQgY29ubmVjdGlvbiBzdHJpbmcgb3IgYSBTQVMgY29ubmVjdGlvbiBzdHJpbmdcIik7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJFeHBlY3Rpbmcgbm9uLWVtcHR5IHN0cmluZ3MgZm9yIGNvbnRhaW5lck5hbWUgYW5kIGJsb2JOYW1lIHBhcmFtZXRlcnNcIik7XG4gICAgICAgIH1cbiAgICAgICAgc3VwZXIodXJsLCBwaXBlbGluZSk7XG4gICAgICAgIHRoaXMuYmxvY2tCbG9iQ29udGV4dCA9IHRoaXMuc3RvcmFnZUNsaWVudENvbnRleHQuYmxvY2tCbG9iO1xuICAgICAgICB0aGlzLl9ibG9iQ29udGV4dCA9IHRoaXMuc3RvcmFnZUNsaWVudENvbnRleHQuYmxvYjtcbiAgICB9XG4gICAgLyoqXG4gICAgICogQ3JlYXRlcyBhIG5ldyBCbG9ja0Jsb2JDbGllbnQgb2JqZWN0IGlkZW50aWNhbCB0byB0aGUgc291cmNlIGJ1dCB3aXRoIHRoZVxuICAgICAqIHNwZWNpZmllZCBzbmFwc2hvdCB0aW1lc3RhbXAuXG4gICAgICogUHJvdmlkZSBcIlwiIHdpbGwgcmVtb3ZlIHRoZSBzbmFwc2hvdCBhbmQgcmV0dXJuIGEgVVJMIHRvIHRoZSBiYXNlIGJsb2IuXG4gICAgICpcbiAgICAgKiBAcGFyYW0gc25hcHNob3QgLSBUaGUgc25hcHNob3QgdGltZXN0YW1wLlxuICAgICAqIEByZXR1cm5zIEEgbmV3IEJsb2NrQmxvYkNsaWVudCBvYmplY3QgaWRlbnRpY2FsIHRvIHRoZSBzb3VyY2UgYnV0IHdpdGggdGhlIHNwZWNpZmllZCBzbmFwc2hvdCB0aW1lc3RhbXAuXG4gICAgICovXG4gICAgd2l0aFNuYXBzaG90KHNuYXBzaG90KSB7XG4gICAgICAgIHJldHVybiBuZXcgQmxvY2tCbG9iQ2xpZW50KHNldFVSTFBhcmFtZXRlcih0aGlzLnVybCwgVVJMQ29uc3RhbnRzLlBhcmFtZXRlcnMuU05BUFNIT1QsIHNuYXBzaG90Lmxlbmd0aCA9PT0gMCA/IHVuZGVmaW5lZCA6IHNuYXBzaG90KSwgdGhpcy5waXBlbGluZSk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIE9OTFkgQVZBSUxBQkxFIElOIE5PREUuSlMgUlVOVElNRS5cbiAgICAgKlxuICAgICAqIFF1aWNrIHF1ZXJ5IGZvciBhIEpTT04gb3IgQ1NWIGZvcm1hdHRlZCBibG9iLlxuICAgICAqXG4gICAgICogRXhhbXBsZSB1c2FnZSAoTm9kZS5qcyk6XG4gICAgICpcbiAgICAgKiBgYGBqc1xuICAgICAqIC8vIFF1ZXJ5IGFuZCBjb252ZXJ0IGEgYmxvYiB0byBhIHN0cmluZ1xuICAgICAqIGNvbnN0IHF1ZXJ5QmxvY2tCbG9iUmVzcG9uc2UgPSBhd2FpdCBibG9ja0Jsb2JDbGllbnQucXVlcnkoXCJzZWxlY3QgKiBmcm9tIEJsb2JTdG9yYWdlXCIpO1xuICAgICAqIGNvbnN0IGRvd25sb2FkZWQgPSAoYXdhaXQgc3RyZWFtVG9CdWZmZXIocXVlcnlCbG9ja0Jsb2JSZXNwb25zZS5yZWFkYWJsZVN0cmVhbUJvZHkpKS50b1N0cmluZygpO1xuICAgICAqIGNvbnNvbGUubG9nKFwiUXVlcnkgYmxvYiBjb250ZW50OlwiLCBkb3dubG9hZGVkKTtcbiAgICAgKlxuICAgICAqIGFzeW5jIGZ1bmN0aW9uIHN0cmVhbVRvQnVmZmVyKHJlYWRhYmxlU3RyZWFtKSB7XG4gICAgICogICByZXR1cm4gbmV3IFByb21pc2UoKHJlc29sdmUsIHJlamVjdCkgPT4ge1xuICAgICAqICAgICBjb25zdCBjaHVua3MgPSBbXTtcbiAgICAgKiAgICAgcmVhZGFibGVTdHJlYW0ub24oXCJkYXRhXCIsIChkYXRhKSA9PiB7XG4gICAgICogICAgICAgY2h1bmtzLnB1c2goZGF0YSBpbnN0YW5jZW9mIEJ1ZmZlciA/IGRhdGEgOiBCdWZmZXIuZnJvbShkYXRhKSk7XG4gICAgICogICAgIH0pO1xuICAgICAqICAgICByZWFkYWJsZVN0cmVhbS5vbihcImVuZFwiLCAoKSA9PiB7XG4gICAgICogICAgICAgcmVzb2x2ZShCdWZmZXIuY29uY2F0KGNodW5rcykpO1xuICAgICAqICAgICB9KTtcbiAgICAgKiAgICAgcmVhZGFibGVTdHJlYW0ub24oXCJlcnJvclwiLCByZWplY3QpO1xuICAgICAqICAgfSk7XG4gICAgICogfVxuICAgICAqIGBgYFxuICAgICAqXG4gICAgICogQHBhcmFtIHF1ZXJ5IC1cbiAgICAgKiBAcGFyYW0gb3B0aW9ucyAtXG4gICAgICovXG4gICAgYXN5bmMgcXVlcnkocXVlcnksIG9wdGlvbnMgPSB7fSkge1xuICAgICAgICBlbnN1cmVDcGtJZlNwZWNpZmllZChvcHRpb25zLmN1c3RvbWVyUHJvdmlkZWRLZXksIHRoaXMuaXNIdHRwcyk7XG4gICAgICAgIGlmICghY29yZVV0aWwuaXNOb2RlKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJUaGlzIG9wZXJhdGlvbiBjdXJyZW50bHkgaXMgb25seSBzdXBwb3J0ZWQgaW4gTm9kZS5qcy5cIik7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHRyYWNpbmdDbGllbnQud2l0aFNwYW4oXCJCbG9ja0Jsb2JDbGllbnQtcXVlcnlcIiwgb3B0aW9ucywgYXN5bmMgKHVwZGF0ZWRPcHRpb25zKSA9PiB7XG4gICAgICAgICAgICB2YXIgX2E7XG4gICAgICAgICAgICBjb25zdCByZXNwb25zZSA9IGFzc2VydFJlc3BvbnNlKGF3YWl0IHRoaXMuX2Jsb2JDb250ZXh0LnF1ZXJ5KHtcbiAgICAgICAgICAgICAgICBhYm9ydFNpZ25hbDogb3B0aW9ucy5hYm9ydFNpZ25hbCxcbiAgICAgICAgICAgICAgICBxdWVyeVJlcXVlc3Q6IHtcbiAgICAgICAgICAgICAgICAgICAgcXVlcnlUeXBlOiBcIlNRTFwiLFxuICAgICAgICAgICAgICAgICAgICBleHByZXNzaW9uOiBxdWVyeSxcbiAgICAgICAgICAgICAgICAgICAgaW5wdXRTZXJpYWxpemF0aW9uOiB0b1F1ZXJ5U2VyaWFsaXphdGlvbihvcHRpb25zLmlucHV0VGV4dENvbmZpZ3VyYXRpb24pLFxuICAgICAgICAgICAgICAgICAgICBvdXRwdXRTZXJpYWxpemF0aW9uOiB0b1F1ZXJ5U2VyaWFsaXphdGlvbihvcHRpb25zLm91dHB1dFRleHRDb25maWd1cmF0aW9uKSxcbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgIGxlYXNlQWNjZXNzQ29uZGl0aW9uczogb3B0aW9ucy5jb25kaXRpb25zLFxuICAgICAgICAgICAgICAgIG1vZGlmaWVkQWNjZXNzQ29uZGl0aW9uczogT2JqZWN0LmFzc2lnbihPYmplY3QuYXNzaWduKHt9LCBvcHRpb25zLmNvbmRpdGlvbnMpLCB7IGlmVGFnczogKF9hID0gb3B0aW9ucy5jb25kaXRpb25zKSA9PT0gbnVsbCB8fCBfYSA9PT0gdm9pZCAwID8gdm9pZCAwIDogX2EudGFnQ29uZGl0aW9ucyB9KSxcbiAgICAgICAgICAgICAgICBjcGtJbmZvOiBvcHRpb25zLmN1c3RvbWVyUHJvdmlkZWRLZXksXG4gICAgICAgICAgICAgICAgdHJhY2luZ09wdGlvbnM6IHVwZGF0ZWRPcHRpb25zLnRyYWNpbmdPcHRpb25zLFxuICAgICAgICAgICAgfSkpO1xuICAgICAgICAgICAgcmV0dXJuIG5ldyBCbG9iUXVlcnlSZXNwb25zZShyZXNwb25zZSwge1xuICAgICAgICAgICAgICAgIGFib3J0U2lnbmFsOiBvcHRpb25zLmFib3J0U2lnbmFsLFxuICAgICAgICAgICAgICAgIG9uUHJvZ3Jlc3M6IG9wdGlvbnMub25Qcm9ncmVzcyxcbiAgICAgICAgICAgICAgICBvbkVycm9yOiBvcHRpb25zLm9uRXJyb3IsXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfSk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIENyZWF0ZXMgYSBuZXcgYmxvY2sgYmxvYiwgb3IgdXBkYXRlcyB0aGUgY29udGVudCBvZiBhbiBleGlzdGluZyBibG9jayBibG9iLlxuICAgICAqIFVwZGF0aW5nIGFuIGV4aXN0aW5nIGJsb2NrIGJsb2Igb3ZlcndyaXRlcyBhbnkgZXhpc3RpbmcgbWV0YWRhdGEgb24gdGhlIGJsb2IuXG4gICAgICogUGFydGlhbCB1cGRhdGVzIGFyZSBub3Qgc3VwcG9ydGVkOyB0aGUgY29udGVudCBvZiB0aGUgZXhpc3RpbmcgYmxvYiBpc1xuICAgICAqIG92ZXJ3cml0dGVuIHdpdGggdGhlIG5ldyBjb250ZW50LiBUbyBwZXJmb3JtIGEgcGFydGlhbCB1cGRhdGUgb2YgYSBibG9jayBibG9iJ3MsXG4gICAgICogdXNlIHtAbGluayBzdGFnZUJsb2NrfSBhbmQge0BsaW5rIGNvbW1pdEJsb2NrTGlzdH0uXG4gICAgICpcbiAgICAgKiBUaGlzIGlzIGEgbm9uLXBhcmFsbGVsIHVwbG9hZGluZyBtZXRob2QsIHBsZWFzZSB1c2Uge0BsaW5rIHVwbG9hZEZpbGV9LFxuICAgICAqIHtAbGluayB1cGxvYWRTdHJlYW19IG9yIHtAbGluayB1cGxvYWRCcm93c2VyRGF0YX0gZm9yIGJldHRlciBwZXJmb3JtYW5jZVxuICAgICAqIHdpdGggY29uY3VycmVuY3kgdXBsb2FkaW5nLlxuICAgICAqXG4gICAgICogQHNlZSBodHRwczovL2RvY3MubWljcm9zb2Z0LmNvbS9yZXN0L2FwaS9zdG9yYWdlc2VydmljZXMvcHV0LWJsb2JcbiAgICAgKlxuICAgICAqIEBwYXJhbSBib2R5IC0gQmxvYiwgc3RyaW5nLCBBcnJheUJ1ZmZlciwgQXJyYXlCdWZmZXJWaWV3IG9yIGEgZnVuY3Rpb25cbiAgICAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3aGljaCByZXR1cm5zIGEgbmV3IFJlYWRhYmxlIHN0cmVhbSB3aG9zZSBvZmZzZXQgaXMgZnJvbSBkYXRhIHNvdXJjZSBiZWdpbm5pbmcuXG4gICAgICogQHBhcmFtIGNvbnRlbnRMZW5ndGggLSBMZW5ndGggb2YgYm9keSBpbiBieXRlcy4gVXNlIEJ1ZmZlci5ieXRlTGVuZ3RoKCkgdG8gY2FsY3VsYXRlIGJvZHkgbGVuZ3RoIGZvciBhXG4gICAgICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyaW5nIGluY2x1ZGluZyBub24gbm9uLUJhc2U2NC9IZXgtZW5jb2RlZCBjaGFyYWN0ZXJzLlxuICAgICAqIEBwYXJhbSBvcHRpb25zIC0gT3B0aW9ucyB0byB0aGUgQmxvY2sgQmxvYiBVcGxvYWQgb3BlcmF0aW9uLlxuICAgICAqIEByZXR1cm5zIFJlc3BvbnNlIGRhdGEgZm9yIHRoZSBCbG9jayBCbG9iIFVwbG9hZCBvcGVyYXRpb24uXG4gICAgICpcbiAgICAgKiBFeGFtcGxlIHVzYWdlOlxuICAgICAqXG4gICAgICogYGBganNcbiAgICAgKiBjb25zdCBjb250ZW50ID0gXCJIZWxsbyB3b3JsZCFcIjtcbiAgICAgKiBjb25zdCB1cGxvYWRCbG9iUmVzcG9uc2UgPSBhd2FpdCBibG9ja0Jsb2JDbGllbnQudXBsb2FkKGNvbnRlbnQsIGNvbnRlbnQubGVuZ3RoKTtcbiAgICAgKiBgYGBcbiAgICAgKi9cbiAgICBhc3luYyB1cGxvYWQoYm9keSwgY29udGVudExlbmd0aCwgb3B0aW9ucyA9IHt9KSB7XG4gICAgICAgIG9wdGlvbnMuY29uZGl0aW9ucyA9IG9wdGlvbnMuY29uZGl0aW9ucyB8fCB7fTtcbiAgICAgICAgZW5zdXJlQ3BrSWZTcGVjaWZpZWQob3B0aW9ucy5jdXN0b21lclByb3ZpZGVkS2V5LCB0aGlzLmlzSHR0cHMpO1xuICAgICAgICByZXR1cm4gdHJhY2luZ0NsaWVudC53aXRoU3BhbihcIkJsb2NrQmxvYkNsaWVudC11cGxvYWRcIiwgb3B0aW9ucywgYXN5bmMgKHVwZGF0ZWRPcHRpb25zKSA9PiB7XG4gICAgICAgICAgICB2YXIgX2EsIF9iLCBfYztcbiAgICAgICAgICAgIHJldHVybiBhc3NlcnRSZXNwb25zZShhd2FpdCB0aGlzLmJsb2NrQmxvYkNvbnRleHQudXBsb2FkKGNvbnRlbnRMZW5ndGgsIGJvZHksIHtcbiAgICAgICAgICAgICAgICBhYm9ydFNpZ25hbDogb3B0aW9ucy5hYm9ydFNpZ25hbCxcbiAgICAgICAgICAgICAgICBibG9iSHR0cEhlYWRlcnM6IG9wdGlvbnMuYmxvYkhUVFBIZWFkZXJzLFxuICAgICAgICAgICAgICAgIGxlYXNlQWNjZXNzQ29uZGl0aW9uczogb3B0aW9ucy5jb25kaXRpb25zLFxuICAgICAgICAgICAgICAgIG1ldGFkYXRhOiBvcHRpb25zLm1ldGFkYXRhLFxuICAgICAgICAgICAgICAgIG1vZGlmaWVkQWNjZXNzQ29uZGl0aW9uczogT2JqZWN0LmFzc2lnbihPYmplY3QuYXNzaWduKHt9LCBvcHRpb25zLmNvbmRpdGlvbnMpLCB7IGlmVGFnczogKF9hID0gb3B0aW9ucy5jb25kaXRpb25zKSA9PT0gbnVsbCB8fCBfYSA9PT0gdm9pZCAwID8gdm9pZCAwIDogX2EudGFnQ29uZGl0aW9ucyB9KSxcbiAgICAgICAgICAgICAgICByZXF1ZXN0T3B0aW9uczoge1xuICAgICAgICAgICAgICAgICAgICBvblVwbG9hZFByb2dyZXNzOiBvcHRpb25zLm9uUHJvZ3Jlc3MsXG4gICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICBjcGtJbmZvOiBvcHRpb25zLmN1c3RvbWVyUHJvdmlkZWRLZXksXG4gICAgICAgICAgICAgICAgZW5jcnlwdGlvblNjb3BlOiBvcHRpb25zLmVuY3J5cHRpb25TY29wZSxcbiAgICAgICAgICAgICAgICBpbW11dGFiaWxpdHlQb2xpY3lFeHBpcnk6IChfYiA9IG9wdGlvbnMuaW1tdXRhYmlsaXR5UG9saWN5KSA9PT0gbnVsbCB8fCBfYiA9PT0gdm9pZCAwID8gdm9pZCAwIDogX2IuZXhwaXJpZXNPbixcbiAgICAgICAgICAgICAgICBpbW11dGFiaWxpdHlQb2xpY3lNb2RlOiAoX2MgPSBvcHRpb25zLmltbXV0YWJpbGl0eVBvbGljeSkgPT09IG51bGwgfHwgX2MgPT09IHZvaWQgMCA/IHZvaWQgMCA6IF9jLnBvbGljeU1vZGUsXG4gICAgICAgICAgICAgICAgbGVnYWxIb2xkOiBvcHRpb25zLmxlZ2FsSG9sZCxcbiAgICAgICAgICAgICAgICB0aWVyOiB0b0FjY2Vzc1RpZXIob3B0aW9ucy50aWVyKSxcbiAgICAgICAgICAgICAgICBibG9iVGFnc1N0cmluZzogdG9CbG9iVGFnc1N0cmluZyhvcHRpb25zLnRhZ3MpLFxuICAgICAgICAgICAgICAgIHRyYWNpbmdPcHRpb25zOiB1cGRhdGVkT3B0aW9ucy50cmFjaW5nT3B0aW9ucyxcbiAgICAgICAgICAgIH0pKTtcbiAgICAgICAgfSk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIENyZWF0ZXMgYSBuZXcgQmxvY2sgQmxvYiB3aGVyZSB0aGUgY29udGVudHMgb2YgdGhlIGJsb2IgYXJlIHJlYWQgZnJvbSBhIGdpdmVuIFVSTC5cbiAgICAgKiBUaGlzIEFQSSBpcyBzdXBwb3J0ZWQgYmVnaW5uaW5nIHdpdGggdGhlIDIwMjAtMDQtMDggdmVyc2lvbi4gUGFydGlhbCB1cGRhdGVzXG4gICAgICogYXJlIG5vdCBzdXBwb3J0ZWQgd2l0aCBQdXQgQmxvYiBmcm9tIFVSTDsgdGhlIGNvbnRlbnQgb2YgYW4gZXhpc3RpbmcgYmxvYiBpcyBvdmVyd3JpdHRlbiB3aXRoXG4gICAgICogdGhlIGNvbnRlbnQgb2YgdGhlIG5ldyBibG9iLiAgVG8gcGVyZm9ybSBwYXJ0aWFsIHVwZGF0ZXMgdG8gYSBibG9jayBibG9i4oCZcyBjb250ZW50cyB1c2luZyBhXG4gICAgICogc291cmNlIFVSTCwgdXNlIHtAbGluayBzdGFnZUJsb2NrRnJvbVVSTH0gYW5kIHtAbGluayBjb21taXRCbG9ja0xpc3R9LlxuICAgICAqXG4gICAgICogQHBhcmFtIHNvdXJjZVVSTCAtIFNwZWNpZmllcyB0aGUgVVJMIG9mIHRoZSBibG9iLiBUaGUgdmFsdWVcbiAgICAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgIG1heSBiZSBhIFVSTCBvZiB1cCB0byAyIEtCIGluIGxlbmd0aCB0aGF0IHNwZWNpZmllcyBhIGJsb2IuXG4gICAgICogICAgICAgICAgICAgICAgICAgICAgICAgICBUaGUgdmFsdWUgc2hvdWxkIGJlIFVSTC1lbmNvZGVkIGFzIGl0IHdvdWxkIGFwcGVhclxuICAgICAqICAgICAgICAgICAgICAgICAgICAgICAgICAgaW4gYSByZXF1ZXN0IFVSSS4gVGhlIHNvdXJjZSBibG9iIG11c3QgZWl0aGVyIGJlIHB1YmxpY1xuICAgICAqICAgICAgICAgICAgICAgICAgICAgICAgICAgb3IgbXVzdCBiZSBhdXRoZW50aWNhdGVkIHZpYSBhIHNoYXJlZCBhY2Nlc3Mgc2lnbmF0dXJlLlxuICAgICAqICAgICAgICAgICAgICAgICAgICAgICAgICAgSWYgdGhlIHNvdXJjZSBibG9iIGlzIHB1YmxpYywgbm8gYXV0aGVudGljYXRpb24gaXMgcmVxdWlyZWRcbiAgICAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgIHRvIHBlcmZvcm0gdGhlIG9wZXJhdGlvbi4gSGVyZSBhcmUgc29tZSBleGFtcGxlcyBvZiBzb3VyY2Ugb2JqZWN0IFVSTHM6XG4gICAgICogICAgICAgICAgICAgICAgICAgICAgICAgICAtIGh0dHBzOi8vbXlhY2NvdW50LmJsb2IuY29yZS53aW5kb3dzLm5ldC9teWNvbnRhaW5lci9teWJsb2JcbiAgICAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgIC0gaHR0cHM6Ly9teWFjY291bnQuYmxvYi5jb3JlLndpbmRvd3MubmV0L215Y29udGFpbmVyL215YmxvYj9zbmFwc2hvdD08RGF0ZVRpbWU+XG4gICAgICogQHBhcmFtIG9wdGlvbnMgLSBPcHRpb25hbCBwYXJhbWV0ZXJzLlxuICAgICAqL1xuICAgIGFzeW5jIHN5bmNVcGxvYWRGcm9tVVJMKHNvdXJjZVVSTCwgb3B0aW9ucyA9IHt9KSB7XG4gICAgICAgIG9wdGlvbnMuY29uZGl0aW9ucyA9IG9wdGlvbnMuY29uZGl0aW9ucyB8fCB7fTtcbiAgICAgICAgZW5zdXJlQ3BrSWZTcGVjaWZpZWQob3B0aW9ucy5jdXN0b21lclByb3ZpZGVkS2V5LCB0aGlzLmlzSHR0cHMpO1xuICAgICAgICByZXR1cm4gdHJhY2luZ0NsaWVudC53aXRoU3BhbihcIkJsb2NrQmxvYkNsaWVudC1zeW5jVXBsb2FkRnJvbVVSTFwiLCBvcHRpb25zLCBhc3luYyAodXBkYXRlZE9wdGlvbnMpID0+IHtcbiAgICAgICAgICAgIHZhciBfYSwgX2IsIF9jLCBfZCwgX2UsIF9mO1xuICAgICAgICAgICAgcmV0dXJuIGFzc2VydFJlc3BvbnNlKGF3YWl0IHRoaXMuYmxvY2tCbG9iQ29udGV4dC5wdXRCbG9iRnJvbVVybCgwLCBzb3VyY2VVUkwsIE9iamVjdC5hc3NpZ24oT2JqZWN0LmFzc2lnbih7fSwgb3B0aW9ucyksIHsgYmxvYkh0dHBIZWFkZXJzOiBvcHRpb25zLmJsb2JIVFRQSGVhZGVycywgbGVhc2VBY2Nlc3NDb25kaXRpb25zOiBvcHRpb25zLmNvbmRpdGlvbnMsIG1vZGlmaWVkQWNjZXNzQ29uZGl0aW9uczogT2JqZWN0LmFzc2lnbihPYmplY3QuYXNzaWduKHt9LCBvcHRpb25zLmNvbmRpdGlvbnMpLCB7IGlmVGFnczogKF9hID0gb3B0aW9ucy5jb25kaXRpb25zKSA9PT0gbnVsbCB8fCBfYSA9PT0gdm9pZCAwID8gdm9pZCAwIDogX2EudGFnQ29uZGl0aW9ucyB9KSwgc291cmNlTW9kaWZpZWRBY2Nlc3NDb25kaXRpb25zOiB7XG4gICAgICAgICAgICAgICAgICAgIHNvdXJjZUlmTWF0Y2g6IChfYiA9IG9wdGlvbnMuc291cmNlQ29uZGl0aW9ucykgPT09IG51bGwgfHwgX2IgPT09IHZvaWQgMCA/IHZvaWQgMCA6IF9iLmlmTWF0Y2gsXG4gICAgICAgICAgICAgICAgICAgIHNvdXJjZUlmTW9kaWZpZWRTaW5jZTogKF9jID0gb3B0aW9ucy5zb3VyY2VDb25kaXRpb25zKSA9PT0gbnVsbCB8fCBfYyA9PT0gdm9pZCAwID8gdm9pZCAwIDogX2MuaWZNb2RpZmllZFNpbmNlLFxuICAgICAgICAgICAgICAgICAgICBzb3VyY2VJZk5vbmVNYXRjaDogKF9kID0gb3B0aW9ucy5zb3VyY2VDb25kaXRpb25zKSA9PT0gbnVsbCB8fCBfZCA9PT0gdm9pZCAwID8gdm9pZCAwIDogX2QuaWZOb25lTWF0Y2gsXG4gICAgICAgICAgICAgICAgICAgIHNvdXJjZUlmVW5tb2RpZmllZFNpbmNlOiAoX2UgPSBvcHRpb25zLnNvdXJjZUNvbmRpdGlvbnMpID09PSBudWxsIHx8IF9lID09PSB2b2lkIDAgPyB2b2lkIDAgOiBfZS5pZlVubW9kaWZpZWRTaW5jZSxcbiAgICAgICAgICAgICAgICAgICAgc291cmNlSWZUYWdzOiAoX2YgPSBvcHRpb25zLnNvdXJjZUNvbmRpdGlvbnMpID09PSBudWxsIHx8IF9mID09PSB2b2lkIDAgPyB2b2lkIDAgOiBfZi50YWdDb25kaXRpb25zLFxuICAgICAgICAgICAgICAgIH0sIGNwa0luZm86IG9wdGlvbnMuY3VzdG9tZXJQcm92aWRlZEtleSwgY29weVNvdXJjZUF1dGhvcml6YXRpb246IGh0dHBBdXRob3JpemF0aW9uVG9TdHJpbmcob3B0aW9ucy5zb3VyY2VBdXRob3JpemF0aW9uKSwgdGllcjogdG9BY2Nlc3NUaWVyKG9wdGlvbnMudGllciksIGJsb2JUYWdzU3RyaW5nOiB0b0Jsb2JUYWdzU3RyaW5nKG9wdGlvbnMudGFncyksIGNvcHlTb3VyY2VUYWdzOiBvcHRpb25zLmNvcHlTb3VyY2VUYWdzLCB0cmFjaW5nT3B0aW9uczogdXBkYXRlZE9wdGlvbnMudHJhY2luZ09wdGlvbnMgfSkpKTtcbiAgICAgICAgfSk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIFVwbG9hZHMgdGhlIHNwZWNpZmllZCBibG9jayB0byB0aGUgYmxvY2sgYmxvYidzIFwic3RhZ2luZyBhcmVhXCIgdG8gYmUgbGF0ZXJcbiAgICAgKiBjb21taXR0ZWQgYnkgYSBjYWxsIHRvIGNvbW1pdEJsb2NrTGlzdC5cbiAgICAgKiBAc2VlIGh0dHBzOi8vZG9jcy5taWNyb3NvZnQuY29tL3Jlc3QvYXBpL3N0b3JhZ2VzZXJ2aWNlcy9wdXQtYmxvY2tcbiAgICAgKlxuICAgICAqIEBwYXJhbSBibG9ja0lkIC0gQSA2NC1ieXRlIHZhbHVlIHRoYXQgaXMgYmFzZTY0LWVuY29kZWRcbiAgICAgKiBAcGFyYW0gYm9keSAtIERhdGEgdG8gdXBsb2FkIHRvIHRoZSBzdGFnaW5nIGFyZWEuXG4gICAgICogQHBhcmFtIGNvbnRlbnRMZW5ndGggLSBOdW1iZXIgb2YgYnl0ZXMgdG8gdXBsb2FkLlxuICAgICAqIEBwYXJhbSBvcHRpb25zIC0gT3B0aW9ucyB0byB0aGUgQmxvY2sgQmxvYiBTdGFnZSBCbG9jayBvcGVyYXRpb24uXG4gICAgICogQHJldHVybnMgUmVzcG9uc2UgZGF0YSBmb3IgdGhlIEJsb2NrIEJsb2IgU3RhZ2UgQmxvY2sgb3BlcmF0aW9uLlxuICAgICAqL1xuICAgIGFzeW5jIHN0YWdlQmxvY2soYmxvY2tJZCwgYm9keSwgY29udGVudExlbmd0aCwgb3B0aW9ucyA9IHt9KSB7XG4gICAgICAgIGVuc3VyZUNwa0lmU3BlY2lmaWVkKG9wdGlvbnMuY3VzdG9tZXJQcm92aWRlZEtleSwgdGhpcy5pc0h0dHBzKTtcbiAgICAgICAgcmV0dXJuIHRyYWNpbmdDbGllbnQud2l0aFNwYW4oXCJCbG9ja0Jsb2JDbGllbnQtc3RhZ2VCbG9ja1wiLCBvcHRpb25zLCBhc3luYyAodXBkYXRlZE9wdGlvbnMpID0+IHtcbiAgICAgICAgICAgIHJldHVybiBhc3NlcnRSZXNwb25zZShhd2FpdCB0aGlzLmJsb2NrQmxvYkNvbnRleHQuc3RhZ2VCbG9jayhibG9ja0lkLCBjb250ZW50TGVuZ3RoLCBib2R5LCB7XG4gICAgICAgICAgICAgICAgYWJvcnRTaWduYWw6IG9wdGlvbnMuYWJvcnRTaWduYWwsXG4gICAgICAgICAgICAgICAgbGVhc2VBY2Nlc3NDb25kaXRpb25zOiBvcHRpb25zLmNvbmRpdGlvbnMsXG4gICAgICAgICAgICAgICAgcmVxdWVzdE9wdGlvbnM6IHtcbiAgICAgICAgICAgICAgICAgICAgb25VcGxvYWRQcm9ncmVzczogb3B0aW9ucy5vblByb2dyZXNzLFxuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgdHJhbnNhY3Rpb25hbENvbnRlbnRNRDU6IG9wdGlvbnMudHJhbnNhY3Rpb25hbENvbnRlbnRNRDUsXG4gICAgICAgICAgICAgICAgdHJhbnNhY3Rpb25hbENvbnRlbnRDcmM2NDogb3B0aW9ucy50cmFuc2FjdGlvbmFsQ29udGVudENyYzY0LFxuICAgICAgICAgICAgICAgIGNwa0luZm86IG9wdGlvbnMuY3VzdG9tZXJQcm92aWRlZEtleSxcbiAgICAgICAgICAgICAgICBlbmNyeXB0aW9uU2NvcGU6IG9wdGlvbnMuZW5jcnlwdGlvblNjb3BlLFxuICAgICAgICAgICAgICAgIHRyYWNpbmdPcHRpb25zOiB1cGRhdGVkT3B0aW9ucy50cmFjaW5nT3B0aW9ucyxcbiAgICAgICAgICAgIH0pKTtcbiAgICAgICAgfSk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIFRoZSBTdGFnZSBCbG9jayBGcm9tIFVSTCBvcGVyYXRpb24gY3JlYXRlcyBhIG5ldyBibG9jayB0byBiZSBjb21taXR0ZWQgYXMgcGFydFxuICAgICAqIG9mIGEgYmxvYiB3aGVyZSB0aGUgY29udGVudHMgYXJlIHJlYWQgZnJvbSBhIFVSTC5cbiAgICAgKiBUaGlzIEFQSSBpcyBhdmFpbGFibGUgc3RhcnRpbmcgaW4gdmVyc2lvbiAyMDE4LTAzLTI4LlxuICAgICAqIEBzZWUgaHR0cHM6Ly9kb2NzLm1pY3Jvc29mdC5jb20vZW4tdXMvcmVzdC9hcGkvc3RvcmFnZXNlcnZpY2VzL3B1dC1ibG9jay1mcm9tLXVybFxuICAgICAqXG4gICAgICogQHBhcmFtIGJsb2NrSWQgLSBBIDY0LWJ5dGUgdmFsdWUgdGhhdCBpcyBiYXNlNjQtZW5jb2RlZFxuICAgICAqIEBwYXJhbSBzb3VyY2VVUkwgLSBTcGVjaWZpZXMgdGhlIFVSTCBvZiB0aGUgYmxvYi4gVGhlIHZhbHVlXG4gICAgICogICAgICAgICAgICAgICAgICAgICAgICAgICBtYXkgYmUgYSBVUkwgb2YgdXAgdG8gMiBLQiBpbiBsZW5ndGggdGhhdCBzcGVjaWZpZXMgYSBibG9iLlxuICAgICAqICAgICAgICAgICAgICAgICAgICAgICAgICAgVGhlIHZhbHVlIHNob3VsZCBiZSBVUkwtZW5jb2RlZCBhcyBpdCB3b3VsZCBhcHBlYXJcbiAgICAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgIGluIGEgcmVxdWVzdCBVUkkuIFRoZSBzb3VyY2UgYmxvYiBtdXN0IGVpdGhlciBiZSBwdWJsaWNcbiAgICAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgIG9yIG11c3QgYmUgYXV0aGVudGljYXRlZCB2aWEgYSBzaGFyZWQgYWNjZXNzIHNpZ25hdHVyZS5cbiAgICAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgIElmIHRoZSBzb3VyY2UgYmxvYiBpcyBwdWJsaWMsIG5vIGF1dGhlbnRpY2F0aW9uIGlzIHJlcXVpcmVkXG4gICAgICogICAgICAgICAgICAgICAgICAgICAgICAgICB0byBwZXJmb3JtIHRoZSBvcGVyYXRpb24uIEhlcmUgYXJlIHNvbWUgZXhhbXBsZXMgb2Ygc291cmNlIG9iamVjdCBVUkxzOlxuICAgICAqICAgICAgICAgICAgICAgICAgICAgICAgICAgLSBodHRwczovL215YWNjb3VudC5ibG9iLmNvcmUud2luZG93cy5uZXQvbXljb250YWluZXIvbXlibG9iXG4gICAgICogICAgICAgICAgICAgICAgICAgICAgICAgICAtIGh0dHBzOi8vbXlhY2NvdW50LmJsb2IuY29yZS53aW5kb3dzLm5ldC9teWNvbnRhaW5lci9teWJsb2I/c25hcHNob3Q9PERhdGVUaW1lPlxuICAgICAqIEBwYXJhbSBvZmZzZXQgLSBGcm9tIHdoaWNoIHBvc2l0aW9uIG9mIHRoZSBibG9iIHRvIGRvd25sb2FkLCBncmVhdGVyIHRoYW4gb3IgZXF1YWwgdG8gMFxuICAgICAqIEBwYXJhbSBjb3VudCAtIEhvdyBtdWNoIGRhdGEgdG8gYmUgZG93bmxvYWRlZCwgZ3JlYXRlciB0aGFuIDAuIFdpbGwgZG93bmxvYWQgdG8gdGhlIGVuZCB3aGVuIHVuZGVmaW5lZFxuICAgICAqIEBwYXJhbSBvcHRpb25zIC0gT3B0aW9ucyB0byB0aGUgQmxvY2sgQmxvYiBTdGFnZSBCbG9jayBGcm9tIFVSTCBvcGVyYXRpb24uXG4gICAgICogQHJldHVybnMgUmVzcG9uc2UgZGF0YSBmb3IgdGhlIEJsb2NrIEJsb2IgU3RhZ2UgQmxvY2sgRnJvbSBVUkwgb3BlcmF0aW9uLlxuICAgICAqL1xuICAgIGFzeW5jIHN0YWdlQmxvY2tGcm9tVVJMKGJsb2NrSWQsIHNvdXJjZVVSTCwgb2Zmc2V0ID0gMCwgY291bnQsIG9wdGlvbnMgPSB7fSkge1xuICAgICAgICBlbnN1cmVDcGtJZlNwZWNpZmllZChvcHRpb25zLmN1c3RvbWVyUHJvdmlkZWRLZXksIHRoaXMuaXNIdHRwcyk7XG4gICAgICAgIHJldHVybiB0cmFjaW5nQ2xpZW50LndpdGhTcGFuKFwiQmxvY2tCbG9iQ2xpZW50LXN0YWdlQmxvY2tGcm9tVVJMXCIsIG9wdGlvbnMsIGFzeW5jICh1cGRhdGVkT3B0aW9ucykgPT4ge1xuICAgICAgICAgICAgcmV0dXJuIGFzc2VydFJlc3BvbnNlKGF3YWl0IHRoaXMuYmxvY2tCbG9iQ29udGV4dC5zdGFnZUJsb2NrRnJvbVVSTChibG9ja0lkLCAwLCBzb3VyY2VVUkwsIHtcbiAgICAgICAgICAgICAgICBhYm9ydFNpZ25hbDogb3B0aW9ucy5hYm9ydFNpZ25hbCxcbiAgICAgICAgICAgICAgICBsZWFzZUFjY2Vzc0NvbmRpdGlvbnM6IG9wdGlvbnMuY29uZGl0aW9ucyxcbiAgICAgICAgICAgICAgICBzb3VyY2VDb250ZW50TUQ1OiBvcHRpb25zLnNvdXJjZUNvbnRlbnRNRDUsXG4gICAgICAgICAgICAgICAgc291cmNlQ29udGVudENyYzY0OiBvcHRpb25zLnNvdXJjZUNvbnRlbnRDcmM2NCxcbiAgICAgICAgICAgICAgICBzb3VyY2VSYW5nZTogb2Zmc2V0ID09PSAwICYmICFjb3VudCA/IHVuZGVmaW5lZCA6IHJhbmdlVG9TdHJpbmcoeyBvZmZzZXQsIGNvdW50IH0pLFxuICAgICAgICAgICAgICAgIGNwa0luZm86IG9wdGlvbnMuY3VzdG9tZXJQcm92aWRlZEtleSxcbiAgICAgICAgICAgICAgICBlbmNyeXB0aW9uU2NvcGU6IG9wdGlvbnMuZW5jcnlwdGlvblNjb3BlLFxuICAgICAgICAgICAgICAgIGNvcHlTb3VyY2VBdXRob3JpemF0aW9uOiBodHRwQXV0aG9yaXphdGlvblRvU3RyaW5nKG9wdGlvbnMuc291cmNlQXV0aG9yaXphdGlvbiksXG4gICAgICAgICAgICAgICAgdHJhY2luZ09wdGlvbnM6IHVwZGF0ZWRPcHRpb25zLnRyYWNpbmdPcHRpb25zLFxuICAgICAgICAgICAgfSkpO1xuICAgICAgICB9KTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogV3JpdGVzIGEgYmxvYiBieSBzcGVjaWZ5aW5nIHRoZSBsaXN0IG9mIGJsb2NrIElEcyB0aGF0IG1ha2UgdXAgdGhlIGJsb2IuXG4gICAgICogSW4gb3JkZXIgdG8gYmUgd3JpdHRlbiBhcyBwYXJ0IG9mIGEgYmxvYiwgYSBibG9jayBtdXN0IGhhdmUgYmVlbiBzdWNjZXNzZnVsbHkgd3JpdHRlblxuICAgICAqIHRvIHRoZSBzZXJ2ZXIgaW4gYSBwcmlvciB7QGxpbmsgc3RhZ2VCbG9ja30gb3BlcmF0aW9uLiBZb3UgY2FuIGNhbGwge0BsaW5rIGNvbW1pdEJsb2NrTGlzdH0gdG9cbiAgICAgKiB1cGRhdGUgYSBibG9iIGJ5IHVwbG9hZGluZyBvbmx5IHRob3NlIGJsb2NrcyB0aGF0IGhhdmUgY2hhbmdlZCwgdGhlbiBjb21taXR0aW5nIHRoZSBuZXcgYW5kIGV4aXN0aW5nXG4gICAgICogYmxvY2tzIHRvZ2V0aGVyLiBBbnkgYmxvY2tzIG5vdCBzcGVjaWZpZWQgaW4gdGhlIGJsb2NrIGxpc3QgYW5kIHBlcm1hbmVudGx5IGRlbGV0ZWQuXG4gICAgICogQHNlZSBodHRwczovL2RvY3MubWljcm9zb2Z0LmNvbS9yZXN0L2FwaS9zdG9yYWdlc2VydmljZXMvcHV0LWJsb2NrLWxpc3RcbiAgICAgKlxuICAgICAqIEBwYXJhbSBibG9ja3MgLSAgQXJyYXkgb2YgNjQtYnl0ZSB2YWx1ZSB0aGF0IGlzIGJhc2U2NC1lbmNvZGVkXG4gICAgICogQHBhcmFtIG9wdGlvbnMgLSBPcHRpb25zIHRvIHRoZSBCbG9jayBCbG9iIENvbW1pdCBCbG9jayBMaXN0IG9wZXJhdGlvbi5cbiAgICAgKiBAcmV0dXJucyBSZXNwb25zZSBkYXRhIGZvciB0aGUgQmxvY2sgQmxvYiBDb21taXQgQmxvY2sgTGlzdCBvcGVyYXRpb24uXG4gICAgICovXG4gICAgYXN5bmMgY29tbWl0QmxvY2tMaXN0KGJsb2Nrcywgb3B0aW9ucyA9IHt9KSB7XG4gICAgICAgIG9wdGlvbnMuY29uZGl0aW9ucyA9IG9wdGlvbnMuY29uZGl0aW9ucyB8fCB7fTtcbiAgICAgICAgZW5zdXJlQ3BrSWZTcGVjaWZpZWQob3B0aW9ucy5jdXN0b21lclByb3ZpZGVkS2V5LCB0aGlzLmlzSHR0cHMpO1xuICAgICAgICByZXR1cm4gdHJhY2luZ0NsaWVudC53aXRoU3BhbihcIkJsb2NrQmxvYkNsaWVudC1jb21taXRCbG9ja0xpc3RcIiwgb3B0aW9ucywgYXN5bmMgKHVwZGF0ZWRPcHRpb25zKSA9PiB7XG4gICAgICAgICAgICB2YXIgX2EsIF9iLCBfYztcbiAgICAgICAgICAgIHJldHVybiBhc3NlcnRSZXNwb25zZShhd2FpdCB0aGlzLmJsb2NrQmxvYkNvbnRleHQuY29tbWl0QmxvY2tMaXN0KHsgbGF0ZXN0OiBibG9ja3MgfSwge1xuICAgICAgICAgICAgICAgIGFib3J0U2lnbmFsOiBvcHRpb25zLmFib3J0U2lnbmFsLFxuICAgICAgICAgICAgICAgIGJsb2JIdHRwSGVhZGVyczogb3B0aW9ucy5ibG9iSFRUUEhlYWRlcnMsXG4gICAgICAgICAgICAgICAgbGVhc2VBY2Nlc3NDb25kaXRpb25zOiBvcHRpb25zLmNvbmRpdGlvbnMsXG4gICAgICAgICAgICAgICAgbWV0YWRhdGE6IG9wdGlvbnMubWV0YWRhdGEsXG4gICAgICAgICAgICAgICAgbW9kaWZpZWRBY2Nlc3NDb25kaXRpb25zOiBPYmplY3QuYXNzaWduKE9iamVjdC5hc3NpZ24oe30sIG9wdGlvbnMuY29uZGl0aW9ucyksIHsgaWZUYWdzOiAoX2EgPSBvcHRpb25zLmNvbmRpdGlvbnMpID09PSBudWxsIHx8IF9hID09PSB2b2lkIDAgPyB2b2lkIDAgOiBfYS50YWdDb25kaXRpb25zIH0pLFxuICAgICAgICAgICAgICAgIGNwa0luZm86IG9wdGlvbnMuY3VzdG9tZXJQcm92aWRlZEtleSxcbiAgICAgICAgICAgICAgICBlbmNyeXB0aW9uU2NvcGU6IG9wdGlvbnMuZW5jcnlwdGlvblNjb3BlLFxuICAgICAgICAgICAgICAgIGltbXV0YWJpbGl0eVBvbGljeUV4cGlyeTogKF9iID0gb3B0aW9ucy5pbW11dGFiaWxpdHlQb2xpY3kpID09PSBudWxsIHx8IF9iID09PSB2b2lkIDAgPyB2b2lkIDAgOiBfYi5leHBpcmllc09uLFxuICAgICAgICAgICAgICAgIGltbXV0YWJpbGl0eVBvbGljeU1vZGU6IChfYyA9IG9wdGlvbnMuaW1tdXRhYmlsaXR5UG9saWN5KSA9PT0gbnVsbCB8fCBfYyA9PT0gdm9pZCAwID8gdm9pZCAwIDogX2MucG9saWN5TW9kZSxcbiAgICAgICAgICAgICAgICBsZWdhbEhvbGQ6IG9wdGlvbnMubGVnYWxIb2xkLFxuICAgICAgICAgICAgICAgIHRpZXI6IHRvQWNjZXNzVGllcihvcHRpb25zLnRpZXIpLFxuICAgICAgICAgICAgICAgIGJsb2JUYWdzU3RyaW5nOiB0b0Jsb2JUYWdzU3RyaW5nKG9wdGlvbnMudGFncyksXG4gICAgICAgICAgICAgICAgdHJhY2luZ09wdGlvbnM6IHVwZGF0ZWRPcHRpb25zLnRyYWNpbmdPcHRpb25zLFxuICAgICAgICAgICAgfSkpO1xuICAgICAgICB9KTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogUmV0dXJucyB0aGUgbGlzdCBvZiBibG9ja3MgdGhhdCBoYXZlIGJlZW4gdXBsb2FkZWQgYXMgcGFydCBvZiBhIGJsb2NrIGJsb2JcbiAgICAgKiB1c2luZyB0aGUgc3BlY2lmaWVkIGJsb2NrIGxpc3QgZmlsdGVyLlxuICAgICAqIEBzZWUgaHR0cHM6Ly9kb2NzLm1pY3Jvc29mdC5jb20vcmVzdC9hcGkvc3RvcmFnZXNlcnZpY2VzL2dldC1ibG9jay1saXN0XG4gICAgICpcbiAgICAgKiBAcGFyYW0gbGlzdFR5cGUgLSBTcGVjaWZpZXMgd2hldGhlciB0byByZXR1cm4gdGhlIGxpc3Qgb2YgY29tbWl0dGVkIGJsb2NrcyxcbiAgICAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGUgbGlzdCBvZiB1bmNvbW1pdHRlZCBibG9ja3MsIG9yIGJvdGggbGlzdHMgdG9nZXRoZXIuXG4gICAgICogQHBhcmFtIG9wdGlvbnMgLSBPcHRpb25zIHRvIHRoZSBCbG9jayBCbG9iIEdldCBCbG9jayBMaXN0IG9wZXJhdGlvbi5cbiAgICAgKiBAcmV0dXJucyBSZXNwb25zZSBkYXRhIGZvciB0aGUgQmxvY2sgQmxvYiBHZXQgQmxvY2sgTGlzdCBvcGVyYXRpb24uXG4gICAgICovXG4gICAgYXN5bmMgZ2V0QmxvY2tMaXN0KGxpc3RUeXBlLCBvcHRpb25zID0ge30pIHtcbiAgICAgICAgcmV0dXJuIHRyYWNpbmdDbGllbnQud2l0aFNwYW4oXCJCbG9ja0Jsb2JDbGllbnQtZ2V0QmxvY2tMaXN0XCIsIG9wdGlvbnMsIGFzeW5jICh1cGRhdGVkT3B0aW9ucykgPT4ge1xuICAgICAgICAgICAgdmFyIF9hO1xuICAgICAgICAgICAgY29uc3QgcmVzID0gYXNzZXJ0UmVzcG9uc2UoYXdhaXQgdGhpcy5ibG9ja0Jsb2JDb250ZXh0LmdldEJsb2NrTGlzdChsaXN0VHlwZSwge1xuICAgICAgICAgICAgICAgIGFib3J0U2lnbmFsOiBvcHRpb25zLmFib3J0U2lnbmFsLFxuICAgICAgICAgICAgICAgIGxlYXNlQWNjZXNzQ29uZGl0aW9uczogb3B0aW9ucy5jb25kaXRpb25zLFxuICAgICAgICAgICAgICAgIG1vZGlmaWVkQWNjZXNzQ29uZGl0aW9uczogT2JqZWN0LmFzc2lnbihPYmplY3QuYXNzaWduKHt9LCBvcHRpb25zLmNvbmRpdGlvbnMpLCB7IGlmVGFnczogKF9hID0gb3B0aW9ucy5jb25kaXRpb25zKSA9PT0gbnVsbCB8fCBfYSA9PT0gdm9pZCAwID8gdm9pZCAwIDogX2EudGFnQ29uZGl0aW9ucyB9KSxcbiAgICAgICAgICAgICAgICB0cmFjaW5nT3B0aW9uczogdXBkYXRlZE9wdGlvbnMudHJhY2luZ09wdGlvbnMsXG4gICAgICAgICAgICB9KSk7XG4gICAgICAgICAgICBpZiAoIXJlcy5jb21taXR0ZWRCbG9ja3MpIHtcbiAgICAgICAgICAgICAgICByZXMuY29tbWl0dGVkQmxvY2tzID0gW107XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAoIXJlcy51bmNvbW1pdHRlZEJsb2Nrcykge1xuICAgICAgICAgICAgICAgIHJlcy51bmNvbW1pdHRlZEJsb2NrcyA9IFtdO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIHJlcztcbiAgICAgICAgfSk7XG4gICAgfVxuICAgIC8vIEhpZ2ggbGV2ZWwgZnVuY3Rpb25zXG4gICAgLyoqXG4gICAgICogVXBsb2FkcyBhIEJ1ZmZlcihOb2RlLmpzKS9CbG9iKGJyb3dzZXJzKS9BcnJheUJ1ZmZlci9BcnJheUJ1ZmZlclZpZXcgb2JqZWN0IHRvIGEgQmxvY2tCbG9iLlxuICAgICAqXG4gICAgICogV2hlbiBkYXRhIGxlbmd0aCBpcyBubyBtb3JlIHRoYW4gdGhlIHNwZWNpZmlsZWQge0BsaW5rIEJsb2NrQmxvYlBhcmFsbGVsVXBsb2FkT3B0aW9ucy5tYXhTaW5nbGVTaG90U2l6ZX0gKGRlZmF1bHQgaXNcbiAgICAgKiB7QGxpbmsgQkxPQ0tfQkxPQl9NQVhfVVBMT0FEX0JMT0JfQllURVN9KSwgdGhpcyBtZXRob2Qgd2lsbCB1c2UgMSB7QGxpbmsgdXBsb2FkfSBjYWxsIHRvIGZpbmlzaCB0aGUgdXBsb2FkLlxuICAgICAqIE90aGVyd2lzZSwgdGhpcyBtZXRob2Qgd2lsbCBjYWxsIHtAbGluayBzdGFnZUJsb2NrfSB0byB1cGxvYWQgYmxvY2tzLCBhbmQgZmluYWxseSBjYWxsIHtAbGluayBjb21taXRCbG9ja0xpc3R9XG4gICAgICogdG8gY29tbWl0IHRoZSBibG9jayBsaXN0LlxuICAgICAqXG4gICAgICogQSBjb21tb24ge0BsaW5rIEJsb2NrQmxvYlBhcmFsbGVsVXBsb2FkT3B0aW9ucy5ibG9iSFRUUEhlYWRlcnN9IG9wdGlvbiB0byBzZXQgaXNcbiAgICAgKiBgYmxvYkNvbnRlbnRUeXBlYCwgZW5hYmxpbmcgdGhlIGJyb3dzZXIgdG8gcHJvdmlkZVxuICAgICAqIGZ1bmN0aW9uYWxpdHkgYmFzZWQgb24gZmlsZSB0eXBlLlxuICAgICAqXG4gICAgICogQHBhcmFtIGRhdGEgLSBCdWZmZXIoTm9kZS5qcyksIEJsb2IsIEFycmF5QnVmZmVyIG9yIEFycmF5QnVmZmVyVmlld1xuICAgICAqIEBwYXJhbSBvcHRpb25zIC1cbiAgICAgKi9cbiAgICBhc3luYyB1cGxvYWREYXRhKGRhdGEsIG9wdGlvbnMgPSB7fSkge1xuICAgICAgICByZXR1cm4gdHJhY2luZ0NsaWVudC53aXRoU3BhbihcIkJsb2NrQmxvYkNsaWVudC11cGxvYWREYXRhXCIsIG9wdGlvbnMsIGFzeW5jICh1cGRhdGVkT3B0aW9ucykgPT4ge1xuICAgICAgICAgICAgaWYgKGNvcmVVdGlsLmlzTm9kZSkge1xuICAgICAgICAgICAgICAgIGxldCBidWZmZXI7XG4gICAgICAgICAgICAgICAgaWYgKGRhdGEgaW5zdGFuY2VvZiBCdWZmZXIpIHtcbiAgICAgICAgICAgICAgICAgICAgYnVmZmVyID0gZGF0YTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgZWxzZSBpZiAoZGF0YSBpbnN0YW5jZW9mIEFycmF5QnVmZmVyKSB7XG4gICAgICAgICAgICAgICAgICAgIGJ1ZmZlciA9IEJ1ZmZlci5mcm9tKGRhdGEpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgZGF0YSA9IGRhdGE7XG4gICAgICAgICAgICAgICAgICAgIGJ1ZmZlciA9IEJ1ZmZlci5mcm9tKGRhdGEuYnVmZmVyLCBkYXRhLmJ5dGVPZmZzZXQsIGRhdGEuYnl0ZUxlbmd0aCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLnVwbG9hZFNlZWthYmxlSW50ZXJuYWwoKG9mZnNldCwgc2l6ZSkgPT4gYnVmZmVyLnNsaWNlKG9mZnNldCwgb2Zmc2V0ICsgc2l6ZSksIGJ1ZmZlci5ieXRlTGVuZ3RoLCB1cGRhdGVkT3B0aW9ucyk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICBjb25zdCBicm93c2VyQmxvYiA9IG5ldyBCbG9iKFtkYXRhXSk7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMudXBsb2FkU2Vla2FibGVJbnRlcm5hbCgob2Zmc2V0LCBzaXplKSA9PiBicm93c2VyQmxvYi5zbGljZShvZmZzZXQsIG9mZnNldCArIHNpemUpLCBicm93c2VyQmxvYi5zaXplLCB1cGRhdGVkT3B0aW9ucyk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBPTkxZIEFWQUlMQUJMRSBJTiBCUk9XU0VSUy5cbiAgICAgKlxuICAgICAqIFVwbG9hZHMgYSBicm93c2VyIEJsb2IvRmlsZS9BcnJheUJ1ZmZlci9BcnJheUJ1ZmZlclZpZXcgb2JqZWN0IHRvIGJsb2NrIGJsb2IuXG4gICAgICpcbiAgICAgKiBXaGVuIGJ1ZmZlciBsZW5ndGggbGVzc2VyIHRoYW4gb3IgZXF1YWwgdG8gMjU2TUIsIHRoaXMgbWV0aG9kIHdpbGwgdXNlIDEgdXBsb2FkIGNhbGwgdG8gZmluaXNoIHRoZSB1cGxvYWQuXG4gICAgICogT3RoZXJ3aXNlLCB0aGlzIG1ldGhvZCB3aWxsIGNhbGwge0BsaW5rIHN0YWdlQmxvY2t9IHRvIHVwbG9hZCBibG9ja3MsIGFuZCBmaW5hbGx5IGNhbGxcbiAgICAgKiB7QGxpbmsgY29tbWl0QmxvY2tMaXN0fSB0byBjb21taXQgdGhlIGJsb2NrIGxpc3QuXG4gICAgICpcbiAgICAgKiBBIGNvbW1vbiB7QGxpbmsgQmxvY2tCbG9iUGFyYWxsZWxVcGxvYWRPcHRpb25zLmJsb2JIVFRQSGVhZGVyc30gb3B0aW9uIHRvIHNldCBpc1xuICAgICAqIGBibG9iQ29udGVudFR5cGVgLCBlbmFibGluZyB0aGUgYnJvd3NlciB0byBwcm92aWRlXG4gICAgICogZnVuY3Rpb25hbGl0eSBiYXNlZCBvbiBmaWxlIHR5cGUuXG4gICAgICpcbiAgICAgKiBAZGVwcmVjYXRlZCBVc2Uge0BsaW5rIHVwbG9hZERhdGF9IGluc3RlYWQuXG4gICAgICpcbiAgICAgKiBAcGFyYW0gYnJvd3NlckRhdGEgLSBCbG9iLCBGaWxlLCBBcnJheUJ1ZmZlciBvciBBcnJheUJ1ZmZlclZpZXdcbiAgICAgKiBAcGFyYW0gb3B0aW9ucyAtIE9wdGlvbnMgdG8gdXBsb2FkIGJyb3dzZXIgZGF0YS5cbiAgICAgKiBAcmV0dXJucyBSZXNwb25zZSBkYXRhIGZvciB0aGUgQmxvYiBVcGxvYWQgb3BlcmF0aW9uLlxuICAgICAqL1xuICAgIGFzeW5jIHVwbG9hZEJyb3dzZXJEYXRhKGJyb3dzZXJEYXRhLCBvcHRpb25zID0ge30pIHtcbiAgICAgICAgcmV0dXJuIHRyYWNpbmdDbGllbnQud2l0aFNwYW4oXCJCbG9ja0Jsb2JDbGllbnQtdXBsb2FkQnJvd3NlckRhdGFcIiwgb3B0aW9ucywgYXN5bmMgKHVwZGF0ZWRPcHRpb25zKSA9PiB7XG4gICAgICAgICAgICBjb25zdCBicm93c2VyQmxvYiA9IG5ldyBCbG9iKFticm93c2VyRGF0YV0pO1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMudXBsb2FkU2Vla2FibGVJbnRlcm5hbCgob2Zmc2V0LCBzaXplKSA9PiBicm93c2VyQmxvYi5zbGljZShvZmZzZXQsIG9mZnNldCArIHNpemUpLCBicm93c2VyQmxvYi5zaXplLCB1cGRhdGVkT3B0aW9ucyk7XG4gICAgICAgIH0pO1xuICAgIH1cbiAgICAvKipcbiAgICAgKlxuICAgICAqIFVwbG9hZHMgZGF0YSB0byBibG9jayBibG9iLiBSZXF1aXJlcyBhIGJvZHlGYWN0b3J5IGFzIHRoZSBkYXRhIHNvdXJjZSxcbiAgICAgKiB3aGljaCBuZWVkIHRvIHJldHVybiBhIHtAbGluayBIdHRwUmVxdWVzdEJvZHl9IG9iamVjdCB3aXRoIHRoZSBvZmZzZXQgYW5kIHNpemUgcHJvdmlkZWQuXG4gICAgICpcbiAgICAgKiBXaGVuIGRhdGEgbGVuZ3RoIGlzIG5vIG1vcmUgdGhhbiB0aGUgc3BlY2lmaWVkIHtAbGluayBCbG9ja0Jsb2JQYXJhbGxlbFVwbG9hZE9wdGlvbnMubWF4U2luZ2xlU2hvdFNpemV9IChkZWZhdWx0IGlzXG4gICAgICoge0BsaW5rIEJMT0NLX0JMT0JfTUFYX1VQTE9BRF9CTE9CX0JZVEVTfSksIHRoaXMgbWV0aG9kIHdpbGwgdXNlIDEge0BsaW5rIHVwbG9hZH0gY2FsbCB0byBmaW5pc2ggdGhlIHVwbG9hZC5cbiAgICAgKiBPdGhlcndpc2UsIHRoaXMgbWV0aG9kIHdpbGwgY2FsbCB7QGxpbmsgc3RhZ2VCbG9ja30gdG8gdXBsb2FkIGJsb2NrcywgYW5kIGZpbmFsbHkgY2FsbCB7QGxpbmsgY29tbWl0QmxvY2tMaXN0fVxuICAgICAqIHRvIGNvbW1pdCB0aGUgYmxvY2sgbGlzdC5cbiAgICAgKlxuICAgICAqIEBwYXJhbSBib2R5RmFjdG9yeSAtXG4gICAgICogQHBhcmFtIHNpemUgLSBzaXplIG9mIHRoZSBkYXRhIHRvIHVwbG9hZC5cbiAgICAgKiBAcGFyYW0gb3B0aW9ucyAtIE9wdGlvbnMgdG8gVXBsb2FkIHRvIEJsb2NrIEJsb2Igb3BlcmF0aW9uLlxuICAgICAqIEByZXR1cm5zIFJlc3BvbnNlIGRhdGEgZm9yIHRoZSBCbG9iIFVwbG9hZCBvcGVyYXRpb24uXG4gICAgICovXG4gICAgYXN5bmMgdXBsb2FkU2Vla2FibGVJbnRlcm5hbChib2R5RmFjdG9yeSwgc2l6ZSwgb3B0aW9ucyA9IHt9KSB7XG4gICAgICAgIHZhciBfYSwgX2I7XG4gICAgICAgIGxldCBibG9ja1NpemUgPSAoX2EgPSBvcHRpb25zLmJsb2NrU2l6ZSkgIT09IG51bGwgJiYgX2EgIT09IHZvaWQgMCA/IF9hIDogMDtcbiAgICAgICAgaWYgKGJsb2NrU2l6ZSA8IDAgfHwgYmxvY2tTaXplID4gQkxPQ0tfQkxPQl9NQVhfU1RBR0VfQkxPQ0tfQllURVMpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBSYW5nZUVycm9yKGBibG9ja1NpemUgb3B0aW9uIG11c3QgYmUgPj0gMCBhbmQgPD0gJHtCTE9DS19CTE9CX01BWF9TVEFHRV9CTE9DS19CWVRFU31gKTtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBtYXhTaW5nbGVTaG90U2l6ZSA9IChfYiA9IG9wdGlvbnMubWF4U2luZ2xlU2hvdFNpemUpICE9PSBudWxsICYmIF9iICE9PSB2b2lkIDAgPyBfYiA6IEJMT0NLX0JMT0JfTUFYX1VQTE9BRF9CTE9CX0JZVEVTO1xuICAgICAgICBpZiAobWF4U2luZ2xlU2hvdFNpemUgPCAwIHx8IG1heFNpbmdsZVNob3RTaXplID4gQkxPQ0tfQkxPQl9NQVhfVVBMT0FEX0JMT0JfQllURVMpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBSYW5nZUVycm9yKGBtYXhTaW5nbGVTaG90U2l6ZSBvcHRpb24gbXVzdCBiZSA+PSAwIGFuZCA8PSAke0JMT0NLX0JMT0JfTUFYX1VQTE9BRF9CTE9CX0JZVEVTfWApO1xuICAgICAgICB9XG4gICAgICAgIGlmIChibG9ja1NpemUgPT09IDApIHtcbiAgICAgICAgICAgIGlmIChzaXplID4gQkxPQ0tfQkxPQl9NQVhfU1RBR0VfQkxPQ0tfQllURVMgKiBCTE9DS19CTE9CX01BWF9CTE9DS1MpIHtcbiAgICAgICAgICAgICAgICB0aHJvdyBuZXcgUmFuZ2VFcnJvcihgJHtzaXplfSBpcyB0b28gbGFyZ2VyIHRvIHVwbG9hZCB0byBhIGJsb2NrIGJsb2IuYCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAoc2l6ZSA+IG1heFNpbmdsZVNob3RTaXplKSB7XG4gICAgICAgICAgICAgICAgYmxvY2tTaXplID0gTWF0aC5jZWlsKHNpemUgLyBCTE9DS19CTE9CX01BWF9CTE9DS1MpO1xuICAgICAgICAgICAgICAgIGlmIChibG9ja1NpemUgPCBERUZBVUxUX0JMT0JfRE9XTkxPQURfQkxPQ0tfQllURVMpIHtcbiAgICAgICAgICAgICAgICAgICAgYmxvY2tTaXplID0gREVGQVVMVF9CTE9CX0RPV05MT0FEX0JMT0NLX0JZVEVTO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBpZiAoIW9wdGlvbnMuYmxvYkhUVFBIZWFkZXJzKSB7XG4gICAgICAgICAgICBvcHRpb25zLmJsb2JIVFRQSGVhZGVycyA9IHt9O1xuICAgICAgICB9XG4gICAgICAgIGlmICghb3B0aW9ucy5jb25kaXRpb25zKSB7XG4gICAgICAgICAgICBvcHRpb25zLmNvbmRpdGlvbnMgPSB7fTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gdHJhY2luZ0NsaWVudC53aXRoU3BhbihcIkJsb2NrQmxvYkNsaWVudC11cGxvYWRTZWVrYWJsZUludGVybmFsXCIsIG9wdGlvbnMsIGFzeW5jICh1cGRhdGVkT3B0aW9ucykgPT4ge1xuICAgICAgICAgICAgaWYgKHNpemUgPD0gbWF4U2luZ2xlU2hvdFNpemUpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gYXNzZXJ0UmVzcG9uc2UoYXdhaXQgdGhpcy51cGxvYWQoYm9keUZhY3RvcnkoMCwgc2l6ZSksIHNpemUsIHVwZGF0ZWRPcHRpb25zKSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBjb25zdCBudW1CbG9ja3MgPSBNYXRoLmZsb29yKChzaXplIC0gMSkgLyBibG9ja1NpemUpICsgMTtcbiAgICAgICAgICAgIGlmIChudW1CbG9ja3MgPiBCTE9DS19CTE9CX01BWF9CTE9DS1MpIHtcbiAgICAgICAgICAgICAgICB0aHJvdyBuZXcgUmFuZ2VFcnJvcihgVGhlIGJ1ZmZlcidzIHNpemUgaXMgdG9vIGJpZyBvciB0aGUgQmxvY2tTaXplIGlzIHRvbyBzbWFsbDtgICtcbiAgICAgICAgICAgICAgICAgICAgYHRoZSBudW1iZXIgb2YgYmxvY2tzIG11c3QgYmUgPD0gJHtCTE9DS19CTE9CX01BWF9CTE9DS1N9YCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBjb25zdCBibG9ja0xpc3QgPSBbXTtcbiAgICAgICAgICAgIGNvbnN0IGJsb2NrSURQcmVmaXggPSBjb3JlVXRpbC5yYW5kb21VVUlEKCk7XG4gICAgICAgICAgICBsZXQgdHJhbnNmZXJQcm9ncmVzcyA9IDA7XG4gICAgICAgICAgICBjb25zdCBiYXRjaCA9IG5ldyBCYXRjaChvcHRpb25zLmNvbmN1cnJlbmN5KTtcbiAgICAgICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgbnVtQmxvY2tzOyBpKyspIHtcbiAgICAgICAgICAgICAgICBiYXRjaC5hZGRPcGVyYXRpb24oYXN5bmMgKCkgPT4ge1xuICAgICAgICAgICAgICAgICAgICBjb25zdCBibG9ja0lEID0gZ2VuZXJhdGVCbG9ja0lEKGJsb2NrSURQcmVmaXgsIGkpO1xuICAgICAgICAgICAgICAgICAgICBjb25zdCBzdGFydCA9IGJsb2NrU2l6ZSAqIGk7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IGVuZCA9IGkgPT09IG51bUJsb2NrcyAtIDEgPyBzaXplIDogc3RhcnQgKyBibG9ja1NpemU7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IGNvbnRlbnRMZW5ndGggPSBlbmQgLSBzdGFydDtcbiAgICAgICAgICAgICAgICAgICAgYmxvY2tMaXN0LnB1c2goYmxvY2tJRCk7XG4gICAgICAgICAgICAgICAgICAgIGF3YWl0IHRoaXMuc3RhZ2VCbG9jayhibG9ja0lELCBib2R5RmFjdG9yeShzdGFydCwgY29udGVudExlbmd0aCksIGNvbnRlbnRMZW5ndGgsIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGFib3J0U2lnbmFsOiBvcHRpb25zLmFib3J0U2lnbmFsLFxuICAgICAgICAgICAgICAgICAgICAgICAgY29uZGl0aW9uczogb3B0aW9ucy5jb25kaXRpb25zLFxuICAgICAgICAgICAgICAgICAgICAgICAgZW5jcnlwdGlvblNjb3BlOiBvcHRpb25zLmVuY3J5cHRpb25TY29wZSxcbiAgICAgICAgICAgICAgICAgICAgICAgIHRyYWNpbmdPcHRpb25zOiB1cGRhdGVkT3B0aW9ucy50cmFjaW5nT3B0aW9ucyxcbiAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgICAgIC8vIFVwZGF0ZSBwcm9ncmVzcyBhZnRlciBibG9jayBpcyBzdWNjZXNzZnVsbHkgdXBsb2FkZWQgdG8gc2VydmVyLCBpbiBjYXNlIG9mIGJsb2NrIHRyeWluZ1xuICAgICAgICAgICAgICAgICAgICAvLyBUT0RPOiBIb29rIHdpdGggY29udmVuaWVuY2UgbGF5ZXIgcHJvZ3Jlc3MgZXZlbnQgaW4gZmluZXIgbGV2ZWxcbiAgICAgICAgICAgICAgICAgICAgdHJhbnNmZXJQcm9ncmVzcyArPSBjb250ZW50TGVuZ3RoO1xuICAgICAgICAgICAgICAgICAgICBpZiAob3B0aW9ucy5vblByb2dyZXNzKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBvcHRpb25zLm9uUHJvZ3Jlc3Moe1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxvYWRlZEJ5dGVzOiB0cmFuc2ZlclByb2dyZXNzLFxuICAgICAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGF3YWl0IGJhdGNoLmRvKCk7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy5jb21taXRCbG9ja0xpc3QoYmxvY2tMaXN0LCB1cGRhdGVkT3B0aW9ucyk7XG4gICAgICAgIH0pO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBPTkxZIEFWQUlMQUJMRSBJTiBOT0RFLkpTIFJVTlRJTUUuXG4gICAgICpcbiAgICAgKiBVcGxvYWRzIGEgbG9jYWwgZmlsZSBpbiBibG9ja3MgdG8gYSBibG9jayBibG9iLlxuICAgICAqXG4gICAgICogV2hlbiBmaWxlIHNpemUgbGVzc2VyIHRoYW4gb3IgZXF1YWwgdG8gMjU2TUIsIHRoaXMgbWV0aG9kIHdpbGwgdXNlIDEgdXBsb2FkIGNhbGwgdG8gZmluaXNoIHRoZSB1cGxvYWQuXG4gICAgICogT3RoZXJ3aXNlLCB0aGlzIG1ldGhvZCB3aWxsIGNhbGwgc3RhZ2VCbG9jayB0byB1cGxvYWQgYmxvY2tzLCBhbmQgZmluYWxseSBjYWxsIGNvbW1pdEJsb2NrTGlzdFxuICAgICAqIHRvIGNvbW1pdCB0aGUgYmxvY2sgbGlzdC5cbiAgICAgKlxuICAgICAqIEBwYXJhbSBmaWxlUGF0aCAtIEZ1bGwgcGF0aCBvZiBsb2NhbCBmaWxlXG4gICAgICogQHBhcmFtIG9wdGlvbnMgLSBPcHRpb25zIHRvIFVwbG9hZCB0byBCbG9jayBCbG9iIG9wZXJhdGlvbi5cbiAgICAgKiBAcmV0dXJucyBSZXNwb25zZSBkYXRhIGZvciB0aGUgQmxvYiBVcGxvYWQgb3BlcmF0aW9uLlxuICAgICAqL1xuICAgIGFzeW5jIHVwbG9hZEZpbGUoZmlsZVBhdGgsIG9wdGlvbnMgPSB7fSkge1xuICAgICAgICByZXR1cm4gdHJhY2luZ0NsaWVudC53aXRoU3BhbihcIkJsb2NrQmxvYkNsaWVudC11cGxvYWRGaWxlXCIsIG9wdGlvbnMsIGFzeW5jICh1cGRhdGVkT3B0aW9ucykgPT4ge1xuICAgICAgICAgICAgY29uc3Qgc2l6ZSA9IChhd2FpdCBmc1N0YXQoZmlsZVBhdGgpKS5zaXplO1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMudXBsb2FkU2Vla2FibGVJbnRlcm5hbCgob2Zmc2V0LCBjb3VudCkgPT4ge1xuICAgICAgICAgICAgICAgIHJldHVybiAoKSA9PiBmc0NyZWF0ZVJlYWRTdHJlYW0oZmlsZVBhdGgsIHtcbiAgICAgICAgICAgICAgICAgICAgYXV0b0Nsb3NlOiB0cnVlLFxuICAgICAgICAgICAgICAgICAgICBlbmQ6IGNvdW50ID8gb2Zmc2V0ICsgY291bnQgLSAxIDogSW5maW5pdHksXG4gICAgICAgICAgICAgICAgICAgIHN0YXJ0OiBvZmZzZXQsXG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB9LCBzaXplLCBPYmplY3QuYXNzaWduKE9iamVjdC5hc3NpZ24oe30sIG9wdGlvbnMpLCB7IHRyYWNpbmdPcHRpb25zOiB1cGRhdGVkT3B0aW9ucy50cmFjaW5nT3B0aW9ucyB9KSk7XG4gICAgICAgIH0pO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBPTkxZIEFWQUlMQUJMRSBJTiBOT0RFLkpTIFJVTlRJTUUuXG4gICAgICpcbiAgICAgKiBVcGxvYWRzIGEgTm9kZS5qcyBSZWFkYWJsZSBzdHJlYW0gaW50byBibG9jayBibG9iLlxuICAgICAqXG4gICAgICogUEVSRk9STUFOQ0UgSU1QUk9WRU1FTlQgVElQUzpcbiAgICAgKiAqIElucHV0IHN0cmVhbSBoaWdoV2F0ZXJNYXJrIGlzIGJldHRlciB0byBzZXQgYSBzYW1lIHZhbHVlIHdpdGggYnVmZmVyU2l6ZVxuICAgICAqICAgIHBhcmFtZXRlciwgd2hpY2ggd2lsbCBhdm9pZCBCdWZmZXIuY29uY2F0KCkgb3BlcmF0aW9ucy5cbiAgICAgKlxuICAgICAqIEBwYXJhbSBzdHJlYW0gLSBOb2RlLmpzIFJlYWRhYmxlIHN0cmVhbVxuICAgICAqIEBwYXJhbSBidWZmZXJTaXplIC0gU2l6ZSBvZiBldmVyeSBidWZmZXIgYWxsb2NhdGVkLCBhbHNvIHRoZSBibG9jayBzaXplIGluIHRoZSB1cGxvYWRlZCBibG9jayBibG9iLiBEZWZhdWx0IHZhbHVlIGlzIDhNQlxuICAgICAqIEBwYXJhbSBtYXhDb25jdXJyZW5jeSAtICBNYXggY29uY3VycmVuY3kgaW5kaWNhdGVzIHRoZSBtYXggbnVtYmVyIG9mIGJ1ZmZlcnMgdGhhdCBjYW4gYmUgYWxsb2NhdGVkLFxuICAgICAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcG9zaXRpdmUgY29ycmVsYXRpb24gd2l0aCBtYXggdXBsb2FkaW5nIGNvbmN1cnJlbmN5LiBEZWZhdWx0IHZhbHVlIGlzIDVcbiAgICAgKiBAcGFyYW0gb3B0aW9ucyAtIE9wdGlvbnMgdG8gVXBsb2FkIFN0cmVhbSB0byBCbG9jayBCbG9iIG9wZXJhdGlvbi5cbiAgICAgKiBAcmV0dXJucyBSZXNwb25zZSBkYXRhIGZvciB0aGUgQmxvYiBVcGxvYWQgb3BlcmF0aW9uLlxuICAgICAqL1xuICAgIGFzeW5jIHVwbG9hZFN0cmVhbShzdHJlYW0sIGJ1ZmZlclNpemUgPSBERUZBVUxUX0JMT0NLX0JVRkZFUl9TSVpFX0JZVEVTLCBtYXhDb25jdXJyZW5jeSA9IDUsIG9wdGlvbnMgPSB7fSkge1xuICAgICAgICBpZiAoIW9wdGlvbnMuYmxvYkhUVFBIZWFkZXJzKSB7XG4gICAgICAgICAgICBvcHRpb25zLmJsb2JIVFRQSGVhZGVycyA9IHt9O1xuICAgICAgICB9XG4gICAgICAgIGlmICghb3B0aW9ucy5jb25kaXRpb25zKSB7XG4gICAgICAgICAgICBvcHRpb25zLmNvbmRpdGlvbnMgPSB7fTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gdHJhY2luZ0NsaWVudC53aXRoU3BhbihcIkJsb2NrQmxvYkNsaWVudC11cGxvYWRTdHJlYW1cIiwgb3B0aW9ucywgYXN5bmMgKHVwZGF0ZWRPcHRpb25zKSA9PiB7XG4gICAgICAgICAgICBsZXQgYmxvY2tOdW0gPSAwO1xuICAgICAgICAgICAgY29uc3QgYmxvY2tJRFByZWZpeCA9IGNvcmVVdGlsLnJhbmRvbVVVSUQoKTtcbiAgICAgICAgICAgIGxldCB0cmFuc2ZlclByb2dyZXNzID0gMDtcbiAgICAgICAgICAgIGNvbnN0IGJsb2NrTGlzdCA9IFtdO1xuICAgICAgICAgICAgY29uc3Qgc2NoZWR1bGVyID0gbmV3IEJ1ZmZlclNjaGVkdWxlcihzdHJlYW0sIGJ1ZmZlclNpemUsIG1heENvbmN1cnJlbmN5LCBhc3luYyAoYm9keSwgbGVuZ3RoKSA9PiB7XG4gICAgICAgICAgICAgICAgY29uc3QgYmxvY2tJRCA9IGdlbmVyYXRlQmxvY2tJRChibG9ja0lEUHJlZml4LCBibG9ja051bSk7XG4gICAgICAgICAgICAgICAgYmxvY2tMaXN0LnB1c2goYmxvY2tJRCk7XG4gICAgICAgICAgICAgICAgYmxvY2tOdW0rKztcbiAgICAgICAgICAgICAgICBhd2FpdCB0aGlzLnN0YWdlQmxvY2soYmxvY2tJRCwgYm9keSwgbGVuZ3RoLCB7XG4gICAgICAgICAgICAgICAgICAgIGN1c3RvbWVyUHJvdmlkZWRLZXk6IG9wdGlvbnMuY3VzdG9tZXJQcm92aWRlZEtleSxcbiAgICAgICAgICAgICAgICAgICAgY29uZGl0aW9uczogb3B0aW9ucy5jb25kaXRpb25zLFxuICAgICAgICAgICAgICAgICAgICBlbmNyeXB0aW9uU2NvcGU6IG9wdGlvbnMuZW5jcnlwdGlvblNjb3BlLFxuICAgICAgICAgICAgICAgICAgICB0cmFjaW5nT3B0aW9uczogdXBkYXRlZE9wdGlvbnMudHJhY2luZ09wdGlvbnMsXG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgLy8gVXBkYXRlIHByb2dyZXNzIGFmdGVyIGJsb2NrIGlzIHN1Y2Nlc3NmdWxseSB1cGxvYWRlZCB0byBzZXJ2ZXIsIGluIGNhc2Ugb2YgYmxvY2sgdHJ5aW5nXG4gICAgICAgICAgICAgICAgdHJhbnNmZXJQcm9ncmVzcyArPSBsZW5ndGg7XG4gICAgICAgICAgICAgICAgaWYgKG9wdGlvbnMub25Qcm9ncmVzcykge1xuICAgICAgICAgICAgICAgICAgICBvcHRpb25zLm9uUHJvZ3Jlc3MoeyBsb2FkZWRCeXRlczogdHJhbnNmZXJQcm9ncmVzcyB9KTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9LCBcbiAgICAgICAgICAgIC8vIGNvbmN1cnJlbmN5IHNob3VsZCBzZXQgYSBzbWFsbGVyIHZhbHVlIHRoYW4gbWF4Q29uY3VycmVuY3ksIHdoaWNoIGlzIGhlbHBmdWwgdG9cbiAgICAgICAgICAgIC8vIHJlZHVjZSB0aGUgcG9zc2liaWxpdHkgd2hlbiBhIG91dGdvaW5nIGhhbmRsZXIgd2FpdHMgZm9yIHN0cmVhbSBkYXRhLCBpblxuICAgICAgICAgICAgLy8gdGhpcyBzaXR1YXRpb24sIG91dGdvaW5nIGhhbmRsZXJzIGFyZSBibG9ja2VkLlxuICAgICAgICAgICAgLy8gT3V0Z29pbmcgcXVldWUgc2hvdWxkbid0IGJlIGVtcHR5LlxuICAgICAgICAgICAgTWF0aC5jZWlsKChtYXhDb25jdXJyZW5jeSAvIDQpICogMykpO1xuICAgICAgICAgICAgYXdhaXQgc2NoZWR1bGVyLmRvKCk7XG4gICAgICAgICAgICByZXR1cm4gYXNzZXJ0UmVzcG9uc2UoYXdhaXQgdGhpcy5jb21taXRCbG9ja0xpc3QoYmxvY2tMaXN0LCBPYmplY3QuYXNzaWduKE9iamVjdC5hc3NpZ24oe30sIG9wdGlvbnMpLCB7IHRyYWNpbmdPcHRpb25zOiB1cGRhdGVkT3B0aW9ucy50cmFjaW5nT3B0aW9ucyB9KSkpO1xuICAgICAgICB9KTtcbiAgICB9XG59XG4vKipcbiAqIFBhZ2VCbG9iQ2xpZW50IGRlZmluZXMgYSBzZXQgb2Ygb3BlcmF0aW9ucyBhcHBsaWNhYmxlIHRvIHBhZ2UgYmxvYnMuXG4gKi9cbmNsYXNzIFBhZ2VCbG9iQ2xpZW50IGV4dGVuZHMgQmxvYkNsaWVudCB7XG4gICAgY29uc3RydWN0b3IodXJsT3JDb25uZWN0aW9uU3RyaW5nLCBjcmVkZW50aWFsT3JQaXBlbGluZU9yQ29udGFpbmVyTmFtZSwgYmxvYk5hbWVPck9wdGlvbnMsIFxuICAgIC8vIExlZ2FjeSwgbm8gZml4IGZvciBlc2xpbnQgZXJyb3Igd2l0aG91dCBicmVha2luZy4gRGlzYWJsZSBpdCBmb3IgdGhpcyBpbnRlcmZhY2UuXG4gICAgLyogZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEBhenVyZS9henVyZS1zZGsvdHMtbmFtaW5nLW9wdGlvbnMqL1xuICAgIG9wdGlvbnMpIHtcbiAgICAgICAgLy8gSW4gVHlwZVNjcmlwdCB3ZSBjYW5ub3Qgc2ltcGx5IHBhc3MgYWxsIHBhcmFtZXRlcnMgdG8gc3VwZXIoKSBsaWtlIGJlbG93IHNvIGhhdmUgdG8gZHVwbGljYXRlIHRoZSBjb2RlIGluc3RlYWQuXG4gICAgICAgIC8vICAgc3VwZXIocywgY3JlZGVudGlhbE9yUGlwZWxpbmVPckNvbnRhaW5lck5hbWVPck9wdGlvbnMsIGJsb2JOYW1lT3JPcHRpb25zLCBvcHRpb25zKTtcbiAgICAgICAgbGV0IHBpcGVsaW5lO1xuICAgICAgICBsZXQgdXJsO1xuICAgICAgICBvcHRpb25zID0gb3B0aW9ucyB8fCB7fTtcbiAgICAgICAgaWYgKGlzUGlwZWxpbmVMaWtlKGNyZWRlbnRpYWxPclBpcGVsaW5lT3JDb250YWluZXJOYW1lKSkge1xuICAgICAgICAgICAgLy8gKHVybDogc3RyaW5nLCBwaXBlbGluZTogUGlwZWxpbmUpXG4gICAgICAgICAgICB1cmwgPSB1cmxPckNvbm5lY3Rpb25TdHJpbmc7XG4gICAgICAgICAgICBwaXBlbGluZSA9IGNyZWRlbnRpYWxPclBpcGVsaW5lT3JDb250YWluZXJOYW1lO1xuICAgICAgICB9XG4gICAgICAgIGVsc2UgaWYgKChjb3JlVXRpbC5pc05vZGUgJiYgY3JlZGVudGlhbE9yUGlwZWxpbmVPckNvbnRhaW5lck5hbWUgaW5zdGFuY2VvZiBTdG9yYWdlU2hhcmVkS2V5Q3JlZGVudGlhbCkgfHxcbiAgICAgICAgICAgIGNyZWRlbnRpYWxPclBpcGVsaW5lT3JDb250YWluZXJOYW1lIGluc3RhbmNlb2YgQW5vbnltb3VzQ3JlZGVudGlhbCB8fFxuICAgICAgICAgICAgY29yZUF1dGguaXNUb2tlbkNyZWRlbnRpYWwoY3JlZGVudGlhbE9yUGlwZWxpbmVPckNvbnRhaW5lck5hbWUpKSB7XG4gICAgICAgICAgICAvLyAodXJsOiBzdHJpbmcsIGNyZWRlbnRpYWw/OiBTdG9yYWdlU2hhcmVkS2V5Q3JlZGVudGlhbCB8IEFub255bW91c0NyZWRlbnRpYWwgfCBUb2tlbkNyZWRlbnRpYWwsIG9wdGlvbnM/OiBTdG9yYWdlUGlwZWxpbmVPcHRpb25zKVxuICAgICAgICAgICAgdXJsID0gdXJsT3JDb25uZWN0aW9uU3RyaW5nO1xuICAgICAgICAgICAgb3B0aW9ucyA9IGJsb2JOYW1lT3JPcHRpb25zO1xuICAgICAgICAgICAgcGlwZWxpbmUgPSBuZXdQaXBlbGluZShjcmVkZW50aWFsT3JQaXBlbGluZU9yQ29udGFpbmVyTmFtZSwgb3B0aW9ucyk7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSBpZiAoIWNyZWRlbnRpYWxPclBpcGVsaW5lT3JDb250YWluZXJOYW1lICYmXG4gICAgICAgICAgICB0eXBlb2YgY3JlZGVudGlhbE9yUGlwZWxpbmVPckNvbnRhaW5lck5hbWUgIT09IFwic3RyaW5nXCIpIHtcbiAgICAgICAgICAgIC8vICh1cmw6IHN0cmluZywgY3JlZGVudGlhbD86IFN0b3JhZ2VTaGFyZWRLZXlDcmVkZW50aWFsIHwgQW5vbnltb3VzQ3JlZGVudGlhbCB8IFRva2VuQ3JlZGVudGlhbCwgb3B0aW9ucz86IFN0b3JhZ2VQaXBlbGluZU9wdGlvbnMpXG4gICAgICAgICAgICAvLyBUaGUgc2Vjb25kIHBhcmFtZXRlciBpcyB1bmRlZmluZWQuIFVzZSBhbm9ueW1vdXMgY3JlZGVudGlhbC5cbiAgICAgICAgICAgIHVybCA9IHVybE9yQ29ubmVjdGlvblN0cmluZztcbiAgICAgICAgICAgIHBpcGVsaW5lID0gbmV3UGlwZWxpbmUobmV3IEFub255bW91c0NyZWRlbnRpYWwoKSwgb3B0aW9ucyk7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSBpZiAoY3JlZGVudGlhbE9yUGlwZWxpbmVPckNvbnRhaW5lck5hbWUgJiZcbiAgICAgICAgICAgIHR5cGVvZiBjcmVkZW50aWFsT3JQaXBlbGluZU9yQ29udGFpbmVyTmFtZSA9PT0gXCJzdHJpbmdcIiAmJlxuICAgICAgICAgICAgYmxvYk5hbWVPck9wdGlvbnMgJiZcbiAgICAgICAgICAgIHR5cGVvZiBibG9iTmFtZU9yT3B0aW9ucyA9PT0gXCJzdHJpbmdcIikge1xuICAgICAgICAgICAgLy8gKGNvbm5lY3Rpb25TdHJpbmc6IHN0cmluZywgY29udGFpbmVyTmFtZTogc3RyaW5nLCBibG9iTmFtZTogc3RyaW5nLCBvcHRpb25zPzogU3RvcmFnZVBpcGVsaW5lT3B0aW9ucylcbiAgICAgICAgICAgIGNvbnN0IGNvbnRhaW5lck5hbWUgPSBjcmVkZW50aWFsT3JQaXBlbGluZU9yQ29udGFpbmVyTmFtZTtcbiAgICAgICAgICAgIGNvbnN0IGJsb2JOYW1lID0gYmxvYk5hbWVPck9wdGlvbnM7XG4gICAgICAgICAgICBjb25zdCBleHRyYWN0ZWRDcmVkcyA9IGV4dHJhY3RDb25uZWN0aW9uU3RyaW5nUGFydHModXJsT3JDb25uZWN0aW9uU3RyaW5nKTtcbiAgICAgICAgICAgIGlmIChleHRyYWN0ZWRDcmVkcy5raW5kID09PSBcIkFjY291bnRDb25uU3RyaW5nXCIpIHtcbiAgICAgICAgICAgICAgICBpZiAoY29yZVV0aWwuaXNOb2RlKSB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IHNoYXJlZEtleUNyZWRlbnRpYWwgPSBuZXcgU3RvcmFnZVNoYXJlZEtleUNyZWRlbnRpYWwoZXh0cmFjdGVkQ3JlZHMuYWNjb3VudE5hbWUsIGV4dHJhY3RlZENyZWRzLmFjY291bnRLZXkpO1xuICAgICAgICAgICAgICAgICAgICB1cmwgPSBhcHBlbmRUb1VSTFBhdGgoYXBwZW5kVG9VUkxQYXRoKGV4dHJhY3RlZENyZWRzLnVybCwgZW5jb2RlVVJJQ29tcG9uZW50KGNvbnRhaW5lck5hbWUpKSwgZW5jb2RlVVJJQ29tcG9uZW50KGJsb2JOYW1lKSk7XG4gICAgICAgICAgICAgICAgICAgIGlmICghb3B0aW9ucy5wcm94eU9wdGlvbnMpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIG9wdGlvbnMucHJveHlPcHRpb25zID0gY29yZVJlc3RQaXBlbGluZS5nZXREZWZhdWx0UHJveHlTZXR0aW5ncyhleHRyYWN0ZWRDcmVkcy5wcm94eVVyaSk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgcGlwZWxpbmUgPSBuZXdQaXBlbGluZShzaGFyZWRLZXlDcmVkZW50aWFsLCBvcHRpb25zKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihcIkFjY291bnQgY29ubmVjdGlvbiBzdHJpbmcgaXMgb25seSBzdXBwb3J0ZWQgaW4gTm9kZS5qcyBlbnZpcm9ubWVudFwiKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIGlmIChleHRyYWN0ZWRDcmVkcy5raW5kID09PSBcIlNBU0Nvbm5TdHJpbmdcIikge1xuICAgICAgICAgICAgICAgIHVybCA9XG4gICAgICAgICAgICAgICAgICAgIGFwcGVuZFRvVVJMUGF0aChhcHBlbmRUb1VSTFBhdGgoZXh0cmFjdGVkQ3JlZHMudXJsLCBlbmNvZGVVUklDb21wb25lbnQoY29udGFpbmVyTmFtZSkpLCBlbmNvZGVVUklDb21wb25lbnQoYmxvYk5hbWUpKSArXG4gICAgICAgICAgICAgICAgICAgICAgICBcIj9cIiArXG4gICAgICAgICAgICAgICAgICAgICAgICBleHRyYWN0ZWRDcmVkcy5hY2NvdW50U2FzO1xuICAgICAgICAgICAgICAgIHBpcGVsaW5lID0gbmV3UGlwZWxpbmUobmV3IEFub255bW91c0NyZWRlbnRpYWwoKSwgb3B0aW9ucyk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJDb25uZWN0aW9uIHN0cmluZyBtdXN0IGJlIGVpdGhlciBhbiBBY2NvdW50IGNvbm5lY3Rpb24gc3RyaW5nIG9yIGEgU0FTIGNvbm5lY3Rpb24gc3RyaW5nXCIpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwiRXhwZWN0aW5nIG5vbi1lbXB0eSBzdHJpbmdzIGZvciBjb250YWluZXJOYW1lIGFuZCBibG9iTmFtZSBwYXJhbWV0ZXJzXCIpO1xuICAgICAgICB9XG4gICAgICAgIHN1cGVyKHVybCwgcGlwZWxpbmUpO1xuICAgICAgICB0aGlzLnBhZ2VCbG9iQ29udGV4dCA9IHRoaXMuc3RvcmFnZUNsaWVudENvbnRleHQucGFnZUJsb2I7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIENyZWF0ZXMgYSBuZXcgUGFnZUJsb2JDbGllbnQgb2JqZWN0IGlkZW50aWNhbCB0byB0aGUgc291cmNlIGJ1dCB3aXRoIHRoZVxuICAgICAqIHNwZWNpZmllZCBzbmFwc2hvdCB0aW1lc3RhbXAuXG4gICAgICogUHJvdmlkZSBcIlwiIHdpbGwgcmVtb3ZlIHRoZSBzbmFwc2hvdCBhbmQgcmV0dXJuIGEgQ2xpZW50IHRvIHRoZSBiYXNlIGJsb2IuXG4gICAgICpcbiAgICAgKiBAcGFyYW0gc25hcHNob3QgLSBUaGUgc25hcHNob3QgdGltZXN0YW1wLlxuICAgICAqIEByZXR1cm5zIEEgbmV3IFBhZ2VCbG9iQ2xpZW50IG9iamVjdCBpZGVudGljYWwgdG8gdGhlIHNvdXJjZSBidXQgd2l0aCB0aGUgc3BlY2lmaWVkIHNuYXBzaG90IHRpbWVzdGFtcC5cbiAgICAgKi9cbiAgICB3aXRoU25hcHNob3Qoc25hcHNob3QpIHtcbiAgICAgICAgcmV0dXJuIG5ldyBQYWdlQmxvYkNsaWVudChzZXRVUkxQYXJhbWV0ZXIodGhpcy51cmwsIFVSTENvbnN0YW50cy5QYXJhbWV0ZXJzLlNOQVBTSE9ULCBzbmFwc2hvdC5sZW5ndGggPT09IDAgPyB1bmRlZmluZWQgOiBzbmFwc2hvdCksIHRoaXMucGlwZWxpbmUpO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBDcmVhdGVzIGEgcGFnZSBibG9iIG9mIHRoZSBzcGVjaWZpZWQgbGVuZ3RoLiBDYWxsIHVwbG9hZFBhZ2VzIHRvIHVwbG9hZCBkYXRhXG4gICAgICogZGF0YSB0byBhIHBhZ2UgYmxvYi5cbiAgICAgKiBAc2VlIGh0dHBzOi8vZG9jcy5taWNyb3NvZnQuY29tL3Jlc3QvYXBpL3N0b3JhZ2VzZXJ2aWNlcy9wdXQtYmxvYlxuICAgICAqXG4gICAgICogQHBhcmFtIHNpemUgLSBzaXplIG9mIHRoZSBwYWdlIGJsb2IuXG4gICAgICogQHBhcmFtIG9wdGlvbnMgLSBPcHRpb25zIHRvIHRoZSBQYWdlIEJsb2IgQ3JlYXRlIG9wZXJhdGlvbi5cbiAgICAgKiBAcmV0dXJucyBSZXNwb25zZSBkYXRhIGZvciB0aGUgUGFnZSBCbG9iIENyZWF0ZSBvcGVyYXRpb24uXG4gICAgICovXG4gICAgYXN5bmMgY3JlYXRlKHNpemUsIG9wdGlvbnMgPSB7fSkge1xuICAgICAgICBvcHRpb25zLmNvbmRpdGlvbnMgPSBvcHRpb25zLmNvbmRpdGlvbnMgfHwge307XG4gICAgICAgIGVuc3VyZUNwa0lmU3BlY2lmaWVkKG9wdGlvbnMuY3VzdG9tZXJQcm92aWRlZEtleSwgdGhpcy5pc0h0dHBzKTtcbiAgICAgICAgcmV0dXJuIHRyYWNpbmdDbGllbnQud2l0aFNwYW4oXCJQYWdlQmxvYkNsaWVudC1jcmVhdGVcIiwgb3B0aW9ucywgYXN5bmMgKHVwZGF0ZWRPcHRpb25zKSA9PiB7XG4gICAgICAgICAgICB2YXIgX2EsIF9iLCBfYztcbiAgICAgICAgICAgIHJldHVybiBhc3NlcnRSZXNwb25zZShhd2FpdCB0aGlzLnBhZ2VCbG9iQ29udGV4dC5jcmVhdGUoMCwgc2l6ZSwge1xuICAgICAgICAgICAgICAgIGFib3J0U2lnbmFsOiBvcHRpb25zLmFib3J0U2lnbmFsLFxuICAgICAgICAgICAgICAgIGJsb2JIdHRwSGVhZGVyczogb3B0aW9ucy5ibG9iSFRUUEhlYWRlcnMsXG4gICAgICAgICAgICAgICAgYmxvYlNlcXVlbmNlTnVtYmVyOiBvcHRpb25zLmJsb2JTZXF1ZW5jZU51bWJlcixcbiAgICAgICAgICAgICAgICBsZWFzZUFjY2Vzc0NvbmRpdGlvbnM6IG9wdGlvbnMuY29uZGl0aW9ucyxcbiAgICAgICAgICAgICAgICBtZXRhZGF0YTogb3B0aW9ucy5tZXRhZGF0YSxcbiAgICAgICAgICAgICAgICBtb2RpZmllZEFjY2Vzc0NvbmRpdGlvbnM6IE9iamVjdC5hc3NpZ24oT2JqZWN0LmFzc2lnbih7fSwgb3B0aW9ucy5jb25kaXRpb25zKSwgeyBpZlRhZ3M6IChfYSA9IG9wdGlvbnMuY29uZGl0aW9ucykgPT09IG51bGwgfHwgX2EgPT09IHZvaWQgMCA/IHZvaWQgMCA6IF9hLnRhZ0NvbmRpdGlvbnMgfSksXG4gICAgICAgICAgICAgICAgY3BrSW5mbzogb3B0aW9ucy5jdXN0b21lclByb3ZpZGVkS2V5LFxuICAgICAgICAgICAgICAgIGVuY3J5cHRpb25TY29wZTogb3B0aW9ucy5lbmNyeXB0aW9uU2NvcGUsXG4gICAgICAgICAgICAgICAgaW1tdXRhYmlsaXR5UG9saWN5RXhwaXJ5OiAoX2IgPSBvcHRpb25zLmltbXV0YWJpbGl0eVBvbGljeSkgPT09IG51bGwgfHwgX2IgPT09IHZvaWQgMCA/IHZvaWQgMCA6IF9iLmV4cGlyaWVzT24sXG4gICAgICAgICAgICAgICAgaW1tdXRhYmlsaXR5UG9saWN5TW9kZTogKF9jID0gb3B0aW9ucy5pbW11dGFiaWxpdHlQb2xpY3kpID09PSBudWxsIHx8IF9jID09PSB2b2lkIDAgPyB2b2lkIDAgOiBfYy5wb2xpY3lNb2RlLFxuICAgICAgICAgICAgICAgIGxlZ2FsSG9sZDogb3B0aW9ucy5sZWdhbEhvbGQsXG4gICAgICAgICAgICAgICAgdGllcjogdG9BY2Nlc3NUaWVyKG9wdGlvbnMudGllciksXG4gICAgICAgICAgICAgICAgYmxvYlRhZ3NTdHJpbmc6IHRvQmxvYlRhZ3NTdHJpbmcob3B0aW9ucy50YWdzKSxcbiAgICAgICAgICAgICAgICB0cmFjaW5nT3B0aW9uczogdXBkYXRlZE9wdGlvbnMudHJhY2luZ09wdGlvbnMsXG4gICAgICAgICAgICB9KSk7XG4gICAgICAgIH0pO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBDcmVhdGVzIGEgcGFnZSBibG9iIG9mIHRoZSBzcGVjaWZpZWQgbGVuZ3RoLiBDYWxsIHVwbG9hZFBhZ2VzIHRvIHVwbG9hZCBkYXRhXG4gICAgICogZGF0YSB0byBhIHBhZ2UgYmxvYi4gSWYgdGhlIGJsb2Igd2l0aCB0aGUgc2FtZSBuYW1lIGFscmVhZHkgZXhpc3RzLCB0aGUgY29udGVudFxuICAgICAqIG9mIHRoZSBleGlzdGluZyBibG9iIHdpbGwgcmVtYWluIHVuY2hhbmdlZC5cbiAgICAgKiBAc2VlIGh0dHBzOi8vZG9jcy5taWNyb3NvZnQuY29tL3Jlc3QvYXBpL3N0b3JhZ2VzZXJ2aWNlcy9wdXQtYmxvYlxuICAgICAqXG4gICAgICogQHBhcmFtIHNpemUgLSBzaXplIG9mIHRoZSBwYWdlIGJsb2IuXG4gICAgICogQHBhcmFtIG9wdGlvbnMgLVxuICAgICAqL1xuICAgIGFzeW5jIGNyZWF0ZUlmTm90RXhpc3RzKHNpemUsIG9wdGlvbnMgPSB7fSkge1xuICAgICAgICByZXR1cm4gdHJhY2luZ0NsaWVudC53aXRoU3BhbihcIlBhZ2VCbG9iQ2xpZW50LWNyZWF0ZUlmTm90RXhpc3RzXCIsIG9wdGlvbnMsIGFzeW5jICh1cGRhdGVkT3B0aW9ucykgPT4ge1xuICAgICAgICAgICAgdmFyIF9hLCBfYjtcbiAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgY29uc3QgY29uZGl0aW9ucyA9IHsgaWZOb25lTWF0Y2g6IEVUYWdBbnkgfTtcbiAgICAgICAgICAgICAgICBjb25zdCByZXMgPSBhc3NlcnRSZXNwb25zZShhd2FpdCB0aGlzLmNyZWF0ZShzaXplLCBPYmplY3QuYXNzaWduKE9iamVjdC5hc3NpZ24oe30sIG9wdGlvbnMpLCB7IGNvbmRpdGlvbnMsIHRyYWNpbmdPcHRpb25zOiB1cGRhdGVkT3B0aW9ucy50cmFjaW5nT3B0aW9ucyB9KSkpO1xuICAgICAgICAgICAgICAgIHJldHVybiBPYmplY3QuYXNzaWduKE9iamVjdC5hc3NpZ24oeyBzdWNjZWVkZWQ6IHRydWUgfSwgcmVzKSwgeyBfcmVzcG9uc2U6IHJlcy5fcmVzcG9uc2UgfSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBjYXRjaCAoZSkge1xuICAgICAgICAgICAgICAgIGlmICgoKF9hID0gZS5kZXRhaWxzKSA9PT0gbnVsbCB8fCBfYSA9PT0gdm9pZCAwID8gdm9pZCAwIDogX2EuZXJyb3JDb2RlKSA9PT0gXCJCbG9iQWxyZWFkeUV4aXN0c1wiKSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBPYmplY3QuYXNzaWduKE9iamVjdC5hc3NpZ24oeyBzdWNjZWVkZWQ6IGZhbHNlIH0sIChfYiA9IGUucmVzcG9uc2UpID09PSBudWxsIHx8IF9iID09PSB2b2lkIDAgPyB2b2lkIDAgOiBfYi5wYXJzZWRIZWFkZXJzKSwgeyBfcmVzcG9uc2U6IGUucmVzcG9uc2UgfSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHRocm93IGU7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBXcml0ZXMgMSBvciBtb3JlIHBhZ2VzIHRvIHRoZSBwYWdlIGJsb2IuIFRoZSBzdGFydCBhbmQgZW5kIG9mZnNldHMgbXVzdCBiZSBhIG11bHRpcGxlIG9mIDUxMi5cbiAgICAgKiBAc2VlIGh0dHBzOi8vZG9jcy5taWNyb3NvZnQuY29tL3Jlc3QvYXBpL3N0b3JhZ2VzZXJ2aWNlcy9wdXQtcGFnZVxuICAgICAqXG4gICAgICogQHBhcmFtIGJvZHkgLSBEYXRhIHRvIHVwbG9hZFxuICAgICAqIEBwYXJhbSBvZmZzZXQgLSBPZmZzZXQgb2YgZGVzdGluYXRpb24gcGFnZSBibG9iXG4gICAgICogQHBhcmFtIGNvdW50IC0gQ29udGVudCBsZW5ndGggb2YgdGhlIGJvZHksIGFsc28gbnVtYmVyIG9mIGJ5dGVzIHRvIGJlIHVwbG9hZGVkXG4gICAgICogQHBhcmFtIG9wdGlvbnMgLSBPcHRpb25zIHRvIHRoZSBQYWdlIEJsb2IgVXBsb2FkIFBhZ2VzIG9wZXJhdGlvbi5cbiAgICAgKiBAcmV0dXJucyBSZXNwb25zZSBkYXRhIGZvciB0aGUgUGFnZSBCbG9iIFVwbG9hZCBQYWdlcyBvcGVyYXRpb24uXG4gICAgICovXG4gICAgYXN5bmMgdXBsb2FkUGFnZXMoYm9keSwgb2Zmc2V0LCBjb3VudCwgb3B0aW9ucyA9IHt9KSB7XG4gICAgICAgIG9wdGlvbnMuY29uZGl0aW9ucyA9IG9wdGlvbnMuY29uZGl0aW9ucyB8fCB7fTtcbiAgICAgICAgZW5zdXJlQ3BrSWZTcGVjaWZpZWQob3B0aW9ucy5jdXN0b21lclByb3ZpZGVkS2V5LCB0aGlzLmlzSHR0cHMpO1xuICAgICAgICByZXR1cm4gdHJhY2luZ0NsaWVudC53aXRoU3BhbihcIlBhZ2VCbG9iQ2xpZW50LXVwbG9hZFBhZ2VzXCIsIG9wdGlvbnMsIGFzeW5jICh1cGRhdGVkT3B0aW9ucykgPT4ge1xuICAgICAgICAgICAgdmFyIF9hO1xuICAgICAgICAgICAgcmV0dXJuIGFzc2VydFJlc3BvbnNlKGF3YWl0IHRoaXMucGFnZUJsb2JDb250ZXh0LnVwbG9hZFBhZ2VzKGNvdW50LCBib2R5LCB7XG4gICAgICAgICAgICAgICAgYWJvcnRTaWduYWw6IG9wdGlvbnMuYWJvcnRTaWduYWwsXG4gICAgICAgICAgICAgICAgbGVhc2VBY2Nlc3NDb25kaXRpb25zOiBvcHRpb25zLmNvbmRpdGlvbnMsXG4gICAgICAgICAgICAgICAgbW9kaWZpZWRBY2Nlc3NDb25kaXRpb25zOiBPYmplY3QuYXNzaWduKE9iamVjdC5hc3NpZ24oe30sIG9wdGlvbnMuY29uZGl0aW9ucyksIHsgaWZUYWdzOiAoX2EgPSBvcHRpb25zLmNvbmRpdGlvbnMpID09PSBudWxsIHx8IF9hID09PSB2b2lkIDAgPyB2b2lkIDAgOiBfYS50YWdDb25kaXRpb25zIH0pLFxuICAgICAgICAgICAgICAgIHJlcXVlc3RPcHRpb25zOiB7XG4gICAgICAgICAgICAgICAgICAgIG9uVXBsb2FkUHJvZ3Jlc3M6IG9wdGlvbnMub25Qcm9ncmVzcyxcbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgIHJhbmdlOiByYW5nZVRvU3RyaW5nKHsgb2Zmc2V0LCBjb3VudCB9KSxcbiAgICAgICAgICAgICAgICBzZXF1ZW5jZU51bWJlckFjY2Vzc0NvbmRpdGlvbnM6IG9wdGlvbnMuY29uZGl0aW9ucyxcbiAgICAgICAgICAgICAgICB0cmFuc2FjdGlvbmFsQ29udGVudE1ENTogb3B0aW9ucy50cmFuc2FjdGlvbmFsQ29udGVudE1ENSxcbiAgICAgICAgICAgICAgICB0cmFuc2FjdGlvbmFsQ29udGVudENyYzY0OiBvcHRpb25zLnRyYW5zYWN0aW9uYWxDb250ZW50Q3JjNjQsXG4gICAgICAgICAgICAgICAgY3BrSW5mbzogb3B0aW9ucy5jdXN0b21lclByb3ZpZGVkS2V5LFxuICAgICAgICAgICAgICAgIGVuY3J5cHRpb25TY29wZTogb3B0aW9ucy5lbmNyeXB0aW9uU2NvcGUsXG4gICAgICAgICAgICAgICAgdHJhY2luZ09wdGlvbnM6IHVwZGF0ZWRPcHRpb25zLnRyYWNpbmdPcHRpb25zLFxuICAgICAgICAgICAgfSkpO1xuICAgICAgICB9KTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogVGhlIFVwbG9hZCBQYWdlcyBvcGVyYXRpb24gd3JpdGVzIGEgcmFuZ2Ugb2YgcGFnZXMgdG8gYSBwYWdlIGJsb2Igd2hlcmUgdGhlXG4gICAgICogY29udGVudHMgYXJlIHJlYWQgZnJvbSBhIFVSTC5cbiAgICAgKiBAc2VlIGh0dHBzOi8vZG9jcy5taWNyb3NvZnQuY29tL2VuLXVzL3Jlc3QvYXBpL3N0b3JhZ2VzZXJ2aWNlcy9wdXQtcGFnZS1mcm9tLXVybFxuICAgICAqXG4gICAgICogQHBhcmFtIHNvdXJjZVVSTCAtIFNwZWNpZnkgYSBVUkwgdG8gdGhlIGNvcHkgc291cmNlLCBTaGFyZWQgQWNjZXNzIFNpZ25hdHVyZShTQVMpIG1heWJlIG5lZWRlZCBmb3IgYXV0aGVudGljYXRpb25cbiAgICAgKiBAcGFyYW0gc291cmNlT2Zmc2V0IC0gVGhlIHNvdXJjZSBvZmZzZXQgdG8gY29weSBmcm9tLiBQYXNzIDAgdG8gY29weSBmcm9tIHRoZSBiZWdpbm5pbmcgb2Ygc291cmNlIHBhZ2UgYmxvYlxuICAgICAqIEBwYXJhbSBkZXN0T2Zmc2V0IC0gT2Zmc2V0IG9mIGRlc3RpbmF0aW9uIHBhZ2UgYmxvYlxuICAgICAqIEBwYXJhbSBjb3VudCAtIE51bWJlciBvZiBieXRlcyB0byBiZSB1cGxvYWRlZCBmcm9tIHNvdXJjZSBwYWdlIGJsb2JcbiAgICAgKiBAcGFyYW0gb3B0aW9ucyAtXG4gICAgICovXG4gICAgYXN5bmMgdXBsb2FkUGFnZXNGcm9tVVJMKHNvdXJjZVVSTCwgc291cmNlT2Zmc2V0LCBkZXN0T2Zmc2V0LCBjb3VudCwgb3B0aW9ucyA9IHt9KSB7XG4gICAgICAgIG9wdGlvbnMuY29uZGl0aW9ucyA9IG9wdGlvbnMuY29uZGl0aW9ucyB8fCB7fTtcbiAgICAgICAgb3B0aW9ucy5zb3VyY2VDb25kaXRpb25zID0gb3B0aW9ucy5zb3VyY2VDb25kaXRpb25zIHx8IHt9O1xuICAgICAgICBlbnN1cmVDcGtJZlNwZWNpZmllZChvcHRpb25zLmN1c3RvbWVyUHJvdmlkZWRLZXksIHRoaXMuaXNIdHRwcyk7XG4gICAgICAgIHJldHVybiB0cmFjaW5nQ2xpZW50LndpdGhTcGFuKFwiUGFnZUJsb2JDbGllbnQtdXBsb2FkUGFnZXNGcm9tVVJMXCIsIG9wdGlvbnMsIGFzeW5jICh1cGRhdGVkT3B0aW9ucykgPT4ge1xuICAgICAgICAgICAgdmFyIF9hLCBfYiwgX2MsIF9kLCBfZTtcbiAgICAgICAgICAgIHJldHVybiBhc3NlcnRSZXNwb25zZShhd2FpdCB0aGlzLnBhZ2VCbG9iQ29udGV4dC51cGxvYWRQYWdlc0Zyb21VUkwoc291cmNlVVJMLCByYW5nZVRvU3RyaW5nKHsgb2Zmc2V0OiBzb3VyY2VPZmZzZXQsIGNvdW50IH0pLCAwLCByYW5nZVRvU3RyaW5nKHsgb2Zmc2V0OiBkZXN0T2Zmc2V0LCBjb3VudCB9KSwge1xuICAgICAgICAgICAgICAgIGFib3J0U2lnbmFsOiBvcHRpb25zLmFib3J0U2lnbmFsLFxuICAgICAgICAgICAgICAgIHNvdXJjZUNvbnRlbnRNRDU6IG9wdGlvbnMuc291cmNlQ29udGVudE1ENSxcbiAgICAgICAgICAgICAgICBzb3VyY2VDb250ZW50Q3JjNjQ6IG9wdGlvbnMuc291cmNlQ29udGVudENyYzY0LFxuICAgICAgICAgICAgICAgIGxlYXNlQWNjZXNzQ29uZGl0aW9uczogb3B0aW9ucy5jb25kaXRpb25zLFxuICAgICAgICAgICAgICAgIHNlcXVlbmNlTnVtYmVyQWNjZXNzQ29uZGl0aW9uczogb3B0aW9ucy5jb25kaXRpb25zLFxuICAgICAgICAgICAgICAgIG1vZGlmaWVkQWNjZXNzQ29uZGl0aW9uczogT2JqZWN0LmFzc2lnbihPYmplY3QuYXNzaWduKHt9LCBvcHRpb25zLmNvbmRpdGlvbnMpLCB7IGlmVGFnczogKF9hID0gb3B0aW9ucy5jb25kaXRpb25zKSA9PT0gbnVsbCB8fCBfYSA9PT0gdm9pZCAwID8gdm9pZCAwIDogX2EudGFnQ29uZGl0aW9ucyB9KSxcbiAgICAgICAgICAgICAgICBzb3VyY2VNb2RpZmllZEFjY2Vzc0NvbmRpdGlvbnM6IHtcbiAgICAgICAgICAgICAgICAgICAgc291cmNlSWZNYXRjaDogKF9iID0gb3B0aW9ucy5zb3VyY2VDb25kaXRpb25zKSA9PT0gbnVsbCB8fCBfYiA9PT0gdm9pZCAwID8gdm9pZCAwIDogX2IuaWZNYXRjaCxcbiAgICAgICAgICAgICAgICAgICAgc291cmNlSWZNb2RpZmllZFNpbmNlOiAoX2MgPSBvcHRpb25zLnNvdXJjZUNvbmRpdGlvbnMpID09PSBudWxsIHx8IF9jID09PSB2b2lkIDAgPyB2b2lkIDAgOiBfYy5pZk1vZGlmaWVkU2luY2UsXG4gICAgICAgICAgICAgICAgICAgIHNvdXJjZUlmTm9uZU1hdGNoOiAoX2QgPSBvcHRpb25zLnNvdXJjZUNvbmRpdGlvbnMpID09PSBudWxsIHx8IF9kID09PSB2b2lkIDAgPyB2b2lkIDAgOiBfZC5pZk5vbmVNYXRjaCxcbiAgICAgICAgICAgICAgICAgICAgc291cmNlSWZVbm1vZGlmaWVkU2luY2U6IChfZSA9IG9wdGlvbnMuc291cmNlQ29uZGl0aW9ucykgPT09IG51bGwgfHwgX2UgPT09IHZvaWQgMCA/IHZvaWQgMCA6IF9lLmlmVW5tb2RpZmllZFNpbmNlLFxuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgY3BrSW5mbzogb3B0aW9ucy5jdXN0b21lclByb3ZpZGVkS2V5LFxuICAgICAgICAgICAgICAgIGVuY3J5cHRpb25TY29wZTogb3B0aW9ucy5lbmNyeXB0aW9uU2NvcGUsXG4gICAgICAgICAgICAgICAgY29weVNvdXJjZUF1dGhvcml6YXRpb246IGh0dHBBdXRob3JpemF0aW9uVG9TdHJpbmcob3B0aW9ucy5zb3VyY2VBdXRob3JpemF0aW9uKSxcbiAgICAgICAgICAgICAgICB0cmFjaW5nT3B0aW9uczogdXBkYXRlZE9wdGlvbnMudHJhY2luZ09wdGlvbnMsXG4gICAgICAgICAgICB9KSk7XG4gICAgICAgIH0pO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBGcmVlcyB0aGUgc3BlY2lmaWVkIHBhZ2VzIGZyb20gdGhlIHBhZ2UgYmxvYi5cbiAgICAgKiBAc2VlIGh0dHBzOi8vZG9jcy5taWNyb3NvZnQuY29tL3Jlc3QvYXBpL3N0b3JhZ2VzZXJ2aWNlcy9wdXQtcGFnZVxuICAgICAqXG4gICAgICogQHBhcmFtIG9mZnNldCAtIFN0YXJ0aW5nIGJ5dGUgcG9zaXRpb24gb2YgdGhlIHBhZ2VzIHRvIGNsZWFyLlxuICAgICAqIEBwYXJhbSBjb3VudCAtIE51bWJlciBvZiBieXRlcyB0byBjbGVhci5cbiAgICAgKiBAcGFyYW0gb3B0aW9ucyAtIE9wdGlvbnMgdG8gdGhlIFBhZ2UgQmxvYiBDbGVhciBQYWdlcyBvcGVyYXRpb24uXG4gICAgICogQHJldHVybnMgUmVzcG9uc2UgZGF0YSBmb3IgdGhlIFBhZ2UgQmxvYiBDbGVhciBQYWdlcyBvcGVyYXRpb24uXG4gICAgICovXG4gICAgYXN5bmMgY2xlYXJQYWdlcyhvZmZzZXQgPSAwLCBjb3VudCwgb3B0aW9ucyA9IHt9KSB7XG4gICAgICAgIG9wdGlvbnMuY29uZGl0aW9ucyA9IG9wdGlvbnMuY29uZGl0aW9ucyB8fCB7fTtcbiAgICAgICAgcmV0dXJuIHRyYWNpbmdDbGllbnQud2l0aFNwYW4oXCJQYWdlQmxvYkNsaWVudC1jbGVhclBhZ2VzXCIsIG9wdGlvbnMsIGFzeW5jICh1cGRhdGVkT3B0aW9ucykgPT4ge1xuICAgICAgICAgICAgdmFyIF9hO1xuICAgICAgICAgICAgcmV0dXJuIGFzc2VydFJlc3BvbnNlKGF3YWl0IHRoaXMucGFnZUJsb2JDb250ZXh0LmNsZWFyUGFnZXMoMCwge1xuICAgICAgICAgICAgICAgIGFib3J0U2lnbmFsOiBvcHRpb25zLmFib3J0U2lnbmFsLFxuICAgICAgICAgICAgICAgIGxlYXNlQWNjZXNzQ29uZGl0aW9uczogb3B0aW9ucy5jb25kaXRpb25zLFxuICAgICAgICAgICAgICAgIG1vZGlmaWVkQWNjZXNzQ29uZGl0aW9uczogT2JqZWN0LmFzc2lnbihPYmplY3QuYXNzaWduKHt9LCBvcHRpb25zLmNvbmRpdGlvbnMpLCB7IGlmVGFnczogKF9hID0gb3B0aW9ucy5jb25kaXRpb25zKSA9PT0gbnVsbCB8fCBfYSA9PT0gdm9pZCAwID8gdm9pZCAwIDogX2EudGFnQ29uZGl0aW9ucyB9KSxcbiAgICAgICAgICAgICAgICByYW5nZTogcmFuZ2VUb1N0cmluZyh7IG9mZnNldCwgY291bnQgfSksXG4gICAgICAgICAgICAgICAgc2VxdWVuY2VOdW1iZXJBY2Nlc3NDb25kaXRpb25zOiBvcHRpb25zLmNvbmRpdGlvbnMsXG4gICAgICAgICAgICAgICAgY3BrSW5mbzogb3B0aW9ucy5jdXN0b21lclByb3ZpZGVkS2V5LFxuICAgICAgICAgICAgICAgIGVuY3J5cHRpb25TY29wZTogb3B0aW9ucy5lbmNyeXB0aW9uU2NvcGUsXG4gICAgICAgICAgICAgICAgdHJhY2luZ09wdGlvbnM6IHVwZGF0ZWRPcHRpb25zLnRyYWNpbmdPcHRpb25zLFxuICAgICAgICAgICAgfSkpO1xuICAgICAgICB9KTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogUmV0dXJucyB0aGUgbGlzdCBvZiB2YWxpZCBwYWdlIHJhbmdlcyBmb3IgYSBwYWdlIGJsb2Igb3Igc25hcHNob3Qgb2YgYSBwYWdlIGJsb2IuXG4gICAgICogQHNlZSBodHRwczovL2RvY3MubWljcm9zb2Z0LmNvbS9yZXN0L2FwaS9zdG9yYWdlc2VydmljZXMvZ2V0LXBhZ2UtcmFuZ2VzXG4gICAgICpcbiAgICAgKiBAcGFyYW0gb2Zmc2V0IC0gU3RhcnRpbmcgYnl0ZSBwb3NpdGlvbiBvZiB0aGUgcGFnZSByYW5nZXMuXG4gICAgICogQHBhcmFtIGNvdW50IC0gTnVtYmVyIG9mIGJ5dGVzIHRvIGdldC5cbiAgICAgKiBAcGFyYW0gb3B0aW9ucyAtIE9wdGlvbnMgdG8gdGhlIFBhZ2UgQmxvYiBHZXQgUmFuZ2VzIG9wZXJhdGlvbi5cbiAgICAgKiBAcmV0dXJucyBSZXNwb25zZSBkYXRhIGZvciB0aGUgUGFnZSBCbG9iIEdldCBSYW5nZXMgb3BlcmF0aW9uLlxuICAgICAqL1xuICAgIGFzeW5jIGdldFBhZ2VSYW5nZXMob2Zmc2V0ID0gMCwgY291bnQsIG9wdGlvbnMgPSB7fSkge1xuICAgICAgICBvcHRpb25zLmNvbmRpdGlvbnMgPSBvcHRpb25zLmNvbmRpdGlvbnMgfHwge307XG4gICAgICAgIHJldHVybiB0cmFjaW5nQ2xpZW50LndpdGhTcGFuKFwiUGFnZUJsb2JDbGllbnQtZ2V0UGFnZVJhbmdlc1wiLCBvcHRpb25zLCBhc3luYyAodXBkYXRlZE9wdGlvbnMpID0+IHtcbiAgICAgICAgICAgIHZhciBfYTtcbiAgICAgICAgICAgIGNvbnN0IHJlc3BvbnNlID0gYXNzZXJ0UmVzcG9uc2UoYXdhaXQgdGhpcy5wYWdlQmxvYkNvbnRleHQuZ2V0UGFnZVJhbmdlcyh7XG4gICAgICAgICAgICAgICAgYWJvcnRTaWduYWw6IG9wdGlvbnMuYWJvcnRTaWduYWwsXG4gICAgICAgICAgICAgICAgbGVhc2VBY2Nlc3NDb25kaXRpb25zOiBvcHRpb25zLmNvbmRpdGlvbnMsXG4gICAgICAgICAgICAgICAgbW9kaWZpZWRBY2Nlc3NDb25kaXRpb25zOiBPYmplY3QuYXNzaWduKE9iamVjdC5hc3NpZ24oe30sIG9wdGlvbnMuY29uZGl0aW9ucyksIHsgaWZUYWdzOiAoX2EgPSBvcHRpb25zLmNvbmRpdGlvbnMpID09PSBudWxsIHx8IF9hID09PSB2b2lkIDAgPyB2b2lkIDAgOiBfYS50YWdDb25kaXRpb25zIH0pLFxuICAgICAgICAgICAgICAgIHJhbmdlOiByYW5nZVRvU3RyaW5nKHsgb2Zmc2V0LCBjb3VudCB9KSxcbiAgICAgICAgICAgICAgICB0cmFjaW5nT3B0aW9uczogdXBkYXRlZE9wdGlvbnMudHJhY2luZ09wdGlvbnMsXG4gICAgICAgICAgICB9KSk7XG4gICAgICAgICAgICByZXR1cm4gcmFuZ2VSZXNwb25zZUZyb21Nb2RlbChyZXNwb25zZSk7XG4gICAgICAgIH0pO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBnZXRQYWdlUmFuZ2VzU2VnbWVudCByZXR1cm5zIGEgc2luZ2xlIHNlZ21lbnQgb2YgcGFnZSByYW5nZXMgc3RhcnRpbmcgZnJvbSB0aGVcbiAgICAgKiBzcGVjaWZpZWQgTWFya2VyLiBVc2UgYW4gZW1wdHkgTWFya2VyIHRvIHN0YXJ0IGVudW1lcmF0aW9uIGZyb20gdGhlIGJlZ2lubmluZy5cbiAgICAgKiBBZnRlciBnZXR0aW5nIGEgc2VnbWVudCwgcHJvY2VzcyBpdCwgYW5kIHRoZW4gY2FsbCBnZXRQYWdlUmFuZ2VzU2VnbWVudCBhZ2FpblxuICAgICAqIChwYXNzaW5nIHRoZSB0aGUgcHJldmlvdXNseS1yZXR1cm5lZCBNYXJrZXIpIHRvIGdldCB0aGUgbmV4dCBzZWdtZW50LlxuICAgICAqIEBzZWUgaHR0cHM6Ly9kb2NzLm1pY3Jvc29mdC5jb20vcmVzdC9hcGkvc3RvcmFnZXNlcnZpY2VzL2dldC1wYWdlLXJhbmdlc1xuICAgICAqXG4gICAgICogQHBhcmFtIG9mZnNldCAtIFN0YXJ0aW5nIGJ5dGUgcG9zaXRpb24gb2YgdGhlIHBhZ2UgcmFuZ2VzLlxuICAgICAqIEBwYXJhbSBjb3VudCAtIE51bWJlciBvZiBieXRlcyB0byBnZXQuXG4gICAgICogQHBhcmFtIG1hcmtlciAtIEEgc3RyaW5nIHZhbHVlIHRoYXQgaWRlbnRpZmllcyB0aGUgcG9ydGlvbiBvZiB0aGUgbGlzdCB0byBiZSByZXR1cm5lZCB3aXRoIHRoZSBuZXh0IGxpc3Qgb3BlcmF0aW9uLlxuICAgICAqIEBwYXJhbSBvcHRpb25zIC0gT3B0aW9ucyB0byBQYWdlQmxvYiBHZXQgUGFnZSBSYW5nZXMgU2VnbWVudCBvcGVyYXRpb24uXG4gICAgICovXG4gICAgYXN5bmMgbGlzdFBhZ2VSYW5nZXNTZWdtZW50KG9mZnNldCA9IDAsIGNvdW50LCBtYXJrZXIsIG9wdGlvbnMgPSB7fSkge1xuICAgICAgICByZXR1cm4gdHJhY2luZ0NsaWVudC53aXRoU3BhbihcIlBhZ2VCbG9iQ2xpZW50LWdldFBhZ2VSYW5nZXNTZWdtZW50XCIsIG9wdGlvbnMsIGFzeW5jICh1cGRhdGVkT3B0aW9ucykgPT4ge1xuICAgICAgICAgICAgdmFyIF9hO1xuICAgICAgICAgICAgcmV0dXJuIGFzc2VydFJlc3BvbnNlKGF3YWl0IHRoaXMucGFnZUJsb2JDb250ZXh0LmdldFBhZ2VSYW5nZXMoe1xuICAgICAgICAgICAgICAgIGFib3J0U2lnbmFsOiBvcHRpb25zLmFib3J0U2lnbmFsLFxuICAgICAgICAgICAgICAgIGxlYXNlQWNjZXNzQ29uZGl0aW9uczogb3B0aW9ucy5jb25kaXRpb25zLFxuICAgICAgICAgICAgICAgIG1vZGlmaWVkQWNjZXNzQ29uZGl0aW9uczogT2JqZWN0LmFzc2lnbihPYmplY3QuYXNzaWduKHt9LCBvcHRpb25zLmNvbmRpdGlvbnMpLCB7IGlmVGFnczogKF9hID0gb3B0aW9ucy5jb25kaXRpb25zKSA9PT0gbnVsbCB8fCBfYSA9PT0gdm9pZCAwID8gdm9pZCAwIDogX2EudGFnQ29uZGl0aW9ucyB9KSxcbiAgICAgICAgICAgICAgICByYW5nZTogcmFuZ2VUb1N0cmluZyh7IG9mZnNldCwgY291bnQgfSksXG4gICAgICAgICAgICAgICAgbWFya2VyOiBtYXJrZXIsXG4gICAgICAgICAgICAgICAgbWF4UGFnZVNpemU6IG9wdGlvbnMubWF4UGFnZVNpemUsXG4gICAgICAgICAgICAgICAgdHJhY2luZ09wdGlvbnM6IHVwZGF0ZWRPcHRpb25zLnRyYWNpbmdPcHRpb25zLFxuICAgICAgICAgICAgfSkpO1xuICAgICAgICB9KTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogUmV0dXJucyBhbiBBc3luY0l0ZXJhYmxlSXRlcmF0b3IgZm9yIHtAbGluayBQYWdlQmxvYkdldFBhZ2VSYW5nZXNSZXNwb25zZU1vZGVsfVxuICAgICAqXG4gICAgICogQHBhcmFtIG9mZnNldCAtIFN0YXJ0aW5nIGJ5dGUgcG9zaXRpb24gb2YgdGhlIHBhZ2UgcmFuZ2VzLlxuICAgICAqIEBwYXJhbSBjb3VudCAtIE51bWJlciBvZiBieXRlcyB0byBnZXQuXG4gICAgICogQHBhcmFtIG1hcmtlciAtIEEgc3RyaW5nIHZhbHVlIHRoYXQgaWRlbnRpZmllcyB0aGUgcG9ydGlvbiBvZlxuICAgICAqICAgICAgICAgICAgICAgICAgICAgICAgICB0aGUgZ2V0IG9mIHBhZ2UgcmFuZ2VzIHRvIGJlIHJldHVybmVkIHdpdGggdGhlIG5leHQgZ2V0dGluZyBvcGVyYXRpb24uIFRoZVxuICAgICAqICAgICAgICAgICAgICAgICAgICAgICAgICBvcGVyYXRpb24gcmV0dXJucyB0aGUgQ29udGludWF0aW9uVG9rZW4gdmFsdWUgd2l0aGluIHRoZSByZXNwb25zZSBib2R5IGlmIHRoZVxuICAgICAqICAgICAgICAgICAgICAgICAgICAgICAgICBnZXR0aW5nIG9wZXJhdGlvbiBkaWQgbm90IHJldHVybiBhbGwgcGFnZSByYW5nZXMgcmVtYWluaW5nIHdpdGhpbiB0aGUgY3VycmVudCBwYWdlLlxuICAgICAqICAgICAgICAgICAgICAgICAgICAgICAgICBUaGUgQ29udGludWF0aW9uVG9rZW4gdmFsdWUgY2FuIGJlIHVzZWQgYXMgdGhlIHZhbHVlIGZvclxuICAgICAqICAgICAgICAgICAgICAgICAgICAgICAgICB0aGUgbWFya2VyIHBhcmFtZXRlciBpbiBhIHN1YnNlcXVlbnQgY2FsbCB0byByZXF1ZXN0IHRoZSBuZXh0IHBhZ2Ugb2YgZ2V0XG4gICAgICogICAgICAgICAgICAgICAgICAgICAgICAgIGl0ZW1zLiBUaGUgbWFya2VyIHZhbHVlIGlzIG9wYXF1ZSB0byB0aGUgY2xpZW50LlxuICAgICAqIEBwYXJhbSBvcHRpb25zIC0gT3B0aW9ucyB0byBMaXN0IFBhZ2UgUmFuZ2VzIG9wZXJhdGlvbi5cbiAgICAgKi9cbiAgICBsaXN0UGFnZVJhbmdlSXRlbVNlZ21lbnRzKCkge1xuICAgICAgICByZXR1cm4gdHNsaWIuX19hc3luY0dlbmVyYXRvcih0aGlzLCBhcmd1bWVudHMsIGZ1bmN0aW9uKiBsaXN0UGFnZVJhbmdlSXRlbVNlZ21lbnRzXzEob2Zmc2V0ID0gMCwgY291bnQsIG1hcmtlciwgb3B0aW9ucyA9IHt9KSB7XG4gICAgICAgICAgICBsZXQgZ2V0UGFnZVJhbmdlSXRlbVNlZ21lbnRzUmVzcG9uc2U7XG4gICAgICAgICAgICBpZiAoISFtYXJrZXIgfHwgbWFya2VyID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgICAgICBkbyB7XG4gICAgICAgICAgICAgICAgICAgIGdldFBhZ2VSYW5nZUl0ZW1TZWdtZW50c1Jlc3BvbnNlID0geWllbGQgdHNsaWIuX19hd2FpdCh0aGlzLmxpc3RQYWdlUmFuZ2VzU2VnbWVudChvZmZzZXQsIGNvdW50LCBtYXJrZXIsIG9wdGlvbnMpKTtcbiAgICAgICAgICAgICAgICAgICAgbWFya2VyID0gZ2V0UGFnZVJhbmdlSXRlbVNlZ21lbnRzUmVzcG9uc2UuY29udGludWF0aW9uVG9rZW47XG4gICAgICAgICAgICAgICAgICAgIHlpZWxkIHlpZWxkIHRzbGliLl9fYXdhaXQoeWllbGQgdHNsaWIuX19hd2FpdChnZXRQYWdlUmFuZ2VJdGVtU2VnbWVudHNSZXNwb25zZSkpO1xuICAgICAgICAgICAgICAgIH0gd2hpbGUgKG1hcmtlcik7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBSZXR1cm5zIGFuIEFzeW5jSXRlcmFibGVJdGVyYXRvciBvZiB7QGxpbmsgUGFnZVJhbmdlSW5mb30gb2JqZWN0c1xuICAgICAqXG4gICAgICogQHBhcmFtIG9mZnNldCAtIFN0YXJ0aW5nIGJ5dGUgcG9zaXRpb24gb2YgdGhlIHBhZ2UgcmFuZ2VzLlxuICAgICAqIEBwYXJhbSBjb3VudCAtIE51bWJlciBvZiBieXRlcyB0byBnZXQuXG4gICAgICogQHBhcmFtIG9wdGlvbnMgLSBPcHRpb25zIHRvIExpc3QgUGFnZSBSYW5nZXMgb3BlcmF0aW9uLlxuICAgICAqL1xuICAgIGxpc3RQYWdlUmFuZ2VJdGVtcygpIHtcbiAgICAgICAgcmV0dXJuIHRzbGliLl9fYXN5bmNHZW5lcmF0b3IodGhpcywgYXJndW1lbnRzLCBmdW5jdGlvbiogbGlzdFBhZ2VSYW5nZUl0ZW1zXzEob2Zmc2V0ID0gMCwgY291bnQsIG9wdGlvbnMgPSB7fSkge1xuICAgICAgICAgICAgdmFyIF9hLCBlXzEsIF9iLCBfYztcbiAgICAgICAgICAgIGxldCBtYXJrZXI7XG4gICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgIGZvciAodmFyIF9kID0gdHJ1ZSwgX2UgPSB0c2xpYi5fX2FzeW5jVmFsdWVzKHRoaXMubGlzdFBhZ2VSYW5nZUl0ZW1TZWdtZW50cyhvZmZzZXQsIGNvdW50LCBtYXJrZXIsIG9wdGlvbnMpKSwgX2Y7IF9mID0geWllbGQgdHNsaWIuX19hd2FpdChfZS5uZXh0KCkpLCBfYSA9IF9mLmRvbmUsICFfYTsgX2QgPSB0cnVlKSB7XG4gICAgICAgICAgICAgICAgICAgIF9jID0gX2YudmFsdWU7XG4gICAgICAgICAgICAgICAgICAgIF9kID0gZmFsc2U7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IGdldFBhZ2VSYW5nZXNTZWdtZW50ID0gX2M7XG4gICAgICAgICAgICAgICAgICAgIHlpZWxkIHRzbGliLl9fYXdhaXQoeWllbGQqIHRzbGliLl9fYXN5bmNEZWxlZ2F0b3IodHNsaWIuX19hc3luY1ZhbHVlcyhFeHRyYWN0UGFnZVJhbmdlSW5mb0l0ZW1zKGdldFBhZ2VSYW5nZXNTZWdtZW50KSkpKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBjYXRjaCAoZV8xXzEpIHsgZV8xID0geyBlcnJvcjogZV8xXzEgfTsgfVxuICAgICAgICAgICAgZmluYWxseSB7XG4gICAgICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKCFfZCAmJiAhX2EgJiYgKF9iID0gX2UucmV0dXJuKSkgeWllbGQgdHNsaWIuX19hd2FpdChfYi5jYWxsKF9lKSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGZpbmFsbHkgeyBpZiAoZV8xKSB0aHJvdyBlXzEuZXJyb3I7IH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIFJldHVybnMgYW4gYXN5bmMgaXRlcmFibGUgaXRlcmF0b3IgdG8gbGlzdCBvZiBwYWdlIHJhbmdlcyBmb3IgYSBwYWdlIGJsb2IuXG4gICAgICogQHNlZSBodHRwczovL2RvY3MubWljcm9zb2Z0LmNvbS9yZXN0L2FwaS9zdG9yYWdlc2VydmljZXMvZ2V0LXBhZ2UtcmFuZ2VzXG4gICAgICpcbiAgICAgKiAgLmJ5UGFnZSgpIHJldHVybnMgYW4gYXN5bmMgaXRlcmFibGUgaXRlcmF0b3IgdG8gbGlzdCBvZiBwYWdlIHJhbmdlcyBmb3IgYSBwYWdlIGJsb2IuXG4gICAgICpcbiAgICAgKiBFeGFtcGxlIHVzaW5nIGBmb3IgYXdhaXRgIHN5bnRheDpcbiAgICAgKlxuICAgICAqIGBgYGpzXG4gICAgICogLy8gR2V0IHRoZSBwYWdlQmxvYkNsaWVudCBiZWZvcmUgeW91IHJ1biB0aGVzZSBzbmlwcGV0cyxcbiAgICAgKiAvLyBDYW4gYmUgb2J0YWluZWQgZnJvbSBgYmxvYlNlcnZpY2VDbGllbnQuZ2V0Q29udGFpbmVyQ2xpZW50KFwiPHlvdXItY29udGFpbmVyLW5hbWU+XCIpLmdldFBhZ2VCbG9iQ2xpZW50KFwiPHlvdXItYmxvYi1uYW1lPlwiKTtgXG4gICAgICogbGV0IGkgPSAxO1xuICAgICAqIGZvciBhd2FpdCAoY29uc3QgcGFnZVJhbmdlIG9mIHBhZ2VCbG9iQ2xpZW50Lmxpc3RQYWdlUmFuZ2VzKCkpIHtcbiAgICAgKiAgIGNvbnNvbGUubG9nKGBQYWdlIHJhbmdlICR7aSsrfTogJHtwYWdlUmFuZ2Uuc3RhcnR9IC0gJHtwYWdlUmFuZ2UuZW5kfWApO1xuICAgICAqIH1cbiAgICAgKiBgYGBcbiAgICAgKlxuICAgICAqIEV4YW1wbGUgdXNpbmcgYGl0ZXIubmV4dCgpYDpcbiAgICAgKlxuICAgICAqIGBgYGpzXG4gICAgICogbGV0IGkgPSAxO1xuICAgICAqIGxldCBpdGVyID0gcGFnZUJsb2JDbGllbnQubGlzdFBhZ2VSYW5nZXMoKTtcbiAgICAgKiBsZXQgcGFnZVJhbmdlSXRlbSA9IGF3YWl0IGl0ZXIubmV4dCgpO1xuICAgICAqIHdoaWxlICghcGFnZVJhbmdlSXRlbS5kb25lKSB7XG4gICAgICogICBjb25zb2xlLmxvZyhgUGFnZSByYW5nZSAke2krK306ICR7cGFnZVJhbmdlSXRlbS52YWx1ZS5zdGFydH0gLSAke3BhZ2VSYW5nZUl0ZW0udmFsdWUuZW5kfSwgSXNDbGVhcjogJHtwYWdlUmFuZ2VJdGVtLnZhbHVlLmlzQ2xlYXJ9YCk7XG4gICAgICogICBwYWdlUmFuZ2VJdGVtID0gYXdhaXQgaXRlci5uZXh0KCk7XG4gICAgICogfVxuICAgICAqIGBgYFxuICAgICAqXG4gICAgICogRXhhbXBsZSB1c2luZyBgYnlQYWdlKClgOlxuICAgICAqXG4gICAgICogYGBganNcbiAgICAgKiAvLyBwYXNzaW5nIG9wdGlvbmFsIG1heFBhZ2VTaXplIGluIHRoZSBwYWdlIHNldHRpbmdzXG4gICAgICogbGV0IGkgPSAxO1xuICAgICAqIGZvciBhd2FpdCAoY29uc3QgcmVzcG9uc2Ugb2YgcGFnZUJsb2JDbGllbnQubGlzdFBhZ2VSYW5nZXMoKS5ieVBhZ2UoeyBtYXhQYWdlU2l6ZTogMjAgfSkpIHtcbiAgICAgKiAgIGZvciAoY29uc3QgcGFnZVJhbmdlIG9mIHJlc3BvbnNlKSB7XG4gICAgICogICAgIGNvbnNvbGUubG9nKGBQYWdlIHJhbmdlICR7aSsrfTogJHtwYWdlUmFuZ2Uuc3RhcnR9IC0gJHtwYWdlUmFuZ2UuZW5kfWApO1xuICAgICAqICAgfVxuICAgICAqIH1cbiAgICAgKiBgYGBcbiAgICAgKlxuICAgICAqIEV4YW1wbGUgdXNpbmcgcGFnaW5nIHdpdGggYSBtYXJrZXI6XG4gICAgICpcbiAgICAgKiBgYGBqc1xuICAgICAqIGxldCBpID0gMTtcbiAgICAgKiBsZXQgaXRlcmF0b3IgPSBwYWdlQmxvYkNsaWVudC5saXN0UGFnZVJhbmdlcygpLmJ5UGFnZSh7IG1heFBhZ2VTaXplOiAyIH0pO1xuICAgICAqIGxldCByZXNwb25zZSA9IChhd2FpdCBpdGVyYXRvci5uZXh0KCkpLnZhbHVlO1xuICAgICAqXG4gICAgICogLy8gUHJpbnRzIDIgcGFnZSByYW5nZXNcbiAgICAgKiBmb3IgKGNvbnN0IHBhZ2VSYW5nZSBvZiByZXNwb25zZSkge1xuICAgICAqICAgY29uc29sZS5sb2coYFBhZ2UgcmFuZ2UgJHtpKyt9OiAke3BhZ2VSYW5nZS5zdGFydH0gLSAke3BhZ2VSYW5nZS5lbmR9YCk7XG4gICAgICogfVxuICAgICAqXG4gICAgICogLy8gR2V0cyBuZXh0IG1hcmtlclxuICAgICAqIGxldCBtYXJrZXIgPSByZXNwb25zZS5jb250aW51YXRpb25Ub2tlbjtcbiAgICAgKlxuICAgICAqIC8vIFBhc3NpbmcgbmV4dCBtYXJrZXIgYXMgY29udGludWF0aW9uVG9rZW5cbiAgICAgKlxuICAgICAqIGl0ZXJhdG9yID0gcGFnZUJsb2JDbGllbnQubGlzdFBhZ2VSYW5nZXMoKS5ieVBhZ2UoeyBjb250aW51YXRpb25Ub2tlbjogbWFya2VyLCBtYXhQYWdlU2l6ZTogMTAgfSk7XG4gICAgICogcmVzcG9uc2UgPSAoYXdhaXQgaXRlcmF0b3IubmV4dCgpKS52YWx1ZTtcbiAgICAgKlxuICAgICAqIC8vIFByaW50cyAxMCBwYWdlIHJhbmdlc1xuICAgICAqIGZvciAoY29uc3QgYmxvYiBvZiByZXNwb25zZSkge1xuICAgICAqICAgY29uc29sZS5sb2coYFBhZ2UgcmFuZ2UgJHtpKyt9OiAke3BhZ2VSYW5nZS5zdGFydH0gLSAke3BhZ2VSYW5nZS5lbmR9YCk7XG4gICAgICogfVxuICAgICAqIGBgYFxuICAgICAqIEBwYXJhbSBvZmZzZXQgLSBTdGFydGluZyBieXRlIHBvc2l0aW9uIG9mIHRoZSBwYWdlIHJhbmdlcy5cbiAgICAgKiBAcGFyYW0gY291bnQgLSBOdW1iZXIgb2YgYnl0ZXMgdG8gZ2V0LlxuICAgICAqIEBwYXJhbSBvcHRpb25zIC0gT3B0aW9ucyB0byB0aGUgUGFnZSBCbG9iIEdldCBSYW5nZXMgb3BlcmF0aW9uLlxuICAgICAqIEByZXR1cm5zIEFuIGFzeW5jSXRlcmFibGVJdGVyYXRvciB0aGF0IHN1cHBvcnRzIHBhZ2luZy5cbiAgICAgKi9cbiAgICBsaXN0UGFnZVJhbmdlcyhvZmZzZXQgPSAwLCBjb3VudCwgb3B0aW9ucyA9IHt9KSB7XG4gICAgICAgIG9wdGlvbnMuY29uZGl0aW9ucyA9IG9wdGlvbnMuY29uZGl0aW9ucyB8fCB7fTtcbiAgICAgICAgLy8gQXN5bmNJdGVyYWJsZUl0ZXJhdG9yIHRvIGl0ZXJhdGUgb3ZlciBibG9ic1xuICAgICAgICBjb25zdCBpdGVyID0gdGhpcy5saXN0UGFnZVJhbmdlSXRlbXMob2Zmc2V0LCBjb3VudCwgb3B0aW9ucyk7XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAvKipcbiAgICAgICAgICAgICAqIFRoZSBuZXh0IG1ldGhvZCwgcGFydCBvZiB0aGUgaXRlcmF0aW9uIHByb3RvY29sXG4gICAgICAgICAgICAgKi9cbiAgICAgICAgICAgIG5leHQoKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGl0ZXIubmV4dCgpO1xuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIC8qKlxuICAgICAgICAgICAgICogVGhlIGNvbm5lY3Rpb24gdG8gdGhlIGFzeW5jIGl0ZXJhdG9yLCBwYXJ0IG9mIHRoZSBpdGVyYXRpb24gcHJvdG9jb2xcbiAgICAgICAgICAgICAqL1xuICAgICAgICAgICAgW1N5bWJvbC5hc3luY0l0ZXJhdG9yXSgpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gdGhpcztcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAvKipcbiAgICAgICAgICAgICAqIFJldHVybiBhbiBBc3luY0l0ZXJhYmxlSXRlcmF0b3IgdGhhdCB3b3JrcyBhIHBhZ2UgYXQgYSB0aW1lXG4gICAgICAgICAgICAgKi9cbiAgICAgICAgICAgIGJ5UGFnZTogKHNldHRpbmdzID0ge30pID0+IHtcbiAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5saXN0UGFnZVJhbmdlSXRlbVNlZ21lbnRzKG9mZnNldCwgY291bnQsIHNldHRpbmdzLmNvbnRpbnVhdGlvblRva2VuLCBPYmplY3QuYXNzaWduKHsgbWF4UGFnZVNpemU6IHNldHRpbmdzLm1heFBhZ2VTaXplIH0sIG9wdGlvbnMpKTtcbiAgICAgICAgICAgIH0sXG4gICAgICAgIH07XG4gICAgfVxuICAgIC8qKlxuICAgICAqIEdldHMgdGhlIGNvbGxlY3Rpb24gb2YgcGFnZSByYW5nZXMgdGhhdCBkaWZmZXIgYmV0d2VlbiBhIHNwZWNpZmllZCBzbmFwc2hvdCBhbmQgdGhpcyBwYWdlIGJsb2IuXG4gICAgICogQHNlZSBodHRwczovL2RvY3MubWljcm9zb2Z0LmNvbS9yZXN0L2FwaS9zdG9yYWdlc2VydmljZXMvZ2V0LXBhZ2UtcmFuZ2VzXG4gICAgICpcbiAgICAgKiBAcGFyYW0gb2Zmc2V0IC0gU3RhcnRpbmcgYnl0ZSBwb3NpdGlvbiBvZiB0aGUgcGFnZSBibG9iXG4gICAgICogQHBhcmFtIGNvdW50IC0gTnVtYmVyIG9mIGJ5dGVzIHRvIGdldCByYW5nZXMgZGlmZi5cbiAgICAgKiBAcGFyYW0gcHJldlNuYXBzaG90IC0gVGltZXN0YW1wIG9mIHNuYXBzaG90IHRvIHJldHJpZXZlIHRoZSBkaWZmZXJlbmNlLlxuICAgICAqIEBwYXJhbSBvcHRpb25zIC0gT3B0aW9ucyB0byB0aGUgUGFnZSBCbG9iIEdldCBQYWdlIFJhbmdlcyBEaWZmIG9wZXJhdGlvbi5cbiAgICAgKiBAcmV0dXJucyBSZXNwb25zZSBkYXRhIGZvciB0aGUgUGFnZSBCbG9iIEdldCBQYWdlIFJhbmdlIERpZmYgb3BlcmF0aW9uLlxuICAgICAqL1xuICAgIGFzeW5jIGdldFBhZ2VSYW5nZXNEaWZmKG9mZnNldCwgY291bnQsIHByZXZTbmFwc2hvdCwgb3B0aW9ucyA9IHt9KSB7XG4gICAgICAgIG9wdGlvbnMuY29uZGl0aW9ucyA9IG9wdGlvbnMuY29uZGl0aW9ucyB8fCB7fTtcbiAgICAgICAgcmV0dXJuIHRyYWNpbmdDbGllbnQud2l0aFNwYW4oXCJQYWdlQmxvYkNsaWVudC1nZXRQYWdlUmFuZ2VzRGlmZlwiLCBvcHRpb25zLCBhc3luYyAodXBkYXRlZE9wdGlvbnMpID0+IHtcbiAgICAgICAgICAgIHZhciBfYTtcbiAgICAgICAgICAgIGNvbnN0IHJlc3VsdCA9IGFzc2VydFJlc3BvbnNlKGF3YWl0IHRoaXMucGFnZUJsb2JDb250ZXh0LmdldFBhZ2VSYW5nZXNEaWZmKHtcbiAgICAgICAgICAgICAgICBhYm9ydFNpZ25hbDogb3B0aW9ucy5hYm9ydFNpZ25hbCxcbiAgICAgICAgICAgICAgICBsZWFzZUFjY2Vzc0NvbmRpdGlvbnM6IG9wdGlvbnMuY29uZGl0aW9ucyxcbiAgICAgICAgICAgICAgICBtb2RpZmllZEFjY2Vzc0NvbmRpdGlvbnM6IE9iamVjdC5hc3NpZ24oT2JqZWN0LmFzc2lnbih7fSwgb3B0aW9ucy5jb25kaXRpb25zKSwgeyBpZlRhZ3M6IChfYSA9IG9wdGlvbnMuY29uZGl0aW9ucykgPT09IG51bGwgfHwgX2EgPT09IHZvaWQgMCA/IHZvaWQgMCA6IF9hLnRhZ0NvbmRpdGlvbnMgfSksXG4gICAgICAgICAgICAgICAgcHJldnNuYXBzaG90OiBwcmV2U25hcHNob3QsXG4gICAgICAgICAgICAgICAgcmFuZ2U6IHJhbmdlVG9TdHJpbmcoeyBvZmZzZXQsIGNvdW50IH0pLFxuICAgICAgICAgICAgICAgIHRyYWNpbmdPcHRpb25zOiB1cGRhdGVkT3B0aW9ucy50cmFjaW5nT3B0aW9ucyxcbiAgICAgICAgICAgIH0pKTtcbiAgICAgICAgICAgIHJldHVybiByYW5nZVJlc3BvbnNlRnJvbU1vZGVsKHJlc3VsdCk7XG4gICAgICAgIH0pO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBnZXRQYWdlUmFuZ2VzRGlmZlNlZ21lbnQgcmV0dXJucyBhIHNpbmdsZSBzZWdtZW50IG9mIHBhZ2UgcmFuZ2VzIHN0YXJ0aW5nIGZyb20gdGhlXG4gICAgICogc3BlY2lmaWVkIE1hcmtlciBmb3IgZGlmZmVyZW5jZSBiZXR3ZWVuIHByZXZpb3VzIHNuYXBzaG90IGFuZCB0aGUgdGFyZ2V0IHBhZ2UgYmxvYi5cbiAgICAgKiBVc2UgYW4gZW1wdHkgTWFya2VyIHRvIHN0YXJ0IGVudW1lcmF0aW9uIGZyb20gdGhlIGJlZ2lubmluZy5cbiAgICAgKiBBZnRlciBnZXR0aW5nIGEgc2VnbWVudCwgcHJvY2VzcyBpdCwgYW5kIHRoZW4gY2FsbCBnZXRQYWdlUmFuZ2VzRGlmZlNlZ21lbnQgYWdhaW5cbiAgICAgKiAocGFzc2luZyB0aGUgdGhlIHByZXZpb3VzbHktcmV0dXJuZWQgTWFya2VyKSB0byBnZXQgdGhlIG5leHQgc2VnbWVudC5cbiAgICAgKiBAc2VlIGh0dHBzOi8vZG9jcy5taWNyb3NvZnQuY29tL3Jlc3QvYXBpL3N0b3JhZ2VzZXJ2aWNlcy9nZXQtcGFnZS1yYW5nZXNcbiAgICAgKlxuICAgICAqIEBwYXJhbSBvZmZzZXQgLSBTdGFydGluZyBieXRlIHBvc2l0aW9uIG9mIHRoZSBwYWdlIHJhbmdlcy5cbiAgICAgKiBAcGFyYW0gY291bnQgLSBOdW1iZXIgb2YgYnl0ZXMgdG8gZ2V0LlxuICAgICAqIEBwYXJhbSBwcmV2U25hcHNob3RPclVybCAtIFRpbWVzdGFtcCBvZiBzbmFwc2hvdCB0byByZXRyaWV2ZSB0aGUgZGlmZmVyZW5jZSBvciBVUkwgb2Ygc25hcHNob3QgdG8gcmV0cmlldmUgdGhlIGRpZmZlcmVuY2UuXG4gICAgICogQHBhcmFtIG1hcmtlciAtIEEgc3RyaW5nIHZhbHVlIHRoYXQgaWRlbnRpZmllcyB0aGUgcG9ydGlvbiBvZiB0aGUgZ2V0IHRvIGJlIHJldHVybmVkIHdpdGggdGhlIG5leHQgZ2V0IG9wZXJhdGlvbi5cbiAgICAgKiBAcGFyYW0gb3B0aW9ucyAtIE9wdGlvbnMgdG8gdGhlIFBhZ2UgQmxvYiBHZXQgUGFnZSBSYW5nZXMgRGlmZiBvcGVyYXRpb24uXG4gICAgICovXG4gICAgYXN5bmMgbGlzdFBhZ2VSYW5nZXNEaWZmU2VnbWVudChvZmZzZXQsIGNvdW50LCBwcmV2U25hcHNob3RPclVybCwgbWFya2VyLCBvcHRpb25zID0ge30pIHtcbiAgICAgICAgcmV0dXJuIHRyYWNpbmdDbGllbnQud2l0aFNwYW4oXCJQYWdlQmxvYkNsaWVudC1nZXRQYWdlUmFuZ2VzRGlmZlNlZ21lbnRcIiwgb3B0aW9ucywgYXN5bmMgKHVwZGF0ZWRPcHRpb25zKSA9PiB7XG4gICAgICAgICAgICB2YXIgX2E7XG4gICAgICAgICAgICByZXR1cm4gYXNzZXJ0UmVzcG9uc2UoYXdhaXQgdGhpcy5wYWdlQmxvYkNvbnRleHQuZ2V0UGFnZVJhbmdlc0RpZmYoe1xuICAgICAgICAgICAgICAgIGFib3J0U2lnbmFsOiBvcHRpb25zID09PSBudWxsIHx8IG9wdGlvbnMgPT09IHZvaWQgMCA/IHZvaWQgMCA6IG9wdGlvbnMuYWJvcnRTaWduYWwsXG4gICAgICAgICAgICAgICAgbGVhc2VBY2Nlc3NDb25kaXRpb25zOiBvcHRpb25zID09PSBudWxsIHx8IG9wdGlvbnMgPT09IHZvaWQgMCA/IHZvaWQgMCA6IG9wdGlvbnMuY29uZGl0aW9ucyxcbiAgICAgICAgICAgICAgICBtb2RpZmllZEFjY2Vzc0NvbmRpdGlvbnM6IE9iamVjdC5hc3NpZ24oT2JqZWN0LmFzc2lnbih7fSwgb3B0aW9ucyA9PT0gbnVsbCB8fCBvcHRpb25zID09PSB2b2lkIDAgPyB2b2lkIDAgOiBvcHRpb25zLmNvbmRpdGlvbnMpLCB7IGlmVGFnczogKF9hID0gb3B0aW9ucyA9PT0gbnVsbCB8fCBvcHRpb25zID09PSB2b2lkIDAgPyB2b2lkIDAgOiBvcHRpb25zLmNvbmRpdGlvbnMpID09PSBudWxsIHx8IF9hID09PSB2b2lkIDAgPyB2b2lkIDAgOiBfYS50YWdDb25kaXRpb25zIH0pLFxuICAgICAgICAgICAgICAgIHByZXZzbmFwc2hvdDogcHJldlNuYXBzaG90T3JVcmwsXG4gICAgICAgICAgICAgICAgcmFuZ2U6IHJhbmdlVG9TdHJpbmcoe1xuICAgICAgICAgICAgICAgICAgICBvZmZzZXQ6IG9mZnNldCxcbiAgICAgICAgICAgICAgICAgICAgY291bnQ6IGNvdW50LFxuICAgICAgICAgICAgICAgIH0pLFxuICAgICAgICAgICAgICAgIG1hcmtlcjogbWFya2VyLFxuICAgICAgICAgICAgICAgIG1heFBhZ2VTaXplOiBvcHRpb25zID09PSBudWxsIHx8IG9wdGlvbnMgPT09IHZvaWQgMCA/IHZvaWQgMCA6IG9wdGlvbnMubWF4UGFnZVNpemUsXG4gICAgICAgICAgICAgICAgdHJhY2luZ09wdGlvbnM6IHVwZGF0ZWRPcHRpb25zLnRyYWNpbmdPcHRpb25zLFxuICAgICAgICAgICAgfSkpO1xuICAgICAgICB9KTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogUmV0dXJucyBhbiBBc3luY0l0ZXJhYmxlSXRlcmF0b3IgZm9yIHtAbGluayBQYWdlQmxvYkdldFBhZ2VSYW5nZXNEaWZmUmVzcG9uc2VNb2RlbH1cbiAgICAgKlxuICAgICAqXG4gICAgICogQHBhcmFtIG9mZnNldCAtIFN0YXJ0aW5nIGJ5dGUgcG9zaXRpb24gb2YgdGhlIHBhZ2UgcmFuZ2VzLlxuICAgICAqIEBwYXJhbSBjb3VudCAtIE51bWJlciBvZiBieXRlcyB0byBnZXQuXG4gICAgICogQHBhcmFtIHByZXZTbmFwc2hvdE9yVXJsIC0gVGltZXN0YW1wIG9mIHNuYXBzaG90IHRvIHJldHJpZXZlIHRoZSBkaWZmZXJlbmNlIG9yIFVSTCBvZiBzbmFwc2hvdCB0byByZXRyaWV2ZSB0aGUgZGlmZmVyZW5jZS5cbiAgICAgKiBAcGFyYW0gbWFya2VyIC0gQSBzdHJpbmcgdmFsdWUgdGhhdCBpZGVudGlmaWVzIHRoZSBwb3J0aW9uIG9mXG4gICAgICogICAgICAgICAgICAgICAgICAgICAgICAgIHRoZSBnZXQgb2YgcGFnZSByYW5nZXMgdG8gYmUgcmV0dXJuZWQgd2l0aCB0aGUgbmV4dCBnZXR0aW5nIG9wZXJhdGlvbi4gVGhlXG4gICAgICogICAgICAgICAgICAgICAgICAgICAgICAgIG9wZXJhdGlvbiByZXR1cm5zIHRoZSBDb250aW51YXRpb25Ub2tlbiB2YWx1ZSB3aXRoaW4gdGhlIHJlc3BvbnNlIGJvZHkgaWYgdGhlXG4gICAgICogICAgICAgICAgICAgICAgICAgICAgICAgIGdldHRpbmcgb3BlcmF0aW9uIGRpZCBub3QgcmV0dXJuIGFsbCBwYWdlIHJhbmdlcyByZW1haW5pbmcgd2l0aGluIHRoZSBjdXJyZW50IHBhZ2UuXG4gICAgICogICAgICAgICAgICAgICAgICAgICAgICAgIFRoZSBDb250aW51YXRpb25Ub2tlbiB2YWx1ZSBjYW4gYmUgdXNlZCBhcyB0aGUgdmFsdWUgZm9yXG4gICAgICogICAgICAgICAgICAgICAgICAgICAgICAgIHRoZSBtYXJrZXIgcGFyYW1ldGVyIGluIGEgc3Vic2VxdWVudCBjYWxsIHRvIHJlcXVlc3QgdGhlIG5leHQgcGFnZSBvZiBnZXRcbiAgICAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgaXRlbXMuIFRoZSBtYXJrZXIgdmFsdWUgaXMgb3BhcXVlIHRvIHRoZSBjbGllbnQuXG4gICAgICogQHBhcmFtIG9wdGlvbnMgLSBPcHRpb25zIHRvIHRoZSBQYWdlIEJsb2IgR2V0IFBhZ2UgUmFuZ2VzIERpZmYgb3BlcmF0aW9uLlxuICAgICAqL1xuICAgIGxpc3RQYWdlUmFuZ2VEaWZmSXRlbVNlZ21lbnRzKG9mZnNldCwgY291bnQsIHByZXZTbmFwc2hvdE9yVXJsLCBtYXJrZXIsIG9wdGlvbnMpIHtcbiAgICAgICAgcmV0dXJuIHRzbGliLl9fYXN5bmNHZW5lcmF0b3IodGhpcywgYXJndW1lbnRzLCBmdW5jdGlvbiogbGlzdFBhZ2VSYW5nZURpZmZJdGVtU2VnbWVudHNfMSgpIHtcbiAgICAgICAgICAgIGxldCBnZXRQYWdlUmFuZ2VJdGVtU2VnbWVudHNSZXNwb25zZTtcbiAgICAgICAgICAgIGlmICghIW1hcmtlciB8fCBtYXJrZXIgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgICAgIGRvIHtcbiAgICAgICAgICAgICAgICAgICAgZ2V0UGFnZVJhbmdlSXRlbVNlZ21lbnRzUmVzcG9uc2UgPSB5aWVsZCB0c2xpYi5fX2F3YWl0KHRoaXMubGlzdFBhZ2VSYW5nZXNEaWZmU2VnbWVudChvZmZzZXQsIGNvdW50LCBwcmV2U25hcHNob3RPclVybCwgbWFya2VyLCBvcHRpb25zKSk7XG4gICAgICAgICAgICAgICAgICAgIG1hcmtlciA9IGdldFBhZ2VSYW5nZUl0ZW1TZWdtZW50c1Jlc3BvbnNlLmNvbnRpbnVhdGlvblRva2VuO1xuICAgICAgICAgICAgICAgICAgICB5aWVsZCB5aWVsZCB0c2xpYi5fX2F3YWl0KHlpZWxkIHRzbGliLl9fYXdhaXQoZ2V0UGFnZVJhbmdlSXRlbVNlZ21lbnRzUmVzcG9uc2UpKTtcbiAgICAgICAgICAgICAgICB9IHdoaWxlIChtYXJrZXIpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogUmV0dXJucyBhbiBBc3luY0l0ZXJhYmxlSXRlcmF0b3Igb2Yge0BsaW5rIFBhZ2VSYW5nZUluZm99IG9iamVjdHNcbiAgICAgKlxuICAgICAqIEBwYXJhbSBvZmZzZXQgLSBTdGFydGluZyBieXRlIHBvc2l0aW9uIG9mIHRoZSBwYWdlIHJhbmdlcy5cbiAgICAgKiBAcGFyYW0gY291bnQgLSBOdW1iZXIgb2YgYnl0ZXMgdG8gZ2V0LlxuICAgICAqIEBwYXJhbSBwcmV2U25hcHNob3RPclVybCAtIFRpbWVzdGFtcCBvZiBzbmFwc2hvdCB0byByZXRyaWV2ZSB0aGUgZGlmZmVyZW5jZSBvciBVUkwgb2Ygc25hcHNob3QgdG8gcmV0cmlldmUgdGhlIGRpZmZlcmVuY2UuXG4gICAgICogQHBhcmFtIG9wdGlvbnMgLSBPcHRpb25zIHRvIHRoZSBQYWdlIEJsb2IgR2V0IFBhZ2UgUmFuZ2VzIERpZmYgb3BlcmF0aW9uLlxuICAgICAqL1xuICAgIGxpc3RQYWdlUmFuZ2VEaWZmSXRlbXMob2Zmc2V0LCBjb3VudCwgcHJldlNuYXBzaG90T3JVcmwsIG9wdGlvbnMpIHtcbiAgICAgICAgcmV0dXJuIHRzbGliLl9fYXN5bmNHZW5lcmF0b3IodGhpcywgYXJndW1lbnRzLCBmdW5jdGlvbiogbGlzdFBhZ2VSYW5nZURpZmZJdGVtc18xKCkge1xuICAgICAgICAgICAgdmFyIF9hLCBlXzIsIF9iLCBfYztcbiAgICAgICAgICAgIGxldCBtYXJrZXI7XG4gICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgIGZvciAodmFyIF9kID0gdHJ1ZSwgX2UgPSB0c2xpYi5fX2FzeW5jVmFsdWVzKHRoaXMubGlzdFBhZ2VSYW5nZURpZmZJdGVtU2VnbWVudHMob2Zmc2V0LCBjb3VudCwgcHJldlNuYXBzaG90T3JVcmwsIG1hcmtlciwgb3B0aW9ucykpLCBfZjsgX2YgPSB5aWVsZCB0c2xpYi5fX2F3YWl0KF9lLm5leHQoKSksIF9hID0gX2YuZG9uZSwgIV9hOyBfZCA9IHRydWUpIHtcbiAgICAgICAgICAgICAgICAgICAgX2MgPSBfZi52YWx1ZTtcbiAgICAgICAgICAgICAgICAgICAgX2QgPSBmYWxzZTtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgZ2V0UGFnZVJhbmdlc1NlZ21lbnQgPSBfYztcbiAgICAgICAgICAgICAgICAgICAgeWllbGQgdHNsaWIuX19hd2FpdCh5aWVsZCogdHNsaWIuX19hc3luY0RlbGVnYXRvcih0c2xpYi5fX2FzeW5jVmFsdWVzKEV4dHJhY3RQYWdlUmFuZ2VJbmZvSXRlbXMoZ2V0UGFnZVJhbmdlc1NlZ21lbnQpKSkpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGNhdGNoIChlXzJfMSkgeyBlXzIgPSB7IGVycm9yOiBlXzJfMSB9OyB9XG4gICAgICAgICAgICBmaW5hbGx5IHtcbiAgICAgICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgICAgICBpZiAoIV9kICYmICFfYSAmJiAoX2IgPSBfZS5yZXR1cm4pKSB5aWVsZCB0c2xpYi5fX2F3YWl0KF9iLmNhbGwoX2UpKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgZmluYWxseSB7IGlmIChlXzIpIHRocm93IGVfMi5lcnJvcjsgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogUmV0dXJucyBhbiBhc3luYyBpdGVyYWJsZSBpdGVyYXRvciB0byBsaXN0IG9mIHBhZ2UgcmFuZ2VzIHRoYXQgZGlmZmVyIGJldHdlZW4gYSBzcGVjaWZpZWQgc25hcHNob3QgYW5kIHRoaXMgcGFnZSBibG9iLlxuICAgICAqIEBzZWUgaHR0cHM6Ly9kb2NzLm1pY3Jvc29mdC5jb20vcmVzdC9hcGkvc3RvcmFnZXNlcnZpY2VzL2dldC1wYWdlLXJhbmdlc1xuICAgICAqXG4gICAgICogIC5ieVBhZ2UoKSByZXR1cm5zIGFuIGFzeW5jIGl0ZXJhYmxlIGl0ZXJhdG9yIHRvIGxpc3Qgb2YgcGFnZSByYW5nZXMgdGhhdCBkaWZmZXIgYmV0d2VlbiBhIHNwZWNpZmllZCBzbmFwc2hvdCBhbmQgdGhpcyBwYWdlIGJsb2IuXG4gICAgICpcbiAgICAgKiBFeGFtcGxlIHVzaW5nIGBmb3IgYXdhaXRgIHN5bnRheDpcbiAgICAgKlxuICAgICAqIGBgYGpzXG4gICAgICogLy8gR2V0IHRoZSBwYWdlQmxvYkNsaWVudCBiZWZvcmUgeW91IHJ1biB0aGVzZSBzbmlwcGV0cyxcbiAgICAgKiAvLyBDYW4gYmUgb2J0YWluZWQgZnJvbSBgYmxvYlNlcnZpY2VDbGllbnQuZ2V0Q29udGFpbmVyQ2xpZW50KFwiPHlvdXItY29udGFpbmVyLW5hbWU+XCIpLmdldFBhZ2VCbG9iQ2xpZW50KFwiPHlvdXItYmxvYi1uYW1lPlwiKTtgXG4gICAgICogbGV0IGkgPSAxO1xuICAgICAqIGZvciBhd2FpdCAoY29uc3QgcGFnZVJhbmdlIG9mIHBhZ2VCbG9iQ2xpZW50Lmxpc3RQYWdlUmFuZ2VzRGlmZigpKSB7XG4gICAgICogICBjb25zb2xlLmxvZyhgUGFnZSByYW5nZSAke2krK306ICR7cGFnZVJhbmdlLnN0YXJ0fSAtICR7cGFnZVJhbmdlLmVuZH1gKTtcbiAgICAgKiB9XG4gICAgICogYGBgXG4gICAgICpcbiAgICAgKiBFeGFtcGxlIHVzaW5nIGBpdGVyLm5leHQoKWA6XG4gICAgICpcbiAgICAgKiBgYGBqc1xuICAgICAqIGxldCBpID0gMTtcbiAgICAgKiBsZXQgaXRlciA9IHBhZ2VCbG9iQ2xpZW50Lmxpc3RQYWdlUmFuZ2VzRGlmZigpO1xuICAgICAqIGxldCBwYWdlUmFuZ2VJdGVtID0gYXdhaXQgaXRlci5uZXh0KCk7XG4gICAgICogd2hpbGUgKCFwYWdlUmFuZ2VJdGVtLmRvbmUpIHtcbiAgICAgKiAgIGNvbnNvbGUubG9nKGBQYWdlIHJhbmdlICR7aSsrfTogJHtwYWdlUmFuZ2VJdGVtLnZhbHVlLnN0YXJ0fSAtICR7cGFnZVJhbmdlSXRlbS52YWx1ZS5lbmR9LCBJc0NsZWFyOiAke3BhZ2VSYW5nZUl0ZW0udmFsdWUuaXNDbGVhcn1gKTtcbiAgICAgKiAgIHBhZ2VSYW5nZUl0ZW0gPSBhd2FpdCBpdGVyLm5leHQoKTtcbiAgICAgKiB9XG4gICAgICogYGBgXG4gICAgICpcbiAgICAgKiBFeGFtcGxlIHVzaW5nIGBieVBhZ2UoKWA6XG4gICAgICpcbiAgICAgKiBgYGBqc1xuICAgICAqIC8vIHBhc3Npbmcgb3B0aW9uYWwgbWF4UGFnZVNpemUgaW4gdGhlIHBhZ2Ugc2V0dGluZ3NcbiAgICAgKiBsZXQgaSA9IDE7XG4gICAgICogZm9yIGF3YWl0IChjb25zdCByZXNwb25zZSBvZiBwYWdlQmxvYkNsaWVudC5saXN0UGFnZVJhbmdlc0RpZmYoKS5ieVBhZ2UoeyBtYXhQYWdlU2l6ZTogMjAgfSkpIHtcbiAgICAgKiAgIGZvciAoY29uc3QgcGFnZVJhbmdlIG9mIHJlc3BvbnNlKSB7XG4gICAgICogICAgIGNvbnNvbGUubG9nKGBQYWdlIHJhbmdlICR7aSsrfTogJHtwYWdlUmFuZ2Uuc3RhcnR9IC0gJHtwYWdlUmFuZ2UuZW5kfWApO1xuICAgICAqICAgfVxuICAgICAqIH1cbiAgICAgKiBgYGBcbiAgICAgKlxuICAgICAqIEV4YW1wbGUgdXNpbmcgcGFnaW5nIHdpdGggYSBtYXJrZXI6XG4gICAgICpcbiAgICAgKiBgYGBqc1xuICAgICAqIGxldCBpID0gMTtcbiAgICAgKiBsZXQgaXRlcmF0b3IgPSBwYWdlQmxvYkNsaWVudC5saXN0UGFnZVJhbmdlc0RpZmYoKS5ieVBhZ2UoeyBtYXhQYWdlU2l6ZTogMiB9KTtcbiAgICAgKiBsZXQgcmVzcG9uc2UgPSAoYXdhaXQgaXRlcmF0b3IubmV4dCgpKS52YWx1ZTtcbiAgICAgKlxuICAgICAqIC8vIFByaW50cyAyIHBhZ2UgcmFuZ2VzXG4gICAgICogZm9yIChjb25zdCBwYWdlUmFuZ2Ugb2YgcmVzcG9uc2UpIHtcbiAgICAgKiAgIGNvbnNvbGUubG9nKGBQYWdlIHJhbmdlICR7aSsrfTogJHtwYWdlUmFuZ2Uuc3RhcnR9IC0gJHtwYWdlUmFuZ2UuZW5kfWApO1xuICAgICAqIH1cbiAgICAgKlxuICAgICAqIC8vIEdldHMgbmV4dCBtYXJrZXJcbiAgICAgKiBsZXQgbWFya2VyID0gcmVzcG9uc2UuY29udGludWF0aW9uVG9rZW47XG4gICAgICpcbiAgICAgKiAvLyBQYXNzaW5nIG5leHQgbWFya2VyIGFzIGNvbnRpbnVhdGlvblRva2VuXG4gICAgICpcbiAgICAgKiBpdGVyYXRvciA9IHBhZ2VCbG9iQ2xpZW50Lmxpc3RQYWdlUmFuZ2VzRGlmZigpLmJ5UGFnZSh7IGNvbnRpbnVhdGlvblRva2VuOiBtYXJrZXIsIG1heFBhZ2VTaXplOiAxMCB9KTtcbiAgICAgKiByZXNwb25zZSA9IChhd2FpdCBpdGVyYXRvci5uZXh0KCkpLnZhbHVlO1xuICAgICAqXG4gICAgICogLy8gUHJpbnRzIDEwIHBhZ2UgcmFuZ2VzXG4gICAgICogZm9yIChjb25zdCBibG9iIG9mIHJlc3BvbnNlKSB7XG4gICAgICogICBjb25zb2xlLmxvZyhgUGFnZSByYW5nZSAke2krK306ICR7cGFnZVJhbmdlLnN0YXJ0fSAtICR7cGFnZVJhbmdlLmVuZH1gKTtcbiAgICAgKiB9XG4gICAgICogYGBgXG4gICAgICogQHBhcmFtIG9mZnNldCAtIFN0YXJ0aW5nIGJ5dGUgcG9zaXRpb24gb2YgdGhlIHBhZ2UgcmFuZ2VzLlxuICAgICAqIEBwYXJhbSBjb3VudCAtIE51bWJlciBvZiBieXRlcyB0byBnZXQuXG4gICAgICogQHBhcmFtIHByZXZTbmFwc2hvdCAtIFRpbWVzdGFtcCBvZiBzbmFwc2hvdCB0byByZXRyaWV2ZSB0aGUgZGlmZmVyZW5jZS5cbiAgICAgKiBAcGFyYW0gb3B0aW9ucyAtIE9wdGlvbnMgdG8gdGhlIFBhZ2UgQmxvYiBHZXQgUmFuZ2VzIG9wZXJhdGlvbi5cbiAgICAgKiBAcmV0dXJucyBBbiBhc3luY0l0ZXJhYmxlSXRlcmF0b3IgdGhhdCBzdXBwb3J0cyBwYWdpbmcuXG4gICAgICovXG4gICAgbGlzdFBhZ2VSYW5nZXNEaWZmKG9mZnNldCwgY291bnQsIHByZXZTbmFwc2hvdCwgb3B0aW9ucyA9IHt9KSB7XG4gICAgICAgIG9wdGlvbnMuY29uZGl0aW9ucyA9IG9wdGlvbnMuY29uZGl0aW9ucyB8fCB7fTtcbiAgICAgICAgLy8gQXN5bmNJdGVyYWJsZUl0ZXJhdG9yIHRvIGl0ZXJhdGUgb3ZlciBibG9ic1xuICAgICAgICBjb25zdCBpdGVyID0gdGhpcy5saXN0UGFnZVJhbmdlRGlmZkl0ZW1zKG9mZnNldCwgY291bnQsIHByZXZTbmFwc2hvdCwgT2JqZWN0LmFzc2lnbih7fSwgb3B0aW9ucykpO1xuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgLyoqXG4gICAgICAgICAgICAgKiBUaGUgbmV4dCBtZXRob2QsIHBhcnQgb2YgdGhlIGl0ZXJhdGlvbiBwcm90b2NvbFxuICAgICAgICAgICAgICovXG4gICAgICAgICAgICBuZXh0KCkge1xuICAgICAgICAgICAgICAgIHJldHVybiBpdGVyLm5leHQoKTtcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAvKipcbiAgICAgICAgICAgICAqIFRoZSBjb25uZWN0aW9uIHRvIHRoZSBhc3luYyBpdGVyYXRvciwgcGFydCBvZiB0aGUgaXRlcmF0aW9uIHByb3RvY29sXG4gICAgICAgICAgICAgKi9cbiAgICAgICAgICAgIFtTeW1ib2wuYXN5bmNJdGVyYXRvcl0oKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgLyoqXG4gICAgICAgICAgICAgKiBSZXR1cm4gYW4gQXN5bmNJdGVyYWJsZUl0ZXJhdG9yIHRoYXQgd29ya3MgYSBwYWdlIGF0IGEgdGltZVxuICAgICAgICAgICAgICovXG4gICAgICAgICAgICBieVBhZ2U6IChzZXR0aW5ncyA9IHt9KSA9PiB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMubGlzdFBhZ2VSYW5nZURpZmZJdGVtU2VnbWVudHMob2Zmc2V0LCBjb3VudCwgcHJldlNuYXBzaG90LCBzZXR0aW5ncy5jb250aW51YXRpb25Ub2tlbiwgT2JqZWN0LmFzc2lnbih7IG1heFBhZ2VTaXplOiBzZXR0aW5ncy5tYXhQYWdlU2l6ZSB9LCBvcHRpb25zKSk7XG4gICAgICAgICAgICB9LFxuICAgICAgICB9O1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBHZXRzIHRoZSBjb2xsZWN0aW9uIG9mIHBhZ2UgcmFuZ2VzIHRoYXQgZGlmZmVyIGJldHdlZW4gYSBzcGVjaWZpZWQgc25hcHNob3QgYW5kIHRoaXMgcGFnZSBibG9iIGZvciBtYW5hZ2VkIGRpc2tzLlxuICAgICAqIEBzZWUgaHR0cHM6Ly9kb2NzLm1pY3Jvc29mdC5jb20vcmVzdC9hcGkvc3RvcmFnZXNlcnZpY2VzL2dldC1wYWdlLXJhbmdlc1xuICAgICAqXG4gICAgICogQHBhcmFtIG9mZnNldCAtIFN0YXJ0aW5nIGJ5dGUgcG9zaXRpb24gb2YgdGhlIHBhZ2UgYmxvYlxuICAgICAqIEBwYXJhbSBjb3VudCAtIE51bWJlciBvZiBieXRlcyB0byBnZXQgcmFuZ2VzIGRpZmYuXG4gICAgICogQHBhcmFtIHByZXZTbmFwc2hvdFVybCAtIFVSTCBvZiBzbmFwc2hvdCB0byByZXRyaWV2ZSB0aGUgZGlmZmVyZW5jZS5cbiAgICAgKiBAcGFyYW0gb3B0aW9ucyAtIE9wdGlvbnMgdG8gdGhlIFBhZ2UgQmxvYiBHZXQgUGFnZSBSYW5nZXMgRGlmZiBvcGVyYXRpb24uXG4gICAgICogQHJldHVybnMgUmVzcG9uc2UgZGF0YSBmb3IgdGhlIFBhZ2UgQmxvYiBHZXQgUGFnZSBSYW5nZSBEaWZmIG9wZXJhdGlvbi5cbiAgICAgKi9cbiAgICBhc3luYyBnZXRQYWdlUmFuZ2VzRGlmZkZvck1hbmFnZWREaXNrcyhvZmZzZXQsIGNvdW50LCBwcmV2U25hcHNob3RVcmwsIG9wdGlvbnMgPSB7fSkge1xuICAgICAgICBvcHRpb25zLmNvbmRpdGlvbnMgPSBvcHRpb25zLmNvbmRpdGlvbnMgfHwge307XG4gICAgICAgIHJldHVybiB0cmFjaW5nQ2xpZW50LndpdGhTcGFuKFwiUGFnZUJsb2JDbGllbnQtR2V0UGFnZVJhbmdlc0RpZmZGb3JNYW5hZ2VkRGlza3NcIiwgb3B0aW9ucywgYXN5bmMgKHVwZGF0ZWRPcHRpb25zKSA9PiB7XG4gICAgICAgICAgICB2YXIgX2E7XG4gICAgICAgICAgICBjb25zdCByZXNwb25zZSA9IGFzc2VydFJlc3BvbnNlKGF3YWl0IHRoaXMucGFnZUJsb2JDb250ZXh0LmdldFBhZ2VSYW5nZXNEaWZmKHtcbiAgICAgICAgICAgICAgICBhYm9ydFNpZ25hbDogb3B0aW9ucy5hYm9ydFNpZ25hbCxcbiAgICAgICAgICAgICAgICBsZWFzZUFjY2Vzc0NvbmRpdGlvbnM6IG9wdGlvbnMuY29uZGl0aW9ucyxcbiAgICAgICAgICAgICAgICBtb2RpZmllZEFjY2Vzc0NvbmRpdGlvbnM6IE9iamVjdC5hc3NpZ24oT2JqZWN0LmFzc2lnbih7fSwgb3B0aW9ucy5jb25kaXRpb25zKSwgeyBpZlRhZ3M6IChfYSA9IG9wdGlvbnMuY29uZGl0aW9ucykgPT09IG51bGwgfHwgX2EgPT09IHZvaWQgMCA/IHZvaWQgMCA6IF9hLnRhZ0NvbmRpdGlvbnMgfSksXG4gICAgICAgICAgICAgICAgcHJldlNuYXBzaG90VXJsLFxuICAgICAgICAgICAgICAgIHJhbmdlOiByYW5nZVRvU3RyaW5nKHsgb2Zmc2V0LCBjb3VudCB9KSxcbiAgICAgICAgICAgICAgICB0cmFjaW5nT3B0aW9uczogdXBkYXRlZE9wdGlvbnMudHJhY2luZ09wdGlvbnMsXG4gICAgICAgICAgICB9KSk7XG4gICAgICAgICAgICByZXR1cm4gcmFuZ2VSZXNwb25zZUZyb21Nb2RlbChyZXNwb25zZSk7XG4gICAgICAgIH0pO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBSZXNpemVzIHRoZSBwYWdlIGJsb2IgdG8gdGhlIHNwZWNpZmllZCBzaXplICh3aGljaCBtdXN0IGJlIGEgbXVsdGlwbGUgb2YgNTEyKS5cbiAgICAgKiBAc2VlIGh0dHBzOi8vZG9jcy5taWNyb3NvZnQuY29tL3Jlc3QvYXBpL3N0b3JhZ2VzZXJ2aWNlcy9zZXQtYmxvYi1wcm9wZXJ0aWVzXG4gICAgICpcbiAgICAgKiBAcGFyYW0gc2l6ZSAtIFRhcmdldCBzaXplXG4gICAgICogQHBhcmFtIG9wdGlvbnMgLSBPcHRpb25zIHRvIHRoZSBQYWdlIEJsb2IgUmVzaXplIG9wZXJhdGlvbi5cbiAgICAgKiBAcmV0dXJucyBSZXNwb25zZSBkYXRhIGZvciB0aGUgUGFnZSBCbG9iIFJlc2l6ZSBvcGVyYXRpb24uXG4gICAgICovXG4gICAgYXN5bmMgcmVzaXplKHNpemUsIG9wdGlvbnMgPSB7fSkge1xuICAgICAgICBvcHRpb25zLmNvbmRpdGlvbnMgPSBvcHRpb25zLmNvbmRpdGlvbnMgfHwge307XG4gICAgICAgIHJldHVybiB0cmFjaW5nQ2xpZW50LndpdGhTcGFuKFwiUGFnZUJsb2JDbGllbnQtcmVzaXplXCIsIG9wdGlvbnMsIGFzeW5jICh1cGRhdGVkT3B0aW9ucykgPT4ge1xuICAgICAgICAgICAgdmFyIF9hO1xuICAgICAgICAgICAgcmV0dXJuIGFzc2VydFJlc3BvbnNlKGF3YWl0IHRoaXMucGFnZUJsb2JDb250ZXh0LnJlc2l6ZShzaXplLCB7XG4gICAgICAgICAgICAgICAgYWJvcnRTaWduYWw6IG9wdGlvbnMuYWJvcnRTaWduYWwsXG4gICAgICAgICAgICAgICAgbGVhc2VBY2Nlc3NDb25kaXRpb25zOiBvcHRpb25zLmNvbmRpdGlvbnMsXG4gICAgICAgICAgICAgICAgbW9kaWZpZWRBY2Nlc3NDb25kaXRpb25zOiBPYmplY3QuYXNzaWduKE9iamVjdC5hc3NpZ24oe30sIG9wdGlvbnMuY29uZGl0aW9ucyksIHsgaWZUYWdzOiAoX2EgPSBvcHRpb25zLmNvbmRpdGlvbnMpID09PSBudWxsIHx8IF9hID09PSB2b2lkIDAgPyB2b2lkIDAgOiBfYS50YWdDb25kaXRpb25zIH0pLFxuICAgICAgICAgICAgICAgIGVuY3J5cHRpb25TY29wZTogb3B0aW9ucy5lbmNyeXB0aW9uU2NvcGUsXG4gICAgICAgICAgICAgICAgdHJhY2luZ09wdGlvbnM6IHVwZGF0ZWRPcHRpb25zLnRyYWNpbmdPcHRpb25zLFxuICAgICAgICAgICAgfSkpO1xuICAgICAgICB9KTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogU2V0cyBhIHBhZ2UgYmxvYidzIHNlcXVlbmNlIG51bWJlci5cbiAgICAgKiBAc2VlIGh0dHBzOi8vZG9jcy5taWNyb3NvZnQuY29tL2VuLXVzL3Jlc3QvYXBpL3N0b3JhZ2VzZXJ2aWNlcy9zZXQtYmxvYi1wcm9wZXJ0aWVzXG4gICAgICpcbiAgICAgKiBAcGFyYW0gc2VxdWVuY2VOdW1iZXJBY3Rpb24gLSBJbmRpY2F0ZXMgaG93IHRoZSBzZXJ2aWNlIHNob3VsZCBtb2RpZnkgdGhlIGJsb2IncyBzZXF1ZW5jZSBudW1iZXIuXG4gICAgICogQHBhcmFtIHNlcXVlbmNlTnVtYmVyIC0gUmVxdWlyZWQgaWYgc2VxdWVuY2VOdW1iZXJBY3Rpb24gaXMgbWF4IG9yIHVwZGF0ZVxuICAgICAqIEBwYXJhbSBvcHRpb25zIC0gT3B0aW9ucyB0byB0aGUgUGFnZSBCbG9iIFVwZGF0ZSBTZXF1ZW5jZSBOdW1iZXIgb3BlcmF0aW9uLlxuICAgICAqIEByZXR1cm5zIFJlc3BvbnNlIGRhdGEgZm9yIHRoZSBQYWdlIEJsb2IgVXBkYXRlIFNlcXVlbmNlIE51bWJlciBvcGVyYXRpb24uXG4gICAgICovXG4gICAgYXN5bmMgdXBkYXRlU2VxdWVuY2VOdW1iZXIoc2VxdWVuY2VOdW1iZXJBY3Rpb24sIHNlcXVlbmNlTnVtYmVyLCBvcHRpb25zID0ge30pIHtcbiAgICAgICAgb3B0aW9ucy5jb25kaXRpb25zID0gb3B0aW9ucy5jb25kaXRpb25zIHx8IHt9O1xuICAgICAgICByZXR1cm4gdHJhY2luZ0NsaWVudC53aXRoU3BhbihcIlBhZ2VCbG9iQ2xpZW50LXVwZGF0ZVNlcXVlbmNlTnVtYmVyXCIsIG9wdGlvbnMsIGFzeW5jICh1cGRhdGVkT3B0aW9ucykgPT4ge1xuICAgICAgICAgICAgdmFyIF9hO1xuICAgICAgICAgICAgcmV0dXJuIGFzc2VydFJlc3BvbnNlKGF3YWl0IHRoaXMucGFnZUJsb2JDb250ZXh0LnVwZGF0ZVNlcXVlbmNlTnVtYmVyKHNlcXVlbmNlTnVtYmVyQWN0aW9uLCB7XG4gICAgICAgICAgICAgICAgYWJvcnRTaWduYWw6IG9wdGlvbnMuYWJvcnRTaWduYWwsXG4gICAgICAgICAgICAgICAgYmxvYlNlcXVlbmNlTnVtYmVyOiBzZXF1ZW5jZU51bWJlcixcbiAgICAgICAgICAgICAgICBsZWFzZUFjY2Vzc0NvbmRpdGlvbnM6IG9wdGlvbnMuY29uZGl0aW9ucyxcbiAgICAgICAgICAgICAgICBtb2RpZmllZEFjY2Vzc0NvbmRpdGlvbnM6IE9iamVjdC5hc3NpZ24oT2JqZWN0LmFzc2lnbih7fSwgb3B0aW9ucy5jb25kaXRpb25zKSwgeyBpZlRhZ3M6IChfYSA9IG9wdGlvbnMuY29uZGl0aW9ucykgPT09IG51bGwgfHwgX2EgPT09IHZvaWQgMCA/IHZvaWQgMCA6IF9hLnRhZ0NvbmRpdGlvbnMgfSksXG4gICAgICAgICAgICAgICAgdHJhY2luZ09wdGlvbnM6IHVwZGF0ZWRPcHRpb25zLnRyYWNpbmdPcHRpb25zLFxuICAgICAgICAgICAgfSkpO1xuICAgICAgICB9KTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogQmVnaW5zIGFuIG9wZXJhdGlvbiB0byBzdGFydCBhbiBpbmNyZW1lbnRhbCBjb3B5IGZyb20gb25lIHBhZ2UgYmxvYidzIHNuYXBzaG90IHRvIHRoaXMgcGFnZSBibG9iLlxuICAgICAqIFRoZSBzbmFwc2hvdCBpcyBjb3BpZWQgc3VjaCB0aGF0IG9ubHkgdGhlIGRpZmZlcmVudGlhbCBjaGFuZ2VzIGJldHdlZW4gdGhlIHByZXZpb3VzbHlcbiAgICAgKiBjb3BpZWQgc25hcHNob3QgYXJlIHRyYW5zZmVycmVkIHRvIHRoZSBkZXN0aW5hdGlvbi5cbiAgICAgKiBUaGUgY29waWVkIHNuYXBzaG90cyBhcmUgY29tcGxldGUgY29waWVzIG9mIHRoZSBvcmlnaW5hbCBzbmFwc2hvdCBhbmQgY2FuIGJlIHJlYWQgb3IgY29waWVkIGZyb20gYXMgdXN1YWwuXG4gICAgICogQHNlZSBodHRwczovL2RvY3MubWljcm9zb2Z0LmNvbS9yZXN0L2FwaS9zdG9yYWdlc2VydmljZXMvaW5jcmVtZW50YWwtY29weS1ibG9iXG4gICAgICogQHNlZSBodHRwczovL2RvY3MubWljcm9zb2Z0LmNvbS9lbi11cy9henVyZS92aXJ0dWFsLW1hY2hpbmVzL3dpbmRvd3MvaW5jcmVtZW50YWwtc25hcHNob3RzXG4gICAgICpcbiAgICAgKiBAcGFyYW0gY29weVNvdXJjZSAtIFNwZWNpZmllcyB0aGUgbmFtZSBvZiB0aGUgc291cmNlIHBhZ2UgYmxvYiBzbmFwc2hvdC4gRm9yIGV4YW1wbGUsXG4gICAgICogICAgICAgICAgICAgICAgICAgICAgICAgICAgaHR0cHM6Ly9teWFjY291bnQuYmxvYi5jb3JlLndpbmRvd3MubmV0L215Y29udGFpbmVyL215YmxvYj9zbmFwc2hvdD08RGF0ZVRpbWU+XG4gICAgICogQHBhcmFtIG9wdGlvbnMgLSBPcHRpb25zIHRvIHRoZSBQYWdlIEJsb2IgQ29weSBJbmNyZW1lbnRhbCBvcGVyYXRpb24uXG4gICAgICogQHJldHVybnMgUmVzcG9uc2UgZGF0YSBmb3IgdGhlIFBhZ2UgQmxvYiBDb3B5IEluY3JlbWVudGFsIG9wZXJhdGlvbi5cbiAgICAgKi9cbiAgICBhc3luYyBzdGFydENvcHlJbmNyZW1lbnRhbChjb3B5U291cmNlLCBvcHRpb25zID0ge30pIHtcbiAgICAgICAgcmV0dXJuIHRyYWNpbmdDbGllbnQud2l0aFNwYW4oXCJQYWdlQmxvYkNsaWVudC1zdGFydENvcHlJbmNyZW1lbnRhbFwiLCBvcHRpb25zLCBhc3luYyAodXBkYXRlZE9wdGlvbnMpID0+IHtcbiAgICAgICAgICAgIHZhciBfYTtcbiAgICAgICAgICAgIHJldHVybiBhc3NlcnRSZXNwb25zZShhd2FpdCB0aGlzLnBhZ2VCbG9iQ29udGV4dC5jb3B5SW5jcmVtZW50YWwoY29weVNvdXJjZSwge1xuICAgICAgICAgICAgICAgIGFib3J0U2lnbmFsOiBvcHRpb25zLmFib3J0U2lnbmFsLFxuICAgICAgICAgICAgICAgIG1vZGlmaWVkQWNjZXNzQ29uZGl0aW9uczogT2JqZWN0LmFzc2lnbihPYmplY3QuYXNzaWduKHt9LCBvcHRpb25zLmNvbmRpdGlvbnMpLCB7IGlmVGFnczogKF9hID0gb3B0aW9ucy5jb25kaXRpb25zKSA9PT0gbnVsbCB8fCBfYSA9PT0gdm9pZCAwID8gdm9pZCAwIDogX2EudGFnQ29uZGl0aW9ucyB9KSxcbiAgICAgICAgICAgICAgICB0cmFjaW5nT3B0aW9uczogdXBkYXRlZE9wdGlvbnMudHJhY2luZ09wdGlvbnMsXG4gICAgICAgICAgICB9KSk7XG4gICAgICAgIH0pO1xuICAgIH1cbn1cblxuLy8gQ29weXJpZ2h0IChjKSBNaWNyb3NvZnQgQ29ycG9yYXRpb24uXG4vLyBMaWNlbnNlZCB1bmRlciB0aGUgTUlUIExpY2Vuc2UuXG5hc3luYyBmdW5jdGlvbiBnZXRCb2R5QXNUZXh0KGJhdGNoUmVzcG9uc2UpIHtcbiAgICBsZXQgYnVmZmVyID0gQnVmZmVyLmFsbG9jKEJBVENIX01BWF9QQVlMT0FEX0lOX0JZVEVTKTtcbiAgICBjb25zdCByZXNwb25zZUxlbmd0aCA9IGF3YWl0IHN0cmVhbVRvQnVmZmVyMihiYXRjaFJlc3BvbnNlLnJlYWRhYmxlU3RyZWFtQm9keSwgYnVmZmVyKTtcbiAgICAvLyBTbGljZSB0aGUgYnVmZmVyIHRvIHRyaW0gdGhlIGVtcHR5IGVuZGluZy5cbiAgICBidWZmZXIgPSBidWZmZXIuc2xpY2UoMCwgcmVzcG9uc2VMZW5ndGgpO1xuICAgIHJldHVybiBidWZmZXIudG9TdHJpbmcoKTtcbn1cbmZ1bmN0aW9uIHV0ZjhCeXRlTGVuZ3RoKHN0cikge1xuICAgIHJldHVybiBCdWZmZXIuYnl0ZUxlbmd0aChzdHIpO1xufVxuXG4vLyBDb3B5cmlnaHQgKGMpIE1pY3Jvc29mdCBDb3Jwb3JhdGlvbi5cbi8vIExpY2Vuc2VkIHVuZGVyIHRoZSBNSVQgTGljZW5zZS5cbmNvbnN0IEhUVFBfSEVBREVSX0RFTElNSVRFUiA9IFwiOiBcIjtcbmNvbnN0IFNQQUNFX0RFTElNSVRFUiA9IFwiIFwiO1xuY29uc3QgTk9UX0ZPVU5EID0gLTE7XG4vKipcbiAqIFV0aWwgY2xhc3MgZm9yIHBhcnNpbmcgYmF0Y2ggcmVzcG9uc2UuXG4gKi9cbmNsYXNzIEJhdGNoUmVzcG9uc2VQYXJzZXIge1xuICAgIGNvbnN0cnVjdG9yKGJhdGNoUmVzcG9uc2UsIHN1YlJlcXVlc3RzKSB7XG4gICAgICAgIGlmICghYmF0Y2hSZXNwb25zZSB8fCAhYmF0Y2hSZXNwb25zZS5jb250ZW50VHlwZSkge1xuICAgICAgICAgICAgLy8gSW4gc3BlY2lhbCBjYXNlKHJlcG9ydGVkKSwgc2VydmVyIG1heSByZXR1cm4gaW52YWxpZCBjb250ZW50LXR5cGUgd2hpY2ggY291bGQgbm90IGJlIHBhcnNlZC5cbiAgICAgICAgICAgIHRocm93IG5ldyBSYW5nZUVycm9yKFwiYmF0Y2hSZXNwb25zZSBpcyBtYWxmb3JtZWQgb3IgZG9lc24ndCBjb250YWluIHZhbGlkIGNvbnRlbnQtdHlwZS5cIik7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKCFzdWJSZXF1ZXN0cyB8fCBzdWJSZXF1ZXN0cy5zaXplID09PSAwKSB7XG4gICAgICAgICAgICAvLyBUaGlzIHNob3VsZCBiZSBwcmV2ZW50IGR1cmluZyBjb2RpbmcuXG4gICAgICAgICAgICB0aHJvdyBuZXcgUmFuZ2VFcnJvcihcIkludmFsaWQgc3RhdGU6IHN1YlJlcXVlc3RzIGlzIG5vdCBwcm92aWRlZCBvciBzaXplIGlzIDAuXCIpO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMuYmF0Y2hSZXNwb25zZSA9IGJhdGNoUmVzcG9uc2U7XG4gICAgICAgIHRoaXMuc3ViUmVxdWVzdHMgPSBzdWJSZXF1ZXN0cztcbiAgICAgICAgdGhpcy5yZXNwb25zZUJhdGNoQm91bmRhcnkgPSB0aGlzLmJhdGNoUmVzcG9uc2UuY29udGVudFR5cGUuc3BsaXQoXCI9XCIpWzFdO1xuICAgICAgICB0aGlzLnBlclJlc3BvbnNlUHJlZml4ID0gYC0tJHt0aGlzLnJlc3BvbnNlQmF0Y2hCb3VuZGFyeX0ke0hUVFBfTElORV9FTkRJTkd9YDtcbiAgICAgICAgdGhpcy5iYXRjaFJlc3BvbnNlRW5kaW5nID0gYC0tJHt0aGlzLnJlc3BvbnNlQmF0Y2hCb3VuZGFyeX0tLWA7XG4gICAgfVxuICAgIC8vIEZvciBleGFtcGxlIG9mIHJlc3BvbnNlLCBwbGVhc2UgcmVmZXIgdG8gaHR0cHM6Ly9kb2NzLm1pY3Jvc29mdC5jb20vZW4tdXMvcmVzdC9hcGkvc3RvcmFnZXNlcnZpY2VzL2Jsb2ItYmF0Y2gjcmVzcG9uc2VcbiAgICBhc3luYyBwYXJzZUJhdGNoUmVzcG9uc2UoKSB7XG4gICAgICAgIC8vIFdoZW4gbG9naWMgcmVhY2ggaGVyZSwgc3VwcG9zZSBiYXRjaCByZXF1ZXN0IGhhcyBhbHJlYWR5IHN1Y2NlZWRlZCB3aXRoIDIwMiwgc28gd2UgY2FuIGZ1cnRoZXIgcGFyc2VcbiAgICAgICAgLy8gc3ViIHJlcXVlc3QncyByZXNwb25zZS5cbiAgICAgICAgaWYgKHRoaXMuYmF0Y2hSZXNwb25zZS5fcmVzcG9uc2Uuc3RhdHVzICE9PSBIVFRQVVJMQ29ubmVjdGlvbi5IVFRQX0FDQ0VQVEVEKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYEludmFsaWQgc3RhdGU6IGJhdGNoIHJlcXVlc3QgZmFpbGVkIHdpdGggc3RhdHVzOiAnJHt0aGlzLmJhdGNoUmVzcG9uc2UuX3Jlc3BvbnNlLnN0YXR1c30nLmApO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IHJlc3BvbnNlQm9keUFzVGV4dCA9IGF3YWl0IGdldEJvZHlBc1RleHQodGhpcy5iYXRjaFJlc3BvbnNlKTtcbiAgICAgICAgY29uc3Qgc3ViUmVzcG9uc2VzID0gcmVzcG9uc2VCb2R5QXNUZXh0XG4gICAgICAgICAgICAuc3BsaXQodGhpcy5iYXRjaFJlc3BvbnNlRW5kaW5nKVswXSAvLyBzdHJpbmcgYWZ0ZXIgZW5kaW5nIGlzIHVzZWxlc3NcbiAgICAgICAgICAgIC5zcGxpdCh0aGlzLnBlclJlc3BvbnNlUHJlZml4KVxuICAgICAgICAgICAgLnNsaWNlKDEpOyAvLyBzdHJpbmcgYmVmb3JlIGZpcnN0IHJlc3BvbnNlIGJvdW5kYXJ5IGlzIHVzZWxlc3NcbiAgICAgICAgY29uc3Qgc3ViUmVzcG9uc2VDb3VudCA9IHN1YlJlc3BvbnNlcy5sZW5ndGg7XG4gICAgICAgIC8vIERlZmVuc2l2ZSBjb2RpbmcgaW4gY2FzZSBvZiBwb3RlbnRpYWwgZXJyb3IgcGFyc2luZy5cbiAgICAgICAgLy8gTm90ZTogc3ViUmVzcG9uc2VDb3VudCA9PSAxIGlzIHNwZWNpYWwgY2FzZSB3aGVyZSBzdWIgcmVxdWVzdCBpcyBpbnZhbGlkLlxuICAgICAgICAvLyBXZSB0cnkgdG8gcHJldmVudCBzdWNoIGNhc2VzIHRocm91Z2ggZWFybHkgdmFsaWRhdGlvbiwgZS5nLiB2YWxpZGF0ZSBzdWIgcmVxdWVzdCBjb3VudCA+PSAxLlxuICAgICAgICAvLyBXaGlsZSBpbiB1bmV4cGVjdGVkIHN1YiByZXF1ZXN0IGludmFsaWQgY2FzZSwgd2UgYWxsb3cgc3ViIHJlc3BvbnNlIHRvIGJlIHBhcnNlZCBhbmQgcmV0dXJuIHRvIHVzZXIuXG4gICAgICAgIGlmIChzdWJSZXNwb25zZUNvdW50ICE9PSB0aGlzLnN1YlJlcXVlc3RzLnNpemUgJiYgc3ViUmVzcG9uc2VDb3VudCAhPT0gMSkge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwiSW52YWxpZCBzdGF0ZTogc3ViIHJlc3BvbnNlcycgY291bnQgaXMgbm90IGVxdWFsIHRvIHN1YiByZXF1ZXN0cycgY291bnQuXCIpO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IGRlc2VyaWFsaXplZFN1YlJlc3BvbnNlcyA9IG5ldyBBcnJheShzdWJSZXNwb25zZUNvdW50KTtcbiAgICAgICAgbGV0IHN1YlJlc3BvbnNlc1N1Y2NlZWRlZENvdW50ID0gMDtcbiAgICAgICAgbGV0IHN1YlJlc3BvbnNlc0ZhaWxlZENvdW50ID0gMDtcbiAgICAgICAgLy8gUGFyc2Ugc3ViIHN1YlJlc3BvbnNlcy5cbiAgICAgICAgZm9yIChsZXQgaW5kZXggPSAwOyBpbmRleCA8IHN1YlJlc3BvbnNlQ291bnQ7IGluZGV4KyspIHtcbiAgICAgICAgICAgIGNvbnN0IHN1YlJlc3BvbnNlID0gc3ViUmVzcG9uc2VzW2luZGV4XTtcbiAgICAgICAgICAgIGNvbnN0IGRlc2VyaWFsaXplZFN1YlJlc3BvbnNlID0ge307XG4gICAgICAgICAgICBkZXNlcmlhbGl6ZWRTdWJSZXNwb25zZS5oZWFkZXJzID0gY29yZUh0dHBDb21wYXQudG9IdHRwSGVhZGVyc0xpa2UoY29yZVJlc3RQaXBlbGluZS5jcmVhdGVIdHRwSGVhZGVycygpKTtcbiAgICAgICAgICAgIGNvbnN0IHJlc3BvbnNlTGluZXMgPSBzdWJSZXNwb25zZS5zcGxpdChgJHtIVFRQX0xJTkVfRU5ESU5HfWApO1xuICAgICAgICAgICAgbGV0IHN1YlJlc3BIZWFkZXJTdGFydEZvdW5kID0gZmFsc2U7XG4gICAgICAgICAgICBsZXQgc3ViUmVzcEhlYWRlckVuZEZvdW5kID0gZmFsc2U7XG4gICAgICAgICAgICBsZXQgc3ViUmVzcEZhaWxlZCA9IGZhbHNlO1xuICAgICAgICAgICAgbGV0IGNvbnRlbnRJZCA9IE5PVF9GT1VORDtcbiAgICAgICAgICAgIGZvciAoY29uc3QgcmVzcG9uc2VMaW5lIG9mIHJlc3BvbnNlTGluZXMpIHtcbiAgICAgICAgICAgICAgICBpZiAoIXN1YlJlc3BIZWFkZXJTdGFydEZvdW5kKSB7XG4gICAgICAgICAgICAgICAgICAgIC8vIENvbnZlbnRpb24gbGluZSB0byBpbmRpY2F0ZSBjb250ZW50IElEXG4gICAgICAgICAgICAgICAgICAgIGlmIChyZXNwb25zZUxpbmUuc3RhcnRzV2l0aChIZWFkZXJDb25zdGFudHMuQ09OVEVOVF9JRCkpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRlbnRJZCA9IHBhcnNlSW50KHJlc3BvbnNlTGluZS5zcGxpdChIVFRQX0hFQURFUl9ERUxJTUlURVIpWzFdKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAvLyBIdHRwIHZlcnNpb24gbGluZSB3aXRoIHN0YXR1cyBjb2RlIGluZGljYXRlcyB0aGUgc3RhcnQgb2Ygc3ViIHJlcXVlc3QncyByZXNwb25zZS5cbiAgICAgICAgICAgICAgICAgICAgLy8gRXhhbXBsZTogSFRUUC8xLjEgMjAyIEFjY2VwdGVkXG4gICAgICAgICAgICAgICAgICAgIGlmIChyZXNwb25zZUxpbmUuc3RhcnRzV2l0aChIVFRQX1ZFUlNJT05fMV8xKSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgc3ViUmVzcEhlYWRlclN0YXJ0Rm91bmQgPSB0cnVlO1xuICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdG9rZW5zID0gcmVzcG9uc2VMaW5lLnNwbGl0KFNQQUNFX0RFTElNSVRFUik7XG4gICAgICAgICAgICAgICAgICAgICAgICBkZXNlcmlhbGl6ZWRTdWJSZXNwb25zZS5zdGF0dXMgPSBwYXJzZUludCh0b2tlbnNbMV0pO1xuICAgICAgICAgICAgICAgICAgICAgICAgZGVzZXJpYWxpemVkU3ViUmVzcG9uc2Uuc3RhdHVzTWVzc2FnZSA9IHRva2Vucy5zbGljZSgyKS5qb2luKFNQQUNFX0RFTElNSVRFUik7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgY29udGludWU7IC8vIFNraXAgY29udmVudGlvbiBoZWFkZXJzIG5vdCBzcGVjaWZpY2FsbHkgZm9yIHN1YiByZXF1ZXN0IGkuZS4gQ29udGVudC1UeXBlOiBhcHBsaWNhdGlvbi9odHRwIGFuZCBDb250ZW50LUlEOiAqXG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGlmIChyZXNwb25zZUxpbmUudHJpbSgpID09PSBcIlwiKSB7XG4gICAgICAgICAgICAgICAgICAgIC8vIFN1YiByZXNwb25zZSdzIGhlYWRlciBzdGFydCBsaW5lIGFscmVhZHkgZm91bmQsIGFuZCB0aGUgZmlyc3QgZW1wdHkgbGluZSBpbmRpY2F0ZXMgaGVhZGVyIGVuZCBsaW5lIGZvdW5kLlxuICAgICAgICAgICAgICAgICAgICBpZiAoIXN1YlJlc3BIZWFkZXJFbmRGb3VuZCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgc3ViUmVzcEhlYWRlckVuZEZvdW5kID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsgLy8gU2tpcCBlbXB0eSBsaW5lXG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIC8vIE5vdGU6IHdoZW4gY29kZSByZWFjaCBoZXJlLCBpdCBpbmRpY2F0ZXMgc3ViUmVzcEhlYWRlclN0YXJ0Rm91bmQgPT0gdHJ1ZVxuICAgICAgICAgICAgICAgIGlmICghc3ViUmVzcEhlYWRlckVuZEZvdW5kKSB7XG4gICAgICAgICAgICAgICAgICAgIGlmIChyZXNwb25zZUxpbmUuaW5kZXhPZihIVFRQX0hFQURFUl9ERUxJTUlURVIpID09PSAtMSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgLy8gRGVmZW5zaXZlIGNvZGluZyB0byBwcmV2ZW50IGZyb20gbWlzc2luZyB2YWx1YWJsZSBsaW5lcy5cbiAgICAgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihgSW52YWxpZCBzdGF0ZTogZmluZCBub24tZW1wdHkgbGluZSAnJHtyZXNwb25zZUxpbmV9JyB3aXRob3V0IEhUVFAgaGVhZGVyIGRlbGltaXRlciAnJHtIVFRQX0hFQURFUl9ERUxJTUlURVJ9Jy5gKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAvLyBQYXJzZSBoZWFkZXJzIG9mIHN1YiByZXNwb25zZS5cbiAgICAgICAgICAgICAgICAgICAgY29uc3QgdG9rZW5zID0gcmVzcG9uc2VMaW5lLnNwbGl0KEhUVFBfSEVBREVSX0RFTElNSVRFUik7XG4gICAgICAgICAgICAgICAgICAgIGRlc2VyaWFsaXplZFN1YlJlc3BvbnNlLmhlYWRlcnMuc2V0KHRva2Vuc1swXSwgdG9rZW5zWzFdKTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKHRva2Vuc1swXSA9PT0gSGVhZGVyQ29uc3RhbnRzLlhfTVNfRVJST1JfQ09ERSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgZGVzZXJpYWxpemVkU3ViUmVzcG9uc2UuZXJyb3JDb2RlID0gdG9rZW5zWzFdO1xuICAgICAgICAgICAgICAgICAgICAgICAgc3ViUmVzcEZhaWxlZCA9IHRydWU7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIC8vIEFzc2VtYmxlIGJvZHkgb2Ygc3ViIHJlc3BvbnNlLlxuICAgICAgICAgICAgICAgICAgICBpZiAoIWRlc2VyaWFsaXplZFN1YlJlc3BvbnNlLmJvZHlBc1RleHQpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGRlc2VyaWFsaXplZFN1YlJlc3BvbnNlLmJvZHlBc1RleHQgPSBcIlwiO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIGRlc2VyaWFsaXplZFN1YlJlc3BvbnNlLmJvZHlBc1RleHQgKz0gcmVzcG9uc2VMaW5lO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0gLy8gSW5uZXIgZm9yIGVuZFxuICAgICAgICAgICAgLy8gVGhlIHJlc3BvbnNlIHdpbGwgY29udGFpbiB0aGUgQ29udGVudC1JRCBoZWFkZXIgZm9yIGVhY2ggY29ycmVzcG9uZGluZyBzdWJyZXF1ZXN0IHJlc3BvbnNlIHRvIHVzZSBmb3IgdHJhY2tpbmcuXG4gICAgICAgICAgICAvLyBUaGUgQ29udGVudC1JRHMgYXJlIHNldCB0byBhIHZhbGlkIGluZGV4IGluIHRoZSBzdWJyZXF1ZXN0cyB3ZSBzZW50LiBJbiB0aGUgc3RhdHVzIGNvZGUgMjAyIHBhdGgsIHdlIGNvdWxkIGV4cGVjdCBpdFxuICAgICAgICAgICAgLy8gdG8gYmUgMS0xIG1hcHBpbmcgZnJvbSB0aGUgWzAsIHN1YlJlcXVlc3RzLnNpemUpIHRvIHRoZSBDb250ZW50LUlEcyByZXR1cm5lZC4gSWYgbm90LCB3ZSBzaW1wbHkgZG9uJ3QgcmV0dXJuIHRoYXRcbiAgICAgICAgICAgIC8vIHVuZXhwZWN0ZWQgc3ViUmVzcG9uc2UgaW4gdGhlIHBhcnNlZCByZXBvbnNlIGFuZCB3ZSBjYW4gYWx3YXlzIGxvb2sgaXQgdXAgaW4gdGhlIHJhdyByZXNwb25zZSBmb3IgZGVidWdnaW5nIHB1cnBvc2UuXG4gICAgICAgICAgICBpZiAoY29udGVudElkICE9PSBOT1RfRk9VTkQgJiZcbiAgICAgICAgICAgICAgICBOdW1iZXIuaXNJbnRlZ2VyKGNvbnRlbnRJZCkgJiZcbiAgICAgICAgICAgICAgICBjb250ZW50SWQgPj0gMCAmJlxuICAgICAgICAgICAgICAgIGNvbnRlbnRJZCA8IHRoaXMuc3ViUmVxdWVzdHMuc2l6ZSAmJlxuICAgICAgICAgICAgICAgIGRlc2VyaWFsaXplZFN1YlJlc3BvbnNlc1tjb250ZW50SWRdID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgICAgICBkZXNlcmlhbGl6ZWRTdWJSZXNwb25zZS5fcmVxdWVzdCA9IHRoaXMuc3ViUmVxdWVzdHMuZ2V0KGNvbnRlbnRJZCk7XG4gICAgICAgICAgICAgICAgZGVzZXJpYWxpemVkU3ViUmVzcG9uc2VzW2NvbnRlbnRJZF0gPSBkZXNlcmlhbGl6ZWRTdWJSZXNwb25zZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgIGxvZ2dlci5lcnJvcihgc3ViUmVzcG9uc2VzWyR7aW5kZXh9XSBpcyBkcm9wcGVkIGFzIHRoZSBDb250ZW50LUlEIGlzIG5vdCBmb3VuZCBvciBpbnZhbGlkLCBDb250ZW50LUlEOiAke2NvbnRlbnRJZH1gKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmIChzdWJSZXNwRmFpbGVkKSB7XG4gICAgICAgICAgICAgICAgc3ViUmVzcG9uc2VzRmFpbGVkQ291bnQrKztcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgIHN1YlJlc3BvbnNlc1N1Y2NlZWRlZENvdW50Kys7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgIHN1YlJlc3BvbnNlczogZGVzZXJpYWxpemVkU3ViUmVzcG9uc2VzLFxuICAgICAgICAgICAgc3ViUmVzcG9uc2VzU3VjY2VlZGVkQ291bnQ6IHN1YlJlc3BvbnNlc1N1Y2NlZWRlZENvdW50LFxuICAgICAgICAgICAgc3ViUmVzcG9uc2VzRmFpbGVkQ291bnQ6IHN1YlJlc3BvbnNlc0ZhaWxlZENvdW50LFxuICAgICAgICB9O1xuICAgIH1cbn1cblxuLy8gQ29weXJpZ2h0IChjKSBNaWNyb3NvZnQgQ29ycG9yYXRpb24uXG4vLyBMaWNlbnNlZCB1bmRlciB0aGUgTUlUIExpY2Vuc2UuXG52YXIgTXV0ZXhMb2NrU3RhdHVzO1xuKGZ1bmN0aW9uIChNdXRleExvY2tTdGF0dXMpIHtcbiAgICBNdXRleExvY2tTdGF0dXNbTXV0ZXhMb2NrU3RhdHVzW1wiTE9DS0VEXCJdID0gMF0gPSBcIkxPQ0tFRFwiO1xuICAgIE11dGV4TG9ja1N0YXR1c1tNdXRleExvY2tTdGF0dXNbXCJVTkxPQ0tFRFwiXSA9IDFdID0gXCJVTkxPQ0tFRFwiO1xufSkoTXV0ZXhMb2NrU3RhdHVzIHx8IChNdXRleExvY2tTdGF0dXMgPSB7fSkpO1xuLyoqXG4gKiBBbiBhc3luYyBtdXRleCBsb2NrLlxuICovXG5jbGFzcyBNdXRleCB7XG4gICAgLyoqXG4gICAgICogTG9jayBmb3IgYSBzcGVjaWZpYyBrZXkuIElmIHRoZSBsb2NrIGhhcyBiZWVuIGFjcXVpcmVkIGJ5IGFub3RoZXIgY3VzdG9tZXIsIHRoZW5cbiAgICAgKiB3aWxsIHdhaXQgdW50aWwgZ2V0dGluZyB0aGUgbG9jay5cbiAgICAgKlxuICAgICAqIEBwYXJhbSBrZXkgLSBsb2NrIGtleVxuICAgICAqL1xuICAgIHN0YXRpYyBhc3luYyBsb2NrKGtleSkge1xuICAgICAgICByZXR1cm4gbmV3IFByb21pc2UoKHJlc29sdmUpID0+IHtcbiAgICAgICAgICAgIGlmICh0aGlzLmtleXNba2V5XSA9PT0gdW5kZWZpbmVkIHx8IHRoaXMua2V5c1trZXldID09PSBNdXRleExvY2tTdGF0dXMuVU5MT0NLRUQpIHtcbiAgICAgICAgICAgICAgICB0aGlzLmtleXNba2V5XSA9IE11dGV4TG9ja1N0YXR1cy5MT0NLRUQ7XG4gICAgICAgICAgICAgICAgcmVzb2x2ZSgpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgdGhpcy5vblVubG9ja0V2ZW50KGtleSwgKCkgPT4ge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLmtleXNba2V5XSA9IE11dGV4TG9ja1N0YXR1cy5MT0NLRUQ7XG4gICAgICAgICAgICAgICAgICAgIHJlc29sdmUoKTtcbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIFVubG9jayBhIGtleS5cbiAgICAgKlxuICAgICAqIEBwYXJhbSBrZXkgLVxuICAgICAqL1xuICAgIHN0YXRpYyBhc3luYyB1bmxvY2soa2V5KSB7XG4gICAgICAgIHJldHVybiBuZXcgUHJvbWlzZSgocmVzb2x2ZSkgPT4ge1xuICAgICAgICAgICAgaWYgKHRoaXMua2V5c1trZXldID09PSBNdXRleExvY2tTdGF0dXMuTE9DS0VEKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5lbWl0VW5sb2NrRXZlbnQoa2V5KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGRlbGV0ZSB0aGlzLmtleXNba2V5XTtcbiAgICAgICAgICAgIHJlc29sdmUoKTtcbiAgICAgICAgfSk7XG4gICAgfVxuICAgIHN0YXRpYyBvblVubG9ja0V2ZW50KGtleSwgaGFuZGxlcikge1xuICAgICAgICBpZiAodGhpcy5saXN0ZW5lcnNba2V5XSA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICB0aGlzLmxpc3RlbmVyc1trZXldID0gW2hhbmRsZXJdO1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgdGhpcy5saXN0ZW5lcnNba2V5XS5wdXNoKGhhbmRsZXIpO1xuICAgICAgICB9XG4gICAgfVxuICAgIHN0YXRpYyBlbWl0VW5sb2NrRXZlbnQoa2V5KSB7XG4gICAgICAgIGlmICh0aGlzLmxpc3RlbmVyc1trZXldICE9PSB1bmRlZmluZWQgJiYgdGhpcy5saXN0ZW5lcnNba2V5XS5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgICBjb25zdCBoYW5kbGVyID0gdGhpcy5saXN0ZW5lcnNba2V5XS5zaGlmdCgpO1xuICAgICAgICAgICAgc2V0SW1tZWRpYXRlKCgpID0+IHtcbiAgICAgICAgICAgICAgICBoYW5kbGVyLmNhbGwodGhpcyk7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgIH1cbn1cbk11dGV4LmtleXMgPSB7fTtcbk11dGV4Lmxpc3RlbmVycyA9IHt9O1xuXG4vLyBDb3B5cmlnaHQgKGMpIE1pY3Jvc29mdCBDb3Jwb3JhdGlvbi5cbi8vIExpY2Vuc2VkIHVuZGVyIHRoZSBNSVQgTGljZW5zZS5cbi8qKlxuICogQSBCbG9iQmF0Y2ggcmVwcmVzZW50cyBhbiBhZ2dyZWdhdGVkIHNldCBvZiBvcGVyYXRpb25zIG9uIGJsb2JzLlxuICogQ3VycmVudGx5LCBvbmx5IGBkZWxldGVgIGFuZCBgc2V0QWNjZXNzVGllcmAgYXJlIHN1cHBvcnRlZC5cbiAqL1xuY2xhc3MgQmxvYkJhdGNoIHtcbiAgICBjb25zdHJ1Y3RvcigpIHtcbiAgICAgICAgdGhpcy5iYXRjaCA9IFwiYmF0Y2hcIjtcbiAgICAgICAgdGhpcy5iYXRjaFJlcXVlc3QgPSBuZXcgSW5uZXJCYXRjaFJlcXVlc3QoKTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogR2V0IHRoZSB2YWx1ZSBvZiBDb250ZW50LVR5cGUgZm9yIGEgYmF0Y2ggcmVxdWVzdC5cbiAgICAgKiBUaGUgdmFsdWUgbXVzdCBiZSBtdWx0aXBhcnQvbWl4ZWQgd2l0aCBhIGJhdGNoIGJvdW5kYXJ5LlxuICAgICAqIEV4YW1wbGU6IG11bHRpcGFydC9taXhlZDsgYm91bmRhcnk9YmF0Y2hfYTgxNzg2YzgtZTMwMS00ZTQyLWE3MjktYTMyY2EyNGFlMjUyXG4gICAgICovXG4gICAgZ2V0TXVsdGlQYXJ0Q29udGVudFR5cGUoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmJhdGNoUmVxdWVzdC5nZXRNdWx0aXBhcnRDb250ZW50VHlwZSgpO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBHZXQgYXNzZW1ibGVkIEhUVFAgcmVxdWVzdCBib2R5IGZvciBzdWIgcmVxdWVzdHMuXG4gICAgICovXG4gICAgZ2V0SHR0cFJlcXVlc3RCb2R5KCkge1xuICAgICAgICByZXR1cm4gdGhpcy5iYXRjaFJlcXVlc3QuZ2V0SHR0cFJlcXVlc3RCb2R5KCk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIEdldCBzdWIgcmVxdWVzdHMgdGhhdCBhcmUgYWRkZWQgaW50byB0aGUgYmF0Y2ggcmVxdWVzdC5cbiAgICAgKi9cbiAgICBnZXRTdWJSZXF1ZXN0cygpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuYmF0Y2hSZXF1ZXN0LmdldFN1YlJlcXVlc3RzKCk7XG4gICAgfVxuICAgIGFzeW5jIGFkZFN1YlJlcXVlc3RJbnRlcm5hbChzdWJSZXF1ZXN0LCBhc3NlbWJsZVN1YlJlcXVlc3RGdW5jKSB7XG4gICAgICAgIGF3YWl0IE11dGV4LmxvY2sodGhpcy5iYXRjaCk7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgICB0aGlzLmJhdGNoUmVxdWVzdC5wcmVBZGRTdWJSZXF1ZXN0KHN1YlJlcXVlc3QpO1xuICAgICAgICAgICAgYXdhaXQgYXNzZW1ibGVTdWJSZXF1ZXN0RnVuYygpO1xuICAgICAgICAgICAgdGhpcy5iYXRjaFJlcXVlc3QucG9zdEFkZFN1YlJlcXVlc3Qoc3ViUmVxdWVzdCk7XG4gICAgICAgIH1cbiAgICAgICAgZmluYWxseSB7XG4gICAgICAgICAgICBhd2FpdCBNdXRleC51bmxvY2sodGhpcy5iYXRjaCk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgc2V0QmF0Y2hUeXBlKGJhdGNoVHlwZSkge1xuICAgICAgICBpZiAoIXRoaXMuYmF0Y2hUeXBlKSB7XG4gICAgICAgICAgICB0aGlzLmJhdGNoVHlwZSA9IGJhdGNoVHlwZTtcbiAgICAgICAgfVxuICAgICAgICBpZiAodGhpcy5iYXRjaFR5cGUgIT09IGJhdGNoVHlwZSkge1xuICAgICAgICAgICAgdGhyb3cgbmV3IFJhbmdlRXJyb3IoYEJsb2JCYXRjaCBvbmx5IHN1cHBvcnRzIG9uZSBvcGVyYXRpb24gdHlwZSBwZXIgYmF0Y2ggYW5kIGl0IGFscmVhZHkgaXMgYmVpbmcgdXNlZCBmb3IgJHt0aGlzLmJhdGNoVHlwZX0gb3BlcmF0aW9ucy5gKTtcbiAgICAgICAgfVxuICAgIH1cbiAgICBhc3luYyBkZWxldGVCbG9iKHVybE9yQmxvYkNsaWVudCwgY3JlZGVudGlhbE9yT3B0aW9ucywgb3B0aW9ucykge1xuICAgICAgICBsZXQgdXJsO1xuICAgICAgICBsZXQgY3JlZGVudGlhbDtcbiAgICAgICAgaWYgKHR5cGVvZiB1cmxPckJsb2JDbGllbnQgPT09IFwic3RyaW5nXCIgJiZcbiAgICAgICAgICAgICgoY29yZVV0aWwuaXNOb2RlICYmIGNyZWRlbnRpYWxPck9wdGlvbnMgaW5zdGFuY2VvZiBTdG9yYWdlU2hhcmVkS2V5Q3JlZGVudGlhbCkgfHxcbiAgICAgICAgICAgICAgICBjcmVkZW50aWFsT3JPcHRpb25zIGluc3RhbmNlb2YgQW5vbnltb3VzQ3JlZGVudGlhbCB8fFxuICAgICAgICAgICAgICAgIGNvcmVBdXRoLmlzVG9rZW5DcmVkZW50aWFsKGNyZWRlbnRpYWxPck9wdGlvbnMpKSkge1xuICAgICAgICAgICAgLy8gRmlyc3Qgb3ZlcmxvYWRcbiAgICAgICAgICAgIHVybCA9IHVybE9yQmxvYkNsaWVudDtcbiAgICAgICAgICAgIGNyZWRlbnRpYWwgPSBjcmVkZW50aWFsT3JPcHRpb25zO1xuICAgICAgICB9XG4gICAgICAgIGVsc2UgaWYgKHVybE9yQmxvYkNsaWVudCBpbnN0YW5jZW9mIEJsb2JDbGllbnQpIHtcbiAgICAgICAgICAgIC8vIFNlY29uZCBvdmVybG9hZFxuICAgICAgICAgICAgdXJsID0gdXJsT3JCbG9iQ2xpZW50LnVybDtcbiAgICAgICAgICAgIGNyZWRlbnRpYWwgPSB1cmxPckJsb2JDbGllbnQuY3JlZGVudGlhbDtcbiAgICAgICAgICAgIG9wdGlvbnMgPSBjcmVkZW50aWFsT3JPcHRpb25zO1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgdGhyb3cgbmV3IFJhbmdlRXJyb3IoXCJJbnZhbGlkIGFyZ3VtZW50cy4gRWl0aGVyIHVybCBhbmQgY3JlZGVudGlhbCwgb3IgQmxvYkNsaWVudCBuZWVkIGJlIHByb3ZpZGVkLlwiKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoIW9wdGlvbnMpIHtcbiAgICAgICAgICAgIG9wdGlvbnMgPSB7fTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gdHJhY2luZ0NsaWVudC53aXRoU3BhbihcIkJhdGNoRGVsZXRlUmVxdWVzdC1hZGRTdWJSZXF1ZXN0XCIsIG9wdGlvbnMsIGFzeW5jICh1cGRhdGVkT3B0aW9ucykgPT4ge1xuICAgICAgICAgICAgdGhpcy5zZXRCYXRjaFR5cGUoXCJkZWxldGVcIik7XG4gICAgICAgICAgICBhd2FpdCB0aGlzLmFkZFN1YlJlcXVlc3RJbnRlcm5hbCh7XG4gICAgICAgICAgICAgICAgdXJsOiB1cmwsXG4gICAgICAgICAgICAgICAgY3JlZGVudGlhbDogY3JlZGVudGlhbCxcbiAgICAgICAgICAgIH0sIGFzeW5jICgpID0+IHtcbiAgICAgICAgICAgICAgICBhd2FpdCBuZXcgQmxvYkNsaWVudCh1cmwsIHRoaXMuYmF0Y2hSZXF1ZXN0LmNyZWF0ZVBpcGVsaW5lKGNyZWRlbnRpYWwpKS5kZWxldGUodXBkYXRlZE9wdGlvbnMpO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgIH0pO1xuICAgIH1cbiAgICBhc3luYyBzZXRCbG9iQWNjZXNzVGllcih1cmxPckJsb2JDbGllbnQsIGNyZWRlbnRpYWxPclRpZXIsIHRpZXJPck9wdGlvbnMsIG9wdGlvbnMpIHtcbiAgICAgICAgbGV0IHVybDtcbiAgICAgICAgbGV0IGNyZWRlbnRpYWw7XG4gICAgICAgIGxldCB0aWVyO1xuICAgICAgICBpZiAodHlwZW9mIHVybE9yQmxvYkNsaWVudCA9PT0gXCJzdHJpbmdcIiAmJlxuICAgICAgICAgICAgKChjb3JlVXRpbC5pc05vZGUgJiYgY3JlZGVudGlhbE9yVGllciBpbnN0YW5jZW9mIFN0b3JhZ2VTaGFyZWRLZXlDcmVkZW50aWFsKSB8fFxuICAgICAgICAgICAgICAgIGNyZWRlbnRpYWxPclRpZXIgaW5zdGFuY2VvZiBBbm9ueW1vdXNDcmVkZW50aWFsIHx8XG4gICAgICAgICAgICAgICAgY29yZUF1dGguaXNUb2tlbkNyZWRlbnRpYWwoY3JlZGVudGlhbE9yVGllcikpKSB7XG4gICAgICAgICAgICAvLyBGaXJzdCBvdmVybG9hZFxuICAgICAgICAgICAgdXJsID0gdXJsT3JCbG9iQ2xpZW50O1xuICAgICAgICAgICAgY3JlZGVudGlhbCA9IGNyZWRlbnRpYWxPclRpZXI7XG4gICAgICAgICAgICB0aWVyID0gdGllck9yT3B0aW9ucztcbiAgICAgICAgfVxuICAgICAgICBlbHNlIGlmICh1cmxPckJsb2JDbGllbnQgaW5zdGFuY2VvZiBCbG9iQ2xpZW50KSB7XG4gICAgICAgICAgICAvLyBTZWNvbmQgb3ZlcmxvYWRcbiAgICAgICAgICAgIHVybCA9IHVybE9yQmxvYkNsaWVudC51cmw7XG4gICAgICAgICAgICBjcmVkZW50aWFsID0gdXJsT3JCbG9iQ2xpZW50LmNyZWRlbnRpYWw7XG4gICAgICAgICAgICB0aWVyID0gY3JlZGVudGlhbE9yVGllcjtcbiAgICAgICAgICAgIG9wdGlvbnMgPSB0aWVyT3JPcHRpb25zO1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgdGhyb3cgbmV3IFJhbmdlRXJyb3IoXCJJbnZhbGlkIGFyZ3VtZW50cy4gRWl0aGVyIHVybCBhbmQgY3JlZGVudGlhbCwgb3IgQmxvYkNsaWVudCBuZWVkIGJlIHByb3ZpZGVkLlwiKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoIW9wdGlvbnMpIHtcbiAgICAgICAgICAgIG9wdGlvbnMgPSB7fTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gdHJhY2luZ0NsaWVudC53aXRoU3BhbihcIkJhdGNoU2V0VGllclJlcXVlc3QtYWRkU3ViUmVxdWVzdFwiLCBvcHRpb25zLCBhc3luYyAodXBkYXRlZE9wdGlvbnMpID0+IHtcbiAgICAgICAgICAgIHRoaXMuc2V0QmF0Y2hUeXBlKFwic2V0QWNjZXNzVGllclwiKTtcbiAgICAgICAgICAgIGF3YWl0IHRoaXMuYWRkU3ViUmVxdWVzdEludGVybmFsKHtcbiAgICAgICAgICAgICAgICB1cmw6IHVybCxcbiAgICAgICAgICAgICAgICBjcmVkZW50aWFsOiBjcmVkZW50aWFsLFxuICAgICAgICAgICAgfSwgYXN5bmMgKCkgPT4ge1xuICAgICAgICAgICAgICAgIGF3YWl0IG5ldyBCbG9iQ2xpZW50KHVybCwgdGhpcy5iYXRjaFJlcXVlc3QuY3JlYXRlUGlwZWxpbmUoY3JlZGVudGlhbCkpLnNldEFjY2Vzc1RpZXIodGllciwgdXBkYXRlZE9wdGlvbnMpO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgIH0pO1xuICAgIH1cbn1cbi8qKlxuICogSW5uZXIgYmF0Y2ggcmVxdWVzdCBjbGFzcyB3aGljaCBpcyByZXNwb25zaWJsZSBmb3IgYXNzZW1ibGluZyBhbmQgc2VyaWFsaXppbmcgc3ViIHJlcXVlc3RzLlxuICogU2VlIGh0dHBzOi8vZG9jcy5taWNyb3NvZnQuY29tL2VuLXVzL3Jlc3QvYXBpL3N0b3JhZ2VzZXJ2aWNlcy9ibG9iLWJhdGNoI3JlcXVlc3QtYm9keSBmb3IgaG93IHJlcXVlc3RzIGFyZSBhc3NlbWJsZWQuXG4gKi9cbmNsYXNzIElubmVyQmF0Y2hSZXF1ZXN0IHtcbiAgICBjb25zdHJ1Y3RvcigpIHtcbiAgICAgICAgdGhpcy5vcGVyYXRpb25Db3VudCA9IDA7XG4gICAgICAgIHRoaXMuYm9keSA9IFwiXCI7XG4gICAgICAgIGNvbnN0IHRlbXBHdWlkID0gY29yZVV0aWwucmFuZG9tVVVJRCgpO1xuICAgICAgICAvLyBiYXRjaF97YmF0Y2hpZH1cbiAgICAgICAgdGhpcy5ib3VuZGFyeSA9IGBiYXRjaF8ke3RlbXBHdWlkfWA7XG4gICAgICAgIC8vIC0tYmF0Y2hfe2JhdGNoaWR9XG4gICAgICAgIC8vIENvbnRlbnQtVHlwZTogYXBwbGljYXRpb24vaHR0cFxuICAgICAgICAvLyBDb250ZW50LVRyYW5zZmVyLUVuY29kaW5nOiBiaW5hcnlcbiAgICAgICAgdGhpcy5zdWJSZXF1ZXN0UHJlZml4ID0gYC0tJHt0aGlzLmJvdW5kYXJ5fSR7SFRUUF9MSU5FX0VORElOR30ke0hlYWRlckNvbnN0YW50cy5DT05URU5UX1RZUEV9OiBhcHBsaWNhdGlvbi9odHRwJHtIVFRQX0xJTkVfRU5ESU5HfSR7SGVhZGVyQ29uc3RhbnRzLkNPTlRFTlRfVFJBTlNGRVJfRU5DT0RJTkd9OiBiaW5hcnlgO1xuICAgICAgICAvLyBtdWx0aXBhcnQvbWl4ZWQ7IGJvdW5kYXJ5PWJhdGNoX3tiYXRjaGlkfVxuICAgICAgICB0aGlzLm11bHRpcGFydENvbnRlbnRUeXBlID0gYG11bHRpcGFydC9taXhlZDsgYm91bmRhcnk9JHt0aGlzLmJvdW5kYXJ5fWA7XG4gICAgICAgIC8vIC0tYmF0Y2hfe2JhdGNoaWR9LS1cbiAgICAgICAgdGhpcy5iYXRjaFJlcXVlc3RFbmRpbmcgPSBgLS0ke3RoaXMuYm91bmRhcnl9LS1gO1xuICAgICAgICB0aGlzLnN1YlJlcXVlc3RzID0gbmV3IE1hcCgpO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBDcmVhdGUgcGlwZWxpbmUgdG8gYXNzZW1ibGUgc3ViIHJlcXVlc3RzLiBUaGUgaWRlYSBoZXJlIGlzIHRvIHVzZSBleGlzdGluZ1xuICAgICAqIGNyZWRlbnRpYWwgYW5kIHNlcmlhbGl6YXRpb24vZGVzZXJpYWxpemF0aW9uIGNvbXBvbmVudHMsIHdpdGggYWRkaXRpb25hbCBwb2xpY2llcyB0b1xuICAgICAqIGZpbHRlciB1bm5lY2Vzc2FyeSBoZWFkZXJzLCBhc3NlbWJsZSBzdWIgcmVxdWVzdHMgaW50byByZXF1ZXN0J3MgYm9keVxuICAgICAqIGFuZCBpbnRlcmNlcHQgcmVxdWVzdCBmcm9tIGdvaW5nIHRvIHdpcmUuXG4gICAgICogQHBhcmFtIGNyZWRlbnRpYWwgLSAgU3VjaCBhcyBBbm9ueW1vdXNDcmVkZW50aWFsLCBTdG9yYWdlU2hhcmVkS2V5Q3JlZGVudGlhbCBvciBhbnkgY3JlZGVudGlhbCBmcm9tIHRoZSBgQGF6dXJlL2lkZW50aXR5YCBwYWNrYWdlIHRvIGF1dGhlbnRpY2F0ZSByZXF1ZXN0cyB0byB0aGUgc2VydmljZS4gWW91IGNhbiBhbHNvIHByb3ZpZGUgYW4gb2JqZWN0IHRoYXQgaW1wbGVtZW50cyB0aGUgVG9rZW5DcmVkZW50aWFsIGludGVyZmFjZS4gSWYgbm90IHNwZWNpZmllZCwgQW5vbnltb3VzQ3JlZGVudGlhbCBpcyB1c2VkLlxuICAgICAqL1xuICAgIGNyZWF0ZVBpcGVsaW5lKGNyZWRlbnRpYWwpIHtcbiAgICAgICAgY29uc3QgY29yZVBpcGVsaW5lID0gY29yZVJlc3RQaXBlbGluZS5jcmVhdGVFbXB0eVBpcGVsaW5lKCk7XG4gICAgICAgIGNvcmVQaXBlbGluZS5hZGRQb2xpY3koY29yZUNsaWVudC5zZXJpYWxpemF0aW9uUG9saWN5KHtcbiAgICAgICAgICAgIHN0cmluZ2lmeVhNTDogY29yZVhtbC5zdHJpbmdpZnlYTUwsXG4gICAgICAgICAgICBzZXJpYWxpemVyT3B0aW9uczoge1xuICAgICAgICAgICAgICAgIHhtbDoge1xuICAgICAgICAgICAgICAgICAgICB4bWxDaGFyS2V5OiBcIiNcIixcbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgfSxcbiAgICAgICAgfSksIHsgcGhhc2U6IFwiU2VyaWFsaXplXCIgfSk7XG4gICAgICAgIC8vIFVzZSBiYXRjaCBoZWFkZXIgZmlsdGVyIHBvbGljeSB0byBleGNsdWRlIHVubmVjZXNzYXJ5IGhlYWRlcnNcbiAgICAgICAgY29yZVBpcGVsaW5lLmFkZFBvbGljeShiYXRjaEhlYWRlckZpbHRlclBvbGljeSgpKTtcbiAgICAgICAgLy8gVXNlIGJhdGNoIGFzc2VtYmxlIHBvbGljeSB0byBhc3NlbWJsZSByZXF1ZXN0IGFuZCBpbnRlcmNlcHQgcmVxdWVzdCBmcm9tIGdvaW5nIHRvIHdpcmVcbiAgICAgICAgY29yZVBpcGVsaW5lLmFkZFBvbGljeShiYXRjaFJlcXVlc3RBc3NlbWJsZVBvbGljeSh0aGlzKSwgeyBhZnRlclBoYXNlOiBcIlNpZ25cIiB9KTtcbiAgICAgICAgaWYgKGNvcmVBdXRoLmlzVG9rZW5DcmVkZW50aWFsKGNyZWRlbnRpYWwpKSB7XG4gICAgICAgICAgICBjb3JlUGlwZWxpbmUuYWRkUG9saWN5KGNvcmVSZXN0UGlwZWxpbmUuYmVhcmVyVG9rZW5BdXRoZW50aWNhdGlvblBvbGljeSh7XG4gICAgICAgICAgICAgICAgY3JlZGVudGlhbCxcbiAgICAgICAgICAgICAgICBzY29wZXM6IFN0b3JhZ2VPQXV0aFNjb3BlcyxcbiAgICAgICAgICAgICAgICBjaGFsbGVuZ2VDYWxsYmFja3M6IHsgYXV0aG9yaXplUmVxdWVzdE9uQ2hhbGxlbmdlOiBjb3JlQ2xpZW50LmF1dGhvcml6ZVJlcXVlc3RPblRlbmFudENoYWxsZW5nZSB9LFxuICAgICAgICAgICAgfSksIHsgcGhhc2U6IFwiU2lnblwiIH0pO1xuICAgICAgICB9XG4gICAgICAgIGVsc2UgaWYgKGNyZWRlbnRpYWwgaW5zdGFuY2VvZiBTdG9yYWdlU2hhcmVkS2V5Q3JlZGVudGlhbCkge1xuICAgICAgICAgICAgY29yZVBpcGVsaW5lLmFkZFBvbGljeShzdG9yYWdlU2hhcmVkS2V5Q3JlZGVudGlhbFBvbGljeSh7XG4gICAgICAgICAgICAgICAgYWNjb3VudE5hbWU6IGNyZWRlbnRpYWwuYWNjb3VudE5hbWUsXG4gICAgICAgICAgICAgICAgYWNjb3VudEtleTogY3JlZGVudGlhbC5hY2NvdW50S2V5LFxuICAgICAgICAgICAgfSksIHsgcGhhc2U6IFwiU2lnblwiIH0pO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IHBpcGVsaW5lID0gbmV3IFBpcGVsaW5lKFtdKTtcbiAgICAgICAgLy8gYXR0YWNoIHRoZSB2MiBwaXBlbGluZSB0byB0aGlzIG9uZVxuICAgICAgICBwaXBlbGluZS5fY3JlZGVudGlhbCA9IGNyZWRlbnRpYWw7XG4gICAgICAgIHBpcGVsaW5lLl9jb3JlUGlwZWxpbmUgPSBjb3JlUGlwZWxpbmU7XG4gICAgICAgIHJldHVybiBwaXBlbGluZTtcbiAgICB9XG4gICAgYXBwZW5kU3ViUmVxdWVzdFRvQm9keShyZXF1ZXN0KSB7XG4gICAgICAgIC8vIFN0YXJ0IHRvIGFzc2VtYmxlIHN1YiByZXF1ZXN0XG4gICAgICAgIHRoaXMuYm9keSArPSBbXG4gICAgICAgICAgICB0aGlzLnN1YlJlcXVlc3RQcmVmaXgsIC8vIHN1YiByZXF1ZXN0IGNvbnN0YW50IHByZWZpeFxuICAgICAgICAgICAgYCR7SGVhZGVyQ29uc3RhbnRzLkNPTlRFTlRfSUR9OiAke3RoaXMub3BlcmF0aW9uQ291bnR9YCwgLy8gc3ViIHJlcXVlc3QncyBjb250ZW50IElEXG4gICAgICAgICAgICBcIlwiLCAvLyBlbXB0eSBsaW5lIGFmdGVyIHN1YiByZXF1ZXN0J3MgY29udGVudCBJRFxuICAgICAgICAgICAgYCR7cmVxdWVzdC5tZXRob2QudG9TdHJpbmcoKX0gJHtnZXRVUkxQYXRoQW5kUXVlcnkocmVxdWVzdC51cmwpfSAke0hUVFBfVkVSU0lPTl8xXzF9JHtIVFRQX0xJTkVfRU5ESU5HfWAsIC8vIHN1YiByZXF1ZXN0IHN0YXJ0IGxpbmUgd2l0aCBtZXRob2RcbiAgICAgICAgXS5qb2luKEhUVFBfTElORV9FTkRJTkcpO1xuICAgICAgICBmb3IgKGNvbnN0IFtuYW1lLCB2YWx1ZV0gb2YgcmVxdWVzdC5oZWFkZXJzKSB7XG4gICAgICAgICAgICB0aGlzLmJvZHkgKz0gYCR7bmFtZX06ICR7dmFsdWV9JHtIVFRQX0xJTkVfRU5ESU5HfWA7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5ib2R5ICs9IEhUVFBfTElORV9FTkRJTkc7IC8vIHN1YiByZXF1ZXN0J3MgaGVhZGVycyBuZWVkIGJlIGVuZGluZyB3aXRoIGFuIGVtcHR5IGxpbmVcbiAgICAgICAgLy8gTm8gYm9keSB0byBhc3NlbWJsZSBmb3IgY3VycmVudCBiYXRjaCByZXF1ZXN0IHN1cHBvcnRcbiAgICAgICAgLy8gRW5kIHRvIGFzc2VtYmxlIHN1YiByZXF1ZXN0XG4gICAgfVxuICAgIHByZUFkZFN1YlJlcXVlc3Qoc3ViUmVxdWVzdCkge1xuICAgICAgICBpZiAodGhpcy5vcGVyYXRpb25Db3VudCA+PSBCQVRDSF9NQVhfUkVRVUVTVCkge1xuICAgICAgICAgICAgdGhyb3cgbmV3IFJhbmdlRXJyb3IoYENhbm5vdCBleGNlZWQgJHtCQVRDSF9NQVhfUkVRVUVTVH0gc3ViIHJlcXVlc3RzIGluIGEgc2luZ2xlIGJhdGNoYCk7XG4gICAgICAgIH1cbiAgICAgICAgLy8gRmFzdCBmYWlsIGlmIHVybCBmb3Igc3ViIHJlcXVlc3QgaXMgaW52YWxpZFxuICAgICAgICBjb25zdCBwYXRoID0gZ2V0VVJMUGF0aChzdWJSZXF1ZXN0LnVybCk7XG4gICAgICAgIGlmICghcGF0aCB8fCBwYXRoID09PSBcIlwiKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgUmFuZ2VFcnJvcihgSW52YWxpZCB1cmwgZm9yIHN1YiByZXF1ZXN0OiAnJHtzdWJSZXF1ZXN0LnVybH0nYCk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgcG9zdEFkZFN1YlJlcXVlc3Qoc3ViUmVxdWVzdCkge1xuICAgICAgICB0aGlzLnN1YlJlcXVlc3RzLnNldCh0aGlzLm9wZXJhdGlvbkNvdW50LCBzdWJSZXF1ZXN0KTtcbiAgICAgICAgdGhpcy5vcGVyYXRpb25Db3VudCsrO1xuICAgIH1cbiAgICAvLyBSZXR1cm4gdGhlIGh0dHAgcmVxdWVzdCBib2R5IHdpdGggYXNzZW1ibGluZyB0aGUgZW5kaW5nIGxpbmUgdG8gdGhlIHN1YiByZXF1ZXN0IGJvZHkuXG4gICAgZ2V0SHR0cFJlcXVlc3RCb2R5KCkge1xuICAgICAgICByZXR1cm4gYCR7dGhpcy5ib2R5fSR7dGhpcy5iYXRjaFJlcXVlc3RFbmRpbmd9JHtIVFRQX0xJTkVfRU5ESU5HfWA7XG4gICAgfVxuICAgIGdldE11bHRpcGFydENvbnRlbnRUeXBlKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5tdWx0aXBhcnRDb250ZW50VHlwZTtcbiAgICB9XG4gICAgZ2V0U3ViUmVxdWVzdHMoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLnN1YlJlcXVlc3RzO1xuICAgIH1cbn1cbmZ1bmN0aW9uIGJhdGNoUmVxdWVzdEFzc2VtYmxlUG9saWN5KGJhdGNoUmVxdWVzdCkge1xuICAgIHJldHVybiB7XG4gICAgICAgIG5hbWU6IFwiYmF0Y2hSZXF1ZXN0QXNzZW1ibGVQb2xpY3lcIixcbiAgICAgICAgYXN5bmMgc2VuZFJlcXVlc3QocmVxdWVzdCkge1xuICAgICAgICAgICAgYmF0Y2hSZXF1ZXN0LmFwcGVuZFN1YlJlcXVlc3RUb0JvZHkocmVxdWVzdCk7XG4gICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICAgIHJlcXVlc3QsXG4gICAgICAgICAgICAgICAgc3RhdHVzOiAyMDAsXG4gICAgICAgICAgICAgICAgaGVhZGVyczogY29yZVJlc3RQaXBlbGluZS5jcmVhdGVIdHRwSGVhZGVycygpLFxuICAgICAgICAgICAgfTtcbiAgICAgICAgfSxcbiAgICB9O1xufVxuZnVuY3Rpb24gYmF0Y2hIZWFkZXJGaWx0ZXJQb2xpY3koKSB7XG4gICAgcmV0dXJuIHtcbiAgICAgICAgbmFtZTogXCJiYXRjaEhlYWRlckZpbHRlclBvbGljeVwiLFxuICAgICAgICBhc3luYyBzZW5kUmVxdWVzdChyZXF1ZXN0LCBuZXh0KSB7XG4gICAgICAgICAgICBsZXQgeE1zSGVhZGVyTmFtZSA9IFwiXCI7XG4gICAgICAgICAgICBmb3IgKGNvbnN0IFtuYW1lXSBvZiByZXF1ZXN0LmhlYWRlcnMpIHtcbiAgICAgICAgICAgICAgICBpZiAoaUVxdWFsKG5hbWUsIEhlYWRlckNvbnN0YW50cy5YX01TX1ZFUlNJT04pKSB7XG4gICAgICAgICAgICAgICAgICAgIHhNc0hlYWRlck5hbWUgPSBuYW1lO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmICh4TXNIZWFkZXJOYW1lICE9PSBcIlwiKSB7XG4gICAgICAgICAgICAgICAgcmVxdWVzdC5oZWFkZXJzLmRlbGV0ZSh4TXNIZWFkZXJOYW1lKTsgLy8gVGhlIHN1YnJlcXVlc3RzIHNob3VsZCBub3QgaGF2ZSB0aGUgeC1tcy12ZXJzaW9uIGhlYWRlci5cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiBuZXh0KHJlcXVlc3QpO1xuICAgICAgICB9LFxuICAgIH07XG59XG5cbi8vIENvcHlyaWdodCAoYykgTWljcm9zb2Z0IENvcnBvcmF0aW9uLlxuLy8gTGljZW5zZWQgdW5kZXIgdGhlIE1JVCBMaWNlbnNlLlxuLyoqXG4gKiBBIEJsb2JCYXRjaENsaWVudCBhbGxvd3MgeW91IHRvIG1ha2UgYmF0Y2hlZCByZXF1ZXN0cyB0byB0aGUgQXp1cmUgU3RvcmFnZSBCbG9iIHNlcnZpY2UuXG4gKlxuICogQHNlZSBodHRwczovL2RvY3MubWljcm9zb2Z0LmNvbS9lbi11cy9yZXN0L2FwaS9zdG9yYWdlc2VydmljZXMvYmxvYi1iYXRjaFxuICovXG5jbGFzcyBCbG9iQmF0Y2hDbGllbnQge1xuICAgIGNvbnN0cnVjdG9yKHVybCwgY3JlZGVudGlhbE9yUGlwZWxpbmUsIFxuICAgIC8vIExlZ2FjeSwgbm8gZml4IGZvciBlc2xpbnQgZXJyb3Igd2l0aG91dCBicmVha2luZy4gRGlzYWJsZSBpdCBmb3IgdGhpcyBpbnRlcmZhY2UuXG4gICAgLyogZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEBhenVyZS9henVyZS1zZGsvdHMtbmFtaW5nLW9wdGlvbnMqL1xuICAgIG9wdGlvbnMpIHtcbiAgICAgICAgbGV0IHBpcGVsaW5lO1xuICAgICAgICBpZiAoaXNQaXBlbGluZUxpa2UoY3JlZGVudGlhbE9yUGlwZWxpbmUpKSB7XG4gICAgICAgICAgICBwaXBlbGluZSA9IGNyZWRlbnRpYWxPclBpcGVsaW5lO1xuICAgICAgICB9XG4gICAgICAgIGVsc2UgaWYgKCFjcmVkZW50aWFsT3JQaXBlbGluZSkge1xuICAgICAgICAgICAgLy8gbm8gY3JlZGVudGlhbCBwcm92aWRlZFxuICAgICAgICAgICAgcGlwZWxpbmUgPSBuZXdQaXBlbGluZShuZXcgQW5vbnltb3VzQ3JlZGVudGlhbCgpLCBvcHRpb25zKTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIHBpcGVsaW5lID0gbmV3UGlwZWxpbmUoY3JlZGVudGlhbE9yUGlwZWxpbmUsIG9wdGlvbnMpO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IHN0b3JhZ2VDbGllbnRDb250ZXh0ID0gbmV3IFN0b3JhZ2VDb250ZXh0Q2xpZW50KHVybCwgZ2V0Q29yZUNsaWVudE9wdGlvbnMocGlwZWxpbmUpKTtcbiAgICAgICAgY29uc3QgcGF0aCA9IGdldFVSTFBhdGgodXJsKTtcbiAgICAgICAgaWYgKHBhdGggJiYgcGF0aCAhPT0gXCIvXCIpIHtcbiAgICAgICAgICAgIC8vIENvbnRhaW5lciBzY29wZWQuXG4gICAgICAgICAgICB0aGlzLnNlcnZpY2VPckNvbnRhaW5lckNvbnRleHQgPSBzdG9yYWdlQ2xpZW50Q29udGV4dC5jb250YWluZXI7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICB0aGlzLnNlcnZpY2VPckNvbnRhaW5lckNvbnRleHQgPSBzdG9yYWdlQ2xpZW50Q29udGV4dC5zZXJ2aWNlO1xuICAgICAgICB9XG4gICAgfVxuICAgIC8qKlxuICAgICAqIENyZWF0ZXMgYSB7QGxpbmsgQmxvYkJhdGNofS5cbiAgICAgKiBBIEJsb2JCYXRjaCByZXByZXNlbnRzIGFuIGFnZ3JlZ2F0ZWQgc2V0IG9mIG9wZXJhdGlvbnMgb24gYmxvYnMuXG4gICAgICovXG4gICAgY3JlYXRlQmF0Y2goKSB7XG4gICAgICAgIHJldHVybiBuZXcgQmxvYkJhdGNoKCk7XG4gICAgfVxuICAgIGFzeW5jIGRlbGV0ZUJsb2JzKHVybHNPckJsb2JDbGllbnRzLCBjcmVkZW50aWFsT3JPcHRpb25zLCBcbiAgICAvLyBMZWdhY3ksIG5vIGZpeCBmb3IgZXNsaW50IGVycm9yIHdpdGhvdXQgYnJlYWtpbmcuIERpc2FibGUgaXQgZm9yIHRoaXMgaW50ZXJmYWNlLlxuICAgIC8qIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAYXp1cmUvYXp1cmUtc2RrL3RzLW5hbWluZy1vcHRpb25zKi9cbiAgICBvcHRpb25zKSB7XG4gICAgICAgIGNvbnN0IGJhdGNoID0gbmV3IEJsb2JCYXRjaCgpO1xuICAgICAgICBmb3IgKGNvbnN0IHVybE9yQmxvYkNsaWVudCBvZiB1cmxzT3JCbG9iQ2xpZW50cykge1xuICAgICAgICAgICAgaWYgKHR5cGVvZiB1cmxPckJsb2JDbGllbnQgPT09IFwic3RyaW5nXCIpIHtcbiAgICAgICAgICAgICAgICBhd2FpdCBiYXRjaC5kZWxldGVCbG9iKHVybE9yQmxvYkNsaWVudCwgY3JlZGVudGlhbE9yT3B0aW9ucywgb3B0aW9ucyk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICBhd2FpdCBiYXRjaC5kZWxldGVCbG9iKHVybE9yQmxvYkNsaWVudCwgY3JlZGVudGlhbE9yT3B0aW9ucyk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHRoaXMuc3VibWl0QmF0Y2goYmF0Y2gpO1xuICAgIH1cbiAgICBhc3luYyBzZXRCbG9ic0FjY2Vzc1RpZXIodXJsc09yQmxvYkNsaWVudHMsIGNyZWRlbnRpYWxPclRpZXIsIHRpZXJPck9wdGlvbnMsIFxuICAgIC8vIExlZ2FjeSwgbm8gZml4IGZvciBlc2xpbnQgZXJyb3Igd2l0aG91dCBicmVha2luZy4gRGlzYWJsZSBpdCBmb3IgdGhpcyBpbnRlcmZhY2UuXG4gICAgLyogZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEBhenVyZS9henVyZS1zZGsvdHMtbmFtaW5nLW9wdGlvbnMqL1xuICAgIG9wdGlvbnMpIHtcbiAgICAgICAgY29uc3QgYmF0Y2ggPSBuZXcgQmxvYkJhdGNoKCk7XG4gICAgICAgIGZvciAoY29uc3QgdXJsT3JCbG9iQ2xpZW50IG9mIHVybHNPckJsb2JDbGllbnRzKSB7XG4gICAgICAgICAgICBpZiAodHlwZW9mIHVybE9yQmxvYkNsaWVudCA9PT0gXCJzdHJpbmdcIikge1xuICAgICAgICAgICAgICAgIGF3YWl0IGJhdGNoLnNldEJsb2JBY2Nlc3NUaWVyKHVybE9yQmxvYkNsaWVudCwgY3JlZGVudGlhbE9yVGllciwgdGllck9yT3B0aW9ucywgb3B0aW9ucyk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICBhd2FpdCBiYXRjaC5zZXRCbG9iQWNjZXNzVGllcih1cmxPckJsb2JDbGllbnQsIGNyZWRlbnRpYWxPclRpZXIsIHRpZXJPck9wdGlvbnMpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiB0aGlzLnN1Ym1pdEJhdGNoKGJhdGNoKTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogU3VibWl0IGJhdGNoIHJlcXVlc3Qgd2hpY2ggY29uc2lzdHMgb2YgbXVsdGlwbGUgc3VicmVxdWVzdHMuXG4gICAgICpcbiAgICAgKiBHZXQgYGJsb2JCYXRjaENsaWVudGAgYW5kIG90aGVyIGRldGFpbHMgYmVmb3JlIHJ1bm5pbmcgdGhlIHNuaXBwZXRzLlxuICAgICAqIGBibG9iU2VydmljZUNsaWVudC5nZXRCbG9iQmF0Y2hDbGllbnQoKWAgZ2l2ZXMgdGhlIGBibG9iQmF0Y2hDbGllbnRgXG4gICAgICpcbiAgICAgKiBFeGFtcGxlIHVzYWdlOlxuICAgICAqXG4gICAgICogYGBganNcbiAgICAgKiBsZXQgYmF0Y2hSZXF1ZXN0ID0gbmV3IEJsb2JCYXRjaCgpO1xuICAgICAqIGF3YWl0IGJhdGNoUmVxdWVzdC5kZWxldGVCbG9iKHVybEluU3RyaW5nMCwgY3JlZGVudGlhbDApO1xuICAgICAqIGF3YWl0IGJhdGNoUmVxdWVzdC5kZWxldGVCbG9iKHVybEluU3RyaW5nMSwgY3JlZGVudGlhbDEsIHtcbiAgICAgKiAgZGVsZXRlU25hcHNob3RzOiBcImluY2x1ZGVcIlxuICAgICAqIH0pO1xuICAgICAqIGNvbnN0IGJhdGNoUmVzcCA9IGF3YWl0IGJsb2JCYXRjaENsaWVudC5zdWJtaXRCYXRjaChiYXRjaFJlcXVlc3QpO1xuICAgICAqIGNvbnNvbGUubG9nKGJhdGNoUmVzcC5zdWJSZXNwb25zZXNTdWNjZWVkZWRDb3VudCk7XG4gICAgICogYGBgXG4gICAgICpcbiAgICAgKiBFeGFtcGxlIHVzaW5nIGEgbGVhc2U6XG4gICAgICpcbiAgICAgKiBgYGBqc1xuICAgICAqIGxldCBiYXRjaFJlcXVlc3QgPSBuZXcgQmxvYkJhdGNoKCk7XG4gICAgICogYXdhaXQgYmF0Y2hSZXF1ZXN0LnNldEJsb2JBY2Nlc3NUaWVyKGJsb2NrQmxvYkNsaWVudDAsIFwiQ29vbFwiKTtcbiAgICAgKiBhd2FpdCBiYXRjaFJlcXVlc3Quc2V0QmxvYkFjY2Vzc1RpZXIoYmxvY2tCbG9iQ2xpZW50MSwgXCJDb29sXCIsIHtcbiAgICAgKiAgY29uZGl0aW9uczogeyBsZWFzZUlkOiBsZWFzZUlkIH1cbiAgICAgKiB9KTtcbiAgICAgKiBjb25zdCBiYXRjaFJlc3AgPSBhd2FpdCBibG9iQmF0Y2hDbGllbnQuc3VibWl0QmF0Y2goYmF0Y2hSZXF1ZXN0KTtcbiAgICAgKiBjb25zb2xlLmxvZyhiYXRjaFJlc3Auc3ViUmVzcG9uc2VzU3VjY2VlZGVkQ291bnQpO1xuICAgICAqIGBgYFxuICAgICAqXG4gICAgICogQHNlZSBodHRwczovL2RvY3MubWljcm9zb2Z0LmNvbS9lbi11cy9yZXN0L2FwaS9zdG9yYWdlc2VydmljZXMvYmxvYi1iYXRjaFxuICAgICAqXG4gICAgICogQHBhcmFtIGJhdGNoUmVxdWVzdCAtIEEgc2V0IG9mIERlbGV0ZSBvciBTZXRUaWVyIG9wZXJhdGlvbnMuXG4gICAgICogQHBhcmFtIG9wdGlvbnMgLVxuICAgICAqL1xuICAgIGFzeW5jIHN1Ym1pdEJhdGNoKGJhdGNoUmVxdWVzdCwgb3B0aW9ucyA9IHt9KSB7XG4gICAgICAgIGlmICghYmF0Y2hSZXF1ZXN0IHx8IGJhdGNoUmVxdWVzdC5nZXRTdWJSZXF1ZXN0cygpLnNpemUgPT09IDApIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBSYW5nZUVycm9yKFwiQmF0Y2ggcmVxdWVzdCBzaG91bGQgY29udGFpbiBvbmUgb3IgbW9yZSBzdWIgcmVxdWVzdHMuXCIpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB0cmFjaW5nQ2xpZW50LndpdGhTcGFuKFwiQmxvYkJhdGNoQ2xpZW50LXN1Ym1pdEJhdGNoXCIsIG9wdGlvbnMsIGFzeW5jICh1cGRhdGVkT3B0aW9ucykgPT4ge1xuICAgICAgICAgICAgY29uc3QgYmF0Y2hSZXF1ZXN0Qm9keSA9IGJhdGNoUmVxdWVzdC5nZXRIdHRwUmVxdWVzdEJvZHkoKTtcbiAgICAgICAgICAgIC8vIFNlcnZpY2VTdWJtaXRCYXRjaFJlc3BvbnNlTW9kZWwgYW5kIENvbnRhaW5lclN1Ym1pdEJhdGNoUmVzcG9uc2UgYXJlIGNvbXBhdGlibGUgZm9yIG5vdy5cbiAgICAgICAgICAgIGNvbnN0IHJhd0JhdGNoUmVzcG9uc2UgPSBhc3NlcnRSZXNwb25zZShhd2FpdCB0aGlzLnNlcnZpY2VPckNvbnRhaW5lckNvbnRleHQuc3VibWl0QmF0Y2godXRmOEJ5dGVMZW5ndGgoYmF0Y2hSZXF1ZXN0Qm9keSksIGJhdGNoUmVxdWVzdC5nZXRNdWx0aVBhcnRDb250ZW50VHlwZSgpLCBiYXRjaFJlcXVlc3RCb2R5LCBPYmplY3QuYXNzaWduKHt9LCB1cGRhdGVkT3B0aW9ucykpKTtcbiAgICAgICAgICAgIC8vIFBhcnNlIHRoZSBzdWIgcmVzcG9uc2VzIHJlc3VsdCwgaWYgbG9naWMgcmVhY2hlcyBoZXJlKGkuZS4gdGhlIGJhdGNoIHJlcXVlc3Qgc3VjY2VlZGVkIHdpdGggc3RhdHVzIGNvZGUgMjAyKS5cbiAgICAgICAgICAgIGNvbnN0IGJhdGNoUmVzcG9uc2VQYXJzZXIgPSBuZXcgQmF0Y2hSZXNwb25zZVBhcnNlcihyYXdCYXRjaFJlc3BvbnNlLCBiYXRjaFJlcXVlc3QuZ2V0U3ViUmVxdWVzdHMoKSk7XG4gICAgICAgICAgICBjb25zdCByZXNwb25zZVN1bW1hcnkgPSBhd2FpdCBiYXRjaFJlc3BvbnNlUGFyc2VyLnBhcnNlQmF0Y2hSZXNwb25zZSgpO1xuICAgICAgICAgICAgY29uc3QgcmVzID0ge1xuICAgICAgICAgICAgICAgIF9yZXNwb25zZTogcmF3QmF0Y2hSZXNwb25zZS5fcmVzcG9uc2UsXG4gICAgICAgICAgICAgICAgY29udGVudFR5cGU6IHJhd0JhdGNoUmVzcG9uc2UuY29udGVudFR5cGUsXG4gICAgICAgICAgICAgICAgZXJyb3JDb2RlOiByYXdCYXRjaFJlc3BvbnNlLmVycm9yQ29kZSxcbiAgICAgICAgICAgICAgICByZXF1ZXN0SWQ6IHJhd0JhdGNoUmVzcG9uc2UucmVxdWVzdElkLFxuICAgICAgICAgICAgICAgIGNsaWVudFJlcXVlc3RJZDogcmF3QmF0Y2hSZXNwb25zZS5jbGllbnRSZXF1ZXN0SWQsXG4gICAgICAgICAgICAgICAgdmVyc2lvbjogcmF3QmF0Y2hSZXNwb25zZS52ZXJzaW9uLFxuICAgICAgICAgICAgICAgIHN1YlJlc3BvbnNlczogcmVzcG9uc2VTdW1tYXJ5LnN1YlJlc3BvbnNlcyxcbiAgICAgICAgICAgICAgICBzdWJSZXNwb25zZXNTdWNjZWVkZWRDb3VudDogcmVzcG9uc2VTdW1tYXJ5LnN1YlJlc3BvbnNlc1N1Y2NlZWRlZENvdW50LFxuICAgICAgICAgICAgICAgIHN1YlJlc3BvbnNlc0ZhaWxlZENvdW50OiByZXNwb25zZVN1bW1hcnkuc3ViUmVzcG9uc2VzRmFpbGVkQ291bnQsXG4gICAgICAgICAgICB9O1xuICAgICAgICAgICAgcmV0dXJuIHJlcztcbiAgICAgICAgfSk7XG4gICAgfVxufVxuXG4vKipcbiAqIEEgQ29udGFpbmVyQ2xpZW50IHJlcHJlc2VudHMgYSBVUkwgdG8gdGhlIEF6dXJlIFN0b3JhZ2UgY29udGFpbmVyIGFsbG93aW5nIHlvdSB0byBtYW5pcHVsYXRlIGl0cyBibG9icy5cbiAqL1xuY2xhc3MgQ29udGFpbmVyQ2xpZW50IGV4dGVuZHMgU3RvcmFnZUNsaWVudCB7XG4gICAgLyoqXG4gICAgICogVGhlIG5hbWUgb2YgdGhlIGNvbnRhaW5lci5cbiAgICAgKi9cbiAgICBnZXQgY29udGFpbmVyTmFtZSgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX2NvbnRhaW5lck5hbWU7XG4gICAgfVxuICAgIGNvbnN0cnVjdG9yKHVybE9yQ29ubmVjdGlvblN0cmluZywgY3JlZGVudGlhbE9yUGlwZWxpbmVPckNvbnRhaW5lck5hbWUsIFxuICAgIC8vIExlZ2FjeSwgbm8gZml4IGZvciBlc2xpbnQgZXJyb3Igd2l0aG91dCBicmVha2luZy4gRGlzYWJsZSBpdCBmb3IgdGhpcyBpbnRlcmZhY2UuXG4gICAgLyogZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEBhenVyZS9henVyZS1zZGsvdHMtbmFtaW5nLW9wdGlvbnMqL1xuICAgIG9wdGlvbnMpIHtcbiAgICAgICAgbGV0IHBpcGVsaW5lO1xuICAgICAgICBsZXQgdXJsO1xuICAgICAgICBvcHRpb25zID0gb3B0aW9ucyB8fCB7fTtcbiAgICAgICAgaWYgKGlzUGlwZWxpbmVMaWtlKGNyZWRlbnRpYWxPclBpcGVsaW5lT3JDb250YWluZXJOYW1lKSkge1xuICAgICAgICAgICAgLy8gKHVybDogc3RyaW5nLCBwaXBlbGluZTogUGlwZWxpbmUpXG4gICAgICAgICAgICB1cmwgPSB1cmxPckNvbm5lY3Rpb25TdHJpbmc7XG4gICAgICAgICAgICBwaXBlbGluZSA9IGNyZWRlbnRpYWxPclBpcGVsaW5lT3JDb250YWluZXJOYW1lO1xuICAgICAgICB9XG4gICAgICAgIGVsc2UgaWYgKChjb3JlVXRpbC5pc05vZGUgJiYgY3JlZGVudGlhbE9yUGlwZWxpbmVPckNvbnRhaW5lck5hbWUgaW5zdGFuY2VvZiBTdG9yYWdlU2hhcmVkS2V5Q3JlZGVudGlhbCkgfHxcbiAgICAgICAgICAgIGNyZWRlbnRpYWxPclBpcGVsaW5lT3JDb250YWluZXJOYW1lIGluc3RhbmNlb2YgQW5vbnltb3VzQ3JlZGVudGlhbCB8fFxuICAgICAgICAgICAgY29yZUF1dGguaXNUb2tlbkNyZWRlbnRpYWwoY3JlZGVudGlhbE9yUGlwZWxpbmVPckNvbnRhaW5lck5hbWUpKSB7XG4gICAgICAgICAgICAvLyAodXJsOiBzdHJpbmcsIGNyZWRlbnRpYWw/OiBTdG9yYWdlU2hhcmVkS2V5Q3JlZGVudGlhbCB8IEFub255bW91c0NyZWRlbnRpYWwgfCBUb2tlbkNyZWRlbnRpYWwsIG9wdGlvbnM/OiBTdG9yYWdlUGlwZWxpbmVPcHRpb25zKVxuICAgICAgICAgICAgdXJsID0gdXJsT3JDb25uZWN0aW9uU3RyaW5nO1xuICAgICAgICAgICAgcGlwZWxpbmUgPSBuZXdQaXBlbGluZShjcmVkZW50aWFsT3JQaXBlbGluZU9yQ29udGFpbmVyTmFtZSwgb3B0aW9ucyk7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSBpZiAoIWNyZWRlbnRpYWxPclBpcGVsaW5lT3JDb250YWluZXJOYW1lICYmXG4gICAgICAgICAgICB0eXBlb2YgY3JlZGVudGlhbE9yUGlwZWxpbmVPckNvbnRhaW5lck5hbWUgIT09IFwic3RyaW5nXCIpIHtcbiAgICAgICAgICAgIC8vICh1cmw6IHN0cmluZywgY3JlZGVudGlhbD86IFN0b3JhZ2VTaGFyZWRLZXlDcmVkZW50aWFsIHwgQW5vbnltb3VzQ3JlZGVudGlhbCB8IFRva2VuQ3JlZGVudGlhbCwgb3B0aW9ucz86IFN0b3JhZ2VQaXBlbGluZU9wdGlvbnMpXG4gICAgICAgICAgICAvLyBUaGUgc2Vjb25kIHBhcmFtZXRlciBpcyB1bmRlZmluZWQuIFVzZSBhbm9ueW1vdXMgY3JlZGVudGlhbC5cbiAgICAgICAgICAgIHVybCA9IHVybE9yQ29ubmVjdGlvblN0cmluZztcbiAgICAgICAgICAgIHBpcGVsaW5lID0gbmV3UGlwZWxpbmUobmV3IEFub255bW91c0NyZWRlbnRpYWwoKSwgb3B0aW9ucyk7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSBpZiAoY3JlZGVudGlhbE9yUGlwZWxpbmVPckNvbnRhaW5lck5hbWUgJiZcbiAgICAgICAgICAgIHR5cGVvZiBjcmVkZW50aWFsT3JQaXBlbGluZU9yQ29udGFpbmVyTmFtZSA9PT0gXCJzdHJpbmdcIikge1xuICAgICAgICAgICAgLy8gKGNvbm5lY3Rpb25TdHJpbmc6IHN0cmluZywgY29udGFpbmVyTmFtZTogc3RyaW5nLCBibG9iTmFtZTogc3RyaW5nLCBvcHRpb25zPzogU3RvcmFnZVBpcGVsaW5lT3B0aW9ucylcbiAgICAgICAgICAgIGNvbnN0IGNvbnRhaW5lck5hbWUgPSBjcmVkZW50aWFsT3JQaXBlbGluZU9yQ29udGFpbmVyTmFtZTtcbiAgICAgICAgICAgIGNvbnN0IGV4dHJhY3RlZENyZWRzID0gZXh0cmFjdENvbm5lY3Rpb25TdHJpbmdQYXJ0cyh1cmxPckNvbm5lY3Rpb25TdHJpbmcpO1xuICAgICAgICAgICAgaWYgKGV4dHJhY3RlZENyZWRzLmtpbmQgPT09IFwiQWNjb3VudENvbm5TdHJpbmdcIikge1xuICAgICAgICAgICAgICAgIGlmIChjb3JlVXRpbC5pc05vZGUpIHtcbiAgICAgICAgICAgICAgICAgICAgY29uc3Qgc2hhcmVkS2V5Q3JlZGVudGlhbCA9IG5ldyBTdG9yYWdlU2hhcmVkS2V5Q3JlZGVudGlhbChleHRyYWN0ZWRDcmVkcy5hY2NvdW50TmFtZSwgZXh0cmFjdGVkQ3JlZHMuYWNjb3VudEtleSk7XG4gICAgICAgICAgICAgICAgICAgIHVybCA9IGFwcGVuZFRvVVJMUGF0aChleHRyYWN0ZWRDcmVkcy51cmwsIGVuY29kZVVSSUNvbXBvbmVudChjb250YWluZXJOYW1lKSk7XG4gICAgICAgICAgICAgICAgICAgIGlmICghb3B0aW9ucy5wcm94eU9wdGlvbnMpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIG9wdGlvbnMucHJveHlPcHRpb25zID0gY29yZVJlc3RQaXBlbGluZS5nZXREZWZhdWx0UHJveHlTZXR0aW5ncyhleHRyYWN0ZWRDcmVkcy5wcm94eVVyaSk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgcGlwZWxpbmUgPSBuZXdQaXBlbGluZShzaGFyZWRLZXlDcmVkZW50aWFsLCBvcHRpb25zKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihcIkFjY291bnQgY29ubmVjdGlvbiBzdHJpbmcgaXMgb25seSBzdXBwb3J0ZWQgaW4gTm9kZS5qcyBlbnZpcm9ubWVudFwiKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIGlmIChleHRyYWN0ZWRDcmVkcy5raW5kID09PSBcIlNBU0Nvbm5TdHJpbmdcIikge1xuICAgICAgICAgICAgICAgIHVybCA9XG4gICAgICAgICAgICAgICAgICAgIGFwcGVuZFRvVVJMUGF0aChleHRyYWN0ZWRDcmVkcy51cmwsIGVuY29kZVVSSUNvbXBvbmVudChjb250YWluZXJOYW1lKSkgK1xuICAgICAgICAgICAgICAgICAgICAgICAgXCI/XCIgK1xuICAgICAgICAgICAgICAgICAgICAgICAgZXh0cmFjdGVkQ3JlZHMuYWNjb3VudFNhcztcbiAgICAgICAgICAgICAgICBwaXBlbGluZSA9IG5ld1BpcGVsaW5lKG5ldyBBbm9ueW1vdXNDcmVkZW50aWFsKCksIG9wdGlvbnMpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwiQ29ubmVjdGlvbiBzdHJpbmcgbXVzdCBiZSBlaXRoZXIgYW4gQWNjb3VudCBjb25uZWN0aW9uIHN0cmluZyBvciBhIFNBUyBjb25uZWN0aW9uIHN0cmluZ1wiKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihcIkV4cGVjdGluZyBub24tZW1wdHkgc3RyaW5ncyBmb3IgY29udGFpbmVyTmFtZSBwYXJhbWV0ZXJcIik7XG4gICAgICAgIH1cbiAgICAgICAgc3VwZXIodXJsLCBwaXBlbGluZSk7XG4gICAgICAgIHRoaXMuX2NvbnRhaW5lck5hbWUgPSB0aGlzLmdldENvbnRhaW5lck5hbWVGcm9tVXJsKCk7XG4gICAgICAgIHRoaXMuY29udGFpbmVyQ29udGV4dCA9IHRoaXMuc3RvcmFnZUNsaWVudENvbnRleHQuY29udGFpbmVyO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBDcmVhdGVzIGEgbmV3IGNvbnRhaW5lciB1bmRlciB0aGUgc3BlY2lmaWVkIGFjY291bnQuIElmIHRoZSBjb250YWluZXIgd2l0aFxuICAgICAqIHRoZSBzYW1lIG5hbWUgYWxyZWFkeSBleGlzdHMsIHRoZSBvcGVyYXRpb24gZmFpbHMuXG4gICAgICogQHNlZSBodHRwczovL2RvY3MubWljcm9zb2Z0LmNvbS9lbi11cy9yZXN0L2FwaS9zdG9yYWdlc2VydmljZXMvY3JlYXRlLWNvbnRhaW5lclxuICAgICAqIE5hbWluZyBydWxlczogQHNlZSBodHRwczovL2xlYXJuLm1pY3Jvc29mdC5jb20vcmVzdC9hcGkvc3RvcmFnZXNlcnZpY2VzL25hbWluZy1hbmQtcmVmZXJlbmNpbmctY29udGFpbmVycy0tYmxvYnMtLWFuZC1tZXRhZGF0YVxuICAgICAqXG4gICAgICogQHBhcmFtIG9wdGlvbnMgLSBPcHRpb25zIHRvIENvbnRhaW5lciBDcmVhdGUgb3BlcmF0aW9uLlxuICAgICAqXG4gICAgICpcbiAgICAgKiBFeGFtcGxlIHVzYWdlOlxuICAgICAqXG4gICAgICogYGBganNcbiAgICAgKiBjb25zdCBjb250YWluZXJDbGllbnQgPSBibG9iU2VydmljZUNsaWVudC5nZXRDb250YWluZXJDbGllbnQoXCI8Y29udGFpbmVyIG5hbWU+XCIpO1xuICAgICAqIGNvbnN0IGNyZWF0ZUNvbnRhaW5lclJlc3BvbnNlID0gYXdhaXQgY29udGFpbmVyQ2xpZW50LmNyZWF0ZSgpO1xuICAgICAqIGNvbnNvbGUubG9nKFwiQ29udGFpbmVyIHdhcyBjcmVhdGVkIHN1Y2Nlc3NmdWxseVwiLCBjcmVhdGVDb250YWluZXJSZXNwb25zZS5yZXF1ZXN0SWQpO1xuICAgICAqIGBgYFxuICAgICAqL1xuICAgIGFzeW5jIGNyZWF0ZShvcHRpb25zID0ge30pIHtcbiAgICAgICAgcmV0dXJuIHRyYWNpbmdDbGllbnQud2l0aFNwYW4oXCJDb250YWluZXJDbGllbnQtY3JlYXRlXCIsIG9wdGlvbnMsIGFzeW5jICh1cGRhdGVkT3B0aW9ucykgPT4ge1xuICAgICAgICAgICAgcmV0dXJuIGFzc2VydFJlc3BvbnNlKGF3YWl0IHRoaXMuY29udGFpbmVyQ29udGV4dC5jcmVhdGUodXBkYXRlZE9wdGlvbnMpKTtcbiAgICAgICAgfSk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIENyZWF0ZXMgYSBuZXcgY29udGFpbmVyIHVuZGVyIHRoZSBzcGVjaWZpZWQgYWNjb3VudC4gSWYgdGhlIGNvbnRhaW5lciB3aXRoXG4gICAgICogdGhlIHNhbWUgbmFtZSBhbHJlYWR5IGV4aXN0cywgaXQgaXMgbm90IGNoYW5nZWQuXG4gICAgICogQHNlZSBodHRwczovL2RvY3MubWljcm9zb2Z0LmNvbS9lbi11cy9yZXN0L2FwaS9zdG9yYWdlc2VydmljZXMvY3JlYXRlLWNvbnRhaW5lclxuICAgICAqIE5hbWluZyBydWxlczogQHNlZSBodHRwczovL2xlYXJuLm1pY3Jvc29mdC5jb20vcmVzdC9hcGkvc3RvcmFnZXNlcnZpY2VzL25hbWluZy1hbmQtcmVmZXJlbmNpbmctY29udGFpbmVycy0tYmxvYnMtLWFuZC1tZXRhZGF0YVxuICAgICAqXG4gICAgICogQHBhcmFtIG9wdGlvbnMgLVxuICAgICAqL1xuICAgIGFzeW5jIGNyZWF0ZUlmTm90RXhpc3RzKG9wdGlvbnMgPSB7fSkge1xuICAgICAgICByZXR1cm4gdHJhY2luZ0NsaWVudC53aXRoU3BhbihcIkNvbnRhaW5lckNsaWVudC1jcmVhdGVJZk5vdEV4aXN0c1wiLCBvcHRpb25zLCBhc3luYyAodXBkYXRlZE9wdGlvbnMpID0+IHtcbiAgICAgICAgICAgIHZhciBfYSwgX2I7XG4gICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgIGNvbnN0IHJlcyA9IGF3YWl0IHRoaXMuY3JlYXRlKHVwZGF0ZWRPcHRpb25zKTtcbiAgICAgICAgICAgICAgICByZXR1cm4gT2JqZWN0LmFzc2lnbihPYmplY3QuYXNzaWduKHsgc3VjY2VlZGVkOiB0cnVlIH0sIHJlcyksIHsgX3Jlc3BvbnNlOiByZXMuX3Jlc3BvbnNlIH0pO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgY2F0Y2ggKGUpIHtcbiAgICAgICAgICAgICAgICBpZiAoKChfYSA9IGUuZGV0YWlscykgPT09IG51bGwgfHwgX2EgPT09IHZvaWQgMCA/IHZvaWQgMCA6IF9hLmVycm9yQ29kZSkgPT09IFwiQ29udGFpbmVyQWxyZWFkeUV4aXN0c1wiKSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBPYmplY3QuYXNzaWduKE9iamVjdC5hc3NpZ24oeyBzdWNjZWVkZWQ6IGZhbHNlIH0sIChfYiA9IGUucmVzcG9uc2UpID09PSBudWxsIHx8IF9iID09PSB2b2lkIDAgPyB2b2lkIDAgOiBfYi5wYXJzZWRIZWFkZXJzKSwgeyBfcmVzcG9uc2U6IGUucmVzcG9uc2UgfSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICB0aHJvdyBlO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIFJldHVybnMgdHJ1ZSBpZiB0aGUgQXp1cmUgY29udGFpbmVyIHJlc291cmNlIHJlcHJlc2VudGVkIGJ5IHRoaXMgY2xpZW50IGV4aXN0czsgZmFsc2Ugb3RoZXJ3aXNlLlxuICAgICAqXG4gICAgICogTk9URTogdXNlIHRoaXMgZnVuY3Rpb24gd2l0aCBjYXJlIHNpbmNlIGFuIGV4aXN0aW5nIGNvbnRhaW5lciBtaWdodCBiZSBkZWxldGVkIGJ5IG90aGVyIGNsaWVudHMgb3JcbiAgICAgKiBhcHBsaWNhdGlvbnMuIFZpY2UgdmVyc2EgbmV3IGNvbnRhaW5lcnMgd2l0aCB0aGUgc2FtZSBuYW1lIG1pZ2h0IGJlIGFkZGVkIGJ5IG90aGVyIGNsaWVudHMgb3JcbiAgICAgKiBhcHBsaWNhdGlvbnMgYWZ0ZXIgdGhpcyBmdW5jdGlvbiBjb21wbGV0ZXMuXG4gICAgICpcbiAgICAgKiBAcGFyYW0gb3B0aW9ucyAtXG4gICAgICovXG4gICAgYXN5bmMgZXhpc3RzKG9wdGlvbnMgPSB7fSkge1xuICAgICAgICByZXR1cm4gdHJhY2luZ0NsaWVudC53aXRoU3BhbihcIkNvbnRhaW5lckNsaWVudC1leGlzdHNcIiwgb3B0aW9ucywgYXN5bmMgKHVwZGF0ZWRPcHRpb25zKSA9PiB7XG4gICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgIGF3YWl0IHRoaXMuZ2V0UHJvcGVydGllcyh7XG4gICAgICAgICAgICAgICAgICAgIGFib3J0U2lnbmFsOiBvcHRpb25zLmFib3J0U2lnbmFsLFxuICAgICAgICAgICAgICAgICAgICB0cmFjaW5nT3B0aW9uczogdXBkYXRlZE9wdGlvbnMudHJhY2luZ09wdGlvbnMsXG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBjYXRjaCAoZSkge1xuICAgICAgICAgICAgICAgIGlmIChlLnN0YXR1c0NvZGUgPT09IDQwNCkge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHRocm93IGU7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBDcmVhdGVzIGEge0BsaW5rIEJsb2JDbGllbnR9XG4gICAgICpcbiAgICAgKiBAcGFyYW0gYmxvYk5hbWUgLSBBIGJsb2IgbmFtZVxuICAgICAqIEByZXR1cm5zIEEgbmV3IEJsb2JDbGllbnQgb2JqZWN0IGZvciB0aGUgZ2l2ZW4gYmxvYiBuYW1lLlxuICAgICAqL1xuICAgIGdldEJsb2JDbGllbnQoYmxvYk5hbWUpIHtcbiAgICAgICAgcmV0dXJuIG5ldyBCbG9iQ2xpZW50KGFwcGVuZFRvVVJMUGF0aCh0aGlzLnVybCwgRXNjYXBlUGF0aChibG9iTmFtZSkpLCB0aGlzLnBpcGVsaW5lKTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogQ3JlYXRlcyBhbiB7QGxpbmsgQXBwZW5kQmxvYkNsaWVudH1cbiAgICAgKlxuICAgICAqIEBwYXJhbSBibG9iTmFtZSAtIEFuIGFwcGVuZCBibG9iIG5hbWVcbiAgICAgKi9cbiAgICBnZXRBcHBlbmRCbG9iQ2xpZW50KGJsb2JOYW1lKSB7XG4gICAgICAgIHJldHVybiBuZXcgQXBwZW5kQmxvYkNsaWVudChhcHBlbmRUb1VSTFBhdGgodGhpcy51cmwsIEVzY2FwZVBhdGgoYmxvYk5hbWUpKSwgdGhpcy5waXBlbGluZSk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIENyZWF0ZXMgYSB7QGxpbmsgQmxvY2tCbG9iQ2xpZW50fVxuICAgICAqXG4gICAgICogQHBhcmFtIGJsb2JOYW1lIC0gQSBibG9jayBibG9iIG5hbWVcbiAgICAgKlxuICAgICAqXG4gICAgICogRXhhbXBsZSB1c2FnZTpcbiAgICAgKlxuICAgICAqIGBgYGpzXG4gICAgICogY29uc3QgY29udGVudCA9IFwiSGVsbG8gd29ybGQhXCI7XG4gICAgICpcbiAgICAgKiBjb25zdCBibG9ja0Jsb2JDbGllbnQgPSBjb250YWluZXJDbGllbnQuZ2V0QmxvY2tCbG9iQ2xpZW50KFwiPGJsb2IgbmFtZT5cIik7XG4gICAgICogY29uc3QgdXBsb2FkQmxvYlJlc3BvbnNlID0gYXdhaXQgYmxvY2tCbG9iQ2xpZW50LnVwbG9hZChjb250ZW50LCBjb250ZW50Lmxlbmd0aCk7XG4gICAgICogYGBgXG4gICAgICovXG4gICAgZ2V0QmxvY2tCbG9iQ2xpZW50KGJsb2JOYW1lKSB7XG4gICAgICAgIHJldHVybiBuZXcgQmxvY2tCbG9iQ2xpZW50KGFwcGVuZFRvVVJMUGF0aCh0aGlzLnVybCwgRXNjYXBlUGF0aChibG9iTmFtZSkpLCB0aGlzLnBpcGVsaW5lKTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogQ3JlYXRlcyBhIHtAbGluayBQYWdlQmxvYkNsaWVudH1cbiAgICAgKlxuICAgICAqIEBwYXJhbSBibG9iTmFtZSAtIEEgcGFnZSBibG9iIG5hbWVcbiAgICAgKi9cbiAgICBnZXRQYWdlQmxvYkNsaWVudChibG9iTmFtZSkge1xuICAgICAgICByZXR1cm4gbmV3IFBhZ2VCbG9iQ2xpZW50KGFwcGVuZFRvVVJMUGF0aCh0aGlzLnVybCwgRXNjYXBlUGF0aChibG9iTmFtZSkpLCB0aGlzLnBpcGVsaW5lKTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogUmV0dXJucyBhbGwgdXNlci1kZWZpbmVkIG1ldGFkYXRhIGFuZCBzeXN0ZW0gcHJvcGVydGllcyBmb3IgdGhlIHNwZWNpZmllZFxuICAgICAqIGNvbnRhaW5lci4gVGhlIGRhdGEgcmV0dXJuZWQgZG9lcyBub3QgaW5jbHVkZSB0aGUgY29udGFpbmVyJ3MgbGlzdCBvZiBibG9icy5cbiAgICAgKiBAc2VlIGh0dHBzOi8vZG9jcy5taWNyb3NvZnQuY29tL2VuLXVzL3Jlc3QvYXBpL3N0b3JhZ2VzZXJ2aWNlcy9nZXQtY29udGFpbmVyLXByb3BlcnRpZXNcbiAgICAgKlxuICAgICAqIFdBUk5JTkc6IFRoZSBgbWV0YWRhdGFgIG9iamVjdCByZXR1cm5lZCBpbiB0aGUgcmVzcG9uc2Ugd2lsbCBoYXZlIGl0cyBrZXlzIGluIGxvd2VyY2FzZSwgZXZlbiBpZlxuICAgICAqIHRoZXkgb3JpZ2luYWxseSBjb250YWluZWQgdXBwZXJjYXNlIGNoYXJhY3RlcnMuIFRoaXMgZGlmZmVycyBmcm9tIHRoZSBtZXRhZGF0YSBrZXlzIHJldHVybmVkIGJ5XG4gICAgICogdGhlIGBsaXN0Q29udGFpbmVyc2AgbWV0aG9kIG9mIHtAbGluayBCbG9iU2VydmljZUNsaWVudH0gdXNpbmcgdGhlIGBpbmNsdWRlTWV0YWRhdGFgIG9wdGlvbiwgd2hpY2hcbiAgICAgKiB3aWxsIHJldGFpbiB0aGVpciBvcmlnaW5hbCBjYXNpbmcuXG4gICAgICpcbiAgICAgKiBAcGFyYW0gb3B0aW9ucyAtIE9wdGlvbnMgdG8gQ29udGFpbmVyIEdldCBQcm9wZXJ0aWVzIG9wZXJhdGlvbi5cbiAgICAgKi9cbiAgICBhc3luYyBnZXRQcm9wZXJ0aWVzKG9wdGlvbnMgPSB7fSkge1xuICAgICAgICBpZiAoIW9wdGlvbnMuY29uZGl0aW9ucykge1xuICAgICAgICAgICAgb3B0aW9ucy5jb25kaXRpb25zID0ge307XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHRyYWNpbmdDbGllbnQud2l0aFNwYW4oXCJDb250YWluZXJDbGllbnQtZ2V0UHJvcGVydGllc1wiLCBvcHRpb25zLCBhc3luYyAodXBkYXRlZE9wdGlvbnMpID0+IHtcbiAgICAgICAgICAgIHJldHVybiBhc3NlcnRSZXNwb25zZShhd2FpdCB0aGlzLmNvbnRhaW5lckNvbnRleHQuZ2V0UHJvcGVydGllcyhPYmplY3QuYXNzaWduKE9iamVjdC5hc3NpZ24oeyBhYm9ydFNpZ25hbDogb3B0aW9ucy5hYm9ydFNpZ25hbCB9LCBvcHRpb25zLmNvbmRpdGlvbnMpLCB7IHRyYWNpbmdPcHRpb25zOiB1cGRhdGVkT3B0aW9ucy50cmFjaW5nT3B0aW9ucyB9KSkpO1xuICAgICAgICB9KTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogTWFya3MgdGhlIHNwZWNpZmllZCBjb250YWluZXIgZm9yIGRlbGV0aW9uLiBUaGUgY29udGFpbmVyIGFuZCBhbnkgYmxvYnNcbiAgICAgKiBjb250YWluZWQgd2l0aGluIGl0IGFyZSBsYXRlciBkZWxldGVkIGR1cmluZyBnYXJiYWdlIGNvbGxlY3Rpb24uXG4gICAgICogQHNlZSBodHRwczovL2RvY3MubWljcm9zb2Z0LmNvbS9lbi11cy9yZXN0L2FwaS9zdG9yYWdlc2VydmljZXMvZGVsZXRlLWNvbnRhaW5lclxuICAgICAqXG4gICAgICogQHBhcmFtIG9wdGlvbnMgLSBPcHRpb25zIHRvIENvbnRhaW5lciBEZWxldGUgb3BlcmF0aW9uLlxuICAgICAqL1xuICAgIGFzeW5jIGRlbGV0ZShvcHRpb25zID0ge30pIHtcbiAgICAgICAgaWYgKCFvcHRpb25zLmNvbmRpdGlvbnMpIHtcbiAgICAgICAgICAgIG9wdGlvbnMuY29uZGl0aW9ucyA9IHt9O1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB0cmFjaW5nQ2xpZW50LndpdGhTcGFuKFwiQ29udGFpbmVyQ2xpZW50LWRlbGV0ZVwiLCBvcHRpb25zLCBhc3luYyAodXBkYXRlZE9wdGlvbnMpID0+IHtcbiAgICAgICAgICAgIHJldHVybiBhc3NlcnRSZXNwb25zZShhd2FpdCB0aGlzLmNvbnRhaW5lckNvbnRleHQuZGVsZXRlKHtcbiAgICAgICAgICAgICAgICBhYm9ydFNpZ25hbDogb3B0aW9ucy5hYm9ydFNpZ25hbCxcbiAgICAgICAgICAgICAgICBsZWFzZUFjY2Vzc0NvbmRpdGlvbnM6IG9wdGlvbnMuY29uZGl0aW9ucyxcbiAgICAgICAgICAgICAgICBtb2RpZmllZEFjY2Vzc0NvbmRpdGlvbnM6IG9wdGlvbnMuY29uZGl0aW9ucyxcbiAgICAgICAgICAgICAgICB0cmFjaW5nT3B0aW9uczogdXBkYXRlZE9wdGlvbnMudHJhY2luZ09wdGlvbnMsXG4gICAgICAgICAgICB9KSk7XG4gICAgICAgIH0pO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBNYXJrcyB0aGUgc3BlY2lmaWVkIGNvbnRhaW5lciBmb3IgZGVsZXRpb24gaWYgaXQgZXhpc3RzLiBUaGUgY29udGFpbmVyIGFuZCBhbnkgYmxvYnNcbiAgICAgKiBjb250YWluZWQgd2l0aGluIGl0IGFyZSBsYXRlciBkZWxldGVkIGR1cmluZyBnYXJiYWdlIGNvbGxlY3Rpb24uXG4gICAgICogQHNlZSBodHRwczovL2RvY3MubWljcm9zb2Z0LmNvbS9lbi11cy9yZXN0L2FwaS9zdG9yYWdlc2VydmljZXMvZGVsZXRlLWNvbnRhaW5lclxuICAgICAqXG4gICAgICogQHBhcmFtIG9wdGlvbnMgLSBPcHRpb25zIHRvIENvbnRhaW5lciBEZWxldGUgb3BlcmF0aW9uLlxuICAgICAqL1xuICAgIGFzeW5jIGRlbGV0ZUlmRXhpc3RzKG9wdGlvbnMgPSB7fSkge1xuICAgICAgICByZXR1cm4gdHJhY2luZ0NsaWVudC53aXRoU3BhbihcIkNvbnRhaW5lckNsaWVudC1kZWxldGVJZkV4aXN0c1wiLCBvcHRpb25zLCBhc3luYyAodXBkYXRlZE9wdGlvbnMpID0+IHtcbiAgICAgICAgICAgIHZhciBfYSwgX2I7XG4gICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgIGNvbnN0IHJlcyA9IGF3YWl0IHRoaXMuZGVsZXRlKHVwZGF0ZWRPcHRpb25zKTtcbiAgICAgICAgICAgICAgICByZXR1cm4gT2JqZWN0LmFzc2lnbihPYmplY3QuYXNzaWduKHsgc3VjY2VlZGVkOiB0cnVlIH0sIHJlcyksIHsgX3Jlc3BvbnNlOiByZXMuX3Jlc3BvbnNlIH0pO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgY2F0Y2ggKGUpIHtcbiAgICAgICAgICAgICAgICBpZiAoKChfYSA9IGUuZGV0YWlscykgPT09IG51bGwgfHwgX2EgPT09IHZvaWQgMCA/IHZvaWQgMCA6IF9hLmVycm9yQ29kZSkgPT09IFwiQ29udGFpbmVyTm90Rm91bmRcIikge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gT2JqZWN0LmFzc2lnbihPYmplY3QuYXNzaWduKHsgc3VjY2VlZGVkOiBmYWxzZSB9LCAoX2IgPSBlLnJlc3BvbnNlKSA9PT0gbnVsbCB8fCBfYiA9PT0gdm9pZCAwID8gdm9pZCAwIDogX2IucGFyc2VkSGVhZGVycyksIHsgX3Jlc3BvbnNlOiBlLnJlc3BvbnNlIH0pO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB0aHJvdyBlO1xuICAgICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogU2V0cyBvbmUgb3IgbW9yZSB1c2VyLWRlZmluZWQgbmFtZS12YWx1ZSBwYWlycyBmb3IgdGhlIHNwZWNpZmllZCBjb250YWluZXIuXG4gICAgICpcbiAgICAgKiBJZiBubyBvcHRpb24gcHJvdmlkZWQsIG9yIG5vIG1ldGFkYXRhIGRlZmluZWQgaW4gdGhlIHBhcmFtZXRlciwgdGhlIGNvbnRhaW5lclxuICAgICAqIG1ldGFkYXRhIHdpbGwgYmUgcmVtb3ZlZC5cbiAgICAgKlxuICAgICAqIEBzZWUgaHR0cHM6Ly9kb2NzLm1pY3Jvc29mdC5jb20vZW4tdXMvcmVzdC9hcGkvc3RvcmFnZXNlcnZpY2VzL3NldC1jb250YWluZXItbWV0YWRhdGFcbiAgICAgKlxuICAgICAqIEBwYXJhbSBtZXRhZGF0YSAtIFJlcGxhY2UgZXhpc3RpbmcgbWV0YWRhdGEgd2l0aCB0aGlzIHZhbHVlLlxuICAgICAqICAgICAgICAgICAgICAgICAgICAgICAgICAgIElmIG5vIHZhbHVlIHByb3ZpZGVkIHRoZSBleGlzdGluZyBtZXRhZGF0YSB3aWxsIGJlIHJlbW92ZWQuXG4gICAgICogQHBhcmFtIG9wdGlvbnMgLSBPcHRpb25zIHRvIENvbnRhaW5lciBTZXQgTWV0YWRhdGEgb3BlcmF0aW9uLlxuICAgICAqL1xuICAgIGFzeW5jIHNldE1ldGFkYXRhKG1ldGFkYXRhLCBvcHRpb25zID0ge30pIHtcbiAgICAgICAgaWYgKCFvcHRpb25zLmNvbmRpdGlvbnMpIHtcbiAgICAgICAgICAgIG9wdGlvbnMuY29uZGl0aW9ucyA9IHt9O1xuICAgICAgICB9XG4gICAgICAgIGlmIChvcHRpb25zLmNvbmRpdGlvbnMuaWZVbm1vZGlmaWVkU2luY2UpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBSYW5nZUVycm9yKFwidGhlIElmVW5tb2RpZmllZFNpbmNlIG11c3QgaGF2ZSB0aGVpciBkZWZhdWx0IHZhbHVlcyBiZWNhdXNlIHRoZXkgYXJlIGlnbm9yZWQgYnkgdGhlIGJsb2Igc2VydmljZVwiKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gdHJhY2luZ0NsaWVudC53aXRoU3BhbihcIkNvbnRhaW5lckNsaWVudC1zZXRNZXRhZGF0YVwiLCBvcHRpb25zLCBhc3luYyAodXBkYXRlZE9wdGlvbnMpID0+IHtcbiAgICAgICAgICAgIHJldHVybiBhc3NlcnRSZXNwb25zZShhd2FpdCB0aGlzLmNvbnRhaW5lckNvbnRleHQuc2V0TWV0YWRhdGEoe1xuICAgICAgICAgICAgICAgIGFib3J0U2lnbmFsOiBvcHRpb25zLmFib3J0U2lnbmFsLFxuICAgICAgICAgICAgICAgIGxlYXNlQWNjZXNzQ29uZGl0aW9uczogb3B0aW9ucy5jb25kaXRpb25zLFxuICAgICAgICAgICAgICAgIG1ldGFkYXRhLFxuICAgICAgICAgICAgICAgIG1vZGlmaWVkQWNjZXNzQ29uZGl0aW9uczogb3B0aW9ucy5jb25kaXRpb25zLFxuICAgICAgICAgICAgICAgIHRyYWNpbmdPcHRpb25zOiB1cGRhdGVkT3B0aW9ucy50cmFjaW5nT3B0aW9ucyxcbiAgICAgICAgICAgIH0pKTtcbiAgICAgICAgfSk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIEdldHMgdGhlIHBlcm1pc3Npb25zIGZvciB0aGUgc3BlY2lmaWVkIGNvbnRhaW5lci4gVGhlIHBlcm1pc3Npb25zIGluZGljYXRlXG4gICAgICogd2hldGhlciBjb250YWluZXIgZGF0YSBtYXkgYmUgYWNjZXNzZWQgcHVibGljbHkuXG4gICAgICpcbiAgICAgKiBXQVJOSU5HOiBKYXZhU2NyaXB0IERhdGUgd2lsbCBwb3RlbnRpYWxseSBsb3NlIHByZWNpc2lvbiB3aGVuIHBhcnNpbmcgc3RhcnRzT24gYW5kIGV4cGlyZXNPbiBzdHJpbmdzLlxuICAgICAqIEZvciBleGFtcGxlLCBuZXcgRGF0ZShcIjIwMTgtMTItMzFUMDM6NDQ6MjMuODgyNzg5MVpcIikudG9JU09TdHJpbmcoKSB3aWxsIGdldCBcIjIwMTgtMTItMzFUMDM6NDQ6MjMuODgyWlwiLlxuICAgICAqXG4gICAgICogQHNlZSBodHRwczovL2RvY3MubWljcm9zb2Z0LmNvbS9lbi11cy9yZXN0L2FwaS9zdG9yYWdlc2VydmljZXMvZ2V0LWNvbnRhaW5lci1hY2xcbiAgICAgKlxuICAgICAqIEBwYXJhbSBvcHRpb25zIC0gT3B0aW9ucyB0byBDb250YWluZXIgR2V0IEFjY2VzcyBQb2xpY3kgb3BlcmF0aW9uLlxuICAgICAqL1xuICAgIGFzeW5jIGdldEFjY2Vzc1BvbGljeShvcHRpb25zID0ge30pIHtcbiAgICAgICAgaWYgKCFvcHRpb25zLmNvbmRpdGlvbnMpIHtcbiAgICAgICAgICAgIG9wdGlvbnMuY29uZGl0aW9ucyA9IHt9O1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB0cmFjaW5nQ2xpZW50LndpdGhTcGFuKFwiQ29udGFpbmVyQ2xpZW50LWdldEFjY2Vzc1BvbGljeVwiLCBvcHRpb25zLCBhc3luYyAodXBkYXRlZE9wdGlvbnMpID0+IHtcbiAgICAgICAgICAgIGNvbnN0IHJlc3BvbnNlID0gYXNzZXJ0UmVzcG9uc2UoYXdhaXQgdGhpcy5jb250YWluZXJDb250ZXh0LmdldEFjY2Vzc1BvbGljeSh7XG4gICAgICAgICAgICAgICAgYWJvcnRTaWduYWw6IG9wdGlvbnMuYWJvcnRTaWduYWwsXG4gICAgICAgICAgICAgICAgbGVhc2VBY2Nlc3NDb25kaXRpb25zOiBvcHRpb25zLmNvbmRpdGlvbnMsXG4gICAgICAgICAgICAgICAgdHJhY2luZ09wdGlvbnM6IHVwZGF0ZWRPcHRpb25zLnRyYWNpbmdPcHRpb25zLFxuICAgICAgICAgICAgfSkpO1xuICAgICAgICAgICAgY29uc3QgcmVzID0ge1xuICAgICAgICAgICAgICAgIF9yZXNwb25zZTogcmVzcG9uc2UuX3Jlc3BvbnNlLFxuICAgICAgICAgICAgICAgIGJsb2JQdWJsaWNBY2Nlc3M6IHJlc3BvbnNlLmJsb2JQdWJsaWNBY2Nlc3MsXG4gICAgICAgICAgICAgICAgZGF0ZTogcmVzcG9uc2UuZGF0ZSxcbiAgICAgICAgICAgICAgICBldGFnOiByZXNwb25zZS5ldGFnLFxuICAgICAgICAgICAgICAgIGVycm9yQ29kZTogcmVzcG9uc2UuZXJyb3JDb2RlLFxuICAgICAgICAgICAgICAgIGxhc3RNb2RpZmllZDogcmVzcG9uc2UubGFzdE1vZGlmaWVkLFxuICAgICAgICAgICAgICAgIHJlcXVlc3RJZDogcmVzcG9uc2UucmVxdWVzdElkLFxuICAgICAgICAgICAgICAgIGNsaWVudFJlcXVlc3RJZDogcmVzcG9uc2UuY2xpZW50UmVxdWVzdElkLFxuICAgICAgICAgICAgICAgIHNpZ25lZElkZW50aWZpZXJzOiBbXSxcbiAgICAgICAgICAgICAgICB2ZXJzaW9uOiByZXNwb25zZS52ZXJzaW9uLFxuICAgICAgICAgICAgfTtcbiAgICAgICAgICAgIGZvciAoY29uc3QgaWRlbnRpZmllciBvZiByZXNwb25zZSkge1xuICAgICAgICAgICAgICAgIGxldCBhY2Nlc3NQb2xpY3kgPSB1bmRlZmluZWQ7XG4gICAgICAgICAgICAgICAgaWYgKGlkZW50aWZpZXIuYWNjZXNzUG9saWN5KSB7XG4gICAgICAgICAgICAgICAgICAgIGFjY2Vzc1BvbGljeSA9IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHBlcm1pc3Npb25zOiBpZGVudGlmaWVyLmFjY2Vzc1BvbGljeS5wZXJtaXNzaW9ucyxcbiAgICAgICAgICAgICAgICAgICAgfTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKGlkZW50aWZpZXIuYWNjZXNzUG9saWN5LmV4cGlyZXNPbikge1xuICAgICAgICAgICAgICAgICAgICAgICAgYWNjZXNzUG9saWN5LmV4cGlyZXNPbiA9IG5ldyBEYXRlKGlkZW50aWZpZXIuYWNjZXNzUG9saWN5LmV4cGlyZXNPbik7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgaWYgKGlkZW50aWZpZXIuYWNjZXNzUG9saWN5LnN0YXJ0c09uKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBhY2Nlc3NQb2xpY3kuc3RhcnRzT24gPSBuZXcgRGF0ZShpZGVudGlmaWVyLmFjY2Vzc1BvbGljeS5zdGFydHNPbik7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgcmVzLnNpZ25lZElkZW50aWZpZXJzLnB1c2goe1xuICAgICAgICAgICAgICAgICAgICBhY2Nlc3NQb2xpY3ksXG4gICAgICAgICAgICAgICAgICAgIGlkOiBpZGVudGlmaWVyLmlkLFxuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIHJlcztcbiAgICAgICAgfSk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIFNldHMgdGhlIHBlcm1pc3Npb25zIGZvciB0aGUgc3BlY2lmaWVkIGNvbnRhaW5lci4gVGhlIHBlcm1pc3Npb25zIGluZGljYXRlXG4gICAgICogd2hldGhlciBibG9icyBpbiBhIGNvbnRhaW5lciBtYXkgYmUgYWNjZXNzZWQgcHVibGljbHkuXG4gICAgICpcbiAgICAgKiBXaGVuIHlvdSBzZXQgcGVybWlzc2lvbnMgZm9yIGEgY29udGFpbmVyLCB0aGUgZXhpc3RpbmcgcGVybWlzc2lvbnMgYXJlIHJlcGxhY2VkLlxuICAgICAqIElmIG5vIGFjY2VzcyBvciBjb250YWluZXJBY2wgcHJvdmlkZWQsIHRoZSBleGlzdGluZyBjb250YWluZXIgQUNMIHdpbGwgYmVcbiAgICAgKiByZW1vdmVkLlxuICAgICAqXG4gICAgICogV2hlbiB5b3UgZXN0YWJsaXNoIGEgc3RvcmVkIGFjY2VzcyBwb2xpY3kgb24gYSBjb250YWluZXIsIGl0IG1heSB0YWtlIHVwIHRvIDMwIHNlY29uZHMgdG8gdGFrZSBlZmZlY3QuXG4gICAgICogRHVyaW5nIHRoaXMgaW50ZXJ2YWwsIGEgc2hhcmVkIGFjY2VzcyBzaWduYXR1cmUgdGhhdCBpcyBhc3NvY2lhdGVkIHdpdGggdGhlIHN0b3JlZCBhY2Nlc3MgcG9saWN5IHdpbGxcbiAgICAgKiBmYWlsIHdpdGggc3RhdHVzIGNvZGUgNDAzIChGb3JiaWRkZW4pLCB1bnRpbCB0aGUgYWNjZXNzIHBvbGljeSBiZWNvbWVzIGFjdGl2ZS5cbiAgICAgKiBAc2VlIGh0dHBzOi8vZG9jcy5taWNyb3NvZnQuY29tL2VuLXVzL3Jlc3QvYXBpL3N0b3JhZ2VzZXJ2aWNlcy9zZXQtY29udGFpbmVyLWFjbFxuICAgICAqXG4gICAgICogQHBhcmFtIGFjY2VzcyAtIFRoZSBsZXZlbCBvZiBwdWJsaWMgYWNjZXNzIHRvIGRhdGEgaW4gdGhlIGNvbnRhaW5lci5cbiAgICAgKiBAcGFyYW0gY29udGFpbmVyQWNsIC0gQXJyYXkgb2YgZWxlbWVudHMgZWFjaCBoYXZpbmcgYSB1bmlxdWUgSWQgYW5kIGRldGFpbHMgb2YgdGhlIGFjY2VzcyBwb2xpY3kuXG4gICAgICogQHBhcmFtIG9wdGlvbnMgLSBPcHRpb25zIHRvIENvbnRhaW5lciBTZXQgQWNjZXNzIFBvbGljeSBvcGVyYXRpb24uXG4gICAgICovXG4gICAgYXN5bmMgc2V0QWNjZXNzUG9saWN5KGFjY2VzcywgY29udGFpbmVyQWNsLCBvcHRpb25zID0ge30pIHtcbiAgICAgICAgb3B0aW9ucy5jb25kaXRpb25zID0gb3B0aW9ucy5jb25kaXRpb25zIHx8IHt9O1xuICAgICAgICByZXR1cm4gdHJhY2luZ0NsaWVudC53aXRoU3BhbihcIkNvbnRhaW5lckNsaWVudC1zZXRBY2Nlc3NQb2xpY3lcIiwgb3B0aW9ucywgYXN5bmMgKHVwZGF0ZWRPcHRpb25zKSA9PiB7XG4gICAgICAgICAgICBjb25zdCBhY2wgPSBbXTtcbiAgICAgICAgICAgIGZvciAoY29uc3QgaWRlbnRpZmllciBvZiBjb250YWluZXJBY2wgfHwgW10pIHtcbiAgICAgICAgICAgICAgICBhY2wucHVzaCh7XG4gICAgICAgICAgICAgICAgICAgIGFjY2Vzc1BvbGljeToge1xuICAgICAgICAgICAgICAgICAgICAgICAgZXhwaXJlc09uOiBpZGVudGlmaWVyLmFjY2Vzc1BvbGljeS5leHBpcmVzT25cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA/IHRydW5jYXRlZElTTzgwNjFEYXRlKGlkZW50aWZpZXIuYWNjZXNzUG9saWN5LmV4cGlyZXNPbilcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA6IFwiXCIsXG4gICAgICAgICAgICAgICAgICAgICAgICBwZXJtaXNzaW9uczogaWRlbnRpZmllci5hY2Nlc3NQb2xpY3kucGVybWlzc2lvbnMsXG4gICAgICAgICAgICAgICAgICAgICAgICBzdGFydHNPbjogaWRlbnRpZmllci5hY2Nlc3NQb2xpY3kuc3RhcnRzT25cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA/IHRydW5jYXRlZElTTzgwNjFEYXRlKGlkZW50aWZpZXIuYWNjZXNzUG9saWN5LnN0YXJ0c09uKVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDogXCJcIixcbiAgICAgICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICAgICAgaWQ6IGlkZW50aWZpZXIuaWQsXG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4gYXNzZXJ0UmVzcG9uc2UoYXdhaXQgdGhpcy5jb250YWluZXJDb250ZXh0LnNldEFjY2Vzc1BvbGljeSh7XG4gICAgICAgICAgICAgICAgYWJvcnRTaWduYWw6IG9wdGlvbnMuYWJvcnRTaWduYWwsXG4gICAgICAgICAgICAgICAgYWNjZXNzLFxuICAgICAgICAgICAgICAgIGNvbnRhaW5lckFjbDogYWNsLFxuICAgICAgICAgICAgICAgIGxlYXNlQWNjZXNzQ29uZGl0aW9uczogb3B0aW9ucy5jb25kaXRpb25zLFxuICAgICAgICAgICAgICAgIG1vZGlmaWVkQWNjZXNzQ29uZGl0aW9uczogb3B0aW9ucy5jb25kaXRpb25zLFxuICAgICAgICAgICAgICAgIHRyYWNpbmdPcHRpb25zOiB1cGRhdGVkT3B0aW9ucy50cmFjaW5nT3B0aW9ucyxcbiAgICAgICAgICAgIH0pKTtcbiAgICAgICAgfSk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIEdldCBhIHtAbGluayBCbG9iTGVhc2VDbGllbnR9IHRoYXQgbWFuYWdlcyBsZWFzZXMgb24gdGhlIGNvbnRhaW5lci5cbiAgICAgKlxuICAgICAqIEBwYXJhbSBwcm9wb3NlTGVhc2VJZCAtIEluaXRpYWwgcHJvcG9zZWQgbGVhc2UgSWQuXG4gICAgICogQHJldHVybnMgQSBuZXcgQmxvYkxlYXNlQ2xpZW50IG9iamVjdCBmb3IgbWFuYWdpbmcgbGVhc2VzIG9uIHRoZSBjb250YWluZXIuXG4gICAgICovXG4gICAgZ2V0QmxvYkxlYXNlQ2xpZW50KHByb3Bvc2VMZWFzZUlkKSB7XG4gICAgICAgIHJldHVybiBuZXcgQmxvYkxlYXNlQ2xpZW50KHRoaXMsIHByb3Bvc2VMZWFzZUlkKTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogQ3JlYXRlcyBhIG5ldyBibG9jayBibG9iLCBvciB1cGRhdGVzIHRoZSBjb250ZW50IG9mIGFuIGV4aXN0aW5nIGJsb2NrIGJsb2IuXG4gICAgICpcbiAgICAgKiBVcGRhdGluZyBhbiBleGlzdGluZyBibG9jayBibG9iIG92ZXJ3cml0ZXMgYW55IGV4aXN0aW5nIG1ldGFkYXRhIG9uIHRoZSBibG9iLlxuICAgICAqIFBhcnRpYWwgdXBkYXRlcyBhcmUgbm90IHN1cHBvcnRlZDsgdGhlIGNvbnRlbnQgb2YgdGhlIGV4aXN0aW5nIGJsb2IgaXNcbiAgICAgKiBvdmVyd3JpdHRlbiB3aXRoIHRoZSBuZXcgY29udGVudC4gVG8gcGVyZm9ybSBhIHBhcnRpYWwgdXBkYXRlIG9mIGEgYmxvY2sgYmxvYidzLFxuICAgICAqIHVzZSB7QGxpbmsgQmxvY2tCbG9iQ2xpZW50LnN0YWdlQmxvY2t9IGFuZCB7QGxpbmsgQmxvY2tCbG9iQ2xpZW50LmNvbW1pdEJsb2NrTGlzdH0uXG4gICAgICpcbiAgICAgKiBUaGlzIGlzIGEgbm9uLXBhcmFsbGVsIHVwbG9hZGluZyBtZXRob2QsIHBsZWFzZSB1c2Uge0BsaW5rIEJsb2NrQmxvYkNsaWVudC51cGxvYWRGaWxlfSxcbiAgICAgKiB7QGxpbmsgQmxvY2tCbG9iQ2xpZW50LnVwbG9hZFN0cmVhbX0gb3Ige0BsaW5rIEJsb2NrQmxvYkNsaWVudC51cGxvYWRCcm93c2VyRGF0YX0gZm9yIGJldHRlclxuICAgICAqIHBlcmZvcm1hbmNlIHdpdGggY29uY3VycmVuY3kgdXBsb2FkaW5nLlxuICAgICAqXG4gICAgICogQHNlZSBodHRwczovL2RvY3MubWljcm9zb2Z0LmNvbS9yZXN0L2FwaS9zdG9yYWdlc2VydmljZXMvcHV0LWJsb2JcbiAgICAgKlxuICAgICAqIEBwYXJhbSBibG9iTmFtZSAtIE5hbWUgb2YgdGhlIGJsb2NrIGJsb2IgdG8gY3JlYXRlIG9yIHVwZGF0ZS5cbiAgICAgKiBAcGFyYW0gYm9keSAtIEJsb2IsIHN0cmluZywgQXJyYXlCdWZmZXIsIEFycmF5QnVmZmVyVmlldyBvciBhIGZ1bmN0aW9uXG4gICAgICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd2hpY2ggcmV0dXJucyBhIG5ldyBSZWFkYWJsZSBzdHJlYW0gd2hvc2Ugb2Zmc2V0IGlzIGZyb20gZGF0YSBzb3VyY2UgYmVnaW5uaW5nLlxuICAgICAqIEBwYXJhbSBjb250ZW50TGVuZ3RoIC0gTGVuZ3RoIG9mIGJvZHkgaW4gYnl0ZXMuIFVzZSBCdWZmZXIuYnl0ZUxlbmd0aCgpIHRvIGNhbGN1bGF0ZSBib2R5IGxlbmd0aCBmb3IgYVxuICAgICAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmluZyBpbmNsdWRpbmcgbm9uIG5vbi1CYXNlNjQvSGV4LWVuY29kZWQgY2hhcmFjdGVycy5cbiAgICAgKiBAcGFyYW0gb3B0aW9ucyAtIE9wdGlvbnMgdG8gY29uZmlndXJlIHRoZSBCbG9jayBCbG9iIFVwbG9hZCBvcGVyYXRpb24uXG4gICAgICogQHJldHVybnMgQmxvY2sgQmxvYiB1cGxvYWQgcmVzcG9uc2UgZGF0YSBhbmQgdGhlIGNvcnJlc3BvbmRpbmcgQmxvY2tCbG9iQ2xpZW50IGluc3RhbmNlLlxuICAgICAqL1xuICAgIGFzeW5jIHVwbG9hZEJsb2NrQmxvYihibG9iTmFtZSwgYm9keSwgY29udGVudExlbmd0aCwgb3B0aW9ucyA9IHt9KSB7XG4gICAgICAgIHJldHVybiB0cmFjaW5nQ2xpZW50LndpdGhTcGFuKFwiQ29udGFpbmVyQ2xpZW50LXVwbG9hZEJsb2NrQmxvYlwiLCBvcHRpb25zLCBhc3luYyAodXBkYXRlZE9wdGlvbnMpID0+IHtcbiAgICAgICAgICAgIGNvbnN0IGJsb2NrQmxvYkNsaWVudCA9IHRoaXMuZ2V0QmxvY2tCbG9iQ2xpZW50KGJsb2JOYW1lKTtcbiAgICAgICAgICAgIGNvbnN0IHJlc3BvbnNlID0gYXdhaXQgYmxvY2tCbG9iQ2xpZW50LnVwbG9hZChib2R5LCBjb250ZW50TGVuZ3RoLCB1cGRhdGVkT3B0aW9ucyk7XG4gICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICAgIGJsb2NrQmxvYkNsaWVudCxcbiAgICAgICAgICAgICAgICByZXNwb25zZSxcbiAgICAgICAgICAgIH07XG4gICAgICAgIH0pO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBNYXJrcyB0aGUgc3BlY2lmaWVkIGJsb2Igb3Igc25hcHNob3QgZm9yIGRlbGV0aW9uLiBUaGUgYmxvYiBpcyBsYXRlciBkZWxldGVkXG4gICAgICogZHVyaW5nIGdhcmJhZ2UgY29sbGVjdGlvbi4gTm90ZSB0aGF0IGluIG9yZGVyIHRvIGRlbGV0ZSBhIGJsb2IsIHlvdSBtdXN0IGRlbGV0ZVxuICAgICAqIGFsbCBvZiBpdHMgc25hcHNob3RzLiBZb3UgY2FuIGRlbGV0ZSBib3RoIGF0IHRoZSBzYW1lIHRpbWUgd2l0aCB0aGUgRGVsZXRlXG4gICAgICogQmxvYiBvcGVyYXRpb24uXG4gICAgICogQHNlZSBodHRwczovL2RvY3MubWljcm9zb2Z0LmNvbS9lbi11cy9yZXN0L2FwaS9zdG9yYWdlc2VydmljZXMvZGVsZXRlLWJsb2JcbiAgICAgKlxuICAgICAqIEBwYXJhbSBibG9iTmFtZSAtXG4gICAgICogQHBhcmFtIG9wdGlvbnMgLSBPcHRpb25zIHRvIEJsb2IgRGVsZXRlIG9wZXJhdGlvbi5cbiAgICAgKiBAcmV0dXJucyBCbG9jayBibG9iIGRlbGV0aW9uIHJlc3BvbnNlIGRhdGEuXG4gICAgICovXG4gICAgYXN5bmMgZGVsZXRlQmxvYihibG9iTmFtZSwgb3B0aW9ucyA9IHt9KSB7XG4gICAgICAgIHJldHVybiB0cmFjaW5nQ2xpZW50LndpdGhTcGFuKFwiQ29udGFpbmVyQ2xpZW50LWRlbGV0ZUJsb2JcIiwgb3B0aW9ucywgYXN5bmMgKHVwZGF0ZWRPcHRpb25zKSA9PiB7XG4gICAgICAgICAgICBsZXQgYmxvYkNsaWVudCA9IHRoaXMuZ2V0QmxvYkNsaWVudChibG9iTmFtZSk7XG4gICAgICAgICAgICBpZiAob3B0aW9ucy52ZXJzaW9uSWQpIHtcbiAgICAgICAgICAgICAgICBibG9iQ2xpZW50ID0gYmxvYkNsaWVudC53aXRoVmVyc2lvbihvcHRpb25zLnZlcnNpb25JZCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4gYmxvYkNsaWVudC5kZWxldGUodXBkYXRlZE9wdGlvbnMpO1xuICAgICAgICB9KTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogbGlzdEJsb2JGbGF0U2VnbWVudCByZXR1cm5zIGEgc2luZ2xlIHNlZ21lbnQgb2YgYmxvYnMgc3RhcnRpbmcgZnJvbSB0aGVcbiAgICAgKiBzcGVjaWZpZWQgTWFya2VyLiBVc2UgYW4gZW1wdHkgTWFya2VyIHRvIHN0YXJ0IGVudW1lcmF0aW9uIGZyb20gdGhlIGJlZ2lubmluZy5cbiAgICAgKiBBZnRlciBnZXR0aW5nIGEgc2VnbWVudCwgcHJvY2VzcyBpdCwgYW5kIHRoZW4gY2FsbCBsaXN0QmxvYnNGbGF0U2VnbWVudCBhZ2FpblxuICAgICAqIChwYXNzaW5nIHRoZSB0aGUgcHJldmlvdXNseS1yZXR1cm5lZCBNYXJrZXIpIHRvIGdldCB0aGUgbmV4dCBzZWdtZW50LlxuICAgICAqIEBzZWUgaHR0cHM6Ly9kb2NzLm1pY3Jvc29mdC5jb20vcmVzdC9hcGkvc3RvcmFnZXNlcnZpY2VzL2xpc3QtYmxvYnNcbiAgICAgKlxuICAgICAqIEBwYXJhbSBtYXJrZXIgLSBBIHN0cmluZyB2YWx1ZSB0aGF0IGlkZW50aWZpZXMgdGhlIHBvcnRpb24gb2YgdGhlIGxpc3QgdG8gYmUgcmV0dXJuZWQgd2l0aCB0aGUgbmV4dCBsaXN0IG9wZXJhdGlvbi5cbiAgICAgKiBAcGFyYW0gb3B0aW9ucyAtIE9wdGlvbnMgdG8gQ29udGFpbmVyIExpc3QgQmxvYiBGbGF0IFNlZ21lbnQgb3BlcmF0aW9uLlxuICAgICAqL1xuICAgIGFzeW5jIGxpc3RCbG9iRmxhdFNlZ21lbnQobWFya2VyLCBvcHRpb25zID0ge30pIHtcbiAgICAgICAgcmV0dXJuIHRyYWNpbmdDbGllbnQud2l0aFNwYW4oXCJDb250YWluZXJDbGllbnQtbGlzdEJsb2JGbGF0U2VnbWVudFwiLCBvcHRpb25zLCBhc3luYyAodXBkYXRlZE9wdGlvbnMpID0+IHtcbiAgICAgICAgICAgIGNvbnN0IHJlc3BvbnNlID0gYXNzZXJ0UmVzcG9uc2UoYXdhaXQgdGhpcy5jb250YWluZXJDb250ZXh0Lmxpc3RCbG9iRmxhdFNlZ21lbnQoT2JqZWN0LmFzc2lnbihPYmplY3QuYXNzaWduKHsgbWFya2VyIH0sIG9wdGlvbnMpLCB7IHRyYWNpbmdPcHRpb25zOiB1cGRhdGVkT3B0aW9ucy50cmFjaW5nT3B0aW9ucyB9KSkpO1xuICAgICAgICAgICAgY29uc3Qgd3JhcHBlZFJlc3BvbnNlID0gT2JqZWN0LmFzc2lnbihPYmplY3QuYXNzaWduKHt9LCByZXNwb25zZSksIHsgX3Jlc3BvbnNlOiBPYmplY3QuYXNzaWduKE9iamVjdC5hc3NpZ24oe30sIHJlc3BvbnNlLl9yZXNwb25zZSksIHsgcGFyc2VkQm9keTogQ29udmVydEludGVybmFsUmVzcG9uc2VPZkxpc3RCbG9iRmxhdChyZXNwb25zZS5fcmVzcG9uc2UucGFyc2VkQm9keSkgfSksIHNlZ21lbnQ6IE9iamVjdC5hc3NpZ24oT2JqZWN0LmFzc2lnbih7fSwgcmVzcG9uc2Uuc2VnbWVudCksIHsgYmxvYkl0ZW1zOiByZXNwb25zZS5zZWdtZW50LmJsb2JJdGVtcy5tYXAoKGJsb2JJdGVtSW50ZXJuYWwpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGJsb2JJdGVtID0gT2JqZWN0LmFzc2lnbihPYmplY3QuYXNzaWduKHt9LCBibG9iSXRlbUludGVybmFsKSwgeyBuYW1lOiBCbG9iTmFtZVRvU3RyaW5nKGJsb2JJdGVtSW50ZXJuYWwubmFtZSksIHRhZ3M6IHRvVGFncyhibG9iSXRlbUludGVybmFsLmJsb2JUYWdzKSwgb2JqZWN0UmVwbGljYXRpb25Tb3VyY2VQcm9wZXJ0aWVzOiBwYXJzZU9iamVjdFJlcGxpY2F0aW9uUmVjb3JkKGJsb2JJdGVtSW50ZXJuYWwub2JqZWN0UmVwbGljYXRpb25NZXRhZGF0YSkgfSk7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gYmxvYkl0ZW07XG4gICAgICAgICAgICAgICAgICAgIH0pIH0pIH0pO1xuICAgICAgICAgICAgcmV0dXJuIHdyYXBwZWRSZXNwb25zZTtcbiAgICAgICAgfSk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIGxpc3RCbG9iSGllcmFyY2h5U2VnbWVudCByZXR1cm5zIGEgc2luZ2xlIHNlZ21lbnQgb2YgYmxvYnMgc3RhcnRpbmcgZnJvbVxuICAgICAqIHRoZSBzcGVjaWZpZWQgTWFya2VyLiBVc2UgYW4gZW1wdHkgTWFya2VyIHRvIHN0YXJ0IGVudW1lcmF0aW9uIGZyb20gdGhlXG4gICAgICogYmVnaW5uaW5nLiBBZnRlciBnZXR0aW5nIGEgc2VnbWVudCwgcHJvY2VzcyBpdCwgYW5kIHRoZW4gY2FsbCBsaXN0QmxvYnNIaWVyYXJjaGljYWxTZWdtZW50XG4gICAgICogYWdhaW4gKHBhc3NpbmcgdGhlIHRoZSBwcmV2aW91c2x5LXJldHVybmVkIE1hcmtlcikgdG8gZ2V0IHRoZSBuZXh0IHNlZ21lbnQuXG4gICAgICogQHNlZSBodHRwczovL2RvY3MubWljcm9zb2Z0LmNvbS9yZXN0L2FwaS9zdG9yYWdlc2VydmljZXMvbGlzdC1ibG9ic1xuICAgICAqXG4gICAgICogQHBhcmFtIGRlbGltaXRlciAtIFRoZSBjaGFyYWN0ZXIgb3Igc3RyaW5nIHVzZWQgdG8gZGVmaW5lIHRoZSB2aXJ0dWFsIGhpZXJhcmNoeVxuICAgICAqIEBwYXJhbSBtYXJrZXIgLSBBIHN0cmluZyB2YWx1ZSB0aGF0IGlkZW50aWZpZXMgdGhlIHBvcnRpb24gb2YgdGhlIGxpc3QgdG8gYmUgcmV0dXJuZWQgd2l0aCB0aGUgbmV4dCBsaXN0IG9wZXJhdGlvbi5cbiAgICAgKiBAcGFyYW0gb3B0aW9ucyAtIE9wdGlvbnMgdG8gQ29udGFpbmVyIExpc3QgQmxvYiBIaWVyYXJjaHkgU2VnbWVudCBvcGVyYXRpb24uXG4gICAgICovXG4gICAgYXN5bmMgbGlzdEJsb2JIaWVyYXJjaHlTZWdtZW50KGRlbGltaXRlciwgbWFya2VyLCBvcHRpb25zID0ge30pIHtcbiAgICAgICAgcmV0dXJuIHRyYWNpbmdDbGllbnQud2l0aFNwYW4oXCJDb250YWluZXJDbGllbnQtbGlzdEJsb2JIaWVyYXJjaHlTZWdtZW50XCIsIG9wdGlvbnMsIGFzeW5jICh1cGRhdGVkT3B0aW9ucykgPT4ge1xuICAgICAgICAgICAgdmFyIF9hO1xuICAgICAgICAgICAgY29uc3QgcmVzcG9uc2UgPSBhc3NlcnRSZXNwb25zZShhd2FpdCB0aGlzLmNvbnRhaW5lckNvbnRleHQubGlzdEJsb2JIaWVyYXJjaHlTZWdtZW50KGRlbGltaXRlciwgT2JqZWN0LmFzc2lnbihPYmplY3QuYXNzaWduKHsgbWFya2VyIH0sIG9wdGlvbnMpLCB7IHRyYWNpbmdPcHRpb25zOiB1cGRhdGVkT3B0aW9ucy50cmFjaW5nT3B0aW9ucyB9KSkpO1xuICAgICAgICAgICAgY29uc3Qgd3JhcHBlZFJlc3BvbnNlID0gT2JqZWN0LmFzc2lnbihPYmplY3QuYXNzaWduKHt9LCByZXNwb25zZSksIHsgX3Jlc3BvbnNlOiBPYmplY3QuYXNzaWduKE9iamVjdC5hc3NpZ24oe30sIHJlc3BvbnNlLl9yZXNwb25zZSksIHsgcGFyc2VkQm9keTogQ29udmVydEludGVybmFsUmVzcG9uc2VPZkxpc3RCbG9iSGllcmFyY2h5KHJlc3BvbnNlLl9yZXNwb25zZS5wYXJzZWRCb2R5KSB9KSwgc2VnbWVudDogT2JqZWN0LmFzc2lnbihPYmplY3QuYXNzaWduKHt9LCByZXNwb25zZS5zZWdtZW50KSwgeyBibG9iSXRlbXM6IHJlc3BvbnNlLnNlZ21lbnQuYmxvYkl0ZW1zLm1hcCgoYmxvYkl0ZW1JbnRlcm5hbCkgPT4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgYmxvYkl0ZW0gPSBPYmplY3QuYXNzaWduKE9iamVjdC5hc3NpZ24oe30sIGJsb2JJdGVtSW50ZXJuYWwpLCB7IG5hbWU6IEJsb2JOYW1lVG9TdHJpbmcoYmxvYkl0ZW1JbnRlcm5hbC5uYW1lKSwgdGFnczogdG9UYWdzKGJsb2JJdGVtSW50ZXJuYWwuYmxvYlRhZ3MpLCBvYmplY3RSZXBsaWNhdGlvblNvdXJjZVByb3BlcnRpZXM6IHBhcnNlT2JqZWN0UmVwbGljYXRpb25SZWNvcmQoYmxvYkl0ZW1JbnRlcm5hbC5vYmplY3RSZXBsaWNhdGlvbk1ldGFkYXRhKSB9KTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBibG9iSXRlbTtcbiAgICAgICAgICAgICAgICAgICAgfSksIGJsb2JQcmVmaXhlczogKF9hID0gcmVzcG9uc2Uuc2VnbWVudC5ibG9iUHJlZml4ZXMpID09PSBudWxsIHx8IF9hID09PSB2b2lkIDAgPyB2b2lkIDAgOiBfYS5tYXAoKGJsb2JQcmVmaXhJbnRlcm5hbCkgPT4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgYmxvYlByZWZpeCA9IE9iamVjdC5hc3NpZ24oT2JqZWN0LmFzc2lnbih7fSwgYmxvYlByZWZpeEludGVybmFsKSwgeyBuYW1lOiBCbG9iTmFtZVRvU3RyaW5nKGJsb2JQcmVmaXhJbnRlcm5hbC5uYW1lKSB9KTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBibG9iUHJlZml4O1xuICAgICAgICAgICAgICAgICAgICB9KSB9KSB9KTtcbiAgICAgICAgICAgIHJldHVybiB3cmFwcGVkUmVzcG9uc2U7XG4gICAgICAgIH0pO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBSZXR1cm5zIGFuIEFzeW5jSXRlcmFibGVJdGVyYXRvciBmb3IgQ29udGFpbmVyTGlzdEJsb2JGbGF0U2VnbWVudFJlc3BvbnNlXG4gICAgICpcbiAgICAgKiBAcGFyYW0gbWFya2VyIC0gQSBzdHJpbmcgdmFsdWUgdGhhdCBpZGVudGlmaWVzIHRoZSBwb3J0aW9uIG9mXG4gICAgICogICAgICAgICAgICAgICAgICAgICAgICAgIHRoZSBsaXN0IG9mIGJsb2JzIHRvIGJlIHJldHVybmVkIHdpdGggdGhlIG5leHQgbGlzdGluZyBvcGVyYXRpb24uIFRoZVxuICAgICAqICAgICAgICAgICAgICAgICAgICAgICAgICBvcGVyYXRpb24gcmV0dXJucyB0aGUgQ29udGludWF0aW9uVG9rZW4gdmFsdWUgd2l0aGluIHRoZSByZXNwb25zZSBib2R5IGlmIHRoZVxuICAgICAqICAgICAgICAgICAgICAgICAgICAgICAgICBsaXN0aW5nIG9wZXJhdGlvbiBkaWQgbm90IHJldHVybiBhbGwgYmxvYnMgcmVtYWluaW5nIHRvIGJlIGxpc3RlZFxuICAgICAqICAgICAgICAgICAgICAgICAgICAgICAgICB3aXRoIHRoZSBjdXJyZW50IHBhZ2UuIFRoZSBDb250aW51YXRpb25Ub2tlbiB2YWx1ZSBjYW4gYmUgdXNlZCBhcyB0aGUgdmFsdWUgZm9yXG4gICAgICogICAgICAgICAgICAgICAgICAgICAgICAgIHRoZSBtYXJrZXIgcGFyYW1ldGVyIGluIGEgc3Vic2VxdWVudCBjYWxsIHRvIHJlcXVlc3QgdGhlIG5leHQgcGFnZSBvZiBsaXN0XG4gICAgICogICAgICAgICAgICAgICAgICAgICAgICAgIGl0ZW1zLiBUaGUgbWFya2VyIHZhbHVlIGlzIG9wYXF1ZSB0byB0aGUgY2xpZW50LlxuICAgICAqIEBwYXJhbSBvcHRpb25zIC0gT3B0aW9ucyB0byBsaXN0IGJsb2JzIG9wZXJhdGlvbi5cbiAgICAgKi9cbiAgICBsaXN0U2VnbWVudHMobWFya2VyXzEpIHtcbiAgICAgICAgcmV0dXJuIHRzbGliLl9fYXN5bmNHZW5lcmF0b3IodGhpcywgYXJndW1lbnRzLCBmdW5jdGlvbiogbGlzdFNlZ21lbnRzXzEobWFya2VyLCBvcHRpb25zID0ge30pIHtcbiAgICAgICAgICAgIGxldCBsaXN0QmxvYnNGbGF0U2VnbWVudFJlc3BvbnNlO1xuICAgICAgICAgICAgaWYgKCEhbWFya2VyIHx8IG1hcmtlciA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICAgICAgZG8ge1xuICAgICAgICAgICAgICAgICAgICBsaXN0QmxvYnNGbGF0U2VnbWVudFJlc3BvbnNlID0geWllbGQgdHNsaWIuX19hd2FpdCh0aGlzLmxpc3RCbG9iRmxhdFNlZ21lbnQobWFya2VyLCBvcHRpb25zKSk7XG4gICAgICAgICAgICAgICAgICAgIG1hcmtlciA9IGxpc3RCbG9ic0ZsYXRTZWdtZW50UmVzcG9uc2UuY29udGludWF0aW9uVG9rZW47XG4gICAgICAgICAgICAgICAgICAgIHlpZWxkIHlpZWxkIHRzbGliLl9fYXdhaXQoeWllbGQgdHNsaWIuX19hd2FpdChsaXN0QmxvYnNGbGF0U2VnbWVudFJlc3BvbnNlKSk7XG4gICAgICAgICAgICAgICAgfSB3aGlsZSAobWFya2VyKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIFJldHVybnMgYW4gQXN5bmNJdGVyYWJsZUl0ZXJhdG9yIG9mIHtAbGluayBCbG9iSXRlbX0gb2JqZWN0c1xuICAgICAqXG4gICAgICogQHBhcmFtIG9wdGlvbnMgLSBPcHRpb25zIHRvIGxpc3QgYmxvYnMgb3BlcmF0aW9uLlxuICAgICAqL1xuICAgIGxpc3RJdGVtcygpIHtcbiAgICAgICAgcmV0dXJuIHRzbGliLl9fYXN5bmNHZW5lcmF0b3IodGhpcywgYXJndW1lbnRzLCBmdW5jdGlvbiogbGlzdEl0ZW1zXzEob3B0aW9ucyA9IHt9KSB7XG4gICAgICAgICAgICB2YXIgX2EsIGVfMSwgX2IsIF9jO1xuICAgICAgICAgICAgbGV0IG1hcmtlcjtcbiAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgZm9yICh2YXIgX2QgPSB0cnVlLCBfZSA9IHRzbGliLl9fYXN5bmNWYWx1ZXModGhpcy5saXN0U2VnbWVudHMobWFya2VyLCBvcHRpb25zKSksIF9mOyBfZiA9IHlpZWxkIHRzbGliLl9fYXdhaXQoX2UubmV4dCgpKSwgX2EgPSBfZi5kb25lLCAhX2E7IF9kID0gdHJ1ZSkge1xuICAgICAgICAgICAgICAgICAgICBfYyA9IF9mLnZhbHVlO1xuICAgICAgICAgICAgICAgICAgICBfZCA9IGZhbHNlO1xuICAgICAgICAgICAgICAgICAgICBjb25zdCBsaXN0QmxvYnNGbGF0U2VnbWVudFJlc3BvbnNlID0gX2M7XG4gICAgICAgICAgICAgICAgICAgIHlpZWxkIHRzbGliLl9fYXdhaXQoeWllbGQqIHRzbGliLl9fYXN5bmNEZWxlZ2F0b3IodHNsaWIuX19hc3luY1ZhbHVlcyhsaXN0QmxvYnNGbGF0U2VnbWVudFJlc3BvbnNlLnNlZ21lbnQuYmxvYkl0ZW1zKSkpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGNhdGNoIChlXzFfMSkgeyBlXzEgPSB7IGVycm9yOiBlXzFfMSB9OyB9XG4gICAgICAgICAgICBmaW5hbGx5IHtcbiAgICAgICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgICAgICBpZiAoIV9kICYmICFfYSAmJiAoX2IgPSBfZS5yZXR1cm4pKSB5aWVsZCB0c2xpYi5fX2F3YWl0KF9iLmNhbGwoX2UpKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgZmluYWxseSB7IGlmIChlXzEpIHRocm93IGVfMS5lcnJvcjsgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogUmV0dXJucyBhbiBhc3luYyBpdGVyYWJsZSBpdGVyYXRvciB0byBsaXN0IGFsbCB0aGUgYmxvYnNcbiAgICAgKiB1bmRlciB0aGUgc3BlY2lmaWVkIGFjY291bnQuXG4gICAgICpcbiAgICAgKiAuYnlQYWdlKCkgcmV0dXJucyBhbiBhc3luYyBpdGVyYWJsZSBpdGVyYXRvciB0byBsaXN0IHRoZSBibG9icyBpbiBwYWdlcy5cbiAgICAgKlxuICAgICAqIEV4YW1wbGUgdXNpbmcgYGZvciBhd2FpdGAgc3ludGF4OlxuICAgICAqXG4gICAgICogYGBganNcbiAgICAgKiAvLyBHZXQgdGhlIGNvbnRhaW5lckNsaWVudCBiZWZvcmUgeW91IHJ1biB0aGVzZSBzbmlwcGV0cyxcbiAgICAgKiAvLyBDYW4gYmUgb2J0YWluZWQgZnJvbSBgYmxvYlNlcnZpY2VDbGllbnQuZ2V0Q29udGFpbmVyQ2xpZW50KFwiPHlvdXItY29udGFpbmVyLW5hbWU+XCIpO2BcbiAgICAgKiBsZXQgaSA9IDE7XG4gICAgICogZm9yIGF3YWl0IChjb25zdCBibG9iIG9mIGNvbnRhaW5lckNsaWVudC5saXN0QmxvYnNGbGF0KCkpIHtcbiAgICAgKiAgIGNvbnNvbGUubG9nKGBCbG9iICR7aSsrfTogJHtibG9iLm5hbWV9YCk7XG4gICAgICogfVxuICAgICAqIGBgYFxuICAgICAqXG4gICAgICogRXhhbXBsZSB1c2luZyBgaXRlci5uZXh0KClgOlxuICAgICAqXG4gICAgICogYGBganNcbiAgICAgKiBsZXQgaSA9IDE7XG4gICAgICogbGV0IGl0ZXIgPSBjb250YWluZXJDbGllbnQubGlzdEJsb2JzRmxhdCgpO1xuICAgICAqIGxldCBibG9iSXRlbSA9IGF3YWl0IGl0ZXIubmV4dCgpO1xuICAgICAqIHdoaWxlICghYmxvYkl0ZW0uZG9uZSkge1xuICAgICAqICAgY29uc29sZS5sb2coYEJsb2IgJHtpKyt9OiAke2Jsb2JJdGVtLnZhbHVlLm5hbWV9YCk7XG4gICAgICogICBibG9iSXRlbSA9IGF3YWl0IGl0ZXIubmV4dCgpO1xuICAgICAqIH1cbiAgICAgKiBgYGBcbiAgICAgKlxuICAgICAqIEV4YW1wbGUgdXNpbmcgYGJ5UGFnZSgpYDpcbiAgICAgKlxuICAgICAqIGBgYGpzXG4gICAgICogLy8gcGFzc2luZyBvcHRpb25hbCBtYXhQYWdlU2l6ZSBpbiB0aGUgcGFnZSBzZXR0aW5nc1xuICAgICAqIGxldCBpID0gMTtcbiAgICAgKiBmb3IgYXdhaXQgKGNvbnN0IHJlc3BvbnNlIG9mIGNvbnRhaW5lckNsaWVudC5saXN0QmxvYnNGbGF0KCkuYnlQYWdlKHsgbWF4UGFnZVNpemU6IDIwIH0pKSB7XG4gICAgICogICBmb3IgKGNvbnN0IGJsb2Igb2YgcmVzcG9uc2Uuc2VnbWVudC5ibG9iSXRlbXMpIHtcbiAgICAgKiAgICAgY29uc29sZS5sb2coYEJsb2IgJHtpKyt9OiAke2Jsb2IubmFtZX1gKTtcbiAgICAgKiAgIH1cbiAgICAgKiB9XG4gICAgICogYGBgXG4gICAgICpcbiAgICAgKiBFeGFtcGxlIHVzaW5nIHBhZ2luZyB3aXRoIGEgbWFya2VyOlxuICAgICAqXG4gICAgICogYGBganNcbiAgICAgKiBsZXQgaSA9IDE7XG4gICAgICogbGV0IGl0ZXJhdG9yID0gY29udGFpbmVyQ2xpZW50Lmxpc3RCbG9ic0ZsYXQoKS5ieVBhZ2UoeyBtYXhQYWdlU2l6ZTogMiB9KTtcbiAgICAgKiBsZXQgcmVzcG9uc2UgPSAoYXdhaXQgaXRlcmF0b3IubmV4dCgpKS52YWx1ZTtcbiAgICAgKlxuICAgICAqIC8vIFByaW50cyAyIGJsb2IgbmFtZXNcbiAgICAgKiBmb3IgKGNvbnN0IGJsb2Igb2YgcmVzcG9uc2Uuc2VnbWVudC5ibG9iSXRlbXMpIHtcbiAgICAgKiAgIGNvbnNvbGUubG9nKGBCbG9iICR7aSsrfTogJHtibG9iLm5hbWV9YCk7XG4gICAgICogfVxuICAgICAqXG4gICAgICogLy8gR2V0cyBuZXh0IG1hcmtlclxuICAgICAqIGxldCBtYXJrZXIgPSByZXNwb25zZS5jb250aW51YXRpb25Ub2tlbjtcbiAgICAgKlxuICAgICAqIC8vIFBhc3NpbmcgbmV4dCBtYXJrZXIgYXMgY29udGludWF0aW9uVG9rZW5cbiAgICAgKlxuICAgICAqIGl0ZXJhdG9yID0gY29udGFpbmVyQ2xpZW50Lmxpc3RCbG9ic0ZsYXQoKS5ieVBhZ2UoeyBjb250aW51YXRpb25Ub2tlbjogbWFya2VyLCBtYXhQYWdlU2l6ZTogMTAgfSk7XG4gICAgICogcmVzcG9uc2UgPSAoYXdhaXQgaXRlcmF0b3IubmV4dCgpKS52YWx1ZTtcbiAgICAgKlxuICAgICAqIC8vIFByaW50cyAxMCBibG9iIG5hbWVzXG4gICAgICogZm9yIChjb25zdCBibG9iIG9mIHJlc3BvbnNlLnNlZ21lbnQuYmxvYkl0ZW1zKSB7XG4gICAgICogICBjb25zb2xlLmxvZyhgQmxvYiAke2krK306ICR7YmxvYi5uYW1lfWApO1xuICAgICAqIH1cbiAgICAgKiBgYGBcbiAgICAgKlxuICAgICAqIEBwYXJhbSBvcHRpb25zIC0gT3B0aW9ucyB0byBsaXN0IGJsb2JzLlxuICAgICAqIEByZXR1cm5zIEFuIGFzeW5jSXRlcmFibGVJdGVyYXRvciB0aGF0IHN1cHBvcnRzIHBhZ2luZy5cbiAgICAgKi9cbiAgICBsaXN0QmxvYnNGbGF0KG9wdGlvbnMgPSB7fSkge1xuICAgICAgICBjb25zdCBpbmNsdWRlID0gW107XG4gICAgICAgIGlmIChvcHRpb25zLmluY2x1ZGVDb3B5KSB7XG4gICAgICAgICAgICBpbmNsdWRlLnB1c2goXCJjb3B5XCIpO1xuICAgICAgICB9XG4gICAgICAgIGlmIChvcHRpb25zLmluY2x1ZGVEZWxldGVkKSB7XG4gICAgICAgICAgICBpbmNsdWRlLnB1c2goXCJkZWxldGVkXCIpO1xuICAgICAgICB9XG4gICAgICAgIGlmIChvcHRpb25zLmluY2x1ZGVNZXRhZGF0YSkge1xuICAgICAgICAgICAgaW5jbHVkZS5wdXNoKFwibWV0YWRhdGFcIik7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKG9wdGlvbnMuaW5jbHVkZVNuYXBzaG90cykge1xuICAgICAgICAgICAgaW5jbHVkZS5wdXNoKFwic25hcHNob3RzXCIpO1xuICAgICAgICB9XG4gICAgICAgIGlmIChvcHRpb25zLmluY2x1ZGVWZXJzaW9ucykge1xuICAgICAgICAgICAgaW5jbHVkZS5wdXNoKFwidmVyc2lvbnNcIik7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKG9wdGlvbnMuaW5jbHVkZVVuY29tbWl0ZWRCbG9icykge1xuICAgICAgICAgICAgaW5jbHVkZS5wdXNoKFwidW5jb21taXR0ZWRibG9ic1wiKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAob3B0aW9ucy5pbmNsdWRlVGFncykge1xuICAgICAgICAgICAgaW5jbHVkZS5wdXNoKFwidGFnc1wiKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAob3B0aW9ucy5pbmNsdWRlRGVsZXRlZFdpdGhWZXJzaW9ucykge1xuICAgICAgICAgICAgaW5jbHVkZS5wdXNoKFwiZGVsZXRlZHdpdGh2ZXJzaW9uc1wiKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAob3B0aW9ucy5pbmNsdWRlSW1tdXRhYmlsaXR5UG9saWN5KSB7XG4gICAgICAgICAgICBpbmNsdWRlLnB1c2goXCJpbW11dGFiaWxpdHlwb2xpY3lcIik7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKG9wdGlvbnMuaW5jbHVkZUxlZ2FsSG9sZCkge1xuICAgICAgICAgICAgaW5jbHVkZS5wdXNoKFwibGVnYWxob2xkXCIpO1xuICAgICAgICB9XG4gICAgICAgIGlmIChvcHRpb25zLnByZWZpeCA9PT0gXCJcIikge1xuICAgICAgICAgICAgb3B0aW9ucy5wcmVmaXggPSB1bmRlZmluZWQ7XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgdXBkYXRlZE9wdGlvbnMgPSBPYmplY3QuYXNzaWduKE9iamVjdC5hc3NpZ24oe30sIG9wdGlvbnMpLCAoaW5jbHVkZS5sZW5ndGggPiAwID8geyBpbmNsdWRlOiBpbmNsdWRlIH0gOiB7fSkpO1xuICAgICAgICAvLyBBc3luY0l0ZXJhYmxlSXRlcmF0b3IgdG8gaXRlcmF0ZSBvdmVyIGJsb2JzXG4gICAgICAgIGNvbnN0IGl0ZXIgPSB0aGlzLmxpc3RJdGVtcyh1cGRhdGVkT3B0aW9ucyk7XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAvKipcbiAgICAgICAgICAgICAqIFRoZSBuZXh0IG1ldGhvZCwgcGFydCBvZiB0aGUgaXRlcmF0aW9uIHByb3RvY29sXG4gICAgICAgICAgICAgKi9cbiAgICAgICAgICAgIG5leHQoKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGl0ZXIubmV4dCgpO1xuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIC8qKlxuICAgICAgICAgICAgICogVGhlIGNvbm5lY3Rpb24gdG8gdGhlIGFzeW5jIGl0ZXJhdG9yLCBwYXJ0IG9mIHRoZSBpdGVyYXRpb24gcHJvdG9jb2xcbiAgICAgICAgICAgICAqL1xuICAgICAgICAgICAgW1N5bWJvbC5hc3luY0l0ZXJhdG9yXSgpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gdGhpcztcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAvKipcbiAgICAgICAgICAgICAqIFJldHVybiBhbiBBc3luY0l0ZXJhYmxlSXRlcmF0b3IgdGhhdCB3b3JrcyBhIHBhZ2UgYXQgYSB0aW1lXG4gICAgICAgICAgICAgKi9cbiAgICAgICAgICAgIGJ5UGFnZTogKHNldHRpbmdzID0ge30pID0+IHtcbiAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5saXN0U2VnbWVudHMoc2V0dGluZ3MuY29udGludWF0aW9uVG9rZW4sIE9iamVjdC5hc3NpZ24oeyBtYXhQYWdlU2l6ZTogc2V0dGluZ3MubWF4UGFnZVNpemUgfSwgdXBkYXRlZE9wdGlvbnMpKTtcbiAgICAgICAgICAgIH0sXG4gICAgICAgIH07XG4gICAgfVxuICAgIC8qKlxuICAgICAqIFJldHVybnMgYW4gQXN5bmNJdGVyYWJsZUl0ZXJhdG9yIGZvciBDb250YWluZXJMaXN0QmxvYkhpZXJhcmNoeVNlZ21lbnRSZXNwb25zZVxuICAgICAqXG4gICAgICogQHBhcmFtIGRlbGltaXRlciAtIFRoZSBjaGFyYWN0ZXIgb3Igc3RyaW5nIHVzZWQgdG8gZGVmaW5lIHRoZSB2aXJ0dWFsIGhpZXJhcmNoeVxuICAgICAqIEBwYXJhbSBtYXJrZXIgLSBBIHN0cmluZyB2YWx1ZSB0aGF0IGlkZW50aWZpZXMgdGhlIHBvcnRpb24gb2ZcbiAgICAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgdGhlIGxpc3Qgb2YgYmxvYnMgdG8gYmUgcmV0dXJuZWQgd2l0aCB0aGUgbmV4dCBsaXN0aW5nIG9wZXJhdGlvbi4gVGhlXG4gICAgICogICAgICAgICAgICAgICAgICAgICAgICAgIG9wZXJhdGlvbiByZXR1cm5zIHRoZSBDb250aW51YXRpb25Ub2tlbiB2YWx1ZSB3aXRoaW4gdGhlIHJlc3BvbnNlIGJvZHkgaWYgdGhlXG4gICAgICogICAgICAgICAgICAgICAgICAgICAgICAgIGxpc3Rpbmcgb3BlcmF0aW9uIGRpZCBub3QgcmV0dXJuIGFsbCBibG9icyByZW1haW5pbmcgdG8gYmUgbGlzdGVkXG4gICAgICogICAgICAgICAgICAgICAgICAgICAgICAgIHdpdGggdGhlIGN1cnJlbnQgcGFnZS4gVGhlIENvbnRpbnVhdGlvblRva2VuIHZhbHVlIGNhbiBiZSB1c2VkIGFzIHRoZSB2YWx1ZSBmb3JcbiAgICAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgdGhlIG1hcmtlciBwYXJhbWV0ZXIgaW4gYSBzdWJzZXF1ZW50IGNhbGwgdG8gcmVxdWVzdCB0aGUgbmV4dCBwYWdlIG9mIGxpc3RcbiAgICAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgaXRlbXMuIFRoZSBtYXJrZXIgdmFsdWUgaXMgb3BhcXVlIHRvIHRoZSBjbGllbnQuXG4gICAgICogQHBhcmFtIG9wdGlvbnMgLSBPcHRpb25zIHRvIGxpc3QgYmxvYnMgb3BlcmF0aW9uLlxuICAgICAqL1xuICAgIGxpc3RIaWVyYXJjaHlTZWdtZW50cyhkZWxpbWl0ZXJfMSwgbWFya2VyXzEpIHtcbiAgICAgICAgcmV0dXJuIHRzbGliLl9fYXN5bmNHZW5lcmF0b3IodGhpcywgYXJndW1lbnRzLCBmdW5jdGlvbiogbGlzdEhpZXJhcmNoeVNlZ21lbnRzXzEoZGVsaW1pdGVyLCBtYXJrZXIsIG9wdGlvbnMgPSB7fSkge1xuICAgICAgICAgICAgbGV0IGxpc3RCbG9ic0hpZXJhcmNoeVNlZ21lbnRSZXNwb25zZTtcbiAgICAgICAgICAgIGlmICghIW1hcmtlciB8fCBtYXJrZXIgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgICAgIGRvIHtcbiAgICAgICAgICAgICAgICAgICAgbGlzdEJsb2JzSGllcmFyY2h5U2VnbWVudFJlc3BvbnNlID0geWllbGQgdHNsaWIuX19hd2FpdCh0aGlzLmxpc3RCbG9iSGllcmFyY2h5U2VnbWVudChkZWxpbWl0ZXIsIG1hcmtlciwgb3B0aW9ucykpO1xuICAgICAgICAgICAgICAgICAgICBtYXJrZXIgPSBsaXN0QmxvYnNIaWVyYXJjaHlTZWdtZW50UmVzcG9uc2UuY29udGludWF0aW9uVG9rZW47XG4gICAgICAgICAgICAgICAgICAgIHlpZWxkIHlpZWxkIHRzbGliLl9fYXdhaXQoeWllbGQgdHNsaWIuX19hd2FpdChsaXN0QmxvYnNIaWVyYXJjaHlTZWdtZW50UmVzcG9uc2UpKTtcbiAgICAgICAgICAgICAgICB9IHdoaWxlIChtYXJrZXIpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogUmV0dXJucyBhbiBBc3luY0l0ZXJhYmxlSXRlcmF0b3IgZm9yIHtAbGluayBCbG9iUHJlZml4fSBhbmQge0BsaW5rIEJsb2JJdGVtfSBvYmplY3RzLlxuICAgICAqXG4gICAgICogQHBhcmFtIGRlbGltaXRlciAtIFRoZSBjaGFyYWN0ZXIgb3Igc3RyaW5nIHVzZWQgdG8gZGVmaW5lIHRoZSB2aXJ0dWFsIGhpZXJhcmNoeVxuICAgICAqIEBwYXJhbSBvcHRpb25zIC0gT3B0aW9ucyB0byBsaXN0IGJsb2JzIG9wZXJhdGlvbi5cbiAgICAgKi9cbiAgICBsaXN0SXRlbXNCeUhpZXJhcmNoeShkZWxpbWl0ZXJfMSkge1xuICAgICAgICByZXR1cm4gdHNsaWIuX19hc3luY0dlbmVyYXRvcih0aGlzLCBhcmd1bWVudHMsIGZ1bmN0aW9uKiBsaXN0SXRlbXNCeUhpZXJhcmNoeV8xKGRlbGltaXRlciwgb3B0aW9ucyA9IHt9KSB7XG4gICAgICAgICAgICB2YXIgX2EsIGVfMiwgX2IsIF9jO1xuICAgICAgICAgICAgbGV0IG1hcmtlcjtcbiAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgZm9yICh2YXIgX2QgPSB0cnVlLCBfZSA9IHRzbGliLl9fYXN5bmNWYWx1ZXModGhpcy5saXN0SGllcmFyY2h5U2VnbWVudHMoZGVsaW1pdGVyLCBtYXJrZXIsIG9wdGlvbnMpKSwgX2Y7IF9mID0geWllbGQgdHNsaWIuX19hd2FpdChfZS5uZXh0KCkpLCBfYSA9IF9mLmRvbmUsICFfYTsgX2QgPSB0cnVlKSB7XG4gICAgICAgICAgICAgICAgICAgIF9jID0gX2YudmFsdWU7XG4gICAgICAgICAgICAgICAgICAgIF9kID0gZmFsc2U7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IGxpc3RCbG9ic0hpZXJhcmNoeVNlZ21lbnRSZXNwb25zZSA9IF9jO1xuICAgICAgICAgICAgICAgICAgICBjb25zdCBzZWdtZW50ID0gbGlzdEJsb2JzSGllcmFyY2h5U2VnbWVudFJlc3BvbnNlLnNlZ21lbnQ7XG4gICAgICAgICAgICAgICAgICAgIGlmIChzZWdtZW50LmJsb2JQcmVmaXhlcykge1xuICAgICAgICAgICAgICAgICAgICAgICAgZm9yIChjb25zdCBwcmVmaXggb2Ygc2VnbWVudC5ibG9iUHJlZml4ZXMpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB5aWVsZCB5aWVsZCB0c2xpYi5fX2F3YWl0KE9iamVjdC5hc3NpZ24oeyBraW5kOiBcInByZWZpeFwiIH0sIHByZWZpeCkpO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIGZvciAoY29uc3QgYmxvYiBvZiBzZWdtZW50LmJsb2JJdGVtcykge1xuICAgICAgICAgICAgICAgICAgICAgICAgeWllbGQgeWllbGQgdHNsaWIuX19hd2FpdChPYmplY3QuYXNzaWduKHsga2luZDogXCJibG9iXCIgfSwgYmxvYikpO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgY2F0Y2ggKGVfMl8xKSB7IGVfMiA9IHsgZXJyb3I6IGVfMl8xIH07IH1cbiAgICAgICAgICAgIGZpbmFsbHkge1xuICAgICAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgICAgIGlmICghX2QgJiYgIV9hICYmIChfYiA9IF9lLnJldHVybikpIHlpZWxkIHRzbGliLl9fYXdhaXQoX2IuY2FsbChfZSkpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBmaW5hbGx5IHsgaWYgKGVfMikgdGhyb3cgZV8yLmVycm9yOyB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBSZXR1cm5zIGFuIGFzeW5jIGl0ZXJhYmxlIGl0ZXJhdG9yIHRvIGxpc3QgYWxsIHRoZSBibG9icyBieSBoaWVyYXJjaHkuXG4gICAgICogdW5kZXIgdGhlIHNwZWNpZmllZCBhY2NvdW50LlxuICAgICAqXG4gICAgICogLmJ5UGFnZSgpIHJldHVybnMgYW4gYXN5bmMgaXRlcmFibGUgaXRlcmF0b3IgdG8gbGlzdCB0aGUgYmxvYnMgYnkgaGllcmFyY2h5IGluIHBhZ2VzLlxuICAgICAqXG4gICAgICogRXhhbXBsZSB1c2luZyBgZm9yIGF3YWl0YCBzeW50YXg6XG4gICAgICpcbiAgICAgKiBgYGBqc1xuICAgICAqIGZvciBhd2FpdCAoY29uc3QgaXRlbSBvZiBjb250YWluZXJDbGllbnQubGlzdEJsb2JzQnlIaWVyYXJjaHkoXCIvXCIpKSB7XG4gICAgICogICBpZiAoaXRlbS5raW5kID09PSBcInByZWZpeFwiKSB7XG4gICAgICogICAgIGNvbnNvbGUubG9nKGBcXHRCbG9iUHJlZml4OiAke2l0ZW0ubmFtZX1gKTtcbiAgICAgKiAgIH0gZWxzZSB7XG4gICAgICogICAgIGNvbnNvbGUubG9nKGBcXHRCbG9iSXRlbTogbmFtZSAtICR7aXRlbS5uYW1lfWApO1xuICAgICAqICAgfVxuICAgICAqIH1cbiAgICAgKiBgYGBcbiAgICAgKlxuICAgICAqIEV4YW1wbGUgdXNpbmcgYGl0ZXIubmV4dCgpYDpcbiAgICAgKlxuICAgICAqIGBgYGpzXG4gICAgICogbGV0IGl0ZXIgPSBjb250YWluZXJDbGllbnQubGlzdEJsb2JzQnlIaWVyYXJjaHkoXCIvXCIsIHsgcHJlZml4OiBcInByZWZpeDEvXCIgfSk7XG4gICAgICogbGV0IGVudGl0eSA9IGF3YWl0IGl0ZXIubmV4dCgpO1xuICAgICAqIHdoaWxlICghZW50aXR5LmRvbmUpIHtcbiAgICAgKiAgIGxldCBpdGVtID0gZW50aXR5LnZhbHVlO1xuICAgICAqICAgaWYgKGl0ZW0ua2luZCA9PT0gXCJwcmVmaXhcIikge1xuICAgICAqICAgICBjb25zb2xlLmxvZyhgXFx0QmxvYlByZWZpeDogJHtpdGVtLm5hbWV9YCk7XG4gICAgICogICB9IGVsc2Uge1xuICAgICAqICAgICBjb25zb2xlLmxvZyhgXFx0QmxvYkl0ZW06IG5hbWUgLSAke2l0ZW0ubmFtZX1gKTtcbiAgICAgKiAgIH1cbiAgICAgKiAgIGVudGl0eSA9IGF3YWl0IGl0ZXIubmV4dCgpO1xuICAgICAqIH1cbiAgICAgKiBgYGBcbiAgICAgKlxuICAgICAqIEV4YW1wbGUgdXNpbmcgYGJ5UGFnZSgpYDpcbiAgICAgKlxuICAgICAqIGBgYGpzXG4gICAgICogY29uc29sZS5sb2coXCJMaXN0aW5nIGJsb2JzIGJ5IGhpZXJhcmNoeSBieSBwYWdlXCIpO1xuICAgICAqIGZvciBhd2FpdCAoY29uc3QgcmVzcG9uc2Ugb2YgY29udGFpbmVyQ2xpZW50Lmxpc3RCbG9ic0J5SGllcmFyY2h5KFwiL1wiKS5ieVBhZ2UoKSkge1xuICAgICAqICAgY29uc3Qgc2VnbWVudCA9IHJlc3BvbnNlLnNlZ21lbnQ7XG4gICAgICogICBpZiAoc2VnbWVudC5ibG9iUHJlZml4ZXMpIHtcbiAgICAgKiAgICAgZm9yIChjb25zdCBwcmVmaXggb2Ygc2VnbWVudC5ibG9iUHJlZml4ZXMpIHtcbiAgICAgKiAgICAgICBjb25zb2xlLmxvZyhgXFx0QmxvYlByZWZpeDogJHtwcmVmaXgubmFtZX1gKTtcbiAgICAgKiAgICAgfVxuICAgICAqICAgfVxuICAgICAqICAgZm9yIChjb25zdCBibG9iIG9mIHJlc3BvbnNlLnNlZ21lbnQuYmxvYkl0ZW1zKSB7XG4gICAgICogICAgIGNvbnNvbGUubG9nKGBcXHRCbG9iSXRlbTogbmFtZSAtICR7YmxvYi5uYW1lfWApO1xuICAgICAqICAgfVxuICAgICAqIH1cbiAgICAgKiBgYGBcbiAgICAgKlxuICAgICAqIEV4YW1wbGUgdXNpbmcgcGFnaW5nIHdpdGggYSBtYXggcGFnZSBzaXplOlxuICAgICAqXG4gICAgICogYGBganNcbiAgICAgKiBjb25zb2xlLmxvZyhcIkxpc3RpbmcgYmxvYnMgYnkgaGllcmFyY2h5IGJ5IHBhZ2UsIHNwZWNpZnlpbmcgYSBwcmVmaXggYW5kIGEgbWF4IHBhZ2Ugc2l6ZVwiKTtcbiAgICAgKlxuICAgICAqIGxldCBpID0gMTtcbiAgICAgKiBmb3IgYXdhaXQgKGNvbnN0IHJlc3BvbnNlIG9mIGNvbnRhaW5lckNsaWVudFxuICAgICAqICAgLmxpc3RCbG9ic0J5SGllcmFyY2h5KFwiL1wiLCB7IHByZWZpeDogXCJwcmVmaXgyL3N1YjEvXCIgfSlcbiAgICAgKiAgIC5ieVBhZ2UoeyBtYXhQYWdlU2l6ZTogMiB9KSkge1xuICAgICAqICAgY29uc29sZS5sb2coYFBhZ2UgJHtpKyt9YCk7XG4gICAgICogICBjb25zdCBzZWdtZW50ID0gcmVzcG9uc2Uuc2VnbWVudDtcbiAgICAgKlxuICAgICAqICAgaWYgKHNlZ21lbnQuYmxvYlByZWZpeGVzKSB7XG4gICAgICogICAgIGZvciAoY29uc3QgcHJlZml4IG9mIHNlZ21lbnQuYmxvYlByZWZpeGVzKSB7XG4gICAgICogICAgICAgY29uc29sZS5sb2coYFxcdEJsb2JQcmVmaXg6ICR7cHJlZml4Lm5hbWV9YCk7XG4gICAgICogICAgIH1cbiAgICAgKiAgIH1cbiAgICAgKlxuICAgICAqICAgZm9yIChjb25zdCBibG9iIG9mIHJlc3BvbnNlLnNlZ21lbnQuYmxvYkl0ZW1zKSB7XG4gICAgICogICAgIGNvbnNvbGUubG9nKGBcXHRCbG9iSXRlbTogbmFtZSAtICR7YmxvYi5uYW1lfWApO1xuICAgICAqICAgfVxuICAgICAqIH1cbiAgICAgKiBgYGBcbiAgICAgKlxuICAgICAqIEBwYXJhbSBkZWxpbWl0ZXIgLSBUaGUgY2hhcmFjdGVyIG9yIHN0cmluZyB1c2VkIHRvIGRlZmluZSB0aGUgdmlydHVhbCBoaWVyYXJjaHlcbiAgICAgKiBAcGFyYW0gb3B0aW9ucyAtIE9wdGlvbnMgdG8gbGlzdCBibG9icyBvcGVyYXRpb24uXG4gICAgICovXG4gICAgbGlzdEJsb2JzQnlIaWVyYXJjaHkoZGVsaW1pdGVyLCBvcHRpb25zID0ge30pIHtcbiAgICAgICAgaWYgKGRlbGltaXRlciA9PT0gXCJcIikge1xuICAgICAgICAgICAgdGhyb3cgbmV3IFJhbmdlRXJyb3IoXCJkZWxpbWl0ZXIgc2hvdWxkIGNvbnRhaW4gb25lIG9yIG1vcmUgY2hhcmFjdGVyc1wiKTtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBpbmNsdWRlID0gW107XG4gICAgICAgIGlmIChvcHRpb25zLmluY2x1ZGVDb3B5KSB7XG4gICAgICAgICAgICBpbmNsdWRlLnB1c2goXCJjb3B5XCIpO1xuICAgICAgICB9XG4gICAgICAgIGlmIChvcHRpb25zLmluY2x1ZGVEZWxldGVkKSB7XG4gICAgICAgICAgICBpbmNsdWRlLnB1c2goXCJkZWxldGVkXCIpO1xuICAgICAgICB9XG4gICAgICAgIGlmIChvcHRpb25zLmluY2x1ZGVNZXRhZGF0YSkge1xuICAgICAgICAgICAgaW5jbHVkZS5wdXNoKFwibWV0YWRhdGFcIik7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKG9wdGlvbnMuaW5jbHVkZVNuYXBzaG90cykge1xuICAgICAgICAgICAgaW5jbHVkZS5wdXNoKFwic25hcHNob3RzXCIpO1xuICAgICAgICB9XG4gICAgICAgIGlmIChvcHRpb25zLmluY2x1ZGVWZXJzaW9ucykge1xuICAgICAgICAgICAgaW5jbHVkZS5wdXNoKFwidmVyc2lvbnNcIik7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKG9wdGlvbnMuaW5jbHVkZVVuY29tbWl0ZWRCbG9icykge1xuICAgICAgICAgICAgaW5jbHVkZS5wdXNoKFwidW5jb21taXR0ZWRibG9ic1wiKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAob3B0aW9ucy5pbmNsdWRlVGFncykge1xuICAgICAgICAgICAgaW5jbHVkZS5wdXNoKFwidGFnc1wiKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAob3B0aW9ucy5pbmNsdWRlRGVsZXRlZFdpdGhWZXJzaW9ucykge1xuICAgICAgICAgICAgaW5jbHVkZS5wdXNoKFwiZGVsZXRlZHdpdGh2ZXJzaW9uc1wiKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAob3B0aW9ucy5pbmNsdWRlSW1tdXRhYmlsaXR5UG9saWN5KSB7XG4gICAgICAgICAgICBpbmNsdWRlLnB1c2goXCJpbW11dGFiaWxpdHlwb2xpY3lcIik7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKG9wdGlvbnMuaW5jbHVkZUxlZ2FsSG9sZCkge1xuICAgICAgICAgICAgaW5jbHVkZS5wdXNoKFwibGVnYWxob2xkXCIpO1xuICAgICAgICB9XG4gICAgICAgIGlmIChvcHRpb25zLnByZWZpeCA9PT0gXCJcIikge1xuICAgICAgICAgICAgb3B0aW9ucy5wcmVmaXggPSB1bmRlZmluZWQ7XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgdXBkYXRlZE9wdGlvbnMgPSBPYmplY3QuYXNzaWduKE9iamVjdC5hc3NpZ24oe30sIG9wdGlvbnMpLCAoaW5jbHVkZS5sZW5ndGggPiAwID8geyBpbmNsdWRlOiBpbmNsdWRlIH0gOiB7fSkpO1xuICAgICAgICAvLyBBc3luY0l0ZXJhYmxlSXRlcmF0b3IgdG8gaXRlcmF0ZSBvdmVyIGJsb2IgcHJlZml4ZXMgYW5kIGJsb2JzXG4gICAgICAgIGNvbnN0IGl0ZXIgPSB0aGlzLmxpc3RJdGVtc0J5SGllcmFyY2h5KGRlbGltaXRlciwgdXBkYXRlZE9wdGlvbnMpO1xuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgLyoqXG4gICAgICAgICAgICAgKiBUaGUgbmV4dCBtZXRob2QsIHBhcnQgb2YgdGhlIGl0ZXJhdGlvbiBwcm90b2NvbFxuICAgICAgICAgICAgICovXG4gICAgICAgICAgICBhc3luYyBuZXh0KCkge1xuICAgICAgICAgICAgICAgIHJldHVybiBpdGVyLm5leHQoKTtcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAvKipcbiAgICAgICAgICAgICAqIFRoZSBjb25uZWN0aW9uIHRvIHRoZSBhc3luYyBpdGVyYXRvciwgcGFydCBvZiB0aGUgaXRlcmF0aW9uIHByb3RvY29sXG4gICAgICAgICAgICAgKi9cbiAgICAgICAgICAgIFtTeW1ib2wuYXN5bmNJdGVyYXRvcl0oKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgLyoqXG4gICAgICAgICAgICAgKiBSZXR1cm4gYW4gQXN5bmNJdGVyYWJsZUl0ZXJhdG9yIHRoYXQgd29ya3MgYSBwYWdlIGF0IGEgdGltZVxuICAgICAgICAgICAgICovXG4gICAgICAgICAgICBieVBhZ2U6IChzZXR0aW5ncyA9IHt9KSA9PiB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMubGlzdEhpZXJhcmNoeVNlZ21lbnRzKGRlbGltaXRlciwgc2V0dGluZ3MuY29udGludWF0aW9uVG9rZW4sIE9iamVjdC5hc3NpZ24oeyBtYXhQYWdlU2l6ZTogc2V0dGluZ3MubWF4UGFnZVNpemUgfSwgdXBkYXRlZE9wdGlvbnMpKTtcbiAgICAgICAgICAgIH0sXG4gICAgICAgIH07XG4gICAgfVxuICAgIC8qKlxuICAgICAqIFRoZSBGaWx0ZXIgQmxvYnMgb3BlcmF0aW9uIGVuYWJsZXMgY2FsbGVycyB0byBsaXN0IGJsb2JzIGluIHRoZSBjb250YWluZXIgd2hvc2UgdGFnc1xuICAgICAqIG1hdGNoIGEgZ2l2ZW4gc2VhcmNoIGV4cHJlc3Npb24uXG4gICAgICpcbiAgICAgKiBAcGFyYW0gdGFnRmlsdGVyU3FsRXhwcmVzc2lvbiAtIFRoZSB3aGVyZSBwYXJhbWV0ZXIgZW5hYmxlcyB0aGUgY2FsbGVyIHRvIHF1ZXJ5IGJsb2JzIHdob3NlIHRhZ3MgbWF0Y2ggYSBnaXZlbiBleHByZXNzaW9uLlxuICAgICAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRoZSBnaXZlbiBleHByZXNzaW9uIG11c3QgZXZhbHVhdGUgdG8gdHJ1ZSBmb3IgYSBibG9iIHRvIGJlIHJldHVybmVkIGluIHRoZSByZXN1bHRzLlxuICAgICAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRoZVtPRGF0YSAtIEFCTkZdIGZpbHRlciBzeW50YXggcnVsZSBkZWZpbmVzIHRoZSBmb3JtYWwgZ3JhbW1hciBmb3IgdGhlIHZhbHVlIG9mIHRoZSB3aGVyZSBxdWVyeSBwYXJhbWV0ZXI7XG4gICAgICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaG93ZXZlciwgb25seSBhIHN1YnNldCBvZiB0aGUgT0RhdGEgZmlsdGVyIHN5bnRheCBpcyBzdXBwb3J0ZWQgaW4gdGhlIEJsb2Igc2VydmljZS5cbiAgICAgKiBAcGFyYW0gbWFya2VyIC0gQSBzdHJpbmcgdmFsdWUgdGhhdCBpZGVudGlmaWVzIHRoZSBwb3J0aW9uIG9mXG4gICAgICogICAgICAgICAgICAgICAgICAgICAgICAgIHRoZSBsaXN0IG9mIGJsb2JzIHRvIGJlIHJldHVybmVkIHdpdGggdGhlIG5leHQgbGlzdGluZyBvcGVyYXRpb24uIFRoZVxuICAgICAqICAgICAgICAgICAgICAgICAgICAgICAgICBvcGVyYXRpb24gcmV0dXJucyB0aGUgY29udGludWF0aW9uVG9rZW4gdmFsdWUgd2l0aGluIHRoZSByZXNwb25zZSBib2R5IGlmIHRoZVxuICAgICAqICAgICAgICAgICAgICAgICAgICAgICAgICBsaXN0aW5nIG9wZXJhdGlvbiBkaWQgbm90IHJldHVybiBhbGwgYmxvYnMgcmVtYWluaW5nIHRvIGJlIGxpc3RlZFxuICAgICAqICAgICAgICAgICAgICAgICAgICAgICAgICB3aXRoIHRoZSBjdXJyZW50IHBhZ2UuIFRoZSBjb250aW51YXRpb25Ub2tlbiB2YWx1ZSBjYW4gYmUgdXNlZCBhcyB0aGUgdmFsdWUgZm9yXG4gICAgICogICAgICAgICAgICAgICAgICAgICAgICAgIHRoZSBtYXJrZXIgcGFyYW1ldGVyIGluIGEgc3Vic2VxdWVudCBjYWxsIHRvIHJlcXVlc3QgdGhlIG5leHQgcGFnZSBvZiBsaXN0XG4gICAgICogICAgICAgICAgICAgICAgICAgICAgICAgIGl0ZW1zLiBUaGUgbWFya2VyIHZhbHVlIGlzIG9wYXF1ZSB0byB0aGUgY2xpZW50LlxuICAgICAqIEBwYXJhbSBvcHRpb25zIC0gT3B0aW9ucyB0byBmaW5kIGJsb2JzIGJ5IHRhZ3MuXG4gICAgICovXG4gICAgYXN5bmMgZmluZEJsb2JzQnlUYWdzU2VnbWVudCh0YWdGaWx0ZXJTcWxFeHByZXNzaW9uLCBtYXJrZXIsIG9wdGlvbnMgPSB7fSkge1xuICAgICAgICByZXR1cm4gdHJhY2luZ0NsaWVudC53aXRoU3BhbihcIkNvbnRhaW5lckNsaWVudC1maW5kQmxvYnNCeVRhZ3NTZWdtZW50XCIsIG9wdGlvbnMsIGFzeW5jICh1cGRhdGVkT3B0aW9ucykgPT4ge1xuICAgICAgICAgICAgY29uc3QgcmVzcG9uc2UgPSBhc3NlcnRSZXNwb25zZShhd2FpdCB0aGlzLmNvbnRhaW5lckNvbnRleHQuZmlsdGVyQmxvYnMoe1xuICAgICAgICAgICAgICAgIGFib3J0U2lnbmFsOiBvcHRpb25zLmFib3J0U2lnbmFsLFxuICAgICAgICAgICAgICAgIHdoZXJlOiB0YWdGaWx0ZXJTcWxFeHByZXNzaW9uLFxuICAgICAgICAgICAgICAgIG1hcmtlcixcbiAgICAgICAgICAgICAgICBtYXhQYWdlU2l6ZTogb3B0aW9ucy5tYXhQYWdlU2l6ZSxcbiAgICAgICAgICAgICAgICB0cmFjaW5nT3B0aW9uczogdXBkYXRlZE9wdGlvbnMudHJhY2luZ09wdGlvbnMsXG4gICAgICAgICAgICB9KSk7XG4gICAgICAgICAgICBjb25zdCB3cmFwcGVkUmVzcG9uc2UgPSBPYmplY3QuYXNzaWduKE9iamVjdC5hc3NpZ24oe30sIHJlc3BvbnNlKSwgeyBfcmVzcG9uc2U6IHJlc3BvbnNlLl9yZXNwb25zZSwgYmxvYnM6IHJlc3BvbnNlLmJsb2JzLm1hcCgoYmxvYikgPT4ge1xuICAgICAgICAgICAgICAgICAgICB2YXIgX2E7XG4gICAgICAgICAgICAgICAgICAgIGxldCB0YWdWYWx1ZSA9IFwiXCI7XG4gICAgICAgICAgICAgICAgICAgIGlmICgoKF9hID0gYmxvYi50YWdzKSA9PT0gbnVsbCB8fCBfYSA9PT0gdm9pZCAwID8gdm9pZCAwIDogX2EuYmxvYlRhZ1NldC5sZW5ndGgpID09PSAxKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICB0YWdWYWx1ZSA9IGJsb2IudGFncy5ibG9iVGFnU2V0WzBdLnZhbHVlO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBPYmplY3QuYXNzaWduKE9iamVjdC5hc3NpZ24oe30sIGJsb2IpLCB7IHRhZ3M6IHRvVGFncyhibG9iLnRhZ3MpLCB0YWdWYWx1ZSB9KTtcbiAgICAgICAgICAgICAgICB9KSB9KTtcbiAgICAgICAgICAgIHJldHVybiB3cmFwcGVkUmVzcG9uc2U7XG4gICAgICAgIH0pO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBSZXR1cm5zIGFuIEFzeW5jSXRlcmFibGVJdGVyYXRvciBmb3IgQ29udGFpbmVyRmluZEJsb2JzQnlUYWdzU2VnbWVudFJlc3BvbnNlLlxuICAgICAqXG4gICAgICogQHBhcmFtIHRhZ0ZpbHRlclNxbEV4cHJlc3Npb24gLSAgVGhlIHdoZXJlIHBhcmFtZXRlciBlbmFibGVzIHRoZSBjYWxsZXIgdG8gcXVlcnkgYmxvYnMgd2hvc2UgdGFncyBtYXRjaCBhIGdpdmVuIGV4cHJlc3Npb24uXG4gICAgICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRoZSBnaXZlbiBleHByZXNzaW9uIG11c3QgZXZhbHVhdGUgdG8gdHJ1ZSBmb3IgYSBibG9iIHRvIGJlIHJldHVybmVkIGluIHRoZSByZXN1bHRzLlxuICAgICAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUaGVbT0RhdGEgLSBBQk5GXSBmaWx0ZXIgc3ludGF4IHJ1bGUgZGVmaW5lcyB0aGUgZm9ybWFsIGdyYW1tYXIgZm9yIHRoZSB2YWx1ZSBvZiB0aGUgd2hlcmUgcXVlcnkgcGFyYW1ldGVyO1xuICAgICAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBob3dldmVyLCBvbmx5IGEgc3Vic2V0IG9mIHRoZSBPRGF0YSBmaWx0ZXIgc3ludGF4IGlzIHN1cHBvcnRlZCBpbiB0aGUgQmxvYiBzZXJ2aWNlLlxuICAgICAqIEBwYXJhbSBtYXJrZXIgLSBBIHN0cmluZyB2YWx1ZSB0aGF0IGlkZW50aWZpZXMgdGhlIHBvcnRpb24gb2ZcbiAgICAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgdGhlIGxpc3Qgb2YgYmxvYnMgdG8gYmUgcmV0dXJuZWQgd2l0aCB0aGUgbmV4dCBsaXN0aW5nIG9wZXJhdGlvbi4gVGhlXG4gICAgICogICAgICAgICAgICAgICAgICAgICAgICAgIG9wZXJhdGlvbiByZXR1cm5zIHRoZSBjb250aW51YXRpb25Ub2tlbiB2YWx1ZSB3aXRoaW4gdGhlIHJlc3BvbnNlIGJvZHkgaWYgdGhlXG4gICAgICogICAgICAgICAgICAgICAgICAgICAgICAgIGxpc3Rpbmcgb3BlcmF0aW9uIGRpZCBub3QgcmV0dXJuIGFsbCBibG9icyByZW1haW5pbmcgdG8gYmUgbGlzdGVkXG4gICAgICogICAgICAgICAgICAgICAgICAgICAgICAgIHdpdGggdGhlIGN1cnJlbnQgcGFnZS4gVGhlIGNvbnRpbnVhdGlvblRva2VuIHZhbHVlIGNhbiBiZSB1c2VkIGFzIHRoZSB2YWx1ZSBmb3JcbiAgICAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgdGhlIG1hcmtlciBwYXJhbWV0ZXIgaW4gYSBzdWJzZXF1ZW50IGNhbGwgdG8gcmVxdWVzdCB0aGUgbmV4dCBwYWdlIG9mIGxpc3RcbiAgICAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgaXRlbXMuIFRoZSBtYXJrZXIgdmFsdWUgaXMgb3BhcXVlIHRvIHRoZSBjbGllbnQuXG4gICAgICogQHBhcmFtIG9wdGlvbnMgLSBPcHRpb25zIHRvIGZpbmQgYmxvYnMgYnkgdGFncy5cbiAgICAgKi9cbiAgICBmaW5kQmxvYnNCeVRhZ3NTZWdtZW50cyh0YWdGaWx0ZXJTcWxFeHByZXNzaW9uXzEsIG1hcmtlcl8xKSB7XG4gICAgICAgIHJldHVybiB0c2xpYi5fX2FzeW5jR2VuZXJhdG9yKHRoaXMsIGFyZ3VtZW50cywgZnVuY3Rpb24qIGZpbmRCbG9ic0J5VGFnc1NlZ21lbnRzXzEodGFnRmlsdGVyU3FsRXhwcmVzc2lvbiwgbWFya2VyLCBvcHRpb25zID0ge30pIHtcbiAgICAgICAgICAgIGxldCByZXNwb25zZTtcbiAgICAgICAgICAgIGlmICghIW1hcmtlciB8fCBtYXJrZXIgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgICAgIGRvIHtcbiAgICAgICAgICAgICAgICAgICAgcmVzcG9uc2UgPSB5aWVsZCB0c2xpYi5fX2F3YWl0KHRoaXMuZmluZEJsb2JzQnlUYWdzU2VnbWVudCh0YWdGaWx0ZXJTcWxFeHByZXNzaW9uLCBtYXJrZXIsIG9wdGlvbnMpKTtcbiAgICAgICAgICAgICAgICAgICAgcmVzcG9uc2UuYmxvYnMgPSByZXNwb25zZS5ibG9icyB8fCBbXTtcbiAgICAgICAgICAgICAgICAgICAgbWFya2VyID0gcmVzcG9uc2UuY29udGludWF0aW9uVG9rZW47XG4gICAgICAgICAgICAgICAgICAgIHlpZWxkIHlpZWxkIHRzbGliLl9fYXdhaXQocmVzcG9uc2UpO1xuICAgICAgICAgICAgICAgIH0gd2hpbGUgKG1hcmtlcik7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBSZXR1cm5zIGFuIEFzeW5jSXRlcmFibGVJdGVyYXRvciBmb3IgYmxvYnMuXG4gICAgICpcbiAgICAgKiBAcGFyYW0gdGFnRmlsdGVyU3FsRXhwcmVzc2lvbiAtICBUaGUgd2hlcmUgcGFyYW1ldGVyIGVuYWJsZXMgdGhlIGNhbGxlciB0byBxdWVyeSBibG9icyB3aG9zZSB0YWdzIG1hdGNoIGEgZ2l2ZW4gZXhwcmVzc2lvbi5cbiAgICAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGhlIGdpdmVuIGV4cHJlc3Npb24gbXVzdCBldmFsdWF0ZSB0byB0cnVlIGZvciBhIGJsb2IgdG8gYmUgcmV0dXJuZWQgaW4gdGhlIHJlc3VsdHMuXG4gICAgICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRoZVtPRGF0YSAtIEFCTkZdIGZpbHRlciBzeW50YXggcnVsZSBkZWZpbmVzIHRoZSBmb3JtYWwgZ3JhbW1hciBmb3IgdGhlIHZhbHVlIG9mIHRoZSB3aGVyZSBxdWVyeSBwYXJhbWV0ZXI7XG4gICAgICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhvd2V2ZXIsIG9ubHkgYSBzdWJzZXQgb2YgdGhlIE9EYXRhIGZpbHRlciBzeW50YXggaXMgc3VwcG9ydGVkIGluIHRoZSBCbG9iIHNlcnZpY2UuXG4gICAgICogQHBhcmFtIG9wdGlvbnMgLSBPcHRpb25zIHRvIGZpbmRCbG9ic0J5VGFnc0l0ZW1zLlxuICAgICAqL1xuICAgIGZpbmRCbG9ic0J5VGFnc0l0ZW1zKHRhZ0ZpbHRlclNxbEV4cHJlc3Npb25fMSkge1xuICAgICAgICByZXR1cm4gdHNsaWIuX19hc3luY0dlbmVyYXRvcih0aGlzLCBhcmd1bWVudHMsIGZ1bmN0aW9uKiBmaW5kQmxvYnNCeVRhZ3NJdGVtc18xKHRhZ0ZpbHRlclNxbEV4cHJlc3Npb24sIG9wdGlvbnMgPSB7fSkge1xuICAgICAgICAgICAgdmFyIF9hLCBlXzMsIF9iLCBfYztcbiAgICAgICAgICAgIGxldCBtYXJrZXI7XG4gICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgIGZvciAodmFyIF9kID0gdHJ1ZSwgX2UgPSB0c2xpYi5fX2FzeW5jVmFsdWVzKHRoaXMuZmluZEJsb2JzQnlUYWdzU2VnbWVudHModGFnRmlsdGVyU3FsRXhwcmVzc2lvbiwgbWFya2VyLCBvcHRpb25zKSksIF9mOyBfZiA9IHlpZWxkIHRzbGliLl9fYXdhaXQoX2UubmV4dCgpKSwgX2EgPSBfZi5kb25lLCAhX2E7IF9kID0gdHJ1ZSkge1xuICAgICAgICAgICAgICAgICAgICBfYyA9IF9mLnZhbHVlO1xuICAgICAgICAgICAgICAgICAgICBfZCA9IGZhbHNlO1xuICAgICAgICAgICAgICAgICAgICBjb25zdCBzZWdtZW50ID0gX2M7XG4gICAgICAgICAgICAgICAgICAgIHlpZWxkIHRzbGliLl9fYXdhaXQoeWllbGQqIHRzbGliLl9fYXN5bmNEZWxlZ2F0b3IodHNsaWIuX19hc3luY1ZhbHVlcyhzZWdtZW50LmJsb2JzKSkpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGNhdGNoIChlXzNfMSkgeyBlXzMgPSB7IGVycm9yOiBlXzNfMSB9OyB9XG4gICAgICAgICAgICBmaW5hbGx5IHtcbiAgICAgICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgICAgICBpZiAoIV9kICYmICFfYSAmJiAoX2IgPSBfZS5yZXR1cm4pKSB5aWVsZCB0c2xpYi5fX2F3YWl0KF9iLmNhbGwoX2UpKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgZmluYWxseSB7IGlmIChlXzMpIHRocm93IGVfMy5lcnJvcjsgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogUmV0dXJucyBhbiBhc3luYyBpdGVyYWJsZSBpdGVyYXRvciB0byBmaW5kIGFsbCBibG9icyB3aXRoIHNwZWNpZmllZCB0YWdcbiAgICAgKiB1bmRlciB0aGUgc3BlY2lmaWVkIGNvbnRhaW5lci5cbiAgICAgKlxuICAgICAqIC5ieVBhZ2UoKSByZXR1cm5zIGFuIGFzeW5jIGl0ZXJhYmxlIGl0ZXJhdG9yIHRvIGxpc3QgdGhlIGJsb2JzIGluIHBhZ2VzLlxuICAgICAqXG4gICAgICogRXhhbXBsZSB1c2luZyBgZm9yIGF3YWl0YCBzeW50YXg6XG4gICAgICpcbiAgICAgKiBgYGBqc1xuICAgICAqIGxldCBpID0gMTtcbiAgICAgKiBmb3IgYXdhaXQgKGNvbnN0IGJsb2Igb2YgY29udGFpbmVyQ2xpZW50LmZpbmRCbG9ic0J5VGFncyhcInRhZ2tleT0ndGFndmFsdWUnXCIpKSB7XG4gICAgICogICBjb25zb2xlLmxvZyhgQmxvYiAke2krK306ICR7YmxvYi5uYW1lfWApO1xuICAgICAqIH1cbiAgICAgKiBgYGBcbiAgICAgKlxuICAgICAqIEV4YW1wbGUgdXNpbmcgYGl0ZXIubmV4dCgpYDpcbiAgICAgKlxuICAgICAqIGBgYGpzXG4gICAgICogbGV0IGkgPSAxO1xuICAgICAqIGNvbnN0IGl0ZXIgPSBjb250YWluZXJDbGllbnQuZmluZEJsb2JzQnlUYWdzKFwidGFna2V5PSd0YWd2YWx1ZSdcIik7XG4gICAgICogbGV0IGJsb2JJdGVtID0gYXdhaXQgaXRlci5uZXh0KCk7XG4gICAgICogd2hpbGUgKCFibG9iSXRlbS5kb25lKSB7XG4gICAgICogICBjb25zb2xlLmxvZyhgQmxvYiAke2krK306ICR7YmxvYkl0ZW0udmFsdWUubmFtZX1gKTtcbiAgICAgKiAgIGJsb2JJdGVtID0gYXdhaXQgaXRlci5uZXh0KCk7XG4gICAgICogfVxuICAgICAqIGBgYFxuICAgICAqXG4gICAgICogRXhhbXBsZSB1c2luZyBgYnlQYWdlKClgOlxuICAgICAqXG4gICAgICogYGBganNcbiAgICAgKiAvLyBwYXNzaW5nIG9wdGlvbmFsIG1heFBhZ2VTaXplIGluIHRoZSBwYWdlIHNldHRpbmdzXG4gICAgICogbGV0IGkgPSAxO1xuICAgICAqIGZvciBhd2FpdCAoY29uc3QgcmVzcG9uc2Ugb2YgY29udGFpbmVyQ2xpZW50LmZpbmRCbG9ic0J5VGFncyhcInRhZ2tleT0ndGFndmFsdWUnXCIpLmJ5UGFnZSh7IG1heFBhZ2VTaXplOiAyMCB9KSkge1xuICAgICAqICAgaWYgKHJlc3BvbnNlLmJsb2JzKSB7XG4gICAgICogICAgIGZvciAoY29uc3QgYmxvYiBvZiByZXNwb25zZS5ibG9icykge1xuICAgICAqICAgICAgIGNvbnNvbGUubG9nKGBCbG9iICR7aSsrfTogJHtibG9iLm5hbWV9YCk7XG4gICAgICogICAgIH1cbiAgICAgKiAgIH1cbiAgICAgKiB9XG4gICAgICogYGBgXG4gICAgICpcbiAgICAgKiBFeGFtcGxlIHVzaW5nIHBhZ2luZyB3aXRoIGEgbWFya2VyOlxuICAgICAqXG4gICAgICogYGBganNcbiAgICAgKiBsZXQgaSA9IDE7XG4gICAgICogbGV0IGl0ZXJhdG9yID0gY29udGFpbmVyQ2xpZW50LmZpbmRCbG9ic0J5VGFncyhcInRhZ2tleT0ndGFndmFsdWUnXCIpLmJ5UGFnZSh7IG1heFBhZ2VTaXplOiAyIH0pO1xuICAgICAqIGxldCByZXNwb25zZSA9IChhd2FpdCBpdGVyYXRvci5uZXh0KCkpLnZhbHVlO1xuICAgICAqXG4gICAgICogLy8gUHJpbnRzIDIgYmxvYiBuYW1lc1xuICAgICAqIGlmIChyZXNwb25zZS5ibG9icykge1xuICAgICAqICAgZm9yIChjb25zdCBibG9iIG9mIHJlc3BvbnNlLmJsb2JzKSB7XG4gICAgICogICAgIGNvbnNvbGUubG9nKGBCbG9iICR7aSsrfTogJHtibG9iLm5hbWV9YCk7XG4gICAgICogICB9XG4gICAgICogfVxuICAgICAqXG4gICAgICogLy8gR2V0cyBuZXh0IG1hcmtlclxuICAgICAqIGxldCBtYXJrZXIgPSByZXNwb25zZS5jb250aW51YXRpb25Ub2tlbjtcbiAgICAgKiAvLyBQYXNzaW5nIG5leHQgbWFya2VyIGFzIGNvbnRpbnVhdGlvblRva2VuXG4gICAgICogaXRlcmF0b3IgPSBjb250YWluZXJDbGllbnRcbiAgICAgKiAgIC5maW5kQmxvYnNCeVRhZ3MoXCJ0YWdrZXk9J3RhZ3ZhbHVlJ1wiKVxuICAgICAqICAgLmJ5UGFnZSh7IGNvbnRpbnVhdGlvblRva2VuOiBtYXJrZXIsIG1heFBhZ2VTaXplOiAxMCB9KTtcbiAgICAgKiByZXNwb25zZSA9IChhd2FpdCBpdGVyYXRvci5uZXh0KCkpLnZhbHVlO1xuICAgICAqXG4gICAgICogLy8gUHJpbnRzIGJsb2IgbmFtZXNcbiAgICAgKiBpZiAocmVzcG9uc2UuYmxvYnMpIHtcbiAgICAgKiAgIGZvciAoY29uc3QgYmxvYiBvZiByZXNwb25zZS5ibG9icykge1xuICAgICAqICAgICAgY29uc29sZS5sb2coYEJsb2IgJHtpKyt9OiAke2Jsb2IubmFtZX1gKTtcbiAgICAgKiAgIH1cbiAgICAgKiB9XG4gICAgICogYGBgXG4gICAgICpcbiAgICAgKiBAcGFyYW0gdGFnRmlsdGVyU3FsRXhwcmVzc2lvbiAtICBUaGUgd2hlcmUgcGFyYW1ldGVyIGVuYWJsZXMgdGhlIGNhbGxlciB0byBxdWVyeSBibG9icyB3aG9zZSB0YWdzIG1hdGNoIGEgZ2l2ZW4gZXhwcmVzc2lvbi5cbiAgICAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGhlIGdpdmVuIGV4cHJlc3Npb24gbXVzdCBldmFsdWF0ZSB0byB0cnVlIGZvciBhIGJsb2IgdG8gYmUgcmV0dXJuZWQgaW4gdGhlIHJlc3VsdHMuXG4gICAgICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRoZVtPRGF0YSAtIEFCTkZdIGZpbHRlciBzeW50YXggcnVsZSBkZWZpbmVzIHRoZSBmb3JtYWwgZ3JhbW1hciBmb3IgdGhlIHZhbHVlIG9mIHRoZSB3aGVyZSBxdWVyeSBwYXJhbWV0ZXI7XG4gICAgICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhvd2V2ZXIsIG9ubHkgYSBzdWJzZXQgb2YgdGhlIE9EYXRhIGZpbHRlciBzeW50YXggaXMgc3VwcG9ydGVkIGluIHRoZSBCbG9iIHNlcnZpY2UuXG4gICAgICogQHBhcmFtIG9wdGlvbnMgLSBPcHRpb25zIHRvIGZpbmQgYmxvYnMgYnkgdGFncy5cbiAgICAgKi9cbiAgICBmaW5kQmxvYnNCeVRhZ3ModGFnRmlsdGVyU3FsRXhwcmVzc2lvbiwgb3B0aW9ucyA9IHt9KSB7XG4gICAgICAgIC8vIEFzeW5jSXRlcmFibGVJdGVyYXRvciB0byBpdGVyYXRlIG92ZXIgYmxvYnNcbiAgICAgICAgY29uc3QgbGlzdFNlZ21lbnRPcHRpb25zID0gT2JqZWN0LmFzc2lnbih7fSwgb3B0aW9ucyk7XG4gICAgICAgIGNvbnN0IGl0ZXIgPSB0aGlzLmZpbmRCbG9ic0J5VGFnc0l0ZW1zKHRhZ0ZpbHRlclNxbEV4cHJlc3Npb24sIGxpc3RTZWdtZW50T3B0aW9ucyk7XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAvKipcbiAgICAgICAgICAgICAqIFRoZSBuZXh0IG1ldGhvZCwgcGFydCBvZiB0aGUgaXRlcmF0aW9uIHByb3RvY29sXG4gICAgICAgICAgICAgKi9cbiAgICAgICAgICAgIG5leHQoKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGl0ZXIubmV4dCgpO1xuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIC8qKlxuICAgICAgICAgICAgICogVGhlIGNvbm5lY3Rpb24gdG8gdGhlIGFzeW5jIGl0ZXJhdG9yLCBwYXJ0IG9mIHRoZSBpdGVyYXRpb24gcHJvdG9jb2xcbiAgICAgICAgICAgICAqL1xuICAgICAgICAgICAgW1N5bWJvbC5hc3luY0l0ZXJhdG9yXSgpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gdGhpcztcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAvKipcbiAgICAgICAgICAgICAqIFJldHVybiBhbiBBc3luY0l0ZXJhYmxlSXRlcmF0b3IgdGhhdCB3b3JrcyBhIHBhZ2UgYXQgYSB0aW1lXG4gICAgICAgICAgICAgKi9cbiAgICAgICAgICAgIGJ5UGFnZTogKHNldHRpbmdzID0ge30pID0+IHtcbiAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5maW5kQmxvYnNCeVRhZ3NTZWdtZW50cyh0YWdGaWx0ZXJTcWxFeHByZXNzaW9uLCBzZXR0aW5ncy5jb250aW51YXRpb25Ub2tlbiwgT2JqZWN0LmFzc2lnbih7IG1heFBhZ2VTaXplOiBzZXR0aW5ncy5tYXhQYWdlU2l6ZSB9LCBsaXN0U2VnbWVudE9wdGlvbnMpKTtcbiAgICAgICAgICAgIH0sXG4gICAgICAgIH07XG4gICAgfVxuICAgIC8qKlxuICAgICAqIFRoZSBHZXQgQWNjb3VudCBJbmZvcm1hdGlvbiBvcGVyYXRpb24gcmV0dXJucyB0aGUgc2t1IG5hbWUgYW5kIGFjY291bnQga2luZFxuICAgICAqIGZvciB0aGUgc3BlY2lmaWVkIGFjY291bnQuXG4gICAgICogVGhlIEdldCBBY2NvdW50IEluZm9ybWF0aW9uIG9wZXJhdGlvbiBpcyBhdmFpbGFibGUgb24gc2VydmljZSB2ZXJzaW9ucyBiZWdpbm5pbmdcbiAgICAgKiB3aXRoIHZlcnNpb24gMjAxOC0wMy0yOC5cbiAgICAgKiBAc2VlIGh0dHBzOi8vZG9jcy5taWNyb3NvZnQuY29tL2VuLXVzL3Jlc3QvYXBpL3N0b3JhZ2VzZXJ2aWNlcy9nZXQtYWNjb3VudC1pbmZvcm1hdGlvblxuICAgICAqXG4gICAgICogQHBhcmFtIG9wdGlvbnMgLSBPcHRpb25zIHRvIHRoZSBTZXJ2aWNlIEdldCBBY2NvdW50IEluZm8gb3BlcmF0aW9uLlxuICAgICAqIEByZXR1cm5zIFJlc3BvbnNlIGRhdGEgZm9yIHRoZSBTZXJ2aWNlIEdldCBBY2NvdW50IEluZm8gb3BlcmF0aW9uLlxuICAgICAqL1xuICAgIGFzeW5jIGdldEFjY291bnRJbmZvKG9wdGlvbnMgPSB7fSkge1xuICAgICAgICByZXR1cm4gdHJhY2luZ0NsaWVudC53aXRoU3BhbihcIkNvbnRhaW5lckNsaWVudC1nZXRBY2NvdW50SW5mb1wiLCBvcHRpb25zLCBhc3luYyAodXBkYXRlZE9wdGlvbnMpID0+IHtcbiAgICAgICAgICAgIHJldHVybiBhc3NlcnRSZXNwb25zZShhd2FpdCB0aGlzLmNvbnRhaW5lckNvbnRleHQuZ2V0QWNjb3VudEluZm8oe1xuICAgICAgICAgICAgICAgIGFib3J0U2lnbmFsOiBvcHRpb25zLmFib3J0U2lnbmFsLFxuICAgICAgICAgICAgICAgIHRyYWNpbmdPcHRpb25zOiB1cGRhdGVkT3B0aW9ucy50cmFjaW5nT3B0aW9ucyxcbiAgICAgICAgICAgIH0pKTtcbiAgICAgICAgfSk7XG4gICAgfVxuICAgIGdldENvbnRhaW5lck5hbWVGcm9tVXJsKCkge1xuICAgICAgICBsZXQgY29udGFpbmVyTmFtZTtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIC8vICBVUkwgbWF5IGxvb2sgbGlrZSB0aGUgZm9sbG93aW5nXG4gICAgICAgICAgICAvLyBcImh0dHBzOi8vbXlhY2NvdW50LmJsb2IuY29yZS53aW5kb3dzLm5ldC9teWNvbnRhaW5lcj9zYXNTdHJpbmdcIjtcbiAgICAgICAgICAgIC8vIFwiaHR0cHM6Ly9teWFjY291bnQuYmxvYi5jb3JlLndpbmRvd3MubmV0L215Y29udGFpbmVyXCI7XG4gICAgICAgICAgICAvLyBJUHY0L0lQdjYgYWRkcmVzcyBob3N0cywgRW5kcG9pbnRzIC0gYGh0dHA6Ly8xMjcuMC4wLjE6MTAwMDAvZGV2c3RvcmVhY2NvdW50MS9jb250YWluZXJuYW1lYFxuICAgICAgICAgICAgLy8gaHR0cDovL2xvY2FsaG9zdDoxMDAwMS9kZXZzdG9yZWFjY291bnQxL2NvbnRhaW5lcm5hbWVcbiAgICAgICAgICAgIGNvbnN0IHBhcnNlZFVybCA9IG5ldyBVUkwodGhpcy51cmwpO1xuICAgICAgICAgICAgaWYgKHBhcnNlZFVybC5ob3N0bmFtZS5zcGxpdChcIi5cIilbMV0gPT09IFwiYmxvYlwiKSB7XG4gICAgICAgICAgICAgICAgLy8gXCJodHRwczovL215YWNjb3VudC5ibG9iLmNvcmUud2luZG93cy5uZXQvY29udGFpbmVybmFtZVwiLlxuICAgICAgICAgICAgICAgIC8vIFwiaHR0cHM6Ly9jdXN0b21kb21haW4uY29tL2NvbnRhaW5lcm5hbWVcIi5cbiAgICAgICAgICAgICAgICAvLyAuZ2V0UGF0aCgpIC0+IC9jb250YWluZXJuYW1lXG4gICAgICAgICAgICAgICAgY29udGFpbmVyTmFtZSA9IHBhcnNlZFVybC5wYXRobmFtZS5zcGxpdChcIi9cIilbMV07XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIGlmIChpc0lwRW5kcG9pbnRTdHlsZShwYXJzZWRVcmwpKSB7XG4gICAgICAgICAgICAgICAgLy8gSVB2NC9JUHY2IGFkZHJlc3MgaG9zdHMuLi4gRXhhbXBsZSAtIGh0dHA6Ly8xOTIuMC4wLjEwOjEwMDAxL2RldnN0b3JlYWNjb3VudDEvY29udGFpbmVybmFtZVxuICAgICAgICAgICAgICAgIC8vIFNpbmdsZSB3b3JkIGRvbWFpbiB3aXRob3V0IGEgW2RvdF0gaW4gdGhlIGVuZHBvaW50Li4uIEV4YW1wbGUgLSBodHRwOi8vbG9jYWxob3N0OjEwMDAxL2RldnN0b3JlYWNjb3VudDEvY29udGFpbmVybmFtZVxuICAgICAgICAgICAgICAgIC8vIC5nZXRQYXRoKCkgLT4gL2RldnN0b3JlYWNjb3VudDEvY29udGFpbmVybmFtZVxuICAgICAgICAgICAgICAgIGNvbnRhaW5lck5hbWUgPSBwYXJzZWRVcmwucGF0aG5hbWUuc3BsaXQoXCIvXCIpWzJdO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgLy8gXCJodHRwczovL2N1c3RvbWRvbWFpbi5jb20vY29udGFpbmVybmFtZVwiLlxuICAgICAgICAgICAgICAgIC8vIC5nZXRQYXRoKCkgLT4gL2NvbnRhaW5lcm5hbWVcbiAgICAgICAgICAgICAgICBjb250YWluZXJOYW1lID0gcGFyc2VkVXJsLnBhdGhuYW1lLnNwbGl0KFwiL1wiKVsxXTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIC8vIGRlY29kZSB0aGUgZW5jb2RlZCBjb250YWluZXJOYW1lIC0gdG8gZ2V0IGFsbCB0aGUgc3BlY2lhbCBjaGFyYWN0ZXJzIHRoYXQgbWlnaHQgYmUgcHJlc2VudCBpbiBpdFxuICAgICAgICAgICAgY29udGFpbmVyTmFtZSA9IGRlY29kZVVSSUNvbXBvbmVudChjb250YWluZXJOYW1lKTtcbiAgICAgICAgICAgIGlmICghY29udGFpbmVyTmFtZSkge1xuICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihcIlByb3ZpZGVkIGNvbnRhaW5lck5hbWUgaXMgaW52YWxpZC5cIik7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4gY29udGFpbmVyTmFtZTtcbiAgICAgICAgfVxuICAgICAgICBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihcIlVuYWJsZSB0byBleHRyYWN0IGNvbnRhaW5lck5hbWUgd2l0aCBwcm92aWRlZCBpbmZvcm1hdGlvbi5cIik7XG4gICAgICAgIH1cbiAgICB9XG4gICAgLyoqXG4gICAgICogT25seSBhdmFpbGFibGUgZm9yIENvbnRhaW5lckNsaWVudCBjb25zdHJ1Y3RlZCB3aXRoIGEgc2hhcmVkIGtleSBjcmVkZW50aWFsLlxuICAgICAqXG4gICAgICogR2VuZXJhdGVzIGEgQmxvYiBDb250YWluZXIgU2VydmljZSBTaGFyZWQgQWNjZXNzIFNpZ25hdHVyZSAoU0FTKSBVUkkgYmFzZWQgb24gdGhlIGNsaWVudCBwcm9wZXJ0aWVzXG4gICAgICogYW5kIHBhcmFtZXRlcnMgcGFzc2VkIGluLiBUaGUgU0FTIGlzIHNpZ25lZCBieSB0aGUgc2hhcmVkIGtleSBjcmVkZW50aWFsIG9mIHRoZSBjbGllbnQuXG4gICAgICpcbiAgICAgKiBAc2VlIGh0dHBzOi8vZG9jcy5taWNyb3NvZnQuY29tL2VuLXVzL3Jlc3QvYXBpL3N0b3JhZ2VzZXJ2aWNlcy9jb25zdHJ1Y3RpbmctYS1zZXJ2aWNlLXNhc1xuICAgICAqXG4gICAgICogQHBhcmFtIG9wdGlvbnMgLSBPcHRpb25hbCBwYXJhbWV0ZXJzLlxuICAgICAqIEByZXR1cm5zIFRoZSBTQVMgVVJJIGNvbnNpc3Rpbmcgb2YgdGhlIFVSSSB0byB0aGUgcmVzb3VyY2UgcmVwcmVzZW50ZWQgYnkgdGhpcyBjbGllbnQsIGZvbGxvd2VkIGJ5IHRoZSBnZW5lcmF0ZWQgU0FTIHRva2VuLlxuICAgICAqL1xuICAgIGdlbmVyYXRlU2FzVXJsKG9wdGlvbnMpIHtcbiAgICAgICAgcmV0dXJuIG5ldyBQcm9taXNlKChyZXNvbHZlKSA9PiB7XG4gICAgICAgICAgICBpZiAoISh0aGlzLmNyZWRlbnRpYWwgaW5zdGFuY2VvZiBTdG9yYWdlU2hhcmVkS2V5Q3JlZGVudGlhbCkpIHtcbiAgICAgICAgICAgICAgICB0aHJvdyBuZXcgUmFuZ2VFcnJvcihcIkNhbiBvbmx5IGdlbmVyYXRlIHRoZSBTQVMgd2hlbiB0aGUgY2xpZW50IGlzIGluaXRpYWxpemVkIHdpdGggYSBzaGFyZWQga2V5IGNyZWRlbnRpYWxcIik7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBjb25zdCBzYXMgPSBnZW5lcmF0ZUJsb2JTQVNRdWVyeVBhcmFtZXRlcnMoT2JqZWN0LmFzc2lnbih7IGNvbnRhaW5lck5hbWU6IHRoaXMuX2NvbnRhaW5lck5hbWUgfSwgb3B0aW9ucyksIHRoaXMuY3JlZGVudGlhbCkudG9TdHJpbmcoKTtcbiAgICAgICAgICAgIHJlc29sdmUoYXBwZW5kVG9VUkxRdWVyeSh0aGlzLnVybCwgc2FzKSk7XG4gICAgICAgIH0pO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBPbmx5IGF2YWlsYWJsZSBmb3IgQ29udGFpbmVyQ2xpZW50IGNvbnN0cnVjdGVkIHdpdGggYSBzaGFyZWQga2V5IGNyZWRlbnRpYWwuXG4gICAgICpcbiAgICAgKiBHZW5lcmF0ZXMgc3RyaW5nIHRvIHNpZ24gZm9yIGEgQmxvYiBDb250YWluZXIgU2VydmljZSBTaGFyZWQgQWNjZXNzIFNpZ25hdHVyZSAoU0FTKSBVUklcbiAgICAgKiBiYXNlZCBvbiB0aGUgY2xpZW50IHByb3BlcnRpZXMgYW5kIHBhcmFtZXRlcnMgcGFzc2VkIGluLiBUaGUgU0FTIGlzIHNpZ25lZCBieSB0aGUgc2hhcmVkIGtleSBjcmVkZW50aWFsIG9mIHRoZSBjbGllbnQuXG4gICAgICpcbiAgICAgKiBAc2VlIGh0dHBzOi8vZG9jcy5taWNyb3NvZnQuY29tL2VuLXVzL3Jlc3QvYXBpL3N0b3JhZ2VzZXJ2aWNlcy9jb25zdHJ1Y3RpbmctYS1zZXJ2aWNlLXNhc1xuICAgICAqXG4gICAgICogQHBhcmFtIG9wdGlvbnMgLSBPcHRpb25hbCBwYXJhbWV0ZXJzLlxuICAgICAqIEByZXR1cm5zIFRoZSBTQVMgVVJJIGNvbnNpc3Rpbmcgb2YgdGhlIFVSSSB0byB0aGUgcmVzb3VyY2UgcmVwcmVzZW50ZWQgYnkgdGhpcyBjbGllbnQsIGZvbGxvd2VkIGJ5IHRoZSBnZW5lcmF0ZWQgU0FTIHRva2VuLlxuICAgICAqL1xuICAgIC8qIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAYXp1cmUvYXp1cmUtc2RrL3RzLW5hbWluZy1vcHRpb25zKi9cbiAgICBnZW5lcmF0ZVNhc1N0cmluZ1RvU2lnbihvcHRpb25zKSB7XG4gICAgICAgIGlmICghKHRoaXMuY3JlZGVudGlhbCBpbnN0YW5jZW9mIFN0b3JhZ2VTaGFyZWRLZXlDcmVkZW50aWFsKSkge1xuICAgICAgICAgICAgdGhyb3cgbmV3IFJhbmdlRXJyb3IoXCJDYW4gb25seSBnZW5lcmF0ZSB0aGUgU0FTIHdoZW4gdGhlIGNsaWVudCBpcyBpbml0aWFsaXplZCB3aXRoIGEgc2hhcmVkIGtleSBjcmVkZW50aWFsXCIpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBnZW5lcmF0ZUJsb2JTQVNRdWVyeVBhcmFtZXRlcnNJbnRlcm5hbChPYmplY3QuYXNzaWduKHsgY29udGFpbmVyTmFtZTogdGhpcy5fY29udGFpbmVyTmFtZSB9LCBvcHRpb25zKSwgdGhpcy5jcmVkZW50aWFsKS5zdHJpbmdUb1NpZ247XG4gICAgfVxuICAgIC8qKlxuICAgICAqIENyZWF0ZXMgYSBCbG9iQmF0Y2hDbGllbnQgb2JqZWN0IHRvIGNvbmR1Y3QgYmF0Y2ggb3BlcmF0aW9ucy5cbiAgICAgKlxuICAgICAqIEBzZWUgaHR0cHM6Ly9kb2NzLm1pY3Jvc29mdC5jb20vZW4tdXMvcmVzdC9hcGkvc3RvcmFnZXNlcnZpY2VzL2Jsb2ItYmF0Y2hcbiAgICAgKlxuICAgICAqIEByZXR1cm5zIEEgbmV3IEJsb2JCYXRjaENsaWVudCBvYmplY3QgZm9yIHRoaXMgY29udGFpbmVyLlxuICAgICAqL1xuICAgIGdldEJsb2JCYXRjaENsaWVudCgpIHtcbiAgICAgICAgcmV0dXJuIG5ldyBCbG9iQmF0Y2hDbGllbnQodGhpcy51cmwsIHRoaXMucGlwZWxpbmUpO1xuICAgIH1cbn1cblxuLy8gQ29weXJpZ2h0IChjKSBNaWNyb3NvZnQgQ29ycG9yYXRpb24uXG4vLyBMaWNlbnNlZCB1bmRlciB0aGUgTUlUIExpY2Vuc2UuXG4vKipcbiAqIE9OTFkgQVZBSUxBQkxFIElOIE5PREUuSlMgUlVOVElNRS5cbiAqXG4gKiBUaGlzIGlzIGEgaGVscGVyIGNsYXNzIHRvIGNvbnN0cnVjdCBhIHN0cmluZyByZXByZXNlbnRpbmcgdGhlIHBlcm1pc3Npb25zIGdyYW50ZWQgYnkgYW4gQWNjb3VudFNBUy4gU2V0dGluZyBhIHZhbHVlXG4gKiB0byB0cnVlIG1lYW5zIHRoYXQgYW55IFNBUyB3aGljaCB1c2VzIHRoZXNlIHBlcm1pc3Npb25zIHdpbGwgZ3JhbnQgcGVybWlzc2lvbnMgZm9yIHRoYXQgb3BlcmF0aW9uLiBPbmNlIGFsbCB0aGVcbiAqIHZhbHVlcyBhcmUgc2V0LCB0aGlzIHNob3VsZCBiZSBzZXJpYWxpemVkIHdpdGggdG9TdHJpbmcgYW5kIHNldCBhcyB0aGUgcGVybWlzc2lvbnMgZmllbGQgb24gYW5cbiAqIHtAbGluayBBY2NvdW50U0FTU2lnbmF0dXJlVmFsdWVzfSBvYmplY3QuIEl0IGlzIHBvc3NpYmxlIHRvIGNvbnN0cnVjdCB0aGUgcGVybWlzc2lvbnMgc3RyaW5nIHdpdGhvdXQgdGhpcyBjbGFzcywgYnV0XG4gKiB0aGUgb3JkZXIgb2YgdGhlIHBlcm1pc3Npb25zIGlzIHBhcnRpY3VsYXIgYW5kIHRoaXMgY2xhc3MgZ3VhcmFudGVlcyBjb3JyZWN0bmVzcy5cbiAqL1xuY2xhc3MgQWNjb3VudFNBU1Blcm1pc3Npb25zIHtcbiAgICBjb25zdHJ1Y3RvcigpIHtcbiAgICAgICAgLyoqXG4gICAgICAgICAqIFBlcm1pc3Npb24gdG8gcmVhZCByZXNvdXJjZXMgYW5kIGxpc3QgcXVldWVzIGFuZCB0YWJsZXMgZ3JhbnRlZC5cbiAgICAgICAgICovXG4gICAgICAgIHRoaXMucmVhZCA9IGZhbHNlO1xuICAgICAgICAvKipcbiAgICAgICAgICogUGVybWlzc2lvbiB0byB3cml0ZSByZXNvdXJjZXMgZ3JhbnRlZC5cbiAgICAgICAgICovXG4gICAgICAgIHRoaXMud3JpdGUgPSBmYWxzZTtcbiAgICAgICAgLyoqXG4gICAgICAgICAqIFBlcm1pc3Npb24gdG8gZGVsZXRlIGJsb2JzIGFuZCBmaWxlcyBncmFudGVkLlxuICAgICAgICAgKi9cbiAgICAgICAgdGhpcy5kZWxldGUgPSBmYWxzZTtcbiAgICAgICAgLyoqXG4gICAgICAgICAqIFBlcm1pc3Npb24gdG8gZGVsZXRlIHZlcnNpb25zIGdyYW50ZWQuXG4gICAgICAgICAqL1xuICAgICAgICB0aGlzLmRlbGV0ZVZlcnNpb24gPSBmYWxzZTtcbiAgICAgICAgLyoqXG4gICAgICAgICAqIFBlcm1pc3Npb24gdG8gbGlzdCBibG9iIGNvbnRhaW5lcnMsIGJsb2JzLCBzaGFyZXMsIGRpcmVjdG9yaWVzLCBhbmQgZmlsZXMgZ3JhbnRlZC5cbiAgICAgICAgICovXG4gICAgICAgIHRoaXMubGlzdCA9IGZhbHNlO1xuICAgICAgICAvKipcbiAgICAgICAgICogUGVybWlzc2lvbiB0byBhZGQgbWVzc2FnZXMsIHRhYmxlIGVudGl0aWVzLCBhbmQgYXBwZW5kIHRvIGJsb2JzIGdyYW50ZWQuXG4gICAgICAgICAqL1xuICAgICAgICB0aGlzLmFkZCA9IGZhbHNlO1xuICAgICAgICAvKipcbiAgICAgICAgICogUGVybWlzc2lvbiB0byBjcmVhdGUgYmxvYnMgYW5kIGZpbGVzIGdyYW50ZWQuXG4gICAgICAgICAqL1xuICAgICAgICB0aGlzLmNyZWF0ZSA9IGZhbHNlO1xuICAgICAgICAvKipcbiAgICAgICAgICogUGVybWlzc2lvbnMgdG8gdXBkYXRlIG1lc3NhZ2VzIGFuZCB0YWJsZSBlbnRpdGllcyBncmFudGVkLlxuICAgICAgICAgKi9cbiAgICAgICAgdGhpcy51cGRhdGUgPSBmYWxzZTtcbiAgICAgICAgLyoqXG4gICAgICAgICAqIFBlcm1pc3Npb24gdG8gZ2V0IGFuZCBkZWxldGUgbWVzc2FnZXMgZ3JhbnRlZC5cbiAgICAgICAgICovXG4gICAgICAgIHRoaXMucHJvY2VzcyA9IGZhbHNlO1xuICAgICAgICAvKipcbiAgICAgICAgICogU3BlY2ZpZXMgVGFnIGFjY2VzcyBncmFudGVkLlxuICAgICAgICAgKi9cbiAgICAgICAgdGhpcy50YWcgPSBmYWxzZTtcbiAgICAgICAgLyoqXG4gICAgICAgICAqIFBlcm1pc3Npb24gdG8gZmlsdGVyIGJsb2JzLlxuICAgICAgICAgKi9cbiAgICAgICAgdGhpcy5maWx0ZXIgPSBmYWxzZTtcbiAgICAgICAgLyoqXG4gICAgICAgICAqIFBlcm1pc3Npb24gdG8gc2V0IGltbXV0YWJpbGl0eSBwb2xpY3kuXG4gICAgICAgICAqL1xuICAgICAgICB0aGlzLnNldEltbXV0YWJpbGl0eVBvbGljeSA9IGZhbHNlO1xuICAgICAgICAvKipcbiAgICAgICAgICogU3BlY2lmaWVzIHRoYXQgUGVybWFuZW50IERlbGV0ZSBpcyBwZXJtaXR0ZWQuXG4gICAgICAgICAqL1xuICAgICAgICB0aGlzLnBlcm1hbmVudERlbGV0ZSA9IGZhbHNlO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBQYXJzZSBpbml0aWFsaXplcyB0aGUgQWNjb3VudFNBU1Blcm1pc3Npb25zIGZpZWxkcyBmcm9tIGEgc3RyaW5nLlxuICAgICAqXG4gICAgICogQHBhcmFtIHBlcm1pc3Npb25zIC1cbiAgICAgKi9cbiAgICBzdGF0aWMgcGFyc2UocGVybWlzc2lvbnMpIHtcbiAgICAgICAgY29uc3QgYWNjb3VudFNBU1Blcm1pc3Npb25zID0gbmV3IEFjY291bnRTQVNQZXJtaXNzaW9ucygpO1xuICAgICAgICBmb3IgKGNvbnN0IGMgb2YgcGVybWlzc2lvbnMpIHtcbiAgICAgICAgICAgIHN3aXRjaCAoYykge1xuICAgICAgICAgICAgICAgIGNhc2UgXCJyXCI6XG4gICAgICAgICAgICAgICAgICAgIGFjY291bnRTQVNQZXJtaXNzaW9ucy5yZWFkID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgY2FzZSBcIndcIjpcbiAgICAgICAgICAgICAgICAgICAgYWNjb3VudFNBU1Blcm1pc3Npb25zLndyaXRlID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgY2FzZSBcImRcIjpcbiAgICAgICAgICAgICAgICAgICAgYWNjb3VudFNBU1Blcm1pc3Npb25zLmRlbGV0ZSA9IHRydWU7XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIGNhc2UgXCJ4XCI6XG4gICAgICAgICAgICAgICAgICAgIGFjY291bnRTQVNQZXJtaXNzaW9ucy5kZWxldGVWZXJzaW9uID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgY2FzZSBcImxcIjpcbiAgICAgICAgICAgICAgICAgICAgYWNjb3VudFNBU1Blcm1pc3Npb25zLmxpc3QgPSB0cnVlO1xuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICBjYXNlIFwiYVwiOlxuICAgICAgICAgICAgICAgICAgICBhY2NvdW50U0FTUGVybWlzc2lvbnMuYWRkID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgY2FzZSBcImNcIjpcbiAgICAgICAgICAgICAgICAgICAgYWNjb3VudFNBU1Blcm1pc3Npb25zLmNyZWF0ZSA9IHRydWU7XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIGNhc2UgXCJ1XCI6XG4gICAgICAgICAgICAgICAgICAgIGFjY291bnRTQVNQZXJtaXNzaW9ucy51cGRhdGUgPSB0cnVlO1xuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICBjYXNlIFwicFwiOlxuICAgICAgICAgICAgICAgICAgICBhY2NvdW50U0FTUGVybWlzc2lvbnMucHJvY2VzcyA9IHRydWU7XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIGNhc2UgXCJ0XCI6XG4gICAgICAgICAgICAgICAgICAgIGFjY291bnRTQVNQZXJtaXNzaW9ucy50YWcgPSB0cnVlO1xuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICBjYXNlIFwiZlwiOlxuICAgICAgICAgICAgICAgICAgICBhY2NvdW50U0FTUGVybWlzc2lvbnMuZmlsdGVyID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgY2FzZSBcImlcIjpcbiAgICAgICAgICAgICAgICAgICAgYWNjb3VudFNBU1Blcm1pc3Npb25zLnNldEltbXV0YWJpbGl0eVBvbGljeSA9IHRydWU7XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIGNhc2UgXCJ5XCI6XG4gICAgICAgICAgICAgICAgICAgIGFjY291bnRTQVNQZXJtaXNzaW9ucy5wZXJtYW5lbnREZWxldGUgPSB0cnVlO1xuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgUmFuZ2VFcnJvcihgSW52YWxpZCBwZXJtaXNzaW9uIGNoYXJhY3RlcjogJHtjfWApO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiBhY2NvdW50U0FTUGVybWlzc2lvbnM7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIENyZWF0ZXMgYSB7QGxpbmsgQWNjb3VudFNBU1Blcm1pc3Npb25zfSBmcm9tIGEgcmF3IG9iamVjdCB3aGljaCBjb250YWlucyBzYW1lIGtleXMgYXMgaXRcbiAgICAgKiBhbmQgYm9vbGVhbiB2YWx1ZXMgZm9yIHRoZW0uXG4gICAgICpcbiAgICAgKiBAcGFyYW0gcGVybWlzc2lvbkxpa2UgLVxuICAgICAqL1xuICAgIHN0YXRpYyBmcm9tKHBlcm1pc3Npb25MaWtlKSB7XG4gICAgICAgIGNvbnN0IGFjY291bnRTQVNQZXJtaXNzaW9ucyA9IG5ldyBBY2NvdW50U0FTUGVybWlzc2lvbnMoKTtcbiAgICAgICAgaWYgKHBlcm1pc3Npb25MaWtlLnJlYWQpIHtcbiAgICAgICAgICAgIGFjY291bnRTQVNQZXJtaXNzaW9ucy5yZWFkID0gdHJ1ZTtcbiAgICAgICAgfVxuICAgICAgICBpZiAocGVybWlzc2lvbkxpa2Uud3JpdGUpIHtcbiAgICAgICAgICAgIGFjY291bnRTQVNQZXJtaXNzaW9ucy53cml0ZSA9IHRydWU7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHBlcm1pc3Npb25MaWtlLmRlbGV0ZSkge1xuICAgICAgICAgICAgYWNjb3VudFNBU1Blcm1pc3Npb25zLmRlbGV0ZSA9IHRydWU7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHBlcm1pc3Npb25MaWtlLmRlbGV0ZVZlcnNpb24pIHtcbiAgICAgICAgICAgIGFjY291bnRTQVNQZXJtaXNzaW9ucy5kZWxldGVWZXJzaW9uID0gdHJ1ZTtcbiAgICAgICAgfVxuICAgICAgICBpZiAocGVybWlzc2lvbkxpa2UuZmlsdGVyKSB7XG4gICAgICAgICAgICBhY2NvdW50U0FTUGVybWlzc2lvbnMuZmlsdGVyID0gdHJ1ZTtcbiAgICAgICAgfVxuICAgICAgICBpZiAocGVybWlzc2lvbkxpa2UudGFnKSB7XG4gICAgICAgICAgICBhY2NvdW50U0FTUGVybWlzc2lvbnMudGFnID0gdHJ1ZTtcbiAgICAgICAgfVxuICAgICAgICBpZiAocGVybWlzc2lvbkxpa2UubGlzdCkge1xuICAgICAgICAgICAgYWNjb3VudFNBU1Blcm1pc3Npb25zLmxpc3QgPSB0cnVlO1xuICAgICAgICB9XG4gICAgICAgIGlmIChwZXJtaXNzaW9uTGlrZS5hZGQpIHtcbiAgICAgICAgICAgIGFjY291bnRTQVNQZXJtaXNzaW9ucy5hZGQgPSB0cnVlO1xuICAgICAgICB9XG4gICAgICAgIGlmIChwZXJtaXNzaW9uTGlrZS5jcmVhdGUpIHtcbiAgICAgICAgICAgIGFjY291bnRTQVNQZXJtaXNzaW9ucy5jcmVhdGUgPSB0cnVlO1xuICAgICAgICB9XG4gICAgICAgIGlmIChwZXJtaXNzaW9uTGlrZS51cGRhdGUpIHtcbiAgICAgICAgICAgIGFjY291bnRTQVNQZXJtaXNzaW9ucy51cGRhdGUgPSB0cnVlO1xuICAgICAgICB9XG4gICAgICAgIGlmIChwZXJtaXNzaW9uTGlrZS5wcm9jZXNzKSB7XG4gICAgICAgICAgICBhY2NvdW50U0FTUGVybWlzc2lvbnMucHJvY2VzcyA9IHRydWU7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHBlcm1pc3Npb25MaWtlLnNldEltbXV0YWJpbGl0eVBvbGljeSkge1xuICAgICAgICAgICAgYWNjb3VudFNBU1Blcm1pc3Npb25zLnNldEltbXV0YWJpbGl0eVBvbGljeSA9IHRydWU7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHBlcm1pc3Npb25MaWtlLnBlcm1hbmVudERlbGV0ZSkge1xuICAgICAgICAgICAgYWNjb3VudFNBU1Blcm1pc3Npb25zLnBlcm1hbmVudERlbGV0ZSA9IHRydWU7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGFjY291bnRTQVNQZXJtaXNzaW9ucztcbiAgICB9XG4gICAgLyoqXG4gICAgICogUHJvZHVjZXMgdGhlIFNBUyBwZXJtaXNzaW9ucyBzdHJpbmcgZm9yIGFuIEF6dXJlIFN0b3JhZ2UgYWNjb3VudC5cbiAgICAgKiBDYWxsIHRoaXMgbWV0aG9kIHRvIHNldCBBY2NvdW50U0FTU2lnbmF0dXJlVmFsdWVzIFBlcm1pc3Npb25zIGZpZWxkLlxuICAgICAqXG4gICAgICogVXNpbmcgdGhpcyBtZXRob2Qgd2lsbCBndWFyYW50ZWUgdGhlIHJlc291cmNlIHR5cGVzIGFyZSBpblxuICAgICAqIGFuIG9yZGVyIGFjY2VwdGVkIGJ5IHRoZSBzZXJ2aWNlLlxuICAgICAqXG4gICAgICogQHNlZSBodHRwczovL2RvY3MubWljcm9zb2Z0LmNvbS9lbi11cy9yZXN0L2FwaS9zdG9yYWdlc2VydmljZXMvY29uc3RydWN0aW5nLWFuLWFjY291bnQtc2FzXG4gICAgICpcbiAgICAgKi9cbiAgICB0b1N0cmluZygpIHtcbiAgICAgICAgLy8gVGhlIG9yZGVyIG9mIHRoZSBjaGFyYWN0ZXJzIHNob3VsZCBiZSBhcyBzcGVjaWZpZWQgaGVyZSB0byBlbnN1cmUgY29ycmVjdG5lc3M6XG4gICAgICAgIC8vIGh0dHBzOi8vZG9jcy5taWNyb3NvZnQuY29tL2VuLXVzL3Jlc3QvYXBpL3N0b3JhZ2VzZXJ2aWNlcy9jb25zdHJ1Y3RpbmctYW4tYWNjb3VudC1zYXNcbiAgICAgICAgLy8gVXNlIGEgc3RyaW5nIGFycmF5IGluc3RlYWQgb2Ygc3RyaW5nIGNvbmNhdGVuYXRpbmcgKz0gb3BlcmF0b3IgZm9yIHBlcmZvcm1hbmNlXG4gICAgICAgIGNvbnN0IHBlcm1pc3Npb25zID0gW107XG4gICAgICAgIGlmICh0aGlzLnJlYWQpIHtcbiAgICAgICAgICAgIHBlcm1pc3Npb25zLnB1c2goXCJyXCIpO1xuICAgICAgICB9XG4gICAgICAgIGlmICh0aGlzLndyaXRlKSB7XG4gICAgICAgICAgICBwZXJtaXNzaW9ucy5wdXNoKFwid1wiKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAodGhpcy5kZWxldGUpIHtcbiAgICAgICAgICAgIHBlcm1pc3Npb25zLnB1c2goXCJkXCIpO1xuICAgICAgICB9XG4gICAgICAgIGlmICh0aGlzLmRlbGV0ZVZlcnNpb24pIHtcbiAgICAgICAgICAgIHBlcm1pc3Npb25zLnB1c2goXCJ4XCIpO1xuICAgICAgICB9XG4gICAgICAgIGlmICh0aGlzLmZpbHRlcikge1xuICAgICAgICAgICAgcGVybWlzc2lvbnMucHVzaChcImZcIik7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHRoaXMudGFnKSB7XG4gICAgICAgICAgICBwZXJtaXNzaW9ucy5wdXNoKFwidFwiKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAodGhpcy5saXN0KSB7XG4gICAgICAgICAgICBwZXJtaXNzaW9ucy5wdXNoKFwibFwiKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAodGhpcy5hZGQpIHtcbiAgICAgICAgICAgIHBlcm1pc3Npb25zLnB1c2goXCJhXCIpO1xuICAgICAgICB9XG4gICAgICAgIGlmICh0aGlzLmNyZWF0ZSkge1xuICAgICAgICAgICAgcGVybWlzc2lvbnMucHVzaChcImNcIik7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHRoaXMudXBkYXRlKSB7XG4gICAgICAgICAgICBwZXJtaXNzaW9ucy5wdXNoKFwidVwiKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAodGhpcy5wcm9jZXNzKSB7XG4gICAgICAgICAgICBwZXJtaXNzaW9ucy5wdXNoKFwicFwiKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAodGhpcy5zZXRJbW11dGFiaWxpdHlQb2xpY3kpIHtcbiAgICAgICAgICAgIHBlcm1pc3Npb25zLnB1c2goXCJpXCIpO1xuICAgICAgICB9XG4gICAgICAgIGlmICh0aGlzLnBlcm1hbmVudERlbGV0ZSkge1xuICAgICAgICAgICAgcGVybWlzc2lvbnMucHVzaChcInlcIik7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHBlcm1pc3Npb25zLmpvaW4oXCJcIik7XG4gICAgfVxufVxuXG4vLyBDb3B5cmlnaHQgKGMpIE1pY3Jvc29mdCBDb3Jwb3JhdGlvbi5cbi8vIExpY2Vuc2VkIHVuZGVyIHRoZSBNSVQgTGljZW5zZS5cbi8qKlxuICogT05MWSBBVkFJTEFCTEUgSU4gTk9ERS5KUyBSVU5USU1FLlxuICpcbiAqIFRoaXMgaXMgYSBoZWxwZXIgY2xhc3MgdG8gY29uc3RydWN0IGEgc3RyaW5nIHJlcHJlc2VudGluZyB0aGUgcmVzb3VyY2VzIGFjY2Vzc2libGUgYnkgYW4gQWNjb3VudFNBUy4gU2V0dGluZyBhIHZhbHVlXG4gKiB0byB0cnVlIG1lYW5zIHRoYXQgYW55IFNBUyB3aGljaCB1c2VzIHRoZXNlIHBlcm1pc3Npb25zIHdpbGwgZ3JhbnQgYWNjZXNzIHRvIHRoYXQgcmVzb3VyY2UgdHlwZS4gT25jZSBhbGwgdGhlXG4gKiB2YWx1ZXMgYXJlIHNldCwgdGhpcyBzaG91bGQgYmUgc2VyaWFsaXplZCB3aXRoIHRvU3RyaW5nIGFuZCBzZXQgYXMgdGhlIHJlc291cmNlcyBmaWVsZCBvbiBhblxuICoge0BsaW5rIEFjY291bnRTQVNTaWduYXR1cmVWYWx1ZXN9IG9iamVjdC4gSXQgaXMgcG9zc2libGUgdG8gY29uc3RydWN0IHRoZSByZXNvdXJjZXMgc3RyaW5nIHdpdGhvdXQgdGhpcyBjbGFzcywgYnV0XG4gKiB0aGUgb3JkZXIgb2YgdGhlIHJlc291cmNlcyBpcyBwYXJ0aWN1bGFyIGFuZCB0aGlzIGNsYXNzIGd1YXJhbnRlZXMgY29ycmVjdG5lc3MuXG4gKi9cbmNsYXNzIEFjY291bnRTQVNSZXNvdXJjZVR5cGVzIHtcbiAgICBjb25zdHJ1Y3RvcigpIHtcbiAgICAgICAgLyoqXG4gICAgICAgICAqIFBlcm1pc3Npb24gdG8gYWNjZXNzIHNlcnZpY2UgbGV2ZWwgQVBJcyBncmFudGVkLlxuICAgICAgICAgKi9cbiAgICAgICAgdGhpcy5zZXJ2aWNlID0gZmFsc2U7XG4gICAgICAgIC8qKlxuICAgICAgICAgKiBQZXJtaXNzaW9uIHRvIGFjY2VzcyBjb250YWluZXIgbGV2ZWwgQVBJcyAoQmxvYiBDb250YWluZXJzLCBUYWJsZXMsIFF1ZXVlcywgRmlsZSBTaGFyZXMpIGdyYW50ZWQuXG4gICAgICAgICAqL1xuICAgICAgICB0aGlzLmNvbnRhaW5lciA9IGZhbHNlO1xuICAgICAgICAvKipcbiAgICAgICAgICogUGVybWlzc2lvbiB0byBhY2Nlc3Mgb2JqZWN0IGxldmVsIEFQSXMgKEJsb2JzLCBUYWJsZSBFbnRpdGllcywgUXVldWUgTWVzc2FnZXMsIEZpbGVzKSBncmFudGVkLlxuICAgICAgICAgKi9cbiAgICAgICAgdGhpcy5vYmplY3QgPSBmYWxzZTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogQ3JlYXRlcyBhbiB7QGxpbmsgQWNjb3VudFNBU1Jlc291cmNlVHlwZXN9IGZyb20gdGhlIHNwZWNpZmllZCByZXNvdXJjZSB0eXBlcyBzdHJpbmcuIFRoaXMgbWV0aG9kIHdpbGwgdGhyb3cgYW5cbiAgICAgKiBFcnJvciBpZiBpdCBlbmNvdW50ZXJzIGEgY2hhcmFjdGVyIHRoYXQgZG9lcyBub3QgY29ycmVzcG9uZCB0byBhIHZhbGlkIHJlc291cmNlIHR5cGUuXG4gICAgICpcbiAgICAgKiBAcGFyYW0gcmVzb3VyY2VUeXBlcyAtXG4gICAgICovXG4gICAgc3RhdGljIHBhcnNlKHJlc291cmNlVHlwZXMpIHtcbiAgICAgICAgY29uc3QgYWNjb3VudFNBU1Jlc291cmNlVHlwZXMgPSBuZXcgQWNjb3VudFNBU1Jlc291cmNlVHlwZXMoKTtcbiAgICAgICAgZm9yIChjb25zdCBjIG9mIHJlc291cmNlVHlwZXMpIHtcbiAgICAgICAgICAgIHN3aXRjaCAoYykge1xuICAgICAgICAgICAgICAgIGNhc2UgXCJzXCI6XG4gICAgICAgICAgICAgICAgICAgIGFjY291bnRTQVNSZXNvdXJjZVR5cGVzLnNlcnZpY2UgPSB0cnVlO1xuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICBjYXNlIFwiY1wiOlxuICAgICAgICAgICAgICAgICAgICBhY2NvdW50U0FTUmVzb3VyY2VUeXBlcy5jb250YWluZXIgPSB0cnVlO1xuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICBjYXNlIFwib1wiOlxuICAgICAgICAgICAgICAgICAgICBhY2NvdW50U0FTUmVzb3VyY2VUeXBlcy5vYmplY3QgPSB0cnVlO1xuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgUmFuZ2VFcnJvcihgSW52YWxpZCByZXNvdXJjZSB0eXBlOiAke2N9YCk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGFjY291bnRTQVNSZXNvdXJjZVR5cGVzO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBDb252ZXJ0cyB0aGUgZ2l2ZW4gcmVzb3VyY2UgdHlwZXMgdG8gYSBzdHJpbmcuXG4gICAgICpcbiAgICAgKiBAc2VlIGh0dHBzOi8vZG9jcy5taWNyb3NvZnQuY29tL2VuLXVzL3Jlc3QvYXBpL3N0b3JhZ2VzZXJ2aWNlcy9jb25zdHJ1Y3RpbmctYW4tYWNjb3VudC1zYXNcbiAgICAgKlxuICAgICAqL1xuICAgIHRvU3RyaW5nKCkge1xuICAgICAgICBjb25zdCByZXNvdXJjZVR5cGVzID0gW107XG4gICAgICAgIGlmICh0aGlzLnNlcnZpY2UpIHtcbiAgICAgICAgICAgIHJlc291cmNlVHlwZXMucHVzaChcInNcIik7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHRoaXMuY29udGFpbmVyKSB7XG4gICAgICAgICAgICByZXNvdXJjZVR5cGVzLnB1c2goXCJjXCIpO1xuICAgICAgICB9XG4gICAgICAgIGlmICh0aGlzLm9iamVjdCkge1xuICAgICAgICAgICAgcmVzb3VyY2VUeXBlcy5wdXNoKFwib1wiKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gcmVzb3VyY2VUeXBlcy5qb2luKFwiXCIpO1xuICAgIH1cbn1cblxuLy8gQ29weXJpZ2h0IChjKSBNaWNyb3NvZnQgQ29ycG9yYXRpb24uXG4vLyBMaWNlbnNlZCB1bmRlciB0aGUgTUlUIExpY2Vuc2UuXG4vKipcbiAqIE9OTFkgQVZBSUxBQkxFIElOIE5PREUuSlMgUlVOVElNRS5cbiAqXG4gKiBUaGlzIGlzIGEgaGVscGVyIGNsYXNzIHRvIGNvbnN0cnVjdCBhIHN0cmluZyByZXByZXNlbnRpbmcgdGhlIHNlcnZpY2VzIGFjY2Vzc2libGUgYnkgYW4gQWNjb3VudFNBUy4gU2V0dGluZyBhIHZhbHVlXG4gKiB0byB0cnVlIG1lYW5zIHRoYXQgYW55IFNBUyB3aGljaCB1c2VzIHRoZXNlIHBlcm1pc3Npb25zIHdpbGwgZ3JhbnQgYWNjZXNzIHRvIHRoYXQgc2VydmljZS4gT25jZSBhbGwgdGhlXG4gKiB2YWx1ZXMgYXJlIHNldCwgdGhpcyBzaG91bGQgYmUgc2VyaWFsaXplZCB3aXRoIHRvU3RyaW5nIGFuZCBzZXQgYXMgdGhlIHNlcnZpY2VzIGZpZWxkIG9uIGFuXG4gKiB7QGxpbmsgQWNjb3VudFNBU1NpZ25hdHVyZVZhbHVlc30gb2JqZWN0LiBJdCBpcyBwb3NzaWJsZSB0byBjb25zdHJ1Y3QgdGhlIHNlcnZpY2VzIHN0cmluZyB3aXRob3V0IHRoaXMgY2xhc3MsIGJ1dFxuICogdGhlIG9yZGVyIG9mIHRoZSBzZXJ2aWNlcyBpcyBwYXJ0aWN1bGFyIGFuZCB0aGlzIGNsYXNzIGd1YXJhbnRlZXMgY29ycmVjdG5lc3MuXG4gKi9cbmNsYXNzIEFjY291bnRTQVNTZXJ2aWNlcyB7XG4gICAgY29uc3RydWN0b3IoKSB7XG4gICAgICAgIC8qKlxuICAgICAgICAgKiBQZXJtaXNzaW9uIHRvIGFjY2VzcyBibG9iIHJlc291cmNlcyBncmFudGVkLlxuICAgICAgICAgKi9cbiAgICAgICAgdGhpcy5ibG9iID0gZmFsc2U7XG4gICAgICAgIC8qKlxuICAgICAgICAgKiBQZXJtaXNzaW9uIHRvIGFjY2VzcyBmaWxlIHJlc291cmNlcyBncmFudGVkLlxuICAgICAgICAgKi9cbiAgICAgICAgdGhpcy5maWxlID0gZmFsc2U7XG4gICAgICAgIC8qKlxuICAgICAgICAgKiBQZXJtaXNzaW9uIHRvIGFjY2VzcyBxdWV1ZSByZXNvdXJjZXMgZ3JhbnRlZC5cbiAgICAgICAgICovXG4gICAgICAgIHRoaXMucXVldWUgPSBmYWxzZTtcbiAgICAgICAgLyoqXG4gICAgICAgICAqIFBlcm1pc3Npb24gdG8gYWNjZXNzIHRhYmxlIHJlc291cmNlcyBncmFudGVkLlxuICAgICAgICAgKi9cbiAgICAgICAgdGhpcy50YWJsZSA9IGZhbHNlO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBDcmVhdGVzIGFuIHtAbGluayBBY2NvdW50U0FTU2VydmljZXN9IGZyb20gdGhlIHNwZWNpZmllZCBzZXJ2aWNlcyBzdHJpbmcuIFRoaXMgbWV0aG9kIHdpbGwgdGhyb3cgYW5cbiAgICAgKiBFcnJvciBpZiBpdCBlbmNvdW50ZXJzIGEgY2hhcmFjdGVyIHRoYXQgZG9lcyBub3QgY29ycmVzcG9uZCB0byBhIHZhbGlkIHNlcnZpY2UuXG4gICAgICpcbiAgICAgKiBAcGFyYW0gc2VydmljZXMgLVxuICAgICAqL1xuICAgIHN0YXRpYyBwYXJzZShzZXJ2aWNlcykge1xuICAgICAgICBjb25zdCBhY2NvdW50U0FTU2VydmljZXMgPSBuZXcgQWNjb3VudFNBU1NlcnZpY2VzKCk7XG4gICAgICAgIGZvciAoY29uc3QgYyBvZiBzZXJ2aWNlcykge1xuICAgICAgICAgICAgc3dpdGNoIChjKSB7XG4gICAgICAgICAgICAgICAgY2FzZSBcImJcIjpcbiAgICAgICAgICAgICAgICAgICAgYWNjb3VudFNBU1NlcnZpY2VzLmJsb2IgPSB0cnVlO1xuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICBjYXNlIFwiZlwiOlxuICAgICAgICAgICAgICAgICAgICBhY2NvdW50U0FTU2VydmljZXMuZmlsZSA9IHRydWU7XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIGNhc2UgXCJxXCI6XG4gICAgICAgICAgICAgICAgICAgIGFjY291bnRTQVNTZXJ2aWNlcy5xdWV1ZSA9IHRydWU7XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIGNhc2UgXCJ0XCI6XG4gICAgICAgICAgICAgICAgICAgIGFjY291bnRTQVNTZXJ2aWNlcy50YWJsZSA9IHRydWU7XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBSYW5nZUVycm9yKGBJbnZhbGlkIHNlcnZpY2UgY2hhcmFjdGVyOiAke2N9YCk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGFjY291bnRTQVNTZXJ2aWNlcztcbiAgICB9XG4gICAgLyoqXG4gICAgICogQ29udmVydHMgdGhlIGdpdmVuIHNlcnZpY2VzIHRvIGEgc3RyaW5nLlxuICAgICAqXG4gICAgICovXG4gICAgdG9TdHJpbmcoKSB7XG4gICAgICAgIGNvbnN0IHNlcnZpY2VzID0gW107XG4gICAgICAgIGlmICh0aGlzLmJsb2IpIHtcbiAgICAgICAgICAgIHNlcnZpY2VzLnB1c2goXCJiXCIpO1xuICAgICAgICB9XG4gICAgICAgIGlmICh0aGlzLnRhYmxlKSB7XG4gICAgICAgICAgICBzZXJ2aWNlcy5wdXNoKFwidFwiKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAodGhpcy5xdWV1ZSkge1xuICAgICAgICAgICAgc2VydmljZXMucHVzaChcInFcIik7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHRoaXMuZmlsZSkge1xuICAgICAgICAgICAgc2VydmljZXMucHVzaChcImZcIik7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHNlcnZpY2VzLmpvaW4oXCJcIik7XG4gICAgfVxufVxuXG4vLyBDb3B5cmlnaHQgKGMpIE1pY3Jvc29mdCBDb3Jwb3JhdGlvbi5cbi8vIExpY2Vuc2VkIHVuZGVyIHRoZSBNSVQgTGljZW5zZS5cbi8qKlxuICogT05MWSBBVkFJTEFCTEUgSU4gTk9ERS5KUyBSVU5USU1FLlxuICpcbiAqIEdlbmVyYXRlcyBhIHtAbGluayBTQVNRdWVyeVBhcmFtZXRlcnN9IG9iamVjdCB3aGljaCBjb250YWlucyBhbGwgU0FTIHF1ZXJ5IHBhcmFtZXRlcnMgbmVlZGVkIHRvIG1ha2UgYW4gYWN0dWFsXG4gKiBSRVNUIHJlcXVlc3QuXG4gKlxuICogQHNlZSBodHRwczovL2RvY3MubWljcm9zb2Z0LmNvbS9lbi11cy9yZXN0L2FwaS9zdG9yYWdlc2VydmljZXMvY29uc3RydWN0aW5nLWFuLWFjY291bnQtc2FzXG4gKlxuICogQHBhcmFtIGFjY291bnRTQVNTaWduYXR1cmVWYWx1ZXMgLVxuICogQHBhcmFtIHNoYXJlZEtleUNyZWRlbnRpYWwgLVxuICovXG5mdW5jdGlvbiBnZW5lcmF0ZUFjY291bnRTQVNRdWVyeVBhcmFtZXRlcnMoYWNjb3VudFNBU1NpZ25hdHVyZVZhbHVlcywgc2hhcmVkS2V5Q3JlZGVudGlhbCkge1xuICAgIHJldHVybiBnZW5lcmF0ZUFjY291bnRTQVNRdWVyeVBhcmFtZXRlcnNJbnRlcm5hbChhY2NvdW50U0FTU2lnbmF0dXJlVmFsdWVzLCBzaGFyZWRLZXlDcmVkZW50aWFsKVxuICAgICAgICAuc2FzUXVlcnlQYXJhbWV0ZXJzO1xufVxuZnVuY3Rpb24gZ2VuZXJhdGVBY2NvdW50U0FTUXVlcnlQYXJhbWV0ZXJzSW50ZXJuYWwoYWNjb3VudFNBU1NpZ25hdHVyZVZhbHVlcywgc2hhcmVkS2V5Q3JlZGVudGlhbCkge1xuICAgIGNvbnN0IHZlcnNpb24gPSBhY2NvdW50U0FTU2lnbmF0dXJlVmFsdWVzLnZlcnNpb25cbiAgICAgICAgPyBhY2NvdW50U0FTU2lnbmF0dXJlVmFsdWVzLnZlcnNpb25cbiAgICAgICAgOiBTRVJWSUNFX1ZFUlNJT047XG4gICAgaWYgKGFjY291bnRTQVNTaWduYXR1cmVWYWx1ZXMucGVybWlzc2lvbnMgJiZcbiAgICAgICAgYWNjb3VudFNBU1NpZ25hdHVyZVZhbHVlcy5wZXJtaXNzaW9ucy5zZXRJbW11dGFiaWxpdHlQb2xpY3kgJiZcbiAgICAgICAgdmVyc2lvbiA8IFwiMjAyMC0wOC0wNFwiKSB7XG4gICAgICAgIHRocm93IFJhbmdlRXJyb3IoXCIndmVyc2lvbicgbXVzdCBiZSA+PSAnMjAyMC0wOC0wNCcgd2hlbiBwcm92aWRlZCAnaScgcGVybWlzc2lvbi5cIik7XG4gICAgfVxuICAgIGlmIChhY2NvdW50U0FTU2lnbmF0dXJlVmFsdWVzLnBlcm1pc3Npb25zICYmXG4gICAgICAgIGFjY291bnRTQVNTaWduYXR1cmVWYWx1ZXMucGVybWlzc2lvbnMuZGVsZXRlVmVyc2lvbiAmJlxuICAgICAgICB2ZXJzaW9uIDwgXCIyMDE5LTEwLTEwXCIpIHtcbiAgICAgICAgdGhyb3cgUmFuZ2VFcnJvcihcIid2ZXJzaW9uJyBtdXN0IGJlID49ICcyMDE5LTEwLTEwJyB3aGVuIHByb3ZpZGVkICd4JyBwZXJtaXNzaW9uLlwiKTtcbiAgICB9XG4gICAgaWYgKGFjY291bnRTQVNTaWduYXR1cmVWYWx1ZXMucGVybWlzc2lvbnMgJiZcbiAgICAgICAgYWNjb3VudFNBU1NpZ25hdHVyZVZhbHVlcy5wZXJtaXNzaW9ucy5wZXJtYW5lbnREZWxldGUgJiZcbiAgICAgICAgdmVyc2lvbiA8IFwiMjAxOS0xMC0xMFwiKSB7XG4gICAgICAgIHRocm93IFJhbmdlRXJyb3IoXCIndmVyc2lvbicgbXVzdCBiZSA+PSAnMjAxOS0xMC0xMCcgd2hlbiBwcm92aWRlZCAneScgcGVybWlzc2lvbi5cIik7XG4gICAgfVxuICAgIGlmIChhY2NvdW50U0FTU2lnbmF0dXJlVmFsdWVzLnBlcm1pc3Npb25zICYmXG4gICAgICAgIGFjY291bnRTQVNTaWduYXR1cmVWYWx1ZXMucGVybWlzc2lvbnMudGFnICYmXG4gICAgICAgIHZlcnNpb24gPCBcIjIwMTktMTItMTJcIikge1xuICAgICAgICB0aHJvdyBSYW5nZUVycm9yKFwiJ3ZlcnNpb24nIG11c3QgYmUgPj0gJzIwMTktMTItMTInIHdoZW4gcHJvdmlkZWQgJ3QnIHBlcm1pc3Npb24uXCIpO1xuICAgIH1cbiAgICBpZiAoYWNjb3VudFNBU1NpZ25hdHVyZVZhbHVlcy5wZXJtaXNzaW9ucyAmJlxuICAgICAgICBhY2NvdW50U0FTU2lnbmF0dXJlVmFsdWVzLnBlcm1pc3Npb25zLmZpbHRlciAmJlxuICAgICAgICB2ZXJzaW9uIDwgXCIyMDE5LTEyLTEyXCIpIHtcbiAgICAgICAgdGhyb3cgUmFuZ2VFcnJvcihcIid2ZXJzaW9uJyBtdXN0IGJlID49ICcyMDE5LTEyLTEyJyB3aGVuIHByb3ZpZGVkICdmJyBwZXJtaXNzaW9uLlwiKTtcbiAgICB9XG4gICAgaWYgKGFjY291bnRTQVNTaWduYXR1cmVWYWx1ZXMuZW5jcnlwdGlvblNjb3BlICYmIHZlcnNpb24gPCBcIjIwMjAtMTItMDZcIikge1xuICAgICAgICB0aHJvdyBSYW5nZUVycm9yKFwiJ3ZlcnNpb24nIG11c3QgYmUgPj0gJzIwMjAtMTItMDYnIHdoZW4gcHJvdmlkZWQgJ2VuY3J5cHRpb25TY29wZScgaW4gU0FTLlwiKTtcbiAgICB9XG4gICAgY29uc3QgcGFyc2VkUGVybWlzc2lvbnMgPSBBY2NvdW50U0FTUGVybWlzc2lvbnMucGFyc2UoYWNjb3VudFNBU1NpZ25hdHVyZVZhbHVlcy5wZXJtaXNzaW9ucy50b1N0cmluZygpKTtcbiAgICBjb25zdCBwYXJzZWRTZXJ2aWNlcyA9IEFjY291bnRTQVNTZXJ2aWNlcy5wYXJzZShhY2NvdW50U0FTU2lnbmF0dXJlVmFsdWVzLnNlcnZpY2VzKS50b1N0cmluZygpO1xuICAgIGNvbnN0IHBhcnNlZFJlc291cmNlVHlwZXMgPSBBY2NvdW50U0FTUmVzb3VyY2VUeXBlcy5wYXJzZShhY2NvdW50U0FTU2lnbmF0dXJlVmFsdWVzLnJlc291cmNlVHlwZXMpLnRvU3RyaW5nKCk7XG4gICAgbGV0IHN0cmluZ1RvU2lnbjtcbiAgICBpZiAodmVyc2lvbiA+PSBcIjIwMjAtMTItMDZcIikge1xuICAgICAgICBzdHJpbmdUb1NpZ24gPSBbXG4gICAgICAgICAgICBzaGFyZWRLZXlDcmVkZW50aWFsLmFjY291bnROYW1lLFxuICAgICAgICAgICAgcGFyc2VkUGVybWlzc2lvbnMsXG4gICAgICAgICAgICBwYXJzZWRTZXJ2aWNlcyxcbiAgICAgICAgICAgIHBhcnNlZFJlc291cmNlVHlwZXMsXG4gICAgICAgICAgICBhY2NvdW50U0FTU2lnbmF0dXJlVmFsdWVzLnN0YXJ0c09uXG4gICAgICAgICAgICAgICAgPyB0cnVuY2F0ZWRJU084MDYxRGF0ZShhY2NvdW50U0FTU2lnbmF0dXJlVmFsdWVzLnN0YXJ0c09uLCBmYWxzZSlcbiAgICAgICAgICAgICAgICA6IFwiXCIsXG4gICAgICAgICAgICB0cnVuY2F0ZWRJU084MDYxRGF0ZShhY2NvdW50U0FTU2lnbmF0dXJlVmFsdWVzLmV4cGlyZXNPbiwgZmFsc2UpLFxuICAgICAgICAgICAgYWNjb3VudFNBU1NpZ25hdHVyZVZhbHVlcy5pcFJhbmdlID8gaXBSYW5nZVRvU3RyaW5nKGFjY291bnRTQVNTaWduYXR1cmVWYWx1ZXMuaXBSYW5nZSkgOiBcIlwiLFxuICAgICAgICAgICAgYWNjb3VudFNBU1NpZ25hdHVyZVZhbHVlcy5wcm90b2NvbCA/IGFjY291bnRTQVNTaWduYXR1cmVWYWx1ZXMucHJvdG9jb2wgOiBcIlwiLFxuICAgICAgICAgICAgdmVyc2lvbixcbiAgICAgICAgICAgIGFjY291bnRTQVNTaWduYXR1cmVWYWx1ZXMuZW5jcnlwdGlvblNjb3BlID8gYWNjb3VudFNBU1NpZ25hdHVyZVZhbHVlcy5lbmNyeXB0aW9uU2NvcGUgOiBcIlwiLFxuICAgICAgICAgICAgXCJcIiwgLy8gQWNjb3VudCBTQVMgcmVxdWlyZXMgYW4gYWRkaXRpb25hbCBuZXdsaW5lIGNoYXJhY3RlclxuICAgICAgICBdLmpvaW4oXCJcXG5cIik7XG4gICAgfVxuICAgIGVsc2Uge1xuICAgICAgICBzdHJpbmdUb1NpZ24gPSBbXG4gICAgICAgICAgICBzaGFyZWRLZXlDcmVkZW50aWFsLmFjY291bnROYW1lLFxuICAgICAgICAgICAgcGFyc2VkUGVybWlzc2lvbnMsXG4gICAgICAgICAgICBwYXJzZWRTZXJ2aWNlcyxcbiAgICAgICAgICAgIHBhcnNlZFJlc291cmNlVHlwZXMsXG4gICAgICAgICAgICBhY2NvdW50U0FTU2lnbmF0dXJlVmFsdWVzLnN0YXJ0c09uXG4gICAgICAgICAgICAgICAgPyB0cnVuY2F0ZWRJU084MDYxRGF0ZShhY2NvdW50U0FTU2lnbmF0dXJlVmFsdWVzLnN0YXJ0c09uLCBmYWxzZSlcbiAgICAgICAgICAgICAgICA6IFwiXCIsXG4gICAgICAgICAgICB0cnVuY2F0ZWRJU084MDYxRGF0ZShhY2NvdW50U0FTU2lnbmF0dXJlVmFsdWVzLmV4cGlyZXNPbiwgZmFsc2UpLFxuICAgICAgICAgICAgYWNjb3VudFNBU1NpZ25hdHVyZVZhbHVlcy5pcFJhbmdlID8gaXBSYW5nZVRvU3RyaW5nKGFjY291bnRTQVNTaWduYXR1cmVWYWx1ZXMuaXBSYW5nZSkgOiBcIlwiLFxuICAgICAgICAgICAgYWNjb3VudFNBU1NpZ25hdHVyZVZhbHVlcy5wcm90b2NvbCA/IGFjY291bnRTQVNTaWduYXR1cmVWYWx1ZXMucHJvdG9jb2wgOiBcIlwiLFxuICAgICAgICAgICAgdmVyc2lvbixcbiAgICAgICAgICAgIFwiXCIsIC8vIEFjY291bnQgU0FTIHJlcXVpcmVzIGFuIGFkZGl0aW9uYWwgbmV3bGluZSBjaGFyYWN0ZXJcbiAgICAgICAgXS5qb2luKFwiXFxuXCIpO1xuICAgIH1cbiAgICBjb25zdCBzaWduYXR1cmUgPSBzaGFyZWRLZXlDcmVkZW50aWFsLmNvbXB1dGVITUFDU0hBMjU2KHN0cmluZ1RvU2lnbik7XG4gICAgcmV0dXJuIHtcbiAgICAgICAgc2FzUXVlcnlQYXJhbWV0ZXJzOiBuZXcgU0FTUXVlcnlQYXJhbWV0ZXJzKHZlcnNpb24sIHNpZ25hdHVyZSwgcGFyc2VkUGVybWlzc2lvbnMudG9TdHJpbmcoKSwgcGFyc2VkU2VydmljZXMsIHBhcnNlZFJlc291cmNlVHlwZXMsIGFjY291bnRTQVNTaWduYXR1cmVWYWx1ZXMucHJvdG9jb2wsIGFjY291bnRTQVNTaWduYXR1cmVWYWx1ZXMuc3RhcnRzT24sIGFjY291bnRTQVNTaWduYXR1cmVWYWx1ZXMuZXhwaXJlc09uLCBhY2NvdW50U0FTU2lnbmF0dXJlVmFsdWVzLmlwUmFuZ2UsIHVuZGVmaW5lZCwgdW5kZWZpbmVkLCB1bmRlZmluZWQsIHVuZGVmaW5lZCwgdW5kZWZpbmVkLCB1bmRlZmluZWQsIHVuZGVmaW5lZCwgdW5kZWZpbmVkLCB1bmRlZmluZWQsIHVuZGVmaW5lZCwgYWNjb3VudFNBU1NpZ25hdHVyZVZhbHVlcy5lbmNyeXB0aW9uU2NvcGUpLFxuICAgICAgICBzdHJpbmdUb1NpZ246IHN0cmluZ1RvU2lnbixcbiAgICB9O1xufVxuXG4vKipcbiAqIEEgQmxvYlNlcnZpY2VDbGllbnQgcmVwcmVzZW50cyBhIENsaWVudCB0byB0aGUgQXp1cmUgU3RvcmFnZSBCbG9iIHNlcnZpY2UgYWxsb3dpbmcgeW91XG4gKiB0byBtYW5pcHVsYXRlIGJsb2IgY29udGFpbmVycy5cbiAqL1xuY2xhc3MgQmxvYlNlcnZpY2VDbGllbnQgZXh0ZW5kcyBTdG9yYWdlQ2xpZW50IHtcbiAgICAvKipcbiAgICAgKlxuICAgICAqIENyZWF0ZXMgYW4gaW5zdGFuY2Ugb2YgQmxvYlNlcnZpY2VDbGllbnQgZnJvbSBjb25uZWN0aW9uIHN0cmluZy5cbiAgICAgKlxuICAgICAqIEBwYXJhbSBjb25uZWN0aW9uU3RyaW5nIC0gQWNjb3VudCBjb25uZWN0aW9uIHN0cmluZyBvciBhIFNBUyBjb25uZWN0aW9uIHN0cmluZyBvZiBhbiBBenVyZSBzdG9yYWdlIGFjY291bnQuXG4gICAgICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgWyBOb3RlIC0gQWNjb3VudCBjb25uZWN0aW9uIHN0cmluZyBjYW4gb25seSBiZSB1c2VkIGluIE5PREUuSlMgcnVudGltZS4gXVxuICAgICAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFjY291bnQgY29ubmVjdGlvbiBzdHJpbmcgZXhhbXBsZSAtXG4gICAgICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYERlZmF1bHRFbmRwb2ludHNQcm90b2NvbD1odHRwcztBY2NvdW50TmFtZT1teWFjY291bnQ7QWNjb3VudEtleT1hY2NvdW50S2V5O0VuZHBvaW50U3VmZml4PWNvcmUud2luZG93cy5uZXRgXG4gICAgICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU0FTIGNvbm5lY3Rpb24gc3RyaW5nIGV4YW1wbGUgLVxuICAgICAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGBCbG9iRW5kcG9pbnQ9aHR0cHM6Ly9teWFjY291bnQuYmxvYi5jb3JlLndpbmRvd3MubmV0LztRdWV1ZUVuZHBvaW50PWh0dHBzOi8vbXlhY2NvdW50LnF1ZXVlLmNvcmUud2luZG93cy5uZXQvO0ZpbGVFbmRwb2ludD1odHRwczovL215YWNjb3VudC5maWxlLmNvcmUud2luZG93cy5uZXQvO1RhYmxlRW5kcG9pbnQ9aHR0cHM6Ly9teWFjY291bnQudGFibGUuY29yZS53aW5kb3dzLm5ldC87U2hhcmVkQWNjZXNzU2lnbmF0dXJlPXNhc1N0cmluZ2BcbiAgICAgKiBAcGFyYW0gb3B0aW9ucyAtIE9wdGlvbmFsLiBPcHRpb25zIHRvIGNvbmZpZ3VyZSB0aGUgSFRUUCBwaXBlbGluZS5cbiAgICAgKi9cbiAgICBzdGF0aWMgZnJvbUNvbm5lY3Rpb25TdHJpbmcoY29ubmVjdGlvblN0cmluZywgXG4gICAgLy8gTGVnYWN5LCBubyBmaXggZm9yIGVzbGludCBlcnJvciB3aXRob3V0IGJyZWFraW5nLiBEaXNhYmxlIGl0IGZvciB0aGlzIGludGVyZmFjZS5cbiAgICAvKiBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQGF6dXJlL2F6dXJlLXNkay90cy1uYW1pbmctb3B0aW9ucyovXG4gICAgb3B0aW9ucykge1xuICAgICAgICBvcHRpb25zID0gb3B0aW9ucyB8fCB7fTtcbiAgICAgICAgY29uc3QgZXh0cmFjdGVkQ3JlZHMgPSBleHRyYWN0Q29ubmVjdGlvblN0cmluZ1BhcnRzKGNvbm5lY3Rpb25TdHJpbmcpO1xuICAgICAgICBpZiAoZXh0cmFjdGVkQ3JlZHMua2luZCA9PT0gXCJBY2NvdW50Q29ublN0cmluZ1wiKSB7XG4gICAgICAgICAgICBpZiAoY29yZVV0aWwuaXNOb2RlKSB7XG4gICAgICAgICAgICAgICAgY29uc3Qgc2hhcmVkS2V5Q3JlZGVudGlhbCA9IG5ldyBTdG9yYWdlU2hhcmVkS2V5Q3JlZGVudGlhbChleHRyYWN0ZWRDcmVkcy5hY2NvdW50TmFtZSwgZXh0cmFjdGVkQ3JlZHMuYWNjb3VudEtleSk7XG4gICAgICAgICAgICAgICAgaWYgKCFvcHRpb25zLnByb3h5T3B0aW9ucykge1xuICAgICAgICAgICAgICAgICAgICBvcHRpb25zLnByb3h5T3B0aW9ucyA9IGNvcmVSZXN0UGlwZWxpbmUuZ2V0RGVmYXVsdFByb3h5U2V0dGluZ3MoZXh0cmFjdGVkQ3JlZHMucHJveHlVcmkpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBjb25zdCBwaXBlbGluZSA9IG5ld1BpcGVsaW5lKHNoYXJlZEtleUNyZWRlbnRpYWwsIG9wdGlvbnMpO1xuICAgICAgICAgICAgICAgIHJldHVybiBuZXcgQmxvYlNlcnZpY2VDbGllbnQoZXh0cmFjdGVkQ3JlZHMudXJsLCBwaXBlbGluZSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJBY2NvdW50IGNvbm5lY3Rpb24gc3RyaW5nIGlzIG9ubHkgc3VwcG9ydGVkIGluIE5vZGUuanMgZW52aXJvbm1lbnRcIik7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSBpZiAoZXh0cmFjdGVkQ3JlZHMua2luZCA9PT0gXCJTQVNDb25uU3RyaW5nXCIpIHtcbiAgICAgICAgICAgIGNvbnN0IHBpcGVsaW5lID0gbmV3UGlwZWxpbmUobmV3IEFub255bW91c0NyZWRlbnRpYWwoKSwgb3B0aW9ucyk7XG4gICAgICAgICAgICByZXR1cm4gbmV3IEJsb2JTZXJ2aWNlQ2xpZW50KGV4dHJhY3RlZENyZWRzLnVybCArIFwiP1wiICsgZXh0cmFjdGVkQ3JlZHMuYWNjb3VudFNhcywgcGlwZWxpbmUpO1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwiQ29ubmVjdGlvbiBzdHJpbmcgbXVzdCBiZSBlaXRoZXIgYW4gQWNjb3VudCBjb25uZWN0aW9uIHN0cmluZyBvciBhIFNBUyBjb25uZWN0aW9uIHN0cmluZ1wiKTtcbiAgICAgICAgfVxuICAgIH1cbiAgICBjb25zdHJ1Y3Rvcih1cmwsIGNyZWRlbnRpYWxPclBpcGVsaW5lLCBcbiAgICAvLyBMZWdhY3ksIG5vIGZpeCBmb3IgZXNsaW50IGVycm9yIHdpdGhvdXQgYnJlYWtpbmcuIERpc2FibGUgaXQgZm9yIHRoaXMgaW50ZXJmYWNlLlxuICAgIC8qIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAYXp1cmUvYXp1cmUtc2RrL3RzLW5hbWluZy1vcHRpb25zKi9cbiAgICBvcHRpb25zKSB7XG4gICAgICAgIGxldCBwaXBlbGluZTtcbiAgICAgICAgaWYgKGlzUGlwZWxpbmVMaWtlKGNyZWRlbnRpYWxPclBpcGVsaW5lKSkge1xuICAgICAgICAgICAgcGlwZWxpbmUgPSBjcmVkZW50aWFsT3JQaXBlbGluZTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIGlmICgoY29yZVV0aWwuaXNOb2RlICYmIGNyZWRlbnRpYWxPclBpcGVsaW5lIGluc3RhbmNlb2YgU3RvcmFnZVNoYXJlZEtleUNyZWRlbnRpYWwpIHx8XG4gICAgICAgICAgICBjcmVkZW50aWFsT3JQaXBlbGluZSBpbnN0YW5jZW9mIEFub255bW91c0NyZWRlbnRpYWwgfHxcbiAgICAgICAgICAgIGNvcmVBdXRoLmlzVG9rZW5DcmVkZW50aWFsKGNyZWRlbnRpYWxPclBpcGVsaW5lKSkge1xuICAgICAgICAgICAgcGlwZWxpbmUgPSBuZXdQaXBlbGluZShjcmVkZW50aWFsT3JQaXBlbGluZSwgb3B0aW9ucyk7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAvLyBUaGUgc2Vjb25kIHBhcmFtZXRlciBpcyB1bmRlZmluZWQuIFVzZSBhbm9ueW1vdXMgY3JlZGVudGlhbFxuICAgICAgICAgICAgcGlwZWxpbmUgPSBuZXdQaXBlbGluZShuZXcgQW5vbnltb3VzQ3JlZGVudGlhbCgpLCBvcHRpb25zKTtcbiAgICAgICAgfVxuICAgICAgICBzdXBlcih1cmwsIHBpcGVsaW5lKTtcbiAgICAgICAgdGhpcy5zZXJ2aWNlQ29udGV4dCA9IHRoaXMuc3RvcmFnZUNsaWVudENvbnRleHQuc2VydmljZTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogQ3JlYXRlcyBhIHtAbGluayBDb250YWluZXJDbGllbnR9IG9iamVjdFxuICAgICAqXG4gICAgICogQHBhcmFtIGNvbnRhaW5lck5hbWUgLSBBIGNvbnRhaW5lciBuYW1lXG4gICAgICogQHJldHVybnMgQSBuZXcgQ29udGFpbmVyQ2xpZW50IG9iamVjdCBmb3IgdGhlIGdpdmVuIGNvbnRhaW5lciBuYW1lLlxuICAgICAqXG4gICAgICogRXhhbXBsZSB1c2FnZTpcbiAgICAgKlxuICAgICAqIGBgYGpzXG4gICAgICogY29uc3QgY29udGFpbmVyQ2xpZW50ID0gYmxvYlNlcnZpY2VDbGllbnQuZ2V0Q29udGFpbmVyQ2xpZW50KFwiPGNvbnRhaW5lciBuYW1lPlwiKTtcbiAgICAgKiBgYGBcbiAgICAgKi9cbiAgICBnZXRDb250YWluZXJDbGllbnQoY29udGFpbmVyTmFtZSkge1xuICAgICAgICByZXR1cm4gbmV3IENvbnRhaW5lckNsaWVudChhcHBlbmRUb1VSTFBhdGgodGhpcy51cmwsIGVuY29kZVVSSUNvbXBvbmVudChjb250YWluZXJOYW1lKSksIHRoaXMucGlwZWxpbmUpO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBDcmVhdGUgYSBCbG9iIGNvbnRhaW5lci4gQHNlZSBodHRwczovL2RvY3MubWljcm9zb2Z0LmNvbS9lbi11cy9yZXN0L2FwaS9zdG9yYWdlc2VydmljZXMvY3JlYXRlLWNvbnRhaW5lclxuICAgICAqXG4gICAgICogQHBhcmFtIGNvbnRhaW5lck5hbWUgLSBOYW1lIG9mIHRoZSBjb250YWluZXIgdG8gY3JlYXRlLlxuICAgICAqIEBwYXJhbSBvcHRpb25zIC0gT3B0aW9ucyB0byBjb25maWd1cmUgQ29udGFpbmVyIENyZWF0ZSBvcGVyYXRpb24uXG4gICAgICogQHJldHVybnMgQ29udGFpbmVyIGNyZWF0aW9uIHJlc3BvbnNlIGFuZCB0aGUgY29ycmVzcG9uZGluZyBjb250YWluZXIgY2xpZW50LlxuICAgICAqL1xuICAgIGFzeW5jIGNyZWF0ZUNvbnRhaW5lcihjb250YWluZXJOYW1lLCBvcHRpb25zID0ge30pIHtcbiAgICAgICAgcmV0dXJuIHRyYWNpbmdDbGllbnQud2l0aFNwYW4oXCJCbG9iU2VydmljZUNsaWVudC1jcmVhdGVDb250YWluZXJcIiwgb3B0aW9ucywgYXN5bmMgKHVwZGF0ZWRPcHRpb25zKSA9PiB7XG4gICAgICAgICAgICBjb25zdCBjb250YWluZXJDbGllbnQgPSB0aGlzLmdldENvbnRhaW5lckNsaWVudChjb250YWluZXJOYW1lKTtcbiAgICAgICAgICAgIGNvbnN0IGNvbnRhaW5lckNyZWF0ZVJlc3BvbnNlID0gYXdhaXQgY29udGFpbmVyQ2xpZW50LmNyZWF0ZSh1cGRhdGVkT3B0aW9ucyk7XG4gICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICAgIGNvbnRhaW5lckNsaWVudCxcbiAgICAgICAgICAgICAgICBjb250YWluZXJDcmVhdGVSZXNwb25zZSxcbiAgICAgICAgICAgIH07XG4gICAgICAgIH0pO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBEZWxldGVzIGEgQmxvYiBjb250YWluZXIuXG4gICAgICpcbiAgICAgKiBAcGFyYW0gY29udGFpbmVyTmFtZSAtIE5hbWUgb2YgdGhlIGNvbnRhaW5lciB0byBkZWxldGUuXG4gICAgICogQHBhcmFtIG9wdGlvbnMgLSBPcHRpb25zIHRvIGNvbmZpZ3VyZSBDb250YWluZXIgRGVsZXRlIG9wZXJhdGlvbi5cbiAgICAgKiBAcmV0dXJucyBDb250YWluZXIgZGVsZXRpb24gcmVzcG9uc2UuXG4gICAgICovXG4gICAgYXN5bmMgZGVsZXRlQ29udGFpbmVyKGNvbnRhaW5lck5hbWUsIG9wdGlvbnMgPSB7fSkge1xuICAgICAgICByZXR1cm4gdHJhY2luZ0NsaWVudC53aXRoU3BhbihcIkJsb2JTZXJ2aWNlQ2xpZW50LWRlbGV0ZUNvbnRhaW5lclwiLCBvcHRpb25zLCBhc3luYyAodXBkYXRlZE9wdGlvbnMpID0+IHtcbiAgICAgICAgICAgIGNvbnN0IGNvbnRhaW5lckNsaWVudCA9IHRoaXMuZ2V0Q29udGFpbmVyQ2xpZW50KGNvbnRhaW5lck5hbWUpO1xuICAgICAgICAgICAgcmV0dXJuIGNvbnRhaW5lckNsaWVudC5kZWxldGUodXBkYXRlZE9wdGlvbnMpO1xuICAgICAgICB9KTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogUmVzdG9yZSBhIHByZXZpb3VzbHkgZGVsZXRlZCBCbG9iIGNvbnRhaW5lci5cbiAgICAgKiBUaGlzIEFQSSBpcyBvbmx5IGZ1bmN0aW9uYWwgaWYgQ29udGFpbmVyIFNvZnQgRGVsZXRlIGlzIGVuYWJsZWQgZm9yIHRoZSBzdG9yYWdlIGFjY291bnQgYXNzb2NpYXRlZCB3aXRoIHRoZSBjb250YWluZXIuXG4gICAgICpcbiAgICAgKiBAcGFyYW0gZGVsZXRlZENvbnRhaW5lck5hbWUgLSBOYW1lIG9mIHRoZSBwcmV2aW91c2x5IGRlbGV0ZWQgY29udGFpbmVyLlxuICAgICAqIEBwYXJhbSBkZWxldGVkQ29udGFpbmVyVmVyc2lvbiAtIFZlcnNpb24gb2YgdGhlIHByZXZpb3VzbHkgZGVsZXRlZCBjb250YWluZXIsIHVzZWQgdG8gdW5pcXVlbHkgaWRlbnRpZnkgdGhlIGRlbGV0ZWQgY29udGFpbmVyLlxuICAgICAqIEBwYXJhbSBvcHRpb25zIC0gT3B0aW9ucyB0byBjb25maWd1cmUgQ29udGFpbmVyIFJlc3RvcmUgb3BlcmF0aW9uLlxuICAgICAqIEByZXR1cm5zIENvbnRhaW5lciBkZWxldGlvbiByZXNwb25zZS5cbiAgICAgKi9cbiAgICBhc3luYyB1bmRlbGV0ZUNvbnRhaW5lcihkZWxldGVkQ29udGFpbmVyTmFtZSwgZGVsZXRlZENvbnRhaW5lclZlcnNpb24sIG9wdGlvbnMgPSB7fSkge1xuICAgICAgICByZXR1cm4gdHJhY2luZ0NsaWVudC53aXRoU3BhbihcIkJsb2JTZXJ2aWNlQ2xpZW50LXVuZGVsZXRlQ29udGFpbmVyXCIsIG9wdGlvbnMsIGFzeW5jICh1cGRhdGVkT3B0aW9ucykgPT4ge1xuICAgICAgICAgICAgY29uc3QgY29udGFpbmVyQ2xpZW50ID0gdGhpcy5nZXRDb250YWluZXJDbGllbnQob3B0aW9ucy5kZXN0aW5hdGlvbkNvbnRhaW5lck5hbWUgfHwgZGVsZXRlZENvbnRhaW5lck5hbWUpO1xuICAgICAgICAgICAgLy8gSGFjayB0byBhY2Nlc3MgYSBwcm90ZWN0ZWQgbWVtYmVyLlxuICAgICAgICAgICAgY29uc3QgY29udGFpbmVyQ29udGV4dCA9IGNvbnRhaW5lckNsaWVudFtcInN0b3JhZ2VDbGllbnRDb250ZXh0XCJdLmNvbnRhaW5lcjtcbiAgICAgICAgICAgIGNvbnN0IGNvbnRhaW5lclVuZGVsZXRlUmVzcG9uc2UgPSBhc3NlcnRSZXNwb25zZShhd2FpdCBjb250YWluZXJDb250ZXh0LnJlc3RvcmUoe1xuICAgICAgICAgICAgICAgIGRlbGV0ZWRDb250YWluZXJOYW1lLFxuICAgICAgICAgICAgICAgIGRlbGV0ZWRDb250YWluZXJWZXJzaW9uLFxuICAgICAgICAgICAgICAgIHRyYWNpbmdPcHRpb25zOiB1cGRhdGVkT3B0aW9ucy50cmFjaW5nT3B0aW9ucyxcbiAgICAgICAgICAgIH0pKTtcbiAgICAgICAgICAgIHJldHVybiB7IGNvbnRhaW5lckNsaWVudCwgY29udGFpbmVyVW5kZWxldGVSZXNwb25zZSB9O1xuICAgICAgICB9KTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogUmVuYW1lIGFuIGV4aXN0aW5nIEJsb2IgQ29udGFpbmVyLlxuICAgICAqXG4gICAgICogQHBhcmFtIHNvdXJjZUNvbnRhaW5lck5hbWUgLSBUaGUgbmFtZSBvZiB0aGUgc291cmNlIGNvbnRhaW5lci5cbiAgICAgKiBAcGFyYW0gZGVzdGluYXRpb25Db250YWluZXJOYW1lIC0gVGhlIG5ldyBuYW1lIG9mIHRoZSBjb250YWluZXIuXG4gICAgICogQHBhcmFtIG9wdGlvbnMgLSBPcHRpb25zIHRvIGNvbmZpZ3VyZSBDb250YWluZXIgUmVuYW1lIG9wZXJhdGlvbi5cbiAgICAgKi9cbiAgICAvKiBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L2Jhbi10cy1jb21tZW50ICovXG4gICAgLy8gQHRzLWlnbm9yZSBOZWVkIHRvIGhpZGUgdGhpcyBpbnRlcmZhY2UgZm9yIG5vdy4gTWFrZSBpdCBwdWJsaWMgYW5kIHR1cm4gb24gdGhlIGxpdmUgdGVzdHMgZm9yIGl0IHdoZW4gdGhlIHNlcnZpY2UgaXMgcmVhZHkuXG4gICAgYXN5bmMgcmVuYW1lQ29udGFpbmVyKHNvdXJjZUNvbnRhaW5lck5hbWUsIGRlc3RpbmF0aW9uQ29udGFpbmVyTmFtZSwgb3B0aW9ucyA9IHt9KSB7XG4gICAgICAgIHJldHVybiB0cmFjaW5nQ2xpZW50LndpdGhTcGFuKFwiQmxvYlNlcnZpY2VDbGllbnQtcmVuYW1lQ29udGFpbmVyXCIsIG9wdGlvbnMsIGFzeW5jICh1cGRhdGVkT3B0aW9ucykgPT4ge1xuICAgICAgICAgICAgdmFyIF9hO1xuICAgICAgICAgICAgY29uc3QgY29udGFpbmVyQ2xpZW50ID0gdGhpcy5nZXRDb250YWluZXJDbGllbnQoZGVzdGluYXRpb25Db250YWluZXJOYW1lKTtcbiAgICAgICAgICAgIC8vIEhhY2sgdG8gYWNjZXNzIGEgcHJvdGVjdGVkIG1lbWJlci5cbiAgICAgICAgICAgIGNvbnN0IGNvbnRhaW5lckNvbnRleHQgPSBjb250YWluZXJDbGllbnRbXCJzdG9yYWdlQ2xpZW50Q29udGV4dFwiXS5jb250YWluZXI7XG4gICAgICAgICAgICBjb25zdCBjb250YWluZXJSZW5hbWVSZXNwb25zZSA9IGFzc2VydFJlc3BvbnNlKGF3YWl0IGNvbnRhaW5lckNvbnRleHQucmVuYW1lKHNvdXJjZUNvbnRhaW5lck5hbWUsIE9iamVjdC5hc3NpZ24oT2JqZWN0LmFzc2lnbih7fSwgdXBkYXRlZE9wdGlvbnMpLCB7IHNvdXJjZUxlYXNlSWQ6IChfYSA9IG9wdGlvbnMuc291cmNlQ29uZGl0aW9uKSA9PT0gbnVsbCB8fCBfYSA9PT0gdm9pZCAwID8gdm9pZCAwIDogX2EubGVhc2VJZCB9KSkpO1xuICAgICAgICAgICAgcmV0dXJuIHsgY29udGFpbmVyQ2xpZW50LCBjb250YWluZXJSZW5hbWVSZXNwb25zZSB9O1xuICAgICAgICB9KTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogR2V0cyB0aGUgcHJvcGVydGllcyBvZiBhIHN0b3JhZ2UgYWNjb3VudOKAmXMgQmxvYiBzZXJ2aWNlLCBpbmNsdWRpbmcgcHJvcGVydGllc1xuICAgICAqIGZvciBTdG9yYWdlIEFuYWx5dGljcyBhbmQgQ09SUyAoQ3Jvc3MtT3JpZ2luIFJlc291cmNlIFNoYXJpbmcpIHJ1bGVzLlxuICAgICAqIEBzZWUgaHR0cHM6Ly9kb2NzLm1pY3Jvc29mdC5jb20vZW4tdXMvcmVzdC9hcGkvc3RvcmFnZXNlcnZpY2VzL2dldC1ibG9iLXNlcnZpY2UtcHJvcGVydGllc1xuICAgICAqXG4gICAgICogQHBhcmFtIG9wdGlvbnMgLSBPcHRpb25zIHRvIHRoZSBTZXJ2aWNlIEdldCBQcm9wZXJ0aWVzIG9wZXJhdGlvbi5cbiAgICAgKiBAcmV0dXJucyBSZXNwb25zZSBkYXRhIGZvciB0aGUgU2VydmljZSBHZXQgUHJvcGVydGllcyBvcGVyYXRpb24uXG4gICAgICovXG4gICAgYXN5bmMgZ2V0UHJvcGVydGllcyhvcHRpb25zID0ge30pIHtcbiAgICAgICAgcmV0dXJuIHRyYWNpbmdDbGllbnQud2l0aFNwYW4oXCJCbG9iU2VydmljZUNsaWVudC1nZXRQcm9wZXJ0aWVzXCIsIG9wdGlvbnMsIGFzeW5jICh1cGRhdGVkT3B0aW9ucykgPT4ge1xuICAgICAgICAgICAgcmV0dXJuIGFzc2VydFJlc3BvbnNlKGF3YWl0IHRoaXMuc2VydmljZUNvbnRleHQuZ2V0UHJvcGVydGllcyh7XG4gICAgICAgICAgICAgICAgYWJvcnRTaWduYWw6IG9wdGlvbnMuYWJvcnRTaWduYWwsXG4gICAgICAgICAgICAgICAgdHJhY2luZ09wdGlvbnM6IHVwZGF0ZWRPcHRpb25zLnRyYWNpbmdPcHRpb25zLFxuICAgICAgICAgICAgfSkpO1xuICAgICAgICB9KTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogU2V0cyBwcm9wZXJ0aWVzIGZvciBhIHN0b3JhZ2UgYWNjb3VudOKAmXMgQmxvYiBzZXJ2aWNlIGVuZHBvaW50LCBpbmNsdWRpbmcgcHJvcGVydGllc1xuICAgICAqIGZvciBTdG9yYWdlIEFuYWx5dGljcywgQ09SUyAoQ3Jvc3MtT3JpZ2luIFJlc291cmNlIFNoYXJpbmcpIHJ1bGVzIGFuZCBzb2Z0IGRlbGV0ZSBzZXR0aW5ncy5cbiAgICAgKiBAc2VlIGh0dHBzOi8vZG9jcy5taWNyb3NvZnQuY29tL2VuLXVzL3Jlc3QvYXBpL3N0b3JhZ2VzZXJ2aWNlcy9zZXQtYmxvYi1zZXJ2aWNlLXByb3BlcnRpZXNcbiAgICAgKlxuICAgICAqIEBwYXJhbSBwcm9wZXJ0aWVzIC1cbiAgICAgKiBAcGFyYW0gb3B0aW9ucyAtIE9wdGlvbnMgdG8gdGhlIFNlcnZpY2UgU2V0IFByb3BlcnRpZXMgb3BlcmF0aW9uLlxuICAgICAqIEByZXR1cm5zIFJlc3BvbnNlIGRhdGEgZm9yIHRoZSBTZXJ2aWNlIFNldCBQcm9wZXJ0aWVzIG9wZXJhdGlvbi5cbiAgICAgKi9cbiAgICBhc3luYyBzZXRQcm9wZXJ0aWVzKHByb3BlcnRpZXMsIG9wdGlvbnMgPSB7fSkge1xuICAgICAgICByZXR1cm4gdHJhY2luZ0NsaWVudC53aXRoU3BhbihcIkJsb2JTZXJ2aWNlQ2xpZW50LXNldFByb3BlcnRpZXNcIiwgb3B0aW9ucywgYXN5bmMgKHVwZGF0ZWRPcHRpb25zKSA9PiB7XG4gICAgICAgICAgICByZXR1cm4gYXNzZXJ0UmVzcG9uc2UoYXdhaXQgdGhpcy5zZXJ2aWNlQ29udGV4dC5zZXRQcm9wZXJ0aWVzKHByb3BlcnRpZXMsIHtcbiAgICAgICAgICAgICAgICBhYm9ydFNpZ25hbDogb3B0aW9ucy5hYm9ydFNpZ25hbCxcbiAgICAgICAgICAgICAgICB0cmFjaW5nT3B0aW9uczogdXBkYXRlZE9wdGlvbnMudHJhY2luZ09wdGlvbnMsXG4gICAgICAgICAgICB9KSk7XG4gICAgICAgIH0pO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBSZXRyaWV2ZXMgc3RhdGlzdGljcyByZWxhdGVkIHRvIHJlcGxpY2F0aW9uIGZvciB0aGUgQmxvYiBzZXJ2aWNlLiBJdCBpcyBvbmx5XG4gICAgICogYXZhaWxhYmxlIG9uIHRoZSBzZWNvbmRhcnkgbG9jYXRpb24gZW5kcG9pbnQgd2hlbiByZWFkLWFjY2VzcyBnZW8tcmVkdW5kYW50XG4gICAgICogcmVwbGljYXRpb24gaXMgZW5hYmxlZCBmb3IgdGhlIHN0b3JhZ2UgYWNjb3VudC5cbiAgICAgKiBAc2VlIGh0dHBzOi8vZG9jcy5taWNyb3NvZnQuY29tL2VuLXVzL3Jlc3QvYXBpL3N0b3JhZ2VzZXJ2aWNlcy9nZXQtYmxvYi1zZXJ2aWNlLXN0YXRzXG4gICAgICpcbiAgICAgKiBAcGFyYW0gb3B0aW9ucyAtIE9wdGlvbnMgdG8gdGhlIFNlcnZpY2UgR2V0IFN0YXRpc3RpY3Mgb3BlcmF0aW9uLlxuICAgICAqIEByZXR1cm5zIFJlc3BvbnNlIGRhdGEgZm9yIHRoZSBTZXJ2aWNlIEdldCBTdGF0aXN0aWNzIG9wZXJhdGlvbi5cbiAgICAgKi9cbiAgICBhc3luYyBnZXRTdGF0aXN0aWNzKG9wdGlvbnMgPSB7fSkge1xuICAgICAgICByZXR1cm4gdHJhY2luZ0NsaWVudC53aXRoU3BhbihcIkJsb2JTZXJ2aWNlQ2xpZW50LWdldFN0YXRpc3RpY3NcIiwgb3B0aW9ucywgYXN5bmMgKHVwZGF0ZWRPcHRpb25zKSA9PiB7XG4gICAgICAgICAgICByZXR1cm4gYXNzZXJ0UmVzcG9uc2UoYXdhaXQgdGhpcy5zZXJ2aWNlQ29udGV4dC5nZXRTdGF0aXN0aWNzKHtcbiAgICAgICAgICAgICAgICBhYm9ydFNpZ25hbDogb3B0aW9ucy5hYm9ydFNpZ25hbCxcbiAgICAgICAgICAgICAgICB0cmFjaW5nT3B0aW9uczogdXBkYXRlZE9wdGlvbnMudHJhY2luZ09wdGlvbnMsXG4gICAgICAgICAgICB9KSk7XG4gICAgICAgIH0pO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBUaGUgR2V0IEFjY291bnQgSW5mb3JtYXRpb24gb3BlcmF0aW9uIHJldHVybnMgdGhlIHNrdSBuYW1lIGFuZCBhY2NvdW50IGtpbmRcbiAgICAgKiBmb3IgdGhlIHNwZWNpZmllZCBhY2NvdW50LlxuICAgICAqIFRoZSBHZXQgQWNjb3VudCBJbmZvcm1hdGlvbiBvcGVyYXRpb24gaXMgYXZhaWxhYmxlIG9uIHNlcnZpY2UgdmVyc2lvbnMgYmVnaW5uaW5nXG4gICAgICogd2l0aCB2ZXJzaW9uIDIwMTgtMDMtMjguXG4gICAgICogQHNlZSBodHRwczovL2RvY3MubWljcm9zb2Z0LmNvbS9lbi11cy9yZXN0L2FwaS9zdG9yYWdlc2VydmljZXMvZ2V0LWFjY291bnQtaW5mb3JtYXRpb25cbiAgICAgKlxuICAgICAqIEBwYXJhbSBvcHRpb25zIC0gT3B0aW9ucyB0byB0aGUgU2VydmljZSBHZXQgQWNjb3VudCBJbmZvIG9wZXJhdGlvbi5cbiAgICAgKiBAcmV0dXJucyBSZXNwb25zZSBkYXRhIGZvciB0aGUgU2VydmljZSBHZXQgQWNjb3VudCBJbmZvIG9wZXJhdGlvbi5cbiAgICAgKi9cbiAgICBhc3luYyBnZXRBY2NvdW50SW5mbyhvcHRpb25zID0ge30pIHtcbiAgICAgICAgcmV0dXJuIHRyYWNpbmdDbGllbnQud2l0aFNwYW4oXCJCbG9iU2VydmljZUNsaWVudC1nZXRBY2NvdW50SW5mb1wiLCBvcHRpb25zLCBhc3luYyAodXBkYXRlZE9wdGlvbnMpID0+IHtcbiAgICAgICAgICAgIHJldHVybiBhc3NlcnRSZXNwb25zZShhd2FpdCB0aGlzLnNlcnZpY2VDb250ZXh0LmdldEFjY291bnRJbmZvKHtcbiAgICAgICAgICAgICAgICBhYm9ydFNpZ25hbDogb3B0aW9ucy5hYm9ydFNpZ25hbCxcbiAgICAgICAgICAgICAgICB0cmFjaW5nT3B0aW9uczogdXBkYXRlZE9wdGlvbnMudHJhY2luZ09wdGlvbnMsXG4gICAgICAgICAgICB9KSk7XG4gICAgICAgIH0pO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBSZXR1cm5zIGEgbGlzdCBvZiB0aGUgY29udGFpbmVycyB1bmRlciB0aGUgc3BlY2lmaWVkIGFjY291bnQuXG4gICAgICogQHNlZSBodHRwczovL2RvY3MubWljcm9zb2Z0LmNvbS9lbi11cy9yZXN0L2FwaS9zdG9yYWdlc2VydmljZXMvbGlzdC1jb250YWluZXJzMlxuICAgICAqXG4gICAgICogQHBhcmFtIG1hcmtlciAtIEEgc3RyaW5nIHZhbHVlIHRoYXQgaWRlbnRpZmllcyB0aGUgcG9ydGlvbiBvZlxuICAgICAqICAgICAgICAgICAgICAgICAgICAgICAgdGhlIGxpc3Qgb2YgY29udGFpbmVycyB0byBiZSByZXR1cm5lZCB3aXRoIHRoZSBuZXh0IGxpc3Rpbmcgb3BlcmF0aW9uLiBUaGVcbiAgICAgKiAgICAgICAgICAgICAgICAgICAgICAgIG9wZXJhdGlvbiByZXR1cm5zIHRoZSBjb250aW51YXRpb25Ub2tlbiB2YWx1ZSB3aXRoaW4gdGhlIHJlc3BvbnNlIGJvZHkgaWYgdGhlXG4gICAgICogICAgICAgICAgICAgICAgICAgICAgICBsaXN0aW5nIG9wZXJhdGlvbiBkaWQgbm90IHJldHVybiBhbGwgY29udGFpbmVycyByZW1haW5pbmcgdG8gYmUgbGlzdGVkXG4gICAgICogICAgICAgICAgICAgICAgICAgICAgICB3aXRoIHRoZSBjdXJyZW50IHBhZ2UuIFRoZSBjb250aW51YXRpb25Ub2tlbiB2YWx1ZSBjYW4gYmUgdXNlZCBhcyB0aGUgdmFsdWUgZm9yXG4gICAgICogICAgICAgICAgICAgICAgICAgICAgICB0aGUgbWFya2VyIHBhcmFtZXRlciBpbiBhIHN1YnNlcXVlbnQgY2FsbCB0byByZXF1ZXN0IHRoZSBuZXh0IHBhZ2Ugb2YgbGlzdFxuICAgICAqICAgICAgICAgICAgICAgICAgICAgICAgaXRlbXMuIFRoZSBtYXJrZXIgdmFsdWUgaXMgb3BhcXVlIHRvIHRoZSBjbGllbnQuXG4gICAgICogQHBhcmFtIG9wdGlvbnMgLSBPcHRpb25zIHRvIHRoZSBTZXJ2aWNlIExpc3QgQ29udGFpbmVyIFNlZ21lbnQgb3BlcmF0aW9uLlxuICAgICAqIEByZXR1cm5zIFJlc3BvbnNlIGRhdGEgZm9yIHRoZSBTZXJ2aWNlIExpc3QgQ29udGFpbmVyIFNlZ21lbnQgb3BlcmF0aW9uLlxuICAgICAqL1xuICAgIGFzeW5jIGxpc3RDb250YWluZXJzU2VnbWVudChtYXJrZXIsIG9wdGlvbnMgPSB7fSkge1xuICAgICAgICByZXR1cm4gdHJhY2luZ0NsaWVudC53aXRoU3BhbihcIkJsb2JTZXJ2aWNlQ2xpZW50LWxpc3RDb250YWluZXJzU2VnbWVudFwiLCBvcHRpb25zLCBhc3luYyAodXBkYXRlZE9wdGlvbnMpID0+IHtcbiAgICAgICAgICAgIHJldHVybiBhc3NlcnRSZXNwb25zZShhd2FpdCB0aGlzLnNlcnZpY2VDb250ZXh0Lmxpc3RDb250YWluZXJzU2VnbWVudChPYmplY3QuYXNzaWduKE9iamVjdC5hc3NpZ24oeyBhYm9ydFNpZ25hbDogb3B0aW9ucy5hYm9ydFNpZ25hbCwgbWFya2VyIH0sIG9wdGlvbnMpLCB7IGluY2x1ZGU6IHR5cGVvZiBvcHRpb25zLmluY2x1ZGUgPT09IFwic3RyaW5nXCIgPyBbb3B0aW9ucy5pbmNsdWRlXSA6IG9wdGlvbnMuaW5jbHVkZSwgdHJhY2luZ09wdGlvbnM6IHVwZGF0ZWRPcHRpb25zLnRyYWNpbmdPcHRpb25zIH0pKSk7XG4gICAgICAgIH0pO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBUaGUgRmlsdGVyIEJsb2JzIG9wZXJhdGlvbiBlbmFibGVzIGNhbGxlcnMgdG8gbGlzdCBibG9icyBhY3Jvc3MgYWxsIGNvbnRhaW5lcnMgd2hvc2UgdGFnc1xuICAgICAqIG1hdGNoIGEgZ2l2ZW4gc2VhcmNoIGV4cHJlc3Npb24uIEZpbHRlciBibG9icyBzZWFyY2hlcyBhY3Jvc3MgYWxsIGNvbnRhaW5lcnMgd2l0aGluIGFcbiAgICAgKiBzdG9yYWdlIGFjY291bnQgYnV0IGNhbiBiZSBzY29wZWQgd2l0aGluIHRoZSBleHByZXNzaW9uIHRvIGEgc2luZ2xlIGNvbnRhaW5lci5cbiAgICAgKlxuICAgICAqIEBwYXJhbSB0YWdGaWx0ZXJTcWxFeHByZXNzaW9uIC0gVGhlIHdoZXJlIHBhcmFtZXRlciBlbmFibGVzIHRoZSBjYWxsZXIgdG8gcXVlcnkgYmxvYnMgd2hvc2UgdGFncyBtYXRjaCBhIGdpdmVuIGV4cHJlc3Npb24uXG4gICAgICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGhlIGdpdmVuIGV4cHJlc3Npb24gbXVzdCBldmFsdWF0ZSB0byB0cnVlIGZvciBhIGJsb2IgdG8gYmUgcmV0dXJuZWQgaW4gdGhlIHJlc3VsdHMuXG4gICAgICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGhlW09EYXRhIC0gQUJORl0gZmlsdGVyIHN5bnRheCBydWxlIGRlZmluZXMgdGhlIGZvcm1hbCBncmFtbWFyIGZvciB0aGUgdmFsdWUgb2YgdGhlIHdoZXJlIHF1ZXJ5IHBhcmFtZXRlcjtcbiAgICAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBob3dldmVyLCBvbmx5IGEgc3Vic2V0IG9mIHRoZSBPRGF0YSBmaWx0ZXIgc3ludGF4IGlzIHN1cHBvcnRlZCBpbiB0aGUgQmxvYiBzZXJ2aWNlLlxuICAgICAqIEBwYXJhbSBtYXJrZXIgLSBBIHN0cmluZyB2YWx1ZSB0aGF0IGlkZW50aWZpZXMgdGhlIHBvcnRpb24gb2ZcbiAgICAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgdGhlIGxpc3Qgb2YgYmxvYnMgdG8gYmUgcmV0dXJuZWQgd2l0aCB0aGUgbmV4dCBsaXN0aW5nIG9wZXJhdGlvbi4gVGhlXG4gICAgICogICAgICAgICAgICAgICAgICAgICAgICAgIG9wZXJhdGlvbiByZXR1cm5zIHRoZSBjb250aW51YXRpb25Ub2tlbiB2YWx1ZSB3aXRoaW4gdGhlIHJlc3BvbnNlIGJvZHkgaWYgdGhlXG4gICAgICogICAgICAgICAgICAgICAgICAgICAgICAgIGxpc3Rpbmcgb3BlcmF0aW9uIGRpZCBub3QgcmV0dXJuIGFsbCBibG9icyByZW1haW5pbmcgdG8gYmUgbGlzdGVkXG4gICAgICogICAgICAgICAgICAgICAgICAgICAgICAgIHdpdGggdGhlIGN1cnJlbnQgcGFnZS4gVGhlIGNvbnRpbnVhdGlvblRva2VuIHZhbHVlIGNhbiBiZSB1c2VkIGFzIHRoZSB2YWx1ZSBmb3JcbiAgICAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgdGhlIG1hcmtlciBwYXJhbWV0ZXIgaW4gYSBzdWJzZXF1ZW50IGNhbGwgdG8gcmVxdWVzdCB0aGUgbmV4dCBwYWdlIG9mIGxpc3RcbiAgICAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgaXRlbXMuIFRoZSBtYXJrZXIgdmFsdWUgaXMgb3BhcXVlIHRvIHRoZSBjbGllbnQuXG4gICAgICogQHBhcmFtIG9wdGlvbnMgLSBPcHRpb25zIHRvIGZpbmQgYmxvYnMgYnkgdGFncy5cbiAgICAgKi9cbiAgICBhc3luYyBmaW5kQmxvYnNCeVRhZ3NTZWdtZW50KHRhZ0ZpbHRlclNxbEV4cHJlc3Npb24sIG1hcmtlciwgb3B0aW9ucyA9IHt9KSB7XG4gICAgICAgIHJldHVybiB0cmFjaW5nQ2xpZW50LndpdGhTcGFuKFwiQmxvYlNlcnZpY2VDbGllbnQtZmluZEJsb2JzQnlUYWdzU2VnbWVudFwiLCBvcHRpb25zLCBhc3luYyAodXBkYXRlZE9wdGlvbnMpID0+IHtcbiAgICAgICAgICAgIGNvbnN0IHJlc3BvbnNlID0gYXNzZXJ0UmVzcG9uc2UoYXdhaXQgdGhpcy5zZXJ2aWNlQ29udGV4dC5maWx0ZXJCbG9icyh7XG4gICAgICAgICAgICAgICAgYWJvcnRTaWduYWw6IG9wdGlvbnMuYWJvcnRTaWduYWwsXG4gICAgICAgICAgICAgICAgd2hlcmU6IHRhZ0ZpbHRlclNxbEV4cHJlc3Npb24sXG4gICAgICAgICAgICAgICAgbWFya2VyLFxuICAgICAgICAgICAgICAgIG1heFBhZ2VTaXplOiBvcHRpb25zLm1heFBhZ2VTaXplLFxuICAgICAgICAgICAgICAgIHRyYWNpbmdPcHRpb25zOiB1cGRhdGVkT3B0aW9ucy50cmFjaW5nT3B0aW9ucyxcbiAgICAgICAgICAgIH0pKTtcbiAgICAgICAgICAgIGNvbnN0IHdyYXBwZWRSZXNwb25zZSA9IE9iamVjdC5hc3NpZ24oT2JqZWN0LmFzc2lnbih7fSwgcmVzcG9uc2UpLCB7IF9yZXNwb25zZTogcmVzcG9uc2UuX3Jlc3BvbnNlLCBibG9iczogcmVzcG9uc2UuYmxvYnMubWFwKChibG9iKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgIHZhciBfYTtcbiAgICAgICAgICAgICAgICAgICAgbGV0IHRhZ1ZhbHVlID0gXCJcIjtcbiAgICAgICAgICAgICAgICAgICAgaWYgKCgoX2EgPSBibG9iLnRhZ3MpID09PSBudWxsIHx8IF9hID09PSB2b2lkIDAgPyB2b2lkIDAgOiBfYS5ibG9iVGFnU2V0Lmxlbmd0aCkgPT09IDEpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRhZ1ZhbHVlID0gYmxvYi50YWdzLmJsb2JUYWdTZXRbMF0udmFsdWU7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIE9iamVjdC5hc3NpZ24oT2JqZWN0LmFzc2lnbih7fSwgYmxvYiksIHsgdGFnczogdG9UYWdzKGJsb2IudGFncyksIHRhZ1ZhbHVlIH0pO1xuICAgICAgICAgICAgICAgIH0pIH0pO1xuICAgICAgICAgICAgcmV0dXJuIHdyYXBwZWRSZXNwb25zZTtcbiAgICAgICAgfSk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIFJldHVybnMgYW4gQXN5bmNJdGVyYWJsZUl0ZXJhdG9yIGZvciBTZXJ2aWNlRmluZEJsb2JzQnlUYWdzU2VnbWVudFJlc3BvbnNlLlxuICAgICAqXG4gICAgICogQHBhcmFtIHRhZ0ZpbHRlclNxbEV4cHJlc3Npb24gLSAgVGhlIHdoZXJlIHBhcmFtZXRlciBlbmFibGVzIHRoZSBjYWxsZXIgdG8gcXVlcnkgYmxvYnMgd2hvc2UgdGFncyBtYXRjaCBhIGdpdmVuIGV4cHJlc3Npb24uXG4gICAgICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRoZSBnaXZlbiBleHByZXNzaW9uIG11c3QgZXZhbHVhdGUgdG8gdHJ1ZSBmb3IgYSBibG9iIHRvIGJlIHJldHVybmVkIGluIHRoZSByZXN1bHRzLlxuICAgICAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUaGVbT0RhdGEgLSBBQk5GXSBmaWx0ZXIgc3ludGF4IHJ1bGUgZGVmaW5lcyB0aGUgZm9ybWFsIGdyYW1tYXIgZm9yIHRoZSB2YWx1ZSBvZiB0aGUgd2hlcmUgcXVlcnkgcGFyYW1ldGVyO1xuICAgICAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBob3dldmVyLCBvbmx5IGEgc3Vic2V0IG9mIHRoZSBPRGF0YSBmaWx0ZXIgc3ludGF4IGlzIHN1cHBvcnRlZCBpbiB0aGUgQmxvYiBzZXJ2aWNlLlxuICAgICAqIEBwYXJhbSBtYXJrZXIgLSBBIHN0cmluZyB2YWx1ZSB0aGF0IGlkZW50aWZpZXMgdGhlIHBvcnRpb24gb2ZcbiAgICAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgdGhlIGxpc3Qgb2YgYmxvYnMgdG8gYmUgcmV0dXJuZWQgd2l0aCB0aGUgbmV4dCBsaXN0aW5nIG9wZXJhdGlvbi4gVGhlXG4gICAgICogICAgICAgICAgICAgICAgICAgICAgICAgIG9wZXJhdGlvbiByZXR1cm5zIHRoZSBjb250aW51YXRpb25Ub2tlbiB2YWx1ZSB3aXRoaW4gdGhlIHJlc3BvbnNlIGJvZHkgaWYgdGhlXG4gICAgICogICAgICAgICAgICAgICAgICAgICAgICAgIGxpc3Rpbmcgb3BlcmF0aW9uIGRpZCBub3QgcmV0dXJuIGFsbCBibG9icyByZW1haW5pbmcgdG8gYmUgbGlzdGVkXG4gICAgICogICAgICAgICAgICAgICAgICAgICAgICAgIHdpdGggdGhlIGN1cnJlbnQgcGFnZS4gVGhlIGNvbnRpbnVhdGlvblRva2VuIHZhbHVlIGNhbiBiZSB1c2VkIGFzIHRoZSB2YWx1ZSBmb3JcbiAgICAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgdGhlIG1hcmtlciBwYXJhbWV0ZXIgaW4gYSBzdWJzZXF1ZW50IGNhbGwgdG8gcmVxdWVzdCB0aGUgbmV4dCBwYWdlIG9mIGxpc3RcbiAgICAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgaXRlbXMuIFRoZSBtYXJrZXIgdmFsdWUgaXMgb3BhcXVlIHRvIHRoZSBjbGllbnQuXG4gICAgICogQHBhcmFtIG9wdGlvbnMgLSBPcHRpb25zIHRvIGZpbmQgYmxvYnMgYnkgdGFncy5cbiAgICAgKi9cbiAgICBmaW5kQmxvYnNCeVRhZ3NTZWdtZW50cyh0YWdGaWx0ZXJTcWxFeHByZXNzaW9uXzEsIG1hcmtlcl8xKSB7XG4gICAgICAgIHJldHVybiB0c2xpYi5fX2FzeW5jR2VuZXJhdG9yKHRoaXMsIGFyZ3VtZW50cywgZnVuY3Rpb24qIGZpbmRCbG9ic0J5VGFnc1NlZ21lbnRzXzEodGFnRmlsdGVyU3FsRXhwcmVzc2lvbiwgbWFya2VyLCBvcHRpb25zID0ge30pIHtcbiAgICAgICAgICAgIGxldCByZXNwb25zZTtcbiAgICAgICAgICAgIGlmICghIW1hcmtlciB8fCBtYXJrZXIgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgICAgIGRvIHtcbiAgICAgICAgICAgICAgICAgICAgcmVzcG9uc2UgPSB5aWVsZCB0c2xpYi5fX2F3YWl0KHRoaXMuZmluZEJsb2JzQnlUYWdzU2VnbWVudCh0YWdGaWx0ZXJTcWxFeHByZXNzaW9uLCBtYXJrZXIsIG9wdGlvbnMpKTtcbiAgICAgICAgICAgICAgICAgICAgcmVzcG9uc2UuYmxvYnMgPSByZXNwb25zZS5ibG9icyB8fCBbXTtcbiAgICAgICAgICAgICAgICAgICAgbWFya2VyID0gcmVzcG9uc2UuY29udGludWF0aW9uVG9rZW47XG4gICAgICAgICAgICAgICAgICAgIHlpZWxkIHlpZWxkIHRzbGliLl9fYXdhaXQocmVzcG9uc2UpO1xuICAgICAgICAgICAgICAgIH0gd2hpbGUgKG1hcmtlcik7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBSZXR1cm5zIGFuIEFzeW5jSXRlcmFibGVJdGVyYXRvciBmb3IgYmxvYnMuXG4gICAgICpcbiAgICAgKiBAcGFyYW0gdGFnRmlsdGVyU3FsRXhwcmVzc2lvbiAtICBUaGUgd2hlcmUgcGFyYW1ldGVyIGVuYWJsZXMgdGhlIGNhbGxlciB0byBxdWVyeSBibG9icyB3aG9zZSB0YWdzIG1hdGNoIGEgZ2l2ZW4gZXhwcmVzc2lvbi5cbiAgICAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGhlIGdpdmVuIGV4cHJlc3Npb24gbXVzdCBldmFsdWF0ZSB0byB0cnVlIGZvciBhIGJsb2IgdG8gYmUgcmV0dXJuZWQgaW4gdGhlIHJlc3VsdHMuXG4gICAgICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRoZVtPRGF0YSAtIEFCTkZdIGZpbHRlciBzeW50YXggcnVsZSBkZWZpbmVzIHRoZSBmb3JtYWwgZ3JhbW1hciBmb3IgdGhlIHZhbHVlIG9mIHRoZSB3aGVyZSBxdWVyeSBwYXJhbWV0ZXI7XG4gICAgICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhvd2V2ZXIsIG9ubHkgYSBzdWJzZXQgb2YgdGhlIE9EYXRhIGZpbHRlciBzeW50YXggaXMgc3VwcG9ydGVkIGluIHRoZSBCbG9iIHNlcnZpY2UuXG4gICAgICogQHBhcmFtIG9wdGlvbnMgLSBPcHRpb25zIHRvIGZpbmRCbG9ic0J5VGFnc0l0ZW1zLlxuICAgICAqL1xuICAgIGZpbmRCbG9ic0J5VGFnc0l0ZW1zKHRhZ0ZpbHRlclNxbEV4cHJlc3Npb25fMSkge1xuICAgICAgICByZXR1cm4gdHNsaWIuX19hc3luY0dlbmVyYXRvcih0aGlzLCBhcmd1bWVudHMsIGZ1bmN0aW9uKiBmaW5kQmxvYnNCeVRhZ3NJdGVtc18xKHRhZ0ZpbHRlclNxbEV4cHJlc3Npb24sIG9wdGlvbnMgPSB7fSkge1xuICAgICAgICAgICAgdmFyIF9hLCBlXzEsIF9iLCBfYztcbiAgICAgICAgICAgIGxldCBtYXJrZXI7XG4gICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgIGZvciAodmFyIF9kID0gdHJ1ZSwgX2UgPSB0c2xpYi5fX2FzeW5jVmFsdWVzKHRoaXMuZmluZEJsb2JzQnlUYWdzU2VnbWVudHModGFnRmlsdGVyU3FsRXhwcmVzc2lvbiwgbWFya2VyLCBvcHRpb25zKSksIF9mOyBfZiA9IHlpZWxkIHRzbGliLl9fYXdhaXQoX2UubmV4dCgpKSwgX2EgPSBfZi5kb25lLCAhX2E7IF9kID0gdHJ1ZSkge1xuICAgICAgICAgICAgICAgICAgICBfYyA9IF9mLnZhbHVlO1xuICAgICAgICAgICAgICAgICAgICBfZCA9IGZhbHNlO1xuICAgICAgICAgICAgICAgICAgICBjb25zdCBzZWdtZW50ID0gX2M7XG4gICAgICAgICAgICAgICAgICAgIHlpZWxkIHRzbGliLl9fYXdhaXQoeWllbGQqIHRzbGliLl9fYXN5bmNEZWxlZ2F0b3IodHNsaWIuX19hc3luY1ZhbHVlcyhzZWdtZW50LmJsb2JzKSkpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGNhdGNoIChlXzFfMSkgeyBlXzEgPSB7IGVycm9yOiBlXzFfMSB9OyB9XG4gICAgICAgICAgICBmaW5hbGx5IHtcbiAgICAgICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgICAgICBpZiAoIV9kICYmICFfYSAmJiAoX2IgPSBfZS5yZXR1cm4pKSB5aWVsZCB0c2xpYi5fX2F3YWl0KF9iLmNhbGwoX2UpKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgZmluYWxseSB7IGlmIChlXzEpIHRocm93IGVfMS5lcnJvcjsgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogUmV0dXJucyBhbiBhc3luYyBpdGVyYWJsZSBpdGVyYXRvciB0byBmaW5kIGFsbCBibG9icyB3aXRoIHNwZWNpZmllZCB0YWdcbiAgICAgKiB1bmRlciB0aGUgc3BlY2lmaWVkIGFjY291bnQuXG4gICAgICpcbiAgICAgKiAuYnlQYWdlKCkgcmV0dXJucyBhbiBhc3luYyBpdGVyYWJsZSBpdGVyYXRvciB0byBsaXN0IHRoZSBibG9icyBpbiBwYWdlcy5cbiAgICAgKlxuICAgICAqIEBzZWUgaHR0cHM6Ly9kb2NzLm1pY3Jvc29mdC5jb20vZW4tdXMvcmVzdC9hcGkvc3RvcmFnZXNlcnZpY2VzL2dldC1ibG9iLXNlcnZpY2UtcHJvcGVydGllc1xuICAgICAqXG4gICAgICogRXhhbXBsZSB1c2luZyBgZm9yIGF3YWl0YCBzeW50YXg6XG4gICAgICpcbiAgICAgKiBgYGBqc1xuICAgICAqIGxldCBpID0gMTtcbiAgICAgKiBmb3IgYXdhaXQgKGNvbnN0IGJsb2Igb2YgYmxvYlNlcnZpY2VDbGllbnQuZmluZEJsb2JzQnlUYWdzKFwidGFna2V5PSd0YWd2YWx1ZSdcIikpIHtcbiAgICAgKiAgIGNvbnNvbGUubG9nKGBCbG9iICR7aSsrfTogJHtjb250YWluZXIubmFtZX1gKTtcbiAgICAgKiB9XG4gICAgICogYGBgXG4gICAgICpcbiAgICAgKiBFeGFtcGxlIHVzaW5nIGBpdGVyLm5leHQoKWA6XG4gICAgICpcbiAgICAgKiBgYGBqc1xuICAgICAqIGxldCBpID0gMTtcbiAgICAgKiBjb25zdCBpdGVyID0gYmxvYlNlcnZpY2VDbGllbnQuZmluZEJsb2JzQnlUYWdzKFwidGFna2V5PSd0YWd2YWx1ZSdcIik7XG4gICAgICogbGV0IGJsb2JJdGVtID0gYXdhaXQgaXRlci5uZXh0KCk7XG4gICAgICogd2hpbGUgKCFibG9iSXRlbS5kb25lKSB7XG4gICAgICogICBjb25zb2xlLmxvZyhgQmxvYiAke2krK306ICR7YmxvYkl0ZW0udmFsdWUubmFtZX1gKTtcbiAgICAgKiAgIGJsb2JJdGVtID0gYXdhaXQgaXRlci5uZXh0KCk7XG4gICAgICogfVxuICAgICAqIGBgYFxuICAgICAqXG4gICAgICogRXhhbXBsZSB1c2luZyBgYnlQYWdlKClgOlxuICAgICAqXG4gICAgICogYGBganNcbiAgICAgKiAvLyBwYXNzaW5nIG9wdGlvbmFsIG1heFBhZ2VTaXplIGluIHRoZSBwYWdlIHNldHRpbmdzXG4gICAgICogbGV0IGkgPSAxO1xuICAgICAqIGZvciBhd2FpdCAoY29uc3QgcmVzcG9uc2Ugb2YgYmxvYlNlcnZpY2VDbGllbnQuZmluZEJsb2JzQnlUYWdzKFwidGFna2V5PSd0YWd2YWx1ZSdcIikuYnlQYWdlKHsgbWF4UGFnZVNpemU6IDIwIH0pKSB7XG4gICAgICogICBpZiAocmVzcG9uc2UuYmxvYnMpIHtcbiAgICAgKiAgICAgZm9yIChjb25zdCBibG9iIG9mIHJlc3BvbnNlLmJsb2JzKSB7XG4gICAgICogICAgICAgY29uc29sZS5sb2coYEJsb2IgJHtpKyt9OiAke2Jsb2IubmFtZX1gKTtcbiAgICAgKiAgICAgfVxuICAgICAqICAgfVxuICAgICAqIH1cbiAgICAgKiBgYGBcbiAgICAgKlxuICAgICAqIEV4YW1wbGUgdXNpbmcgcGFnaW5nIHdpdGggYSBtYXJrZXI6XG4gICAgICpcbiAgICAgKiBgYGBqc1xuICAgICAqIGxldCBpID0gMTtcbiAgICAgKiBsZXQgaXRlcmF0b3IgPSBibG9iU2VydmljZUNsaWVudC5maW5kQmxvYnNCeVRhZ3MoXCJ0YWdrZXk9J3RhZ3ZhbHVlJ1wiKS5ieVBhZ2UoeyBtYXhQYWdlU2l6ZTogMiB9KTtcbiAgICAgKiBsZXQgcmVzcG9uc2UgPSAoYXdhaXQgaXRlcmF0b3IubmV4dCgpKS52YWx1ZTtcbiAgICAgKlxuICAgICAqIC8vIFByaW50cyAyIGJsb2IgbmFtZXNcbiAgICAgKiBpZiAocmVzcG9uc2UuYmxvYnMpIHtcbiAgICAgKiAgIGZvciAoY29uc3QgYmxvYiBvZiByZXNwb25zZS5ibG9icykge1xuICAgICAqICAgICBjb25zb2xlLmxvZyhgQmxvYiAke2krK306ICR7YmxvYi5uYW1lfWApO1xuICAgICAqICAgfVxuICAgICAqIH1cbiAgICAgKlxuICAgICAqIC8vIEdldHMgbmV4dCBtYXJrZXJcbiAgICAgKiBsZXQgbWFya2VyID0gcmVzcG9uc2UuY29udGludWF0aW9uVG9rZW47XG4gICAgICogLy8gUGFzc2luZyBuZXh0IG1hcmtlciBhcyBjb250aW51YXRpb25Ub2tlblxuICAgICAqIGl0ZXJhdG9yID0gYmxvYlNlcnZpY2VDbGllbnRcbiAgICAgKiAgIC5maW5kQmxvYnNCeVRhZ3MoXCJ0YWdrZXk9J3RhZ3ZhbHVlJ1wiKVxuICAgICAqICAgLmJ5UGFnZSh7IGNvbnRpbnVhdGlvblRva2VuOiBtYXJrZXIsIG1heFBhZ2VTaXplOiAxMCB9KTtcbiAgICAgKiByZXNwb25zZSA9IChhd2FpdCBpdGVyYXRvci5uZXh0KCkpLnZhbHVlO1xuICAgICAqXG4gICAgICogLy8gUHJpbnRzIGJsb2IgbmFtZXNcbiAgICAgKiBpZiAocmVzcG9uc2UuYmxvYnMpIHtcbiAgICAgKiAgIGZvciAoY29uc3QgYmxvYiBvZiByZXNwb25zZS5ibG9icykge1xuICAgICAqICAgICAgY29uc29sZS5sb2coYEJsb2IgJHtpKyt9OiAke2Jsb2IubmFtZX1gKTtcbiAgICAgKiAgIH1cbiAgICAgKiB9XG4gICAgICogYGBgXG4gICAgICpcbiAgICAgKiBAcGFyYW0gdGFnRmlsdGVyU3FsRXhwcmVzc2lvbiAtICBUaGUgd2hlcmUgcGFyYW1ldGVyIGVuYWJsZXMgdGhlIGNhbGxlciB0byBxdWVyeSBibG9icyB3aG9zZSB0YWdzIG1hdGNoIGEgZ2l2ZW4gZXhwcmVzc2lvbi5cbiAgICAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGhlIGdpdmVuIGV4cHJlc3Npb24gbXVzdCBldmFsdWF0ZSB0byB0cnVlIGZvciBhIGJsb2IgdG8gYmUgcmV0dXJuZWQgaW4gdGhlIHJlc3VsdHMuXG4gICAgICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRoZVtPRGF0YSAtIEFCTkZdIGZpbHRlciBzeW50YXggcnVsZSBkZWZpbmVzIHRoZSBmb3JtYWwgZ3JhbW1hciBmb3IgdGhlIHZhbHVlIG9mIHRoZSB3aGVyZSBxdWVyeSBwYXJhbWV0ZXI7XG4gICAgICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhvd2V2ZXIsIG9ubHkgYSBzdWJzZXQgb2YgdGhlIE9EYXRhIGZpbHRlciBzeW50YXggaXMgc3VwcG9ydGVkIGluIHRoZSBCbG9iIHNlcnZpY2UuXG4gICAgICogQHBhcmFtIG9wdGlvbnMgLSBPcHRpb25zIHRvIGZpbmQgYmxvYnMgYnkgdGFncy5cbiAgICAgKi9cbiAgICBmaW5kQmxvYnNCeVRhZ3ModGFnRmlsdGVyU3FsRXhwcmVzc2lvbiwgb3B0aW9ucyA9IHt9KSB7XG4gICAgICAgIC8vIEFzeW5jSXRlcmFibGVJdGVyYXRvciB0byBpdGVyYXRlIG92ZXIgYmxvYnNcbiAgICAgICAgY29uc3QgbGlzdFNlZ21lbnRPcHRpb25zID0gT2JqZWN0LmFzc2lnbih7fSwgb3B0aW9ucyk7XG4gICAgICAgIGNvbnN0IGl0ZXIgPSB0aGlzLmZpbmRCbG9ic0J5VGFnc0l0ZW1zKHRhZ0ZpbHRlclNxbEV4cHJlc3Npb24sIGxpc3RTZWdtZW50T3B0aW9ucyk7XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAvKipcbiAgICAgICAgICAgICAqIFRoZSBuZXh0IG1ldGhvZCwgcGFydCBvZiB0aGUgaXRlcmF0aW9uIHByb3RvY29sXG4gICAgICAgICAgICAgKi9cbiAgICAgICAgICAgIG5leHQoKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGl0ZXIubmV4dCgpO1xuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIC8qKlxuICAgICAgICAgICAgICogVGhlIGNvbm5lY3Rpb24gdG8gdGhlIGFzeW5jIGl0ZXJhdG9yLCBwYXJ0IG9mIHRoZSBpdGVyYXRpb24gcHJvdG9jb2xcbiAgICAgICAgICAgICAqL1xuICAgICAgICAgICAgW1N5bWJvbC5hc3luY0l0ZXJhdG9yXSgpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gdGhpcztcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAvKipcbiAgICAgICAgICAgICAqIFJldHVybiBhbiBBc3luY0l0ZXJhYmxlSXRlcmF0b3IgdGhhdCB3b3JrcyBhIHBhZ2UgYXQgYSB0aW1lXG4gICAgICAgICAgICAgKi9cbiAgICAgICAgICAgIGJ5UGFnZTogKHNldHRpbmdzID0ge30pID0+IHtcbiAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5maW5kQmxvYnNCeVRhZ3NTZWdtZW50cyh0YWdGaWx0ZXJTcWxFeHByZXNzaW9uLCBzZXR0aW5ncy5jb250aW51YXRpb25Ub2tlbiwgT2JqZWN0LmFzc2lnbih7IG1heFBhZ2VTaXplOiBzZXR0aW5ncy5tYXhQYWdlU2l6ZSB9LCBsaXN0U2VnbWVudE9wdGlvbnMpKTtcbiAgICAgICAgICAgIH0sXG4gICAgICAgIH07XG4gICAgfVxuICAgIC8qKlxuICAgICAqIFJldHVybnMgYW4gQXN5bmNJdGVyYWJsZUl0ZXJhdG9yIGZvciBTZXJ2aWNlTGlzdENvbnRhaW5lcnNTZWdtZW50UmVzcG9uc2VzXG4gICAgICpcbiAgICAgKiBAcGFyYW0gbWFya2VyIC0gQSBzdHJpbmcgdmFsdWUgdGhhdCBpZGVudGlmaWVzIHRoZSBwb3J0aW9uIG9mXG4gICAgICogICAgICAgICAgICAgICAgICAgICAgICB0aGUgbGlzdCBvZiBjb250YWluZXJzIHRvIGJlIHJldHVybmVkIHdpdGggdGhlIG5leHQgbGlzdGluZyBvcGVyYXRpb24uIFRoZVxuICAgICAqICAgICAgICAgICAgICAgICAgICAgICAgb3BlcmF0aW9uIHJldHVybnMgdGhlIGNvbnRpbnVhdGlvblRva2VuIHZhbHVlIHdpdGhpbiB0aGUgcmVzcG9uc2UgYm9keSBpZiB0aGVcbiAgICAgKiAgICAgICAgICAgICAgICAgICAgICAgIGxpc3Rpbmcgb3BlcmF0aW9uIGRpZCBub3QgcmV0dXJuIGFsbCBjb250YWluZXJzIHJlbWFpbmluZyB0byBiZSBsaXN0ZWRcbiAgICAgKiAgICAgICAgICAgICAgICAgICAgICAgIHdpdGggdGhlIGN1cnJlbnQgcGFnZS4gVGhlIGNvbnRpbnVhdGlvblRva2VuIHZhbHVlIGNhbiBiZSB1c2VkIGFzIHRoZSB2YWx1ZSBmb3JcbiAgICAgKiAgICAgICAgICAgICAgICAgICAgICAgIHRoZSBtYXJrZXIgcGFyYW1ldGVyIGluIGEgc3Vic2VxdWVudCBjYWxsIHRvIHJlcXVlc3QgdGhlIG5leHQgcGFnZSBvZiBsaXN0XG4gICAgICogICAgICAgICAgICAgICAgICAgICAgICBpdGVtcy4gVGhlIG1hcmtlciB2YWx1ZSBpcyBvcGFxdWUgdG8gdGhlIGNsaWVudC5cbiAgICAgKiBAcGFyYW0gb3B0aW9ucyAtIE9wdGlvbnMgdG8gbGlzdCBjb250YWluZXJzIG9wZXJhdGlvbi5cbiAgICAgKi9cbiAgICBsaXN0U2VnbWVudHMobWFya2VyXzEpIHtcbiAgICAgICAgcmV0dXJuIHRzbGliLl9fYXN5bmNHZW5lcmF0b3IodGhpcywgYXJndW1lbnRzLCBmdW5jdGlvbiogbGlzdFNlZ21lbnRzXzEobWFya2VyLCBvcHRpb25zID0ge30pIHtcbiAgICAgICAgICAgIGxldCBsaXN0Q29udGFpbmVyc1NlZ21lbnRSZXNwb25zZTtcbiAgICAgICAgICAgIGlmICghIW1hcmtlciB8fCBtYXJrZXIgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgICAgIGRvIHtcbiAgICAgICAgICAgICAgICAgICAgbGlzdENvbnRhaW5lcnNTZWdtZW50UmVzcG9uc2UgPSB5aWVsZCB0c2xpYi5fX2F3YWl0KHRoaXMubGlzdENvbnRhaW5lcnNTZWdtZW50KG1hcmtlciwgb3B0aW9ucykpO1xuICAgICAgICAgICAgICAgICAgICBsaXN0Q29udGFpbmVyc1NlZ21lbnRSZXNwb25zZS5jb250YWluZXJJdGVtcyA9XG4gICAgICAgICAgICAgICAgICAgICAgICBsaXN0Q29udGFpbmVyc1NlZ21lbnRSZXNwb25zZS5jb250YWluZXJJdGVtcyB8fCBbXTtcbiAgICAgICAgICAgICAgICAgICAgbWFya2VyID0gbGlzdENvbnRhaW5lcnNTZWdtZW50UmVzcG9uc2UuY29udGludWF0aW9uVG9rZW47XG4gICAgICAgICAgICAgICAgICAgIHlpZWxkIHlpZWxkIHRzbGliLl9fYXdhaXQoeWllbGQgdHNsaWIuX19hd2FpdChsaXN0Q29udGFpbmVyc1NlZ21lbnRSZXNwb25zZSkpO1xuICAgICAgICAgICAgICAgIH0gd2hpbGUgKG1hcmtlcik7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBSZXR1cm5zIGFuIEFzeW5jSXRlcmFibGVJdGVyYXRvciBmb3IgQ29udGFpbmVyIEl0ZW1zXG4gICAgICpcbiAgICAgKiBAcGFyYW0gb3B0aW9ucyAtIE9wdGlvbnMgdG8gbGlzdCBjb250YWluZXJzIG9wZXJhdGlvbi5cbiAgICAgKi9cbiAgICBsaXN0SXRlbXMoKSB7XG4gICAgICAgIHJldHVybiB0c2xpYi5fX2FzeW5jR2VuZXJhdG9yKHRoaXMsIGFyZ3VtZW50cywgZnVuY3Rpb24qIGxpc3RJdGVtc18xKG9wdGlvbnMgPSB7fSkge1xuICAgICAgICAgICAgdmFyIF9hLCBlXzIsIF9iLCBfYztcbiAgICAgICAgICAgIGxldCBtYXJrZXI7XG4gICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgIGZvciAodmFyIF9kID0gdHJ1ZSwgX2UgPSB0c2xpYi5fX2FzeW5jVmFsdWVzKHRoaXMubGlzdFNlZ21lbnRzKG1hcmtlciwgb3B0aW9ucykpLCBfZjsgX2YgPSB5aWVsZCB0c2xpYi5fX2F3YWl0KF9lLm5leHQoKSksIF9hID0gX2YuZG9uZSwgIV9hOyBfZCA9IHRydWUpIHtcbiAgICAgICAgICAgICAgICAgICAgX2MgPSBfZi52YWx1ZTtcbiAgICAgICAgICAgICAgICAgICAgX2QgPSBmYWxzZTtcbiAgICAgICAgICAgICAgICAgICAgY29uc3Qgc2VnbWVudCA9IF9jO1xuICAgICAgICAgICAgICAgICAgICB5aWVsZCB0c2xpYi5fX2F3YWl0KHlpZWxkKiB0c2xpYi5fX2FzeW5jRGVsZWdhdG9yKHRzbGliLl9fYXN5bmNWYWx1ZXMoc2VnbWVudC5jb250YWluZXJJdGVtcykpKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBjYXRjaCAoZV8yXzEpIHsgZV8yID0geyBlcnJvcjogZV8yXzEgfTsgfVxuICAgICAgICAgICAgZmluYWxseSB7XG4gICAgICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKCFfZCAmJiAhX2EgJiYgKF9iID0gX2UucmV0dXJuKSkgeWllbGQgdHNsaWIuX19hd2FpdChfYi5jYWxsKF9lKSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGZpbmFsbHkgeyBpZiAoZV8yKSB0aHJvdyBlXzIuZXJyb3I7IH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIFJldHVybnMgYW4gYXN5bmMgaXRlcmFibGUgaXRlcmF0b3IgdG8gbGlzdCBhbGwgdGhlIGNvbnRhaW5lcnNcbiAgICAgKiB1bmRlciB0aGUgc3BlY2lmaWVkIGFjY291bnQuXG4gICAgICpcbiAgICAgKiAuYnlQYWdlKCkgcmV0dXJucyBhbiBhc3luYyBpdGVyYWJsZSBpdGVyYXRvciB0byBsaXN0IHRoZSBjb250YWluZXJzIGluIHBhZ2VzLlxuICAgICAqXG4gICAgICogRXhhbXBsZSB1c2luZyBgZm9yIGF3YWl0YCBzeW50YXg6XG4gICAgICpcbiAgICAgKiBgYGBqc1xuICAgICAqIGxldCBpID0gMTtcbiAgICAgKiBmb3IgYXdhaXQgKGNvbnN0IGNvbnRhaW5lciBvZiBibG9iU2VydmljZUNsaWVudC5saXN0Q29udGFpbmVycygpKSB7XG4gICAgICogICBjb25zb2xlLmxvZyhgQ29udGFpbmVyICR7aSsrfTogJHtjb250YWluZXIubmFtZX1gKTtcbiAgICAgKiB9XG4gICAgICogYGBgXG4gICAgICpcbiAgICAgKiBFeGFtcGxlIHVzaW5nIGBpdGVyLm5leHQoKWA6XG4gICAgICpcbiAgICAgKiBgYGBqc1xuICAgICAqIGxldCBpID0gMTtcbiAgICAgKiBjb25zdCBpdGVyID0gYmxvYlNlcnZpY2VDbGllbnQubGlzdENvbnRhaW5lcnMoKTtcbiAgICAgKiBsZXQgY29udGFpbmVySXRlbSA9IGF3YWl0IGl0ZXIubmV4dCgpO1xuICAgICAqIHdoaWxlICghY29udGFpbmVySXRlbS5kb25lKSB7XG4gICAgICogICBjb25zb2xlLmxvZyhgQ29udGFpbmVyICR7aSsrfTogJHtjb250YWluZXJJdGVtLnZhbHVlLm5hbWV9YCk7XG4gICAgICogICBjb250YWluZXJJdGVtID0gYXdhaXQgaXRlci5uZXh0KCk7XG4gICAgICogfVxuICAgICAqIGBgYFxuICAgICAqXG4gICAgICogRXhhbXBsZSB1c2luZyBgYnlQYWdlKClgOlxuICAgICAqXG4gICAgICogYGBganNcbiAgICAgKiAvLyBwYXNzaW5nIG9wdGlvbmFsIG1heFBhZ2VTaXplIGluIHRoZSBwYWdlIHNldHRpbmdzXG4gICAgICogbGV0IGkgPSAxO1xuICAgICAqIGZvciBhd2FpdCAoY29uc3QgcmVzcG9uc2Ugb2YgYmxvYlNlcnZpY2VDbGllbnQubGlzdENvbnRhaW5lcnMoKS5ieVBhZ2UoeyBtYXhQYWdlU2l6ZTogMjAgfSkpIHtcbiAgICAgKiAgIGlmIChyZXNwb25zZS5jb250YWluZXJJdGVtcykge1xuICAgICAqICAgICBmb3IgKGNvbnN0IGNvbnRhaW5lciBvZiByZXNwb25zZS5jb250YWluZXJJdGVtcykge1xuICAgICAqICAgICAgIGNvbnNvbGUubG9nKGBDb250YWluZXIgJHtpKyt9OiAke2NvbnRhaW5lci5uYW1lfWApO1xuICAgICAqICAgICB9XG4gICAgICogICB9XG4gICAgICogfVxuICAgICAqIGBgYFxuICAgICAqXG4gICAgICogRXhhbXBsZSB1c2luZyBwYWdpbmcgd2l0aCBhIG1hcmtlcjpcbiAgICAgKlxuICAgICAqIGBgYGpzXG4gICAgICogbGV0IGkgPSAxO1xuICAgICAqIGxldCBpdGVyYXRvciA9IGJsb2JTZXJ2aWNlQ2xpZW50Lmxpc3RDb250YWluZXJzKCkuYnlQYWdlKHsgbWF4UGFnZVNpemU6IDIgfSk7XG4gICAgICogbGV0IHJlc3BvbnNlID0gKGF3YWl0IGl0ZXJhdG9yLm5leHQoKSkudmFsdWU7XG4gICAgICpcbiAgICAgKiAvLyBQcmludHMgMiBjb250YWluZXIgbmFtZXNcbiAgICAgKiBpZiAocmVzcG9uc2UuY29udGFpbmVySXRlbXMpIHtcbiAgICAgKiAgIGZvciAoY29uc3QgY29udGFpbmVyIG9mIHJlc3BvbnNlLmNvbnRhaW5lckl0ZW1zKSB7XG4gICAgICogICAgIGNvbnNvbGUubG9nKGBDb250YWluZXIgJHtpKyt9OiAke2NvbnRhaW5lci5uYW1lfWApO1xuICAgICAqICAgfVxuICAgICAqIH1cbiAgICAgKlxuICAgICAqIC8vIEdldHMgbmV4dCBtYXJrZXJcbiAgICAgKiBsZXQgbWFya2VyID0gcmVzcG9uc2UuY29udGludWF0aW9uVG9rZW47XG4gICAgICogLy8gUGFzc2luZyBuZXh0IG1hcmtlciBhcyBjb250aW51YXRpb25Ub2tlblxuICAgICAqIGl0ZXJhdG9yID0gYmxvYlNlcnZpY2VDbGllbnRcbiAgICAgKiAgIC5saXN0Q29udGFpbmVycygpXG4gICAgICogICAuYnlQYWdlKHsgY29udGludWF0aW9uVG9rZW46IG1hcmtlciwgbWF4UGFnZVNpemU6IDEwIH0pO1xuICAgICAqIHJlc3BvbnNlID0gKGF3YWl0IGl0ZXJhdG9yLm5leHQoKSkudmFsdWU7XG4gICAgICpcbiAgICAgKiAvLyBQcmludHMgMTAgY29udGFpbmVyIG5hbWVzXG4gICAgICogaWYgKHJlc3BvbnNlLmNvbnRhaW5lckl0ZW1zKSB7XG4gICAgICogICBmb3IgKGNvbnN0IGNvbnRhaW5lciBvZiByZXNwb25zZS5jb250YWluZXJJdGVtcykge1xuICAgICAqICAgICAgY29uc29sZS5sb2coYENvbnRhaW5lciAke2krK306ICR7Y29udGFpbmVyLm5hbWV9YCk7XG4gICAgICogICB9XG4gICAgICogfVxuICAgICAqIGBgYFxuICAgICAqXG4gICAgICogQHBhcmFtIG9wdGlvbnMgLSBPcHRpb25zIHRvIGxpc3QgY29udGFpbmVycy5cbiAgICAgKiBAcmV0dXJucyBBbiBhc3luY0l0ZXJhYmxlSXRlcmF0b3IgdGhhdCBzdXBwb3J0cyBwYWdpbmcuXG4gICAgICovXG4gICAgbGlzdENvbnRhaW5lcnMob3B0aW9ucyA9IHt9KSB7XG4gICAgICAgIGlmIChvcHRpb25zLnByZWZpeCA9PT0gXCJcIikge1xuICAgICAgICAgICAgb3B0aW9ucy5wcmVmaXggPSB1bmRlZmluZWQ7XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgaW5jbHVkZSA9IFtdO1xuICAgICAgICBpZiAob3B0aW9ucy5pbmNsdWRlRGVsZXRlZCkge1xuICAgICAgICAgICAgaW5jbHVkZS5wdXNoKFwiZGVsZXRlZFwiKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAob3B0aW9ucy5pbmNsdWRlTWV0YWRhdGEpIHtcbiAgICAgICAgICAgIGluY2x1ZGUucHVzaChcIm1ldGFkYXRhXCIpO1xuICAgICAgICB9XG4gICAgICAgIGlmIChvcHRpb25zLmluY2x1ZGVTeXN0ZW0pIHtcbiAgICAgICAgICAgIGluY2x1ZGUucHVzaChcInN5c3RlbVwiKTtcbiAgICAgICAgfVxuICAgICAgICAvLyBBc3luY0l0ZXJhYmxlSXRlcmF0b3IgdG8gaXRlcmF0ZSBvdmVyIGNvbnRhaW5lcnNcbiAgICAgICAgY29uc3QgbGlzdFNlZ21lbnRPcHRpb25zID0gT2JqZWN0LmFzc2lnbihPYmplY3QuYXNzaWduKHt9LCBvcHRpb25zKSwgKGluY2x1ZGUubGVuZ3RoID4gMCA/IHsgaW5jbHVkZSB9IDoge30pKTtcbiAgICAgICAgY29uc3QgaXRlciA9IHRoaXMubGlzdEl0ZW1zKGxpc3RTZWdtZW50T3B0aW9ucyk7XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAvKipcbiAgICAgICAgICAgICAqIFRoZSBuZXh0IG1ldGhvZCwgcGFydCBvZiB0aGUgaXRlcmF0aW9uIHByb3RvY29sXG4gICAgICAgICAgICAgKi9cbiAgICAgICAgICAgIG5leHQoKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGl0ZXIubmV4dCgpO1xuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIC8qKlxuICAgICAgICAgICAgICogVGhlIGNvbm5lY3Rpb24gdG8gdGhlIGFzeW5jIGl0ZXJhdG9yLCBwYXJ0IG9mIHRoZSBpdGVyYXRpb24gcHJvdG9jb2xcbiAgICAgICAgICAgICAqL1xuICAgICAgICAgICAgW1N5bWJvbC5hc3luY0l0ZXJhdG9yXSgpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gdGhpcztcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAvKipcbiAgICAgICAgICAgICAqIFJldHVybiBhbiBBc3luY0l0ZXJhYmxlSXRlcmF0b3IgdGhhdCB3b3JrcyBhIHBhZ2UgYXQgYSB0aW1lXG4gICAgICAgICAgICAgKi9cbiAgICAgICAgICAgIGJ5UGFnZTogKHNldHRpbmdzID0ge30pID0+IHtcbiAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5saXN0U2VnbWVudHMoc2V0dGluZ3MuY29udGludWF0aW9uVG9rZW4sIE9iamVjdC5hc3NpZ24oeyBtYXhQYWdlU2l6ZTogc2V0dGluZ3MubWF4UGFnZVNpemUgfSwgbGlzdFNlZ21lbnRPcHRpb25zKSk7XG4gICAgICAgICAgICB9LFxuICAgICAgICB9O1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBPTkxZIEFWQUlMQUJMRSBXSEVOIFVTSU5HIEJFQVJFUiBUT0tFTiBBVVRIRU5USUNBVElPTiAoVG9rZW5DcmVkZW50aWFsKS5cbiAgICAgKlxuICAgICAqIFJldHJpZXZlcyBhIHVzZXIgZGVsZWdhdGlvbiBrZXkgZm9yIHRoZSBCbG9iIHNlcnZpY2UuIFRoaXMgaXMgb25seSBhIHZhbGlkIG9wZXJhdGlvbiB3aGVuIHVzaW5nXG4gICAgICogYmVhcmVyIHRva2VuIGF1dGhlbnRpY2F0aW9uLlxuICAgICAqXG4gICAgICogQHNlZSBodHRwczovL2RvY3MubWljcm9zb2Z0LmNvbS9lbi11cy9yZXN0L2FwaS9zdG9yYWdlc2VydmljZXMvZ2V0LXVzZXItZGVsZWdhdGlvbi1rZXlcbiAgICAgKlxuICAgICAqIEBwYXJhbSBzdGFydHNPbiAtICAgICAgVGhlIHN0YXJ0IHRpbWUgZm9yIHRoZSB1c2VyIGRlbGVnYXRpb24gU0FTLiBNdXN0IGJlIHdpdGhpbiA3IGRheXMgb2YgdGhlIGN1cnJlbnQgdGltZVxuICAgICAqIEBwYXJhbSBleHBpcmVzT24gLSAgICAgVGhlIGVuZCB0aW1lIGZvciB0aGUgdXNlciBkZWxlZ2F0aW9uIFNBUy4gTXVzdCBiZSB3aXRoaW4gNyBkYXlzIG9mIHRoZSBjdXJyZW50IHRpbWVcbiAgICAgKi9cbiAgICBhc3luYyBnZXRVc2VyRGVsZWdhdGlvbktleShzdGFydHNPbiwgZXhwaXJlc09uLCBvcHRpb25zID0ge30pIHtcbiAgICAgICAgcmV0dXJuIHRyYWNpbmdDbGllbnQud2l0aFNwYW4oXCJCbG9iU2VydmljZUNsaWVudC1nZXRVc2VyRGVsZWdhdGlvbktleVwiLCBvcHRpb25zLCBhc3luYyAodXBkYXRlZE9wdGlvbnMpID0+IHtcbiAgICAgICAgICAgIGNvbnN0IHJlc3BvbnNlID0gYXNzZXJ0UmVzcG9uc2UoYXdhaXQgdGhpcy5zZXJ2aWNlQ29udGV4dC5nZXRVc2VyRGVsZWdhdGlvbktleSh7XG4gICAgICAgICAgICAgICAgc3RhcnRzT246IHRydW5jYXRlZElTTzgwNjFEYXRlKHN0YXJ0c09uLCBmYWxzZSksXG4gICAgICAgICAgICAgICAgZXhwaXJlc09uOiB0cnVuY2F0ZWRJU084MDYxRGF0ZShleHBpcmVzT24sIGZhbHNlKSxcbiAgICAgICAgICAgIH0sIHtcbiAgICAgICAgICAgICAgICBhYm9ydFNpZ25hbDogb3B0aW9ucy5hYm9ydFNpZ25hbCxcbiAgICAgICAgICAgICAgICB0cmFjaW5nT3B0aW9uczogdXBkYXRlZE9wdGlvbnMudHJhY2luZ09wdGlvbnMsXG4gICAgICAgICAgICB9KSk7XG4gICAgICAgICAgICBjb25zdCB1c2VyRGVsZWdhdGlvbktleSA9IHtcbiAgICAgICAgICAgICAgICBzaWduZWRPYmplY3RJZDogcmVzcG9uc2Uuc2lnbmVkT2JqZWN0SWQsXG4gICAgICAgICAgICAgICAgc2lnbmVkVGVuYW50SWQ6IHJlc3BvbnNlLnNpZ25lZFRlbmFudElkLFxuICAgICAgICAgICAgICAgIHNpZ25lZFN0YXJ0c09uOiBuZXcgRGF0ZShyZXNwb25zZS5zaWduZWRTdGFydHNPbiksXG4gICAgICAgICAgICAgICAgc2lnbmVkRXhwaXJlc09uOiBuZXcgRGF0ZShyZXNwb25zZS5zaWduZWRFeHBpcmVzT24pLFxuICAgICAgICAgICAgICAgIHNpZ25lZFNlcnZpY2U6IHJlc3BvbnNlLnNpZ25lZFNlcnZpY2UsXG4gICAgICAgICAgICAgICAgc2lnbmVkVmVyc2lvbjogcmVzcG9uc2Uuc2lnbmVkVmVyc2lvbixcbiAgICAgICAgICAgICAgICB2YWx1ZTogcmVzcG9uc2UudmFsdWUsXG4gICAgICAgICAgICB9O1xuICAgICAgICAgICAgY29uc3QgcmVzID0gT2JqZWN0LmFzc2lnbih7IF9yZXNwb25zZTogcmVzcG9uc2UuX3Jlc3BvbnNlLCByZXF1ZXN0SWQ6IHJlc3BvbnNlLnJlcXVlc3RJZCwgY2xpZW50UmVxdWVzdElkOiByZXNwb25zZS5jbGllbnRSZXF1ZXN0SWQsIHZlcnNpb246IHJlc3BvbnNlLnZlcnNpb24sIGRhdGU6IHJlc3BvbnNlLmRhdGUsIGVycm9yQ29kZTogcmVzcG9uc2UuZXJyb3JDb2RlIH0sIHVzZXJEZWxlZ2F0aW9uS2V5KTtcbiAgICAgICAgICAgIHJldHVybiByZXM7XG4gICAgICAgIH0pO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBDcmVhdGVzIGEgQmxvYkJhdGNoQ2xpZW50IG9iamVjdCB0byBjb25kdWN0IGJhdGNoIG9wZXJhdGlvbnMuXG4gICAgICpcbiAgICAgKiBAc2VlIGh0dHBzOi8vZG9jcy5taWNyb3NvZnQuY29tL2VuLXVzL3Jlc3QvYXBpL3N0b3JhZ2VzZXJ2aWNlcy9ibG9iLWJhdGNoXG4gICAgICpcbiAgICAgKiBAcmV0dXJucyBBIG5ldyBCbG9iQmF0Y2hDbGllbnQgb2JqZWN0IGZvciB0aGlzIHNlcnZpY2UuXG4gICAgICovXG4gICAgZ2V0QmxvYkJhdGNoQ2xpZW50KCkge1xuICAgICAgICByZXR1cm4gbmV3IEJsb2JCYXRjaENsaWVudCh0aGlzLnVybCwgdGhpcy5waXBlbGluZSk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIE9ubHkgYXZhaWxhYmxlIGZvciBCbG9iU2VydmljZUNsaWVudCBjb25zdHJ1Y3RlZCB3aXRoIGEgc2hhcmVkIGtleSBjcmVkZW50aWFsLlxuICAgICAqXG4gICAgICogR2VuZXJhdGVzIGEgQmxvYiBhY2NvdW50IFNoYXJlZCBBY2Nlc3MgU2lnbmF0dXJlIChTQVMpIFVSSSBiYXNlZCBvbiB0aGUgY2xpZW50IHByb3BlcnRpZXNcbiAgICAgKiBhbmQgcGFyYW1ldGVycyBwYXNzZWQgaW4uIFRoZSBTQVMgaXMgc2lnbmVkIGJ5IHRoZSBzaGFyZWQga2V5IGNyZWRlbnRpYWwgb2YgdGhlIGNsaWVudC5cbiAgICAgKlxuICAgICAqIEBzZWUgaHR0cHM6Ly9kb2NzLm1pY3Jvc29mdC5jb20vZW4tdXMvcmVzdC9hcGkvc3RvcmFnZXNlcnZpY2VzL2NyZWF0ZS1hY2NvdW50LXNhc1xuICAgICAqXG4gICAgICogQHBhcmFtIGV4cGlyZXNPbiAtIE9wdGlvbmFsLiBUaGUgdGltZSBhdCB3aGljaCB0aGUgc2hhcmVkIGFjY2VzcyBzaWduYXR1cmUgYmVjb21lcyBpbnZhbGlkLiBEZWZhdWx0IHRvIGFuIGhvdXIgbGF0ZXIgaWYgbm90IHByb3ZpZGVkLlxuICAgICAqIEBwYXJhbSBwZXJtaXNzaW9ucyAtIFNwZWNpZmllcyB0aGUgbGlzdCBvZiBwZXJtaXNzaW9ucyB0byBiZSBhc3NvY2lhdGVkIHdpdGggdGhlIFNBUy5cbiAgICAgKiBAcGFyYW0gcmVzb3VyY2VUeXBlcyAtIFNwZWNpZmllcyB0aGUgcmVzb3VyY2UgdHlwZXMgYXNzb2NpYXRlZCB3aXRoIHRoZSBzaGFyZWQgYWNjZXNzIHNpZ25hdHVyZS5cbiAgICAgKiBAcGFyYW0gb3B0aW9ucyAtIE9wdGlvbmFsIHBhcmFtZXRlcnMuXG4gICAgICogQHJldHVybnMgQW4gYWNjb3VudCBTQVMgVVJJIGNvbnNpc3Rpbmcgb2YgdGhlIFVSSSB0byB0aGUgcmVzb3VyY2UgcmVwcmVzZW50ZWQgYnkgdGhpcyBjbGllbnQsIGZvbGxvd2VkIGJ5IHRoZSBnZW5lcmF0ZWQgU0FTIHRva2VuLlxuICAgICAqL1xuICAgIGdlbmVyYXRlQWNjb3VudFNhc1VybChleHBpcmVzT24sIHBlcm1pc3Npb25zID0gQWNjb3VudFNBU1Blcm1pc3Npb25zLnBhcnNlKFwiclwiKSwgcmVzb3VyY2VUeXBlcyA9IFwic2NvXCIsIG9wdGlvbnMgPSB7fSkge1xuICAgICAgICBpZiAoISh0aGlzLmNyZWRlbnRpYWwgaW5zdGFuY2VvZiBTdG9yYWdlU2hhcmVkS2V5Q3JlZGVudGlhbCkpIHtcbiAgICAgICAgICAgIHRocm93IFJhbmdlRXJyb3IoXCJDYW4gb25seSBnZW5lcmF0ZSB0aGUgYWNjb3VudCBTQVMgd2hlbiB0aGUgY2xpZW50IGlzIGluaXRpYWxpemVkIHdpdGggYSBzaGFyZWQga2V5IGNyZWRlbnRpYWxcIik7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGV4cGlyZXNPbiA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICBjb25zdCBub3cgPSBuZXcgRGF0ZSgpO1xuICAgICAgICAgICAgZXhwaXJlc09uID0gbmV3IERhdGUobm93LmdldFRpbWUoKSArIDM2MDAgKiAxMDAwKTtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBzYXMgPSBnZW5lcmF0ZUFjY291bnRTQVNRdWVyeVBhcmFtZXRlcnMoT2JqZWN0LmFzc2lnbih7IHBlcm1pc3Npb25zLFxuICAgICAgICAgICAgZXhwaXJlc09uLFxuICAgICAgICAgICAgcmVzb3VyY2VUeXBlcywgc2VydmljZXM6IEFjY291bnRTQVNTZXJ2aWNlcy5wYXJzZShcImJcIikudG9TdHJpbmcoKSB9LCBvcHRpb25zKSwgdGhpcy5jcmVkZW50aWFsKS50b1N0cmluZygpO1xuICAgICAgICByZXR1cm4gYXBwZW5kVG9VUkxRdWVyeSh0aGlzLnVybCwgc2FzKTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogT25seSBhdmFpbGFibGUgZm9yIEJsb2JTZXJ2aWNlQ2xpZW50IGNvbnN0cnVjdGVkIHdpdGggYSBzaGFyZWQga2V5IGNyZWRlbnRpYWwuXG4gICAgICpcbiAgICAgKiBHZW5lcmF0ZXMgc3RyaW5nIHRvIHNpZ24gZm9yIGEgQmxvYiBhY2NvdW50IFNoYXJlZCBBY2Nlc3MgU2lnbmF0dXJlIChTQVMpIFVSSSBiYXNlZCBvblxuICAgICAqIHRoZSBjbGllbnQgcHJvcGVydGllcyBhbmQgcGFyYW1ldGVycyBwYXNzZWQgaW4uIFRoZSBTQVMgaXMgc2lnbmVkIGJ5IHRoZSBzaGFyZWQga2V5IGNyZWRlbnRpYWwgb2YgdGhlIGNsaWVudC5cbiAgICAgKlxuICAgICAqIEBzZWUgaHR0cHM6Ly9kb2NzLm1pY3Jvc29mdC5jb20vZW4tdXMvcmVzdC9hcGkvc3RvcmFnZXNlcnZpY2VzL2NyZWF0ZS1hY2NvdW50LXNhc1xuICAgICAqXG4gICAgICogQHBhcmFtIGV4cGlyZXNPbiAtIE9wdGlvbmFsLiBUaGUgdGltZSBhdCB3aGljaCB0aGUgc2hhcmVkIGFjY2VzcyBzaWduYXR1cmUgYmVjb21lcyBpbnZhbGlkLiBEZWZhdWx0IHRvIGFuIGhvdXIgbGF0ZXIgaWYgbm90IHByb3ZpZGVkLlxuICAgICAqIEBwYXJhbSBwZXJtaXNzaW9ucyAtIFNwZWNpZmllcyB0aGUgbGlzdCBvZiBwZXJtaXNzaW9ucyB0byBiZSBhc3NvY2lhdGVkIHdpdGggdGhlIFNBUy5cbiAgICAgKiBAcGFyYW0gcmVzb3VyY2VUeXBlcyAtIFNwZWNpZmllcyB0aGUgcmVzb3VyY2UgdHlwZXMgYXNzb2NpYXRlZCB3aXRoIHRoZSBzaGFyZWQgYWNjZXNzIHNpZ25hdHVyZS5cbiAgICAgKiBAcGFyYW0gb3B0aW9ucyAtIE9wdGlvbmFsIHBhcmFtZXRlcnMuXG4gICAgICogQHJldHVybnMgQW4gYWNjb3VudCBTQVMgVVJJIGNvbnNpc3Rpbmcgb2YgdGhlIFVSSSB0byB0aGUgcmVzb3VyY2UgcmVwcmVzZW50ZWQgYnkgdGhpcyBjbGllbnQsIGZvbGxvd2VkIGJ5IHRoZSBnZW5lcmF0ZWQgU0FTIHRva2VuLlxuICAgICAqL1xuICAgIGdlbmVyYXRlU2FzU3RyaW5nVG9TaWduKGV4cGlyZXNPbiwgcGVybWlzc2lvbnMgPSBBY2NvdW50U0FTUGVybWlzc2lvbnMucGFyc2UoXCJyXCIpLCByZXNvdXJjZVR5cGVzID0gXCJzY29cIiwgb3B0aW9ucyA9IHt9KSB7XG4gICAgICAgIGlmICghKHRoaXMuY3JlZGVudGlhbCBpbnN0YW5jZW9mIFN0b3JhZ2VTaGFyZWRLZXlDcmVkZW50aWFsKSkge1xuICAgICAgICAgICAgdGhyb3cgUmFuZ2VFcnJvcihcIkNhbiBvbmx5IGdlbmVyYXRlIHRoZSBhY2NvdW50IFNBUyB3aGVuIHRoZSBjbGllbnQgaXMgaW5pdGlhbGl6ZWQgd2l0aCBhIHNoYXJlZCBrZXkgY3JlZGVudGlhbFwiKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoZXhwaXJlc09uID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgIGNvbnN0IG5vdyA9IG5ldyBEYXRlKCk7XG4gICAgICAgICAgICBleHBpcmVzT24gPSBuZXcgRGF0ZShub3cuZ2V0VGltZSgpICsgMzYwMCAqIDEwMDApO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBnZW5lcmF0ZUFjY291bnRTQVNRdWVyeVBhcmFtZXRlcnNJbnRlcm5hbChPYmplY3QuYXNzaWduKHsgcGVybWlzc2lvbnMsXG4gICAgICAgICAgICBleHBpcmVzT24sXG4gICAgICAgICAgICByZXNvdXJjZVR5cGVzLCBzZXJ2aWNlczogQWNjb3VudFNBU1NlcnZpY2VzLnBhcnNlKFwiYlwiKS50b1N0cmluZygpIH0sIG9wdGlvbnMpLCB0aGlzLmNyZWRlbnRpYWwpLnN0cmluZ1RvU2lnbjtcbiAgICB9XG59XG5cbi8vIENvcHlyaWdodCAoYykgTWljcm9zb2Z0IENvcnBvcmF0aW9uLlxuLy8gTGljZW5zZWQgdW5kZXIgdGhlIE1JVCBMaWNlbnNlLlxuLyoqIEtub3duIHZhbHVlcyBvZiB7QGxpbmsgRW5jcnlwdGlvbkFsZ29yaXRobVR5cGV9IHRoYXQgdGhlIHNlcnZpY2UgYWNjZXB0cy4gKi9cbmV4cG9ydHMuS25vd25FbmNyeXB0aW9uQWxnb3JpdGhtVHlwZSA9IHZvaWQgMDtcbihmdW5jdGlvbiAoS25vd25FbmNyeXB0aW9uQWxnb3JpdGhtVHlwZSkge1xuICAgIEtub3duRW5jcnlwdGlvbkFsZ29yaXRobVR5cGVbXCJBRVMyNTZcIl0gPSBcIkFFUzI1NlwiO1xufSkoZXhwb3J0cy5Lbm93bkVuY3J5cHRpb25BbGdvcml0aG1UeXBlIHx8IChleHBvcnRzLktub3duRW5jcnlwdGlvbkFsZ29yaXRobVR5cGUgPSB7fSkpO1xuXG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJSZXN0RXJyb3JcIiwge1xuICAgIGVudW1lcmFibGU6IHRydWUsXG4gICAgZ2V0OiBmdW5jdGlvbiAoKSB7IHJldHVybiBjb3JlUmVzdFBpcGVsaW5lLlJlc3RFcnJvcjsgfVxufSk7XG5leHBvcnRzLkFjY291bnRTQVNQZXJtaXNzaW9ucyA9IEFjY291bnRTQVNQZXJtaXNzaW9ucztcbmV4cG9ydHMuQWNjb3VudFNBU1Jlc291cmNlVHlwZXMgPSBBY2NvdW50U0FTUmVzb3VyY2VUeXBlcztcbmV4cG9ydHMuQWNjb3VudFNBU1NlcnZpY2VzID0gQWNjb3VudFNBU1NlcnZpY2VzO1xuZXhwb3J0cy5Bbm9ueW1vdXNDcmVkZW50aWFsID0gQW5vbnltb3VzQ3JlZGVudGlhbDtcbmV4cG9ydHMuQW5vbnltb3VzQ3JlZGVudGlhbFBvbGljeSA9IEFub255bW91c0NyZWRlbnRpYWxQb2xpY3k7XG5leHBvcnRzLkFwcGVuZEJsb2JDbGllbnQgPSBBcHBlbmRCbG9iQ2xpZW50O1xuZXhwb3J0cy5CYXNlUmVxdWVzdFBvbGljeSA9IEJhc2VSZXF1ZXN0UG9saWN5O1xuZXhwb3J0cy5CbG9iQmF0Y2ggPSBCbG9iQmF0Y2g7XG5leHBvcnRzLkJsb2JCYXRjaENsaWVudCA9IEJsb2JCYXRjaENsaWVudDtcbmV4cG9ydHMuQmxvYkNsaWVudCA9IEJsb2JDbGllbnQ7XG5leHBvcnRzLkJsb2JMZWFzZUNsaWVudCA9IEJsb2JMZWFzZUNsaWVudDtcbmV4cG9ydHMuQmxvYlNBU1Blcm1pc3Npb25zID0gQmxvYlNBU1Blcm1pc3Npb25zO1xuZXhwb3J0cy5CbG9iU2VydmljZUNsaWVudCA9IEJsb2JTZXJ2aWNlQ2xpZW50O1xuZXhwb3J0cy5CbG9ja0Jsb2JDbGllbnQgPSBCbG9ja0Jsb2JDbGllbnQ7XG5leHBvcnRzLkNvbnRhaW5lckNsaWVudCA9IENvbnRhaW5lckNsaWVudDtcbmV4cG9ydHMuQ29udGFpbmVyU0FTUGVybWlzc2lvbnMgPSBDb250YWluZXJTQVNQZXJtaXNzaW9ucztcbmV4cG9ydHMuQ3JlZGVudGlhbCA9IENyZWRlbnRpYWw7XG5leHBvcnRzLkNyZWRlbnRpYWxQb2xpY3kgPSBDcmVkZW50aWFsUG9saWN5O1xuZXhwb3J0cy5QYWdlQmxvYkNsaWVudCA9IFBhZ2VCbG9iQ2xpZW50O1xuZXhwb3J0cy5QaXBlbGluZSA9IFBpcGVsaW5lO1xuZXhwb3J0cy5TQVNRdWVyeVBhcmFtZXRlcnMgPSBTQVNRdWVyeVBhcmFtZXRlcnM7XG5leHBvcnRzLlN0b3JhZ2VCcm93c2VyUG9saWN5ID0gU3RvcmFnZUJyb3dzZXJQb2xpY3k7XG5leHBvcnRzLlN0b3JhZ2VCcm93c2VyUG9saWN5RmFjdG9yeSA9IFN0b3JhZ2VCcm93c2VyUG9saWN5RmFjdG9yeTtcbmV4cG9ydHMuU3RvcmFnZU9BdXRoU2NvcGVzID0gU3RvcmFnZU9BdXRoU2NvcGVzO1xuZXhwb3J0cy5TdG9yYWdlUmV0cnlQb2xpY3kgPSBTdG9yYWdlUmV0cnlQb2xpY3k7XG5leHBvcnRzLlN0b3JhZ2VSZXRyeVBvbGljeUZhY3RvcnkgPSBTdG9yYWdlUmV0cnlQb2xpY3lGYWN0b3J5O1xuZXhwb3J0cy5TdG9yYWdlU2hhcmVkS2V5Q3JlZGVudGlhbCA9IFN0b3JhZ2VTaGFyZWRLZXlDcmVkZW50aWFsO1xuZXhwb3J0cy5TdG9yYWdlU2hhcmVkS2V5Q3JlZGVudGlhbFBvbGljeSA9IFN0b3JhZ2VTaGFyZWRLZXlDcmVkZW50aWFsUG9saWN5O1xuZXhwb3J0cy5nZW5lcmF0ZUFjY291bnRTQVNRdWVyeVBhcmFtZXRlcnMgPSBnZW5lcmF0ZUFjY291bnRTQVNRdWVyeVBhcmFtZXRlcnM7XG5leHBvcnRzLmdlbmVyYXRlQmxvYlNBU1F1ZXJ5UGFyYW1ldGVycyA9IGdlbmVyYXRlQmxvYlNBU1F1ZXJ5UGFyYW1ldGVycztcbmV4cG9ydHMuZ2V0QmxvYlNlcnZpY2VBY2NvdW50QXVkaWVuY2UgPSBnZXRCbG9iU2VydmljZUFjY291bnRBdWRpZW5jZTtcbmV4cG9ydHMuaXNQaXBlbGluZUxpa2UgPSBpc1BpcGVsaW5lTGlrZTtcbmV4cG9ydHMubG9nZ2VyID0gbG9nZ2VyO1xuZXhwb3J0cy5uZXdQaXBlbGluZSA9IG5ld1BpcGVsaW5lO1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9aW5kZXguanMubWFwXG4iLAogICAgIlwidXNlIHN0cmljdFwiO1xudmFyIF9fY3JlYXRlQmluZGluZyA9ICh0aGlzICYmIHRoaXMuX19jcmVhdGVCaW5kaW5nKSB8fCAoT2JqZWN0LmNyZWF0ZSA/IChmdW5jdGlvbihvLCBtLCBrLCBrMikge1xuICAgIGlmIChrMiA9PT0gdW5kZWZpbmVkKSBrMiA9IGs7XG4gICAgdmFyIGRlc2MgPSBPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKG0sIGspO1xuICAgIGlmICghZGVzYyB8fCAoXCJnZXRcIiBpbiBkZXNjID8gIW0uX19lc01vZHVsZSA6IGRlc2Mud3JpdGFibGUgfHwgZGVzYy5jb25maWd1cmFibGUpKSB7XG4gICAgICBkZXNjID0geyBlbnVtZXJhYmxlOiB0cnVlLCBnZXQ6IGZ1bmN0aW9uKCkgeyByZXR1cm4gbVtrXTsgfSB9O1xuICAgIH1cbiAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkobywgazIsIGRlc2MpO1xufSkgOiAoZnVuY3Rpb24obywgbSwgaywgazIpIHtcbiAgICBpZiAoazIgPT09IHVuZGVmaW5lZCkgazIgPSBrO1xuICAgIG9bazJdID0gbVtrXTtcbn0pKTtcbnZhciBfX3NldE1vZHVsZURlZmF1bHQgPSAodGhpcyAmJiB0aGlzLl9fc2V0TW9kdWxlRGVmYXVsdCkgfHwgKE9iamVjdC5jcmVhdGUgPyAoZnVuY3Rpb24obywgdikge1xuICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShvLCBcImRlZmF1bHRcIiwgeyBlbnVtZXJhYmxlOiB0cnVlLCB2YWx1ZTogdiB9KTtcbn0pIDogZnVuY3Rpb24obywgdikge1xuICAgIG9bXCJkZWZhdWx0XCJdID0gdjtcbn0pO1xudmFyIF9faW1wb3J0U3RhciA9ICh0aGlzICYmIHRoaXMuX19pbXBvcnRTdGFyKSB8fCBmdW5jdGlvbiAobW9kKSB7XG4gICAgaWYgKG1vZCAmJiBtb2QuX19lc01vZHVsZSkgcmV0dXJuIG1vZDtcbiAgICB2YXIgcmVzdWx0ID0ge307XG4gICAgaWYgKG1vZCAhPSBudWxsKSBmb3IgKHZhciBrIGluIG1vZCkgaWYgKGsgIT09IFwiZGVmYXVsdFwiICYmIE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChtb2QsIGspKSBfX2NyZWF0ZUJpbmRpbmcocmVzdWx0LCBtb2QsIGspO1xuICAgIF9fc2V0TW9kdWxlRGVmYXVsdChyZXN1bHQsIG1vZCk7XG4gICAgcmV0dXJuIHJlc3VsdDtcbn07XG52YXIgX19hd2FpdGVyID0gKHRoaXMgJiYgdGhpcy5fX2F3YWl0ZXIpIHx8IGZ1bmN0aW9uICh0aGlzQXJnLCBfYXJndW1lbnRzLCBQLCBnZW5lcmF0b3IpIHtcbiAgICBmdW5jdGlvbiBhZG9wdCh2YWx1ZSkgeyByZXR1cm4gdmFsdWUgaW5zdGFuY2VvZiBQID8gdmFsdWUgOiBuZXcgUChmdW5jdGlvbiAocmVzb2x2ZSkgeyByZXNvbHZlKHZhbHVlKTsgfSk7IH1cbiAgICByZXR1cm4gbmV3IChQIHx8IChQID0gUHJvbWlzZSkpKGZ1bmN0aW9uIChyZXNvbHZlLCByZWplY3QpIHtcbiAgICAgICAgZnVuY3Rpb24gZnVsZmlsbGVkKHZhbHVlKSB7IHRyeSB7IHN0ZXAoZ2VuZXJhdG9yLm5leHQodmFsdWUpKTsgfSBjYXRjaCAoZSkgeyByZWplY3QoZSk7IH0gfVxuICAgICAgICBmdW5jdGlvbiByZWplY3RlZCh2YWx1ZSkgeyB0cnkgeyBzdGVwKGdlbmVyYXRvcltcInRocm93XCJdKHZhbHVlKSk7IH0gY2F0Y2ggKGUpIHsgcmVqZWN0KGUpOyB9IH1cbiAgICAgICAgZnVuY3Rpb24gc3RlcChyZXN1bHQpIHsgcmVzdWx0LmRvbmUgPyByZXNvbHZlKHJlc3VsdC52YWx1ZSkgOiBhZG9wdChyZXN1bHQudmFsdWUpLnRoZW4oZnVsZmlsbGVkLCByZWplY3RlZCk7IH1cbiAgICAgICAgc3RlcCgoZ2VuZXJhdG9yID0gZ2VuZXJhdG9yLmFwcGx5KHRoaXNBcmcsIF9hcmd1bWVudHMgfHwgW10pKS5uZXh0KCkpO1xuICAgIH0pO1xufTtcbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIl9fZXNNb2R1bGVcIiwgeyB2YWx1ZTogdHJ1ZSB9KTtcbmV4cG9ydHMudXBsb2FkWmlwVG9CbG9iU3RvcmFnZSA9IHZvaWQgMDtcbmNvbnN0IHN0b3JhZ2VfYmxvYl8xID0gcmVxdWlyZShcIkBhenVyZS9zdG9yYWdlLWJsb2JcIik7XG5jb25zdCBjb25maWdfMSA9IHJlcXVpcmUoXCIuLi9zaGFyZWQvY29uZmlnXCIpO1xuY29uc3QgY29yZSA9IF9faW1wb3J0U3RhcihyZXF1aXJlKFwiQGFjdGlvbnMvY29yZVwiKSk7XG5jb25zdCBjcnlwdG8gPSBfX2ltcG9ydFN0YXIocmVxdWlyZShcImNyeXB0b1wiKSk7XG5jb25zdCBzdHJlYW0gPSBfX2ltcG9ydFN0YXIocmVxdWlyZShcInN0cmVhbVwiKSk7XG5jb25zdCBlcnJvcnNfMSA9IHJlcXVpcmUoXCIuLi9zaGFyZWQvZXJyb3JzXCIpO1xuZnVuY3Rpb24gdXBsb2FkWmlwVG9CbG9iU3RvcmFnZShhdXRoZW50aWNhdGVkVXBsb2FkVVJMLCB6aXBVcGxvYWRTdHJlYW0pIHtcbiAgICByZXR1cm4gX19hd2FpdGVyKHRoaXMsIHZvaWQgMCwgdm9pZCAwLCBmdW5jdGlvbiogKCkge1xuICAgICAgICBsZXQgdXBsb2FkQnl0ZUNvdW50ID0gMDtcbiAgICAgICAgbGV0IGxhc3RQcm9ncmVzc1RpbWUgPSBEYXRlLm5vdygpO1xuICAgICAgICBjb25zdCBhYm9ydENvbnRyb2xsZXIgPSBuZXcgQWJvcnRDb250cm9sbGVyKCk7XG4gICAgICAgIGNvbnN0IGNodW5rVGltZXIgPSAoaW50ZXJ2YWwpID0+IF9fYXdhaXRlcih0aGlzLCB2b2lkIDAsIHZvaWQgMCwgZnVuY3Rpb24qICgpIHtcbiAgICAgICAgICAgIHJldHVybiBuZXcgUHJvbWlzZSgocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XG4gICAgICAgICAgICAgICAgY29uc3QgdGltZXIgPSBzZXRJbnRlcnZhbCgoKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgIGlmIChEYXRlLm5vdygpIC0gbGFzdFByb2dyZXNzVGltZSA+IGludGVydmFsKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICByZWplY3QobmV3IEVycm9yKCdVcGxvYWQgcHJvZ3Jlc3Mgc3RhbGxlZC4nKSk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9LCBpbnRlcnZhbCk7XG4gICAgICAgICAgICAgICAgYWJvcnRDb250cm9sbGVyLnNpZ25hbC5hZGRFdmVudExpc3RlbmVyKCdhYm9ydCcsICgpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgY2xlYXJJbnRlcnZhbCh0aW1lcik7XG4gICAgICAgICAgICAgICAgICAgIHJlc29sdmUoKTtcbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9KTtcbiAgICAgICAgY29uc3QgbWF4Q29uY3VycmVuY3kgPSAoMCwgY29uZmlnXzEuZ2V0Q29uY3VycmVuY3kpKCk7XG4gICAgICAgIGNvbnN0IGJ1ZmZlclNpemUgPSAoMCwgY29uZmlnXzEuZ2V0VXBsb2FkQ2h1bmtTaXplKSgpO1xuICAgICAgICBjb25zdCBibG9iQ2xpZW50ID0gbmV3IHN0b3JhZ2VfYmxvYl8xLkJsb2JDbGllbnQoYXV0aGVudGljYXRlZFVwbG9hZFVSTCk7XG4gICAgICAgIGNvbnN0IGJsb2NrQmxvYkNsaWVudCA9IGJsb2JDbGllbnQuZ2V0QmxvY2tCbG9iQ2xpZW50KCk7XG4gICAgICAgIGNvcmUuZGVidWcoYFVwbG9hZGluZyBhcnRpZmFjdCB6aXAgdG8gYmxvYiBzdG9yYWdlIHdpdGggbWF4Q29uY3VycmVuY3k6ICR7bWF4Q29uY3VycmVuY3l9LCBidWZmZXJTaXplOiAke2J1ZmZlclNpemV9YCk7XG4gICAgICAgIGNvbnN0IHVwbG9hZENhbGxiYWNrID0gKHByb2dyZXNzKSA9PiB7XG4gICAgICAgICAgICBjb3JlLmluZm8oYFVwbG9hZGVkIGJ5dGVzICR7cHJvZ3Jlc3MubG9hZGVkQnl0ZXN9YCk7XG4gICAgICAgICAgICB1cGxvYWRCeXRlQ291bnQgPSBwcm9ncmVzcy5sb2FkZWRCeXRlcztcbiAgICAgICAgICAgIGxhc3RQcm9ncmVzc1RpbWUgPSBEYXRlLm5vdygpO1xuICAgICAgICB9O1xuICAgICAgICBjb25zdCBvcHRpb25zID0ge1xuICAgICAgICAgICAgYmxvYkhUVFBIZWFkZXJzOiB7IGJsb2JDb250ZW50VHlwZTogJ3ppcCcgfSxcbiAgICAgICAgICAgIG9uUHJvZ3Jlc3M6IHVwbG9hZENhbGxiYWNrLFxuICAgICAgICAgICAgYWJvcnRTaWduYWw6IGFib3J0Q29udHJvbGxlci5zaWduYWxcbiAgICAgICAgfTtcbiAgICAgICAgbGV0IHNoYTI1Nkhhc2ggPSB1bmRlZmluZWQ7XG4gICAgICAgIGNvbnN0IHVwbG9hZFN0cmVhbSA9IG5ldyBzdHJlYW0uUGFzc1Rocm91Z2goKTtcbiAgICAgICAgY29uc3QgaGFzaFN0cmVhbSA9IGNyeXB0by5jcmVhdGVIYXNoKCdzaGEyNTYnKTtcbiAgICAgICAgemlwVXBsb2FkU3RyZWFtLnBpcGUodXBsb2FkU3RyZWFtKTsgLy8gVGhpcyBzdHJlYW0gaXMgdXNlZCBmb3IgdGhlIHVwbG9hZFxuICAgICAgICB6aXBVcGxvYWRTdHJlYW0ucGlwZShoYXNoU3RyZWFtKS5zZXRFbmNvZGluZygnaGV4Jyk7IC8vIFRoaXMgc3RyZWFtIGlzIHVzZWQgdG8gY29tcHV0ZSBhIGhhc2ggb2YgdGhlIHppcCBjb250ZW50IHRoYXQgZ2V0cyB1c2VkLiBJbnRlZ3JpdHkgY2hlY2tcbiAgICAgICAgY29yZS5pbmZvKCdCZWdpbm5pbmcgdXBsb2FkIG9mIGFydGlmYWN0IGNvbnRlbnQgdG8gYmxvYiBzdG9yYWdlJyk7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgICB5aWVsZCBQcm9taXNlLnJhY2UoW1xuICAgICAgICAgICAgICAgIGJsb2NrQmxvYkNsaWVudC51cGxvYWRTdHJlYW0odXBsb2FkU3RyZWFtLCBidWZmZXJTaXplLCBtYXhDb25jdXJyZW5jeSwgb3B0aW9ucyksXG4gICAgICAgICAgICAgICAgY2h1bmtUaW1lcigoMCwgY29uZmlnXzEuZ2V0VXBsb2FkQ2h1bmtUaW1lb3V0KSgpKVxuICAgICAgICAgICAgXSk7XG4gICAgICAgIH1cbiAgICAgICAgY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgICAgICBpZiAoZXJyb3JzXzEuTmV0d29ya0Vycm9yLmlzTmV0d29ya0Vycm9yQ29kZShlcnJvciA9PT0gbnVsbCB8fCBlcnJvciA9PT0gdm9pZCAwID8gdm9pZCAwIDogZXJyb3IuY29kZSkpIHtcbiAgICAgICAgICAgICAgICB0aHJvdyBuZXcgZXJyb3JzXzEuTmV0d29ya0Vycm9yKGVycm9yID09PSBudWxsIHx8IGVycm9yID09PSB2b2lkIDAgPyB2b2lkIDAgOiBlcnJvci5jb2RlKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHRocm93IGVycm9yO1xuICAgICAgICB9XG4gICAgICAgIGZpbmFsbHkge1xuICAgICAgICAgICAgYWJvcnRDb250cm9sbGVyLmFib3J0KCk7XG4gICAgICAgIH1cbiAgICAgICAgY29yZS5pbmZvKCdGaW5pc2hlZCB1cGxvYWRpbmcgYXJ0aWZhY3QgY29udGVudCB0byBibG9iIHN0b3JhZ2UhJyk7XG4gICAgICAgIGhhc2hTdHJlYW0uZW5kKCk7XG4gICAgICAgIHNoYTI1Nkhhc2ggPSBoYXNoU3RyZWFtLnJlYWQoKTtcbiAgICAgICAgY29yZS5pbmZvKGBTSEEyNTYgaGFzaCBvZiB1cGxvYWRlZCBhcnRpZmFjdCB6aXAgaXMgJHtzaGEyNTZIYXNofWApO1xuICAgICAgICBpZiAodXBsb2FkQnl0ZUNvdW50ID09PSAwKSB7XG4gICAgICAgICAgICBjb3JlLndhcm5pbmcoYE5vIGRhdGEgd2FzIHVwbG9hZGVkIHRvIGJsb2Igc3RvcmFnZS4gUmVwb3J0ZWQgdXBsb2FkIGJ5dGUgY291bnQgaXMgMC5gKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgdXBsb2FkU2l6ZTogdXBsb2FkQnl0ZUNvdW50LFxuICAgICAgICAgICAgc2hhMjU2SGFzaFxuICAgICAgICB9O1xuICAgIH0pO1xufVxuZXhwb3J0cy51cGxvYWRaaXBUb0Jsb2JTdG9yYWdlID0gdXBsb2FkWmlwVG9CbG9iU3RvcmFnZTtcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPWJsb2ItdXBsb2FkLmpzLm1hcCIsCiAgICAiY29uc3QgaXNXaW5kb3dzID0gdHlwZW9mIHByb2Nlc3MgPT09ICdvYmplY3QnICYmXG4gIHByb2Nlc3MgJiZcbiAgcHJvY2Vzcy5wbGF0Zm9ybSA9PT0gJ3dpbjMyJ1xubW9kdWxlLmV4cG9ydHMgPSBpc1dpbmRvd3MgPyB7IHNlcDogJ1xcXFwnIH0gOiB7IHNlcDogJy8nIH1cbiIsCiAgICAiJ3VzZSBzdHJpY3QnO1xubW9kdWxlLmV4cG9ydHMgPSBiYWxhbmNlZDtcbmZ1bmN0aW9uIGJhbGFuY2VkKGEsIGIsIHN0cikge1xuICBpZiAoYSBpbnN0YW5jZW9mIFJlZ0V4cCkgYSA9IG1heWJlTWF0Y2goYSwgc3RyKTtcbiAgaWYgKGIgaW5zdGFuY2VvZiBSZWdFeHApIGIgPSBtYXliZU1hdGNoKGIsIHN0cik7XG5cbiAgdmFyIHIgPSByYW5nZShhLCBiLCBzdHIpO1xuXG4gIHJldHVybiByICYmIHtcbiAgICBzdGFydDogclswXSxcbiAgICBlbmQ6IHJbMV0sXG4gICAgcHJlOiBzdHIuc2xpY2UoMCwgclswXSksXG4gICAgYm9keTogc3RyLnNsaWNlKHJbMF0gKyBhLmxlbmd0aCwgclsxXSksXG4gICAgcG9zdDogc3RyLnNsaWNlKHJbMV0gKyBiLmxlbmd0aClcbiAgfTtcbn1cblxuZnVuY3Rpb24gbWF5YmVNYXRjaChyZWcsIHN0cikge1xuICB2YXIgbSA9IHN0ci5tYXRjaChyZWcpO1xuICByZXR1cm4gbSA/IG1bMF0gOiBudWxsO1xufVxuXG5iYWxhbmNlZC5yYW5nZSA9IHJhbmdlO1xuZnVuY3Rpb24gcmFuZ2UoYSwgYiwgc3RyKSB7XG4gIHZhciBiZWdzLCBiZWcsIGxlZnQsIHJpZ2h0LCByZXN1bHQ7XG4gIHZhciBhaSA9IHN0ci5pbmRleE9mKGEpO1xuICB2YXIgYmkgPSBzdHIuaW5kZXhPZihiLCBhaSArIDEpO1xuICB2YXIgaSA9IGFpO1xuXG4gIGlmIChhaSA+PSAwICYmIGJpID4gMCkge1xuICAgIGlmKGE9PT1iKSB7XG4gICAgICByZXR1cm4gW2FpLCBiaV07XG4gICAgfVxuICAgIGJlZ3MgPSBbXTtcbiAgICBsZWZ0ID0gc3RyLmxlbmd0aDtcblxuICAgIHdoaWxlIChpID49IDAgJiYgIXJlc3VsdCkge1xuICAgICAgaWYgKGkgPT0gYWkpIHtcbiAgICAgICAgYmVncy5wdXNoKGkpO1xuICAgICAgICBhaSA9IHN0ci5pbmRleE9mKGEsIGkgKyAxKTtcbiAgICAgIH0gZWxzZSBpZiAoYmVncy5sZW5ndGggPT0gMSkge1xuICAgICAgICByZXN1bHQgPSBbIGJlZ3MucG9wKCksIGJpIF07XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBiZWcgPSBiZWdzLnBvcCgpO1xuICAgICAgICBpZiAoYmVnIDwgbGVmdCkge1xuICAgICAgICAgIGxlZnQgPSBiZWc7XG4gICAgICAgICAgcmlnaHQgPSBiaTtcbiAgICAgICAgfVxuXG4gICAgICAgIGJpID0gc3RyLmluZGV4T2YoYiwgaSArIDEpO1xuICAgICAgfVxuXG4gICAgICBpID0gYWkgPCBiaSAmJiBhaSA+PSAwID8gYWkgOiBiaTtcbiAgICB9XG5cbiAgICBpZiAoYmVncy5sZW5ndGgpIHtcbiAgICAgIHJlc3VsdCA9IFsgbGVmdCwgcmlnaHQgXTtcbiAgICB9XG4gIH1cblxuICByZXR1cm4gcmVzdWx0O1xufVxuIiwKICAgICJ2YXIgYmFsYW5jZWQgPSByZXF1aXJlKCdiYWxhbmNlZC1tYXRjaCcpO1xuXG5tb2R1bGUuZXhwb3J0cyA9IGV4cGFuZFRvcDtcblxudmFyIGVzY1NsYXNoID0gJ1xcMFNMQVNIJytNYXRoLnJhbmRvbSgpKydcXDAnO1xudmFyIGVzY09wZW4gPSAnXFwwT1BFTicrTWF0aC5yYW5kb20oKSsnXFwwJztcbnZhciBlc2NDbG9zZSA9ICdcXDBDTE9TRScrTWF0aC5yYW5kb20oKSsnXFwwJztcbnZhciBlc2NDb21tYSA9ICdcXDBDT01NQScrTWF0aC5yYW5kb20oKSsnXFwwJztcbnZhciBlc2NQZXJpb2QgPSAnXFwwUEVSSU9EJytNYXRoLnJhbmRvbSgpKydcXDAnO1xuXG5mdW5jdGlvbiBudW1lcmljKHN0cikge1xuICByZXR1cm4gcGFyc2VJbnQoc3RyLCAxMCkgPT0gc3RyXG4gICAgPyBwYXJzZUludChzdHIsIDEwKVxuICAgIDogc3RyLmNoYXJDb2RlQXQoMCk7XG59XG5cbmZ1bmN0aW9uIGVzY2FwZUJyYWNlcyhzdHIpIHtcbiAgcmV0dXJuIHN0ci5zcGxpdCgnXFxcXFxcXFwnKS5qb2luKGVzY1NsYXNoKVxuICAgICAgICAgICAgLnNwbGl0KCdcXFxceycpLmpvaW4oZXNjT3BlbilcbiAgICAgICAgICAgIC5zcGxpdCgnXFxcXH0nKS5qb2luKGVzY0Nsb3NlKVxuICAgICAgICAgICAgLnNwbGl0KCdcXFxcLCcpLmpvaW4oZXNjQ29tbWEpXG4gICAgICAgICAgICAuc3BsaXQoJ1xcXFwuJykuam9pbihlc2NQZXJpb2QpO1xufVxuXG5mdW5jdGlvbiB1bmVzY2FwZUJyYWNlcyhzdHIpIHtcbiAgcmV0dXJuIHN0ci5zcGxpdChlc2NTbGFzaCkuam9pbignXFxcXCcpXG4gICAgICAgICAgICAuc3BsaXQoZXNjT3Blbikuam9pbigneycpXG4gICAgICAgICAgICAuc3BsaXQoZXNjQ2xvc2UpLmpvaW4oJ30nKVxuICAgICAgICAgICAgLnNwbGl0KGVzY0NvbW1hKS5qb2luKCcsJylcbiAgICAgICAgICAgIC5zcGxpdChlc2NQZXJpb2QpLmpvaW4oJy4nKTtcbn1cblxuXG4vLyBCYXNpY2FsbHkganVzdCBzdHIuc3BsaXQoXCIsXCIpLCBidXQgaGFuZGxpbmcgY2FzZXNcbi8vIHdoZXJlIHdlIGhhdmUgbmVzdGVkIGJyYWNlZCBzZWN0aW9ucywgd2hpY2ggc2hvdWxkIGJlXG4vLyB0cmVhdGVkIGFzIGluZGl2aWR1YWwgbWVtYmVycywgbGlrZSB7YSx7YixjfSxkfVxuZnVuY3Rpb24gcGFyc2VDb21tYVBhcnRzKHN0cikge1xuICBpZiAoIXN0cilcbiAgICByZXR1cm4gWycnXTtcblxuICB2YXIgcGFydHMgPSBbXTtcbiAgdmFyIG0gPSBiYWxhbmNlZCgneycsICd9Jywgc3RyKTtcblxuICBpZiAoIW0pXG4gICAgcmV0dXJuIHN0ci5zcGxpdCgnLCcpO1xuXG4gIHZhciBwcmUgPSBtLnByZTtcbiAgdmFyIGJvZHkgPSBtLmJvZHk7XG4gIHZhciBwb3N0ID0gbS5wb3N0O1xuICB2YXIgcCA9IHByZS5zcGxpdCgnLCcpO1xuXG4gIHBbcC5sZW5ndGgtMV0gKz0gJ3snICsgYm9keSArICd9JztcbiAgdmFyIHBvc3RQYXJ0cyA9IHBhcnNlQ29tbWFQYXJ0cyhwb3N0KTtcbiAgaWYgKHBvc3QubGVuZ3RoKSB7XG4gICAgcFtwLmxlbmd0aC0xXSArPSBwb3N0UGFydHMuc2hpZnQoKTtcbiAgICBwLnB1c2guYXBwbHkocCwgcG9zdFBhcnRzKTtcbiAgfVxuXG4gIHBhcnRzLnB1c2guYXBwbHkocGFydHMsIHApO1xuXG4gIHJldHVybiBwYXJ0cztcbn1cblxuZnVuY3Rpb24gZXhwYW5kVG9wKHN0cikge1xuICBpZiAoIXN0cilcbiAgICByZXR1cm4gW107XG5cbiAgLy8gSSBkb24ndCBrbm93IHdoeSBCYXNoIDQuMyBkb2VzIHRoaXMsIGJ1dCBpdCBkb2VzLlxuICAvLyBBbnl0aGluZyBzdGFydGluZyB3aXRoIHt9IHdpbGwgaGF2ZSB0aGUgZmlyc3QgdHdvIGJ5dGVzIHByZXNlcnZlZFxuICAvLyBidXQgKm9ubHkqIGF0IHRoZSB0b3AgbGV2ZWwsIHNvIHt9LGF9YiB3aWxsIG5vdCBleHBhbmQgdG8gYW55dGhpbmcsXG4gIC8vIGJ1dCBhe30sYn1jIHdpbGwgYmUgZXhwYW5kZWQgdG8gW2F9YyxhYmNdLlxuICAvLyBPbmUgY291bGQgYXJndWUgdGhhdCB0aGlzIGlzIGEgYnVnIGluIEJhc2gsIGJ1dCBzaW5jZSB0aGUgZ29hbCBvZlxuICAvLyB0aGlzIG1vZHVsZSBpcyB0byBtYXRjaCBCYXNoJ3MgcnVsZXMsIHdlIGVzY2FwZSBhIGxlYWRpbmcge31cbiAgaWYgKHN0ci5zdWJzdHIoMCwgMikgPT09ICd7fScpIHtcbiAgICBzdHIgPSAnXFxcXHtcXFxcfScgKyBzdHIuc3Vic3RyKDIpO1xuICB9XG5cbiAgcmV0dXJuIGV4cGFuZChlc2NhcGVCcmFjZXMoc3RyKSwgdHJ1ZSkubWFwKHVuZXNjYXBlQnJhY2VzKTtcbn1cblxuZnVuY3Rpb24gZW1icmFjZShzdHIpIHtcbiAgcmV0dXJuICd7JyArIHN0ciArICd9Jztcbn1cbmZ1bmN0aW9uIGlzUGFkZGVkKGVsKSB7XG4gIHJldHVybiAvXi0/MFxcZC8udGVzdChlbCk7XG59XG5cbmZ1bmN0aW9uIGx0ZShpLCB5KSB7XG4gIHJldHVybiBpIDw9IHk7XG59XG5mdW5jdGlvbiBndGUoaSwgeSkge1xuICByZXR1cm4gaSA+PSB5O1xufVxuXG5mdW5jdGlvbiBleHBhbmQoc3RyLCBpc1RvcCkge1xuICB2YXIgZXhwYW5zaW9ucyA9IFtdO1xuXG4gIHZhciBtID0gYmFsYW5jZWQoJ3snLCAnfScsIHN0cik7XG4gIGlmICghbSkgcmV0dXJuIFtzdHJdO1xuXG4gIC8vIG5vIG5lZWQgdG8gZXhwYW5kIHByZSwgc2luY2UgaXQgaXMgZ3VhcmFudGVlZCB0byBiZSBmcmVlIG9mIGJyYWNlLXNldHNcbiAgdmFyIHByZSA9IG0ucHJlO1xuICB2YXIgcG9zdCA9IG0ucG9zdC5sZW5ndGhcbiAgICA/IGV4cGFuZChtLnBvc3QsIGZhbHNlKVxuICAgIDogWycnXTtcblxuICBpZiAoL1xcJCQvLnRlc3QobS5wcmUpKSB7ICAgIFxuICAgIGZvciAodmFyIGsgPSAwOyBrIDwgcG9zdC5sZW5ndGg7IGsrKykge1xuICAgICAgdmFyIGV4cGFuc2lvbiA9IHByZSsgJ3snICsgbS5ib2R5ICsgJ30nICsgcG9zdFtrXTtcbiAgICAgIGV4cGFuc2lvbnMucHVzaChleHBhbnNpb24pO1xuICAgIH1cbiAgfSBlbHNlIHtcbiAgICB2YXIgaXNOdW1lcmljU2VxdWVuY2UgPSAvXi0/XFxkK1xcLlxcLi0/XFxkKyg/OlxcLlxcLi0/XFxkKyk/JC8udGVzdChtLmJvZHkpO1xuICAgIHZhciBpc0FscGhhU2VxdWVuY2UgPSAvXlthLXpBLVpdXFwuXFwuW2EtekEtWl0oPzpcXC5cXC4tP1xcZCspPyQvLnRlc3QobS5ib2R5KTtcbiAgICB2YXIgaXNTZXF1ZW5jZSA9IGlzTnVtZXJpY1NlcXVlbmNlIHx8IGlzQWxwaGFTZXF1ZW5jZTtcbiAgICB2YXIgaXNPcHRpb25zID0gbS5ib2R5LmluZGV4T2YoJywnKSA+PSAwO1xuICAgIGlmICghaXNTZXF1ZW5jZSAmJiAhaXNPcHRpb25zKSB7XG4gICAgICAvLyB7YX0sYn1cbiAgICAgIGlmIChtLnBvc3QubWF0Y2goLywuKlxcfS8pKSB7XG4gICAgICAgIHN0ciA9IG0ucHJlICsgJ3snICsgbS5ib2R5ICsgZXNjQ2xvc2UgKyBtLnBvc3Q7XG4gICAgICAgIHJldHVybiBleHBhbmQoc3RyKTtcbiAgICAgIH1cbiAgICAgIHJldHVybiBbc3RyXTtcbiAgICB9XG5cbiAgICB2YXIgbjtcbiAgICBpZiAoaXNTZXF1ZW5jZSkge1xuICAgICAgbiA9IG0uYm9keS5zcGxpdCgvXFwuXFwuLyk7XG4gICAgfSBlbHNlIHtcbiAgICAgIG4gPSBwYXJzZUNvbW1hUGFydHMobS5ib2R5KTtcbiAgICAgIGlmIChuLmxlbmd0aCA9PT0gMSkge1xuICAgICAgICAvLyB4e3thLGJ9fXkgPT0+IHh7YX15IHh7Yn15XG4gICAgICAgIG4gPSBleHBhbmQoblswXSwgZmFsc2UpLm1hcChlbWJyYWNlKTtcbiAgICAgICAgaWYgKG4ubGVuZ3RoID09PSAxKSB7XG4gICAgICAgICAgcmV0dXJuIHBvc3QubWFwKGZ1bmN0aW9uKHApIHtcbiAgICAgICAgICAgIHJldHVybiBtLnByZSArIG5bMF0gKyBwO1xuICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuXG4gICAgLy8gYXQgdGhpcyBwb2ludCwgbiBpcyB0aGUgcGFydHMsIGFuZCB3ZSBrbm93IGl0J3Mgbm90IGEgY29tbWEgc2V0XG4gICAgLy8gd2l0aCBhIHNpbmdsZSBlbnRyeS5cbiAgICB2YXIgTjtcblxuICAgIGlmIChpc1NlcXVlbmNlKSB7XG4gICAgICB2YXIgeCA9IG51bWVyaWMoblswXSk7XG4gICAgICB2YXIgeSA9IG51bWVyaWMoblsxXSk7XG4gICAgICB2YXIgd2lkdGggPSBNYXRoLm1heChuWzBdLmxlbmd0aCwgblsxXS5sZW5ndGgpXG4gICAgICB2YXIgaW5jciA9IG4ubGVuZ3RoID09IDNcbiAgICAgICAgPyBNYXRoLmFicyhudW1lcmljKG5bMl0pKVxuICAgICAgICA6IDE7XG4gICAgICB2YXIgdGVzdCA9IGx0ZTtcbiAgICAgIHZhciByZXZlcnNlID0geSA8IHg7XG4gICAgICBpZiAocmV2ZXJzZSkge1xuICAgICAgICBpbmNyICo9IC0xO1xuICAgICAgICB0ZXN0ID0gZ3RlO1xuICAgICAgfVxuICAgICAgdmFyIHBhZCA9IG4uc29tZShpc1BhZGRlZCk7XG5cbiAgICAgIE4gPSBbXTtcblxuICAgICAgZm9yICh2YXIgaSA9IHg7IHRlc3QoaSwgeSk7IGkgKz0gaW5jcikge1xuICAgICAgICB2YXIgYztcbiAgICAgICAgaWYgKGlzQWxwaGFTZXF1ZW5jZSkge1xuICAgICAgICAgIGMgPSBTdHJpbmcuZnJvbUNoYXJDb2RlKGkpO1xuICAgICAgICAgIGlmIChjID09PSAnXFxcXCcpXG4gICAgICAgICAgICBjID0gJyc7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgYyA9IFN0cmluZyhpKTtcbiAgICAgICAgICBpZiAocGFkKSB7XG4gICAgICAgICAgICB2YXIgbmVlZCA9IHdpZHRoIC0gYy5sZW5ndGg7XG4gICAgICAgICAgICBpZiAobmVlZCA+IDApIHtcbiAgICAgICAgICAgICAgdmFyIHogPSBuZXcgQXJyYXkobmVlZCArIDEpLmpvaW4oJzAnKTtcbiAgICAgICAgICAgICAgaWYgKGkgPCAwKVxuICAgICAgICAgICAgICAgIGMgPSAnLScgKyB6ICsgYy5zbGljZSgxKTtcbiAgICAgICAgICAgICAgZWxzZVxuICAgICAgICAgICAgICAgIGMgPSB6ICsgYztcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgTi5wdXNoKGMpO1xuICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICBOID0gW107XG5cbiAgICAgIGZvciAodmFyIGogPSAwOyBqIDwgbi5sZW5ndGg7IGorKykge1xuICAgICAgICBOLnB1c2guYXBwbHkoTiwgZXhwYW5kKG5bal0sIGZhbHNlKSk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgZm9yICh2YXIgaiA9IDA7IGogPCBOLmxlbmd0aDsgaisrKSB7XG4gICAgICBmb3IgKHZhciBrID0gMDsgayA8IHBvc3QubGVuZ3RoOyBrKyspIHtcbiAgICAgICAgdmFyIGV4cGFuc2lvbiA9IHByZSArIE5bal0gKyBwb3N0W2tdO1xuICAgICAgICBpZiAoIWlzVG9wIHx8IGlzU2VxdWVuY2UgfHwgZXhwYW5zaW9uKVxuICAgICAgICAgIGV4cGFuc2lvbnMucHVzaChleHBhbnNpb24pO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIHJldHVybiBleHBhbnNpb25zO1xufVxuXG4iLAogICAgImNvbnN0IG1pbmltYXRjaCA9IG1vZHVsZS5leHBvcnRzID0gKHAsIHBhdHRlcm4sIG9wdGlvbnMgPSB7fSkgPT4ge1xuICBhc3NlcnRWYWxpZFBhdHRlcm4ocGF0dGVybilcblxuICAvLyBzaG9ydGN1dDogY29tbWVudHMgbWF0Y2ggbm90aGluZy5cbiAgaWYgKCFvcHRpb25zLm5vY29tbWVudCAmJiBwYXR0ZXJuLmNoYXJBdCgwKSA9PT0gJyMnKSB7XG4gICAgcmV0dXJuIGZhbHNlXG4gIH1cblxuICByZXR1cm4gbmV3IE1pbmltYXRjaChwYXR0ZXJuLCBvcHRpb25zKS5tYXRjaChwKVxufVxuXG5tb2R1bGUuZXhwb3J0cyA9IG1pbmltYXRjaFxuXG5jb25zdCBwYXRoID0gcmVxdWlyZSgnLi9saWIvcGF0aC5qcycpXG5taW5pbWF0Y2guc2VwID0gcGF0aC5zZXBcblxuY29uc3QgR0xPQlNUQVIgPSBTeW1ib2woJ2dsb2JzdGFyICoqJylcbm1pbmltYXRjaC5HTE9CU1RBUiA9IEdMT0JTVEFSXG5jb25zdCBleHBhbmQgPSByZXF1aXJlKCdicmFjZS1leHBhbnNpb24nKVxuXG5jb25zdCBwbFR5cGVzID0ge1xuICAnISc6IHsgb3BlbjogJyg/Oig/ISg/OicsIGNsb3NlOiAnKSlbXi9dKj8pJ30sXG4gICc/JzogeyBvcGVuOiAnKD86JywgY2xvc2U6ICcpPycgfSxcbiAgJysnOiB7IG9wZW46ICcoPzonLCBjbG9zZTogJykrJyB9LFxuICAnKic6IHsgb3BlbjogJyg/OicsIGNsb3NlOiAnKSonIH0sXG4gICdAJzogeyBvcGVuOiAnKD86JywgY2xvc2U6ICcpJyB9XG59XG5cbi8vIGFueSBzaW5nbGUgdGhpbmcgb3RoZXIgdGhhbiAvXG4vLyBkb24ndCBuZWVkIHRvIGVzY2FwZSAvIHdoZW4gdXNpbmcgbmV3IFJlZ0V4cCgpXG5jb25zdCBxbWFyayA9ICdbXi9dJ1xuXG4vLyAqID0+IGFueSBudW1iZXIgb2YgY2hhcmFjdGVyc1xuY29uc3Qgc3RhciA9IHFtYXJrICsgJyo/J1xuXG4vLyAqKiB3aGVuIGRvdHMgYXJlIGFsbG93ZWQuICBBbnl0aGluZyBnb2VzLCBleGNlcHQgLi4gYW5kIC5cbi8vIG5vdCAoXiBvciAvIGZvbGxvd2VkIGJ5IG9uZSBvciB0d28gZG90cyBmb2xsb3dlZCBieSAkIG9yIC8pLFxuLy8gZm9sbG93ZWQgYnkgYW55dGhpbmcsIGFueSBudW1iZXIgb2YgdGltZXMuXG5jb25zdCB0d29TdGFyRG90ID0gJyg/Oig/ISg/OlxcXFxcXC98XikoPzpcXFxcLnsxLDJ9KSgkfFxcXFxcXC8pKS4pKj8nXG5cbi8vIG5vdCBhIF4gb3IgLyBmb2xsb3dlZCBieSBhIGRvdCxcbi8vIGZvbGxvd2VkIGJ5IGFueXRoaW5nLCBhbnkgbnVtYmVyIG9mIHRpbWVzLlxuY29uc3QgdHdvU3Rhck5vRG90ID0gJyg/Oig/ISg/OlxcXFxcXC98XilcXFxcLikuKSo/J1xuXG4vLyBcImFiY1wiIC0+IHsgYTp0cnVlLCBiOnRydWUsIGM6dHJ1ZSB9XG5jb25zdCBjaGFyU2V0ID0gcyA9PiBzLnNwbGl0KCcnKS5yZWR1Y2UoKHNldCwgYykgPT4ge1xuICBzZXRbY10gPSB0cnVlXG4gIHJldHVybiBzZXRcbn0sIHt9KVxuXG4vLyBjaGFyYWN0ZXJzIHRoYXQgbmVlZCB0byBiZSBlc2NhcGVkIGluIFJlZ0V4cC5cbmNvbnN0IHJlU3BlY2lhbHMgPSBjaGFyU2V0KCcoKS4qe30rP1tdXiRcXFxcIScpXG5cbi8vIGNoYXJhY3RlcnMgdGhhdCBpbmRpY2F0ZSB3ZSBoYXZlIHRvIGFkZCB0aGUgcGF0dGVybiBzdGFydFxuY29uc3QgYWRkUGF0dGVyblN0YXJ0U2V0ID0gY2hhclNldCgnWy4oJylcblxuLy8gbm9ybWFsaXplcyBzbGFzaGVzLlxuY29uc3Qgc2xhc2hTcGxpdCA9IC9cXC8rL1xuXG5taW5pbWF0Y2guZmlsdGVyID0gKHBhdHRlcm4sIG9wdGlvbnMgPSB7fSkgPT5cbiAgKHAsIGksIGxpc3QpID0+IG1pbmltYXRjaChwLCBwYXR0ZXJuLCBvcHRpb25zKVxuXG5jb25zdCBleHQgPSAoYSwgYiA9IHt9KSA9PiB7XG4gIGNvbnN0IHQgPSB7fVxuICBPYmplY3Qua2V5cyhhKS5mb3JFYWNoKGsgPT4gdFtrXSA9IGFba10pXG4gIE9iamVjdC5rZXlzKGIpLmZvckVhY2goayA9PiB0W2tdID0gYltrXSlcbiAgcmV0dXJuIHRcbn1cblxubWluaW1hdGNoLmRlZmF1bHRzID0gZGVmID0+IHtcbiAgaWYgKCFkZWYgfHwgdHlwZW9mIGRlZiAhPT0gJ29iamVjdCcgfHwgIU9iamVjdC5rZXlzKGRlZikubGVuZ3RoKSB7XG4gICAgcmV0dXJuIG1pbmltYXRjaFxuICB9XG5cbiAgY29uc3Qgb3JpZyA9IG1pbmltYXRjaFxuXG4gIGNvbnN0IG0gPSAocCwgcGF0dGVybiwgb3B0aW9ucykgPT4gb3JpZyhwLCBwYXR0ZXJuLCBleHQoZGVmLCBvcHRpb25zKSlcbiAgbS5NaW5pbWF0Y2ggPSBjbGFzcyBNaW5pbWF0Y2ggZXh0ZW5kcyBvcmlnLk1pbmltYXRjaCB7XG4gICAgY29uc3RydWN0b3IgKHBhdHRlcm4sIG9wdGlvbnMpIHtcbiAgICAgIHN1cGVyKHBhdHRlcm4sIGV4dChkZWYsIG9wdGlvbnMpKVxuICAgIH1cbiAgfVxuICBtLk1pbmltYXRjaC5kZWZhdWx0cyA9IG9wdGlvbnMgPT4gb3JpZy5kZWZhdWx0cyhleHQoZGVmLCBvcHRpb25zKSkuTWluaW1hdGNoXG4gIG0uZmlsdGVyID0gKHBhdHRlcm4sIG9wdGlvbnMpID0+IG9yaWcuZmlsdGVyKHBhdHRlcm4sIGV4dChkZWYsIG9wdGlvbnMpKVxuICBtLmRlZmF1bHRzID0gb3B0aW9ucyA9PiBvcmlnLmRlZmF1bHRzKGV4dChkZWYsIG9wdGlvbnMpKVxuICBtLm1ha2VSZSA9IChwYXR0ZXJuLCBvcHRpb25zKSA9PiBvcmlnLm1ha2VSZShwYXR0ZXJuLCBleHQoZGVmLCBvcHRpb25zKSlcbiAgbS5icmFjZUV4cGFuZCA9IChwYXR0ZXJuLCBvcHRpb25zKSA9PiBvcmlnLmJyYWNlRXhwYW5kKHBhdHRlcm4sIGV4dChkZWYsIG9wdGlvbnMpKVxuICBtLm1hdGNoID0gKGxpc3QsIHBhdHRlcm4sIG9wdGlvbnMpID0+IG9yaWcubWF0Y2gobGlzdCwgcGF0dGVybiwgZXh0KGRlZiwgb3B0aW9ucykpXG5cbiAgcmV0dXJuIG1cbn1cblxuXG5cblxuXG4vLyBCcmFjZSBleHBhbnNpb246XG4vLyBhe2IsY31kIC0+IGFiZCBhY2Rcbi8vIGF7Yix9YyAtPiBhYmMgYWNcbi8vIGF7MC4uM31kIC0+IGEwZCBhMWQgYTJkIGEzZFxuLy8gYXtiLGN7ZCxlfWZ9ZyAtPiBhYmcgYWNkZmcgYWNlZmdcbi8vIGF7YixjfWR7ZSxmfWcgLT4gYWJkZWcgYWNkZWcgYWJkZWcgYWJkZmdcbi8vXG4vLyBJbnZhbGlkIHNldHMgYXJlIG5vdCBleHBhbmRlZC5cbi8vIGF7Mi4ufWIgLT4gYXsyLi59YlxuLy8gYXtifWMgLT4gYXtifWNcbm1pbmltYXRjaC5icmFjZUV4cGFuZCA9IChwYXR0ZXJuLCBvcHRpb25zKSA9PiBicmFjZUV4cGFuZChwYXR0ZXJuLCBvcHRpb25zKVxuXG5jb25zdCBicmFjZUV4cGFuZCA9IChwYXR0ZXJuLCBvcHRpb25zID0ge30pID0+IHtcbiAgYXNzZXJ0VmFsaWRQYXR0ZXJuKHBhdHRlcm4pXG5cbiAgLy8gVGhhbmtzIHRvIFlldGluZyBMaSA8aHR0cHM6Ly9naXRodWIuY29tL3lldGluZ2xpPiBmb3JcbiAgLy8gaW1wcm92aW5nIHRoaXMgcmVnZXhwIHRvIGF2b2lkIGEgUmVET1MgdnVsbmVyYWJpbGl0eS5cbiAgaWYgKG9wdGlvbnMubm9icmFjZSB8fCAhL1xceyg/Oig/IVxceykuKSpcXH0vLnRlc3QocGF0dGVybikpIHtcbiAgICAvLyBzaG9ydGN1dC4gbm8gbmVlZCB0byBleHBhbmQuXG4gICAgcmV0dXJuIFtwYXR0ZXJuXVxuICB9XG5cbiAgcmV0dXJuIGV4cGFuZChwYXR0ZXJuKVxufVxuXG5jb25zdCBNQVhfUEFUVEVSTl9MRU5HVEggPSAxMDI0ICogNjRcbmNvbnN0IGFzc2VydFZhbGlkUGF0dGVybiA9IHBhdHRlcm4gPT4ge1xuICBpZiAodHlwZW9mIHBhdHRlcm4gIT09ICdzdHJpbmcnKSB7XG4gICAgdGhyb3cgbmV3IFR5cGVFcnJvcignaW52YWxpZCBwYXR0ZXJuJylcbiAgfVxuXG4gIGlmIChwYXR0ZXJuLmxlbmd0aCA+IE1BWF9QQVRURVJOX0xFTkdUSCkge1xuICAgIHRocm93IG5ldyBUeXBlRXJyb3IoJ3BhdHRlcm4gaXMgdG9vIGxvbmcnKVxuICB9XG59XG5cbi8vIHBhcnNlIGEgY29tcG9uZW50IG9mIHRoZSBleHBhbmRlZCBzZXQuXG4vLyBBdCB0aGlzIHBvaW50LCBubyBwYXR0ZXJuIG1heSBjb250YWluIFwiL1wiIGluIGl0XG4vLyBzbyB3ZSdyZSBnb2luZyB0byByZXR1cm4gYSAyZCBhcnJheSwgd2hlcmUgZWFjaCBlbnRyeSBpcyB0aGUgZnVsbFxuLy8gcGF0dGVybiwgc3BsaXQgb24gJy8nLCBhbmQgdGhlbiB0dXJuZWQgaW50byBhIHJlZ3VsYXIgZXhwcmVzc2lvbi5cbi8vIEEgcmVnZXhwIGlzIG1hZGUgYXQgdGhlIGVuZCB3aGljaCBqb2lucyBlYWNoIGFycmF5IHdpdGggYW5cbi8vIGVzY2FwZWQgLywgYW5kIGFub3RoZXIgZnVsbCBvbmUgd2hpY2ggam9pbnMgZWFjaCByZWdleHAgd2l0aCB8LlxuLy9cbi8vIEZvbGxvd2luZyB0aGUgbGVhZCBvZiBCYXNoIDQuMSwgbm90ZSB0aGF0IFwiKipcIiBvbmx5IGhhcyBzcGVjaWFsIG1lYW5pbmdcbi8vIHdoZW4gaXQgaXMgdGhlICpvbmx5KiB0aGluZyBpbiBhIHBhdGggcG9ydGlvbi4gIE90aGVyd2lzZSwgYW55IHNlcmllc1xuLy8gb2YgKiBpcyBlcXVpdmFsZW50IHRvIGEgc2luZ2xlICouICBHbG9ic3RhciBiZWhhdmlvciBpcyBlbmFibGVkIGJ5XG4vLyBkZWZhdWx0LCBhbmQgY2FuIGJlIGRpc2FibGVkIGJ5IHNldHRpbmcgb3B0aW9ucy5ub2dsb2JzdGFyLlxuY29uc3QgU1VCUEFSU0UgPSBTeW1ib2woJ3N1YnBhcnNlJylcblxubWluaW1hdGNoLm1ha2VSZSA9IChwYXR0ZXJuLCBvcHRpb25zKSA9PlxuICBuZXcgTWluaW1hdGNoKHBhdHRlcm4sIG9wdGlvbnMgfHwge30pLm1ha2VSZSgpXG5cbm1pbmltYXRjaC5tYXRjaCA9IChsaXN0LCBwYXR0ZXJuLCBvcHRpb25zID0ge30pID0+IHtcbiAgY29uc3QgbW0gPSBuZXcgTWluaW1hdGNoKHBhdHRlcm4sIG9wdGlvbnMpXG4gIGxpc3QgPSBsaXN0LmZpbHRlcihmID0+IG1tLm1hdGNoKGYpKVxuICBpZiAobW0ub3B0aW9ucy5ub251bGwgJiYgIWxpc3QubGVuZ3RoKSB7XG4gICAgbGlzdC5wdXNoKHBhdHRlcm4pXG4gIH1cbiAgcmV0dXJuIGxpc3Rcbn1cblxuLy8gcmVwbGFjZSBzdHVmZiBsaWtlIFxcKiB3aXRoICpcbmNvbnN0IGdsb2JVbmVzY2FwZSA9IHMgPT4gcy5yZXBsYWNlKC9cXFxcKC4pL2csICckMScpXG5jb25zdCBjaGFyVW5lc2NhcGUgPSBzID0+IHMucmVwbGFjZSgvXFxcXChbXi1cXF1dKS9nLCAnJDEnKVxuY29uc3QgcmVnRXhwRXNjYXBlID0gcyA9PiBzLnJlcGxhY2UoL1stW1xcXXt9KCkqKz8uLFxcXFxeJHwjXFxzXS9nLCAnXFxcXCQmJylcbmNvbnN0IGJyYUV4cEVzY2FwZSA9IHMgPT4gcy5yZXBsYWNlKC9bW1xcXVxcXFxdL2csICdcXFxcJCYnKVxuXG5jbGFzcyBNaW5pbWF0Y2gge1xuICBjb25zdHJ1Y3RvciAocGF0dGVybiwgb3B0aW9ucykge1xuICAgIGFzc2VydFZhbGlkUGF0dGVybihwYXR0ZXJuKVxuXG4gICAgaWYgKCFvcHRpb25zKSBvcHRpb25zID0ge31cblxuICAgIHRoaXMub3B0aW9ucyA9IG9wdGlvbnNcbiAgICB0aGlzLnNldCA9IFtdXG4gICAgdGhpcy5wYXR0ZXJuID0gcGF0dGVyblxuICAgIHRoaXMud2luZG93c1BhdGhzTm9Fc2NhcGUgPSAhIW9wdGlvbnMud2luZG93c1BhdGhzTm9Fc2NhcGUgfHxcbiAgICAgIG9wdGlvbnMuYWxsb3dXaW5kb3dzRXNjYXBlID09PSBmYWxzZVxuICAgIGlmICh0aGlzLndpbmRvd3NQYXRoc05vRXNjYXBlKSB7XG4gICAgICB0aGlzLnBhdHRlcm4gPSB0aGlzLnBhdHRlcm4ucmVwbGFjZSgvXFxcXC9nLCAnLycpXG4gICAgfVxuICAgIHRoaXMucmVnZXhwID0gbnVsbFxuICAgIHRoaXMubmVnYXRlID0gZmFsc2VcbiAgICB0aGlzLmNvbW1lbnQgPSBmYWxzZVxuICAgIHRoaXMuZW1wdHkgPSBmYWxzZVxuICAgIHRoaXMucGFydGlhbCA9ICEhb3B0aW9ucy5wYXJ0aWFsXG5cbiAgICAvLyBtYWtlIHRoZSBzZXQgb2YgcmVnZXhwcyBldGMuXG4gICAgdGhpcy5tYWtlKClcbiAgfVxuXG4gIGRlYnVnICgpIHt9XG5cbiAgbWFrZSAoKSB7XG4gICAgY29uc3QgcGF0dGVybiA9IHRoaXMucGF0dGVyblxuICAgIGNvbnN0IG9wdGlvbnMgPSB0aGlzLm9wdGlvbnNcblxuICAgIC8vIGVtcHR5IHBhdHRlcm5zIGFuZCBjb21tZW50cyBtYXRjaCBub3RoaW5nLlxuICAgIGlmICghb3B0aW9ucy5ub2NvbW1lbnQgJiYgcGF0dGVybi5jaGFyQXQoMCkgPT09ICcjJykge1xuICAgICAgdGhpcy5jb21tZW50ID0gdHJ1ZVxuICAgICAgcmV0dXJuXG4gICAgfVxuICAgIGlmICghcGF0dGVybikge1xuICAgICAgdGhpcy5lbXB0eSA9IHRydWVcbiAgICAgIHJldHVyblxuICAgIH1cblxuICAgIC8vIHN0ZXAgMTogZmlndXJlIG91dCBuZWdhdGlvbiwgZXRjLlxuICAgIHRoaXMucGFyc2VOZWdhdGUoKVxuXG4gICAgLy8gc3RlcCAyOiBleHBhbmQgYnJhY2VzXG4gICAgbGV0IHNldCA9IHRoaXMuZ2xvYlNldCA9IHRoaXMuYnJhY2VFeHBhbmQoKVxuXG4gICAgaWYgKG9wdGlvbnMuZGVidWcpIHRoaXMuZGVidWcgPSAoLi4uYXJncykgPT4gY29uc29sZS5lcnJvciguLi5hcmdzKVxuXG4gICAgdGhpcy5kZWJ1Zyh0aGlzLnBhdHRlcm4sIHNldClcblxuICAgIC8vIHN0ZXAgMzogbm93IHdlIGhhdmUgYSBzZXQsIHNvIHR1cm4gZWFjaCBvbmUgaW50byBhIHNlcmllcyBvZiBwYXRoLXBvcnRpb25cbiAgICAvLyBtYXRjaGluZyBwYXR0ZXJucy5cbiAgICAvLyBUaGVzZSB3aWxsIGJlIHJlZ2V4cHMsIGV4Y2VwdCBpbiB0aGUgY2FzZSBvZiBcIioqXCIsIHdoaWNoIGlzXG4gICAgLy8gc2V0IHRvIHRoZSBHTE9CU1RBUiBvYmplY3QgZm9yIGdsb2JzdGFyIGJlaGF2aW9yLFxuICAgIC8vIGFuZCB3aWxsIG5vdCBjb250YWluIGFueSAvIGNoYXJhY3RlcnNcbiAgICBzZXQgPSB0aGlzLmdsb2JQYXJ0cyA9IHNldC5tYXAocyA9PiBzLnNwbGl0KHNsYXNoU3BsaXQpKVxuXG4gICAgdGhpcy5kZWJ1Zyh0aGlzLnBhdHRlcm4sIHNldClcblxuICAgIC8vIGdsb2IgLS0+IHJlZ2V4cHNcbiAgICBzZXQgPSBzZXQubWFwKChzLCBzaSwgc2V0KSA9PiBzLm1hcCh0aGlzLnBhcnNlLCB0aGlzKSlcblxuICAgIHRoaXMuZGVidWcodGhpcy5wYXR0ZXJuLCBzZXQpXG5cbiAgICAvLyBmaWx0ZXIgb3V0IGV2ZXJ5dGhpbmcgdGhhdCBkaWRuJ3QgY29tcGlsZSBwcm9wZXJseS5cbiAgICBzZXQgPSBzZXQuZmlsdGVyKHMgPT4gcy5pbmRleE9mKGZhbHNlKSA9PT0gLTEpXG5cbiAgICB0aGlzLmRlYnVnKHRoaXMucGF0dGVybiwgc2V0KVxuXG4gICAgdGhpcy5zZXQgPSBzZXRcbiAgfVxuXG4gIHBhcnNlTmVnYXRlICgpIHtcbiAgICBpZiAodGhpcy5vcHRpb25zLm5vbmVnYXRlKSByZXR1cm5cblxuICAgIGNvbnN0IHBhdHRlcm4gPSB0aGlzLnBhdHRlcm5cbiAgICBsZXQgbmVnYXRlID0gZmFsc2VcbiAgICBsZXQgbmVnYXRlT2Zmc2V0ID0gMFxuXG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCBwYXR0ZXJuLmxlbmd0aCAmJiBwYXR0ZXJuLmNoYXJBdChpKSA9PT0gJyEnOyBpKyspIHtcbiAgICAgIG5lZ2F0ZSA9ICFuZWdhdGVcbiAgICAgIG5lZ2F0ZU9mZnNldCsrXG4gICAgfVxuXG4gICAgaWYgKG5lZ2F0ZU9mZnNldCkgdGhpcy5wYXR0ZXJuID0gcGF0dGVybi5zbGljZShuZWdhdGVPZmZzZXQpXG4gICAgdGhpcy5uZWdhdGUgPSBuZWdhdGVcbiAgfVxuXG4gIC8vIHNldCBwYXJ0aWFsIHRvIHRydWUgdG8gdGVzdCBpZiwgZm9yIGV4YW1wbGUsXG4gIC8vIFwiL2EvYlwiIG1hdGNoZXMgdGhlIHN0YXJ0IG9mIFwiLyovYi8qL2RcIlxuICAvLyBQYXJ0aWFsIG1lYW5zLCBpZiB5b3UgcnVuIG91dCBvZiBmaWxlIGJlZm9yZSB5b3UgcnVuXG4gIC8vIG91dCBvZiBwYXR0ZXJuLCB0aGVuIHRoYXQncyBmaW5lLCBhcyBsb25nIGFzIGFsbFxuICAvLyB0aGUgcGFydHMgbWF0Y2guXG4gIG1hdGNoT25lIChmaWxlLCBwYXR0ZXJuLCBwYXJ0aWFsKSB7XG4gICAgdmFyIG9wdGlvbnMgPSB0aGlzLm9wdGlvbnNcblxuICAgIHRoaXMuZGVidWcoJ21hdGNoT25lJyxcbiAgICAgIHsgJ3RoaXMnOiB0aGlzLCBmaWxlOiBmaWxlLCBwYXR0ZXJuOiBwYXR0ZXJuIH0pXG5cbiAgICB0aGlzLmRlYnVnKCdtYXRjaE9uZScsIGZpbGUubGVuZ3RoLCBwYXR0ZXJuLmxlbmd0aClcblxuICAgIGZvciAodmFyIGZpID0gMCxcbiAgICAgICAgcGkgPSAwLFxuICAgICAgICBmbCA9IGZpbGUubGVuZ3RoLFxuICAgICAgICBwbCA9IHBhdHRlcm4ubGVuZ3RoXG4gICAgICAgIDsgKGZpIDwgZmwpICYmIChwaSA8IHBsKVxuICAgICAgICA7IGZpKyssIHBpKyspIHtcbiAgICAgIHRoaXMuZGVidWcoJ21hdGNoT25lIGxvb3AnKVxuICAgICAgdmFyIHAgPSBwYXR0ZXJuW3BpXVxuICAgICAgdmFyIGYgPSBmaWxlW2ZpXVxuXG4gICAgICB0aGlzLmRlYnVnKHBhdHRlcm4sIHAsIGYpXG5cbiAgICAgIC8vIHNob3VsZCBiZSBpbXBvc3NpYmxlLlxuICAgICAgLy8gc29tZSBpbnZhbGlkIHJlZ2V4cCBzdHVmZiBpbiB0aGUgc2V0LlxuICAgICAgLyogaXN0YW5idWwgaWdub3JlIGlmICovXG4gICAgICBpZiAocCA9PT0gZmFsc2UpIHJldHVybiBmYWxzZVxuXG4gICAgICBpZiAocCA9PT0gR0xPQlNUQVIpIHtcbiAgICAgICAgdGhpcy5kZWJ1ZygnR0xPQlNUQVInLCBbcGF0dGVybiwgcCwgZl0pXG5cbiAgICAgICAgLy8gXCIqKlwiXG4gICAgICAgIC8vIGEvKiovYi8qKi9jIHdvdWxkIG1hdGNoIHRoZSBmb2xsb3dpbmc6XG4gICAgICAgIC8vIGEvYi94L3kvei9jXG4gICAgICAgIC8vIGEveC95L3ovYi9jXG4gICAgICAgIC8vIGEvYi94L2IveC9jXG4gICAgICAgIC8vIGEvYi9jXG4gICAgICAgIC8vIFRvIGRvIHRoaXMsIHRha2UgdGhlIHJlc3Qgb2YgdGhlIHBhdHRlcm4gYWZ0ZXJcbiAgICAgICAgLy8gdGhlICoqLCBhbmQgc2VlIGlmIGl0IHdvdWxkIG1hdGNoIHRoZSBmaWxlIHJlbWFpbmRlci5cbiAgICAgICAgLy8gSWYgc28sIHJldHVybiBzdWNjZXNzLlxuICAgICAgICAvLyBJZiBub3QsIHRoZSAqKiBcInN3YWxsb3dzXCIgYSBzZWdtZW50LCBhbmQgdHJ5IGFnYWluLlxuICAgICAgICAvLyBUaGlzIGlzIHJlY3Vyc2l2ZWx5IGF3ZnVsLlxuICAgICAgICAvL1xuICAgICAgICAvLyBhLyoqL2IvKiovYyBtYXRjaGluZyBhL2IveC95L3ovY1xuICAgICAgICAvLyAtIGEgbWF0Y2hlcyBhXG4gICAgICAgIC8vIC0gZG91Ymxlc3RhclxuICAgICAgICAvLyAgIC0gbWF0Y2hPbmUoYi94L3kvei9jLCBiLyoqL2MpXG4gICAgICAgIC8vICAgICAtIGIgbWF0Y2hlcyBiXG4gICAgICAgIC8vICAgICAtIGRvdWJsZXN0YXJcbiAgICAgICAgLy8gICAgICAgLSBtYXRjaE9uZSh4L3kvei9jLCBjKSAtPiBub1xuICAgICAgICAvLyAgICAgICAtIG1hdGNoT25lKHkvei9jLCBjKSAtPiBub1xuICAgICAgICAvLyAgICAgICAtIG1hdGNoT25lKHovYywgYykgLT4gbm9cbiAgICAgICAgLy8gICAgICAgLSBtYXRjaE9uZShjLCBjKSB5ZXMsIGhpdFxuICAgICAgICB2YXIgZnIgPSBmaVxuICAgICAgICB2YXIgcHIgPSBwaSArIDFcbiAgICAgICAgaWYgKHByID09PSBwbCkge1xuICAgICAgICAgIHRoaXMuZGVidWcoJyoqIGF0IHRoZSBlbmQnKVxuICAgICAgICAgIC8vIGEgKiogYXQgdGhlIGVuZCB3aWxsIGp1c3Qgc3dhbGxvdyB0aGUgcmVzdC5cbiAgICAgICAgICAvLyBXZSBoYXZlIGZvdW5kIGEgbWF0Y2guXG4gICAgICAgICAgLy8gaG93ZXZlciwgaXQgd2lsbCBub3Qgc3dhbGxvdyAvLngsIHVubGVzc1xuICAgICAgICAgIC8vIG9wdGlvbnMuZG90IGlzIHNldC5cbiAgICAgICAgICAvLyAuIGFuZCAuLiBhcmUgKm5ldmVyKiBtYXRjaGVkIGJ5ICoqLCBmb3IgZXhwbG9zaXZlbHlcbiAgICAgICAgICAvLyBleHBvbmVudGlhbCByZWFzb25zLlxuICAgICAgICAgIGZvciAoOyBmaSA8IGZsOyBmaSsrKSB7XG4gICAgICAgICAgICBpZiAoZmlsZVtmaV0gPT09ICcuJyB8fCBmaWxlW2ZpXSA9PT0gJy4uJyB8fFxuICAgICAgICAgICAgICAoIW9wdGlvbnMuZG90ICYmIGZpbGVbZmldLmNoYXJBdCgwKSA9PT0gJy4nKSkgcmV0dXJuIGZhbHNlXG4gICAgICAgICAgfVxuICAgICAgICAgIHJldHVybiB0cnVlXG4gICAgICAgIH1cblxuICAgICAgICAvLyBvaywgbGV0J3Mgc2VlIGlmIHdlIGNhbiBzd2FsbG93IHdoYXRldmVyIHdlIGNhbi5cbiAgICAgICAgd2hpbGUgKGZyIDwgZmwpIHtcbiAgICAgICAgICB2YXIgc3dhbGxvd2VlID0gZmlsZVtmcl1cblxuICAgICAgICAgIHRoaXMuZGVidWcoJ1xcbmdsb2JzdGFyIHdoaWxlJywgZmlsZSwgZnIsIHBhdHRlcm4sIHByLCBzd2FsbG93ZWUpXG5cbiAgICAgICAgICAvLyBYWFggcmVtb3ZlIHRoaXMgc2xpY2UuICBKdXN0IHBhc3MgdGhlIHN0YXJ0IGluZGV4LlxuICAgICAgICAgIGlmICh0aGlzLm1hdGNoT25lKGZpbGUuc2xpY2UoZnIpLCBwYXR0ZXJuLnNsaWNlKHByKSwgcGFydGlhbCkpIHtcbiAgICAgICAgICAgIHRoaXMuZGVidWcoJ2dsb2JzdGFyIGZvdW5kIG1hdGNoIScsIGZyLCBmbCwgc3dhbGxvd2VlKVxuICAgICAgICAgICAgLy8gZm91bmQgYSBtYXRjaC5cbiAgICAgICAgICAgIHJldHVybiB0cnVlXG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIC8vIGNhbid0IHN3YWxsb3cgXCIuXCIgb3IgXCIuLlwiIGV2ZXIuXG4gICAgICAgICAgICAvLyBjYW4gb25seSBzd2FsbG93IFwiLmZvb1wiIHdoZW4gZXhwbGljaXRseSBhc2tlZC5cbiAgICAgICAgICAgIGlmIChzd2FsbG93ZWUgPT09ICcuJyB8fCBzd2FsbG93ZWUgPT09ICcuLicgfHxcbiAgICAgICAgICAgICAgKCFvcHRpb25zLmRvdCAmJiBzd2FsbG93ZWUuY2hhckF0KDApID09PSAnLicpKSB7XG4gICAgICAgICAgICAgIHRoaXMuZGVidWcoJ2RvdCBkZXRlY3RlZCEnLCBmaWxlLCBmciwgcGF0dGVybiwgcHIpXG4gICAgICAgICAgICAgIGJyZWFrXG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIC8vICoqIHN3YWxsb3dzIGEgc2VnbWVudCwgYW5kIGNvbnRpbnVlLlxuICAgICAgICAgICAgdGhpcy5kZWJ1ZygnZ2xvYnN0YXIgc3dhbGxvdyBhIHNlZ21lbnQsIGFuZCBjb250aW51ZScpXG4gICAgICAgICAgICBmcisrXG4gICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgLy8gbm8gbWF0Y2ggd2FzIGZvdW5kLlxuICAgICAgICAvLyBIb3dldmVyLCBpbiBwYXJ0aWFsIG1vZGUsIHdlIGNhbid0IHNheSB0aGlzIGlzIG5lY2Vzc2FyaWx5IG92ZXIuXG4gICAgICAgIC8vIElmIHRoZXJlJ3MgbW9yZSAqcGF0dGVybiogbGVmdCwgdGhlblxuICAgICAgICAvKiBpc3RhbmJ1bCBpZ25vcmUgaWYgKi9cbiAgICAgICAgaWYgKHBhcnRpYWwpIHtcbiAgICAgICAgICAvLyByYW4gb3V0IG9mIGZpbGVcbiAgICAgICAgICB0aGlzLmRlYnVnKCdcXG4+Pj4gbm8gbWF0Y2gsIHBhcnRpYWw/JywgZmlsZSwgZnIsIHBhdHRlcm4sIHByKVxuICAgICAgICAgIGlmIChmciA9PT0gZmwpIHJldHVybiB0cnVlXG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGZhbHNlXG4gICAgICB9XG5cbiAgICAgIC8vIHNvbWV0aGluZyBvdGhlciB0aGFuICoqXG4gICAgICAvLyBub24tbWFnaWMgcGF0dGVybnMganVzdCBoYXZlIHRvIG1hdGNoIGV4YWN0bHlcbiAgICAgIC8vIHBhdHRlcm5zIHdpdGggbWFnaWMgaGF2ZSBiZWVuIHR1cm5lZCBpbnRvIHJlZ2V4cHMuXG4gICAgICB2YXIgaGl0XG4gICAgICBpZiAodHlwZW9mIHAgPT09ICdzdHJpbmcnKSB7XG4gICAgICAgIGhpdCA9IGYgPT09IHBcbiAgICAgICAgdGhpcy5kZWJ1Zygnc3RyaW5nIG1hdGNoJywgcCwgZiwgaGl0KVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgaGl0ID0gZi5tYXRjaChwKVxuICAgICAgICB0aGlzLmRlYnVnKCdwYXR0ZXJuIG1hdGNoJywgcCwgZiwgaGl0KVxuICAgICAgfVxuXG4gICAgICBpZiAoIWhpdCkgcmV0dXJuIGZhbHNlXG4gICAgfVxuXG4gICAgLy8gTm90ZTogZW5kaW5nIGluIC8gbWVhbnMgdGhhdCB3ZSdsbCBnZXQgYSBmaW5hbCBcIlwiXG4gICAgLy8gYXQgdGhlIGVuZCBvZiB0aGUgcGF0dGVybi4gIFRoaXMgY2FuIG9ubHkgbWF0Y2ggYVxuICAgIC8vIGNvcnJlc3BvbmRpbmcgXCJcIiBhdCB0aGUgZW5kIG9mIHRoZSBmaWxlLlxuICAgIC8vIElmIHRoZSBmaWxlIGVuZHMgaW4gLywgdGhlbiBpdCBjYW4gb25seSBtYXRjaCBhXG4gICAgLy8gYSBwYXR0ZXJuIHRoYXQgZW5kcyBpbiAvLCB1bmxlc3MgdGhlIHBhdHRlcm4ganVzdFxuICAgIC8vIGRvZXNuJ3QgaGF2ZSBhbnkgbW9yZSBmb3IgaXQuIEJ1dCwgYS9iLyBzaG91bGQgKm5vdCpcbiAgICAvLyBtYXRjaCBcImEvYi8qXCIsIGV2ZW4gdGhvdWdoIFwiXCIgbWF0Y2hlcyBhZ2FpbnN0IHRoZVxuICAgIC8vIFteL10qPyBwYXR0ZXJuLCBleGNlcHQgaW4gcGFydGlhbCBtb2RlLCB3aGVyZSBpdCBtaWdodFxuICAgIC8vIHNpbXBseSBub3QgYmUgcmVhY2hlZCB5ZXQuXG4gICAgLy8gSG93ZXZlciwgYS9iLyBzaG91bGQgc3RpbGwgc2F0aXNmeSBhLypcblxuICAgIC8vIG5vdyBlaXRoZXIgd2UgZmVsbCBvZmYgdGhlIGVuZCBvZiB0aGUgcGF0dGVybiwgb3Igd2UncmUgZG9uZS5cbiAgICBpZiAoZmkgPT09IGZsICYmIHBpID09PSBwbCkge1xuICAgICAgLy8gcmFuIG91dCBvZiBwYXR0ZXJuIGFuZCBmaWxlbmFtZSBhdCB0aGUgc2FtZSB0aW1lLlxuICAgICAgLy8gYW4gZXhhY3QgaGl0IVxuICAgICAgcmV0dXJuIHRydWVcbiAgICB9IGVsc2UgaWYgKGZpID09PSBmbCkge1xuICAgICAgLy8gcmFuIG91dCBvZiBmaWxlLCBidXQgc3RpbGwgaGFkIHBhdHRlcm4gbGVmdC5cbiAgICAgIC8vIHRoaXMgaXMgb2sgaWYgd2UncmUgZG9pbmcgdGhlIG1hdGNoIGFzIHBhcnQgb2ZcbiAgICAgIC8vIGEgZ2xvYiBmcyB0cmF2ZXJzYWwuXG4gICAgICByZXR1cm4gcGFydGlhbFxuICAgIH0gZWxzZSAvKiBpc3RhbmJ1bCBpZ25vcmUgZWxzZSAqLyBpZiAocGkgPT09IHBsKSB7XG4gICAgICAvLyByYW4gb3V0IG9mIHBhdHRlcm4sIHN0aWxsIGhhdmUgZmlsZSBsZWZ0LlxuICAgICAgLy8gdGhpcyBpcyBvbmx5IGFjY2VwdGFibGUgaWYgd2UncmUgb24gdGhlIHZlcnkgbGFzdFxuICAgICAgLy8gZW1wdHkgc2VnbWVudCBvZiBhIGZpbGUgd2l0aCBhIHRyYWlsaW5nIHNsYXNoLlxuICAgICAgLy8gYS8qIHNob3VsZCBtYXRjaCBhL2IvXG4gICAgICByZXR1cm4gKGZpID09PSBmbCAtIDEpICYmIChmaWxlW2ZpXSA9PT0gJycpXG4gICAgfVxuXG4gICAgLy8gc2hvdWxkIGJlIHVucmVhY2hhYmxlLlxuICAgIC8qIGlzdGFuYnVsIGlnbm9yZSBuZXh0ICovXG4gICAgdGhyb3cgbmV3IEVycm9yKCd3dGY/JylcbiAgfVxuXG4gIGJyYWNlRXhwYW5kICgpIHtcbiAgICByZXR1cm4gYnJhY2VFeHBhbmQodGhpcy5wYXR0ZXJuLCB0aGlzLm9wdGlvbnMpXG4gIH1cblxuICBwYXJzZSAocGF0dGVybiwgaXNTdWIpIHtcbiAgICBhc3NlcnRWYWxpZFBhdHRlcm4ocGF0dGVybilcblxuICAgIGNvbnN0IG9wdGlvbnMgPSB0aGlzLm9wdGlvbnNcblxuICAgIC8vIHNob3J0Y3V0c1xuICAgIGlmIChwYXR0ZXJuID09PSAnKionKSB7XG4gICAgICBpZiAoIW9wdGlvbnMubm9nbG9ic3RhcilcbiAgICAgICAgcmV0dXJuIEdMT0JTVEFSXG4gICAgICBlbHNlXG4gICAgICAgIHBhdHRlcm4gPSAnKidcbiAgICB9XG4gICAgaWYgKHBhdHRlcm4gPT09ICcnKSByZXR1cm4gJydcblxuICAgIGxldCByZSA9ICcnXG4gICAgbGV0IGhhc01hZ2ljID0gZmFsc2VcbiAgICBsZXQgZXNjYXBpbmcgPSBmYWxzZVxuICAgIC8vID8gPT4gb25lIHNpbmdsZSBjaGFyYWN0ZXJcbiAgICBjb25zdCBwYXR0ZXJuTGlzdFN0YWNrID0gW11cbiAgICBjb25zdCBuZWdhdGl2ZUxpc3RzID0gW11cbiAgICBsZXQgc3RhdGVDaGFyXG4gICAgbGV0IGluQ2xhc3MgPSBmYWxzZVxuICAgIGxldCByZUNsYXNzU3RhcnQgPSAtMVxuICAgIGxldCBjbGFzc1N0YXJ0ID0gLTFcbiAgICBsZXQgY3NcbiAgICBsZXQgcGxcbiAgICBsZXQgc3BcbiAgICAvLyAuIGFuZCAuLiBuZXZlciBtYXRjaCBhbnl0aGluZyB0aGF0IGRvZXNuJ3Qgc3RhcnQgd2l0aCAuLFxuICAgIC8vIGV2ZW4gd2hlbiBvcHRpb25zLmRvdCBpcyBzZXQuICBIb3dldmVyLCBpZiB0aGUgcGF0dGVyblxuICAgIC8vIHN0YXJ0cyB3aXRoIC4sIHRoZW4gdHJhdmVyc2FsIHBhdHRlcm5zIGNhbiBtYXRjaC5cbiAgICBsZXQgZG90VHJhdkFsbG93ZWQgPSBwYXR0ZXJuLmNoYXJBdCgwKSA9PT0gJy4nXG4gICAgbGV0IGRvdEZpbGVBbGxvd2VkID0gb3B0aW9ucy5kb3QgfHwgZG90VHJhdkFsbG93ZWRcbiAgICBjb25zdCBwYXR0ZXJuU3RhcnQgPSAoKSA9PlxuICAgICAgZG90VHJhdkFsbG93ZWRcbiAgICAgICAgPyAnJ1xuICAgICAgICA6IGRvdEZpbGVBbGxvd2VkXG4gICAgICAgID8gJyg/ISg/Ol58XFxcXC8pXFxcXC57MSwyfSg/OiR8XFxcXC8pKSdcbiAgICAgICAgOiAnKD8hXFxcXC4pJ1xuICAgIGNvbnN0IHN1YlBhdHRlcm5TdGFydCA9IChwKSA9PlxuICAgICAgcC5jaGFyQXQoMCkgPT09ICcuJ1xuICAgICAgICA/ICcnXG4gICAgICAgIDogb3B0aW9ucy5kb3RcbiAgICAgICAgPyAnKD8hKD86XnxcXFxcLylcXFxcLnsxLDJ9KD86JHxcXFxcLykpJ1xuICAgICAgICA6ICcoPyFcXFxcLiknXG5cblxuICAgIGNvbnN0IGNsZWFyU3RhdGVDaGFyID0gKCkgPT4ge1xuICAgICAgaWYgKHN0YXRlQ2hhcikge1xuICAgICAgICAvLyB3ZSBoYWQgc29tZSBzdGF0ZS10cmFja2luZyBjaGFyYWN0ZXJcbiAgICAgICAgLy8gdGhhdCB3YXNuJ3QgY29uc3VtZWQgYnkgdGhpcyBwYXNzLlxuICAgICAgICBzd2l0Y2ggKHN0YXRlQ2hhcikge1xuICAgICAgICAgIGNhc2UgJyonOlxuICAgICAgICAgICAgcmUgKz0gc3RhclxuICAgICAgICAgICAgaGFzTWFnaWMgPSB0cnVlXG4gICAgICAgICAgYnJlYWtcbiAgICAgICAgICBjYXNlICc/JzpcbiAgICAgICAgICAgIHJlICs9IHFtYXJrXG4gICAgICAgICAgICBoYXNNYWdpYyA9IHRydWVcbiAgICAgICAgICBicmVha1xuICAgICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgICByZSArPSAnXFxcXCcgKyBzdGF0ZUNoYXJcbiAgICAgICAgICBicmVha1xuICAgICAgICB9XG4gICAgICAgIHRoaXMuZGVidWcoJ2NsZWFyU3RhdGVDaGFyICVqICVqJywgc3RhdGVDaGFyLCByZSlcbiAgICAgICAgc3RhdGVDaGFyID0gZmFsc2VcbiAgICAgIH1cbiAgICB9XG5cbiAgICBmb3IgKGxldCBpID0gMCwgYzsgKGkgPCBwYXR0ZXJuLmxlbmd0aCkgJiYgKGMgPSBwYXR0ZXJuLmNoYXJBdChpKSk7IGkrKykge1xuICAgICAgdGhpcy5kZWJ1ZygnJXNcXHQlcyAlcyAlaicsIHBhdHRlcm4sIGksIHJlLCBjKVxuXG4gICAgICAvLyBza2lwIG92ZXIgYW55IHRoYXQgYXJlIGVzY2FwZWQuXG4gICAgICBpZiAoZXNjYXBpbmcpIHtcbiAgICAgICAgLyogaXN0YW5idWwgaWdub3JlIG5leHQgLSBjb21wbGV0ZWx5IG5vdCBhbGxvd2VkLCBldmVuIGVzY2FwZWQuICovXG4gICAgICAgIGlmIChjID09PSAnLycpIHtcbiAgICAgICAgICByZXR1cm4gZmFsc2VcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChyZVNwZWNpYWxzW2NdKSB7XG4gICAgICAgICAgcmUgKz0gJ1xcXFwnXG4gICAgICAgIH1cbiAgICAgICAgcmUgKz0gY1xuICAgICAgICBlc2NhcGluZyA9IGZhbHNlXG4gICAgICAgIGNvbnRpbnVlXG4gICAgICB9XG5cbiAgICAgIHN3aXRjaCAoYykge1xuICAgICAgICAvKiBpc3RhbmJ1bCBpZ25vcmUgbmV4dCAqL1xuICAgICAgICBjYXNlICcvJzoge1xuICAgICAgICAgIC8vIFNob3VsZCBhbHJlYWR5IGJlIHBhdGgtc3BsaXQgYnkgbm93LlxuICAgICAgICAgIHJldHVybiBmYWxzZVxuICAgICAgICB9XG5cbiAgICAgICAgY2FzZSAnXFxcXCc6XG4gICAgICAgICAgaWYgKGluQ2xhc3MgJiYgcGF0dGVybi5jaGFyQXQoaSArIDEpID09PSAnLScpIHtcbiAgICAgICAgICAgIHJlICs9IGNcbiAgICAgICAgICAgIGNvbnRpbnVlXG4gICAgICAgICAgfVxuXG4gICAgICAgICAgY2xlYXJTdGF0ZUNoYXIoKVxuICAgICAgICAgIGVzY2FwaW5nID0gdHJ1ZVxuICAgICAgICBjb250aW51ZVxuXG4gICAgICAgIC8vIHRoZSB2YXJpb3VzIHN0YXRlQ2hhciB2YWx1ZXNcbiAgICAgICAgLy8gZm9yIHRoZSBcImV4dGdsb2JcIiBzdHVmZi5cbiAgICAgICAgY2FzZSAnPyc6XG4gICAgICAgIGNhc2UgJyonOlxuICAgICAgICBjYXNlICcrJzpcbiAgICAgICAgY2FzZSAnQCc6XG4gICAgICAgIGNhc2UgJyEnOlxuICAgICAgICAgIHRoaXMuZGVidWcoJyVzXFx0JXMgJXMgJWogPC0tIHN0YXRlQ2hhcicsIHBhdHRlcm4sIGksIHJlLCBjKVxuXG4gICAgICAgICAgLy8gYWxsIG9mIHRob3NlIGFyZSBsaXRlcmFscyBpbnNpZGUgYSBjbGFzcywgZXhjZXB0IHRoYXRcbiAgICAgICAgICAvLyB0aGUgZ2xvYiBbIWFdIG1lYW5zIFteYV0gaW4gcmVnZXhwXG4gICAgICAgICAgaWYgKGluQ2xhc3MpIHtcbiAgICAgICAgICAgIHRoaXMuZGVidWcoJyAgaW4gY2xhc3MnKVxuICAgICAgICAgICAgaWYgKGMgPT09ICchJyAmJiBpID09PSBjbGFzc1N0YXJ0ICsgMSkgYyA9ICdeJ1xuICAgICAgICAgICAgcmUgKz0gY1xuICAgICAgICAgICAgY29udGludWVcbiAgICAgICAgICB9XG5cbiAgICAgICAgICAvLyBpZiB3ZSBhbHJlYWR5IGhhdmUgYSBzdGF0ZUNoYXIsIHRoZW4gaXQgbWVhbnNcbiAgICAgICAgICAvLyB0aGF0IHRoZXJlIHdhcyBzb21ldGhpbmcgbGlrZSAqKiBvciArPyBpbiB0aGVyZS5cbiAgICAgICAgICAvLyBIYW5kbGUgdGhlIHN0YXRlQ2hhciwgdGhlbiBwcm9jZWVkIHdpdGggdGhpcyBvbmUuXG4gICAgICAgICAgdGhpcy5kZWJ1ZygnY2FsbCBjbGVhclN0YXRlQ2hhciAlaicsIHN0YXRlQ2hhcilcbiAgICAgICAgICBjbGVhclN0YXRlQ2hhcigpXG4gICAgICAgICAgc3RhdGVDaGFyID0gY1xuICAgICAgICAgIC8vIGlmIGV4dGdsb2IgaXMgZGlzYWJsZWQsIHRoZW4gKyhhc2RmfGZvbykgaXNuJ3QgYSB0aGluZy5cbiAgICAgICAgICAvLyBqdXN0IGNsZWFyIHRoZSBzdGF0ZWNoYXIgKm5vdyosIHJhdGhlciB0aGFuIGV2ZW4gZGl2aW5nIGludG9cbiAgICAgICAgICAvLyB0aGUgcGF0dGVybkxpc3Qgc3R1ZmYuXG4gICAgICAgICAgaWYgKG9wdGlvbnMubm9leHQpIGNsZWFyU3RhdGVDaGFyKClcbiAgICAgICAgY29udGludWVcblxuICAgICAgICBjYXNlICcoJzoge1xuICAgICAgICAgIGlmIChpbkNsYXNzKSB7XG4gICAgICAgICAgICByZSArPSAnKCdcbiAgICAgICAgICAgIGNvbnRpbnVlXG4gICAgICAgICAgfVxuXG4gICAgICAgICAgaWYgKCFzdGF0ZUNoYXIpIHtcbiAgICAgICAgICAgIHJlICs9ICdcXFxcKCdcbiAgICAgICAgICAgIGNvbnRpbnVlXG4gICAgICAgICAgfVxuXG4gICAgICAgICAgY29uc3QgcGxFbnRyeSA9IHtcbiAgICAgICAgICAgIHR5cGU6IHN0YXRlQ2hhcixcbiAgICAgICAgICAgIHN0YXJ0OiBpIC0gMSxcbiAgICAgICAgICAgIHJlU3RhcnQ6IHJlLmxlbmd0aCxcbiAgICAgICAgICAgIG9wZW46IHBsVHlwZXNbc3RhdGVDaGFyXS5vcGVuLFxuICAgICAgICAgICAgY2xvc2U6IHBsVHlwZXNbc3RhdGVDaGFyXS5jbG9zZSxcbiAgICAgICAgICB9XG4gICAgICAgICAgdGhpcy5kZWJ1Zyh0aGlzLnBhdHRlcm4sICdcXHQnLCBwbEVudHJ5KVxuICAgICAgICAgIHBhdHRlcm5MaXN0U3RhY2sucHVzaChwbEVudHJ5KVxuICAgICAgICAgIC8vIG5lZ2F0aW9uIGlzICg/Oig/ISg/OmpzKSg/OjxyZXN0PikpW14vXSopXG4gICAgICAgICAgcmUgKz0gcGxFbnRyeS5vcGVuXG4gICAgICAgICAgLy8gbmV4dCBlbnRyeSBzdGFydHMgd2l0aCBhIGRvdCBtYXliZT9cbiAgICAgICAgICBpZiAocGxFbnRyeS5zdGFydCA9PT0gMCAmJiBwbEVudHJ5LnR5cGUgIT09ICchJykge1xuICAgICAgICAgICAgZG90VHJhdkFsbG93ZWQgPSB0cnVlXG4gICAgICAgICAgICByZSArPSBzdWJQYXR0ZXJuU3RhcnQocGF0dGVybi5zbGljZShpICsgMSkpXG4gICAgICAgICAgfVxuICAgICAgICAgIHRoaXMuZGVidWcoJ3BsVHlwZSAlaiAlaicsIHN0YXRlQ2hhciwgcmUpXG4gICAgICAgICAgc3RhdGVDaGFyID0gZmFsc2VcbiAgICAgICAgICBjb250aW51ZVxuICAgICAgICB9XG5cbiAgICAgICAgY2FzZSAnKSc6IHtcbiAgICAgICAgICBjb25zdCBwbEVudHJ5ID0gcGF0dGVybkxpc3RTdGFja1twYXR0ZXJuTGlzdFN0YWNrLmxlbmd0aCAtIDFdXG4gICAgICAgICAgaWYgKGluQ2xhc3MgfHwgIXBsRW50cnkpIHtcbiAgICAgICAgICAgIHJlICs9ICdcXFxcKSdcbiAgICAgICAgICAgIGNvbnRpbnVlXG4gICAgICAgICAgfVxuICAgICAgICAgIHBhdHRlcm5MaXN0U3RhY2sucG9wKClcblxuICAgICAgICAgIC8vIGNsb3NpbmcgYW4gZXh0Z2xvYlxuICAgICAgICAgIGNsZWFyU3RhdGVDaGFyKClcbiAgICAgICAgICBoYXNNYWdpYyA9IHRydWVcbiAgICAgICAgICBwbCA9IHBsRW50cnlcbiAgICAgICAgICAvLyBuZWdhdGlvbiBpcyAoPzooPyFqcylbXi9dKilcbiAgICAgICAgICAvLyBUaGUgb3RoZXJzIGFyZSAoPzo8cGF0dGVybj4pPHR5cGU+XG4gICAgICAgICAgcmUgKz0gcGwuY2xvc2VcbiAgICAgICAgICBpZiAocGwudHlwZSA9PT0gJyEnKSB7XG4gICAgICAgICAgICBuZWdhdGl2ZUxpc3RzLnB1c2goT2JqZWN0LmFzc2lnbihwbCwgeyByZUVuZDogcmUubGVuZ3RoIH0pKVxuICAgICAgICAgIH1cbiAgICAgICAgICBjb250aW51ZVxuICAgICAgICB9XG5cbiAgICAgICAgY2FzZSAnfCc6IHtcbiAgICAgICAgICBjb25zdCBwbEVudHJ5ID0gcGF0dGVybkxpc3RTdGFja1twYXR0ZXJuTGlzdFN0YWNrLmxlbmd0aCAtIDFdXG4gICAgICAgICAgaWYgKGluQ2xhc3MgfHwgIXBsRW50cnkpIHtcbiAgICAgICAgICAgIHJlICs9ICdcXFxcfCdcbiAgICAgICAgICAgIGNvbnRpbnVlXG4gICAgICAgICAgfVxuXG4gICAgICAgICAgY2xlYXJTdGF0ZUNoYXIoKVxuICAgICAgICAgIHJlICs9ICd8J1xuICAgICAgICAgIC8vIG5leHQgc3VicGF0dGVybiBjYW4gc3RhcnQgd2l0aCBhIGRvdD9cbiAgICAgICAgICBpZiAocGxFbnRyeS5zdGFydCA9PT0gMCAmJiBwbEVudHJ5LnR5cGUgIT09ICchJykge1xuICAgICAgICAgICAgZG90VHJhdkFsbG93ZWQgPSB0cnVlXG4gICAgICAgICAgICByZSArPSBzdWJQYXR0ZXJuU3RhcnQocGF0dGVybi5zbGljZShpICsgMSkpXG4gICAgICAgICAgfVxuICAgICAgICAgIGNvbnRpbnVlXG4gICAgICAgIH1cblxuICAgICAgICAvLyB0aGVzZSBhcmUgbW9zdGx5IHRoZSBzYW1lIGluIHJlZ2V4cCBhbmQgZ2xvYlxuICAgICAgICBjYXNlICdbJzpcbiAgICAgICAgICAvLyBzd2FsbG93IGFueSBzdGF0ZS10cmFja2luZyBjaGFyIGJlZm9yZSB0aGUgW1xuICAgICAgICAgIGNsZWFyU3RhdGVDaGFyKClcblxuICAgICAgICAgIGlmIChpbkNsYXNzKSB7XG4gICAgICAgICAgICByZSArPSAnXFxcXCcgKyBjXG4gICAgICAgICAgICBjb250aW51ZVxuICAgICAgICAgIH1cblxuICAgICAgICAgIGluQ2xhc3MgPSB0cnVlXG4gICAgICAgICAgY2xhc3NTdGFydCA9IGlcbiAgICAgICAgICByZUNsYXNzU3RhcnQgPSByZS5sZW5ndGhcbiAgICAgICAgICByZSArPSBjXG4gICAgICAgIGNvbnRpbnVlXG5cbiAgICAgICAgY2FzZSAnXSc6XG4gICAgICAgICAgLy8gIGEgcmlnaHQgYnJhY2tldCBzaGFsbCBsb3NlIGl0cyBzcGVjaWFsXG4gICAgICAgICAgLy8gIG1lYW5pbmcgYW5kIHJlcHJlc2VudCBpdHNlbGYgaW5cbiAgICAgICAgICAvLyAgYSBicmFja2V0IGV4cHJlc3Npb24gaWYgaXQgb2NjdXJzXG4gICAgICAgICAgLy8gIGZpcnN0IGluIHRoZSBsaXN0LiAgLS0gUE9TSVguMiAyLjguMy4yXG4gICAgICAgICAgaWYgKGkgPT09IGNsYXNzU3RhcnQgKyAxIHx8ICFpbkNsYXNzKSB7XG4gICAgICAgICAgICByZSArPSAnXFxcXCcgKyBjXG4gICAgICAgICAgICBjb250aW51ZVxuICAgICAgICAgIH1cblxuICAgICAgICAgIC8vIHNwbGl0IHdoZXJlIHRoZSBsYXN0IFsgd2FzLCBtYWtlIHN1cmUgd2UgZG9uJ3QgaGF2ZVxuICAgICAgICAgIC8vIGFuIGludmFsaWQgcmUuIGlmIHNvLCByZS13YWxrIHRoZSBjb250ZW50cyBvZiB0aGVcbiAgICAgICAgICAvLyB3b3VsZC1iZSBjbGFzcyB0byByZS10cmFuc2xhdGUgYW55IGNoYXJhY3RlcnMgdGhhdFxuICAgICAgICAgIC8vIHdlcmUgcGFzc2VkIHRocm91Z2ggYXMtaXNcbiAgICAgICAgICAvLyBUT0RPOiBJdCB3b3VsZCBwcm9iYWJseSBiZSBmYXN0ZXIgdG8gZGV0ZXJtaW5lIHRoaXNcbiAgICAgICAgICAvLyB3aXRob3V0IGEgdHJ5L2NhdGNoIGFuZCBhIG5ldyBSZWdFeHAsIGJ1dCBpdCdzIHRyaWNreVxuICAgICAgICAgIC8vIHRvIGRvIHNhZmVseS4gIEZvciBub3csIHRoaXMgaXMgc2FmZSBhbmQgd29ya3MuXG4gICAgICAgICAgY3MgPSBwYXR0ZXJuLnN1YnN0cmluZyhjbGFzc1N0YXJ0ICsgMSwgaSlcbiAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgUmVnRXhwKCdbJyArIGJyYUV4cEVzY2FwZShjaGFyVW5lc2NhcGUoY3MpKSArICddJylcbiAgICAgICAgICAgIC8vIGxvb2tzIGdvb2QsIGZpbmlzaCB1cCB0aGUgY2xhc3MuXG4gICAgICAgICAgICByZSArPSBjXG4gICAgICAgICAgfSBjYXRjaCAoZXIpIHtcbiAgICAgICAgICAgIC8vIG91dCBvZiBvcmRlciByYW5nZXMgaW4gSlMgYXJlIGVycm9ycywgYnV0IGluIGdsb2Igc3ludGF4LFxuICAgICAgICAgICAgLy8gdGhleSdyZSBqdXN0IGEgcmFuZ2UgdGhhdCBtYXRjaGVzIG5vdGhpbmcuXG4gICAgICAgICAgICByZSA9IHJlLnN1YnN0cmluZygwLCByZUNsYXNzU3RhcnQpICsgJyg/OiQuKScgLy8gbWF0Y2ggbm90aGluZyBldmVyXG4gICAgICAgICAgfVxuICAgICAgICAgIGhhc01hZ2ljID0gdHJ1ZVxuICAgICAgICAgIGluQ2xhc3MgPSBmYWxzZVxuICAgICAgICBjb250aW51ZVxuXG4gICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgLy8gc3dhbGxvdyBhbnkgc3RhdGUgY2hhciB0aGF0IHdhc24ndCBjb25zdW1lZFxuICAgICAgICAgIGNsZWFyU3RhdGVDaGFyKClcblxuICAgICAgICAgIGlmIChyZVNwZWNpYWxzW2NdICYmICEoYyA9PT0gJ14nICYmIGluQ2xhc3MpKSB7XG4gICAgICAgICAgICByZSArPSAnXFxcXCdcbiAgICAgICAgICB9XG5cbiAgICAgICAgICByZSArPSBjXG4gICAgICAgICAgYnJlYWtcblxuICAgICAgfSAvLyBzd2l0Y2hcbiAgICB9IC8vIGZvclxuXG4gICAgLy8gaGFuZGxlIHRoZSBjYXNlIHdoZXJlIHdlIGxlZnQgYSBjbGFzcyBvcGVuLlxuICAgIC8vIFwiW2FiY1wiIGlzIHZhbGlkLCBlcXVpdmFsZW50IHRvIFwiXFxbYWJjXCJcbiAgICBpZiAoaW5DbGFzcykge1xuICAgICAgLy8gc3BsaXQgd2hlcmUgdGhlIGxhc3QgWyB3YXMsIGFuZCBlc2NhcGUgaXRcbiAgICAgIC8vIHRoaXMgaXMgYSBodWdlIHBpdGEuICBXZSBub3cgaGF2ZSB0byByZS13YWxrXG4gICAgICAvLyB0aGUgY29udGVudHMgb2YgdGhlIHdvdWxkLWJlIGNsYXNzIHRvIHJlLXRyYW5zbGF0ZVxuICAgICAgLy8gYW55IGNoYXJhY3RlcnMgdGhhdCB3ZXJlIHBhc3NlZCB0aHJvdWdoIGFzLWlzXG4gICAgICBjcyA9IHBhdHRlcm4uc2xpY2UoY2xhc3NTdGFydCArIDEpXG4gICAgICBzcCA9IHRoaXMucGFyc2UoY3MsIFNVQlBBUlNFKVxuICAgICAgcmUgPSByZS5zdWJzdHJpbmcoMCwgcmVDbGFzc1N0YXJ0KSArICdcXFxcWycgKyBzcFswXVxuICAgICAgaGFzTWFnaWMgPSBoYXNNYWdpYyB8fCBzcFsxXVxuICAgIH1cblxuICAgIC8vIGhhbmRsZSB0aGUgY2FzZSB3aGVyZSB3ZSBoYWQgYSArKCB0aGluZyBhdCB0aGUgKmVuZCpcbiAgICAvLyBvZiB0aGUgcGF0dGVybi5cbiAgICAvLyBlYWNoIHBhdHRlcm4gbGlzdCBzdGFjayBhZGRzIDMgY2hhcnMsIGFuZCB3ZSBuZWVkIHRvIGdvIHRocm91Z2hcbiAgICAvLyBhbmQgZXNjYXBlIGFueSB8IGNoYXJzIHRoYXQgd2VyZSBwYXNzZWQgdGhyb3VnaCBhcy1pcyBmb3IgdGhlIHJlZ2V4cC5cbiAgICAvLyBHbyB0aHJvdWdoIGFuZCBlc2NhcGUgdGhlbSwgdGFraW5nIGNhcmUgbm90IHRvIGRvdWJsZS1lc2NhcGUgYW55XG4gICAgLy8gfCBjaGFycyB0aGF0IHdlcmUgYWxyZWFkeSBlc2NhcGVkLlxuICAgIGZvciAocGwgPSBwYXR0ZXJuTGlzdFN0YWNrLnBvcCgpOyBwbDsgcGwgPSBwYXR0ZXJuTGlzdFN0YWNrLnBvcCgpKSB7XG4gICAgICBsZXQgdGFpbFxuICAgICAgdGFpbCA9IHJlLnNsaWNlKHBsLnJlU3RhcnQgKyBwbC5vcGVuLmxlbmd0aClcbiAgICAgIHRoaXMuZGVidWcoJ3NldHRpbmcgdGFpbCcsIHJlLCBwbClcbiAgICAgIC8vIG1heWJlIHNvbWUgZXZlbiBudW1iZXIgb2YgXFwsIHRoZW4gbWF5YmUgMSBcXCwgZm9sbG93ZWQgYnkgYSB8XG4gICAgICB0YWlsID0gdGFpbC5yZXBsYWNlKC8oKD86XFxcXHsyfSl7MCw2NH0pKFxcXFw/KVxcfC9nLCAoXywgJDEsICQyKSA9PiB7XG4gICAgICAgIC8qIGlzdGFuYnVsIGlnbm9yZSBlbHNlIC0gc2hvdWxkIGFscmVhZHkgYmUgZG9uZSAqL1xuICAgICAgICBpZiAoISQyKSB7XG4gICAgICAgICAgLy8gdGhlIHwgaXNuJ3QgYWxyZWFkeSBlc2NhcGVkLCBzbyBlc2NhcGUgaXQuXG4gICAgICAgICAgJDIgPSAnXFxcXCdcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIG5lZWQgdG8gZXNjYXBlIGFsbCB0aG9zZSBzbGFzaGVzICphZ2FpbiosIHdpdGhvdXQgZXNjYXBpbmcgdGhlXG4gICAgICAgIC8vIG9uZSB0aGF0IHdlIG5lZWQgZm9yIGVzY2FwaW5nIHRoZSB8IGNoYXJhY3Rlci4gIEFzIGl0IHdvcmtzIG91dCxcbiAgICAgICAgLy8gZXNjYXBpbmcgYW4gZXZlbiBudW1iZXIgb2Ygc2xhc2hlcyBjYW4gYmUgZG9uZSBieSBzaW1wbHkgcmVwZWF0aW5nXG4gICAgICAgIC8vIGl0IGV4YWN0bHkgYWZ0ZXIgaXRzZWxmLiAgVGhhdCdzIHdoeSB0aGlzIHRyaWNrIHdvcmtzLlxuICAgICAgICAvL1xuICAgICAgICAvLyBJIGFtIHNvcnJ5IHRoYXQgeW91IGhhdmUgdG8gc2VlIHRoaXMuXG4gICAgICAgIHJldHVybiAkMSArICQxICsgJDIgKyAnfCdcbiAgICAgIH0pXG5cbiAgICAgIHRoaXMuZGVidWcoJ3RhaWw9JWpcXG4gICAlcycsIHRhaWwsIHRhaWwsIHBsLCByZSlcbiAgICAgIGNvbnN0IHQgPSBwbC50eXBlID09PSAnKicgPyBzdGFyXG4gICAgICAgIDogcGwudHlwZSA9PT0gJz8nID8gcW1hcmtcbiAgICAgICAgOiAnXFxcXCcgKyBwbC50eXBlXG5cbiAgICAgIGhhc01hZ2ljID0gdHJ1ZVxuICAgICAgcmUgPSByZS5zbGljZSgwLCBwbC5yZVN0YXJ0KSArIHQgKyAnXFxcXCgnICsgdGFpbFxuICAgIH1cblxuICAgIC8vIGhhbmRsZSB0cmFpbGluZyB0aGluZ3MgdGhhdCBvbmx5IG1hdHRlciBhdCB0aGUgdmVyeSBlbmQuXG4gICAgY2xlYXJTdGF0ZUNoYXIoKVxuICAgIGlmIChlc2NhcGluZykge1xuICAgICAgLy8gdHJhaWxpbmcgXFxcXFxuICAgICAgcmUgKz0gJ1xcXFxcXFxcJ1xuICAgIH1cblxuICAgIC8vIG9ubHkgbmVlZCB0byBhcHBseSB0aGUgbm9kb3Qgc3RhcnQgaWYgdGhlIHJlIHN0YXJ0cyB3aXRoXG4gICAgLy8gc29tZXRoaW5nIHRoYXQgY291bGQgY29uY2VpdmFibHkgY2FwdHVyZSBhIGRvdFxuICAgIGNvbnN0IGFkZFBhdHRlcm5TdGFydCA9IGFkZFBhdHRlcm5TdGFydFNldFtyZS5jaGFyQXQoMCldXG5cbiAgICAvLyBIYWNrIHRvIHdvcmsgYXJvdW5kIGxhY2sgb2YgbmVnYXRpdmUgbG9va2JlaGluZCBpbiBKU1xuICAgIC8vIEEgcGF0dGVybiBsaWtlOiAqLiEoeCkuISh5fHopIG5lZWRzIHRvIGVuc3VyZSB0aGF0IGEgbmFtZVxuICAgIC8vIGxpa2UgJ2EueHl6Lnl6JyBkb2Vzbid0IG1hdGNoLiAgU28sIHRoZSBmaXJzdCBuZWdhdGl2ZVxuICAgIC8vIGxvb2thaGVhZCwgaGFzIHRvIGxvb2sgQUxMIHRoZSB3YXkgYWhlYWQsIHRvIHRoZSBlbmQgb2ZcbiAgICAvLyB0aGUgcGF0dGVybi5cbiAgICBmb3IgKGxldCBuID0gbmVnYXRpdmVMaXN0cy5sZW5ndGggLSAxOyBuID4gLTE7IG4tLSkge1xuICAgICAgY29uc3QgbmwgPSBuZWdhdGl2ZUxpc3RzW25dXG5cbiAgICAgIGNvbnN0IG5sQmVmb3JlID0gcmUuc2xpY2UoMCwgbmwucmVTdGFydClcbiAgICAgIGNvbnN0IG5sRmlyc3QgPSByZS5zbGljZShubC5yZVN0YXJ0LCBubC5yZUVuZCAtIDgpXG4gICAgICBsZXQgbmxBZnRlciA9IHJlLnNsaWNlKG5sLnJlRW5kKVxuICAgICAgY29uc3QgbmxMYXN0ID0gcmUuc2xpY2UobmwucmVFbmQgLSA4LCBubC5yZUVuZCkgKyBubEFmdGVyXG5cbiAgICAgIC8vIEhhbmRsZSBuZXN0ZWQgc3R1ZmYgbGlrZSAqKCouanN8ISgqLmpzb24pKSwgd2hlcmUgb3BlbiBwYXJlbnNcbiAgICAgIC8vIG1lYW4gdGhhdCB3ZSBzaG91bGQgKm5vdCogaW5jbHVkZSB0aGUgKSBpbiB0aGUgYml0IHRoYXQgaXMgY29uc2lkZXJlZFxuICAgICAgLy8gXCJhZnRlclwiIHRoZSBuZWdhdGVkIHNlY3Rpb24uXG4gICAgICBjb25zdCBjbG9zZVBhcmVuc0JlZm9yZSA9IG5sQmVmb3JlLnNwbGl0KCcpJykubGVuZ3RoXG4gICAgICBjb25zdCBvcGVuUGFyZW5zQmVmb3JlID0gbmxCZWZvcmUuc3BsaXQoJygnKS5sZW5ndGggLSBjbG9zZVBhcmVuc0JlZm9yZVxuICAgICAgbGV0IGNsZWFuQWZ0ZXIgPSBubEFmdGVyXG4gICAgICBmb3IgKGxldCBpID0gMDsgaSA8IG9wZW5QYXJlbnNCZWZvcmU7IGkrKykge1xuICAgICAgICBjbGVhbkFmdGVyID0gY2xlYW5BZnRlci5yZXBsYWNlKC9cXClbKyo/XT8vLCAnJylcbiAgICAgIH1cbiAgICAgIG5sQWZ0ZXIgPSBjbGVhbkFmdGVyXG5cbiAgICAgIGNvbnN0IGRvbGxhciA9IG5sQWZ0ZXIgPT09ICcnICYmIGlzU3ViICE9PSBTVUJQQVJTRSA/ICcoPzokfFxcXFwvKScgOiAnJ1xuXG4gICAgICByZSA9IG5sQmVmb3JlICsgbmxGaXJzdCArIG5sQWZ0ZXIgKyBkb2xsYXIgKyBubExhc3RcbiAgICB9XG5cbiAgICAvLyBpZiB0aGUgcmUgaXMgbm90IFwiXCIgYXQgdGhpcyBwb2ludCwgdGhlbiB3ZSBuZWVkIHRvIG1ha2Ugc3VyZVxuICAgIC8vIGl0IGRvZXNuJ3QgbWF0Y2ggYWdhaW5zdCBhbiBlbXB0eSBwYXRoIHBhcnQuXG4gICAgLy8gT3RoZXJ3aXNlIGEvKiB3aWxsIG1hdGNoIGEvLCB3aGljaCBpdCBzaG91bGQgbm90LlxuICAgIGlmIChyZSAhPT0gJycgJiYgaGFzTWFnaWMpIHtcbiAgICAgIHJlID0gJyg/PS4pJyArIHJlXG4gICAgfVxuXG4gICAgaWYgKGFkZFBhdHRlcm5TdGFydCkge1xuICAgICAgcmUgPSBwYXR0ZXJuU3RhcnQoKSArIHJlXG4gICAgfVxuXG4gICAgLy8gcGFyc2luZyBqdXN0IGEgcGllY2Ugb2YgYSBsYXJnZXIgcGF0dGVybi5cbiAgICBpZiAoaXNTdWIgPT09IFNVQlBBUlNFKSB7XG4gICAgICByZXR1cm4gW3JlLCBoYXNNYWdpY11cbiAgICB9XG5cbiAgICAvLyBpZiBpdCdzIG5vY2FzZSwgYW5kIHRoZSBsY2FzZS91cHBlcmNhc2UgZG9uJ3QgbWF0Y2gsIGl0J3MgbWFnaWNcbiAgICBpZiAob3B0aW9ucy5ub2Nhc2UgJiYgIWhhc01hZ2ljKSB7XG4gICAgICBoYXNNYWdpYyA9IHBhdHRlcm4udG9VcHBlckNhc2UoKSAhPT0gcGF0dGVybi50b0xvd2VyQ2FzZSgpXG4gICAgfVxuXG4gICAgLy8gc2tpcCB0aGUgcmVnZXhwIGZvciBub24tbWFnaWNhbCBwYXR0ZXJuc1xuICAgIC8vIHVuZXNjYXBlIGFueXRoaW5nIGluIGl0LCB0aG91Z2gsIHNvIHRoYXQgaXQnbGwgYmVcbiAgICAvLyBhbiBleGFjdCBtYXRjaCBhZ2FpbnN0IGEgZmlsZSBldGMuXG4gICAgaWYgKCFoYXNNYWdpYykge1xuICAgICAgcmV0dXJuIGdsb2JVbmVzY2FwZShwYXR0ZXJuKVxuICAgIH1cblxuICAgIGNvbnN0IGZsYWdzID0gb3B0aW9ucy5ub2Nhc2UgPyAnaScgOiAnJ1xuICAgIHRyeSB7XG4gICAgICByZXR1cm4gT2JqZWN0LmFzc2lnbihuZXcgUmVnRXhwKCdeJyArIHJlICsgJyQnLCBmbGFncyksIHtcbiAgICAgICAgX2dsb2I6IHBhdHRlcm4sXG4gICAgICAgIF9zcmM6IHJlLFxuICAgICAgfSlcbiAgICB9IGNhdGNoIChlcikgLyogaXN0YW5idWwgaWdub3JlIG5leHQgLSBzaG91bGQgYmUgaW1wb3NzaWJsZSAqLyB7XG4gICAgICAvLyBJZiBpdCB3YXMgYW4gaW52YWxpZCByZWd1bGFyIGV4cHJlc3Npb24sIHRoZW4gaXQgY2FuJ3QgbWF0Y2hcbiAgICAgIC8vIGFueXRoaW5nLiAgVGhpcyB0cmljayBsb29rcyBmb3IgYSBjaGFyYWN0ZXIgYWZ0ZXIgdGhlIGVuZCBvZlxuICAgICAgLy8gdGhlIHN0cmluZywgd2hpY2ggaXMgb2YgY291cnNlIGltcG9zc2libGUsIGV4Y2VwdCBpbiBtdWx0aS1saW5lXG4gICAgICAvLyBtb2RlLCBidXQgaXQncyBub3QgYSAvbSByZWdleC5cbiAgICAgIHJldHVybiBuZXcgUmVnRXhwKCckLicpXG4gICAgfVxuICB9XG5cbiAgbWFrZVJlICgpIHtcbiAgICBpZiAodGhpcy5yZWdleHAgfHwgdGhpcy5yZWdleHAgPT09IGZhbHNlKSByZXR1cm4gdGhpcy5yZWdleHBcblxuICAgIC8vIGF0IHRoaXMgcG9pbnQsIHRoaXMuc2V0IGlzIGEgMmQgYXJyYXkgb2YgcGFydGlhbFxuICAgIC8vIHBhdHRlcm4gc3RyaW5ncywgb3IgXCIqKlwiLlxuICAgIC8vXG4gICAgLy8gSXQncyBiZXR0ZXIgdG8gdXNlIC5tYXRjaCgpLiAgVGhpcyBmdW5jdGlvbiBzaG91bGRuJ3RcbiAgICAvLyBiZSB1c2VkLCByZWFsbHksIGJ1dCBpdCdzIHByZXR0eSBjb252ZW5pZW50IHNvbWV0aW1lcyxcbiAgICAvLyB3aGVuIHlvdSBqdXN0IHdhbnQgdG8gd29yayB3aXRoIGEgcmVnZXguXG4gICAgY29uc3Qgc2V0ID0gdGhpcy5zZXRcblxuICAgIGlmICghc2V0Lmxlbmd0aCkge1xuICAgICAgdGhpcy5yZWdleHAgPSBmYWxzZVxuICAgICAgcmV0dXJuIHRoaXMucmVnZXhwXG4gICAgfVxuICAgIGNvbnN0IG9wdGlvbnMgPSB0aGlzLm9wdGlvbnNcblxuICAgIGNvbnN0IHR3b1N0YXIgPSBvcHRpb25zLm5vZ2xvYnN0YXIgPyBzdGFyXG4gICAgICA6IG9wdGlvbnMuZG90ID8gdHdvU3RhckRvdFxuICAgICAgOiB0d29TdGFyTm9Eb3RcbiAgICBjb25zdCBmbGFncyA9IG9wdGlvbnMubm9jYXNlID8gJ2knIDogJydcblxuICAgIC8vIGNvYWxlc2NlIGdsb2JzdGFycyBhbmQgcmVnZXhwaWZ5IG5vbi1nbG9ic3RhciBwYXR0ZXJuc1xuICAgIC8vIGlmIGl0J3MgdGhlIG9ubHkgaXRlbSwgdGhlbiB3ZSBqdXN0IGRvIG9uZSB0d29TdGFyXG4gICAgLy8gaWYgaXQncyB0aGUgZmlyc3QsIGFuZCB0aGVyZSBhcmUgbW9yZSwgcHJlcGVuZCAoXFwvfHR3b1N0YXJcXC8pPyB0byBuZXh0XG4gICAgLy8gaWYgaXQncyB0aGUgbGFzdCwgYXBwZW5kIChcXC90d29TdGFyfCkgdG8gcHJldmlvdXNcbiAgICAvLyBpZiBpdCdzIGluIHRoZSBtaWRkbGUsIGFwcGVuZCAoXFwvfFxcL3R3b1N0YXJcXC8pIHRvIHByZXZpb3VzXG4gICAgLy8gdGhlbiBmaWx0ZXIgb3V0IEdMT0JTVEFSIHN5bWJvbHNcbiAgICBsZXQgcmUgPSBzZXQubWFwKHBhdHRlcm4gPT4ge1xuICAgICAgcGF0dGVybiA9IHBhdHRlcm4ubWFwKHAgPT5cbiAgICAgICAgdHlwZW9mIHAgPT09ICdzdHJpbmcnID8gcmVnRXhwRXNjYXBlKHApXG4gICAgICAgIDogcCA9PT0gR0xPQlNUQVIgPyBHTE9CU1RBUlxuICAgICAgICA6IHAuX3NyY1xuICAgICAgKS5yZWR1Y2UoKHNldCwgcCkgPT4ge1xuICAgICAgICBpZiAoIShzZXRbc2V0Lmxlbmd0aCAtIDFdID09PSBHTE9CU1RBUiAmJiBwID09PSBHTE9CU1RBUikpIHtcbiAgICAgICAgICBzZXQucHVzaChwKVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiBzZXRcbiAgICAgIH0sIFtdKVxuICAgICAgcGF0dGVybi5mb3JFYWNoKChwLCBpKSA9PiB7XG4gICAgICAgIGlmIChwICE9PSBHTE9CU1RBUiB8fCBwYXR0ZXJuW2ktMV0gPT09IEdMT0JTVEFSKSB7XG4gICAgICAgICAgcmV0dXJuXG4gICAgICAgIH1cbiAgICAgICAgaWYgKGkgPT09IDApIHtcbiAgICAgICAgICBpZiAocGF0dGVybi5sZW5ndGggPiAxKSB7XG4gICAgICAgICAgICBwYXR0ZXJuW2krMV0gPSAnKD86XFxcXFxcL3wnICsgdHdvU3RhciArICdcXFxcXFwvKT8nICsgcGF0dGVybltpKzFdXG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHBhdHRlcm5baV0gPSB0d29TdGFyXG4gICAgICAgICAgfVxuICAgICAgICB9IGVsc2UgaWYgKGkgPT09IHBhdHRlcm4ubGVuZ3RoIC0gMSkge1xuICAgICAgICAgIHBhdHRlcm5baS0xXSArPSAnKD86XFxcXFxcL3wnICsgdHdvU3RhciArICcpPydcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBwYXR0ZXJuW2ktMV0gKz0gJyg/OlxcXFxcXC98XFxcXFxcLycgKyB0d29TdGFyICsgJ1xcXFxcXC8pJyArIHBhdHRlcm5baSsxXVxuICAgICAgICAgIHBhdHRlcm5baSsxXSA9IEdMT0JTVEFSXG4gICAgICAgIH1cbiAgICAgIH0pXG4gICAgICByZXR1cm4gcGF0dGVybi5maWx0ZXIocCA9PiBwICE9PSBHTE9CU1RBUikuam9pbignLycpXG4gICAgfSkuam9pbignfCcpXG5cbiAgICAvLyBtdXN0IG1hdGNoIGVudGlyZSBwYXR0ZXJuXG4gICAgLy8gZW5kaW5nIGluIGEgKiBvciAqKiB3aWxsIG1ha2UgaXQgbGVzcyBzdHJpY3QuXG4gICAgcmUgPSAnXig/OicgKyByZSArICcpJCdcblxuICAgIC8vIGNhbiBtYXRjaCBhbnl0aGluZywgYXMgbG9uZyBhcyBpdCdzIG5vdCB0aGlzLlxuICAgIGlmICh0aGlzLm5lZ2F0ZSkgcmUgPSAnXig/IScgKyByZSArICcpLiokJ1xuXG4gICAgdHJ5IHtcbiAgICAgIHRoaXMucmVnZXhwID0gbmV3IFJlZ0V4cChyZSwgZmxhZ3MpXG4gICAgfSBjYXRjaCAoZXgpIC8qIGlzdGFuYnVsIGlnbm9yZSBuZXh0IC0gc2hvdWxkIGJlIGltcG9zc2libGUgKi8ge1xuICAgICAgdGhpcy5yZWdleHAgPSBmYWxzZVxuICAgIH1cbiAgICByZXR1cm4gdGhpcy5yZWdleHBcbiAgfVxuXG4gIG1hdGNoIChmLCBwYXJ0aWFsID0gdGhpcy5wYXJ0aWFsKSB7XG4gICAgdGhpcy5kZWJ1ZygnbWF0Y2gnLCBmLCB0aGlzLnBhdHRlcm4pXG4gICAgLy8gc2hvcnQtY2lyY3VpdCBpbiB0aGUgY2FzZSBvZiBidXN0ZWQgdGhpbmdzLlxuICAgIC8vIGNvbW1lbnRzLCBldGMuXG4gICAgaWYgKHRoaXMuY29tbWVudCkgcmV0dXJuIGZhbHNlXG4gICAgaWYgKHRoaXMuZW1wdHkpIHJldHVybiBmID09PSAnJ1xuXG4gICAgaWYgKGYgPT09ICcvJyAmJiBwYXJ0aWFsKSByZXR1cm4gdHJ1ZVxuXG4gICAgY29uc3Qgb3B0aW9ucyA9IHRoaXMub3B0aW9uc1xuXG4gICAgLy8gd2luZG93czogbmVlZCB0byB1c2UgLywgbm90IFxcXG4gICAgaWYgKHBhdGguc2VwICE9PSAnLycpIHtcbiAgICAgIGYgPSBmLnNwbGl0KHBhdGguc2VwKS5qb2luKCcvJylcbiAgICB9XG5cbiAgICAvLyB0cmVhdCB0aGUgdGVzdCBwYXRoIGFzIGEgc2V0IG9mIHBhdGhwYXJ0cy5cbiAgICBmID0gZi5zcGxpdChzbGFzaFNwbGl0KVxuICAgIHRoaXMuZGVidWcodGhpcy5wYXR0ZXJuLCAnc3BsaXQnLCBmKVxuXG4gICAgLy8ganVzdCBPTkUgb2YgdGhlIHBhdHRlcm4gc2V0cyBpbiB0aGlzLnNldCBuZWVkcyB0byBtYXRjaFxuICAgIC8vIGluIG9yZGVyIGZvciBpdCB0byBiZSB2YWxpZC4gIElmIG5lZ2F0aW5nLCB0aGVuIGp1c3Qgb25lXG4gICAgLy8gbWF0Y2ggbWVhbnMgdGhhdCB3ZSBoYXZlIGZhaWxlZC5cbiAgICAvLyBFaXRoZXIgd2F5LCByZXR1cm4gb24gdGhlIGZpcnN0IGhpdC5cblxuICAgIGNvbnN0IHNldCA9IHRoaXMuc2V0XG4gICAgdGhpcy5kZWJ1Zyh0aGlzLnBhdHRlcm4sICdzZXQnLCBzZXQpXG5cbiAgICAvLyBGaW5kIHRoZSBiYXNlbmFtZSBvZiB0aGUgcGF0aCBieSBsb29raW5nIGZvciB0aGUgbGFzdCBub24tZW1wdHkgc2VnbWVudFxuICAgIGxldCBmaWxlbmFtZVxuICAgIGZvciAobGV0IGkgPSBmLmxlbmd0aCAtIDE7IGkgPj0gMDsgaS0tKSB7XG4gICAgICBmaWxlbmFtZSA9IGZbaV1cbiAgICAgIGlmIChmaWxlbmFtZSkgYnJlYWtcbiAgICB9XG5cbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IHNldC5sZW5ndGg7IGkrKykge1xuICAgICAgY29uc3QgcGF0dGVybiA9IHNldFtpXVxuICAgICAgbGV0IGZpbGUgPSBmXG4gICAgICBpZiAob3B0aW9ucy5tYXRjaEJhc2UgJiYgcGF0dGVybi5sZW5ndGggPT09IDEpIHtcbiAgICAgICAgZmlsZSA9IFtmaWxlbmFtZV1cbiAgICAgIH1cbiAgICAgIGNvbnN0IGhpdCA9IHRoaXMubWF0Y2hPbmUoZmlsZSwgcGF0dGVybiwgcGFydGlhbClcbiAgICAgIGlmIChoaXQpIHtcbiAgICAgICAgaWYgKG9wdGlvbnMuZmxpcE5lZ2F0ZSkgcmV0dXJuIHRydWVcbiAgICAgICAgcmV0dXJuICF0aGlzLm5lZ2F0ZVxuICAgICAgfVxuICAgIH1cblxuICAgIC8vIGRpZG4ndCBnZXQgYW55IGhpdHMuICB0aGlzIGlzIHN1Y2Nlc3MgaWYgaXQncyBhIG5lZ2F0aXZlXG4gICAgLy8gcGF0dGVybiwgZmFpbHVyZSBvdGhlcndpc2UuXG4gICAgaWYgKG9wdGlvbnMuZmxpcE5lZ2F0ZSkgcmV0dXJuIGZhbHNlXG4gICAgcmV0dXJuIHRoaXMubmVnYXRlXG4gIH1cblxuICBzdGF0aWMgZGVmYXVsdHMgKGRlZikge1xuICAgIHJldHVybiBtaW5pbWF0Y2guZGVmYXVsdHMoZGVmKS5NaW5pbWF0Y2hcbiAgfVxufVxuXG5taW5pbWF0Y2guTWluaW1hdGNoID0gTWluaW1hdGNoXG4iLAogICAgIm1vZHVsZS5leHBvcnRzID0gcmVhZGRpckdsb2I7XG5cbmNvbnN0IGZzID0gcmVxdWlyZSgnZnMnKTtcbmNvbnN0IHsgRXZlbnRFbWl0dGVyIH0gPSByZXF1aXJlKCdldmVudHMnKTtcbmNvbnN0IHsgTWluaW1hdGNoIH0gPSByZXF1aXJlKCdtaW5pbWF0Y2gnKTtcbmNvbnN0IHsgcmVzb2x2ZSB9ID0gcmVxdWlyZSgncGF0aCcpO1xuXG5mdW5jdGlvbiByZWFkZGlyKGRpciwgc3RyaWN0KSB7XG4gIHJldHVybiBuZXcgUHJvbWlzZSgocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XG4gICAgZnMucmVhZGRpcihkaXIsIHt3aXRoRmlsZVR5cGVzOiB0cnVlfSAsKGVyciwgZmlsZXMpID0+IHtcbiAgICAgIGlmKGVycikge1xuICAgICAgICBzd2l0Y2ggKGVyci5jb2RlKSB7XG4gICAgICAgICAgY2FzZSAnRU5PVERJUic6ICAgICAgLy8gTm90IGEgZGlyZWN0b3J5XG4gICAgICAgICAgICBpZihzdHJpY3QpIHtcbiAgICAgICAgICAgICAgcmVqZWN0KGVycik7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICByZXNvbHZlKFtdKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgIGNhc2UgJ0VOT1RTVVAnOiAgICAgIC8vIE9wZXJhdGlvbiBub3Qgc3VwcG9ydGVkXG4gICAgICAgICAgY2FzZSAnRU5PRU5UJzogICAgICAgLy8gTm8gc3VjaCBmaWxlIG9yIGRpcmVjdG9yeVxuICAgICAgICAgIGNhc2UgJ0VOQU1FVE9PTE9ORyc6IC8vIEZpbGVuYW1lIHRvbyBsb25nXG4gICAgICAgICAgY2FzZSAnVU5LTk9XTic6XG4gICAgICAgICAgICByZXNvbHZlKFtdKTtcbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgIGNhc2UgJ0VMT09QJzogICAgICAgIC8vIFRvbyBtYW55IGxldmVscyBvZiBzeW1ib2xpYyBsaW5rc1xuICAgICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgICByZWplY3QoZXJyKTtcbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG4gICAgICB9IGVsc2Uge1xuICAgICAgICByZXNvbHZlKGZpbGVzKTtcbiAgICAgIH1cbiAgICB9KTtcbiAgfSk7XG59XG5mdW5jdGlvbiBzdGF0KGZpbGUsIGZvbGxvd1N5bWxpbmtzKSB7XG4gIHJldHVybiBuZXcgUHJvbWlzZSgocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XG4gICAgY29uc3Qgc3RhdEZ1bmMgPSBmb2xsb3dTeW1saW5rcyA/IGZzLnN0YXQgOiBmcy5sc3RhdDtcbiAgICBzdGF0RnVuYyhmaWxlLCAoZXJyLCBzdGF0cykgPT4ge1xuICAgICAgaWYoZXJyKSB7XG4gICAgICAgIHN3aXRjaCAoZXJyLmNvZGUpIHtcbiAgICAgICAgICBjYXNlICdFTk9FTlQnOlxuICAgICAgICAgICAgaWYoZm9sbG93U3ltbGlua3MpIHtcbiAgICAgICAgICAgICAgLy8gRmFsbGJhY2sgdG8gbHN0YXQgdG8gaGFuZGxlIGJyb2tlbiBsaW5rcyBhcyBmaWxlc1xuICAgICAgICAgICAgICByZXNvbHZlKHN0YXQoZmlsZSwgZmFsc2UpKTsgXG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICByZXNvbHZlKG51bGwpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICAgIHJlc29sdmUobnVsbCk7XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgcmVzb2x2ZShzdGF0cyk7XG4gICAgICB9XG4gICAgfSk7XG4gIH0pO1xufVxuXG5hc3luYyBmdW5jdGlvbiogZXhwbG9yZVdhbGtBc3luYyhkaXIsIHBhdGgsIGZvbGxvd1N5bWxpbmtzLCB1c2VTdGF0LCBzaG91bGRTa2lwLCBzdHJpY3QpIHtcbiAgbGV0IGZpbGVzID0gYXdhaXQgcmVhZGRpcihwYXRoICsgZGlyLCBzdHJpY3QpO1xuICBmb3IoY29uc3QgZmlsZSBvZiBmaWxlcykge1xuICAgIGxldCBuYW1lID0gZmlsZS5uYW1lO1xuICAgIGlmKG5hbWUgPT09IHVuZGVmaW5lZCkge1xuICAgICAgLy8gdW5kZWZpbmVkIGZpbGUubmFtZSBtZWFucyB0aGUgYHdpdGhGaWxlVHlwZXNgIG9wdGlvbnMgaXMgbm90IHN1cHBvcnRlZCBieSBub2RlXG4gICAgICAvLyB3ZSBoYXZlIHRvIGNhbGwgdGhlIHN0YXQgZnVuY3Rpb24gdG8ga25vdyBpZiBmaWxlIGlzIGRpcmVjdG9yeSBvciBub3QuXG4gICAgICBuYW1lID0gZmlsZTtcbiAgICAgIHVzZVN0YXQgPSB0cnVlO1xuICAgIH1cbiAgICBjb25zdCBmaWxlbmFtZSA9IGRpciArICcvJyArIG5hbWU7XG4gICAgY29uc3QgcmVsYXRpdmUgPSBmaWxlbmFtZS5zbGljZSgxKTsgLy8gUmVtb3ZlIHRoZSBsZWFkaW5nIC9cbiAgICBjb25zdCBhYnNvbHV0ZSA9IHBhdGggKyAnLycgKyByZWxhdGl2ZTtcbiAgICBsZXQgc3RhdHMgPSBudWxsO1xuICAgIGlmKHVzZVN0YXQgfHwgZm9sbG93U3ltbGlua3MpIHtcbiAgICAgIHN0YXRzID0gYXdhaXQgc3RhdChhYnNvbHV0ZSwgZm9sbG93U3ltbGlua3MpO1xuICAgIH1cbiAgICBpZighc3RhdHMgJiYgZmlsZS5uYW1lICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIHN0YXRzID0gZmlsZTtcbiAgICB9XG4gICAgaWYoc3RhdHMgPT09IG51bGwpIHtcbiAgICAgIHN0YXRzID0geyBpc0RpcmVjdG9yeTogKCkgPT4gZmFsc2UgfTtcbiAgICB9XG5cbiAgICBpZihzdGF0cy5pc0RpcmVjdG9yeSgpKSB7XG4gICAgICBpZighc2hvdWxkU2tpcChyZWxhdGl2ZSkpIHtcbiAgICAgICAgeWllbGQge3JlbGF0aXZlLCBhYnNvbHV0ZSwgc3RhdHN9O1xuICAgICAgICB5aWVsZCogZXhwbG9yZVdhbGtBc3luYyhmaWxlbmFtZSwgcGF0aCwgZm9sbG93U3ltbGlua3MsIHVzZVN0YXQsIHNob3VsZFNraXAsIGZhbHNlKTtcbiAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAgeWllbGQge3JlbGF0aXZlLCBhYnNvbHV0ZSwgc3RhdHN9O1xuICAgIH1cbiAgfVxufVxuYXN5bmMgZnVuY3Rpb24qIGV4cGxvcmUocGF0aCwgZm9sbG93U3ltbGlua3MsIHVzZVN0YXQsIHNob3VsZFNraXApIHtcbiAgeWllbGQqIGV4cGxvcmVXYWxrQXN5bmMoJycsIHBhdGgsIGZvbGxvd1N5bWxpbmtzLCB1c2VTdGF0LCBzaG91bGRTa2lwLCB0cnVlKTtcbn1cblxuXG5mdW5jdGlvbiByZWFkT3B0aW9ucyhvcHRpb25zKSB7XG4gIHJldHVybiB7XG4gICAgcGF0dGVybjogb3B0aW9ucy5wYXR0ZXJuLFxuICAgIGRvdDogISFvcHRpb25zLmRvdCxcbiAgICBub2dsb2JzdGFyOiAhIW9wdGlvbnMubm9nbG9ic3RhcixcbiAgICBtYXRjaEJhc2U6ICEhb3B0aW9ucy5tYXRjaEJhc2UsXG4gICAgbm9jYXNlOiAhIW9wdGlvbnMubm9jYXNlLFxuICAgIGlnbm9yZTogb3B0aW9ucy5pZ25vcmUsXG4gICAgc2tpcDogb3B0aW9ucy5za2lwLFxuXG4gICAgZm9sbG93OiAhIW9wdGlvbnMuZm9sbG93LFxuICAgIHN0YXQ6ICEhb3B0aW9ucy5zdGF0LFxuICAgIG5vZGlyOiAhIW9wdGlvbnMubm9kaXIsXG4gICAgbWFyazogISFvcHRpb25zLm1hcmssXG4gICAgc2lsZW50OiAhIW9wdGlvbnMuc2lsZW50LFxuICAgIGFic29sdXRlOiAhIW9wdGlvbnMuYWJzb2x1dGVcbiAgfTtcbn1cblxuY2xhc3MgUmVhZGRpckdsb2IgZXh0ZW5kcyBFdmVudEVtaXR0ZXIge1xuICBjb25zdHJ1Y3Rvcihjd2QsIG9wdGlvbnMsIGNiKSB7XG4gICAgc3VwZXIoKTtcbiAgICBpZih0eXBlb2Ygb3B0aW9ucyA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgY2IgPSBvcHRpb25zO1xuICAgICAgb3B0aW9ucyA9IG51bGw7XG4gICAgfVxuXG4gICAgdGhpcy5vcHRpb25zID0gcmVhZE9wdGlvbnMob3B0aW9ucyB8fMKge30pO1xuICBcbiAgICB0aGlzLm1hdGNoZXJzID0gW107XG4gICAgaWYodGhpcy5vcHRpb25zLnBhdHRlcm4pIHtcbiAgICAgIGNvbnN0IG1hdGNoZXJzID0gQXJyYXkuaXNBcnJheSh0aGlzLm9wdGlvbnMucGF0dGVybikgPyB0aGlzLm9wdGlvbnMucGF0dGVybiA6IFt0aGlzLm9wdGlvbnMucGF0dGVybl07XG4gICAgICB0aGlzLm1hdGNoZXJzID0gbWF0Y2hlcnMubWFwKCBtID0+XG4gICAgICAgIG5ldyBNaW5pbWF0Y2gobSwge1xuICAgICAgICAgIGRvdDogdGhpcy5vcHRpb25zLmRvdCxcbiAgICAgICAgICBub2dsb2JzdGFyOnRoaXMub3B0aW9ucy5ub2dsb2JzdGFyLFxuICAgICAgICAgIG1hdGNoQmFzZTp0aGlzLm9wdGlvbnMubWF0Y2hCYXNlLFxuICAgICAgICAgIG5vY2FzZTp0aGlzLm9wdGlvbnMubm9jYXNlXG4gICAgICAgIH0pXG4gICAgICApO1xuICAgIH1cbiAgXG4gICAgdGhpcy5pZ25vcmVNYXRjaGVycyA9IFtdO1xuICAgIGlmKHRoaXMub3B0aW9ucy5pZ25vcmUpIHtcbiAgICAgIGNvbnN0IGlnbm9yZVBhdHRlcm5zID0gQXJyYXkuaXNBcnJheSh0aGlzLm9wdGlvbnMuaWdub3JlKSA/IHRoaXMub3B0aW9ucy5pZ25vcmUgOiBbdGhpcy5vcHRpb25zLmlnbm9yZV07XG4gICAgICB0aGlzLmlnbm9yZU1hdGNoZXJzID0gaWdub3JlUGF0dGVybnMubWFwKCBpZ25vcmUgPT5cbiAgICAgICAgbmV3IE1pbmltYXRjaChpZ25vcmUsIHtkb3Q6IHRydWV9KVxuICAgICAgKTtcbiAgICB9XG4gIFxuICAgIHRoaXMuc2tpcE1hdGNoZXJzID0gW107XG4gICAgaWYodGhpcy5vcHRpb25zLnNraXApIHtcbiAgICAgIGNvbnN0IHNraXBQYXR0ZXJucyA9IEFycmF5LmlzQXJyYXkodGhpcy5vcHRpb25zLnNraXApID8gdGhpcy5vcHRpb25zLnNraXAgOiBbdGhpcy5vcHRpb25zLnNraXBdO1xuICAgICAgdGhpcy5za2lwTWF0Y2hlcnMgPSBza2lwUGF0dGVybnMubWFwKCBza2lwID0+XG4gICAgICAgIG5ldyBNaW5pbWF0Y2goc2tpcCwge2RvdDogdHJ1ZX0pXG4gICAgICApO1xuICAgIH1cblxuICAgIHRoaXMuaXRlcmF0b3IgPSBleHBsb3JlKHJlc29sdmUoY3dkIHx8ICcuJyksIHRoaXMub3B0aW9ucy5mb2xsb3csIHRoaXMub3B0aW9ucy5zdGF0LCB0aGlzLl9zaG91bGRTa2lwRGlyZWN0b3J5LmJpbmQodGhpcykpO1xuICAgIHRoaXMucGF1c2VkID0gZmFsc2U7XG4gICAgdGhpcy5pbmFjdGl2ZSA9IGZhbHNlO1xuICAgIHRoaXMuYWJvcnRlZCA9IGZhbHNlO1xuICBcbiAgICBpZihjYikge1xuICAgICAgdGhpcy5fbWF0Y2hlcyA9IFtdOyBcbiAgICAgIHRoaXMub24oJ21hdGNoJywgbWF0Y2ggPT4gdGhpcy5fbWF0Y2hlcy5wdXNoKHRoaXMub3B0aW9ucy5hYnNvbHV0ZSA/IG1hdGNoLmFic29sdXRlIDogbWF0Y2gucmVsYXRpdmUpKTtcbiAgICAgIHRoaXMub24oJ2Vycm9yJywgZXJyID0+IGNiKGVycikpO1xuICAgICAgdGhpcy5vbignZW5kJywgKCkgPT4gY2IobnVsbCwgdGhpcy5fbWF0Y2hlcykpO1xuICAgIH1cblxuICAgIHNldFRpbWVvdXQoICgpID0+IHRoaXMuX25leHQoKSwgMCk7XG4gIH1cblxuICBfc2hvdWxkU2tpcERpcmVjdG9yeShyZWxhdGl2ZSkge1xuICAgIC8vY29uc29sZS5sb2cocmVsYXRpdmUsIHRoaXMuc2tpcE1hdGNoZXJzLnNvbWUobSA9PiBtLm1hdGNoKHJlbGF0aXZlKSkpO1xuICAgIHJldHVybiB0aGlzLnNraXBNYXRjaGVycy5zb21lKG0gPT4gbS5tYXRjaChyZWxhdGl2ZSkpO1xuICB9XG5cbiAgX2ZpbGVNYXRjaGVzKHJlbGF0aXZlLCBpc0RpcmVjdG9yeSkge1xuICAgIGNvbnN0IGZpbGUgPSByZWxhdGl2ZSArIChpc0RpcmVjdG9yeSA/ICcvJyA6ICcnKTtcbiAgICByZXR1cm4gKHRoaXMubWF0Y2hlcnMubGVuZ3RoID09PSAwIHx8IHRoaXMubWF0Y2hlcnMuc29tZShtID0+IG0ubWF0Y2goZmlsZSkpKVxuICAgICAgJiYgIXRoaXMuaWdub3JlTWF0Y2hlcnMuc29tZShtID0+IG0ubWF0Y2goZmlsZSkpXG4gICAgICAmJiAoIXRoaXMub3B0aW9ucy5ub2RpciB8fCAhaXNEaXJlY3RvcnkpO1xuICB9XG5cbiAgX25leHQoKSB7XG4gICAgaWYoIXRoaXMucGF1c2VkICYmICF0aGlzLmFib3J0ZWQpIHtcbiAgICAgIHRoaXMuaXRlcmF0b3IubmV4dCgpXG4gICAgICAudGhlbigob2JqKT0+IHtcbiAgICAgICAgaWYoIW9iai5kb25lKSB7XG4gICAgICAgICAgY29uc3QgaXNEaXJlY3RvcnkgPSBvYmoudmFsdWUuc3RhdHMuaXNEaXJlY3RvcnkoKTtcbiAgICAgICAgICBpZih0aGlzLl9maWxlTWF0Y2hlcyhvYmoudmFsdWUucmVsYXRpdmUsIGlzRGlyZWN0b3J5ICkpIHtcbiAgICAgICAgICAgIGxldCByZWxhdGl2ZSA9IG9iai52YWx1ZS5yZWxhdGl2ZTtcbiAgICAgICAgICAgIGxldCBhYnNvbHV0ZSA9IG9iai52YWx1ZS5hYnNvbHV0ZTtcbiAgICAgICAgICAgIGlmKHRoaXMub3B0aW9ucy5tYXJrICYmIGlzRGlyZWN0b3J5KSB7XG4gICAgICAgICAgICAgIHJlbGF0aXZlICs9ICcvJztcbiAgICAgICAgICAgICAgYWJzb2x1dGUgKz0gJy8nO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYodGhpcy5vcHRpb25zLnN0YXQpIHtcbiAgICAgICAgICAgICAgdGhpcy5lbWl0KCdtYXRjaCcsIHtyZWxhdGl2ZSwgYWJzb2x1dGUsIHN0YXQ6b2JqLnZhbHVlLnN0YXRzfSk7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICB0aGlzLmVtaXQoJ21hdGNoJywge3JlbGF0aXZlLCBhYnNvbHV0ZX0pO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgICB0aGlzLl9uZXh0KHRoaXMuaXRlcmF0b3IpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHRoaXMuZW1pdCgnZW5kJyk7XG4gICAgICAgIH1cbiAgICAgIH0pXG4gICAgICAuY2F0Y2goKGVycikgPT4ge1xuICAgICAgICB0aGlzLmFib3J0KCk7XG4gICAgICAgIHRoaXMuZW1pdCgnZXJyb3InLCBlcnIpO1xuICAgICAgICBpZighZXJyLmNvZGUgJiYgIXRoaXMub3B0aW9ucy5zaWxlbnQpIHtcbiAgICAgICAgICBjb25zb2xlLmVycm9yKGVycik7XG4gICAgICAgIH1cbiAgICAgIH0pO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLmluYWN0aXZlID0gdHJ1ZTtcbiAgICB9XG4gIH1cblxuICBhYm9ydCgpIHtcbiAgICB0aGlzLmFib3J0ZWQgPSB0cnVlO1xuICB9XG5cbiAgcGF1c2UoKSB7XG4gICAgdGhpcy5wYXVzZWQgPSB0cnVlO1xuICB9XG5cbiAgcmVzdW1lKCkge1xuICAgIHRoaXMucGF1c2VkID0gZmFsc2U7XG4gICAgaWYodGhpcy5pbmFjdGl2ZSkge1xuICAgICAgdGhpcy5pbmFjdGl2ZSA9IGZhbHNlO1xuICAgICAgdGhpcy5fbmV4dCgpO1xuICAgIH1cbiAgfVxufVxuXG5cbmZ1bmN0aW9uIHJlYWRkaXJHbG9iKHBhdHRlcm4sIG9wdGlvbnMsIGNiKSB7XG4gIHJldHVybiBuZXcgUmVhZGRpckdsb2IocGF0dGVybiwgb3B0aW9ucywgY2IpO1xufVxucmVhZGRpckdsb2IuUmVhZGRpckdsb2IgPSBSZWFkZGlyR2xvYjsiLAogICAgIihmdW5jdGlvbiAoZ2xvYmFsLCBmYWN0b3J5KSB7XG4gICAgdHlwZW9mIGV4cG9ydHMgPT09ICdvYmplY3QnICYmIHR5cGVvZiBtb2R1bGUgIT09ICd1bmRlZmluZWQnID8gZmFjdG9yeShleHBvcnRzKSA6XG4gICAgdHlwZW9mIGRlZmluZSA9PT0gJ2Z1bmN0aW9uJyAmJiBkZWZpbmUuYW1kID8gZGVmaW5lKFsnZXhwb3J0cyddLCBmYWN0b3J5KSA6XG4gICAgKGdsb2JhbCA9IHR5cGVvZiBnbG9iYWxUaGlzICE9PSAndW5kZWZpbmVkJyA/IGdsb2JhbFRoaXMgOiBnbG9iYWwgfHwgc2VsZiwgZmFjdG9yeShnbG9iYWwuYXN5bmMgPSB7fSkpO1xufSkodGhpcywgKGZ1bmN0aW9uIChleHBvcnRzKSB7ICd1c2Ugc3RyaWN0JztcblxuICAgIC8qKlxuICAgICAqIENyZWF0ZXMgYSBjb250aW51YXRpb24gZnVuY3Rpb24gd2l0aCBzb21lIGFyZ3VtZW50cyBhbHJlYWR5IGFwcGxpZWQuXG4gICAgICpcbiAgICAgKiBVc2VmdWwgYXMgYSBzaG9ydGhhbmQgd2hlbiBjb21iaW5lZCB3aXRoIG90aGVyIGNvbnRyb2wgZmxvdyBmdW5jdGlvbnMuIEFueVxuICAgICAqIGFyZ3VtZW50cyBwYXNzZWQgdG8gdGhlIHJldHVybmVkIGZ1bmN0aW9uIGFyZSBhZGRlZCB0byB0aGUgYXJndW1lbnRzXG4gICAgICogb3JpZ2luYWxseSBwYXNzZWQgdG8gYXBwbHkuXG4gICAgICpcbiAgICAgKiBAbmFtZSBhcHBseVxuICAgICAqIEBzdGF0aWNcbiAgICAgKiBAbWVtYmVyT2YgbW9kdWxlOlV0aWxzXG4gICAgICogQG1ldGhvZFxuICAgICAqIEBjYXRlZ29yeSBVdGlsXG4gICAgICogQHBhcmFtIHtGdW5jdGlvbn0gZm4gLSBUaGUgZnVuY3Rpb24geW91IHdhbnQgdG8gZXZlbnR1YWxseSBhcHBseSBhbGxcbiAgICAgKiBhcmd1bWVudHMgdG8uIEludm9rZXMgd2l0aCAoYXJndW1lbnRzLi4uKS5cbiAgICAgKiBAcGFyYW0gey4uLip9IGFyZ3VtZW50cy4uLiAtIEFueSBudW1iZXIgb2YgYXJndW1lbnRzIHRvIGF1dG9tYXRpY2FsbHkgYXBwbHlcbiAgICAgKiB3aGVuIHRoZSBjb250aW51YXRpb24gaXMgY2FsbGVkLlxuICAgICAqIEByZXR1cm5zIHtGdW5jdGlvbn0gdGhlIHBhcnRpYWxseS1hcHBsaWVkIGZ1bmN0aW9uXG4gICAgICogQGV4YW1wbGVcbiAgICAgKlxuICAgICAqIC8vIHVzaW5nIGFwcGx5XG4gICAgICogYXN5bmMucGFyYWxsZWwoW1xuICAgICAqICAgICBhc3luYy5hcHBseShmcy53cml0ZUZpbGUsICd0ZXN0ZmlsZTEnLCAndGVzdDEnKSxcbiAgICAgKiAgICAgYXN5bmMuYXBwbHkoZnMud3JpdGVGaWxlLCAndGVzdGZpbGUyJywgJ3Rlc3QyJylcbiAgICAgKiBdKTtcbiAgICAgKlxuICAgICAqXG4gICAgICogLy8gdGhlIHNhbWUgcHJvY2VzcyB3aXRob3V0IHVzaW5nIGFwcGx5XG4gICAgICogYXN5bmMucGFyYWxsZWwoW1xuICAgICAqICAgICBmdW5jdGlvbihjYWxsYmFjaykge1xuICAgICAqICAgICAgICAgZnMud3JpdGVGaWxlKCd0ZXN0ZmlsZTEnLCAndGVzdDEnLCBjYWxsYmFjayk7XG4gICAgICogICAgIH0sXG4gICAgICogICAgIGZ1bmN0aW9uKGNhbGxiYWNrKSB7XG4gICAgICogICAgICAgICBmcy53cml0ZUZpbGUoJ3Rlc3RmaWxlMicsICd0ZXN0MicsIGNhbGxiYWNrKTtcbiAgICAgKiAgICAgfVxuICAgICAqIF0pO1xuICAgICAqXG4gICAgICogLy8gSXQncyBwb3NzaWJsZSB0byBwYXNzIGFueSBudW1iZXIgb2YgYWRkaXRpb25hbCBhcmd1bWVudHMgd2hlbiBjYWxsaW5nIHRoZVxuICAgICAqIC8vIGNvbnRpbnVhdGlvbjpcbiAgICAgKlxuICAgICAqIG5vZGU+IHZhciBmbiA9IGFzeW5jLmFwcGx5KHN5cy5wdXRzLCAnb25lJyk7XG4gICAgICogbm9kZT4gZm4oJ3R3bycsICd0aHJlZScpO1xuICAgICAqIG9uZVxuICAgICAqIHR3b1xuICAgICAqIHRocmVlXG4gICAgICovXG4gICAgZnVuY3Rpb24gYXBwbHkoZm4sIC4uLmFyZ3MpIHtcbiAgICAgICAgcmV0dXJuICguLi5jYWxsQXJncykgPT4gZm4oLi4uYXJncywuLi5jYWxsQXJncyk7XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gaW5pdGlhbFBhcmFtcyAoZm4pIHtcbiAgICAgICAgcmV0dXJuIGZ1bmN0aW9uICguLi5hcmdzLyosIGNhbGxiYWNrKi8pIHtcbiAgICAgICAgICAgIHZhciBjYWxsYmFjayA9IGFyZ3MucG9wKCk7XG4gICAgICAgICAgICByZXR1cm4gZm4uY2FsbCh0aGlzLCBhcmdzLCBjYWxsYmFjayk7XG4gICAgICAgIH07XG4gICAgfVxuXG4gICAgLyogaXN0YW5idWwgaWdub3JlIGZpbGUgKi9cblxuICAgIHZhciBoYXNRdWV1ZU1pY3JvdGFzayA9IHR5cGVvZiBxdWV1ZU1pY3JvdGFzayA9PT0gJ2Z1bmN0aW9uJyAmJiBxdWV1ZU1pY3JvdGFzaztcbiAgICB2YXIgaGFzU2V0SW1tZWRpYXRlID0gdHlwZW9mIHNldEltbWVkaWF0ZSA9PT0gJ2Z1bmN0aW9uJyAmJiBzZXRJbW1lZGlhdGU7XG4gICAgdmFyIGhhc05leHRUaWNrID0gdHlwZW9mIHByb2Nlc3MgPT09ICdvYmplY3QnICYmIHR5cGVvZiBwcm9jZXNzLm5leHRUaWNrID09PSAnZnVuY3Rpb24nO1xuXG4gICAgZnVuY3Rpb24gZmFsbGJhY2soZm4pIHtcbiAgICAgICAgc2V0VGltZW91dChmbiwgMCk7XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gd3JhcChkZWZlcikge1xuICAgICAgICByZXR1cm4gKGZuLCAuLi5hcmdzKSA9PiBkZWZlcigoKSA9PiBmbiguLi5hcmdzKSk7XG4gICAgfVxuXG4gICAgdmFyIF9kZWZlciQxO1xuXG4gICAgaWYgKGhhc1F1ZXVlTWljcm90YXNrKSB7XG4gICAgICAgIF9kZWZlciQxID0gcXVldWVNaWNyb3Rhc2s7XG4gICAgfSBlbHNlIGlmIChoYXNTZXRJbW1lZGlhdGUpIHtcbiAgICAgICAgX2RlZmVyJDEgPSBzZXRJbW1lZGlhdGU7XG4gICAgfSBlbHNlIGlmIChoYXNOZXh0VGljaykge1xuICAgICAgICBfZGVmZXIkMSA9IHByb2Nlc3MubmV4dFRpY2s7XG4gICAgfSBlbHNlIHtcbiAgICAgICAgX2RlZmVyJDEgPSBmYWxsYmFjaztcbiAgICB9XG5cbiAgICB2YXIgc2V0SW1tZWRpYXRlJDEgPSB3cmFwKF9kZWZlciQxKTtcblxuICAgIC8qKlxuICAgICAqIFRha2UgYSBzeW5jIGZ1bmN0aW9uIGFuZCBtYWtlIGl0IGFzeW5jLCBwYXNzaW5nIGl0cyByZXR1cm4gdmFsdWUgdG8gYVxuICAgICAqIGNhbGxiYWNrLiBUaGlzIGlzIHVzZWZ1bCBmb3IgcGx1Z2dpbmcgc3luYyBmdW5jdGlvbnMgaW50byBhIHdhdGVyZmFsbCxcbiAgICAgKiBzZXJpZXMsIG9yIG90aGVyIGFzeW5jIGZ1bmN0aW9ucy4gQW55IGFyZ3VtZW50cyBwYXNzZWQgdG8gdGhlIGdlbmVyYXRlZFxuICAgICAqIGZ1bmN0aW9uIHdpbGwgYmUgcGFzc2VkIHRvIHRoZSB3cmFwcGVkIGZ1bmN0aW9uIChleGNlcHQgZm9yIHRoZSBmaW5hbFxuICAgICAqIGNhbGxiYWNrIGFyZ3VtZW50KS4gRXJyb3JzIHRocm93biB3aWxsIGJlIHBhc3NlZCB0byB0aGUgY2FsbGJhY2suXG4gICAgICpcbiAgICAgKiBJZiB0aGUgZnVuY3Rpb24gcGFzc2VkIHRvIGBhc3luY2lmeWAgcmV0dXJucyBhIFByb21pc2UsIHRoYXQgcHJvbWlzZXMnc1xuICAgICAqIHJlc29sdmVkL3JlamVjdGVkIHN0YXRlIHdpbGwgYmUgdXNlZCB0byBjYWxsIHRoZSBjYWxsYmFjaywgcmF0aGVyIHRoYW4gc2ltcGx5XG4gICAgICogdGhlIHN5bmNocm9ub3VzIHJldHVybiB2YWx1ZS5cbiAgICAgKlxuICAgICAqIFRoaXMgYWxzbyBtZWFucyB5b3UgY2FuIGFzeW5jaWZ5IEVTMjAxNyBgYXN5bmNgIGZ1bmN0aW9ucy5cbiAgICAgKlxuICAgICAqIEBuYW1lIGFzeW5jaWZ5XG4gICAgICogQHN0YXRpY1xuICAgICAqIEBtZW1iZXJPZiBtb2R1bGU6VXRpbHNcbiAgICAgKiBAbWV0aG9kXG4gICAgICogQGFsaWFzIHdyYXBTeW5jXG4gICAgICogQGNhdGVnb3J5IFV0aWxcbiAgICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBmdW5jIC0gVGhlIHN5bmNocm9ub3VzIGZ1bmN0aW9uLCBvciBQcm9taXNlLXJldHVybmluZ1xuICAgICAqIGZ1bmN0aW9uIHRvIGNvbnZlcnQgdG8gYW4ge0BsaW5rIEFzeW5jRnVuY3Rpb259LlxuICAgICAqIEByZXR1cm5zIHtBc3luY0Z1bmN0aW9ufSBBbiBhc3luY2hyb25vdXMgd3JhcHBlciBvZiB0aGUgYGZ1bmNgLiBUbyBiZVxuICAgICAqIGludm9rZWQgd2l0aCBgKGFyZ3MuLi4sIGNhbGxiYWNrKWAuXG4gICAgICogQGV4YW1wbGVcbiAgICAgKlxuICAgICAqIC8vIHBhc3NpbmcgYSByZWd1bGFyIHN5bmNocm9ub3VzIGZ1bmN0aW9uXG4gICAgICogYXN5bmMud2F0ZXJmYWxsKFtcbiAgICAgKiAgICAgYXN5bmMuYXBwbHkoZnMucmVhZEZpbGUsIGZpbGVuYW1lLCBcInV0ZjhcIiksXG4gICAgICogICAgIGFzeW5jLmFzeW5jaWZ5KEpTT04ucGFyc2UpLFxuICAgICAqICAgICBmdW5jdGlvbiAoZGF0YSwgbmV4dCkge1xuICAgICAqICAgICAgICAgLy8gZGF0YSBpcyB0aGUgcmVzdWx0IG9mIHBhcnNpbmcgdGhlIHRleHQuXG4gICAgICogICAgICAgICAvLyBJZiB0aGVyZSB3YXMgYSBwYXJzaW5nIGVycm9yLCBpdCB3b3VsZCBoYXZlIGJlZW4gY2F1Z2h0LlxuICAgICAqICAgICB9XG4gICAgICogXSwgY2FsbGJhY2spO1xuICAgICAqXG4gICAgICogLy8gcGFzc2luZyBhIGZ1bmN0aW9uIHJldHVybmluZyBhIHByb21pc2VcbiAgICAgKiBhc3luYy53YXRlcmZhbGwoW1xuICAgICAqICAgICBhc3luYy5hcHBseShmcy5yZWFkRmlsZSwgZmlsZW5hbWUsIFwidXRmOFwiKSxcbiAgICAgKiAgICAgYXN5bmMuYXN5bmNpZnkoZnVuY3Rpb24gKGNvbnRlbnRzKSB7XG4gICAgICogICAgICAgICByZXR1cm4gZGIubW9kZWwuY3JlYXRlKGNvbnRlbnRzKTtcbiAgICAgKiAgICAgfSksXG4gICAgICogICAgIGZ1bmN0aW9uIChtb2RlbCwgbmV4dCkge1xuICAgICAqICAgICAgICAgLy8gYG1vZGVsYCBpcyB0aGUgaW5zdGFudGlhdGVkIG1vZGVsIG9iamVjdC5cbiAgICAgKiAgICAgICAgIC8vIElmIHRoZXJlIHdhcyBhbiBlcnJvciwgdGhpcyBmdW5jdGlvbiB3b3VsZCBiZSBza2lwcGVkLlxuICAgICAqICAgICB9XG4gICAgICogXSwgY2FsbGJhY2spO1xuICAgICAqXG4gICAgICogLy8gZXMyMDE3IGV4YW1wbGUsIHRob3VnaCBgYXN5bmNpZnlgIGlzIG5vdCBuZWVkZWQgaWYgeW91ciBKUyBlbnZpcm9ubWVudFxuICAgICAqIC8vIHN1cHBvcnRzIGFzeW5jIGZ1bmN0aW9ucyBvdXQgb2YgdGhlIGJveFxuICAgICAqIHZhciBxID0gYXN5bmMucXVldWUoYXN5bmMuYXN5bmNpZnkoYXN5bmMgZnVuY3Rpb24oZmlsZSkge1xuICAgICAqICAgICB2YXIgaW50ZXJtZWRpYXRlU3RlcCA9IGF3YWl0IHByb2Nlc3NGaWxlKGZpbGUpO1xuICAgICAqICAgICByZXR1cm4gYXdhaXQgc29tZVByb21pc2UoaW50ZXJtZWRpYXRlU3RlcClcbiAgICAgKiB9KSk7XG4gICAgICpcbiAgICAgKiBxLnB1c2goZmlsZXMpO1xuICAgICAqL1xuICAgIGZ1bmN0aW9uIGFzeW5jaWZ5KGZ1bmMpIHtcbiAgICAgICAgaWYgKGlzQXN5bmMoZnVuYykpIHtcbiAgICAgICAgICAgIHJldHVybiBmdW5jdGlvbiAoLi4uYXJncy8qLCBjYWxsYmFjayovKSB7XG4gICAgICAgICAgICAgICAgY29uc3QgY2FsbGJhY2sgPSBhcmdzLnBvcCgpO1xuICAgICAgICAgICAgICAgIGNvbnN0IHByb21pc2UgPSBmdW5jLmFwcGx5KHRoaXMsIGFyZ3MpO1xuICAgICAgICAgICAgICAgIHJldHVybiBoYW5kbGVQcm9taXNlKHByb21pc2UsIGNhbGxiYWNrKVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIGluaXRpYWxQYXJhbXMoZnVuY3Rpb24gKGFyZ3MsIGNhbGxiYWNrKSB7XG4gICAgICAgICAgICB2YXIgcmVzdWx0O1xuICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICByZXN1bHQgPSBmdW5jLmFwcGx5KHRoaXMsIGFyZ3MpO1xuICAgICAgICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICAgICAgICAgIHJldHVybiBjYWxsYmFjayhlKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIC8vIGlmIHJlc3VsdCBpcyBQcm9taXNlIG9iamVjdFxuICAgICAgICAgICAgaWYgKHJlc3VsdCAmJiB0eXBlb2YgcmVzdWx0LnRoZW4gPT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gaGFuZGxlUHJvbWlzZShyZXN1bHQsIGNhbGxiYWNrKVxuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICBjYWxsYmFjayhudWxsLCByZXN1bHQpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICB9XG5cbiAgICBmdW5jdGlvbiBoYW5kbGVQcm9taXNlKHByb21pc2UsIGNhbGxiYWNrKSB7XG4gICAgICAgIHJldHVybiBwcm9taXNlLnRoZW4odmFsdWUgPT4ge1xuICAgICAgICAgICAgaW52b2tlQ2FsbGJhY2soY2FsbGJhY2ssIG51bGwsIHZhbHVlKTtcbiAgICAgICAgfSwgZXJyID0+IHtcbiAgICAgICAgICAgIGludm9rZUNhbGxiYWNrKGNhbGxiYWNrLCBlcnIgJiYgKGVyciBpbnN0YW5jZW9mIEVycm9yIHx8IGVyci5tZXNzYWdlKSA/IGVyciA6IG5ldyBFcnJvcihlcnIpKTtcbiAgICAgICAgfSk7XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gaW52b2tlQ2FsbGJhY2soY2FsbGJhY2ssIGVycm9yLCB2YWx1ZSkge1xuICAgICAgICB0cnkge1xuICAgICAgICAgICAgY2FsbGJhY2soZXJyb3IsIHZhbHVlKTtcbiAgICAgICAgfSBjYXRjaCAoZXJyKSB7XG4gICAgICAgICAgICBzZXRJbW1lZGlhdGUkMShlID0+IHsgdGhyb3cgZSB9LCBlcnIpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gaXNBc3luYyhmbikge1xuICAgICAgICByZXR1cm4gZm5bU3ltYm9sLnRvU3RyaW5nVGFnXSA9PT0gJ0FzeW5jRnVuY3Rpb24nO1xuICAgIH1cblxuICAgIGZ1bmN0aW9uIGlzQXN5bmNHZW5lcmF0b3IoZm4pIHtcbiAgICAgICAgcmV0dXJuIGZuW1N5bWJvbC50b1N0cmluZ1RhZ10gPT09ICdBc3luY0dlbmVyYXRvcic7XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gaXNBc3luY0l0ZXJhYmxlKG9iaikge1xuICAgICAgICByZXR1cm4gdHlwZW9mIG9ialtTeW1ib2wuYXN5bmNJdGVyYXRvcl0gPT09ICdmdW5jdGlvbic7XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gd3JhcEFzeW5jKGFzeW5jRm4pIHtcbiAgICAgICAgaWYgKHR5cGVvZiBhc3luY0ZuICE9PSAnZnVuY3Rpb24nKSB0aHJvdyBuZXcgRXJyb3IoJ2V4cGVjdGVkIGEgZnVuY3Rpb24nKVxuICAgICAgICByZXR1cm4gaXNBc3luYyhhc3luY0ZuKSA/IGFzeW5jaWZ5KGFzeW5jRm4pIDogYXN5bmNGbjtcbiAgICB9XG5cbiAgICAvLyBjb25kaXRpb25hbGx5IHByb21pc2lmeSBhIGZ1bmN0aW9uLlxuICAgIC8vIG9ubHkgcmV0dXJuIGEgcHJvbWlzZSBpZiBhIGNhbGxiYWNrIGlzIG9taXR0ZWRcbiAgICBmdW5jdGlvbiBhd2FpdGlmeSAoYXN5bmNGbiwgYXJpdHkpIHtcbiAgICAgICAgaWYgKCFhcml0eSkgYXJpdHkgPSBhc3luY0ZuLmxlbmd0aDtcbiAgICAgICAgaWYgKCFhcml0eSkgdGhyb3cgbmV3IEVycm9yKCdhcml0eSBpcyB1bmRlZmluZWQnKVxuICAgICAgICBmdW5jdGlvbiBhd2FpdGFibGUgKC4uLmFyZ3MpIHtcbiAgICAgICAgICAgIGlmICh0eXBlb2YgYXJnc1thcml0eSAtIDFdID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGFzeW5jRm4uYXBwbHkodGhpcywgYXJncylcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgcmV0dXJuIG5ldyBQcm9taXNlKChyZXNvbHZlLCByZWplY3QpID0+IHtcbiAgICAgICAgICAgICAgICBhcmdzW2FyaXR5IC0gMV0gPSAoZXJyLCAuLi5jYkFyZ3MpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKGVycikgcmV0dXJuIHJlamVjdChlcnIpXG4gICAgICAgICAgICAgICAgICAgIHJlc29sdmUoY2JBcmdzLmxlbmd0aCA+IDEgPyBjYkFyZ3MgOiBjYkFyZ3NbMF0pO1xuICAgICAgICAgICAgICAgIH07XG4gICAgICAgICAgICAgICAgYXN5bmNGbi5hcHBseSh0aGlzLCBhcmdzKTtcbiAgICAgICAgICAgIH0pXG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gYXdhaXRhYmxlXG4gICAgfVxuXG4gICAgZnVuY3Rpb24gYXBwbHlFYWNoJDEgKGVhY2hmbikge1xuICAgICAgICByZXR1cm4gZnVuY3Rpb24gYXBwbHlFYWNoKGZucywgLi4uY2FsbEFyZ3MpIHtcbiAgICAgICAgICAgIGNvbnN0IGdvID0gYXdhaXRpZnkoZnVuY3Rpb24gKGNhbGxiYWNrKSB7XG4gICAgICAgICAgICAgICAgdmFyIHRoYXQgPSB0aGlzO1xuICAgICAgICAgICAgICAgIHJldHVybiBlYWNoZm4oZm5zLCAoZm4sIGNiKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgIHdyYXBBc3luYyhmbikuYXBwbHkodGhhdCwgY2FsbEFyZ3MuY29uY2F0KGNiKSk7XG4gICAgICAgICAgICAgICAgfSwgY2FsbGJhY2spO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICByZXR1cm4gZ287XG4gICAgICAgIH07XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gX2FzeW5jTWFwKGVhY2hmbiwgYXJyLCBpdGVyYXRlZSwgY2FsbGJhY2spIHtcbiAgICAgICAgYXJyID0gYXJyIHx8IFtdO1xuICAgICAgICB2YXIgcmVzdWx0cyA9IFtdO1xuICAgICAgICB2YXIgY291bnRlciA9IDA7XG4gICAgICAgIHZhciBfaXRlcmF0ZWUgPSB3cmFwQXN5bmMoaXRlcmF0ZWUpO1xuXG4gICAgICAgIHJldHVybiBlYWNoZm4oYXJyLCAodmFsdWUsIF8sIGl0ZXJDYikgPT4ge1xuICAgICAgICAgICAgdmFyIGluZGV4ID0gY291bnRlcisrO1xuICAgICAgICAgICAgX2l0ZXJhdGVlKHZhbHVlLCAoZXJyLCB2KSA9PiB7XG4gICAgICAgICAgICAgICAgcmVzdWx0c1tpbmRleF0gPSB2O1xuICAgICAgICAgICAgICAgIGl0ZXJDYihlcnIpO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgIH0sIGVyciA9PiB7XG4gICAgICAgICAgICBjYWxsYmFjayhlcnIsIHJlc3VsdHMpO1xuICAgICAgICB9KTtcbiAgICB9XG5cbiAgICBmdW5jdGlvbiBpc0FycmF5TGlrZSh2YWx1ZSkge1xuICAgICAgICByZXR1cm4gdmFsdWUgJiZcbiAgICAgICAgICAgIHR5cGVvZiB2YWx1ZS5sZW5ndGggPT09ICdudW1iZXInICYmXG4gICAgICAgICAgICB2YWx1ZS5sZW5ndGggPj0gMCAmJlxuICAgICAgICAgICAgdmFsdWUubGVuZ3RoICUgMSA9PT0gMDtcbiAgICB9XG5cbiAgICAvLyBBIHRlbXBvcmFyeSB2YWx1ZSB1c2VkIHRvIGlkZW50aWZ5IGlmIHRoZSBsb29wIHNob3VsZCBiZSBicm9rZW4uXG4gICAgLy8gU2VlICMxMDY0LCAjMTI5M1xuICAgIGNvbnN0IGJyZWFrTG9vcCA9IHt9O1xuXG4gICAgZnVuY3Rpb24gb25jZShmbikge1xuICAgICAgICBmdW5jdGlvbiB3cmFwcGVyICguLi5hcmdzKSB7XG4gICAgICAgICAgICBpZiAoZm4gPT09IG51bGwpIHJldHVybjtcbiAgICAgICAgICAgIHZhciBjYWxsRm4gPSBmbjtcbiAgICAgICAgICAgIGZuID0gbnVsbDtcbiAgICAgICAgICAgIGNhbGxGbi5hcHBseSh0aGlzLCBhcmdzKTtcbiAgICAgICAgfVxuICAgICAgICBPYmplY3QuYXNzaWduKHdyYXBwZXIsIGZuKTtcbiAgICAgICAgcmV0dXJuIHdyYXBwZXJcbiAgICB9XG5cbiAgICBmdW5jdGlvbiBnZXRJdGVyYXRvciAoY29sbCkge1xuICAgICAgICByZXR1cm4gY29sbFtTeW1ib2wuaXRlcmF0b3JdICYmIGNvbGxbU3ltYm9sLml0ZXJhdG9yXSgpO1xuICAgIH1cblxuICAgIGZ1bmN0aW9uIGNyZWF0ZUFycmF5SXRlcmF0b3IoY29sbCkge1xuICAgICAgICB2YXIgaSA9IC0xO1xuICAgICAgICB2YXIgbGVuID0gY29sbC5sZW5ndGg7XG4gICAgICAgIHJldHVybiBmdW5jdGlvbiBuZXh0KCkge1xuICAgICAgICAgICAgcmV0dXJuICsraSA8IGxlbiA/IHt2YWx1ZTogY29sbFtpXSwga2V5OiBpfSA6IG51bGw7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBmdW5jdGlvbiBjcmVhdGVFUzIwMTVJdGVyYXRvcihpdGVyYXRvcikge1xuICAgICAgICB2YXIgaSA9IC0xO1xuICAgICAgICByZXR1cm4gZnVuY3Rpb24gbmV4dCgpIHtcbiAgICAgICAgICAgIHZhciBpdGVtID0gaXRlcmF0b3IubmV4dCgpO1xuICAgICAgICAgICAgaWYgKGl0ZW0uZG9uZSlcbiAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgICAgICAgIGkrKztcbiAgICAgICAgICAgIHJldHVybiB7dmFsdWU6IGl0ZW0udmFsdWUsIGtleTogaX07XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBmdW5jdGlvbiBjcmVhdGVPYmplY3RJdGVyYXRvcihvYmopIHtcbiAgICAgICAgdmFyIG9rZXlzID0gb2JqID8gT2JqZWN0LmtleXMob2JqKSA6IFtdO1xuICAgICAgICB2YXIgaSA9IC0xO1xuICAgICAgICB2YXIgbGVuID0gb2tleXMubGVuZ3RoO1xuICAgICAgICByZXR1cm4gZnVuY3Rpb24gbmV4dCgpIHtcbiAgICAgICAgICAgIHZhciBrZXkgPSBva2V5c1srK2ldO1xuICAgICAgICAgICAgaWYgKGtleSA9PT0gJ19fcHJvdG9fXycpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gbmV4dCgpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIGkgPCBsZW4gPyB7dmFsdWU6IG9ialtrZXldLCBrZXl9IDogbnVsbDtcbiAgICAgICAgfTtcbiAgICB9XG5cbiAgICBmdW5jdGlvbiBjcmVhdGVJdGVyYXRvcihjb2xsKSB7XG4gICAgICAgIGlmIChpc0FycmF5TGlrZShjb2xsKSkge1xuICAgICAgICAgICAgcmV0dXJuIGNyZWF0ZUFycmF5SXRlcmF0b3IoY29sbCk7XG4gICAgICAgIH1cblxuICAgICAgICB2YXIgaXRlcmF0b3IgPSBnZXRJdGVyYXRvcihjb2xsKTtcbiAgICAgICAgcmV0dXJuIGl0ZXJhdG9yID8gY3JlYXRlRVMyMDE1SXRlcmF0b3IoaXRlcmF0b3IpIDogY3JlYXRlT2JqZWN0SXRlcmF0b3IoY29sbCk7XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gb25seU9uY2UoZm4pIHtcbiAgICAgICAgcmV0dXJuIGZ1bmN0aW9uICguLi5hcmdzKSB7XG4gICAgICAgICAgICBpZiAoZm4gPT09IG51bGwpIHRocm93IG5ldyBFcnJvcihcIkNhbGxiYWNrIHdhcyBhbHJlYWR5IGNhbGxlZC5cIik7XG4gICAgICAgICAgICB2YXIgY2FsbEZuID0gZm47XG4gICAgICAgICAgICBmbiA9IG51bGw7XG4gICAgICAgICAgICBjYWxsRm4uYXBwbHkodGhpcywgYXJncyk7XG4gICAgICAgIH07XG4gICAgfVxuXG4gICAgLy8gZm9yIGFzeW5jIGdlbmVyYXRvcnNcbiAgICBmdW5jdGlvbiBhc3luY0VhY2hPZkxpbWl0KGdlbmVyYXRvciwgbGltaXQsIGl0ZXJhdGVlLCBjYWxsYmFjaykge1xuICAgICAgICBsZXQgZG9uZSA9IGZhbHNlO1xuICAgICAgICBsZXQgY2FuY2VsZWQgPSBmYWxzZTtcbiAgICAgICAgbGV0IGF3YWl0aW5nID0gZmFsc2U7XG4gICAgICAgIGxldCBydW5uaW5nID0gMDtcbiAgICAgICAgbGV0IGlkeCA9IDA7XG5cbiAgICAgICAgZnVuY3Rpb24gcmVwbGVuaXNoKCkge1xuICAgICAgICAgICAgLy9jb25zb2xlLmxvZygncmVwbGVuaXNoJylcbiAgICAgICAgICAgIGlmIChydW5uaW5nID49IGxpbWl0IHx8IGF3YWl0aW5nIHx8IGRvbmUpIHJldHVyblxuICAgICAgICAgICAgLy9jb25zb2xlLmxvZygncmVwbGVuaXNoIGF3YWl0aW5nJylcbiAgICAgICAgICAgIGF3YWl0aW5nID0gdHJ1ZTtcbiAgICAgICAgICAgIGdlbmVyYXRvci5uZXh0KCkudGhlbigoe3ZhbHVlLCBkb25lOiBpdGVyRG9uZX0pID0+IHtcbiAgICAgICAgICAgICAgICAvL2NvbnNvbGUubG9nKCdnb3QgdmFsdWUnLCB2YWx1ZSlcbiAgICAgICAgICAgICAgICBpZiAoY2FuY2VsZWQgfHwgZG9uZSkgcmV0dXJuXG4gICAgICAgICAgICAgICAgYXdhaXRpbmcgPSBmYWxzZTtcbiAgICAgICAgICAgICAgICBpZiAoaXRlckRvbmUpIHtcbiAgICAgICAgICAgICAgICAgICAgZG9uZSA9IHRydWU7XG4gICAgICAgICAgICAgICAgICAgIGlmIChydW5uaW5nIDw9IDApIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vY29uc29sZS5sb2coJ2RvbmUgbmV4dENiJylcbiAgICAgICAgICAgICAgICAgICAgICAgIGNhbGxiYWNrKG51bGwpO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgcnVubmluZysrO1xuICAgICAgICAgICAgICAgIGl0ZXJhdGVlKHZhbHVlLCBpZHgsIGl0ZXJhdGVlQ2FsbGJhY2spO1xuICAgICAgICAgICAgICAgIGlkeCsrO1xuICAgICAgICAgICAgICAgIHJlcGxlbmlzaCgpO1xuICAgICAgICAgICAgfSkuY2F0Y2goaGFuZGxlRXJyb3IpO1xuICAgICAgICB9XG5cbiAgICAgICAgZnVuY3Rpb24gaXRlcmF0ZWVDYWxsYmFjayhlcnIsIHJlc3VsdCkge1xuICAgICAgICAgICAgLy9jb25zb2xlLmxvZygnaXRlcmF0ZWVDYWxsYmFjaycpXG4gICAgICAgICAgICBydW5uaW5nIC09IDE7XG4gICAgICAgICAgICBpZiAoY2FuY2VsZWQpIHJldHVyblxuICAgICAgICAgICAgaWYgKGVycikgcmV0dXJuIGhhbmRsZUVycm9yKGVycilcblxuICAgICAgICAgICAgaWYgKGVyciA9PT0gZmFsc2UpIHtcbiAgICAgICAgICAgICAgICBkb25lID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICBjYW5jZWxlZCA9IHRydWU7XG4gICAgICAgICAgICAgICAgcmV0dXJuXG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGlmIChyZXN1bHQgPT09IGJyZWFrTG9vcCB8fCAoZG9uZSAmJiBydW5uaW5nIDw9IDApKSB7XG4gICAgICAgICAgICAgICAgZG9uZSA9IHRydWU7XG4gICAgICAgICAgICAgICAgLy9jb25zb2xlLmxvZygnZG9uZSBpdGVyQ2InKVxuICAgICAgICAgICAgICAgIHJldHVybiBjYWxsYmFjayhudWxsKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJlcGxlbmlzaCgpO1xuICAgICAgICB9XG5cbiAgICAgICAgZnVuY3Rpb24gaGFuZGxlRXJyb3IoZXJyKSB7XG4gICAgICAgICAgICBpZiAoY2FuY2VsZWQpIHJldHVyblxuICAgICAgICAgICAgYXdhaXRpbmcgPSBmYWxzZTtcbiAgICAgICAgICAgIGRvbmUgPSB0cnVlO1xuICAgICAgICAgICAgY2FsbGJhY2soZXJyKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHJlcGxlbmlzaCgpO1xuICAgIH1cblxuICAgIHZhciBlYWNoT2ZMaW1pdCQyID0gKGxpbWl0KSA9PiB7XG4gICAgICAgIHJldHVybiAob2JqLCBpdGVyYXRlZSwgY2FsbGJhY2spID0+IHtcbiAgICAgICAgICAgIGNhbGxiYWNrID0gb25jZShjYWxsYmFjayk7XG4gICAgICAgICAgICBpZiAobGltaXQgPD0gMCkge1xuICAgICAgICAgICAgICAgIHRocm93IG5ldyBSYW5nZUVycm9yKCdjb25jdXJyZW5jeSBsaW1pdCBjYW5ub3QgYmUgbGVzcyB0aGFuIDEnKVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKCFvYmopIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gY2FsbGJhY2sobnVsbCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAoaXNBc3luY0dlbmVyYXRvcihvYmopKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGFzeW5jRWFjaE9mTGltaXQob2JqLCBsaW1pdCwgaXRlcmF0ZWUsIGNhbGxiYWNrKVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKGlzQXN5bmNJdGVyYWJsZShvYmopKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGFzeW5jRWFjaE9mTGltaXQob2JqW1N5bWJvbC5hc3luY0l0ZXJhdG9yXSgpLCBsaW1pdCwgaXRlcmF0ZWUsIGNhbGxiYWNrKVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgdmFyIG5leHRFbGVtID0gY3JlYXRlSXRlcmF0b3Iob2JqKTtcbiAgICAgICAgICAgIHZhciBkb25lID0gZmFsc2U7XG4gICAgICAgICAgICB2YXIgY2FuY2VsZWQgPSBmYWxzZTtcbiAgICAgICAgICAgIHZhciBydW5uaW5nID0gMDtcbiAgICAgICAgICAgIHZhciBsb29waW5nID0gZmFsc2U7XG5cbiAgICAgICAgICAgIGZ1bmN0aW9uIGl0ZXJhdGVlQ2FsbGJhY2soZXJyLCB2YWx1ZSkge1xuICAgICAgICAgICAgICAgIGlmIChjYW5jZWxlZCkgcmV0dXJuXG4gICAgICAgICAgICAgICAgcnVubmluZyAtPSAxO1xuICAgICAgICAgICAgICAgIGlmIChlcnIpIHtcbiAgICAgICAgICAgICAgICAgICAgZG9uZSA9IHRydWU7XG4gICAgICAgICAgICAgICAgICAgIGNhbGxiYWNrKGVycik7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGVsc2UgaWYgKGVyciA9PT0gZmFsc2UpIHtcbiAgICAgICAgICAgICAgICAgICAgZG9uZSA9IHRydWU7XG4gICAgICAgICAgICAgICAgICAgIGNhbmNlbGVkID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgZWxzZSBpZiAodmFsdWUgPT09IGJyZWFrTG9vcCB8fCAoZG9uZSAmJiBydW5uaW5nIDw9IDApKSB7XG4gICAgICAgICAgICAgICAgICAgIGRvbmUgPSB0cnVlO1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gY2FsbGJhY2sobnVsbCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGVsc2UgaWYgKCFsb29waW5nKSB7XG4gICAgICAgICAgICAgICAgICAgIHJlcGxlbmlzaCgpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgZnVuY3Rpb24gcmVwbGVuaXNoICgpIHtcbiAgICAgICAgICAgICAgICBsb29waW5nID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICB3aGlsZSAocnVubmluZyA8IGxpbWl0ICYmICFkb25lKSB7XG4gICAgICAgICAgICAgICAgICAgIHZhciBlbGVtID0gbmV4dEVsZW0oKTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKGVsZW0gPT09IG51bGwpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGRvbmUgPSB0cnVlO1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHJ1bm5pbmcgPD0gMCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhbGxiYWNrKG51bGwpO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIHJ1bm5pbmcgKz0gMTtcbiAgICAgICAgICAgICAgICAgICAgaXRlcmF0ZWUoZWxlbS52YWx1ZSwgZWxlbS5rZXksIG9ubHlPbmNlKGl0ZXJhdGVlQ2FsbGJhY2spKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgbG9vcGluZyA9IGZhbHNlO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICByZXBsZW5pc2goKTtcbiAgICAgICAgfTtcbiAgICB9O1xuXG4gICAgLyoqXG4gICAgICogVGhlIHNhbWUgYXMgW2BlYWNoT2ZgXXtAbGluayBtb2R1bGU6Q29sbGVjdGlvbnMuZWFjaE9mfSBidXQgcnVucyBhIG1heGltdW0gb2YgYGxpbWl0YCBhc3luYyBvcGVyYXRpb25zIGF0IGFcbiAgICAgKiB0aW1lLlxuICAgICAqXG4gICAgICogQG5hbWUgZWFjaE9mTGltaXRcbiAgICAgKiBAc3RhdGljXG4gICAgICogQG1lbWJlck9mIG1vZHVsZTpDb2xsZWN0aW9uc1xuICAgICAqIEBtZXRob2RcbiAgICAgKiBAc2VlIFthc3luYy5lYWNoT2Zde0BsaW5rIG1vZHVsZTpDb2xsZWN0aW9ucy5lYWNoT2Z9XG4gICAgICogQGFsaWFzIGZvckVhY2hPZkxpbWl0XG4gICAgICogQGNhdGVnb3J5IENvbGxlY3Rpb25cbiAgICAgKiBAcGFyYW0ge0FycmF5fEl0ZXJhYmxlfEFzeW5jSXRlcmFibGV8T2JqZWN0fSBjb2xsIC0gQSBjb2xsZWN0aW9uIHRvIGl0ZXJhdGUgb3Zlci5cbiAgICAgKiBAcGFyYW0ge251bWJlcn0gbGltaXQgLSBUaGUgbWF4aW11bSBudW1iZXIgb2YgYXN5bmMgb3BlcmF0aW9ucyBhdCBhIHRpbWUuXG4gICAgICogQHBhcmFtIHtBc3luY0Z1bmN0aW9ufSBpdGVyYXRlZSAtIEFuIGFzeW5jIGZ1bmN0aW9uIHRvIGFwcGx5IHRvIGVhY2hcbiAgICAgKiBpdGVtIGluIGBjb2xsYC4gVGhlIGBrZXlgIGlzIHRoZSBpdGVtJ3Mga2V5LCBvciBpbmRleCBpbiB0aGUgY2FzZSBvZiBhblxuICAgICAqIGFycmF5LlxuICAgICAqIEludm9rZWQgd2l0aCAoaXRlbSwga2V5LCBjYWxsYmFjaykuXG4gICAgICogQHBhcmFtIHtGdW5jdGlvbn0gW2NhbGxiYWNrXSAtIEEgY2FsbGJhY2sgd2hpY2ggaXMgY2FsbGVkIHdoZW4gYWxsXG4gICAgICogYGl0ZXJhdGVlYCBmdW5jdGlvbnMgaGF2ZSBmaW5pc2hlZCwgb3IgYW4gZXJyb3Igb2NjdXJzLiBJbnZva2VkIHdpdGggKGVycikuXG4gICAgICogQHJldHVybnMge1Byb21pc2V9IGEgcHJvbWlzZSwgaWYgYSBjYWxsYmFjayBpcyBvbWl0dGVkXG4gICAgICovXG4gICAgZnVuY3Rpb24gZWFjaE9mTGltaXQoY29sbCwgbGltaXQsIGl0ZXJhdGVlLCBjYWxsYmFjaykge1xuICAgICAgICByZXR1cm4gZWFjaE9mTGltaXQkMihsaW1pdCkoY29sbCwgd3JhcEFzeW5jKGl0ZXJhdGVlKSwgY2FsbGJhY2spO1xuICAgIH1cblxuICAgIHZhciBlYWNoT2ZMaW1pdCQxID0gYXdhaXRpZnkoZWFjaE9mTGltaXQsIDQpO1xuXG4gICAgLy8gZWFjaE9mIGltcGxlbWVudGF0aW9uIG9wdGltaXplZCBmb3IgYXJyYXktbGlrZXNcbiAgICBmdW5jdGlvbiBlYWNoT2ZBcnJheUxpa2UoY29sbCwgaXRlcmF0ZWUsIGNhbGxiYWNrKSB7XG4gICAgICAgIGNhbGxiYWNrID0gb25jZShjYWxsYmFjayk7XG4gICAgICAgIHZhciBpbmRleCA9IDAsXG4gICAgICAgICAgICBjb21wbGV0ZWQgPSAwLFxuICAgICAgICAgICAge2xlbmd0aH0gPSBjb2xsLFxuICAgICAgICAgICAgY2FuY2VsZWQgPSBmYWxzZTtcbiAgICAgICAgaWYgKGxlbmd0aCA9PT0gMCkge1xuICAgICAgICAgICAgY2FsbGJhY2sobnVsbCk7XG4gICAgICAgIH1cblxuICAgICAgICBmdW5jdGlvbiBpdGVyYXRvckNhbGxiYWNrKGVyciwgdmFsdWUpIHtcbiAgICAgICAgICAgIGlmIChlcnIgPT09IGZhbHNlKSB7XG4gICAgICAgICAgICAgICAgY2FuY2VsZWQgPSB0cnVlO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKGNhbmNlbGVkID09PSB0cnVlKSByZXR1cm5cbiAgICAgICAgICAgIGlmIChlcnIpIHtcbiAgICAgICAgICAgICAgICBjYWxsYmFjayhlcnIpO1xuICAgICAgICAgICAgfSBlbHNlIGlmICgoKytjb21wbGV0ZWQgPT09IGxlbmd0aCkgfHwgdmFsdWUgPT09IGJyZWFrTG9vcCkge1xuICAgICAgICAgICAgICAgIGNhbGxiYWNrKG51bGwpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgZm9yICg7IGluZGV4IDwgbGVuZ3RoOyBpbmRleCsrKSB7XG4gICAgICAgICAgICBpdGVyYXRlZShjb2xsW2luZGV4XSwgaW5kZXgsIG9ubHlPbmNlKGl0ZXJhdG9yQ2FsbGJhY2spKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIC8vIGEgZ2VuZXJpYyB2ZXJzaW9uIG9mIGVhY2hPZiB3aGljaCBjYW4gaGFuZGxlIGFycmF5LCBvYmplY3QsIGFuZCBpdGVyYXRvciBjYXNlcy5cbiAgICBmdW5jdGlvbiBlYWNoT2ZHZW5lcmljIChjb2xsLCBpdGVyYXRlZSwgY2FsbGJhY2spIHtcbiAgICAgICAgcmV0dXJuIGVhY2hPZkxpbWl0JDEoY29sbCwgSW5maW5pdHksIGl0ZXJhdGVlLCBjYWxsYmFjayk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogTGlrZSBbYGVhY2hgXXtAbGluayBtb2R1bGU6Q29sbGVjdGlvbnMuZWFjaH0sIGV4Y2VwdCB0aGF0IGl0IHBhc3NlcyB0aGUga2V5IChvciBpbmRleCkgYXMgdGhlIHNlY29uZCBhcmd1bWVudFxuICAgICAqIHRvIHRoZSBpdGVyYXRlZS5cbiAgICAgKlxuICAgICAqIEBuYW1lIGVhY2hPZlxuICAgICAqIEBzdGF0aWNcbiAgICAgKiBAbWVtYmVyT2YgbW9kdWxlOkNvbGxlY3Rpb25zXG4gICAgICogQG1ldGhvZFxuICAgICAqIEBhbGlhcyBmb3JFYWNoT2ZcbiAgICAgKiBAY2F0ZWdvcnkgQ29sbGVjdGlvblxuICAgICAqIEBzZWUgW2FzeW5jLmVhY2hde0BsaW5rIG1vZHVsZTpDb2xsZWN0aW9ucy5lYWNofVxuICAgICAqIEBwYXJhbSB7QXJyYXl8SXRlcmFibGV8QXN5bmNJdGVyYWJsZXxPYmplY3R9IGNvbGwgLSBBIGNvbGxlY3Rpb24gdG8gaXRlcmF0ZSBvdmVyLlxuICAgICAqIEBwYXJhbSB7QXN5bmNGdW5jdGlvbn0gaXRlcmF0ZWUgLSBBIGZ1bmN0aW9uIHRvIGFwcGx5IHRvIGVhY2hcbiAgICAgKiBpdGVtIGluIGBjb2xsYC5cbiAgICAgKiBUaGUgYGtleWAgaXMgdGhlIGl0ZW0ncyBrZXksIG9yIGluZGV4IGluIHRoZSBjYXNlIG9mIGFuIGFycmF5LlxuICAgICAqIEludm9rZWQgd2l0aCAoaXRlbSwga2V5LCBjYWxsYmFjaykuXG4gICAgICogQHBhcmFtIHtGdW5jdGlvbn0gW2NhbGxiYWNrXSAtIEEgY2FsbGJhY2sgd2hpY2ggaXMgY2FsbGVkIHdoZW4gYWxsXG4gICAgICogYGl0ZXJhdGVlYCBmdW5jdGlvbnMgaGF2ZSBmaW5pc2hlZCwgb3IgYW4gZXJyb3Igb2NjdXJzLiBJbnZva2VkIHdpdGggKGVycikuXG4gICAgICogQHJldHVybnMge1Byb21pc2V9IGEgcHJvbWlzZSwgaWYgYSBjYWxsYmFjayBpcyBvbWl0dGVkXG4gICAgICogQGV4YW1wbGVcbiAgICAgKlxuICAgICAqIC8vIGRldi5qc29uIGlzIGEgZmlsZSBjb250YWluaW5nIGEgdmFsaWQganNvbiBvYmplY3QgY29uZmlnIGZvciBkZXYgZW52aXJvbm1lbnRcbiAgICAgKiAvLyBkZXYuanNvbiBpcyBhIGZpbGUgY29udGFpbmluZyBhIHZhbGlkIGpzb24gb2JqZWN0IGNvbmZpZyBmb3IgdGVzdCBlbnZpcm9ubWVudFxuICAgICAqIC8vIHByb2QuanNvbiBpcyBhIGZpbGUgY29udGFpbmluZyBhIHZhbGlkIGpzb24gb2JqZWN0IGNvbmZpZyBmb3IgcHJvZCBlbnZpcm9ubWVudFxuICAgICAqIC8vIGludmFsaWQuanNvbiBpcyBhIGZpbGUgd2l0aCBhIG1hbGZvcm1lZCBqc29uIG9iamVjdFxuICAgICAqXG4gICAgICogbGV0IGNvbmZpZ3MgPSB7fTsgLy9nbG9iYWwgdmFyaWFibGVcbiAgICAgKiBsZXQgdmFsaWRDb25maWdGaWxlTWFwID0ge2RldjogJ2Rldi5qc29uJywgdGVzdDogJ3Rlc3QuanNvbicsIHByb2Q6ICdwcm9kLmpzb24nfTtcbiAgICAgKiBsZXQgaW52YWxpZENvbmZpZ0ZpbGVNYXAgPSB7ZGV2OiAnZGV2Lmpzb24nLCB0ZXN0OiAndGVzdC5qc29uJywgaW52YWxpZDogJ2ludmFsaWQuanNvbid9O1xuICAgICAqXG4gICAgICogLy8gYXN5bmNocm9ub3VzIGZ1bmN0aW9uIHRoYXQgcmVhZHMgYSBqc29uIGZpbGUgYW5kIHBhcnNlcyB0aGUgY29udGVudHMgYXMganNvbiBvYmplY3RcbiAgICAgKiBmdW5jdGlvbiBwYXJzZUZpbGUoZmlsZSwga2V5LCBjYWxsYmFjaykge1xuICAgICAqICAgICBmcy5yZWFkRmlsZShmaWxlLCBcInV0ZjhcIiwgZnVuY3Rpb24oZXJyLCBkYXRhKSB7XG4gICAgICogICAgICAgICBpZiAoZXJyKSByZXR1cm4gY2FsYmFjayhlcnIpO1xuICAgICAqICAgICAgICAgdHJ5IHtcbiAgICAgKiAgICAgICAgICAgICBjb25maWdzW2tleV0gPSBKU09OLnBhcnNlKGRhdGEpO1xuICAgICAqICAgICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAqICAgICAgICAgICAgIHJldHVybiBjYWxsYmFjayhlKTtcbiAgICAgKiAgICAgICAgIH1cbiAgICAgKiAgICAgICAgIGNhbGxiYWNrKCk7XG4gICAgICogICAgIH0pO1xuICAgICAqIH1cbiAgICAgKlxuICAgICAqIC8vIFVzaW5nIGNhbGxiYWNrc1xuICAgICAqIGFzeW5jLmZvckVhY2hPZih2YWxpZENvbmZpZ0ZpbGVNYXAsIHBhcnNlRmlsZSwgZnVuY3Rpb24gKGVycikge1xuICAgICAqICAgICBpZiAoZXJyKSB7XG4gICAgICogICAgICAgICBjb25zb2xlLmVycm9yKGVycik7XG4gICAgICogICAgIH0gZWxzZSB7XG4gICAgICogICAgICAgICBjb25zb2xlLmxvZyhjb25maWdzKTtcbiAgICAgKiAgICAgICAgIC8vIGNvbmZpZ3MgaXMgbm93IGEgbWFwIG9mIEpTT04gZGF0YSwgZS5nLlxuICAgICAqICAgICAgICAgLy8geyBkZXY6IC8vcGFyc2VkIGRldi5qc29uLCB0ZXN0OiAvL3BhcnNlZCB0ZXN0Lmpzb24sIHByb2Q6IC8vcGFyc2VkIHByb2QuanNvbn1cbiAgICAgKiAgICAgfVxuICAgICAqIH0pO1xuICAgICAqXG4gICAgICogLy9FcnJvciBoYW5kaW5nXG4gICAgICogYXN5bmMuZm9yRWFjaE9mKGludmFsaWRDb25maWdGaWxlTWFwLCBwYXJzZUZpbGUsIGZ1bmN0aW9uIChlcnIpIHtcbiAgICAgKiAgICAgaWYgKGVycikge1xuICAgICAqICAgICAgICAgY29uc29sZS5lcnJvcihlcnIpO1xuICAgICAqICAgICAgICAgLy8gSlNPTiBwYXJzZSBlcnJvciBleGNlcHRpb25cbiAgICAgKiAgICAgfSBlbHNlIHtcbiAgICAgKiAgICAgICAgIGNvbnNvbGUubG9nKGNvbmZpZ3MpO1xuICAgICAqICAgICB9XG4gICAgICogfSk7XG4gICAgICpcbiAgICAgKiAvLyBVc2luZyBQcm9taXNlc1xuICAgICAqIGFzeW5jLmZvckVhY2hPZih2YWxpZENvbmZpZ0ZpbGVNYXAsIHBhcnNlRmlsZSlcbiAgICAgKiAudGhlbiggKCkgPT4ge1xuICAgICAqICAgICBjb25zb2xlLmxvZyhjb25maWdzKTtcbiAgICAgKiAgICAgLy8gY29uZmlncyBpcyBub3cgYSBtYXAgb2YgSlNPTiBkYXRhLCBlLmcuXG4gICAgICogICAgIC8vIHsgZGV2OiAvL3BhcnNlZCBkZXYuanNvbiwgdGVzdDogLy9wYXJzZWQgdGVzdC5qc29uLCBwcm9kOiAvL3BhcnNlZCBwcm9kLmpzb259XG4gICAgICogfSkuY2F0Y2goIGVyciA9PiB7XG4gICAgICogICAgIGNvbnNvbGUuZXJyb3IoZXJyKTtcbiAgICAgKiB9KTtcbiAgICAgKlxuICAgICAqIC8vRXJyb3IgaGFuZGluZ1xuICAgICAqIGFzeW5jLmZvckVhY2hPZihpbnZhbGlkQ29uZmlnRmlsZU1hcCwgcGFyc2VGaWxlKVxuICAgICAqIC50aGVuKCAoKSA9PiB7XG4gICAgICogICAgIGNvbnNvbGUubG9nKGNvbmZpZ3MpO1xuICAgICAqIH0pLmNhdGNoKCBlcnIgPT4ge1xuICAgICAqICAgICBjb25zb2xlLmVycm9yKGVycik7XG4gICAgICogICAgIC8vIEpTT04gcGFyc2UgZXJyb3IgZXhjZXB0aW9uXG4gICAgICogfSk7XG4gICAgICpcbiAgICAgKiAvLyBVc2luZyBhc3luYy9hd2FpdFxuICAgICAqIGFzeW5jICgpID0+IHtcbiAgICAgKiAgICAgdHJ5IHtcbiAgICAgKiAgICAgICAgIGxldCByZXN1bHQgPSBhd2FpdCBhc3luYy5mb3JFYWNoT2YodmFsaWRDb25maWdGaWxlTWFwLCBwYXJzZUZpbGUpO1xuICAgICAqICAgICAgICAgY29uc29sZS5sb2coY29uZmlncyk7XG4gICAgICogICAgICAgICAvLyBjb25maWdzIGlzIG5vdyBhIG1hcCBvZiBKU09OIGRhdGEsIGUuZy5cbiAgICAgKiAgICAgICAgIC8vIHsgZGV2OiAvL3BhcnNlZCBkZXYuanNvbiwgdGVzdDogLy9wYXJzZWQgdGVzdC5qc29uLCBwcm9kOiAvL3BhcnNlZCBwcm9kLmpzb259XG4gICAgICogICAgIH1cbiAgICAgKiAgICAgY2F0Y2ggKGVycikge1xuICAgICAqICAgICAgICAgY29uc29sZS5sb2coZXJyKTtcbiAgICAgKiAgICAgfVxuICAgICAqIH1cbiAgICAgKlxuICAgICAqIC8vRXJyb3IgaGFuZGluZ1xuICAgICAqIGFzeW5jICgpID0+IHtcbiAgICAgKiAgICAgdHJ5IHtcbiAgICAgKiAgICAgICAgIGxldCByZXN1bHQgPSBhd2FpdCBhc3luYy5mb3JFYWNoT2YoaW52YWxpZENvbmZpZ0ZpbGVNYXAsIHBhcnNlRmlsZSk7XG4gICAgICogICAgICAgICBjb25zb2xlLmxvZyhjb25maWdzKTtcbiAgICAgKiAgICAgfVxuICAgICAqICAgICBjYXRjaCAoZXJyKSB7XG4gICAgICogICAgICAgICBjb25zb2xlLmxvZyhlcnIpO1xuICAgICAqICAgICAgICAgLy8gSlNPTiBwYXJzZSBlcnJvciBleGNlcHRpb25cbiAgICAgKiAgICAgfVxuICAgICAqIH1cbiAgICAgKlxuICAgICAqL1xuICAgIGZ1bmN0aW9uIGVhY2hPZihjb2xsLCBpdGVyYXRlZSwgY2FsbGJhY2spIHtcbiAgICAgICAgdmFyIGVhY2hPZkltcGxlbWVudGF0aW9uID0gaXNBcnJheUxpa2UoY29sbCkgPyBlYWNoT2ZBcnJheUxpa2UgOiBlYWNoT2ZHZW5lcmljO1xuICAgICAgICByZXR1cm4gZWFjaE9mSW1wbGVtZW50YXRpb24oY29sbCwgd3JhcEFzeW5jKGl0ZXJhdGVlKSwgY2FsbGJhY2spO1xuICAgIH1cblxuICAgIHZhciBlYWNoT2YkMSA9IGF3YWl0aWZ5KGVhY2hPZiwgMyk7XG5cbiAgICAvKipcbiAgICAgKiBQcm9kdWNlcyBhIG5ldyBjb2xsZWN0aW9uIG9mIHZhbHVlcyBieSBtYXBwaW5nIGVhY2ggdmFsdWUgaW4gYGNvbGxgIHRocm91Z2hcbiAgICAgKiB0aGUgYGl0ZXJhdGVlYCBmdW5jdGlvbi4gVGhlIGBpdGVyYXRlZWAgaXMgY2FsbGVkIHdpdGggYW4gaXRlbSBmcm9tIGBjb2xsYFxuICAgICAqIGFuZCBhIGNhbGxiYWNrIGZvciB3aGVuIGl0IGhhcyBmaW5pc2hlZCBwcm9jZXNzaW5nLiBFYWNoIG9mIHRoZXNlIGNhbGxiYWNrc1xuICAgICAqIHRha2VzIDIgYXJndW1lbnRzOiBhbiBgZXJyb3JgLCBhbmQgdGhlIHRyYW5zZm9ybWVkIGl0ZW0gZnJvbSBgY29sbGAuIElmXG4gICAgICogYGl0ZXJhdGVlYCBwYXNzZXMgYW4gZXJyb3IgdG8gaXRzIGNhbGxiYWNrLCB0aGUgbWFpbiBgY2FsbGJhY2tgIChmb3IgdGhlXG4gICAgICogYG1hcGAgZnVuY3Rpb24pIGlzIGltbWVkaWF0ZWx5IGNhbGxlZCB3aXRoIHRoZSBlcnJvci5cbiAgICAgKlxuICAgICAqIE5vdGUsIHRoYXQgc2luY2UgdGhpcyBmdW5jdGlvbiBhcHBsaWVzIHRoZSBgaXRlcmF0ZWVgIHRvIGVhY2ggaXRlbSBpblxuICAgICAqIHBhcmFsbGVsLCB0aGVyZSBpcyBubyBndWFyYW50ZWUgdGhhdCB0aGUgYGl0ZXJhdGVlYCBmdW5jdGlvbnMgd2lsbCBjb21wbGV0ZVxuICAgICAqIGluIG9yZGVyLiBIb3dldmVyLCB0aGUgcmVzdWx0cyBhcnJheSB3aWxsIGJlIGluIHRoZSBzYW1lIG9yZGVyIGFzIHRoZVxuICAgICAqIG9yaWdpbmFsIGBjb2xsYC5cbiAgICAgKlxuICAgICAqIElmIGBtYXBgIGlzIHBhc3NlZCBhbiBPYmplY3QsIHRoZSByZXN1bHRzIHdpbGwgYmUgYW4gQXJyYXkuICBUaGUgcmVzdWx0c1xuICAgICAqIHdpbGwgcm91Z2hseSBiZSBpbiB0aGUgb3JkZXIgb2YgdGhlIG9yaWdpbmFsIE9iamVjdHMnIGtleXMgKGJ1dCB0aGlzIGNhblxuICAgICAqIHZhcnkgYWNyb3NzIEphdmFTY3JpcHQgZW5naW5lcykuXG4gICAgICpcbiAgICAgKiBAbmFtZSBtYXBcbiAgICAgKiBAc3RhdGljXG4gICAgICogQG1lbWJlck9mIG1vZHVsZTpDb2xsZWN0aW9uc1xuICAgICAqIEBtZXRob2RcbiAgICAgKiBAY2F0ZWdvcnkgQ29sbGVjdGlvblxuICAgICAqIEBwYXJhbSB7QXJyYXl8SXRlcmFibGV8QXN5bmNJdGVyYWJsZXxPYmplY3R9IGNvbGwgLSBBIGNvbGxlY3Rpb24gdG8gaXRlcmF0ZSBvdmVyLlxuICAgICAqIEBwYXJhbSB7QXN5bmNGdW5jdGlvbn0gaXRlcmF0ZWUgLSBBbiBhc3luYyBmdW5jdGlvbiB0byBhcHBseSB0byBlYWNoIGl0ZW0gaW5cbiAgICAgKiBgY29sbGAuXG4gICAgICogVGhlIGl0ZXJhdGVlIHNob3VsZCBjb21wbGV0ZSB3aXRoIHRoZSB0cmFuc2Zvcm1lZCBpdGVtLlxuICAgICAqIEludm9rZWQgd2l0aCAoaXRlbSwgY2FsbGJhY2spLlxuICAgICAqIEBwYXJhbSB7RnVuY3Rpb259IFtjYWxsYmFja10gLSBBIGNhbGxiYWNrIHdoaWNoIGlzIGNhbGxlZCB3aGVuIGFsbCBgaXRlcmF0ZWVgXG4gICAgICogZnVuY3Rpb25zIGhhdmUgZmluaXNoZWQsIG9yIGFuIGVycm9yIG9jY3Vycy4gUmVzdWx0cyBpcyBhbiBBcnJheSBvZiB0aGVcbiAgICAgKiB0cmFuc2Zvcm1lZCBpdGVtcyBmcm9tIHRoZSBgY29sbGAuIEludm9rZWQgd2l0aCAoZXJyLCByZXN1bHRzKS5cbiAgICAgKiBAcmV0dXJucyB7UHJvbWlzZX0gYSBwcm9taXNlLCBpZiBubyBjYWxsYmFjayBpcyBwYXNzZWRcbiAgICAgKiBAZXhhbXBsZVxuICAgICAqXG4gICAgICogLy8gZmlsZTEudHh0IGlzIGEgZmlsZSB0aGF0IGlzIDEwMDAgYnl0ZXMgaW4gc2l6ZVxuICAgICAqIC8vIGZpbGUyLnR4dCBpcyBhIGZpbGUgdGhhdCBpcyAyMDAwIGJ5dGVzIGluIHNpemVcbiAgICAgKiAvLyBmaWxlMy50eHQgaXMgYSBmaWxlIHRoYXQgaXMgMzAwMCBieXRlcyBpbiBzaXplXG4gICAgICogLy8gZmlsZTQudHh0IGRvZXMgbm90IGV4aXN0XG4gICAgICpcbiAgICAgKiBjb25zdCBmaWxlTGlzdCA9IFsnZmlsZTEudHh0JywnZmlsZTIudHh0JywnZmlsZTMudHh0J107XG4gICAgICogY29uc3Qgd2l0aE1pc3NpbmdGaWxlTGlzdCA9IFsnZmlsZTEudHh0JywnZmlsZTIudHh0JywnZmlsZTQudHh0J107XG4gICAgICpcbiAgICAgKiAvLyBhc3luY2hyb25vdXMgZnVuY3Rpb24gdGhhdCByZXR1cm5zIHRoZSBmaWxlIHNpemUgaW4gYnl0ZXNcbiAgICAgKiBmdW5jdGlvbiBnZXRGaWxlU2l6ZUluQnl0ZXMoZmlsZSwgY2FsbGJhY2spIHtcbiAgICAgKiAgICAgZnMuc3RhdChmaWxlLCBmdW5jdGlvbihlcnIsIHN0YXQpIHtcbiAgICAgKiAgICAgICAgIGlmIChlcnIpIHtcbiAgICAgKiAgICAgICAgICAgICByZXR1cm4gY2FsbGJhY2soZXJyKTtcbiAgICAgKiAgICAgICAgIH1cbiAgICAgKiAgICAgICAgIGNhbGxiYWNrKG51bGwsIHN0YXQuc2l6ZSk7XG4gICAgICogICAgIH0pO1xuICAgICAqIH1cbiAgICAgKlxuICAgICAqIC8vIFVzaW5nIGNhbGxiYWNrc1xuICAgICAqIGFzeW5jLm1hcChmaWxlTGlzdCwgZ2V0RmlsZVNpemVJbkJ5dGVzLCBmdW5jdGlvbihlcnIsIHJlc3VsdHMpIHtcbiAgICAgKiAgICAgaWYgKGVycikge1xuICAgICAqICAgICAgICAgY29uc29sZS5sb2coZXJyKTtcbiAgICAgKiAgICAgfSBlbHNlIHtcbiAgICAgKiAgICAgICAgIGNvbnNvbGUubG9nKHJlc3VsdHMpO1xuICAgICAqICAgICAgICAgLy8gcmVzdWx0cyBpcyBub3cgYW4gYXJyYXkgb2YgdGhlIGZpbGUgc2l6ZSBpbiBieXRlcyBmb3IgZWFjaCBmaWxlLCBlLmcuXG4gICAgICogICAgICAgICAvLyBbIDEwMDAsIDIwMDAsIDMwMDBdXG4gICAgICogICAgIH1cbiAgICAgKiB9KTtcbiAgICAgKlxuICAgICAqIC8vIEVycm9yIEhhbmRsaW5nXG4gICAgICogYXN5bmMubWFwKHdpdGhNaXNzaW5nRmlsZUxpc3QsIGdldEZpbGVTaXplSW5CeXRlcywgZnVuY3Rpb24oZXJyLCByZXN1bHRzKSB7XG4gICAgICogICAgIGlmIChlcnIpIHtcbiAgICAgKiAgICAgICAgIGNvbnNvbGUubG9nKGVycik7XG4gICAgICogICAgICAgICAvLyBbIEVycm9yOiBFTk9FTlQ6IG5vIHN1Y2ggZmlsZSBvciBkaXJlY3RvcnkgXVxuICAgICAqICAgICB9IGVsc2Uge1xuICAgICAqICAgICAgICAgY29uc29sZS5sb2cocmVzdWx0cyk7XG4gICAgICogICAgIH1cbiAgICAgKiB9KTtcbiAgICAgKlxuICAgICAqIC8vIFVzaW5nIFByb21pc2VzXG4gICAgICogYXN5bmMubWFwKGZpbGVMaXN0LCBnZXRGaWxlU2l6ZUluQnl0ZXMpXG4gICAgICogLnRoZW4oIHJlc3VsdHMgPT4ge1xuICAgICAqICAgICBjb25zb2xlLmxvZyhyZXN1bHRzKTtcbiAgICAgKiAgICAgLy8gcmVzdWx0cyBpcyBub3cgYW4gYXJyYXkgb2YgdGhlIGZpbGUgc2l6ZSBpbiBieXRlcyBmb3IgZWFjaCBmaWxlLCBlLmcuXG4gICAgICogICAgIC8vIFsgMTAwMCwgMjAwMCwgMzAwMF1cbiAgICAgKiB9KS5jYXRjaCggZXJyID0+IHtcbiAgICAgKiAgICAgY29uc29sZS5sb2coZXJyKTtcbiAgICAgKiB9KTtcbiAgICAgKlxuICAgICAqIC8vIEVycm9yIEhhbmRsaW5nXG4gICAgICogYXN5bmMubWFwKHdpdGhNaXNzaW5nRmlsZUxpc3QsIGdldEZpbGVTaXplSW5CeXRlcylcbiAgICAgKiAudGhlbiggcmVzdWx0cyA9PiB7XG4gICAgICogICAgIGNvbnNvbGUubG9nKHJlc3VsdHMpO1xuICAgICAqIH0pLmNhdGNoKCBlcnIgPT4ge1xuICAgICAqICAgICBjb25zb2xlLmxvZyhlcnIpO1xuICAgICAqICAgICAvLyBbIEVycm9yOiBFTk9FTlQ6IG5vIHN1Y2ggZmlsZSBvciBkaXJlY3RvcnkgXVxuICAgICAqIH0pO1xuICAgICAqXG4gICAgICogLy8gVXNpbmcgYXN5bmMvYXdhaXRcbiAgICAgKiBhc3luYyAoKSA9PiB7XG4gICAgICogICAgIHRyeSB7XG4gICAgICogICAgICAgICBsZXQgcmVzdWx0cyA9IGF3YWl0IGFzeW5jLm1hcChmaWxlTGlzdCwgZ2V0RmlsZVNpemVJbkJ5dGVzKTtcbiAgICAgKiAgICAgICAgIGNvbnNvbGUubG9nKHJlc3VsdHMpO1xuICAgICAqICAgICAgICAgLy8gcmVzdWx0cyBpcyBub3cgYW4gYXJyYXkgb2YgdGhlIGZpbGUgc2l6ZSBpbiBieXRlcyBmb3IgZWFjaCBmaWxlLCBlLmcuXG4gICAgICogICAgICAgICAvLyBbIDEwMDAsIDIwMDAsIDMwMDBdXG4gICAgICogICAgIH1cbiAgICAgKiAgICAgY2F0Y2ggKGVycikge1xuICAgICAqICAgICAgICAgY29uc29sZS5sb2coZXJyKTtcbiAgICAgKiAgICAgfVxuICAgICAqIH1cbiAgICAgKlxuICAgICAqIC8vIEVycm9yIEhhbmRsaW5nXG4gICAgICogYXN5bmMgKCkgPT4ge1xuICAgICAqICAgICB0cnkge1xuICAgICAqICAgICAgICAgbGV0IHJlc3VsdHMgPSBhd2FpdCBhc3luYy5tYXAod2l0aE1pc3NpbmdGaWxlTGlzdCwgZ2V0RmlsZVNpemVJbkJ5dGVzKTtcbiAgICAgKiAgICAgICAgIGNvbnNvbGUubG9nKHJlc3VsdHMpO1xuICAgICAqICAgICB9XG4gICAgICogICAgIGNhdGNoIChlcnIpIHtcbiAgICAgKiAgICAgICAgIGNvbnNvbGUubG9nKGVycik7XG4gICAgICogICAgICAgICAvLyBbIEVycm9yOiBFTk9FTlQ6IG5vIHN1Y2ggZmlsZSBvciBkaXJlY3RvcnkgXVxuICAgICAqICAgICB9XG4gICAgICogfVxuICAgICAqXG4gICAgICovXG4gICAgZnVuY3Rpb24gbWFwIChjb2xsLCBpdGVyYXRlZSwgY2FsbGJhY2spIHtcbiAgICAgICAgcmV0dXJuIF9hc3luY01hcChlYWNoT2YkMSwgY29sbCwgaXRlcmF0ZWUsIGNhbGxiYWNrKVxuICAgIH1cbiAgICB2YXIgbWFwJDEgPSBhd2FpdGlmeShtYXAsIDMpO1xuXG4gICAgLyoqXG4gICAgICogQXBwbGllcyB0aGUgcHJvdmlkZWQgYXJndW1lbnRzIHRvIGVhY2ggZnVuY3Rpb24gaW4gdGhlIGFycmF5LCBjYWxsaW5nXG4gICAgICogYGNhbGxiYWNrYCBhZnRlciBhbGwgZnVuY3Rpb25zIGhhdmUgY29tcGxldGVkLiBJZiB5b3Ugb25seSBwcm92aWRlIHRoZSBmaXJzdFxuICAgICAqIGFyZ3VtZW50LCBgZm5zYCwgdGhlbiBpdCB3aWxsIHJldHVybiBhIGZ1bmN0aW9uIHdoaWNoIGxldHMgeW91IHBhc3MgaW4gdGhlXG4gICAgICogYXJndW1lbnRzIGFzIGlmIGl0IHdlcmUgYSBzaW5nbGUgZnVuY3Rpb24gY2FsbC4gSWYgbW9yZSBhcmd1bWVudHMgYXJlXG4gICAgICogcHJvdmlkZWQsIGBjYWxsYmFja2AgaXMgcmVxdWlyZWQgd2hpbGUgYGFyZ3NgIGlzIHN0aWxsIG9wdGlvbmFsLiBUaGUgcmVzdWx0c1xuICAgICAqIGZvciBlYWNoIG9mIHRoZSBhcHBsaWVkIGFzeW5jIGZ1bmN0aW9ucyBhcmUgcGFzc2VkIHRvIHRoZSBmaW5hbCBjYWxsYmFja1xuICAgICAqIGFzIGFuIGFycmF5LlxuICAgICAqXG4gICAgICogQG5hbWUgYXBwbHlFYWNoXG4gICAgICogQHN0YXRpY1xuICAgICAqIEBtZW1iZXJPZiBtb2R1bGU6Q29udHJvbEZsb3dcbiAgICAgKiBAbWV0aG9kXG4gICAgICogQGNhdGVnb3J5IENvbnRyb2wgRmxvd1xuICAgICAqIEBwYXJhbSB7QXJyYXl8SXRlcmFibGV8QXN5bmNJdGVyYWJsZXxPYmplY3R9IGZucyAtIEEgY29sbGVjdGlvbiBvZiB7QGxpbmsgQXN5bmNGdW5jdGlvbn1zXG4gICAgICogdG8gYWxsIGNhbGwgd2l0aCB0aGUgc2FtZSBhcmd1bWVudHNcbiAgICAgKiBAcGFyYW0gey4uLip9IFthcmdzXSAtIGFueSBudW1iZXIgb2Ygc2VwYXJhdGUgYXJndW1lbnRzIHRvIHBhc3MgdG8gdGhlXG4gICAgICogZnVuY3Rpb24uXG4gICAgICogQHBhcmFtIHtGdW5jdGlvbn0gW2NhbGxiYWNrXSAtIHRoZSBmaW5hbCBhcmd1bWVudCBzaG91bGQgYmUgdGhlIGNhbGxiYWNrLFxuICAgICAqIGNhbGxlZCB3aGVuIGFsbCBmdW5jdGlvbnMgaGF2ZSBjb21wbGV0ZWQgcHJvY2Vzc2luZy5cbiAgICAgKiBAcmV0dXJucyB7QXN5bmNGdW5jdGlvbn0gLSBSZXR1cm5zIGEgZnVuY3Rpb24gdGhhdCB0YWtlcyBubyBhcmdzIG90aGVyIHRoYW5cbiAgICAgKiBhbiBvcHRpb25hbCBjYWxsYmFjaywgdGhhdCBpcyB0aGUgcmVzdWx0IG9mIGFwcGx5aW5nIHRoZSBgYXJnc2AgdG8gZWFjaFxuICAgICAqIG9mIHRoZSBmdW5jdGlvbnMuXG4gICAgICogQGV4YW1wbGVcbiAgICAgKlxuICAgICAqIGNvbnN0IGFwcGxpZWRGbiA9IGFzeW5jLmFwcGx5RWFjaChbZW5hYmxlU2VhcmNoLCB1cGRhdGVTY2hlbWFdLCAnYnVja2V0JylcbiAgICAgKlxuICAgICAqIGFwcGxpZWRGbigoZXJyLCByZXN1bHRzKSA9PiB7XG4gICAgICogICAgIC8vIHJlc3VsdHNbMF0gaXMgdGhlIHJlc3VsdHMgZm9yIGBlbmFibGVTZWFyY2hgXG4gICAgICogICAgIC8vIHJlc3VsdHNbMV0gaXMgdGhlIHJlc3VsdHMgZm9yIGB1cGRhdGVTY2hlbWFgXG4gICAgICogfSk7XG4gICAgICpcbiAgICAgKiAvLyBwYXJ0aWFsIGFwcGxpY2F0aW9uIGV4YW1wbGU6XG4gICAgICogYXN5bmMuZWFjaChcbiAgICAgKiAgICAgYnVja2V0cyxcbiAgICAgKiAgICAgYXN5bmMgKGJ1Y2tldCkgPT4gYXN5bmMuYXBwbHlFYWNoKFtlbmFibGVTZWFyY2gsIHVwZGF0ZVNjaGVtYV0sIGJ1Y2tldCkoKSxcbiAgICAgKiAgICAgY2FsbGJhY2tcbiAgICAgKiApO1xuICAgICAqL1xuICAgIHZhciBhcHBseUVhY2ggPSBhcHBseUVhY2gkMShtYXAkMSk7XG5cbiAgICAvKipcbiAgICAgKiBUaGUgc2FtZSBhcyBbYGVhY2hPZmBde0BsaW5rIG1vZHVsZTpDb2xsZWN0aW9ucy5lYWNoT2Z9IGJ1dCBydW5zIG9ubHkgYSBzaW5nbGUgYXN5bmMgb3BlcmF0aW9uIGF0IGEgdGltZS5cbiAgICAgKlxuICAgICAqIEBuYW1lIGVhY2hPZlNlcmllc1xuICAgICAqIEBzdGF0aWNcbiAgICAgKiBAbWVtYmVyT2YgbW9kdWxlOkNvbGxlY3Rpb25zXG4gICAgICogQG1ldGhvZFxuICAgICAqIEBzZWUgW2FzeW5jLmVhY2hPZl17QGxpbmsgbW9kdWxlOkNvbGxlY3Rpb25zLmVhY2hPZn1cbiAgICAgKiBAYWxpYXMgZm9yRWFjaE9mU2VyaWVzXG4gICAgICogQGNhdGVnb3J5IENvbGxlY3Rpb25cbiAgICAgKiBAcGFyYW0ge0FycmF5fEl0ZXJhYmxlfEFzeW5jSXRlcmFibGV8T2JqZWN0fSBjb2xsIC0gQSBjb2xsZWN0aW9uIHRvIGl0ZXJhdGUgb3Zlci5cbiAgICAgKiBAcGFyYW0ge0FzeW5jRnVuY3Rpb259IGl0ZXJhdGVlIC0gQW4gYXN5bmMgZnVuY3Rpb24gdG8gYXBwbHkgdG8gZWFjaCBpdGVtIGluXG4gICAgICogYGNvbGxgLlxuICAgICAqIEludm9rZWQgd2l0aCAoaXRlbSwga2V5LCBjYWxsYmFjaykuXG4gICAgICogQHBhcmFtIHtGdW5jdGlvbn0gW2NhbGxiYWNrXSAtIEEgY2FsbGJhY2sgd2hpY2ggaXMgY2FsbGVkIHdoZW4gYWxsIGBpdGVyYXRlZWBcbiAgICAgKiBmdW5jdGlvbnMgaGF2ZSBmaW5pc2hlZCwgb3IgYW4gZXJyb3Igb2NjdXJzLiBJbnZva2VkIHdpdGggKGVycikuXG4gICAgICogQHJldHVybnMge1Byb21pc2V9IGEgcHJvbWlzZSwgaWYgYSBjYWxsYmFjayBpcyBvbWl0dGVkXG4gICAgICovXG4gICAgZnVuY3Rpb24gZWFjaE9mU2VyaWVzKGNvbGwsIGl0ZXJhdGVlLCBjYWxsYmFjaykge1xuICAgICAgICByZXR1cm4gZWFjaE9mTGltaXQkMShjb2xsLCAxLCBpdGVyYXRlZSwgY2FsbGJhY2spXG4gICAgfVxuICAgIHZhciBlYWNoT2ZTZXJpZXMkMSA9IGF3YWl0aWZ5KGVhY2hPZlNlcmllcywgMyk7XG5cbiAgICAvKipcbiAgICAgKiBUaGUgc2FtZSBhcyBbYG1hcGBde0BsaW5rIG1vZHVsZTpDb2xsZWN0aW9ucy5tYXB9IGJ1dCBydW5zIG9ubHkgYSBzaW5nbGUgYXN5bmMgb3BlcmF0aW9uIGF0IGEgdGltZS5cbiAgICAgKlxuICAgICAqIEBuYW1lIG1hcFNlcmllc1xuICAgICAqIEBzdGF0aWNcbiAgICAgKiBAbWVtYmVyT2YgbW9kdWxlOkNvbGxlY3Rpb25zXG4gICAgICogQG1ldGhvZFxuICAgICAqIEBzZWUgW2FzeW5jLm1hcF17QGxpbmsgbW9kdWxlOkNvbGxlY3Rpb25zLm1hcH1cbiAgICAgKiBAY2F0ZWdvcnkgQ29sbGVjdGlvblxuICAgICAqIEBwYXJhbSB7QXJyYXl8SXRlcmFibGV8QXN5bmNJdGVyYWJsZXxPYmplY3R9IGNvbGwgLSBBIGNvbGxlY3Rpb24gdG8gaXRlcmF0ZSBvdmVyLlxuICAgICAqIEBwYXJhbSB7QXN5bmNGdW5jdGlvbn0gaXRlcmF0ZWUgLSBBbiBhc3luYyBmdW5jdGlvbiB0byBhcHBseSB0byBlYWNoIGl0ZW0gaW5cbiAgICAgKiBgY29sbGAuXG4gICAgICogVGhlIGl0ZXJhdGVlIHNob3VsZCBjb21wbGV0ZSB3aXRoIHRoZSB0cmFuc2Zvcm1lZCBpdGVtLlxuICAgICAqIEludm9rZWQgd2l0aCAoaXRlbSwgY2FsbGJhY2spLlxuICAgICAqIEBwYXJhbSB7RnVuY3Rpb259IFtjYWxsYmFja10gLSBBIGNhbGxiYWNrIHdoaWNoIGlzIGNhbGxlZCB3aGVuIGFsbCBgaXRlcmF0ZWVgXG4gICAgICogZnVuY3Rpb25zIGhhdmUgZmluaXNoZWQsIG9yIGFuIGVycm9yIG9jY3Vycy4gUmVzdWx0cyBpcyBhbiBhcnJheSBvZiB0aGVcbiAgICAgKiB0cmFuc2Zvcm1lZCBpdGVtcyBmcm9tIHRoZSBgY29sbGAuIEludm9rZWQgd2l0aCAoZXJyLCByZXN1bHRzKS5cbiAgICAgKiBAcmV0dXJucyB7UHJvbWlzZX0gYSBwcm9taXNlLCBpZiBubyBjYWxsYmFjayBpcyBwYXNzZWRcbiAgICAgKi9cbiAgICBmdW5jdGlvbiBtYXBTZXJpZXMgKGNvbGwsIGl0ZXJhdGVlLCBjYWxsYmFjaykge1xuICAgICAgICByZXR1cm4gX2FzeW5jTWFwKGVhY2hPZlNlcmllcyQxLCBjb2xsLCBpdGVyYXRlZSwgY2FsbGJhY2spXG4gICAgfVxuICAgIHZhciBtYXBTZXJpZXMkMSA9IGF3YWl0aWZ5KG1hcFNlcmllcywgMyk7XG5cbiAgICAvKipcbiAgICAgKiBUaGUgc2FtZSBhcyBbYGFwcGx5RWFjaGBde0BsaW5rIG1vZHVsZTpDb250cm9sRmxvdy5hcHBseUVhY2h9IGJ1dCBydW5zIG9ubHkgYSBzaW5nbGUgYXN5bmMgb3BlcmF0aW9uIGF0IGEgdGltZS5cbiAgICAgKlxuICAgICAqIEBuYW1lIGFwcGx5RWFjaFNlcmllc1xuICAgICAqIEBzdGF0aWNcbiAgICAgKiBAbWVtYmVyT2YgbW9kdWxlOkNvbnRyb2xGbG93XG4gICAgICogQG1ldGhvZFxuICAgICAqIEBzZWUgW2FzeW5jLmFwcGx5RWFjaF17QGxpbmsgbW9kdWxlOkNvbnRyb2xGbG93LmFwcGx5RWFjaH1cbiAgICAgKiBAY2F0ZWdvcnkgQ29udHJvbCBGbG93XG4gICAgICogQHBhcmFtIHtBcnJheXxJdGVyYWJsZXxBc3luY0l0ZXJhYmxlfE9iamVjdH0gZm5zIC0gQSBjb2xsZWN0aW9uIG9mIHtAbGluayBBc3luY0Z1bmN0aW9ufXMgdG8gYWxsXG4gICAgICogY2FsbCB3aXRoIHRoZSBzYW1lIGFyZ3VtZW50c1xuICAgICAqIEBwYXJhbSB7Li4uKn0gW2FyZ3NdIC0gYW55IG51bWJlciBvZiBzZXBhcmF0ZSBhcmd1bWVudHMgdG8gcGFzcyB0byB0aGVcbiAgICAgKiBmdW5jdGlvbi5cbiAgICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBbY2FsbGJhY2tdIC0gdGhlIGZpbmFsIGFyZ3VtZW50IHNob3VsZCBiZSB0aGUgY2FsbGJhY2ssXG4gICAgICogY2FsbGVkIHdoZW4gYWxsIGZ1bmN0aW9ucyBoYXZlIGNvbXBsZXRlZCBwcm9jZXNzaW5nLlxuICAgICAqIEByZXR1cm5zIHtBc3luY0Z1bmN0aW9ufSAtIEEgZnVuY3Rpb24sIHRoYXQgd2hlbiBjYWxsZWQsIGlzIHRoZSByZXN1bHQgb2ZcbiAgICAgKiBhcHBsaW5nIHRoZSBgYXJnc2AgdG8gdGhlIGxpc3Qgb2YgZnVuY3Rpb25zLiAgSXQgdGFrZXMgbm8gYXJncywgb3RoZXIgdGhhblxuICAgICAqIGEgY2FsbGJhY2suXG4gICAgICovXG4gICAgdmFyIGFwcGx5RWFjaFNlcmllcyA9IGFwcGx5RWFjaCQxKG1hcFNlcmllcyQxKTtcblxuICAgIGNvbnN0IFBST01JU0VfU1lNQk9MID0gU3ltYm9sKCdwcm9taXNlQ2FsbGJhY2snKTtcblxuICAgIGZ1bmN0aW9uIHByb21pc2VDYWxsYmFjayAoKSB7XG4gICAgICAgIGxldCByZXNvbHZlLCByZWplY3Q7XG4gICAgICAgIGZ1bmN0aW9uIGNhbGxiYWNrIChlcnIsIC4uLmFyZ3MpIHtcbiAgICAgICAgICAgIGlmIChlcnIpIHJldHVybiByZWplY3QoZXJyKVxuICAgICAgICAgICAgcmVzb2x2ZShhcmdzLmxlbmd0aCA+IDEgPyBhcmdzIDogYXJnc1swXSk7XG4gICAgICAgIH1cblxuICAgICAgICBjYWxsYmFja1tQUk9NSVNFX1NZTUJPTF0gPSBuZXcgUHJvbWlzZSgocmVzLCByZWopID0+IHtcbiAgICAgICAgICAgIHJlc29sdmUgPSByZXMsXG4gICAgICAgICAgICByZWplY3QgPSByZWo7XG4gICAgICAgIH0pO1xuXG4gICAgICAgIHJldHVybiBjYWxsYmFja1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIERldGVybWluZXMgdGhlIGJlc3Qgb3JkZXIgZm9yIHJ1bm5pbmcgdGhlIHtAbGluayBBc3luY0Z1bmN0aW9ufXMgaW4gYHRhc2tzYCwgYmFzZWQgb25cbiAgICAgKiB0aGVpciByZXF1aXJlbWVudHMuIEVhY2ggZnVuY3Rpb24gY2FuIG9wdGlvbmFsbHkgZGVwZW5kIG9uIG90aGVyIGZ1bmN0aW9uc1xuICAgICAqIGJlaW5nIGNvbXBsZXRlZCBmaXJzdCwgYW5kIGVhY2ggZnVuY3Rpb24gaXMgcnVuIGFzIHNvb24gYXMgaXRzIHJlcXVpcmVtZW50c1xuICAgICAqIGFyZSBzYXRpc2ZpZWQuXG4gICAgICpcbiAgICAgKiBJZiBhbnkgb2YgdGhlIHtAbGluayBBc3luY0Z1bmN0aW9ufXMgcGFzcyBhbiBlcnJvciB0byB0aGVpciBjYWxsYmFjaywgdGhlIGBhdXRvYCBzZXF1ZW5jZVxuICAgICAqIHdpbGwgc3RvcC4gRnVydGhlciB0YXNrcyB3aWxsIG5vdCBleGVjdXRlIChzbyBhbnkgb3RoZXIgZnVuY3Rpb25zIGRlcGVuZGluZ1xuICAgICAqIG9uIGl0IHdpbGwgbm90IHJ1biksIGFuZCB0aGUgbWFpbiBgY2FsbGJhY2tgIGlzIGltbWVkaWF0ZWx5IGNhbGxlZCB3aXRoIHRoZVxuICAgICAqIGVycm9yLlxuICAgICAqXG4gICAgICoge0BsaW5rIEFzeW5jRnVuY3Rpb259cyBhbHNvIHJlY2VpdmUgYW4gb2JqZWN0IGNvbnRhaW5pbmcgdGhlIHJlc3VsdHMgb2YgZnVuY3Rpb25zIHdoaWNoXG4gICAgICogaGF2ZSBjb21wbGV0ZWQgc28gZmFyIGFzIHRoZSBmaXJzdCBhcmd1bWVudCwgaWYgdGhleSBoYXZlIGRlcGVuZGVuY2llcy4gSWYgYVxuICAgICAqIHRhc2sgZnVuY3Rpb24gaGFzIG5vIGRlcGVuZGVuY2llcywgaXQgd2lsbCBvbmx5IGJlIHBhc3NlZCBhIGNhbGxiYWNrLlxuICAgICAqXG4gICAgICogQG5hbWUgYXV0b1xuICAgICAqIEBzdGF0aWNcbiAgICAgKiBAbWVtYmVyT2YgbW9kdWxlOkNvbnRyb2xGbG93XG4gICAgICogQG1ldGhvZFxuICAgICAqIEBjYXRlZ29yeSBDb250cm9sIEZsb3dcbiAgICAgKiBAcGFyYW0ge09iamVjdH0gdGFza3MgLSBBbiBvYmplY3QuIEVhY2ggb2YgaXRzIHByb3BlcnRpZXMgaXMgZWl0aGVyIGFcbiAgICAgKiBmdW5jdGlvbiBvciBhbiBhcnJheSBvZiByZXF1aXJlbWVudHMsIHdpdGggdGhlIHtAbGluayBBc3luY0Z1bmN0aW9ufSBpdHNlbGYgdGhlIGxhc3QgaXRlbVxuICAgICAqIGluIHRoZSBhcnJheS4gVGhlIG9iamVjdCdzIGtleSBvZiBhIHByb3BlcnR5IHNlcnZlcyBhcyB0aGUgbmFtZSBvZiB0aGUgdGFza1xuICAgICAqIGRlZmluZWQgYnkgdGhhdCBwcm9wZXJ0eSwgaS5lLiBjYW4gYmUgdXNlZCB3aGVuIHNwZWNpZnlpbmcgcmVxdWlyZW1lbnRzIGZvclxuICAgICAqIG90aGVyIHRhc2tzLiBUaGUgZnVuY3Rpb24gcmVjZWl2ZXMgb25lIG9yIHR3byBhcmd1bWVudHM6XG4gICAgICogKiBhIGByZXN1bHRzYCBvYmplY3QsIGNvbnRhaW5pbmcgdGhlIHJlc3VsdHMgb2YgdGhlIHByZXZpb3VzbHkgZXhlY3V0ZWRcbiAgICAgKiAgIGZ1bmN0aW9ucywgb25seSBwYXNzZWQgaWYgdGhlIHRhc2sgaGFzIGFueSBkZXBlbmRlbmNpZXMsXG4gICAgICogKiBhIGBjYWxsYmFjayhlcnIsIHJlc3VsdClgIGZ1bmN0aW9uLCB3aGljaCBtdXN0IGJlIGNhbGxlZCB3aGVuIGZpbmlzaGVkLFxuICAgICAqICAgcGFzc2luZyBhbiBgZXJyb3JgICh3aGljaCBjYW4gYmUgYG51bGxgKSBhbmQgdGhlIHJlc3VsdCBvZiB0aGUgZnVuY3Rpb24nc1xuICAgICAqICAgZXhlY3V0aW9uLlxuICAgICAqIEBwYXJhbSB7bnVtYmVyfSBbY29uY3VycmVuY3k9SW5maW5pdHldIC0gQW4gb3B0aW9uYWwgYGludGVnZXJgIGZvclxuICAgICAqIGRldGVybWluaW5nIHRoZSBtYXhpbXVtIG51bWJlciBvZiB0YXNrcyB0aGF0IGNhbiBiZSBydW4gaW4gcGFyYWxsZWwuIEJ5XG4gICAgICogZGVmYXVsdCwgYXMgbWFueSBhcyBwb3NzaWJsZS5cbiAgICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBbY2FsbGJhY2tdIC0gQW4gb3B0aW9uYWwgY2FsbGJhY2sgd2hpY2ggaXMgY2FsbGVkIHdoZW4gYWxsXG4gICAgICogdGhlIHRhc2tzIGhhdmUgYmVlbiBjb21wbGV0ZWQuIEl0IHJlY2VpdmVzIHRoZSBgZXJyYCBhcmd1bWVudCBpZiBhbnkgYHRhc2tzYFxuICAgICAqIHBhc3MgYW4gZXJyb3IgdG8gdGhlaXIgY2FsbGJhY2suIFJlc3VsdHMgYXJlIGFsd2F5cyByZXR1cm5lZDsgaG93ZXZlciwgaWYgYW5cbiAgICAgKiBlcnJvciBvY2N1cnMsIG5vIGZ1cnRoZXIgYHRhc2tzYCB3aWxsIGJlIHBlcmZvcm1lZCwgYW5kIHRoZSByZXN1bHRzIG9iamVjdFxuICAgICAqIHdpbGwgb25seSBjb250YWluIHBhcnRpYWwgcmVzdWx0cy4gSW52b2tlZCB3aXRoIChlcnIsIHJlc3VsdHMpLlxuICAgICAqIEByZXR1cm5zIHtQcm9taXNlfSBhIHByb21pc2UsIGlmIGEgY2FsbGJhY2sgaXMgbm90IHBhc3NlZFxuICAgICAqIEBleGFtcGxlXG4gICAgICpcbiAgICAgKiAvL1VzaW5nIENhbGxiYWNrc1xuICAgICAqIGFzeW5jLmF1dG8oe1xuICAgICAqICAgICBnZXRfZGF0YTogZnVuY3Rpb24oY2FsbGJhY2spIHtcbiAgICAgKiAgICAgICAgIC8vIGFzeW5jIGNvZGUgdG8gZ2V0IHNvbWUgZGF0YVxuICAgICAqICAgICAgICAgY2FsbGJhY2sobnVsbCwgJ2RhdGEnLCAnY29udmVydGVkIHRvIGFycmF5Jyk7XG4gICAgICogICAgIH0sXG4gICAgICogICAgIG1ha2VfZm9sZGVyOiBmdW5jdGlvbihjYWxsYmFjaykge1xuICAgICAqICAgICAgICAgLy8gYXN5bmMgY29kZSB0byBjcmVhdGUgYSBkaXJlY3RvcnkgdG8gc3RvcmUgYSBmaWxlIGluXG4gICAgICogICAgICAgICAvLyB0aGlzIGlzIHJ1biBhdCB0aGUgc2FtZSB0aW1lIGFzIGdldHRpbmcgdGhlIGRhdGFcbiAgICAgKiAgICAgICAgIGNhbGxiYWNrKG51bGwsICdmb2xkZXInKTtcbiAgICAgKiAgICAgfSxcbiAgICAgKiAgICAgd3JpdGVfZmlsZTogWydnZXRfZGF0YScsICdtYWtlX2ZvbGRlcicsIGZ1bmN0aW9uKHJlc3VsdHMsIGNhbGxiYWNrKSB7XG4gICAgICogICAgICAgICAvLyBvbmNlIHRoZXJlIGlzIHNvbWUgZGF0YSBhbmQgdGhlIGRpcmVjdG9yeSBleGlzdHMsXG4gICAgICogICAgICAgICAvLyB3cml0ZSB0aGUgZGF0YSB0byBhIGZpbGUgaW4gdGhlIGRpcmVjdG9yeVxuICAgICAqICAgICAgICAgY2FsbGJhY2sobnVsbCwgJ2ZpbGVuYW1lJyk7XG4gICAgICogICAgIH1dLFxuICAgICAqICAgICBlbWFpbF9saW5rOiBbJ3dyaXRlX2ZpbGUnLCBmdW5jdGlvbihyZXN1bHRzLCBjYWxsYmFjaykge1xuICAgICAqICAgICAgICAgLy8gb25jZSB0aGUgZmlsZSBpcyB3cml0dGVuIGxldCdzIGVtYWlsIGEgbGluayB0byBpdC4uLlxuICAgICAqICAgICAgICAgY2FsbGJhY2sobnVsbCwgeydmaWxlJzpyZXN1bHRzLndyaXRlX2ZpbGUsICdlbWFpbCc6J3VzZXJAZXhhbXBsZS5jb20nfSk7XG4gICAgICogICAgIH1dXG4gICAgICogfSwgZnVuY3Rpb24oZXJyLCByZXN1bHRzKSB7XG4gICAgICogICAgIGlmIChlcnIpIHtcbiAgICAgKiAgICAgICAgIGNvbnNvbGUubG9nKCdlcnIgPSAnLCBlcnIpO1xuICAgICAqICAgICB9XG4gICAgICogICAgIGNvbnNvbGUubG9nKCdyZXN1bHRzID0gJywgcmVzdWx0cyk7XG4gICAgICogICAgIC8vIHJlc3VsdHMgPSB7XG4gICAgICogICAgIC8vICAgICBnZXRfZGF0YTogWydkYXRhJywgJ2NvbnZlcnRlZCB0byBhcnJheSddXG4gICAgICogICAgIC8vICAgICBtYWtlX2ZvbGRlcjsgJ2ZvbGRlcicsXG4gICAgICogICAgIC8vICAgICB3cml0ZV9maWxlOiAnZmlsZW5hbWUnXG4gICAgICogICAgIC8vICAgICBlbWFpbF9saW5rOiB7IGZpbGU6ICdmaWxlbmFtZScsIGVtYWlsOiAndXNlckBleGFtcGxlLmNvbScgfVxuICAgICAqICAgICAvLyB9XG4gICAgICogfSk7XG4gICAgICpcbiAgICAgKiAvL1VzaW5nIFByb21pc2VzXG4gICAgICogYXN5bmMuYXV0byh7XG4gICAgICogICAgIGdldF9kYXRhOiBmdW5jdGlvbihjYWxsYmFjaykge1xuICAgICAqICAgICAgICAgY29uc29sZS5sb2coJ2luIGdldF9kYXRhJyk7XG4gICAgICogICAgICAgICAvLyBhc3luYyBjb2RlIHRvIGdldCBzb21lIGRhdGFcbiAgICAgKiAgICAgICAgIGNhbGxiYWNrKG51bGwsICdkYXRhJywgJ2NvbnZlcnRlZCB0byBhcnJheScpO1xuICAgICAqICAgICB9LFxuICAgICAqICAgICBtYWtlX2ZvbGRlcjogZnVuY3Rpb24oY2FsbGJhY2spIHtcbiAgICAgKiAgICAgICAgIGNvbnNvbGUubG9nKCdpbiBtYWtlX2ZvbGRlcicpO1xuICAgICAqICAgICAgICAgLy8gYXN5bmMgY29kZSB0byBjcmVhdGUgYSBkaXJlY3RvcnkgdG8gc3RvcmUgYSBmaWxlIGluXG4gICAgICogICAgICAgICAvLyB0aGlzIGlzIHJ1biBhdCB0aGUgc2FtZSB0aW1lIGFzIGdldHRpbmcgdGhlIGRhdGFcbiAgICAgKiAgICAgICAgIGNhbGxiYWNrKG51bGwsICdmb2xkZXInKTtcbiAgICAgKiAgICAgfSxcbiAgICAgKiAgICAgd3JpdGVfZmlsZTogWydnZXRfZGF0YScsICdtYWtlX2ZvbGRlcicsIGZ1bmN0aW9uKHJlc3VsdHMsIGNhbGxiYWNrKSB7XG4gICAgICogICAgICAgICAvLyBvbmNlIHRoZXJlIGlzIHNvbWUgZGF0YSBhbmQgdGhlIGRpcmVjdG9yeSBleGlzdHMsXG4gICAgICogICAgICAgICAvLyB3cml0ZSB0aGUgZGF0YSB0byBhIGZpbGUgaW4gdGhlIGRpcmVjdG9yeVxuICAgICAqICAgICAgICAgY2FsbGJhY2sobnVsbCwgJ2ZpbGVuYW1lJyk7XG4gICAgICogICAgIH1dLFxuICAgICAqICAgICBlbWFpbF9saW5rOiBbJ3dyaXRlX2ZpbGUnLCBmdW5jdGlvbihyZXN1bHRzLCBjYWxsYmFjaykge1xuICAgICAqICAgICAgICAgLy8gb25jZSB0aGUgZmlsZSBpcyB3cml0dGVuIGxldCdzIGVtYWlsIGEgbGluayB0byBpdC4uLlxuICAgICAqICAgICAgICAgY2FsbGJhY2sobnVsbCwgeydmaWxlJzpyZXN1bHRzLndyaXRlX2ZpbGUsICdlbWFpbCc6J3VzZXJAZXhhbXBsZS5jb20nfSk7XG4gICAgICogICAgIH1dXG4gICAgICogfSkudGhlbihyZXN1bHRzID0+IHtcbiAgICAgKiAgICAgY29uc29sZS5sb2coJ3Jlc3VsdHMgPSAnLCByZXN1bHRzKTtcbiAgICAgKiAgICAgLy8gcmVzdWx0cyA9IHtcbiAgICAgKiAgICAgLy8gICAgIGdldF9kYXRhOiBbJ2RhdGEnLCAnY29udmVydGVkIHRvIGFycmF5J11cbiAgICAgKiAgICAgLy8gICAgIG1ha2VfZm9sZGVyOyAnZm9sZGVyJyxcbiAgICAgKiAgICAgLy8gICAgIHdyaXRlX2ZpbGU6ICdmaWxlbmFtZSdcbiAgICAgKiAgICAgLy8gICAgIGVtYWlsX2xpbms6IHsgZmlsZTogJ2ZpbGVuYW1lJywgZW1haWw6ICd1c2VyQGV4YW1wbGUuY29tJyB9XG4gICAgICogICAgIC8vIH1cbiAgICAgKiB9KS5jYXRjaChlcnIgPT4ge1xuICAgICAqICAgICBjb25zb2xlLmxvZygnZXJyID0gJywgZXJyKTtcbiAgICAgKiB9KTtcbiAgICAgKlxuICAgICAqIC8vVXNpbmcgYXN5bmMvYXdhaXRcbiAgICAgKiBhc3luYyAoKSA9PiB7XG4gICAgICogICAgIHRyeSB7XG4gICAgICogICAgICAgICBsZXQgcmVzdWx0cyA9IGF3YWl0IGFzeW5jLmF1dG8oe1xuICAgICAqICAgICAgICAgICAgIGdldF9kYXRhOiBmdW5jdGlvbihjYWxsYmFjaykge1xuICAgICAqICAgICAgICAgICAgICAgICAvLyBhc3luYyBjb2RlIHRvIGdldCBzb21lIGRhdGFcbiAgICAgKiAgICAgICAgICAgICAgICAgY2FsbGJhY2sobnVsbCwgJ2RhdGEnLCAnY29udmVydGVkIHRvIGFycmF5Jyk7XG4gICAgICogICAgICAgICAgICAgfSxcbiAgICAgKiAgICAgICAgICAgICBtYWtlX2ZvbGRlcjogZnVuY3Rpb24oY2FsbGJhY2spIHtcbiAgICAgKiAgICAgICAgICAgICAgICAgLy8gYXN5bmMgY29kZSB0byBjcmVhdGUgYSBkaXJlY3RvcnkgdG8gc3RvcmUgYSBmaWxlIGluXG4gICAgICogICAgICAgICAgICAgICAgIC8vIHRoaXMgaXMgcnVuIGF0IHRoZSBzYW1lIHRpbWUgYXMgZ2V0dGluZyB0aGUgZGF0YVxuICAgICAqICAgICAgICAgICAgICAgICBjYWxsYmFjayhudWxsLCAnZm9sZGVyJyk7XG4gICAgICogICAgICAgICAgICAgfSxcbiAgICAgKiAgICAgICAgICAgICB3cml0ZV9maWxlOiBbJ2dldF9kYXRhJywgJ21ha2VfZm9sZGVyJywgZnVuY3Rpb24ocmVzdWx0cywgY2FsbGJhY2spIHtcbiAgICAgKiAgICAgICAgICAgICAgICAgLy8gb25jZSB0aGVyZSBpcyBzb21lIGRhdGEgYW5kIHRoZSBkaXJlY3RvcnkgZXhpc3RzLFxuICAgICAqICAgICAgICAgICAgICAgICAvLyB3cml0ZSB0aGUgZGF0YSB0byBhIGZpbGUgaW4gdGhlIGRpcmVjdG9yeVxuICAgICAqICAgICAgICAgICAgICAgICBjYWxsYmFjayhudWxsLCAnZmlsZW5hbWUnKTtcbiAgICAgKiAgICAgICAgICAgICB9XSxcbiAgICAgKiAgICAgICAgICAgICBlbWFpbF9saW5rOiBbJ3dyaXRlX2ZpbGUnLCBmdW5jdGlvbihyZXN1bHRzLCBjYWxsYmFjaykge1xuICAgICAqICAgICAgICAgICAgICAgICAvLyBvbmNlIHRoZSBmaWxlIGlzIHdyaXR0ZW4gbGV0J3MgZW1haWwgYSBsaW5rIHRvIGl0Li4uXG4gICAgICogICAgICAgICAgICAgICAgIGNhbGxiYWNrKG51bGwsIHsnZmlsZSc6cmVzdWx0cy53cml0ZV9maWxlLCAnZW1haWwnOid1c2VyQGV4YW1wbGUuY29tJ30pO1xuICAgICAqICAgICAgICAgICAgIH1dXG4gICAgICogICAgICAgICB9KTtcbiAgICAgKiAgICAgICAgIGNvbnNvbGUubG9nKCdyZXN1bHRzID0gJywgcmVzdWx0cyk7XG4gICAgICogICAgICAgICAvLyByZXN1bHRzID0ge1xuICAgICAqICAgICAgICAgLy8gICAgIGdldF9kYXRhOiBbJ2RhdGEnLCAnY29udmVydGVkIHRvIGFycmF5J11cbiAgICAgKiAgICAgICAgIC8vICAgICBtYWtlX2ZvbGRlcjsgJ2ZvbGRlcicsXG4gICAgICogICAgICAgICAvLyAgICAgd3JpdGVfZmlsZTogJ2ZpbGVuYW1lJ1xuICAgICAqICAgICAgICAgLy8gICAgIGVtYWlsX2xpbms6IHsgZmlsZTogJ2ZpbGVuYW1lJywgZW1haWw6ICd1c2VyQGV4YW1wbGUuY29tJyB9XG4gICAgICogICAgICAgICAvLyB9XG4gICAgICogICAgIH1cbiAgICAgKiAgICAgY2F0Y2ggKGVycikge1xuICAgICAqICAgICAgICAgY29uc29sZS5sb2coZXJyKTtcbiAgICAgKiAgICAgfVxuICAgICAqIH1cbiAgICAgKlxuICAgICAqL1xuICAgIGZ1bmN0aW9uIGF1dG8odGFza3MsIGNvbmN1cnJlbmN5LCBjYWxsYmFjaykge1xuICAgICAgICBpZiAodHlwZW9mIGNvbmN1cnJlbmN5ICE9PSAnbnVtYmVyJykge1xuICAgICAgICAgICAgLy8gY29uY3VycmVuY3kgaXMgb3B0aW9uYWwsIHNoaWZ0IHRoZSBhcmdzLlxuICAgICAgICAgICAgY2FsbGJhY2sgPSBjb25jdXJyZW5jeTtcbiAgICAgICAgICAgIGNvbmN1cnJlbmN5ID0gbnVsbDtcbiAgICAgICAgfVxuICAgICAgICBjYWxsYmFjayA9IG9uY2UoY2FsbGJhY2sgfHwgcHJvbWlzZUNhbGxiYWNrKCkpO1xuICAgICAgICB2YXIgbnVtVGFza3MgPSBPYmplY3Qua2V5cyh0YXNrcykubGVuZ3RoO1xuICAgICAgICBpZiAoIW51bVRhc2tzKSB7XG4gICAgICAgICAgICByZXR1cm4gY2FsbGJhY2sobnVsbCk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKCFjb25jdXJyZW5jeSkge1xuICAgICAgICAgICAgY29uY3VycmVuY3kgPSBudW1UYXNrcztcbiAgICAgICAgfVxuXG4gICAgICAgIHZhciByZXN1bHRzID0ge307XG4gICAgICAgIHZhciBydW5uaW5nVGFza3MgPSAwO1xuICAgICAgICB2YXIgY2FuY2VsZWQgPSBmYWxzZTtcbiAgICAgICAgdmFyIGhhc0Vycm9yID0gZmFsc2U7XG5cbiAgICAgICAgdmFyIGxpc3RlbmVycyA9IE9iamVjdC5jcmVhdGUobnVsbCk7XG5cbiAgICAgICAgdmFyIHJlYWR5VGFza3MgPSBbXTtcblxuICAgICAgICAvLyBmb3IgY3ljbGUgZGV0ZWN0aW9uOlxuICAgICAgICB2YXIgcmVhZHlUb0NoZWNrID0gW107IC8vIHRhc2tzIHRoYXQgaGF2ZSBiZWVuIGlkZW50aWZpZWQgYXMgcmVhY2hhYmxlXG4gICAgICAgIC8vIHdpdGhvdXQgdGhlIHBvc3NpYmlsaXR5IG9mIHJldHVybmluZyB0byBhbiBhbmNlc3RvciB0YXNrXG4gICAgICAgIHZhciB1bmNoZWNrZWREZXBlbmRlbmNpZXMgPSB7fTtcblxuICAgICAgICBPYmplY3Qua2V5cyh0YXNrcykuZm9yRWFjaChrZXkgPT4ge1xuICAgICAgICAgICAgdmFyIHRhc2sgPSB0YXNrc1trZXldO1xuICAgICAgICAgICAgaWYgKCFBcnJheS5pc0FycmF5KHRhc2spKSB7XG4gICAgICAgICAgICAgICAgLy8gbm8gZGVwZW5kZW5jaWVzXG4gICAgICAgICAgICAgICAgZW5xdWV1ZVRhc2soa2V5LCBbdGFza10pO1xuICAgICAgICAgICAgICAgIHJlYWR5VG9DaGVjay5wdXNoKGtleSk7XG4gICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICB2YXIgZGVwZW5kZW5jaWVzID0gdGFzay5zbGljZSgwLCB0YXNrLmxlbmd0aCAtIDEpO1xuICAgICAgICAgICAgdmFyIHJlbWFpbmluZ0RlcGVuZGVuY2llcyA9IGRlcGVuZGVuY2llcy5sZW5ndGg7XG4gICAgICAgICAgICBpZiAocmVtYWluaW5nRGVwZW5kZW5jaWVzID09PSAwKSB7XG4gICAgICAgICAgICAgICAgZW5xdWV1ZVRhc2soa2V5LCB0YXNrKTtcbiAgICAgICAgICAgICAgICByZWFkeVRvQ2hlY2sucHVzaChrZXkpO1xuICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHVuY2hlY2tlZERlcGVuZGVuY2llc1trZXldID0gcmVtYWluaW5nRGVwZW5kZW5jaWVzO1xuXG4gICAgICAgICAgICBkZXBlbmRlbmNpZXMuZm9yRWFjaChkZXBlbmRlbmN5TmFtZSA9PiB7XG4gICAgICAgICAgICAgICAgaWYgKCF0YXNrc1tkZXBlbmRlbmN5TmFtZV0pIHtcbiAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdhc3luYy5hdXRvIHRhc2sgYCcgKyBrZXkgK1xuICAgICAgICAgICAgICAgICAgICAgICAgJ2AgaGFzIGEgbm9uLWV4aXN0ZW50IGRlcGVuZGVuY3kgYCcgK1xuICAgICAgICAgICAgICAgICAgICAgICAgZGVwZW5kZW5jeU5hbWUgKyAnYCBpbiAnICtcbiAgICAgICAgICAgICAgICAgICAgICAgIGRlcGVuZGVuY2llcy5qb2luKCcsICcpKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgYWRkTGlzdGVuZXIoZGVwZW5kZW5jeU5hbWUsICgpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgcmVtYWluaW5nRGVwZW5kZW5jaWVzLS07XG4gICAgICAgICAgICAgICAgICAgIGlmIChyZW1haW5pbmdEZXBlbmRlbmNpZXMgPT09IDApIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGVucXVldWVUYXNrKGtleSwgdGFzayk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9KTtcblxuICAgICAgICBjaGVja0ZvckRlYWRsb2NrcygpO1xuICAgICAgICBwcm9jZXNzUXVldWUoKTtcblxuICAgICAgICBmdW5jdGlvbiBlbnF1ZXVlVGFzayhrZXksIHRhc2spIHtcbiAgICAgICAgICAgIHJlYWR5VGFza3MucHVzaCgoKSA9PiBydW5UYXNrKGtleSwgdGFzaykpO1xuICAgICAgICB9XG5cbiAgICAgICAgZnVuY3Rpb24gcHJvY2Vzc1F1ZXVlKCkge1xuICAgICAgICAgICAgaWYgKGNhbmNlbGVkKSByZXR1cm5cbiAgICAgICAgICAgIGlmIChyZWFkeVRhc2tzLmxlbmd0aCA9PT0gMCAmJiBydW5uaW5nVGFza3MgPT09IDApIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gY2FsbGJhY2sobnVsbCwgcmVzdWx0cyk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICB3aGlsZShyZWFkeVRhc2tzLmxlbmd0aCAmJiBydW5uaW5nVGFza3MgPCBjb25jdXJyZW5jeSkge1xuICAgICAgICAgICAgICAgIHZhciBydW4gPSByZWFkeVRhc2tzLnNoaWZ0KCk7XG4gICAgICAgICAgICAgICAgcnVuKCk7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgfVxuXG4gICAgICAgIGZ1bmN0aW9uIGFkZExpc3RlbmVyKHRhc2tOYW1lLCBmbikge1xuICAgICAgICAgICAgdmFyIHRhc2tMaXN0ZW5lcnMgPSBsaXN0ZW5lcnNbdGFza05hbWVdO1xuICAgICAgICAgICAgaWYgKCF0YXNrTGlzdGVuZXJzKSB7XG4gICAgICAgICAgICAgICAgdGFza0xpc3RlbmVycyA9IGxpc3RlbmVyc1t0YXNrTmFtZV0gPSBbXTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgdGFza0xpc3RlbmVycy5wdXNoKGZuKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGZ1bmN0aW9uIHRhc2tDb21wbGV0ZSh0YXNrTmFtZSkge1xuICAgICAgICAgICAgdmFyIHRhc2tMaXN0ZW5lcnMgPSBsaXN0ZW5lcnNbdGFza05hbWVdIHx8IFtdO1xuICAgICAgICAgICAgdGFza0xpc3RlbmVycy5mb3JFYWNoKGZuID0+IGZuKCkpO1xuICAgICAgICAgICAgcHJvY2Vzc1F1ZXVlKCk7XG4gICAgICAgIH1cblxuXG4gICAgICAgIGZ1bmN0aW9uIHJ1blRhc2soa2V5LCB0YXNrKSB7XG4gICAgICAgICAgICBpZiAoaGFzRXJyb3IpIHJldHVybjtcblxuICAgICAgICAgICAgdmFyIHRhc2tDYWxsYmFjayA9IG9ubHlPbmNlKChlcnIsIC4uLnJlc3VsdCkgPT4ge1xuICAgICAgICAgICAgICAgIHJ1bm5pbmdUYXNrcy0tO1xuICAgICAgICAgICAgICAgIGlmIChlcnIgPT09IGZhbHNlKSB7XG4gICAgICAgICAgICAgICAgICAgIGNhbmNlbGVkID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuXG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGlmIChyZXN1bHQubGVuZ3RoIDwgMikge1xuICAgICAgICAgICAgICAgICAgICBbcmVzdWx0XSA9IHJlc3VsdDtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgaWYgKGVycikge1xuICAgICAgICAgICAgICAgICAgICB2YXIgc2FmZVJlc3VsdHMgPSB7fTtcbiAgICAgICAgICAgICAgICAgICAgT2JqZWN0LmtleXMocmVzdWx0cykuZm9yRWFjaChya2V5ID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHNhZmVSZXN1bHRzW3JrZXldID0gcmVzdWx0c1tya2V5XTtcbiAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgICAgIHNhZmVSZXN1bHRzW2tleV0gPSByZXN1bHQ7XG4gICAgICAgICAgICAgICAgICAgIGhhc0Vycm9yID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICAgICAgbGlzdGVuZXJzID0gT2JqZWN0LmNyZWF0ZShudWxsKTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKGNhbmNlbGVkKSByZXR1cm5cbiAgICAgICAgICAgICAgICAgICAgY2FsbGJhY2soZXJyLCBzYWZlUmVzdWx0cyk7XG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgcmVzdWx0c1trZXldID0gcmVzdWx0O1xuICAgICAgICAgICAgICAgICAgICB0YXNrQ29tcGxldGUoa2V5KTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9KTtcblxuICAgICAgICAgICAgcnVubmluZ1Rhc2tzKys7XG4gICAgICAgICAgICB2YXIgdGFza0ZuID0gd3JhcEFzeW5jKHRhc2tbdGFzay5sZW5ndGggLSAxXSk7XG4gICAgICAgICAgICBpZiAodGFzay5sZW5ndGggPiAxKSB7XG4gICAgICAgICAgICAgICAgdGFza0ZuKHJlc3VsdHMsIHRhc2tDYWxsYmFjayk7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIHRhc2tGbih0YXNrQ2FsbGJhY2spO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgZnVuY3Rpb24gY2hlY2tGb3JEZWFkbG9ja3MoKSB7XG4gICAgICAgICAgICAvLyBLYWhuJ3MgYWxnb3JpdGhtXG4gICAgICAgICAgICAvLyBodHRwczovL2VuLndpa2lwZWRpYS5vcmcvd2lraS9Ub3BvbG9naWNhbF9zb3J0aW5nI0thaG4uMjdzX2FsZ29yaXRobVxuICAgICAgICAgICAgLy8gaHR0cDovL2Nvbm5hbGxlLmJsb2dzcG90LmNvbS8yMDEzLzEwL3RvcG9sb2dpY2FsLXNvcnRpbmdrYWhuLWFsZ29yaXRobS5odG1sXG4gICAgICAgICAgICB2YXIgY3VycmVudFRhc2s7XG4gICAgICAgICAgICB2YXIgY291bnRlciA9IDA7XG4gICAgICAgICAgICB3aGlsZSAocmVhZHlUb0NoZWNrLmxlbmd0aCkge1xuICAgICAgICAgICAgICAgIGN1cnJlbnRUYXNrID0gcmVhZHlUb0NoZWNrLnBvcCgpO1xuICAgICAgICAgICAgICAgIGNvdW50ZXIrKztcbiAgICAgICAgICAgICAgICBnZXREZXBlbmRlbnRzKGN1cnJlbnRUYXNrKS5mb3JFYWNoKGRlcGVuZGVudCA9PiB7XG4gICAgICAgICAgICAgICAgICAgIGlmICgtLXVuY2hlY2tlZERlcGVuZGVuY2llc1tkZXBlbmRlbnRdID09PSAwKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICByZWFkeVRvQ2hlY2sucHVzaChkZXBlbmRlbnQpO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGlmIChjb3VudGVyICE9PSBudW1UYXNrcykge1xuICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICAgICAgICAgICAgICAgJ2FzeW5jLmF1dG8gY2Fubm90IGV4ZWN1dGUgdGFza3MgZHVlIHRvIGEgcmVjdXJzaXZlIGRlcGVuZGVuY3knXG4gICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIGZ1bmN0aW9uIGdldERlcGVuZGVudHModGFza05hbWUpIHtcbiAgICAgICAgICAgIHZhciByZXN1bHQgPSBbXTtcbiAgICAgICAgICAgIE9iamVjdC5rZXlzKHRhc2tzKS5mb3JFYWNoKGtleSA9PiB7XG4gICAgICAgICAgICAgICAgY29uc3QgdGFzayA9IHRhc2tzW2tleV07XG4gICAgICAgICAgICAgICAgaWYgKEFycmF5LmlzQXJyYXkodGFzaykgJiYgdGFzay5pbmRleE9mKHRhc2tOYW1lKSA+PSAwKSB7XG4gICAgICAgICAgICAgICAgICAgIHJlc3VsdC5wdXNoKGtleSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICByZXR1cm4gcmVzdWx0O1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIGNhbGxiYWNrW1BST01JU0VfU1lNQk9MXVxuICAgIH1cblxuICAgIHZhciBGTl9BUkdTID0gL14oPzphc3luY1xccyk/KD86ZnVuY3Rpb24pP1xccyooPzpcXHcrXFxzKik/XFwoKFteKV0rKVxcKSg/Olxccyp7KS87XG4gICAgdmFyIEFSUk9XX0ZOX0FSR1MgPSAvXig/OmFzeW5jXFxzKT9cXHMqKD86XFwoXFxzKik/KCg/OlteKT1cXHNdXFxzKikqKSg/OlxcKVxccyopPz0+LztcbiAgICB2YXIgRk5fQVJHX1NQTElUID0gLywvO1xuICAgIHZhciBGTl9BUkcgPSAvKD0uKyk/KFxccyopJC87XG5cbiAgICBmdW5jdGlvbiBzdHJpcENvbW1lbnRzKHN0cmluZykge1xuICAgICAgICBsZXQgc3RyaXBwZWQgPSAnJztcbiAgICAgICAgbGV0IGluZGV4ID0gMDtcbiAgICAgICAgbGV0IGVuZEJsb2NrQ29tbWVudCA9IHN0cmluZy5pbmRleE9mKCcqLycpO1xuICAgICAgICB3aGlsZSAoaW5kZXggPCBzdHJpbmcubGVuZ3RoKSB7XG4gICAgICAgICAgICBpZiAoc3RyaW5nW2luZGV4XSA9PT0gJy8nICYmIHN0cmluZ1tpbmRleCsxXSA9PT0gJy8nKSB7XG4gICAgICAgICAgICAgICAgLy8gaW5saW5lIGNvbW1lbnRcbiAgICAgICAgICAgICAgICBsZXQgZW5kSW5kZXggPSBzdHJpbmcuaW5kZXhPZignXFxuJywgaW5kZXgpO1xuICAgICAgICAgICAgICAgIGluZGV4ID0gKGVuZEluZGV4ID09PSAtMSkgPyBzdHJpbmcubGVuZ3RoIDogZW5kSW5kZXg7XG4gICAgICAgICAgICB9IGVsc2UgaWYgKChlbmRCbG9ja0NvbW1lbnQgIT09IC0xKSAmJiAoc3RyaW5nW2luZGV4XSA9PT0gJy8nKSAmJiAoc3RyaW5nW2luZGV4KzFdID09PSAnKicpKSB7XG4gICAgICAgICAgICAgICAgLy8gYmxvY2sgY29tbWVudFxuICAgICAgICAgICAgICAgIGxldCBlbmRJbmRleCA9IHN0cmluZy5pbmRleE9mKCcqLycsIGluZGV4KTtcbiAgICAgICAgICAgICAgICBpZiAoZW5kSW5kZXggIT09IC0xKSB7XG4gICAgICAgICAgICAgICAgICAgIGluZGV4ID0gZW5kSW5kZXggKyAyO1xuICAgICAgICAgICAgICAgICAgICBlbmRCbG9ja0NvbW1lbnQgPSBzdHJpbmcuaW5kZXhPZignKi8nLCBpbmRleCk7XG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgc3RyaXBwZWQgKz0gc3RyaW5nW2luZGV4XTtcbiAgICAgICAgICAgICAgICAgICAgaW5kZXgrKztcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIHN0cmlwcGVkICs9IHN0cmluZ1tpbmRleF07XG4gICAgICAgICAgICAgICAgaW5kZXgrKztcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gc3RyaXBwZWQ7XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gcGFyc2VQYXJhbXMoZnVuYykge1xuICAgICAgICBjb25zdCBzcmMgPSBzdHJpcENvbW1lbnRzKGZ1bmMudG9TdHJpbmcoKSk7XG4gICAgICAgIGxldCBtYXRjaCA9IHNyYy5tYXRjaChGTl9BUkdTKTtcbiAgICAgICAgaWYgKCFtYXRjaCkge1xuICAgICAgICAgICAgbWF0Y2ggPSBzcmMubWF0Y2goQVJST1dfRk5fQVJHUyk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKCFtYXRjaCkgdGhyb3cgbmV3IEVycm9yKCdjb3VsZCBub3QgcGFyc2UgYXJncyBpbiBhdXRvSW5qZWN0XFxuU291cmNlOlxcbicgKyBzcmMpXG4gICAgICAgIGxldCBbLCBhcmdzXSA9IG1hdGNoO1xuICAgICAgICByZXR1cm4gYXJnc1xuICAgICAgICAgICAgLnJlcGxhY2UoL1xccy9nLCAnJylcbiAgICAgICAgICAgIC5zcGxpdChGTl9BUkdfU1BMSVQpXG4gICAgICAgICAgICAubWFwKChhcmcpID0+IGFyZy5yZXBsYWNlKEZOX0FSRywgJycpLnRyaW0oKSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQSBkZXBlbmRlbmN5LWluamVjdGVkIHZlcnNpb24gb2YgdGhlIFthc3luYy5hdXRvXXtAbGluayBtb2R1bGU6Q29udHJvbEZsb3cuYXV0b30gZnVuY3Rpb24uIERlcGVuZGVudFxuICAgICAqIHRhc2tzIGFyZSBzcGVjaWZpZWQgYXMgcGFyYW1ldGVycyB0byB0aGUgZnVuY3Rpb24sIGFmdGVyIHRoZSB1c3VhbCBjYWxsYmFja1xuICAgICAqIHBhcmFtZXRlciwgd2l0aCB0aGUgcGFyYW1ldGVyIG5hbWVzIG1hdGNoaW5nIHRoZSBuYW1lcyBvZiB0aGUgdGFza3MgaXRcbiAgICAgKiBkZXBlbmRzIG9uLiBUaGlzIGNhbiBwcm92aWRlIGV2ZW4gbW9yZSByZWFkYWJsZSB0YXNrIGdyYXBocyB3aGljaCBjYW4gYmVcbiAgICAgKiBlYXNpZXIgdG8gbWFpbnRhaW4uXG4gICAgICpcbiAgICAgKiBJZiBhIGZpbmFsIGNhbGxiYWNrIGlzIHNwZWNpZmllZCwgdGhlIHRhc2sgcmVzdWx0cyBhcmUgc2ltaWxhcmx5IGluamVjdGVkLFxuICAgICAqIHNwZWNpZmllZCBhcyBuYW1lZCBwYXJhbWV0ZXJzIGFmdGVyIHRoZSBpbml0aWFsIGVycm9yIHBhcmFtZXRlci5cbiAgICAgKlxuICAgICAqIFRoZSBhdXRvSW5qZWN0IGZ1bmN0aW9uIGlzIHB1cmVseSBzeW50YWN0aWMgc3VnYXIgYW5kIGl0cyBzZW1hbnRpY3MgYXJlXG4gICAgICogb3RoZXJ3aXNlIGVxdWl2YWxlbnQgdG8gW2FzeW5jLmF1dG9de0BsaW5rIG1vZHVsZTpDb250cm9sRmxvdy5hdXRvfS5cbiAgICAgKlxuICAgICAqIEBuYW1lIGF1dG9JbmplY3RcbiAgICAgKiBAc3RhdGljXG4gICAgICogQG1lbWJlck9mIG1vZHVsZTpDb250cm9sRmxvd1xuICAgICAqIEBtZXRob2RcbiAgICAgKiBAc2VlIFthc3luYy5hdXRvXXtAbGluayBtb2R1bGU6Q29udHJvbEZsb3cuYXV0b31cbiAgICAgKiBAY2F0ZWdvcnkgQ29udHJvbCBGbG93XG4gICAgICogQHBhcmFtIHtPYmplY3R9IHRhc2tzIC0gQW4gb2JqZWN0LCBlYWNoIG9mIHdob3NlIHByb3BlcnRpZXMgaXMgYW4ge0BsaW5rIEFzeW5jRnVuY3Rpb259IG9mXG4gICAgICogdGhlIGZvcm0gJ2Z1bmMoW2RlcGVuZGVuY2llcy4uLl0sIGNhbGxiYWNrKS4gVGhlIG9iamVjdCdzIGtleSBvZiBhIHByb3BlcnR5XG4gICAgICogc2VydmVzIGFzIHRoZSBuYW1lIG9mIHRoZSB0YXNrIGRlZmluZWQgYnkgdGhhdCBwcm9wZXJ0eSwgaS5lLiBjYW4gYmUgdXNlZFxuICAgICAqIHdoZW4gc3BlY2lmeWluZyByZXF1aXJlbWVudHMgZm9yIG90aGVyIHRhc2tzLlxuICAgICAqICogVGhlIGBjYWxsYmFja2AgcGFyYW1ldGVyIGlzIGEgYGNhbGxiYWNrKGVyciwgcmVzdWx0KWAgd2hpY2ggbXVzdCBiZSBjYWxsZWRcbiAgICAgKiAgIHdoZW4gZmluaXNoZWQsIHBhc3NpbmcgYW4gYGVycm9yYCAod2hpY2ggY2FuIGJlIGBudWxsYCkgYW5kIHRoZSByZXN1bHQgb2ZcbiAgICAgKiAgIHRoZSBmdW5jdGlvbidzIGV4ZWN1dGlvbi4gVGhlIHJlbWFpbmluZyBwYXJhbWV0ZXJzIG5hbWUgb3RoZXIgdGFza3Mgb25cbiAgICAgKiAgIHdoaWNoIHRoZSB0YXNrIGlzIGRlcGVuZGVudCwgYW5kIHRoZSByZXN1bHRzIGZyb20gdGhvc2UgdGFza3MgYXJlIHRoZVxuICAgICAqICAgYXJndW1lbnRzIG9mIHRob3NlIHBhcmFtZXRlcnMuXG4gICAgICogQHBhcmFtIHtGdW5jdGlvbn0gW2NhbGxiYWNrXSAtIEFuIG9wdGlvbmFsIGNhbGxiYWNrIHdoaWNoIGlzIGNhbGxlZCB3aGVuIGFsbFxuICAgICAqIHRoZSB0YXNrcyBoYXZlIGJlZW4gY29tcGxldGVkLiBJdCByZWNlaXZlcyB0aGUgYGVycmAgYXJndW1lbnQgaWYgYW55IGB0YXNrc2BcbiAgICAgKiBwYXNzIGFuIGVycm9yIHRvIHRoZWlyIGNhbGxiYWNrLCBhbmQgYSBgcmVzdWx0c2Agb2JqZWN0IHdpdGggYW55IGNvbXBsZXRlZFxuICAgICAqIHRhc2sgcmVzdWx0cywgc2ltaWxhciB0byBgYXV0b2AuXG4gICAgICogQHJldHVybnMge1Byb21pc2V9IGEgcHJvbWlzZSwgaWYgbm8gY2FsbGJhY2sgaXMgcGFzc2VkXG4gICAgICogQGV4YW1wbGVcbiAgICAgKlxuICAgICAqIC8vICBUaGUgZXhhbXBsZSBmcm9tIGBhdXRvYCBjYW4gYmUgcmV3cml0dGVuIGFzIGZvbGxvd3M6XG4gICAgICogYXN5bmMuYXV0b0luamVjdCh7XG4gICAgICogICAgIGdldF9kYXRhOiBmdW5jdGlvbihjYWxsYmFjaykge1xuICAgICAqICAgICAgICAgLy8gYXN5bmMgY29kZSB0byBnZXQgc29tZSBkYXRhXG4gICAgICogICAgICAgICBjYWxsYmFjayhudWxsLCAnZGF0YScsICdjb252ZXJ0ZWQgdG8gYXJyYXknKTtcbiAgICAgKiAgICAgfSxcbiAgICAgKiAgICAgbWFrZV9mb2xkZXI6IGZ1bmN0aW9uKGNhbGxiYWNrKSB7XG4gICAgICogICAgICAgICAvLyBhc3luYyBjb2RlIHRvIGNyZWF0ZSBhIGRpcmVjdG9yeSB0byBzdG9yZSBhIGZpbGUgaW5cbiAgICAgKiAgICAgICAgIC8vIHRoaXMgaXMgcnVuIGF0IHRoZSBzYW1lIHRpbWUgYXMgZ2V0dGluZyB0aGUgZGF0YVxuICAgICAqICAgICAgICAgY2FsbGJhY2sobnVsbCwgJ2ZvbGRlcicpO1xuICAgICAqICAgICB9LFxuICAgICAqICAgICB3cml0ZV9maWxlOiBmdW5jdGlvbihnZXRfZGF0YSwgbWFrZV9mb2xkZXIsIGNhbGxiYWNrKSB7XG4gICAgICogICAgICAgICAvLyBvbmNlIHRoZXJlIGlzIHNvbWUgZGF0YSBhbmQgdGhlIGRpcmVjdG9yeSBleGlzdHMsXG4gICAgICogICAgICAgICAvLyB3cml0ZSB0aGUgZGF0YSB0byBhIGZpbGUgaW4gdGhlIGRpcmVjdG9yeVxuICAgICAqICAgICAgICAgY2FsbGJhY2sobnVsbCwgJ2ZpbGVuYW1lJyk7XG4gICAgICogICAgIH0sXG4gICAgICogICAgIGVtYWlsX2xpbms6IGZ1bmN0aW9uKHdyaXRlX2ZpbGUsIGNhbGxiYWNrKSB7XG4gICAgICogICAgICAgICAvLyBvbmNlIHRoZSBmaWxlIGlzIHdyaXR0ZW4gbGV0J3MgZW1haWwgYSBsaW5rIHRvIGl0Li4uXG4gICAgICogICAgICAgICAvLyB3cml0ZV9maWxlIGNvbnRhaW5zIHRoZSBmaWxlbmFtZSByZXR1cm5lZCBieSB3cml0ZV9maWxlLlxuICAgICAqICAgICAgICAgY2FsbGJhY2sobnVsbCwgeydmaWxlJzp3cml0ZV9maWxlLCAnZW1haWwnOid1c2VyQGV4YW1wbGUuY29tJ30pO1xuICAgICAqICAgICB9XG4gICAgICogfSwgZnVuY3Rpb24oZXJyLCByZXN1bHRzKSB7XG4gICAgICogICAgIGNvbnNvbGUubG9nKCdlcnIgPSAnLCBlcnIpO1xuICAgICAqICAgICBjb25zb2xlLmxvZygnZW1haWxfbGluayA9ICcsIHJlc3VsdHMuZW1haWxfbGluayk7XG4gICAgICogfSk7XG4gICAgICpcbiAgICAgKiAvLyBJZiB5b3UgYXJlIHVzaW5nIGEgSlMgbWluaWZpZXIgdGhhdCBtYW5nbGVzIHBhcmFtZXRlciBuYW1lcywgYGF1dG9JbmplY3RgXG4gICAgICogLy8gd2lsbCBub3Qgd29yayB3aXRoIHBsYWluIGZ1bmN0aW9ucywgc2luY2UgdGhlIHBhcmFtZXRlciBuYW1lcyB3aWxsIGJlXG4gICAgICogLy8gY29sbGFwc2VkIHRvIGEgc2luZ2xlIGxldHRlciBpZGVudGlmaWVyLiAgVG8gd29yayBhcm91bmQgdGhpcywgeW91IGNhblxuICAgICAqIC8vIGV4cGxpY2l0bHkgc3BlY2lmeSB0aGUgbmFtZXMgb2YgdGhlIHBhcmFtZXRlcnMgeW91ciB0YXNrIGZ1bmN0aW9uIG5lZWRzXG4gICAgICogLy8gaW4gYW4gYXJyYXksIHNpbWlsYXIgdG8gQW5ndWxhci5qcyBkZXBlbmRlbmN5IGluamVjdGlvbi5cbiAgICAgKlxuICAgICAqIC8vIFRoaXMgc3RpbGwgaGFzIGFuIGFkdmFudGFnZSBvdmVyIHBsYWluIGBhdXRvYCwgc2luY2UgdGhlIHJlc3VsdHMgYSB0YXNrXG4gICAgICogLy8gZGVwZW5kcyBvbiBhcmUgc3RpbGwgc3ByZWFkIGludG8gYXJndW1lbnRzLlxuICAgICAqIGFzeW5jLmF1dG9JbmplY3Qoe1xuICAgICAqICAgICAvLy4uLlxuICAgICAqICAgICB3cml0ZV9maWxlOiBbJ2dldF9kYXRhJywgJ21ha2VfZm9sZGVyJywgZnVuY3Rpb24oZ2V0X2RhdGEsIG1ha2VfZm9sZGVyLCBjYWxsYmFjaykge1xuICAgICAqICAgICAgICAgY2FsbGJhY2sobnVsbCwgJ2ZpbGVuYW1lJyk7XG4gICAgICogICAgIH1dLFxuICAgICAqICAgICBlbWFpbF9saW5rOiBbJ3dyaXRlX2ZpbGUnLCBmdW5jdGlvbih3cml0ZV9maWxlLCBjYWxsYmFjaykge1xuICAgICAqICAgICAgICAgY2FsbGJhY2sobnVsbCwgeydmaWxlJzp3cml0ZV9maWxlLCAnZW1haWwnOid1c2VyQGV4YW1wbGUuY29tJ30pO1xuICAgICAqICAgICB9XVxuICAgICAqICAgICAvLy4uLlxuICAgICAqIH0sIGZ1bmN0aW9uKGVyciwgcmVzdWx0cykge1xuICAgICAqICAgICBjb25zb2xlLmxvZygnZXJyID0gJywgZXJyKTtcbiAgICAgKiAgICAgY29uc29sZS5sb2coJ2VtYWlsX2xpbmsgPSAnLCByZXN1bHRzLmVtYWlsX2xpbmspO1xuICAgICAqIH0pO1xuICAgICAqL1xuICAgIGZ1bmN0aW9uIGF1dG9JbmplY3QodGFza3MsIGNhbGxiYWNrKSB7XG4gICAgICAgIHZhciBuZXdUYXNrcyA9IHt9O1xuXG4gICAgICAgIE9iamVjdC5rZXlzKHRhc2tzKS5mb3JFYWNoKGtleSA9PiB7XG4gICAgICAgICAgICB2YXIgdGFza0ZuID0gdGFza3Nba2V5XTtcbiAgICAgICAgICAgIHZhciBwYXJhbXM7XG4gICAgICAgICAgICB2YXIgZm5Jc0FzeW5jID0gaXNBc3luYyh0YXNrRm4pO1xuICAgICAgICAgICAgdmFyIGhhc05vRGVwcyA9XG4gICAgICAgICAgICAgICAgKCFmbklzQXN5bmMgJiYgdGFza0ZuLmxlbmd0aCA9PT0gMSkgfHxcbiAgICAgICAgICAgICAgICAoZm5Jc0FzeW5jICYmIHRhc2tGbi5sZW5ndGggPT09IDApO1xuXG4gICAgICAgICAgICBpZiAoQXJyYXkuaXNBcnJheSh0YXNrRm4pKSB7XG4gICAgICAgICAgICAgICAgcGFyYW1zID0gWy4uLnRhc2tGbl07XG4gICAgICAgICAgICAgICAgdGFza0ZuID0gcGFyYW1zLnBvcCgpO1xuXG4gICAgICAgICAgICAgICAgbmV3VGFza3Nba2V5XSA9IHBhcmFtcy5jb25jYXQocGFyYW1zLmxlbmd0aCA+IDAgPyBuZXdUYXNrIDogdGFza0ZuKTtcbiAgICAgICAgICAgIH0gZWxzZSBpZiAoaGFzTm9EZXBzKSB7XG4gICAgICAgICAgICAgICAgLy8gbm8gZGVwZW5kZW5jaWVzLCB1c2UgdGhlIGZ1bmN0aW9uIGFzLWlzXG4gICAgICAgICAgICAgICAgbmV3VGFza3Nba2V5XSA9IHRhc2tGbjtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgcGFyYW1zID0gcGFyc2VQYXJhbXModGFza0ZuKTtcbiAgICAgICAgICAgICAgICBpZiAoKHRhc2tGbi5sZW5ndGggPT09IDAgJiYgIWZuSXNBc3luYykgJiYgcGFyYW1zLmxlbmd0aCA9PT0gMCkge1xuICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJhdXRvSW5qZWN0IHRhc2sgZnVuY3Rpb25zIHJlcXVpcmUgZXhwbGljaXQgcGFyYW1ldGVycy5cIik7XG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgLy8gcmVtb3ZlIGNhbGxiYWNrIHBhcmFtXG4gICAgICAgICAgICAgICAgaWYgKCFmbklzQXN5bmMpIHBhcmFtcy5wb3AoKTtcblxuICAgICAgICAgICAgICAgIG5ld1Rhc2tzW2tleV0gPSBwYXJhbXMuY29uY2F0KG5ld1Rhc2spO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBmdW5jdGlvbiBuZXdUYXNrKHJlc3VsdHMsIHRhc2tDYikge1xuICAgICAgICAgICAgICAgIHZhciBuZXdBcmdzID0gcGFyYW1zLm1hcChuYW1lID0+IHJlc3VsdHNbbmFtZV0pO1xuICAgICAgICAgICAgICAgIG5ld0FyZ3MucHVzaCh0YXNrQ2IpO1xuICAgICAgICAgICAgICAgIHdyYXBBc3luYyh0YXNrRm4pKC4uLm5ld0FyZ3MpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9KTtcblxuICAgICAgICByZXR1cm4gYXV0byhuZXdUYXNrcywgY2FsbGJhY2spO1xuICAgIH1cblxuICAgIC8vIFNpbXBsZSBkb3VibHkgbGlua2VkIGxpc3QgKGh0dHBzOi8vZW4ud2lraXBlZGlhLm9yZy93aWtpL0RvdWJseV9saW5rZWRfbGlzdCkgaW1wbGVtZW50YXRpb25cbiAgICAvLyB1c2VkIGZvciBxdWV1ZXMuIFRoaXMgaW1wbGVtZW50YXRpb24gYXNzdW1lcyB0aGF0IHRoZSBub2RlIHByb3ZpZGVkIGJ5IHRoZSB1c2VyIGNhbiBiZSBtb2RpZmllZFxuICAgIC8vIHRvIGFkanVzdCB0aGUgbmV4dCBhbmQgbGFzdCBwcm9wZXJ0aWVzLiBXZSBpbXBsZW1lbnQgb25seSB0aGUgbWluaW1hbCBmdW5jdGlvbmFsaXR5XG4gICAgLy8gZm9yIHF1ZXVlIHN1cHBvcnQuXG4gICAgY2xhc3MgRExMIHtcbiAgICAgICAgY29uc3RydWN0b3IoKSB7XG4gICAgICAgICAgICB0aGlzLmhlYWQgPSB0aGlzLnRhaWwgPSBudWxsO1xuICAgICAgICAgICAgdGhpcy5sZW5ndGggPSAwO1xuICAgICAgICB9XG5cbiAgICAgICAgcmVtb3ZlTGluayhub2RlKSB7XG4gICAgICAgICAgICBpZiAobm9kZS5wcmV2KSBub2RlLnByZXYubmV4dCA9IG5vZGUubmV4dDtcbiAgICAgICAgICAgIGVsc2UgdGhpcy5oZWFkID0gbm9kZS5uZXh0O1xuICAgICAgICAgICAgaWYgKG5vZGUubmV4dCkgbm9kZS5uZXh0LnByZXYgPSBub2RlLnByZXY7XG4gICAgICAgICAgICBlbHNlIHRoaXMudGFpbCA9IG5vZGUucHJldjtcblxuICAgICAgICAgICAgbm9kZS5wcmV2ID0gbm9kZS5uZXh0ID0gbnVsbDtcbiAgICAgICAgICAgIHRoaXMubGVuZ3RoIC09IDE7XG4gICAgICAgICAgICByZXR1cm4gbm9kZTtcbiAgICAgICAgfVxuXG4gICAgICAgIGVtcHR5ICgpIHtcbiAgICAgICAgICAgIHdoaWxlKHRoaXMuaGVhZCkgdGhpcy5zaGlmdCgpO1xuICAgICAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgICAgIH1cblxuICAgICAgICBpbnNlcnRBZnRlcihub2RlLCBuZXdOb2RlKSB7XG4gICAgICAgICAgICBuZXdOb2RlLnByZXYgPSBub2RlO1xuICAgICAgICAgICAgbmV3Tm9kZS5uZXh0ID0gbm9kZS5uZXh0O1xuICAgICAgICAgICAgaWYgKG5vZGUubmV4dCkgbm9kZS5uZXh0LnByZXYgPSBuZXdOb2RlO1xuICAgICAgICAgICAgZWxzZSB0aGlzLnRhaWwgPSBuZXdOb2RlO1xuICAgICAgICAgICAgbm9kZS5uZXh0ID0gbmV3Tm9kZTtcbiAgICAgICAgICAgIHRoaXMubGVuZ3RoICs9IDE7XG4gICAgICAgIH1cblxuICAgICAgICBpbnNlcnRCZWZvcmUobm9kZSwgbmV3Tm9kZSkge1xuICAgICAgICAgICAgbmV3Tm9kZS5wcmV2ID0gbm9kZS5wcmV2O1xuICAgICAgICAgICAgbmV3Tm9kZS5uZXh0ID0gbm9kZTtcbiAgICAgICAgICAgIGlmIChub2RlLnByZXYpIG5vZGUucHJldi5uZXh0ID0gbmV3Tm9kZTtcbiAgICAgICAgICAgIGVsc2UgdGhpcy5oZWFkID0gbmV3Tm9kZTtcbiAgICAgICAgICAgIG5vZGUucHJldiA9IG5ld05vZGU7XG4gICAgICAgICAgICB0aGlzLmxlbmd0aCArPSAxO1xuICAgICAgICB9XG5cbiAgICAgICAgdW5zaGlmdChub2RlKSB7XG4gICAgICAgICAgICBpZiAodGhpcy5oZWFkKSB0aGlzLmluc2VydEJlZm9yZSh0aGlzLmhlYWQsIG5vZGUpO1xuICAgICAgICAgICAgZWxzZSBzZXRJbml0aWFsKHRoaXMsIG5vZGUpO1xuICAgICAgICB9XG5cbiAgICAgICAgcHVzaChub2RlKSB7XG4gICAgICAgICAgICBpZiAodGhpcy50YWlsKSB0aGlzLmluc2VydEFmdGVyKHRoaXMudGFpbCwgbm9kZSk7XG4gICAgICAgICAgICBlbHNlIHNldEluaXRpYWwodGhpcywgbm9kZSk7XG4gICAgICAgIH1cblxuICAgICAgICBzaGlmdCgpIHtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLmhlYWQgJiYgdGhpcy5yZW1vdmVMaW5rKHRoaXMuaGVhZCk7XG4gICAgICAgIH1cblxuICAgICAgICBwb3AoKSB7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy50YWlsICYmIHRoaXMucmVtb3ZlTGluayh0aGlzLnRhaWwpO1xuICAgICAgICB9XG5cbiAgICAgICAgdG9BcnJheSgpIHtcbiAgICAgICAgICAgIHJldHVybiBbLi4udGhpc11cbiAgICAgICAgfVxuXG4gICAgICAgICpbU3ltYm9sLml0ZXJhdG9yXSAoKSB7XG4gICAgICAgICAgICB2YXIgY3VyID0gdGhpcy5oZWFkO1xuICAgICAgICAgICAgd2hpbGUgKGN1cikge1xuICAgICAgICAgICAgICAgIHlpZWxkIGN1ci5kYXRhO1xuICAgICAgICAgICAgICAgIGN1ciA9IGN1ci5uZXh0O1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgcmVtb3ZlICh0ZXN0Rm4pIHtcbiAgICAgICAgICAgIHZhciBjdXJyID0gdGhpcy5oZWFkO1xuICAgICAgICAgICAgd2hpbGUoY3Vycikge1xuICAgICAgICAgICAgICAgIHZhciB7bmV4dH0gPSBjdXJyO1xuICAgICAgICAgICAgICAgIGlmICh0ZXN0Rm4oY3VycikpIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5yZW1vdmVMaW5rKGN1cnIpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBjdXJyID0gbmV4dDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiB0aGlzO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gc2V0SW5pdGlhbChkbGwsIG5vZGUpIHtcbiAgICAgICAgZGxsLmxlbmd0aCA9IDE7XG4gICAgICAgIGRsbC5oZWFkID0gZGxsLnRhaWwgPSBub2RlO1xuICAgIH1cblxuICAgIGZ1bmN0aW9uIHF1ZXVlJDEod29ya2VyLCBjb25jdXJyZW5jeSwgcGF5bG9hZCkge1xuICAgICAgICBpZiAoY29uY3VycmVuY3kgPT0gbnVsbCkge1xuICAgICAgICAgICAgY29uY3VycmVuY3kgPSAxO1xuICAgICAgICB9XG4gICAgICAgIGVsc2UgaWYoY29uY3VycmVuY3kgPT09IDApIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBSYW5nZUVycm9yKCdDb25jdXJyZW5jeSBtdXN0IG5vdCBiZSB6ZXJvJyk7XG4gICAgICAgIH1cblxuICAgICAgICB2YXIgX3dvcmtlciA9IHdyYXBBc3luYyh3b3JrZXIpO1xuICAgICAgICB2YXIgbnVtUnVubmluZyA9IDA7XG4gICAgICAgIHZhciB3b3JrZXJzTGlzdCA9IFtdO1xuICAgICAgICBjb25zdCBldmVudHMgPSB7XG4gICAgICAgICAgICBlcnJvcjogW10sXG4gICAgICAgICAgICBkcmFpbjogW10sXG4gICAgICAgICAgICBzYXR1cmF0ZWQ6IFtdLFxuICAgICAgICAgICAgdW5zYXR1cmF0ZWQ6IFtdLFxuICAgICAgICAgICAgZW1wdHk6IFtdXG4gICAgICAgIH07XG5cbiAgICAgICAgZnVuY3Rpb24gb24gKGV2ZW50LCBoYW5kbGVyKSB7XG4gICAgICAgICAgICBldmVudHNbZXZlbnRdLnB1c2goaGFuZGxlcik7XG4gICAgICAgIH1cblxuICAgICAgICBmdW5jdGlvbiBvbmNlIChldmVudCwgaGFuZGxlcikge1xuICAgICAgICAgICAgY29uc3QgaGFuZGxlQW5kUmVtb3ZlID0gKC4uLmFyZ3MpID0+IHtcbiAgICAgICAgICAgICAgICBvZmYoZXZlbnQsIGhhbmRsZUFuZFJlbW92ZSk7XG4gICAgICAgICAgICAgICAgaGFuZGxlciguLi5hcmdzKTtcbiAgICAgICAgICAgIH07XG4gICAgICAgICAgICBldmVudHNbZXZlbnRdLnB1c2goaGFuZGxlQW5kUmVtb3ZlKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGZ1bmN0aW9uIG9mZiAoZXZlbnQsIGhhbmRsZXIpIHtcbiAgICAgICAgICAgIGlmICghZXZlbnQpIHJldHVybiBPYmplY3Qua2V5cyhldmVudHMpLmZvckVhY2goZXYgPT4gZXZlbnRzW2V2XSA9IFtdKVxuICAgICAgICAgICAgaWYgKCFoYW5kbGVyKSByZXR1cm4gZXZlbnRzW2V2ZW50XSA9IFtdXG4gICAgICAgICAgICBldmVudHNbZXZlbnRdID0gZXZlbnRzW2V2ZW50XS5maWx0ZXIoZXYgPT4gZXYgIT09IGhhbmRsZXIpO1xuICAgICAgICB9XG5cbiAgICAgICAgZnVuY3Rpb24gdHJpZ2dlciAoZXZlbnQsIC4uLmFyZ3MpIHtcbiAgICAgICAgICAgIGV2ZW50c1tldmVudF0uZm9yRWFjaChoYW5kbGVyID0+IGhhbmRsZXIoLi4uYXJncykpO1xuICAgICAgICB9XG5cbiAgICAgICAgdmFyIHByb2Nlc3NpbmdTY2hlZHVsZWQgPSBmYWxzZTtcbiAgICAgICAgZnVuY3Rpb24gX2luc2VydChkYXRhLCBpbnNlcnRBdEZyb250LCByZWplY3RPbkVycm9yLCBjYWxsYmFjaykge1xuICAgICAgICAgICAgaWYgKGNhbGxiYWNrICE9IG51bGwgJiYgdHlwZW9mIGNhbGxiYWNrICE9PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCd0YXNrIGNhbGxiYWNrIG11c3QgYmUgYSBmdW5jdGlvbicpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcS5zdGFydGVkID0gdHJ1ZTtcblxuICAgICAgICAgICAgdmFyIHJlcywgcmVqO1xuICAgICAgICAgICAgZnVuY3Rpb24gcHJvbWlzZUNhbGxiYWNrIChlcnIsIC4uLmFyZ3MpIHtcbiAgICAgICAgICAgICAgICAvLyB3ZSBkb24ndCBjYXJlIGFib3V0IHRoZSBlcnJvciwgbGV0IHRoZSBnbG9iYWwgZXJyb3IgaGFuZGxlclxuICAgICAgICAgICAgICAgIC8vIGRlYWwgd2l0aCBpdFxuICAgICAgICAgICAgICAgIGlmIChlcnIpIHJldHVybiByZWplY3RPbkVycm9yID8gcmVqKGVycikgOiByZXMoKVxuICAgICAgICAgICAgICAgIGlmIChhcmdzLmxlbmd0aCA8PSAxKSByZXR1cm4gcmVzKGFyZ3NbMF0pXG4gICAgICAgICAgICAgICAgcmVzKGFyZ3MpO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICB2YXIgaXRlbSA9IHEuX2NyZWF0ZVRhc2tJdGVtKFxuICAgICAgICAgICAgICAgIGRhdGEsXG4gICAgICAgICAgICAgICAgcmVqZWN0T25FcnJvciA/IHByb21pc2VDYWxsYmFjayA6XG4gICAgICAgICAgICAgICAgICAgIChjYWxsYmFjayB8fCBwcm9taXNlQ2FsbGJhY2spXG4gICAgICAgICAgICApO1xuXG4gICAgICAgICAgICBpZiAoaW5zZXJ0QXRGcm9udCkge1xuICAgICAgICAgICAgICAgIHEuX3Rhc2tzLnVuc2hpZnQoaXRlbSk7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIHEuX3Rhc2tzLnB1c2goaXRlbSk7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGlmICghcHJvY2Vzc2luZ1NjaGVkdWxlZCkge1xuICAgICAgICAgICAgICAgIHByb2Nlc3NpbmdTY2hlZHVsZWQgPSB0cnVlO1xuICAgICAgICAgICAgICAgIHNldEltbWVkaWF0ZSQxKCgpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgcHJvY2Vzc2luZ1NjaGVkdWxlZCA9IGZhbHNlO1xuICAgICAgICAgICAgICAgICAgICBxLnByb2Nlc3MoKTtcbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgaWYgKHJlamVjdE9uRXJyb3IgfHwgIWNhbGxiYWNrKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBQcm9taXNlKChyZXNvbHZlLCByZWplY3QpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgcmVzID0gcmVzb2x2ZTtcbiAgICAgICAgICAgICAgICAgICAgcmVqID0gcmVqZWN0O1xuICAgICAgICAgICAgICAgIH0pXG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICBmdW5jdGlvbiBfY3JlYXRlQ0IodGFza3MpIHtcbiAgICAgICAgICAgIHJldHVybiBmdW5jdGlvbiAoZXJyLCAuLi5hcmdzKSB7XG4gICAgICAgICAgICAgICAgbnVtUnVubmluZyAtPSAxO1xuXG4gICAgICAgICAgICAgICAgZm9yICh2YXIgaSA9IDAsIGwgPSB0YXNrcy5sZW5ndGg7IGkgPCBsOyBpKyspIHtcbiAgICAgICAgICAgICAgICAgICAgdmFyIHRhc2sgPSB0YXNrc1tpXTtcblxuICAgICAgICAgICAgICAgICAgICB2YXIgaW5kZXggPSB3b3JrZXJzTGlzdC5pbmRleE9mKHRhc2spO1xuICAgICAgICAgICAgICAgICAgICBpZiAoaW5kZXggPT09IDApIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHdvcmtlcnNMaXN0LnNoaWZ0KCk7XG4gICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoaW5kZXggPiAwKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICB3b3JrZXJzTGlzdC5zcGxpY2UoaW5kZXgsIDEpO1xuICAgICAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICAgICAgdGFzay5jYWxsYmFjayhlcnIsIC4uLmFyZ3MpO1xuXG4gICAgICAgICAgICAgICAgICAgIGlmIChlcnIgIT0gbnVsbCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgdHJpZ2dlcignZXJyb3InLCBlcnIsIHRhc2suZGF0YSk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICBpZiAobnVtUnVubmluZyA8PSAocS5jb25jdXJyZW5jeSAtIHEuYnVmZmVyKSApIHtcbiAgICAgICAgICAgICAgICAgICAgdHJpZ2dlcigndW5zYXR1cmF0ZWQnKTtcbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICBpZiAocS5pZGxlKCkpIHtcbiAgICAgICAgICAgICAgICAgICAgdHJpZ2dlcignZHJhaW4nKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgcS5wcm9jZXNzKCk7XG4gICAgICAgICAgICB9O1xuICAgICAgICB9XG5cbiAgICAgICAgZnVuY3Rpb24gX21heWJlRHJhaW4oZGF0YSkge1xuICAgICAgICAgICAgaWYgKGRhdGEubGVuZ3RoID09PSAwICYmIHEuaWRsZSgpKSB7XG4gICAgICAgICAgICAgICAgLy8gY2FsbCBkcmFpbiBpbW1lZGlhdGVseSBpZiB0aGVyZSBhcmUgbm8gdGFza3NcbiAgICAgICAgICAgICAgICBzZXRJbW1lZGlhdGUkMSgoKSA9PiB0cmlnZ2VyKCdkcmFpbicpKTtcbiAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIGZhbHNlXG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCBldmVudE1ldGhvZCA9IChuYW1lKSA9PiAoaGFuZGxlcikgPT4ge1xuICAgICAgICAgICAgaWYgKCFoYW5kbGVyKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBQcm9taXNlKChyZXNvbHZlLCByZWplY3QpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgb25jZShuYW1lLCAoZXJyLCBkYXRhKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoZXJyKSByZXR1cm4gcmVqZWN0KGVycilcbiAgICAgICAgICAgICAgICAgICAgICAgIHJlc29sdmUoZGF0YSk7XG4gICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgIH0pXG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBvZmYobmFtZSk7XG4gICAgICAgICAgICBvbihuYW1lLCBoYW5kbGVyKTtcblxuICAgICAgICB9O1xuXG4gICAgICAgIHZhciBpc1Byb2Nlc3NpbmcgPSBmYWxzZTtcbiAgICAgICAgdmFyIHEgPSB7XG4gICAgICAgICAgICBfdGFza3M6IG5ldyBETEwoKSxcbiAgICAgICAgICAgIF9jcmVhdGVUYXNrSXRlbSAoZGF0YSwgY2FsbGJhY2spIHtcbiAgICAgICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICAgICAgICBkYXRhLFxuICAgICAgICAgICAgICAgICAgICBjYWxsYmFja1xuICAgICAgICAgICAgICAgIH07XG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgKltTeW1ib2wuaXRlcmF0b3JdICgpIHtcbiAgICAgICAgICAgICAgICB5aWVsZCogcS5fdGFza3NbU3ltYm9sLml0ZXJhdG9yXSgpO1xuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIGNvbmN1cnJlbmN5LFxuICAgICAgICAgICAgcGF5bG9hZCxcbiAgICAgICAgICAgIGJ1ZmZlcjogY29uY3VycmVuY3kgLyA0LFxuICAgICAgICAgICAgc3RhcnRlZDogZmFsc2UsXG4gICAgICAgICAgICBwYXVzZWQ6IGZhbHNlLFxuICAgICAgICAgICAgcHVzaCAoZGF0YSwgY2FsbGJhY2spIHtcbiAgICAgICAgICAgICAgICBpZiAoQXJyYXkuaXNBcnJheShkYXRhKSkge1xuICAgICAgICAgICAgICAgICAgICBpZiAoX21heWJlRHJhaW4oZGF0YSkpIHJldHVyblxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gZGF0YS5tYXAoZGF0dW0gPT4gX2luc2VydChkYXR1bSwgZmFsc2UsIGZhbHNlLCBjYWxsYmFjaykpXG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHJldHVybiBfaW5zZXJ0KGRhdGEsIGZhbHNlLCBmYWxzZSwgY2FsbGJhY2spO1xuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIHB1c2hBc3luYyAoZGF0YSwgY2FsbGJhY2spIHtcbiAgICAgICAgICAgICAgICBpZiAoQXJyYXkuaXNBcnJheShkYXRhKSkge1xuICAgICAgICAgICAgICAgICAgICBpZiAoX21heWJlRHJhaW4oZGF0YSkpIHJldHVyblxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gZGF0YS5tYXAoZGF0dW0gPT4gX2luc2VydChkYXR1bSwgZmFsc2UsIHRydWUsIGNhbGxiYWNrKSlcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgcmV0dXJuIF9pbnNlcnQoZGF0YSwgZmFsc2UsIHRydWUsIGNhbGxiYWNrKTtcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBraWxsICgpIHtcbiAgICAgICAgICAgICAgICBvZmYoKTtcbiAgICAgICAgICAgICAgICBxLl90YXNrcy5lbXB0eSgpO1xuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIHVuc2hpZnQgKGRhdGEsIGNhbGxiYWNrKSB7XG4gICAgICAgICAgICAgICAgaWYgKEFycmF5LmlzQXJyYXkoZGF0YSkpIHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKF9tYXliZURyYWluKGRhdGEpKSByZXR1cm5cbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGRhdGEubWFwKGRhdHVtID0+IF9pbnNlcnQoZGF0dW0sIHRydWUsIGZhbHNlLCBjYWxsYmFjaykpXG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHJldHVybiBfaW5zZXJ0KGRhdGEsIHRydWUsIGZhbHNlLCBjYWxsYmFjayk7XG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgdW5zaGlmdEFzeW5jIChkYXRhLCBjYWxsYmFjaykge1xuICAgICAgICAgICAgICAgIGlmIChBcnJheS5pc0FycmF5KGRhdGEpKSB7XG4gICAgICAgICAgICAgICAgICAgIGlmIChfbWF5YmVEcmFpbihkYXRhKSkgcmV0dXJuXG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBkYXRhLm1hcChkYXR1bSA9PiBfaW5zZXJ0KGRhdHVtLCB0cnVlLCB0cnVlLCBjYWxsYmFjaykpXG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHJldHVybiBfaW5zZXJ0KGRhdGEsIHRydWUsIHRydWUsIGNhbGxiYWNrKTtcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICByZW1vdmUgKHRlc3RGbikge1xuICAgICAgICAgICAgICAgIHEuX3Rhc2tzLnJlbW92ZSh0ZXN0Rm4pO1xuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIHByb2Nlc3MgKCkge1xuICAgICAgICAgICAgICAgIC8vIEF2b2lkIHRyeWluZyB0byBzdGFydCB0b28gbWFueSBwcm9jZXNzaW5nIG9wZXJhdGlvbnMuIFRoaXMgY2FuIG9jY3VyXG4gICAgICAgICAgICAgICAgLy8gd2hlbiBjYWxsYmFja3MgcmVzb2x2ZSBzeW5jaHJvbm91c2x5ICgjMTI2NykuXG4gICAgICAgICAgICAgICAgaWYgKGlzUHJvY2Vzc2luZykge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGlzUHJvY2Vzc2luZyA9IHRydWU7XG4gICAgICAgICAgICAgICAgd2hpbGUoIXEucGF1c2VkICYmIG51bVJ1bm5pbmcgPCBxLmNvbmN1cnJlbmN5ICYmIHEuX3Rhc2tzLmxlbmd0aCl7XG4gICAgICAgICAgICAgICAgICAgIHZhciB0YXNrcyA9IFtdLCBkYXRhID0gW107XG4gICAgICAgICAgICAgICAgICAgIHZhciBsID0gcS5fdGFza3MubGVuZ3RoO1xuICAgICAgICAgICAgICAgICAgICBpZiAocS5wYXlsb2FkKSBsID0gTWF0aC5taW4obCwgcS5wYXlsb2FkKTtcbiAgICAgICAgICAgICAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBsOyBpKyspIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHZhciBub2RlID0gcS5fdGFza3Muc2hpZnQoKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRhc2tzLnB1c2gobm9kZSk7XG4gICAgICAgICAgICAgICAgICAgICAgICB3b3JrZXJzTGlzdC5wdXNoKG5vZGUpO1xuICAgICAgICAgICAgICAgICAgICAgICAgZGF0YS5wdXNoKG5vZGUuZGF0YSk7XG4gICAgICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgICAgICBudW1SdW5uaW5nICs9IDE7XG5cbiAgICAgICAgICAgICAgICAgICAgaWYgKHEuX3Rhc2tzLmxlbmd0aCA9PT0gMCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgdHJpZ2dlcignZW1wdHknKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgICAgIGlmIChudW1SdW5uaW5nID09PSBxLmNvbmN1cnJlbmN5KSB7XG4gICAgICAgICAgICAgICAgICAgICAgICB0cmlnZ2VyKCdzYXR1cmF0ZWQnKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgICAgIHZhciBjYiA9IG9ubHlPbmNlKF9jcmVhdGVDQih0YXNrcykpO1xuICAgICAgICAgICAgICAgICAgICBfd29ya2VyKGRhdGEsIGNiKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgaXNQcm9jZXNzaW5nID0gZmFsc2U7XG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgbGVuZ3RoICgpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gcS5fdGFza3MubGVuZ3RoO1xuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIHJ1bm5pbmcgKCkge1xuICAgICAgICAgICAgICAgIHJldHVybiBudW1SdW5uaW5nO1xuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIHdvcmtlcnNMaXN0ICgpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gd29ya2Vyc0xpc3Q7XG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgaWRsZSgpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gcS5fdGFza3MubGVuZ3RoICsgbnVtUnVubmluZyA9PT0gMDtcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBwYXVzZSAoKSB7XG4gICAgICAgICAgICAgICAgcS5wYXVzZWQgPSB0cnVlO1xuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIHJlc3VtZSAoKSB7XG4gICAgICAgICAgICAgICAgaWYgKHEucGF1c2VkID09PSBmYWxzZSkgeyByZXR1cm47IH1cbiAgICAgICAgICAgICAgICBxLnBhdXNlZCA9IGZhbHNlO1xuICAgICAgICAgICAgICAgIHNldEltbWVkaWF0ZSQxKHEucHJvY2Vzcyk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH07XG4gICAgICAgIC8vIGRlZmluZSB0aGVzZSBhcyBmaXhlZCBwcm9wZXJ0aWVzLCBzbyBwZW9wbGUgZ2V0IHVzZWZ1bCBlcnJvcnMgd2hlbiB1cGRhdGluZ1xuICAgICAgICBPYmplY3QuZGVmaW5lUHJvcGVydGllcyhxLCB7XG4gICAgICAgICAgICBzYXR1cmF0ZWQ6IHtcbiAgICAgICAgICAgICAgICB3cml0YWJsZTogZmFsc2UsXG4gICAgICAgICAgICAgICAgdmFsdWU6IGV2ZW50TWV0aG9kKCdzYXR1cmF0ZWQnKVxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIHVuc2F0dXJhdGVkOiB7XG4gICAgICAgICAgICAgICAgd3JpdGFibGU6IGZhbHNlLFxuICAgICAgICAgICAgICAgIHZhbHVlOiBldmVudE1ldGhvZCgndW5zYXR1cmF0ZWQnKVxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIGVtcHR5OiB7XG4gICAgICAgICAgICAgICAgd3JpdGFibGU6IGZhbHNlLFxuICAgICAgICAgICAgICAgIHZhbHVlOiBldmVudE1ldGhvZCgnZW1wdHknKVxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIGRyYWluOiB7XG4gICAgICAgICAgICAgICAgd3JpdGFibGU6IGZhbHNlLFxuICAgICAgICAgICAgICAgIHZhbHVlOiBldmVudE1ldGhvZCgnZHJhaW4nKVxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIGVycm9yOiB7XG4gICAgICAgICAgICAgICAgd3JpdGFibGU6IGZhbHNlLFxuICAgICAgICAgICAgICAgIHZhbHVlOiBldmVudE1ldGhvZCgnZXJyb3InKVxuICAgICAgICAgICAgfSxcbiAgICAgICAgfSk7XG4gICAgICAgIHJldHVybiBxO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIENyZWF0ZXMgYSBgY2FyZ29gIG9iamVjdCB3aXRoIHRoZSBzcGVjaWZpZWQgcGF5bG9hZC4gVGFza3MgYWRkZWQgdG8gdGhlXG4gICAgICogY2FyZ28gd2lsbCBiZSBwcm9jZXNzZWQgYWx0b2dldGhlciAodXAgdG8gdGhlIGBwYXlsb2FkYCBsaW1pdCkuIElmIHRoZVxuICAgICAqIGB3b3JrZXJgIGlzIGluIHByb2dyZXNzLCB0aGUgdGFzayBpcyBxdWV1ZWQgdW50aWwgaXQgYmVjb21lcyBhdmFpbGFibGUuIE9uY2VcbiAgICAgKiB0aGUgYHdvcmtlcmAgaGFzIGNvbXBsZXRlZCBzb21lIHRhc2tzLCBlYWNoIGNhbGxiYWNrIG9mIHRob3NlIHRhc2tzIGlzXG4gICAgICogY2FsbGVkLiBDaGVjayBvdXQgW3RoZXNlXShodHRwczovL2NhbW8uZ2l0aHVidXNlcmNvbnRlbnQuY29tLzZiYmQzNmY0Y2Y1YjM1YTBmMTFhOTZkY2QyZTk3NzExZmZjMmZiMzcvNjg3NDc0NzA3MzNhMmYyZjY2MmU2MzZjNmY3NTY0MmU2NzY5NzQ2ODc1NjIyZTYzNmY2ZDJmNjE3MzczNjU3NDczMmYzMTM2MzczNjM4MzczMTJmMzYzODMxMzAzODJmNjI2MjYzMzA2MzY2NjIzMDJkMzU2NjMyMzkyZDMxMzE2NTMyMmQzOTM3MzQ2NjJkMzMzMzM5Mzc2MzM2MzQ2NDYzMzgzNTM4MmU2NzY5NjYpIFthbmltYXRpb25zXShodHRwczovL2NhbW8uZ2l0aHVidXNlcmNvbnRlbnQuY29tL2Y0ODEwZTAwZTFjNWY1ZjhhZGRiZTNlOWY0OTA2NGZkNWQxMDI2OTkvNjg3NDc0NzA3MzNhMmYyZjY2MmU2MzZjNmY3NTY0MmU2NzY5NzQ2ODc1NjIyZTYzNmY2ZDJmNjE3MzczNjU3NDczMmYzMTM2MzczNjM4MzczMTJmMzYzODMxMzAzMTJmMzgzNDYzMzkzMjMwMzYzNjJkMzU2NjMyMzkyZDMxMzE2NTMyMmQzODMxMzQ2NjJkMzk2NDMzNjQzMDMyMzQzMTMzNjI2NjY0MmU2NzY5NjYpXG4gICAgICogZm9yIGhvdyBgY2FyZ29gIGFuZCBgcXVldWVgIHdvcmsuXG4gICAgICpcbiAgICAgKiBXaGlsZSBbYHF1ZXVlYF17QGxpbmsgbW9kdWxlOkNvbnRyb2xGbG93LnF1ZXVlfSBwYXNzZXMgb25seSBvbmUgdGFzayB0byBvbmUgb2YgYSBncm91cCBvZiB3b3JrZXJzXG4gICAgICogYXQgYSB0aW1lLCBjYXJnbyBwYXNzZXMgYW4gYXJyYXkgb2YgdGFza3MgdG8gYSBzaW5nbGUgd29ya2VyLCByZXBlYXRpbmdcbiAgICAgKiB3aGVuIHRoZSB3b3JrZXIgaXMgZmluaXNoZWQuXG4gICAgICpcbiAgICAgKiBAbmFtZSBjYXJnb1xuICAgICAqIEBzdGF0aWNcbiAgICAgKiBAbWVtYmVyT2YgbW9kdWxlOkNvbnRyb2xGbG93XG4gICAgICogQG1ldGhvZFxuICAgICAqIEBzZWUgW2FzeW5jLnF1ZXVlXXtAbGluayBtb2R1bGU6Q29udHJvbEZsb3cucXVldWV9XG4gICAgICogQGNhdGVnb3J5IENvbnRyb2wgRmxvd1xuICAgICAqIEBwYXJhbSB7QXN5bmNGdW5jdGlvbn0gd29ya2VyIC0gQW4gYXN5bmNocm9ub3VzIGZ1bmN0aW9uIGZvciBwcm9jZXNzaW5nIGFuIGFycmF5XG4gICAgICogb2YgcXVldWVkIHRhc2tzLiBJbnZva2VkIHdpdGggYCh0YXNrcywgY2FsbGJhY2spYC5cbiAgICAgKiBAcGFyYW0ge251bWJlcn0gW3BheWxvYWQ9SW5maW5pdHldIC0gQW4gb3B0aW9uYWwgYGludGVnZXJgIGZvciBkZXRlcm1pbmluZ1xuICAgICAqIGhvdyBtYW55IHRhc2tzIHNob3VsZCBiZSBwcm9jZXNzZWQgcGVyIHJvdW5kOyBpZiBvbWl0dGVkLCB0aGUgZGVmYXVsdCBpc1xuICAgICAqIHVubGltaXRlZC5cbiAgICAgKiBAcmV0dXJucyB7bW9kdWxlOkNvbnRyb2xGbG93LlF1ZXVlT2JqZWN0fSBBIGNhcmdvIG9iamVjdCB0byBtYW5hZ2UgdGhlIHRhc2tzLiBDYWxsYmFja3MgY2FuXG4gICAgICogYXR0YWNoZWQgYXMgY2VydGFpbiBwcm9wZXJ0aWVzIHRvIGxpc3RlbiBmb3Igc3BlY2lmaWMgZXZlbnRzIGR1cmluZyB0aGVcbiAgICAgKiBsaWZlY3ljbGUgb2YgdGhlIGNhcmdvIGFuZCBpbm5lciBxdWV1ZS5cbiAgICAgKiBAZXhhbXBsZVxuICAgICAqXG4gICAgICogLy8gY3JlYXRlIGEgY2FyZ28gb2JqZWN0IHdpdGggcGF5bG9hZCAyXG4gICAgICogdmFyIGNhcmdvID0gYXN5bmMuY2FyZ28oZnVuY3Rpb24odGFza3MsIGNhbGxiYWNrKSB7XG4gICAgICogICAgIGZvciAodmFyIGk9MDsgaTx0YXNrcy5sZW5ndGg7IGkrKykge1xuICAgICAqICAgICAgICAgY29uc29sZS5sb2coJ2hlbGxvICcgKyB0YXNrc1tpXS5uYW1lKTtcbiAgICAgKiAgICAgfVxuICAgICAqICAgICBjYWxsYmFjaygpO1xuICAgICAqIH0sIDIpO1xuICAgICAqXG4gICAgICogLy8gYWRkIHNvbWUgaXRlbXNcbiAgICAgKiBjYXJnby5wdXNoKHtuYW1lOiAnZm9vJ30sIGZ1bmN0aW9uKGVycikge1xuICAgICAqICAgICBjb25zb2xlLmxvZygnZmluaXNoZWQgcHJvY2Vzc2luZyBmb28nKTtcbiAgICAgKiB9KTtcbiAgICAgKiBjYXJnby5wdXNoKHtuYW1lOiAnYmFyJ30sIGZ1bmN0aW9uKGVycikge1xuICAgICAqICAgICBjb25zb2xlLmxvZygnZmluaXNoZWQgcHJvY2Vzc2luZyBiYXInKTtcbiAgICAgKiB9KTtcbiAgICAgKiBhd2FpdCBjYXJnby5wdXNoKHtuYW1lOiAnYmF6J30pO1xuICAgICAqIGNvbnNvbGUubG9nKCdmaW5pc2hlZCBwcm9jZXNzaW5nIGJheicpO1xuICAgICAqL1xuICAgIGZ1bmN0aW9uIGNhcmdvJDEod29ya2VyLCBwYXlsb2FkKSB7XG4gICAgICAgIHJldHVybiBxdWV1ZSQxKHdvcmtlciwgMSwgcGF5bG9hZCk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQ3JlYXRlcyBhIGBjYXJnb1F1ZXVlYCBvYmplY3Qgd2l0aCB0aGUgc3BlY2lmaWVkIHBheWxvYWQuIFRhc2tzIGFkZGVkIHRvIHRoZVxuICAgICAqIGNhcmdvUXVldWUgd2lsbCBiZSBwcm9jZXNzZWQgdG9nZXRoZXIgKHVwIHRvIHRoZSBgcGF5bG9hZGAgbGltaXQpIGluIGBjb25jdXJyZW5jeWAgcGFyYWxsZWwgd29ya2Vycy5cbiAgICAgKiBJZiB0aGUgYWxsIGB3b3JrZXJzYCBhcmUgaW4gcHJvZ3Jlc3MsIHRoZSB0YXNrIGlzIHF1ZXVlZCB1bnRpbCBvbmUgYmVjb21lcyBhdmFpbGFibGUuIE9uY2VcbiAgICAgKiBhIGB3b3JrZXJgIGhhcyBjb21wbGV0ZWQgc29tZSB0YXNrcywgZWFjaCBjYWxsYmFjayBvZiB0aG9zZSB0YXNrcyBpc1xuICAgICAqIGNhbGxlZC4gQ2hlY2sgb3V0IFt0aGVzZV0oaHR0cHM6Ly9jYW1vLmdpdGh1YnVzZXJjb250ZW50LmNvbS82YmJkMzZmNGNmNWIzNWEwZjExYTk2ZGNkMmU5NzcxMWZmYzJmYjM3LzY4NzQ3NDcwNzMzYTJmMmY2NjJlNjM2YzZmNzU2NDJlNjc2OTc0Njg3NTYyMmU2MzZmNmQyZjYxNzM3MzY1NzQ3MzJmMzEzNjM3MzYzODM3MzEyZjM2MzgzMTMwMzgyZjYyNjI2MzMwNjM2NjYyMzAyZDM1NjYzMjM5MmQzMTMxNjUzMjJkMzkzNzM0NjYyZDMzMzMzOTM3NjMzNjM0NjQ2MzM4MzUzODJlNjc2OTY2KSBbYW5pbWF0aW9uc10oaHR0cHM6Ly9jYW1vLmdpdGh1YnVzZXJjb250ZW50LmNvbS9mNDgxMGUwMGUxYzVmNWY4YWRkYmUzZTlmNDkwNjRmZDVkMTAyNjk5LzY4NzQ3NDcwNzMzYTJmMmY2NjJlNjM2YzZmNzU2NDJlNjc2OTc0Njg3NTYyMmU2MzZmNmQyZjYxNzM3MzY1NzQ3MzJmMzEzNjM3MzYzODM3MzEyZjM2MzgzMTMwMzEyZjM4MzQ2MzM5MzIzMDM2MzYyZDM1NjYzMjM5MmQzMTMxNjUzMjJkMzgzMTM0NjYyZDM5NjQzMzY0MzAzMjM0MzEzMzYyNjY2NDJlNjc2OTY2KVxuICAgICAqIGZvciBob3cgYGNhcmdvYCBhbmQgYHF1ZXVlYCB3b3JrLlxuICAgICAqXG4gICAgICogV2hpbGUgW2BxdWV1ZWBde0BsaW5rIG1vZHVsZTpDb250cm9sRmxvdy5xdWV1ZX0gcGFzc2VzIG9ubHkgb25lIHRhc2sgdG8gb25lIG9mIGEgZ3JvdXAgb2Ygd29ya2Vyc1xuICAgICAqIGF0IGEgdGltZSwgYW5kIFtgY2FyZ29gXXtAbGluayBtb2R1bGU6Q29udHJvbEZsb3cuY2FyZ299IHBhc3NlcyBhbiBhcnJheSBvZiB0YXNrcyB0byBhIHNpbmdsZSB3b3JrZXIsXG4gICAgICogdGhlIGNhcmdvUXVldWUgcGFzc2VzIGFuIGFycmF5IG9mIHRhc2tzIHRvIG11bHRpcGxlIHBhcmFsbGVsIHdvcmtlcnMuXG4gICAgICpcbiAgICAgKiBAbmFtZSBjYXJnb1F1ZXVlXG4gICAgICogQHN0YXRpY1xuICAgICAqIEBtZW1iZXJPZiBtb2R1bGU6Q29udHJvbEZsb3dcbiAgICAgKiBAbWV0aG9kXG4gICAgICogQHNlZSBbYXN5bmMucXVldWVde0BsaW5rIG1vZHVsZTpDb250cm9sRmxvdy5xdWV1ZX1cbiAgICAgKiBAc2VlIFthc3luYy5jYXJnb117QGxpbmsgbW9kdWxlOkNvbnRyb2xGTG93LmNhcmdvfVxuICAgICAqIEBjYXRlZ29yeSBDb250cm9sIEZsb3dcbiAgICAgKiBAcGFyYW0ge0FzeW5jRnVuY3Rpb259IHdvcmtlciAtIEFuIGFzeW5jaHJvbm91cyBmdW5jdGlvbiBmb3IgcHJvY2Vzc2luZyBhbiBhcnJheVxuICAgICAqIG9mIHF1ZXVlZCB0YXNrcy4gSW52b2tlZCB3aXRoIGAodGFza3MsIGNhbGxiYWNrKWAuXG4gICAgICogQHBhcmFtIHtudW1iZXJ9IFtjb25jdXJyZW5jeT0xXSAtIEFuIGBpbnRlZ2VyYCBmb3IgZGV0ZXJtaW5pbmcgaG93IG1hbnlcbiAgICAgKiBgd29ya2VyYCBmdW5jdGlvbnMgc2hvdWxkIGJlIHJ1biBpbiBwYXJhbGxlbC4gIElmIG9taXR0ZWQsIHRoZSBjb25jdXJyZW5jeVxuICAgICAqIGRlZmF1bHRzIHRvIGAxYC4gIElmIHRoZSBjb25jdXJyZW5jeSBpcyBgMGAsIGFuIGVycm9yIGlzIHRocm93bi5cbiAgICAgKiBAcGFyYW0ge251bWJlcn0gW3BheWxvYWQ9SW5maW5pdHldIC0gQW4gb3B0aW9uYWwgYGludGVnZXJgIGZvciBkZXRlcm1pbmluZ1xuICAgICAqIGhvdyBtYW55IHRhc2tzIHNob3VsZCBiZSBwcm9jZXNzZWQgcGVyIHJvdW5kOyBpZiBvbWl0dGVkLCB0aGUgZGVmYXVsdCBpc1xuICAgICAqIHVubGltaXRlZC5cbiAgICAgKiBAcmV0dXJucyB7bW9kdWxlOkNvbnRyb2xGbG93LlF1ZXVlT2JqZWN0fSBBIGNhcmdvUXVldWUgb2JqZWN0IHRvIG1hbmFnZSB0aGUgdGFza3MuIENhbGxiYWNrcyBjYW5cbiAgICAgKiBhdHRhY2hlZCBhcyBjZXJ0YWluIHByb3BlcnRpZXMgdG8gbGlzdGVuIGZvciBzcGVjaWZpYyBldmVudHMgZHVyaW5nIHRoZVxuICAgICAqIGxpZmVjeWNsZSBvZiB0aGUgY2FyZ29RdWV1ZSBhbmQgaW5uZXIgcXVldWUuXG4gICAgICogQGV4YW1wbGVcbiAgICAgKlxuICAgICAqIC8vIGNyZWF0ZSBhIGNhcmdvUXVldWUgb2JqZWN0IHdpdGggcGF5bG9hZCAyIGFuZCBjb25jdXJyZW5jeSAyXG4gICAgICogdmFyIGNhcmdvUXVldWUgPSBhc3luYy5jYXJnb1F1ZXVlKGZ1bmN0aW9uKHRhc2tzLCBjYWxsYmFjaykge1xuICAgICAqICAgICBmb3IgKHZhciBpPTA7IGk8dGFza3MubGVuZ3RoOyBpKyspIHtcbiAgICAgKiAgICAgICAgIGNvbnNvbGUubG9nKCdoZWxsbyAnICsgdGFza3NbaV0ubmFtZSk7XG4gICAgICogICAgIH1cbiAgICAgKiAgICAgY2FsbGJhY2soKTtcbiAgICAgKiB9LCAyLCAyKTtcbiAgICAgKlxuICAgICAqIC8vIGFkZCBzb21lIGl0ZW1zXG4gICAgICogY2FyZ29RdWV1ZS5wdXNoKHtuYW1lOiAnZm9vJ30sIGZ1bmN0aW9uKGVycikge1xuICAgICAqICAgICBjb25zb2xlLmxvZygnZmluaXNoZWQgcHJvY2Vzc2luZyBmb28nKTtcbiAgICAgKiB9KTtcbiAgICAgKiBjYXJnb1F1ZXVlLnB1c2goe25hbWU6ICdiYXInfSwgZnVuY3Rpb24oZXJyKSB7XG4gICAgICogICAgIGNvbnNvbGUubG9nKCdmaW5pc2hlZCBwcm9jZXNzaW5nIGJhcicpO1xuICAgICAqIH0pO1xuICAgICAqIGNhcmdvUXVldWUucHVzaCh7bmFtZTogJ2Jheid9LCBmdW5jdGlvbihlcnIpIHtcbiAgICAgKiAgICAgY29uc29sZS5sb2coJ2ZpbmlzaGVkIHByb2Nlc3NpbmcgYmF6Jyk7XG4gICAgICogfSk7XG4gICAgICogY2FyZ29RdWV1ZS5wdXNoKHtuYW1lOiAnYm9vJ30sIGZ1bmN0aW9uKGVycikge1xuICAgICAqICAgICBjb25zb2xlLmxvZygnZmluaXNoZWQgcHJvY2Vzc2luZyBib28nKTtcbiAgICAgKiB9KTtcbiAgICAgKi9cbiAgICBmdW5jdGlvbiBjYXJnbyh3b3JrZXIsIGNvbmN1cnJlbmN5LCBwYXlsb2FkKSB7XG4gICAgICAgIHJldHVybiBxdWV1ZSQxKHdvcmtlciwgY29uY3VycmVuY3ksIHBheWxvYWQpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFJlZHVjZXMgYGNvbGxgIGludG8gYSBzaW5nbGUgdmFsdWUgdXNpbmcgYW4gYXN5bmMgYGl0ZXJhdGVlYCB0byByZXR1cm4gZWFjaFxuICAgICAqIHN1Y2Nlc3NpdmUgc3RlcC4gYG1lbW9gIGlzIHRoZSBpbml0aWFsIHN0YXRlIG9mIHRoZSByZWR1Y3Rpb24uIFRoaXMgZnVuY3Rpb25cbiAgICAgKiBvbmx5IG9wZXJhdGVzIGluIHNlcmllcy5cbiAgICAgKlxuICAgICAqIEZvciBwZXJmb3JtYW5jZSByZWFzb25zLCBpdCBtYXkgbWFrZSBzZW5zZSB0byBzcGxpdCBhIGNhbGwgdG8gdGhpcyBmdW5jdGlvblxuICAgICAqIGludG8gYSBwYXJhbGxlbCBtYXAsIGFuZCB0aGVuIHVzZSB0aGUgbm9ybWFsIGBBcnJheS5wcm90b3R5cGUucmVkdWNlYCBvbiB0aGVcbiAgICAgKiByZXN1bHRzLiBUaGlzIGZ1bmN0aW9uIGlzIGZvciBzaXR1YXRpb25zIHdoZXJlIGVhY2ggc3RlcCBpbiB0aGUgcmVkdWN0aW9uXG4gICAgICogbmVlZHMgdG8gYmUgYXN5bmM7IGlmIHlvdSBjYW4gZ2V0IHRoZSBkYXRhIGJlZm9yZSByZWR1Y2luZyBpdCwgdGhlbiBpdCdzXG4gICAgICogcHJvYmFibHkgYSBnb29kIGlkZWEgdG8gZG8gc28uXG4gICAgICpcbiAgICAgKiBAbmFtZSByZWR1Y2VcbiAgICAgKiBAc3RhdGljXG4gICAgICogQG1lbWJlck9mIG1vZHVsZTpDb2xsZWN0aW9uc1xuICAgICAqIEBtZXRob2RcbiAgICAgKiBAYWxpYXMgaW5qZWN0XG4gICAgICogQGFsaWFzIGZvbGRsXG4gICAgICogQGNhdGVnb3J5IENvbGxlY3Rpb25cbiAgICAgKiBAcGFyYW0ge0FycmF5fEl0ZXJhYmxlfEFzeW5jSXRlcmFibGV8T2JqZWN0fSBjb2xsIC0gQSBjb2xsZWN0aW9uIHRvIGl0ZXJhdGUgb3Zlci5cbiAgICAgKiBAcGFyYW0geyp9IG1lbW8gLSBUaGUgaW5pdGlhbCBzdGF0ZSBvZiB0aGUgcmVkdWN0aW9uLlxuICAgICAqIEBwYXJhbSB7QXN5bmNGdW5jdGlvbn0gaXRlcmF0ZWUgLSBBIGZ1bmN0aW9uIGFwcGxpZWQgdG8gZWFjaCBpdGVtIGluIHRoZVxuICAgICAqIGFycmF5IHRvIHByb2R1Y2UgdGhlIG5leHQgc3RlcCBpbiB0aGUgcmVkdWN0aW9uLlxuICAgICAqIFRoZSBgaXRlcmF0ZWVgIHNob3VsZCBjb21wbGV0ZSB3aXRoIHRoZSBuZXh0IHN0YXRlIG9mIHRoZSByZWR1Y3Rpb24uXG4gICAgICogSWYgdGhlIGl0ZXJhdGVlIGNvbXBsZXRlcyB3aXRoIGFuIGVycm9yLCB0aGUgcmVkdWN0aW9uIGlzIHN0b3BwZWQgYW5kIHRoZVxuICAgICAqIG1haW4gYGNhbGxiYWNrYCBpcyBpbW1lZGlhdGVseSBjYWxsZWQgd2l0aCB0aGUgZXJyb3IuXG4gICAgICogSW52b2tlZCB3aXRoIChtZW1vLCBpdGVtLCBjYWxsYmFjaykuXG4gICAgICogQHBhcmFtIHtGdW5jdGlvbn0gW2NhbGxiYWNrXSAtIEEgY2FsbGJhY2sgd2hpY2ggaXMgY2FsbGVkIGFmdGVyIGFsbCB0aGVcbiAgICAgKiBgaXRlcmF0ZWVgIGZ1bmN0aW9ucyBoYXZlIGZpbmlzaGVkLiBSZXN1bHQgaXMgdGhlIHJlZHVjZWQgdmFsdWUuIEludm9rZWQgd2l0aFxuICAgICAqIChlcnIsIHJlc3VsdCkuXG4gICAgICogQHJldHVybnMge1Byb21pc2V9IGEgcHJvbWlzZSwgaWYgbm8gY2FsbGJhY2sgaXMgcGFzc2VkXG4gICAgICogQGV4YW1wbGVcbiAgICAgKlxuICAgICAqIC8vIGZpbGUxLnR4dCBpcyBhIGZpbGUgdGhhdCBpcyAxMDAwIGJ5dGVzIGluIHNpemVcbiAgICAgKiAvLyBmaWxlMi50eHQgaXMgYSBmaWxlIHRoYXQgaXMgMjAwMCBieXRlcyBpbiBzaXplXG4gICAgICogLy8gZmlsZTMudHh0IGlzIGEgZmlsZSB0aGF0IGlzIDMwMDAgYnl0ZXMgaW4gc2l6ZVxuICAgICAqIC8vIGZpbGU0LnR4dCBkb2VzIG5vdCBleGlzdFxuICAgICAqXG4gICAgICogY29uc3QgZmlsZUxpc3QgPSBbJ2ZpbGUxLnR4dCcsJ2ZpbGUyLnR4dCcsJ2ZpbGUzLnR4dCddO1xuICAgICAqIGNvbnN0IHdpdGhNaXNzaW5nRmlsZUxpc3QgPSBbJ2ZpbGUxLnR4dCcsJ2ZpbGUyLnR4dCcsJ2ZpbGUzLnR4dCcsICdmaWxlNC50eHQnXTtcbiAgICAgKlxuICAgICAqIC8vIGFzeW5jaHJvbm91cyBmdW5jdGlvbiB0aGF0IGNvbXB1dGVzIHRoZSBmaWxlIHNpemUgaW4gYnl0ZXNcbiAgICAgKiAvLyBmaWxlIHNpemUgaXMgYWRkZWQgdG8gdGhlIG1lbW9pemVkIHZhbHVlLCB0aGVuIHJldHVybmVkXG4gICAgICogZnVuY3Rpb24gZ2V0RmlsZVNpemVJbkJ5dGVzKG1lbW8sIGZpbGUsIGNhbGxiYWNrKSB7XG4gICAgICogICAgIGZzLnN0YXQoZmlsZSwgZnVuY3Rpb24oZXJyLCBzdGF0KSB7XG4gICAgICogICAgICAgICBpZiAoZXJyKSB7XG4gICAgICogICAgICAgICAgICAgcmV0dXJuIGNhbGxiYWNrKGVycik7XG4gICAgICogICAgICAgICB9XG4gICAgICogICAgICAgICBjYWxsYmFjayhudWxsLCBtZW1vICsgc3RhdC5zaXplKTtcbiAgICAgKiAgICAgfSk7XG4gICAgICogfVxuICAgICAqXG4gICAgICogLy8gVXNpbmcgY2FsbGJhY2tzXG4gICAgICogYXN5bmMucmVkdWNlKGZpbGVMaXN0LCAwLCBnZXRGaWxlU2l6ZUluQnl0ZXMsIGZ1bmN0aW9uKGVyciwgcmVzdWx0KSB7XG4gICAgICogICAgIGlmIChlcnIpIHtcbiAgICAgKiAgICAgICAgIGNvbnNvbGUubG9nKGVycik7XG4gICAgICogICAgIH0gZWxzZSB7XG4gICAgICogICAgICAgICBjb25zb2xlLmxvZyhyZXN1bHQpO1xuICAgICAqICAgICAgICAgLy8gNjAwMFxuICAgICAqICAgICAgICAgLy8gd2hpY2ggaXMgdGhlIHN1bSBvZiB0aGUgZmlsZSBzaXplcyBvZiB0aGUgdGhyZWUgZmlsZXNcbiAgICAgKiAgICAgfVxuICAgICAqIH0pO1xuICAgICAqXG4gICAgICogLy8gRXJyb3IgSGFuZGxpbmdcbiAgICAgKiBhc3luYy5yZWR1Y2Uod2l0aE1pc3NpbmdGaWxlTGlzdCwgMCwgZ2V0RmlsZVNpemVJbkJ5dGVzLCBmdW5jdGlvbihlcnIsIHJlc3VsdCkge1xuICAgICAqICAgICBpZiAoZXJyKSB7XG4gICAgICogICAgICAgICBjb25zb2xlLmxvZyhlcnIpO1xuICAgICAqICAgICAgICAgLy8gWyBFcnJvcjogRU5PRU5UOiBubyBzdWNoIGZpbGUgb3IgZGlyZWN0b3J5IF1cbiAgICAgKiAgICAgfSBlbHNlIHtcbiAgICAgKiAgICAgICAgIGNvbnNvbGUubG9nKHJlc3VsdCk7XG4gICAgICogICAgIH1cbiAgICAgKiB9KTtcbiAgICAgKlxuICAgICAqIC8vIFVzaW5nIFByb21pc2VzXG4gICAgICogYXN5bmMucmVkdWNlKGZpbGVMaXN0LCAwLCBnZXRGaWxlU2l6ZUluQnl0ZXMpXG4gICAgICogLnRoZW4oIHJlc3VsdCA9PiB7XG4gICAgICogICAgIGNvbnNvbGUubG9nKHJlc3VsdCk7XG4gICAgICogICAgIC8vIDYwMDBcbiAgICAgKiAgICAgLy8gd2hpY2ggaXMgdGhlIHN1bSBvZiB0aGUgZmlsZSBzaXplcyBvZiB0aGUgdGhyZWUgZmlsZXNcbiAgICAgKiB9KS5jYXRjaCggZXJyID0+IHtcbiAgICAgKiAgICAgY29uc29sZS5sb2coZXJyKTtcbiAgICAgKiB9KTtcbiAgICAgKlxuICAgICAqIC8vIEVycm9yIEhhbmRsaW5nXG4gICAgICogYXN5bmMucmVkdWNlKHdpdGhNaXNzaW5nRmlsZUxpc3QsIDAsIGdldEZpbGVTaXplSW5CeXRlcylcbiAgICAgKiAudGhlbiggcmVzdWx0ID0+IHtcbiAgICAgKiAgICAgY29uc29sZS5sb2cocmVzdWx0KTtcbiAgICAgKiB9KS5jYXRjaCggZXJyID0+IHtcbiAgICAgKiAgICAgY29uc29sZS5sb2coZXJyKTtcbiAgICAgKiAgICAgLy8gWyBFcnJvcjogRU5PRU5UOiBubyBzdWNoIGZpbGUgb3IgZGlyZWN0b3J5IF1cbiAgICAgKiB9KTtcbiAgICAgKlxuICAgICAqIC8vIFVzaW5nIGFzeW5jL2F3YWl0XG4gICAgICogYXN5bmMgKCkgPT4ge1xuICAgICAqICAgICB0cnkge1xuICAgICAqICAgICAgICAgbGV0IHJlc3VsdCA9IGF3YWl0IGFzeW5jLnJlZHVjZShmaWxlTGlzdCwgMCwgZ2V0RmlsZVNpemVJbkJ5dGVzKTtcbiAgICAgKiAgICAgICAgIGNvbnNvbGUubG9nKHJlc3VsdCk7XG4gICAgICogICAgICAgICAvLyA2MDAwXG4gICAgICogICAgICAgICAvLyB3aGljaCBpcyB0aGUgc3VtIG9mIHRoZSBmaWxlIHNpemVzIG9mIHRoZSB0aHJlZSBmaWxlc1xuICAgICAqICAgICB9XG4gICAgICogICAgIGNhdGNoIChlcnIpIHtcbiAgICAgKiAgICAgICAgIGNvbnNvbGUubG9nKGVycik7XG4gICAgICogICAgIH1cbiAgICAgKiB9XG4gICAgICpcbiAgICAgKiAvLyBFcnJvciBIYW5kbGluZ1xuICAgICAqIGFzeW5jICgpID0+IHtcbiAgICAgKiAgICAgdHJ5IHtcbiAgICAgKiAgICAgICAgIGxldCByZXN1bHQgPSBhd2FpdCBhc3luYy5yZWR1Y2Uod2l0aE1pc3NpbmdGaWxlTGlzdCwgMCwgZ2V0RmlsZVNpemVJbkJ5dGVzKTtcbiAgICAgKiAgICAgICAgIGNvbnNvbGUubG9nKHJlc3VsdCk7XG4gICAgICogICAgIH1cbiAgICAgKiAgICAgY2F0Y2ggKGVycikge1xuICAgICAqICAgICAgICAgY29uc29sZS5sb2coZXJyKTtcbiAgICAgKiAgICAgICAgIC8vIFsgRXJyb3I6IEVOT0VOVDogbm8gc3VjaCBmaWxlIG9yIGRpcmVjdG9yeSBdXG4gICAgICogICAgIH1cbiAgICAgKiB9XG4gICAgICpcbiAgICAgKi9cbiAgICBmdW5jdGlvbiByZWR1Y2UoY29sbCwgbWVtbywgaXRlcmF0ZWUsIGNhbGxiYWNrKSB7XG4gICAgICAgIGNhbGxiYWNrID0gb25jZShjYWxsYmFjayk7XG4gICAgICAgIHZhciBfaXRlcmF0ZWUgPSB3cmFwQXN5bmMoaXRlcmF0ZWUpO1xuICAgICAgICByZXR1cm4gZWFjaE9mU2VyaWVzJDEoY29sbCwgKHgsIGksIGl0ZXJDYikgPT4ge1xuICAgICAgICAgICAgX2l0ZXJhdGVlKG1lbW8sIHgsIChlcnIsIHYpID0+IHtcbiAgICAgICAgICAgICAgICBtZW1vID0gdjtcbiAgICAgICAgICAgICAgICBpdGVyQ2IoZXJyKTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9LCBlcnIgPT4gY2FsbGJhY2soZXJyLCBtZW1vKSk7XG4gICAgfVxuICAgIHZhciByZWR1Y2UkMSA9IGF3YWl0aWZ5KHJlZHVjZSwgNCk7XG5cbiAgICAvKipcbiAgICAgKiBWZXJzaW9uIG9mIHRoZSBjb21wb3NlIGZ1bmN0aW9uIHRoYXQgaXMgbW9yZSBuYXR1cmFsIHRvIHJlYWQuIEVhY2ggZnVuY3Rpb25cbiAgICAgKiBjb25zdW1lcyB0aGUgcmV0dXJuIHZhbHVlIG9mIHRoZSBwcmV2aW91cyBmdW5jdGlvbi4gSXQgaXMgdGhlIGVxdWl2YWxlbnQgb2ZcbiAgICAgKiBbY29tcG9zZV17QGxpbmsgbW9kdWxlOkNvbnRyb2xGbG93LmNvbXBvc2V9IHdpdGggdGhlIGFyZ3VtZW50cyByZXZlcnNlZC5cbiAgICAgKlxuICAgICAqIEVhY2ggZnVuY3Rpb24gaXMgZXhlY3V0ZWQgd2l0aCB0aGUgYHRoaXNgIGJpbmRpbmcgb2YgdGhlIGNvbXBvc2VkIGZ1bmN0aW9uLlxuICAgICAqXG4gICAgICogQG5hbWUgc2VxXG4gICAgICogQHN0YXRpY1xuICAgICAqIEBtZW1iZXJPZiBtb2R1bGU6Q29udHJvbEZsb3dcbiAgICAgKiBAbWV0aG9kXG4gICAgICogQHNlZSBbYXN5bmMuY29tcG9zZV17QGxpbmsgbW9kdWxlOkNvbnRyb2xGbG93LmNvbXBvc2V9XG4gICAgICogQGNhdGVnb3J5IENvbnRyb2wgRmxvd1xuICAgICAqIEBwYXJhbSB7Li4uQXN5bmNGdW5jdGlvbn0gZnVuY3Rpb25zIC0gdGhlIGFzeW5jaHJvbm91cyBmdW5jdGlvbnMgdG8gY29tcG9zZVxuICAgICAqIEByZXR1cm5zIHtGdW5jdGlvbn0gYSBmdW5jdGlvbiB0aGF0IGNvbXBvc2VzIHRoZSBgZnVuY3Rpb25zYCBpbiBvcmRlclxuICAgICAqIEBleGFtcGxlXG4gICAgICpcbiAgICAgKiAvLyBSZXF1aXJlcyBsb2Rhc2ggKG9yIHVuZGVyc2NvcmUpLCBleHByZXNzMyBhbmQgZHJlc2VuZGUncyBvcm0yLlxuICAgICAqIC8vIFBhcnQgb2YgYW4gYXBwLCB0aGF0IGZldGNoZXMgY2F0cyBvZiB0aGUgbG9nZ2VkIHVzZXIuXG4gICAgICogLy8gVGhpcyBleGFtcGxlIHVzZXMgYHNlcWAgZnVuY3Rpb24gdG8gYXZvaWQgb3Zlcm5lc3RpbmcgYW5kIGVycm9yXG4gICAgICogLy8gaGFuZGxpbmcgY2x1dHRlci5cbiAgICAgKiBhcHAuZ2V0KCcvY2F0cycsIGZ1bmN0aW9uKHJlcXVlc3QsIHJlc3BvbnNlKSB7XG4gICAgICogICAgIHZhciBVc2VyID0gcmVxdWVzdC5tb2RlbHMuVXNlcjtcbiAgICAgKiAgICAgYXN5bmMuc2VxKFxuICAgICAqICAgICAgICAgVXNlci5nZXQuYmluZChVc2VyKSwgIC8vICdVc2VyLmdldCcgaGFzIHNpZ25hdHVyZSAoaWQsIGNhbGxiYWNrKGVyciwgZGF0YSkpXG4gICAgICogICAgICAgICBmdW5jdGlvbih1c2VyLCBmbikge1xuICAgICAqICAgICAgICAgICAgIHVzZXIuZ2V0Q2F0cyhmbik7ICAgICAgLy8gJ2dldENhdHMnIGhhcyBzaWduYXR1cmUgKGNhbGxiYWNrKGVyciwgZGF0YSkpXG4gICAgICogICAgICAgICB9XG4gICAgICogICAgICkocmVxLnNlc3Npb24udXNlcl9pZCwgZnVuY3Rpb24gKGVyciwgY2F0cykge1xuICAgICAqICAgICAgICAgaWYgKGVycikge1xuICAgICAqICAgICAgICAgICAgIGNvbnNvbGUuZXJyb3IoZXJyKTtcbiAgICAgKiAgICAgICAgICAgICByZXNwb25zZS5qc29uKHsgc3RhdHVzOiAnZXJyb3InLCBtZXNzYWdlOiBlcnIubWVzc2FnZSB9KTtcbiAgICAgKiAgICAgICAgIH0gZWxzZSB7XG4gICAgICogICAgICAgICAgICAgcmVzcG9uc2UuanNvbih7IHN0YXR1czogJ29rJywgbWVzc2FnZTogJ0NhdHMgZm91bmQnLCBkYXRhOiBjYXRzIH0pO1xuICAgICAqICAgICAgICAgfVxuICAgICAqICAgICB9KTtcbiAgICAgKiB9KTtcbiAgICAgKi9cbiAgICBmdW5jdGlvbiBzZXEoLi4uZnVuY3Rpb25zKSB7XG4gICAgICAgIHZhciBfZnVuY3Rpb25zID0gZnVuY3Rpb25zLm1hcCh3cmFwQXN5bmMpO1xuICAgICAgICByZXR1cm4gZnVuY3Rpb24gKC4uLmFyZ3MpIHtcbiAgICAgICAgICAgIHZhciB0aGF0ID0gdGhpcztcblxuICAgICAgICAgICAgdmFyIGNiID0gYXJnc1thcmdzLmxlbmd0aCAtIDFdO1xuICAgICAgICAgICAgaWYgKHR5cGVvZiBjYiA9PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgICAgICAgICAgYXJncy5wb3AoKTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgY2IgPSBwcm9taXNlQ2FsbGJhY2soKTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgcmVkdWNlJDEoX2Z1bmN0aW9ucywgYXJncywgKG5ld2FyZ3MsIGZuLCBpdGVyQ2IpID0+IHtcbiAgICAgICAgICAgICAgICBmbi5hcHBseSh0aGF0LCBuZXdhcmdzLmNvbmNhdCgoZXJyLCAuLi5uZXh0YXJncykgPT4ge1xuICAgICAgICAgICAgICAgICAgICBpdGVyQ2IoZXJyLCBuZXh0YXJncyk7XG4gICAgICAgICAgICAgICAgfSkpO1xuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIChlcnIsIHJlc3VsdHMpID0+IGNiKGVyciwgLi4ucmVzdWx0cykpO1xuXG4gICAgICAgICAgICByZXR1cm4gY2JbUFJPTUlTRV9TWU1CT0xdXG4gICAgICAgIH07XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQ3JlYXRlcyBhIGZ1bmN0aW9uIHdoaWNoIGlzIGEgY29tcG9zaXRpb24gb2YgdGhlIHBhc3NlZCBhc3luY2hyb25vdXNcbiAgICAgKiBmdW5jdGlvbnMuIEVhY2ggZnVuY3Rpb24gY29uc3VtZXMgdGhlIHJldHVybiB2YWx1ZSBvZiB0aGUgZnVuY3Rpb24gdGhhdFxuICAgICAqIGZvbGxvd3MuIENvbXBvc2luZyBmdW5jdGlvbnMgYGYoKWAsIGBnKClgLCBhbmQgYGgoKWAgd291bGQgcHJvZHVjZSB0aGUgcmVzdWx0XG4gICAgICogb2YgYGYoZyhoKCkpKWAsIG9ubHkgdGhpcyB2ZXJzaW9uIHVzZXMgY2FsbGJhY2tzIHRvIG9idGFpbiB0aGUgcmV0dXJuIHZhbHVlcy5cbiAgICAgKlxuICAgICAqIElmIHRoZSBsYXN0IGFyZ3VtZW50IHRvIHRoZSBjb21wb3NlZCBmdW5jdGlvbiBpcyBub3QgYSBmdW5jdGlvbiwgYSBwcm9taXNlXG4gICAgICogaXMgcmV0dXJuZWQgd2hlbiB5b3UgY2FsbCBpdC5cbiAgICAgKlxuICAgICAqIEVhY2ggZnVuY3Rpb24gaXMgZXhlY3V0ZWQgd2l0aCB0aGUgYHRoaXNgIGJpbmRpbmcgb2YgdGhlIGNvbXBvc2VkIGZ1bmN0aW9uLlxuICAgICAqXG4gICAgICogQG5hbWUgY29tcG9zZVxuICAgICAqIEBzdGF0aWNcbiAgICAgKiBAbWVtYmVyT2YgbW9kdWxlOkNvbnRyb2xGbG93XG4gICAgICogQG1ldGhvZFxuICAgICAqIEBjYXRlZ29yeSBDb250cm9sIEZsb3dcbiAgICAgKiBAcGFyYW0gey4uLkFzeW5jRnVuY3Rpb259IGZ1bmN0aW9ucyAtIHRoZSBhc3luY2hyb25vdXMgZnVuY3Rpb25zIHRvIGNvbXBvc2VcbiAgICAgKiBAcmV0dXJucyB7RnVuY3Rpb259IGFuIGFzeW5jaHJvbm91cyBmdW5jdGlvbiB0aGF0IGlzIHRoZSBjb21wb3NlZFxuICAgICAqIGFzeW5jaHJvbm91cyBgZnVuY3Rpb25zYFxuICAgICAqIEBleGFtcGxlXG4gICAgICpcbiAgICAgKiBmdW5jdGlvbiBhZGQxKG4sIGNhbGxiYWNrKSB7XG4gICAgICogICAgIHNldFRpbWVvdXQoZnVuY3Rpb24gKCkge1xuICAgICAqICAgICAgICAgY2FsbGJhY2sobnVsbCwgbiArIDEpO1xuICAgICAqICAgICB9LCAxMCk7XG4gICAgICogfVxuICAgICAqXG4gICAgICogZnVuY3Rpb24gbXVsMyhuLCBjYWxsYmFjaykge1xuICAgICAqICAgICBzZXRUaW1lb3V0KGZ1bmN0aW9uICgpIHtcbiAgICAgKiAgICAgICAgIGNhbGxiYWNrKG51bGwsIG4gKiAzKTtcbiAgICAgKiAgICAgfSwgMTApO1xuICAgICAqIH1cbiAgICAgKlxuICAgICAqIHZhciBhZGQxbXVsMyA9IGFzeW5jLmNvbXBvc2UobXVsMywgYWRkMSk7XG4gICAgICogYWRkMW11bDMoNCwgZnVuY3Rpb24gKGVyciwgcmVzdWx0KSB7XG4gICAgICogICAgIC8vIHJlc3VsdCBub3cgZXF1YWxzIDE1XG4gICAgICogfSk7XG4gICAgICovXG4gICAgZnVuY3Rpb24gY29tcG9zZSguLi5hcmdzKSB7XG4gICAgICAgIHJldHVybiBzZXEoLi4uYXJncy5yZXZlcnNlKCkpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFRoZSBzYW1lIGFzIFtgbWFwYF17QGxpbmsgbW9kdWxlOkNvbGxlY3Rpb25zLm1hcH0gYnV0IHJ1bnMgYSBtYXhpbXVtIG9mIGBsaW1pdGAgYXN5bmMgb3BlcmF0aW9ucyBhdCBhIHRpbWUuXG4gICAgICpcbiAgICAgKiBAbmFtZSBtYXBMaW1pdFxuICAgICAqIEBzdGF0aWNcbiAgICAgKiBAbWVtYmVyT2YgbW9kdWxlOkNvbGxlY3Rpb25zXG4gICAgICogQG1ldGhvZFxuICAgICAqIEBzZWUgW2FzeW5jLm1hcF17QGxpbmsgbW9kdWxlOkNvbGxlY3Rpb25zLm1hcH1cbiAgICAgKiBAY2F0ZWdvcnkgQ29sbGVjdGlvblxuICAgICAqIEBwYXJhbSB7QXJyYXl8SXRlcmFibGV8QXN5bmNJdGVyYWJsZXxPYmplY3R9IGNvbGwgLSBBIGNvbGxlY3Rpb24gdG8gaXRlcmF0ZSBvdmVyLlxuICAgICAqIEBwYXJhbSB7bnVtYmVyfSBsaW1pdCAtIFRoZSBtYXhpbXVtIG51bWJlciBvZiBhc3luYyBvcGVyYXRpb25zIGF0IGEgdGltZS5cbiAgICAgKiBAcGFyYW0ge0FzeW5jRnVuY3Rpb259IGl0ZXJhdGVlIC0gQW4gYXN5bmMgZnVuY3Rpb24gdG8gYXBwbHkgdG8gZWFjaCBpdGVtIGluXG4gICAgICogYGNvbGxgLlxuICAgICAqIFRoZSBpdGVyYXRlZSBzaG91bGQgY29tcGxldGUgd2l0aCB0aGUgdHJhbnNmb3JtZWQgaXRlbS5cbiAgICAgKiBJbnZva2VkIHdpdGggKGl0ZW0sIGNhbGxiYWNrKS5cbiAgICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBbY2FsbGJhY2tdIC0gQSBjYWxsYmFjayB3aGljaCBpcyBjYWxsZWQgd2hlbiBhbGwgYGl0ZXJhdGVlYFxuICAgICAqIGZ1bmN0aW9ucyBoYXZlIGZpbmlzaGVkLCBvciBhbiBlcnJvciBvY2N1cnMuIFJlc3VsdHMgaXMgYW4gYXJyYXkgb2YgdGhlXG4gICAgICogdHJhbnNmb3JtZWQgaXRlbXMgZnJvbSB0aGUgYGNvbGxgLiBJbnZva2VkIHdpdGggKGVyciwgcmVzdWx0cykuXG4gICAgICogQHJldHVybnMge1Byb21pc2V9IGEgcHJvbWlzZSwgaWYgbm8gY2FsbGJhY2sgaXMgcGFzc2VkXG4gICAgICovXG4gICAgZnVuY3Rpb24gbWFwTGltaXQgKGNvbGwsIGxpbWl0LCBpdGVyYXRlZSwgY2FsbGJhY2spIHtcbiAgICAgICAgcmV0dXJuIF9hc3luY01hcChlYWNoT2ZMaW1pdCQyKGxpbWl0KSwgY29sbCwgaXRlcmF0ZWUsIGNhbGxiYWNrKVxuICAgIH1cbiAgICB2YXIgbWFwTGltaXQkMSA9IGF3YWl0aWZ5KG1hcExpbWl0LCA0KTtcblxuICAgIC8qKlxuICAgICAqIFRoZSBzYW1lIGFzIFtgY29uY2F0YF17QGxpbmsgbW9kdWxlOkNvbGxlY3Rpb25zLmNvbmNhdH0gYnV0IHJ1bnMgYSBtYXhpbXVtIG9mIGBsaW1pdGAgYXN5bmMgb3BlcmF0aW9ucyBhdCBhIHRpbWUuXG4gICAgICpcbiAgICAgKiBAbmFtZSBjb25jYXRMaW1pdFxuICAgICAqIEBzdGF0aWNcbiAgICAgKiBAbWVtYmVyT2YgbW9kdWxlOkNvbGxlY3Rpb25zXG4gICAgICogQG1ldGhvZFxuICAgICAqIEBzZWUgW2FzeW5jLmNvbmNhdF17QGxpbmsgbW9kdWxlOkNvbGxlY3Rpb25zLmNvbmNhdH1cbiAgICAgKiBAY2F0ZWdvcnkgQ29sbGVjdGlvblxuICAgICAqIEBhbGlhcyBmbGF0TWFwTGltaXRcbiAgICAgKiBAcGFyYW0ge0FycmF5fEl0ZXJhYmxlfEFzeW5jSXRlcmFibGV8T2JqZWN0fSBjb2xsIC0gQSBjb2xsZWN0aW9uIHRvIGl0ZXJhdGUgb3Zlci5cbiAgICAgKiBAcGFyYW0ge251bWJlcn0gbGltaXQgLSBUaGUgbWF4aW11bSBudW1iZXIgb2YgYXN5bmMgb3BlcmF0aW9ucyBhdCBhIHRpbWUuXG4gICAgICogQHBhcmFtIHtBc3luY0Z1bmN0aW9ufSBpdGVyYXRlZSAtIEEgZnVuY3Rpb24gdG8gYXBwbHkgdG8gZWFjaCBpdGVtIGluIGBjb2xsYCxcbiAgICAgKiB3aGljaCBzaG91bGQgdXNlIGFuIGFycmF5IGFzIGl0cyByZXN1bHQuIEludm9rZWQgd2l0aCAoaXRlbSwgY2FsbGJhY2spLlxuICAgICAqIEBwYXJhbSB7RnVuY3Rpb259IFtjYWxsYmFja10gLSBBIGNhbGxiYWNrIHdoaWNoIGlzIGNhbGxlZCBhZnRlciBhbGwgdGhlXG4gICAgICogYGl0ZXJhdGVlYCBmdW5jdGlvbnMgaGF2ZSBmaW5pc2hlZCwgb3IgYW4gZXJyb3Igb2NjdXJzLiBSZXN1bHRzIGlzIGFuIGFycmF5XG4gICAgICogY29udGFpbmluZyB0aGUgY29uY2F0ZW5hdGVkIHJlc3VsdHMgb2YgdGhlIGBpdGVyYXRlZWAgZnVuY3Rpb24uIEludm9rZWQgd2l0aFxuICAgICAqIChlcnIsIHJlc3VsdHMpLlxuICAgICAqIEByZXR1cm5zIEEgUHJvbWlzZSwgaWYgbm8gY2FsbGJhY2sgaXMgcGFzc2VkXG4gICAgICovXG4gICAgZnVuY3Rpb24gY29uY2F0TGltaXQoY29sbCwgbGltaXQsIGl0ZXJhdGVlLCBjYWxsYmFjaykge1xuICAgICAgICB2YXIgX2l0ZXJhdGVlID0gd3JhcEFzeW5jKGl0ZXJhdGVlKTtcbiAgICAgICAgcmV0dXJuIG1hcExpbWl0JDEoY29sbCwgbGltaXQsICh2YWwsIGl0ZXJDYikgPT4ge1xuICAgICAgICAgICAgX2l0ZXJhdGVlKHZhbCwgKGVyciwgLi4uYXJncykgPT4ge1xuICAgICAgICAgICAgICAgIGlmIChlcnIpIHJldHVybiBpdGVyQ2IoZXJyKTtcbiAgICAgICAgICAgICAgICByZXR1cm4gaXRlckNiKGVyciwgYXJncyk7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfSwgKGVyciwgbWFwUmVzdWx0cykgPT4ge1xuICAgICAgICAgICAgdmFyIHJlc3VsdCA9IFtdO1xuICAgICAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBtYXBSZXN1bHRzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICAgICAgaWYgKG1hcFJlc3VsdHNbaV0pIHtcbiAgICAgICAgICAgICAgICAgICAgcmVzdWx0ID0gcmVzdWx0LmNvbmNhdCguLi5tYXBSZXN1bHRzW2ldKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIHJldHVybiBjYWxsYmFjayhlcnIsIHJlc3VsdCk7XG4gICAgICAgIH0pO1xuICAgIH1cbiAgICB2YXIgY29uY2F0TGltaXQkMSA9IGF3YWl0aWZ5KGNvbmNhdExpbWl0LCA0KTtcblxuICAgIC8qKlxuICAgICAqIEFwcGxpZXMgYGl0ZXJhdGVlYCB0byBlYWNoIGl0ZW0gaW4gYGNvbGxgLCBjb25jYXRlbmF0aW5nIHRoZSByZXN1bHRzLiBSZXR1cm5zXG4gICAgICogdGhlIGNvbmNhdGVuYXRlZCBsaXN0LiBUaGUgYGl0ZXJhdGVlYHMgYXJlIGNhbGxlZCBpbiBwYXJhbGxlbCwgYW5kIHRoZVxuICAgICAqIHJlc3VsdHMgYXJlIGNvbmNhdGVuYXRlZCBhcyB0aGV5IHJldHVybi4gVGhlIHJlc3VsdHMgYXJyYXkgd2lsbCBiZSByZXR1cm5lZCBpblxuICAgICAqIHRoZSBvcmlnaW5hbCBvcmRlciBvZiBgY29sbGAgcGFzc2VkIHRvIHRoZSBgaXRlcmF0ZWVgIGZ1bmN0aW9uLlxuICAgICAqXG4gICAgICogQG5hbWUgY29uY2F0XG4gICAgICogQHN0YXRpY1xuICAgICAqIEBtZW1iZXJPZiBtb2R1bGU6Q29sbGVjdGlvbnNcbiAgICAgKiBAbWV0aG9kXG4gICAgICogQGNhdGVnb3J5IENvbGxlY3Rpb25cbiAgICAgKiBAYWxpYXMgZmxhdE1hcFxuICAgICAqIEBwYXJhbSB7QXJyYXl8SXRlcmFibGV8QXN5bmNJdGVyYWJsZXxPYmplY3R9IGNvbGwgLSBBIGNvbGxlY3Rpb24gdG8gaXRlcmF0ZSBvdmVyLlxuICAgICAqIEBwYXJhbSB7QXN5bmNGdW5jdGlvbn0gaXRlcmF0ZWUgLSBBIGZ1bmN0aW9uIHRvIGFwcGx5IHRvIGVhY2ggaXRlbSBpbiBgY29sbGAsXG4gICAgICogd2hpY2ggc2hvdWxkIHVzZSBhbiBhcnJheSBhcyBpdHMgcmVzdWx0LiBJbnZva2VkIHdpdGggKGl0ZW0sIGNhbGxiYWNrKS5cbiAgICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBbY2FsbGJhY2tdIC0gQSBjYWxsYmFjayB3aGljaCBpcyBjYWxsZWQgYWZ0ZXIgYWxsIHRoZVxuICAgICAqIGBpdGVyYXRlZWAgZnVuY3Rpb25zIGhhdmUgZmluaXNoZWQsIG9yIGFuIGVycm9yIG9jY3Vycy4gUmVzdWx0cyBpcyBhbiBhcnJheVxuICAgICAqIGNvbnRhaW5pbmcgdGhlIGNvbmNhdGVuYXRlZCByZXN1bHRzIG9mIHRoZSBgaXRlcmF0ZWVgIGZ1bmN0aW9uLiBJbnZva2VkIHdpdGhcbiAgICAgKiAoZXJyLCByZXN1bHRzKS5cbiAgICAgKiBAcmV0dXJucyBBIFByb21pc2UsIGlmIG5vIGNhbGxiYWNrIGlzIHBhc3NlZFxuICAgICAqIEBleGFtcGxlXG4gICAgICpcbiAgICAgKiAvLyBkaXIxIGlzIGEgZGlyZWN0b3J5IHRoYXQgY29udGFpbnMgZmlsZTEudHh0LCBmaWxlMi50eHRcbiAgICAgKiAvLyBkaXIyIGlzIGEgZGlyZWN0b3J5IHRoYXQgY29udGFpbnMgZmlsZTMudHh0LCBmaWxlNC50eHRcbiAgICAgKiAvLyBkaXIzIGlzIGEgZGlyZWN0b3J5IHRoYXQgY29udGFpbnMgZmlsZTUudHh0XG4gICAgICogLy8gZGlyNCBkb2VzIG5vdCBleGlzdFxuICAgICAqXG4gICAgICogbGV0IGRpcmVjdG9yeUxpc3QgPSBbJ2RpcjEnLCdkaXIyJywnZGlyMyddO1xuICAgICAqIGxldCB3aXRoTWlzc2luZ0RpcmVjdG9yeUxpc3QgPSBbJ2RpcjEnLCdkaXIyJywnZGlyMycsICdkaXI0J107XG4gICAgICpcbiAgICAgKiAvLyBVc2luZyBjYWxsYmFja3NcbiAgICAgKiBhc3luYy5jb25jYXQoZGlyZWN0b3J5TGlzdCwgZnMucmVhZGRpciwgZnVuY3Rpb24oZXJyLCByZXN1bHRzKSB7XG4gICAgICogICAgaWYgKGVycikge1xuICAgICAqICAgICAgICBjb25zb2xlLmxvZyhlcnIpO1xuICAgICAqICAgIH0gZWxzZSB7XG4gICAgICogICAgICAgIGNvbnNvbGUubG9nKHJlc3VsdHMpO1xuICAgICAqICAgICAgICAvLyBbICdmaWxlMS50eHQnLCAnZmlsZTIudHh0JywgJ2ZpbGUzLnR4dCcsICdmaWxlNC50eHQnLCBmaWxlNS50eHQgXVxuICAgICAqICAgIH1cbiAgICAgKiB9KTtcbiAgICAgKlxuICAgICAqIC8vIEVycm9yIEhhbmRsaW5nXG4gICAgICogYXN5bmMuY29uY2F0KHdpdGhNaXNzaW5nRGlyZWN0b3J5TGlzdCwgZnMucmVhZGRpciwgZnVuY3Rpb24oZXJyLCByZXN1bHRzKSB7XG4gICAgICogICAgaWYgKGVycikge1xuICAgICAqICAgICAgICBjb25zb2xlLmxvZyhlcnIpO1xuICAgICAqICAgICAgICAvLyBbIEVycm9yOiBFTk9FTlQ6IG5vIHN1Y2ggZmlsZSBvciBkaXJlY3RvcnkgXVxuICAgICAqICAgICAgICAvLyBzaW5jZSBkaXI0IGRvZXMgbm90IGV4aXN0XG4gICAgICogICAgfSBlbHNlIHtcbiAgICAgKiAgICAgICAgY29uc29sZS5sb2cocmVzdWx0cyk7XG4gICAgICogICAgfVxuICAgICAqIH0pO1xuICAgICAqXG4gICAgICogLy8gVXNpbmcgUHJvbWlzZXNcbiAgICAgKiBhc3luYy5jb25jYXQoZGlyZWN0b3J5TGlzdCwgZnMucmVhZGRpcilcbiAgICAgKiAudGhlbihyZXN1bHRzID0+IHtcbiAgICAgKiAgICAgY29uc29sZS5sb2cocmVzdWx0cyk7XG4gICAgICogICAgIC8vIFsgJ2ZpbGUxLnR4dCcsICdmaWxlMi50eHQnLCAnZmlsZTMudHh0JywgJ2ZpbGU0LnR4dCcsIGZpbGU1LnR4dCBdXG4gICAgICogfSkuY2F0Y2goZXJyID0+IHtcbiAgICAgKiAgICAgIGNvbnNvbGUubG9nKGVycik7XG4gICAgICogfSk7XG4gICAgICpcbiAgICAgKiAvLyBFcnJvciBIYW5kbGluZ1xuICAgICAqIGFzeW5jLmNvbmNhdCh3aXRoTWlzc2luZ0RpcmVjdG9yeUxpc3QsIGZzLnJlYWRkaXIpXG4gICAgICogLnRoZW4ocmVzdWx0cyA9PiB7XG4gICAgICogICAgIGNvbnNvbGUubG9nKHJlc3VsdHMpO1xuICAgICAqIH0pLmNhdGNoKGVyciA9PiB7XG4gICAgICogICAgIGNvbnNvbGUubG9nKGVycik7XG4gICAgICogICAgIC8vIFsgRXJyb3I6IEVOT0VOVDogbm8gc3VjaCBmaWxlIG9yIGRpcmVjdG9yeSBdXG4gICAgICogICAgIC8vIHNpbmNlIGRpcjQgZG9lcyBub3QgZXhpc3RcbiAgICAgKiB9KTtcbiAgICAgKlxuICAgICAqIC8vIFVzaW5nIGFzeW5jL2F3YWl0XG4gICAgICogYXN5bmMgKCkgPT4ge1xuICAgICAqICAgICB0cnkge1xuICAgICAqICAgICAgICAgbGV0IHJlc3VsdHMgPSBhd2FpdCBhc3luYy5jb25jYXQoZGlyZWN0b3J5TGlzdCwgZnMucmVhZGRpcik7XG4gICAgICogICAgICAgICBjb25zb2xlLmxvZyhyZXN1bHRzKTtcbiAgICAgKiAgICAgICAgIC8vIFsgJ2ZpbGUxLnR4dCcsICdmaWxlMi50eHQnLCAnZmlsZTMudHh0JywgJ2ZpbGU0LnR4dCcsIGZpbGU1LnR4dCBdXG4gICAgICogICAgIH0gY2F0Y2ggKGVycikge1xuICAgICAqICAgICAgICAgY29uc29sZS5sb2coZXJyKTtcbiAgICAgKiAgICAgfVxuICAgICAqIH1cbiAgICAgKlxuICAgICAqIC8vIEVycm9yIEhhbmRsaW5nXG4gICAgICogYXN5bmMgKCkgPT4ge1xuICAgICAqICAgICB0cnkge1xuICAgICAqICAgICAgICAgbGV0IHJlc3VsdHMgPSBhd2FpdCBhc3luYy5jb25jYXQod2l0aE1pc3NpbmdEaXJlY3RvcnlMaXN0LCBmcy5yZWFkZGlyKTtcbiAgICAgKiAgICAgICAgIGNvbnNvbGUubG9nKHJlc3VsdHMpO1xuICAgICAqICAgICB9IGNhdGNoIChlcnIpIHtcbiAgICAgKiAgICAgICAgIGNvbnNvbGUubG9nKGVycik7XG4gICAgICogICAgICAgICAvLyBbIEVycm9yOiBFTk9FTlQ6IG5vIHN1Y2ggZmlsZSBvciBkaXJlY3RvcnkgXVxuICAgICAqICAgICAgICAgLy8gc2luY2UgZGlyNCBkb2VzIG5vdCBleGlzdFxuICAgICAqICAgICB9XG4gICAgICogfVxuICAgICAqXG4gICAgICovXG4gICAgZnVuY3Rpb24gY29uY2F0KGNvbGwsIGl0ZXJhdGVlLCBjYWxsYmFjaykge1xuICAgICAgICByZXR1cm4gY29uY2F0TGltaXQkMShjb2xsLCBJbmZpbml0eSwgaXRlcmF0ZWUsIGNhbGxiYWNrKVxuICAgIH1cbiAgICB2YXIgY29uY2F0JDEgPSBhd2FpdGlmeShjb25jYXQsIDMpO1xuXG4gICAgLyoqXG4gICAgICogVGhlIHNhbWUgYXMgW2Bjb25jYXRgXXtAbGluayBtb2R1bGU6Q29sbGVjdGlvbnMuY29uY2F0fSBidXQgcnVucyBvbmx5IGEgc2luZ2xlIGFzeW5jIG9wZXJhdGlvbiBhdCBhIHRpbWUuXG4gICAgICpcbiAgICAgKiBAbmFtZSBjb25jYXRTZXJpZXNcbiAgICAgKiBAc3RhdGljXG4gICAgICogQG1lbWJlck9mIG1vZHVsZTpDb2xsZWN0aW9uc1xuICAgICAqIEBtZXRob2RcbiAgICAgKiBAc2VlIFthc3luYy5jb25jYXRde0BsaW5rIG1vZHVsZTpDb2xsZWN0aW9ucy5jb25jYXR9XG4gICAgICogQGNhdGVnb3J5IENvbGxlY3Rpb25cbiAgICAgKiBAYWxpYXMgZmxhdE1hcFNlcmllc1xuICAgICAqIEBwYXJhbSB7QXJyYXl8SXRlcmFibGV8QXN5bmNJdGVyYWJsZXxPYmplY3R9IGNvbGwgLSBBIGNvbGxlY3Rpb24gdG8gaXRlcmF0ZSBvdmVyLlxuICAgICAqIEBwYXJhbSB7QXN5bmNGdW5jdGlvbn0gaXRlcmF0ZWUgLSBBIGZ1bmN0aW9uIHRvIGFwcGx5IHRvIGVhY2ggaXRlbSBpbiBgY29sbGAuXG4gICAgICogVGhlIGl0ZXJhdGVlIHNob3VsZCBjb21wbGV0ZSB3aXRoIGFuIGFycmF5IGFuIGFycmF5IG9mIHJlc3VsdHMuXG4gICAgICogSW52b2tlZCB3aXRoIChpdGVtLCBjYWxsYmFjaykuXG4gICAgICogQHBhcmFtIHtGdW5jdGlvbn0gW2NhbGxiYWNrXSAtIEEgY2FsbGJhY2sgd2hpY2ggaXMgY2FsbGVkIGFmdGVyIGFsbCB0aGVcbiAgICAgKiBgaXRlcmF0ZWVgIGZ1bmN0aW9ucyBoYXZlIGZpbmlzaGVkLCBvciBhbiBlcnJvciBvY2N1cnMuIFJlc3VsdHMgaXMgYW4gYXJyYXlcbiAgICAgKiBjb250YWluaW5nIHRoZSBjb25jYXRlbmF0ZWQgcmVzdWx0cyBvZiB0aGUgYGl0ZXJhdGVlYCBmdW5jdGlvbi4gSW52b2tlZCB3aXRoXG4gICAgICogKGVyciwgcmVzdWx0cykuXG4gICAgICogQHJldHVybnMgQSBQcm9taXNlLCBpZiBubyBjYWxsYmFjayBpcyBwYXNzZWRcbiAgICAgKi9cbiAgICBmdW5jdGlvbiBjb25jYXRTZXJpZXMoY29sbCwgaXRlcmF0ZWUsIGNhbGxiYWNrKSB7XG4gICAgICAgIHJldHVybiBjb25jYXRMaW1pdCQxKGNvbGwsIDEsIGl0ZXJhdGVlLCBjYWxsYmFjaylcbiAgICB9XG4gICAgdmFyIGNvbmNhdFNlcmllcyQxID0gYXdhaXRpZnkoY29uY2F0U2VyaWVzLCAzKTtcblxuICAgIC8qKlxuICAgICAqIFJldHVybnMgYSBmdW5jdGlvbiB0aGF0IHdoZW4gY2FsbGVkLCBjYWxscy1iYWNrIHdpdGggdGhlIHZhbHVlcyBwcm92aWRlZC5cbiAgICAgKiBVc2VmdWwgYXMgdGhlIGZpcnN0IGZ1bmN0aW9uIGluIGEgW2B3YXRlcmZhbGxgXXtAbGluayBtb2R1bGU6Q29udHJvbEZsb3cud2F0ZXJmYWxsfSwgb3IgZm9yIHBsdWdnaW5nIHZhbHVlcyBpbiB0b1xuICAgICAqIFtgYXV0b2Bde0BsaW5rIG1vZHVsZTpDb250cm9sRmxvdy5hdXRvfS5cbiAgICAgKlxuICAgICAqIEBuYW1lIGNvbnN0YW50XG4gICAgICogQHN0YXRpY1xuICAgICAqIEBtZW1iZXJPZiBtb2R1bGU6VXRpbHNcbiAgICAgKiBAbWV0aG9kXG4gICAgICogQGNhdGVnb3J5IFV0aWxcbiAgICAgKiBAcGFyYW0gey4uLip9IGFyZ3VtZW50cy4uLiAtIEFueSBudW1iZXIgb2YgYXJndW1lbnRzIHRvIGF1dG9tYXRpY2FsbHkgaW52b2tlXG4gICAgICogY2FsbGJhY2sgd2l0aC5cbiAgICAgKiBAcmV0dXJucyB7QXN5bmNGdW5jdGlvbn0gUmV0dXJucyBhIGZ1bmN0aW9uIHRoYXQgd2hlbiBpbnZva2VkLCBhdXRvbWF0aWNhbGx5XG4gICAgICogaW52b2tlcyB0aGUgY2FsbGJhY2sgd2l0aCB0aGUgcHJldmlvdXMgZ2l2ZW4gYXJndW1lbnRzLlxuICAgICAqIEBleGFtcGxlXG4gICAgICpcbiAgICAgKiBhc3luYy53YXRlcmZhbGwoW1xuICAgICAqICAgICBhc3luYy5jb25zdGFudCg0MiksXG4gICAgICogICAgIGZ1bmN0aW9uICh2YWx1ZSwgbmV4dCkge1xuICAgICAqICAgICAgICAgLy8gdmFsdWUgPT09IDQyXG4gICAgICogICAgIH0sXG4gICAgICogICAgIC8vLi4uXG4gICAgICogXSwgY2FsbGJhY2spO1xuICAgICAqXG4gICAgICogYXN5bmMud2F0ZXJmYWxsKFtcbiAgICAgKiAgICAgYXN5bmMuY29uc3RhbnQoZmlsZW5hbWUsIFwidXRmOFwiKSxcbiAgICAgKiAgICAgZnMucmVhZEZpbGUsXG4gICAgICogICAgIGZ1bmN0aW9uIChmaWxlRGF0YSwgbmV4dCkge1xuICAgICAqICAgICAgICAgLy8uLi5cbiAgICAgKiAgICAgfVxuICAgICAqICAgICAvLy4uLlxuICAgICAqIF0sIGNhbGxiYWNrKTtcbiAgICAgKlxuICAgICAqIGFzeW5jLmF1dG8oe1xuICAgICAqICAgICBob3N0bmFtZTogYXN5bmMuY29uc3RhbnQoXCJodHRwczovL3NlcnZlci5uZXQvXCIpLFxuICAgICAqICAgICBwb3J0OiBmaW5kRnJlZVBvcnQsXG4gICAgICogICAgIGxhdW5jaFNlcnZlcjogW1wiaG9zdG5hbWVcIiwgXCJwb3J0XCIsIGZ1bmN0aW9uIChvcHRpb25zLCBjYikge1xuICAgICAqICAgICAgICAgc3RhcnRTZXJ2ZXIob3B0aW9ucywgY2IpO1xuICAgICAqICAgICB9XSxcbiAgICAgKiAgICAgLy8uLi5cbiAgICAgKiB9LCBjYWxsYmFjayk7XG4gICAgICovXG4gICAgZnVuY3Rpb24gY29uc3RhbnQkMSguLi5hcmdzKSB7XG4gICAgICAgIHJldHVybiBmdW5jdGlvbiAoLi4uaWdub3JlZEFyZ3MvKiwgY2FsbGJhY2sqLykge1xuICAgICAgICAgICAgdmFyIGNhbGxiYWNrID0gaWdub3JlZEFyZ3MucG9wKCk7XG4gICAgICAgICAgICByZXR1cm4gY2FsbGJhY2sobnVsbCwgLi4uYXJncyk7XG4gICAgICAgIH07XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gX2NyZWF0ZVRlc3RlcihjaGVjaywgZ2V0UmVzdWx0KSB7XG4gICAgICAgIHJldHVybiAoZWFjaGZuLCBhcnIsIF9pdGVyYXRlZSwgY2IpID0+IHtcbiAgICAgICAgICAgIHZhciB0ZXN0UGFzc2VkID0gZmFsc2U7XG4gICAgICAgICAgICB2YXIgdGVzdFJlc3VsdDtcbiAgICAgICAgICAgIGNvbnN0IGl0ZXJhdGVlID0gd3JhcEFzeW5jKF9pdGVyYXRlZSk7XG4gICAgICAgICAgICBlYWNoZm4oYXJyLCAodmFsdWUsIF8sIGNhbGxiYWNrKSA9PiB7XG4gICAgICAgICAgICAgICAgaXRlcmF0ZWUodmFsdWUsIChlcnIsIHJlc3VsdCkgPT4ge1xuICAgICAgICAgICAgICAgICAgICBpZiAoZXJyIHx8IGVyciA9PT0gZmFsc2UpIHJldHVybiBjYWxsYmFjayhlcnIpO1xuXG4gICAgICAgICAgICAgICAgICAgIGlmIChjaGVjayhyZXN1bHQpICYmICF0ZXN0UmVzdWx0KSB7XG4gICAgICAgICAgICAgICAgICAgICAgICB0ZXN0UGFzc2VkID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRlc3RSZXN1bHQgPSBnZXRSZXN1bHQodHJ1ZSwgdmFsdWUpO1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGNhbGxiYWNrKG51bGwsIGJyZWFrTG9vcCk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgY2FsbGJhY2soKTtcbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIH0sIGVyciA9PiB7XG4gICAgICAgICAgICAgICAgaWYgKGVycikgcmV0dXJuIGNiKGVycik7XG4gICAgICAgICAgICAgICAgY2IobnVsbCwgdGVzdFBhc3NlZCA/IHRlc3RSZXN1bHQgOiBnZXRSZXN1bHQoZmFsc2UpKTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9O1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFJldHVybnMgdGhlIGZpcnN0IHZhbHVlIGluIGBjb2xsYCB0aGF0IHBhc3NlcyBhbiBhc3luYyB0cnV0aCB0ZXN0LiBUaGVcbiAgICAgKiBgaXRlcmF0ZWVgIGlzIGFwcGxpZWQgaW4gcGFyYWxsZWwsIG1lYW5pbmcgdGhlIGZpcnN0IGl0ZXJhdGVlIHRvIHJldHVyblxuICAgICAqIGB0cnVlYCB3aWxsIGZpcmUgdGhlIGRldGVjdCBgY2FsbGJhY2tgIHdpdGggdGhhdCByZXN1bHQuIFRoYXQgbWVhbnMgdGhlXG4gICAgICogcmVzdWx0IG1pZ2h0IG5vdCBiZSB0aGUgZmlyc3QgaXRlbSBpbiB0aGUgb3JpZ2luYWwgYGNvbGxgIChpbiB0ZXJtcyBvZiBvcmRlcilcbiAgICAgKiB0aGF0IHBhc3NlcyB0aGUgdGVzdC5cblxuICAgICAqIElmIG9yZGVyIHdpdGhpbiB0aGUgb3JpZ2luYWwgYGNvbGxgIGlzIGltcG9ydGFudCwgdGhlbiBsb29rIGF0XG4gICAgICogW2BkZXRlY3RTZXJpZXNgXXtAbGluayBtb2R1bGU6Q29sbGVjdGlvbnMuZGV0ZWN0U2VyaWVzfS5cbiAgICAgKlxuICAgICAqIEBuYW1lIGRldGVjdFxuICAgICAqIEBzdGF0aWNcbiAgICAgKiBAbWVtYmVyT2YgbW9kdWxlOkNvbGxlY3Rpb25zXG4gICAgICogQG1ldGhvZFxuICAgICAqIEBhbGlhcyBmaW5kXG4gICAgICogQGNhdGVnb3J5IENvbGxlY3Rpb25zXG4gICAgICogQHBhcmFtIHtBcnJheXxJdGVyYWJsZXxBc3luY0l0ZXJhYmxlfE9iamVjdH0gY29sbCAtIEEgY29sbGVjdGlvbiB0byBpdGVyYXRlIG92ZXIuXG4gICAgICogQHBhcmFtIHtBc3luY0Z1bmN0aW9ufSBpdGVyYXRlZSAtIEEgdHJ1dGggdGVzdCB0byBhcHBseSB0byBlYWNoIGl0ZW0gaW4gYGNvbGxgLlxuICAgICAqIFRoZSBpdGVyYXRlZSBtdXN0IGNvbXBsZXRlIHdpdGggYSBib29sZWFuIHZhbHVlIGFzIGl0cyByZXN1bHQuXG4gICAgICogSW52b2tlZCB3aXRoIChpdGVtLCBjYWxsYmFjaykuXG4gICAgICogQHBhcmFtIHtGdW5jdGlvbn0gW2NhbGxiYWNrXSAtIEEgY2FsbGJhY2sgd2hpY2ggaXMgY2FsbGVkIGFzIHNvb24gYXMgYW55XG4gICAgICogaXRlcmF0ZWUgcmV0dXJucyBgdHJ1ZWAsIG9yIGFmdGVyIGFsbCB0aGUgYGl0ZXJhdGVlYCBmdW5jdGlvbnMgaGF2ZSBmaW5pc2hlZC5cbiAgICAgKiBSZXN1bHQgd2lsbCBiZSB0aGUgZmlyc3QgaXRlbSBpbiB0aGUgYXJyYXkgdGhhdCBwYXNzZXMgdGhlIHRydXRoIHRlc3RcbiAgICAgKiAoaXRlcmF0ZWUpIG9yIHRoZSB2YWx1ZSBgdW5kZWZpbmVkYCBpZiBub25lIHBhc3NlZC4gSW52b2tlZCB3aXRoXG4gICAgICogKGVyciwgcmVzdWx0KS5cbiAgICAgKiBAcmV0dXJucyB7UHJvbWlzZX0gYSBwcm9taXNlLCBpZiBhIGNhbGxiYWNrIGlzIG9taXR0ZWRcbiAgICAgKiBAZXhhbXBsZVxuICAgICAqXG4gICAgICogLy8gZGlyMSBpcyBhIGRpcmVjdG9yeSB0aGF0IGNvbnRhaW5zIGZpbGUxLnR4dCwgZmlsZTIudHh0XG4gICAgICogLy8gZGlyMiBpcyBhIGRpcmVjdG9yeSB0aGF0IGNvbnRhaW5zIGZpbGUzLnR4dCwgZmlsZTQudHh0XG4gICAgICogLy8gZGlyMyBpcyBhIGRpcmVjdG9yeSB0aGF0IGNvbnRhaW5zIGZpbGU1LnR4dFxuICAgICAqXG4gICAgICogLy8gYXN5bmNocm9ub3VzIGZ1bmN0aW9uIHRoYXQgY2hlY2tzIGlmIGEgZmlsZSBleGlzdHNcbiAgICAgKiBmdW5jdGlvbiBmaWxlRXhpc3RzKGZpbGUsIGNhbGxiYWNrKSB7XG4gICAgICogICAgZnMuYWNjZXNzKGZpbGUsIGZzLmNvbnN0YW50cy5GX09LLCAoZXJyKSA9PiB7XG4gICAgICogICAgICAgIGNhbGxiYWNrKG51bGwsICFlcnIpO1xuICAgICAqICAgIH0pO1xuICAgICAqIH1cbiAgICAgKlxuICAgICAqIGFzeW5jLmRldGVjdChbJ2ZpbGUzLnR4dCcsJ2ZpbGUyLnR4dCcsJ2RpcjEvZmlsZTEudHh0J10sIGZpbGVFeGlzdHMsXG4gICAgICogICAgZnVuY3Rpb24oZXJyLCByZXN1bHQpIHtcbiAgICAgKiAgICAgICAgY29uc29sZS5sb2cocmVzdWx0KTtcbiAgICAgKiAgICAgICAgLy8gZGlyMS9maWxlMS50eHRcbiAgICAgKiAgICAgICAgLy8gcmVzdWx0IG5vdyBlcXVhbHMgdGhlIGZpcnN0IGZpbGUgaW4gdGhlIGxpc3QgdGhhdCBleGlzdHNcbiAgICAgKiAgICB9XG4gICAgICopO1xuICAgICAqXG4gICAgICogLy8gVXNpbmcgUHJvbWlzZXNcbiAgICAgKiBhc3luYy5kZXRlY3QoWydmaWxlMy50eHQnLCdmaWxlMi50eHQnLCdkaXIxL2ZpbGUxLnR4dCddLCBmaWxlRXhpc3RzKVxuICAgICAqIC50aGVuKHJlc3VsdCA9PiB7XG4gICAgICogICAgIGNvbnNvbGUubG9nKHJlc3VsdCk7XG4gICAgICogICAgIC8vIGRpcjEvZmlsZTEudHh0XG4gICAgICogICAgIC8vIHJlc3VsdCBub3cgZXF1YWxzIHRoZSBmaXJzdCBmaWxlIGluIHRoZSBsaXN0IHRoYXQgZXhpc3RzXG4gICAgICogfSkuY2F0Y2goZXJyID0+IHtcbiAgICAgKiAgICAgY29uc29sZS5sb2coZXJyKTtcbiAgICAgKiB9KTtcbiAgICAgKlxuICAgICAqIC8vIFVzaW5nIGFzeW5jL2F3YWl0XG4gICAgICogYXN5bmMgKCkgPT4ge1xuICAgICAqICAgICB0cnkge1xuICAgICAqICAgICAgICAgbGV0IHJlc3VsdCA9IGF3YWl0IGFzeW5jLmRldGVjdChbJ2ZpbGUzLnR4dCcsJ2ZpbGUyLnR4dCcsJ2RpcjEvZmlsZTEudHh0J10sIGZpbGVFeGlzdHMpO1xuICAgICAqICAgICAgICAgY29uc29sZS5sb2cocmVzdWx0KTtcbiAgICAgKiAgICAgICAgIC8vIGRpcjEvZmlsZTEudHh0XG4gICAgICogICAgICAgICAvLyByZXN1bHQgbm93IGVxdWFscyB0aGUgZmlsZSBpbiB0aGUgbGlzdCB0aGF0IGV4aXN0c1xuICAgICAqICAgICB9XG4gICAgICogICAgIGNhdGNoIChlcnIpIHtcbiAgICAgKiAgICAgICAgIGNvbnNvbGUubG9nKGVycik7XG4gICAgICogICAgIH1cbiAgICAgKiB9XG4gICAgICpcbiAgICAgKi9cbiAgICBmdW5jdGlvbiBkZXRlY3QoY29sbCwgaXRlcmF0ZWUsIGNhbGxiYWNrKSB7XG4gICAgICAgIHJldHVybiBfY3JlYXRlVGVzdGVyKGJvb2wgPT4gYm9vbCwgKHJlcywgaXRlbSkgPT4gaXRlbSkoZWFjaE9mJDEsIGNvbGwsIGl0ZXJhdGVlLCBjYWxsYmFjaylcbiAgICB9XG4gICAgdmFyIGRldGVjdCQxID0gYXdhaXRpZnkoZGV0ZWN0LCAzKTtcblxuICAgIC8qKlxuICAgICAqIFRoZSBzYW1lIGFzIFtgZGV0ZWN0YF17QGxpbmsgbW9kdWxlOkNvbGxlY3Rpb25zLmRldGVjdH0gYnV0IHJ1bnMgYSBtYXhpbXVtIG9mIGBsaW1pdGAgYXN5bmMgb3BlcmF0aW9ucyBhdCBhXG4gICAgICogdGltZS5cbiAgICAgKlxuICAgICAqIEBuYW1lIGRldGVjdExpbWl0XG4gICAgICogQHN0YXRpY1xuICAgICAqIEBtZW1iZXJPZiBtb2R1bGU6Q29sbGVjdGlvbnNcbiAgICAgKiBAbWV0aG9kXG4gICAgICogQHNlZSBbYXN5bmMuZGV0ZWN0XXtAbGluayBtb2R1bGU6Q29sbGVjdGlvbnMuZGV0ZWN0fVxuICAgICAqIEBhbGlhcyBmaW5kTGltaXRcbiAgICAgKiBAY2F0ZWdvcnkgQ29sbGVjdGlvbnNcbiAgICAgKiBAcGFyYW0ge0FycmF5fEl0ZXJhYmxlfEFzeW5jSXRlcmFibGV8T2JqZWN0fSBjb2xsIC0gQSBjb2xsZWN0aW9uIHRvIGl0ZXJhdGUgb3Zlci5cbiAgICAgKiBAcGFyYW0ge251bWJlcn0gbGltaXQgLSBUaGUgbWF4aW11bSBudW1iZXIgb2YgYXN5bmMgb3BlcmF0aW9ucyBhdCBhIHRpbWUuXG4gICAgICogQHBhcmFtIHtBc3luY0Z1bmN0aW9ufSBpdGVyYXRlZSAtIEEgdHJ1dGggdGVzdCB0byBhcHBseSB0byBlYWNoIGl0ZW0gaW4gYGNvbGxgLlxuICAgICAqIFRoZSBpdGVyYXRlZSBtdXN0IGNvbXBsZXRlIHdpdGggYSBib29sZWFuIHZhbHVlIGFzIGl0cyByZXN1bHQuXG4gICAgICogSW52b2tlZCB3aXRoIChpdGVtLCBjYWxsYmFjaykuXG4gICAgICogQHBhcmFtIHtGdW5jdGlvbn0gW2NhbGxiYWNrXSAtIEEgY2FsbGJhY2sgd2hpY2ggaXMgY2FsbGVkIGFzIHNvb24gYXMgYW55XG4gICAgICogaXRlcmF0ZWUgcmV0dXJucyBgdHJ1ZWAsIG9yIGFmdGVyIGFsbCB0aGUgYGl0ZXJhdGVlYCBmdW5jdGlvbnMgaGF2ZSBmaW5pc2hlZC5cbiAgICAgKiBSZXN1bHQgd2lsbCBiZSB0aGUgZmlyc3QgaXRlbSBpbiB0aGUgYXJyYXkgdGhhdCBwYXNzZXMgdGhlIHRydXRoIHRlc3RcbiAgICAgKiAoaXRlcmF0ZWUpIG9yIHRoZSB2YWx1ZSBgdW5kZWZpbmVkYCBpZiBub25lIHBhc3NlZC4gSW52b2tlZCB3aXRoXG4gICAgICogKGVyciwgcmVzdWx0KS5cbiAgICAgKiBAcmV0dXJucyB7UHJvbWlzZX0gYSBwcm9taXNlLCBpZiBhIGNhbGxiYWNrIGlzIG9taXR0ZWRcbiAgICAgKi9cbiAgICBmdW5jdGlvbiBkZXRlY3RMaW1pdChjb2xsLCBsaW1pdCwgaXRlcmF0ZWUsIGNhbGxiYWNrKSB7XG4gICAgICAgIHJldHVybiBfY3JlYXRlVGVzdGVyKGJvb2wgPT4gYm9vbCwgKHJlcywgaXRlbSkgPT4gaXRlbSkoZWFjaE9mTGltaXQkMihsaW1pdCksIGNvbGwsIGl0ZXJhdGVlLCBjYWxsYmFjaylcbiAgICB9XG4gICAgdmFyIGRldGVjdExpbWl0JDEgPSBhd2FpdGlmeShkZXRlY3RMaW1pdCwgNCk7XG5cbiAgICAvKipcbiAgICAgKiBUaGUgc2FtZSBhcyBbYGRldGVjdGBde0BsaW5rIG1vZHVsZTpDb2xsZWN0aW9ucy5kZXRlY3R9IGJ1dCBydW5zIG9ubHkgYSBzaW5nbGUgYXN5bmMgb3BlcmF0aW9uIGF0IGEgdGltZS5cbiAgICAgKlxuICAgICAqIEBuYW1lIGRldGVjdFNlcmllc1xuICAgICAqIEBzdGF0aWNcbiAgICAgKiBAbWVtYmVyT2YgbW9kdWxlOkNvbGxlY3Rpb25zXG4gICAgICogQG1ldGhvZFxuICAgICAqIEBzZWUgW2FzeW5jLmRldGVjdF17QGxpbmsgbW9kdWxlOkNvbGxlY3Rpb25zLmRldGVjdH1cbiAgICAgKiBAYWxpYXMgZmluZFNlcmllc1xuICAgICAqIEBjYXRlZ29yeSBDb2xsZWN0aW9uc1xuICAgICAqIEBwYXJhbSB7QXJyYXl8SXRlcmFibGV8QXN5bmNJdGVyYWJsZXxPYmplY3R9IGNvbGwgLSBBIGNvbGxlY3Rpb24gdG8gaXRlcmF0ZSBvdmVyLlxuICAgICAqIEBwYXJhbSB7QXN5bmNGdW5jdGlvbn0gaXRlcmF0ZWUgLSBBIHRydXRoIHRlc3QgdG8gYXBwbHkgdG8gZWFjaCBpdGVtIGluIGBjb2xsYC5cbiAgICAgKiBUaGUgaXRlcmF0ZWUgbXVzdCBjb21wbGV0ZSB3aXRoIGEgYm9vbGVhbiB2YWx1ZSBhcyBpdHMgcmVzdWx0LlxuICAgICAqIEludm9rZWQgd2l0aCAoaXRlbSwgY2FsbGJhY2spLlxuICAgICAqIEBwYXJhbSB7RnVuY3Rpb259IFtjYWxsYmFja10gLSBBIGNhbGxiYWNrIHdoaWNoIGlzIGNhbGxlZCBhcyBzb29uIGFzIGFueVxuICAgICAqIGl0ZXJhdGVlIHJldHVybnMgYHRydWVgLCBvciBhZnRlciBhbGwgdGhlIGBpdGVyYXRlZWAgZnVuY3Rpb25zIGhhdmUgZmluaXNoZWQuXG4gICAgICogUmVzdWx0IHdpbGwgYmUgdGhlIGZpcnN0IGl0ZW0gaW4gdGhlIGFycmF5IHRoYXQgcGFzc2VzIHRoZSB0cnV0aCB0ZXN0XG4gICAgICogKGl0ZXJhdGVlKSBvciB0aGUgdmFsdWUgYHVuZGVmaW5lZGAgaWYgbm9uZSBwYXNzZWQuIEludm9rZWQgd2l0aFxuICAgICAqIChlcnIsIHJlc3VsdCkuXG4gICAgICogQHJldHVybnMge1Byb21pc2V9IGEgcHJvbWlzZSwgaWYgYSBjYWxsYmFjayBpcyBvbWl0dGVkXG4gICAgICovXG4gICAgZnVuY3Rpb24gZGV0ZWN0U2VyaWVzKGNvbGwsIGl0ZXJhdGVlLCBjYWxsYmFjaykge1xuICAgICAgICByZXR1cm4gX2NyZWF0ZVRlc3Rlcihib29sID0+IGJvb2wsIChyZXMsIGl0ZW0pID0+IGl0ZW0pKGVhY2hPZkxpbWl0JDIoMSksIGNvbGwsIGl0ZXJhdGVlLCBjYWxsYmFjaylcbiAgICB9XG5cbiAgICB2YXIgZGV0ZWN0U2VyaWVzJDEgPSBhd2FpdGlmeShkZXRlY3RTZXJpZXMsIDMpO1xuXG4gICAgZnVuY3Rpb24gY29uc29sZUZ1bmMobmFtZSkge1xuICAgICAgICByZXR1cm4gKGZuLCAuLi5hcmdzKSA9PiB3cmFwQXN5bmMoZm4pKC4uLmFyZ3MsIChlcnIsIC4uLnJlc3VsdEFyZ3MpID0+IHtcbiAgICAgICAgICAgIC8qIGlzdGFuYnVsIGlnbm9yZSBlbHNlICovXG4gICAgICAgICAgICBpZiAodHlwZW9mIGNvbnNvbGUgPT09ICdvYmplY3QnKSB7XG4gICAgICAgICAgICAgICAgLyogaXN0YW5idWwgaWdub3JlIGVsc2UgKi9cbiAgICAgICAgICAgICAgICBpZiAoZXJyKSB7XG4gICAgICAgICAgICAgICAgICAgIC8qIGlzdGFuYnVsIGlnbm9yZSBlbHNlICovXG4gICAgICAgICAgICAgICAgICAgIGlmIChjb25zb2xlLmVycm9yKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBjb25zb2xlLmVycm9yKGVycik7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKGNvbnNvbGVbbmFtZV0pIHsgLyogaXN0YW5idWwgaWdub3JlIGVsc2UgKi9cbiAgICAgICAgICAgICAgICAgICAgcmVzdWx0QXJncy5mb3JFYWNoKHggPT4gY29uc29sZVtuYW1lXSh4KSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9KVxuICAgIH1cblxuICAgIC8qKlxuICAgICAqIExvZ3MgdGhlIHJlc3VsdCBvZiBhbiBbYGFzeW5jYCBmdW5jdGlvbl17QGxpbmsgQXN5bmNGdW5jdGlvbn0gdG8gdGhlXG4gICAgICogYGNvbnNvbGVgIHVzaW5nIGBjb25zb2xlLmRpcmAgdG8gZGlzcGxheSB0aGUgcHJvcGVydGllcyBvZiB0aGUgcmVzdWx0aW5nIG9iamVjdC5cbiAgICAgKiBPbmx5IHdvcmtzIGluIE5vZGUuanMgb3IgaW4gYnJvd3NlcnMgdGhhdCBzdXBwb3J0IGBjb25zb2xlLmRpcmAgYW5kXG4gICAgICogYGNvbnNvbGUuZXJyb3JgIChzdWNoIGFzIEZGIGFuZCBDaHJvbWUpLlxuICAgICAqIElmIG11bHRpcGxlIGFyZ3VtZW50cyBhcmUgcmV0dXJuZWQgZnJvbSB0aGUgYXN5bmMgZnVuY3Rpb24sXG4gICAgICogYGNvbnNvbGUuZGlyYCBpcyBjYWxsZWQgb24gZWFjaCBhcmd1bWVudCBpbiBvcmRlci5cbiAgICAgKlxuICAgICAqIEBuYW1lIGRpclxuICAgICAqIEBzdGF0aWNcbiAgICAgKiBAbWVtYmVyT2YgbW9kdWxlOlV0aWxzXG4gICAgICogQG1ldGhvZFxuICAgICAqIEBjYXRlZ29yeSBVdGlsXG4gICAgICogQHBhcmFtIHtBc3luY0Z1bmN0aW9ufSBmdW5jdGlvbiAtIFRoZSBmdW5jdGlvbiB5b3Ugd2FudCB0byBldmVudHVhbGx5IGFwcGx5XG4gICAgICogYWxsIGFyZ3VtZW50cyB0by5cbiAgICAgKiBAcGFyYW0gey4uLip9IGFyZ3VtZW50cy4uLiAtIEFueSBudW1iZXIgb2YgYXJndW1lbnRzIHRvIGFwcGx5IHRvIHRoZSBmdW5jdGlvbi5cbiAgICAgKiBAZXhhbXBsZVxuICAgICAqXG4gICAgICogLy8gaW4gYSBtb2R1bGVcbiAgICAgKiB2YXIgaGVsbG8gPSBmdW5jdGlvbihuYW1lLCBjYWxsYmFjaykge1xuICAgICAqICAgICBzZXRUaW1lb3V0KGZ1bmN0aW9uKCkge1xuICAgICAqICAgICAgICAgY2FsbGJhY2sobnVsbCwge2hlbGxvOiBuYW1lfSk7XG4gICAgICogICAgIH0sIDEwMDApO1xuICAgICAqIH07XG4gICAgICpcbiAgICAgKiAvLyBpbiB0aGUgbm9kZSByZXBsXG4gICAgICogbm9kZT4gYXN5bmMuZGlyKGhlbGxvLCAnd29ybGQnKTtcbiAgICAgKiB7aGVsbG86ICd3b3JsZCd9XG4gICAgICovXG4gICAgdmFyIGRpciA9IGNvbnNvbGVGdW5jKCdkaXInKTtcblxuICAgIC8qKlxuICAgICAqIFRoZSBwb3N0LWNoZWNrIHZlcnNpb24gb2YgW2B3aGlsc3RgXXtAbGluayBtb2R1bGU6Q29udHJvbEZsb3cud2hpbHN0fS4gVG8gcmVmbGVjdCB0aGUgZGlmZmVyZW5jZSBpblxuICAgICAqIHRoZSBvcmRlciBvZiBvcGVyYXRpb25zLCB0aGUgYXJndW1lbnRzIGB0ZXN0YCBhbmQgYGl0ZXJhdGVlYCBhcmUgc3dpdGNoZWQuXG4gICAgICpcbiAgICAgKiBgZG9XaGlsc3RgIGlzIHRvIGB3aGlsc3RgIGFzIGBkbyB3aGlsZWAgaXMgdG8gYHdoaWxlYCBpbiBwbGFpbiBKYXZhU2NyaXB0LlxuICAgICAqXG4gICAgICogQG5hbWUgZG9XaGlsc3RcbiAgICAgKiBAc3RhdGljXG4gICAgICogQG1lbWJlck9mIG1vZHVsZTpDb250cm9sRmxvd1xuICAgICAqIEBtZXRob2RcbiAgICAgKiBAc2VlIFthc3luYy53aGlsc3Rde0BsaW5rIG1vZHVsZTpDb250cm9sRmxvdy53aGlsc3R9XG4gICAgICogQGNhdGVnb3J5IENvbnRyb2wgRmxvd1xuICAgICAqIEBwYXJhbSB7QXN5bmNGdW5jdGlvbn0gaXRlcmF0ZWUgLSBBIGZ1bmN0aW9uIHdoaWNoIGlzIGNhbGxlZCBlYWNoIHRpbWUgYHRlc3RgXG4gICAgICogcGFzc2VzLiBJbnZva2VkIHdpdGggKGNhbGxiYWNrKS5cbiAgICAgKiBAcGFyYW0ge0FzeW5jRnVuY3Rpb259IHRlc3QgLSBhc3luY2hyb25vdXMgdHJ1dGggdGVzdCB0byBwZXJmb3JtIGFmdGVyIGVhY2hcbiAgICAgKiBleGVjdXRpb24gb2YgYGl0ZXJhdGVlYC4gSW52b2tlZCB3aXRoICguLi5hcmdzLCBjYWxsYmFjayksIHdoZXJlIGAuLi5hcmdzYCBhcmUgdGhlXG4gICAgICogbm9uLWVycm9yIGFyZ3MgZnJvbSB0aGUgcHJldmlvdXMgY2FsbGJhY2sgb2YgYGl0ZXJhdGVlYC5cbiAgICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBbY2FsbGJhY2tdIC0gQSBjYWxsYmFjayB3aGljaCBpcyBjYWxsZWQgYWZ0ZXIgdGhlIHRlc3RcbiAgICAgKiBmdW5jdGlvbiBoYXMgZmFpbGVkIGFuZCByZXBlYXRlZCBleGVjdXRpb24gb2YgYGl0ZXJhdGVlYCBoYXMgc3RvcHBlZC5cbiAgICAgKiBgY2FsbGJhY2tgIHdpbGwgYmUgcGFzc2VkIGFuIGVycm9yIGFuZCBhbnkgYXJndW1lbnRzIHBhc3NlZCB0byB0aGUgZmluYWxcbiAgICAgKiBgaXRlcmF0ZWVgJ3MgY2FsbGJhY2suIEludm9rZWQgd2l0aCAoZXJyLCBbcmVzdWx0c10pO1xuICAgICAqIEByZXR1cm5zIHtQcm9taXNlfSBhIHByb21pc2UsIGlmIG5vIGNhbGxiYWNrIGlzIHBhc3NlZFxuICAgICAqL1xuICAgIGZ1bmN0aW9uIGRvV2hpbHN0KGl0ZXJhdGVlLCB0ZXN0LCBjYWxsYmFjaykge1xuICAgICAgICBjYWxsYmFjayA9IG9ubHlPbmNlKGNhbGxiYWNrKTtcbiAgICAgICAgdmFyIF9mbiA9IHdyYXBBc3luYyhpdGVyYXRlZSk7XG4gICAgICAgIHZhciBfdGVzdCA9IHdyYXBBc3luYyh0ZXN0KTtcbiAgICAgICAgdmFyIHJlc3VsdHM7XG5cbiAgICAgICAgZnVuY3Rpb24gbmV4dChlcnIsIC4uLmFyZ3MpIHtcbiAgICAgICAgICAgIGlmIChlcnIpIHJldHVybiBjYWxsYmFjayhlcnIpO1xuICAgICAgICAgICAgaWYgKGVyciA9PT0gZmFsc2UpIHJldHVybjtcbiAgICAgICAgICAgIHJlc3VsdHMgPSBhcmdzO1xuICAgICAgICAgICAgX3Rlc3QoLi4uYXJncywgY2hlY2spO1xuICAgICAgICB9XG5cbiAgICAgICAgZnVuY3Rpb24gY2hlY2soZXJyLCB0cnV0aCkge1xuICAgICAgICAgICAgaWYgKGVycikgcmV0dXJuIGNhbGxiYWNrKGVycik7XG4gICAgICAgICAgICBpZiAoZXJyID09PSBmYWxzZSkgcmV0dXJuO1xuICAgICAgICAgICAgaWYgKCF0cnV0aCkgcmV0dXJuIGNhbGxiYWNrKG51bGwsIC4uLnJlc3VsdHMpO1xuICAgICAgICAgICAgX2ZuKG5leHQpO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIGNoZWNrKG51bGwsIHRydWUpO1xuICAgIH1cblxuICAgIHZhciBkb1doaWxzdCQxID0gYXdhaXRpZnkoZG9XaGlsc3QsIDMpO1xuXG4gICAgLyoqXG4gICAgICogTGlrZSBbJ2RvV2hpbHN0J117QGxpbmsgbW9kdWxlOkNvbnRyb2xGbG93LmRvV2hpbHN0fSwgZXhjZXB0IHRoZSBgdGVzdGAgaXMgaW52ZXJ0ZWQuIE5vdGUgdGhlXG4gICAgICogYXJndW1lbnQgb3JkZXJpbmcgZGlmZmVycyBmcm9tIGB1bnRpbGAuXG4gICAgICpcbiAgICAgKiBAbmFtZSBkb1VudGlsXG4gICAgICogQHN0YXRpY1xuICAgICAqIEBtZW1iZXJPZiBtb2R1bGU6Q29udHJvbEZsb3dcbiAgICAgKiBAbWV0aG9kXG4gICAgICogQHNlZSBbYXN5bmMuZG9XaGlsc3Rde0BsaW5rIG1vZHVsZTpDb250cm9sRmxvdy5kb1doaWxzdH1cbiAgICAgKiBAY2F0ZWdvcnkgQ29udHJvbCBGbG93XG4gICAgICogQHBhcmFtIHtBc3luY0Z1bmN0aW9ufSBpdGVyYXRlZSAtIEFuIGFzeW5jIGZ1bmN0aW9uIHdoaWNoIGlzIGNhbGxlZCBlYWNoIHRpbWVcbiAgICAgKiBgdGVzdGAgZmFpbHMuIEludm9rZWQgd2l0aCAoY2FsbGJhY2spLlxuICAgICAqIEBwYXJhbSB7QXN5bmNGdW5jdGlvbn0gdGVzdCAtIGFzeW5jaHJvbm91cyB0cnV0aCB0ZXN0IHRvIHBlcmZvcm0gYWZ0ZXIgZWFjaFxuICAgICAqIGV4ZWN1dGlvbiBvZiBgaXRlcmF0ZWVgLiBJbnZva2VkIHdpdGggKC4uLmFyZ3MsIGNhbGxiYWNrKSwgd2hlcmUgYC4uLmFyZ3NgIGFyZSB0aGVcbiAgICAgKiBub24tZXJyb3IgYXJncyBmcm9tIHRoZSBwcmV2aW91cyBjYWxsYmFjayBvZiBgaXRlcmF0ZWVgXG4gICAgICogQHBhcmFtIHtGdW5jdGlvbn0gW2NhbGxiYWNrXSAtIEEgY2FsbGJhY2sgd2hpY2ggaXMgY2FsbGVkIGFmdGVyIHRoZSB0ZXN0XG4gICAgICogZnVuY3Rpb24gaGFzIHBhc3NlZCBhbmQgcmVwZWF0ZWQgZXhlY3V0aW9uIG9mIGBpdGVyYXRlZWAgaGFzIHN0b3BwZWQuIGBjYWxsYmFja2BcbiAgICAgKiB3aWxsIGJlIHBhc3NlZCBhbiBlcnJvciBhbmQgYW55IGFyZ3VtZW50cyBwYXNzZWQgdG8gdGhlIGZpbmFsIGBpdGVyYXRlZWAnc1xuICAgICAqIGNhbGxiYWNrLiBJbnZva2VkIHdpdGggKGVyciwgW3Jlc3VsdHNdKTtcbiAgICAgKiBAcmV0dXJucyB7UHJvbWlzZX0gYSBwcm9taXNlLCBpZiBubyBjYWxsYmFjayBpcyBwYXNzZWRcbiAgICAgKi9cbiAgICBmdW5jdGlvbiBkb1VudGlsKGl0ZXJhdGVlLCB0ZXN0LCBjYWxsYmFjaykge1xuICAgICAgICBjb25zdCBfdGVzdCA9IHdyYXBBc3luYyh0ZXN0KTtcbiAgICAgICAgcmV0dXJuIGRvV2hpbHN0JDEoaXRlcmF0ZWUsICguLi5hcmdzKSA9PiB7XG4gICAgICAgICAgICBjb25zdCBjYiA9IGFyZ3MucG9wKCk7XG4gICAgICAgICAgICBfdGVzdCguLi5hcmdzLCAoZXJyLCB0cnV0aCkgPT4gY2IgKGVyciwgIXRydXRoKSk7XG4gICAgICAgIH0sIGNhbGxiYWNrKTtcbiAgICB9XG5cbiAgICBmdW5jdGlvbiBfd2l0aG91dEluZGV4KGl0ZXJhdGVlKSB7XG4gICAgICAgIHJldHVybiAodmFsdWUsIGluZGV4LCBjYWxsYmFjaykgPT4gaXRlcmF0ZWUodmFsdWUsIGNhbGxiYWNrKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBBcHBsaWVzIHRoZSBmdW5jdGlvbiBgaXRlcmF0ZWVgIHRvIGVhY2ggaXRlbSBpbiBgY29sbGAsIGluIHBhcmFsbGVsLlxuICAgICAqIFRoZSBgaXRlcmF0ZWVgIGlzIGNhbGxlZCB3aXRoIGFuIGl0ZW0gZnJvbSB0aGUgbGlzdCwgYW5kIGEgY2FsbGJhY2sgZm9yIHdoZW5cbiAgICAgKiBpdCBoYXMgZmluaXNoZWQuIElmIHRoZSBgaXRlcmF0ZWVgIHBhc3NlcyBhbiBlcnJvciB0byBpdHMgYGNhbGxiYWNrYCwgdGhlXG4gICAgICogbWFpbiBgY2FsbGJhY2tgIChmb3IgdGhlIGBlYWNoYCBmdW5jdGlvbikgaXMgaW1tZWRpYXRlbHkgY2FsbGVkIHdpdGggdGhlXG4gICAgICogZXJyb3IuXG4gICAgICpcbiAgICAgKiBOb3RlLCB0aGF0IHNpbmNlIHRoaXMgZnVuY3Rpb24gYXBwbGllcyBgaXRlcmF0ZWVgIHRvIGVhY2ggaXRlbSBpbiBwYXJhbGxlbCxcbiAgICAgKiB0aGVyZSBpcyBubyBndWFyYW50ZWUgdGhhdCB0aGUgaXRlcmF0ZWUgZnVuY3Rpb25zIHdpbGwgY29tcGxldGUgaW4gb3JkZXIuXG4gICAgICpcbiAgICAgKiBAbmFtZSBlYWNoXG4gICAgICogQHN0YXRpY1xuICAgICAqIEBtZW1iZXJPZiBtb2R1bGU6Q29sbGVjdGlvbnNcbiAgICAgKiBAbWV0aG9kXG4gICAgICogQGFsaWFzIGZvckVhY2hcbiAgICAgKiBAY2F0ZWdvcnkgQ29sbGVjdGlvblxuICAgICAqIEBwYXJhbSB7QXJyYXl8SXRlcmFibGV8QXN5bmNJdGVyYWJsZXxPYmplY3R9IGNvbGwgLSBBIGNvbGxlY3Rpb24gdG8gaXRlcmF0ZSBvdmVyLlxuICAgICAqIEBwYXJhbSB7QXN5bmNGdW5jdGlvbn0gaXRlcmF0ZWUgLSBBbiBhc3luYyBmdW5jdGlvbiB0byBhcHBseSB0b1xuICAgICAqIGVhY2ggaXRlbSBpbiBgY29sbGAuIEludm9rZWQgd2l0aCAoaXRlbSwgY2FsbGJhY2spLlxuICAgICAqIFRoZSBhcnJheSBpbmRleCBpcyBub3QgcGFzc2VkIHRvIHRoZSBpdGVyYXRlZS5cbiAgICAgKiBJZiB5b3UgbmVlZCB0aGUgaW5kZXgsIHVzZSBgZWFjaE9mYC5cbiAgICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBbY2FsbGJhY2tdIC0gQSBjYWxsYmFjayB3aGljaCBpcyBjYWxsZWQgd2hlbiBhbGxcbiAgICAgKiBgaXRlcmF0ZWVgIGZ1bmN0aW9ucyBoYXZlIGZpbmlzaGVkLCBvciBhbiBlcnJvciBvY2N1cnMuIEludm9rZWQgd2l0aCAoZXJyKS5cbiAgICAgKiBAcmV0dXJucyB7UHJvbWlzZX0gYSBwcm9taXNlLCBpZiBhIGNhbGxiYWNrIGlzIG9taXR0ZWRcbiAgICAgKiBAZXhhbXBsZVxuICAgICAqXG4gICAgICogLy8gZGlyMSBpcyBhIGRpcmVjdG9yeSB0aGF0IGNvbnRhaW5zIGZpbGUxLnR4dCwgZmlsZTIudHh0XG4gICAgICogLy8gZGlyMiBpcyBhIGRpcmVjdG9yeSB0aGF0IGNvbnRhaW5zIGZpbGUzLnR4dCwgZmlsZTQudHh0XG4gICAgICogLy8gZGlyMyBpcyBhIGRpcmVjdG9yeSB0aGF0IGNvbnRhaW5zIGZpbGU1LnR4dFxuICAgICAqIC8vIGRpcjQgZG9lcyBub3QgZXhpc3RcbiAgICAgKlxuICAgICAqIGNvbnN0IGZpbGVMaXN0ID0gWyAnZGlyMS9maWxlMi50eHQnLCAnZGlyMi9maWxlMy50eHQnLCAnZGlyL2ZpbGU1LnR4dCddO1xuICAgICAqIGNvbnN0IHdpdGhNaXNzaW5nRmlsZUxpc3QgPSBbJ2RpcjEvZmlsZTEudHh0JywgJ2RpcjQvZmlsZTIudHh0J107XG4gICAgICpcbiAgICAgKiAvLyBhc3luY2hyb25vdXMgZnVuY3Rpb24gdGhhdCBkZWxldGVzIGEgZmlsZVxuICAgICAqIGNvbnN0IGRlbGV0ZUZpbGUgPSBmdW5jdGlvbihmaWxlLCBjYWxsYmFjaykge1xuICAgICAqICAgICBmcy51bmxpbmsoZmlsZSwgY2FsbGJhY2spO1xuICAgICAqIH07XG4gICAgICpcbiAgICAgKiAvLyBVc2luZyBjYWxsYmFja3NcbiAgICAgKiBhc3luYy5lYWNoKGZpbGVMaXN0LCBkZWxldGVGaWxlLCBmdW5jdGlvbihlcnIpIHtcbiAgICAgKiAgICAgaWYoIGVyciApIHtcbiAgICAgKiAgICAgICAgIGNvbnNvbGUubG9nKGVycik7XG4gICAgICogICAgIH0gZWxzZSB7XG4gICAgICogICAgICAgICBjb25zb2xlLmxvZygnQWxsIGZpbGVzIGhhdmUgYmVlbiBkZWxldGVkIHN1Y2Nlc3NmdWxseScpO1xuICAgICAqICAgICB9XG4gICAgICogfSk7XG4gICAgICpcbiAgICAgKiAvLyBFcnJvciBIYW5kbGluZ1xuICAgICAqIGFzeW5jLmVhY2god2l0aE1pc3NpbmdGaWxlTGlzdCwgZGVsZXRlRmlsZSwgZnVuY3Rpb24oZXJyKXtcbiAgICAgKiAgICAgY29uc29sZS5sb2coZXJyKTtcbiAgICAgKiAgICAgLy8gWyBFcnJvcjogRU5PRU5UOiBubyBzdWNoIGZpbGUgb3IgZGlyZWN0b3J5IF1cbiAgICAgKiAgICAgLy8gc2luY2UgZGlyNC9maWxlMi50eHQgZG9lcyBub3QgZXhpc3RcbiAgICAgKiAgICAgLy8gZGlyMS9maWxlMS50eHQgY291bGQgaGF2ZSBiZWVuIGRlbGV0ZWRcbiAgICAgKiB9KTtcbiAgICAgKlxuICAgICAqIC8vIFVzaW5nIFByb21pc2VzXG4gICAgICogYXN5bmMuZWFjaChmaWxlTGlzdCwgZGVsZXRlRmlsZSlcbiAgICAgKiAudGhlbiggKCkgPT4ge1xuICAgICAqICAgICBjb25zb2xlLmxvZygnQWxsIGZpbGVzIGhhdmUgYmVlbiBkZWxldGVkIHN1Y2Nlc3NmdWxseScpO1xuICAgICAqIH0pLmNhdGNoKCBlcnIgPT4ge1xuICAgICAqICAgICBjb25zb2xlLmxvZyhlcnIpO1xuICAgICAqIH0pO1xuICAgICAqXG4gICAgICogLy8gRXJyb3IgSGFuZGxpbmdcbiAgICAgKiBhc3luYy5lYWNoKGZpbGVMaXN0LCBkZWxldGVGaWxlKVxuICAgICAqIC50aGVuKCAoKSA9PiB7XG4gICAgICogICAgIGNvbnNvbGUubG9nKCdBbGwgZmlsZXMgaGF2ZSBiZWVuIGRlbGV0ZWQgc3VjY2Vzc2Z1bGx5Jyk7XG4gICAgICogfSkuY2F0Y2goIGVyciA9PiB7XG4gICAgICogICAgIGNvbnNvbGUubG9nKGVycik7XG4gICAgICogICAgIC8vIFsgRXJyb3I6IEVOT0VOVDogbm8gc3VjaCBmaWxlIG9yIGRpcmVjdG9yeSBdXG4gICAgICogICAgIC8vIHNpbmNlIGRpcjQvZmlsZTIudHh0IGRvZXMgbm90IGV4aXN0XG4gICAgICogICAgIC8vIGRpcjEvZmlsZTEudHh0IGNvdWxkIGhhdmUgYmVlbiBkZWxldGVkXG4gICAgICogfSk7XG4gICAgICpcbiAgICAgKiAvLyBVc2luZyBhc3luYy9hd2FpdFxuICAgICAqIGFzeW5jICgpID0+IHtcbiAgICAgKiAgICAgdHJ5IHtcbiAgICAgKiAgICAgICAgIGF3YWl0IGFzeW5jLmVhY2goZmlsZXMsIGRlbGV0ZUZpbGUpO1xuICAgICAqICAgICB9XG4gICAgICogICAgIGNhdGNoIChlcnIpIHtcbiAgICAgKiAgICAgICAgIGNvbnNvbGUubG9nKGVycik7XG4gICAgICogICAgIH1cbiAgICAgKiB9XG4gICAgICpcbiAgICAgKiAvLyBFcnJvciBIYW5kbGluZ1xuICAgICAqIGFzeW5jICgpID0+IHtcbiAgICAgKiAgICAgdHJ5IHtcbiAgICAgKiAgICAgICAgIGF3YWl0IGFzeW5jLmVhY2god2l0aE1pc3NpbmdGaWxlTGlzdCwgZGVsZXRlRmlsZSk7XG4gICAgICogICAgIH1cbiAgICAgKiAgICAgY2F0Y2ggKGVycikge1xuICAgICAqICAgICAgICAgY29uc29sZS5sb2coZXJyKTtcbiAgICAgKiAgICAgICAgIC8vIFsgRXJyb3I6IEVOT0VOVDogbm8gc3VjaCBmaWxlIG9yIGRpcmVjdG9yeSBdXG4gICAgICogICAgICAgICAvLyBzaW5jZSBkaXI0L2ZpbGUyLnR4dCBkb2VzIG5vdCBleGlzdFxuICAgICAqICAgICAgICAgLy8gZGlyMS9maWxlMS50eHQgY291bGQgaGF2ZSBiZWVuIGRlbGV0ZWRcbiAgICAgKiAgICAgfVxuICAgICAqIH1cbiAgICAgKlxuICAgICAqL1xuICAgIGZ1bmN0aW9uIGVhY2hMaW1pdCQyKGNvbGwsIGl0ZXJhdGVlLCBjYWxsYmFjaykge1xuICAgICAgICByZXR1cm4gZWFjaE9mJDEoY29sbCwgX3dpdGhvdXRJbmRleCh3cmFwQXN5bmMoaXRlcmF0ZWUpKSwgY2FsbGJhY2spO1xuICAgIH1cblxuICAgIHZhciBlYWNoID0gYXdhaXRpZnkoZWFjaExpbWl0JDIsIDMpO1xuXG4gICAgLyoqXG4gICAgICogVGhlIHNhbWUgYXMgW2BlYWNoYF17QGxpbmsgbW9kdWxlOkNvbGxlY3Rpb25zLmVhY2h9IGJ1dCBydW5zIGEgbWF4aW11bSBvZiBgbGltaXRgIGFzeW5jIG9wZXJhdGlvbnMgYXQgYSB0aW1lLlxuICAgICAqXG4gICAgICogQG5hbWUgZWFjaExpbWl0XG4gICAgICogQHN0YXRpY1xuICAgICAqIEBtZW1iZXJPZiBtb2R1bGU6Q29sbGVjdGlvbnNcbiAgICAgKiBAbWV0aG9kXG4gICAgICogQHNlZSBbYXN5bmMuZWFjaF17QGxpbmsgbW9kdWxlOkNvbGxlY3Rpb25zLmVhY2h9XG4gICAgICogQGFsaWFzIGZvckVhY2hMaW1pdFxuICAgICAqIEBjYXRlZ29yeSBDb2xsZWN0aW9uXG4gICAgICogQHBhcmFtIHtBcnJheXxJdGVyYWJsZXxBc3luY0l0ZXJhYmxlfE9iamVjdH0gY29sbCAtIEEgY29sbGVjdGlvbiB0byBpdGVyYXRlIG92ZXIuXG4gICAgICogQHBhcmFtIHtudW1iZXJ9IGxpbWl0IC0gVGhlIG1heGltdW0gbnVtYmVyIG9mIGFzeW5jIG9wZXJhdGlvbnMgYXQgYSB0aW1lLlxuICAgICAqIEBwYXJhbSB7QXN5bmNGdW5jdGlvbn0gaXRlcmF0ZWUgLSBBbiBhc3luYyBmdW5jdGlvbiB0byBhcHBseSB0byBlYWNoIGl0ZW0gaW5cbiAgICAgKiBgY29sbGAuXG4gICAgICogVGhlIGFycmF5IGluZGV4IGlzIG5vdCBwYXNzZWQgdG8gdGhlIGl0ZXJhdGVlLlxuICAgICAqIElmIHlvdSBuZWVkIHRoZSBpbmRleCwgdXNlIGBlYWNoT2ZMaW1pdGAuXG4gICAgICogSW52b2tlZCB3aXRoIChpdGVtLCBjYWxsYmFjaykuXG4gICAgICogQHBhcmFtIHtGdW5jdGlvbn0gW2NhbGxiYWNrXSAtIEEgY2FsbGJhY2sgd2hpY2ggaXMgY2FsbGVkIHdoZW4gYWxsXG4gICAgICogYGl0ZXJhdGVlYCBmdW5jdGlvbnMgaGF2ZSBmaW5pc2hlZCwgb3IgYW4gZXJyb3Igb2NjdXJzLiBJbnZva2VkIHdpdGggKGVycikuXG4gICAgICogQHJldHVybnMge1Byb21pc2V9IGEgcHJvbWlzZSwgaWYgYSBjYWxsYmFjayBpcyBvbWl0dGVkXG4gICAgICovXG4gICAgZnVuY3Rpb24gZWFjaExpbWl0KGNvbGwsIGxpbWl0LCBpdGVyYXRlZSwgY2FsbGJhY2spIHtcbiAgICAgICAgcmV0dXJuIGVhY2hPZkxpbWl0JDIobGltaXQpKGNvbGwsIF93aXRob3V0SW5kZXgod3JhcEFzeW5jKGl0ZXJhdGVlKSksIGNhbGxiYWNrKTtcbiAgICB9XG4gICAgdmFyIGVhY2hMaW1pdCQxID0gYXdhaXRpZnkoZWFjaExpbWl0LCA0KTtcblxuICAgIC8qKlxuICAgICAqIFRoZSBzYW1lIGFzIFtgZWFjaGBde0BsaW5rIG1vZHVsZTpDb2xsZWN0aW9ucy5lYWNofSBidXQgcnVucyBvbmx5IGEgc2luZ2xlIGFzeW5jIG9wZXJhdGlvbiBhdCBhIHRpbWUuXG4gICAgICpcbiAgICAgKiBOb3RlLCB0aGF0IHVubGlrZSBbYGVhY2hgXXtAbGluayBtb2R1bGU6Q29sbGVjdGlvbnMuZWFjaH0sIHRoaXMgZnVuY3Rpb24gYXBwbGllcyBpdGVyYXRlZSB0byBlYWNoIGl0ZW1cbiAgICAgKiBpbiBzZXJpZXMgYW5kIHRoZXJlZm9yZSB0aGUgaXRlcmF0ZWUgZnVuY3Rpb25zIHdpbGwgY29tcGxldGUgaW4gb3JkZXIuXG5cbiAgICAgKiBAbmFtZSBlYWNoU2VyaWVzXG4gICAgICogQHN0YXRpY1xuICAgICAqIEBtZW1iZXJPZiBtb2R1bGU6Q29sbGVjdGlvbnNcbiAgICAgKiBAbWV0aG9kXG4gICAgICogQHNlZSBbYXN5bmMuZWFjaF17QGxpbmsgbW9kdWxlOkNvbGxlY3Rpb25zLmVhY2h9XG4gICAgICogQGFsaWFzIGZvckVhY2hTZXJpZXNcbiAgICAgKiBAY2F0ZWdvcnkgQ29sbGVjdGlvblxuICAgICAqIEBwYXJhbSB7QXJyYXl8SXRlcmFibGV8QXN5bmNJdGVyYWJsZXxPYmplY3R9IGNvbGwgLSBBIGNvbGxlY3Rpb24gdG8gaXRlcmF0ZSBvdmVyLlxuICAgICAqIEBwYXJhbSB7QXN5bmNGdW5jdGlvbn0gaXRlcmF0ZWUgLSBBbiBhc3luYyBmdW5jdGlvbiB0byBhcHBseSB0byBlYWNoXG4gICAgICogaXRlbSBpbiBgY29sbGAuXG4gICAgICogVGhlIGFycmF5IGluZGV4IGlzIG5vdCBwYXNzZWQgdG8gdGhlIGl0ZXJhdGVlLlxuICAgICAqIElmIHlvdSBuZWVkIHRoZSBpbmRleCwgdXNlIGBlYWNoT2ZTZXJpZXNgLlxuICAgICAqIEludm9rZWQgd2l0aCAoaXRlbSwgY2FsbGJhY2spLlxuICAgICAqIEBwYXJhbSB7RnVuY3Rpb259IFtjYWxsYmFja10gLSBBIGNhbGxiYWNrIHdoaWNoIGlzIGNhbGxlZCB3aGVuIGFsbFxuICAgICAqIGBpdGVyYXRlZWAgZnVuY3Rpb25zIGhhdmUgZmluaXNoZWQsIG9yIGFuIGVycm9yIG9jY3Vycy4gSW52b2tlZCB3aXRoIChlcnIpLlxuICAgICAqIEByZXR1cm5zIHtQcm9taXNlfSBhIHByb21pc2UsIGlmIGEgY2FsbGJhY2sgaXMgb21pdHRlZFxuICAgICAqL1xuICAgIGZ1bmN0aW9uIGVhY2hTZXJpZXMoY29sbCwgaXRlcmF0ZWUsIGNhbGxiYWNrKSB7XG4gICAgICAgIHJldHVybiBlYWNoTGltaXQkMShjb2xsLCAxLCBpdGVyYXRlZSwgY2FsbGJhY2spXG4gICAgfVxuICAgIHZhciBlYWNoU2VyaWVzJDEgPSBhd2FpdGlmeShlYWNoU2VyaWVzLCAzKTtcblxuICAgIC8qKlxuICAgICAqIFdyYXAgYW4gYXN5bmMgZnVuY3Rpb24gYW5kIGVuc3VyZSBpdCBjYWxscyBpdHMgY2FsbGJhY2sgb24gYSBsYXRlciB0aWNrIG9mXG4gICAgICogdGhlIGV2ZW50IGxvb3AuICBJZiB0aGUgZnVuY3Rpb24gYWxyZWFkeSBjYWxscyBpdHMgY2FsbGJhY2sgb24gYSBuZXh0IHRpY2ssXG4gICAgICogbm8gZXh0cmEgZGVmZXJyYWwgaXMgYWRkZWQuIFRoaXMgaXMgdXNlZnVsIGZvciBwcmV2ZW50aW5nIHN0YWNrIG92ZXJmbG93c1xuICAgICAqIChgUmFuZ2VFcnJvcjogTWF4aW11bSBjYWxsIHN0YWNrIHNpemUgZXhjZWVkZWRgKSBhbmQgZ2VuZXJhbGx5IGtlZXBpbmdcbiAgICAgKiBbWmFsZ29dKGh0dHA6Ly9ibG9nLml6cy5tZS9wb3N0LzU5MTQyNzQyMTQzL2Rlc2lnbmluZy1hcGlzLWZvci1hc3luY2hyb255KVxuICAgICAqIGNvbnRhaW5lZC4gRVMyMDE3IGBhc3luY2AgZnVuY3Rpb25zIGFyZSByZXR1cm5lZCBhcy1pcyAtLSB0aGV5IGFyZSBpbW11bmVcbiAgICAgKiB0byBaYWxnbydzIGNvcnJ1cHRpbmcgaW5mbHVlbmNlcywgYXMgdGhleSBhbHdheXMgcmVzb2x2ZSBvbiBhIGxhdGVyIHRpY2suXG4gICAgICpcbiAgICAgKiBAbmFtZSBlbnN1cmVBc3luY1xuICAgICAqIEBzdGF0aWNcbiAgICAgKiBAbWVtYmVyT2YgbW9kdWxlOlV0aWxzXG4gICAgICogQG1ldGhvZFxuICAgICAqIEBjYXRlZ29yeSBVdGlsXG4gICAgICogQHBhcmFtIHtBc3luY0Z1bmN0aW9ufSBmbiAtIGFuIGFzeW5jIGZ1bmN0aW9uLCBvbmUgdGhhdCBleHBlY3RzIGEgbm9kZS1zdHlsZVxuICAgICAqIGNhbGxiYWNrIGFzIGl0cyBsYXN0IGFyZ3VtZW50LlxuICAgICAqIEByZXR1cm5zIHtBc3luY0Z1bmN0aW9ufSBSZXR1cm5zIGEgd3JhcHBlZCBmdW5jdGlvbiB3aXRoIHRoZSBleGFjdCBzYW1lIGNhbGxcbiAgICAgKiBzaWduYXR1cmUgYXMgdGhlIGZ1bmN0aW9uIHBhc3NlZCBpbi5cbiAgICAgKiBAZXhhbXBsZVxuICAgICAqXG4gICAgICogZnVuY3Rpb24gc29tZXRpbWVzQXN5bmMoYXJnLCBjYWxsYmFjaykge1xuICAgICAqICAgICBpZiAoY2FjaGVbYXJnXSkge1xuICAgICAqICAgICAgICAgcmV0dXJuIGNhbGxiYWNrKG51bGwsIGNhY2hlW2FyZ10pOyAvLyB0aGlzIHdvdWxkIGJlIHN5bmNocm9ub3VzISFcbiAgICAgKiAgICAgfSBlbHNlIHtcbiAgICAgKiAgICAgICAgIGRvU29tZUlPKGFyZywgY2FsbGJhY2spOyAvLyB0aGlzIElPIHdvdWxkIGJlIGFzeW5jaHJvbm91c1xuICAgICAqICAgICB9XG4gICAgICogfVxuICAgICAqXG4gICAgICogLy8gdGhpcyBoYXMgYSByaXNrIG9mIHN0YWNrIG92ZXJmbG93cyBpZiBtYW55IHJlc3VsdHMgYXJlIGNhY2hlZCBpbiBhIHJvd1xuICAgICAqIGFzeW5jLm1hcFNlcmllcyhhcmdzLCBzb21ldGltZXNBc3luYywgZG9uZSk7XG4gICAgICpcbiAgICAgKiAvLyB0aGlzIHdpbGwgZGVmZXIgc29tZXRpbWVzQXN5bmMncyBjYWxsYmFjayBpZiBuZWNlc3NhcnksXG4gICAgICogLy8gcHJldmVudGluZyBzdGFjayBvdmVyZmxvd3NcbiAgICAgKiBhc3luYy5tYXBTZXJpZXMoYXJncywgYXN5bmMuZW5zdXJlQXN5bmMoc29tZXRpbWVzQXN5bmMpLCBkb25lKTtcbiAgICAgKi9cbiAgICBmdW5jdGlvbiBlbnN1cmVBc3luYyhmbikge1xuICAgICAgICBpZiAoaXNBc3luYyhmbikpIHJldHVybiBmbjtcbiAgICAgICAgcmV0dXJuIGZ1bmN0aW9uICguLi5hcmdzLyosIGNhbGxiYWNrKi8pIHtcbiAgICAgICAgICAgIHZhciBjYWxsYmFjayA9IGFyZ3MucG9wKCk7XG4gICAgICAgICAgICB2YXIgc3luYyA9IHRydWU7XG4gICAgICAgICAgICBhcmdzLnB1c2goKC4uLmlubmVyQXJncykgPT4ge1xuICAgICAgICAgICAgICAgIGlmIChzeW5jKSB7XG4gICAgICAgICAgICAgICAgICAgIHNldEltbWVkaWF0ZSQxKCgpID0+IGNhbGxiYWNrKC4uLmlubmVyQXJncykpO1xuICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIGNhbGxiYWNrKC4uLmlubmVyQXJncyk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICBmbi5hcHBseSh0aGlzLCBhcmdzKTtcbiAgICAgICAgICAgIHN5bmMgPSBmYWxzZTtcbiAgICAgICAgfTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBSZXR1cm5zIGB0cnVlYCBpZiBldmVyeSBlbGVtZW50IGluIGBjb2xsYCBzYXRpc2ZpZXMgYW4gYXN5bmMgdGVzdC4gSWYgYW55XG4gICAgICogaXRlcmF0ZWUgY2FsbCByZXR1cm5zIGBmYWxzZWAsIHRoZSBtYWluIGBjYWxsYmFja2AgaXMgaW1tZWRpYXRlbHkgY2FsbGVkLlxuICAgICAqXG4gICAgICogQG5hbWUgZXZlcnlcbiAgICAgKiBAc3RhdGljXG4gICAgICogQG1lbWJlck9mIG1vZHVsZTpDb2xsZWN0aW9uc1xuICAgICAqIEBtZXRob2RcbiAgICAgKiBAYWxpYXMgYWxsXG4gICAgICogQGNhdGVnb3J5IENvbGxlY3Rpb25cbiAgICAgKiBAcGFyYW0ge0FycmF5fEl0ZXJhYmxlfEFzeW5jSXRlcmFibGV8T2JqZWN0fSBjb2xsIC0gQSBjb2xsZWN0aW9uIHRvIGl0ZXJhdGUgb3Zlci5cbiAgICAgKiBAcGFyYW0ge0FzeW5jRnVuY3Rpb259IGl0ZXJhdGVlIC0gQW4gYXN5bmMgdHJ1dGggdGVzdCB0byBhcHBseSB0byBlYWNoIGl0ZW1cbiAgICAgKiBpbiB0aGUgY29sbGVjdGlvbiBpbiBwYXJhbGxlbC5cbiAgICAgKiBUaGUgaXRlcmF0ZWUgbXVzdCBjb21wbGV0ZSB3aXRoIGEgYm9vbGVhbiByZXN1bHQgdmFsdWUuXG4gICAgICogSW52b2tlZCB3aXRoIChpdGVtLCBjYWxsYmFjaykuXG4gICAgICogQHBhcmFtIHtGdW5jdGlvbn0gW2NhbGxiYWNrXSAtIEEgY2FsbGJhY2sgd2hpY2ggaXMgY2FsbGVkIGFmdGVyIGFsbCB0aGVcbiAgICAgKiBgaXRlcmF0ZWVgIGZ1bmN0aW9ucyBoYXZlIGZpbmlzaGVkLiBSZXN1bHQgd2lsbCBiZSBlaXRoZXIgYHRydWVgIG9yIGBmYWxzZWBcbiAgICAgKiBkZXBlbmRpbmcgb24gdGhlIHZhbHVlcyBvZiB0aGUgYXN5bmMgdGVzdHMuIEludm9rZWQgd2l0aCAoZXJyLCByZXN1bHQpLlxuICAgICAqIEByZXR1cm5zIHtQcm9taXNlfSBhIHByb21pc2UsIGlmIG5vIGNhbGxiYWNrIHByb3ZpZGVkXG4gICAgICogQGV4YW1wbGVcbiAgICAgKlxuICAgICAqIC8vIGRpcjEgaXMgYSBkaXJlY3RvcnkgdGhhdCBjb250YWlucyBmaWxlMS50eHQsIGZpbGUyLnR4dFxuICAgICAqIC8vIGRpcjIgaXMgYSBkaXJlY3RvcnkgdGhhdCBjb250YWlucyBmaWxlMy50eHQsIGZpbGU0LnR4dFxuICAgICAqIC8vIGRpcjMgaXMgYSBkaXJlY3RvcnkgdGhhdCBjb250YWlucyBmaWxlNS50eHRcbiAgICAgKiAvLyBkaXI0IGRvZXMgbm90IGV4aXN0XG4gICAgICpcbiAgICAgKiBjb25zdCBmaWxlTGlzdCA9IFsnZGlyMS9maWxlMS50eHQnLCdkaXIyL2ZpbGUzLnR4dCcsJ2RpcjMvZmlsZTUudHh0J107XG4gICAgICogY29uc3Qgd2l0aE1pc3NpbmdGaWxlTGlzdCA9IFsnZmlsZTEudHh0JywnZmlsZTIudHh0JywnZmlsZTQudHh0J107XG4gICAgICpcbiAgICAgKiAvLyBhc3luY2hyb25vdXMgZnVuY3Rpb24gdGhhdCBjaGVja3MgaWYgYSBmaWxlIGV4aXN0c1xuICAgICAqIGZ1bmN0aW9uIGZpbGVFeGlzdHMoZmlsZSwgY2FsbGJhY2spIHtcbiAgICAgKiAgICBmcy5hY2Nlc3MoZmlsZSwgZnMuY29uc3RhbnRzLkZfT0ssIChlcnIpID0+IHtcbiAgICAgKiAgICAgICAgY2FsbGJhY2sobnVsbCwgIWVycik7XG4gICAgICogICAgfSk7XG4gICAgICogfVxuICAgICAqXG4gICAgICogLy8gVXNpbmcgY2FsbGJhY2tzXG4gICAgICogYXN5bmMuZXZlcnkoZmlsZUxpc3QsIGZpbGVFeGlzdHMsIGZ1bmN0aW9uKGVyciwgcmVzdWx0KSB7XG4gICAgICogICAgIGNvbnNvbGUubG9nKHJlc3VsdCk7XG4gICAgICogICAgIC8vIHRydWVcbiAgICAgKiAgICAgLy8gcmVzdWx0IGlzIHRydWUgc2luY2UgZXZlcnkgZmlsZSBleGlzdHNcbiAgICAgKiB9KTtcbiAgICAgKlxuICAgICAqIGFzeW5jLmV2ZXJ5KHdpdGhNaXNzaW5nRmlsZUxpc3QsIGZpbGVFeGlzdHMsIGZ1bmN0aW9uKGVyciwgcmVzdWx0KSB7XG4gICAgICogICAgIGNvbnNvbGUubG9nKHJlc3VsdCk7XG4gICAgICogICAgIC8vIGZhbHNlXG4gICAgICogICAgIC8vIHJlc3VsdCBpcyBmYWxzZSBzaW5jZSBOT1QgZXZlcnkgZmlsZSBleGlzdHNcbiAgICAgKiB9KTtcbiAgICAgKlxuICAgICAqIC8vIFVzaW5nIFByb21pc2VzXG4gICAgICogYXN5bmMuZXZlcnkoZmlsZUxpc3QsIGZpbGVFeGlzdHMpXG4gICAgICogLnRoZW4oIHJlc3VsdCA9PiB7XG4gICAgICogICAgIGNvbnNvbGUubG9nKHJlc3VsdCk7XG4gICAgICogICAgIC8vIHRydWVcbiAgICAgKiAgICAgLy8gcmVzdWx0IGlzIHRydWUgc2luY2UgZXZlcnkgZmlsZSBleGlzdHNcbiAgICAgKiB9KS5jYXRjaCggZXJyID0+IHtcbiAgICAgKiAgICAgY29uc29sZS5sb2coZXJyKTtcbiAgICAgKiB9KTtcbiAgICAgKlxuICAgICAqIGFzeW5jLmV2ZXJ5KHdpdGhNaXNzaW5nRmlsZUxpc3QsIGZpbGVFeGlzdHMpXG4gICAgICogLnRoZW4oIHJlc3VsdCA9PiB7XG4gICAgICogICAgIGNvbnNvbGUubG9nKHJlc3VsdCk7XG4gICAgICogICAgIC8vIGZhbHNlXG4gICAgICogICAgIC8vIHJlc3VsdCBpcyBmYWxzZSBzaW5jZSBOT1QgZXZlcnkgZmlsZSBleGlzdHNcbiAgICAgKiB9KS5jYXRjaCggZXJyID0+IHtcbiAgICAgKiAgICAgY29uc29sZS5sb2coZXJyKTtcbiAgICAgKiB9KTtcbiAgICAgKlxuICAgICAqIC8vIFVzaW5nIGFzeW5jL2F3YWl0XG4gICAgICogYXN5bmMgKCkgPT4ge1xuICAgICAqICAgICB0cnkge1xuICAgICAqICAgICAgICAgbGV0IHJlc3VsdCA9IGF3YWl0IGFzeW5jLmV2ZXJ5KGZpbGVMaXN0LCBmaWxlRXhpc3RzKTtcbiAgICAgKiAgICAgICAgIGNvbnNvbGUubG9nKHJlc3VsdCk7XG4gICAgICogICAgICAgICAvLyB0cnVlXG4gICAgICogICAgICAgICAvLyByZXN1bHQgaXMgdHJ1ZSBzaW5jZSBldmVyeSBmaWxlIGV4aXN0c1xuICAgICAqICAgICB9XG4gICAgICogICAgIGNhdGNoIChlcnIpIHtcbiAgICAgKiAgICAgICAgIGNvbnNvbGUubG9nKGVycik7XG4gICAgICogICAgIH1cbiAgICAgKiB9XG4gICAgICpcbiAgICAgKiBhc3luYyAoKSA9PiB7XG4gICAgICogICAgIHRyeSB7XG4gICAgICogICAgICAgICBsZXQgcmVzdWx0ID0gYXdhaXQgYXN5bmMuZXZlcnkod2l0aE1pc3NpbmdGaWxlTGlzdCwgZmlsZUV4aXN0cyk7XG4gICAgICogICAgICAgICBjb25zb2xlLmxvZyhyZXN1bHQpO1xuICAgICAqICAgICAgICAgLy8gZmFsc2VcbiAgICAgKiAgICAgICAgIC8vIHJlc3VsdCBpcyBmYWxzZSBzaW5jZSBOT1QgZXZlcnkgZmlsZSBleGlzdHNcbiAgICAgKiAgICAgfVxuICAgICAqICAgICBjYXRjaCAoZXJyKSB7XG4gICAgICogICAgICAgICBjb25zb2xlLmxvZyhlcnIpO1xuICAgICAqICAgICB9XG4gICAgICogfVxuICAgICAqXG4gICAgICovXG4gICAgZnVuY3Rpb24gZXZlcnkoY29sbCwgaXRlcmF0ZWUsIGNhbGxiYWNrKSB7XG4gICAgICAgIHJldHVybiBfY3JlYXRlVGVzdGVyKGJvb2wgPT4gIWJvb2wsIHJlcyA9PiAhcmVzKShlYWNoT2YkMSwgY29sbCwgaXRlcmF0ZWUsIGNhbGxiYWNrKVxuICAgIH1cbiAgICB2YXIgZXZlcnkkMSA9IGF3YWl0aWZ5KGV2ZXJ5LCAzKTtcblxuICAgIC8qKlxuICAgICAqIFRoZSBzYW1lIGFzIFtgZXZlcnlgXXtAbGluayBtb2R1bGU6Q29sbGVjdGlvbnMuZXZlcnl9IGJ1dCBydW5zIGEgbWF4aW11bSBvZiBgbGltaXRgIGFzeW5jIG9wZXJhdGlvbnMgYXQgYSB0aW1lLlxuICAgICAqXG4gICAgICogQG5hbWUgZXZlcnlMaW1pdFxuICAgICAqIEBzdGF0aWNcbiAgICAgKiBAbWVtYmVyT2YgbW9kdWxlOkNvbGxlY3Rpb25zXG4gICAgICogQG1ldGhvZFxuICAgICAqIEBzZWUgW2FzeW5jLmV2ZXJ5XXtAbGluayBtb2R1bGU6Q29sbGVjdGlvbnMuZXZlcnl9XG4gICAgICogQGFsaWFzIGFsbExpbWl0XG4gICAgICogQGNhdGVnb3J5IENvbGxlY3Rpb25cbiAgICAgKiBAcGFyYW0ge0FycmF5fEl0ZXJhYmxlfEFzeW5jSXRlcmFibGV8T2JqZWN0fSBjb2xsIC0gQSBjb2xsZWN0aW9uIHRvIGl0ZXJhdGUgb3Zlci5cbiAgICAgKiBAcGFyYW0ge251bWJlcn0gbGltaXQgLSBUaGUgbWF4aW11bSBudW1iZXIgb2YgYXN5bmMgb3BlcmF0aW9ucyBhdCBhIHRpbWUuXG4gICAgICogQHBhcmFtIHtBc3luY0Z1bmN0aW9ufSBpdGVyYXRlZSAtIEFuIGFzeW5jIHRydXRoIHRlc3QgdG8gYXBwbHkgdG8gZWFjaCBpdGVtXG4gICAgICogaW4gdGhlIGNvbGxlY3Rpb24gaW4gcGFyYWxsZWwuXG4gICAgICogVGhlIGl0ZXJhdGVlIG11c3QgY29tcGxldGUgd2l0aCBhIGJvb2xlYW4gcmVzdWx0IHZhbHVlLlxuICAgICAqIEludm9rZWQgd2l0aCAoaXRlbSwgY2FsbGJhY2spLlxuICAgICAqIEBwYXJhbSB7RnVuY3Rpb259IFtjYWxsYmFja10gLSBBIGNhbGxiYWNrIHdoaWNoIGlzIGNhbGxlZCBhZnRlciBhbGwgdGhlXG4gICAgICogYGl0ZXJhdGVlYCBmdW5jdGlvbnMgaGF2ZSBmaW5pc2hlZC4gUmVzdWx0IHdpbGwgYmUgZWl0aGVyIGB0cnVlYCBvciBgZmFsc2VgXG4gICAgICogZGVwZW5kaW5nIG9uIHRoZSB2YWx1ZXMgb2YgdGhlIGFzeW5jIHRlc3RzLiBJbnZva2VkIHdpdGggKGVyciwgcmVzdWx0KS5cbiAgICAgKiBAcmV0dXJucyB7UHJvbWlzZX0gYSBwcm9taXNlLCBpZiBubyBjYWxsYmFjayBwcm92aWRlZFxuICAgICAqL1xuICAgIGZ1bmN0aW9uIGV2ZXJ5TGltaXQoY29sbCwgbGltaXQsIGl0ZXJhdGVlLCBjYWxsYmFjaykge1xuICAgICAgICByZXR1cm4gX2NyZWF0ZVRlc3Rlcihib29sID0+ICFib29sLCByZXMgPT4gIXJlcykoZWFjaE9mTGltaXQkMihsaW1pdCksIGNvbGwsIGl0ZXJhdGVlLCBjYWxsYmFjaylcbiAgICB9XG4gICAgdmFyIGV2ZXJ5TGltaXQkMSA9IGF3YWl0aWZ5KGV2ZXJ5TGltaXQsIDQpO1xuXG4gICAgLyoqXG4gICAgICogVGhlIHNhbWUgYXMgW2BldmVyeWBde0BsaW5rIG1vZHVsZTpDb2xsZWN0aW9ucy5ldmVyeX0gYnV0IHJ1bnMgb25seSBhIHNpbmdsZSBhc3luYyBvcGVyYXRpb24gYXQgYSB0aW1lLlxuICAgICAqXG4gICAgICogQG5hbWUgZXZlcnlTZXJpZXNcbiAgICAgKiBAc3RhdGljXG4gICAgICogQG1lbWJlck9mIG1vZHVsZTpDb2xsZWN0aW9uc1xuICAgICAqIEBtZXRob2RcbiAgICAgKiBAc2VlIFthc3luYy5ldmVyeV17QGxpbmsgbW9kdWxlOkNvbGxlY3Rpb25zLmV2ZXJ5fVxuICAgICAqIEBhbGlhcyBhbGxTZXJpZXNcbiAgICAgKiBAY2F0ZWdvcnkgQ29sbGVjdGlvblxuICAgICAqIEBwYXJhbSB7QXJyYXl8SXRlcmFibGV8QXN5bmNJdGVyYWJsZXxPYmplY3R9IGNvbGwgLSBBIGNvbGxlY3Rpb24gdG8gaXRlcmF0ZSBvdmVyLlxuICAgICAqIEBwYXJhbSB7QXN5bmNGdW5jdGlvbn0gaXRlcmF0ZWUgLSBBbiBhc3luYyB0cnV0aCB0ZXN0IHRvIGFwcGx5IHRvIGVhY2ggaXRlbVxuICAgICAqIGluIHRoZSBjb2xsZWN0aW9uIGluIHNlcmllcy5cbiAgICAgKiBUaGUgaXRlcmF0ZWUgbXVzdCBjb21wbGV0ZSB3aXRoIGEgYm9vbGVhbiByZXN1bHQgdmFsdWUuXG4gICAgICogSW52b2tlZCB3aXRoIChpdGVtLCBjYWxsYmFjaykuXG4gICAgICogQHBhcmFtIHtGdW5jdGlvbn0gW2NhbGxiYWNrXSAtIEEgY2FsbGJhY2sgd2hpY2ggaXMgY2FsbGVkIGFmdGVyIGFsbCB0aGVcbiAgICAgKiBgaXRlcmF0ZWVgIGZ1bmN0aW9ucyBoYXZlIGZpbmlzaGVkLiBSZXN1bHQgd2lsbCBiZSBlaXRoZXIgYHRydWVgIG9yIGBmYWxzZWBcbiAgICAgKiBkZXBlbmRpbmcgb24gdGhlIHZhbHVlcyBvZiB0aGUgYXN5bmMgdGVzdHMuIEludm9rZWQgd2l0aCAoZXJyLCByZXN1bHQpLlxuICAgICAqIEByZXR1cm5zIHtQcm9taXNlfSBhIHByb21pc2UsIGlmIG5vIGNhbGxiYWNrIHByb3ZpZGVkXG4gICAgICovXG4gICAgZnVuY3Rpb24gZXZlcnlTZXJpZXMoY29sbCwgaXRlcmF0ZWUsIGNhbGxiYWNrKSB7XG4gICAgICAgIHJldHVybiBfY3JlYXRlVGVzdGVyKGJvb2wgPT4gIWJvb2wsIHJlcyA9PiAhcmVzKShlYWNoT2ZTZXJpZXMkMSwgY29sbCwgaXRlcmF0ZWUsIGNhbGxiYWNrKVxuICAgIH1cbiAgICB2YXIgZXZlcnlTZXJpZXMkMSA9IGF3YWl0aWZ5KGV2ZXJ5U2VyaWVzLCAzKTtcblxuICAgIGZ1bmN0aW9uIGZpbHRlckFycmF5KGVhY2hmbiwgYXJyLCBpdGVyYXRlZSwgY2FsbGJhY2spIHtcbiAgICAgICAgdmFyIHRydXRoVmFsdWVzID0gbmV3IEFycmF5KGFyci5sZW5ndGgpO1xuICAgICAgICBlYWNoZm4oYXJyLCAoeCwgaW5kZXgsIGl0ZXJDYikgPT4ge1xuICAgICAgICAgICAgaXRlcmF0ZWUoeCwgKGVyciwgdikgPT4ge1xuICAgICAgICAgICAgICAgIHRydXRoVmFsdWVzW2luZGV4XSA9ICEhdjtcbiAgICAgICAgICAgICAgICBpdGVyQ2IoZXJyKTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9LCBlcnIgPT4ge1xuICAgICAgICAgICAgaWYgKGVycikgcmV0dXJuIGNhbGxiYWNrKGVycik7XG4gICAgICAgICAgICB2YXIgcmVzdWx0cyA9IFtdO1xuICAgICAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBhcnIubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgICAgICBpZiAodHJ1dGhWYWx1ZXNbaV0pIHJlc3VsdHMucHVzaChhcnJbaV0pO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgY2FsbGJhY2sobnVsbCwgcmVzdWx0cyk7XG4gICAgICAgIH0pO1xuICAgIH1cblxuICAgIGZ1bmN0aW9uIGZpbHRlckdlbmVyaWMoZWFjaGZuLCBjb2xsLCBpdGVyYXRlZSwgY2FsbGJhY2spIHtcbiAgICAgICAgdmFyIHJlc3VsdHMgPSBbXTtcbiAgICAgICAgZWFjaGZuKGNvbGwsICh4LCBpbmRleCwgaXRlckNiKSA9PiB7XG4gICAgICAgICAgICBpdGVyYXRlZSh4LCAoZXJyLCB2KSA9PiB7XG4gICAgICAgICAgICAgICAgaWYgKGVycikgcmV0dXJuIGl0ZXJDYihlcnIpO1xuICAgICAgICAgICAgICAgIGlmICh2KSB7XG4gICAgICAgICAgICAgICAgICAgIHJlc3VsdHMucHVzaCh7aW5kZXgsIHZhbHVlOiB4fSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGl0ZXJDYihlcnIpO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgIH0sIGVyciA9PiB7XG4gICAgICAgICAgICBpZiAoZXJyKSByZXR1cm4gY2FsbGJhY2soZXJyKTtcbiAgICAgICAgICAgIGNhbGxiYWNrKG51bGwsIHJlc3VsdHNcbiAgICAgICAgICAgICAgICAuc29ydCgoYSwgYikgPT4gYS5pbmRleCAtIGIuaW5kZXgpXG4gICAgICAgICAgICAgICAgLm1hcCh2ID0+IHYudmFsdWUpKTtcbiAgICAgICAgfSk7XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gX2ZpbHRlcihlYWNoZm4sIGNvbGwsIGl0ZXJhdGVlLCBjYWxsYmFjaykge1xuICAgICAgICB2YXIgZmlsdGVyID0gaXNBcnJheUxpa2UoY29sbCkgPyBmaWx0ZXJBcnJheSA6IGZpbHRlckdlbmVyaWM7XG4gICAgICAgIHJldHVybiBmaWx0ZXIoZWFjaGZuLCBjb2xsLCB3cmFwQXN5bmMoaXRlcmF0ZWUpLCBjYWxsYmFjayk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogUmV0dXJucyBhIG5ldyBhcnJheSBvZiBhbGwgdGhlIHZhbHVlcyBpbiBgY29sbGAgd2hpY2ggcGFzcyBhbiBhc3luYyB0cnV0aFxuICAgICAqIHRlc3QuIFRoaXMgb3BlcmF0aW9uIGlzIHBlcmZvcm1lZCBpbiBwYXJhbGxlbCwgYnV0IHRoZSByZXN1bHRzIGFycmF5IHdpbGwgYmVcbiAgICAgKiBpbiB0aGUgc2FtZSBvcmRlciBhcyB0aGUgb3JpZ2luYWwuXG4gICAgICpcbiAgICAgKiBAbmFtZSBmaWx0ZXJcbiAgICAgKiBAc3RhdGljXG4gICAgICogQG1lbWJlck9mIG1vZHVsZTpDb2xsZWN0aW9uc1xuICAgICAqIEBtZXRob2RcbiAgICAgKiBAYWxpYXMgc2VsZWN0XG4gICAgICogQGNhdGVnb3J5IENvbGxlY3Rpb25cbiAgICAgKiBAcGFyYW0ge0FycmF5fEl0ZXJhYmxlfEFzeW5jSXRlcmFibGV8T2JqZWN0fSBjb2xsIC0gQSBjb2xsZWN0aW9uIHRvIGl0ZXJhdGUgb3Zlci5cbiAgICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBpdGVyYXRlZSAtIEEgdHJ1dGggdGVzdCB0byBhcHBseSB0byBlYWNoIGl0ZW0gaW4gYGNvbGxgLlxuICAgICAqIFRoZSBgaXRlcmF0ZWVgIGlzIHBhc3NlZCBhIGBjYWxsYmFjayhlcnIsIHRydXRoVmFsdWUpYCwgd2hpY2ggbXVzdCBiZSBjYWxsZWRcbiAgICAgKiB3aXRoIGEgYm9vbGVhbiBhcmd1bWVudCBvbmNlIGl0IGhhcyBjb21wbGV0ZWQuIEludm9rZWQgd2l0aCAoaXRlbSwgY2FsbGJhY2spLlxuICAgICAqIEBwYXJhbSB7RnVuY3Rpb259IFtjYWxsYmFja10gLSBBIGNhbGxiYWNrIHdoaWNoIGlzIGNhbGxlZCBhZnRlciBhbGwgdGhlXG4gICAgICogYGl0ZXJhdGVlYCBmdW5jdGlvbnMgaGF2ZSBmaW5pc2hlZC4gSW52b2tlZCB3aXRoIChlcnIsIHJlc3VsdHMpLlxuICAgICAqIEByZXR1cm5zIHtQcm9taXNlfSBhIHByb21pc2UsIGlmIG5vIGNhbGxiYWNrIHByb3ZpZGVkXG4gICAgICogQGV4YW1wbGVcbiAgICAgKlxuICAgICAqIC8vIGRpcjEgaXMgYSBkaXJlY3RvcnkgdGhhdCBjb250YWlucyBmaWxlMS50eHQsIGZpbGUyLnR4dFxuICAgICAqIC8vIGRpcjIgaXMgYSBkaXJlY3RvcnkgdGhhdCBjb250YWlucyBmaWxlMy50eHQsIGZpbGU0LnR4dFxuICAgICAqIC8vIGRpcjMgaXMgYSBkaXJlY3RvcnkgdGhhdCBjb250YWlucyBmaWxlNS50eHRcbiAgICAgKlxuICAgICAqIGNvbnN0IGZpbGVzID0gWydkaXIxL2ZpbGUxLnR4dCcsJ2RpcjIvZmlsZTMudHh0JywnZGlyMy9maWxlNi50eHQnXTtcbiAgICAgKlxuICAgICAqIC8vIGFzeW5jaHJvbm91cyBmdW5jdGlvbiB0aGF0IGNoZWNrcyBpZiBhIGZpbGUgZXhpc3RzXG4gICAgICogZnVuY3Rpb24gZmlsZUV4aXN0cyhmaWxlLCBjYWxsYmFjaykge1xuICAgICAqICAgIGZzLmFjY2VzcyhmaWxlLCBmcy5jb25zdGFudHMuRl9PSywgKGVycikgPT4ge1xuICAgICAqICAgICAgICBjYWxsYmFjayhudWxsLCAhZXJyKTtcbiAgICAgKiAgICB9KTtcbiAgICAgKiB9XG4gICAgICpcbiAgICAgKiAvLyBVc2luZyBjYWxsYmFja3NcbiAgICAgKiBhc3luYy5maWx0ZXIoZmlsZXMsIGZpbGVFeGlzdHMsIGZ1bmN0aW9uKGVyciwgcmVzdWx0cykge1xuICAgICAqICAgIGlmKGVycikge1xuICAgICAqICAgICAgICBjb25zb2xlLmxvZyhlcnIpO1xuICAgICAqICAgIH0gZWxzZSB7XG4gICAgICogICAgICAgIGNvbnNvbGUubG9nKHJlc3VsdHMpO1xuICAgICAqICAgICAgICAvLyBbICdkaXIxL2ZpbGUxLnR4dCcsICdkaXIyL2ZpbGUzLnR4dCcgXVxuICAgICAqICAgICAgICAvLyByZXN1bHRzIGlzIG5vdyBhbiBhcnJheSBvZiB0aGUgZXhpc3RpbmcgZmlsZXNcbiAgICAgKiAgICB9XG4gICAgICogfSk7XG4gICAgICpcbiAgICAgKiAvLyBVc2luZyBQcm9taXNlc1xuICAgICAqIGFzeW5jLmZpbHRlcihmaWxlcywgZmlsZUV4aXN0cylcbiAgICAgKiAudGhlbihyZXN1bHRzID0+IHtcbiAgICAgKiAgICAgY29uc29sZS5sb2cocmVzdWx0cyk7XG4gICAgICogICAgIC8vIFsgJ2RpcjEvZmlsZTEudHh0JywgJ2RpcjIvZmlsZTMudHh0JyBdXG4gICAgICogICAgIC8vIHJlc3VsdHMgaXMgbm93IGFuIGFycmF5IG9mIHRoZSBleGlzdGluZyBmaWxlc1xuICAgICAqIH0pLmNhdGNoKGVyciA9PiB7XG4gICAgICogICAgIGNvbnNvbGUubG9nKGVycik7XG4gICAgICogfSk7XG4gICAgICpcbiAgICAgKiAvLyBVc2luZyBhc3luYy9hd2FpdFxuICAgICAqIGFzeW5jICgpID0+IHtcbiAgICAgKiAgICAgdHJ5IHtcbiAgICAgKiAgICAgICAgIGxldCByZXN1bHRzID0gYXdhaXQgYXN5bmMuZmlsdGVyKGZpbGVzLCBmaWxlRXhpc3RzKTtcbiAgICAgKiAgICAgICAgIGNvbnNvbGUubG9nKHJlc3VsdHMpO1xuICAgICAqICAgICAgICAgLy8gWyAnZGlyMS9maWxlMS50eHQnLCAnZGlyMi9maWxlMy50eHQnIF1cbiAgICAgKiAgICAgICAgIC8vIHJlc3VsdHMgaXMgbm93IGFuIGFycmF5IG9mIHRoZSBleGlzdGluZyBmaWxlc1xuICAgICAqICAgICB9XG4gICAgICogICAgIGNhdGNoIChlcnIpIHtcbiAgICAgKiAgICAgICAgIGNvbnNvbGUubG9nKGVycik7XG4gICAgICogICAgIH1cbiAgICAgKiB9XG4gICAgICpcbiAgICAgKi9cbiAgICBmdW5jdGlvbiBmaWx0ZXIgKGNvbGwsIGl0ZXJhdGVlLCBjYWxsYmFjaykge1xuICAgICAgICByZXR1cm4gX2ZpbHRlcihlYWNoT2YkMSwgY29sbCwgaXRlcmF0ZWUsIGNhbGxiYWNrKVxuICAgIH1cbiAgICB2YXIgZmlsdGVyJDEgPSBhd2FpdGlmeShmaWx0ZXIsIDMpO1xuXG4gICAgLyoqXG4gICAgICogVGhlIHNhbWUgYXMgW2BmaWx0ZXJgXXtAbGluayBtb2R1bGU6Q29sbGVjdGlvbnMuZmlsdGVyfSBidXQgcnVucyBhIG1heGltdW0gb2YgYGxpbWl0YCBhc3luYyBvcGVyYXRpb25zIGF0IGFcbiAgICAgKiB0aW1lLlxuICAgICAqXG4gICAgICogQG5hbWUgZmlsdGVyTGltaXRcbiAgICAgKiBAc3RhdGljXG4gICAgICogQG1lbWJlck9mIG1vZHVsZTpDb2xsZWN0aW9uc1xuICAgICAqIEBtZXRob2RcbiAgICAgKiBAc2VlIFthc3luYy5maWx0ZXJde0BsaW5rIG1vZHVsZTpDb2xsZWN0aW9ucy5maWx0ZXJ9XG4gICAgICogQGFsaWFzIHNlbGVjdExpbWl0XG4gICAgICogQGNhdGVnb3J5IENvbGxlY3Rpb25cbiAgICAgKiBAcGFyYW0ge0FycmF5fEl0ZXJhYmxlfEFzeW5jSXRlcmFibGV8T2JqZWN0fSBjb2xsIC0gQSBjb2xsZWN0aW9uIHRvIGl0ZXJhdGUgb3Zlci5cbiAgICAgKiBAcGFyYW0ge251bWJlcn0gbGltaXQgLSBUaGUgbWF4aW11bSBudW1iZXIgb2YgYXN5bmMgb3BlcmF0aW9ucyBhdCBhIHRpbWUuXG4gICAgICogQHBhcmFtIHtGdW5jdGlvbn0gaXRlcmF0ZWUgLSBBIHRydXRoIHRlc3QgdG8gYXBwbHkgdG8gZWFjaCBpdGVtIGluIGBjb2xsYC5cbiAgICAgKiBUaGUgYGl0ZXJhdGVlYCBpcyBwYXNzZWQgYSBgY2FsbGJhY2soZXJyLCB0cnV0aFZhbHVlKWAsIHdoaWNoIG11c3QgYmUgY2FsbGVkXG4gICAgICogd2l0aCBhIGJvb2xlYW4gYXJndW1lbnQgb25jZSBpdCBoYXMgY29tcGxldGVkLiBJbnZva2VkIHdpdGggKGl0ZW0sIGNhbGxiYWNrKS5cbiAgICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBbY2FsbGJhY2tdIC0gQSBjYWxsYmFjayB3aGljaCBpcyBjYWxsZWQgYWZ0ZXIgYWxsIHRoZVxuICAgICAqIGBpdGVyYXRlZWAgZnVuY3Rpb25zIGhhdmUgZmluaXNoZWQuIEludm9rZWQgd2l0aCAoZXJyLCByZXN1bHRzKS5cbiAgICAgKiBAcmV0dXJucyB7UHJvbWlzZX0gYSBwcm9taXNlLCBpZiBubyBjYWxsYmFjayBwcm92aWRlZFxuICAgICAqL1xuICAgIGZ1bmN0aW9uIGZpbHRlckxpbWl0IChjb2xsLCBsaW1pdCwgaXRlcmF0ZWUsIGNhbGxiYWNrKSB7XG4gICAgICAgIHJldHVybiBfZmlsdGVyKGVhY2hPZkxpbWl0JDIobGltaXQpLCBjb2xsLCBpdGVyYXRlZSwgY2FsbGJhY2spXG4gICAgfVxuICAgIHZhciBmaWx0ZXJMaW1pdCQxID0gYXdhaXRpZnkoZmlsdGVyTGltaXQsIDQpO1xuXG4gICAgLyoqXG4gICAgICogVGhlIHNhbWUgYXMgW2BmaWx0ZXJgXXtAbGluayBtb2R1bGU6Q29sbGVjdGlvbnMuZmlsdGVyfSBidXQgcnVucyBvbmx5IGEgc2luZ2xlIGFzeW5jIG9wZXJhdGlvbiBhdCBhIHRpbWUuXG4gICAgICpcbiAgICAgKiBAbmFtZSBmaWx0ZXJTZXJpZXNcbiAgICAgKiBAc3RhdGljXG4gICAgICogQG1lbWJlck9mIG1vZHVsZTpDb2xsZWN0aW9uc1xuICAgICAqIEBtZXRob2RcbiAgICAgKiBAc2VlIFthc3luYy5maWx0ZXJde0BsaW5rIG1vZHVsZTpDb2xsZWN0aW9ucy5maWx0ZXJ9XG4gICAgICogQGFsaWFzIHNlbGVjdFNlcmllc1xuICAgICAqIEBjYXRlZ29yeSBDb2xsZWN0aW9uXG4gICAgICogQHBhcmFtIHtBcnJheXxJdGVyYWJsZXxBc3luY0l0ZXJhYmxlfE9iamVjdH0gY29sbCAtIEEgY29sbGVjdGlvbiB0byBpdGVyYXRlIG92ZXIuXG4gICAgICogQHBhcmFtIHtGdW5jdGlvbn0gaXRlcmF0ZWUgLSBBIHRydXRoIHRlc3QgdG8gYXBwbHkgdG8gZWFjaCBpdGVtIGluIGBjb2xsYC5cbiAgICAgKiBUaGUgYGl0ZXJhdGVlYCBpcyBwYXNzZWQgYSBgY2FsbGJhY2soZXJyLCB0cnV0aFZhbHVlKWAsIHdoaWNoIG11c3QgYmUgY2FsbGVkXG4gICAgICogd2l0aCBhIGJvb2xlYW4gYXJndW1lbnQgb25jZSBpdCBoYXMgY29tcGxldGVkLiBJbnZva2VkIHdpdGggKGl0ZW0sIGNhbGxiYWNrKS5cbiAgICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBbY2FsbGJhY2tdIC0gQSBjYWxsYmFjayB3aGljaCBpcyBjYWxsZWQgYWZ0ZXIgYWxsIHRoZVxuICAgICAqIGBpdGVyYXRlZWAgZnVuY3Rpb25zIGhhdmUgZmluaXNoZWQuIEludm9rZWQgd2l0aCAoZXJyLCByZXN1bHRzKVxuICAgICAqIEByZXR1cm5zIHtQcm9taXNlfSBhIHByb21pc2UsIGlmIG5vIGNhbGxiYWNrIHByb3ZpZGVkXG4gICAgICovXG4gICAgZnVuY3Rpb24gZmlsdGVyU2VyaWVzIChjb2xsLCBpdGVyYXRlZSwgY2FsbGJhY2spIHtcbiAgICAgICAgcmV0dXJuIF9maWx0ZXIoZWFjaE9mU2VyaWVzJDEsIGNvbGwsIGl0ZXJhdGVlLCBjYWxsYmFjaylcbiAgICB9XG4gICAgdmFyIGZpbHRlclNlcmllcyQxID0gYXdhaXRpZnkoZmlsdGVyU2VyaWVzLCAzKTtcblxuICAgIC8qKlxuICAgICAqIENhbGxzIHRoZSBhc3luY2hyb25vdXMgZnVuY3Rpb24gYGZuYCB3aXRoIGEgY2FsbGJhY2sgcGFyYW1ldGVyIHRoYXQgYWxsb3dzIGl0XG4gICAgICogdG8gY2FsbCBpdHNlbGYgYWdhaW4sIGluIHNlcmllcywgaW5kZWZpbml0ZWx5LlxuXG4gICAgICogSWYgYW4gZXJyb3IgaXMgcGFzc2VkIHRvIHRoZSBjYWxsYmFjayB0aGVuIGBlcnJiYWNrYCBpcyBjYWxsZWQgd2l0aCB0aGVcbiAgICAgKiBlcnJvciwgYW5kIGV4ZWN1dGlvbiBzdG9wcywgb3RoZXJ3aXNlIGl0IHdpbGwgbmV2ZXIgYmUgY2FsbGVkLlxuICAgICAqXG4gICAgICogQG5hbWUgZm9yZXZlclxuICAgICAqIEBzdGF0aWNcbiAgICAgKiBAbWVtYmVyT2YgbW9kdWxlOkNvbnRyb2xGbG93XG4gICAgICogQG1ldGhvZFxuICAgICAqIEBjYXRlZ29yeSBDb250cm9sIEZsb3dcbiAgICAgKiBAcGFyYW0ge0FzeW5jRnVuY3Rpb259IGZuIC0gYW4gYXN5bmMgZnVuY3Rpb24gdG8gY2FsbCByZXBlYXRlZGx5LlxuICAgICAqIEludm9rZWQgd2l0aCAobmV4dCkuXG4gICAgICogQHBhcmFtIHtGdW5jdGlvbn0gW2VycmJhY2tdIC0gd2hlbiBgZm5gIHBhc3NlcyBhbiBlcnJvciB0byBpdCdzIGNhbGxiYWNrLFxuICAgICAqIHRoaXMgZnVuY3Rpb24gd2lsbCBiZSBjYWxsZWQsIGFuZCBleGVjdXRpb24gc3RvcHMuIEludm9rZWQgd2l0aCAoZXJyKS5cbiAgICAgKiBAcmV0dXJucyB7UHJvbWlzZX0gYSBwcm9taXNlIHRoYXQgcmVqZWN0cyBpZiBhbiBlcnJvciBvY2N1cnMgYW5kIGFuIGVycmJhY2tcbiAgICAgKiBpcyBub3QgcGFzc2VkXG4gICAgICogQGV4YW1wbGVcbiAgICAgKlxuICAgICAqIGFzeW5jLmZvcmV2ZXIoXG4gICAgICogICAgIGZ1bmN0aW9uKG5leHQpIHtcbiAgICAgKiAgICAgICAgIC8vIG5leHQgaXMgc3VpdGFibGUgZm9yIHBhc3NpbmcgdG8gdGhpbmdzIHRoYXQgbmVlZCBhIGNhbGxiYWNrKGVyciBbLCB3aGF0ZXZlcl0pO1xuICAgICAqICAgICAgICAgLy8gaXQgd2lsbCByZXN1bHQgaW4gdGhpcyBmdW5jdGlvbiBiZWluZyBjYWxsZWQgYWdhaW4uXG4gICAgICogICAgIH0sXG4gICAgICogICAgIGZ1bmN0aW9uKGVycikge1xuICAgICAqICAgICAgICAgLy8gaWYgbmV4dCBpcyBjYWxsZWQgd2l0aCBhIHZhbHVlIGluIGl0cyBmaXJzdCBwYXJhbWV0ZXIsIGl0IHdpbGwgYXBwZWFyXG4gICAgICogICAgICAgICAvLyBpbiBoZXJlIGFzICdlcnInLCBhbmQgZXhlY3V0aW9uIHdpbGwgc3RvcC5cbiAgICAgKiAgICAgfVxuICAgICAqICk7XG4gICAgICovXG4gICAgZnVuY3Rpb24gZm9yZXZlcihmbiwgZXJyYmFjaykge1xuICAgICAgICB2YXIgZG9uZSA9IG9ubHlPbmNlKGVycmJhY2spO1xuICAgICAgICB2YXIgdGFzayA9IHdyYXBBc3luYyhlbnN1cmVBc3luYyhmbikpO1xuXG4gICAgICAgIGZ1bmN0aW9uIG5leHQoZXJyKSB7XG4gICAgICAgICAgICBpZiAoZXJyKSByZXR1cm4gZG9uZShlcnIpO1xuICAgICAgICAgICAgaWYgKGVyciA9PT0gZmFsc2UpIHJldHVybjtcbiAgICAgICAgICAgIHRhc2sobmV4dCk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIG5leHQoKTtcbiAgICB9XG4gICAgdmFyIGZvcmV2ZXIkMSA9IGF3YWl0aWZ5KGZvcmV2ZXIsIDIpO1xuXG4gICAgLyoqXG4gICAgICogVGhlIHNhbWUgYXMgW2Bncm91cEJ5YF17QGxpbmsgbW9kdWxlOkNvbGxlY3Rpb25zLmdyb3VwQnl9IGJ1dCBydW5zIGEgbWF4aW11bSBvZiBgbGltaXRgIGFzeW5jIG9wZXJhdGlvbnMgYXQgYSB0aW1lLlxuICAgICAqXG4gICAgICogQG5hbWUgZ3JvdXBCeUxpbWl0XG4gICAgICogQHN0YXRpY1xuICAgICAqIEBtZW1iZXJPZiBtb2R1bGU6Q29sbGVjdGlvbnNcbiAgICAgKiBAbWV0aG9kXG4gICAgICogQHNlZSBbYXN5bmMuZ3JvdXBCeV17QGxpbmsgbW9kdWxlOkNvbGxlY3Rpb25zLmdyb3VwQnl9XG4gICAgICogQGNhdGVnb3J5IENvbGxlY3Rpb25cbiAgICAgKiBAcGFyYW0ge0FycmF5fEl0ZXJhYmxlfEFzeW5jSXRlcmFibGV8T2JqZWN0fSBjb2xsIC0gQSBjb2xsZWN0aW9uIHRvIGl0ZXJhdGUgb3Zlci5cbiAgICAgKiBAcGFyYW0ge251bWJlcn0gbGltaXQgLSBUaGUgbWF4aW11bSBudW1iZXIgb2YgYXN5bmMgb3BlcmF0aW9ucyBhdCBhIHRpbWUuXG4gICAgICogQHBhcmFtIHtBc3luY0Z1bmN0aW9ufSBpdGVyYXRlZSAtIEFuIGFzeW5jIGZ1bmN0aW9uIHRvIGFwcGx5IHRvIGVhY2ggaXRlbSBpblxuICAgICAqIGBjb2xsYC5cbiAgICAgKiBUaGUgaXRlcmF0ZWUgc2hvdWxkIGNvbXBsZXRlIHdpdGggYSBga2V5YCB0byBncm91cCB0aGUgdmFsdWUgdW5kZXIuXG4gICAgICogSW52b2tlZCB3aXRoICh2YWx1ZSwgY2FsbGJhY2spLlxuICAgICAqIEBwYXJhbSB7RnVuY3Rpb259IFtjYWxsYmFja10gLSBBIGNhbGxiYWNrIHdoaWNoIGlzIGNhbGxlZCB3aGVuIGFsbCBgaXRlcmF0ZWVgXG4gICAgICogZnVuY3Rpb25zIGhhdmUgZmluaXNoZWQsIG9yIGFuIGVycm9yIG9jY3Vycy4gUmVzdWx0IGlzIGFuIGBPYmplY3RgIHdob3Nlc1xuICAgICAqIHByb3BlcnRpZXMgYXJlIGFycmF5cyBvZiB2YWx1ZXMgd2hpY2ggcmV0dXJuZWQgdGhlIGNvcnJlc3BvbmRpbmcga2V5LlxuICAgICAqIEByZXR1cm5zIHtQcm9taXNlfSBhIHByb21pc2UsIGlmIG5vIGNhbGxiYWNrIGlzIHBhc3NlZFxuICAgICAqL1xuICAgIGZ1bmN0aW9uIGdyb3VwQnlMaW1pdChjb2xsLCBsaW1pdCwgaXRlcmF0ZWUsIGNhbGxiYWNrKSB7XG4gICAgICAgIHZhciBfaXRlcmF0ZWUgPSB3cmFwQXN5bmMoaXRlcmF0ZWUpO1xuICAgICAgICByZXR1cm4gbWFwTGltaXQkMShjb2xsLCBsaW1pdCwgKHZhbCwgaXRlckNiKSA9PiB7XG4gICAgICAgICAgICBfaXRlcmF0ZWUodmFsLCAoZXJyLCBrZXkpID0+IHtcbiAgICAgICAgICAgICAgICBpZiAoZXJyKSByZXR1cm4gaXRlckNiKGVycik7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGl0ZXJDYihlcnIsIHtrZXksIHZhbH0pO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgIH0sIChlcnIsIG1hcFJlc3VsdHMpID0+IHtcbiAgICAgICAgICAgIHZhciByZXN1bHQgPSB7fTtcbiAgICAgICAgICAgIC8vIGZyb20gTUROLCBoYW5kbGUgb2JqZWN0IGhhdmluZyBhbiBgaGFzT3duUHJvcGVydHlgIHByb3BcbiAgICAgICAgICAgIHZhciB7aGFzT3duUHJvcGVydHl9ID0gT2JqZWN0LnByb3RvdHlwZTtcblxuICAgICAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBtYXBSZXN1bHRzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICAgICAgaWYgKG1hcFJlc3VsdHNbaV0pIHtcbiAgICAgICAgICAgICAgICAgICAgdmFyIHtrZXl9ID0gbWFwUmVzdWx0c1tpXTtcbiAgICAgICAgICAgICAgICAgICAgdmFyIHt2YWx9ID0gbWFwUmVzdWx0c1tpXTtcblxuICAgICAgICAgICAgICAgICAgICBpZiAoaGFzT3duUHJvcGVydHkuY2FsbChyZXN1bHQsIGtleSkpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJlc3VsdFtrZXldLnB1c2godmFsKTtcbiAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJlc3VsdFtrZXldID0gW3ZhbF07XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIHJldHVybiBjYWxsYmFjayhlcnIsIHJlc3VsdCk7XG4gICAgICAgIH0pO1xuICAgIH1cblxuICAgIHZhciBncm91cEJ5TGltaXQkMSA9IGF3YWl0aWZ5KGdyb3VwQnlMaW1pdCwgNCk7XG5cbiAgICAvKipcbiAgICAgKiBSZXR1cm5zIGEgbmV3IG9iamVjdCwgd2hlcmUgZWFjaCB2YWx1ZSBjb3JyZXNwb25kcyB0byBhbiBhcnJheSBvZiBpdGVtcywgZnJvbVxuICAgICAqIGBjb2xsYCwgdGhhdCByZXR1cm5lZCB0aGUgY29ycmVzcG9uZGluZyBrZXkuIFRoYXQgaXMsIHRoZSBrZXlzIG9mIHRoZSBvYmplY3RcbiAgICAgKiBjb3JyZXNwb25kIHRvIHRoZSB2YWx1ZXMgcGFzc2VkIHRvIHRoZSBgaXRlcmF0ZWVgIGNhbGxiYWNrLlxuICAgICAqXG4gICAgICogTm90ZTogU2luY2UgdGhpcyBmdW5jdGlvbiBhcHBsaWVzIHRoZSBgaXRlcmF0ZWVgIHRvIGVhY2ggaXRlbSBpbiBwYXJhbGxlbCxcbiAgICAgKiB0aGVyZSBpcyBubyBndWFyYW50ZWUgdGhhdCB0aGUgYGl0ZXJhdGVlYCBmdW5jdGlvbnMgd2lsbCBjb21wbGV0ZSBpbiBvcmRlci5cbiAgICAgKiBIb3dldmVyLCB0aGUgdmFsdWVzIGZvciBlYWNoIGtleSBpbiB0aGUgYHJlc3VsdGAgd2lsbCBiZSBpbiB0aGUgc2FtZSBvcmRlciBhc1xuICAgICAqIHRoZSBvcmlnaW5hbCBgY29sbGAuIEZvciBPYmplY3RzLCB0aGUgdmFsdWVzIHdpbGwgcm91Z2hseSBiZSBpbiB0aGUgb3JkZXIgb2ZcbiAgICAgKiB0aGUgb3JpZ2luYWwgT2JqZWN0cycga2V5cyAoYnV0IHRoaXMgY2FuIHZhcnkgYWNyb3NzIEphdmFTY3JpcHQgZW5naW5lcykuXG4gICAgICpcbiAgICAgKiBAbmFtZSBncm91cEJ5XG4gICAgICogQHN0YXRpY1xuICAgICAqIEBtZW1iZXJPZiBtb2R1bGU6Q29sbGVjdGlvbnNcbiAgICAgKiBAbWV0aG9kXG4gICAgICogQGNhdGVnb3J5IENvbGxlY3Rpb25cbiAgICAgKiBAcGFyYW0ge0FycmF5fEl0ZXJhYmxlfEFzeW5jSXRlcmFibGV8T2JqZWN0fSBjb2xsIC0gQSBjb2xsZWN0aW9uIHRvIGl0ZXJhdGUgb3Zlci5cbiAgICAgKiBAcGFyYW0ge0FzeW5jRnVuY3Rpb259IGl0ZXJhdGVlIC0gQW4gYXN5bmMgZnVuY3Rpb24gdG8gYXBwbHkgdG8gZWFjaCBpdGVtIGluXG4gICAgICogYGNvbGxgLlxuICAgICAqIFRoZSBpdGVyYXRlZSBzaG91bGQgY29tcGxldGUgd2l0aCBhIGBrZXlgIHRvIGdyb3VwIHRoZSB2YWx1ZSB1bmRlci5cbiAgICAgKiBJbnZva2VkIHdpdGggKHZhbHVlLCBjYWxsYmFjaykuXG4gICAgICogQHBhcmFtIHtGdW5jdGlvbn0gW2NhbGxiYWNrXSAtIEEgY2FsbGJhY2sgd2hpY2ggaXMgY2FsbGVkIHdoZW4gYWxsIGBpdGVyYXRlZWBcbiAgICAgKiBmdW5jdGlvbnMgaGF2ZSBmaW5pc2hlZCwgb3IgYW4gZXJyb3Igb2NjdXJzLiBSZXN1bHQgaXMgYW4gYE9iamVjdGAgd2hvc2VzXG4gICAgICogcHJvcGVydGllcyBhcmUgYXJyYXlzIG9mIHZhbHVlcyB3aGljaCByZXR1cm5lZCB0aGUgY29ycmVzcG9uZGluZyBrZXkuXG4gICAgICogQHJldHVybnMge1Byb21pc2V9IGEgcHJvbWlzZSwgaWYgbm8gY2FsbGJhY2sgaXMgcGFzc2VkXG4gICAgICogQGV4YW1wbGVcbiAgICAgKlxuICAgICAqIC8vIGRpcjEgaXMgYSBkaXJlY3RvcnkgdGhhdCBjb250YWlucyBmaWxlMS50eHQsIGZpbGUyLnR4dFxuICAgICAqIC8vIGRpcjIgaXMgYSBkaXJlY3RvcnkgdGhhdCBjb250YWlucyBmaWxlMy50eHQsIGZpbGU0LnR4dFxuICAgICAqIC8vIGRpcjMgaXMgYSBkaXJlY3RvcnkgdGhhdCBjb250YWlucyBmaWxlNS50eHRcbiAgICAgKiAvLyBkaXI0IGRvZXMgbm90IGV4aXN0XG4gICAgICpcbiAgICAgKiBjb25zdCBmaWxlcyA9IFsnZGlyMS9maWxlMS50eHQnLCdkaXIyJywnZGlyNCddXG4gICAgICpcbiAgICAgKiAvLyBhc3luY2hyb25vdXMgZnVuY3Rpb24gdGhhdCBkZXRlY3RzIGZpbGUgdHlwZSBhcyBub25lLCBmaWxlLCBvciBkaXJlY3RvcnlcbiAgICAgKiBmdW5jdGlvbiBkZXRlY3RGaWxlKGZpbGUsIGNhbGxiYWNrKSB7XG4gICAgICogICAgIGZzLnN0YXQoZmlsZSwgZnVuY3Rpb24oZXJyLCBzdGF0KSB7XG4gICAgICogICAgICAgICBpZiAoZXJyKSB7XG4gICAgICogICAgICAgICAgICAgcmV0dXJuIGNhbGxiYWNrKG51bGwsICdub25lJyk7XG4gICAgICogICAgICAgICB9XG4gICAgICogICAgICAgICBjYWxsYmFjayhudWxsLCBzdGF0LmlzRGlyZWN0b3J5KCkgPyAnZGlyZWN0b3J5JyA6ICdmaWxlJyk7XG4gICAgICogICAgIH0pO1xuICAgICAqIH1cbiAgICAgKlxuICAgICAqIC8vVXNpbmcgY2FsbGJhY2tzXG4gICAgICogYXN5bmMuZ3JvdXBCeShmaWxlcywgZGV0ZWN0RmlsZSwgZnVuY3Rpb24oZXJyLCByZXN1bHQpIHtcbiAgICAgKiAgICAgaWYoZXJyKSB7XG4gICAgICogICAgICAgICBjb25zb2xlLmxvZyhlcnIpO1xuICAgICAqICAgICB9IGVsc2Uge1xuICAgICAqXHQgICAgICAgY29uc29sZS5sb2cocmVzdWx0KTtcbiAgICAgKiAgICAgICAgIC8vIHtcbiAgICAgKiAgICAgICAgIC8vICAgICBmaWxlOiBbICdkaXIxL2ZpbGUxLnR4dCcgXSxcbiAgICAgKiAgICAgICAgIC8vICAgICBub25lOiBbICdkaXI0JyBdLFxuICAgICAqICAgICAgICAgLy8gICAgIGRpcmVjdG9yeTogWyAnZGlyMiddXG4gICAgICogICAgICAgICAvLyB9XG4gICAgICogICAgICAgICAvLyByZXN1bHQgaXMgb2JqZWN0IGNvbnRhaW5pbmcgdGhlIGZpbGVzIGdyb3VwZWQgYnkgdHlwZVxuICAgICAqICAgICB9XG4gICAgICogfSk7XG4gICAgICpcbiAgICAgKiAvLyBVc2luZyBQcm9taXNlc1xuICAgICAqIGFzeW5jLmdyb3VwQnkoZmlsZXMsIGRldGVjdEZpbGUpXG4gICAgICogLnRoZW4oIHJlc3VsdCA9PiB7XG4gICAgICogICAgIGNvbnNvbGUubG9nKHJlc3VsdCk7XG4gICAgICogICAgIC8vIHtcbiAgICAgKiAgICAgLy8gICAgIGZpbGU6IFsgJ2RpcjEvZmlsZTEudHh0JyBdLFxuICAgICAqICAgICAvLyAgICAgbm9uZTogWyAnZGlyNCcgXSxcbiAgICAgKiAgICAgLy8gICAgIGRpcmVjdG9yeTogWyAnZGlyMiddXG4gICAgICogICAgIC8vIH1cbiAgICAgKiAgICAgLy8gcmVzdWx0IGlzIG9iamVjdCBjb250YWluaW5nIHRoZSBmaWxlcyBncm91cGVkIGJ5IHR5cGVcbiAgICAgKiB9KS5jYXRjaCggZXJyID0+IHtcbiAgICAgKiAgICAgY29uc29sZS5sb2coZXJyKTtcbiAgICAgKiB9KTtcbiAgICAgKlxuICAgICAqIC8vIFVzaW5nIGFzeW5jL2F3YWl0XG4gICAgICogYXN5bmMgKCkgPT4ge1xuICAgICAqICAgICB0cnkge1xuICAgICAqICAgICAgICAgbGV0IHJlc3VsdCA9IGF3YWl0IGFzeW5jLmdyb3VwQnkoZmlsZXMsIGRldGVjdEZpbGUpO1xuICAgICAqICAgICAgICAgY29uc29sZS5sb2cocmVzdWx0KTtcbiAgICAgKiAgICAgICAgIC8vIHtcbiAgICAgKiAgICAgICAgIC8vICAgICBmaWxlOiBbICdkaXIxL2ZpbGUxLnR4dCcgXSxcbiAgICAgKiAgICAgICAgIC8vICAgICBub25lOiBbICdkaXI0JyBdLFxuICAgICAqICAgICAgICAgLy8gICAgIGRpcmVjdG9yeTogWyAnZGlyMiddXG4gICAgICogICAgICAgICAvLyB9XG4gICAgICogICAgICAgICAvLyByZXN1bHQgaXMgb2JqZWN0IGNvbnRhaW5pbmcgdGhlIGZpbGVzIGdyb3VwZWQgYnkgdHlwZVxuICAgICAqICAgICB9XG4gICAgICogICAgIGNhdGNoIChlcnIpIHtcbiAgICAgKiAgICAgICAgIGNvbnNvbGUubG9nKGVycik7XG4gICAgICogICAgIH1cbiAgICAgKiB9XG4gICAgICpcbiAgICAgKi9cbiAgICBmdW5jdGlvbiBncm91cEJ5IChjb2xsLCBpdGVyYXRlZSwgY2FsbGJhY2spIHtcbiAgICAgICAgcmV0dXJuIGdyb3VwQnlMaW1pdCQxKGNvbGwsIEluZmluaXR5LCBpdGVyYXRlZSwgY2FsbGJhY2spXG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogVGhlIHNhbWUgYXMgW2Bncm91cEJ5YF17QGxpbmsgbW9kdWxlOkNvbGxlY3Rpb25zLmdyb3VwQnl9IGJ1dCBydW5zIG9ubHkgYSBzaW5nbGUgYXN5bmMgb3BlcmF0aW9uIGF0IGEgdGltZS5cbiAgICAgKlxuICAgICAqIEBuYW1lIGdyb3VwQnlTZXJpZXNcbiAgICAgKiBAc3RhdGljXG4gICAgICogQG1lbWJlck9mIG1vZHVsZTpDb2xsZWN0aW9uc1xuICAgICAqIEBtZXRob2RcbiAgICAgKiBAc2VlIFthc3luYy5ncm91cEJ5XXtAbGluayBtb2R1bGU6Q29sbGVjdGlvbnMuZ3JvdXBCeX1cbiAgICAgKiBAY2F0ZWdvcnkgQ29sbGVjdGlvblxuICAgICAqIEBwYXJhbSB7QXJyYXl8SXRlcmFibGV8QXN5bmNJdGVyYWJsZXxPYmplY3R9IGNvbGwgLSBBIGNvbGxlY3Rpb24gdG8gaXRlcmF0ZSBvdmVyLlxuICAgICAqIEBwYXJhbSB7QXN5bmNGdW5jdGlvbn0gaXRlcmF0ZWUgLSBBbiBhc3luYyBmdW5jdGlvbiB0byBhcHBseSB0byBlYWNoIGl0ZW0gaW5cbiAgICAgKiBgY29sbGAuXG4gICAgICogVGhlIGl0ZXJhdGVlIHNob3VsZCBjb21wbGV0ZSB3aXRoIGEgYGtleWAgdG8gZ3JvdXAgdGhlIHZhbHVlIHVuZGVyLlxuICAgICAqIEludm9rZWQgd2l0aCAodmFsdWUsIGNhbGxiYWNrKS5cbiAgICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBbY2FsbGJhY2tdIC0gQSBjYWxsYmFjayB3aGljaCBpcyBjYWxsZWQgd2hlbiBhbGwgYGl0ZXJhdGVlYFxuICAgICAqIGZ1bmN0aW9ucyBoYXZlIGZpbmlzaGVkLCBvciBhbiBlcnJvciBvY2N1cnMuIFJlc3VsdCBpcyBhbiBgT2JqZWN0YCB3aG9zZVxuICAgICAqIHByb3BlcnRpZXMgYXJlIGFycmF5cyBvZiB2YWx1ZXMgd2hpY2ggcmV0dXJuZWQgdGhlIGNvcnJlc3BvbmRpbmcga2V5LlxuICAgICAqIEByZXR1cm5zIHtQcm9taXNlfSBhIHByb21pc2UsIGlmIG5vIGNhbGxiYWNrIGlzIHBhc3NlZFxuICAgICAqL1xuICAgIGZ1bmN0aW9uIGdyb3VwQnlTZXJpZXMgKGNvbGwsIGl0ZXJhdGVlLCBjYWxsYmFjaykge1xuICAgICAgICByZXR1cm4gZ3JvdXBCeUxpbWl0JDEoY29sbCwgMSwgaXRlcmF0ZWUsIGNhbGxiYWNrKVxuICAgIH1cblxuICAgIC8qKlxuICAgICAqIExvZ3MgdGhlIHJlc3VsdCBvZiBhbiBgYXN5bmNgIGZ1bmN0aW9uIHRvIHRoZSBgY29uc29sZWAuIE9ubHkgd29ya3MgaW5cbiAgICAgKiBOb2RlLmpzIG9yIGluIGJyb3dzZXJzIHRoYXQgc3VwcG9ydCBgY29uc29sZS5sb2dgIGFuZCBgY29uc29sZS5lcnJvcmAgKHN1Y2hcbiAgICAgKiBhcyBGRiBhbmQgQ2hyb21lKS4gSWYgbXVsdGlwbGUgYXJndW1lbnRzIGFyZSByZXR1cm5lZCBmcm9tIHRoZSBhc3luY1xuICAgICAqIGZ1bmN0aW9uLCBgY29uc29sZS5sb2dgIGlzIGNhbGxlZCBvbiBlYWNoIGFyZ3VtZW50IGluIG9yZGVyLlxuICAgICAqXG4gICAgICogQG5hbWUgbG9nXG4gICAgICogQHN0YXRpY1xuICAgICAqIEBtZW1iZXJPZiBtb2R1bGU6VXRpbHNcbiAgICAgKiBAbWV0aG9kXG4gICAgICogQGNhdGVnb3J5IFV0aWxcbiAgICAgKiBAcGFyYW0ge0FzeW5jRnVuY3Rpb259IGZ1bmN0aW9uIC0gVGhlIGZ1bmN0aW9uIHlvdSB3YW50IHRvIGV2ZW50dWFsbHkgYXBwbHlcbiAgICAgKiBhbGwgYXJndW1lbnRzIHRvLlxuICAgICAqIEBwYXJhbSB7Li4uKn0gYXJndW1lbnRzLi4uIC0gQW55IG51bWJlciBvZiBhcmd1bWVudHMgdG8gYXBwbHkgdG8gdGhlIGZ1bmN0aW9uLlxuICAgICAqIEBleGFtcGxlXG4gICAgICpcbiAgICAgKiAvLyBpbiBhIG1vZHVsZVxuICAgICAqIHZhciBoZWxsbyA9IGZ1bmN0aW9uKG5hbWUsIGNhbGxiYWNrKSB7XG4gICAgICogICAgIHNldFRpbWVvdXQoZnVuY3Rpb24oKSB7XG4gICAgICogICAgICAgICBjYWxsYmFjayhudWxsLCAnaGVsbG8gJyArIG5hbWUpO1xuICAgICAqICAgICB9LCAxMDAwKTtcbiAgICAgKiB9O1xuICAgICAqXG4gICAgICogLy8gaW4gdGhlIG5vZGUgcmVwbFxuICAgICAqIG5vZGU+IGFzeW5jLmxvZyhoZWxsbywgJ3dvcmxkJyk7XG4gICAgICogJ2hlbGxvIHdvcmxkJ1xuICAgICAqL1xuICAgIHZhciBsb2cgPSBjb25zb2xlRnVuYygnbG9nJyk7XG5cbiAgICAvKipcbiAgICAgKiBUaGUgc2FtZSBhcyBbYG1hcFZhbHVlc2Bde0BsaW5rIG1vZHVsZTpDb2xsZWN0aW9ucy5tYXBWYWx1ZXN9IGJ1dCBydW5zIGEgbWF4aW11bSBvZiBgbGltaXRgIGFzeW5jIG9wZXJhdGlvbnMgYXQgYVxuICAgICAqIHRpbWUuXG4gICAgICpcbiAgICAgKiBAbmFtZSBtYXBWYWx1ZXNMaW1pdFxuICAgICAqIEBzdGF0aWNcbiAgICAgKiBAbWVtYmVyT2YgbW9kdWxlOkNvbGxlY3Rpb25zXG4gICAgICogQG1ldGhvZFxuICAgICAqIEBzZWUgW2FzeW5jLm1hcFZhbHVlc117QGxpbmsgbW9kdWxlOkNvbGxlY3Rpb25zLm1hcFZhbHVlc31cbiAgICAgKiBAY2F0ZWdvcnkgQ29sbGVjdGlvblxuICAgICAqIEBwYXJhbSB7T2JqZWN0fSBvYmogLSBBIGNvbGxlY3Rpb24gdG8gaXRlcmF0ZSBvdmVyLlxuICAgICAqIEBwYXJhbSB7bnVtYmVyfSBsaW1pdCAtIFRoZSBtYXhpbXVtIG51bWJlciBvZiBhc3luYyBvcGVyYXRpb25zIGF0IGEgdGltZS5cbiAgICAgKiBAcGFyYW0ge0FzeW5jRnVuY3Rpb259IGl0ZXJhdGVlIC0gQSBmdW5jdGlvbiB0byBhcHBseSB0byBlYWNoIHZhbHVlIGFuZCBrZXlcbiAgICAgKiBpbiBgY29sbGAuXG4gICAgICogVGhlIGl0ZXJhdGVlIHNob3VsZCBjb21wbGV0ZSB3aXRoIHRoZSB0cmFuc2Zvcm1lZCB2YWx1ZSBhcyBpdHMgcmVzdWx0LlxuICAgICAqIEludm9rZWQgd2l0aCAodmFsdWUsIGtleSwgY2FsbGJhY2spLlxuICAgICAqIEBwYXJhbSB7RnVuY3Rpb259IFtjYWxsYmFja10gLSBBIGNhbGxiYWNrIHdoaWNoIGlzIGNhbGxlZCB3aGVuIGFsbCBgaXRlcmF0ZWVgXG4gICAgICogZnVuY3Rpb25zIGhhdmUgZmluaXNoZWQsIG9yIGFuIGVycm9yIG9jY3Vycy4gYHJlc3VsdGAgaXMgYSBuZXcgb2JqZWN0IGNvbnNpc3RpbmdcbiAgICAgKiBvZiBlYWNoIGtleSBmcm9tIGBvYmpgLCB3aXRoIGVhY2ggdHJhbnNmb3JtZWQgdmFsdWUgb24gdGhlIHJpZ2h0LWhhbmQgc2lkZS5cbiAgICAgKiBJbnZva2VkIHdpdGggKGVyciwgcmVzdWx0KS5cbiAgICAgKiBAcmV0dXJucyB7UHJvbWlzZX0gYSBwcm9taXNlLCBpZiBubyBjYWxsYmFjayBpcyBwYXNzZWRcbiAgICAgKi9cbiAgICBmdW5jdGlvbiBtYXBWYWx1ZXNMaW1pdChvYmosIGxpbWl0LCBpdGVyYXRlZSwgY2FsbGJhY2spIHtcbiAgICAgICAgY2FsbGJhY2sgPSBvbmNlKGNhbGxiYWNrKTtcbiAgICAgICAgdmFyIG5ld09iaiA9IHt9O1xuICAgICAgICB2YXIgX2l0ZXJhdGVlID0gd3JhcEFzeW5jKGl0ZXJhdGVlKTtcbiAgICAgICAgcmV0dXJuIGVhY2hPZkxpbWl0JDIobGltaXQpKG9iaiwgKHZhbCwga2V5LCBuZXh0KSA9PiB7XG4gICAgICAgICAgICBfaXRlcmF0ZWUodmFsLCBrZXksIChlcnIsIHJlc3VsdCkgPT4ge1xuICAgICAgICAgICAgICAgIGlmIChlcnIpIHJldHVybiBuZXh0KGVycik7XG4gICAgICAgICAgICAgICAgbmV3T2JqW2tleV0gPSByZXN1bHQ7XG4gICAgICAgICAgICAgICAgbmV4dChlcnIpO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgIH0sIGVyciA9PiBjYWxsYmFjayhlcnIsIG5ld09iaikpO1xuICAgIH1cblxuICAgIHZhciBtYXBWYWx1ZXNMaW1pdCQxID0gYXdhaXRpZnkobWFwVmFsdWVzTGltaXQsIDQpO1xuXG4gICAgLyoqXG4gICAgICogQSByZWxhdGl2ZSBvZiBbYG1hcGBde0BsaW5rIG1vZHVsZTpDb2xsZWN0aW9ucy5tYXB9LCBkZXNpZ25lZCBmb3IgdXNlIHdpdGggb2JqZWN0cy5cbiAgICAgKlxuICAgICAqIFByb2R1Y2VzIGEgbmV3IE9iamVjdCBieSBtYXBwaW5nIGVhY2ggdmFsdWUgb2YgYG9iamAgdGhyb3VnaCB0aGUgYGl0ZXJhdGVlYFxuICAgICAqIGZ1bmN0aW9uLiBUaGUgYGl0ZXJhdGVlYCBpcyBjYWxsZWQgZWFjaCBgdmFsdWVgIGFuZCBga2V5YCBmcm9tIGBvYmpgIGFuZCBhXG4gICAgICogY2FsbGJhY2sgZm9yIHdoZW4gaXQgaGFzIGZpbmlzaGVkIHByb2Nlc3NpbmcuIEVhY2ggb2YgdGhlc2UgY2FsbGJhY2tzIHRha2VzXG4gICAgICogdHdvIGFyZ3VtZW50czogYW4gYGVycm9yYCwgYW5kIHRoZSB0cmFuc2Zvcm1lZCBpdGVtIGZyb20gYG9iamAuIElmIGBpdGVyYXRlZWBcbiAgICAgKiBwYXNzZXMgYW4gZXJyb3IgdG8gaXRzIGNhbGxiYWNrLCB0aGUgbWFpbiBgY2FsbGJhY2tgIChmb3IgdGhlIGBtYXBWYWx1ZXNgXG4gICAgICogZnVuY3Rpb24pIGlzIGltbWVkaWF0ZWx5IGNhbGxlZCB3aXRoIHRoZSBlcnJvci5cbiAgICAgKlxuICAgICAqIE5vdGUsIHRoZSBvcmRlciBvZiB0aGUga2V5cyBpbiB0aGUgcmVzdWx0IGlzIG5vdCBndWFyYW50ZWVkLiAgVGhlIGtleXMgd2lsbFxuICAgICAqIGJlIHJvdWdobHkgaW4gdGhlIG9yZGVyIHRoZXkgY29tcGxldGUsIChidXQgdGhpcyBpcyB2ZXJ5IGVuZ2luZS1zcGVjaWZpYylcbiAgICAgKlxuICAgICAqIEBuYW1lIG1hcFZhbHVlc1xuICAgICAqIEBzdGF0aWNcbiAgICAgKiBAbWVtYmVyT2YgbW9kdWxlOkNvbGxlY3Rpb25zXG4gICAgICogQG1ldGhvZFxuICAgICAqIEBjYXRlZ29yeSBDb2xsZWN0aW9uXG4gICAgICogQHBhcmFtIHtPYmplY3R9IG9iaiAtIEEgY29sbGVjdGlvbiB0byBpdGVyYXRlIG92ZXIuXG4gICAgICogQHBhcmFtIHtBc3luY0Z1bmN0aW9ufSBpdGVyYXRlZSAtIEEgZnVuY3Rpb24gdG8gYXBwbHkgdG8gZWFjaCB2YWx1ZSBhbmQga2V5XG4gICAgICogaW4gYGNvbGxgLlxuICAgICAqIFRoZSBpdGVyYXRlZSBzaG91bGQgY29tcGxldGUgd2l0aCB0aGUgdHJhbnNmb3JtZWQgdmFsdWUgYXMgaXRzIHJlc3VsdC5cbiAgICAgKiBJbnZva2VkIHdpdGggKHZhbHVlLCBrZXksIGNhbGxiYWNrKS5cbiAgICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBbY2FsbGJhY2tdIC0gQSBjYWxsYmFjayB3aGljaCBpcyBjYWxsZWQgd2hlbiBhbGwgYGl0ZXJhdGVlYFxuICAgICAqIGZ1bmN0aW9ucyBoYXZlIGZpbmlzaGVkLCBvciBhbiBlcnJvciBvY2N1cnMuIGByZXN1bHRgIGlzIGEgbmV3IG9iamVjdCBjb25zaXN0aW5nXG4gICAgICogb2YgZWFjaCBrZXkgZnJvbSBgb2JqYCwgd2l0aCBlYWNoIHRyYW5zZm9ybWVkIHZhbHVlIG9uIHRoZSByaWdodC1oYW5kIHNpZGUuXG4gICAgICogSW52b2tlZCB3aXRoIChlcnIsIHJlc3VsdCkuXG4gICAgICogQHJldHVybnMge1Byb21pc2V9IGEgcHJvbWlzZSwgaWYgbm8gY2FsbGJhY2sgaXMgcGFzc2VkXG4gICAgICogQGV4YW1wbGVcbiAgICAgKlxuICAgICAqIC8vIGZpbGUxLnR4dCBpcyBhIGZpbGUgdGhhdCBpcyAxMDAwIGJ5dGVzIGluIHNpemVcbiAgICAgKiAvLyBmaWxlMi50eHQgaXMgYSBmaWxlIHRoYXQgaXMgMjAwMCBieXRlcyBpbiBzaXplXG4gICAgICogLy8gZmlsZTMudHh0IGlzIGEgZmlsZSB0aGF0IGlzIDMwMDAgYnl0ZXMgaW4gc2l6ZVxuICAgICAqIC8vIGZpbGU0LnR4dCBkb2VzIG5vdCBleGlzdFxuICAgICAqXG4gICAgICogY29uc3QgZmlsZU1hcCA9IHtcbiAgICAgKiAgICAgZjE6ICdmaWxlMS50eHQnLFxuICAgICAqICAgICBmMjogJ2ZpbGUyLnR4dCcsXG4gICAgICogICAgIGYzOiAnZmlsZTMudHh0J1xuICAgICAqIH07XG4gICAgICpcbiAgICAgKiBjb25zdCB3aXRoTWlzc2luZ0ZpbGVNYXAgPSB7XG4gICAgICogICAgIGYxOiAnZmlsZTEudHh0JyxcbiAgICAgKiAgICAgZjI6ICdmaWxlMi50eHQnLFxuICAgICAqICAgICBmMzogJ2ZpbGU0LnR4dCdcbiAgICAgKiB9O1xuICAgICAqXG4gICAgICogLy8gYXN5bmNocm9ub3VzIGZ1bmN0aW9uIHRoYXQgcmV0dXJucyB0aGUgZmlsZSBzaXplIGluIGJ5dGVzXG4gICAgICogZnVuY3Rpb24gZ2V0RmlsZVNpemVJbkJ5dGVzKGZpbGUsIGtleSwgY2FsbGJhY2spIHtcbiAgICAgKiAgICAgZnMuc3RhdChmaWxlLCBmdW5jdGlvbihlcnIsIHN0YXQpIHtcbiAgICAgKiAgICAgICAgIGlmIChlcnIpIHtcbiAgICAgKiAgICAgICAgICAgICByZXR1cm4gY2FsbGJhY2soZXJyKTtcbiAgICAgKiAgICAgICAgIH1cbiAgICAgKiAgICAgICAgIGNhbGxiYWNrKG51bGwsIHN0YXQuc2l6ZSk7XG4gICAgICogICAgIH0pO1xuICAgICAqIH1cbiAgICAgKlxuICAgICAqIC8vIFVzaW5nIGNhbGxiYWNrc1xuICAgICAqIGFzeW5jLm1hcFZhbHVlcyhmaWxlTWFwLCBnZXRGaWxlU2l6ZUluQnl0ZXMsIGZ1bmN0aW9uKGVyciwgcmVzdWx0KSB7XG4gICAgICogICAgIGlmIChlcnIpIHtcbiAgICAgKiAgICAgICAgIGNvbnNvbGUubG9nKGVycik7XG4gICAgICogICAgIH0gZWxzZSB7XG4gICAgICogICAgICAgICBjb25zb2xlLmxvZyhyZXN1bHQpO1xuICAgICAqICAgICAgICAgLy8gcmVzdWx0IGlzIG5vdyBhIG1hcCBvZiBmaWxlIHNpemUgaW4gYnl0ZXMgZm9yIGVhY2ggZmlsZSwgZS5nLlxuICAgICAqICAgICAgICAgLy8ge1xuICAgICAqICAgICAgICAgLy8gICAgIGYxOiAxMDAwLFxuICAgICAqICAgICAgICAgLy8gICAgIGYyOiAyMDAwLFxuICAgICAqICAgICAgICAgLy8gICAgIGYzOiAzMDAwXG4gICAgICogICAgICAgICAvLyB9XG4gICAgICogICAgIH1cbiAgICAgKiB9KTtcbiAgICAgKlxuICAgICAqIC8vIEVycm9yIGhhbmRsaW5nXG4gICAgICogYXN5bmMubWFwVmFsdWVzKHdpdGhNaXNzaW5nRmlsZU1hcCwgZ2V0RmlsZVNpemVJbkJ5dGVzLCBmdW5jdGlvbihlcnIsIHJlc3VsdCkge1xuICAgICAqICAgICBpZiAoZXJyKSB7XG4gICAgICogICAgICAgICBjb25zb2xlLmxvZyhlcnIpO1xuICAgICAqICAgICAgICAgLy8gWyBFcnJvcjogRU5PRU5UOiBubyBzdWNoIGZpbGUgb3IgZGlyZWN0b3J5IF1cbiAgICAgKiAgICAgfSBlbHNlIHtcbiAgICAgKiAgICAgICAgIGNvbnNvbGUubG9nKHJlc3VsdCk7XG4gICAgICogICAgIH1cbiAgICAgKiB9KTtcbiAgICAgKlxuICAgICAqIC8vIFVzaW5nIFByb21pc2VzXG4gICAgICogYXN5bmMubWFwVmFsdWVzKGZpbGVNYXAsIGdldEZpbGVTaXplSW5CeXRlcylcbiAgICAgKiAudGhlbiggcmVzdWx0ID0+IHtcbiAgICAgKiAgICAgY29uc29sZS5sb2cocmVzdWx0KTtcbiAgICAgKiAgICAgLy8gcmVzdWx0IGlzIG5vdyBhIG1hcCBvZiBmaWxlIHNpemUgaW4gYnl0ZXMgZm9yIGVhY2ggZmlsZSwgZS5nLlxuICAgICAqICAgICAvLyB7XG4gICAgICogICAgIC8vICAgICBmMTogMTAwMCxcbiAgICAgKiAgICAgLy8gICAgIGYyOiAyMDAwLFxuICAgICAqICAgICAvLyAgICAgZjM6IDMwMDBcbiAgICAgKiAgICAgLy8gfVxuICAgICAqIH0pLmNhdGNoIChlcnIgPT4ge1xuICAgICAqICAgICBjb25zb2xlLmxvZyhlcnIpO1xuICAgICAqIH0pO1xuICAgICAqXG4gICAgICogLy8gRXJyb3IgSGFuZGxpbmdcbiAgICAgKiBhc3luYy5tYXBWYWx1ZXMod2l0aE1pc3NpbmdGaWxlTWFwLCBnZXRGaWxlU2l6ZUluQnl0ZXMpXG4gICAgICogLnRoZW4oIHJlc3VsdCA9PiB7XG4gICAgICogICAgIGNvbnNvbGUubG9nKHJlc3VsdCk7XG4gICAgICogfSkuY2F0Y2ggKGVyciA9PiB7XG4gICAgICogICAgIGNvbnNvbGUubG9nKGVycik7XG4gICAgICogICAgIC8vIFsgRXJyb3I6IEVOT0VOVDogbm8gc3VjaCBmaWxlIG9yIGRpcmVjdG9yeSBdXG4gICAgICogfSk7XG4gICAgICpcbiAgICAgKiAvLyBVc2luZyBhc3luYy9hd2FpdFxuICAgICAqIGFzeW5jICgpID0+IHtcbiAgICAgKiAgICAgdHJ5IHtcbiAgICAgKiAgICAgICAgIGxldCByZXN1bHQgPSBhd2FpdCBhc3luYy5tYXBWYWx1ZXMoZmlsZU1hcCwgZ2V0RmlsZVNpemVJbkJ5dGVzKTtcbiAgICAgKiAgICAgICAgIGNvbnNvbGUubG9nKHJlc3VsdCk7XG4gICAgICogICAgICAgICAvLyByZXN1bHQgaXMgbm93IGEgbWFwIG9mIGZpbGUgc2l6ZSBpbiBieXRlcyBmb3IgZWFjaCBmaWxlLCBlLmcuXG4gICAgICogICAgICAgICAvLyB7XG4gICAgICogICAgICAgICAvLyAgICAgZjE6IDEwMDAsXG4gICAgICogICAgICAgICAvLyAgICAgZjI6IDIwMDAsXG4gICAgICogICAgICAgICAvLyAgICAgZjM6IDMwMDBcbiAgICAgKiAgICAgICAgIC8vIH1cbiAgICAgKiAgICAgfVxuICAgICAqICAgICBjYXRjaCAoZXJyKSB7XG4gICAgICogICAgICAgICBjb25zb2xlLmxvZyhlcnIpO1xuICAgICAqICAgICB9XG4gICAgICogfVxuICAgICAqXG4gICAgICogLy8gRXJyb3IgSGFuZGxpbmdcbiAgICAgKiBhc3luYyAoKSA9PiB7XG4gICAgICogICAgIHRyeSB7XG4gICAgICogICAgICAgICBsZXQgcmVzdWx0ID0gYXdhaXQgYXN5bmMubWFwVmFsdWVzKHdpdGhNaXNzaW5nRmlsZU1hcCwgZ2V0RmlsZVNpemVJbkJ5dGVzKTtcbiAgICAgKiAgICAgICAgIGNvbnNvbGUubG9nKHJlc3VsdCk7XG4gICAgICogICAgIH1cbiAgICAgKiAgICAgY2F0Y2ggKGVycikge1xuICAgICAqICAgICAgICAgY29uc29sZS5sb2coZXJyKTtcbiAgICAgKiAgICAgICAgIC8vIFsgRXJyb3I6IEVOT0VOVDogbm8gc3VjaCBmaWxlIG9yIGRpcmVjdG9yeSBdXG4gICAgICogICAgIH1cbiAgICAgKiB9XG4gICAgICpcbiAgICAgKi9cbiAgICBmdW5jdGlvbiBtYXBWYWx1ZXMob2JqLCBpdGVyYXRlZSwgY2FsbGJhY2spIHtcbiAgICAgICAgcmV0dXJuIG1hcFZhbHVlc0xpbWl0JDEob2JqLCBJbmZpbml0eSwgaXRlcmF0ZWUsIGNhbGxiYWNrKVxuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFRoZSBzYW1lIGFzIFtgbWFwVmFsdWVzYF17QGxpbmsgbW9kdWxlOkNvbGxlY3Rpb25zLm1hcFZhbHVlc30gYnV0IHJ1bnMgb25seSBhIHNpbmdsZSBhc3luYyBvcGVyYXRpb24gYXQgYSB0aW1lLlxuICAgICAqXG4gICAgICogQG5hbWUgbWFwVmFsdWVzU2VyaWVzXG4gICAgICogQHN0YXRpY1xuICAgICAqIEBtZW1iZXJPZiBtb2R1bGU6Q29sbGVjdGlvbnNcbiAgICAgKiBAbWV0aG9kXG4gICAgICogQHNlZSBbYXN5bmMubWFwVmFsdWVzXXtAbGluayBtb2R1bGU6Q29sbGVjdGlvbnMubWFwVmFsdWVzfVxuICAgICAqIEBjYXRlZ29yeSBDb2xsZWN0aW9uXG4gICAgICogQHBhcmFtIHtPYmplY3R9IG9iaiAtIEEgY29sbGVjdGlvbiB0byBpdGVyYXRlIG92ZXIuXG4gICAgICogQHBhcmFtIHtBc3luY0Z1bmN0aW9ufSBpdGVyYXRlZSAtIEEgZnVuY3Rpb24gdG8gYXBwbHkgdG8gZWFjaCB2YWx1ZSBhbmQga2V5XG4gICAgICogaW4gYGNvbGxgLlxuICAgICAqIFRoZSBpdGVyYXRlZSBzaG91bGQgY29tcGxldGUgd2l0aCB0aGUgdHJhbnNmb3JtZWQgdmFsdWUgYXMgaXRzIHJlc3VsdC5cbiAgICAgKiBJbnZva2VkIHdpdGggKHZhbHVlLCBrZXksIGNhbGxiYWNrKS5cbiAgICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBbY2FsbGJhY2tdIC0gQSBjYWxsYmFjayB3aGljaCBpcyBjYWxsZWQgd2hlbiBhbGwgYGl0ZXJhdGVlYFxuICAgICAqIGZ1bmN0aW9ucyBoYXZlIGZpbmlzaGVkLCBvciBhbiBlcnJvciBvY2N1cnMuIGByZXN1bHRgIGlzIGEgbmV3IG9iamVjdCBjb25zaXN0aW5nXG4gICAgICogb2YgZWFjaCBrZXkgZnJvbSBgb2JqYCwgd2l0aCBlYWNoIHRyYW5zZm9ybWVkIHZhbHVlIG9uIHRoZSByaWdodC1oYW5kIHNpZGUuXG4gICAgICogSW52b2tlZCB3aXRoIChlcnIsIHJlc3VsdCkuXG4gICAgICogQHJldHVybnMge1Byb21pc2V9IGEgcHJvbWlzZSwgaWYgbm8gY2FsbGJhY2sgaXMgcGFzc2VkXG4gICAgICovXG4gICAgZnVuY3Rpb24gbWFwVmFsdWVzU2VyaWVzKG9iaiwgaXRlcmF0ZWUsIGNhbGxiYWNrKSB7XG4gICAgICAgIHJldHVybiBtYXBWYWx1ZXNMaW1pdCQxKG9iaiwgMSwgaXRlcmF0ZWUsIGNhbGxiYWNrKVxuICAgIH1cblxuICAgIC8qKlxuICAgICAqIENhY2hlcyB0aGUgcmVzdWx0cyBvZiBhbiBhc3luYyBmdW5jdGlvbi4gV2hlbiBjcmVhdGluZyBhIGhhc2ggdG8gc3RvcmVcbiAgICAgKiBmdW5jdGlvbiByZXN1bHRzIGFnYWluc3QsIHRoZSBjYWxsYmFjayBpcyBvbWl0dGVkIGZyb20gdGhlIGhhc2ggYW5kIGFuXG4gICAgICogb3B0aW9uYWwgaGFzaCBmdW5jdGlvbiBjYW4gYmUgdXNlZC5cbiAgICAgKlxuICAgICAqICoqTm90ZTogaWYgdGhlIGFzeW5jIGZ1bmN0aW9uIGVycnMsIHRoZSByZXN1bHQgd2lsbCBub3QgYmUgY2FjaGVkIGFuZFxuICAgICAqIHN1YnNlcXVlbnQgY2FsbHMgd2lsbCBjYWxsIHRoZSB3cmFwcGVkIGZ1bmN0aW9uLioqXG4gICAgICpcbiAgICAgKiBJZiBubyBoYXNoIGZ1bmN0aW9uIGlzIHNwZWNpZmllZCwgdGhlIGZpcnN0IGFyZ3VtZW50IGlzIHVzZWQgYXMgYSBoYXNoIGtleSxcbiAgICAgKiB3aGljaCBtYXkgd29yayByZWFzb25hYmx5IGlmIGl0IGlzIGEgc3RyaW5nIG9yIGEgZGF0YSB0eXBlIHRoYXQgY29udmVydHMgdG8gYVxuICAgICAqIGRpc3RpbmN0IHN0cmluZy4gTm90ZSB0aGF0IG9iamVjdHMgYW5kIGFycmF5cyB3aWxsIG5vdCBiZWhhdmUgcmVhc29uYWJseS5cbiAgICAgKiBOZWl0aGVyIHdpbGwgY2FzZXMgd2hlcmUgdGhlIG90aGVyIGFyZ3VtZW50cyBhcmUgc2lnbmlmaWNhbnQuIEluIHN1Y2ggY2FzZXMsXG4gICAgICogc3BlY2lmeSB5b3VyIG93biBoYXNoIGZ1bmN0aW9uLlxuICAgICAqXG4gICAgICogVGhlIGNhY2hlIG9mIHJlc3VsdHMgaXMgZXhwb3NlZCBhcyB0aGUgYG1lbW9gIHByb3BlcnR5IG9mIHRoZSBmdW5jdGlvblxuICAgICAqIHJldHVybmVkIGJ5IGBtZW1vaXplYC5cbiAgICAgKlxuICAgICAqIEBuYW1lIG1lbW9pemVcbiAgICAgKiBAc3RhdGljXG4gICAgICogQG1lbWJlck9mIG1vZHVsZTpVdGlsc1xuICAgICAqIEBtZXRob2RcbiAgICAgKiBAY2F0ZWdvcnkgVXRpbFxuICAgICAqIEBwYXJhbSB7QXN5bmNGdW5jdGlvbn0gZm4gLSBUaGUgYXN5bmMgZnVuY3Rpb24gdG8gcHJveHkgYW5kIGNhY2hlIHJlc3VsdHMgZnJvbS5cbiAgICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBoYXNoZXIgLSBBbiBvcHRpb25hbCBmdW5jdGlvbiBmb3IgZ2VuZXJhdGluZyBhIGN1c3RvbSBoYXNoXG4gICAgICogZm9yIHN0b3JpbmcgcmVzdWx0cy4gSXQgaGFzIGFsbCB0aGUgYXJndW1lbnRzIGFwcGxpZWQgdG8gaXQgYXBhcnQgZnJvbSB0aGVcbiAgICAgKiBjYWxsYmFjaywgYW5kIG11c3QgYmUgc3luY2hyb25vdXMuXG4gICAgICogQHJldHVybnMge0FzeW5jRnVuY3Rpb259IGEgbWVtb2l6ZWQgdmVyc2lvbiBvZiBgZm5gXG4gICAgICogQGV4YW1wbGVcbiAgICAgKlxuICAgICAqIHZhciBzbG93X2ZuID0gZnVuY3Rpb24obmFtZSwgY2FsbGJhY2spIHtcbiAgICAgKiAgICAgLy8gZG8gc29tZXRoaW5nXG4gICAgICogICAgIGNhbGxiYWNrKG51bGwsIHJlc3VsdCk7XG4gICAgICogfTtcbiAgICAgKiB2YXIgZm4gPSBhc3luYy5tZW1vaXplKHNsb3dfZm4pO1xuICAgICAqXG4gICAgICogLy8gZm4gY2FuIG5vdyBiZSB1c2VkIGFzIGlmIGl0IHdlcmUgc2xvd19mblxuICAgICAqIGZuKCdzb21lIG5hbWUnLCBmdW5jdGlvbigpIHtcbiAgICAgKiAgICAgLy8gY2FsbGJhY2tcbiAgICAgKiB9KTtcbiAgICAgKi9cbiAgICBmdW5jdGlvbiBtZW1vaXplKGZuLCBoYXNoZXIgPSB2ID0+IHYpIHtcbiAgICAgICAgdmFyIG1lbW8gPSBPYmplY3QuY3JlYXRlKG51bGwpO1xuICAgICAgICB2YXIgcXVldWVzID0gT2JqZWN0LmNyZWF0ZShudWxsKTtcbiAgICAgICAgdmFyIF9mbiA9IHdyYXBBc3luYyhmbik7XG4gICAgICAgIHZhciBtZW1vaXplZCA9IGluaXRpYWxQYXJhbXMoKGFyZ3MsIGNhbGxiYWNrKSA9PiB7XG4gICAgICAgICAgICB2YXIga2V5ID0gaGFzaGVyKC4uLmFyZ3MpO1xuICAgICAgICAgICAgaWYgKGtleSBpbiBtZW1vKSB7XG4gICAgICAgICAgICAgICAgc2V0SW1tZWRpYXRlJDEoKCkgPT4gY2FsbGJhY2sobnVsbCwgLi4ubWVtb1trZXldKSk7XG4gICAgICAgICAgICB9IGVsc2UgaWYgKGtleSBpbiBxdWV1ZXMpIHtcbiAgICAgICAgICAgICAgICBxdWV1ZXNba2V5XS5wdXNoKGNhbGxiYWNrKTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgcXVldWVzW2tleV0gPSBbY2FsbGJhY2tdO1xuICAgICAgICAgICAgICAgIF9mbiguLi5hcmdzLCAoZXJyLCAuLi5yZXN1bHRBcmdzKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgIC8vICMxNDY1IGRvbid0IG1lbW9pemUgaWYgYW4gZXJyb3Igb2NjdXJyZWRcbiAgICAgICAgICAgICAgICAgICAgaWYgKCFlcnIpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIG1lbW9ba2V5XSA9IHJlc3VsdEFyZ3M7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgdmFyIHEgPSBxdWV1ZXNba2V5XTtcbiAgICAgICAgICAgICAgICAgICAgZGVsZXRlIHF1ZXVlc1trZXldO1xuICAgICAgICAgICAgICAgICAgICBmb3IgKHZhciBpID0gMCwgbCA9IHEubGVuZ3RoOyBpIDwgbDsgaSsrKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBxW2ldKGVyciwgLi4ucmVzdWx0QXJncyk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgICAgIG1lbW9pemVkLm1lbW8gPSBtZW1vO1xuICAgICAgICBtZW1vaXplZC51bm1lbW9pemVkID0gZm47XG4gICAgICAgIHJldHVybiBtZW1vaXplZDtcbiAgICB9XG5cbiAgICAvKiBpc3RhbmJ1bCBpZ25vcmUgZmlsZSAqL1xuXG4gICAgLyoqXG4gICAgICogQ2FsbHMgYGNhbGxiYWNrYCBvbiBhIGxhdGVyIGxvb3AgYXJvdW5kIHRoZSBldmVudCBsb29wLiBJbiBOb2RlLmpzIHRoaXMganVzdFxuICAgICAqIGNhbGxzIGBwcm9jZXNzLm5leHRUaWNrYC4gIEluIHRoZSBicm93c2VyIGl0IHdpbGwgdXNlIGBzZXRJbW1lZGlhdGVgIGlmXG4gICAgICogYXZhaWxhYmxlLCBvdGhlcndpc2UgYHNldFRpbWVvdXQoY2FsbGJhY2ssIDApYCwgd2hpY2ggbWVhbnMgb3RoZXIgaGlnaGVyXG4gICAgICogcHJpb3JpdHkgZXZlbnRzIG1heSBwcmVjZWRlIHRoZSBleGVjdXRpb24gb2YgYGNhbGxiYWNrYC5cbiAgICAgKlxuICAgICAqIFRoaXMgaXMgdXNlZCBpbnRlcm5hbGx5IGZvciBicm93c2VyLWNvbXBhdGliaWxpdHkgcHVycG9zZXMuXG4gICAgICpcbiAgICAgKiBAbmFtZSBuZXh0VGlja1xuICAgICAqIEBzdGF0aWNcbiAgICAgKiBAbWVtYmVyT2YgbW9kdWxlOlV0aWxzXG4gICAgICogQG1ldGhvZFxuICAgICAqIEBzZWUgW2FzeW5jLnNldEltbWVkaWF0ZV17QGxpbmsgbW9kdWxlOlV0aWxzLnNldEltbWVkaWF0ZX1cbiAgICAgKiBAY2F0ZWdvcnkgVXRpbFxuICAgICAqIEBwYXJhbSB7RnVuY3Rpb259IGNhbGxiYWNrIC0gVGhlIGZ1bmN0aW9uIHRvIGNhbGwgb24gYSBsYXRlciBsb29wIGFyb3VuZFxuICAgICAqIHRoZSBldmVudCBsb29wLiBJbnZva2VkIHdpdGggKGFyZ3MuLi4pLlxuICAgICAqIEBwYXJhbSB7Li4uKn0gYXJncy4uLiAtIGFueSBudW1iZXIgb2YgYWRkaXRpb25hbCBhcmd1bWVudHMgdG8gcGFzcyB0byB0aGVcbiAgICAgKiBjYWxsYmFjayBvbiB0aGUgbmV4dCB0aWNrLlxuICAgICAqIEBleGFtcGxlXG4gICAgICpcbiAgICAgKiB2YXIgY2FsbF9vcmRlciA9IFtdO1xuICAgICAqIGFzeW5jLm5leHRUaWNrKGZ1bmN0aW9uKCkge1xuICAgICAqICAgICBjYWxsX29yZGVyLnB1c2goJ3R3bycpO1xuICAgICAqICAgICAvLyBjYWxsX29yZGVyIG5vdyBlcXVhbHMgWydvbmUnLCd0d28nXVxuICAgICAqIH0pO1xuICAgICAqIGNhbGxfb3JkZXIucHVzaCgnb25lJyk7XG4gICAgICpcbiAgICAgKiBhc3luYy5zZXRJbW1lZGlhdGUoZnVuY3Rpb24gKGEsIGIsIGMpIHtcbiAgICAgKiAgICAgLy8gYSwgYiwgYW5kIGMgZXF1YWwgMSwgMiwgYW5kIDNcbiAgICAgKiB9LCAxLCAyLCAzKTtcbiAgICAgKi9cbiAgICB2YXIgX2RlZmVyO1xuXG4gICAgaWYgKGhhc05leHRUaWNrKSB7XG4gICAgICAgIF9kZWZlciA9IHByb2Nlc3MubmV4dFRpY2s7XG4gICAgfSBlbHNlIGlmIChoYXNTZXRJbW1lZGlhdGUpIHtcbiAgICAgICAgX2RlZmVyID0gc2V0SW1tZWRpYXRlO1xuICAgIH0gZWxzZSB7XG4gICAgICAgIF9kZWZlciA9IGZhbGxiYWNrO1xuICAgIH1cblxuICAgIHZhciBuZXh0VGljayA9IHdyYXAoX2RlZmVyKTtcblxuICAgIHZhciBfcGFyYWxsZWwgPSBhd2FpdGlmeSgoZWFjaGZuLCB0YXNrcywgY2FsbGJhY2spID0+IHtcbiAgICAgICAgdmFyIHJlc3VsdHMgPSBpc0FycmF5TGlrZSh0YXNrcykgPyBbXSA6IHt9O1xuXG4gICAgICAgIGVhY2hmbih0YXNrcywgKHRhc2ssIGtleSwgdGFza0NiKSA9PiB7XG4gICAgICAgICAgICB3cmFwQXN5bmModGFzaykoKGVyciwgLi4ucmVzdWx0KSA9PiB7XG4gICAgICAgICAgICAgICAgaWYgKHJlc3VsdC5sZW5ndGggPCAyKSB7XG4gICAgICAgICAgICAgICAgICAgIFtyZXN1bHRdID0gcmVzdWx0O1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICByZXN1bHRzW2tleV0gPSByZXN1bHQ7XG4gICAgICAgICAgICAgICAgdGFza0NiKGVycik7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfSwgZXJyID0+IGNhbGxiYWNrKGVyciwgcmVzdWx0cykpO1xuICAgIH0sIDMpO1xuXG4gICAgLyoqXG4gICAgICogUnVuIHRoZSBgdGFza3NgIGNvbGxlY3Rpb24gb2YgZnVuY3Rpb25zIGluIHBhcmFsbGVsLCB3aXRob3V0IHdhaXRpbmcgdW50aWxcbiAgICAgKiB0aGUgcHJldmlvdXMgZnVuY3Rpb24gaGFzIGNvbXBsZXRlZC4gSWYgYW55IG9mIHRoZSBmdW5jdGlvbnMgcGFzcyBhbiBlcnJvciB0b1xuICAgICAqIGl0cyBjYWxsYmFjaywgdGhlIG1haW4gYGNhbGxiYWNrYCBpcyBpbW1lZGlhdGVseSBjYWxsZWQgd2l0aCB0aGUgdmFsdWUgb2YgdGhlXG4gICAgICogZXJyb3IuIE9uY2UgdGhlIGB0YXNrc2AgaGF2ZSBjb21wbGV0ZWQsIHRoZSByZXN1bHRzIGFyZSBwYXNzZWQgdG8gdGhlIGZpbmFsXG4gICAgICogYGNhbGxiYWNrYCBhcyBhbiBhcnJheS5cbiAgICAgKlxuICAgICAqICoqTm90ZToqKiBgcGFyYWxsZWxgIGlzIGFib3V0IGtpY2tpbmctb2ZmIEkvTyB0YXNrcyBpbiBwYXJhbGxlbCwgbm90IGFib3V0XG4gICAgICogcGFyYWxsZWwgZXhlY3V0aW9uIG9mIGNvZGUuICBJZiB5b3VyIHRhc2tzIGRvIG5vdCB1c2UgYW55IHRpbWVycyBvciBwZXJmb3JtXG4gICAgICogYW55IEkvTywgdGhleSB3aWxsIGFjdHVhbGx5IGJlIGV4ZWN1dGVkIGluIHNlcmllcy4gIEFueSBzeW5jaHJvbm91cyBzZXR1cFxuICAgICAqIHNlY3Rpb25zIGZvciBlYWNoIHRhc2sgd2lsbCBoYXBwZW4gb25lIGFmdGVyIHRoZSBvdGhlci4gIEphdmFTY3JpcHQgcmVtYWluc1xuICAgICAqIHNpbmdsZS10aHJlYWRlZC5cbiAgICAgKlxuICAgICAqICoqSGludDoqKiBVc2UgW2ByZWZsZWN0YF17QGxpbmsgbW9kdWxlOlV0aWxzLnJlZmxlY3R9IHRvIGNvbnRpbnVlIHRoZVxuICAgICAqIGV4ZWN1dGlvbiBvZiBvdGhlciB0YXNrcyB3aGVuIGEgdGFzayBmYWlscy5cbiAgICAgKlxuICAgICAqIEl0IGlzIGFsc28gcG9zc2libGUgdG8gdXNlIGFuIG9iamVjdCBpbnN0ZWFkIG9mIGFuIGFycmF5LiBFYWNoIHByb3BlcnR5IHdpbGxcbiAgICAgKiBiZSBydW4gYXMgYSBmdW5jdGlvbiBhbmQgdGhlIHJlc3VsdHMgd2lsbCBiZSBwYXNzZWQgdG8gdGhlIGZpbmFsIGBjYWxsYmFja2BcbiAgICAgKiBhcyBhbiBvYmplY3QgaW5zdGVhZCBvZiBhbiBhcnJheS4gVGhpcyBjYW4gYmUgYSBtb3JlIHJlYWRhYmxlIHdheSBvZiBoYW5kbGluZ1xuICAgICAqIHJlc3VsdHMgZnJvbSB7QGxpbmsgYXN5bmMucGFyYWxsZWx9LlxuICAgICAqXG4gICAgICogQG5hbWUgcGFyYWxsZWxcbiAgICAgKiBAc3RhdGljXG4gICAgICogQG1lbWJlck9mIG1vZHVsZTpDb250cm9sRmxvd1xuICAgICAqIEBtZXRob2RcbiAgICAgKiBAY2F0ZWdvcnkgQ29udHJvbCBGbG93XG4gICAgICogQHBhcmFtIHtBcnJheXxJdGVyYWJsZXxBc3luY0l0ZXJhYmxlfE9iamVjdH0gdGFza3MgLSBBIGNvbGxlY3Rpb24gb2ZcbiAgICAgKiBbYXN5bmMgZnVuY3Rpb25zXXtAbGluayBBc3luY0Z1bmN0aW9ufSB0byBydW4uXG4gICAgICogRWFjaCBhc3luYyBmdW5jdGlvbiBjYW4gY29tcGxldGUgd2l0aCBhbnkgbnVtYmVyIG9mIG9wdGlvbmFsIGByZXN1bHRgIHZhbHVlcy5cbiAgICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBbY2FsbGJhY2tdIC0gQW4gb3B0aW9uYWwgY2FsbGJhY2sgdG8gcnVuIG9uY2UgYWxsIHRoZVxuICAgICAqIGZ1bmN0aW9ucyBoYXZlIGNvbXBsZXRlZCBzdWNjZXNzZnVsbHkuIFRoaXMgZnVuY3Rpb24gZ2V0cyBhIHJlc3VsdHMgYXJyYXlcbiAgICAgKiAob3Igb2JqZWN0KSBjb250YWluaW5nIGFsbCB0aGUgcmVzdWx0IGFyZ3VtZW50cyBwYXNzZWQgdG8gdGhlIHRhc2sgY2FsbGJhY2tzLlxuICAgICAqIEludm9rZWQgd2l0aCAoZXJyLCByZXN1bHRzKS5cbiAgICAgKiBAcmV0dXJucyB7UHJvbWlzZX0gYSBwcm9taXNlLCBpZiBhIGNhbGxiYWNrIGlzIG5vdCBwYXNzZWRcbiAgICAgKlxuICAgICAqIEBleGFtcGxlXG4gICAgICpcbiAgICAgKiAvL1VzaW5nIENhbGxiYWNrc1xuICAgICAqIGFzeW5jLnBhcmFsbGVsKFtcbiAgICAgKiAgICAgZnVuY3Rpb24oY2FsbGJhY2spIHtcbiAgICAgKiAgICAgICAgIHNldFRpbWVvdXQoZnVuY3Rpb24oKSB7XG4gICAgICogICAgICAgICAgICAgY2FsbGJhY2sobnVsbCwgJ29uZScpO1xuICAgICAqICAgICAgICAgfSwgMjAwKTtcbiAgICAgKiAgICAgfSxcbiAgICAgKiAgICAgZnVuY3Rpb24oY2FsbGJhY2spIHtcbiAgICAgKiAgICAgICAgIHNldFRpbWVvdXQoZnVuY3Rpb24oKSB7XG4gICAgICogICAgICAgICAgICAgY2FsbGJhY2sobnVsbCwgJ3R3bycpO1xuICAgICAqICAgICAgICAgfSwgMTAwKTtcbiAgICAgKiAgICAgfVxuICAgICAqIF0sIGZ1bmN0aW9uKGVyciwgcmVzdWx0cykge1xuICAgICAqICAgICBjb25zb2xlLmxvZyhyZXN1bHRzKTtcbiAgICAgKiAgICAgLy8gcmVzdWx0cyBpcyBlcXVhbCB0byBbJ29uZScsJ3R3byddIGV2ZW4gdGhvdWdoXG4gICAgICogICAgIC8vIHRoZSBzZWNvbmQgZnVuY3Rpb24gaGFkIGEgc2hvcnRlciB0aW1lb3V0LlxuICAgICAqIH0pO1xuICAgICAqXG4gICAgICogLy8gYW4gZXhhbXBsZSB1c2luZyBhbiBvYmplY3QgaW5zdGVhZCBvZiBhbiBhcnJheVxuICAgICAqIGFzeW5jLnBhcmFsbGVsKHtcbiAgICAgKiAgICAgb25lOiBmdW5jdGlvbihjYWxsYmFjaykge1xuICAgICAqICAgICAgICAgc2V0VGltZW91dChmdW5jdGlvbigpIHtcbiAgICAgKiAgICAgICAgICAgICBjYWxsYmFjayhudWxsLCAxKTtcbiAgICAgKiAgICAgICAgIH0sIDIwMCk7XG4gICAgICogICAgIH0sXG4gICAgICogICAgIHR3bzogZnVuY3Rpb24oY2FsbGJhY2spIHtcbiAgICAgKiAgICAgICAgIHNldFRpbWVvdXQoZnVuY3Rpb24oKSB7XG4gICAgICogICAgICAgICAgICAgY2FsbGJhY2sobnVsbCwgMik7XG4gICAgICogICAgICAgICB9LCAxMDApO1xuICAgICAqICAgICB9XG4gICAgICogfSwgZnVuY3Rpb24oZXJyLCByZXN1bHRzKSB7XG4gICAgICogICAgIGNvbnNvbGUubG9nKHJlc3VsdHMpO1xuICAgICAqICAgICAvLyByZXN1bHRzIGlzIGVxdWFsIHRvOiB7IG9uZTogMSwgdHdvOiAyIH1cbiAgICAgKiB9KTtcbiAgICAgKlxuICAgICAqIC8vVXNpbmcgUHJvbWlzZXNcbiAgICAgKiBhc3luYy5wYXJhbGxlbChbXG4gICAgICogICAgIGZ1bmN0aW9uKGNhbGxiYWNrKSB7XG4gICAgICogICAgICAgICBzZXRUaW1lb3V0KGZ1bmN0aW9uKCkge1xuICAgICAqICAgICAgICAgICAgIGNhbGxiYWNrKG51bGwsICdvbmUnKTtcbiAgICAgKiAgICAgICAgIH0sIDIwMCk7XG4gICAgICogICAgIH0sXG4gICAgICogICAgIGZ1bmN0aW9uKGNhbGxiYWNrKSB7XG4gICAgICogICAgICAgICBzZXRUaW1lb3V0KGZ1bmN0aW9uKCkge1xuICAgICAqICAgICAgICAgICAgIGNhbGxiYWNrKG51bGwsICd0d28nKTtcbiAgICAgKiAgICAgICAgIH0sIDEwMCk7XG4gICAgICogICAgIH1cbiAgICAgKiBdKS50aGVuKHJlc3VsdHMgPT4ge1xuICAgICAqICAgICBjb25zb2xlLmxvZyhyZXN1bHRzKTtcbiAgICAgKiAgICAgLy8gcmVzdWx0cyBpcyBlcXVhbCB0byBbJ29uZScsJ3R3byddIGV2ZW4gdGhvdWdoXG4gICAgICogICAgIC8vIHRoZSBzZWNvbmQgZnVuY3Rpb24gaGFkIGEgc2hvcnRlciB0aW1lb3V0LlxuICAgICAqIH0pLmNhdGNoKGVyciA9PiB7XG4gICAgICogICAgIGNvbnNvbGUubG9nKGVycik7XG4gICAgICogfSk7XG4gICAgICpcbiAgICAgKiAvLyBhbiBleGFtcGxlIHVzaW5nIGFuIG9iamVjdCBpbnN0ZWFkIG9mIGFuIGFycmF5XG4gICAgICogYXN5bmMucGFyYWxsZWwoe1xuICAgICAqICAgICBvbmU6IGZ1bmN0aW9uKGNhbGxiYWNrKSB7XG4gICAgICogICAgICAgICBzZXRUaW1lb3V0KGZ1bmN0aW9uKCkge1xuICAgICAqICAgICAgICAgICAgIGNhbGxiYWNrKG51bGwsIDEpO1xuICAgICAqICAgICAgICAgfSwgMjAwKTtcbiAgICAgKiAgICAgfSxcbiAgICAgKiAgICAgdHdvOiBmdW5jdGlvbihjYWxsYmFjaykge1xuICAgICAqICAgICAgICAgc2V0VGltZW91dChmdW5jdGlvbigpIHtcbiAgICAgKiAgICAgICAgICAgICBjYWxsYmFjayhudWxsLCAyKTtcbiAgICAgKiAgICAgICAgIH0sIDEwMCk7XG4gICAgICogICAgIH1cbiAgICAgKiB9KS50aGVuKHJlc3VsdHMgPT4ge1xuICAgICAqICAgICBjb25zb2xlLmxvZyhyZXN1bHRzKTtcbiAgICAgKiAgICAgLy8gcmVzdWx0cyBpcyBlcXVhbCB0bzogeyBvbmU6IDEsIHR3bzogMiB9XG4gICAgICogfSkuY2F0Y2goZXJyID0+IHtcbiAgICAgKiAgICAgY29uc29sZS5sb2coZXJyKTtcbiAgICAgKiB9KTtcbiAgICAgKlxuICAgICAqIC8vVXNpbmcgYXN5bmMvYXdhaXRcbiAgICAgKiBhc3luYyAoKSA9PiB7XG4gICAgICogICAgIHRyeSB7XG4gICAgICogICAgICAgICBsZXQgcmVzdWx0cyA9IGF3YWl0IGFzeW5jLnBhcmFsbGVsKFtcbiAgICAgKiAgICAgICAgICAgICBmdW5jdGlvbihjYWxsYmFjaykge1xuICAgICAqICAgICAgICAgICAgICAgICBzZXRUaW1lb3V0KGZ1bmN0aW9uKCkge1xuICAgICAqICAgICAgICAgICAgICAgICAgICAgY2FsbGJhY2sobnVsbCwgJ29uZScpO1xuICAgICAqICAgICAgICAgICAgICAgICB9LCAyMDApO1xuICAgICAqICAgICAgICAgICAgIH0sXG4gICAgICogICAgICAgICAgICAgZnVuY3Rpb24oY2FsbGJhY2spIHtcbiAgICAgKiAgICAgICAgICAgICAgICAgc2V0VGltZW91dChmdW5jdGlvbigpIHtcbiAgICAgKiAgICAgICAgICAgICAgICAgICAgIGNhbGxiYWNrKG51bGwsICd0d28nKTtcbiAgICAgKiAgICAgICAgICAgICAgICAgfSwgMTAwKTtcbiAgICAgKiAgICAgICAgICAgICB9XG4gICAgICogICAgICAgICBdKTtcbiAgICAgKiAgICAgICAgIGNvbnNvbGUubG9nKHJlc3VsdHMpO1xuICAgICAqICAgICAgICAgLy8gcmVzdWx0cyBpcyBlcXVhbCB0byBbJ29uZScsJ3R3byddIGV2ZW4gdGhvdWdoXG4gICAgICogICAgICAgICAvLyB0aGUgc2Vjb25kIGZ1bmN0aW9uIGhhZCBhIHNob3J0ZXIgdGltZW91dC5cbiAgICAgKiAgICAgfVxuICAgICAqICAgICBjYXRjaCAoZXJyKSB7XG4gICAgICogICAgICAgICBjb25zb2xlLmxvZyhlcnIpO1xuICAgICAqICAgICB9XG4gICAgICogfVxuICAgICAqXG4gICAgICogLy8gYW4gZXhhbXBsZSB1c2luZyBhbiBvYmplY3QgaW5zdGVhZCBvZiBhbiBhcnJheVxuICAgICAqIGFzeW5jICgpID0+IHtcbiAgICAgKiAgICAgdHJ5IHtcbiAgICAgKiAgICAgICAgIGxldCByZXN1bHRzID0gYXdhaXQgYXN5bmMucGFyYWxsZWwoe1xuICAgICAqICAgICAgICAgICAgIG9uZTogZnVuY3Rpb24oY2FsbGJhY2spIHtcbiAgICAgKiAgICAgICAgICAgICAgICAgc2V0VGltZW91dChmdW5jdGlvbigpIHtcbiAgICAgKiAgICAgICAgICAgICAgICAgICAgIGNhbGxiYWNrKG51bGwsIDEpO1xuICAgICAqICAgICAgICAgICAgICAgICB9LCAyMDApO1xuICAgICAqICAgICAgICAgICAgIH0sXG4gICAgICogICAgICAgICAgICB0d286IGZ1bmN0aW9uKGNhbGxiYWNrKSB7XG4gICAgICogICAgICAgICAgICAgICAgIHNldFRpbWVvdXQoZnVuY3Rpb24oKSB7XG4gICAgICogICAgICAgICAgICAgICAgICAgICBjYWxsYmFjayhudWxsLCAyKTtcbiAgICAgKiAgICAgICAgICAgICAgICAgfSwgMTAwKTtcbiAgICAgKiAgICAgICAgICAgIH1cbiAgICAgKiAgICAgICAgIH0pO1xuICAgICAqICAgICAgICAgY29uc29sZS5sb2cocmVzdWx0cyk7XG4gICAgICogICAgICAgICAvLyByZXN1bHRzIGlzIGVxdWFsIHRvOiB7IG9uZTogMSwgdHdvOiAyIH1cbiAgICAgKiAgICAgfVxuICAgICAqICAgICBjYXRjaCAoZXJyKSB7XG4gICAgICogICAgICAgICBjb25zb2xlLmxvZyhlcnIpO1xuICAgICAqICAgICB9XG4gICAgICogfVxuICAgICAqXG4gICAgICovXG4gICAgZnVuY3Rpb24gcGFyYWxsZWwodGFza3MsIGNhbGxiYWNrKSB7XG4gICAgICAgIHJldHVybiBfcGFyYWxsZWwoZWFjaE9mJDEsIHRhc2tzLCBjYWxsYmFjayk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogVGhlIHNhbWUgYXMgW2BwYXJhbGxlbGBde0BsaW5rIG1vZHVsZTpDb250cm9sRmxvdy5wYXJhbGxlbH0gYnV0IHJ1bnMgYSBtYXhpbXVtIG9mIGBsaW1pdGAgYXN5bmMgb3BlcmF0aW9ucyBhdCBhXG4gICAgICogdGltZS5cbiAgICAgKlxuICAgICAqIEBuYW1lIHBhcmFsbGVsTGltaXRcbiAgICAgKiBAc3RhdGljXG4gICAgICogQG1lbWJlck9mIG1vZHVsZTpDb250cm9sRmxvd1xuICAgICAqIEBtZXRob2RcbiAgICAgKiBAc2VlIFthc3luYy5wYXJhbGxlbF17QGxpbmsgbW9kdWxlOkNvbnRyb2xGbG93LnBhcmFsbGVsfVxuICAgICAqIEBjYXRlZ29yeSBDb250cm9sIEZsb3dcbiAgICAgKiBAcGFyYW0ge0FycmF5fEl0ZXJhYmxlfEFzeW5jSXRlcmFibGV8T2JqZWN0fSB0YXNrcyAtIEEgY29sbGVjdGlvbiBvZlxuICAgICAqIFthc3luYyBmdW5jdGlvbnNde0BsaW5rIEFzeW5jRnVuY3Rpb259IHRvIHJ1bi5cbiAgICAgKiBFYWNoIGFzeW5jIGZ1bmN0aW9uIGNhbiBjb21wbGV0ZSB3aXRoIGFueSBudW1iZXIgb2Ygb3B0aW9uYWwgYHJlc3VsdGAgdmFsdWVzLlxuICAgICAqIEBwYXJhbSB7bnVtYmVyfSBsaW1pdCAtIFRoZSBtYXhpbXVtIG51bWJlciBvZiBhc3luYyBvcGVyYXRpb25zIGF0IGEgdGltZS5cbiAgICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBbY2FsbGJhY2tdIC0gQW4gb3B0aW9uYWwgY2FsbGJhY2sgdG8gcnVuIG9uY2UgYWxsIHRoZVxuICAgICAqIGZ1bmN0aW9ucyBoYXZlIGNvbXBsZXRlZCBzdWNjZXNzZnVsbHkuIFRoaXMgZnVuY3Rpb24gZ2V0cyBhIHJlc3VsdHMgYXJyYXlcbiAgICAgKiAob3Igb2JqZWN0KSBjb250YWluaW5nIGFsbCB0aGUgcmVzdWx0IGFyZ3VtZW50cyBwYXNzZWQgdG8gdGhlIHRhc2sgY2FsbGJhY2tzLlxuICAgICAqIEludm9rZWQgd2l0aCAoZXJyLCByZXN1bHRzKS5cbiAgICAgKiBAcmV0dXJucyB7UHJvbWlzZX0gYSBwcm9taXNlLCBpZiBhIGNhbGxiYWNrIGlzIG5vdCBwYXNzZWRcbiAgICAgKi9cbiAgICBmdW5jdGlvbiBwYXJhbGxlbExpbWl0KHRhc2tzLCBsaW1pdCwgY2FsbGJhY2spIHtcbiAgICAgICAgcmV0dXJuIF9wYXJhbGxlbChlYWNoT2ZMaW1pdCQyKGxpbWl0KSwgdGFza3MsIGNhbGxiYWNrKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBBIHF1ZXVlIG9mIHRhc2tzIGZvciB0aGUgd29ya2VyIGZ1bmN0aW9uIHRvIGNvbXBsZXRlLlxuICAgICAqIEB0eXBlZGVmIHtJdGVyYWJsZX0gUXVldWVPYmplY3RcbiAgICAgKiBAbWVtYmVyT2YgbW9kdWxlOkNvbnRyb2xGbG93XG4gICAgICogQHByb3BlcnR5IHtGdW5jdGlvbn0gbGVuZ3RoIC0gYSBmdW5jdGlvbiByZXR1cm5pbmcgdGhlIG51bWJlciBvZiBpdGVtc1xuICAgICAqIHdhaXRpbmcgdG8gYmUgcHJvY2Vzc2VkLiBJbnZva2Ugd2l0aCBgcXVldWUubGVuZ3RoKClgLlxuICAgICAqIEBwcm9wZXJ0eSB7Ym9vbGVhbn0gc3RhcnRlZCAtIGEgYm9vbGVhbiBpbmRpY2F0aW5nIHdoZXRoZXIgb3Igbm90IGFueVxuICAgICAqIGl0ZW1zIGhhdmUgYmVlbiBwdXNoZWQgYW5kIHByb2Nlc3NlZCBieSB0aGUgcXVldWUuXG4gICAgICogQHByb3BlcnR5IHtGdW5jdGlvbn0gcnVubmluZyAtIGEgZnVuY3Rpb24gcmV0dXJuaW5nIHRoZSBudW1iZXIgb2YgaXRlbXNcbiAgICAgKiBjdXJyZW50bHkgYmVpbmcgcHJvY2Vzc2VkLiBJbnZva2Ugd2l0aCBgcXVldWUucnVubmluZygpYC5cbiAgICAgKiBAcHJvcGVydHkge0Z1bmN0aW9ufSB3b3JrZXJzTGlzdCAtIGEgZnVuY3Rpb24gcmV0dXJuaW5nIHRoZSBhcnJheSBvZiBpdGVtc1xuICAgICAqIGN1cnJlbnRseSBiZWluZyBwcm9jZXNzZWQuIEludm9rZSB3aXRoIGBxdWV1ZS53b3JrZXJzTGlzdCgpYC5cbiAgICAgKiBAcHJvcGVydHkge0Z1bmN0aW9ufSBpZGxlIC0gYSBmdW5jdGlvbiByZXR1cm5pbmcgZmFsc2UgaWYgdGhlcmUgYXJlIGl0ZW1zXG4gICAgICogd2FpdGluZyBvciBiZWluZyBwcm9jZXNzZWQsIG9yIHRydWUgaWYgbm90LiBJbnZva2Ugd2l0aCBgcXVldWUuaWRsZSgpYC5cbiAgICAgKiBAcHJvcGVydHkge251bWJlcn0gY29uY3VycmVuY3kgLSBhbiBpbnRlZ2VyIGZvciBkZXRlcm1pbmluZyBob3cgbWFueSBgd29ya2VyYFxuICAgICAqIGZ1bmN0aW9ucyBzaG91bGQgYmUgcnVuIGluIHBhcmFsbGVsLiBUaGlzIHByb3BlcnR5IGNhbiBiZSBjaGFuZ2VkIGFmdGVyIGFcbiAgICAgKiBgcXVldWVgIGlzIGNyZWF0ZWQgdG8gYWx0ZXIgdGhlIGNvbmN1cnJlbmN5IG9uLXRoZS1mbHkuXG4gICAgICogQHByb3BlcnR5IHtudW1iZXJ9IHBheWxvYWQgLSBhbiBpbnRlZ2VyIHRoYXQgc3BlY2lmaWVzIGhvdyBtYW55IGl0ZW1zIGFyZVxuICAgICAqIHBhc3NlZCB0byB0aGUgd29ya2VyIGZ1bmN0aW9uIGF0IGEgdGltZS4gb25seSBhcHBsaWVzIGlmIHRoaXMgaXMgYVxuICAgICAqIFtjYXJnb117QGxpbmsgbW9kdWxlOkNvbnRyb2xGbG93LmNhcmdvfSBvYmplY3RcbiAgICAgKiBAcHJvcGVydHkge0FzeW5jRnVuY3Rpb259IHB1c2ggLSBhZGQgYSBuZXcgdGFzayB0byB0aGUgYHF1ZXVlYC4gQ2FsbHMgYGNhbGxiYWNrYFxuICAgICAqIG9uY2UgdGhlIGB3b3JrZXJgIGhhcyBmaW5pc2hlZCBwcm9jZXNzaW5nIHRoZSB0YXNrLiBJbnN0ZWFkIG9mIGEgc2luZ2xlIHRhc2ssXG4gICAgICogYSBgdGFza3NgIGFycmF5IGNhbiBiZSBzdWJtaXR0ZWQuIFRoZSByZXNwZWN0aXZlIGNhbGxiYWNrIGlzIHVzZWQgZm9yIGV2ZXJ5XG4gICAgICogdGFzayBpbiB0aGUgbGlzdC4gSW52b2tlIHdpdGggYHF1ZXVlLnB1c2godGFzaywgW2NhbGxiYWNrXSlgLFxuICAgICAqIEBwcm9wZXJ0eSB7QXN5bmNGdW5jdGlvbn0gdW5zaGlmdCAtIGFkZCBhIG5ldyB0YXNrIHRvIHRoZSBmcm9udCBvZiB0aGUgYHF1ZXVlYC5cbiAgICAgKiBJbnZva2Ugd2l0aCBgcXVldWUudW5zaGlmdCh0YXNrLCBbY2FsbGJhY2tdKWAuXG4gICAgICogQHByb3BlcnR5IHtBc3luY0Z1bmN0aW9ufSBwdXNoQXN5bmMgLSB0aGUgc2FtZSBhcyBgcS5wdXNoYCwgZXhjZXB0IHRoaXMgcmV0dXJuc1xuICAgICAqIGEgcHJvbWlzZSB0aGF0IHJlamVjdHMgaWYgYW4gZXJyb3Igb2NjdXJzLlxuICAgICAqIEBwcm9wZXJ0eSB7QXN5bmNGdW5jdGlvbn0gdW5zaGlmdEFzeW5jIC0gdGhlIHNhbWUgYXMgYHEudW5zaGlmdGAsIGV4Y2VwdCB0aGlzIHJldHVybnNcbiAgICAgKiBhIHByb21pc2UgdGhhdCByZWplY3RzIGlmIGFuIGVycm9yIG9jY3Vycy5cbiAgICAgKiBAcHJvcGVydHkge0Z1bmN0aW9ufSByZW1vdmUgLSByZW1vdmUgaXRlbXMgZnJvbSB0aGUgcXVldWUgdGhhdCBtYXRjaCBhIHRlc3RcbiAgICAgKiBmdW5jdGlvbi4gIFRoZSB0ZXN0IGZ1bmN0aW9uIHdpbGwgYmUgcGFzc2VkIGFuIG9iamVjdCB3aXRoIGEgYGRhdGFgIHByb3BlcnR5LFxuICAgICAqIGFuZCBhIGBwcmlvcml0eWAgcHJvcGVydHksIGlmIHRoaXMgaXMgYVxuICAgICAqIFtwcmlvcml0eVF1ZXVlXXtAbGluayBtb2R1bGU6Q29udHJvbEZsb3cucHJpb3JpdHlRdWV1ZX0gb2JqZWN0LlxuICAgICAqIEludm9rZWQgd2l0aCBgcXVldWUucmVtb3ZlKHRlc3RGbilgLCB3aGVyZSBgdGVzdEZuYCBpcyBvZiB0aGUgZm9ybVxuICAgICAqIGBmdW5jdGlvbiAoe2RhdGEsIHByaW9yaXR5fSkge31gIGFuZCByZXR1cm5zIGEgQm9vbGVhbi5cbiAgICAgKiBAcHJvcGVydHkge0Z1bmN0aW9ufSBzYXR1cmF0ZWQgLSBhIGZ1bmN0aW9uIHRoYXQgc2V0cyBhIGNhbGxiYWNrIHRoYXQgaXNcbiAgICAgKiBjYWxsZWQgd2hlbiB0aGUgbnVtYmVyIG9mIHJ1bm5pbmcgd29ya2VycyBoaXRzIHRoZSBgY29uY3VycmVuY3lgIGxpbWl0LCBhbmRcbiAgICAgKiBmdXJ0aGVyIHRhc2tzIHdpbGwgYmUgcXVldWVkLiAgSWYgdGhlIGNhbGxiYWNrIGlzIG9taXR0ZWQsIGBxLnNhdHVyYXRlZCgpYFxuICAgICAqIHJldHVybnMgYSBwcm9taXNlIGZvciB0aGUgbmV4dCBvY2N1cnJlbmNlLlxuICAgICAqIEBwcm9wZXJ0eSB7RnVuY3Rpb259IHVuc2F0dXJhdGVkIC0gYSBmdW5jdGlvbiB0aGF0IHNldHMgYSBjYWxsYmFjayB0aGF0IGlzXG4gICAgICogY2FsbGVkIHdoZW4gdGhlIG51bWJlciBvZiBydW5uaW5nIHdvcmtlcnMgaXMgbGVzcyB0aGFuIHRoZSBgY29uY3VycmVuY3lgICZcbiAgICAgKiBgYnVmZmVyYCBsaW1pdHMsIGFuZCBmdXJ0aGVyIHRhc2tzIHdpbGwgbm90IGJlIHF1ZXVlZC4gSWYgdGhlIGNhbGxiYWNrIGlzXG4gICAgICogb21pdHRlZCwgYHEudW5zYXR1cmF0ZWQoKWAgcmV0dXJucyBhIHByb21pc2UgZm9yIHRoZSBuZXh0IG9jY3VycmVuY2UuXG4gICAgICogQHByb3BlcnR5IHtudW1iZXJ9IGJ1ZmZlciAtIEEgbWluaW11bSB0aHJlc2hvbGQgYnVmZmVyIGluIG9yZGVyIHRvIHNheSB0aGF0XG4gICAgICogdGhlIGBxdWV1ZWAgaXMgYHVuc2F0dXJhdGVkYC5cbiAgICAgKiBAcHJvcGVydHkge0Z1bmN0aW9ufSBlbXB0eSAtIGEgZnVuY3Rpb24gdGhhdCBzZXRzIGEgY2FsbGJhY2sgdGhhdCBpcyBjYWxsZWRcbiAgICAgKiB3aGVuIHRoZSBsYXN0IGl0ZW0gZnJvbSB0aGUgYHF1ZXVlYCBpcyBnaXZlbiB0byBhIGB3b3JrZXJgLiBJZiB0aGUgY2FsbGJhY2tcbiAgICAgKiBpcyBvbWl0dGVkLCBgcS5lbXB0eSgpYCByZXR1cm5zIGEgcHJvbWlzZSBmb3IgdGhlIG5leHQgb2NjdXJyZW5jZS5cbiAgICAgKiBAcHJvcGVydHkge0Z1bmN0aW9ufSBkcmFpbiAtIGEgZnVuY3Rpb24gdGhhdCBzZXRzIGEgY2FsbGJhY2sgdGhhdCBpcyBjYWxsZWRcbiAgICAgKiB3aGVuIHRoZSBsYXN0IGl0ZW0gZnJvbSB0aGUgYHF1ZXVlYCBoYXMgcmV0dXJuZWQgZnJvbSB0aGUgYHdvcmtlcmAuIElmIHRoZVxuICAgICAqIGNhbGxiYWNrIGlzIG9taXR0ZWQsIGBxLmRyYWluKClgIHJldHVybnMgYSBwcm9taXNlIGZvciB0aGUgbmV4dCBvY2N1cnJlbmNlLlxuICAgICAqIEBwcm9wZXJ0eSB7RnVuY3Rpb259IGVycm9yIC0gYSBmdW5jdGlvbiB0aGF0IHNldHMgYSBjYWxsYmFjayB0aGF0IGlzIGNhbGxlZFxuICAgICAqIHdoZW4gYSB0YXNrIGVycm9ycy4gSGFzIHRoZSBzaWduYXR1cmUgYGZ1bmN0aW9uKGVycm9yLCB0YXNrKWAuIElmIHRoZVxuICAgICAqIGNhbGxiYWNrIGlzIG9taXR0ZWQsIGBlcnJvcigpYCByZXR1cm5zIGEgcHJvbWlzZSB0aGF0IHJlamVjdHMgb24gdGhlIG5leHRcbiAgICAgKiBlcnJvci5cbiAgICAgKiBAcHJvcGVydHkge2Jvb2xlYW59IHBhdXNlZCAtIGEgYm9vbGVhbiBmb3IgZGV0ZXJtaW5pbmcgd2hldGhlciB0aGUgcXVldWUgaXNcbiAgICAgKiBpbiBhIHBhdXNlZCBzdGF0ZS5cbiAgICAgKiBAcHJvcGVydHkge0Z1bmN0aW9ufSBwYXVzZSAtIGEgZnVuY3Rpb24gdGhhdCBwYXVzZXMgdGhlIHByb2Nlc3Npbmcgb2YgdGFza3NcbiAgICAgKiB1bnRpbCBgcmVzdW1lKClgIGlzIGNhbGxlZC4gSW52b2tlIHdpdGggYHF1ZXVlLnBhdXNlKClgLlxuICAgICAqIEBwcm9wZXJ0eSB7RnVuY3Rpb259IHJlc3VtZSAtIGEgZnVuY3Rpb24gdGhhdCByZXN1bWVzIHRoZSBwcm9jZXNzaW5nIG9mXG4gICAgICogcXVldWVkIHRhc2tzIHdoZW4gdGhlIHF1ZXVlIGlzIHBhdXNlZC4gSW52b2tlIHdpdGggYHF1ZXVlLnJlc3VtZSgpYC5cbiAgICAgKiBAcHJvcGVydHkge0Z1bmN0aW9ufSBraWxsIC0gYSBmdW5jdGlvbiB0aGF0IHJlbW92ZXMgdGhlIGBkcmFpbmAgY2FsbGJhY2sgYW5kXG4gICAgICogZW1wdGllcyByZW1haW5pbmcgdGFza3MgZnJvbSB0aGUgcXVldWUgZm9yY2luZyBpdCB0byBnbyBpZGxlLiBObyBtb3JlIHRhc2tzXG4gICAgICogc2hvdWxkIGJlIHB1c2hlZCB0byB0aGUgcXVldWUgYWZ0ZXIgY2FsbGluZyB0aGlzIGZ1bmN0aW9uLiBJbnZva2Ugd2l0aCBgcXVldWUua2lsbCgpYC5cbiAgICAgKlxuICAgICAqIEBleGFtcGxlXG4gICAgICogY29uc3QgcSA9IGFzeW5jLnF1ZXVlKHdvcmtlciwgMilcbiAgICAgKiBxLnB1c2goaXRlbTEpXG4gICAgICogcS5wdXNoKGl0ZW0yKVxuICAgICAqIHEucHVzaChpdGVtMylcbiAgICAgKiAvLyBxdWV1ZXMgYXJlIGl0ZXJhYmxlLCBzcHJlYWQgaW50byBhbiBhcnJheSB0byBpbnNwZWN0XG4gICAgICogY29uc3QgaXRlbXMgPSBbLi4ucV0gLy8gW2l0ZW0xLCBpdGVtMiwgaXRlbTNdXG4gICAgICogLy8gb3IgdXNlIGZvciBvZlxuICAgICAqIGZvciAobGV0IGl0ZW0gb2YgcSkge1xuICAgICAqICAgICBjb25zb2xlLmxvZyhpdGVtKVxuICAgICAqIH1cbiAgICAgKlxuICAgICAqIHEuZHJhaW4oKCkgPT4ge1xuICAgICAqICAgICBjb25zb2xlLmxvZygnYWxsIGRvbmUnKVxuICAgICAqIH0pXG4gICAgICogLy8gb3JcbiAgICAgKiBhd2FpdCBxLmRyYWluKClcbiAgICAgKi9cblxuICAgIC8qKlxuICAgICAqIENyZWF0ZXMgYSBgcXVldWVgIG9iamVjdCB3aXRoIHRoZSBzcGVjaWZpZWQgYGNvbmN1cnJlbmN5YC4gVGFza3MgYWRkZWQgdG8gdGhlXG4gICAgICogYHF1ZXVlYCBhcmUgcHJvY2Vzc2VkIGluIHBhcmFsbGVsICh1cCB0byB0aGUgYGNvbmN1cnJlbmN5YCBsaW1pdCkuIElmIGFsbFxuICAgICAqIGB3b3JrZXJgcyBhcmUgaW4gcHJvZ3Jlc3MsIHRoZSB0YXNrIGlzIHF1ZXVlZCB1bnRpbCBvbmUgYmVjb21lcyBhdmFpbGFibGUuXG4gICAgICogT25jZSBhIGB3b3JrZXJgIGNvbXBsZXRlcyBhIGB0YXNrYCwgdGhhdCBgdGFza2AncyBjYWxsYmFjayBpcyBjYWxsZWQuXG4gICAgICpcbiAgICAgKiBAbmFtZSBxdWV1ZVxuICAgICAqIEBzdGF0aWNcbiAgICAgKiBAbWVtYmVyT2YgbW9kdWxlOkNvbnRyb2xGbG93XG4gICAgICogQG1ldGhvZFxuICAgICAqIEBjYXRlZ29yeSBDb250cm9sIEZsb3dcbiAgICAgKiBAcGFyYW0ge0FzeW5jRnVuY3Rpb259IHdvcmtlciAtIEFuIGFzeW5jIGZ1bmN0aW9uIGZvciBwcm9jZXNzaW5nIGEgcXVldWVkIHRhc2suXG4gICAgICogSWYgeW91IHdhbnQgdG8gaGFuZGxlIGVycm9ycyBmcm9tIGFuIGluZGl2aWR1YWwgdGFzaywgcGFzcyBhIGNhbGxiYWNrIHRvXG4gICAgICogYHEucHVzaCgpYC4gSW52b2tlZCB3aXRoICh0YXNrLCBjYWxsYmFjaykuXG4gICAgICogQHBhcmFtIHtudW1iZXJ9IFtjb25jdXJyZW5jeT0xXSAtIEFuIGBpbnRlZ2VyYCBmb3IgZGV0ZXJtaW5pbmcgaG93IG1hbnlcbiAgICAgKiBgd29ya2VyYCBmdW5jdGlvbnMgc2hvdWxkIGJlIHJ1biBpbiBwYXJhbGxlbC4gIElmIG9taXR0ZWQsIHRoZSBjb25jdXJyZW5jeVxuICAgICAqIGRlZmF1bHRzIHRvIGAxYC4gIElmIHRoZSBjb25jdXJyZW5jeSBpcyBgMGAsIGFuIGVycm9yIGlzIHRocm93bi5cbiAgICAgKiBAcmV0dXJucyB7bW9kdWxlOkNvbnRyb2xGbG93LlF1ZXVlT2JqZWN0fSBBIHF1ZXVlIG9iamVjdCB0byBtYW5hZ2UgdGhlIHRhc2tzLiBDYWxsYmFja3MgY2FuIGJlXG4gICAgICogYXR0YWNoZWQgYXMgY2VydGFpbiBwcm9wZXJ0aWVzIHRvIGxpc3RlbiBmb3Igc3BlY2lmaWMgZXZlbnRzIGR1cmluZyB0aGVcbiAgICAgKiBsaWZlY3ljbGUgb2YgdGhlIHF1ZXVlLlxuICAgICAqIEBleGFtcGxlXG4gICAgICpcbiAgICAgKiAvLyBjcmVhdGUgYSBxdWV1ZSBvYmplY3Qgd2l0aCBjb25jdXJyZW5jeSAyXG4gICAgICogdmFyIHEgPSBhc3luYy5xdWV1ZShmdW5jdGlvbih0YXNrLCBjYWxsYmFjaykge1xuICAgICAqICAgICBjb25zb2xlLmxvZygnaGVsbG8gJyArIHRhc2submFtZSk7XG4gICAgICogICAgIGNhbGxiYWNrKCk7XG4gICAgICogfSwgMik7XG4gICAgICpcbiAgICAgKiAvLyBhc3NpZ24gYSBjYWxsYmFja1xuICAgICAqIHEuZHJhaW4oZnVuY3Rpb24oKSB7XG4gICAgICogICAgIGNvbnNvbGUubG9nKCdhbGwgaXRlbXMgaGF2ZSBiZWVuIHByb2Nlc3NlZCcpO1xuICAgICAqIH0pO1xuICAgICAqIC8vIG9yIGF3YWl0IHRoZSBlbmRcbiAgICAgKiBhd2FpdCBxLmRyYWluKClcbiAgICAgKlxuICAgICAqIC8vIGFzc2lnbiBhbiBlcnJvciBjYWxsYmFja1xuICAgICAqIHEuZXJyb3IoZnVuY3Rpb24oZXJyLCB0YXNrKSB7XG4gICAgICogICAgIGNvbnNvbGUuZXJyb3IoJ3Rhc2sgZXhwZXJpZW5jZWQgYW4gZXJyb3InKTtcbiAgICAgKiB9KTtcbiAgICAgKlxuICAgICAqIC8vIGFkZCBzb21lIGl0ZW1zIHRvIHRoZSBxdWV1ZVxuICAgICAqIHEucHVzaCh7bmFtZTogJ2Zvbyd9LCBmdW5jdGlvbihlcnIpIHtcbiAgICAgKiAgICAgY29uc29sZS5sb2coJ2ZpbmlzaGVkIHByb2Nlc3NpbmcgZm9vJyk7XG4gICAgICogfSk7XG4gICAgICogLy8gY2FsbGJhY2sgaXMgb3B0aW9uYWxcbiAgICAgKiBxLnB1c2goe25hbWU6ICdiYXInfSk7XG4gICAgICpcbiAgICAgKiAvLyBhZGQgc29tZSBpdGVtcyB0byB0aGUgcXVldWUgKGJhdGNoLXdpc2UpXG4gICAgICogcS5wdXNoKFt7bmFtZTogJ2Jheid9LHtuYW1lOiAnYmF5J30se25hbWU6ICdiYXgnfV0sIGZ1bmN0aW9uKGVycikge1xuICAgICAqICAgICBjb25zb2xlLmxvZygnZmluaXNoZWQgcHJvY2Vzc2luZyBpdGVtJyk7XG4gICAgICogfSk7XG4gICAgICpcbiAgICAgKiAvLyBhZGQgc29tZSBpdGVtcyB0byB0aGUgZnJvbnQgb2YgdGhlIHF1ZXVlXG4gICAgICogcS51bnNoaWZ0KHtuYW1lOiAnYmFyJ30sIGZ1bmN0aW9uIChlcnIpIHtcbiAgICAgKiAgICAgY29uc29sZS5sb2coJ2ZpbmlzaGVkIHByb2Nlc3NpbmcgYmFyJyk7XG4gICAgICogfSk7XG4gICAgICovXG4gICAgZnVuY3Rpb24gcXVldWUgKHdvcmtlciwgY29uY3VycmVuY3kpIHtcbiAgICAgICAgdmFyIF93b3JrZXIgPSB3cmFwQXN5bmMod29ya2VyKTtcbiAgICAgICAgcmV0dXJuIHF1ZXVlJDEoKGl0ZW1zLCBjYikgPT4ge1xuICAgICAgICAgICAgX3dvcmtlcihpdGVtc1swXSwgY2IpO1xuICAgICAgICB9LCBjb25jdXJyZW5jeSwgMSk7XG4gICAgfVxuXG4gICAgLy8gQmluYXJ5IG1pbi1oZWFwIGltcGxlbWVudGF0aW9uIHVzZWQgZm9yIHByaW9yaXR5IHF1ZXVlLlxuICAgIC8vIEltcGxlbWVudGF0aW9uIGlzIHN0YWJsZSwgaS5lLiBwdXNoIHRpbWUgaXMgY29uc2lkZXJlZCBmb3IgZXF1YWwgcHJpb3JpdGllc1xuICAgIGNsYXNzIEhlYXAge1xuICAgICAgICBjb25zdHJ1Y3RvcigpIHtcbiAgICAgICAgICAgIHRoaXMuaGVhcCA9IFtdO1xuICAgICAgICAgICAgdGhpcy5wdXNoQ291bnQgPSBOdW1iZXIuTUlOX1NBRkVfSU5URUdFUjtcbiAgICAgICAgfVxuXG4gICAgICAgIGdldCBsZW5ndGgoKSB7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy5oZWFwLmxlbmd0aDtcbiAgICAgICAgfVxuXG4gICAgICAgIGVtcHR5ICgpIHtcbiAgICAgICAgICAgIHRoaXMuaGVhcCA9IFtdO1xuICAgICAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgICAgIH1cblxuICAgICAgICBwZXJjVXAoaW5kZXgpIHtcbiAgICAgICAgICAgIGxldCBwO1xuXG4gICAgICAgICAgICB3aGlsZSAoaW5kZXggPiAwICYmIHNtYWxsZXIodGhpcy5oZWFwW2luZGV4XSwgdGhpcy5oZWFwW3A9cGFyZW50KGluZGV4KV0pKSB7XG4gICAgICAgICAgICAgICAgbGV0IHQgPSB0aGlzLmhlYXBbaW5kZXhdO1xuICAgICAgICAgICAgICAgIHRoaXMuaGVhcFtpbmRleF0gPSB0aGlzLmhlYXBbcF07XG4gICAgICAgICAgICAgICAgdGhpcy5oZWFwW3BdID0gdDtcblxuICAgICAgICAgICAgICAgIGluZGV4ID0gcDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIHBlcmNEb3duKGluZGV4KSB7XG4gICAgICAgICAgICBsZXQgbDtcblxuICAgICAgICAgICAgd2hpbGUgKChsPWxlZnRDaGkoaW5kZXgpKSA8IHRoaXMuaGVhcC5sZW5ndGgpIHtcbiAgICAgICAgICAgICAgICBpZiAobCsxIDwgdGhpcy5oZWFwLmxlbmd0aCAmJiBzbWFsbGVyKHRoaXMuaGVhcFtsKzFdLCB0aGlzLmhlYXBbbF0pKSB7XG4gICAgICAgICAgICAgICAgICAgIGwgPSBsKzE7XG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgaWYgKHNtYWxsZXIodGhpcy5oZWFwW2luZGV4XSwgdGhpcy5oZWFwW2xdKSkge1xuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICBsZXQgdCA9IHRoaXMuaGVhcFtpbmRleF07XG4gICAgICAgICAgICAgICAgdGhpcy5oZWFwW2luZGV4XSA9IHRoaXMuaGVhcFtsXTtcbiAgICAgICAgICAgICAgICB0aGlzLmhlYXBbbF0gPSB0O1xuXG4gICAgICAgICAgICAgICAgaW5kZXggPSBsO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgcHVzaChub2RlKSB7XG4gICAgICAgICAgICBub2RlLnB1c2hDb3VudCA9ICsrdGhpcy5wdXNoQ291bnQ7XG4gICAgICAgICAgICB0aGlzLmhlYXAucHVzaChub2RlKTtcbiAgICAgICAgICAgIHRoaXMucGVyY1VwKHRoaXMuaGVhcC5sZW5ndGgtMSk7XG4gICAgICAgIH1cblxuICAgICAgICB1bnNoaWZ0KG5vZGUpIHtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLmhlYXAucHVzaChub2RlKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHNoaWZ0KCkge1xuICAgICAgICAgICAgbGV0IFt0b3BdID0gdGhpcy5oZWFwO1xuXG4gICAgICAgICAgICB0aGlzLmhlYXBbMF0gPSB0aGlzLmhlYXBbdGhpcy5oZWFwLmxlbmd0aC0xXTtcbiAgICAgICAgICAgIHRoaXMuaGVhcC5wb3AoKTtcbiAgICAgICAgICAgIHRoaXMucGVyY0Rvd24oMCk7XG5cbiAgICAgICAgICAgIHJldHVybiB0b3A7XG4gICAgICAgIH1cblxuICAgICAgICB0b0FycmF5KCkge1xuICAgICAgICAgICAgcmV0dXJuIFsuLi50aGlzXTtcbiAgICAgICAgfVxuXG4gICAgICAgICpbU3ltYm9sLml0ZXJhdG9yXSAoKSB7XG4gICAgICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IHRoaXMuaGVhcC5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgICAgIHlpZWxkIHRoaXMuaGVhcFtpXS5kYXRhO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgcmVtb3ZlICh0ZXN0Rm4pIHtcbiAgICAgICAgICAgIGxldCBqID0gMDtcbiAgICAgICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgdGhpcy5oZWFwLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICAgICAgaWYgKCF0ZXN0Rm4odGhpcy5oZWFwW2ldKSkge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLmhlYXBbal0gPSB0aGlzLmhlYXBbaV07XG4gICAgICAgICAgICAgICAgICAgIGorKztcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIHRoaXMuaGVhcC5zcGxpY2Uoaik7XG5cbiAgICAgICAgICAgIGZvciAobGV0IGkgPSBwYXJlbnQodGhpcy5oZWFwLmxlbmd0aC0xKTsgaSA+PSAwOyBpLS0pIHtcbiAgICAgICAgICAgICAgICB0aGlzLnBlcmNEb3duKGkpO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICByZXR1cm4gdGhpcztcbiAgICAgICAgfVxuICAgIH1cblxuICAgIGZ1bmN0aW9uIGxlZnRDaGkoaSkge1xuICAgICAgICByZXR1cm4gKGk8PDEpKzE7XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gcGFyZW50KGkpIHtcbiAgICAgICAgcmV0dXJuICgoaSsxKT4+MSktMTtcbiAgICB9XG5cbiAgICBmdW5jdGlvbiBzbWFsbGVyKHgsIHkpIHtcbiAgICAgICAgaWYgKHgucHJpb3JpdHkgIT09IHkucHJpb3JpdHkpIHtcbiAgICAgICAgICAgIHJldHVybiB4LnByaW9yaXR5IDwgeS5wcmlvcml0eTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIHJldHVybiB4LnB1c2hDb3VudCA8IHkucHVzaENvdW50O1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogVGhlIHNhbWUgYXMgW2FzeW5jLnF1ZXVlXXtAbGluayBtb2R1bGU6Q29udHJvbEZsb3cucXVldWV9IG9ubHkgdGFza3MgYXJlIGFzc2lnbmVkIGEgcHJpb3JpdHkgYW5kXG4gICAgICogY29tcGxldGVkIGluIGFzY2VuZGluZyBwcmlvcml0eSBvcmRlci5cbiAgICAgKlxuICAgICAqIEBuYW1lIHByaW9yaXR5UXVldWVcbiAgICAgKiBAc3RhdGljXG4gICAgICogQG1lbWJlck9mIG1vZHVsZTpDb250cm9sRmxvd1xuICAgICAqIEBtZXRob2RcbiAgICAgKiBAc2VlIFthc3luYy5xdWV1ZV17QGxpbmsgbW9kdWxlOkNvbnRyb2xGbG93LnF1ZXVlfVxuICAgICAqIEBjYXRlZ29yeSBDb250cm9sIEZsb3dcbiAgICAgKiBAcGFyYW0ge0FzeW5jRnVuY3Rpb259IHdvcmtlciAtIEFuIGFzeW5jIGZ1bmN0aW9uIGZvciBwcm9jZXNzaW5nIGEgcXVldWVkIHRhc2suXG4gICAgICogSWYgeW91IHdhbnQgdG8gaGFuZGxlIGVycm9ycyBmcm9tIGFuIGluZGl2aWR1YWwgdGFzaywgcGFzcyBhIGNhbGxiYWNrIHRvXG4gICAgICogYHEucHVzaCgpYC5cbiAgICAgKiBJbnZva2VkIHdpdGggKHRhc2ssIGNhbGxiYWNrKS5cbiAgICAgKiBAcGFyYW0ge251bWJlcn0gY29uY3VycmVuY3kgLSBBbiBgaW50ZWdlcmAgZm9yIGRldGVybWluaW5nIGhvdyBtYW55IGB3b3JrZXJgXG4gICAgICogZnVuY3Rpb25zIHNob3VsZCBiZSBydW4gaW4gcGFyYWxsZWwuICBJZiBvbWl0dGVkLCB0aGUgY29uY3VycmVuY3kgZGVmYXVsdHMgdG9cbiAgICAgKiBgMWAuICBJZiB0aGUgY29uY3VycmVuY3kgaXMgYDBgLCBhbiBlcnJvciBpcyB0aHJvd24uXG4gICAgICogQHJldHVybnMge21vZHVsZTpDb250cm9sRmxvdy5RdWV1ZU9iamVjdH0gQSBwcmlvcml0eVF1ZXVlIG9iamVjdCB0byBtYW5hZ2UgdGhlIHRhc2tzLiBUaGVyZSBhcmUgdGhyZWVcbiAgICAgKiBkaWZmZXJlbmNlcyBiZXR3ZWVuIGBxdWV1ZWAgYW5kIGBwcmlvcml0eVF1ZXVlYCBvYmplY3RzOlxuICAgICAqICogYHB1c2godGFzaywgcHJpb3JpdHksIFtjYWxsYmFja10pYCAtIGBwcmlvcml0eWAgc2hvdWxkIGJlIGEgbnVtYmVyLiBJZiBhblxuICAgICAqICAgYXJyYXkgb2YgYHRhc2tzYCBpcyBnaXZlbiwgYWxsIHRhc2tzIHdpbGwgYmUgYXNzaWduZWQgdGhlIHNhbWUgcHJpb3JpdHkuXG4gICAgICogKiBgcHVzaEFzeW5jKHRhc2ssIHByaW9yaXR5LCBbY2FsbGJhY2tdKWAgLSB0aGUgc2FtZSBhcyBgcHJpb3JpdHlRdWV1ZS5wdXNoYCxcbiAgICAgKiAgIGV4Y2VwdCB0aGlzIHJldHVybnMgYSBwcm9taXNlIHRoYXQgcmVqZWN0cyBpZiBhbiBlcnJvciBvY2N1cnMuXG4gICAgICogKiBUaGUgYHVuc2hpZnRgIGFuZCBgdW5zaGlmdEFzeW5jYCBtZXRob2RzIHdlcmUgcmVtb3ZlZC5cbiAgICAgKi9cbiAgICBmdW5jdGlvbiBwcmlvcml0eVF1ZXVlKHdvcmtlciwgY29uY3VycmVuY3kpIHtcbiAgICAgICAgLy8gU3RhcnQgd2l0aCBhIG5vcm1hbCBxdWV1ZVxuICAgICAgICB2YXIgcSA9IHF1ZXVlKHdvcmtlciwgY29uY3VycmVuY3kpO1xuXG4gICAgICAgIHZhciB7XG4gICAgICAgICAgICBwdXNoLFxuICAgICAgICAgICAgcHVzaEFzeW5jXG4gICAgICAgIH0gPSBxO1xuXG4gICAgICAgIHEuX3Rhc2tzID0gbmV3IEhlYXAoKTtcbiAgICAgICAgcS5fY3JlYXRlVGFza0l0ZW0gPSAoe2RhdGEsIHByaW9yaXR5fSwgY2FsbGJhY2spID0+IHtcbiAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgZGF0YSxcbiAgICAgICAgICAgICAgICBwcmlvcml0eSxcbiAgICAgICAgICAgICAgICBjYWxsYmFja1xuICAgICAgICAgICAgfTtcbiAgICAgICAgfTtcblxuICAgICAgICBmdW5jdGlvbiBjcmVhdGVEYXRhSXRlbXModGFza3MsIHByaW9yaXR5KSB7XG4gICAgICAgICAgICBpZiAoIUFycmF5LmlzQXJyYXkodGFza3MpKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHtkYXRhOiB0YXNrcywgcHJpb3JpdHl9O1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIHRhc2tzLm1hcChkYXRhID0+IHsgcmV0dXJuIHtkYXRhLCBwcmlvcml0eX07IH0pO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gT3ZlcnJpZGUgcHVzaCB0byBhY2NlcHQgc2Vjb25kIHBhcmFtZXRlciByZXByZXNlbnRpbmcgcHJpb3JpdHlcbiAgICAgICAgcS5wdXNoID0gZnVuY3Rpb24oZGF0YSwgcHJpb3JpdHkgPSAwLCBjYWxsYmFjaykge1xuICAgICAgICAgICAgcmV0dXJuIHB1c2goY3JlYXRlRGF0YUl0ZW1zKGRhdGEsIHByaW9yaXR5KSwgY2FsbGJhY2spO1xuICAgICAgICB9O1xuXG4gICAgICAgIHEucHVzaEFzeW5jID0gZnVuY3Rpb24oZGF0YSwgcHJpb3JpdHkgPSAwLCBjYWxsYmFjaykge1xuICAgICAgICAgICAgcmV0dXJuIHB1c2hBc3luYyhjcmVhdGVEYXRhSXRlbXMoZGF0YSwgcHJpb3JpdHkpLCBjYWxsYmFjayk7XG4gICAgICAgIH07XG5cbiAgICAgICAgLy8gUmVtb3ZlIHVuc2hpZnQgZnVuY3Rpb25zXG4gICAgICAgIGRlbGV0ZSBxLnVuc2hpZnQ7XG4gICAgICAgIGRlbGV0ZSBxLnVuc2hpZnRBc3luYztcblxuICAgICAgICByZXR1cm4gcTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBSdW5zIHRoZSBgdGFza3NgIGFycmF5IG9mIGZ1bmN0aW9ucyBpbiBwYXJhbGxlbCwgd2l0aG91dCB3YWl0aW5nIHVudGlsIHRoZVxuICAgICAqIHByZXZpb3VzIGZ1bmN0aW9uIGhhcyBjb21wbGV0ZWQuIE9uY2UgYW55IG9mIHRoZSBgdGFza3NgIGNvbXBsZXRlIG9yIHBhc3MgYW5cbiAgICAgKiBlcnJvciB0byBpdHMgY2FsbGJhY2ssIHRoZSBtYWluIGBjYWxsYmFja2AgaXMgaW1tZWRpYXRlbHkgY2FsbGVkLiBJdCdzXG4gICAgICogZXF1aXZhbGVudCB0byBgUHJvbWlzZS5yYWNlKClgLlxuICAgICAqXG4gICAgICogQG5hbWUgcmFjZVxuICAgICAqIEBzdGF0aWNcbiAgICAgKiBAbWVtYmVyT2YgbW9kdWxlOkNvbnRyb2xGbG93XG4gICAgICogQG1ldGhvZFxuICAgICAqIEBjYXRlZ29yeSBDb250cm9sIEZsb3dcbiAgICAgKiBAcGFyYW0ge0FycmF5fSB0YXNrcyAtIEFuIGFycmF5IGNvbnRhaW5pbmcgW2FzeW5jIGZ1bmN0aW9uc117QGxpbmsgQXN5bmNGdW5jdGlvbn1cbiAgICAgKiB0byBydW4uIEVhY2ggZnVuY3Rpb24gY2FuIGNvbXBsZXRlIHdpdGggYW4gb3B0aW9uYWwgYHJlc3VsdGAgdmFsdWUuXG4gICAgICogQHBhcmFtIHtGdW5jdGlvbn0gY2FsbGJhY2sgLSBBIGNhbGxiYWNrIHRvIHJ1biBvbmNlIGFueSBvZiB0aGUgZnVuY3Rpb25zIGhhdmVcbiAgICAgKiBjb21wbGV0ZWQuIFRoaXMgZnVuY3Rpb24gZ2V0cyBhbiBlcnJvciBvciByZXN1bHQgZnJvbSB0aGUgZmlyc3QgZnVuY3Rpb24gdGhhdFxuICAgICAqIGNvbXBsZXRlZC4gSW52b2tlZCB3aXRoIChlcnIsIHJlc3VsdCkuXG4gICAgICogQHJldHVybnMge1Byb21pc2V9IGEgcHJvbWlzZSwgaWYgYSBjYWxsYmFjayBpcyBvbWl0dGVkXG4gICAgICogQGV4YW1wbGVcbiAgICAgKlxuICAgICAqIGFzeW5jLnJhY2UoW1xuICAgICAqICAgICBmdW5jdGlvbihjYWxsYmFjaykge1xuICAgICAqICAgICAgICAgc2V0VGltZW91dChmdW5jdGlvbigpIHtcbiAgICAgKiAgICAgICAgICAgICBjYWxsYmFjayhudWxsLCAnb25lJyk7XG4gICAgICogICAgICAgICB9LCAyMDApO1xuICAgICAqICAgICB9LFxuICAgICAqICAgICBmdW5jdGlvbihjYWxsYmFjaykge1xuICAgICAqICAgICAgICAgc2V0VGltZW91dChmdW5jdGlvbigpIHtcbiAgICAgKiAgICAgICAgICAgICBjYWxsYmFjayhudWxsLCAndHdvJyk7XG4gICAgICogICAgICAgICB9LCAxMDApO1xuICAgICAqICAgICB9XG4gICAgICogXSxcbiAgICAgKiAvLyBtYWluIGNhbGxiYWNrXG4gICAgICogZnVuY3Rpb24oZXJyLCByZXN1bHQpIHtcbiAgICAgKiAgICAgLy8gdGhlIHJlc3VsdCB3aWxsIGJlIGVxdWFsIHRvICd0d28nIGFzIGl0IGZpbmlzaGVzIGVhcmxpZXJcbiAgICAgKiB9KTtcbiAgICAgKi9cbiAgICBmdW5jdGlvbiByYWNlKHRhc2tzLCBjYWxsYmFjaykge1xuICAgICAgICBjYWxsYmFjayA9IG9uY2UoY2FsbGJhY2spO1xuICAgICAgICBpZiAoIUFycmF5LmlzQXJyYXkodGFza3MpKSByZXR1cm4gY2FsbGJhY2sobmV3IFR5cGVFcnJvcignRmlyc3QgYXJndW1lbnQgdG8gcmFjZSBtdXN0IGJlIGFuIGFycmF5IG9mIGZ1bmN0aW9ucycpKTtcbiAgICAgICAgaWYgKCF0YXNrcy5sZW5ndGgpIHJldHVybiBjYWxsYmFjaygpO1xuICAgICAgICBmb3IgKHZhciBpID0gMCwgbCA9IHRhc2tzLmxlbmd0aDsgaSA8IGw7IGkrKykge1xuICAgICAgICAgICAgd3JhcEFzeW5jKHRhc2tzW2ldKShjYWxsYmFjayk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICB2YXIgcmFjZSQxID0gYXdhaXRpZnkocmFjZSwgMik7XG5cbiAgICAvKipcbiAgICAgKiBTYW1lIGFzIFtgcmVkdWNlYF17QGxpbmsgbW9kdWxlOkNvbGxlY3Rpb25zLnJlZHVjZX0sIG9ubHkgb3BlcmF0ZXMgb24gYGFycmF5YCBpbiByZXZlcnNlIG9yZGVyLlxuICAgICAqXG4gICAgICogQG5hbWUgcmVkdWNlUmlnaHRcbiAgICAgKiBAc3RhdGljXG4gICAgICogQG1lbWJlck9mIG1vZHVsZTpDb2xsZWN0aW9uc1xuICAgICAqIEBtZXRob2RcbiAgICAgKiBAc2VlIFthc3luYy5yZWR1Y2Vde0BsaW5rIG1vZHVsZTpDb2xsZWN0aW9ucy5yZWR1Y2V9XG4gICAgICogQGFsaWFzIGZvbGRyXG4gICAgICogQGNhdGVnb3J5IENvbGxlY3Rpb25cbiAgICAgKiBAcGFyYW0ge0FycmF5fSBhcnJheSAtIEEgY29sbGVjdGlvbiB0byBpdGVyYXRlIG92ZXIuXG4gICAgICogQHBhcmFtIHsqfSBtZW1vIC0gVGhlIGluaXRpYWwgc3RhdGUgb2YgdGhlIHJlZHVjdGlvbi5cbiAgICAgKiBAcGFyYW0ge0FzeW5jRnVuY3Rpb259IGl0ZXJhdGVlIC0gQSBmdW5jdGlvbiBhcHBsaWVkIHRvIGVhY2ggaXRlbSBpbiB0aGVcbiAgICAgKiBhcnJheSB0byBwcm9kdWNlIHRoZSBuZXh0IHN0ZXAgaW4gdGhlIHJlZHVjdGlvbi5cbiAgICAgKiBUaGUgYGl0ZXJhdGVlYCBzaG91bGQgY29tcGxldGUgd2l0aCB0aGUgbmV4dCBzdGF0ZSBvZiB0aGUgcmVkdWN0aW9uLlxuICAgICAqIElmIHRoZSBpdGVyYXRlZSBjb21wbGV0ZXMgd2l0aCBhbiBlcnJvciwgdGhlIHJlZHVjdGlvbiBpcyBzdG9wcGVkIGFuZCB0aGVcbiAgICAgKiBtYWluIGBjYWxsYmFja2AgaXMgaW1tZWRpYXRlbHkgY2FsbGVkIHdpdGggdGhlIGVycm9yLlxuICAgICAqIEludm9rZWQgd2l0aCAobWVtbywgaXRlbSwgY2FsbGJhY2spLlxuICAgICAqIEBwYXJhbSB7RnVuY3Rpb259IFtjYWxsYmFja10gLSBBIGNhbGxiYWNrIHdoaWNoIGlzIGNhbGxlZCBhZnRlciBhbGwgdGhlXG4gICAgICogYGl0ZXJhdGVlYCBmdW5jdGlvbnMgaGF2ZSBmaW5pc2hlZC4gUmVzdWx0IGlzIHRoZSByZWR1Y2VkIHZhbHVlLiBJbnZva2VkIHdpdGhcbiAgICAgKiAoZXJyLCByZXN1bHQpLlxuICAgICAqIEByZXR1cm5zIHtQcm9taXNlfSBhIHByb21pc2UsIGlmIG5vIGNhbGxiYWNrIGlzIHBhc3NlZFxuICAgICAqL1xuICAgIGZ1bmN0aW9uIHJlZHVjZVJpZ2h0IChhcnJheSwgbWVtbywgaXRlcmF0ZWUsIGNhbGxiYWNrKSB7XG4gICAgICAgIHZhciByZXZlcnNlZCA9IFsuLi5hcnJheV0ucmV2ZXJzZSgpO1xuICAgICAgICByZXR1cm4gcmVkdWNlJDEocmV2ZXJzZWQsIG1lbW8sIGl0ZXJhdGVlLCBjYWxsYmFjayk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogV3JhcHMgdGhlIGFzeW5jIGZ1bmN0aW9uIGluIGFub3RoZXIgZnVuY3Rpb24gdGhhdCBhbHdheXMgY29tcGxldGVzIHdpdGggYVxuICAgICAqIHJlc3VsdCBvYmplY3QsIGV2ZW4gd2hlbiBpdCBlcnJvcnMuXG4gICAgICpcbiAgICAgKiBUaGUgcmVzdWx0IG9iamVjdCBoYXMgZWl0aGVyIHRoZSBwcm9wZXJ0eSBgZXJyb3JgIG9yIGB2YWx1ZWAuXG4gICAgICpcbiAgICAgKiBAbmFtZSByZWZsZWN0XG4gICAgICogQHN0YXRpY1xuICAgICAqIEBtZW1iZXJPZiBtb2R1bGU6VXRpbHNcbiAgICAgKiBAbWV0aG9kXG4gICAgICogQGNhdGVnb3J5IFV0aWxcbiAgICAgKiBAcGFyYW0ge0FzeW5jRnVuY3Rpb259IGZuIC0gVGhlIGFzeW5jIGZ1bmN0aW9uIHlvdSB3YW50IHRvIHdyYXBcbiAgICAgKiBAcmV0dXJucyB7RnVuY3Rpb259IC0gQSBmdW5jdGlvbiB0aGF0IGFsd2F5cyBwYXNzZXMgbnVsbCB0byBpdCdzIGNhbGxiYWNrIGFzXG4gICAgICogdGhlIGVycm9yLiBUaGUgc2Vjb25kIGFyZ3VtZW50IHRvIHRoZSBjYWxsYmFjayB3aWxsIGJlIGFuIGBvYmplY3RgIHdpdGhcbiAgICAgKiBlaXRoZXIgYW4gYGVycm9yYCBvciBhIGB2YWx1ZWAgcHJvcGVydHkuXG4gICAgICogQGV4YW1wbGVcbiAgICAgKlxuICAgICAqIGFzeW5jLnBhcmFsbGVsKFtcbiAgICAgKiAgICAgYXN5bmMucmVmbGVjdChmdW5jdGlvbihjYWxsYmFjaykge1xuICAgICAqICAgICAgICAgLy8gZG8gc29tZSBzdHVmZiAuLi5cbiAgICAgKiAgICAgICAgIGNhbGxiYWNrKG51bGwsICdvbmUnKTtcbiAgICAgKiAgICAgfSksXG4gICAgICogICAgIGFzeW5jLnJlZmxlY3QoZnVuY3Rpb24oY2FsbGJhY2spIHtcbiAgICAgKiAgICAgICAgIC8vIGRvIHNvbWUgbW9yZSBzdHVmZiBidXQgZXJyb3IgLi4uXG4gICAgICogICAgICAgICBjYWxsYmFjaygnYmFkIHN0dWZmIGhhcHBlbmVkJyk7XG4gICAgICogICAgIH0pLFxuICAgICAqICAgICBhc3luYy5yZWZsZWN0KGZ1bmN0aW9uKGNhbGxiYWNrKSB7XG4gICAgICogICAgICAgICAvLyBkbyBzb21lIG1vcmUgc3R1ZmYgLi4uXG4gICAgICogICAgICAgICBjYWxsYmFjayhudWxsLCAndHdvJyk7XG4gICAgICogICAgIH0pXG4gICAgICogXSxcbiAgICAgKiAvLyBvcHRpb25hbCBjYWxsYmFja1xuICAgICAqIGZ1bmN0aW9uKGVyciwgcmVzdWx0cykge1xuICAgICAqICAgICAvLyB2YWx1ZXNcbiAgICAgKiAgICAgLy8gcmVzdWx0c1swXS52YWx1ZSA9ICdvbmUnXG4gICAgICogICAgIC8vIHJlc3VsdHNbMV0uZXJyb3IgPSAnYmFkIHN0dWZmIGhhcHBlbmVkJ1xuICAgICAqICAgICAvLyByZXN1bHRzWzJdLnZhbHVlID0gJ3R3bydcbiAgICAgKiB9KTtcbiAgICAgKi9cbiAgICBmdW5jdGlvbiByZWZsZWN0KGZuKSB7XG4gICAgICAgIHZhciBfZm4gPSB3cmFwQXN5bmMoZm4pO1xuICAgICAgICByZXR1cm4gaW5pdGlhbFBhcmFtcyhmdW5jdGlvbiByZWZsZWN0T24oYXJncywgcmVmbGVjdENhbGxiYWNrKSB7XG4gICAgICAgICAgICBhcmdzLnB1c2goKGVycm9yLCAuLi5jYkFyZ3MpID0+IHtcbiAgICAgICAgICAgICAgICBsZXQgcmV0VmFsID0ge307XG4gICAgICAgICAgICAgICAgaWYgKGVycm9yKSB7XG4gICAgICAgICAgICAgICAgICAgIHJldFZhbC5lcnJvciA9IGVycm9yO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBpZiAoY2JBcmdzLmxlbmd0aCA+IDApe1xuICAgICAgICAgICAgICAgICAgICB2YXIgdmFsdWUgPSBjYkFyZ3M7XG4gICAgICAgICAgICAgICAgICAgIGlmIChjYkFyZ3MubGVuZ3RoIDw9IDEpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIFt2YWx1ZV0gPSBjYkFyZ3M7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgcmV0VmFsLnZhbHVlID0gdmFsdWU7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHJlZmxlY3RDYWxsYmFjayhudWxsLCByZXRWYWwpO1xuICAgICAgICAgICAgfSk7XG5cbiAgICAgICAgICAgIHJldHVybiBfZm4uYXBwbHkodGhpcywgYXJncyk7XG4gICAgICAgIH0pO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEEgaGVscGVyIGZ1bmN0aW9uIHRoYXQgd3JhcHMgYW4gYXJyYXkgb3IgYW4gb2JqZWN0IG9mIGZ1bmN0aW9ucyB3aXRoIGByZWZsZWN0YC5cbiAgICAgKlxuICAgICAqIEBuYW1lIHJlZmxlY3RBbGxcbiAgICAgKiBAc3RhdGljXG4gICAgICogQG1lbWJlck9mIG1vZHVsZTpVdGlsc1xuICAgICAqIEBtZXRob2RcbiAgICAgKiBAc2VlIFthc3luYy5yZWZsZWN0XXtAbGluayBtb2R1bGU6VXRpbHMucmVmbGVjdH1cbiAgICAgKiBAY2F0ZWdvcnkgVXRpbFxuICAgICAqIEBwYXJhbSB7QXJyYXl8T2JqZWN0fEl0ZXJhYmxlfSB0YXNrcyAtIFRoZSBjb2xsZWN0aW9uIG9mXG4gICAgICogW2FzeW5jIGZ1bmN0aW9uc117QGxpbmsgQXN5bmNGdW5jdGlvbn0gdG8gd3JhcCBpbiBgYXN5bmMucmVmbGVjdGAuXG4gICAgICogQHJldHVybnMge0FycmF5fSBSZXR1cm5zIGFuIGFycmF5IG9mIGFzeW5jIGZ1bmN0aW9ucywgZWFjaCB3cmFwcGVkIGluXG4gICAgICogYGFzeW5jLnJlZmxlY3RgXG4gICAgICogQGV4YW1wbGVcbiAgICAgKlxuICAgICAqIGxldCB0YXNrcyA9IFtcbiAgICAgKiAgICAgZnVuY3Rpb24oY2FsbGJhY2spIHtcbiAgICAgKiAgICAgICAgIHNldFRpbWVvdXQoZnVuY3Rpb24oKSB7XG4gICAgICogICAgICAgICAgICAgY2FsbGJhY2sobnVsbCwgJ29uZScpO1xuICAgICAqICAgICAgICAgfSwgMjAwKTtcbiAgICAgKiAgICAgfSxcbiAgICAgKiAgICAgZnVuY3Rpb24oY2FsbGJhY2spIHtcbiAgICAgKiAgICAgICAgIC8vIGRvIHNvbWUgbW9yZSBzdHVmZiBidXQgZXJyb3IgLi4uXG4gICAgICogICAgICAgICBjYWxsYmFjayhuZXcgRXJyb3IoJ2JhZCBzdHVmZiBoYXBwZW5lZCcpKTtcbiAgICAgKiAgICAgfSxcbiAgICAgKiAgICAgZnVuY3Rpb24oY2FsbGJhY2spIHtcbiAgICAgKiAgICAgICAgIHNldFRpbWVvdXQoZnVuY3Rpb24oKSB7XG4gICAgICogICAgICAgICAgICAgY2FsbGJhY2sobnVsbCwgJ3R3bycpO1xuICAgICAqICAgICAgICAgfSwgMTAwKTtcbiAgICAgKiAgICAgfVxuICAgICAqIF07XG4gICAgICpcbiAgICAgKiBhc3luYy5wYXJhbGxlbChhc3luYy5yZWZsZWN0QWxsKHRhc2tzKSxcbiAgICAgKiAvLyBvcHRpb25hbCBjYWxsYmFja1xuICAgICAqIGZ1bmN0aW9uKGVyciwgcmVzdWx0cykge1xuICAgICAqICAgICAvLyB2YWx1ZXNcbiAgICAgKiAgICAgLy8gcmVzdWx0c1swXS52YWx1ZSA9ICdvbmUnXG4gICAgICogICAgIC8vIHJlc3VsdHNbMV0uZXJyb3IgPSBFcnJvcignYmFkIHN0dWZmIGhhcHBlbmVkJylcbiAgICAgKiAgICAgLy8gcmVzdWx0c1syXS52YWx1ZSA9ICd0d28nXG4gICAgICogfSk7XG4gICAgICpcbiAgICAgKiAvLyBhbiBleGFtcGxlIHVzaW5nIGFuIG9iamVjdCBpbnN0ZWFkIG9mIGFuIGFycmF5XG4gICAgICogbGV0IHRhc2tzID0ge1xuICAgICAqICAgICBvbmU6IGZ1bmN0aW9uKGNhbGxiYWNrKSB7XG4gICAgICogICAgICAgICBzZXRUaW1lb3V0KGZ1bmN0aW9uKCkge1xuICAgICAqICAgICAgICAgICAgIGNhbGxiYWNrKG51bGwsICdvbmUnKTtcbiAgICAgKiAgICAgICAgIH0sIDIwMCk7XG4gICAgICogICAgIH0sXG4gICAgICogICAgIHR3bzogZnVuY3Rpb24oY2FsbGJhY2spIHtcbiAgICAgKiAgICAgICAgIGNhbGxiYWNrKCd0d28nKTtcbiAgICAgKiAgICAgfSxcbiAgICAgKiAgICAgdGhyZWU6IGZ1bmN0aW9uKGNhbGxiYWNrKSB7XG4gICAgICogICAgICAgICBzZXRUaW1lb3V0KGZ1bmN0aW9uKCkge1xuICAgICAqICAgICAgICAgICAgIGNhbGxiYWNrKG51bGwsICd0aHJlZScpO1xuICAgICAqICAgICAgICAgfSwgMTAwKTtcbiAgICAgKiAgICAgfVxuICAgICAqIH07XG4gICAgICpcbiAgICAgKiBhc3luYy5wYXJhbGxlbChhc3luYy5yZWZsZWN0QWxsKHRhc2tzKSxcbiAgICAgKiAvLyBvcHRpb25hbCBjYWxsYmFja1xuICAgICAqIGZ1bmN0aW9uKGVyciwgcmVzdWx0cykge1xuICAgICAqICAgICAvLyB2YWx1ZXNcbiAgICAgKiAgICAgLy8gcmVzdWx0cy5vbmUudmFsdWUgPSAnb25lJ1xuICAgICAqICAgICAvLyByZXN1bHRzLnR3by5lcnJvciA9ICd0d28nXG4gICAgICogICAgIC8vIHJlc3VsdHMudGhyZWUudmFsdWUgPSAndGhyZWUnXG4gICAgICogfSk7XG4gICAgICovXG4gICAgZnVuY3Rpb24gcmVmbGVjdEFsbCh0YXNrcykge1xuICAgICAgICB2YXIgcmVzdWx0cztcbiAgICAgICAgaWYgKEFycmF5LmlzQXJyYXkodGFza3MpKSB7XG4gICAgICAgICAgICByZXN1bHRzID0gdGFza3MubWFwKHJlZmxlY3QpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgcmVzdWx0cyA9IHt9O1xuICAgICAgICAgICAgT2JqZWN0LmtleXModGFza3MpLmZvckVhY2goa2V5ID0+IHtcbiAgICAgICAgICAgICAgICByZXN1bHRzW2tleV0gPSByZWZsZWN0LmNhbGwodGhpcywgdGFza3Nba2V5XSk7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gcmVzdWx0cztcbiAgICB9XG5cbiAgICBmdW5jdGlvbiByZWplY3QkMihlYWNoZm4sIGFyciwgX2l0ZXJhdGVlLCBjYWxsYmFjaykge1xuICAgICAgICBjb25zdCBpdGVyYXRlZSA9IHdyYXBBc3luYyhfaXRlcmF0ZWUpO1xuICAgICAgICByZXR1cm4gX2ZpbHRlcihlYWNoZm4sIGFyciwgKHZhbHVlLCBjYikgPT4ge1xuICAgICAgICAgICAgaXRlcmF0ZWUodmFsdWUsIChlcnIsIHYpID0+IHtcbiAgICAgICAgICAgICAgICBjYihlcnIsICF2KTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9LCBjYWxsYmFjayk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogVGhlIG9wcG9zaXRlIG9mIFtgZmlsdGVyYF17QGxpbmsgbW9kdWxlOkNvbGxlY3Rpb25zLmZpbHRlcn0uIFJlbW92ZXMgdmFsdWVzIHRoYXQgcGFzcyBhbiBgYXN5bmNgIHRydXRoIHRlc3QuXG4gICAgICpcbiAgICAgKiBAbmFtZSByZWplY3RcbiAgICAgKiBAc3RhdGljXG4gICAgICogQG1lbWJlck9mIG1vZHVsZTpDb2xsZWN0aW9uc1xuICAgICAqIEBtZXRob2RcbiAgICAgKiBAc2VlIFthc3luYy5maWx0ZXJde0BsaW5rIG1vZHVsZTpDb2xsZWN0aW9ucy5maWx0ZXJ9XG4gICAgICogQGNhdGVnb3J5IENvbGxlY3Rpb25cbiAgICAgKiBAcGFyYW0ge0FycmF5fEl0ZXJhYmxlfEFzeW5jSXRlcmFibGV8T2JqZWN0fSBjb2xsIC0gQSBjb2xsZWN0aW9uIHRvIGl0ZXJhdGUgb3Zlci5cbiAgICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBpdGVyYXRlZSAtIEFuIGFzeW5jIHRydXRoIHRlc3QgdG8gYXBwbHkgdG8gZWFjaCBpdGVtIGluXG4gICAgICogYGNvbGxgLlxuICAgICAqIFRoZSBzaG91bGQgY29tcGxldGUgd2l0aCBhIGJvb2xlYW4gdmFsdWUgYXMgaXRzIGByZXN1bHRgLlxuICAgICAqIEludm9rZWQgd2l0aCAoaXRlbSwgY2FsbGJhY2spLlxuICAgICAqIEBwYXJhbSB7RnVuY3Rpb259IFtjYWxsYmFja10gLSBBIGNhbGxiYWNrIHdoaWNoIGlzIGNhbGxlZCBhZnRlciBhbGwgdGhlXG4gICAgICogYGl0ZXJhdGVlYCBmdW5jdGlvbnMgaGF2ZSBmaW5pc2hlZC4gSW52b2tlZCB3aXRoIChlcnIsIHJlc3VsdHMpLlxuICAgICAqIEByZXR1cm5zIHtQcm9taXNlfSBhIHByb21pc2UsIGlmIG5vIGNhbGxiYWNrIGlzIHBhc3NlZFxuICAgICAqIEBleGFtcGxlXG4gICAgICpcbiAgICAgKiAvLyBkaXIxIGlzIGEgZGlyZWN0b3J5IHRoYXQgY29udGFpbnMgZmlsZTEudHh0LCBmaWxlMi50eHRcbiAgICAgKiAvLyBkaXIyIGlzIGEgZGlyZWN0b3J5IHRoYXQgY29udGFpbnMgZmlsZTMudHh0LCBmaWxlNC50eHRcbiAgICAgKiAvLyBkaXIzIGlzIGEgZGlyZWN0b3J5IHRoYXQgY29udGFpbnMgZmlsZTUudHh0XG4gICAgICpcbiAgICAgKiBjb25zdCBmaWxlTGlzdCA9IFsnZGlyMS9maWxlMS50eHQnLCdkaXIyL2ZpbGUzLnR4dCcsJ2RpcjMvZmlsZTYudHh0J107XG4gICAgICpcbiAgICAgKiAvLyBhc3luY2hyb25vdXMgZnVuY3Rpb24gdGhhdCBjaGVja3MgaWYgYSBmaWxlIGV4aXN0c1xuICAgICAqIGZ1bmN0aW9uIGZpbGVFeGlzdHMoZmlsZSwgY2FsbGJhY2spIHtcbiAgICAgKiAgICBmcy5hY2Nlc3MoZmlsZSwgZnMuY29uc3RhbnRzLkZfT0ssIChlcnIpID0+IHtcbiAgICAgKiAgICAgICAgY2FsbGJhY2sobnVsbCwgIWVycik7XG4gICAgICogICAgfSk7XG4gICAgICogfVxuICAgICAqXG4gICAgICogLy8gVXNpbmcgY2FsbGJhY2tzXG4gICAgICogYXN5bmMucmVqZWN0KGZpbGVMaXN0LCBmaWxlRXhpc3RzLCBmdW5jdGlvbihlcnIsIHJlc3VsdHMpIHtcbiAgICAgKiAgICAvLyBbICdkaXIzL2ZpbGU2LnR4dCcgXVxuICAgICAqICAgIC8vIHJlc3VsdHMgbm93IGVxdWFscyBhbiBhcnJheSBvZiB0aGUgbm9uLWV4aXN0aW5nIGZpbGVzXG4gICAgICogfSk7XG4gICAgICpcbiAgICAgKiAvLyBVc2luZyBQcm9taXNlc1xuICAgICAqIGFzeW5jLnJlamVjdChmaWxlTGlzdCwgZmlsZUV4aXN0cylcbiAgICAgKiAudGhlbiggcmVzdWx0cyA9PiB7XG4gICAgICogICAgIGNvbnNvbGUubG9nKHJlc3VsdHMpO1xuICAgICAqICAgICAvLyBbICdkaXIzL2ZpbGU2LnR4dCcgXVxuICAgICAqICAgICAvLyByZXN1bHRzIG5vdyBlcXVhbHMgYW4gYXJyYXkgb2YgdGhlIG5vbi1leGlzdGluZyBmaWxlc1xuICAgICAqIH0pLmNhdGNoKCBlcnIgPT4ge1xuICAgICAqICAgICBjb25zb2xlLmxvZyhlcnIpO1xuICAgICAqIH0pO1xuICAgICAqXG4gICAgICogLy8gVXNpbmcgYXN5bmMvYXdhaXRcbiAgICAgKiBhc3luYyAoKSA9PiB7XG4gICAgICogICAgIHRyeSB7XG4gICAgICogICAgICAgICBsZXQgcmVzdWx0cyA9IGF3YWl0IGFzeW5jLnJlamVjdChmaWxlTGlzdCwgZmlsZUV4aXN0cyk7XG4gICAgICogICAgICAgICBjb25zb2xlLmxvZyhyZXN1bHRzKTtcbiAgICAgKiAgICAgICAgIC8vIFsgJ2RpcjMvZmlsZTYudHh0JyBdXG4gICAgICogICAgICAgICAvLyByZXN1bHRzIG5vdyBlcXVhbHMgYW4gYXJyYXkgb2YgdGhlIG5vbi1leGlzdGluZyBmaWxlc1xuICAgICAqICAgICB9XG4gICAgICogICAgIGNhdGNoIChlcnIpIHtcbiAgICAgKiAgICAgICAgIGNvbnNvbGUubG9nKGVycik7XG4gICAgICogICAgIH1cbiAgICAgKiB9XG4gICAgICpcbiAgICAgKi9cbiAgICBmdW5jdGlvbiByZWplY3QgKGNvbGwsIGl0ZXJhdGVlLCBjYWxsYmFjaykge1xuICAgICAgICByZXR1cm4gcmVqZWN0JDIoZWFjaE9mJDEsIGNvbGwsIGl0ZXJhdGVlLCBjYWxsYmFjaylcbiAgICB9XG4gICAgdmFyIHJlamVjdCQxID0gYXdhaXRpZnkocmVqZWN0LCAzKTtcblxuICAgIC8qKlxuICAgICAqIFRoZSBzYW1lIGFzIFtgcmVqZWN0YF17QGxpbmsgbW9kdWxlOkNvbGxlY3Rpb25zLnJlamVjdH0gYnV0IHJ1bnMgYSBtYXhpbXVtIG9mIGBsaW1pdGAgYXN5bmMgb3BlcmF0aW9ucyBhdCBhXG4gICAgICogdGltZS5cbiAgICAgKlxuICAgICAqIEBuYW1lIHJlamVjdExpbWl0XG4gICAgICogQHN0YXRpY1xuICAgICAqIEBtZW1iZXJPZiBtb2R1bGU6Q29sbGVjdGlvbnNcbiAgICAgKiBAbWV0aG9kXG4gICAgICogQHNlZSBbYXN5bmMucmVqZWN0XXtAbGluayBtb2R1bGU6Q29sbGVjdGlvbnMucmVqZWN0fVxuICAgICAqIEBjYXRlZ29yeSBDb2xsZWN0aW9uXG4gICAgICogQHBhcmFtIHtBcnJheXxJdGVyYWJsZXxBc3luY0l0ZXJhYmxlfE9iamVjdH0gY29sbCAtIEEgY29sbGVjdGlvbiB0byBpdGVyYXRlIG92ZXIuXG4gICAgICogQHBhcmFtIHtudW1iZXJ9IGxpbWl0IC0gVGhlIG1heGltdW0gbnVtYmVyIG9mIGFzeW5jIG9wZXJhdGlvbnMgYXQgYSB0aW1lLlxuICAgICAqIEBwYXJhbSB7RnVuY3Rpb259IGl0ZXJhdGVlIC0gQW4gYXN5bmMgdHJ1dGggdGVzdCB0byBhcHBseSB0byBlYWNoIGl0ZW0gaW5cbiAgICAgKiBgY29sbGAuXG4gICAgICogVGhlIHNob3VsZCBjb21wbGV0ZSB3aXRoIGEgYm9vbGVhbiB2YWx1ZSBhcyBpdHMgYHJlc3VsdGAuXG4gICAgICogSW52b2tlZCB3aXRoIChpdGVtLCBjYWxsYmFjaykuXG4gICAgICogQHBhcmFtIHtGdW5jdGlvbn0gW2NhbGxiYWNrXSAtIEEgY2FsbGJhY2sgd2hpY2ggaXMgY2FsbGVkIGFmdGVyIGFsbCB0aGVcbiAgICAgKiBgaXRlcmF0ZWVgIGZ1bmN0aW9ucyBoYXZlIGZpbmlzaGVkLiBJbnZva2VkIHdpdGggKGVyciwgcmVzdWx0cykuXG4gICAgICogQHJldHVybnMge1Byb21pc2V9IGEgcHJvbWlzZSwgaWYgbm8gY2FsbGJhY2sgaXMgcGFzc2VkXG4gICAgICovXG4gICAgZnVuY3Rpb24gcmVqZWN0TGltaXQgKGNvbGwsIGxpbWl0LCBpdGVyYXRlZSwgY2FsbGJhY2spIHtcbiAgICAgICAgcmV0dXJuIHJlamVjdCQyKGVhY2hPZkxpbWl0JDIobGltaXQpLCBjb2xsLCBpdGVyYXRlZSwgY2FsbGJhY2spXG4gICAgfVxuICAgIHZhciByZWplY3RMaW1pdCQxID0gYXdhaXRpZnkocmVqZWN0TGltaXQsIDQpO1xuXG4gICAgLyoqXG4gICAgICogVGhlIHNhbWUgYXMgW2ByZWplY3RgXXtAbGluayBtb2R1bGU6Q29sbGVjdGlvbnMucmVqZWN0fSBidXQgcnVucyBvbmx5IGEgc2luZ2xlIGFzeW5jIG9wZXJhdGlvbiBhdCBhIHRpbWUuXG4gICAgICpcbiAgICAgKiBAbmFtZSByZWplY3RTZXJpZXNcbiAgICAgKiBAc3RhdGljXG4gICAgICogQG1lbWJlck9mIG1vZHVsZTpDb2xsZWN0aW9uc1xuICAgICAqIEBtZXRob2RcbiAgICAgKiBAc2VlIFthc3luYy5yZWplY3Rde0BsaW5rIG1vZHVsZTpDb2xsZWN0aW9ucy5yZWplY3R9XG4gICAgICogQGNhdGVnb3J5IENvbGxlY3Rpb25cbiAgICAgKiBAcGFyYW0ge0FycmF5fEl0ZXJhYmxlfEFzeW5jSXRlcmFibGV8T2JqZWN0fSBjb2xsIC0gQSBjb2xsZWN0aW9uIHRvIGl0ZXJhdGUgb3Zlci5cbiAgICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBpdGVyYXRlZSAtIEFuIGFzeW5jIHRydXRoIHRlc3QgdG8gYXBwbHkgdG8gZWFjaCBpdGVtIGluXG4gICAgICogYGNvbGxgLlxuICAgICAqIFRoZSBzaG91bGQgY29tcGxldGUgd2l0aCBhIGJvb2xlYW4gdmFsdWUgYXMgaXRzIGByZXN1bHRgLlxuICAgICAqIEludm9rZWQgd2l0aCAoaXRlbSwgY2FsbGJhY2spLlxuICAgICAqIEBwYXJhbSB7RnVuY3Rpb259IFtjYWxsYmFja10gLSBBIGNhbGxiYWNrIHdoaWNoIGlzIGNhbGxlZCBhZnRlciBhbGwgdGhlXG4gICAgICogYGl0ZXJhdGVlYCBmdW5jdGlvbnMgaGF2ZSBmaW5pc2hlZC4gSW52b2tlZCB3aXRoIChlcnIsIHJlc3VsdHMpLlxuICAgICAqIEByZXR1cm5zIHtQcm9taXNlfSBhIHByb21pc2UsIGlmIG5vIGNhbGxiYWNrIGlzIHBhc3NlZFxuICAgICAqL1xuICAgIGZ1bmN0aW9uIHJlamVjdFNlcmllcyAoY29sbCwgaXRlcmF0ZWUsIGNhbGxiYWNrKSB7XG4gICAgICAgIHJldHVybiByZWplY3QkMihlYWNoT2ZTZXJpZXMkMSwgY29sbCwgaXRlcmF0ZWUsIGNhbGxiYWNrKVxuICAgIH1cbiAgICB2YXIgcmVqZWN0U2VyaWVzJDEgPSBhd2FpdGlmeShyZWplY3RTZXJpZXMsIDMpO1xuXG4gICAgZnVuY3Rpb24gY29uc3RhbnQodmFsdWUpIHtcbiAgICAgICAgcmV0dXJuIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgIHJldHVybiB2YWx1ZTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEF0dGVtcHRzIHRvIGdldCBhIHN1Y2Nlc3NmdWwgcmVzcG9uc2UgZnJvbSBgdGFza2Agbm8gbW9yZSB0aGFuIGB0aW1lc2AgdGltZXNcbiAgICAgKiBiZWZvcmUgcmV0dXJuaW5nIGFuIGVycm9yLiBJZiB0aGUgdGFzayBpcyBzdWNjZXNzZnVsLCB0aGUgYGNhbGxiYWNrYCB3aWxsIGJlXG4gICAgICogcGFzc2VkIHRoZSByZXN1bHQgb2YgdGhlIHN1Y2Nlc3NmdWwgdGFzay4gSWYgYWxsIGF0dGVtcHRzIGZhaWwsIHRoZSBjYWxsYmFja1xuICAgICAqIHdpbGwgYmUgcGFzc2VkIHRoZSBlcnJvciBhbmQgcmVzdWx0IChpZiBhbnkpIG9mIHRoZSBmaW5hbCBhdHRlbXB0LlxuICAgICAqXG4gICAgICogQG5hbWUgcmV0cnlcbiAgICAgKiBAc3RhdGljXG4gICAgICogQG1lbWJlck9mIG1vZHVsZTpDb250cm9sRmxvd1xuICAgICAqIEBtZXRob2RcbiAgICAgKiBAY2F0ZWdvcnkgQ29udHJvbCBGbG93XG4gICAgICogQHNlZSBbYXN5bmMucmV0cnlhYmxlXXtAbGluayBtb2R1bGU6Q29udHJvbEZsb3cucmV0cnlhYmxlfVxuICAgICAqIEBwYXJhbSB7T2JqZWN0fG51bWJlcn0gW29wdHMgPSB7dGltZXM6IDUsIGludGVydmFsOiAwfXwgNV0gLSBDYW4gYmUgZWl0aGVyIGFuXG4gICAgICogb2JqZWN0IHdpdGggYHRpbWVzYCBhbmQgYGludGVydmFsYCBvciBhIG51bWJlci5cbiAgICAgKiAqIGB0aW1lc2AgLSBUaGUgbnVtYmVyIG9mIGF0dGVtcHRzIHRvIG1ha2UgYmVmb3JlIGdpdmluZyB1cC4gIFRoZSBkZWZhdWx0XG4gICAgICogICBpcyBgNWAuXG4gICAgICogKiBgaW50ZXJ2YWxgIC0gVGhlIHRpbWUgdG8gd2FpdCBiZXR3ZWVuIHJldHJpZXMsIGluIG1pbGxpc2Vjb25kcy4gIFRoZVxuICAgICAqICAgZGVmYXVsdCBpcyBgMGAuIFRoZSBpbnRlcnZhbCBtYXkgYWxzbyBiZSBzcGVjaWZpZWQgYXMgYSBmdW5jdGlvbiBvZiB0aGVcbiAgICAgKiAgIHJldHJ5IGNvdW50IChzZWUgZXhhbXBsZSkuXG4gICAgICogKiBgZXJyb3JGaWx0ZXJgIC0gQW4gb3B0aW9uYWwgc3luY2hyb25vdXMgZnVuY3Rpb24gdGhhdCBpcyBpbnZva2VkIG9uXG4gICAgICogICBlcnJvbmVvdXMgcmVzdWx0LiBJZiBpdCByZXR1cm5zIGB0cnVlYCB0aGUgcmV0cnkgYXR0ZW1wdHMgd2lsbCBjb250aW51ZTtcbiAgICAgKiAgIGlmIHRoZSBmdW5jdGlvbiByZXR1cm5zIGBmYWxzZWAgdGhlIHJldHJ5IGZsb3cgaXMgYWJvcnRlZCB3aXRoIHRoZSBjdXJyZW50XG4gICAgICogICBhdHRlbXB0J3MgZXJyb3IgYW5kIHJlc3VsdCBiZWluZyByZXR1cm5lZCB0byB0aGUgZmluYWwgY2FsbGJhY2suXG4gICAgICogICBJbnZva2VkIHdpdGggKGVycikuXG4gICAgICogKiBJZiBgb3B0c2AgaXMgYSBudW1iZXIsIHRoZSBudW1iZXIgc3BlY2lmaWVzIHRoZSBudW1iZXIgb2YgdGltZXMgdG8gcmV0cnksXG4gICAgICogICB3aXRoIHRoZSBkZWZhdWx0IGludGVydmFsIG9mIGAwYC5cbiAgICAgKiBAcGFyYW0ge0FzeW5jRnVuY3Rpb259IHRhc2sgLSBBbiBhc3luYyBmdW5jdGlvbiB0byByZXRyeS5cbiAgICAgKiBJbnZva2VkIHdpdGggKGNhbGxiYWNrKS5cbiAgICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBbY2FsbGJhY2tdIC0gQW4gb3B0aW9uYWwgY2FsbGJhY2sgd2hpY2ggaXMgY2FsbGVkIHdoZW4gdGhlXG4gICAgICogdGFzayBoYXMgc3VjY2VlZGVkLCBvciBhZnRlciB0aGUgZmluYWwgZmFpbGVkIGF0dGVtcHQuIEl0IHJlY2VpdmVzIHRoZSBgZXJyYFxuICAgICAqIGFuZCBgcmVzdWx0YCBhcmd1bWVudHMgb2YgdGhlIGxhc3QgYXR0ZW1wdCBhdCBjb21wbGV0aW5nIHRoZSBgdGFza2AuIEludm9rZWRcbiAgICAgKiB3aXRoIChlcnIsIHJlc3VsdHMpLlxuICAgICAqIEByZXR1cm5zIHtQcm9taXNlfSBhIHByb21pc2UgaWYgbm8gY2FsbGJhY2sgcHJvdmlkZWRcbiAgICAgKlxuICAgICAqIEBleGFtcGxlXG4gICAgICpcbiAgICAgKiAvLyBUaGUgYHJldHJ5YCBmdW5jdGlvbiBjYW4gYmUgdXNlZCBhcyBhIHN0YW5kLWFsb25lIGNvbnRyb2wgZmxvdyBieSBwYXNzaW5nXG4gICAgICogLy8gYSBjYWxsYmFjaywgYXMgc2hvd24gYmVsb3c6XG4gICAgICpcbiAgICAgKiAvLyB0cnkgY2FsbGluZyBhcGlNZXRob2QgMyB0aW1lc1xuICAgICAqIGFzeW5jLnJldHJ5KDMsIGFwaU1ldGhvZCwgZnVuY3Rpb24oZXJyLCByZXN1bHQpIHtcbiAgICAgKiAgICAgLy8gZG8gc29tZXRoaW5nIHdpdGggdGhlIHJlc3VsdFxuICAgICAqIH0pO1xuICAgICAqXG4gICAgICogLy8gdHJ5IGNhbGxpbmcgYXBpTWV0aG9kIDMgdGltZXMsIHdhaXRpbmcgMjAwIG1zIGJldHdlZW4gZWFjaCByZXRyeVxuICAgICAqIGFzeW5jLnJldHJ5KHt0aW1lczogMywgaW50ZXJ2YWw6IDIwMH0sIGFwaU1ldGhvZCwgZnVuY3Rpb24oZXJyLCByZXN1bHQpIHtcbiAgICAgKiAgICAgLy8gZG8gc29tZXRoaW5nIHdpdGggdGhlIHJlc3VsdFxuICAgICAqIH0pO1xuICAgICAqXG4gICAgICogLy8gdHJ5IGNhbGxpbmcgYXBpTWV0aG9kIDEwIHRpbWVzIHdpdGggZXhwb25lbnRpYWwgYmFja29mZlxuICAgICAqIC8vIChpLmUuIGludGVydmFscyBvZiAxMDAsIDIwMCwgNDAwLCA4MDAsIDE2MDAsIC4uLiBtaWxsaXNlY29uZHMpXG4gICAgICogYXN5bmMucmV0cnkoe1xuICAgICAqICAgdGltZXM6IDEwLFxuICAgICAqICAgaW50ZXJ2YWw6IGZ1bmN0aW9uKHJldHJ5Q291bnQpIHtcbiAgICAgKiAgICAgcmV0dXJuIDUwICogTWF0aC5wb3coMiwgcmV0cnlDb3VudCk7XG4gICAgICogICB9XG4gICAgICogfSwgYXBpTWV0aG9kLCBmdW5jdGlvbihlcnIsIHJlc3VsdCkge1xuICAgICAqICAgICAvLyBkbyBzb21ldGhpbmcgd2l0aCB0aGUgcmVzdWx0XG4gICAgICogfSk7XG4gICAgICpcbiAgICAgKiAvLyB0cnkgY2FsbGluZyBhcGlNZXRob2QgdGhlIGRlZmF1bHQgNSB0aW1lcyBubyBkZWxheSBiZXR3ZWVuIGVhY2ggcmV0cnlcbiAgICAgKiBhc3luYy5yZXRyeShhcGlNZXRob2QsIGZ1bmN0aW9uKGVyciwgcmVzdWx0KSB7XG4gICAgICogICAgIC8vIGRvIHNvbWV0aGluZyB3aXRoIHRoZSByZXN1bHRcbiAgICAgKiB9KTtcbiAgICAgKlxuICAgICAqIC8vIHRyeSBjYWxsaW5nIGFwaU1ldGhvZCBvbmx5IHdoZW4gZXJyb3IgY29uZGl0aW9uIHNhdGlzZmllcywgYWxsIG90aGVyXG4gICAgICogLy8gZXJyb3JzIHdpbGwgYWJvcnQgdGhlIHJldHJ5IGNvbnRyb2wgZmxvdyBhbmQgcmV0dXJuIHRvIGZpbmFsIGNhbGxiYWNrXG4gICAgICogYXN5bmMucmV0cnkoe1xuICAgICAqICAgZXJyb3JGaWx0ZXI6IGZ1bmN0aW9uKGVycikge1xuICAgICAqICAgICByZXR1cm4gZXJyLm1lc3NhZ2UgPT09ICdUZW1wb3JhcnkgZXJyb3InOyAvLyBvbmx5IHJldHJ5IG9uIGEgc3BlY2lmaWMgZXJyb3JcbiAgICAgKiAgIH1cbiAgICAgKiB9LCBhcGlNZXRob2QsIGZ1bmN0aW9uKGVyciwgcmVzdWx0KSB7XG4gICAgICogICAgIC8vIGRvIHNvbWV0aGluZyB3aXRoIHRoZSByZXN1bHRcbiAgICAgKiB9KTtcbiAgICAgKlxuICAgICAqIC8vIHRvIHJldHJ5IGluZGl2aWR1YWwgbWV0aG9kcyB0aGF0IGFyZSBub3QgYXMgcmVsaWFibGUgd2l0aGluIG90aGVyXG4gICAgICogLy8gY29udHJvbCBmbG93IGZ1bmN0aW9ucywgdXNlIHRoZSBgcmV0cnlhYmxlYCB3cmFwcGVyOlxuICAgICAqIGFzeW5jLmF1dG8oe1xuICAgICAqICAgICB1c2VyczogYXBpLmdldFVzZXJzLmJpbmQoYXBpKSxcbiAgICAgKiAgICAgcGF5bWVudHM6IGFzeW5jLnJldHJ5YWJsZSgzLCBhcGkuZ2V0UGF5bWVudHMuYmluZChhcGkpKVxuICAgICAqIH0sIGZ1bmN0aW9uKGVyciwgcmVzdWx0cykge1xuICAgICAqICAgICAvLyBkbyBzb21ldGhpbmcgd2l0aCB0aGUgcmVzdWx0c1xuICAgICAqIH0pO1xuICAgICAqXG4gICAgICovXG4gICAgY29uc3QgREVGQVVMVF9USU1FUyA9IDU7XG4gICAgY29uc3QgREVGQVVMVF9JTlRFUlZBTCA9IDA7XG5cbiAgICBmdW5jdGlvbiByZXRyeShvcHRzLCB0YXNrLCBjYWxsYmFjaykge1xuICAgICAgICB2YXIgb3B0aW9ucyA9IHtcbiAgICAgICAgICAgIHRpbWVzOiBERUZBVUxUX1RJTUVTLFxuICAgICAgICAgICAgaW50ZXJ2YWxGdW5jOiBjb25zdGFudChERUZBVUxUX0lOVEVSVkFMKVxuICAgICAgICB9O1xuXG4gICAgICAgIGlmIChhcmd1bWVudHMubGVuZ3RoIDwgMyAmJiB0eXBlb2Ygb3B0cyA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICAgICAgY2FsbGJhY2sgPSB0YXNrIHx8IHByb21pc2VDYWxsYmFjaygpO1xuICAgICAgICAgICAgdGFzayA9IG9wdHM7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBwYXJzZVRpbWVzKG9wdGlvbnMsIG9wdHMpO1xuICAgICAgICAgICAgY2FsbGJhY2sgPSBjYWxsYmFjayB8fCBwcm9taXNlQ2FsbGJhY2soKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmICh0eXBlb2YgdGFzayAhPT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwiSW52YWxpZCBhcmd1bWVudHMgZm9yIGFzeW5jLnJldHJ5XCIpO1xuICAgICAgICB9XG5cbiAgICAgICAgdmFyIF90YXNrID0gd3JhcEFzeW5jKHRhc2spO1xuXG4gICAgICAgIHZhciBhdHRlbXB0ID0gMTtcbiAgICAgICAgZnVuY3Rpb24gcmV0cnlBdHRlbXB0KCkge1xuICAgICAgICAgICAgX3Rhc2soKGVyciwgLi4uYXJncykgPT4ge1xuICAgICAgICAgICAgICAgIGlmIChlcnIgPT09IGZhbHNlKSByZXR1cm5cbiAgICAgICAgICAgICAgICBpZiAoZXJyICYmIGF0dGVtcHQrKyA8IG9wdGlvbnMudGltZXMgJiZcbiAgICAgICAgICAgICAgICAgICAgKHR5cGVvZiBvcHRpb25zLmVycm9yRmlsdGVyICE9ICdmdW5jdGlvbicgfHxcbiAgICAgICAgICAgICAgICAgICAgICAgIG9wdGlvbnMuZXJyb3JGaWx0ZXIoZXJyKSkpIHtcbiAgICAgICAgICAgICAgICAgICAgc2V0VGltZW91dChyZXRyeUF0dGVtcHQsIG9wdGlvbnMuaW50ZXJ2YWxGdW5jKGF0dGVtcHQgLSAxKSk7XG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgY2FsbGJhY2soZXJyLCAuLi5hcmdzKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHJ5QXR0ZW1wdCgpO1xuICAgICAgICByZXR1cm4gY2FsbGJhY2tbUFJPTUlTRV9TWU1CT0xdXG4gICAgfVxuXG4gICAgZnVuY3Rpb24gcGFyc2VUaW1lcyhhY2MsIHQpIHtcbiAgICAgICAgaWYgKHR5cGVvZiB0ID09PSAnb2JqZWN0Jykge1xuICAgICAgICAgICAgYWNjLnRpbWVzID0gK3QudGltZXMgfHwgREVGQVVMVF9USU1FUztcblxuICAgICAgICAgICAgYWNjLmludGVydmFsRnVuYyA9IHR5cGVvZiB0LmludGVydmFsID09PSAnZnVuY3Rpb24nID9cbiAgICAgICAgICAgICAgICB0LmludGVydmFsIDpcbiAgICAgICAgICAgICAgICBjb25zdGFudCgrdC5pbnRlcnZhbCB8fCBERUZBVUxUX0lOVEVSVkFMKTtcblxuICAgICAgICAgICAgYWNjLmVycm9yRmlsdGVyID0gdC5lcnJvckZpbHRlcjtcbiAgICAgICAgfSBlbHNlIGlmICh0eXBlb2YgdCA9PT0gJ251bWJlcicgfHwgdHlwZW9mIHQgPT09ICdzdHJpbmcnKSB7XG4gICAgICAgICAgICBhY2MudGltZXMgPSArdCB8fCBERUZBVUxUX1RJTUVTO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwiSW52YWxpZCBhcmd1bWVudHMgZm9yIGFzeW5jLnJldHJ5XCIpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQSBjbG9zZSByZWxhdGl2ZSBvZiBbYHJldHJ5YF17QGxpbmsgbW9kdWxlOkNvbnRyb2xGbG93LnJldHJ5fS4gIFRoaXMgbWV0aG9kXG4gICAgICogd3JhcHMgYSB0YXNrIGFuZCBtYWtlcyBpdCByZXRyeWFibGUsIHJhdGhlciB0aGFuIGltbWVkaWF0ZWx5IGNhbGxpbmcgaXRcbiAgICAgKiB3aXRoIHJldHJpZXMuXG4gICAgICpcbiAgICAgKiBAbmFtZSByZXRyeWFibGVcbiAgICAgKiBAc3RhdGljXG4gICAgICogQG1lbWJlck9mIG1vZHVsZTpDb250cm9sRmxvd1xuICAgICAqIEBtZXRob2RcbiAgICAgKiBAc2VlIFthc3luYy5yZXRyeV17QGxpbmsgbW9kdWxlOkNvbnRyb2xGbG93LnJldHJ5fVxuICAgICAqIEBjYXRlZ29yeSBDb250cm9sIEZsb3dcbiAgICAgKiBAcGFyYW0ge09iamVjdHxudW1iZXJ9IFtvcHRzID0ge3RpbWVzOiA1LCBpbnRlcnZhbDogMH18IDVdIC0gb3B0aW9uYWxcbiAgICAgKiBvcHRpb25zLCBleGFjdGx5IHRoZSBzYW1lIGFzIGZyb20gYHJldHJ5YCwgZXhjZXB0IGZvciBhIGBvcHRzLmFyaXR5YCB0aGF0XG4gICAgICogaXMgdGhlIGFyaXR5IG9mIHRoZSBgdGFza2AgZnVuY3Rpb24sIGRlZmF1bHRpbmcgdG8gYHRhc2subGVuZ3RoYFxuICAgICAqIEBwYXJhbSB7QXN5bmNGdW5jdGlvbn0gdGFzayAtIHRoZSBhc3luY2hyb25vdXMgZnVuY3Rpb24gdG8gd3JhcC5cbiAgICAgKiBUaGlzIGZ1bmN0aW9uIHdpbGwgYmUgcGFzc2VkIGFueSBhcmd1bWVudHMgcGFzc2VkIHRvIHRoZSByZXR1cm5lZCB3cmFwcGVyLlxuICAgICAqIEludm9rZWQgd2l0aCAoLi4uYXJncywgY2FsbGJhY2spLlxuICAgICAqIEByZXR1cm5zIHtBc3luY0Z1bmN0aW9ufSBUaGUgd3JhcHBlZCBmdW5jdGlvbiwgd2hpY2ggd2hlbiBpbnZva2VkLCB3aWxsXG4gICAgICogcmV0cnkgb24gYW4gZXJyb3IsIGJhc2VkIG9uIHRoZSBwYXJhbWV0ZXJzIHNwZWNpZmllZCBpbiBgb3B0c2AuXG4gICAgICogVGhpcyBmdW5jdGlvbiB3aWxsIGFjY2VwdCB0aGUgc2FtZSBwYXJhbWV0ZXJzIGFzIGB0YXNrYC5cbiAgICAgKiBAZXhhbXBsZVxuICAgICAqXG4gICAgICogYXN5bmMuYXV0byh7XG4gICAgICogICAgIGRlcDE6IGFzeW5jLnJldHJ5YWJsZSgzLCBnZXRGcm9tRmxha3lTZXJ2aWNlKSxcbiAgICAgKiAgICAgcHJvY2VzczogW1wiZGVwMVwiLCBhc3luYy5yZXRyeWFibGUoMywgZnVuY3Rpb24gKHJlc3VsdHMsIGNiKSB7XG4gICAgICogICAgICAgICBtYXliZVByb2Nlc3NEYXRhKHJlc3VsdHMuZGVwMSwgY2IpO1xuICAgICAqICAgICB9KV1cbiAgICAgKiB9LCBjYWxsYmFjayk7XG4gICAgICovXG4gICAgZnVuY3Rpb24gcmV0cnlhYmxlIChvcHRzLCB0YXNrKSB7XG4gICAgICAgIGlmICghdGFzaykge1xuICAgICAgICAgICAgdGFzayA9IG9wdHM7XG4gICAgICAgICAgICBvcHRzID0gbnVsbDtcbiAgICAgICAgfVxuICAgICAgICBsZXQgYXJpdHkgPSAob3B0cyAmJiBvcHRzLmFyaXR5KSB8fCB0YXNrLmxlbmd0aDtcbiAgICAgICAgaWYgKGlzQXN5bmModGFzaykpIHtcbiAgICAgICAgICAgIGFyaXR5ICs9IDE7XG4gICAgICAgIH1cbiAgICAgICAgdmFyIF90YXNrID0gd3JhcEFzeW5jKHRhc2spO1xuICAgICAgICByZXR1cm4gaW5pdGlhbFBhcmFtcygoYXJncywgY2FsbGJhY2spID0+IHtcbiAgICAgICAgICAgIGlmIChhcmdzLmxlbmd0aCA8IGFyaXR5IC0gMSB8fCBjYWxsYmFjayA9PSBudWxsKSB7XG4gICAgICAgICAgICAgICAgYXJncy5wdXNoKGNhbGxiYWNrKTtcbiAgICAgICAgICAgICAgICBjYWxsYmFjayA9IHByb21pc2VDYWxsYmFjaygpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZnVuY3Rpb24gdGFza0ZuKGNiKSB7XG4gICAgICAgICAgICAgICAgX3Rhc2soLi4uYXJncywgY2IpO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBpZiAob3B0cykgcmV0cnkob3B0cywgdGFza0ZuLCBjYWxsYmFjayk7XG4gICAgICAgICAgICBlbHNlIHJldHJ5KHRhc2tGbiwgY2FsbGJhY2spO1xuXG4gICAgICAgICAgICByZXR1cm4gY2FsbGJhY2tbUFJPTUlTRV9TWU1CT0xdXG4gICAgICAgIH0pO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFJ1biB0aGUgZnVuY3Rpb25zIGluIHRoZSBgdGFza3NgIGNvbGxlY3Rpb24gaW4gc2VyaWVzLCBlYWNoIG9uZSBydW5uaW5nIG9uY2VcbiAgICAgKiB0aGUgcHJldmlvdXMgZnVuY3Rpb24gaGFzIGNvbXBsZXRlZC4gSWYgYW55IGZ1bmN0aW9ucyBpbiB0aGUgc2VyaWVzIHBhc3MgYW5cbiAgICAgKiBlcnJvciB0byBpdHMgY2FsbGJhY2ssIG5vIG1vcmUgZnVuY3Rpb25zIGFyZSBydW4sIGFuZCBgY2FsbGJhY2tgIGlzXG4gICAgICogaW1tZWRpYXRlbHkgY2FsbGVkIHdpdGggdGhlIHZhbHVlIG9mIHRoZSBlcnJvci4gT3RoZXJ3aXNlLCBgY2FsbGJhY2tgXG4gICAgICogcmVjZWl2ZXMgYW4gYXJyYXkgb2YgcmVzdWx0cyB3aGVuIGB0YXNrc2AgaGF2ZSBjb21wbGV0ZWQuXG4gICAgICpcbiAgICAgKiBJdCBpcyBhbHNvIHBvc3NpYmxlIHRvIHVzZSBhbiBvYmplY3QgaW5zdGVhZCBvZiBhbiBhcnJheS4gRWFjaCBwcm9wZXJ0eSB3aWxsXG4gICAgICogYmUgcnVuIGFzIGEgZnVuY3Rpb24sIGFuZCB0aGUgcmVzdWx0cyB3aWxsIGJlIHBhc3NlZCB0byB0aGUgZmluYWwgYGNhbGxiYWNrYFxuICAgICAqIGFzIGFuIG9iamVjdCBpbnN0ZWFkIG9mIGFuIGFycmF5LiBUaGlzIGNhbiBiZSBhIG1vcmUgcmVhZGFibGUgd2F5IG9mIGhhbmRsaW5nXG4gICAgICogIHJlc3VsdHMgZnJvbSB7QGxpbmsgYXN5bmMuc2VyaWVzfS5cbiAgICAgKlxuICAgICAqICoqTm90ZSoqIHRoYXQgd2hpbGUgbWFueSBpbXBsZW1lbnRhdGlvbnMgcHJlc2VydmUgdGhlIG9yZGVyIG9mIG9iamVjdFxuICAgICAqIHByb3BlcnRpZXMsIHRoZSBbRUNNQVNjcmlwdCBMYW5ndWFnZSBTcGVjaWZpY2F0aW9uXShodHRwOi8vd3d3LmVjbWEtaW50ZXJuYXRpb25hbC5vcmcvZWNtYS0yNjIvNS4xLyNzZWMtOC42KVxuICAgICAqIGV4cGxpY2l0bHkgc3RhdGVzIHRoYXRcbiAgICAgKlxuICAgICAqID4gVGhlIG1lY2hhbmljcyBhbmQgb3JkZXIgb2YgZW51bWVyYXRpbmcgdGhlIHByb3BlcnRpZXMgaXMgbm90IHNwZWNpZmllZC5cbiAgICAgKlxuICAgICAqIFNvIGlmIHlvdSByZWx5IG9uIHRoZSBvcmRlciBpbiB3aGljaCB5b3VyIHNlcmllcyBvZiBmdW5jdGlvbnMgYXJlIGV4ZWN1dGVkLFxuICAgICAqIGFuZCB3YW50IHRoaXMgdG8gd29yayBvbiBhbGwgcGxhdGZvcm1zLCBjb25zaWRlciB1c2luZyBhbiBhcnJheS5cbiAgICAgKlxuICAgICAqIEBuYW1lIHNlcmllc1xuICAgICAqIEBzdGF0aWNcbiAgICAgKiBAbWVtYmVyT2YgbW9kdWxlOkNvbnRyb2xGbG93XG4gICAgICogQG1ldGhvZFxuICAgICAqIEBjYXRlZ29yeSBDb250cm9sIEZsb3dcbiAgICAgKiBAcGFyYW0ge0FycmF5fEl0ZXJhYmxlfEFzeW5jSXRlcmFibGV8T2JqZWN0fSB0YXNrcyAtIEEgY29sbGVjdGlvbiBjb250YWluaW5nXG4gICAgICogW2FzeW5jIGZ1bmN0aW9uc117QGxpbmsgQXN5bmNGdW5jdGlvbn0gdG8gcnVuIGluIHNlcmllcy5cbiAgICAgKiBFYWNoIGZ1bmN0aW9uIGNhbiBjb21wbGV0ZSB3aXRoIGFueSBudW1iZXIgb2Ygb3B0aW9uYWwgYHJlc3VsdGAgdmFsdWVzLlxuICAgICAqIEBwYXJhbSB7RnVuY3Rpb259IFtjYWxsYmFja10gLSBBbiBvcHRpb25hbCBjYWxsYmFjayB0byBydW4gb25jZSBhbGwgdGhlXG4gICAgICogZnVuY3Rpb25zIGhhdmUgY29tcGxldGVkLiBUaGlzIGZ1bmN0aW9uIGdldHMgYSByZXN1bHRzIGFycmF5IChvciBvYmplY3QpXG4gICAgICogY29udGFpbmluZyBhbGwgdGhlIHJlc3VsdCBhcmd1bWVudHMgcGFzc2VkIHRvIHRoZSBgdGFza2AgY2FsbGJhY2tzLiBJbnZva2VkXG4gICAgICogd2l0aCAoZXJyLCByZXN1bHQpLlxuICAgICAqIEByZXR1cm4ge1Byb21pc2V9IGEgcHJvbWlzZSwgaWYgbm8gY2FsbGJhY2sgaXMgcGFzc2VkXG4gICAgICogQGV4YW1wbGVcbiAgICAgKlxuICAgICAqIC8vVXNpbmcgQ2FsbGJhY2tzXG4gICAgICogYXN5bmMuc2VyaWVzKFtcbiAgICAgKiAgICAgZnVuY3Rpb24oY2FsbGJhY2spIHtcbiAgICAgKiAgICAgICAgIHNldFRpbWVvdXQoZnVuY3Rpb24oKSB7XG4gICAgICogICAgICAgICAgICAgLy8gZG8gc29tZSBhc3luYyB0YXNrXG4gICAgICogICAgICAgICAgICAgY2FsbGJhY2sobnVsbCwgJ29uZScpO1xuICAgICAqICAgICAgICAgfSwgMjAwKTtcbiAgICAgKiAgICAgfSxcbiAgICAgKiAgICAgZnVuY3Rpb24oY2FsbGJhY2spIHtcbiAgICAgKiAgICAgICAgIHNldFRpbWVvdXQoZnVuY3Rpb24oKSB7XG4gICAgICogICAgICAgICAgICAgLy8gdGhlbiBkbyBhbm90aGVyIGFzeW5jIHRhc2tcbiAgICAgKiAgICAgICAgICAgICBjYWxsYmFjayhudWxsLCAndHdvJyk7XG4gICAgICogICAgICAgICB9LCAxMDApO1xuICAgICAqICAgICB9XG4gICAgICogXSwgZnVuY3Rpb24oZXJyLCByZXN1bHRzKSB7XG4gICAgICogICAgIGNvbnNvbGUubG9nKHJlc3VsdHMpO1xuICAgICAqICAgICAvLyByZXN1bHRzIGlzIGVxdWFsIHRvIFsnb25lJywndHdvJ11cbiAgICAgKiB9KTtcbiAgICAgKlxuICAgICAqIC8vIGFuIGV4YW1wbGUgdXNpbmcgb2JqZWN0cyBpbnN0ZWFkIG9mIGFycmF5c1xuICAgICAqIGFzeW5jLnNlcmllcyh7XG4gICAgICogICAgIG9uZTogZnVuY3Rpb24oY2FsbGJhY2spIHtcbiAgICAgKiAgICAgICAgIHNldFRpbWVvdXQoZnVuY3Rpb24oKSB7XG4gICAgICogICAgICAgICAgICAgLy8gZG8gc29tZSBhc3luYyB0YXNrXG4gICAgICogICAgICAgICAgICAgY2FsbGJhY2sobnVsbCwgMSk7XG4gICAgICogICAgICAgICB9LCAyMDApO1xuICAgICAqICAgICB9LFxuICAgICAqICAgICB0d286IGZ1bmN0aW9uKGNhbGxiYWNrKSB7XG4gICAgICogICAgICAgICBzZXRUaW1lb3V0KGZ1bmN0aW9uKCkge1xuICAgICAqICAgICAgICAgICAgIC8vIHRoZW4gZG8gYW5vdGhlciBhc3luYyB0YXNrXG4gICAgICogICAgICAgICAgICAgY2FsbGJhY2sobnVsbCwgMik7XG4gICAgICogICAgICAgICB9LCAxMDApO1xuICAgICAqICAgICB9XG4gICAgICogfSwgZnVuY3Rpb24oZXJyLCByZXN1bHRzKSB7XG4gICAgICogICAgIGNvbnNvbGUubG9nKHJlc3VsdHMpO1xuICAgICAqICAgICAvLyByZXN1bHRzIGlzIGVxdWFsIHRvOiB7IG9uZTogMSwgdHdvOiAyIH1cbiAgICAgKiB9KTtcbiAgICAgKlxuICAgICAqIC8vVXNpbmcgUHJvbWlzZXNcbiAgICAgKiBhc3luYy5zZXJpZXMoW1xuICAgICAqICAgICBmdW5jdGlvbihjYWxsYmFjaykge1xuICAgICAqICAgICAgICAgc2V0VGltZW91dChmdW5jdGlvbigpIHtcbiAgICAgKiAgICAgICAgICAgICBjYWxsYmFjayhudWxsLCAnb25lJyk7XG4gICAgICogICAgICAgICB9LCAyMDApO1xuICAgICAqICAgICB9LFxuICAgICAqICAgICBmdW5jdGlvbihjYWxsYmFjaykge1xuICAgICAqICAgICAgICAgc2V0VGltZW91dChmdW5jdGlvbigpIHtcbiAgICAgKiAgICAgICAgICAgICBjYWxsYmFjayhudWxsLCAndHdvJyk7XG4gICAgICogICAgICAgICB9LCAxMDApO1xuICAgICAqICAgICB9XG4gICAgICogXSkudGhlbihyZXN1bHRzID0+IHtcbiAgICAgKiAgICAgY29uc29sZS5sb2cocmVzdWx0cyk7XG4gICAgICogICAgIC8vIHJlc3VsdHMgaXMgZXF1YWwgdG8gWydvbmUnLCd0d28nXVxuICAgICAqIH0pLmNhdGNoKGVyciA9PiB7XG4gICAgICogICAgIGNvbnNvbGUubG9nKGVycik7XG4gICAgICogfSk7XG4gICAgICpcbiAgICAgKiAvLyBhbiBleGFtcGxlIHVzaW5nIGFuIG9iamVjdCBpbnN0ZWFkIG9mIGFuIGFycmF5XG4gICAgICogYXN5bmMuc2VyaWVzKHtcbiAgICAgKiAgICAgb25lOiBmdW5jdGlvbihjYWxsYmFjaykge1xuICAgICAqICAgICAgICAgc2V0VGltZW91dChmdW5jdGlvbigpIHtcbiAgICAgKiAgICAgICAgICAgICAvLyBkbyBzb21lIGFzeW5jIHRhc2tcbiAgICAgKiAgICAgICAgICAgICBjYWxsYmFjayhudWxsLCAxKTtcbiAgICAgKiAgICAgICAgIH0sIDIwMCk7XG4gICAgICogICAgIH0sXG4gICAgICogICAgIHR3bzogZnVuY3Rpb24oY2FsbGJhY2spIHtcbiAgICAgKiAgICAgICAgIHNldFRpbWVvdXQoZnVuY3Rpb24oKSB7XG4gICAgICogICAgICAgICAgICAgLy8gdGhlbiBkbyBhbm90aGVyIGFzeW5jIHRhc2tcbiAgICAgKiAgICAgICAgICAgICBjYWxsYmFjayhudWxsLCAyKTtcbiAgICAgKiAgICAgICAgIH0sIDEwMCk7XG4gICAgICogICAgIH1cbiAgICAgKiB9KS50aGVuKHJlc3VsdHMgPT4ge1xuICAgICAqICAgICBjb25zb2xlLmxvZyhyZXN1bHRzKTtcbiAgICAgKiAgICAgLy8gcmVzdWx0cyBpcyBlcXVhbCB0bzogeyBvbmU6IDEsIHR3bzogMiB9XG4gICAgICogfSkuY2F0Y2goZXJyID0+IHtcbiAgICAgKiAgICAgY29uc29sZS5sb2coZXJyKTtcbiAgICAgKiB9KTtcbiAgICAgKlxuICAgICAqIC8vVXNpbmcgYXN5bmMvYXdhaXRcbiAgICAgKiBhc3luYyAoKSA9PiB7XG4gICAgICogICAgIHRyeSB7XG4gICAgICogICAgICAgICBsZXQgcmVzdWx0cyA9IGF3YWl0IGFzeW5jLnNlcmllcyhbXG4gICAgICogICAgICAgICAgICAgZnVuY3Rpb24oY2FsbGJhY2spIHtcbiAgICAgKiAgICAgICAgICAgICAgICAgc2V0VGltZW91dChmdW5jdGlvbigpIHtcbiAgICAgKiAgICAgICAgICAgICAgICAgICAgIC8vIGRvIHNvbWUgYXN5bmMgdGFza1xuICAgICAqICAgICAgICAgICAgICAgICAgICAgY2FsbGJhY2sobnVsbCwgJ29uZScpO1xuICAgICAqICAgICAgICAgICAgICAgICB9LCAyMDApO1xuICAgICAqICAgICAgICAgICAgIH0sXG4gICAgICogICAgICAgICAgICAgZnVuY3Rpb24oY2FsbGJhY2spIHtcbiAgICAgKiAgICAgICAgICAgICAgICAgc2V0VGltZW91dChmdW5jdGlvbigpIHtcbiAgICAgKiAgICAgICAgICAgICAgICAgICAgIC8vIHRoZW4gZG8gYW5vdGhlciBhc3luYyB0YXNrXG4gICAgICogICAgICAgICAgICAgICAgICAgICBjYWxsYmFjayhudWxsLCAndHdvJyk7XG4gICAgICogICAgICAgICAgICAgICAgIH0sIDEwMCk7XG4gICAgICogICAgICAgICAgICAgfVxuICAgICAqICAgICAgICAgXSk7XG4gICAgICogICAgICAgICBjb25zb2xlLmxvZyhyZXN1bHRzKTtcbiAgICAgKiAgICAgICAgIC8vIHJlc3VsdHMgaXMgZXF1YWwgdG8gWydvbmUnLCd0d28nXVxuICAgICAqICAgICB9XG4gICAgICogICAgIGNhdGNoIChlcnIpIHtcbiAgICAgKiAgICAgICAgIGNvbnNvbGUubG9nKGVycik7XG4gICAgICogICAgIH1cbiAgICAgKiB9XG4gICAgICpcbiAgICAgKiAvLyBhbiBleGFtcGxlIHVzaW5nIGFuIG9iamVjdCBpbnN0ZWFkIG9mIGFuIGFycmF5XG4gICAgICogYXN5bmMgKCkgPT4ge1xuICAgICAqICAgICB0cnkge1xuICAgICAqICAgICAgICAgbGV0IHJlc3VsdHMgPSBhd2FpdCBhc3luYy5wYXJhbGxlbCh7XG4gICAgICogICAgICAgICAgICAgb25lOiBmdW5jdGlvbihjYWxsYmFjaykge1xuICAgICAqICAgICAgICAgICAgICAgICBzZXRUaW1lb3V0KGZ1bmN0aW9uKCkge1xuICAgICAqICAgICAgICAgICAgICAgICAgICAgLy8gZG8gc29tZSBhc3luYyB0YXNrXG4gICAgICogICAgICAgICAgICAgICAgICAgICBjYWxsYmFjayhudWxsLCAxKTtcbiAgICAgKiAgICAgICAgICAgICAgICAgfSwgMjAwKTtcbiAgICAgKiAgICAgICAgICAgICB9LFxuICAgICAqICAgICAgICAgICAgdHdvOiBmdW5jdGlvbihjYWxsYmFjaykge1xuICAgICAqICAgICAgICAgICAgICAgICBzZXRUaW1lb3V0KGZ1bmN0aW9uKCkge1xuICAgICAqICAgICAgICAgICAgICAgICAgICAgLy8gdGhlbiBkbyBhbm90aGVyIGFzeW5jIHRhc2tcbiAgICAgKiAgICAgICAgICAgICAgICAgICAgIGNhbGxiYWNrKG51bGwsIDIpO1xuICAgICAqICAgICAgICAgICAgICAgICB9LCAxMDApO1xuICAgICAqICAgICAgICAgICAgfVxuICAgICAqICAgICAgICAgfSk7XG4gICAgICogICAgICAgICBjb25zb2xlLmxvZyhyZXN1bHRzKTtcbiAgICAgKiAgICAgICAgIC8vIHJlc3VsdHMgaXMgZXF1YWwgdG86IHsgb25lOiAxLCB0d286IDIgfVxuICAgICAqICAgICB9XG4gICAgICogICAgIGNhdGNoIChlcnIpIHtcbiAgICAgKiAgICAgICAgIGNvbnNvbGUubG9nKGVycik7XG4gICAgICogICAgIH1cbiAgICAgKiB9XG4gICAgICpcbiAgICAgKi9cbiAgICBmdW5jdGlvbiBzZXJpZXModGFza3MsIGNhbGxiYWNrKSB7XG4gICAgICAgIHJldHVybiBfcGFyYWxsZWwoZWFjaE9mU2VyaWVzJDEsIHRhc2tzLCBjYWxsYmFjayk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogUmV0dXJucyBgdHJ1ZWAgaWYgYXQgbGVhc3Qgb25lIGVsZW1lbnQgaW4gdGhlIGBjb2xsYCBzYXRpc2ZpZXMgYW4gYXN5bmMgdGVzdC5cbiAgICAgKiBJZiBhbnkgaXRlcmF0ZWUgY2FsbCByZXR1cm5zIGB0cnVlYCwgdGhlIG1haW4gYGNhbGxiYWNrYCBpcyBpbW1lZGlhdGVseVxuICAgICAqIGNhbGxlZC5cbiAgICAgKlxuICAgICAqIEBuYW1lIHNvbWVcbiAgICAgKiBAc3RhdGljXG4gICAgICogQG1lbWJlck9mIG1vZHVsZTpDb2xsZWN0aW9uc1xuICAgICAqIEBtZXRob2RcbiAgICAgKiBAYWxpYXMgYW55XG4gICAgICogQGNhdGVnb3J5IENvbGxlY3Rpb25cbiAgICAgKiBAcGFyYW0ge0FycmF5fEl0ZXJhYmxlfEFzeW5jSXRlcmFibGV8T2JqZWN0fSBjb2xsIC0gQSBjb2xsZWN0aW9uIHRvIGl0ZXJhdGUgb3Zlci5cbiAgICAgKiBAcGFyYW0ge0FzeW5jRnVuY3Rpb259IGl0ZXJhdGVlIC0gQW4gYXN5bmMgdHJ1dGggdGVzdCB0byBhcHBseSB0byBlYWNoIGl0ZW1cbiAgICAgKiBpbiB0aGUgY29sbGVjdGlvbnMgaW4gcGFyYWxsZWwuXG4gICAgICogVGhlIGl0ZXJhdGVlIHNob3VsZCBjb21wbGV0ZSB3aXRoIGEgYm9vbGVhbiBgcmVzdWx0YCB2YWx1ZS5cbiAgICAgKiBJbnZva2VkIHdpdGggKGl0ZW0sIGNhbGxiYWNrKS5cbiAgICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBbY2FsbGJhY2tdIC0gQSBjYWxsYmFjayB3aGljaCBpcyBjYWxsZWQgYXMgc29vbiBhcyBhbnlcbiAgICAgKiBpdGVyYXRlZSByZXR1cm5zIGB0cnVlYCwgb3IgYWZ0ZXIgYWxsIHRoZSBpdGVyYXRlZSBmdW5jdGlvbnMgaGF2ZSBmaW5pc2hlZC5cbiAgICAgKiBSZXN1bHQgd2lsbCBiZSBlaXRoZXIgYHRydWVgIG9yIGBmYWxzZWAgZGVwZW5kaW5nIG9uIHRoZSB2YWx1ZXMgb2YgdGhlIGFzeW5jXG4gICAgICogdGVzdHMuIEludm9rZWQgd2l0aCAoZXJyLCByZXN1bHQpLlxuICAgICAqIEByZXR1cm5zIHtQcm9taXNlfSBhIHByb21pc2UsIGlmIG5vIGNhbGxiYWNrIHByb3ZpZGVkXG4gICAgICogQGV4YW1wbGVcbiAgICAgKlxuICAgICAqIC8vIGRpcjEgaXMgYSBkaXJlY3RvcnkgdGhhdCBjb250YWlucyBmaWxlMS50eHQsIGZpbGUyLnR4dFxuICAgICAqIC8vIGRpcjIgaXMgYSBkaXJlY3RvcnkgdGhhdCBjb250YWlucyBmaWxlMy50eHQsIGZpbGU0LnR4dFxuICAgICAqIC8vIGRpcjMgaXMgYSBkaXJlY3RvcnkgdGhhdCBjb250YWlucyBmaWxlNS50eHRcbiAgICAgKiAvLyBkaXI0IGRvZXMgbm90IGV4aXN0XG4gICAgICpcbiAgICAgKiAvLyBhc3luY2hyb25vdXMgZnVuY3Rpb24gdGhhdCBjaGVja3MgaWYgYSBmaWxlIGV4aXN0c1xuICAgICAqIGZ1bmN0aW9uIGZpbGVFeGlzdHMoZmlsZSwgY2FsbGJhY2spIHtcbiAgICAgKiAgICBmcy5hY2Nlc3MoZmlsZSwgZnMuY29uc3RhbnRzLkZfT0ssIChlcnIpID0+IHtcbiAgICAgKiAgICAgICAgY2FsbGJhY2sobnVsbCwgIWVycik7XG4gICAgICogICAgfSk7XG4gICAgICogfVxuICAgICAqXG4gICAgICogLy8gVXNpbmcgY2FsbGJhY2tzXG4gICAgICogYXN5bmMuc29tZShbJ2RpcjEvbWlzc2luZy50eHQnLCdkaXIyL21pc3NpbmcudHh0JywnZGlyMy9maWxlNS50eHQnXSwgZmlsZUV4aXN0cyxcbiAgICAgKiAgICBmdW5jdGlvbihlcnIsIHJlc3VsdCkge1xuICAgICAqICAgICAgICBjb25zb2xlLmxvZyhyZXN1bHQpO1xuICAgICAqICAgICAgICAvLyB0cnVlXG4gICAgICogICAgICAgIC8vIHJlc3VsdCBpcyB0cnVlIHNpbmNlIHNvbWUgZmlsZSBpbiB0aGUgbGlzdCBleGlzdHNcbiAgICAgKiAgICB9XG4gICAgICopO1xuICAgICAqXG4gICAgICogYXN5bmMuc29tZShbJ2RpcjEvbWlzc2luZy50eHQnLCdkaXIyL21pc3NpbmcudHh0JywnZGlyNC9taXNzaW5nLnR4dCddLCBmaWxlRXhpc3RzLFxuICAgICAqICAgIGZ1bmN0aW9uKGVyciwgcmVzdWx0KSB7XG4gICAgICogICAgICAgIGNvbnNvbGUubG9nKHJlc3VsdCk7XG4gICAgICogICAgICAgIC8vIGZhbHNlXG4gICAgICogICAgICAgIC8vIHJlc3VsdCBpcyBmYWxzZSBzaW5jZSBub25lIG9mIHRoZSBmaWxlcyBleGlzdHNcbiAgICAgKiAgICB9XG4gICAgICopO1xuICAgICAqXG4gICAgICogLy8gVXNpbmcgUHJvbWlzZXNcbiAgICAgKiBhc3luYy5zb21lKFsnZGlyMS9taXNzaW5nLnR4dCcsJ2RpcjIvbWlzc2luZy50eHQnLCdkaXIzL2ZpbGU1LnR4dCddLCBmaWxlRXhpc3RzKVxuICAgICAqIC50aGVuKCByZXN1bHQgPT4ge1xuICAgICAqICAgICBjb25zb2xlLmxvZyhyZXN1bHQpO1xuICAgICAqICAgICAvLyB0cnVlXG4gICAgICogICAgIC8vIHJlc3VsdCBpcyB0cnVlIHNpbmNlIHNvbWUgZmlsZSBpbiB0aGUgbGlzdCBleGlzdHNcbiAgICAgKiB9KS5jYXRjaCggZXJyID0+IHtcbiAgICAgKiAgICAgY29uc29sZS5sb2coZXJyKTtcbiAgICAgKiB9KTtcbiAgICAgKlxuICAgICAqIGFzeW5jLnNvbWUoWydkaXIxL21pc3NpbmcudHh0JywnZGlyMi9taXNzaW5nLnR4dCcsJ2RpcjQvbWlzc2luZy50eHQnXSwgZmlsZUV4aXN0cylcbiAgICAgKiAudGhlbiggcmVzdWx0ID0+IHtcbiAgICAgKiAgICAgY29uc29sZS5sb2cocmVzdWx0KTtcbiAgICAgKiAgICAgLy8gZmFsc2VcbiAgICAgKiAgICAgLy8gcmVzdWx0IGlzIGZhbHNlIHNpbmNlIG5vbmUgb2YgdGhlIGZpbGVzIGV4aXN0c1xuICAgICAqIH0pLmNhdGNoKCBlcnIgPT4ge1xuICAgICAqICAgICBjb25zb2xlLmxvZyhlcnIpO1xuICAgICAqIH0pO1xuICAgICAqXG4gICAgICogLy8gVXNpbmcgYXN5bmMvYXdhaXRcbiAgICAgKiBhc3luYyAoKSA9PiB7XG4gICAgICogICAgIHRyeSB7XG4gICAgICogICAgICAgICBsZXQgcmVzdWx0ID0gYXdhaXQgYXN5bmMuc29tZShbJ2RpcjEvbWlzc2luZy50eHQnLCdkaXIyL21pc3NpbmcudHh0JywnZGlyMy9maWxlNS50eHQnXSwgZmlsZUV4aXN0cyk7XG4gICAgICogICAgICAgICBjb25zb2xlLmxvZyhyZXN1bHQpO1xuICAgICAqICAgICAgICAgLy8gdHJ1ZVxuICAgICAqICAgICAgICAgLy8gcmVzdWx0IGlzIHRydWUgc2luY2Ugc29tZSBmaWxlIGluIHRoZSBsaXN0IGV4aXN0c1xuICAgICAqICAgICB9XG4gICAgICogICAgIGNhdGNoIChlcnIpIHtcbiAgICAgKiAgICAgICAgIGNvbnNvbGUubG9nKGVycik7XG4gICAgICogICAgIH1cbiAgICAgKiB9XG4gICAgICpcbiAgICAgKiBhc3luYyAoKSA9PiB7XG4gICAgICogICAgIHRyeSB7XG4gICAgICogICAgICAgICBsZXQgcmVzdWx0ID0gYXdhaXQgYXN5bmMuc29tZShbJ2RpcjEvbWlzc2luZy50eHQnLCdkaXIyL21pc3NpbmcudHh0JywnZGlyNC9taXNzaW5nLnR4dCddLCBmaWxlRXhpc3RzKTtcbiAgICAgKiAgICAgICAgIGNvbnNvbGUubG9nKHJlc3VsdCk7XG4gICAgICogICAgICAgICAvLyBmYWxzZVxuICAgICAqICAgICAgICAgLy8gcmVzdWx0IGlzIGZhbHNlIHNpbmNlIG5vbmUgb2YgdGhlIGZpbGVzIGV4aXN0c1xuICAgICAqICAgICB9XG4gICAgICogICAgIGNhdGNoIChlcnIpIHtcbiAgICAgKiAgICAgICAgIGNvbnNvbGUubG9nKGVycik7XG4gICAgICogICAgIH1cbiAgICAgKiB9XG4gICAgICpcbiAgICAgKi9cbiAgICBmdW5jdGlvbiBzb21lKGNvbGwsIGl0ZXJhdGVlLCBjYWxsYmFjaykge1xuICAgICAgICByZXR1cm4gX2NyZWF0ZVRlc3RlcihCb29sZWFuLCByZXMgPT4gcmVzKShlYWNoT2YkMSwgY29sbCwgaXRlcmF0ZWUsIGNhbGxiYWNrKVxuICAgIH1cbiAgICB2YXIgc29tZSQxID0gYXdhaXRpZnkoc29tZSwgMyk7XG5cbiAgICAvKipcbiAgICAgKiBUaGUgc2FtZSBhcyBbYHNvbWVgXXtAbGluayBtb2R1bGU6Q29sbGVjdGlvbnMuc29tZX0gYnV0IHJ1bnMgYSBtYXhpbXVtIG9mIGBsaW1pdGAgYXN5bmMgb3BlcmF0aW9ucyBhdCBhIHRpbWUuXG4gICAgICpcbiAgICAgKiBAbmFtZSBzb21lTGltaXRcbiAgICAgKiBAc3RhdGljXG4gICAgICogQG1lbWJlck9mIG1vZHVsZTpDb2xsZWN0aW9uc1xuICAgICAqIEBtZXRob2RcbiAgICAgKiBAc2VlIFthc3luYy5zb21lXXtAbGluayBtb2R1bGU6Q29sbGVjdGlvbnMuc29tZX1cbiAgICAgKiBAYWxpYXMgYW55TGltaXRcbiAgICAgKiBAY2F0ZWdvcnkgQ29sbGVjdGlvblxuICAgICAqIEBwYXJhbSB7QXJyYXl8SXRlcmFibGV8QXN5bmNJdGVyYWJsZXxPYmplY3R9IGNvbGwgLSBBIGNvbGxlY3Rpb24gdG8gaXRlcmF0ZSBvdmVyLlxuICAgICAqIEBwYXJhbSB7bnVtYmVyfSBsaW1pdCAtIFRoZSBtYXhpbXVtIG51bWJlciBvZiBhc3luYyBvcGVyYXRpb25zIGF0IGEgdGltZS5cbiAgICAgKiBAcGFyYW0ge0FzeW5jRnVuY3Rpb259IGl0ZXJhdGVlIC0gQW4gYXN5bmMgdHJ1dGggdGVzdCB0byBhcHBseSB0byBlYWNoIGl0ZW1cbiAgICAgKiBpbiB0aGUgY29sbGVjdGlvbnMgaW4gcGFyYWxsZWwuXG4gICAgICogVGhlIGl0ZXJhdGVlIHNob3VsZCBjb21wbGV0ZSB3aXRoIGEgYm9vbGVhbiBgcmVzdWx0YCB2YWx1ZS5cbiAgICAgKiBJbnZva2VkIHdpdGggKGl0ZW0sIGNhbGxiYWNrKS5cbiAgICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBbY2FsbGJhY2tdIC0gQSBjYWxsYmFjayB3aGljaCBpcyBjYWxsZWQgYXMgc29vbiBhcyBhbnlcbiAgICAgKiBpdGVyYXRlZSByZXR1cm5zIGB0cnVlYCwgb3IgYWZ0ZXIgYWxsIHRoZSBpdGVyYXRlZSBmdW5jdGlvbnMgaGF2ZSBmaW5pc2hlZC5cbiAgICAgKiBSZXN1bHQgd2lsbCBiZSBlaXRoZXIgYHRydWVgIG9yIGBmYWxzZWAgZGVwZW5kaW5nIG9uIHRoZSB2YWx1ZXMgb2YgdGhlIGFzeW5jXG4gICAgICogdGVzdHMuIEludm9rZWQgd2l0aCAoZXJyLCByZXN1bHQpLlxuICAgICAqIEByZXR1cm5zIHtQcm9taXNlfSBhIHByb21pc2UsIGlmIG5vIGNhbGxiYWNrIHByb3ZpZGVkXG4gICAgICovXG4gICAgZnVuY3Rpb24gc29tZUxpbWl0KGNvbGwsIGxpbWl0LCBpdGVyYXRlZSwgY2FsbGJhY2spIHtcbiAgICAgICAgcmV0dXJuIF9jcmVhdGVUZXN0ZXIoQm9vbGVhbiwgcmVzID0+IHJlcykoZWFjaE9mTGltaXQkMihsaW1pdCksIGNvbGwsIGl0ZXJhdGVlLCBjYWxsYmFjaylcbiAgICB9XG4gICAgdmFyIHNvbWVMaW1pdCQxID0gYXdhaXRpZnkoc29tZUxpbWl0LCA0KTtcblxuICAgIC8qKlxuICAgICAqIFRoZSBzYW1lIGFzIFtgc29tZWBde0BsaW5rIG1vZHVsZTpDb2xsZWN0aW9ucy5zb21lfSBidXQgcnVucyBvbmx5IGEgc2luZ2xlIGFzeW5jIG9wZXJhdGlvbiBhdCBhIHRpbWUuXG4gICAgICpcbiAgICAgKiBAbmFtZSBzb21lU2VyaWVzXG4gICAgICogQHN0YXRpY1xuICAgICAqIEBtZW1iZXJPZiBtb2R1bGU6Q29sbGVjdGlvbnNcbiAgICAgKiBAbWV0aG9kXG4gICAgICogQHNlZSBbYXN5bmMuc29tZV17QGxpbmsgbW9kdWxlOkNvbGxlY3Rpb25zLnNvbWV9XG4gICAgICogQGFsaWFzIGFueVNlcmllc1xuICAgICAqIEBjYXRlZ29yeSBDb2xsZWN0aW9uXG4gICAgICogQHBhcmFtIHtBcnJheXxJdGVyYWJsZXxBc3luY0l0ZXJhYmxlfE9iamVjdH0gY29sbCAtIEEgY29sbGVjdGlvbiB0byBpdGVyYXRlIG92ZXIuXG4gICAgICogQHBhcmFtIHtBc3luY0Z1bmN0aW9ufSBpdGVyYXRlZSAtIEFuIGFzeW5jIHRydXRoIHRlc3QgdG8gYXBwbHkgdG8gZWFjaCBpdGVtXG4gICAgICogaW4gdGhlIGNvbGxlY3Rpb25zIGluIHNlcmllcy5cbiAgICAgKiBUaGUgaXRlcmF0ZWUgc2hvdWxkIGNvbXBsZXRlIHdpdGggYSBib29sZWFuIGByZXN1bHRgIHZhbHVlLlxuICAgICAqIEludm9rZWQgd2l0aCAoaXRlbSwgY2FsbGJhY2spLlxuICAgICAqIEBwYXJhbSB7RnVuY3Rpb259IFtjYWxsYmFja10gLSBBIGNhbGxiYWNrIHdoaWNoIGlzIGNhbGxlZCBhcyBzb29uIGFzIGFueVxuICAgICAqIGl0ZXJhdGVlIHJldHVybnMgYHRydWVgLCBvciBhZnRlciBhbGwgdGhlIGl0ZXJhdGVlIGZ1bmN0aW9ucyBoYXZlIGZpbmlzaGVkLlxuICAgICAqIFJlc3VsdCB3aWxsIGJlIGVpdGhlciBgdHJ1ZWAgb3IgYGZhbHNlYCBkZXBlbmRpbmcgb24gdGhlIHZhbHVlcyBvZiB0aGUgYXN5bmNcbiAgICAgKiB0ZXN0cy4gSW52b2tlZCB3aXRoIChlcnIsIHJlc3VsdCkuXG4gICAgICogQHJldHVybnMge1Byb21pc2V9IGEgcHJvbWlzZSwgaWYgbm8gY2FsbGJhY2sgcHJvdmlkZWRcbiAgICAgKi9cbiAgICBmdW5jdGlvbiBzb21lU2VyaWVzKGNvbGwsIGl0ZXJhdGVlLCBjYWxsYmFjaykge1xuICAgICAgICByZXR1cm4gX2NyZWF0ZVRlc3RlcihCb29sZWFuLCByZXMgPT4gcmVzKShlYWNoT2ZTZXJpZXMkMSwgY29sbCwgaXRlcmF0ZWUsIGNhbGxiYWNrKVxuICAgIH1cbiAgICB2YXIgc29tZVNlcmllcyQxID0gYXdhaXRpZnkoc29tZVNlcmllcywgMyk7XG5cbiAgICAvKipcbiAgICAgKiBTb3J0cyBhIGxpc3QgYnkgdGhlIHJlc3VsdHMgb2YgcnVubmluZyBlYWNoIGBjb2xsYCB2YWx1ZSB0aHJvdWdoIGFuIGFzeW5jXG4gICAgICogYGl0ZXJhdGVlYC5cbiAgICAgKlxuICAgICAqIEBuYW1lIHNvcnRCeVxuICAgICAqIEBzdGF0aWNcbiAgICAgKiBAbWVtYmVyT2YgbW9kdWxlOkNvbGxlY3Rpb25zXG4gICAgICogQG1ldGhvZFxuICAgICAqIEBjYXRlZ29yeSBDb2xsZWN0aW9uXG4gICAgICogQHBhcmFtIHtBcnJheXxJdGVyYWJsZXxBc3luY0l0ZXJhYmxlfE9iamVjdH0gY29sbCAtIEEgY29sbGVjdGlvbiB0byBpdGVyYXRlIG92ZXIuXG4gICAgICogQHBhcmFtIHtBc3luY0Z1bmN0aW9ufSBpdGVyYXRlZSAtIEFuIGFzeW5jIGZ1bmN0aW9uIHRvIGFwcGx5IHRvIGVhY2ggaXRlbSBpblxuICAgICAqIGBjb2xsYC5cbiAgICAgKiBUaGUgaXRlcmF0ZWUgc2hvdWxkIGNvbXBsZXRlIHdpdGggYSB2YWx1ZSB0byB1c2UgYXMgdGhlIHNvcnQgY3JpdGVyaWEgYXNcbiAgICAgKiBpdHMgYHJlc3VsdGAuXG4gICAgICogSW52b2tlZCB3aXRoIChpdGVtLCBjYWxsYmFjaykuXG4gICAgICogQHBhcmFtIHtGdW5jdGlvbn0gY2FsbGJhY2sgLSBBIGNhbGxiYWNrIHdoaWNoIGlzIGNhbGxlZCBhZnRlciBhbGwgdGhlXG4gICAgICogYGl0ZXJhdGVlYCBmdW5jdGlvbnMgaGF2ZSBmaW5pc2hlZCwgb3IgYW4gZXJyb3Igb2NjdXJzLiBSZXN1bHRzIGlzIHRoZSBpdGVtc1xuICAgICAqIGZyb20gdGhlIG9yaWdpbmFsIGBjb2xsYCBzb3J0ZWQgYnkgdGhlIHZhbHVlcyByZXR1cm5lZCBieSB0aGUgYGl0ZXJhdGVlYFxuICAgICAqIGNhbGxzLiBJbnZva2VkIHdpdGggKGVyciwgcmVzdWx0cykuXG4gICAgICogQHJldHVybnMge1Byb21pc2V9IGEgcHJvbWlzZSwgaWYgbm8gY2FsbGJhY2sgcGFzc2VkXG4gICAgICogQGV4YW1wbGVcbiAgICAgKlxuICAgICAqIC8vIGJpZ2ZpbGUudHh0IGlzIGEgZmlsZSB0aGF0IGlzIDI1MTEwMCBieXRlcyBpbiBzaXplXG4gICAgICogLy8gbWVkaXVtZmlsZS50eHQgaXMgYSBmaWxlIHRoYXQgaXMgMTEwMDAgYnl0ZXMgaW4gc2l6ZVxuICAgICAqIC8vIHNtYWxsZmlsZS50eHQgaXMgYSBmaWxlIHRoYXQgaXMgMTIxIGJ5dGVzIGluIHNpemVcbiAgICAgKlxuICAgICAqIC8vIGFzeW5jaHJvbm91cyBmdW5jdGlvbiB0aGF0IHJldHVybnMgdGhlIGZpbGUgc2l6ZSBpbiBieXRlc1xuICAgICAqIGZ1bmN0aW9uIGdldEZpbGVTaXplSW5CeXRlcyhmaWxlLCBjYWxsYmFjaykge1xuICAgICAqICAgICBmcy5zdGF0KGZpbGUsIGZ1bmN0aW9uKGVyciwgc3RhdCkge1xuICAgICAqICAgICAgICAgaWYgKGVycikge1xuICAgICAqICAgICAgICAgICAgIHJldHVybiBjYWxsYmFjayhlcnIpO1xuICAgICAqICAgICAgICAgfVxuICAgICAqICAgICAgICAgY2FsbGJhY2sobnVsbCwgc3RhdC5zaXplKTtcbiAgICAgKiAgICAgfSk7XG4gICAgICogfVxuICAgICAqXG4gICAgICogLy8gVXNpbmcgY2FsbGJhY2tzXG4gICAgICogYXN5bmMuc29ydEJ5KFsnbWVkaXVtZmlsZS50eHQnLCdzbWFsbGZpbGUudHh0JywnYmlnZmlsZS50eHQnXSwgZ2V0RmlsZVNpemVJbkJ5dGVzLFxuICAgICAqICAgICBmdW5jdGlvbihlcnIsIHJlc3VsdHMpIHtcbiAgICAgKiAgICAgICAgIGlmIChlcnIpIHtcbiAgICAgKiAgICAgICAgICAgICBjb25zb2xlLmxvZyhlcnIpO1xuICAgICAqICAgICAgICAgfSBlbHNlIHtcbiAgICAgKiAgICAgICAgICAgICBjb25zb2xlLmxvZyhyZXN1bHRzKTtcbiAgICAgKiAgICAgICAgICAgICAvLyByZXN1bHRzIGlzIG5vdyB0aGUgb3JpZ2luYWwgYXJyYXkgb2YgZmlsZXMgc29ydGVkIGJ5XG4gICAgICogICAgICAgICAgICAgLy8gZmlsZSBzaXplIChhc2NlbmRpbmcgYnkgZGVmYXVsdCksIGUuZy5cbiAgICAgKiAgICAgICAgICAgICAvLyBbICdzbWFsbGZpbGUudHh0JywgJ21lZGl1bWZpbGUudHh0JywgJ2JpZ2ZpbGUudHh0J11cbiAgICAgKiAgICAgICAgIH1cbiAgICAgKiAgICAgfVxuICAgICAqICk7XG4gICAgICpcbiAgICAgKiAvLyBCeSBtb2RpZnlpbmcgdGhlIGNhbGxiYWNrIHBhcmFtZXRlciB0aGVcbiAgICAgKiAvLyBzb3J0aW5nIG9yZGVyIGNhbiBiZSBpbmZsdWVuY2VkOlxuICAgICAqXG4gICAgICogLy8gYXNjZW5kaW5nIG9yZGVyXG4gICAgICogYXN5bmMuc29ydEJ5KFsnbWVkaXVtZmlsZS50eHQnLCdzbWFsbGZpbGUudHh0JywnYmlnZmlsZS50eHQnXSwgZnVuY3Rpb24oZmlsZSwgY2FsbGJhY2spIHtcbiAgICAgKiAgICAgZ2V0RmlsZVNpemVJbkJ5dGVzKGZpbGUsIGZ1bmN0aW9uKGdldEZpbGVTaXplRXJyLCBmaWxlU2l6ZSkge1xuICAgICAqICAgICAgICAgaWYgKGdldEZpbGVTaXplRXJyKSByZXR1cm4gY2FsbGJhY2soZ2V0RmlsZVNpemVFcnIpO1xuICAgICAqICAgICAgICAgY2FsbGJhY2sobnVsbCwgZmlsZVNpemUpO1xuICAgICAqICAgICB9KTtcbiAgICAgKiB9LCBmdW5jdGlvbihlcnIsIHJlc3VsdHMpIHtcbiAgICAgKiAgICAgICAgIGlmIChlcnIpIHtcbiAgICAgKiAgICAgICAgICAgICBjb25zb2xlLmxvZyhlcnIpO1xuICAgICAqICAgICAgICAgfSBlbHNlIHtcbiAgICAgKiAgICAgICAgICAgICBjb25zb2xlLmxvZyhyZXN1bHRzKTtcbiAgICAgKiAgICAgICAgICAgICAvLyByZXN1bHRzIGlzIG5vdyB0aGUgb3JpZ2luYWwgYXJyYXkgb2YgZmlsZXMgc29ydGVkIGJ5XG4gICAgICogICAgICAgICAgICAgLy8gZmlsZSBzaXplIChhc2NlbmRpbmcgYnkgZGVmYXVsdCksIGUuZy5cbiAgICAgKiAgICAgICAgICAgICAvLyBbICdzbWFsbGZpbGUudHh0JywgJ21lZGl1bWZpbGUudHh0JywgJ2JpZ2ZpbGUudHh0J11cbiAgICAgKiAgICAgICAgIH1cbiAgICAgKiAgICAgfVxuICAgICAqICk7XG4gICAgICpcbiAgICAgKiAvLyBkZXNjZW5kaW5nIG9yZGVyXG4gICAgICogYXN5bmMuc29ydEJ5KFsnYmlnZmlsZS50eHQnLCdtZWRpdW1maWxlLnR4dCcsJ3NtYWxsZmlsZS50eHQnXSwgZnVuY3Rpb24oZmlsZSwgY2FsbGJhY2spIHtcbiAgICAgKiAgICAgZ2V0RmlsZVNpemVJbkJ5dGVzKGZpbGUsIGZ1bmN0aW9uKGdldEZpbGVTaXplRXJyLCBmaWxlU2l6ZSkge1xuICAgICAqICAgICAgICAgaWYgKGdldEZpbGVTaXplRXJyKSB7XG4gICAgICogICAgICAgICAgICAgcmV0dXJuIGNhbGxiYWNrKGdldEZpbGVTaXplRXJyKTtcbiAgICAgKiAgICAgICAgIH1cbiAgICAgKiAgICAgICAgIGNhbGxiYWNrKG51bGwsIGZpbGVTaXplICogLTEpO1xuICAgICAqICAgICB9KTtcbiAgICAgKiB9LCBmdW5jdGlvbihlcnIsIHJlc3VsdHMpIHtcbiAgICAgKiAgICAgICAgIGlmIChlcnIpIHtcbiAgICAgKiAgICAgICAgICAgICBjb25zb2xlLmxvZyhlcnIpO1xuICAgICAqICAgICAgICAgfSBlbHNlIHtcbiAgICAgKiAgICAgICAgICAgICBjb25zb2xlLmxvZyhyZXN1bHRzKTtcbiAgICAgKiAgICAgICAgICAgICAvLyByZXN1bHRzIGlzIG5vdyB0aGUgb3JpZ2luYWwgYXJyYXkgb2YgZmlsZXMgc29ydGVkIGJ5XG4gICAgICogICAgICAgICAgICAgLy8gZmlsZSBzaXplIChhc2NlbmRpbmcgYnkgZGVmYXVsdCksIGUuZy5cbiAgICAgKiAgICAgICAgICAgICAvLyBbICdiaWdmaWxlLnR4dCcsICdtZWRpdW1maWxlLnR4dCcsICdzbWFsbGZpbGUudHh0J11cbiAgICAgKiAgICAgICAgIH1cbiAgICAgKiAgICAgfVxuICAgICAqICk7XG4gICAgICpcbiAgICAgKiAvLyBFcnJvciBoYW5kbGluZ1xuICAgICAqIGFzeW5jLnNvcnRCeShbJ21lZGl1bWZpbGUudHh0Jywnc21hbGxmaWxlLnR4dCcsJ21pc3NpbmdmaWxlLnR4dCddLCBnZXRGaWxlU2l6ZUluQnl0ZXMsXG4gICAgICogICAgIGZ1bmN0aW9uKGVyciwgcmVzdWx0cykge1xuICAgICAqICAgICAgICAgaWYgKGVycikge1xuICAgICAqICAgICAgICAgICAgIGNvbnNvbGUubG9nKGVycik7XG4gICAgICogICAgICAgICAgICAgLy8gWyBFcnJvcjogRU5PRU5UOiBubyBzdWNoIGZpbGUgb3IgZGlyZWN0b3J5IF1cbiAgICAgKiAgICAgICAgIH0gZWxzZSB7XG4gICAgICogICAgICAgICAgICAgY29uc29sZS5sb2cocmVzdWx0cyk7XG4gICAgICogICAgICAgICB9XG4gICAgICogICAgIH1cbiAgICAgKiApO1xuICAgICAqXG4gICAgICogLy8gVXNpbmcgUHJvbWlzZXNcbiAgICAgKiBhc3luYy5zb3J0QnkoWydtZWRpdW1maWxlLnR4dCcsJ3NtYWxsZmlsZS50eHQnLCdiaWdmaWxlLnR4dCddLCBnZXRGaWxlU2l6ZUluQnl0ZXMpXG4gICAgICogLnRoZW4oIHJlc3VsdHMgPT4ge1xuICAgICAqICAgICBjb25zb2xlLmxvZyhyZXN1bHRzKTtcbiAgICAgKiAgICAgLy8gcmVzdWx0cyBpcyBub3cgdGhlIG9yaWdpbmFsIGFycmF5IG9mIGZpbGVzIHNvcnRlZCBieVxuICAgICAqICAgICAvLyBmaWxlIHNpemUgKGFzY2VuZGluZyBieSBkZWZhdWx0KSwgZS5nLlxuICAgICAqICAgICAvLyBbICdzbWFsbGZpbGUudHh0JywgJ21lZGl1bWZpbGUudHh0JywgJ2JpZ2ZpbGUudHh0J11cbiAgICAgKiB9KS5jYXRjaCggZXJyID0+IHtcbiAgICAgKiAgICAgY29uc29sZS5sb2coZXJyKTtcbiAgICAgKiB9KTtcbiAgICAgKlxuICAgICAqIC8vIEVycm9yIGhhbmRsaW5nXG4gICAgICogYXN5bmMuc29ydEJ5KFsnbWVkaXVtZmlsZS50eHQnLCdzbWFsbGZpbGUudHh0JywnbWlzc2luZ2ZpbGUudHh0J10sIGdldEZpbGVTaXplSW5CeXRlcylcbiAgICAgKiAudGhlbiggcmVzdWx0cyA9PiB7XG4gICAgICogICAgIGNvbnNvbGUubG9nKHJlc3VsdHMpO1xuICAgICAqIH0pLmNhdGNoKCBlcnIgPT4ge1xuICAgICAqICAgICBjb25zb2xlLmxvZyhlcnIpO1xuICAgICAqICAgICAvLyBbIEVycm9yOiBFTk9FTlQ6IG5vIHN1Y2ggZmlsZSBvciBkaXJlY3RvcnkgXVxuICAgICAqIH0pO1xuICAgICAqXG4gICAgICogLy8gVXNpbmcgYXN5bmMvYXdhaXRcbiAgICAgKiAoYXN5bmMgKCkgPT4ge1xuICAgICAqICAgICB0cnkge1xuICAgICAqICAgICAgICAgbGV0IHJlc3VsdHMgPSBhd2FpdCBhc3luYy5zb3J0QnkoWydiaWdmaWxlLnR4dCcsJ21lZGl1bWZpbGUudHh0Jywnc21hbGxmaWxlLnR4dCddLCBnZXRGaWxlU2l6ZUluQnl0ZXMpO1xuICAgICAqICAgICAgICAgY29uc29sZS5sb2cocmVzdWx0cyk7XG4gICAgICogICAgICAgICAvLyByZXN1bHRzIGlzIG5vdyB0aGUgb3JpZ2luYWwgYXJyYXkgb2YgZmlsZXMgc29ydGVkIGJ5XG4gICAgICogICAgICAgICAvLyBmaWxlIHNpemUgKGFzY2VuZGluZyBieSBkZWZhdWx0KSwgZS5nLlxuICAgICAqICAgICAgICAgLy8gWyAnc21hbGxmaWxlLnR4dCcsICdtZWRpdW1maWxlLnR4dCcsICdiaWdmaWxlLnR4dCddXG4gICAgICogICAgIH1cbiAgICAgKiAgICAgY2F0Y2ggKGVycikge1xuICAgICAqICAgICAgICAgY29uc29sZS5sb2coZXJyKTtcbiAgICAgKiAgICAgfVxuICAgICAqIH0pKCk7XG4gICAgICpcbiAgICAgKiAvLyBFcnJvciBoYW5kbGluZ1xuICAgICAqIGFzeW5jICgpID0+IHtcbiAgICAgKiAgICAgdHJ5IHtcbiAgICAgKiAgICAgICAgIGxldCByZXN1bHRzID0gYXdhaXQgYXN5bmMuc29ydEJ5KFsnbWlzc2luZ2ZpbGUudHh0JywnbWVkaXVtZmlsZS50eHQnLCdzbWFsbGZpbGUudHh0J10sIGdldEZpbGVTaXplSW5CeXRlcyk7XG4gICAgICogICAgICAgICBjb25zb2xlLmxvZyhyZXN1bHRzKTtcbiAgICAgKiAgICAgfVxuICAgICAqICAgICBjYXRjaCAoZXJyKSB7XG4gICAgICogICAgICAgICBjb25zb2xlLmxvZyhlcnIpO1xuICAgICAqICAgICAgICAgLy8gWyBFcnJvcjogRU5PRU5UOiBubyBzdWNoIGZpbGUgb3IgZGlyZWN0b3J5IF1cbiAgICAgKiAgICAgfVxuICAgICAqIH1cbiAgICAgKlxuICAgICAqL1xuICAgIGZ1bmN0aW9uIHNvcnRCeSAoY29sbCwgaXRlcmF0ZWUsIGNhbGxiYWNrKSB7XG4gICAgICAgIHZhciBfaXRlcmF0ZWUgPSB3cmFwQXN5bmMoaXRlcmF0ZWUpO1xuICAgICAgICByZXR1cm4gbWFwJDEoY29sbCwgKHgsIGl0ZXJDYikgPT4ge1xuICAgICAgICAgICAgX2l0ZXJhdGVlKHgsIChlcnIsIGNyaXRlcmlhKSA9PiB7XG4gICAgICAgICAgICAgICAgaWYgKGVycikgcmV0dXJuIGl0ZXJDYihlcnIpO1xuICAgICAgICAgICAgICAgIGl0ZXJDYihlcnIsIHt2YWx1ZTogeCwgY3JpdGVyaWF9KTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9LCAoZXJyLCByZXN1bHRzKSA9PiB7XG4gICAgICAgICAgICBpZiAoZXJyKSByZXR1cm4gY2FsbGJhY2soZXJyKTtcbiAgICAgICAgICAgIGNhbGxiYWNrKG51bGwsIHJlc3VsdHMuc29ydChjb21wYXJhdG9yKS5tYXAodiA9PiB2LnZhbHVlKSk7XG4gICAgICAgIH0pO1xuXG4gICAgICAgIGZ1bmN0aW9uIGNvbXBhcmF0b3IobGVmdCwgcmlnaHQpIHtcbiAgICAgICAgICAgIHZhciBhID0gbGVmdC5jcml0ZXJpYSwgYiA9IHJpZ2h0LmNyaXRlcmlhO1xuICAgICAgICAgICAgcmV0dXJuIGEgPCBiID8gLTEgOiBhID4gYiA/IDEgOiAwO1xuICAgICAgICB9XG4gICAgfVxuICAgIHZhciBzb3J0QnkkMSA9IGF3YWl0aWZ5KHNvcnRCeSwgMyk7XG5cbiAgICAvKipcbiAgICAgKiBTZXRzIGEgdGltZSBsaW1pdCBvbiBhbiBhc3luY2hyb25vdXMgZnVuY3Rpb24uIElmIHRoZSBmdW5jdGlvbiBkb2VzIG5vdCBjYWxsXG4gICAgICogaXRzIGNhbGxiYWNrIHdpdGhpbiB0aGUgc3BlY2lmaWVkIG1pbGxpc2Vjb25kcywgaXQgd2lsbCBiZSBjYWxsZWQgd2l0aCBhXG4gICAgICogdGltZW91dCBlcnJvci4gVGhlIGNvZGUgcHJvcGVydHkgZm9yIHRoZSBlcnJvciBvYmplY3Qgd2lsbCBiZSBgJ0VUSU1FRE9VVCdgLlxuICAgICAqXG4gICAgICogQG5hbWUgdGltZW91dFxuICAgICAqIEBzdGF0aWNcbiAgICAgKiBAbWVtYmVyT2YgbW9kdWxlOlV0aWxzXG4gICAgICogQG1ldGhvZFxuICAgICAqIEBjYXRlZ29yeSBVdGlsXG4gICAgICogQHBhcmFtIHtBc3luY0Z1bmN0aW9ufSBhc3luY0ZuIC0gVGhlIGFzeW5jIGZ1bmN0aW9uIHRvIGxpbWl0IGluIHRpbWUuXG4gICAgICogQHBhcmFtIHtudW1iZXJ9IG1pbGxpc2Vjb25kcyAtIFRoZSBzcGVjaWZpZWQgdGltZSBsaW1pdC5cbiAgICAgKiBAcGFyYW0geyp9IFtpbmZvXSAtIEFueSB2YXJpYWJsZSB5b3Ugd2FudCBhdHRhY2hlZCAoYHN0cmluZ2AsIGBvYmplY3RgLCBldGMpXG4gICAgICogdG8gdGltZW91dCBFcnJvciBmb3IgbW9yZSBpbmZvcm1hdGlvbi4uXG4gICAgICogQHJldHVybnMge0FzeW5jRnVuY3Rpb259IFJldHVybnMgYSB3cmFwcGVkIGZ1bmN0aW9uIHRoYXQgY2FuIGJlIHVzZWQgd2l0aCBhbnlcbiAgICAgKiBvZiB0aGUgY29udHJvbCBmbG93IGZ1bmN0aW9ucy5cbiAgICAgKiBJbnZva2UgdGhpcyBmdW5jdGlvbiB3aXRoIHRoZSBzYW1lIHBhcmFtZXRlcnMgYXMgeW91IHdvdWxkIGBhc3luY0Z1bmNgLlxuICAgICAqIEBleGFtcGxlXG4gICAgICpcbiAgICAgKiBmdW5jdGlvbiBteUZ1bmN0aW9uKGZvbywgY2FsbGJhY2spIHtcbiAgICAgKiAgICAgZG9Bc3luY1Rhc2soZm9vLCBmdW5jdGlvbihlcnIsIGRhdGEpIHtcbiAgICAgKiAgICAgICAgIC8vIGhhbmRsZSBlcnJvcnNcbiAgICAgKiAgICAgICAgIGlmIChlcnIpIHJldHVybiBjYWxsYmFjayhlcnIpO1xuICAgICAqXG4gICAgICogICAgICAgICAvLyBkbyBzb21lIHN0dWZmIC4uLlxuICAgICAqXG4gICAgICogICAgICAgICAvLyByZXR1cm4gcHJvY2Vzc2VkIGRhdGFcbiAgICAgKiAgICAgICAgIHJldHVybiBjYWxsYmFjayhudWxsLCBkYXRhKTtcbiAgICAgKiAgICAgfSk7XG4gICAgICogfVxuICAgICAqXG4gICAgICogdmFyIHdyYXBwZWQgPSBhc3luYy50aW1lb3V0KG15RnVuY3Rpb24sIDEwMDApO1xuICAgICAqXG4gICAgICogLy8gY2FsbCBgd3JhcHBlZGAgYXMgeW91IHdvdWxkIGBteUZ1bmN0aW9uYFxuICAgICAqIHdyYXBwZWQoeyBiYXI6ICdiYXInIH0sIGZ1bmN0aW9uKGVyciwgZGF0YSkge1xuICAgICAqICAgICAvLyBpZiBgbXlGdW5jdGlvbmAgdGFrZXMgPCAxMDAwIG1zIHRvIGV4ZWN1dGUsIGBlcnJgXG4gICAgICogICAgIC8vIGFuZCBgZGF0YWAgd2lsbCBoYXZlIHRoZWlyIGV4cGVjdGVkIHZhbHVlc1xuICAgICAqXG4gICAgICogICAgIC8vIGVsc2UgYGVycmAgd2lsbCBiZSBhbiBFcnJvciB3aXRoIHRoZSBjb2RlICdFVElNRURPVVQnXG4gICAgICogfSk7XG4gICAgICovXG4gICAgZnVuY3Rpb24gdGltZW91dChhc3luY0ZuLCBtaWxsaXNlY29uZHMsIGluZm8pIHtcbiAgICAgICAgdmFyIGZuID0gd3JhcEFzeW5jKGFzeW5jRm4pO1xuXG4gICAgICAgIHJldHVybiBpbml0aWFsUGFyYW1zKChhcmdzLCBjYWxsYmFjaykgPT4ge1xuICAgICAgICAgICAgdmFyIHRpbWVkT3V0ID0gZmFsc2U7XG4gICAgICAgICAgICB2YXIgdGltZXI7XG5cbiAgICAgICAgICAgIGZ1bmN0aW9uIHRpbWVvdXRDYWxsYmFjaygpIHtcbiAgICAgICAgICAgICAgICB2YXIgbmFtZSA9IGFzeW5jRm4ubmFtZSB8fCAnYW5vbnltb3VzJztcbiAgICAgICAgICAgICAgICB2YXIgZXJyb3IgID0gbmV3IEVycm9yKCdDYWxsYmFjayBmdW5jdGlvbiBcIicgKyBuYW1lICsgJ1wiIHRpbWVkIG91dC4nKTtcbiAgICAgICAgICAgICAgICBlcnJvci5jb2RlID0gJ0VUSU1FRE9VVCc7XG4gICAgICAgICAgICAgICAgaWYgKGluZm8pIHtcbiAgICAgICAgICAgICAgICAgICAgZXJyb3IuaW5mbyA9IGluZm87XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHRpbWVkT3V0ID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICBjYWxsYmFjayhlcnJvcik7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGFyZ3MucHVzaCgoLi4uY2JBcmdzKSA9PiB7XG4gICAgICAgICAgICAgICAgaWYgKCF0aW1lZE91dCkge1xuICAgICAgICAgICAgICAgICAgICBjYWxsYmFjayguLi5jYkFyZ3MpO1xuICAgICAgICAgICAgICAgICAgICBjbGVhclRpbWVvdXQodGltZXIpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0pO1xuXG4gICAgICAgICAgICAvLyBzZXR1cCB0aW1lciBhbmQgY2FsbCBvcmlnaW5hbCBmdW5jdGlvblxuICAgICAgICAgICAgdGltZXIgPSBzZXRUaW1lb3V0KHRpbWVvdXRDYWxsYmFjaywgbWlsbGlzZWNvbmRzKTtcbiAgICAgICAgICAgIGZuKC4uLmFyZ3MpO1xuICAgICAgICB9KTtcbiAgICB9XG5cbiAgICBmdW5jdGlvbiByYW5nZShzaXplKSB7XG4gICAgICAgIHZhciByZXN1bHQgPSBBcnJheShzaXplKTtcbiAgICAgICAgd2hpbGUgKHNpemUtLSkge1xuICAgICAgICAgICAgcmVzdWx0W3NpemVdID0gc2l6ZTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gcmVzdWx0O1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFRoZSBzYW1lIGFzIFt0aW1lc117QGxpbmsgbW9kdWxlOkNvbnRyb2xGbG93LnRpbWVzfSBidXQgcnVucyBhIG1heGltdW0gb2YgYGxpbWl0YCBhc3luYyBvcGVyYXRpb25zIGF0IGFcbiAgICAgKiB0aW1lLlxuICAgICAqXG4gICAgICogQG5hbWUgdGltZXNMaW1pdFxuICAgICAqIEBzdGF0aWNcbiAgICAgKiBAbWVtYmVyT2YgbW9kdWxlOkNvbnRyb2xGbG93XG4gICAgICogQG1ldGhvZFxuICAgICAqIEBzZWUgW2FzeW5jLnRpbWVzXXtAbGluayBtb2R1bGU6Q29udHJvbEZsb3cudGltZXN9XG4gICAgICogQGNhdGVnb3J5IENvbnRyb2wgRmxvd1xuICAgICAqIEBwYXJhbSB7bnVtYmVyfSBjb3VudCAtIFRoZSBudW1iZXIgb2YgdGltZXMgdG8gcnVuIHRoZSBmdW5jdGlvbi5cbiAgICAgKiBAcGFyYW0ge251bWJlcn0gbGltaXQgLSBUaGUgbWF4aW11bSBudW1iZXIgb2YgYXN5bmMgb3BlcmF0aW9ucyBhdCBhIHRpbWUuXG4gICAgICogQHBhcmFtIHtBc3luY0Z1bmN0aW9ufSBpdGVyYXRlZSAtIFRoZSBhc3luYyBmdW5jdGlvbiB0byBjYWxsIGBuYCB0aW1lcy5cbiAgICAgKiBJbnZva2VkIHdpdGggdGhlIGl0ZXJhdGlvbiBpbmRleCBhbmQgYSBjYWxsYmFjazogKG4sIG5leHQpLlxuICAgICAqIEBwYXJhbSB7RnVuY3Rpb259IGNhbGxiYWNrIC0gc2VlIFthc3luYy5tYXBde0BsaW5rIG1vZHVsZTpDb2xsZWN0aW9ucy5tYXB9LlxuICAgICAqIEByZXR1cm5zIHtQcm9taXNlfSBhIHByb21pc2UsIGlmIG5vIGNhbGxiYWNrIGlzIHByb3ZpZGVkXG4gICAgICovXG4gICAgZnVuY3Rpb24gdGltZXNMaW1pdChjb3VudCwgbGltaXQsIGl0ZXJhdGVlLCBjYWxsYmFjaykge1xuICAgICAgICB2YXIgX2l0ZXJhdGVlID0gd3JhcEFzeW5jKGl0ZXJhdGVlKTtcbiAgICAgICAgcmV0dXJuIG1hcExpbWl0JDEocmFuZ2UoY291bnQpLCBsaW1pdCwgX2l0ZXJhdGVlLCBjYWxsYmFjayk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQ2FsbHMgdGhlIGBpdGVyYXRlZWAgZnVuY3Rpb24gYG5gIHRpbWVzLCBhbmQgYWNjdW11bGF0ZXMgcmVzdWx0cyBpbiB0aGUgc2FtZVxuICAgICAqIG1hbm5lciB5b3Ugd291bGQgdXNlIHdpdGggW21hcF17QGxpbmsgbW9kdWxlOkNvbGxlY3Rpb25zLm1hcH0uXG4gICAgICpcbiAgICAgKiBAbmFtZSB0aW1lc1xuICAgICAqIEBzdGF0aWNcbiAgICAgKiBAbWVtYmVyT2YgbW9kdWxlOkNvbnRyb2xGbG93XG4gICAgICogQG1ldGhvZFxuICAgICAqIEBzZWUgW2FzeW5jLm1hcF17QGxpbmsgbW9kdWxlOkNvbGxlY3Rpb25zLm1hcH1cbiAgICAgKiBAY2F0ZWdvcnkgQ29udHJvbCBGbG93XG4gICAgICogQHBhcmFtIHtudW1iZXJ9IG4gLSBUaGUgbnVtYmVyIG9mIHRpbWVzIHRvIHJ1biB0aGUgZnVuY3Rpb24uXG4gICAgICogQHBhcmFtIHtBc3luY0Z1bmN0aW9ufSBpdGVyYXRlZSAtIFRoZSBhc3luYyBmdW5jdGlvbiB0byBjYWxsIGBuYCB0aW1lcy5cbiAgICAgKiBJbnZva2VkIHdpdGggdGhlIGl0ZXJhdGlvbiBpbmRleCBhbmQgYSBjYWxsYmFjazogKG4sIG5leHQpLlxuICAgICAqIEBwYXJhbSB7RnVuY3Rpb259IGNhbGxiYWNrIC0gc2VlIHtAbGluayBtb2R1bGU6Q29sbGVjdGlvbnMubWFwfS5cbiAgICAgKiBAcmV0dXJucyB7UHJvbWlzZX0gYSBwcm9taXNlLCBpZiBubyBjYWxsYmFjayBpcyBwcm92aWRlZFxuICAgICAqIEBleGFtcGxlXG4gICAgICpcbiAgICAgKiAvLyBQcmV0ZW5kIHRoaXMgaXMgc29tZSBjb21wbGljYXRlZCBhc3luYyBmYWN0b3J5XG4gICAgICogdmFyIGNyZWF0ZVVzZXIgPSBmdW5jdGlvbihpZCwgY2FsbGJhY2spIHtcbiAgICAgKiAgICAgY2FsbGJhY2sobnVsbCwge1xuICAgICAqICAgICAgICAgaWQ6ICd1c2VyJyArIGlkXG4gICAgICogICAgIH0pO1xuICAgICAqIH07XG4gICAgICpcbiAgICAgKiAvLyBnZW5lcmF0ZSA1IHVzZXJzXG4gICAgICogYXN5bmMudGltZXMoNSwgZnVuY3Rpb24obiwgbmV4dCkge1xuICAgICAqICAgICBjcmVhdGVVc2VyKG4sIGZ1bmN0aW9uKGVyciwgdXNlcikge1xuICAgICAqICAgICAgICAgbmV4dChlcnIsIHVzZXIpO1xuICAgICAqICAgICB9KTtcbiAgICAgKiB9LCBmdW5jdGlvbihlcnIsIHVzZXJzKSB7XG4gICAgICogICAgIC8vIHdlIHNob3VsZCBub3cgaGF2ZSA1IHVzZXJzXG4gICAgICogfSk7XG4gICAgICovXG4gICAgZnVuY3Rpb24gdGltZXMgKG4sIGl0ZXJhdGVlLCBjYWxsYmFjaykge1xuICAgICAgICByZXR1cm4gdGltZXNMaW1pdChuLCBJbmZpbml0eSwgaXRlcmF0ZWUsIGNhbGxiYWNrKVxuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFRoZSBzYW1lIGFzIFt0aW1lc117QGxpbmsgbW9kdWxlOkNvbnRyb2xGbG93LnRpbWVzfSBidXQgcnVucyBvbmx5IGEgc2luZ2xlIGFzeW5jIG9wZXJhdGlvbiBhdCBhIHRpbWUuXG4gICAgICpcbiAgICAgKiBAbmFtZSB0aW1lc1Nlcmllc1xuICAgICAqIEBzdGF0aWNcbiAgICAgKiBAbWVtYmVyT2YgbW9kdWxlOkNvbnRyb2xGbG93XG4gICAgICogQG1ldGhvZFxuICAgICAqIEBzZWUgW2FzeW5jLnRpbWVzXXtAbGluayBtb2R1bGU6Q29udHJvbEZsb3cudGltZXN9XG4gICAgICogQGNhdGVnb3J5IENvbnRyb2wgRmxvd1xuICAgICAqIEBwYXJhbSB7bnVtYmVyfSBuIC0gVGhlIG51bWJlciBvZiB0aW1lcyB0byBydW4gdGhlIGZ1bmN0aW9uLlxuICAgICAqIEBwYXJhbSB7QXN5bmNGdW5jdGlvbn0gaXRlcmF0ZWUgLSBUaGUgYXN5bmMgZnVuY3Rpb24gdG8gY2FsbCBgbmAgdGltZXMuXG4gICAgICogSW52b2tlZCB3aXRoIHRoZSBpdGVyYXRpb24gaW5kZXggYW5kIGEgY2FsbGJhY2s6IChuLCBuZXh0KS5cbiAgICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBjYWxsYmFjayAtIHNlZSB7QGxpbmsgbW9kdWxlOkNvbGxlY3Rpb25zLm1hcH0uXG4gICAgICogQHJldHVybnMge1Byb21pc2V9IGEgcHJvbWlzZSwgaWYgbm8gY2FsbGJhY2sgaXMgcHJvdmlkZWRcbiAgICAgKi9cbiAgICBmdW5jdGlvbiB0aW1lc1NlcmllcyAobiwgaXRlcmF0ZWUsIGNhbGxiYWNrKSB7XG4gICAgICAgIHJldHVybiB0aW1lc0xpbWl0KG4sIDEsIGl0ZXJhdGVlLCBjYWxsYmFjaylcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBBIHJlbGF0aXZlIG9mIGByZWR1Y2VgLiAgVGFrZXMgYW4gT2JqZWN0IG9yIEFycmF5LCBhbmQgaXRlcmF0ZXMgb3ZlciBlYWNoXG4gICAgICogZWxlbWVudCBpbiBwYXJhbGxlbCwgZWFjaCBzdGVwIHBvdGVudGlhbGx5IG11dGF0aW5nIGFuIGBhY2N1bXVsYXRvcmAgdmFsdWUuXG4gICAgICogVGhlIHR5cGUgb2YgdGhlIGFjY3VtdWxhdG9yIGRlZmF1bHRzIHRvIHRoZSB0eXBlIG9mIGNvbGxlY3Rpb24gcGFzc2VkIGluLlxuICAgICAqXG4gICAgICogQG5hbWUgdHJhbnNmb3JtXG4gICAgICogQHN0YXRpY1xuICAgICAqIEBtZW1iZXJPZiBtb2R1bGU6Q29sbGVjdGlvbnNcbiAgICAgKiBAbWV0aG9kXG4gICAgICogQGNhdGVnb3J5IENvbGxlY3Rpb25cbiAgICAgKiBAcGFyYW0ge0FycmF5fEl0ZXJhYmxlfEFzeW5jSXRlcmFibGV8T2JqZWN0fSBjb2xsIC0gQSBjb2xsZWN0aW9uIHRvIGl0ZXJhdGUgb3Zlci5cbiAgICAgKiBAcGFyYW0geyp9IFthY2N1bXVsYXRvcl0gLSBUaGUgaW5pdGlhbCBzdGF0ZSBvZiB0aGUgdHJhbnNmb3JtLiAgSWYgb21pdHRlZCxcbiAgICAgKiBpdCB3aWxsIGRlZmF1bHQgdG8gYW4gZW1wdHkgT2JqZWN0IG9yIEFycmF5LCBkZXBlbmRpbmcgb24gdGhlIHR5cGUgb2YgYGNvbGxgXG4gICAgICogQHBhcmFtIHtBc3luY0Z1bmN0aW9ufSBpdGVyYXRlZSAtIEEgZnVuY3Rpb24gYXBwbGllZCB0byBlYWNoIGl0ZW0gaW4gdGhlXG4gICAgICogY29sbGVjdGlvbiB0aGF0IHBvdGVudGlhbGx5IG1vZGlmaWVzIHRoZSBhY2N1bXVsYXRvci5cbiAgICAgKiBJbnZva2VkIHdpdGggKGFjY3VtdWxhdG9yLCBpdGVtLCBrZXksIGNhbGxiYWNrKS5cbiAgICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBbY2FsbGJhY2tdIC0gQSBjYWxsYmFjayB3aGljaCBpcyBjYWxsZWQgYWZ0ZXIgYWxsIHRoZVxuICAgICAqIGBpdGVyYXRlZWAgZnVuY3Rpb25zIGhhdmUgZmluaXNoZWQuIFJlc3VsdCBpcyB0aGUgdHJhbnNmb3JtZWQgYWNjdW11bGF0b3IuXG4gICAgICogSW52b2tlZCB3aXRoIChlcnIsIHJlc3VsdCkuXG4gICAgICogQHJldHVybnMge1Byb21pc2V9IGEgcHJvbWlzZSwgaWYgbm8gY2FsbGJhY2sgcHJvdmlkZWRcbiAgICAgKiBAZXhhbXBsZVxuICAgICAqXG4gICAgICogLy8gZmlsZTEudHh0IGlzIGEgZmlsZSB0aGF0IGlzIDEwMDAgYnl0ZXMgaW4gc2l6ZVxuICAgICAqIC8vIGZpbGUyLnR4dCBpcyBhIGZpbGUgdGhhdCBpcyAyMDAwIGJ5dGVzIGluIHNpemVcbiAgICAgKiAvLyBmaWxlMy50eHQgaXMgYSBmaWxlIHRoYXQgaXMgMzAwMCBieXRlcyBpbiBzaXplXG4gICAgICpcbiAgICAgKiAvLyBoZWxwZXIgZnVuY3Rpb24gdGhhdCByZXR1cm5zIGh1bWFuLXJlYWRhYmxlIHNpemUgZm9ybWF0IGZyb20gYnl0ZXNcbiAgICAgKiBmdW5jdGlvbiBmb3JtYXRCeXRlcyhieXRlcywgZGVjaW1hbHMgPSAyKSB7XG4gICAgICogICAvLyBpbXBsZW1lbnRhdGlvbiBub3QgaW5jbHVkZWQgZm9yIGJyZXZpdHlcbiAgICAgKiAgIHJldHVybiBodW1hblJlYWRibGVGaWxlc2l6ZTtcbiAgICAgKiB9XG4gICAgICpcbiAgICAgKiBjb25zdCBmaWxlTGlzdCA9IFsnZmlsZTEudHh0JywnZmlsZTIudHh0JywnZmlsZTMudHh0J107XG4gICAgICpcbiAgICAgKiAvLyBhc3luY2hyb25vdXMgZnVuY3Rpb24gdGhhdCByZXR1cm5zIHRoZSBmaWxlIHNpemUsIHRyYW5zZm9ybWVkIHRvIGh1bWFuLXJlYWRhYmxlIGZvcm1hdFxuICAgICAqIC8vIGUuZy4gMTAyNCBieXRlcyA9IDFLQiwgMTIzNCBieXRlcyA9IDEuMjEgS0IsIDEwNDg1NzYgYnl0ZXMgPSAxTUIsIGV0Yy5cbiAgICAgKiBmdW5jdGlvbiB0cmFuc2Zvcm1GaWxlU2l6ZShhY2MsIHZhbHVlLCBrZXksIGNhbGxiYWNrKSB7XG4gICAgICogICAgIGZzLnN0YXQodmFsdWUsIGZ1bmN0aW9uKGVyciwgc3RhdCkge1xuICAgICAqICAgICAgICAgaWYgKGVycikge1xuICAgICAqICAgICAgICAgICAgIHJldHVybiBjYWxsYmFjayhlcnIpO1xuICAgICAqICAgICAgICAgfVxuICAgICAqICAgICAgICAgYWNjW2tleV0gPSBmb3JtYXRCeXRlcyhzdGF0LnNpemUpO1xuICAgICAqICAgICAgICAgY2FsbGJhY2sobnVsbCk7XG4gICAgICogICAgIH0pO1xuICAgICAqIH1cbiAgICAgKlxuICAgICAqIC8vIFVzaW5nIGNhbGxiYWNrc1xuICAgICAqIGFzeW5jLnRyYW5zZm9ybShmaWxlTGlzdCwgdHJhbnNmb3JtRmlsZVNpemUsIGZ1bmN0aW9uKGVyciwgcmVzdWx0KSB7XG4gICAgICogICAgIGlmKGVycikge1xuICAgICAqICAgICAgICAgY29uc29sZS5sb2coZXJyKTtcbiAgICAgKiAgICAgfSBlbHNlIHtcbiAgICAgKiAgICAgICAgIGNvbnNvbGUubG9nKHJlc3VsdCk7XG4gICAgICogICAgICAgICAvLyBbICcxMDAwIEJ5dGVzJywgJzEuOTUgS0InLCAnMi45MyBLQicgXVxuICAgICAqICAgICB9XG4gICAgICogfSk7XG4gICAgICpcbiAgICAgKiAvLyBVc2luZyBQcm9taXNlc1xuICAgICAqIGFzeW5jLnRyYW5zZm9ybShmaWxlTGlzdCwgdHJhbnNmb3JtRmlsZVNpemUpXG4gICAgICogLnRoZW4ocmVzdWx0ID0+IHtcbiAgICAgKiAgICAgY29uc29sZS5sb2cocmVzdWx0KTtcbiAgICAgKiAgICAgLy8gWyAnMTAwMCBCeXRlcycsICcxLjk1IEtCJywgJzIuOTMgS0InIF1cbiAgICAgKiB9KS5jYXRjaChlcnIgPT4ge1xuICAgICAqICAgICBjb25zb2xlLmxvZyhlcnIpO1xuICAgICAqIH0pO1xuICAgICAqXG4gICAgICogLy8gVXNpbmcgYXN5bmMvYXdhaXRcbiAgICAgKiAoYXN5bmMgKCkgPT4ge1xuICAgICAqICAgICB0cnkge1xuICAgICAqICAgICAgICAgbGV0IHJlc3VsdCA9IGF3YWl0IGFzeW5jLnRyYW5zZm9ybShmaWxlTGlzdCwgdHJhbnNmb3JtRmlsZVNpemUpO1xuICAgICAqICAgICAgICAgY29uc29sZS5sb2cocmVzdWx0KTtcbiAgICAgKiAgICAgICAgIC8vIFsgJzEwMDAgQnl0ZXMnLCAnMS45NSBLQicsICcyLjkzIEtCJyBdXG4gICAgICogICAgIH1cbiAgICAgKiAgICAgY2F0Y2ggKGVycikge1xuICAgICAqICAgICAgICAgY29uc29sZS5sb2coZXJyKTtcbiAgICAgKiAgICAgfVxuICAgICAqIH0pKCk7XG4gICAgICpcbiAgICAgKiBAZXhhbXBsZVxuICAgICAqXG4gICAgICogLy8gZmlsZTEudHh0IGlzIGEgZmlsZSB0aGF0IGlzIDEwMDAgYnl0ZXMgaW4gc2l6ZVxuICAgICAqIC8vIGZpbGUyLnR4dCBpcyBhIGZpbGUgdGhhdCBpcyAyMDAwIGJ5dGVzIGluIHNpemVcbiAgICAgKiAvLyBmaWxlMy50eHQgaXMgYSBmaWxlIHRoYXQgaXMgMzAwMCBieXRlcyBpbiBzaXplXG4gICAgICpcbiAgICAgKiAvLyBoZWxwZXIgZnVuY3Rpb24gdGhhdCByZXR1cm5zIGh1bWFuLXJlYWRhYmxlIHNpemUgZm9ybWF0IGZyb20gYnl0ZXNcbiAgICAgKiBmdW5jdGlvbiBmb3JtYXRCeXRlcyhieXRlcywgZGVjaW1hbHMgPSAyKSB7XG4gICAgICogICAvLyBpbXBsZW1lbnRhdGlvbiBub3QgaW5jbHVkZWQgZm9yIGJyZXZpdHlcbiAgICAgKiAgIHJldHVybiBodW1hblJlYWRibGVGaWxlc2l6ZTtcbiAgICAgKiB9XG4gICAgICpcbiAgICAgKiBjb25zdCBmaWxlTWFwID0geyBmMTogJ2ZpbGUxLnR4dCcsIGYyOiAnZmlsZTIudHh0JywgZjM6ICdmaWxlMy50eHQnIH07XG4gICAgICpcbiAgICAgKiAvLyBhc3luY2hyb25vdXMgZnVuY3Rpb24gdGhhdCByZXR1cm5zIHRoZSBmaWxlIHNpemUsIHRyYW5zZm9ybWVkIHRvIGh1bWFuLXJlYWRhYmxlIGZvcm1hdFxuICAgICAqIC8vIGUuZy4gMTAyNCBieXRlcyA9IDFLQiwgMTIzNCBieXRlcyA9IDEuMjEgS0IsIDEwNDg1NzYgYnl0ZXMgPSAxTUIsIGV0Yy5cbiAgICAgKiBmdW5jdGlvbiB0cmFuc2Zvcm1GaWxlU2l6ZShhY2MsIHZhbHVlLCBrZXksIGNhbGxiYWNrKSB7XG4gICAgICogICAgIGZzLnN0YXQodmFsdWUsIGZ1bmN0aW9uKGVyciwgc3RhdCkge1xuICAgICAqICAgICAgICAgaWYgKGVycikge1xuICAgICAqICAgICAgICAgICAgIHJldHVybiBjYWxsYmFjayhlcnIpO1xuICAgICAqICAgICAgICAgfVxuICAgICAqICAgICAgICAgYWNjW2tleV0gPSBmb3JtYXRCeXRlcyhzdGF0LnNpemUpO1xuICAgICAqICAgICAgICAgY2FsbGJhY2sobnVsbCk7XG4gICAgICogICAgIH0pO1xuICAgICAqIH1cbiAgICAgKlxuICAgICAqIC8vIFVzaW5nIGNhbGxiYWNrc1xuICAgICAqIGFzeW5jLnRyYW5zZm9ybShmaWxlTWFwLCB0cmFuc2Zvcm1GaWxlU2l6ZSwgZnVuY3Rpb24oZXJyLCByZXN1bHQpIHtcbiAgICAgKiAgICAgaWYoZXJyKSB7XG4gICAgICogICAgICAgICBjb25zb2xlLmxvZyhlcnIpO1xuICAgICAqICAgICB9IGVsc2Uge1xuICAgICAqICAgICAgICAgY29uc29sZS5sb2cocmVzdWx0KTtcbiAgICAgKiAgICAgICAgIC8vIHsgZjE6ICcxMDAwIEJ5dGVzJywgZjI6ICcxLjk1IEtCJywgZjM6ICcyLjkzIEtCJyB9XG4gICAgICogICAgIH1cbiAgICAgKiB9KTtcbiAgICAgKlxuICAgICAqIC8vIFVzaW5nIFByb21pc2VzXG4gICAgICogYXN5bmMudHJhbnNmb3JtKGZpbGVNYXAsIHRyYW5zZm9ybUZpbGVTaXplKVxuICAgICAqIC50aGVuKHJlc3VsdCA9PiB7XG4gICAgICogICAgIGNvbnNvbGUubG9nKHJlc3VsdCk7XG4gICAgICogICAgIC8vIHsgZjE6ICcxMDAwIEJ5dGVzJywgZjI6ICcxLjk1IEtCJywgZjM6ICcyLjkzIEtCJyB9XG4gICAgICogfSkuY2F0Y2goZXJyID0+IHtcbiAgICAgKiAgICAgY29uc29sZS5sb2coZXJyKTtcbiAgICAgKiB9KTtcbiAgICAgKlxuICAgICAqIC8vIFVzaW5nIGFzeW5jL2F3YWl0XG4gICAgICogYXN5bmMgKCkgPT4ge1xuICAgICAqICAgICB0cnkge1xuICAgICAqICAgICAgICAgbGV0IHJlc3VsdCA9IGF3YWl0IGFzeW5jLnRyYW5zZm9ybShmaWxlTWFwLCB0cmFuc2Zvcm1GaWxlU2l6ZSk7XG4gICAgICogICAgICAgICBjb25zb2xlLmxvZyhyZXN1bHQpO1xuICAgICAqICAgICAgICAgLy8geyBmMTogJzEwMDAgQnl0ZXMnLCBmMjogJzEuOTUgS0InLCBmMzogJzIuOTMgS0InIH1cbiAgICAgKiAgICAgfVxuICAgICAqICAgICBjYXRjaCAoZXJyKSB7XG4gICAgICogICAgICAgICBjb25zb2xlLmxvZyhlcnIpO1xuICAgICAqICAgICB9XG4gICAgICogfVxuICAgICAqXG4gICAgICovXG4gICAgZnVuY3Rpb24gdHJhbnNmb3JtIChjb2xsLCBhY2N1bXVsYXRvciwgaXRlcmF0ZWUsIGNhbGxiYWNrKSB7XG4gICAgICAgIGlmIChhcmd1bWVudHMubGVuZ3RoIDw9IDMgJiYgdHlwZW9mIGFjY3VtdWxhdG9yID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgICAgICBjYWxsYmFjayA9IGl0ZXJhdGVlO1xuICAgICAgICAgICAgaXRlcmF0ZWUgPSBhY2N1bXVsYXRvcjtcbiAgICAgICAgICAgIGFjY3VtdWxhdG9yID0gQXJyYXkuaXNBcnJheShjb2xsKSA/IFtdIDoge307XG4gICAgICAgIH1cbiAgICAgICAgY2FsbGJhY2sgPSBvbmNlKGNhbGxiYWNrIHx8IHByb21pc2VDYWxsYmFjaygpKTtcbiAgICAgICAgdmFyIF9pdGVyYXRlZSA9IHdyYXBBc3luYyhpdGVyYXRlZSk7XG5cbiAgICAgICAgZWFjaE9mJDEoY29sbCwgKHYsIGssIGNiKSA9PiB7XG4gICAgICAgICAgICBfaXRlcmF0ZWUoYWNjdW11bGF0b3IsIHYsIGssIGNiKTtcbiAgICAgICAgfSwgZXJyID0+IGNhbGxiYWNrKGVyciwgYWNjdW11bGF0b3IpKTtcbiAgICAgICAgcmV0dXJuIGNhbGxiYWNrW1BST01JU0VfU1lNQk9MXVxuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEl0IHJ1bnMgZWFjaCB0YXNrIGluIHNlcmllcyBidXQgc3RvcHMgd2hlbmV2ZXIgYW55IG9mIHRoZSBmdW5jdGlvbnMgd2VyZVxuICAgICAqIHN1Y2Nlc3NmdWwuIElmIG9uZSBvZiB0aGUgdGFza3Mgd2VyZSBzdWNjZXNzZnVsLCB0aGUgYGNhbGxiYWNrYCB3aWxsIGJlXG4gICAgICogcGFzc2VkIHRoZSByZXN1bHQgb2YgdGhlIHN1Y2Nlc3NmdWwgdGFzay4gSWYgYWxsIHRhc2tzIGZhaWwsIHRoZSBjYWxsYmFja1xuICAgICAqIHdpbGwgYmUgcGFzc2VkIHRoZSBlcnJvciBhbmQgcmVzdWx0IChpZiBhbnkpIG9mIHRoZSBmaW5hbCBhdHRlbXB0LlxuICAgICAqXG4gICAgICogQG5hbWUgdHJ5RWFjaFxuICAgICAqIEBzdGF0aWNcbiAgICAgKiBAbWVtYmVyT2YgbW9kdWxlOkNvbnRyb2xGbG93XG4gICAgICogQG1ldGhvZFxuICAgICAqIEBjYXRlZ29yeSBDb250cm9sIEZsb3dcbiAgICAgKiBAcGFyYW0ge0FycmF5fEl0ZXJhYmxlfEFzeW5jSXRlcmFibGV8T2JqZWN0fSB0YXNrcyAtIEEgY29sbGVjdGlvbiBjb250YWluaW5nIGZ1bmN0aW9ucyB0b1xuICAgICAqIHJ1biwgZWFjaCBmdW5jdGlvbiBpcyBwYXNzZWQgYSBgY2FsbGJhY2soZXJyLCByZXN1bHQpYCBpdCBtdXN0IGNhbGwgb25cbiAgICAgKiBjb21wbGV0aW9uIHdpdGggYW4gZXJyb3IgYGVycmAgKHdoaWNoIGNhbiBiZSBgbnVsbGApIGFuZCBhbiBvcHRpb25hbCBgcmVzdWx0YFxuICAgICAqIHZhbHVlLlxuICAgICAqIEBwYXJhbSB7RnVuY3Rpb259IFtjYWxsYmFja10gLSBBbiBvcHRpb25hbCBjYWxsYmFjayB3aGljaCBpcyBjYWxsZWQgd2hlbiBvbmVcbiAgICAgKiBvZiB0aGUgdGFza3MgaGFzIHN1Y2NlZWRlZCwgb3IgYWxsIGhhdmUgZmFpbGVkLiBJdCByZWNlaXZlcyB0aGUgYGVycmAgYW5kXG4gICAgICogYHJlc3VsdGAgYXJndW1lbnRzIG9mIHRoZSBsYXN0IGF0dGVtcHQgYXQgY29tcGxldGluZyB0aGUgYHRhc2tgLiBJbnZva2VkIHdpdGhcbiAgICAgKiAoZXJyLCByZXN1bHRzKS5cbiAgICAgKiBAcmV0dXJucyB7UHJvbWlzZX0gYSBwcm9taXNlLCBpZiBubyBjYWxsYmFjayBpcyBwYXNzZWRcbiAgICAgKiBAZXhhbXBsZVxuICAgICAqIGFzeW5jLnRyeUVhY2goW1xuICAgICAqICAgICBmdW5jdGlvbiBnZXREYXRhRnJvbUZpcnN0V2Vic2l0ZShjYWxsYmFjaykge1xuICAgICAqICAgICAgICAgLy8gVHJ5IGdldHRpbmcgdGhlIGRhdGEgZnJvbSB0aGUgZmlyc3Qgd2Vic2l0ZVxuICAgICAqICAgICAgICAgY2FsbGJhY2soZXJyLCBkYXRhKTtcbiAgICAgKiAgICAgfSxcbiAgICAgKiAgICAgZnVuY3Rpb24gZ2V0RGF0YUZyb21TZWNvbmRXZWJzaXRlKGNhbGxiYWNrKSB7XG4gICAgICogICAgICAgICAvLyBGaXJzdCB3ZWJzaXRlIGZhaWxlZCxcbiAgICAgKiAgICAgICAgIC8vIFRyeSBnZXR0aW5nIHRoZSBkYXRhIGZyb20gdGhlIGJhY2t1cCB3ZWJzaXRlXG4gICAgICogICAgICAgICBjYWxsYmFjayhlcnIsIGRhdGEpO1xuICAgICAqICAgICB9XG4gICAgICogXSxcbiAgICAgKiAvLyBvcHRpb25hbCBjYWxsYmFja1xuICAgICAqIGZ1bmN0aW9uKGVyciwgcmVzdWx0cykge1xuICAgICAqICAgICBOb3cgZG8gc29tZXRoaW5nIHdpdGggdGhlIGRhdGEuXG4gICAgICogfSk7XG4gICAgICpcbiAgICAgKi9cbiAgICBmdW5jdGlvbiB0cnlFYWNoKHRhc2tzLCBjYWxsYmFjaykge1xuICAgICAgICB2YXIgZXJyb3IgPSBudWxsO1xuICAgICAgICB2YXIgcmVzdWx0O1xuICAgICAgICByZXR1cm4gZWFjaFNlcmllcyQxKHRhc2tzLCAodGFzaywgdGFza0NiKSA9PiB7XG4gICAgICAgICAgICB3cmFwQXN5bmModGFzaykoKGVyciwgLi4uYXJncykgPT4ge1xuICAgICAgICAgICAgICAgIGlmIChlcnIgPT09IGZhbHNlKSByZXR1cm4gdGFza0NiKGVycik7XG5cbiAgICAgICAgICAgICAgICBpZiAoYXJncy5sZW5ndGggPCAyKSB7XG4gICAgICAgICAgICAgICAgICAgIFtyZXN1bHRdID0gYXJncztcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICByZXN1bHQgPSBhcmdzO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBlcnJvciA9IGVycjtcbiAgICAgICAgICAgICAgICB0YXNrQ2IoZXJyID8gbnVsbCA6IHt9KTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9LCAoKSA9PiBjYWxsYmFjayhlcnJvciwgcmVzdWx0KSk7XG4gICAgfVxuXG4gICAgdmFyIHRyeUVhY2gkMSA9IGF3YWl0aWZ5KHRyeUVhY2gpO1xuXG4gICAgLyoqXG4gICAgICogVW5kb2VzIGEgW21lbW9pemVde0BsaW5rIG1vZHVsZTpVdGlscy5tZW1vaXplfWQgZnVuY3Rpb24sIHJldmVydGluZyBpdCB0byB0aGUgb3JpZ2luYWwsXG4gICAgICogdW5tZW1vaXplZCBmb3JtLiBIYW5keSBmb3IgdGVzdGluZy5cbiAgICAgKlxuICAgICAqIEBuYW1lIHVubWVtb2l6ZVxuICAgICAqIEBzdGF0aWNcbiAgICAgKiBAbWVtYmVyT2YgbW9kdWxlOlV0aWxzXG4gICAgICogQG1ldGhvZFxuICAgICAqIEBzZWUgW2FzeW5jLm1lbW9pemVde0BsaW5rIG1vZHVsZTpVdGlscy5tZW1vaXplfVxuICAgICAqIEBjYXRlZ29yeSBVdGlsXG4gICAgICogQHBhcmFtIHtBc3luY0Z1bmN0aW9ufSBmbiAtIHRoZSBtZW1vaXplZCBmdW5jdGlvblxuICAgICAqIEByZXR1cm5zIHtBc3luY0Z1bmN0aW9ufSBhIGZ1bmN0aW9uIHRoYXQgY2FsbHMgdGhlIG9yaWdpbmFsIHVubWVtb2l6ZWQgZnVuY3Rpb25cbiAgICAgKi9cbiAgICBmdW5jdGlvbiB1bm1lbW9pemUoZm4pIHtcbiAgICAgICAgcmV0dXJuICguLi5hcmdzKSA9PiB7XG4gICAgICAgICAgICByZXR1cm4gKGZuLnVubWVtb2l6ZWQgfHwgZm4pKC4uLmFyZ3MpO1xuICAgICAgICB9O1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFJlcGVhdGVkbHkgY2FsbCBgaXRlcmF0ZWVgLCB3aGlsZSBgdGVzdGAgcmV0dXJucyBgdHJ1ZWAuIENhbGxzIGBjYWxsYmFja2Agd2hlblxuICAgICAqIHN0b3BwZWQsIG9yIGFuIGVycm9yIG9jY3Vycy5cbiAgICAgKlxuICAgICAqIEBuYW1lIHdoaWxzdFxuICAgICAqIEBzdGF0aWNcbiAgICAgKiBAbWVtYmVyT2YgbW9kdWxlOkNvbnRyb2xGbG93XG4gICAgICogQG1ldGhvZFxuICAgICAqIEBjYXRlZ29yeSBDb250cm9sIEZsb3dcbiAgICAgKiBAcGFyYW0ge0FzeW5jRnVuY3Rpb259IHRlc3QgLSBhc3luY2hyb25vdXMgdHJ1dGggdGVzdCB0byBwZXJmb3JtIGJlZm9yZSBlYWNoXG4gICAgICogZXhlY3V0aW9uIG9mIGBpdGVyYXRlZWAuIEludm9rZWQgd2l0aCAoY2FsbGJhY2spLlxuICAgICAqIEBwYXJhbSB7QXN5bmNGdW5jdGlvbn0gaXRlcmF0ZWUgLSBBbiBhc3luYyBmdW5jdGlvbiB3aGljaCBpcyBjYWxsZWQgZWFjaCB0aW1lXG4gICAgICogYHRlc3RgIHBhc3Nlcy4gSW52b2tlZCB3aXRoIChjYWxsYmFjaykuXG4gICAgICogQHBhcmFtIHtGdW5jdGlvbn0gW2NhbGxiYWNrXSAtIEEgY2FsbGJhY2sgd2hpY2ggaXMgY2FsbGVkIGFmdGVyIHRoZSB0ZXN0XG4gICAgICogZnVuY3Rpb24gaGFzIGZhaWxlZCBhbmQgcmVwZWF0ZWQgZXhlY3V0aW9uIG9mIGBpdGVyYXRlZWAgaGFzIHN0b3BwZWQuIGBjYWxsYmFja2BcbiAgICAgKiB3aWxsIGJlIHBhc3NlZCBhbiBlcnJvciBhbmQgYW55IGFyZ3VtZW50cyBwYXNzZWQgdG8gdGhlIGZpbmFsIGBpdGVyYXRlZWAnc1xuICAgICAqIGNhbGxiYWNrLiBJbnZva2VkIHdpdGggKGVyciwgW3Jlc3VsdHNdKTtcbiAgICAgKiBAcmV0dXJucyB7UHJvbWlzZX0gYSBwcm9taXNlLCBpZiBubyBjYWxsYmFjayBpcyBwYXNzZWRcbiAgICAgKiBAZXhhbXBsZVxuICAgICAqXG4gICAgICogdmFyIGNvdW50ID0gMDtcbiAgICAgKiBhc3luYy53aGlsc3QoXG4gICAgICogICAgIGZ1bmN0aW9uIHRlc3QoY2IpIHsgY2IobnVsbCwgY291bnQgPCA1KTsgfSxcbiAgICAgKiAgICAgZnVuY3Rpb24gaXRlcihjYWxsYmFjaykge1xuICAgICAqICAgICAgICAgY291bnQrKztcbiAgICAgKiAgICAgICAgIHNldFRpbWVvdXQoZnVuY3Rpb24oKSB7XG4gICAgICogICAgICAgICAgICAgY2FsbGJhY2sobnVsbCwgY291bnQpO1xuICAgICAqICAgICAgICAgfSwgMTAwMCk7XG4gICAgICogICAgIH0sXG4gICAgICogICAgIGZ1bmN0aW9uIChlcnIsIG4pIHtcbiAgICAgKiAgICAgICAgIC8vIDUgc2Vjb25kcyBoYXZlIHBhc3NlZCwgbiA9IDVcbiAgICAgKiAgICAgfVxuICAgICAqICk7XG4gICAgICovXG4gICAgZnVuY3Rpb24gd2hpbHN0KHRlc3QsIGl0ZXJhdGVlLCBjYWxsYmFjaykge1xuICAgICAgICBjYWxsYmFjayA9IG9ubHlPbmNlKGNhbGxiYWNrKTtcbiAgICAgICAgdmFyIF9mbiA9IHdyYXBBc3luYyhpdGVyYXRlZSk7XG4gICAgICAgIHZhciBfdGVzdCA9IHdyYXBBc3luYyh0ZXN0KTtcbiAgICAgICAgdmFyIHJlc3VsdHMgPSBbXTtcblxuICAgICAgICBmdW5jdGlvbiBuZXh0KGVyciwgLi4ucmVzdCkge1xuICAgICAgICAgICAgaWYgKGVycikgcmV0dXJuIGNhbGxiYWNrKGVycik7XG4gICAgICAgICAgICByZXN1bHRzID0gcmVzdDtcbiAgICAgICAgICAgIGlmIChlcnIgPT09IGZhbHNlKSByZXR1cm47XG4gICAgICAgICAgICBfdGVzdChjaGVjayk7XG4gICAgICAgIH1cblxuICAgICAgICBmdW5jdGlvbiBjaGVjayhlcnIsIHRydXRoKSB7XG4gICAgICAgICAgICBpZiAoZXJyKSByZXR1cm4gY2FsbGJhY2soZXJyKTtcbiAgICAgICAgICAgIGlmIChlcnIgPT09IGZhbHNlKSByZXR1cm47XG4gICAgICAgICAgICBpZiAoIXRydXRoKSByZXR1cm4gY2FsbGJhY2sobnVsbCwgLi4ucmVzdWx0cyk7XG4gICAgICAgICAgICBfZm4obmV4dCk7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gX3Rlc3QoY2hlY2spO1xuICAgIH1cbiAgICB2YXIgd2hpbHN0JDEgPSBhd2FpdGlmeSh3aGlsc3QsIDMpO1xuXG4gICAgLyoqXG4gICAgICogUmVwZWF0ZWRseSBjYWxsIGBpdGVyYXRlZWAgdW50aWwgYHRlc3RgIHJldHVybnMgYHRydWVgLiBDYWxscyBgY2FsbGJhY2tgIHdoZW5cbiAgICAgKiBzdG9wcGVkLCBvciBhbiBlcnJvciBvY2N1cnMuIGBjYWxsYmFja2Agd2lsbCBiZSBwYXNzZWQgYW4gZXJyb3IgYW5kIGFueVxuICAgICAqIGFyZ3VtZW50cyBwYXNzZWQgdG8gdGhlIGZpbmFsIGBpdGVyYXRlZWAncyBjYWxsYmFjay5cbiAgICAgKlxuICAgICAqIFRoZSBpbnZlcnNlIG9mIFt3aGlsc3Rde0BsaW5rIG1vZHVsZTpDb250cm9sRmxvdy53aGlsc3R9LlxuICAgICAqXG4gICAgICogQG5hbWUgdW50aWxcbiAgICAgKiBAc3RhdGljXG4gICAgICogQG1lbWJlck9mIG1vZHVsZTpDb250cm9sRmxvd1xuICAgICAqIEBtZXRob2RcbiAgICAgKiBAc2VlIFthc3luYy53aGlsc3Rde0BsaW5rIG1vZHVsZTpDb250cm9sRmxvdy53aGlsc3R9XG4gICAgICogQGNhdGVnb3J5IENvbnRyb2wgRmxvd1xuICAgICAqIEBwYXJhbSB7QXN5bmNGdW5jdGlvbn0gdGVzdCAtIGFzeW5jaHJvbm91cyB0cnV0aCB0ZXN0IHRvIHBlcmZvcm0gYmVmb3JlIGVhY2hcbiAgICAgKiBleGVjdXRpb24gb2YgYGl0ZXJhdGVlYC4gSW52b2tlZCB3aXRoIChjYWxsYmFjaykuXG4gICAgICogQHBhcmFtIHtBc3luY0Z1bmN0aW9ufSBpdGVyYXRlZSAtIEFuIGFzeW5jIGZ1bmN0aW9uIHdoaWNoIGlzIGNhbGxlZCBlYWNoIHRpbWVcbiAgICAgKiBgdGVzdGAgZmFpbHMuIEludm9rZWQgd2l0aCAoY2FsbGJhY2spLlxuICAgICAqIEBwYXJhbSB7RnVuY3Rpb259IFtjYWxsYmFja10gLSBBIGNhbGxiYWNrIHdoaWNoIGlzIGNhbGxlZCBhZnRlciB0aGUgdGVzdFxuICAgICAqIGZ1bmN0aW9uIGhhcyBwYXNzZWQgYW5kIHJlcGVhdGVkIGV4ZWN1dGlvbiBvZiBgaXRlcmF0ZWVgIGhhcyBzdG9wcGVkLiBgY2FsbGJhY2tgXG4gICAgICogd2lsbCBiZSBwYXNzZWQgYW4gZXJyb3IgYW5kIGFueSBhcmd1bWVudHMgcGFzc2VkIHRvIHRoZSBmaW5hbCBgaXRlcmF0ZWVgJ3NcbiAgICAgKiBjYWxsYmFjay4gSW52b2tlZCB3aXRoIChlcnIsIFtyZXN1bHRzXSk7XG4gICAgICogQHJldHVybnMge1Byb21pc2V9IGEgcHJvbWlzZSwgaWYgYSBjYWxsYmFjayBpcyBub3QgcGFzc2VkXG4gICAgICpcbiAgICAgKiBAZXhhbXBsZVxuICAgICAqIGNvbnN0IHJlc3VsdHMgPSBbXVxuICAgICAqIGxldCBmaW5pc2hlZCA9IGZhbHNlXG4gICAgICogYXN5bmMudW50aWwoZnVuY3Rpb24gdGVzdChjYikge1xuICAgICAqICAgICBjYihudWxsLCBmaW5pc2hlZClcbiAgICAgKiB9LCBmdW5jdGlvbiBpdGVyKG5leHQpIHtcbiAgICAgKiAgICAgZmV0Y2hQYWdlKHVybCwgKGVyciwgYm9keSkgPT4ge1xuICAgICAqICAgICAgICAgaWYgKGVycikgcmV0dXJuIG5leHQoZXJyKVxuICAgICAqICAgICAgICAgcmVzdWx0cyA9IHJlc3VsdHMuY29uY2F0KGJvZHkub2JqZWN0cylcbiAgICAgKiAgICAgICAgIGZpbmlzaGVkID0gISFib2R5Lm5leHRcbiAgICAgKiAgICAgICAgIG5leHQoZXJyKVxuICAgICAqICAgICB9KVxuICAgICAqIH0sIGZ1bmN0aW9uIGRvbmUgKGVycikge1xuICAgICAqICAgICAvLyBhbGwgcGFnZXMgaGF2ZSBiZWVuIGZldGNoZWRcbiAgICAgKiB9KVxuICAgICAqL1xuICAgIGZ1bmN0aW9uIHVudGlsKHRlc3QsIGl0ZXJhdGVlLCBjYWxsYmFjaykge1xuICAgICAgICBjb25zdCBfdGVzdCA9IHdyYXBBc3luYyh0ZXN0KTtcbiAgICAgICAgcmV0dXJuIHdoaWxzdCQxKChjYikgPT4gX3Rlc3QoKGVyciwgdHJ1dGgpID0+IGNiIChlcnIsICF0cnV0aCkpLCBpdGVyYXRlZSwgY2FsbGJhY2spO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFJ1bnMgdGhlIGB0YXNrc2AgYXJyYXkgb2YgZnVuY3Rpb25zIGluIHNlcmllcywgZWFjaCBwYXNzaW5nIHRoZWlyIHJlc3VsdHMgdG9cbiAgICAgKiB0aGUgbmV4dCBpbiB0aGUgYXJyYXkuIEhvd2V2ZXIsIGlmIGFueSBvZiB0aGUgYHRhc2tzYCBwYXNzIGFuIGVycm9yIHRvIHRoZWlyXG4gICAgICogb3duIGNhbGxiYWNrLCB0aGUgbmV4dCBmdW5jdGlvbiBpcyBub3QgZXhlY3V0ZWQsIGFuZCB0aGUgbWFpbiBgY2FsbGJhY2tgIGlzXG4gICAgICogaW1tZWRpYXRlbHkgY2FsbGVkIHdpdGggdGhlIGVycm9yLlxuICAgICAqXG4gICAgICogQG5hbWUgd2F0ZXJmYWxsXG4gICAgICogQHN0YXRpY1xuICAgICAqIEBtZW1iZXJPZiBtb2R1bGU6Q29udHJvbEZsb3dcbiAgICAgKiBAbWV0aG9kXG4gICAgICogQGNhdGVnb3J5IENvbnRyb2wgRmxvd1xuICAgICAqIEBwYXJhbSB7QXJyYXl9IHRhc2tzIC0gQW4gYXJyYXkgb2YgW2FzeW5jIGZ1bmN0aW9uc117QGxpbmsgQXN5bmNGdW5jdGlvbn1cbiAgICAgKiB0byBydW4uXG4gICAgICogRWFjaCBmdW5jdGlvbiBzaG91bGQgY29tcGxldGUgd2l0aCBhbnkgbnVtYmVyIG9mIGByZXN1bHRgIHZhbHVlcy5cbiAgICAgKiBUaGUgYHJlc3VsdGAgdmFsdWVzIHdpbGwgYmUgcGFzc2VkIGFzIGFyZ3VtZW50cywgaW4gb3JkZXIsIHRvIHRoZSBuZXh0IHRhc2suXG4gICAgICogQHBhcmFtIHtGdW5jdGlvbn0gW2NhbGxiYWNrXSAtIEFuIG9wdGlvbmFsIGNhbGxiYWNrIHRvIHJ1biBvbmNlIGFsbCB0aGVcbiAgICAgKiBmdW5jdGlvbnMgaGF2ZSBjb21wbGV0ZWQuIFRoaXMgd2lsbCBiZSBwYXNzZWQgdGhlIHJlc3VsdHMgb2YgdGhlIGxhc3QgdGFzaydzXG4gICAgICogY2FsbGJhY2suIEludm9rZWQgd2l0aCAoZXJyLCBbcmVzdWx0c10pLlxuICAgICAqIEByZXR1cm5zIHtQcm9taXNlfSBhIHByb21pc2UsIGlmIGEgY2FsbGJhY2sgaXMgb21pdHRlZFxuICAgICAqIEBleGFtcGxlXG4gICAgICpcbiAgICAgKiBhc3luYy53YXRlcmZhbGwoW1xuICAgICAqICAgICBmdW5jdGlvbihjYWxsYmFjaykge1xuICAgICAqICAgICAgICAgY2FsbGJhY2sobnVsbCwgJ29uZScsICd0d28nKTtcbiAgICAgKiAgICAgfSxcbiAgICAgKiAgICAgZnVuY3Rpb24oYXJnMSwgYXJnMiwgY2FsbGJhY2spIHtcbiAgICAgKiAgICAgICAgIC8vIGFyZzEgbm93IGVxdWFscyAnb25lJyBhbmQgYXJnMiBub3cgZXF1YWxzICd0d28nXG4gICAgICogICAgICAgICBjYWxsYmFjayhudWxsLCAndGhyZWUnKTtcbiAgICAgKiAgICAgfSxcbiAgICAgKiAgICAgZnVuY3Rpb24oYXJnMSwgY2FsbGJhY2spIHtcbiAgICAgKiAgICAgICAgIC8vIGFyZzEgbm93IGVxdWFscyAndGhyZWUnXG4gICAgICogICAgICAgICBjYWxsYmFjayhudWxsLCAnZG9uZScpO1xuICAgICAqICAgICB9XG4gICAgICogXSwgZnVuY3Rpb24gKGVyciwgcmVzdWx0KSB7XG4gICAgICogICAgIC8vIHJlc3VsdCBub3cgZXF1YWxzICdkb25lJ1xuICAgICAqIH0pO1xuICAgICAqXG4gICAgICogLy8gT3IsIHdpdGggbmFtZWQgZnVuY3Rpb25zOlxuICAgICAqIGFzeW5jLndhdGVyZmFsbChbXG4gICAgICogICAgIG15Rmlyc3RGdW5jdGlvbixcbiAgICAgKiAgICAgbXlTZWNvbmRGdW5jdGlvbixcbiAgICAgKiAgICAgbXlMYXN0RnVuY3Rpb24sXG4gICAgICogXSwgZnVuY3Rpb24gKGVyciwgcmVzdWx0KSB7XG4gICAgICogICAgIC8vIHJlc3VsdCBub3cgZXF1YWxzICdkb25lJ1xuICAgICAqIH0pO1xuICAgICAqIGZ1bmN0aW9uIG15Rmlyc3RGdW5jdGlvbihjYWxsYmFjaykge1xuICAgICAqICAgICBjYWxsYmFjayhudWxsLCAnb25lJywgJ3R3bycpO1xuICAgICAqIH1cbiAgICAgKiBmdW5jdGlvbiBteVNlY29uZEZ1bmN0aW9uKGFyZzEsIGFyZzIsIGNhbGxiYWNrKSB7XG4gICAgICogICAgIC8vIGFyZzEgbm93IGVxdWFscyAnb25lJyBhbmQgYXJnMiBub3cgZXF1YWxzICd0d28nXG4gICAgICogICAgIGNhbGxiYWNrKG51bGwsICd0aHJlZScpO1xuICAgICAqIH1cbiAgICAgKiBmdW5jdGlvbiBteUxhc3RGdW5jdGlvbihhcmcxLCBjYWxsYmFjaykge1xuICAgICAqICAgICAvLyBhcmcxIG5vdyBlcXVhbHMgJ3RocmVlJ1xuICAgICAqICAgICBjYWxsYmFjayhudWxsLCAnZG9uZScpO1xuICAgICAqIH1cbiAgICAgKi9cbiAgICBmdW5jdGlvbiB3YXRlcmZhbGwgKHRhc2tzLCBjYWxsYmFjaykge1xuICAgICAgICBjYWxsYmFjayA9IG9uY2UoY2FsbGJhY2spO1xuICAgICAgICBpZiAoIUFycmF5LmlzQXJyYXkodGFza3MpKSByZXR1cm4gY2FsbGJhY2sobmV3IEVycm9yKCdGaXJzdCBhcmd1bWVudCB0byB3YXRlcmZhbGwgbXVzdCBiZSBhbiBhcnJheSBvZiBmdW5jdGlvbnMnKSk7XG4gICAgICAgIGlmICghdGFza3MubGVuZ3RoKSByZXR1cm4gY2FsbGJhY2soKTtcbiAgICAgICAgdmFyIHRhc2tJbmRleCA9IDA7XG5cbiAgICAgICAgZnVuY3Rpb24gbmV4dFRhc2soYXJncykge1xuICAgICAgICAgICAgdmFyIHRhc2sgPSB3cmFwQXN5bmModGFza3NbdGFza0luZGV4KytdKTtcbiAgICAgICAgICAgIHRhc2soLi4uYXJncywgb25seU9uY2UobmV4dCkpO1xuICAgICAgICB9XG5cbiAgICAgICAgZnVuY3Rpb24gbmV4dChlcnIsIC4uLmFyZ3MpIHtcbiAgICAgICAgICAgIGlmIChlcnIgPT09IGZhbHNlKSByZXR1cm5cbiAgICAgICAgICAgIGlmIChlcnIgfHwgdGFza0luZGV4ID09PSB0YXNrcy5sZW5ndGgpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gY2FsbGJhY2soZXJyLCAuLi5hcmdzKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIG5leHRUYXNrKGFyZ3MpO1xuICAgICAgICB9XG5cbiAgICAgICAgbmV4dFRhc2soW10pO1xuICAgIH1cblxuICAgIHZhciB3YXRlcmZhbGwkMSA9IGF3YWl0aWZ5KHdhdGVyZmFsbCk7XG5cbiAgICAvKipcbiAgICAgKiBBbiBcImFzeW5jIGZ1bmN0aW9uXCIgaW4gdGhlIGNvbnRleHQgb2YgQXN5bmMgaXMgYW4gYXN5bmNocm9ub3VzIGZ1bmN0aW9uIHdpdGhcbiAgICAgKiBhIHZhcmlhYmxlIG51bWJlciBvZiBwYXJhbWV0ZXJzLCB3aXRoIHRoZSBmaW5hbCBwYXJhbWV0ZXIgYmVpbmcgYSBjYWxsYmFjay5cbiAgICAgKiAoYGZ1bmN0aW9uIChhcmcxLCBhcmcyLCAuLi4sIGNhbGxiYWNrKSB7fWApXG4gICAgICogVGhlIGZpbmFsIGNhbGxiYWNrIGlzIG9mIHRoZSBmb3JtIGBjYWxsYmFjayhlcnIsIHJlc3VsdHMuLi4pYCwgd2hpY2ggbXVzdCBiZVxuICAgICAqIGNhbGxlZCBvbmNlIHRoZSBmdW5jdGlvbiBpcyBjb21wbGV0ZWQuICBUaGUgY2FsbGJhY2sgc2hvdWxkIGJlIGNhbGxlZCB3aXRoIGFcbiAgICAgKiBFcnJvciBhcyBpdHMgZmlyc3QgYXJndW1lbnQgdG8gc2lnbmFsIHRoYXQgYW4gZXJyb3Igb2NjdXJyZWQuXG4gICAgICogT3RoZXJ3aXNlLCBpZiBubyBlcnJvciBvY2N1cnJlZCwgaXQgc2hvdWxkIGJlIGNhbGxlZCB3aXRoIGBudWxsYCBhcyB0aGUgZmlyc3RcbiAgICAgKiBhcmd1bWVudCwgYW5kIGFueSBhZGRpdGlvbmFsIGByZXN1bHRgIGFyZ3VtZW50cyB0aGF0IG1heSBhcHBseSwgdG8gc2lnbmFsXG4gICAgICogc3VjY2Vzc2Z1bCBjb21wbGV0aW9uLlxuICAgICAqIFRoZSBjYWxsYmFjayBtdXN0IGJlIGNhbGxlZCBleGFjdGx5IG9uY2UsIGlkZWFsbHkgb24gYSBsYXRlciB0aWNrIG9mIHRoZVxuICAgICAqIEphdmFTY3JpcHQgZXZlbnQgbG9vcC5cbiAgICAgKlxuICAgICAqIFRoaXMgdHlwZSBvZiBmdW5jdGlvbiBpcyBhbHNvIHJlZmVycmVkIHRvIGFzIGEgXCJOb2RlLXN0eWxlIGFzeW5jIGZ1bmN0aW9uXCIsXG4gICAgICogb3IgYSBcImNvbnRpbnVhdGlvbiBwYXNzaW5nLXN0eWxlIGZ1bmN0aW9uXCIgKENQUykuIE1vc3Qgb2YgdGhlIG1ldGhvZHMgb2YgdGhpc1xuICAgICAqIGxpYnJhcnkgYXJlIHRoZW1zZWx2ZXMgQ1BTL05vZGUtc3R5bGUgYXN5bmMgZnVuY3Rpb25zLCBvciBmdW5jdGlvbnMgdGhhdFxuICAgICAqIHJldHVybiBDUFMvTm9kZS1zdHlsZSBhc3luYyBmdW5jdGlvbnMuXG4gICAgICpcbiAgICAgKiBXaGVyZXZlciB3ZSBhY2NlcHQgYSBOb2RlLXN0eWxlIGFzeW5jIGZ1bmN0aW9uLCB3ZSBhbHNvIGRpcmVjdGx5IGFjY2VwdCBhblxuICAgICAqIFtFUzIwMTcgYGFzeW5jYCBmdW5jdGlvbl17QGxpbmsgaHR0cHM6Ly9kZXZlbG9wZXIubW96aWxsYS5vcmcvZW4tVVMvZG9jcy9XZWIvSmF2YVNjcmlwdC9SZWZlcmVuY2UvU3RhdGVtZW50cy9hc3luY19mdW5jdGlvbn0uXG4gICAgICogSW4gdGhpcyBjYXNlLCB0aGUgYGFzeW5jYCBmdW5jdGlvbiB3aWxsIG5vdCBiZSBwYXNzZWQgYSBmaW5hbCBjYWxsYmFja1xuICAgICAqIGFyZ3VtZW50LCBhbmQgYW55IHRocm93biBlcnJvciB3aWxsIGJlIHVzZWQgYXMgdGhlIGBlcnJgIGFyZ3VtZW50IG9mIHRoZVxuICAgICAqIGltcGxpY2l0IGNhbGxiYWNrLCBhbmQgdGhlIHJldHVybiB2YWx1ZSB3aWxsIGJlIHVzZWQgYXMgdGhlIGByZXN1bHRgIHZhbHVlLlxuICAgICAqIChpLmUuIGEgYHJlamVjdGVkYCBvZiB0aGUgcmV0dXJuZWQgUHJvbWlzZSBiZWNvbWVzIHRoZSBgZXJyYCBjYWxsYmFja1xuICAgICAqIGFyZ3VtZW50LCBhbmQgYSBgcmVzb2x2ZWRgIHZhbHVlIGJlY29tZXMgdGhlIGByZXN1bHRgLilcbiAgICAgKlxuICAgICAqIE5vdGUsIGR1ZSB0byBKYXZhU2NyaXB0IGxpbWl0YXRpb25zLCB3ZSBjYW4gb25seSBkZXRlY3QgbmF0aXZlIGBhc3luY2BcbiAgICAgKiBmdW5jdGlvbnMgYW5kIG5vdCB0cmFuc3BpbGllZCBpbXBsZW1lbnRhdGlvbnMuXG4gICAgICogWW91ciBlbnZpcm9ubWVudCBtdXN0IGhhdmUgYGFzeW5jYC9gYXdhaXRgIHN1cHBvcnQgZm9yIHRoaXMgdG8gd29yay5cbiAgICAgKiAoZS5nLiBOb2RlID4gdjcuNiwgb3IgYSByZWNlbnQgdmVyc2lvbiBvZiBhIG1vZGVybiBicm93c2VyKS5cbiAgICAgKiBJZiB5b3UgYXJlIHVzaW5nIGBhc3luY2AgZnVuY3Rpb25zIHRocm91Z2ggYSB0cmFuc3BpbGVyIChlLmcuIEJhYmVsKSwgeW91XG4gICAgICogbXVzdCBzdGlsbCB3cmFwIHRoZSBmdW5jdGlvbiB3aXRoIFthc3luY2lmeV17QGxpbmsgbW9kdWxlOlV0aWxzLmFzeW5jaWZ5fSxcbiAgICAgKiBiZWNhdXNlIHRoZSBgYXN5bmMgZnVuY3Rpb25gIHdpbGwgYmUgY29tcGlsZWQgdG8gYW4gb3JkaW5hcnkgZnVuY3Rpb24gdGhhdFxuICAgICAqIHJldHVybnMgYSBwcm9taXNlLlxuICAgICAqXG4gICAgICogQHR5cGVkZWYge0Z1bmN0aW9ufSBBc3luY0Z1bmN0aW9uXG4gICAgICogQHN0YXRpY1xuICAgICAqL1xuXG5cbiAgICB2YXIgaW5kZXggPSB7XG4gICAgICAgIGFwcGx5LFxuICAgICAgICBhcHBseUVhY2gsXG4gICAgICAgIGFwcGx5RWFjaFNlcmllcyxcbiAgICAgICAgYXN5bmNpZnksXG4gICAgICAgIGF1dG8sXG4gICAgICAgIGF1dG9JbmplY3QsXG4gICAgICAgIGNhcmdvOiBjYXJnbyQxLFxuICAgICAgICBjYXJnb1F1ZXVlOiBjYXJnbyxcbiAgICAgICAgY29tcG9zZSxcbiAgICAgICAgY29uY2F0OiBjb25jYXQkMSxcbiAgICAgICAgY29uY2F0TGltaXQ6IGNvbmNhdExpbWl0JDEsXG4gICAgICAgIGNvbmNhdFNlcmllczogY29uY2F0U2VyaWVzJDEsXG4gICAgICAgIGNvbnN0YW50OiBjb25zdGFudCQxLFxuICAgICAgICBkZXRlY3Q6IGRldGVjdCQxLFxuICAgICAgICBkZXRlY3RMaW1pdDogZGV0ZWN0TGltaXQkMSxcbiAgICAgICAgZGV0ZWN0U2VyaWVzOiBkZXRlY3RTZXJpZXMkMSxcbiAgICAgICAgZGlyLFxuICAgICAgICBkb1VudGlsLFxuICAgICAgICBkb1doaWxzdDogZG9XaGlsc3QkMSxcbiAgICAgICAgZWFjaCxcbiAgICAgICAgZWFjaExpbWl0OiBlYWNoTGltaXQkMSxcbiAgICAgICAgZWFjaE9mOiBlYWNoT2YkMSxcbiAgICAgICAgZWFjaE9mTGltaXQ6IGVhY2hPZkxpbWl0JDEsXG4gICAgICAgIGVhY2hPZlNlcmllczogZWFjaE9mU2VyaWVzJDEsXG4gICAgICAgIGVhY2hTZXJpZXM6IGVhY2hTZXJpZXMkMSxcbiAgICAgICAgZW5zdXJlQXN5bmMsXG4gICAgICAgIGV2ZXJ5OiBldmVyeSQxLFxuICAgICAgICBldmVyeUxpbWl0OiBldmVyeUxpbWl0JDEsXG4gICAgICAgIGV2ZXJ5U2VyaWVzOiBldmVyeVNlcmllcyQxLFxuICAgICAgICBmaWx0ZXI6IGZpbHRlciQxLFxuICAgICAgICBmaWx0ZXJMaW1pdDogZmlsdGVyTGltaXQkMSxcbiAgICAgICAgZmlsdGVyU2VyaWVzOiBmaWx0ZXJTZXJpZXMkMSxcbiAgICAgICAgZm9yZXZlcjogZm9yZXZlciQxLFxuICAgICAgICBncm91cEJ5LFxuICAgICAgICBncm91cEJ5TGltaXQ6IGdyb3VwQnlMaW1pdCQxLFxuICAgICAgICBncm91cEJ5U2VyaWVzLFxuICAgICAgICBsb2csXG4gICAgICAgIG1hcDogbWFwJDEsXG4gICAgICAgIG1hcExpbWl0OiBtYXBMaW1pdCQxLFxuICAgICAgICBtYXBTZXJpZXM6IG1hcFNlcmllcyQxLFxuICAgICAgICBtYXBWYWx1ZXMsXG4gICAgICAgIG1hcFZhbHVlc0xpbWl0OiBtYXBWYWx1ZXNMaW1pdCQxLFxuICAgICAgICBtYXBWYWx1ZXNTZXJpZXMsXG4gICAgICAgIG1lbW9pemUsXG4gICAgICAgIG5leHRUaWNrLFxuICAgICAgICBwYXJhbGxlbCxcbiAgICAgICAgcGFyYWxsZWxMaW1pdCxcbiAgICAgICAgcHJpb3JpdHlRdWV1ZSxcbiAgICAgICAgcXVldWUsXG4gICAgICAgIHJhY2U6IHJhY2UkMSxcbiAgICAgICAgcmVkdWNlOiByZWR1Y2UkMSxcbiAgICAgICAgcmVkdWNlUmlnaHQsXG4gICAgICAgIHJlZmxlY3QsXG4gICAgICAgIHJlZmxlY3RBbGwsXG4gICAgICAgIHJlamVjdDogcmVqZWN0JDEsXG4gICAgICAgIHJlamVjdExpbWl0OiByZWplY3RMaW1pdCQxLFxuICAgICAgICByZWplY3RTZXJpZXM6IHJlamVjdFNlcmllcyQxLFxuICAgICAgICByZXRyeSxcbiAgICAgICAgcmV0cnlhYmxlLFxuICAgICAgICBzZXEsXG4gICAgICAgIHNlcmllcyxcbiAgICAgICAgc2V0SW1tZWRpYXRlOiBzZXRJbW1lZGlhdGUkMSxcbiAgICAgICAgc29tZTogc29tZSQxLFxuICAgICAgICBzb21lTGltaXQ6IHNvbWVMaW1pdCQxLFxuICAgICAgICBzb21lU2VyaWVzOiBzb21lU2VyaWVzJDEsXG4gICAgICAgIHNvcnRCeTogc29ydEJ5JDEsXG4gICAgICAgIHRpbWVvdXQsXG4gICAgICAgIHRpbWVzLFxuICAgICAgICB0aW1lc0xpbWl0LFxuICAgICAgICB0aW1lc1NlcmllcyxcbiAgICAgICAgdHJhbnNmb3JtLFxuICAgICAgICB0cnlFYWNoOiB0cnlFYWNoJDEsXG4gICAgICAgIHVubWVtb2l6ZSxcbiAgICAgICAgdW50aWwsXG4gICAgICAgIHdhdGVyZmFsbDogd2F0ZXJmYWxsJDEsXG4gICAgICAgIHdoaWxzdDogd2hpbHN0JDEsXG5cbiAgICAgICAgLy8gYWxpYXNlc1xuICAgICAgICBhbGw6IGV2ZXJ5JDEsXG4gICAgICAgIGFsbExpbWl0OiBldmVyeUxpbWl0JDEsXG4gICAgICAgIGFsbFNlcmllczogZXZlcnlTZXJpZXMkMSxcbiAgICAgICAgYW55OiBzb21lJDEsXG4gICAgICAgIGFueUxpbWl0OiBzb21lTGltaXQkMSxcbiAgICAgICAgYW55U2VyaWVzOiBzb21lU2VyaWVzJDEsXG4gICAgICAgIGZpbmQ6IGRldGVjdCQxLFxuICAgICAgICBmaW5kTGltaXQ6IGRldGVjdExpbWl0JDEsXG4gICAgICAgIGZpbmRTZXJpZXM6IGRldGVjdFNlcmllcyQxLFxuICAgICAgICBmbGF0TWFwOiBjb25jYXQkMSxcbiAgICAgICAgZmxhdE1hcExpbWl0OiBjb25jYXRMaW1pdCQxLFxuICAgICAgICBmbGF0TWFwU2VyaWVzOiBjb25jYXRTZXJpZXMkMSxcbiAgICAgICAgZm9yRWFjaDogZWFjaCxcbiAgICAgICAgZm9yRWFjaFNlcmllczogZWFjaFNlcmllcyQxLFxuICAgICAgICBmb3JFYWNoTGltaXQ6IGVhY2hMaW1pdCQxLFxuICAgICAgICBmb3JFYWNoT2Y6IGVhY2hPZiQxLFxuICAgICAgICBmb3JFYWNoT2ZTZXJpZXM6IGVhY2hPZlNlcmllcyQxLFxuICAgICAgICBmb3JFYWNoT2ZMaW1pdDogZWFjaE9mTGltaXQkMSxcbiAgICAgICAgaW5qZWN0OiByZWR1Y2UkMSxcbiAgICAgICAgZm9sZGw6IHJlZHVjZSQxLFxuICAgICAgICBmb2xkcjogcmVkdWNlUmlnaHQsXG4gICAgICAgIHNlbGVjdDogZmlsdGVyJDEsXG4gICAgICAgIHNlbGVjdExpbWl0OiBmaWx0ZXJMaW1pdCQxLFxuICAgICAgICBzZWxlY3RTZXJpZXM6IGZpbHRlclNlcmllcyQxLFxuICAgICAgICB3cmFwU3luYzogYXN5bmNpZnksXG4gICAgICAgIGR1cmluZzogd2hpbHN0JDEsXG4gICAgICAgIGRvRHVyaW5nOiBkb1doaWxzdCQxXG4gICAgfTtcblxuICAgIGV4cG9ydHMuYWxsID0gZXZlcnkkMTtcbiAgICBleHBvcnRzLmFsbExpbWl0ID0gZXZlcnlMaW1pdCQxO1xuICAgIGV4cG9ydHMuYWxsU2VyaWVzID0gZXZlcnlTZXJpZXMkMTtcbiAgICBleHBvcnRzLmFueSA9IHNvbWUkMTtcbiAgICBleHBvcnRzLmFueUxpbWl0ID0gc29tZUxpbWl0JDE7XG4gICAgZXhwb3J0cy5hbnlTZXJpZXMgPSBzb21lU2VyaWVzJDE7XG4gICAgZXhwb3J0cy5hcHBseSA9IGFwcGx5O1xuICAgIGV4cG9ydHMuYXBwbHlFYWNoID0gYXBwbHlFYWNoO1xuICAgIGV4cG9ydHMuYXBwbHlFYWNoU2VyaWVzID0gYXBwbHlFYWNoU2VyaWVzO1xuICAgIGV4cG9ydHMuYXN5bmNpZnkgPSBhc3luY2lmeTtcbiAgICBleHBvcnRzLmF1dG8gPSBhdXRvO1xuICAgIGV4cG9ydHMuYXV0b0luamVjdCA9IGF1dG9JbmplY3Q7XG4gICAgZXhwb3J0cy5jYXJnbyA9IGNhcmdvJDE7XG4gICAgZXhwb3J0cy5jYXJnb1F1ZXVlID0gY2FyZ287XG4gICAgZXhwb3J0cy5jb21wb3NlID0gY29tcG9zZTtcbiAgICBleHBvcnRzLmNvbmNhdCA9IGNvbmNhdCQxO1xuICAgIGV4cG9ydHMuY29uY2F0TGltaXQgPSBjb25jYXRMaW1pdCQxO1xuICAgIGV4cG9ydHMuY29uY2F0U2VyaWVzID0gY29uY2F0U2VyaWVzJDE7XG4gICAgZXhwb3J0cy5jb25zdGFudCA9IGNvbnN0YW50JDE7XG4gICAgZXhwb3J0cy5kZWZhdWx0ID0gaW5kZXg7XG4gICAgZXhwb3J0cy5kZXRlY3QgPSBkZXRlY3QkMTtcbiAgICBleHBvcnRzLmRldGVjdExpbWl0ID0gZGV0ZWN0TGltaXQkMTtcbiAgICBleHBvcnRzLmRldGVjdFNlcmllcyA9IGRldGVjdFNlcmllcyQxO1xuICAgIGV4cG9ydHMuZGlyID0gZGlyO1xuICAgIGV4cG9ydHMuZG9EdXJpbmcgPSBkb1doaWxzdCQxO1xuICAgIGV4cG9ydHMuZG9VbnRpbCA9IGRvVW50aWw7XG4gICAgZXhwb3J0cy5kb1doaWxzdCA9IGRvV2hpbHN0JDE7XG4gICAgZXhwb3J0cy5kdXJpbmcgPSB3aGlsc3QkMTtcbiAgICBleHBvcnRzLmVhY2ggPSBlYWNoO1xuICAgIGV4cG9ydHMuZWFjaExpbWl0ID0gZWFjaExpbWl0JDE7XG4gICAgZXhwb3J0cy5lYWNoT2YgPSBlYWNoT2YkMTtcbiAgICBleHBvcnRzLmVhY2hPZkxpbWl0ID0gZWFjaE9mTGltaXQkMTtcbiAgICBleHBvcnRzLmVhY2hPZlNlcmllcyA9IGVhY2hPZlNlcmllcyQxO1xuICAgIGV4cG9ydHMuZWFjaFNlcmllcyA9IGVhY2hTZXJpZXMkMTtcbiAgICBleHBvcnRzLmVuc3VyZUFzeW5jID0gZW5zdXJlQXN5bmM7XG4gICAgZXhwb3J0cy5ldmVyeSA9IGV2ZXJ5JDE7XG4gICAgZXhwb3J0cy5ldmVyeUxpbWl0ID0gZXZlcnlMaW1pdCQxO1xuICAgIGV4cG9ydHMuZXZlcnlTZXJpZXMgPSBldmVyeVNlcmllcyQxO1xuICAgIGV4cG9ydHMuZmlsdGVyID0gZmlsdGVyJDE7XG4gICAgZXhwb3J0cy5maWx0ZXJMaW1pdCA9IGZpbHRlckxpbWl0JDE7XG4gICAgZXhwb3J0cy5maWx0ZXJTZXJpZXMgPSBmaWx0ZXJTZXJpZXMkMTtcbiAgICBleHBvcnRzLmZpbmQgPSBkZXRlY3QkMTtcbiAgICBleHBvcnRzLmZpbmRMaW1pdCA9IGRldGVjdExpbWl0JDE7XG4gICAgZXhwb3J0cy5maW5kU2VyaWVzID0gZGV0ZWN0U2VyaWVzJDE7XG4gICAgZXhwb3J0cy5mbGF0TWFwID0gY29uY2F0JDE7XG4gICAgZXhwb3J0cy5mbGF0TWFwTGltaXQgPSBjb25jYXRMaW1pdCQxO1xuICAgIGV4cG9ydHMuZmxhdE1hcFNlcmllcyA9IGNvbmNhdFNlcmllcyQxO1xuICAgIGV4cG9ydHMuZm9sZGwgPSByZWR1Y2UkMTtcbiAgICBleHBvcnRzLmZvbGRyID0gcmVkdWNlUmlnaHQ7XG4gICAgZXhwb3J0cy5mb3JFYWNoID0gZWFjaDtcbiAgICBleHBvcnRzLmZvckVhY2hMaW1pdCA9IGVhY2hMaW1pdCQxO1xuICAgIGV4cG9ydHMuZm9yRWFjaE9mID0gZWFjaE9mJDE7XG4gICAgZXhwb3J0cy5mb3JFYWNoT2ZMaW1pdCA9IGVhY2hPZkxpbWl0JDE7XG4gICAgZXhwb3J0cy5mb3JFYWNoT2ZTZXJpZXMgPSBlYWNoT2ZTZXJpZXMkMTtcbiAgICBleHBvcnRzLmZvckVhY2hTZXJpZXMgPSBlYWNoU2VyaWVzJDE7XG4gICAgZXhwb3J0cy5mb3JldmVyID0gZm9yZXZlciQxO1xuICAgIGV4cG9ydHMuZ3JvdXBCeSA9IGdyb3VwQnk7XG4gICAgZXhwb3J0cy5ncm91cEJ5TGltaXQgPSBncm91cEJ5TGltaXQkMTtcbiAgICBleHBvcnRzLmdyb3VwQnlTZXJpZXMgPSBncm91cEJ5U2VyaWVzO1xuICAgIGV4cG9ydHMuaW5qZWN0ID0gcmVkdWNlJDE7XG4gICAgZXhwb3J0cy5sb2cgPSBsb2c7XG4gICAgZXhwb3J0cy5tYXAgPSBtYXAkMTtcbiAgICBleHBvcnRzLm1hcExpbWl0ID0gbWFwTGltaXQkMTtcbiAgICBleHBvcnRzLm1hcFNlcmllcyA9IG1hcFNlcmllcyQxO1xuICAgIGV4cG9ydHMubWFwVmFsdWVzID0gbWFwVmFsdWVzO1xuICAgIGV4cG9ydHMubWFwVmFsdWVzTGltaXQgPSBtYXBWYWx1ZXNMaW1pdCQxO1xuICAgIGV4cG9ydHMubWFwVmFsdWVzU2VyaWVzID0gbWFwVmFsdWVzU2VyaWVzO1xuICAgIGV4cG9ydHMubWVtb2l6ZSA9IG1lbW9pemU7XG4gICAgZXhwb3J0cy5uZXh0VGljayA9IG5leHRUaWNrO1xuICAgIGV4cG9ydHMucGFyYWxsZWwgPSBwYXJhbGxlbDtcbiAgICBleHBvcnRzLnBhcmFsbGVsTGltaXQgPSBwYXJhbGxlbExpbWl0O1xuICAgIGV4cG9ydHMucHJpb3JpdHlRdWV1ZSA9IHByaW9yaXR5UXVldWU7XG4gICAgZXhwb3J0cy5xdWV1ZSA9IHF1ZXVlO1xuICAgIGV4cG9ydHMucmFjZSA9IHJhY2UkMTtcbiAgICBleHBvcnRzLnJlZHVjZSA9IHJlZHVjZSQxO1xuICAgIGV4cG9ydHMucmVkdWNlUmlnaHQgPSByZWR1Y2VSaWdodDtcbiAgICBleHBvcnRzLnJlZmxlY3QgPSByZWZsZWN0O1xuICAgIGV4cG9ydHMucmVmbGVjdEFsbCA9IHJlZmxlY3RBbGw7XG4gICAgZXhwb3J0cy5yZWplY3QgPSByZWplY3QkMTtcbiAgICBleHBvcnRzLnJlamVjdExpbWl0ID0gcmVqZWN0TGltaXQkMTtcbiAgICBleHBvcnRzLnJlamVjdFNlcmllcyA9IHJlamVjdFNlcmllcyQxO1xuICAgIGV4cG9ydHMucmV0cnkgPSByZXRyeTtcbiAgICBleHBvcnRzLnJldHJ5YWJsZSA9IHJldHJ5YWJsZTtcbiAgICBleHBvcnRzLnNlbGVjdCA9IGZpbHRlciQxO1xuICAgIGV4cG9ydHMuc2VsZWN0TGltaXQgPSBmaWx0ZXJMaW1pdCQxO1xuICAgIGV4cG9ydHMuc2VsZWN0U2VyaWVzID0gZmlsdGVyU2VyaWVzJDE7XG4gICAgZXhwb3J0cy5zZXEgPSBzZXE7XG4gICAgZXhwb3J0cy5zZXJpZXMgPSBzZXJpZXM7XG4gICAgZXhwb3J0cy5zZXRJbW1lZGlhdGUgPSBzZXRJbW1lZGlhdGUkMTtcbiAgICBleHBvcnRzLnNvbWUgPSBzb21lJDE7XG4gICAgZXhwb3J0cy5zb21lTGltaXQgPSBzb21lTGltaXQkMTtcbiAgICBleHBvcnRzLnNvbWVTZXJpZXMgPSBzb21lU2VyaWVzJDE7XG4gICAgZXhwb3J0cy5zb3J0QnkgPSBzb3J0QnkkMTtcbiAgICBleHBvcnRzLnRpbWVvdXQgPSB0aW1lb3V0O1xuICAgIGV4cG9ydHMudGltZXMgPSB0aW1lcztcbiAgICBleHBvcnRzLnRpbWVzTGltaXQgPSB0aW1lc0xpbWl0O1xuICAgIGV4cG9ydHMudGltZXNTZXJpZXMgPSB0aW1lc1NlcmllcztcbiAgICBleHBvcnRzLnRyYW5zZm9ybSA9IHRyYW5zZm9ybTtcbiAgICBleHBvcnRzLnRyeUVhY2ggPSB0cnlFYWNoJDE7XG4gICAgZXhwb3J0cy51bm1lbW9pemUgPSB1bm1lbW9pemU7XG4gICAgZXhwb3J0cy51bnRpbCA9IHVudGlsO1xuICAgIGV4cG9ydHMud2F0ZXJmYWxsID0gd2F0ZXJmYWxsJDE7XG4gICAgZXhwb3J0cy53aGlsc3QgPSB3aGlsc3QkMTtcbiAgICBleHBvcnRzLndyYXBTeW5jID0gYXN5bmNpZnk7XG5cbiAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgJ19fZXNNb2R1bGUnLCB7IHZhbHVlOiB0cnVlIH0pO1xuXG59KSk7XG4iLAogICAgInZhciBjb25zdGFudHMgPSByZXF1aXJlKCdjb25zdGFudHMnKVxuXG52YXIgb3JpZ0N3ZCA9IHByb2Nlc3MuY3dkXG52YXIgY3dkID0gbnVsbFxuXG52YXIgcGxhdGZvcm0gPSBwcm9jZXNzLmVudi5HUkFDRUZVTF9GU19QTEFURk9STSB8fCBwcm9jZXNzLnBsYXRmb3JtXG5cbnByb2Nlc3MuY3dkID0gZnVuY3Rpb24oKSB7XG4gIGlmICghY3dkKVxuICAgIGN3ZCA9IG9yaWdDd2QuY2FsbChwcm9jZXNzKVxuICByZXR1cm4gY3dkXG59XG50cnkge1xuICBwcm9jZXNzLmN3ZCgpXG59IGNhdGNoIChlcikge31cblxuLy8gVGhpcyBjaGVjayBpcyBuZWVkZWQgdW50aWwgbm9kZS5qcyAxMiBpcyByZXF1aXJlZFxuaWYgKHR5cGVvZiBwcm9jZXNzLmNoZGlyID09PSAnZnVuY3Rpb24nKSB7XG4gIHZhciBjaGRpciA9IHByb2Nlc3MuY2hkaXJcbiAgcHJvY2Vzcy5jaGRpciA9IGZ1bmN0aW9uIChkKSB7XG4gICAgY3dkID0gbnVsbFxuICAgIGNoZGlyLmNhbGwocHJvY2VzcywgZClcbiAgfVxuICBpZiAoT2JqZWN0LnNldFByb3RvdHlwZU9mKSBPYmplY3Quc2V0UHJvdG90eXBlT2YocHJvY2Vzcy5jaGRpciwgY2hkaXIpXG59XG5cbm1vZHVsZS5leHBvcnRzID0gcGF0Y2hcblxuZnVuY3Rpb24gcGF0Y2ggKGZzKSB7XG4gIC8vIChyZS0paW1wbGVtZW50IHNvbWUgdGhpbmdzIHRoYXQgYXJlIGtub3duIGJ1c3RlZCBvciBtaXNzaW5nLlxuXG4gIC8vIGxjaG1vZCwgYnJva2VuIHByaW9yIHRvIDAuNi4yXG4gIC8vIGJhY2stcG9ydCB0aGUgZml4IGhlcmUuXG4gIGlmIChjb25zdGFudHMuaGFzT3duUHJvcGVydHkoJ09fU1lNTElOSycpICYmXG4gICAgICBwcm9jZXNzLnZlcnNpb24ubWF0Y2goL152MFxcLjZcXC5bMC0yXXxedjBcXC41XFwuLykpIHtcbiAgICBwYXRjaExjaG1vZChmcylcbiAgfVxuXG4gIC8vIGx1dGltZXMgaW1wbGVtZW50YXRpb24sIG9yIG5vLW9wXG4gIGlmICghZnMubHV0aW1lcykge1xuICAgIHBhdGNoTHV0aW1lcyhmcylcbiAgfVxuXG4gIC8vIGh0dHBzOi8vZ2l0aHViLmNvbS9pc2FhY3Mvbm9kZS1ncmFjZWZ1bC1mcy9pc3N1ZXMvNFxuICAvLyBDaG93biBzaG91bGQgbm90IGZhaWwgb24gZWludmFsIG9yIGVwZXJtIGlmIG5vbi1yb290LlxuICAvLyBJdCBzaG91bGQgbm90IGZhaWwgb24gZW5vc3lzIGV2ZXIsIGFzIHRoaXMganVzdCBpbmRpY2F0ZXNcbiAgLy8gdGhhdCBhIGZzIGRvZXNuJ3Qgc3VwcG9ydCB0aGUgaW50ZW5kZWQgb3BlcmF0aW9uLlxuXG4gIGZzLmNob3duID0gY2hvd25GaXgoZnMuY2hvd24pXG4gIGZzLmZjaG93biA9IGNob3duRml4KGZzLmZjaG93bilcbiAgZnMubGNob3duID0gY2hvd25GaXgoZnMubGNob3duKVxuXG4gIGZzLmNobW9kID0gY2htb2RGaXgoZnMuY2htb2QpXG4gIGZzLmZjaG1vZCA9IGNobW9kRml4KGZzLmZjaG1vZClcbiAgZnMubGNobW9kID0gY2htb2RGaXgoZnMubGNobW9kKVxuXG4gIGZzLmNob3duU3luYyA9IGNob3duRml4U3luYyhmcy5jaG93blN5bmMpXG4gIGZzLmZjaG93blN5bmMgPSBjaG93bkZpeFN5bmMoZnMuZmNob3duU3luYylcbiAgZnMubGNob3duU3luYyA9IGNob3duRml4U3luYyhmcy5sY2hvd25TeW5jKVxuXG4gIGZzLmNobW9kU3luYyA9IGNobW9kRml4U3luYyhmcy5jaG1vZFN5bmMpXG4gIGZzLmZjaG1vZFN5bmMgPSBjaG1vZEZpeFN5bmMoZnMuZmNobW9kU3luYylcbiAgZnMubGNobW9kU3luYyA9IGNobW9kRml4U3luYyhmcy5sY2htb2RTeW5jKVxuXG4gIGZzLnN0YXQgPSBzdGF0Rml4KGZzLnN0YXQpXG4gIGZzLmZzdGF0ID0gc3RhdEZpeChmcy5mc3RhdClcbiAgZnMubHN0YXQgPSBzdGF0Rml4KGZzLmxzdGF0KVxuXG4gIGZzLnN0YXRTeW5jID0gc3RhdEZpeFN5bmMoZnMuc3RhdFN5bmMpXG4gIGZzLmZzdGF0U3luYyA9IHN0YXRGaXhTeW5jKGZzLmZzdGF0U3luYylcbiAgZnMubHN0YXRTeW5jID0gc3RhdEZpeFN5bmMoZnMubHN0YXRTeW5jKVxuXG4gIC8vIGlmIGxjaG1vZC9sY2hvd24gZG8gbm90IGV4aXN0LCB0aGVuIG1ha2UgdGhlbSBuby1vcHNcbiAgaWYgKGZzLmNobW9kICYmICFmcy5sY2htb2QpIHtcbiAgICBmcy5sY2htb2QgPSBmdW5jdGlvbiAocGF0aCwgbW9kZSwgY2IpIHtcbiAgICAgIGlmIChjYikgcHJvY2Vzcy5uZXh0VGljayhjYilcbiAgICB9XG4gICAgZnMubGNobW9kU3luYyA9IGZ1bmN0aW9uICgpIHt9XG4gIH1cbiAgaWYgKGZzLmNob3duICYmICFmcy5sY2hvd24pIHtcbiAgICBmcy5sY2hvd24gPSBmdW5jdGlvbiAocGF0aCwgdWlkLCBnaWQsIGNiKSB7XG4gICAgICBpZiAoY2IpIHByb2Nlc3MubmV4dFRpY2soY2IpXG4gICAgfVxuICAgIGZzLmxjaG93blN5bmMgPSBmdW5jdGlvbiAoKSB7fVxuICB9XG5cbiAgLy8gb24gV2luZG93cywgQS9WIHNvZnR3YXJlIGNhbiBsb2NrIHRoZSBkaXJlY3RvcnksIGNhdXNpbmcgdGhpc1xuICAvLyB0byBmYWlsIHdpdGggYW4gRUFDQ0VTIG9yIEVQRVJNIGlmIHRoZSBkaXJlY3RvcnkgY29udGFpbnMgbmV3bHlcbiAgLy8gY3JlYXRlZCBmaWxlcy4gIFRyeSBhZ2FpbiBvbiBmYWlsdXJlLCBmb3IgdXAgdG8gNjAgc2Vjb25kcy5cblxuICAvLyBTZXQgdGhlIHRpbWVvdXQgdGhpcyBsb25nIGJlY2F1c2Ugc29tZSBXaW5kb3dzIEFudGktVmlydXMsIHN1Y2ggYXMgUGFyaXR5XG4gIC8vIGJpdDksIG1heSBsb2NrIGZpbGVzIGZvciB1cCB0byBhIG1pbnV0ZSwgY2F1c2luZyBucG0gcGFja2FnZSBpbnN0YWxsXG4gIC8vIGZhaWx1cmVzLiBBbHNvLCB0YWtlIGNhcmUgdG8geWllbGQgdGhlIHNjaGVkdWxlci4gV2luZG93cyBzY2hlZHVsaW5nIGdpdmVzXG4gIC8vIENQVSB0byBhIGJ1c3kgbG9vcGluZyBwcm9jZXNzLCB3aGljaCBjYW4gY2F1c2UgdGhlIHByb2dyYW0gY2F1c2luZyB0aGUgbG9ja1xuICAvLyBjb250ZW50aW9uIHRvIGJlIHN0YXJ2ZWQgb2YgQ1BVIGJ5IG5vZGUsIHNvIHRoZSBjb250ZW50aW9uIGRvZXNuJ3QgcmVzb2x2ZS5cbiAgaWYgKHBsYXRmb3JtID09PSBcIndpbjMyXCIpIHtcbiAgICBmcy5yZW5hbWUgPSB0eXBlb2YgZnMucmVuYW1lICE9PSAnZnVuY3Rpb24nID8gZnMucmVuYW1lXG4gICAgOiAoZnVuY3Rpb24gKGZzJHJlbmFtZSkge1xuICAgICAgZnVuY3Rpb24gcmVuYW1lIChmcm9tLCB0bywgY2IpIHtcbiAgICAgICAgdmFyIHN0YXJ0ID0gRGF0ZS5ub3coKVxuICAgICAgICB2YXIgYmFja29mZiA9IDA7XG4gICAgICAgIGZzJHJlbmFtZShmcm9tLCB0bywgZnVuY3Rpb24gQ0IgKGVyKSB7XG4gICAgICAgICAgaWYgKGVyXG4gICAgICAgICAgICAgICYmIChlci5jb2RlID09PSBcIkVBQ0NFU1wiIHx8IGVyLmNvZGUgPT09IFwiRVBFUk1cIiB8fCBlci5jb2RlID09PSBcIkVCVVNZXCIpXG4gICAgICAgICAgICAgICYmIERhdGUubm93KCkgLSBzdGFydCA8IDYwMDAwKSB7XG4gICAgICAgICAgICBzZXRUaW1lb3V0KGZ1bmN0aW9uKCkge1xuICAgICAgICAgICAgICBmcy5zdGF0KHRvLCBmdW5jdGlvbiAoc3RhdGVyLCBzdCkge1xuICAgICAgICAgICAgICAgIGlmIChzdGF0ZXIgJiYgc3RhdGVyLmNvZGUgPT09IFwiRU5PRU5UXCIpXG4gICAgICAgICAgICAgICAgICBmcyRyZW5hbWUoZnJvbSwgdG8sIENCKTtcbiAgICAgICAgICAgICAgICBlbHNlXG4gICAgICAgICAgICAgICAgICBjYihlcilcbiAgICAgICAgICAgICAgfSlcbiAgICAgICAgICAgIH0sIGJhY2tvZmYpXG4gICAgICAgICAgICBpZiAoYmFja29mZiA8IDEwMClcbiAgICAgICAgICAgICAgYmFja29mZiArPSAxMDtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICB9XG4gICAgICAgICAgaWYgKGNiKSBjYihlcilcbiAgICAgICAgfSlcbiAgICAgIH1cbiAgICAgIGlmIChPYmplY3Quc2V0UHJvdG90eXBlT2YpIE9iamVjdC5zZXRQcm90b3R5cGVPZihyZW5hbWUsIGZzJHJlbmFtZSlcbiAgICAgIHJldHVybiByZW5hbWVcbiAgICB9KShmcy5yZW5hbWUpXG4gIH1cblxuICAvLyBpZiByZWFkKCkgcmV0dXJucyBFQUdBSU4sIHRoZW4ganVzdCB0cnkgaXQgYWdhaW4uXG4gIGZzLnJlYWQgPSB0eXBlb2YgZnMucmVhZCAhPT0gJ2Z1bmN0aW9uJyA/IGZzLnJlYWRcbiAgOiAoZnVuY3Rpb24gKGZzJHJlYWQpIHtcbiAgICBmdW5jdGlvbiByZWFkIChmZCwgYnVmZmVyLCBvZmZzZXQsIGxlbmd0aCwgcG9zaXRpb24sIGNhbGxiYWNrXykge1xuICAgICAgdmFyIGNhbGxiYWNrXG4gICAgICBpZiAoY2FsbGJhY2tfICYmIHR5cGVvZiBjYWxsYmFja18gPT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgdmFyIGVhZ0NvdW50ZXIgPSAwXG4gICAgICAgIGNhbGxiYWNrID0gZnVuY3Rpb24gKGVyLCBfLCBfXykge1xuICAgICAgICAgIGlmIChlciAmJiBlci5jb2RlID09PSAnRUFHQUlOJyAmJiBlYWdDb3VudGVyIDwgMTApIHtcbiAgICAgICAgICAgIGVhZ0NvdW50ZXIgKytcbiAgICAgICAgICAgIHJldHVybiBmcyRyZWFkLmNhbGwoZnMsIGZkLCBidWZmZXIsIG9mZnNldCwgbGVuZ3RoLCBwb3NpdGlvbiwgY2FsbGJhY2spXG4gICAgICAgICAgfVxuICAgICAgICAgIGNhbGxiYWNrXy5hcHBseSh0aGlzLCBhcmd1bWVudHMpXG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIHJldHVybiBmcyRyZWFkLmNhbGwoZnMsIGZkLCBidWZmZXIsIG9mZnNldCwgbGVuZ3RoLCBwb3NpdGlvbiwgY2FsbGJhY2spXG4gICAgfVxuXG4gICAgLy8gVGhpcyBlbnN1cmVzIGB1dGlsLnByb21pc2lmeWAgd29ya3MgYXMgaXQgZG9lcyBmb3IgbmF0aXZlIGBmcy5yZWFkYC5cbiAgICBpZiAoT2JqZWN0LnNldFByb3RvdHlwZU9mKSBPYmplY3Quc2V0UHJvdG90eXBlT2YocmVhZCwgZnMkcmVhZClcbiAgICByZXR1cm4gcmVhZFxuICB9KShmcy5yZWFkKVxuXG4gIGZzLnJlYWRTeW5jID0gdHlwZW9mIGZzLnJlYWRTeW5jICE9PSAnZnVuY3Rpb24nID8gZnMucmVhZFN5bmNcbiAgOiAoZnVuY3Rpb24gKGZzJHJlYWRTeW5jKSB7IHJldHVybiBmdW5jdGlvbiAoZmQsIGJ1ZmZlciwgb2Zmc2V0LCBsZW5ndGgsIHBvc2l0aW9uKSB7XG4gICAgdmFyIGVhZ0NvdW50ZXIgPSAwXG4gICAgd2hpbGUgKHRydWUpIHtcbiAgICAgIHRyeSB7XG4gICAgICAgIHJldHVybiBmcyRyZWFkU3luYy5jYWxsKGZzLCBmZCwgYnVmZmVyLCBvZmZzZXQsIGxlbmd0aCwgcG9zaXRpb24pXG4gICAgICB9IGNhdGNoIChlcikge1xuICAgICAgICBpZiAoZXIuY29kZSA9PT0gJ0VBR0FJTicgJiYgZWFnQ291bnRlciA8IDEwKSB7XG4gICAgICAgICAgZWFnQ291bnRlciArK1xuICAgICAgICAgIGNvbnRpbnVlXG4gICAgICAgIH1cbiAgICAgICAgdGhyb3cgZXJcbiAgICAgIH1cbiAgICB9XG4gIH19KShmcy5yZWFkU3luYylcblxuICBmdW5jdGlvbiBwYXRjaExjaG1vZCAoZnMpIHtcbiAgICBmcy5sY2htb2QgPSBmdW5jdGlvbiAocGF0aCwgbW9kZSwgY2FsbGJhY2spIHtcbiAgICAgIGZzLm9wZW4oIHBhdGhcbiAgICAgICAgICAgICAsIGNvbnN0YW50cy5PX1dST05MWSB8IGNvbnN0YW50cy5PX1NZTUxJTktcbiAgICAgICAgICAgICAsIG1vZGVcbiAgICAgICAgICAgICAsIGZ1bmN0aW9uIChlcnIsIGZkKSB7XG4gICAgICAgIGlmIChlcnIpIHtcbiAgICAgICAgICBpZiAoY2FsbGJhY2spIGNhbGxiYWNrKGVycilcbiAgICAgICAgICByZXR1cm5cbiAgICAgICAgfVxuICAgICAgICAvLyBwcmVmZXIgdG8gcmV0dXJuIHRoZSBjaG1vZCBlcnJvciwgaWYgb25lIG9jY3VycyxcbiAgICAgICAgLy8gYnV0IHN0aWxsIHRyeSB0byBjbG9zZSwgYW5kIHJlcG9ydCBjbG9zaW5nIGVycm9ycyBpZiB0aGV5IG9jY3VyLlxuICAgICAgICBmcy5mY2htb2QoZmQsIG1vZGUsIGZ1bmN0aW9uIChlcnIpIHtcbiAgICAgICAgICBmcy5jbG9zZShmZCwgZnVuY3Rpb24oZXJyMikge1xuICAgICAgICAgICAgaWYgKGNhbGxiYWNrKSBjYWxsYmFjayhlcnIgfHwgZXJyMilcbiAgICAgICAgICB9KVxuICAgICAgICB9KVxuICAgICAgfSlcbiAgICB9XG5cbiAgICBmcy5sY2htb2RTeW5jID0gZnVuY3Rpb24gKHBhdGgsIG1vZGUpIHtcbiAgICAgIHZhciBmZCA9IGZzLm9wZW5TeW5jKHBhdGgsIGNvbnN0YW50cy5PX1dST05MWSB8IGNvbnN0YW50cy5PX1NZTUxJTkssIG1vZGUpXG5cbiAgICAgIC8vIHByZWZlciB0byByZXR1cm4gdGhlIGNobW9kIGVycm9yLCBpZiBvbmUgb2NjdXJzLFxuICAgICAgLy8gYnV0IHN0aWxsIHRyeSB0byBjbG9zZSwgYW5kIHJlcG9ydCBjbG9zaW5nIGVycm9ycyBpZiB0aGV5IG9jY3VyLlxuICAgICAgdmFyIHRocmV3ID0gdHJ1ZVxuICAgICAgdmFyIHJldFxuICAgICAgdHJ5IHtcbiAgICAgICAgcmV0ID0gZnMuZmNobW9kU3luYyhmZCwgbW9kZSlcbiAgICAgICAgdGhyZXcgPSBmYWxzZVxuICAgICAgfSBmaW5hbGx5IHtcbiAgICAgICAgaWYgKHRocmV3KSB7XG4gICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIGZzLmNsb3NlU3luYyhmZClcbiAgICAgICAgICB9IGNhdGNoIChlcikge31cbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBmcy5jbG9zZVN5bmMoZmQpXG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIHJldHVybiByZXRcbiAgICB9XG4gIH1cblxuICBmdW5jdGlvbiBwYXRjaEx1dGltZXMgKGZzKSB7XG4gICAgaWYgKGNvbnN0YW50cy5oYXNPd25Qcm9wZXJ0eShcIk9fU1lNTElOS1wiKSAmJiBmcy5mdXRpbWVzKSB7XG4gICAgICBmcy5sdXRpbWVzID0gZnVuY3Rpb24gKHBhdGgsIGF0LCBtdCwgY2IpIHtcbiAgICAgICAgZnMub3BlbihwYXRoLCBjb25zdGFudHMuT19TWU1MSU5LLCBmdW5jdGlvbiAoZXIsIGZkKSB7XG4gICAgICAgICAgaWYgKGVyKSB7XG4gICAgICAgICAgICBpZiAoY2IpIGNiKGVyKVxuICAgICAgICAgICAgcmV0dXJuXG4gICAgICAgICAgfVxuICAgICAgICAgIGZzLmZ1dGltZXMoZmQsIGF0LCBtdCwgZnVuY3Rpb24gKGVyKSB7XG4gICAgICAgICAgICBmcy5jbG9zZShmZCwgZnVuY3Rpb24gKGVyMikge1xuICAgICAgICAgICAgICBpZiAoY2IpIGNiKGVyIHx8IGVyMilcbiAgICAgICAgICAgIH0pXG4gICAgICAgICAgfSlcbiAgICAgICAgfSlcbiAgICAgIH1cblxuICAgICAgZnMubHV0aW1lc1N5bmMgPSBmdW5jdGlvbiAocGF0aCwgYXQsIG10KSB7XG4gICAgICAgIHZhciBmZCA9IGZzLm9wZW5TeW5jKHBhdGgsIGNvbnN0YW50cy5PX1NZTUxJTkspXG4gICAgICAgIHZhciByZXRcbiAgICAgICAgdmFyIHRocmV3ID0gdHJ1ZVxuICAgICAgICB0cnkge1xuICAgICAgICAgIHJldCA9IGZzLmZ1dGltZXNTeW5jKGZkLCBhdCwgbXQpXG4gICAgICAgICAgdGhyZXcgPSBmYWxzZVxuICAgICAgICB9IGZpbmFsbHkge1xuICAgICAgICAgIGlmICh0aHJldykge1xuICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgZnMuY2xvc2VTeW5jKGZkKVxuICAgICAgICAgICAgfSBjYXRjaCAoZXIpIHt9XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGZzLmNsb3NlU3luYyhmZClcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHJldFxuICAgICAgfVxuXG4gICAgfSBlbHNlIGlmIChmcy5mdXRpbWVzKSB7XG4gICAgICBmcy5sdXRpbWVzID0gZnVuY3Rpb24gKF9hLCBfYiwgX2MsIGNiKSB7IGlmIChjYikgcHJvY2Vzcy5uZXh0VGljayhjYikgfVxuICAgICAgZnMubHV0aW1lc1N5bmMgPSBmdW5jdGlvbiAoKSB7fVxuICAgIH1cbiAgfVxuXG4gIGZ1bmN0aW9uIGNobW9kRml4IChvcmlnKSB7XG4gICAgaWYgKCFvcmlnKSByZXR1cm4gb3JpZ1xuICAgIHJldHVybiBmdW5jdGlvbiAodGFyZ2V0LCBtb2RlLCBjYikge1xuICAgICAgcmV0dXJuIG9yaWcuY2FsbChmcywgdGFyZ2V0LCBtb2RlLCBmdW5jdGlvbiAoZXIpIHtcbiAgICAgICAgaWYgKGNob3duRXJPayhlcikpIGVyID0gbnVsbFxuICAgICAgICBpZiAoY2IpIGNiLmFwcGx5KHRoaXMsIGFyZ3VtZW50cylcbiAgICAgIH0pXG4gICAgfVxuICB9XG5cbiAgZnVuY3Rpb24gY2htb2RGaXhTeW5jIChvcmlnKSB7XG4gICAgaWYgKCFvcmlnKSByZXR1cm4gb3JpZ1xuICAgIHJldHVybiBmdW5jdGlvbiAodGFyZ2V0LCBtb2RlKSB7XG4gICAgICB0cnkge1xuICAgICAgICByZXR1cm4gb3JpZy5jYWxsKGZzLCB0YXJnZXQsIG1vZGUpXG4gICAgICB9IGNhdGNoIChlcikge1xuICAgICAgICBpZiAoIWNob3duRXJPayhlcikpIHRocm93IGVyXG4gICAgICB9XG4gICAgfVxuICB9XG5cblxuICBmdW5jdGlvbiBjaG93bkZpeCAob3JpZykge1xuICAgIGlmICghb3JpZykgcmV0dXJuIG9yaWdcbiAgICByZXR1cm4gZnVuY3Rpb24gKHRhcmdldCwgdWlkLCBnaWQsIGNiKSB7XG4gICAgICByZXR1cm4gb3JpZy5jYWxsKGZzLCB0YXJnZXQsIHVpZCwgZ2lkLCBmdW5jdGlvbiAoZXIpIHtcbiAgICAgICAgaWYgKGNob3duRXJPayhlcikpIGVyID0gbnVsbFxuICAgICAgICBpZiAoY2IpIGNiLmFwcGx5KHRoaXMsIGFyZ3VtZW50cylcbiAgICAgIH0pXG4gICAgfVxuICB9XG5cbiAgZnVuY3Rpb24gY2hvd25GaXhTeW5jIChvcmlnKSB7XG4gICAgaWYgKCFvcmlnKSByZXR1cm4gb3JpZ1xuICAgIHJldHVybiBmdW5jdGlvbiAodGFyZ2V0LCB1aWQsIGdpZCkge1xuICAgICAgdHJ5IHtcbiAgICAgICAgcmV0dXJuIG9yaWcuY2FsbChmcywgdGFyZ2V0LCB1aWQsIGdpZClcbiAgICAgIH0gY2F0Y2ggKGVyKSB7XG4gICAgICAgIGlmICghY2hvd25Fck9rKGVyKSkgdGhyb3cgZXJcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICBmdW5jdGlvbiBzdGF0Rml4IChvcmlnKSB7XG4gICAgaWYgKCFvcmlnKSByZXR1cm4gb3JpZ1xuICAgIC8vIE9sZGVyIHZlcnNpb25zIG9mIE5vZGUgZXJyb25lb3VzbHkgcmV0dXJuZWQgc2lnbmVkIGludGVnZXJzIGZvclxuICAgIC8vIHVpZCArIGdpZC5cbiAgICByZXR1cm4gZnVuY3Rpb24gKHRhcmdldCwgb3B0aW9ucywgY2IpIHtcbiAgICAgIGlmICh0eXBlb2Ygb3B0aW9ucyA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICBjYiA9IG9wdGlvbnNcbiAgICAgICAgb3B0aW9ucyA9IG51bGxcbiAgICAgIH1cbiAgICAgIGZ1bmN0aW9uIGNhbGxiYWNrIChlciwgc3RhdHMpIHtcbiAgICAgICAgaWYgKHN0YXRzKSB7XG4gICAgICAgICAgaWYgKHN0YXRzLnVpZCA8IDApIHN0YXRzLnVpZCArPSAweDEwMDAwMDAwMFxuICAgICAgICAgIGlmIChzdGF0cy5naWQgPCAwKSBzdGF0cy5naWQgKz0gMHgxMDAwMDAwMDBcbiAgICAgICAgfVxuICAgICAgICBpZiAoY2IpIGNiLmFwcGx5KHRoaXMsIGFyZ3VtZW50cylcbiAgICAgIH1cbiAgICAgIHJldHVybiBvcHRpb25zID8gb3JpZy5jYWxsKGZzLCB0YXJnZXQsIG9wdGlvbnMsIGNhbGxiYWNrKVxuICAgICAgICA6IG9yaWcuY2FsbChmcywgdGFyZ2V0LCBjYWxsYmFjaylcbiAgICB9XG4gIH1cblxuICBmdW5jdGlvbiBzdGF0Rml4U3luYyAob3JpZykge1xuICAgIGlmICghb3JpZykgcmV0dXJuIG9yaWdcbiAgICAvLyBPbGRlciB2ZXJzaW9ucyBvZiBOb2RlIGVycm9uZW91c2x5IHJldHVybmVkIHNpZ25lZCBpbnRlZ2VycyBmb3JcbiAgICAvLyB1aWQgKyBnaWQuXG4gICAgcmV0dXJuIGZ1bmN0aW9uICh0YXJnZXQsIG9wdGlvbnMpIHtcbiAgICAgIHZhciBzdGF0cyA9IG9wdGlvbnMgPyBvcmlnLmNhbGwoZnMsIHRhcmdldCwgb3B0aW9ucylcbiAgICAgICAgOiBvcmlnLmNhbGwoZnMsIHRhcmdldClcbiAgICAgIGlmIChzdGF0cykge1xuICAgICAgICBpZiAoc3RhdHMudWlkIDwgMCkgc3RhdHMudWlkICs9IDB4MTAwMDAwMDAwXG4gICAgICAgIGlmIChzdGF0cy5naWQgPCAwKSBzdGF0cy5naWQgKz0gMHgxMDAwMDAwMDBcbiAgICAgIH1cbiAgICAgIHJldHVybiBzdGF0cztcbiAgICB9XG4gIH1cblxuICAvLyBFTk9TWVMgbWVhbnMgdGhhdCB0aGUgZnMgZG9lc24ndCBzdXBwb3J0IHRoZSBvcC4gSnVzdCBpZ25vcmVcbiAgLy8gdGhhdCwgYmVjYXVzZSBpdCBkb2Vzbid0IG1hdHRlci5cbiAgLy9cbiAgLy8gaWYgdGhlcmUncyBubyBnZXR1aWQsIG9yIGlmIGdldHVpZCgpIGlzIHNvbWV0aGluZyBvdGhlclxuICAvLyB0aGFuIDAsIGFuZCB0aGUgZXJyb3IgaXMgRUlOVkFMIG9yIEVQRVJNLCB0aGVuIGp1c3QgaWdub3JlXG4gIC8vIGl0LlxuICAvL1xuICAvLyBUaGlzIHNwZWNpZmljIGNhc2UgaXMgYSBzaWxlbnQgZmFpbHVyZSBpbiBjcCwgaW5zdGFsbCwgdGFyLFxuICAvLyBhbmQgbW9zdCBvdGhlciB1bml4IHRvb2xzIHRoYXQgbWFuYWdlIHBlcm1pc3Npb25zLlxuICAvL1xuICAvLyBXaGVuIHJ1bm5pbmcgYXMgcm9vdCwgb3IgaWYgb3RoZXIgdHlwZXMgb2YgZXJyb3JzIGFyZVxuICAvLyBlbmNvdW50ZXJlZCwgdGhlbiBpdCdzIHN0cmljdC5cbiAgZnVuY3Rpb24gY2hvd25Fck9rIChlcikge1xuICAgIGlmICghZXIpXG4gICAgICByZXR1cm4gdHJ1ZVxuXG4gICAgaWYgKGVyLmNvZGUgPT09IFwiRU5PU1lTXCIpXG4gICAgICByZXR1cm4gdHJ1ZVxuXG4gICAgdmFyIG5vbnJvb3QgPSAhcHJvY2Vzcy5nZXR1aWQgfHwgcHJvY2Vzcy5nZXR1aWQoKSAhPT0gMFxuICAgIGlmIChub25yb290KSB7XG4gICAgICBpZiAoZXIuY29kZSA9PT0gXCJFSU5WQUxcIiB8fCBlci5jb2RlID09PSBcIkVQRVJNXCIpXG4gICAgICAgIHJldHVybiB0cnVlXG4gICAgfVxuXG4gICAgcmV0dXJuIGZhbHNlXG4gIH1cbn1cbiIsCiAgICAidmFyIFN0cmVhbSA9IHJlcXVpcmUoJ3N0cmVhbScpLlN0cmVhbVxuXG5tb2R1bGUuZXhwb3J0cyA9IGxlZ2FjeVxuXG5mdW5jdGlvbiBsZWdhY3kgKGZzKSB7XG4gIHJldHVybiB7XG4gICAgUmVhZFN0cmVhbTogUmVhZFN0cmVhbSxcbiAgICBXcml0ZVN0cmVhbTogV3JpdGVTdHJlYW1cbiAgfVxuXG4gIGZ1bmN0aW9uIFJlYWRTdHJlYW0gKHBhdGgsIG9wdGlvbnMpIHtcbiAgICBpZiAoISh0aGlzIGluc3RhbmNlb2YgUmVhZFN0cmVhbSkpIHJldHVybiBuZXcgUmVhZFN0cmVhbShwYXRoLCBvcHRpb25zKTtcblxuICAgIFN0cmVhbS5jYWxsKHRoaXMpO1xuXG4gICAgdmFyIHNlbGYgPSB0aGlzO1xuXG4gICAgdGhpcy5wYXRoID0gcGF0aDtcbiAgICB0aGlzLmZkID0gbnVsbDtcbiAgICB0aGlzLnJlYWRhYmxlID0gdHJ1ZTtcbiAgICB0aGlzLnBhdXNlZCA9IGZhbHNlO1xuXG4gICAgdGhpcy5mbGFncyA9ICdyJztcbiAgICB0aGlzLm1vZGUgPSA0Mzg7IC8qPTA2NjYqL1xuICAgIHRoaXMuYnVmZmVyU2l6ZSA9IDY0ICogMTAyNDtcblxuICAgIG9wdGlvbnMgPSBvcHRpb25zIHx8IHt9O1xuXG4gICAgLy8gTWl4aW4gb3B0aW9ucyBpbnRvIHRoaXNcbiAgICB2YXIga2V5cyA9IE9iamVjdC5rZXlzKG9wdGlvbnMpO1xuICAgIGZvciAodmFyIGluZGV4ID0gMCwgbGVuZ3RoID0ga2V5cy5sZW5ndGg7IGluZGV4IDwgbGVuZ3RoOyBpbmRleCsrKSB7XG4gICAgICB2YXIga2V5ID0ga2V5c1tpbmRleF07XG4gICAgICB0aGlzW2tleV0gPSBvcHRpb25zW2tleV07XG4gICAgfVxuXG4gICAgaWYgKHRoaXMuZW5jb2RpbmcpIHRoaXMuc2V0RW5jb2RpbmcodGhpcy5lbmNvZGluZyk7XG5cbiAgICBpZiAodGhpcy5zdGFydCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICBpZiAoJ251bWJlcicgIT09IHR5cGVvZiB0aGlzLnN0YXJ0KSB7XG4gICAgICAgIHRocm93IFR5cGVFcnJvcignc3RhcnQgbXVzdCBiZSBhIE51bWJlcicpO1xuICAgICAgfVxuICAgICAgaWYgKHRoaXMuZW5kID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgdGhpcy5lbmQgPSBJbmZpbml0eTtcbiAgICAgIH0gZWxzZSBpZiAoJ251bWJlcicgIT09IHR5cGVvZiB0aGlzLmVuZCkge1xuICAgICAgICB0aHJvdyBUeXBlRXJyb3IoJ2VuZCBtdXN0IGJlIGEgTnVtYmVyJyk7XG4gICAgICB9XG5cbiAgICAgIGlmICh0aGlzLnN0YXJ0ID4gdGhpcy5lbmQpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdzdGFydCBtdXN0IGJlIDw9IGVuZCcpO1xuICAgICAgfVxuXG4gICAgICB0aGlzLnBvcyA9IHRoaXMuc3RhcnQ7XG4gICAgfVxuXG4gICAgaWYgKHRoaXMuZmQgIT09IG51bGwpIHtcbiAgICAgIHByb2Nlc3MubmV4dFRpY2soZnVuY3Rpb24oKSB7XG4gICAgICAgIHNlbGYuX3JlYWQoKTtcbiAgICAgIH0pO1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGZzLm9wZW4odGhpcy5wYXRoLCB0aGlzLmZsYWdzLCB0aGlzLm1vZGUsIGZ1bmN0aW9uIChlcnIsIGZkKSB7XG4gICAgICBpZiAoZXJyKSB7XG4gICAgICAgIHNlbGYuZW1pdCgnZXJyb3InLCBlcnIpO1xuICAgICAgICBzZWxmLnJlYWRhYmxlID0gZmFsc2U7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cblxuICAgICAgc2VsZi5mZCA9IGZkO1xuICAgICAgc2VsZi5lbWl0KCdvcGVuJywgZmQpO1xuICAgICAgc2VsZi5fcmVhZCgpO1xuICAgIH0pXG4gIH1cblxuICBmdW5jdGlvbiBXcml0ZVN0cmVhbSAocGF0aCwgb3B0aW9ucykge1xuICAgIGlmICghKHRoaXMgaW5zdGFuY2VvZiBXcml0ZVN0cmVhbSkpIHJldHVybiBuZXcgV3JpdGVTdHJlYW0ocGF0aCwgb3B0aW9ucyk7XG5cbiAgICBTdHJlYW0uY2FsbCh0aGlzKTtcblxuICAgIHRoaXMucGF0aCA9IHBhdGg7XG4gICAgdGhpcy5mZCA9IG51bGw7XG4gICAgdGhpcy53cml0YWJsZSA9IHRydWU7XG5cbiAgICB0aGlzLmZsYWdzID0gJ3cnO1xuICAgIHRoaXMuZW5jb2RpbmcgPSAnYmluYXJ5JztcbiAgICB0aGlzLm1vZGUgPSA0Mzg7IC8qPTA2NjYqL1xuICAgIHRoaXMuYnl0ZXNXcml0dGVuID0gMDtcblxuICAgIG9wdGlvbnMgPSBvcHRpb25zIHx8IHt9O1xuXG4gICAgLy8gTWl4aW4gb3B0aW9ucyBpbnRvIHRoaXNcbiAgICB2YXIga2V5cyA9IE9iamVjdC5rZXlzKG9wdGlvbnMpO1xuICAgIGZvciAodmFyIGluZGV4ID0gMCwgbGVuZ3RoID0ga2V5cy5sZW5ndGg7IGluZGV4IDwgbGVuZ3RoOyBpbmRleCsrKSB7XG4gICAgICB2YXIga2V5ID0ga2V5c1tpbmRleF07XG4gICAgICB0aGlzW2tleV0gPSBvcHRpb25zW2tleV07XG4gICAgfVxuXG4gICAgaWYgKHRoaXMuc3RhcnQgIT09IHVuZGVmaW5lZCkge1xuICAgICAgaWYgKCdudW1iZXInICE9PSB0eXBlb2YgdGhpcy5zdGFydCkge1xuICAgICAgICB0aHJvdyBUeXBlRXJyb3IoJ3N0YXJ0IG11c3QgYmUgYSBOdW1iZXInKTtcbiAgICAgIH1cbiAgICAgIGlmICh0aGlzLnN0YXJ0IDwgMCkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ3N0YXJ0IG11c3QgYmUgPj0gemVybycpO1xuICAgICAgfVxuXG4gICAgICB0aGlzLnBvcyA9IHRoaXMuc3RhcnQ7XG4gICAgfVxuXG4gICAgdGhpcy5idXN5ID0gZmFsc2U7XG4gICAgdGhpcy5fcXVldWUgPSBbXTtcblxuICAgIGlmICh0aGlzLmZkID09PSBudWxsKSB7XG4gICAgICB0aGlzLl9vcGVuID0gZnMub3BlbjtcbiAgICAgIHRoaXMuX3F1ZXVlLnB1c2goW3RoaXMuX29wZW4sIHRoaXMucGF0aCwgdGhpcy5mbGFncywgdGhpcy5tb2RlLCB1bmRlZmluZWRdKTtcbiAgICAgIHRoaXMuZmx1c2goKTtcbiAgICB9XG4gIH1cbn1cbiIsCiAgICAiJ3VzZSBzdHJpY3QnXG5cbm1vZHVsZS5leHBvcnRzID0gY2xvbmVcblxudmFyIGdldFByb3RvdHlwZU9mID0gT2JqZWN0LmdldFByb3RvdHlwZU9mIHx8IGZ1bmN0aW9uIChvYmopIHtcbiAgcmV0dXJuIG9iai5fX3Byb3RvX19cbn1cblxuZnVuY3Rpb24gY2xvbmUgKG9iaikge1xuICBpZiAob2JqID09PSBudWxsIHx8IHR5cGVvZiBvYmogIT09ICdvYmplY3QnKVxuICAgIHJldHVybiBvYmpcblxuICBpZiAob2JqIGluc3RhbmNlb2YgT2JqZWN0KVxuICAgIHZhciBjb3B5ID0geyBfX3Byb3RvX186IGdldFByb3RvdHlwZU9mKG9iaikgfVxuICBlbHNlXG4gICAgdmFyIGNvcHkgPSBPYmplY3QuY3JlYXRlKG51bGwpXG5cbiAgT2JqZWN0LmdldE93blByb3BlcnR5TmFtZXMob2JqKS5mb3JFYWNoKGZ1bmN0aW9uIChrZXkpIHtcbiAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkoY29weSwga2V5LCBPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKG9iaiwga2V5KSlcbiAgfSlcblxuICByZXR1cm4gY29weVxufVxuIiwKICAgICJ2YXIgZnMgPSByZXF1aXJlKCdmcycpXG52YXIgcG9seWZpbGxzID0gcmVxdWlyZSgnLi9wb2x5ZmlsbHMuanMnKVxudmFyIGxlZ2FjeSA9IHJlcXVpcmUoJy4vbGVnYWN5LXN0cmVhbXMuanMnKVxudmFyIGNsb25lID0gcmVxdWlyZSgnLi9jbG9uZS5qcycpXG5cbnZhciB1dGlsID0gcmVxdWlyZSgndXRpbCcpXG5cbi8qIGlzdGFuYnVsIGlnbm9yZSBuZXh0IC0gbm9kZSAwLnggcG9seWZpbGwgKi9cbnZhciBncmFjZWZ1bFF1ZXVlXG52YXIgcHJldmlvdXNTeW1ib2xcblxuLyogaXN0YW5idWwgaWdub3JlIGVsc2UgLSBub2RlIDAueCBwb2x5ZmlsbCAqL1xuaWYgKHR5cGVvZiBTeW1ib2wgPT09ICdmdW5jdGlvbicgJiYgdHlwZW9mIFN5bWJvbC5mb3IgPT09ICdmdW5jdGlvbicpIHtcbiAgZ3JhY2VmdWxRdWV1ZSA9IFN5bWJvbC5mb3IoJ2dyYWNlZnVsLWZzLnF1ZXVlJylcbiAgLy8gVGhpcyBpcyB1c2VkIGluIHRlc3RpbmcgYnkgZnV0dXJlIHZlcnNpb25zXG4gIHByZXZpb3VzU3ltYm9sID0gU3ltYm9sLmZvcignZ3JhY2VmdWwtZnMucHJldmlvdXMnKVxufSBlbHNlIHtcbiAgZ3JhY2VmdWxRdWV1ZSA9ICdfX19ncmFjZWZ1bC1mcy5xdWV1ZSdcbiAgcHJldmlvdXNTeW1ib2wgPSAnX19fZ3JhY2VmdWwtZnMucHJldmlvdXMnXG59XG5cbmZ1bmN0aW9uIG5vb3AgKCkge31cblxuZnVuY3Rpb24gcHVibGlzaFF1ZXVlKGNvbnRleHQsIHF1ZXVlKSB7XG4gIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShjb250ZXh0LCBncmFjZWZ1bFF1ZXVlLCB7XG4gICAgZ2V0OiBmdW5jdGlvbigpIHtcbiAgICAgIHJldHVybiBxdWV1ZVxuICAgIH1cbiAgfSlcbn1cblxudmFyIGRlYnVnID0gbm9vcFxuaWYgKHV0aWwuZGVidWdsb2cpXG4gIGRlYnVnID0gdXRpbC5kZWJ1Z2xvZygnZ2ZzNCcpXG5lbHNlIGlmICgvXFxiZ2ZzNFxcYi9pLnRlc3QocHJvY2Vzcy5lbnYuTk9ERV9ERUJVRyB8fCAnJykpXG4gIGRlYnVnID0gZnVuY3Rpb24oKSB7XG4gICAgdmFyIG0gPSB1dGlsLmZvcm1hdC5hcHBseSh1dGlsLCBhcmd1bWVudHMpXG4gICAgbSA9ICdHRlM0OiAnICsgbS5zcGxpdCgvXFxuLykuam9pbignXFxuR0ZTNDogJylcbiAgICBjb25zb2xlLmVycm9yKG0pXG4gIH1cblxuLy8gT25jZSB0aW1lIGluaXRpYWxpemF0aW9uXG5pZiAoIWZzW2dyYWNlZnVsUXVldWVdKSB7XG4gIC8vIFRoaXMgcXVldWUgY2FuIGJlIHNoYXJlZCBieSBtdWx0aXBsZSBsb2FkZWQgaW5zdGFuY2VzXG4gIHZhciBxdWV1ZSA9IGdsb2JhbFtncmFjZWZ1bFF1ZXVlXSB8fCBbXVxuICBwdWJsaXNoUXVldWUoZnMsIHF1ZXVlKVxuXG4gIC8vIFBhdGNoIGZzLmNsb3NlL2Nsb3NlU3luYyB0byBzaGFyZWQgcXVldWUgdmVyc2lvbiwgYmVjYXVzZSB3ZSBuZWVkXG4gIC8vIHRvIHJldHJ5KCkgd2hlbmV2ZXIgYSBjbG9zZSBoYXBwZW5zICphbnl3aGVyZSogaW4gdGhlIHByb2dyYW0uXG4gIC8vIFRoaXMgaXMgZXNzZW50aWFsIHdoZW4gbXVsdGlwbGUgZ3JhY2VmdWwtZnMgaW5zdGFuY2VzIGFyZVxuICAvLyBpbiBwbGF5IGF0IHRoZSBzYW1lIHRpbWUuXG4gIGZzLmNsb3NlID0gKGZ1bmN0aW9uIChmcyRjbG9zZSkge1xuICAgIGZ1bmN0aW9uIGNsb3NlIChmZCwgY2IpIHtcbiAgICAgIHJldHVybiBmcyRjbG9zZS5jYWxsKGZzLCBmZCwgZnVuY3Rpb24gKGVycikge1xuICAgICAgICAvLyBUaGlzIGZ1bmN0aW9uIHVzZXMgdGhlIGdyYWNlZnVsLWZzIHNoYXJlZCBxdWV1ZVxuICAgICAgICBpZiAoIWVycikge1xuICAgICAgICAgIHJlc2V0UXVldWUoKVxuICAgICAgICB9XG5cbiAgICAgICAgaWYgKHR5cGVvZiBjYiA9PT0gJ2Z1bmN0aW9uJylcbiAgICAgICAgICBjYi5hcHBseSh0aGlzLCBhcmd1bWVudHMpXG4gICAgICB9KVxuICAgIH1cblxuICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShjbG9zZSwgcHJldmlvdXNTeW1ib2wsIHtcbiAgICAgIHZhbHVlOiBmcyRjbG9zZVxuICAgIH0pXG4gICAgcmV0dXJuIGNsb3NlXG4gIH0pKGZzLmNsb3NlKVxuXG4gIGZzLmNsb3NlU3luYyA9IChmdW5jdGlvbiAoZnMkY2xvc2VTeW5jKSB7XG4gICAgZnVuY3Rpb24gY2xvc2VTeW5jIChmZCkge1xuICAgICAgLy8gVGhpcyBmdW5jdGlvbiB1c2VzIHRoZSBncmFjZWZ1bC1mcyBzaGFyZWQgcXVldWVcbiAgICAgIGZzJGNsb3NlU3luYy5hcHBseShmcywgYXJndW1lbnRzKVxuICAgICAgcmVzZXRRdWV1ZSgpXG4gICAgfVxuXG4gICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KGNsb3NlU3luYywgcHJldmlvdXNTeW1ib2wsIHtcbiAgICAgIHZhbHVlOiBmcyRjbG9zZVN5bmNcbiAgICB9KVxuICAgIHJldHVybiBjbG9zZVN5bmNcbiAgfSkoZnMuY2xvc2VTeW5jKVxuXG4gIGlmICgvXFxiZ2ZzNFxcYi9pLnRlc3QocHJvY2Vzcy5lbnYuTk9ERV9ERUJVRyB8fCAnJykpIHtcbiAgICBwcm9jZXNzLm9uKCdleGl0JywgZnVuY3Rpb24oKSB7XG4gICAgICBkZWJ1Zyhmc1tncmFjZWZ1bFF1ZXVlXSlcbiAgICAgIHJlcXVpcmUoJ2Fzc2VydCcpLmVxdWFsKGZzW2dyYWNlZnVsUXVldWVdLmxlbmd0aCwgMClcbiAgICB9KVxuICB9XG59XG5cbmlmICghZ2xvYmFsW2dyYWNlZnVsUXVldWVdKSB7XG4gIHB1Ymxpc2hRdWV1ZShnbG9iYWwsIGZzW2dyYWNlZnVsUXVldWVdKTtcbn1cblxubW9kdWxlLmV4cG9ydHMgPSBwYXRjaChjbG9uZShmcykpXG5pZiAocHJvY2Vzcy5lbnYuVEVTVF9HUkFDRUZVTF9GU19HTE9CQUxfUEFUQ0ggJiYgIWZzLl9fcGF0Y2hlZCkge1xuICAgIG1vZHVsZS5leHBvcnRzID0gcGF0Y2goZnMpXG4gICAgZnMuX19wYXRjaGVkID0gdHJ1ZTtcbn1cblxuZnVuY3Rpb24gcGF0Y2ggKGZzKSB7XG4gIC8vIEV2ZXJ5dGhpbmcgdGhhdCByZWZlcmVuY2VzIHRoZSBvcGVuKCkgZnVuY3Rpb24gbmVlZHMgdG8gYmUgaW4gaGVyZVxuICBwb2x5ZmlsbHMoZnMpXG4gIGZzLmdyYWNlZnVsaWZ5ID0gcGF0Y2hcblxuICBmcy5jcmVhdGVSZWFkU3RyZWFtID0gY3JlYXRlUmVhZFN0cmVhbVxuICBmcy5jcmVhdGVXcml0ZVN0cmVhbSA9IGNyZWF0ZVdyaXRlU3RyZWFtXG4gIHZhciBmcyRyZWFkRmlsZSA9IGZzLnJlYWRGaWxlXG4gIGZzLnJlYWRGaWxlID0gcmVhZEZpbGVcbiAgZnVuY3Rpb24gcmVhZEZpbGUgKHBhdGgsIG9wdGlvbnMsIGNiKSB7XG4gICAgaWYgKHR5cGVvZiBvcHRpb25zID09PSAnZnVuY3Rpb24nKVxuICAgICAgY2IgPSBvcHRpb25zLCBvcHRpb25zID0gbnVsbFxuXG4gICAgcmV0dXJuIGdvJHJlYWRGaWxlKHBhdGgsIG9wdGlvbnMsIGNiKVxuXG4gICAgZnVuY3Rpb24gZ28kcmVhZEZpbGUgKHBhdGgsIG9wdGlvbnMsIGNiLCBzdGFydFRpbWUpIHtcbiAgICAgIHJldHVybiBmcyRyZWFkRmlsZShwYXRoLCBvcHRpb25zLCBmdW5jdGlvbiAoZXJyKSB7XG4gICAgICAgIGlmIChlcnIgJiYgKGVyci5jb2RlID09PSAnRU1GSUxFJyB8fCBlcnIuY29kZSA9PT0gJ0VORklMRScpKVxuICAgICAgICAgIGVucXVldWUoW2dvJHJlYWRGaWxlLCBbcGF0aCwgb3B0aW9ucywgY2JdLCBlcnIsIHN0YXJ0VGltZSB8fCBEYXRlLm5vdygpLCBEYXRlLm5vdygpXSlcbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgaWYgKHR5cGVvZiBjYiA9PT0gJ2Z1bmN0aW9uJylcbiAgICAgICAgICAgIGNiLmFwcGx5KHRoaXMsIGFyZ3VtZW50cylcbiAgICAgICAgfVxuICAgICAgfSlcbiAgICB9XG4gIH1cblxuICB2YXIgZnMkd3JpdGVGaWxlID0gZnMud3JpdGVGaWxlXG4gIGZzLndyaXRlRmlsZSA9IHdyaXRlRmlsZVxuICBmdW5jdGlvbiB3cml0ZUZpbGUgKHBhdGgsIGRhdGEsIG9wdGlvbnMsIGNiKSB7XG4gICAgaWYgKHR5cGVvZiBvcHRpb25zID09PSAnZnVuY3Rpb24nKVxuICAgICAgY2IgPSBvcHRpb25zLCBvcHRpb25zID0gbnVsbFxuXG4gICAgcmV0dXJuIGdvJHdyaXRlRmlsZShwYXRoLCBkYXRhLCBvcHRpb25zLCBjYilcblxuICAgIGZ1bmN0aW9uIGdvJHdyaXRlRmlsZSAocGF0aCwgZGF0YSwgb3B0aW9ucywgY2IsIHN0YXJ0VGltZSkge1xuICAgICAgcmV0dXJuIGZzJHdyaXRlRmlsZShwYXRoLCBkYXRhLCBvcHRpb25zLCBmdW5jdGlvbiAoZXJyKSB7XG4gICAgICAgIGlmIChlcnIgJiYgKGVyci5jb2RlID09PSAnRU1GSUxFJyB8fCBlcnIuY29kZSA9PT0gJ0VORklMRScpKVxuICAgICAgICAgIGVucXVldWUoW2dvJHdyaXRlRmlsZSwgW3BhdGgsIGRhdGEsIG9wdGlvbnMsIGNiXSwgZXJyLCBzdGFydFRpbWUgfHwgRGF0ZS5ub3coKSwgRGF0ZS5ub3coKV0pXG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgIGlmICh0eXBlb2YgY2IgPT09ICdmdW5jdGlvbicpXG4gICAgICAgICAgICBjYi5hcHBseSh0aGlzLCBhcmd1bWVudHMpXG4gICAgICAgIH1cbiAgICAgIH0pXG4gICAgfVxuICB9XG5cbiAgdmFyIGZzJGFwcGVuZEZpbGUgPSBmcy5hcHBlbmRGaWxlXG4gIGlmIChmcyRhcHBlbmRGaWxlKVxuICAgIGZzLmFwcGVuZEZpbGUgPSBhcHBlbmRGaWxlXG4gIGZ1bmN0aW9uIGFwcGVuZEZpbGUgKHBhdGgsIGRhdGEsIG9wdGlvbnMsIGNiKSB7XG4gICAgaWYgKHR5cGVvZiBvcHRpb25zID09PSAnZnVuY3Rpb24nKVxuICAgICAgY2IgPSBvcHRpb25zLCBvcHRpb25zID0gbnVsbFxuXG4gICAgcmV0dXJuIGdvJGFwcGVuZEZpbGUocGF0aCwgZGF0YSwgb3B0aW9ucywgY2IpXG5cbiAgICBmdW5jdGlvbiBnbyRhcHBlbmRGaWxlIChwYXRoLCBkYXRhLCBvcHRpb25zLCBjYiwgc3RhcnRUaW1lKSB7XG4gICAgICByZXR1cm4gZnMkYXBwZW5kRmlsZShwYXRoLCBkYXRhLCBvcHRpb25zLCBmdW5jdGlvbiAoZXJyKSB7XG4gICAgICAgIGlmIChlcnIgJiYgKGVyci5jb2RlID09PSAnRU1GSUxFJyB8fCBlcnIuY29kZSA9PT0gJ0VORklMRScpKVxuICAgICAgICAgIGVucXVldWUoW2dvJGFwcGVuZEZpbGUsIFtwYXRoLCBkYXRhLCBvcHRpb25zLCBjYl0sIGVyciwgc3RhcnRUaW1lIHx8IERhdGUubm93KCksIERhdGUubm93KCldKVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICBpZiAodHlwZW9mIGNiID09PSAnZnVuY3Rpb24nKVxuICAgICAgICAgICAgY2IuYXBwbHkodGhpcywgYXJndW1lbnRzKVxuICAgICAgICB9XG4gICAgICB9KVxuICAgIH1cbiAgfVxuXG4gIHZhciBmcyRjb3B5RmlsZSA9IGZzLmNvcHlGaWxlXG4gIGlmIChmcyRjb3B5RmlsZSlcbiAgICBmcy5jb3B5RmlsZSA9IGNvcHlGaWxlXG4gIGZ1bmN0aW9uIGNvcHlGaWxlIChzcmMsIGRlc3QsIGZsYWdzLCBjYikge1xuICAgIGlmICh0eXBlb2YgZmxhZ3MgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgIGNiID0gZmxhZ3NcbiAgICAgIGZsYWdzID0gMFxuICAgIH1cbiAgICByZXR1cm4gZ28kY29weUZpbGUoc3JjLCBkZXN0LCBmbGFncywgY2IpXG5cbiAgICBmdW5jdGlvbiBnbyRjb3B5RmlsZSAoc3JjLCBkZXN0LCBmbGFncywgY2IsIHN0YXJ0VGltZSkge1xuICAgICAgcmV0dXJuIGZzJGNvcHlGaWxlKHNyYywgZGVzdCwgZmxhZ3MsIGZ1bmN0aW9uIChlcnIpIHtcbiAgICAgICAgaWYgKGVyciAmJiAoZXJyLmNvZGUgPT09ICdFTUZJTEUnIHx8IGVyci5jb2RlID09PSAnRU5GSUxFJykpXG4gICAgICAgICAgZW5xdWV1ZShbZ28kY29weUZpbGUsIFtzcmMsIGRlc3QsIGZsYWdzLCBjYl0sIGVyciwgc3RhcnRUaW1lIHx8IERhdGUubm93KCksIERhdGUubm93KCldKVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICBpZiAodHlwZW9mIGNiID09PSAnZnVuY3Rpb24nKVxuICAgICAgICAgICAgY2IuYXBwbHkodGhpcywgYXJndW1lbnRzKVxuICAgICAgICB9XG4gICAgICB9KVxuICAgIH1cbiAgfVxuXG4gIHZhciBmcyRyZWFkZGlyID0gZnMucmVhZGRpclxuICBmcy5yZWFkZGlyID0gcmVhZGRpclxuICB2YXIgbm9SZWFkZGlyT3B0aW9uVmVyc2lvbnMgPSAvXnZbMC01XVxcLi9cbiAgZnVuY3Rpb24gcmVhZGRpciAocGF0aCwgb3B0aW9ucywgY2IpIHtcbiAgICBpZiAodHlwZW9mIG9wdGlvbnMgPT09ICdmdW5jdGlvbicpXG4gICAgICBjYiA9IG9wdGlvbnMsIG9wdGlvbnMgPSBudWxsXG5cbiAgICB2YXIgZ28kcmVhZGRpciA9IG5vUmVhZGRpck9wdGlvblZlcnNpb25zLnRlc3QocHJvY2Vzcy52ZXJzaW9uKVxuICAgICAgPyBmdW5jdGlvbiBnbyRyZWFkZGlyIChwYXRoLCBvcHRpb25zLCBjYiwgc3RhcnRUaW1lKSB7XG4gICAgICAgIHJldHVybiBmcyRyZWFkZGlyKHBhdGgsIGZzJHJlYWRkaXJDYWxsYmFjayhcbiAgICAgICAgICBwYXRoLCBvcHRpb25zLCBjYiwgc3RhcnRUaW1lXG4gICAgICAgICkpXG4gICAgICB9XG4gICAgICA6IGZ1bmN0aW9uIGdvJHJlYWRkaXIgKHBhdGgsIG9wdGlvbnMsIGNiLCBzdGFydFRpbWUpIHtcbiAgICAgICAgcmV0dXJuIGZzJHJlYWRkaXIocGF0aCwgb3B0aW9ucywgZnMkcmVhZGRpckNhbGxiYWNrKFxuICAgICAgICAgIHBhdGgsIG9wdGlvbnMsIGNiLCBzdGFydFRpbWVcbiAgICAgICAgKSlcbiAgICAgIH1cblxuICAgIHJldHVybiBnbyRyZWFkZGlyKHBhdGgsIG9wdGlvbnMsIGNiKVxuXG4gICAgZnVuY3Rpb24gZnMkcmVhZGRpckNhbGxiYWNrIChwYXRoLCBvcHRpb25zLCBjYiwgc3RhcnRUaW1lKSB7XG4gICAgICByZXR1cm4gZnVuY3Rpb24gKGVyciwgZmlsZXMpIHtcbiAgICAgICAgaWYgKGVyciAmJiAoZXJyLmNvZGUgPT09ICdFTUZJTEUnIHx8IGVyci5jb2RlID09PSAnRU5GSUxFJykpXG4gICAgICAgICAgZW5xdWV1ZShbXG4gICAgICAgICAgICBnbyRyZWFkZGlyLFxuICAgICAgICAgICAgW3BhdGgsIG9wdGlvbnMsIGNiXSxcbiAgICAgICAgICAgIGVycixcbiAgICAgICAgICAgIHN0YXJ0VGltZSB8fCBEYXRlLm5vdygpLFxuICAgICAgICAgICAgRGF0ZS5ub3coKVxuICAgICAgICAgIF0pXG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgIGlmIChmaWxlcyAmJiBmaWxlcy5zb3J0KVxuICAgICAgICAgICAgZmlsZXMuc29ydCgpXG5cbiAgICAgICAgICBpZiAodHlwZW9mIGNiID09PSAnZnVuY3Rpb24nKVxuICAgICAgICAgICAgY2IuY2FsbCh0aGlzLCBlcnIsIGZpbGVzKVxuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgaWYgKHByb2Nlc3MudmVyc2lvbi5zdWJzdHIoMCwgNCkgPT09ICd2MC44Jykge1xuICAgIHZhciBsZWdTdHJlYW1zID0gbGVnYWN5KGZzKVxuICAgIFJlYWRTdHJlYW0gPSBsZWdTdHJlYW1zLlJlYWRTdHJlYW1cbiAgICBXcml0ZVN0cmVhbSA9IGxlZ1N0cmVhbXMuV3JpdGVTdHJlYW1cbiAgfVxuXG4gIHZhciBmcyRSZWFkU3RyZWFtID0gZnMuUmVhZFN0cmVhbVxuICBpZiAoZnMkUmVhZFN0cmVhbSkge1xuICAgIFJlYWRTdHJlYW0ucHJvdG90eXBlID0gT2JqZWN0LmNyZWF0ZShmcyRSZWFkU3RyZWFtLnByb3RvdHlwZSlcbiAgICBSZWFkU3RyZWFtLnByb3RvdHlwZS5vcGVuID0gUmVhZFN0cmVhbSRvcGVuXG4gIH1cblxuICB2YXIgZnMkV3JpdGVTdHJlYW0gPSBmcy5Xcml0ZVN0cmVhbVxuICBpZiAoZnMkV3JpdGVTdHJlYW0pIHtcbiAgICBXcml0ZVN0cmVhbS5wcm90b3R5cGUgPSBPYmplY3QuY3JlYXRlKGZzJFdyaXRlU3RyZWFtLnByb3RvdHlwZSlcbiAgICBXcml0ZVN0cmVhbS5wcm90b3R5cGUub3BlbiA9IFdyaXRlU3RyZWFtJG9wZW5cbiAgfVxuXG4gIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShmcywgJ1JlYWRTdHJlYW0nLCB7XG4gICAgZ2V0OiBmdW5jdGlvbiAoKSB7XG4gICAgICByZXR1cm4gUmVhZFN0cmVhbVxuICAgIH0sXG4gICAgc2V0OiBmdW5jdGlvbiAodmFsKSB7XG4gICAgICBSZWFkU3RyZWFtID0gdmFsXG4gICAgfSxcbiAgICBlbnVtZXJhYmxlOiB0cnVlLFxuICAgIGNvbmZpZ3VyYWJsZTogdHJ1ZVxuICB9KVxuICBPYmplY3QuZGVmaW5lUHJvcGVydHkoZnMsICdXcml0ZVN0cmVhbScsIHtcbiAgICBnZXQ6IGZ1bmN0aW9uICgpIHtcbiAgICAgIHJldHVybiBXcml0ZVN0cmVhbVxuICAgIH0sXG4gICAgc2V0OiBmdW5jdGlvbiAodmFsKSB7XG4gICAgICBXcml0ZVN0cmVhbSA9IHZhbFxuICAgIH0sXG4gICAgZW51bWVyYWJsZTogdHJ1ZSxcbiAgICBjb25maWd1cmFibGU6IHRydWVcbiAgfSlcblxuICAvLyBsZWdhY3kgbmFtZXNcbiAgdmFyIEZpbGVSZWFkU3RyZWFtID0gUmVhZFN0cmVhbVxuICBPYmplY3QuZGVmaW5lUHJvcGVydHkoZnMsICdGaWxlUmVhZFN0cmVhbScsIHtcbiAgICBnZXQ6IGZ1bmN0aW9uICgpIHtcbiAgICAgIHJldHVybiBGaWxlUmVhZFN0cmVhbVxuICAgIH0sXG4gICAgc2V0OiBmdW5jdGlvbiAodmFsKSB7XG4gICAgICBGaWxlUmVhZFN0cmVhbSA9IHZhbFxuICAgIH0sXG4gICAgZW51bWVyYWJsZTogdHJ1ZSxcbiAgICBjb25maWd1cmFibGU6IHRydWVcbiAgfSlcbiAgdmFyIEZpbGVXcml0ZVN0cmVhbSA9IFdyaXRlU3RyZWFtXG4gIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShmcywgJ0ZpbGVXcml0ZVN0cmVhbScsIHtcbiAgICBnZXQ6IGZ1bmN0aW9uICgpIHtcbiAgICAgIHJldHVybiBGaWxlV3JpdGVTdHJlYW1cbiAgICB9LFxuICAgIHNldDogZnVuY3Rpb24gKHZhbCkge1xuICAgICAgRmlsZVdyaXRlU3RyZWFtID0gdmFsXG4gICAgfSxcbiAgICBlbnVtZXJhYmxlOiB0cnVlLFxuICAgIGNvbmZpZ3VyYWJsZTogdHJ1ZVxuICB9KVxuXG4gIGZ1bmN0aW9uIFJlYWRTdHJlYW0gKHBhdGgsIG9wdGlvbnMpIHtcbiAgICBpZiAodGhpcyBpbnN0YW5jZW9mIFJlYWRTdHJlYW0pXG4gICAgICByZXR1cm4gZnMkUmVhZFN0cmVhbS5hcHBseSh0aGlzLCBhcmd1bWVudHMpLCB0aGlzXG4gICAgZWxzZVxuICAgICAgcmV0dXJuIFJlYWRTdHJlYW0uYXBwbHkoT2JqZWN0LmNyZWF0ZShSZWFkU3RyZWFtLnByb3RvdHlwZSksIGFyZ3VtZW50cylcbiAgfVxuXG4gIGZ1bmN0aW9uIFJlYWRTdHJlYW0kb3BlbiAoKSB7XG4gICAgdmFyIHRoYXQgPSB0aGlzXG4gICAgb3Blbih0aGF0LnBhdGgsIHRoYXQuZmxhZ3MsIHRoYXQubW9kZSwgZnVuY3Rpb24gKGVyciwgZmQpIHtcbiAgICAgIGlmIChlcnIpIHtcbiAgICAgICAgaWYgKHRoYXQuYXV0b0Nsb3NlKVxuICAgICAgICAgIHRoYXQuZGVzdHJveSgpXG5cbiAgICAgICAgdGhhdC5lbWl0KCdlcnJvcicsIGVycilcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHRoYXQuZmQgPSBmZFxuICAgICAgICB0aGF0LmVtaXQoJ29wZW4nLCBmZClcbiAgICAgICAgdGhhdC5yZWFkKClcbiAgICAgIH1cbiAgICB9KVxuICB9XG5cbiAgZnVuY3Rpb24gV3JpdGVTdHJlYW0gKHBhdGgsIG9wdGlvbnMpIHtcbiAgICBpZiAodGhpcyBpbnN0YW5jZW9mIFdyaXRlU3RyZWFtKVxuICAgICAgcmV0dXJuIGZzJFdyaXRlU3RyZWFtLmFwcGx5KHRoaXMsIGFyZ3VtZW50cyksIHRoaXNcbiAgICBlbHNlXG4gICAgICByZXR1cm4gV3JpdGVTdHJlYW0uYXBwbHkoT2JqZWN0LmNyZWF0ZShXcml0ZVN0cmVhbS5wcm90b3R5cGUpLCBhcmd1bWVudHMpXG4gIH1cblxuICBmdW5jdGlvbiBXcml0ZVN0cmVhbSRvcGVuICgpIHtcbiAgICB2YXIgdGhhdCA9IHRoaXNcbiAgICBvcGVuKHRoYXQucGF0aCwgdGhhdC5mbGFncywgdGhhdC5tb2RlLCBmdW5jdGlvbiAoZXJyLCBmZCkge1xuICAgICAgaWYgKGVycikge1xuICAgICAgICB0aGF0LmRlc3Ryb3koKVxuICAgICAgICB0aGF0LmVtaXQoJ2Vycm9yJywgZXJyKVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdGhhdC5mZCA9IGZkXG4gICAgICAgIHRoYXQuZW1pdCgnb3BlbicsIGZkKVxuICAgICAgfVxuICAgIH0pXG4gIH1cblxuICBmdW5jdGlvbiBjcmVhdGVSZWFkU3RyZWFtIChwYXRoLCBvcHRpb25zKSB7XG4gICAgcmV0dXJuIG5ldyBmcy5SZWFkU3RyZWFtKHBhdGgsIG9wdGlvbnMpXG4gIH1cblxuICBmdW5jdGlvbiBjcmVhdGVXcml0ZVN0cmVhbSAocGF0aCwgb3B0aW9ucykge1xuICAgIHJldHVybiBuZXcgZnMuV3JpdGVTdHJlYW0ocGF0aCwgb3B0aW9ucylcbiAgfVxuXG4gIHZhciBmcyRvcGVuID0gZnMub3BlblxuICBmcy5vcGVuID0gb3BlblxuICBmdW5jdGlvbiBvcGVuIChwYXRoLCBmbGFncywgbW9kZSwgY2IpIHtcbiAgICBpZiAodHlwZW9mIG1vZGUgPT09ICdmdW5jdGlvbicpXG4gICAgICBjYiA9IG1vZGUsIG1vZGUgPSBudWxsXG5cbiAgICByZXR1cm4gZ28kb3BlbihwYXRoLCBmbGFncywgbW9kZSwgY2IpXG5cbiAgICBmdW5jdGlvbiBnbyRvcGVuIChwYXRoLCBmbGFncywgbW9kZSwgY2IsIHN0YXJ0VGltZSkge1xuICAgICAgcmV0dXJuIGZzJG9wZW4ocGF0aCwgZmxhZ3MsIG1vZGUsIGZ1bmN0aW9uIChlcnIsIGZkKSB7XG4gICAgICAgIGlmIChlcnIgJiYgKGVyci5jb2RlID09PSAnRU1GSUxFJyB8fCBlcnIuY29kZSA9PT0gJ0VORklMRScpKVxuICAgICAgICAgIGVucXVldWUoW2dvJG9wZW4sIFtwYXRoLCBmbGFncywgbW9kZSwgY2JdLCBlcnIsIHN0YXJ0VGltZSB8fCBEYXRlLm5vdygpLCBEYXRlLm5vdygpXSlcbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgaWYgKHR5cGVvZiBjYiA9PT0gJ2Z1bmN0aW9uJylcbiAgICAgICAgICAgIGNiLmFwcGx5KHRoaXMsIGFyZ3VtZW50cylcbiAgICAgICAgfVxuICAgICAgfSlcbiAgICB9XG4gIH1cblxuICByZXR1cm4gZnNcbn1cblxuZnVuY3Rpb24gZW5xdWV1ZSAoZWxlbSkge1xuICBkZWJ1ZygnRU5RVUVVRScsIGVsZW1bMF0ubmFtZSwgZWxlbVsxXSlcbiAgZnNbZ3JhY2VmdWxRdWV1ZV0ucHVzaChlbGVtKVxuICByZXRyeSgpXG59XG5cbi8vIGtlZXAgdHJhY2sgb2YgdGhlIHRpbWVvdXQgYmV0d2VlbiByZXRyeSgpIGNhbGxzXG52YXIgcmV0cnlUaW1lclxuXG4vLyByZXNldCB0aGUgc3RhcnRUaW1lIGFuZCBsYXN0VGltZSB0byBub3dcbi8vIHRoaXMgcmVzZXRzIHRoZSBzdGFydCBvZiB0aGUgNjAgc2Vjb25kIG92ZXJhbGwgdGltZW91dCBhcyB3ZWxsIGFzIHRoZVxuLy8gZGVsYXkgYmV0d2VlbiBhdHRlbXB0cyBzbyB0aGF0IHdlJ2xsIHJldHJ5IHRoZXNlIGpvYnMgc29vbmVyXG5mdW5jdGlvbiByZXNldFF1ZXVlICgpIHtcbiAgdmFyIG5vdyA9IERhdGUubm93KClcbiAgZm9yICh2YXIgaSA9IDA7IGkgPCBmc1tncmFjZWZ1bFF1ZXVlXS5sZW5ndGg7ICsraSkge1xuICAgIC8vIGVudHJpZXMgdGhhdCBhcmUgb25seSBhIGxlbmd0aCBvZiAyIGFyZSBmcm9tIGFuIG9sZGVyIHZlcnNpb24sIGRvbid0XG4gICAgLy8gYm90aGVyIG1vZGlmeWluZyB0aG9zZSBzaW5jZSB0aGV5J2xsIGJlIHJldHJpZWQgYW55d2F5LlxuICAgIGlmIChmc1tncmFjZWZ1bFF1ZXVlXVtpXS5sZW5ndGggPiAyKSB7XG4gICAgICBmc1tncmFjZWZ1bFF1ZXVlXVtpXVszXSA9IG5vdyAvLyBzdGFydFRpbWVcbiAgICAgIGZzW2dyYWNlZnVsUXVldWVdW2ldWzRdID0gbm93IC8vIGxhc3RUaW1lXG4gICAgfVxuICB9XG4gIC8vIGNhbGwgcmV0cnkgdG8gbWFrZSBzdXJlIHdlJ3JlIGFjdGl2ZWx5IHByb2Nlc3NpbmcgdGhlIHF1ZXVlXG4gIHJldHJ5KClcbn1cblxuZnVuY3Rpb24gcmV0cnkgKCkge1xuICAvLyBjbGVhciB0aGUgdGltZXIgYW5kIHJlbW92ZSBpdCB0byBoZWxwIHByZXZlbnQgdW5pbnRlbmRlZCBjb25jdXJyZW5jeVxuICBjbGVhclRpbWVvdXQocmV0cnlUaW1lcilcbiAgcmV0cnlUaW1lciA9IHVuZGVmaW5lZFxuXG4gIGlmIChmc1tncmFjZWZ1bFF1ZXVlXS5sZW5ndGggPT09IDApXG4gICAgcmV0dXJuXG5cbiAgdmFyIGVsZW0gPSBmc1tncmFjZWZ1bFF1ZXVlXS5zaGlmdCgpXG4gIHZhciBmbiA9IGVsZW1bMF1cbiAgdmFyIGFyZ3MgPSBlbGVtWzFdXG4gIC8vIHRoZXNlIGl0ZW1zIG1heSBiZSB1bnNldCBpZiB0aGV5IHdlcmUgYWRkZWQgYnkgYW4gb2xkZXIgZ3JhY2VmdWwtZnNcbiAgdmFyIGVyciA9IGVsZW1bMl1cbiAgdmFyIHN0YXJ0VGltZSA9IGVsZW1bM11cbiAgdmFyIGxhc3RUaW1lID0gZWxlbVs0XVxuXG4gIC8vIGlmIHdlIGRvbid0IGhhdmUgYSBzdGFydFRpbWUgd2UgaGF2ZSBubyB3YXkgb2Yga25vd2luZyBpZiB3ZSd2ZSB3YWl0ZWRcbiAgLy8gbG9uZyBlbm91Z2gsIHNvIGdvIGFoZWFkIGFuZCByZXRyeSB0aGlzIGl0ZW0gbm93XG4gIGlmIChzdGFydFRpbWUgPT09IHVuZGVmaW5lZCkge1xuICAgIGRlYnVnKCdSRVRSWScsIGZuLm5hbWUsIGFyZ3MpXG4gICAgZm4uYXBwbHkobnVsbCwgYXJncylcbiAgfSBlbHNlIGlmIChEYXRlLm5vdygpIC0gc3RhcnRUaW1lID49IDYwMDAwKSB7XG4gICAgLy8gaXQncyBiZWVuIG1vcmUgdGhhbiA2MCBzZWNvbmRzIHRvdGFsLCBiYWlsIG5vd1xuICAgIGRlYnVnKCdUSU1FT1VUJywgZm4ubmFtZSwgYXJncylcbiAgICB2YXIgY2IgPSBhcmdzLnBvcCgpXG4gICAgaWYgKHR5cGVvZiBjYiA9PT0gJ2Z1bmN0aW9uJylcbiAgICAgIGNiLmNhbGwobnVsbCwgZXJyKVxuICB9IGVsc2Uge1xuICAgIC8vIHRoZSBhbW91bnQgb2YgdGltZSBiZXR3ZWVuIHRoZSBsYXN0IGF0dGVtcHQgYW5kIHJpZ2h0IG5vd1xuICAgIHZhciBzaW5jZUF0dGVtcHQgPSBEYXRlLm5vdygpIC0gbGFzdFRpbWVcbiAgICAvLyB0aGUgYW1vdW50IG9mIHRpbWUgYmV0d2VlbiB3aGVuIHdlIGZpcnN0IHRyaWVkLCBhbmQgd2hlbiB3ZSBsYXN0IHRyaWVkXG4gICAgLy8gcm91bmRlZCB1cCB0byBhdCBsZWFzdCAxXG4gICAgdmFyIHNpbmNlU3RhcnQgPSBNYXRoLm1heChsYXN0VGltZSAtIHN0YXJ0VGltZSwgMSlcbiAgICAvLyBiYWNrb2ZmLiB3YWl0IGxvbmdlciB0aGFuIHRoZSB0b3RhbCB0aW1lIHdlJ3ZlIGJlZW4gcmV0cnlpbmcsIGJ1dCBvbmx5XG4gICAgLy8gdXAgdG8gYSBtYXhpbXVtIG9mIDEwMG1zXG4gICAgdmFyIGRlc2lyZWREZWxheSA9IE1hdGgubWluKHNpbmNlU3RhcnQgKiAxLjIsIDEwMClcbiAgICAvLyBpdCdzIGJlZW4gbG9uZyBlbm91Z2ggc2luY2UgdGhlIGxhc3QgcmV0cnksIGRvIGl0IGFnYWluXG4gICAgaWYgKHNpbmNlQXR0ZW1wdCA+PSBkZXNpcmVkRGVsYXkpIHtcbiAgICAgIGRlYnVnKCdSRVRSWScsIGZuLm5hbWUsIGFyZ3MpXG4gICAgICBmbi5hcHBseShudWxsLCBhcmdzLmNvbmNhdChbc3RhcnRUaW1lXSkpXG4gICAgfSBlbHNlIHtcbiAgICAgIC8vIGlmIHdlIGNhbid0IGRvIHRoaXMgam9iIHlldCwgcHVzaCBpdCB0byB0aGUgZW5kIG9mIHRoZSBxdWV1ZVxuICAgICAgLy8gYW5kIGxldCB0aGUgbmV4dCBpdGVyYXRpb24gY2hlY2sgYWdhaW5cbiAgICAgIGZzW2dyYWNlZnVsUXVldWVdLnB1c2goZWxlbSlcbiAgICB9XG4gIH1cblxuICAvLyBzY2hlZHVsZSBvdXIgbmV4dCBydW4gaWYgb25lIGlzbid0IGFscmVhZHkgc2NoZWR1bGVkXG4gIGlmIChyZXRyeVRpbWVyID09PSB1bmRlZmluZWQpIHtcbiAgICByZXRyeVRpbWVyID0gc2V0VGltZW91dChyZXRyeSwgMClcbiAgfVxufVxuIiwKICAgICIndXNlIHN0cmljdCc7XG5cbmNvbnN0IGlzU3RyZWFtID0gc3RyZWFtID0+XG5cdHN0cmVhbSAhPT0gbnVsbCAmJlxuXHR0eXBlb2Ygc3RyZWFtID09PSAnb2JqZWN0JyAmJlxuXHR0eXBlb2Ygc3RyZWFtLnBpcGUgPT09ICdmdW5jdGlvbic7XG5cbmlzU3RyZWFtLndyaXRhYmxlID0gc3RyZWFtID0+XG5cdGlzU3RyZWFtKHN0cmVhbSkgJiZcblx0c3RyZWFtLndyaXRhYmxlICE9PSBmYWxzZSAmJlxuXHR0eXBlb2Ygc3RyZWFtLl93cml0ZSA9PT0gJ2Z1bmN0aW9uJyAmJlxuXHR0eXBlb2Ygc3RyZWFtLl93cml0YWJsZVN0YXRlID09PSAnb2JqZWN0JztcblxuaXNTdHJlYW0ucmVhZGFibGUgPSBzdHJlYW0gPT5cblx0aXNTdHJlYW0oc3RyZWFtKSAmJlxuXHRzdHJlYW0ucmVhZGFibGUgIT09IGZhbHNlICYmXG5cdHR5cGVvZiBzdHJlYW0uX3JlYWQgPT09ICdmdW5jdGlvbicgJiZcblx0dHlwZW9mIHN0cmVhbS5fcmVhZGFibGVTdGF0ZSA9PT0gJ29iamVjdCc7XG5cbmlzU3RyZWFtLmR1cGxleCA9IHN0cmVhbSA9PlxuXHRpc1N0cmVhbS53cml0YWJsZShzdHJlYW0pICYmXG5cdGlzU3RyZWFtLnJlYWRhYmxlKHN0cmVhbSk7XG5cbmlzU3RyZWFtLnRyYW5zZm9ybSA9IHN0cmVhbSA9PlxuXHRpc1N0cmVhbS5kdXBsZXgoc3RyZWFtKSAmJlxuXHR0eXBlb2Ygc3RyZWFtLl90cmFuc2Zvcm0gPT09ICdmdW5jdGlvbic7XG5cbm1vZHVsZS5leHBvcnRzID0gaXNTdHJlYW07XG4iLAogICAgIid1c2Ugc3RyaWN0JztcblxuaWYgKHR5cGVvZiBwcm9jZXNzID09PSAndW5kZWZpbmVkJyB8fFxuICAgICFwcm9jZXNzLnZlcnNpb24gfHxcbiAgICBwcm9jZXNzLnZlcnNpb24uaW5kZXhPZigndjAuJykgPT09IDAgfHxcbiAgICBwcm9jZXNzLnZlcnNpb24uaW5kZXhPZigndjEuJykgPT09IDAgJiYgcHJvY2Vzcy52ZXJzaW9uLmluZGV4T2YoJ3YxLjguJykgIT09IDApIHtcbiAgbW9kdWxlLmV4cG9ydHMgPSB7IG5leHRUaWNrOiBuZXh0VGljayB9O1xufSBlbHNlIHtcbiAgbW9kdWxlLmV4cG9ydHMgPSBwcm9jZXNzXG59XG5cbmZ1bmN0aW9uIG5leHRUaWNrKGZuLCBhcmcxLCBhcmcyLCBhcmczKSB7XG4gIGlmICh0eXBlb2YgZm4gIT09ICdmdW5jdGlvbicpIHtcbiAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCdcImNhbGxiYWNrXCIgYXJndW1lbnQgbXVzdCBiZSBhIGZ1bmN0aW9uJyk7XG4gIH1cbiAgdmFyIGxlbiA9IGFyZ3VtZW50cy5sZW5ndGg7XG4gIHZhciBhcmdzLCBpO1xuICBzd2l0Y2ggKGxlbikge1xuICBjYXNlIDA6XG4gIGNhc2UgMTpcbiAgICByZXR1cm4gcHJvY2Vzcy5uZXh0VGljayhmbik7XG4gIGNhc2UgMjpcbiAgICByZXR1cm4gcHJvY2Vzcy5uZXh0VGljayhmdW5jdGlvbiBhZnRlclRpY2tPbmUoKSB7XG4gICAgICBmbi5jYWxsKG51bGwsIGFyZzEpO1xuICAgIH0pO1xuICBjYXNlIDM6XG4gICAgcmV0dXJuIHByb2Nlc3MubmV4dFRpY2soZnVuY3Rpb24gYWZ0ZXJUaWNrVHdvKCkge1xuICAgICAgZm4uY2FsbChudWxsLCBhcmcxLCBhcmcyKTtcbiAgICB9KTtcbiAgY2FzZSA0OlxuICAgIHJldHVybiBwcm9jZXNzLm5leHRUaWNrKGZ1bmN0aW9uIGFmdGVyVGlja1RocmVlKCkge1xuICAgICAgZm4uY2FsbChudWxsLCBhcmcxLCBhcmcyLCBhcmczKTtcbiAgICB9KTtcbiAgZGVmYXVsdDpcbiAgICBhcmdzID0gbmV3IEFycmF5KGxlbiAtIDEpO1xuICAgIGkgPSAwO1xuICAgIHdoaWxlIChpIDwgYXJncy5sZW5ndGgpIHtcbiAgICAgIGFyZ3NbaSsrXSA9IGFyZ3VtZW50c1tpXTtcbiAgICB9XG4gICAgcmV0dXJuIHByb2Nlc3MubmV4dFRpY2soZnVuY3Rpb24gYWZ0ZXJUaWNrKCkge1xuICAgICAgZm4uYXBwbHkobnVsbCwgYXJncyk7XG4gICAgfSk7XG4gIH1cbn1cblxuIiwKICAgICJ2YXIgdG9TdHJpbmcgPSB7fS50b1N0cmluZztcblxubW9kdWxlLmV4cG9ydHMgPSBBcnJheS5pc0FycmF5IHx8IGZ1bmN0aW9uIChhcnIpIHtcbiAgcmV0dXJuIHRvU3RyaW5nLmNhbGwoYXJyKSA9PSAnW29iamVjdCBBcnJheV0nO1xufTtcbiIsCiAgICAibW9kdWxlLmV4cG9ydHMgPSByZXF1aXJlKCdzdHJlYW0nKTtcbiIsCiAgICAiLyogZXNsaW50LWRpc2FibGUgbm9kZS9uby1kZXByZWNhdGVkLWFwaSAqL1xudmFyIGJ1ZmZlciA9IHJlcXVpcmUoJ2J1ZmZlcicpXG52YXIgQnVmZmVyID0gYnVmZmVyLkJ1ZmZlclxuXG4vLyBhbHRlcm5hdGl2ZSB0byB1c2luZyBPYmplY3Qua2V5cyBmb3Igb2xkIGJyb3dzZXJzXG5mdW5jdGlvbiBjb3B5UHJvcHMgKHNyYywgZHN0KSB7XG4gIGZvciAodmFyIGtleSBpbiBzcmMpIHtcbiAgICBkc3Rba2V5XSA9IHNyY1trZXldXG4gIH1cbn1cbmlmIChCdWZmZXIuZnJvbSAmJiBCdWZmZXIuYWxsb2MgJiYgQnVmZmVyLmFsbG9jVW5zYWZlICYmIEJ1ZmZlci5hbGxvY1Vuc2FmZVNsb3cpIHtcbiAgbW9kdWxlLmV4cG9ydHMgPSBidWZmZXJcbn0gZWxzZSB7XG4gIC8vIENvcHkgcHJvcGVydGllcyBmcm9tIHJlcXVpcmUoJ2J1ZmZlcicpXG4gIGNvcHlQcm9wcyhidWZmZXIsIGV4cG9ydHMpXG4gIGV4cG9ydHMuQnVmZmVyID0gU2FmZUJ1ZmZlclxufVxuXG5mdW5jdGlvbiBTYWZlQnVmZmVyIChhcmcsIGVuY29kaW5nT3JPZmZzZXQsIGxlbmd0aCkge1xuICByZXR1cm4gQnVmZmVyKGFyZywgZW5jb2RpbmdPck9mZnNldCwgbGVuZ3RoKVxufVxuXG4vLyBDb3B5IHN0YXRpYyBtZXRob2RzIGZyb20gQnVmZmVyXG5jb3B5UHJvcHMoQnVmZmVyLCBTYWZlQnVmZmVyKVxuXG5TYWZlQnVmZmVyLmZyb20gPSBmdW5jdGlvbiAoYXJnLCBlbmNvZGluZ09yT2Zmc2V0LCBsZW5ndGgpIHtcbiAgaWYgKHR5cGVvZiBhcmcgPT09ICdudW1iZXInKSB7XG4gICAgdGhyb3cgbmV3IFR5cGVFcnJvcignQXJndW1lbnQgbXVzdCBub3QgYmUgYSBudW1iZXInKVxuICB9XG4gIHJldHVybiBCdWZmZXIoYXJnLCBlbmNvZGluZ09yT2Zmc2V0LCBsZW5ndGgpXG59XG5cblNhZmVCdWZmZXIuYWxsb2MgPSBmdW5jdGlvbiAoc2l6ZSwgZmlsbCwgZW5jb2RpbmcpIHtcbiAgaWYgKHR5cGVvZiBzaXplICE9PSAnbnVtYmVyJykge1xuICAgIHRocm93IG5ldyBUeXBlRXJyb3IoJ0FyZ3VtZW50IG11c3QgYmUgYSBudW1iZXInKVxuICB9XG4gIHZhciBidWYgPSBCdWZmZXIoc2l6ZSlcbiAgaWYgKGZpbGwgIT09IHVuZGVmaW5lZCkge1xuICAgIGlmICh0eXBlb2YgZW5jb2RpbmcgPT09ICdzdHJpbmcnKSB7XG4gICAgICBidWYuZmlsbChmaWxsLCBlbmNvZGluZylcbiAgICB9IGVsc2Uge1xuICAgICAgYnVmLmZpbGwoZmlsbClcbiAgICB9XG4gIH0gZWxzZSB7XG4gICAgYnVmLmZpbGwoMClcbiAgfVxuICByZXR1cm4gYnVmXG59XG5cblNhZmVCdWZmZXIuYWxsb2NVbnNhZmUgPSBmdW5jdGlvbiAoc2l6ZSkge1xuICBpZiAodHlwZW9mIHNpemUgIT09ICdudW1iZXInKSB7XG4gICAgdGhyb3cgbmV3IFR5cGVFcnJvcignQXJndW1lbnQgbXVzdCBiZSBhIG51bWJlcicpXG4gIH1cbiAgcmV0dXJuIEJ1ZmZlcihzaXplKVxufVxuXG5TYWZlQnVmZmVyLmFsbG9jVW5zYWZlU2xvdyA9IGZ1bmN0aW9uIChzaXplKSB7XG4gIGlmICh0eXBlb2Ygc2l6ZSAhPT0gJ251bWJlcicpIHtcbiAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCdBcmd1bWVudCBtdXN0IGJlIGEgbnVtYmVyJylcbiAgfVxuICByZXR1cm4gYnVmZmVyLlNsb3dCdWZmZXIoc2l6ZSlcbn1cbiIsCiAgICAiLy8gQ29weXJpZ2h0IEpveWVudCwgSW5jLiBhbmQgb3RoZXIgTm9kZSBjb250cmlidXRvcnMuXG4vL1xuLy8gUGVybWlzc2lvbiBpcyBoZXJlYnkgZ3JhbnRlZCwgZnJlZSBvZiBjaGFyZ2UsIHRvIGFueSBwZXJzb24gb2J0YWluaW5nIGFcbi8vIGNvcHkgb2YgdGhpcyBzb2Z0d2FyZSBhbmQgYXNzb2NpYXRlZCBkb2N1bWVudGF0aW9uIGZpbGVzICh0aGVcbi8vIFwiU29mdHdhcmVcIiksIHRvIGRlYWwgaW4gdGhlIFNvZnR3YXJlIHdpdGhvdXQgcmVzdHJpY3Rpb24sIGluY2x1ZGluZ1xuLy8gd2l0aG91dCBsaW1pdGF0aW9uIHRoZSByaWdodHMgdG8gdXNlLCBjb3B5LCBtb2RpZnksIG1lcmdlLCBwdWJsaXNoLFxuLy8gZGlzdHJpYnV0ZSwgc3VibGljZW5zZSwgYW5kL29yIHNlbGwgY29waWVzIG9mIHRoZSBTb2Z0d2FyZSwgYW5kIHRvIHBlcm1pdFxuLy8gcGVyc29ucyB0byB3aG9tIHRoZSBTb2Z0d2FyZSBpcyBmdXJuaXNoZWQgdG8gZG8gc28sIHN1YmplY3QgdG8gdGhlXG4vLyBmb2xsb3dpbmcgY29uZGl0aW9uczpcbi8vXG4vLyBUaGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBzaGFsbCBiZSBpbmNsdWRlZFxuLy8gaW4gYWxsIGNvcGllcyBvciBzdWJzdGFudGlhbCBwb3J0aW9ucyBvZiB0aGUgU29mdHdhcmUuXG4vL1xuLy8gVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEIFwiQVMgSVNcIiwgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwgRVhQUkVTU1xuLy8gT1IgSU1QTElFRCwgSU5DTFVESU5HIEJVVCBOT1QgTElNSVRFRCBUTyBUSEUgV0FSUkFOVElFUyBPRlxuLy8gTUVSQ0hBTlRBQklMSVRZLCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBTkQgTk9OSU5GUklOR0VNRU5ULiBJTlxuLy8gTk8gRVZFTlQgU0hBTEwgVEhFIEFVVEhPUlMgT1IgQ09QWVJJR0hUIEhPTERFUlMgQkUgTElBQkxFIEZPUiBBTlkgQ0xBSU0sXG4vLyBEQU1BR0VTIE9SIE9USEVSIExJQUJJTElUWSwgV0hFVEhFUiBJTiBBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsIFRPUlQgT1Jcbi8vIE9USEVSV0lTRSwgQVJJU0lORyBGUk9NLCBPVVQgT0YgT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBTT0ZUV0FSRSBPUiBUSEVcbi8vIFVTRSBPUiBPVEhFUiBERUFMSU5HUyBJTiBUSEUgU09GVFdBUkUuXG5cbi8vIE5PVEU6IFRoZXNlIHR5cGUgY2hlY2tpbmcgZnVuY3Rpb25zIGludGVudGlvbmFsbHkgZG9uJ3QgdXNlIGBpbnN0YW5jZW9mYFxuLy8gYmVjYXVzZSBpdCBpcyBmcmFnaWxlIGFuZCBjYW4gYmUgZWFzaWx5IGZha2VkIHdpdGggYE9iamVjdC5jcmVhdGUoKWAuXG5cbmZ1bmN0aW9uIGlzQXJyYXkoYXJnKSB7XG4gIGlmIChBcnJheS5pc0FycmF5KSB7XG4gICAgcmV0dXJuIEFycmF5LmlzQXJyYXkoYXJnKTtcbiAgfVxuICByZXR1cm4gb2JqZWN0VG9TdHJpbmcoYXJnKSA9PT0gJ1tvYmplY3QgQXJyYXldJztcbn1cbmV4cG9ydHMuaXNBcnJheSA9IGlzQXJyYXk7XG5cbmZ1bmN0aW9uIGlzQm9vbGVhbihhcmcpIHtcbiAgcmV0dXJuIHR5cGVvZiBhcmcgPT09ICdib29sZWFuJztcbn1cbmV4cG9ydHMuaXNCb29sZWFuID0gaXNCb29sZWFuO1xuXG5mdW5jdGlvbiBpc051bGwoYXJnKSB7XG4gIHJldHVybiBhcmcgPT09IG51bGw7XG59XG5leHBvcnRzLmlzTnVsbCA9IGlzTnVsbDtcblxuZnVuY3Rpb24gaXNOdWxsT3JVbmRlZmluZWQoYXJnKSB7XG4gIHJldHVybiBhcmcgPT0gbnVsbDtcbn1cbmV4cG9ydHMuaXNOdWxsT3JVbmRlZmluZWQgPSBpc051bGxPclVuZGVmaW5lZDtcblxuZnVuY3Rpb24gaXNOdW1iZXIoYXJnKSB7XG4gIHJldHVybiB0eXBlb2YgYXJnID09PSAnbnVtYmVyJztcbn1cbmV4cG9ydHMuaXNOdW1iZXIgPSBpc051bWJlcjtcblxuZnVuY3Rpb24gaXNTdHJpbmcoYXJnKSB7XG4gIHJldHVybiB0eXBlb2YgYXJnID09PSAnc3RyaW5nJztcbn1cbmV4cG9ydHMuaXNTdHJpbmcgPSBpc1N0cmluZztcblxuZnVuY3Rpb24gaXNTeW1ib2woYXJnKSB7XG4gIHJldHVybiB0eXBlb2YgYXJnID09PSAnc3ltYm9sJztcbn1cbmV4cG9ydHMuaXNTeW1ib2wgPSBpc1N5bWJvbDtcblxuZnVuY3Rpb24gaXNVbmRlZmluZWQoYXJnKSB7XG4gIHJldHVybiBhcmcgPT09IHZvaWQgMDtcbn1cbmV4cG9ydHMuaXNVbmRlZmluZWQgPSBpc1VuZGVmaW5lZDtcblxuZnVuY3Rpb24gaXNSZWdFeHAocmUpIHtcbiAgcmV0dXJuIG9iamVjdFRvU3RyaW5nKHJlKSA9PT0gJ1tvYmplY3QgUmVnRXhwXSc7XG59XG5leHBvcnRzLmlzUmVnRXhwID0gaXNSZWdFeHA7XG5cbmZ1bmN0aW9uIGlzT2JqZWN0KGFyZykge1xuICByZXR1cm4gdHlwZW9mIGFyZyA9PT0gJ29iamVjdCcgJiYgYXJnICE9PSBudWxsO1xufVxuZXhwb3J0cy5pc09iamVjdCA9IGlzT2JqZWN0O1xuXG5mdW5jdGlvbiBpc0RhdGUoZCkge1xuICByZXR1cm4gb2JqZWN0VG9TdHJpbmcoZCkgPT09ICdbb2JqZWN0IERhdGVdJztcbn1cbmV4cG9ydHMuaXNEYXRlID0gaXNEYXRlO1xuXG5mdW5jdGlvbiBpc0Vycm9yKGUpIHtcbiAgcmV0dXJuIChvYmplY3RUb1N0cmluZyhlKSA9PT0gJ1tvYmplY3QgRXJyb3JdJyB8fCBlIGluc3RhbmNlb2YgRXJyb3IpO1xufVxuZXhwb3J0cy5pc0Vycm9yID0gaXNFcnJvcjtcblxuZnVuY3Rpb24gaXNGdW5jdGlvbihhcmcpIHtcbiAgcmV0dXJuIHR5cGVvZiBhcmcgPT09ICdmdW5jdGlvbic7XG59XG5leHBvcnRzLmlzRnVuY3Rpb24gPSBpc0Z1bmN0aW9uO1xuXG5mdW5jdGlvbiBpc1ByaW1pdGl2ZShhcmcpIHtcbiAgcmV0dXJuIGFyZyA9PT0gbnVsbCB8fFxuICAgICAgICAgdHlwZW9mIGFyZyA9PT0gJ2Jvb2xlYW4nIHx8XG4gICAgICAgICB0eXBlb2YgYXJnID09PSAnbnVtYmVyJyB8fFxuICAgICAgICAgdHlwZW9mIGFyZyA9PT0gJ3N0cmluZycgfHxcbiAgICAgICAgIHR5cGVvZiBhcmcgPT09ICdzeW1ib2wnIHx8ICAvLyBFUzYgc3ltYm9sXG4gICAgICAgICB0eXBlb2YgYXJnID09PSAndW5kZWZpbmVkJztcbn1cbmV4cG9ydHMuaXNQcmltaXRpdmUgPSBpc1ByaW1pdGl2ZTtcblxuZXhwb3J0cy5pc0J1ZmZlciA9IHJlcXVpcmUoJ2J1ZmZlcicpLkJ1ZmZlci5pc0J1ZmZlcjtcblxuZnVuY3Rpb24gb2JqZWN0VG9TdHJpbmcobykge1xuICByZXR1cm4gT2JqZWN0LnByb3RvdHlwZS50b1N0cmluZy5jYWxsKG8pO1xufVxuIiwKICAgICJpZiAodHlwZW9mIE9iamVjdC5jcmVhdGUgPT09ICdmdW5jdGlvbicpIHtcbiAgLy8gaW1wbGVtZW50YXRpb24gZnJvbSBzdGFuZGFyZCBub2RlLmpzICd1dGlsJyBtb2R1bGVcbiAgbW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiBpbmhlcml0cyhjdG9yLCBzdXBlckN0b3IpIHtcbiAgICBpZiAoc3VwZXJDdG9yKSB7XG4gICAgICBjdG9yLnN1cGVyXyA9IHN1cGVyQ3RvclxuICAgICAgY3Rvci5wcm90b3R5cGUgPSBPYmplY3QuY3JlYXRlKHN1cGVyQ3Rvci5wcm90b3R5cGUsIHtcbiAgICAgICAgY29uc3RydWN0b3I6IHtcbiAgICAgICAgICB2YWx1ZTogY3RvcixcbiAgICAgICAgICBlbnVtZXJhYmxlOiBmYWxzZSxcbiAgICAgICAgICB3cml0YWJsZTogdHJ1ZSxcbiAgICAgICAgICBjb25maWd1cmFibGU6IHRydWVcbiAgICAgICAgfVxuICAgICAgfSlcbiAgICB9XG4gIH07XG59IGVsc2Uge1xuICAvLyBvbGQgc2Nob29sIHNoaW0gZm9yIG9sZCBicm93c2Vyc1xuICBtb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIGluaGVyaXRzKGN0b3IsIHN1cGVyQ3Rvcikge1xuICAgIGlmIChzdXBlckN0b3IpIHtcbiAgICAgIGN0b3Iuc3VwZXJfID0gc3VwZXJDdG9yXG4gICAgICB2YXIgVGVtcEN0b3IgPSBmdW5jdGlvbiAoKSB7fVxuICAgICAgVGVtcEN0b3IucHJvdG90eXBlID0gc3VwZXJDdG9yLnByb3RvdHlwZVxuICAgICAgY3Rvci5wcm90b3R5cGUgPSBuZXcgVGVtcEN0b3IoKVxuICAgICAgY3Rvci5wcm90b3R5cGUuY29uc3RydWN0b3IgPSBjdG9yXG4gICAgfVxuICB9XG59XG4iLAogICAgInRyeSB7XG4gIHZhciB1dGlsID0gcmVxdWlyZSgndXRpbCcpO1xuICAvKiBpc3RhbmJ1bCBpZ25vcmUgbmV4dCAqL1xuICBpZiAodHlwZW9mIHV0aWwuaW5oZXJpdHMgIT09ICdmdW5jdGlvbicpIHRocm93ICcnO1xuICBtb2R1bGUuZXhwb3J0cyA9IHV0aWwuaW5oZXJpdHM7XG59IGNhdGNoIChlKSB7XG4gIC8qIGlzdGFuYnVsIGlnbm9yZSBuZXh0ICovXG4gIG1vZHVsZS5leHBvcnRzID0gcmVxdWlyZSgnLi9pbmhlcml0c19icm93c2VyLmpzJyk7XG59XG4iLAogICAgIid1c2Ugc3RyaWN0JztcblxuZnVuY3Rpb24gX2NsYXNzQ2FsbENoZWNrKGluc3RhbmNlLCBDb25zdHJ1Y3RvcikgeyBpZiAoIShpbnN0YW5jZSBpbnN0YW5jZW9mIENvbnN0cnVjdG9yKSkgeyB0aHJvdyBuZXcgVHlwZUVycm9yKFwiQ2Fubm90IGNhbGwgYSBjbGFzcyBhcyBhIGZ1bmN0aW9uXCIpOyB9IH1cblxudmFyIEJ1ZmZlciA9IHJlcXVpcmUoJ3NhZmUtYnVmZmVyJykuQnVmZmVyO1xudmFyIHV0aWwgPSByZXF1aXJlKCd1dGlsJyk7XG5cbmZ1bmN0aW9uIGNvcHlCdWZmZXIoc3JjLCB0YXJnZXQsIG9mZnNldCkge1xuICBzcmMuY29weSh0YXJnZXQsIG9mZnNldCk7XG59XG5cbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gKCkge1xuICBmdW5jdGlvbiBCdWZmZXJMaXN0KCkge1xuICAgIF9jbGFzc0NhbGxDaGVjayh0aGlzLCBCdWZmZXJMaXN0KTtcblxuICAgIHRoaXMuaGVhZCA9IG51bGw7XG4gICAgdGhpcy50YWlsID0gbnVsbDtcbiAgICB0aGlzLmxlbmd0aCA9IDA7XG4gIH1cblxuICBCdWZmZXJMaXN0LnByb3RvdHlwZS5wdXNoID0gZnVuY3Rpb24gcHVzaCh2KSB7XG4gICAgdmFyIGVudHJ5ID0geyBkYXRhOiB2LCBuZXh0OiBudWxsIH07XG4gICAgaWYgKHRoaXMubGVuZ3RoID4gMCkgdGhpcy50YWlsLm5leHQgPSBlbnRyeTtlbHNlIHRoaXMuaGVhZCA9IGVudHJ5O1xuICAgIHRoaXMudGFpbCA9IGVudHJ5O1xuICAgICsrdGhpcy5sZW5ndGg7XG4gIH07XG5cbiAgQnVmZmVyTGlzdC5wcm90b3R5cGUudW5zaGlmdCA9IGZ1bmN0aW9uIHVuc2hpZnQodikge1xuICAgIHZhciBlbnRyeSA9IHsgZGF0YTogdiwgbmV4dDogdGhpcy5oZWFkIH07XG4gICAgaWYgKHRoaXMubGVuZ3RoID09PSAwKSB0aGlzLnRhaWwgPSBlbnRyeTtcbiAgICB0aGlzLmhlYWQgPSBlbnRyeTtcbiAgICArK3RoaXMubGVuZ3RoO1xuICB9O1xuXG4gIEJ1ZmZlckxpc3QucHJvdG90eXBlLnNoaWZ0ID0gZnVuY3Rpb24gc2hpZnQoKSB7XG4gICAgaWYgKHRoaXMubGVuZ3RoID09PSAwKSByZXR1cm47XG4gICAgdmFyIHJldCA9IHRoaXMuaGVhZC5kYXRhO1xuICAgIGlmICh0aGlzLmxlbmd0aCA9PT0gMSkgdGhpcy5oZWFkID0gdGhpcy50YWlsID0gbnVsbDtlbHNlIHRoaXMuaGVhZCA9IHRoaXMuaGVhZC5uZXh0O1xuICAgIC0tdGhpcy5sZW5ndGg7XG4gICAgcmV0dXJuIHJldDtcbiAgfTtcblxuICBCdWZmZXJMaXN0LnByb3RvdHlwZS5jbGVhciA9IGZ1bmN0aW9uIGNsZWFyKCkge1xuICAgIHRoaXMuaGVhZCA9IHRoaXMudGFpbCA9IG51bGw7XG4gICAgdGhpcy5sZW5ndGggPSAwO1xuICB9O1xuXG4gIEJ1ZmZlckxpc3QucHJvdG90eXBlLmpvaW4gPSBmdW5jdGlvbiBqb2luKHMpIHtcbiAgICBpZiAodGhpcy5sZW5ndGggPT09IDApIHJldHVybiAnJztcbiAgICB2YXIgcCA9IHRoaXMuaGVhZDtcbiAgICB2YXIgcmV0ID0gJycgKyBwLmRhdGE7XG4gICAgd2hpbGUgKHAgPSBwLm5leHQpIHtcbiAgICAgIHJldCArPSBzICsgcC5kYXRhO1xuICAgIH1yZXR1cm4gcmV0O1xuICB9O1xuXG4gIEJ1ZmZlckxpc3QucHJvdG90eXBlLmNvbmNhdCA9IGZ1bmN0aW9uIGNvbmNhdChuKSB7XG4gICAgaWYgKHRoaXMubGVuZ3RoID09PSAwKSByZXR1cm4gQnVmZmVyLmFsbG9jKDApO1xuICAgIHZhciByZXQgPSBCdWZmZXIuYWxsb2NVbnNhZmUobiA+Pj4gMCk7XG4gICAgdmFyIHAgPSB0aGlzLmhlYWQ7XG4gICAgdmFyIGkgPSAwO1xuICAgIHdoaWxlIChwKSB7XG4gICAgICBjb3B5QnVmZmVyKHAuZGF0YSwgcmV0LCBpKTtcbiAgICAgIGkgKz0gcC5kYXRhLmxlbmd0aDtcbiAgICAgIHAgPSBwLm5leHQ7XG4gICAgfVxuICAgIHJldHVybiByZXQ7XG4gIH07XG5cbiAgcmV0dXJuIEJ1ZmZlckxpc3Q7XG59KCk7XG5cbmlmICh1dGlsICYmIHV0aWwuaW5zcGVjdCAmJiB1dGlsLmluc3BlY3QuY3VzdG9tKSB7XG4gIG1vZHVsZS5leHBvcnRzLnByb3RvdHlwZVt1dGlsLmluc3BlY3QuY3VzdG9tXSA9IGZ1bmN0aW9uICgpIHtcbiAgICB2YXIgb2JqID0gdXRpbC5pbnNwZWN0KHsgbGVuZ3RoOiB0aGlzLmxlbmd0aCB9KTtcbiAgICByZXR1cm4gdGhpcy5jb25zdHJ1Y3Rvci5uYW1lICsgJyAnICsgb2JqO1xuICB9O1xufSIsCiAgICAiJ3VzZSBzdHJpY3QnO1xuXG4vKjxyZXBsYWNlbWVudD4qL1xuXG52YXIgcG5hID0gcmVxdWlyZSgncHJvY2Vzcy1uZXh0aWNrLWFyZ3MnKTtcbi8qPC9yZXBsYWNlbWVudD4qL1xuXG4vLyB1bmRvY3VtZW50ZWQgY2IoKSBBUEksIG5lZWRlZCBmb3IgY29yZSwgbm90IGZvciBwdWJsaWMgQVBJXG5mdW5jdGlvbiBkZXN0cm95KGVyciwgY2IpIHtcbiAgdmFyIF90aGlzID0gdGhpcztcblxuICB2YXIgcmVhZGFibGVEZXN0cm95ZWQgPSB0aGlzLl9yZWFkYWJsZVN0YXRlICYmIHRoaXMuX3JlYWRhYmxlU3RhdGUuZGVzdHJveWVkO1xuICB2YXIgd3JpdGFibGVEZXN0cm95ZWQgPSB0aGlzLl93cml0YWJsZVN0YXRlICYmIHRoaXMuX3dyaXRhYmxlU3RhdGUuZGVzdHJveWVkO1xuXG4gIGlmIChyZWFkYWJsZURlc3Ryb3llZCB8fCB3cml0YWJsZURlc3Ryb3llZCkge1xuICAgIGlmIChjYikge1xuICAgICAgY2IoZXJyKTtcbiAgICB9IGVsc2UgaWYgKGVycikge1xuICAgICAgaWYgKCF0aGlzLl93cml0YWJsZVN0YXRlKSB7XG4gICAgICAgIHBuYS5uZXh0VGljayhlbWl0RXJyb3JOVCwgdGhpcywgZXJyKTtcbiAgICAgIH0gZWxzZSBpZiAoIXRoaXMuX3dyaXRhYmxlU3RhdGUuZXJyb3JFbWl0dGVkKSB7XG4gICAgICAgIHRoaXMuX3dyaXRhYmxlU3RhdGUuZXJyb3JFbWl0dGVkID0gdHJ1ZTtcbiAgICAgICAgcG5hLm5leHRUaWNrKGVtaXRFcnJvck5ULCB0aGlzLCBlcnIpO1xuICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiB0aGlzO1xuICB9XG5cbiAgLy8gd2Ugc2V0IGRlc3Ryb3llZCB0byB0cnVlIGJlZm9yZSBmaXJpbmcgZXJyb3IgY2FsbGJhY2tzIGluIG9yZGVyXG4gIC8vIHRvIG1ha2UgaXQgcmUtZW50cmFuY2Ugc2FmZSBpbiBjYXNlIGRlc3Ryb3koKSBpcyBjYWxsZWQgd2l0aGluIGNhbGxiYWNrc1xuXG4gIGlmICh0aGlzLl9yZWFkYWJsZVN0YXRlKSB7XG4gICAgdGhpcy5fcmVhZGFibGVTdGF0ZS5kZXN0cm95ZWQgPSB0cnVlO1xuICB9XG5cbiAgLy8gaWYgdGhpcyBpcyBhIGR1cGxleCBzdHJlYW0gbWFyayB0aGUgd3JpdGFibGUgcGFydCBhcyBkZXN0cm95ZWQgYXMgd2VsbFxuICBpZiAodGhpcy5fd3JpdGFibGVTdGF0ZSkge1xuICAgIHRoaXMuX3dyaXRhYmxlU3RhdGUuZGVzdHJveWVkID0gdHJ1ZTtcbiAgfVxuXG4gIHRoaXMuX2Rlc3Ryb3koZXJyIHx8IG51bGwsIGZ1bmN0aW9uIChlcnIpIHtcbiAgICBpZiAoIWNiICYmIGVycikge1xuICAgICAgaWYgKCFfdGhpcy5fd3JpdGFibGVTdGF0ZSkge1xuICAgICAgICBwbmEubmV4dFRpY2soZW1pdEVycm9yTlQsIF90aGlzLCBlcnIpO1xuICAgICAgfSBlbHNlIGlmICghX3RoaXMuX3dyaXRhYmxlU3RhdGUuZXJyb3JFbWl0dGVkKSB7XG4gICAgICAgIF90aGlzLl93cml0YWJsZVN0YXRlLmVycm9yRW1pdHRlZCA9IHRydWU7XG4gICAgICAgIHBuYS5uZXh0VGljayhlbWl0RXJyb3JOVCwgX3RoaXMsIGVycik7XG4gICAgICB9XG4gICAgfSBlbHNlIGlmIChjYikge1xuICAgICAgY2IoZXJyKTtcbiAgICB9XG4gIH0pO1xuXG4gIHJldHVybiB0aGlzO1xufVxuXG5mdW5jdGlvbiB1bmRlc3Ryb3koKSB7XG4gIGlmICh0aGlzLl9yZWFkYWJsZVN0YXRlKSB7XG4gICAgdGhpcy5fcmVhZGFibGVTdGF0ZS5kZXN0cm95ZWQgPSBmYWxzZTtcbiAgICB0aGlzLl9yZWFkYWJsZVN0YXRlLnJlYWRpbmcgPSBmYWxzZTtcbiAgICB0aGlzLl9yZWFkYWJsZVN0YXRlLmVuZGVkID0gZmFsc2U7XG4gICAgdGhpcy5fcmVhZGFibGVTdGF0ZS5lbmRFbWl0dGVkID0gZmFsc2U7XG4gIH1cblxuICBpZiAodGhpcy5fd3JpdGFibGVTdGF0ZSkge1xuICAgIHRoaXMuX3dyaXRhYmxlU3RhdGUuZGVzdHJveWVkID0gZmFsc2U7XG4gICAgdGhpcy5fd3JpdGFibGVTdGF0ZS5lbmRlZCA9IGZhbHNlO1xuICAgIHRoaXMuX3dyaXRhYmxlU3RhdGUuZW5kaW5nID0gZmFsc2U7XG4gICAgdGhpcy5fd3JpdGFibGVTdGF0ZS5maW5hbENhbGxlZCA9IGZhbHNlO1xuICAgIHRoaXMuX3dyaXRhYmxlU3RhdGUucHJlZmluaXNoZWQgPSBmYWxzZTtcbiAgICB0aGlzLl93cml0YWJsZVN0YXRlLmZpbmlzaGVkID0gZmFsc2U7XG4gICAgdGhpcy5fd3JpdGFibGVTdGF0ZS5lcnJvckVtaXR0ZWQgPSBmYWxzZTtcbiAgfVxufVxuXG5mdW5jdGlvbiBlbWl0RXJyb3JOVChzZWxmLCBlcnIpIHtcbiAgc2VsZi5lbWl0KCdlcnJvcicsIGVycik7XG59XG5cbm1vZHVsZS5leHBvcnRzID0ge1xuICBkZXN0cm95OiBkZXN0cm95LFxuICB1bmRlc3Ryb3k6IHVuZGVzdHJveVxufTsiLAogICAgIlxuLyoqXG4gKiBGb3IgTm9kZS5qcywgc2ltcGx5IHJlLWV4cG9ydCB0aGUgY29yZSBgdXRpbC5kZXByZWNhdGVgIGZ1bmN0aW9uLlxuICovXG5cbm1vZHVsZS5leHBvcnRzID0gcmVxdWlyZSgndXRpbCcpLmRlcHJlY2F0ZTtcbiIsCiAgICAiLy8gQ29weXJpZ2h0IEpveWVudCwgSW5jLiBhbmQgb3RoZXIgTm9kZSBjb250cmlidXRvcnMuXG4vL1xuLy8gUGVybWlzc2lvbiBpcyBoZXJlYnkgZ3JhbnRlZCwgZnJlZSBvZiBjaGFyZ2UsIHRvIGFueSBwZXJzb24gb2J0YWluaW5nIGFcbi8vIGNvcHkgb2YgdGhpcyBzb2Z0d2FyZSBhbmQgYXNzb2NpYXRlZCBkb2N1bWVudGF0aW9uIGZpbGVzICh0aGVcbi8vIFwiU29mdHdhcmVcIiksIHRvIGRlYWwgaW4gdGhlIFNvZnR3YXJlIHdpdGhvdXQgcmVzdHJpY3Rpb24sIGluY2x1ZGluZ1xuLy8gd2l0aG91dCBsaW1pdGF0aW9uIHRoZSByaWdodHMgdG8gdXNlLCBjb3B5LCBtb2RpZnksIG1lcmdlLCBwdWJsaXNoLFxuLy8gZGlzdHJpYnV0ZSwgc3VibGljZW5zZSwgYW5kL29yIHNlbGwgY29waWVzIG9mIHRoZSBTb2Z0d2FyZSwgYW5kIHRvIHBlcm1pdFxuLy8gcGVyc29ucyB0byB3aG9tIHRoZSBTb2Z0d2FyZSBpcyBmdXJuaXNoZWQgdG8gZG8gc28sIHN1YmplY3QgdG8gdGhlXG4vLyBmb2xsb3dpbmcgY29uZGl0aW9uczpcbi8vXG4vLyBUaGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBzaGFsbCBiZSBpbmNsdWRlZFxuLy8gaW4gYWxsIGNvcGllcyBvciBzdWJzdGFudGlhbCBwb3J0aW9ucyBvZiB0aGUgU29mdHdhcmUuXG4vL1xuLy8gVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEIFwiQVMgSVNcIiwgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwgRVhQUkVTU1xuLy8gT1IgSU1QTElFRCwgSU5DTFVESU5HIEJVVCBOT1QgTElNSVRFRCBUTyBUSEUgV0FSUkFOVElFUyBPRlxuLy8gTUVSQ0hBTlRBQklMSVRZLCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBTkQgTk9OSU5GUklOR0VNRU5ULiBJTlxuLy8gTk8gRVZFTlQgU0hBTEwgVEhFIEFVVEhPUlMgT1IgQ09QWVJJR0hUIEhPTERFUlMgQkUgTElBQkxFIEZPUiBBTlkgQ0xBSU0sXG4vLyBEQU1BR0VTIE9SIE9USEVSIExJQUJJTElUWSwgV0hFVEhFUiBJTiBBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsIFRPUlQgT1Jcbi8vIE9USEVSV0lTRSwgQVJJU0lORyBGUk9NLCBPVVQgT0YgT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBTT0ZUV0FSRSBPUiBUSEVcbi8vIFVTRSBPUiBPVEhFUiBERUFMSU5HUyBJTiBUSEUgU09GVFdBUkUuXG5cbi8vIEEgYml0IHNpbXBsZXIgdGhhbiByZWFkYWJsZSBzdHJlYW1zLlxuLy8gSW1wbGVtZW50IGFuIGFzeW5jIC5fd3JpdGUoY2h1bmssIGVuY29kaW5nLCBjYiksIGFuZCBpdCdsbCBoYW5kbGUgYWxsXG4vLyB0aGUgZHJhaW4gZXZlbnQgZW1pc3Npb24gYW5kIGJ1ZmZlcmluZy5cblxuJ3VzZSBzdHJpY3QnO1xuXG4vKjxyZXBsYWNlbWVudD4qL1xuXG52YXIgcG5hID0gcmVxdWlyZSgncHJvY2Vzcy1uZXh0aWNrLWFyZ3MnKTtcbi8qPC9yZXBsYWNlbWVudD4qL1xuXG5tb2R1bGUuZXhwb3J0cyA9IFdyaXRhYmxlO1xuXG4vKiA8cmVwbGFjZW1lbnQ+ICovXG5mdW5jdGlvbiBXcml0ZVJlcShjaHVuaywgZW5jb2RpbmcsIGNiKSB7XG4gIHRoaXMuY2h1bmsgPSBjaHVuaztcbiAgdGhpcy5lbmNvZGluZyA9IGVuY29kaW5nO1xuICB0aGlzLmNhbGxiYWNrID0gY2I7XG4gIHRoaXMubmV4dCA9IG51bGw7XG59XG5cbi8vIEl0IHNlZW1zIGEgbGlua2VkIGxpc3QgYnV0IGl0IGlzIG5vdFxuLy8gdGhlcmUgd2lsbCBiZSBvbmx5IDIgb2YgdGhlc2UgZm9yIGVhY2ggc3RyZWFtXG5mdW5jdGlvbiBDb3JrZWRSZXF1ZXN0KHN0YXRlKSB7XG4gIHZhciBfdGhpcyA9IHRoaXM7XG5cbiAgdGhpcy5uZXh0ID0gbnVsbDtcbiAgdGhpcy5lbnRyeSA9IG51bGw7XG4gIHRoaXMuZmluaXNoID0gZnVuY3Rpb24gKCkge1xuICAgIG9uQ29ya2VkRmluaXNoKF90aGlzLCBzdGF0ZSk7XG4gIH07XG59XG4vKiA8L3JlcGxhY2VtZW50PiAqL1xuXG4vKjxyZXBsYWNlbWVudD4qL1xudmFyIGFzeW5jV3JpdGUgPSAhcHJvY2Vzcy5icm93c2VyICYmIFsndjAuMTAnLCAndjAuOS4nXS5pbmRleE9mKHByb2Nlc3MudmVyc2lvbi5zbGljZSgwLCA1KSkgPiAtMSA/IHNldEltbWVkaWF0ZSA6IHBuYS5uZXh0VGljaztcbi8qPC9yZXBsYWNlbWVudD4qL1xuXG4vKjxyZXBsYWNlbWVudD4qL1xudmFyIER1cGxleDtcbi8qPC9yZXBsYWNlbWVudD4qL1xuXG5Xcml0YWJsZS5Xcml0YWJsZVN0YXRlID0gV3JpdGFibGVTdGF0ZTtcblxuLyo8cmVwbGFjZW1lbnQ+Ki9cbnZhciB1dGlsID0gT2JqZWN0LmNyZWF0ZShyZXF1aXJlKCdjb3JlLXV0aWwtaXMnKSk7XG51dGlsLmluaGVyaXRzID0gcmVxdWlyZSgnaW5oZXJpdHMnKTtcbi8qPC9yZXBsYWNlbWVudD4qL1xuXG4vKjxyZXBsYWNlbWVudD4qL1xudmFyIGludGVybmFsVXRpbCA9IHtcbiAgZGVwcmVjYXRlOiByZXF1aXJlKCd1dGlsLWRlcHJlY2F0ZScpXG59O1xuLyo8L3JlcGxhY2VtZW50PiovXG5cbi8qPHJlcGxhY2VtZW50PiovXG52YXIgU3RyZWFtID0gcmVxdWlyZSgnLi9pbnRlcm5hbC9zdHJlYW1zL3N0cmVhbScpO1xuLyo8L3JlcGxhY2VtZW50PiovXG5cbi8qPHJlcGxhY2VtZW50PiovXG5cbnZhciBCdWZmZXIgPSByZXF1aXJlKCdzYWZlLWJ1ZmZlcicpLkJ1ZmZlcjtcbnZhciBPdXJVaW50OEFycmF5ID0gKHR5cGVvZiBnbG9iYWwgIT09ICd1bmRlZmluZWQnID8gZ2xvYmFsIDogdHlwZW9mIHdpbmRvdyAhPT0gJ3VuZGVmaW5lZCcgPyB3aW5kb3cgOiB0eXBlb2Ygc2VsZiAhPT0gJ3VuZGVmaW5lZCcgPyBzZWxmIDoge30pLlVpbnQ4QXJyYXkgfHwgZnVuY3Rpb24gKCkge307XG5mdW5jdGlvbiBfdWludDhBcnJheVRvQnVmZmVyKGNodW5rKSB7XG4gIHJldHVybiBCdWZmZXIuZnJvbShjaHVuayk7XG59XG5mdW5jdGlvbiBfaXNVaW50OEFycmF5KG9iaikge1xuICByZXR1cm4gQnVmZmVyLmlzQnVmZmVyKG9iaikgfHwgb2JqIGluc3RhbmNlb2YgT3VyVWludDhBcnJheTtcbn1cblxuLyo8L3JlcGxhY2VtZW50PiovXG5cbnZhciBkZXN0cm95SW1wbCA9IHJlcXVpcmUoJy4vaW50ZXJuYWwvc3RyZWFtcy9kZXN0cm95Jyk7XG5cbnV0aWwuaW5oZXJpdHMoV3JpdGFibGUsIFN0cmVhbSk7XG5cbmZ1bmN0aW9uIG5vcCgpIHt9XG5cbmZ1bmN0aW9uIFdyaXRhYmxlU3RhdGUob3B0aW9ucywgc3RyZWFtKSB7XG4gIER1cGxleCA9IER1cGxleCB8fCByZXF1aXJlKCcuL19zdHJlYW1fZHVwbGV4Jyk7XG5cbiAgb3B0aW9ucyA9IG9wdGlvbnMgfHwge307XG5cbiAgLy8gRHVwbGV4IHN0cmVhbXMgYXJlIGJvdGggcmVhZGFibGUgYW5kIHdyaXRhYmxlLCBidXQgc2hhcmVcbiAgLy8gdGhlIHNhbWUgb3B0aW9ucyBvYmplY3QuXG4gIC8vIEhvd2V2ZXIsIHNvbWUgY2FzZXMgcmVxdWlyZSBzZXR0aW5nIG9wdGlvbnMgdG8gZGlmZmVyZW50XG4gIC8vIHZhbHVlcyBmb3IgdGhlIHJlYWRhYmxlIGFuZCB0aGUgd3JpdGFibGUgc2lkZXMgb2YgdGhlIGR1cGxleCBzdHJlYW0uXG4gIC8vIFRoZXNlIG9wdGlvbnMgY2FuIGJlIHByb3ZpZGVkIHNlcGFyYXRlbHkgYXMgcmVhZGFibGVYWFggYW5kIHdyaXRhYmxlWFhYLlxuICB2YXIgaXNEdXBsZXggPSBzdHJlYW0gaW5zdGFuY2VvZiBEdXBsZXg7XG5cbiAgLy8gb2JqZWN0IHN0cmVhbSBmbGFnIHRvIGluZGljYXRlIHdoZXRoZXIgb3Igbm90IHRoaXMgc3RyZWFtXG4gIC8vIGNvbnRhaW5zIGJ1ZmZlcnMgb3Igb2JqZWN0cy5cbiAgdGhpcy5vYmplY3RNb2RlID0gISFvcHRpb25zLm9iamVjdE1vZGU7XG5cbiAgaWYgKGlzRHVwbGV4KSB0aGlzLm9iamVjdE1vZGUgPSB0aGlzLm9iamVjdE1vZGUgfHwgISFvcHRpb25zLndyaXRhYmxlT2JqZWN0TW9kZTtcblxuICAvLyB0aGUgcG9pbnQgYXQgd2hpY2ggd3JpdGUoKSBzdGFydHMgcmV0dXJuaW5nIGZhbHNlXG4gIC8vIE5vdGU6IDAgaXMgYSB2YWxpZCB2YWx1ZSwgbWVhbnMgdGhhdCB3ZSBhbHdheXMgcmV0dXJuIGZhbHNlIGlmXG4gIC8vIHRoZSBlbnRpcmUgYnVmZmVyIGlzIG5vdCBmbHVzaGVkIGltbWVkaWF0ZWx5IG9uIHdyaXRlKClcbiAgdmFyIGh3bSA9IG9wdGlvbnMuaGlnaFdhdGVyTWFyaztcbiAgdmFyIHdyaXRhYmxlSHdtID0gb3B0aW9ucy53cml0YWJsZUhpZ2hXYXRlck1hcms7XG4gIHZhciBkZWZhdWx0SHdtID0gdGhpcy5vYmplY3RNb2RlID8gMTYgOiAxNiAqIDEwMjQ7XG5cbiAgaWYgKGh3bSB8fCBod20gPT09IDApIHRoaXMuaGlnaFdhdGVyTWFyayA9IGh3bTtlbHNlIGlmIChpc0R1cGxleCAmJiAod3JpdGFibGVId20gfHwgd3JpdGFibGVId20gPT09IDApKSB0aGlzLmhpZ2hXYXRlck1hcmsgPSB3cml0YWJsZUh3bTtlbHNlIHRoaXMuaGlnaFdhdGVyTWFyayA9IGRlZmF1bHRId207XG5cbiAgLy8gY2FzdCB0byBpbnRzLlxuICB0aGlzLmhpZ2hXYXRlck1hcmsgPSBNYXRoLmZsb29yKHRoaXMuaGlnaFdhdGVyTWFyayk7XG5cbiAgLy8gaWYgX2ZpbmFsIGhhcyBiZWVuIGNhbGxlZFxuICB0aGlzLmZpbmFsQ2FsbGVkID0gZmFsc2U7XG5cbiAgLy8gZHJhaW4gZXZlbnQgZmxhZy5cbiAgdGhpcy5uZWVkRHJhaW4gPSBmYWxzZTtcbiAgLy8gYXQgdGhlIHN0YXJ0IG9mIGNhbGxpbmcgZW5kKClcbiAgdGhpcy5lbmRpbmcgPSBmYWxzZTtcbiAgLy8gd2hlbiBlbmQoKSBoYXMgYmVlbiBjYWxsZWQsIGFuZCByZXR1cm5lZFxuICB0aGlzLmVuZGVkID0gZmFsc2U7XG4gIC8vIHdoZW4gJ2ZpbmlzaCcgaXMgZW1pdHRlZFxuICB0aGlzLmZpbmlzaGVkID0gZmFsc2U7XG5cbiAgLy8gaGFzIGl0IGJlZW4gZGVzdHJveWVkXG4gIHRoaXMuZGVzdHJveWVkID0gZmFsc2U7XG5cbiAgLy8gc2hvdWxkIHdlIGRlY29kZSBzdHJpbmdzIGludG8gYnVmZmVycyBiZWZvcmUgcGFzc2luZyB0byBfd3JpdGU/XG4gIC8vIHRoaXMgaXMgaGVyZSBzbyB0aGF0IHNvbWUgbm9kZS1jb3JlIHN0cmVhbXMgY2FuIG9wdGltaXplIHN0cmluZ1xuICAvLyBoYW5kbGluZyBhdCBhIGxvd2VyIGxldmVsLlxuICB2YXIgbm9EZWNvZGUgPSBvcHRpb25zLmRlY29kZVN0cmluZ3MgPT09IGZhbHNlO1xuICB0aGlzLmRlY29kZVN0cmluZ3MgPSAhbm9EZWNvZGU7XG5cbiAgLy8gQ3J5cHRvIGlzIGtpbmQgb2Ygb2xkIGFuZCBjcnVzdHkuICBIaXN0b3JpY2FsbHksIGl0cyBkZWZhdWx0IHN0cmluZ1xuICAvLyBlbmNvZGluZyBpcyAnYmluYXJ5JyBzbyB3ZSBoYXZlIHRvIG1ha2UgdGhpcyBjb25maWd1cmFibGUuXG4gIC8vIEV2ZXJ5dGhpbmcgZWxzZSBpbiB0aGUgdW5pdmVyc2UgdXNlcyAndXRmOCcsIHRob3VnaC5cbiAgdGhpcy5kZWZhdWx0RW5jb2RpbmcgPSBvcHRpb25zLmRlZmF1bHRFbmNvZGluZyB8fCAndXRmOCc7XG5cbiAgLy8gbm90IGFuIGFjdHVhbCBidWZmZXIgd2Uga2VlcCB0cmFjayBvZiwgYnV0IGEgbWVhc3VyZW1lbnRcbiAgLy8gb2YgaG93IG11Y2ggd2UncmUgd2FpdGluZyB0byBnZXQgcHVzaGVkIHRvIHNvbWUgdW5kZXJseWluZ1xuICAvLyBzb2NrZXQgb3IgZmlsZS5cbiAgdGhpcy5sZW5ndGggPSAwO1xuXG4gIC8vIGEgZmxhZyB0byBzZWUgd2hlbiB3ZSdyZSBpbiB0aGUgbWlkZGxlIG9mIGEgd3JpdGUuXG4gIHRoaXMud3JpdGluZyA9IGZhbHNlO1xuXG4gIC8vIHdoZW4gdHJ1ZSBhbGwgd3JpdGVzIHdpbGwgYmUgYnVmZmVyZWQgdW50aWwgLnVuY29yaygpIGNhbGxcbiAgdGhpcy5jb3JrZWQgPSAwO1xuXG4gIC8vIGEgZmxhZyB0byBiZSBhYmxlIHRvIHRlbGwgaWYgdGhlIG9ud3JpdGUgY2IgaXMgY2FsbGVkIGltbWVkaWF0ZWx5LFxuICAvLyBvciBvbiBhIGxhdGVyIHRpY2suICBXZSBzZXQgdGhpcyB0byB0cnVlIGF0IGZpcnN0LCBiZWNhdXNlIGFueVxuICAvLyBhY3Rpb25zIHRoYXQgc2hvdWxkbid0IGhhcHBlbiB1bnRpbCBcImxhdGVyXCIgc2hvdWxkIGdlbmVyYWxseSBhbHNvXG4gIC8vIG5vdCBoYXBwZW4gYmVmb3JlIHRoZSBmaXJzdCB3cml0ZSBjYWxsLlxuICB0aGlzLnN5bmMgPSB0cnVlO1xuXG4gIC8vIGEgZmxhZyB0byBrbm93IGlmIHdlJ3JlIHByb2Nlc3NpbmcgcHJldmlvdXNseSBidWZmZXJlZCBpdGVtcywgd2hpY2hcbiAgLy8gbWF5IGNhbGwgdGhlIF93cml0ZSgpIGNhbGxiYWNrIGluIHRoZSBzYW1lIHRpY2ssIHNvIHRoYXQgd2UgZG9uJ3RcbiAgLy8gZW5kIHVwIGluIGFuIG92ZXJsYXBwZWQgb253cml0ZSBzaXR1YXRpb24uXG4gIHRoaXMuYnVmZmVyUHJvY2Vzc2luZyA9IGZhbHNlO1xuXG4gIC8vIHRoZSBjYWxsYmFjayB0aGF0J3MgcGFzc2VkIHRvIF93cml0ZShjaHVuayxjYilcbiAgdGhpcy5vbndyaXRlID0gZnVuY3Rpb24gKGVyKSB7XG4gICAgb253cml0ZShzdHJlYW0sIGVyKTtcbiAgfTtcblxuICAvLyB0aGUgY2FsbGJhY2sgdGhhdCB0aGUgdXNlciBzdXBwbGllcyB0byB3cml0ZShjaHVuayxlbmNvZGluZyxjYilcbiAgdGhpcy53cml0ZWNiID0gbnVsbDtcblxuICAvLyB0aGUgYW1vdW50IHRoYXQgaXMgYmVpbmcgd3JpdHRlbiB3aGVuIF93cml0ZSBpcyBjYWxsZWQuXG4gIHRoaXMud3JpdGVsZW4gPSAwO1xuXG4gIHRoaXMuYnVmZmVyZWRSZXF1ZXN0ID0gbnVsbDtcbiAgdGhpcy5sYXN0QnVmZmVyZWRSZXF1ZXN0ID0gbnVsbDtcblxuICAvLyBudW1iZXIgb2YgcGVuZGluZyB1c2VyLXN1cHBsaWVkIHdyaXRlIGNhbGxiYWNrc1xuICAvLyB0aGlzIG11c3QgYmUgMCBiZWZvcmUgJ2ZpbmlzaCcgY2FuIGJlIGVtaXR0ZWRcbiAgdGhpcy5wZW5kaW5nY2IgPSAwO1xuXG4gIC8vIGVtaXQgcHJlZmluaXNoIGlmIHRoZSBvbmx5IHRoaW5nIHdlJ3JlIHdhaXRpbmcgZm9yIGlzIF93cml0ZSBjYnNcbiAgLy8gVGhpcyBpcyByZWxldmFudCBmb3Igc3luY2hyb25vdXMgVHJhbnNmb3JtIHN0cmVhbXNcbiAgdGhpcy5wcmVmaW5pc2hlZCA9IGZhbHNlO1xuXG4gIC8vIFRydWUgaWYgdGhlIGVycm9yIHdhcyBhbHJlYWR5IGVtaXR0ZWQgYW5kIHNob3VsZCBub3QgYmUgdGhyb3duIGFnYWluXG4gIHRoaXMuZXJyb3JFbWl0dGVkID0gZmFsc2U7XG5cbiAgLy8gY291bnQgYnVmZmVyZWQgcmVxdWVzdHNcbiAgdGhpcy5idWZmZXJlZFJlcXVlc3RDb3VudCA9IDA7XG5cbiAgLy8gYWxsb2NhdGUgdGhlIGZpcnN0IENvcmtlZFJlcXVlc3QsIHRoZXJlIGlzIGFsd2F5c1xuICAvLyBvbmUgYWxsb2NhdGVkIGFuZCBmcmVlIHRvIHVzZSwgYW5kIHdlIG1haW50YWluIGF0IG1vc3QgdHdvXG4gIHRoaXMuY29ya2VkUmVxdWVzdHNGcmVlID0gbmV3IENvcmtlZFJlcXVlc3QodGhpcyk7XG59XG5cbldyaXRhYmxlU3RhdGUucHJvdG90eXBlLmdldEJ1ZmZlciA9IGZ1bmN0aW9uIGdldEJ1ZmZlcigpIHtcbiAgdmFyIGN1cnJlbnQgPSB0aGlzLmJ1ZmZlcmVkUmVxdWVzdDtcbiAgdmFyIG91dCA9IFtdO1xuICB3aGlsZSAoY3VycmVudCkge1xuICAgIG91dC5wdXNoKGN1cnJlbnQpO1xuICAgIGN1cnJlbnQgPSBjdXJyZW50Lm5leHQ7XG4gIH1cbiAgcmV0dXJuIG91dDtcbn07XG5cbihmdW5jdGlvbiAoKSB7XG4gIHRyeSB7XG4gICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KFdyaXRhYmxlU3RhdGUucHJvdG90eXBlLCAnYnVmZmVyJywge1xuICAgICAgZ2V0OiBpbnRlcm5hbFV0aWwuZGVwcmVjYXRlKGZ1bmN0aW9uICgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuZ2V0QnVmZmVyKCk7XG4gICAgICB9LCAnX3dyaXRhYmxlU3RhdGUuYnVmZmVyIGlzIGRlcHJlY2F0ZWQuIFVzZSBfd3JpdGFibGVTdGF0ZS5nZXRCdWZmZXIgJyArICdpbnN0ZWFkLicsICdERVAwMDAzJylcbiAgICB9KTtcbiAgfSBjYXRjaCAoXykge31cbn0pKCk7XG5cbi8vIFRlc3QgX3dyaXRhYmxlU3RhdGUgZm9yIGluaGVyaXRhbmNlIHRvIGFjY291bnQgZm9yIER1cGxleCBzdHJlYW1zLFxuLy8gd2hvc2UgcHJvdG90eXBlIGNoYWluIG9ubHkgcG9pbnRzIHRvIFJlYWRhYmxlLlxudmFyIHJlYWxIYXNJbnN0YW5jZTtcbmlmICh0eXBlb2YgU3ltYm9sID09PSAnZnVuY3Rpb24nICYmIFN5bWJvbC5oYXNJbnN0YW5jZSAmJiB0eXBlb2YgRnVuY3Rpb24ucHJvdG90eXBlW1N5bWJvbC5oYXNJbnN0YW5jZV0gPT09ICdmdW5jdGlvbicpIHtcbiAgcmVhbEhhc0luc3RhbmNlID0gRnVuY3Rpb24ucHJvdG90eXBlW1N5bWJvbC5oYXNJbnN0YW5jZV07XG4gIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShXcml0YWJsZSwgU3ltYm9sLmhhc0luc3RhbmNlLCB7XG4gICAgdmFsdWU6IGZ1bmN0aW9uIChvYmplY3QpIHtcbiAgICAgIGlmIChyZWFsSGFzSW5zdGFuY2UuY2FsbCh0aGlzLCBvYmplY3QpKSByZXR1cm4gdHJ1ZTtcbiAgICAgIGlmICh0aGlzICE9PSBXcml0YWJsZSkgcmV0dXJuIGZhbHNlO1xuXG4gICAgICByZXR1cm4gb2JqZWN0ICYmIG9iamVjdC5fd3JpdGFibGVTdGF0ZSBpbnN0YW5jZW9mIFdyaXRhYmxlU3RhdGU7XG4gICAgfVxuICB9KTtcbn0gZWxzZSB7XG4gIHJlYWxIYXNJbnN0YW5jZSA9IGZ1bmN0aW9uIChvYmplY3QpIHtcbiAgICByZXR1cm4gb2JqZWN0IGluc3RhbmNlb2YgdGhpcztcbiAgfTtcbn1cblxuZnVuY3Rpb24gV3JpdGFibGUob3B0aW9ucykge1xuICBEdXBsZXggPSBEdXBsZXggfHwgcmVxdWlyZSgnLi9fc3RyZWFtX2R1cGxleCcpO1xuXG4gIC8vIFdyaXRhYmxlIGN0b3IgaXMgYXBwbGllZCB0byBEdXBsZXhlcywgdG9vLlxuICAvLyBgcmVhbEhhc0luc3RhbmNlYCBpcyBuZWNlc3NhcnkgYmVjYXVzZSB1c2luZyBwbGFpbiBgaW5zdGFuY2VvZmBcbiAgLy8gd291bGQgcmV0dXJuIGZhbHNlLCBhcyBubyBgX3dyaXRhYmxlU3RhdGVgIHByb3BlcnR5IGlzIGF0dGFjaGVkLlxuXG4gIC8vIFRyeWluZyB0byB1c2UgdGhlIGN1c3RvbSBgaW5zdGFuY2VvZmAgZm9yIFdyaXRhYmxlIGhlcmUgd2lsbCBhbHNvIGJyZWFrIHRoZVxuICAvLyBOb2RlLmpzIExhenlUcmFuc2Zvcm0gaW1wbGVtZW50YXRpb24sIHdoaWNoIGhhcyBhIG5vbi10cml2aWFsIGdldHRlciBmb3JcbiAgLy8gYF93cml0YWJsZVN0YXRlYCB0aGF0IHdvdWxkIGxlYWQgdG8gaW5maW5pdGUgcmVjdXJzaW9uLlxuICBpZiAoIXJlYWxIYXNJbnN0YW5jZS5jYWxsKFdyaXRhYmxlLCB0aGlzKSAmJiAhKHRoaXMgaW5zdGFuY2VvZiBEdXBsZXgpKSB7XG4gICAgcmV0dXJuIG5ldyBXcml0YWJsZShvcHRpb25zKTtcbiAgfVxuXG4gIHRoaXMuX3dyaXRhYmxlU3RhdGUgPSBuZXcgV3JpdGFibGVTdGF0ZShvcHRpb25zLCB0aGlzKTtcblxuICAvLyBsZWdhY3kuXG4gIHRoaXMud3JpdGFibGUgPSB0cnVlO1xuXG4gIGlmIChvcHRpb25zKSB7XG4gICAgaWYgKHR5cGVvZiBvcHRpb25zLndyaXRlID09PSAnZnVuY3Rpb24nKSB0aGlzLl93cml0ZSA9IG9wdGlvbnMud3JpdGU7XG5cbiAgICBpZiAodHlwZW9mIG9wdGlvbnMud3JpdGV2ID09PSAnZnVuY3Rpb24nKSB0aGlzLl93cml0ZXYgPSBvcHRpb25zLndyaXRldjtcblxuICAgIGlmICh0eXBlb2Ygb3B0aW9ucy5kZXN0cm95ID09PSAnZnVuY3Rpb24nKSB0aGlzLl9kZXN0cm95ID0gb3B0aW9ucy5kZXN0cm95O1xuXG4gICAgaWYgKHR5cGVvZiBvcHRpb25zLmZpbmFsID09PSAnZnVuY3Rpb24nKSB0aGlzLl9maW5hbCA9IG9wdGlvbnMuZmluYWw7XG4gIH1cblxuICBTdHJlYW0uY2FsbCh0aGlzKTtcbn1cblxuLy8gT3RoZXJ3aXNlIHBlb3BsZSBjYW4gcGlwZSBXcml0YWJsZSBzdHJlYW1zLCB3aGljaCBpcyBqdXN0IHdyb25nLlxuV3JpdGFibGUucHJvdG90eXBlLnBpcGUgPSBmdW5jdGlvbiAoKSB7XG4gIHRoaXMuZW1pdCgnZXJyb3InLCBuZXcgRXJyb3IoJ0Nhbm5vdCBwaXBlLCBub3QgcmVhZGFibGUnKSk7XG59O1xuXG5mdW5jdGlvbiB3cml0ZUFmdGVyRW5kKHN0cmVhbSwgY2IpIHtcbiAgdmFyIGVyID0gbmV3IEVycm9yKCd3cml0ZSBhZnRlciBlbmQnKTtcbiAgLy8gVE9ETzogZGVmZXIgZXJyb3IgZXZlbnRzIGNvbnNpc3RlbnRseSBldmVyeXdoZXJlLCBub3QganVzdCB0aGUgY2JcbiAgc3RyZWFtLmVtaXQoJ2Vycm9yJywgZXIpO1xuICBwbmEubmV4dFRpY2soY2IsIGVyKTtcbn1cblxuLy8gQ2hlY2tzIHRoYXQgYSB1c2VyLXN1cHBsaWVkIGNodW5rIGlzIHZhbGlkLCBlc3BlY2lhbGx5IGZvciB0aGUgcGFydGljdWxhclxuLy8gbW9kZSB0aGUgc3RyZWFtIGlzIGluLiBDdXJyZW50bHkgdGhpcyBtZWFucyB0aGF0IGBudWxsYCBpcyBuZXZlciBhY2NlcHRlZFxuLy8gYW5kIHVuZGVmaW5lZC9ub24tc3RyaW5nIHZhbHVlcyBhcmUgb25seSBhbGxvd2VkIGluIG9iamVjdCBtb2RlLlxuZnVuY3Rpb24gdmFsaWRDaHVuayhzdHJlYW0sIHN0YXRlLCBjaHVuaywgY2IpIHtcbiAgdmFyIHZhbGlkID0gdHJ1ZTtcbiAgdmFyIGVyID0gZmFsc2U7XG5cbiAgaWYgKGNodW5rID09PSBudWxsKSB7XG4gICAgZXIgPSBuZXcgVHlwZUVycm9yKCdNYXkgbm90IHdyaXRlIG51bGwgdmFsdWVzIHRvIHN0cmVhbScpO1xuICB9IGVsc2UgaWYgKHR5cGVvZiBjaHVuayAhPT0gJ3N0cmluZycgJiYgY2h1bmsgIT09IHVuZGVmaW5lZCAmJiAhc3RhdGUub2JqZWN0TW9kZSkge1xuICAgIGVyID0gbmV3IFR5cGVFcnJvcignSW52YWxpZCBub24tc3RyaW5nL2J1ZmZlciBjaHVuaycpO1xuICB9XG4gIGlmIChlcikge1xuICAgIHN0cmVhbS5lbWl0KCdlcnJvcicsIGVyKTtcbiAgICBwbmEubmV4dFRpY2soY2IsIGVyKTtcbiAgICB2YWxpZCA9IGZhbHNlO1xuICB9XG4gIHJldHVybiB2YWxpZDtcbn1cblxuV3JpdGFibGUucHJvdG90eXBlLndyaXRlID0gZnVuY3Rpb24gKGNodW5rLCBlbmNvZGluZywgY2IpIHtcbiAgdmFyIHN0YXRlID0gdGhpcy5fd3JpdGFibGVTdGF0ZTtcbiAgdmFyIHJldCA9IGZhbHNlO1xuICB2YXIgaXNCdWYgPSAhc3RhdGUub2JqZWN0TW9kZSAmJiBfaXNVaW50OEFycmF5KGNodW5rKTtcblxuICBpZiAoaXNCdWYgJiYgIUJ1ZmZlci5pc0J1ZmZlcihjaHVuaykpIHtcbiAgICBjaHVuayA9IF91aW50OEFycmF5VG9CdWZmZXIoY2h1bmspO1xuICB9XG5cbiAgaWYgKHR5cGVvZiBlbmNvZGluZyA9PT0gJ2Z1bmN0aW9uJykge1xuICAgIGNiID0gZW5jb2Rpbmc7XG4gICAgZW5jb2RpbmcgPSBudWxsO1xuICB9XG5cbiAgaWYgKGlzQnVmKSBlbmNvZGluZyA9ICdidWZmZXInO2Vsc2UgaWYgKCFlbmNvZGluZykgZW5jb2RpbmcgPSBzdGF0ZS5kZWZhdWx0RW5jb2Rpbmc7XG5cbiAgaWYgKHR5cGVvZiBjYiAhPT0gJ2Z1bmN0aW9uJykgY2IgPSBub3A7XG5cbiAgaWYgKHN0YXRlLmVuZGVkKSB3cml0ZUFmdGVyRW5kKHRoaXMsIGNiKTtlbHNlIGlmIChpc0J1ZiB8fCB2YWxpZENodW5rKHRoaXMsIHN0YXRlLCBjaHVuaywgY2IpKSB7XG4gICAgc3RhdGUucGVuZGluZ2NiKys7XG4gICAgcmV0ID0gd3JpdGVPckJ1ZmZlcih0aGlzLCBzdGF0ZSwgaXNCdWYsIGNodW5rLCBlbmNvZGluZywgY2IpO1xuICB9XG5cbiAgcmV0dXJuIHJldDtcbn07XG5cbldyaXRhYmxlLnByb3RvdHlwZS5jb3JrID0gZnVuY3Rpb24gKCkge1xuICB2YXIgc3RhdGUgPSB0aGlzLl93cml0YWJsZVN0YXRlO1xuXG4gIHN0YXRlLmNvcmtlZCsrO1xufTtcblxuV3JpdGFibGUucHJvdG90eXBlLnVuY29yayA9IGZ1bmN0aW9uICgpIHtcbiAgdmFyIHN0YXRlID0gdGhpcy5fd3JpdGFibGVTdGF0ZTtcblxuICBpZiAoc3RhdGUuY29ya2VkKSB7XG4gICAgc3RhdGUuY29ya2VkLS07XG5cbiAgICBpZiAoIXN0YXRlLndyaXRpbmcgJiYgIXN0YXRlLmNvcmtlZCAmJiAhc3RhdGUuYnVmZmVyUHJvY2Vzc2luZyAmJiBzdGF0ZS5idWZmZXJlZFJlcXVlc3QpIGNsZWFyQnVmZmVyKHRoaXMsIHN0YXRlKTtcbiAgfVxufTtcblxuV3JpdGFibGUucHJvdG90eXBlLnNldERlZmF1bHRFbmNvZGluZyA9IGZ1bmN0aW9uIHNldERlZmF1bHRFbmNvZGluZyhlbmNvZGluZykge1xuICAvLyBub2RlOjpQYXJzZUVuY29kaW5nKCkgcmVxdWlyZXMgbG93ZXIgY2FzZS5cbiAgaWYgKHR5cGVvZiBlbmNvZGluZyA9PT0gJ3N0cmluZycpIGVuY29kaW5nID0gZW5jb2RpbmcudG9Mb3dlckNhc2UoKTtcbiAgaWYgKCEoWydoZXgnLCAndXRmOCcsICd1dGYtOCcsICdhc2NpaScsICdiaW5hcnknLCAnYmFzZTY0JywgJ3VjczInLCAndWNzLTInLCAndXRmMTZsZScsICd1dGYtMTZsZScsICdyYXcnXS5pbmRleE9mKChlbmNvZGluZyArICcnKS50b0xvd2VyQ2FzZSgpKSA+IC0xKSkgdGhyb3cgbmV3IFR5cGVFcnJvcignVW5rbm93biBlbmNvZGluZzogJyArIGVuY29kaW5nKTtcbiAgdGhpcy5fd3JpdGFibGVTdGF0ZS5kZWZhdWx0RW5jb2RpbmcgPSBlbmNvZGluZztcbiAgcmV0dXJuIHRoaXM7XG59O1xuXG5mdW5jdGlvbiBkZWNvZGVDaHVuayhzdGF0ZSwgY2h1bmssIGVuY29kaW5nKSB7XG4gIGlmICghc3RhdGUub2JqZWN0TW9kZSAmJiBzdGF0ZS5kZWNvZGVTdHJpbmdzICE9PSBmYWxzZSAmJiB0eXBlb2YgY2h1bmsgPT09ICdzdHJpbmcnKSB7XG4gICAgY2h1bmsgPSBCdWZmZXIuZnJvbShjaHVuaywgZW5jb2RpbmcpO1xuICB9XG4gIHJldHVybiBjaHVuaztcbn1cblxuT2JqZWN0LmRlZmluZVByb3BlcnR5KFdyaXRhYmxlLnByb3RvdHlwZSwgJ3dyaXRhYmxlSGlnaFdhdGVyTWFyaycsIHtcbiAgLy8gbWFraW5nIGl0IGV4cGxpY2l0IHRoaXMgcHJvcGVydHkgaXMgbm90IGVudW1lcmFibGVcbiAgLy8gYmVjYXVzZSBvdGhlcndpc2Ugc29tZSBwcm90b3R5cGUgbWFuaXB1bGF0aW9uIGluXG4gIC8vIHVzZXJsYW5kIHdpbGwgZmFpbFxuICBlbnVtZXJhYmxlOiBmYWxzZSxcbiAgZ2V0OiBmdW5jdGlvbiAoKSB7XG4gICAgcmV0dXJuIHRoaXMuX3dyaXRhYmxlU3RhdGUuaGlnaFdhdGVyTWFyaztcbiAgfVxufSk7XG5cbi8vIGlmIHdlJ3JlIGFscmVhZHkgd3JpdGluZyBzb21ldGhpbmcsIHRoZW4ganVzdCBwdXQgdGhpc1xuLy8gaW4gdGhlIHF1ZXVlLCBhbmQgd2FpdCBvdXIgdHVybi4gIE90aGVyd2lzZSwgY2FsbCBfd3JpdGVcbi8vIElmIHdlIHJldHVybiBmYWxzZSwgdGhlbiB3ZSBuZWVkIGEgZHJhaW4gZXZlbnQsIHNvIHNldCB0aGF0IGZsYWcuXG5mdW5jdGlvbiB3cml0ZU9yQnVmZmVyKHN0cmVhbSwgc3RhdGUsIGlzQnVmLCBjaHVuaywgZW5jb2RpbmcsIGNiKSB7XG4gIGlmICghaXNCdWYpIHtcbiAgICB2YXIgbmV3Q2h1bmsgPSBkZWNvZGVDaHVuayhzdGF0ZSwgY2h1bmssIGVuY29kaW5nKTtcbiAgICBpZiAoY2h1bmsgIT09IG5ld0NodW5rKSB7XG4gICAgICBpc0J1ZiA9IHRydWU7XG4gICAgICBlbmNvZGluZyA9ICdidWZmZXInO1xuICAgICAgY2h1bmsgPSBuZXdDaHVuaztcbiAgICB9XG4gIH1cbiAgdmFyIGxlbiA9IHN0YXRlLm9iamVjdE1vZGUgPyAxIDogY2h1bmsubGVuZ3RoO1xuXG4gIHN0YXRlLmxlbmd0aCArPSBsZW47XG5cbiAgdmFyIHJldCA9IHN0YXRlLmxlbmd0aCA8IHN0YXRlLmhpZ2hXYXRlck1hcms7XG4gIC8vIHdlIG11c3QgZW5zdXJlIHRoYXQgcHJldmlvdXMgbmVlZERyYWluIHdpbGwgbm90IGJlIHJlc2V0IHRvIGZhbHNlLlxuICBpZiAoIXJldCkgc3RhdGUubmVlZERyYWluID0gdHJ1ZTtcblxuICBpZiAoc3RhdGUud3JpdGluZyB8fCBzdGF0ZS5jb3JrZWQpIHtcbiAgICB2YXIgbGFzdCA9IHN0YXRlLmxhc3RCdWZmZXJlZFJlcXVlc3Q7XG4gICAgc3RhdGUubGFzdEJ1ZmZlcmVkUmVxdWVzdCA9IHtcbiAgICAgIGNodW5rOiBjaHVuayxcbiAgICAgIGVuY29kaW5nOiBlbmNvZGluZyxcbiAgICAgIGlzQnVmOiBpc0J1ZixcbiAgICAgIGNhbGxiYWNrOiBjYixcbiAgICAgIG5leHQ6IG51bGxcbiAgICB9O1xuICAgIGlmIChsYXN0KSB7XG4gICAgICBsYXN0Lm5leHQgPSBzdGF0ZS5sYXN0QnVmZmVyZWRSZXF1ZXN0O1xuICAgIH0gZWxzZSB7XG4gICAgICBzdGF0ZS5idWZmZXJlZFJlcXVlc3QgPSBzdGF0ZS5sYXN0QnVmZmVyZWRSZXF1ZXN0O1xuICAgIH1cbiAgICBzdGF0ZS5idWZmZXJlZFJlcXVlc3RDb3VudCArPSAxO1xuICB9IGVsc2Uge1xuICAgIGRvV3JpdGUoc3RyZWFtLCBzdGF0ZSwgZmFsc2UsIGxlbiwgY2h1bmssIGVuY29kaW5nLCBjYik7XG4gIH1cblxuICByZXR1cm4gcmV0O1xufVxuXG5mdW5jdGlvbiBkb1dyaXRlKHN0cmVhbSwgc3RhdGUsIHdyaXRldiwgbGVuLCBjaHVuaywgZW5jb2RpbmcsIGNiKSB7XG4gIHN0YXRlLndyaXRlbGVuID0gbGVuO1xuICBzdGF0ZS53cml0ZWNiID0gY2I7XG4gIHN0YXRlLndyaXRpbmcgPSB0cnVlO1xuICBzdGF0ZS5zeW5jID0gdHJ1ZTtcbiAgaWYgKHdyaXRldikgc3RyZWFtLl93cml0ZXYoY2h1bmssIHN0YXRlLm9ud3JpdGUpO2Vsc2Ugc3RyZWFtLl93cml0ZShjaHVuaywgZW5jb2RpbmcsIHN0YXRlLm9ud3JpdGUpO1xuICBzdGF0ZS5zeW5jID0gZmFsc2U7XG59XG5cbmZ1bmN0aW9uIG9ud3JpdGVFcnJvcihzdHJlYW0sIHN0YXRlLCBzeW5jLCBlciwgY2IpIHtcbiAgLS1zdGF0ZS5wZW5kaW5nY2I7XG5cbiAgaWYgKHN5bmMpIHtcbiAgICAvLyBkZWZlciB0aGUgY2FsbGJhY2sgaWYgd2UgYXJlIGJlaW5nIGNhbGxlZCBzeW5jaHJvbm91c2x5XG4gICAgLy8gdG8gYXZvaWQgcGlsaW5nIHVwIHRoaW5ncyBvbiB0aGUgc3RhY2tcbiAgICBwbmEubmV4dFRpY2soY2IsIGVyKTtcbiAgICAvLyB0aGlzIGNhbiBlbWl0IGZpbmlzaCwgYW5kIGl0IHdpbGwgYWx3YXlzIGhhcHBlblxuICAgIC8vIGFmdGVyIGVycm9yXG4gICAgcG5hLm5leHRUaWNrKGZpbmlzaE1heWJlLCBzdHJlYW0sIHN0YXRlKTtcbiAgICBzdHJlYW0uX3dyaXRhYmxlU3RhdGUuZXJyb3JFbWl0dGVkID0gdHJ1ZTtcbiAgICBzdHJlYW0uZW1pdCgnZXJyb3InLCBlcik7XG4gIH0gZWxzZSB7XG4gICAgLy8gdGhlIGNhbGxlciBleHBlY3QgdGhpcyB0byBoYXBwZW4gYmVmb3JlIGlmXG4gICAgLy8gaXQgaXMgYXN5bmNcbiAgICBjYihlcik7XG4gICAgc3RyZWFtLl93cml0YWJsZVN0YXRlLmVycm9yRW1pdHRlZCA9IHRydWU7XG4gICAgc3RyZWFtLmVtaXQoJ2Vycm9yJywgZXIpO1xuICAgIC8vIHRoaXMgY2FuIGVtaXQgZmluaXNoLCBidXQgZmluaXNoIG11c3RcbiAgICAvLyBhbHdheXMgZm9sbG93IGVycm9yXG4gICAgZmluaXNoTWF5YmUoc3RyZWFtLCBzdGF0ZSk7XG4gIH1cbn1cblxuZnVuY3Rpb24gb253cml0ZVN0YXRlVXBkYXRlKHN0YXRlKSB7XG4gIHN0YXRlLndyaXRpbmcgPSBmYWxzZTtcbiAgc3RhdGUud3JpdGVjYiA9IG51bGw7XG4gIHN0YXRlLmxlbmd0aCAtPSBzdGF0ZS53cml0ZWxlbjtcbiAgc3RhdGUud3JpdGVsZW4gPSAwO1xufVxuXG5mdW5jdGlvbiBvbndyaXRlKHN0cmVhbSwgZXIpIHtcbiAgdmFyIHN0YXRlID0gc3RyZWFtLl93cml0YWJsZVN0YXRlO1xuICB2YXIgc3luYyA9IHN0YXRlLnN5bmM7XG4gIHZhciBjYiA9IHN0YXRlLndyaXRlY2I7XG5cbiAgb253cml0ZVN0YXRlVXBkYXRlKHN0YXRlKTtcblxuICBpZiAoZXIpIG9ud3JpdGVFcnJvcihzdHJlYW0sIHN0YXRlLCBzeW5jLCBlciwgY2IpO2Vsc2Uge1xuICAgIC8vIENoZWNrIGlmIHdlJ3JlIGFjdHVhbGx5IHJlYWR5IHRvIGZpbmlzaCwgYnV0IGRvbid0IGVtaXQgeWV0XG4gICAgdmFyIGZpbmlzaGVkID0gbmVlZEZpbmlzaChzdGF0ZSk7XG5cbiAgICBpZiAoIWZpbmlzaGVkICYmICFzdGF0ZS5jb3JrZWQgJiYgIXN0YXRlLmJ1ZmZlclByb2Nlc3NpbmcgJiYgc3RhdGUuYnVmZmVyZWRSZXF1ZXN0KSB7XG4gICAgICBjbGVhckJ1ZmZlcihzdHJlYW0sIHN0YXRlKTtcbiAgICB9XG5cbiAgICBpZiAoc3luYykge1xuICAgICAgLyo8cmVwbGFjZW1lbnQ+Ki9cbiAgICAgIGFzeW5jV3JpdGUoYWZ0ZXJXcml0ZSwgc3RyZWFtLCBzdGF0ZSwgZmluaXNoZWQsIGNiKTtcbiAgICAgIC8qPC9yZXBsYWNlbWVudD4qL1xuICAgIH0gZWxzZSB7XG4gICAgICBhZnRlcldyaXRlKHN0cmVhbSwgc3RhdGUsIGZpbmlzaGVkLCBjYik7XG4gICAgfVxuICB9XG59XG5cbmZ1bmN0aW9uIGFmdGVyV3JpdGUoc3RyZWFtLCBzdGF0ZSwgZmluaXNoZWQsIGNiKSB7XG4gIGlmICghZmluaXNoZWQpIG9ud3JpdGVEcmFpbihzdHJlYW0sIHN0YXRlKTtcbiAgc3RhdGUucGVuZGluZ2NiLS07XG4gIGNiKCk7XG4gIGZpbmlzaE1heWJlKHN0cmVhbSwgc3RhdGUpO1xufVxuXG4vLyBNdXN0IGZvcmNlIGNhbGxiYWNrIHRvIGJlIGNhbGxlZCBvbiBuZXh0VGljaywgc28gdGhhdCB3ZSBkb24ndFxuLy8gZW1pdCAnZHJhaW4nIGJlZm9yZSB0aGUgd3JpdGUoKSBjb25zdW1lciBnZXRzIHRoZSAnZmFsc2UnIHJldHVyblxuLy8gdmFsdWUsIGFuZCBoYXMgYSBjaGFuY2UgdG8gYXR0YWNoIGEgJ2RyYWluJyBsaXN0ZW5lci5cbmZ1bmN0aW9uIG9ud3JpdGVEcmFpbihzdHJlYW0sIHN0YXRlKSB7XG4gIGlmIChzdGF0ZS5sZW5ndGggPT09IDAgJiYgc3RhdGUubmVlZERyYWluKSB7XG4gICAgc3RhdGUubmVlZERyYWluID0gZmFsc2U7XG4gICAgc3RyZWFtLmVtaXQoJ2RyYWluJyk7XG4gIH1cbn1cblxuLy8gaWYgdGhlcmUncyBzb21ldGhpbmcgaW4gdGhlIGJ1ZmZlciB3YWl0aW5nLCB0aGVuIHByb2Nlc3MgaXRcbmZ1bmN0aW9uIGNsZWFyQnVmZmVyKHN0cmVhbSwgc3RhdGUpIHtcbiAgc3RhdGUuYnVmZmVyUHJvY2Vzc2luZyA9IHRydWU7XG4gIHZhciBlbnRyeSA9IHN0YXRlLmJ1ZmZlcmVkUmVxdWVzdDtcblxuICBpZiAoc3RyZWFtLl93cml0ZXYgJiYgZW50cnkgJiYgZW50cnkubmV4dCkge1xuICAgIC8vIEZhc3QgY2FzZSwgd3JpdGUgZXZlcnl0aGluZyB1c2luZyBfd3JpdGV2KClcbiAgICB2YXIgbCA9IHN0YXRlLmJ1ZmZlcmVkUmVxdWVzdENvdW50O1xuICAgIHZhciBidWZmZXIgPSBuZXcgQXJyYXkobCk7XG4gICAgdmFyIGhvbGRlciA9IHN0YXRlLmNvcmtlZFJlcXVlc3RzRnJlZTtcbiAgICBob2xkZXIuZW50cnkgPSBlbnRyeTtcblxuICAgIHZhciBjb3VudCA9IDA7XG4gICAgdmFyIGFsbEJ1ZmZlcnMgPSB0cnVlO1xuICAgIHdoaWxlIChlbnRyeSkge1xuICAgICAgYnVmZmVyW2NvdW50XSA9IGVudHJ5O1xuICAgICAgaWYgKCFlbnRyeS5pc0J1ZikgYWxsQnVmZmVycyA9IGZhbHNlO1xuICAgICAgZW50cnkgPSBlbnRyeS5uZXh0O1xuICAgICAgY291bnQgKz0gMTtcbiAgICB9XG4gICAgYnVmZmVyLmFsbEJ1ZmZlcnMgPSBhbGxCdWZmZXJzO1xuXG4gICAgZG9Xcml0ZShzdHJlYW0sIHN0YXRlLCB0cnVlLCBzdGF0ZS5sZW5ndGgsIGJ1ZmZlciwgJycsIGhvbGRlci5maW5pc2gpO1xuXG4gICAgLy8gZG9Xcml0ZSBpcyBhbG1vc3QgYWx3YXlzIGFzeW5jLCBkZWZlciB0aGVzZSB0byBzYXZlIGEgYml0IG9mIHRpbWVcbiAgICAvLyBhcyB0aGUgaG90IHBhdGggZW5kcyB3aXRoIGRvV3JpdGVcbiAgICBzdGF0ZS5wZW5kaW5nY2IrKztcbiAgICBzdGF0ZS5sYXN0QnVmZmVyZWRSZXF1ZXN0ID0gbnVsbDtcbiAgICBpZiAoaG9sZGVyLm5leHQpIHtcbiAgICAgIHN0YXRlLmNvcmtlZFJlcXVlc3RzRnJlZSA9IGhvbGRlci5uZXh0O1xuICAgICAgaG9sZGVyLm5leHQgPSBudWxsO1xuICAgIH0gZWxzZSB7XG4gICAgICBzdGF0ZS5jb3JrZWRSZXF1ZXN0c0ZyZWUgPSBuZXcgQ29ya2VkUmVxdWVzdChzdGF0ZSk7XG4gICAgfVxuICAgIHN0YXRlLmJ1ZmZlcmVkUmVxdWVzdENvdW50ID0gMDtcbiAgfSBlbHNlIHtcbiAgICAvLyBTbG93IGNhc2UsIHdyaXRlIGNodW5rcyBvbmUtYnktb25lXG4gICAgd2hpbGUgKGVudHJ5KSB7XG4gICAgICB2YXIgY2h1bmsgPSBlbnRyeS5jaHVuaztcbiAgICAgIHZhciBlbmNvZGluZyA9IGVudHJ5LmVuY29kaW5nO1xuICAgICAgdmFyIGNiID0gZW50cnkuY2FsbGJhY2s7XG4gICAgICB2YXIgbGVuID0gc3RhdGUub2JqZWN0TW9kZSA/IDEgOiBjaHVuay5sZW5ndGg7XG5cbiAgICAgIGRvV3JpdGUoc3RyZWFtLCBzdGF0ZSwgZmFsc2UsIGxlbiwgY2h1bmssIGVuY29kaW5nLCBjYik7XG4gICAgICBlbnRyeSA9IGVudHJ5Lm5leHQ7XG4gICAgICBzdGF0ZS5idWZmZXJlZFJlcXVlc3RDb3VudC0tO1xuICAgICAgLy8gaWYgd2UgZGlkbid0IGNhbGwgdGhlIG9ud3JpdGUgaW1tZWRpYXRlbHksIHRoZW5cbiAgICAgIC8vIGl0IG1lYW5zIHRoYXQgd2UgbmVlZCB0byB3YWl0IHVudGlsIGl0IGRvZXMuXG4gICAgICAvLyBhbHNvLCB0aGF0IG1lYW5zIHRoYXQgdGhlIGNodW5rIGFuZCBjYiBhcmUgY3VycmVudGx5XG4gICAgICAvLyBiZWluZyBwcm9jZXNzZWQsIHNvIG1vdmUgdGhlIGJ1ZmZlciBjb3VudGVyIHBhc3QgdGhlbS5cbiAgICAgIGlmIChzdGF0ZS53cml0aW5nKSB7XG4gICAgICAgIGJyZWFrO1xuICAgICAgfVxuICAgIH1cblxuICAgIGlmIChlbnRyeSA9PT0gbnVsbCkgc3RhdGUubGFzdEJ1ZmZlcmVkUmVxdWVzdCA9IG51bGw7XG4gIH1cblxuICBzdGF0ZS5idWZmZXJlZFJlcXVlc3QgPSBlbnRyeTtcbiAgc3RhdGUuYnVmZmVyUHJvY2Vzc2luZyA9IGZhbHNlO1xufVxuXG5Xcml0YWJsZS5wcm90b3R5cGUuX3dyaXRlID0gZnVuY3Rpb24gKGNodW5rLCBlbmNvZGluZywgY2IpIHtcbiAgY2IobmV3IEVycm9yKCdfd3JpdGUoKSBpcyBub3QgaW1wbGVtZW50ZWQnKSk7XG59O1xuXG5Xcml0YWJsZS5wcm90b3R5cGUuX3dyaXRldiA9IG51bGw7XG5cbldyaXRhYmxlLnByb3RvdHlwZS5lbmQgPSBmdW5jdGlvbiAoY2h1bmssIGVuY29kaW5nLCBjYikge1xuICB2YXIgc3RhdGUgPSB0aGlzLl93cml0YWJsZVN0YXRlO1xuXG4gIGlmICh0eXBlb2YgY2h1bmsgPT09ICdmdW5jdGlvbicpIHtcbiAgICBjYiA9IGNodW5rO1xuICAgIGNodW5rID0gbnVsbDtcbiAgICBlbmNvZGluZyA9IG51bGw7XG4gIH0gZWxzZSBpZiAodHlwZW9mIGVuY29kaW5nID09PSAnZnVuY3Rpb24nKSB7XG4gICAgY2IgPSBlbmNvZGluZztcbiAgICBlbmNvZGluZyA9IG51bGw7XG4gIH1cblxuICBpZiAoY2h1bmsgIT09IG51bGwgJiYgY2h1bmsgIT09IHVuZGVmaW5lZCkgdGhpcy53cml0ZShjaHVuaywgZW5jb2RpbmcpO1xuXG4gIC8vIC5lbmQoKSBmdWxseSB1bmNvcmtzXG4gIGlmIChzdGF0ZS5jb3JrZWQpIHtcbiAgICBzdGF0ZS5jb3JrZWQgPSAxO1xuICAgIHRoaXMudW5jb3JrKCk7XG4gIH1cblxuICAvLyBpZ25vcmUgdW5uZWNlc3NhcnkgZW5kKCkgY2FsbHMuXG4gIGlmICghc3RhdGUuZW5kaW5nKSBlbmRXcml0YWJsZSh0aGlzLCBzdGF0ZSwgY2IpO1xufTtcblxuZnVuY3Rpb24gbmVlZEZpbmlzaChzdGF0ZSkge1xuICByZXR1cm4gc3RhdGUuZW5kaW5nICYmIHN0YXRlLmxlbmd0aCA9PT0gMCAmJiBzdGF0ZS5idWZmZXJlZFJlcXVlc3QgPT09IG51bGwgJiYgIXN0YXRlLmZpbmlzaGVkICYmICFzdGF0ZS53cml0aW5nO1xufVxuZnVuY3Rpb24gY2FsbEZpbmFsKHN0cmVhbSwgc3RhdGUpIHtcbiAgc3RyZWFtLl9maW5hbChmdW5jdGlvbiAoZXJyKSB7XG4gICAgc3RhdGUucGVuZGluZ2NiLS07XG4gICAgaWYgKGVycikge1xuICAgICAgc3RyZWFtLmVtaXQoJ2Vycm9yJywgZXJyKTtcbiAgICB9XG4gICAgc3RhdGUucHJlZmluaXNoZWQgPSB0cnVlO1xuICAgIHN0cmVhbS5lbWl0KCdwcmVmaW5pc2gnKTtcbiAgICBmaW5pc2hNYXliZShzdHJlYW0sIHN0YXRlKTtcbiAgfSk7XG59XG5mdW5jdGlvbiBwcmVmaW5pc2goc3RyZWFtLCBzdGF0ZSkge1xuICBpZiAoIXN0YXRlLnByZWZpbmlzaGVkICYmICFzdGF0ZS5maW5hbENhbGxlZCkge1xuICAgIGlmICh0eXBlb2Ygc3RyZWFtLl9maW5hbCA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgc3RhdGUucGVuZGluZ2NiKys7XG4gICAgICBzdGF0ZS5maW5hbENhbGxlZCA9IHRydWU7XG4gICAgICBwbmEubmV4dFRpY2soY2FsbEZpbmFsLCBzdHJlYW0sIHN0YXRlKTtcbiAgICB9IGVsc2Uge1xuICAgICAgc3RhdGUucHJlZmluaXNoZWQgPSB0cnVlO1xuICAgICAgc3RyZWFtLmVtaXQoJ3ByZWZpbmlzaCcpO1xuICAgIH1cbiAgfVxufVxuXG5mdW5jdGlvbiBmaW5pc2hNYXliZShzdHJlYW0sIHN0YXRlKSB7XG4gIHZhciBuZWVkID0gbmVlZEZpbmlzaChzdGF0ZSk7XG4gIGlmIChuZWVkKSB7XG4gICAgcHJlZmluaXNoKHN0cmVhbSwgc3RhdGUpO1xuICAgIGlmIChzdGF0ZS5wZW5kaW5nY2IgPT09IDApIHtcbiAgICAgIHN0YXRlLmZpbmlzaGVkID0gdHJ1ZTtcbiAgICAgIHN0cmVhbS5lbWl0KCdmaW5pc2gnKTtcbiAgICB9XG4gIH1cbiAgcmV0dXJuIG5lZWQ7XG59XG5cbmZ1bmN0aW9uIGVuZFdyaXRhYmxlKHN0cmVhbSwgc3RhdGUsIGNiKSB7XG4gIHN0YXRlLmVuZGluZyA9IHRydWU7XG4gIGZpbmlzaE1heWJlKHN0cmVhbSwgc3RhdGUpO1xuICBpZiAoY2IpIHtcbiAgICBpZiAoc3RhdGUuZmluaXNoZWQpIHBuYS5uZXh0VGljayhjYik7ZWxzZSBzdHJlYW0ub25jZSgnZmluaXNoJywgY2IpO1xuICB9XG4gIHN0YXRlLmVuZGVkID0gdHJ1ZTtcbiAgc3RyZWFtLndyaXRhYmxlID0gZmFsc2U7XG59XG5cbmZ1bmN0aW9uIG9uQ29ya2VkRmluaXNoKGNvcmtSZXEsIHN0YXRlLCBlcnIpIHtcbiAgdmFyIGVudHJ5ID0gY29ya1JlcS5lbnRyeTtcbiAgY29ya1JlcS5lbnRyeSA9IG51bGw7XG4gIHdoaWxlIChlbnRyeSkge1xuICAgIHZhciBjYiA9IGVudHJ5LmNhbGxiYWNrO1xuICAgIHN0YXRlLnBlbmRpbmdjYi0tO1xuICAgIGNiKGVycik7XG4gICAgZW50cnkgPSBlbnRyeS5uZXh0O1xuICB9XG5cbiAgLy8gcmV1c2UgdGhlIGZyZWUgY29ya1JlcS5cbiAgc3RhdGUuY29ya2VkUmVxdWVzdHNGcmVlLm5leHQgPSBjb3JrUmVxO1xufVxuXG5PYmplY3QuZGVmaW5lUHJvcGVydHkoV3JpdGFibGUucHJvdG90eXBlLCAnZGVzdHJveWVkJywge1xuICBnZXQ6IGZ1bmN0aW9uICgpIHtcbiAgICBpZiAodGhpcy5fd3JpdGFibGVTdGF0ZSA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuICAgIHJldHVybiB0aGlzLl93cml0YWJsZVN0YXRlLmRlc3Ryb3llZDtcbiAgfSxcbiAgc2V0OiBmdW5jdGlvbiAodmFsdWUpIHtcbiAgICAvLyB3ZSBpZ25vcmUgdGhlIHZhbHVlIGlmIHRoZSBzdHJlYW1cbiAgICAvLyBoYXMgbm90IGJlZW4gaW5pdGlhbGl6ZWQgeWV0XG4gICAgaWYgKCF0aGlzLl93cml0YWJsZVN0YXRlKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgLy8gYmFja3dhcmQgY29tcGF0aWJpbGl0eSwgdGhlIHVzZXIgaXMgZXhwbGljaXRseVxuICAgIC8vIG1hbmFnaW5nIGRlc3Ryb3llZFxuICAgIHRoaXMuX3dyaXRhYmxlU3RhdGUuZGVzdHJveWVkID0gdmFsdWU7XG4gIH1cbn0pO1xuXG5Xcml0YWJsZS5wcm90b3R5cGUuZGVzdHJveSA9IGRlc3Ryb3lJbXBsLmRlc3Ryb3k7XG5Xcml0YWJsZS5wcm90b3R5cGUuX3VuZGVzdHJveSA9IGRlc3Ryb3lJbXBsLnVuZGVzdHJveTtcbldyaXRhYmxlLnByb3RvdHlwZS5fZGVzdHJveSA9IGZ1bmN0aW9uIChlcnIsIGNiKSB7XG4gIHRoaXMuZW5kKCk7XG4gIGNiKGVycik7XG59OyIsCiAgICAiLy8gQ29weXJpZ2h0IEpveWVudCwgSW5jLiBhbmQgb3RoZXIgTm9kZSBjb250cmlidXRvcnMuXG4vL1xuLy8gUGVybWlzc2lvbiBpcyBoZXJlYnkgZ3JhbnRlZCwgZnJlZSBvZiBjaGFyZ2UsIHRvIGFueSBwZXJzb24gb2J0YWluaW5nIGFcbi8vIGNvcHkgb2YgdGhpcyBzb2Z0d2FyZSBhbmQgYXNzb2NpYXRlZCBkb2N1bWVudGF0aW9uIGZpbGVzICh0aGVcbi8vIFwiU29mdHdhcmVcIiksIHRvIGRlYWwgaW4gdGhlIFNvZnR3YXJlIHdpdGhvdXQgcmVzdHJpY3Rpb24sIGluY2x1ZGluZ1xuLy8gd2l0aG91dCBsaW1pdGF0aW9uIHRoZSByaWdodHMgdG8gdXNlLCBjb3B5LCBtb2RpZnksIG1lcmdlLCBwdWJsaXNoLFxuLy8gZGlzdHJpYnV0ZSwgc3VibGljZW5zZSwgYW5kL29yIHNlbGwgY29waWVzIG9mIHRoZSBTb2Z0d2FyZSwgYW5kIHRvIHBlcm1pdFxuLy8gcGVyc29ucyB0byB3aG9tIHRoZSBTb2Z0d2FyZSBpcyBmdXJuaXNoZWQgdG8gZG8gc28sIHN1YmplY3QgdG8gdGhlXG4vLyBmb2xsb3dpbmcgY29uZGl0aW9uczpcbi8vXG4vLyBUaGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBzaGFsbCBiZSBpbmNsdWRlZFxuLy8gaW4gYWxsIGNvcGllcyBvciBzdWJzdGFudGlhbCBwb3J0aW9ucyBvZiB0aGUgU29mdHdhcmUuXG4vL1xuLy8gVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEIFwiQVMgSVNcIiwgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwgRVhQUkVTU1xuLy8gT1IgSU1QTElFRCwgSU5DTFVESU5HIEJVVCBOT1QgTElNSVRFRCBUTyBUSEUgV0FSUkFOVElFUyBPRlxuLy8gTUVSQ0hBTlRBQklMSVRZLCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBTkQgTk9OSU5GUklOR0VNRU5ULiBJTlxuLy8gTk8gRVZFTlQgU0hBTEwgVEhFIEFVVEhPUlMgT1IgQ09QWVJJR0hUIEhPTERFUlMgQkUgTElBQkxFIEZPUiBBTlkgQ0xBSU0sXG4vLyBEQU1BR0VTIE9SIE9USEVSIExJQUJJTElUWSwgV0hFVEhFUiBJTiBBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsIFRPUlQgT1Jcbi8vIE9USEVSV0lTRSwgQVJJU0lORyBGUk9NLCBPVVQgT0YgT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBTT0ZUV0FSRSBPUiBUSEVcbi8vIFVTRSBPUiBPVEhFUiBERUFMSU5HUyBJTiBUSEUgU09GVFdBUkUuXG5cbi8vIGEgZHVwbGV4IHN0cmVhbSBpcyBqdXN0IGEgc3RyZWFtIHRoYXQgaXMgYm90aCByZWFkYWJsZSBhbmQgd3JpdGFibGUuXG4vLyBTaW5jZSBKUyBkb2Vzbid0IGhhdmUgbXVsdGlwbGUgcHJvdG90eXBhbCBpbmhlcml0YW5jZSwgdGhpcyBjbGFzc1xuLy8gcHJvdG90eXBhbGx5IGluaGVyaXRzIGZyb20gUmVhZGFibGUsIGFuZCB0aGVuIHBhcmFzaXRpY2FsbHkgZnJvbVxuLy8gV3JpdGFibGUuXG5cbid1c2Ugc3RyaWN0JztcblxuLyo8cmVwbGFjZW1lbnQ+Ki9cblxudmFyIHBuYSA9IHJlcXVpcmUoJ3Byb2Nlc3MtbmV4dGljay1hcmdzJyk7XG4vKjwvcmVwbGFjZW1lbnQ+Ki9cblxuLyo8cmVwbGFjZW1lbnQ+Ki9cbnZhciBvYmplY3RLZXlzID0gT2JqZWN0LmtleXMgfHwgZnVuY3Rpb24gKG9iaikge1xuICB2YXIga2V5cyA9IFtdO1xuICBmb3IgKHZhciBrZXkgaW4gb2JqKSB7XG4gICAga2V5cy5wdXNoKGtleSk7XG4gIH1yZXR1cm4ga2V5cztcbn07XG4vKjwvcmVwbGFjZW1lbnQ+Ki9cblxubW9kdWxlLmV4cG9ydHMgPSBEdXBsZXg7XG5cbi8qPHJlcGxhY2VtZW50PiovXG52YXIgdXRpbCA9IE9iamVjdC5jcmVhdGUocmVxdWlyZSgnY29yZS11dGlsLWlzJykpO1xudXRpbC5pbmhlcml0cyA9IHJlcXVpcmUoJ2luaGVyaXRzJyk7XG4vKjwvcmVwbGFjZW1lbnQ+Ki9cblxudmFyIFJlYWRhYmxlID0gcmVxdWlyZSgnLi9fc3RyZWFtX3JlYWRhYmxlJyk7XG52YXIgV3JpdGFibGUgPSByZXF1aXJlKCcuL19zdHJlYW1fd3JpdGFibGUnKTtcblxudXRpbC5pbmhlcml0cyhEdXBsZXgsIFJlYWRhYmxlKTtcblxue1xuICAvLyBhdm9pZCBzY29wZSBjcmVlcCwgdGhlIGtleXMgYXJyYXkgY2FuIHRoZW4gYmUgY29sbGVjdGVkXG4gIHZhciBrZXlzID0gb2JqZWN0S2V5cyhXcml0YWJsZS5wcm90b3R5cGUpO1xuICBmb3IgKHZhciB2ID0gMDsgdiA8IGtleXMubGVuZ3RoOyB2KyspIHtcbiAgICB2YXIgbWV0aG9kID0ga2V5c1t2XTtcbiAgICBpZiAoIUR1cGxleC5wcm90b3R5cGVbbWV0aG9kXSkgRHVwbGV4LnByb3RvdHlwZVttZXRob2RdID0gV3JpdGFibGUucHJvdG90eXBlW21ldGhvZF07XG4gIH1cbn1cblxuZnVuY3Rpb24gRHVwbGV4KG9wdGlvbnMpIHtcbiAgaWYgKCEodGhpcyBpbnN0YW5jZW9mIER1cGxleCkpIHJldHVybiBuZXcgRHVwbGV4KG9wdGlvbnMpO1xuXG4gIFJlYWRhYmxlLmNhbGwodGhpcywgb3B0aW9ucyk7XG4gIFdyaXRhYmxlLmNhbGwodGhpcywgb3B0aW9ucyk7XG5cbiAgaWYgKG9wdGlvbnMgJiYgb3B0aW9ucy5yZWFkYWJsZSA9PT0gZmFsc2UpIHRoaXMucmVhZGFibGUgPSBmYWxzZTtcblxuICBpZiAob3B0aW9ucyAmJiBvcHRpb25zLndyaXRhYmxlID09PSBmYWxzZSkgdGhpcy53cml0YWJsZSA9IGZhbHNlO1xuXG4gIHRoaXMuYWxsb3dIYWxmT3BlbiA9IHRydWU7XG4gIGlmIChvcHRpb25zICYmIG9wdGlvbnMuYWxsb3dIYWxmT3BlbiA9PT0gZmFsc2UpIHRoaXMuYWxsb3dIYWxmT3BlbiA9IGZhbHNlO1xuXG4gIHRoaXMub25jZSgnZW5kJywgb25lbmQpO1xufVxuXG5PYmplY3QuZGVmaW5lUHJvcGVydHkoRHVwbGV4LnByb3RvdHlwZSwgJ3dyaXRhYmxlSGlnaFdhdGVyTWFyaycsIHtcbiAgLy8gbWFraW5nIGl0IGV4cGxpY2l0IHRoaXMgcHJvcGVydHkgaXMgbm90IGVudW1lcmFibGVcbiAgLy8gYmVjYXVzZSBvdGhlcndpc2Ugc29tZSBwcm90b3R5cGUgbWFuaXB1bGF0aW9uIGluXG4gIC8vIHVzZXJsYW5kIHdpbGwgZmFpbFxuICBlbnVtZXJhYmxlOiBmYWxzZSxcbiAgZ2V0OiBmdW5jdGlvbiAoKSB7XG4gICAgcmV0dXJuIHRoaXMuX3dyaXRhYmxlU3RhdGUuaGlnaFdhdGVyTWFyaztcbiAgfVxufSk7XG5cbi8vIHRoZSBuby1oYWxmLW9wZW4gZW5mb3JjZXJcbmZ1bmN0aW9uIG9uZW5kKCkge1xuICAvLyBpZiB3ZSBhbGxvdyBoYWxmLW9wZW4gc3RhdGUsIG9yIGlmIHRoZSB3cml0YWJsZSBzaWRlIGVuZGVkLFxuICAvLyB0aGVuIHdlJ3JlIG9rLlxuICBpZiAodGhpcy5hbGxvd0hhbGZPcGVuIHx8IHRoaXMuX3dyaXRhYmxlU3RhdGUuZW5kZWQpIHJldHVybjtcblxuICAvLyBubyBtb3JlIGRhdGEgY2FuIGJlIHdyaXR0ZW4uXG4gIC8vIEJ1dCBhbGxvdyBtb3JlIHdyaXRlcyB0byBoYXBwZW4gaW4gdGhpcyB0aWNrLlxuICBwbmEubmV4dFRpY2sob25FbmROVCwgdGhpcyk7XG59XG5cbmZ1bmN0aW9uIG9uRW5kTlQoc2VsZikge1xuICBzZWxmLmVuZCgpO1xufVxuXG5PYmplY3QuZGVmaW5lUHJvcGVydHkoRHVwbGV4LnByb3RvdHlwZSwgJ2Rlc3Ryb3llZCcsIHtcbiAgZ2V0OiBmdW5jdGlvbiAoKSB7XG4gICAgaWYgKHRoaXMuX3JlYWRhYmxlU3RhdGUgPT09IHVuZGVmaW5lZCB8fCB0aGlzLl93cml0YWJsZVN0YXRlID09PSB1bmRlZmluZWQpIHtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gICAgcmV0dXJuIHRoaXMuX3JlYWRhYmxlU3RhdGUuZGVzdHJveWVkICYmIHRoaXMuX3dyaXRhYmxlU3RhdGUuZGVzdHJveWVkO1xuICB9LFxuICBzZXQ6IGZ1bmN0aW9uICh2YWx1ZSkge1xuICAgIC8vIHdlIGlnbm9yZSB0aGUgdmFsdWUgaWYgdGhlIHN0cmVhbVxuICAgIC8vIGhhcyBub3QgYmVlbiBpbml0aWFsaXplZCB5ZXRcbiAgICBpZiAodGhpcy5fcmVhZGFibGVTdGF0ZSA9PT0gdW5kZWZpbmVkIHx8IHRoaXMuX3dyaXRhYmxlU3RhdGUgPT09IHVuZGVmaW5lZCkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIC8vIGJhY2t3YXJkIGNvbXBhdGliaWxpdHksIHRoZSB1c2VyIGlzIGV4cGxpY2l0bHlcbiAgICAvLyBtYW5hZ2luZyBkZXN0cm95ZWRcbiAgICB0aGlzLl9yZWFkYWJsZVN0YXRlLmRlc3Ryb3llZCA9IHZhbHVlO1xuICAgIHRoaXMuX3dyaXRhYmxlU3RhdGUuZGVzdHJveWVkID0gdmFsdWU7XG4gIH1cbn0pO1xuXG5EdXBsZXgucHJvdG90eXBlLl9kZXN0cm95ID0gZnVuY3Rpb24gKGVyciwgY2IpIHtcbiAgdGhpcy5wdXNoKG51bGwpO1xuICB0aGlzLmVuZCgpO1xuXG4gIHBuYS5uZXh0VGljayhjYiwgZXJyKTtcbn07IiwKICAgICIvLyBDb3B5cmlnaHQgSm95ZW50LCBJbmMuIGFuZCBvdGhlciBOb2RlIGNvbnRyaWJ1dG9ycy5cbi8vXG4vLyBQZXJtaXNzaW9uIGlzIGhlcmVieSBncmFudGVkLCBmcmVlIG9mIGNoYXJnZSwgdG8gYW55IHBlcnNvbiBvYnRhaW5pbmcgYVxuLy8gY29weSBvZiB0aGlzIHNvZnR3YXJlIGFuZCBhc3NvY2lhdGVkIGRvY3VtZW50YXRpb24gZmlsZXMgKHRoZVxuLy8gXCJTb2Z0d2FyZVwiKSwgdG8gZGVhbCBpbiB0aGUgU29mdHdhcmUgd2l0aG91dCByZXN0cmljdGlvbiwgaW5jbHVkaW5nXG4vLyB3aXRob3V0IGxpbWl0YXRpb24gdGhlIHJpZ2h0cyB0byB1c2UsIGNvcHksIG1vZGlmeSwgbWVyZ2UsIHB1Ymxpc2gsXG4vLyBkaXN0cmlidXRlLCBzdWJsaWNlbnNlLCBhbmQvb3Igc2VsbCBjb3BpZXMgb2YgdGhlIFNvZnR3YXJlLCBhbmQgdG8gcGVybWl0XG4vLyBwZXJzb25zIHRvIHdob20gdGhlIFNvZnR3YXJlIGlzIGZ1cm5pc2hlZCB0byBkbyBzbywgc3ViamVjdCB0byB0aGVcbi8vIGZvbGxvd2luZyBjb25kaXRpb25zOlxuLy9cbi8vIFRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIHNoYWxsIGJlIGluY2x1ZGVkXG4vLyBpbiBhbGwgY29waWVzIG9yIHN1YnN0YW50aWFsIHBvcnRpb25zIG9mIHRoZSBTb2Z0d2FyZS5cbi8vXG4vLyBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgXCJBUyBJU1wiLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBFWFBSRVNTXG4vLyBPUiBJTVBMSUVELCBJTkNMVURJTkcgQlVUIE5PVCBMSU1JVEVEIFRPIFRIRSBXQVJSQU5USUVTIE9GXG4vLyBNRVJDSEFOVEFCSUxJVFksIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFORCBOT05JTkZSSU5HRU1FTlQuIElOXG4vLyBOTyBFVkVOVCBTSEFMTCBUSEUgQVVUSE9SUyBPUiBDT1BZUklHSFQgSE9MREVSUyBCRSBMSUFCTEUgRk9SIEFOWSBDTEFJTSxcbi8vIERBTUFHRVMgT1IgT1RIRVIgTElBQklMSVRZLCBXSEVUSEVSIElOIEFOIEFDVElPTiBPRiBDT05UUkFDVCwgVE9SVCBPUlxuLy8gT1RIRVJXSVNFLCBBUklTSU5HIEZST00sIE9VVCBPRiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFNPRlRXQVJFIE9SIFRIRVxuLy8gVVNFIE9SIE9USEVSIERFQUxJTkdTIElOIFRIRSBTT0ZUV0FSRS5cblxuJ3VzZSBzdHJpY3QnO1xuXG4vKjxyZXBsYWNlbWVudD4qL1xuXG52YXIgQnVmZmVyID0gcmVxdWlyZSgnc2FmZS1idWZmZXInKS5CdWZmZXI7XG4vKjwvcmVwbGFjZW1lbnQ+Ki9cblxudmFyIGlzRW5jb2RpbmcgPSBCdWZmZXIuaXNFbmNvZGluZyB8fCBmdW5jdGlvbiAoZW5jb2RpbmcpIHtcbiAgZW5jb2RpbmcgPSAnJyArIGVuY29kaW5nO1xuICBzd2l0Y2ggKGVuY29kaW5nICYmIGVuY29kaW5nLnRvTG93ZXJDYXNlKCkpIHtcbiAgICBjYXNlICdoZXgnOmNhc2UgJ3V0ZjgnOmNhc2UgJ3V0Zi04JzpjYXNlICdhc2NpaSc6Y2FzZSAnYmluYXJ5JzpjYXNlICdiYXNlNjQnOmNhc2UgJ3VjczInOmNhc2UgJ3Vjcy0yJzpjYXNlICd1dGYxNmxlJzpjYXNlICd1dGYtMTZsZSc6Y2FzZSAncmF3JzpcbiAgICAgIHJldHVybiB0cnVlO1xuICAgIGRlZmF1bHQ6XG4gICAgICByZXR1cm4gZmFsc2U7XG4gIH1cbn07XG5cbmZ1bmN0aW9uIF9ub3JtYWxpemVFbmNvZGluZyhlbmMpIHtcbiAgaWYgKCFlbmMpIHJldHVybiAndXRmOCc7XG4gIHZhciByZXRyaWVkO1xuICB3aGlsZSAodHJ1ZSkge1xuICAgIHN3aXRjaCAoZW5jKSB7XG4gICAgICBjYXNlICd1dGY4JzpcbiAgICAgIGNhc2UgJ3V0Zi04JzpcbiAgICAgICAgcmV0dXJuICd1dGY4JztcbiAgICAgIGNhc2UgJ3VjczInOlxuICAgICAgY2FzZSAndWNzLTInOlxuICAgICAgY2FzZSAndXRmMTZsZSc6XG4gICAgICBjYXNlICd1dGYtMTZsZSc6XG4gICAgICAgIHJldHVybiAndXRmMTZsZSc7XG4gICAgICBjYXNlICdsYXRpbjEnOlxuICAgICAgY2FzZSAnYmluYXJ5JzpcbiAgICAgICAgcmV0dXJuICdsYXRpbjEnO1xuICAgICAgY2FzZSAnYmFzZTY0JzpcbiAgICAgIGNhc2UgJ2FzY2lpJzpcbiAgICAgIGNhc2UgJ2hleCc6XG4gICAgICAgIHJldHVybiBlbmM7XG4gICAgICBkZWZhdWx0OlxuICAgICAgICBpZiAocmV0cmllZCkgcmV0dXJuOyAvLyB1bmRlZmluZWRcbiAgICAgICAgZW5jID0gKCcnICsgZW5jKS50b0xvd2VyQ2FzZSgpO1xuICAgICAgICByZXRyaWVkID0gdHJ1ZTtcbiAgICB9XG4gIH1cbn07XG5cbi8vIERvIG5vdCBjYWNoZSBgQnVmZmVyLmlzRW5jb2RpbmdgIHdoZW4gY2hlY2tpbmcgZW5jb2RpbmcgbmFtZXMgYXMgc29tZVxuLy8gbW9kdWxlcyBtb25rZXktcGF0Y2ggaXQgdG8gc3VwcG9ydCBhZGRpdGlvbmFsIGVuY29kaW5nc1xuZnVuY3Rpb24gbm9ybWFsaXplRW5jb2RpbmcoZW5jKSB7XG4gIHZhciBuZW5jID0gX25vcm1hbGl6ZUVuY29kaW5nKGVuYyk7XG4gIGlmICh0eXBlb2YgbmVuYyAhPT0gJ3N0cmluZycgJiYgKEJ1ZmZlci5pc0VuY29kaW5nID09PSBpc0VuY29kaW5nIHx8ICFpc0VuY29kaW5nKGVuYykpKSB0aHJvdyBuZXcgRXJyb3IoJ1Vua25vd24gZW5jb2Rpbmc6ICcgKyBlbmMpO1xuICByZXR1cm4gbmVuYyB8fCBlbmM7XG59XG5cbi8vIFN0cmluZ0RlY29kZXIgcHJvdmlkZXMgYW4gaW50ZXJmYWNlIGZvciBlZmZpY2llbnRseSBzcGxpdHRpbmcgYSBzZXJpZXMgb2Zcbi8vIGJ1ZmZlcnMgaW50byBhIHNlcmllcyBvZiBKUyBzdHJpbmdzIHdpdGhvdXQgYnJlYWtpbmcgYXBhcnQgbXVsdGktYnl0ZVxuLy8gY2hhcmFjdGVycy5cbmV4cG9ydHMuU3RyaW5nRGVjb2RlciA9IFN0cmluZ0RlY29kZXI7XG5mdW5jdGlvbiBTdHJpbmdEZWNvZGVyKGVuY29kaW5nKSB7XG4gIHRoaXMuZW5jb2RpbmcgPSBub3JtYWxpemVFbmNvZGluZyhlbmNvZGluZyk7XG4gIHZhciBuYjtcbiAgc3dpdGNoICh0aGlzLmVuY29kaW5nKSB7XG4gICAgY2FzZSAndXRmMTZsZSc6XG4gICAgICB0aGlzLnRleHQgPSB1dGYxNlRleHQ7XG4gICAgICB0aGlzLmVuZCA9IHV0ZjE2RW5kO1xuICAgICAgbmIgPSA0O1xuICAgICAgYnJlYWs7XG4gICAgY2FzZSAndXRmOCc6XG4gICAgICB0aGlzLmZpbGxMYXN0ID0gdXRmOEZpbGxMYXN0O1xuICAgICAgbmIgPSA0O1xuICAgICAgYnJlYWs7XG4gICAgY2FzZSAnYmFzZTY0JzpcbiAgICAgIHRoaXMudGV4dCA9IGJhc2U2NFRleHQ7XG4gICAgICB0aGlzLmVuZCA9IGJhc2U2NEVuZDtcbiAgICAgIG5iID0gMztcbiAgICAgIGJyZWFrO1xuICAgIGRlZmF1bHQ6XG4gICAgICB0aGlzLndyaXRlID0gc2ltcGxlV3JpdGU7XG4gICAgICB0aGlzLmVuZCA9IHNpbXBsZUVuZDtcbiAgICAgIHJldHVybjtcbiAgfVxuICB0aGlzLmxhc3ROZWVkID0gMDtcbiAgdGhpcy5sYXN0VG90YWwgPSAwO1xuICB0aGlzLmxhc3RDaGFyID0gQnVmZmVyLmFsbG9jVW5zYWZlKG5iKTtcbn1cblxuU3RyaW5nRGVjb2Rlci5wcm90b3R5cGUud3JpdGUgPSBmdW5jdGlvbiAoYnVmKSB7XG4gIGlmIChidWYubGVuZ3RoID09PSAwKSByZXR1cm4gJyc7XG4gIHZhciByO1xuICB2YXIgaTtcbiAgaWYgKHRoaXMubGFzdE5lZWQpIHtcbiAgICByID0gdGhpcy5maWxsTGFzdChidWYpO1xuICAgIGlmIChyID09PSB1bmRlZmluZWQpIHJldHVybiAnJztcbiAgICBpID0gdGhpcy5sYXN0TmVlZDtcbiAgICB0aGlzLmxhc3ROZWVkID0gMDtcbiAgfSBlbHNlIHtcbiAgICBpID0gMDtcbiAgfVxuICBpZiAoaSA8IGJ1Zi5sZW5ndGgpIHJldHVybiByID8gciArIHRoaXMudGV4dChidWYsIGkpIDogdGhpcy50ZXh0KGJ1ZiwgaSk7XG4gIHJldHVybiByIHx8ICcnO1xufTtcblxuU3RyaW5nRGVjb2Rlci5wcm90b3R5cGUuZW5kID0gdXRmOEVuZDtcblxuLy8gUmV0dXJucyBvbmx5IGNvbXBsZXRlIGNoYXJhY3RlcnMgaW4gYSBCdWZmZXJcblN0cmluZ0RlY29kZXIucHJvdG90eXBlLnRleHQgPSB1dGY4VGV4dDtcblxuLy8gQXR0ZW1wdHMgdG8gY29tcGxldGUgYSBwYXJ0aWFsIG5vbi1VVEYtOCBjaGFyYWN0ZXIgdXNpbmcgYnl0ZXMgZnJvbSBhIEJ1ZmZlclxuU3RyaW5nRGVjb2Rlci5wcm90b3R5cGUuZmlsbExhc3QgPSBmdW5jdGlvbiAoYnVmKSB7XG4gIGlmICh0aGlzLmxhc3ROZWVkIDw9IGJ1Zi5sZW5ndGgpIHtcbiAgICBidWYuY29weSh0aGlzLmxhc3RDaGFyLCB0aGlzLmxhc3RUb3RhbCAtIHRoaXMubGFzdE5lZWQsIDAsIHRoaXMubGFzdE5lZWQpO1xuICAgIHJldHVybiB0aGlzLmxhc3RDaGFyLnRvU3RyaW5nKHRoaXMuZW5jb2RpbmcsIDAsIHRoaXMubGFzdFRvdGFsKTtcbiAgfVxuICBidWYuY29weSh0aGlzLmxhc3RDaGFyLCB0aGlzLmxhc3RUb3RhbCAtIHRoaXMubGFzdE5lZWQsIDAsIGJ1Zi5sZW5ndGgpO1xuICB0aGlzLmxhc3ROZWVkIC09IGJ1Zi5sZW5ndGg7XG59O1xuXG4vLyBDaGVja3MgdGhlIHR5cGUgb2YgYSBVVEYtOCBieXRlLCB3aGV0aGVyIGl0J3MgQVNDSUksIGEgbGVhZGluZyBieXRlLCBvciBhXG4vLyBjb250aW51YXRpb24gYnl0ZS4gSWYgYW4gaW52YWxpZCBieXRlIGlzIGRldGVjdGVkLCAtMiBpcyByZXR1cm5lZC5cbmZ1bmN0aW9uIHV0ZjhDaGVja0J5dGUoYnl0ZSkge1xuICBpZiAoYnl0ZSA8PSAweDdGKSByZXR1cm4gMDtlbHNlIGlmIChieXRlID4+IDUgPT09IDB4MDYpIHJldHVybiAyO2Vsc2UgaWYgKGJ5dGUgPj4gNCA9PT0gMHgwRSkgcmV0dXJuIDM7ZWxzZSBpZiAoYnl0ZSA+PiAzID09PSAweDFFKSByZXR1cm4gNDtcbiAgcmV0dXJuIGJ5dGUgPj4gNiA9PT0gMHgwMiA/IC0xIDogLTI7XG59XG5cbi8vIENoZWNrcyBhdCBtb3N0IDMgYnl0ZXMgYXQgdGhlIGVuZCBvZiBhIEJ1ZmZlciBpbiBvcmRlciB0byBkZXRlY3QgYW5cbi8vIGluY29tcGxldGUgbXVsdGktYnl0ZSBVVEYtOCBjaGFyYWN0ZXIuIFRoZSB0b3RhbCBudW1iZXIgb2YgYnl0ZXMgKDIsIDMsIG9yIDQpXG4vLyBuZWVkZWQgdG8gY29tcGxldGUgdGhlIFVURi04IGNoYXJhY3RlciAoaWYgYXBwbGljYWJsZSkgYXJlIHJldHVybmVkLlxuZnVuY3Rpb24gdXRmOENoZWNrSW5jb21wbGV0ZShzZWxmLCBidWYsIGkpIHtcbiAgdmFyIGogPSBidWYubGVuZ3RoIC0gMTtcbiAgaWYgKGogPCBpKSByZXR1cm4gMDtcbiAgdmFyIG5iID0gdXRmOENoZWNrQnl0ZShidWZbal0pO1xuICBpZiAobmIgPj0gMCkge1xuICAgIGlmIChuYiA+IDApIHNlbGYubGFzdE5lZWQgPSBuYiAtIDE7XG4gICAgcmV0dXJuIG5iO1xuICB9XG4gIGlmICgtLWogPCBpIHx8IG5iID09PSAtMikgcmV0dXJuIDA7XG4gIG5iID0gdXRmOENoZWNrQnl0ZShidWZbal0pO1xuICBpZiAobmIgPj0gMCkge1xuICAgIGlmIChuYiA+IDApIHNlbGYubGFzdE5lZWQgPSBuYiAtIDI7XG4gICAgcmV0dXJuIG5iO1xuICB9XG4gIGlmICgtLWogPCBpIHx8IG5iID09PSAtMikgcmV0dXJuIDA7XG4gIG5iID0gdXRmOENoZWNrQnl0ZShidWZbal0pO1xuICBpZiAobmIgPj0gMCkge1xuICAgIGlmIChuYiA+IDApIHtcbiAgICAgIGlmIChuYiA9PT0gMikgbmIgPSAwO2Vsc2Ugc2VsZi5sYXN0TmVlZCA9IG5iIC0gMztcbiAgICB9XG4gICAgcmV0dXJuIG5iO1xuICB9XG4gIHJldHVybiAwO1xufVxuXG4vLyBWYWxpZGF0ZXMgYXMgbWFueSBjb250aW51YXRpb24gYnl0ZXMgZm9yIGEgbXVsdGktYnl0ZSBVVEYtOCBjaGFyYWN0ZXIgYXNcbi8vIG5lZWRlZCBvciBhcmUgYXZhaWxhYmxlLiBJZiB3ZSBzZWUgYSBub24tY29udGludWF0aW9uIGJ5dGUgd2hlcmUgd2UgZXhwZWN0XG4vLyBvbmUsIHdlIFwicmVwbGFjZVwiIHRoZSB2YWxpZGF0ZWQgY29udGludWF0aW9uIGJ5dGVzIHdlJ3ZlIHNlZW4gc28gZmFyIHdpdGhcbi8vIGEgc2luZ2xlIFVURi04IHJlcGxhY2VtZW50IGNoYXJhY3RlciAoJ1xcdWZmZmQnKSwgdG8gbWF0Y2ggdjgncyBVVEYtOCBkZWNvZGluZ1xuLy8gYmVoYXZpb3IuIFRoZSBjb250aW51YXRpb24gYnl0ZSBjaGVjayBpcyBpbmNsdWRlZCB0aHJlZSB0aW1lcyBpbiB0aGUgY2FzZVxuLy8gd2hlcmUgYWxsIG9mIHRoZSBjb250aW51YXRpb24gYnl0ZXMgZm9yIGEgY2hhcmFjdGVyIGV4aXN0IGluIHRoZSBzYW1lIGJ1ZmZlci5cbi8vIEl0IGlzIGFsc28gZG9uZSB0aGlzIHdheSBhcyBhIHNsaWdodCBwZXJmb3JtYW5jZSBpbmNyZWFzZSBpbnN0ZWFkIG9mIHVzaW5nIGFcbi8vIGxvb3AuXG5mdW5jdGlvbiB1dGY4Q2hlY2tFeHRyYUJ5dGVzKHNlbGYsIGJ1ZiwgcCkge1xuICBpZiAoKGJ1ZlswXSAmIDB4QzApICE9PSAweDgwKSB7XG4gICAgc2VsZi5sYXN0TmVlZCA9IDA7XG4gICAgcmV0dXJuICdcXHVmZmZkJztcbiAgfVxuICBpZiAoc2VsZi5sYXN0TmVlZCA+IDEgJiYgYnVmLmxlbmd0aCA+IDEpIHtcbiAgICBpZiAoKGJ1ZlsxXSAmIDB4QzApICE9PSAweDgwKSB7XG4gICAgICBzZWxmLmxhc3ROZWVkID0gMTtcbiAgICAgIHJldHVybiAnXFx1ZmZmZCc7XG4gICAgfVxuICAgIGlmIChzZWxmLmxhc3ROZWVkID4gMiAmJiBidWYubGVuZ3RoID4gMikge1xuICAgICAgaWYgKChidWZbMl0gJiAweEMwKSAhPT0gMHg4MCkge1xuICAgICAgICBzZWxmLmxhc3ROZWVkID0gMjtcbiAgICAgICAgcmV0dXJuICdcXHVmZmZkJztcbiAgICAgIH1cbiAgICB9XG4gIH1cbn1cblxuLy8gQXR0ZW1wdHMgdG8gY29tcGxldGUgYSBtdWx0aS1ieXRlIFVURi04IGNoYXJhY3RlciB1c2luZyBieXRlcyBmcm9tIGEgQnVmZmVyLlxuZnVuY3Rpb24gdXRmOEZpbGxMYXN0KGJ1Zikge1xuICB2YXIgcCA9IHRoaXMubGFzdFRvdGFsIC0gdGhpcy5sYXN0TmVlZDtcbiAgdmFyIHIgPSB1dGY4Q2hlY2tFeHRyYUJ5dGVzKHRoaXMsIGJ1ZiwgcCk7XG4gIGlmIChyICE9PSB1bmRlZmluZWQpIHJldHVybiByO1xuICBpZiAodGhpcy5sYXN0TmVlZCA8PSBidWYubGVuZ3RoKSB7XG4gICAgYnVmLmNvcHkodGhpcy5sYXN0Q2hhciwgcCwgMCwgdGhpcy5sYXN0TmVlZCk7XG4gICAgcmV0dXJuIHRoaXMubGFzdENoYXIudG9TdHJpbmcodGhpcy5lbmNvZGluZywgMCwgdGhpcy5sYXN0VG90YWwpO1xuICB9XG4gIGJ1Zi5jb3B5KHRoaXMubGFzdENoYXIsIHAsIDAsIGJ1Zi5sZW5ndGgpO1xuICB0aGlzLmxhc3ROZWVkIC09IGJ1Zi5sZW5ndGg7XG59XG5cbi8vIFJldHVybnMgYWxsIGNvbXBsZXRlIFVURi04IGNoYXJhY3RlcnMgaW4gYSBCdWZmZXIuIElmIHRoZSBCdWZmZXIgZW5kZWQgb24gYVxuLy8gcGFydGlhbCBjaGFyYWN0ZXIsIHRoZSBjaGFyYWN0ZXIncyBieXRlcyBhcmUgYnVmZmVyZWQgdW50aWwgdGhlIHJlcXVpcmVkXG4vLyBudW1iZXIgb2YgYnl0ZXMgYXJlIGF2YWlsYWJsZS5cbmZ1bmN0aW9uIHV0ZjhUZXh0KGJ1ZiwgaSkge1xuICB2YXIgdG90YWwgPSB1dGY4Q2hlY2tJbmNvbXBsZXRlKHRoaXMsIGJ1ZiwgaSk7XG4gIGlmICghdGhpcy5sYXN0TmVlZCkgcmV0dXJuIGJ1Zi50b1N0cmluZygndXRmOCcsIGkpO1xuICB0aGlzLmxhc3RUb3RhbCA9IHRvdGFsO1xuICB2YXIgZW5kID0gYnVmLmxlbmd0aCAtICh0b3RhbCAtIHRoaXMubGFzdE5lZWQpO1xuICBidWYuY29weSh0aGlzLmxhc3RDaGFyLCAwLCBlbmQpO1xuICByZXR1cm4gYnVmLnRvU3RyaW5nKCd1dGY4JywgaSwgZW5kKTtcbn1cblxuLy8gRm9yIFVURi04LCBhIHJlcGxhY2VtZW50IGNoYXJhY3RlciBpcyBhZGRlZCB3aGVuIGVuZGluZyBvbiBhIHBhcnRpYWxcbi8vIGNoYXJhY3Rlci5cbmZ1bmN0aW9uIHV0ZjhFbmQoYnVmKSB7XG4gIHZhciByID0gYnVmICYmIGJ1Zi5sZW5ndGggPyB0aGlzLndyaXRlKGJ1ZikgOiAnJztcbiAgaWYgKHRoaXMubGFzdE5lZWQpIHJldHVybiByICsgJ1xcdWZmZmQnO1xuICByZXR1cm4gcjtcbn1cblxuLy8gVVRGLTE2TEUgdHlwaWNhbGx5IG5lZWRzIHR3byBieXRlcyBwZXIgY2hhcmFjdGVyLCBidXQgZXZlbiBpZiB3ZSBoYXZlIGFuIGV2ZW5cbi8vIG51bWJlciBvZiBieXRlcyBhdmFpbGFibGUsIHdlIG5lZWQgdG8gY2hlY2sgaWYgd2UgZW5kIG9uIGEgbGVhZGluZy9oaWdoXG4vLyBzdXJyb2dhdGUuIEluIHRoYXQgY2FzZSwgd2UgbmVlZCB0byB3YWl0IGZvciB0aGUgbmV4dCB0d28gYnl0ZXMgaW4gb3JkZXIgdG9cbi8vIGRlY29kZSB0aGUgbGFzdCBjaGFyYWN0ZXIgcHJvcGVybHkuXG5mdW5jdGlvbiB1dGYxNlRleHQoYnVmLCBpKSB7XG4gIGlmICgoYnVmLmxlbmd0aCAtIGkpICUgMiA9PT0gMCkge1xuICAgIHZhciByID0gYnVmLnRvU3RyaW5nKCd1dGYxNmxlJywgaSk7XG4gICAgaWYgKHIpIHtcbiAgICAgIHZhciBjID0gci5jaGFyQ29kZUF0KHIubGVuZ3RoIC0gMSk7XG4gICAgICBpZiAoYyA+PSAweEQ4MDAgJiYgYyA8PSAweERCRkYpIHtcbiAgICAgICAgdGhpcy5sYXN0TmVlZCA9IDI7XG4gICAgICAgIHRoaXMubGFzdFRvdGFsID0gNDtcbiAgICAgICAgdGhpcy5sYXN0Q2hhclswXSA9IGJ1ZltidWYubGVuZ3RoIC0gMl07XG4gICAgICAgIHRoaXMubGFzdENoYXJbMV0gPSBidWZbYnVmLmxlbmd0aCAtIDFdO1xuICAgICAgICByZXR1cm4gci5zbGljZSgwLCAtMSk7XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiByO1xuICB9XG4gIHRoaXMubGFzdE5lZWQgPSAxO1xuICB0aGlzLmxhc3RUb3RhbCA9IDI7XG4gIHRoaXMubGFzdENoYXJbMF0gPSBidWZbYnVmLmxlbmd0aCAtIDFdO1xuICByZXR1cm4gYnVmLnRvU3RyaW5nKCd1dGYxNmxlJywgaSwgYnVmLmxlbmd0aCAtIDEpO1xufVxuXG4vLyBGb3IgVVRGLTE2TEUgd2UgZG8gbm90IGV4cGxpY2l0bHkgYXBwZW5kIHNwZWNpYWwgcmVwbGFjZW1lbnQgY2hhcmFjdGVycyBpZiB3ZVxuLy8gZW5kIG9uIGEgcGFydGlhbCBjaGFyYWN0ZXIsIHdlIHNpbXBseSBsZXQgdjggaGFuZGxlIHRoYXQuXG5mdW5jdGlvbiB1dGYxNkVuZChidWYpIHtcbiAgdmFyIHIgPSBidWYgJiYgYnVmLmxlbmd0aCA/IHRoaXMud3JpdGUoYnVmKSA6ICcnO1xuICBpZiAodGhpcy5sYXN0TmVlZCkge1xuICAgIHZhciBlbmQgPSB0aGlzLmxhc3RUb3RhbCAtIHRoaXMubGFzdE5lZWQ7XG4gICAgcmV0dXJuIHIgKyB0aGlzLmxhc3RDaGFyLnRvU3RyaW5nKCd1dGYxNmxlJywgMCwgZW5kKTtcbiAgfVxuICByZXR1cm4gcjtcbn1cblxuZnVuY3Rpb24gYmFzZTY0VGV4dChidWYsIGkpIHtcbiAgdmFyIG4gPSAoYnVmLmxlbmd0aCAtIGkpICUgMztcbiAgaWYgKG4gPT09IDApIHJldHVybiBidWYudG9TdHJpbmcoJ2Jhc2U2NCcsIGkpO1xuICB0aGlzLmxhc3ROZWVkID0gMyAtIG47XG4gIHRoaXMubGFzdFRvdGFsID0gMztcbiAgaWYgKG4gPT09IDEpIHtcbiAgICB0aGlzLmxhc3RDaGFyWzBdID0gYnVmW2J1Zi5sZW5ndGggLSAxXTtcbiAgfSBlbHNlIHtcbiAgICB0aGlzLmxhc3RDaGFyWzBdID0gYnVmW2J1Zi5sZW5ndGggLSAyXTtcbiAgICB0aGlzLmxhc3RDaGFyWzFdID0gYnVmW2J1Zi5sZW5ndGggLSAxXTtcbiAgfVxuICByZXR1cm4gYnVmLnRvU3RyaW5nKCdiYXNlNjQnLCBpLCBidWYubGVuZ3RoIC0gbik7XG59XG5cbmZ1bmN0aW9uIGJhc2U2NEVuZChidWYpIHtcbiAgdmFyIHIgPSBidWYgJiYgYnVmLmxlbmd0aCA/IHRoaXMud3JpdGUoYnVmKSA6ICcnO1xuICBpZiAodGhpcy5sYXN0TmVlZCkgcmV0dXJuIHIgKyB0aGlzLmxhc3RDaGFyLnRvU3RyaW5nKCdiYXNlNjQnLCAwLCAzIC0gdGhpcy5sYXN0TmVlZCk7XG4gIHJldHVybiByO1xufVxuXG4vLyBQYXNzIGJ5dGVzIG9uIHRocm91Z2ggZm9yIHNpbmdsZS1ieXRlIGVuY29kaW5ncyAoZS5nLiBhc2NpaSwgbGF0aW4xLCBoZXgpXG5mdW5jdGlvbiBzaW1wbGVXcml0ZShidWYpIHtcbiAgcmV0dXJuIGJ1Zi50b1N0cmluZyh0aGlzLmVuY29kaW5nKTtcbn1cblxuZnVuY3Rpb24gc2ltcGxlRW5kKGJ1Zikge1xuICByZXR1cm4gYnVmICYmIGJ1Zi5sZW5ndGggPyB0aGlzLndyaXRlKGJ1ZikgOiAnJztcbn0iLAogICAgIi8vIENvcHlyaWdodCBKb3llbnQsIEluYy4gYW5kIG90aGVyIE5vZGUgY29udHJpYnV0b3JzLlxuLy9cbi8vIFBlcm1pc3Npb24gaXMgaGVyZWJ5IGdyYW50ZWQsIGZyZWUgb2YgY2hhcmdlLCB0byBhbnkgcGVyc29uIG9idGFpbmluZyBhXG4vLyBjb3B5IG9mIHRoaXMgc29mdHdhcmUgYW5kIGFzc29jaWF0ZWQgZG9jdW1lbnRhdGlvbiBmaWxlcyAodGhlXG4vLyBcIlNvZnR3YXJlXCIpLCB0byBkZWFsIGluIHRoZSBTb2Z0d2FyZSB3aXRob3V0IHJlc3RyaWN0aW9uLCBpbmNsdWRpbmdcbi8vIHdpdGhvdXQgbGltaXRhdGlvbiB0aGUgcmlnaHRzIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBtZXJnZSwgcHVibGlzaCxcbi8vIGRpc3RyaWJ1dGUsIHN1YmxpY2Vuc2UsIGFuZC9vciBzZWxsIGNvcGllcyBvZiB0aGUgU29mdHdhcmUsIGFuZCB0byBwZXJtaXRcbi8vIHBlcnNvbnMgdG8gd2hvbSB0aGUgU29mdHdhcmUgaXMgZnVybmlzaGVkIHRvIGRvIHNvLCBzdWJqZWN0IHRvIHRoZVxuLy8gZm9sbG93aW5nIGNvbmRpdGlvbnM6XG4vL1xuLy8gVGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2Ugc2hhbGwgYmUgaW5jbHVkZWRcbi8vIGluIGFsbCBjb3BpZXMgb3Igc3Vic3RhbnRpYWwgcG9ydGlvbnMgb2YgdGhlIFNvZnR3YXJlLlxuLy9cbi8vIFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCBcIkFTIElTXCIsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIEVYUFJFU1Ncbi8vIE9SIElNUExJRUQsIElOQ0xVRElORyBCVVQgTk9UIExJTUlURUQgVE8gVEhFIFdBUlJBTlRJRVMgT0Zcbi8vIE1FUkNIQU5UQUJJTElUWSwgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQU5EIE5PTklORlJJTkdFTUVOVC4gSU5cbi8vIE5PIEVWRU5UIFNIQUxMIFRIRSBBVVRIT1JTIE9SIENPUFlSSUdIVCBIT0xERVJTIEJFIExJQUJMRSBGT1IgQU5ZIENMQUlNLFxuLy8gREFNQUdFUyBPUiBPVEhFUiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQU4gQUNUSU9OIE9GIENPTlRSQUNULCBUT1JUIE9SXG4vLyBPVEhFUldJU0UsIEFSSVNJTkcgRlJPTSwgT1VUIE9GIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUgU09GVFdBUkUgT1IgVEhFXG4vLyBVU0UgT1IgT1RIRVIgREVBTElOR1MgSU4gVEhFIFNPRlRXQVJFLlxuXG4ndXNlIHN0cmljdCc7XG5cbi8qPHJlcGxhY2VtZW50PiovXG5cbnZhciBwbmEgPSByZXF1aXJlKCdwcm9jZXNzLW5leHRpY2stYXJncycpO1xuLyo8L3JlcGxhY2VtZW50PiovXG5cbm1vZHVsZS5leHBvcnRzID0gUmVhZGFibGU7XG5cbi8qPHJlcGxhY2VtZW50PiovXG52YXIgaXNBcnJheSA9IHJlcXVpcmUoJ2lzYXJyYXknKTtcbi8qPC9yZXBsYWNlbWVudD4qL1xuXG4vKjxyZXBsYWNlbWVudD4qL1xudmFyIER1cGxleDtcbi8qPC9yZXBsYWNlbWVudD4qL1xuXG5SZWFkYWJsZS5SZWFkYWJsZVN0YXRlID0gUmVhZGFibGVTdGF0ZTtcblxuLyo8cmVwbGFjZW1lbnQ+Ki9cbnZhciBFRSA9IHJlcXVpcmUoJ2V2ZW50cycpLkV2ZW50RW1pdHRlcjtcblxudmFyIEVFbGlzdGVuZXJDb3VudCA9IGZ1bmN0aW9uIChlbWl0dGVyLCB0eXBlKSB7XG4gIHJldHVybiBlbWl0dGVyLmxpc3RlbmVycyh0eXBlKS5sZW5ndGg7XG59O1xuLyo8L3JlcGxhY2VtZW50PiovXG5cbi8qPHJlcGxhY2VtZW50PiovXG52YXIgU3RyZWFtID0gcmVxdWlyZSgnLi9pbnRlcm5hbC9zdHJlYW1zL3N0cmVhbScpO1xuLyo8L3JlcGxhY2VtZW50PiovXG5cbi8qPHJlcGxhY2VtZW50PiovXG5cbnZhciBCdWZmZXIgPSByZXF1aXJlKCdzYWZlLWJ1ZmZlcicpLkJ1ZmZlcjtcbnZhciBPdXJVaW50OEFycmF5ID0gKHR5cGVvZiBnbG9iYWwgIT09ICd1bmRlZmluZWQnID8gZ2xvYmFsIDogdHlwZW9mIHdpbmRvdyAhPT0gJ3VuZGVmaW5lZCcgPyB3aW5kb3cgOiB0eXBlb2Ygc2VsZiAhPT0gJ3VuZGVmaW5lZCcgPyBzZWxmIDoge30pLlVpbnQ4QXJyYXkgfHwgZnVuY3Rpb24gKCkge307XG5mdW5jdGlvbiBfdWludDhBcnJheVRvQnVmZmVyKGNodW5rKSB7XG4gIHJldHVybiBCdWZmZXIuZnJvbShjaHVuayk7XG59XG5mdW5jdGlvbiBfaXNVaW50OEFycmF5KG9iaikge1xuICByZXR1cm4gQnVmZmVyLmlzQnVmZmVyKG9iaikgfHwgb2JqIGluc3RhbmNlb2YgT3VyVWludDhBcnJheTtcbn1cblxuLyo8L3JlcGxhY2VtZW50PiovXG5cbi8qPHJlcGxhY2VtZW50PiovXG52YXIgdXRpbCA9IE9iamVjdC5jcmVhdGUocmVxdWlyZSgnY29yZS11dGlsLWlzJykpO1xudXRpbC5pbmhlcml0cyA9IHJlcXVpcmUoJ2luaGVyaXRzJyk7XG4vKjwvcmVwbGFjZW1lbnQ+Ki9cblxuLyo8cmVwbGFjZW1lbnQ+Ki9cbnZhciBkZWJ1Z1V0aWwgPSByZXF1aXJlKCd1dGlsJyk7XG52YXIgZGVidWcgPSB2b2lkIDA7XG5pZiAoZGVidWdVdGlsICYmIGRlYnVnVXRpbC5kZWJ1Z2xvZykge1xuICBkZWJ1ZyA9IGRlYnVnVXRpbC5kZWJ1Z2xvZygnc3RyZWFtJyk7XG59IGVsc2Uge1xuICBkZWJ1ZyA9IGZ1bmN0aW9uICgpIHt9O1xufVxuLyo8L3JlcGxhY2VtZW50PiovXG5cbnZhciBCdWZmZXJMaXN0ID0gcmVxdWlyZSgnLi9pbnRlcm5hbC9zdHJlYW1zL0J1ZmZlckxpc3QnKTtcbnZhciBkZXN0cm95SW1wbCA9IHJlcXVpcmUoJy4vaW50ZXJuYWwvc3RyZWFtcy9kZXN0cm95Jyk7XG52YXIgU3RyaW5nRGVjb2RlcjtcblxudXRpbC5pbmhlcml0cyhSZWFkYWJsZSwgU3RyZWFtKTtcblxudmFyIGtQcm94eUV2ZW50cyA9IFsnZXJyb3InLCAnY2xvc2UnLCAnZGVzdHJveScsICdwYXVzZScsICdyZXN1bWUnXTtcblxuZnVuY3Rpb24gcHJlcGVuZExpc3RlbmVyKGVtaXR0ZXIsIGV2ZW50LCBmbikge1xuICAvLyBTYWRseSB0aGlzIGlzIG5vdCBjYWNoZWFibGUgYXMgc29tZSBsaWJyYXJpZXMgYnVuZGxlIHRoZWlyIG93blxuICAvLyBldmVudCBlbWl0dGVyIGltcGxlbWVudGF0aW9uIHdpdGggdGhlbS5cbiAgaWYgKHR5cGVvZiBlbWl0dGVyLnByZXBlbmRMaXN0ZW5lciA9PT0gJ2Z1bmN0aW9uJykgcmV0dXJuIGVtaXR0ZXIucHJlcGVuZExpc3RlbmVyKGV2ZW50LCBmbik7XG5cbiAgLy8gVGhpcyBpcyBhIGhhY2sgdG8gbWFrZSBzdXJlIHRoYXQgb3VyIGVycm9yIGhhbmRsZXIgaXMgYXR0YWNoZWQgYmVmb3JlIGFueVxuICAvLyB1c2VybGFuZCBvbmVzLiAgTkVWRVIgRE8gVEhJUy4gVGhpcyBpcyBoZXJlIG9ubHkgYmVjYXVzZSB0aGlzIGNvZGUgbmVlZHNcbiAgLy8gdG8gY29udGludWUgdG8gd29yayB3aXRoIG9sZGVyIHZlcnNpb25zIG9mIE5vZGUuanMgdGhhdCBkbyBub3QgaW5jbHVkZVxuICAvLyB0aGUgcHJlcGVuZExpc3RlbmVyKCkgbWV0aG9kLiBUaGUgZ29hbCBpcyB0byBldmVudHVhbGx5IHJlbW92ZSB0aGlzIGhhY2suXG4gIGlmICghZW1pdHRlci5fZXZlbnRzIHx8ICFlbWl0dGVyLl9ldmVudHNbZXZlbnRdKSBlbWl0dGVyLm9uKGV2ZW50LCBmbik7ZWxzZSBpZiAoaXNBcnJheShlbWl0dGVyLl9ldmVudHNbZXZlbnRdKSkgZW1pdHRlci5fZXZlbnRzW2V2ZW50XS51bnNoaWZ0KGZuKTtlbHNlIGVtaXR0ZXIuX2V2ZW50c1tldmVudF0gPSBbZm4sIGVtaXR0ZXIuX2V2ZW50c1tldmVudF1dO1xufVxuXG5mdW5jdGlvbiBSZWFkYWJsZVN0YXRlKG9wdGlvbnMsIHN0cmVhbSkge1xuICBEdXBsZXggPSBEdXBsZXggfHwgcmVxdWlyZSgnLi9fc3RyZWFtX2R1cGxleCcpO1xuXG4gIG9wdGlvbnMgPSBvcHRpb25zIHx8IHt9O1xuXG4gIC8vIER1cGxleCBzdHJlYW1zIGFyZSBib3RoIHJlYWRhYmxlIGFuZCB3cml0YWJsZSwgYnV0IHNoYXJlXG4gIC8vIHRoZSBzYW1lIG9wdGlvbnMgb2JqZWN0LlxuICAvLyBIb3dldmVyLCBzb21lIGNhc2VzIHJlcXVpcmUgc2V0dGluZyBvcHRpb25zIHRvIGRpZmZlcmVudFxuICAvLyB2YWx1ZXMgZm9yIHRoZSByZWFkYWJsZSBhbmQgdGhlIHdyaXRhYmxlIHNpZGVzIG9mIHRoZSBkdXBsZXggc3RyZWFtLlxuICAvLyBUaGVzZSBvcHRpb25zIGNhbiBiZSBwcm92aWRlZCBzZXBhcmF0ZWx5IGFzIHJlYWRhYmxlWFhYIGFuZCB3cml0YWJsZVhYWC5cbiAgdmFyIGlzRHVwbGV4ID0gc3RyZWFtIGluc3RhbmNlb2YgRHVwbGV4O1xuXG4gIC8vIG9iamVjdCBzdHJlYW0gZmxhZy4gVXNlZCB0byBtYWtlIHJlYWQobikgaWdub3JlIG4gYW5kIHRvXG4gIC8vIG1ha2UgYWxsIHRoZSBidWZmZXIgbWVyZ2luZyBhbmQgbGVuZ3RoIGNoZWNrcyBnbyBhd2F5XG4gIHRoaXMub2JqZWN0TW9kZSA9ICEhb3B0aW9ucy5vYmplY3RNb2RlO1xuXG4gIGlmIChpc0R1cGxleCkgdGhpcy5vYmplY3RNb2RlID0gdGhpcy5vYmplY3RNb2RlIHx8ICEhb3B0aW9ucy5yZWFkYWJsZU9iamVjdE1vZGU7XG5cbiAgLy8gdGhlIHBvaW50IGF0IHdoaWNoIGl0IHN0b3BzIGNhbGxpbmcgX3JlYWQoKSB0byBmaWxsIHRoZSBidWZmZXJcbiAgLy8gTm90ZTogMCBpcyBhIHZhbGlkIHZhbHVlLCBtZWFucyBcImRvbid0IGNhbGwgX3JlYWQgcHJlZW1wdGl2ZWx5IGV2ZXJcIlxuICB2YXIgaHdtID0gb3B0aW9ucy5oaWdoV2F0ZXJNYXJrO1xuICB2YXIgcmVhZGFibGVId20gPSBvcHRpb25zLnJlYWRhYmxlSGlnaFdhdGVyTWFyaztcbiAgdmFyIGRlZmF1bHRId20gPSB0aGlzLm9iamVjdE1vZGUgPyAxNiA6IDE2ICogMTAyNDtcblxuICBpZiAoaHdtIHx8IGh3bSA9PT0gMCkgdGhpcy5oaWdoV2F0ZXJNYXJrID0gaHdtO2Vsc2UgaWYgKGlzRHVwbGV4ICYmIChyZWFkYWJsZUh3bSB8fCByZWFkYWJsZUh3bSA9PT0gMCkpIHRoaXMuaGlnaFdhdGVyTWFyayA9IHJlYWRhYmxlSHdtO2Vsc2UgdGhpcy5oaWdoV2F0ZXJNYXJrID0gZGVmYXVsdEh3bTtcblxuICAvLyBjYXN0IHRvIGludHMuXG4gIHRoaXMuaGlnaFdhdGVyTWFyayA9IE1hdGguZmxvb3IodGhpcy5oaWdoV2F0ZXJNYXJrKTtcblxuICAvLyBBIGxpbmtlZCBsaXN0IGlzIHVzZWQgdG8gc3RvcmUgZGF0YSBjaHVua3MgaW5zdGVhZCBvZiBhbiBhcnJheSBiZWNhdXNlIHRoZVxuICAvLyBsaW5rZWQgbGlzdCBjYW4gcmVtb3ZlIGVsZW1lbnRzIGZyb20gdGhlIGJlZ2lubmluZyBmYXN0ZXIgdGhhblxuICAvLyBhcnJheS5zaGlmdCgpXG4gIHRoaXMuYnVmZmVyID0gbmV3IEJ1ZmZlckxpc3QoKTtcbiAgdGhpcy5sZW5ndGggPSAwO1xuICB0aGlzLnBpcGVzID0gbnVsbDtcbiAgdGhpcy5waXBlc0NvdW50ID0gMDtcbiAgdGhpcy5mbG93aW5nID0gbnVsbDtcbiAgdGhpcy5lbmRlZCA9IGZhbHNlO1xuICB0aGlzLmVuZEVtaXR0ZWQgPSBmYWxzZTtcbiAgdGhpcy5yZWFkaW5nID0gZmFsc2U7XG5cbiAgLy8gYSBmbGFnIHRvIGJlIGFibGUgdG8gdGVsbCBpZiB0aGUgZXZlbnQgJ3JlYWRhYmxlJy8nZGF0YScgaXMgZW1pdHRlZFxuICAvLyBpbW1lZGlhdGVseSwgb3Igb24gYSBsYXRlciB0aWNrLiAgV2Ugc2V0IHRoaXMgdG8gdHJ1ZSBhdCBmaXJzdCwgYmVjYXVzZVxuICAvLyBhbnkgYWN0aW9ucyB0aGF0IHNob3VsZG4ndCBoYXBwZW4gdW50aWwgXCJsYXRlclwiIHNob3VsZCBnZW5lcmFsbHkgYWxzb1xuICAvLyBub3QgaGFwcGVuIGJlZm9yZSB0aGUgZmlyc3QgcmVhZCBjYWxsLlxuICB0aGlzLnN5bmMgPSB0cnVlO1xuXG4gIC8vIHdoZW5ldmVyIHdlIHJldHVybiBudWxsLCB0aGVuIHdlIHNldCBhIGZsYWcgdG8gc2F5XG4gIC8vIHRoYXQgd2UncmUgYXdhaXRpbmcgYSAncmVhZGFibGUnIGV2ZW50IGVtaXNzaW9uLlxuICB0aGlzLm5lZWRSZWFkYWJsZSA9IGZhbHNlO1xuICB0aGlzLmVtaXR0ZWRSZWFkYWJsZSA9IGZhbHNlO1xuICB0aGlzLnJlYWRhYmxlTGlzdGVuaW5nID0gZmFsc2U7XG4gIHRoaXMucmVzdW1lU2NoZWR1bGVkID0gZmFsc2U7XG5cbiAgLy8gaGFzIGl0IGJlZW4gZGVzdHJveWVkXG4gIHRoaXMuZGVzdHJveWVkID0gZmFsc2U7XG5cbiAgLy8gQ3J5cHRvIGlzIGtpbmQgb2Ygb2xkIGFuZCBjcnVzdHkuICBIaXN0b3JpY2FsbHksIGl0cyBkZWZhdWx0IHN0cmluZ1xuICAvLyBlbmNvZGluZyBpcyAnYmluYXJ5JyBzbyB3ZSBoYXZlIHRvIG1ha2UgdGhpcyBjb25maWd1cmFibGUuXG4gIC8vIEV2ZXJ5dGhpbmcgZWxzZSBpbiB0aGUgdW5pdmVyc2UgdXNlcyAndXRmOCcsIHRob3VnaC5cbiAgdGhpcy5kZWZhdWx0RW5jb2RpbmcgPSBvcHRpb25zLmRlZmF1bHRFbmNvZGluZyB8fCAndXRmOCc7XG5cbiAgLy8gdGhlIG51bWJlciBvZiB3cml0ZXJzIHRoYXQgYXJlIGF3YWl0aW5nIGEgZHJhaW4gZXZlbnQgaW4gLnBpcGUoKXNcbiAgdGhpcy5hd2FpdERyYWluID0gMDtcblxuICAvLyBpZiB0cnVlLCBhIG1heWJlUmVhZE1vcmUgaGFzIGJlZW4gc2NoZWR1bGVkXG4gIHRoaXMucmVhZGluZ01vcmUgPSBmYWxzZTtcblxuICB0aGlzLmRlY29kZXIgPSBudWxsO1xuICB0aGlzLmVuY29kaW5nID0gbnVsbDtcbiAgaWYgKG9wdGlvbnMuZW5jb2RpbmcpIHtcbiAgICBpZiAoIVN0cmluZ0RlY29kZXIpIFN0cmluZ0RlY29kZXIgPSByZXF1aXJlKCdzdHJpbmdfZGVjb2Rlci8nKS5TdHJpbmdEZWNvZGVyO1xuICAgIHRoaXMuZGVjb2RlciA9IG5ldyBTdHJpbmdEZWNvZGVyKG9wdGlvbnMuZW5jb2RpbmcpO1xuICAgIHRoaXMuZW5jb2RpbmcgPSBvcHRpb25zLmVuY29kaW5nO1xuICB9XG59XG5cbmZ1bmN0aW9uIFJlYWRhYmxlKG9wdGlvbnMpIHtcbiAgRHVwbGV4ID0gRHVwbGV4IHx8IHJlcXVpcmUoJy4vX3N0cmVhbV9kdXBsZXgnKTtcblxuICBpZiAoISh0aGlzIGluc3RhbmNlb2YgUmVhZGFibGUpKSByZXR1cm4gbmV3IFJlYWRhYmxlKG9wdGlvbnMpO1xuXG4gIHRoaXMuX3JlYWRhYmxlU3RhdGUgPSBuZXcgUmVhZGFibGVTdGF0ZShvcHRpb25zLCB0aGlzKTtcblxuICAvLyBsZWdhY3lcbiAgdGhpcy5yZWFkYWJsZSA9IHRydWU7XG5cbiAgaWYgKG9wdGlvbnMpIHtcbiAgICBpZiAodHlwZW9mIG9wdGlvbnMucmVhZCA9PT0gJ2Z1bmN0aW9uJykgdGhpcy5fcmVhZCA9IG9wdGlvbnMucmVhZDtcblxuICAgIGlmICh0eXBlb2Ygb3B0aW9ucy5kZXN0cm95ID09PSAnZnVuY3Rpb24nKSB0aGlzLl9kZXN0cm95ID0gb3B0aW9ucy5kZXN0cm95O1xuICB9XG5cbiAgU3RyZWFtLmNhbGwodGhpcyk7XG59XG5cbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShSZWFkYWJsZS5wcm90b3R5cGUsICdkZXN0cm95ZWQnLCB7XG4gIGdldDogZnVuY3Rpb24gKCkge1xuICAgIGlmICh0aGlzLl9yZWFkYWJsZVN0YXRlID09PSB1bmRlZmluZWQpIHtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gICAgcmV0dXJuIHRoaXMuX3JlYWRhYmxlU3RhdGUuZGVzdHJveWVkO1xuICB9LFxuICBzZXQ6IGZ1bmN0aW9uICh2YWx1ZSkge1xuICAgIC8vIHdlIGlnbm9yZSB0aGUgdmFsdWUgaWYgdGhlIHN0cmVhbVxuICAgIC8vIGhhcyBub3QgYmVlbiBpbml0aWFsaXplZCB5ZXRcbiAgICBpZiAoIXRoaXMuX3JlYWRhYmxlU3RhdGUpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICAvLyBiYWNrd2FyZCBjb21wYXRpYmlsaXR5LCB0aGUgdXNlciBpcyBleHBsaWNpdGx5XG4gICAgLy8gbWFuYWdpbmcgZGVzdHJveWVkXG4gICAgdGhpcy5fcmVhZGFibGVTdGF0ZS5kZXN0cm95ZWQgPSB2YWx1ZTtcbiAgfVxufSk7XG5cblJlYWRhYmxlLnByb3RvdHlwZS5kZXN0cm95ID0gZGVzdHJveUltcGwuZGVzdHJveTtcblJlYWRhYmxlLnByb3RvdHlwZS5fdW5kZXN0cm95ID0gZGVzdHJveUltcGwudW5kZXN0cm95O1xuUmVhZGFibGUucHJvdG90eXBlLl9kZXN0cm95ID0gZnVuY3Rpb24gKGVyciwgY2IpIHtcbiAgdGhpcy5wdXNoKG51bGwpO1xuICBjYihlcnIpO1xufTtcblxuLy8gTWFudWFsbHkgc2hvdmUgc29tZXRoaW5nIGludG8gdGhlIHJlYWQoKSBidWZmZXIuXG4vLyBUaGlzIHJldHVybnMgdHJ1ZSBpZiB0aGUgaGlnaFdhdGVyTWFyayBoYXMgbm90IGJlZW4gaGl0IHlldCxcbi8vIHNpbWlsYXIgdG8gaG93IFdyaXRhYmxlLndyaXRlKCkgcmV0dXJucyB0cnVlIGlmIHlvdSBzaG91bGRcbi8vIHdyaXRlKCkgc29tZSBtb3JlLlxuUmVhZGFibGUucHJvdG90eXBlLnB1c2ggPSBmdW5jdGlvbiAoY2h1bmssIGVuY29kaW5nKSB7XG4gIHZhciBzdGF0ZSA9IHRoaXMuX3JlYWRhYmxlU3RhdGU7XG4gIHZhciBza2lwQ2h1bmtDaGVjaztcblxuICBpZiAoIXN0YXRlLm9iamVjdE1vZGUpIHtcbiAgICBpZiAodHlwZW9mIGNodW5rID09PSAnc3RyaW5nJykge1xuICAgICAgZW5jb2RpbmcgPSBlbmNvZGluZyB8fCBzdGF0ZS5kZWZhdWx0RW5jb2Rpbmc7XG4gICAgICBpZiAoZW5jb2RpbmcgIT09IHN0YXRlLmVuY29kaW5nKSB7XG4gICAgICAgIGNodW5rID0gQnVmZmVyLmZyb20oY2h1bmssIGVuY29kaW5nKTtcbiAgICAgICAgZW5jb2RpbmcgPSAnJztcbiAgICAgIH1cbiAgICAgIHNraXBDaHVua0NoZWNrID0gdHJ1ZTtcbiAgICB9XG4gIH0gZWxzZSB7XG4gICAgc2tpcENodW5rQ2hlY2sgPSB0cnVlO1xuICB9XG5cbiAgcmV0dXJuIHJlYWRhYmxlQWRkQ2h1bmsodGhpcywgY2h1bmssIGVuY29kaW5nLCBmYWxzZSwgc2tpcENodW5rQ2hlY2spO1xufTtcblxuLy8gVW5zaGlmdCBzaG91bGQgKmFsd2F5cyogYmUgc29tZXRoaW5nIGRpcmVjdGx5IG91dCBvZiByZWFkKClcblJlYWRhYmxlLnByb3RvdHlwZS51bnNoaWZ0ID0gZnVuY3Rpb24gKGNodW5rKSB7XG4gIHJldHVybiByZWFkYWJsZUFkZENodW5rKHRoaXMsIGNodW5rLCBudWxsLCB0cnVlLCBmYWxzZSk7XG59O1xuXG5mdW5jdGlvbiByZWFkYWJsZUFkZENodW5rKHN0cmVhbSwgY2h1bmssIGVuY29kaW5nLCBhZGRUb0Zyb250LCBza2lwQ2h1bmtDaGVjaykge1xuICB2YXIgc3RhdGUgPSBzdHJlYW0uX3JlYWRhYmxlU3RhdGU7XG4gIGlmIChjaHVuayA9PT0gbnVsbCkge1xuICAgIHN0YXRlLnJlYWRpbmcgPSBmYWxzZTtcbiAgICBvbkVvZkNodW5rKHN0cmVhbSwgc3RhdGUpO1xuICB9IGVsc2Uge1xuICAgIHZhciBlcjtcbiAgICBpZiAoIXNraXBDaHVua0NoZWNrKSBlciA9IGNodW5rSW52YWxpZChzdGF0ZSwgY2h1bmspO1xuICAgIGlmIChlcikge1xuICAgICAgc3RyZWFtLmVtaXQoJ2Vycm9yJywgZXIpO1xuICAgIH0gZWxzZSBpZiAoc3RhdGUub2JqZWN0TW9kZSB8fCBjaHVuayAmJiBjaHVuay5sZW5ndGggPiAwKSB7XG4gICAgICBpZiAodHlwZW9mIGNodW5rICE9PSAnc3RyaW5nJyAmJiAhc3RhdGUub2JqZWN0TW9kZSAmJiBPYmplY3QuZ2V0UHJvdG90eXBlT2YoY2h1bmspICE9PSBCdWZmZXIucHJvdG90eXBlKSB7XG4gICAgICAgIGNodW5rID0gX3VpbnQ4QXJyYXlUb0J1ZmZlcihjaHVuayk7XG4gICAgICB9XG5cbiAgICAgIGlmIChhZGRUb0Zyb250KSB7XG4gICAgICAgIGlmIChzdGF0ZS5lbmRFbWl0dGVkKSBzdHJlYW0uZW1pdCgnZXJyb3InLCBuZXcgRXJyb3IoJ3N0cmVhbS51bnNoaWZ0KCkgYWZ0ZXIgZW5kIGV2ZW50JykpO2Vsc2UgYWRkQ2h1bmsoc3RyZWFtLCBzdGF0ZSwgY2h1bmssIHRydWUpO1xuICAgICAgfSBlbHNlIGlmIChzdGF0ZS5lbmRlZCkge1xuICAgICAgICBzdHJlYW0uZW1pdCgnZXJyb3InLCBuZXcgRXJyb3IoJ3N0cmVhbS5wdXNoKCkgYWZ0ZXIgRU9GJykpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgc3RhdGUucmVhZGluZyA9IGZhbHNlO1xuICAgICAgICBpZiAoc3RhdGUuZGVjb2RlciAmJiAhZW5jb2RpbmcpIHtcbiAgICAgICAgICBjaHVuayA9IHN0YXRlLmRlY29kZXIud3JpdGUoY2h1bmspO1xuICAgICAgICAgIGlmIChzdGF0ZS5vYmplY3RNb2RlIHx8IGNodW5rLmxlbmd0aCAhPT0gMCkgYWRkQ2h1bmsoc3RyZWFtLCBzdGF0ZSwgY2h1bmssIGZhbHNlKTtlbHNlIG1heWJlUmVhZE1vcmUoc3RyZWFtLCBzdGF0ZSk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgYWRkQ2h1bmsoc3RyZWFtLCBzdGF0ZSwgY2h1bmssIGZhbHNlKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH0gZWxzZSBpZiAoIWFkZFRvRnJvbnQpIHtcbiAgICAgIHN0YXRlLnJlYWRpbmcgPSBmYWxzZTtcbiAgICB9XG4gIH1cblxuICByZXR1cm4gbmVlZE1vcmVEYXRhKHN0YXRlKTtcbn1cblxuZnVuY3Rpb24gYWRkQ2h1bmsoc3RyZWFtLCBzdGF0ZSwgY2h1bmssIGFkZFRvRnJvbnQpIHtcbiAgaWYgKHN0YXRlLmZsb3dpbmcgJiYgc3RhdGUubGVuZ3RoID09PSAwICYmICFzdGF0ZS5zeW5jKSB7XG4gICAgc3RyZWFtLmVtaXQoJ2RhdGEnLCBjaHVuayk7XG4gICAgc3RyZWFtLnJlYWQoMCk7XG4gIH0gZWxzZSB7XG4gICAgLy8gdXBkYXRlIHRoZSBidWZmZXIgaW5mby5cbiAgICBzdGF0ZS5sZW5ndGggKz0gc3RhdGUub2JqZWN0TW9kZSA/IDEgOiBjaHVuay5sZW5ndGg7XG4gICAgaWYgKGFkZFRvRnJvbnQpIHN0YXRlLmJ1ZmZlci51bnNoaWZ0KGNodW5rKTtlbHNlIHN0YXRlLmJ1ZmZlci5wdXNoKGNodW5rKTtcblxuICAgIGlmIChzdGF0ZS5uZWVkUmVhZGFibGUpIGVtaXRSZWFkYWJsZShzdHJlYW0pO1xuICB9XG4gIG1heWJlUmVhZE1vcmUoc3RyZWFtLCBzdGF0ZSk7XG59XG5cbmZ1bmN0aW9uIGNodW5rSW52YWxpZChzdGF0ZSwgY2h1bmspIHtcbiAgdmFyIGVyO1xuICBpZiAoIV9pc1VpbnQ4QXJyYXkoY2h1bmspICYmIHR5cGVvZiBjaHVuayAhPT0gJ3N0cmluZycgJiYgY2h1bmsgIT09IHVuZGVmaW5lZCAmJiAhc3RhdGUub2JqZWN0TW9kZSkge1xuICAgIGVyID0gbmV3IFR5cGVFcnJvcignSW52YWxpZCBub24tc3RyaW5nL2J1ZmZlciBjaHVuaycpO1xuICB9XG4gIHJldHVybiBlcjtcbn1cblxuLy8gaWYgaXQncyBwYXN0IHRoZSBoaWdoIHdhdGVyIG1hcmssIHdlIGNhbiBwdXNoIGluIHNvbWUgbW9yZS5cbi8vIEFsc28sIGlmIHdlIGhhdmUgbm8gZGF0YSB5ZXQsIHdlIGNhbiBzdGFuZCBzb21lXG4vLyBtb3JlIGJ5dGVzLiAgVGhpcyBpcyB0byB3b3JrIGFyb3VuZCBjYXNlcyB3aGVyZSBod209MCxcbi8vIHN1Y2ggYXMgdGhlIHJlcGwuICBBbHNvLCBpZiB0aGUgcHVzaCgpIHRyaWdnZXJlZCBhXG4vLyByZWFkYWJsZSBldmVudCwgYW5kIHRoZSB1c2VyIGNhbGxlZCByZWFkKGxhcmdlTnVtYmVyKSBzdWNoIHRoYXRcbi8vIG5lZWRSZWFkYWJsZSB3YXMgc2V0LCB0aGVuIHdlIG91Z2h0IHRvIHB1c2ggbW9yZSwgc28gdGhhdCBhbm90aGVyXG4vLyAncmVhZGFibGUnIGV2ZW50IHdpbGwgYmUgdHJpZ2dlcmVkLlxuZnVuY3Rpb24gbmVlZE1vcmVEYXRhKHN0YXRlKSB7XG4gIHJldHVybiAhc3RhdGUuZW5kZWQgJiYgKHN0YXRlLm5lZWRSZWFkYWJsZSB8fCBzdGF0ZS5sZW5ndGggPCBzdGF0ZS5oaWdoV2F0ZXJNYXJrIHx8IHN0YXRlLmxlbmd0aCA9PT0gMCk7XG59XG5cblJlYWRhYmxlLnByb3RvdHlwZS5pc1BhdXNlZCA9IGZ1bmN0aW9uICgpIHtcbiAgcmV0dXJuIHRoaXMuX3JlYWRhYmxlU3RhdGUuZmxvd2luZyA9PT0gZmFsc2U7XG59O1xuXG4vLyBiYWNrd2FyZHMgY29tcGF0aWJpbGl0eS5cblJlYWRhYmxlLnByb3RvdHlwZS5zZXRFbmNvZGluZyA9IGZ1bmN0aW9uIChlbmMpIHtcbiAgaWYgKCFTdHJpbmdEZWNvZGVyKSBTdHJpbmdEZWNvZGVyID0gcmVxdWlyZSgnc3RyaW5nX2RlY29kZXIvJykuU3RyaW5nRGVjb2RlcjtcbiAgdGhpcy5fcmVhZGFibGVTdGF0ZS5kZWNvZGVyID0gbmV3IFN0cmluZ0RlY29kZXIoZW5jKTtcbiAgdGhpcy5fcmVhZGFibGVTdGF0ZS5lbmNvZGluZyA9IGVuYztcbiAgcmV0dXJuIHRoaXM7XG59O1xuXG4vLyBEb24ndCByYWlzZSB0aGUgaHdtID4gOE1CXG52YXIgTUFYX0hXTSA9IDB4ODAwMDAwO1xuZnVuY3Rpb24gY29tcHV0ZU5ld0hpZ2hXYXRlck1hcmsobikge1xuICBpZiAobiA+PSBNQVhfSFdNKSB7XG4gICAgbiA9IE1BWF9IV007XG4gIH0gZWxzZSB7XG4gICAgLy8gR2V0IHRoZSBuZXh0IGhpZ2hlc3QgcG93ZXIgb2YgMiB0byBwcmV2ZW50IGluY3JlYXNpbmcgaHdtIGV4Y2Vzc2l2ZWx5IGluXG4gICAgLy8gdGlueSBhbW91bnRzXG4gICAgbi0tO1xuICAgIG4gfD0gbiA+Pj4gMTtcbiAgICBuIHw9IG4gPj4+IDI7XG4gICAgbiB8PSBuID4+PiA0O1xuICAgIG4gfD0gbiA+Pj4gODtcbiAgICBuIHw9IG4gPj4+IDE2O1xuICAgIG4rKztcbiAgfVxuICByZXR1cm4gbjtcbn1cblxuLy8gVGhpcyBmdW5jdGlvbiBpcyBkZXNpZ25lZCB0byBiZSBpbmxpbmFibGUsIHNvIHBsZWFzZSB0YWtlIGNhcmUgd2hlbiBtYWtpbmdcbi8vIGNoYW5nZXMgdG8gdGhlIGZ1bmN0aW9uIGJvZHkuXG5mdW5jdGlvbiBob3dNdWNoVG9SZWFkKG4sIHN0YXRlKSB7XG4gIGlmIChuIDw9IDAgfHwgc3RhdGUubGVuZ3RoID09PSAwICYmIHN0YXRlLmVuZGVkKSByZXR1cm4gMDtcbiAgaWYgKHN0YXRlLm9iamVjdE1vZGUpIHJldHVybiAxO1xuICBpZiAobiAhPT0gbikge1xuICAgIC8vIE9ubHkgZmxvdyBvbmUgYnVmZmVyIGF0IGEgdGltZVxuICAgIGlmIChzdGF0ZS5mbG93aW5nICYmIHN0YXRlLmxlbmd0aCkgcmV0dXJuIHN0YXRlLmJ1ZmZlci5oZWFkLmRhdGEubGVuZ3RoO2Vsc2UgcmV0dXJuIHN0YXRlLmxlbmd0aDtcbiAgfVxuICAvLyBJZiB3ZSdyZSBhc2tpbmcgZm9yIG1vcmUgdGhhbiB0aGUgY3VycmVudCBod20sIHRoZW4gcmFpc2UgdGhlIGh3bS5cbiAgaWYgKG4gPiBzdGF0ZS5oaWdoV2F0ZXJNYXJrKSBzdGF0ZS5oaWdoV2F0ZXJNYXJrID0gY29tcHV0ZU5ld0hpZ2hXYXRlck1hcmsobik7XG4gIGlmIChuIDw9IHN0YXRlLmxlbmd0aCkgcmV0dXJuIG47XG4gIC8vIERvbid0IGhhdmUgZW5vdWdoXG4gIGlmICghc3RhdGUuZW5kZWQpIHtcbiAgICBzdGF0ZS5uZWVkUmVhZGFibGUgPSB0cnVlO1xuICAgIHJldHVybiAwO1xuICB9XG4gIHJldHVybiBzdGF0ZS5sZW5ndGg7XG59XG5cbi8vIHlvdSBjYW4gb3ZlcnJpZGUgZWl0aGVyIHRoaXMgbWV0aG9kLCBvciB0aGUgYXN5bmMgX3JlYWQobikgYmVsb3cuXG5SZWFkYWJsZS5wcm90b3R5cGUucmVhZCA9IGZ1bmN0aW9uIChuKSB7XG4gIGRlYnVnKCdyZWFkJywgbik7XG4gIG4gPSBwYXJzZUludChuLCAxMCk7XG4gIHZhciBzdGF0ZSA9IHRoaXMuX3JlYWRhYmxlU3RhdGU7XG4gIHZhciBuT3JpZyA9IG47XG5cbiAgaWYgKG4gIT09IDApIHN0YXRlLmVtaXR0ZWRSZWFkYWJsZSA9IGZhbHNlO1xuXG4gIC8vIGlmIHdlJ3JlIGRvaW5nIHJlYWQoMCkgdG8gdHJpZ2dlciBhIHJlYWRhYmxlIGV2ZW50LCBidXQgd2VcbiAgLy8gYWxyZWFkeSBoYXZlIGEgYnVuY2ggb2YgZGF0YSBpbiB0aGUgYnVmZmVyLCB0aGVuIGp1c3QgdHJpZ2dlclxuICAvLyB0aGUgJ3JlYWRhYmxlJyBldmVudCBhbmQgbW92ZSBvbi5cbiAgaWYgKG4gPT09IDAgJiYgc3RhdGUubmVlZFJlYWRhYmxlICYmIChzdGF0ZS5sZW5ndGggPj0gc3RhdGUuaGlnaFdhdGVyTWFyayB8fCBzdGF0ZS5lbmRlZCkpIHtcbiAgICBkZWJ1ZygncmVhZDogZW1pdFJlYWRhYmxlJywgc3RhdGUubGVuZ3RoLCBzdGF0ZS5lbmRlZCk7XG4gICAgaWYgKHN0YXRlLmxlbmd0aCA9PT0gMCAmJiBzdGF0ZS5lbmRlZCkgZW5kUmVhZGFibGUodGhpcyk7ZWxzZSBlbWl0UmVhZGFibGUodGhpcyk7XG4gICAgcmV0dXJuIG51bGw7XG4gIH1cblxuICBuID0gaG93TXVjaFRvUmVhZChuLCBzdGF0ZSk7XG5cbiAgLy8gaWYgd2UndmUgZW5kZWQsIGFuZCB3ZSdyZSBub3cgY2xlYXIsIHRoZW4gZmluaXNoIGl0IHVwLlxuICBpZiAobiA9PT0gMCAmJiBzdGF0ZS5lbmRlZCkge1xuICAgIGlmIChzdGF0ZS5sZW5ndGggPT09IDApIGVuZFJlYWRhYmxlKHRoaXMpO1xuICAgIHJldHVybiBudWxsO1xuICB9XG5cbiAgLy8gQWxsIHRoZSBhY3R1YWwgY2h1bmsgZ2VuZXJhdGlvbiBsb2dpYyBuZWVkcyB0byBiZVxuICAvLyAqYmVsb3cqIHRoZSBjYWxsIHRvIF9yZWFkLiAgVGhlIHJlYXNvbiBpcyB0aGF0IGluIGNlcnRhaW5cbiAgLy8gc3ludGhldGljIHN0cmVhbSBjYXNlcywgc3VjaCBhcyBwYXNzdGhyb3VnaCBzdHJlYW1zLCBfcmVhZFxuICAvLyBtYXkgYmUgYSBjb21wbGV0ZWx5IHN5bmNocm9ub3VzIG9wZXJhdGlvbiB3aGljaCBtYXkgY2hhbmdlXG4gIC8vIHRoZSBzdGF0ZSBvZiB0aGUgcmVhZCBidWZmZXIsIHByb3ZpZGluZyBlbm91Z2ggZGF0YSB3aGVuXG4gIC8vIGJlZm9yZSB0aGVyZSB3YXMgKm5vdCogZW5vdWdoLlxuICAvL1xuICAvLyBTbywgdGhlIHN0ZXBzIGFyZTpcbiAgLy8gMS4gRmlndXJlIG91dCB3aGF0IHRoZSBzdGF0ZSBvZiB0aGluZ3Mgd2lsbCBiZSBhZnRlciB3ZSBkb1xuICAvLyBhIHJlYWQgZnJvbSB0aGUgYnVmZmVyLlxuICAvL1xuICAvLyAyLiBJZiB0aGF0IHJlc3VsdGluZyBzdGF0ZSB3aWxsIHRyaWdnZXIgYSBfcmVhZCwgdGhlbiBjYWxsIF9yZWFkLlxuICAvLyBOb3RlIHRoYXQgdGhpcyBtYXkgYmUgYXN5bmNocm9ub3VzLCBvciBzeW5jaHJvbm91cy4gIFllcywgaXQgaXNcbiAgLy8gZGVlcGx5IHVnbHkgdG8gd3JpdGUgQVBJcyB0aGlzIHdheSwgYnV0IHRoYXQgc3RpbGwgZG9lc24ndCBtZWFuXG4gIC8vIHRoYXQgdGhlIFJlYWRhYmxlIGNsYXNzIHNob3VsZCBiZWhhdmUgaW1wcm9wZXJseSwgYXMgc3RyZWFtcyBhcmVcbiAgLy8gZGVzaWduZWQgdG8gYmUgc3luYy9hc3luYyBhZ25vc3RpYy5cbiAgLy8gVGFrZSBub3RlIGlmIHRoZSBfcmVhZCBjYWxsIGlzIHN5bmMgb3IgYXN5bmMgKGllLCBpZiB0aGUgcmVhZCBjYWxsXG4gIC8vIGhhcyByZXR1cm5lZCB5ZXQpLCBzbyB0aGF0IHdlIGtub3cgd2hldGhlciBvciBub3QgaXQncyBzYWZlIHRvIGVtaXRcbiAgLy8gJ3JlYWRhYmxlJyBldGMuXG4gIC8vXG4gIC8vIDMuIEFjdHVhbGx5IHB1bGwgdGhlIHJlcXVlc3RlZCBjaHVua3Mgb3V0IG9mIHRoZSBidWZmZXIgYW5kIHJldHVybi5cblxuICAvLyBpZiB3ZSBuZWVkIGEgcmVhZGFibGUgZXZlbnQsIHRoZW4gd2UgbmVlZCB0byBkbyBzb21lIHJlYWRpbmcuXG4gIHZhciBkb1JlYWQgPSBzdGF0ZS5uZWVkUmVhZGFibGU7XG4gIGRlYnVnKCduZWVkIHJlYWRhYmxlJywgZG9SZWFkKTtcblxuICAvLyBpZiB3ZSBjdXJyZW50bHkgaGF2ZSBsZXNzIHRoYW4gdGhlIGhpZ2hXYXRlck1hcmssIHRoZW4gYWxzbyByZWFkIHNvbWVcbiAgaWYgKHN0YXRlLmxlbmd0aCA9PT0gMCB8fCBzdGF0ZS5sZW5ndGggLSBuIDwgc3RhdGUuaGlnaFdhdGVyTWFyaykge1xuICAgIGRvUmVhZCA9IHRydWU7XG4gICAgZGVidWcoJ2xlbmd0aCBsZXNzIHRoYW4gd2F0ZXJtYXJrJywgZG9SZWFkKTtcbiAgfVxuXG4gIC8vIGhvd2V2ZXIsIGlmIHdlJ3ZlIGVuZGVkLCB0aGVuIHRoZXJlJ3Mgbm8gcG9pbnQsIGFuZCBpZiB3ZSdyZSBhbHJlYWR5XG4gIC8vIHJlYWRpbmcsIHRoZW4gaXQncyB1bm5lY2Vzc2FyeS5cbiAgaWYgKHN0YXRlLmVuZGVkIHx8IHN0YXRlLnJlYWRpbmcpIHtcbiAgICBkb1JlYWQgPSBmYWxzZTtcbiAgICBkZWJ1ZygncmVhZGluZyBvciBlbmRlZCcsIGRvUmVhZCk7XG4gIH0gZWxzZSBpZiAoZG9SZWFkKSB7XG4gICAgZGVidWcoJ2RvIHJlYWQnKTtcbiAgICBzdGF0ZS5yZWFkaW5nID0gdHJ1ZTtcbiAgICBzdGF0ZS5zeW5jID0gdHJ1ZTtcbiAgICAvLyBpZiB0aGUgbGVuZ3RoIGlzIGN1cnJlbnRseSB6ZXJvLCB0aGVuIHdlICpuZWVkKiBhIHJlYWRhYmxlIGV2ZW50LlxuICAgIGlmIChzdGF0ZS5sZW5ndGggPT09IDApIHN0YXRlLm5lZWRSZWFkYWJsZSA9IHRydWU7XG4gICAgLy8gY2FsbCBpbnRlcm5hbCByZWFkIG1ldGhvZFxuICAgIHRoaXMuX3JlYWQoc3RhdGUuaGlnaFdhdGVyTWFyayk7XG4gICAgc3RhdGUuc3luYyA9IGZhbHNlO1xuICAgIC8vIElmIF9yZWFkIHB1c2hlZCBkYXRhIHN5bmNocm9ub3VzbHksIHRoZW4gYHJlYWRpbmdgIHdpbGwgYmUgZmFsc2UsXG4gICAgLy8gYW5kIHdlIG5lZWQgdG8gcmUtZXZhbHVhdGUgaG93IG11Y2ggZGF0YSB3ZSBjYW4gcmV0dXJuIHRvIHRoZSB1c2VyLlxuICAgIGlmICghc3RhdGUucmVhZGluZykgbiA9IGhvd011Y2hUb1JlYWQobk9yaWcsIHN0YXRlKTtcbiAgfVxuXG4gIHZhciByZXQ7XG4gIGlmIChuID4gMCkgcmV0ID0gZnJvbUxpc3Qobiwgc3RhdGUpO2Vsc2UgcmV0ID0gbnVsbDtcblxuICBpZiAocmV0ID09PSBudWxsKSB7XG4gICAgc3RhdGUubmVlZFJlYWRhYmxlID0gdHJ1ZTtcbiAgICBuID0gMDtcbiAgfSBlbHNlIHtcbiAgICBzdGF0ZS5sZW5ndGggLT0gbjtcbiAgfVxuXG4gIGlmIChzdGF0ZS5sZW5ndGggPT09IDApIHtcbiAgICAvLyBJZiB3ZSBoYXZlIG5vdGhpbmcgaW4gdGhlIGJ1ZmZlciwgdGhlbiB3ZSB3YW50IHRvIGtub3dcbiAgICAvLyBhcyBzb29uIGFzIHdlICpkbyogZ2V0IHNvbWV0aGluZyBpbnRvIHRoZSBidWZmZXIuXG4gICAgaWYgKCFzdGF0ZS5lbmRlZCkgc3RhdGUubmVlZFJlYWRhYmxlID0gdHJ1ZTtcblxuICAgIC8vIElmIHdlIHRyaWVkIHRvIHJlYWQoKSBwYXN0IHRoZSBFT0YsIHRoZW4gZW1pdCBlbmQgb24gdGhlIG5leHQgdGljay5cbiAgICBpZiAobk9yaWcgIT09IG4gJiYgc3RhdGUuZW5kZWQpIGVuZFJlYWRhYmxlKHRoaXMpO1xuICB9XG5cbiAgaWYgKHJldCAhPT0gbnVsbCkgdGhpcy5lbWl0KCdkYXRhJywgcmV0KTtcblxuICByZXR1cm4gcmV0O1xufTtcblxuZnVuY3Rpb24gb25Fb2ZDaHVuayhzdHJlYW0sIHN0YXRlKSB7XG4gIGlmIChzdGF0ZS5lbmRlZCkgcmV0dXJuO1xuICBpZiAoc3RhdGUuZGVjb2Rlcikge1xuICAgIHZhciBjaHVuayA9IHN0YXRlLmRlY29kZXIuZW5kKCk7XG4gICAgaWYgKGNodW5rICYmIGNodW5rLmxlbmd0aCkge1xuICAgICAgc3RhdGUuYnVmZmVyLnB1c2goY2h1bmspO1xuICAgICAgc3RhdGUubGVuZ3RoICs9IHN0YXRlLm9iamVjdE1vZGUgPyAxIDogY2h1bmsubGVuZ3RoO1xuICAgIH1cbiAgfVxuICBzdGF0ZS5lbmRlZCA9IHRydWU7XG5cbiAgLy8gZW1pdCAncmVhZGFibGUnIG5vdyB0byBtYWtlIHN1cmUgaXQgZ2V0cyBwaWNrZWQgdXAuXG4gIGVtaXRSZWFkYWJsZShzdHJlYW0pO1xufVxuXG4vLyBEb24ndCBlbWl0IHJlYWRhYmxlIHJpZ2h0IGF3YXkgaW4gc3luYyBtb2RlLCBiZWNhdXNlIHRoaXMgY2FuIHRyaWdnZXJcbi8vIGFub3RoZXIgcmVhZCgpIGNhbGwgPT4gc3RhY2sgb3ZlcmZsb3cuICBUaGlzIHdheSwgaXQgbWlnaHQgdHJpZ2dlclxuLy8gYSBuZXh0VGljayByZWN1cnNpb24gd2FybmluZywgYnV0IHRoYXQncyBub3Qgc28gYmFkLlxuZnVuY3Rpb24gZW1pdFJlYWRhYmxlKHN0cmVhbSkge1xuICB2YXIgc3RhdGUgPSBzdHJlYW0uX3JlYWRhYmxlU3RhdGU7XG4gIHN0YXRlLm5lZWRSZWFkYWJsZSA9IGZhbHNlO1xuICBpZiAoIXN0YXRlLmVtaXR0ZWRSZWFkYWJsZSkge1xuICAgIGRlYnVnKCdlbWl0UmVhZGFibGUnLCBzdGF0ZS5mbG93aW5nKTtcbiAgICBzdGF0ZS5lbWl0dGVkUmVhZGFibGUgPSB0cnVlO1xuICAgIGlmIChzdGF0ZS5zeW5jKSBwbmEubmV4dFRpY2soZW1pdFJlYWRhYmxlXywgc3RyZWFtKTtlbHNlIGVtaXRSZWFkYWJsZV8oc3RyZWFtKTtcbiAgfVxufVxuXG5mdW5jdGlvbiBlbWl0UmVhZGFibGVfKHN0cmVhbSkge1xuICBkZWJ1ZygnZW1pdCByZWFkYWJsZScpO1xuICBzdHJlYW0uZW1pdCgncmVhZGFibGUnKTtcbiAgZmxvdyhzdHJlYW0pO1xufVxuXG4vLyBhdCB0aGlzIHBvaW50LCB0aGUgdXNlciBoYXMgcHJlc3VtYWJseSBzZWVuIHRoZSAncmVhZGFibGUnIGV2ZW50LFxuLy8gYW5kIGNhbGxlZCByZWFkKCkgdG8gY29uc3VtZSBzb21lIGRhdGEuICB0aGF0IG1heSBoYXZlIHRyaWdnZXJlZFxuLy8gaW4gdHVybiBhbm90aGVyIF9yZWFkKG4pIGNhbGwsIGluIHdoaWNoIGNhc2UgcmVhZGluZyA9IHRydWUgaWZcbi8vIGl0J3MgaW4gcHJvZ3Jlc3MuXG4vLyBIb3dldmVyLCBpZiB3ZSdyZSBub3QgZW5kZWQsIG9yIHJlYWRpbmcsIGFuZCB0aGUgbGVuZ3RoIDwgaHdtLFxuLy8gdGhlbiBnbyBhaGVhZCBhbmQgdHJ5IHRvIHJlYWQgc29tZSBtb3JlIHByZWVtcHRpdmVseS5cbmZ1bmN0aW9uIG1heWJlUmVhZE1vcmUoc3RyZWFtLCBzdGF0ZSkge1xuICBpZiAoIXN0YXRlLnJlYWRpbmdNb3JlKSB7XG4gICAgc3RhdGUucmVhZGluZ01vcmUgPSB0cnVlO1xuICAgIHBuYS5uZXh0VGljayhtYXliZVJlYWRNb3JlXywgc3RyZWFtLCBzdGF0ZSk7XG4gIH1cbn1cblxuZnVuY3Rpb24gbWF5YmVSZWFkTW9yZV8oc3RyZWFtLCBzdGF0ZSkge1xuICB2YXIgbGVuID0gc3RhdGUubGVuZ3RoO1xuICB3aGlsZSAoIXN0YXRlLnJlYWRpbmcgJiYgIXN0YXRlLmZsb3dpbmcgJiYgIXN0YXRlLmVuZGVkICYmIHN0YXRlLmxlbmd0aCA8IHN0YXRlLmhpZ2hXYXRlck1hcmspIHtcbiAgICBkZWJ1ZygnbWF5YmVSZWFkTW9yZSByZWFkIDAnKTtcbiAgICBzdHJlYW0ucmVhZCgwKTtcbiAgICBpZiAobGVuID09PSBzdGF0ZS5sZW5ndGgpXG4gICAgICAvLyBkaWRuJ3QgZ2V0IGFueSBkYXRhLCBzdG9wIHNwaW5uaW5nLlxuICAgICAgYnJlYWs7ZWxzZSBsZW4gPSBzdGF0ZS5sZW5ndGg7XG4gIH1cbiAgc3RhdGUucmVhZGluZ01vcmUgPSBmYWxzZTtcbn1cblxuLy8gYWJzdHJhY3QgbWV0aG9kLiAgdG8gYmUgb3ZlcnJpZGRlbiBpbiBzcGVjaWZpYyBpbXBsZW1lbnRhdGlvbiBjbGFzc2VzLlxuLy8gY2FsbCBjYihlciwgZGF0YSkgd2hlcmUgZGF0YSBpcyA8PSBuIGluIGxlbmd0aC5cbi8vIGZvciB2aXJ0dWFsIChub24tc3RyaW5nLCBub24tYnVmZmVyKSBzdHJlYW1zLCBcImxlbmd0aFwiIGlzIHNvbWV3aGF0XG4vLyBhcmJpdHJhcnksIGFuZCBwZXJoYXBzIG5vdCB2ZXJ5IG1lYW5pbmdmdWwuXG5SZWFkYWJsZS5wcm90b3R5cGUuX3JlYWQgPSBmdW5jdGlvbiAobikge1xuICB0aGlzLmVtaXQoJ2Vycm9yJywgbmV3IEVycm9yKCdfcmVhZCgpIGlzIG5vdCBpbXBsZW1lbnRlZCcpKTtcbn07XG5cblJlYWRhYmxlLnByb3RvdHlwZS5waXBlID0gZnVuY3Rpb24gKGRlc3QsIHBpcGVPcHRzKSB7XG4gIHZhciBzcmMgPSB0aGlzO1xuICB2YXIgc3RhdGUgPSB0aGlzLl9yZWFkYWJsZVN0YXRlO1xuXG4gIHN3aXRjaCAoc3RhdGUucGlwZXNDb3VudCkge1xuICAgIGNhc2UgMDpcbiAgICAgIHN0YXRlLnBpcGVzID0gZGVzdDtcbiAgICAgIGJyZWFrO1xuICAgIGNhc2UgMTpcbiAgICAgIHN0YXRlLnBpcGVzID0gW3N0YXRlLnBpcGVzLCBkZXN0XTtcbiAgICAgIGJyZWFrO1xuICAgIGRlZmF1bHQ6XG4gICAgICBzdGF0ZS5waXBlcy5wdXNoKGRlc3QpO1xuICAgICAgYnJlYWs7XG4gIH1cbiAgc3RhdGUucGlwZXNDb3VudCArPSAxO1xuICBkZWJ1ZygncGlwZSBjb3VudD0lZCBvcHRzPSVqJywgc3RhdGUucGlwZXNDb3VudCwgcGlwZU9wdHMpO1xuXG4gIHZhciBkb0VuZCA9ICghcGlwZU9wdHMgfHwgcGlwZU9wdHMuZW5kICE9PSBmYWxzZSkgJiYgZGVzdCAhPT0gcHJvY2Vzcy5zdGRvdXQgJiYgZGVzdCAhPT0gcHJvY2Vzcy5zdGRlcnI7XG5cbiAgdmFyIGVuZEZuID0gZG9FbmQgPyBvbmVuZCA6IHVucGlwZTtcbiAgaWYgKHN0YXRlLmVuZEVtaXR0ZWQpIHBuYS5uZXh0VGljayhlbmRGbik7ZWxzZSBzcmMub25jZSgnZW5kJywgZW5kRm4pO1xuXG4gIGRlc3Qub24oJ3VucGlwZScsIG9udW5waXBlKTtcbiAgZnVuY3Rpb24gb251bnBpcGUocmVhZGFibGUsIHVucGlwZUluZm8pIHtcbiAgICBkZWJ1Zygnb251bnBpcGUnKTtcbiAgICBpZiAocmVhZGFibGUgPT09IHNyYykge1xuICAgICAgaWYgKHVucGlwZUluZm8gJiYgdW5waXBlSW5mby5oYXNVbnBpcGVkID09PSBmYWxzZSkge1xuICAgICAgICB1bnBpcGVJbmZvLmhhc1VucGlwZWQgPSB0cnVlO1xuICAgICAgICBjbGVhbnVwKCk7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgZnVuY3Rpb24gb25lbmQoKSB7XG4gICAgZGVidWcoJ29uZW5kJyk7XG4gICAgZGVzdC5lbmQoKTtcbiAgfVxuXG4gIC8vIHdoZW4gdGhlIGRlc3QgZHJhaW5zLCBpdCByZWR1Y2VzIHRoZSBhd2FpdERyYWluIGNvdW50ZXJcbiAgLy8gb24gdGhlIHNvdXJjZS4gIFRoaXMgd291bGQgYmUgbW9yZSBlbGVnYW50IHdpdGggYSAub25jZSgpXG4gIC8vIGhhbmRsZXIgaW4gZmxvdygpLCBidXQgYWRkaW5nIGFuZCByZW1vdmluZyByZXBlYXRlZGx5IGlzXG4gIC8vIHRvbyBzbG93LlxuICB2YXIgb25kcmFpbiA9IHBpcGVPbkRyYWluKHNyYyk7XG4gIGRlc3Qub24oJ2RyYWluJywgb25kcmFpbik7XG5cbiAgdmFyIGNsZWFuZWRVcCA9IGZhbHNlO1xuICBmdW5jdGlvbiBjbGVhbnVwKCkge1xuICAgIGRlYnVnKCdjbGVhbnVwJyk7XG4gICAgLy8gY2xlYW51cCBldmVudCBoYW5kbGVycyBvbmNlIHRoZSBwaXBlIGlzIGJyb2tlblxuICAgIGRlc3QucmVtb3ZlTGlzdGVuZXIoJ2Nsb3NlJywgb25jbG9zZSk7XG4gICAgZGVzdC5yZW1vdmVMaXN0ZW5lcignZmluaXNoJywgb25maW5pc2gpO1xuICAgIGRlc3QucmVtb3ZlTGlzdGVuZXIoJ2RyYWluJywgb25kcmFpbik7XG4gICAgZGVzdC5yZW1vdmVMaXN0ZW5lcignZXJyb3InLCBvbmVycm9yKTtcbiAgICBkZXN0LnJlbW92ZUxpc3RlbmVyKCd1bnBpcGUnLCBvbnVucGlwZSk7XG4gICAgc3JjLnJlbW92ZUxpc3RlbmVyKCdlbmQnLCBvbmVuZCk7XG4gICAgc3JjLnJlbW92ZUxpc3RlbmVyKCdlbmQnLCB1bnBpcGUpO1xuICAgIHNyYy5yZW1vdmVMaXN0ZW5lcignZGF0YScsIG9uZGF0YSk7XG5cbiAgICBjbGVhbmVkVXAgPSB0cnVlO1xuXG4gICAgLy8gaWYgdGhlIHJlYWRlciBpcyB3YWl0aW5nIGZvciBhIGRyYWluIGV2ZW50IGZyb20gdGhpc1xuICAgIC8vIHNwZWNpZmljIHdyaXRlciwgdGhlbiBpdCB3b3VsZCBjYXVzZSBpdCB0byBuZXZlciBzdGFydFxuICAgIC8vIGZsb3dpbmcgYWdhaW4uXG4gICAgLy8gU28sIGlmIHRoaXMgaXMgYXdhaXRpbmcgYSBkcmFpbiwgdGhlbiB3ZSBqdXN0IGNhbGwgaXQgbm93LlxuICAgIC8vIElmIHdlIGRvbid0IGtub3csIHRoZW4gYXNzdW1lIHRoYXQgd2UgYXJlIHdhaXRpbmcgZm9yIG9uZS5cbiAgICBpZiAoc3RhdGUuYXdhaXREcmFpbiAmJiAoIWRlc3QuX3dyaXRhYmxlU3RhdGUgfHwgZGVzdC5fd3JpdGFibGVTdGF0ZS5uZWVkRHJhaW4pKSBvbmRyYWluKCk7XG4gIH1cblxuICAvLyBJZiB0aGUgdXNlciBwdXNoZXMgbW9yZSBkYXRhIHdoaWxlIHdlJ3JlIHdyaXRpbmcgdG8gZGVzdCB0aGVuIHdlJ2xsIGVuZCB1cFxuICAvLyBpbiBvbmRhdGEgYWdhaW4uIEhvd2V2ZXIsIHdlIG9ubHkgd2FudCB0byBpbmNyZWFzZSBhd2FpdERyYWluIG9uY2UgYmVjYXVzZVxuICAvLyBkZXN0IHdpbGwgb25seSBlbWl0IG9uZSAnZHJhaW4nIGV2ZW50IGZvciB0aGUgbXVsdGlwbGUgd3JpdGVzLlxuICAvLyA9PiBJbnRyb2R1Y2UgYSBndWFyZCBvbiBpbmNyZWFzaW5nIGF3YWl0RHJhaW4uXG4gIHZhciBpbmNyZWFzZWRBd2FpdERyYWluID0gZmFsc2U7XG4gIHNyYy5vbignZGF0YScsIG9uZGF0YSk7XG4gIGZ1bmN0aW9uIG9uZGF0YShjaHVuaykge1xuICAgIGRlYnVnKCdvbmRhdGEnKTtcbiAgICBpbmNyZWFzZWRBd2FpdERyYWluID0gZmFsc2U7XG4gICAgdmFyIHJldCA9IGRlc3Qud3JpdGUoY2h1bmspO1xuICAgIGlmIChmYWxzZSA9PT0gcmV0ICYmICFpbmNyZWFzZWRBd2FpdERyYWluKSB7XG4gICAgICAvLyBJZiB0aGUgdXNlciB1bnBpcGVkIGR1cmluZyBgZGVzdC53cml0ZSgpYCwgaXQgaXMgcG9zc2libGVcbiAgICAgIC8vIHRvIGdldCBzdHVjayBpbiBhIHBlcm1hbmVudGx5IHBhdXNlZCBzdGF0ZSBpZiB0aGF0IHdyaXRlXG4gICAgICAvLyBhbHNvIHJldHVybmVkIGZhbHNlLlxuICAgICAgLy8gPT4gQ2hlY2sgd2hldGhlciBgZGVzdGAgaXMgc3RpbGwgYSBwaXBpbmcgZGVzdGluYXRpb24uXG4gICAgICBpZiAoKHN0YXRlLnBpcGVzQ291bnQgPT09IDEgJiYgc3RhdGUucGlwZXMgPT09IGRlc3QgfHwgc3RhdGUucGlwZXNDb3VudCA+IDEgJiYgaW5kZXhPZihzdGF0ZS5waXBlcywgZGVzdCkgIT09IC0xKSAmJiAhY2xlYW5lZFVwKSB7XG4gICAgICAgIGRlYnVnKCdmYWxzZSB3cml0ZSByZXNwb25zZSwgcGF1c2UnLCBzdGF0ZS5hd2FpdERyYWluKTtcbiAgICAgICAgc3RhdGUuYXdhaXREcmFpbisrO1xuICAgICAgICBpbmNyZWFzZWRBd2FpdERyYWluID0gdHJ1ZTtcbiAgICAgIH1cbiAgICAgIHNyYy5wYXVzZSgpO1xuICAgIH1cbiAgfVxuXG4gIC8vIGlmIHRoZSBkZXN0IGhhcyBhbiBlcnJvciwgdGhlbiBzdG9wIHBpcGluZyBpbnRvIGl0LlxuICAvLyBob3dldmVyLCBkb24ndCBzdXBwcmVzcyB0aGUgdGhyb3dpbmcgYmVoYXZpb3IgZm9yIHRoaXMuXG4gIGZ1bmN0aW9uIG9uZXJyb3IoZXIpIHtcbiAgICBkZWJ1Zygnb25lcnJvcicsIGVyKTtcbiAgICB1bnBpcGUoKTtcbiAgICBkZXN0LnJlbW92ZUxpc3RlbmVyKCdlcnJvcicsIG9uZXJyb3IpO1xuICAgIGlmIChFRWxpc3RlbmVyQ291bnQoZGVzdCwgJ2Vycm9yJykgPT09IDApIGRlc3QuZW1pdCgnZXJyb3InLCBlcik7XG4gIH1cblxuICAvLyBNYWtlIHN1cmUgb3VyIGVycm9yIGhhbmRsZXIgaXMgYXR0YWNoZWQgYmVmb3JlIHVzZXJsYW5kIG9uZXMuXG4gIHByZXBlbmRMaXN0ZW5lcihkZXN0LCAnZXJyb3InLCBvbmVycm9yKTtcblxuICAvLyBCb3RoIGNsb3NlIGFuZCBmaW5pc2ggc2hvdWxkIHRyaWdnZXIgdW5waXBlLCBidXQgb25seSBvbmNlLlxuICBmdW5jdGlvbiBvbmNsb3NlKCkge1xuICAgIGRlc3QucmVtb3ZlTGlzdGVuZXIoJ2ZpbmlzaCcsIG9uZmluaXNoKTtcbiAgICB1bnBpcGUoKTtcbiAgfVxuICBkZXN0Lm9uY2UoJ2Nsb3NlJywgb25jbG9zZSk7XG4gIGZ1bmN0aW9uIG9uZmluaXNoKCkge1xuICAgIGRlYnVnKCdvbmZpbmlzaCcpO1xuICAgIGRlc3QucmVtb3ZlTGlzdGVuZXIoJ2Nsb3NlJywgb25jbG9zZSk7XG4gICAgdW5waXBlKCk7XG4gIH1cbiAgZGVzdC5vbmNlKCdmaW5pc2gnLCBvbmZpbmlzaCk7XG5cbiAgZnVuY3Rpb24gdW5waXBlKCkge1xuICAgIGRlYnVnKCd1bnBpcGUnKTtcbiAgICBzcmMudW5waXBlKGRlc3QpO1xuICB9XG5cbiAgLy8gdGVsbCB0aGUgZGVzdCB0aGF0IGl0J3MgYmVpbmcgcGlwZWQgdG9cbiAgZGVzdC5lbWl0KCdwaXBlJywgc3JjKTtcblxuICAvLyBzdGFydCB0aGUgZmxvdyBpZiBpdCBoYXNuJ3QgYmVlbiBzdGFydGVkIGFscmVhZHkuXG4gIGlmICghc3RhdGUuZmxvd2luZykge1xuICAgIGRlYnVnKCdwaXBlIHJlc3VtZScpO1xuICAgIHNyYy5yZXN1bWUoKTtcbiAgfVxuXG4gIHJldHVybiBkZXN0O1xufTtcblxuZnVuY3Rpb24gcGlwZU9uRHJhaW4oc3JjKSB7XG4gIHJldHVybiBmdW5jdGlvbiAoKSB7XG4gICAgdmFyIHN0YXRlID0gc3JjLl9yZWFkYWJsZVN0YXRlO1xuICAgIGRlYnVnKCdwaXBlT25EcmFpbicsIHN0YXRlLmF3YWl0RHJhaW4pO1xuICAgIGlmIChzdGF0ZS5hd2FpdERyYWluKSBzdGF0ZS5hd2FpdERyYWluLS07XG4gICAgaWYgKHN0YXRlLmF3YWl0RHJhaW4gPT09IDAgJiYgRUVsaXN0ZW5lckNvdW50KHNyYywgJ2RhdGEnKSkge1xuICAgICAgc3RhdGUuZmxvd2luZyA9IHRydWU7XG4gICAgICBmbG93KHNyYyk7XG4gICAgfVxuICB9O1xufVxuXG5SZWFkYWJsZS5wcm90b3R5cGUudW5waXBlID0gZnVuY3Rpb24gKGRlc3QpIHtcbiAgdmFyIHN0YXRlID0gdGhpcy5fcmVhZGFibGVTdGF0ZTtcbiAgdmFyIHVucGlwZUluZm8gPSB7IGhhc1VucGlwZWQ6IGZhbHNlIH07XG5cbiAgLy8gaWYgd2UncmUgbm90IHBpcGluZyBhbnl3aGVyZSwgdGhlbiBkbyBub3RoaW5nLlxuICBpZiAoc3RhdGUucGlwZXNDb3VudCA9PT0gMCkgcmV0dXJuIHRoaXM7XG5cbiAgLy8ganVzdCBvbmUgZGVzdGluYXRpb24uICBtb3N0IGNvbW1vbiBjYXNlLlxuICBpZiAoc3RhdGUucGlwZXNDb3VudCA9PT0gMSkge1xuICAgIC8vIHBhc3NlZCBpbiBvbmUsIGJ1dCBpdCdzIG5vdCB0aGUgcmlnaHQgb25lLlxuICAgIGlmIChkZXN0ICYmIGRlc3QgIT09IHN0YXRlLnBpcGVzKSByZXR1cm4gdGhpcztcblxuICAgIGlmICghZGVzdCkgZGVzdCA9IHN0YXRlLnBpcGVzO1xuXG4gICAgLy8gZ290IGEgbWF0Y2guXG4gICAgc3RhdGUucGlwZXMgPSBudWxsO1xuICAgIHN0YXRlLnBpcGVzQ291bnQgPSAwO1xuICAgIHN0YXRlLmZsb3dpbmcgPSBmYWxzZTtcbiAgICBpZiAoZGVzdCkgZGVzdC5lbWl0KCd1bnBpcGUnLCB0aGlzLCB1bnBpcGVJbmZvKTtcbiAgICByZXR1cm4gdGhpcztcbiAgfVxuXG4gIC8vIHNsb3cgY2FzZS4gbXVsdGlwbGUgcGlwZSBkZXN0aW5hdGlvbnMuXG5cbiAgaWYgKCFkZXN0KSB7XG4gICAgLy8gcmVtb3ZlIGFsbC5cbiAgICB2YXIgZGVzdHMgPSBzdGF0ZS5waXBlcztcbiAgICB2YXIgbGVuID0gc3RhdGUucGlwZXNDb3VudDtcbiAgICBzdGF0ZS5waXBlcyA9IG51bGw7XG4gICAgc3RhdGUucGlwZXNDb3VudCA9IDA7XG4gICAgc3RhdGUuZmxvd2luZyA9IGZhbHNlO1xuXG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCBsZW47IGkrKykge1xuICAgICAgZGVzdHNbaV0uZW1pdCgndW5waXBlJywgdGhpcywgeyBoYXNVbnBpcGVkOiBmYWxzZSB9KTtcbiAgICB9cmV0dXJuIHRoaXM7XG4gIH1cblxuICAvLyB0cnkgdG8gZmluZCB0aGUgcmlnaHQgb25lLlxuICB2YXIgaW5kZXggPSBpbmRleE9mKHN0YXRlLnBpcGVzLCBkZXN0KTtcbiAgaWYgKGluZGV4ID09PSAtMSkgcmV0dXJuIHRoaXM7XG5cbiAgc3RhdGUucGlwZXMuc3BsaWNlKGluZGV4LCAxKTtcbiAgc3RhdGUucGlwZXNDb3VudCAtPSAxO1xuICBpZiAoc3RhdGUucGlwZXNDb3VudCA9PT0gMSkgc3RhdGUucGlwZXMgPSBzdGF0ZS5waXBlc1swXTtcblxuICBkZXN0LmVtaXQoJ3VucGlwZScsIHRoaXMsIHVucGlwZUluZm8pO1xuXG4gIHJldHVybiB0aGlzO1xufTtcblxuLy8gc2V0IHVwIGRhdGEgZXZlbnRzIGlmIHRoZXkgYXJlIGFza2VkIGZvclxuLy8gRW5zdXJlIHJlYWRhYmxlIGxpc3RlbmVycyBldmVudHVhbGx5IGdldCBzb21ldGhpbmdcblJlYWRhYmxlLnByb3RvdHlwZS5vbiA9IGZ1bmN0aW9uIChldiwgZm4pIHtcbiAgdmFyIHJlcyA9IFN0cmVhbS5wcm90b3R5cGUub24uY2FsbCh0aGlzLCBldiwgZm4pO1xuXG4gIGlmIChldiA9PT0gJ2RhdGEnKSB7XG4gICAgLy8gU3RhcnQgZmxvd2luZyBvbiBuZXh0IHRpY2sgaWYgc3RyZWFtIGlzbid0IGV4cGxpY2l0bHkgcGF1c2VkXG4gICAgaWYgKHRoaXMuX3JlYWRhYmxlU3RhdGUuZmxvd2luZyAhPT0gZmFsc2UpIHRoaXMucmVzdW1lKCk7XG4gIH0gZWxzZSBpZiAoZXYgPT09ICdyZWFkYWJsZScpIHtcbiAgICB2YXIgc3RhdGUgPSB0aGlzLl9yZWFkYWJsZVN0YXRlO1xuICAgIGlmICghc3RhdGUuZW5kRW1pdHRlZCAmJiAhc3RhdGUucmVhZGFibGVMaXN0ZW5pbmcpIHtcbiAgICAgIHN0YXRlLnJlYWRhYmxlTGlzdGVuaW5nID0gc3RhdGUubmVlZFJlYWRhYmxlID0gdHJ1ZTtcbiAgICAgIHN0YXRlLmVtaXR0ZWRSZWFkYWJsZSA9IGZhbHNlO1xuICAgICAgaWYgKCFzdGF0ZS5yZWFkaW5nKSB7XG4gICAgICAgIHBuYS5uZXh0VGljayhuUmVhZGluZ05leHRUaWNrLCB0aGlzKTtcbiAgICAgIH0gZWxzZSBpZiAoc3RhdGUubGVuZ3RoKSB7XG4gICAgICAgIGVtaXRSZWFkYWJsZSh0aGlzKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICByZXR1cm4gcmVzO1xufTtcblJlYWRhYmxlLnByb3RvdHlwZS5hZGRMaXN0ZW5lciA9IFJlYWRhYmxlLnByb3RvdHlwZS5vbjtcblxuZnVuY3Rpb24gblJlYWRpbmdOZXh0VGljayhzZWxmKSB7XG4gIGRlYnVnKCdyZWFkYWJsZSBuZXh0dGljayByZWFkIDAnKTtcbiAgc2VsZi5yZWFkKDApO1xufVxuXG4vLyBwYXVzZSgpIGFuZCByZXN1bWUoKSBhcmUgcmVtbmFudHMgb2YgdGhlIGxlZ2FjeSByZWFkYWJsZSBzdHJlYW0gQVBJXG4vLyBJZiB0aGUgdXNlciB1c2VzIHRoZW0sIHRoZW4gc3dpdGNoIGludG8gb2xkIG1vZGUuXG5SZWFkYWJsZS5wcm90b3R5cGUucmVzdW1lID0gZnVuY3Rpb24gKCkge1xuICB2YXIgc3RhdGUgPSB0aGlzLl9yZWFkYWJsZVN0YXRlO1xuICBpZiAoIXN0YXRlLmZsb3dpbmcpIHtcbiAgICBkZWJ1ZygncmVzdW1lJyk7XG4gICAgc3RhdGUuZmxvd2luZyA9IHRydWU7XG4gICAgcmVzdW1lKHRoaXMsIHN0YXRlKTtcbiAgfVxuICByZXR1cm4gdGhpcztcbn07XG5cbmZ1bmN0aW9uIHJlc3VtZShzdHJlYW0sIHN0YXRlKSB7XG4gIGlmICghc3RhdGUucmVzdW1lU2NoZWR1bGVkKSB7XG4gICAgc3RhdGUucmVzdW1lU2NoZWR1bGVkID0gdHJ1ZTtcbiAgICBwbmEubmV4dFRpY2socmVzdW1lXywgc3RyZWFtLCBzdGF0ZSk7XG4gIH1cbn1cblxuZnVuY3Rpb24gcmVzdW1lXyhzdHJlYW0sIHN0YXRlKSB7XG4gIGlmICghc3RhdGUucmVhZGluZykge1xuICAgIGRlYnVnKCdyZXN1bWUgcmVhZCAwJyk7XG4gICAgc3RyZWFtLnJlYWQoMCk7XG4gIH1cblxuICBzdGF0ZS5yZXN1bWVTY2hlZHVsZWQgPSBmYWxzZTtcbiAgc3RhdGUuYXdhaXREcmFpbiA9IDA7XG4gIHN0cmVhbS5lbWl0KCdyZXN1bWUnKTtcbiAgZmxvdyhzdHJlYW0pO1xuICBpZiAoc3RhdGUuZmxvd2luZyAmJiAhc3RhdGUucmVhZGluZykgc3RyZWFtLnJlYWQoMCk7XG59XG5cblJlYWRhYmxlLnByb3RvdHlwZS5wYXVzZSA9IGZ1bmN0aW9uICgpIHtcbiAgZGVidWcoJ2NhbGwgcGF1c2UgZmxvd2luZz0laicsIHRoaXMuX3JlYWRhYmxlU3RhdGUuZmxvd2luZyk7XG4gIGlmIChmYWxzZSAhPT0gdGhpcy5fcmVhZGFibGVTdGF0ZS5mbG93aW5nKSB7XG4gICAgZGVidWcoJ3BhdXNlJyk7XG4gICAgdGhpcy5fcmVhZGFibGVTdGF0ZS5mbG93aW5nID0gZmFsc2U7XG4gICAgdGhpcy5lbWl0KCdwYXVzZScpO1xuICB9XG4gIHJldHVybiB0aGlzO1xufTtcblxuZnVuY3Rpb24gZmxvdyhzdHJlYW0pIHtcbiAgdmFyIHN0YXRlID0gc3RyZWFtLl9yZWFkYWJsZVN0YXRlO1xuICBkZWJ1ZygnZmxvdycsIHN0YXRlLmZsb3dpbmcpO1xuICB3aGlsZSAoc3RhdGUuZmxvd2luZyAmJiBzdHJlYW0ucmVhZCgpICE9PSBudWxsKSB7fVxufVxuXG4vLyB3cmFwIGFuIG9sZC1zdHlsZSBzdHJlYW0gYXMgdGhlIGFzeW5jIGRhdGEgc291cmNlLlxuLy8gVGhpcyBpcyAqbm90KiBwYXJ0IG9mIHRoZSByZWFkYWJsZSBzdHJlYW0gaW50ZXJmYWNlLlxuLy8gSXQgaXMgYW4gdWdseSB1bmZvcnR1bmF0ZSBtZXNzIG9mIGhpc3RvcnkuXG5SZWFkYWJsZS5wcm90b3R5cGUud3JhcCA9IGZ1bmN0aW9uIChzdHJlYW0pIHtcbiAgdmFyIF90aGlzID0gdGhpcztcblxuICB2YXIgc3RhdGUgPSB0aGlzLl9yZWFkYWJsZVN0YXRlO1xuICB2YXIgcGF1c2VkID0gZmFsc2U7XG5cbiAgc3RyZWFtLm9uKCdlbmQnLCBmdW5jdGlvbiAoKSB7XG4gICAgZGVidWcoJ3dyYXBwZWQgZW5kJyk7XG4gICAgaWYgKHN0YXRlLmRlY29kZXIgJiYgIXN0YXRlLmVuZGVkKSB7XG4gICAgICB2YXIgY2h1bmsgPSBzdGF0ZS5kZWNvZGVyLmVuZCgpO1xuICAgICAgaWYgKGNodW5rICYmIGNodW5rLmxlbmd0aCkgX3RoaXMucHVzaChjaHVuayk7XG4gICAgfVxuXG4gICAgX3RoaXMucHVzaChudWxsKTtcbiAgfSk7XG5cbiAgc3RyZWFtLm9uKCdkYXRhJywgZnVuY3Rpb24gKGNodW5rKSB7XG4gICAgZGVidWcoJ3dyYXBwZWQgZGF0YScpO1xuICAgIGlmIChzdGF0ZS5kZWNvZGVyKSBjaHVuayA9IHN0YXRlLmRlY29kZXIud3JpdGUoY2h1bmspO1xuXG4gICAgLy8gZG9uJ3Qgc2tpcCBvdmVyIGZhbHN5IHZhbHVlcyBpbiBvYmplY3RNb2RlXG4gICAgaWYgKHN0YXRlLm9iamVjdE1vZGUgJiYgKGNodW5rID09PSBudWxsIHx8IGNodW5rID09PSB1bmRlZmluZWQpKSByZXR1cm47ZWxzZSBpZiAoIXN0YXRlLm9iamVjdE1vZGUgJiYgKCFjaHVuayB8fCAhY2h1bmsubGVuZ3RoKSkgcmV0dXJuO1xuXG4gICAgdmFyIHJldCA9IF90aGlzLnB1c2goY2h1bmspO1xuICAgIGlmICghcmV0KSB7XG4gICAgICBwYXVzZWQgPSB0cnVlO1xuICAgICAgc3RyZWFtLnBhdXNlKCk7XG4gICAgfVxuICB9KTtcblxuICAvLyBwcm94eSBhbGwgdGhlIG90aGVyIG1ldGhvZHMuXG4gIC8vIGltcG9ydGFudCB3aGVuIHdyYXBwaW5nIGZpbHRlcnMgYW5kIGR1cGxleGVzLlxuICBmb3IgKHZhciBpIGluIHN0cmVhbSkge1xuICAgIGlmICh0aGlzW2ldID09PSB1bmRlZmluZWQgJiYgdHlwZW9mIHN0cmVhbVtpXSA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgdGhpc1tpXSA9IGZ1bmN0aW9uIChtZXRob2QpIHtcbiAgICAgICAgcmV0dXJuIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICByZXR1cm4gc3RyZWFtW21ldGhvZF0uYXBwbHkoc3RyZWFtLCBhcmd1bWVudHMpO1xuICAgICAgICB9O1xuICAgICAgfShpKTtcbiAgICB9XG4gIH1cblxuICAvLyBwcm94eSBjZXJ0YWluIGltcG9ydGFudCBldmVudHMuXG4gIGZvciAodmFyIG4gPSAwOyBuIDwga1Byb3h5RXZlbnRzLmxlbmd0aDsgbisrKSB7XG4gICAgc3RyZWFtLm9uKGtQcm94eUV2ZW50c1tuXSwgdGhpcy5lbWl0LmJpbmQodGhpcywga1Byb3h5RXZlbnRzW25dKSk7XG4gIH1cblxuICAvLyB3aGVuIHdlIHRyeSB0byBjb25zdW1lIHNvbWUgbW9yZSBieXRlcywgc2ltcGx5IHVucGF1c2UgdGhlXG4gIC8vIHVuZGVybHlpbmcgc3RyZWFtLlxuICB0aGlzLl9yZWFkID0gZnVuY3Rpb24gKG4pIHtcbiAgICBkZWJ1Zygnd3JhcHBlZCBfcmVhZCcsIG4pO1xuICAgIGlmIChwYXVzZWQpIHtcbiAgICAgIHBhdXNlZCA9IGZhbHNlO1xuICAgICAgc3RyZWFtLnJlc3VtZSgpO1xuICAgIH1cbiAgfTtcblxuICByZXR1cm4gdGhpcztcbn07XG5cbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShSZWFkYWJsZS5wcm90b3R5cGUsICdyZWFkYWJsZUhpZ2hXYXRlck1hcmsnLCB7XG4gIC8vIG1ha2luZyBpdCBleHBsaWNpdCB0aGlzIHByb3BlcnR5IGlzIG5vdCBlbnVtZXJhYmxlXG4gIC8vIGJlY2F1c2Ugb3RoZXJ3aXNlIHNvbWUgcHJvdG90eXBlIG1hbmlwdWxhdGlvbiBpblxuICAvLyB1c2VybGFuZCB3aWxsIGZhaWxcbiAgZW51bWVyYWJsZTogZmFsc2UsXG4gIGdldDogZnVuY3Rpb24gKCkge1xuICAgIHJldHVybiB0aGlzLl9yZWFkYWJsZVN0YXRlLmhpZ2hXYXRlck1hcms7XG4gIH1cbn0pO1xuXG4vLyBleHBvc2VkIGZvciB0ZXN0aW5nIHB1cnBvc2VzIG9ubHkuXG5SZWFkYWJsZS5fZnJvbUxpc3QgPSBmcm9tTGlzdDtcblxuLy8gUGx1Y2sgb2ZmIG4gYnl0ZXMgZnJvbSBhbiBhcnJheSBvZiBidWZmZXJzLlxuLy8gTGVuZ3RoIGlzIHRoZSBjb21iaW5lZCBsZW5ndGhzIG9mIGFsbCB0aGUgYnVmZmVycyBpbiB0aGUgbGlzdC5cbi8vIFRoaXMgZnVuY3Rpb24gaXMgZGVzaWduZWQgdG8gYmUgaW5saW5hYmxlLCBzbyBwbGVhc2UgdGFrZSBjYXJlIHdoZW4gbWFraW5nXG4vLyBjaGFuZ2VzIHRvIHRoZSBmdW5jdGlvbiBib2R5LlxuZnVuY3Rpb24gZnJvbUxpc3Qobiwgc3RhdGUpIHtcbiAgLy8gbm90aGluZyBidWZmZXJlZFxuICBpZiAoc3RhdGUubGVuZ3RoID09PSAwKSByZXR1cm4gbnVsbDtcblxuICB2YXIgcmV0O1xuICBpZiAoc3RhdGUub2JqZWN0TW9kZSkgcmV0ID0gc3RhdGUuYnVmZmVyLnNoaWZ0KCk7ZWxzZSBpZiAoIW4gfHwgbiA+PSBzdGF0ZS5sZW5ndGgpIHtcbiAgICAvLyByZWFkIGl0IGFsbCwgdHJ1bmNhdGUgdGhlIGxpc3RcbiAgICBpZiAoc3RhdGUuZGVjb2RlcikgcmV0ID0gc3RhdGUuYnVmZmVyLmpvaW4oJycpO2Vsc2UgaWYgKHN0YXRlLmJ1ZmZlci5sZW5ndGggPT09IDEpIHJldCA9IHN0YXRlLmJ1ZmZlci5oZWFkLmRhdGE7ZWxzZSByZXQgPSBzdGF0ZS5idWZmZXIuY29uY2F0KHN0YXRlLmxlbmd0aCk7XG4gICAgc3RhdGUuYnVmZmVyLmNsZWFyKCk7XG4gIH0gZWxzZSB7XG4gICAgLy8gcmVhZCBwYXJ0IG9mIGxpc3RcbiAgICByZXQgPSBmcm9tTGlzdFBhcnRpYWwobiwgc3RhdGUuYnVmZmVyLCBzdGF0ZS5kZWNvZGVyKTtcbiAgfVxuXG4gIHJldHVybiByZXQ7XG59XG5cbi8vIEV4dHJhY3RzIG9ubHkgZW5vdWdoIGJ1ZmZlcmVkIGRhdGEgdG8gc2F0aXNmeSB0aGUgYW1vdW50IHJlcXVlc3RlZC5cbi8vIFRoaXMgZnVuY3Rpb24gaXMgZGVzaWduZWQgdG8gYmUgaW5saW5hYmxlLCBzbyBwbGVhc2UgdGFrZSBjYXJlIHdoZW4gbWFraW5nXG4vLyBjaGFuZ2VzIHRvIHRoZSBmdW5jdGlvbiBib2R5LlxuZnVuY3Rpb24gZnJvbUxpc3RQYXJ0aWFsKG4sIGxpc3QsIGhhc1N0cmluZ3MpIHtcbiAgdmFyIHJldDtcbiAgaWYgKG4gPCBsaXN0LmhlYWQuZGF0YS5sZW5ndGgpIHtcbiAgICAvLyBzbGljZSBpcyB0aGUgc2FtZSBmb3IgYnVmZmVycyBhbmQgc3RyaW5nc1xuICAgIHJldCA9IGxpc3QuaGVhZC5kYXRhLnNsaWNlKDAsIG4pO1xuICAgIGxpc3QuaGVhZC5kYXRhID0gbGlzdC5oZWFkLmRhdGEuc2xpY2Uobik7XG4gIH0gZWxzZSBpZiAobiA9PT0gbGlzdC5oZWFkLmRhdGEubGVuZ3RoKSB7XG4gICAgLy8gZmlyc3QgY2h1bmsgaXMgYSBwZXJmZWN0IG1hdGNoXG4gICAgcmV0ID0gbGlzdC5zaGlmdCgpO1xuICB9IGVsc2Uge1xuICAgIC8vIHJlc3VsdCBzcGFucyBtb3JlIHRoYW4gb25lIGJ1ZmZlclxuICAgIHJldCA9IGhhc1N0cmluZ3MgPyBjb3B5RnJvbUJ1ZmZlclN0cmluZyhuLCBsaXN0KSA6IGNvcHlGcm9tQnVmZmVyKG4sIGxpc3QpO1xuICB9XG4gIHJldHVybiByZXQ7XG59XG5cbi8vIENvcGllcyBhIHNwZWNpZmllZCBhbW91bnQgb2YgY2hhcmFjdGVycyBmcm9tIHRoZSBsaXN0IG9mIGJ1ZmZlcmVkIGRhdGFcbi8vIGNodW5rcy5cbi8vIFRoaXMgZnVuY3Rpb24gaXMgZGVzaWduZWQgdG8gYmUgaW5saW5hYmxlLCBzbyBwbGVhc2UgdGFrZSBjYXJlIHdoZW4gbWFraW5nXG4vLyBjaGFuZ2VzIHRvIHRoZSBmdW5jdGlvbiBib2R5LlxuZnVuY3Rpb24gY29weUZyb21CdWZmZXJTdHJpbmcobiwgbGlzdCkge1xuICB2YXIgcCA9IGxpc3QuaGVhZDtcbiAgdmFyIGMgPSAxO1xuICB2YXIgcmV0ID0gcC5kYXRhO1xuICBuIC09IHJldC5sZW5ndGg7XG4gIHdoaWxlIChwID0gcC5uZXh0KSB7XG4gICAgdmFyIHN0ciA9IHAuZGF0YTtcbiAgICB2YXIgbmIgPSBuID4gc3RyLmxlbmd0aCA/IHN0ci5sZW5ndGggOiBuO1xuICAgIGlmIChuYiA9PT0gc3RyLmxlbmd0aCkgcmV0ICs9IHN0cjtlbHNlIHJldCArPSBzdHIuc2xpY2UoMCwgbik7XG4gICAgbiAtPSBuYjtcbiAgICBpZiAobiA9PT0gMCkge1xuICAgICAgaWYgKG5iID09PSBzdHIubGVuZ3RoKSB7XG4gICAgICAgICsrYztcbiAgICAgICAgaWYgKHAubmV4dCkgbGlzdC5oZWFkID0gcC5uZXh0O2Vsc2UgbGlzdC5oZWFkID0gbGlzdC50YWlsID0gbnVsbDtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGxpc3QuaGVhZCA9IHA7XG4gICAgICAgIHAuZGF0YSA9IHN0ci5zbGljZShuYik7XG4gICAgICB9XG4gICAgICBicmVhaztcbiAgICB9XG4gICAgKytjO1xuICB9XG4gIGxpc3QubGVuZ3RoIC09IGM7XG4gIHJldHVybiByZXQ7XG59XG5cbi8vIENvcGllcyBhIHNwZWNpZmllZCBhbW91bnQgb2YgYnl0ZXMgZnJvbSB0aGUgbGlzdCBvZiBidWZmZXJlZCBkYXRhIGNodW5rcy5cbi8vIFRoaXMgZnVuY3Rpb24gaXMgZGVzaWduZWQgdG8gYmUgaW5saW5hYmxlLCBzbyBwbGVhc2UgdGFrZSBjYXJlIHdoZW4gbWFraW5nXG4vLyBjaGFuZ2VzIHRvIHRoZSBmdW5jdGlvbiBib2R5LlxuZnVuY3Rpb24gY29weUZyb21CdWZmZXIobiwgbGlzdCkge1xuICB2YXIgcmV0ID0gQnVmZmVyLmFsbG9jVW5zYWZlKG4pO1xuICB2YXIgcCA9IGxpc3QuaGVhZDtcbiAgdmFyIGMgPSAxO1xuICBwLmRhdGEuY29weShyZXQpO1xuICBuIC09IHAuZGF0YS5sZW5ndGg7XG4gIHdoaWxlIChwID0gcC5uZXh0KSB7XG4gICAgdmFyIGJ1ZiA9IHAuZGF0YTtcbiAgICB2YXIgbmIgPSBuID4gYnVmLmxlbmd0aCA/IGJ1Zi5sZW5ndGggOiBuO1xuICAgIGJ1Zi5jb3B5KHJldCwgcmV0Lmxlbmd0aCAtIG4sIDAsIG5iKTtcbiAgICBuIC09IG5iO1xuICAgIGlmIChuID09PSAwKSB7XG4gICAgICBpZiAobmIgPT09IGJ1Zi5sZW5ndGgpIHtcbiAgICAgICAgKytjO1xuICAgICAgICBpZiAocC5uZXh0KSBsaXN0LmhlYWQgPSBwLm5leHQ7ZWxzZSBsaXN0LmhlYWQgPSBsaXN0LnRhaWwgPSBudWxsO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgbGlzdC5oZWFkID0gcDtcbiAgICAgICAgcC5kYXRhID0gYnVmLnNsaWNlKG5iKTtcbiAgICAgIH1cbiAgICAgIGJyZWFrO1xuICAgIH1cbiAgICArK2M7XG4gIH1cbiAgbGlzdC5sZW5ndGggLT0gYztcbiAgcmV0dXJuIHJldDtcbn1cblxuZnVuY3Rpb24gZW5kUmVhZGFibGUoc3RyZWFtKSB7XG4gIHZhciBzdGF0ZSA9IHN0cmVhbS5fcmVhZGFibGVTdGF0ZTtcblxuICAvLyBJZiB3ZSBnZXQgaGVyZSBiZWZvcmUgY29uc3VtaW5nIGFsbCB0aGUgYnl0ZXMsIHRoZW4gdGhhdCBpcyBhXG4gIC8vIGJ1ZyBpbiBub2RlLiAgU2hvdWxkIG5ldmVyIGhhcHBlbi5cbiAgaWYgKHN0YXRlLmxlbmd0aCA+IDApIHRocm93IG5ldyBFcnJvcignXCJlbmRSZWFkYWJsZSgpXCIgY2FsbGVkIG9uIG5vbi1lbXB0eSBzdHJlYW0nKTtcblxuICBpZiAoIXN0YXRlLmVuZEVtaXR0ZWQpIHtcbiAgICBzdGF0ZS5lbmRlZCA9IHRydWU7XG4gICAgcG5hLm5leHRUaWNrKGVuZFJlYWRhYmxlTlQsIHN0YXRlLCBzdHJlYW0pO1xuICB9XG59XG5cbmZ1bmN0aW9uIGVuZFJlYWRhYmxlTlQoc3RhdGUsIHN0cmVhbSkge1xuICAvLyBDaGVjayB0aGF0IHdlIGRpZG4ndCBnZXQgb25lIGxhc3QgdW5zaGlmdC5cbiAgaWYgKCFzdGF0ZS5lbmRFbWl0dGVkICYmIHN0YXRlLmxlbmd0aCA9PT0gMCkge1xuICAgIHN0YXRlLmVuZEVtaXR0ZWQgPSB0cnVlO1xuICAgIHN0cmVhbS5yZWFkYWJsZSA9IGZhbHNlO1xuICAgIHN0cmVhbS5lbWl0KCdlbmQnKTtcbiAgfVxufVxuXG5mdW5jdGlvbiBpbmRleE9mKHhzLCB4KSB7XG4gIGZvciAodmFyIGkgPSAwLCBsID0geHMubGVuZ3RoOyBpIDwgbDsgaSsrKSB7XG4gICAgaWYgKHhzW2ldID09PSB4KSByZXR1cm4gaTtcbiAgfVxuICByZXR1cm4gLTE7XG59IiwKICAgICIvLyBDb3B5cmlnaHQgSm95ZW50LCBJbmMuIGFuZCBvdGhlciBOb2RlIGNvbnRyaWJ1dG9ycy5cbi8vXG4vLyBQZXJtaXNzaW9uIGlzIGhlcmVieSBncmFudGVkLCBmcmVlIG9mIGNoYXJnZSwgdG8gYW55IHBlcnNvbiBvYnRhaW5pbmcgYVxuLy8gY29weSBvZiB0aGlzIHNvZnR3YXJlIGFuZCBhc3NvY2lhdGVkIGRvY3VtZW50YXRpb24gZmlsZXMgKHRoZVxuLy8gXCJTb2Z0d2FyZVwiKSwgdG8gZGVhbCBpbiB0aGUgU29mdHdhcmUgd2l0aG91dCByZXN0cmljdGlvbiwgaW5jbHVkaW5nXG4vLyB3aXRob3V0IGxpbWl0YXRpb24gdGhlIHJpZ2h0cyB0byB1c2UsIGNvcHksIG1vZGlmeSwgbWVyZ2UsIHB1Ymxpc2gsXG4vLyBkaXN0cmlidXRlLCBzdWJsaWNlbnNlLCBhbmQvb3Igc2VsbCBjb3BpZXMgb2YgdGhlIFNvZnR3YXJlLCBhbmQgdG8gcGVybWl0XG4vLyBwZXJzb25zIHRvIHdob20gdGhlIFNvZnR3YXJlIGlzIGZ1cm5pc2hlZCB0byBkbyBzbywgc3ViamVjdCB0byB0aGVcbi8vIGZvbGxvd2luZyBjb25kaXRpb25zOlxuLy9cbi8vIFRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIHNoYWxsIGJlIGluY2x1ZGVkXG4vLyBpbiBhbGwgY29waWVzIG9yIHN1YnN0YW50aWFsIHBvcnRpb25zIG9mIHRoZSBTb2Z0d2FyZS5cbi8vXG4vLyBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgXCJBUyBJU1wiLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBFWFBSRVNTXG4vLyBPUiBJTVBMSUVELCBJTkNMVURJTkcgQlVUIE5PVCBMSU1JVEVEIFRPIFRIRSBXQVJSQU5USUVTIE9GXG4vLyBNRVJDSEFOVEFCSUxJVFksIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFORCBOT05JTkZSSU5HRU1FTlQuIElOXG4vLyBOTyBFVkVOVCBTSEFMTCBUSEUgQVVUSE9SUyBPUiBDT1BZUklHSFQgSE9MREVSUyBCRSBMSUFCTEUgRk9SIEFOWSBDTEFJTSxcbi8vIERBTUFHRVMgT1IgT1RIRVIgTElBQklMSVRZLCBXSEVUSEVSIElOIEFOIEFDVElPTiBPRiBDT05UUkFDVCwgVE9SVCBPUlxuLy8gT1RIRVJXSVNFLCBBUklTSU5HIEZST00sIE9VVCBPRiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFNPRlRXQVJFIE9SIFRIRVxuLy8gVVNFIE9SIE9USEVSIERFQUxJTkdTIElOIFRIRSBTT0ZUV0FSRS5cblxuLy8gYSB0cmFuc2Zvcm0gc3RyZWFtIGlzIGEgcmVhZGFibGUvd3JpdGFibGUgc3RyZWFtIHdoZXJlIHlvdSBkb1xuLy8gc29tZXRoaW5nIHdpdGggdGhlIGRhdGEuICBTb21ldGltZXMgaXQncyBjYWxsZWQgYSBcImZpbHRlclwiLFxuLy8gYnV0IHRoYXQncyBub3QgYSBncmVhdCBuYW1lIGZvciBpdCwgc2luY2UgdGhhdCBpbXBsaWVzIGEgdGhpbmcgd2hlcmVcbi8vIHNvbWUgYml0cyBwYXNzIHRocm91Z2gsIGFuZCBvdGhlcnMgYXJlIHNpbXBseSBpZ25vcmVkLiAgKFRoYXQgd291bGRcbi8vIGJlIGEgdmFsaWQgZXhhbXBsZSBvZiBhIHRyYW5zZm9ybSwgb2YgY291cnNlLilcbi8vXG4vLyBXaGlsZSB0aGUgb3V0cHV0IGlzIGNhdXNhbGx5IHJlbGF0ZWQgdG8gdGhlIGlucHV0LCBpdCdzIG5vdCBhXG4vLyBuZWNlc3NhcmlseSBzeW1tZXRyaWMgb3Igc3luY2hyb25vdXMgdHJhbnNmb3JtYXRpb24uICBGb3IgZXhhbXBsZSxcbi8vIGEgemxpYiBzdHJlYW0gbWlnaHQgdGFrZSBtdWx0aXBsZSBwbGFpbi10ZXh0IHdyaXRlcygpLCBhbmQgdGhlblxuLy8gZW1pdCBhIHNpbmdsZSBjb21wcmVzc2VkIGNodW5rIHNvbWUgdGltZSBpbiB0aGUgZnV0dXJlLlxuLy9cbi8vIEhlcmUncyBob3cgdGhpcyB3b3Jrczpcbi8vXG4vLyBUaGUgVHJhbnNmb3JtIHN0cmVhbSBoYXMgYWxsIHRoZSBhc3BlY3RzIG9mIHRoZSByZWFkYWJsZSBhbmQgd3JpdGFibGVcbi8vIHN0cmVhbSBjbGFzc2VzLiAgV2hlbiB5b3Ugd3JpdGUoY2h1bmspLCB0aGF0IGNhbGxzIF93cml0ZShjaHVuayxjYilcbi8vIGludGVybmFsbHksIGFuZCByZXR1cm5zIGZhbHNlIGlmIHRoZXJlJ3MgYSBsb3Qgb2YgcGVuZGluZyB3cml0ZXNcbi8vIGJ1ZmZlcmVkIHVwLiAgV2hlbiB5b3UgY2FsbCByZWFkKCksIHRoYXQgY2FsbHMgX3JlYWQobikgdW50aWxcbi8vIHRoZXJlJ3MgZW5vdWdoIHBlbmRpbmcgcmVhZGFibGUgZGF0YSBidWZmZXJlZCB1cC5cbi8vXG4vLyBJbiBhIHRyYW5zZm9ybSBzdHJlYW0sIHRoZSB3cml0dGVuIGRhdGEgaXMgcGxhY2VkIGluIGEgYnVmZmVyLiAgV2hlblxuLy8gX3JlYWQobikgaXMgY2FsbGVkLCBpdCB0cmFuc2Zvcm1zIHRoZSBxdWV1ZWQgdXAgZGF0YSwgY2FsbGluZyB0aGVcbi8vIGJ1ZmZlcmVkIF93cml0ZSBjYidzIGFzIGl0IGNvbnN1bWVzIGNodW5rcy4gIElmIGNvbnN1bWluZyBhIHNpbmdsZVxuLy8gd3JpdHRlbiBjaHVuayB3b3VsZCByZXN1bHQgaW4gbXVsdGlwbGUgb3V0cHV0IGNodW5rcywgdGhlbiB0aGUgZmlyc3Rcbi8vIG91dHB1dHRlZCBiaXQgY2FsbHMgdGhlIHJlYWRjYiwgYW5kIHN1YnNlcXVlbnQgY2h1bmtzIGp1c3QgZ28gaW50b1xuLy8gdGhlIHJlYWQgYnVmZmVyLCBhbmQgd2lsbCBjYXVzZSBpdCB0byBlbWl0ICdyZWFkYWJsZScgaWYgbmVjZXNzYXJ5LlxuLy9cbi8vIFRoaXMgd2F5LCBiYWNrLXByZXNzdXJlIGlzIGFjdHVhbGx5IGRldGVybWluZWQgYnkgdGhlIHJlYWRpbmcgc2lkZSxcbi8vIHNpbmNlIF9yZWFkIGhhcyB0byBiZSBjYWxsZWQgdG8gc3RhcnQgcHJvY2Vzc2luZyBhIG5ldyBjaHVuay4gIEhvd2V2ZXIsXG4vLyBhIHBhdGhvbG9naWNhbCBpbmZsYXRlIHR5cGUgb2YgdHJhbnNmb3JtIGNhbiBjYXVzZSBleGNlc3NpdmUgYnVmZmVyaW5nXG4vLyBoZXJlLiAgRm9yIGV4YW1wbGUsIGltYWdpbmUgYSBzdHJlYW0gd2hlcmUgZXZlcnkgYnl0ZSBvZiBpbnB1dCBpc1xuLy8gaW50ZXJwcmV0ZWQgYXMgYW4gaW50ZWdlciBmcm9tIDAtMjU1LCBhbmQgdGhlbiByZXN1bHRzIGluIHRoYXQgbWFueVxuLy8gYnl0ZXMgb2Ygb3V0cHV0LiAgV3JpdGluZyB0aGUgNCBieXRlcyB7ZmYsZmYsZmYsZmZ9IHdvdWxkIHJlc3VsdCBpblxuLy8gMWtiIG9mIGRhdGEgYmVpbmcgb3V0cHV0LiAgSW4gdGhpcyBjYXNlLCB5b3UgY291bGQgd3JpdGUgYSB2ZXJ5IHNtYWxsXG4vLyBhbW91bnQgb2YgaW5wdXQsIGFuZCBlbmQgdXAgd2l0aCBhIHZlcnkgbGFyZ2UgYW1vdW50IG9mIG91dHB1dC4gIEluXG4vLyBzdWNoIGEgcGF0aG9sb2dpY2FsIGluZmxhdGluZyBtZWNoYW5pc20sIHRoZXJlJ2QgYmUgbm8gd2F5IHRvIHRlbGxcbi8vIHRoZSBzeXN0ZW0gdG8gc3RvcCBkb2luZyB0aGUgdHJhbnNmb3JtLiAgQSBzaW5nbGUgNE1CIHdyaXRlIGNvdWxkXG4vLyBjYXVzZSB0aGUgc3lzdGVtIHRvIHJ1biBvdXQgb2YgbWVtb3J5LlxuLy9cbi8vIEhvd2V2ZXIsIGV2ZW4gaW4gc3VjaCBhIHBhdGhvbG9naWNhbCBjYXNlLCBvbmx5IGEgc2luZ2xlIHdyaXR0ZW4gY2h1bmtcbi8vIHdvdWxkIGJlIGNvbnN1bWVkLCBhbmQgdGhlbiB0aGUgcmVzdCB3b3VsZCB3YWl0ICh1bi10cmFuc2Zvcm1lZCkgdW50aWxcbi8vIHRoZSByZXN1bHRzIG9mIHRoZSBwcmV2aW91cyB0cmFuc2Zvcm1lZCBjaHVuayB3ZXJlIGNvbnN1bWVkLlxuXG4ndXNlIHN0cmljdCc7XG5cbm1vZHVsZS5leHBvcnRzID0gVHJhbnNmb3JtO1xuXG52YXIgRHVwbGV4ID0gcmVxdWlyZSgnLi9fc3RyZWFtX2R1cGxleCcpO1xuXG4vKjxyZXBsYWNlbWVudD4qL1xudmFyIHV0aWwgPSBPYmplY3QuY3JlYXRlKHJlcXVpcmUoJ2NvcmUtdXRpbC1pcycpKTtcbnV0aWwuaW5oZXJpdHMgPSByZXF1aXJlKCdpbmhlcml0cycpO1xuLyo8L3JlcGxhY2VtZW50PiovXG5cbnV0aWwuaW5oZXJpdHMoVHJhbnNmb3JtLCBEdXBsZXgpO1xuXG5mdW5jdGlvbiBhZnRlclRyYW5zZm9ybShlciwgZGF0YSkge1xuICB2YXIgdHMgPSB0aGlzLl90cmFuc2Zvcm1TdGF0ZTtcbiAgdHMudHJhbnNmb3JtaW5nID0gZmFsc2U7XG5cbiAgdmFyIGNiID0gdHMud3JpdGVjYjtcblxuICBpZiAoIWNiKSB7XG4gICAgcmV0dXJuIHRoaXMuZW1pdCgnZXJyb3InLCBuZXcgRXJyb3IoJ3dyaXRlIGNhbGxiYWNrIGNhbGxlZCBtdWx0aXBsZSB0aW1lcycpKTtcbiAgfVxuXG4gIHRzLndyaXRlY2h1bmsgPSBudWxsO1xuICB0cy53cml0ZWNiID0gbnVsbDtcblxuICBpZiAoZGF0YSAhPSBudWxsKSAvLyBzaW5nbGUgZXF1YWxzIGNoZWNrIGZvciBib3RoIGBudWxsYCBhbmQgYHVuZGVmaW5lZGBcbiAgICB0aGlzLnB1c2goZGF0YSk7XG5cbiAgY2IoZXIpO1xuXG4gIHZhciBycyA9IHRoaXMuX3JlYWRhYmxlU3RhdGU7XG4gIHJzLnJlYWRpbmcgPSBmYWxzZTtcbiAgaWYgKHJzLm5lZWRSZWFkYWJsZSB8fCBycy5sZW5ndGggPCBycy5oaWdoV2F0ZXJNYXJrKSB7XG4gICAgdGhpcy5fcmVhZChycy5oaWdoV2F0ZXJNYXJrKTtcbiAgfVxufVxuXG5mdW5jdGlvbiBUcmFuc2Zvcm0ob3B0aW9ucykge1xuICBpZiAoISh0aGlzIGluc3RhbmNlb2YgVHJhbnNmb3JtKSkgcmV0dXJuIG5ldyBUcmFuc2Zvcm0ob3B0aW9ucyk7XG5cbiAgRHVwbGV4LmNhbGwodGhpcywgb3B0aW9ucyk7XG5cbiAgdGhpcy5fdHJhbnNmb3JtU3RhdGUgPSB7XG4gICAgYWZ0ZXJUcmFuc2Zvcm06IGFmdGVyVHJhbnNmb3JtLmJpbmQodGhpcyksXG4gICAgbmVlZFRyYW5zZm9ybTogZmFsc2UsXG4gICAgdHJhbnNmb3JtaW5nOiBmYWxzZSxcbiAgICB3cml0ZWNiOiBudWxsLFxuICAgIHdyaXRlY2h1bms6IG51bGwsXG4gICAgd3JpdGVlbmNvZGluZzogbnVsbFxuICB9O1xuXG4gIC8vIHN0YXJ0IG91dCBhc2tpbmcgZm9yIGEgcmVhZGFibGUgZXZlbnQgb25jZSBkYXRhIGlzIHRyYW5zZm9ybWVkLlxuICB0aGlzLl9yZWFkYWJsZVN0YXRlLm5lZWRSZWFkYWJsZSA9IHRydWU7XG5cbiAgLy8gd2UgaGF2ZSBpbXBsZW1lbnRlZCB0aGUgX3JlYWQgbWV0aG9kLCBhbmQgZG9uZSB0aGUgb3RoZXIgdGhpbmdzXG4gIC8vIHRoYXQgUmVhZGFibGUgd2FudHMgYmVmb3JlIHRoZSBmaXJzdCBfcmVhZCBjYWxsLCBzbyB1bnNldCB0aGVcbiAgLy8gc3luYyBndWFyZCBmbGFnLlxuICB0aGlzLl9yZWFkYWJsZVN0YXRlLnN5bmMgPSBmYWxzZTtcblxuICBpZiAob3B0aW9ucykge1xuICAgIGlmICh0eXBlb2Ygb3B0aW9ucy50cmFuc2Zvcm0gPT09ICdmdW5jdGlvbicpIHRoaXMuX3RyYW5zZm9ybSA9IG9wdGlvbnMudHJhbnNmb3JtO1xuXG4gICAgaWYgKHR5cGVvZiBvcHRpb25zLmZsdXNoID09PSAnZnVuY3Rpb24nKSB0aGlzLl9mbHVzaCA9IG9wdGlvbnMuZmx1c2g7XG4gIH1cblxuICAvLyBXaGVuIHRoZSB3cml0YWJsZSBzaWRlIGZpbmlzaGVzLCB0aGVuIGZsdXNoIG91dCBhbnl0aGluZyByZW1haW5pbmcuXG4gIHRoaXMub24oJ3ByZWZpbmlzaCcsIHByZWZpbmlzaCk7XG59XG5cbmZ1bmN0aW9uIHByZWZpbmlzaCgpIHtcbiAgdmFyIF90aGlzID0gdGhpcztcblxuICBpZiAodHlwZW9mIHRoaXMuX2ZsdXNoID09PSAnZnVuY3Rpb24nKSB7XG4gICAgdGhpcy5fZmx1c2goZnVuY3Rpb24gKGVyLCBkYXRhKSB7XG4gICAgICBkb25lKF90aGlzLCBlciwgZGF0YSk7XG4gICAgfSk7XG4gIH0gZWxzZSB7XG4gICAgZG9uZSh0aGlzLCBudWxsLCBudWxsKTtcbiAgfVxufVxuXG5UcmFuc2Zvcm0ucHJvdG90eXBlLnB1c2ggPSBmdW5jdGlvbiAoY2h1bmssIGVuY29kaW5nKSB7XG4gIHRoaXMuX3RyYW5zZm9ybVN0YXRlLm5lZWRUcmFuc2Zvcm0gPSBmYWxzZTtcbiAgcmV0dXJuIER1cGxleC5wcm90b3R5cGUucHVzaC5jYWxsKHRoaXMsIGNodW5rLCBlbmNvZGluZyk7XG59O1xuXG4vLyBUaGlzIGlzIHRoZSBwYXJ0IHdoZXJlIHlvdSBkbyBzdHVmZiFcbi8vIG92ZXJyaWRlIHRoaXMgZnVuY3Rpb24gaW4gaW1wbGVtZW50YXRpb24gY2xhc3Nlcy5cbi8vICdjaHVuaycgaXMgYW4gaW5wdXQgY2h1bmsuXG4vL1xuLy8gQ2FsbCBgcHVzaChuZXdDaHVuaylgIHRvIHBhc3MgYWxvbmcgdHJhbnNmb3JtZWQgb3V0cHV0XG4vLyB0byB0aGUgcmVhZGFibGUgc2lkZS4gIFlvdSBtYXkgY2FsbCAncHVzaCcgemVybyBvciBtb3JlIHRpbWVzLlxuLy9cbi8vIENhbGwgYGNiKGVycilgIHdoZW4geW91IGFyZSBkb25lIHdpdGggdGhpcyBjaHVuay4gIElmIHlvdSBwYXNzXG4vLyBhbiBlcnJvciwgdGhlbiB0aGF0J2xsIHB1dCB0aGUgaHVydCBvbiB0aGUgd2hvbGUgb3BlcmF0aW9uLiAgSWYgeW91XG4vLyBuZXZlciBjYWxsIGNiKCksIHRoZW4geW91J2xsIG5ldmVyIGdldCBhbm90aGVyIGNodW5rLlxuVHJhbnNmb3JtLnByb3RvdHlwZS5fdHJhbnNmb3JtID0gZnVuY3Rpb24gKGNodW5rLCBlbmNvZGluZywgY2IpIHtcbiAgdGhyb3cgbmV3IEVycm9yKCdfdHJhbnNmb3JtKCkgaXMgbm90IGltcGxlbWVudGVkJyk7XG59O1xuXG5UcmFuc2Zvcm0ucHJvdG90eXBlLl93cml0ZSA9IGZ1bmN0aW9uIChjaHVuaywgZW5jb2RpbmcsIGNiKSB7XG4gIHZhciB0cyA9IHRoaXMuX3RyYW5zZm9ybVN0YXRlO1xuICB0cy53cml0ZWNiID0gY2I7XG4gIHRzLndyaXRlY2h1bmsgPSBjaHVuaztcbiAgdHMud3JpdGVlbmNvZGluZyA9IGVuY29kaW5nO1xuICBpZiAoIXRzLnRyYW5zZm9ybWluZykge1xuICAgIHZhciBycyA9IHRoaXMuX3JlYWRhYmxlU3RhdGU7XG4gICAgaWYgKHRzLm5lZWRUcmFuc2Zvcm0gfHwgcnMubmVlZFJlYWRhYmxlIHx8IHJzLmxlbmd0aCA8IHJzLmhpZ2hXYXRlck1hcmspIHRoaXMuX3JlYWQocnMuaGlnaFdhdGVyTWFyayk7XG4gIH1cbn07XG5cbi8vIERvZXNuJ3QgbWF0dGVyIHdoYXQgdGhlIGFyZ3MgYXJlIGhlcmUuXG4vLyBfdHJhbnNmb3JtIGRvZXMgYWxsIHRoZSB3b3JrLlxuLy8gVGhhdCB3ZSBnb3QgaGVyZSBtZWFucyB0aGF0IHRoZSByZWFkYWJsZSBzaWRlIHdhbnRzIG1vcmUgZGF0YS5cblRyYW5zZm9ybS5wcm90b3R5cGUuX3JlYWQgPSBmdW5jdGlvbiAobikge1xuICB2YXIgdHMgPSB0aGlzLl90cmFuc2Zvcm1TdGF0ZTtcblxuICBpZiAodHMud3JpdGVjaHVuayAhPT0gbnVsbCAmJiB0cy53cml0ZWNiICYmICF0cy50cmFuc2Zvcm1pbmcpIHtcbiAgICB0cy50cmFuc2Zvcm1pbmcgPSB0cnVlO1xuICAgIHRoaXMuX3RyYW5zZm9ybSh0cy53cml0ZWNodW5rLCB0cy53cml0ZWVuY29kaW5nLCB0cy5hZnRlclRyYW5zZm9ybSk7XG4gIH0gZWxzZSB7XG4gICAgLy8gbWFyayB0aGF0IHdlIG5lZWQgYSB0cmFuc2Zvcm0sIHNvIHRoYXQgYW55IGRhdGEgdGhhdCBjb21lcyBpblxuICAgIC8vIHdpbGwgZ2V0IHByb2Nlc3NlZCwgbm93IHRoYXQgd2UndmUgYXNrZWQgZm9yIGl0LlxuICAgIHRzLm5lZWRUcmFuc2Zvcm0gPSB0cnVlO1xuICB9XG59O1xuXG5UcmFuc2Zvcm0ucHJvdG90eXBlLl9kZXN0cm95ID0gZnVuY3Rpb24gKGVyciwgY2IpIHtcbiAgdmFyIF90aGlzMiA9IHRoaXM7XG5cbiAgRHVwbGV4LnByb3RvdHlwZS5fZGVzdHJveS5jYWxsKHRoaXMsIGVyciwgZnVuY3Rpb24gKGVycjIpIHtcbiAgICBjYihlcnIyKTtcbiAgICBfdGhpczIuZW1pdCgnY2xvc2UnKTtcbiAgfSk7XG59O1xuXG5mdW5jdGlvbiBkb25lKHN0cmVhbSwgZXIsIGRhdGEpIHtcbiAgaWYgKGVyKSByZXR1cm4gc3RyZWFtLmVtaXQoJ2Vycm9yJywgZXIpO1xuXG4gIGlmIChkYXRhICE9IG51bGwpIC8vIHNpbmdsZSBlcXVhbHMgY2hlY2sgZm9yIGJvdGggYG51bGxgIGFuZCBgdW5kZWZpbmVkYFxuICAgIHN0cmVhbS5wdXNoKGRhdGEpO1xuXG4gIC8vIGlmIHRoZXJlJ3Mgbm90aGluZyBpbiB0aGUgd3JpdGUgYnVmZmVyLCB0aGVuIHRoYXQgbWVhbnNcbiAgLy8gdGhhdCBub3RoaW5nIG1vcmUgd2lsbCBldmVyIGJlIHByb3ZpZGVkXG4gIGlmIChzdHJlYW0uX3dyaXRhYmxlU3RhdGUubGVuZ3RoKSB0aHJvdyBuZXcgRXJyb3IoJ0NhbGxpbmcgdHJhbnNmb3JtIGRvbmUgd2hlbiB3cy5sZW5ndGggIT0gMCcpO1xuXG4gIGlmIChzdHJlYW0uX3RyYW5zZm9ybVN0YXRlLnRyYW5zZm9ybWluZykgdGhyb3cgbmV3IEVycm9yKCdDYWxsaW5nIHRyYW5zZm9ybSBkb25lIHdoZW4gc3RpbGwgdHJhbnNmb3JtaW5nJyk7XG5cbiAgcmV0dXJuIHN0cmVhbS5wdXNoKG51bGwpO1xufSIsCiAgICAiLy8gQ29weXJpZ2h0IEpveWVudCwgSW5jLiBhbmQgb3RoZXIgTm9kZSBjb250cmlidXRvcnMuXG4vL1xuLy8gUGVybWlzc2lvbiBpcyBoZXJlYnkgZ3JhbnRlZCwgZnJlZSBvZiBjaGFyZ2UsIHRvIGFueSBwZXJzb24gb2J0YWluaW5nIGFcbi8vIGNvcHkgb2YgdGhpcyBzb2Z0d2FyZSBhbmQgYXNzb2NpYXRlZCBkb2N1bWVudGF0aW9uIGZpbGVzICh0aGVcbi8vIFwiU29mdHdhcmVcIiksIHRvIGRlYWwgaW4gdGhlIFNvZnR3YXJlIHdpdGhvdXQgcmVzdHJpY3Rpb24sIGluY2x1ZGluZ1xuLy8gd2l0aG91dCBsaW1pdGF0aW9uIHRoZSByaWdodHMgdG8gdXNlLCBjb3B5LCBtb2RpZnksIG1lcmdlLCBwdWJsaXNoLFxuLy8gZGlzdHJpYnV0ZSwgc3VibGljZW5zZSwgYW5kL29yIHNlbGwgY29waWVzIG9mIHRoZSBTb2Z0d2FyZSwgYW5kIHRvIHBlcm1pdFxuLy8gcGVyc29ucyB0byB3aG9tIHRoZSBTb2Z0d2FyZSBpcyBmdXJuaXNoZWQgdG8gZG8gc28sIHN1YmplY3QgdG8gdGhlXG4vLyBmb2xsb3dpbmcgY29uZGl0aW9uczpcbi8vXG4vLyBUaGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBzaGFsbCBiZSBpbmNsdWRlZFxuLy8gaW4gYWxsIGNvcGllcyBvciBzdWJzdGFudGlhbCBwb3J0aW9ucyBvZiB0aGUgU29mdHdhcmUuXG4vL1xuLy8gVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEIFwiQVMgSVNcIiwgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwgRVhQUkVTU1xuLy8gT1IgSU1QTElFRCwgSU5DTFVESU5HIEJVVCBOT1QgTElNSVRFRCBUTyBUSEUgV0FSUkFOVElFUyBPRlxuLy8gTUVSQ0hBTlRBQklMSVRZLCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBTkQgTk9OSU5GUklOR0VNRU5ULiBJTlxuLy8gTk8gRVZFTlQgU0hBTEwgVEhFIEFVVEhPUlMgT1IgQ09QWVJJR0hUIEhPTERFUlMgQkUgTElBQkxFIEZPUiBBTlkgQ0xBSU0sXG4vLyBEQU1BR0VTIE9SIE9USEVSIExJQUJJTElUWSwgV0hFVEhFUiBJTiBBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsIFRPUlQgT1Jcbi8vIE9USEVSV0lTRSwgQVJJU0lORyBGUk9NLCBPVVQgT0YgT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBTT0ZUV0FSRSBPUiBUSEVcbi8vIFVTRSBPUiBPVEhFUiBERUFMSU5HUyBJTiBUSEUgU09GVFdBUkUuXG5cbi8vIGEgcGFzc3Rocm91Z2ggc3RyZWFtLlxuLy8gYmFzaWNhbGx5IGp1c3QgdGhlIG1vc3QgbWluaW1hbCBzb3J0IG9mIFRyYW5zZm9ybSBzdHJlYW0uXG4vLyBFdmVyeSB3cml0dGVuIGNodW5rIGdldHMgb3V0cHV0IGFzLWlzLlxuXG4ndXNlIHN0cmljdCc7XG5cbm1vZHVsZS5leHBvcnRzID0gUGFzc1Rocm91Z2g7XG5cbnZhciBUcmFuc2Zvcm0gPSByZXF1aXJlKCcuL19zdHJlYW1fdHJhbnNmb3JtJyk7XG5cbi8qPHJlcGxhY2VtZW50PiovXG52YXIgdXRpbCA9IE9iamVjdC5jcmVhdGUocmVxdWlyZSgnY29yZS11dGlsLWlzJykpO1xudXRpbC5pbmhlcml0cyA9IHJlcXVpcmUoJ2luaGVyaXRzJyk7XG4vKjwvcmVwbGFjZW1lbnQ+Ki9cblxudXRpbC5pbmhlcml0cyhQYXNzVGhyb3VnaCwgVHJhbnNmb3JtKTtcblxuZnVuY3Rpb24gUGFzc1Rocm91Z2gob3B0aW9ucykge1xuICBpZiAoISh0aGlzIGluc3RhbmNlb2YgUGFzc1Rocm91Z2gpKSByZXR1cm4gbmV3IFBhc3NUaHJvdWdoKG9wdGlvbnMpO1xuXG4gIFRyYW5zZm9ybS5jYWxsKHRoaXMsIG9wdGlvbnMpO1xufVxuXG5QYXNzVGhyb3VnaC5wcm90b3R5cGUuX3RyYW5zZm9ybSA9IGZ1bmN0aW9uIChjaHVuaywgZW5jb2RpbmcsIGNiKSB7XG4gIGNiKG51bGwsIGNodW5rKTtcbn07IiwKICAgICJ2YXIgU3RyZWFtID0gcmVxdWlyZSgnc3RyZWFtJyk7XG5pZiAocHJvY2Vzcy5lbnYuUkVBREFCTEVfU1RSRUFNID09PSAnZGlzYWJsZScgJiYgU3RyZWFtKSB7XG4gIG1vZHVsZS5leHBvcnRzID0gU3RyZWFtO1xuICBleHBvcnRzID0gbW9kdWxlLmV4cG9ydHMgPSBTdHJlYW0uUmVhZGFibGU7XG4gIGV4cG9ydHMuUmVhZGFibGUgPSBTdHJlYW0uUmVhZGFibGU7XG4gIGV4cG9ydHMuV3JpdGFibGUgPSBTdHJlYW0uV3JpdGFibGU7XG4gIGV4cG9ydHMuRHVwbGV4ID0gU3RyZWFtLkR1cGxleDtcbiAgZXhwb3J0cy5UcmFuc2Zvcm0gPSBTdHJlYW0uVHJhbnNmb3JtO1xuICBleHBvcnRzLlBhc3NUaHJvdWdoID0gU3RyZWFtLlBhc3NUaHJvdWdoO1xuICBleHBvcnRzLlN0cmVhbSA9IFN0cmVhbTtcbn0gZWxzZSB7XG4gIGV4cG9ydHMgPSBtb2R1bGUuZXhwb3J0cyA9IHJlcXVpcmUoJy4vbGliL19zdHJlYW1fcmVhZGFibGUuanMnKTtcbiAgZXhwb3J0cy5TdHJlYW0gPSBTdHJlYW0gfHwgZXhwb3J0cztcbiAgZXhwb3J0cy5SZWFkYWJsZSA9IGV4cG9ydHM7XG4gIGV4cG9ydHMuV3JpdGFibGUgPSByZXF1aXJlKCcuL2xpYi9fc3RyZWFtX3dyaXRhYmxlLmpzJyk7XG4gIGV4cG9ydHMuRHVwbGV4ID0gcmVxdWlyZSgnLi9saWIvX3N0cmVhbV9kdXBsZXguanMnKTtcbiAgZXhwb3J0cy5UcmFuc2Zvcm0gPSByZXF1aXJlKCcuL2xpYi9fc3RyZWFtX3RyYW5zZm9ybS5qcycpO1xuICBleHBvcnRzLlBhc3NUaHJvdWdoID0gcmVxdWlyZSgnLi9saWIvX3N0cmVhbV9wYXNzdGhyb3VnaC5qcycpO1xufVxuIiwKICAgICJtb2R1bGUuZXhwb3J0cyA9IHJlcXVpcmUoJy4vcmVhZGFibGUnKS5QYXNzVGhyb3VnaFxuIiwKICAgICJ2YXIgdXRpbCA9IHJlcXVpcmUoJ3V0aWwnKTtcbnZhciBQYXNzVGhyb3VnaCA9IHJlcXVpcmUoJ3JlYWRhYmxlLXN0cmVhbS9wYXNzdGhyb3VnaCcpO1xuXG5tb2R1bGUuZXhwb3J0cyA9IHtcbiAgUmVhZGFibGU6IFJlYWRhYmxlLFxuICBXcml0YWJsZTogV3JpdGFibGVcbn07XG5cbnV0aWwuaW5oZXJpdHMoUmVhZGFibGUsIFBhc3NUaHJvdWdoKTtcbnV0aWwuaW5oZXJpdHMoV3JpdGFibGUsIFBhc3NUaHJvdWdoKTtcblxuLy8gUGF0Y2ggdGhlIGdpdmVuIG1ldGhvZCBvZiBpbnN0YW5jZSBzbyB0aGF0IHRoZSBjYWxsYmFja1xuLy8gaXMgZXhlY3V0ZWQgb25jZSwgYmVmb3JlIHRoZSBhY3R1YWwgbWV0aG9kIGlzIGNhbGxlZCB0aGVcbi8vIGZpcnN0IHRpbWUuXG5mdW5jdGlvbiBiZWZvcmVGaXJzdENhbGwoaW5zdGFuY2UsIG1ldGhvZCwgY2FsbGJhY2spIHtcbiAgaW5zdGFuY2VbbWV0aG9kXSA9IGZ1bmN0aW9uKCkge1xuICAgIGRlbGV0ZSBpbnN0YW5jZVttZXRob2RdO1xuICAgIGNhbGxiYWNrLmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7XG4gICAgcmV0dXJuIHRoaXNbbWV0aG9kXS5hcHBseSh0aGlzLCBhcmd1bWVudHMpO1xuICB9O1xufVxuXG5mdW5jdGlvbiBSZWFkYWJsZShmbiwgb3B0aW9ucykge1xuICBpZiAoISh0aGlzIGluc3RhbmNlb2YgUmVhZGFibGUpKVxuICAgIHJldHVybiBuZXcgUmVhZGFibGUoZm4sIG9wdGlvbnMpO1xuXG4gIFBhc3NUaHJvdWdoLmNhbGwodGhpcywgb3B0aW9ucyk7XG5cbiAgYmVmb3JlRmlyc3RDYWxsKHRoaXMsICdfcmVhZCcsIGZ1bmN0aW9uKCkge1xuICAgIHZhciBzb3VyY2UgPSBmbi5jYWxsKHRoaXMsIG9wdGlvbnMpO1xuICAgIHZhciBlbWl0ID0gdGhpcy5lbWl0LmJpbmQodGhpcywgJ2Vycm9yJyk7XG4gICAgc291cmNlLm9uKCdlcnJvcicsIGVtaXQpO1xuICAgIHNvdXJjZS5waXBlKHRoaXMpO1xuICB9KTtcblxuICB0aGlzLmVtaXQoJ3JlYWRhYmxlJyk7XG59XG5cbmZ1bmN0aW9uIFdyaXRhYmxlKGZuLCBvcHRpb25zKSB7XG4gIGlmICghKHRoaXMgaW5zdGFuY2VvZiBXcml0YWJsZSkpXG4gICAgcmV0dXJuIG5ldyBXcml0YWJsZShmbiwgb3B0aW9ucyk7XG5cbiAgUGFzc1Rocm91Z2guY2FsbCh0aGlzLCBvcHRpb25zKTtcblxuICBiZWZvcmVGaXJzdENhbGwodGhpcywgJ193cml0ZScsIGZ1bmN0aW9uKCkge1xuICAgIHZhciBkZXN0aW5hdGlvbiA9IGZuLmNhbGwodGhpcywgb3B0aW9ucyk7XG4gICAgdmFyIGVtaXQgPSB0aGlzLmVtaXQuYmluZCh0aGlzLCAnZXJyb3InKTtcbiAgICBkZXN0aW5hdGlvbi5vbignZXJyb3InLCBlbWl0KTtcbiAgICB0aGlzLnBpcGUoZGVzdGluYXRpb24pO1xuICB9KTtcblxuICB0aGlzLmVtaXQoJ3dyaXRhYmxlJyk7XG59XG5cbiIsCiAgICAiLyohXG4gKiBub3JtYWxpemUtcGF0aCA8aHR0cHM6Ly9naXRodWIuY29tL2pvbnNjaGxpbmtlcnQvbm9ybWFsaXplLXBhdGg+XG4gKlxuICogQ29weXJpZ2h0IChjKSAyMDE0LTIwMTgsIEpvbiBTY2hsaW5rZXJ0LlxuICogUmVsZWFzZWQgdW5kZXIgdGhlIE1JVCBMaWNlbnNlLlxuICovXG5cbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24ocGF0aCwgc3RyaXBUcmFpbGluZykge1xuICBpZiAodHlwZW9mIHBhdGggIT09ICdzdHJpbmcnKSB7XG4gICAgdGhyb3cgbmV3IFR5cGVFcnJvcignZXhwZWN0ZWQgcGF0aCB0byBiZSBhIHN0cmluZycpO1xuICB9XG5cbiAgaWYgKHBhdGggPT09ICdcXFxcJyB8fCBwYXRoID09PSAnLycpIHJldHVybiAnLyc7XG5cbiAgdmFyIGxlbiA9IHBhdGgubGVuZ3RoO1xuICBpZiAobGVuIDw9IDEpIHJldHVybiBwYXRoO1xuXG4gIC8vIGVuc3VyZSB0aGF0IHdpbjMyIG5hbWVzcGFjZXMgaGFzIHR3byBsZWFkaW5nIHNsYXNoZXMsIHNvIHRoYXQgdGhlIHBhdGggaXNcbiAgLy8gaGFuZGxlZCBwcm9wZXJseSBieSB0aGUgd2luMzIgdmVyc2lvbiBvZiBwYXRoLnBhcnNlKCkgYWZ0ZXIgYmVpbmcgbm9ybWFsaXplZFxuICAvLyBodHRwczovL21zZG4ubWljcm9zb2Z0LmNvbS9saWJyYXJ5L3dpbmRvd3MvZGVza3RvcC9hYTM2NTI0Nyh2PXZzLjg1KS5hc3B4I25hbWVzcGFjZXNcbiAgdmFyIHByZWZpeCA9ICcnO1xuICBpZiAobGVuID4gNCAmJiBwYXRoWzNdID09PSAnXFxcXCcpIHtcbiAgICB2YXIgY2ggPSBwYXRoWzJdO1xuICAgIGlmICgoY2ggPT09ICc/JyB8fCBjaCA9PT0gJy4nKSAmJiBwYXRoLnNsaWNlKDAsIDIpID09PSAnXFxcXFxcXFwnKSB7XG4gICAgICBwYXRoID0gcGF0aC5zbGljZSgyKTtcbiAgICAgIHByZWZpeCA9ICcvLyc7XG4gICAgfVxuICB9XG5cbiAgdmFyIHNlZ3MgPSBwYXRoLnNwbGl0KC9bL1xcXFxdKy8pO1xuICBpZiAoc3RyaXBUcmFpbGluZyAhPT0gZmFsc2UgJiYgc2Vnc1tzZWdzLmxlbmd0aCAtIDFdID09PSAnJykge1xuICAgIHNlZ3MucG9wKCk7XG4gIH1cbiAgcmV0dXJuIHByZWZpeCArIHNlZ3Muam9pbignLycpO1xufTtcbiIsCiAgICAiLyoqXG4gKiBUaGlzIG1ldGhvZCByZXR1cm5zIHRoZSBmaXJzdCBhcmd1bWVudCBpdCByZWNlaXZlcy5cbiAqXG4gKiBAc3RhdGljXG4gKiBAc2luY2UgMC4xLjBcbiAqIEBtZW1iZXJPZiBfXG4gKiBAY2F0ZWdvcnkgVXRpbFxuICogQHBhcmFtIHsqfSB2YWx1ZSBBbnkgdmFsdWUuXG4gKiBAcmV0dXJucyB7Kn0gUmV0dXJucyBgdmFsdWVgLlxuICogQGV4YW1wbGVcbiAqXG4gKiB2YXIgb2JqZWN0ID0geyAnYSc6IDEgfTtcbiAqXG4gKiBjb25zb2xlLmxvZyhfLmlkZW50aXR5KG9iamVjdCkgPT09IG9iamVjdCk7XG4gKiAvLyA9PiB0cnVlXG4gKi9cbmZ1bmN0aW9uIGlkZW50aXR5KHZhbHVlKSB7XG4gIHJldHVybiB2YWx1ZTtcbn1cblxubW9kdWxlLmV4cG9ydHMgPSBpZGVudGl0eTtcbiIsCiAgICAiLyoqXG4gKiBBIGZhc3RlciBhbHRlcm5hdGl2ZSB0byBgRnVuY3Rpb24jYXBwbHlgLCB0aGlzIGZ1bmN0aW9uIGludm9rZXMgYGZ1bmNgXG4gKiB3aXRoIHRoZSBgdGhpc2AgYmluZGluZyBvZiBgdGhpc0FyZ2AgYW5kIHRoZSBhcmd1bWVudHMgb2YgYGFyZ3NgLlxuICpcbiAqIEBwcml2YXRlXG4gKiBAcGFyYW0ge0Z1bmN0aW9ufSBmdW5jIFRoZSBmdW5jdGlvbiB0byBpbnZva2UuXG4gKiBAcGFyYW0geyp9IHRoaXNBcmcgVGhlIGB0aGlzYCBiaW5kaW5nIG9mIGBmdW5jYC5cbiAqIEBwYXJhbSB7QXJyYXl9IGFyZ3MgVGhlIGFyZ3VtZW50cyB0byBpbnZva2UgYGZ1bmNgIHdpdGguXG4gKiBAcmV0dXJucyB7Kn0gUmV0dXJucyB0aGUgcmVzdWx0IG9mIGBmdW5jYC5cbiAqL1xuZnVuY3Rpb24gYXBwbHkoZnVuYywgdGhpc0FyZywgYXJncykge1xuICBzd2l0Y2ggKGFyZ3MubGVuZ3RoKSB7XG4gICAgY2FzZSAwOiByZXR1cm4gZnVuYy5jYWxsKHRoaXNBcmcpO1xuICAgIGNhc2UgMTogcmV0dXJuIGZ1bmMuY2FsbCh0aGlzQXJnLCBhcmdzWzBdKTtcbiAgICBjYXNlIDI6IHJldHVybiBmdW5jLmNhbGwodGhpc0FyZywgYXJnc1swXSwgYXJnc1sxXSk7XG4gICAgY2FzZSAzOiByZXR1cm4gZnVuYy5jYWxsKHRoaXNBcmcsIGFyZ3NbMF0sIGFyZ3NbMV0sIGFyZ3NbMl0pO1xuICB9XG4gIHJldHVybiBmdW5jLmFwcGx5KHRoaXNBcmcsIGFyZ3MpO1xufVxuXG5tb2R1bGUuZXhwb3J0cyA9IGFwcGx5O1xuIiwKICAgICJ2YXIgYXBwbHkgPSByZXF1aXJlKCcuL19hcHBseScpO1xuXG4vKiBCdWlsdC1pbiBtZXRob2QgcmVmZXJlbmNlcyBmb3IgdGhvc2Ugd2l0aCB0aGUgc2FtZSBuYW1lIGFzIG90aGVyIGBsb2Rhc2hgIG1ldGhvZHMuICovXG52YXIgbmF0aXZlTWF4ID0gTWF0aC5tYXg7XG5cbi8qKlxuICogQSBzcGVjaWFsaXplZCB2ZXJzaW9uIG9mIGBiYXNlUmVzdGAgd2hpY2ggdHJhbnNmb3JtcyB0aGUgcmVzdCBhcnJheS5cbiAqXG4gKiBAcHJpdmF0ZVxuICogQHBhcmFtIHtGdW5jdGlvbn0gZnVuYyBUaGUgZnVuY3Rpb24gdG8gYXBwbHkgYSByZXN0IHBhcmFtZXRlciB0by5cbiAqIEBwYXJhbSB7bnVtYmVyfSBbc3RhcnQ9ZnVuYy5sZW5ndGgtMV0gVGhlIHN0YXJ0IHBvc2l0aW9uIG9mIHRoZSByZXN0IHBhcmFtZXRlci5cbiAqIEBwYXJhbSB7RnVuY3Rpb259IHRyYW5zZm9ybSBUaGUgcmVzdCBhcnJheSB0cmFuc2Zvcm0uXG4gKiBAcmV0dXJucyB7RnVuY3Rpb259IFJldHVybnMgdGhlIG5ldyBmdW5jdGlvbi5cbiAqL1xuZnVuY3Rpb24gb3ZlclJlc3QoZnVuYywgc3RhcnQsIHRyYW5zZm9ybSkge1xuICBzdGFydCA9IG5hdGl2ZU1heChzdGFydCA9PT0gdW5kZWZpbmVkID8gKGZ1bmMubGVuZ3RoIC0gMSkgOiBzdGFydCwgMCk7XG4gIHJldHVybiBmdW5jdGlvbigpIHtcbiAgICB2YXIgYXJncyA9IGFyZ3VtZW50cyxcbiAgICAgICAgaW5kZXggPSAtMSxcbiAgICAgICAgbGVuZ3RoID0gbmF0aXZlTWF4KGFyZ3MubGVuZ3RoIC0gc3RhcnQsIDApLFxuICAgICAgICBhcnJheSA9IEFycmF5KGxlbmd0aCk7XG5cbiAgICB3aGlsZSAoKytpbmRleCA8IGxlbmd0aCkge1xuICAgICAgYXJyYXlbaW5kZXhdID0gYXJnc1tzdGFydCArIGluZGV4XTtcbiAgICB9XG4gICAgaW5kZXggPSAtMTtcbiAgICB2YXIgb3RoZXJBcmdzID0gQXJyYXkoc3RhcnQgKyAxKTtcbiAgICB3aGlsZSAoKytpbmRleCA8IHN0YXJ0KSB7XG4gICAgICBvdGhlckFyZ3NbaW5kZXhdID0gYXJnc1tpbmRleF07XG4gICAgfVxuICAgIG90aGVyQXJnc1tzdGFydF0gPSB0cmFuc2Zvcm0oYXJyYXkpO1xuICAgIHJldHVybiBhcHBseShmdW5jLCB0aGlzLCBvdGhlckFyZ3MpO1xuICB9O1xufVxuXG5tb2R1bGUuZXhwb3J0cyA9IG92ZXJSZXN0O1xuIiwKICAgICIvKipcbiAqIENyZWF0ZXMgYSBmdW5jdGlvbiB0aGF0IHJldHVybnMgYHZhbHVlYC5cbiAqXG4gKiBAc3RhdGljXG4gKiBAbWVtYmVyT2YgX1xuICogQHNpbmNlIDIuNC4wXG4gKiBAY2F0ZWdvcnkgVXRpbFxuICogQHBhcmFtIHsqfSB2YWx1ZSBUaGUgdmFsdWUgdG8gcmV0dXJuIGZyb20gdGhlIG5ldyBmdW5jdGlvbi5cbiAqIEByZXR1cm5zIHtGdW5jdGlvbn0gUmV0dXJucyB0aGUgbmV3IGNvbnN0YW50IGZ1bmN0aW9uLlxuICogQGV4YW1wbGVcbiAqXG4gKiB2YXIgb2JqZWN0cyA9IF8udGltZXMoMiwgXy5jb25zdGFudCh7ICdhJzogMSB9KSk7XG4gKlxuICogY29uc29sZS5sb2cob2JqZWN0cyk7XG4gKiAvLyA9PiBbeyAnYSc6IDEgfSwgeyAnYSc6IDEgfV1cbiAqXG4gKiBjb25zb2xlLmxvZyhvYmplY3RzWzBdID09PSBvYmplY3RzWzFdKTtcbiAqIC8vID0+IHRydWVcbiAqL1xuZnVuY3Rpb24gY29uc3RhbnQodmFsdWUpIHtcbiAgcmV0dXJuIGZ1bmN0aW9uKCkge1xuICAgIHJldHVybiB2YWx1ZTtcbiAgfTtcbn1cblxubW9kdWxlLmV4cG9ydHMgPSBjb25zdGFudDtcbiIsCiAgICAiLyoqIERldGVjdCBmcmVlIHZhcmlhYmxlIGBnbG9iYWxgIGZyb20gTm9kZS5qcy4gKi9cbnZhciBmcmVlR2xvYmFsID0gdHlwZW9mIGdsb2JhbCA9PSAnb2JqZWN0JyAmJiBnbG9iYWwgJiYgZ2xvYmFsLk9iamVjdCA9PT0gT2JqZWN0ICYmIGdsb2JhbDtcblxubW9kdWxlLmV4cG9ydHMgPSBmcmVlR2xvYmFsO1xuIiwKICAgICJ2YXIgZnJlZUdsb2JhbCA9IHJlcXVpcmUoJy4vX2ZyZWVHbG9iYWwnKTtcblxuLyoqIERldGVjdCBmcmVlIHZhcmlhYmxlIGBzZWxmYC4gKi9cbnZhciBmcmVlU2VsZiA9IHR5cGVvZiBzZWxmID09ICdvYmplY3QnICYmIHNlbGYgJiYgc2VsZi5PYmplY3QgPT09IE9iamVjdCAmJiBzZWxmO1xuXG4vKiogVXNlZCBhcyBhIHJlZmVyZW5jZSB0byB0aGUgZ2xvYmFsIG9iamVjdC4gKi9cbnZhciByb290ID0gZnJlZUdsb2JhbCB8fCBmcmVlU2VsZiB8fCBGdW5jdGlvbigncmV0dXJuIHRoaXMnKSgpO1xuXG5tb2R1bGUuZXhwb3J0cyA9IHJvb3Q7XG4iLAogICAgInZhciByb290ID0gcmVxdWlyZSgnLi9fcm9vdCcpO1xuXG4vKiogQnVpbHQtaW4gdmFsdWUgcmVmZXJlbmNlcy4gKi9cbnZhciBTeW1ib2wgPSByb290LlN5bWJvbDtcblxubW9kdWxlLmV4cG9ydHMgPSBTeW1ib2w7XG4iLAogICAgInZhciBTeW1ib2wgPSByZXF1aXJlKCcuL19TeW1ib2wnKTtcblxuLyoqIFVzZWQgZm9yIGJ1aWx0LWluIG1ldGhvZCByZWZlcmVuY2VzLiAqL1xudmFyIG9iamVjdFByb3RvID0gT2JqZWN0LnByb3RvdHlwZTtcblxuLyoqIFVzZWQgdG8gY2hlY2sgb2JqZWN0cyBmb3Igb3duIHByb3BlcnRpZXMuICovXG52YXIgaGFzT3duUHJvcGVydHkgPSBvYmplY3RQcm90by5oYXNPd25Qcm9wZXJ0eTtcblxuLyoqXG4gKiBVc2VkIHRvIHJlc29sdmUgdGhlXG4gKiBbYHRvU3RyaW5nVGFnYF0oaHR0cDovL2VjbWEtaW50ZXJuYXRpb25hbC5vcmcvZWNtYS0yNjIvNy4wLyNzZWMtb2JqZWN0LnByb3RvdHlwZS50b3N0cmluZylcbiAqIG9mIHZhbHVlcy5cbiAqL1xudmFyIG5hdGl2ZU9iamVjdFRvU3RyaW5nID0gb2JqZWN0UHJvdG8udG9TdHJpbmc7XG5cbi8qKiBCdWlsdC1pbiB2YWx1ZSByZWZlcmVuY2VzLiAqL1xudmFyIHN5bVRvU3RyaW5nVGFnID0gU3ltYm9sID8gU3ltYm9sLnRvU3RyaW5nVGFnIDogdW5kZWZpbmVkO1xuXG4vKipcbiAqIEEgc3BlY2lhbGl6ZWQgdmVyc2lvbiBvZiBgYmFzZUdldFRhZ2Agd2hpY2ggaWdub3JlcyBgU3ltYm9sLnRvU3RyaW5nVGFnYCB2YWx1ZXMuXG4gKlxuICogQHByaXZhdGVcbiAqIEBwYXJhbSB7Kn0gdmFsdWUgVGhlIHZhbHVlIHRvIHF1ZXJ5LlxuICogQHJldHVybnMge3N0cmluZ30gUmV0dXJucyB0aGUgcmF3IGB0b1N0cmluZ1RhZ2AuXG4gKi9cbmZ1bmN0aW9uIGdldFJhd1RhZyh2YWx1ZSkge1xuICB2YXIgaXNPd24gPSBoYXNPd25Qcm9wZXJ0eS5jYWxsKHZhbHVlLCBzeW1Ub1N0cmluZ1RhZyksXG4gICAgICB0YWcgPSB2YWx1ZVtzeW1Ub1N0cmluZ1RhZ107XG5cbiAgdHJ5IHtcbiAgICB2YWx1ZVtzeW1Ub1N0cmluZ1RhZ10gPSB1bmRlZmluZWQ7XG4gICAgdmFyIHVubWFza2VkID0gdHJ1ZTtcbiAgfSBjYXRjaCAoZSkge31cblxuICB2YXIgcmVzdWx0ID0gbmF0aXZlT2JqZWN0VG9TdHJpbmcuY2FsbCh2YWx1ZSk7XG4gIGlmICh1bm1hc2tlZCkge1xuICAgIGlmIChpc093bikge1xuICAgICAgdmFsdWVbc3ltVG9TdHJpbmdUYWddID0gdGFnO1xuICAgIH0gZWxzZSB7XG4gICAgICBkZWxldGUgdmFsdWVbc3ltVG9TdHJpbmdUYWddO1xuICAgIH1cbiAgfVxuICByZXR1cm4gcmVzdWx0O1xufVxuXG5tb2R1bGUuZXhwb3J0cyA9IGdldFJhd1RhZztcbiIsCiAgICAiLyoqIFVzZWQgZm9yIGJ1aWx0LWluIG1ldGhvZCByZWZlcmVuY2VzLiAqL1xudmFyIG9iamVjdFByb3RvID0gT2JqZWN0LnByb3RvdHlwZTtcblxuLyoqXG4gKiBVc2VkIHRvIHJlc29sdmUgdGhlXG4gKiBbYHRvU3RyaW5nVGFnYF0oaHR0cDovL2VjbWEtaW50ZXJuYXRpb25hbC5vcmcvZWNtYS0yNjIvNy4wLyNzZWMtb2JqZWN0LnByb3RvdHlwZS50b3N0cmluZylcbiAqIG9mIHZhbHVlcy5cbiAqL1xudmFyIG5hdGl2ZU9iamVjdFRvU3RyaW5nID0gb2JqZWN0UHJvdG8udG9TdHJpbmc7XG5cbi8qKlxuICogQ29udmVydHMgYHZhbHVlYCB0byBhIHN0cmluZyB1c2luZyBgT2JqZWN0LnByb3RvdHlwZS50b1N0cmluZ2AuXG4gKlxuICogQHByaXZhdGVcbiAqIEBwYXJhbSB7Kn0gdmFsdWUgVGhlIHZhbHVlIHRvIGNvbnZlcnQuXG4gKiBAcmV0dXJucyB7c3RyaW5nfSBSZXR1cm5zIHRoZSBjb252ZXJ0ZWQgc3RyaW5nLlxuICovXG5mdW5jdGlvbiBvYmplY3RUb1N0cmluZyh2YWx1ZSkge1xuICByZXR1cm4gbmF0aXZlT2JqZWN0VG9TdHJpbmcuY2FsbCh2YWx1ZSk7XG59XG5cbm1vZHVsZS5leHBvcnRzID0gb2JqZWN0VG9TdHJpbmc7XG4iLAogICAgInZhciBTeW1ib2wgPSByZXF1aXJlKCcuL19TeW1ib2wnKSxcbiAgICBnZXRSYXdUYWcgPSByZXF1aXJlKCcuL19nZXRSYXdUYWcnKSxcbiAgICBvYmplY3RUb1N0cmluZyA9IHJlcXVpcmUoJy4vX29iamVjdFRvU3RyaW5nJyk7XG5cbi8qKiBgT2JqZWN0I3RvU3RyaW5nYCByZXN1bHQgcmVmZXJlbmNlcy4gKi9cbnZhciBudWxsVGFnID0gJ1tvYmplY3QgTnVsbF0nLFxuICAgIHVuZGVmaW5lZFRhZyA9ICdbb2JqZWN0IFVuZGVmaW5lZF0nO1xuXG4vKiogQnVpbHQtaW4gdmFsdWUgcmVmZXJlbmNlcy4gKi9cbnZhciBzeW1Ub1N0cmluZ1RhZyA9IFN5bWJvbCA/IFN5bWJvbC50b1N0cmluZ1RhZyA6IHVuZGVmaW5lZDtcblxuLyoqXG4gKiBUaGUgYmFzZSBpbXBsZW1lbnRhdGlvbiBvZiBgZ2V0VGFnYCB3aXRob3V0IGZhbGxiYWNrcyBmb3IgYnVnZ3kgZW52aXJvbm1lbnRzLlxuICpcbiAqIEBwcml2YXRlXG4gKiBAcGFyYW0geyp9IHZhbHVlIFRoZSB2YWx1ZSB0byBxdWVyeS5cbiAqIEByZXR1cm5zIHtzdHJpbmd9IFJldHVybnMgdGhlIGB0b1N0cmluZ1RhZ2AuXG4gKi9cbmZ1bmN0aW9uIGJhc2VHZXRUYWcodmFsdWUpIHtcbiAgaWYgKHZhbHVlID09IG51bGwpIHtcbiAgICByZXR1cm4gdmFsdWUgPT09IHVuZGVmaW5lZCA/IHVuZGVmaW5lZFRhZyA6IG51bGxUYWc7XG4gIH1cbiAgcmV0dXJuIChzeW1Ub1N0cmluZ1RhZyAmJiBzeW1Ub1N0cmluZ1RhZyBpbiBPYmplY3QodmFsdWUpKVxuICAgID8gZ2V0UmF3VGFnKHZhbHVlKVxuICAgIDogb2JqZWN0VG9TdHJpbmcodmFsdWUpO1xufVxuXG5tb2R1bGUuZXhwb3J0cyA9IGJhc2VHZXRUYWc7XG4iLAogICAgIi8qKlxuICogQ2hlY2tzIGlmIGB2YWx1ZWAgaXMgdGhlXG4gKiBbbGFuZ3VhZ2UgdHlwZV0oaHR0cDovL3d3dy5lY21hLWludGVybmF0aW9uYWwub3JnL2VjbWEtMjYyLzcuMC8jc2VjLWVjbWFzY3JpcHQtbGFuZ3VhZ2UtdHlwZXMpXG4gKiBvZiBgT2JqZWN0YC4gKGUuZy4gYXJyYXlzLCBmdW5jdGlvbnMsIG9iamVjdHMsIHJlZ2V4ZXMsIGBuZXcgTnVtYmVyKDApYCwgYW5kIGBuZXcgU3RyaW5nKCcnKWApXG4gKlxuICogQHN0YXRpY1xuICogQG1lbWJlck9mIF9cbiAqIEBzaW5jZSAwLjEuMFxuICogQGNhdGVnb3J5IExhbmdcbiAqIEBwYXJhbSB7Kn0gdmFsdWUgVGhlIHZhbHVlIHRvIGNoZWNrLlxuICogQHJldHVybnMge2Jvb2xlYW59IFJldHVybnMgYHRydWVgIGlmIGB2YWx1ZWAgaXMgYW4gb2JqZWN0LCBlbHNlIGBmYWxzZWAuXG4gKiBAZXhhbXBsZVxuICpcbiAqIF8uaXNPYmplY3Qoe30pO1xuICogLy8gPT4gdHJ1ZVxuICpcbiAqIF8uaXNPYmplY3QoWzEsIDIsIDNdKTtcbiAqIC8vID0+IHRydWVcbiAqXG4gKiBfLmlzT2JqZWN0KF8ubm9vcCk7XG4gKiAvLyA9PiB0cnVlXG4gKlxuICogXy5pc09iamVjdChudWxsKTtcbiAqIC8vID0+IGZhbHNlXG4gKi9cbmZ1bmN0aW9uIGlzT2JqZWN0KHZhbHVlKSB7XG4gIHZhciB0eXBlID0gdHlwZW9mIHZhbHVlO1xuICByZXR1cm4gdmFsdWUgIT0gbnVsbCAmJiAodHlwZSA9PSAnb2JqZWN0JyB8fCB0eXBlID09ICdmdW5jdGlvbicpO1xufVxuXG5tb2R1bGUuZXhwb3J0cyA9IGlzT2JqZWN0O1xuIiwKICAgICJ2YXIgYmFzZUdldFRhZyA9IHJlcXVpcmUoJy4vX2Jhc2VHZXRUYWcnKSxcbiAgICBpc09iamVjdCA9IHJlcXVpcmUoJy4vaXNPYmplY3QnKTtcblxuLyoqIGBPYmplY3QjdG9TdHJpbmdgIHJlc3VsdCByZWZlcmVuY2VzLiAqL1xudmFyIGFzeW5jVGFnID0gJ1tvYmplY3QgQXN5bmNGdW5jdGlvbl0nLFxuICAgIGZ1bmNUYWcgPSAnW29iamVjdCBGdW5jdGlvbl0nLFxuICAgIGdlblRhZyA9ICdbb2JqZWN0IEdlbmVyYXRvckZ1bmN0aW9uXScsXG4gICAgcHJveHlUYWcgPSAnW29iamVjdCBQcm94eV0nO1xuXG4vKipcbiAqIENoZWNrcyBpZiBgdmFsdWVgIGlzIGNsYXNzaWZpZWQgYXMgYSBgRnVuY3Rpb25gIG9iamVjdC5cbiAqXG4gKiBAc3RhdGljXG4gKiBAbWVtYmVyT2YgX1xuICogQHNpbmNlIDAuMS4wXG4gKiBAY2F0ZWdvcnkgTGFuZ1xuICogQHBhcmFtIHsqfSB2YWx1ZSBUaGUgdmFsdWUgdG8gY2hlY2suXG4gKiBAcmV0dXJucyB7Ym9vbGVhbn0gUmV0dXJucyBgdHJ1ZWAgaWYgYHZhbHVlYCBpcyBhIGZ1bmN0aW9uLCBlbHNlIGBmYWxzZWAuXG4gKiBAZXhhbXBsZVxuICpcbiAqIF8uaXNGdW5jdGlvbihfKTtcbiAqIC8vID0+IHRydWVcbiAqXG4gKiBfLmlzRnVuY3Rpb24oL2FiYy8pO1xuICogLy8gPT4gZmFsc2VcbiAqL1xuZnVuY3Rpb24gaXNGdW5jdGlvbih2YWx1ZSkge1xuICBpZiAoIWlzT2JqZWN0KHZhbHVlKSkge1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuICAvLyBUaGUgdXNlIG9mIGBPYmplY3QjdG9TdHJpbmdgIGF2b2lkcyBpc3N1ZXMgd2l0aCB0aGUgYHR5cGVvZmAgb3BlcmF0b3JcbiAgLy8gaW4gU2FmYXJpIDkgd2hpY2ggcmV0dXJucyAnb2JqZWN0JyBmb3IgdHlwZWQgYXJyYXlzIGFuZCBvdGhlciBjb25zdHJ1Y3RvcnMuXG4gIHZhciB0YWcgPSBiYXNlR2V0VGFnKHZhbHVlKTtcbiAgcmV0dXJuIHRhZyA9PSBmdW5jVGFnIHx8IHRhZyA9PSBnZW5UYWcgfHwgdGFnID09IGFzeW5jVGFnIHx8IHRhZyA9PSBwcm94eVRhZztcbn1cblxubW9kdWxlLmV4cG9ydHMgPSBpc0Z1bmN0aW9uO1xuIiwKICAgICJ2YXIgcm9vdCA9IHJlcXVpcmUoJy4vX3Jvb3QnKTtcblxuLyoqIFVzZWQgdG8gZGV0ZWN0IG92ZXJyZWFjaGluZyBjb3JlLWpzIHNoaW1zLiAqL1xudmFyIGNvcmVKc0RhdGEgPSByb290WydfX2NvcmUtanNfc2hhcmVkX18nXTtcblxubW9kdWxlLmV4cG9ydHMgPSBjb3JlSnNEYXRhO1xuIiwKICAgICJ2YXIgY29yZUpzRGF0YSA9IHJlcXVpcmUoJy4vX2NvcmVKc0RhdGEnKTtcblxuLyoqIFVzZWQgdG8gZGV0ZWN0IG1ldGhvZHMgbWFzcXVlcmFkaW5nIGFzIG5hdGl2ZS4gKi9cbnZhciBtYXNrU3JjS2V5ID0gKGZ1bmN0aW9uKCkge1xuICB2YXIgdWlkID0gL1teLl0rJC8uZXhlYyhjb3JlSnNEYXRhICYmIGNvcmVKc0RhdGEua2V5cyAmJiBjb3JlSnNEYXRhLmtleXMuSUVfUFJPVE8gfHwgJycpO1xuICByZXR1cm4gdWlkID8gKCdTeW1ib2woc3JjKV8xLicgKyB1aWQpIDogJyc7XG59KCkpO1xuXG4vKipcbiAqIENoZWNrcyBpZiBgZnVuY2AgaGFzIGl0cyBzb3VyY2UgbWFza2VkLlxuICpcbiAqIEBwcml2YXRlXG4gKiBAcGFyYW0ge0Z1bmN0aW9ufSBmdW5jIFRoZSBmdW5jdGlvbiB0byBjaGVjay5cbiAqIEByZXR1cm5zIHtib29sZWFufSBSZXR1cm5zIGB0cnVlYCBpZiBgZnVuY2AgaXMgbWFza2VkLCBlbHNlIGBmYWxzZWAuXG4gKi9cbmZ1bmN0aW9uIGlzTWFza2VkKGZ1bmMpIHtcbiAgcmV0dXJuICEhbWFza1NyY0tleSAmJiAobWFza1NyY0tleSBpbiBmdW5jKTtcbn1cblxubW9kdWxlLmV4cG9ydHMgPSBpc01hc2tlZDtcbiIsCiAgICAiLyoqIFVzZWQgZm9yIGJ1aWx0LWluIG1ldGhvZCByZWZlcmVuY2VzLiAqL1xudmFyIGZ1bmNQcm90byA9IEZ1bmN0aW9uLnByb3RvdHlwZTtcblxuLyoqIFVzZWQgdG8gcmVzb2x2ZSB0aGUgZGVjb21waWxlZCBzb3VyY2Ugb2YgZnVuY3Rpb25zLiAqL1xudmFyIGZ1bmNUb1N0cmluZyA9IGZ1bmNQcm90by50b1N0cmluZztcblxuLyoqXG4gKiBDb252ZXJ0cyBgZnVuY2AgdG8gaXRzIHNvdXJjZSBjb2RlLlxuICpcbiAqIEBwcml2YXRlXG4gKiBAcGFyYW0ge0Z1bmN0aW9ufSBmdW5jIFRoZSBmdW5jdGlvbiB0byBjb252ZXJ0LlxuICogQHJldHVybnMge3N0cmluZ30gUmV0dXJucyB0aGUgc291cmNlIGNvZGUuXG4gKi9cbmZ1bmN0aW9uIHRvU291cmNlKGZ1bmMpIHtcbiAgaWYgKGZ1bmMgIT0gbnVsbCkge1xuICAgIHRyeSB7XG4gICAgICByZXR1cm4gZnVuY1RvU3RyaW5nLmNhbGwoZnVuYyk7XG4gICAgfSBjYXRjaCAoZSkge31cbiAgICB0cnkge1xuICAgICAgcmV0dXJuIChmdW5jICsgJycpO1xuICAgIH0gY2F0Y2ggKGUpIHt9XG4gIH1cbiAgcmV0dXJuICcnO1xufVxuXG5tb2R1bGUuZXhwb3J0cyA9IHRvU291cmNlO1xuIiwKICAgICJ2YXIgaXNGdW5jdGlvbiA9IHJlcXVpcmUoJy4vaXNGdW5jdGlvbicpLFxuICAgIGlzTWFza2VkID0gcmVxdWlyZSgnLi9faXNNYXNrZWQnKSxcbiAgICBpc09iamVjdCA9IHJlcXVpcmUoJy4vaXNPYmplY3QnKSxcbiAgICB0b1NvdXJjZSA9IHJlcXVpcmUoJy4vX3RvU291cmNlJyk7XG5cbi8qKlxuICogVXNlZCB0byBtYXRjaCBgUmVnRXhwYFxuICogW3N5bnRheCBjaGFyYWN0ZXJzXShodHRwOi8vZWNtYS1pbnRlcm5hdGlvbmFsLm9yZy9lY21hLTI2Mi83LjAvI3NlYy1wYXR0ZXJucykuXG4gKi9cbnZhciByZVJlZ0V4cENoYXIgPSAvW1xcXFxeJC4qKz8oKVtcXF17fXxdL2c7XG5cbi8qKiBVc2VkIHRvIGRldGVjdCBob3N0IGNvbnN0cnVjdG9ycyAoU2FmYXJpKS4gKi9cbnZhciByZUlzSG9zdEN0b3IgPSAvXlxcW29iamVjdCAuKz9Db25zdHJ1Y3RvclxcXSQvO1xuXG4vKiogVXNlZCBmb3IgYnVpbHQtaW4gbWV0aG9kIHJlZmVyZW5jZXMuICovXG52YXIgZnVuY1Byb3RvID0gRnVuY3Rpb24ucHJvdG90eXBlLFxuICAgIG9iamVjdFByb3RvID0gT2JqZWN0LnByb3RvdHlwZTtcblxuLyoqIFVzZWQgdG8gcmVzb2x2ZSB0aGUgZGVjb21waWxlZCBzb3VyY2Ugb2YgZnVuY3Rpb25zLiAqL1xudmFyIGZ1bmNUb1N0cmluZyA9IGZ1bmNQcm90by50b1N0cmluZztcblxuLyoqIFVzZWQgdG8gY2hlY2sgb2JqZWN0cyBmb3Igb3duIHByb3BlcnRpZXMuICovXG52YXIgaGFzT3duUHJvcGVydHkgPSBvYmplY3RQcm90by5oYXNPd25Qcm9wZXJ0eTtcblxuLyoqIFVzZWQgdG8gZGV0ZWN0IGlmIGEgbWV0aG9kIGlzIG5hdGl2ZS4gKi9cbnZhciByZUlzTmF0aXZlID0gUmVnRXhwKCdeJyArXG4gIGZ1bmNUb1N0cmluZy5jYWxsKGhhc093blByb3BlcnR5KS5yZXBsYWNlKHJlUmVnRXhwQ2hhciwgJ1xcXFwkJicpXG4gIC5yZXBsYWNlKC9oYXNPd25Qcm9wZXJ0eXwoZnVuY3Rpb24pLio/KD89XFxcXFxcKCl8IGZvciAuKz8oPz1cXFxcXFxdKS9nLCAnJDEuKj8nKSArICckJ1xuKTtcblxuLyoqXG4gKiBUaGUgYmFzZSBpbXBsZW1lbnRhdGlvbiBvZiBgXy5pc05hdGl2ZWAgd2l0aG91dCBiYWQgc2hpbSBjaGVja3MuXG4gKlxuICogQHByaXZhdGVcbiAqIEBwYXJhbSB7Kn0gdmFsdWUgVGhlIHZhbHVlIHRvIGNoZWNrLlxuICogQHJldHVybnMge2Jvb2xlYW59IFJldHVybnMgYHRydWVgIGlmIGB2YWx1ZWAgaXMgYSBuYXRpdmUgZnVuY3Rpb24sXG4gKiAgZWxzZSBgZmFsc2VgLlxuICovXG5mdW5jdGlvbiBiYXNlSXNOYXRpdmUodmFsdWUpIHtcbiAgaWYgKCFpc09iamVjdCh2YWx1ZSkgfHwgaXNNYXNrZWQodmFsdWUpKSB7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG4gIHZhciBwYXR0ZXJuID0gaXNGdW5jdGlvbih2YWx1ZSkgPyByZUlzTmF0aXZlIDogcmVJc0hvc3RDdG9yO1xuICByZXR1cm4gcGF0dGVybi50ZXN0KHRvU291cmNlKHZhbHVlKSk7XG59XG5cbm1vZHVsZS5leHBvcnRzID0gYmFzZUlzTmF0aXZlO1xuIiwKICAgICIvKipcbiAqIEdldHMgdGhlIHZhbHVlIGF0IGBrZXlgIG9mIGBvYmplY3RgLlxuICpcbiAqIEBwcml2YXRlXG4gKiBAcGFyYW0ge09iamVjdH0gW29iamVjdF0gVGhlIG9iamVjdCB0byBxdWVyeS5cbiAqIEBwYXJhbSB7c3RyaW5nfSBrZXkgVGhlIGtleSBvZiB0aGUgcHJvcGVydHkgdG8gZ2V0LlxuICogQHJldHVybnMgeyp9IFJldHVybnMgdGhlIHByb3BlcnR5IHZhbHVlLlxuICovXG5mdW5jdGlvbiBnZXRWYWx1ZShvYmplY3QsIGtleSkge1xuICByZXR1cm4gb2JqZWN0ID09IG51bGwgPyB1bmRlZmluZWQgOiBvYmplY3Rba2V5XTtcbn1cblxubW9kdWxlLmV4cG9ydHMgPSBnZXRWYWx1ZTtcbiIsCiAgICAidmFyIGJhc2VJc05hdGl2ZSA9IHJlcXVpcmUoJy4vX2Jhc2VJc05hdGl2ZScpLFxuICAgIGdldFZhbHVlID0gcmVxdWlyZSgnLi9fZ2V0VmFsdWUnKTtcblxuLyoqXG4gKiBHZXRzIHRoZSBuYXRpdmUgZnVuY3Rpb24gYXQgYGtleWAgb2YgYG9iamVjdGAuXG4gKlxuICogQHByaXZhdGVcbiAqIEBwYXJhbSB7T2JqZWN0fSBvYmplY3QgVGhlIG9iamVjdCB0byBxdWVyeS5cbiAqIEBwYXJhbSB7c3RyaW5nfSBrZXkgVGhlIGtleSBvZiB0aGUgbWV0aG9kIHRvIGdldC5cbiAqIEByZXR1cm5zIHsqfSBSZXR1cm5zIHRoZSBmdW5jdGlvbiBpZiBpdCdzIG5hdGl2ZSwgZWxzZSBgdW5kZWZpbmVkYC5cbiAqL1xuZnVuY3Rpb24gZ2V0TmF0aXZlKG9iamVjdCwga2V5KSB7XG4gIHZhciB2YWx1ZSA9IGdldFZhbHVlKG9iamVjdCwga2V5KTtcbiAgcmV0dXJuIGJhc2VJc05hdGl2ZSh2YWx1ZSkgPyB2YWx1ZSA6IHVuZGVmaW5lZDtcbn1cblxubW9kdWxlLmV4cG9ydHMgPSBnZXROYXRpdmU7XG4iLAogICAgInZhciBnZXROYXRpdmUgPSByZXF1aXJlKCcuL19nZXROYXRpdmUnKTtcblxudmFyIGRlZmluZVByb3BlcnR5ID0gKGZ1bmN0aW9uKCkge1xuICB0cnkge1xuICAgIHZhciBmdW5jID0gZ2V0TmF0aXZlKE9iamVjdCwgJ2RlZmluZVByb3BlcnR5Jyk7XG4gICAgZnVuYyh7fSwgJycsIHt9KTtcbiAgICByZXR1cm4gZnVuYztcbiAgfSBjYXRjaCAoZSkge31cbn0oKSk7XG5cbm1vZHVsZS5leHBvcnRzID0gZGVmaW5lUHJvcGVydHk7XG4iLAogICAgInZhciBjb25zdGFudCA9IHJlcXVpcmUoJy4vY29uc3RhbnQnKSxcbiAgICBkZWZpbmVQcm9wZXJ0eSA9IHJlcXVpcmUoJy4vX2RlZmluZVByb3BlcnR5JyksXG4gICAgaWRlbnRpdHkgPSByZXF1aXJlKCcuL2lkZW50aXR5Jyk7XG5cbi8qKlxuICogVGhlIGJhc2UgaW1wbGVtZW50YXRpb24gb2YgYHNldFRvU3RyaW5nYCB3aXRob3V0IHN1cHBvcnQgZm9yIGhvdCBsb29wIHNob3J0aW5nLlxuICpcbiAqIEBwcml2YXRlXG4gKiBAcGFyYW0ge0Z1bmN0aW9ufSBmdW5jIFRoZSBmdW5jdGlvbiB0byBtb2RpZnkuXG4gKiBAcGFyYW0ge0Z1bmN0aW9ufSBzdHJpbmcgVGhlIGB0b1N0cmluZ2AgcmVzdWx0LlxuICogQHJldHVybnMge0Z1bmN0aW9ufSBSZXR1cm5zIGBmdW5jYC5cbiAqL1xudmFyIGJhc2VTZXRUb1N0cmluZyA9ICFkZWZpbmVQcm9wZXJ0eSA/IGlkZW50aXR5IDogZnVuY3Rpb24oZnVuYywgc3RyaW5nKSB7XG4gIHJldHVybiBkZWZpbmVQcm9wZXJ0eShmdW5jLCAndG9TdHJpbmcnLCB7XG4gICAgJ2NvbmZpZ3VyYWJsZSc6IHRydWUsXG4gICAgJ2VudW1lcmFibGUnOiBmYWxzZSxcbiAgICAndmFsdWUnOiBjb25zdGFudChzdHJpbmcpLFxuICAgICd3cml0YWJsZSc6IHRydWVcbiAgfSk7XG59O1xuXG5tb2R1bGUuZXhwb3J0cyA9IGJhc2VTZXRUb1N0cmluZztcbiIsCiAgICAiLyoqIFVzZWQgdG8gZGV0ZWN0IGhvdCBmdW5jdGlvbnMgYnkgbnVtYmVyIG9mIGNhbGxzIHdpdGhpbiBhIHNwYW4gb2YgbWlsbGlzZWNvbmRzLiAqL1xudmFyIEhPVF9DT1VOVCA9IDgwMCxcbiAgICBIT1RfU1BBTiA9IDE2O1xuXG4vKiBCdWlsdC1pbiBtZXRob2QgcmVmZXJlbmNlcyBmb3IgdGhvc2Ugd2l0aCB0aGUgc2FtZSBuYW1lIGFzIG90aGVyIGBsb2Rhc2hgIG1ldGhvZHMuICovXG52YXIgbmF0aXZlTm93ID0gRGF0ZS5ub3c7XG5cbi8qKlxuICogQ3JlYXRlcyBhIGZ1bmN0aW9uIHRoYXQnbGwgc2hvcnQgb3V0IGFuZCBpbnZva2UgYGlkZW50aXR5YCBpbnN0ZWFkXG4gKiBvZiBgZnVuY2Agd2hlbiBpdCdzIGNhbGxlZCBgSE9UX0NPVU5UYCBvciBtb3JlIHRpbWVzIGluIGBIT1RfU1BBTmBcbiAqIG1pbGxpc2Vjb25kcy5cbiAqXG4gKiBAcHJpdmF0ZVxuICogQHBhcmFtIHtGdW5jdGlvbn0gZnVuYyBUaGUgZnVuY3Rpb24gdG8gcmVzdHJpY3QuXG4gKiBAcmV0dXJucyB7RnVuY3Rpb259IFJldHVybnMgdGhlIG5ldyBzaG9ydGFibGUgZnVuY3Rpb24uXG4gKi9cbmZ1bmN0aW9uIHNob3J0T3V0KGZ1bmMpIHtcbiAgdmFyIGNvdW50ID0gMCxcbiAgICAgIGxhc3RDYWxsZWQgPSAwO1xuXG4gIHJldHVybiBmdW5jdGlvbigpIHtcbiAgICB2YXIgc3RhbXAgPSBuYXRpdmVOb3coKSxcbiAgICAgICAgcmVtYWluaW5nID0gSE9UX1NQQU4gLSAoc3RhbXAgLSBsYXN0Q2FsbGVkKTtcblxuICAgIGxhc3RDYWxsZWQgPSBzdGFtcDtcbiAgICBpZiAocmVtYWluaW5nID4gMCkge1xuICAgICAgaWYgKCsrY291bnQgPj0gSE9UX0NPVU5UKSB7XG4gICAgICAgIHJldHVybiBhcmd1bWVudHNbMF07XG4gICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgIGNvdW50ID0gMDtcbiAgICB9XG4gICAgcmV0dXJuIGZ1bmMuYXBwbHkodW5kZWZpbmVkLCBhcmd1bWVudHMpO1xuICB9O1xufVxuXG5tb2R1bGUuZXhwb3J0cyA9IHNob3J0T3V0O1xuIiwKICAgICJ2YXIgYmFzZVNldFRvU3RyaW5nID0gcmVxdWlyZSgnLi9fYmFzZVNldFRvU3RyaW5nJyksXG4gICAgc2hvcnRPdXQgPSByZXF1aXJlKCcuL19zaG9ydE91dCcpO1xuXG4vKipcbiAqIFNldHMgdGhlIGB0b1N0cmluZ2AgbWV0aG9kIG9mIGBmdW5jYCB0byByZXR1cm4gYHN0cmluZ2AuXG4gKlxuICogQHByaXZhdGVcbiAqIEBwYXJhbSB7RnVuY3Rpb259IGZ1bmMgVGhlIGZ1bmN0aW9uIHRvIG1vZGlmeS5cbiAqIEBwYXJhbSB7RnVuY3Rpb259IHN0cmluZyBUaGUgYHRvU3RyaW5nYCByZXN1bHQuXG4gKiBAcmV0dXJucyB7RnVuY3Rpb259IFJldHVybnMgYGZ1bmNgLlxuICovXG52YXIgc2V0VG9TdHJpbmcgPSBzaG9ydE91dChiYXNlU2V0VG9TdHJpbmcpO1xuXG5tb2R1bGUuZXhwb3J0cyA9IHNldFRvU3RyaW5nO1xuIiwKICAgICJ2YXIgaWRlbnRpdHkgPSByZXF1aXJlKCcuL2lkZW50aXR5JyksXG4gICAgb3ZlclJlc3QgPSByZXF1aXJlKCcuL19vdmVyUmVzdCcpLFxuICAgIHNldFRvU3RyaW5nID0gcmVxdWlyZSgnLi9fc2V0VG9TdHJpbmcnKTtcblxuLyoqXG4gKiBUaGUgYmFzZSBpbXBsZW1lbnRhdGlvbiBvZiBgXy5yZXN0YCB3aGljaCBkb2Vzbid0IHZhbGlkYXRlIG9yIGNvZXJjZSBhcmd1bWVudHMuXG4gKlxuICogQHByaXZhdGVcbiAqIEBwYXJhbSB7RnVuY3Rpb259IGZ1bmMgVGhlIGZ1bmN0aW9uIHRvIGFwcGx5IGEgcmVzdCBwYXJhbWV0ZXIgdG8uXG4gKiBAcGFyYW0ge251bWJlcn0gW3N0YXJ0PWZ1bmMubGVuZ3RoLTFdIFRoZSBzdGFydCBwb3NpdGlvbiBvZiB0aGUgcmVzdCBwYXJhbWV0ZXIuXG4gKiBAcmV0dXJucyB7RnVuY3Rpb259IFJldHVybnMgdGhlIG5ldyBmdW5jdGlvbi5cbiAqL1xuZnVuY3Rpb24gYmFzZVJlc3QoZnVuYywgc3RhcnQpIHtcbiAgcmV0dXJuIHNldFRvU3RyaW5nKG92ZXJSZXN0KGZ1bmMsIHN0YXJ0LCBpZGVudGl0eSksIGZ1bmMgKyAnJyk7XG59XG5cbm1vZHVsZS5leHBvcnRzID0gYmFzZVJlc3Q7XG4iLAogICAgIi8qKlxuICogUGVyZm9ybXMgYVxuICogW2BTYW1lVmFsdWVaZXJvYF0oaHR0cDovL2VjbWEtaW50ZXJuYXRpb25hbC5vcmcvZWNtYS0yNjIvNy4wLyNzZWMtc2FtZXZhbHVlemVybylcbiAqIGNvbXBhcmlzb24gYmV0d2VlbiB0d28gdmFsdWVzIHRvIGRldGVybWluZSBpZiB0aGV5IGFyZSBlcXVpdmFsZW50LlxuICpcbiAqIEBzdGF0aWNcbiAqIEBtZW1iZXJPZiBfXG4gKiBAc2luY2UgNC4wLjBcbiAqIEBjYXRlZ29yeSBMYW5nXG4gKiBAcGFyYW0geyp9IHZhbHVlIFRoZSB2YWx1ZSB0byBjb21wYXJlLlxuICogQHBhcmFtIHsqfSBvdGhlciBUaGUgb3RoZXIgdmFsdWUgdG8gY29tcGFyZS5cbiAqIEByZXR1cm5zIHtib29sZWFufSBSZXR1cm5zIGB0cnVlYCBpZiB0aGUgdmFsdWVzIGFyZSBlcXVpdmFsZW50LCBlbHNlIGBmYWxzZWAuXG4gKiBAZXhhbXBsZVxuICpcbiAqIHZhciBvYmplY3QgPSB7ICdhJzogMSB9O1xuICogdmFyIG90aGVyID0geyAnYSc6IDEgfTtcbiAqXG4gKiBfLmVxKG9iamVjdCwgb2JqZWN0KTtcbiAqIC8vID0+IHRydWVcbiAqXG4gKiBfLmVxKG9iamVjdCwgb3RoZXIpO1xuICogLy8gPT4gZmFsc2VcbiAqXG4gKiBfLmVxKCdhJywgJ2EnKTtcbiAqIC8vID0+IHRydWVcbiAqXG4gKiBfLmVxKCdhJywgT2JqZWN0KCdhJykpO1xuICogLy8gPT4gZmFsc2VcbiAqXG4gKiBfLmVxKE5hTiwgTmFOKTtcbiAqIC8vID0+IHRydWVcbiAqL1xuZnVuY3Rpb24gZXEodmFsdWUsIG90aGVyKSB7XG4gIHJldHVybiB2YWx1ZSA9PT0gb3RoZXIgfHwgKHZhbHVlICE9PSB2YWx1ZSAmJiBvdGhlciAhPT0gb3RoZXIpO1xufVxuXG5tb2R1bGUuZXhwb3J0cyA9IGVxO1xuIiwKICAgICIvKiogVXNlZCBhcyByZWZlcmVuY2VzIGZvciB2YXJpb3VzIGBOdW1iZXJgIGNvbnN0YW50cy4gKi9cbnZhciBNQVhfU0FGRV9JTlRFR0VSID0gOTAwNzE5OTI1NDc0MDk5MTtcblxuLyoqXG4gKiBDaGVja3MgaWYgYHZhbHVlYCBpcyBhIHZhbGlkIGFycmF5LWxpa2UgbGVuZ3RoLlxuICpcbiAqICoqTm90ZToqKiBUaGlzIG1ldGhvZCBpcyBsb29zZWx5IGJhc2VkIG9uXG4gKiBbYFRvTGVuZ3RoYF0oaHR0cDovL2VjbWEtaW50ZXJuYXRpb25hbC5vcmcvZWNtYS0yNjIvNy4wLyNzZWMtdG9sZW5ndGgpLlxuICpcbiAqIEBzdGF0aWNcbiAqIEBtZW1iZXJPZiBfXG4gKiBAc2luY2UgNC4wLjBcbiAqIEBjYXRlZ29yeSBMYW5nXG4gKiBAcGFyYW0geyp9IHZhbHVlIFRoZSB2YWx1ZSB0byBjaGVjay5cbiAqIEByZXR1cm5zIHtib29sZWFufSBSZXR1cm5zIGB0cnVlYCBpZiBgdmFsdWVgIGlzIGEgdmFsaWQgbGVuZ3RoLCBlbHNlIGBmYWxzZWAuXG4gKiBAZXhhbXBsZVxuICpcbiAqIF8uaXNMZW5ndGgoMyk7XG4gKiAvLyA9PiB0cnVlXG4gKlxuICogXy5pc0xlbmd0aChOdW1iZXIuTUlOX1ZBTFVFKTtcbiAqIC8vID0+IGZhbHNlXG4gKlxuICogXy5pc0xlbmd0aChJbmZpbml0eSk7XG4gKiAvLyA9PiBmYWxzZVxuICpcbiAqIF8uaXNMZW5ndGgoJzMnKTtcbiAqIC8vID0+IGZhbHNlXG4gKi9cbmZ1bmN0aW9uIGlzTGVuZ3RoKHZhbHVlKSB7XG4gIHJldHVybiB0eXBlb2YgdmFsdWUgPT0gJ251bWJlcicgJiZcbiAgICB2YWx1ZSA+IC0xICYmIHZhbHVlICUgMSA9PSAwICYmIHZhbHVlIDw9IE1BWF9TQUZFX0lOVEVHRVI7XG59XG5cbm1vZHVsZS5leHBvcnRzID0gaXNMZW5ndGg7XG4iLAogICAgInZhciBpc0Z1bmN0aW9uID0gcmVxdWlyZSgnLi9pc0Z1bmN0aW9uJyksXG4gICAgaXNMZW5ndGggPSByZXF1aXJlKCcuL2lzTGVuZ3RoJyk7XG5cbi8qKlxuICogQ2hlY2tzIGlmIGB2YWx1ZWAgaXMgYXJyYXktbGlrZS4gQSB2YWx1ZSBpcyBjb25zaWRlcmVkIGFycmF5LWxpa2UgaWYgaXQnc1xuICogbm90IGEgZnVuY3Rpb24gYW5kIGhhcyBhIGB2YWx1ZS5sZW5ndGhgIHRoYXQncyBhbiBpbnRlZ2VyIGdyZWF0ZXIgdGhhbiBvclxuICogZXF1YWwgdG8gYDBgIGFuZCBsZXNzIHRoYW4gb3IgZXF1YWwgdG8gYE51bWJlci5NQVhfU0FGRV9JTlRFR0VSYC5cbiAqXG4gKiBAc3RhdGljXG4gKiBAbWVtYmVyT2YgX1xuICogQHNpbmNlIDQuMC4wXG4gKiBAY2F0ZWdvcnkgTGFuZ1xuICogQHBhcmFtIHsqfSB2YWx1ZSBUaGUgdmFsdWUgdG8gY2hlY2suXG4gKiBAcmV0dXJucyB7Ym9vbGVhbn0gUmV0dXJucyBgdHJ1ZWAgaWYgYHZhbHVlYCBpcyBhcnJheS1saWtlLCBlbHNlIGBmYWxzZWAuXG4gKiBAZXhhbXBsZVxuICpcbiAqIF8uaXNBcnJheUxpa2UoWzEsIDIsIDNdKTtcbiAqIC8vID0+IHRydWVcbiAqXG4gKiBfLmlzQXJyYXlMaWtlKGRvY3VtZW50LmJvZHkuY2hpbGRyZW4pO1xuICogLy8gPT4gdHJ1ZVxuICpcbiAqIF8uaXNBcnJheUxpa2UoJ2FiYycpO1xuICogLy8gPT4gdHJ1ZVxuICpcbiAqIF8uaXNBcnJheUxpa2UoXy5ub29wKTtcbiAqIC8vID0+IGZhbHNlXG4gKi9cbmZ1bmN0aW9uIGlzQXJyYXlMaWtlKHZhbHVlKSB7XG4gIHJldHVybiB2YWx1ZSAhPSBudWxsICYmIGlzTGVuZ3RoKHZhbHVlLmxlbmd0aCkgJiYgIWlzRnVuY3Rpb24odmFsdWUpO1xufVxuXG5tb2R1bGUuZXhwb3J0cyA9IGlzQXJyYXlMaWtlO1xuIiwKICAgICIvKiogVXNlZCBhcyByZWZlcmVuY2VzIGZvciB2YXJpb3VzIGBOdW1iZXJgIGNvbnN0YW50cy4gKi9cbnZhciBNQVhfU0FGRV9JTlRFR0VSID0gOTAwNzE5OTI1NDc0MDk5MTtcblxuLyoqIFVzZWQgdG8gZGV0ZWN0IHVuc2lnbmVkIGludGVnZXIgdmFsdWVzLiAqL1xudmFyIHJlSXNVaW50ID0gL14oPzowfFsxLTldXFxkKikkLztcblxuLyoqXG4gKiBDaGVja3MgaWYgYHZhbHVlYCBpcyBhIHZhbGlkIGFycmF5LWxpa2UgaW5kZXguXG4gKlxuICogQHByaXZhdGVcbiAqIEBwYXJhbSB7Kn0gdmFsdWUgVGhlIHZhbHVlIHRvIGNoZWNrLlxuICogQHBhcmFtIHtudW1iZXJ9IFtsZW5ndGg9TUFYX1NBRkVfSU5URUdFUl0gVGhlIHVwcGVyIGJvdW5kcyBvZiBhIHZhbGlkIGluZGV4LlxuICogQHJldHVybnMge2Jvb2xlYW59IFJldHVybnMgYHRydWVgIGlmIGB2YWx1ZWAgaXMgYSB2YWxpZCBpbmRleCwgZWxzZSBgZmFsc2VgLlxuICovXG5mdW5jdGlvbiBpc0luZGV4KHZhbHVlLCBsZW5ndGgpIHtcbiAgdmFyIHR5cGUgPSB0eXBlb2YgdmFsdWU7XG4gIGxlbmd0aCA9IGxlbmd0aCA9PSBudWxsID8gTUFYX1NBRkVfSU5URUdFUiA6IGxlbmd0aDtcblxuICByZXR1cm4gISFsZW5ndGggJiZcbiAgICAodHlwZSA9PSAnbnVtYmVyJyB8fFxuICAgICAgKHR5cGUgIT0gJ3N5bWJvbCcgJiYgcmVJc1VpbnQudGVzdCh2YWx1ZSkpKSAmJlxuICAgICAgICAodmFsdWUgPiAtMSAmJiB2YWx1ZSAlIDEgPT0gMCAmJiB2YWx1ZSA8IGxlbmd0aCk7XG59XG5cbm1vZHVsZS5leHBvcnRzID0gaXNJbmRleDtcbiIsCiAgICAidmFyIGVxID0gcmVxdWlyZSgnLi9lcScpLFxuICAgIGlzQXJyYXlMaWtlID0gcmVxdWlyZSgnLi9pc0FycmF5TGlrZScpLFxuICAgIGlzSW5kZXggPSByZXF1aXJlKCcuL19pc0luZGV4JyksXG4gICAgaXNPYmplY3QgPSByZXF1aXJlKCcuL2lzT2JqZWN0Jyk7XG5cbi8qKlxuICogQ2hlY2tzIGlmIHRoZSBnaXZlbiBhcmd1bWVudHMgYXJlIGZyb20gYW4gaXRlcmF0ZWUgY2FsbC5cbiAqXG4gKiBAcHJpdmF0ZVxuICogQHBhcmFtIHsqfSB2YWx1ZSBUaGUgcG90ZW50aWFsIGl0ZXJhdGVlIHZhbHVlIGFyZ3VtZW50LlxuICogQHBhcmFtIHsqfSBpbmRleCBUaGUgcG90ZW50aWFsIGl0ZXJhdGVlIGluZGV4IG9yIGtleSBhcmd1bWVudC5cbiAqIEBwYXJhbSB7Kn0gb2JqZWN0IFRoZSBwb3RlbnRpYWwgaXRlcmF0ZWUgb2JqZWN0IGFyZ3VtZW50LlxuICogQHJldHVybnMge2Jvb2xlYW59IFJldHVybnMgYHRydWVgIGlmIHRoZSBhcmd1bWVudHMgYXJlIGZyb20gYW4gaXRlcmF0ZWUgY2FsbCxcbiAqICBlbHNlIGBmYWxzZWAuXG4gKi9cbmZ1bmN0aW9uIGlzSXRlcmF0ZWVDYWxsKHZhbHVlLCBpbmRleCwgb2JqZWN0KSB7XG4gIGlmICghaXNPYmplY3Qob2JqZWN0KSkge1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuICB2YXIgdHlwZSA9IHR5cGVvZiBpbmRleDtcbiAgaWYgKHR5cGUgPT0gJ251bWJlcidcbiAgICAgICAgPyAoaXNBcnJheUxpa2Uob2JqZWN0KSAmJiBpc0luZGV4KGluZGV4LCBvYmplY3QubGVuZ3RoKSlcbiAgICAgICAgOiAodHlwZSA9PSAnc3RyaW5nJyAmJiBpbmRleCBpbiBvYmplY3QpXG4gICAgICApIHtcbiAgICByZXR1cm4gZXEob2JqZWN0W2luZGV4XSwgdmFsdWUpO1xuICB9XG4gIHJldHVybiBmYWxzZTtcbn1cblxubW9kdWxlLmV4cG9ydHMgPSBpc0l0ZXJhdGVlQ2FsbDtcbiIsCiAgICAiLyoqXG4gKiBUaGUgYmFzZSBpbXBsZW1lbnRhdGlvbiBvZiBgXy50aW1lc2Agd2l0aG91dCBzdXBwb3J0IGZvciBpdGVyYXRlZSBzaG9ydGhhbmRzXG4gKiBvciBtYXggYXJyYXkgbGVuZ3RoIGNoZWNrcy5cbiAqXG4gKiBAcHJpdmF0ZVxuICogQHBhcmFtIHtudW1iZXJ9IG4gVGhlIG51bWJlciBvZiB0aW1lcyB0byBpbnZva2UgYGl0ZXJhdGVlYC5cbiAqIEBwYXJhbSB7RnVuY3Rpb259IGl0ZXJhdGVlIFRoZSBmdW5jdGlvbiBpbnZva2VkIHBlciBpdGVyYXRpb24uXG4gKiBAcmV0dXJucyB7QXJyYXl9IFJldHVybnMgdGhlIGFycmF5IG9mIHJlc3VsdHMuXG4gKi9cbmZ1bmN0aW9uIGJhc2VUaW1lcyhuLCBpdGVyYXRlZSkge1xuICB2YXIgaW5kZXggPSAtMSxcbiAgICAgIHJlc3VsdCA9IEFycmF5KG4pO1xuXG4gIHdoaWxlICgrK2luZGV4IDwgbikge1xuICAgIHJlc3VsdFtpbmRleF0gPSBpdGVyYXRlZShpbmRleCk7XG4gIH1cbiAgcmV0dXJuIHJlc3VsdDtcbn1cblxubW9kdWxlLmV4cG9ydHMgPSBiYXNlVGltZXM7XG4iLAogICAgIi8qKlxuICogQ2hlY2tzIGlmIGB2YWx1ZWAgaXMgb2JqZWN0LWxpa2UuIEEgdmFsdWUgaXMgb2JqZWN0LWxpa2UgaWYgaXQncyBub3QgYG51bGxgXG4gKiBhbmQgaGFzIGEgYHR5cGVvZmAgcmVzdWx0IG9mIFwib2JqZWN0XCIuXG4gKlxuICogQHN0YXRpY1xuICogQG1lbWJlck9mIF9cbiAqIEBzaW5jZSA0LjAuMFxuICogQGNhdGVnb3J5IExhbmdcbiAqIEBwYXJhbSB7Kn0gdmFsdWUgVGhlIHZhbHVlIHRvIGNoZWNrLlxuICogQHJldHVybnMge2Jvb2xlYW59IFJldHVybnMgYHRydWVgIGlmIGB2YWx1ZWAgaXMgb2JqZWN0LWxpa2UsIGVsc2UgYGZhbHNlYC5cbiAqIEBleGFtcGxlXG4gKlxuICogXy5pc09iamVjdExpa2Uoe30pO1xuICogLy8gPT4gdHJ1ZVxuICpcbiAqIF8uaXNPYmplY3RMaWtlKFsxLCAyLCAzXSk7XG4gKiAvLyA9PiB0cnVlXG4gKlxuICogXy5pc09iamVjdExpa2UoXy5ub29wKTtcbiAqIC8vID0+IGZhbHNlXG4gKlxuICogXy5pc09iamVjdExpa2UobnVsbCk7XG4gKiAvLyA9PiBmYWxzZVxuICovXG5mdW5jdGlvbiBpc09iamVjdExpa2UodmFsdWUpIHtcbiAgcmV0dXJuIHZhbHVlICE9IG51bGwgJiYgdHlwZW9mIHZhbHVlID09ICdvYmplY3QnO1xufVxuXG5tb2R1bGUuZXhwb3J0cyA9IGlzT2JqZWN0TGlrZTtcbiIsCiAgICAidmFyIGJhc2VHZXRUYWcgPSByZXF1aXJlKCcuL19iYXNlR2V0VGFnJyksXG4gICAgaXNPYmplY3RMaWtlID0gcmVxdWlyZSgnLi9pc09iamVjdExpa2UnKTtcblxuLyoqIGBPYmplY3QjdG9TdHJpbmdgIHJlc3VsdCByZWZlcmVuY2VzLiAqL1xudmFyIGFyZ3NUYWcgPSAnW29iamVjdCBBcmd1bWVudHNdJztcblxuLyoqXG4gKiBUaGUgYmFzZSBpbXBsZW1lbnRhdGlvbiBvZiBgXy5pc0FyZ3VtZW50c2AuXG4gKlxuICogQHByaXZhdGVcbiAqIEBwYXJhbSB7Kn0gdmFsdWUgVGhlIHZhbHVlIHRvIGNoZWNrLlxuICogQHJldHVybnMge2Jvb2xlYW59IFJldHVybnMgYHRydWVgIGlmIGB2YWx1ZWAgaXMgYW4gYGFyZ3VtZW50c2Agb2JqZWN0LFxuICovXG5mdW5jdGlvbiBiYXNlSXNBcmd1bWVudHModmFsdWUpIHtcbiAgcmV0dXJuIGlzT2JqZWN0TGlrZSh2YWx1ZSkgJiYgYmFzZUdldFRhZyh2YWx1ZSkgPT0gYXJnc1RhZztcbn1cblxubW9kdWxlLmV4cG9ydHMgPSBiYXNlSXNBcmd1bWVudHM7XG4iLAogICAgInZhciBiYXNlSXNBcmd1bWVudHMgPSByZXF1aXJlKCcuL19iYXNlSXNBcmd1bWVudHMnKSxcbiAgICBpc09iamVjdExpa2UgPSByZXF1aXJlKCcuL2lzT2JqZWN0TGlrZScpO1xuXG4vKiogVXNlZCBmb3IgYnVpbHQtaW4gbWV0aG9kIHJlZmVyZW5jZXMuICovXG52YXIgb2JqZWN0UHJvdG8gPSBPYmplY3QucHJvdG90eXBlO1xuXG4vKiogVXNlZCB0byBjaGVjayBvYmplY3RzIGZvciBvd24gcHJvcGVydGllcy4gKi9cbnZhciBoYXNPd25Qcm9wZXJ0eSA9IG9iamVjdFByb3RvLmhhc093blByb3BlcnR5O1xuXG4vKiogQnVpbHQtaW4gdmFsdWUgcmVmZXJlbmNlcy4gKi9cbnZhciBwcm9wZXJ0eUlzRW51bWVyYWJsZSA9IG9iamVjdFByb3RvLnByb3BlcnR5SXNFbnVtZXJhYmxlO1xuXG4vKipcbiAqIENoZWNrcyBpZiBgdmFsdWVgIGlzIGxpa2VseSBhbiBgYXJndW1lbnRzYCBvYmplY3QuXG4gKlxuICogQHN0YXRpY1xuICogQG1lbWJlck9mIF9cbiAqIEBzaW5jZSAwLjEuMFxuICogQGNhdGVnb3J5IExhbmdcbiAqIEBwYXJhbSB7Kn0gdmFsdWUgVGhlIHZhbHVlIHRvIGNoZWNrLlxuICogQHJldHVybnMge2Jvb2xlYW59IFJldHVybnMgYHRydWVgIGlmIGB2YWx1ZWAgaXMgYW4gYGFyZ3VtZW50c2Agb2JqZWN0LFxuICogIGVsc2UgYGZhbHNlYC5cbiAqIEBleGFtcGxlXG4gKlxuICogXy5pc0FyZ3VtZW50cyhmdW5jdGlvbigpIHsgcmV0dXJuIGFyZ3VtZW50czsgfSgpKTtcbiAqIC8vID0+IHRydWVcbiAqXG4gKiBfLmlzQXJndW1lbnRzKFsxLCAyLCAzXSk7XG4gKiAvLyA9PiBmYWxzZVxuICovXG52YXIgaXNBcmd1bWVudHMgPSBiYXNlSXNBcmd1bWVudHMoZnVuY3Rpb24oKSB7IHJldHVybiBhcmd1bWVudHM7IH0oKSkgPyBiYXNlSXNBcmd1bWVudHMgOiBmdW5jdGlvbih2YWx1ZSkge1xuICByZXR1cm4gaXNPYmplY3RMaWtlKHZhbHVlKSAmJiBoYXNPd25Qcm9wZXJ0eS5jYWxsKHZhbHVlLCAnY2FsbGVlJykgJiZcbiAgICAhcHJvcGVydHlJc0VudW1lcmFibGUuY2FsbCh2YWx1ZSwgJ2NhbGxlZScpO1xufTtcblxubW9kdWxlLmV4cG9ydHMgPSBpc0FyZ3VtZW50cztcbiIsCiAgICAiLyoqXG4gKiBDaGVja3MgaWYgYHZhbHVlYCBpcyBjbGFzc2lmaWVkIGFzIGFuIGBBcnJheWAgb2JqZWN0LlxuICpcbiAqIEBzdGF0aWNcbiAqIEBtZW1iZXJPZiBfXG4gKiBAc2luY2UgMC4xLjBcbiAqIEBjYXRlZ29yeSBMYW5nXG4gKiBAcGFyYW0geyp9IHZhbHVlIFRoZSB2YWx1ZSB0byBjaGVjay5cbiAqIEByZXR1cm5zIHtib29sZWFufSBSZXR1cm5zIGB0cnVlYCBpZiBgdmFsdWVgIGlzIGFuIGFycmF5LCBlbHNlIGBmYWxzZWAuXG4gKiBAZXhhbXBsZVxuICpcbiAqIF8uaXNBcnJheShbMSwgMiwgM10pO1xuICogLy8gPT4gdHJ1ZVxuICpcbiAqIF8uaXNBcnJheShkb2N1bWVudC5ib2R5LmNoaWxkcmVuKTtcbiAqIC8vID0+IGZhbHNlXG4gKlxuICogXy5pc0FycmF5KCdhYmMnKTtcbiAqIC8vID0+IGZhbHNlXG4gKlxuICogXy5pc0FycmF5KF8ubm9vcCk7XG4gKiAvLyA9PiBmYWxzZVxuICovXG52YXIgaXNBcnJheSA9IEFycmF5LmlzQXJyYXk7XG5cbm1vZHVsZS5leHBvcnRzID0gaXNBcnJheTtcbiIsCiAgICAiLyoqXG4gKiBUaGlzIG1ldGhvZCByZXR1cm5zIGBmYWxzZWAuXG4gKlxuICogQHN0YXRpY1xuICogQG1lbWJlck9mIF9cbiAqIEBzaW5jZSA0LjEzLjBcbiAqIEBjYXRlZ29yeSBVdGlsXG4gKiBAcmV0dXJucyB7Ym9vbGVhbn0gUmV0dXJucyBgZmFsc2VgLlxuICogQGV4YW1wbGVcbiAqXG4gKiBfLnRpbWVzKDIsIF8uc3R1YkZhbHNlKTtcbiAqIC8vID0+IFtmYWxzZSwgZmFsc2VdXG4gKi9cbmZ1bmN0aW9uIHN0dWJGYWxzZSgpIHtcbiAgcmV0dXJuIGZhbHNlO1xufVxuXG5tb2R1bGUuZXhwb3J0cyA9IHN0dWJGYWxzZTtcbiIsCiAgICAidmFyIHJvb3QgPSByZXF1aXJlKCcuL19yb290JyksXG4gICAgc3R1YkZhbHNlID0gcmVxdWlyZSgnLi9zdHViRmFsc2UnKTtcblxuLyoqIERldGVjdCBmcmVlIHZhcmlhYmxlIGBleHBvcnRzYC4gKi9cbnZhciBmcmVlRXhwb3J0cyA9IHR5cGVvZiBleHBvcnRzID09ICdvYmplY3QnICYmIGV4cG9ydHMgJiYgIWV4cG9ydHMubm9kZVR5cGUgJiYgZXhwb3J0cztcblxuLyoqIERldGVjdCBmcmVlIHZhcmlhYmxlIGBtb2R1bGVgLiAqL1xudmFyIGZyZWVNb2R1bGUgPSBmcmVlRXhwb3J0cyAmJiB0eXBlb2YgbW9kdWxlID09ICdvYmplY3QnICYmIG1vZHVsZSAmJiAhbW9kdWxlLm5vZGVUeXBlICYmIG1vZHVsZTtcblxuLyoqIERldGVjdCB0aGUgcG9wdWxhciBDb21tb25KUyBleHRlbnNpb24gYG1vZHVsZS5leHBvcnRzYC4gKi9cbnZhciBtb2R1bGVFeHBvcnRzID0gZnJlZU1vZHVsZSAmJiBmcmVlTW9kdWxlLmV4cG9ydHMgPT09IGZyZWVFeHBvcnRzO1xuXG4vKiogQnVpbHQtaW4gdmFsdWUgcmVmZXJlbmNlcy4gKi9cbnZhciBCdWZmZXIgPSBtb2R1bGVFeHBvcnRzID8gcm9vdC5CdWZmZXIgOiB1bmRlZmluZWQ7XG5cbi8qIEJ1aWx0LWluIG1ldGhvZCByZWZlcmVuY2VzIGZvciB0aG9zZSB3aXRoIHRoZSBzYW1lIG5hbWUgYXMgb3RoZXIgYGxvZGFzaGAgbWV0aG9kcy4gKi9cbnZhciBuYXRpdmVJc0J1ZmZlciA9IEJ1ZmZlciA/IEJ1ZmZlci5pc0J1ZmZlciA6IHVuZGVmaW5lZDtcblxuLyoqXG4gKiBDaGVja3MgaWYgYHZhbHVlYCBpcyBhIGJ1ZmZlci5cbiAqXG4gKiBAc3RhdGljXG4gKiBAbWVtYmVyT2YgX1xuICogQHNpbmNlIDQuMy4wXG4gKiBAY2F0ZWdvcnkgTGFuZ1xuICogQHBhcmFtIHsqfSB2YWx1ZSBUaGUgdmFsdWUgdG8gY2hlY2suXG4gKiBAcmV0dXJucyB7Ym9vbGVhbn0gUmV0dXJucyBgdHJ1ZWAgaWYgYHZhbHVlYCBpcyBhIGJ1ZmZlciwgZWxzZSBgZmFsc2VgLlxuICogQGV4YW1wbGVcbiAqXG4gKiBfLmlzQnVmZmVyKG5ldyBCdWZmZXIoMikpO1xuICogLy8gPT4gdHJ1ZVxuICpcbiAqIF8uaXNCdWZmZXIobmV3IFVpbnQ4QXJyYXkoMikpO1xuICogLy8gPT4gZmFsc2VcbiAqL1xudmFyIGlzQnVmZmVyID0gbmF0aXZlSXNCdWZmZXIgfHwgc3R1YkZhbHNlO1xuXG5tb2R1bGUuZXhwb3J0cyA9IGlzQnVmZmVyO1xuIiwKICAgICJ2YXIgYmFzZUdldFRhZyA9IHJlcXVpcmUoJy4vX2Jhc2VHZXRUYWcnKSxcbiAgICBpc0xlbmd0aCA9IHJlcXVpcmUoJy4vaXNMZW5ndGgnKSxcbiAgICBpc09iamVjdExpa2UgPSByZXF1aXJlKCcuL2lzT2JqZWN0TGlrZScpO1xuXG4vKiogYE9iamVjdCN0b1N0cmluZ2AgcmVzdWx0IHJlZmVyZW5jZXMuICovXG52YXIgYXJnc1RhZyA9ICdbb2JqZWN0IEFyZ3VtZW50c10nLFxuICAgIGFycmF5VGFnID0gJ1tvYmplY3QgQXJyYXldJyxcbiAgICBib29sVGFnID0gJ1tvYmplY3QgQm9vbGVhbl0nLFxuICAgIGRhdGVUYWcgPSAnW29iamVjdCBEYXRlXScsXG4gICAgZXJyb3JUYWcgPSAnW29iamVjdCBFcnJvcl0nLFxuICAgIGZ1bmNUYWcgPSAnW29iamVjdCBGdW5jdGlvbl0nLFxuICAgIG1hcFRhZyA9ICdbb2JqZWN0IE1hcF0nLFxuICAgIG51bWJlclRhZyA9ICdbb2JqZWN0IE51bWJlcl0nLFxuICAgIG9iamVjdFRhZyA9ICdbb2JqZWN0IE9iamVjdF0nLFxuICAgIHJlZ2V4cFRhZyA9ICdbb2JqZWN0IFJlZ0V4cF0nLFxuICAgIHNldFRhZyA9ICdbb2JqZWN0IFNldF0nLFxuICAgIHN0cmluZ1RhZyA9ICdbb2JqZWN0IFN0cmluZ10nLFxuICAgIHdlYWtNYXBUYWcgPSAnW29iamVjdCBXZWFrTWFwXSc7XG5cbnZhciBhcnJheUJ1ZmZlclRhZyA9ICdbb2JqZWN0IEFycmF5QnVmZmVyXScsXG4gICAgZGF0YVZpZXdUYWcgPSAnW29iamVjdCBEYXRhVmlld10nLFxuICAgIGZsb2F0MzJUYWcgPSAnW29iamVjdCBGbG9hdDMyQXJyYXldJyxcbiAgICBmbG9hdDY0VGFnID0gJ1tvYmplY3QgRmxvYXQ2NEFycmF5XScsXG4gICAgaW50OFRhZyA9ICdbb2JqZWN0IEludDhBcnJheV0nLFxuICAgIGludDE2VGFnID0gJ1tvYmplY3QgSW50MTZBcnJheV0nLFxuICAgIGludDMyVGFnID0gJ1tvYmplY3QgSW50MzJBcnJheV0nLFxuICAgIHVpbnQ4VGFnID0gJ1tvYmplY3QgVWludDhBcnJheV0nLFxuICAgIHVpbnQ4Q2xhbXBlZFRhZyA9ICdbb2JqZWN0IFVpbnQ4Q2xhbXBlZEFycmF5XScsXG4gICAgdWludDE2VGFnID0gJ1tvYmplY3QgVWludDE2QXJyYXldJyxcbiAgICB1aW50MzJUYWcgPSAnW29iamVjdCBVaW50MzJBcnJheV0nO1xuXG4vKiogVXNlZCB0byBpZGVudGlmeSBgdG9TdHJpbmdUYWdgIHZhbHVlcyBvZiB0eXBlZCBhcnJheXMuICovXG52YXIgdHlwZWRBcnJheVRhZ3MgPSB7fTtcbnR5cGVkQXJyYXlUYWdzW2Zsb2F0MzJUYWddID0gdHlwZWRBcnJheVRhZ3NbZmxvYXQ2NFRhZ10gPVxudHlwZWRBcnJheVRhZ3NbaW50OFRhZ10gPSB0eXBlZEFycmF5VGFnc1tpbnQxNlRhZ10gPVxudHlwZWRBcnJheVRhZ3NbaW50MzJUYWddID0gdHlwZWRBcnJheVRhZ3NbdWludDhUYWddID1cbnR5cGVkQXJyYXlUYWdzW3VpbnQ4Q2xhbXBlZFRhZ10gPSB0eXBlZEFycmF5VGFnc1t1aW50MTZUYWddID1cbnR5cGVkQXJyYXlUYWdzW3VpbnQzMlRhZ10gPSB0cnVlO1xudHlwZWRBcnJheVRhZ3NbYXJnc1RhZ10gPSB0eXBlZEFycmF5VGFnc1thcnJheVRhZ10gPVxudHlwZWRBcnJheVRhZ3NbYXJyYXlCdWZmZXJUYWddID0gdHlwZWRBcnJheVRhZ3NbYm9vbFRhZ10gPVxudHlwZWRBcnJheVRhZ3NbZGF0YVZpZXdUYWddID0gdHlwZWRBcnJheVRhZ3NbZGF0ZVRhZ10gPVxudHlwZWRBcnJheVRhZ3NbZXJyb3JUYWddID0gdHlwZWRBcnJheVRhZ3NbZnVuY1RhZ10gPVxudHlwZWRBcnJheVRhZ3NbbWFwVGFnXSA9IHR5cGVkQXJyYXlUYWdzW251bWJlclRhZ10gPVxudHlwZWRBcnJheVRhZ3Nbb2JqZWN0VGFnXSA9IHR5cGVkQXJyYXlUYWdzW3JlZ2V4cFRhZ10gPVxudHlwZWRBcnJheVRhZ3Nbc2V0VGFnXSA9IHR5cGVkQXJyYXlUYWdzW3N0cmluZ1RhZ10gPVxudHlwZWRBcnJheVRhZ3Nbd2Vha01hcFRhZ10gPSBmYWxzZTtcblxuLyoqXG4gKiBUaGUgYmFzZSBpbXBsZW1lbnRhdGlvbiBvZiBgXy5pc1R5cGVkQXJyYXlgIHdpdGhvdXQgTm9kZS5qcyBvcHRpbWl6YXRpb25zLlxuICpcbiAqIEBwcml2YXRlXG4gKiBAcGFyYW0geyp9IHZhbHVlIFRoZSB2YWx1ZSB0byBjaGVjay5cbiAqIEByZXR1cm5zIHtib29sZWFufSBSZXR1cm5zIGB0cnVlYCBpZiBgdmFsdWVgIGlzIGEgdHlwZWQgYXJyYXksIGVsc2UgYGZhbHNlYC5cbiAqL1xuZnVuY3Rpb24gYmFzZUlzVHlwZWRBcnJheSh2YWx1ZSkge1xuICByZXR1cm4gaXNPYmplY3RMaWtlKHZhbHVlKSAmJlxuICAgIGlzTGVuZ3RoKHZhbHVlLmxlbmd0aCkgJiYgISF0eXBlZEFycmF5VGFnc1tiYXNlR2V0VGFnKHZhbHVlKV07XG59XG5cbm1vZHVsZS5leHBvcnRzID0gYmFzZUlzVHlwZWRBcnJheTtcbiIsCiAgICAiLyoqXG4gKiBUaGUgYmFzZSBpbXBsZW1lbnRhdGlvbiBvZiBgXy51bmFyeWAgd2l0aG91dCBzdXBwb3J0IGZvciBzdG9yaW5nIG1ldGFkYXRhLlxuICpcbiAqIEBwcml2YXRlXG4gKiBAcGFyYW0ge0Z1bmN0aW9ufSBmdW5jIFRoZSBmdW5jdGlvbiB0byBjYXAgYXJndW1lbnRzIGZvci5cbiAqIEByZXR1cm5zIHtGdW5jdGlvbn0gUmV0dXJucyB0aGUgbmV3IGNhcHBlZCBmdW5jdGlvbi5cbiAqL1xuZnVuY3Rpb24gYmFzZVVuYXJ5KGZ1bmMpIHtcbiAgcmV0dXJuIGZ1bmN0aW9uKHZhbHVlKSB7XG4gICAgcmV0dXJuIGZ1bmModmFsdWUpO1xuICB9O1xufVxuXG5tb2R1bGUuZXhwb3J0cyA9IGJhc2VVbmFyeTtcbiIsCiAgICAidmFyIGZyZWVHbG9iYWwgPSByZXF1aXJlKCcuL19mcmVlR2xvYmFsJyk7XG5cbi8qKiBEZXRlY3QgZnJlZSB2YXJpYWJsZSBgZXhwb3J0c2AuICovXG52YXIgZnJlZUV4cG9ydHMgPSB0eXBlb2YgZXhwb3J0cyA9PSAnb2JqZWN0JyAmJiBleHBvcnRzICYmICFleHBvcnRzLm5vZGVUeXBlICYmIGV4cG9ydHM7XG5cbi8qKiBEZXRlY3QgZnJlZSB2YXJpYWJsZSBgbW9kdWxlYC4gKi9cbnZhciBmcmVlTW9kdWxlID0gZnJlZUV4cG9ydHMgJiYgdHlwZW9mIG1vZHVsZSA9PSAnb2JqZWN0JyAmJiBtb2R1bGUgJiYgIW1vZHVsZS5ub2RlVHlwZSAmJiBtb2R1bGU7XG5cbi8qKiBEZXRlY3QgdGhlIHBvcHVsYXIgQ29tbW9uSlMgZXh0ZW5zaW9uIGBtb2R1bGUuZXhwb3J0c2AuICovXG52YXIgbW9kdWxlRXhwb3J0cyA9IGZyZWVNb2R1bGUgJiYgZnJlZU1vZHVsZS5leHBvcnRzID09PSBmcmVlRXhwb3J0cztcblxuLyoqIERldGVjdCBmcmVlIHZhcmlhYmxlIGBwcm9jZXNzYCBmcm9tIE5vZGUuanMuICovXG52YXIgZnJlZVByb2Nlc3MgPSBtb2R1bGVFeHBvcnRzICYmIGZyZWVHbG9iYWwucHJvY2VzcztcblxuLyoqIFVzZWQgdG8gYWNjZXNzIGZhc3RlciBOb2RlLmpzIGhlbHBlcnMuICovXG52YXIgbm9kZVV0aWwgPSAoZnVuY3Rpb24oKSB7XG4gIHRyeSB7XG4gICAgLy8gVXNlIGB1dGlsLnR5cGVzYCBmb3IgTm9kZS5qcyAxMCsuXG4gICAgdmFyIHR5cGVzID0gZnJlZU1vZHVsZSAmJiBmcmVlTW9kdWxlLnJlcXVpcmUgJiYgZnJlZU1vZHVsZS5yZXF1aXJlKCd1dGlsJykudHlwZXM7XG5cbiAgICBpZiAodHlwZXMpIHtcbiAgICAgIHJldHVybiB0eXBlcztcbiAgICB9XG5cbiAgICAvLyBMZWdhY3kgYHByb2Nlc3MuYmluZGluZygndXRpbCcpYCBmb3IgTm9kZS5qcyA8IDEwLlxuICAgIHJldHVybiBmcmVlUHJvY2VzcyAmJiBmcmVlUHJvY2Vzcy5iaW5kaW5nICYmIGZyZWVQcm9jZXNzLmJpbmRpbmcoJ3V0aWwnKTtcbiAgfSBjYXRjaCAoZSkge31cbn0oKSk7XG5cbm1vZHVsZS5leHBvcnRzID0gbm9kZVV0aWw7XG4iLAogICAgInZhciBiYXNlSXNUeXBlZEFycmF5ID0gcmVxdWlyZSgnLi9fYmFzZUlzVHlwZWRBcnJheScpLFxuICAgIGJhc2VVbmFyeSA9IHJlcXVpcmUoJy4vX2Jhc2VVbmFyeScpLFxuICAgIG5vZGVVdGlsID0gcmVxdWlyZSgnLi9fbm9kZVV0aWwnKTtcblxuLyogTm9kZS5qcyBoZWxwZXIgcmVmZXJlbmNlcy4gKi9cbnZhciBub2RlSXNUeXBlZEFycmF5ID0gbm9kZVV0aWwgJiYgbm9kZVV0aWwuaXNUeXBlZEFycmF5O1xuXG4vKipcbiAqIENoZWNrcyBpZiBgdmFsdWVgIGlzIGNsYXNzaWZpZWQgYXMgYSB0eXBlZCBhcnJheS5cbiAqXG4gKiBAc3RhdGljXG4gKiBAbWVtYmVyT2YgX1xuICogQHNpbmNlIDMuMC4wXG4gKiBAY2F0ZWdvcnkgTGFuZ1xuICogQHBhcmFtIHsqfSB2YWx1ZSBUaGUgdmFsdWUgdG8gY2hlY2suXG4gKiBAcmV0dXJucyB7Ym9vbGVhbn0gUmV0dXJucyBgdHJ1ZWAgaWYgYHZhbHVlYCBpcyBhIHR5cGVkIGFycmF5LCBlbHNlIGBmYWxzZWAuXG4gKiBAZXhhbXBsZVxuICpcbiAqIF8uaXNUeXBlZEFycmF5KG5ldyBVaW50OEFycmF5KTtcbiAqIC8vID0+IHRydWVcbiAqXG4gKiBfLmlzVHlwZWRBcnJheShbXSk7XG4gKiAvLyA9PiBmYWxzZVxuICovXG52YXIgaXNUeXBlZEFycmF5ID0gbm9kZUlzVHlwZWRBcnJheSA/IGJhc2VVbmFyeShub2RlSXNUeXBlZEFycmF5KSA6IGJhc2VJc1R5cGVkQXJyYXk7XG5cbm1vZHVsZS5leHBvcnRzID0gaXNUeXBlZEFycmF5O1xuIiwKICAgICJ2YXIgYmFzZVRpbWVzID0gcmVxdWlyZSgnLi9fYmFzZVRpbWVzJyksXG4gICAgaXNBcmd1bWVudHMgPSByZXF1aXJlKCcuL2lzQXJndW1lbnRzJyksXG4gICAgaXNBcnJheSA9IHJlcXVpcmUoJy4vaXNBcnJheScpLFxuICAgIGlzQnVmZmVyID0gcmVxdWlyZSgnLi9pc0J1ZmZlcicpLFxuICAgIGlzSW5kZXggPSByZXF1aXJlKCcuL19pc0luZGV4JyksXG4gICAgaXNUeXBlZEFycmF5ID0gcmVxdWlyZSgnLi9pc1R5cGVkQXJyYXknKTtcblxuLyoqIFVzZWQgZm9yIGJ1aWx0LWluIG1ldGhvZCByZWZlcmVuY2VzLiAqL1xudmFyIG9iamVjdFByb3RvID0gT2JqZWN0LnByb3RvdHlwZTtcblxuLyoqIFVzZWQgdG8gY2hlY2sgb2JqZWN0cyBmb3Igb3duIHByb3BlcnRpZXMuICovXG52YXIgaGFzT3duUHJvcGVydHkgPSBvYmplY3RQcm90by5oYXNPd25Qcm9wZXJ0eTtcblxuLyoqXG4gKiBDcmVhdGVzIGFuIGFycmF5IG9mIHRoZSBlbnVtZXJhYmxlIHByb3BlcnR5IG5hbWVzIG9mIHRoZSBhcnJheS1saWtlIGB2YWx1ZWAuXG4gKlxuICogQHByaXZhdGVcbiAqIEBwYXJhbSB7Kn0gdmFsdWUgVGhlIHZhbHVlIHRvIHF1ZXJ5LlxuICogQHBhcmFtIHtib29sZWFufSBpbmhlcml0ZWQgU3BlY2lmeSByZXR1cm5pbmcgaW5oZXJpdGVkIHByb3BlcnR5IG5hbWVzLlxuICogQHJldHVybnMge0FycmF5fSBSZXR1cm5zIHRoZSBhcnJheSBvZiBwcm9wZXJ0eSBuYW1lcy5cbiAqL1xuZnVuY3Rpb24gYXJyYXlMaWtlS2V5cyh2YWx1ZSwgaW5oZXJpdGVkKSB7XG4gIHZhciBpc0FyciA9IGlzQXJyYXkodmFsdWUpLFxuICAgICAgaXNBcmcgPSAhaXNBcnIgJiYgaXNBcmd1bWVudHModmFsdWUpLFxuICAgICAgaXNCdWZmID0gIWlzQXJyICYmICFpc0FyZyAmJiBpc0J1ZmZlcih2YWx1ZSksXG4gICAgICBpc1R5cGUgPSAhaXNBcnIgJiYgIWlzQXJnICYmICFpc0J1ZmYgJiYgaXNUeXBlZEFycmF5KHZhbHVlKSxcbiAgICAgIHNraXBJbmRleGVzID0gaXNBcnIgfHwgaXNBcmcgfHwgaXNCdWZmIHx8IGlzVHlwZSxcbiAgICAgIHJlc3VsdCA9IHNraXBJbmRleGVzID8gYmFzZVRpbWVzKHZhbHVlLmxlbmd0aCwgU3RyaW5nKSA6IFtdLFxuICAgICAgbGVuZ3RoID0gcmVzdWx0Lmxlbmd0aDtcblxuICBmb3IgKHZhciBrZXkgaW4gdmFsdWUpIHtcbiAgICBpZiAoKGluaGVyaXRlZCB8fCBoYXNPd25Qcm9wZXJ0eS5jYWxsKHZhbHVlLCBrZXkpKSAmJlxuICAgICAgICAhKHNraXBJbmRleGVzICYmIChcbiAgICAgICAgICAgLy8gU2FmYXJpIDkgaGFzIGVudW1lcmFibGUgYGFyZ3VtZW50cy5sZW5ndGhgIGluIHN0cmljdCBtb2RlLlxuICAgICAgICAgICBrZXkgPT0gJ2xlbmd0aCcgfHxcbiAgICAgICAgICAgLy8gTm9kZS5qcyAwLjEwIGhhcyBlbnVtZXJhYmxlIG5vbi1pbmRleCBwcm9wZXJ0aWVzIG9uIGJ1ZmZlcnMuXG4gICAgICAgICAgIChpc0J1ZmYgJiYgKGtleSA9PSAnb2Zmc2V0JyB8fCBrZXkgPT0gJ3BhcmVudCcpKSB8fFxuICAgICAgICAgICAvLyBQaGFudG9tSlMgMiBoYXMgZW51bWVyYWJsZSBub24taW5kZXggcHJvcGVydGllcyBvbiB0eXBlZCBhcnJheXMuXG4gICAgICAgICAgIChpc1R5cGUgJiYgKGtleSA9PSAnYnVmZmVyJyB8fCBrZXkgPT0gJ2J5dGVMZW5ndGgnIHx8IGtleSA9PSAnYnl0ZU9mZnNldCcpKSB8fFxuICAgICAgICAgICAvLyBTa2lwIGluZGV4IHByb3BlcnRpZXMuXG4gICAgICAgICAgIGlzSW5kZXgoa2V5LCBsZW5ndGgpXG4gICAgICAgICkpKSB7XG4gICAgICByZXN1bHQucHVzaChrZXkpO1xuICAgIH1cbiAgfVxuICByZXR1cm4gcmVzdWx0O1xufVxuXG5tb2R1bGUuZXhwb3J0cyA9IGFycmF5TGlrZUtleXM7XG4iLAogICAgIi8qKiBVc2VkIGZvciBidWlsdC1pbiBtZXRob2QgcmVmZXJlbmNlcy4gKi9cbnZhciBvYmplY3RQcm90byA9IE9iamVjdC5wcm90b3R5cGU7XG5cbi8qKlxuICogQ2hlY2tzIGlmIGB2YWx1ZWAgaXMgbGlrZWx5IGEgcHJvdG90eXBlIG9iamVjdC5cbiAqXG4gKiBAcHJpdmF0ZVxuICogQHBhcmFtIHsqfSB2YWx1ZSBUaGUgdmFsdWUgdG8gY2hlY2suXG4gKiBAcmV0dXJucyB7Ym9vbGVhbn0gUmV0dXJucyBgdHJ1ZWAgaWYgYHZhbHVlYCBpcyBhIHByb3RvdHlwZSwgZWxzZSBgZmFsc2VgLlxuICovXG5mdW5jdGlvbiBpc1Byb3RvdHlwZSh2YWx1ZSkge1xuICB2YXIgQ3RvciA9IHZhbHVlICYmIHZhbHVlLmNvbnN0cnVjdG9yLFxuICAgICAgcHJvdG8gPSAodHlwZW9mIEN0b3IgPT0gJ2Z1bmN0aW9uJyAmJiBDdG9yLnByb3RvdHlwZSkgfHwgb2JqZWN0UHJvdG87XG5cbiAgcmV0dXJuIHZhbHVlID09PSBwcm90bztcbn1cblxubW9kdWxlLmV4cG9ydHMgPSBpc1Byb3RvdHlwZTtcbiIsCiAgICAiLyoqXG4gKiBUaGlzIGZ1bmN0aW9uIGlzIGxpa2VcbiAqIFtgT2JqZWN0LmtleXNgXShodHRwOi8vZWNtYS1pbnRlcm5hdGlvbmFsLm9yZy9lY21hLTI2Mi83LjAvI3NlYy1vYmplY3Qua2V5cylcbiAqIGV4Y2VwdCB0aGF0IGl0IGluY2x1ZGVzIGluaGVyaXRlZCBlbnVtZXJhYmxlIHByb3BlcnRpZXMuXG4gKlxuICogQHByaXZhdGVcbiAqIEBwYXJhbSB7T2JqZWN0fSBvYmplY3QgVGhlIG9iamVjdCB0byBxdWVyeS5cbiAqIEByZXR1cm5zIHtBcnJheX0gUmV0dXJucyB0aGUgYXJyYXkgb2YgcHJvcGVydHkgbmFtZXMuXG4gKi9cbmZ1bmN0aW9uIG5hdGl2ZUtleXNJbihvYmplY3QpIHtcbiAgdmFyIHJlc3VsdCA9IFtdO1xuICBpZiAob2JqZWN0ICE9IG51bGwpIHtcbiAgICBmb3IgKHZhciBrZXkgaW4gT2JqZWN0KG9iamVjdCkpIHtcbiAgICAgIHJlc3VsdC5wdXNoKGtleSk7XG4gICAgfVxuICB9XG4gIHJldHVybiByZXN1bHQ7XG59XG5cbm1vZHVsZS5leHBvcnRzID0gbmF0aXZlS2V5c0luO1xuIiwKICAgICJ2YXIgaXNPYmplY3QgPSByZXF1aXJlKCcuL2lzT2JqZWN0JyksXG4gICAgaXNQcm90b3R5cGUgPSByZXF1aXJlKCcuL19pc1Byb3RvdHlwZScpLFxuICAgIG5hdGl2ZUtleXNJbiA9IHJlcXVpcmUoJy4vX25hdGl2ZUtleXNJbicpO1xuXG4vKiogVXNlZCBmb3IgYnVpbHQtaW4gbWV0aG9kIHJlZmVyZW5jZXMuICovXG52YXIgb2JqZWN0UHJvdG8gPSBPYmplY3QucHJvdG90eXBlO1xuXG4vKiogVXNlZCB0byBjaGVjayBvYmplY3RzIGZvciBvd24gcHJvcGVydGllcy4gKi9cbnZhciBoYXNPd25Qcm9wZXJ0eSA9IG9iamVjdFByb3RvLmhhc093blByb3BlcnR5O1xuXG4vKipcbiAqIFRoZSBiYXNlIGltcGxlbWVudGF0aW9uIG9mIGBfLmtleXNJbmAgd2hpY2ggZG9lc24ndCB0cmVhdCBzcGFyc2UgYXJyYXlzIGFzIGRlbnNlLlxuICpcbiAqIEBwcml2YXRlXG4gKiBAcGFyYW0ge09iamVjdH0gb2JqZWN0IFRoZSBvYmplY3QgdG8gcXVlcnkuXG4gKiBAcmV0dXJucyB7QXJyYXl9IFJldHVybnMgdGhlIGFycmF5IG9mIHByb3BlcnR5IG5hbWVzLlxuICovXG5mdW5jdGlvbiBiYXNlS2V5c0luKG9iamVjdCkge1xuICBpZiAoIWlzT2JqZWN0KG9iamVjdCkpIHtcbiAgICByZXR1cm4gbmF0aXZlS2V5c0luKG9iamVjdCk7XG4gIH1cbiAgdmFyIGlzUHJvdG8gPSBpc1Byb3RvdHlwZShvYmplY3QpLFxuICAgICAgcmVzdWx0ID0gW107XG5cbiAgZm9yICh2YXIga2V5IGluIG9iamVjdCkge1xuICAgIGlmICghKGtleSA9PSAnY29uc3RydWN0b3InICYmIChpc1Byb3RvIHx8ICFoYXNPd25Qcm9wZXJ0eS5jYWxsKG9iamVjdCwga2V5KSkpKSB7XG4gICAgICByZXN1bHQucHVzaChrZXkpO1xuICAgIH1cbiAgfVxuICByZXR1cm4gcmVzdWx0O1xufVxuXG5tb2R1bGUuZXhwb3J0cyA9IGJhc2VLZXlzSW47XG4iLAogICAgInZhciBhcnJheUxpa2VLZXlzID0gcmVxdWlyZSgnLi9fYXJyYXlMaWtlS2V5cycpLFxuICAgIGJhc2VLZXlzSW4gPSByZXF1aXJlKCcuL19iYXNlS2V5c0luJyksXG4gICAgaXNBcnJheUxpa2UgPSByZXF1aXJlKCcuL2lzQXJyYXlMaWtlJyk7XG5cbi8qKlxuICogQ3JlYXRlcyBhbiBhcnJheSBvZiB0aGUgb3duIGFuZCBpbmhlcml0ZWQgZW51bWVyYWJsZSBwcm9wZXJ0eSBuYW1lcyBvZiBgb2JqZWN0YC5cbiAqXG4gKiAqKk5vdGU6KiogTm9uLW9iamVjdCB2YWx1ZXMgYXJlIGNvZXJjZWQgdG8gb2JqZWN0cy5cbiAqXG4gKiBAc3RhdGljXG4gKiBAbWVtYmVyT2YgX1xuICogQHNpbmNlIDMuMC4wXG4gKiBAY2F0ZWdvcnkgT2JqZWN0XG4gKiBAcGFyYW0ge09iamVjdH0gb2JqZWN0IFRoZSBvYmplY3QgdG8gcXVlcnkuXG4gKiBAcmV0dXJucyB7QXJyYXl9IFJldHVybnMgdGhlIGFycmF5IG9mIHByb3BlcnR5IG5hbWVzLlxuICogQGV4YW1wbGVcbiAqXG4gKiBmdW5jdGlvbiBGb28oKSB7XG4gKiAgIHRoaXMuYSA9IDE7XG4gKiAgIHRoaXMuYiA9IDI7XG4gKiB9XG4gKlxuICogRm9vLnByb3RvdHlwZS5jID0gMztcbiAqXG4gKiBfLmtleXNJbihuZXcgRm9vKTtcbiAqIC8vID0+IFsnYScsICdiJywgJ2MnXSAoaXRlcmF0aW9uIG9yZGVyIGlzIG5vdCBndWFyYW50ZWVkKVxuICovXG5mdW5jdGlvbiBrZXlzSW4ob2JqZWN0KSB7XG4gIHJldHVybiBpc0FycmF5TGlrZShvYmplY3QpID8gYXJyYXlMaWtlS2V5cyhvYmplY3QsIHRydWUpIDogYmFzZUtleXNJbihvYmplY3QpO1xufVxuXG5tb2R1bGUuZXhwb3J0cyA9IGtleXNJbjtcbiIsCiAgICAidmFyIGJhc2VSZXN0ID0gcmVxdWlyZSgnLi9fYmFzZVJlc3QnKSxcbiAgICBlcSA9IHJlcXVpcmUoJy4vZXEnKSxcbiAgICBpc0l0ZXJhdGVlQ2FsbCA9IHJlcXVpcmUoJy4vX2lzSXRlcmF0ZWVDYWxsJyksXG4gICAga2V5c0luID0gcmVxdWlyZSgnLi9rZXlzSW4nKTtcblxuLyoqIFVzZWQgZm9yIGJ1aWx0LWluIG1ldGhvZCByZWZlcmVuY2VzLiAqL1xudmFyIG9iamVjdFByb3RvID0gT2JqZWN0LnByb3RvdHlwZTtcblxuLyoqIFVzZWQgdG8gY2hlY2sgb2JqZWN0cyBmb3Igb3duIHByb3BlcnRpZXMuICovXG52YXIgaGFzT3duUHJvcGVydHkgPSBvYmplY3RQcm90by5oYXNPd25Qcm9wZXJ0eTtcblxuLyoqXG4gKiBBc3NpZ25zIG93biBhbmQgaW5oZXJpdGVkIGVudW1lcmFibGUgc3RyaW5nIGtleWVkIHByb3BlcnRpZXMgb2Ygc291cmNlXG4gKiBvYmplY3RzIHRvIHRoZSBkZXN0aW5hdGlvbiBvYmplY3QgZm9yIGFsbCBkZXN0aW5hdGlvbiBwcm9wZXJ0aWVzIHRoYXRcbiAqIHJlc29sdmUgdG8gYHVuZGVmaW5lZGAuIFNvdXJjZSBvYmplY3RzIGFyZSBhcHBsaWVkIGZyb20gbGVmdCB0byByaWdodC5cbiAqIE9uY2UgYSBwcm9wZXJ0eSBpcyBzZXQsIGFkZGl0aW9uYWwgdmFsdWVzIG9mIHRoZSBzYW1lIHByb3BlcnR5IGFyZSBpZ25vcmVkLlxuICpcbiAqICoqTm90ZToqKiBUaGlzIG1ldGhvZCBtdXRhdGVzIGBvYmplY3RgLlxuICpcbiAqIEBzdGF0aWNcbiAqIEBzaW5jZSAwLjEuMFxuICogQG1lbWJlck9mIF9cbiAqIEBjYXRlZ29yeSBPYmplY3RcbiAqIEBwYXJhbSB7T2JqZWN0fSBvYmplY3QgVGhlIGRlc3RpbmF0aW9uIG9iamVjdC5cbiAqIEBwYXJhbSB7Li4uT2JqZWN0fSBbc291cmNlc10gVGhlIHNvdXJjZSBvYmplY3RzLlxuICogQHJldHVybnMge09iamVjdH0gUmV0dXJucyBgb2JqZWN0YC5cbiAqIEBzZWUgXy5kZWZhdWx0c0RlZXBcbiAqIEBleGFtcGxlXG4gKlxuICogXy5kZWZhdWx0cyh7ICdhJzogMSB9LCB7ICdiJzogMiB9LCB7ICdhJzogMyB9KTtcbiAqIC8vID0+IHsgJ2EnOiAxLCAnYic6IDIgfVxuICovXG52YXIgZGVmYXVsdHMgPSBiYXNlUmVzdChmdW5jdGlvbihvYmplY3QsIHNvdXJjZXMpIHtcbiAgb2JqZWN0ID0gT2JqZWN0KG9iamVjdCk7XG5cbiAgdmFyIGluZGV4ID0gLTE7XG4gIHZhciBsZW5ndGggPSBzb3VyY2VzLmxlbmd0aDtcbiAgdmFyIGd1YXJkID0gbGVuZ3RoID4gMiA/IHNvdXJjZXNbMl0gOiB1bmRlZmluZWQ7XG5cbiAgaWYgKGd1YXJkICYmIGlzSXRlcmF0ZWVDYWxsKHNvdXJjZXNbMF0sIHNvdXJjZXNbMV0sIGd1YXJkKSkge1xuICAgIGxlbmd0aCA9IDE7XG4gIH1cblxuICB3aGlsZSAoKytpbmRleCA8IGxlbmd0aCkge1xuICAgIHZhciBzb3VyY2UgPSBzb3VyY2VzW2luZGV4XTtcbiAgICB2YXIgcHJvcHMgPSBrZXlzSW4oc291cmNlKTtcbiAgICB2YXIgcHJvcHNJbmRleCA9IC0xO1xuICAgIHZhciBwcm9wc0xlbmd0aCA9IHByb3BzLmxlbmd0aDtcblxuICAgIHdoaWxlICgrK3Byb3BzSW5kZXggPCBwcm9wc0xlbmd0aCkge1xuICAgICAgdmFyIGtleSA9IHByb3BzW3Byb3BzSW5kZXhdO1xuICAgICAgdmFyIHZhbHVlID0gb2JqZWN0W2tleV07XG5cbiAgICAgIGlmICh2YWx1ZSA9PT0gdW5kZWZpbmVkIHx8XG4gICAgICAgICAgKGVxKHZhbHVlLCBvYmplY3RQcm90b1trZXldKSAmJiAhaGFzT3duUHJvcGVydHkuY2FsbChvYmplY3QsIGtleSkpKSB7XG4gICAgICAgIG9iamVjdFtrZXldID0gc291cmNlW2tleV07XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIG9iamVjdDtcbn0pO1xuXG5tb2R1bGUuZXhwb3J0cyA9IGRlZmF1bHRzO1xuIiwKICAgICIndXNlIHN0cmljdCdcblxuLypcbiAgVGhpcyBmaWxlIGlzIGEgcmVkdWNlZCBhbmQgYWRhcHRlZCB2ZXJzaW9uIG9mIHRoZSBtYWluIGxpYi9pbnRlcm5hbC9wZXJfY29udGV4dC9wcmltb3JkaWFscy5qcyBmaWxlIGRlZmluZWQgYXRcblxuICBodHRwczovL2dpdGh1Yi5jb20vbm9kZWpzL25vZGUvYmxvYi9tYXN0ZXIvbGliL2ludGVybmFsL3Blcl9jb250ZXh0L3ByaW1vcmRpYWxzLmpzXG5cbiAgRG9uJ3QgdHJ5IHRvIHJlcGxhY2Ugd2l0aCB0aGUgb3JpZ2luYWwgZmlsZSBhbmQga2VlcCBpdCB1cCB0byBkYXRlIHdpdGggdGhlIHVwc3RyZWFtIGZpbGUuXG4qL1xubW9kdWxlLmV4cG9ydHMgPSB7XG4gIEFycmF5SXNBcnJheShzZWxmKSB7XG4gICAgcmV0dXJuIEFycmF5LmlzQXJyYXkoc2VsZilcbiAgfSxcbiAgQXJyYXlQcm90b3R5cGVJbmNsdWRlcyhzZWxmLCBlbCkge1xuICAgIHJldHVybiBzZWxmLmluY2x1ZGVzKGVsKVxuICB9LFxuICBBcnJheVByb3RvdHlwZUluZGV4T2Yoc2VsZiwgZWwpIHtcbiAgICByZXR1cm4gc2VsZi5pbmRleE9mKGVsKVxuICB9LFxuICBBcnJheVByb3RvdHlwZUpvaW4oc2VsZiwgc2VwKSB7XG4gICAgcmV0dXJuIHNlbGYuam9pbihzZXApXG4gIH0sXG4gIEFycmF5UHJvdG90eXBlTWFwKHNlbGYsIGZuKSB7XG4gICAgcmV0dXJuIHNlbGYubWFwKGZuKVxuICB9LFxuICBBcnJheVByb3RvdHlwZVBvcChzZWxmLCBlbCkge1xuICAgIHJldHVybiBzZWxmLnBvcChlbClcbiAgfSxcbiAgQXJyYXlQcm90b3R5cGVQdXNoKHNlbGYsIGVsKSB7XG4gICAgcmV0dXJuIHNlbGYucHVzaChlbClcbiAgfSxcbiAgQXJyYXlQcm90b3R5cGVTbGljZShzZWxmLCBzdGFydCwgZW5kKSB7XG4gICAgcmV0dXJuIHNlbGYuc2xpY2Uoc3RhcnQsIGVuZClcbiAgfSxcbiAgRXJyb3IsXG4gIEZ1bmN0aW9uUHJvdG90eXBlQ2FsbChmbiwgdGhpc0FyZ3MsIC4uLmFyZ3MpIHtcbiAgICByZXR1cm4gZm4uY2FsbCh0aGlzQXJncywgLi4uYXJncylcbiAgfSxcbiAgRnVuY3Rpb25Qcm90b3R5cGVTeW1ib2xIYXNJbnN0YW5jZShzZWxmLCBpbnN0YW5jZSkge1xuICAgIHJldHVybiBGdW5jdGlvbi5wcm90b3R5cGVbU3ltYm9sLmhhc0luc3RhbmNlXS5jYWxsKHNlbGYsIGluc3RhbmNlKVxuICB9LFxuICBNYXRoRmxvb3I6IE1hdGguZmxvb3IsXG4gIE51bWJlcixcbiAgTnVtYmVySXNJbnRlZ2VyOiBOdW1iZXIuaXNJbnRlZ2VyLFxuICBOdW1iZXJJc05hTjogTnVtYmVyLmlzTmFOLFxuICBOdW1iZXJNQVhfU0FGRV9JTlRFR0VSOiBOdW1iZXIuTUFYX1NBRkVfSU5URUdFUixcbiAgTnVtYmVyTUlOX1NBRkVfSU5URUdFUjogTnVtYmVyLk1JTl9TQUZFX0lOVEVHRVIsXG4gIE51bWJlclBhcnNlSW50OiBOdW1iZXIucGFyc2VJbnQsXG4gIE9iamVjdERlZmluZVByb3BlcnRpZXMoc2VsZiwgcHJvcHMpIHtcbiAgICByZXR1cm4gT2JqZWN0LmRlZmluZVByb3BlcnRpZXMoc2VsZiwgcHJvcHMpXG4gIH0sXG4gIE9iamVjdERlZmluZVByb3BlcnR5KHNlbGYsIG5hbWUsIHByb3ApIHtcbiAgICByZXR1cm4gT2JqZWN0LmRlZmluZVByb3BlcnR5KHNlbGYsIG5hbWUsIHByb3ApXG4gIH0sXG4gIE9iamVjdEdldE93blByb3BlcnR5RGVzY3JpcHRvcihzZWxmLCBuYW1lKSB7XG4gICAgcmV0dXJuIE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3Ioc2VsZiwgbmFtZSlcbiAgfSxcbiAgT2JqZWN0S2V5cyhvYmopIHtcbiAgICByZXR1cm4gT2JqZWN0LmtleXMob2JqKVxuICB9LFxuICBPYmplY3RTZXRQcm90b3R5cGVPZih0YXJnZXQsIHByb3RvKSB7XG4gICAgcmV0dXJuIE9iamVjdC5zZXRQcm90b3R5cGVPZih0YXJnZXQsIHByb3RvKVxuICB9LFxuICBQcm9taXNlLFxuICBQcm9taXNlUHJvdG90eXBlQ2F0Y2goc2VsZiwgZm4pIHtcbiAgICByZXR1cm4gc2VsZi5jYXRjaChmbilcbiAgfSxcbiAgUHJvbWlzZVByb3RvdHlwZVRoZW4oc2VsZiwgdGhlbkZuLCBjYXRjaEZuKSB7XG4gICAgcmV0dXJuIHNlbGYudGhlbih0aGVuRm4sIGNhdGNoRm4pXG4gIH0sXG4gIFByb21pc2VSZWplY3QoZXJyKSB7XG4gICAgcmV0dXJuIFByb21pc2UucmVqZWN0KGVycilcbiAgfSxcbiAgUHJvbWlzZVJlc29sdmUodmFsKSB7XG4gICAgcmV0dXJuIFByb21pc2UucmVzb2x2ZSh2YWwpXG4gIH0sXG4gIFJlZmxlY3RBcHBseTogUmVmbGVjdC5hcHBseSxcbiAgUmVnRXhwUHJvdG90eXBlVGVzdChzZWxmLCB2YWx1ZSkge1xuICAgIHJldHVybiBzZWxmLnRlc3QodmFsdWUpXG4gIH0sXG4gIFNhZmVTZXQ6IFNldCxcbiAgU3RyaW5nLFxuICBTdHJpbmdQcm90b3R5cGVTbGljZShzZWxmLCBzdGFydCwgZW5kKSB7XG4gICAgcmV0dXJuIHNlbGYuc2xpY2Uoc3RhcnQsIGVuZClcbiAgfSxcbiAgU3RyaW5nUHJvdG90eXBlVG9Mb3dlckNhc2Uoc2VsZikge1xuICAgIHJldHVybiBzZWxmLnRvTG93ZXJDYXNlKClcbiAgfSxcbiAgU3RyaW5nUHJvdG90eXBlVG9VcHBlckNhc2Uoc2VsZikge1xuICAgIHJldHVybiBzZWxmLnRvVXBwZXJDYXNlKClcbiAgfSxcbiAgU3RyaW5nUHJvdG90eXBlVHJpbShzZWxmKSB7XG4gICAgcmV0dXJuIHNlbGYudHJpbSgpXG4gIH0sXG4gIFN5bWJvbCxcbiAgU3ltYm9sRm9yOiBTeW1ib2wuZm9yLFxuICBTeW1ib2xBc3luY0l0ZXJhdG9yOiBTeW1ib2wuYXN5bmNJdGVyYXRvcixcbiAgU3ltYm9sSGFzSW5zdGFuY2U6IFN5bWJvbC5oYXNJbnN0YW5jZSxcbiAgU3ltYm9sSXRlcmF0b3I6IFN5bWJvbC5pdGVyYXRvcixcbiAgU3ltYm9sRGlzcG9zZTogU3ltYm9sLmRpc3Bvc2UgfHwgU3ltYm9sKCdTeW1ib2wuZGlzcG9zZScpLFxuICBTeW1ib2xBc3luY0Rpc3Bvc2U6IFN5bWJvbC5hc3luY0Rpc3Bvc2UgfHwgU3ltYm9sKCdTeW1ib2wuYXN5bmNEaXNwb3NlJyksXG4gIFR5cGVkQXJyYXlQcm90b3R5cGVTZXQoc2VsZiwgYnVmLCBsZW4pIHtcbiAgICByZXR1cm4gc2VsZi5zZXQoYnVmLCBsZW4pXG4gIH0sXG4gIEJvb2xlYW46IEJvb2xlYW4sXG4gIFVpbnQ4QXJyYXlcbn1cbiIsCiAgICAiLyoqXG4gKiBAYXV0aG9yIFRvcnUgTmFnYXNoaW1hIDxodHRwczovL2dpdGh1Yi5jb20vbXlzdGljYXRlYT5cbiAqIEBjb3B5cmlnaHQgMjAxNSBUb3J1IE5hZ2FzaGltYS4gQWxsIHJpZ2h0cyByZXNlcnZlZC5cbiAqIFNlZSBMSUNFTlNFIGZpbGUgaW4gcm9vdCBkaXJlY3RvcnkgZm9yIGZ1bGwgbGljZW5zZS5cbiAqL1xuJ3VzZSBzdHJpY3QnO1xuXG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgJ19fZXNNb2R1bGUnLCB7IHZhbHVlOiB0cnVlIH0pO1xuXG4vKipcbiAqIEB0eXBlZGVmIHtvYmplY3R9IFByaXZhdGVEYXRhXG4gKiBAcHJvcGVydHkge0V2ZW50VGFyZ2V0fSBldmVudFRhcmdldCBUaGUgZXZlbnQgdGFyZ2V0LlxuICogQHByb3BlcnR5IHt7dHlwZTpzdHJpbmd9fSBldmVudCBUaGUgb3JpZ2luYWwgZXZlbnQgb2JqZWN0LlxuICogQHByb3BlcnR5IHtudW1iZXJ9IGV2ZW50UGhhc2UgVGhlIGN1cnJlbnQgZXZlbnQgcGhhc2UuXG4gKiBAcHJvcGVydHkge0V2ZW50VGFyZ2V0fG51bGx9IGN1cnJlbnRUYXJnZXQgVGhlIGN1cnJlbnQgZXZlbnQgdGFyZ2V0LlxuICogQHByb3BlcnR5IHtib29sZWFufSBjYW5jZWxlZCBUaGUgZmxhZyB0byBwcmV2ZW50IGRlZmF1bHQuXG4gKiBAcHJvcGVydHkge2Jvb2xlYW59IHN0b3BwZWQgVGhlIGZsYWcgdG8gc3RvcCBwcm9wYWdhdGlvbi5cbiAqIEBwcm9wZXJ0eSB7Ym9vbGVhbn0gaW1tZWRpYXRlU3RvcHBlZCBUaGUgZmxhZyB0byBzdG9wIHByb3BhZ2F0aW9uIGltbWVkaWF0ZWx5LlxuICogQHByb3BlcnR5IHtGdW5jdGlvbnxudWxsfSBwYXNzaXZlTGlzdGVuZXIgVGhlIGxpc3RlbmVyIGlmIHRoZSBjdXJyZW50IGxpc3RlbmVyIGlzIHBhc3NpdmUuIE90aGVyd2lzZSB0aGlzIGlzIG51bGwuXG4gKiBAcHJvcGVydHkge251bWJlcn0gdGltZVN0YW1wIFRoZSB1bml4IHRpbWUuXG4gKiBAcHJpdmF0ZVxuICovXG5cbi8qKlxuICogUHJpdmF0ZSBkYXRhIGZvciBldmVudCB3cmFwcGVycy5cbiAqIEB0eXBlIHtXZWFrTWFwPEV2ZW50LCBQcml2YXRlRGF0YT59XG4gKiBAcHJpdmF0ZVxuICovXG5jb25zdCBwcml2YXRlRGF0YSA9IG5ldyBXZWFrTWFwKCk7XG5cbi8qKlxuICogQ2FjaGUgZm9yIHdyYXBwZXIgY2xhc3Nlcy5cbiAqIEB0eXBlIHtXZWFrTWFwPE9iamVjdCwgRnVuY3Rpb24+fVxuICogQHByaXZhdGVcbiAqL1xuY29uc3Qgd3JhcHBlcnMgPSBuZXcgV2Vha01hcCgpO1xuXG4vKipcbiAqIEdldCBwcml2YXRlIGRhdGEuXG4gKiBAcGFyYW0ge0V2ZW50fSBldmVudCBUaGUgZXZlbnQgb2JqZWN0IHRvIGdldCBwcml2YXRlIGRhdGEuXG4gKiBAcmV0dXJucyB7UHJpdmF0ZURhdGF9IFRoZSBwcml2YXRlIGRhdGEgb2YgdGhlIGV2ZW50LlxuICogQHByaXZhdGVcbiAqL1xuZnVuY3Rpb24gcGQoZXZlbnQpIHtcbiAgICBjb25zdCByZXR2ID0gcHJpdmF0ZURhdGEuZ2V0KGV2ZW50KTtcbiAgICBjb25zb2xlLmFzc2VydChcbiAgICAgICAgcmV0diAhPSBudWxsLFxuICAgICAgICBcIid0aGlzJyBpcyBleHBlY3RlZCBhbiBFdmVudCBvYmplY3QsIGJ1dCBnb3RcIixcbiAgICAgICAgZXZlbnRcbiAgICApO1xuICAgIHJldHVybiByZXR2XG59XG5cbi8qKlxuICogaHR0cHM6Ly9kb20uc3BlYy53aGF0d2cub3JnLyNzZXQtdGhlLWNhbmNlbGVkLWZsYWdcbiAqIEBwYXJhbSBkYXRhIHtQcml2YXRlRGF0YX0gcHJpdmF0ZSBkYXRhLlxuICovXG5mdW5jdGlvbiBzZXRDYW5jZWxGbGFnKGRhdGEpIHtcbiAgICBpZiAoZGF0YS5wYXNzaXZlTGlzdGVuZXIgIT0gbnVsbCkge1xuICAgICAgICBpZiAoXG4gICAgICAgICAgICB0eXBlb2YgY29uc29sZSAhPT0gXCJ1bmRlZmluZWRcIiAmJlxuICAgICAgICAgICAgdHlwZW9mIGNvbnNvbGUuZXJyb3IgPT09IFwiZnVuY3Rpb25cIlxuICAgICAgICApIHtcbiAgICAgICAgICAgIGNvbnNvbGUuZXJyb3IoXG4gICAgICAgICAgICAgICAgXCJVbmFibGUgdG8gcHJldmVudERlZmF1bHQgaW5zaWRlIHBhc3NpdmUgZXZlbnQgbGlzdGVuZXIgaW52b2NhdGlvbi5cIixcbiAgICAgICAgICAgICAgICBkYXRhLnBhc3NpdmVMaXN0ZW5lclxuICAgICAgICAgICAgKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm5cbiAgICB9XG4gICAgaWYgKCFkYXRhLmV2ZW50LmNhbmNlbGFibGUpIHtcbiAgICAgICAgcmV0dXJuXG4gICAgfVxuXG4gICAgZGF0YS5jYW5jZWxlZCA9IHRydWU7XG4gICAgaWYgKHR5cGVvZiBkYXRhLmV2ZW50LnByZXZlbnREZWZhdWx0ID09PSBcImZ1bmN0aW9uXCIpIHtcbiAgICAgICAgZGF0YS5ldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xuICAgIH1cbn1cblxuLyoqXG4gKiBAc2VlIGh0dHBzOi8vZG9tLnNwZWMud2hhdHdnLm9yZy8jaW50ZXJmYWNlLWV2ZW50XG4gKiBAcHJpdmF0ZVxuICovXG4vKipcbiAqIFRoZSBldmVudCB3cmFwcGVyLlxuICogQGNvbnN0cnVjdG9yXG4gKiBAcGFyYW0ge0V2ZW50VGFyZ2V0fSBldmVudFRhcmdldCBUaGUgZXZlbnQgdGFyZ2V0IG9mIHRoaXMgZGlzcGF0Y2hpbmcuXG4gKiBAcGFyYW0ge0V2ZW50fHt0eXBlOnN0cmluZ319IGV2ZW50IFRoZSBvcmlnaW5hbCBldmVudCB0byB3cmFwLlxuICovXG5mdW5jdGlvbiBFdmVudChldmVudFRhcmdldCwgZXZlbnQpIHtcbiAgICBwcml2YXRlRGF0YS5zZXQodGhpcywge1xuICAgICAgICBldmVudFRhcmdldCxcbiAgICAgICAgZXZlbnQsXG4gICAgICAgIGV2ZW50UGhhc2U6IDIsXG4gICAgICAgIGN1cnJlbnRUYXJnZXQ6IGV2ZW50VGFyZ2V0LFxuICAgICAgICBjYW5jZWxlZDogZmFsc2UsXG4gICAgICAgIHN0b3BwZWQ6IGZhbHNlLFxuICAgICAgICBpbW1lZGlhdGVTdG9wcGVkOiBmYWxzZSxcbiAgICAgICAgcGFzc2l2ZUxpc3RlbmVyOiBudWxsLFxuICAgICAgICB0aW1lU3RhbXA6IGV2ZW50LnRpbWVTdGFtcCB8fCBEYXRlLm5vdygpLFxuICAgIH0pO1xuXG4gICAgLy8gaHR0cHM6Ly9oZXljYW0uZ2l0aHViLmlvL3dlYmlkbC8jVW5mb3JnZWFibGVcbiAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkodGhpcywgXCJpc1RydXN0ZWRcIiwgeyB2YWx1ZTogZmFsc2UsIGVudW1lcmFibGU6IHRydWUgfSk7XG5cbiAgICAvLyBEZWZpbmUgYWNjZXNzb3JzXG4gICAgY29uc3Qga2V5cyA9IE9iamVjdC5rZXlzKGV2ZW50KTtcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IGtleXMubGVuZ3RoOyArK2kpIHtcbiAgICAgICAgY29uc3Qga2V5ID0ga2V5c1tpXTtcbiAgICAgICAgaWYgKCEoa2V5IGluIHRoaXMpKSB7XG4gICAgICAgICAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkodGhpcywga2V5LCBkZWZpbmVSZWRpcmVjdERlc2NyaXB0b3Ioa2V5KSk7XG4gICAgICAgIH1cbiAgICB9XG59XG5cbi8vIFNob3VsZCBiZSBlbnVtZXJhYmxlLCBidXQgY2xhc3MgbWV0aG9kcyBhcmUgbm90IGVudW1lcmFibGUuXG5FdmVudC5wcm90b3R5cGUgPSB7XG4gICAgLyoqXG4gICAgICogVGhlIHR5cGUgb2YgdGhpcyBldmVudC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqL1xuICAgIGdldCB0eXBlKCkge1xuICAgICAgICByZXR1cm4gcGQodGhpcykuZXZlbnQudHlwZVxuICAgIH0sXG5cbiAgICAvKipcbiAgICAgKiBUaGUgdGFyZ2V0IG9mIHRoaXMgZXZlbnQuXG4gICAgICogQHR5cGUge0V2ZW50VGFyZ2V0fVxuICAgICAqL1xuICAgIGdldCB0YXJnZXQoKSB7XG4gICAgICAgIHJldHVybiBwZCh0aGlzKS5ldmVudFRhcmdldFxuICAgIH0sXG5cbiAgICAvKipcbiAgICAgKiBUaGUgdGFyZ2V0IG9mIHRoaXMgZXZlbnQuXG4gICAgICogQHR5cGUge0V2ZW50VGFyZ2V0fVxuICAgICAqL1xuICAgIGdldCBjdXJyZW50VGFyZ2V0KCkge1xuICAgICAgICByZXR1cm4gcGQodGhpcykuY3VycmVudFRhcmdldFxuICAgIH0sXG5cbiAgICAvKipcbiAgICAgKiBAcmV0dXJucyB7RXZlbnRUYXJnZXRbXX0gVGhlIGNvbXBvc2VkIHBhdGggb2YgdGhpcyBldmVudC5cbiAgICAgKi9cbiAgICBjb21wb3NlZFBhdGgoKSB7XG4gICAgICAgIGNvbnN0IGN1cnJlbnRUYXJnZXQgPSBwZCh0aGlzKS5jdXJyZW50VGFyZ2V0O1xuICAgICAgICBpZiAoY3VycmVudFRhcmdldCA9PSBudWxsKSB7XG4gICAgICAgICAgICByZXR1cm4gW11cbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gW2N1cnJlbnRUYXJnZXRdXG4gICAgfSxcblxuICAgIC8qKlxuICAgICAqIENvbnN0YW50IG9mIE5PTkUuXG4gICAgICogQHR5cGUge251bWJlcn1cbiAgICAgKi9cbiAgICBnZXQgTk9ORSgpIHtcbiAgICAgICAgcmV0dXJuIDBcbiAgICB9LFxuXG4gICAgLyoqXG4gICAgICogQ29uc3RhbnQgb2YgQ0FQVFVSSU5HX1BIQVNFLlxuICAgICAqIEB0eXBlIHtudW1iZXJ9XG4gICAgICovXG4gICAgZ2V0IENBUFRVUklOR19QSEFTRSgpIHtcbiAgICAgICAgcmV0dXJuIDFcbiAgICB9LFxuXG4gICAgLyoqXG4gICAgICogQ29uc3RhbnQgb2YgQVRfVEFSR0VULlxuICAgICAqIEB0eXBlIHtudW1iZXJ9XG4gICAgICovXG4gICAgZ2V0IEFUX1RBUkdFVCgpIHtcbiAgICAgICAgcmV0dXJuIDJcbiAgICB9LFxuXG4gICAgLyoqXG4gICAgICogQ29uc3RhbnQgb2YgQlVCQkxJTkdfUEhBU0UuXG4gICAgICogQHR5cGUge251bWJlcn1cbiAgICAgKi9cbiAgICBnZXQgQlVCQkxJTkdfUEhBU0UoKSB7XG4gICAgICAgIHJldHVybiAzXG4gICAgfSxcblxuICAgIC8qKlxuICAgICAqIFRoZSB0YXJnZXQgb2YgdGhpcyBldmVudC5cbiAgICAgKiBAdHlwZSB7bnVtYmVyfVxuICAgICAqL1xuICAgIGdldCBldmVudFBoYXNlKCkge1xuICAgICAgICByZXR1cm4gcGQodGhpcykuZXZlbnRQaGFzZVxuICAgIH0sXG5cbiAgICAvKipcbiAgICAgKiBTdG9wIGV2ZW50IGJ1YmJsaW5nLlxuICAgICAqIEByZXR1cm5zIHt2b2lkfVxuICAgICAqL1xuICAgIHN0b3BQcm9wYWdhdGlvbigpIHtcbiAgICAgICAgY29uc3QgZGF0YSA9IHBkKHRoaXMpO1xuXG4gICAgICAgIGRhdGEuc3RvcHBlZCA9IHRydWU7XG4gICAgICAgIGlmICh0eXBlb2YgZGF0YS5ldmVudC5zdG9wUHJvcGFnYXRpb24gPT09IFwiZnVuY3Rpb25cIikge1xuICAgICAgICAgICAgZGF0YS5ldmVudC5zdG9wUHJvcGFnYXRpb24oKTtcbiAgICAgICAgfVxuICAgIH0sXG5cbiAgICAvKipcbiAgICAgKiBTdG9wIGV2ZW50IGJ1YmJsaW5nLlxuICAgICAqIEByZXR1cm5zIHt2b2lkfVxuICAgICAqL1xuICAgIHN0b3BJbW1lZGlhdGVQcm9wYWdhdGlvbigpIHtcbiAgICAgICAgY29uc3QgZGF0YSA9IHBkKHRoaXMpO1xuXG4gICAgICAgIGRhdGEuc3RvcHBlZCA9IHRydWU7XG4gICAgICAgIGRhdGEuaW1tZWRpYXRlU3RvcHBlZCA9IHRydWU7XG4gICAgICAgIGlmICh0eXBlb2YgZGF0YS5ldmVudC5zdG9wSW1tZWRpYXRlUHJvcGFnYXRpb24gPT09IFwiZnVuY3Rpb25cIikge1xuICAgICAgICAgICAgZGF0YS5ldmVudC5zdG9wSW1tZWRpYXRlUHJvcGFnYXRpb24oKTtcbiAgICAgICAgfVxuICAgIH0sXG5cbiAgICAvKipcbiAgICAgKiBUaGUgZmxhZyB0byBiZSBidWJibGluZy5cbiAgICAgKiBAdHlwZSB7Ym9vbGVhbn1cbiAgICAgKi9cbiAgICBnZXQgYnViYmxlcygpIHtcbiAgICAgICAgcmV0dXJuIEJvb2xlYW4ocGQodGhpcykuZXZlbnQuYnViYmxlcylcbiAgICB9LFxuXG4gICAgLyoqXG4gICAgICogVGhlIGZsYWcgdG8gYmUgY2FuY2VsYWJsZS5cbiAgICAgKiBAdHlwZSB7Ym9vbGVhbn1cbiAgICAgKi9cbiAgICBnZXQgY2FuY2VsYWJsZSgpIHtcbiAgICAgICAgcmV0dXJuIEJvb2xlYW4ocGQodGhpcykuZXZlbnQuY2FuY2VsYWJsZSlcbiAgICB9LFxuXG4gICAgLyoqXG4gICAgICogQ2FuY2VsIHRoaXMgZXZlbnQuXG4gICAgICogQHJldHVybnMge3ZvaWR9XG4gICAgICovXG4gICAgcHJldmVudERlZmF1bHQoKSB7XG4gICAgICAgIHNldENhbmNlbEZsYWcocGQodGhpcykpO1xuICAgIH0sXG5cbiAgICAvKipcbiAgICAgKiBUaGUgZmxhZyB0byBpbmRpY2F0ZSBjYW5jZWxsYXRpb24gc3RhdGUuXG4gICAgICogQHR5cGUge2Jvb2xlYW59XG4gICAgICovXG4gICAgZ2V0IGRlZmF1bHRQcmV2ZW50ZWQoKSB7XG4gICAgICAgIHJldHVybiBwZCh0aGlzKS5jYW5jZWxlZFxuICAgIH0sXG5cbiAgICAvKipcbiAgICAgKiBUaGUgZmxhZyB0byBiZSBjb21wb3NlZC5cbiAgICAgKiBAdHlwZSB7Ym9vbGVhbn1cbiAgICAgKi9cbiAgICBnZXQgY29tcG9zZWQoKSB7XG4gICAgICAgIHJldHVybiBCb29sZWFuKHBkKHRoaXMpLmV2ZW50LmNvbXBvc2VkKVxuICAgIH0sXG5cbiAgICAvKipcbiAgICAgKiBUaGUgdW5peCB0aW1lIG9mIHRoaXMgZXZlbnQuXG4gICAgICogQHR5cGUge251bWJlcn1cbiAgICAgKi9cbiAgICBnZXQgdGltZVN0YW1wKCkge1xuICAgICAgICByZXR1cm4gcGQodGhpcykudGltZVN0YW1wXG4gICAgfSxcblxuICAgIC8qKlxuICAgICAqIFRoZSB0YXJnZXQgb2YgdGhpcyBldmVudC5cbiAgICAgKiBAdHlwZSB7RXZlbnRUYXJnZXR9XG4gICAgICogQGRlcHJlY2F0ZWRcbiAgICAgKi9cbiAgICBnZXQgc3JjRWxlbWVudCgpIHtcbiAgICAgICAgcmV0dXJuIHBkKHRoaXMpLmV2ZW50VGFyZ2V0XG4gICAgfSxcblxuICAgIC8qKlxuICAgICAqIFRoZSBmbGFnIHRvIHN0b3AgZXZlbnQgYnViYmxpbmcuXG4gICAgICogQHR5cGUge2Jvb2xlYW59XG4gICAgICogQGRlcHJlY2F0ZWRcbiAgICAgKi9cbiAgICBnZXQgY2FuY2VsQnViYmxlKCkge1xuICAgICAgICByZXR1cm4gcGQodGhpcykuc3RvcHBlZFxuICAgIH0sXG4gICAgc2V0IGNhbmNlbEJ1YmJsZSh2YWx1ZSkge1xuICAgICAgICBpZiAoIXZhbHVlKSB7XG4gICAgICAgICAgICByZXR1cm5cbiAgICAgICAgfVxuICAgICAgICBjb25zdCBkYXRhID0gcGQodGhpcyk7XG5cbiAgICAgICAgZGF0YS5zdG9wcGVkID0gdHJ1ZTtcbiAgICAgICAgaWYgKHR5cGVvZiBkYXRhLmV2ZW50LmNhbmNlbEJ1YmJsZSA9PT0gXCJib29sZWFuXCIpIHtcbiAgICAgICAgICAgIGRhdGEuZXZlbnQuY2FuY2VsQnViYmxlID0gdHJ1ZTtcbiAgICAgICAgfVxuICAgIH0sXG5cbiAgICAvKipcbiAgICAgKiBUaGUgZmxhZyB0byBpbmRpY2F0ZSBjYW5jZWxsYXRpb24gc3RhdGUuXG4gICAgICogQHR5cGUge2Jvb2xlYW59XG4gICAgICogQGRlcHJlY2F0ZWRcbiAgICAgKi9cbiAgICBnZXQgcmV0dXJuVmFsdWUoKSB7XG4gICAgICAgIHJldHVybiAhcGQodGhpcykuY2FuY2VsZWRcbiAgICB9LFxuICAgIHNldCByZXR1cm5WYWx1ZSh2YWx1ZSkge1xuICAgICAgICBpZiAoIXZhbHVlKSB7XG4gICAgICAgICAgICBzZXRDYW5jZWxGbGFnKHBkKHRoaXMpKTtcbiAgICAgICAgfVxuICAgIH0sXG5cbiAgICAvKipcbiAgICAgKiBJbml0aWFsaXplIHRoaXMgZXZlbnQgb2JqZWN0LiBCdXQgZG8gbm90aGluZyB1bmRlciBldmVudCBkaXNwYXRjaGluZy5cbiAgICAgKiBAcGFyYW0ge3N0cmluZ30gdHlwZSBUaGUgZXZlbnQgdHlwZS5cbiAgICAgKiBAcGFyYW0ge2Jvb2xlYW59IFtidWJibGVzPWZhbHNlXSBUaGUgZmxhZyB0byBiZSBwb3NzaWJsZSB0byBidWJibGUgdXAuXG4gICAgICogQHBhcmFtIHtib29sZWFufSBbY2FuY2VsYWJsZT1mYWxzZV0gVGhlIGZsYWcgdG8gYmUgcG9zc2libGUgdG8gY2FuY2VsLlxuICAgICAqIEBkZXByZWNhdGVkXG4gICAgICovXG4gICAgaW5pdEV2ZW50KCkge1xuICAgICAgICAvLyBEbyBub3RoaW5nLlxuICAgIH0sXG59O1xuXG4vLyBgY29uc3RydWN0b3JgIGlzIG5vdCBlbnVtZXJhYmxlLlxuT2JqZWN0LmRlZmluZVByb3BlcnR5KEV2ZW50LnByb3RvdHlwZSwgXCJjb25zdHJ1Y3RvclwiLCB7XG4gICAgdmFsdWU6IEV2ZW50LFxuICAgIGNvbmZpZ3VyYWJsZTogdHJ1ZSxcbiAgICB3cml0YWJsZTogdHJ1ZSxcbn0pO1xuXG4vLyBFbnN1cmUgYGV2ZW50IGluc3RhbmNlb2Ygd2luZG93LkV2ZW50YCBpcyBgdHJ1ZWAuXG5pZiAodHlwZW9mIHdpbmRvdyAhPT0gXCJ1bmRlZmluZWRcIiAmJiB0eXBlb2Ygd2luZG93LkV2ZW50ICE9PSBcInVuZGVmaW5lZFwiKSB7XG4gICAgT2JqZWN0LnNldFByb3RvdHlwZU9mKEV2ZW50LnByb3RvdHlwZSwgd2luZG93LkV2ZW50LnByb3RvdHlwZSk7XG5cbiAgICAvLyBNYWtlIGFzc29jaWF0aW9uIGZvciB3cmFwcGVycy5cbiAgICB3cmFwcGVycy5zZXQod2luZG93LkV2ZW50LnByb3RvdHlwZSwgRXZlbnQpO1xufVxuXG4vKipcbiAqIEdldCB0aGUgcHJvcGVydHkgZGVzY3JpcHRvciB0byByZWRpcmVjdCBhIGdpdmVuIHByb3BlcnR5LlxuICogQHBhcmFtIHtzdHJpbmd9IGtleSBQcm9wZXJ0eSBuYW1lIHRvIGRlZmluZSBwcm9wZXJ0eSBkZXNjcmlwdG9yLlxuICogQHJldHVybnMge1Byb3BlcnR5RGVzY3JpcHRvcn0gVGhlIHByb3BlcnR5IGRlc2NyaXB0b3IgdG8gcmVkaXJlY3QgdGhlIHByb3BlcnR5LlxuICogQHByaXZhdGVcbiAqL1xuZnVuY3Rpb24gZGVmaW5lUmVkaXJlY3REZXNjcmlwdG9yKGtleSkge1xuICAgIHJldHVybiB7XG4gICAgICAgIGdldCgpIHtcbiAgICAgICAgICAgIHJldHVybiBwZCh0aGlzKS5ldmVudFtrZXldXG4gICAgICAgIH0sXG4gICAgICAgIHNldCh2YWx1ZSkge1xuICAgICAgICAgICAgcGQodGhpcykuZXZlbnRba2V5XSA9IHZhbHVlO1xuICAgICAgICB9LFxuICAgICAgICBjb25maWd1cmFibGU6IHRydWUsXG4gICAgICAgIGVudW1lcmFibGU6IHRydWUsXG4gICAgfVxufVxuXG4vKipcbiAqIEdldCB0aGUgcHJvcGVydHkgZGVzY3JpcHRvciB0byBjYWxsIGEgZ2l2ZW4gbWV0aG9kIHByb3BlcnR5LlxuICogQHBhcmFtIHtzdHJpbmd9IGtleSBQcm9wZXJ0eSBuYW1lIHRvIGRlZmluZSBwcm9wZXJ0eSBkZXNjcmlwdG9yLlxuICogQHJldHVybnMge1Byb3BlcnR5RGVzY3JpcHRvcn0gVGhlIHByb3BlcnR5IGRlc2NyaXB0b3IgdG8gY2FsbCB0aGUgbWV0aG9kIHByb3BlcnR5LlxuICogQHByaXZhdGVcbiAqL1xuZnVuY3Rpb24gZGVmaW5lQ2FsbERlc2NyaXB0b3Ioa2V5KSB7XG4gICAgcmV0dXJuIHtcbiAgICAgICAgdmFsdWUoKSB7XG4gICAgICAgICAgICBjb25zdCBldmVudCA9IHBkKHRoaXMpLmV2ZW50O1xuICAgICAgICAgICAgcmV0dXJuIGV2ZW50W2tleV0uYXBwbHkoZXZlbnQsIGFyZ3VtZW50cylcbiAgICAgICAgfSxcbiAgICAgICAgY29uZmlndXJhYmxlOiB0cnVlLFxuICAgICAgICBlbnVtZXJhYmxlOiB0cnVlLFxuICAgIH1cbn1cblxuLyoqXG4gKiBEZWZpbmUgbmV3IHdyYXBwZXIgY2xhc3MuXG4gKiBAcGFyYW0ge0Z1bmN0aW9ufSBCYXNlRXZlbnQgVGhlIGJhc2Ugd3JhcHBlciBjbGFzcy5cbiAqIEBwYXJhbSB7T2JqZWN0fSBwcm90byBUaGUgcHJvdG90eXBlIG9mIHRoZSBvcmlnaW5hbCBldmVudC5cbiAqIEByZXR1cm5zIHtGdW5jdGlvbn0gVGhlIGRlZmluZWQgd3JhcHBlciBjbGFzcy5cbiAqIEBwcml2YXRlXG4gKi9cbmZ1bmN0aW9uIGRlZmluZVdyYXBwZXIoQmFzZUV2ZW50LCBwcm90bykge1xuICAgIGNvbnN0IGtleXMgPSBPYmplY3Qua2V5cyhwcm90byk7XG4gICAgaWYgKGtleXMubGVuZ3RoID09PSAwKSB7XG4gICAgICAgIHJldHVybiBCYXNlRXZlbnRcbiAgICB9XG5cbiAgICAvKiogQ3VzdG9tRXZlbnQgKi9cbiAgICBmdW5jdGlvbiBDdXN0b21FdmVudChldmVudFRhcmdldCwgZXZlbnQpIHtcbiAgICAgICAgQmFzZUV2ZW50LmNhbGwodGhpcywgZXZlbnRUYXJnZXQsIGV2ZW50KTtcbiAgICB9XG5cbiAgICBDdXN0b21FdmVudC5wcm90b3R5cGUgPSBPYmplY3QuY3JlYXRlKEJhc2VFdmVudC5wcm90b3R5cGUsIHtcbiAgICAgICAgY29uc3RydWN0b3I6IHsgdmFsdWU6IEN1c3RvbUV2ZW50LCBjb25maWd1cmFibGU6IHRydWUsIHdyaXRhYmxlOiB0cnVlIH0sXG4gICAgfSk7XG5cbiAgICAvLyBEZWZpbmUgYWNjZXNzb3JzLlxuICAgIGZvciAobGV0IGkgPSAwOyBpIDwga2V5cy5sZW5ndGg7ICsraSkge1xuICAgICAgICBjb25zdCBrZXkgPSBrZXlzW2ldO1xuICAgICAgICBpZiAoIShrZXkgaW4gQmFzZUV2ZW50LnByb3RvdHlwZSkpIHtcbiAgICAgICAgICAgIGNvbnN0IGRlc2NyaXB0b3IgPSBPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKHByb3RvLCBrZXkpO1xuICAgICAgICAgICAgY29uc3QgaXNGdW5jID0gdHlwZW9mIGRlc2NyaXB0b3IudmFsdWUgPT09IFwiZnVuY3Rpb25cIjtcbiAgICAgICAgICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShcbiAgICAgICAgICAgICAgICBDdXN0b21FdmVudC5wcm90b3R5cGUsXG4gICAgICAgICAgICAgICAga2V5LFxuICAgICAgICAgICAgICAgIGlzRnVuY1xuICAgICAgICAgICAgICAgICAgICA/IGRlZmluZUNhbGxEZXNjcmlwdG9yKGtleSlcbiAgICAgICAgICAgICAgICAgICAgOiBkZWZpbmVSZWRpcmVjdERlc2NyaXB0b3Ioa2V5KVxuICAgICAgICAgICAgKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiBDdXN0b21FdmVudFxufVxuXG4vKipcbiAqIEdldCB0aGUgd3JhcHBlciBjbGFzcyBvZiBhIGdpdmVuIHByb3RvdHlwZS5cbiAqIEBwYXJhbSB7T2JqZWN0fSBwcm90byBUaGUgcHJvdG90eXBlIG9mIHRoZSBvcmlnaW5hbCBldmVudCB0byBnZXQgaXRzIHdyYXBwZXIuXG4gKiBAcmV0dXJucyB7RnVuY3Rpb259IFRoZSB3cmFwcGVyIGNsYXNzLlxuICogQHByaXZhdGVcbiAqL1xuZnVuY3Rpb24gZ2V0V3JhcHBlcihwcm90bykge1xuICAgIGlmIChwcm90byA9PSBudWxsIHx8IHByb3RvID09PSBPYmplY3QucHJvdG90eXBlKSB7XG4gICAgICAgIHJldHVybiBFdmVudFxuICAgIH1cblxuICAgIGxldCB3cmFwcGVyID0gd3JhcHBlcnMuZ2V0KHByb3RvKTtcbiAgICBpZiAod3JhcHBlciA9PSBudWxsKSB7XG4gICAgICAgIHdyYXBwZXIgPSBkZWZpbmVXcmFwcGVyKGdldFdyYXBwZXIoT2JqZWN0LmdldFByb3RvdHlwZU9mKHByb3RvKSksIHByb3RvKTtcbiAgICAgICAgd3JhcHBlcnMuc2V0KHByb3RvLCB3cmFwcGVyKTtcbiAgICB9XG4gICAgcmV0dXJuIHdyYXBwZXJcbn1cblxuLyoqXG4gKiBXcmFwIGEgZ2l2ZW4gZXZlbnQgdG8gbWFuYWdlbWVudCBhIGRpc3BhdGNoaW5nLlxuICogQHBhcmFtIHtFdmVudFRhcmdldH0gZXZlbnRUYXJnZXQgVGhlIGV2ZW50IHRhcmdldCBvZiB0aGlzIGRpc3BhdGNoaW5nLlxuICogQHBhcmFtIHtPYmplY3R9IGV2ZW50IFRoZSBldmVudCB0byB3cmFwLlxuICogQHJldHVybnMge0V2ZW50fSBUaGUgd3JhcHBlciBpbnN0YW5jZS5cbiAqIEBwcml2YXRlXG4gKi9cbmZ1bmN0aW9uIHdyYXBFdmVudChldmVudFRhcmdldCwgZXZlbnQpIHtcbiAgICBjb25zdCBXcmFwcGVyID0gZ2V0V3JhcHBlcihPYmplY3QuZ2V0UHJvdG90eXBlT2YoZXZlbnQpKTtcbiAgICByZXR1cm4gbmV3IFdyYXBwZXIoZXZlbnRUYXJnZXQsIGV2ZW50KVxufVxuXG4vKipcbiAqIEdldCB0aGUgaW1tZWRpYXRlU3RvcHBlZCBmbGFnIG9mIGEgZ2l2ZW4gZXZlbnQuXG4gKiBAcGFyYW0ge0V2ZW50fSBldmVudCBUaGUgZXZlbnQgdG8gZ2V0LlxuICogQHJldHVybnMge2Jvb2xlYW59IFRoZSBmbGFnIHRvIHN0b3AgcHJvcGFnYXRpb24gaW1tZWRpYXRlbHkuXG4gKiBAcHJpdmF0ZVxuICovXG5mdW5jdGlvbiBpc1N0b3BwZWQoZXZlbnQpIHtcbiAgICByZXR1cm4gcGQoZXZlbnQpLmltbWVkaWF0ZVN0b3BwZWRcbn1cblxuLyoqXG4gKiBTZXQgdGhlIGN1cnJlbnQgZXZlbnQgcGhhc2Ugb2YgYSBnaXZlbiBldmVudC5cbiAqIEBwYXJhbSB7RXZlbnR9IGV2ZW50IFRoZSBldmVudCB0byBzZXQgY3VycmVudCB0YXJnZXQuXG4gKiBAcGFyYW0ge251bWJlcn0gZXZlbnRQaGFzZSBOZXcgZXZlbnQgcGhhc2UuXG4gKiBAcmV0dXJucyB7dm9pZH1cbiAqIEBwcml2YXRlXG4gKi9cbmZ1bmN0aW9uIHNldEV2ZW50UGhhc2UoZXZlbnQsIGV2ZW50UGhhc2UpIHtcbiAgICBwZChldmVudCkuZXZlbnRQaGFzZSA9IGV2ZW50UGhhc2U7XG59XG5cbi8qKlxuICogU2V0IHRoZSBjdXJyZW50IHRhcmdldCBvZiBhIGdpdmVuIGV2ZW50LlxuICogQHBhcmFtIHtFdmVudH0gZXZlbnQgVGhlIGV2ZW50IHRvIHNldCBjdXJyZW50IHRhcmdldC5cbiAqIEBwYXJhbSB7RXZlbnRUYXJnZXR8bnVsbH0gY3VycmVudFRhcmdldCBOZXcgY3VycmVudCB0YXJnZXQuXG4gKiBAcmV0dXJucyB7dm9pZH1cbiAqIEBwcml2YXRlXG4gKi9cbmZ1bmN0aW9uIHNldEN1cnJlbnRUYXJnZXQoZXZlbnQsIGN1cnJlbnRUYXJnZXQpIHtcbiAgICBwZChldmVudCkuY3VycmVudFRhcmdldCA9IGN1cnJlbnRUYXJnZXQ7XG59XG5cbi8qKlxuICogU2V0IGEgcGFzc2l2ZSBsaXN0ZW5lciBvZiBhIGdpdmVuIGV2ZW50LlxuICogQHBhcmFtIHtFdmVudH0gZXZlbnQgVGhlIGV2ZW50IHRvIHNldCBjdXJyZW50IHRhcmdldC5cbiAqIEBwYXJhbSB7RnVuY3Rpb258bnVsbH0gcGFzc2l2ZUxpc3RlbmVyIE5ldyBwYXNzaXZlIGxpc3RlbmVyLlxuICogQHJldHVybnMge3ZvaWR9XG4gKiBAcHJpdmF0ZVxuICovXG5mdW5jdGlvbiBzZXRQYXNzaXZlTGlzdGVuZXIoZXZlbnQsIHBhc3NpdmVMaXN0ZW5lcikge1xuICAgIHBkKGV2ZW50KS5wYXNzaXZlTGlzdGVuZXIgPSBwYXNzaXZlTGlzdGVuZXI7XG59XG5cbi8qKlxuICogQHR5cGVkZWYge29iamVjdH0gTGlzdGVuZXJOb2RlXG4gKiBAcHJvcGVydHkge0Z1bmN0aW9ufSBsaXN0ZW5lclxuICogQHByb3BlcnR5IHsxfDJ8M30gbGlzdGVuZXJUeXBlXG4gKiBAcHJvcGVydHkge2Jvb2xlYW59IHBhc3NpdmVcbiAqIEBwcm9wZXJ0eSB7Ym9vbGVhbn0gb25jZVxuICogQHByb3BlcnR5IHtMaXN0ZW5lck5vZGV8bnVsbH0gbmV4dFxuICogQHByaXZhdGVcbiAqL1xuXG4vKipcbiAqIEB0eXBlIHtXZWFrTWFwPG9iamVjdCwgTWFwPHN0cmluZywgTGlzdGVuZXJOb2RlPj59XG4gKiBAcHJpdmF0ZVxuICovXG5jb25zdCBsaXN0ZW5lcnNNYXAgPSBuZXcgV2Vha01hcCgpO1xuXG4vLyBMaXN0ZW5lciB0eXBlc1xuY29uc3QgQ0FQVFVSRSA9IDE7XG5jb25zdCBCVUJCTEUgPSAyO1xuY29uc3QgQVRUUklCVVRFID0gMztcblxuLyoqXG4gKiBDaGVjayB3aGV0aGVyIGEgZ2l2ZW4gdmFsdWUgaXMgYW4gb2JqZWN0IG9yIG5vdC5cbiAqIEBwYXJhbSB7YW55fSB4IFRoZSB2YWx1ZSB0byBjaGVjay5cbiAqIEByZXR1cm5zIHtib29sZWFufSBgdHJ1ZWAgaWYgdGhlIHZhbHVlIGlzIGFuIG9iamVjdC5cbiAqL1xuZnVuY3Rpb24gaXNPYmplY3QoeCkge1xuICAgIHJldHVybiB4ICE9PSBudWxsICYmIHR5cGVvZiB4ID09PSBcIm9iamVjdFwiIC8vZXNsaW50LWRpc2FibGUtbGluZSBuby1yZXN0cmljdGVkLXN5bnRheFxufVxuXG4vKipcbiAqIEdldCBsaXN0ZW5lcnMuXG4gKiBAcGFyYW0ge0V2ZW50VGFyZ2V0fSBldmVudFRhcmdldCBUaGUgZXZlbnQgdGFyZ2V0IHRvIGdldC5cbiAqIEByZXR1cm5zIHtNYXA8c3RyaW5nLCBMaXN0ZW5lck5vZGU+fSBUaGUgbGlzdGVuZXJzLlxuICogQHByaXZhdGVcbiAqL1xuZnVuY3Rpb24gZ2V0TGlzdGVuZXJzKGV2ZW50VGFyZ2V0KSB7XG4gICAgY29uc3QgbGlzdGVuZXJzID0gbGlzdGVuZXJzTWFwLmdldChldmVudFRhcmdldCk7XG4gICAgaWYgKGxpc3RlbmVycyA9PSBudWxsKSB7XG4gICAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoXG4gICAgICAgICAgICBcIid0aGlzJyBpcyBleHBlY3RlZCBhbiBFdmVudFRhcmdldCBvYmplY3QsIGJ1dCBnb3QgYW5vdGhlciB2YWx1ZS5cIlxuICAgICAgICApXG4gICAgfVxuICAgIHJldHVybiBsaXN0ZW5lcnNcbn1cblxuLyoqXG4gKiBHZXQgdGhlIHByb3BlcnR5IGRlc2NyaXB0b3IgZm9yIHRoZSBldmVudCBhdHRyaWJ1dGUgb2YgYSBnaXZlbiBldmVudC5cbiAqIEBwYXJhbSB7c3RyaW5nfSBldmVudE5hbWUgVGhlIGV2ZW50IG5hbWUgdG8gZ2V0IHByb3BlcnR5IGRlc2NyaXB0b3IuXG4gKiBAcmV0dXJucyB7UHJvcGVydHlEZXNjcmlwdG9yfSBUaGUgcHJvcGVydHkgZGVzY3JpcHRvci5cbiAqIEBwcml2YXRlXG4gKi9cbmZ1bmN0aW9uIGRlZmluZUV2ZW50QXR0cmlidXRlRGVzY3JpcHRvcihldmVudE5hbWUpIHtcbiAgICByZXR1cm4ge1xuICAgICAgICBnZXQoKSB7XG4gICAgICAgICAgICBjb25zdCBsaXN0ZW5lcnMgPSBnZXRMaXN0ZW5lcnModGhpcyk7XG4gICAgICAgICAgICBsZXQgbm9kZSA9IGxpc3RlbmVycy5nZXQoZXZlbnROYW1lKTtcbiAgICAgICAgICAgIHdoaWxlIChub2RlICE9IG51bGwpIHtcbiAgICAgICAgICAgICAgICBpZiAobm9kZS5saXN0ZW5lclR5cGUgPT09IEFUVFJJQlVURSkge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gbm9kZS5saXN0ZW5lclxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBub2RlID0gbm9kZS5uZXh0O1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIG51bGxcbiAgICAgICAgfSxcblxuICAgICAgICBzZXQobGlzdGVuZXIpIHtcbiAgICAgICAgICAgIGlmICh0eXBlb2YgbGlzdGVuZXIgIT09IFwiZnVuY3Rpb25cIiAmJiAhaXNPYmplY3QobGlzdGVuZXIpKSB7XG4gICAgICAgICAgICAgICAgbGlzdGVuZXIgPSBudWxsOyAvLyBlc2xpbnQtZGlzYWJsZS1saW5lIG5vLXBhcmFtLXJlYXNzaWduXG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBjb25zdCBsaXN0ZW5lcnMgPSBnZXRMaXN0ZW5lcnModGhpcyk7XG5cbiAgICAgICAgICAgIC8vIFRyYXZlcnNlIHRvIHRoZSB0YWlsIHdoaWxlIHJlbW92aW5nIG9sZCB2YWx1ZS5cbiAgICAgICAgICAgIGxldCBwcmV2ID0gbnVsbDtcbiAgICAgICAgICAgIGxldCBub2RlID0gbGlzdGVuZXJzLmdldChldmVudE5hbWUpO1xuICAgICAgICAgICAgd2hpbGUgKG5vZGUgIT0gbnVsbCkge1xuICAgICAgICAgICAgICAgIGlmIChub2RlLmxpc3RlbmVyVHlwZSA9PT0gQVRUUklCVVRFKSB7XG4gICAgICAgICAgICAgICAgICAgIC8vIFJlbW92ZSBvbGQgdmFsdWUuXG4gICAgICAgICAgICAgICAgICAgIGlmIChwcmV2ICE9PSBudWxsKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBwcmV2Lm5leHQgPSBub2RlLm5leHQ7XG4gICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAobm9kZS5uZXh0ICE9PSBudWxsKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBsaXN0ZW5lcnMuc2V0KGV2ZW50TmFtZSwgbm9kZS5uZXh0KTtcbiAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGxpc3RlbmVycy5kZWxldGUoZXZlbnROYW1lKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIHByZXYgPSBub2RlO1xuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgIG5vZGUgPSBub2RlLm5leHQ7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIC8vIEFkZCBuZXcgdmFsdWUuXG4gICAgICAgICAgICBpZiAobGlzdGVuZXIgIT09IG51bGwpIHtcbiAgICAgICAgICAgICAgICBjb25zdCBuZXdOb2RlID0ge1xuICAgICAgICAgICAgICAgICAgICBsaXN0ZW5lcixcbiAgICAgICAgICAgICAgICAgICAgbGlzdGVuZXJUeXBlOiBBVFRSSUJVVEUsXG4gICAgICAgICAgICAgICAgICAgIHBhc3NpdmU6IGZhbHNlLFxuICAgICAgICAgICAgICAgICAgICBvbmNlOiBmYWxzZSxcbiAgICAgICAgICAgICAgICAgICAgbmV4dDogbnVsbCxcbiAgICAgICAgICAgICAgICB9O1xuICAgICAgICAgICAgICAgIGlmIChwcmV2ID09PSBudWxsKSB7XG4gICAgICAgICAgICAgICAgICAgIGxpc3RlbmVycy5zZXQoZXZlbnROYW1lLCBuZXdOb2RlKTtcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICBwcmV2Lm5leHQgPSBuZXdOb2RlO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfSxcbiAgICAgICAgY29uZmlndXJhYmxlOiB0cnVlLFxuICAgICAgICBlbnVtZXJhYmxlOiB0cnVlLFxuICAgIH1cbn1cblxuLyoqXG4gKiBEZWZpbmUgYW4gZXZlbnQgYXR0cmlidXRlIChlLmcuIGBldmVudFRhcmdldC5vbmNsaWNrYCkuXG4gKiBAcGFyYW0ge09iamVjdH0gZXZlbnRUYXJnZXRQcm90b3R5cGUgVGhlIGV2ZW50IHRhcmdldCBwcm90b3R5cGUgdG8gZGVmaW5lIGFuIGV2ZW50IGF0dHJiaXRlLlxuICogQHBhcmFtIHtzdHJpbmd9IGV2ZW50TmFtZSBUaGUgZXZlbnQgbmFtZSB0byBkZWZpbmUuXG4gKiBAcmV0dXJucyB7dm9pZH1cbiAqL1xuZnVuY3Rpb24gZGVmaW5lRXZlbnRBdHRyaWJ1dGUoZXZlbnRUYXJnZXRQcm90b3R5cGUsIGV2ZW50TmFtZSkge1xuICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShcbiAgICAgICAgZXZlbnRUYXJnZXRQcm90b3R5cGUsXG4gICAgICAgIGBvbiR7ZXZlbnROYW1lfWAsXG4gICAgICAgIGRlZmluZUV2ZW50QXR0cmlidXRlRGVzY3JpcHRvcihldmVudE5hbWUpXG4gICAgKTtcbn1cblxuLyoqXG4gKiBEZWZpbmUgYSBjdXN0b20gRXZlbnRUYXJnZXQgd2l0aCBldmVudCBhdHRyaWJ1dGVzLlxuICogQHBhcmFtIHtzdHJpbmdbXX0gZXZlbnROYW1lcyBFdmVudCBuYW1lcyBmb3IgZXZlbnQgYXR0cmlidXRlcy5cbiAqIEByZXR1cm5zIHtFdmVudFRhcmdldH0gVGhlIGN1c3RvbSBFdmVudFRhcmdldC5cbiAqIEBwcml2YXRlXG4gKi9cbmZ1bmN0aW9uIGRlZmluZUN1c3RvbUV2ZW50VGFyZ2V0KGV2ZW50TmFtZXMpIHtcbiAgICAvKiogQ3VzdG9tRXZlbnRUYXJnZXQgKi9cbiAgICBmdW5jdGlvbiBDdXN0b21FdmVudFRhcmdldCgpIHtcbiAgICAgICAgRXZlbnRUYXJnZXQuY2FsbCh0aGlzKTtcbiAgICB9XG5cbiAgICBDdXN0b21FdmVudFRhcmdldC5wcm90b3R5cGUgPSBPYmplY3QuY3JlYXRlKEV2ZW50VGFyZ2V0LnByb3RvdHlwZSwge1xuICAgICAgICBjb25zdHJ1Y3Rvcjoge1xuICAgICAgICAgICAgdmFsdWU6IEN1c3RvbUV2ZW50VGFyZ2V0LFxuICAgICAgICAgICAgY29uZmlndXJhYmxlOiB0cnVlLFxuICAgICAgICAgICAgd3JpdGFibGU6IHRydWUsXG4gICAgICAgIH0sXG4gICAgfSk7XG5cbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IGV2ZW50TmFtZXMubGVuZ3RoOyArK2kpIHtcbiAgICAgICAgZGVmaW5lRXZlbnRBdHRyaWJ1dGUoQ3VzdG9tRXZlbnRUYXJnZXQucHJvdG90eXBlLCBldmVudE5hbWVzW2ldKTtcbiAgICB9XG5cbiAgICByZXR1cm4gQ3VzdG9tRXZlbnRUYXJnZXRcbn1cblxuLyoqXG4gKiBFdmVudFRhcmdldC5cbiAqXG4gKiAtIFRoaXMgaXMgY29uc3RydWN0b3IgaWYgbm8gYXJndW1lbnRzLlxuICogLSBUaGlzIGlzIGEgZnVuY3Rpb24gd2hpY2ggcmV0dXJucyBhIEN1c3RvbUV2ZW50VGFyZ2V0IGNvbnN0cnVjdG9yIGlmIHRoZXJlIGFyZSBhcmd1bWVudHMuXG4gKlxuICogRm9yIGV4YW1wbGU6XG4gKlxuICogICAgIGNsYXNzIEEgZXh0ZW5kcyBFdmVudFRhcmdldCB7fVxuICogICAgIGNsYXNzIEIgZXh0ZW5kcyBFdmVudFRhcmdldChcIm1lc3NhZ2VcIikge31cbiAqICAgICBjbGFzcyBDIGV4dGVuZHMgRXZlbnRUYXJnZXQoXCJtZXNzYWdlXCIsIFwiZXJyb3JcIikge31cbiAqICAgICBjbGFzcyBEIGV4dGVuZHMgRXZlbnRUYXJnZXQoW1wibWVzc2FnZVwiLCBcImVycm9yXCJdKSB7fVxuICovXG5mdW5jdGlvbiBFdmVudFRhcmdldCgpIHtcbiAgICAvKmVzbGludC1kaXNhYmxlIGNvbnNpc3RlbnQtcmV0dXJuICovXG4gICAgaWYgKHRoaXMgaW5zdGFuY2VvZiBFdmVudFRhcmdldCkge1xuICAgICAgICBsaXN0ZW5lcnNNYXAuc2V0KHRoaXMsIG5ldyBNYXAoKSk7XG4gICAgICAgIHJldHVyblxuICAgIH1cbiAgICBpZiAoYXJndW1lbnRzLmxlbmd0aCA9PT0gMSAmJiBBcnJheS5pc0FycmF5KGFyZ3VtZW50c1swXSkpIHtcbiAgICAgICAgcmV0dXJuIGRlZmluZUN1c3RvbUV2ZW50VGFyZ2V0KGFyZ3VtZW50c1swXSlcbiAgICB9XG4gICAgaWYgKGFyZ3VtZW50cy5sZW5ndGggPiAwKSB7XG4gICAgICAgIGNvbnN0IHR5cGVzID0gbmV3IEFycmF5KGFyZ3VtZW50cy5sZW5ndGgpO1xuICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IGFyZ3VtZW50cy5sZW5ndGg7ICsraSkge1xuICAgICAgICAgICAgdHlwZXNbaV0gPSBhcmd1bWVudHNbaV07XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGRlZmluZUN1c3RvbUV2ZW50VGFyZ2V0KHR5cGVzKVxuICAgIH1cbiAgICB0aHJvdyBuZXcgVHlwZUVycm9yKFwiQ2Fubm90IGNhbGwgYSBjbGFzcyBhcyBhIGZ1bmN0aW9uXCIpXG4gICAgLyplc2xpbnQtZW5hYmxlIGNvbnNpc3RlbnQtcmV0dXJuICovXG59XG5cbi8vIFNob3VsZCBiZSBlbnVtZXJhYmxlLCBidXQgY2xhc3MgbWV0aG9kcyBhcmUgbm90IGVudW1lcmFibGUuXG5FdmVudFRhcmdldC5wcm90b3R5cGUgPSB7XG4gICAgLyoqXG4gICAgICogQWRkIGEgZ2l2ZW4gbGlzdGVuZXIgdG8gdGhpcyBldmVudCB0YXJnZXQuXG4gICAgICogQHBhcmFtIHtzdHJpbmd9IGV2ZW50TmFtZSBUaGUgZXZlbnQgbmFtZSB0byBhZGQuXG4gICAgICogQHBhcmFtIHtGdW5jdGlvbn0gbGlzdGVuZXIgVGhlIGxpc3RlbmVyIHRvIGFkZC5cbiAgICAgKiBAcGFyYW0ge2Jvb2xlYW58e2NhcHR1cmU/OmJvb2xlYW4scGFzc2l2ZT86Ym9vbGVhbixvbmNlPzpib29sZWFufX0gW29wdGlvbnNdIFRoZSBvcHRpb25zIGZvciB0aGlzIGxpc3RlbmVyLlxuICAgICAqIEByZXR1cm5zIHt2b2lkfVxuICAgICAqL1xuICAgIGFkZEV2ZW50TGlzdGVuZXIoZXZlbnROYW1lLCBsaXN0ZW5lciwgb3B0aW9ucykge1xuICAgICAgICBpZiAobGlzdGVuZXIgPT0gbnVsbCkge1xuICAgICAgICAgICAgcmV0dXJuXG4gICAgICAgIH1cbiAgICAgICAgaWYgKHR5cGVvZiBsaXN0ZW5lciAhPT0gXCJmdW5jdGlvblwiICYmICFpc09iamVjdChsaXN0ZW5lcikpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoXCInbGlzdGVuZXInIHNob3VsZCBiZSBhIGZ1bmN0aW9uIG9yIGFuIG9iamVjdC5cIilcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IGxpc3RlbmVycyA9IGdldExpc3RlbmVycyh0aGlzKTtcbiAgICAgICAgY29uc3Qgb3B0aW9uc0lzT2JqID0gaXNPYmplY3Qob3B0aW9ucyk7XG4gICAgICAgIGNvbnN0IGNhcHR1cmUgPSBvcHRpb25zSXNPYmpcbiAgICAgICAgICAgID8gQm9vbGVhbihvcHRpb25zLmNhcHR1cmUpXG4gICAgICAgICAgICA6IEJvb2xlYW4ob3B0aW9ucyk7XG4gICAgICAgIGNvbnN0IGxpc3RlbmVyVHlwZSA9IGNhcHR1cmUgPyBDQVBUVVJFIDogQlVCQkxFO1xuICAgICAgICBjb25zdCBuZXdOb2RlID0ge1xuICAgICAgICAgICAgbGlzdGVuZXIsXG4gICAgICAgICAgICBsaXN0ZW5lclR5cGUsXG4gICAgICAgICAgICBwYXNzaXZlOiBvcHRpb25zSXNPYmogJiYgQm9vbGVhbihvcHRpb25zLnBhc3NpdmUpLFxuICAgICAgICAgICAgb25jZTogb3B0aW9uc0lzT2JqICYmIEJvb2xlYW4ob3B0aW9ucy5vbmNlKSxcbiAgICAgICAgICAgIG5leHQ6IG51bGwsXG4gICAgICAgIH07XG5cbiAgICAgICAgLy8gU2V0IGl0IGFzIHRoZSBmaXJzdCBub2RlIGlmIHRoZSBmaXJzdCBub2RlIGlzIG51bGwuXG4gICAgICAgIGxldCBub2RlID0gbGlzdGVuZXJzLmdldChldmVudE5hbWUpO1xuICAgICAgICBpZiAobm9kZSA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICBsaXN0ZW5lcnMuc2V0KGV2ZW50TmFtZSwgbmV3Tm9kZSk7XG4gICAgICAgICAgICByZXR1cm5cbiAgICAgICAgfVxuXG4gICAgICAgIC8vIFRyYXZlcnNlIHRvIHRoZSB0YWlsIHdoaWxlIGNoZWNraW5nIGR1cGxpY2F0aW9uLi5cbiAgICAgICAgbGV0IHByZXYgPSBudWxsO1xuICAgICAgICB3aGlsZSAobm9kZSAhPSBudWxsKSB7XG4gICAgICAgICAgICBpZiAoXG4gICAgICAgICAgICAgICAgbm9kZS5saXN0ZW5lciA9PT0gbGlzdGVuZXIgJiZcbiAgICAgICAgICAgICAgICBub2RlLmxpc3RlbmVyVHlwZSA9PT0gbGlzdGVuZXJUeXBlXG4gICAgICAgICAgICApIHtcbiAgICAgICAgICAgICAgICAvLyBTaG91bGQgaWdub3JlIGR1cGxpY2F0aW9uLlxuICAgICAgICAgICAgICAgIHJldHVyblxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcHJldiA9IG5vZGU7XG4gICAgICAgICAgICBub2RlID0gbm9kZS5uZXh0O1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gQWRkIGl0LlxuICAgICAgICBwcmV2Lm5leHQgPSBuZXdOb2RlO1xuICAgIH0sXG5cbiAgICAvKipcbiAgICAgKiBSZW1vdmUgYSBnaXZlbiBsaXN0ZW5lciBmcm9tIHRoaXMgZXZlbnQgdGFyZ2V0LlxuICAgICAqIEBwYXJhbSB7c3RyaW5nfSBldmVudE5hbWUgVGhlIGV2ZW50IG5hbWUgdG8gcmVtb3ZlLlxuICAgICAqIEBwYXJhbSB7RnVuY3Rpb259IGxpc3RlbmVyIFRoZSBsaXN0ZW5lciB0byByZW1vdmUuXG4gICAgICogQHBhcmFtIHtib29sZWFufHtjYXB0dXJlPzpib29sZWFuLHBhc3NpdmU/OmJvb2xlYW4sb25jZT86Ym9vbGVhbn19IFtvcHRpb25zXSBUaGUgb3B0aW9ucyBmb3IgdGhpcyBsaXN0ZW5lci5cbiAgICAgKiBAcmV0dXJucyB7dm9pZH1cbiAgICAgKi9cbiAgICByZW1vdmVFdmVudExpc3RlbmVyKGV2ZW50TmFtZSwgbGlzdGVuZXIsIG9wdGlvbnMpIHtcbiAgICAgICAgaWYgKGxpc3RlbmVyID09IG51bGwpIHtcbiAgICAgICAgICAgIHJldHVyblxuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgbGlzdGVuZXJzID0gZ2V0TGlzdGVuZXJzKHRoaXMpO1xuICAgICAgICBjb25zdCBjYXB0dXJlID0gaXNPYmplY3Qob3B0aW9ucylcbiAgICAgICAgICAgID8gQm9vbGVhbihvcHRpb25zLmNhcHR1cmUpXG4gICAgICAgICAgICA6IEJvb2xlYW4ob3B0aW9ucyk7XG4gICAgICAgIGNvbnN0IGxpc3RlbmVyVHlwZSA9IGNhcHR1cmUgPyBDQVBUVVJFIDogQlVCQkxFO1xuXG4gICAgICAgIGxldCBwcmV2ID0gbnVsbDtcbiAgICAgICAgbGV0IG5vZGUgPSBsaXN0ZW5lcnMuZ2V0KGV2ZW50TmFtZSk7XG4gICAgICAgIHdoaWxlIChub2RlICE9IG51bGwpIHtcbiAgICAgICAgICAgIGlmIChcbiAgICAgICAgICAgICAgICBub2RlLmxpc3RlbmVyID09PSBsaXN0ZW5lciAmJlxuICAgICAgICAgICAgICAgIG5vZGUubGlzdGVuZXJUeXBlID09PSBsaXN0ZW5lclR5cGVcbiAgICAgICAgICAgICkge1xuICAgICAgICAgICAgICAgIGlmIChwcmV2ICE9PSBudWxsKSB7XG4gICAgICAgICAgICAgICAgICAgIHByZXYubmV4dCA9IG5vZGUubmV4dDtcbiAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKG5vZGUubmV4dCAhPT0gbnVsbCkge1xuICAgICAgICAgICAgICAgICAgICBsaXN0ZW5lcnMuc2V0KGV2ZW50TmFtZSwgbm9kZS5uZXh0KTtcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICBsaXN0ZW5lcnMuZGVsZXRlKGV2ZW50TmFtZSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHJldHVyblxuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBwcmV2ID0gbm9kZTtcbiAgICAgICAgICAgIG5vZGUgPSBub2RlLm5leHQ7XG4gICAgICAgIH1cbiAgICB9LFxuXG4gICAgLyoqXG4gICAgICogRGlzcGF0Y2ggYSBnaXZlbiBldmVudC5cbiAgICAgKiBAcGFyYW0ge0V2ZW50fHt0eXBlOnN0cmluZ319IGV2ZW50IFRoZSBldmVudCB0byBkaXNwYXRjaC5cbiAgICAgKiBAcmV0dXJucyB7Ym9vbGVhbn0gYGZhbHNlYCBpZiBjYW5jZWxlZC5cbiAgICAgKi9cbiAgICBkaXNwYXRjaEV2ZW50KGV2ZW50KSB7XG4gICAgICAgIGlmIChldmVudCA9PSBudWxsIHx8IHR5cGVvZiBldmVudC50eXBlICE9PSBcInN0cmluZ1wiKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCdcImV2ZW50LnR5cGVcIiBzaG91bGQgYmUgYSBzdHJpbmcuJylcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIElmIGxpc3RlbmVycyBhcmVuJ3QgcmVnaXN0ZXJlZCwgdGVybWluYXRlLlxuICAgICAgICBjb25zdCBsaXN0ZW5lcnMgPSBnZXRMaXN0ZW5lcnModGhpcyk7XG4gICAgICAgIGNvbnN0IGV2ZW50TmFtZSA9IGV2ZW50LnR5cGU7XG4gICAgICAgIGxldCBub2RlID0gbGlzdGVuZXJzLmdldChldmVudE5hbWUpO1xuICAgICAgICBpZiAobm9kZSA9PSBudWxsKSB7XG4gICAgICAgICAgICByZXR1cm4gdHJ1ZVxuICAgICAgICB9XG5cbiAgICAgICAgLy8gU2luY2Ugd2UgY2Fubm90IHJld3JpdGUgc2V2ZXJhbCBwcm9wZXJ0aWVzLCBzbyB3cmFwIG9iamVjdC5cbiAgICAgICAgY29uc3Qgd3JhcHBlZEV2ZW50ID0gd3JhcEV2ZW50KHRoaXMsIGV2ZW50KTtcblxuICAgICAgICAvLyBUaGlzIGRvZXNuJ3QgcHJvY2VzcyBjYXB0dXJpbmcgcGhhc2UgYW5kIGJ1YmJsaW5nIHBoYXNlLlxuICAgICAgICAvLyBUaGlzIGlzbid0IHBhcnRpY2lwYXRpbmcgaW4gYSB0cmVlLlxuICAgICAgICBsZXQgcHJldiA9IG51bGw7XG4gICAgICAgIHdoaWxlIChub2RlICE9IG51bGwpIHtcbiAgICAgICAgICAgIC8vIFJlbW92ZSB0aGlzIGxpc3RlbmVyIGlmIGl0J3Mgb25jZVxuICAgICAgICAgICAgaWYgKG5vZGUub25jZSkge1xuICAgICAgICAgICAgICAgIGlmIChwcmV2ICE9PSBudWxsKSB7XG4gICAgICAgICAgICAgICAgICAgIHByZXYubmV4dCA9IG5vZGUubmV4dDtcbiAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKG5vZGUubmV4dCAhPT0gbnVsbCkge1xuICAgICAgICAgICAgICAgICAgICBsaXN0ZW5lcnMuc2V0KGV2ZW50TmFtZSwgbm9kZS5uZXh0KTtcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICBsaXN0ZW5lcnMuZGVsZXRlKGV2ZW50TmFtZSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICBwcmV2ID0gbm9kZTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgLy8gQ2FsbCB0aGlzIGxpc3RlbmVyXG4gICAgICAgICAgICBzZXRQYXNzaXZlTGlzdGVuZXIoXG4gICAgICAgICAgICAgICAgd3JhcHBlZEV2ZW50LFxuICAgICAgICAgICAgICAgIG5vZGUucGFzc2l2ZSA/IG5vZGUubGlzdGVuZXIgOiBudWxsXG4gICAgICAgICAgICApO1xuICAgICAgICAgICAgaWYgKHR5cGVvZiBub2RlLmxpc3RlbmVyID09PSBcImZ1bmN0aW9uXCIpIHtcbiAgICAgICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgICAgICBub2RlLmxpc3RlbmVyLmNhbGwodGhpcywgd3JhcHBlZEV2ZW50KTtcbiAgICAgICAgICAgICAgICB9IGNhdGNoIChlcnIpIHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKFxuICAgICAgICAgICAgICAgICAgICAgICAgdHlwZW9mIGNvbnNvbGUgIT09IFwidW5kZWZpbmVkXCIgJiZcbiAgICAgICAgICAgICAgICAgICAgICAgIHR5cGVvZiBjb25zb2xlLmVycm9yID09PSBcImZ1bmN0aW9uXCJcbiAgICAgICAgICAgICAgICAgICAgKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBjb25zb2xlLmVycm9yKGVycik7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9IGVsc2UgaWYgKFxuICAgICAgICAgICAgICAgIG5vZGUubGlzdGVuZXJUeXBlICE9PSBBVFRSSUJVVEUgJiZcbiAgICAgICAgICAgICAgICB0eXBlb2Ygbm9kZS5saXN0ZW5lci5oYW5kbGVFdmVudCA9PT0gXCJmdW5jdGlvblwiXG4gICAgICAgICAgICApIHtcbiAgICAgICAgICAgICAgICBub2RlLmxpc3RlbmVyLmhhbmRsZUV2ZW50KHdyYXBwZWRFdmVudCk7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIC8vIEJyZWFrIGlmIGBldmVudC5zdG9wSW1tZWRpYXRlUHJvcGFnYXRpb25gIHdhcyBjYWxsZWQuXG4gICAgICAgICAgICBpZiAoaXNTdG9wcGVkKHdyYXBwZWRFdmVudCkpIHtcbiAgICAgICAgICAgICAgICBicmVha1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBub2RlID0gbm9kZS5uZXh0O1xuICAgICAgICB9XG4gICAgICAgIHNldFBhc3NpdmVMaXN0ZW5lcih3cmFwcGVkRXZlbnQsIG51bGwpO1xuICAgICAgICBzZXRFdmVudFBoYXNlKHdyYXBwZWRFdmVudCwgMCk7XG4gICAgICAgIHNldEN1cnJlbnRUYXJnZXQod3JhcHBlZEV2ZW50LCBudWxsKTtcblxuICAgICAgICByZXR1cm4gIXdyYXBwZWRFdmVudC5kZWZhdWx0UHJldmVudGVkXG4gICAgfSxcbn07XG5cbi8vIGBjb25zdHJ1Y3RvcmAgaXMgbm90IGVudW1lcmFibGUuXG5PYmplY3QuZGVmaW5lUHJvcGVydHkoRXZlbnRUYXJnZXQucHJvdG90eXBlLCBcImNvbnN0cnVjdG9yXCIsIHtcbiAgICB2YWx1ZTogRXZlbnRUYXJnZXQsXG4gICAgY29uZmlndXJhYmxlOiB0cnVlLFxuICAgIHdyaXRhYmxlOiB0cnVlLFxufSk7XG5cbi8vIEVuc3VyZSBgZXZlbnRUYXJnZXQgaW5zdGFuY2VvZiB3aW5kb3cuRXZlbnRUYXJnZXRgIGlzIGB0cnVlYC5cbmlmIChcbiAgICB0eXBlb2Ygd2luZG93ICE9PSBcInVuZGVmaW5lZFwiICYmXG4gICAgdHlwZW9mIHdpbmRvdy5FdmVudFRhcmdldCAhPT0gXCJ1bmRlZmluZWRcIlxuKSB7XG4gICAgT2JqZWN0LnNldFByb3RvdHlwZU9mKEV2ZW50VGFyZ2V0LnByb3RvdHlwZSwgd2luZG93LkV2ZW50VGFyZ2V0LnByb3RvdHlwZSk7XG59XG5cbmV4cG9ydHMuZGVmaW5lRXZlbnRBdHRyaWJ1dGUgPSBkZWZpbmVFdmVudEF0dHJpYnV0ZTtcbmV4cG9ydHMuRXZlbnRUYXJnZXQgPSBFdmVudFRhcmdldDtcbmV4cG9ydHMuZGVmYXVsdCA9IEV2ZW50VGFyZ2V0O1xuXG5tb2R1bGUuZXhwb3J0cyA9IEV2ZW50VGFyZ2V0XG5tb2R1bGUuZXhwb3J0cy5FdmVudFRhcmdldCA9IG1vZHVsZS5leHBvcnRzW1wiZGVmYXVsdFwiXSA9IEV2ZW50VGFyZ2V0XG5tb2R1bGUuZXhwb3J0cy5kZWZpbmVFdmVudEF0dHJpYnV0ZSA9IGRlZmluZUV2ZW50QXR0cmlidXRlXG4vLyMgc291cmNlTWFwcGluZ1VSTD1ldmVudC10YXJnZXQtc2hpbS5qcy5tYXBcbiIsCiAgICAiLyoqXG4gKiBAYXV0aG9yIFRvcnUgTmFnYXNoaW1hIDxodHRwczovL2dpdGh1Yi5jb20vbXlzdGljYXRlYT5cbiAqIFNlZSBMSUNFTlNFIGZpbGUgaW4gcm9vdCBkaXJlY3RvcnkgZm9yIGZ1bGwgbGljZW5zZS5cbiAqL1xuJ3VzZSBzdHJpY3QnO1xuXG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgJ19fZXNNb2R1bGUnLCB7IHZhbHVlOiB0cnVlIH0pO1xuXG52YXIgZXZlbnRUYXJnZXRTaGltID0gcmVxdWlyZSgnZXZlbnQtdGFyZ2V0LXNoaW0nKTtcblxuLyoqXG4gKiBUaGUgc2lnbmFsIGNsYXNzLlxuICogQHNlZSBodHRwczovL2RvbS5zcGVjLndoYXR3Zy5vcmcvI2Fib3J0c2lnbmFsXG4gKi9cbmNsYXNzIEFib3J0U2lnbmFsIGV4dGVuZHMgZXZlbnRUYXJnZXRTaGltLkV2ZW50VGFyZ2V0IHtcbiAgICAvKipcbiAgICAgKiBBYm9ydFNpZ25hbCBjYW5ub3QgYmUgY29uc3RydWN0ZWQgZGlyZWN0bHkuXG4gICAgICovXG4gICAgY29uc3RydWN0b3IoKSB7XG4gICAgICAgIHN1cGVyKCk7XG4gICAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoXCJBYm9ydFNpZ25hbCBjYW5ub3QgYmUgY29uc3RydWN0ZWQgZGlyZWN0bHlcIik7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIFJldHVybnMgYHRydWVgIGlmIHRoaXMgYEFib3J0U2lnbmFsYCdzIGBBYm9ydENvbnRyb2xsZXJgIGhhcyBzaWduYWxlZCB0byBhYm9ydCwgYW5kIGBmYWxzZWAgb3RoZXJ3aXNlLlxuICAgICAqL1xuICAgIGdldCBhYm9ydGVkKCkge1xuICAgICAgICBjb25zdCBhYm9ydGVkID0gYWJvcnRlZEZsYWdzLmdldCh0aGlzKTtcbiAgICAgICAgaWYgKHR5cGVvZiBhYm9ydGVkICE9PSBcImJvb2xlYW5cIikge1xuICAgICAgICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcihgRXhwZWN0ZWQgJ3RoaXMnIHRvIGJlIGFuICdBYm9ydFNpZ25hbCcgb2JqZWN0LCBidXQgZ290ICR7dGhpcyA9PT0gbnVsbCA/IFwibnVsbFwiIDogdHlwZW9mIHRoaXN9YCk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGFib3J0ZWQ7XG4gICAgfVxufVxuZXZlbnRUYXJnZXRTaGltLmRlZmluZUV2ZW50QXR0cmlidXRlKEFib3J0U2lnbmFsLnByb3RvdHlwZSwgXCJhYm9ydFwiKTtcbi8qKlxuICogQ3JlYXRlIGFuIEFib3J0U2lnbmFsIG9iamVjdC5cbiAqL1xuZnVuY3Rpb24gY3JlYXRlQWJvcnRTaWduYWwoKSB7XG4gICAgY29uc3Qgc2lnbmFsID0gT2JqZWN0LmNyZWF0ZShBYm9ydFNpZ25hbC5wcm90b3R5cGUpO1xuICAgIGV2ZW50VGFyZ2V0U2hpbS5FdmVudFRhcmdldC5jYWxsKHNpZ25hbCk7XG4gICAgYWJvcnRlZEZsYWdzLnNldChzaWduYWwsIGZhbHNlKTtcbiAgICByZXR1cm4gc2lnbmFsO1xufVxuLyoqXG4gKiBBYm9ydCBhIGdpdmVuIHNpZ25hbC5cbiAqL1xuZnVuY3Rpb24gYWJvcnRTaWduYWwoc2lnbmFsKSB7XG4gICAgaWYgKGFib3J0ZWRGbGFncy5nZXQoc2lnbmFsKSAhPT0gZmFsc2UpIHtcbiAgICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBhYm9ydGVkRmxhZ3Muc2V0KHNpZ25hbCwgdHJ1ZSk7XG4gICAgc2lnbmFsLmRpc3BhdGNoRXZlbnQoeyB0eXBlOiBcImFib3J0XCIgfSk7XG59XG4vKipcbiAqIEFib3J0ZWQgZmxhZyBmb3IgZWFjaCBpbnN0YW5jZXMuXG4gKi9cbmNvbnN0IGFib3J0ZWRGbGFncyA9IG5ldyBXZWFrTWFwKCk7XG4vLyBQcm9wZXJ0aWVzIHNob3VsZCBiZSBlbnVtZXJhYmxlLlxuT2JqZWN0LmRlZmluZVByb3BlcnRpZXMoQWJvcnRTaWduYWwucHJvdG90eXBlLCB7XG4gICAgYWJvcnRlZDogeyBlbnVtZXJhYmxlOiB0cnVlIH0sXG59KTtcbi8vIGB0b1N0cmluZygpYCBzaG91bGQgcmV0dXJuIGBcIltvYmplY3QgQWJvcnRTaWduYWxdXCJgXG5pZiAodHlwZW9mIFN5bWJvbCA9PT0gXCJmdW5jdGlvblwiICYmIHR5cGVvZiBTeW1ib2wudG9TdHJpbmdUYWcgPT09IFwic3ltYm9sXCIpIHtcbiAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkoQWJvcnRTaWduYWwucHJvdG90eXBlLCBTeW1ib2wudG9TdHJpbmdUYWcsIHtcbiAgICAgICAgY29uZmlndXJhYmxlOiB0cnVlLFxuICAgICAgICB2YWx1ZTogXCJBYm9ydFNpZ25hbFwiLFxuICAgIH0pO1xufVxuXG4vKipcbiAqIFRoZSBBYm9ydENvbnRyb2xsZXIuXG4gKiBAc2VlIGh0dHBzOi8vZG9tLnNwZWMud2hhdHdnLm9yZy8jYWJvcnRjb250cm9sbGVyXG4gKi9cbmNsYXNzIEFib3J0Q29udHJvbGxlciB7XG4gICAgLyoqXG4gICAgICogSW5pdGlhbGl6ZSB0aGlzIGNvbnRyb2xsZXIuXG4gICAgICovXG4gICAgY29uc3RydWN0b3IoKSB7XG4gICAgICAgIHNpZ25hbHMuc2V0KHRoaXMsIGNyZWF0ZUFib3J0U2lnbmFsKCkpO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBSZXR1cm5zIHRoZSBgQWJvcnRTaWduYWxgIG9iamVjdCBhc3NvY2lhdGVkIHdpdGggdGhpcyBvYmplY3QuXG4gICAgICovXG4gICAgZ2V0IHNpZ25hbCgpIHtcbiAgICAgICAgcmV0dXJuIGdldFNpZ25hbCh0aGlzKTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogQWJvcnQgYW5kIHNpZ25hbCB0byBhbnkgb2JzZXJ2ZXJzIHRoYXQgdGhlIGFzc29jaWF0ZWQgYWN0aXZpdHkgaXMgdG8gYmUgYWJvcnRlZC5cbiAgICAgKi9cbiAgICBhYm9ydCgpIHtcbiAgICAgICAgYWJvcnRTaWduYWwoZ2V0U2lnbmFsKHRoaXMpKTtcbiAgICB9XG59XG4vKipcbiAqIEFzc29jaWF0ZWQgc2lnbmFscy5cbiAqL1xuY29uc3Qgc2lnbmFscyA9IG5ldyBXZWFrTWFwKCk7XG4vKipcbiAqIEdldCB0aGUgYXNzb2NpYXRlZCBzaWduYWwgb2YgYSBnaXZlbiBjb250cm9sbGVyLlxuICovXG5mdW5jdGlvbiBnZXRTaWduYWwoY29udHJvbGxlcikge1xuICAgIGNvbnN0IHNpZ25hbCA9IHNpZ25hbHMuZ2V0KGNvbnRyb2xsZXIpO1xuICAgIGlmIChzaWduYWwgPT0gbnVsbCkge1xuICAgICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKGBFeHBlY3RlZCAndGhpcycgdG8gYmUgYW4gJ0Fib3J0Q29udHJvbGxlcicgb2JqZWN0LCBidXQgZ290ICR7Y29udHJvbGxlciA9PT0gbnVsbCA/IFwibnVsbFwiIDogdHlwZW9mIGNvbnRyb2xsZXJ9YCk7XG4gICAgfVxuICAgIHJldHVybiBzaWduYWw7XG59XG4vLyBQcm9wZXJ0aWVzIHNob3VsZCBiZSBlbnVtZXJhYmxlLlxuT2JqZWN0LmRlZmluZVByb3BlcnRpZXMoQWJvcnRDb250cm9sbGVyLnByb3RvdHlwZSwge1xuICAgIHNpZ25hbDogeyBlbnVtZXJhYmxlOiB0cnVlIH0sXG4gICAgYWJvcnQ6IHsgZW51bWVyYWJsZTogdHJ1ZSB9LFxufSk7XG5pZiAodHlwZW9mIFN5bWJvbCA9PT0gXCJmdW5jdGlvblwiICYmIHR5cGVvZiBTeW1ib2wudG9TdHJpbmdUYWcgPT09IFwic3ltYm9sXCIpIHtcbiAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkoQWJvcnRDb250cm9sbGVyLnByb3RvdHlwZSwgU3ltYm9sLnRvU3RyaW5nVGFnLCB7XG4gICAgICAgIGNvbmZpZ3VyYWJsZTogdHJ1ZSxcbiAgICAgICAgdmFsdWU6IFwiQWJvcnRDb250cm9sbGVyXCIsXG4gICAgfSk7XG59XG5cbmV4cG9ydHMuQWJvcnRDb250cm9sbGVyID0gQWJvcnRDb250cm9sbGVyO1xuZXhwb3J0cy5BYm9ydFNpZ25hbCA9IEFib3J0U2lnbmFsO1xuZXhwb3J0cy5kZWZhdWx0ID0gQWJvcnRDb250cm9sbGVyO1xuXG5tb2R1bGUuZXhwb3J0cyA9IEFib3J0Q29udHJvbGxlclxubW9kdWxlLmV4cG9ydHMuQWJvcnRDb250cm9sbGVyID0gbW9kdWxlLmV4cG9ydHNbXCJkZWZhdWx0XCJdID0gQWJvcnRDb250cm9sbGVyXG5tb2R1bGUuZXhwb3J0cy5BYm9ydFNpZ25hbCA9IEFib3J0U2lnbmFsXG4vLyMgc291cmNlTWFwcGluZ1VSTD1hYm9ydC1jb250cm9sbGVyLmpzLm1hcFxuIiwKICAgICIndXNlIHN0cmljdCdcblxuY29uc3QgYnVmZmVyTW9kdWxlID0gcmVxdWlyZSgnYnVmZmVyJylcbmNvbnN0IHsga1Jlc2lzdFN0b3BQcm9wYWdhdGlvbiwgU3ltYm9sRGlzcG9zZSB9ID0gcmVxdWlyZSgnLi9wcmltb3JkaWFscycpXG5jb25zdCBBYm9ydFNpZ25hbCA9IGdsb2JhbFRoaXMuQWJvcnRTaWduYWwgfHwgcmVxdWlyZSgnYWJvcnQtY29udHJvbGxlcicpLkFib3J0U2lnbmFsXG5jb25zdCBBYm9ydENvbnRyb2xsZXIgPSBnbG9iYWxUaGlzLkFib3J0Q29udHJvbGxlciB8fCByZXF1aXJlKCdhYm9ydC1jb250cm9sbGVyJykuQWJvcnRDb250cm9sbGVyXG5jb25zdCBBc3luY0Z1bmN0aW9uID0gT2JqZWN0LmdldFByb3RvdHlwZU9mKGFzeW5jIGZ1bmN0aW9uICgpIHt9KS5jb25zdHJ1Y3RvclxuY29uc3QgQmxvYiA9IGdsb2JhbFRoaXMuQmxvYiB8fCBidWZmZXJNb2R1bGUuQmxvYlxuLyogZXNsaW50LWRpc2FibGUgaW5kZW50ICovXG5jb25zdCBpc0Jsb2IgPVxuICB0eXBlb2YgQmxvYiAhPT0gJ3VuZGVmaW5lZCdcbiAgICA/IGZ1bmN0aW9uIGlzQmxvYihiKSB7XG4gICAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBpbmRlbnRcbiAgICAgICAgcmV0dXJuIGIgaW5zdGFuY2VvZiBCbG9iXG4gICAgICB9XG4gICAgOiBmdW5jdGlvbiBpc0Jsb2IoYikge1xuICAgICAgICByZXR1cm4gZmFsc2VcbiAgICAgIH1cbi8qIGVzbGludC1lbmFibGUgaW5kZW50ICovXG5cbmNvbnN0IHZhbGlkYXRlQWJvcnRTaWduYWwgPSAoc2lnbmFsLCBuYW1lKSA9PiB7XG4gIGlmIChzaWduYWwgIT09IHVuZGVmaW5lZCAmJiAoc2lnbmFsID09PSBudWxsIHx8IHR5cGVvZiBzaWduYWwgIT09ICdvYmplY3QnIHx8ICEoJ2Fib3J0ZWQnIGluIHNpZ25hbCkpKSB7XG4gICAgdGhyb3cgbmV3IEVSUl9JTlZBTElEX0FSR19UWVBFKG5hbWUsICdBYm9ydFNpZ25hbCcsIHNpZ25hbClcbiAgfVxufVxuY29uc3QgdmFsaWRhdGVGdW5jdGlvbiA9ICh2YWx1ZSwgbmFtZSkgPT4ge1xuICBpZiAodHlwZW9mIHZhbHVlICE9PSAnZnVuY3Rpb24nKSB0aHJvdyBuZXcgRVJSX0lOVkFMSURfQVJHX1RZUEUobmFtZSwgJ0Z1bmN0aW9uJywgdmFsdWUpXG59XG5cbi8vIFRoaXMgaXMgYSBzaW1wbGlmaWVkIHZlcnNpb24gb2YgQWdncmVnYXRlRXJyb3JcbmNsYXNzIEFnZ3JlZ2F0ZUVycm9yIGV4dGVuZHMgRXJyb3Ige1xuICBjb25zdHJ1Y3RvcihlcnJvcnMpIHtcbiAgICBpZiAoIUFycmF5LmlzQXJyYXkoZXJyb3JzKSkge1xuICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcihgRXhwZWN0ZWQgaW5wdXQgdG8gYmUgYW4gQXJyYXksIGdvdCAke3R5cGVvZiBlcnJvcnN9YClcbiAgICB9XG4gICAgbGV0IG1lc3NhZ2UgPSAnJ1xuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgZXJyb3JzLmxlbmd0aDsgaSsrKSB7XG4gICAgICBtZXNzYWdlICs9IGAgICAgJHtlcnJvcnNbaV0uc3RhY2t9XFxuYFxuICAgIH1cbiAgICBzdXBlcihtZXNzYWdlKVxuICAgIHRoaXMubmFtZSA9ICdBZ2dyZWdhdGVFcnJvcidcbiAgICB0aGlzLmVycm9ycyA9IGVycm9yc1xuICB9XG59XG5tb2R1bGUuZXhwb3J0cyA9IHtcbiAgQWdncmVnYXRlRXJyb3IsXG4gIGtFbXB0eU9iamVjdDogT2JqZWN0LmZyZWV6ZSh7fSksXG4gIG9uY2UoY2FsbGJhY2spIHtcbiAgICBsZXQgY2FsbGVkID0gZmFsc2VcbiAgICByZXR1cm4gZnVuY3Rpb24gKC4uLmFyZ3MpIHtcbiAgICAgIGlmIChjYWxsZWQpIHtcbiAgICAgICAgcmV0dXJuXG4gICAgICB9XG4gICAgICBjYWxsZWQgPSB0cnVlXG4gICAgICBjYWxsYmFjay5hcHBseSh0aGlzLCBhcmdzKVxuICAgIH1cbiAgfSxcbiAgY3JlYXRlRGVmZXJyZWRQcm9taXNlOiBmdW5jdGlvbiAoKSB7XG4gICAgbGV0IHJlc29sdmVcbiAgICBsZXQgcmVqZWN0XG5cbiAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgcHJvbWlzZS9wYXJhbS1uYW1lc1xuICAgIGNvbnN0IHByb21pc2UgPSBuZXcgUHJvbWlzZSgocmVzLCByZWopID0+IHtcbiAgICAgIHJlc29sdmUgPSByZXNcbiAgICAgIHJlamVjdCA9IHJlalxuICAgIH0pXG4gICAgcmV0dXJuIHtcbiAgICAgIHByb21pc2UsXG4gICAgICByZXNvbHZlLFxuICAgICAgcmVqZWN0XG4gICAgfVxuICB9LFxuICBwcm9taXNpZnkoZm4pIHtcbiAgICByZXR1cm4gbmV3IFByb21pc2UoKHJlc29sdmUsIHJlamVjdCkgPT4ge1xuICAgICAgZm4oKGVyciwgLi4uYXJncykgPT4ge1xuICAgICAgICBpZiAoZXJyKSB7XG4gICAgICAgICAgcmV0dXJuIHJlamVjdChlcnIpXG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHJlc29sdmUoLi4uYXJncylcbiAgICAgIH0pXG4gICAgfSlcbiAgfSxcbiAgZGVidWdsb2coKSB7XG4gICAgcmV0dXJuIGZ1bmN0aW9uICgpIHt9XG4gIH0sXG4gIGZvcm1hdChmb3JtYXQsIC4uLmFyZ3MpIHtcbiAgICAvLyBTaW1wbGlmaWVkIHZlcnNpb24gb2YgaHR0cHM6Ly9ub2RlanMub3JnL2FwaS91dGlsLmh0bWwjdXRpbGZvcm1hdGZvcm1hdC1hcmdzXG4gICAgcmV0dXJuIGZvcm1hdC5yZXBsYWNlKC8lKFtzZGlmal0pL2csIGZ1bmN0aW9uICguLi5bX3VudXNlZCwgdHlwZV0pIHtcbiAgICAgIGNvbnN0IHJlcGxhY2VtZW50ID0gYXJncy5zaGlmdCgpXG4gICAgICBpZiAodHlwZSA9PT0gJ2YnKSB7XG4gICAgICAgIHJldHVybiByZXBsYWNlbWVudC50b0ZpeGVkKDYpXG4gICAgICB9IGVsc2UgaWYgKHR5cGUgPT09ICdqJykge1xuICAgICAgICByZXR1cm4gSlNPTi5zdHJpbmdpZnkocmVwbGFjZW1lbnQpXG4gICAgICB9IGVsc2UgaWYgKHR5cGUgPT09ICdzJyAmJiB0eXBlb2YgcmVwbGFjZW1lbnQgPT09ICdvYmplY3QnKSB7XG4gICAgICAgIGNvbnN0IGN0b3IgPSByZXBsYWNlbWVudC5jb25zdHJ1Y3RvciAhPT0gT2JqZWN0ID8gcmVwbGFjZW1lbnQuY29uc3RydWN0b3IubmFtZSA6ICcnXG4gICAgICAgIHJldHVybiBgJHtjdG9yfSB7fWAudHJpbSgpXG4gICAgICB9IGVsc2Uge1xuICAgICAgICByZXR1cm4gcmVwbGFjZW1lbnQudG9TdHJpbmcoKVxuICAgICAgfVxuICAgIH0pXG4gIH0sXG4gIGluc3BlY3QodmFsdWUpIHtcbiAgICAvLyBWYXN0bHkgc2ltcGxpZmllZCB2ZXJzaW9uIG9mIGh0dHBzOi8vbm9kZWpzLm9yZy9hcGkvdXRpbC5odG1sI3V0aWxpbnNwZWN0b2JqZWN0LW9wdGlvbnNcbiAgICBzd2l0Y2ggKHR5cGVvZiB2YWx1ZSkge1xuICAgICAgY2FzZSAnc3RyaW5nJzpcbiAgICAgICAgaWYgKHZhbHVlLmluY2x1ZGVzKFwiJ1wiKSkge1xuICAgICAgICAgIGlmICghdmFsdWUuaW5jbHVkZXMoJ1wiJykpIHtcbiAgICAgICAgICAgIHJldHVybiBgXCIke3ZhbHVlfVwiYFxuICAgICAgICAgIH0gZWxzZSBpZiAoIXZhbHVlLmluY2x1ZGVzKCdgJykgJiYgIXZhbHVlLmluY2x1ZGVzKCckeycpKSB7XG4gICAgICAgICAgICByZXR1cm4gYFxcYCR7dmFsdWV9XFxgYFxuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gYCcke3ZhbHVlfSdgXG4gICAgICBjYXNlICdudW1iZXInOlxuICAgICAgICBpZiAoaXNOYU4odmFsdWUpKSB7XG4gICAgICAgICAgcmV0dXJuICdOYU4nXG4gICAgICAgIH0gZWxzZSBpZiAoT2JqZWN0LmlzKHZhbHVlLCAtMCkpIHtcbiAgICAgICAgICByZXR1cm4gU3RyaW5nKHZhbHVlKVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiB2YWx1ZVxuICAgICAgY2FzZSAnYmlnaW50JzpcbiAgICAgICAgcmV0dXJuIGAke1N0cmluZyh2YWx1ZSl9bmBcbiAgICAgIGNhc2UgJ2Jvb2xlYW4nOlxuICAgICAgY2FzZSAndW5kZWZpbmVkJzpcbiAgICAgICAgcmV0dXJuIFN0cmluZyh2YWx1ZSlcbiAgICAgIGNhc2UgJ29iamVjdCc6XG4gICAgICAgIHJldHVybiAne30nXG4gICAgfVxuICB9LFxuICB0eXBlczoge1xuICAgIGlzQXN5bmNGdW5jdGlvbihmbikge1xuICAgICAgcmV0dXJuIGZuIGluc3RhbmNlb2YgQXN5bmNGdW5jdGlvblxuICAgIH0sXG4gICAgaXNBcnJheUJ1ZmZlclZpZXcoYXJyKSB7XG4gICAgICByZXR1cm4gQXJyYXlCdWZmZXIuaXNWaWV3KGFycilcbiAgICB9XG4gIH0sXG4gIGlzQmxvYixcbiAgZGVwcmVjYXRlKGZuLCBtZXNzYWdlKSB7XG4gICAgcmV0dXJuIGZuXG4gIH0sXG4gIGFkZEFib3J0TGlzdGVuZXI6XG4gICAgcmVxdWlyZSgnZXZlbnRzJykuYWRkQWJvcnRMaXN0ZW5lciB8fFxuICAgIGZ1bmN0aW9uIGFkZEFib3J0TGlzdGVuZXIoc2lnbmFsLCBsaXN0ZW5lcikge1xuICAgICAgaWYgKHNpZ25hbCA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgIHRocm93IG5ldyBFUlJfSU5WQUxJRF9BUkdfVFlQRSgnc2lnbmFsJywgJ0Fib3J0U2lnbmFsJywgc2lnbmFsKVxuICAgICAgfVxuICAgICAgdmFsaWRhdGVBYm9ydFNpZ25hbChzaWduYWwsICdzaWduYWwnKVxuICAgICAgdmFsaWRhdGVGdW5jdGlvbihsaXN0ZW5lciwgJ2xpc3RlbmVyJylcbiAgICAgIGxldCByZW1vdmVFdmVudExpc3RlbmVyXG4gICAgICBpZiAoc2lnbmFsLmFib3J0ZWQpIHtcbiAgICAgICAgcXVldWVNaWNyb3Rhc2soKCkgPT4gbGlzdGVuZXIoKSlcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHNpZ25hbC5hZGRFdmVudExpc3RlbmVyKCdhYm9ydCcsIGxpc3RlbmVyLCB7XG4gICAgICAgICAgX19wcm90b19fOiBudWxsLFxuICAgICAgICAgIG9uY2U6IHRydWUsXG4gICAgICAgICAgW2tSZXNpc3RTdG9wUHJvcGFnYXRpb25dOiB0cnVlXG4gICAgICAgIH0pXG4gICAgICAgIHJlbW92ZUV2ZW50TGlzdGVuZXIgPSAoKSA9PiB7XG4gICAgICAgICAgc2lnbmFsLnJlbW92ZUV2ZW50TGlzdGVuZXIoJ2Fib3J0JywgbGlzdGVuZXIpXG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIHJldHVybiB7XG4gICAgICAgIF9fcHJvdG9fXzogbnVsbCxcbiAgICAgICAgW1N5bWJvbERpc3Bvc2VdKCkge1xuICAgICAgICAgIHZhciBfcmVtb3ZlRXZlbnRMaXN0ZW5lclxuICAgICAgICAgIDsoX3JlbW92ZUV2ZW50TGlzdGVuZXIgPSByZW1vdmVFdmVudExpc3RlbmVyKSA9PT0gbnVsbCB8fCBfcmVtb3ZlRXZlbnRMaXN0ZW5lciA9PT0gdW5kZWZpbmVkXG4gICAgICAgICAgICA/IHVuZGVmaW5lZFxuICAgICAgICAgICAgOiBfcmVtb3ZlRXZlbnRMaXN0ZW5lcigpXG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9LFxuICBBYm9ydFNpZ25hbEFueTpcbiAgICBBYm9ydFNpZ25hbC5hbnkgfHxcbiAgICBmdW5jdGlvbiBBYm9ydFNpZ25hbEFueShzaWduYWxzKSB7XG4gICAgICAvLyBGYXN0IHBhdGggaWYgdGhlcmUgaXMgb25seSBvbmUgc2lnbmFsLlxuICAgICAgaWYgKHNpZ25hbHMubGVuZ3RoID09PSAxKSB7XG4gICAgICAgIHJldHVybiBzaWduYWxzWzBdXG4gICAgICB9XG4gICAgICBjb25zdCBhYyA9IG5ldyBBYm9ydENvbnRyb2xsZXIoKVxuICAgICAgY29uc3QgYWJvcnQgPSAoKSA9PiBhYy5hYm9ydCgpXG4gICAgICBzaWduYWxzLmZvckVhY2goKHNpZ25hbCkgPT4ge1xuICAgICAgICB2YWxpZGF0ZUFib3J0U2lnbmFsKHNpZ25hbCwgJ3NpZ25hbHMnKVxuICAgICAgICBzaWduYWwuYWRkRXZlbnRMaXN0ZW5lcignYWJvcnQnLCBhYm9ydCwge1xuICAgICAgICAgIG9uY2U6IHRydWVcbiAgICAgICAgfSlcbiAgICAgIH0pXG4gICAgICBhYy5zaWduYWwuYWRkRXZlbnRMaXN0ZW5lcihcbiAgICAgICAgJ2Fib3J0JyxcbiAgICAgICAgKCkgPT4ge1xuICAgICAgICAgIHNpZ25hbHMuZm9yRWFjaCgoc2lnbmFsKSA9PiBzaWduYWwucmVtb3ZlRXZlbnRMaXN0ZW5lcignYWJvcnQnLCBhYm9ydCkpXG4gICAgICAgIH0sXG4gICAgICAgIHtcbiAgICAgICAgICBvbmNlOiB0cnVlXG4gICAgICAgIH1cbiAgICAgIClcbiAgICAgIHJldHVybiBhYy5zaWduYWxcbiAgICB9XG59XG5tb2R1bGUuZXhwb3J0cy5wcm9taXNpZnkuY3VzdG9tID0gU3ltYm9sLmZvcignbm9kZWpzLnV0aWwucHJvbWlzaWZ5LmN1c3RvbScpXG4iLAogICAgIid1c2Ugc3RyaWN0J1xuXG5jb25zdCB7IGZvcm1hdCwgaW5zcGVjdCwgQWdncmVnYXRlRXJyb3I6IEN1c3RvbUFnZ3JlZ2F0ZUVycm9yIH0gPSByZXF1aXJlKCcuL3V0aWwnKVxuXG4vKlxuICBUaGlzIGZpbGUgaXMgYSByZWR1Y2VkIGFuZCBhZGFwdGVkIHZlcnNpb24gb2YgdGhlIG1haW4gbGliL2ludGVybmFsL2Vycm9ycy5qcyBmaWxlIGRlZmluZWQgYXRcblxuICBodHRwczovL2dpdGh1Yi5jb20vbm9kZWpzL25vZGUvYmxvYi9tYXN0ZXIvbGliL2ludGVybmFsL2Vycm9ycy5qc1xuXG4gIERvbid0IHRyeSB0byByZXBsYWNlIHdpdGggdGhlIG9yaWdpbmFsIGZpbGUgYW5kIGtlZXAgaXQgdXAgdG8gZGF0ZSAoc3RhcnRpbmcgZnJvbSBFKC4uLikgZGVmaW5pdGlvbnMpXG4gIHdpdGggdGhlIHVwc3RyZWFtIGZpbGUuXG4qL1xuXG5jb25zdCBBZ2dyZWdhdGVFcnJvciA9IGdsb2JhbFRoaXMuQWdncmVnYXRlRXJyb3IgfHwgQ3VzdG9tQWdncmVnYXRlRXJyb3JcbmNvbnN0IGtJc05vZGVFcnJvciA9IFN5bWJvbCgna0lzTm9kZUVycm9yJylcbmNvbnN0IGtUeXBlcyA9IFtcbiAgJ3N0cmluZycsXG4gICdmdW5jdGlvbicsXG4gICdudW1iZXInLFxuICAnb2JqZWN0JyxcbiAgLy8gQWNjZXB0ICdGdW5jdGlvbicgYW5kICdPYmplY3QnIGFzIGFsdGVybmF0aXZlIHRvIHRoZSBsb3dlciBjYXNlZCB2ZXJzaW9uLlxuICAnRnVuY3Rpb24nLFxuICAnT2JqZWN0JyxcbiAgJ2Jvb2xlYW4nLFxuICAnYmlnaW50JyxcbiAgJ3N5bWJvbCdcbl1cbmNvbnN0IGNsYXNzUmVnRXhwID0gL14oW0EtWl1bYS16MC05XSopKyQvXG5jb25zdCBub2RlSW50ZXJuYWxQcmVmaXggPSAnX19ub2RlX2ludGVybmFsXydcbmNvbnN0IGNvZGVzID0ge31cbmZ1bmN0aW9uIGFzc2VydCh2YWx1ZSwgbWVzc2FnZSkge1xuICBpZiAoIXZhbHVlKSB7XG4gICAgdGhyb3cgbmV3IGNvZGVzLkVSUl9JTlRFUk5BTF9BU1NFUlRJT04obWVzc2FnZSlcbiAgfVxufVxuXG4vLyBPbmx5IHVzZSB0aGlzIGZvciBpbnRlZ2VycyEgRGVjaW1hbCBudW1iZXJzIGRvIG5vdCB3b3JrIHdpdGggdGhpcyBmdW5jdGlvbi5cbmZ1bmN0aW9uIGFkZE51bWVyaWNhbFNlcGFyYXRvcih2YWwpIHtcbiAgbGV0IHJlcyA9ICcnXG4gIGxldCBpID0gdmFsLmxlbmd0aFxuICBjb25zdCBzdGFydCA9IHZhbFswXSA9PT0gJy0nID8gMSA6IDBcbiAgZm9yICg7IGkgPj0gc3RhcnQgKyA0OyBpIC09IDMpIHtcbiAgICByZXMgPSBgXyR7dmFsLnNsaWNlKGkgLSAzLCBpKX0ke3Jlc31gXG4gIH1cbiAgcmV0dXJuIGAke3ZhbC5zbGljZSgwLCBpKX0ke3Jlc31gXG59XG5mdW5jdGlvbiBnZXRNZXNzYWdlKGtleSwgbXNnLCBhcmdzKSB7XG4gIGlmICh0eXBlb2YgbXNnID09PSAnZnVuY3Rpb24nKSB7XG4gICAgYXNzZXJ0KFxuICAgICAgbXNnLmxlbmd0aCA8PSBhcmdzLmxlbmd0aCxcbiAgICAgIC8vIERlZmF1bHQgb3B0aW9ucyBkbyBub3QgY291bnQuXG4gICAgICBgQ29kZTogJHtrZXl9OyBUaGUgcHJvdmlkZWQgYXJndW1lbnRzIGxlbmd0aCAoJHthcmdzLmxlbmd0aH0pIGRvZXMgbm90IG1hdGNoIHRoZSByZXF1aXJlZCBvbmVzICgke21zZy5sZW5ndGh9KS5gXG4gICAgKVxuICAgIHJldHVybiBtc2coLi4uYXJncylcbiAgfVxuICBjb25zdCBleHBlY3RlZExlbmd0aCA9IChtc2cubWF0Y2goLyVbZGZpam9Pc10vZykgfHwgW10pLmxlbmd0aFxuICBhc3NlcnQoXG4gICAgZXhwZWN0ZWRMZW5ndGggPT09IGFyZ3MubGVuZ3RoLFxuICAgIGBDb2RlOiAke2tleX07IFRoZSBwcm92aWRlZCBhcmd1bWVudHMgbGVuZ3RoICgke2FyZ3MubGVuZ3RofSkgZG9lcyBub3QgbWF0Y2ggdGhlIHJlcXVpcmVkIG9uZXMgKCR7ZXhwZWN0ZWRMZW5ndGh9KS5gXG4gIClcbiAgaWYgKGFyZ3MubGVuZ3RoID09PSAwKSB7XG4gICAgcmV0dXJuIG1zZ1xuICB9XG4gIHJldHVybiBmb3JtYXQobXNnLCAuLi5hcmdzKVxufVxuZnVuY3Rpb24gRShjb2RlLCBtZXNzYWdlLCBCYXNlKSB7XG4gIGlmICghQmFzZSkge1xuICAgIEJhc2UgPSBFcnJvclxuICB9XG4gIGNsYXNzIE5vZGVFcnJvciBleHRlbmRzIEJhc2Uge1xuICAgIGNvbnN0cnVjdG9yKC4uLmFyZ3MpIHtcbiAgICAgIHN1cGVyKGdldE1lc3NhZ2UoY29kZSwgbWVzc2FnZSwgYXJncykpXG4gICAgfVxuICAgIHRvU3RyaW5nKCkge1xuICAgICAgcmV0dXJuIGAke3RoaXMubmFtZX0gWyR7Y29kZX1dOiAke3RoaXMubWVzc2FnZX1gXG4gICAgfVxuICB9XG4gIE9iamVjdC5kZWZpbmVQcm9wZXJ0aWVzKE5vZGVFcnJvci5wcm90b3R5cGUsIHtcbiAgICBuYW1lOiB7XG4gICAgICB2YWx1ZTogQmFzZS5uYW1lLFxuICAgICAgd3JpdGFibGU6IHRydWUsXG4gICAgICBlbnVtZXJhYmxlOiBmYWxzZSxcbiAgICAgIGNvbmZpZ3VyYWJsZTogdHJ1ZVxuICAgIH0sXG4gICAgdG9TdHJpbmc6IHtcbiAgICAgIHZhbHVlKCkge1xuICAgICAgICByZXR1cm4gYCR7dGhpcy5uYW1lfSBbJHtjb2RlfV06ICR7dGhpcy5tZXNzYWdlfWBcbiAgICAgIH0sXG4gICAgICB3cml0YWJsZTogdHJ1ZSxcbiAgICAgIGVudW1lcmFibGU6IGZhbHNlLFxuICAgICAgY29uZmlndXJhYmxlOiB0cnVlXG4gICAgfVxuICB9KVxuICBOb2RlRXJyb3IucHJvdG90eXBlLmNvZGUgPSBjb2RlXG4gIE5vZGVFcnJvci5wcm90b3R5cGVba0lzTm9kZUVycm9yXSA9IHRydWVcbiAgY29kZXNbY29kZV0gPSBOb2RlRXJyb3Jcbn1cbmZ1bmN0aW9uIGhpZGVTdGFja0ZyYW1lcyhmbikge1xuICAvLyBXZSByZW5hbWUgdGhlIGZ1bmN0aW9ucyB0aGF0IHdpbGwgYmUgaGlkZGVuIHRvIGN1dCBvZmYgdGhlIHN0YWNrdHJhY2VcbiAgLy8gYXQgdGhlIG91dGVybW9zdCBvbmVcbiAgY29uc3QgaGlkZGVuID0gbm9kZUludGVybmFsUHJlZml4ICsgZm4ubmFtZVxuICBPYmplY3QuZGVmaW5lUHJvcGVydHkoZm4sICduYW1lJywge1xuICAgIHZhbHVlOiBoaWRkZW5cbiAgfSlcbiAgcmV0dXJuIGZuXG59XG5mdW5jdGlvbiBhZ2dyZWdhdGVUd29FcnJvcnMoaW5uZXJFcnJvciwgb3V0ZXJFcnJvcikge1xuICBpZiAoaW5uZXJFcnJvciAmJiBvdXRlckVycm9yICYmIGlubmVyRXJyb3IgIT09IG91dGVyRXJyb3IpIHtcbiAgICBpZiAoQXJyYXkuaXNBcnJheShvdXRlckVycm9yLmVycm9ycykpIHtcbiAgICAgIC8vIElmIGBvdXRlckVycm9yYCBpcyBhbHJlYWR5IGFuIGBBZ2dyZWdhdGVFcnJvcmAuXG4gICAgICBvdXRlckVycm9yLmVycm9ycy5wdXNoKGlubmVyRXJyb3IpXG4gICAgICByZXR1cm4gb3V0ZXJFcnJvclxuICAgIH1cbiAgICBjb25zdCBlcnIgPSBuZXcgQWdncmVnYXRlRXJyb3IoW291dGVyRXJyb3IsIGlubmVyRXJyb3JdLCBvdXRlckVycm9yLm1lc3NhZ2UpXG4gICAgZXJyLmNvZGUgPSBvdXRlckVycm9yLmNvZGVcbiAgICByZXR1cm4gZXJyXG4gIH1cbiAgcmV0dXJuIGlubmVyRXJyb3IgfHwgb3V0ZXJFcnJvclxufVxuY2xhc3MgQWJvcnRFcnJvciBleHRlbmRzIEVycm9yIHtcbiAgY29uc3RydWN0b3IobWVzc2FnZSA9ICdUaGUgb3BlcmF0aW9uIHdhcyBhYm9ydGVkJywgb3B0aW9ucyA9IHVuZGVmaW5lZCkge1xuICAgIGlmIChvcHRpb25zICE9PSB1bmRlZmluZWQgJiYgdHlwZW9mIG9wdGlvbnMgIT09ICdvYmplY3QnKSB7XG4gICAgICB0aHJvdyBuZXcgY29kZXMuRVJSX0lOVkFMSURfQVJHX1RZUEUoJ29wdGlvbnMnLCAnT2JqZWN0Jywgb3B0aW9ucylcbiAgICB9XG4gICAgc3VwZXIobWVzc2FnZSwgb3B0aW9ucylcbiAgICB0aGlzLmNvZGUgPSAnQUJPUlRfRVJSJ1xuICAgIHRoaXMubmFtZSA9ICdBYm9ydEVycm9yJ1xuICB9XG59XG5FKCdFUlJfQVNTRVJUSU9OJywgJyVzJywgRXJyb3IpXG5FKFxuICAnRVJSX0lOVkFMSURfQVJHX1RZUEUnLFxuICAobmFtZSwgZXhwZWN0ZWQsIGFjdHVhbCkgPT4ge1xuICAgIGFzc2VydCh0eXBlb2YgbmFtZSA9PT0gJ3N0cmluZycsIFwiJ25hbWUnIG11c3QgYmUgYSBzdHJpbmdcIilcbiAgICBpZiAoIUFycmF5LmlzQXJyYXkoZXhwZWN0ZWQpKSB7XG4gICAgICBleHBlY3RlZCA9IFtleHBlY3RlZF1cbiAgICB9XG4gICAgbGV0IG1zZyA9ICdUaGUgJ1xuICAgIGlmIChuYW1lLmVuZHNXaXRoKCcgYXJndW1lbnQnKSkge1xuICAgICAgLy8gRm9yIGNhc2VzIGxpa2UgJ2ZpcnN0IGFyZ3VtZW50J1xuICAgICAgbXNnICs9IGAke25hbWV9IGBcbiAgICB9IGVsc2Uge1xuICAgICAgbXNnICs9IGBcIiR7bmFtZX1cIiAke25hbWUuaW5jbHVkZXMoJy4nKSA/ICdwcm9wZXJ0eScgOiAnYXJndW1lbnQnfSBgXG4gICAgfVxuICAgIG1zZyArPSAnbXVzdCBiZSAnXG4gICAgY29uc3QgdHlwZXMgPSBbXVxuICAgIGNvbnN0IGluc3RhbmNlcyA9IFtdXG4gICAgY29uc3Qgb3RoZXIgPSBbXVxuICAgIGZvciAoY29uc3QgdmFsdWUgb2YgZXhwZWN0ZWQpIHtcbiAgICAgIGFzc2VydCh0eXBlb2YgdmFsdWUgPT09ICdzdHJpbmcnLCAnQWxsIGV4cGVjdGVkIGVudHJpZXMgaGF2ZSB0byBiZSBvZiB0eXBlIHN0cmluZycpXG4gICAgICBpZiAoa1R5cGVzLmluY2x1ZGVzKHZhbHVlKSkge1xuICAgICAgICB0eXBlcy5wdXNoKHZhbHVlLnRvTG93ZXJDYXNlKCkpXG4gICAgICB9IGVsc2UgaWYgKGNsYXNzUmVnRXhwLnRlc3QodmFsdWUpKSB7XG4gICAgICAgIGluc3RhbmNlcy5wdXNoKHZhbHVlKVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgYXNzZXJ0KHZhbHVlICE9PSAnb2JqZWN0JywgJ1RoZSB2YWx1ZSBcIm9iamVjdFwiIHNob3VsZCBiZSB3cml0dGVuIGFzIFwiT2JqZWN0XCInKVxuICAgICAgICBvdGhlci5wdXNoKHZhbHVlKVxuICAgICAgfVxuICAgIH1cblxuICAgIC8vIFNwZWNpYWwgaGFuZGxlIGBvYmplY3RgIGluIGNhc2Ugb3RoZXIgaW5zdGFuY2VzIGFyZSBhbGxvd2VkIHRvIG91dGxpbmVcbiAgICAvLyB0aGUgZGlmZmVyZW5jZXMgYmV0d2VlbiBlYWNoIG90aGVyLlxuICAgIGlmIChpbnN0YW5jZXMubGVuZ3RoID4gMCkge1xuICAgICAgY29uc3QgcG9zID0gdHlwZXMuaW5kZXhPZignb2JqZWN0JylcbiAgICAgIGlmIChwb3MgIT09IC0xKSB7XG4gICAgICAgIHR5cGVzLnNwbGljZSh0eXBlcywgcG9zLCAxKVxuICAgICAgICBpbnN0YW5jZXMucHVzaCgnT2JqZWN0JylcbiAgICAgIH1cbiAgICB9XG4gICAgaWYgKHR5cGVzLmxlbmd0aCA+IDApIHtcbiAgICAgIHN3aXRjaCAodHlwZXMubGVuZ3RoKSB7XG4gICAgICAgIGNhc2UgMTpcbiAgICAgICAgICBtc2cgKz0gYG9mIHR5cGUgJHt0eXBlc1swXX1gXG4gICAgICAgICAgYnJlYWtcbiAgICAgICAgY2FzZSAyOlxuICAgICAgICAgIG1zZyArPSBgb25lIG9mIHR5cGUgJHt0eXBlc1swXX0gb3IgJHt0eXBlc1sxXX1gXG4gICAgICAgICAgYnJlYWtcbiAgICAgICAgZGVmYXVsdDoge1xuICAgICAgICAgIGNvbnN0IGxhc3QgPSB0eXBlcy5wb3AoKVxuICAgICAgICAgIG1zZyArPSBgb25lIG9mIHR5cGUgJHt0eXBlcy5qb2luKCcsICcpfSwgb3IgJHtsYXN0fWBcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgaWYgKGluc3RhbmNlcy5sZW5ndGggPiAwIHx8IG90aGVyLmxlbmd0aCA+IDApIHtcbiAgICAgICAgbXNnICs9ICcgb3IgJ1xuICAgICAgfVxuICAgIH1cbiAgICBpZiAoaW5zdGFuY2VzLmxlbmd0aCA+IDApIHtcbiAgICAgIHN3aXRjaCAoaW5zdGFuY2VzLmxlbmd0aCkge1xuICAgICAgICBjYXNlIDE6XG4gICAgICAgICAgbXNnICs9IGBhbiBpbnN0YW5jZSBvZiAke2luc3RhbmNlc1swXX1gXG4gICAgICAgICAgYnJlYWtcbiAgICAgICAgY2FzZSAyOlxuICAgICAgICAgIG1zZyArPSBgYW4gaW5zdGFuY2Ugb2YgJHtpbnN0YW5jZXNbMF19IG9yICR7aW5zdGFuY2VzWzFdfWBcbiAgICAgICAgICBicmVha1xuICAgICAgICBkZWZhdWx0OiB7XG4gICAgICAgICAgY29uc3QgbGFzdCA9IGluc3RhbmNlcy5wb3AoKVxuICAgICAgICAgIG1zZyArPSBgYW4gaW5zdGFuY2Ugb2YgJHtpbnN0YW5jZXMuam9pbignLCAnKX0sIG9yICR7bGFzdH1gXG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIGlmIChvdGhlci5sZW5ndGggPiAwKSB7XG4gICAgICAgIG1zZyArPSAnIG9yICdcbiAgICAgIH1cbiAgICB9XG4gICAgc3dpdGNoIChvdGhlci5sZW5ndGgpIHtcbiAgICAgIGNhc2UgMDpcbiAgICAgICAgYnJlYWtcbiAgICAgIGNhc2UgMTpcbiAgICAgICAgaWYgKG90aGVyWzBdLnRvTG93ZXJDYXNlKCkgIT09IG90aGVyWzBdKSB7XG4gICAgICAgICAgbXNnICs9ICdhbiAnXG4gICAgICAgIH1cbiAgICAgICAgbXNnICs9IGAke290aGVyWzBdfWBcbiAgICAgICAgYnJlYWtcbiAgICAgIGNhc2UgMjpcbiAgICAgICAgbXNnICs9IGBvbmUgb2YgJHtvdGhlclswXX0gb3IgJHtvdGhlclsxXX1gXG4gICAgICAgIGJyZWFrXG4gICAgICBkZWZhdWx0OiB7XG4gICAgICAgIGNvbnN0IGxhc3QgPSBvdGhlci5wb3AoKVxuICAgICAgICBtc2cgKz0gYG9uZSBvZiAke290aGVyLmpvaW4oJywgJyl9LCBvciAke2xhc3R9YFxuICAgICAgfVxuICAgIH1cbiAgICBpZiAoYWN0dWFsID09IG51bGwpIHtcbiAgICAgIG1zZyArPSBgLiBSZWNlaXZlZCAke2FjdHVhbH1gXG4gICAgfSBlbHNlIGlmICh0eXBlb2YgYWN0dWFsID09PSAnZnVuY3Rpb24nICYmIGFjdHVhbC5uYW1lKSB7XG4gICAgICBtc2cgKz0gYC4gUmVjZWl2ZWQgZnVuY3Rpb24gJHthY3R1YWwubmFtZX1gXG4gICAgfSBlbHNlIGlmICh0eXBlb2YgYWN0dWFsID09PSAnb2JqZWN0Jykge1xuICAgICAgdmFyIF9hY3R1YWwkY29uc3RydWN0b3JcbiAgICAgIGlmIChcbiAgICAgICAgKF9hY3R1YWwkY29uc3RydWN0b3IgPSBhY3R1YWwuY29uc3RydWN0b3IpICE9PSBudWxsICYmXG4gICAgICAgIF9hY3R1YWwkY29uc3RydWN0b3IgIT09IHVuZGVmaW5lZCAmJlxuICAgICAgICBfYWN0dWFsJGNvbnN0cnVjdG9yLm5hbWVcbiAgICAgICkge1xuICAgICAgICBtc2cgKz0gYC4gUmVjZWl2ZWQgYW4gaW5zdGFuY2Ugb2YgJHthY3R1YWwuY29uc3RydWN0b3IubmFtZX1gXG4gICAgICB9IGVsc2Uge1xuICAgICAgICBjb25zdCBpbnNwZWN0ZWQgPSBpbnNwZWN0KGFjdHVhbCwge1xuICAgICAgICAgIGRlcHRoOiAtMVxuICAgICAgICB9KVxuICAgICAgICBtc2cgKz0gYC4gUmVjZWl2ZWQgJHtpbnNwZWN0ZWR9YFxuICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICBsZXQgaW5zcGVjdGVkID0gaW5zcGVjdChhY3R1YWwsIHtcbiAgICAgICAgY29sb3JzOiBmYWxzZVxuICAgICAgfSlcbiAgICAgIGlmIChpbnNwZWN0ZWQubGVuZ3RoID4gMjUpIHtcbiAgICAgICAgaW5zcGVjdGVkID0gYCR7aW5zcGVjdGVkLnNsaWNlKDAsIDI1KX0uLi5gXG4gICAgICB9XG4gICAgICBtc2cgKz0gYC4gUmVjZWl2ZWQgdHlwZSAke3R5cGVvZiBhY3R1YWx9ICgke2luc3BlY3RlZH0pYFxuICAgIH1cbiAgICByZXR1cm4gbXNnXG4gIH0sXG4gIFR5cGVFcnJvclxuKVxuRShcbiAgJ0VSUl9JTlZBTElEX0FSR19WQUxVRScsXG4gIChuYW1lLCB2YWx1ZSwgcmVhc29uID0gJ2lzIGludmFsaWQnKSA9PiB7XG4gICAgbGV0IGluc3BlY3RlZCA9IGluc3BlY3QodmFsdWUpXG4gICAgaWYgKGluc3BlY3RlZC5sZW5ndGggPiAxMjgpIHtcbiAgICAgIGluc3BlY3RlZCA9IGluc3BlY3RlZC5zbGljZSgwLCAxMjgpICsgJy4uLidcbiAgICB9XG4gICAgY29uc3QgdHlwZSA9IG5hbWUuaW5jbHVkZXMoJy4nKSA/ICdwcm9wZXJ0eScgOiAnYXJndW1lbnQnXG4gICAgcmV0dXJuIGBUaGUgJHt0eXBlfSAnJHtuYW1lfScgJHtyZWFzb259LiBSZWNlaXZlZCAke2luc3BlY3RlZH1gXG4gIH0sXG4gIFR5cGVFcnJvclxuKVxuRShcbiAgJ0VSUl9JTlZBTElEX1JFVFVSTl9WQUxVRScsXG4gIChpbnB1dCwgbmFtZSwgdmFsdWUpID0+IHtcbiAgICB2YXIgX3ZhbHVlJGNvbnN0cnVjdG9yXG4gICAgY29uc3QgdHlwZSA9XG4gICAgICB2YWx1ZSAhPT0gbnVsbCAmJlxuICAgICAgdmFsdWUgIT09IHVuZGVmaW5lZCAmJlxuICAgICAgKF92YWx1ZSRjb25zdHJ1Y3RvciA9IHZhbHVlLmNvbnN0cnVjdG9yKSAhPT0gbnVsbCAmJlxuICAgICAgX3ZhbHVlJGNvbnN0cnVjdG9yICE9PSB1bmRlZmluZWQgJiZcbiAgICAgIF92YWx1ZSRjb25zdHJ1Y3Rvci5uYW1lXG4gICAgICAgID8gYGluc3RhbmNlIG9mICR7dmFsdWUuY29uc3RydWN0b3IubmFtZX1gXG4gICAgICAgIDogYHR5cGUgJHt0eXBlb2YgdmFsdWV9YFxuICAgIHJldHVybiBgRXhwZWN0ZWQgJHtpbnB1dH0gdG8gYmUgcmV0dXJuZWQgZnJvbSB0aGUgXCIke25hbWV9XCJgICsgYCBmdW5jdGlvbiBidXQgZ290ICR7dHlwZX0uYFxuICB9LFxuICBUeXBlRXJyb3JcbilcbkUoXG4gICdFUlJfTUlTU0lOR19BUkdTJyxcbiAgKC4uLmFyZ3MpID0+IHtcbiAgICBhc3NlcnQoYXJncy5sZW5ndGggPiAwLCAnQXQgbGVhc3Qgb25lIGFyZyBuZWVkcyB0byBiZSBzcGVjaWZpZWQnKVxuICAgIGxldCBtc2dcbiAgICBjb25zdCBsZW4gPSBhcmdzLmxlbmd0aFxuICAgIGFyZ3MgPSAoQXJyYXkuaXNBcnJheShhcmdzKSA/IGFyZ3MgOiBbYXJnc10pLm1hcCgoYSkgPT4gYFwiJHthfVwiYCkuam9pbignIG9yICcpXG4gICAgc3dpdGNoIChsZW4pIHtcbiAgICAgIGNhc2UgMTpcbiAgICAgICAgbXNnICs9IGBUaGUgJHthcmdzWzBdfSBhcmd1bWVudGBcbiAgICAgICAgYnJlYWtcbiAgICAgIGNhc2UgMjpcbiAgICAgICAgbXNnICs9IGBUaGUgJHthcmdzWzBdfSBhbmQgJHthcmdzWzFdfSBhcmd1bWVudHNgXG4gICAgICAgIGJyZWFrXG4gICAgICBkZWZhdWx0OlxuICAgICAgICB7XG4gICAgICAgICAgY29uc3QgbGFzdCA9IGFyZ3MucG9wKClcbiAgICAgICAgICBtc2cgKz0gYFRoZSAke2FyZ3Muam9pbignLCAnKX0sIGFuZCAke2xhc3R9IGFyZ3VtZW50c2BcbiAgICAgICAgfVxuICAgICAgICBicmVha1xuICAgIH1cbiAgICByZXR1cm4gYCR7bXNnfSBtdXN0IGJlIHNwZWNpZmllZGBcbiAgfSxcbiAgVHlwZUVycm9yXG4pXG5FKFxuICAnRVJSX09VVF9PRl9SQU5HRScsXG4gIChzdHIsIHJhbmdlLCBpbnB1dCkgPT4ge1xuICAgIGFzc2VydChyYW5nZSwgJ01pc3NpbmcgXCJyYW5nZVwiIGFyZ3VtZW50JylcbiAgICBsZXQgcmVjZWl2ZWRcbiAgICBpZiAoTnVtYmVyLmlzSW50ZWdlcihpbnB1dCkgJiYgTWF0aC5hYnMoaW5wdXQpID4gMiAqKiAzMikge1xuICAgICAgcmVjZWl2ZWQgPSBhZGROdW1lcmljYWxTZXBhcmF0b3IoU3RyaW5nKGlucHV0KSlcbiAgICB9IGVsc2UgaWYgKHR5cGVvZiBpbnB1dCA9PT0gJ2JpZ2ludCcpIHtcbiAgICAgIHJlY2VpdmVkID0gU3RyaW5nKGlucHV0KVxuICAgICAgaWYgKGlucHV0ID4gMm4gKiogMzJuIHx8IGlucHV0IDwgLSgybiAqKiAzMm4pKSB7XG4gICAgICAgIHJlY2VpdmVkID0gYWRkTnVtZXJpY2FsU2VwYXJhdG9yKHJlY2VpdmVkKVxuICAgICAgfVxuICAgICAgcmVjZWl2ZWQgKz0gJ24nXG4gICAgfSBlbHNlIHtcbiAgICAgIHJlY2VpdmVkID0gaW5zcGVjdChpbnB1dClcbiAgICB9XG4gICAgcmV0dXJuIGBUaGUgdmFsdWUgb2YgXCIke3N0cn1cIiBpcyBvdXQgb2YgcmFuZ2UuIEl0IG11c3QgYmUgJHtyYW5nZX0uIFJlY2VpdmVkICR7cmVjZWl2ZWR9YFxuICB9LFxuICBSYW5nZUVycm9yXG4pXG5FKCdFUlJfTVVMVElQTEVfQ0FMTEJBQ0snLCAnQ2FsbGJhY2sgY2FsbGVkIG11bHRpcGxlIHRpbWVzJywgRXJyb3IpXG5FKCdFUlJfTUVUSE9EX05PVF9JTVBMRU1FTlRFRCcsICdUaGUgJXMgbWV0aG9kIGlzIG5vdCBpbXBsZW1lbnRlZCcsIEVycm9yKVxuRSgnRVJSX1NUUkVBTV9BTFJFQURZX0ZJTklTSEVEJywgJ0Nhbm5vdCBjYWxsICVzIGFmdGVyIGEgc3RyZWFtIHdhcyBmaW5pc2hlZCcsIEVycm9yKVxuRSgnRVJSX1NUUkVBTV9DQU5OT1RfUElQRScsICdDYW5ub3QgcGlwZSwgbm90IHJlYWRhYmxlJywgRXJyb3IpXG5FKCdFUlJfU1RSRUFNX0RFU1RST1lFRCcsICdDYW5ub3QgY2FsbCAlcyBhZnRlciBhIHN0cmVhbSB3YXMgZGVzdHJveWVkJywgRXJyb3IpXG5FKCdFUlJfU1RSRUFNX05VTExfVkFMVUVTJywgJ01heSBub3Qgd3JpdGUgbnVsbCB2YWx1ZXMgdG8gc3RyZWFtJywgVHlwZUVycm9yKVxuRSgnRVJSX1NUUkVBTV9QUkVNQVRVUkVfQ0xPU0UnLCAnUHJlbWF0dXJlIGNsb3NlJywgRXJyb3IpXG5FKCdFUlJfU1RSRUFNX1BVU0hfQUZURVJfRU9GJywgJ3N0cmVhbS5wdXNoKCkgYWZ0ZXIgRU9GJywgRXJyb3IpXG5FKCdFUlJfU1RSRUFNX1VOU0hJRlRfQUZURVJfRU5EX0VWRU5UJywgJ3N0cmVhbS51bnNoaWZ0KCkgYWZ0ZXIgZW5kIGV2ZW50JywgRXJyb3IpXG5FKCdFUlJfU1RSRUFNX1dSSVRFX0FGVEVSX0VORCcsICd3cml0ZSBhZnRlciBlbmQnLCBFcnJvcilcbkUoJ0VSUl9VTktOT1dOX0VOQ09ESU5HJywgJ1Vua25vd24gZW5jb2Rpbmc6ICVzJywgVHlwZUVycm9yKVxubW9kdWxlLmV4cG9ydHMgPSB7XG4gIEFib3J0RXJyb3IsXG4gIGFnZ3JlZ2F0ZVR3b0Vycm9yczogaGlkZVN0YWNrRnJhbWVzKGFnZ3JlZ2F0ZVR3b0Vycm9ycyksXG4gIGhpZGVTdGFja0ZyYW1lcyxcbiAgY29kZXNcbn1cbiIsCiAgICAiLyogZXNsaW50IGpzZG9jL3JlcXVpcmUtanNkb2M6IFwiZXJyb3JcIiAqL1xuXG4ndXNlIHN0cmljdCdcblxuY29uc3Qge1xuICBBcnJheUlzQXJyYXksXG4gIEFycmF5UHJvdG90eXBlSW5jbHVkZXMsXG4gIEFycmF5UHJvdG90eXBlSm9pbixcbiAgQXJyYXlQcm90b3R5cGVNYXAsXG4gIE51bWJlcklzSW50ZWdlcixcbiAgTnVtYmVySXNOYU4sXG4gIE51bWJlck1BWF9TQUZFX0lOVEVHRVIsXG4gIE51bWJlck1JTl9TQUZFX0lOVEVHRVIsXG4gIE51bWJlclBhcnNlSW50LFxuICBPYmplY3RQcm90b3R5cGVIYXNPd25Qcm9wZXJ0eSxcbiAgUmVnRXhwUHJvdG90eXBlRXhlYyxcbiAgU3RyaW5nLFxuICBTdHJpbmdQcm90b3R5cGVUb1VwcGVyQ2FzZSxcbiAgU3RyaW5nUHJvdG90eXBlVHJpbVxufSA9IHJlcXVpcmUoJy4uL291cnMvcHJpbW9yZGlhbHMnKVxuY29uc3Qge1xuICBoaWRlU3RhY2tGcmFtZXMsXG4gIGNvZGVzOiB7IEVSUl9TT0NLRVRfQkFEX1BPUlQsIEVSUl9JTlZBTElEX0FSR19UWVBFLCBFUlJfSU5WQUxJRF9BUkdfVkFMVUUsIEVSUl9PVVRfT0ZfUkFOR0UsIEVSUl9VTktOT1dOX1NJR05BTCB9XG59ID0gcmVxdWlyZSgnLi4vb3Vycy9lcnJvcnMnKVxuY29uc3QgeyBub3JtYWxpemVFbmNvZGluZyB9ID0gcmVxdWlyZSgnLi4vb3Vycy91dGlsJylcbmNvbnN0IHsgaXNBc3luY0Z1bmN0aW9uLCBpc0FycmF5QnVmZmVyVmlldyB9ID0gcmVxdWlyZSgnLi4vb3Vycy91dGlsJykudHlwZXNcbmNvbnN0IHNpZ25hbHMgPSB7fVxuXG4vKipcbiAqIEBwYXJhbSB7Kn0gdmFsdWVcbiAqIEByZXR1cm5zIHtib29sZWFufVxuICovXG5mdW5jdGlvbiBpc0ludDMyKHZhbHVlKSB7XG4gIHJldHVybiB2YWx1ZSA9PT0gKHZhbHVlIHwgMClcbn1cblxuLyoqXG4gKiBAcGFyYW0geyp9IHZhbHVlXG4gKiBAcmV0dXJucyB7Ym9vbGVhbn1cbiAqL1xuZnVuY3Rpb24gaXNVaW50MzIodmFsdWUpIHtcbiAgcmV0dXJuIHZhbHVlID09PSB2YWx1ZSA+Pj4gMFxufVxuY29uc3Qgb2N0YWxSZWcgPSAvXlswLTddKyQvXG5jb25zdCBtb2RlRGVzYyA9ICdtdXN0IGJlIGEgMzItYml0IHVuc2lnbmVkIGludGVnZXIgb3IgYW4gb2N0YWwgc3RyaW5nJ1xuXG4vKipcbiAqIFBhcnNlIGFuZCB2YWxpZGF0ZSB2YWx1ZXMgdGhhdCB3aWxsIGJlIGNvbnZlcnRlZCBpbnRvIG1vZGVfdCAodGhlIFNfKlxuICogY29uc3RhbnRzKS4gT25seSB2YWxpZCBudW1iZXJzIGFuZCBvY3RhbCBzdHJpbmdzIGFyZSBhbGxvd2VkLiBUaGV5IGNvdWxkIGJlXG4gKiBjb252ZXJ0ZWQgdG8gMzItYml0IHVuc2lnbmVkIGludGVnZXJzIG9yIG5vbi1uZWdhdGl2ZSBzaWduZWQgaW50ZWdlcnMgaW4gdGhlXG4gKiBDKysgbGFuZCwgYnV0IGFueSB2YWx1ZSBoaWdoZXIgdGhhbiAwbzc3NyB3aWxsIHJlc3VsdCBpbiBwbGF0Zm9ybS1zcGVjaWZpY1xuICogYmVoYXZpb3JzLlxuICogQHBhcmFtIHsqfSB2YWx1ZSBWYWx1ZXMgdG8gYmUgdmFsaWRhdGVkXG4gKiBAcGFyYW0ge3N0cmluZ30gbmFtZSBOYW1lIG9mIHRoZSBhcmd1bWVudFxuICogQHBhcmFtIHtudW1iZXJ9IFtkZWZdIElmIHNwZWNpZmllZCwgd2lsbCBiZSByZXR1cm5lZCBmb3IgaW52YWxpZCB2YWx1ZXNcbiAqIEByZXR1cm5zIHtudW1iZXJ9XG4gKi9cbmZ1bmN0aW9uIHBhcnNlRmlsZU1vZGUodmFsdWUsIG5hbWUsIGRlZikge1xuICBpZiAodHlwZW9mIHZhbHVlID09PSAndW5kZWZpbmVkJykge1xuICAgIHZhbHVlID0gZGVmXG4gIH1cbiAgaWYgKHR5cGVvZiB2YWx1ZSA9PT0gJ3N0cmluZycpIHtcbiAgICBpZiAoUmVnRXhwUHJvdG90eXBlRXhlYyhvY3RhbFJlZywgdmFsdWUpID09PSBudWxsKSB7XG4gICAgICB0aHJvdyBuZXcgRVJSX0lOVkFMSURfQVJHX1ZBTFVFKG5hbWUsIHZhbHVlLCBtb2RlRGVzYylcbiAgICB9XG4gICAgdmFsdWUgPSBOdW1iZXJQYXJzZUludCh2YWx1ZSwgOClcbiAgfVxuICB2YWxpZGF0ZVVpbnQzMih2YWx1ZSwgbmFtZSlcbiAgcmV0dXJuIHZhbHVlXG59XG5cbi8qKlxuICogQGNhbGxiYWNrIHZhbGlkYXRlSW50ZWdlclxuICogQHBhcmFtIHsqfSB2YWx1ZVxuICogQHBhcmFtIHtzdHJpbmd9IG5hbWVcbiAqIEBwYXJhbSB7bnVtYmVyfSBbbWluXVxuICogQHBhcmFtIHtudW1iZXJ9IFttYXhdXG4gKiBAcmV0dXJucyB7YXNzZXJ0cyB2YWx1ZSBpcyBudW1iZXJ9XG4gKi9cblxuLyoqIEB0eXBlIHt2YWxpZGF0ZUludGVnZXJ9ICovXG5jb25zdCB2YWxpZGF0ZUludGVnZXIgPSBoaWRlU3RhY2tGcmFtZXMoKHZhbHVlLCBuYW1lLCBtaW4gPSBOdW1iZXJNSU5fU0FGRV9JTlRFR0VSLCBtYXggPSBOdW1iZXJNQVhfU0FGRV9JTlRFR0VSKSA9PiB7XG4gIGlmICh0eXBlb2YgdmFsdWUgIT09ICdudW1iZXInKSB0aHJvdyBuZXcgRVJSX0lOVkFMSURfQVJHX1RZUEUobmFtZSwgJ251bWJlcicsIHZhbHVlKVxuICBpZiAoIU51bWJlcklzSW50ZWdlcih2YWx1ZSkpIHRocm93IG5ldyBFUlJfT1VUX09GX1JBTkdFKG5hbWUsICdhbiBpbnRlZ2VyJywgdmFsdWUpXG4gIGlmICh2YWx1ZSA8IG1pbiB8fCB2YWx1ZSA+IG1heCkgdGhyb3cgbmV3IEVSUl9PVVRfT0ZfUkFOR0UobmFtZSwgYD49ICR7bWlufSAmJiA8PSAke21heH1gLCB2YWx1ZSlcbn0pXG5cbi8qKlxuICogQGNhbGxiYWNrIHZhbGlkYXRlSW50MzJcbiAqIEBwYXJhbSB7Kn0gdmFsdWVcbiAqIEBwYXJhbSB7c3RyaW5nfSBuYW1lXG4gKiBAcGFyYW0ge251bWJlcn0gW21pbl1cbiAqIEBwYXJhbSB7bnVtYmVyfSBbbWF4XVxuICogQHJldHVybnMge2Fzc2VydHMgdmFsdWUgaXMgbnVtYmVyfVxuICovXG5cbi8qKiBAdHlwZSB7dmFsaWRhdGVJbnQzMn0gKi9cbmNvbnN0IHZhbGlkYXRlSW50MzIgPSBoaWRlU3RhY2tGcmFtZXMoKHZhbHVlLCBuYW1lLCBtaW4gPSAtMjE0NzQ4MzY0OCwgbWF4ID0gMjE0NzQ4MzY0NykgPT4ge1xuICAvLyBUaGUgZGVmYXVsdHMgZm9yIG1pbiBhbmQgbWF4IGNvcnJlc3BvbmQgdG8gdGhlIGxpbWl0cyBvZiAzMi1iaXQgaW50ZWdlcnMuXG4gIGlmICh0eXBlb2YgdmFsdWUgIT09ICdudW1iZXInKSB7XG4gICAgdGhyb3cgbmV3IEVSUl9JTlZBTElEX0FSR19UWVBFKG5hbWUsICdudW1iZXInLCB2YWx1ZSlcbiAgfVxuICBpZiAoIU51bWJlcklzSW50ZWdlcih2YWx1ZSkpIHtcbiAgICB0aHJvdyBuZXcgRVJSX09VVF9PRl9SQU5HRShuYW1lLCAnYW4gaW50ZWdlcicsIHZhbHVlKVxuICB9XG4gIGlmICh2YWx1ZSA8IG1pbiB8fCB2YWx1ZSA+IG1heCkge1xuICAgIHRocm93IG5ldyBFUlJfT1VUX09GX1JBTkdFKG5hbWUsIGA+PSAke21pbn0gJiYgPD0gJHttYXh9YCwgdmFsdWUpXG4gIH1cbn0pXG5cbi8qKlxuICogQGNhbGxiYWNrIHZhbGlkYXRlVWludDMyXG4gKiBAcGFyYW0geyp9IHZhbHVlXG4gKiBAcGFyYW0ge3N0cmluZ30gbmFtZVxuICogQHBhcmFtIHtudW1iZXJ8Ym9vbGVhbn0gW3Bvc2l0aXZlPWZhbHNlXVxuICogQHJldHVybnMge2Fzc2VydHMgdmFsdWUgaXMgbnVtYmVyfVxuICovXG5cbi8qKiBAdHlwZSB7dmFsaWRhdGVVaW50MzJ9ICovXG5jb25zdCB2YWxpZGF0ZVVpbnQzMiA9IGhpZGVTdGFja0ZyYW1lcygodmFsdWUsIG5hbWUsIHBvc2l0aXZlID0gZmFsc2UpID0+IHtcbiAgaWYgKHR5cGVvZiB2YWx1ZSAhPT0gJ251bWJlcicpIHtcbiAgICB0aHJvdyBuZXcgRVJSX0lOVkFMSURfQVJHX1RZUEUobmFtZSwgJ251bWJlcicsIHZhbHVlKVxuICB9XG4gIGlmICghTnVtYmVySXNJbnRlZ2VyKHZhbHVlKSkge1xuICAgIHRocm93IG5ldyBFUlJfT1VUX09GX1JBTkdFKG5hbWUsICdhbiBpbnRlZ2VyJywgdmFsdWUpXG4gIH1cbiAgY29uc3QgbWluID0gcG9zaXRpdmUgPyAxIDogMFxuICAvLyAyICoqIDMyID09PSA0Mjk0OTY3Mjk2XG4gIGNvbnN0IG1heCA9IDQyOTQ5NjcyOTVcbiAgaWYgKHZhbHVlIDwgbWluIHx8IHZhbHVlID4gbWF4KSB7XG4gICAgdGhyb3cgbmV3IEVSUl9PVVRfT0ZfUkFOR0UobmFtZSwgYD49ICR7bWlufSAmJiA8PSAke21heH1gLCB2YWx1ZSlcbiAgfVxufSlcblxuLyoqXG4gKiBAY2FsbGJhY2sgdmFsaWRhdGVTdHJpbmdcbiAqIEBwYXJhbSB7Kn0gdmFsdWVcbiAqIEBwYXJhbSB7c3RyaW5nfSBuYW1lXG4gKiBAcmV0dXJucyB7YXNzZXJ0cyB2YWx1ZSBpcyBzdHJpbmd9XG4gKi9cblxuLyoqIEB0eXBlIHt2YWxpZGF0ZVN0cmluZ30gKi9cbmZ1bmN0aW9uIHZhbGlkYXRlU3RyaW5nKHZhbHVlLCBuYW1lKSB7XG4gIGlmICh0eXBlb2YgdmFsdWUgIT09ICdzdHJpbmcnKSB0aHJvdyBuZXcgRVJSX0lOVkFMSURfQVJHX1RZUEUobmFtZSwgJ3N0cmluZycsIHZhbHVlKVxufVxuXG4vKipcbiAqIEBjYWxsYmFjayB2YWxpZGF0ZU51bWJlclxuICogQHBhcmFtIHsqfSB2YWx1ZVxuICogQHBhcmFtIHtzdHJpbmd9IG5hbWVcbiAqIEBwYXJhbSB7bnVtYmVyfSBbbWluXVxuICogQHBhcmFtIHtudW1iZXJ9IFttYXhdXG4gKiBAcmV0dXJucyB7YXNzZXJ0cyB2YWx1ZSBpcyBudW1iZXJ9XG4gKi9cblxuLyoqIEB0eXBlIHt2YWxpZGF0ZU51bWJlcn0gKi9cbmZ1bmN0aW9uIHZhbGlkYXRlTnVtYmVyKHZhbHVlLCBuYW1lLCBtaW4gPSB1bmRlZmluZWQsIG1heCkge1xuICBpZiAodHlwZW9mIHZhbHVlICE9PSAnbnVtYmVyJykgdGhyb3cgbmV3IEVSUl9JTlZBTElEX0FSR19UWVBFKG5hbWUsICdudW1iZXInLCB2YWx1ZSlcbiAgaWYgKFxuICAgIChtaW4gIT0gbnVsbCAmJiB2YWx1ZSA8IG1pbikgfHxcbiAgICAobWF4ICE9IG51bGwgJiYgdmFsdWUgPiBtYXgpIHx8XG4gICAgKChtaW4gIT0gbnVsbCB8fCBtYXggIT0gbnVsbCkgJiYgTnVtYmVySXNOYU4odmFsdWUpKVxuICApIHtcbiAgICB0aHJvdyBuZXcgRVJSX09VVF9PRl9SQU5HRShcbiAgICAgIG5hbWUsXG4gICAgICBgJHttaW4gIT0gbnVsbCA/IGA+PSAke21pbn1gIDogJyd9JHttaW4gIT0gbnVsbCAmJiBtYXggIT0gbnVsbCA/ICcgJiYgJyA6ICcnfSR7bWF4ICE9IG51bGwgPyBgPD0gJHttYXh9YCA6ICcnfWAsXG4gICAgICB2YWx1ZVxuICAgIClcbiAgfVxufVxuXG4vKipcbiAqIEBjYWxsYmFjayB2YWxpZGF0ZU9uZU9mXG4gKiBAdGVtcGxhdGUgVFxuICogQHBhcmFtIHtUfSB2YWx1ZVxuICogQHBhcmFtIHtzdHJpbmd9IG5hbWVcbiAqIEBwYXJhbSB7VFtdfSBvbmVPZlxuICovXG5cbi8qKiBAdHlwZSB7dmFsaWRhdGVPbmVPZn0gKi9cbmNvbnN0IHZhbGlkYXRlT25lT2YgPSBoaWRlU3RhY2tGcmFtZXMoKHZhbHVlLCBuYW1lLCBvbmVPZikgPT4ge1xuICBpZiAoIUFycmF5UHJvdG90eXBlSW5jbHVkZXMob25lT2YsIHZhbHVlKSkge1xuICAgIGNvbnN0IGFsbG93ZWQgPSBBcnJheVByb3RvdHlwZUpvaW4oXG4gICAgICBBcnJheVByb3RvdHlwZU1hcChvbmVPZiwgKHYpID0+ICh0eXBlb2YgdiA9PT0gJ3N0cmluZycgPyBgJyR7dn0nYCA6IFN0cmluZyh2KSkpLFxuICAgICAgJywgJ1xuICAgIClcbiAgICBjb25zdCByZWFzb24gPSAnbXVzdCBiZSBvbmUgb2Y6ICcgKyBhbGxvd2VkXG4gICAgdGhyb3cgbmV3IEVSUl9JTlZBTElEX0FSR19WQUxVRShuYW1lLCB2YWx1ZSwgcmVhc29uKVxuICB9XG59KVxuXG4vKipcbiAqIEBjYWxsYmFjayB2YWxpZGF0ZUJvb2xlYW5cbiAqIEBwYXJhbSB7Kn0gdmFsdWVcbiAqIEBwYXJhbSB7c3RyaW5nfSBuYW1lXG4gKiBAcmV0dXJucyB7YXNzZXJ0cyB2YWx1ZSBpcyBib29sZWFufVxuICovXG5cbi8qKiBAdHlwZSB7dmFsaWRhdGVCb29sZWFufSAqL1xuZnVuY3Rpb24gdmFsaWRhdGVCb29sZWFuKHZhbHVlLCBuYW1lKSB7XG4gIGlmICh0eXBlb2YgdmFsdWUgIT09ICdib29sZWFuJykgdGhyb3cgbmV3IEVSUl9JTlZBTElEX0FSR19UWVBFKG5hbWUsICdib29sZWFuJywgdmFsdWUpXG59XG5cbi8qKlxuICogQHBhcmFtIHthbnl9IG9wdGlvbnNcbiAqIEBwYXJhbSB7c3RyaW5nfSBrZXlcbiAqIEBwYXJhbSB7Ym9vbGVhbn0gZGVmYXVsdFZhbHVlXG4gKiBAcmV0dXJucyB7Ym9vbGVhbn1cbiAqL1xuZnVuY3Rpb24gZ2V0T3duUHJvcGVydHlWYWx1ZU9yRGVmYXVsdChvcHRpb25zLCBrZXksIGRlZmF1bHRWYWx1ZSkge1xuICByZXR1cm4gb3B0aW9ucyA9PSBudWxsIHx8ICFPYmplY3RQcm90b3R5cGVIYXNPd25Qcm9wZXJ0eShvcHRpb25zLCBrZXkpID8gZGVmYXVsdFZhbHVlIDogb3B0aW9uc1trZXldXG59XG5cbi8qKlxuICogQGNhbGxiYWNrIHZhbGlkYXRlT2JqZWN0XG4gKiBAcGFyYW0geyp9IHZhbHVlXG4gKiBAcGFyYW0ge3N0cmluZ30gbmFtZVxuICogQHBhcmFtIHt7XG4gKiAgIGFsbG93QXJyYXk/OiBib29sZWFuLFxuICogICBhbGxvd0Z1bmN0aW9uPzogYm9vbGVhbixcbiAqICAgbnVsbGFibGU/OiBib29sZWFuXG4gKiB9fSBbb3B0aW9uc11cbiAqL1xuXG4vKiogQHR5cGUge3ZhbGlkYXRlT2JqZWN0fSAqL1xuY29uc3QgdmFsaWRhdGVPYmplY3QgPSBoaWRlU3RhY2tGcmFtZXMoKHZhbHVlLCBuYW1lLCBvcHRpb25zID0gbnVsbCkgPT4ge1xuICBjb25zdCBhbGxvd0FycmF5ID0gZ2V0T3duUHJvcGVydHlWYWx1ZU9yRGVmYXVsdChvcHRpb25zLCAnYWxsb3dBcnJheScsIGZhbHNlKVxuICBjb25zdCBhbGxvd0Z1bmN0aW9uID0gZ2V0T3duUHJvcGVydHlWYWx1ZU9yRGVmYXVsdChvcHRpb25zLCAnYWxsb3dGdW5jdGlvbicsIGZhbHNlKVxuICBjb25zdCBudWxsYWJsZSA9IGdldE93blByb3BlcnR5VmFsdWVPckRlZmF1bHQob3B0aW9ucywgJ251bGxhYmxlJywgZmFsc2UpXG4gIGlmIChcbiAgICAoIW51bGxhYmxlICYmIHZhbHVlID09PSBudWxsKSB8fFxuICAgICghYWxsb3dBcnJheSAmJiBBcnJheUlzQXJyYXkodmFsdWUpKSB8fFxuICAgICh0eXBlb2YgdmFsdWUgIT09ICdvYmplY3QnICYmICghYWxsb3dGdW5jdGlvbiB8fCB0eXBlb2YgdmFsdWUgIT09ICdmdW5jdGlvbicpKVxuICApIHtcbiAgICB0aHJvdyBuZXcgRVJSX0lOVkFMSURfQVJHX1RZUEUobmFtZSwgJ09iamVjdCcsIHZhbHVlKVxuICB9XG59KVxuXG4vKipcbiAqIEBjYWxsYmFjayB2YWxpZGF0ZURpY3Rpb25hcnkgLSBXZSBhcmUgdXNpbmcgdGhlIFdlYiBJREwgU3RhbmRhcmQgZGVmaW5pdGlvblxuICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9mIFwiZGljdGlvbmFyeVwiIGhlcmUsIHdoaWNoIG1lYW5zIGFueSB2YWx1ZVxuICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdob3NlIFR5cGUgaXMgZWl0aGVyIFVuZGVmaW5lZCwgTnVsbCwgb3JcbiAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPYmplY3QgKHdoaWNoIGluY2x1ZGVzIGZ1bmN0aW9ucykuXG4gKiBAcGFyYW0geyp9IHZhbHVlXG4gKiBAcGFyYW0ge3N0cmluZ30gbmFtZVxuICogQHNlZSBodHRwczovL3dlYmlkbC5zcGVjLndoYXR3Zy5vcmcvI2VzLWRpY3Rpb25hcnlcbiAqIEBzZWUgaHR0cHM6Ly90YzM5LmVzL2VjbWEyNjIvI3RhYmxlLXR5cGVvZi1vcGVyYXRvci1yZXN1bHRzXG4gKi9cblxuLyoqIEB0eXBlIHt2YWxpZGF0ZURpY3Rpb25hcnl9ICovXG5jb25zdCB2YWxpZGF0ZURpY3Rpb25hcnkgPSBoaWRlU3RhY2tGcmFtZXMoKHZhbHVlLCBuYW1lKSA9PiB7XG4gIGlmICh2YWx1ZSAhPSBudWxsICYmIHR5cGVvZiB2YWx1ZSAhPT0gJ29iamVjdCcgJiYgdHlwZW9mIHZhbHVlICE9PSAnZnVuY3Rpb24nKSB7XG4gICAgdGhyb3cgbmV3IEVSUl9JTlZBTElEX0FSR19UWVBFKG5hbWUsICdhIGRpY3Rpb25hcnknLCB2YWx1ZSlcbiAgfVxufSlcblxuLyoqXG4gKiBAY2FsbGJhY2sgdmFsaWRhdGVBcnJheVxuICogQHBhcmFtIHsqfSB2YWx1ZVxuICogQHBhcmFtIHtzdHJpbmd9IG5hbWVcbiAqIEBwYXJhbSB7bnVtYmVyfSBbbWluTGVuZ3RoXVxuICogQHJldHVybnMge2Fzc2VydHMgdmFsdWUgaXMgYW55W119XG4gKi9cblxuLyoqIEB0eXBlIHt2YWxpZGF0ZUFycmF5fSAqL1xuY29uc3QgdmFsaWRhdGVBcnJheSA9IGhpZGVTdGFja0ZyYW1lcygodmFsdWUsIG5hbWUsIG1pbkxlbmd0aCA9IDApID0+IHtcbiAgaWYgKCFBcnJheUlzQXJyYXkodmFsdWUpKSB7XG4gICAgdGhyb3cgbmV3IEVSUl9JTlZBTElEX0FSR19UWVBFKG5hbWUsICdBcnJheScsIHZhbHVlKVxuICB9XG4gIGlmICh2YWx1ZS5sZW5ndGggPCBtaW5MZW5ndGgpIHtcbiAgICBjb25zdCByZWFzb24gPSBgbXVzdCBiZSBsb25nZXIgdGhhbiAke21pbkxlbmd0aH1gXG4gICAgdGhyb3cgbmV3IEVSUl9JTlZBTElEX0FSR19WQUxVRShuYW1lLCB2YWx1ZSwgcmVhc29uKVxuICB9XG59KVxuXG4vKipcbiAqIEBjYWxsYmFjayB2YWxpZGF0ZVN0cmluZ0FycmF5XG4gKiBAcGFyYW0geyp9IHZhbHVlXG4gKiBAcGFyYW0ge3N0cmluZ30gbmFtZVxuICogQHJldHVybnMge2Fzc2VydHMgdmFsdWUgaXMgc3RyaW5nW119XG4gKi9cblxuLyoqIEB0eXBlIHt2YWxpZGF0ZVN0cmluZ0FycmF5fSAqL1xuZnVuY3Rpb24gdmFsaWRhdGVTdHJpbmdBcnJheSh2YWx1ZSwgbmFtZSkge1xuICB2YWxpZGF0ZUFycmF5KHZhbHVlLCBuYW1lKVxuICBmb3IgKGxldCBpID0gMDsgaSA8IHZhbHVlLmxlbmd0aDsgaSsrKSB7XG4gICAgdmFsaWRhdGVTdHJpbmcodmFsdWVbaV0sIGAke25hbWV9WyR7aX1dYClcbiAgfVxufVxuXG4vKipcbiAqIEBjYWxsYmFjayB2YWxpZGF0ZUJvb2xlYW5BcnJheVxuICogQHBhcmFtIHsqfSB2YWx1ZVxuICogQHBhcmFtIHtzdHJpbmd9IG5hbWVcbiAqIEByZXR1cm5zIHthc3NlcnRzIHZhbHVlIGlzIGJvb2xlYW5bXX1cbiAqL1xuXG4vKiogQHR5cGUge3ZhbGlkYXRlQm9vbGVhbkFycmF5fSAqL1xuZnVuY3Rpb24gdmFsaWRhdGVCb29sZWFuQXJyYXkodmFsdWUsIG5hbWUpIHtcbiAgdmFsaWRhdGVBcnJheSh2YWx1ZSwgbmFtZSlcbiAgZm9yIChsZXQgaSA9IDA7IGkgPCB2YWx1ZS5sZW5ndGg7IGkrKykge1xuICAgIHZhbGlkYXRlQm9vbGVhbih2YWx1ZVtpXSwgYCR7bmFtZX1bJHtpfV1gKVxuICB9XG59XG5cbi8qKlxuICogQGNhbGxiYWNrIHZhbGlkYXRlQWJvcnRTaWduYWxBcnJheVxuICogQHBhcmFtIHsqfSB2YWx1ZVxuICogQHBhcmFtIHtzdHJpbmd9IG5hbWVcbiAqIEByZXR1cm5zIHthc3NlcnRzIHZhbHVlIGlzIEFib3J0U2lnbmFsW119XG4gKi9cblxuLyoqIEB0eXBlIHt2YWxpZGF0ZUFib3J0U2lnbmFsQXJyYXl9ICovXG5mdW5jdGlvbiB2YWxpZGF0ZUFib3J0U2lnbmFsQXJyYXkodmFsdWUsIG5hbWUpIHtcbiAgdmFsaWRhdGVBcnJheSh2YWx1ZSwgbmFtZSlcbiAgZm9yIChsZXQgaSA9IDA7IGkgPCB2YWx1ZS5sZW5ndGg7IGkrKykge1xuICAgIGNvbnN0IHNpZ25hbCA9IHZhbHVlW2ldXG4gICAgY29uc3QgaW5kZXhlZE5hbWUgPSBgJHtuYW1lfVske2l9XWBcbiAgICBpZiAoc2lnbmFsID09IG51bGwpIHtcbiAgICAgIHRocm93IG5ldyBFUlJfSU5WQUxJRF9BUkdfVFlQRShpbmRleGVkTmFtZSwgJ0Fib3J0U2lnbmFsJywgc2lnbmFsKVxuICAgIH1cbiAgICB2YWxpZGF0ZUFib3J0U2lnbmFsKHNpZ25hbCwgaW5kZXhlZE5hbWUpXG4gIH1cbn1cblxuLyoqXG4gKiBAcGFyYW0geyp9IHNpZ25hbFxuICogQHBhcmFtIHtzdHJpbmd9IFtuYW1lPSdzaWduYWwnXVxuICogQHJldHVybnMge2Fzc2VydHMgc2lnbmFsIGlzIGtleW9mIHNpZ25hbHN9XG4gKi9cbmZ1bmN0aW9uIHZhbGlkYXRlU2lnbmFsTmFtZShzaWduYWwsIG5hbWUgPSAnc2lnbmFsJykge1xuICB2YWxpZGF0ZVN0cmluZyhzaWduYWwsIG5hbWUpXG4gIGlmIChzaWduYWxzW3NpZ25hbF0gPT09IHVuZGVmaW5lZCkge1xuICAgIGlmIChzaWduYWxzW1N0cmluZ1Byb3RvdHlwZVRvVXBwZXJDYXNlKHNpZ25hbCldICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIHRocm93IG5ldyBFUlJfVU5LTk9XTl9TSUdOQUwoc2lnbmFsICsgJyAoc2lnbmFscyBtdXN0IHVzZSBhbGwgY2FwaXRhbCBsZXR0ZXJzKScpXG4gICAgfVxuICAgIHRocm93IG5ldyBFUlJfVU5LTk9XTl9TSUdOQUwoc2lnbmFsKVxuICB9XG59XG5cbi8qKlxuICogQGNhbGxiYWNrIHZhbGlkYXRlQnVmZmVyXG4gKiBAcGFyYW0geyp9IGJ1ZmZlclxuICogQHBhcmFtIHtzdHJpbmd9IFtuYW1lPSdidWZmZXInXVxuICogQHJldHVybnMge2Fzc2VydHMgYnVmZmVyIGlzIEFycmF5QnVmZmVyVmlld31cbiAqL1xuXG4vKiogQHR5cGUge3ZhbGlkYXRlQnVmZmVyfSAqL1xuY29uc3QgdmFsaWRhdGVCdWZmZXIgPSBoaWRlU3RhY2tGcmFtZXMoKGJ1ZmZlciwgbmFtZSA9ICdidWZmZXInKSA9PiB7XG4gIGlmICghaXNBcnJheUJ1ZmZlclZpZXcoYnVmZmVyKSkge1xuICAgIHRocm93IG5ldyBFUlJfSU5WQUxJRF9BUkdfVFlQRShuYW1lLCBbJ0J1ZmZlcicsICdUeXBlZEFycmF5JywgJ0RhdGFWaWV3J10sIGJ1ZmZlcilcbiAgfVxufSlcblxuLyoqXG4gKiBAcGFyYW0ge3N0cmluZ30gZGF0YVxuICogQHBhcmFtIHtzdHJpbmd9IGVuY29kaW5nXG4gKi9cbmZ1bmN0aW9uIHZhbGlkYXRlRW5jb2RpbmcoZGF0YSwgZW5jb2RpbmcpIHtcbiAgY29uc3Qgbm9ybWFsaXplZEVuY29kaW5nID0gbm9ybWFsaXplRW5jb2RpbmcoZW5jb2RpbmcpXG4gIGNvbnN0IGxlbmd0aCA9IGRhdGEubGVuZ3RoXG4gIGlmIChub3JtYWxpemVkRW5jb2RpbmcgPT09ICdoZXgnICYmIGxlbmd0aCAlIDIgIT09IDApIHtcbiAgICB0aHJvdyBuZXcgRVJSX0lOVkFMSURfQVJHX1ZBTFVFKCdlbmNvZGluZycsIGVuY29kaW5nLCBgaXMgaW52YWxpZCBmb3IgZGF0YSBvZiBsZW5ndGggJHtsZW5ndGh9YClcbiAgfVxufVxuXG4vKipcbiAqIENoZWNrIHRoYXQgdGhlIHBvcnQgbnVtYmVyIGlzIG5vdCBOYU4gd2hlbiBjb2VyY2VkIHRvIGEgbnVtYmVyLFxuICogaXMgYW4gaW50ZWdlciBhbmQgdGhhdCBpdCBmYWxscyB3aXRoaW4gdGhlIGxlZ2FsIHJhbmdlIG9mIHBvcnQgbnVtYmVycy5cbiAqIEBwYXJhbSB7Kn0gcG9ydFxuICogQHBhcmFtIHtzdHJpbmd9IFtuYW1lPSdQb3J0J11cbiAqIEBwYXJhbSB7Ym9vbGVhbn0gW2FsbG93WmVybz10cnVlXVxuICogQHJldHVybnMge251bWJlcn1cbiAqL1xuZnVuY3Rpb24gdmFsaWRhdGVQb3J0KHBvcnQsIG5hbWUgPSAnUG9ydCcsIGFsbG93WmVybyA9IHRydWUpIHtcbiAgaWYgKFxuICAgICh0eXBlb2YgcG9ydCAhPT0gJ251bWJlcicgJiYgdHlwZW9mIHBvcnQgIT09ICdzdHJpbmcnKSB8fFxuICAgICh0eXBlb2YgcG9ydCA9PT0gJ3N0cmluZycgJiYgU3RyaW5nUHJvdG90eXBlVHJpbShwb3J0KS5sZW5ndGggPT09IDApIHx8XG4gICAgK3BvcnQgIT09ICtwb3J0ID4+PiAwIHx8XG4gICAgcG9ydCA+IDB4ZmZmZiB8fFxuICAgIChwb3J0ID09PSAwICYmICFhbGxvd1plcm8pXG4gICkge1xuICAgIHRocm93IG5ldyBFUlJfU09DS0VUX0JBRF9QT1JUKG5hbWUsIHBvcnQsIGFsbG93WmVybylcbiAgfVxuICByZXR1cm4gcG9ydCB8IDBcbn1cblxuLyoqXG4gKiBAY2FsbGJhY2sgdmFsaWRhdGVBYm9ydFNpZ25hbFxuICogQHBhcmFtIHsqfSBzaWduYWxcbiAqIEBwYXJhbSB7c3RyaW5nfSBuYW1lXG4gKi9cblxuLyoqIEB0eXBlIHt2YWxpZGF0ZUFib3J0U2lnbmFsfSAqL1xuY29uc3QgdmFsaWRhdGVBYm9ydFNpZ25hbCA9IGhpZGVTdGFja0ZyYW1lcygoc2lnbmFsLCBuYW1lKSA9PiB7XG4gIGlmIChzaWduYWwgIT09IHVuZGVmaW5lZCAmJiAoc2lnbmFsID09PSBudWxsIHx8IHR5cGVvZiBzaWduYWwgIT09ICdvYmplY3QnIHx8ICEoJ2Fib3J0ZWQnIGluIHNpZ25hbCkpKSB7XG4gICAgdGhyb3cgbmV3IEVSUl9JTlZBTElEX0FSR19UWVBFKG5hbWUsICdBYm9ydFNpZ25hbCcsIHNpZ25hbClcbiAgfVxufSlcblxuLyoqXG4gKiBAY2FsbGJhY2sgdmFsaWRhdGVGdW5jdGlvblxuICogQHBhcmFtIHsqfSB2YWx1ZVxuICogQHBhcmFtIHtzdHJpbmd9IG5hbWVcbiAqIEByZXR1cm5zIHthc3NlcnRzIHZhbHVlIGlzIEZ1bmN0aW9ufVxuICovXG5cbi8qKiBAdHlwZSB7dmFsaWRhdGVGdW5jdGlvbn0gKi9cbmNvbnN0IHZhbGlkYXRlRnVuY3Rpb24gPSBoaWRlU3RhY2tGcmFtZXMoKHZhbHVlLCBuYW1lKSA9PiB7XG4gIGlmICh0eXBlb2YgdmFsdWUgIT09ICdmdW5jdGlvbicpIHRocm93IG5ldyBFUlJfSU5WQUxJRF9BUkdfVFlQRShuYW1lLCAnRnVuY3Rpb24nLCB2YWx1ZSlcbn0pXG5cbi8qKlxuICogQGNhbGxiYWNrIHZhbGlkYXRlUGxhaW5GdW5jdGlvblxuICogQHBhcmFtIHsqfSB2YWx1ZVxuICogQHBhcmFtIHtzdHJpbmd9IG5hbWVcbiAqIEByZXR1cm5zIHthc3NlcnRzIHZhbHVlIGlzIEZ1bmN0aW9ufVxuICovXG5cbi8qKiBAdHlwZSB7dmFsaWRhdGVQbGFpbkZ1bmN0aW9ufSAqL1xuY29uc3QgdmFsaWRhdGVQbGFpbkZ1bmN0aW9uID0gaGlkZVN0YWNrRnJhbWVzKCh2YWx1ZSwgbmFtZSkgPT4ge1xuICBpZiAodHlwZW9mIHZhbHVlICE9PSAnZnVuY3Rpb24nIHx8IGlzQXN5bmNGdW5jdGlvbih2YWx1ZSkpIHRocm93IG5ldyBFUlJfSU5WQUxJRF9BUkdfVFlQRShuYW1lLCAnRnVuY3Rpb24nLCB2YWx1ZSlcbn0pXG5cbi8qKlxuICogQGNhbGxiYWNrIHZhbGlkYXRlVW5kZWZpbmVkXG4gKiBAcGFyYW0geyp9IHZhbHVlXG4gKiBAcGFyYW0ge3N0cmluZ30gbmFtZVxuICogQHJldHVybnMge2Fzc2VydHMgdmFsdWUgaXMgdW5kZWZpbmVkfVxuICovXG5cbi8qKiBAdHlwZSB7dmFsaWRhdGVVbmRlZmluZWR9ICovXG5jb25zdCB2YWxpZGF0ZVVuZGVmaW5lZCA9IGhpZGVTdGFja0ZyYW1lcygodmFsdWUsIG5hbWUpID0+IHtcbiAgaWYgKHZhbHVlICE9PSB1bmRlZmluZWQpIHRocm93IG5ldyBFUlJfSU5WQUxJRF9BUkdfVFlQRShuYW1lLCAndW5kZWZpbmVkJywgdmFsdWUpXG59KVxuXG4vKipcbiAqIEB0ZW1wbGF0ZSBUXG4gKiBAcGFyYW0ge1R9IHZhbHVlXG4gKiBAcGFyYW0ge3N0cmluZ30gbmFtZVxuICogQHBhcmFtIHtUW119IHVuaW9uXG4gKi9cbmZ1bmN0aW9uIHZhbGlkYXRlVW5pb24odmFsdWUsIG5hbWUsIHVuaW9uKSB7XG4gIGlmICghQXJyYXlQcm90b3R5cGVJbmNsdWRlcyh1bmlvbiwgdmFsdWUpKSB7XG4gICAgdGhyb3cgbmV3IEVSUl9JTlZBTElEX0FSR19UWVBFKG5hbWUsIGAoJyR7QXJyYXlQcm90b3R5cGVKb2luKHVuaW9uLCAnfCcpfScpYCwgdmFsdWUpXG4gIH1cbn1cblxuLypcbiAgVGhlIHJ1bGVzIGZvciB0aGUgTGluayBoZWFkZXIgZmllbGQgYXJlIGRlc2NyaWJlZCBoZXJlOlxuICBodHRwczovL3d3dy5yZmMtZWRpdG9yLm9yZy9yZmMvcmZjODI4OC5odG1sI3NlY3Rpb24tM1xuXG4gIFRoaXMgcmVnZXggdmFsaWRhdGVzIGFueSBzdHJpbmcgc3Vycm91bmRlZCBieSBhbmdsZSBicmFja2V0c1xuICAobm90IG5lY2Vzc2FyaWx5IGEgdmFsaWQgVVJJIHJlZmVyZW5jZSkgZm9sbG93ZWQgYnkgemVybyBvciBtb3JlXG4gIGxpbmstcGFyYW1zIHNlcGFyYXRlZCBieSBzZW1pY29sb25zLlxuKi9cbmNvbnN0IGxpbmtWYWx1ZVJlZ0V4cCA9IC9eKD86PFtePl0qPikoPzpcXHMqO1xccypbXjtcIlxcc10rKD86PShcIik/W147XCJcXHNdKlxcMSk/KSokL1xuXG4vKipcbiAqIEBwYXJhbSB7YW55fSB2YWx1ZVxuICogQHBhcmFtIHtzdHJpbmd9IG5hbWVcbiAqL1xuZnVuY3Rpb24gdmFsaWRhdGVMaW5rSGVhZGVyRm9ybWF0KHZhbHVlLCBuYW1lKSB7XG4gIGlmICh0eXBlb2YgdmFsdWUgPT09ICd1bmRlZmluZWQnIHx8ICFSZWdFeHBQcm90b3R5cGVFeGVjKGxpbmtWYWx1ZVJlZ0V4cCwgdmFsdWUpKSB7XG4gICAgdGhyb3cgbmV3IEVSUl9JTlZBTElEX0FSR19WQUxVRShcbiAgICAgIG5hbWUsXG4gICAgICB2YWx1ZSxcbiAgICAgICdtdXN0IGJlIGFuIGFycmF5IG9yIHN0cmluZyBvZiBmb3JtYXQgXCI8L3N0eWxlcy5jc3M+OyByZWw9cHJlbG9hZDsgYXM9c3R5bGVcIidcbiAgICApXG4gIH1cbn1cblxuLyoqXG4gKiBAcGFyYW0ge2FueX0gaGludHNcbiAqIEByZXR1cm4ge3N0cmluZ31cbiAqL1xuZnVuY3Rpb24gdmFsaWRhdGVMaW5rSGVhZGVyVmFsdWUoaGludHMpIHtcbiAgaWYgKHR5cGVvZiBoaW50cyA9PT0gJ3N0cmluZycpIHtcbiAgICB2YWxpZGF0ZUxpbmtIZWFkZXJGb3JtYXQoaGludHMsICdoaW50cycpXG4gICAgcmV0dXJuIGhpbnRzXG4gIH0gZWxzZSBpZiAoQXJyYXlJc0FycmF5KGhpbnRzKSkge1xuICAgIGNvbnN0IGhpbnRzTGVuZ3RoID0gaGludHMubGVuZ3RoXG4gICAgbGV0IHJlc3VsdCA9ICcnXG4gICAgaWYgKGhpbnRzTGVuZ3RoID09PSAwKSB7XG4gICAgICByZXR1cm4gcmVzdWx0XG4gICAgfVxuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgaGludHNMZW5ndGg7IGkrKykge1xuICAgICAgY29uc3QgbGluayA9IGhpbnRzW2ldXG4gICAgICB2YWxpZGF0ZUxpbmtIZWFkZXJGb3JtYXQobGluaywgJ2hpbnRzJylcbiAgICAgIHJlc3VsdCArPSBsaW5rXG4gICAgICBpZiAoaSAhPT0gaGludHNMZW5ndGggLSAxKSB7XG4gICAgICAgIHJlc3VsdCArPSAnLCAnXG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiByZXN1bHRcbiAgfVxuICB0aHJvdyBuZXcgRVJSX0lOVkFMSURfQVJHX1ZBTFVFKFxuICAgICdoaW50cycsXG4gICAgaGludHMsXG4gICAgJ211c3QgYmUgYW4gYXJyYXkgb3Igc3RyaW5nIG9mIGZvcm1hdCBcIjwvc3R5bGVzLmNzcz47IHJlbD1wcmVsb2FkOyBhcz1zdHlsZVwiJ1xuICApXG59XG5tb2R1bGUuZXhwb3J0cyA9IHtcbiAgaXNJbnQzMixcbiAgaXNVaW50MzIsXG4gIHBhcnNlRmlsZU1vZGUsXG4gIHZhbGlkYXRlQXJyYXksXG4gIHZhbGlkYXRlU3RyaW5nQXJyYXksXG4gIHZhbGlkYXRlQm9vbGVhbkFycmF5LFxuICB2YWxpZGF0ZUFib3J0U2lnbmFsQXJyYXksXG4gIHZhbGlkYXRlQm9vbGVhbixcbiAgdmFsaWRhdGVCdWZmZXIsXG4gIHZhbGlkYXRlRGljdGlvbmFyeSxcbiAgdmFsaWRhdGVFbmNvZGluZyxcbiAgdmFsaWRhdGVGdW5jdGlvbixcbiAgdmFsaWRhdGVJbnQzMixcbiAgdmFsaWRhdGVJbnRlZ2VyLFxuICB2YWxpZGF0ZU51bWJlcixcbiAgdmFsaWRhdGVPYmplY3QsXG4gIHZhbGlkYXRlT25lT2YsXG4gIHZhbGlkYXRlUGxhaW5GdW5jdGlvbixcbiAgdmFsaWRhdGVQb3J0LFxuICB2YWxpZGF0ZVNpZ25hbE5hbWUsXG4gIHZhbGlkYXRlU3RyaW5nLFxuICB2YWxpZGF0ZVVpbnQzMixcbiAgdmFsaWRhdGVVbmRlZmluZWQsXG4gIHZhbGlkYXRlVW5pb24sXG4gIHZhbGlkYXRlQWJvcnRTaWduYWwsXG4gIHZhbGlkYXRlTGlua0hlYWRlclZhbHVlXG59XG4iLAogICAgIi8vIGZvciBub3cganVzdCBleHBvc2UgdGhlIGJ1aWx0aW4gcHJvY2VzcyBnbG9iYWwgZnJvbSBub2RlLmpzXG5tb2R1bGUuZXhwb3J0cyA9IGdsb2JhbC5wcm9jZXNzO1xuIiwKICAgICIndXNlIHN0cmljdCdcblxuY29uc3QgeyBTeW1ib2xBc3luY0l0ZXJhdG9yLCBTeW1ib2xJdGVyYXRvciwgU3ltYm9sRm9yIH0gPSByZXF1aXJlKCcuLi8uLi9vdXJzL3ByaW1vcmRpYWxzJylcblxuLy8gV2UgbmVlZCB0byB1c2UgU3ltYm9sRm9yIHRvIG1ha2UgdGhlc2UgZ2xvYmFsbHkgYXZhaWxhYmxlXG4vLyBmb3IgaW50ZXJvcHQgd2l0aCByZWFkYWJsZS1zdHJlYW0sIGkuZS4gcmVhZGFibGUtc3RyZWFtXG4vLyBhbmQgbm9kZSBjb3JlIG5lZWRzIHRvIGJlIGFibGUgdG8gcmVhZC93cml0ZSBwcml2YXRlIHN0YXRlXG4vLyBmcm9tIGVhY2ggb3RoZXIgZm9yIHByb3BlciBpbnRlcm9wZXJhYmlsaXR5LlxuY29uc3Qga0lzRGVzdHJveWVkID0gU3ltYm9sRm9yKCdub2RlanMuc3RyZWFtLmRlc3Ryb3llZCcpXG5jb25zdCBrSXNFcnJvcmVkID0gU3ltYm9sRm9yKCdub2RlanMuc3RyZWFtLmVycm9yZWQnKVxuY29uc3Qga0lzUmVhZGFibGUgPSBTeW1ib2xGb3IoJ25vZGVqcy5zdHJlYW0ucmVhZGFibGUnKVxuY29uc3Qga0lzV3JpdGFibGUgPSBTeW1ib2xGb3IoJ25vZGVqcy5zdHJlYW0ud3JpdGFibGUnKVxuY29uc3Qga0lzRGlzdHVyYmVkID0gU3ltYm9sRm9yKCdub2RlanMuc3RyZWFtLmRpc3R1cmJlZCcpXG5jb25zdCBrSXNDbG9zZWRQcm9taXNlID0gU3ltYm9sRm9yKCdub2RlanMud2Vic3RyZWFtLmlzQ2xvc2VkUHJvbWlzZScpXG5jb25zdCBrQ29udHJvbGxlckVycm9yRnVuY3Rpb24gPSBTeW1ib2xGb3IoJ25vZGVqcy53ZWJzdHJlYW0uY29udHJvbGxlckVycm9yRnVuY3Rpb24nKVxuZnVuY3Rpb24gaXNSZWFkYWJsZU5vZGVTdHJlYW0ob2JqLCBzdHJpY3QgPSBmYWxzZSkge1xuICB2YXIgX29iaiRfcmVhZGFibGVTdGF0ZVxuICByZXR1cm4gISEoXG4gICAgKFxuICAgICAgb2JqICYmXG4gICAgICB0eXBlb2Ygb2JqLnBpcGUgPT09ICdmdW5jdGlvbicgJiZcbiAgICAgIHR5cGVvZiBvYmoub24gPT09ICdmdW5jdGlvbicgJiZcbiAgICAgICghc3RyaWN0IHx8ICh0eXBlb2Ygb2JqLnBhdXNlID09PSAnZnVuY3Rpb24nICYmIHR5cGVvZiBvYmoucmVzdW1lID09PSAnZnVuY3Rpb24nKSkgJiZcbiAgICAgICghb2JqLl93cml0YWJsZVN0YXRlIHx8XG4gICAgICAgICgoX29iaiRfcmVhZGFibGVTdGF0ZSA9IG9iai5fcmVhZGFibGVTdGF0ZSkgPT09IG51bGwgfHwgX29iaiRfcmVhZGFibGVTdGF0ZSA9PT0gdW5kZWZpbmVkXG4gICAgICAgICAgPyB1bmRlZmluZWRcbiAgICAgICAgICA6IF9vYmokX3JlYWRhYmxlU3RhdGUucmVhZGFibGUpICE9PSBmYWxzZSkgJiZcbiAgICAgIC8vIER1cGxleFxuICAgICAgKCFvYmouX3dyaXRhYmxlU3RhdGUgfHwgb2JqLl9yZWFkYWJsZVN0YXRlKVxuICAgICkgLy8gV3JpdGFibGUgaGFzIC5waXBlLlxuICApXG59XG5cbmZ1bmN0aW9uIGlzV3JpdGFibGVOb2RlU3RyZWFtKG9iaikge1xuICB2YXIgX29iaiRfd3JpdGFibGVTdGF0ZVxuICByZXR1cm4gISEoXG4gICAgKFxuICAgICAgb2JqICYmXG4gICAgICB0eXBlb2Ygb2JqLndyaXRlID09PSAnZnVuY3Rpb24nICYmXG4gICAgICB0eXBlb2Ygb2JqLm9uID09PSAnZnVuY3Rpb24nICYmXG4gICAgICAoIW9iai5fcmVhZGFibGVTdGF0ZSB8fFxuICAgICAgICAoKF9vYmokX3dyaXRhYmxlU3RhdGUgPSBvYmouX3dyaXRhYmxlU3RhdGUpID09PSBudWxsIHx8IF9vYmokX3dyaXRhYmxlU3RhdGUgPT09IHVuZGVmaW5lZFxuICAgICAgICAgID8gdW5kZWZpbmVkXG4gICAgICAgICAgOiBfb2JqJF93cml0YWJsZVN0YXRlLndyaXRhYmxlKSAhPT0gZmFsc2UpXG4gICAgKSAvLyBEdXBsZXhcbiAgKVxufVxuXG5mdW5jdGlvbiBpc0R1cGxleE5vZGVTdHJlYW0ob2JqKSB7XG4gIHJldHVybiAhIShcbiAgICBvYmogJiZcbiAgICB0eXBlb2Ygb2JqLnBpcGUgPT09ICdmdW5jdGlvbicgJiZcbiAgICBvYmouX3JlYWRhYmxlU3RhdGUgJiZcbiAgICB0eXBlb2Ygb2JqLm9uID09PSAnZnVuY3Rpb24nICYmXG4gICAgdHlwZW9mIG9iai53cml0ZSA9PT0gJ2Z1bmN0aW9uJ1xuICApXG59XG5mdW5jdGlvbiBpc05vZGVTdHJlYW0ob2JqKSB7XG4gIHJldHVybiAoXG4gICAgb2JqICYmXG4gICAgKG9iai5fcmVhZGFibGVTdGF0ZSB8fFxuICAgICAgb2JqLl93cml0YWJsZVN0YXRlIHx8XG4gICAgICAodHlwZW9mIG9iai53cml0ZSA9PT0gJ2Z1bmN0aW9uJyAmJiB0eXBlb2Ygb2JqLm9uID09PSAnZnVuY3Rpb24nKSB8fFxuICAgICAgKHR5cGVvZiBvYmoucGlwZSA9PT0gJ2Z1bmN0aW9uJyAmJiB0eXBlb2Ygb2JqLm9uID09PSAnZnVuY3Rpb24nKSlcbiAgKVxufVxuZnVuY3Rpb24gaXNSZWFkYWJsZVN0cmVhbShvYmopIHtcbiAgcmV0dXJuICEhKFxuICAgIG9iaiAmJlxuICAgICFpc05vZGVTdHJlYW0ob2JqKSAmJlxuICAgIHR5cGVvZiBvYmoucGlwZVRocm91Z2ggPT09ICdmdW5jdGlvbicgJiZcbiAgICB0eXBlb2Ygb2JqLmdldFJlYWRlciA9PT0gJ2Z1bmN0aW9uJyAmJlxuICAgIHR5cGVvZiBvYmouY2FuY2VsID09PSAnZnVuY3Rpb24nXG4gIClcbn1cbmZ1bmN0aW9uIGlzV3JpdGFibGVTdHJlYW0ob2JqKSB7XG4gIHJldHVybiAhIShvYmogJiYgIWlzTm9kZVN0cmVhbShvYmopICYmIHR5cGVvZiBvYmouZ2V0V3JpdGVyID09PSAnZnVuY3Rpb24nICYmIHR5cGVvZiBvYmouYWJvcnQgPT09ICdmdW5jdGlvbicpXG59XG5mdW5jdGlvbiBpc1RyYW5zZm9ybVN0cmVhbShvYmopIHtcbiAgcmV0dXJuICEhKG9iaiAmJiAhaXNOb2RlU3RyZWFtKG9iaikgJiYgdHlwZW9mIG9iai5yZWFkYWJsZSA9PT0gJ29iamVjdCcgJiYgdHlwZW9mIG9iai53cml0YWJsZSA9PT0gJ29iamVjdCcpXG59XG5mdW5jdGlvbiBpc1dlYlN0cmVhbShvYmopIHtcbiAgcmV0dXJuIGlzUmVhZGFibGVTdHJlYW0ob2JqKSB8fCBpc1dyaXRhYmxlU3RyZWFtKG9iaikgfHwgaXNUcmFuc2Zvcm1TdHJlYW0ob2JqKVxufVxuZnVuY3Rpb24gaXNJdGVyYWJsZShvYmosIGlzQXN5bmMpIHtcbiAgaWYgKG9iaiA9PSBudWxsKSByZXR1cm4gZmFsc2VcbiAgaWYgKGlzQXN5bmMgPT09IHRydWUpIHJldHVybiB0eXBlb2Ygb2JqW1N5bWJvbEFzeW5jSXRlcmF0b3JdID09PSAnZnVuY3Rpb24nXG4gIGlmIChpc0FzeW5jID09PSBmYWxzZSkgcmV0dXJuIHR5cGVvZiBvYmpbU3ltYm9sSXRlcmF0b3JdID09PSAnZnVuY3Rpb24nXG4gIHJldHVybiB0eXBlb2Ygb2JqW1N5bWJvbEFzeW5jSXRlcmF0b3JdID09PSAnZnVuY3Rpb24nIHx8IHR5cGVvZiBvYmpbU3ltYm9sSXRlcmF0b3JdID09PSAnZnVuY3Rpb24nXG59XG5mdW5jdGlvbiBpc0Rlc3Ryb3llZChzdHJlYW0pIHtcbiAgaWYgKCFpc05vZGVTdHJlYW0oc3RyZWFtKSkgcmV0dXJuIG51bGxcbiAgY29uc3Qgd1N0YXRlID0gc3RyZWFtLl93cml0YWJsZVN0YXRlXG4gIGNvbnN0IHJTdGF0ZSA9IHN0cmVhbS5fcmVhZGFibGVTdGF0ZVxuICBjb25zdCBzdGF0ZSA9IHdTdGF0ZSB8fCByU3RhdGVcbiAgcmV0dXJuICEhKHN0cmVhbS5kZXN0cm95ZWQgfHwgc3RyZWFtW2tJc0Rlc3Ryb3llZF0gfHwgKHN0YXRlICE9PSBudWxsICYmIHN0YXRlICE9PSB1bmRlZmluZWQgJiYgc3RhdGUuZGVzdHJveWVkKSlcbn1cblxuLy8gSGF2ZSBiZWVuIGVuZCgpOmQuXG5mdW5jdGlvbiBpc1dyaXRhYmxlRW5kZWQoc3RyZWFtKSB7XG4gIGlmICghaXNXcml0YWJsZU5vZGVTdHJlYW0oc3RyZWFtKSkgcmV0dXJuIG51bGxcbiAgaWYgKHN0cmVhbS53cml0YWJsZUVuZGVkID09PSB0cnVlKSByZXR1cm4gdHJ1ZVxuICBjb25zdCB3U3RhdGUgPSBzdHJlYW0uX3dyaXRhYmxlU3RhdGVcbiAgaWYgKHdTdGF0ZSAhPT0gbnVsbCAmJiB3U3RhdGUgIT09IHVuZGVmaW5lZCAmJiB3U3RhdGUuZXJyb3JlZCkgcmV0dXJuIGZhbHNlXG4gIGlmICh0eXBlb2YgKHdTdGF0ZSA9PT0gbnVsbCB8fCB3U3RhdGUgPT09IHVuZGVmaW5lZCA/IHVuZGVmaW5lZCA6IHdTdGF0ZS5lbmRlZCkgIT09ICdib29sZWFuJykgcmV0dXJuIG51bGxcbiAgcmV0dXJuIHdTdGF0ZS5lbmRlZFxufVxuXG4vLyBIYXZlIGVtaXR0ZWQgJ2ZpbmlzaCcuXG5mdW5jdGlvbiBpc1dyaXRhYmxlRmluaXNoZWQoc3RyZWFtLCBzdHJpY3QpIHtcbiAgaWYgKCFpc1dyaXRhYmxlTm9kZVN0cmVhbShzdHJlYW0pKSByZXR1cm4gbnVsbFxuICBpZiAoc3RyZWFtLndyaXRhYmxlRmluaXNoZWQgPT09IHRydWUpIHJldHVybiB0cnVlXG4gIGNvbnN0IHdTdGF0ZSA9IHN0cmVhbS5fd3JpdGFibGVTdGF0ZVxuICBpZiAod1N0YXRlICE9PSBudWxsICYmIHdTdGF0ZSAhPT0gdW5kZWZpbmVkICYmIHdTdGF0ZS5lcnJvcmVkKSByZXR1cm4gZmFsc2VcbiAgaWYgKHR5cGVvZiAod1N0YXRlID09PSBudWxsIHx8IHdTdGF0ZSA9PT0gdW5kZWZpbmVkID8gdW5kZWZpbmVkIDogd1N0YXRlLmZpbmlzaGVkKSAhPT0gJ2Jvb2xlYW4nKSByZXR1cm4gbnVsbFxuICByZXR1cm4gISEod1N0YXRlLmZpbmlzaGVkIHx8IChzdHJpY3QgPT09IGZhbHNlICYmIHdTdGF0ZS5lbmRlZCA9PT0gdHJ1ZSAmJiB3U3RhdGUubGVuZ3RoID09PSAwKSlcbn1cblxuLy8gSGF2ZSBiZWVuIHB1c2gobnVsbCk6ZC5cbmZ1bmN0aW9uIGlzUmVhZGFibGVFbmRlZChzdHJlYW0pIHtcbiAgaWYgKCFpc1JlYWRhYmxlTm9kZVN0cmVhbShzdHJlYW0pKSByZXR1cm4gbnVsbFxuICBpZiAoc3RyZWFtLnJlYWRhYmxlRW5kZWQgPT09IHRydWUpIHJldHVybiB0cnVlXG4gIGNvbnN0IHJTdGF0ZSA9IHN0cmVhbS5fcmVhZGFibGVTdGF0ZVxuICBpZiAoIXJTdGF0ZSB8fCByU3RhdGUuZXJyb3JlZCkgcmV0dXJuIGZhbHNlXG4gIGlmICh0eXBlb2YgKHJTdGF0ZSA9PT0gbnVsbCB8fCByU3RhdGUgPT09IHVuZGVmaW5lZCA/IHVuZGVmaW5lZCA6IHJTdGF0ZS5lbmRlZCkgIT09ICdib29sZWFuJykgcmV0dXJuIG51bGxcbiAgcmV0dXJuIHJTdGF0ZS5lbmRlZFxufVxuXG4vLyBIYXZlIGVtaXR0ZWQgJ2VuZCcuXG5mdW5jdGlvbiBpc1JlYWRhYmxlRmluaXNoZWQoc3RyZWFtLCBzdHJpY3QpIHtcbiAgaWYgKCFpc1JlYWRhYmxlTm9kZVN0cmVhbShzdHJlYW0pKSByZXR1cm4gbnVsbFxuICBjb25zdCByU3RhdGUgPSBzdHJlYW0uX3JlYWRhYmxlU3RhdGVcbiAgaWYgKHJTdGF0ZSAhPT0gbnVsbCAmJiByU3RhdGUgIT09IHVuZGVmaW5lZCAmJiByU3RhdGUuZXJyb3JlZCkgcmV0dXJuIGZhbHNlXG4gIGlmICh0eXBlb2YgKHJTdGF0ZSA9PT0gbnVsbCB8fCByU3RhdGUgPT09IHVuZGVmaW5lZCA/IHVuZGVmaW5lZCA6IHJTdGF0ZS5lbmRFbWl0dGVkKSAhPT0gJ2Jvb2xlYW4nKSByZXR1cm4gbnVsbFxuICByZXR1cm4gISEoclN0YXRlLmVuZEVtaXR0ZWQgfHwgKHN0cmljdCA9PT0gZmFsc2UgJiYgclN0YXRlLmVuZGVkID09PSB0cnVlICYmIHJTdGF0ZS5sZW5ndGggPT09IDApKVxufVxuZnVuY3Rpb24gaXNSZWFkYWJsZShzdHJlYW0pIHtcbiAgaWYgKHN0cmVhbSAmJiBzdHJlYW1ba0lzUmVhZGFibGVdICE9IG51bGwpIHJldHVybiBzdHJlYW1ba0lzUmVhZGFibGVdXG4gIGlmICh0eXBlb2YgKHN0cmVhbSA9PT0gbnVsbCB8fCBzdHJlYW0gPT09IHVuZGVmaW5lZCA/IHVuZGVmaW5lZCA6IHN0cmVhbS5yZWFkYWJsZSkgIT09ICdib29sZWFuJykgcmV0dXJuIG51bGxcbiAgaWYgKGlzRGVzdHJveWVkKHN0cmVhbSkpIHJldHVybiBmYWxzZVxuICByZXR1cm4gaXNSZWFkYWJsZU5vZGVTdHJlYW0oc3RyZWFtKSAmJiBzdHJlYW0ucmVhZGFibGUgJiYgIWlzUmVhZGFibGVGaW5pc2hlZChzdHJlYW0pXG59XG5mdW5jdGlvbiBpc1dyaXRhYmxlKHN0cmVhbSkge1xuICBpZiAoc3RyZWFtICYmIHN0cmVhbVtrSXNXcml0YWJsZV0gIT0gbnVsbCkgcmV0dXJuIHN0cmVhbVtrSXNXcml0YWJsZV1cbiAgaWYgKHR5cGVvZiAoc3RyZWFtID09PSBudWxsIHx8IHN0cmVhbSA9PT0gdW5kZWZpbmVkID8gdW5kZWZpbmVkIDogc3RyZWFtLndyaXRhYmxlKSAhPT0gJ2Jvb2xlYW4nKSByZXR1cm4gbnVsbFxuICBpZiAoaXNEZXN0cm95ZWQoc3RyZWFtKSkgcmV0dXJuIGZhbHNlXG4gIHJldHVybiBpc1dyaXRhYmxlTm9kZVN0cmVhbShzdHJlYW0pICYmIHN0cmVhbS53cml0YWJsZSAmJiAhaXNXcml0YWJsZUVuZGVkKHN0cmVhbSlcbn1cbmZ1bmN0aW9uIGlzRmluaXNoZWQoc3RyZWFtLCBvcHRzKSB7XG4gIGlmICghaXNOb2RlU3RyZWFtKHN0cmVhbSkpIHtcbiAgICByZXR1cm4gbnVsbFxuICB9XG4gIGlmIChpc0Rlc3Ryb3llZChzdHJlYW0pKSB7XG4gICAgcmV0dXJuIHRydWVcbiAgfVxuICBpZiAoKG9wdHMgPT09IG51bGwgfHwgb3B0cyA9PT0gdW5kZWZpbmVkID8gdW5kZWZpbmVkIDogb3B0cy5yZWFkYWJsZSkgIT09IGZhbHNlICYmIGlzUmVhZGFibGUoc3RyZWFtKSkge1xuICAgIHJldHVybiBmYWxzZVxuICB9XG4gIGlmICgob3B0cyA9PT0gbnVsbCB8fCBvcHRzID09PSB1bmRlZmluZWQgPyB1bmRlZmluZWQgOiBvcHRzLndyaXRhYmxlKSAhPT0gZmFsc2UgJiYgaXNXcml0YWJsZShzdHJlYW0pKSB7XG4gICAgcmV0dXJuIGZhbHNlXG4gIH1cbiAgcmV0dXJuIHRydWVcbn1cbmZ1bmN0aW9uIGlzV3JpdGFibGVFcnJvcmVkKHN0cmVhbSkge1xuICB2YXIgX3N0cmVhbSRfd3JpdGFibGVTdGF0LCBfc3RyZWFtJF93cml0YWJsZVN0YXQyXG4gIGlmICghaXNOb2RlU3RyZWFtKHN0cmVhbSkpIHtcbiAgICByZXR1cm4gbnVsbFxuICB9XG4gIGlmIChzdHJlYW0ud3JpdGFibGVFcnJvcmVkKSB7XG4gICAgcmV0dXJuIHN0cmVhbS53cml0YWJsZUVycm9yZWRcbiAgfVxuICByZXR1cm4gKF9zdHJlYW0kX3dyaXRhYmxlU3RhdCA9XG4gICAgKF9zdHJlYW0kX3dyaXRhYmxlU3RhdDIgPSBzdHJlYW0uX3dyaXRhYmxlU3RhdGUpID09PSBudWxsIHx8IF9zdHJlYW0kX3dyaXRhYmxlU3RhdDIgPT09IHVuZGVmaW5lZFxuICAgICAgPyB1bmRlZmluZWRcbiAgICAgIDogX3N0cmVhbSRfd3JpdGFibGVTdGF0Mi5lcnJvcmVkKSAhPT0gbnVsbCAmJiBfc3RyZWFtJF93cml0YWJsZVN0YXQgIT09IHVuZGVmaW5lZFxuICAgID8gX3N0cmVhbSRfd3JpdGFibGVTdGF0XG4gICAgOiBudWxsXG59XG5mdW5jdGlvbiBpc1JlYWRhYmxlRXJyb3JlZChzdHJlYW0pIHtcbiAgdmFyIF9zdHJlYW0kX3JlYWRhYmxlU3RhdCwgX3N0cmVhbSRfcmVhZGFibGVTdGF0MlxuICBpZiAoIWlzTm9kZVN0cmVhbShzdHJlYW0pKSB7XG4gICAgcmV0dXJuIG51bGxcbiAgfVxuICBpZiAoc3RyZWFtLnJlYWRhYmxlRXJyb3JlZCkge1xuICAgIHJldHVybiBzdHJlYW0ucmVhZGFibGVFcnJvcmVkXG4gIH1cbiAgcmV0dXJuIChfc3RyZWFtJF9yZWFkYWJsZVN0YXQgPVxuICAgIChfc3RyZWFtJF9yZWFkYWJsZVN0YXQyID0gc3RyZWFtLl9yZWFkYWJsZVN0YXRlKSA9PT0gbnVsbCB8fCBfc3RyZWFtJF9yZWFkYWJsZVN0YXQyID09PSB1bmRlZmluZWRcbiAgICAgID8gdW5kZWZpbmVkXG4gICAgICA6IF9zdHJlYW0kX3JlYWRhYmxlU3RhdDIuZXJyb3JlZCkgIT09IG51bGwgJiYgX3N0cmVhbSRfcmVhZGFibGVTdGF0ICE9PSB1bmRlZmluZWRcbiAgICA/IF9zdHJlYW0kX3JlYWRhYmxlU3RhdFxuICAgIDogbnVsbFxufVxuZnVuY3Rpb24gaXNDbG9zZWQoc3RyZWFtKSB7XG4gIGlmICghaXNOb2RlU3RyZWFtKHN0cmVhbSkpIHtcbiAgICByZXR1cm4gbnVsbFxuICB9XG4gIGlmICh0eXBlb2Ygc3RyZWFtLmNsb3NlZCA9PT0gJ2Jvb2xlYW4nKSB7XG4gICAgcmV0dXJuIHN0cmVhbS5jbG9zZWRcbiAgfVxuICBjb25zdCB3U3RhdGUgPSBzdHJlYW0uX3dyaXRhYmxlU3RhdGVcbiAgY29uc3QgclN0YXRlID0gc3RyZWFtLl9yZWFkYWJsZVN0YXRlXG4gIGlmIChcbiAgICB0eXBlb2YgKHdTdGF0ZSA9PT0gbnVsbCB8fCB3U3RhdGUgPT09IHVuZGVmaW5lZCA/IHVuZGVmaW5lZCA6IHdTdGF0ZS5jbG9zZWQpID09PSAnYm9vbGVhbicgfHxcbiAgICB0eXBlb2YgKHJTdGF0ZSA9PT0gbnVsbCB8fCByU3RhdGUgPT09IHVuZGVmaW5lZCA/IHVuZGVmaW5lZCA6IHJTdGF0ZS5jbG9zZWQpID09PSAnYm9vbGVhbidcbiAgKSB7XG4gICAgcmV0dXJuIChcbiAgICAgICh3U3RhdGUgPT09IG51bGwgfHwgd1N0YXRlID09PSB1bmRlZmluZWQgPyB1bmRlZmluZWQgOiB3U3RhdGUuY2xvc2VkKSB8fFxuICAgICAgKHJTdGF0ZSA9PT0gbnVsbCB8fCByU3RhdGUgPT09IHVuZGVmaW5lZCA/IHVuZGVmaW5lZCA6IHJTdGF0ZS5jbG9zZWQpXG4gICAgKVxuICB9XG4gIGlmICh0eXBlb2Ygc3RyZWFtLl9jbG9zZWQgPT09ICdib29sZWFuJyAmJiBpc091dGdvaW5nTWVzc2FnZShzdHJlYW0pKSB7XG4gICAgcmV0dXJuIHN0cmVhbS5fY2xvc2VkXG4gIH1cbiAgcmV0dXJuIG51bGxcbn1cbmZ1bmN0aW9uIGlzT3V0Z29pbmdNZXNzYWdlKHN0cmVhbSkge1xuICByZXR1cm4gKFxuICAgIHR5cGVvZiBzdHJlYW0uX2Nsb3NlZCA9PT0gJ2Jvb2xlYW4nICYmXG4gICAgdHlwZW9mIHN0cmVhbS5fZGVmYXVsdEtlZXBBbGl2ZSA9PT0gJ2Jvb2xlYW4nICYmXG4gICAgdHlwZW9mIHN0cmVhbS5fcmVtb3ZlZENvbm5lY3Rpb24gPT09ICdib29sZWFuJyAmJlxuICAgIHR5cGVvZiBzdHJlYW0uX3JlbW92ZWRDb250TGVuID09PSAnYm9vbGVhbidcbiAgKVxufVxuZnVuY3Rpb24gaXNTZXJ2ZXJSZXNwb25zZShzdHJlYW0pIHtcbiAgcmV0dXJuIHR5cGVvZiBzdHJlYW0uX3NlbnQxMDAgPT09ICdib29sZWFuJyAmJiBpc091dGdvaW5nTWVzc2FnZShzdHJlYW0pXG59XG5mdW5jdGlvbiBpc1NlcnZlclJlcXVlc3Qoc3RyZWFtKSB7XG4gIHZhciBfc3RyZWFtJHJlcVxuICByZXR1cm4gKFxuICAgIHR5cGVvZiBzdHJlYW0uX2NvbnN1bWluZyA9PT0gJ2Jvb2xlYW4nICYmXG4gICAgdHlwZW9mIHN0cmVhbS5fZHVtcGVkID09PSAnYm9vbGVhbicgJiZcbiAgICAoKF9zdHJlYW0kcmVxID0gc3RyZWFtLnJlcSkgPT09IG51bGwgfHwgX3N0cmVhbSRyZXEgPT09IHVuZGVmaW5lZCA/IHVuZGVmaW5lZCA6IF9zdHJlYW0kcmVxLnVwZ3JhZGVPckNvbm5lY3QpID09PVxuICAgICAgdW5kZWZpbmVkXG4gIClcbn1cbmZ1bmN0aW9uIHdpbGxFbWl0Q2xvc2Uoc3RyZWFtKSB7XG4gIGlmICghaXNOb2RlU3RyZWFtKHN0cmVhbSkpIHJldHVybiBudWxsXG4gIGNvbnN0IHdTdGF0ZSA9IHN0cmVhbS5fd3JpdGFibGVTdGF0ZVxuICBjb25zdCByU3RhdGUgPSBzdHJlYW0uX3JlYWRhYmxlU3RhdGVcbiAgY29uc3Qgc3RhdGUgPSB3U3RhdGUgfHwgclN0YXRlXG4gIHJldHVybiAoXG4gICAgKCFzdGF0ZSAmJiBpc1NlcnZlclJlc3BvbnNlKHN0cmVhbSkpIHx8ICEhKHN0YXRlICYmIHN0YXRlLmF1dG9EZXN0cm95ICYmIHN0YXRlLmVtaXRDbG9zZSAmJiBzdGF0ZS5jbG9zZWQgPT09IGZhbHNlKVxuICApXG59XG5mdW5jdGlvbiBpc0Rpc3R1cmJlZChzdHJlYW0pIHtcbiAgdmFyIF9zdHJlYW0ka0lzRGlzdHVyYmVkXG4gIHJldHVybiAhIShcbiAgICBzdHJlYW0gJiZcbiAgICAoKF9zdHJlYW0ka0lzRGlzdHVyYmVkID0gc3RyZWFtW2tJc0Rpc3R1cmJlZF0pICE9PSBudWxsICYmIF9zdHJlYW0ka0lzRGlzdHVyYmVkICE9PSB1bmRlZmluZWRcbiAgICAgID8gX3N0cmVhbSRrSXNEaXN0dXJiZWRcbiAgICAgIDogc3RyZWFtLnJlYWRhYmxlRGlkUmVhZCB8fCBzdHJlYW0ucmVhZGFibGVBYm9ydGVkKVxuICApXG59XG5mdW5jdGlvbiBpc0Vycm9yZWQoc3RyZWFtKSB7XG4gIHZhciBfcmVmLFxuICAgIF9yZWYyLFxuICAgIF9yZWYzLFxuICAgIF9yZWY0LFxuICAgIF9yZWY1LFxuICAgIF9zdHJlYW0ka0lzRXJyb3JlZCxcbiAgICBfc3RyZWFtJF9yZWFkYWJsZVN0YXQzLFxuICAgIF9zdHJlYW0kX3dyaXRhYmxlU3RhdDMsXG4gICAgX3N0cmVhbSRfcmVhZGFibGVTdGF0NCxcbiAgICBfc3RyZWFtJF93cml0YWJsZVN0YXQ0XG4gIHJldHVybiAhIShcbiAgICBzdHJlYW0gJiZcbiAgICAoKF9yZWYgPVxuICAgICAgKF9yZWYyID1cbiAgICAgICAgKF9yZWYzID1cbiAgICAgICAgICAoX3JlZjQgPVxuICAgICAgICAgICAgKF9yZWY1ID1cbiAgICAgICAgICAgICAgKF9zdHJlYW0ka0lzRXJyb3JlZCA9IHN0cmVhbVtrSXNFcnJvcmVkXSkgIT09IG51bGwgJiYgX3N0cmVhbSRrSXNFcnJvcmVkICE9PSB1bmRlZmluZWRcbiAgICAgICAgICAgICAgICA/IF9zdHJlYW0ka0lzRXJyb3JlZFxuICAgICAgICAgICAgICAgIDogc3RyZWFtLnJlYWRhYmxlRXJyb3JlZCkgIT09IG51bGwgJiYgX3JlZjUgIT09IHVuZGVmaW5lZFxuICAgICAgICAgICAgICA/IF9yZWY1XG4gICAgICAgICAgICAgIDogc3RyZWFtLndyaXRhYmxlRXJyb3JlZCkgIT09IG51bGwgJiYgX3JlZjQgIT09IHVuZGVmaW5lZFxuICAgICAgICAgICAgPyBfcmVmNFxuICAgICAgICAgICAgOiAoX3N0cmVhbSRfcmVhZGFibGVTdGF0MyA9IHN0cmVhbS5fcmVhZGFibGVTdGF0ZSkgPT09IG51bGwgfHwgX3N0cmVhbSRfcmVhZGFibGVTdGF0MyA9PT0gdW5kZWZpbmVkXG4gICAgICAgICAgICA/IHVuZGVmaW5lZFxuICAgICAgICAgICAgOiBfc3RyZWFtJF9yZWFkYWJsZVN0YXQzLmVycm9yRW1pdHRlZCkgIT09IG51bGwgJiYgX3JlZjMgIT09IHVuZGVmaW5lZFxuICAgICAgICAgID8gX3JlZjNcbiAgICAgICAgICA6IChfc3RyZWFtJF93cml0YWJsZVN0YXQzID0gc3RyZWFtLl93cml0YWJsZVN0YXRlKSA9PT0gbnVsbCB8fCBfc3RyZWFtJF93cml0YWJsZVN0YXQzID09PSB1bmRlZmluZWRcbiAgICAgICAgICA/IHVuZGVmaW5lZFxuICAgICAgICAgIDogX3N0cmVhbSRfd3JpdGFibGVTdGF0My5lcnJvckVtaXR0ZWQpICE9PSBudWxsICYmIF9yZWYyICE9PSB1bmRlZmluZWRcbiAgICAgICAgPyBfcmVmMlxuICAgICAgICA6IChfc3RyZWFtJF9yZWFkYWJsZVN0YXQ0ID0gc3RyZWFtLl9yZWFkYWJsZVN0YXRlKSA9PT0gbnVsbCB8fCBfc3RyZWFtJF9yZWFkYWJsZVN0YXQ0ID09PSB1bmRlZmluZWRcbiAgICAgICAgPyB1bmRlZmluZWRcbiAgICAgICAgOiBfc3RyZWFtJF9yZWFkYWJsZVN0YXQ0LmVycm9yZWQpICE9PSBudWxsICYmIF9yZWYgIT09IHVuZGVmaW5lZFxuICAgICAgPyBfcmVmXG4gICAgICA6IChfc3RyZWFtJF93cml0YWJsZVN0YXQ0ID0gc3RyZWFtLl93cml0YWJsZVN0YXRlKSA9PT0gbnVsbCB8fCBfc3RyZWFtJF93cml0YWJsZVN0YXQ0ID09PSB1bmRlZmluZWRcbiAgICAgID8gdW5kZWZpbmVkXG4gICAgICA6IF9zdHJlYW0kX3dyaXRhYmxlU3RhdDQuZXJyb3JlZClcbiAgKVxufVxubW9kdWxlLmV4cG9ydHMgPSB7XG4gIGlzRGVzdHJveWVkLFxuICBrSXNEZXN0cm95ZWQsXG4gIGlzRGlzdHVyYmVkLFxuICBrSXNEaXN0dXJiZWQsXG4gIGlzRXJyb3JlZCxcbiAga0lzRXJyb3JlZCxcbiAgaXNSZWFkYWJsZSxcbiAga0lzUmVhZGFibGUsXG4gIGtJc0Nsb3NlZFByb21pc2UsXG4gIGtDb250cm9sbGVyRXJyb3JGdW5jdGlvbixcbiAga0lzV3JpdGFibGUsXG4gIGlzQ2xvc2VkLFxuICBpc0R1cGxleE5vZGVTdHJlYW0sXG4gIGlzRmluaXNoZWQsXG4gIGlzSXRlcmFibGUsXG4gIGlzUmVhZGFibGVOb2RlU3RyZWFtLFxuICBpc1JlYWRhYmxlU3RyZWFtLFxuICBpc1JlYWRhYmxlRW5kZWQsXG4gIGlzUmVhZGFibGVGaW5pc2hlZCxcbiAgaXNSZWFkYWJsZUVycm9yZWQsXG4gIGlzTm9kZVN0cmVhbSxcbiAgaXNXZWJTdHJlYW0sXG4gIGlzV3JpdGFibGUsXG4gIGlzV3JpdGFibGVOb2RlU3RyZWFtLFxuICBpc1dyaXRhYmxlU3RyZWFtLFxuICBpc1dyaXRhYmxlRW5kZWQsXG4gIGlzV3JpdGFibGVGaW5pc2hlZCxcbiAgaXNXcml0YWJsZUVycm9yZWQsXG4gIGlzU2VydmVyUmVxdWVzdCxcbiAgaXNTZXJ2ZXJSZXNwb25zZSxcbiAgd2lsbEVtaXRDbG9zZSxcbiAgaXNUcmFuc2Zvcm1TdHJlYW1cbn1cbiIsCiAgICAiLyogcmVwbGFjZW1lbnQgc3RhcnQgKi9cblxuY29uc3QgcHJvY2VzcyA9IHJlcXVpcmUoJ3Byb2Nlc3MvJylcblxuLyogcmVwbGFjZW1lbnQgZW5kICovXG4vLyBQb3J0ZWQgZnJvbSBodHRwczovL2dpdGh1Yi5jb20vbWFmaW50b3NoL2VuZC1vZi1zdHJlYW0gd2l0aFxuLy8gcGVybWlzc2lvbiBmcm9tIHRoZSBhdXRob3IsIE1hdGhpYXMgQnV1cyAoQG1hZmludG9zaCkuXG5cbjsoJ3VzZSBzdHJpY3QnKVxuY29uc3QgeyBBYm9ydEVycm9yLCBjb2RlcyB9ID0gcmVxdWlyZSgnLi4vLi4vb3Vycy9lcnJvcnMnKVxuY29uc3QgeyBFUlJfSU5WQUxJRF9BUkdfVFlQRSwgRVJSX1NUUkVBTV9QUkVNQVRVUkVfQ0xPU0UgfSA9IGNvZGVzXG5jb25zdCB7IGtFbXB0eU9iamVjdCwgb25jZSB9ID0gcmVxdWlyZSgnLi4vLi4vb3Vycy91dGlsJylcbmNvbnN0IHsgdmFsaWRhdGVBYm9ydFNpZ25hbCwgdmFsaWRhdGVGdW5jdGlvbiwgdmFsaWRhdGVPYmplY3QsIHZhbGlkYXRlQm9vbGVhbiB9ID0gcmVxdWlyZSgnLi4vdmFsaWRhdG9ycycpXG5jb25zdCB7IFByb21pc2UsIFByb21pc2VQcm90b3R5cGVUaGVuLCBTeW1ib2xEaXNwb3NlIH0gPSByZXF1aXJlKCcuLi8uLi9vdXJzL3ByaW1vcmRpYWxzJylcbmNvbnN0IHtcbiAgaXNDbG9zZWQsXG4gIGlzUmVhZGFibGUsXG4gIGlzUmVhZGFibGVOb2RlU3RyZWFtLFxuICBpc1JlYWRhYmxlU3RyZWFtLFxuICBpc1JlYWRhYmxlRmluaXNoZWQsXG4gIGlzUmVhZGFibGVFcnJvcmVkLFxuICBpc1dyaXRhYmxlLFxuICBpc1dyaXRhYmxlTm9kZVN0cmVhbSxcbiAgaXNXcml0YWJsZVN0cmVhbSxcbiAgaXNXcml0YWJsZUZpbmlzaGVkLFxuICBpc1dyaXRhYmxlRXJyb3JlZCxcbiAgaXNOb2RlU3RyZWFtLFxuICB3aWxsRW1pdENsb3NlOiBfd2lsbEVtaXRDbG9zZSxcbiAga0lzQ2xvc2VkUHJvbWlzZVxufSA9IHJlcXVpcmUoJy4vdXRpbHMnKVxubGV0IGFkZEFib3J0TGlzdGVuZXJcbmZ1bmN0aW9uIGlzUmVxdWVzdChzdHJlYW0pIHtcbiAgcmV0dXJuIHN0cmVhbS5zZXRIZWFkZXIgJiYgdHlwZW9mIHN0cmVhbS5hYm9ydCA9PT0gJ2Z1bmN0aW9uJ1xufVxuY29uc3Qgbm9wID0gKCkgPT4ge31cbmZ1bmN0aW9uIGVvcyhzdHJlYW0sIG9wdGlvbnMsIGNhbGxiYWNrKSB7XG4gIHZhciBfb3B0aW9ucyRyZWFkYWJsZSwgX29wdGlvbnMkd3JpdGFibGVcbiAgaWYgKGFyZ3VtZW50cy5sZW5ndGggPT09IDIpIHtcbiAgICBjYWxsYmFjayA9IG9wdGlvbnNcbiAgICBvcHRpb25zID0ga0VtcHR5T2JqZWN0XG4gIH0gZWxzZSBpZiAob3B0aW9ucyA9PSBudWxsKSB7XG4gICAgb3B0aW9ucyA9IGtFbXB0eU9iamVjdFxuICB9IGVsc2Uge1xuICAgIHZhbGlkYXRlT2JqZWN0KG9wdGlvbnMsICdvcHRpb25zJylcbiAgfVxuICB2YWxpZGF0ZUZ1bmN0aW9uKGNhbGxiYWNrLCAnY2FsbGJhY2snKVxuICB2YWxpZGF0ZUFib3J0U2lnbmFsKG9wdGlvbnMuc2lnbmFsLCAnb3B0aW9ucy5zaWduYWwnKVxuICBjYWxsYmFjayA9IG9uY2UoY2FsbGJhY2spXG4gIGlmIChpc1JlYWRhYmxlU3RyZWFtKHN0cmVhbSkgfHwgaXNXcml0YWJsZVN0cmVhbShzdHJlYW0pKSB7XG4gICAgcmV0dXJuIGVvc1dlYihzdHJlYW0sIG9wdGlvbnMsIGNhbGxiYWNrKVxuICB9XG4gIGlmICghaXNOb2RlU3RyZWFtKHN0cmVhbSkpIHtcbiAgICB0aHJvdyBuZXcgRVJSX0lOVkFMSURfQVJHX1RZUEUoJ3N0cmVhbScsIFsnUmVhZGFibGVTdHJlYW0nLCAnV3JpdGFibGVTdHJlYW0nLCAnU3RyZWFtJ10sIHN0cmVhbSlcbiAgfVxuICBjb25zdCByZWFkYWJsZSA9XG4gICAgKF9vcHRpb25zJHJlYWRhYmxlID0gb3B0aW9ucy5yZWFkYWJsZSkgIT09IG51bGwgJiYgX29wdGlvbnMkcmVhZGFibGUgIT09IHVuZGVmaW5lZFxuICAgICAgPyBfb3B0aW9ucyRyZWFkYWJsZVxuICAgICAgOiBpc1JlYWRhYmxlTm9kZVN0cmVhbShzdHJlYW0pXG4gIGNvbnN0IHdyaXRhYmxlID1cbiAgICAoX29wdGlvbnMkd3JpdGFibGUgPSBvcHRpb25zLndyaXRhYmxlKSAhPT0gbnVsbCAmJiBfb3B0aW9ucyR3cml0YWJsZSAhPT0gdW5kZWZpbmVkXG4gICAgICA/IF9vcHRpb25zJHdyaXRhYmxlXG4gICAgICA6IGlzV3JpdGFibGVOb2RlU3RyZWFtKHN0cmVhbSlcbiAgY29uc3Qgd1N0YXRlID0gc3RyZWFtLl93cml0YWJsZVN0YXRlXG4gIGNvbnN0IHJTdGF0ZSA9IHN0cmVhbS5fcmVhZGFibGVTdGF0ZVxuICBjb25zdCBvbmxlZ2FjeWZpbmlzaCA9ICgpID0+IHtcbiAgICBpZiAoIXN0cmVhbS53cml0YWJsZSkge1xuICAgICAgb25maW5pc2goKVxuICAgIH1cbiAgfVxuXG4gIC8vIFRPRE8gKHJvbmFnKTogSW1wcm92ZSBzb2Z0IGRldGVjdGlvbiB0byBpbmNsdWRlIGNvcmUgbW9kdWxlcyBhbmRcbiAgLy8gY29tbW9uIGVjb3N5c3RlbSBtb2R1bGVzIHRoYXQgZG8gcHJvcGVybHkgZW1pdCAnY2xvc2UnIGJ1dCBmYWlsXG4gIC8vIHRoaXMgZ2VuZXJpYyBjaGVjay5cbiAgbGV0IHdpbGxFbWl0Q2xvc2UgPVxuICAgIF93aWxsRW1pdENsb3NlKHN0cmVhbSkgJiYgaXNSZWFkYWJsZU5vZGVTdHJlYW0oc3RyZWFtKSA9PT0gcmVhZGFibGUgJiYgaXNXcml0YWJsZU5vZGVTdHJlYW0oc3RyZWFtKSA9PT0gd3JpdGFibGVcbiAgbGV0IHdyaXRhYmxlRmluaXNoZWQgPSBpc1dyaXRhYmxlRmluaXNoZWQoc3RyZWFtLCBmYWxzZSlcbiAgY29uc3Qgb25maW5pc2ggPSAoKSA9PiB7XG4gICAgd3JpdGFibGVGaW5pc2hlZCA9IHRydWVcbiAgICAvLyBTdHJlYW0gc2hvdWxkIG5vdCBiZSBkZXN0cm95ZWQgaGVyZS4gSWYgaXQgaXMgdGhhdFxuICAgIC8vIG1lYW5zIHRoYXQgdXNlciBzcGFjZSBpcyBkb2luZyBzb21ldGhpbmcgZGlmZmVyZW50bHkgYW5kXG4gICAgLy8gd2UgY2Fubm90IHRydXN0IHdpbGxFbWl0Q2xvc2UuXG4gICAgaWYgKHN0cmVhbS5kZXN0cm95ZWQpIHtcbiAgICAgIHdpbGxFbWl0Q2xvc2UgPSBmYWxzZVxuICAgIH1cbiAgICBpZiAod2lsbEVtaXRDbG9zZSAmJiAoIXN0cmVhbS5yZWFkYWJsZSB8fCByZWFkYWJsZSkpIHtcbiAgICAgIHJldHVyblxuICAgIH1cbiAgICBpZiAoIXJlYWRhYmxlIHx8IHJlYWRhYmxlRmluaXNoZWQpIHtcbiAgICAgIGNhbGxiYWNrLmNhbGwoc3RyZWFtKVxuICAgIH1cbiAgfVxuICBsZXQgcmVhZGFibGVGaW5pc2hlZCA9IGlzUmVhZGFibGVGaW5pc2hlZChzdHJlYW0sIGZhbHNlKVxuICBjb25zdCBvbmVuZCA9ICgpID0+IHtcbiAgICByZWFkYWJsZUZpbmlzaGVkID0gdHJ1ZVxuICAgIC8vIFN0cmVhbSBzaG91bGQgbm90IGJlIGRlc3Ryb3llZCBoZXJlLiBJZiBpdCBpcyB0aGF0XG4gICAgLy8gbWVhbnMgdGhhdCB1c2VyIHNwYWNlIGlzIGRvaW5nIHNvbWV0aGluZyBkaWZmZXJlbnRseSBhbmRcbiAgICAvLyB3ZSBjYW5ub3QgdHJ1c3Qgd2lsbEVtaXRDbG9zZS5cbiAgICBpZiAoc3RyZWFtLmRlc3Ryb3llZCkge1xuICAgICAgd2lsbEVtaXRDbG9zZSA9IGZhbHNlXG4gICAgfVxuICAgIGlmICh3aWxsRW1pdENsb3NlICYmICghc3RyZWFtLndyaXRhYmxlIHx8IHdyaXRhYmxlKSkge1xuICAgICAgcmV0dXJuXG4gICAgfVxuICAgIGlmICghd3JpdGFibGUgfHwgd3JpdGFibGVGaW5pc2hlZCkge1xuICAgICAgY2FsbGJhY2suY2FsbChzdHJlYW0pXG4gICAgfVxuICB9XG4gIGNvbnN0IG9uZXJyb3IgPSAoZXJyKSA9PiB7XG4gICAgY2FsbGJhY2suY2FsbChzdHJlYW0sIGVycilcbiAgfVxuICBsZXQgY2xvc2VkID0gaXNDbG9zZWQoc3RyZWFtKVxuICBjb25zdCBvbmNsb3NlID0gKCkgPT4ge1xuICAgIGNsb3NlZCA9IHRydWVcbiAgICBjb25zdCBlcnJvcmVkID0gaXNXcml0YWJsZUVycm9yZWQoc3RyZWFtKSB8fCBpc1JlYWRhYmxlRXJyb3JlZChzdHJlYW0pXG4gICAgaWYgKGVycm9yZWQgJiYgdHlwZW9mIGVycm9yZWQgIT09ICdib29sZWFuJykge1xuICAgICAgcmV0dXJuIGNhbGxiYWNrLmNhbGwoc3RyZWFtLCBlcnJvcmVkKVxuICAgIH1cbiAgICBpZiAocmVhZGFibGUgJiYgIXJlYWRhYmxlRmluaXNoZWQgJiYgaXNSZWFkYWJsZU5vZGVTdHJlYW0oc3RyZWFtLCB0cnVlKSkge1xuICAgICAgaWYgKCFpc1JlYWRhYmxlRmluaXNoZWQoc3RyZWFtLCBmYWxzZSkpIHJldHVybiBjYWxsYmFjay5jYWxsKHN0cmVhbSwgbmV3IEVSUl9TVFJFQU1fUFJFTUFUVVJFX0NMT1NFKCkpXG4gICAgfVxuICAgIGlmICh3cml0YWJsZSAmJiAhd3JpdGFibGVGaW5pc2hlZCkge1xuICAgICAgaWYgKCFpc1dyaXRhYmxlRmluaXNoZWQoc3RyZWFtLCBmYWxzZSkpIHJldHVybiBjYWxsYmFjay5jYWxsKHN0cmVhbSwgbmV3IEVSUl9TVFJFQU1fUFJFTUFUVVJFX0NMT1NFKCkpXG4gICAgfVxuICAgIGNhbGxiYWNrLmNhbGwoc3RyZWFtKVxuICB9XG4gIGNvbnN0IG9uY2xvc2VkID0gKCkgPT4ge1xuICAgIGNsb3NlZCA9IHRydWVcbiAgICBjb25zdCBlcnJvcmVkID0gaXNXcml0YWJsZUVycm9yZWQoc3RyZWFtKSB8fCBpc1JlYWRhYmxlRXJyb3JlZChzdHJlYW0pXG4gICAgaWYgKGVycm9yZWQgJiYgdHlwZW9mIGVycm9yZWQgIT09ICdib29sZWFuJykge1xuICAgICAgcmV0dXJuIGNhbGxiYWNrLmNhbGwoc3RyZWFtLCBlcnJvcmVkKVxuICAgIH1cbiAgICBjYWxsYmFjay5jYWxsKHN0cmVhbSlcbiAgfVxuICBjb25zdCBvbnJlcXVlc3QgPSAoKSA9PiB7XG4gICAgc3RyZWFtLnJlcS5vbignZmluaXNoJywgb25maW5pc2gpXG4gIH1cbiAgaWYgKGlzUmVxdWVzdChzdHJlYW0pKSB7XG4gICAgc3RyZWFtLm9uKCdjb21wbGV0ZScsIG9uZmluaXNoKVxuICAgIGlmICghd2lsbEVtaXRDbG9zZSkge1xuICAgICAgc3RyZWFtLm9uKCdhYm9ydCcsIG9uY2xvc2UpXG4gICAgfVxuICAgIGlmIChzdHJlYW0ucmVxKSB7XG4gICAgICBvbnJlcXVlc3QoKVxuICAgIH0gZWxzZSB7XG4gICAgICBzdHJlYW0ub24oJ3JlcXVlc3QnLCBvbnJlcXVlc3QpXG4gICAgfVxuICB9IGVsc2UgaWYgKHdyaXRhYmxlICYmICF3U3RhdGUpIHtcbiAgICAvLyBsZWdhY3kgc3RyZWFtc1xuICAgIHN0cmVhbS5vbignZW5kJywgb25sZWdhY3lmaW5pc2gpXG4gICAgc3RyZWFtLm9uKCdjbG9zZScsIG9ubGVnYWN5ZmluaXNoKVxuICB9XG5cbiAgLy8gTm90IGFsbCBzdHJlYW1zIHdpbGwgZW1pdCAnY2xvc2UnIGFmdGVyICdhYm9ydGVkJy5cbiAgaWYgKCF3aWxsRW1pdENsb3NlICYmIHR5cGVvZiBzdHJlYW0uYWJvcnRlZCA9PT0gJ2Jvb2xlYW4nKSB7XG4gICAgc3RyZWFtLm9uKCdhYm9ydGVkJywgb25jbG9zZSlcbiAgfVxuICBzdHJlYW0ub24oJ2VuZCcsIG9uZW5kKVxuICBzdHJlYW0ub24oJ2ZpbmlzaCcsIG9uZmluaXNoKVxuICBpZiAob3B0aW9ucy5lcnJvciAhPT0gZmFsc2UpIHtcbiAgICBzdHJlYW0ub24oJ2Vycm9yJywgb25lcnJvcilcbiAgfVxuICBzdHJlYW0ub24oJ2Nsb3NlJywgb25jbG9zZSlcbiAgaWYgKGNsb3NlZCkge1xuICAgIHByb2Nlc3MubmV4dFRpY2sob25jbG9zZSlcbiAgfSBlbHNlIGlmIChcbiAgICAod1N0YXRlICE9PSBudWxsICYmIHdTdGF0ZSAhPT0gdW5kZWZpbmVkICYmIHdTdGF0ZS5lcnJvckVtaXR0ZWQpIHx8XG4gICAgKHJTdGF0ZSAhPT0gbnVsbCAmJiByU3RhdGUgIT09IHVuZGVmaW5lZCAmJiByU3RhdGUuZXJyb3JFbWl0dGVkKVxuICApIHtcbiAgICBpZiAoIXdpbGxFbWl0Q2xvc2UpIHtcbiAgICAgIHByb2Nlc3MubmV4dFRpY2sob25jbG9zZWQpXG4gICAgfVxuICB9IGVsc2UgaWYgKFxuICAgICFyZWFkYWJsZSAmJlxuICAgICghd2lsbEVtaXRDbG9zZSB8fCBpc1JlYWRhYmxlKHN0cmVhbSkpICYmXG4gICAgKHdyaXRhYmxlRmluaXNoZWQgfHwgaXNXcml0YWJsZShzdHJlYW0pID09PSBmYWxzZSlcbiAgKSB7XG4gICAgcHJvY2Vzcy5uZXh0VGljayhvbmNsb3NlZClcbiAgfSBlbHNlIGlmIChcbiAgICAhd3JpdGFibGUgJiZcbiAgICAoIXdpbGxFbWl0Q2xvc2UgfHwgaXNXcml0YWJsZShzdHJlYW0pKSAmJlxuICAgIChyZWFkYWJsZUZpbmlzaGVkIHx8IGlzUmVhZGFibGUoc3RyZWFtKSA9PT0gZmFsc2UpXG4gICkge1xuICAgIHByb2Nlc3MubmV4dFRpY2sob25jbG9zZWQpXG4gIH0gZWxzZSBpZiAoclN0YXRlICYmIHN0cmVhbS5yZXEgJiYgc3RyZWFtLmFib3J0ZWQpIHtcbiAgICBwcm9jZXNzLm5leHRUaWNrKG9uY2xvc2VkKVxuICB9XG4gIGNvbnN0IGNsZWFudXAgPSAoKSA9PiB7XG4gICAgY2FsbGJhY2sgPSBub3BcbiAgICBzdHJlYW0ucmVtb3ZlTGlzdGVuZXIoJ2Fib3J0ZWQnLCBvbmNsb3NlKVxuICAgIHN0cmVhbS5yZW1vdmVMaXN0ZW5lcignY29tcGxldGUnLCBvbmZpbmlzaClcbiAgICBzdHJlYW0ucmVtb3ZlTGlzdGVuZXIoJ2Fib3J0Jywgb25jbG9zZSlcbiAgICBzdHJlYW0ucmVtb3ZlTGlzdGVuZXIoJ3JlcXVlc3QnLCBvbnJlcXVlc3QpXG4gICAgaWYgKHN0cmVhbS5yZXEpIHN0cmVhbS5yZXEucmVtb3ZlTGlzdGVuZXIoJ2ZpbmlzaCcsIG9uZmluaXNoKVxuICAgIHN0cmVhbS5yZW1vdmVMaXN0ZW5lcignZW5kJywgb25sZWdhY3lmaW5pc2gpXG4gICAgc3RyZWFtLnJlbW92ZUxpc3RlbmVyKCdjbG9zZScsIG9ubGVnYWN5ZmluaXNoKVxuICAgIHN0cmVhbS5yZW1vdmVMaXN0ZW5lcignZmluaXNoJywgb25maW5pc2gpXG4gICAgc3RyZWFtLnJlbW92ZUxpc3RlbmVyKCdlbmQnLCBvbmVuZClcbiAgICBzdHJlYW0ucmVtb3ZlTGlzdGVuZXIoJ2Vycm9yJywgb25lcnJvcilcbiAgICBzdHJlYW0ucmVtb3ZlTGlzdGVuZXIoJ2Nsb3NlJywgb25jbG9zZSlcbiAgfVxuICBpZiAob3B0aW9ucy5zaWduYWwgJiYgIWNsb3NlZCkge1xuICAgIGNvbnN0IGFib3J0ID0gKCkgPT4ge1xuICAgICAgLy8gS2VlcCBpdCBiZWNhdXNlIGNsZWFudXAgcmVtb3ZlcyBpdC5cbiAgICAgIGNvbnN0IGVuZENhbGxiYWNrID0gY2FsbGJhY2tcbiAgICAgIGNsZWFudXAoKVxuICAgICAgZW5kQ2FsbGJhY2suY2FsbChcbiAgICAgICAgc3RyZWFtLFxuICAgICAgICBuZXcgQWJvcnRFcnJvcih1bmRlZmluZWQsIHtcbiAgICAgICAgICBjYXVzZTogb3B0aW9ucy5zaWduYWwucmVhc29uXG4gICAgICAgIH0pXG4gICAgICApXG4gICAgfVxuICAgIGlmIChvcHRpb25zLnNpZ25hbC5hYm9ydGVkKSB7XG4gICAgICBwcm9jZXNzLm5leHRUaWNrKGFib3J0KVxuICAgIH0gZWxzZSB7XG4gICAgICBhZGRBYm9ydExpc3RlbmVyID0gYWRkQWJvcnRMaXN0ZW5lciB8fCByZXF1aXJlKCcuLi8uLi9vdXJzL3V0aWwnKS5hZGRBYm9ydExpc3RlbmVyXG4gICAgICBjb25zdCBkaXNwb3NhYmxlID0gYWRkQWJvcnRMaXN0ZW5lcihvcHRpb25zLnNpZ25hbCwgYWJvcnQpXG4gICAgICBjb25zdCBvcmlnaW5hbENhbGxiYWNrID0gY2FsbGJhY2tcbiAgICAgIGNhbGxiYWNrID0gb25jZSgoLi4uYXJncykgPT4ge1xuICAgICAgICBkaXNwb3NhYmxlW1N5bWJvbERpc3Bvc2VdKClcbiAgICAgICAgb3JpZ2luYWxDYWxsYmFjay5hcHBseShzdHJlYW0sIGFyZ3MpXG4gICAgICB9KVxuICAgIH1cbiAgfVxuICByZXR1cm4gY2xlYW51cFxufVxuZnVuY3Rpb24gZW9zV2ViKHN0cmVhbSwgb3B0aW9ucywgY2FsbGJhY2spIHtcbiAgbGV0IGlzQWJvcnRlZCA9IGZhbHNlXG4gIGxldCBhYm9ydCA9IG5vcFxuICBpZiAob3B0aW9ucy5zaWduYWwpIHtcbiAgICBhYm9ydCA9ICgpID0+IHtcbiAgICAgIGlzQWJvcnRlZCA9IHRydWVcbiAgICAgIGNhbGxiYWNrLmNhbGwoXG4gICAgICAgIHN0cmVhbSxcbiAgICAgICAgbmV3IEFib3J0RXJyb3IodW5kZWZpbmVkLCB7XG4gICAgICAgICAgY2F1c2U6IG9wdGlvbnMuc2lnbmFsLnJlYXNvblxuICAgICAgICB9KVxuICAgICAgKVxuICAgIH1cbiAgICBpZiAob3B0aW9ucy5zaWduYWwuYWJvcnRlZCkge1xuICAgICAgcHJvY2Vzcy5uZXh0VGljayhhYm9ydClcbiAgICB9IGVsc2Uge1xuICAgICAgYWRkQWJvcnRMaXN0ZW5lciA9IGFkZEFib3J0TGlzdGVuZXIgfHwgcmVxdWlyZSgnLi4vLi4vb3Vycy91dGlsJykuYWRkQWJvcnRMaXN0ZW5lclxuICAgICAgY29uc3QgZGlzcG9zYWJsZSA9IGFkZEFib3J0TGlzdGVuZXIob3B0aW9ucy5zaWduYWwsIGFib3J0KVxuICAgICAgY29uc3Qgb3JpZ2luYWxDYWxsYmFjayA9IGNhbGxiYWNrXG4gICAgICBjYWxsYmFjayA9IG9uY2UoKC4uLmFyZ3MpID0+IHtcbiAgICAgICAgZGlzcG9zYWJsZVtTeW1ib2xEaXNwb3NlXSgpXG4gICAgICAgIG9yaWdpbmFsQ2FsbGJhY2suYXBwbHkoc3RyZWFtLCBhcmdzKVxuICAgICAgfSlcbiAgICB9XG4gIH1cbiAgY29uc3QgcmVzb2x2ZXJGbiA9ICguLi5hcmdzKSA9PiB7XG4gICAgaWYgKCFpc0Fib3J0ZWQpIHtcbiAgICAgIHByb2Nlc3MubmV4dFRpY2soKCkgPT4gY2FsbGJhY2suYXBwbHkoc3RyZWFtLCBhcmdzKSlcbiAgICB9XG4gIH1cbiAgUHJvbWlzZVByb3RvdHlwZVRoZW4oc3RyZWFtW2tJc0Nsb3NlZFByb21pc2VdLnByb21pc2UsIHJlc29sdmVyRm4sIHJlc29sdmVyRm4pXG4gIHJldHVybiBub3Bcbn1cbmZ1bmN0aW9uIGZpbmlzaGVkKHN0cmVhbSwgb3B0cykge1xuICB2YXIgX29wdHNcbiAgbGV0IGF1dG9DbGVhbnVwID0gZmFsc2VcbiAgaWYgKG9wdHMgPT09IG51bGwpIHtcbiAgICBvcHRzID0ga0VtcHR5T2JqZWN0XG4gIH1cbiAgaWYgKChfb3B0cyA9IG9wdHMpICE9PSBudWxsICYmIF9vcHRzICE9PSB1bmRlZmluZWQgJiYgX29wdHMuY2xlYW51cCkge1xuICAgIHZhbGlkYXRlQm9vbGVhbihvcHRzLmNsZWFudXAsICdjbGVhbnVwJylcbiAgICBhdXRvQ2xlYW51cCA9IG9wdHMuY2xlYW51cFxuICB9XG4gIHJldHVybiBuZXcgUHJvbWlzZSgocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XG4gICAgY29uc3QgY2xlYW51cCA9IGVvcyhzdHJlYW0sIG9wdHMsIChlcnIpID0+IHtcbiAgICAgIGlmIChhdXRvQ2xlYW51cCkge1xuICAgICAgICBjbGVhbnVwKClcbiAgICAgIH1cbiAgICAgIGlmIChlcnIpIHtcbiAgICAgICAgcmVqZWN0KGVycilcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHJlc29sdmUoKVxuICAgICAgfVxuICAgIH0pXG4gIH0pXG59XG5tb2R1bGUuZXhwb3J0cyA9IGVvc1xubW9kdWxlLmV4cG9ydHMuZmluaXNoZWQgPSBmaW5pc2hlZFxuIiwKICAgICIndXNlIHN0cmljdCdcblxuLyogcmVwbGFjZW1lbnQgc3RhcnQgKi9cblxuY29uc3QgcHJvY2VzcyA9IHJlcXVpcmUoJ3Byb2Nlc3MvJylcblxuLyogcmVwbGFjZW1lbnQgZW5kICovXG5cbmNvbnN0IHtcbiAgYWdncmVnYXRlVHdvRXJyb3JzLFxuICBjb2RlczogeyBFUlJfTVVMVElQTEVfQ0FMTEJBQ0sgfSxcbiAgQWJvcnRFcnJvclxufSA9IHJlcXVpcmUoJy4uLy4uL291cnMvZXJyb3JzJylcbmNvbnN0IHsgU3ltYm9sIH0gPSByZXF1aXJlKCcuLi8uLi9vdXJzL3ByaW1vcmRpYWxzJylcbmNvbnN0IHsga0lzRGVzdHJveWVkLCBpc0Rlc3Ryb3llZCwgaXNGaW5pc2hlZCwgaXNTZXJ2ZXJSZXF1ZXN0IH0gPSByZXF1aXJlKCcuL3V0aWxzJylcbmNvbnN0IGtEZXN0cm95ID0gU3ltYm9sKCdrRGVzdHJveScpXG5jb25zdCBrQ29uc3RydWN0ID0gU3ltYm9sKCdrQ29uc3RydWN0JylcbmZ1bmN0aW9uIGNoZWNrRXJyb3IoZXJyLCB3LCByKSB7XG4gIGlmIChlcnIpIHtcbiAgICAvLyBBdm9pZCBWOCBsZWFrLCBodHRwczovL2dpdGh1Yi5jb20vbm9kZWpzL25vZGUvcHVsbC8zNDEwMyNpc3N1ZWNvbW1lbnQtNjUyMDAyMzY0XG4gICAgZXJyLnN0YWNrIC8vIGVzbGludC1kaXNhYmxlLWxpbmUgbm8tdW51c2VkLWV4cHJlc3Npb25zXG5cbiAgICBpZiAodyAmJiAhdy5lcnJvcmVkKSB7XG4gICAgICB3LmVycm9yZWQgPSBlcnJcbiAgICB9XG4gICAgaWYgKHIgJiYgIXIuZXJyb3JlZCkge1xuICAgICAgci5lcnJvcmVkID0gZXJyXG4gICAgfVxuICB9XG59XG5cbi8vIEJhY2t3YXJkcyBjb21wYXQuIGNiKCkgaXMgdW5kb2N1bWVudGVkIGFuZCB1bnVzZWQgaW4gY29yZSBidXRcbi8vIHVuZm9ydHVuYXRlbHkgbWlnaHQgYmUgdXNlZCBieSBtb2R1bGVzLlxuZnVuY3Rpb24gZGVzdHJveShlcnIsIGNiKSB7XG4gIGNvbnN0IHIgPSB0aGlzLl9yZWFkYWJsZVN0YXRlXG4gIGNvbnN0IHcgPSB0aGlzLl93cml0YWJsZVN0YXRlXG4gIC8vIFdpdGggZHVwbGV4IHN0cmVhbXMgd2UgdXNlIHRoZSB3cml0YWJsZSBzaWRlIGZvciBzdGF0ZS5cbiAgY29uc3QgcyA9IHcgfHwgclxuICBpZiAoKHcgIT09IG51bGwgJiYgdyAhPT0gdW5kZWZpbmVkICYmIHcuZGVzdHJveWVkKSB8fCAociAhPT0gbnVsbCAmJiByICE9PSB1bmRlZmluZWQgJiYgci5kZXN0cm95ZWQpKSB7XG4gICAgaWYgKHR5cGVvZiBjYiA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgY2IoKVxuICAgIH1cbiAgICByZXR1cm4gdGhpc1xuICB9XG5cbiAgLy8gV2Ugc2V0IGRlc3Ryb3llZCB0byB0cnVlIGJlZm9yZSBmaXJpbmcgZXJyb3IgY2FsbGJhY2tzIGluIG9yZGVyXG4gIC8vIHRvIG1ha2UgaXQgcmUtZW50cmFuY2Ugc2FmZSBpbiBjYXNlIGRlc3Ryb3koKSBpcyBjYWxsZWQgd2l0aGluIGNhbGxiYWNrc1xuICBjaGVja0Vycm9yKGVyciwgdywgcilcbiAgaWYgKHcpIHtcbiAgICB3LmRlc3Ryb3llZCA9IHRydWVcbiAgfVxuICBpZiAocikge1xuICAgIHIuZGVzdHJveWVkID0gdHJ1ZVxuICB9XG5cbiAgLy8gSWYgc3RpbGwgY29uc3RydWN0aW5nIHRoZW4gZGVmZXIgY2FsbGluZyBfZGVzdHJveS5cbiAgaWYgKCFzLmNvbnN0cnVjdGVkKSB7XG4gICAgdGhpcy5vbmNlKGtEZXN0cm95LCBmdW5jdGlvbiAoZXIpIHtcbiAgICAgIF9kZXN0cm95KHRoaXMsIGFnZ3JlZ2F0ZVR3b0Vycm9ycyhlciwgZXJyKSwgY2IpXG4gICAgfSlcbiAgfSBlbHNlIHtcbiAgICBfZGVzdHJveSh0aGlzLCBlcnIsIGNiKVxuICB9XG4gIHJldHVybiB0aGlzXG59XG5mdW5jdGlvbiBfZGVzdHJveShzZWxmLCBlcnIsIGNiKSB7XG4gIGxldCBjYWxsZWQgPSBmYWxzZVxuICBmdW5jdGlvbiBvbkRlc3Ryb3koZXJyKSB7XG4gICAgaWYgKGNhbGxlZCkge1xuICAgICAgcmV0dXJuXG4gICAgfVxuICAgIGNhbGxlZCA9IHRydWVcbiAgICBjb25zdCByID0gc2VsZi5fcmVhZGFibGVTdGF0ZVxuICAgIGNvbnN0IHcgPSBzZWxmLl93cml0YWJsZVN0YXRlXG4gICAgY2hlY2tFcnJvcihlcnIsIHcsIHIpXG4gICAgaWYgKHcpIHtcbiAgICAgIHcuY2xvc2VkID0gdHJ1ZVxuICAgIH1cbiAgICBpZiAocikge1xuICAgICAgci5jbG9zZWQgPSB0cnVlXG4gICAgfVxuICAgIGlmICh0eXBlb2YgY2IgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgIGNiKGVycilcbiAgICB9XG4gICAgaWYgKGVycikge1xuICAgICAgcHJvY2Vzcy5uZXh0VGljayhlbWl0RXJyb3JDbG9zZU5ULCBzZWxmLCBlcnIpXG4gICAgfSBlbHNlIHtcbiAgICAgIHByb2Nlc3MubmV4dFRpY2soZW1pdENsb3NlTlQsIHNlbGYpXG4gICAgfVxuICB9XG4gIHRyeSB7XG4gICAgc2VsZi5fZGVzdHJveShlcnIgfHwgbnVsbCwgb25EZXN0cm95KVxuICB9IGNhdGNoIChlcnIpIHtcbiAgICBvbkRlc3Ryb3koZXJyKVxuICB9XG59XG5mdW5jdGlvbiBlbWl0RXJyb3JDbG9zZU5UKHNlbGYsIGVycikge1xuICBlbWl0RXJyb3JOVChzZWxmLCBlcnIpXG4gIGVtaXRDbG9zZU5UKHNlbGYpXG59XG5mdW5jdGlvbiBlbWl0Q2xvc2VOVChzZWxmKSB7XG4gIGNvbnN0IHIgPSBzZWxmLl9yZWFkYWJsZVN0YXRlXG4gIGNvbnN0IHcgPSBzZWxmLl93cml0YWJsZVN0YXRlXG4gIGlmICh3KSB7XG4gICAgdy5jbG9zZUVtaXR0ZWQgPSB0cnVlXG4gIH1cbiAgaWYgKHIpIHtcbiAgICByLmNsb3NlRW1pdHRlZCA9IHRydWVcbiAgfVxuICBpZiAoKHcgIT09IG51bGwgJiYgdyAhPT0gdW5kZWZpbmVkICYmIHcuZW1pdENsb3NlKSB8fCAociAhPT0gbnVsbCAmJiByICE9PSB1bmRlZmluZWQgJiYgci5lbWl0Q2xvc2UpKSB7XG4gICAgc2VsZi5lbWl0KCdjbG9zZScpXG4gIH1cbn1cbmZ1bmN0aW9uIGVtaXRFcnJvck5UKHNlbGYsIGVycikge1xuICBjb25zdCByID0gc2VsZi5fcmVhZGFibGVTdGF0ZVxuICBjb25zdCB3ID0gc2VsZi5fd3JpdGFibGVTdGF0ZVxuICBpZiAoKHcgIT09IG51bGwgJiYgdyAhPT0gdW5kZWZpbmVkICYmIHcuZXJyb3JFbWl0dGVkKSB8fCAociAhPT0gbnVsbCAmJiByICE9PSB1bmRlZmluZWQgJiYgci5lcnJvckVtaXR0ZWQpKSB7XG4gICAgcmV0dXJuXG4gIH1cbiAgaWYgKHcpIHtcbiAgICB3LmVycm9yRW1pdHRlZCA9IHRydWVcbiAgfVxuICBpZiAocikge1xuICAgIHIuZXJyb3JFbWl0dGVkID0gdHJ1ZVxuICB9XG4gIHNlbGYuZW1pdCgnZXJyb3InLCBlcnIpXG59XG5mdW5jdGlvbiB1bmRlc3Ryb3koKSB7XG4gIGNvbnN0IHIgPSB0aGlzLl9yZWFkYWJsZVN0YXRlXG4gIGNvbnN0IHcgPSB0aGlzLl93cml0YWJsZVN0YXRlXG4gIGlmIChyKSB7XG4gICAgci5jb25zdHJ1Y3RlZCA9IHRydWVcbiAgICByLmNsb3NlZCA9IGZhbHNlXG4gICAgci5jbG9zZUVtaXR0ZWQgPSBmYWxzZVxuICAgIHIuZGVzdHJveWVkID0gZmFsc2VcbiAgICByLmVycm9yZWQgPSBudWxsXG4gICAgci5lcnJvckVtaXR0ZWQgPSBmYWxzZVxuICAgIHIucmVhZGluZyA9IGZhbHNlXG4gICAgci5lbmRlZCA9IHIucmVhZGFibGUgPT09IGZhbHNlXG4gICAgci5lbmRFbWl0dGVkID0gci5yZWFkYWJsZSA9PT0gZmFsc2VcbiAgfVxuICBpZiAodykge1xuICAgIHcuY29uc3RydWN0ZWQgPSB0cnVlXG4gICAgdy5kZXN0cm95ZWQgPSBmYWxzZVxuICAgIHcuY2xvc2VkID0gZmFsc2VcbiAgICB3LmNsb3NlRW1pdHRlZCA9IGZhbHNlXG4gICAgdy5lcnJvcmVkID0gbnVsbFxuICAgIHcuZXJyb3JFbWl0dGVkID0gZmFsc2VcbiAgICB3LmZpbmFsQ2FsbGVkID0gZmFsc2VcbiAgICB3LnByZWZpbmlzaGVkID0gZmFsc2VcbiAgICB3LmVuZGVkID0gdy53cml0YWJsZSA9PT0gZmFsc2VcbiAgICB3LmVuZGluZyA9IHcud3JpdGFibGUgPT09IGZhbHNlXG4gICAgdy5maW5pc2hlZCA9IHcud3JpdGFibGUgPT09IGZhbHNlXG4gIH1cbn1cbmZ1bmN0aW9uIGVycm9yT3JEZXN0cm95KHN0cmVhbSwgZXJyLCBzeW5jKSB7XG4gIC8vIFdlIGhhdmUgdGVzdHMgdGhhdCByZWx5IG9uIGVycm9ycyBiZWluZyBlbWl0dGVkXG4gIC8vIGluIHRoZSBzYW1lIHRpY2ssIHNvIGNoYW5naW5nIHRoaXMgaXMgc2VtdmVyIG1ham9yLlxuICAvLyBGb3Igbm93IHdoZW4geW91IG9wdC1pbiB0byBhdXRvRGVzdHJveSB3ZSBhbGxvd1xuICAvLyB0aGUgZXJyb3IgdG8gYmUgZW1pdHRlZCBuZXh0VGljay4gSW4gYSBmdXR1cmVcbiAgLy8gc2VtdmVyIG1ham9yIHVwZGF0ZSB3ZSBzaG91bGQgY2hhbmdlIHRoZSBkZWZhdWx0IHRvIHRoaXMuXG5cbiAgY29uc3QgciA9IHN0cmVhbS5fcmVhZGFibGVTdGF0ZVxuICBjb25zdCB3ID0gc3RyZWFtLl93cml0YWJsZVN0YXRlXG4gIGlmICgodyAhPT0gbnVsbCAmJiB3ICE9PSB1bmRlZmluZWQgJiYgdy5kZXN0cm95ZWQpIHx8IChyICE9PSBudWxsICYmIHIgIT09IHVuZGVmaW5lZCAmJiByLmRlc3Ryb3llZCkpIHtcbiAgICByZXR1cm4gdGhpc1xuICB9XG4gIGlmICgociAhPT0gbnVsbCAmJiByICE9PSB1bmRlZmluZWQgJiYgci5hdXRvRGVzdHJveSkgfHwgKHcgIT09IG51bGwgJiYgdyAhPT0gdW5kZWZpbmVkICYmIHcuYXV0b0Rlc3Ryb3kpKVxuICAgIHN0cmVhbS5kZXN0cm95KGVycilcbiAgZWxzZSBpZiAoZXJyKSB7XG4gICAgLy8gQXZvaWQgVjggbGVhaywgaHR0cHM6Ly9naXRodWIuY29tL25vZGVqcy9ub2RlL3B1bGwvMzQxMDMjaXNzdWVjb21tZW50LTY1MjAwMjM2NFxuICAgIGVyci5zdGFjayAvLyBlc2xpbnQtZGlzYWJsZS1saW5lIG5vLXVudXNlZC1leHByZXNzaW9uc1xuXG4gICAgaWYgKHcgJiYgIXcuZXJyb3JlZCkge1xuICAgICAgdy5lcnJvcmVkID0gZXJyXG4gICAgfVxuICAgIGlmIChyICYmICFyLmVycm9yZWQpIHtcbiAgICAgIHIuZXJyb3JlZCA9IGVyclxuICAgIH1cbiAgICBpZiAoc3luYykge1xuICAgICAgcHJvY2Vzcy5uZXh0VGljayhlbWl0RXJyb3JOVCwgc3RyZWFtLCBlcnIpXG4gICAgfSBlbHNlIHtcbiAgICAgIGVtaXRFcnJvck5UKHN0cmVhbSwgZXJyKVxuICAgIH1cbiAgfVxufVxuZnVuY3Rpb24gY29uc3RydWN0KHN0cmVhbSwgY2IpIHtcbiAgaWYgKHR5cGVvZiBzdHJlYW0uX2NvbnN0cnVjdCAhPT0gJ2Z1bmN0aW9uJykge1xuICAgIHJldHVyblxuICB9XG4gIGNvbnN0IHIgPSBzdHJlYW0uX3JlYWRhYmxlU3RhdGVcbiAgY29uc3QgdyA9IHN0cmVhbS5fd3JpdGFibGVTdGF0ZVxuICBpZiAocikge1xuICAgIHIuY29uc3RydWN0ZWQgPSBmYWxzZVxuICB9XG4gIGlmICh3KSB7XG4gICAgdy5jb25zdHJ1Y3RlZCA9IGZhbHNlXG4gIH1cbiAgc3RyZWFtLm9uY2Uoa0NvbnN0cnVjdCwgY2IpXG4gIGlmIChzdHJlYW0ubGlzdGVuZXJDb3VudChrQ29uc3RydWN0KSA+IDEpIHtcbiAgICAvLyBEdXBsZXhcbiAgICByZXR1cm5cbiAgfVxuICBwcm9jZXNzLm5leHRUaWNrKGNvbnN0cnVjdE5ULCBzdHJlYW0pXG59XG5mdW5jdGlvbiBjb25zdHJ1Y3ROVChzdHJlYW0pIHtcbiAgbGV0IGNhbGxlZCA9IGZhbHNlXG4gIGZ1bmN0aW9uIG9uQ29uc3RydWN0KGVycikge1xuICAgIGlmIChjYWxsZWQpIHtcbiAgICAgIGVycm9yT3JEZXN0cm95KHN0cmVhbSwgZXJyICE9PSBudWxsICYmIGVyciAhPT0gdW5kZWZpbmVkID8gZXJyIDogbmV3IEVSUl9NVUxUSVBMRV9DQUxMQkFDSygpKVxuICAgICAgcmV0dXJuXG4gICAgfVxuICAgIGNhbGxlZCA9IHRydWVcbiAgICBjb25zdCByID0gc3RyZWFtLl9yZWFkYWJsZVN0YXRlXG4gICAgY29uc3QgdyA9IHN0cmVhbS5fd3JpdGFibGVTdGF0ZVxuICAgIGNvbnN0IHMgPSB3IHx8IHJcbiAgICBpZiAocikge1xuICAgICAgci5jb25zdHJ1Y3RlZCA9IHRydWVcbiAgICB9XG4gICAgaWYgKHcpIHtcbiAgICAgIHcuY29uc3RydWN0ZWQgPSB0cnVlXG4gICAgfVxuICAgIGlmIChzLmRlc3Ryb3llZCkge1xuICAgICAgc3RyZWFtLmVtaXQoa0Rlc3Ryb3ksIGVycilcbiAgICB9IGVsc2UgaWYgKGVycikge1xuICAgICAgZXJyb3JPckRlc3Ryb3koc3RyZWFtLCBlcnIsIHRydWUpXG4gICAgfSBlbHNlIHtcbiAgICAgIHByb2Nlc3MubmV4dFRpY2soZW1pdENvbnN0cnVjdE5ULCBzdHJlYW0pXG4gICAgfVxuICB9XG4gIHRyeSB7XG4gICAgc3RyZWFtLl9jb25zdHJ1Y3QoKGVycikgPT4ge1xuICAgICAgcHJvY2Vzcy5uZXh0VGljayhvbkNvbnN0cnVjdCwgZXJyKVxuICAgIH0pXG4gIH0gY2F0Y2ggKGVycikge1xuICAgIHByb2Nlc3MubmV4dFRpY2sob25Db25zdHJ1Y3QsIGVycilcbiAgfVxufVxuZnVuY3Rpb24gZW1pdENvbnN0cnVjdE5UKHN0cmVhbSkge1xuICBzdHJlYW0uZW1pdChrQ29uc3RydWN0KVxufVxuZnVuY3Rpb24gaXNSZXF1ZXN0KHN0cmVhbSkge1xuICByZXR1cm4gKHN0cmVhbSA9PT0gbnVsbCB8fCBzdHJlYW0gPT09IHVuZGVmaW5lZCA/IHVuZGVmaW5lZCA6IHN0cmVhbS5zZXRIZWFkZXIpICYmIHR5cGVvZiBzdHJlYW0uYWJvcnQgPT09ICdmdW5jdGlvbidcbn1cbmZ1bmN0aW9uIGVtaXRDbG9zZUxlZ2FjeShzdHJlYW0pIHtcbiAgc3RyZWFtLmVtaXQoJ2Nsb3NlJylcbn1cbmZ1bmN0aW9uIGVtaXRFcnJvckNsb3NlTGVnYWN5KHN0cmVhbSwgZXJyKSB7XG4gIHN0cmVhbS5lbWl0KCdlcnJvcicsIGVycilcbiAgcHJvY2Vzcy5uZXh0VGljayhlbWl0Q2xvc2VMZWdhY3ksIHN0cmVhbSlcbn1cblxuLy8gTm9ybWFsaXplIGRlc3Ryb3kgZm9yIGxlZ2FjeS5cbmZ1bmN0aW9uIGRlc3Ryb3llcihzdHJlYW0sIGVycikge1xuICBpZiAoIXN0cmVhbSB8fCBpc0Rlc3Ryb3llZChzdHJlYW0pKSB7XG4gICAgcmV0dXJuXG4gIH1cbiAgaWYgKCFlcnIgJiYgIWlzRmluaXNoZWQoc3RyZWFtKSkge1xuICAgIGVyciA9IG5ldyBBYm9ydEVycm9yKClcbiAgfVxuXG4gIC8vIFRPRE86IFJlbW92ZSBpc1JlcXVlc3QgYnJhbmNoZXMuXG4gIGlmIChpc1NlcnZlclJlcXVlc3Qoc3RyZWFtKSkge1xuICAgIHN0cmVhbS5zb2NrZXQgPSBudWxsXG4gICAgc3RyZWFtLmRlc3Ryb3koZXJyKVxuICB9IGVsc2UgaWYgKGlzUmVxdWVzdChzdHJlYW0pKSB7XG4gICAgc3RyZWFtLmFib3J0KClcbiAgfSBlbHNlIGlmIChpc1JlcXVlc3Qoc3RyZWFtLnJlcSkpIHtcbiAgICBzdHJlYW0ucmVxLmFib3J0KClcbiAgfSBlbHNlIGlmICh0eXBlb2Ygc3RyZWFtLmRlc3Ryb3kgPT09ICdmdW5jdGlvbicpIHtcbiAgICBzdHJlYW0uZGVzdHJveShlcnIpXG4gIH0gZWxzZSBpZiAodHlwZW9mIHN0cmVhbS5jbG9zZSA9PT0gJ2Z1bmN0aW9uJykge1xuICAgIC8vIFRPRE86IERvbid0IGxvc2UgZXJyP1xuICAgIHN0cmVhbS5jbG9zZSgpXG4gIH0gZWxzZSBpZiAoZXJyKSB7XG4gICAgcHJvY2Vzcy5uZXh0VGljayhlbWl0RXJyb3JDbG9zZUxlZ2FjeSwgc3RyZWFtLCBlcnIpXG4gIH0gZWxzZSB7XG4gICAgcHJvY2Vzcy5uZXh0VGljayhlbWl0Q2xvc2VMZWdhY3ksIHN0cmVhbSlcbiAgfVxuICBpZiAoIXN0cmVhbS5kZXN0cm95ZWQpIHtcbiAgICBzdHJlYW1ba0lzRGVzdHJveWVkXSA9IHRydWVcbiAgfVxufVxubW9kdWxlLmV4cG9ydHMgPSB7XG4gIGNvbnN0cnVjdCxcbiAgZGVzdHJveWVyLFxuICBkZXN0cm95LFxuICB1bmRlc3Ryb3ksXG4gIGVycm9yT3JEZXN0cm95XG59XG4iLAogICAgIid1c2Ugc3RyaWN0J1xuXG5jb25zdCB7IEFycmF5SXNBcnJheSwgT2JqZWN0U2V0UHJvdG90eXBlT2YgfSA9IHJlcXVpcmUoJy4uLy4uL291cnMvcHJpbW9yZGlhbHMnKVxuY29uc3QgeyBFdmVudEVtaXR0ZXI6IEVFIH0gPSByZXF1aXJlKCdldmVudHMnKVxuZnVuY3Rpb24gU3RyZWFtKG9wdHMpIHtcbiAgRUUuY2FsbCh0aGlzLCBvcHRzKVxufVxuT2JqZWN0U2V0UHJvdG90eXBlT2YoU3RyZWFtLnByb3RvdHlwZSwgRUUucHJvdG90eXBlKVxuT2JqZWN0U2V0UHJvdG90eXBlT2YoU3RyZWFtLCBFRSlcblN0cmVhbS5wcm90b3R5cGUucGlwZSA9IGZ1bmN0aW9uIChkZXN0LCBvcHRpb25zKSB7XG4gIGNvbnN0IHNvdXJjZSA9IHRoaXNcbiAgZnVuY3Rpb24gb25kYXRhKGNodW5rKSB7XG4gICAgaWYgKGRlc3Qud3JpdGFibGUgJiYgZGVzdC53cml0ZShjaHVuaykgPT09IGZhbHNlICYmIHNvdXJjZS5wYXVzZSkge1xuICAgICAgc291cmNlLnBhdXNlKClcbiAgICB9XG4gIH1cbiAgc291cmNlLm9uKCdkYXRhJywgb25kYXRhKVxuICBmdW5jdGlvbiBvbmRyYWluKCkge1xuICAgIGlmIChzb3VyY2UucmVhZGFibGUgJiYgc291cmNlLnJlc3VtZSkge1xuICAgICAgc291cmNlLnJlc3VtZSgpXG4gICAgfVxuICB9XG4gIGRlc3Qub24oJ2RyYWluJywgb25kcmFpbilcblxuICAvLyBJZiB0aGUgJ2VuZCcgb3B0aW9uIGlzIG5vdCBzdXBwbGllZCwgZGVzdC5lbmQoKSB3aWxsIGJlIGNhbGxlZCB3aGVuXG4gIC8vIHNvdXJjZSBnZXRzIHRoZSAnZW5kJyBvciAnY2xvc2UnIGV2ZW50cy4gIE9ubHkgZGVzdC5lbmQoKSBvbmNlLlxuICBpZiAoIWRlc3QuX2lzU3RkaW8gJiYgKCFvcHRpb25zIHx8IG9wdGlvbnMuZW5kICE9PSBmYWxzZSkpIHtcbiAgICBzb3VyY2Uub24oJ2VuZCcsIG9uZW5kKVxuICAgIHNvdXJjZS5vbignY2xvc2UnLCBvbmNsb3NlKVxuICB9XG4gIGxldCBkaWRPbkVuZCA9IGZhbHNlXG4gIGZ1bmN0aW9uIG9uZW5kKCkge1xuICAgIGlmIChkaWRPbkVuZCkgcmV0dXJuXG4gICAgZGlkT25FbmQgPSB0cnVlXG4gICAgZGVzdC5lbmQoKVxuICB9XG4gIGZ1bmN0aW9uIG9uY2xvc2UoKSB7XG4gICAgaWYgKGRpZE9uRW5kKSByZXR1cm5cbiAgICBkaWRPbkVuZCA9IHRydWVcbiAgICBpZiAodHlwZW9mIGRlc3QuZGVzdHJveSA9PT0gJ2Z1bmN0aW9uJykgZGVzdC5kZXN0cm95KClcbiAgfVxuXG4gIC8vIERvbid0IGxlYXZlIGRhbmdsaW5nIHBpcGVzIHdoZW4gdGhlcmUgYXJlIGVycm9ycy5cbiAgZnVuY3Rpb24gb25lcnJvcihlcikge1xuICAgIGNsZWFudXAoKVxuICAgIGlmIChFRS5saXN0ZW5lckNvdW50KHRoaXMsICdlcnJvcicpID09PSAwKSB7XG4gICAgICB0aGlzLmVtaXQoJ2Vycm9yJywgZXIpXG4gICAgfVxuICB9XG4gIHByZXBlbmRMaXN0ZW5lcihzb3VyY2UsICdlcnJvcicsIG9uZXJyb3IpXG4gIHByZXBlbmRMaXN0ZW5lcihkZXN0LCAnZXJyb3InLCBvbmVycm9yKVxuXG4gIC8vIFJlbW92ZSBhbGwgdGhlIGV2ZW50IGxpc3RlbmVycyB0aGF0IHdlcmUgYWRkZWQuXG4gIGZ1bmN0aW9uIGNsZWFudXAoKSB7XG4gICAgc291cmNlLnJlbW92ZUxpc3RlbmVyKCdkYXRhJywgb25kYXRhKVxuICAgIGRlc3QucmVtb3ZlTGlzdGVuZXIoJ2RyYWluJywgb25kcmFpbilcbiAgICBzb3VyY2UucmVtb3ZlTGlzdGVuZXIoJ2VuZCcsIG9uZW5kKVxuICAgIHNvdXJjZS5yZW1vdmVMaXN0ZW5lcignY2xvc2UnLCBvbmNsb3NlKVxuICAgIHNvdXJjZS5yZW1vdmVMaXN0ZW5lcignZXJyb3InLCBvbmVycm9yKVxuICAgIGRlc3QucmVtb3ZlTGlzdGVuZXIoJ2Vycm9yJywgb25lcnJvcilcbiAgICBzb3VyY2UucmVtb3ZlTGlzdGVuZXIoJ2VuZCcsIGNsZWFudXApXG4gICAgc291cmNlLnJlbW92ZUxpc3RlbmVyKCdjbG9zZScsIGNsZWFudXApXG4gICAgZGVzdC5yZW1vdmVMaXN0ZW5lcignY2xvc2UnLCBjbGVhbnVwKVxuICB9XG4gIHNvdXJjZS5vbignZW5kJywgY2xlYW51cClcbiAgc291cmNlLm9uKCdjbG9zZScsIGNsZWFudXApXG4gIGRlc3Qub24oJ2Nsb3NlJywgY2xlYW51cClcbiAgZGVzdC5lbWl0KCdwaXBlJywgc291cmNlKVxuXG4gIC8vIEFsbG93IGZvciB1bml4LWxpa2UgdXNhZ2U6IEEucGlwZShCKS5waXBlKEMpXG4gIHJldHVybiBkZXN0XG59XG5mdW5jdGlvbiBwcmVwZW5kTGlzdGVuZXIoZW1pdHRlciwgZXZlbnQsIGZuKSB7XG4gIC8vIFNhZGx5IHRoaXMgaXMgbm90IGNhY2hlYWJsZSBhcyBzb21lIGxpYnJhcmllcyBidW5kbGUgdGhlaXIgb3duXG4gIC8vIGV2ZW50IGVtaXR0ZXIgaW1wbGVtZW50YXRpb24gd2l0aCB0aGVtLlxuICBpZiAodHlwZW9mIGVtaXR0ZXIucHJlcGVuZExpc3RlbmVyID09PSAnZnVuY3Rpb24nKSByZXR1cm4gZW1pdHRlci5wcmVwZW5kTGlzdGVuZXIoZXZlbnQsIGZuKVxuXG4gIC8vIFRoaXMgaXMgYSBoYWNrIHRvIG1ha2Ugc3VyZSB0aGF0IG91ciBlcnJvciBoYW5kbGVyIGlzIGF0dGFjaGVkIGJlZm9yZSBhbnlcbiAgLy8gdXNlcmxhbmQgb25lcy4gIE5FVkVSIERPIFRISVMuIFRoaXMgaXMgaGVyZSBvbmx5IGJlY2F1c2UgdGhpcyBjb2RlIG5lZWRzXG4gIC8vIHRvIGNvbnRpbnVlIHRvIHdvcmsgd2l0aCBvbGRlciB2ZXJzaW9ucyBvZiBOb2RlLmpzIHRoYXQgZG8gbm90IGluY2x1ZGVcbiAgLy8gdGhlIHByZXBlbmRMaXN0ZW5lcigpIG1ldGhvZC4gVGhlIGdvYWwgaXMgdG8gZXZlbnR1YWxseSByZW1vdmUgdGhpcyBoYWNrLlxuICBpZiAoIWVtaXR0ZXIuX2V2ZW50cyB8fCAhZW1pdHRlci5fZXZlbnRzW2V2ZW50XSkgZW1pdHRlci5vbihldmVudCwgZm4pXG4gIGVsc2UgaWYgKEFycmF5SXNBcnJheShlbWl0dGVyLl9ldmVudHNbZXZlbnRdKSkgZW1pdHRlci5fZXZlbnRzW2V2ZW50XS51bnNoaWZ0KGZuKVxuICBlbHNlIGVtaXR0ZXIuX2V2ZW50c1tldmVudF0gPSBbZm4sIGVtaXR0ZXIuX2V2ZW50c1tldmVudF1dXG59XG5tb2R1bGUuZXhwb3J0cyA9IHtcbiAgU3RyZWFtLFxuICBwcmVwZW5kTGlzdGVuZXJcbn1cbiIsCiAgICAiJ3VzZSBzdHJpY3QnXG5cbmNvbnN0IHsgU3ltYm9sRGlzcG9zZSB9ID0gcmVxdWlyZSgnLi4vLi4vb3Vycy9wcmltb3JkaWFscycpXG5jb25zdCB7IEFib3J0RXJyb3IsIGNvZGVzIH0gPSByZXF1aXJlKCcuLi8uLi9vdXJzL2Vycm9ycycpXG5jb25zdCB7IGlzTm9kZVN0cmVhbSwgaXNXZWJTdHJlYW0sIGtDb250cm9sbGVyRXJyb3JGdW5jdGlvbiB9ID0gcmVxdWlyZSgnLi91dGlscycpXG5jb25zdCBlb3MgPSByZXF1aXJlKCcuL2VuZC1vZi1zdHJlYW0nKVxuY29uc3QgeyBFUlJfSU5WQUxJRF9BUkdfVFlQRSB9ID0gY29kZXNcbmxldCBhZGRBYm9ydExpc3RlbmVyXG5cbi8vIFRoaXMgbWV0aG9kIGlzIGlubGluZWQgaGVyZSBmb3IgcmVhZGFibGUtc3RyZWFtXG4vLyBJdCBhbHNvIGRvZXMgbm90IGFsbG93IGZvciBzaWduYWwgdG8gbm90IGV4aXN0IG9uIHRoZSBzdHJlYW1cbi8vIGh0dHBzOi8vZ2l0aHViLmNvbS9ub2RlanMvbm9kZS9wdWxsLzM2MDYxI2Rpc2N1c3Npb25fcjUzMzcxODAyOVxuY29uc3QgdmFsaWRhdGVBYm9ydFNpZ25hbCA9IChzaWduYWwsIG5hbWUpID0+IHtcbiAgaWYgKHR5cGVvZiBzaWduYWwgIT09ICdvYmplY3QnIHx8ICEoJ2Fib3J0ZWQnIGluIHNpZ25hbCkpIHtcbiAgICB0aHJvdyBuZXcgRVJSX0lOVkFMSURfQVJHX1RZUEUobmFtZSwgJ0Fib3J0U2lnbmFsJywgc2lnbmFsKVxuICB9XG59XG5tb2R1bGUuZXhwb3J0cy5hZGRBYm9ydFNpZ25hbCA9IGZ1bmN0aW9uIGFkZEFib3J0U2lnbmFsKHNpZ25hbCwgc3RyZWFtKSB7XG4gIHZhbGlkYXRlQWJvcnRTaWduYWwoc2lnbmFsLCAnc2lnbmFsJylcbiAgaWYgKCFpc05vZGVTdHJlYW0oc3RyZWFtKSAmJiAhaXNXZWJTdHJlYW0oc3RyZWFtKSkge1xuICAgIHRocm93IG5ldyBFUlJfSU5WQUxJRF9BUkdfVFlQRSgnc3RyZWFtJywgWydSZWFkYWJsZVN0cmVhbScsICdXcml0YWJsZVN0cmVhbScsICdTdHJlYW0nXSwgc3RyZWFtKVxuICB9XG4gIHJldHVybiBtb2R1bGUuZXhwb3J0cy5hZGRBYm9ydFNpZ25hbE5vVmFsaWRhdGUoc2lnbmFsLCBzdHJlYW0pXG59XG5tb2R1bGUuZXhwb3J0cy5hZGRBYm9ydFNpZ25hbE5vVmFsaWRhdGUgPSBmdW5jdGlvbiAoc2lnbmFsLCBzdHJlYW0pIHtcbiAgaWYgKHR5cGVvZiBzaWduYWwgIT09ICdvYmplY3QnIHx8ICEoJ2Fib3J0ZWQnIGluIHNpZ25hbCkpIHtcbiAgICByZXR1cm4gc3RyZWFtXG4gIH1cbiAgY29uc3Qgb25BYm9ydCA9IGlzTm9kZVN0cmVhbShzdHJlYW0pXG4gICAgPyAoKSA9PiB7XG4gICAgICAgIHN0cmVhbS5kZXN0cm95KFxuICAgICAgICAgIG5ldyBBYm9ydEVycm9yKHVuZGVmaW5lZCwge1xuICAgICAgICAgICAgY2F1c2U6IHNpZ25hbC5yZWFzb25cbiAgICAgICAgICB9KVxuICAgICAgICApXG4gICAgICB9XG4gICAgOiAoKSA9PiB7XG4gICAgICAgIHN0cmVhbVtrQ29udHJvbGxlckVycm9yRnVuY3Rpb25dKFxuICAgICAgICAgIG5ldyBBYm9ydEVycm9yKHVuZGVmaW5lZCwge1xuICAgICAgICAgICAgY2F1c2U6IHNpZ25hbC5yZWFzb25cbiAgICAgICAgICB9KVxuICAgICAgICApXG4gICAgICB9XG4gIGlmIChzaWduYWwuYWJvcnRlZCkge1xuICAgIG9uQWJvcnQoKVxuICB9IGVsc2Uge1xuICAgIGFkZEFib3J0TGlzdGVuZXIgPSBhZGRBYm9ydExpc3RlbmVyIHx8IHJlcXVpcmUoJy4uLy4uL291cnMvdXRpbCcpLmFkZEFib3J0TGlzdGVuZXJcbiAgICBjb25zdCBkaXNwb3NhYmxlID0gYWRkQWJvcnRMaXN0ZW5lcihzaWduYWwsIG9uQWJvcnQpXG4gICAgZW9zKHN0cmVhbSwgZGlzcG9zYWJsZVtTeW1ib2xEaXNwb3NlXSlcbiAgfVxuICByZXR1cm4gc3RyZWFtXG59XG4iLAogICAgIid1c2Ugc3RyaWN0J1xuXG5jb25zdCB7IFN0cmluZ1Byb3RvdHlwZVNsaWNlLCBTeW1ib2xJdGVyYXRvciwgVHlwZWRBcnJheVByb3RvdHlwZVNldCwgVWludDhBcnJheSB9ID0gcmVxdWlyZSgnLi4vLi4vb3Vycy9wcmltb3JkaWFscycpXG5jb25zdCB7IEJ1ZmZlciB9ID0gcmVxdWlyZSgnYnVmZmVyJylcbmNvbnN0IHsgaW5zcGVjdCB9ID0gcmVxdWlyZSgnLi4vLi4vb3Vycy91dGlsJylcbm1vZHVsZS5leHBvcnRzID0gY2xhc3MgQnVmZmVyTGlzdCB7XG4gIGNvbnN0cnVjdG9yKCkge1xuICAgIHRoaXMuaGVhZCA9IG51bGxcbiAgICB0aGlzLnRhaWwgPSBudWxsXG4gICAgdGhpcy5sZW5ndGggPSAwXG4gIH1cbiAgcHVzaCh2KSB7XG4gICAgY29uc3QgZW50cnkgPSB7XG4gICAgICBkYXRhOiB2LFxuICAgICAgbmV4dDogbnVsbFxuICAgIH1cbiAgICBpZiAodGhpcy5sZW5ndGggPiAwKSB0aGlzLnRhaWwubmV4dCA9IGVudHJ5XG4gICAgZWxzZSB0aGlzLmhlYWQgPSBlbnRyeVxuICAgIHRoaXMudGFpbCA9IGVudHJ5XG4gICAgKyt0aGlzLmxlbmd0aFxuICB9XG4gIHVuc2hpZnQodikge1xuICAgIGNvbnN0IGVudHJ5ID0ge1xuICAgICAgZGF0YTogdixcbiAgICAgIG5leHQ6IHRoaXMuaGVhZFxuICAgIH1cbiAgICBpZiAodGhpcy5sZW5ndGggPT09IDApIHRoaXMudGFpbCA9IGVudHJ5XG4gICAgdGhpcy5oZWFkID0gZW50cnlcbiAgICArK3RoaXMubGVuZ3RoXG4gIH1cbiAgc2hpZnQoKSB7XG4gICAgaWYgKHRoaXMubGVuZ3RoID09PSAwKSByZXR1cm5cbiAgICBjb25zdCByZXQgPSB0aGlzLmhlYWQuZGF0YVxuICAgIGlmICh0aGlzLmxlbmd0aCA9PT0gMSkgdGhpcy5oZWFkID0gdGhpcy50YWlsID0gbnVsbFxuICAgIGVsc2UgdGhpcy5oZWFkID0gdGhpcy5oZWFkLm5leHRcbiAgICAtLXRoaXMubGVuZ3RoXG4gICAgcmV0dXJuIHJldFxuICB9XG4gIGNsZWFyKCkge1xuICAgIHRoaXMuaGVhZCA9IHRoaXMudGFpbCA9IG51bGxcbiAgICB0aGlzLmxlbmd0aCA9IDBcbiAgfVxuICBqb2luKHMpIHtcbiAgICBpZiAodGhpcy5sZW5ndGggPT09IDApIHJldHVybiAnJ1xuICAgIGxldCBwID0gdGhpcy5oZWFkXG4gICAgbGV0IHJldCA9ICcnICsgcC5kYXRhXG4gICAgd2hpbGUgKChwID0gcC5uZXh0KSAhPT0gbnVsbCkgcmV0ICs9IHMgKyBwLmRhdGFcbiAgICByZXR1cm4gcmV0XG4gIH1cbiAgY29uY2F0KG4pIHtcbiAgICBpZiAodGhpcy5sZW5ndGggPT09IDApIHJldHVybiBCdWZmZXIuYWxsb2MoMClcbiAgICBjb25zdCByZXQgPSBCdWZmZXIuYWxsb2NVbnNhZmUobiA+Pj4gMClcbiAgICBsZXQgcCA9IHRoaXMuaGVhZFxuICAgIGxldCBpID0gMFxuICAgIHdoaWxlIChwKSB7XG4gICAgICBUeXBlZEFycmF5UHJvdG90eXBlU2V0KHJldCwgcC5kYXRhLCBpKVxuICAgICAgaSArPSBwLmRhdGEubGVuZ3RoXG4gICAgICBwID0gcC5uZXh0XG4gICAgfVxuICAgIHJldHVybiByZXRcbiAgfVxuXG4gIC8vIENvbnN1bWVzIGEgc3BlY2lmaWVkIGFtb3VudCBvZiBieXRlcyBvciBjaGFyYWN0ZXJzIGZyb20gdGhlIGJ1ZmZlcmVkIGRhdGEuXG4gIGNvbnN1bWUobiwgaGFzU3RyaW5ncykge1xuICAgIGNvbnN0IGRhdGEgPSB0aGlzLmhlYWQuZGF0YVxuICAgIGlmIChuIDwgZGF0YS5sZW5ndGgpIHtcbiAgICAgIC8vIGBzbGljZWAgaXMgdGhlIHNhbWUgZm9yIGJ1ZmZlcnMgYW5kIHN0cmluZ3MuXG4gICAgICBjb25zdCBzbGljZSA9IGRhdGEuc2xpY2UoMCwgbilcbiAgICAgIHRoaXMuaGVhZC5kYXRhID0gZGF0YS5zbGljZShuKVxuICAgICAgcmV0dXJuIHNsaWNlXG4gICAgfVxuICAgIGlmIChuID09PSBkYXRhLmxlbmd0aCkge1xuICAgICAgLy8gRmlyc3QgY2h1bmsgaXMgYSBwZXJmZWN0IG1hdGNoLlxuICAgICAgcmV0dXJuIHRoaXMuc2hpZnQoKVxuICAgIH1cbiAgICAvLyBSZXN1bHQgc3BhbnMgbW9yZSB0aGFuIG9uZSBidWZmZXIuXG4gICAgcmV0dXJuIGhhc1N0cmluZ3MgPyB0aGlzLl9nZXRTdHJpbmcobikgOiB0aGlzLl9nZXRCdWZmZXIobilcbiAgfVxuICBmaXJzdCgpIHtcbiAgICByZXR1cm4gdGhpcy5oZWFkLmRhdGFcbiAgfVxuICAqW1N5bWJvbEl0ZXJhdG9yXSgpIHtcbiAgICBmb3IgKGxldCBwID0gdGhpcy5oZWFkOyBwOyBwID0gcC5uZXh0KSB7XG4gICAgICB5aWVsZCBwLmRhdGFcbiAgICB9XG4gIH1cblxuICAvLyBDb25zdW1lcyBhIHNwZWNpZmllZCBhbW91bnQgb2YgY2hhcmFjdGVycyBmcm9tIHRoZSBidWZmZXJlZCBkYXRhLlxuICBfZ2V0U3RyaW5nKG4pIHtcbiAgICBsZXQgcmV0ID0gJydcbiAgICBsZXQgcCA9IHRoaXMuaGVhZFxuICAgIGxldCBjID0gMFxuICAgIGRvIHtcbiAgICAgIGNvbnN0IHN0ciA9IHAuZGF0YVxuICAgICAgaWYgKG4gPiBzdHIubGVuZ3RoKSB7XG4gICAgICAgIHJldCArPSBzdHJcbiAgICAgICAgbiAtPSBzdHIubGVuZ3RoXG4gICAgICB9IGVsc2Uge1xuICAgICAgICBpZiAobiA9PT0gc3RyLmxlbmd0aCkge1xuICAgICAgICAgIHJldCArPSBzdHJcbiAgICAgICAgICArK2NcbiAgICAgICAgICBpZiAocC5uZXh0KSB0aGlzLmhlYWQgPSBwLm5leHRcbiAgICAgICAgICBlbHNlIHRoaXMuaGVhZCA9IHRoaXMudGFpbCA9IG51bGxcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICByZXQgKz0gU3RyaW5nUHJvdG90eXBlU2xpY2Uoc3RyLCAwLCBuKVxuICAgICAgICAgIHRoaXMuaGVhZCA9IHBcbiAgICAgICAgICBwLmRhdGEgPSBTdHJpbmdQcm90b3R5cGVTbGljZShzdHIsIG4pXG4gICAgICAgIH1cbiAgICAgICAgYnJlYWtcbiAgICAgIH1cbiAgICAgICsrY1xuICAgIH0gd2hpbGUgKChwID0gcC5uZXh0KSAhPT0gbnVsbClcbiAgICB0aGlzLmxlbmd0aCAtPSBjXG4gICAgcmV0dXJuIHJldFxuICB9XG5cbiAgLy8gQ29uc3VtZXMgYSBzcGVjaWZpZWQgYW1vdW50IG9mIGJ5dGVzIGZyb20gdGhlIGJ1ZmZlcmVkIGRhdGEuXG4gIF9nZXRCdWZmZXIobikge1xuICAgIGNvbnN0IHJldCA9IEJ1ZmZlci5hbGxvY1Vuc2FmZShuKVxuICAgIGNvbnN0IHJldExlbiA9IG5cbiAgICBsZXQgcCA9IHRoaXMuaGVhZFxuICAgIGxldCBjID0gMFxuICAgIGRvIHtcbiAgICAgIGNvbnN0IGJ1ZiA9IHAuZGF0YVxuICAgICAgaWYgKG4gPiBidWYubGVuZ3RoKSB7XG4gICAgICAgIFR5cGVkQXJyYXlQcm90b3R5cGVTZXQocmV0LCBidWYsIHJldExlbiAtIG4pXG4gICAgICAgIG4gLT0gYnVmLmxlbmd0aFxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgaWYgKG4gPT09IGJ1Zi5sZW5ndGgpIHtcbiAgICAgICAgICBUeXBlZEFycmF5UHJvdG90eXBlU2V0KHJldCwgYnVmLCByZXRMZW4gLSBuKVxuICAgICAgICAgICsrY1xuICAgICAgICAgIGlmIChwLm5leHQpIHRoaXMuaGVhZCA9IHAubmV4dFxuICAgICAgICAgIGVsc2UgdGhpcy5oZWFkID0gdGhpcy50YWlsID0gbnVsbFxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIFR5cGVkQXJyYXlQcm90b3R5cGVTZXQocmV0LCBuZXcgVWludDhBcnJheShidWYuYnVmZmVyLCBidWYuYnl0ZU9mZnNldCwgbiksIHJldExlbiAtIG4pXG4gICAgICAgICAgdGhpcy5oZWFkID0gcFxuICAgICAgICAgIHAuZGF0YSA9IGJ1Zi5zbGljZShuKVxuICAgICAgICB9XG4gICAgICAgIGJyZWFrXG4gICAgICB9XG4gICAgICArK2NcbiAgICB9IHdoaWxlICgocCA9IHAubmV4dCkgIT09IG51bGwpXG4gICAgdGhpcy5sZW5ndGggLT0gY1xuICAgIHJldHVybiByZXRcbiAgfVxuXG4gIC8vIE1ha2Ugc3VyZSB0aGUgbGlua2VkIGxpc3Qgb25seSBzaG93cyB0aGUgbWluaW1hbCBuZWNlc3NhcnkgaW5mb3JtYXRpb24uXG4gIFtTeW1ib2wuZm9yKCdub2RlanMudXRpbC5pbnNwZWN0LmN1c3RvbScpXShfLCBvcHRpb25zKSB7XG4gICAgcmV0dXJuIGluc3BlY3QodGhpcywge1xuICAgICAgLi4ub3B0aW9ucyxcbiAgICAgIC8vIE9ubHkgaW5zcGVjdCBvbmUgbGV2ZWwuXG4gICAgICBkZXB0aDogMCxcbiAgICAgIC8vIEl0IHNob3VsZCBub3QgcmVjdXJzZS5cbiAgICAgIGN1c3RvbUluc3BlY3Q6IGZhbHNlXG4gICAgfSlcbiAgfVxufVxuIiwKICAgICIndXNlIHN0cmljdCdcblxuY29uc3QgeyBNYXRoRmxvb3IsIE51bWJlcklzSW50ZWdlciB9ID0gcmVxdWlyZSgnLi4vLi4vb3Vycy9wcmltb3JkaWFscycpXG5jb25zdCB7IHZhbGlkYXRlSW50ZWdlciB9ID0gcmVxdWlyZSgnLi4vdmFsaWRhdG9ycycpXG5jb25zdCB7IEVSUl9JTlZBTElEX0FSR19WQUxVRSB9ID0gcmVxdWlyZSgnLi4vLi4vb3Vycy9lcnJvcnMnKS5jb2Rlc1xubGV0IGRlZmF1bHRIaWdoV2F0ZXJNYXJrQnl0ZXMgPSAxNiAqIDEwMjRcbmxldCBkZWZhdWx0SGlnaFdhdGVyTWFya09iamVjdE1vZGUgPSAxNlxuZnVuY3Rpb24gaGlnaFdhdGVyTWFya0Zyb20ob3B0aW9ucywgaXNEdXBsZXgsIGR1cGxleEtleSkge1xuICByZXR1cm4gb3B0aW9ucy5oaWdoV2F0ZXJNYXJrICE9IG51bGwgPyBvcHRpb25zLmhpZ2hXYXRlck1hcmsgOiBpc0R1cGxleCA/IG9wdGlvbnNbZHVwbGV4S2V5XSA6IG51bGxcbn1cbmZ1bmN0aW9uIGdldERlZmF1bHRIaWdoV2F0ZXJNYXJrKG9iamVjdE1vZGUpIHtcbiAgcmV0dXJuIG9iamVjdE1vZGUgPyBkZWZhdWx0SGlnaFdhdGVyTWFya09iamVjdE1vZGUgOiBkZWZhdWx0SGlnaFdhdGVyTWFya0J5dGVzXG59XG5mdW5jdGlvbiBzZXREZWZhdWx0SGlnaFdhdGVyTWFyayhvYmplY3RNb2RlLCB2YWx1ZSkge1xuICB2YWxpZGF0ZUludGVnZXIodmFsdWUsICd2YWx1ZScsIDApXG4gIGlmIChvYmplY3RNb2RlKSB7XG4gICAgZGVmYXVsdEhpZ2hXYXRlck1hcmtPYmplY3RNb2RlID0gdmFsdWVcbiAgfSBlbHNlIHtcbiAgICBkZWZhdWx0SGlnaFdhdGVyTWFya0J5dGVzID0gdmFsdWVcbiAgfVxufVxuZnVuY3Rpb24gZ2V0SGlnaFdhdGVyTWFyayhzdGF0ZSwgb3B0aW9ucywgZHVwbGV4S2V5LCBpc0R1cGxleCkge1xuICBjb25zdCBod20gPSBoaWdoV2F0ZXJNYXJrRnJvbShvcHRpb25zLCBpc0R1cGxleCwgZHVwbGV4S2V5KVxuICBpZiAoaHdtICE9IG51bGwpIHtcbiAgICBpZiAoIU51bWJlcklzSW50ZWdlcihod20pIHx8IGh3bSA8IDApIHtcbiAgICAgIGNvbnN0IG5hbWUgPSBpc0R1cGxleCA/IGBvcHRpb25zLiR7ZHVwbGV4S2V5fWAgOiAnb3B0aW9ucy5oaWdoV2F0ZXJNYXJrJ1xuICAgICAgdGhyb3cgbmV3IEVSUl9JTlZBTElEX0FSR19WQUxVRShuYW1lLCBod20pXG4gICAgfVxuICAgIHJldHVybiBNYXRoRmxvb3IoaHdtKVxuICB9XG5cbiAgLy8gRGVmYXVsdCB2YWx1ZVxuICByZXR1cm4gZ2V0RGVmYXVsdEhpZ2hXYXRlck1hcmsoc3RhdGUub2JqZWN0TW9kZSlcbn1cbm1vZHVsZS5leHBvcnRzID0ge1xuICBnZXRIaWdoV2F0ZXJNYXJrLFxuICBnZXREZWZhdWx0SGlnaFdhdGVyTWFyayxcbiAgc2V0RGVmYXVsdEhpZ2hXYXRlck1hcmtcbn1cbiIsCiAgICAiJ3VzZSBzdHJpY3QnXG5cbi8qIHJlcGxhY2VtZW50IHN0YXJ0ICovXG5cbmNvbnN0IHByb2Nlc3MgPSByZXF1aXJlKCdwcm9jZXNzLycpXG5cbi8qIHJlcGxhY2VtZW50IGVuZCAqL1xuXG5jb25zdCB7IFByb21pc2VQcm90b3R5cGVUaGVuLCBTeW1ib2xBc3luY0l0ZXJhdG9yLCBTeW1ib2xJdGVyYXRvciB9ID0gcmVxdWlyZSgnLi4vLi4vb3Vycy9wcmltb3JkaWFscycpXG5jb25zdCB7IEJ1ZmZlciB9ID0gcmVxdWlyZSgnYnVmZmVyJylcbmNvbnN0IHsgRVJSX0lOVkFMSURfQVJHX1RZUEUsIEVSUl9TVFJFQU1fTlVMTF9WQUxVRVMgfSA9IHJlcXVpcmUoJy4uLy4uL291cnMvZXJyb3JzJykuY29kZXNcbmZ1bmN0aW9uIGZyb20oUmVhZGFibGUsIGl0ZXJhYmxlLCBvcHRzKSB7XG4gIGxldCBpdGVyYXRvclxuICBpZiAodHlwZW9mIGl0ZXJhYmxlID09PSAnc3RyaW5nJyB8fCBpdGVyYWJsZSBpbnN0YW5jZW9mIEJ1ZmZlcikge1xuICAgIHJldHVybiBuZXcgUmVhZGFibGUoe1xuICAgICAgb2JqZWN0TW9kZTogdHJ1ZSxcbiAgICAgIC4uLm9wdHMsXG4gICAgICByZWFkKCkge1xuICAgICAgICB0aGlzLnB1c2goaXRlcmFibGUpXG4gICAgICAgIHRoaXMucHVzaChudWxsKVxuICAgICAgfVxuICAgIH0pXG4gIH1cbiAgbGV0IGlzQXN5bmNcbiAgaWYgKGl0ZXJhYmxlICYmIGl0ZXJhYmxlW1N5bWJvbEFzeW5jSXRlcmF0b3JdKSB7XG4gICAgaXNBc3luYyA9IHRydWVcbiAgICBpdGVyYXRvciA9IGl0ZXJhYmxlW1N5bWJvbEFzeW5jSXRlcmF0b3JdKClcbiAgfSBlbHNlIGlmIChpdGVyYWJsZSAmJiBpdGVyYWJsZVtTeW1ib2xJdGVyYXRvcl0pIHtcbiAgICBpc0FzeW5jID0gZmFsc2VcbiAgICBpdGVyYXRvciA9IGl0ZXJhYmxlW1N5bWJvbEl0ZXJhdG9yXSgpXG4gIH0gZWxzZSB7XG4gICAgdGhyb3cgbmV3IEVSUl9JTlZBTElEX0FSR19UWVBFKCdpdGVyYWJsZScsIFsnSXRlcmFibGUnXSwgaXRlcmFibGUpXG4gIH1cbiAgY29uc3QgcmVhZGFibGUgPSBuZXcgUmVhZGFibGUoe1xuICAgIG9iamVjdE1vZGU6IHRydWUsXG4gICAgaGlnaFdhdGVyTWFyazogMSxcbiAgICAvLyBUT0RPKHJvbmFnKTogV2hhdCBvcHRpb25zIHNob3VsZCBiZSBhbGxvd2VkP1xuICAgIC4uLm9wdHNcbiAgfSlcblxuICAvLyBGbGFnIHRvIHByb3RlY3QgYWdhaW5zdCBfcmVhZFxuICAvLyBiZWluZyBjYWxsZWQgYmVmb3JlIGxhc3QgaXRlcmF0aW9uIGNvbXBsZXRpb24uXG4gIGxldCByZWFkaW5nID0gZmFsc2VcbiAgcmVhZGFibGUuX3JlYWQgPSBmdW5jdGlvbiAoKSB7XG4gICAgaWYgKCFyZWFkaW5nKSB7XG4gICAgICByZWFkaW5nID0gdHJ1ZVxuICAgICAgbmV4dCgpXG4gICAgfVxuICB9XG4gIHJlYWRhYmxlLl9kZXN0cm95ID0gZnVuY3Rpb24gKGVycm9yLCBjYikge1xuICAgIFByb21pc2VQcm90b3R5cGVUaGVuKFxuICAgICAgY2xvc2UoZXJyb3IpLFxuICAgICAgKCkgPT4gcHJvY2Vzcy5uZXh0VGljayhjYiwgZXJyb3IpLFxuICAgICAgLy8gbmV4dFRpY2sgaXMgaGVyZSBpbiBjYXNlIGNiIHRocm93c1xuICAgICAgKGUpID0+IHByb2Nlc3MubmV4dFRpY2soY2IsIGUgfHwgZXJyb3IpXG4gICAgKVxuICB9XG4gIGFzeW5jIGZ1bmN0aW9uIGNsb3NlKGVycm9yKSB7XG4gICAgY29uc3QgaGFkRXJyb3IgPSBlcnJvciAhPT0gdW5kZWZpbmVkICYmIGVycm9yICE9PSBudWxsXG4gICAgY29uc3QgaGFzVGhyb3cgPSB0eXBlb2YgaXRlcmF0b3IudGhyb3cgPT09ICdmdW5jdGlvbidcbiAgICBpZiAoaGFkRXJyb3IgJiYgaGFzVGhyb3cpIHtcbiAgICAgIGNvbnN0IHsgdmFsdWUsIGRvbmUgfSA9IGF3YWl0IGl0ZXJhdG9yLnRocm93KGVycm9yKVxuICAgICAgYXdhaXQgdmFsdWVcbiAgICAgIGlmIChkb25lKSB7XG4gICAgICAgIHJldHVyblxuICAgICAgfVxuICAgIH1cbiAgICBpZiAodHlwZW9mIGl0ZXJhdG9yLnJldHVybiA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgY29uc3QgeyB2YWx1ZSB9ID0gYXdhaXQgaXRlcmF0b3IucmV0dXJuKClcbiAgICAgIGF3YWl0IHZhbHVlXG4gICAgfVxuICB9XG4gIGFzeW5jIGZ1bmN0aW9uIG5leHQoKSB7XG4gICAgZm9yICg7Oykge1xuICAgICAgdHJ5IHtcbiAgICAgICAgY29uc3QgeyB2YWx1ZSwgZG9uZSB9ID0gaXNBc3luYyA/IGF3YWl0IGl0ZXJhdG9yLm5leHQoKSA6IGl0ZXJhdG9yLm5leHQoKVxuICAgICAgICBpZiAoZG9uZSkge1xuICAgICAgICAgIHJlYWRhYmxlLnB1c2gobnVsbClcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBjb25zdCByZXMgPSB2YWx1ZSAmJiB0eXBlb2YgdmFsdWUudGhlbiA9PT0gJ2Z1bmN0aW9uJyA/IGF3YWl0IHZhbHVlIDogdmFsdWVcbiAgICAgICAgICBpZiAocmVzID09PSBudWxsKSB7XG4gICAgICAgICAgICByZWFkaW5nID0gZmFsc2VcbiAgICAgICAgICAgIHRocm93IG5ldyBFUlJfU1RSRUFNX05VTExfVkFMVUVTKClcbiAgICAgICAgICB9IGVsc2UgaWYgKHJlYWRhYmxlLnB1c2gocmVzKSkge1xuICAgICAgICAgICAgY29udGludWVcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgcmVhZGluZyA9IGZhbHNlXG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9IGNhdGNoIChlcnIpIHtcbiAgICAgICAgcmVhZGFibGUuZGVzdHJveShlcnIpXG4gICAgICB9XG4gICAgICBicmVha1xuICAgIH1cbiAgfVxuICByZXR1cm4gcmVhZGFibGVcbn1cbm1vZHVsZS5leHBvcnRzID0gZnJvbVxuIiwKICAgICIvKiByZXBsYWNlbWVudCBzdGFydCAqL1xuXG5jb25zdCBwcm9jZXNzID0gcmVxdWlyZSgncHJvY2Vzcy8nKVxuXG4vKiByZXBsYWNlbWVudCBlbmQgKi9cbi8vIENvcHlyaWdodCBKb3llbnQsIEluYy4gYW5kIG90aGVyIE5vZGUgY29udHJpYnV0b3JzLlxuLy9cbi8vIFBlcm1pc3Npb24gaXMgaGVyZWJ5IGdyYW50ZWQsIGZyZWUgb2YgY2hhcmdlLCB0byBhbnkgcGVyc29uIG9idGFpbmluZyBhXG4vLyBjb3B5IG9mIHRoaXMgc29mdHdhcmUgYW5kIGFzc29jaWF0ZWQgZG9jdW1lbnRhdGlvbiBmaWxlcyAodGhlXG4vLyBcIlNvZnR3YXJlXCIpLCB0byBkZWFsIGluIHRoZSBTb2Z0d2FyZSB3aXRob3V0IHJlc3RyaWN0aW9uLCBpbmNsdWRpbmdcbi8vIHdpdGhvdXQgbGltaXRhdGlvbiB0aGUgcmlnaHRzIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBtZXJnZSwgcHVibGlzaCxcbi8vIGRpc3RyaWJ1dGUsIHN1YmxpY2Vuc2UsIGFuZC9vciBzZWxsIGNvcGllcyBvZiB0aGUgU29mdHdhcmUsIGFuZCB0byBwZXJtaXRcbi8vIHBlcnNvbnMgdG8gd2hvbSB0aGUgU29mdHdhcmUgaXMgZnVybmlzaGVkIHRvIGRvIHNvLCBzdWJqZWN0IHRvIHRoZVxuLy8gZm9sbG93aW5nIGNvbmRpdGlvbnM6XG4vL1xuLy8gVGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2Ugc2hhbGwgYmUgaW5jbHVkZWRcbi8vIGluIGFsbCBjb3BpZXMgb3Igc3Vic3RhbnRpYWwgcG9ydGlvbnMgb2YgdGhlIFNvZnR3YXJlLlxuLy9cbi8vIFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCBcIkFTIElTXCIsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIEVYUFJFU1Ncbi8vIE9SIElNUExJRUQsIElOQ0xVRElORyBCVVQgTk9UIExJTUlURUQgVE8gVEhFIFdBUlJBTlRJRVMgT0Zcbi8vIE1FUkNIQU5UQUJJTElUWSwgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQU5EIE5PTklORlJJTkdFTUVOVC4gSU5cbi8vIE5PIEVWRU5UIFNIQUxMIFRIRSBBVVRIT1JTIE9SIENPUFlSSUdIVCBIT0xERVJTIEJFIExJQUJMRSBGT1IgQU5ZIENMQUlNLFxuLy8gREFNQUdFUyBPUiBPVEhFUiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQU4gQUNUSU9OIE9GIENPTlRSQUNULCBUT1JUIE9SXG4vLyBPVEhFUldJU0UsIEFSSVNJTkcgRlJPTSwgT1VUIE9GIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUgU09GVFdBUkUgT1IgVEhFXG4vLyBVU0UgT1IgT1RIRVIgREVBTElOR1MgSU4gVEhFIFNPRlRXQVJFLlxuXG47KCd1c2Ugc3RyaWN0JylcbmNvbnN0IHtcbiAgQXJyYXlQcm90b3R5cGVJbmRleE9mLFxuICBOdW1iZXJJc0ludGVnZXIsXG4gIE51bWJlcklzTmFOLFxuICBOdW1iZXJQYXJzZUludCxcbiAgT2JqZWN0RGVmaW5lUHJvcGVydGllcyxcbiAgT2JqZWN0S2V5cyxcbiAgT2JqZWN0U2V0UHJvdG90eXBlT2YsXG4gIFByb21pc2UsXG4gIFNhZmVTZXQsXG4gIFN5bWJvbEFzeW5jRGlzcG9zZSxcbiAgU3ltYm9sQXN5bmNJdGVyYXRvcixcbiAgU3ltYm9sXG59ID0gcmVxdWlyZSgnLi4vLi4vb3Vycy9wcmltb3JkaWFscycpXG5tb2R1bGUuZXhwb3J0cyA9IFJlYWRhYmxlXG5SZWFkYWJsZS5SZWFkYWJsZVN0YXRlID0gUmVhZGFibGVTdGF0ZVxuY29uc3QgeyBFdmVudEVtaXR0ZXI6IEVFIH0gPSByZXF1aXJlKCdldmVudHMnKVxuY29uc3QgeyBTdHJlYW0sIHByZXBlbmRMaXN0ZW5lciB9ID0gcmVxdWlyZSgnLi9sZWdhY3knKVxuY29uc3QgeyBCdWZmZXIgfSA9IHJlcXVpcmUoJ2J1ZmZlcicpXG5jb25zdCB7IGFkZEFib3J0U2lnbmFsIH0gPSByZXF1aXJlKCcuL2FkZC1hYm9ydC1zaWduYWwnKVxuY29uc3QgZW9zID0gcmVxdWlyZSgnLi9lbmQtb2Ytc3RyZWFtJylcbmxldCBkZWJ1ZyA9IHJlcXVpcmUoJy4uLy4uL291cnMvdXRpbCcpLmRlYnVnbG9nKCdzdHJlYW0nLCAoZm4pID0+IHtcbiAgZGVidWcgPSBmblxufSlcbmNvbnN0IEJ1ZmZlckxpc3QgPSByZXF1aXJlKCcuL2J1ZmZlcl9saXN0JylcbmNvbnN0IGRlc3Ryb3lJbXBsID0gcmVxdWlyZSgnLi9kZXN0cm95JylcbmNvbnN0IHsgZ2V0SGlnaFdhdGVyTWFyaywgZ2V0RGVmYXVsdEhpZ2hXYXRlck1hcmsgfSA9IHJlcXVpcmUoJy4vc3RhdGUnKVxuY29uc3Qge1xuICBhZ2dyZWdhdGVUd29FcnJvcnMsXG4gIGNvZGVzOiB7XG4gICAgRVJSX0lOVkFMSURfQVJHX1RZUEUsXG4gICAgRVJSX01FVEhPRF9OT1RfSU1QTEVNRU5URUQsXG4gICAgRVJSX09VVF9PRl9SQU5HRSxcbiAgICBFUlJfU1RSRUFNX1BVU0hfQUZURVJfRU9GLFxuICAgIEVSUl9TVFJFQU1fVU5TSElGVF9BRlRFUl9FTkRfRVZFTlRcbiAgfSxcbiAgQWJvcnRFcnJvclxufSA9IHJlcXVpcmUoJy4uLy4uL291cnMvZXJyb3JzJylcbmNvbnN0IHsgdmFsaWRhdGVPYmplY3QgfSA9IHJlcXVpcmUoJy4uL3ZhbGlkYXRvcnMnKVxuY29uc3Qga1BhdXNlZCA9IFN5bWJvbCgna1BhdXNlZCcpXG5jb25zdCB7IFN0cmluZ0RlY29kZXIgfSA9IHJlcXVpcmUoJ3N0cmluZ19kZWNvZGVyJylcbmNvbnN0IGZyb20gPSByZXF1aXJlKCcuL2Zyb20nKVxuT2JqZWN0U2V0UHJvdG90eXBlT2YoUmVhZGFibGUucHJvdG90eXBlLCBTdHJlYW0ucHJvdG90eXBlKVxuT2JqZWN0U2V0UHJvdG90eXBlT2YoUmVhZGFibGUsIFN0cmVhbSlcbmNvbnN0IG5vcCA9ICgpID0+IHt9XG5jb25zdCB7IGVycm9yT3JEZXN0cm95IH0gPSBkZXN0cm95SW1wbFxuY29uc3Qga09iamVjdE1vZGUgPSAxIDw8IDBcbmNvbnN0IGtFbmRlZCA9IDEgPDwgMVxuY29uc3Qga0VuZEVtaXR0ZWQgPSAxIDw8IDJcbmNvbnN0IGtSZWFkaW5nID0gMSA8PCAzXG5jb25zdCBrQ29uc3RydWN0ZWQgPSAxIDw8IDRcbmNvbnN0IGtTeW5jID0gMSA8PCA1XG5jb25zdCBrTmVlZFJlYWRhYmxlID0gMSA8PCA2XG5jb25zdCBrRW1pdHRlZFJlYWRhYmxlID0gMSA8PCA3XG5jb25zdCBrUmVhZGFibGVMaXN0ZW5pbmcgPSAxIDw8IDhcbmNvbnN0IGtSZXN1bWVTY2hlZHVsZWQgPSAxIDw8IDlcbmNvbnN0IGtFcnJvckVtaXR0ZWQgPSAxIDw8IDEwXG5jb25zdCBrRW1pdENsb3NlID0gMSA8PCAxMVxuY29uc3Qga0F1dG9EZXN0cm95ID0gMSA8PCAxMlxuY29uc3Qga0Rlc3Ryb3llZCA9IDEgPDwgMTNcbmNvbnN0IGtDbG9zZWQgPSAxIDw8IDE0XG5jb25zdCBrQ2xvc2VFbWl0dGVkID0gMSA8PCAxNVxuY29uc3Qga011bHRpQXdhaXREcmFpbiA9IDEgPDwgMTZcbmNvbnN0IGtSZWFkaW5nTW9yZSA9IDEgPDwgMTdcbmNvbnN0IGtEYXRhRW1pdHRlZCA9IDEgPDwgMThcblxuLy8gVE9ETyhiZW5qYW1pbmdyKSBpdCBpcyBsaWtlbHkgc2xvd2VyIHRvIGRvIGl0IHRoaXMgd2F5IHRoYW4gd2l0aCBmcmVlIGZ1bmN0aW9uc1xuZnVuY3Rpb24gbWFrZUJpdE1hcERlc2NyaXB0b3IoYml0KSB7XG4gIHJldHVybiB7XG4gICAgZW51bWVyYWJsZTogZmFsc2UsXG4gICAgZ2V0KCkge1xuICAgICAgcmV0dXJuICh0aGlzLnN0YXRlICYgYml0KSAhPT0gMFxuICAgIH0sXG4gICAgc2V0KHZhbHVlKSB7XG4gICAgICBpZiAodmFsdWUpIHRoaXMuc3RhdGUgfD0gYml0XG4gICAgICBlbHNlIHRoaXMuc3RhdGUgJj0gfmJpdFxuICAgIH1cbiAgfVxufVxuT2JqZWN0RGVmaW5lUHJvcGVydGllcyhSZWFkYWJsZVN0YXRlLnByb3RvdHlwZSwge1xuICBvYmplY3RNb2RlOiBtYWtlQml0TWFwRGVzY3JpcHRvcihrT2JqZWN0TW9kZSksXG4gIGVuZGVkOiBtYWtlQml0TWFwRGVzY3JpcHRvcihrRW5kZWQpLFxuICBlbmRFbWl0dGVkOiBtYWtlQml0TWFwRGVzY3JpcHRvcihrRW5kRW1pdHRlZCksXG4gIHJlYWRpbmc6IG1ha2VCaXRNYXBEZXNjcmlwdG9yKGtSZWFkaW5nKSxcbiAgLy8gU3RyZWFtIGlzIHN0aWxsIGJlaW5nIGNvbnN0cnVjdGVkIGFuZCBjYW5ub3QgYmVcbiAgLy8gZGVzdHJveWVkIHVudGlsIGNvbnN0cnVjdGlvbiBmaW5pc2hlZCBvciBmYWlsZWQuXG4gIC8vIEFzeW5jIGNvbnN0cnVjdGlvbiBpcyBvcHQgaW4sIHRoZXJlZm9yZSB3ZSBzdGFydCBhc1xuICAvLyBjb25zdHJ1Y3RlZC5cbiAgY29uc3RydWN0ZWQ6IG1ha2VCaXRNYXBEZXNjcmlwdG9yKGtDb25zdHJ1Y3RlZCksXG4gIC8vIEEgZmxhZyB0byBiZSBhYmxlIHRvIHRlbGwgaWYgdGhlIGV2ZW50ICdyZWFkYWJsZScvJ2RhdGEnIGlzIGVtaXR0ZWRcbiAgLy8gaW1tZWRpYXRlbHksIG9yIG9uIGEgbGF0ZXIgdGljay4gIFdlIHNldCB0aGlzIHRvIHRydWUgYXQgZmlyc3QsIGJlY2F1c2VcbiAgLy8gYW55IGFjdGlvbnMgdGhhdCBzaG91bGRuJ3QgaGFwcGVuIHVudGlsIFwibGF0ZXJcIiBzaG91bGQgZ2VuZXJhbGx5IGFsc29cbiAgLy8gbm90IGhhcHBlbiBiZWZvcmUgdGhlIGZpcnN0IHJlYWQgY2FsbC5cbiAgc3luYzogbWFrZUJpdE1hcERlc2NyaXB0b3Ioa1N5bmMpLFxuICAvLyBXaGVuZXZlciB3ZSByZXR1cm4gbnVsbCwgdGhlbiB3ZSBzZXQgYSBmbGFnIHRvIHNheVxuICAvLyB0aGF0IHdlJ3JlIGF3YWl0aW5nIGEgJ3JlYWRhYmxlJyBldmVudCBlbWlzc2lvbi5cbiAgbmVlZFJlYWRhYmxlOiBtYWtlQml0TWFwRGVzY3JpcHRvcihrTmVlZFJlYWRhYmxlKSxcbiAgZW1pdHRlZFJlYWRhYmxlOiBtYWtlQml0TWFwRGVzY3JpcHRvcihrRW1pdHRlZFJlYWRhYmxlKSxcbiAgcmVhZGFibGVMaXN0ZW5pbmc6IG1ha2VCaXRNYXBEZXNjcmlwdG9yKGtSZWFkYWJsZUxpc3RlbmluZyksXG4gIHJlc3VtZVNjaGVkdWxlZDogbWFrZUJpdE1hcERlc2NyaXB0b3Ioa1Jlc3VtZVNjaGVkdWxlZCksXG4gIC8vIFRydWUgaWYgdGhlIGVycm9yIHdhcyBhbHJlYWR5IGVtaXR0ZWQgYW5kIHNob3VsZCBub3QgYmUgdGhyb3duIGFnYWluLlxuICBlcnJvckVtaXR0ZWQ6IG1ha2VCaXRNYXBEZXNjcmlwdG9yKGtFcnJvckVtaXR0ZWQpLFxuICBlbWl0Q2xvc2U6IG1ha2VCaXRNYXBEZXNjcmlwdG9yKGtFbWl0Q2xvc2UpLFxuICBhdXRvRGVzdHJveTogbWFrZUJpdE1hcERlc2NyaXB0b3Ioa0F1dG9EZXN0cm95KSxcbiAgLy8gSGFzIGl0IGJlZW4gZGVzdHJveWVkLlxuICBkZXN0cm95ZWQ6IG1ha2VCaXRNYXBEZXNjcmlwdG9yKGtEZXN0cm95ZWQpLFxuICAvLyBJbmRpY2F0ZXMgd2hldGhlciB0aGUgc3RyZWFtIGhhcyBmaW5pc2hlZCBkZXN0cm95aW5nLlxuICBjbG9zZWQ6IG1ha2VCaXRNYXBEZXNjcmlwdG9yKGtDbG9zZWQpLFxuICAvLyBUcnVlIGlmIGNsb3NlIGhhcyBiZWVuIGVtaXR0ZWQgb3Igd291bGQgaGF2ZSBiZWVuIGVtaXR0ZWRcbiAgLy8gZGVwZW5kaW5nIG9uIGVtaXRDbG9zZS5cbiAgY2xvc2VFbWl0dGVkOiBtYWtlQml0TWFwRGVzY3JpcHRvcihrQ2xvc2VFbWl0dGVkKSxcbiAgbXVsdGlBd2FpdERyYWluOiBtYWtlQml0TWFwRGVzY3JpcHRvcihrTXVsdGlBd2FpdERyYWluKSxcbiAgLy8gSWYgdHJ1ZSwgYSBtYXliZVJlYWRNb3JlIGhhcyBiZWVuIHNjaGVkdWxlZC5cbiAgcmVhZGluZ01vcmU6IG1ha2VCaXRNYXBEZXNjcmlwdG9yKGtSZWFkaW5nTW9yZSksXG4gIGRhdGFFbWl0dGVkOiBtYWtlQml0TWFwRGVzY3JpcHRvcihrRGF0YUVtaXR0ZWQpXG59KVxuZnVuY3Rpb24gUmVhZGFibGVTdGF0ZShvcHRpb25zLCBzdHJlYW0sIGlzRHVwbGV4KSB7XG4gIC8vIER1cGxleCBzdHJlYW1zIGFyZSBib3RoIHJlYWRhYmxlIGFuZCB3cml0YWJsZSwgYnV0IHNoYXJlXG4gIC8vIHRoZSBzYW1lIG9wdGlvbnMgb2JqZWN0LlxuICAvLyBIb3dldmVyLCBzb21lIGNhc2VzIHJlcXVpcmUgc2V0dGluZyBvcHRpb25zIHRvIGRpZmZlcmVudFxuICAvLyB2YWx1ZXMgZm9yIHRoZSByZWFkYWJsZSBhbmQgdGhlIHdyaXRhYmxlIHNpZGVzIG9mIHRoZSBkdXBsZXggc3RyZWFtLlxuICAvLyBUaGVzZSBvcHRpb25zIGNhbiBiZSBwcm92aWRlZCBzZXBhcmF0ZWx5IGFzIHJlYWRhYmxlWFhYIGFuZCB3cml0YWJsZVhYWC5cbiAgaWYgKHR5cGVvZiBpc0R1cGxleCAhPT0gJ2Jvb2xlYW4nKSBpc0R1cGxleCA9IHN0cmVhbSBpbnN0YW5jZW9mIHJlcXVpcmUoJy4vZHVwbGV4JylcblxuICAvLyBCaXQgbWFwIGZpZWxkIHRvIHN0b3JlIFJlYWRhYmxlU3RhdGUgbW9yZSBlZmZjaWVudGx5IHdpdGggMSBiaXQgcGVyIGZpZWxkXG4gIC8vIGluc3RlYWQgb2YgYSBWOCBzbG90IHBlciBmaWVsZC5cbiAgdGhpcy5zdGF0ZSA9IGtFbWl0Q2xvc2UgfCBrQXV0b0Rlc3Ryb3kgfCBrQ29uc3RydWN0ZWQgfCBrU3luY1xuICAvLyBPYmplY3Qgc3RyZWFtIGZsYWcuIFVzZWQgdG8gbWFrZSByZWFkKG4pIGlnbm9yZSBuIGFuZCB0b1xuICAvLyBtYWtlIGFsbCB0aGUgYnVmZmVyIG1lcmdpbmcgYW5kIGxlbmd0aCBjaGVja3MgZ28gYXdheS5cbiAgaWYgKG9wdGlvbnMgJiYgb3B0aW9ucy5vYmplY3RNb2RlKSB0aGlzLnN0YXRlIHw9IGtPYmplY3RNb2RlXG4gIGlmIChpc0R1cGxleCAmJiBvcHRpb25zICYmIG9wdGlvbnMucmVhZGFibGVPYmplY3RNb2RlKSB0aGlzLnN0YXRlIHw9IGtPYmplY3RNb2RlXG5cbiAgLy8gVGhlIHBvaW50IGF0IHdoaWNoIGl0IHN0b3BzIGNhbGxpbmcgX3JlYWQoKSB0byBmaWxsIHRoZSBidWZmZXJcbiAgLy8gTm90ZTogMCBpcyBhIHZhbGlkIHZhbHVlLCBtZWFucyBcImRvbid0IGNhbGwgX3JlYWQgcHJlZW1wdGl2ZWx5IGV2ZXJcIlxuICB0aGlzLmhpZ2hXYXRlck1hcmsgPSBvcHRpb25zXG4gICAgPyBnZXRIaWdoV2F0ZXJNYXJrKHRoaXMsIG9wdGlvbnMsICdyZWFkYWJsZUhpZ2hXYXRlck1hcmsnLCBpc0R1cGxleClcbiAgICA6IGdldERlZmF1bHRIaWdoV2F0ZXJNYXJrKGZhbHNlKVxuXG4gIC8vIEEgbGlua2VkIGxpc3QgaXMgdXNlZCB0byBzdG9yZSBkYXRhIGNodW5rcyBpbnN0ZWFkIG9mIGFuIGFycmF5IGJlY2F1c2UgdGhlXG4gIC8vIGxpbmtlZCBsaXN0IGNhbiByZW1vdmUgZWxlbWVudHMgZnJvbSB0aGUgYmVnaW5uaW5nIGZhc3RlciB0aGFuXG4gIC8vIGFycmF5LnNoaWZ0KCkuXG4gIHRoaXMuYnVmZmVyID0gbmV3IEJ1ZmZlckxpc3QoKVxuICB0aGlzLmxlbmd0aCA9IDBcbiAgdGhpcy5waXBlcyA9IFtdXG4gIHRoaXMuZmxvd2luZyA9IG51bGxcbiAgdGhpc1trUGF1c2VkXSA9IG51bGxcblxuICAvLyBTaG91bGQgY2xvc2UgYmUgZW1pdHRlZCBvbiBkZXN0cm95LiBEZWZhdWx0cyB0byB0cnVlLlxuICBpZiAob3B0aW9ucyAmJiBvcHRpb25zLmVtaXRDbG9zZSA9PT0gZmFsc2UpIHRoaXMuc3RhdGUgJj0gfmtFbWl0Q2xvc2VcblxuICAvLyBTaG91bGQgLmRlc3Ryb3koKSBiZSBjYWxsZWQgYWZ0ZXIgJ2VuZCcgKGFuZCBwb3RlbnRpYWxseSAnZmluaXNoJykuXG4gIGlmIChvcHRpb25zICYmIG9wdGlvbnMuYXV0b0Rlc3Ryb3kgPT09IGZhbHNlKSB0aGlzLnN0YXRlICY9IH5rQXV0b0Rlc3Ryb3lcblxuICAvLyBJbmRpY2F0ZXMgd2hldGhlciB0aGUgc3RyZWFtIGhhcyBlcnJvcmVkLiBXaGVuIHRydWUgbm8gZnVydGhlclxuICAvLyBfcmVhZCBjYWxscywgJ2RhdGEnIG9yICdyZWFkYWJsZScgZXZlbnRzIHNob3VsZCBvY2N1ci4gVGhpcyBpcyBuZWVkZWRcbiAgLy8gc2luY2Ugd2hlbiBhdXRvRGVzdHJveSBpcyBkaXNhYmxlZCB3ZSBuZWVkIGEgd2F5IHRvIHRlbGwgd2hldGhlciB0aGVcbiAgLy8gc3RyZWFtIGhhcyBmYWlsZWQuXG4gIHRoaXMuZXJyb3JlZCA9IG51bGxcblxuICAvLyBDcnlwdG8gaXMga2luZCBvZiBvbGQgYW5kIGNydXN0eS4gIEhpc3RvcmljYWxseSwgaXRzIGRlZmF1bHQgc3RyaW5nXG4gIC8vIGVuY29kaW5nIGlzICdiaW5hcnknIHNvIHdlIGhhdmUgdG8gbWFrZSB0aGlzIGNvbmZpZ3VyYWJsZS5cbiAgLy8gRXZlcnl0aGluZyBlbHNlIGluIHRoZSB1bml2ZXJzZSB1c2VzICd1dGY4JywgdGhvdWdoLlxuICB0aGlzLmRlZmF1bHRFbmNvZGluZyA9IChvcHRpb25zICYmIG9wdGlvbnMuZGVmYXVsdEVuY29kaW5nKSB8fCAndXRmOCdcblxuICAvLyBSZWYgdGhlIHBpcGVkIGRlc3Qgd2hpY2ggd2UgbmVlZCBhIGRyYWluIGV2ZW50IG9uIGl0XG4gIC8vIHR5cGU6IG51bGwgfCBXcml0YWJsZSB8IFNldDxXcml0YWJsZT4uXG4gIHRoaXMuYXdhaXREcmFpbldyaXRlcnMgPSBudWxsXG4gIHRoaXMuZGVjb2RlciA9IG51bGxcbiAgdGhpcy5lbmNvZGluZyA9IG51bGxcbiAgaWYgKG9wdGlvbnMgJiYgb3B0aW9ucy5lbmNvZGluZykge1xuICAgIHRoaXMuZGVjb2RlciA9IG5ldyBTdHJpbmdEZWNvZGVyKG9wdGlvbnMuZW5jb2RpbmcpXG4gICAgdGhpcy5lbmNvZGluZyA9IG9wdGlvbnMuZW5jb2RpbmdcbiAgfVxufVxuZnVuY3Rpb24gUmVhZGFibGUob3B0aW9ucykge1xuICBpZiAoISh0aGlzIGluc3RhbmNlb2YgUmVhZGFibGUpKSByZXR1cm4gbmV3IFJlYWRhYmxlKG9wdGlvbnMpXG5cbiAgLy8gQ2hlY2tpbmcgZm9yIGEgU3RyZWFtLkR1cGxleCBpbnN0YW5jZSBpcyBmYXN0ZXIgaGVyZSBpbnN0ZWFkIG9mIGluc2lkZVxuICAvLyB0aGUgUmVhZGFibGVTdGF0ZSBjb25zdHJ1Y3RvciwgYXQgbGVhc3Qgd2l0aCBWOCA2LjUuXG4gIGNvbnN0IGlzRHVwbGV4ID0gdGhpcyBpbnN0YW5jZW9mIHJlcXVpcmUoJy4vZHVwbGV4JylcbiAgdGhpcy5fcmVhZGFibGVTdGF0ZSA9IG5ldyBSZWFkYWJsZVN0YXRlKG9wdGlvbnMsIHRoaXMsIGlzRHVwbGV4KVxuICBpZiAob3B0aW9ucykge1xuICAgIGlmICh0eXBlb2Ygb3B0aW9ucy5yZWFkID09PSAnZnVuY3Rpb24nKSB0aGlzLl9yZWFkID0gb3B0aW9ucy5yZWFkXG4gICAgaWYgKHR5cGVvZiBvcHRpb25zLmRlc3Ryb3kgPT09ICdmdW5jdGlvbicpIHRoaXMuX2Rlc3Ryb3kgPSBvcHRpb25zLmRlc3Ryb3lcbiAgICBpZiAodHlwZW9mIG9wdGlvbnMuY29uc3RydWN0ID09PSAnZnVuY3Rpb24nKSB0aGlzLl9jb25zdHJ1Y3QgPSBvcHRpb25zLmNvbnN0cnVjdFxuICAgIGlmIChvcHRpb25zLnNpZ25hbCAmJiAhaXNEdXBsZXgpIGFkZEFib3J0U2lnbmFsKG9wdGlvbnMuc2lnbmFsLCB0aGlzKVxuICB9XG4gIFN0cmVhbS5jYWxsKHRoaXMsIG9wdGlvbnMpXG4gIGRlc3Ryb3lJbXBsLmNvbnN0cnVjdCh0aGlzLCAoKSA9PiB7XG4gICAgaWYgKHRoaXMuX3JlYWRhYmxlU3RhdGUubmVlZFJlYWRhYmxlKSB7XG4gICAgICBtYXliZVJlYWRNb3JlKHRoaXMsIHRoaXMuX3JlYWRhYmxlU3RhdGUpXG4gICAgfVxuICB9KVxufVxuUmVhZGFibGUucHJvdG90eXBlLmRlc3Ryb3kgPSBkZXN0cm95SW1wbC5kZXN0cm95XG5SZWFkYWJsZS5wcm90b3R5cGUuX3VuZGVzdHJveSA9IGRlc3Ryb3lJbXBsLnVuZGVzdHJveVxuUmVhZGFibGUucHJvdG90eXBlLl9kZXN0cm95ID0gZnVuY3Rpb24gKGVyciwgY2IpIHtcbiAgY2IoZXJyKVxufVxuUmVhZGFibGUucHJvdG90eXBlW0VFLmNhcHR1cmVSZWplY3Rpb25TeW1ib2xdID0gZnVuY3Rpb24gKGVycikge1xuICB0aGlzLmRlc3Ryb3koZXJyKVxufVxuUmVhZGFibGUucHJvdG90eXBlW1N5bWJvbEFzeW5jRGlzcG9zZV0gPSBmdW5jdGlvbiAoKSB7XG4gIGxldCBlcnJvclxuICBpZiAoIXRoaXMuZGVzdHJveWVkKSB7XG4gICAgZXJyb3IgPSB0aGlzLnJlYWRhYmxlRW5kZWQgPyBudWxsIDogbmV3IEFib3J0RXJyb3IoKVxuICAgIHRoaXMuZGVzdHJveShlcnJvcilcbiAgfVxuICByZXR1cm4gbmV3IFByb21pc2UoKHJlc29sdmUsIHJlamVjdCkgPT4gZW9zKHRoaXMsIChlcnIpID0+IChlcnIgJiYgZXJyICE9PSBlcnJvciA/IHJlamVjdChlcnIpIDogcmVzb2x2ZShudWxsKSkpKVxufVxuXG4vLyBNYW51YWxseSBzaG92ZSBzb21ldGhpbmcgaW50byB0aGUgcmVhZCgpIGJ1ZmZlci5cbi8vIFRoaXMgcmV0dXJucyB0cnVlIGlmIHRoZSBoaWdoV2F0ZXJNYXJrIGhhcyBub3QgYmVlbiBoaXQgeWV0LFxuLy8gc2ltaWxhciB0byBob3cgV3JpdGFibGUud3JpdGUoKSByZXR1cm5zIHRydWUgaWYgeW91IHNob3VsZFxuLy8gd3JpdGUoKSBzb21lIG1vcmUuXG5SZWFkYWJsZS5wcm90b3R5cGUucHVzaCA9IGZ1bmN0aW9uIChjaHVuaywgZW5jb2RpbmcpIHtcbiAgcmV0dXJuIHJlYWRhYmxlQWRkQ2h1bmsodGhpcywgY2h1bmssIGVuY29kaW5nLCBmYWxzZSlcbn1cblxuLy8gVW5zaGlmdCBzaG91bGQgKmFsd2F5cyogYmUgc29tZXRoaW5nIGRpcmVjdGx5IG91dCBvZiByZWFkKCkuXG5SZWFkYWJsZS5wcm90b3R5cGUudW5zaGlmdCA9IGZ1bmN0aW9uIChjaHVuaywgZW5jb2RpbmcpIHtcbiAgcmV0dXJuIHJlYWRhYmxlQWRkQ2h1bmsodGhpcywgY2h1bmssIGVuY29kaW5nLCB0cnVlKVxufVxuZnVuY3Rpb24gcmVhZGFibGVBZGRDaHVuayhzdHJlYW0sIGNodW5rLCBlbmNvZGluZywgYWRkVG9Gcm9udCkge1xuICBkZWJ1ZygncmVhZGFibGVBZGRDaHVuaycsIGNodW5rKVxuICBjb25zdCBzdGF0ZSA9IHN0cmVhbS5fcmVhZGFibGVTdGF0ZVxuICBsZXQgZXJyXG4gIGlmICgoc3RhdGUuc3RhdGUgJiBrT2JqZWN0TW9kZSkgPT09IDApIHtcbiAgICBpZiAodHlwZW9mIGNodW5rID09PSAnc3RyaW5nJykge1xuICAgICAgZW5jb2RpbmcgPSBlbmNvZGluZyB8fCBzdGF0ZS5kZWZhdWx0RW5jb2RpbmdcbiAgICAgIGlmIChzdGF0ZS5lbmNvZGluZyAhPT0gZW5jb2RpbmcpIHtcbiAgICAgICAgaWYgKGFkZFRvRnJvbnQgJiYgc3RhdGUuZW5jb2RpbmcpIHtcbiAgICAgICAgICAvLyBXaGVuIHVuc2hpZnRpbmcsIGlmIHN0YXRlLmVuY29kaW5nIGlzIHNldCwgd2UgaGF2ZSB0byBzYXZlXG4gICAgICAgICAgLy8gdGhlIHN0cmluZyBpbiB0aGUgQnVmZmVyTGlzdCB3aXRoIHRoZSBzdGF0ZSBlbmNvZGluZy5cbiAgICAgICAgICBjaHVuayA9IEJ1ZmZlci5mcm9tKGNodW5rLCBlbmNvZGluZykudG9TdHJpbmcoc3RhdGUuZW5jb2RpbmcpXG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgY2h1bmsgPSBCdWZmZXIuZnJvbShjaHVuaywgZW5jb2RpbmcpXG4gICAgICAgICAgZW5jb2RpbmcgPSAnJ1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfSBlbHNlIGlmIChjaHVuayBpbnN0YW5jZW9mIEJ1ZmZlcikge1xuICAgICAgZW5jb2RpbmcgPSAnJ1xuICAgIH0gZWxzZSBpZiAoU3RyZWFtLl9pc1VpbnQ4QXJyYXkoY2h1bmspKSB7XG4gICAgICBjaHVuayA9IFN0cmVhbS5fdWludDhBcnJheVRvQnVmZmVyKGNodW5rKVxuICAgICAgZW5jb2RpbmcgPSAnJ1xuICAgIH0gZWxzZSBpZiAoY2h1bmsgIT0gbnVsbCkge1xuICAgICAgZXJyID0gbmV3IEVSUl9JTlZBTElEX0FSR19UWVBFKCdjaHVuaycsIFsnc3RyaW5nJywgJ0J1ZmZlcicsICdVaW50OEFycmF5J10sIGNodW5rKVxuICAgIH1cbiAgfVxuICBpZiAoZXJyKSB7XG4gICAgZXJyb3JPckRlc3Ryb3koc3RyZWFtLCBlcnIpXG4gIH0gZWxzZSBpZiAoY2h1bmsgPT09IG51bGwpIHtcbiAgICBzdGF0ZS5zdGF0ZSAmPSB+a1JlYWRpbmdcbiAgICBvbkVvZkNodW5rKHN0cmVhbSwgc3RhdGUpXG4gIH0gZWxzZSBpZiAoKHN0YXRlLnN0YXRlICYga09iamVjdE1vZGUpICE9PSAwIHx8IChjaHVuayAmJiBjaHVuay5sZW5ndGggPiAwKSkge1xuICAgIGlmIChhZGRUb0Zyb250KSB7XG4gICAgICBpZiAoKHN0YXRlLnN0YXRlICYga0VuZEVtaXR0ZWQpICE9PSAwKSBlcnJvck9yRGVzdHJveShzdHJlYW0sIG5ldyBFUlJfU1RSRUFNX1VOU0hJRlRfQUZURVJfRU5EX0VWRU5UKCkpXG4gICAgICBlbHNlIGlmIChzdGF0ZS5kZXN0cm95ZWQgfHwgc3RhdGUuZXJyb3JlZCkgcmV0dXJuIGZhbHNlXG4gICAgICBlbHNlIGFkZENodW5rKHN0cmVhbSwgc3RhdGUsIGNodW5rLCB0cnVlKVxuICAgIH0gZWxzZSBpZiAoc3RhdGUuZW5kZWQpIHtcbiAgICAgIGVycm9yT3JEZXN0cm95KHN0cmVhbSwgbmV3IEVSUl9TVFJFQU1fUFVTSF9BRlRFUl9FT0YoKSlcbiAgICB9IGVsc2UgaWYgKHN0YXRlLmRlc3Ryb3llZCB8fCBzdGF0ZS5lcnJvcmVkKSB7XG4gICAgICByZXR1cm4gZmFsc2VcbiAgICB9IGVsc2Uge1xuICAgICAgc3RhdGUuc3RhdGUgJj0gfmtSZWFkaW5nXG4gICAgICBpZiAoc3RhdGUuZGVjb2RlciAmJiAhZW5jb2RpbmcpIHtcbiAgICAgICAgY2h1bmsgPSBzdGF0ZS5kZWNvZGVyLndyaXRlKGNodW5rKVxuICAgICAgICBpZiAoc3RhdGUub2JqZWN0TW9kZSB8fCBjaHVuay5sZW5ndGggIT09IDApIGFkZENodW5rKHN0cmVhbSwgc3RhdGUsIGNodW5rLCBmYWxzZSlcbiAgICAgICAgZWxzZSBtYXliZVJlYWRNb3JlKHN0cmVhbSwgc3RhdGUpXG4gICAgICB9IGVsc2Uge1xuICAgICAgICBhZGRDaHVuayhzdHJlYW0sIHN0YXRlLCBjaHVuaywgZmFsc2UpXG4gICAgICB9XG4gICAgfVxuICB9IGVsc2UgaWYgKCFhZGRUb0Zyb250KSB7XG4gICAgc3RhdGUuc3RhdGUgJj0gfmtSZWFkaW5nXG4gICAgbWF5YmVSZWFkTW9yZShzdHJlYW0sIHN0YXRlKVxuICB9XG5cbiAgLy8gV2UgY2FuIHB1c2ggbW9yZSBkYXRhIGlmIHdlIGFyZSBiZWxvdyB0aGUgaGlnaFdhdGVyTWFyay5cbiAgLy8gQWxzbywgaWYgd2UgaGF2ZSBubyBkYXRhIHlldCwgd2UgY2FuIHN0YW5kIHNvbWUgbW9yZSBieXRlcy5cbiAgLy8gVGhpcyBpcyB0byB3b3JrIGFyb3VuZCBjYXNlcyB3aGVyZSBod209MCwgc3VjaCBhcyB0aGUgcmVwbC5cbiAgcmV0dXJuICFzdGF0ZS5lbmRlZCAmJiAoc3RhdGUubGVuZ3RoIDwgc3RhdGUuaGlnaFdhdGVyTWFyayB8fCBzdGF0ZS5sZW5ndGggPT09IDApXG59XG5mdW5jdGlvbiBhZGRDaHVuayhzdHJlYW0sIHN0YXRlLCBjaHVuaywgYWRkVG9Gcm9udCkge1xuICBpZiAoc3RhdGUuZmxvd2luZyAmJiBzdGF0ZS5sZW5ndGggPT09IDAgJiYgIXN0YXRlLnN5bmMgJiYgc3RyZWFtLmxpc3RlbmVyQ291bnQoJ2RhdGEnKSA+IDApIHtcbiAgICAvLyBVc2UgdGhlIGd1YXJkIHRvIGF2b2lkIGNyZWF0aW5nIGBTZXQoKWAgcmVwZWF0ZWRseVxuICAgIC8vIHdoZW4gd2UgaGF2ZSBtdWx0aXBsZSBwaXBlcy5cbiAgICBpZiAoKHN0YXRlLnN0YXRlICYga011bHRpQXdhaXREcmFpbikgIT09IDApIHtcbiAgICAgIHN0YXRlLmF3YWl0RHJhaW5Xcml0ZXJzLmNsZWFyKClcbiAgICB9IGVsc2Uge1xuICAgICAgc3RhdGUuYXdhaXREcmFpbldyaXRlcnMgPSBudWxsXG4gICAgfVxuICAgIHN0YXRlLmRhdGFFbWl0dGVkID0gdHJ1ZVxuICAgIHN0cmVhbS5lbWl0KCdkYXRhJywgY2h1bmspXG4gIH0gZWxzZSB7XG4gICAgLy8gVXBkYXRlIHRoZSBidWZmZXIgaW5mby5cbiAgICBzdGF0ZS5sZW5ndGggKz0gc3RhdGUub2JqZWN0TW9kZSA/IDEgOiBjaHVuay5sZW5ndGhcbiAgICBpZiAoYWRkVG9Gcm9udCkgc3RhdGUuYnVmZmVyLnVuc2hpZnQoY2h1bmspXG4gICAgZWxzZSBzdGF0ZS5idWZmZXIucHVzaChjaHVuaylcbiAgICBpZiAoKHN0YXRlLnN0YXRlICYga05lZWRSZWFkYWJsZSkgIT09IDApIGVtaXRSZWFkYWJsZShzdHJlYW0pXG4gIH1cbiAgbWF5YmVSZWFkTW9yZShzdHJlYW0sIHN0YXRlKVxufVxuUmVhZGFibGUucHJvdG90eXBlLmlzUGF1c2VkID0gZnVuY3Rpb24gKCkge1xuICBjb25zdCBzdGF0ZSA9IHRoaXMuX3JlYWRhYmxlU3RhdGVcbiAgcmV0dXJuIHN0YXRlW2tQYXVzZWRdID09PSB0cnVlIHx8IHN0YXRlLmZsb3dpbmcgPT09IGZhbHNlXG59XG5cbi8vIEJhY2t3YXJkcyBjb21wYXRpYmlsaXR5LlxuUmVhZGFibGUucHJvdG90eXBlLnNldEVuY29kaW5nID0gZnVuY3Rpb24gKGVuYykge1xuICBjb25zdCBkZWNvZGVyID0gbmV3IFN0cmluZ0RlY29kZXIoZW5jKVxuICB0aGlzLl9yZWFkYWJsZVN0YXRlLmRlY29kZXIgPSBkZWNvZGVyXG4gIC8vIElmIHNldEVuY29kaW5nKG51bGwpLCBkZWNvZGVyLmVuY29kaW5nIGVxdWFscyB1dGY4LlxuICB0aGlzLl9yZWFkYWJsZVN0YXRlLmVuY29kaW5nID0gdGhpcy5fcmVhZGFibGVTdGF0ZS5kZWNvZGVyLmVuY29kaW5nXG4gIGNvbnN0IGJ1ZmZlciA9IHRoaXMuX3JlYWRhYmxlU3RhdGUuYnVmZmVyXG4gIC8vIEl0ZXJhdGUgb3ZlciBjdXJyZW50IGJ1ZmZlciB0byBjb252ZXJ0IGFscmVhZHkgc3RvcmVkIEJ1ZmZlcnM6XG4gIGxldCBjb250ZW50ID0gJydcbiAgZm9yIChjb25zdCBkYXRhIG9mIGJ1ZmZlcikge1xuICAgIGNvbnRlbnQgKz0gZGVjb2Rlci53cml0ZShkYXRhKVxuICB9XG4gIGJ1ZmZlci5jbGVhcigpXG4gIGlmIChjb250ZW50ICE9PSAnJykgYnVmZmVyLnB1c2goY29udGVudClcbiAgdGhpcy5fcmVhZGFibGVTdGF0ZS5sZW5ndGggPSBjb250ZW50Lmxlbmd0aFxuICByZXR1cm4gdGhpc1xufVxuXG4vLyBEb24ndCByYWlzZSB0aGUgaHdtID4gMUdCLlxuY29uc3QgTUFYX0hXTSA9IDB4NDAwMDAwMDBcbmZ1bmN0aW9uIGNvbXB1dGVOZXdIaWdoV2F0ZXJNYXJrKG4pIHtcbiAgaWYgKG4gPiBNQVhfSFdNKSB7XG4gICAgdGhyb3cgbmV3IEVSUl9PVVRfT0ZfUkFOR0UoJ3NpemUnLCAnPD0gMUdpQicsIG4pXG4gIH0gZWxzZSB7XG4gICAgLy8gR2V0IHRoZSBuZXh0IGhpZ2hlc3QgcG93ZXIgb2YgMiB0byBwcmV2ZW50IGluY3JlYXNpbmcgaHdtIGV4Y2Vzc2l2ZWx5IGluXG4gICAgLy8gdGlueSBhbW91bnRzLlxuICAgIG4tLVxuICAgIG4gfD0gbiA+Pj4gMVxuICAgIG4gfD0gbiA+Pj4gMlxuICAgIG4gfD0gbiA+Pj4gNFxuICAgIG4gfD0gbiA+Pj4gOFxuICAgIG4gfD0gbiA+Pj4gMTZcbiAgICBuKytcbiAgfVxuICByZXR1cm4gblxufVxuXG4vLyBUaGlzIGZ1bmN0aW9uIGlzIGRlc2lnbmVkIHRvIGJlIGlubGluYWJsZSwgc28gcGxlYXNlIHRha2UgY2FyZSB3aGVuIG1ha2luZ1xuLy8gY2hhbmdlcyB0byB0aGUgZnVuY3Rpb24gYm9keS5cbmZ1bmN0aW9uIGhvd011Y2hUb1JlYWQobiwgc3RhdGUpIHtcbiAgaWYgKG4gPD0gMCB8fCAoc3RhdGUubGVuZ3RoID09PSAwICYmIHN0YXRlLmVuZGVkKSkgcmV0dXJuIDBcbiAgaWYgKChzdGF0ZS5zdGF0ZSAmIGtPYmplY3RNb2RlKSAhPT0gMCkgcmV0dXJuIDFcbiAgaWYgKE51bWJlcklzTmFOKG4pKSB7XG4gICAgLy8gT25seSBmbG93IG9uZSBidWZmZXIgYXQgYSB0aW1lLlxuICAgIGlmIChzdGF0ZS5mbG93aW5nICYmIHN0YXRlLmxlbmd0aCkgcmV0dXJuIHN0YXRlLmJ1ZmZlci5maXJzdCgpLmxlbmd0aFxuICAgIHJldHVybiBzdGF0ZS5sZW5ndGhcbiAgfVxuICBpZiAobiA8PSBzdGF0ZS5sZW5ndGgpIHJldHVybiBuXG4gIHJldHVybiBzdGF0ZS5lbmRlZCA/IHN0YXRlLmxlbmd0aCA6IDBcbn1cblxuLy8gWW91IGNhbiBvdmVycmlkZSBlaXRoZXIgdGhpcyBtZXRob2QsIG9yIHRoZSBhc3luYyBfcmVhZChuKSBiZWxvdy5cblJlYWRhYmxlLnByb3RvdHlwZS5yZWFkID0gZnVuY3Rpb24gKG4pIHtcbiAgZGVidWcoJ3JlYWQnLCBuKVxuICAvLyBTYW1lIGFzIHBhcnNlSW50KHVuZGVmaW5lZCwgMTApLCBob3dldmVyIFY4IDcuMyBwZXJmb3JtYW5jZSByZWdyZXNzZWRcbiAgLy8gaW4gdGhpcyBzY2VuYXJpbywgc28gd2UgYXJlIGRvaW5nIGl0IG1hbnVhbGx5LlxuICBpZiAobiA9PT0gdW5kZWZpbmVkKSB7XG4gICAgbiA9IE5hTlxuICB9IGVsc2UgaWYgKCFOdW1iZXJJc0ludGVnZXIobikpIHtcbiAgICBuID0gTnVtYmVyUGFyc2VJbnQobiwgMTApXG4gIH1cbiAgY29uc3Qgc3RhdGUgPSB0aGlzLl9yZWFkYWJsZVN0YXRlXG4gIGNvbnN0IG5PcmlnID0gblxuXG4gIC8vIElmIHdlJ3JlIGFza2luZyBmb3IgbW9yZSB0aGFuIHRoZSBjdXJyZW50IGh3bSwgdGhlbiByYWlzZSB0aGUgaHdtLlxuICBpZiAobiA+IHN0YXRlLmhpZ2hXYXRlck1hcmspIHN0YXRlLmhpZ2hXYXRlck1hcmsgPSBjb21wdXRlTmV3SGlnaFdhdGVyTWFyayhuKVxuICBpZiAobiAhPT0gMCkgc3RhdGUuc3RhdGUgJj0gfmtFbWl0dGVkUmVhZGFibGVcblxuICAvLyBJZiB3ZSdyZSBkb2luZyByZWFkKDApIHRvIHRyaWdnZXIgYSByZWFkYWJsZSBldmVudCwgYnV0IHdlXG4gIC8vIGFscmVhZHkgaGF2ZSBhIGJ1bmNoIG9mIGRhdGEgaW4gdGhlIGJ1ZmZlciwgdGhlbiBqdXN0IHRyaWdnZXJcbiAgLy8gdGhlICdyZWFkYWJsZScgZXZlbnQgYW5kIG1vdmUgb24uXG4gIGlmIChcbiAgICBuID09PSAwICYmXG4gICAgc3RhdGUubmVlZFJlYWRhYmxlICYmXG4gICAgKChzdGF0ZS5oaWdoV2F0ZXJNYXJrICE9PSAwID8gc3RhdGUubGVuZ3RoID49IHN0YXRlLmhpZ2hXYXRlck1hcmsgOiBzdGF0ZS5sZW5ndGggPiAwKSB8fCBzdGF0ZS5lbmRlZClcbiAgKSB7XG4gICAgZGVidWcoJ3JlYWQ6IGVtaXRSZWFkYWJsZScsIHN0YXRlLmxlbmd0aCwgc3RhdGUuZW5kZWQpXG4gICAgaWYgKHN0YXRlLmxlbmd0aCA9PT0gMCAmJiBzdGF0ZS5lbmRlZCkgZW5kUmVhZGFibGUodGhpcylcbiAgICBlbHNlIGVtaXRSZWFkYWJsZSh0aGlzKVxuICAgIHJldHVybiBudWxsXG4gIH1cbiAgbiA9IGhvd011Y2hUb1JlYWQobiwgc3RhdGUpXG5cbiAgLy8gSWYgd2UndmUgZW5kZWQsIGFuZCB3ZSdyZSBub3cgY2xlYXIsIHRoZW4gZmluaXNoIGl0IHVwLlxuICBpZiAobiA9PT0gMCAmJiBzdGF0ZS5lbmRlZCkge1xuICAgIGlmIChzdGF0ZS5sZW5ndGggPT09IDApIGVuZFJlYWRhYmxlKHRoaXMpXG4gICAgcmV0dXJuIG51bGxcbiAgfVxuXG4gIC8vIEFsbCB0aGUgYWN0dWFsIGNodW5rIGdlbmVyYXRpb24gbG9naWMgbmVlZHMgdG8gYmVcbiAgLy8gKmJlbG93KiB0aGUgY2FsbCB0byBfcmVhZC4gIFRoZSByZWFzb24gaXMgdGhhdCBpbiBjZXJ0YWluXG4gIC8vIHN5bnRoZXRpYyBzdHJlYW0gY2FzZXMsIHN1Y2ggYXMgcGFzc3Rocm91Z2ggc3RyZWFtcywgX3JlYWRcbiAgLy8gbWF5IGJlIGEgY29tcGxldGVseSBzeW5jaHJvbm91cyBvcGVyYXRpb24gd2hpY2ggbWF5IGNoYW5nZVxuICAvLyB0aGUgc3RhdGUgb2YgdGhlIHJlYWQgYnVmZmVyLCBwcm92aWRpbmcgZW5vdWdoIGRhdGEgd2hlblxuICAvLyBiZWZvcmUgdGhlcmUgd2FzICpub3QqIGVub3VnaC5cbiAgLy9cbiAgLy8gU28sIHRoZSBzdGVwcyBhcmU6XG4gIC8vIDEuIEZpZ3VyZSBvdXQgd2hhdCB0aGUgc3RhdGUgb2YgdGhpbmdzIHdpbGwgYmUgYWZ0ZXIgd2UgZG9cbiAgLy8gYSByZWFkIGZyb20gdGhlIGJ1ZmZlci5cbiAgLy9cbiAgLy8gMi4gSWYgdGhhdCByZXN1bHRpbmcgc3RhdGUgd2lsbCB0cmlnZ2VyIGEgX3JlYWQsIHRoZW4gY2FsbCBfcmVhZC5cbiAgLy8gTm90ZSB0aGF0IHRoaXMgbWF5IGJlIGFzeW5jaHJvbm91cywgb3Igc3luY2hyb25vdXMuICBZZXMsIGl0IGlzXG4gIC8vIGRlZXBseSB1Z2x5IHRvIHdyaXRlIEFQSXMgdGhpcyB3YXksIGJ1dCB0aGF0IHN0aWxsIGRvZXNuJ3QgbWVhblxuICAvLyB0aGF0IHRoZSBSZWFkYWJsZSBjbGFzcyBzaG91bGQgYmVoYXZlIGltcHJvcGVybHksIGFzIHN0cmVhbXMgYXJlXG4gIC8vIGRlc2lnbmVkIHRvIGJlIHN5bmMvYXN5bmMgYWdub3N0aWMuXG4gIC8vIFRha2Ugbm90ZSBpZiB0aGUgX3JlYWQgY2FsbCBpcyBzeW5jIG9yIGFzeW5jIChpZSwgaWYgdGhlIHJlYWQgY2FsbFxuICAvLyBoYXMgcmV0dXJuZWQgeWV0KSwgc28gdGhhdCB3ZSBrbm93IHdoZXRoZXIgb3Igbm90IGl0J3Mgc2FmZSB0byBlbWl0XG4gIC8vICdyZWFkYWJsZScgZXRjLlxuICAvL1xuICAvLyAzLiBBY3R1YWxseSBwdWxsIHRoZSByZXF1ZXN0ZWQgY2h1bmtzIG91dCBvZiB0aGUgYnVmZmVyIGFuZCByZXR1cm4uXG5cbiAgLy8gaWYgd2UgbmVlZCBhIHJlYWRhYmxlIGV2ZW50LCB0aGVuIHdlIG5lZWQgdG8gZG8gc29tZSByZWFkaW5nLlxuICBsZXQgZG9SZWFkID0gKHN0YXRlLnN0YXRlICYga05lZWRSZWFkYWJsZSkgIT09IDBcbiAgZGVidWcoJ25lZWQgcmVhZGFibGUnLCBkb1JlYWQpXG5cbiAgLy8gSWYgd2UgY3VycmVudGx5IGhhdmUgbGVzcyB0aGFuIHRoZSBoaWdoV2F0ZXJNYXJrLCB0aGVuIGFsc28gcmVhZCBzb21lLlxuICBpZiAoc3RhdGUubGVuZ3RoID09PSAwIHx8IHN0YXRlLmxlbmd0aCAtIG4gPCBzdGF0ZS5oaWdoV2F0ZXJNYXJrKSB7XG4gICAgZG9SZWFkID0gdHJ1ZVxuICAgIGRlYnVnKCdsZW5ndGggbGVzcyB0aGFuIHdhdGVybWFyaycsIGRvUmVhZClcbiAgfVxuXG4gIC8vIEhvd2V2ZXIsIGlmIHdlJ3ZlIGVuZGVkLCB0aGVuIHRoZXJlJ3Mgbm8gcG9pbnQsIGlmIHdlJ3JlIGFscmVhZHlcbiAgLy8gcmVhZGluZywgdGhlbiBpdCdzIHVubmVjZXNzYXJ5LCBpZiB3ZSdyZSBjb25zdHJ1Y3Rpbmcgd2UgaGF2ZSB0byB3YWl0LFxuICAvLyBhbmQgaWYgd2UncmUgZGVzdHJveWVkIG9yIGVycm9yZWQsIHRoZW4gaXQncyBub3QgYWxsb3dlZCxcbiAgaWYgKHN0YXRlLmVuZGVkIHx8IHN0YXRlLnJlYWRpbmcgfHwgc3RhdGUuZGVzdHJveWVkIHx8IHN0YXRlLmVycm9yZWQgfHwgIXN0YXRlLmNvbnN0cnVjdGVkKSB7XG4gICAgZG9SZWFkID0gZmFsc2VcbiAgICBkZWJ1ZygncmVhZGluZywgZW5kZWQgb3IgY29uc3RydWN0aW5nJywgZG9SZWFkKVxuICB9IGVsc2UgaWYgKGRvUmVhZCkge1xuICAgIGRlYnVnKCdkbyByZWFkJylcbiAgICBzdGF0ZS5zdGF0ZSB8PSBrUmVhZGluZyB8IGtTeW5jXG4gICAgLy8gSWYgdGhlIGxlbmd0aCBpcyBjdXJyZW50bHkgemVybywgdGhlbiB3ZSAqbmVlZCogYSByZWFkYWJsZSBldmVudC5cbiAgICBpZiAoc3RhdGUubGVuZ3RoID09PSAwKSBzdGF0ZS5zdGF0ZSB8PSBrTmVlZFJlYWRhYmxlXG5cbiAgICAvLyBDYWxsIGludGVybmFsIHJlYWQgbWV0aG9kXG4gICAgdHJ5IHtcbiAgICAgIHRoaXMuX3JlYWQoc3RhdGUuaGlnaFdhdGVyTWFyaylcbiAgICB9IGNhdGNoIChlcnIpIHtcbiAgICAgIGVycm9yT3JEZXN0cm95KHRoaXMsIGVycilcbiAgICB9XG4gICAgc3RhdGUuc3RhdGUgJj0gfmtTeW5jXG5cbiAgICAvLyBJZiBfcmVhZCBwdXNoZWQgZGF0YSBzeW5jaHJvbm91c2x5LCB0aGVuIGByZWFkaW5nYCB3aWxsIGJlIGZhbHNlLFxuICAgIC8vIGFuZCB3ZSBuZWVkIHRvIHJlLWV2YWx1YXRlIGhvdyBtdWNoIGRhdGEgd2UgY2FuIHJldHVybiB0byB0aGUgdXNlci5cbiAgICBpZiAoIXN0YXRlLnJlYWRpbmcpIG4gPSBob3dNdWNoVG9SZWFkKG5PcmlnLCBzdGF0ZSlcbiAgfVxuICBsZXQgcmV0XG4gIGlmIChuID4gMCkgcmV0ID0gZnJvbUxpc3Qobiwgc3RhdGUpXG4gIGVsc2UgcmV0ID0gbnVsbFxuICBpZiAocmV0ID09PSBudWxsKSB7XG4gICAgc3RhdGUubmVlZFJlYWRhYmxlID0gc3RhdGUubGVuZ3RoIDw9IHN0YXRlLmhpZ2hXYXRlck1hcmtcbiAgICBuID0gMFxuICB9IGVsc2Uge1xuICAgIHN0YXRlLmxlbmd0aCAtPSBuXG4gICAgaWYgKHN0YXRlLm11bHRpQXdhaXREcmFpbikge1xuICAgICAgc3RhdGUuYXdhaXREcmFpbldyaXRlcnMuY2xlYXIoKVxuICAgIH0gZWxzZSB7XG4gICAgICBzdGF0ZS5hd2FpdERyYWluV3JpdGVycyA9IG51bGxcbiAgICB9XG4gIH1cbiAgaWYgKHN0YXRlLmxlbmd0aCA9PT0gMCkge1xuICAgIC8vIElmIHdlIGhhdmUgbm90aGluZyBpbiB0aGUgYnVmZmVyLCB0aGVuIHdlIHdhbnQgdG8ga25vd1xuICAgIC8vIGFzIHNvb24gYXMgd2UgKmRvKiBnZXQgc29tZXRoaW5nIGludG8gdGhlIGJ1ZmZlci5cbiAgICBpZiAoIXN0YXRlLmVuZGVkKSBzdGF0ZS5uZWVkUmVhZGFibGUgPSB0cnVlXG5cbiAgICAvLyBJZiB3ZSB0cmllZCB0byByZWFkKCkgcGFzdCB0aGUgRU9GLCB0aGVuIGVtaXQgZW5kIG9uIHRoZSBuZXh0IHRpY2suXG4gICAgaWYgKG5PcmlnICE9PSBuICYmIHN0YXRlLmVuZGVkKSBlbmRSZWFkYWJsZSh0aGlzKVxuICB9XG4gIGlmIChyZXQgIT09IG51bGwgJiYgIXN0YXRlLmVycm9yRW1pdHRlZCAmJiAhc3RhdGUuY2xvc2VFbWl0dGVkKSB7XG4gICAgc3RhdGUuZGF0YUVtaXR0ZWQgPSB0cnVlXG4gICAgdGhpcy5lbWl0KCdkYXRhJywgcmV0KVxuICB9XG4gIHJldHVybiByZXRcbn1cbmZ1bmN0aW9uIG9uRW9mQ2h1bmsoc3RyZWFtLCBzdGF0ZSkge1xuICBkZWJ1Zygnb25Fb2ZDaHVuaycpXG4gIGlmIChzdGF0ZS5lbmRlZCkgcmV0dXJuXG4gIGlmIChzdGF0ZS5kZWNvZGVyKSB7XG4gICAgY29uc3QgY2h1bmsgPSBzdGF0ZS5kZWNvZGVyLmVuZCgpXG4gICAgaWYgKGNodW5rICYmIGNodW5rLmxlbmd0aCkge1xuICAgICAgc3RhdGUuYnVmZmVyLnB1c2goY2h1bmspXG4gICAgICBzdGF0ZS5sZW5ndGggKz0gc3RhdGUub2JqZWN0TW9kZSA/IDEgOiBjaHVuay5sZW5ndGhcbiAgICB9XG4gIH1cbiAgc3RhdGUuZW5kZWQgPSB0cnVlXG4gIGlmIChzdGF0ZS5zeW5jKSB7XG4gICAgLy8gSWYgd2UgYXJlIHN5bmMsIHdhaXQgdW50aWwgbmV4dCB0aWNrIHRvIGVtaXQgdGhlIGRhdGEuXG4gICAgLy8gT3RoZXJ3aXNlIHdlIHJpc2sgZW1pdHRpbmcgZGF0YSBpbiB0aGUgZmxvdygpXG4gICAgLy8gdGhlIHJlYWRhYmxlIGNvZGUgdHJpZ2dlcnMgZHVyaW5nIGEgcmVhZCgpIGNhbGwuXG4gICAgZW1pdFJlYWRhYmxlKHN0cmVhbSlcbiAgfSBlbHNlIHtcbiAgICAvLyBFbWl0ICdyZWFkYWJsZScgbm93IHRvIG1ha2Ugc3VyZSBpdCBnZXRzIHBpY2tlZCB1cC5cbiAgICBzdGF0ZS5uZWVkUmVhZGFibGUgPSBmYWxzZVxuICAgIHN0YXRlLmVtaXR0ZWRSZWFkYWJsZSA9IHRydWVcbiAgICAvLyBXZSBoYXZlIHRvIGVtaXQgcmVhZGFibGUgbm93IHRoYXQgd2UgYXJlIEVPRi4gTW9kdWxlc1xuICAgIC8vIGluIHRoZSBlY29zeXN0ZW0gKGUuZy4gZGljZXIpIHJlbHkgb24gdGhpcyBldmVudCBiZWluZyBzeW5jLlxuICAgIGVtaXRSZWFkYWJsZV8oc3RyZWFtKVxuICB9XG59XG5cbi8vIERvbid0IGVtaXQgcmVhZGFibGUgcmlnaHQgYXdheSBpbiBzeW5jIG1vZGUsIGJlY2F1c2UgdGhpcyBjYW4gdHJpZ2dlclxuLy8gYW5vdGhlciByZWFkKCkgY2FsbCA9PiBzdGFjayBvdmVyZmxvdy4gIFRoaXMgd2F5LCBpdCBtaWdodCB0cmlnZ2VyXG4vLyBhIG5leHRUaWNrIHJlY3Vyc2lvbiB3YXJuaW5nLCBidXQgdGhhdCdzIG5vdCBzbyBiYWQuXG5mdW5jdGlvbiBlbWl0UmVhZGFibGUoc3RyZWFtKSB7XG4gIGNvbnN0IHN0YXRlID0gc3RyZWFtLl9yZWFkYWJsZVN0YXRlXG4gIGRlYnVnKCdlbWl0UmVhZGFibGUnLCBzdGF0ZS5uZWVkUmVhZGFibGUsIHN0YXRlLmVtaXR0ZWRSZWFkYWJsZSlcbiAgc3RhdGUubmVlZFJlYWRhYmxlID0gZmFsc2VcbiAgaWYgKCFzdGF0ZS5lbWl0dGVkUmVhZGFibGUpIHtcbiAgICBkZWJ1ZygnZW1pdFJlYWRhYmxlJywgc3RhdGUuZmxvd2luZylcbiAgICBzdGF0ZS5lbWl0dGVkUmVhZGFibGUgPSB0cnVlXG4gICAgcHJvY2Vzcy5uZXh0VGljayhlbWl0UmVhZGFibGVfLCBzdHJlYW0pXG4gIH1cbn1cbmZ1bmN0aW9uIGVtaXRSZWFkYWJsZV8oc3RyZWFtKSB7XG4gIGNvbnN0IHN0YXRlID0gc3RyZWFtLl9yZWFkYWJsZVN0YXRlXG4gIGRlYnVnKCdlbWl0UmVhZGFibGVfJywgc3RhdGUuZGVzdHJveWVkLCBzdGF0ZS5sZW5ndGgsIHN0YXRlLmVuZGVkKVxuICBpZiAoIXN0YXRlLmRlc3Ryb3llZCAmJiAhc3RhdGUuZXJyb3JlZCAmJiAoc3RhdGUubGVuZ3RoIHx8IHN0YXRlLmVuZGVkKSkge1xuICAgIHN0cmVhbS5lbWl0KCdyZWFkYWJsZScpXG4gICAgc3RhdGUuZW1pdHRlZFJlYWRhYmxlID0gZmFsc2VcbiAgfVxuXG4gIC8vIFRoZSBzdHJlYW0gbmVlZHMgYW5vdGhlciByZWFkYWJsZSBldmVudCBpZjpcbiAgLy8gMS4gSXQgaXMgbm90IGZsb3dpbmcsIGFzIHRoZSBmbG93IG1lY2hhbmlzbSB3aWxsIHRha2VcbiAgLy8gICAgY2FyZSBvZiBpdC5cbiAgLy8gMi4gSXQgaXMgbm90IGVuZGVkLlxuICAvLyAzLiBJdCBpcyBiZWxvdyB0aGUgaGlnaFdhdGVyTWFyaywgc28gd2UgY2FuIHNjaGVkdWxlXG4gIC8vICAgIGFub3RoZXIgcmVhZGFibGUgbGF0ZXIuXG4gIHN0YXRlLm5lZWRSZWFkYWJsZSA9ICFzdGF0ZS5mbG93aW5nICYmICFzdGF0ZS5lbmRlZCAmJiBzdGF0ZS5sZW5ndGggPD0gc3RhdGUuaGlnaFdhdGVyTWFya1xuICBmbG93KHN0cmVhbSlcbn1cblxuLy8gQXQgdGhpcyBwb2ludCwgdGhlIHVzZXIgaGFzIHByZXN1bWFibHkgc2VlbiB0aGUgJ3JlYWRhYmxlJyBldmVudCxcbi8vIGFuZCBjYWxsZWQgcmVhZCgpIHRvIGNvbnN1bWUgc29tZSBkYXRhLiAgdGhhdCBtYXkgaGF2ZSB0cmlnZ2VyZWRcbi8vIGluIHR1cm4gYW5vdGhlciBfcmVhZChuKSBjYWxsLCBpbiB3aGljaCBjYXNlIHJlYWRpbmcgPSB0cnVlIGlmXG4vLyBpdCdzIGluIHByb2dyZXNzLlxuLy8gSG93ZXZlciwgaWYgd2UncmUgbm90IGVuZGVkLCBvciByZWFkaW5nLCBhbmQgdGhlIGxlbmd0aCA8IGh3bSxcbi8vIHRoZW4gZ28gYWhlYWQgYW5kIHRyeSB0byByZWFkIHNvbWUgbW9yZSBwcmVlbXB0aXZlbHkuXG5mdW5jdGlvbiBtYXliZVJlYWRNb3JlKHN0cmVhbSwgc3RhdGUpIHtcbiAgaWYgKCFzdGF0ZS5yZWFkaW5nTW9yZSAmJiBzdGF0ZS5jb25zdHJ1Y3RlZCkge1xuICAgIHN0YXRlLnJlYWRpbmdNb3JlID0gdHJ1ZVxuICAgIHByb2Nlc3MubmV4dFRpY2sobWF5YmVSZWFkTW9yZV8sIHN0cmVhbSwgc3RhdGUpXG4gIH1cbn1cbmZ1bmN0aW9uIG1heWJlUmVhZE1vcmVfKHN0cmVhbSwgc3RhdGUpIHtcbiAgLy8gQXR0ZW1wdCB0byByZWFkIG1vcmUgZGF0YSBpZiB3ZSBzaG91bGQuXG4gIC8vXG4gIC8vIFRoZSBjb25kaXRpb25zIGZvciByZWFkaW5nIG1vcmUgZGF0YSBhcmUgKG9uZSBvZik6XG4gIC8vIC0gTm90IGVub3VnaCBkYXRhIGJ1ZmZlcmVkIChzdGF0ZS5sZW5ndGggPCBzdGF0ZS5oaWdoV2F0ZXJNYXJrKS4gVGhlIGxvb3BcbiAgLy8gICBpcyByZXNwb25zaWJsZSBmb3IgZmlsbGluZyB0aGUgYnVmZmVyIHdpdGggZW5vdWdoIGRhdGEgaWYgc3VjaCBkYXRhXG4gIC8vICAgaXMgYXZhaWxhYmxlLiBJZiBoaWdoV2F0ZXJNYXJrIGlzIDAgYW5kIHdlIGFyZSBub3QgaW4gdGhlIGZsb3dpbmcgbW9kZVxuICAvLyAgIHdlIHNob3VsZCBfbm90XyBhdHRlbXB0IHRvIGJ1ZmZlciBhbnkgZXh0cmEgZGF0YS4gV2UnbGwgZ2V0IG1vcmUgZGF0YVxuICAvLyAgIHdoZW4gdGhlIHN0cmVhbSBjb25zdW1lciBjYWxscyByZWFkKCkgaW5zdGVhZC5cbiAgLy8gLSBObyBkYXRhIGluIHRoZSBidWZmZXIsIGFuZCB0aGUgc3RyZWFtIGlzIGluIGZsb3dpbmcgbW9kZS4gSW4gdGhpcyBtb2RlXG4gIC8vICAgdGhlIGxvb3AgYmVsb3cgaXMgcmVzcG9uc2libGUgZm9yIGVuc3VyaW5nIHJlYWQoKSBpcyBjYWxsZWQuIEZhaWxpbmcgdG9cbiAgLy8gICBjYWxsIHJlYWQgaGVyZSB3b3VsZCBhYm9ydCB0aGUgZmxvdyBhbmQgdGhlcmUncyBubyBvdGhlciBtZWNoYW5pc20gZm9yXG4gIC8vICAgY29udGludWluZyB0aGUgZmxvdyBpZiB0aGUgc3RyZWFtIGNvbnN1bWVyIGhhcyBqdXN0IHN1YnNjcmliZWQgdG8gdGhlXG4gIC8vICAgJ2RhdGEnIGV2ZW50LlxuICAvL1xuICAvLyBJbiBhZGRpdGlvbiB0byB0aGUgYWJvdmUgY29uZGl0aW9ucyB0byBrZWVwIHJlYWRpbmcgZGF0YSwgdGhlIGZvbGxvd2luZ1xuICAvLyBjb25kaXRpb25zIHByZXZlbnQgdGhlIGRhdGEgZnJvbSBiZWluZyByZWFkOlxuICAvLyAtIFRoZSBzdHJlYW0gaGFzIGVuZGVkIChzdGF0ZS5lbmRlZCkuXG4gIC8vIC0gVGhlcmUgaXMgYWxyZWFkeSBhIHBlbmRpbmcgJ3JlYWQnIG9wZXJhdGlvbiAoc3RhdGUucmVhZGluZykuIFRoaXMgaXMgYVxuICAvLyAgIGNhc2Ugd2hlcmUgdGhlIHN0cmVhbSBoYXMgY2FsbGVkIHRoZSBpbXBsZW1lbnRhdGlvbiBkZWZpbmVkIF9yZWFkKClcbiAgLy8gICBtZXRob2QsIGJ1dCB0aGV5IGFyZSBwcm9jZXNzaW5nIHRoZSBjYWxsIGFzeW5jaHJvbm91c2x5IGFuZCBoYXZlIF9ub3RfXG4gIC8vICAgY2FsbGVkIHB1c2goKSB3aXRoIG5ldyBkYXRhLiBJbiB0aGlzIGNhc2Ugd2Ugc2tpcCBwZXJmb3JtaW5nIG1vcmVcbiAgLy8gICByZWFkKClzLiBUaGUgZXhlY3V0aW9uIGVuZHMgaW4gdGhpcyBtZXRob2QgYWdhaW4gYWZ0ZXIgdGhlIF9yZWFkKCkgZW5kc1xuICAvLyAgIHVwIGNhbGxpbmcgcHVzaCgpIHdpdGggbW9yZSBkYXRhLlxuICB3aGlsZSAoXG4gICAgIXN0YXRlLnJlYWRpbmcgJiZcbiAgICAhc3RhdGUuZW5kZWQgJiZcbiAgICAoc3RhdGUubGVuZ3RoIDwgc3RhdGUuaGlnaFdhdGVyTWFyayB8fCAoc3RhdGUuZmxvd2luZyAmJiBzdGF0ZS5sZW5ndGggPT09IDApKVxuICApIHtcbiAgICBjb25zdCBsZW4gPSBzdGF0ZS5sZW5ndGhcbiAgICBkZWJ1ZygnbWF5YmVSZWFkTW9yZSByZWFkIDAnKVxuICAgIHN0cmVhbS5yZWFkKDApXG4gICAgaWYgKGxlbiA9PT0gc3RhdGUubGVuZ3RoKVxuICAgICAgLy8gRGlkbid0IGdldCBhbnkgZGF0YSwgc3RvcCBzcGlubmluZy5cbiAgICAgIGJyZWFrXG4gIH1cbiAgc3RhdGUucmVhZGluZ01vcmUgPSBmYWxzZVxufVxuXG4vLyBBYnN0cmFjdCBtZXRob2QuICB0byBiZSBvdmVycmlkZGVuIGluIHNwZWNpZmljIGltcGxlbWVudGF0aW9uIGNsYXNzZXMuXG4vLyBjYWxsIGNiKGVyLCBkYXRhKSB3aGVyZSBkYXRhIGlzIDw9IG4gaW4gbGVuZ3RoLlxuLy8gZm9yIHZpcnR1YWwgKG5vbi1zdHJpbmcsIG5vbi1idWZmZXIpIHN0cmVhbXMsIFwibGVuZ3RoXCIgaXMgc29tZXdoYXRcbi8vIGFyYml0cmFyeSwgYW5kIHBlcmhhcHMgbm90IHZlcnkgbWVhbmluZ2Z1bC5cblJlYWRhYmxlLnByb3RvdHlwZS5fcmVhZCA9IGZ1bmN0aW9uIChuKSB7XG4gIHRocm93IG5ldyBFUlJfTUVUSE9EX05PVF9JTVBMRU1FTlRFRCgnX3JlYWQoKScpXG59XG5SZWFkYWJsZS5wcm90b3R5cGUucGlwZSA9IGZ1bmN0aW9uIChkZXN0LCBwaXBlT3B0cykge1xuICBjb25zdCBzcmMgPSB0aGlzXG4gIGNvbnN0IHN0YXRlID0gdGhpcy5fcmVhZGFibGVTdGF0ZVxuICBpZiAoc3RhdGUucGlwZXMubGVuZ3RoID09PSAxKSB7XG4gICAgaWYgKCFzdGF0ZS5tdWx0aUF3YWl0RHJhaW4pIHtcbiAgICAgIHN0YXRlLm11bHRpQXdhaXREcmFpbiA9IHRydWVcbiAgICAgIHN0YXRlLmF3YWl0RHJhaW5Xcml0ZXJzID0gbmV3IFNhZmVTZXQoc3RhdGUuYXdhaXREcmFpbldyaXRlcnMgPyBbc3RhdGUuYXdhaXREcmFpbldyaXRlcnNdIDogW10pXG4gICAgfVxuICB9XG4gIHN0YXRlLnBpcGVzLnB1c2goZGVzdClcbiAgZGVidWcoJ3BpcGUgY291bnQ9JWQgb3B0cz0laicsIHN0YXRlLnBpcGVzLmxlbmd0aCwgcGlwZU9wdHMpXG4gIGNvbnN0IGRvRW5kID0gKCFwaXBlT3B0cyB8fCBwaXBlT3B0cy5lbmQgIT09IGZhbHNlKSAmJiBkZXN0ICE9PSBwcm9jZXNzLnN0ZG91dCAmJiBkZXN0ICE9PSBwcm9jZXNzLnN0ZGVyclxuICBjb25zdCBlbmRGbiA9IGRvRW5kID8gb25lbmQgOiB1bnBpcGVcbiAgaWYgKHN0YXRlLmVuZEVtaXR0ZWQpIHByb2Nlc3MubmV4dFRpY2soZW5kRm4pXG4gIGVsc2Ugc3JjLm9uY2UoJ2VuZCcsIGVuZEZuKVxuICBkZXN0Lm9uKCd1bnBpcGUnLCBvbnVucGlwZSlcbiAgZnVuY3Rpb24gb251bnBpcGUocmVhZGFibGUsIHVucGlwZUluZm8pIHtcbiAgICBkZWJ1Zygnb251bnBpcGUnKVxuICAgIGlmIChyZWFkYWJsZSA9PT0gc3JjKSB7XG4gICAgICBpZiAodW5waXBlSW5mbyAmJiB1bnBpcGVJbmZvLmhhc1VucGlwZWQgPT09IGZhbHNlKSB7XG4gICAgICAgIHVucGlwZUluZm8uaGFzVW5waXBlZCA9IHRydWVcbiAgICAgICAgY2xlYW51cCgpXG4gICAgICB9XG4gICAgfVxuICB9XG4gIGZ1bmN0aW9uIG9uZW5kKCkge1xuICAgIGRlYnVnKCdvbmVuZCcpXG4gICAgZGVzdC5lbmQoKVxuICB9XG4gIGxldCBvbmRyYWluXG4gIGxldCBjbGVhbmVkVXAgPSBmYWxzZVxuICBmdW5jdGlvbiBjbGVhbnVwKCkge1xuICAgIGRlYnVnKCdjbGVhbnVwJylcbiAgICAvLyBDbGVhbnVwIGV2ZW50IGhhbmRsZXJzIG9uY2UgdGhlIHBpcGUgaXMgYnJva2VuLlxuICAgIGRlc3QucmVtb3ZlTGlzdGVuZXIoJ2Nsb3NlJywgb25jbG9zZSlcbiAgICBkZXN0LnJlbW92ZUxpc3RlbmVyKCdmaW5pc2gnLCBvbmZpbmlzaClcbiAgICBpZiAob25kcmFpbikge1xuICAgICAgZGVzdC5yZW1vdmVMaXN0ZW5lcignZHJhaW4nLCBvbmRyYWluKVxuICAgIH1cbiAgICBkZXN0LnJlbW92ZUxpc3RlbmVyKCdlcnJvcicsIG9uZXJyb3IpXG4gICAgZGVzdC5yZW1vdmVMaXN0ZW5lcigndW5waXBlJywgb251bnBpcGUpXG4gICAgc3JjLnJlbW92ZUxpc3RlbmVyKCdlbmQnLCBvbmVuZClcbiAgICBzcmMucmVtb3ZlTGlzdGVuZXIoJ2VuZCcsIHVucGlwZSlcbiAgICBzcmMucmVtb3ZlTGlzdGVuZXIoJ2RhdGEnLCBvbmRhdGEpXG4gICAgY2xlYW5lZFVwID0gdHJ1ZVxuXG4gICAgLy8gSWYgdGhlIHJlYWRlciBpcyB3YWl0aW5nIGZvciBhIGRyYWluIGV2ZW50IGZyb20gdGhpc1xuICAgIC8vIHNwZWNpZmljIHdyaXRlciwgdGhlbiBpdCB3b3VsZCBjYXVzZSBpdCB0byBuZXZlciBzdGFydFxuICAgIC8vIGZsb3dpbmcgYWdhaW4uXG4gICAgLy8gU28sIGlmIHRoaXMgaXMgYXdhaXRpbmcgYSBkcmFpbiwgdGhlbiB3ZSBqdXN0IGNhbGwgaXQgbm93LlxuICAgIC8vIElmIHdlIGRvbid0IGtub3csIHRoZW4gYXNzdW1lIHRoYXQgd2UgYXJlIHdhaXRpbmcgZm9yIG9uZS5cbiAgICBpZiAob25kcmFpbiAmJiBzdGF0ZS5hd2FpdERyYWluV3JpdGVycyAmJiAoIWRlc3QuX3dyaXRhYmxlU3RhdGUgfHwgZGVzdC5fd3JpdGFibGVTdGF0ZS5uZWVkRHJhaW4pKSBvbmRyYWluKClcbiAgfVxuICBmdW5jdGlvbiBwYXVzZSgpIHtcbiAgICAvLyBJZiB0aGUgdXNlciB1bnBpcGVkIGR1cmluZyBgZGVzdC53cml0ZSgpYCwgaXQgaXMgcG9zc2libGVcbiAgICAvLyB0byBnZXQgc3R1Y2sgaW4gYSBwZXJtYW5lbnRseSBwYXVzZWQgc3RhdGUgaWYgdGhhdCB3cml0ZVxuICAgIC8vIGFsc28gcmV0dXJuZWQgZmFsc2UuXG4gICAgLy8gPT4gQ2hlY2sgd2hldGhlciBgZGVzdGAgaXMgc3RpbGwgYSBwaXBpbmcgZGVzdGluYXRpb24uXG4gICAgaWYgKCFjbGVhbmVkVXApIHtcbiAgICAgIGlmIChzdGF0ZS5waXBlcy5sZW5ndGggPT09IDEgJiYgc3RhdGUucGlwZXNbMF0gPT09IGRlc3QpIHtcbiAgICAgICAgZGVidWcoJ2ZhbHNlIHdyaXRlIHJlc3BvbnNlLCBwYXVzZScsIDApXG4gICAgICAgIHN0YXRlLmF3YWl0RHJhaW5Xcml0ZXJzID0gZGVzdFxuICAgICAgICBzdGF0ZS5tdWx0aUF3YWl0RHJhaW4gPSBmYWxzZVxuICAgICAgfSBlbHNlIGlmIChzdGF0ZS5waXBlcy5sZW5ndGggPiAxICYmIHN0YXRlLnBpcGVzLmluY2x1ZGVzKGRlc3QpKSB7XG4gICAgICAgIGRlYnVnKCdmYWxzZSB3cml0ZSByZXNwb25zZSwgcGF1c2UnLCBzdGF0ZS5hd2FpdERyYWluV3JpdGVycy5zaXplKVxuICAgICAgICBzdGF0ZS5hd2FpdERyYWluV3JpdGVycy5hZGQoZGVzdClcbiAgICAgIH1cbiAgICAgIHNyYy5wYXVzZSgpXG4gICAgfVxuICAgIGlmICghb25kcmFpbikge1xuICAgICAgLy8gV2hlbiB0aGUgZGVzdCBkcmFpbnMsIGl0IHJlZHVjZXMgdGhlIGF3YWl0RHJhaW4gY291bnRlclxuICAgICAgLy8gb24gdGhlIHNvdXJjZS4gIFRoaXMgd291bGQgYmUgbW9yZSBlbGVnYW50IHdpdGggYSAub25jZSgpXG4gICAgICAvLyBoYW5kbGVyIGluIGZsb3coKSwgYnV0IGFkZGluZyBhbmQgcmVtb3ZpbmcgcmVwZWF0ZWRseSBpc1xuICAgICAgLy8gdG9vIHNsb3cuXG4gICAgICBvbmRyYWluID0gcGlwZU9uRHJhaW4oc3JjLCBkZXN0KVxuICAgICAgZGVzdC5vbignZHJhaW4nLCBvbmRyYWluKVxuICAgIH1cbiAgfVxuICBzcmMub24oJ2RhdGEnLCBvbmRhdGEpXG4gIGZ1bmN0aW9uIG9uZGF0YShjaHVuaykge1xuICAgIGRlYnVnKCdvbmRhdGEnKVxuICAgIGNvbnN0IHJldCA9IGRlc3Qud3JpdGUoY2h1bmspXG4gICAgZGVidWcoJ2Rlc3Qud3JpdGUnLCByZXQpXG4gICAgaWYgKHJldCA9PT0gZmFsc2UpIHtcbiAgICAgIHBhdXNlKClcbiAgICB9XG4gIH1cblxuICAvLyBJZiB0aGUgZGVzdCBoYXMgYW4gZXJyb3IsIHRoZW4gc3RvcCBwaXBpbmcgaW50byBpdC5cbiAgLy8gSG93ZXZlciwgZG9uJ3Qgc3VwcHJlc3MgdGhlIHRocm93aW5nIGJlaGF2aW9yIGZvciB0aGlzLlxuICBmdW5jdGlvbiBvbmVycm9yKGVyKSB7XG4gICAgZGVidWcoJ29uZXJyb3InLCBlcilcbiAgICB1bnBpcGUoKVxuICAgIGRlc3QucmVtb3ZlTGlzdGVuZXIoJ2Vycm9yJywgb25lcnJvcilcbiAgICBpZiAoZGVzdC5saXN0ZW5lckNvdW50KCdlcnJvcicpID09PSAwKSB7XG4gICAgICBjb25zdCBzID0gZGVzdC5fd3JpdGFibGVTdGF0ZSB8fCBkZXN0Ll9yZWFkYWJsZVN0YXRlXG4gICAgICBpZiAocyAmJiAhcy5lcnJvckVtaXR0ZWQpIHtcbiAgICAgICAgLy8gVXNlciBpbmNvcnJlY3RseSBlbWl0dGVkICdlcnJvcicgZGlyZWN0bHkgb24gdGhlIHN0cmVhbS5cbiAgICAgICAgZXJyb3JPckRlc3Ryb3koZGVzdCwgZXIpXG4gICAgICB9IGVsc2Uge1xuICAgICAgICBkZXN0LmVtaXQoJ2Vycm9yJywgZXIpXG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgLy8gTWFrZSBzdXJlIG91ciBlcnJvciBoYW5kbGVyIGlzIGF0dGFjaGVkIGJlZm9yZSB1c2VybGFuZCBvbmVzLlxuICBwcmVwZW5kTGlzdGVuZXIoZGVzdCwgJ2Vycm9yJywgb25lcnJvcilcblxuICAvLyBCb3RoIGNsb3NlIGFuZCBmaW5pc2ggc2hvdWxkIHRyaWdnZXIgdW5waXBlLCBidXQgb25seSBvbmNlLlxuICBmdW5jdGlvbiBvbmNsb3NlKCkge1xuICAgIGRlc3QucmVtb3ZlTGlzdGVuZXIoJ2ZpbmlzaCcsIG9uZmluaXNoKVxuICAgIHVucGlwZSgpXG4gIH1cbiAgZGVzdC5vbmNlKCdjbG9zZScsIG9uY2xvc2UpXG4gIGZ1bmN0aW9uIG9uZmluaXNoKCkge1xuICAgIGRlYnVnKCdvbmZpbmlzaCcpXG4gICAgZGVzdC5yZW1vdmVMaXN0ZW5lcignY2xvc2UnLCBvbmNsb3NlKVxuICAgIHVucGlwZSgpXG4gIH1cbiAgZGVzdC5vbmNlKCdmaW5pc2gnLCBvbmZpbmlzaClcbiAgZnVuY3Rpb24gdW5waXBlKCkge1xuICAgIGRlYnVnKCd1bnBpcGUnKVxuICAgIHNyYy51bnBpcGUoZGVzdClcbiAgfVxuXG4gIC8vIFRlbGwgdGhlIGRlc3QgdGhhdCBpdCdzIGJlaW5nIHBpcGVkIHRvLlxuICBkZXN0LmVtaXQoJ3BpcGUnLCBzcmMpXG5cbiAgLy8gU3RhcnQgdGhlIGZsb3cgaWYgaXQgaGFzbid0IGJlZW4gc3RhcnRlZCBhbHJlYWR5LlxuXG4gIGlmIChkZXN0LndyaXRhYmxlTmVlZERyYWluID09PSB0cnVlKSB7XG4gICAgcGF1c2UoKVxuICB9IGVsc2UgaWYgKCFzdGF0ZS5mbG93aW5nKSB7XG4gICAgZGVidWcoJ3BpcGUgcmVzdW1lJylcbiAgICBzcmMucmVzdW1lKClcbiAgfVxuICByZXR1cm4gZGVzdFxufVxuZnVuY3Rpb24gcGlwZU9uRHJhaW4oc3JjLCBkZXN0KSB7XG4gIHJldHVybiBmdW5jdGlvbiBwaXBlT25EcmFpbkZ1bmN0aW9uUmVzdWx0KCkge1xuICAgIGNvbnN0IHN0YXRlID0gc3JjLl9yZWFkYWJsZVN0YXRlXG5cbiAgICAvLyBgb25kcmFpbmAgd2lsbCBjYWxsIGRpcmVjdGx5LFxuICAgIC8vIGB0aGlzYCBtYXliZSBub3QgYSByZWZlcmVuY2UgdG8gZGVzdCxcbiAgICAvLyBzbyB3ZSB1c2UgdGhlIHJlYWwgZGVzdCBoZXJlLlxuICAgIGlmIChzdGF0ZS5hd2FpdERyYWluV3JpdGVycyA9PT0gZGVzdCkge1xuICAgICAgZGVidWcoJ3BpcGVPbkRyYWluJywgMSlcbiAgICAgIHN0YXRlLmF3YWl0RHJhaW5Xcml0ZXJzID0gbnVsbFxuICAgIH0gZWxzZSBpZiAoc3RhdGUubXVsdGlBd2FpdERyYWluKSB7XG4gICAgICBkZWJ1ZygncGlwZU9uRHJhaW4nLCBzdGF0ZS5hd2FpdERyYWluV3JpdGVycy5zaXplKVxuICAgICAgc3RhdGUuYXdhaXREcmFpbldyaXRlcnMuZGVsZXRlKGRlc3QpXG4gICAgfVxuICAgIGlmICgoIXN0YXRlLmF3YWl0RHJhaW5Xcml0ZXJzIHx8IHN0YXRlLmF3YWl0RHJhaW5Xcml0ZXJzLnNpemUgPT09IDApICYmIHNyYy5saXN0ZW5lckNvdW50KCdkYXRhJykpIHtcbiAgICAgIHNyYy5yZXN1bWUoKVxuICAgIH1cbiAgfVxufVxuUmVhZGFibGUucHJvdG90eXBlLnVucGlwZSA9IGZ1bmN0aW9uIChkZXN0KSB7XG4gIGNvbnN0IHN0YXRlID0gdGhpcy5fcmVhZGFibGVTdGF0ZVxuICBjb25zdCB1bnBpcGVJbmZvID0ge1xuICAgIGhhc1VucGlwZWQ6IGZhbHNlXG4gIH1cblxuICAvLyBJZiB3ZSdyZSBub3QgcGlwaW5nIGFueXdoZXJlLCB0aGVuIGRvIG5vdGhpbmcuXG4gIGlmIChzdGF0ZS5waXBlcy5sZW5ndGggPT09IDApIHJldHVybiB0aGlzXG4gIGlmICghZGVzdCkge1xuICAgIC8vIHJlbW92ZSBhbGwuXG4gICAgY29uc3QgZGVzdHMgPSBzdGF0ZS5waXBlc1xuICAgIHN0YXRlLnBpcGVzID0gW11cbiAgICB0aGlzLnBhdXNlKClcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IGRlc3RzLmxlbmd0aDsgaSsrKVxuICAgICAgZGVzdHNbaV0uZW1pdCgndW5waXBlJywgdGhpcywge1xuICAgICAgICBoYXNVbnBpcGVkOiBmYWxzZVxuICAgICAgfSlcbiAgICByZXR1cm4gdGhpc1xuICB9XG5cbiAgLy8gVHJ5IHRvIGZpbmQgdGhlIHJpZ2h0IG9uZS5cbiAgY29uc3QgaW5kZXggPSBBcnJheVByb3RvdHlwZUluZGV4T2Yoc3RhdGUucGlwZXMsIGRlc3QpXG4gIGlmIChpbmRleCA9PT0gLTEpIHJldHVybiB0aGlzXG4gIHN0YXRlLnBpcGVzLnNwbGljZShpbmRleCwgMSlcbiAgaWYgKHN0YXRlLnBpcGVzLmxlbmd0aCA9PT0gMCkgdGhpcy5wYXVzZSgpXG4gIGRlc3QuZW1pdCgndW5waXBlJywgdGhpcywgdW5waXBlSW5mbylcbiAgcmV0dXJuIHRoaXNcbn1cblxuLy8gU2V0IHVwIGRhdGEgZXZlbnRzIGlmIHRoZXkgYXJlIGFza2VkIGZvclxuLy8gRW5zdXJlIHJlYWRhYmxlIGxpc3RlbmVycyBldmVudHVhbGx5IGdldCBzb21ldGhpbmcuXG5SZWFkYWJsZS5wcm90b3R5cGUub24gPSBmdW5jdGlvbiAoZXYsIGZuKSB7XG4gIGNvbnN0IHJlcyA9IFN0cmVhbS5wcm90b3R5cGUub24uY2FsbCh0aGlzLCBldiwgZm4pXG4gIGNvbnN0IHN0YXRlID0gdGhpcy5fcmVhZGFibGVTdGF0ZVxuICBpZiAoZXYgPT09ICdkYXRhJykge1xuICAgIC8vIFVwZGF0ZSByZWFkYWJsZUxpc3RlbmluZyBzbyB0aGF0IHJlc3VtZSgpIG1heSBiZSBhIG5vLW9wXG4gICAgLy8gYSBmZXcgbGluZXMgZG93bi4gVGhpcyBpcyBuZWVkZWQgdG8gc3VwcG9ydCBvbmNlKCdyZWFkYWJsZScpLlxuICAgIHN0YXRlLnJlYWRhYmxlTGlzdGVuaW5nID0gdGhpcy5saXN0ZW5lckNvdW50KCdyZWFkYWJsZScpID4gMFxuXG4gICAgLy8gVHJ5IHN0YXJ0IGZsb3dpbmcgb24gbmV4dCB0aWNrIGlmIHN0cmVhbSBpc24ndCBleHBsaWNpdGx5IHBhdXNlZC5cbiAgICBpZiAoc3RhdGUuZmxvd2luZyAhPT0gZmFsc2UpIHRoaXMucmVzdW1lKClcbiAgfSBlbHNlIGlmIChldiA9PT0gJ3JlYWRhYmxlJykge1xuICAgIGlmICghc3RhdGUuZW5kRW1pdHRlZCAmJiAhc3RhdGUucmVhZGFibGVMaXN0ZW5pbmcpIHtcbiAgICAgIHN0YXRlLnJlYWRhYmxlTGlzdGVuaW5nID0gc3RhdGUubmVlZFJlYWRhYmxlID0gdHJ1ZVxuICAgICAgc3RhdGUuZmxvd2luZyA9IGZhbHNlXG4gICAgICBzdGF0ZS5lbWl0dGVkUmVhZGFibGUgPSBmYWxzZVxuICAgICAgZGVidWcoJ29uIHJlYWRhYmxlJywgc3RhdGUubGVuZ3RoLCBzdGF0ZS5yZWFkaW5nKVxuICAgICAgaWYgKHN0YXRlLmxlbmd0aCkge1xuICAgICAgICBlbWl0UmVhZGFibGUodGhpcylcbiAgICAgIH0gZWxzZSBpZiAoIXN0YXRlLnJlYWRpbmcpIHtcbiAgICAgICAgcHJvY2Vzcy5uZXh0VGljayhuUmVhZGluZ05leHRUaWNrLCB0aGlzKVxuICAgICAgfVxuICAgIH1cbiAgfVxuICByZXR1cm4gcmVzXG59XG5SZWFkYWJsZS5wcm90b3R5cGUuYWRkTGlzdGVuZXIgPSBSZWFkYWJsZS5wcm90b3R5cGUub25cblJlYWRhYmxlLnByb3RvdHlwZS5yZW1vdmVMaXN0ZW5lciA9IGZ1bmN0aW9uIChldiwgZm4pIHtcbiAgY29uc3QgcmVzID0gU3RyZWFtLnByb3RvdHlwZS5yZW1vdmVMaXN0ZW5lci5jYWxsKHRoaXMsIGV2LCBmbilcbiAgaWYgKGV2ID09PSAncmVhZGFibGUnKSB7XG4gICAgLy8gV2UgbmVlZCB0byBjaGVjayBpZiB0aGVyZSBpcyBzb21lb25lIHN0aWxsIGxpc3RlbmluZyB0b1xuICAgIC8vIHJlYWRhYmxlIGFuZCByZXNldCB0aGUgc3RhdGUuIEhvd2V2ZXIgdGhpcyBuZWVkcyB0byBoYXBwZW5cbiAgICAvLyBhZnRlciByZWFkYWJsZSBoYXMgYmVlbiBlbWl0dGVkIGJ1dCBiZWZvcmUgSS9PIChuZXh0VGljaykgdG9cbiAgICAvLyBzdXBwb3J0IG9uY2UoJ3JlYWRhYmxlJywgZm4pIGN5Y2xlcy4gVGhpcyBtZWFucyB0aGF0IGNhbGxpbmdcbiAgICAvLyByZXN1bWUgd2l0aGluIHRoZSBzYW1lIHRpY2sgd2lsbCBoYXZlIG5vXG4gICAgLy8gZWZmZWN0LlxuICAgIHByb2Nlc3MubmV4dFRpY2sodXBkYXRlUmVhZGFibGVMaXN0ZW5pbmcsIHRoaXMpXG4gIH1cbiAgcmV0dXJuIHJlc1xufVxuUmVhZGFibGUucHJvdG90eXBlLm9mZiA9IFJlYWRhYmxlLnByb3RvdHlwZS5yZW1vdmVMaXN0ZW5lclxuUmVhZGFibGUucHJvdG90eXBlLnJlbW92ZUFsbExpc3RlbmVycyA9IGZ1bmN0aW9uIChldikge1xuICBjb25zdCByZXMgPSBTdHJlYW0ucHJvdG90eXBlLnJlbW92ZUFsbExpc3RlbmVycy5hcHBseSh0aGlzLCBhcmd1bWVudHMpXG4gIGlmIChldiA9PT0gJ3JlYWRhYmxlJyB8fCBldiA9PT0gdW5kZWZpbmVkKSB7XG4gICAgLy8gV2UgbmVlZCB0byBjaGVjayBpZiB0aGVyZSBpcyBzb21lb25lIHN0aWxsIGxpc3RlbmluZyB0b1xuICAgIC8vIHJlYWRhYmxlIGFuZCByZXNldCB0aGUgc3RhdGUuIEhvd2V2ZXIgdGhpcyBuZWVkcyB0byBoYXBwZW5cbiAgICAvLyBhZnRlciByZWFkYWJsZSBoYXMgYmVlbiBlbWl0dGVkIGJ1dCBiZWZvcmUgSS9PIChuZXh0VGljaykgdG9cbiAgICAvLyBzdXBwb3J0IG9uY2UoJ3JlYWRhYmxlJywgZm4pIGN5Y2xlcy4gVGhpcyBtZWFucyB0aGF0IGNhbGxpbmdcbiAgICAvLyByZXN1bWUgd2l0aGluIHRoZSBzYW1lIHRpY2sgd2lsbCBoYXZlIG5vXG4gICAgLy8gZWZmZWN0LlxuICAgIHByb2Nlc3MubmV4dFRpY2sodXBkYXRlUmVhZGFibGVMaXN0ZW5pbmcsIHRoaXMpXG4gIH1cbiAgcmV0dXJuIHJlc1xufVxuZnVuY3Rpb24gdXBkYXRlUmVhZGFibGVMaXN0ZW5pbmcoc2VsZikge1xuICBjb25zdCBzdGF0ZSA9IHNlbGYuX3JlYWRhYmxlU3RhdGVcbiAgc3RhdGUucmVhZGFibGVMaXN0ZW5pbmcgPSBzZWxmLmxpc3RlbmVyQ291bnQoJ3JlYWRhYmxlJykgPiAwXG4gIGlmIChzdGF0ZS5yZXN1bWVTY2hlZHVsZWQgJiYgc3RhdGVba1BhdXNlZF0gPT09IGZhbHNlKSB7XG4gICAgLy8gRmxvd2luZyBuZWVkcyB0byBiZSBzZXQgdG8gdHJ1ZSBub3csIG90aGVyd2lzZVxuICAgIC8vIHRoZSB1cGNvbWluZyByZXN1bWUgd2lsbCBub3QgZmxvdy5cbiAgICBzdGF0ZS5mbG93aW5nID0gdHJ1ZVxuXG4gICAgLy8gQ3J1ZGUgd2F5IHRvIGNoZWNrIGlmIHdlIHNob3VsZCByZXN1bWUuXG4gIH0gZWxzZSBpZiAoc2VsZi5saXN0ZW5lckNvdW50KCdkYXRhJykgPiAwKSB7XG4gICAgc2VsZi5yZXN1bWUoKVxuICB9IGVsc2UgaWYgKCFzdGF0ZS5yZWFkYWJsZUxpc3RlbmluZykge1xuICAgIHN0YXRlLmZsb3dpbmcgPSBudWxsXG4gIH1cbn1cbmZ1bmN0aW9uIG5SZWFkaW5nTmV4dFRpY2soc2VsZikge1xuICBkZWJ1ZygncmVhZGFibGUgbmV4dHRpY2sgcmVhZCAwJylcbiAgc2VsZi5yZWFkKDApXG59XG5cbi8vIHBhdXNlKCkgYW5kIHJlc3VtZSgpIGFyZSByZW1uYW50cyBvZiB0aGUgbGVnYWN5IHJlYWRhYmxlIHN0cmVhbSBBUElcbi8vIElmIHRoZSB1c2VyIHVzZXMgdGhlbSwgdGhlbiBzd2l0Y2ggaW50byBvbGQgbW9kZS5cblJlYWRhYmxlLnByb3RvdHlwZS5yZXN1bWUgPSBmdW5jdGlvbiAoKSB7XG4gIGNvbnN0IHN0YXRlID0gdGhpcy5fcmVhZGFibGVTdGF0ZVxuICBpZiAoIXN0YXRlLmZsb3dpbmcpIHtcbiAgICBkZWJ1ZygncmVzdW1lJylcbiAgICAvLyBXZSBmbG93IG9ubHkgaWYgdGhlcmUgaXMgbm8gb25lIGxpc3RlbmluZ1xuICAgIC8vIGZvciByZWFkYWJsZSwgYnV0IHdlIHN0aWxsIGhhdmUgdG8gY2FsbFxuICAgIC8vIHJlc3VtZSgpLlxuICAgIHN0YXRlLmZsb3dpbmcgPSAhc3RhdGUucmVhZGFibGVMaXN0ZW5pbmdcbiAgICByZXN1bWUodGhpcywgc3RhdGUpXG4gIH1cbiAgc3RhdGVba1BhdXNlZF0gPSBmYWxzZVxuICByZXR1cm4gdGhpc1xufVxuZnVuY3Rpb24gcmVzdW1lKHN0cmVhbSwgc3RhdGUpIHtcbiAgaWYgKCFzdGF0ZS5yZXN1bWVTY2hlZHVsZWQpIHtcbiAgICBzdGF0ZS5yZXN1bWVTY2hlZHVsZWQgPSB0cnVlXG4gICAgcHJvY2Vzcy5uZXh0VGljayhyZXN1bWVfLCBzdHJlYW0sIHN0YXRlKVxuICB9XG59XG5mdW5jdGlvbiByZXN1bWVfKHN0cmVhbSwgc3RhdGUpIHtcbiAgZGVidWcoJ3Jlc3VtZScsIHN0YXRlLnJlYWRpbmcpXG4gIGlmICghc3RhdGUucmVhZGluZykge1xuICAgIHN0cmVhbS5yZWFkKDApXG4gIH1cbiAgc3RhdGUucmVzdW1lU2NoZWR1bGVkID0gZmFsc2VcbiAgc3RyZWFtLmVtaXQoJ3Jlc3VtZScpXG4gIGZsb3coc3RyZWFtKVxuICBpZiAoc3RhdGUuZmxvd2luZyAmJiAhc3RhdGUucmVhZGluZykgc3RyZWFtLnJlYWQoMClcbn1cblJlYWRhYmxlLnByb3RvdHlwZS5wYXVzZSA9IGZ1bmN0aW9uICgpIHtcbiAgZGVidWcoJ2NhbGwgcGF1c2UgZmxvd2luZz0laicsIHRoaXMuX3JlYWRhYmxlU3RhdGUuZmxvd2luZylcbiAgaWYgKHRoaXMuX3JlYWRhYmxlU3RhdGUuZmxvd2luZyAhPT0gZmFsc2UpIHtcbiAgICBkZWJ1ZygncGF1c2UnKVxuICAgIHRoaXMuX3JlYWRhYmxlU3RhdGUuZmxvd2luZyA9IGZhbHNlXG4gICAgdGhpcy5lbWl0KCdwYXVzZScpXG4gIH1cbiAgdGhpcy5fcmVhZGFibGVTdGF0ZVtrUGF1c2VkXSA9IHRydWVcbiAgcmV0dXJuIHRoaXNcbn1cbmZ1bmN0aW9uIGZsb3coc3RyZWFtKSB7XG4gIGNvbnN0IHN0YXRlID0gc3RyZWFtLl9yZWFkYWJsZVN0YXRlXG4gIGRlYnVnKCdmbG93Jywgc3RhdGUuZmxvd2luZylcbiAgd2hpbGUgKHN0YXRlLmZsb3dpbmcgJiYgc3RyZWFtLnJlYWQoKSAhPT0gbnVsbCk7XG59XG5cbi8vIFdyYXAgYW4gb2xkLXN0eWxlIHN0cmVhbSBhcyB0aGUgYXN5bmMgZGF0YSBzb3VyY2UuXG4vLyBUaGlzIGlzICpub3QqIHBhcnQgb2YgdGhlIHJlYWRhYmxlIHN0cmVhbSBpbnRlcmZhY2UuXG4vLyBJdCBpcyBhbiB1Z2x5IHVuZm9ydHVuYXRlIG1lc3Mgb2YgaGlzdG9yeS5cblJlYWRhYmxlLnByb3RvdHlwZS53cmFwID0gZnVuY3Rpb24gKHN0cmVhbSkge1xuICBsZXQgcGF1c2VkID0gZmFsc2VcblxuICAvLyBUT0RPIChyb25hZyk6IFNob3VsZCB0aGlzLmRlc3Ryb3koZXJyKSBlbWl0XG4gIC8vICdlcnJvcicgb24gdGhlIHdyYXBwZWQgc3RyZWFtPyBXb3VsZCByZXF1aXJlXG4gIC8vIGEgc3RhdGljIGZhY3RvcnkgbWV0aG9kLCBlLmcuIFJlYWRhYmxlLndyYXAoc3RyZWFtKS5cblxuICBzdHJlYW0ub24oJ2RhdGEnLCAoY2h1bmspID0+IHtcbiAgICBpZiAoIXRoaXMucHVzaChjaHVuaykgJiYgc3RyZWFtLnBhdXNlKSB7XG4gICAgICBwYXVzZWQgPSB0cnVlXG4gICAgICBzdHJlYW0ucGF1c2UoKVxuICAgIH1cbiAgfSlcbiAgc3RyZWFtLm9uKCdlbmQnLCAoKSA9PiB7XG4gICAgdGhpcy5wdXNoKG51bGwpXG4gIH0pXG4gIHN0cmVhbS5vbignZXJyb3InLCAoZXJyKSA9PiB7XG4gICAgZXJyb3JPckRlc3Ryb3kodGhpcywgZXJyKVxuICB9KVxuICBzdHJlYW0ub24oJ2Nsb3NlJywgKCkgPT4ge1xuICAgIHRoaXMuZGVzdHJveSgpXG4gIH0pXG4gIHN0cmVhbS5vbignZGVzdHJveScsICgpID0+IHtcbiAgICB0aGlzLmRlc3Ryb3koKVxuICB9KVxuICB0aGlzLl9yZWFkID0gKCkgPT4ge1xuICAgIGlmIChwYXVzZWQgJiYgc3RyZWFtLnJlc3VtZSkge1xuICAgICAgcGF1c2VkID0gZmFsc2VcbiAgICAgIHN0cmVhbS5yZXN1bWUoKVxuICAgIH1cbiAgfVxuXG4gIC8vIFByb3h5IGFsbCB0aGUgb3RoZXIgbWV0aG9kcy4gSW1wb3J0YW50IHdoZW4gd3JhcHBpbmcgZmlsdGVycyBhbmQgZHVwbGV4ZXMuXG4gIGNvbnN0IHN0cmVhbUtleXMgPSBPYmplY3RLZXlzKHN0cmVhbSlcbiAgZm9yIChsZXQgaiA9IDE7IGogPCBzdHJlYW1LZXlzLmxlbmd0aDsgaisrKSB7XG4gICAgY29uc3QgaSA9IHN0cmVhbUtleXNbal1cbiAgICBpZiAodGhpc1tpXSA9PT0gdW5kZWZpbmVkICYmIHR5cGVvZiBzdHJlYW1baV0gPT09ICdmdW5jdGlvbicpIHtcbiAgICAgIHRoaXNbaV0gPSBzdHJlYW1baV0uYmluZChzdHJlYW0pXG4gICAgfVxuICB9XG4gIHJldHVybiB0aGlzXG59XG5SZWFkYWJsZS5wcm90b3R5cGVbU3ltYm9sQXN5bmNJdGVyYXRvcl0gPSBmdW5jdGlvbiAoKSB7XG4gIHJldHVybiBzdHJlYW1Ub0FzeW5jSXRlcmF0b3IodGhpcylcbn1cblJlYWRhYmxlLnByb3RvdHlwZS5pdGVyYXRvciA9IGZ1bmN0aW9uIChvcHRpb25zKSB7XG4gIGlmIChvcHRpb25zICE9PSB1bmRlZmluZWQpIHtcbiAgICB2YWxpZGF0ZU9iamVjdChvcHRpb25zLCAnb3B0aW9ucycpXG4gIH1cbiAgcmV0dXJuIHN0cmVhbVRvQXN5bmNJdGVyYXRvcih0aGlzLCBvcHRpb25zKVxufVxuZnVuY3Rpb24gc3RyZWFtVG9Bc3luY0l0ZXJhdG9yKHN0cmVhbSwgb3B0aW9ucykge1xuICBpZiAodHlwZW9mIHN0cmVhbS5yZWFkICE9PSAnZnVuY3Rpb24nKSB7XG4gICAgc3RyZWFtID0gUmVhZGFibGUud3JhcChzdHJlYW0sIHtcbiAgICAgIG9iamVjdE1vZGU6IHRydWVcbiAgICB9KVxuICB9XG4gIGNvbnN0IGl0ZXIgPSBjcmVhdGVBc3luY0l0ZXJhdG9yKHN0cmVhbSwgb3B0aW9ucylcbiAgaXRlci5zdHJlYW0gPSBzdHJlYW1cbiAgcmV0dXJuIGl0ZXJcbn1cbmFzeW5jIGZ1bmN0aW9uKiBjcmVhdGVBc3luY0l0ZXJhdG9yKHN0cmVhbSwgb3B0aW9ucykge1xuICBsZXQgY2FsbGJhY2sgPSBub3BcbiAgZnVuY3Rpb24gbmV4dChyZXNvbHZlKSB7XG4gICAgaWYgKHRoaXMgPT09IHN0cmVhbSkge1xuICAgICAgY2FsbGJhY2soKVxuICAgICAgY2FsbGJhY2sgPSBub3BcbiAgICB9IGVsc2Uge1xuICAgICAgY2FsbGJhY2sgPSByZXNvbHZlXG4gICAgfVxuICB9XG4gIHN0cmVhbS5vbigncmVhZGFibGUnLCBuZXh0KVxuICBsZXQgZXJyb3JcbiAgY29uc3QgY2xlYW51cCA9IGVvcyhcbiAgICBzdHJlYW0sXG4gICAge1xuICAgICAgd3JpdGFibGU6IGZhbHNlXG4gICAgfSxcbiAgICAoZXJyKSA9PiB7XG4gICAgICBlcnJvciA9IGVyciA/IGFnZ3JlZ2F0ZVR3b0Vycm9ycyhlcnJvciwgZXJyKSA6IG51bGxcbiAgICAgIGNhbGxiYWNrKClcbiAgICAgIGNhbGxiYWNrID0gbm9wXG4gICAgfVxuICApXG4gIHRyeSB7XG4gICAgd2hpbGUgKHRydWUpIHtcbiAgICAgIGNvbnN0IGNodW5rID0gc3RyZWFtLmRlc3Ryb3llZCA/IG51bGwgOiBzdHJlYW0ucmVhZCgpXG4gICAgICBpZiAoY2h1bmsgIT09IG51bGwpIHtcbiAgICAgICAgeWllbGQgY2h1bmtcbiAgICAgIH0gZWxzZSBpZiAoZXJyb3IpIHtcbiAgICAgICAgdGhyb3cgZXJyb3JcbiAgICAgIH0gZWxzZSBpZiAoZXJyb3IgPT09IG51bGwpIHtcbiAgICAgICAgcmV0dXJuXG4gICAgICB9IGVsc2Uge1xuICAgICAgICBhd2FpdCBuZXcgUHJvbWlzZShuZXh0KVxuICAgICAgfVxuICAgIH1cbiAgfSBjYXRjaCAoZXJyKSB7XG4gICAgZXJyb3IgPSBhZ2dyZWdhdGVUd29FcnJvcnMoZXJyb3IsIGVycilcbiAgICB0aHJvdyBlcnJvclxuICB9IGZpbmFsbHkge1xuICAgIGlmIChcbiAgICAgIChlcnJvciB8fCAob3B0aW9ucyA9PT0gbnVsbCB8fCBvcHRpb25zID09PSB1bmRlZmluZWQgPyB1bmRlZmluZWQgOiBvcHRpb25zLmRlc3Ryb3lPblJldHVybikgIT09IGZhbHNlKSAmJlxuICAgICAgKGVycm9yID09PSB1bmRlZmluZWQgfHwgc3RyZWFtLl9yZWFkYWJsZVN0YXRlLmF1dG9EZXN0cm95KVxuICAgICkge1xuICAgICAgZGVzdHJveUltcGwuZGVzdHJveWVyKHN0cmVhbSwgbnVsbClcbiAgICB9IGVsc2Uge1xuICAgICAgc3RyZWFtLm9mZigncmVhZGFibGUnLCBuZXh0KVxuICAgICAgY2xlYW51cCgpXG4gICAgfVxuICB9XG59XG5cbi8vIE1ha2luZyBpdCBleHBsaWNpdCB0aGVzZSBwcm9wZXJ0aWVzIGFyZSBub3QgZW51bWVyYWJsZVxuLy8gYmVjYXVzZSBvdGhlcndpc2Ugc29tZSBwcm90b3R5cGUgbWFuaXB1bGF0aW9uIGluXG4vLyB1c2VybGFuZCB3aWxsIGZhaWwuXG5PYmplY3REZWZpbmVQcm9wZXJ0aWVzKFJlYWRhYmxlLnByb3RvdHlwZSwge1xuICByZWFkYWJsZToge1xuICAgIF9fcHJvdG9fXzogbnVsbCxcbiAgICBnZXQoKSB7XG4gICAgICBjb25zdCByID0gdGhpcy5fcmVhZGFibGVTdGF0ZVxuICAgICAgLy8gci5yZWFkYWJsZSA9PT0gZmFsc2UgbWVhbnMgdGhhdCB0aGlzIGlzIHBhcnQgb2YgYSBEdXBsZXggc3RyZWFtXG4gICAgICAvLyB3aGVyZSB0aGUgcmVhZGFibGUgc2lkZSB3YXMgZGlzYWJsZWQgdXBvbiBjb25zdHJ1Y3Rpb24uXG4gICAgICAvLyBDb21wYXQuIFRoZSB1c2VyIG1pZ2h0IG1hbnVhbGx5IGRpc2FibGUgcmVhZGFibGUgc2lkZSB0aHJvdWdoXG4gICAgICAvLyBkZXByZWNhdGVkIHNldHRlci5cbiAgICAgIHJldHVybiAhIXIgJiYgci5yZWFkYWJsZSAhPT0gZmFsc2UgJiYgIXIuZGVzdHJveWVkICYmICFyLmVycm9yRW1pdHRlZCAmJiAhci5lbmRFbWl0dGVkXG4gICAgfSxcbiAgICBzZXQodmFsKSB7XG4gICAgICAvLyBCYWNrd2FyZHMgY29tcGF0LlxuICAgICAgaWYgKHRoaXMuX3JlYWRhYmxlU3RhdGUpIHtcbiAgICAgICAgdGhpcy5fcmVhZGFibGVTdGF0ZS5yZWFkYWJsZSA9ICEhdmFsXG4gICAgICB9XG4gICAgfVxuICB9LFxuICByZWFkYWJsZURpZFJlYWQ6IHtcbiAgICBfX3Byb3RvX186IG51bGwsXG4gICAgZW51bWVyYWJsZTogZmFsc2UsXG4gICAgZ2V0OiBmdW5jdGlvbiAoKSB7XG4gICAgICByZXR1cm4gdGhpcy5fcmVhZGFibGVTdGF0ZS5kYXRhRW1pdHRlZFxuICAgIH1cbiAgfSxcbiAgcmVhZGFibGVBYm9ydGVkOiB7XG4gICAgX19wcm90b19fOiBudWxsLFxuICAgIGVudW1lcmFibGU6IGZhbHNlLFxuICAgIGdldDogZnVuY3Rpb24gKCkge1xuICAgICAgcmV0dXJuICEhKFxuICAgICAgICB0aGlzLl9yZWFkYWJsZVN0YXRlLnJlYWRhYmxlICE9PSBmYWxzZSAmJlxuICAgICAgICAodGhpcy5fcmVhZGFibGVTdGF0ZS5kZXN0cm95ZWQgfHwgdGhpcy5fcmVhZGFibGVTdGF0ZS5lcnJvcmVkKSAmJlxuICAgICAgICAhdGhpcy5fcmVhZGFibGVTdGF0ZS5lbmRFbWl0dGVkXG4gICAgICApXG4gICAgfVxuICB9LFxuICByZWFkYWJsZUhpZ2hXYXRlck1hcms6IHtcbiAgICBfX3Byb3RvX186IG51bGwsXG4gICAgZW51bWVyYWJsZTogZmFsc2UsXG4gICAgZ2V0OiBmdW5jdGlvbiAoKSB7XG4gICAgICByZXR1cm4gdGhpcy5fcmVhZGFibGVTdGF0ZS5oaWdoV2F0ZXJNYXJrXG4gICAgfVxuICB9LFxuICByZWFkYWJsZUJ1ZmZlcjoge1xuICAgIF9fcHJvdG9fXzogbnVsbCxcbiAgICBlbnVtZXJhYmxlOiBmYWxzZSxcbiAgICBnZXQ6IGZ1bmN0aW9uICgpIHtcbiAgICAgIHJldHVybiB0aGlzLl9yZWFkYWJsZVN0YXRlICYmIHRoaXMuX3JlYWRhYmxlU3RhdGUuYnVmZmVyXG4gICAgfVxuICB9LFxuICByZWFkYWJsZUZsb3dpbmc6IHtcbiAgICBfX3Byb3RvX186IG51bGwsXG4gICAgZW51bWVyYWJsZTogZmFsc2UsXG4gICAgZ2V0OiBmdW5jdGlvbiAoKSB7XG4gICAgICByZXR1cm4gdGhpcy5fcmVhZGFibGVTdGF0ZS5mbG93aW5nXG4gICAgfSxcbiAgICBzZXQ6IGZ1bmN0aW9uIChzdGF0ZSkge1xuICAgICAgaWYgKHRoaXMuX3JlYWRhYmxlU3RhdGUpIHtcbiAgICAgICAgdGhpcy5fcmVhZGFibGVTdGF0ZS5mbG93aW5nID0gc3RhdGVcbiAgICAgIH1cbiAgICB9XG4gIH0sXG4gIHJlYWRhYmxlTGVuZ3RoOiB7XG4gICAgX19wcm90b19fOiBudWxsLFxuICAgIGVudW1lcmFibGU6IGZhbHNlLFxuICAgIGdldCgpIHtcbiAgICAgIHJldHVybiB0aGlzLl9yZWFkYWJsZVN0YXRlLmxlbmd0aFxuICAgIH1cbiAgfSxcbiAgcmVhZGFibGVPYmplY3RNb2RlOiB7XG4gICAgX19wcm90b19fOiBudWxsLFxuICAgIGVudW1lcmFibGU6IGZhbHNlLFxuICAgIGdldCgpIHtcbiAgICAgIHJldHVybiB0aGlzLl9yZWFkYWJsZVN0YXRlID8gdGhpcy5fcmVhZGFibGVTdGF0ZS5vYmplY3RNb2RlIDogZmFsc2VcbiAgICB9XG4gIH0sXG4gIHJlYWRhYmxlRW5jb2Rpbmc6IHtcbiAgICBfX3Byb3RvX186IG51bGwsXG4gICAgZW51bWVyYWJsZTogZmFsc2UsXG4gICAgZ2V0KCkge1xuICAgICAgcmV0dXJuIHRoaXMuX3JlYWRhYmxlU3RhdGUgPyB0aGlzLl9yZWFkYWJsZVN0YXRlLmVuY29kaW5nIDogbnVsbFxuICAgIH1cbiAgfSxcbiAgZXJyb3JlZDoge1xuICAgIF9fcHJvdG9fXzogbnVsbCxcbiAgICBlbnVtZXJhYmxlOiBmYWxzZSxcbiAgICBnZXQoKSB7XG4gICAgICByZXR1cm4gdGhpcy5fcmVhZGFibGVTdGF0ZSA/IHRoaXMuX3JlYWRhYmxlU3RhdGUuZXJyb3JlZCA6IG51bGxcbiAgICB9XG4gIH0sXG4gIGNsb3NlZDoge1xuICAgIF9fcHJvdG9fXzogbnVsbCxcbiAgICBnZXQoKSB7XG4gICAgICByZXR1cm4gdGhpcy5fcmVhZGFibGVTdGF0ZSA/IHRoaXMuX3JlYWRhYmxlU3RhdGUuY2xvc2VkIDogZmFsc2VcbiAgICB9XG4gIH0sXG4gIGRlc3Ryb3llZDoge1xuICAgIF9fcHJvdG9fXzogbnVsbCxcbiAgICBlbnVtZXJhYmxlOiBmYWxzZSxcbiAgICBnZXQoKSB7XG4gICAgICByZXR1cm4gdGhpcy5fcmVhZGFibGVTdGF0ZSA/IHRoaXMuX3JlYWRhYmxlU3RhdGUuZGVzdHJveWVkIDogZmFsc2VcbiAgICB9LFxuICAgIHNldCh2YWx1ZSkge1xuICAgICAgLy8gV2UgaWdub3JlIHRoZSB2YWx1ZSBpZiB0aGUgc3RyZWFtXG4gICAgICAvLyBoYXMgbm90IGJlZW4gaW5pdGlhbGl6ZWQgeWV0LlxuICAgICAgaWYgKCF0aGlzLl9yZWFkYWJsZVN0YXRlKSB7XG4gICAgICAgIHJldHVyblxuICAgICAgfVxuXG4gICAgICAvLyBCYWNrd2FyZCBjb21wYXRpYmlsaXR5LCB0aGUgdXNlciBpcyBleHBsaWNpdGx5XG4gICAgICAvLyBtYW5hZ2luZyBkZXN0cm95ZWQuXG4gICAgICB0aGlzLl9yZWFkYWJsZVN0YXRlLmRlc3Ryb3llZCA9IHZhbHVlXG4gICAgfVxuICB9LFxuICByZWFkYWJsZUVuZGVkOiB7XG4gICAgX19wcm90b19fOiBudWxsLFxuICAgIGVudW1lcmFibGU6IGZhbHNlLFxuICAgIGdldCgpIHtcbiAgICAgIHJldHVybiB0aGlzLl9yZWFkYWJsZVN0YXRlID8gdGhpcy5fcmVhZGFibGVTdGF0ZS5lbmRFbWl0dGVkIDogZmFsc2VcbiAgICB9XG4gIH1cbn0pXG5PYmplY3REZWZpbmVQcm9wZXJ0aWVzKFJlYWRhYmxlU3RhdGUucHJvdG90eXBlLCB7XG4gIC8vIExlZ2FjeSBnZXR0ZXIgZm9yIGBwaXBlc0NvdW50YC5cbiAgcGlwZXNDb3VudDoge1xuICAgIF9fcHJvdG9fXzogbnVsbCxcbiAgICBnZXQoKSB7XG4gICAgICByZXR1cm4gdGhpcy5waXBlcy5sZW5ndGhcbiAgICB9XG4gIH0sXG4gIC8vIExlZ2FjeSBwcm9wZXJ0eSBmb3IgYHBhdXNlZGAuXG4gIHBhdXNlZDoge1xuICAgIF9fcHJvdG9fXzogbnVsbCxcbiAgICBnZXQoKSB7XG4gICAgICByZXR1cm4gdGhpc1trUGF1c2VkXSAhPT0gZmFsc2VcbiAgICB9LFxuICAgIHNldCh2YWx1ZSkge1xuICAgICAgdGhpc1trUGF1c2VkXSA9ICEhdmFsdWVcbiAgICB9XG4gIH1cbn0pXG5cbi8vIEV4cG9zZWQgZm9yIHRlc3RpbmcgcHVycG9zZXMgb25seS5cblJlYWRhYmxlLl9mcm9tTGlzdCA9IGZyb21MaXN0XG5cbi8vIFBsdWNrIG9mZiBuIGJ5dGVzIGZyb20gYW4gYXJyYXkgb2YgYnVmZmVycy5cbi8vIExlbmd0aCBpcyB0aGUgY29tYmluZWQgbGVuZ3RocyBvZiBhbGwgdGhlIGJ1ZmZlcnMgaW4gdGhlIGxpc3QuXG4vLyBUaGlzIGZ1bmN0aW9uIGlzIGRlc2lnbmVkIHRvIGJlIGlubGluYWJsZSwgc28gcGxlYXNlIHRha2UgY2FyZSB3aGVuIG1ha2luZ1xuLy8gY2hhbmdlcyB0byB0aGUgZnVuY3Rpb24gYm9keS5cbmZ1bmN0aW9uIGZyb21MaXN0KG4sIHN0YXRlKSB7XG4gIC8vIG5vdGhpbmcgYnVmZmVyZWQuXG4gIGlmIChzdGF0ZS5sZW5ndGggPT09IDApIHJldHVybiBudWxsXG4gIGxldCByZXRcbiAgaWYgKHN0YXRlLm9iamVjdE1vZGUpIHJldCA9IHN0YXRlLmJ1ZmZlci5zaGlmdCgpXG4gIGVsc2UgaWYgKCFuIHx8IG4gPj0gc3RhdGUubGVuZ3RoKSB7XG4gICAgLy8gUmVhZCBpdCBhbGwsIHRydW5jYXRlIHRoZSBsaXN0LlxuICAgIGlmIChzdGF0ZS5kZWNvZGVyKSByZXQgPSBzdGF0ZS5idWZmZXIuam9pbignJylcbiAgICBlbHNlIGlmIChzdGF0ZS5idWZmZXIubGVuZ3RoID09PSAxKSByZXQgPSBzdGF0ZS5idWZmZXIuZmlyc3QoKVxuICAgIGVsc2UgcmV0ID0gc3RhdGUuYnVmZmVyLmNvbmNhdChzdGF0ZS5sZW5ndGgpXG4gICAgc3RhdGUuYnVmZmVyLmNsZWFyKClcbiAgfSBlbHNlIHtcbiAgICAvLyByZWFkIHBhcnQgb2YgbGlzdC5cbiAgICByZXQgPSBzdGF0ZS5idWZmZXIuY29uc3VtZShuLCBzdGF0ZS5kZWNvZGVyKVxuICB9XG4gIHJldHVybiByZXRcbn1cbmZ1bmN0aW9uIGVuZFJlYWRhYmxlKHN0cmVhbSkge1xuICBjb25zdCBzdGF0ZSA9IHN0cmVhbS5fcmVhZGFibGVTdGF0ZVxuICBkZWJ1ZygnZW5kUmVhZGFibGUnLCBzdGF0ZS5lbmRFbWl0dGVkKVxuICBpZiAoIXN0YXRlLmVuZEVtaXR0ZWQpIHtcbiAgICBzdGF0ZS5lbmRlZCA9IHRydWVcbiAgICBwcm9jZXNzLm5leHRUaWNrKGVuZFJlYWRhYmxlTlQsIHN0YXRlLCBzdHJlYW0pXG4gIH1cbn1cbmZ1bmN0aW9uIGVuZFJlYWRhYmxlTlQoc3RhdGUsIHN0cmVhbSkge1xuICBkZWJ1ZygnZW5kUmVhZGFibGVOVCcsIHN0YXRlLmVuZEVtaXR0ZWQsIHN0YXRlLmxlbmd0aClcblxuICAvLyBDaGVjayB0aGF0IHdlIGRpZG4ndCBnZXQgb25lIGxhc3QgdW5zaGlmdC5cbiAgaWYgKCFzdGF0ZS5lcnJvcmVkICYmICFzdGF0ZS5jbG9zZUVtaXR0ZWQgJiYgIXN0YXRlLmVuZEVtaXR0ZWQgJiYgc3RhdGUubGVuZ3RoID09PSAwKSB7XG4gICAgc3RhdGUuZW5kRW1pdHRlZCA9IHRydWVcbiAgICBzdHJlYW0uZW1pdCgnZW5kJylcbiAgICBpZiAoc3RyZWFtLndyaXRhYmxlICYmIHN0cmVhbS5hbGxvd0hhbGZPcGVuID09PSBmYWxzZSkge1xuICAgICAgcHJvY2Vzcy5uZXh0VGljayhlbmRXcml0YWJsZU5ULCBzdHJlYW0pXG4gICAgfSBlbHNlIGlmIChzdGF0ZS5hdXRvRGVzdHJveSkge1xuICAgICAgLy8gSW4gY2FzZSBvZiBkdXBsZXggc3RyZWFtcyB3ZSBuZWVkIGEgd2F5IHRvIGRldGVjdFxuICAgICAgLy8gaWYgdGhlIHdyaXRhYmxlIHNpZGUgaXMgcmVhZHkgZm9yIGF1dG9EZXN0cm95IGFzIHdlbGwuXG4gICAgICBjb25zdCB3U3RhdGUgPSBzdHJlYW0uX3dyaXRhYmxlU3RhdGVcbiAgICAgIGNvbnN0IGF1dG9EZXN0cm95ID1cbiAgICAgICAgIXdTdGF0ZSB8fFxuICAgICAgICAod1N0YXRlLmF1dG9EZXN0cm95ICYmXG4gICAgICAgICAgLy8gV2UgZG9uJ3QgZXhwZWN0IHRoZSB3cml0YWJsZSB0byBldmVyICdmaW5pc2gnXG4gICAgICAgICAgLy8gaWYgd3JpdGFibGUgaXMgZXhwbGljaXRseSBzZXQgdG8gZmFsc2UuXG4gICAgICAgICAgKHdTdGF0ZS5maW5pc2hlZCB8fCB3U3RhdGUud3JpdGFibGUgPT09IGZhbHNlKSlcbiAgICAgIGlmIChhdXRvRGVzdHJveSkge1xuICAgICAgICBzdHJlYW0uZGVzdHJveSgpXG4gICAgICB9XG4gICAgfVxuICB9XG59XG5mdW5jdGlvbiBlbmRXcml0YWJsZU5UKHN0cmVhbSkge1xuICBjb25zdCB3cml0YWJsZSA9IHN0cmVhbS53cml0YWJsZSAmJiAhc3RyZWFtLndyaXRhYmxlRW5kZWQgJiYgIXN0cmVhbS5kZXN0cm95ZWRcbiAgaWYgKHdyaXRhYmxlKSB7XG4gICAgc3RyZWFtLmVuZCgpXG4gIH1cbn1cblJlYWRhYmxlLmZyb20gPSBmdW5jdGlvbiAoaXRlcmFibGUsIG9wdHMpIHtcbiAgcmV0dXJuIGZyb20oUmVhZGFibGUsIGl0ZXJhYmxlLCBvcHRzKVxufVxubGV0IHdlYlN0cmVhbXNBZGFwdGVyc1xuXG4vLyBMYXp5IHRvIGF2b2lkIGNpcmN1bGFyIHJlZmVyZW5jZXNcbmZ1bmN0aW9uIGxhenlXZWJTdHJlYW1zKCkge1xuICBpZiAod2ViU3RyZWFtc0FkYXB0ZXJzID09PSB1bmRlZmluZWQpIHdlYlN0cmVhbXNBZGFwdGVycyA9IHt9XG4gIHJldHVybiB3ZWJTdHJlYW1zQWRhcHRlcnNcbn1cblJlYWRhYmxlLmZyb21XZWIgPSBmdW5jdGlvbiAocmVhZGFibGVTdHJlYW0sIG9wdGlvbnMpIHtcbiAgcmV0dXJuIGxhenlXZWJTdHJlYW1zKCkubmV3U3RyZWFtUmVhZGFibGVGcm9tUmVhZGFibGVTdHJlYW0ocmVhZGFibGVTdHJlYW0sIG9wdGlvbnMpXG59XG5SZWFkYWJsZS50b1dlYiA9IGZ1bmN0aW9uIChzdHJlYW1SZWFkYWJsZSwgb3B0aW9ucykge1xuICByZXR1cm4gbGF6eVdlYlN0cmVhbXMoKS5uZXdSZWFkYWJsZVN0cmVhbUZyb21TdHJlYW1SZWFkYWJsZShzdHJlYW1SZWFkYWJsZSwgb3B0aW9ucylcbn1cblJlYWRhYmxlLndyYXAgPSBmdW5jdGlvbiAoc3JjLCBvcHRpb25zKSB7XG4gIHZhciBfcmVmLCBfc3JjJHJlYWRhYmxlT2JqZWN0TW9cbiAgcmV0dXJuIG5ldyBSZWFkYWJsZSh7XG4gICAgb2JqZWN0TW9kZTpcbiAgICAgIChfcmVmID1cbiAgICAgICAgKF9zcmMkcmVhZGFibGVPYmplY3RNbyA9IHNyYy5yZWFkYWJsZU9iamVjdE1vZGUpICE9PSBudWxsICYmIF9zcmMkcmVhZGFibGVPYmplY3RNbyAhPT0gdW5kZWZpbmVkXG4gICAgICAgICAgPyBfc3JjJHJlYWRhYmxlT2JqZWN0TW9cbiAgICAgICAgICA6IHNyYy5vYmplY3RNb2RlKSAhPT0gbnVsbCAmJiBfcmVmICE9PSB1bmRlZmluZWRcbiAgICAgICAgPyBfcmVmXG4gICAgICAgIDogdHJ1ZSxcbiAgICAuLi5vcHRpb25zLFxuICAgIGRlc3Ryb3koZXJyLCBjYWxsYmFjaykge1xuICAgICAgZGVzdHJveUltcGwuZGVzdHJveWVyKHNyYywgZXJyKVxuICAgICAgY2FsbGJhY2soZXJyKVxuICAgIH1cbiAgfSkud3JhcChzcmMpXG59XG4iLAogICAgIi8qIHJlcGxhY2VtZW50IHN0YXJ0ICovXG5cbmNvbnN0IHByb2Nlc3MgPSByZXF1aXJlKCdwcm9jZXNzLycpXG5cbi8qIHJlcGxhY2VtZW50IGVuZCAqL1xuLy8gQ29weXJpZ2h0IEpveWVudCwgSW5jLiBhbmQgb3RoZXIgTm9kZSBjb250cmlidXRvcnMuXG4vL1xuLy8gUGVybWlzc2lvbiBpcyBoZXJlYnkgZ3JhbnRlZCwgZnJlZSBvZiBjaGFyZ2UsIHRvIGFueSBwZXJzb24gb2J0YWluaW5nIGFcbi8vIGNvcHkgb2YgdGhpcyBzb2Z0d2FyZSBhbmQgYXNzb2NpYXRlZCBkb2N1bWVudGF0aW9uIGZpbGVzICh0aGVcbi8vIFwiU29mdHdhcmVcIiksIHRvIGRlYWwgaW4gdGhlIFNvZnR3YXJlIHdpdGhvdXQgcmVzdHJpY3Rpb24sIGluY2x1ZGluZ1xuLy8gd2l0aG91dCBsaW1pdGF0aW9uIHRoZSByaWdodHMgdG8gdXNlLCBjb3B5LCBtb2RpZnksIG1lcmdlLCBwdWJsaXNoLFxuLy8gZGlzdHJpYnV0ZSwgc3VibGljZW5zZSwgYW5kL29yIHNlbGwgY29waWVzIG9mIHRoZSBTb2Z0d2FyZSwgYW5kIHRvIHBlcm1pdFxuLy8gcGVyc29ucyB0byB3aG9tIHRoZSBTb2Z0d2FyZSBpcyBmdXJuaXNoZWQgdG8gZG8gc28sIHN1YmplY3QgdG8gdGhlXG4vLyBmb2xsb3dpbmcgY29uZGl0aW9uczpcbi8vXG4vLyBUaGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBzaGFsbCBiZSBpbmNsdWRlZFxuLy8gaW4gYWxsIGNvcGllcyBvciBzdWJzdGFudGlhbCBwb3J0aW9ucyBvZiB0aGUgU29mdHdhcmUuXG4vL1xuLy8gVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEIFwiQVMgSVNcIiwgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwgRVhQUkVTU1xuLy8gT1IgSU1QTElFRCwgSU5DTFVESU5HIEJVVCBOT1QgTElNSVRFRCBUTyBUSEUgV0FSUkFOVElFUyBPRlxuLy8gTUVSQ0hBTlRBQklMSVRZLCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBTkQgTk9OSU5GUklOR0VNRU5ULiBJTlxuLy8gTk8gRVZFTlQgU0hBTEwgVEhFIEFVVEhPUlMgT1IgQ09QWVJJR0hUIEhPTERFUlMgQkUgTElBQkxFIEZPUiBBTlkgQ0xBSU0sXG4vLyBEQU1BR0VTIE9SIE9USEVSIExJQUJJTElUWSwgV0hFVEhFUiBJTiBBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsIFRPUlQgT1Jcbi8vIE9USEVSV0lTRSwgQVJJU0lORyBGUk9NLCBPVVQgT0YgT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBTT0ZUV0FSRSBPUiBUSEVcbi8vIFVTRSBPUiBPVEhFUiBERUFMSU5HUyBJTiBUSEUgU09GVFdBUkUuXG5cbi8vIEEgYml0IHNpbXBsZXIgdGhhbiByZWFkYWJsZSBzdHJlYW1zLlxuLy8gSW1wbGVtZW50IGFuIGFzeW5jIC5fd3JpdGUoY2h1bmssIGVuY29kaW5nLCBjYiksIGFuZCBpdCdsbCBoYW5kbGUgYWxsXG4vLyB0aGUgZHJhaW4gZXZlbnQgZW1pc3Npb24gYW5kIGJ1ZmZlcmluZy5cblxuOygndXNlIHN0cmljdCcpXG5jb25zdCB7XG4gIEFycmF5UHJvdG90eXBlU2xpY2UsXG4gIEVycm9yLFxuICBGdW5jdGlvblByb3RvdHlwZVN5bWJvbEhhc0luc3RhbmNlLFxuICBPYmplY3REZWZpbmVQcm9wZXJ0eSxcbiAgT2JqZWN0RGVmaW5lUHJvcGVydGllcyxcbiAgT2JqZWN0U2V0UHJvdG90eXBlT2YsXG4gIFN0cmluZ1Byb3RvdHlwZVRvTG93ZXJDYXNlLFxuICBTeW1ib2wsXG4gIFN5bWJvbEhhc0luc3RhbmNlXG59ID0gcmVxdWlyZSgnLi4vLi4vb3Vycy9wcmltb3JkaWFscycpXG5tb2R1bGUuZXhwb3J0cyA9IFdyaXRhYmxlXG5Xcml0YWJsZS5Xcml0YWJsZVN0YXRlID0gV3JpdGFibGVTdGF0ZVxuY29uc3QgeyBFdmVudEVtaXR0ZXI6IEVFIH0gPSByZXF1aXJlKCdldmVudHMnKVxuY29uc3QgU3RyZWFtID0gcmVxdWlyZSgnLi9sZWdhY3knKS5TdHJlYW1cbmNvbnN0IHsgQnVmZmVyIH0gPSByZXF1aXJlKCdidWZmZXInKVxuY29uc3QgZGVzdHJveUltcGwgPSByZXF1aXJlKCcuL2Rlc3Ryb3knKVxuY29uc3QgeyBhZGRBYm9ydFNpZ25hbCB9ID0gcmVxdWlyZSgnLi9hZGQtYWJvcnQtc2lnbmFsJylcbmNvbnN0IHsgZ2V0SGlnaFdhdGVyTWFyaywgZ2V0RGVmYXVsdEhpZ2hXYXRlck1hcmsgfSA9IHJlcXVpcmUoJy4vc3RhdGUnKVxuY29uc3Qge1xuICBFUlJfSU5WQUxJRF9BUkdfVFlQRSxcbiAgRVJSX01FVEhPRF9OT1RfSU1QTEVNRU5URUQsXG4gIEVSUl9NVUxUSVBMRV9DQUxMQkFDSyxcbiAgRVJSX1NUUkVBTV9DQU5OT1RfUElQRSxcbiAgRVJSX1NUUkVBTV9ERVNUUk9ZRUQsXG4gIEVSUl9TVFJFQU1fQUxSRUFEWV9GSU5JU0hFRCxcbiAgRVJSX1NUUkVBTV9OVUxMX1ZBTFVFUyxcbiAgRVJSX1NUUkVBTV9XUklURV9BRlRFUl9FTkQsXG4gIEVSUl9VTktOT1dOX0VOQ09ESU5HXG59ID0gcmVxdWlyZSgnLi4vLi4vb3Vycy9lcnJvcnMnKS5jb2Rlc1xuY29uc3QgeyBlcnJvck9yRGVzdHJveSB9ID0gZGVzdHJveUltcGxcbk9iamVjdFNldFByb3RvdHlwZU9mKFdyaXRhYmxlLnByb3RvdHlwZSwgU3RyZWFtLnByb3RvdHlwZSlcbk9iamVjdFNldFByb3RvdHlwZU9mKFdyaXRhYmxlLCBTdHJlYW0pXG5mdW5jdGlvbiBub3AoKSB7fVxuY29uc3Qga09uRmluaXNoZWQgPSBTeW1ib2woJ2tPbkZpbmlzaGVkJylcbmZ1bmN0aW9uIFdyaXRhYmxlU3RhdGUob3B0aW9ucywgc3RyZWFtLCBpc0R1cGxleCkge1xuICAvLyBEdXBsZXggc3RyZWFtcyBhcmUgYm90aCByZWFkYWJsZSBhbmQgd3JpdGFibGUsIGJ1dCBzaGFyZVxuICAvLyB0aGUgc2FtZSBvcHRpb25zIG9iamVjdC5cbiAgLy8gSG93ZXZlciwgc29tZSBjYXNlcyByZXF1aXJlIHNldHRpbmcgb3B0aW9ucyB0byBkaWZmZXJlbnRcbiAgLy8gdmFsdWVzIGZvciB0aGUgcmVhZGFibGUgYW5kIHRoZSB3cml0YWJsZSBzaWRlcyBvZiB0aGUgZHVwbGV4IHN0cmVhbSxcbiAgLy8gZS5nLiBvcHRpb25zLnJlYWRhYmxlT2JqZWN0TW9kZSB2cy4gb3B0aW9ucy53cml0YWJsZU9iamVjdE1vZGUsIGV0Yy5cbiAgaWYgKHR5cGVvZiBpc0R1cGxleCAhPT0gJ2Jvb2xlYW4nKSBpc0R1cGxleCA9IHN0cmVhbSBpbnN0YW5jZW9mIHJlcXVpcmUoJy4vZHVwbGV4JylcblxuICAvLyBPYmplY3Qgc3RyZWFtIGZsYWcgdG8gaW5kaWNhdGUgd2hldGhlciBvciBub3QgdGhpcyBzdHJlYW1cbiAgLy8gY29udGFpbnMgYnVmZmVycyBvciBvYmplY3RzLlxuICB0aGlzLm9iamVjdE1vZGUgPSAhIShvcHRpb25zICYmIG9wdGlvbnMub2JqZWN0TW9kZSlcbiAgaWYgKGlzRHVwbGV4KSB0aGlzLm9iamVjdE1vZGUgPSB0aGlzLm9iamVjdE1vZGUgfHwgISEob3B0aW9ucyAmJiBvcHRpb25zLndyaXRhYmxlT2JqZWN0TW9kZSlcblxuICAvLyBUaGUgcG9pbnQgYXQgd2hpY2ggd3JpdGUoKSBzdGFydHMgcmV0dXJuaW5nIGZhbHNlXG4gIC8vIE5vdGU6IDAgaXMgYSB2YWxpZCB2YWx1ZSwgbWVhbnMgdGhhdCB3ZSBhbHdheXMgcmV0dXJuIGZhbHNlIGlmXG4gIC8vIHRoZSBlbnRpcmUgYnVmZmVyIGlzIG5vdCBmbHVzaGVkIGltbWVkaWF0ZWx5IG9uIHdyaXRlKCkuXG4gIHRoaXMuaGlnaFdhdGVyTWFyayA9IG9wdGlvbnNcbiAgICA/IGdldEhpZ2hXYXRlck1hcmsodGhpcywgb3B0aW9ucywgJ3dyaXRhYmxlSGlnaFdhdGVyTWFyaycsIGlzRHVwbGV4KVxuICAgIDogZ2V0RGVmYXVsdEhpZ2hXYXRlck1hcmsoZmFsc2UpXG5cbiAgLy8gaWYgX2ZpbmFsIGhhcyBiZWVuIGNhbGxlZC5cbiAgdGhpcy5maW5hbENhbGxlZCA9IGZhbHNlXG5cbiAgLy8gZHJhaW4gZXZlbnQgZmxhZy5cbiAgdGhpcy5uZWVkRHJhaW4gPSBmYWxzZVxuICAvLyBBdCB0aGUgc3RhcnQgb2YgY2FsbGluZyBlbmQoKVxuICB0aGlzLmVuZGluZyA9IGZhbHNlXG4gIC8vIFdoZW4gZW5kKCkgaGFzIGJlZW4gY2FsbGVkLCBhbmQgcmV0dXJuZWQuXG4gIHRoaXMuZW5kZWQgPSBmYWxzZVxuICAvLyBXaGVuICdmaW5pc2gnIGlzIGVtaXR0ZWQuXG4gIHRoaXMuZmluaXNoZWQgPSBmYWxzZVxuXG4gIC8vIEhhcyBpdCBiZWVuIGRlc3Ryb3llZFxuICB0aGlzLmRlc3Ryb3llZCA9IGZhbHNlXG5cbiAgLy8gU2hvdWxkIHdlIGRlY29kZSBzdHJpbmdzIGludG8gYnVmZmVycyBiZWZvcmUgcGFzc2luZyB0byBfd3JpdGU/XG4gIC8vIHRoaXMgaXMgaGVyZSBzbyB0aGF0IHNvbWUgbm9kZS1jb3JlIHN0cmVhbXMgY2FuIG9wdGltaXplIHN0cmluZ1xuICAvLyBoYW5kbGluZyBhdCBhIGxvd2VyIGxldmVsLlxuICBjb25zdCBub0RlY29kZSA9ICEhKG9wdGlvbnMgJiYgb3B0aW9ucy5kZWNvZGVTdHJpbmdzID09PSBmYWxzZSlcbiAgdGhpcy5kZWNvZGVTdHJpbmdzID0gIW5vRGVjb2RlXG5cbiAgLy8gQ3J5cHRvIGlzIGtpbmQgb2Ygb2xkIGFuZCBjcnVzdHkuICBIaXN0b3JpY2FsbHksIGl0cyBkZWZhdWx0IHN0cmluZ1xuICAvLyBlbmNvZGluZyBpcyAnYmluYXJ5JyBzbyB3ZSBoYXZlIHRvIG1ha2UgdGhpcyBjb25maWd1cmFibGUuXG4gIC8vIEV2ZXJ5dGhpbmcgZWxzZSBpbiB0aGUgdW5pdmVyc2UgdXNlcyAndXRmOCcsIHRob3VnaC5cbiAgdGhpcy5kZWZhdWx0RW5jb2RpbmcgPSAob3B0aW9ucyAmJiBvcHRpb25zLmRlZmF1bHRFbmNvZGluZykgfHwgJ3V0ZjgnXG5cbiAgLy8gTm90IGFuIGFjdHVhbCBidWZmZXIgd2Uga2VlcCB0cmFjayBvZiwgYnV0IGEgbWVhc3VyZW1lbnRcbiAgLy8gb2YgaG93IG11Y2ggd2UncmUgd2FpdGluZyB0byBnZXQgcHVzaGVkIHRvIHNvbWUgdW5kZXJseWluZ1xuICAvLyBzb2NrZXQgb3IgZmlsZS5cbiAgdGhpcy5sZW5ndGggPSAwXG5cbiAgLy8gQSBmbGFnIHRvIHNlZSB3aGVuIHdlJ3JlIGluIHRoZSBtaWRkbGUgb2YgYSB3cml0ZS5cbiAgdGhpcy53cml0aW5nID0gZmFsc2VcblxuICAvLyBXaGVuIHRydWUgYWxsIHdyaXRlcyB3aWxsIGJlIGJ1ZmZlcmVkIHVudGlsIC51bmNvcmsoKSBjYWxsLlxuICB0aGlzLmNvcmtlZCA9IDBcblxuICAvLyBBIGZsYWcgdG8gYmUgYWJsZSB0byB0ZWxsIGlmIHRoZSBvbndyaXRlIGNiIGlzIGNhbGxlZCBpbW1lZGlhdGVseSxcbiAgLy8gb3Igb24gYSBsYXRlciB0aWNrLiAgV2Ugc2V0IHRoaXMgdG8gdHJ1ZSBhdCBmaXJzdCwgYmVjYXVzZSBhbnlcbiAgLy8gYWN0aW9ucyB0aGF0IHNob3VsZG4ndCBoYXBwZW4gdW50aWwgXCJsYXRlclwiIHNob3VsZCBnZW5lcmFsbHkgYWxzb1xuICAvLyBub3QgaGFwcGVuIGJlZm9yZSB0aGUgZmlyc3Qgd3JpdGUgY2FsbC5cbiAgdGhpcy5zeW5jID0gdHJ1ZVxuXG4gIC8vIEEgZmxhZyB0byBrbm93IGlmIHdlJ3JlIHByb2Nlc3NpbmcgcHJldmlvdXNseSBidWZmZXJlZCBpdGVtcywgd2hpY2hcbiAgLy8gbWF5IGNhbGwgdGhlIF93cml0ZSgpIGNhbGxiYWNrIGluIHRoZSBzYW1lIHRpY2ssIHNvIHRoYXQgd2UgZG9uJ3RcbiAgLy8gZW5kIHVwIGluIGFuIG92ZXJsYXBwZWQgb253cml0ZSBzaXR1YXRpb24uXG4gIHRoaXMuYnVmZmVyUHJvY2Vzc2luZyA9IGZhbHNlXG5cbiAgLy8gVGhlIGNhbGxiYWNrIHRoYXQncyBwYXNzZWQgdG8gX3dyaXRlKGNodW5rLCBjYikuXG4gIHRoaXMub253cml0ZSA9IG9ud3JpdGUuYmluZCh1bmRlZmluZWQsIHN0cmVhbSlcblxuICAvLyBUaGUgY2FsbGJhY2sgdGhhdCB0aGUgdXNlciBzdXBwbGllcyB0byB3cml0ZShjaHVuaywgZW5jb2RpbmcsIGNiKS5cbiAgdGhpcy53cml0ZWNiID0gbnVsbFxuXG4gIC8vIFRoZSBhbW91bnQgdGhhdCBpcyBiZWluZyB3cml0dGVuIHdoZW4gX3dyaXRlIGlzIGNhbGxlZC5cbiAgdGhpcy53cml0ZWxlbiA9IDBcblxuICAvLyBTdG9yYWdlIGZvciBkYXRhIHBhc3NlZCB0byB0aGUgYWZ0ZXJXcml0ZSgpIGNhbGxiYWNrIGluIGNhc2Ugb2ZcbiAgLy8gc3luY2hyb25vdXMgX3dyaXRlKCkgY29tcGxldGlvbi5cbiAgdGhpcy5hZnRlcldyaXRlVGlja0luZm8gPSBudWxsXG4gIHJlc2V0QnVmZmVyKHRoaXMpXG5cbiAgLy8gTnVtYmVyIG9mIHBlbmRpbmcgdXNlci1zdXBwbGllZCB3cml0ZSBjYWxsYmFja3NcbiAgLy8gdGhpcyBtdXN0IGJlIDAgYmVmb3JlICdmaW5pc2gnIGNhbiBiZSBlbWl0dGVkLlxuICB0aGlzLnBlbmRpbmdjYiA9IDBcblxuICAvLyBTdHJlYW0gaXMgc3RpbGwgYmVpbmcgY29uc3RydWN0ZWQgYW5kIGNhbm5vdCBiZVxuICAvLyBkZXN0cm95ZWQgdW50aWwgY29uc3RydWN0aW9uIGZpbmlzaGVkIG9yIGZhaWxlZC5cbiAgLy8gQXN5bmMgY29uc3RydWN0aW9uIGlzIG9wdCBpbiwgdGhlcmVmb3JlIHdlIHN0YXJ0IGFzXG4gIC8vIGNvbnN0cnVjdGVkLlxuICB0aGlzLmNvbnN0cnVjdGVkID0gdHJ1ZVxuXG4gIC8vIEVtaXQgcHJlZmluaXNoIGlmIHRoZSBvbmx5IHRoaW5nIHdlJ3JlIHdhaXRpbmcgZm9yIGlzIF93cml0ZSBjYnNcbiAgLy8gVGhpcyBpcyByZWxldmFudCBmb3Igc3luY2hyb25vdXMgVHJhbnNmb3JtIHN0cmVhbXMuXG4gIHRoaXMucHJlZmluaXNoZWQgPSBmYWxzZVxuXG4gIC8vIFRydWUgaWYgdGhlIGVycm9yIHdhcyBhbHJlYWR5IGVtaXR0ZWQgYW5kIHNob3VsZCBub3QgYmUgdGhyb3duIGFnYWluLlxuICB0aGlzLmVycm9yRW1pdHRlZCA9IGZhbHNlXG5cbiAgLy8gU2hvdWxkIGNsb3NlIGJlIGVtaXR0ZWQgb24gZGVzdHJveS4gRGVmYXVsdHMgdG8gdHJ1ZS5cbiAgdGhpcy5lbWl0Q2xvc2UgPSAhb3B0aW9ucyB8fCBvcHRpb25zLmVtaXRDbG9zZSAhPT0gZmFsc2VcblxuICAvLyBTaG91bGQgLmRlc3Ryb3koKSBiZSBjYWxsZWQgYWZ0ZXIgJ2ZpbmlzaCcgKGFuZCBwb3RlbnRpYWxseSAnZW5kJykuXG4gIHRoaXMuYXV0b0Rlc3Ryb3kgPSAhb3B0aW9ucyB8fCBvcHRpb25zLmF1dG9EZXN0cm95ICE9PSBmYWxzZVxuXG4gIC8vIEluZGljYXRlcyB3aGV0aGVyIHRoZSBzdHJlYW0gaGFzIGVycm9yZWQuIFdoZW4gdHJ1ZSBhbGwgd3JpdGUoKSBjYWxsc1xuICAvLyBzaG91bGQgcmV0dXJuIGZhbHNlLiBUaGlzIGlzIG5lZWRlZCBzaW5jZSB3aGVuIGF1dG9EZXN0cm95XG4gIC8vIGlzIGRpc2FibGVkIHdlIG5lZWQgYSB3YXkgdG8gdGVsbCB3aGV0aGVyIHRoZSBzdHJlYW0gaGFzIGZhaWxlZC5cbiAgdGhpcy5lcnJvcmVkID0gbnVsbFxuXG4gIC8vIEluZGljYXRlcyB3aGV0aGVyIHRoZSBzdHJlYW0gaGFzIGZpbmlzaGVkIGRlc3Ryb3lpbmcuXG4gIHRoaXMuY2xvc2VkID0gZmFsc2VcblxuICAvLyBUcnVlIGlmIGNsb3NlIGhhcyBiZWVuIGVtaXR0ZWQgb3Igd291bGQgaGF2ZSBiZWVuIGVtaXR0ZWRcbiAgLy8gZGVwZW5kaW5nIG9uIGVtaXRDbG9zZS5cbiAgdGhpcy5jbG9zZUVtaXR0ZWQgPSBmYWxzZVxuICB0aGlzW2tPbkZpbmlzaGVkXSA9IFtdXG59XG5mdW5jdGlvbiByZXNldEJ1ZmZlcihzdGF0ZSkge1xuICBzdGF0ZS5idWZmZXJlZCA9IFtdXG4gIHN0YXRlLmJ1ZmZlcmVkSW5kZXggPSAwXG4gIHN0YXRlLmFsbEJ1ZmZlcnMgPSB0cnVlXG4gIHN0YXRlLmFsbE5vb3AgPSB0cnVlXG59XG5Xcml0YWJsZVN0YXRlLnByb3RvdHlwZS5nZXRCdWZmZXIgPSBmdW5jdGlvbiBnZXRCdWZmZXIoKSB7XG4gIHJldHVybiBBcnJheVByb3RvdHlwZVNsaWNlKHRoaXMuYnVmZmVyZWQsIHRoaXMuYnVmZmVyZWRJbmRleClcbn1cbk9iamVjdERlZmluZVByb3BlcnR5KFdyaXRhYmxlU3RhdGUucHJvdG90eXBlLCAnYnVmZmVyZWRSZXF1ZXN0Q291bnQnLCB7XG4gIF9fcHJvdG9fXzogbnVsbCxcbiAgZ2V0KCkge1xuICAgIHJldHVybiB0aGlzLmJ1ZmZlcmVkLmxlbmd0aCAtIHRoaXMuYnVmZmVyZWRJbmRleFxuICB9XG59KVxuZnVuY3Rpb24gV3JpdGFibGUob3B0aW9ucykge1xuICAvLyBXcml0YWJsZSBjdG9yIGlzIGFwcGxpZWQgdG8gRHVwbGV4ZXMsIHRvby5cbiAgLy8gYHJlYWxIYXNJbnN0YW5jZWAgaXMgbmVjZXNzYXJ5IGJlY2F1c2UgdXNpbmcgcGxhaW4gYGluc3RhbmNlb2ZgXG4gIC8vIHdvdWxkIHJldHVybiBmYWxzZSwgYXMgbm8gYF93cml0YWJsZVN0YXRlYCBwcm9wZXJ0eSBpcyBhdHRhY2hlZC5cblxuICAvLyBUcnlpbmcgdG8gdXNlIHRoZSBjdXN0b20gYGluc3RhbmNlb2ZgIGZvciBXcml0YWJsZSBoZXJlIHdpbGwgYWxzbyBicmVhayB0aGVcbiAgLy8gTm9kZS5qcyBMYXp5VHJhbnNmb3JtIGltcGxlbWVudGF0aW9uLCB3aGljaCBoYXMgYSBub24tdHJpdmlhbCBnZXR0ZXIgZm9yXG4gIC8vIGBfd3JpdGFibGVTdGF0ZWAgdGhhdCB3b3VsZCBsZWFkIHRvIGluZmluaXRlIHJlY3Vyc2lvbi5cblxuICAvLyBDaGVja2luZyBmb3IgYSBTdHJlYW0uRHVwbGV4IGluc3RhbmNlIGlzIGZhc3RlciBoZXJlIGluc3RlYWQgb2YgaW5zaWRlXG4gIC8vIHRoZSBXcml0YWJsZVN0YXRlIGNvbnN0cnVjdG9yLCBhdCBsZWFzdCB3aXRoIFY4IDYuNS5cbiAgY29uc3QgaXNEdXBsZXggPSB0aGlzIGluc3RhbmNlb2YgcmVxdWlyZSgnLi9kdXBsZXgnKVxuICBpZiAoIWlzRHVwbGV4ICYmICFGdW5jdGlvblByb3RvdHlwZVN5bWJvbEhhc0luc3RhbmNlKFdyaXRhYmxlLCB0aGlzKSkgcmV0dXJuIG5ldyBXcml0YWJsZShvcHRpb25zKVxuICB0aGlzLl93cml0YWJsZVN0YXRlID0gbmV3IFdyaXRhYmxlU3RhdGUob3B0aW9ucywgdGhpcywgaXNEdXBsZXgpXG4gIGlmIChvcHRpb25zKSB7XG4gICAgaWYgKHR5cGVvZiBvcHRpb25zLndyaXRlID09PSAnZnVuY3Rpb24nKSB0aGlzLl93cml0ZSA9IG9wdGlvbnMud3JpdGVcbiAgICBpZiAodHlwZW9mIG9wdGlvbnMud3JpdGV2ID09PSAnZnVuY3Rpb24nKSB0aGlzLl93cml0ZXYgPSBvcHRpb25zLndyaXRldlxuICAgIGlmICh0eXBlb2Ygb3B0aW9ucy5kZXN0cm95ID09PSAnZnVuY3Rpb24nKSB0aGlzLl9kZXN0cm95ID0gb3B0aW9ucy5kZXN0cm95XG4gICAgaWYgKHR5cGVvZiBvcHRpb25zLmZpbmFsID09PSAnZnVuY3Rpb24nKSB0aGlzLl9maW5hbCA9IG9wdGlvbnMuZmluYWxcbiAgICBpZiAodHlwZW9mIG9wdGlvbnMuY29uc3RydWN0ID09PSAnZnVuY3Rpb24nKSB0aGlzLl9jb25zdHJ1Y3QgPSBvcHRpb25zLmNvbnN0cnVjdFxuICAgIGlmIChvcHRpb25zLnNpZ25hbCkgYWRkQWJvcnRTaWduYWwob3B0aW9ucy5zaWduYWwsIHRoaXMpXG4gIH1cbiAgU3RyZWFtLmNhbGwodGhpcywgb3B0aW9ucylcbiAgZGVzdHJveUltcGwuY29uc3RydWN0KHRoaXMsICgpID0+IHtcbiAgICBjb25zdCBzdGF0ZSA9IHRoaXMuX3dyaXRhYmxlU3RhdGVcbiAgICBpZiAoIXN0YXRlLndyaXRpbmcpIHtcbiAgICAgIGNsZWFyQnVmZmVyKHRoaXMsIHN0YXRlKVxuICAgIH1cbiAgICBmaW5pc2hNYXliZSh0aGlzLCBzdGF0ZSlcbiAgfSlcbn1cbk9iamVjdERlZmluZVByb3BlcnR5KFdyaXRhYmxlLCBTeW1ib2xIYXNJbnN0YW5jZSwge1xuICBfX3Byb3RvX186IG51bGwsXG4gIHZhbHVlOiBmdW5jdGlvbiAob2JqZWN0KSB7XG4gICAgaWYgKEZ1bmN0aW9uUHJvdG90eXBlU3ltYm9sSGFzSW5zdGFuY2UodGhpcywgb2JqZWN0KSkgcmV0dXJuIHRydWVcbiAgICBpZiAodGhpcyAhPT0gV3JpdGFibGUpIHJldHVybiBmYWxzZVxuICAgIHJldHVybiBvYmplY3QgJiYgb2JqZWN0Ll93cml0YWJsZVN0YXRlIGluc3RhbmNlb2YgV3JpdGFibGVTdGF0ZVxuICB9XG59KVxuXG4vLyBPdGhlcndpc2UgcGVvcGxlIGNhbiBwaXBlIFdyaXRhYmxlIHN0cmVhbXMsIHdoaWNoIGlzIGp1c3Qgd3JvbmcuXG5Xcml0YWJsZS5wcm90b3R5cGUucGlwZSA9IGZ1bmN0aW9uICgpIHtcbiAgZXJyb3JPckRlc3Ryb3kodGhpcywgbmV3IEVSUl9TVFJFQU1fQ0FOTk9UX1BJUEUoKSlcbn1cbmZ1bmN0aW9uIF93cml0ZShzdHJlYW0sIGNodW5rLCBlbmNvZGluZywgY2IpIHtcbiAgY29uc3Qgc3RhdGUgPSBzdHJlYW0uX3dyaXRhYmxlU3RhdGVcbiAgaWYgKHR5cGVvZiBlbmNvZGluZyA9PT0gJ2Z1bmN0aW9uJykge1xuICAgIGNiID0gZW5jb2RpbmdcbiAgICBlbmNvZGluZyA9IHN0YXRlLmRlZmF1bHRFbmNvZGluZ1xuICB9IGVsc2Uge1xuICAgIGlmICghZW5jb2RpbmcpIGVuY29kaW5nID0gc3RhdGUuZGVmYXVsdEVuY29kaW5nXG4gICAgZWxzZSBpZiAoZW5jb2RpbmcgIT09ICdidWZmZXInICYmICFCdWZmZXIuaXNFbmNvZGluZyhlbmNvZGluZykpIHRocm93IG5ldyBFUlJfVU5LTk9XTl9FTkNPRElORyhlbmNvZGluZylcbiAgICBpZiAodHlwZW9mIGNiICE9PSAnZnVuY3Rpb24nKSBjYiA9IG5vcFxuICB9XG4gIGlmIChjaHVuayA9PT0gbnVsbCkge1xuICAgIHRocm93IG5ldyBFUlJfU1RSRUFNX05VTExfVkFMVUVTKClcbiAgfSBlbHNlIGlmICghc3RhdGUub2JqZWN0TW9kZSkge1xuICAgIGlmICh0eXBlb2YgY2h1bmsgPT09ICdzdHJpbmcnKSB7XG4gICAgICBpZiAoc3RhdGUuZGVjb2RlU3RyaW5ncyAhPT0gZmFsc2UpIHtcbiAgICAgICAgY2h1bmsgPSBCdWZmZXIuZnJvbShjaHVuaywgZW5jb2RpbmcpXG4gICAgICAgIGVuY29kaW5nID0gJ2J1ZmZlcidcbiAgICAgIH1cbiAgICB9IGVsc2UgaWYgKGNodW5rIGluc3RhbmNlb2YgQnVmZmVyKSB7XG4gICAgICBlbmNvZGluZyA9ICdidWZmZXInXG4gICAgfSBlbHNlIGlmIChTdHJlYW0uX2lzVWludDhBcnJheShjaHVuaykpIHtcbiAgICAgIGNodW5rID0gU3RyZWFtLl91aW50OEFycmF5VG9CdWZmZXIoY2h1bmspXG4gICAgICBlbmNvZGluZyA9ICdidWZmZXInXG4gICAgfSBlbHNlIHtcbiAgICAgIHRocm93IG5ldyBFUlJfSU5WQUxJRF9BUkdfVFlQRSgnY2h1bmsnLCBbJ3N0cmluZycsICdCdWZmZXInLCAnVWludDhBcnJheSddLCBjaHVuaylcbiAgICB9XG4gIH1cbiAgbGV0IGVyclxuICBpZiAoc3RhdGUuZW5kaW5nKSB7XG4gICAgZXJyID0gbmV3IEVSUl9TVFJFQU1fV1JJVEVfQUZURVJfRU5EKClcbiAgfSBlbHNlIGlmIChzdGF0ZS5kZXN0cm95ZWQpIHtcbiAgICBlcnIgPSBuZXcgRVJSX1NUUkVBTV9ERVNUUk9ZRUQoJ3dyaXRlJylcbiAgfVxuICBpZiAoZXJyKSB7XG4gICAgcHJvY2Vzcy5uZXh0VGljayhjYiwgZXJyKVxuICAgIGVycm9yT3JEZXN0cm95KHN0cmVhbSwgZXJyLCB0cnVlKVxuICAgIHJldHVybiBlcnJcbiAgfVxuICBzdGF0ZS5wZW5kaW5nY2IrK1xuICByZXR1cm4gd3JpdGVPckJ1ZmZlcihzdHJlYW0sIHN0YXRlLCBjaHVuaywgZW5jb2RpbmcsIGNiKVxufVxuV3JpdGFibGUucHJvdG90eXBlLndyaXRlID0gZnVuY3Rpb24gKGNodW5rLCBlbmNvZGluZywgY2IpIHtcbiAgcmV0dXJuIF93cml0ZSh0aGlzLCBjaHVuaywgZW5jb2RpbmcsIGNiKSA9PT0gdHJ1ZVxufVxuV3JpdGFibGUucHJvdG90eXBlLmNvcmsgPSBmdW5jdGlvbiAoKSB7XG4gIHRoaXMuX3dyaXRhYmxlU3RhdGUuY29ya2VkKytcbn1cbldyaXRhYmxlLnByb3RvdHlwZS51bmNvcmsgPSBmdW5jdGlvbiAoKSB7XG4gIGNvbnN0IHN0YXRlID0gdGhpcy5fd3JpdGFibGVTdGF0ZVxuICBpZiAoc3RhdGUuY29ya2VkKSB7XG4gICAgc3RhdGUuY29ya2VkLS1cbiAgICBpZiAoIXN0YXRlLndyaXRpbmcpIGNsZWFyQnVmZmVyKHRoaXMsIHN0YXRlKVxuICB9XG59XG5Xcml0YWJsZS5wcm90b3R5cGUuc2V0RGVmYXVsdEVuY29kaW5nID0gZnVuY3Rpb24gc2V0RGVmYXVsdEVuY29kaW5nKGVuY29kaW5nKSB7XG4gIC8vIG5vZGU6OlBhcnNlRW5jb2RpbmcoKSByZXF1aXJlcyBsb3dlciBjYXNlLlxuICBpZiAodHlwZW9mIGVuY29kaW5nID09PSAnc3RyaW5nJykgZW5jb2RpbmcgPSBTdHJpbmdQcm90b3R5cGVUb0xvd2VyQ2FzZShlbmNvZGluZylcbiAgaWYgKCFCdWZmZXIuaXNFbmNvZGluZyhlbmNvZGluZykpIHRocm93IG5ldyBFUlJfVU5LTk9XTl9FTkNPRElORyhlbmNvZGluZylcbiAgdGhpcy5fd3JpdGFibGVTdGF0ZS5kZWZhdWx0RW5jb2RpbmcgPSBlbmNvZGluZ1xuICByZXR1cm4gdGhpc1xufVxuXG4vLyBJZiB3ZSdyZSBhbHJlYWR5IHdyaXRpbmcgc29tZXRoaW5nLCB0aGVuIGp1c3QgcHV0IHRoaXNcbi8vIGluIHRoZSBxdWV1ZSwgYW5kIHdhaXQgb3VyIHR1cm4uICBPdGhlcndpc2UsIGNhbGwgX3dyaXRlXG4vLyBJZiB3ZSByZXR1cm4gZmFsc2UsIHRoZW4gd2UgbmVlZCBhIGRyYWluIGV2ZW50LCBzbyBzZXQgdGhhdCBmbGFnLlxuZnVuY3Rpb24gd3JpdGVPckJ1ZmZlcihzdHJlYW0sIHN0YXRlLCBjaHVuaywgZW5jb2RpbmcsIGNhbGxiYWNrKSB7XG4gIGNvbnN0IGxlbiA9IHN0YXRlLm9iamVjdE1vZGUgPyAxIDogY2h1bmsubGVuZ3RoXG4gIHN0YXRlLmxlbmd0aCArPSBsZW5cblxuICAvLyBzdHJlYW0uX3dyaXRlIHJlc2V0cyBzdGF0ZS5sZW5ndGhcbiAgY29uc3QgcmV0ID0gc3RhdGUubGVuZ3RoIDwgc3RhdGUuaGlnaFdhdGVyTWFya1xuICAvLyBXZSBtdXN0IGVuc3VyZSB0aGF0IHByZXZpb3VzIG5lZWREcmFpbiB3aWxsIG5vdCBiZSByZXNldCB0byBmYWxzZS5cbiAgaWYgKCFyZXQpIHN0YXRlLm5lZWREcmFpbiA9IHRydWVcbiAgaWYgKHN0YXRlLndyaXRpbmcgfHwgc3RhdGUuY29ya2VkIHx8IHN0YXRlLmVycm9yZWQgfHwgIXN0YXRlLmNvbnN0cnVjdGVkKSB7XG4gICAgc3RhdGUuYnVmZmVyZWQucHVzaCh7XG4gICAgICBjaHVuayxcbiAgICAgIGVuY29kaW5nLFxuICAgICAgY2FsbGJhY2tcbiAgICB9KVxuICAgIGlmIChzdGF0ZS5hbGxCdWZmZXJzICYmIGVuY29kaW5nICE9PSAnYnVmZmVyJykge1xuICAgICAgc3RhdGUuYWxsQnVmZmVycyA9IGZhbHNlXG4gICAgfVxuICAgIGlmIChzdGF0ZS5hbGxOb29wICYmIGNhbGxiYWNrICE9PSBub3ApIHtcbiAgICAgIHN0YXRlLmFsbE5vb3AgPSBmYWxzZVxuICAgIH1cbiAgfSBlbHNlIHtcbiAgICBzdGF0ZS53cml0ZWxlbiA9IGxlblxuICAgIHN0YXRlLndyaXRlY2IgPSBjYWxsYmFja1xuICAgIHN0YXRlLndyaXRpbmcgPSB0cnVlXG4gICAgc3RhdGUuc3luYyA9IHRydWVcbiAgICBzdHJlYW0uX3dyaXRlKGNodW5rLCBlbmNvZGluZywgc3RhdGUub253cml0ZSlcbiAgICBzdGF0ZS5zeW5jID0gZmFsc2VcbiAgfVxuXG4gIC8vIFJldHVybiBmYWxzZSBpZiBlcnJvcmVkIG9yIGRlc3Ryb3llZCBpbiBvcmRlciB0byBicmVha1xuICAvLyBhbnkgc3luY2hyb25vdXMgd2hpbGUoc3RyZWFtLndyaXRlKGRhdGEpKSBsb29wcy5cbiAgcmV0dXJuIHJldCAmJiAhc3RhdGUuZXJyb3JlZCAmJiAhc3RhdGUuZGVzdHJveWVkXG59XG5mdW5jdGlvbiBkb1dyaXRlKHN0cmVhbSwgc3RhdGUsIHdyaXRldiwgbGVuLCBjaHVuaywgZW5jb2RpbmcsIGNiKSB7XG4gIHN0YXRlLndyaXRlbGVuID0gbGVuXG4gIHN0YXRlLndyaXRlY2IgPSBjYlxuICBzdGF0ZS53cml0aW5nID0gdHJ1ZVxuICBzdGF0ZS5zeW5jID0gdHJ1ZVxuICBpZiAoc3RhdGUuZGVzdHJveWVkKSBzdGF0ZS5vbndyaXRlKG5ldyBFUlJfU1RSRUFNX0RFU1RST1lFRCgnd3JpdGUnKSlcbiAgZWxzZSBpZiAod3JpdGV2KSBzdHJlYW0uX3dyaXRldihjaHVuaywgc3RhdGUub253cml0ZSlcbiAgZWxzZSBzdHJlYW0uX3dyaXRlKGNodW5rLCBlbmNvZGluZywgc3RhdGUub253cml0ZSlcbiAgc3RhdGUuc3luYyA9IGZhbHNlXG59XG5mdW5jdGlvbiBvbndyaXRlRXJyb3Ioc3RyZWFtLCBzdGF0ZSwgZXIsIGNiKSB7XG4gIC0tc3RhdGUucGVuZGluZ2NiXG4gIGNiKGVyKVxuICAvLyBFbnN1cmUgY2FsbGJhY2tzIGFyZSBpbnZva2VkIGV2ZW4gd2hlbiBhdXRvRGVzdHJveSBpc1xuICAvLyBub3QgZW5hYmxlZC4gUGFzc2luZyBgZXJgIGhlcmUgZG9lc24ndCBtYWtlIHNlbnNlIHNpbmNlXG4gIC8vIGl0J3MgcmVsYXRlZCB0byBvbmUgc3BlY2lmaWMgd3JpdGUsIG5vdCB0byB0aGUgYnVmZmVyZWRcbiAgLy8gd3JpdGVzLlxuICBlcnJvckJ1ZmZlcihzdGF0ZSlcbiAgLy8gVGhpcyBjYW4gZW1pdCBlcnJvciwgYnV0IGVycm9yIG11c3QgYWx3YXlzIGZvbGxvdyBjYi5cbiAgZXJyb3JPckRlc3Ryb3koc3RyZWFtLCBlcilcbn1cbmZ1bmN0aW9uIG9ud3JpdGUoc3RyZWFtLCBlcikge1xuICBjb25zdCBzdGF0ZSA9IHN0cmVhbS5fd3JpdGFibGVTdGF0ZVxuICBjb25zdCBzeW5jID0gc3RhdGUuc3luY1xuICBjb25zdCBjYiA9IHN0YXRlLndyaXRlY2JcbiAgaWYgKHR5cGVvZiBjYiAhPT0gJ2Z1bmN0aW9uJykge1xuICAgIGVycm9yT3JEZXN0cm95KHN0cmVhbSwgbmV3IEVSUl9NVUxUSVBMRV9DQUxMQkFDSygpKVxuICAgIHJldHVyblxuICB9XG4gIHN0YXRlLndyaXRpbmcgPSBmYWxzZVxuICBzdGF0ZS53cml0ZWNiID0gbnVsbFxuICBzdGF0ZS5sZW5ndGggLT0gc3RhdGUud3JpdGVsZW5cbiAgc3RhdGUud3JpdGVsZW4gPSAwXG4gIGlmIChlcikge1xuICAgIC8vIEF2b2lkIFY4IGxlYWssIGh0dHBzOi8vZ2l0aHViLmNvbS9ub2RlanMvbm9kZS9wdWxsLzM0MTAzI2lzc3VlY29tbWVudC02NTIwMDIzNjRcbiAgICBlci5zdGFjayAvLyBlc2xpbnQtZGlzYWJsZS1saW5lIG5vLXVudXNlZC1leHByZXNzaW9uc1xuXG4gICAgaWYgKCFzdGF0ZS5lcnJvcmVkKSB7XG4gICAgICBzdGF0ZS5lcnJvcmVkID0gZXJcbiAgICB9XG5cbiAgICAvLyBJbiBjYXNlIG9mIGR1cGxleCBzdHJlYW1zIHdlIG5lZWQgdG8gbm90aWZ5IHRoZSByZWFkYWJsZSBzaWRlIG9mIHRoZVxuICAgIC8vIGVycm9yLlxuICAgIGlmIChzdHJlYW0uX3JlYWRhYmxlU3RhdGUgJiYgIXN0cmVhbS5fcmVhZGFibGVTdGF0ZS5lcnJvcmVkKSB7XG4gICAgICBzdHJlYW0uX3JlYWRhYmxlU3RhdGUuZXJyb3JlZCA9IGVyXG4gICAgfVxuICAgIGlmIChzeW5jKSB7XG4gICAgICBwcm9jZXNzLm5leHRUaWNrKG9ud3JpdGVFcnJvciwgc3RyZWFtLCBzdGF0ZSwgZXIsIGNiKVxuICAgIH0gZWxzZSB7XG4gICAgICBvbndyaXRlRXJyb3Ioc3RyZWFtLCBzdGF0ZSwgZXIsIGNiKVxuICAgIH1cbiAgfSBlbHNlIHtcbiAgICBpZiAoc3RhdGUuYnVmZmVyZWQubGVuZ3RoID4gc3RhdGUuYnVmZmVyZWRJbmRleCkge1xuICAgICAgY2xlYXJCdWZmZXIoc3RyZWFtLCBzdGF0ZSlcbiAgICB9XG4gICAgaWYgKHN5bmMpIHtcbiAgICAgIC8vIEl0IGlzIGEgY29tbW9uIGNhc2UgdGhhdCB0aGUgY2FsbGJhY2sgcGFzc2VkIHRvIC53cml0ZSgpIGlzIGFsd2F5c1xuICAgICAgLy8gdGhlIHNhbWUuIEluIHRoYXQgY2FzZSwgd2UgZG8gbm90IHNjaGVkdWxlIGEgbmV3IG5leHRUaWNrKCksIGJ1dFxuICAgICAgLy8gcmF0aGVyIGp1c3QgaW5jcmVhc2UgYSBjb3VudGVyLCB0byBpbXByb3ZlIHBlcmZvcm1hbmNlIGFuZCBhdm9pZFxuICAgICAgLy8gbWVtb3J5IGFsbG9jYXRpb25zLlxuICAgICAgaWYgKHN0YXRlLmFmdGVyV3JpdGVUaWNrSW5mbyAhPT0gbnVsbCAmJiBzdGF0ZS5hZnRlcldyaXRlVGlja0luZm8uY2IgPT09IGNiKSB7XG4gICAgICAgIHN0YXRlLmFmdGVyV3JpdGVUaWNrSW5mby5jb3VudCsrXG4gICAgICB9IGVsc2Uge1xuICAgICAgICBzdGF0ZS5hZnRlcldyaXRlVGlja0luZm8gPSB7XG4gICAgICAgICAgY291bnQ6IDEsXG4gICAgICAgICAgY2IsXG4gICAgICAgICAgc3RyZWFtLFxuICAgICAgICAgIHN0YXRlXG4gICAgICAgIH1cbiAgICAgICAgcHJvY2Vzcy5uZXh0VGljayhhZnRlcldyaXRlVGljaywgc3RhdGUuYWZ0ZXJXcml0ZVRpY2tJbmZvKVxuICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICBhZnRlcldyaXRlKHN0cmVhbSwgc3RhdGUsIDEsIGNiKVxuICAgIH1cbiAgfVxufVxuZnVuY3Rpb24gYWZ0ZXJXcml0ZVRpY2soeyBzdHJlYW0sIHN0YXRlLCBjb3VudCwgY2IgfSkge1xuICBzdGF0ZS5hZnRlcldyaXRlVGlja0luZm8gPSBudWxsXG4gIHJldHVybiBhZnRlcldyaXRlKHN0cmVhbSwgc3RhdGUsIGNvdW50LCBjYilcbn1cbmZ1bmN0aW9uIGFmdGVyV3JpdGUoc3RyZWFtLCBzdGF0ZSwgY291bnQsIGNiKSB7XG4gIGNvbnN0IG5lZWREcmFpbiA9ICFzdGF0ZS5lbmRpbmcgJiYgIXN0cmVhbS5kZXN0cm95ZWQgJiYgc3RhdGUubGVuZ3RoID09PSAwICYmIHN0YXRlLm5lZWREcmFpblxuICBpZiAobmVlZERyYWluKSB7XG4gICAgc3RhdGUubmVlZERyYWluID0gZmFsc2VcbiAgICBzdHJlYW0uZW1pdCgnZHJhaW4nKVxuICB9XG4gIHdoaWxlIChjb3VudC0tID4gMCkge1xuICAgIHN0YXRlLnBlbmRpbmdjYi0tXG4gICAgY2IoKVxuICB9XG4gIGlmIChzdGF0ZS5kZXN0cm95ZWQpIHtcbiAgICBlcnJvckJ1ZmZlcihzdGF0ZSlcbiAgfVxuICBmaW5pc2hNYXliZShzdHJlYW0sIHN0YXRlKVxufVxuXG4vLyBJZiB0aGVyZSdzIHNvbWV0aGluZyBpbiB0aGUgYnVmZmVyIHdhaXRpbmcsIHRoZW4gaW52b2tlIGNhbGxiYWNrcy5cbmZ1bmN0aW9uIGVycm9yQnVmZmVyKHN0YXRlKSB7XG4gIGlmIChzdGF0ZS53cml0aW5nKSB7XG4gICAgcmV0dXJuXG4gIH1cbiAgZm9yIChsZXQgbiA9IHN0YXRlLmJ1ZmZlcmVkSW5kZXg7IG4gPCBzdGF0ZS5idWZmZXJlZC5sZW5ndGg7ICsrbikge1xuICAgIHZhciBfc3RhdGUkZXJyb3JlZFxuICAgIGNvbnN0IHsgY2h1bmssIGNhbGxiYWNrIH0gPSBzdGF0ZS5idWZmZXJlZFtuXVxuICAgIGNvbnN0IGxlbiA9IHN0YXRlLm9iamVjdE1vZGUgPyAxIDogY2h1bmsubGVuZ3RoXG4gICAgc3RhdGUubGVuZ3RoIC09IGxlblxuICAgIGNhbGxiYWNrKFxuICAgICAgKF9zdGF0ZSRlcnJvcmVkID0gc3RhdGUuZXJyb3JlZCkgIT09IG51bGwgJiYgX3N0YXRlJGVycm9yZWQgIT09IHVuZGVmaW5lZFxuICAgICAgICA/IF9zdGF0ZSRlcnJvcmVkXG4gICAgICAgIDogbmV3IEVSUl9TVFJFQU1fREVTVFJPWUVEKCd3cml0ZScpXG4gICAgKVxuICB9XG4gIGNvbnN0IG9uZmluaXNoQ2FsbGJhY2tzID0gc3RhdGVba09uRmluaXNoZWRdLnNwbGljZSgwKVxuICBmb3IgKGxldCBpID0gMDsgaSA8IG9uZmluaXNoQ2FsbGJhY2tzLmxlbmd0aDsgaSsrKSB7XG4gICAgdmFyIF9zdGF0ZSRlcnJvcmVkMlxuICAgIG9uZmluaXNoQ2FsbGJhY2tzW2ldKFxuICAgICAgKF9zdGF0ZSRlcnJvcmVkMiA9IHN0YXRlLmVycm9yZWQpICE9PSBudWxsICYmIF9zdGF0ZSRlcnJvcmVkMiAhPT0gdW5kZWZpbmVkXG4gICAgICAgID8gX3N0YXRlJGVycm9yZWQyXG4gICAgICAgIDogbmV3IEVSUl9TVFJFQU1fREVTVFJPWUVEKCdlbmQnKVxuICAgIClcbiAgfVxuICByZXNldEJ1ZmZlcihzdGF0ZSlcbn1cblxuLy8gSWYgdGhlcmUncyBzb21ldGhpbmcgaW4gdGhlIGJ1ZmZlciB3YWl0aW5nLCB0aGVuIHByb2Nlc3MgaXQuXG5mdW5jdGlvbiBjbGVhckJ1ZmZlcihzdHJlYW0sIHN0YXRlKSB7XG4gIGlmIChzdGF0ZS5jb3JrZWQgfHwgc3RhdGUuYnVmZmVyUHJvY2Vzc2luZyB8fCBzdGF0ZS5kZXN0cm95ZWQgfHwgIXN0YXRlLmNvbnN0cnVjdGVkKSB7XG4gICAgcmV0dXJuXG4gIH1cbiAgY29uc3QgeyBidWZmZXJlZCwgYnVmZmVyZWRJbmRleCwgb2JqZWN0TW9kZSB9ID0gc3RhdGVcbiAgY29uc3QgYnVmZmVyZWRMZW5ndGggPSBidWZmZXJlZC5sZW5ndGggLSBidWZmZXJlZEluZGV4XG4gIGlmICghYnVmZmVyZWRMZW5ndGgpIHtcbiAgICByZXR1cm5cbiAgfVxuICBsZXQgaSA9IGJ1ZmZlcmVkSW5kZXhcbiAgc3RhdGUuYnVmZmVyUHJvY2Vzc2luZyA9IHRydWVcbiAgaWYgKGJ1ZmZlcmVkTGVuZ3RoID4gMSAmJiBzdHJlYW0uX3dyaXRldikge1xuICAgIHN0YXRlLnBlbmRpbmdjYiAtPSBidWZmZXJlZExlbmd0aCAtIDFcbiAgICBjb25zdCBjYWxsYmFjayA9IHN0YXRlLmFsbE5vb3BcbiAgICAgID8gbm9wXG4gICAgICA6IChlcnIpID0+IHtcbiAgICAgICAgICBmb3IgKGxldCBuID0gaTsgbiA8IGJ1ZmZlcmVkLmxlbmd0aDsgKytuKSB7XG4gICAgICAgICAgICBidWZmZXJlZFtuXS5jYWxsYmFjayhlcnIpXG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgLy8gTWFrZSBhIGNvcHkgb2YgYGJ1ZmZlcmVkYCBpZiBpdCdzIGdvaW5nIHRvIGJlIHVzZWQgYnkgYGNhbGxiYWNrYCBhYm92ZSxcbiAgICAvLyBzaW5jZSBgZG9Xcml0ZWAgd2lsbCBtdXRhdGUgdGhlIGFycmF5LlxuICAgIGNvbnN0IGNodW5rcyA9IHN0YXRlLmFsbE5vb3AgJiYgaSA9PT0gMCA/IGJ1ZmZlcmVkIDogQXJyYXlQcm90b3R5cGVTbGljZShidWZmZXJlZCwgaSlcbiAgICBjaHVua3MuYWxsQnVmZmVycyA9IHN0YXRlLmFsbEJ1ZmZlcnNcbiAgICBkb1dyaXRlKHN0cmVhbSwgc3RhdGUsIHRydWUsIHN0YXRlLmxlbmd0aCwgY2h1bmtzLCAnJywgY2FsbGJhY2spXG4gICAgcmVzZXRCdWZmZXIoc3RhdGUpXG4gIH0gZWxzZSB7XG4gICAgZG8ge1xuICAgICAgY29uc3QgeyBjaHVuaywgZW5jb2RpbmcsIGNhbGxiYWNrIH0gPSBidWZmZXJlZFtpXVxuICAgICAgYnVmZmVyZWRbaSsrXSA9IG51bGxcbiAgICAgIGNvbnN0IGxlbiA9IG9iamVjdE1vZGUgPyAxIDogY2h1bmsubGVuZ3RoXG4gICAgICBkb1dyaXRlKHN0cmVhbSwgc3RhdGUsIGZhbHNlLCBsZW4sIGNodW5rLCBlbmNvZGluZywgY2FsbGJhY2spXG4gICAgfSB3aGlsZSAoaSA8IGJ1ZmZlcmVkLmxlbmd0aCAmJiAhc3RhdGUud3JpdGluZylcbiAgICBpZiAoaSA9PT0gYnVmZmVyZWQubGVuZ3RoKSB7XG4gICAgICByZXNldEJ1ZmZlcihzdGF0ZSlcbiAgICB9IGVsc2UgaWYgKGkgPiAyNTYpIHtcbiAgICAgIGJ1ZmZlcmVkLnNwbGljZSgwLCBpKVxuICAgICAgc3RhdGUuYnVmZmVyZWRJbmRleCA9IDBcbiAgICB9IGVsc2Uge1xuICAgICAgc3RhdGUuYnVmZmVyZWRJbmRleCA9IGlcbiAgICB9XG4gIH1cbiAgc3RhdGUuYnVmZmVyUHJvY2Vzc2luZyA9IGZhbHNlXG59XG5Xcml0YWJsZS5wcm90b3R5cGUuX3dyaXRlID0gZnVuY3Rpb24gKGNodW5rLCBlbmNvZGluZywgY2IpIHtcbiAgaWYgKHRoaXMuX3dyaXRldikge1xuICAgIHRoaXMuX3dyaXRldihcbiAgICAgIFtcbiAgICAgICAge1xuICAgICAgICAgIGNodW5rLFxuICAgICAgICAgIGVuY29kaW5nXG4gICAgICAgIH1cbiAgICAgIF0sXG4gICAgICBjYlxuICAgIClcbiAgfSBlbHNlIHtcbiAgICB0aHJvdyBuZXcgRVJSX01FVEhPRF9OT1RfSU1QTEVNRU5URUQoJ193cml0ZSgpJylcbiAgfVxufVxuV3JpdGFibGUucHJvdG90eXBlLl93cml0ZXYgPSBudWxsXG5Xcml0YWJsZS5wcm90b3R5cGUuZW5kID0gZnVuY3Rpb24gKGNodW5rLCBlbmNvZGluZywgY2IpIHtcbiAgY29uc3Qgc3RhdGUgPSB0aGlzLl93cml0YWJsZVN0YXRlXG4gIGlmICh0eXBlb2YgY2h1bmsgPT09ICdmdW5jdGlvbicpIHtcbiAgICBjYiA9IGNodW5rXG4gICAgY2h1bmsgPSBudWxsXG4gICAgZW5jb2RpbmcgPSBudWxsXG4gIH0gZWxzZSBpZiAodHlwZW9mIGVuY29kaW5nID09PSAnZnVuY3Rpb24nKSB7XG4gICAgY2IgPSBlbmNvZGluZ1xuICAgIGVuY29kaW5nID0gbnVsbFxuICB9XG4gIGxldCBlcnJcbiAgaWYgKGNodW5rICE9PSBudWxsICYmIGNodW5rICE9PSB1bmRlZmluZWQpIHtcbiAgICBjb25zdCByZXQgPSBfd3JpdGUodGhpcywgY2h1bmssIGVuY29kaW5nKVxuICAgIGlmIChyZXQgaW5zdGFuY2VvZiBFcnJvcikge1xuICAgICAgZXJyID0gcmV0XG4gICAgfVxuICB9XG5cbiAgLy8gLmVuZCgpIGZ1bGx5IHVuY29ya3MuXG4gIGlmIChzdGF0ZS5jb3JrZWQpIHtcbiAgICBzdGF0ZS5jb3JrZWQgPSAxXG4gICAgdGhpcy51bmNvcmsoKVxuICB9XG4gIGlmIChlcnIpIHtcbiAgICAvLyBEbyBub3RoaW5nLi4uXG4gIH0gZWxzZSBpZiAoIXN0YXRlLmVycm9yZWQgJiYgIXN0YXRlLmVuZGluZykge1xuICAgIC8vIFRoaXMgaXMgZm9yZ2l2aW5nIGluIHRlcm1zIG9mIHVubmVjZXNzYXJ5IGNhbGxzIHRvIGVuZCgpIGFuZCBjYW4gaGlkZVxuICAgIC8vIGxvZ2ljIGVycm9ycy4gSG93ZXZlciwgdXN1YWxseSBzdWNoIGVycm9ycyBhcmUgaGFybWxlc3MgYW5kIGNhdXNpbmcgYVxuICAgIC8vIGhhcmQgZXJyb3IgY2FuIGJlIGRpc3Byb3BvcnRpb25hdGVseSBkZXN0cnVjdGl2ZS4gSXQgaXMgbm90IGFsd2F5c1xuICAgIC8vIHRyaXZpYWwgZm9yIHRoZSB1c2VyIHRvIGRldGVybWluZSB3aGV0aGVyIGVuZCgpIG5lZWRzIHRvIGJlIGNhbGxlZFxuICAgIC8vIG9yIG5vdC5cblxuICAgIHN0YXRlLmVuZGluZyA9IHRydWVcbiAgICBmaW5pc2hNYXliZSh0aGlzLCBzdGF0ZSwgdHJ1ZSlcbiAgICBzdGF0ZS5lbmRlZCA9IHRydWVcbiAgfSBlbHNlIGlmIChzdGF0ZS5maW5pc2hlZCkge1xuICAgIGVyciA9IG5ldyBFUlJfU1RSRUFNX0FMUkVBRFlfRklOSVNIRUQoJ2VuZCcpXG4gIH0gZWxzZSBpZiAoc3RhdGUuZGVzdHJveWVkKSB7XG4gICAgZXJyID0gbmV3IEVSUl9TVFJFQU1fREVTVFJPWUVEKCdlbmQnKVxuICB9XG4gIGlmICh0eXBlb2YgY2IgPT09ICdmdW5jdGlvbicpIHtcbiAgICBpZiAoZXJyIHx8IHN0YXRlLmZpbmlzaGVkKSB7XG4gICAgICBwcm9jZXNzLm5leHRUaWNrKGNiLCBlcnIpXG4gICAgfSBlbHNlIHtcbiAgICAgIHN0YXRlW2tPbkZpbmlzaGVkXS5wdXNoKGNiKVxuICAgIH1cbiAgfVxuICByZXR1cm4gdGhpc1xufVxuZnVuY3Rpb24gbmVlZEZpbmlzaChzdGF0ZSkge1xuICByZXR1cm4gKFxuICAgIHN0YXRlLmVuZGluZyAmJlxuICAgICFzdGF0ZS5kZXN0cm95ZWQgJiZcbiAgICBzdGF0ZS5jb25zdHJ1Y3RlZCAmJlxuICAgIHN0YXRlLmxlbmd0aCA9PT0gMCAmJlxuICAgICFzdGF0ZS5lcnJvcmVkICYmXG4gICAgc3RhdGUuYnVmZmVyZWQubGVuZ3RoID09PSAwICYmXG4gICAgIXN0YXRlLmZpbmlzaGVkICYmXG4gICAgIXN0YXRlLndyaXRpbmcgJiZcbiAgICAhc3RhdGUuZXJyb3JFbWl0dGVkICYmXG4gICAgIXN0YXRlLmNsb3NlRW1pdHRlZFxuICApXG59XG5mdW5jdGlvbiBjYWxsRmluYWwoc3RyZWFtLCBzdGF0ZSkge1xuICBsZXQgY2FsbGVkID0gZmFsc2VcbiAgZnVuY3Rpb24gb25GaW5pc2goZXJyKSB7XG4gICAgaWYgKGNhbGxlZCkge1xuICAgICAgZXJyb3JPckRlc3Ryb3koc3RyZWFtLCBlcnIgIT09IG51bGwgJiYgZXJyICE9PSB1bmRlZmluZWQgPyBlcnIgOiBFUlJfTVVMVElQTEVfQ0FMTEJBQ0soKSlcbiAgICAgIHJldHVyblxuICAgIH1cbiAgICBjYWxsZWQgPSB0cnVlXG4gICAgc3RhdGUucGVuZGluZ2NiLS1cbiAgICBpZiAoZXJyKSB7XG4gICAgICBjb25zdCBvbmZpbmlzaENhbGxiYWNrcyA9IHN0YXRlW2tPbkZpbmlzaGVkXS5zcGxpY2UoMClcbiAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgb25maW5pc2hDYWxsYmFja3MubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgb25maW5pc2hDYWxsYmFja3NbaV0oZXJyKVxuICAgICAgfVxuICAgICAgZXJyb3JPckRlc3Ryb3koc3RyZWFtLCBlcnIsIHN0YXRlLnN5bmMpXG4gICAgfSBlbHNlIGlmIChuZWVkRmluaXNoKHN0YXRlKSkge1xuICAgICAgc3RhdGUucHJlZmluaXNoZWQgPSB0cnVlXG4gICAgICBzdHJlYW0uZW1pdCgncHJlZmluaXNoJylcbiAgICAgIC8vIEJhY2t3YXJkcyBjb21wYXQuIERvbid0IGNoZWNrIHN0YXRlLnN5bmMgaGVyZS5cbiAgICAgIC8vIFNvbWUgc3RyZWFtcyBhc3N1bWUgJ2ZpbmlzaCcgd2lsbCBiZSBlbWl0dGVkXG4gICAgICAvLyBhc3luY2hyb25vdXNseSByZWxhdGl2ZSB0byBfZmluYWwgY2FsbGJhY2suXG4gICAgICBzdGF0ZS5wZW5kaW5nY2IrK1xuICAgICAgcHJvY2Vzcy5uZXh0VGljayhmaW5pc2gsIHN0cmVhbSwgc3RhdGUpXG4gICAgfVxuICB9XG4gIHN0YXRlLnN5bmMgPSB0cnVlXG4gIHN0YXRlLnBlbmRpbmdjYisrXG4gIHRyeSB7XG4gICAgc3RyZWFtLl9maW5hbChvbkZpbmlzaClcbiAgfSBjYXRjaCAoZXJyKSB7XG4gICAgb25GaW5pc2goZXJyKVxuICB9XG4gIHN0YXRlLnN5bmMgPSBmYWxzZVxufVxuZnVuY3Rpb24gcHJlZmluaXNoKHN0cmVhbSwgc3RhdGUpIHtcbiAgaWYgKCFzdGF0ZS5wcmVmaW5pc2hlZCAmJiAhc3RhdGUuZmluYWxDYWxsZWQpIHtcbiAgICBpZiAodHlwZW9mIHN0cmVhbS5fZmluYWwgPT09ICdmdW5jdGlvbicgJiYgIXN0YXRlLmRlc3Ryb3llZCkge1xuICAgICAgc3RhdGUuZmluYWxDYWxsZWQgPSB0cnVlXG4gICAgICBjYWxsRmluYWwoc3RyZWFtLCBzdGF0ZSlcbiAgICB9IGVsc2Uge1xuICAgICAgc3RhdGUucHJlZmluaXNoZWQgPSB0cnVlXG4gICAgICBzdHJlYW0uZW1pdCgncHJlZmluaXNoJylcbiAgICB9XG4gIH1cbn1cbmZ1bmN0aW9uIGZpbmlzaE1heWJlKHN0cmVhbSwgc3RhdGUsIHN5bmMpIHtcbiAgaWYgKG5lZWRGaW5pc2goc3RhdGUpKSB7XG4gICAgcHJlZmluaXNoKHN0cmVhbSwgc3RhdGUpXG4gICAgaWYgKHN0YXRlLnBlbmRpbmdjYiA9PT0gMCkge1xuICAgICAgaWYgKHN5bmMpIHtcbiAgICAgICAgc3RhdGUucGVuZGluZ2NiKytcbiAgICAgICAgcHJvY2Vzcy5uZXh0VGljayhcbiAgICAgICAgICAoc3RyZWFtLCBzdGF0ZSkgPT4ge1xuICAgICAgICAgICAgaWYgKG5lZWRGaW5pc2goc3RhdGUpKSB7XG4gICAgICAgICAgICAgIGZpbmlzaChzdHJlYW0sIHN0YXRlKVxuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgc3RhdGUucGVuZGluZ2NiLS1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9LFxuICAgICAgICAgIHN0cmVhbSxcbiAgICAgICAgICBzdGF0ZVxuICAgICAgICApXG4gICAgICB9IGVsc2UgaWYgKG5lZWRGaW5pc2goc3RhdGUpKSB7XG4gICAgICAgIHN0YXRlLnBlbmRpbmdjYisrXG4gICAgICAgIGZpbmlzaChzdHJlYW0sIHN0YXRlKVxuICAgICAgfVxuICAgIH1cbiAgfVxufVxuZnVuY3Rpb24gZmluaXNoKHN0cmVhbSwgc3RhdGUpIHtcbiAgc3RhdGUucGVuZGluZ2NiLS1cbiAgc3RhdGUuZmluaXNoZWQgPSB0cnVlXG4gIGNvbnN0IG9uZmluaXNoQ2FsbGJhY2tzID0gc3RhdGVba09uRmluaXNoZWRdLnNwbGljZSgwKVxuICBmb3IgKGxldCBpID0gMDsgaSA8IG9uZmluaXNoQ2FsbGJhY2tzLmxlbmd0aDsgaSsrKSB7XG4gICAgb25maW5pc2hDYWxsYmFja3NbaV0oKVxuICB9XG4gIHN0cmVhbS5lbWl0KCdmaW5pc2gnKVxuICBpZiAoc3RhdGUuYXV0b0Rlc3Ryb3kpIHtcbiAgICAvLyBJbiBjYXNlIG9mIGR1cGxleCBzdHJlYW1zIHdlIG5lZWQgYSB3YXkgdG8gZGV0ZWN0XG4gICAgLy8gaWYgdGhlIHJlYWRhYmxlIHNpZGUgaXMgcmVhZHkgZm9yIGF1dG9EZXN0cm95IGFzIHdlbGwuXG4gICAgY29uc3QgclN0YXRlID0gc3RyZWFtLl9yZWFkYWJsZVN0YXRlXG4gICAgY29uc3QgYXV0b0Rlc3Ryb3kgPVxuICAgICAgIXJTdGF0ZSB8fFxuICAgICAgKHJTdGF0ZS5hdXRvRGVzdHJveSAmJlxuICAgICAgICAvLyBXZSBkb24ndCBleHBlY3QgdGhlIHJlYWRhYmxlIHRvIGV2ZXIgJ2VuZCdcbiAgICAgICAgLy8gaWYgcmVhZGFibGUgaXMgZXhwbGljaXRseSBzZXQgdG8gZmFsc2UuXG4gICAgICAgIChyU3RhdGUuZW5kRW1pdHRlZCB8fCByU3RhdGUucmVhZGFibGUgPT09IGZhbHNlKSlcbiAgICBpZiAoYXV0b0Rlc3Ryb3kpIHtcbiAgICAgIHN0cmVhbS5kZXN0cm95KClcbiAgICB9XG4gIH1cbn1cbk9iamVjdERlZmluZVByb3BlcnRpZXMoV3JpdGFibGUucHJvdG90eXBlLCB7XG4gIGNsb3NlZDoge1xuICAgIF9fcHJvdG9fXzogbnVsbCxcbiAgICBnZXQoKSB7XG4gICAgICByZXR1cm4gdGhpcy5fd3JpdGFibGVTdGF0ZSA/IHRoaXMuX3dyaXRhYmxlU3RhdGUuY2xvc2VkIDogZmFsc2VcbiAgICB9XG4gIH0sXG4gIGRlc3Ryb3llZDoge1xuICAgIF9fcHJvdG9fXzogbnVsbCxcbiAgICBnZXQoKSB7XG4gICAgICByZXR1cm4gdGhpcy5fd3JpdGFibGVTdGF0ZSA/IHRoaXMuX3dyaXRhYmxlU3RhdGUuZGVzdHJveWVkIDogZmFsc2VcbiAgICB9LFxuICAgIHNldCh2YWx1ZSkge1xuICAgICAgLy8gQmFja3dhcmQgY29tcGF0aWJpbGl0eSwgdGhlIHVzZXIgaXMgZXhwbGljaXRseSBtYW5hZ2luZyBkZXN0cm95ZWQuXG4gICAgICBpZiAodGhpcy5fd3JpdGFibGVTdGF0ZSkge1xuICAgICAgICB0aGlzLl93cml0YWJsZVN0YXRlLmRlc3Ryb3llZCA9IHZhbHVlXG4gICAgICB9XG4gICAgfVxuICB9LFxuICB3cml0YWJsZToge1xuICAgIF9fcHJvdG9fXzogbnVsbCxcbiAgICBnZXQoKSB7XG4gICAgICBjb25zdCB3ID0gdGhpcy5fd3JpdGFibGVTdGF0ZVxuICAgICAgLy8gdy53cml0YWJsZSA9PT0gZmFsc2UgbWVhbnMgdGhhdCB0aGlzIGlzIHBhcnQgb2YgYSBEdXBsZXggc3RyZWFtXG4gICAgICAvLyB3aGVyZSB0aGUgd3JpdGFibGUgc2lkZSB3YXMgZGlzYWJsZWQgdXBvbiBjb25zdHJ1Y3Rpb24uXG4gICAgICAvLyBDb21wYXQuIFRoZSB1c2VyIG1pZ2h0IG1hbnVhbGx5IGRpc2FibGUgd3JpdGFibGUgc2lkZSB0aHJvdWdoXG4gICAgICAvLyBkZXByZWNhdGVkIHNldHRlci5cbiAgICAgIHJldHVybiAhIXcgJiYgdy53cml0YWJsZSAhPT0gZmFsc2UgJiYgIXcuZGVzdHJveWVkICYmICF3LmVycm9yZWQgJiYgIXcuZW5kaW5nICYmICF3LmVuZGVkXG4gICAgfSxcbiAgICBzZXQodmFsKSB7XG4gICAgICAvLyBCYWNrd2FyZHMgY29tcGF0aWJsZS5cbiAgICAgIGlmICh0aGlzLl93cml0YWJsZVN0YXRlKSB7XG4gICAgICAgIHRoaXMuX3dyaXRhYmxlU3RhdGUud3JpdGFibGUgPSAhIXZhbFxuICAgICAgfVxuICAgIH1cbiAgfSxcbiAgd3JpdGFibGVGaW5pc2hlZDoge1xuICAgIF9fcHJvdG9fXzogbnVsbCxcbiAgICBnZXQoKSB7XG4gICAgICByZXR1cm4gdGhpcy5fd3JpdGFibGVTdGF0ZSA/IHRoaXMuX3dyaXRhYmxlU3RhdGUuZmluaXNoZWQgOiBmYWxzZVxuICAgIH1cbiAgfSxcbiAgd3JpdGFibGVPYmplY3RNb2RlOiB7XG4gICAgX19wcm90b19fOiBudWxsLFxuICAgIGdldCgpIHtcbiAgICAgIHJldHVybiB0aGlzLl93cml0YWJsZVN0YXRlID8gdGhpcy5fd3JpdGFibGVTdGF0ZS5vYmplY3RNb2RlIDogZmFsc2VcbiAgICB9XG4gIH0sXG4gIHdyaXRhYmxlQnVmZmVyOiB7XG4gICAgX19wcm90b19fOiBudWxsLFxuICAgIGdldCgpIHtcbiAgICAgIHJldHVybiB0aGlzLl93cml0YWJsZVN0YXRlICYmIHRoaXMuX3dyaXRhYmxlU3RhdGUuZ2V0QnVmZmVyKClcbiAgICB9XG4gIH0sXG4gIHdyaXRhYmxlRW5kZWQ6IHtcbiAgICBfX3Byb3RvX186IG51bGwsXG4gICAgZ2V0KCkge1xuICAgICAgcmV0dXJuIHRoaXMuX3dyaXRhYmxlU3RhdGUgPyB0aGlzLl93cml0YWJsZVN0YXRlLmVuZGluZyA6IGZhbHNlXG4gICAgfVxuICB9LFxuICB3cml0YWJsZU5lZWREcmFpbjoge1xuICAgIF9fcHJvdG9fXzogbnVsbCxcbiAgICBnZXQoKSB7XG4gICAgICBjb25zdCB3U3RhdGUgPSB0aGlzLl93cml0YWJsZVN0YXRlXG4gICAgICBpZiAoIXdTdGF0ZSkgcmV0dXJuIGZhbHNlXG4gICAgICByZXR1cm4gIXdTdGF0ZS5kZXN0cm95ZWQgJiYgIXdTdGF0ZS5lbmRpbmcgJiYgd1N0YXRlLm5lZWREcmFpblxuICAgIH1cbiAgfSxcbiAgd3JpdGFibGVIaWdoV2F0ZXJNYXJrOiB7XG4gICAgX19wcm90b19fOiBudWxsLFxuICAgIGdldCgpIHtcbiAgICAgIHJldHVybiB0aGlzLl93cml0YWJsZVN0YXRlICYmIHRoaXMuX3dyaXRhYmxlU3RhdGUuaGlnaFdhdGVyTWFya1xuICAgIH1cbiAgfSxcbiAgd3JpdGFibGVDb3JrZWQ6IHtcbiAgICBfX3Byb3RvX186IG51bGwsXG4gICAgZ2V0KCkge1xuICAgICAgcmV0dXJuIHRoaXMuX3dyaXRhYmxlU3RhdGUgPyB0aGlzLl93cml0YWJsZVN0YXRlLmNvcmtlZCA6IDBcbiAgICB9XG4gIH0sXG4gIHdyaXRhYmxlTGVuZ3RoOiB7XG4gICAgX19wcm90b19fOiBudWxsLFxuICAgIGdldCgpIHtcbiAgICAgIHJldHVybiB0aGlzLl93cml0YWJsZVN0YXRlICYmIHRoaXMuX3dyaXRhYmxlU3RhdGUubGVuZ3RoXG4gICAgfVxuICB9LFxuICBlcnJvcmVkOiB7XG4gICAgX19wcm90b19fOiBudWxsLFxuICAgIGVudW1lcmFibGU6IGZhbHNlLFxuICAgIGdldCgpIHtcbiAgICAgIHJldHVybiB0aGlzLl93cml0YWJsZVN0YXRlID8gdGhpcy5fd3JpdGFibGVTdGF0ZS5lcnJvcmVkIDogbnVsbFxuICAgIH1cbiAgfSxcbiAgd3JpdGFibGVBYm9ydGVkOiB7XG4gICAgX19wcm90b19fOiBudWxsLFxuICAgIGVudW1lcmFibGU6IGZhbHNlLFxuICAgIGdldDogZnVuY3Rpb24gKCkge1xuICAgICAgcmV0dXJuICEhKFxuICAgICAgICB0aGlzLl93cml0YWJsZVN0YXRlLndyaXRhYmxlICE9PSBmYWxzZSAmJlxuICAgICAgICAodGhpcy5fd3JpdGFibGVTdGF0ZS5kZXN0cm95ZWQgfHwgdGhpcy5fd3JpdGFibGVTdGF0ZS5lcnJvcmVkKSAmJlxuICAgICAgICAhdGhpcy5fd3JpdGFibGVTdGF0ZS5maW5pc2hlZFxuICAgICAgKVxuICAgIH1cbiAgfVxufSlcbmNvbnN0IGRlc3Ryb3kgPSBkZXN0cm95SW1wbC5kZXN0cm95XG5Xcml0YWJsZS5wcm90b3R5cGUuZGVzdHJveSA9IGZ1bmN0aW9uIChlcnIsIGNiKSB7XG4gIGNvbnN0IHN0YXRlID0gdGhpcy5fd3JpdGFibGVTdGF0ZVxuXG4gIC8vIEludm9rZSBwZW5kaW5nIGNhbGxiYWNrcy5cbiAgaWYgKCFzdGF0ZS5kZXN0cm95ZWQgJiYgKHN0YXRlLmJ1ZmZlcmVkSW5kZXggPCBzdGF0ZS5idWZmZXJlZC5sZW5ndGggfHwgc3RhdGVba09uRmluaXNoZWRdLmxlbmd0aCkpIHtcbiAgICBwcm9jZXNzLm5leHRUaWNrKGVycm9yQnVmZmVyLCBzdGF0ZSlcbiAgfVxuICBkZXN0cm95LmNhbGwodGhpcywgZXJyLCBjYilcbiAgcmV0dXJuIHRoaXNcbn1cbldyaXRhYmxlLnByb3RvdHlwZS5fdW5kZXN0cm95ID0gZGVzdHJveUltcGwudW5kZXN0cm95XG5Xcml0YWJsZS5wcm90b3R5cGUuX2Rlc3Ryb3kgPSBmdW5jdGlvbiAoZXJyLCBjYikge1xuICBjYihlcnIpXG59XG5Xcml0YWJsZS5wcm90b3R5cGVbRUUuY2FwdHVyZVJlamVjdGlvblN5bWJvbF0gPSBmdW5jdGlvbiAoZXJyKSB7XG4gIHRoaXMuZGVzdHJveShlcnIpXG59XG5sZXQgd2ViU3RyZWFtc0FkYXB0ZXJzXG5cbi8vIExhenkgdG8gYXZvaWQgY2lyY3VsYXIgcmVmZXJlbmNlc1xuZnVuY3Rpb24gbGF6eVdlYlN0cmVhbXMoKSB7XG4gIGlmICh3ZWJTdHJlYW1zQWRhcHRlcnMgPT09IHVuZGVmaW5lZCkgd2ViU3RyZWFtc0FkYXB0ZXJzID0ge31cbiAgcmV0dXJuIHdlYlN0cmVhbXNBZGFwdGVyc1xufVxuV3JpdGFibGUuZnJvbVdlYiA9IGZ1bmN0aW9uICh3cml0YWJsZVN0cmVhbSwgb3B0aW9ucykge1xuICByZXR1cm4gbGF6eVdlYlN0cmVhbXMoKS5uZXdTdHJlYW1Xcml0YWJsZUZyb21Xcml0YWJsZVN0cmVhbSh3cml0YWJsZVN0cmVhbSwgb3B0aW9ucylcbn1cbldyaXRhYmxlLnRvV2ViID0gZnVuY3Rpb24gKHN0cmVhbVdyaXRhYmxlKSB7XG4gIHJldHVybiBsYXp5V2ViU3RyZWFtcygpLm5ld1dyaXRhYmxlU3RyZWFtRnJvbVN0cmVhbVdyaXRhYmxlKHN0cmVhbVdyaXRhYmxlKVxufVxuIiwKICAgICIvKiByZXBsYWNlbWVudCBzdGFydCAqL1xuXG5jb25zdCBwcm9jZXNzID0gcmVxdWlyZSgncHJvY2Vzcy8nKVxuXG4vKiByZXBsYWNlbWVudCBlbmQgKi9cblxuOygndXNlIHN0cmljdCcpXG5jb25zdCBidWZmZXJNb2R1bGUgPSByZXF1aXJlKCdidWZmZXInKVxuY29uc3Qge1xuICBpc1JlYWRhYmxlLFxuICBpc1dyaXRhYmxlLFxuICBpc0l0ZXJhYmxlLFxuICBpc05vZGVTdHJlYW0sXG4gIGlzUmVhZGFibGVOb2RlU3RyZWFtLFxuICBpc1dyaXRhYmxlTm9kZVN0cmVhbSxcbiAgaXNEdXBsZXhOb2RlU3RyZWFtLFxuICBpc1JlYWRhYmxlU3RyZWFtLFxuICBpc1dyaXRhYmxlU3RyZWFtXG59ID0gcmVxdWlyZSgnLi91dGlscycpXG5jb25zdCBlb3MgPSByZXF1aXJlKCcuL2VuZC1vZi1zdHJlYW0nKVxuY29uc3Qge1xuICBBYm9ydEVycm9yLFxuICBjb2RlczogeyBFUlJfSU5WQUxJRF9BUkdfVFlQRSwgRVJSX0lOVkFMSURfUkVUVVJOX1ZBTFVFIH1cbn0gPSByZXF1aXJlKCcuLi8uLi9vdXJzL2Vycm9ycycpXG5jb25zdCB7IGRlc3Ryb3llciB9ID0gcmVxdWlyZSgnLi9kZXN0cm95JylcbmNvbnN0IER1cGxleCA9IHJlcXVpcmUoJy4vZHVwbGV4JylcbmNvbnN0IFJlYWRhYmxlID0gcmVxdWlyZSgnLi9yZWFkYWJsZScpXG5jb25zdCBXcml0YWJsZSA9IHJlcXVpcmUoJy4vd3JpdGFibGUnKVxuY29uc3QgeyBjcmVhdGVEZWZlcnJlZFByb21pc2UgfSA9IHJlcXVpcmUoJy4uLy4uL291cnMvdXRpbCcpXG5jb25zdCBmcm9tID0gcmVxdWlyZSgnLi9mcm9tJylcbmNvbnN0IEJsb2IgPSBnbG9iYWxUaGlzLkJsb2IgfHwgYnVmZmVyTW9kdWxlLkJsb2JcbmNvbnN0IGlzQmxvYiA9XG4gIHR5cGVvZiBCbG9iICE9PSAndW5kZWZpbmVkJ1xuICAgID8gZnVuY3Rpb24gaXNCbG9iKGIpIHtcbiAgICAgICAgcmV0dXJuIGIgaW5zdGFuY2VvZiBCbG9iXG4gICAgICB9XG4gICAgOiBmdW5jdGlvbiBpc0Jsb2IoYikge1xuICAgICAgICByZXR1cm4gZmFsc2VcbiAgICAgIH1cbmNvbnN0IEFib3J0Q29udHJvbGxlciA9IGdsb2JhbFRoaXMuQWJvcnRDb250cm9sbGVyIHx8IHJlcXVpcmUoJ2Fib3J0LWNvbnRyb2xsZXInKS5BYm9ydENvbnRyb2xsZXJcbmNvbnN0IHsgRnVuY3Rpb25Qcm90b3R5cGVDYWxsIH0gPSByZXF1aXJlKCcuLi8uLi9vdXJzL3ByaW1vcmRpYWxzJylcblxuLy8gVGhpcyBpcyBuZWVkZWQgZm9yIHByZSBub2RlIDE3LlxuY2xhc3MgRHVwbGV4aWZ5IGV4dGVuZHMgRHVwbGV4IHtcbiAgY29uc3RydWN0b3Iob3B0aW9ucykge1xuICAgIHN1cGVyKG9wdGlvbnMpXG5cbiAgICAvLyBodHRwczovL2dpdGh1Yi5jb20vbm9kZWpzL25vZGUvcHVsbC8zNDM4NVxuXG4gICAgaWYgKChvcHRpb25zID09PSBudWxsIHx8IG9wdGlvbnMgPT09IHVuZGVmaW5lZCA/IHVuZGVmaW5lZCA6IG9wdGlvbnMucmVhZGFibGUpID09PSBmYWxzZSkge1xuICAgICAgdGhpcy5fcmVhZGFibGVTdGF0ZS5yZWFkYWJsZSA9IGZhbHNlXG4gICAgICB0aGlzLl9yZWFkYWJsZVN0YXRlLmVuZGVkID0gdHJ1ZVxuICAgICAgdGhpcy5fcmVhZGFibGVTdGF0ZS5lbmRFbWl0dGVkID0gdHJ1ZVxuICAgIH1cbiAgICBpZiAoKG9wdGlvbnMgPT09IG51bGwgfHwgb3B0aW9ucyA9PT0gdW5kZWZpbmVkID8gdW5kZWZpbmVkIDogb3B0aW9ucy53cml0YWJsZSkgPT09IGZhbHNlKSB7XG4gICAgICB0aGlzLl93cml0YWJsZVN0YXRlLndyaXRhYmxlID0gZmFsc2VcbiAgICAgIHRoaXMuX3dyaXRhYmxlU3RhdGUuZW5kaW5nID0gdHJ1ZVxuICAgICAgdGhpcy5fd3JpdGFibGVTdGF0ZS5lbmRlZCA9IHRydWVcbiAgICAgIHRoaXMuX3dyaXRhYmxlU3RhdGUuZmluaXNoZWQgPSB0cnVlXG4gICAgfVxuICB9XG59XG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIGR1cGxleGlmeShib2R5LCBuYW1lKSB7XG4gIGlmIChpc0R1cGxleE5vZGVTdHJlYW0oYm9keSkpIHtcbiAgICByZXR1cm4gYm9keVxuICB9XG4gIGlmIChpc1JlYWRhYmxlTm9kZVN0cmVhbShib2R5KSkge1xuICAgIHJldHVybiBfZHVwbGV4aWZ5KHtcbiAgICAgIHJlYWRhYmxlOiBib2R5XG4gICAgfSlcbiAgfVxuICBpZiAoaXNXcml0YWJsZU5vZGVTdHJlYW0oYm9keSkpIHtcbiAgICByZXR1cm4gX2R1cGxleGlmeSh7XG4gICAgICB3cml0YWJsZTogYm9keVxuICAgIH0pXG4gIH1cbiAgaWYgKGlzTm9kZVN0cmVhbShib2R5KSkge1xuICAgIHJldHVybiBfZHVwbGV4aWZ5KHtcbiAgICAgIHdyaXRhYmxlOiBmYWxzZSxcbiAgICAgIHJlYWRhYmxlOiBmYWxzZVxuICAgIH0pXG4gIH1cbiAgaWYgKGlzUmVhZGFibGVTdHJlYW0oYm9keSkpIHtcbiAgICByZXR1cm4gX2R1cGxleGlmeSh7XG4gICAgICByZWFkYWJsZTogUmVhZGFibGUuZnJvbVdlYihib2R5KVxuICAgIH0pXG4gIH1cbiAgaWYgKGlzV3JpdGFibGVTdHJlYW0oYm9keSkpIHtcbiAgICByZXR1cm4gX2R1cGxleGlmeSh7XG4gICAgICB3cml0YWJsZTogV3JpdGFibGUuZnJvbVdlYihib2R5KVxuICAgIH0pXG4gIH1cbiAgaWYgKHR5cGVvZiBib2R5ID09PSAnZnVuY3Rpb24nKSB7XG4gICAgY29uc3QgeyB2YWx1ZSwgd3JpdGUsIGZpbmFsLCBkZXN0cm95IH0gPSBmcm9tQXN5bmNHZW4oYm9keSlcbiAgICBpZiAoaXNJdGVyYWJsZSh2YWx1ZSkpIHtcbiAgICAgIHJldHVybiBmcm9tKER1cGxleGlmeSwgdmFsdWUsIHtcbiAgICAgICAgLy8gVE9ETyAocm9uYWcpOiBoaWdoV2F0ZXJNYXJrP1xuICAgICAgICBvYmplY3RNb2RlOiB0cnVlLFxuICAgICAgICB3cml0ZSxcbiAgICAgICAgZmluYWwsXG4gICAgICAgIGRlc3Ryb3lcbiAgICAgIH0pXG4gICAgfVxuICAgIGNvbnN0IHRoZW4gPSB2YWx1ZSA9PT0gbnVsbCB8fCB2YWx1ZSA9PT0gdW5kZWZpbmVkID8gdW5kZWZpbmVkIDogdmFsdWUudGhlblxuICAgIGlmICh0eXBlb2YgdGhlbiA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgbGV0IGRcbiAgICAgIGNvbnN0IHByb21pc2UgPSBGdW5jdGlvblByb3RvdHlwZUNhbGwoXG4gICAgICAgIHRoZW4sXG4gICAgICAgIHZhbHVlLFxuICAgICAgICAodmFsKSA9PiB7XG4gICAgICAgICAgaWYgKHZhbCAhPSBudWxsKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRVJSX0lOVkFMSURfUkVUVVJOX1ZBTFVFKCdudWxseScsICdib2R5JywgdmFsKVxuICAgICAgICAgIH1cbiAgICAgICAgfSxcbiAgICAgICAgKGVycikgPT4ge1xuICAgICAgICAgIGRlc3Ryb3llcihkLCBlcnIpXG4gICAgICAgIH1cbiAgICAgIClcbiAgICAgIHJldHVybiAoZCA9IG5ldyBEdXBsZXhpZnkoe1xuICAgICAgICAvLyBUT0RPIChyb25hZyk6IGhpZ2hXYXRlck1hcms/XG4gICAgICAgIG9iamVjdE1vZGU6IHRydWUsXG4gICAgICAgIHJlYWRhYmxlOiBmYWxzZSxcbiAgICAgICAgd3JpdGUsXG4gICAgICAgIGZpbmFsKGNiKSB7XG4gICAgICAgICAgZmluYWwoYXN5bmMgKCkgPT4ge1xuICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgYXdhaXQgcHJvbWlzZVxuICAgICAgICAgICAgICBwcm9jZXNzLm5leHRUaWNrKGNiLCBudWxsKVxuICAgICAgICAgICAgfSBjYXRjaCAoZXJyKSB7XG4gICAgICAgICAgICAgIHByb2Nlc3MubmV4dFRpY2soY2IsIGVycilcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9KVxuICAgICAgICB9LFxuICAgICAgICBkZXN0cm95XG4gICAgICB9KSlcbiAgICB9XG4gICAgdGhyb3cgbmV3IEVSUl9JTlZBTElEX1JFVFVSTl9WQUxVRSgnSXRlcmFibGUsIEFzeW5jSXRlcmFibGUgb3IgQXN5bmNGdW5jdGlvbicsIG5hbWUsIHZhbHVlKVxuICB9XG4gIGlmIChpc0Jsb2IoYm9keSkpIHtcbiAgICByZXR1cm4gZHVwbGV4aWZ5KGJvZHkuYXJyYXlCdWZmZXIoKSlcbiAgfVxuICBpZiAoaXNJdGVyYWJsZShib2R5KSkge1xuICAgIHJldHVybiBmcm9tKER1cGxleGlmeSwgYm9keSwge1xuICAgICAgLy8gVE9ETyAocm9uYWcpOiBoaWdoV2F0ZXJNYXJrP1xuICAgICAgb2JqZWN0TW9kZTogdHJ1ZSxcbiAgICAgIHdyaXRhYmxlOiBmYWxzZVxuICAgIH0pXG4gIH1cbiAgaWYgKFxuICAgIGlzUmVhZGFibGVTdHJlYW0oYm9keSA9PT0gbnVsbCB8fCBib2R5ID09PSB1bmRlZmluZWQgPyB1bmRlZmluZWQgOiBib2R5LnJlYWRhYmxlKSAmJlxuICAgIGlzV3JpdGFibGVTdHJlYW0oYm9keSA9PT0gbnVsbCB8fCBib2R5ID09PSB1bmRlZmluZWQgPyB1bmRlZmluZWQgOiBib2R5LndyaXRhYmxlKVxuICApIHtcbiAgICByZXR1cm4gRHVwbGV4aWZ5LmZyb21XZWIoYm9keSlcbiAgfVxuICBpZiAoXG4gICAgdHlwZW9mIChib2R5ID09PSBudWxsIHx8IGJvZHkgPT09IHVuZGVmaW5lZCA/IHVuZGVmaW5lZCA6IGJvZHkud3JpdGFibGUpID09PSAnb2JqZWN0JyB8fFxuICAgIHR5cGVvZiAoYm9keSA9PT0gbnVsbCB8fCBib2R5ID09PSB1bmRlZmluZWQgPyB1bmRlZmluZWQgOiBib2R5LnJlYWRhYmxlKSA9PT0gJ29iamVjdCdcbiAgKSB7XG4gICAgY29uc3QgcmVhZGFibGUgPVxuICAgICAgYm9keSAhPT0gbnVsbCAmJiBib2R5ICE9PSB1bmRlZmluZWQgJiYgYm9keS5yZWFkYWJsZVxuICAgICAgICA/IGlzUmVhZGFibGVOb2RlU3RyZWFtKGJvZHkgPT09IG51bGwgfHwgYm9keSA9PT0gdW5kZWZpbmVkID8gdW5kZWZpbmVkIDogYm9keS5yZWFkYWJsZSlcbiAgICAgICAgICA/IGJvZHkgPT09IG51bGwgfHwgYm9keSA9PT0gdW5kZWZpbmVkXG4gICAgICAgICAgICA/IHVuZGVmaW5lZFxuICAgICAgICAgICAgOiBib2R5LnJlYWRhYmxlXG4gICAgICAgICAgOiBkdXBsZXhpZnkoYm9keS5yZWFkYWJsZSlcbiAgICAgICAgOiB1bmRlZmluZWRcbiAgICBjb25zdCB3cml0YWJsZSA9XG4gICAgICBib2R5ICE9PSBudWxsICYmIGJvZHkgIT09IHVuZGVmaW5lZCAmJiBib2R5LndyaXRhYmxlXG4gICAgICAgID8gaXNXcml0YWJsZU5vZGVTdHJlYW0oYm9keSA9PT0gbnVsbCB8fCBib2R5ID09PSB1bmRlZmluZWQgPyB1bmRlZmluZWQgOiBib2R5LndyaXRhYmxlKVxuICAgICAgICAgID8gYm9keSA9PT0gbnVsbCB8fCBib2R5ID09PSB1bmRlZmluZWRcbiAgICAgICAgICAgID8gdW5kZWZpbmVkXG4gICAgICAgICAgICA6IGJvZHkud3JpdGFibGVcbiAgICAgICAgICA6IGR1cGxleGlmeShib2R5LndyaXRhYmxlKVxuICAgICAgICA6IHVuZGVmaW5lZFxuICAgIHJldHVybiBfZHVwbGV4aWZ5KHtcbiAgICAgIHJlYWRhYmxlLFxuICAgICAgd3JpdGFibGVcbiAgICB9KVxuICB9XG4gIGNvbnN0IHRoZW4gPSBib2R5ID09PSBudWxsIHx8IGJvZHkgPT09IHVuZGVmaW5lZCA/IHVuZGVmaW5lZCA6IGJvZHkudGhlblxuICBpZiAodHlwZW9mIHRoZW4gPT09ICdmdW5jdGlvbicpIHtcbiAgICBsZXQgZFxuICAgIEZ1bmN0aW9uUHJvdG90eXBlQ2FsbChcbiAgICAgIHRoZW4sXG4gICAgICBib2R5LFxuICAgICAgKHZhbCkgPT4ge1xuICAgICAgICBpZiAodmFsICE9IG51bGwpIHtcbiAgICAgICAgICBkLnB1c2godmFsKVxuICAgICAgICB9XG4gICAgICAgIGQucHVzaChudWxsKVxuICAgICAgfSxcbiAgICAgIChlcnIpID0+IHtcbiAgICAgICAgZGVzdHJveWVyKGQsIGVycilcbiAgICAgIH1cbiAgICApXG4gICAgcmV0dXJuIChkID0gbmV3IER1cGxleGlmeSh7XG4gICAgICBvYmplY3RNb2RlOiB0cnVlLFxuICAgICAgd3JpdGFibGU6IGZhbHNlLFxuICAgICAgcmVhZCgpIHt9XG4gICAgfSkpXG4gIH1cbiAgdGhyb3cgbmV3IEVSUl9JTlZBTElEX0FSR19UWVBFKFxuICAgIG5hbWUsXG4gICAgW1xuICAgICAgJ0Jsb2InLFxuICAgICAgJ1JlYWRhYmxlU3RyZWFtJyxcbiAgICAgICdXcml0YWJsZVN0cmVhbScsXG4gICAgICAnU3RyZWFtJyxcbiAgICAgICdJdGVyYWJsZScsXG4gICAgICAnQXN5bmNJdGVyYWJsZScsXG4gICAgICAnRnVuY3Rpb24nLFxuICAgICAgJ3sgcmVhZGFibGUsIHdyaXRhYmxlIH0gcGFpcicsXG4gICAgICAnUHJvbWlzZSdcbiAgICBdLFxuICAgIGJvZHlcbiAgKVxufVxuZnVuY3Rpb24gZnJvbUFzeW5jR2VuKGZuKSB7XG4gIGxldCB7IHByb21pc2UsIHJlc29sdmUgfSA9IGNyZWF0ZURlZmVycmVkUHJvbWlzZSgpXG4gIGNvbnN0IGFjID0gbmV3IEFib3J0Q29udHJvbGxlcigpXG4gIGNvbnN0IHNpZ25hbCA9IGFjLnNpZ25hbFxuICBjb25zdCB2YWx1ZSA9IGZuKFxuICAgIChhc3luYyBmdW5jdGlvbiogKCkge1xuICAgICAgd2hpbGUgKHRydWUpIHtcbiAgICAgICAgY29uc3QgX3Byb21pc2UgPSBwcm9taXNlXG4gICAgICAgIHByb21pc2UgPSBudWxsXG4gICAgICAgIGNvbnN0IHsgY2h1bmssIGRvbmUsIGNiIH0gPSBhd2FpdCBfcHJvbWlzZVxuICAgICAgICBwcm9jZXNzLm5leHRUaWNrKGNiKVxuICAgICAgICBpZiAoZG9uZSkgcmV0dXJuXG4gICAgICAgIGlmIChzaWduYWwuYWJvcnRlZClcbiAgICAgICAgICB0aHJvdyBuZXcgQWJvcnRFcnJvcih1bmRlZmluZWQsIHtcbiAgICAgICAgICAgIGNhdXNlOiBzaWduYWwucmVhc29uXG4gICAgICAgICAgfSlcbiAgICAgICAgOyh7IHByb21pc2UsIHJlc29sdmUgfSA9IGNyZWF0ZURlZmVycmVkUHJvbWlzZSgpKVxuICAgICAgICB5aWVsZCBjaHVua1xuICAgICAgfVxuICAgIH0pKCksXG4gICAge1xuICAgICAgc2lnbmFsXG4gICAgfVxuICApXG4gIHJldHVybiB7XG4gICAgdmFsdWUsXG4gICAgd3JpdGUoY2h1bmssIGVuY29kaW5nLCBjYikge1xuICAgICAgY29uc3QgX3Jlc29sdmUgPSByZXNvbHZlXG4gICAgICByZXNvbHZlID0gbnVsbFxuICAgICAgX3Jlc29sdmUoe1xuICAgICAgICBjaHVuayxcbiAgICAgICAgZG9uZTogZmFsc2UsXG4gICAgICAgIGNiXG4gICAgICB9KVxuICAgIH0sXG4gICAgZmluYWwoY2IpIHtcbiAgICAgIGNvbnN0IF9yZXNvbHZlID0gcmVzb2x2ZVxuICAgICAgcmVzb2x2ZSA9IG51bGxcbiAgICAgIF9yZXNvbHZlKHtcbiAgICAgICAgZG9uZTogdHJ1ZSxcbiAgICAgICAgY2JcbiAgICAgIH0pXG4gICAgfSxcbiAgICBkZXN0cm95KGVyciwgY2IpIHtcbiAgICAgIGFjLmFib3J0KClcbiAgICAgIGNiKGVycilcbiAgICB9XG4gIH1cbn1cbmZ1bmN0aW9uIF9kdXBsZXhpZnkocGFpcikge1xuICBjb25zdCByID0gcGFpci5yZWFkYWJsZSAmJiB0eXBlb2YgcGFpci5yZWFkYWJsZS5yZWFkICE9PSAnZnVuY3Rpb24nID8gUmVhZGFibGUud3JhcChwYWlyLnJlYWRhYmxlKSA6IHBhaXIucmVhZGFibGVcbiAgY29uc3QgdyA9IHBhaXIud3JpdGFibGVcbiAgbGV0IHJlYWRhYmxlID0gISFpc1JlYWRhYmxlKHIpXG4gIGxldCB3cml0YWJsZSA9ICEhaXNXcml0YWJsZSh3KVxuICBsZXQgb25kcmFpblxuICBsZXQgb25maW5pc2hcbiAgbGV0IG9ucmVhZGFibGVcbiAgbGV0IG9uY2xvc2VcbiAgbGV0IGRcbiAgZnVuY3Rpb24gb25maW5pc2hlZChlcnIpIHtcbiAgICBjb25zdCBjYiA9IG9uY2xvc2VcbiAgICBvbmNsb3NlID0gbnVsbFxuICAgIGlmIChjYikge1xuICAgICAgY2IoZXJyKVxuICAgIH0gZWxzZSBpZiAoZXJyKSB7XG4gICAgICBkLmRlc3Ryb3koZXJyKVxuICAgIH1cbiAgfVxuXG4gIC8vIFRPRE8ocm9uYWcpOiBBdm9pZCBkb3VibGUgYnVmZmVyaW5nLlxuICAvLyBJbXBsZW1lbnQgV3JpdGFibGUvUmVhZGFibGUvRHVwbGV4IHRyYWl0cy5cbiAgLy8gU2VlLCBodHRwczovL2dpdGh1Yi5jb20vbm9kZWpzL25vZGUvcHVsbC8zMzUxNS5cbiAgZCA9IG5ldyBEdXBsZXhpZnkoe1xuICAgIC8vIFRPRE8gKHJvbmFnKTogaGlnaFdhdGVyTWFyaz9cbiAgICByZWFkYWJsZU9iamVjdE1vZGU6ICEhKHIgIT09IG51bGwgJiYgciAhPT0gdW5kZWZpbmVkICYmIHIucmVhZGFibGVPYmplY3RNb2RlKSxcbiAgICB3cml0YWJsZU9iamVjdE1vZGU6ICEhKHcgIT09IG51bGwgJiYgdyAhPT0gdW5kZWZpbmVkICYmIHcud3JpdGFibGVPYmplY3RNb2RlKSxcbiAgICByZWFkYWJsZSxcbiAgICB3cml0YWJsZVxuICB9KVxuICBpZiAod3JpdGFibGUpIHtcbiAgICBlb3ModywgKGVycikgPT4ge1xuICAgICAgd3JpdGFibGUgPSBmYWxzZVxuICAgICAgaWYgKGVycikge1xuICAgICAgICBkZXN0cm95ZXIociwgZXJyKVxuICAgICAgfVxuICAgICAgb25maW5pc2hlZChlcnIpXG4gICAgfSlcbiAgICBkLl93cml0ZSA9IGZ1bmN0aW9uIChjaHVuaywgZW5jb2RpbmcsIGNhbGxiYWNrKSB7XG4gICAgICBpZiAody53cml0ZShjaHVuaywgZW5jb2RpbmcpKSB7XG4gICAgICAgIGNhbGxiYWNrKClcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIG9uZHJhaW4gPSBjYWxsYmFja1xuICAgICAgfVxuICAgIH1cbiAgICBkLl9maW5hbCA9IGZ1bmN0aW9uIChjYWxsYmFjaykge1xuICAgICAgdy5lbmQoKVxuICAgICAgb25maW5pc2ggPSBjYWxsYmFja1xuICAgIH1cbiAgICB3Lm9uKCdkcmFpbicsIGZ1bmN0aW9uICgpIHtcbiAgICAgIGlmIChvbmRyYWluKSB7XG4gICAgICAgIGNvbnN0IGNiID0gb25kcmFpblxuICAgICAgICBvbmRyYWluID0gbnVsbFxuICAgICAgICBjYigpXG4gICAgICB9XG4gICAgfSlcbiAgICB3Lm9uKCdmaW5pc2gnLCBmdW5jdGlvbiAoKSB7XG4gICAgICBpZiAob25maW5pc2gpIHtcbiAgICAgICAgY29uc3QgY2IgPSBvbmZpbmlzaFxuICAgICAgICBvbmZpbmlzaCA9IG51bGxcbiAgICAgICAgY2IoKVxuICAgICAgfVxuICAgIH0pXG4gIH1cbiAgaWYgKHJlYWRhYmxlKSB7XG4gICAgZW9zKHIsIChlcnIpID0+IHtcbiAgICAgIHJlYWRhYmxlID0gZmFsc2VcbiAgICAgIGlmIChlcnIpIHtcbiAgICAgICAgZGVzdHJveWVyKHIsIGVycilcbiAgICAgIH1cbiAgICAgIG9uZmluaXNoZWQoZXJyKVxuICAgIH0pXG4gICAgci5vbigncmVhZGFibGUnLCBmdW5jdGlvbiAoKSB7XG4gICAgICBpZiAob25yZWFkYWJsZSkge1xuICAgICAgICBjb25zdCBjYiA9IG9ucmVhZGFibGVcbiAgICAgICAgb25yZWFkYWJsZSA9IG51bGxcbiAgICAgICAgY2IoKVxuICAgICAgfVxuICAgIH0pXG4gICAgci5vbignZW5kJywgZnVuY3Rpb24gKCkge1xuICAgICAgZC5wdXNoKG51bGwpXG4gICAgfSlcbiAgICBkLl9yZWFkID0gZnVuY3Rpb24gKCkge1xuICAgICAgd2hpbGUgKHRydWUpIHtcbiAgICAgICAgY29uc3QgYnVmID0gci5yZWFkKClcbiAgICAgICAgaWYgKGJ1ZiA9PT0gbnVsbCkge1xuICAgICAgICAgIG9ucmVhZGFibGUgPSBkLl9yZWFkXG4gICAgICAgICAgcmV0dXJuXG4gICAgICAgIH1cbiAgICAgICAgaWYgKCFkLnB1c2goYnVmKSkge1xuICAgICAgICAgIHJldHVyblxuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICB9XG4gIGQuX2Rlc3Ryb3kgPSBmdW5jdGlvbiAoZXJyLCBjYWxsYmFjaykge1xuICAgIGlmICghZXJyICYmIG9uY2xvc2UgIT09IG51bGwpIHtcbiAgICAgIGVyciA9IG5ldyBBYm9ydEVycm9yKClcbiAgICB9XG4gICAgb25yZWFkYWJsZSA9IG51bGxcbiAgICBvbmRyYWluID0gbnVsbFxuICAgIG9uZmluaXNoID0gbnVsbFxuICAgIGlmIChvbmNsb3NlID09PSBudWxsKSB7XG4gICAgICBjYWxsYmFjayhlcnIpXG4gICAgfSBlbHNlIHtcbiAgICAgIG9uY2xvc2UgPSBjYWxsYmFja1xuICAgICAgZGVzdHJveWVyKHcsIGVycilcbiAgICAgIGRlc3Ryb3llcihyLCBlcnIpXG4gICAgfVxuICB9XG4gIHJldHVybiBkXG59XG4iLAogICAgIi8vIENvcHlyaWdodCBKb3llbnQsIEluYy4gYW5kIG90aGVyIE5vZGUgY29udHJpYnV0b3JzLlxuLy9cbi8vIFBlcm1pc3Npb24gaXMgaGVyZWJ5IGdyYW50ZWQsIGZyZWUgb2YgY2hhcmdlLCB0byBhbnkgcGVyc29uIG9idGFpbmluZyBhXG4vLyBjb3B5IG9mIHRoaXMgc29mdHdhcmUgYW5kIGFzc29jaWF0ZWQgZG9jdW1lbnRhdGlvbiBmaWxlcyAodGhlXG4vLyBcIlNvZnR3YXJlXCIpLCB0byBkZWFsIGluIHRoZSBTb2Z0d2FyZSB3aXRob3V0IHJlc3RyaWN0aW9uLCBpbmNsdWRpbmdcbi8vIHdpdGhvdXQgbGltaXRhdGlvbiB0aGUgcmlnaHRzIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBtZXJnZSwgcHVibGlzaCxcbi8vIGRpc3RyaWJ1dGUsIHN1YmxpY2Vuc2UsIGFuZC9vciBzZWxsIGNvcGllcyBvZiB0aGUgU29mdHdhcmUsIGFuZCB0byBwZXJtaXRcbi8vIHBlcnNvbnMgdG8gd2hvbSB0aGUgU29mdHdhcmUgaXMgZnVybmlzaGVkIHRvIGRvIHNvLCBzdWJqZWN0IHRvIHRoZVxuLy8gZm9sbG93aW5nIGNvbmRpdGlvbnM6XG4vL1xuLy8gVGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2Ugc2hhbGwgYmUgaW5jbHVkZWRcbi8vIGluIGFsbCBjb3BpZXMgb3Igc3Vic3RhbnRpYWwgcG9ydGlvbnMgb2YgdGhlIFNvZnR3YXJlLlxuLy9cbi8vIFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCBcIkFTIElTXCIsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIEVYUFJFU1Ncbi8vIE9SIElNUExJRUQsIElOQ0xVRElORyBCVVQgTk9UIExJTUlURUQgVE8gVEhFIFdBUlJBTlRJRVMgT0Zcbi8vIE1FUkNIQU5UQUJJTElUWSwgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQU5EIE5PTklORlJJTkdFTUVOVC4gSU5cbi8vIE5PIEVWRU5UIFNIQUxMIFRIRSBBVVRIT1JTIE9SIENPUFlSSUdIVCBIT0xERVJTIEJFIExJQUJMRSBGT1IgQU5ZIENMQUlNLFxuLy8gREFNQUdFUyBPUiBPVEhFUiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQU4gQUNUSU9OIE9GIENPTlRSQUNULCBUT1JUIE9SXG4vLyBPVEhFUldJU0UsIEFSSVNJTkcgRlJPTSwgT1VUIE9GIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUgU09GVFdBUkUgT1IgVEhFXG4vLyBVU0UgT1IgT1RIRVIgREVBTElOR1MgSU4gVEhFIFNPRlRXQVJFLlxuXG4vLyBhIGR1cGxleCBzdHJlYW0gaXMganVzdCBhIHN0cmVhbSB0aGF0IGlzIGJvdGggcmVhZGFibGUgYW5kIHdyaXRhYmxlLlxuLy8gU2luY2UgSlMgZG9lc24ndCBoYXZlIG11bHRpcGxlIHByb3RvdHlwZSBpbmhlcml0YW5jZSwgdGhpcyBjbGFzc1xuLy8gcHJvdG90eXBpY2FsbHkgaW5oZXJpdHMgZnJvbSBSZWFkYWJsZSwgYW5kIHRoZW4gcGFyYXNpdGljYWxseSBmcm9tXG4vLyBXcml0YWJsZS5cblxuJ3VzZSBzdHJpY3QnXG5cbmNvbnN0IHtcbiAgT2JqZWN0RGVmaW5lUHJvcGVydGllcyxcbiAgT2JqZWN0R2V0T3duUHJvcGVydHlEZXNjcmlwdG9yLFxuICBPYmplY3RLZXlzLFxuICBPYmplY3RTZXRQcm90b3R5cGVPZlxufSA9IHJlcXVpcmUoJy4uLy4uL291cnMvcHJpbW9yZGlhbHMnKVxubW9kdWxlLmV4cG9ydHMgPSBEdXBsZXhcbmNvbnN0IFJlYWRhYmxlID0gcmVxdWlyZSgnLi9yZWFkYWJsZScpXG5jb25zdCBXcml0YWJsZSA9IHJlcXVpcmUoJy4vd3JpdGFibGUnKVxuT2JqZWN0U2V0UHJvdG90eXBlT2YoRHVwbGV4LnByb3RvdHlwZSwgUmVhZGFibGUucHJvdG90eXBlKVxuT2JqZWN0U2V0UHJvdG90eXBlT2YoRHVwbGV4LCBSZWFkYWJsZSlcbntcbiAgY29uc3Qga2V5cyA9IE9iamVjdEtleXMoV3JpdGFibGUucHJvdG90eXBlKVxuICAvLyBBbGxvdyB0aGUga2V5cyBhcnJheSB0byBiZSBHQydlZC5cbiAgZm9yIChsZXQgaSA9IDA7IGkgPCBrZXlzLmxlbmd0aDsgaSsrKSB7XG4gICAgY29uc3QgbWV0aG9kID0ga2V5c1tpXVxuICAgIGlmICghRHVwbGV4LnByb3RvdHlwZVttZXRob2RdKSBEdXBsZXgucHJvdG90eXBlW21ldGhvZF0gPSBXcml0YWJsZS5wcm90b3R5cGVbbWV0aG9kXVxuICB9XG59XG5mdW5jdGlvbiBEdXBsZXgob3B0aW9ucykge1xuICBpZiAoISh0aGlzIGluc3RhbmNlb2YgRHVwbGV4KSkgcmV0dXJuIG5ldyBEdXBsZXgob3B0aW9ucylcbiAgUmVhZGFibGUuY2FsbCh0aGlzLCBvcHRpb25zKVxuICBXcml0YWJsZS5jYWxsKHRoaXMsIG9wdGlvbnMpXG4gIGlmIChvcHRpb25zKSB7XG4gICAgdGhpcy5hbGxvd0hhbGZPcGVuID0gb3B0aW9ucy5hbGxvd0hhbGZPcGVuICE9PSBmYWxzZVxuICAgIGlmIChvcHRpb25zLnJlYWRhYmxlID09PSBmYWxzZSkge1xuICAgICAgdGhpcy5fcmVhZGFibGVTdGF0ZS5yZWFkYWJsZSA9IGZhbHNlXG4gICAgICB0aGlzLl9yZWFkYWJsZVN0YXRlLmVuZGVkID0gdHJ1ZVxuICAgICAgdGhpcy5fcmVhZGFibGVTdGF0ZS5lbmRFbWl0dGVkID0gdHJ1ZVxuICAgIH1cbiAgICBpZiAob3B0aW9ucy53cml0YWJsZSA9PT0gZmFsc2UpIHtcbiAgICAgIHRoaXMuX3dyaXRhYmxlU3RhdGUud3JpdGFibGUgPSBmYWxzZVxuICAgICAgdGhpcy5fd3JpdGFibGVTdGF0ZS5lbmRpbmcgPSB0cnVlXG4gICAgICB0aGlzLl93cml0YWJsZVN0YXRlLmVuZGVkID0gdHJ1ZVxuICAgICAgdGhpcy5fd3JpdGFibGVTdGF0ZS5maW5pc2hlZCA9IHRydWVcbiAgICB9XG4gIH0gZWxzZSB7XG4gICAgdGhpcy5hbGxvd0hhbGZPcGVuID0gdHJ1ZVxuICB9XG59XG5PYmplY3REZWZpbmVQcm9wZXJ0aWVzKER1cGxleC5wcm90b3R5cGUsIHtcbiAgd3JpdGFibGU6IHtcbiAgICBfX3Byb3RvX186IG51bGwsXG4gICAgLi4uT2JqZWN0R2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKFdyaXRhYmxlLnByb3RvdHlwZSwgJ3dyaXRhYmxlJylcbiAgfSxcbiAgd3JpdGFibGVIaWdoV2F0ZXJNYXJrOiB7XG4gICAgX19wcm90b19fOiBudWxsLFxuICAgIC4uLk9iamVjdEdldE93blByb3BlcnR5RGVzY3JpcHRvcihXcml0YWJsZS5wcm90b3R5cGUsICd3cml0YWJsZUhpZ2hXYXRlck1hcmsnKVxuICB9LFxuICB3cml0YWJsZU9iamVjdE1vZGU6IHtcbiAgICBfX3Byb3RvX186IG51bGwsXG4gICAgLi4uT2JqZWN0R2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKFdyaXRhYmxlLnByb3RvdHlwZSwgJ3dyaXRhYmxlT2JqZWN0TW9kZScpXG4gIH0sXG4gIHdyaXRhYmxlQnVmZmVyOiB7XG4gICAgX19wcm90b19fOiBudWxsLFxuICAgIC4uLk9iamVjdEdldE93blByb3BlcnR5RGVzY3JpcHRvcihXcml0YWJsZS5wcm90b3R5cGUsICd3cml0YWJsZUJ1ZmZlcicpXG4gIH0sXG4gIHdyaXRhYmxlTGVuZ3RoOiB7XG4gICAgX19wcm90b19fOiBudWxsLFxuICAgIC4uLk9iamVjdEdldE93blByb3BlcnR5RGVzY3JpcHRvcihXcml0YWJsZS5wcm90b3R5cGUsICd3cml0YWJsZUxlbmd0aCcpXG4gIH0sXG4gIHdyaXRhYmxlRmluaXNoZWQ6IHtcbiAgICBfX3Byb3RvX186IG51bGwsXG4gICAgLi4uT2JqZWN0R2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKFdyaXRhYmxlLnByb3RvdHlwZSwgJ3dyaXRhYmxlRmluaXNoZWQnKVxuICB9LFxuICB3cml0YWJsZUNvcmtlZDoge1xuICAgIF9fcHJvdG9fXzogbnVsbCxcbiAgICAuLi5PYmplY3RHZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IoV3JpdGFibGUucHJvdG90eXBlLCAnd3JpdGFibGVDb3JrZWQnKVxuICB9LFxuICB3cml0YWJsZUVuZGVkOiB7XG4gICAgX19wcm90b19fOiBudWxsLFxuICAgIC4uLk9iamVjdEdldE93blByb3BlcnR5RGVzY3JpcHRvcihXcml0YWJsZS5wcm90b3R5cGUsICd3cml0YWJsZUVuZGVkJylcbiAgfSxcbiAgd3JpdGFibGVOZWVkRHJhaW46IHtcbiAgICBfX3Byb3RvX186IG51bGwsXG4gICAgLi4uT2JqZWN0R2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKFdyaXRhYmxlLnByb3RvdHlwZSwgJ3dyaXRhYmxlTmVlZERyYWluJylcbiAgfSxcbiAgZGVzdHJveWVkOiB7XG4gICAgX19wcm90b19fOiBudWxsLFxuICAgIGdldCgpIHtcbiAgICAgIGlmICh0aGlzLl9yZWFkYWJsZVN0YXRlID09PSB1bmRlZmluZWQgfHwgdGhpcy5fd3JpdGFibGVTdGF0ZSA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgIHJldHVybiBmYWxzZVxuICAgICAgfVxuICAgICAgcmV0dXJuIHRoaXMuX3JlYWRhYmxlU3RhdGUuZGVzdHJveWVkICYmIHRoaXMuX3dyaXRhYmxlU3RhdGUuZGVzdHJveWVkXG4gICAgfSxcbiAgICBzZXQodmFsdWUpIHtcbiAgICAgIC8vIEJhY2t3YXJkIGNvbXBhdGliaWxpdHksIHRoZSB1c2VyIGlzIGV4cGxpY2l0bHlcbiAgICAgIC8vIG1hbmFnaW5nIGRlc3Ryb3llZC5cbiAgICAgIGlmICh0aGlzLl9yZWFkYWJsZVN0YXRlICYmIHRoaXMuX3dyaXRhYmxlU3RhdGUpIHtcbiAgICAgICAgdGhpcy5fcmVhZGFibGVTdGF0ZS5kZXN0cm95ZWQgPSB2YWx1ZVxuICAgICAgICB0aGlzLl93cml0YWJsZVN0YXRlLmRlc3Ryb3llZCA9IHZhbHVlXG4gICAgICB9XG4gICAgfVxuICB9XG59KVxubGV0IHdlYlN0cmVhbXNBZGFwdGVyc1xuXG4vLyBMYXp5IHRvIGF2b2lkIGNpcmN1bGFyIHJlZmVyZW5jZXNcbmZ1bmN0aW9uIGxhenlXZWJTdHJlYW1zKCkge1xuICBpZiAod2ViU3RyZWFtc0FkYXB0ZXJzID09PSB1bmRlZmluZWQpIHdlYlN0cmVhbXNBZGFwdGVycyA9IHt9XG4gIHJldHVybiB3ZWJTdHJlYW1zQWRhcHRlcnNcbn1cbkR1cGxleC5mcm9tV2ViID0gZnVuY3Rpb24gKHBhaXIsIG9wdGlvbnMpIHtcbiAgcmV0dXJuIGxhenlXZWJTdHJlYW1zKCkubmV3U3RyZWFtRHVwbGV4RnJvbVJlYWRhYmxlV3JpdGFibGVQYWlyKHBhaXIsIG9wdGlvbnMpXG59XG5EdXBsZXgudG9XZWIgPSBmdW5jdGlvbiAoZHVwbGV4KSB7XG4gIHJldHVybiBsYXp5V2ViU3RyZWFtcygpLm5ld1JlYWRhYmxlV3JpdGFibGVQYWlyRnJvbUR1cGxleChkdXBsZXgpXG59XG5sZXQgZHVwbGV4aWZ5XG5EdXBsZXguZnJvbSA9IGZ1bmN0aW9uIChib2R5KSB7XG4gIGlmICghZHVwbGV4aWZ5KSB7XG4gICAgZHVwbGV4aWZ5ID0gcmVxdWlyZSgnLi9kdXBsZXhpZnknKVxuICB9XG4gIHJldHVybiBkdXBsZXhpZnkoYm9keSwgJ2JvZHknKVxufVxuIiwKICAgICIvLyBDb3B5cmlnaHQgSm95ZW50LCBJbmMuIGFuZCBvdGhlciBOb2RlIGNvbnRyaWJ1dG9ycy5cbi8vXG4vLyBQZXJtaXNzaW9uIGlzIGhlcmVieSBncmFudGVkLCBmcmVlIG9mIGNoYXJnZSwgdG8gYW55IHBlcnNvbiBvYnRhaW5pbmcgYVxuLy8gY29weSBvZiB0aGlzIHNvZnR3YXJlIGFuZCBhc3NvY2lhdGVkIGRvY3VtZW50YXRpb24gZmlsZXMgKHRoZVxuLy8gXCJTb2Z0d2FyZVwiKSwgdG8gZGVhbCBpbiB0aGUgU29mdHdhcmUgd2l0aG91dCByZXN0cmljdGlvbiwgaW5jbHVkaW5nXG4vLyB3aXRob3V0IGxpbWl0YXRpb24gdGhlIHJpZ2h0cyB0byB1c2UsIGNvcHksIG1vZGlmeSwgbWVyZ2UsIHB1Ymxpc2gsXG4vLyBkaXN0cmlidXRlLCBzdWJsaWNlbnNlLCBhbmQvb3Igc2VsbCBjb3BpZXMgb2YgdGhlIFNvZnR3YXJlLCBhbmQgdG8gcGVybWl0XG4vLyBwZXJzb25zIHRvIHdob20gdGhlIFNvZnR3YXJlIGlzIGZ1cm5pc2hlZCB0byBkbyBzbywgc3ViamVjdCB0byB0aGVcbi8vIGZvbGxvd2luZyBjb25kaXRpb25zOlxuLy9cbi8vIFRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIHNoYWxsIGJlIGluY2x1ZGVkXG4vLyBpbiBhbGwgY29waWVzIG9yIHN1YnN0YW50aWFsIHBvcnRpb25zIG9mIHRoZSBTb2Z0d2FyZS5cbi8vXG4vLyBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgXCJBUyBJU1wiLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBFWFBSRVNTXG4vLyBPUiBJTVBMSUVELCBJTkNMVURJTkcgQlVUIE5PVCBMSU1JVEVEIFRPIFRIRSBXQVJSQU5USUVTIE9GXG4vLyBNRVJDSEFOVEFCSUxJVFksIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFORCBOT05JTkZSSU5HRU1FTlQuIElOXG4vLyBOTyBFVkVOVCBTSEFMTCBUSEUgQVVUSE9SUyBPUiBDT1BZUklHSFQgSE9MREVSUyBCRSBMSUFCTEUgRk9SIEFOWSBDTEFJTSxcbi8vIERBTUFHRVMgT1IgT1RIRVIgTElBQklMSVRZLCBXSEVUSEVSIElOIEFOIEFDVElPTiBPRiBDT05UUkFDVCwgVE9SVCBPUlxuLy8gT1RIRVJXSVNFLCBBUklTSU5HIEZST00sIE9VVCBPRiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFNPRlRXQVJFIE9SIFRIRVxuLy8gVVNFIE9SIE9USEVSIERFQUxJTkdTIElOIFRIRSBTT0ZUV0FSRS5cblxuLy8gYSB0cmFuc2Zvcm0gc3RyZWFtIGlzIGEgcmVhZGFibGUvd3JpdGFibGUgc3RyZWFtIHdoZXJlIHlvdSBkb1xuLy8gc29tZXRoaW5nIHdpdGggdGhlIGRhdGEuICBTb21ldGltZXMgaXQncyBjYWxsZWQgYSBcImZpbHRlclwiLFxuLy8gYnV0IHRoYXQncyBub3QgYSBncmVhdCBuYW1lIGZvciBpdCwgc2luY2UgdGhhdCBpbXBsaWVzIGEgdGhpbmcgd2hlcmVcbi8vIHNvbWUgYml0cyBwYXNzIHRocm91Z2gsIGFuZCBvdGhlcnMgYXJlIHNpbXBseSBpZ25vcmVkLiAgKFRoYXQgd291bGRcbi8vIGJlIGEgdmFsaWQgZXhhbXBsZSBvZiBhIHRyYW5zZm9ybSwgb2YgY291cnNlLilcbi8vXG4vLyBXaGlsZSB0aGUgb3V0cHV0IGlzIGNhdXNhbGx5IHJlbGF0ZWQgdG8gdGhlIGlucHV0LCBpdCdzIG5vdCBhXG4vLyBuZWNlc3NhcmlseSBzeW1tZXRyaWMgb3Igc3luY2hyb25vdXMgdHJhbnNmb3JtYXRpb24uICBGb3IgZXhhbXBsZSxcbi8vIGEgemxpYiBzdHJlYW0gbWlnaHQgdGFrZSBtdWx0aXBsZSBwbGFpbi10ZXh0IHdyaXRlcygpLCBhbmQgdGhlblxuLy8gZW1pdCBhIHNpbmdsZSBjb21wcmVzc2VkIGNodW5rIHNvbWUgdGltZSBpbiB0aGUgZnV0dXJlLlxuLy9cbi8vIEhlcmUncyBob3cgdGhpcyB3b3Jrczpcbi8vXG4vLyBUaGUgVHJhbnNmb3JtIHN0cmVhbSBoYXMgYWxsIHRoZSBhc3BlY3RzIG9mIHRoZSByZWFkYWJsZSBhbmQgd3JpdGFibGVcbi8vIHN0cmVhbSBjbGFzc2VzLiAgV2hlbiB5b3Ugd3JpdGUoY2h1bmspLCB0aGF0IGNhbGxzIF93cml0ZShjaHVuayxjYilcbi8vIGludGVybmFsbHksIGFuZCByZXR1cm5zIGZhbHNlIGlmIHRoZXJlJ3MgYSBsb3Qgb2YgcGVuZGluZyB3cml0ZXNcbi8vIGJ1ZmZlcmVkIHVwLiAgV2hlbiB5b3UgY2FsbCByZWFkKCksIHRoYXQgY2FsbHMgX3JlYWQobikgdW50aWxcbi8vIHRoZXJlJ3MgZW5vdWdoIHBlbmRpbmcgcmVhZGFibGUgZGF0YSBidWZmZXJlZCB1cC5cbi8vXG4vLyBJbiBhIHRyYW5zZm9ybSBzdHJlYW0sIHRoZSB3cml0dGVuIGRhdGEgaXMgcGxhY2VkIGluIGEgYnVmZmVyLiAgV2hlblxuLy8gX3JlYWQobikgaXMgY2FsbGVkLCBpdCB0cmFuc2Zvcm1zIHRoZSBxdWV1ZWQgdXAgZGF0YSwgY2FsbGluZyB0aGVcbi8vIGJ1ZmZlcmVkIF93cml0ZSBjYidzIGFzIGl0IGNvbnN1bWVzIGNodW5rcy4gIElmIGNvbnN1bWluZyBhIHNpbmdsZVxuLy8gd3JpdHRlbiBjaHVuayB3b3VsZCByZXN1bHQgaW4gbXVsdGlwbGUgb3V0cHV0IGNodW5rcywgdGhlbiB0aGUgZmlyc3Rcbi8vIG91dHB1dHRlZCBiaXQgY2FsbHMgdGhlIHJlYWRjYiwgYW5kIHN1YnNlcXVlbnQgY2h1bmtzIGp1c3QgZ28gaW50b1xuLy8gdGhlIHJlYWQgYnVmZmVyLCBhbmQgd2lsbCBjYXVzZSBpdCB0byBlbWl0ICdyZWFkYWJsZScgaWYgbmVjZXNzYXJ5LlxuLy9cbi8vIFRoaXMgd2F5LCBiYWNrLXByZXNzdXJlIGlzIGFjdHVhbGx5IGRldGVybWluZWQgYnkgdGhlIHJlYWRpbmcgc2lkZSxcbi8vIHNpbmNlIF9yZWFkIGhhcyB0byBiZSBjYWxsZWQgdG8gc3RhcnQgcHJvY2Vzc2luZyBhIG5ldyBjaHVuay4gIEhvd2V2ZXIsXG4vLyBhIHBhdGhvbG9naWNhbCBpbmZsYXRlIHR5cGUgb2YgdHJhbnNmb3JtIGNhbiBjYXVzZSBleGNlc3NpdmUgYnVmZmVyaW5nXG4vLyBoZXJlLiAgRm9yIGV4YW1wbGUsIGltYWdpbmUgYSBzdHJlYW0gd2hlcmUgZXZlcnkgYnl0ZSBvZiBpbnB1dCBpc1xuLy8gaW50ZXJwcmV0ZWQgYXMgYW4gaW50ZWdlciBmcm9tIDAtMjU1LCBhbmQgdGhlbiByZXN1bHRzIGluIHRoYXQgbWFueVxuLy8gYnl0ZXMgb2Ygb3V0cHV0LiAgV3JpdGluZyB0aGUgNCBieXRlcyB7ZmYsZmYsZmYsZmZ9IHdvdWxkIHJlc3VsdCBpblxuLy8gMWtiIG9mIGRhdGEgYmVpbmcgb3V0cHV0LiAgSW4gdGhpcyBjYXNlLCB5b3UgY291bGQgd3JpdGUgYSB2ZXJ5IHNtYWxsXG4vLyBhbW91bnQgb2YgaW5wdXQsIGFuZCBlbmQgdXAgd2l0aCBhIHZlcnkgbGFyZ2UgYW1vdW50IG9mIG91dHB1dC4gIEluXG4vLyBzdWNoIGEgcGF0aG9sb2dpY2FsIGluZmxhdGluZyBtZWNoYW5pc20sIHRoZXJlJ2QgYmUgbm8gd2F5IHRvIHRlbGxcbi8vIHRoZSBzeXN0ZW0gdG8gc3RvcCBkb2luZyB0aGUgdHJhbnNmb3JtLiAgQSBzaW5nbGUgNE1CIHdyaXRlIGNvdWxkXG4vLyBjYXVzZSB0aGUgc3lzdGVtIHRvIHJ1biBvdXQgb2YgbWVtb3J5LlxuLy9cbi8vIEhvd2V2ZXIsIGV2ZW4gaW4gc3VjaCBhIHBhdGhvbG9naWNhbCBjYXNlLCBvbmx5IGEgc2luZ2xlIHdyaXR0ZW4gY2h1bmtcbi8vIHdvdWxkIGJlIGNvbnN1bWVkLCBhbmQgdGhlbiB0aGUgcmVzdCB3b3VsZCB3YWl0ICh1bi10cmFuc2Zvcm1lZCkgdW50aWxcbi8vIHRoZSByZXN1bHRzIG9mIHRoZSBwcmV2aW91cyB0cmFuc2Zvcm1lZCBjaHVuayB3ZXJlIGNvbnN1bWVkLlxuXG4ndXNlIHN0cmljdCdcblxuY29uc3QgeyBPYmplY3RTZXRQcm90b3R5cGVPZiwgU3ltYm9sIH0gPSByZXF1aXJlKCcuLi8uLi9vdXJzL3ByaW1vcmRpYWxzJylcbm1vZHVsZS5leHBvcnRzID0gVHJhbnNmb3JtXG5jb25zdCB7IEVSUl9NRVRIT0RfTk9UX0lNUExFTUVOVEVEIH0gPSByZXF1aXJlKCcuLi8uLi9vdXJzL2Vycm9ycycpLmNvZGVzXG5jb25zdCBEdXBsZXggPSByZXF1aXJlKCcuL2R1cGxleCcpXG5jb25zdCB7IGdldEhpZ2hXYXRlck1hcmsgfSA9IHJlcXVpcmUoJy4vc3RhdGUnKVxuT2JqZWN0U2V0UHJvdG90eXBlT2YoVHJhbnNmb3JtLnByb3RvdHlwZSwgRHVwbGV4LnByb3RvdHlwZSlcbk9iamVjdFNldFByb3RvdHlwZU9mKFRyYW5zZm9ybSwgRHVwbGV4KVxuY29uc3Qga0NhbGxiYWNrID0gU3ltYm9sKCdrQ2FsbGJhY2snKVxuZnVuY3Rpb24gVHJhbnNmb3JtKG9wdGlvbnMpIHtcbiAgaWYgKCEodGhpcyBpbnN0YW5jZW9mIFRyYW5zZm9ybSkpIHJldHVybiBuZXcgVHJhbnNmb3JtKG9wdGlvbnMpXG5cbiAgLy8gVE9ETyAocm9uYWcpOiBUaGlzIHNob3VsZCBwcmVmZXJhYmx5IGFsd2F5cyBiZVxuICAvLyBhcHBsaWVkIGJ1dCB3b3VsZCBiZSBzZW12ZXItbWFqb3IuIE9yIGV2ZW4gYmV0dGVyO1xuICAvLyBtYWtlIFRyYW5zZm9ybSBhIFJlYWRhYmxlIHdpdGggdGhlIFdyaXRhYmxlIGludGVyZmFjZS5cbiAgY29uc3QgcmVhZGFibGVIaWdoV2F0ZXJNYXJrID0gb3B0aW9ucyA/IGdldEhpZ2hXYXRlck1hcmsodGhpcywgb3B0aW9ucywgJ3JlYWRhYmxlSGlnaFdhdGVyTWFyaycsIHRydWUpIDogbnVsbFxuICBpZiAocmVhZGFibGVIaWdoV2F0ZXJNYXJrID09PSAwKSB7XG4gICAgLy8gQSBEdXBsZXggd2lsbCBidWZmZXIgYm90aCBvbiB0aGUgd3JpdGFibGUgYW5kIHJlYWRhYmxlIHNpZGUgd2hpbGVcbiAgICAvLyBhIFRyYW5zZm9ybSBqdXN0IHdhbnRzIHRvIGJ1ZmZlciBod20gbnVtYmVyIG9mIGVsZW1lbnRzLiBUbyBhdm9pZFxuICAgIC8vIGJ1ZmZlcmluZyB0d2ljZSB3ZSBkaXNhYmxlIGJ1ZmZlcmluZyBvbiB0aGUgd3JpdGFibGUgc2lkZS5cbiAgICBvcHRpb25zID0ge1xuICAgICAgLi4ub3B0aW9ucyxcbiAgICAgIGhpZ2hXYXRlck1hcms6IG51bGwsXG4gICAgICByZWFkYWJsZUhpZ2hXYXRlck1hcmssXG4gICAgICAvLyBUT0RPIChyb25hZyk6IDAgaXMgbm90IG9wdGltYWwgc2luY2Ugd2UgaGF2ZVxuICAgICAgLy8gYSBcImJ1Z1wiIHdoZXJlIHdlIGNoZWNrIG5lZWREcmFpbiBiZWZvcmUgY2FsbGluZyBfd3JpdGUgYW5kIG5vdCBhZnRlci5cbiAgICAgIC8vIFJlZnM6IGh0dHBzOi8vZ2l0aHViLmNvbS9ub2RlanMvbm9kZS9wdWxsLzMyODg3XG4gICAgICAvLyBSZWZzOiBodHRwczovL2dpdGh1Yi5jb20vbm9kZWpzL25vZGUvcHVsbC8zNTk0MVxuICAgICAgd3JpdGFibGVIaWdoV2F0ZXJNYXJrOiBvcHRpb25zLndyaXRhYmxlSGlnaFdhdGVyTWFyayB8fCAwXG4gICAgfVxuICB9XG4gIER1cGxleC5jYWxsKHRoaXMsIG9wdGlvbnMpXG5cbiAgLy8gV2UgaGF2ZSBpbXBsZW1lbnRlZCB0aGUgX3JlYWQgbWV0aG9kLCBhbmQgZG9uZSB0aGUgb3RoZXIgdGhpbmdzXG4gIC8vIHRoYXQgUmVhZGFibGUgd2FudHMgYmVmb3JlIHRoZSBmaXJzdCBfcmVhZCBjYWxsLCBzbyB1bnNldCB0aGVcbiAgLy8gc3luYyBndWFyZCBmbGFnLlxuICB0aGlzLl9yZWFkYWJsZVN0YXRlLnN5bmMgPSBmYWxzZVxuICB0aGlzW2tDYWxsYmFja10gPSBudWxsXG4gIGlmIChvcHRpb25zKSB7XG4gICAgaWYgKHR5cGVvZiBvcHRpb25zLnRyYW5zZm9ybSA9PT0gJ2Z1bmN0aW9uJykgdGhpcy5fdHJhbnNmb3JtID0gb3B0aW9ucy50cmFuc2Zvcm1cbiAgICBpZiAodHlwZW9mIG9wdGlvbnMuZmx1c2ggPT09ICdmdW5jdGlvbicpIHRoaXMuX2ZsdXNoID0gb3B0aW9ucy5mbHVzaFxuICB9XG5cbiAgLy8gV2hlbiB0aGUgd3JpdGFibGUgc2lkZSBmaW5pc2hlcywgdGhlbiBmbHVzaCBvdXQgYW55dGhpbmcgcmVtYWluaW5nLlxuICAvLyBCYWNrd2FyZHMgY29tcGF0LiBTb21lIFRyYW5zZm9ybSBzdHJlYW1zIGluY29ycmVjdGx5IGltcGxlbWVudCBfZmluYWxcbiAgLy8gaW5zdGVhZCBvZiBvciBpbiBhZGRpdGlvbiB0byBfZmx1c2guIEJ5IHVzaW5nICdwcmVmaW5pc2gnIGluc3RlYWQgb2ZcbiAgLy8gaW1wbGVtZW50aW5nIF9maW5hbCB3ZSBjb250aW51ZSBzdXBwb3J0aW5nIHRoaXMgdW5mb3J0dW5hdGUgdXNlIGNhc2UuXG4gIHRoaXMub24oJ3ByZWZpbmlzaCcsIHByZWZpbmlzaClcbn1cbmZ1bmN0aW9uIGZpbmFsKGNiKSB7XG4gIGlmICh0eXBlb2YgdGhpcy5fZmx1c2ggPT09ICdmdW5jdGlvbicgJiYgIXRoaXMuZGVzdHJveWVkKSB7XG4gICAgdGhpcy5fZmx1c2goKGVyLCBkYXRhKSA9PiB7XG4gICAgICBpZiAoZXIpIHtcbiAgICAgICAgaWYgKGNiKSB7XG4gICAgICAgICAgY2IoZXIpXG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgdGhpcy5kZXN0cm95KGVyKVxuICAgICAgICB9XG4gICAgICAgIHJldHVyblxuICAgICAgfVxuICAgICAgaWYgKGRhdGEgIT0gbnVsbCkge1xuICAgICAgICB0aGlzLnB1c2goZGF0YSlcbiAgICAgIH1cbiAgICAgIHRoaXMucHVzaChudWxsKVxuICAgICAgaWYgKGNiKSB7XG4gICAgICAgIGNiKClcbiAgICAgIH1cbiAgICB9KVxuICB9IGVsc2Uge1xuICAgIHRoaXMucHVzaChudWxsKVxuICAgIGlmIChjYikge1xuICAgICAgY2IoKVxuICAgIH1cbiAgfVxufVxuZnVuY3Rpb24gcHJlZmluaXNoKCkge1xuICBpZiAodGhpcy5fZmluYWwgIT09IGZpbmFsKSB7XG4gICAgZmluYWwuY2FsbCh0aGlzKVxuICB9XG59XG5UcmFuc2Zvcm0ucHJvdG90eXBlLl9maW5hbCA9IGZpbmFsXG5UcmFuc2Zvcm0ucHJvdG90eXBlLl90cmFuc2Zvcm0gPSBmdW5jdGlvbiAoY2h1bmssIGVuY29kaW5nLCBjYWxsYmFjaykge1xuICB0aHJvdyBuZXcgRVJSX01FVEhPRF9OT1RfSU1QTEVNRU5URUQoJ190cmFuc2Zvcm0oKScpXG59XG5UcmFuc2Zvcm0ucHJvdG90eXBlLl93cml0ZSA9IGZ1bmN0aW9uIChjaHVuaywgZW5jb2RpbmcsIGNhbGxiYWNrKSB7XG4gIGNvbnN0IHJTdGF0ZSA9IHRoaXMuX3JlYWRhYmxlU3RhdGVcbiAgY29uc3Qgd1N0YXRlID0gdGhpcy5fd3JpdGFibGVTdGF0ZVxuICBjb25zdCBsZW5ndGggPSByU3RhdGUubGVuZ3RoXG4gIHRoaXMuX3RyYW5zZm9ybShjaHVuaywgZW5jb2RpbmcsIChlcnIsIHZhbCkgPT4ge1xuICAgIGlmIChlcnIpIHtcbiAgICAgIGNhbGxiYWNrKGVycilcbiAgICAgIHJldHVyblxuICAgIH1cbiAgICBpZiAodmFsICE9IG51bGwpIHtcbiAgICAgIHRoaXMucHVzaCh2YWwpXG4gICAgfVxuICAgIGlmIChcbiAgICAgIHdTdGF0ZS5lbmRlZCB8fFxuICAgICAgLy8gQmFja3dhcmRzIGNvbXBhdC5cbiAgICAgIGxlbmd0aCA9PT0gclN0YXRlLmxlbmd0aCB8fFxuICAgICAgLy8gQmFja3dhcmRzIGNvbXBhdC5cbiAgICAgIHJTdGF0ZS5sZW5ndGggPCByU3RhdGUuaGlnaFdhdGVyTWFya1xuICAgICkge1xuICAgICAgY2FsbGJhY2soKVxuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzW2tDYWxsYmFja10gPSBjYWxsYmFja1xuICAgIH1cbiAgfSlcbn1cblRyYW5zZm9ybS5wcm90b3R5cGUuX3JlYWQgPSBmdW5jdGlvbiAoKSB7XG4gIGlmICh0aGlzW2tDYWxsYmFja10pIHtcbiAgICBjb25zdCBjYWxsYmFjayA9IHRoaXNba0NhbGxiYWNrXVxuICAgIHRoaXNba0NhbGxiYWNrXSA9IG51bGxcbiAgICBjYWxsYmFjaygpXG4gIH1cbn1cbiIsCiAgICAiLy8gQ29weXJpZ2h0IEpveWVudCwgSW5jLiBhbmQgb3RoZXIgTm9kZSBjb250cmlidXRvcnMuXG4vL1xuLy8gUGVybWlzc2lvbiBpcyBoZXJlYnkgZ3JhbnRlZCwgZnJlZSBvZiBjaGFyZ2UsIHRvIGFueSBwZXJzb24gb2J0YWluaW5nIGFcbi8vIGNvcHkgb2YgdGhpcyBzb2Z0d2FyZSBhbmQgYXNzb2NpYXRlZCBkb2N1bWVudGF0aW9uIGZpbGVzICh0aGVcbi8vIFwiU29mdHdhcmVcIiksIHRvIGRlYWwgaW4gdGhlIFNvZnR3YXJlIHdpdGhvdXQgcmVzdHJpY3Rpb24sIGluY2x1ZGluZ1xuLy8gd2l0aG91dCBsaW1pdGF0aW9uIHRoZSByaWdodHMgdG8gdXNlLCBjb3B5LCBtb2RpZnksIG1lcmdlLCBwdWJsaXNoLFxuLy8gZGlzdHJpYnV0ZSwgc3VibGljZW5zZSwgYW5kL29yIHNlbGwgY29waWVzIG9mIHRoZSBTb2Z0d2FyZSwgYW5kIHRvIHBlcm1pdFxuLy8gcGVyc29ucyB0byB3aG9tIHRoZSBTb2Z0d2FyZSBpcyBmdXJuaXNoZWQgdG8gZG8gc28sIHN1YmplY3QgdG8gdGhlXG4vLyBmb2xsb3dpbmcgY29uZGl0aW9uczpcbi8vXG4vLyBUaGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBzaGFsbCBiZSBpbmNsdWRlZFxuLy8gaW4gYWxsIGNvcGllcyBvciBzdWJzdGFudGlhbCBwb3J0aW9ucyBvZiB0aGUgU29mdHdhcmUuXG4vL1xuLy8gVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEIFwiQVMgSVNcIiwgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwgRVhQUkVTU1xuLy8gT1IgSU1QTElFRCwgSU5DTFVESU5HIEJVVCBOT1QgTElNSVRFRCBUTyBUSEUgV0FSUkFOVElFUyBPRlxuLy8gTUVSQ0hBTlRBQklMSVRZLCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBTkQgTk9OSU5GUklOR0VNRU5ULiBJTlxuLy8gTk8gRVZFTlQgU0hBTEwgVEhFIEFVVEhPUlMgT1IgQ09QWVJJR0hUIEhPTERFUlMgQkUgTElBQkxFIEZPUiBBTlkgQ0xBSU0sXG4vLyBEQU1BR0VTIE9SIE9USEVSIExJQUJJTElUWSwgV0hFVEhFUiBJTiBBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsIFRPUlQgT1Jcbi8vIE9USEVSV0lTRSwgQVJJU0lORyBGUk9NLCBPVVQgT0YgT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBTT0ZUV0FSRSBPUiBUSEVcbi8vIFVTRSBPUiBPVEhFUiBERUFMSU5HUyBJTiBUSEUgU09GVFdBUkUuXG5cbi8vIGEgcGFzc3Rocm91Z2ggc3RyZWFtLlxuLy8gYmFzaWNhbGx5IGp1c3QgdGhlIG1vc3QgbWluaW1hbCBzb3J0IG9mIFRyYW5zZm9ybSBzdHJlYW0uXG4vLyBFdmVyeSB3cml0dGVuIGNodW5rIGdldHMgb3V0cHV0IGFzLWlzLlxuXG4ndXNlIHN0cmljdCdcblxuY29uc3QgeyBPYmplY3RTZXRQcm90b3R5cGVPZiB9ID0gcmVxdWlyZSgnLi4vLi4vb3Vycy9wcmltb3JkaWFscycpXG5tb2R1bGUuZXhwb3J0cyA9IFBhc3NUaHJvdWdoXG5jb25zdCBUcmFuc2Zvcm0gPSByZXF1aXJlKCcuL3RyYW5zZm9ybScpXG5PYmplY3RTZXRQcm90b3R5cGVPZihQYXNzVGhyb3VnaC5wcm90b3R5cGUsIFRyYW5zZm9ybS5wcm90b3R5cGUpXG5PYmplY3RTZXRQcm90b3R5cGVPZihQYXNzVGhyb3VnaCwgVHJhbnNmb3JtKVxuZnVuY3Rpb24gUGFzc1Rocm91Z2gob3B0aW9ucykge1xuICBpZiAoISh0aGlzIGluc3RhbmNlb2YgUGFzc1Rocm91Z2gpKSByZXR1cm4gbmV3IFBhc3NUaHJvdWdoKG9wdGlvbnMpXG4gIFRyYW5zZm9ybS5jYWxsKHRoaXMsIG9wdGlvbnMpXG59XG5QYXNzVGhyb3VnaC5wcm90b3R5cGUuX3RyYW5zZm9ybSA9IGZ1bmN0aW9uIChjaHVuaywgZW5jb2RpbmcsIGNiKSB7XG4gIGNiKG51bGwsIGNodW5rKVxufVxuIiwKICAgICIvKiByZXBsYWNlbWVudCBzdGFydCAqL1xuXG5jb25zdCBwcm9jZXNzID0gcmVxdWlyZSgncHJvY2Vzcy8nKVxuXG4vKiByZXBsYWNlbWVudCBlbmQgKi9cbi8vIFBvcnRlZCBmcm9tIGh0dHBzOi8vZ2l0aHViLmNvbS9tYWZpbnRvc2gvcHVtcCB3aXRoXG4vLyBwZXJtaXNzaW9uIGZyb20gdGhlIGF1dGhvciwgTWF0aGlhcyBCdXVzIChAbWFmaW50b3NoKS5cblxuOygndXNlIHN0cmljdCcpXG5jb25zdCB7IEFycmF5SXNBcnJheSwgUHJvbWlzZSwgU3ltYm9sQXN5bmNJdGVyYXRvciwgU3ltYm9sRGlzcG9zZSB9ID0gcmVxdWlyZSgnLi4vLi4vb3Vycy9wcmltb3JkaWFscycpXG5jb25zdCBlb3MgPSByZXF1aXJlKCcuL2VuZC1vZi1zdHJlYW0nKVxuY29uc3QgeyBvbmNlIH0gPSByZXF1aXJlKCcuLi8uLi9vdXJzL3V0aWwnKVxuY29uc3QgZGVzdHJveUltcGwgPSByZXF1aXJlKCcuL2Rlc3Ryb3knKVxuY29uc3QgRHVwbGV4ID0gcmVxdWlyZSgnLi9kdXBsZXgnKVxuY29uc3Qge1xuICBhZ2dyZWdhdGVUd29FcnJvcnMsXG4gIGNvZGVzOiB7XG4gICAgRVJSX0lOVkFMSURfQVJHX1RZUEUsXG4gICAgRVJSX0lOVkFMSURfUkVUVVJOX1ZBTFVFLFxuICAgIEVSUl9NSVNTSU5HX0FSR1MsXG4gICAgRVJSX1NUUkVBTV9ERVNUUk9ZRUQsXG4gICAgRVJSX1NUUkVBTV9QUkVNQVRVUkVfQ0xPU0VcbiAgfSxcbiAgQWJvcnRFcnJvclxufSA9IHJlcXVpcmUoJy4uLy4uL291cnMvZXJyb3JzJylcbmNvbnN0IHsgdmFsaWRhdGVGdW5jdGlvbiwgdmFsaWRhdGVBYm9ydFNpZ25hbCB9ID0gcmVxdWlyZSgnLi4vdmFsaWRhdG9ycycpXG5jb25zdCB7XG4gIGlzSXRlcmFibGUsXG4gIGlzUmVhZGFibGUsXG4gIGlzUmVhZGFibGVOb2RlU3RyZWFtLFxuICBpc05vZGVTdHJlYW0sXG4gIGlzVHJhbnNmb3JtU3RyZWFtLFxuICBpc1dlYlN0cmVhbSxcbiAgaXNSZWFkYWJsZVN0cmVhbSxcbiAgaXNSZWFkYWJsZUZpbmlzaGVkXG59ID0gcmVxdWlyZSgnLi91dGlscycpXG5jb25zdCBBYm9ydENvbnRyb2xsZXIgPSBnbG9iYWxUaGlzLkFib3J0Q29udHJvbGxlciB8fCByZXF1aXJlKCdhYm9ydC1jb250cm9sbGVyJykuQWJvcnRDb250cm9sbGVyXG5sZXQgUGFzc1Rocm91Z2hcbmxldCBSZWFkYWJsZVxubGV0IGFkZEFib3J0TGlzdGVuZXJcbmZ1bmN0aW9uIGRlc3Ryb3llcihzdHJlYW0sIHJlYWRpbmcsIHdyaXRpbmcpIHtcbiAgbGV0IGZpbmlzaGVkID0gZmFsc2VcbiAgc3RyZWFtLm9uKCdjbG9zZScsICgpID0+IHtcbiAgICBmaW5pc2hlZCA9IHRydWVcbiAgfSlcbiAgY29uc3QgY2xlYW51cCA9IGVvcyhcbiAgICBzdHJlYW0sXG4gICAge1xuICAgICAgcmVhZGFibGU6IHJlYWRpbmcsXG4gICAgICB3cml0YWJsZTogd3JpdGluZ1xuICAgIH0sXG4gICAgKGVycikgPT4ge1xuICAgICAgZmluaXNoZWQgPSAhZXJyXG4gICAgfVxuICApXG4gIHJldHVybiB7XG4gICAgZGVzdHJveTogKGVycikgPT4ge1xuICAgICAgaWYgKGZpbmlzaGVkKSByZXR1cm5cbiAgICAgIGZpbmlzaGVkID0gdHJ1ZVxuICAgICAgZGVzdHJveUltcGwuZGVzdHJveWVyKHN0cmVhbSwgZXJyIHx8IG5ldyBFUlJfU1RSRUFNX0RFU1RST1lFRCgncGlwZScpKVxuICAgIH0sXG4gICAgY2xlYW51cFxuICB9XG59XG5mdW5jdGlvbiBwb3BDYWxsYmFjayhzdHJlYW1zKSB7XG4gIC8vIFN0cmVhbXMgc2hvdWxkIG5ldmVyIGJlIGFuIGVtcHR5IGFycmF5LiBJdCBzaG91bGQgYWx3YXlzIGNvbnRhaW4gYXQgbGVhc3RcbiAgLy8gYSBzaW5nbGUgc3RyZWFtLiBUaGVyZWZvcmUgb3B0aW1pemUgZm9yIHRoZSBhdmVyYWdlIGNhc2UgaW5zdGVhZCBvZlxuICAvLyBjaGVja2luZyBmb3IgbGVuZ3RoID09PSAwIGFzIHdlbGwuXG4gIHZhbGlkYXRlRnVuY3Rpb24oc3RyZWFtc1tzdHJlYW1zLmxlbmd0aCAtIDFdLCAnc3RyZWFtc1tzdHJlYW0ubGVuZ3RoIC0gMV0nKVxuICByZXR1cm4gc3RyZWFtcy5wb3AoKVxufVxuZnVuY3Rpb24gbWFrZUFzeW5jSXRlcmFibGUodmFsKSB7XG4gIGlmIChpc0l0ZXJhYmxlKHZhbCkpIHtcbiAgICByZXR1cm4gdmFsXG4gIH0gZWxzZSBpZiAoaXNSZWFkYWJsZU5vZGVTdHJlYW0odmFsKSkge1xuICAgIC8vIExlZ2FjeSBzdHJlYW1zIGFyZSBub3QgSXRlcmFibGUuXG4gICAgcmV0dXJuIGZyb21SZWFkYWJsZSh2YWwpXG4gIH1cbiAgdGhyb3cgbmV3IEVSUl9JTlZBTElEX0FSR19UWVBFKCd2YWwnLCBbJ1JlYWRhYmxlJywgJ0l0ZXJhYmxlJywgJ0FzeW5jSXRlcmFibGUnXSwgdmFsKVxufVxuYXN5bmMgZnVuY3Rpb24qIGZyb21SZWFkYWJsZSh2YWwpIHtcbiAgaWYgKCFSZWFkYWJsZSkge1xuICAgIFJlYWRhYmxlID0gcmVxdWlyZSgnLi9yZWFkYWJsZScpXG4gIH1cbiAgeWllbGQqIFJlYWRhYmxlLnByb3RvdHlwZVtTeW1ib2xBc3luY0l0ZXJhdG9yXS5jYWxsKHZhbClcbn1cbmFzeW5jIGZ1bmN0aW9uIHB1bXBUb05vZGUoaXRlcmFibGUsIHdyaXRhYmxlLCBmaW5pc2gsIHsgZW5kIH0pIHtcbiAgbGV0IGVycm9yXG4gIGxldCBvbnJlc29sdmUgPSBudWxsXG4gIGNvbnN0IHJlc3VtZSA9IChlcnIpID0+IHtcbiAgICBpZiAoZXJyKSB7XG4gICAgICBlcnJvciA9IGVyclxuICAgIH1cbiAgICBpZiAob25yZXNvbHZlKSB7XG4gICAgICBjb25zdCBjYWxsYmFjayA9IG9ucmVzb2x2ZVxuICAgICAgb25yZXNvbHZlID0gbnVsbFxuICAgICAgY2FsbGJhY2soKVxuICAgIH1cbiAgfVxuICBjb25zdCB3YWl0ID0gKCkgPT5cbiAgICBuZXcgUHJvbWlzZSgocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XG4gICAgICBpZiAoZXJyb3IpIHtcbiAgICAgICAgcmVqZWN0KGVycm9yKVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgb25yZXNvbHZlID0gKCkgPT4ge1xuICAgICAgICAgIGlmIChlcnJvcikge1xuICAgICAgICAgICAgcmVqZWN0KGVycm9yKVxuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICByZXNvbHZlKClcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9KVxuICB3cml0YWJsZS5vbignZHJhaW4nLCByZXN1bWUpXG4gIGNvbnN0IGNsZWFudXAgPSBlb3MoXG4gICAgd3JpdGFibGUsXG4gICAge1xuICAgICAgcmVhZGFibGU6IGZhbHNlXG4gICAgfSxcbiAgICByZXN1bWVcbiAgKVxuICB0cnkge1xuICAgIGlmICh3cml0YWJsZS53cml0YWJsZU5lZWREcmFpbikge1xuICAgICAgYXdhaXQgd2FpdCgpXG4gICAgfVxuICAgIGZvciBhd2FpdCAoY29uc3QgY2h1bmsgb2YgaXRlcmFibGUpIHtcbiAgICAgIGlmICghd3JpdGFibGUud3JpdGUoY2h1bmspKSB7XG4gICAgICAgIGF3YWl0IHdhaXQoKVxuICAgICAgfVxuICAgIH1cbiAgICBpZiAoZW5kKSB7XG4gICAgICB3cml0YWJsZS5lbmQoKVxuICAgICAgYXdhaXQgd2FpdCgpXG4gICAgfVxuICAgIGZpbmlzaCgpXG4gIH0gY2F0Y2ggKGVycikge1xuICAgIGZpbmlzaChlcnJvciAhPT0gZXJyID8gYWdncmVnYXRlVHdvRXJyb3JzKGVycm9yLCBlcnIpIDogZXJyKVxuICB9IGZpbmFsbHkge1xuICAgIGNsZWFudXAoKVxuICAgIHdyaXRhYmxlLm9mZignZHJhaW4nLCByZXN1bWUpXG4gIH1cbn1cbmFzeW5jIGZ1bmN0aW9uIHB1bXBUb1dlYihyZWFkYWJsZSwgd3JpdGFibGUsIGZpbmlzaCwgeyBlbmQgfSkge1xuICBpZiAoaXNUcmFuc2Zvcm1TdHJlYW0od3JpdGFibGUpKSB7XG4gICAgd3JpdGFibGUgPSB3cml0YWJsZS53cml0YWJsZVxuICB9XG4gIC8vIGh0dHBzOi8vc3RyZWFtcy5zcGVjLndoYXR3Zy5vcmcvI2V4YW1wbGUtbWFudWFsLXdyaXRlLXdpdGgtYmFja3ByZXNzdXJlXG4gIGNvbnN0IHdyaXRlciA9IHdyaXRhYmxlLmdldFdyaXRlcigpXG4gIHRyeSB7XG4gICAgZm9yIGF3YWl0IChjb25zdCBjaHVuayBvZiByZWFkYWJsZSkge1xuICAgICAgYXdhaXQgd3JpdGVyLnJlYWR5XG4gICAgICB3cml0ZXIud3JpdGUoY2h1bmspLmNhdGNoKCgpID0+IHt9KVxuICAgIH1cbiAgICBhd2FpdCB3cml0ZXIucmVhZHlcbiAgICBpZiAoZW5kKSB7XG4gICAgICBhd2FpdCB3cml0ZXIuY2xvc2UoKVxuICAgIH1cbiAgICBmaW5pc2goKVxuICB9IGNhdGNoIChlcnIpIHtcbiAgICB0cnkge1xuICAgICAgYXdhaXQgd3JpdGVyLmFib3J0KGVycilcbiAgICAgIGZpbmlzaChlcnIpXG4gICAgfSBjYXRjaCAoZXJyKSB7XG4gICAgICBmaW5pc2goZXJyKVxuICAgIH1cbiAgfVxufVxuZnVuY3Rpb24gcGlwZWxpbmUoLi4uc3RyZWFtcykge1xuICByZXR1cm4gcGlwZWxpbmVJbXBsKHN0cmVhbXMsIG9uY2UocG9wQ2FsbGJhY2soc3RyZWFtcykpKVxufVxuZnVuY3Rpb24gcGlwZWxpbmVJbXBsKHN0cmVhbXMsIGNhbGxiYWNrLCBvcHRzKSB7XG4gIGlmIChzdHJlYW1zLmxlbmd0aCA9PT0gMSAmJiBBcnJheUlzQXJyYXkoc3RyZWFtc1swXSkpIHtcbiAgICBzdHJlYW1zID0gc3RyZWFtc1swXVxuICB9XG4gIGlmIChzdHJlYW1zLmxlbmd0aCA8IDIpIHtcbiAgICB0aHJvdyBuZXcgRVJSX01JU1NJTkdfQVJHUygnc3RyZWFtcycpXG4gIH1cbiAgY29uc3QgYWMgPSBuZXcgQWJvcnRDb250cm9sbGVyKClcbiAgY29uc3Qgc2lnbmFsID0gYWMuc2lnbmFsXG4gIGNvbnN0IG91dGVyU2lnbmFsID0gb3B0cyA9PT0gbnVsbCB8fCBvcHRzID09PSB1bmRlZmluZWQgPyB1bmRlZmluZWQgOiBvcHRzLnNpZ25hbFxuXG4gIC8vIE5lZWQgdG8gY2xlYW51cCBldmVudCBsaXN0ZW5lcnMgaWYgbGFzdCBzdHJlYW0gaXMgcmVhZGFibGVcbiAgLy8gaHR0cHM6Ly9naXRodWIuY29tL25vZGVqcy9ub2RlL2lzc3Vlcy8zNTQ1MlxuICBjb25zdCBsYXN0U3RyZWFtQ2xlYW51cCA9IFtdXG4gIHZhbGlkYXRlQWJvcnRTaWduYWwob3V0ZXJTaWduYWwsICdvcHRpb25zLnNpZ25hbCcpXG4gIGZ1bmN0aW9uIGFib3J0KCkge1xuICAgIGZpbmlzaEltcGwobmV3IEFib3J0RXJyb3IoKSlcbiAgfVxuICBhZGRBYm9ydExpc3RlbmVyID0gYWRkQWJvcnRMaXN0ZW5lciB8fCByZXF1aXJlKCcuLi8uLi9vdXJzL3V0aWwnKS5hZGRBYm9ydExpc3RlbmVyXG4gIGxldCBkaXNwb3NhYmxlXG4gIGlmIChvdXRlclNpZ25hbCkge1xuICAgIGRpc3Bvc2FibGUgPSBhZGRBYm9ydExpc3RlbmVyKG91dGVyU2lnbmFsLCBhYm9ydClcbiAgfVxuICBsZXQgZXJyb3JcbiAgbGV0IHZhbHVlXG4gIGNvbnN0IGRlc3Ryb3lzID0gW11cbiAgbGV0IGZpbmlzaENvdW50ID0gMFxuICBmdW5jdGlvbiBmaW5pc2goZXJyKSB7XG4gICAgZmluaXNoSW1wbChlcnIsIC0tZmluaXNoQ291bnQgPT09IDApXG4gIH1cbiAgZnVuY3Rpb24gZmluaXNoSW1wbChlcnIsIGZpbmFsKSB7XG4gICAgdmFyIF9kaXNwb3NhYmxlXG4gICAgaWYgKGVyciAmJiAoIWVycm9yIHx8IGVycm9yLmNvZGUgPT09ICdFUlJfU1RSRUFNX1BSRU1BVFVSRV9DTE9TRScpKSB7XG4gICAgICBlcnJvciA9IGVyclxuICAgIH1cbiAgICBpZiAoIWVycm9yICYmICFmaW5hbCkge1xuICAgICAgcmV0dXJuXG4gICAgfVxuICAgIHdoaWxlIChkZXN0cm95cy5sZW5ndGgpIHtcbiAgICAgIGRlc3Ryb3lzLnNoaWZ0KCkoZXJyb3IpXG4gICAgfVxuICAgIDsoX2Rpc3Bvc2FibGUgPSBkaXNwb3NhYmxlKSA9PT0gbnVsbCB8fCBfZGlzcG9zYWJsZSA9PT0gdW5kZWZpbmVkID8gdW5kZWZpbmVkIDogX2Rpc3Bvc2FibGVbU3ltYm9sRGlzcG9zZV0oKVxuICAgIGFjLmFib3J0KClcbiAgICBpZiAoZmluYWwpIHtcbiAgICAgIGlmICghZXJyb3IpIHtcbiAgICAgICAgbGFzdFN0cmVhbUNsZWFudXAuZm9yRWFjaCgoZm4pID0+IGZuKCkpXG4gICAgICB9XG4gICAgICBwcm9jZXNzLm5leHRUaWNrKGNhbGxiYWNrLCBlcnJvciwgdmFsdWUpXG4gICAgfVxuICB9XG4gIGxldCByZXRcbiAgZm9yIChsZXQgaSA9IDA7IGkgPCBzdHJlYW1zLmxlbmd0aDsgaSsrKSB7XG4gICAgY29uc3Qgc3RyZWFtID0gc3RyZWFtc1tpXVxuICAgIGNvbnN0IHJlYWRpbmcgPSBpIDwgc3RyZWFtcy5sZW5ndGggLSAxXG4gICAgY29uc3Qgd3JpdGluZyA9IGkgPiAwXG4gICAgY29uc3QgZW5kID0gcmVhZGluZyB8fCAob3B0cyA9PT0gbnVsbCB8fCBvcHRzID09PSB1bmRlZmluZWQgPyB1bmRlZmluZWQgOiBvcHRzLmVuZCkgIT09IGZhbHNlXG4gICAgY29uc3QgaXNMYXN0U3RyZWFtID0gaSA9PT0gc3RyZWFtcy5sZW5ndGggLSAxXG4gICAgaWYgKGlzTm9kZVN0cmVhbShzdHJlYW0pKSB7XG4gICAgICBpZiAoZW5kKSB7XG4gICAgICAgIGNvbnN0IHsgZGVzdHJveSwgY2xlYW51cCB9ID0gZGVzdHJveWVyKHN0cmVhbSwgcmVhZGluZywgd3JpdGluZylcbiAgICAgICAgZGVzdHJveXMucHVzaChkZXN0cm95KVxuICAgICAgICBpZiAoaXNSZWFkYWJsZShzdHJlYW0pICYmIGlzTGFzdFN0cmVhbSkge1xuICAgICAgICAgIGxhc3RTdHJlYW1DbGVhbnVwLnB1c2goY2xlYW51cClcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICAvLyBDYXRjaCBzdHJlYW0gZXJyb3JzIHRoYXQgb2NjdXIgYWZ0ZXIgcGlwZS9wdW1wIGhhcyBjb21wbGV0ZWQuXG4gICAgICBmdW5jdGlvbiBvbkVycm9yKGVycikge1xuICAgICAgICBpZiAoZXJyICYmIGVyci5uYW1lICE9PSAnQWJvcnRFcnJvcicgJiYgZXJyLmNvZGUgIT09ICdFUlJfU1RSRUFNX1BSRU1BVFVSRV9DTE9TRScpIHtcbiAgICAgICAgICBmaW5pc2goZXJyKVxuICAgICAgICB9XG4gICAgICB9XG4gICAgICBzdHJlYW0ub24oJ2Vycm9yJywgb25FcnJvcilcbiAgICAgIGlmIChpc1JlYWRhYmxlKHN0cmVhbSkgJiYgaXNMYXN0U3RyZWFtKSB7XG4gICAgICAgIGxhc3RTdHJlYW1DbGVhbnVwLnB1c2goKCkgPT4ge1xuICAgICAgICAgIHN0cmVhbS5yZW1vdmVMaXN0ZW5lcignZXJyb3InLCBvbkVycm9yKVxuICAgICAgICB9KVxuICAgICAgfVxuICAgIH1cbiAgICBpZiAoaSA9PT0gMCkge1xuICAgICAgaWYgKHR5cGVvZiBzdHJlYW0gPT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgcmV0ID0gc3RyZWFtKHtcbiAgICAgICAgICBzaWduYWxcbiAgICAgICAgfSlcbiAgICAgICAgaWYgKCFpc0l0ZXJhYmxlKHJldCkpIHtcbiAgICAgICAgICB0aHJvdyBuZXcgRVJSX0lOVkFMSURfUkVUVVJOX1ZBTFVFKCdJdGVyYWJsZSwgQXN5bmNJdGVyYWJsZSBvciBTdHJlYW0nLCAnc291cmNlJywgcmV0KVxuICAgICAgICB9XG4gICAgICB9IGVsc2UgaWYgKGlzSXRlcmFibGUoc3RyZWFtKSB8fCBpc1JlYWRhYmxlTm9kZVN0cmVhbShzdHJlYW0pIHx8IGlzVHJhbnNmb3JtU3RyZWFtKHN0cmVhbSkpIHtcbiAgICAgICAgcmV0ID0gc3RyZWFtXG4gICAgICB9IGVsc2Uge1xuICAgICAgICByZXQgPSBEdXBsZXguZnJvbShzdHJlYW0pXG4gICAgICB9XG4gICAgfSBlbHNlIGlmICh0eXBlb2Ygc3RyZWFtID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICBpZiAoaXNUcmFuc2Zvcm1TdHJlYW0ocmV0KSkge1xuICAgICAgICB2YXIgX3JldFxuICAgICAgICByZXQgPSBtYWtlQXN5bmNJdGVyYWJsZSgoX3JldCA9IHJldCkgPT09IG51bGwgfHwgX3JldCA9PT0gdW5kZWZpbmVkID8gdW5kZWZpbmVkIDogX3JldC5yZWFkYWJsZSlcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHJldCA9IG1ha2VBc3luY0l0ZXJhYmxlKHJldClcbiAgICAgIH1cbiAgICAgIHJldCA9IHN0cmVhbShyZXQsIHtcbiAgICAgICAgc2lnbmFsXG4gICAgICB9KVxuICAgICAgaWYgKHJlYWRpbmcpIHtcbiAgICAgICAgaWYgKCFpc0l0ZXJhYmxlKHJldCwgdHJ1ZSkpIHtcbiAgICAgICAgICB0aHJvdyBuZXcgRVJSX0lOVkFMSURfUkVUVVJOX1ZBTFVFKCdBc3luY0l0ZXJhYmxlJywgYHRyYW5zZm9ybVske2kgLSAxfV1gLCByZXQpXG4gICAgICAgIH1cbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHZhciBfcmV0MlxuICAgICAgICBpZiAoIVBhc3NUaHJvdWdoKSB7XG4gICAgICAgICAgUGFzc1Rocm91Z2ggPSByZXF1aXJlKCcuL3Bhc3N0aHJvdWdoJylcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIElmIHRoZSBsYXN0IGFyZ3VtZW50IHRvIHBpcGVsaW5lIGlzIG5vdCBhIHN0cmVhbVxuICAgICAgICAvLyB3ZSBtdXN0IGNyZWF0ZSBhIHByb3h5IHN0cmVhbSBzbyB0aGF0IHBpcGVsaW5lKC4uLilcbiAgICAgICAgLy8gYWx3YXlzIHJldHVybnMgYSBzdHJlYW0gd2hpY2ggY2FuIGJlIGZ1cnRoZXJcbiAgICAgICAgLy8gY29tcG9zZWQgdGhyb3VnaCBgLnBpcGUoc3RyZWFtKWAuXG5cbiAgICAgICAgY29uc3QgcHQgPSBuZXcgUGFzc1Rocm91Z2goe1xuICAgICAgICAgIG9iamVjdE1vZGU6IHRydWVcbiAgICAgICAgfSlcblxuICAgICAgICAvLyBIYW5kbGUgUHJvbWlzZXMvQSsgc3BlYywgYHRoZW5gIGNvdWxkIGJlIGEgZ2V0dGVyIHRoYXQgdGhyb3dzIG9uXG4gICAgICAgIC8vIHNlY29uZCB1c2UuXG4gICAgICAgIGNvbnN0IHRoZW4gPSAoX3JldDIgPSByZXQpID09PSBudWxsIHx8IF9yZXQyID09PSB1bmRlZmluZWQgPyB1bmRlZmluZWQgOiBfcmV0Mi50aGVuXG4gICAgICAgIGlmICh0eXBlb2YgdGhlbiA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICAgIGZpbmlzaENvdW50KytcbiAgICAgICAgICB0aGVuLmNhbGwoXG4gICAgICAgICAgICByZXQsXG4gICAgICAgICAgICAodmFsKSA9PiB7XG4gICAgICAgICAgICAgIHZhbHVlID0gdmFsXG4gICAgICAgICAgICAgIGlmICh2YWwgIT0gbnVsbCkge1xuICAgICAgICAgICAgICAgIHB0LndyaXRlKHZhbClcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICBpZiAoZW5kKSB7XG4gICAgICAgICAgICAgICAgcHQuZW5kKClcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICBwcm9jZXNzLm5leHRUaWNrKGZpbmlzaClcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAoZXJyKSA9PiB7XG4gICAgICAgICAgICAgIHB0LmRlc3Ryb3koZXJyKVxuICAgICAgICAgICAgICBwcm9jZXNzLm5leHRUaWNrKGZpbmlzaCwgZXJyKVxuICAgICAgICAgICAgfVxuICAgICAgICAgIClcbiAgICAgICAgfSBlbHNlIGlmIChpc0l0ZXJhYmxlKHJldCwgdHJ1ZSkpIHtcbiAgICAgICAgICBmaW5pc2hDb3VudCsrXG4gICAgICAgICAgcHVtcFRvTm9kZShyZXQsIHB0LCBmaW5pc2gsIHtcbiAgICAgICAgICAgIGVuZFxuICAgICAgICAgIH0pXG4gICAgICAgIH0gZWxzZSBpZiAoaXNSZWFkYWJsZVN0cmVhbShyZXQpIHx8IGlzVHJhbnNmb3JtU3RyZWFtKHJldCkpIHtcbiAgICAgICAgICBjb25zdCB0b1JlYWQgPSByZXQucmVhZGFibGUgfHwgcmV0XG4gICAgICAgICAgZmluaXNoQ291bnQrK1xuICAgICAgICAgIHB1bXBUb05vZGUodG9SZWFkLCBwdCwgZmluaXNoLCB7XG4gICAgICAgICAgICBlbmRcbiAgICAgICAgICB9KVxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHRocm93IG5ldyBFUlJfSU5WQUxJRF9SRVRVUk5fVkFMVUUoJ0FzeW5jSXRlcmFibGUgb3IgUHJvbWlzZScsICdkZXN0aW5hdGlvbicsIHJldClcbiAgICAgICAgfVxuICAgICAgICByZXQgPSBwdFxuICAgICAgICBjb25zdCB7IGRlc3Ryb3ksIGNsZWFudXAgfSA9IGRlc3Ryb3llcihyZXQsIGZhbHNlLCB0cnVlKVxuICAgICAgICBkZXN0cm95cy5wdXNoKGRlc3Ryb3kpXG4gICAgICAgIGlmIChpc0xhc3RTdHJlYW0pIHtcbiAgICAgICAgICBsYXN0U3RyZWFtQ2xlYW51cC5wdXNoKGNsZWFudXApXG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9IGVsc2UgaWYgKGlzTm9kZVN0cmVhbShzdHJlYW0pKSB7XG4gICAgICBpZiAoaXNSZWFkYWJsZU5vZGVTdHJlYW0ocmV0KSkge1xuICAgICAgICBmaW5pc2hDb3VudCArPSAyXG4gICAgICAgIGNvbnN0IGNsZWFudXAgPSBwaXBlKHJldCwgc3RyZWFtLCBmaW5pc2gsIHtcbiAgICAgICAgICBlbmRcbiAgICAgICAgfSlcbiAgICAgICAgaWYgKGlzUmVhZGFibGUoc3RyZWFtKSAmJiBpc0xhc3RTdHJlYW0pIHtcbiAgICAgICAgICBsYXN0U3RyZWFtQ2xlYW51cC5wdXNoKGNsZWFudXApXG4gICAgICAgIH1cbiAgICAgIH0gZWxzZSBpZiAoaXNUcmFuc2Zvcm1TdHJlYW0ocmV0KSB8fCBpc1JlYWRhYmxlU3RyZWFtKHJldCkpIHtcbiAgICAgICAgY29uc3QgdG9SZWFkID0gcmV0LnJlYWRhYmxlIHx8IHJldFxuICAgICAgICBmaW5pc2hDb3VudCsrXG4gICAgICAgIHB1bXBUb05vZGUodG9SZWFkLCBzdHJlYW0sIGZpbmlzaCwge1xuICAgICAgICAgIGVuZFxuICAgICAgICB9KVxuICAgICAgfSBlbHNlIGlmIChpc0l0ZXJhYmxlKHJldCkpIHtcbiAgICAgICAgZmluaXNoQ291bnQrK1xuICAgICAgICBwdW1wVG9Ob2RlKHJldCwgc3RyZWFtLCBmaW5pc2gsIHtcbiAgICAgICAgICBlbmRcbiAgICAgICAgfSlcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHRocm93IG5ldyBFUlJfSU5WQUxJRF9BUkdfVFlQRShcbiAgICAgICAgICAndmFsJyxcbiAgICAgICAgICBbJ1JlYWRhYmxlJywgJ0l0ZXJhYmxlJywgJ0FzeW5jSXRlcmFibGUnLCAnUmVhZGFibGVTdHJlYW0nLCAnVHJhbnNmb3JtU3RyZWFtJ10sXG4gICAgICAgICAgcmV0XG4gICAgICAgIClcbiAgICAgIH1cbiAgICAgIHJldCA9IHN0cmVhbVxuICAgIH0gZWxzZSBpZiAoaXNXZWJTdHJlYW0oc3RyZWFtKSkge1xuICAgICAgaWYgKGlzUmVhZGFibGVOb2RlU3RyZWFtKHJldCkpIHtcbiAgICAgICAgZmluaXNoQ291bnQrK1xuICAgICAgICBwdW1wVG9XZWIobWFrZUFzeW5jSXRlcmFibGUocmV0KSwgc3RyZWFtLCBmaW5pc2gsIHtcbiAgICAgICAgICBlbmRcbiAgICAgICAgfSlcbiAgICAgIH0gZWxzZSBpZiAoaXNSZWFkYWJsZVN0cmVhbShyZXQpIHx8IGlzSXRlcmFibGUocmV0KSkge1xuICAgICAgICBmaW5pc2hDb3VudCsrXG4gICAgICAgIHB1bXBUb1dlYihyZXQsIHN0cmVhbSwgZmluaXNoLCB7XG4gICAgICAgICAgZW5kXG4gICAgICAgIH0pXG4gICAgICB9IGVsc2UgaWYgKGlzVHJhbnNmb3JtU3RyZWFtKHJldCkpIHtcbiAgICAgICAgZmluaXNoQ291bnQrK1xuICAgICAgICBwdW1wVG9XZWIocmV0LnJlYWRhYmxlLCBzdHJlYW0sIGZpbmlzaCwge1xuICAgICAgICAgIGVuZFxuICAgICAgICB9KVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdGhyb3cgbmV3IEVSUl9JTlZBTElEX0FSR19UWVBFKFxuICAgICAgICAgICd2YWwnLFxuICAgICAgICAgIFsnUmVhZGFibGUnLCAnSXRlcmFibGUnLCAnQXN5bmNJdGVyYWJsZScsICdSZWFkYWJsZVN0cmVhbScsICdUcmFuc2Zvcm1TdHJlYW0nXSxcbiAgICAgICAgICByZXRcbiAgICAgICAgKVxuICAgICAgfVxuICAgICAgcmV0ID0gc3RyZWFtXG4gICAgfSBlbHNlIHtcbiAgICAgIHJldCA9IER1cGxleC5mcm9tKHN0cmVhbSlcbiAgICB9XG4gIH1cbiAgaWYgKFxuICAgIChzaWduYWwgIT09IG51bGwgJiYgc2lnbmFsICE9PSB1bmRlZmluZWQgJiYgc2lnbmFsLmFib3J0ZWQpIHx8XG4gICAgKG91dGVyU2lnbmFsICE9PSBudWxsICYmIG91dGVyU2lnbmFsICE9PSB1bmRlZmluZWQgJiYgb3V0ZXJTaWduYWwuYWJvcnRlZClcbiAgKSB7XG4gICAgcHJvY2Vzcy5uZXh0VGljayhhYm9ydClcbiAgfVxuICByZXR1cm4gcmV0XG59XG5mdW5jdGlvbiBwaXBlKHNyYywgZHN0LCBmaW5pc2gsIHsgZW5kIH0pIHtcbiAgbGV0IGVuZGVkID0gZmFsc2VcbiAgZHN0Lm9uKCdjbG9zZScsICgpID0+IHtcbiAgICBpZiAoIWVuZGVkKSB7XG4gICAgICAvLyBGaW5pc2ggaWYgdGhlIGRlc3RpbmF0aW9uIGNsb3NlcyBiZWZvcmUgdGhlIHNvdXJjZSBoYXMgY29tcGxldGVkLlxuICAgICAgZmluaXNoKG5ldyBFUlJfU1RSRUFNX1BSRU1BVFVSRV9DTE9TRSgpKVxuICAgIH1cbiAgfSlcbiAgc3JjLnBpcGUoZHN0LCB7XG4gICAgZW5kOiBmYWxzZVxuICB9KSAvLyBJZiBlbmQgaXMgdHJ1ZSB3ZSBhbHJlYWR5IHdpbGwgaGF2ZSBhIGxpc3RlbmVyIHRvIGVuZCBkc3QuXG5cbiAgaWYgKGVuZCkge1xuICAgIC8vIENvbXBhdC4gQmVmb3JlIG5vZGUgdjEwLjEyLjAgc3RkaW8gdXNlZCB0byB0aHJvdyBhbiBlcnJvciBzb1xuICAgIC8vIHBpcGUoKSBkaWQvZG9lcyBub3QgZW5kKCkgc3RkaW8gZGVzdGluYXRpb25zLlxuICAgIC8vIE5vdyB0aGV5IGFsbG93IGl0IGJ1dCBcInNlY3JldGx5XCIgZG9uJ3QgY2xvc2UgdGhlIHVuZGVybHlpbmcgZmQuXG5cbiAgICBmdW5jdGlvbiBlbmRGbigpIHtcbiAgICAgIGVuZGVkID0gdHJ1ZVxuICAgICAgZHN0LmVuZCgpXG4gICAgfVxuICAgIGlmIChpc1JlYWRhYmxlRmluaXNoZWQoc3JjKSkge1xuICAgICAgLy8gRW5kIHRoZSBkZXN0aW5hdGlvbiBpZiB0aGUgc291cmNlIGhhcyBhbHJlYWR5IGVuZGVkLlxuICAgICAgcHJvY2Vzcy5uZXh0VGljayhlbmRGbilcbiAgICB9IGVsc2Uge1xuICAgICAgc3JjLm9uY2UoJ2VuZCcsIGVuZEZuKVxuICAgIH1cbiAgfSBlbHNlIHtcbiAgICBmaW5pc2goKVxuICB9XG4gIGVvcyhcbiAgICBzcmMsXG4gICAge1xuICAgICAgcmVhZGFibGU6IHRydWUsXG4gICAgICB3cml0YWJsZTogZmFsc2VcbiAgICB9LFxuICAgIChlcnIpID0+IHtcbiAgICAgIGNvbnN0IHJTdGF0ZSA9IHNyYy5fcmVhZGFibGVTdGF0ZVxuICAgICAgaWYgKFxuICAgICAgICBlcnIgJiZcbiAgICAgICAgZXJyLmNvZGUgPT09ICdFUlJfU1RSRUFNX1BSRU1BVFVSRV9DTE9TRScgJiZcbiAgICAgICAgclN0YXRlICYmXG4gICAgICAgIHJTdGF0ZS5lbmRlZCAmJlxuICAgICAgICAhclN0YXRlLmVycm9yZWQgJiZcbiAgICAgICAgIXJTdGF0ZS5lcnJvckVtaXR0ZWRcbiAgICAgICkge1xuICAgICAgICAvLyBTb21lIHJlYWRhYmxlIHN0cmVhbXMgd2lsbCBlbWl0ICdjbG9zZScgYmVmb3JlICdlbmQnLiBIb3dldmVyLCBzaW5jZVxuICAgICAgICAvLyB0aGlzIGlzIG9uIHRoZSByZWFkYWJsZSBzaWRlICdlbmQnIHNob3VsZCBzdGlsbCBiZSBlbWl0dGVkIGlmIHRoZVxuICAgICAgICAvLyBzdHJlYW0gaGFzIGJlZW4gZW5kZWQgYW5kIG5vIGVycm9yIGVtaXR0ZWQuIFRoaXMgc2hvdWxkIGJlIGFsbG93ZWQgaW5cbiAgICAgICAgLy8gZmF2b3Igb2YgYmFja3dhcmRzIGNvbXBhdGliaWxpdHkuIFNpbmNlIHRoZSBzdHJlYW0gaXMgcGlwZWQgdG8gYVxuICAgICAgICAvLyBkZXN0aW5hdGlvbiB0aGlzIHNob3VsZCBub3QgcmVzdWx0IGluIGFueSBvYnNlcnZhYmxlIGRpZmZlcmVuY2UuXG4gICAgICAgIC8vIFdlIGRvbid0IG5lZWQgdG8gY2hlY2sgaWYgdGhpcyBpcyBhIHdyaXRhYmxlIHByZW1hdHVyZSBjbG9zZSBzaW5jZVxuICAgICAgICAvLyBlb3Mgd2lsbCBvbmx5IGZhaWwgd2l0aCBwcmVtYXR1cmUgY2xvc2Ugb24gdGhlIHJlYWRpbmcgc2lkZSBmb3JcbiAgICAgICAgLy8gZHVwbGV4IHN0cmVhbXMuXG4gICAgICAgIHNyYy5vbmNlKCdlbmQnLCBmaW5pc2gpLm9uY2UoJ2Vycm9yJywgZmluaXNoKVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgZmluaXNoKGVycilcbiAgICAgIH1cbiAgICB9XG4gIClcbiAgcmV0dXJuIGVvcyhcbiAgICBkc3QsXG4gICAge1xuICAgICAgcmVhZGFibGU6IGZhbHNlLFxuICAgICAgd3JpdGFibGU6IHRydWVcbiAgICB9LFxuICAgIGZpbmlzaFxuICApXG59XG5tb2R1bGUuZXhwb3J0cyA9IHtcbiAgcGlwZWxpbmVJbXBsLFxuICBwaXBlbGluZVxufVxuIiwKICAgICIndXNlIHN0cmljdCdcblxuY29uc3QgeyBwaXBlbGluZSB9ID0gcmVxdWlyZSgnLi9waXBlbGluZScpXG5jb25zdCBEdXBsZXggPSByZXF1aXJlKCcuL2R1cGxleCcpXG5jb25zdCB7IGRlc3Ryb3llciB9ID0gcmVxdWlyZSgnLi9kZXN0cm95JylcbmNvbnN0IHtcbiAgaXNOb2RlU3RyZWFtLFxuICBpc1JlYWRhYmxlLFxuICBpc1dyaXRhYmxlLFxuICBpc1dlYlN0cmVhbSxcbiAgaXNUcmFuc2Zvcm1TdHJlYW0sXG4gIGlzV3JpdGFibGVTdHJlYW0sXG4gIGlzUmVhZGFibGVTdHJlYW1cbn0gPSByZXF1aXJlKCcuL3V0aWxzJylcbmNvbnN0IHtcbiAgQWJvcnRFcnJvcixcbiAgY29kZXM6IHsgRVJSX0lOVkFMSURfQVJHX1ZBTFVFLCBFUlJfTUlTU0lOR19BUkdTIH1cbn0gPSByZXF1aXJlKCcuLi8uLi9vdXJzL2Vycm9ycycpXG5jb25zdCBlb3MgPSByZXF1aXJlKCcuL2VuZC1vZi1zdHJlYW0nKVxubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiBjb21wb3NlKC4uLnN0cmVhbXMpIHtcbiAgaWYgKHN0cmVhbXMubGVuZ3RoID09PSAwKSB7XG4gICAgdGhyb3cgbmV3IEVSUl9NSVNTSU5HX0FSR1MoJ3N0cmVhbXMnKVxuICB9XG4gIGlmIChzdHJlYW1zLmxlbmd0aCA9PT0gMSkge1xuICAgIHJldHVybiBEdXBsZXguZnJvbShzdHJlYW1zWzBdKVxuICB9XG4gIGNvbnN0IG9yZ1N0cmVhbXMgPSBbLi4uc3RyZWFtc11cbiAgaWYgKHR5cGVvZiBzdHJlYW1zWzBdID09PSAnZnVuY3Rpb24nKSB7XG4gICAgc3RyZWFtc1swXSA9IER1cGxleC5mcm9tKHN0cmVhbXNbMF0pXG4gIH1cbiAgaWYgKHR5cGVvZiBzdHJlYW1zW3N0cmVhbXMubGVuZ3RoIC0gMV0gPT09ICdmdW5jdGlvbicpIHtcbiAgICBjb25zdCBpZHggPSBzdHJlYW1zLmxlbmd0aCAtIDFcbiAgICBzdHJlYW1zW2lkeF0gPSBEdXBsZXguZnJvbShzdHJlYW1zW2lkeF0pXG4gIH1cbiAgZm9yIChsZXQgbiA9IDA7IG4gPCBzdHJlYW1zLmxlbmd0aDsgKytuKSB7XG4gICAgaWYgKCFpc05vZGVTdHJlYW0oc3RyZWFtc1tuXSkgJiYgIWlzV2ViU3RyZWFtKHN0cmVhbXNbbl0pKSB7XG4gICAgICAvLyBUT0RPKHJvbmFnKTogQWRkIGNoZWNrcyBmb3Igbm9uIHN0cmVhbXMuXG4gICAgICBjb250aW51ZVxuICAgIH1cbiAgICBpZiAoXG4gICAgICBuIDwgc3RyZWFtcy5sZW5ndGggLSAxICYmXG4gICAgICAhKGlzUmVhZGFibGUoc3RyZWFtc1tuXSkgfHwgaXNSZWFkYWJsZVN0cmVhbShzdHJlYW1zW25dKSB8fCBpc1RyYW5zZm9ybVN0cmVhbShzdHJlYW1zW25dKSlcbiAgICApIHtcbiAgICAgIHRocm93IG5ldyBFUlJfSU5WQUxJRF9BUkdfVkFMVUUoYHN0cmVhbXNbJHtufV1gLCBvcmdTdHJlYW1zW25dLCAnbXVzdCBiZSByZWFkYWJsZScpXG4gICAgfVxuICAgIGlmIChuID4gMCAmJiAhKGlzV3JpdGFibGUoc3RyZWFtc1tuXSkgfHwgaXNXcml0YWJsZVN0cmVhbShzdHJlYW1zW25dKSB8fCBpc1RyYW5zZm9ybVN0cmVhbShzdHJlYW1zW25dKSkpIHtcbiAgICAgIHRocm93IG5ldyBFUlJfSU5WQUxJRF9BUkdfVkFMVUUoYHN0cmVhbXNbJHtufV1gLCBvcmdTdHJlYW1zW25dLCAnbXVzdCBiZSB3cml0YWJsZScpXG4gICAgfVxuICB9XG4gIGxldCBvbmRyYWluXG4gIGxldCBvbmZpbmlzaFxuICBsZXQgb25yZWFkYWJsZVxuICBsZXQgb25jbG9zZVxuICBsZXQgZFxuICBmdW5jdGlvbiBvbmZpbmlzaGVkKGVycikge1xuICAgIGNvbnN0IGNiID0gb25jbG9zZVxuICAgIG9uY2xvc2UgPSBudWxsXG4gICAgaWYgKGNiKSB7XG4gICAgICBjYihlcnIpXG4gICAgfSBlbHNlIGlmIChlcnIpIHtcbiAgICAgIGQuZGVzdHJveShlcnIpXG4gICAgfSBlbHNlIGlmICghcmVhZGFibGUgJiYgIXdyaXRhYmxlKSB7XG4gICAgICBkLmRlc3Ryb3koKVxuICAgIH1cbiAgfVxuICBjb25zdCBoZWFkID0gc3RyZWFtc1swXVxuICBjb25zdCB0YWlsID0gcGlwZWxpbmUoc3RyZWFtcywgb25maW5pc2hlZClcbiAgY29uc3Qgd3JpdGFibGUgPSAhIShpc1dyaXRhYmxlKGhlYWQpIHx8IGlzV3JpdGFibGVTdHJlYW0oaGVhZCkgfHwgaXNUcmFuc2Zvcm1TdHJlYW0oaGVhZCkpXG4gIGNvbnN0IHJlYWRhYmxlID0gISEoaXNSZWFkYWJsZSh0YWlsKSB8fCBpc1JlYWRhYmxlU3RyZWFtKHRhaWwpIHx8IGlzVHJhbnNmb3JtU3RyZWFtKHRhaWwpKVxuXG4gIC8vIFRPRE8ocm9uYWcpOiBBdm9pZCBkb3VibGUgYnVmZmVyaW5nLlxuICAvLyBJbXBsZW1lbnQgV3JpdGFibGUvUmVhZGFibGUvRHVwbGV4IHRyYWl0cy5cbiAgLy8gU2VlLCBodHRwczovL2dpdGh1Yi5jb20vbm9kZWpzL25vZGUvcHVsbC8zMzUxNS5cbiAgZCA9IG5ldyBEdXBsZXgoe1xuICAgIC8vIFRPRE8gKHJvbmFnKTogaGlnaFdhdGVyTWFyaz9cbiAgICB3cml0YWJsZU9iamVjdE1vZGU6ICEhKGhlYWQgIT09IG51bGwgJiYgaGVhZCAhPT0gdW5kZWZpbmVkICYmIGhlYWQud3JpdGFibGVPYmplY3RNb2RlKSxcbiAgICByZWFkYWJsZU9iamVjdE1vZGU6ICEhKHRhaWwgIT09IG51bGwgJiYgdGFpbCAhPT0gdW5kZWZpbmVkICYmIHRhaWwucmVhZGFibGVPYmplY3RNb2RlKSxcbiAgICB3cml0YWJsZSxcbiAgICByZWFkYWJsZVxuICB9KVxuICBpZiAod3JpdGFibGUpIHtcbiAgICBpZiAoaXNOb2RlU3RyZWFtKGhlYWQpKSB7XG4gICAgICBkLl93cml0ZSA9IGZ1bmN0aW9uIChjaHVuaywgZW5jb2RpbmcsIGNhbGxiYWNrKSB7XG4gICAgICAgIGlmIChoZWFkLndyaXRlKGNodW5rLCBlbmNvZGluZykpIHtcbiAgICAgICAgICBjYWxsYmFjaygpXG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgb25kcmFpbiA9IGNhbGxiYWNrXG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIGQuX2ZpbmFsID0gZnVuY3Rpb24gKGNhbGxiYWNrKSB7XG4gICAgICAgIGhlYWQuZW5kKClcbiAgICAgICAgb25maW5pc2ggPSBjYWxsYmFja1xuICAgICAgfVxuICAgICAgaGVhZC5vbignZHJhaW4nLCBmdW5jdGlvbiAoKSB7XG4gICAgICAgIGlmIChvbmRyYWluKSB7XG4gICAgICAgICAgY29uc3QgY2IgPSBvbmRyYWluXG4gICAgICAgICAgb25kcmFpbiA9IG51bGxcbiAgICAgICAgICBjYigpXG4gICAgICAgIH1cbiAgICAgIH0pXG4gICAgfSBlbHNlIGlmIChpc1dlYlN0cmVhbShoZWFkKSkge1xuICAgICAgY29uc3Qgd3JpdGFibGUgPSBpc1RyYW5zZm9ybVN0cmVhbShoZWFkKSA/IGhlYWQud3JpdGFibGUgOiBoZWFkXG4gICAgICBjb25zdCB3cml0ZXIgPSB3cml0YWJsZS5nZXRXcml0ZXIoKVxuICAgICAgZC5fd3JpdGUgPSBhc3luYyBmdW5jdGlvbiAoY2h1bmssIGVuY29kaW5nLCBjYWxsYmFjaykge1xuICAgICAgICB0cnkge1xuICAgICAgICAgIGF3YWl0IHdyaXRlci5yZWFkeVxuICAgICAgICAgIHdyaXRlci53cml0ZShjaHVuaykuY2F0Y2goKCkgPT4ge30pXG4gICAgICAgICAgY2FsbGJhY2soKVxuICAgICAgICB9IGNhdGNoIChlcnIpIHtcbiAgICAgICAgICBjYWxsYmFjayhlcnIpXG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIGQuX2ZpbmFsID0gYXN5bmMgZnVuY3Rpb24gKGNhbGxiYWNrKSB7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgYXdhaXQgd3JpdGVyLnJlYWR5XG4gICAgICAgICAgd3JpdGVyLmNsb3NlKCkuY2F0Y2goKCkgPT4ge30pXG4gICAgICAgICAgb25maW5pc2ggPSBjYWxsYmFja1xuICAgICAgICB9IGNhdGNoIChlcnIpIHtcbiAgICAgICAgICBjYWxsYmFjayhlcnIpXG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gICAgY29uc3QgdG9SZWFkID0gaXNUcmFuc2Zvcm1TdHJlYW0odGFpbCkgPyB0YWlsLnJlYWRhYmxlIDogdGFpbFxuICAgIGVvcyh0b1JlYWQsICgpID0+IHtcbiAgICAgIGlmIChvbmZpbmlzaCkge1xuICAgICAgICBjb25zdCBjYiA9IG9uZmluaXNoXG4gICAgICAgIG9uZmluaXNoID0gbnVsbFxuICAgICAgICBjYigpXG4gICAgICB9XG4gICAgfSlcbiAgfVxuICBpZiAocmVhZGFibGUpIHtcbiAgICBpZiAoaXNOb2RlU3RyZWFtKHRhaWwpKSB7XG4gICAgICB0YWlsLm9uKCdyZWFkYWJsZScsIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgaWYgKG9ucmVhZGFibGUpIHtcbiAgICAgICAgICBjb25zdCBjYiA9IG9ucmVhZGFibGVcbiAgICAgICAgICBvbnJlYWRhYmxlID0gbnVsbFxuICAgICAgICAgIGNiKClcbiAgICAgICAgfVxuICAgICAgfSlcbiAgICAgIHRhaWwub24oJ2VuZCcsIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgZC5wdXNoKG51bGwpXG4gICAgICB9KVxuICAgICAgZC5fcmVhZCA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgd2hpbGUgKHRydWUpIHtcbiAgICAgICAgICBjb25zdCBidWYgPSB0YWlsLnJlYWQoKVxuICAgICAgICAgIGlmIChidWYgPT09IG51bGwpIHtcbiAgICAgICAgICAgIG9ucmVhZGFibGUgPSBkLl9yZWFkXG4gICAgICAgICAgICByZXR1cm5cbiAgICAgICAgICB9XG4gICAgICAgICAgaWYgKCFkLnB1c2goYnVmKSkge1xuICAgICAgICAgICAgcmV0dXJuXG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9XG4gICAgfSBlbHNlIGlmIChpc1dlYlN0cmVhbSh0YWlsKSkge1xuICAgICAgY29uc3QgcmVhZGFibGUgPSBpc1RyYW5zZm9ybVN0cmVhbSh0YWlsKSA/IHRhaWwucmVhZGFibGUgOiB0YWlsXG4gICAgICBjb25zdCByZWFkZXIgPSByZWFkYWJsZS5nZXRSZWFkZXIoKVxuICAgICAgZC5fcmVhZCA9IGFzeW5jIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgd2hpbGUgKHRydWUpIHtcbiAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgY29uc3QgeyB2YWx1ZSwgZG9uZSB9ID0gYXdhaXQgcmVhZGVyLnJlYWQoKVxuICAgICAgICAgICAgaWYgKCFkLnB1c2godmFsdWUpKSB7XG4gICAgICAgICAgICAgIHJldHVyblxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKGRvbmUpIHtcbiAgICAgICAgICAgICAgZC5wdXNoKG51bGwpXG4gICAgICAgICAgICAgIHJldHVyblxuICAgICAgICAgICAgfVxuICAgICAgICAgIH0gY2F0Y2gge1xuICAgICAgICAgICAgcmV0dXJuXG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICB9XG4gIGQuX2Rlc3Ryb3kgPSBmdW5jdGlvbiAoZXJyLCBjYWxsYmFjaykge1xuICAgIGlmICghZXJyICYmIG9uY2xvc2UgIT09IG51bGwpIHtcbiAgICAgIGVyciA9IG5ldyBBYm9ydEVycm9yKClcbiAgICB9XG4gICAgb25yZWFkYWJsZSA9IG51bGxcbiAgICBvbmRyYWluID0gbnVsbFxuICAgIG9uZmluaXNoID0gbnVsbFxuICAgIGlmIChvbmNsb3NlID09PSBudWxsKSB7XG4gICAgICBjYWxsYmFjayhlcnIpXG4gICAgfSBlbHNlIHtcbiAgICAgIG9uY2xvc2UgPSBjYWxsYmFja1xuICAgICAgaWYgKGlzTm9kZVN0cmVhbSh0YWlsKSkge1xuICAgICAgICBkZXN0cm95ZXIodGFpbCwgZXJyKVxuICAgICAgfVxuICAgIH1cbiAgfVxuICByZXR1cm4gZFxufVxuIiwKICAgICIndXNlIHN0cmljdCdcblxuY29uc3QgQWJvcnRDb250cm9sbGVyID0gZ2xvYmFsVGhpcy5BYm9ydENvbnRyb2xsZXIgfHwgcmVxdWlyZSgnYWJvcnQtY29udHJvbGxlcicpLkFib3J0Q29udHJvbGxlclxuY29uc3Qge1xuICBjb2RlczogeyBFUlJfSU5WQUxJRF9BUkdfVkFMVUUsIEVSUl9JTlZBTElEX0FSR19UWVBFLCBFUlJfTUlTU0lOR19BUkdTLCBFUlJfT1VUX09GX1JBTkdFIH0sXG4gIEFib3J0RXJyb3Jcbn0gPSByZXF1aXJlKCcuLi8uLi9vdXJzL2Vycm9ycycpXG5jb25zdCB7IHZhbGlkYXRlQWJvcnRTaWduYWwsIHZhbGlkYXRlSW50ZWdlciwgdmFsaWRhdGVPYmplY3QgfSA9IHJlcXVpcmUoJy4uL3ZhbGlkYXRvcnMnKVxuY29uc3Qga1dlYWtIYW5kbGVyID0gcmVxdWlyZSgnLi4vLi4vb3Vycy9wcmltb3JkaWFscycpLlN5bWJvbCgna1dlYWsnKVxuY29uc3Qga1Jlc2lzdFN0b3BQcm9wYWdhdGlvbiA9IHJlcXVpcmUoJy4uLy4uL291cnMvcHJpbW9yZGlhbHMnKS5TeW1ib2woJ2tSZXNpc3RTdG9wUHJvcGFnYXRpb24nKVxuY29uc3QgeyBmaW5pc2hlZCB9ID0gcmVxdWlyZSgnLi9lbmQtb2Ytc3RyZWFtJylcbmNvbnN0IHN0YXRpY0NvbXBvc2UgPSByZXF1aXJlKCcuL2NvbXBvc2UnKVxuY29uc3QgeyBhZGRBYm9ydFNpZ25hbE5vVmFsaWRhdGUgfSA9IHJlcXVpcmUoJy4vYWRkLWFib3J0LXNpZ25hbCcpXG5jb25zdCB7IGlzV3JpdGFibGUsIGlzTm9kZVN0cmVhbSB9ID0gcmVxdWlyZSgnLi91dGlscycpXG5jb25zdCB7IGRlcHJlY2F0ZSB9ID0gcmVxdWlyZSgnLi4vLi4vb3Vycy91dGlsJylcbmNvbnN0IHtcbiAgQXJyYXlQcm90b3R5cGVQdXNoLFxuICBCb29sZWFuLFxuICBNYXRoRmxvb3IsXG4gIE51bWJlcixcbiAgTnVtYmVySXNOYU4sXG4gIFByb21pc2UsXG4gIFByb21pc2VSZWplY3QsXG4gIFByb21pc2VSZXNvbHZlLFxuICBQcm9taXNlUHJvdG90eXBlVGhlbixcbiAgU3ltYm9sXG59ID0gcmVxdWlyZSgnLi4vLi4vb3Vycy9wcmltb3JkaWFscycpXG5jb25zdCBrRW1wdHkgPSBTeW1ib2woJ2tFbXB0eScpXG5jb25zdCBrRW9mID0gU3ltYm9sKCdrRW9mJylcbmZ1bmN0aW9uIGNvbXBvc2Uoc3RyZWFtLCBvcHRpb25zKSB7XG4gIGlmIChvcHRpb25zICE9IG51bGwpIHtcbiAgICB2YWxpZGF0ZU9iamVjdChvcHRpb25zLCAnb3B0aW9ucycpXG4gIH1cbiAgaWYgKChvcHRpb25zID09PSBudWxsIHx8IG9wdGlvbnMgPT09IHVuZGVmaW5lZCA/IHVuZGVmaW5lZCA6IG9wdGlvbnMuc2lnbmFsKSAhPSBudWxsKSB7XG4gICAgdmFsaWRhdGVBYm9ydFNpZ25hbChvcHRpb25zLnNpZ25hbCwgJ29wdGlvbnMuc2lnbmFsJylcbiAgfVxuICBpZiAoaXNOb2RlU3RyZWFtKHN0cmVhbSkgJiYgIWlzV3JpdGFibGUoc3RyZWFtKSkge1xuICAgIHRocm93IG5ldyBFUlJfSU5WQUxJRF9BUkdfVkFMVUUoJ3N0cmVhbScsIHN0cmVhbSwgJ211c3QgYmUgd3JpdGFibGUnKVxuICB9XG4gIGNvbnN0IGNvbXBvc2VkU3RyZWFtID0gc3RhdGljQ29tcG9zZSh0aGlzLCBzdHJlYW0pXG4gIGlmIChvcHRpb25zICE9PSBudWxsICYmIG9wdGlvbnMgIT09IHVuZGVmaW5lZCAmJiBvcHRpb25zLnNpZ25hbCkge1xuICAgIC8vIE5vdCB2YWxpZGF0aW5nIGFzIHdlIGFscmVhZHkgdmFsaWRhdGVkIGJlZm9yZVxuICAgIGFkZEFib3J0U2lnbmFsTm9WYWxpZGF0ZShvcHRpb25zLnNpZ25hbCwgY29tcG9zZWRTdHJlYW0pXG4gIH1cbiAgcmV0dXJuIGNvbXBvc2VkU3RyZWFtXG59XG5mdW5jdGlvbiBtYXAoZm4sIG9wdGlvbnMpIHtcbiAgaWYgKHR5cGVvZiBmbiAhPT0gJ2Z1bmN0aW9uJykge1xuICAgIHRocm93IG5ldyBFUlJfSU5WQUxJRF9BUkdfVFlQRSgnZm4nLCBbJ0Z1bmN0aW9uJywgJ0FzeW5jRnVuY3Rpb24nXSwgZm4pXG4gIH1cbiAgaWYgKG9wdGlvbnMgIT0gbnVsbCkge1xuICAgIHZhbGlkYXRlT2JqZWN0KG9wdGlvbnMsICdvcHRpb25zJylcbiAgfVxuICBpZiAoKG9wdGlvbnMgPT09IG51bGwgfHwgb3B0aW9ucyA9PT0gdW5kZWZpbmVkID8gdW5kZWZpbmVkIDogb3B0aW9ucy5zaWduYWwpICE9IG51bGwpIHtcbiAgICB2YWxpZGF0ZUFib3J0U2lnbmFsKG9wdGlvbnMuc2lnbmFsLCAnb3B0aW9ucy5zaWduYWwnKVxuICB9XG4gIGxldCBjb25jdXJyZW5jeSA9IDFcbiAgaWYgKChvcHRpb25zID09PSBudWxsIHx8IG9wdGlvbnMgPT09IHVuZGVmaW5lZCA/IHVuZGVmaW5lZCA6IG9wdGlvbnMuY29uY3VycmVuY3kpICE9IG51bGwpIHtcbiAgICBjb25jdXJyZW5jeSA9IE1hdGhGbG9vcihvcHRpb25zLmNvbmN1cnJlbmN5KVxuICB9XG4gIGxldCBoaWdoV2F0ZXJNYXJrID0gY29uY3VycmVuY3kgLSAxXG4gIGlmICgob3B0aW9ucyA9PT0gbnVsbCB8fCBvcHRpb25zID09PSB1bmRlZmluZWQgPyB1bmRlZmluZWQgOiBvcHRpb25zLmhpZ2hXYXRlck1hcmspICE9IG51bGwpIHtcbiAgICBoaWdoV2F0ZXJNYXJrID0gTWF0aEZsb29yKG9wdGlvbnMuaGlnaFdhdGVyTWFyaylcbiAgfVxuICB2YWxpZGF0ZUludGVnZXIoY29uY3VycmVuY3ksICdvcHRpb25zLmNvbmN1cnJlbmN5JywgMSlcbiAgdmFsaWRhdGVJbnRlZ2VyKGhpZ2hXYXRlck1hcmssICdvcHRpb25zLmhpZ2hXYXRlck1hcmsnLCAwKVxuICBoaWdoV2F0ZXJNYXJrICs9IGNvbmN1cnJlbmN5XG4gIHJldHVybiBhc3luYyBmdW5jdGlvbiogbWFwKCkge1xuICAgIGNvbnN0IHNpZ25hbCA9IHJlcXVpcmUoJy4uLy4uL291cnMvdXRpbCcpLkFib3J0U2lnbmFsQW55KFxuICAgICAgW29wdGlvbnMgPT09IG51bGwgfHwgb3B0aW9ucyA9PT0gdW5kZWZpbmVkID8gdW5kZWZpbmVkIDogb3B0aW9ucy5zaWduYWxdLmZpbHRlcihCb29sZWFuKVxuICAgIClcbiAgICBjb25zdCBzdHJlYW0gPSB0aGlzXG4gICAgY29uc3QgcXVldWUgPSBbXVxuICAgIGNvbnN0IHNpZ25hbE9wdCA9IHtcbiAgICAgIHNpZ25hbFxuICAgIH1cbiAgICBsZXQgbmV4dFxuICAgIGxldCByZXN1bWVcbiAgICBsZXQgZG9uZSA9IGZhbHNlXG4gICAgbGV0IGNudCA9IDBcbiAgICBmdW5jdGlvbiBvbkNhdGNoKCkge1xuICAgICAgZG9uZSA9IHRydWVcbiAgICAgIGFmdGVySXRlbVByb2Nlc3NlZCgpXG4gICAgfVxuICAgIGZ1bmN0aW9uIGFmdGVySXRlbVByb2Nlc3NlZCgpIHtcbiAgICAgIGNudCAtPSAxXG4gICAgICBtYXliZVJlc3VtZSgpXG4gICAgfVxuICAgIGZ1bmN0aW9uIG1heWJlUmVzdW1lKCkge1xuICAgICAgaWYgKHJlc3VtZSAmJiAhZG9uZSAmJiBjbnQgPCBjb25jdXJyZW5jeSAmJiBxdWV1ZS5sZW5ndGggPCBoaWdoV2F0ZXJNYXJrKSB7XG4gICAgICAgIHJlc3VtZSgpXG4gICAgICAgIHJlc3VtZSA9IG51bGxcbiAgICAgIH1cbiAgICB9XG4gICAgYXN5bmMgZnVuY3Rpb24gcHVtcCgpIHtcbiAgICAgIHRyeSB7XG4gICAgICAgIGZvciBhd2FpdCAobGV0IHZhbCBvZiBzdHJlYW0pIHtcbiAgICAgICAgICBpZiAoZG9uZSkge1xuICAgICAgICAgICAgcmV0dXJuXG4gICAgICAgICAgfVxuICAgICAgICAgIGlmIChzaWduYWwuYWJvcnRlZCkge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEFib3J0RXJyb3IoKVxuICAgICAgICAgIH1cbiAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgdmFsID0gZm4odmFsLCBzaWduYWxPcHQpXG4gICAgICAgICAgICBpZiAodmFsID09PSBrRW1wdHkpIHtcbiAgICAgICAgICAgICAgY29udGludWVcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHZhbCA9IFByb21pc2VSZXNvbHZlKHZhbClcbiAgICAgICAgICB9IGNhdGNoIChlcnIpIHtcbiAgICAgICAgICAgIHZhbCA9IFByb21pc2VSZWplY3QoZXJyKVxuICAgICAgICAgIH1cbiAgICAgICAgICBjbnQgKz0gMVxuICAgICAgICAgIFByb21pc2VQcm90b3R5cGVUaGVuKHZhbCwgYWZ0ZXJJdGVtUHJvY2Vzc2VkLCBvbkNhdGNoKVxuICAgICAgICAgIHF1ZXVlLnB1c2godmFsKVxuICAgICAgICAgIGlmIChuZXh0KSB7XG4gICAgICAgICAgICBuZXh0KClcbiAgICAgICAgICAgIG5leHQgPSBudWxsXG4gICAgICAgICAgfVxuICAgICAgICAgIGlmICghZG9uZSAmJiAocXVldWUubGVuZ3RoID49IGhpZ2hXYXRlck1hcmsgfHwgY250ID49IGNvbmN1cnJlbmN5KSkge1xuICAgICAgICAgICAgYXdhaXQgbmV3IFByb21pc2UoKHJlc29sdmUpID0+IHtcbiAgICAgICAgICAgICAgcmVzdW1lID0gcmVzb2x2ZVxuICAgICAgICAgICAgfSlcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcXVldWUucHVzaChrRW9mKVxuICAgICAgfSBjYXRjaCAoZXJyKSB7XG4gICAgICAgIGNvbnN0IHZhbCA9IFByb21pc2VSZWplY3QoZXJyKVxuICAgICAgICBQcm9taXNlUHJvdG90eXBlVGhlbih2YWwsIGFmdGVySXRlbVByb2Nlc3NlZCwgb25DYXRjaClcbiAgICAgICAgcXVldWUucHVzaCh2YWwpXG4gICAgICB9IGZpbmFsbHkge1xuICAgICAgICBkb25lID0gdHJ1ZVxuICAgICAgICBpZiAobmV4dCkge1xuICAgICAgICAgIG5leHQoKVxuICAgICAgICAgIG5leHQgPSBudWxsXG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gICAgcHVtcCgpXG4gICAgdHJ5IHtcbiAgICAgIHdoaWxlICh0cnVlKSB7XG4gICAgICAgIHdoaWxlIChxdWV1ZS5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgY29uc3QgdmFsID0gYXdhaXQgcXVldWVbMF1cbiAgICAgICAgICBpZiAodmFsID09PSBrRW9mKSB7XG4gICAgICAgICAgICByZXR1cm5cbiAgICAgICAgICB9XG4gICAgICAgICAgaWYgKHNpZ25hbC5hYm9ydGVkKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgQWJvcnRFcnJvcigpXG4gICAgICAgICAgfVxuICAgICAgICAgIGlmICh2YWwgIT09IGtFbXB0eSkge1xuICAgICAgICAgICAgeWllbGQgdmFsXG4gICAgICAgICAgfVxuICAgICAgICAgIHF1ZXVlLnNoaWZ0KClcbiAgICAgICAgICBtYXliZVJlc3VtZSgpXG4gICAgICAgIH1cbiAgICAgICAgYXdhaXQgbmV3IFByb21pc2UoKHJlc29sdmUpID0+IHtcbiAgICAgICAgICBuZXh0ID0gcmVzb2x2ZVxuICAgICAgICB9KVxuICAgICAgfVxuICAgIH0gZmluYWxseSB7XG4gICAgICBkb25lID0gdHJ1ZVxuICAgICAgaWYgKHJlc3VtZSkge1xuICAgICAgICByZXN1bWUoKVxuICAgICAgICByZXN1bWUgPSBudWxsXG4gICAgICB9XG4gICAgfVxuICB9LmNhbGwodGhpcylcbn1cbmZ1bmN0aW9uIGFzSW5kZXhlZFBhaXJzKG9wdGlvbnMgPSB1bmRlZmluZWQpIHtcbiAgaWYgKG9wdGlvbnMgIT0gbnVsbCkge1xuICAgIHZhbGlkYXRlT2JqZWN0KG9wdGlvbnMsICdvcHRpb25zJylcbiAgfVxuICBpZiAoKG9wdGlvbnMgPT09IG51bGwgfHwgb3B0aW9ucyA9PT0gdW5kZWZpbmVkID8gdW5kZWZpbmVkIDogb3B0aW9ucy5zaWduYWwpICE9IG51bGwpIHtcbiAgICB2YWxpZGF0ZUFib3J0U2lnbmFsKG9wdGlvbnMuc2lnbmFsLCAnb3B0aW9ucy5zaWduYWwnKVxuICB9XG4gIHJldHVybiBhc3luYyBmdW5jdGlvbiogYXNJbmRleGVkUGFpcnMoKSB7XG4gICAgbGV0IGluZGV4ID0gMFxuICAgIGZvciBhd2FpdCAoY29uc3QgdmFsIG9mIHRoaXMpIHtcbiAgICAgIHZhciBfb3B0aW9ucyRzaWduYWxcbiAgICAgIGlmIChcbiAgICAgICAgb3B0aW9ucyAhPT0gbnVsbCAmJlxuICAgICAgICBvcHRpb25zICE9PSB1bmRlZmluZWQgJiZcbiAgICAgICAgKF9vcHRpb25zJHNpZ25hbCA9IG9wdGlvbnMuc2lnbmFsKSAhPT0gbnVsbCAmJlxuICAgICAgICBfb3B0aW9ucyRzaWduYWwgIT09IHVuZGVmaW5lZCAmJlxuICAgICAgICBfb3B0aW9ucyRzaWduYWwuYWJvcnRlZFxuICAgICAgKSB7XG4gICAgICAgIHRocm93IG5ldyBBYm9ydEVycm9yKHtcbiAgICAgICAgICBjYXVzZTogb3B0aW9ucy5zaWduYWwucmVhc29uXG4gICAgICAgIH0pXG4gICAgICB9XG4gICAgICB5aWVsZCBbaW5kZXgrKywgdmFsXVxuICAgIH1cbiAgfS5jYWxsKHRoaXMpXG59XG5hc3luYyBmdW5jdGlvbiBzb21lKGZuLCBvcHRpb25zID0gdW5kZWZpbmVkKSB7XG4gIGZvciBhd2FpdCAoY29uc3QgdW51c2VkIG9mIGZpbHRlci5jYWxsKHRoaXMsIGZuLCBvcHRpb25zKSkge1xuICAgIHJldHVybiB0cnVlXG4gIH1cbiAgcmV0dXJuIGZhbHNlXG59XG5hc3luYyBmdW5jdGlvbiBldmVyeShmbiwgb3B0aW9ucyA9IHVuZGVmaW5lZCkge1xuICBpZiAodHlwZW9mIGZuICE9PSAnZnVuY3Rpb24nKSB7XG4gICAgdGhyb3cgbmV3IEVSUl9JTlZBTElEX0FSR19UWVBFKCdmbicsIFsnRnVuY3Rpb24nLCAnQXN5bmNGdW5jdGlvbiddLCBmbilcbiAgfVxuICAvLyBodHRwczovL2VuLndpa2lwZWRpYS5vcmcvd2lraS9EZV9Nb3JnYW4lMjdzX2xhd3NcbiAgcmV0dXJuICEoYXdhaXQgc29tZS5jYWxsKFxuICAgIHRoaXMsXG4gICAgYXN5bmMgKC4uLmFyZ3MpID0+IHtcbiAgICAgIHJldHVybiAhKGF3YWl0IGZuKC4uLmFyZ3MpKVxuICAgIH0sXG4gICAgb3B0aW9uc1xuICApKVxufVxuYXN5bmMgZnVuY3Rpb24gZmluZChmbiwgb3B0aW9ucykge1xuICBmb3IgYXdhaXQgKGNvbnN0IHJlc3VsdCBvZiBmaWx0ZXIuY2FsbCh0aGlzLCBmbiwgb3B0aW9ucykpIHtcbiAgICByZXR1cm4gcmVzdWx0XG4gIH1cbiAgcmV0dXJuIHVuZGVmaW5lZFxufVxuYXN5bmMgZnVuY3Rpb24gZm9yRWFjaChmbiwgb3B0aW9ucykge1xuICBpZiAodHlwZW9mIGZuICE9PSAnZnVuY3Rpb24nKSB7XG4gICAgdGhyb3cgbmV3IEVSUl9JTlZBTElEX0FSR19UWVBFKCdmbicsIFsnRnVuY3Rpb24nLCAnQXN5bmNGdW5jdGlvbiddLCBmbilcbiAgfVxuICBhc3luYyBmdW5jdGlvbiBmb3JFYWNoRm4odmFsdWUsIG9wdGlvbnMpIHtcbiAgICBhd2FpdCBmbih2YWx1ZSwgb3B0aW9ucylcbiAgICByZXR1cm4ga0VtcHR5XG4gIH1cbiAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLXVudXNlZC12YXJzXG4gIGZvciBhd2FpdCAoY29uc3QgdW51c2VkIG9mIG1hcC5jYWxsKHRoaXMsIGZvckVhY2hGbiwgb3B0aW9ucykpO1xufVxuZnVuY3Rpb24gZmlsdGVyKGZuLCBvcHRpb25zKSB7XG4gIGlmICh0eXBlb2YgZm4gIT09ICdmdW5jdGlvbicpIHtcbiAgICB0aHJvdyBuZXcgRVJSX0lOVkFMSURfQVJHX1RZUEUoJ2ZuJywgWydGdW5jdGlvbicsICdBc3luY0Z1bmN0aW9uJ10sIGZuKVxuICB9XG4gIGFzeW5jIGZ1bmN0aW9uIGZpbHRlckZuKHZhbHVlLCBvcHRpb25zKSB7XG4gICAgaWYgKGF3YWl0IGZuKHZhbHVlLCBvcHRpb25zKSkge1xuICAgICAgcmV0dXJuIHZhbHVlXG4gICAgfVxuICAgIHJldHVybiBrRW1wdHlcbiAgfVxuICByZXR1cm4gbWFwLmNhbGwodGhpcywgZmlsdGVyRm4sIG9wdGlvbnMpXG59XG5cbi8vIFNwZWNpZmljIHRvIHByb3ZpZGUgYmV0dGVyIGVycm9yIHRvIHJlZHVjZSBzaW5jZSB0aGUgYXJndW1lbnQgaXMgb25seVxuLy8gbWlzc2luZyBpZiB0aGUgc3RyZWFtIGhhcyBubyBpdGVtcyBpbiBpdCAtIGJ1dCB0aGUgY29kZSBpcyBzdGlsbCBhcHByb3ByaWF0ZVxuY2xhc3MgUmVkdWNlQXdhcmVFcnJNaXNzaW5nQXJncyBleHRlbmRzIEVSUl9NSVNTSU5HX0FSR1Mge1xuICBjb25zdHJ1Y3RvcigpIHtcbiAgICBzdXBlcigncmVkdWNlJylcbiAgICB0aGlzLm1lc3NhZ2UgPSAnUmVkdWNlIG9mIGFuIGVtcHR5IHN0cmVhbSByZXF1aXJlcyBhbiBpbml0aWFsIHZhbHVlJ1xuICB9XG59XG5hc3luYyBmdW5jdGlvbiByZWR1Y2UocmVkdWNlciwgaW5pdGlhbFZhbHVlLCBvcHRpb25zKSB7XG4gIHZhciBfb3B0aW9ucyRzaWduYWwyXG4gIGlmICh0eXBlb2YgcmVkdWNlciAhPT0gJ2Z1bmN0aW9uJykge1xuICAgIHRocm93IG5ldyBFUlJfSU5WQUxJRF9BUkdfVFlQRSgncmVkdWNlcicsIFsnRnVuY3Rpb24nLCAnQXN5bmNGdW5jdGlvbiddLCByZWR1Y2VyKVxuICB9XG4gIGlmIChvcHRpb25zICE9IG51bGwpIHtcbiAgICB2YWxpZGF0ZU9iamVjdChvcHRpb25zLCAnb3B0aW9ucycpXG4gIH1cbiAgaWYgKChvcHRpb25zID09PSBudWxsIHx8IG9wdGlvbnMgPT09IHVuZGVmaW5lZCA/IHVuZGVmaW5lZCA6IG9wdGlvbnMuc2lnbmFsKSAhPSBudWxsKSB7XG4gICAgdmFsaWRhdGVBYm9ydFNpZ25hbChvcHRpb25zLnNpZ25hbCwgJ29wdGlvbnMuc2lnbmFsJylcbiAgfVxuICBsZXQgaGFzSW5pdGlhbFZhbHVlID0gYXJndW1lbnRzLmxlbmd0aCA+IDFcbiAgaWYgKFxuICAgIG9wdGlvbnMgIT09IG51bGwgJiZcbiAgICBvcHRpb25zICE9PSB1bmRlZmluZWQgJiZcbiAgICAoX29wdGlvbnMkc2lnbmFsMiA9IG9wdGlvbnMuc2lnbmFsKSAhPT0gbnVsbCAmJlxuICAgIF9vcHRpb25zJHNpZ25hbDIgIT09IHVuZGVmaW5lZCAmJlxuICAgIF9vcHRpb25zJHNpZ25hbDIuYWJvcnRlZFxuICApIHtcbiAgICBjb25zdCBlcnIgPSBuZXcgQWJvcnRFcnJvcih1bmRlZmluZWQsIHtcbiAgICAgIGNhdXNlOiBvcHRpb25zLnNpZ25hbC5yZWFzb25cbiAgICB9KVxuICAgIHRoaXMub25jZSgnZXJyb3InLCAoKSA9PiB7fSkgLy8gVGhlIGVycm9yIGlzIGFscmVhZHkgcHJvcGFnYXRlZFxuICAgIGF3YWl0IGZpbmlzaGVkKHRoaXMuZGVzdHJveShlcnIpKVxuICAgIHRocm93IGVyclxuICB9XG4gIGNvbnN0IGFjID0gbmV3IEFib3J0Q29udHJvbGxlcigpXG4gIGNvbnN0IHNpZ25hbCA9IGFjLnNpZ25hbFxuICBpZiAob3B0aW9ucyAhPT0gbnVsbCAmJiBvcHRpb25zICE9PSB1bmRlZmluZWQgJiYgb3B0aW9ucy5zaWduYWwpIHtcbiAgICBjb25zdCBvcHRzID0ge1xuICAgICAgb25jZTogdHJ1ZSxcbiAgICAgIFtrV2Vha0hhbmRsZXJdOiB0aGlzLFxuICAgICAgW2tSZXNpc3RTdG9wUHJvcGFnYXRpb25dOiB0cnVlXG4gICAgfVxuICAgIG9wdGlvbnMuc2lnbmFsLmFkZEV2ZW50TGlzdGVuZXIoJ2Fib3J0JywgKCkgPT4gYWMuYWJvcnQoKSwgb3B0cylcbiAgfVxuICBsZXQgZ290QW55SXRlbUZyb21TdHJlYW0gPSBmYWxzZVxuICB0cnkge1xuICAgIGZvciBhd2FpdCAoY29uc3QgdmFsdWUgb2YgdGhpcykge1xuICAgICAgdmFyIF9vcHRpb25zJHNpZ25hbDNcbiAgICAgIGdvdEFueUl0ZW1Gcm9tU3RyZWFtID0gdHJ1ZVxuICAgICAgaWYgKFxuICAgICAgICBvcHRpb25zICE9PSBudWxsICYmXG4gICAgICAgIG9wdGlvbnMgIT09IHVuZGVmaW5lZCAmJlxuICAgICAgICAoX29wdGlvbnMkc2lnbmFsMyA9IG9wdGlvbnMuc2lnbmFsKSAhPT0gbnVsbCAmJlxuICAgICAgICBfb3B0aW9ucyRzaWduYWwzICE9PSB1bmRlZmluZWQgJiZcbiAgICAgICAgX29wdGlvbnMkc2lnbmFsMy5hYm9ydGVkXG4gICAgICApIHtcbiAgICAgICAgdGhyb3cgbmV3IEFib3J0RXJyb3IoKVxuICAgICAgfVxuICAgICAgaWYgKCFoYXNJbml0aWFsVmFsdWUpIHtcbiAgICAgICAgaW5pdGlhbFZhbHVlID0gdmFsdWVcbiAgICAgICAgaGFzSW5pdGlhbFZhbHVlID0gdHJ1ZVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgaW5pdGlhbFZhbHVlID0gYXdhaXQgcmVkdWNlcihpbml0aWFsVmFsdWUsIHZhbHVlLCB7XG4gICAgICAgICAgc2lnbmFsXG4gICAgICAgIH0pXG4gICAgICB9XG4gICAgfVxuICAgIGlmICghZ290QW55SXRlbUZyb21TdHJlYW0gJiYgIWhhc0luaXRpYWxWYWx1ZSkge1xuICAgICAgdGhyb3cgbmV3IFJlZHVjZUF3YXJlRXJyTWlzc2luZ0FyZ3MoKVxuICAgIH1cbiAgfSBmaW5hbGx5IHtcbiAgICBhYy5hYm9ydCgpXG4gIH1cbiAgcmV0dXJuIGluaXRpYWxWYWx1ZVxufVxuYXN5bmMgZnVuY3Rpb24gdG9BcnJheShvcHRpb25zKSB7XG4gIGlmIChvcHRpb25zICE9IG51bGwpIHtcbiAgICB2YWxpZGF0ZU9iamVjdChvcHRpb25zLCAnb3B0aW9ucycpXG4gIH1cbiAgaWYgKChvcHRpb25zID09PSBudWxsIHx8IG9wdGlvbnMgPT09IHVuZGVmaW5lZCA/IHVuZGVmaW5lZCA6IG9wdGlvbnMuc2lnbmFsKSAhPSBudWxsKSB7XG4gICAgdmFsaWRhdGVBYm9ydFNpZ25hbChvcHRpb25zLnNpZ25hbCwgJ29wdGlvbnMuc2lnbmFsJylcbiAgfVxuICBjb25zdCByZXN1bHQgPSBbXVxuICBmb3IgYXdhaXQgKGNvbnN0IHZhbCBvZiB0aGlzKSB7XG4gICAgdmFyIF9vcHRpb25zJHNpZ25hbDRcbiAgICBpZiAoXG4gICAgICBvcHRpb25zICE9PSBudWxsICYmXG4gICAgICBvcHRpb25zICE9PSB1bmRlZmluZWQgJiZcbiAgICAgIChfb3B0aW9ucyRzaWduYWw0ID0gb3B0aW9ucy5zaWduYWwpICE9PSBudWxsICYmXG4gICAgICBfb3B0aW9ucyRzaWduYWw0ICE9PSB1bmRlZmluZWQgJiZcbiAgICAgIF9vcHRpb25zJHNpZ25hbDQuYWJvcnRlZFxuICAgICkge1xuICAgICAgdGhyb3cgbmV3IEFib3J0RXJyb3IodW5kZWZpbmVkLCB7XG4gICAgICAgIGNhdXNlOiBvcHRpb25zLnNpZ25hbC5yZWFzb25cbiAgICAgIH0pXG4gICAgfVxuICAgIEFycmF5UHJvdG90eXBlUHVzaChyZXN1bHQsIHZhbClcbiAgfVxuICByZXR1cm4gcmVzdWx0XG59XG5mdW5jdGlvbiBmbGF0TWFwKGZuLCBvcHRpb25zKSB7XG4gIGNvbnN0IHZhbHVlcyA9IG1hcC5jYWxsKHRoaXMsIGZuLCBvcHRpb25zKVxuICByZXR1cm4gYXN5bmMgZnVuY3Rpb24qIGZsYXRNYXAoKSB7XG4gICAgZm9yIGF3YWl0IChjb25zdCB2YWwgb2YgdmFsdWVzKSB7XG4gICAgICB5aWVsZCogdmFsXG4gICAgfVxuICB9LmNhbGwodGhpcylcbn1cbmZ1bmN0aW9uIHRvSW50ZWdlck9ySW5maW5pdHkobnVtYmVyKSB7XG4gIC8vIFdlIGNvZXJjZSBoZXJlIHRvIGFsaWduIHdpdGggdGhlIHNwZWNcbiAgLy8gaHR0cHM6Ly9naXRodWIuY29tL3RjMzkvcHJvcG9zYWwtaXRlcmF0b3ItaGVscGVycy9pc3N1ZXMvMTY5XG4gIG51bWJlciA9IE51bWJlcihudW1iZXIpXG4gIGlmIChOdW1iZXJJc05hTihudW1iZXIpKSB7XG4gICAgcmV0dXJuIDBcbiAgfVxuICBpZiAobnVtYmVyIDwgMCkge1xuICAgIHRocm93IG5ldyBFUlJfT1VUX09GX1JBTkdFKCdudW1iZXInLCAnPj0gMCcsIG51bWJlcilcbiAgfVxuICByZXR1cm4gbnVtYmVyXG59XG5mdW5jdGlvbiBkcm9wKG51bWJlciwgb3B0aW9ucyA9IHVuZGVmaW5lZCkge1xuICBpZiAob3B0aW9ucyAhPSBudWxsKSB7XG4gICAgdmFsaWRhdGVPYmplY3Qob3B0aW9ucywgJ29wdGlvbnMnKVxuICB9XG4gIGlmICgob3B0aW9ucyA9PT0gbnVsbCB8fCBvcHRpb25zID09PSB1bmRlZmluZWQgPyB1bmRlZmluZWQgOiBvcHRpb25zLnNpZ25hbCkgIT0gbnVsbCkge1xuICAgIHZhbGlkYXRlQWJvcnRTaWduYWwob3B0aW9ucy5zaWduYWwsICdvcHRpb25zLnNpZ25hbCcpXG4gIH1cbiAgbnVtYmVyID0gdG9JbnRlZ2VyT3JJbmZpbml0eShudW1iZXIpXG4gIHJldHVybiBhc3luYyBmdW5jdGlvbiogZHJvcCgpIHtcbiAgICB2YXIgX29wdGlvbnMkc2lnbmFsNVxuICAgIGlmIChcbiAgICAgIG9wdGlvbnMgIT09IG51bGwgJiZcbiAgICAgIG9wdGlvbnMgIT09IHVuZGVmaW5lZCAmJlxuICAgICAgKF9vcHRpb25zJHNpZ25hbDUgPSBvcHRpb25zLnNpZ25hbCkgIT09IG51bGwgJiZcbiAgICAgIF9vcHRpb25zJHNpZ25hbDUgIT09IHVuZGVmaW5lZCAmJlxuICAgICAgX29wdGlvbnMkc2lnbmFsNS5hYm9ydGVkXG4gICAgKSB7XG4gICAgICB0aHJvdyBuZXcgQWJvcnRFcnJvcigpXG4gICAgfVxuICAgIGZvciBhd2FpdCAoY29uc3QgdmFsIG9mIHRoaXMpIHtcbiAgICAgIHZhciBfb3B0aW9ucyRzaWduYWw2XG4gICAgICBpZiAoXG4gICAgICAgIG9wdGlvbnMgIT09IG51bGwgJiZcbiAgICAgICAgb3B0aW9ucyAhPT0gdW5kZWZpbmVkICYmXG4gICAgICAgIChfb3B0aW9ucyRzaWduYWw2ID0gb3B0aW9ucy5zaWduYWwpICE9PSBudWxsICYmXG4gICAgICAgIF9vcHRpb25zJHNpZ25hbDYgIT09IHVuZGVmaW5lZCAmJlxuICAgICAgICBfb3B0aW9ucyRzaWduYWw2LmFib3J0ZWRcbiAgICAgICkge1xuICAgICAgICB0aHJvdyBuZXcgQWJvcnRFcnJvcigpXG4gICAgICB9XG4gICAgICBpZiAobnVtYmVyLS0gPD0gMCkge1xuICAgICAgICB5aWVsZCB2YWxcbiAgICAgIH1cbiAgICB9XG4gIH0uY2FsbCh0aGlzKVxufVxuZnVuY3Rpb24gdGFrZShudW1iZXIsIG9wdGlvbnMgPSB1bmRlZmluZWQpIHtcbiAgaWYgKG9wdGlvbnMgIT0gbnVsbCkge1xuICAgIHZhbGlkYXRlT2JqZWN0KG9wdGlvbnMsICdvcHRpb25zJylcbiAgfVxuICBpZiAoKG9wdGlvbnMgPT09IG51bGwgfHwgb3B0aW9ucyA9PT0gdW5kZWZpbmVkID8gdW5kZWZpbmVkIDogb3B0aW9ucy5zaWduYWwpICE9IG51bGwpIHtcbiAgICB2YWxpZGF0ZUFib3J0U2lnbmFsKG9wdGlvbnMuc2lnbmFsLCAnb3B0aW9ucy5zaWduYWwnKVxuICB9XG4gIG51bWJlciA9IHRvSW50ZWdlck9ySW5maW5pdHkobnVtYmVyKVxuICByZXR1cm4gYXN5bmMgZnVuY3Rpb24qIHRha2UoKSB7XG4gICAgdmFyIF9vcHRpb25zJHNpZ25hbDdcbiAgICBpZiAoXG4gICAgICBvcHRpb25zICE9PSBudWxsICYmXG4gICAgICBvcHRpb25zICE9PSB1bmRlZmluZWQgJiZcbiAgICAgIChfb3B0aW9ucyRzaWduYWw3ID0gb3B0aW9ucy5zaWduYWwpICE9PSBudWxsICYmXG4gICAgICBfb3B0aW9ucyRzaWduYWw3ICE9PSB1bmRlZmluZWQgJiZcbiAgICAgIF9vcHRpb25zJHNpZ25hbDcuYWJvcnRlZFxuICAgICkge1xuICAgICAgdGhyb3cgbmV3IEFib3J0RXJyb3IoKVxuICAgIH1cbiAgICBmb3IgYXdhaXQgKGNvbnN0IHZhbCBvZiB0aGlzKSB7XG4gICAgICB2YXIgX29wdGlvbnMkc2lnbmFsOFxuICAgICAgaWYgKFxuICAgICAgICBvcHRpb25zICE9PSBudWxsICYmXG4gICAgICAgIG9wdGlvbnMgIT09IHVuZGVmaW5lZCAmJlxuICAgICAgICAoX29wdGlvbnMkc2lnbmFsOCA9IG9wdGlvbnMuc2lnbmFsKSAhPT0gbnVsbCAmJlxuICAgICAgICBfb3B0aW9ucyRzaWduYWw4ICE9PSB1bmRlZmluZWQgJiZcbiAgICAgICAgX29wdGlvbnMkc2lnbmFsOC5hYm9ydGVkXG4gICAgICApIHtcbiAgICAgICAgdGhyb3cgbmV3IEFib3J0RXJyb3IoKVxuICAgICAgfVxuICAgICAgaWYgKG51bWJlci0tID4gMCkge1xuICAgICAgICB5aWVsZCB2YWxcbiAgICAgIH1cblxuICAgICAgLy8gRG9uJ3QgZ2V0IGFub3RoZXIgaXRlbSBmcm9tIGl0ZXJhdG9yIGluIGNhc2Ugd2UgcmVhY2hlZCB0aGUgZW5kXG4gICAgICBpZiAobnVtYmVyIDw9IDApIHtcbiAgICAgICAgcmV0dXJuXG4gICAgICB9XG4gICAgfVxuICB9LmNhbGwodGhpcylcbn1cbm1vZHVsZS5leHBvcnRzLnN0cmVhbVJldHVybmluZ09wZXJhdG9ycyA9IHtcbiAgYXNJbmRleGVkUGFpcnM6IGRlcHJlY2F0ZShhc0luZGV4ZWRQYWlycywgJ3JlYWRhYmxlLmFzSW5kZXhlZFBhaXJzIHdpbGwgYmUgcmVtb3ZlZCBpbiBhIGZ1dHVyZSB2ZXJzaW9uLicpLFxuICBkcm9wLFxuICBmaWx0ZXIsXG4gIGZsYXRNYXAsXG4gIG1hcCxcbiAgdGFrZSxcbiAgY29tcG9zZVxufVxubW9kdWxlLmV4cG9ydHMucHJvbWlzZVJldHVybmluZ09wZXJhdG9ycyA9IHtcbiAgZXZlcnksXG4gIGZvckVhY2gsXG4gIHJlZHVjZSxcbiAgdG9BcnJheSxcbiAgc29tZSxcbiAgZmluZFxufVxuIiwKICAgICIndXNlIHN0cmljdCdcblxuY29uc3QgeyBBcnJheVByb3RvdHlwZVBvcCwgUHJvbWlzZSB9ID0gcmVxdWlyZSgnLi4vb3Vycy9wcmltb3JkaWFscycpXG5jb25zdCB7IGlzSXRlcmFibGUsIGlzTm9kZVN0cmVhbSwgaXNXZWJTdHJlYW0gfSA9IHJlcXVpcmUoJy4uL2ludGVybmFsL3N0cmVhbXMvdXRpbHMnKVxuY29uc3QgeyBwaXBlbGluZUltcGw6IHBsIH0gPSByZXF1aXJlKCcuLi9pbnRlcm5hbC9zdHJlYW1zL3BpcGVsaW5lJylcbmNvbnN0IHsgZmluaXNoZWQgfSA9IHJlcXVpcmUoJy4uL2ludGVybmFsL3N0cmVhbXMvZW5kLW9mLXN0cmVhbScpXG5yZXF1aXJlKCcuLi8uLi9saWIvc3RyZWFtLmpzJylcbmZ1bmN0aW9uIHBpcGVsaW5lKC4uLnN0cmVhbXMpIHtcbiAgcmV0dXJuIG5ldyBQcm9taXNlKChyZXNvbHZlLCByZWplY3QpID0+IHtcbiAgICBsZXQgc2lnbmFsXG4gICAgbGV0IGVuZFxuICAgIGNvbnN0IGxhc3RBcmcgPSBzdHJlYW1zW3N0cmVhbXMubGVuZ3RoIC0gMV1cbiAgICBpZiAoXG4gICAgICBsYXN0QXJnICYmXG4gICAgICB0eXBlb2YgbGFzdEFyZyA9PT0gJ29iamVjdCcgJiZcbiAgICAgICFpc05vZGVTdHJlYW0obGFzdEFyZykgJiZcbiAgICAgICFpc0l0ZXJhYmxlKGxhc3RBcmcpICYmXG4gICAgICAhaXNXZWJTdHJlYW0obGFzdEFyZylcbiAgICApIHtcbiAgICAgIGNvbnN0IG9wdGlvbnMgPSBBcnJheVByb3RvdHlwZVBvcChzdHJlYW1zKVxuICAgICAgc2lnbmFsID0gb3B0aW9ucy5zaWduYWxcbiAgICAgIGVuZCA9IG9wdGlvbnMuZW5kXG4gICAgfVxuICAgIHBsKFxuICAgICAgc3RyZWFtcyxcbiAgICAgIChlcnIsIHZhbHVlKSA9PiB7XG4gICAgICAgIGlmIChlcnIpIHtcbiAgICAgICAgICByZWplY3QoZXJyKVxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHJlc29sdmUodmFsdWUpXG4gICAgICAgIH1cbiAgICAgIH0sXG4gICAgICB7XG4gICAgICAgIHNpZ25hbCxcbiAgICAgICAgZW5kXG4gICAgICB9XG4gICAgKVxuICB9KVxufVxubW9kdWxlLmV4cG9ydHMgPSB7XG4gIGZpbmlzaGVkLFxuICBwaXBlbGluZVxufVxuIiwKICAgICIvKiByZXBsYWNlbWVudCBzdGFydCAqL1xuXG5jb25zdCB7IEJ1ZmZlciB9ID0gcmVxdWlyZSgnYnVmZmVyJylcblxuLyogcmVwbGFjZW1lbnQgZW5kICovXG4vLyBDb3B5cmlnaHQgSm95ZW50LCBJbmMuIGFuZCBvdGhlciBOb2RlIGNvbnRyaWJ1dG9ycy5cbi8vXG4vLyBQZXJtaXNzaW9uIGlzIGhlcmVieSBncmFudGVkLCBmcmVlIG9mIGNoYXJnZSwgdG8gYW55IHBlcnNvbiBvYnRhaW5pbmcgYVxuLy8gY29weSBvZiB0aGlzIHNvZnR3YXJlIGFuZCBhc3NvY2lhdGVkIGRvY3VtZW50YXRpb24gZmlsZXMgKHRoZVxuLy8gXCJTb2Z0d2FyZVwiKSwgdG8gZGVhbCBpbiB0aGUgU29mdHdhcmUgd2l0aG91dCByZXN0cmljdGlvbiwgaW5jbHVkaW5nXG4vLyB3aXRob3V0IGxpbWl0YXRpb24gdGhlIHJpZ2h0cyB0byB1c2UsIGNvcHksIG1vZGlmeSwgbWVyZ2UsIHB1Ymxpc2gsXG4vLyBkaXN0cmlidXRlLCBzdWJsaWNlbnNlLCBhbmQvb3Igc2VsbCBjb3BpZXMgb2YgdGhlIFNvZnR3YXJlLCBhbmQgdG8gcGVybWl0XG4vLyBwZXJzb25zIHRvIHdob20gdGhlIFNvZnR3YXJlIGlzIGZ1cm5pc2hlZCB0byBkbyBzbywgc3ViamVjdCB0byB0aGVcbi8vIGZvbGxvd2luZyBjb25kaXRpb25zOlxuLy9cbi8vIFRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIHNoYWxsIGJlIGluY2x1ZGVkXG4vLyBpbiBhbGwgY29waWVzIG9yIHN1YnN0YW50aWFsIHBvcnRpb25zIG9mIHRoZSBTb2Z0d2FyZS5cbi8vXG4vLyBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgXCJBUyBJU1wiLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBFWFBSRVNTXG4vLyBPUiBJTVBMSUVELCBJTkNMVURJTkcgQlVUIE5PVCBMSU1JVEVEIFRPIFRIRSBXQVJSQU5USUVTIE9GXG4vLyBNRVJDSEFOVEFCSUxJVFksIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFORCBOT05JTkZSSU5HRU1FTlQuIElOXG4vLyBOTyBFVkVOVCBTSEFMTCBUSEUgQVVUSE9SUyBPUiBDT1BZUklHSFQgSE9MREVSUyBCRSBMSUFCTEUgRk9SIEFOWSBDTEFJTSxcbi8vIERBTUFHRVMgT1IgT1RIRVIgTElBQklMSVRZLCBXSEVUSEVSIElOIEFOIEFDVElPTiBPRiBDT05UUkFDVCwgVE9SVCBPUlxuLy8gT1RIRVJXSVNFLCBBUklTSU5HIEZST00sIE9VVCBPRiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFNPRlRXQVJFIE9SIFRIRVxuLy8gVVNFIE9SIE9USEVSIERFQUxJTkdTIElOIFRIRSBTT0ZUV0FSRS5cblxuOygndXNlIHN0cmljdCcpXG5jb25zdCB7IE9iamVjdERlZmluZVByb3BlcnR5LCBPYmplY3RLZXlzLCBSZWZsZWN0QXBwbHkgfSA9IHJlcXVpcmUoJy4vb3Vycy9wcmltb3JkaWFscycpXG5jb25zdCB7XG4gIHByb21pc2lmeTogeyBjdXN0b206IGN1c3RvbVByb21pc2lmeSB9XG59ID0gcmVxdWlyZSgnLi9vdXJzL3V0aWwnKVxuY29uc3QgeyBzdHJlYW1SZXR1cm5pbmdPcGVyYXRvcnMsIHByb21pc2VSZXR1cm5pbmdPcGVyYXRvcnMgfSA9IHJlcXVpcmUoJy4vaW50ZXJuYWwvc3RyZWFtcy9vcGVyYXRvcnMnKVxuY29uc3Qge1xuICBjb2RlczogeyBFUlJfSUxMRUdBTF9DT05TVFJVQ1RPUiB9XG59ID0gcmVxdWlyZSgnLi9vdXJzL2Vycm9ycycpXG5jb25zdCBjb21wb3NlID0gcmVxdWlyZSgnLi9pbnRlcm5hbC9zdHJlYW1zL2NvbXBvc2UnKVxuY29uc3QgeyBzZXREZWZhdWx0SGlnaFdhdGVyTWFyaywgZ2V0RGVmYXVsdEhpZ2hXYXRlck1hcmsgfSA9IHJlcXVpcmUoJy4vaW50ZXJuYWwvc3RyZWFtcy9zdGF0ZScpXG5jb25zdCB7IHBpcGVsaW5lIH0gPSByZXF1aXJlKCcuL2ludGVybmFsL3N0cmVhbXMvcGlwZWxpbmUnKVxuY29uc3QgeyBkZXN0cm95ZXIgfSA9IHJlcXVpcmUoJy4vaW50ZXJuYWwvc3RyZWFtcy9kZXN0cm95JylcbmNvbnN0IGVvcyA9IHJlcXVpcmUoJy4vaW50ZXJuYWwvc3RyZWFtcy9lbmQtb2Ytc3RyZWFtJylcbmNvbnN0IGludGVybmFsQnVmZmVyID0ge31cbmNvbnN0IHByb21pc2VzID0gcmVxdWlyZSgnLi9zdHJlYW0vcHJvbWlzZXMnKVxuY29uc3QgdXRpbHMgPSByZXF1aXJlKCcuL2ludGVybmFsL3N0cmVhbXMvdXRpbHMnKVxuY29uc3QgU3RyZWFtID0gKG1vZHVsZS5leHBvcnRzID0gcmVxdWlyZSgnLi9pbnRlcm5hbC9zdHJlYW1zL2xlZ2FjeScpLlN0cmVhbSlcblN0cmVhbS5pc0Rlc3Ryb3llZCA9IHV0aWxzLmlzRGVzdHJveWVkXG5TdHJlYW0uaXNEaXN0dXJiZWQgPSB1dGlscy5pc0Rpc3R1cmJlZFxuU3RyZWFtLmlzRXJyb3JlZCA9IHV0aWxzLmlzRXJyb3JlZFxuU3RyZWFtLmlzUmVhZGFibGUgPSB1dGlscy5pc1JlYWRhYmxlXG5TdHJlYW0uaXNXcml0YWJsZSA9IHV0aWxzLmlzV3JpdGFibGVcblN0cmVhbS5SZWFkYWJsZSA9IHJlcXVpcmUoJy4vaW50ZXJuYWwvc3RyZWFtcy9yZWFkYWJsZScpXG5mb3IgKGNvbnN0IGtleSBvZiBPYmplY3RLZXlzKHN0cmVhbVJldHVybmluZ09wZXJhdG9ycykpIHtcbiAgY29uc3Qgb3AgPSBzdHJlYW1SZXR1cm5pbmdPcGVyYXRvcnNba2V5XVxuICBmdW5jdGlvbiBmbiguLi5hcmdzKSB7XG4gICAgaWYgKG5ldy50YXJnZXQpIHtcbiAgICAgIHRocm93IEVSUl9JTExFR0FMX0NPTlNUUlVDVE9SKClcbiAgICB9XG4gICAgcmV0dXJuIFN0cmVhbS5SZWFkYWJsZS5mcm9tKFJlZmxlY3RBcHBseShvcCwgdGhpcywgYXJncykpXG4gIH1cbiAgT2JqZWN0RGVmaW5lUHJvcGVydHkoZm4sICduYW1lJywge1xuICAgIF9fcHJvdG9fXzogbnVsbCxcbiAgICB2YWx1ZTogb3AubmFtZVxuICB9KVxuICBPYmplY3REZWZpbmVQcm9wZXJ0eShmbiwgJ2xlbmd0aCcsIHtcbiAgICBfX3Byb3RvX186IG51bGwsXG4gICAgdmFsdWU6IG9wLmxlbmd0aFxuICB9KVxuICBPYmplY3REZWZpbmVQcm9wZXJ0eShTdHJlYW0uUmVhZGFibGUucHJvdG90eXBlLCBrZXksIHtcbiAgICBfX3Byb3RvX186IG51bGwsXG4gICAgdmFsdWU6IGZuLFxuICAgIGVudW1lcmFibGU6IGZhbHNlLFxuICAgIGNvbmZpZ3VyYWJsZTogdHJ1ZSxcbiAgICB3cml0YWJsZTogdHJ1ZVxuICB9KVxufVxuZm9yIChjb25zdCBrZXkgb2YgT2JqZWN0S2V5cyhwcm9taXNlUmV0dXJuaW5nT3BlcmF0b3JzKSkge1xuICBjb25zdCBvcCA9IHByb21pc2VSZXR1cm5pbmdPcGVyYXRvcnNba2V5XVxuICBmdW5jdGlvbiBmbiguLi5hcmdzKSB7XG4gICAgaWYgKG5ldy50YXJnZXQpIHtcbiAgICAgIHRocm93IEVSUl9JTExFR0FMX0NPTlNUUlVDVE9SKClcbiAgICB9XG4gICAgcmV0dXJuIFJlZmxlY3RBcHBseShvcCwgdGhpcywgYXJncylcbiAgfVxuICBPYmplY3REZWZpbmVQcm9wZXJ0eShmbiwgJ25hbWUnLCB7XG4gICAgX19wcm90b19fOiBudWxsLFxuICAgIHZhbHVlOiBvcC5uYW1lXG4gIH0pXG4gIE9iamVjdERlZmluZVByb3BlcnR5KGZuLCAnbGVuZ3RoJywge1xuICAgIF9fcHJvdG9fXzogbnVsbCxcbiAgICB2YWx1ZTogb3AubGVuZ3RoXG4gIH0pXG4gIE9iamVjdERlZmluZVByb3BlcnR5KFN0cmVhbS5SZWFkYWJsZS5wcm90b3R5cGUsIGtleSwge1xuICAgIF9fcHJvdG9fXzogbnVsbCxcbiAgICB2YWx1ZTogZm4sXG4gICAgZW51bWVyYWJsZTogZmFsc2UsXG4gICAgY29uZmlndXJhYmxlOiB0cnVlLFxuICAgIHdyaXRhYmxlOiB0cnVlXG4gIH0pXG59XG5TdHJlYW0uV3JpdGFibGUgPSByZXF1aXJlKCcuL2ludGVybmFsL3N0cmVhbXMvd3JpdGFibGUnKVxuU3RyZWFtLkR1cGxleCA9IHJlcXVpcmUoJy4vaW50ZXJuYWwvc3RyZWFtcy9kdXBsZXgnKVxuU3RyZWFtLlRyYW5zZm9ybSA9IHJlcXVpcmUoJy4vaW50ZXJuYWwvc3RyZWFtcy90cmFuc2Zvcm0nKVxuU3RyZWFtLlBhc3NUaHJvdWdoID0gcmVxdWlyZSgnLi9pbnRlcm5hbC9zdHJlYW1zL3Bhc3N0aHJvdWdoJylcblN0cmVhbS5waXBlbGluZSA9IHBpcGVsaW5lXG5jb25zdCB7IGFkZEFib3J0U2lnbmFsIH0gPSByZXF1aXJlKCcuL2ludGVybmFsL3N0cmVhbXMvYWRkLWFib3J0LXNpZ25hbCcpXG5TdHJlYW0uYWRkQWJvcnRTaWduYWwgPSBhZGRBYm9ydFNpZ25hbFxuU3RyZWFtLmZpbmlzaGVkID0gZW9zXG5TdHJlYW0uZGVzdHJveSA9IGRlc3Ryb3llclxuU3RyZWFtLmNvbXBvc2UgPSBjb21wb3NlXG5TdHJlYW0uc2V0RGVmYXVsdEhpZ2hXYXRlck1hcmsgPSBzZXREZWZhdWx0SGlnaFdhdGVyTWFya1xuU3RyZWFtLmdldERlZmF1bHRIaWdoV2F0ZXJNYXJrID0gZ2V0RGVmYXVsdEhpZ2hXYXRlck1hcmtcbk9iamVjdERlZmluZVByb3BlcnR5KFN0cmVhbSwgJ3Byb21pc2VzJywge1xuICBfX3Byb3RvX186IG51bGwsXG4gIGNvbmZpZ3VyYWJsZTogdHJ1ZSxcbiAgZW51bWVyYWJsZTogdHJ1ZSxcbiAgZ2V0KCkge1xuICAgIHJldHVybiBwcm9taXNlc1xuICB9XG59KVxuT2JqZWN0RGVmaW5lUHJvcGVydHkocGlwZWxpbmUsIGN1c3RvbVByb21pc2lmeSwge1xuICBfX3Byb3RvX186IG51bGwsXG4gIGVudW1lcmFibGU6IHRydWUsXG4gIGdldCgpIHtcbiAgICByZXR1cm4gcHJvbWlzZXMucGlwZWxpbmVcbiAgfVxufSlcbk9iamVjdERlZmluZVByb3BlcnR5KGVvcywgY3VzdG9tUHJvbWlzaWZ5LCB7XG4gIF9fcHJvdG9fXzogbnVsbCxcbiAgZW51bWVyYWJsZTogdHJ1ZSxcbiAgZ2V0KCkge1xuICAgIHJldHVybiBwcm9taXNlcy5maW5pc2hlZFxuICB9XG59KVxuXG4vLyBCYWNrd2FyZHMtY29tcGF0IHdpdGggbm9kZSAwLjQueFxuU3RyZWFtLlN0cmVhbSA9IFN0cmVhbVxuU3RyZWFtLl9pc1VpbnQ4QXJyYXkgPSBmdW5jdGlvbiBpc1VpbnQ4QXJyYXkodmFsdWUpIHtcbiAgcmV0dXJuIHZhbHVlIGluc3RhbmNlb2YgVWludDhBcnJheVxufVxuU3RyZWFtLl91aW50OEFycmF5VG9CdWZmZXIgPSBmdW5jdGlvbiBfdWludDhBcnJheVRvQnVmZmVyKGNodW5rKSB7XG4gIHJldHVybiBCdWZmZXIuZnJvbShjaHVuay5idWZmZXIsIGNodW5rLmJ5dGVPZmZzZXQsIGNodW5rLmJ5dGVMZW5ndGgpXG59XG4iLAogICAgIid1c2Ugc3RyaWN0J1xuXG5jb25zdCBTdHJlYW0gPSByZXF1aXJlKCdzdHJlYW0nKVxuaWYgKFN0cmVhbSAmJiBwcm9jZXNzLmVudi5SRUFEQUJMRV9TVFJFQU0gPT09ICdkaXNhYmxlJykge1xuICBjb25zdCBwcm9taXNlcyA9IFN0cmVhbS5wcm9taXNlc1xuXG4gIC8vIEV4cGxpY2l0IGV4cG9ydCBuYW1pbmcgaXMgbmVlZGVkIGZvciBFU01cbiAgbW9kdWxlLmV4cG9ydHMuX3VpbnQ4QXJyYXlUb0J1ZmZlciA9IFN0cmVhbS5fdWludDhBcnJheVRvQnVmZmVyXG4gIG1vZHVsZS5leHBvcnRzLl9pc1VpbnQ4QXJyYXkgPSBTdHJlYW0uX2lzVWludDhBcnJheVxuICBtb2R1bGUuZXhwb3J0cy5pc0Rpc3R1cmJlZCA9IFN0cmVhbS5pc0Rpc3R1cmJlZFxuICBtb2R1bGUuZXhwb3J0cy5pc0Vycm9yZWQgPSBTdHJlYW0uaXNFcnJvcmVkXG4gIG1vZHVsZS5leHBvcnRzLmlzUmVhZGFibGUgPSBTdHJlYW0uaXNSZWFkYWJsZVxuICBtb2R1bGUuZXhwb3J0cy5SZWFkYWJsZSA9IFN0cmVhbS5SZWFkYWJsZVxuICBtb2R1bGUuZXhwb3J0cy5Xcml0YWJsZSA9IFN0cmVhbS5Xcml0YWJsZVxuICBtb2R1bGUuZXhwb3J0cy5EdXBsZXggPSBTdHJlYW0uRHVwbGV4XG4gIG1vZHVsZS5leHBvcnRzLlRyYW5zZm9ybSA9IFN0cmVhbS5UcmFuc2Zvcm1cbiAgbW9kdWxlLmV4cG9ydHMuUGFzc1Rocm91Z2ggPSBTdHJlYW0uUGFzc1Rocm91Z2hcbiAgbW9kdWxlLmV4cG9ydHMuYWRkQWJvcnRTaWduYWwgPSBTdHJlYW0uYWRkQWJvcnRTaWduYWxcbiAgbW9kdWxlLmV4cG9ydHMuZmluaXNoZWQgPSBTdHJlYW0uZmluaXNoZWRcbiAgbW9kdWxlLmV4cG9ydHMuZGVzdHJveSA9IFN0cmVhbS5kZXN0cm95XG4gIG1vZHVsZS5leHBvcnRzLnBpcGVsaW5lID0gU3RyZWFtLnBpcGVsaW5lXG4gIG1vZHVsZS5leHBvcnRzLmNvbXBvc2UgPSBTdHJlYW0uY29tcG9zZVxuICBPYmplY3QuZGVmaW5lUHJvcGVydHkoU3RyZWFtLCAncHJvbWlzZXMnLCB7XG4gICAgY29uZmlndXJhYmxlOiB0cnVlLFxuICAgIGVudW1lcmFibGU6IHRydWUsXG4gICAgZ2V0KCkge1xuICAgICAgcmV0dXJuIHByb21pc2VzXG4gICAgfVxuICB9KVxuICBtb2R1bGUuZXhwb3J0cy5TdHJlYW0gPSBTdHJlYW0uU3RyZWFtXG59IGVsc2Uge1xuICBjb25zdCBDdXN0b21TdHJlYW0gPSByZXF1aXJlKCcuLi9zdHJlYW0nKVxuICBjb25zdCBwcm9taXNlcyA9IHJlcXVpcmUoJy4uL3N0cmVhbS9wcm9taXNlcycpXG4gIGNvbnN0IG9yaWdpbmFsRGVzdHJveSA9IEN1c3RvbVN0cmVhbS5SZWFkYWJsZS5kZXN0cm95XG4gIG1vZHVsZS5leHBvcnRzID0gQ3VzdG9tU3RyZWFtLlJlYWRhYmxlXG5cbiAgLy8gRXhwbGljaXQgZXhwb3J0IG5hbWluZyBpcyBuZWVkZWQgZm9yIEVTTVxuICBtb2R1bGUuZXhwb3J0cy5fdWludDhBcnJheVRvQnVmZmVyID0gQ3VzdG9tU3RyZWFtLl91aW50OEFycmF5VG9CdWZmZXJcbiAgbW9kdWxlLmV4cG9ydHMuX2lzVWludDhBcnJheSA9IEN1c3RvbVN0cmVhbS5faXNVaW50OEFycmF5XG4gIG1vZHVsZS5leHBvcnRzLmlzRGlzdHVyYmVkID0gQ3VzdG9tU3RyZWFtLmlzRGlzdHVyYmVkXG4gIG1vZHVsZS5leHBvcnRzLmlzRXJyb3JlZCA9IEN1c3RvbVN0cmVhbS5pc0Vycm9yZWRcbiAgbW9kdWxlLmV4cG9ydHMuaXNSZWFkYWJsZSA9IEN1c3RvbVN0cmVhbS5pc1JlYWRhYmxlXG4gIG1vZHVsZS5leHBvcnRzLlJlYWRhYmxlID0gQ3VzdG9tU3RyZWFtLlJlYWRhYmxlXG4gIG1vZHVsZS5leHBvcnRzLldyaXRhYmxlID0gQ3VzdG9tU3RyZWFtLldyaXRhYmxlXG4gIG1vZHVsZS5leHBvcnRzLkR1cGxleCA9IEN1c3RvbVN0cmVhbS5EdXBsZXhcbiAgbW9kdWxlLmV4cG9ydHMuVHJhbnNmb3JtID0gQ3VzdG9tU3RyZWFtLlRyYW5zZm9ybVxuICBtb2R1bGUuZXhwb3J0cy5QYXNzVGhyb3VnaCA9IEN1c3RvbVN0cmVhbS5QYXNzVGhyb3VnaFxuICBtb2R1bGUuZXhwb3J0cy5hZGRBYm9ydFNpZ25hbCA9IEN1c3RvbVN0cmVhbS5hZGRBYm9ydFNpZ25hbFxuICBtb2R1bGUuZXhwb3J0cy5maW5pc2hlZCA9IEN1c3RvbVN0cmVhbS5maW5pc2hlZFxuICBtb2R1bGUuZXhwb3J0cy5kZXN0cm95ID0gQ3VzdG9tU3RyZWFtLmRlc3Ryb3lcbiAgbW9kdWxlLmV4cG9ydHMuZGVzdHJveSA9IG9yaWdpbmFsRGVzdHJveVxuICBtb2R1bGUuZXhwb3J0cy5waXBlbGluZSA9IEN1c3RvbVN0cmVhbS5waXBlbGluZVxuICBtb2R1bGUuZXhwb3J0cy5jb21wb3NlID0gQ3VzdG9tU3RyZWFtLmNvbXBvc2VcbiAgT2JqZWN0LmRlZmluZVByb3BlcnR5KEN1c3RvbVN0cmVhbSwgJ3Byb21pc2VzJywge1xuICAgIGNvbmZpZ3VyYWJsZTogdHJ1ZSxcbiAgICBlbnVtZXJhYmxlOiB0cnVlLFxuICAgIGdldCgpIHtcbiAgICAgIHJldHVybiBwcm9taXNlc1xuICAgIH1cbiAgfSlcbiAgbW9kdWxlLmV4cG9ydHMuU3RyZWFtID0gQ3VzdG9tU3RyZWFtLlN0cmVhbVxufVxuXG4vLyBBbGxvdyBkZWZhdWx0IGltcG9ydGluZ1xubW9kdWxlLmV4cG9ydHMuZGVmYXVsdCA9IG1vZHVsZS5leHBvcnRzXG4iLAogICAgIi8qKlxuICogQXBwZW5kcyB0aGUgZWxlbWVudHMgb2YgYHZhbHVlc2AgdG8gYGFycmF5YC5cbiAqXG4gKiBAcHJpdmF0ZVxuICogQHBhcmFtIHtBcnJheX0gYXJyYXkgVGhlIGFycmF5IHRvIG1vZGlmeS5cbiAqIEBwYXJhbSB7QXJyYXl9IHZhbHVlcyBUaGUgdmFsdWVzIHRvIGFwcGVuZC5cbiAqIEByZXR1cm5zIHtBcnJheX0gUmV0dXJucyBgYXJyYXlgLlxuICovXG5mdW5jdGlvbiBhcnJheVB1c2goYXJyYXksIHZhbHVlcykge1xuICB2YXIgaW5kZXggPSAtMSxcbiAgICAgIGxlbmd0aCA9IHZhbHVlcy5sZW5ndGgsXG4gICAgICBvZmZzZXQgPSBhcnJheS5sZW5ndGg7XG5cbiAgd2hpbGUgKCsraW5kZXggPCBsZW5ndGgpIHtcbiAgICBhcnJheVtvZmZzZXQgKyBpbmRleF0gPSB2YWx1ZXNbaW5kZXhdO1xuICB9XG4gIHJldHVybiBhcnJheTtcbn1cblxubW9kdWxlLmV4cG9ydHMgPSBhcnJheVB1c2g7XG4iLAogICAgInZhciBTeW1ib2wgPSByZXF1aXJlKCcuL19TeW1ib2wnKSxcbiAgICBpc0FyZ3VtZW50cyA9IHJlcXVpcmUoJy4vaXNBcmd1bWVudHMnKSxcbiAgICBpc0FycmF5ID0gcmVxdWlyZSgnLi9pc0FycmF5Jyk7XG5cbi8qKiBCdWlsdC1pbiB2YWx1ZSByZWZlcmVuY2VzLiAqL1xudmFyIHNwcmVhZGFibGVTeW1ib2wgPSBTeW1ib2wgPyBTeW1ib2wuaXNDb25jYXRTcHJlYWRhYmxlIDogdW5kZWZpbmVkO1xuXG4vKipcbiAqIENoZWNrcyBpZiBgdmFsdWVgIGlzIGEgZmxhdHRlbmFibGUgYGFyZ3VtZW50c2Agb2JqZWN0IG9yIGFycmF5LlxuICpcbiAqIEBwcml2YXRlXG4gKiBAcGFyYW0geyp9IHZhbHVlIFRoZSB2YWx1ZSB0byBjaGVjay5cbiAqIEByZXR1cm5zIHtib29sZWFufSBSZXR1cm5zIGB0cnVlYCBpZiBgdmFsdWVgIGlzIGZsYXR0ZW5hYmxlLCBlbHNlIGBmYWxzZWAuXG4gKi9cbmZ1bmN0aW9uIGlzRmxhdHRlbmFibGUodmFsdWUpIHtcbiAgcmV0dXJuIGlzQXJyYXkodmFsdWUpIHx8IGlzQXJndW1lbnRzKHZhbHVlKSB8fFxuICAgICEhKHNwcmVhZGFibGVTeW1ib2wgJiYgdmFsdWUgJiYgdmFsdWVbc3ByZWFkYWJsZVN5bWJvbF0pO1xufVxuXG5tb2R1bGUuZXhwb3J0cyA9IGlzRmxhdHRlbmFibGU7XG4iLAogICAgInZhciBhcnJheVB1c2ggPSByZXF1aXJlKCcuL19hcnJheVB1c2gnKSxcbiAgICBpc0ZsYXR0ZW5hYmxlID0gcmVxdWlyZSgnLi9faXNGbGF0dGVuYWJsZScpO1xuXG4vKipcbiAqIFRoZSBiYXNlIGltcGxlbWVudGF0aW9uIG9mIGBfLmZsYXR0ZW5gIHdpdGggc3VwcG9ydCBmb3IgcmVzdHJpY3RpbmcgZmxhdHRlbmluZy5cbiAqXG4gKiBAcHJpdmF0ZVxuICogQHBhcmFtIHtBcnJheX0gYXJyYXkgVGhlIGFycmF5IHRvIGZsYXR0ZW4uXG4gKiBAcGFyYW0ge251bWJlcn0gZGVwdGggVGhlIG1heGltdW0gcmVjdXJzaW9uIGRlcHRoLlxuICogQHBhcmFtIHtib29sZWFufSBbcHJlZGljYXRlPWlzRmxhdHRlbmFibGVdIFRoZSBmdW5jdGlvbiBpbnZva2VkIHBlciBpdGVyYXRpb24uXG4gKiBAcGFyYW0ge2Jvb2xlYW59IFtpc1N0cmljdF0gUmVzdHJpY3QgdG8gdmFsdWVzIHRoYXQgcGFzcyBgcHJlZGljYXRlYCBjaGVja3MuXG4gKiBAcGFyYW0ge0FycmF5fSBbcmVzdWx0PVtdXSBUaGUgaW5pdGlhbCByZXN1bHQgdmFsdWUuXG4gKiBAcmV0dXJucyB7QXJyYXl9IFJldHVybnMgdGhlIG5ldyBmbGF0dGVuZWQgYXJyYXkuXG4gKi9cbmZ1bmN0aW9uIGJhc2VGbGF0dGVuKGFycmF5LCBkZXB0aCwgcHJlZGljYXRlLCBpc1N0cmljdCwgcmVzdWx0KSB7XG4gIHZhciBpbmRleCA9IC0xLFxuICAgICAgbGVuZ3RoID0gYXJyYXkubGVuZ3RoO1xuXG4gIHByZWRpY2F0ZSB8fCAocHJlZGljYXRlID0gaXNGbGF0dGVuYWJsZSk7XG4gIHJlc3VsdCB8fCAocmVzdWx0ID0gW10pO1xuXG4gIHdoaWxlICgrK2luZGV4IDwgbGVuZ3RoKSB7XG4gICAgdmFyIHZhbHVlID0gYXJyYXlbaW5kZXhdO1xuICAgIGlmIChkZXB0aCA+IDAgJiYgcHJlZGljYXRlKHZhbHVlKSkge1xuICAgICAgaWYgKGRlcHRoID4gMSkge1xuICAgICAgICAvLyBSZWN1cnNpdmVseSBmbGF0dGVuIGFycmF5cyAoc3VzY2VwdGlibGUgdG8gY2FsbCBzdGFjayBsaW1pdHMpLlxuICAgICAgICBiYXNlRmxhdHRlbih2YWx1ZSwgZGVwdGggLSAxLCBwcmVkaWNhdGUsIGlzU3RyaWN0LCByZXN1bHQpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgYXJyYXlQdXNoKHJlc3VsdCwgdmFsdWUpO1xuICAgICAgfVxuICAgIH0gZWxzZSBpZiAoIWlzU3RyaWN0KSB7XG4gICAgICByZXN1bHRbcmVzdWx0Lmxlbmd0aF0gPSB2YWx1ZTtcbiAgICB9XG4gIH1cbiAgcmV0dXJuIHJlc3VsdDtcbn1cblxubW9kdWxlLmV4cG9ydHMgPSBiYXNlRmxhdHRlbjtcbiIsCiAgICAidmFyIGJhc2VGbGF0dGVuID0gcmVxdWlyZSgnLi9fYmFzZUZsYXR0ZW4nKTtcblxuLyoqXG4gKiBGbGF0dGVucyBgYXJyYXlgIGEgc2luZ2xlIGxldmVsIGRlZXAuXG4gKlxuICogQHN0YXRpY1xuICogQG1lbWJlck9mIF9cbiAqIEBzaW5jZSAwLjEuMFxuICogQGNhdGVnb3J5IEFycmF5XG4gKiBAcGFyYW0ge0FycmF5fSBhcnJheSBUaGUgYXJyYXkgdG8gZmxhdHRlbi5cbiAqIEByZXR1cm5zIHtBcnJheX0gUmV0dXJucyB0aGUgbmV3IGZsYXR0ZW5lZCBhcnJheS5cbiAqIEBleGFtcGxlXG4gKlxuICogXy5mbGF0dGVuKFsxLCBbMiwgWzMsIFs0XV0sIDVdXSk7XG4gKiAvLyA9PiBbMSwgMiwgWzMsIFs0XV0sIDVdXG4gKi9cbmZ1bmN0aW9uIGZsYXR0ZW4oYXJyYXkpIHtcbiAgdmFyIGxlbmd0aCA9IGFycmF5ID09IG51bGwgPyAwIDogYXJyYXkubGVuZ3RoO1xuICByZXR1cm4gbGVuZ3RoID8gYmFzZUZsYXR0ZW4oYXJyYXksIDEpIDogW107XG59XG5cbm1vZHVsZS5leHBvcnRzID0gZmxhdHRlbjtcbiIsCiAgICAidmFyIGdldE5hdGl2ZSA9IHJlcXVpcmUoJy4vX2dldE5hdGl2ZScpO1xuXG4vKiBCdWlsdC1pbiBtZXRob2QgcmVmZXJlbmNlcyB0aGF0IGFyZSB2ZXJpZmllZCB0byBiZSBuYXRpdmUuICovXG52YXIgbmF0aXZlQ3JlYXRlID0gZ2V0TmF0aXZlKE9iamVjdCwgJ2NyZWF0ZScpO1xuXG5tb2R1bGUuZXhwb3J0cyA9IG5hdGl2ZUNyZWF0ZTtcbiIsCiAgICAidmFyIG5hdGl2ZUNyZWF0ZSA9IHJlcXVpcmUoJy4vX25hdGl2ZUNyZWF0ZScpO1xuXG4vKipcbiAqIFJlbW92ZXMgYWxsIGtleS12YWx1ZSBlbnRyaWVzIGZyb20gdGhlIGhhc2guXG4gKlxuICogQHByaXZhdGVcbiAqIEBuYW1lIGNsZWFyXG4gKiBAbWVtYmVyT2YgSGFzaFxuICovXG5mdW5jdGlvbiBoYXNoQ2xlYXIoKSB7XG4gIHRoaXMuX19kYXRhX18gPSBuYXRpdmVDcmVhdGUgPyBuYXRpdmVDcmVhdGUobnVsbCkgOiB7fTtcbiAgdGhpcy5zaXplID0gMDtcbn1cblxubW9kdWxlLmV4cG9ydHMgPSBoYXNoQ2xlYXI7XG4iLAogICAgIi8qKlxuICogUmVtb3ZlcyBga2V5YCBhbmQgaXRzIHZhbHVlIGZyb20gdGhlIGhhc2guXG4gKlxuICogQHByaXZhdGVcbiAqIEBuYW1lIGRlbGV0ZVxuICogQG1lbWJlck9mIEhhc2hcbiAqIEBwYXJhbSB7T2JqZWN0fSBoYXNoIFRoZSBoYXNoIHRvIG1vZGlmeS5cbiAqIEBwYXJhbSB7c3RyaW5nfSBrZXkgVGhlIGtleSBvZiB0aGUgdmFsdWUgdG8gcmVtb3ZlLlxuICogQHJldHVybnMge2Jvb2xlYW59IFJldHVybnMgYHRydWVgIGlmIHRoZSBlbnRyeSB3YXMgcmVtb3ZlZCwgZWxzZSBgZmFsc2VgLlxuICovXG5mdW5jdGlvbiBoYXNoRGVsZXRlKGtleSkge1xuICB2YXIgcmVzdWx0ID0gdGhpcy5oYXMoa2V5KSAmJiBkZWxldGUgdGhpcy5fX2RhdGFfX1trZXldO1xuICB0aGlzLnNpemUgLT0gcmVzdWx0ID8gMSA6IDA7XG4gIHJldHVybiByZXN1bHQ7XG59XG5cbm1vZHVsZS5leHBvcnRzID0gaGFzaERlbGV0ZTtcbiIsCiAgICAidmFyIG5hdGl2ZUNyZWF0ZSA9IHJlcXVpcmUoJy4vX25hdGl2ZUNyZWF0ZScpO1xuXG4vKiogVXNlZCB0byBzdGFuZC1pbiBmb3IgYHVuZGVmaW5lZGAgaGFzaCB2YWx1ZXMuICovXG52YXIgSEFTSF9VTkRFRklORUQgPSAnX19sb2Rhc2hfaGFzaF91bmRlZmluZWRfXyc7XG5cbi8qKiBVc2VkIGZvciBidWlsdC1pbiBtZXRob2QgcmVmZXJlbmNlcy4gKi9cbnZhciBvYmplY3RQcm90byA9IE9iamVjdC5wcm90b3R5cGU7XG5cbi8qKiBVc2VkIHRvIGNoZWNrIG9iamVjdHMgZm9yIG93biBwcm9wZXJ0aWVzLiAqL1xudmFyIGhhc093blByb3BlcnR5ID0gb2JqZWN0UHJvdG8uaGFzT3duUHJvcGVydHk7XG5cbi8qKlxuICogR2V0cyB0aGUgaGFzaCB2YWx1ZSBmb3IgYGtleWAuXG4gKlxuICogQHByaXZhdGVcbiAqIEBuYW1lIGdldFxuICogQG1lbWJlck9mIEhhc2hcbiAqIEBwYXJhbSB7c3RyaW5nfSBrZXkgVGhlIGtleSBvZiB0aGUgdmFsdWUgdG8gZ2V0LlxuICogQHJldHVybnMgeyp9IFJldHVybnMgdGhlIGVudHJ5IHZhbHVlLlxuICovXG5mdW5jdGlvbiBoYXNoR2V0KGtleSkge1xuICB2YXIgZGF0YSA9IHRoaXMuX19kYXRhX187XG4gIGlmIChuYXRpdmVDcmVhdGUpIHtcbiAgICB2YXIgcmVzdWx0ID0gZGF0YVtrZXldO1xuICAgIHJldHVybiByZXN1bHQgPT09IEhBU0hfVU5ERUZJTkVEID8gdW5kZWZpbmVkIDogcmVzdWx0O1xuICB9XG4gIHJldHVybiBoYXNPd25Qcm9wZXJ0eS5jYWxsKGRhdGEsIGtleSkgPyBkYXRhW2tleV0gOiB1bmRlZmluZWQ7XG59XG5cbm1vZHVsZS5leHBvcnRzID0gaGFzaEdldDtcbiIsCiAgICAidmFyIG5hdGl2ZUNyZWF0ZSA9IHJlcXVpcmUoJy4vX25hdGl2ZUNyZWF0ZScpO1xuXG4vKiogVXNlZCBmb3IgYnVpbHQtaW4gbWV0aG9kIHJlZmVyZW5jZXMuICovXG52YXIgb2JqZWN0UHJvdG8gPSBPYmplY3QucHJvdG90eXBlO1xuXG4vKiogVXNlZCB0byBjaGVjayBvYmplY3RzIGZvciBvd24gcHJvcGVydGllcy4gKi9cbnZhciBoYXNPd25Qcm9wZXJ0eSA9IG9iamVjdFByb3RvLmhhc093blByb3BlcnR5O1xuXG4vKipcbiAqIENoZWNrcyBpZiBhIGhhc2ggdmFsdWUgZm9yIGBrZXlgIGV4aXN0cy5cbiAqXG4gKiBAcHJpdmF0ZVxuICogQG5hbWUgaGFzXG4gKiBAbWVtYmVyT2YgSGFzaFxuICogQHBhcmFtIHtzdHJpbmd9IGtleSBUaGUga2V5IG9mIHRoZSBlbnRyeSB0byBjaGVjay5cbiAqIEByZXR1cm5zIHtib29sZWFufSBSZXR1cm5zIGB0cnVlYCBpZiBhbiBlbnRyeSBmb3IgYGtleWAgZXhpc3RzLCBlbHNlIGBmYWxzZWAuXG4gKi9cbmZ1bmN0aW9uIGhhc2hIYXMoa2V5KSB7XG4gIHZhciBkYXRhID0gdGhpcy5fX2RhdGFfXztcbiAgcmV0dXJuIG5hdGl2ZUNyZWF0ZSA/IChkYXRhW2tleV0gIT09IHVuZGVmaW5lZCkgOiBoYXNPd25Qcm9wZXJ0eS5jYWxsKGRhdGEsIGtleSk7XG59XG5cbm1vZHVsZS5leHBvcnRzID0gaGFzaEhhcztcbiIsCiAgICAidmFyIG5hdGl2ZUNyZWF0ZSA9IHJlcXVpcmUoJy4vX25hdGl2ZUNyZWF0ZScpO1xuXG4vKiogVXNlZCB0byBzdGFuZC1pbiBmb3IgYHVuZGVmaW5lZGAgaGFzaCB2YWx1ZXMuICovXG52YXIgSEFTSF9VTkRFRklORUQgPSAnX19sb2Rhc2hfaGFzaF91bmRlZmluZWRfXyc7XG5cbi8qKlxuICogU2V0cyB0aGUgaGFzaCBga2V5YCB0byBgdmFsdWVgLlxuICpcbiAqIEBwcml2YXRlXG4gKiBAbmFtZSBzZXRcbiAqIEBtZW1iZXJPZiBIYXNoXG4gKiBAcGFyYW0ge3N0cmluZ30ga2V5IFRoZSBrZXkgb2YgdGhlIHZhbHVlIHRvIHNldC5cbiAqIEBwYXJhbSB7Kn0gdmFsdWUgVGhlIHZhbHVlIHRvIHNldC5cbiAqIEByZXR1cm5zIHtPYmplY3R9IFJldHVybnMgdGhlIGhhc2ggaW5zdGFuY2UuXG4gKi9cbmZ1bmN0aW9uIGhhc2hTZXQoa2V5LCB2YWx1ZSkge1xuICB2YXIgZGF0YSA9IHRoaXMuX19kYXRhX187XG4gIHRoaXMuc2l6ZSArPSB0aGlzLmhhcyhrZXkpID8gMCA6IDE7XG4gIGRhdGFba2V5XSA9IChuYXRpdmVDcmVhdGUgJiYgdmFsdWUgPT09IHVuZGVmaW5lZCkgPyBIQVNIX1VOREVGSU5FRCA6IHZhbHVlO1xuICByZXR1cm4gdGhpcztcbn1cblxubW9kdWxlLmV4cG9ydHMgPSBoYXNoU2V0O1xuIiwKICAgICJ2YXIgaGFzaENsZWFyID0gcmVxdWlyZSgnLi9faGFzaENsZWFyJyksXG4gICAgaGFzaERlbGV0ZSA9IHJlcXVpcmUoJy4vX2hhc2hEZWxldGUnKSxcbiAgICBoYXNoR2V0ID0gcmVxdWlyZSgnLi9faGFzaEdldCcpLFxuICAgIGhhc2hIYXMgPSByZXF1aXJlKCcuL19oYXNoSGFzJyksXG4gICAgaGFzaFNldCA9IHJlcXVpcmUoJy4vX2hhc2hTZXQnKTtcblxuLyoqXG4gKiBDcmVhdGVzIGEgaGFzaCBvYmplY3QuXG4gKlxuICogQHByaXZhdGVcbiAqIEBjb25zdHJ1Y3RvclxuICogQHBhcmFtIHtBcnJheX0gW2VudHJpZXNdIFRoZSBrZXktdmFsdWUgcGFpcnMgdG8gY2FjaGUuXG4gKi9cbmZ1bmN0aW9uIEhhc2goZW50cmllcykge1xuICB2YXIgaW5kZXggPSAtMSxcbiAgICAgIGxlbmd0aCA9IGVudHJpZXMgPT0gbnVsbCA/IDAgOiBlbnRyaWVzLmxlbmd0aDtcblxuICB0aGlzLmNsZWFyKCk7XG4gIHdoaWxlICgrK2luZGV4IDwgbGVuZ3RoKSB7XG4gICAgdmFyIGVudHJ5ID0gZW50cmllc1tpbmRleF07XG4gICAgdGhpcy5zZXQoZW50cnlbMF0sIGVudHJ5WzFdKTtcbiAgfVxufVxuXG4vLyBBZGQgbWV0aG9kcyB0byBgSGFzaGAuXG5IYXNoLnByb3RvdHlwZS5jbGVhciA9IGhhc2hDbGVhcjtcbkhhc2gucHJvdG90eXBlWydkZWxldGUnXSA9IGhhc2hEZWxldGU7XG5IYXNoLnByb3RvdHlwZS5nZXQgPSBoYXNoR2V0O1xuSGFzaC5wcm90b3R5cGUuaGFzID0gaGFzaEhhcztcbkhhc2gucHJvdG90eXBlLnNldCA9IGhhc2hTZXQ7XG5cbm1vZHVsZS5leHBvcnRzID0gSGFzaDtcbiIsCiAgICAiLyoqXG4gKiBSZW1vdmVzIGFsbCBrZXktdmFsdWUgZW50cmllcyBmcm9tIHRoZSBsaXN0IGNhY2hlLlxuICpcbiAqIEBwcml2YXRlXG4gKiBAbmFtZSBjbGVhclxuICogQG1lbWJlck9mIExpc3RDYWNoZVxuICovXG5mdW5jdGlvbiBsaXN0Q2FjaGVDbGVhcigpIHtcbiAgdGhpcy5fX2RhdGFfXyA9IFtdO1xuICB0aGlzLnNpemUgPSAwO1xufVxuXG5tb2R1bGUuZXhwb3J0cyA9IGxpc3RDYWNoZUNsZWFyO1xuIiwKICAgICJ2YXIgZXEgPSByZXF1aXJlKCcuL2VxJyk7XG5cbi8qKlxuICogR2V0cyB0aGUgaW5kZXggYXQgd2hpY2ggdGhlIGBrZXlgIGlzIGZvdW5kIGluIGBhcnJheWAgb2Yga2V5LXZhbHVlIHBhaXJzLlxuICpcbiAqIEBwcml2YXRlXG4gKiBAcGFyYW0ge0FycmF5fSBhcnJheSBUaGUgYXJyYXkgdG8gaW5zcGVjdC5cbiAqIEBwYXJhbSB7Kn0ga2V5IFRoZSBrZXkgdG8gc2VhcmNoIGZvci5cbiAqIEByZXR1cm5zIHtudW1iZXJ9IFJldHVybnMgdGhlIGluZGV4IG9mIHRoZSBtYXRjaGVkIHZhbHVlLCBlbHNlIGAtMWAuXG4gKi9cbmZ1bmN0aW9uIGFzc29jSW5kZXhPZihhcnJheSwga2V5KSB7XG4gIHZhciBsZW5ndGggPSBhcnJheS5sZW5ndGg7XG4gIHdoaWxlIChsZW5ndGgtLSkge1xuICAgIGlmIChlcShhcnJheVtsZW5ndGhdWzBdLCBrZXkpKSB7XG4gICAgICByZXR1cm4gbGVuZ3RoO1xuICAgIH1cbiAgfVxuICByZXR1cm4gLTE7XG59XG5cbm1vZHVsZS5leHBvcnRzID0gYXNzb2NJbmRleE9mO1xuIiwKICAgICJ2YXIgYXNzb2NJbmRleE9mID0gcmVxdWlyZSgnLi9fYXNzb2NJbmRleE9mJyk7XG5cbi8qKiBVc2VkIGZvciBidWlsdC1pbiBtZXRob2QgcmVmZXJlbmNlcy4gKi9cbnZhciBhcnJheVByb3RvID0gQXJyYXkucHJvdG90eXBlO1xuXG4vKiogQnVpbHQtaW4gdmFsdWUgcmVmZXJlbmNlcy4gKi9cbnZhciBzcGxpY2UgPSBhcnJheVByb3RvLnNwbGljZTtcblxuLyoqXG4gKiBSZW1vdmVzIGBrZXlgIGFuZCBpdHMgdmFsdWUgZnJvbSB0aGUgbGlzdCBjYWNoZS5cbiAqXG4gKiBAcHJpdmF0ZVxuICogQG5hbWUgZGVsZXRlXG4gKiBAbWVtYmVyT2YgTGlzdENhY2hlXG4gKiBAcGFyYW0ge3N0cmluZ30ga2V5IFRoZSBrZXkgb2YgdGhlIHZhbHVlIHRvIHJlbW92ZS5cbiAqIEByZXR1cm5zIHtib29sZWFufSBSZXR1cm5zIGB0cnVlYCBpZiB0aGUgZW50cnkgd2FzIHJlbW92ZWQsIGVsc2UgYGZhbHNlYC5cbiAqL1xuZnVuY3Rpb24gbGlzdENhY2hlRGVsZXRlKGtleSkge1xuICB2YXIgZGF0YSA9IHRoaXMuX19kYXRhX18sXG4gICAgICBpbmRleCA9IGFzc29jSW5kZXhPZihkYXRhLCBrZXkpO1xuXG4gIGlmIChpbmRleCA8IDApIHtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cbiAgdmFyIGxhc3RJbmRleCA9IGRhdGEubGVuZ3RoIC0gMTtcbiAgaWYgKGluZGV4ID09IGxhc3RJbmRleCkge1xuICAgIGRhdGEucG9wKCk7XG4gIH0gZWxzZSB7XG4gICAgc3BsaWNlLmNhbGwoZGF0YSwgaW5kZXgsIDEpO1xuICB9XG4gIC0tdGhpcy5zaXplO1xuICByZXR1cm4gdHJ1ZTtcbn1cblxubW9kdWxlLmV4cG9ydHMgPSBsaXN0Q2FjaGVEZWxldGU7XG4iLAogICAgInZhciBhc3NvY0luZGV4T2YgPSByZXF1aXJlKCcuL19hc3NvY0luZGV4T2YnKTtcblxuLyoqXG4gKiBHZXRzIHRoZSBsaXN0IGNhY2hlIHZhbHVlIGZvciBga2V5YC5cbiAqXG4gKiBAcHJpdmF0ZVxuICogQG5hbWUgZ2V0XG4gKiBAbWVtYmVyT2YgTGlzdENhY2hlXG4gKiBAcGFyYW0ge3N0cmluZ30ga2V5IFRoZSBrZXkgb2YgdGhlIHZhbHVlIHRvIGdldC5cbiAqIEByZXR1cm5zIHsqfSBSZXR1cm5zIHRoZSBlbnRyeSB2YWx1ZS5cbiAqL1xuZnVuY3Rpb24gbGlzdENhY2hlR2V0KGtleSkge1xuICB2YXIgZGF0YSA9IHRoaXMuX19kYXRhX18sXG4gICAgICBpbmRleCA9IGFzc29jSW5kZXhPZihkYXRhLCBrZXkpO1xuXG4gIHJldHVybiBpbmRleCA8IDAgPyB1bmRlZmluZWQgOiBkYXRhW2luZGV4XVsxXTtcbn1cblxubW9kdWxlLmV4cG9ydHMgPSBsaXN0Q2FjaGVHZXQ7XG4iLAogICAgInZhciBhc3NvY0luZGV4T2YgPSByZXF1aXJlKCcuL19hc3NvY0luZGV4T2YnKTtcblxuLyoqXG4gKiBDaGVja3MgaWYgYSBsaXN0IGNhY2hlIHZhbHVlIGZvciBga2V5YCBleGlzdHMuXG4gKlxuICogQHByaXZhdGVcbiAqIEBuYW1lIGhhc1xuICogQG1lbWJlck9mIExpc3RDYWNoZVxuICogQHBhcmFtIHtzdHJpbmd9IGtleSBUaGUga2V5IG9mIHRoZSBlbnRyeSB0byBjaGVjay5cbiAqIEByZXR1cm5zIHtib29sZWFufSBSZXR1cm5zIGB0cnVlYCBpZiBhbiBlbnRyeSBmb3IgYGtleWAgZXhpc3RzLCBlbHNlIGBmYWxzZWAuXG4gKi9cbmZ1bmN0aW9uIGxpc3RDYWNoZUhhcyhrZXkpIHtcbiAgcmV0dXJuIGFzc29jSW5kZXhPZih0aGlzLl9fZGF0YV9fLCBrZXkpID4gLTE7XG59XG5cbm1vZHVsZS5leHBvcnRzID0gbGlzdENhY2hlSGFzO1xuIiwKICAgICJ2YXIgYXNzb2NJbmRleE9mID0gcmVxdWlyZSgnLi9fYXNzb2NJbmRleE9mJyk7XG5cbi8qKlxuICogU2V0cyB0aGUgbGlzdCBjYWNoZSBga2V5YCB0byBgdmFsdWVgLlxuICpcbiAqIEBwcml2YXRlXG4gKiBAbmFtZSBzZXRcbiAqIEBtZW1iZXJPZiBMaXN0Q2FjaGVcbiAqIEBwYXJhbSB7c3RyaW5nfSBrZXkgVGhlIGtleSBvZiB0aGUgdmFsdWUgdG8gc2V0LlxuICogQHBhcmFtIHsqfSB2YWx1ZSBUaGUgdmFsdWUgdG8gc2V0LlxuICogQHJldHVybnMge09iamVjdH0gUmV0dXJucyB0aGUgbGlzdCBjYWNoZSBpbnN0YW5jZS5cbiAqL1xuZnVuY3Rpb24gbGlzdENhY2hlU2V0KGtleSwgdmFsdWUpIHtcbiAgdmFyIGRhdGEgPSB0aGlzLl9fZGF0YV9fLFxuICAgICAgaW5kZXggPSBhc3NvY0luZGV4T2YoZGF0YSwga2V5KTtcblxuICBpZiAoaW5kZXggPCAwKSB7XG4gICAgKyt0aGlzLnNpemU7XG4gICAgZGF0YS5wdXNoKFtrZXksIHZhbHVlXSk7XG4gIH0gZWxzZSB7XG4gICAgZGF0YVtpbmRleF1bMV0gPSB2YWx1ZTtcbiAgfVxuICByZXR1cm4gdGhpcztcbn1cblxubW9kdWxlLmV4cG9ydHMgPSBsaXN0Q2FjaGVTZXQ7XG4iLAogICAgInZhciBsaXN0Q2FjaGVDbGVhciA9IHJlcXVpcmUoJy4vX2xpc3RDYWNoZUNsZWFyJyksXG4gICAgbGlzdENhY2hlRGVsZXRlID0gcmVxdWlyZSgnLi9fbGlzdENhY2hlRGVsZXRlJyksXG4gICAgbGlzdENhY2hlR2V0ID0gcmVxdWlyZSgnLi9fbGlzdENhY2hlR2V0JyksXG4gICAgbGlzdENhY2hlSGFzID0gcmVxdWlyZSgnLi9fbGlzdENhY2hlSGFzJyksXG4gICAgbGlzdENhY2hlU2V0ID0gcmVxdWlyZSgnLi9fbGlzdENhY2hlU2V0Jyk7XG5cbi8qKlxuICogQ3JlYXRlcyBhbiBsaXN0IGNhY2hlIG9iamVjdC5cbiAqXG4gKiBAcHJpdmF0ZVxuICogQGNvbnN0cnVjdG9yXG4gKiBAcGFyYW0ge0FycmF5fSBbZW50cmllc10gVGhlIGtleS12YWx1ZSBwYWlycyB0byBjYWNoZS5cbiAqL1xuZnVuY3Rpb24gTGlzdENhY2hlKGVudHJpZXMpIHtcbiAgdmFyIGluZGV4ID0gLTEsXG4gICAgICBsZW5ndGggPSBlbnRyaWVzID09IG51bGwgPyAwIDogZW50cmllcy5sZW5ndGg7XG5cbiAgdGhpcy5jbGVhcigpO1xuICB3aGlsZSAoKytpbmRleCA8IGxlbmd0aCkge1xuICAgIHZhciBlbnRyeSA9IGVudHJpZXNbaW5kZXhdO1xuICAgIHRoaXMuc2V0KGVudHJ5WzBdLCBlbnRyeVsxXSk7XG4gIH1cbn1cblxuLy8gQWRkIG1ldGhvZHMgdG8gYExpc3RDYWNoZWAuXG5MaXN0Q2FjaGUucHJvdG90eXBlLmNsZWFyID0gbGlzdENhY2hlQ2xlYXI7XG5MaXN0Q2FjaGUucHJvdG90eXBlWydkZWxldGUnXSA9IGxpc3RDYWNoZURlbGV0ZTtcbkxpc3RDYWNoZS5wcm90b3R5cGUuZ2V0ID0gbGlzdENhY2hlR2V0O1xuTGlzdENhY2hlLnByb3RvdHlwZS5oYXMgPSBsaXN0Q2FjaGVIYXM7XG5MaXN0Q2FjaGUucHJvdG90eXBlLnNldCA9IGxpc3RDYWNoZVNldDtcblxubW9kdWxlLmV4cG9ydHMgPSBMaXN0Q2FjaGU7XG4iLAogICAgInZhciBnZXROYXRpdmUgPSByZXF1aXJlKCcuL19nZXROYXRpdmUnKSxcbiAgICByb290ID0gcmVxdWlyZSgnLi9fcm9vdCcpO1xuXG4vKiBCdWlsdC1pbiBtZXRob2QgcmVmZXJlbmNlcyB0aGF0IGFyZSB2ZXJpZmllZCB0byBiZSBuYXRpdmUuICovXG52YXIgTWFwID0gZ2V0TmF0aXZlKHJvb3QsICdNYXAnKTtcblxubW9kdWxlLmV4cG9ydHMgPSBNYXA7XG4iLAogICAgInZhciBIYXNoID0gcmVxdWlyZSgnLi9fSGFzaCcpLFxuICAgIExpc3RDYWNoZSA9IHJlcXVpcmUoJy4vX0xpc3RDYWNoZScpLFxuICAgIE1hcCA9IHJlcXVpcmUoJy4vX01hcCcpO1xuXG4vKipcbiAqIFJlbW92ZXMgYWxsIGtleS12YWx1ZSBlbnRyaWVzIGZyb20gdGhlIG1hcC5cbiAqXG4gKiBAcHJpdmF0ZVxuICogQG5hbWUgY2xlYXJcbiAqIEBtZW1iZXJPZiBNYXBDYWNoZVxuICovXG5mdW5jdGlvbiBtYXBDYWNoZUNsZWFyKCkge1xuICB0aGlzLnNpemUgPSAwO1xuICB0aGlzLl9fZGF0YV9fID0ge1xuICAgICdoYXNoJzogbmV3IEhhc2gsXG4gICAgJ21hcCc6IG5ldyAoTWFwIHx8IExpc3RDYWNoZSksXG4gICAgJ3N0cmluZyc6IG5ldyBIYXNoXG4gIH07XG59XG5cbm1vZHVsZS5leHBvcnRzID0gbWFwQ2FjaGVDbGVhcjtcbiIsCiAgICAiLyoqXG4gKiBDaGVja3MgaWYgYHZhbHVlYCBpcyBzdWl0YWJsZSBmb3IgdXNlIGFzIHVuaXF1ZSBvYmplY3Qga2V5LlxuICpcbiAqIEBwcml2YXRlXG4gKiBAcGFyYW0geyp9IHZhbHVlIFRoZSB2YWx1ZSB0byBjaGVjay5cbiAqIEByZXR1cm5zIHtib29sZWFufSBSZXR1cm5zIGB0cnVlYCBpZiBgdmFsdWVgIGlzIHN1aXRhYmxlLCBlbHNlIGBmYWxzZWAuXG4gKi9cbmZ1bmN0aW9uIGlzS2V5YWJsZSh2YWx1ZSkge1xuICB2YXIgdHlwZSA9IHR5cGVvZiB2YWx1ZTtcbiAgcmV0dXJuICh0eXBlID09ICdzdHJpbmcnIHx8IHR5cGUgPT0gJ251bWJlcicgfHwgdHlwZSA9PSAnc3ltYm9sJyB8fCB0eXBlID09ICdib29sZWFuJylcbiAgICA/ICh2YWx1ZSAhPT0gJ19fcHJvdG9fXycpXG4gICAgOiAodmFsdWUgPT09IG51bGwpO1xufVxuXG5tb2R1bGUuZXhwb3J0cyA9IGlzS2V5YWJsZTtcbiIsCiAgICAidmFyIGlzS2V5YWJsZSA9IHJlcXVpcmUoJy4vX2lzS2V5YWJsZScpO1xuXG4vKipcbiAqIEdldHMgdGhlIGRhdGEgZm9yIGBtYXBgLlxuICpcbiAqIEBwcml2YXRlXG4gKiBAcGFyYW0ge09iamVjdH0gbWFwIFRoZSBtYXAgdG8gcXVlcnkuXG4gKiBAcGFyYW0ge3N0cmluZ30ga2V5IFRoZSByZWZlcmVuY2Uga2V5LlxuICogQHJldHVybnMgeyp9IFJldHVybnMgdGhlIG1hcCBkYXRhLlxuICovXG5mdW5jdGlvbiBnZXRNYXBEYXRhKG1hcCwga2V5KSB7XG4gIHZhciBkYXRhID0gbWFwLl9fZGF0YV9fO1xuICByZXR1cm4gaXNLZXlhYmxlKGtleSlcbiAgICA/IGRhdGFbdHlwZW9mIGtleSA9PSAnc3RyaW5nJyA/ICdzdHJpbmcnIDogJ2hhc2gnXVxuICAgIDogZGF0YS5tYXA7XG59XG5cbm1vZHVsZS5leHBvcnRzID0gZ2V0TWFwRGF0YTtcbiIsCiAgICAidmFyIGdldE1hcERhdGEgPSByZXF1aXJlKCcuL19nZXRNYXBEYXRhJyk7XG5cbi8qKlxuICogUmVtb3ZlcyBga2V5YCBhbmQgaXRzIHZhbHVlIGZyb20gdGhlIG1hcC5cbiAqXG4gKiBAcHJpdmF0ZVxuICogQG5hbWUgZGVsZXRlXG4gKiBAbWVtYmVyT2YgTWFwQ2FjaGVcbiAqIEBwYXJhbSB7c3RyaW5nfSBrZXkgVGhlIGtleSBvZiB0aGUgdmFsdWUgdG8gcmVtb3ZlLlxuICogQHJldHVybnMge2Jvb2xlYW59IFJldHVybnMgYHRydWVgIGlmIHRoZSBlbnRyeSB3YXMgcmVtb3ZlZCwgZWxzZSBgZmFsc2VgLlxuICovXG5mdW5jdGlvbiBtYXBDYWNoZURlbGV0ZShrZXkpIHtcbiAgdmFyIHJlc3VsdCA9IGdldE1hcERhdGEodGhpcywga2V5KVsnZGVsZXRlJ10oa2V5KTtcbiAgdGhpcy5zaXplIC09IHJlc3VsdCA/IDEgOiAwO1xuICByZXR1cm4gcmVzdWx0O1xufVxuXG5tb2R1bGUuZXhwb3J0cyA9IG1hcENhY2hlRGVsZXRlO1xuIiwKICAgICJ2YXIgZ2V0TWFwRGF0YSA9IHJlcXVpcmUoJy4vX2dldE1hcERhdGEnKTtcblxuLyoqXG4gKiBHZXRzIHRoZSBtYXAgdmFsdWUgZm9yIGBrZXlgLlxuICpcbiAqIEBwcml2YXRlXG4gKiBAbmFtZSBnZXRcbiAqIEBtZW1iZXJPZiBNYXBDYWNoZVxuICogQHBhcmFtIHtzdHJpbmd9IGtleSBUaGUga2V5IG9mIHRoZSB2YWx1ZSB0byBnZXQuXG4gKiBAcmV0dXJucyB7Kn0gUmV0dXJucyB0aGUgZW50cnkgdmFsdWUuXG4gKi9cbmZ1bmN0aW9uIG1hcENhY2hlR2V0KGtleSkge1xuICByZXR1cm4gZ2V0TWFwRGF0YSh0aGlzLCBrZXkpLmdldChrZXkpO1xufVxuXG5tb2R1bGUuZXhwb3J0cyA9IG1hcENhY2hlR2V0O1xuIiwKICAgICJ2YXIgZ2V0TWFwRGF0YSA9IHJlcXVpcmUoJy4vX2dldE1hcERhdGEnKTtcblxuLyoqXG4gKiBDaGVja3MgaWYgYSBtYXAgdmFsdWUgZm9yIGBrZXlgIGV4aXN0cy5cbiAqXG4gKiBAcHJpdmF0ZVxuICogQG5hbWUgaGFzXG4gKiBAbWVtYmVyT2YgTWFwQ2FjaGVcbiAqIEBwYXJhbSB7c3RyaW5nfSBrZXkgVGhlIGtleSBvZiB0aGUgZW50cnkgdG8gY2hlY2suXG4gKiBAcmV0dXJucyB7Ym9vbGVhbn0gUmV0dXJucyBgdHJ1ZWAgaWYgYW4gZW50cnkgZm9yIGBrZXlgIGV4aXN0cywgZWxzZSBgZmFsc2VgLlxuICovXG5mdW5jdGlvbiBtYXBDYWNoZUhhcyhrZXkpIHtcbiAgcmV0dXJuIGdldE1hcERhdGEodGhpcywga2V5KS5oYXMoa2V5KTtcbn1cblxubW9kdWxlLmV4cG9ydHMgPSBtYXBDYWNoZUhhcztcbiIsCiAgICAidmFyIGdldE1hcERhdGEgPSByZXF1aXJlKCcuL19nZXRNYXBEYXRhJyk7XG5cbi8qKlxuICogU2V0cyB0aGUgbWFwIGBrZXlgIHRvIGB2YWx1ZWAuXG4gKlxuICogQHByaXZhdGVcbiAqIEBuYW1lIHNldFxuICogQG1lbWJlck9mIE1hcENhY2hlXG4gKiBAcGFyYW0ge3N0cmluZ30ga2V5IFRoZSBrZXkgb2YgdGhlIHZhbHVlIHRvIHNldC5cbiAqIEBwYXJhbSB7Kn0gdmFsdWUgVGhlIHZhbHVlIHRvIHNldC5cbiAqIEByZXR1cm5zIHtPYmplY3R9IFJldHVybnMgdGhlIG1hcCBjYWNoZSBpbnN0YW5jZS5cbiAqL1xuZnVuY3Rpb24gbWFwQ2FjaGVTZXQoa2V5LCB2YWx1ZSkge1xuICB2YXIgZGF0YSA9IGdldE1hcERhdGEodGhpcywga2V5KSxcbiAgICAgIHNpemUgPSBkYXRhLnNpemU7XG5cbiAgZGF0YS5zZXQoa2V5LCB2YWx1ZSk7XG4gIHRoaXMuc2l6ZSArPSBkYXRhLnNpemUgPT0gc2l6ZSA/IDAgOiAxO1xuICByZXR1cm4gdGhpcztcbn1cblxubW9kdWxlLmV4cG9ydHMgPSBtYXBDYWNoZVNldDtcbiIsCiAgICAidmFyIG1hcENhY2hlQ2xlYXIgPSByZXF1aXJlKCcuL19tYXBDYWNoZUNsZWFyJyksXG4gICAgbWFwQ2FjaGVEZWxldGUgPSByZXF1aXJlKCcuL19tYXBDYWNoZURlbGV0ZScpLFxuICAgIG1hcENhY2hlR2V0ID0gcmVxdWlyZSgnLi9fbWFwQ2FjaGVHZXQnKSxcbiAgICBtYXBDYWNoZUhhcyA9IHJlcXVpcmUoJy4vX21hcENhY2hlSGFzJyksXG4gICAgbWFwQ2FjaGVTZXQgPSByZXF1aXJlKCcuL19tYXBDYWNoZVNldCcpO1xuXG4vKipcbiAqIENyZWF0ZXMgYSBtYXAgY2FjaGUgb2JqZWN0IHRvIHN0b3JlIGtleS12YWx1ZSBwYWlycy5cbiAqXG4gKiBAcHJpdmF0ZVxuICogQGNvbnN0cnVjdG9yXG4gKiBAcGFyYW0ge0FycmF5fSBbZW50cmllc10gVGhlIGtleS12YWx1ZSBwYWlycyB0byBjYWNoZS5cbiAqL1xuZnVuY3Rpb24gTWFwQ2FjaGUoZW50cmllcykge1xuICB2YXIgaW5kZXggPSAtMSxcbiAgICAgIGxlbmd0aCA9IGVudHJpZXMgPT0gbnVsbCA/IDAgOiBlbnRyaWVzLmxlbmd0aDtcblxuICB0aGlzLmNsZWFyKCk7XG4gIHdoaWxlICgrK2luZGV4IDwgbGVuZ3RoKSB7XG4gICAgdmFyIGVudHJ5ID0gZW50cmllc1tpbmRleF07XG4gICAgdGhpcy5zZXQoZW50cnlbMF0sIGVudHJ5WzFdKTtcbiAgfVxufVxuXG4vLyBBZGQgbWV0aG9kcyB0byBgTWFwQ2FjaGVgLlxuTWFwQ2FjaGUucHJvdG90eXBlLmNsZWFyID0gbWFwQ2FjaGVDbGVhcjtcbk1hcENhY2hlLnByb3RvdHlwZVsnZGVsZXRlJ10gPSBtYXBDYWNoZURlbGV0ZTtcbk1hcENhY2hlLnByb3RvdHlwZS5nZXQgPSBtYXBDYWNoZUdldDtcbk1hcENhY2hlLnByb3RvdHlwZS5oYXMgPSBtYXBDYWNoZUhhcztcbk1hcENhY2hlLnByb3RvdHlwZS5zZXQgPSBtYXBDYWNoZVNldDtcblxubW9kdWxlLmV4cG9ydHMgPSBNYXBDYWNoZTtcbiIsCiAgICAiLyoqIFVzZWQgdG8gc3RhbmQtaW4gZm9yIGB1bmRlZmluZWRgIGhhc2ggdmFsdWVzLiAqL1xudmFyIEhBU0hfVU5ERUZJTkVEID0gJ19fbG9kYXNoX2hhc2hfdW5kZWZpbmVkX18nO1xuXG4vKipcbiAqIEFkZHMgYHZhbHVlYCB0byB0aGUgYXJyYXkgY2FjaGUuXG4gKlxuICogQHByaXZhdGVcbiAqIEBuYW1lIGFkZFxuICogQG1lbWJlck9mIFNldENhY2hlXG4gKiBAYWxpYXMgcHVzaFxuICogQHBhcmFtIHsqfSB2YWx1ZSBUaGUgdmFsdWUgdG8gY2FjaGUuXG4gKiBAcmV0dXJucyB7T2JqZWN0fSBSZXR1cm5zIHRoZSBjYWNoZSBpbnN0YW5jZS5cbiAqL1xuZnVuY3Rpb24gc2V0Q2FjaGVBZGQodmFsdWUpIHtcbiAgdGhpcy5fX2RhdGFfXy5zZXQodmFsdWUsIEhBU0hfVU5ERUZJTkVEKTtcbiAgcmV0dXJuIHRoaXM7XG59XG5cbm1vZHVsZS5leHBvcnRzID0gc2V0Q2FjaGVBZGQ7XG4iLAogICAgIi8qKlxuICogQ2hlY2tzIGlmIGB2YWx1ZWAgaXMgaW4gdGhlIGFycmF5IGNhY2hlLlxuICpcbiAqIEBwcml2YXRlXG4gKiBAbmFtZSBoYXNcbiAqIEBtZW1iZXJPZiBTZXRDYWNoZVxuICogQHBhcmFtIHsqfSB2YWx1ZSBUaGUgdmFsdWUgdG8gc2VhcmNoIGZvci5cbiAqIEByZXR1cm5zIHtudW1iZXJ9IFJldHVybnMgYHRydWVgIGlmIGB2YWx1ZWAgaXMgZm91bmQsIGVsc2UgYGZhbHNlYC5cbiAqL1xuZnVuY3Rpb24gc2V0Q2FjaGVIYXModmFsdWUpIHtcbiAgcmV0dXJuIHRoaXMuX19kYXRhX18uaGFzKHZhbHVlKTtcbn1cblxubW9kdWxlLmV4cG9ydHMgPSBzZXRDYWNoZUhhcztcbiIsCiAgICAidmFyIE1hcENhY2hlID0gcmVxdWlyZSgnLi9fTWFwQ2FjaGUnKSxcbiAgICBzZXRDYWNoZUFkZCA9IHJlcXVpcmUoJy4vX3NldENhY2hlQWRkJyksXG4gICAgc2V0Q2FjaGVIYXMgPSByZXF1aXJlKCcuL19zZXRDYWNoZUhhcycpO1xuXG4vKipcbiAqXG4gKiBDcmVhdGVzIGFuIGFycmF5IGNhY2hlIG9iamVjdCB0byBzdG9yZSB1bmlxdWUgdmFsdWVzLlxuICpcbiAqIEBwcml2YXRlXG4gKiBAY29uc3RydWN0b3JcbiAqIEBwYXJhbSB7QXJyYXl9IFt2YWx1ZXNdIFRoZSB2YWx1ZXMgdG8gY2FjaGUuXG4gKi9cbmZ1bmN0aW9uIFNldENhY2hlKHZhbHVlcykge1xuICB2YXIgaW5kZXggPSAtMSxcbiAgICAgIGxlbmd0aCA9IHZhbHVlcyA9PSBudWxsID8gMCA6IHZhbHVlcy5sZW5ndGg7XG5cbiAgdGhpcy5fX2RhdGFfXyA9IG5ldyBNYXBDYWNoZTtcbiAgd2hpbGUgKCsraW5kZXggPCBsZW5ndGgpIHtcbiAgICB0aGlzLmFkZCh2YWx1ZXNbaW5kZXhdKTtcbiAgfVxufVxuXG4vLyBBZGQgbWV0aG9kcyB0byBgU2V0Q2FjaGVgLlxuU2V0Q2FjaGUucHJvdG90eXBlLmFkZCA9IFNldENhY2hlLnByb3RvdHlwZS5wdXNoID0gc2V0Q2FjaGVBZGQ7XG5TZXRDYWNoZS5wcm90b3R5cGUuaGFzID0gc2V0Q2FjaGVIYXM7XG5cbm1vZHVsZS5leHBvcnRzID0gU2V0Q2FjaGU7XG4iLAogICAgIi8qKlxuICogVGhlIGJhc2UgaW1wbGVtZW50YXRpb24gb2YgYF8uZmluZEluZGV4YCBhbmQgYF8uZmluZExhc3RJbmRleGAgd2l0aG91dFxuICogc3VwcG9ydCBmb3IgaXRlcmF0ZWUgc2hvcnRoYW5kcy5cbiAqXG4gKiBAcHJpdmF0ZVxuICogQHBhcmFtIHtBcnJheX0gYXJyYXkgVGhlIGFycmF5IHRvIGluc3BlY3QuXG4gKiBAcGFyYW0ge0Z1bmN0aW9ufSBwcmVkaWNhdGUgVGhlIGZ1bmN0aW9uIGludm9rZWQgcGVyIGl0ZXJhdGlvbi5cbiAqIEBwYXJhbSB7bnVtYmVyfSBmcm9tSW5kZXggVGhlIGluZGV4IHRvIHNlYXJjaCBmcm9tLlxuICogQHBhcmFtIHtib29sZWFufSBbZnJvbVJpZ2h0XSBTcGVjaWZ5IGl0ZXJhdGluZyBmcm9tIHJpZ2h0IHRvIGxlZnQuXG4gKiBAcmV0dXJucyB7bnVtYmVyfSBSZXR1cm5zIHRoZSBpbmRleCBvZiB0aGUgbWF0Y2hlZCB2YWx1ZSwgZWxzZSBgLTFgLlxuICovXG5mdW5jdGlvbiBiYXNlRmluZEluZGV4KGFycmF5LCBwcmVkaWNhdGUsIGZyb21JbmRleCwgZnJvbVJpZ2h0KSB7XG4gIHZhciBsZW5ndGggPSBhcnJheS5sZW5ndGgsXG4gICAgICBpbmRleCA9IGZyb21JbmRleCArIChmcm9tUmlnaHQgPyAxIDogLTEpO1xuXG4gIHdoaWxlICgoZnJvbVJpZ2h0ID8gaW5kZXgtLSA6ICsraW5kZXggPCBsZW5ndGgpKSB7XG4gICAgaWYgKHByZWRpY2F0ZShhcnJheVtpbmRleF0sIGluZGV4LCBhcnJheSkpIHtcbiAgICAgIHJldHVybiBpbmRleDtcbiAgICB9XG4gIH1cbiAgcmV0dXJuIC0xO1xufVxuXG5tb2R1bGUuZXhwb3J0cyA9IGJhc2VGaW5kSW5kZXg7XG4iLAogICAgIi8qKlxuICogVGhlIGJhc2UgaW1wbGVtZW50YXRpb24gb2YgYF8uaXNOYU5gIHdpdGhvdXQgc3VwcG9ydCBmb3IgbnVtYmVyIG9iamVjdHMuXG4gKlxuICogQHByaXZhdGVcbiAqIEBwYXJhbSB7Kn0gdmFsdWUgVGhlIHZhbHVlIHRvIGNoZWNrLlxuICogQHJldHVybnMge2Jvb2xlYW59IFJldHVybnMgYHRydWVgIGlmIGB2YWx1ZWAgaXMgYE5hTmAsIGVsc2UgYGZhbHNlYC5cbiAqL1xuZnVuY3Rpb24gYmFzZUlzTmFOKHZhbHVlKSB7XG4gIHJldHVybiB2YWx1ZSAhPT0gdmFsdWU7XG59XG5cbm1vZHVsZS5leHBvcnRzID0gYmFzZUlzTmFOO1xuIiwKICAgICIvKipcbiAqIEEgc3BlY2lhbGl6ZWQgdmVyc2lvbiBvZiBgXy5pbmRleE9mYCB3aGljaCBwZXJmb3JtcyBzdHJpY3QgZXF1YWxpdHlcbiAqIGNvbXBhcmlzb25zIG9mIHZhbHVlcywgaS5lLiBgPT09YC5cbiAqXG4gKiBAcHJpdmF0ZVxuICogQHBhcmFtIHtBcnJheX0gYXJyYXkgVGhlIGFycmF5IHRvIGluc3BlY3QuXG4gKiBAcGFyYW0geyp9IHZhbHVlIFRoZSB2YWx1ZSB0byBzZWFyY2ggZm9yLlxuICogQHBhcmFtIHtudW1iZXJ9IGZyb21JbmRleCBUaGUgaW5kZXggdG8gc2VhcmNoIGZyb20uXG4gKiBAcmV0dXJucyB7bnVtYmVyfSBSZXR1cm5zIHRoZSBpbmRleCBvZiB0aGUgbWF0Y2hlZCB2YWx1ZSwgZWxzZSBgLTFgLlxuICovXG5mdW5jdGlvbiBzdHJpY3RJbmRleE9mKGFycmF5LCB2YWx1ZSwgZnJvbUluZGV4KSB7XG4gIHZhciBpbmRleCA9IGZyb21JbmRleCAtIDEsXG4gICAgICBsZW5ndGggPSBhcnJheS5sZW5ndGg7XG5cbiAgd2hpbGUgKCsraW5kZXggPCBsZW5ndGgpIHtcbiAgICBpZiAoYXJyYXlbaW5kZXhdID09PSB2YWx1ZSkge1xuICAgICAgcmV0dXJuIGluZGV4O1xuICAgIH1cbiAgfVxuICByZXR1cm4gLTE7XG59XG5cbm1vZHVsZS5leHBvcnRzID0gc3RyaWN0SW5kZXhPZjtcbiIsCiAgICAidmFyIGJhc2VGaW5kSW5kZXggPSByZXF1aXJlKCcuL19iYXNlRmluZEluZGV4JyksXG4gICAgYmFzZUlzTmFOID0gcmVxdWlyZSgnLi9fYmFzZUlzTmFOJyksXG4gICAgc3RyaWN0SW5kZXhPZiA9IHJlcXVpcmUoJy4vX3N0cmljdEluZGV4T2YnKTtcblxuLyoqXG4gKiBUaGUgYmFzZSBpbXBsZW1lbnRhdGlvbiBvZiBgXy5pbmRleE9mYCB3aXRob3V0IGBmcm9tSW5kZXhgIGJvdW5kcyBjaGVja3MuXG4gKlxuICogQHByaXZhdGVcbiAqIEBwYXJhbSB7QXJyYXl9IGFycmF5IFRoZSBhcnJheSB0byBpbnNwZWN0LlxuICogQHBhcmFtIHsqfSB2YWx1ZSBUaGUgdmFsdWUgdG8gc2VhcmNoIGZvci5cbiAqIEBwYXJhbSB7bnVtYmVyfSBmcm9tSW5kZXggVGhlIGluZGV4IHRvIHNlYXJjaCBmcm9tLlxuICogQHJldHVybnMge251bWJlcn0gUmV0dXJucyB0aGUgaW5kZXggb2YgdGhlIG1hdGNoZWQgdmFsdWUsIGVsc2UgYC0xYC5cbiAqL1xuZnVuY3Rpb24gYmFzZUluZGV4T2YoYXJyYXksIHZhbHVlLCBmcm9tSW5kZXgpIHtcbiAgcmV0dXJuIHZhbHVlID09PSB2YWx1ZVxuICAgID8gc3RyaWN0SW5kZXhPZihhcnJheSwgdmFsdWUsIGZyb21JbmRleClcbiAgICA6IGJhc2VGaW5kSW5kZXgoYXJyYXksIGJhc2VJc05hTiwgZnJvbUluZGV4KTtcbn1cblxubW9kdWxlLmV4cG9ydHMgPSBiYXNlSW5kZXhPZjtcbiIsCiAgICAidmFyIGJhc2VJbmRleE9mID0gcmVxdWlyZSgnLi9fYmFzZUluZGV4T2YnKTtcblxuLyoqXG4gKiBBIHNwZWNpYWxpemVkIHZlcnNpb24gb2YgYF8uaW5jbHVkZXNgIGZvciBhcnJheXMgd2l0aG91dCBzdXBwb3J0IGZvclxuICogc3BlY2lmeWluZyBhbiBpbmRleCB0byBzZWFyY2ggZnJvbS5cbiAqXG4gKiBAcHJpdmF0ZVxuICogQHBhcmFtIHtBcnJheX0gW2FycmF5XSBUaGUgYXJyYXkgdG8gaW5zcGVjdC5cbiAqIEBwYXJhbSB7Kn0gdGFyZ2V0IFRoZSB2YWx1ZSB0byBzZWFyY2ggZm9yLlxuICogQHJldHVybnMge2Jvb2xlYW59IFJldHVybnMgYHRydWVgIGlmIGB0YXJnZXRgIGlzIGZvdW5kLCBlbHNlIGBmYWxzZWAuXG4gKi9cbmZ1bmN0aW9uIGFycmF5SW5jbHVkZXMoYXJyYXksIHZhbHVlKSB7XG4gIHZhciBsZW5ndGggPSBhcnJheSA9PSBudWxsID8gMCA6IGFycmF5Lmxlbmd0aDtcbiAgcmV0dXJuICEhbGVuZ3RoICYmIGJhc2VJbmRleE9mKGFycmF5LCB2YWx1ZSwgMCkgPiAtMTtcbn1cblxubW9kdWxlLmV4cG9ydHMgPSBhcnJheUluY2x1ZGVzO1xuIiwKICAgICIvKipcbiAqIFRoaXMgZnVuY3Rpb24gaXMgbGlrZSBgYXJyYXlJbmNsdWRlc2AgZXhjZXB0IHRoYXQgaXQgYWNjZXB0cyBhIGNvbXBhcmF0b3IuXG4gKlxuICogQHByaXZhdGVcbiAqIEBwYXJhbSB7QXJyYXl9IFthcnJheV0gVGhlIGFycmF5IHRvIGluc3BlY3QuXG4gKiBAcGFyYW0geyp9IHRhcmdldCBUaGUgdmFsdWUgdG8gc2VhcmNoIGZvci5cbiAqIEBwYXJhbSB7RnVuY3Rpb259IGNvbXBhcmF0b3IgVGhlIGNvbXBhcmF0b3IgaW52b2tlZCBwZXIgZWxlbWVudC5cbiAqIEByZXR1cm5zIHtib29sZWFufSBSZXR1cm5zIGB0cnVlYCBpZiBgdGFyZ2V0YCBpcyBmb3VuZCwgZWxzZSBgZmFsc2VgLlxuICovXG5mdW5jdGlvbiBhcnJheUluY2x1ZGVzV2l0aChhcnJheSwgdmFsdWUsIGNvbXBhcmF0b3IpIHtcbiAgdmFyIGluZGV4ID0gLTEsXG4gICAgICBsZW5ndGggPSBhcnJheSA9PSBudWxsID8gMCA6IGFycmF5Lmxlbmd0aDtcblxuICB3aGlsZSAoKytpbmRleCA8IGxlbmd0aCkge1xuICAgIGlmIChjb21wYXJhdG9yKHZhbHVlLCBhcnJheVtpbmRleF0pKSB7XG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG4gIH1cbiAgcmV0dXJuIGZhbHNlO1xufVxuXG5tb2R1bGUuZXhwb3J0cyA9IGFycmF5SW5jbHVkZXNXaXRoO1xuIiwKICAgICIvKipcbiAqIEEgc3BlY2lhbGl6ZWQgdmVyc2lvbiBvZiBgXy5tYXBgIGZvciBhcnJheXMgd2l0aG91dCBzdXBwb3J0IGZvciBpdGVyYXRlZVxuICogc2hvcnRoYW5kcy5cbiAqXG4gKiBAcHJpdmF0ZVxuICogQHBhcmFtIHtBcnJheX0gW2FycmF5XSBUaGUgYXJyYXkgdG8gaXRlcmF0ZSBvdmVyLlxuICogQHBhcmFtIHtGdW5jdGlvbn0gaXRlcmF0ZWUgVGhlIGZ1bmN0aW9uIGludm9rZWQgcGVyIGl0ZXJhdGlvbi5cbiAqIEByZXR1cm5zIHtBcnJheX0gUmV0dXJucyB0aGUgbmV3IG1hcHBlZCBhcnJheS5cbiAqL1xuZnVuY3Rpb24gYXJyYXlNYXAoYXJyYXksIGl0ZXJhdGVlKSB7XG4gIHZhciBpbmRleCA9IC0xLFxuICAgICAgbGVuZ3RoID0gYXJyYXkgPT0gbnVsbCA/IDAgOiBhcnJheS5sZW5ndGgsXG4gICAgICByZXN1bHQgPSBBcnJheShsZW5ndGgpO1xuXG4gIHdoaWxlICgrK2luZGV4IDwgbGVuZ3RoKSB7XG4gICAgcmVzdWx0W2luZGV4XSA9IGl0ZXJhdGVlKGFycmF5W2luZGV4XSwgaW5kZXgsIGFycmF5KTtcbiAgfVxuICByZXR1cm4gcmVzdWx0O1xufVxuXG5tb2R1bGUuZXhwb3J0cyA9IGFycmF5TWFwO1xuIiwKICAgICIvKipcbiAqIENoZWNrcyBpZiBhIGBjYWNoZWAgdmFsdWUgZm9yIGBrZXlgIGV4aXN0cy5cbiAqXG4gKiBAcHJpdmF0ZVxuICogQHBhcmFtIHtPYmplY3R9IGNhY2hlIFRoZSBjYWNoZSB0byBxdWVyeS5cbiAqIEBwYXJhbSB7c3RyaW5nfSBrZXkgVGhlIGtleSBvZiB0aGUgZW50cnkgdG8gY2hlY2suXG4gKiBAcmV0dXJucyB7Ym9vbGVhbn0gUmV0dXJucyBgdHJ1ZWAgaWYgYW4gZW50cnkgZm9yIGBrZXlgIGV4aXN0cywgZWxzZSBgZmFsc2VgLlxuICovXG5mdW5jdGlvbiBjYWNoZUhhcyhjYWNoZSwga2V5KSB7XG4gIHJldHVybiBjYWNoZS5oYXMoa2V5KTtcbn1cblxubW9kdWxlLmV4cG9ydHMgPSBjYWNoZUhhcztcbiIsCiAgICAidmFyIFNldENhY2hlID0gcmVxdWlyZSgnLi9fU2V0Q2FjaGUnKSxcbiAgICBhcnJheUluY2x1ZGVzID0gcmVxdWlyZSgnLi9fYXJyYXlJbmNsdWRlcycpLFxuICAgIGFycmF5SW5jbHVkZXNXaXRoID0gcmVxdWlyZSgnLi9fYXJyYXlJbmNsdWRlc1dpdGgnKSxcbiAgICBhcnJheU1hcCA9IHJlcXVpcmUoJy4vX2FycmF5TWFwJyksXG4gICAgYmFzZVVuYXJ5ID0gcmVxdWlyZSgnLi9fYmFzZVVuYXJ5JyksXG4gICAgY2FjaGVIYXMgPSByZXF1aXJlKCcuL19jYWNoZUhhcycpO1xuXG4vKiogVXNlZCBhcyB0aGUgc2l6ZSB0byBlbmFibGUgbGFyZ2UgYXJyYXkgb3B0aW1pemF0aW9ucy4gKi9cbnZhciBMQVJHRV9BUlJBWV9TSVpFID0gMjAwO1xuXG4vKipcbiAqIFRoZSBiYXNlIGltcGxlbWVudGF0aW9uIG9mIG1ldGhvZHMgbGlrZSBgXy5kaWZmZXJlbmNlYCB3aXRob3V0IHN1cHBvcnRcbiAqIGZvciBleGNsdWRpbmcgbXVsdGlwbGUgYXJyYXlzIG9yIGl0ZXJhdGVlIHNob3J0aGFuZHMuXG4gKlxuICogQHByaXZhdGVcbiAqIEBwYXJhbSB7QXJyYXl9IGFycmF5IFRoZSBhcnJheSB0byBpbnNwZWN0LlxuICogQHBhcmFtIHtBcnJheX0gdmFsdWVzIFRoZSB2YWx1ZXMgdG8gZXhjbHVkZS5cbiAqIEBwYXJhbSB7RnVuY3Rpb259IFtpdGVyYXRlZV0gVGhlIGl0ZXJhdGVlIGludm9rZWQgcGVyIGVsZW1lbnQuXG4gKiBAcGFyYW0ge0Z1bmN0aW9ufSBbY29tcGFyYXRvcl0gVGhlIGNvbXBhcmF0b3IgaW52b2tlZCBwZXIgZWxlbWVudC5cbiAqIEByZXR1cm5zIHtBcnJheX0gUmV0dXJucyB0aGUgbmV3IGFycmF5IG9mIGZpbHRlcmVkIHZhbHVlcy5cbiAqL1xuZnVuY3Rpb24gYmFzZURpZmZlcmVuY2UoYXJyYXksIHZhbHVlcywgaXRlcmF0ZWUsIGNvbXBhcmF0b3IpIHtcbiAgdmFyIGluZGV4ID0gLTEsXG4gICAgICBpbmNsdWRlcyA9IGFycmF5SW5jbHVkZXMsXG4gICAgICBpc0NvbW1vbiA9IHRydWUsXG4gICAgICBsZW5ndGggPSBhcnJheS5sZW5ndGgsXG4gICAgICByZXN1bHQgPSBbXSxcbiAgICAgIHZhbHVlc0xlbmd0aCA9IHZhbHVlcy5sZW5ndGg7XG5cbiAgaWYgKCFsZW5ndGgpIHtcbiAgICByZXR1cm4gcmVzdWx0O1xuICB9XG4gIGlmIChpdGVyYXRlZSkge1xuICAgIHZhbHVlcyA9IGFycmF5TWFwKHZhbHVlcywgYmFzZVVuYXJ5KGl0ZXJhdGVlKSk7XG4gIH1cbiAgaWYgKGNvbXBhcmF0b3IpIHtcbiAgICBpbmNsdWRlcyA9IGFycmF5SW5jbHVkZXNXaXRoO1xuICAgIGlzQ29tbW9uID0gZmFsc2U7XG4gIH1cbiAgZWxzZSBpZiAodmFsdWVzLmxlbmd0aCA+PSBMQVJHRV9BUlJBWV9TSVpFKSB7XG4gICAgaW5jbHVkZXMgPSBjYWNoZUhhcztcbiAgICBpc0NvbW1vbiA9IGZhbHNlO1xuICAgIHZhbHVlcyA9IG5ldyBTZXRDYWNoZSh2YWx1ZXMpO1xuICB9XG4gIG91dGVyOlxuICB3aGlsZSAoKytpbmRleCA8IGxlbmd0aCkge1xuICAgIHZhciB2YWx1ZSA9IGFycmF5W2luZGV4XSxcbiAgICAgICAgY29tcHV0ZWQgPSBpdGVyYXRlZSA9PSBudWxsID8gdmFsdWUgOiBpdGVyYXRlZSh2YWx1ZSk7XG5cbiAgICB2YWx1ZSA9IChjb21wYXJhdG9yIHx8IHZhbHVlICE9PSAwKSA/IHZhbHVlIDogMDtcbiAgICBpZiAoaXNDb21tb24gJiYgY29tcHV0ZWQgPT09IGNvbXB1dGVkKSB7XG4gICAgICB2YXIgdmFsdWVzSW5kZXggPSB2YWx1ZXNMZW5ndGg7XG4gICAgICB3aGlsZSAodmFsdWVzSW5kZXgtLSkge1xuICAgICAgICBpZiAodmFsdWVzW3ZhbHVlc0luZGV4XSA9PT0gY29tcHV0ZWQpIHtcbiAgICAgICAgICBjb250aW51ZSBvdXRlcjtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgcmVzdWx0LnB1c2godmFsdWUpO1xuICAgIH1cbiAgICBlbHNlIGlmICghaW5jbHVkZXModmFsdWVzLCBjb21wdXRlZCwgY29tcGFyYXRvcikpIHtcbiAgICAgIHJlc3VsdC5wdXNoKHZhbHVlKTtcbiAgICB9XG4gIH1cbiAgcmV0dXJuIHJlc3VsdDtcbn1cblxubW9kdWxlLmV4cG9ydHMgPSBiYXNlRGlmZmVyZW5jZTtcbiIsCiAgICAidmFyIGlzQXJyYXlMaWtlID0gcmVxdWlyZSgnLi9pc0FycmF5TGlrZScpLFxuICAgIGlzT2JqZWN0TGlrZSA9IHJlcXVpcmUoJy4vaXNPYmplY3RMaWtlJyk7XG5cbi8qKlxuICogVGhpcyBtZXRob2QgaXMgbGlrZSBgXy5pc0FycmF5TGlrZWAgZXhjZXB0IHRoYXQgaXQgYWxzbyBjaGVja3MgaWYgYHZhbHVlYFxuICogaXMgYW4gb2JqZWN0LlxuICpcbiAqIEBzdGF0aWNcbiAqIEBtZW1iZXJPZiBfXG4gKiBAc2luY2UgNC4wLjBcbiAqIEBjYXRlZ29yeSBMYW5nXG4gKiBAcGFyYW0geyp9IHZhbHVlIFRoZSB2YWx1ZSB0byBjaGVjay5cbiAqIEByZXR1cm5zIHtib29sZWFufSBSZXR1cm5zIGB0cnVlYCBpZiBgdmFsdWVgIGlzIGFuIGFycmF5LWxpa2Ugb2JqZWN0LFxuICogIGVsc2UgYGZhbHNlYC5cbiAqIEBleGFtcGxlXG4gKlxuICogXy5pc0FycmF5TGlrZU9iamVjdChbMSwgMiwgM10pO1xuICogLy8gPT4gdHJ1ZVxuICpcbiAqIF8uaXNBcnJheUxpa2VPYmplY3QoZG9jdW1lbnQuYm9keS5jaGlsZHJlbik7XG4gKiAvLyA9PiB0cnVlXG4gKlxuICogXy5pc0FycmF5TGlrZU9iamVjdCgnYWJjJyk7XG4gKiAvLyA9PiBmYWxzZVxuICpcbiAqIF8uaXNBcnJheUxpa2VPYmplY3QoXy5ub29wKTtcbiAqIC8vID0+IGZhbHNlXG4gKi9cbmZ1bmN0aW9uIGlzQXJyYXlMaWtlT2JqZWN0KHZhbHVlKSB7XG4gIHJldHVybiBpc09iamVjdExpa2UodmFsdWUpICYmIGlzQXJyYXlMaWtlKHZhbHVlKTtcbn1cblxubW9kdWxlLmV4cG9ydHMgPSBpc0FycmF5TGlrZU9iamVjdDtcbiIsCiAgICAidmFyIGJhc2VEaWZmZXJlbmNlID0gcmVxdWlyZSgnLi9fYmFzZURpZmZlcmVuY2UnKSxcbiAgICBiYXNlRmxhdHRlbiA9IHJlcXVpcmUoJy4vX2Jhc2VGbGF0dGVuJyksXG4gICAgYmFzZVJlc3QgPSByZXF1aXJlKCcuL19iYXNlUmVzdCcpLFxuICAgIGlzQXJyYXlMaWtlT2JqZWN0ID0gcmVxdWlyZSgnLi9pc0FycmF5TGlrZU9iamVjdCcpO1xuXG4vKipcbiAqIENyZWF0ZXMgYW4gYXJyYXkgb2YgYGFycmF5YCB2YWx1ZXMgbm90IGluY2x1ZGVkIGluIHRoZSBvdGhlciBnaXZlbiBhcnJheXNcbiAqIHVzaW5nIFtgU2FtZVZhbHVlWmVyb2BdKGh0dHA6Ly9lY21hLWludGVybmF0aW9uYWwub3JnL2VjbWEtMjYyLzcuMC8jc2VjLXNhbWV2YWx1ZXplcm8pXG4gKiBmb3IgZXF1YWxpdHkgY29tcGFyaXNvbnMuIFRoZSBvcmRlciBhbmQgcmVmZXJlbmNlcyBvZiByZXN1bHQgdmFsdWVzIGFyZVxuICogZGV0ZXJtaW5lZCBieSB0aGUgZmlyc3QgYXJyYXkuXG4gKlxuICogKipOb3RlOioqIFVubGlrZSBgXy5wdWxsQWxsYCwgdGhpcyBtZXRob2QgcmV0dXJucyBhIG5ldyBhcnJheS5cbiAqXG4gKiBAc3RhdGljXG4gKiBAbWVtYmVyT2YgX1xuICogQHNpbmNlIDAuMS4wXG4gKiBAY2F0ZWdvcnkgQXJyYXlcbiAqIEBwYXJhbSB7QXJyYXl9IGFycmF5IFRoZSBhcnJheSB0byBpbnNwZWN0LlxuICogQHBhcmFtIHsuLi5BcnJheX0gW3ZhbHVlc10gVGhlIHZhbHVlcyB0byBleGNsdWRlLlxuICogQHJldHVybnMge0FycmF5fSBSZXR1cm5zIHRoZSBuZXcgYXJyYXkgb2YgZmlsdGVyZWQgdmFsdWVzLlxuICogQHNlZSBfLndpdGhvdXQsIF8ueG9yXG4gKiBAZXhhbXBsZVxuICpcbiAqIF8uZGlmZmVyZW5jZShbMiwgMV0sIFsyLCAzXSk7XG4gKiAvLyA9PiBbMV1cbiAqL1xudmFyIGRpZmZlcmVuY2UgPSBiYXNlUmVzdChmdW5jdGlvbihhcnJheSwgdmFsdWVzKSB7XG4gIHJldHVybiBpc0FycmF5TGlrZU9iamVjdChhcnJheSlcbiAgICA/IGJhc2VEaWZmZXJlbmNlKGFycmF5LCBiYXNlRmxhdHRlbih2YWx1ZXMsIDEsIGlzQXJyYXlMaWtlT2JqZWN0LCB0cnVlKSlcbiAgICA6IFtdO1xufSk7XG5cbm1vZHVsZS5leHBvcnRzID0gZGlmZmVyZW5jZTtcbiIsCiAgICAidmFyIGdldE5hdGl2ZSA9IHJlcXVpcmUoJy4vX2dldE5hdGl2ZScpLFxuICAgIHJvb3QgPSByZXF1aXJlKCcuL19yb290Jyk7XG5cbi8qIEJ1aWx0LWluIG1ldGhvZCByZWZlcmVuY2VzIHRoYXQgYXJlIHZlcmlmaWVkIHRvIGJlIG5hdGl2ZS4gKi9cbnZhciBTZXQgPSBnZXROYXRpdmUocm9vdCwgJ1NldCcpO1xuXG5tb2R1bGUuZXhwb3J0cyA9IFNldDtcbiIsCiAgICAiLyoqXG4gKiBUaGlzIG1ldGhvZCByZXR1cm5zIGB1bmRlZmluZWRgLlxuICpcbiAqIEBzdGF0aWNcbiAqIEBtZW1iZXJPZiBfXG4gKiBAc2luY2UgMi4zLjBcbiAqIEBjYXRlZ29yeSBVdGlsXG4gKiBAZXhhbXBsZVxuICpcbiAqIF8udGltZXMoMiwgXy5ub29wKTtcbiAqIC8vID0+IFt1bmRlZmluZWQsIHVuZGVmaW5lZF1cbiAqL1xuZnVuY3Rpb24gbm9vcCgpIHtcbiAgLy8gTm8gb3BlcmF0aW9uIHBlcmZvcm1lZC5cbn1cblxubW9kdWxlLmV4cG9ydHMgPSBub29wO1xuIiwKICAgICIvKipcbiAqIENvbnZlcnRzIGBzZXRgIHRvIGFuIGFycmF5IG9mIGl0cyB2YWx1ZXMuXG4gKlxuICogQHByaXZhdGVcbiAqIEBwYXJhbSB7T2JqZWN0fSBzZXQgVGhlIHNldCB0byBjb252ZXJ0LlxuICogQHJldHVybnMge0FycmF5fSBSZXR1cm5zIHRoZSB2YWx1ZXMuXG4gKi9cbmZ1bmN0aW9uIHNldFRvQXJyYXkoc2V0KSB7XG4gIHZhciBpbmRleCA9IC0xLFxuICAgICAgcmVzdWx0ID0gQXJyYXkoc2V0LnNpemUpO1xuXG4gIHNldC5mb3JFYWNoKGZ1bmN0aW9uKHZhbHVlKSB7XG4gICAgcmVzdWx0WysraW5kZXhdID0gdmFsdWU7XG4gIH0pO1xuICByZXR1cm4gcmVzdWx0O1xufVxuXG5tb2R1bGUuZXhwb3J0cyA9IHNldFRvQXJyYXk7XG4iLAogICAgInZhciBTZXQgPSByZXF1aXJlKCcuL19TZXQnKSxcbiAgICBub29wID0gcmVxdWlyZSgnLi9ub29wJyksXG4gICAgc2V0VG9BcnJheSA9IHJlcXVpcmUoJy4vX3NldFRvQXJyYXknKTtcblxuLyoqIFVzZWQgYXMgcmVmZXJlbmNlcyBmb3IgdmFyaW91cyBgTnVtYmVyYCBjb25zdGFudHMuICovXG52YXIgSU5GSU5JVFkgPSAxIC8gMDtcblxuLyoqXG4gKiBDcmVhdGVzIGEgc2V0IG9iamVjdCBvZiBgdmFsdWVzYC5cbiAqXG4gKiBAcHJpdmF0ZVxuICogQHBhcmFtIHtBcnJheX0gdmFsdWVzIFRoZSB2YWx1ZXMgdG8gYWRkIHRvIHRoZSBzZXQuXG4gKiBAcmV0dXJucyB7T2JqZWN0fSBSZXR1cm5zIHRoZSBuZXcgc2V0LlxuICovXG52YXIgY3JlYXRlU2V0ID0gIShTZXQgJiYgKDEgLyBzZXRUb0FycmF5KG5ldyBTZXQoWywtMF0pKVsxXSkgPT0gSU5GSU5JVFkpID8gbm9vcCA6IGZ1bmN0aW9uKHZhbHVlcykge1xuICByZXR1cm4gbmV3IFNldCh2YWx1ZXMpO1xufTtcblxubW9kdWxlLmV4cG9ydHMgPSBjcmVhdGVTZXQ7XG4iLAogICAgInZhciBTZXRDYWNoZSA9IHJlcXVpcmUoJy4vX1NldENhY2hlJyksXG4gICAgYXJyYXlJbmNsdWRlcyA9IHJlcXVpcmUoJy4vX2FycmF5SW5jbHVkZXMnKSxcbiAgICBhcnJheUluY2x1ZGVzV2l0aCA9IHJlcXVpcmUoJy4vX2FycmF5SW5jbHVkZXNXaXRoJyksXG4gICAgY2FjaGVIYXMgPSByZXF1aXJlKCcuL19jYWNoZUhhcycpLFxuICAgIGNyZWF0ZVNldCA9IHJlcXVpcmUoJy4vX2NyZWF0ZVNldCcpLFxuICAgIHNldFRvQXJyYXkgPSByZXF1aXJlKCcuL19zZXRUb0FycmF5Jyk7XG5cbi8qKiBVc2VkIGFzIHRoZSBzaXplIHRvIGVuYWJsZSBsYXJnZSBhcnJheSBvcHRpbWl6YXRpb25zLiAqL1xudmFyIExBUkdFX0FSUkFZX1NJWkUgPSAyMDA7XG5cbi8qKlxuICogVGhlIGJhc2UgaW1wbGVtZW50YXRpb24gb2YgYF8udW5pcUJ5YCB3aXRob3V0IHN1cHBvcnQgZm9yIGl0ZXJhdGVlIHNob3J0aGFuZHMuXG4gKlxuICogQHByaXZhdGVcbiAqIEBwYXJhbSB7QXJyYXl9IGFycmF5IFRoZSBhcnJheSB0byBpbnNwZWN0LlxuICogQHBhcmFtIHtGdW5jdGlvbn0gW2l0ZXJhdGVlXSBUaGUgaXRlcmF0ZWUgaW52b2tlZCBwZXIgZWxlbWVudC5cbiAqIEBwYXJhbSB7RnVuY3Rpb259IFtjb21wYXJhdG9yXSBUaGUgY29tcGFyYXRvciBpbnZva2VkIHBlciBlbGVtZW50LlxuICogQHJldHVybnMge0FycmF5fSBSZXR1cm5zIHRoZSBuZXcgZHVwbGljYXRlIGZyZWUgYXJyYXkuXG4gKi9cbmZ1bmN0aW9uIGJhc2VVbmlxKGFycmF5LCBpdGVyYXRlZSwgY29tcGFyYXRvcikge1xuICB2YXIgaW5kZXggPSAtMSxcbiAgICAgIGluY2x1ZGVzID0gYXJyYXlJbmNsdWRlcyxcbiAgICAgIGxlbmd0aCA9IGFycmF5Lmxlbmd0aCxcbiAgICAgIGlzQ29tbW9uID0gdHJ1ZSxcbiAgICAgIHJlc3VsdCA9IFtdLFxuICAgICAgc2VlbiA9IHJlc3VsdDtcblxuICBpZiAoY29tcGFyYXRvcikge1xuICAgIGlzQ29tbW9uID0gZmFsc2U7XG4gICAgaW5jbHVkZXMgPSBhcnJheUluY2x1ZGVzV2l0aDtcbiAgfVxuICBlbHNlIGlmIChsZW5ndGggPj0gTEFSR0VfQVJSQVlfU0laRSkge1xuICAgIHZhciBzZXQgPSBpdGVyYXRlZSA/IG51bGwgOiBjcmVhdGVTZXQoYXJyYXkpO1xuICAgIGlmIChzZXQpIHtcbiAgICAgIHJldHVybiBzZXRUb0FycmF5KHNldCk7XG4gICAgfVxuICAgIGlzQ29tbW9uID0gZmFsc2U7XG4gICAgaW5jbHVkZXMgPSBjYWNoZUhhcztcbiAgICBzZWVuID0gbmV3IFNldENhY2hlO1xuICB9XG4gIGVsc2Uge1xuICAgIHNlZW4gPSBpdGVyYXRlZSA/IFtdIDogcmVzdWx0O1xuICB9XG4gIG91dGVyOlxuICB3aGlsZSAoKytpbmRleCA8IGxlbmd0aCkge1xuICAgIHZhciB2YWx1ZSA9IGFycmF5W2luZGV4XSxcbiAgICAgICAgY29tcHV0ZWQgPSBpdGVyYXRlZSA/IGl0ZXJhdGVlKHZhbHVlKSA6IHZhbHVlO1xuXG4gICAgdmFsdWUgPSAoY29tcGFyYXRvciB8fCB2YWx1ZSAhPT0gMCkgPyB2YWx1ZSA6IDA7XG4gICAgaWYgKGlzQ29tbW9uICYmIGNvbXB1dGVkID09PSBjb21wdXRlZCkge1xuICAgICAgdmFyIHNlZW5JbmRleCA9IHNlZW4ubGVuZ3RoO1xuICAgICAgd2hpbGUgKHNlZW5JbmRleC0tKSB7XG4gICAgICAgIGlmIChzZWVuW3NlZW5JbmRleF0gPT09IGNvbXB1dGVkKSB7XG4gICAgICAgICAgY29udGludWUgb3V0ZXI7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIGlmIChpdGVyYXRlZSkge1xuICAgICAgICBzZWVuLnB1c2goY29tcHV0ZWQpO1xuICAgICAgfVxuICAgICAgcmVzdWx0LnB1c2godmFsdWUpO1xuICAgIH1cbiAgICBlbHNlIGlmICghaW5jbHVkZXMoc2VlbiwgY29tcHV0ZWQsIGNvbXBhcmF0b3IpKSB7XG4gICAgICBpZiAoc2VlbiAhPT0gcmVzdWx0KSB7XG4gICAgICAgIHNlZW4ucHVzaChjb21wdXRlZCk7XG4gICAgICB9XG4gICAgICByZXN1bHQucHVzaCh2YWx1ZSk7XG4gICAgfVxuICB9XG4gIHJldHVybiByZXN1bHQ7XG59XG5cbm1vZHVsZS5leHBvcnRzID0gYmFzZVVuaXE7XG4iLAogICAgInZhciBiYXNlRmxhdHRlbiA9IHJlcXVpcmUoJy4vX2Jhc2VGbGF0dGVuJyksXG4gICAgYmFzZVJlc3QgPSByZXF1aXJlKCcuL19iYXNlUmVzdCcpLFxuICAgIGJhc2VVbmlxID0gcmVxdWlyZSgnLi9fYmFzZVVuaXEnKSxcbiAgICBpc0FycmF5TGlrZU9iamVjdCA9IHJlcXVpcmUoJy4vaXNBcnJheUxpa2VPYmplY3QnKTtcblxuLyoqXG4gKiBDcmVhdGVzIGFuIGFycmF5IG9mIHVuaXF1ZSB2YWx1ZXMsIGluIG9yZGVyLCBmcm9tIGFsbCBnaXZlbiBhcnJheXMgdXNpbmdcbiAqIFtgU2FtZVZhbHVlWmVyb2BdKGh0dHA6Ly9lY21hLWludGVybmF0aW9uYWwub3JnL2VjbWEtMjYyLzcuMC8jc2VjLXNhbWV2YWx1ZXplcm8pXG4gKiBmb3IgZXF1YWxpdHkgY29tcGFyaXNvbnMuXG4gKlxuICogQHN0YXRpY1xuICogQG1lbWJlck9mIF9cbiAqIEBzaW5jZSAwLjEuMFxuICogQGNhdGVnb3J5IEFycmF5XG4gKiBAcGFyYW0gey4uLkFycmF5fSBbYXJyYXlzXSBUaGUgYXJyYXlzIHRvIGluc3BlY3QuXG4gKiBAcmV0dXJucyB7QXJyYXl9IFJldHVybnMgdGhlIG5ldyBhcnJheSBvZiBjb21iaW5lZCB2YWx1ZXMuXG4gKiBAZXhhbXBsZVxuICpcbiAqIF8udW5pb24oWzJdLCBbMSwgMl0pO1xuICogLy8gPT4gWzIsIDFdXG4gKi9cbnZhciB1bmlvbiA9IGJhc2VSZXN0KGZ1bmN0aW9uKGFycmF5cykge1xuICByZXR1cm4gYmFzZVVuaXEoYmFzZUZsYXR0ZW4oYXJyYXlzLCAxLCBpc0FycmF5TGlrZU9iamVjdCwgdHJ1ZSkpO1xufSk7XG5cbm1vZHVsZS5leHBvcnRzID0gdW5pb247XG4iLAogICAgIi8qKlxuICogQ3JlYXRlcyBhIHVuYXJ5IGZ1bmN0aW9uIHRoYXQgaW52b2tlcyBgZnVuY2Agd2l0aCBpdHMgYXJndW1lbnQgdHJhbnNmb3JtZWQuXG4gKlxuICogQHByaXZhdGVcbiAqIEBwYXJhbSB7RnVuY3Rpb259IGZ1bmMgVGhlIGZ1bmN0aW9uIHRvIHdyYXAuXG4gKiBAcGFyYW0ge0Z1bmN0aW9ufSB0cmFuc2Zvcm0gVGhlIGFyZ3VtZW50IHRyYW5zZm9ybS5cbiAqIEByZXR1cm5zIHtGdW5jdGlvbn0gUmV0dXJucyB0aGUgbmV3IGZ1bmN0aW9uLlxuICovXG5mdW5jdGlvbiBvdmVyQXJnKGZ1bmMsIHRyYW5zZm9ybSkge1xuICByZXR1cm4gZnVuY3Rpb24oYXJnKSB7XG4gICAgcmV0dXJuIGZ1bmModHJhbnNmb3JtKGFyZykpO1xuICB9O1xufVxuXG5tb2R1bGUuZXhwb3J0cyA9IG92ZXJBcmc7XG4iLAogICAgInZhciBvdmVyQXJnID0gcmVxdWlyZSgnLi9fb3ZlckFyZycpO1xuXG4vKiogQnVpbHQtaW4gdmFsdWUgcmVmZXJlbmNlcy4gKi9cbnZhciBnZXRQcm90b3R5cGUgPSBvdmVyQXJnKE9iamVjdC5nZXRQcm90b3R5cGVPZiwgT2JqZWN0KTtcblxubW9kdWxlLmV4cG9ydHMgPSBnZXRQcm90b3R5cGU7XG4iLAogICAgInZhciBiYXNlR2V0VGFnID0gcmVxdWlyZSgnLi9fYmFzZUdldFRhZycpLFxuICAgIGdldFByb3RvdHlwZSA9IHJlcXVpcmUoJy4vX2dldFByb3RvdHlwZScpLFxuICAgIGlzT2JqZWN0TGlrZSA9IHJlcXVpcmUoJy4vaXNPYmplY3RMaWtlJyk7XG5cbi8qKiBgT2JqZWN0I3RvU3RyaW5nYCByZXN1bHQgcmVmZXJlbmNlcy4gKi9cbnZhciBvYmplY3RUYWcgPSAnW29iamVjdCBPYmplY3RdJztcblxuLyoqIFVzZWQgZm9yIGJ1aWx0LWluIG1ldGhvZCByZWZlcmVuY2VzLiAqL1xudmFyIGZ1bmNQcm90byA9IEZ1bmN0aW9uLnByb3RvdHlwZSxcbiAgICBvYmplY3RQcm90byA9IE9iamVjdC5wcm90b3R5cGU7XG5cbi8qKiBVc2VkIHRvIHJlc29sdmUgdGhlIGRlY29tcGlsZWQgc291cmNlIG9mIGZ1bmN0aW9ucy4gKi9cbnZhciBmdW5jVG9TdHJpbmcgPSBmdW5jUHJvdG8udG9TdHJpbmc7XG5cbi8qKiBVc2VkIHRvIGNoZWNrIG9iamVjdHMgZm9yIG93biBwcm9wZXJ0aWVzLiAqL1xudmFyIGhhc093blByb3BlcnR5ID0gb2JqZWN0UHJvdG8uaGFzT3duUHJvcGVydHk7XG5cbi8qKiBVc2VkIHRvIGluZmVyIHRoZSBgT2JqZWN0YCBjb25zdHJ1Y3Rvci4gKi9cbnZhciBvYmplY3RDdG9yU3RyaW5nID0gZnVuY1RvU3RyaW5nLmNhbGwoT2JqZWN0KTtcblxuLyoqXG4gKiBDaGVja3MgaWYgYHZhbHVlYCBpcyBhIHBsYWluIG9iamVjdCwgdGhhdCBpcywgYW4gb2JqZWN0IGNyZWF0ZWQgYnkgdGhlXG4gKiBgT2JqZWN0YCBjb25zdHJ1Y3RvciBvciBvbmUgd2l0aCBhIGBbW1Byb3RvdHlwZV1dYCBvZiBgbnVsbGAuXG4gKlxuICogQHN0YXRpY1xuICogQG1lbWJlck9mIF9cbiAqIEBzaW5jZSAwLjguMFxuICogQGNhdGVnb3J5IExhbmdcbiAqIEBwYXJhbSB7Kn0gdmFsdWUgVGhlIHZhbHVlIHRvIGNoZWNrLlxuICogQHJldHVybnMge2Jvb2xlYW59IFJldHVybnMgYHRydWVgIGlmIGB2YWx1ZWAgaXMgYSBwbGFpbiBvYmplY3QsIGVsc2UgYGZhbHNlYC5cbiAqIEBleGFtcGxlXG4gKlxuICogZnVuY3Rpb24gRm9vKCkge1xuICogICB0aGlzLmEgPSAxO1xuICogfVxuICpcbiAqIF8uaXNQbGFpbk9iamVjdChuZXcgRm9vKTtcbiAqIC8vID0+IGZhbHNlXG4gKlxuICogXy5pc1BsYWluT2JqZWN0KFsxLCAyLCAzXSk7XG4gKiAvLyA9PiBmYWxzZVxuICpcbiAqIF8uaXNQbGFpbk9iamVjdCh7ICd4JzogMCwgJ3knOiAwIH0pO1xuICogLy8gPT4gdHJ1ZVxuICpcbiAqIF8uaXNQbGFpbk9iamVjdChPYmplY3QuY3JlYXRlKG51bGwpKTtcbiAqIC8vID0+IHRydWVcbiAqL1xuZnVuY3Rpb24gaXNQbGFpbk9iamVjdCh2YWx1ZSkge1xuICBpZiAoIWlzT2JqZWN0TGlrZSh2YWx1ZSkgfHwgYmFzZUdldFRhZyh2YWx1ZSkgIT0gb2JqZWN0VGFnKSB7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG4gIHZhciBwcm90byA9IGdldFByb3RvdHlwZSh2YWx1ZSk7XG4gIGlmIChwcm90byA9PT0gbnVsbCkge1xuICAgIHJldHVybiB0cnVlO1xuICB9XG4gIHZhciBDdG9yID0gaGFzT3duUHJvcGVydHkuY2FsbChwcm90bywgJ2NvbnN0cnVjdG9yJykgJiYgcHJvdG8uY29uc3RydWN0b3I7XG4gIHJldHVybiB0eXBlb2YgQ3RvciA9PSAnZnVuY3Rpb24nICYmIEN0b3IgaW5zdGFuY2VvZiBDdG9yICYmXG4gICAgZnVuY1RvU3RyaW5nLmNhbGwoQ3RvcikgPT0gb2JqZWN0Q3RvclN0cmluZztcbn1cblxubW9kdWxlLmV4cG9ydHMgPSBpc1BsYWluT2JqZWN0O1xuIiwKICAgICJcInVzZSBzdHJpY3RcIjtcbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIl9fZXNNb2R1bGVcIiwgeyB2YWx1ZTogdHJ1ZSB9KTtcbmV4cG9ydHMuYXNzZXJ0VmFsaWRQYXR0ZXJuID0gdm9pZCAwO1xuY29uc3QgTUFYX1BBVFRFUk5fTEVOR1RIID0gMTAyNCAqIDY0O1xuY29uc3QgYXNzZXJ0VmFsaWRQYXR0ZXJuID0gKHBhdHRlcm4pID0+IHtcbiAgICBpZiAodHlwZW9mIHBhdHRlcm4gIT09ICdzdHJpbmcnKSB7XG4gICAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoJ2ludmFsaWQgcGF0dGVybicpO1xuICAgIH1cbiAgICBpZiAocGF0dGVybi5sZW5ndGggPiBNQVhfUEFUVEVSTl9MRU5HVEgpIHtcbiAgICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcigncGF0dGVybiBpcyB0b28gbG9uZycpO1xuICAgIH1cbn07XG5leHBvcnRzLmFzc2VydFZhbGlkUGF0dGVybiA9IGFzc2VydFZhbGlkUGF0dGVybjtcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPWFzc2VydC12YWxpZC1wYXR0ZXJuLmpzLm1hcCIsCiAgICAiXCJ1c2Ugc3RyaWN0XCI7XG4vLyB0cmFuc2xhdGUgdGhlIHZhcmlvdXMgcG9zaXggY2hhcmFjdGVyIGNsYXNzZXMgaW50byB1bmljb2RlIHByb3BlcnRpZXNcbi8vIHRoaXMgd29ya3MgYWNyb3NzIGFsbCB1bmljb2RlIGxvY2FsZXNcbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIl9fZXNNb2R1bGVcIiwgeyB2YWx1ZTogdHJ1ZSB9KTtcbmV4cG9ydHMucGFyc2VDbGFzcyA9IHZvaWQgMDtcbi8vIHsgPHBvc2l4IGNsYXNzPjogWzx0cmFuc2xhdGlvbj4sIC91IGZsYWcgcmVxdWlyZWQsIG5lZ2F0ZWRdXG5jb25zdCBwb3NpeENsYXNzZXMgPSB7XG4gICAgJ1s6YWxudW06XSc6IFsnXFxcXHB7TH1cXFxccHtObH1cXFxccHtOZH0nLCB0cnVlXSxcbiAgICAnWzphbHBoYTpdJzogWydcXFxccHtMfVxcXFxwe05sfScsIHRydWVdLFxuICAgICdbOmFzY2lpOl0nOiBbJ1xcXFx4JyArICcwMC1cXFxceCcgKyAnN2YnLCBmYWxzZV0sXG4gICAgJ1s6Ymxhbms6XSc6IFsnXFxcXHB7WnN9XFxcXHQnLCB0cnVlXSxcbiAgICAnWzpjbnRybDpdJzogWydcXFxccHtDY30nLCB0cnVlXSxcbiAgICAnWzpkaWdpdDpdJzogWydcXFxccHtOZH0nLCB0cnVlXSxcbiAgICAnWzpncmFwaDpdJzogWydcXFxccHtafVxcXFxwe0N9JywgdHJ1ZSwgdHJ1ZV0sXG4gICAgJ1s6bG93ZXI6XSc6IFsnXFxcXHB7TGx9JywgdHJ1ZV0sXG4gICAgJ1s6cHJpbnQ6XSc6IFsnXFxcXHB7Q30nLCB0cnVlXSxcbiAgICAnWzpwdW5jdDpdJzogWydcXFxccHtQfScsIHRydWVdLFxuICAgICdbOnNwYWNlOl0nOiBbJ1xcXFxwe1p9XFxcXHRcXFxcclxcXFxuXFxcXHZcXFxcZicsIHRydWVdLFxuICAgICdbOnVwcGVyOl0nOiBbJ1xcXFxwe0x1fScsIHRydWVdLFxuICAgICdbOndvcmQ6XSc6IFsnXFxcXHB7TH1cXFxccHtObH1cXFxccHtOZH1cXFxccHtQY30nLCB0cnVlXSxcbiAgICAnWzp4ZGlnaXQ6XSc6IFsnQS1GYS1mMC05JywgZmFsc2VdLFxufTtcbi8vIG9ubHkgbmVlZCB0byBlc2NhcGUgYSBmZXcgdGhpbmdzIGluc2lkZSBvZiBicmFjZSBleHByZXNzaW9uc1xuLy8gZXNjYXBlczogWyBcXCBdIC1cbmNvbnN0IGJyYWNlRXNjYXBlID0gKHMpID0+IHMucmVwbGFjZSgvW1tcXF1cXFxcLV0vZywgJ1xcXFwkJicpO1xuLy8gZXNjYXBlIGFsbCByZWdleHAgbWFnaWMgY2hhcmFjdGVyc1xuY29uc3QgcmVnZXhwRXNjYXBlID0gKHMpID0+IHMucmVwbGFjZSgvWy1bXFxde30oKSorPy4sXFxcXF4kfCNcXHNdL2csICdcXFxcJCYnKTtcbi8vIGV2ZXJ5dGhpbmcgaGFzIGFscmVhZHkgYmVlbiBlc2NhcGVkLCB3ZSBqdXN0IGhhdmUgdG8gam9pblxuY29uc3QgcmFuZ2VzVG9TdHJpbmcgPSAocmFuZ2VzKSA9PiByYW5nZXMuam9pbignJyk7XG4vLyB0YWtlcyBhIGdsb2Igc3RyaW5nIGF0IGEgcG9zaXggYnJhY2UgZXhwcmVzc2lvbiwgYW5kIHJldHVybnNcbi8vIGFuIGVxdWl2YWxlbnQgcmVndWxhciBleHByZXNzaW9uIHNvdXJjZSwgYW5kIGJvb2xlYW4gaW5kaWNhdGluZ1xuLy8gd2hldGhlciB0aGUgL3UgZmxhZyBuZWVkcyB0byBiZSBhcHBsaWVkLCBhbmQgdGhlIG51bWJlciBvZiBjaGFyc1xuLy8gY29uc3VtZWQgdG8gcGFyc2UgdGhlIGNoYXJhY3RlciBjbGFzcy5cbi8vIFRoaXMgYWxzbyByZW1vdmVzIG91dCBvZiBvcmRlciByYW5nZXMsIGFuZCByZXR1cm5zICgkLikgaWYgdGhlXG4vLyBlbnRpcmUgY2xhc3MganVzdCBubyBnb29kLlxuY29uc3QgcGFyc2VDbGFzcyA9IChnbG9iLCBwb3NpdGlvbikgPT4ge1xuICAgIGNvbnN0IHBvcyA9IHBvc2l0aW9uO1xuICAgIC8qIGM4IGlnbm9yZSBzdGFydCAqL1xuICAgIGlmIChnbG9iLmNoYXJBdChwb3MpICE9PSAnWycpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdub3QgaW4gYSBicmFjZSBleHByZXNzaW9uJyk7XG4gICAgfVxuICAgIC8qIGM4IGlnbm9yZSBzdG9wICovXG4gICAgY29uc3QgcmFuZ2VzID0gW107XG4gICAgY29uc3QgbmVncyA9IFtdO1xuICAgIGxldCBpID0gcG9zICsgMTtcbiAgICBsZXQgc2F3U3RhcnQgPSBmYWxzZTtcbiAgICBsZXQgdWZsYWcgPSBmYWxzZTtcbiAgICBsZXQgZXNjYXBpbmcgPSBmYWxzZTtcbiAgICBsZXQgbmVnYXRlID0gZmFsc2U7XG4gICAgbGV0IGVuZFBvcyA9IHBvcztcbiAgICBsZXQgcmFuZ2VTdGFydCA9ICcnO1xuICAgIFdISUxFOiB3aGlsZSAoaSA8IGdsb2IubGVuZ3RoKSB7XG4gICAgICAgIGNvbnN0IGMgPSBnbG9iLmNoYXJBdChpKTtcbiAgICAgICAgaWYgKChjID09PSAnIScgfHwgYyA9PT0gJ14nKSAmJiBpID09PSBwb3MgKyAxKSB7XG4gICAgICAgICAgICBuZWdhdGUgPSB0cnVlO1xuICAgICAgICAgICAgaSsrO1xuICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGMgPT09ICddJyAmJiBzYXdTdGFydCAmJiAhZXNjYXBpbmcpIHtcbiAgICAgICAgICAgIGVuZFBvcyA9IGkgKyAxO1xuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cbiAgICAgICAgc2F3U3RhcnQgPSB0cnVlO1xuICAgICAgICBpZiAoYyA9PT0gJ1xcXFwnKSB7XG4gICAgICAgICAgICBpZiAoIWVzY2FwaW5nKSB7XG4gICAgICAgICAgICAgICAgZXNjYXBpbmcgPSB0cnVlO1xuICAgICAgICAgICAgICAgIGkrKztcbiAgICAgICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIC8vIGVzY2FwZWQgXFwgY2hhciwgZmFsbCB0aHJvdWdoIGFuZCB0cmVhdCBsaWtlIG5vcm1hbCBjaGFyXG4gICAgICAgIH1cbiAgICAgICAgaWYgKGMgPT09ICdbJyAmJiAhZXNjYXBpbmcpIHtcbiAgICAgICAgICAgIC8vIGVpdGhlciBhIHBvc2l4IGNsYXNzLCBhIGNvbGxhdGlvbiBlcXVpdmFsZW50LCBvciBqdXN0IGEgW1xuICAgICAgICAgICAgZm9yIChjb25zdCBbY2xzLCBbdW5pcCwgdSwgbmVnXV0gb2YgT2JqZWN0LmVudHJpZXMocG9zaXhDbGFzc2VzKSkge1xuICAgICAgICAgICAgICAgIGlmIChnbG9iLnN0YXJ0c1dpdGgoY2xzLCBpKSkge1xuICAgICAgICAgICAgICAgICAgICAvLyBpbnZhbGlkLCBbYS1bXSBpcyBmaW5lLCBidXQgbm90IFthLVs6YWxwaGFdXVxuICAgICAgICAgICAgICAgICAgICBpZiAocmFuZ2VTdGFydCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFsnJC4nLCBmYWxzZSwgZ2xvYi5sZW5ndGggLSBwb3MsIHRydWVdO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIGkgKz0gY2xzLmxlbmd0aDtcbiAgICAgICAgICAgICAgICAgICAgaWYgKG5lZylcbiAgICAgICAgICAgICAgICAgICAgICAgIG5lZ3MucHVzaCh1bmlwKTtcbiAgICAgICAgICAgICAgICAgICAgZWxzZVxuICAgICAgICAgICAgICAgICAgICAgICAgcmFuZ2VzLnB1c2godW5pcCk7XG4gICAgICAgICAgICAgICAgICAgIHVmbGFnID0gdWZsYWcgfHwgdTtcbiAgICAgICAgICAgICAgICAgICAgY29udGludWUgV0hJTEU7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIC8vIG5vdyBpdCdzIGp1c3QgYSBub3JtYWwgY2hhcmFjdGVyLCBlZmZlY3RpdmVseVxuICAgICAgICBlc2NhcGluZyA9IGZhbHNlO1xuICAgICAgICBpZiAocmFuZ2VTdGFydCkge1xuICAgICAgICAgICAgLy8gdGhyb3cgdGhpcyByYW5nZSBhd2F5IGlmIGl0J3Mgbm90IHZhbGlkLCBidXQgb3RoZXJzXG4gICAgICAgICAgICAvLyBjYW4gc3RpbGwgbWF0Y2guXG4gICAgICAgICAgICBpZiAoYyA+IHJhbmdlU3RhcnQpIHtcbiAgICAgICAgICAgICAgICByYW5nZXMucHVzaChicmFjZUVzY2FwZShyYW5nZVN0YXJ0KSArICctJyArIGJyYWNlRXNjYXBlKGMpKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2UgaWYgKGMgPT09IHJhbmdlU3RhcnQpIHtcbiAgICAgICAgICAgICAgICByYW5nZXMucHVzaChicmFjZUVzY2FwZShjKSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByYW5nZVN0YXJ0ID0gJyc7XG4gICAgICAgICAgICBpKys7XG4gICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgfVxuICAgICAgICAvLyBub3cgbWlnaHQgYmUgdGhlIHN0YXJ0IG9mIGEgcmFuZ2UuXG4gICAgICAgIC8vIGNhbiBiZSBlaXRoZXIgYy1kIG9yIGMtXSBvciBjPG1vcmUuLi4+XSBvciBjXSBhdCB0aGlzIHBvaW50XG4gICAgICAgIGlmIChnbG9iLnN0YXJ0c1dpdGgoJy1dJywgaSArIDEpKSB7XG4gICAgICAgICAgICByYW5nZXMucHVzaChicmFjZUVzY2FwZShjICsgJy0nKSk7XG4gICAgICAgICAgICBpICs9IDI7XG4gICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoZ2xvYi5zdGFydHNXaXRoKCctJywgaSArIDEpKSB7XG4gICAgICAgICAgICByYW5nZVN0YXJ0ID0gYztcbiAgICAgICAgICAgIGkgKz0gMjtcbiAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICB9XG4gICAgICAgIC8vIG5vdCB0aGUgc3RhcnQgb2YgYSByYW5nZSwganVzdCBhIHNpbmdsZSBjaGFyYWN0ZXJcbiAgICAgICAgcmFuZ2VzLnB1c2goYnJhY2VFc2NhcGUoYykpO1xuICAgICAgICBpKys7XG4gICAgfVxuICAgIGlmIChlbmRQb3MgPCBpKSB7XG4gICAgICAgIC8vIGRpZG4ndCBzZWUgdGhlIGVuZCBvZiB0aGUgY2xhc3MsIG5vdCBhIHZhbGlkIGNsYXNzLFxuICAgICAgICAvLyBidXQgbWlnaHQgc3RpbGwgYmUgdmFsaWQgYXMgYSBsaXRlcmFsIG1hdGNoLlxuICAgICAgICByZXR1cm4gWycnLCBmYWxzZSwgMCwgZmFsc2VdO1xuICAgIH1cbiAgICAvLyBpZiB3ZSBnb3Qgbm8gcmFuZ2VzIGFuZCBubyBuZWdhdGVzLCB0aGVuIHdlIGhhdmUgYSByYW5nZSB0aGF0XG4gICAgLy8gY2Fubm90IHBvc3NpYmx5IG1hdGNoIGFueXRoaW5nLCBhbmQgdGhhdCBwb2lzb25zIHRoZSB3aG9sZSBnbG9iXG4gICAgaWYgKCFyYW5nZXMubGVuZ3RoICYmICFuZWdzLmxlbmd0aCkge1xuICAgICAgICByZXR1cm4gWyckLicsIGZhbHNlLCBnbG9iLmxlbmd0aCAtIHBvcywgdHJ1ZV07XG4gICAgfVxuICAgIC8vIGlmIHdlIGdvdCBvbmUgcG9zaXRpdmUgcmFuZ2UsIGFuZCBpdCdzIGEgc2luZ2xlIGNoYXJhY3RlciwgdGhlbiB0aGF0J3NcbiAgICAvLyBub3QgYWN0dWFsbHkgYSBtYWdpYyBwYXR0ZXJuLCBpdCdzIGp1c3QgdGhhdCBvbmUgbGl0ZXJhbCBjaGFyYWN0ZXIuXG4gICAgLy8gd2Ugc2hvdWxkIG5vdCB0cmVhdCB0aGF0IGFzIFwibWFnaWNcIiwgd2Ugc2hvdWxkIGp1c3QgcmV0dXJuIHRoZSBsaXRlcmFsXG4gICAgLy8gY2hhcmFjdGVyLiBbX10gaXMgYSBwZXJmZWN0bHkgdmFsaWQgd2F5IHRvIGVzY2FwZSBnbG9iIG1hZ2ljIGNoYXJzLlxuICAgIGlmIChuZWdzLmxlbmd0aCA9PT0gMCAmJlxuICAgICAgICByYW5nZXMubGVuZ3RoID09PSAxICYmXG4gICAgICAgIC9eXFxcXD8uJC8udGVzdChyYW5nZXNbMF0pICYmXG4gICAgICAgICFuZWdhdGUpIHtcbiAgICAgICAgY29uc3QgciA9IHJhbmdlc1swXS5sZW5ndGggPT09IDIgPyByYW5nZXNbMF0uc2xpY2UoLTEpIDogcmFuZ2VzWzBdO1xuICAgICAgICByZXR1cm4gW3JlZ2V4cEVzY2FwZShyKSwgZmFsc2UsIGVuZFBvcyAtIHBvcywgZmFsc2VdO1xuICAgIH1cbiAgICBjb25zdCBzcmFuZ2VzID0gJ1snICsgKG5lZ2F0ZSA/ICdeJyA6ICcnKSArIHJhbmdlc1RvU3RyaW5nKHJhbmdlcykgKyAnXSc7XG4gICAgY29uc3Qgc25lZ3MgPSAnWycgKyAobmVnYXRlID8gJycgOiAnXicpICsgcmFuZ2VzVG9TdHJpbmcobmVncykgKyAnXSc7XG4gICAgY29uc3QgY29tYiA9IHJhbmdlcy5sZW5ndGggJiYgbmVncy5sZW5ndGhcbiAgICAgICAgPyAnKCcgKyBzcmFuZ2VzICsgJ3wnICsgc25lZ3MgKyAnKSdcbiAgICAgICAgOiByYW5nZXMubGVuZ3RoXG4gICAgICAgICAgICA/IHNyYW5nZXNcbiAgICAgICAgICAgIDogc25lZ3M7XG4gICAgcmV0dXJuIFtjb21iLCB1ZmxhZywgZW5kUG9zIC0gcG9zLCB0cnVlXTtcbn07XG5leHBvcnRzLnBhcnNlQ2xhc3MgPSBwYXJzZUNsYXNzO1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9YnJhY2UtZXhwcmVzc2lvbnMuanMubWFwIiwKICAgICJcInVzZSBzdHJpY3RcIjtcbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIl9fZXNNb2R1bGVcIiwgeyB2YWx1ZTogdHJ1ZSB9KTtcbmV4cG9ydHMudW5lc2NhcGUgPSB2b2lkIDA7XG4vKipcbiAqIFVuLWVzY2FwZSBhIHN0cmluZyB0aGF0IGhhcyBiZWVuIGVzY2FwZWQgd2l0aCB7QGxpbmsgZXNjYXBlfS5cbiAqXG4gKiBJZiB0aGUge0BsaW5rIHdpbmRvd3NQYXRoc05vRXNjYXBlfSBvcHRpb24gaXMgdXNlZCwgdGhlbiBzcXVhcmUtYnJhY2VcbiAqIGVzY2FwZXMgYXJlIHJlbW92ZWQsIGJ1dCBub3QgYmFja3NsYXNoIGVzY2FwZXMuICBGb3IgZXhhbXBsZSwgaXQgd2lsbCB0dXJuXG4gKiB0aGUgc3RyaW5nIGAnWypdJ2AgaW50byBgKmAsIGJ1dCBpdCB3aWxsIG5vdCB0dXJuIGAnXFxcXConYCBpbnRvIGAnKidgLFxuICogYmVjdWFzZSBgXFxgIGlzIGEgcGF0aCBzZXBhcmF0b3IgaW4gYHdpbmRvd3NQYXRoc05vRXNjYXBlYCBtb2RlLlxuICpcbiAqIFdoZW4gYHdpbmRvd3NQYXRoc05vRXNjYXBlYCBpcyBub3Qgc2V0LCB0aGVuIGJvdGggYnJhY2UgZXNjYXBlcyBhbmRcbiAqIGJhY2tzbGFzaCBlc2NhcGVzIGFyZSByZW1vdmVkLlxuICpcbiAqIFNsYXNoZXMgKGFuZCBiYWNrc2xhc2hlcyBpbiBgd2luZG93c1BhdGhzTm9Fc2NhcGVgIG1vZGUpIGNhbm5vdCBiZSBlc2NhcGVkXG4gKiBvciB1bmVzY2FwZWQuXG4gKi9cbmNvbnN0IHVuZXNjYXBlID0gKHMsIHsgd2luZG93c1BhdGhzTm9Fc2NhcGUgPSBmYWxzZSwgfSA9IHt9KSA9PiB7XG4gICAgcmV0dXJuIHdpbmRvd3NQYXRoc05vRXNjYXBlXG4gICAgICAgID8gcy5yZXBsYWNlKC9cXFsoW15cXC9cXFxcXSlcXF0vZywgJyQxJylcbiAgICAgICAgOiBzLnJlcGxhY2UoLygoPyFcXFxcKS58XilcXFsoW15cXC9cXFxcXSlcXF0vZywgJyQxJDInKS5yZXBsYWNlKC9cXFxcKFteXFwvXSkvZywgJyQxJyk7XG59O1xuZXhwb3J0cy51bmVzY2FwZSA9IHVuZXNjYXBlO1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9dW5lc2NhcGUuanMubWFwIiwKICAgICJcInVzZSBzdHJpY3RcIjtcbi8vIHBhcnNlIGEgc2luZ2xlIHBhdGggcG9ydGlvblxuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiX19lc01vZHVsZVwiLCB7IHZhbHVlOiB0cnVlIH0pO1xuZXhwb3J0cy5BU1QgPSB2b2lkIDA7XG5jb25zdCBicmFjZV9leHByZXNzaW9uc19qc18xID0gcmVxdWlyZShcIi4vYnJhY2UtZXhwcmVzc2lvbnMuanNcIik7XG5jb25zdCB1bmVzY2FwZV9qc18xID0gcmVxdWlyZShcIi4vdW5lc2NhcGUuanNcIik7XG5jb25zdCB0eXBlcyA9IG5ldyBTZXQoWychJywgJz8nLCAnKycsICcqJywgJ0AnXSk7XG5jb25zdCBpc0V4dGdsb2JUeXBlID0gKGMpID0+IHR5cGVzLmhhcyhjKTtcbi8vIFBhdHRlcm5zIHRoYXQgZ2V0IHByZXBlbmRlZCB0byBiaW5kIHRvIHRoZSBzdGFydCBvZiBlaXRoZXIgdGhlXG4vLyBlbnRpcmUgc3RyaW5nLCBvciBqdXN0IGEgc2luZ2xlIHBhdGggcG9ydGlvbiwgdG8gcHJldmVudCBkb3RzXG4vLyBhbmQvb3IgdHJhdmVyc2FsIHBhdHRlcm5zLCB3aGVuIG5lZWRlZC5cbi8vIEV4dHMgZG9uJ3QgbmVlZCB0aGUgXiBvciAvIGJpdCwgYmVjYXVzZSB0aGUgcm9vdCBiaW5kcyB0aGF0IGFscmVhZHkuXG5jb25zdCBzdGFydE5vVHJhdmVyc2FsID0gJyg/ISg/Ol58LylcXFxcLlxcXFwuPyg/OiR8LykpJztcbmNvbnN0IHN0YXJ0Tm9Eb3QgPSAnKD8hXFxcXC4pJztcbi8vIGNoYXJhY3RlcnMgdGhhdCBpbmRpY2F0ZSBhIHN0YXJ0IG9mIHBhdHRlcm4gbmVlZHMgdGhlIFwibm8gZG90c1wiIGJpdCxcbi8vIGJlY2F1c2UgYSBkb3QgKm1pZ2h0KiBiZSBtYXRjaGVkLiAoIGlzIG5vdCBpbiB0aGUgbGlzdCwgYmVjYXVzZSBpblxuLy8gdGhlIGNhc2Ugb2YgYSBjaGlsZCBleHRnbG9iLCBpdCB3aWxsIGhhbmRsZSB0aGUgcHJldmVudGlvbiBpdHNlbGYuXG5jb25zdCBhZGRQYXR0ZXJuU3RhcnQgPSBuZXcgU2V0KFsnWycsICcuJ10pO1xuLy8gY2FzZXMgd2hlcmUgdHJhdmVyc2FsIGlzIEEtT0ssIG5vIGRvdCBwcmV2ZW50aW9uIG5lZWRlZFxuY29uc3QganVzdERvdHMgPSBuZXcgU2V0KFsnLi4nLCAnLiddKTtcbmNvbnN0IHJlU3BlY2lhbHMgPSBuZXcgU2V0KCcoKS4qe30rP1tdXiRcXFxcIScpO1xuY29uc3QgcmVnRXhwRXNjYXBlID0gKHMpID0+IHMucmVwbGFjZSgvWy1bXFxde30oKSorPy4sXFxcXF4kfCNcXHNdL2csICdcXFxcJCYnKTtcbi8vIGFueSBzaW5nbGUgdGhpbmcgb3RoZXIgdGhhbiAvXG5jb25zdCBxbWFyayA9ICdbXi9dJztcbi8vICogPT4gYW55IG51bWJlciBvZiBjaGFyYWN0ZXJzXG5jb25zdCBzdGFyID0gcW1hcmsgKyAnKj8nO1xuLy8gdXNlICsgd2hlbiB3ZSBuZWVkIHRvIGVuc3VyZSB0aGF0ICpzb21ldGhpbmcqIG1hdGNoZXMsIGJlY2F1c2UgdGhlICogaXNcbi8vIHRoZSBvbmx5IHRoaW5nIGluIHRoZSBwYXRoIHBvcnRpb24uXG5jb25zdCBzdGFyTm9FbXB0eSA9IHFtYXJrICsgJys/Jztcbi8vIHJlbW92ZSB0aGUgXFwgY2hhcnMgdGhhdCB3ZSBhZGRlZCBpZiB3ZSBlbmQgdXAgZG9pbmcgYSBub25tYWdpYyBjb21wYXJlXG4vLyBjb25zdCBkZXNsYXNoID0gKHM6IHN0cmluZykgPT4gcy5yZXBsYWNlKC9cXFxcKC4pL2csICckMScpXG5jbGFzcyBBU1Qge1xuICAgIHR5cGU7XG4gICAgI3Jvb3Q7XG4gICAgI2hhc01hZ2ljO1xuICAgICN1ZmxhZyA9IGZhbHNlO1xuICAgICNwYXJ0cyA9IFtdO1xuICAgICNwYXJlbnQ7XG4gICAgI3BhcmVudEluZGV4O1xuICAgICNuZWdzO1xuICAgICNmaWxsZWROZWdzID0gZmFsc2U7XG4gICAgI29wdGlvbnM7XG4gICAgI3RvU3RyaW5nO1xuICAgIC8vIHNldCB0byB0cnVlIGlmIGl0J3MgYW4gZXh0Z2xvYiB3aXRoIG5vIGNoaWxkcmVuXG4gICAgLy8gKHdoaWNoIHJlYWxseSBtZWFucyBvbmUgY2hpbGQgb2YgJycpXG4gICAgI2VtcHR5RXh0ID0gZmFsc2U7XG4gICAgY29uc3RydWN0b3IodHlwZSwgcGFyZW50LCBvcHRpb25zID0ge30pIHtcbiAgICAgICAgdGhpcy50eXBlID0gdHlwZTtcbiAgICAgICAgLy8gZXh0Z2xvYnMgYXJlIGluaGVyZW50bHkgbWFnaWNhbFxuICAgICAgICBpZiAodHlwZSlcbiAgICAgICAgICAgIHRoaXMuI2hhc01hZ2ljID0gdHJ1ZTtcbiAgICAgICAgdGhpcy4jcGFyZW50ID0gcGFyZW50O1xuICAgICAgICB0aGlzLiNyb290ID0gdGhpcy4jcGFyZW50ID8gdGhpcy4jcGFyZW50LiNyb290IDogdGhpcztcbiAgICAgICAgdGhpcy4jb3B0aW9ucyA9IHRoaXMuI3Jvb3QgPT09IHRoaXMgPyBvcHRpb25zIDogdGhpcy4jcm9vdC4jb3B0aW9ucztcbiAgICAgICAgdGhpcy4jbmVncyA9IHRoaXMuI3Jvb3QgPT09IHRoaXMgPyBbXSA6IHRoaXMuI3Jvb3QuI25lZ3M7XG4gICAgICAgIGlmICh0eXBlID09PSAnIScgJiYgIXRoaXMuI3Jvb3QuI2ZpbGxlZE5lZ3MpXG4gICAgICAgICAgICB0aGlzLiNuZWdzLnB1c2godGhpcyk7XG4gICAgICAgIHRoaXMuI3BhcmVudEluZGV4ID0gdGhpcy4jcGFyZW50ID8gdGhpcy4jcGFyZW50LiNwYXJ0cy5sZW5ndGggOiAwO1xuICAgIH1cbiAgICBnZXQgaGFzTWFnaWMoKSB7XG4gICAgICAgIC8qIGM4IGlnbm9yZSBzdGFydCAqL1xuICAgICAgICBpZiAodGhpcy4jaGFzTWFnaWMgIT09IHVuZGVmaW5lZClcbiAgICAgICAgICAgIHJldHVybiB0aGlzLiNoYXNNYWdpYztcbiAgICAgICAgLyogYzggaWdub3JlIHN0b3AgKi9cbiAgICAgICAgZm9yIChjb25zdCBwIG9mIHRoaXMuI3BhcnRzKSB7XG4gICAgICAgICAgICBpZiAodHlwZW9mIHAgPT09ICdzdHJpbmcnKVxuICAgICAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgICAgaWYgKHAudHlwZSB8fCBwLmhhc01hZ2ljKVxuICAgICAgICAgICAgICAgIHJldHVybiAodGhpcy4jaGFzTWFnaWMgPSB0cnVlKTtcbiAgICAgICAgfVxuICAgICAgICAvLyBub3RlOiB3aWxsIGJlIHVuZGVmaW5lZCB1bnRpbCB3ZSBnZW5lcmF0ZSB0aGUgcmVnZXhwIHNyYyBhbmQgZmluZCBvdXRcbiAgICAgICAgcmV0dXJuIHRoaXMuI2hhc01hZ2ljO1xuICAgIH1cbiAgICAvLyByZWNvbnN0cnVjdHMgdGhlIHBhdHRlcm5cbiAgICB0b1N0cmluZygpIHtcbiAgICAgICAgaWYgKHRoaXMuI3RvU3RyaW5nICE9PSB1bmRlZmluZWQpXG4gICAgICAgICAgICByZXR1cm4gdGhpcy4jdG9TdHJpbmc7XG4gICAgICAgIGlmICghdGhpcy50eXBlKSB7XG4gICAgICAgICAgICByZXR1cm4gKHRoaXMuI3RvU3RyaW5nID0gdGhpcy4jcGFydHMubWFwKHAgPT4gU3RyaW5nKHApKS5qb2luKCcnKSk7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICByZXR1cm4gKHRoaXMuI3RvU3RyaW5nID1cbiAgICAgICAgICAgICAgICB0aGlzLnR5cGUgKyAnKCcgKyB0aGlzLiNwYXJ0cy5tYXAocCA9PiBTdHJpbmcocCkpLmpvaW4oJ3wnKSArICcpJyk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgI2ZpbGxOZWdzKCkge1xuICAgICAgICAvKiBjOCBpZ25vcmUgc3RhcnQgKi9cbiAgICAgICAgaWYgKHRoaXMgIT09IHRoaXMuI3Jvb3QpXG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ3Nob3VsZCBvbmx5IGNhbGwgb24gcm9vdCcpO1xuICAgICAgICBpZiAodGhpcy4jZmlsbGVkTmVncylcbiAgICAgICAgICAgIHJldHVybiB0aGlzO1xuICAgICAgICAvKiBjOCBpZ25vcmUgc3RvcCAqL1xuICAgICAgICAvLyBjYWxsIHRvU3RyaW5nKCkgb25jZSB0byBmaWxsIHRoaXMgb3V0XG4gICAgICAgIHRoaXMudG9TdHJpbmcoKTtcbiAgICAgICAgdGhpcy4jZmlsbGVkTmVncyA9IHRydWU7XG4gICAgICAgIGxldCBuO1xuICAgICAgICB3aGlsZSAoKG4gPSB0aGlzLiNuZWdzLnBvcCgpKSkge1xuICAgICAgICAgICAgaWYgKG4udHlwZSAhPT0gJyEnKVxuICAgICAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgICAgLy8gd2FsayB1cCB0aGUgdHJlZSwgYXBwZW5kaW5nIGV2ZXJ0aGluZyB0aGF0IGNvbWVzIEFGVEVSIHBhcmVudEluZGV4XG4gICAgICAgICAgICBsZXQgcCA9IG47XG4gICAgICAgICAgICBsZXQgcHAgPSBwLiNwYXJlbnQ7XG4gICAgICAgICAgICB3aGlsZSAocHApIHtcbiAgICAgICAgICAgICAgICBmb3IgKGxldCBpID0gcC4jcGFyZW50SW5kZXggKyAxOyAhcHAudHlwZSAmJiBpIDwgcHAuI3BhcnRzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICAgICAgICAgIGZvciAoY29uc3QgcGFydCBvZiBuLiNwYXJ0cykge1xuICAgICAgICAgICAgICAgICAgICAgICAgLyogYzggaWdub3JlIHN0YXJ0ICovXG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAodHlwZW9mIHBhcnQgPT09ICdzdHJpbmcnKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdzdHJpbmcgcGFydCBpbiBleHRnbG9iIEFTVD8/Jyk7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAvKiBjOCBpZ25vcmUgc3RvcCAqL1xuICAgICAgICAgICAgICAgICAgICAgICAgcGFydC5jb3B5SW4ocHAuI3BhcnRzW2ldKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBwID0gcHA7XG4gICAgICAgICAgICAgICAgcHAgPSBwLiNwYXJlbnQ7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxuICAgIHB1c2goLi4ucGFydHMpIHtcbiAgICAgICAgZm9yIChjb25zdCBwIG9mIHBhcnRzKSB7XG4gICAgICAgICAgICBpZiAocCA9PT0gJycpXG4gICAgICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgICAvKiBjOCBpZ25vcmUgc3RhcnQgKi9cbiAgICAgICAgICAgIGlmICh0eXBlb2YgcCAhPT0gJ3N0cmluZycgJiYgIShwIGluc3RhbmNlb2YgQVNUICYmIHAuI3BhcmVudCA9PT0gdGhpcykpIHtcbiAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ2ludmFsaWQgcGFydDogJyArIHApO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgLyogYzggaWdub3JlIHN0b3AgKi9cbiAgICAgICAgICAgIHRoaXMuI3BhcnRzLnB1c2gocCk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgdG9KU09OKCkge1xuICAgICAgICBjb25zdCByZXQgPSB0aGlzLnR5cGUgPT09IG51bGxcbiAgICAgICAgICAgID8gdGhpcy4jcGFydHMuc2xpY2UoKS5tYXAocCA9PiAodHlwZW9mIHAgPT09ICdzdHJpbmcnID8gcCA6IHAudG9KU09OKCkpKVxuICAgICAgICAgICAgOiBbdGhpcy50eXBlLCAuLi50aGlzLiNwYXJ0cy5tYXAocCA9PiBwLnRvSlNPTigpKV07XG4gICAgICAgIGlmICh0aGlzLmlzU3RhcnQoKSAmJiAhdGhpcy50eXBlKVxuICAgICAgICAgICAgcmV0LnVuc2hpZnQoW10pO1xuICAgICAgICBpZiAodGhpcy5pc0VuZCgpICYmXG4gICAgICAgICAgICAodGhpcyA9PT0gdGhpcy4jcm9vdCB8fFxuICAgICAgICAgICAgICAgICh0aGlzLiNyb290LiNmaWxsZWROZWdzICYmIHRoaXMuI3BhcmVudD8udHlwZSA9PT0gJyEnKSkpIHtcbiAgICAgICAgICAgIHJldC5wdXNoKHt9KTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gcmV0O1xuICAgIH1cbiAgICBpc1N0YXJ0KCkge1xuICAgICAgICBpZiAodGhpcy4jcm9vdCA9PT0gdGhpcylcbiAgICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICAvLyBpZiAodGhpcy50eXBlKSByZXR1cm4gISF0aGlzLiNwYXJlbnQ/LmlzU3RhcnQoKVxuICAgICAgICBpZiAoIXRoaXMuI3BhcmVudD8uaXNTdGFydCgpKVxuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICBpZiAodGhpcy4jcGFyZW50SW5kZXggPT09IDApXG4gICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgLy8gaWYgZXZlcnl0aGluZyBBSEVBRCBvZiB0aGlzIGlzIGEgbmVnYXRpb24sIHRoZW4gaXQncyBzdGlsbCB0aGUgXCJzdGFydFwiXG4gICAgICAgIGNvbnN0IHAgPSB0aGlzLiNwYXJlbnQ7XG4gICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgdGhpcy4jcGFyZW50SW5kZXg7IGkrKykge1xuICAgICAgICAgICAgY29uc3QgcHAgPSBwLiNwYXJ0c1tpXTtcbiAgICAgICAgICAgIGlmICghKHBwIGluc3RhbmNlb2YgQVNUICYmIHBwLnR5cGUgPT09ICchJykpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuICAgIGlzRW5kKCkge1xuICAgICAgICBpZiAodGhpcy4jcm9vdCA9PT0gdGhpcylcbiAgICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICBpZiAodGhpcy4jcGFyZW50Py50eXBlID09PSAnIScpXG4gICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgaWYgKCF0aGlzLiNwYXJlbnQ/LmlzRW5kKCkpXG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgIGlmICghdGhpcy50eXBlKVxuICAgICAgICAgICAgcmV0dXJuIHRoaXMuI3BhcmVudD8uaXNFbmQoKTtcbiAgICAgICAgLy8gaWYgbm90IHJvb3QsIGl0J2xsIGFsd2F5cyBoYXZlIGEgcGFyZW50XG4gICAgICAgIC8qIGM4IGlnbm9yZSBzdGFydCAqL1xuICAgICAgICBjb25zdCBwbCA9IHRoaXMuI3BhcmVudCA/IHRoaXMuI3BhcmVudC4jcGFydHMubGVuZ3RoIDogMDtcbiAgICAgICAgLyogYzggaWdub3JlIHN0b3AgKi9cbiAgICAgICAgcmV0dXJuIHRoaXMuI3BhcmVudEluZGV4ID09PSBwbCAtIDE7XG4gICAgfVxuICAgIGNvcHlJbihwYXJ0KSB7XG4gICAgICAgIGlmICh0eXBlb2YgcGFydCA9PT0gJ3N0cmluZycpXG4gICAgICAgICAgICB0aGlzLnB1c2gocGFydCk7XG4gICAgICAgIGVsc2VcbiAgICAgICAgICAgIHRoaXMucHVzaChwYXJ0LmNsb25lKHRoaXMpKTtcbiAgICB9XG4gICAgY2xvbmUocGFyZW50KSB7XG4gICAgICAgIGNvbnN0IGMgPSBuZXcgQVNUKHRoaXMudHlwZSwgcGFyZW50KTtcbiAgICAgICAgZm9yIChjb25zdCBwIG9mIHRoaXMuI3BhcnRzKSB7XG4gICAgICAgICAgICBjLmNvcHlJbihwKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gYztcbiAgICB9XG4gICAgc3RhdGljICNwYXJzZUFTVChzdHIsIGFzdCwgcG9zLCBvcHQpIHtcbiAgICAgICAgbGV0IGVzY2FwaW5nID0gZmFsc2U7XG4gICAgICAgIGxldCBpbkJyYWNlID0gZmFsc2U7XG4gICAgICAgIGxldCBicmFjZVN0YXJ0ID0gLTE7XG4gICAgICAgIGxldCBicmFjZU5lZyA9IGZhbHNlO1xuICAgICAgICBpZiAoYXN0LnR5cGUgPT09IG51bGwpIHtcbiAgICAgICAgICAgIC8vIG91dHNpZGUgb2YgYSBleHRnbG9iLCBhcHBlbmQgdW50aWwgd2UgZmluZCBhIHN0YXJ0XG4gICAgICAgICAgICBsZXQgaSA9IHBvcztcbiAgICAgICAgICAgIGxldCBhY2MgPSAnJztcbiAgICAgICAgICAgIHdoaWxlIChpIDwgc3RyLmxlbmd0aCkge1xuICAgICAgICAgICAgICAgIGNvbnN0IGMgPSBzdHIuY2hhckF0KGkrKyk7XG4gICAgICAgICAgICAgICAgLy8gc3RpbGwgYWNjdW11bGF0ZSBlc2NhcGVzIGF0IHRoaXMgcG9pbnQsIGJ1dCB3ZSBkbyBpZ25vcmVcbiAgICAgICAgICAgICAgICAvLyBzdGFydHMgdGhhdCBhcmUgZXNjYXBlZFxuICAgICAgICAgICAgICAgIGlmIChlc2NhcGluZyB8fCBjID09PSAnXFxcXCcpIHtcbiAgICAgICAgICAgICAgICAgICAgZXNjYXBpbmcgPSAhZXNjYXBpbmc7XG4gICAgICAgICAgICAgICAgICAgIGFjYyArPSBjO1xuICAgICAgICAgICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgaWYgKGluQnJhY2UpIHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKGkgPT09IGJyYWNlU3RhcnQgKyAxKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoYyA9PT0gJ14nIHx8IGMgPT09ICchJykge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyYWNlTmVnID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBlbHNlIGlmIChjID09PSAnXScgJiYgIShpID09PSBicmFjZVN0YXJ0ICsgMiAmJiBicmFjZU5lZykpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGluQnJhY2UgPSBmYWxzZTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBhY2MgKz0gYztcbiAgICAgICAgICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGVsc2UgaWYgKGMgPT09ICdbJykge1xuICAgICAgICAgICAgICAgICAgICBpbkJyYWNlID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICAgICAgYnJhY2VTdGFydCA9IGk7XG4gICAgICAgICAgICAgICAgICAgIGJyYWNlTmVnID0gZmFsc2U7XG4gICAgICAgICAgICAgICAgICAgIGFjYyArPSBjO1xuICAgICAgICAgICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgaWYgKCFvcHQubm9leHQgJiYgaXNFeHRnbG9iVHlwZShjKSAmJiBzdHIuY2hhckF0KGkpID09PSAnKCcpIHtcbiAgICAgICAgICAgICAgICAgICAgYXN0LnB1c2goYWNjKTtcbiAgICAgICAgICAgICAgICAgICAgYWNjID0gJyc7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IGV4dCA9IG5ldyBBU1QoYywgYXN0KTtcbiAgICAgICAgICAgICAgICAgICAgaSA9IEFTVC4jcGFyc2VBU1Qoc3RyLCBleHQsIGksIG9wdCk7XG4gICAgICAgICAgICAgICAgICAgIGFzdC5wdXNoKGV4dCk7XG4gICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBhY2MgKz0gYztcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGFzdC5wdXNoKGFjYyk7XG4gICAgICAgICAgICByZXR1cm4gaTtcbiAgICAgICAgfVxuICAgICAgICAvLyBzb21lIGtpbmQgb2YgZXh0Z2xvYiwgcG9zIGlzIGF0IHRoZSAoXG4gICAgICAgIC8vIGZpbmQgdGhlIG5leHQgfCBvciApXG4gICAgICAgIGxldCBpID0gcG9zICsgMTtcbiAgICAgICAgbGV0IHBhcnQgPSBuZXcgQVNUKG51bGwsIGFzdCk7XG4gICAgICAgIGNvbnN0IHBhcnRzID0gW107XG4gICAgICAgIGxldCBhY2MgPSAnJztcbiAgICAgICAgd2hpbGUgKGkgPCBzdHIubGVuZ3RoKSB7XG4gICAgICAgICAgICBjb25zdCBjID0gc3RyLmNoYXJBdChpKyspO1xuICAgICAgICAgICAgLy8gc3RpbGwgYWNjdW11bGF0ZSBlc2NhcGVzIGF0IHRoaXMgcG9pbnQsIGJ1dCB3ZSBkbyBpZ25vcmVcbiAgICAgICAgICAgIC8vIHN0YXJ0cyB0aGF0IGFyZSBlc2NhcGVkXG4gICAgICAgICAgICBpZiAoZXNjYXBpbmcgfHwgYyA9PT0gJ1xcXFwnKSB7XG4gICAgICAgICAgICAgICAgZXNjYXBpbmcgPSAhZXNjYXBpbmc7XG4gICAgICAgICAgICAgICAgYWNjICs9IGM7XG4gICAgICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAoaW5CcmFjZSkge1xuICAgICAgICAgICAgICAgIGlmIChpID09PSBicmFjZVN0YXJ0ICsgMSkge1xuICAgICAgICAgICAgICAgICAgICBpZiAoYyA9PT0gJ14nIHx8IGMgPT09ICchJykge1xuICAgICAgICAgICAgICAgICAgICAgICAgYnJhY2VOZWcgPSB0cnVlO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGVsc2UgaWYgKGMgPT09ICddJyAmJiAhKGkgPT09IGJyYWNlU3RhcnQgKyAyICYmIGJyYWNlTmVnKSkge1xuICAgICAgICAgICAgICAgICAgICBpbkJyYWNlID0gZmFsc2U7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGFjYyArPSBjO1xuICAgICAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSBpZiAoYyA9PT0gJ1snKSB7XG4gICAgICAgICAgICAgICAgaW5CcmFjZSA9IHRydWU7XG4gICAgICAgICAgICAgICAgYnJhY2VTdGFydCA9IGk7XG4gICAgICAgICAgICAgICAgYnJhY2VOZWcgPSBmYWxzZTtcbiAgICAgICAgICAgICAgICBhY2MgKz0gYztcbiAgICAgICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmIChpc0V4dGdsb2JUeXBlKGMpICYmIHN0ci5jaGFyQXQoaSkgPT09ICcoJykge1xuICAgICAgICAgICAgICAgIHBhcnQucHVzaChhY2MpO1xuICAgICAgICAgICAgICAgIGFjYyA9ICcnO1xuICAgICAgICAgICAgICAgIGNvbnN0IGV4dCA9IG5ldyBBU1QoYywgcGFydCk7XG4gICAgICAgICAgICAgICAgcGFydC5wdXNoKGV4dCk7XG4gICAgICAgICAgICAgICAgaSA9IEFTVC4jcGFyc2VBU1Qoc3RyLCBleHQsIGksIG9wdCk7XG4gICAgICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAoYyA9PT0gJ3wnKSB7XG4gICAgICAgICAgICAgICAgcGFydC5wdXNoKGFjYyk7XG4gICAgICAgICAgICAgICAgYWNjID0gJyc7XG4gICAgICAgICAgICAgICAgcGFydHMucHVzaChwYXJ0KTtcbiAgICAgICAgICAgICAgICBwYXJ0ID0gbmV3IEFTVChudWxsLCBhc3QpO1xuICAgICAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKGMgPT09ICcpJykge1xuICAgICAgICAgICAgICAgIGlmIChhY2MgPT09ICcnICYmIGFzdC4jcGFydHMubGVuZ3RoID09PSAwKSB7XG4gICAgICAgICAgICAgICAgICAgIGFzdC4jZW1wdHlFeHQgPSB0cnVlO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBwYXJ0LnB1c2goYWNjKTtcbiAgICAgICAgICAgICAgICBhY2MgPSAnJztcbiAgICAgICAgICAgICAgICBhc3QucHVzaCguLi5wYXJ0cywgcGFydCk7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBhY2MgKz0gYztcbiAgICAgICAgfVxuICAgICAgICAvLyB1bmZpbmlzaGVkIGV4dGdsb2JcbiAgICAgICAgLy8gaWYgd2UgZ290IGhlcmUsIGl0IHdhcyBhIG1hbGZvcm1lZCBleHRnbG9iISBub3QgYW4gZXh0Z2xvYiwgYnV0XG4gICAgICAgIC8vIG1heWJlIHNvbWV0aGluZyBlbHNlIGluIHRoZXJlLlxuICAgICAgICBhc3QudHlwZSA9IG51bGw7XG4gICAgICAgIGFzdC4jaGFzTWFnaWMgPSB1bmRlZmluZWQ7XG4gICAgICAgIGFzdC4jcGFydHMgPSBbc3RyLnN1YnN0cmluZyhwb3MgLSAxKV07XG4gICAgICAgIHJldHVybiBpO1xuICAgIH1cbiAgICBzdGF0aWMgZnJvbUdsb2IocGF0dGVybiwgb3B0aW9ucyA9IHt9KSB7XG4gICAgICAgIGNvbnN0IGFzdCA9IG5ldyBBU1QobnVsbCwgdW5kZWZpbmVkLCBvcHRpb25zKTtcbiAgICAgICAgQVNULiNwYXJzZUFTVChwYXR0ZXJuLCBhc3QsIDAsIG9wdGlvbnMpO1xuICAgICAgICByZXR1cm4gYXN0O1xuICAgIH1cbiAgICAvLyByZXR1cm5zIHRoZSByZWd1bGFyIGV4cHJlc3Npb24gaWYgdGhlcmUncyBtYWdpYywgb3IgdGhlIHVuZXNjYXBlZFxuICAgIC8vIHN0cmluZyBpZiBub3QuXG4gICAgdG9NTVBhdHRlcm4oKSB7XG4gICAgICAgIC8vIHNob3VsZCBvbmx5IGJlIGNhbGxlZCBvbiByb290XG4gICAgICAgIC8qIGM4IGlnbm9yZSBzdGFydCAqL1xuICAgICAgICBpZiAodGhpcyAhPT0gdGhpcy4jcm9vdClcbiAgICAgICAgICAgIHJldHVybiB0aGlzLiNyb290LnRvTU1QYXR0ZXJuKCk7XG4gICAgICAgIC8qIGM4IGlnbm9yZSBzdG9wICovXG4gICAgICAgIGNvbnN0IGdsb2IgPSB0aGlzLnRvU3RyaW5nKCk7XG4gICAgICAgIGNvbnN0IFtyZSwgYm9keSwgaGFzTWFnaWMsIHVmbGFnXSA9IHRoaXMudG9SZWdFeHBTb3VyY2UoKTtcbiAgICAgICAgLy8gaWYgd2UncmUgaW4gbm9jYXNlIG1vZGUsIGFuZCBub3Qgbm9jYXNlTWFnaWNPbmx5LCB0aGVuIHdlIGRvXG4gICAgICAgIC8vIHN0aWxsIG5lZWQgYSByZWd1bGFyIGV4cHJlc3Npb24gaWYgd2UgaGF2ZSB0byBjYXNlLWluc2Vuc2l0aXZlbHlcbiAgICAgICAgLy8gbWF0Y2ggY2FwaXRhbC9sb3dlcmNhc2UgY2hhcmFjdGVycy5cbiAgICAgICAgY29uc3QgYW55TWFnaWMgPSBoYXNNYWdpYyB8fFxuICAgICAgICAgICAgdGhpcy4jaGFzTWFnaWMgfHxcbiAgICAgICAgICAgICh0aGlzLiNvcHRpb25zLm5vY2FzZSAmJlxuICAgICAgICAgICAgICAgICF0aGlzLiNvcHRpb25zLm5vY2FzZU1hZ2ljT25seSAmJlxuICAgICAgICAgICAgICAgIGdsb2IudG9VcHBlckNhc2UoKSAhPT0gZ2xvYi50b0xvd2VyQ2FzZSgpKTtcbiAgICAgICAgaWYgKCFhbnlNYWdpYykge1xuICAgICAgICAgICAgcmV0dXJuIGJvZHk7XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgZmxhZ3MgPSAodGhpcy4jb3B0aW9ucy5ub2Nhc2UgPyAnaScgOiAnJykgKyAodWZsYWcgPyAndScgOiAnJyk7XG4gICAgICAgIHJldHVybiBPYmplY3QuYXNzaWduKG5ldyBSZWdFeHAoYF4ke3JlfSRgLCBmbGFncyksIHtcbiAgICAgICAgICAgIF9zcmM6IHJlLFxuICAgICAgICAgICAgX2dsb2I6IGdsb2IsXG4gICAgICAgIH0pO1xuICAgIH1cbiAgICBnZXQgb3B0aW9ucygpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuI29wdGlvbnM7XG4gICAgfVxuICAgIC8vIHJldHVybnMgdGhlIHN0cmluZyBtYXRjaCwgdGhlIHJlZ2V4cCBzb3VyY2UsIHdoZXRoZXIgdGhlcmUncyBtYWdpY1xuICAgIC8vIGluIHRoZSByZWdleHAgKHNvIGEgcmVndWxhciBleHByZXNzaW9uIGlzIHJlcXVpcmVkKSBhbmQgd2hldGhlciBvclxuICAgIC8vIG5vdCB0aGUgdWZsYWcgaXMgbmVlZGVkIGZvciB0aGUgcmVndWxhciBleHByZXNzaW9uIChmb3IgcG9zaXggY2xhc3NlcylcbiAgICAvLyBUT0RPOiBpbnN0ZWFkIG9mIGluamVjdGluZyB0aGUgc3RhcnQvZW5kIGF0IHRoaXMgcG9pbnQsIGp1c3QgcmV0dXJuXG4gICAgLy8gdGhlIEJPRFkgb2YgdGhlIHJlZ2V4cCwgYWxvbmcgd2l0aCB0aGUgc3RhcnQvZW5kIHBvcnRpb25zIHN1aXRhYmxlXG4gICAgLy8gZm9yIGJpbmRpbmcgdGhlIHN0YXJ0L2VuZCBpbiBlaXRoZXIgYSBqb2luZWQgZnVsbC1wYXRoIG1ha2VSZSBjb250ZXh0XG4gICAgLy8gKHdoZXJlIHdlIGJpbmQgdG8gKF58LyksIG9yIGEgc3RhbmRhbG9uZSBtYXRjaFBhcnQgY29udGV4dCAod2hlcmVcbiAgICAvLyB3ZSBiaW5kIHRvIF4sIGFuZCBub3QgLykuICBPdGhlcndpc2Ugc2xhc2hlcyBnZXQgZHVwZWQhXG4gICAgLy9cbiAgICAvLyBJbiBwYXJ0LW1hdGNoaW5nIG1vZGUsIHRoZSBzdGFydCBpczpcbiAgICAvLyAtIGlmIG5vdCBpc1N0YXJ0OiBub3RoaW5nXG4gICAgLy8gLSBpZiB0cmF2ZXJzYWwgcG9zc2libGUsIGJ1dCBub3QgYWxsb3dlZDogXig/IVxcLlxcLj8kKVxuICAgIC8vIC0gaWYgZG90cyBhbGxvd2VkIG9yIG5vdCBwb3NzaWJsZTogXlxuICAgIC8vIC0gaWYgZG90cyBwb3NzaWJsZSBhbmQgbm90IGFsbG93ZWQ6IF4oPyFcXC4pXG4gICAgLy8gZW5kIGlzOlxuICAgIC8vIC0gaWYgbm90IGlzRW5kKCk6IG5vdGhpbmdcbiAgICAvLyAtIGVsc2U6ICRcbiAgICAvL1xuICAgIC8vIEluIGZ1bGwtcGF0aCBtYXRjaGluZyBtb2RlLCB3ZSBwdXQgdGhlIHNsYXNoIGF0IHRoZSBTVEFSVCBvZiB0aGVcbiAgICAvLyBwYXR0ZXJuLCBzbyBzdGFydCBpczpcbiAgICAvLyAtIGlmIGZpcnN0IHBhdHRlcm46IHNhbWUgYXMgcGFydC1tYXRjaGluZyBtb2RlXG4gICAgLy8gLSBpZiBub3QgaXNTdGFydCgpOiBub3RoaW5nXG4gICAgLy8gLSBpZiB0cmF2ZXJzYWwgcG9zc2libGUsIGJ1dCBub3QgYWxsb3dlZDogLyg/IVxcLlxcLj8oPzokfC8pKVxuICAgIC8vIC0gaWYgZG90cyBhbGxvd2VkIG9yIG5vdCBwb3NzaWJsZTogL1xuICAgIC8vIC0gaWYgZG90cyBwb3NzaWJsZSBhbmQgbm90IGFsbG93ZWQ6IC8oPyFcXC4pXG4gICAgLy8gZW5kIGlzOlxuICAgIC8vIC0gaWYgbGFzdCBwYXR0ZXJuLCBzYW1lIGFzIHBhcnQtbWF0Y2hpbmcgbW9kZVxuICAgIC8vIC0gZWxzZSBub3RoaW5nXG4gICAgLy9cbiAgICAvLyBBbHdheXMgcHV0IHRoZSAoPzokfC8pIG9uIG5lZ2F0ZWQgdGFpbHMsIHRob3VnaCwgYmVjYXVzZSB0aGF0IGhhcyB0byBiZVxuICAgIC8vIHRoZXJlIHRvIGJpbmQgdGhlIGVuZCBvZiB0aGUgbmVnYXRlZCBwYXR0ZXJuIHBvcnRpb24sIGFuZCBpdCdzIGVhc2llciB0b1xuICAgIC8vIGp1c3Qgc3RpY2sgaXQgaW4gbm93IHJhdGhlciB0aGFuIHRyeSB0byBpbmplY3QgaXQgbGF0ZXIgaW4gdGhlIG1pZGRsZSBvZlxuICAgIC8vIHRoZSBwYXR0ZXJuLlxuICAgIC8vXG4gICAgLy8gV2UgY2FuIGp1c3QgYWx3YXlzIHJldHVybiB0aGUgc2FtZSBlbmQsIGFuZCBsZWF2ZSBpdCB1cCB0byB0aGUgY2FsbGVyXG4gICAgLy8gdG8ga25vdyB3aGV0aGVyIGl0J3MgZ29pbmcgdG8gYmUgdXNlZCBqb2luZWQgb3IgaW4gcGFydHMuXG4gICAgLy8gQW5kLCBpZiB0aGUgc3RhcnQgaXMgYWRqdXN0ZWQgc2xpZ2h0bHksIGNhbiBkbyB0aGUgc2FtZSB0aGVyZTpcbiAgICAvLyAtIGlmIG5vdCBpc1N0YXJ0OiBub3RoaW5nXG4gICAgLy8gLSBpZiB0cmF2ZXJzYWwgcG9zc2libGUsIGJ1dCBub3QgYWxsb3dlZDogKD86L3xeKSg/IVxcLlxcLj8kKVxuICAgIC8vIC0gaWYgZG90cyBhbGxvd2VkIG9yIG5vdCBwb3NzaWJsZTogKD86L3xeKVxuICAgIC8vIC0gaWYgZG90cyBwb3NzaWJsZSBhbmQgbm90IGFsbG93ZWQ6ICg/Oi98XikoPyFcXC4pXG4gICAgLy9cbiAgICAvLyBCdXQgaXQncyBiZXR0ZXIgdG8gaGF2ZSBhIHNpbXBsZXIgYmluZGluZyB3aXRob3V0IGEgY29uZGl0aW9uYWwsIGZvclxuICAgIC8vIHBlcmZvcm1hbmNlLCBzbyBwcm9iYWJseSBiZXR0ZXIgdG8gcmV0dXJuIGJvdGggc3RhcnQgb3B0aW9ucy5cbiAgICAvL1xuICAgIC8vIFRoZW4gdGhlIGNhbGxlciBqdXN0IGlnbm9yZXMgdGhlIGVuZCBpZiBpdCdzIG5vdCB0aGUgZmlyc3QgcGF0dGVybixcbiAgICAvLyBhbmQgdGhlIHN0YXJ0IGFsd2F5cyBnZXRzIGFwcGxpZWQuXG4gICAgLy9cbiAgICAvLyBCdXQgdGhhdCdzIGFsd2F5cyBnb2luZyB0byBiZSAkIGlmIGl0J3MgdGhlIGVuZGluZyBwYXR0ZXJuLCBvciBub3RoaW5nLFxuICAgIC8vIHNvIHRoZSBjYWxsZXIgY2FuIGp1c3QgYXR0YWNoICQgYXQgdGhlIGVuZCBvZiB0aGUgcGF0dGVybiB3aGVuIGJ1aWxkaW5nLlxuICAgIC8vXG4gICAgLy8gU28gdGhlIHRvZG8gaXM6XG4gICAgLy8gLSBiZXR0ZXIgZGV0ZWN0IHdoYXQga2luZCBvZiBzdGFydCBpcyBuZWVkZWRcbiAgICAvLyAtIHJldHVybiBib3RoIGZsYXZvcnMgb2Ygc3RhcnRpbmcgcGF0dGVyblxuICAgIC8vIC0gYXR0YWNoICQgYXQgdGhlIGVuZCBvZiB0aGUgcGF0dGVybiB3aGVuIGNyZWF0aW5nIHRoZSBhY3R1YWwgUmVnRXhwXG4gICAgLy9cbiAgICAvLyBBaCwgYnV0IHdhaXQsIG5vLCB0aGF0IGFsbCBvbmx5IGFwcGxpZXMgdG8gdGhlIHJvb3Qgd2hlbiB0aGUgZmlyc3QgcGF0dGVyblxuICAgIC8vIGlzIG5vdCBhbiBleHRnbG9iLiBJZiB0aGUgZmlyc3QgcGF0dGVybiBJUyBhbiBleHRnbG9iLCB0aGVuIHdlIG5lZWQgYWxsXG4gICAgLy8gdGhhdCBkb3QgcHJldmVudGlvbiBiaXogdG8gbGl2ZSBpbiB0aGUgZXh0Z2xvYiBwb3J0aW9ucywgYmVjYXVzZSBlZ1xuICAgIC8vICsoKnwueCopIGNhbiBtYXRjaCAueHkgYnV0IG5vdCAueXguXG4gICAgLy9cbiAgICAvLyBTbywgcmV0dXJuIHRoZSB0d28gZmxhdm9ycyBpZiBpdCdzICNyb290IGFuZCB0aGUgZmlyc3QgY2hpbGQgaXMgbm90IGFuXG4gICAgLy8gQVNULCBvdGhlcndpc2UgbGVhdmUgaXQgdG8gdGhlIGNoaWxkIEFTVCB0byBoYW5kbGUgaXQsIGFuZCB0aGVyZSxcbiAgICAvLyB1c2UgdGhlICg/Ol58Lykgc3R5bGUgb2Ygc3RhcnQgYmluZGluZy5cbiAgICAvL1xuICAgIC8vIEV2ZW4gc2ltcGxpZmllZCBmdXJ0aGVyOlxuICAgIC8vIC0gU2luY2UgdGhlIHN0YXJ0IGZvciBhIGpvaW4gaXMgZWcgLyg/IVxcLikgYW5kIHRoZSBzdGFydCBmb3IgYSBwYXJ0XG4gICAgLy8gaXMgXig/IVxcLiksIHdlIGNhbiBqdXN0IHByZXBlbmQgKD8hXFwuKSB0byB0aGUgcGF0dGVybiAoZWl0aGVyIHJvb3RcbiAgICAvLyBvciBzdGFydCBvciB3aGF0ZXZlcikgYW5kIHByZXBlbmQgXiBvciAvIGF0IHRoZSBSZWdleHAgY29uc3RydWN0aW9uLlxuICAgIHRvUmVnRXhwU291cmNlKGFsbG93RG90KSB7XG4gICAgICAgIGNvbnN0IGRvdCA9IGFsbG93RG90ID8/ICEhdGhpcy4jb3B0aW9ucy5kb3Q7XG4gICAgICAgIGlmICh0aGlzLiNyb290ID09PSB0aGlzKVxuICAgICAgICAgICAgdGhpcy4jZmlsbE5lZ3MoKTtcbiAgICAgICAgaWYgKCF0aGlzLnR5cGUpIHtcbiAgICAgICAgICAgIGNvbnN0IG5vRW1wdHkgPSB0aGlzLmlzU3RhcnQoKSAmJiB0aGlzLmlzRW5kKCk7XG4gICAgICAgICAgICBjb25zdCBzcmMgPSB0aGlzLiNwYXJ0c1xuICAgICAgICAgICAgICAgIC5tYXAocCA9PiB7XG4gICAgICAgICAgICAgICAgY29uc3QgW3JlLCBfLCBoYXNNYWdpYywgdWZsYWddID0gdHlwZW9mIHAgPT09ICdzdHJpbmcnXG4gICAgICAgICAgICAgICAgICAgID8gQVNULiNwYXJzZUdsb2IocCwgdGhpcy4jaGFzTWFnaWMsIG5vRW1wdHkpXG4gICAgICAgICAgICAgICAgICAgIDogcC50b1JlZ0V4cFNvdXJjZShhbGxvd0RvdCk7XG4gICAgICAgICAgICAgICAgdGhpcy4jaGFzTWFnaWMgPSB0aGlzLiNoYXNNYWdpYyB8fCBoYXNNYWdpYztcbiAgICAgICAgICAgICAgICB0aGlzLiN1ZmxhZyA9IHRoaXMuI3VmbGFnIHx8IHVmbGFnO1xuICAgICAgICAgICAgICAgIHJldHVybiByZTtcbiAgICAgICAgICAgIH0pXG4gICAgICAgICAgICAgICAgLmpvaW4oJycpO1xuICAgICAgICAgICAgbGV0IHN0YXJ0ID0gJyc7XG4gICAgICAgICAgICBpZiAodGhpcy5pc1N0YXJ0KCkpIHtcbiAgICAgICAgICAgICAgICBpZiAodHlwZW9mIHRoaXMuI3BhcnRzWzBdID09PSAnc3RyaW5nJykge1xuICAgICAgICAgICAgICAgICAgICAvLyB0aGlzIGlzIHRoZSBzdHJpbmcgdGhhdCB3aWxsIG1hdGNoIHRoZSBzdGFydCBvZiB0aGUgcGF0dGVybixcbiAgICAgICAgICAgICAgICAgICAgLy8gc28gd2UgbmVlZCB0byBwcm90ZWN0IGFnYWluc3QgZG90cyBhbmQgc3VjaC5cbiAgICAgICAgICAgICAgICAgICAgLy8gJy4nIGFuZCAnLi4nIGNhbm5vdCBtYXRjaCB1bmxlc3MgdGhlIHBhdHRlcm4gaXMgdGhhdCBleGFjdGx5LFxuICAgICAgICAgICAgICAgICAgICAvLyBldmVuIGlmIGl0IHN0YXJ0cyB3aXRoIC4gb3IgZG90OnRydWUgaXMgc2V0LlxuICAgICAgICAgICAgICAgICAgICBjb25zdCBkb3RUcmF2QWxsb3dlZCA9IHRoaXMuI3BhcnRzLmxlbmd0aCA9PT0gMSAmJiBqdXN0RG90cy5oYXModGhpcy4jcGFydHNbMF0pO1xuICAgICAgICAgICAgICAgICAgICBpZiAoIWRvdFRyYXZBbGxvd2VkKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBhcHMgPSBhZGRQYXR0ZXJuU3RhcnQ7XG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBjaGVjayBpZiB3ZSBoYXZlIGEgcG9zc2liaWxpdHkgb2YgbWF0Y2hpbmcgLiBvciAuLixcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIGFuZCBwcmV2ZW50IHRoYXQuXG4gICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBuZWVkTm9UcmF2ID0gXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBkb3RzIGFyZSBhbGxvd2VkLCBhbmQgdGhlIHBhdHRlcm4gc3RhcnRzIHdpdGggWyBvciAuXG4gICAgICAgICAgICAgICAgICAgICAgICAoZG90ICYmIGFwcy5oYXMoc3JjLmNoYXJBdCgwKSkpIHx8XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gdGhlIHBhdHRlcm4gc3RhcnRzIHdpdGggXFwuLCBhbmQgdGhlbiBbIG9yIC5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAoc3JjLnN0YXJ0c1dpdGgoJ1xcXFwuJykgJiYgYXBzLmhhcyhzcmMuY2hhckF0KDIpKSkgfHxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyB0aGUgcGF0dGVybiBzdGFydHMgd2l0aCBcXC5cXC4sIGFuZCB0aGVuIFsgb3IgLlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIChzcmMuc3RhcnRzV2l0aCgnXFxcXC5cXFxcLicpICYmIGFwcy5oYXMoc3JjLmNoYXJBdCg0KSkpO1xuICAgICAgICAgICAgICAgICAgICAgICAgLy8gbm8gbmVlZCB0byBwcmV2ZW50IGRvdHMgaWYgaXQgY2FuJ3QgbWF0Y2ggYSBkb3QsIG9yIGlmIGFcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIHN1Yi1wYXR0ZXJuIHdpbGwgYmUgcHJldmVudGluZyBpdCBhbnl3YXkuXG4gICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBuZWVkTm9Eb3QgPSAhZG90ICYmICFhbGxvd0RvdCAmJiBhcHMuaGFzKHNyYy5jaGFyQXQoMCkpO1xuICAgICAgICAgICAgICAgICAgICAgICAgc3RhcnQgPSBuZWVkTm9UcmF2ID8gc3RhcnROb1RyYXZlcnNhbCA6IG5lZWROb0RvdCA/IHN0YXJ0Tm9Eb3QgOiAnJztcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIC8vIGFwcGVuZCB0aGUgXCJlbmQgb2YgcGF0aCBwb3J0aW9uXCIgcGF0dGVybiB0byBuZWdhdGlvbiB0YWlsc1xuICAgICAgICAgICAgbGV0IGVuZCA9ICcnO1xuICAgICAgICAgICAgaWYgKHRoaXMuaXNFbmQoKSAmJlxuICAgICAgICAgICAgICAgIHRoaXMuI3Jvb3QuI2ZpbGxlZE5lZ3MgJiZcbiAgICAgICAgICAgICAgICB0aGlzLiNwYXJlbnQ/LnR5cGUgPT09ICchJykge1xuICAgICAgICAgICAgICAgIGVuZCA9ICcoPzokfFxcXFwvKSc7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBjb25zdCBmaW5hbCA9IHN0YXJ0ICsgc3JjICsgZW5kO1xuICAgICAgICAgICAgcmV0dXJuIFtcbiAgICAgICAgICAgICAgICBmaW5hbCxcbiAgICAgICAgICAgICAgICAoMCwgdW5lc2NhcGVfanNfMS51bmVzY2FwZSkoc3JjKSxcbiAgICAgICAgICAgICAgICAodGhpcy4jaGFzTWFnaWMgPSAhIXRoaXMuI2hhc01hZ2ljKSxcbiAgICAgICAgICAgICAgICB0aGlzLiN1ZmxhZyxcbiAgICAgICAgICAgIF07XG4gICAgICAgIH1cbiAgICAgICAgLy8gV2UgbmVlZCB0byBjYWxjdWxhdGUgdGhlIGJvZHkgKnR3aWNlKiBpZiBpdCdzIGEgcmVwZWF0IHBhdHRlcm5cbiAgICAgICAgLy8gYXQgdGhlIHN0YXJ0LCBvbmNlIGluIG5vZG90IG1vZGUsIHRoZW4gYWdhaW4gaW4gZG90IG1vZGUsIHNvIGFcbiAgICAgICAgLy8gcGF0dGVybiBsaWtlICooPykgY2FuIG1hdGNoICd4LnknXG4gICAgICAgIGNvbnN0IHJlcGVhdGVkID0gdGhpcy50eXBlID09PSAnKicgfHwgdGhpcy50eXBlID09PSAnKyc7XG4gICAgICAgIC8vIHNvbWUga2luZCBvZiBleHRnbG9iXG4gICAgICAgIGNvbnN0IHN0YXJ0ID0gdGhpcy50eXBlID09PSAnIScgPyAnKD86KD8hKD86JyA6ICcoPzonO1xuICAgICAgICBsZXQgYm9keSA9IHRoaXMuI3BhcnRzVG9SZWdFeHAoZG90KTtcbiAgICAgICAgaWYgKHRoaXMuaXNTdGFydCgpICYmIHRoaXMuaXNFbmQoKSAmJiAhYm9keSAmJiB0aGlzLnR5cGUgIT09ICchJykge1xuICAgICAgICAgICAgLy8gaW52YWxpZCBleHRnbG9iLCBoYXMgdG8gYXQgbGVhc3QgYmUgKnNvbWV0aGluZyogcHJlc2VudCwgaWYgaXQnc1xuICAgICAgICAgICAgLy8gdGhlIGVudGlyZSBwYXRoIHBvcnRpb24uXG4gICAgICAgICAgICBjb25zdCBzID0gdGhpcy50b1N0cmluZygpO1xuICAgICAgICAgICAgdGhpcy4jcGFydHMgPSBbc107XG4gICAgICAgICAgICB0aGlzLnR5cGUgPSBudWxsO1xuICAgICAgICAgICAgdGhpcy4jaGFzTWFnaWMgPSB1bmRlZmluZWQ7XG4gICAgICAgICAgICByZXR1cm4gW3MsICgwLCB1bmVzY2FwZV9qc18xLnVuZXNjYXBlKSh0aGlzLnRvU3RyaW5nKCkpLCBmYWxzZSwgZmFsc2VdO1xuICAgICAgICB9XG4gICAgICAgIC8vIFhYWCBhYnN0cmFjdCBvdXQgdGhpcyBtYXAgbWV0aG9kXG4gICAgICAgIGxldCBib2R5RG90QWxsb3dlZCA9ICFyZXBlYXRlZCB8fCBhbGxvd0RvdCB8fCBkb3QgfHwgIXN0YXJ0Tm9Eb3RcbiAgICAgICAgICAgID8gJydcbiAgICAgICAgICAgIDogdGhpcy4jcGFydHNUb1JlZ0V4cCh0cnVlKTtcbiAgICAgICAgaWYgKGJvZHlEb3RBbGxvd2VkID09PSBib2R5KSB7XG4gICAgICAgICAgICBib2R5RG90QWxsb3dlZCA9ICcnO1xuICAgICAgICB9XG4gICAgICAgIGlmIChib2R5RG90QWxsb3dlZCkge1xuICAgICAgICAgICAgYm9keSA9IGAoPzoke2JvZHl9KSg/OiR7Ym9keURvdEFsbG93ZWR9KSo/YDtcbiAgICAgICAgfVxuICAgICAgICAvLyBhbiBlbXB0eSAhKCkgaXMgZXhhY3RseSBlcXVpdmFsZW50IHRvIGEgc3Rhck5vRW1wdHlcbiAgICAgICAgbGV0IGZpbmFsID0gJyc7XG4gICAgICAgIGlmICh0aGlzLnR5cGUgPT09ICchJyAmJiB0aGlzLiNlbXB0eUV4dCkge1xuICAgICAgICAgICAgZmluYWwgPSAodGhpcy5pc1N0YXJ0KCkgJiYgIWRvdCA/IHN0YXJ0Tm9Eb3QgOiAnJykgKyBzdGFyTm9FbXB0eTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIGNvbnN0IGNsb3NlID0gdGhpcy50eXBlID09PSAnISdcbiAgICAgICAgICAgICAgICA/IC8vICEoKSBtdXN0IG1hdGNoIHNvbWV0aGluZyxidXQgISh4KSBjYW4gbWF0Y2ggJydcbiAgICAgICAgICAgICAgICAgICAgJykpJyArXG4gICAgICAgICAgICAgICAgICAgICAgICAodGhpcy5pc1N0YXJ0KCkgJiYgIWRvdCAmJiAhYWxsb3dEb3QgPyBzdGFydE5vRG90IDogJycpICtcbiAgICAgICAgICAgICAgICAgICAgICAgIHN0YXIgK1xuICAgICAgICAgICAgICAgICAgICAgICAgJyknXG4gICAgICAgICAgICAgICAgOiB0aGlzLnR5cGUgPT09ICdAJ1xuICAgICAgICAgICAgICAgICAgICA/ICcpJ1xuICAgICAgICAgICAgICAgICAgICA6IHRoaXMudHlwZSA9PT0gJz8nXG4gICAgICAgICAgICAgICAgICAgICAgICA/ICcpPydcbiAgICAgICAgICAgICAgICAgICAgICAgIDogdGhpcy50eXBlID09PSAnKycgJiYgYm9keURvdEFsbG93ZWRcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA/ICcpJ1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDogdGhpcy50eXBlID09PSAnKicgJiYgYm9keURvdEFsbG93ZWRcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPyBgKT9gXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDogYCkke3RoaXMudHlwZX1gO1xuICAgICAgICAgICAgZmluYWwgPSBzdGFydCArIGJvZHkgKyBjbG9zZTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gW1xuICAgICAgICAgICAgZmluYWwsXG4gICAgICAgICAgICAoMCwgdW5lc2NhcGVfanNfMS51bmVzY2FwZSkoYm9keSksXG4gICAgICAgICAgICAodGhpcy4jaGFzTWFnaWMgPSAhIXRoaXMuI2hhc01hZ2ljKSxcbiAgICAgICAgICAgIHRoaXMuI3VmbGFnLFxuICAgICAgICBdO1xuICAgIH1cbiAgICAjcGFydHNUb1JlZ0V4cChkb3QpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuI3BhcnRzXG4gICAgICAgICAgICAubWFwKHAgPT4ge1xuICAgICAgICAgICAgLy8gZXh0Z2xvYiBBU1RzIHNob3VsZCBvbmx5IGNvbnRhaW4gcGFyZW50IEFTVHNcbiAgICAgICAgICAgIC8qIGM4IGlnbm9yZSBzdGFydCAqL1xuICAgICAgICAgICAgaWYgKHR5cGVvZiBwID09PSAnc3RyaW5nJykge1xuICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcignc3RyaW5nIHR5cGUgaW4gZXh0Z2xvYiBhc3Q/PycpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgLyogYzggaWdub3JlIHN0b3AgKi9cbiAgICAgICAgICAgIC8vIGNhbiBpZ25vcmUgaGFzTWFnaWMsIGJlY2F1c2UgZXh0Z2xvYnMgYXJlIGFscmVhZHkgYWx3YXlzIG1hZ2ljXG4gICAgICAgICAgICBjb25zdCBbcmUsIF8sIF9oYXNNYWdpYywgdWZsYWddID0gcC50b1JlZ0V4cFNvdXJjZShkb3QpO1xuICAgICAgICAgICAgdGhpcy4jdWZsYWcgPSB0aGlzLiN1ZmxhZyB8fCB1ZmxhZztcbiAgICAgICAgICAgIHJldHVybiByZTtcbiAgICAgICAgfSlcbiAgICAgICAgICAgIC5maWx0ZXIocCA9PiAhKHRoaXMuaXNTdGFydCgpICYmIHRoaXMuaXNFbmQoKSkgfHwgISFwKVxuICAgICAgICAgICAgLmpvaW4oJ3wnKTtcbiAgICB9XG4gICAgc3RhdGljICNwYXJzZUdsb2IoZ2xvYiwgaGFzTWFnaWMsIG5vRW1wdHkgPSBmYWxzZSkge1xuICAgICAgICBsZXQgZXNjYXBpbmcgPSBmYWxzZTtcbiAgICAgICAgbGV0IHJlID0gJyc7XG4gICAgICAgIGxldCB1ZmxhZyA9IGZhbHNlO1xuICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IGdsb2IubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgIGNvbnN0IGMgPSBnbG9iLmNoYXJBdChpKTtcbiAgICAgICAgICAgIGlmIChlc2NhcGluZykge1xuICAgICAgICAgICAgICAgIGVzY2FwaW5nID0gZmFsc2U7XG4gICAgICAgICAgICAgICAgcmUgKz0gKHJlU3BlY2lhbHMuaGFzKGMpID8gJ1xcXFwnIDogJycpICsgYztcbiAgICAgICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmIChjID09PSAnXFxcXCcpIHtcbiAgICAgICAgICAgICAgICBpZiAoaSA9PT0gZ2xvYi5sZW5ndGggLSAxKSB7XG4gICAgICAgICAgICAgICAgICAgIHJlICs9ICdcXFxcXFxcXCc7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICBlc2NhcGluZyA9IHRydWU7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKGMgPT09ICdbJykge1xuICAgICAgICAgICAgICAgIGNvbnN0IFtzcmMsIG5lZWRVZmxhZywgY29uc3VtZWQsIG1hZ2ljXSA9ICgwLCBicmFjZV9leHByZXNzaW9uc19qc18xLnBhcnNlQ2xhc3MpKGdsb2IsIGkpO1xuICAgICAgICAgICAgICAgIGlmIChjb25zdW1lZCkge1xuICAgICAgICAgICAgICAgICAgICByZSArPSBzcmM7XG4gICAgICAgICAgICAgICAgICAgIHVmbGFnID0gdWZsYWcgfHwgbmVlZFVmbGFnO1xuICAgICAgICAgICAgICAgICAgICBpICs9IGNvbnN1bWVkIC0gMTtcbiAgICAgICAgICAgICAgICAgICAgaGFzTWFnaWMgPSBoYXNNYWdpYyB8fCBtYWdpYztcbiAgICAgICAgICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKGMgPT09ICcqJykge1xuICAgICAgICAgICAgICAgIGlmIChub0VtcHR5ICYmIGdsb2IgPT09ICcqJylcbiAgICAgICAgICAgICAgICAgICAgcmUgKz0gc3Rhck5vRW1wdHk7XG4gICAgICAgICAgICAgICAgZWxzZVxuICAgICAgICAgICAgICAgICAgICByZSArPSBzdGFyO1xuICAgICAgICAgICAgICAgIGhhc01hZ2ljID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmIChjID09PSAnPycpIHtcbiAgICAgICAgICAgICAgICByZSArPSBxbWFyaztcbiAgICAgICAgICAgICAgICBoYXNNYWdpYyA9IHRydWU7XG4gICAgICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZSArPSByZWdFeHBFc2NhcGUoYyk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIFtyZSwgKDAsIHVuZXNjYXBlX2pzXzEudW5lc2NhcGUpKGdsb2IpLCAhIWhhc01hZ2ljLCB1ZmxhZ107XG4gICAgfVxufVxuZXhwb3J0cy5BU1QgPSBBU1Q7XG4vLyMgc291cmNlTWFwcGluZ1VSTD1hc3QuanMubWFwIiwKICAgICJcInVzZSBzdHJpY3RcIjtcbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIl9fZXNNb2R1bGVcIiwgeyB2YWx1ZTogdHJ1ZSB9KTtcbmV4cG9ydHMuZXNjYXBlID0gdm9pZCAwO1xuLyoqXG4gKiBFc2NhcGUgYWxsIG1hZ2ljIGNoYXJhY3RlcnMgaW4gYSBnbG9iIHBhdHRlcm4uXG4gKlxuICogSWYgdGhlIHtAbGluayB3aW5kb3dzUGF0aHNOb0VzY2FwZSB8IEdsb2JPcHRpb25zLndpbmRvd3NQYXRoc05vRXNjYXBlfVxuICogb3B0aW9uIGlzIHVzZWQsIHRoZW4gY2hhcmFjdGVycyBhcmUgZXNjYXBlZCBieSB3cmFwcGluZyBpbiBgW11gLCBiZWNhdXNlXG4gKiBhIG1hZ2ljIGNoYXJhY3RlciB3cmFwcGVkIGluIGEgY2hhcmFjdGVyIGNsYXNzIGNhbiBvbmx5IGJlIHNhdGlzZmllZCBieVxuICogdGhhdCBleGFjdCBjaGFyYWN0ZXIuICBJbiB0aGlzIG1vZGUsIGBcXGAgaXMgX25vdF8gZXNjYXBlZCwgYmVjYXVzZSBpdCBpc1xuICogbm90IGludGVycHJldGVkIGFzIGEgbWFnaWMgY2hhcmFjdGVyLCBidXQgaW5zdGVhZCBhcyBhIHBhdGggc2VwYXJhdG9yLlxuICovXG5jb25zdCBlc2NhcGUgPSAocywgeyB3aW5kb3dzUGF0aHNOb0VzY2FwZSA9IGZhbHNlLCB9ID0ge30pID0+IHtcbiAgICAvLyBkb24ndCBuZWVkIHRvIGVzY2FwZSArQCEgYmVjYXVzZSB3ZSBlc2NhcGUgdGhlIHBhcmVuc1xuICAgIC8vIHRoYXQgbWFrZSB0aG9zZSBtYWdpYywgYW5kIGVzY2FwaW5nICEgYXMgWyFdIGlzbid0IHZhbGlkLFxuICAgIC8vIGJlY2F1c2UgWyFdXSBpcyBhIHZhbGlkIGdsb2IgY2xhc3MgbWVhbmluZyBub3QgJ10nLlxuICAgIHJldHVybiB3aW5kb3dzUGF0aHNOb0VzY2FwZVxuICAgICAgICA/IHMucmVwbGFjZSgvWz8qKClbXFxdXS9nLCAnWyQmXScpXG4gICAgICAgIDogcy5yZXBsYWNlKC9bPyooKVtcXF1cXFxcXS9nLCAnXFxcXCQmJyk7XG59O1xuZXhwb3J0cy5lc2NhcGUgPSBlc2NhcGU7XG4vLyMgc291cmNlTWFwcGluZ1VSTD1lc2NhcGUuanMubWFwIiwKICAgICJcInVzZSBzdHJpY3RcIjtcbnZhciBfX2ltcG9ydERlZmF1bHQgPSAodGhpcyAmJiB0aGlzLl9faW1wb3J0RGVmYXVsdCkgfHwgZnVuY3Rpb24gKG1vZCkge1xuICAgIHJldHVybiAobW9kICYmIG1vZC5fX2VzTW9kdWxlKSA/IG1vZCA6IHsgXCJkZWZhdWx0XCI6IG1vZCB9O1xufTtcbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIl9fZXNNb2R1bGVcIiwgeyB2YWx1ZTogdHJ1ZSB9KTtcbmV4cG9ydHMudW5lc2NhcGUgPSBleHBvcnRzLmVzY2FwZSA9IGV4cG9ydHMuQVNUID0gZXhwb3J0cy5NaW5pbWF0Y2ggPSBleHBvcnRzLm1hdGNoID0gZXhwb3J0cy5tYWtlUmUgPSBleHBvcnRzLmJyYWNlRXhwYW5kID0gZXhwb3J0cy5kZWZhdWx0cyA9IGV4cG9ydHMuZmlsdGVyID0gZXhwb3J0cy5HTE9CU1RBUiA9IGV4cG9ydHMuc2VwID0gZXhwb3J0cy5taW5pbWF0Y2ggPSB2b2lkIDA7XG5jb25zdCBicmFjZV9leHBhbnNpb25fMSA9IF9faW1wb3J0RGVmYXVsdChyZXF1aXJlKFwiYnJhY2UtZXhwYW5zaW9uXCIpKTtcbmNvbnN0IGFzc2VydF92YWxpZF9wYXR0ZXJuX2pzXzEgPSByZXF1aXJlKFwiLi9hc3NlcnQtdmFsaWQtcGF0dGVybi5qc1wiKTtcbmNvbnN0IGFzdF9qc18xID0gcmVxdWlyZShcIi4vYXN0LmpzXCIpO1xuY29uc3QgZXNjYXBlX2pzXzEgPSByZXF1aXJlKFwiLi9lc2NhcGUuanNcIik7XG5jb25zdCB1bmVzY2FwZV9qc18xID0gcmVxdWlyZShcIi4vdW5lc2NhcGUuanNcIik7XG5jb25zdCBtaW5pbWF0Y2ggPSAocCwgcGF0dGVybiwgb3B0aW9ucyA9IHt9KSA9PiB7XG4gICAgKDAsIGFzc2VydF92YWxpZF9wYXR0ZXJuX2pzXzEuYXNzZXJ0VmFsaWRQYXR0ZXJuKShwYXR0ZXJuKTtcbiAgICAvLyBzaG9ydGN1dDogY29tbWVudHMgbWF0Y2ggbm90aGluZy5cbiAgICBpZiAoIW9wdGlvbnMubm9jb21tZW50ICYmIHBhdHRlcm4uY2hhckF0KDApID09PSAnIycpIHtcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgICByZXR1cm4gbmV3IE1pbmltYXRjaChwYXR0ZXJuLCBvcHRpb25zKS5tYXRjaChwKTtcbn07XG5leHBvcnRzLm1pbmltYXRjaCA9IG1pbmltYXRjaDtcbi8vIE9wdGltaXplZCBjaGVja2luZyBmb3IgdGhlIG1vc3QgY29tbW9uIGdsb2IgcGF0dGVybnMuXG5jb25zdCBzdGFyRG90RXh0UkUgPSAvXlxcKisoW14rQCE/XFwqXFxbXFwoXSopJC87XG5jb25zdCBzdGFyRG90RXh0VGVzdCA9IChleHQpID0+IChmKSA9PiAhZi5zdGFydHNXaXRoKCcuJykgJiYgZi5lbmRzV2l0aChleHQpO1xuY29uc3Qgc3RhckRvdEV4dFRlc3REb3QgPSAoZXh0KSA9PiAoZikgPT4gZi5lbmRzV2l0aChleHQpO1xuY29uc3Qgc3RhckRvdEV4dFRlc3ROb2Nhc2UgPSAoZXh0KSA9PiB7XG4gICAgZXh0ID0gZXh0LnRvTG93ZXJDYXNlKCk7XG4gICAgcmV0dXJuIChmKSA9PiAhZi5zdGFydHNXaXRoKCcuJykgJiYgZi50b0xvd2VyQ2FzZSgpLmVuZHNXaXRoKGV4dCk7XG59O1xuY29uc3Qgc3RhckRvdEV4dFRlc3ROb2Nhc2VEb3QgPSAoZXh0KSA9PiB7XG4gICAgZXh0ID0gZXh0LnRvTG93ZXJDYXNlKCk7XG4gICAgcmV0dXJuIChmKSA9PiBmLnRvTG93ZXJDYXNlKCkuZW5kc1dpdGgoZXh0KTtcbn07XG5jb25zdCBzdGFyRG90U3RhclJFID0gL15cXCorXFwuXFwqKyQvO1xuY29uc3Qgc3RhckRvdFN0YXJUZXN0ID0gKGYpID0+ICFmLnN0YXJ0c1dpdGgoJy4nKSAmJiBmLmluY2x1ZGVzKCcuJyk7XG5jb25zdCBzdGFyRG90U3RhclRlc3REb3QgPSAoZikgPT4gZiAhPT0gJy4nICYmIGYgIT09ICcuLicgJiYgZi5pbmNsdWRlcygnLicpO1xuY29uc3QgZG90U3RhclJFID0gL15cXC5cXCorJC87XG5jb25zdCBkb3RTdGFyVGVzdCA9IChmKSA9PiBmICE9PSAnLicgJiYgZiAhPT0gJy4uJyAmJiBmLnN0YXJ0c1dpdGgoJy4nKTtcbmNvbnN0IHN0YXJSRSA9IC9eXFwqKyQvO1xuY29uc3Qgc3RhclRlc3QgPSAoZikgPT4gZi5sZW5ndGggIT09IDAgJiYgIWYuc3RhcnRzV2l0aCgnLicpO1xuY29uc3Qgc3RhclRlc3REb3QgPSAoZikgPT4gZi5sZW5ndGggIT09IDAgJiYgZiAhPT0gJy4nICYmIGYgIT09ICcuLic7XG5jb25zdCBxbWFya3NSRSA9IC9eXFw/KyhbXitAIT9cXCpcXFtcXChdKik/JC87XG5jb25zdCBxbWFya3NUZXN0Tm9jYXNlID0gKFskMCwgZXh0ID0gJyddKSA9PiB7XG4gICAgY29uc3Qgbm9leHQgPSBxbWFya3NUZXN0Tm9FeHQoWyQwXSk7XG4gICAgaWYgKCFleHQpXG4gICAgICAgIHJldHVybiBub2V4dDtcbiAgICBleHQgPSBleHQudG9Mb3dlckNhc2UoKTtcbiAgICByZXR1cm4gKGYpID0+IG5vZXh0KGYpICYmIGYudG9Mb3dlckNhc2UoKS5lbmRzV2l0aChleHQpO1xufTtcbmNvbnN0IHFtYXJrc1Rlc3ROb2Nhc2VEb3QgPSAoWyQwLCBleHQgPSAnJ10pID0+IHtcbiAgICBjb25zdCBub2V4dCA9IHFtYXJrc1Rlc3ROb0V4dERvdChbJDBdKTtcbiAgICBpZiAoIWV4dClcbiAgICAgICAgcmV0dXJuIG5vZXh0O1xuICAgIGV4dCA9IGV4dC50b0xvd2VyQ2FzZSgpO1xuICAgIHJldHVybiAoZikgPT4gbm9leHQoZikgJiYgZi50b0xvd2VyQ2FzZSgpLmVuZHNXaXRoKGV4dCk7XG59O1xuY29uc3QgcW1hcmtzVGVzdERvdCA9IChbJDAsIGV4dCA9ICcnXSkgPT4ge1xuICAgIGNvbnN0IG5vZXh0ID0gcW1hcmtzVGVzdE5vRXh0RG90KFskMF0pO1xuICAgIHJldHVybiAhZXh0ID8gbm9leHQgOiAoZikgPT4gbm9leHQoZikgJiYgZi5lbmRzV2l0aChleHQpO1xufTtcbmNvbnN0IHFtYXJrc1Rlc3QgPSAoWyQwLCBleHQgPSAnJ10pID0+IHtcbiAgICBjb25zdCBub2V4dCA9IHFtYXJrc1Rlc3ROb0V4dChbJDBdKTtcbiAgICByZXR1cm4gIWV4dCA/IG5vZXh0IDogKGYpID0+IG5vZXh0KGYpICYmIGYuZW5kc1dpdGgoZXh0KTtcbn07XG5jb25zdCBxbWFya3NUZXN0Tm9FeHQgPSAoWyQwXSkgPT4ge1xuICAgIGNvbnN0IGxlbiA9ICQwLmxlbmd0aDtcbiAgICByZXR1cm4gKGYpID0+IGYubGVuZ3RoID09PSBsZW4gJiYgIWYuc3RhcnRzV2l0aCgnLicpO1xufTtcbmNvbnN0IHFtYXJrc1Rlc3ROb0V4dERvdCA9IChbJDBdKSA9PiB7XG4gICAgY29uc3QgbGVuID0gJDAubGVuZ3RoO1xuICAgIHJldHVybiAoZikgPT4gZi5sZW5ndGggPT09IGxlbiAmJiBmICE9PSAnLicgJiYgZiAhPT0gJy4uJztcbn07XG4vKiBjOCBpZ25vcmUgc3RhcnQgKi9cbmNvbnN0IGRlZmF1bHRQbGF0Zm9ybSA9ICh0eXBlb2YgcHJvY2VzcyA9PT0gJ29iamVjdCcgJiYgcHJvY2Vzc1xuICAgID8gKHR5cGVvZiBwcm9jZXNzLmVudiA9PT0gJ29iamVjdCcgJiZcbiAgICAgICAgcHJvY2Vzcy5lbnYgJiZcbiAgICAgICAgcHJvY2Vzcy5lbnYuX19NSU5JTUFUQ0hfVEVTVElOR19QTEFURk9STV9fKSB8fFxuICAgICAgICBwcm9jZXNzLnBsYXRmb3JtXG4gICAgOiAncG9zaXgnKTtcbmNvbnN0IHBhdGggPSB7XG4gICAgd2luMzI6IHsgc2VwOiAnXFxcXCcgfSxcbiAgICBwb3NpeDogeyBzZXA6ICcvJyB9LFxufTtcbi8qIGM4IGlnbm9yZSBzdG9wICovXG5leHBvcnRzLnNlcCA9IGRlZmF1bHRQbGF0Zm9ybSA9PT0gJ3dpbjMyJyA/IHBhdGgud2luMzIuc2VwIDogcGF0aC5wb3NpeC5zZXA7XG5leHBvcnRzLm1pbmltYXRjaC5zZXAgPSBleHBvcnRzLnNlcDtcbmV4cG9ydHMuR0xPQlNUQVIgPSBTeW1ib2woJ2dsb2JzdGFyICoqJyk7XG5leHBvcnRzLm1pbmltYXRjaC5HTE9CU1RBUiA9IGV4cG9ydHMuR0xPQlNUQVI7XG4vLyBhbnkgc2luZ2xlIHRoaW5nIG90aGVyIHRoYW4gL1xuLy8gZG9uJ3QgbmVlZCB0byBlc2NhcGUgLyB3aGVuIHVzaW5nIG5ldyBSZWdFeHAoKVxuY29uc3QgcW1hcmsgPSAnW14vXSc7XG4vLyAqID0+IGFueSBudW1iZXIgb2YgY2hhcmFjdGVyc1xuY29uc3Qgc3RhciA9IHFtYXJrICsgJyo/Jztcbi8vICoqIHdoZW4gZG90cyBhcmUgYWxsb3dlZC4gIEFueXRoaW5nIGdvZXMsIGV4Y2VwdCAuLiBhbmQgLlxuLy8gbm90ICheIG9yIC8gZm9sbG93ZWQgYnkgb25lIG9yIHR3byBkb3RzIGZvbGxvd2VkIGJ5ICQgb3IgLyksXG4vLyBmb2xsb3dlZCBieSBhbnl0aGluZywgYW55IG51bWJlciBvZiB0aW1lcy5cbmNvbnN0IHR3b1N0YXJEb3QgPSAnKD86KD8hKD86XFxcXC98XikoPzpcXFxcLnsxLDJ9KSgkfFxcXFwvKSkuKSo/Jztcbi8vIG5vdCBhIF4gb3IgLyBmb2xsb3dlZCBieSBhIGRvdCxcbi8vIGZvbGxvd2VkIGJ5IGFueXRoaW5nLCBhbnkgbnVtYmVyIG9mIHRpbWVzLlxuY29uc3QgdHdvU3Rhck5vRG90ID0gJyg/Oig/ISg/OlxcXFwvfF4pXFxcXC4pLikqPyc7XG5jb25zdCBmaWx0ZXIgPSAocGF0dGVybiwgb3B0aW9ucyA9IHt9KSA9PiAocCkgPT4gKDAsIGV4cG9ydHMubWluaW1hdGNoKShwLCBwYXR0ZXJuLCBvcHRpb25zKTtcbmV4cG9ydHMuZmlsdGVyID0gZmlsdGVyO1xuZXhwb3J0cy5taW5pbWF0Y2guZmlsdGVyID0gZXhwb3J0cy5maWx0ZXI7XG5jb25zdCBleHQgPSAoYSwgYiA9IHt9KSA9PiBPYmplY3QuYXNzaWduKHt9LCBhLCBiKTtcbmNvbnN0IGRlZmF1bHRzID0gKGRlZikgPT4ge1xuICAgIGlmICghZGVmIHx8IHR5cGVvZiBkZWYgIT09ICdvYmplY3QnIHx8ICFPYmplY3Qua2V5cyhkZWYpLmxlbmd0aCkge1xuICAgICAgICByZXR1cm4gZXhwb3J0cy5taW5pbWF0Y2g7XG4gICAgfVxuICAgIGNvbnN0IG9yaWcgPSBleHBvcnRzLm1pbmltYXRjaDtcbiAgICBjb25zdCBtID0gKHAsIHBhdHRlcm4sIG9wdGlvbnMgPSB7fSkgPT4gb3JpZyhwLCBwYXR0ZXJuLCBleHQoZGVmLCBvcHRpb25zKSk7XG4gICAgcmV0dXJuIE9iamVjdC5hc3NpZ24obSwge1xuICAgICAgICBNaW5pbWF0Y2g6IGNsYXNzIE1pbmltYXRjaCBleHRlbmRzIG9yaWcuTWluaW1hdGNoIHtcbiAgICAgICAgICAgIGNvbnN0cnVjdG9yKHBhdHRlcm4sIG9wdGlvbnMgPSB7fSkge1xuICAgICAgICAgICAgICAgIHN1cGVyKHBhdHRlcm4sIGV4dChkZWYsIG9wdGlvbnMpKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHN0YXRpYyBkZWZhdWx0cyhvcHRpb25zKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIG9yaWcuZGVmYXVsdHMoZXh0KGRlZiwgb3B0aW9ucykpLk1pbmltYXRjaDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSxcbiAgICAgICAgQVNUOiBjbGFzcyBBU1QgZXh0ZW5kcyBvcmlnLkFTVCB7XG4gICAgICAgICAgICAvKiBjOCBpZ25vcmUgc3RhcnQgKi9cbiAgICAgICAgICAgIGNvbnN0cnVjdG9yKHR5cGUsIHBhcmVudCwgb3B0aW9ucyA9IHt9KSB7XG4gICAgICAgICAgICAgICAgc3VwZXIodHlwZSwgcGFyZW50LCBleHQoZGVmLCBvcHRpb25zKSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICAvKiBjOCBpZ25vcmUgc3RvcCAqL1xuICAgICAgICAgICAgc3RhdGljIGZyb21HbG9iKHBhdHRlcm4sIG9wdGlvbnMgPSB7fSkge1xuICAgICAgICAgICAgICAgIHJldHVybiBvcmlnLkFTVC5mcm9tR2xvYihwYXR0ZXJuLCBleHQoZGVmLCBvcHRpb25zKSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0sXG4gICAgICAgIHVuZXNjYXBlOiAocywgb3B0aW9ucyA9IHt9KSA9PiBvcmlnLnVuZXNjYXBlKHMsIGV4dChkZWYsIG9wdGlvbnMpKSxcbiAgICAgICAgZXNjYXBlOiAocywgb3B0aW9ucyA9IHt9KSA9PiBvcmlnLmVzY2FwZShzLCBleHQoZGVmLCBvcHRpb25zKSksXG4gICAgICAgIGZpbHRlcjogKHBhdHRlcm4sIG9wdGlvbnMgPSB7fSkgPT4gb3JpZy5maWx0ZXIocGF0dGVybiwgZXh0KGRlZiwgb3B0aW9ucykpLFxuICAgICAgICBkZWZhdWx0czogKG9wdGlvbnMpID0+IG9yaWcuZGVmYXVsdHMoZXh0KGRlZiwgb3B0aW9ucykpLFxuICAgICAgICBtYWtlUmU6IChwYXR0ZXJuLCBvcHRpb25zID0ge30pID0+IG9yaWcubWFrZVJlKHBhdHRlcm4sIGV4dChkZWYsIG9wdGlvbnMpKSxcbiAgICAgICAgYnJhY2VFeHBhbmQ6IChwYXR0ZXJuLCBvcHRpb25zID0ge30pID0+IG9yaWcuYnJhY2VFeHBhbmQocGF0dGVybiwgZXh0KGRlZiwgb3B0aW9ucykpLFxuICAgICAgICBtYXRjaDogKGxpc3QsIHBhdHRlcm4sIG9wdGlvbnMgPSB7fSkgPT4gb3JpZy5tYXRjaChsaXN0LCBwYXR0ZXJuLCBleHQoZGVmLCBvcHRpb25zKSksXG4gICAgICAgIHNlcDogb3JpZy5zZXAsXG4gICAgICAgIEdMT0JTVEFSOiBleHBvcnRzLkdMT0JTVEFSLFxuICAgIH0pO1xufTtcbmV4cG9ydHMuZGVmYXVsdHMgPSBkZWZhdWx0cztcbmV4cG9ydHMubWluaW1hdGNoLmRlZmF1bHRzID0gZXhwb3J0cy5kZWZhdWx0cztcbi8vIEJyYWNlIGV4cGFuc2lvbjpcbi8vIGF7YixjfWQgLT4gYWJkIGFjZFxuLy8gYXtiLH1jIC0+IGFiYyBhY1xuLy8gYXswLi4zfWQgLT4gYTBkIGExZCBhMmQgYTNkXG4vLyBhe2IsY3tkLGV9Zn1nIC0+IGFiZyBhY2RmZyBhY2VmZ1xuLy8gYXtiLGN9ZHtlLGZ9ZyAtPiBhYmRlZyBhY2RlZyBhYmRlZyBhYmRmZ1xuLy9cbi8vIEludmFsaWQgc2V0cyBhcmUgbm90IGV4cGFuZGVkLlxuLy8gYXsyLi59YiAtPiBhezIuLn1iXG4vLyBhe2J9YyAtPiBhe2J9Y1xuY29uc3QgYnJhY2VFeHBhbmQgPSAocGF0dGVybiwgb3B0aW9ucyA9IHt9KSA9PiB7XG4gICAgKDAsIGFzc2VydF92YWxpZF9wYXR0ZXJuX2pzXzEuYXNzZXJ0VmFsaWRQYXR0ZXJuKShwYXR0ZXJuKTtcbiAgICAvLyBUaGFua3MgdG8gWWV0aW5nIExpIDxodHRwczovL2dpdGh1Yi5jb20veWV0aW5nbGk+IGZvclxuICAgIC8vIGltcHJvdmluZyB0aGlzIHJlZ2V4cCB0byBhdm9pZCBhIFJlRE9TIHZ1bG5lcmFiaWxpdHkuXG4gICAgaWYgKG9wdGlvbnMubm9icmFjZSB8fCAhL1xceyg/Oig/IVxceykuKSpcXH0vLnRlc3QocGF0dGVybikpIHtcbiAgICAgICAgLy8gc2hvcnRjdXQuIG5vIG5lZWQgdG8gZXhwYW5kLlxuICAgICAgICByZXR1cm4gW3BhdHRlcm5dO1xuICAgIH1cbiAgICByZXR1cm4gKDAsIGJyYWNlX2V4cGFuc2lvbl8xLmRlZmF1bHQpKHBhdHRlcm4pO1xufTtcbmV4cG9ydHMuYnJhY2VFeHBhbmQgPSBicmFjZUV4cGFuZDtcbmV4cG9ydHMubWluaW1hdGNoLmJyYWNlRXhwYW5kID0gZXhwb3J0cy5icmFjZUV4cGFuZDtcbi8vIHBhcnNlIGEgY29tcG9uZW50IG9mIHRoZSBleHBhbmRlZCBzZXQuXG4vLyBBdCB0aGlzIHBvaW50LCBubyBwYXR0ZXJuIG1heSBjb250YWluIFwiL1wiIGluIGl0XG4vLyBzbyB3ZSdyZSBnb2luZyB0byByZXR1cm4gYSAyZCBhcnJheSwgd2hlcmUgZWFjaCBlbnRyeSBpcyB0aGUgZnVsbFxuLy8gcGF0dGVybiwgc3BsaXQgb24gJy8nLCBhbmQgdGhlbiB0dXJuZWQgaW50byBhIHJlZ3VsYXIgZXhwcmVzc2lvbi5cbi8vIEEgcmVnZXhwIGlzIG1hZGUgYXQgdGhlIGVuZCB3aGljaCBqb2lucyBlYWNoIGFycmF5IHdpdGggYW5cbi8vIGVzY2FwZWQgLywgYW5kIGFub3RoZXIgZnVsbCBvbmUgd2hpY2ggam9pbnMgZWFjaCByZWdleHAgd2l0aCB8LlxuLy9cbi8vIEZvbGxvd2luZyB0aGUgbGVhZCBvZiBCYXNoIDQuMSwgbm90ZSB0aGF0IFwiKipcIiBvbmx5IGhhcyBzcGVjaWFsIG1lYW5pbmdcbi8vIHdoZW4gaXQgaXMgdGhlICpvbmx5KiB0aGluZyBpbiBhIHBhdGggcG9ydGlvbi4gIE90aGVyd2lzZSwgYW55IHNlcmllc1xuLy8gb2YgKiBpcyBlcXVpdmFsZW50IHRvIGEgc2luZ2xlICouICBHbG9ic3RhciBiZWhhdmlvciBpcyBlbmFibGVkIGJ5XG4vLyBkZWZhdWx0LCBhbmQgY2FuIGJlIGRpc2FibGVkIGJ5IHNldHRpbmcgb3B0aW9ucy5ub2dsb2JzdGFyLlxuY29uc3QgbWFrZVJlID0gKHBhdHRlcm4sIG9wdGlvbnMgPSB7fSkgPT4gbmV3IE1pbmltYXRjaChwYXR0ZXJuLCBvcHRpb25zKS5tYWtlUmUoKTtcbmV4cG9ydHMubWFrZVJlID0gbWFrZVJlO1xuZXhwb3J0cy5taW5pbWF0Y2gubWFrZVJlID0gZXhwb3J0cy5tYWtlUmU7XG5jb25zdCBtYXRjaCA9IChsaXN0LCBwYXR0ZXJuLCBvcHRpb25zID0ge30pID0+IHtcbiAgICBjb25zdCBtbSA9IG5ldyBNaW5pbWF0Y2gocGF0dGVybiwgb3B0aW9ucyk7XG4gICAgbGlzdCA9IGxpc3QuZmlsdGVyKGYgPT4gbW0ubWF0Y2goZikpO1xuICAgIGlmIChtbS5vcHRpb25zLm5vbnVsbCAmJiAhbGlzdC5sZW5ndGgpIHtcbiAgICAgICAgbGlzdC5wdXNoKHBhdHRlcm4pO1xuICAgIH1cbiAgICByZXR1cm4gbGlzdDtcbn07XG5leHBvcnRzLm1hdGNoID0gbWF0Y2g7XG5leHBvcnRzLm1pbmltYXRjaC5tYXRjaCA9IGV4cG9ydHMubWF0Y2g7XG4vLyByZXBsYWNlIHN0dWZmIGxpa2UgXFwqIHdpdGggKlxuY29uc3QgZ2xvYk1hZ2ljID0gL1s/Kl18WytAIV1cXCguKj9cXCl8XFxbfFxcXS87XG5jb25zdCByZWdFeHBFc2NhcGUgPSAocykgPT4gcy5yZXBsYWNlKC9bLVtcXF17fSgpKis/LixcXFxcXiR8I1xcc10vZywgJ1xcXFwkJicpO1xuY2xhc3MgTWluaW1hdGNoIHtcbiAgICBvcHRpb25zO1xuICAgIHNldDtcbiAgICBwYXR0ZXJuO1xuICAgIHdpbmRvd3NQYXRoc05vRXNjYXBlO1xuICAgIG5vbmVnYXRlO1xuICAgIG5lZ2F0ZTtcbiAgICBjb21tZW50O1xuICAgIGVtcHR5O1xuICAgIHByZXNlcnZlTXVsdGlwbGVTbGFzaGVzO1xuICAgIHBhcnRpYWw7XG4gICAgZ2xvYlNldDtcbiAgICBnbG9iUGFydHM7XG4gICAgbm9jYXNlO1xuICAgIGlzV2luZG93cztcbiAgICBwbGF0Zm9ybTtcbiAgICB3aW5kb3dzTm9NYWdpY1Jvb3Q7XG4gICAgcmVnZXhwO1xuICAgIGNvbnN0cnVjdG9yKHBhdHRlcm4sIG9wdGlvbnMgPSB7fSkge1xuICAgICAgICAoMCwgYXNzZXJ0X3ZhbGlkX3BhdHRlcm5fanNfMS5hc3NlcnRWYWxpZFBhdHRlcm4pKHBhdHRlcm4pO1xuICAgICAgICBvcHRpb25zID0gb3B0aW9ucyB8fCB7fTtcbiAgICAgICAgdGhpcy5vcHRpb25zID0gb3B0aW9ucztcbiAgICAgICAgdGhpcy5wYXR0ZXJuID0gcGF0dGVybjtcbiAgICAgICAgdGhpcy5wbGF0Zm9ybSA9IG9wdGlvbnMucGxhdGZvcm0gfHwgZGVmYXVsdFBsYXRmb3JtO1xuICAgICAgICB0aGlzLmlzV2luZG93cyA9IHRoaXMucGxhdGZvcm0gPT09ICd3aW4zMic7XG4gICAgICAgIHRoaXMud2luZG93c1BhdGhzTm9Fc2NhcGUgPVxuICAgICAgICAgICAgISFvcHRpb25zLndpbmRvd3NQYXRoc05vRXNjYXBlIHx8IG9wdGlvbnMuYWxsb3dXaW5kb3dzRXNjYXBlID09PSBmYWxzZTtcbiAgICAgICAgaWYgKHRoaXMud2luZG93c1BhdGhzTm9Fc2NhcGUpIHtcbiAgICAgICAgICAgIHRoaXMucGF0dGVybiA9IHRoaXMucGF0dGVybi5yZXBsYWNlKC9cXFxcL2csICcvJyk7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5wcmVzZXJ2ZU11bHRpcGxlU2xhc2hlcyA9ICEhb3B0aW9ucy5wcmVzZXJ2ZU11bHRpcGxlU2xhc2hlcztcbiAgICAgICAgdGhpcy5yZWdleHAgPSBudWxsO1xuICAgICAgICB0aGlzLm5lZ2F0ZSA9IGZhbHNlO1xuICAgICAgICB0aGlzLm5vbmVnYXRlID0gISFvcHRpb25zLm5vbmVnYXRlO1xuICAgICAgICB0aGlzLmNvbW1lbnQgPSBmYWxzZTtcbiAgICAgICAgdGhpcy5lbXB0eSA9IGZhbHNlO1xuICAgICAgICB0aGlzLnBhcnRpYWwgPSAhIW9wdGlvbnMucGFydGlhbDtcbiAgICAgICAgdGhpcy5ub2Nhc2UgPSAhIXRoaXMub3B0aW9ucy5ub2Nhc2U7XG4gICAgICAgIHRoaXMud2luZG93c05vTWFnaWNSb290ID1cbiAgICAgICAgICAgIG9wdGlvbnMud2luZG93c05vTWFnaWNSb290ICE9PSB1bmRlZmluZWRcbiAgICAgICAgICAgICAgICA/IG9wdGlvbnMud2luZG93c05vTWFnaWNSb290XG4gICAgICAgICAgICAgICAgOiAhISh0aGlzLmlzV2luZG93cyAmJiB0aGlzLm5vY2FzZSk7XG4gICAgICAgIHRoaXMuZ2xvYlNldCA9IFtdO1xuICAgICAgICB0aGlzLmdsb2JQYXJ0cyA9IFtdO1xuICAgICAgICB0aGlzLnNldCA9IFtdO1xuICAgICAgICAvLyBtYWtlIHRoZSBzZXQgb2YgcmVnZXhwcyBldGMuXG4gICAgICAgIHRoaXMubWFrZSgpO1xuICAgIH1cbiAgICBoYXNNYWdpYygpIHtcbiAgICAgICAgaWYgKHRoaXMub3B0aW9ucy5tYWdpY2FsQnJhY2VzICYmIHRoaXMuc2V0Lmxlbmd0aCA+IDEpIHtcbiAgICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICB9XG4gICAgICAgIGZvciAoY29uc3QgcGF0dGVybiBvZiB0aGlzLnNldCkge1xuICAgICAgICAgICAgZm9yIChjb25zdCBwYXJ0IG9mIHBhdHRlcm4pIHtcbiAgICAgICAgICAgICAgICBpZiAodHlwZW9mIHBhcnQgIT09ICdzdHJpbmcnKVxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuICAgIGRlYnVnKC4uLl8pIHsgfVxuICAgIG1ha2UoKSB7XG4gICAgICAgIGNvbnN0IHBhdHRlcm4gPSB0aGlzLnBhdHRlcm47XG4gICAgICAgIGNvbnN0IG9wdGlvbnMgPSB0aGlzLm9wdGlvbnM7XG4gICAgICAgIC8vIGVtcHR5IHBhdHRlcm5zIGFuZCBjb21tZW50cyBtYXRjaCBub3RoaW5nLlxuICAgICAgICBpZiAoIW9wdGlvbnMubm9jb21tZW50ICYmIHBhdHRlcm4uY2hhckF0KDApID09PSAnIycpIHtcbiAgICAgICAgICAgIHRoaXMuY29tbWVudCA9IHRydWU7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgaWYgKCFwYXR0ZXJuKSB7XG4gICAgICAgICAgICB0aGlzLmVtcHR5ID0gdHJ1ZTtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICAvLyBzdGVwIDE6IGZpZ3VyZSBvdXQgbmVnYXRpb24sIGV0Yy5cbiAgICAgICAgdGhpcy5wYXJzZU5lZ2F0ZSgpO1xuICAgICAgICAvLyBzdGVwIDI6IGV4cGFuZCBicmFjZXNcbiAgICAgICAgdGhpcy5nbG9iU2V0ID0gWy4uLm5ldyBTZXQodGhpcy5icmFjZUV4cGFuZCgpKV07XG4gICAgICAgIGlmIChvcHRpb25zLmRlYnVnKSB7XG4gICAgICAgICAgICB0aGlzLmRlYnVnID0gKC4uLmFyZ3MpID0+IGNvbnNvbGUuZXJyb3IoLi4uYXJncyk7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5kZWJ1Zyh0aGlzLnBhdHRlcm4sIHRoaXMuZ2xvYlNldCk7XG4gICAgICAgIC8vIHN0ZXAgMzogbm93IHdlIGhhdmUgYSBzZXQsIHNvIHR1cm4gZWFjaCBvbmUgaW50byBhIHNlcmllcyBvZlxuICAgICAgICAvLyBwYXRoLXBvcnRpb24gbWF0Y2hpbmcgcGF0dGVybnMuXG4gICAgICAgIC8vIFRoZXNlIHdpbGwgYmUgcmVnZXhwcywgZXhjZXB0IGluIHRoZSBjYXNlIG9mIFwiKipcIiwgd2hpY2ggaXNcbiAgICAgICAgLy8gc2V0IHRvIHRoZSBHTE9CU1RBUiBvYmplY3QgZm9yIGdsb2JzdGFyIGJlaGF2aW9yLFxuICAgICAgICAvLyBhbmQgd2lsbCBub3QgY29udGFpbiBhbnkgLyBjaGFyYWN0ZXJzXG4gICAgICAgIC8vXG4gICAgICAgIC8vIEZpcnN0LCB3ZSBwcmVwcm9jZXNzIHRvIG1ha2UgdGhlIGdsb2IgcGF0dGVybiBzZXRzIGEgYml0IHNpbXBsZXJcbiAgICAgICAgLy8gYW5kIGRlZHVwZWQuICBUaGVyZSBhcmUgc29tZSBwZXJmLWtpbGxpbmcgcGF0dGVybnMgdGhhdCBjYW4gY2F1c2VcbiAgICAgICAgLy8gcHJvYmxlbXMgd2l0aCBhIGdsb2Igd2FsaywgYnV0IHdlIGNhbiBzaW1wbGlmeSB0aGVtIGRvd24gYSBiaXQuXG4gICAgICAgIGNvbnN0IHJhd0dsb2JQYXJ0cyA9IHRoaXMuZ2xvYlNldC5tYXAocyA9PiB0aGlzLnNsYXNoU3BsaXQocykpO1xuICAgICAgICB0aGlzLmdsb2JQYXJ0cyA9IHRoaXMucHJlcHJvY2VzcyhyYXdHbG9iUGFydHMpO1xuICAgICAgICB0aGlzLmRlYnVnKHRoaXMucGF0dGVybiwgdGhpcy5nbG9iUGFydHMpO1xuICAgICAgICAvLyBnbG9iIC0tPiByZWdleHBzXG4gICAgICAgIGxldCBzZXQgPSB0aGlzLmdsb2JQYXJ0cy5tYXAoKHMsIF8sIF9fKSA9PiB7XG4gICAgICAgICAgICBpZiAodGhpcy5pc1dpbmRvd3MgJiYgdGhpcy53aW5kb3dzTm9NYWdpY1Jvb3QpIHtcbiAgICAgICAgICAgICAgICAvLyBjaGVjayBpZiBpdCdzIGEgZHJpdmUgb3IgdW5jIHBhdGguXG4gICAgICAgICAgICAgICAgY29uc3QgaXNVTkMgPSBzWzBdID09PSAnJyAmJlxuICAgICAgICAgICAgICAgICAgICBzWzFdID09PSAnJyAmJlxuICAgICAgICAgICAgICAgICAgICAoc1syXSA9PT0gJz8nIHx8ICFnbG9iTWFnaWMudGVzdChzWzJdKSkgJiZcbiAgICAgICAgICAgICAgICAgICAgIWdsb2JNYWdpYy50ZXN0KHNbM10pO1xuICAgICAgICAgICAgICAgIGNvbnN0IGlzRHJpdmUgPSAvXlthLXpdOi9pLnRlc3Qoc1swXSk7XG4gICAgICAgICAgICAgICAgaWYgKGlzVU5DKSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBbLi4ucy5zbGljZSgwLCA0KSwgLi4ucy5zbGljZSg0KS5tYXAoc3MgPT4gdGhpcy5wYXJzZShzcykpXTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgZWxzZSBpZiAoaXNEcml2ZSkge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gW3NbMF0sIC4uLnMuc2xpY2UoMSkubWFwKHNzID0+IHRoaXMucGFyc2Uoc3MpKV07XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIHMubWFwKHNzID0+IHRoaXMucGFyc2Uoc3MpKTtcbiAgICAgICAgfSk7XG4gICAgICAgIHRoaXMuZGVidWcodGhpcy5wYXR0ZXJuLCBzZXQpO1xuICAgICAgICAvLyBmaWx0ZXIgb3V0IGV2ZXJ5dGhpbmcgdGhhdCBkaWRuJ3QgY29tcGlsZSBwcm9wZXJseS5cbiAgICAgICAgdGhpcy5zZXQgPSBzZXQuZmlsdGVyKHMgPT4gcy5pbmRleE9mKGZhbHNlKSA9PT0gLTEpO1xuICAgICAgICAvLyBkbyBub3QgdHJlYXQgdGhlID8gaW4gVU5DIHBhdGhzIGFzIG1hZ2ljXG4gICAgICAgIGlmICh0aGlzLmlzV2luZG93cykge1xuICAgICAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCB0aGlzLnNldC5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgICAgIGNvbnN0IHAgPSB0aGlzLnNldFtpXTtcbiAgICAgICAgICAgICAgICBpZiAocFswXSA9PT0gJycgJiZcbiAgICAgICAgICAgICAgICAgICAgcFsxXSA9PT0gJycgJiZcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5nbG9iUGFydHNbaV1bMl0gPT09ICc/JyAmJlxuICAgICAgICAgICAgICAgICAgICB0eXBlb2YgcFszXSA9PT0gJ3N0cmluZycgJiZcbiAgICAgICAgICAgICAgICAgICAgL15bYS16XTokL2kudGVzdChwWzNdKSkge1xuICAgICAgICAgICAgICAgICAgICBwWzJdID0gJz8nO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICB0aGlzLmRlYnVnKHRoaXMucGF0dGVybiwgdGhpcy5zZXQpO1xuICAgIH1cbiAgICAvLyB2YXJpb3VzIHRyYW5zZm9ybXMgdG8gZXF1aXZhbGVudCBwYXR0ZXJuIHNldHMgdGhhdCBhcmVcbiAgICAvLyBmYXN0ZXIgdG8gcHJvY2VzcyBpbiBhIGZpbGVzeXN0ZW0gd2Fsay4gIFRoZSBnb2FsIGlzIHRvXG4gICAgLy8gZWxpbWluYXRlIHdoYXQgd2UgY2FuLCBhbmQgcHVzaCBhbGwgKiogcGF0dGVybnMgYXMgZmFyXG4gICAgLy8gdG8gdGhlIHJpZ2h0IGFzIHBvc3NpYmxlLCBldmVuIGlmIGl0IGluY3JlYXNlcyB0aGUgbnVtYmVyXG4gICAgLy8gb2YgcGF0dGVybnMgdGhhdCB3ZSBoYXZlIHRvIHByb2Nlc3MuXG4gICAgcHJlcHJvY2VzcyhnbG9iUGFydHMpIHtcbiAgICAgICAgLy8gaWYgd2UncmUgbm90IGluIGdsb2JzdGFyIG1vZGUsIHRoZW4gdHVybiBhbGwgKiogaW50byAqXG4gICAgICAgIGlmICh0aGlzLm9wdGlvbnMubm9nbG9ic3Rhcikge1xuICAgICAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBnbG9iUGFydHMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgICAgICBmb3IgKGxldCBqID0gMDsgaiA8IGdsb2JQYXJ0c1tpXS5sZW5ndGg7IGorKykge1xuICAgICAgICAgICAgICAgICAgICBpZiAoZ2xvYlBhcnRzW2ldW2pdID09PSAnKionKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBnbG9iUGFydHNbaV1bal0gPSAnKic7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgeyBvcHRpbWl6YXRpb25MZXZlbCA9IDEgfSA9IHRoaXMub3B0aW9ucztcbiAgICAgICAgaWYgKG9wdGltaXphdGlvbkxldmVsID49IDIpIHtcbiAgICAgICAgICAgIC8vIGFnZ3Jlc3NpdmUgb3B0aW1pemF0aW9uIGZvciB0aGUgcHVycG9zZSBvZiBmcyB3YWxraW5nXG4gICAgICAgICAgICBnbG9iUGFydHMgPSB0aGlzLmZpcnN0UGhhc2VQcmVQcm9jZXNzKGdsb2JQYXJ0cyk7XG4gICAgICAgICAgICBnbG9iUGFydHMgPSB0aGlzLnNlY29uZFBoYXNlUHJlUHJvY2VzcyhnbG9iUGFydHMpO1xuICAgICAgICB9XG4gICAgICAgIGVsc2UgaWYgKG9wdGltaXphdGlvbkxldmVsID49IDEpIHtcbiAgICAgICAgICAgIC8vIGp1c3QgYmFzaWMgb3B0aW1pemF0aW9ucyB0byByZW1vdmUgc29tZSAuLiBwYXJ0c1xuICAgICAgICAgICAgZ2xvYlBhcnRzID0gdGhpcy5sZXZlbE9uZU9wdGltaXplKGdsb2JQYXJ0cyk7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAvLyBqdXN0IGNvbGxhcHNlIG11bHRpcGxlICoqIHBvcnRpb25zIGludG8gb25lXG4gICAgICAgICAgICBnbG9iUGFydHMgPSB0aGlzLmFkamFzY2VudEdsb2JzdGFyT3B0aW1pemUoZ2xvYlBhcnRzKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gZ2xvYlBhcnRzO1xuICAgIH1cbiAgICAvLyBqdXN0IGdldCByaWQgb2YgYWRqYXNjZW50ICoqIHBvcnRpb25zXG4gICAgYWRqYXNjZW50R2xvYnN0YXJPcHRpbWl6ZShnbG9iUGFydHMpIHtcbiAgICAgICAgcmV0dXJuIGdsb2JQYXJ0cy5tYXAocGFydHMgPT4ge1xuICAgICAgICAgICAgbGV0IGdzID0gLTE7XG4gICAgICAgICAgICB3aGlsZSAoLTEgIT09IChncyA9IHBhcnRzLmluZGV4T2YoJyoqJywgZ3MgKyAxKSkpIHtcbiAgICAgICAgICAgICAgICBsZXQgaSA9IGdzO1xuICAgICAgICAgICAgICAgIHdoaWxlIChwYXJ0c1tpICsgMV0gPT09ICcqKicpIHtcbiAgICAgICAgICAgICAgICAgICAgaSsrO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBpZiAoaSAhPT0gZ3MpIHtcbiAgICAgICAgICAgICAgICAgICAgcGFydHMuc3BsaWNlKGdzLCBpIC0gZ3MpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiBwYXJ0cztcbiAgICAgICAgfSk7XG4gICAgfVxuICAgIC8vIGdldCByaWQgb2YgYWRqYXNjZW50ICoqIGFuZCByZXNvbHZlIC4uIHBvcnRpb25zXG4gICAgbGV2ZWxPbmVPcHRpbWl6ZShnbG9iUGFydHMpIHtcbiAgICAgICAgcmV0dXJuIGdsb2JQYXJ0cy5tYXAocGFydHMgPT4ge1xuICAgICAgICAgICAgcGFydHMgPSBwYXJ0cy5yZWR1Y2UoKHNldCwgcGFydCkgPT4ge1xuICAgICAgICAgICAgICAgIGNvbnN0IHByZXYgPSBzZXRbc2V0Lmxlbmd0aCAtIDFdO1xuICAgICAgICAgICAgICAgIGlmIChwYXJ0ID09PSAnKionICYmIHByZXYgPT09ICcqKicpIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHNldDtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgaWYgKHBhcnQgPT09ICcuLicpIHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKHByZXYgJiYgcHJldiAhPT0gJy4uJyAmJiBwcmV2ICE9PSAnLicgJiYgcHJldiAhPT0gJyoqJykge1xuICAgICAgICAgICAgICAgICAgICAgICAgc2V0LnBvcCgpO1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHNldDtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBzZXQucHVzaChwYXJ0KTtcbiAgICAgICAgICAgICAgICByZXR1cm4gc2V0O1xuICAgICAgICAgICAgfSwgW10pO1xuICAgICAgICAgICAgcmV0dXJuIHBhcnRzLmxlbmd0aCA9PT0gMCA/IFsnJ10gOiBwYXJ0cztcbiAgICAgICAgfSk7XG4gICAgfVxuICAgIGxldmVsVHdvRmlsZU9wdGltaXplKHBhcnRzKSB7XG4gICAgICAgIGlmICghQXJyYXkuaXNBcnJheShwYXJ0cykpIHtcbiAgICAgICAgICAgIHBhcnRzID0gdGhpcy5zbGFzaFNwbGl0KHBhcnRzKTtcbiAgICAgICAgfVxuICAgICAgICBsZXQgZGlkU29tZXRoaW5nID0gZmFsc2U7XG4gICAgICAgIGRvIHtcbiAgICAgICAgICAgIGRpZFNvbWV0aGluZyA9IGZhbHNlO1xuICAgICAgICAgICAgLy8gPHByZT4vPGU+LzxyZXN0PiAtPiA8cHJlPi88cmVzdD5cbiAgICAgICAgICAgIGlmICghdGhpcy5wcmVzZXJ2ZU11bHRpcGxlU2xhc2hlcykge1xuICAgICAgICAgICAgICAgIGZvciAobGV0IGkgPSAxOyBpIDwgcGFydHMubGVuZ3RoIC0gMTsgaSsrKSB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IHAgPSBwYXJ0c1tpXTtcbiAgICAgICAgICAgICAgICAgICAgLy8gZG9uJ3Qgc3F1ZWV6ZSBvdXQgVU5DIHBhdHRlcm5zXG4gICAgICAgICAgICAgICAgICAgIGlmIChpID09PSAxICYmIHAgPT09ICcnICYmIHBhcnRzWzBdID09PSAnJylcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgICAgICAgICAgICBpZiAocCA9PT0gJy4nIHx8IHAgPT09ICcnKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBkaWRTb21ldGhpbmcgPSB0cnVlO1xuICAgICAgICAgICAgICAgICAgICAgICAgcGFydHMuc3BsaWNlKGksIDEpO1xuICAgICAgICAgICAgICAgICAgICAgICAgaS0tO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGlmIChwYXJ0c1swXSA9PT0gJy4nICYmXG4gICAgICAgICAgICAgICAgICAgIHBhcnRzLmxlbmd0aCA9PT0gMiAmJlxuICAgICAgICAgICAgICAgICAgICAocGFydHNbMV0gPT09ICcuJyB8fCBwYXJ0c1sxXSA9PT0gJycpKSB7XG4gICAgICAgICAgICAgICAgICAgIGRpZFNvbWV0aGluZyA9IHRydWU7XG4gICAgICAgICAgICAgICAgICAgIHBhcnRzLnBvcCgpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIC8vIDxwcmU+LzxwPi8uLi88cmVzdD4gLT4gPHByZT4vPHJlc3Q+XG4gICAgICAgICAgICBsZXQgZGQgPSAwO1xuICAgICAgICAgICAgd2hpbGUgKC0xICE9PSAoZGQgPSBwYXJ0cy5pbmRleE9mKCcuLicsIGRkICsgMSkpKSB7XG4gICAgICAgICAgICAgICAgY29uc3QgcCA9IHBhcnRzW2RkIC0gMV07XG4gICAgICAgICAgICAgICAgaWYgKHAgJiYgcCAhPT0gJy4nICYmIHAgIT09ICcuLicgJiYgcCAhPT0gJyoqJykge1xuICAgICAgICAgICAgICAgICAgICBkaWRTb21ldGhpbmcgPSB0cnVlO1xuICAgICAgICAgICAgICAgICAgICBwYXJ0cy5zcGxpY2UoZGQgLSAxLCAyKTtcbiAgICAgICAgICAgICAgICAgICAgZGQgLT0gMjtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH0gd2hpbGUgKGRpZFNvbWV0aGluZyk7XG4gICAgICAgIHJldHVybiBwYXJ0cy5sZW5ndGggPT09IDAgPyBbJyddIDogcGFydHM7XG4gICAgfVxuICAgIC8vIEZpcnN0IHBoYXNlOiBzaW5nbGUtcGF0dGVybiBwcm9jZXNzaW5nXG4gICAgLy8gPHByZT4gaXMgMSBvciBtb3JlIHBvcnRpb25zXG4gICAgLy8gPHJlc3Q+IGlzIDEgb3IgbW9yZSBwb3J0aW9uc1xuICAgIC8vIDxwPiBpcyBhbnkgcG9ydGlvbiBvdGhlciB0aGFuIC4sIC4uLCAnJywgb3IgKipcbiAgICAvLyA8ZT4gaXMgLiBvciAnJ1xuICAgIC8vXG4gICAgLy8gKiovLi4gaXMgKmJydXRhbCogZm9yIGZpbGVzeXN0ZW0gd2Fsa2luZyBwZXJmb3JtYW5jZSwgYmVjYXVzZVxuICAgIC8vIGl0IGVmZmVjdGl2ZWx5IHJlc2V0cyB0aGUgcmVjdXJzaXZlIHdhbGsgZWFjaCB0aW1lIGl0IG9jY3VycyxcbiAgICAvLyBhbmQgKiogY2Fubm90IGJlIHJlZHVjZWQgb3V0IGJ5IGEgLi4gcGF0dGVybiBwYXJ0IGxpa2UgYSByZWdleHBcbiAgICAvLyBvciBtb3N0IHN0cmluZ3MgKG90aGVyIHRoYW4gLi4sIC4sIGFuZCAnJykgY2FuIGJlLlxuICAgIC8vXG4gICAgLy8gPHByZT4vKiovLi4vPHA+LzxwPi88cmVzdD4gLT4gezxwcmU+Ly4uLzxwPi88cD4vPHJlc3Q+LDxwcmU+LyoqLzxwPi88cD4vPHJlc3Q+fVxuICAgIC8vIDxwcmU+LzxlPi88cmVzdD4gLT4gPHByZT4vPHJlc3Q+XG4gICAgLy8gPHByZT4vPHA+Ly4uLzxyZXN0PiAtPiA8cHJlPi88cmVzdD5cbiAgICAvLyAqKi8qKi88cmVzdD4gLT4gKiovPHJlc3Q+XG4gICAgLy9cbiAgICAvLyAqKi8qLzxyZXN0PiAtPiAqLyoqLzxyZXN0PiA8PT0gbm90IHZhbGlkIGJlY2F1c2UgKiogZG9lc24ndCBmb2xsb3dcbiAgICAvLyB0aGlzIFdPVUxEIGJlIGFsbG93ZWQgaWYgKiogZGlkIGZvbGxvdyBzeW1saW5rcywgb3IgKiBkaWRuJ3RcbiAgICBmaXJzdFBoYXNlUHJlUHJvY2VzcyhnbG9iUGFydHMpIHtcbiAgICAgICAgbGV0IGRpZFNvbWV0aGluZyA9IGZhbHNlO1xuICAgICAgICBkbyB7XG4gICAgICAgICAgICBkaWRTb21ldGhpbmcgPSBmYWxzZTtcbiAgICAgICAgICAgIC8vIDxwcmU+LyoqLy4uLzxwPi88cD4vPHJlc3Q+IC0+IHs8cHJlPi8uLi88cD4vPHA+LzxyZXN0Piw8cHJlPi8qKi88cD4vPHA+LzxyZXN0Pn1cbiAgICAgICAgICAgIGZvciAobGV0IHBhcnRzIG9mIGdsb2JQYXJ0cykge1xuICAgICAgICAgICAgICAgIGxldCBncyA9IC0xO1xuICAgICAgICAgICAgICAgIHdoaWxlICgtMSAhPT0gKGdzID0gcGFydHMuaW5kZXhPZignKionLCBncyArIDEpKSkge1xuICAgICAgICAgICAgICAgICAgICBsZXQgZ3NzID0gZ3M7XG4gICAgICAgICAgICAgICAgICAgIHdoaWxlIChwYXJ0c1tnc3MgKyAxXSA9PT0gJyoqJykge1xuICAgICAgICAgICAgICAgICAgICAgICAgLy8gPHByZT4vKiovKiovPHJlc3Q+IC0+IDxwcmU+LyoqLzxyZXN0PlxuICAgICAgICAgICAgICAgICAgICAgICAgZ3NzKys7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgLy8gZWcsIGlmIGdzIGlzIDIgYW5kIGdzcyBpcyA0LCB0aGF0IG1lYW5zIHdlIGhhdmUgMyAqKlxuICAgICAgICAgICAgICAgICAgICAvLyBwYXJ0cywgYW5kIGNhbiByZW1vdmUgMiBvZiB0aGVtLlxuICAgICAgICAgICAgICAgICAgICBpZiAoZ3NzID4gZ3MpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHBhcnRzLnNwbGljZShncyArIDEsIGdzcyAtIGdzKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBsZXQgbmV4dCA9IHBhcnRzW2dzICsgMV07XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IHAgPSBwYXJ0c1tncyArIDJdO1xuICAgICAgICAgICAgICAgICAgICBjb25zdCBwMiA9IHBhcnRzW2dzICsgM107XG4gICAgICAgICAgICAgICAgICAgIGlmIChuZXh0ICE9PSAnLi4nKVxuICAgICAgICAgICAgICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgICAgICAgICAgIGlmICghcCB8fFxuICAgICAgICAgICAgICAgICAgICAgICAgcCA9PT0gJy4nIHx8XG4gICAgICAgICAgICAgICAgICAgICAgICBwID09PSAnLi4nIHx8XG4gICAgICAgICAgICAgICAgICAgICAgICAhcDIgfHxcbiAgICAgICAgICAgICAgICAgICAgICAgIHAyID09PSAnLicgfHxcbiAgICAgICAgICAgICAgICAgICAgICAgIHAyID09PSAnLi4nKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBkaWRTb21ldGhpbmcgPSB0cnVlO1xuICAgICAgICAgICAgICAgICAgICAvLyBlZGl0IHBhcnRzIGluIHBsYWNlLCBhbmQgcHVzaCB0aGUgbmV3IG9uZVxuICAgICAgICAgICAgICAgICAgICBwYXJ0cy5zcGxpY2UoZ3MsIDEpO1xuICAgICAgICAgICAgICAgICAgICBjb25zdCBvdGhlciA9IHBhcnRzLnNsaWNlKDApO1xuICAgICAgICAgICAgICAgICAgICBvdGhlcltnc10gPSAnKionO1xuICAgICAgICAgICAgICAgICAgICBnbG9iUGFydHMucHVzaChvdGhlcik7XG4gICAgICAgICAgICAgICAgICAgIGdzLS07XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIC8vIDxwcmU+LzxlPi88cmVzdD4gLT4gPHByZT4vPHJlc3Q+XG4gICAgICAgICAgICAgICAgaWYgKCF0aGlzLnByZXNlcnZlTXVsdGlwbGVTbGFzaGVzKSB7XG4gICAgICAgICAgICAgICAgICAgIGZvciAobGV0IGkgPSAxOyBpIDwgcGFydHMubGVuZ3RoIC0gMTsgaSsrKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBwID0gcGFydHNbaV07XG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBkb24ndCBzcXVlZXplIG91dCBVTkMgcGF0dGVybnNcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChpID09PSAxICYmIHAgPT09ICcnICYmIHBhcnRzWzBdID09PSAnJylcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChwID09PSAnLicgfHwgcCA9PT0gJycpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBkaWRTb21ldGhpbmcgPSB0cnVlO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhcnRzLnNwbGljZShpLCAxKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpLS07XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgaWYgKHBhcnRzWzBdID09PSAnLicgJiZcbiAgICAgICAgICAgICAgICAgICAgICAgIHBhcnRzLmxlbmd0aCA9PT0gMiAmJlxuICAgICAgICAgICAgICAgICAgICAgICAgKHBhcnRzWzFdID09PSAnLicgfHwgcGFydHNbMV0gPT09ICcnKSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgZGlkU29tZXRoaW5nID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHBhcnRzLnBvcCgpO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIC8vIDxwcmU+LzxwPi8uLi88cmVzdD4gLT4gPHByZT4vPHJlc3Q+XG4gICAgICAgICAgICAgICAgbGV0IGRkID0gMDtcbiAgICAgICAgICAgICAgICB3aGlsZSAoLTEgIT09IChkZCA9IHBhcnRzLmluZGV4T2YoJy4uJywgZGQgKyAxKSkpIHtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgcCA9IHBhcnRzW2RkIC0gMV07XG4gICAgICAgICAgICAgICAgICAgIGlmIChwICYmIHAgIT09ICcuJyAmJiBwICE9PSAnLi4nICYmIHAgIT09ICcqKicpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGRpZFNvbWV0aGluZyA9IHRydWU7XG4gICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBuZWVkRG90ID0gZGQgPT09IDEgJiYgcGFydHNbZGQgKyAxXSA9PT0gJyoqJztcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHNwbGluID0gbmVlZERvdCA/IFsnLiddIDogW107XG4gICAgICAgICAgICAgICAgICAgICAgICBwYXJ0cy5zcGxpY2UoZGQgLSAxLCAyLCAuLi5zcGxpbik7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAocGFydHMubGVuZ3RoID09PSAwKVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhcnRzLnB1c2goJycpO1xuICAgICAgICAgICAgICAgICAgICAgICAgZGQgLT0gMjtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfSB3aGlsZSAoZGlkU29tZXRoaW5nKTtcbiAgICAgICAgcmV0dXJuIGdsb2JQYXJ0cztcbiAgICB9XG4gICAgLy8gc2Vjb25kIHBoYXNlOiBtdWx0aS1wYXR0ZXJuIGRlZHVwZXNcbiAgICAvLyB7PHByZT4vKi88cmVzdD4sPHByZT4vPHA+LzxyZXN0Pn0gLT4gPHByZT4vKi88cmVzdD5cbiAgICAvLyB7PHByZT4vPHJlc3Q+LDxwcmU+LzxyZXN0Pn0gLT4gPHByZT4vPHJlc3Q+XG4gICAgLy8gezxwcmU+LyoqLzxyZXN0Piw8cHJlPi88cmVzdD59IC0+IDxwcmU+LyoqLzxyZXN0PlxuICAgIC8vXG4gICAgLy8gezxwcmU+LyoqLzxyZXN0Piw8cHJlPi8qKi88cD4vPHJlc3Q+fSAtPiA8cHJlPi8qKi88cmVzdD5cbiAgICAvLyBeLS0gbm90IHZhbGlkIGJlY2F1c2UgKiogZG9lbnMndCBmb2xsb3cgc3ltbGlua3NcbiAgICBzZWNvbmRQaGFzZVByZVByb2Nlc3MoZ2xvYlBhcnRzKSB7XG4gICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgZ2xvYlBhcnRzLmxlbmd0aCAtIDE7IGkrKykge1xuICAgICAgICAgICAgZm9yIChsZXQgaiA9IGkgKyAxOyBqIDwgZ2xvYlBhcnRzLmxlbmd0aDsgaisrKSB7XG4gICAgICAgICAgICAgICAgY29uc3QgbWF0Y2hlZCA9IHRoaXMucGFydHNNYXRjaChnbG9iUGFydHNbaV0sIGdsb2JQYXJ0c1tqXSwgIXRoaXMucHJlc2VydmVNdWx0aXBsZVNsYXNoZXMpO1xuICAgICAgICAgICAgICAgIGlmIChtYXRjaGVkKSB7XG4gICAgICAgICAgICAgICAgICAgIGdsb2JQYXJ0c1tpXSA9IFtdO1xuICAgICAgICAgICAgICAgICAgICBnbG9iUGFydHNbal0gPSBtYXRjaGVkO1xuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGdsb2JQYXJ0cy5maWx0ZXIoZ3MgPT4gZ3MubGVuZ3RoKTtcbiAgICB9XG4gICAgcGFydHNNYXRjaChhLCBiLCBlbXB0eUdTTWF0Y2ggPSBmYWxzZSkge1xuICAgICAgICBsZXQgYWkgPSAwO1xuICAgICAgICBsZXQgYmkgPSAwO1xuICAgICAgICBsZXQgcmVzdWx0ID0gW107XG4gICAgICAgIGxldCB3aGljaCA9ICcnO1xuICAgICAgICB3aGlsZSAoYWkgPCBhLmxlbmd0aCAmJiBiaSA8IGIubGVuZ3RoKSB7XG4gICAgICAgICAgICBpZiAoYVthaV0gPT09IGJbYmldKSB7XG4gICAgICAgICAgICAgICAgcmVzdWx0LnB1c2god2hpY2ggPT09ICdiJyA/IGJbYmldIDogYVthaV0pO1xuICAgICAgICAgICAgICAgIGFpKys7XG4gICAgICAgICAgICAgICAgYmkrKztcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2UgaWYgKGVtcHR5R1NNYXRjaCAmJiBhW2FpXSA9PT0gJyoqJyAmJiBiW2JpXSA9PT0gYVthaSArIDFdKSB7XG4gICAgICAgICAgICAgICAgcmVzdWx0LnB1c2goYVthaV0pO1xuICAgICAgICAgICAgICAgIGFpKys7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIGlmIChlbXB0eUdTTWF0Y2ggJiYgYltiaV0gPT09ICcqKicgJiYgYVthaV0gPT09IGJbYmkgKyAxXSkge1xuICAgICAgICAgICAgICAgIHJlc3VsdC5wdXNoKGJbYmldKTtcbiAgICAgICAgICAgICAgICBiaSsrO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSBpZiAoYVthaV0gPT09ICcqJyAmJlxuICAgICAgICAgICAgICAgIGJbYmldICYmXG4gICAgICAgICAgICAgICAgKHRoaXMub3B0aW9ucy5kb3QgfHwgIWJbYmldLnN0YXJ0c1dpdGgoJy4nKSkgJiZcbiAgICAgICAgICAgICAgICBiW2JpXSAhPT0gJyoqJykge1xuICAgICAgICAgICAgICAgIGlmICh3aGljaCA9PT0gJ2InKVxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgICAgICAgICAgd2hpY2ggPSAnYSc7XG4gICAgICAgICAgICAgICAgcmVzdWx0LnB1c2goYVthaV0pO1xuICAgICAgICAgICAgICAgIGFpKys7XG4gICAgICAgICAgICAgICAgYmkrKztcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2UgaWYgKGJbYmldID09PSAnKicgJiZcbiAgICAgICAgICAgICAgICBhW2FpXSAmJlxuICAgICAgICAgICAgICAgICh0aGlzLm9wdGlvbnMuZG90IHx8ICFhW2FpXS5zdGFydHNXaXRoKCcuJykpICYmXG4gICAgICAgICAgICAgICAgYVthaV0gIT09ICcqKicpIHtcbiAgICAgICAgICAgICAgICBpZiAod2hpY2ggPT09ICdhJylcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICAgICAgICAgIHdoaWNoID0gJ2InO1xuICAgICAgICAgICAgICAgIHJlc3VsdC5wdXNoKGJbYmldKTtcbiAgICAgICAgICAgICAgICBhaSsrO1xuICAgICAgICAgICAgICAgIGJpKys7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgLy8gaWYgd2UgZmFsbCBvdXQgb2YgdGhlIGxvb3AsIGl0IG1lYW5zIHRoZXkgdHdvIGFyZSBpZGVudGljYWxcbiAgICAgICAgLy8gYXMgbG9uZyBhcyB0aGVpciBsZW5ndGhzIG1hdGNoXG4gICAgICAgIHJldHVybiBhLmxlbmd0aCA9PT0gYi5sZW5ndGggJiYgcmVzdWx0O1xuICAgIH1cbiAgICBwYXJzZU5lZ2F0ZSgpIHtcbiAgICAgICAgaWYgKHRoaXMubm9uZWdhdGUpXG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIGNvbnN0IHBhdHRlcm4gPSB0aGlzLnBhdHRlcm47XG4gICAgICAgIGxldCBuZWdhdGUgPSBmYWxzZTtcbiAgICAgICAgbGV0IG5lZ2F0ZU9mZnNldCA9IDA7XG4gICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgcGF0dGVybi5sZW5ndGggJiYgcGF0dGVybi5jaGFyQXQoaSkgPT09ICchJzsgaSsrKSB7XG4gICAgICAgICAgICBuZWdhdGUgPSAhbmVnYXRlO1xuICAgICAgICAgICAgbmVnYXRlT2Zmc2V0Kys7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKG5lZ2F0ZU9mZnNldClcbiAgICAgICAgICAgIHRoaXMucGF0dGVybiA9IHBhdHRlcm4uc2xpY2UobmVnYXRlT2Zmc2V0KTtcbiAgICAgICAgdGhpcy5uZWdhdGUgPSBuZWdhdGU7XG4gICAgfVxuICAgIC8vIHNldCBwYXJ0aWFsIHRvIHRydWUgdG8gdGVzdCBpZiwgZm9yIGV4YW1wbGUsXG4gICAgLy8gXCIvYS9iXCIgbWF0Y2hlcyB0aGUgc3RhcnQgb2YgXCIvKi9iLyovZFwiXG4gICAgLy8gUGFydGlhbCBtZWFucywgaWYgeW91IHJ1biBvdXQgb2YgZmlsZSBiZWZvcmUgeW91IHJ1blxuICAgIC8vIG91dCBvZiBwYXR0ZXJuLCB0aGVuIHRoYXQncyBmaW5lLCBhcyBsb25nIGFzIGFsbFxuICAgIC8vIHRoZSBwYXJ0cyBtYXRjaC5cbiAgICBtYXRjaE9uZShmaWxlLCBwYXR0ZXJuLCBwYXJ0aWFsID0gZmFsc2UpIHtcbiAgICAgICAgY29uc3Qgb3B0aW9ucyA9IHRoaXMub3B0aW9ucztcbiAgICAgICAgLy8gVU5DIHBhdGhzIGxpa2UgLy8/L1g6Ly4uLiBjYW4gbWF0Y2ggWDovLi4uIGFuZCB2aWNlIHZlcnNhXG4gICAgICAgIC8vIERyaXZlIGxldHRlcnMgaW4gYWJzb2x1dGUgZHJpdmUgb3IgdW5jIHBhdGhzIGFyZSBhbHdheXMgY29tcGFyZWRcbiAgICAgICAgLy8gY2FzZS1pbnNlbnNpdGl2ZWx5LlxuICAgICAgICBpZiAodGhpcy5pc1dpbmRvd3MpIHtcbiAgICAgICAgICAgIGNvbnN0IGZpbGVEcml2ZSA9IHR5cGVvZiBmaWxlWzBdID09PSAnc3RyaW5nJyAmJiAvXlthLXpdOiQvaS50ZXN0KGZpbGVbMF0pO1xuICAgICAgICAgICAgY29uc3QgZmlsZVVOQyA9ICFmaWxlRHJpdmUgJiZcbiAgICAgICAgICAgICAgICBmaWxlWzBdID09PSAnJyAmJlxuICAgICAgICAgICAgICAgIGZpbGVbMV0gPT09ICcnICYmXG4gICAgICAgICAgICAgICAgZmlsZVsyXSA9PT0gJz8nICYmXG4gICAgICAgICAgICAgICAgL15bYS16XTokL2kudGVzdChmaWxlWzNdKTtcbiAgICAgICAgICAgIGNvbnN0IHBhdHRlcm5Ecml2ZSA9IHR5cGVvZiBwYXR0ZXJuWzBdID09PSAnc3RyaW5nJyAmJiAvXlthLXpdOiQvaS50ZXN0KHBhdHRlcm5bMF0pO1xuICAgICAgICAgICAgY29uc3QgcGF0dGVyblVOQyA9ICFwYXR0ZXJuRHJpdmUgJiZcbiAgICAgICAgICAgICAgICBwYXR0ZXJuWzBdID09PSAnJyAmJlxuICAgICAgICAgICAgICAgIHBhdHRlcm5bMV0gPT09ICcnICYmXG4gICAgICAgICAgICAgICAgcGF0dGVyblsyXSA9PT0gJz8nICYmXG4gICAgICAgICAgICAgICAgdHlwZW9mIHBhdHRlcm5bM10gPT09ICdzdHJpbmcnICYmXG4gICAgICAgICAgICAgICAgL15bYS16XTokL2kudGVzdChwYXR0ZXJuWzNdKTtcbiAgICAgICAgICAgIGNvbnN0IGZkaSA9IGZpbGVVTkMgPyAzIDogZmlsZURyaXZlID8gMCA6IHVuZGVmaW5lZDtcbiAgICAgICAgICAgIGNvbnN0IHBkaSA9IHBhdHRlcm5VTkMgPyAzIDogcGF0dGVybkRyaXZlID8gMCA6IHVuZGVmaW5lZDtcbiAgICAgICAgICAgIGlmICh0eXBlb2YgZmRpID09PSAnbnVtYmVyJyAmJiB0eXBlb2YgcGRpID09PSAnbnVtYmVyJykge1xuICAgICAgICAgICAgICAgIGNvbnN0IFtmZCwgcGRdID0gW2ZpbGVbZmRpXSwgcGF0dGVybltwZGldXTtcbiAgICAgICAgICAgICAgICBpZiAoZmQudG9Mb3dlckNhc2UoKSA9PT0gcGQudG9Mb3dlckNhc2UoKSkge1xuICAgICAgICAgICAgICAgICAgICBwYXR0ZXJuW3BkaV0gPSBmZDtcbiAgICAgICAgICAgICAgICAgICAgaWYgKHBkaSA+IGZkaSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgcGF0dGVybiA9IHBhdHRlcm4uc2xpY2UocGRpKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBlbHNlIGlmIChmZGkgPiBwZGkpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGZpbGUgPSBmaWxlLnNsaWNlKGZkaSk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgLy8gcmVzb2x2ZSBhbmQgcmVkdWNlIC4gYW5kIC4uIHBvcnRpb25zIGluIHRoZSBmaWxlIGFzIHdlbGwuXG4gICAgICAgIC8vIGRvbnQnIG5lZWQgdG8gZG8gdGhlIHNlY29uZCBwaGFzZSwgYmVjYXVzZSBpdCdzIG9ubHkgb25lIHN0cmluZ1tdXG4gICAgICAgIGNvbnN0IHsgb3B0aW1pemF0aW9uTGV2ZWwgPSAxIH0gPSB0aGlzLm9wdGlvbnM7XG4gICAgICAgIGlmIChvcHRpbWl6YXRpb25MZXZlbCA+PSAyKSB7XG4gICAgICAgICAgICBmaWxlID0gdGhpcy5sZXZlbFR3b0ZpbGVPcHRpbWl6ZShmaWxlKTtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLmRlYnVnKCdtYXRjaE9uZScsIHRoaXMsIHsgZmlsZSwgcGF0dGVybiB9KTtcbiAgICAgICAgdGhpcy5kZWJ1ZygnbWF0Y2hPbmUnLCBmaWxlLmxlbmd0aCwgcGF0dGVybi5sZW5ndGgpO1xuICAgICAgICBmb3IgKHZhciBmaSA9IDAsIHBpID0gMCwgZmwgPSBmaWxlLmxlbmd0aCwgcGwgPSBwYXR0ZXJuLmxlbmd0aDsgZmkgPCBmbCAmJiBwaSA8IHBsOyBmaSsrLCBwaSsrKSB7XG4gICAgICAgICAgICB0aGlzLmRlYnVnKCdtYXRjaE9uZSBsb29wJyk7XG4gICAgICAgICAgICB2YXIgcCA9IHBhdHRlcm5bcGldO1xuICAgICAgICAgICAgdmFyIGYgPSBmaWxlW2ZpXTtcbiAgICAgICAgICAgIHRoaXMuZGVidWcocGF0dGVybiwgcCwgZik7XG4gICAgICAgICAgICAvLyBzaG91bGQgYmUgaW1wb3NzaWJsZS5cbiAgICAgICAgICAgIC8vIHNvbWUgaW52YWxpZCByZWdleHAgc3R1ZmYgaW4gdGhlIHNldC5cbiAgICAgICAgICAgIC8qIGM4IGlnbm9yZSBzdGFydCAqL1xuICAgICAgICAgICAgaWYgKHAgPT09IGZhbHNlKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgLyogYzggaWdub3JlIHN0b3AgKi9cbiAgICAgICAgICAgIGlmIChwID09PSBleHBvcnRzLkdMT0JTVEFSKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5kZWJ1ZygnR0xPQlNUQVInLCBbcGF0dGVybiwgcCwgZl0pO1xuICAgICAgICAgICAgICAgIC8vIFwiKipcIlxuICAgICAgICAgICAgICAgIC8vIGEvKiovYi8qKi9jIHdvdWxkIG1hdGNoIHRoZSBmb2xsb3dpbmc6XG4gICAgICAgICAgICAgICAgLy8gYS9iL3gveS96L2NcbiAgICAgICAgICAgICAgICAvLyBhL3gveS96L2IvY1xuICAgICAgICAgICAgICAgIC8vIGEvYi94L2IveC9jXG4gICAgICAgICAgICAgICAgLy8gYS9iL2NcbiAgICAgICAgICAgICAgICAvLyBUbyBkbyB0aGlzLCB0YWtlIHRoZSByZXN0IG9mIHRoZSBwYXR0ZXJuIGFmdGVyXG4gICAgICAgICAgICAgICAgLy8gdGhlICoqLCBhbmQgc2VlIGlmIGl0IHdvdWxkIG1hdGNoIHRoZSBmaWxlIHJlbWFpbmRlci5cbiAgICAgICAgICAgICAgICAvLyBJZiBzbywgcmV0dXJuIHN1Y2Nlc3MuXG4gICAgICAgICAgICAgICAgLy8gSWYgbm90LCB0aGUgKiogXCJzd2FsbG93c1wiIGEgc2VnbWVudCwgYW5kIHRyeSBhZ2Fpbi5cbiAgICAgICAgICAgICAgICAvLyBUaGlzIGlzIHJlY3Vyc2l2ZWx5IGF3ZnVsLlxuICAgICAgICAgICAgICAgIC8vXG4gICAgICAgICAgICAgICAgLy8gYS8qKi9iLyoqL2MgbWF0Y2hpbmcgYS9iL3gveS96L2NcbiAgICAgICAgICAgICAgICAvLyAtIGEgbWF0Y2hlcyBhXG4gICAgICAgICAgICAgICAgLy8gLSBkb3VibGVzdGFyXG4gICAgICAgICAgICAgICAgLy8gICAtIG1hdGNoT25lKGIveC95L3ovYywgYi8qKi9jKVxuICAgICAgICAgICAgICAgIC8vICAgICAtIGIgbWF0Y2hlcyBiXG4gICAgICAgICAgICAgICAgLy8gICAgIC0gZG91Ymxlc3RhclxuICAgICAgICAgICAgICAgIC8vICAgICAgIC0gbWF0Y2hPbmUoeC95L3ovYywgYykgLT4gbm9cbiAgICAgICAgICAgICAgICAvLyAgICAgICAtIG1hdGNoT25lKHkvei9jLCBjKSAtPiBub1xuICAgICAgICAgICAgICAgIC8vICAgICAgIC0gbWF0Y2hPbmUoei9jLCBjKSAtPiBub1xuICAgICAgICAgICAgICAgIC8vICAgICAgIC0gbWF0Y2hPbmUoYywgYykgeWVzLCBoaXRcbiAgICAgICAgICAgICAgICB2YXIgZnIgPSBmaTtcbiAgICAgICAgICAgICAgICB2YXIgcHIgPSBwaSArIDE7XG4gICAgICAgICAgICAgICAgaWYgKHByID09PSBwbCkge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLmRlYnVnKCcqKiBhdCB0aGUgZW5kJyk7XG4gICAgICAgICAgICAgICAgICAgIC8vIGEgKiogYXQgdGhlIGVuZCB3aWxsIGp1c3Qgc3dhbGxvdyB0aGUgcmVzdC5cbiAgICAgICAgICAgICAgICAgICAgLy8gV2UgaGF2ZSBmb3VuZCBhIG1hdGNoLlxuICAgICAgICAgICAgICAgICAgICAvLyBob3dldmVyLCBpdCB3aWxsIG5vdCBzd2FsbG93IC8ueCwgdW5sZXNzXG4gICAgICAgICAgICAgICAgICAgIC8vIG9wdGlvbnMuZG90IGlzIHNldC5cbiAgICAgICAgICAgICAgICAgICAgLy8gLiBhbmQgLi4gYXJlICpuZXZlciogbWF0Y2hlZCBieSAqKiwgZm9yIGV4cGxvc2l2ZWx5XG4gICAgICAgICAgICAgICAgICAgIC8vIGV4cG9uZW50aWFsIHJlYXNvbnMuXG4gICAgICAgICAgICAgICAgICAgIGZvciAoOyBmaSA8IGZsOyBmaSsrKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoZmlsZVtmaV0gPT09ICcuJyB8fFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbGVbZmldID09PSAnLi4nIHx8XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgKCFvcHRpb25zLmRvdCAmJiBmaWxlW2ZpXS5jaGFyQXQoMCkgPT09ICcuJykpXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAvLyBvaywgbGV0J3Mgc2VlIGlmIHdlIGNhbiBzd2FsbG93IHdoYXRldmVyIHdlIGNhbi5cbiAgICAgICAgICAgICAgICB3aGlsZSAoZnIgPCBmbCkge1xuICAgICAgICAgICAgICAgICAgICB2YXIgc3dhbGxvd2VlID0gZmlsZVtmcl07XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuZGVidWcoJ1xcbmdsb2JzdGFyIHdoaWxlJywgZmlsZSwgZnIsIHBhdHRlcm4sIHByLCBzd2FsbG93ZWUpO1xuICAgICAgICAgICAgICAgICAgICAvLyBYWFggcmVtb3ZlIHRoaXMgc2xpY2UuICBKdXN0IHBhc3MgdGhlIHN0YXJ0IGluZGV4LlxuICAgICAgICAgICAgICAgICAgICBpZiAodGhpcy5tYXRjaE9uZShmaWxlLnNsaWNlKGZyKSwgcGF0dGVybi5zbGljZShwciksIHBhcnRpYWwpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmRlYnVnKCdnbG9ic3RhciBmb3VuZCBtYXRjaCEnLCBmciwgZmwsIHN3YWxsb3dlZSk7XG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBmb3VuZCBhIG1hdGNoLlxuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBjYW4ndCBzd2FsbG93IFwiLlwiIG9yIFwiLi5cIiBldmVyLlxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gY2FuIG9ubHkgc3dhbGxvdyBcIi5mb29cIiB3aGVuIGV4cGxpY2l0bHkgYXNrZWQuXG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoc3dhbGxvd2VlID09PSAnLicgfHxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzd2FsbG93ZWUgPT09ICcuLicgfHxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAoIW9wdGlvbnMuZG90ICYmIHN3YWxsb3dlZS5jaGFyQXQoMCkgPT09ICcuJykpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmRlYnVnKCdkb3QgZGV0ZWN0ZWQhJywgZmlsZSwgZnIsIHBhdHRlcm4sIHByKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIC8vICoqIHN3YWxsb3dzIGEgc2VnbWVudCwgYW5kIGNvbnRpbnVlLlxuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5kZWJ1ZygnZ2xvYnN0YXIgc3dhbGxvdyBhIHNlZ21lbnQsIGFuZCBjb250aW51ZScpO1xuICAgICAgICAgICAgICAgICAgICAgICAgZnIrKztcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAvLyBubyBtYXRjaCB3YXMgZm91bmQuXG4gICAgICAgICAgICAgICAgLy8gSG93ZXZlciwgaW4gcGFydGlhbCBtb2RlLCB3ZSBjYW4ndCBzYXkgdGhpcyBpcyBuZWNlc3NhcmlseSBvdmVyLlxuICAgICAgICAgICAgICAgIC8qIGM4IGlnbm9yZSBzdGFydCAqL1xuICAgICAgICAgICAgICAgIGlmIChwYXJ0aWFsKSB7XG4gICAgICAgICAgICAgICAgICAgIC8vIHJhbiBvdXQgb2YgZmlsZVxuICAgICAgICAgICAgICAgICAgICB0aGlzLmRlYnVnKCdcXG4+Pj4gbm8gbWF0Y2gsIHBhcnRpYWw/JywgZmlsZSwgZnIsIHBhdHRlcm4sIHByKTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKGZyID09PSBmbCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgLyogYzggaWdub3JlIHN0b3AgKi9cbiAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICAvLyBzb21ldGhpbmcgb3RoZXIgdGhhbiAqKlxuICAgICAgICAgICAgLy8gbm9uLW1hZ2ljIHBhdHRlcm5zIGp1c3QgaGF2ZSB0byBtYXRjaCBleGFjdGx5XG4gICAgICAgICAgICAvLyBwYXR0ZXJucyB3aXRoIG1hZ2ljIGhhdmUgYmVlbiB0dXJuZWQgaW50byByZWdleHBzLlxuICAgICAgICAgICAgbGV0IGhpdDtcbiAgICAgICAgICAgIGlmICh0eXBlb2YgcCA9PT0gJ3N0cmluZycpIHtcbiAgICAgICAgICAgICAgICBoaXQgPSBmID09PSBwO1xuICAgICAgICAgICAgICAgIHRoaXMuZGVidWcoJ3N0cmluZyBtYXRjaCcsIHAsIGYsIGhpdCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICBoaXQgPSBwLnRlc3QoZik7XG4gICAgICAgICAgICAgICAgdGhpcy5kZWJ1ZygncGF0dGVybiBtYXRjaCcsIHAsIGYsIGhpdCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAoIWhpdClcbiAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgIH1cbiAgICAgICAgLy8gTm90ZTogZW5kaW5nIGluIC8gbWVhbnMgdGhhdCB3ZSdsbCBnZXQgYSBmaW5hbCBcIlwiXG4gICAgICAgIC8vIGF0IHRoZSBlbmQgb2YgdGhlIHBhdHRlcm4uICBUaGlzIGNhbiBvbmx5IG1hdGNoIGFcbiAgICAgICAgLy8gY29ycmVzcG9uZGluZyBcIlwiIGF0IHRoZSBlbmQgb2YgdGhlIGZpbGUuXG4gICAgICAgIC8vIElmIHRoZSBmaWxlIGVuZHMgaW4gLywgdGhlbiBpdCBjYW4gb25seSBtYXRjaCBhXG4gICAgICAgIC8vIGEgcGF0dGVybiB0aGF0IGVuZHMgaW4gLywgdW5sZXNzIHRoZSBwYXR0ZXJuIGp1c3RcbiAgICAgICAgLy8gZG9lc24ndCBoYXZlIGFueSBtb3JlIGZvciBpdC4gQnV0LCBhL2IvIHNob3VsZCAqbm90KlxuICAgICAgICAvLyBtYXRjaCBcImEvYi8qXCIsIGV2ZW4gdGhvdWdoIFwiXCIgbWF0Y2hlcyBhZ2FpbnN0IHRoZVxuICAgICAgICAvLyBbXi9dKj8gcGF0dGVybiwgZXhjZXB0IGluIHBhcnRpYWwgbW9kZSwgd2hlcmUgaXQgbWlnaHRcbiAgICAgICAgLy8gc2ltcGx5IG5vdCBiZSByZWFjaGVkIHlldC5cbiAgICAgICAgLy8gSG93ZXZlciwgYS9iLyBzaG91bGQgc3RpbGwgc2F0aXNmeSBhLypcbiAgICAgICAgLy8gbm93IGVpdGhlciB3ZSBmZWxsIG9mZiB0aGUgZW5kIG9mIHRoZSBwYXR0ZXJuLCBvciB3ZSdyZSBkb25lLlxuICAgICAgICBpZiAoZmkgPT09IGZsICYmIHBpID09PSBwbCkge1xuICAgICAgICAgICAgLy8gcmFuIG91dCBvZiBwYXR0ZXJuIGFuZCBmaWxlbmFtZSBhdCB0aGUgc2FtZSB0aW1lLlxuICAgICAgICAgICAgLy8gYW4gZXhhY3QgaGl0IVxuICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSBpZiAoZmkgPT09IGZsKSB7XG4gICAgICAgICAgICAvLyByYW4gb3V0IG9mIGZpbGUsIGJ1dCBzdGlsbCBoYWQgcGF0dGVybiBsZWZ0LlxuICAgICAgICAgICAgLy8gdGhpcyBpcyBvayBpZiB3ZSdyZSBkb2luZyB0aGUgbWF0Y2ggYXMgcGFydCBvZlxuICAgICAgICAgICAgLy8gYSBnbG9iIGZzIHRyYXZlcnNhbC5cbiAgICAgICAgICAgIHJldHVybiBwYXJ0aWFsO1xuICAgICAgICB9XG4gICAgICAgIGVsc2UgaWYgKHBpID09PSBwbCkge1xuICAgICAgICAgICAgLy8gcmFuIG91dCBvZiBwYXR0ZXJuLCBzdGlsbCBoYXZlIGZpbGUgbGVmdC5cbiAgICAgICAgICAgIC8vIHRoaXMgaXMgb25seSBhY2NlcHRhYmxlIGlmIHdlJ3JlIG9uIHRoZSB2ZXJ5IGxhc3RcbiAgICAgICAgICAgIC8vIGVtcHR5IHNlZ21lbnQgb2YgYSBmaWxlIHdpdGggYSB0cmFpbGluZyBzbGFzaC5cbiAgICAgICAgICAgIC8vIGEvKiBzaG91bGQgbWF0Y2ggYS9iL1xuICAgICAgICAgICAgcmV0dXJuIGZpID09PSBmbCAtIDEgJiYgZmlsZVtmaV0gPT09ICcnO1xuICAgICAgICAgICAgLyogYzggaWdub3JlIHN0YXJ0ICovXG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAvLyBzaG91bGQgYmUgdW5yZWFjaGFibGUuXG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ3d0Zj8nKTtcbiAgICAgICAgfVxuICAgICAgICAvKiBjOCBpZ25vcmUgc3RvcCAqL1xuICAgIH1cbiAgICBicmFjZUV4cGFuZCgpIHtcbiAgICAgICAgcmV0dXJuICgwLCBleHBvcnRzLmJyYWNlRXhwYW5kKSh0aGlzLnBhdHRlcm4sIHRoaXMub3B0aW9ucyk7XG4gICAgfVxuICAgIHBhcnNlKHBhdHRlcm4pIHtcbiAgICAgICAgKDAsIGFzc2VydF92YWxpZF9wYXR0ZXJuX2pzXzEuYXNzZXJ0VmFsaWRQYXR0ZXJuKShwYXR0ZXJuKTtcbiAgICAgICAgY29uc3Qgb3B0aW9ucyA9IHRoaXMub3B0aW9ucztcbiAgICAgICAgLy8gc2hvcnRjdXRzXG4gICAgICAgIGlmIChwYXR0ZXJuID09PSAnKionKVxuICAgICAgICAgICAgcmV0dXJuIGV4cG9ydHMuR0xPQlNUQVI7XG4gICAgICAgIGlmIChwYXR0ZXJuID09PSAnJylcbiAgICAgICAgICAgIHJldHVybiAnJztcbiAgICAgICAgLy8gZmFyIGFuZCBhd2F5LCB0aGUgbW9zdCBjb21tb24gZ2xvYiBwYXR0ZXJuIHBhcnRzIGFyZVxuICAgICAgICAvLyAqLCAqLiosIGFuZCAqLjxleHQ+ICBBZGQgYSBmYXN0IGNoZWNrIG1ldGhvZCBmb3IgdGhvc2UuXG4gICAgICAgIGxldCBtO1xuICAgICAgICBsZXQgZmFzdFRlc3QgPSBudWxsO1xuICAgICAgICBpZiAoKG0gPSBwYXR0ZXJuLm1hdGNoKHN0YXJSRSkpKSB7XG4gICAgICAgICAgICBmYXN0VGVzdCA9IG9wdGlvbnMuZG90ID8gc3RhclRlc3REb3QgOiBzdGFyVGVzdDtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIGlmICgobSA9IHBhdHRlcm4ubWF0Y2goc3RhckRvdEV4dFJFKSkpIHtcbiAgICAgICAgICAgIGZhc3RUZXN0ID0gKG9wdGlvbnMubm9jYXNlXG4gICAgICAgICAgICAgICAgPyBvcHRpb25zLmRvdFxuICAgICAgICAgICAgICAgICAgICA/IHN0YXJEb3RFeHRUZXN0Tm9jYXNlRG90XG4gICAgICAgICAgICAgICAgICAgIDogc3RhckRvdEV4dFRlc3ROb2Nhc2VcbiAgICAgICAgICAgICAgICA6IG9wdGlvbnMuZG90XG4gICAgICAgICAgICAgICAgICAgID8gc3RhckRvdEV4dFRlc3REb3RcbiAgICAgICAgICAgICAgICAgICAgOiBzdGFyRG90RXh0VGVzdCkobVsxXSk7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSBpZiAoKG0gPSBwYXR0ZXJuLm1hdGNoKHFtYXJrc1JFKSkpIHtcbiAgICAgICAgICAgIGZhc3RUZXN0ID0gKG9wdGlvbnMubm9jYXNlXG4gICAgICAgICAgICAgICAgPyBvcHRpb25zLmRvdFxuICAgICAgICAgICAgICAgICAgICA/IHFtYXJrc1Rlc3ROb2Nhc2VEb3RcbiAgICAgICAgICAgICAgICAgICAgOiBxbWFya3NUZXN0Tm9jYXNlXG4gICAgICAgICAgICAgICAgOiBvcHRpb25zLmRvdFxuICAgICAgICAgICAgICAgICAgICA/IHFtYXJrc1Rlc3REb3RcbiAgICAgICAgICAgICAgICAgICAgOiBxbWFya3NUZXN0KShtKTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIGlmICgobSA9IHBhdHRlcm4ubWF0Y2goc3RhckRvdFN0YXJSRSkpKSB7XG4gICAgICAgICAgICBmYXN0VGVzdCA9IG9wdGlvbnMuZG90ID8gc3RhckRvdFN0YXJUZXN0RG90IDogc3RhckRvdFN0YXJUZXN0O1xuICAgICAgICB9XG4gICAgICAgIGVsc2UgaWYgKChtID0gcGF0dGVybi5tYXRjaChkb3RTdGFyUkUpKSkge1xuICAgICAgICAgICAgZmFzdFRlc3QgPSBkb3RTdGFyVGVzdDtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCByZSA9IGFzdF9qc18xLkFTVC5mcm9tR2xvYihwYXR0ZXJuLCB0aGlzLm9wdGlvbnMpLnRvTU1QYXR0ZXJuKCk7XG4gICAgICAgIGlmIChmYXN0VGVzdCAmJiB0eXBlb2YgcmUgPT09ICdvYmplY3QnKSB7XG4gICAgICAgICAgICAvLyBBdm9pZHMgb3ZlcnJpZGluZyBpbiBmcm96ZW4gZW52aXJvbm1lbnRzXG4gICAgICAgICAgICBSZWZsZWN0LmRlZmluZVByb3BlcnR5KHJlLCAndGVzdCcsIHsgdmFsdWU6IGZhc3RUZXN0IH0pO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiByZTtcbiAgICB9XG4gICAgbWFrZVJlKCkge1xuICAgICAgICBpZiAodGhpcy5yZWdleHAgfHwgdGhpcy5yZWdleHAgPT09IGZhbHNlKVxuICAgICAgICAgICAgcmV0dXJuIHRoaXMucmVnZXhwO1xuICAgICAgICAvLyBhdCB0aGlzIHBvaW50LCB0aGlzLnNldCBpcyBhIDJkIGFycmF5IG9mIHBhcnRpYWxcbiAgICAgICAgLy8gcGF0dGVybiBzdHJpbmdzLCBvciBcIioqXCIuXG4gICAgICAgIC8vXG4gICAgICAgIC8vIEl0J3MgYmV0dGVyIHRvIHVzZSAubWF0Y2goKS4gIFRoaXMgZnVuY3Rpb24gc2hvdWxkbid0XG4gICAgICAgIC8vIGJlIHVzZWQsIHJlYWxseSwgYnV0IGl0J3MgcHJldHR5IGNvbnZlbmllbnQgc29tZXRpbWVzLFxuICAgICAgICAvLyB3aGVuIHlvdSBqdXN0IHdhbnQgdG8gd29yayB3aXRoIGEgcmVnZXguXG4gICAgICAgIGNvbnN0IHNldCA9IHRoaXMuc2V0O1xuICAgICAgICBpZiAoIXNldC5sZW5ndGgpIHtcbiAgICAgICAgICAgIHRoaXMucmVnZXhwID0gZmFsc2U7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy5yZWdleHA7XG4gICAgICAgIH1cbiAgICAgICAgY29uc3Qgb3B0aW9ucyA9IHRoaXMub3B0aW9ucztcbiAgICAgICAgY29uc3QgdHdvU3RhciA9IG9wdGlvbnMubm9nbG9ic3RhclxuICAgICAgICAgICAgPyBzdGFyXG4gICAgICAgICAgICA6IG9wdGlvbnMuZG90XG4gICAgICAgICAgICAgICAgPyB0d29TdGFyRG90XG4gICAgICAgICAgICAgICAgOiB0d29TdGFyTm9Eb3Q7XG4gICAgICAgIGNvbnN0IGZsYWdzID0gbmV3IFNldChvcHRpb25zLm5vY2FzZSA/IFsnaSddIDogW10pO1xuICAgICAgICAvLyByZWdleHBpZnkgbm9uLWdsb2JzdGFyIHBhdHRlcm5zXG4gICAgICAgIC8vIGlmICoqIGlzIG9ubHkgaXRlbSwgdGhlbiB3ZSBqdXN0IGRvIG9uZSB0d29TdGFyXG4gICAgICAgIC8vIGlmICoqIGlzIGZpcnN0LCBhbmQgdGhlcmUgYXJlIG1vcmUsIHByZXBlbmQgKFxcL3x0d29TdGFyXFwvKT8gdG8gbmV4dFxuICAgICAgICAvLyBpZiAqKiBpcyBsYXN0LCBhcHBlbmQgKFxcL3R3b1N0YXJ8KSB0byBwcmV2aW91c1xuICAgICAgICAvLyBpZiAqKiBpcyBpbiB0aGUgbWlkZGxlLCBhcHBlbmQgKFxcL3xcXC90d29TdGFyXFwvKSB0byBwcmV2aW91c1xuICAgICAgICAvLyB0aGVuIGZpbHRlciBvdXQgR0xPQlNUQVIgc3ltYm9sc1xuICAgICAgICBsZXQgcmUgPSBzZXRcbiAgICAgICAgICAgIC5tYXAocGF0dGVybiA9PiB7XG4gICAgICAgICAgICBjb25zdCBwcCA9IHBhdHRlcm4ubWFwKHAgPT4ge1xuICAgICAgICAgICAgICAgIGlmIChwIGluc3RhbmNlb2YgUmVnRXhwKSB7XG4gICAgICAgICAgICAgICAgICAgIGZvciAoY29uc3QgZiBvZiBwLmZsYWdzLnNwbGl0KCcnKSlcbiAgICAgICAgICAgICAgICAgICAgICAgIGZsYWdzLmFkZChmKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgcmV0dXJuIHR5cGVvZiBwID09PSAnc3RyaW5nJ1xuICAgICAgICAgICAgICAgICAgICA/IHJlZ0V4cEVzY2FwZShwKVxuICAgICAgICAgICAgICAgICAgICA6IHAgPT09IGV4cG9ydHMuR0xPQlNUQVJcbiAgICAgICAgICAgICAgICAgICAgICAgID8gZXhwb3J0cy5HTE9CU1RBUlxuICAgICAgICAgICAgICAgICAgICAgICAgOiBwLl9zcmM7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIHBwLmZvckVhY2goKHAsIGkpID0+IHtcbiAgICAgICAgICAgICAgICBjb25zdCBuZXh0ID0gcHBbaSArIDFdO1xuICAgICAgICAgICAgICAgIGNvbnN0IHByZXYgPSBwcFtpIC0gMV07XG4gICAgICAgICAgICAgICAgaWYgKHAgIT09IGV4cG9ydHMuR0xPQlNUQVIgfHwgcHJldiA9PT0gZXhwb3J0cy5HTE9CU1RBUikge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGlmIChwcmV2ID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKG5leHQgIT09IHVuZGVmaW5lZCAmJiBuZXh0ICE9PSBleHBvcnRzLkdMT0JTVEFSKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBwcFtpICsgMV0gPSAnKD86XFxcXC98JyArIHR3b1N0YXIgKyAnXFxcXC8pPycgKyBuZXh0O1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgcHBbaV0gPSB0d29TdGFyO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGVsc2UgaWYgKG5leHQgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgICAgICAgICBwcFtpIC0gMV0gPSBwcmV2ICsgJyg/OlxcXFwvfCcgKyB0d29TdGFyICsgJyk/JztcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgZWxzZSBpZiAobmV4dCAhPT0gZXhwb3J0cy5HTE9CU1RBUikge1xuICAgICAgICAgICAgICAgICAgICBwcFtpIC0gMV0gPSBwcmV2ICsgJyg/OlxcXFwvfFxcXFwvJyArIHR3b1N0YXIgKyAnXFxcXC8pJyArIG5leHQ7XG4gICAgICAgICAgICAgICAgICAgIHBwW2kgKyAxXSA9IGV4cG9ydHMuR0xPQlNUQVI7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICByZXR1cm4gcHAuZmlsdGVyKHAgPT4gcCAhPT0gZXhwb3J0cy5HTE9CU1RBUikuam9pbignLycpO1xuICAgICAgICB9KVxuICAgICAgICAgICAgLmpvaW4oJ3wnKTtcbiAgICAgICAgLy8gbmVlZCB0byB3cmFwIGluIHBhcmVucyBpZiB3ZSBoYWQgbW9yZSB0aGFuIG9uZSB0aGluZyB3aXRoIHwsXG4gICAgICAgIC8vIG90aGVyd2lzZSBvbmx5IHRoZSBmaXJzdCB3aWxsIGJlIGFuY2hvcmVkIHRvIF4gYW5kIHRoZSBsYXN0IHRvICRcbiAgICAgICAgY29uc3QgW29wZW4sIGNsb3NlXSA9IHNldC5sZW5ndGggPiAxID8gWycoPzonLCAnKSddIDogWycnLCAnJ107XG4gICAgICAgIC8vIG11c3QgbWF0Y2ggZW50aXJlIHBhdHRlcm5cbiAgICAgICAgLy8gZW5kaW5nIGluIGEgKiBvciAqKiB3aWxsIG1ha2UgaXQgbGVzcyBzdHJpY3QuXG4gICAgICAgIHJlID0gJ14nICsgb3BlbiArIHJlICsgY2xvc2UgKyAnJCc7XG4gICAgICAgIC8vIGNhbiBtYXRjaCBhbnl0aGluZywgYXMgbG9uZyBhcyBpdCdzIG5vdCB0aGlzLlxuICAgICAgICBpZiAodGhpcy5uZWdhdGUpXG4gICAgICAgICAgICByZSA9ICdeKD8hJyArIHJlICsgJykuKyQnO1xuICAgICAgICB0cnkge1xuICAgICAgICAgICAgdGhpcy5yZWdleHAgPSBuZXcgUmVnRXhwKHJlLCBbLi4uZmxhZ3NdLmpvaW4oJycpKTtcbiAgICAgICAgICAgIC8qIGM4IGlnbm9yZSBzdGFydCAqL1xuICAgICAgICB9XG4gICAgICAgIGNhdGNoIChleCkge1xuICAgICAgICAgICAgLy8gc2hvdWxkIGJlIGltcG9zc2libGVcbiAgICAgICAgICAgIHRoaXMucmVnZXhwID0gZmFsc2U7XG4gICAgICAgIH1cbiAgICAgICAgLyogYzggaWdub3JlIHN0b3AgKi9cbiAgICAgICAgcmV0dXJuIHRoaXMucmVnZXhwO1xuICAgIH1cbiAgICBzbGFzaFNwbGl0KHApIHtcbiAgICAgICAgLy8gaWYgcCBzdGFydHMgd2l0aCAvLyBvbiB3aW5kb3dzLCB3ZSBwcmVzZXJ2ZSB0aGF0XG4gICAgICAgIC8vIHNvIHRoYXQgVU5DIHBhdGhzIGFyZW4ndCBicm9rZW4uICBPdGhlcndpc2UsIGFueSBudW1iZXIgb2ZcbiAgICAgICAgLy8gLyBjaGFyYWN0ZXJzIGFyZSBjb2FsZXNjZWQgaW50byBvbmUsIHVubGVzc1xuICAgICAgICAvLyBwcmVzZXJ2ZU11bHRpcGxlU2xhc2hlcyBpcyBzZXQgdG8gdHJ1ZS5cbiAgICAgICAgaWYgKHRoaXMucHJlc2VydmVNdWx0aXBsZVNsYXNoZXMpIHtcbiAgICAgICAgICAgIHJldHVybiBwLnNwbGl0KCcvJyk7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSBpZiAodGhpcy5pc1dpbmRvd3MgJiYgL15cXC9cXC9bXlxcL10rLy50ZXN0KHApKSB7XG4gICAgICAgICAgICAvLyBhZGQgYW4gZXh0cmEgJycgZm9yIHRoZSBvbmUgd2UgbG9zZVxuICAgICAgICAgICAgcmV0dXJuIFsnJywgLi4ucC5zcGxpdCgvXFwvKy8pXTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIHJldHVybiBwLnNwbGl0KC9cXC8rLyk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgbWF0Y2goZiwgcGFydGlhbCA9IHRoaXMucGFydGlhbCkge1xuICAgICAgICB0aGlzLmRlYnVnKCdtYXRjaCcsIGYsIHRoaXMucGF0dGVybik7XG4gICAgICAgIC8vIHNob3J0LWNpcmN1aXQgaW4gdGhlIGNhc2Ugb2YgYnVzdGVkIHRoaW5ncy5cbiAgICAgICAgLy8gY29tbWVudHMsIGV0Yy5cbiAgICAgICAgaWYgKHRoaXMuY29tbWVudCkge1xuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICB9XG4gICAgICAgIGlmICh0aGlzLmVtcHR5KSB7XG4gICAgICAgICAgICByZXR1cm4gZiA9PT0gJyc7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGYgPT09ICcvJyAmJiBwYXJ0aWFsKSB7XG4gICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBvcHRpb25zID0gdGhpcy5vcHRpb25zO1xuICAgICAgICAvLyB3aW5kb3dzOiBuZWVkIHRvIHVzZSAvLCBub3QgXFxcbiAgICAgICAgaWYgKHRoaXMuaXNXaW5kb3dzKSB7XG4gICAgICAgICAgICBmID0gZi5zcGxpdCgnXFxcXCcpLmpvaW4oJy8nKTtcbiAgICAgICAgfVxuICAgICAgICAvLyB0cmVhdCB0aGUgdGVzdCBwYXRoIGFzIGEgc2V0IG9mIHBhdGhwYXJ0cy5cbiAgICAgICAgY29uc3QgZmYgPSB0aGlzLnNsYXNoU3BsaXQoZik7XG4gICAgICAgIHRoaXMuZGVidWcodGhpcy5wYXR0ZXJuLCAnc3BsaXQnLCBmZik7XG4gICAgICAgIC8vIGp1c3QgT05FIG9mIHRoZSBwYXR0ZXJuIHNldHMgaW4gdGhpcy5zZXQgbmVlZHMgdG8gbWF0Y2hcbiAgICAgICAgLy8gaW4gb3JkZXIgZm9yIGl0IHRvIGJlIHZhbGlkLiAgSWYgbmVnYXRpbmcsIHRoZW4ganVzdCBvbmVcbiAgICAgICAgLy8gbWF0Y2ggbWVhbnMgdGhhdCB3ZSBoYXZlIGZhaWxlZC5cbiAgICAgICAgLy8gRWl0aGVyIHdheSwgcmV0dXJuIG9uIHRoZSBmaXJzdCBoaXQuXG4gICAgICAgIGNvbnN0IHNldCA9IHRoaXMuc2V0O1xuICAgICAgICB0aGlzLmRlYnVnKHRoaXMucGF0dGVybiwgJ3NldCcsIHNldCk7XG4gICAgICAgIC8vIEZpbmQgdGhlIGJhc2VuYW1lIG9mIHRoZSBwYXRoIGJ5IGxvb2tpbmcgZm9yIHRoZSBsYXN0IG5vbi1lbXB0eSBzZWdtZW50XG4gICAgICAgIGxldCBmaWxlbmFtZSA9IGZmW2ZmLmxlbmd0aCAtIDFdO1xuICAgICAgICBpZiAoIWZpbGVuYW1lKSB7XG4gICAgICAgICAgICBmb3IgKGxldCBpID0gZmYubGVuZ3RoIC0gMjsgIWZpbGVuYW1lICYmIGkgPj0gMDsgaS0tKSB7XG4gICAgICAgICAgICAgICAgZmlsZW5hbWUgPSBmZltpXTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IHNldC5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgY29uc3QgcGF0dGVybiA9IHNldFtpXTtcbiAgICAgICAgICAgIGxldCBmaWxlID0gZmY7XG4gICAgICAgICAgICBpZiAob3B0aW9ucy5tYXRjaEJhc2UgJiYgcGF0dGVybi5sZW5ndGggPT09IDEpIHtcbiAgICAgICAgICAgICAgICBmaWxlID0gW2ZpbGVuYW1lXTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGNvbnN0IGhpdCA9IHRoaXMubWF0Y2hPbmUoZmlsZSwgcGF0dGVybiwgcGFydGlhbCk7XG4gICAgICAgICAgICBpZiAoaGl0KSB7XG4gICAgICAgICAgICAgICAgaWYgKG9wdGlvbnMuZmxpcE5lZ2F0ZSkge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgcmV0dXJuICF0aGlzLm5lZ2F0ZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICAvLyBkaWRuJ3QgZ2V0IGFueSBoaXRzLiAgdGhpcyBpcyBzdWNjZXNzIGlmIGl0J3MgYSBuZWdhdGl2ZVxuICAgICAgICAvLyBwYXR0ZXJuLCBmYWlsdXJlIG90aGVyd2lzZS5cbiAgICAgICAgaWYgKG9wdGlvbnMuZmxpcE5lZ2F0ZSkge1xuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB0aGlzLm5lZ2F0ZTtcbiAgICB9XG4gICAgc3RhdGljIGRlZmF1bHRzKGRlZikge1xuICAgICAgICByZXR1cm4gZXhwb3J0cy5taW5pbWF0Y2guZGVmYXVsdHMoZGVmKS5NaW5pbWF0Y2g7XG4gICAgfVxufVxuZXhwb3J0cy5NaW5pbWF0Y2ggPSBNaW5pbWF0Y2g7XG4vKiBjOCBpZ25vcmUgc3RhcnQgKi9cbnZhciBhc3RfanNfMiA9IHJlcXVpcmUoXCIuL2FzdC5qc1wiKTtcbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIkFTVFwiLCB7IGVudW1lcmFibGU6IHRydWUsIGdldDogZnVuY3Rpb24gKCkgeyByZXR1cm4gYXN0X2pzXzIuQVNUOyB9IH0pO1xudmFyIGVzY2FwZV9qc18yID0gcmVxdWlyZShcIi4vZXNjYXBlLmpzXCIpO1xuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiZXNjYXBlXCIsIHsgZW51bWVyYWJsZTogdHJ1ZSwgZ2V0OiBmdW5jdGlvbiAoKSB7IHJldHVybiBlc2NhcGVfanNfMi5lc2NhcGU7IH0gfSk7XG52YXIgdW5lc2NhcGVfanNfMiA9IHJlcXVpcmUoXCIuL3VuZXNjYXBlLmpzXCIpO1xuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwidW5lc2NhcGVcIiwgeyBlbnVtZXJhYmxlOiB0cnVlLCBnZXQ6IGZ1bmN0aW9uICgpIHsgcmV0dXJuIHVuZXNjYXBlX2pzXzIudW5lc2NhcGU7IH0gfSk7XG4vKiBjOCBpZ25vcmUgc3RvcCAqL1xuZXhwb3J0cy5taW5pbWF0Y2guQVNUID0gYXN0X2pzXzEuQVNUO1xuZXhwb3J0cy5taW5pbWF0Y2guTWluaW1hdGNoID0gTWluaW1hdGNoO1xuZXhwb3J0cy5taW5pbWF0Y2guZXNjYXBlID0gZXNjYXBlX2pzXzEuZXNjYXBlO1xuZXhwb3J0cy5taW5pbWF0Y2gudW5lc2NhcGUgPSB1bmVzY2FwZV9qc18xLnVuZXNjYXBlO1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9aW5kZXguanMubWFwIiwKICAgICJcInVzZSBzdHJpY3RcIjtcbi8qKlxuICogQG1vZHVsZSBMUlVDYWNoZVxuICovXG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJfX2VzTW9kdWxlXCIsIHsgdmFsdWU6IHRydWUgfSk7XG5leHBvcnRzLkxSVUNhY2hlID0gdm9pZCAwO1xuY29uc3QgcGVyZiA9IHR5cGVvZiBwZXJmb3JtYW5jZSA9PT0gJ29iamVjdCcgJiZcbiAgICBwZXJmb3JtYW5jZSAmJlxuICAgIHR5cGVvZiBwZXJmb3JtYW5jZS5ub3cgPT09ICdmdW5jdGlvbidcbiAgICA/IHBlcmZvcm1hbmNlXG4gICAgOiBEYXRlO1xuY29uc3Qgd2FybmVkID0gbmV3IFNldCgpO1xuLyogYzggaWdub3JlIHN0YXJ0ICovXG5jb25zdCBQUk9DRVNTID0gKHR5cGVvZiBwcm9jZXNzID09PSAnb2JqZWN0JyAmJiAhIXByb2Nlc3MgPyBwcm9jZXNzIDoge30pO1xuLyogYzggaWdub3JlIHN0YXJ0ICovXG5jb25zdCBlbWl0V2FybmluZyA9IChtc2csIHR5cGUsIGNvZGUsIGZuKSA9PiB7XG4gICAgdHlwZW9mIFBST0NFU1MuZW1pdFdhcm5pbmcgPT09ICdmdW5jdGlvbidcbiAgICAgICAgPyBQUk9DRVNTLmVtaXRXYXJuaW5nKG1zZywgdHlwZSwgY29kZSwgZm4pXG4gICAgICAgIDogY29uc29sZS5lcnJvcihgWyR7Y29kZX1dICR7dHlwZX06ICR7bXNnfWApO1xufTtcbmxldCBBQyA9IGdsb2JhbFRoaXMuQWJvcnRDb250cm9sbGVyO1xubGV0IEFTID0gZ2xvYmFsVGhpcy5BYm9ydFNpZ25hbDtcbi8qIGM4IGlnbm9yZSBzdGFydCAqL1xuaWYgKHR5cGVvZiBBQyA9PT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAvL0B0cy1pZ25vcmVcbiAgICBBUyA9IGNsYXNzIEFib3J0U2lnbmFsIHtcbiAgICAgICAgb25hYm9ydDtcbiAgICAgICAgX29uYWJvcnQgPSBbXTtcbiAgICAgICAgcmVhc29uO1xuICAgICAgICBhYm9ydGVkID0gZmFsc2U7XG4gICAgICAgIGFkZEV2ZW50TGlzdGVuZXIoXywgZm4pIHtcbiAgICAgICAgICAgIHRoaXMuX29uYWJvcnQucHVzaChmbik7XG4gICAgICAgIH1cbiAgICB9O1xuICAgIC8vQHRzLWlnbm9yZVxuICAgIEFDID0gY2xhc3MgQWJvcnRDb250cm9sbGVyIHtcbiAgICAgICAgY29uc3RydWN0b3IoKSB7XG4gICAgICAgICAgICB3YXJuQUNQb2x5ZmlsbCgpO1xuICAgICAgICB9XG4gICAgICAgIHNpZ25hbCA9IG5ldyBBUygpO1xuICAgICAgICBhYm9ydChyZWFzb24pIHtcbiAgICAgICAgICAgIGlmICh0aGlzLnNpZ25hbC5hYm9ydGVkKVxuICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgIC8vQHRzLWlnbm9yZVxuICAgICAgICAgICAgdGhpcy5zaWduYWwucmVhc29uID0gcmVhc29uO1xuICAgICAgICAgICAgLy9AdHMtaWdub3JlXG4gICAgICAgICAgICB0aGlzLnNpZ25hbC5hYm9ydGVkID0gdHJ1ZTtcbiAgICAgICAgICAgIC8vQHRzLWlnbm9yZVxuICAgICAgICAgICAgZm9yIChjb25zdCBmbiBvZiB0aGlzLnNpZ25hbC5fb25hYm9ydCkge1xuICAgICAgICAgICAgICAgIGZuKHJlYXNvbik7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICB0aGlzLnNpZ25hbC5vbmFib3J0Py4ocmVhc29uKTtcbiAgICAgICAgfVxuICAgIH07XG4gICAgbGV0IHByaW50QUNQb2x5ZmlsbFdhcm5pbmcgPSBQUk9DRVNTLmVudj8uTFJVX0NBQ0hFX0lHTk9SRV9BQ19XQVJOSU5HICE9PSAnMSc7XG4gICAgY29uc3Qgd2FybkFDUG9seWZpbGwgPSAoKSA9PiB7XG4gICAgICAgIGlmICghcHJpbnRBQ1BvbHlmaWxsV2FybmluZylcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgcHJpbnRBQ1BvbHlmaWxsV2FybmluZyA9IGZhbHNlO1xuICAgICAgICBlbWl0V2FybmluZygnQWJvcnRDb250cm9sbGVyIGlzIG5vdCBkZWZpbmVkLiBJZiB1c2luZyBscnUtY2FjaGUgaW4gJyArXG4gICAgICAgICAgICAnbm9kZSAxNCwgbG9hZCBhbiBBYm9ydENvbnRyb2xsZXIgcG9seWZpbGwgZnJvbSB0aGUgJyArXG4gICAgICAgICAgICAnYG5vZGUtYWJvcnQtY29udHJvbGxlcmAgcGFja2FnZS4gQSBtaW5pbWFsIHBvbHlmaWxsIGlzICcgK1xuICAgICAgICAgICAgJ3Byb3ZpZGVkIGZvciB1c2UgYnkgTFJVQ2FjaGUuZmV0Y2goKSwgYnV0IGl0IHNob3VsZCBub3QgYmUgJyArXG4gICAgICAgICAgICAncmVsaWVkIHVwb24gaW4gb3RoZXIgY29udGV4dHMgKGVnLCBwYXNzaW5nIGl0IHRvIG90aGVyIEFQSXMgdGhhdCAnICtcbiAgICAgICAgICAgICd1c2UgQWJvcnRDb250cm9sbGVyL0Fib3J0U2lnbmFsIG1pZ2h0IGhhdmUgdW5kZXNpcmFibGUgZWZmZWN0cykuICcgK1xuICAgICAgICAgICAgJ1lvdSBtYXkgZGlzYWJsZSB0aGlzIHdpdGggTFJVX0NBQ0hFX0lHTk9SRV9BQ19XQVJOSU5HPTEgaW4gdGhlIGVudi4nLCAnTk9fQUJPUlRfQ09OVFJPTExFUicsICdFTk9UU1VQJywgd2FybkFDUG9seWZpbGwpO1xuICAgIH07XG59XG4vKiBjOCBpZ25vcmUgc3RvcCAqL1xuY29uc3Qgc2hvdWxkV2FybiA9IChjb2RlKSA9PiAhd2FybmVkLmhhcyhjb2RlKTtcbmNvbnN0IFRZUEUgPSBTeW1ib2woJ3R5cGUnKTtcbmNvbnN0IGlzUG9zSW50ID0gKG4pID0+IG4gJiYgbiA9PT0gTWF0aC5mbG9vcihuKSAmJiBuID4gMCAmJiBpc0Zpbml0ZShuKTtcbi8qIGM4IGlnbm9yZSBzdGFydCAqL1xuLy8gVGhpcyBpcyBhIGxpdHRsZSBiaXQgcmlkaWN1bG91cywgdGJoLlxuLy8gVGhlIG1heGltdW0gYXJyYXkgbGVuZ3RoIGlzIDJeMzItMSBvciB0aGVyZWFib3V0cyBvbiBtb3N0IEpTIGltcGxzLlxuLy8gQW5kIHdlbGwgYmVmb3JlIHRoYXQgcG9pbnQsIHlvdSdyZSBjYWNoaW5nIHRoZSBlbnRpcmUgd29ybGQsIEkgbWVhbixcbi8vIHRoYXQncyB+MzJHQiBvZiBqdXN0IGludGVnZXJzIGZvciB0aGUgbmV4dC9wcmV2IGxpbmtzLCBwbHVzIHdoYXRldmVyXG4vLyBlbHNlIHRvIGhvbGQgdGhhdCBtYW55IGtleXMgYW5kIHZhbHVlcy4gIEp1c3QgZmlsbGluZyB0aGUgbWVtb3J5IHdpdGhcbi8vIHplcm9lcyBhdCBpbml0IHRpbWUgaXMgYnJ1dGFsIHdoZW4geW91IGdldCB0aGF0IGJpZy5cbi8vIEJ1dCB3aHkgbm90IGJlIGNvbXBsZXRlP1xuLy8gTWF5YmUgaW4gdGhlIGZ1dHVyZSwgdGhlc2UgbGltaXRzIHdpbGwgaGF2ZSBleHBhbmRlZC5cbmNvbnN0IGdldFVpbnRBcnJheSA9IChtYXgpID0+ICFpc1Bvc0ludChtYXgpXG4gICAgPyBudWxsXG4gICAgOiBtYXggPD0gTWF0aC5wb3coMiwgOClcbiAgICAgICAgPyBVaW50OEFycmF5XG4gICAgICAgIDogbWF4IDw9IE1hdGgucG93KDIsIDE2KVxuICAgICAgICAgICAgPyBVaW50MTZBcnJheVxuICAgICAgICAgICAgOiBtYXggPD0gTWF0aC5wb3coMiwgMzIpXG4gICAgICAgICAgICAgICAgPyBVaW50MzJBcnJheVxuICAgICAgICAgICAgICAgIDogbWF4IDw9IE51bWJlci5NQVhfU0FGRV9JTlRFR0VSXG4gICAgICAgICAgICAgICAgICAgID8gWmVyb0FycmF5XG4gICAgICAgICAgICAgICAgICAgIDogbnVsbDtcbi8qIGM4IGlnbm9yZSBzdG9wICovXG5jbGFzcyBaZXJvQXJyYXkgZXh0ZW5kcyBBcnJheSB7XG4gICAgY29uc3RydWN0b3Ioc2l6ZSkge1xuICAgICAgICBzdXBlcihzaXplKTtcbiAgICAgICAgdGhpcy5maWxsKDApO1xuICAgIH1cbn1cbmNsYXNzIFN0YWNrIHtcbiAgICBoZWFwO1xuICAgIGxlbmd0aDtcbiAgICAvLyBwcml2YXRlIGNvbnN0cnVjdG9yXG4gICAgc3RhdGljICNjb25zdHJ1Y3RpbmcgPSBmYWxzZTtcbiAgICBzdGF0aWMgY3JlYXRlKG1heCkge1xuICAgICAgICBjb25zdCBIZWFwQ2xzID0gZ2V0VWludEFycmF5KG1heCk7XG4gICAgICAgIGlmICghSGVhcENscylcbiAgICAgICAgICAgIHJldHVybiBbXTtcbiAgICAgICAgU3RhY2suI2NvbnN0cnVjdGluZyA9IHRydWU7XG4gICAgICAgIGNvbnN0IHMgPSBuZXcgU3RhY2sobWF4LCBIZWFwQ2xzKTtcbiAgICAgICAgU3RhY2suI2NvbnN0cnVjdGluZyA9IGZhbHNlO1xuICAgICAgICByZXR1cm4gcztcbiAgICB9XG4gICAgY29uc3RydWN0b3IobWF4LCBIZWFwQ2xzKSB7XG4gICAgICAgIC8qIGM4IGlnbm9yZSBzdGFydCAqL1xuICAgICAgICBpZiAoIVN0YWNrLiNjb25zdHJ1Y3RpbmcpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoJ2luc3RhbnRpYXRlIFN0YWNrIHVzaW5nIFN0YWNrLmNyZWF0ZShuKScpO1xuICAgICAgICB9XG4gICAgICAgIC8qIGM4IGlnbm9yZSBzdG9wICovXG4gICAgICAgIHRoaXMuaGVhcCA9IG5ldyBIZWFwQ2xzKG1heCk7XG4gICAgICAgIHRoaXMubGVuZ3RoID0gMDtcbiAgICB9XG4gICAgcHVzaChuKSB7XG4gICAgICAgIHRoaXMuaGVhcFt0aGlzLmxlbmd0aCsrXSA9IG47XG4gICAgfVxuICAgIHBvcCgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuaGVhcFstLXRoaXMubGVuZ3RoXTtcbiAgICB9XG59XG4vKipcbiAqIERlZmF1bHQgZXhwb3J0LCB0aGUgdGhpbmcgeW91J3JlIHVzaW5nIHRoaXMgbW9kdWxlIHRvIGdldC5cbiAqXG4gKiBUaGUgYEtgIGFuZCBgVmAgdHlwZXMgZGVmaW5lIHRoZSBrZXkgYW5kIHZhbHVlIHR5cGVzLCByZXNwZWN0aXZlbHkuIFRoZVxuICogb3B0aW9uYWwgYEZDYCB0eXBlIGRlZmluZXMgdGhlIHR5cGUgb2YgdGhlIGBjb250ZXh0YCBvYmplY3QgcGFzc2VkIHRvXG4gKiBgY2FjaGUuZmV0Y2goKWAgYW5kIGBjYWNoZS5tZW1vKClgLlxuICpcbiAqIEtleXMgYW5kIHZhbHVlcyAqKm11c3Qgbm90KiogYmUgYG51bGxgIG9yIGB1bmRlZmluZWRgLlxuICpcbiAqIEFsbCBwcm9wZXJ0aWVzIGZyb20gdGhlIG9wdGlvbnMgb2JqZWN0ICh3aXRoIHRoZSBleGNlcHRpb24gb2YgYG1heGAsXG4gKiBgbWF4U2l6ZWAsIGBmZXRjaE1ldGhvZGAsIGBtZW1vTWV0aG9kYCwgYGRpc3Bvc2VgIGFuZCBgZGlzcG9zZUFmdGVyYCkgYXJlXG4gKiBhZGRlZCBhcyBub3JtYWwgcHVibGljIG1lbWJlcnMuIChUaGUgbGlzdGVkIG9wdGlvbnMgYXJlIHJlYWQtb25seSBnZXR0ZXJzLilcbiAqXG4gKiBDaGFuZ2luZyBhbnkgb2YgdGhlc2Ugd2lsbCBhbHRlciB0aGUgZGVmYXVsdHMgZm9yIHN1YnNlcXVlbnQgbWV0aG9kIGNhbGxzLlxuICovXG5jbGFzcyBMUlVDYWNoZSB7XG4gICAgLy8gb3B0aW9ucyB0aGF0IGNhbm5vdCBiZSBjaGFuZ2VkIHdpdGhvdXQgZGlzYXN0ZXJcbiAgICAjbWF4O1xuICAgICNtYXhTaXplO1xuICAgICNkaXNwb3NlO1xuICAgICNkaXNwb3NlQWZ0ZXI7XG4gICAgI2ZldGNoTWV0aG9kO1xuICAgICNtZW1vTWV0aG9kO1xuICAgIC8qKlxuICAgICAqIHtAbGluayBMUlVDYWNoZS5PcHRpb25zQmFzZS50dGx9XG4gICAgICovXG4gICAgdHRsO1xuICAgIC8qKlxuICAgICAqIHtAbGluayBMUlVDYWNoZS5PcHRpb25zQmFzZS50dGxSZXNvbHV0aW9ufVxuICAgICAqL1xuICAgIHR0bFJlc29sdXRpb247XG4gICAgLyoqXG4gICAgICoge0BsaW5rIExSVUNhY2hlLk9wdGlvbnNCYXNlLnR0bEF1dG9wdXJnZX1cbiAgICAgKi9cbiAgICB0dGxBdXRvcHVyZ2U7XG4gICAgLyoqXG4gICAgICoge0BsaW5rIExSVUNhY2hlLk9wdGlvbnNCYXNlLnVwZGF0ZUFnZU9uR2V0fVxuICAgICAqL1xuICAgIHVwZGF0ZUFnZU9uR2V0O1xuICAgIC8qKlxuICAgICAqIHtAbGluayBMUlVDYWNoZS5PcHRpb25zQmFzZS51cGRhdGVBZ2VPbkhhc31cbiAgICAgKi9cbiAgICB1cGRhdGVBZ2VPbkhhcztcbiAgICAvKipcbiAgICAgKiB7QGxpbmsgTFJVQ2FjaGUuT3B0aW9uc0Jhc2UuYWxsb3dTdGFsZX1cbiAgICAgKi9cbiAgICBhbGxvd1N0YWxlO1xuICAgIC8qKlxuICAgICAqIHtAbGluayBMUlVDYWNoZS5PcHRpb25zQmFzZS5ub0Rpc3Bvc2VPblNldH1cbiAgICAgKi9cbiAgICBub0Rpc3Bvc2VPblNldDtcbiAgICAvKipcbiAgICAgKiB7QGxpbmsgTFJVQ2FjaGUuT3B0aW9uc0Jhc2Uubm9VcGRhdGVUVEx9XG4gICAgICovXG4gICAgbm9VcGRhdGVUVEw7XG4gICAgLyoqXG4gICAgICoge0BsaW5rIExSVUNhY2hlLk9wdGlvbnNCYXNlLm1heEVudHJ5U2l6ZX1cbiAgICAgKi9cbiAgICBtYXhFbnRyeVNpemU7XG4gICAgLyoqXG4gICAgICoge0BsaW5rIExSVUNhY2hlLk9wdGlvbnNCYXNlLnNpemVDYWxjdWxhdGlvbn1cbiAgICAgKi9cbiAgICBzaXplQ2FsY3VsYXRpb247XG4gICAgLyoqXG4gICAgICoge0BsaW5rIExSVUNhY2hlLk9wdGlvbnNCYXNlLm5vRGVsZXRlT25GZXRjaFJlamVjdGlvbn1cbiAgICAgKi9cbiAgICBub0RlbGV0ZU9uRmV0Y2hSZWplY3Rpb247XG4gICAgLyoqXG4gICAgICoge0BsaW5rIExSVUNhY2hlLk9wdGlvbnNCYXNlLm5vRGVsZXRlT25TdGFsZUdldH1cbiAgICAgKi9cbiAgICBub0RlbGV0ZU9uU3RhbGVHZXQ7XG4gICAgLyoqXG4gICAgICoge0BsaW5rIExSVUNhY2hlLk9wdGlvbnNCYXNlLmFsbG93U3RhbGVPbkZldGNoQWJvcnR9XG4gICAgICovXG4gICAgYWxsb3dTdGFsZU9uRmV0Y2hBYm9ydDtcbiAgICAvKipcbiAgICAgKiB7QGxpbmsgTFJVQ2FjaGUuT3B0aW9uc0Jhc2UuYWxsb3dTdGFsZU9uRmV0Y2hSZWplY3Rpb259XG4gICAgICovXG4gICAgYWxsb3dTdGFsZU9uRmV0Y2hSZWplY3Rpb247XG4gICAgLyoqXG4gICAgICoge0BsaW5rIExSVUNhY2hlLk9wdGlvbnNCYXNlLmlnbm9yZUZldGNoQWJvcnR9XG4gICAgICovXG4gICAgaWdub3JlRmV0Y2hBYm9ydDtcbiAgICAvLyBjb21wdXRlZCBwcm9wZXJ0aWVzXG4gICAgI3NpemU7XG4gICAgI2NhbGN1bGF0ZWRTaXplO1xuICAgICNrZXlNYXA7XG4gICAgI2tleUxpc3Q7XG4gICAgI3ZhbExpc3Q7XG4gICAgI25leHQ7XG4gICAgI3ByZXY7XG4gICAgI2hlYWQ7XG4gICAgI3RhaWw7XG4gICAgI2ZyZWU7XG4gICAgI2Rpc3Bvc2VkO1xuICAgICNzaXplcztcbiAgICAjc3RhcnRzO1xuICAgICN0dGxzO1xuICAgICNoYXNEaXNwb3NlO1xuICAgICNoYXNGZXRjaE1ldGhvZDtcbiAgICAjaGFzRGlzcG9zZUFmdGVyO1xuICAgIC8qKlxuICAgICAqIERvIG5vdCBjYWxsIHRoaXMgbWV0aG9kIHVubGVzcyB5b3UgbmVlZCB0byBpbnNwZWN0IHRoZVxuICAgICAqIGlubmVyIHdvcmtpbmdzIG9mIHRoZSBjYWNoZS4gIElmIGFueXRoaW5nIHJldHVybmVkIGJ5IHRoaXNcbiAgICAgKiBvYmplY3QgaXMgbW9kaWZpZWQgaW4gYW55IHdheSwgc3RyYW5nZSBicmVha2FnZSBtYXkgb2NjdXIuXG4gICAgICpcbiAgICAgKiBUaGVzZSBmaWVsZHMgYXJlIHByaXZhdGUgZm9yIGEgcmVhc29uIVxuICAgICAqXG4gICAgICogQGludGVybmFsXG4gICAgICovXG4gICAgc3RhdGljIHVuc2FmZUV4cG9zZUludGVybmFscyhjKSB7XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAvLyBwcm9wZXJ0aWVzXG4gICAgICAgICAgICBzdGFydHM6IGMuI3N0YXJ0cyxcbiAgICAgICAgICAgIHR0bHM6IGMuI3R0bHMsXG4gICAgICAgICAgICBzaXplczogYy4jc2l6ZXMsXG4gICAgICAgICAgICBrZXlNYXA6IGMuI2tleU1hcCxcbiAgICAgICAgICAgIGtleUxpc3Q6IGMuI2tleUxpc3QsXG4gICAgICAgICAgICB2YWxMaXN0OiBjLiN2YWxMaXN0LFxuICAgICAgICAgICAgbmV4dDogYy4jbmV4dCxcbiAgICAgICAgICAgIHByZXY6IGMuI3ByZXYsXG4gICAgICAgICAgICBnZXQgaGVhZCgpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gYy4jaGVhZDtcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBnZXQgdGFpbCgpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gYy4jdGFpbDtcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBmcmVlOiBjLiNmcmVlLFxuICAgICAgICAgICAgLy8gbWV0aG9kc1xuICAgICAgICAgICAgaXNCYWNrZ3JvdW5kRmV0Y2g6IChwKSA9PiBjLiNpc0JhY2tncm91bmRGZXRjaChwKSxcbiAgICAgICAgICAgIGJhY2tncm91bmRGZXRjaDogKGssIGluZGV4LCBvcHRpb25zLCBjb250ZXh0KSA9PiBjLiNiYWNrZ3JvdW5kRmV0Y2goaywgaW5kZXgsIG9wdGlvbnMsIGNvbnRleHQpLFxuICAgICAgICAgICAgbW92ZVRvVGFpbDogKGluZGV4KSA9PiBjLiNtb3ZlVG9UYWlsKGluZGV4KSxcbiAgICAgICAgICAgIGluZGV4ZXM6IChvcHRpb25zKSA9PiBjLiNpbmRleGVzKG9wdGlvbnMpLFxuICAgICAgICAgICAgcmluZGV4ZXM6IChvcHRpb25zKSA9PiBjLiNyaW5kZXhlcyhvcHRpb25zKSxcbiAgICAgICAgICAgIGlzU3RhbGU6IChpbmRleCkgPT4gYy4jaXNTdGFsZShpbmRleCksXG4gICAgICAgIH07XG4gICAgfVxuICAgIC8vIFByb3RlY3RlZCByZWFkLW9ubHkgbWVtYmVyc1xuICAgIC8qKlxuICAgICAqIHtAbGluayBMUlVDYWNoZS5PcHRpb25zQmFzZS5tYXh9IChyZWFkLW9ubHkpXG4gICAgICovXG4gICAgZ2V0IG1heCgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuI21heDtcbiAgICB9XG4gICAgLyoqXG4gICAgICoge0BsaW5rIExSVUNhY2hlLk9wdGlvbnNCYXNlLm1heFNpemV9IChyZWFkLW9ubHkpXG4gICAgICovXG4gICAgZ2V0IG1heFNpemUoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLiNtYXhTaXplO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBUaGUgdG90YWwgY29tcHV0ZWQgc2l6ZSBvZiBpdGVtcyBpbiB0aGUgY2FjaGUgKHJlYWQtb25seSlcbiAgICAgKi9cbiAgICBnZXQgY2FsY3VsYXRlZFNpemUoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLiNjYWxjdWxhdGVkU2l6ZTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogVGhlIG51bWJlciBvZiBpdGVtcyBzdG9yZWQgaW4gdGhlIGNhY2hlIChyZWFkLW9ubHkpXG4gICAgICovXG4gICAgZ2V0IHNpemUoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLiNzaXplO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiB7QGxpbmsgTFJVQ2FjaGUuT3B0aW9uc0Jhc2UuZmV0Y2hNZXRob2R9IChyZWFkLW9ubHkpXG4gICAgICovXG4gICAgZ2V0IGZldGNoTWV0aG9kKCkge1xuICAgICAgICByZXR1cm4gdGhpcy4jZmV0Y2hNZXRob2Q7XG4gICAgfVxuICAgIGdldCBtZW1vTWV0aG9kKCkge1xuICAgICAgICByZXR1cm4gdGhpcy4jbWVtb01ldGhvZDtcbiAgICB9XG4gICAgLyoqXG4gICAgICoge0BsaW5rIExSVUNhY2hlLk9wdGlvbnNCYXNlLmRpc3Bvc2V9IChyZWFkLW9ubHkpXG4gICAgICovXG4gICAgZ2V0IGRpc3Bvc2UoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLiNkaXNwb3NlO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiB7QGxpbmsgTFJVQ2FjaGUuT3B0aW9uc0Jhc2UuZGlzcG9zZUFmdGVyfSAocmVhZC1vbmx5KVxuICAgICAqL1xuICAgIGdldCBkaXNwb3NlQWZ0ZXIoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLiNkaXNwb3NlQWZ0ZXI7XG4gICAgfVxuICAgIGNvbnN0cnVjdG9yKG9wdGlvbnMpIHtcbiAgICAgICAgY29uc3QgeyBtYXggPSAwLCB0dGwsIHR0bFJlc29sdXRpb24gPSAxLCB0dGxBdXRvcHVyZ2UsIHVwZGF0ZUFnZU9uR2V0LCB1cGRhdGVBZ2VPbkhhcywgYWxsb3dTdGFsZSwgZGlzcG9zZSwgZGlzcG9zZUFmdGVyLCBub0Rpc3Bvc2VPblNldCwgbm9VcGRhdGVUVEwsIG1heFNpemUgPSAwLCBtYXhFbnRyeVNpemUgPSAwLCBzaXplQ2FsY3VsYXRpb24sIGZldGNoTWV0aG9kLCBtZW1vTWV0aG9kLCBub0RlbGV0ZU9uRmV0Y2hSZWplY3Rpb24sIG5vRGVsZXRlT25TdGFsZUdldCwgYWxsb3dTdGFsZU9uRmV0Y2hSZWplY3Rpb24sIGFsbG93U3RhbGVPbkZldGNoQWJvcnQsIGlnbm9yZUZldGNoQWJvcnQsIH0gPSBvcHRpb25zO1xuICAgICAgICBpZiAobWF4ICE9PSAwICYmICFpc1Bvc0ludChtYXgpKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCdtYXggb3B0aW9uIG11c3QgYmUgYSBub25uZWdhdGl2ZSBpbnRlZ2VyJyk7XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgVWludEFycmF5ID0gbWF4ID8gZ2V0VWludEFycmF5KG1heCkgOiBBcnJheTtcbiAgICAgICAgaWYgKCFVaW50QXJyYXkpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcignaW52YWxpZCBtYXggdmFsdWU6ICcgKyBtYXgpO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMuI21heCA9IG1heDtcbiAgICAgICAgdGhpcy4jbWF4U2l6ZSA9IG1heFNpemU7XG4gICAgICAgIHRoaXMubWF4RW50cnlTaXplID0gbWF4RW50cnlTaXplIHx8IHRoaXMuI21heFNpemU7XG4gICAgICAgIHRoaXMuc2l6ZUNhbGN1bGF0aW9uID0gc2l6ZUNhbGN1bGF0aW9uO1xuICAgICAgICBpZiAodGhpcy5zaXplQ2FsY3VsYXRpb24pIHtcbiAgICAgICAgICAgIGlmICghdGhpcy4jbWF4U2l6ZSAmJiAhdGhpcy5tYXhFbnRyeVNpemUpIHtcbiAgICAgICAgICAgICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCdjYW5ub3Qgc2V0IHNpemVDYWxjdWxhdGlvbiB3aXRob3V0IHNldHRpbmcgbWF4U2l6ZSBvciBtYXhFbnRyeVNpemUnKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmICh0eXBlb2YgdGhpcy5zaXplQ2FsY3VsYXRpb24gIT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgICAgICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCdzaXplQ2FsY3VsYXRpb24gc2V0IHRvIG5vbi1mdW5jdGlvbicpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGlmIChtZW1vTWV0aG9kICE9PSB1bmRlZmluZWQgJiZcbiAgICAgICAgICAgIHR5cGVvZiBtZW1vTWV0aG9kICE9PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCdtZW1vTWV0aG9kIG11c3QgYmUgYSBmdW5jdGlvbiBpZiBkZWZpbmVkJyk7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy4jbWVtb01ldGhvZCA9IG1lbW9NZXRob2Q7XG4gICAgICAgIGlmIChmZXRjaE1ldGhvZCAhPT0gdW5kZWZpbmVkICYmXG4gICAgICAgICAgICB0eXBlb2YgZmV0Y2hNZXRob2QgIT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoJ2ZldGNoTWV0aG9kIG11c3QgYmUgYSBmdW5jdGlvbiBpZiBzcGVjaWZpZWQnKTtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLiNmZXRjaE1ldGhvZCA9IGZldGNoTWV0aG9kO1xuICAgICAgICB0aGlzLiNoYXNGZXRjaE1ldGhvZCA9ICEhZmV0Y2hNZXRob2Q7XG4gICAgICAgIHRoaXMuI2tleU1hcCA9IG5ldyBNYXAoKTtcbiAgICAgICAgdGhpcy4ja2V5TGlzdCA9IG5ldyBBcnJheShtYXgpLmZpbGwodW5kZWZpbmVkKTtcbiAgICAgICAgdGhpcy4jdmFsTGlzdCA9IG5ldyBBcnJheShtYXgpLmZpbGwodW5kZWZpbmVkKTtcbiAgICAgICAgdGhpcy4jbmV4dCA9IG5ldyBVaW50QXJyYXkobWF4KTtcbiAgICAgICAgdGhpcy4jcHJldiA9IG5ldyBVaW50QXJyYXkobWF4KTtcbiAgICAgICAgdGhpcy4jaGVhZCA9IDA7XG4gICAgICAgIHRoaXMuI3RhaWwgPSAwO1xuICAgICAgICB0aGlzLiNmcmVlID0gU3RhY2suY3JlYXRlKG1heCk7XG4gICAgICAgIHRoaXMuI3NpemUgPSAwO1xuICAgICAgICB0aGlzLiNjYWxjdWxhdGVkU2l6ZSA9IDA7XG4gICAgICAgIGlmICh0eXBlb2YgZGlzcG9zZSA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICAgICAgdGhpcy4jZGlzcG9zZSA9IGRpc3Bvc2U7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHR5cGVvZiBkaXNwb3NlQWZ0ZXIgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgICAgIHRoaXMuI2Rpc3Bvc2VBZnRlciA9IGRpc3Bvc2VBZnRlcjtcbiAgICAgICAgICAgIHRoaXMuI2Rpc3Bvc2VkID0gW107XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICB0aGlzLiNkaXNwb3NlQWZ0ZXIgPSB1bmRlZmluZWQ7XG4gICAgICAgICAgICB0aGlzLiNkaXNwb3NlZCA9IHVuZGVmaW5lZDtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLiNoYXNEaXNwb3NlID0gISF0aGlzLiNkaXNwb3NlO1xuICAgICAgICB0aGlzLiNoYXNEaXNwb3NlQWZ0ZXIgPSAhIXRoaXMuI2Rpc3Bvc2VBZnRlcjtcbiAgICAgICAgdGhpcy5ub0Rpc3Bvc2VPblNldCA9ICEhbm9EaXNwb3NlT25TZXQ7XG4gICAgICAgIHRoaXMubm9VcGRhdGVUVEwgPSAhIW5vVXBkYXRlVFRMO1xuICAgICAgICB0aGlzLm5vRGVsZXRlT25GZXRjaFJlamVjdGlvbiA9ICEhbm9EZWxldGVPbkZldGNoUmVqZWN0aW9uO1xuICAgICAgICB0aGlzLmFsbG93U3RhbGVPbkZldGNoUmVqZWN0aW9uID0gISFhbGxvd1N0YWxlT25GZXRjaFJlamVjdGlvbjtcbiAgICAgICAgdGhpcy5hbGxvd1N0YWxlT25GZXRjaEFib3J0ID0gISFhbGxvd1N0YWxlT25GZXRjaEFib3J0O1xuICAgICAgICB0aGlzLmlnbm9yZUZldGNoQWJvcnQgPSAhIWlnbm9yZUZldGNoQWJvcnQ7XG4gICAgICAgIC8vIE5COiBtYXhFbnRyeVNpemUgaXMgc2V0IHRvIG1heFNpemUgaWYgaXQncyBzZXRcbiAgICAgICAgaWYgKHRoaXMubWF4RW50cnlTaXplICE9PSAwKSB7XG4gICAgICAgICAgICBpZiAodGhpcy4jbWF4U2l6ZSAhPT0gMCkge1xuICAgICAgICAgICAgICAgIGlmICghaXNQb3NJbnQodGhpcy4jbWF4U2l6ZSkpIHtcbiAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcignbWF4U2l6ZSBtdXN0IGJlIGEgcG9zaXRpdmUgaW50ZWdlciBpZiBzcGVjaWZpZWQnKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAoIWlzUG9zSW50KHRoaXMubWF4RW50cnlTaXplKSkge1xuICAgICAgICAgICAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoJ21heEVudHJ5U2l6ZSBtdXN0IGJlIGEgcG9zaXRpdmUgaW50ZWdlciBpZiBzcGVjaWZpZWQnKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHRoaXMuI2luaXRpYWxpemVTaXplVHJhY2tpbmcoKTtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLmFsbG93U3RhbGUgPSAhIWFsbG93U3RhbGU7XG4gICAgICAgIHRoaXMubm9EZWxldGVPblN0YWxlR2V0ID0gISFub0RlbGV0ZU9uU3RhbGVHZXQ7XG4gICAgICAgIHRoaXMudXBkYXRlQWdlT25HZXQgPSAhIXVwZGF0ZUFnZU9uR2V0O1xuICAgICAgICB0aGlzLnVwZGF0ZUFnZU9uSGFzID0gISF1cGRhdGVBZ2VPbkhhcztcbiAgICAgICAgdGhpcy50dGxSZXNvbHV0aW9uID1cbiAgICAgICAgICAgIGlzUG9zSW50KHR0bFJlc29sdXRpb24pIHx8IHR0bFJlc29sdXRpb24gPT09IDBcbiAgICAgICAgICAgICAgICA/IHR0bFJlc29sdXRpb25cbiAgICAgICAgICAgICAgICA6IDE7XG4gICAgICAgIHRoaXMudHRsQXV0b3B1cmdlID0gISF0dGxBdXRvcHVyZ2U7XG4gICAgICAgIHRoaXMudHRsID0gdHRsIHx8IDA7XG4gICAgICAgIGlmICh0aGlzLnR0bCkge1xuICAgICAgICAgICAgaWYgKCFpc1Bvc0ludCh0aGlzLnR0bCkpIHtcbiAgICAgICAgICAgICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCd0dGwgbXVzdCBiZSBhIHBvc2l0aXZlIGludGVnZXIgaWYgc3BlY2lmaWVkJyk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICB0aGlzLiNpbml0aWFsaXplVFRMVHJhY2tpbmcoKTtcbiAgICAgICAgfVxuICAgICAgICAvLyBkbyBub3QgYWxsb3cgY29tcGxldGVseSB1bmJvdW5kZWQgY2FjaGVzXG4gICAgICAgIGlmICh0aGlzLiNtYXggPT09IDAgJiYgdGhpcy50dGwgPT09IDAgJiYgdGhpcy4jbWF4U2l6ZSA9PT0gMCkge1xuICAgICAgICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcignQXQgbGVhc3Qgb25lIG9mIG1heCwgbWF4U2l6ZSwgb3IgdHRsIGlzIHJlcXVpcmVkJyk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKCF0aGlzLnR0bEF1dG9wdXJnZSAmJiAhdGhpcy4jbWF4ICYmICF0aGlzLiNtYXhTaXplKSB7XG4gICAgICAgICAgICBjb25zdCBjb2RlID0gJ0xSVV9DQUNIRV9VTkJPVU5ERUQnO1xuICAgICAgICAgICAgaWYgKHNob3VsZFdhcm4oY29kZSkpIHtcbiAgICAgICAgICAgICAgICB3YXJuZWQuYWRkKGNvZGUpO1xuICAgICAgICAgICAgICAgIGNvbnN0IG1zZyA9ICdUVEwgY2FjaGluZyB3aXRob3V0IHR0bEF1dG9wdXJnZSwgbWF4LCBvciBtYXhTaXplIGNhbiAnICtcbiAgICAgICAgICAgICAgICAgICAgJ3Jlc3VsdCBpbiB1bmJvdW5kZWQgbWVtb3J5IGNvbnN1bXB0aW9uLic7XG4gICAgICAgICAgICAgICAgZW1pdFdhcm5pbmcobXNnLCAnVW5ib3VuZGVkQ2FjaGVXYXJuaW5nJywgY29kZSwgTFJVQ2FjaGUpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxuICAgIC8qKlxuICAgICAqIFJldHVybiB0aGUgbnVtYmVyIG9mIG1zIGxlZnQgaW4gdGhlIGl0ZW0ncyBUVEwuIElmIGl0ZW0gaXMgbm90IGluIGNhY2hlLFxuICAgICAqIHJldHVybnMgYDBgLiBSZXR1cm5zIGBJbmZpbml0eWAgaWYgaXRlbSBpcyBpbiBjYWNoZSB3aXRob3V0IGEgZGVmaW5lZCBUVEwuXG4gICAgICovXG4gICAgZ2V0UmVtYWluaW5nVFRMKGtleSkge1xuICAgICAgICByZXR1cm4gdGhpcy4ja2V5TWFwLmhhcyhrZXkpID8gSW5maW5pdHkgOiAwO1xuICAgIH1cbiAgICAjaW5pdGlhbGl6ZVRUTFRyYWNraW5nKCkge1xuICAgICAgICBjb25zdCB0dGxzID0gbmV3IFplcm9BcnJheSh0aGlzLiNtYXgpO1xuICAgICAgICBjb25zdCBzdGFydHMgPSBuZXcgWmVyb0FycmF5KHRoaXMuI21heCk7XG4gICAgICAgIHRoaXMuI3R0bHMgPSB0dGxzO1xuICAgICAgICB0aGlzLiNzdGFydHMgPSBzdGFydHM7XG4gICAgICAgIHRoaXMuI3NldEl0ZW1UVEwgPSAoaW5kZXgsIHR0bCwgc3RhcnQgPSBwZXJmLm5vdygpKSA9PiB7XG4gICAgICAgICAgICBzdGFydHNbaW5kZXhdID0gdHRsICE9PSAwID8gc3RhcnQgOiAwO1xuICAgICAgICAgICAgdHRsc1tpbmRleF0gPSB0dGw7XG4gICAgICAgICAgICBpZiAodHRsICE9PSAwICYmIHRoaXMudHRsQXV0b3B1cmdlKSB7XG4gICAgICAgICAgICAgICAgY29uc3QgdCA9IHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgICAgICAgICAgICAgICBpZiAodGhpcy4jaXNTdGFsZShpbmRleCkpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuI2RlbGV0ZSh0aGlzLiNrZXlMaXN0W2luZGV4XSwgJ2V4cGlyZScpO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfSwgdHRsICsgMSk7XG4gICAgICAgICAgICAgICAgLy8gdW5yZWYoKSBub3Qgc3VwcG9ydGVkIG9uIGFsbCBwbGF0Zm9ybXNcbiAgICAgICAgICAgICAgICAvKiBjOCBpZ25vcmUgc3RhcnQgKi9cbiAgICAgICAgICAgICAgICBpZiAodC51bnJlZikge1xuICAgICAgICAgICAgICAgICAgICB0LnVucmVmKCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIC8qIGM4IGlnbm9yZSBzdG9wICovXG4gICAgICAgICAgICB9XG4gICAgICAgIH07XG4gICAgICAgIHRoaXMuI3VwZGF0ZUl0ZW1BZ2UgPSBpbmRleCA9PiB7XG4gICAgICAgICAgICBzdGFydHNbaW5kZXhdID0gdHRsc1tpbmRleF0gIT09IDAgPyBwZXJmLm5vdygpIDogMDtcbiAgICAgICAgfTtcbiAgICAgICAgdGhpcy4jc3RhdHVzVFRMID0gKHN0YXR1cywgaW5kZXgpID0+IHtcbiAgICAgICAgICAgIGlmICh0dGxzW2luZGV4XSkge1xuICAgICAgICAgICAgICAgIGNvbnN0IHR0bCA9IHR0bHNbaW5kZXhdO1xuICAgICAgICAgICAgICAgIGNvbnN0IHN0YXJ0ID0gc3RhcnRzW2luZGV4XTtcbiAgICAgICAgICAgICAgICAvKiBjOCBpZ25vcmUgbmV4dCAqL1xuICAgICAgICAgICAgICAgIGlmICghdHRsIHx8ICFzdGFydClcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgICAgIHN0YXR1cy50dGwgPSB0dGw7XG4gICAgICAgICAgICAgICAgc3RhdHVzLnN0YXJ0ID0gc3RhcnQ7XG4gICAgICAgICAgICAgICAgc3RhdHVzLm5vdyA9IGNhY2hlZE5vdyB8fCBnZXROb3coKTtcbiAgICAgICAgICAgICAgICBjb25zdCBhZ2UgPSBzdGF0dXMubm93IC0gc3RhcnQ7XG4gICAgICAgICAgICAgICAgc3RhdHVzLnJlbWFpbmluZ1RUTCA9IHR0bCAtIGFnZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfTtcbiAgICAgICAgLy8gZGVib3VuY2UgY2FsbHMgdG8gcGVyZi5ub3coKSB0byAxcyBzbyB3ZSdyZSBub3QgaGl0dGluZ1xuICAgICAgICAvLyB0aGF0IGNvc3RseSBjYWxsIHJlcGVhdGVkbHkuXG4gICAgICAgIGxldCBjYWNoZWROb3cgPSAwO1xuICAgICAgICBjb25zdCBnZXROb3cgPSAoKSA9PiB7XG4gICAgICAgICAgICBjb25zdCBuID0gcGVyZi5ub3coKTtcbiAgICAgICAgICAgIGlmICh0aGlzLnR0bFJlc29sdXRpb24gPiAwKSB7XG4gICAgICAgICAgICAgICAgY2FjaGVkTm93ID0gbjtcbiAgICAgICAgICAgICAgICBjb25zdCB0ID0gc2V0VGltZW91dCgoKSA9PiAoY2FjaGVkTm93ID0gMCksIHRoaXMudHRsUmVzb2x1dGlvbik7XG4gICAgICAgICAgICAgICAgLy8gbm90IGF2YWlsYWJsZSBvbiBhbGwgcGxhdGZvcm1zXG4gICAgICAgICAgICAgICAgLyogYzggaWdub3JlIHN0YXJ0ICovXG4gICAgICAgICAgICAgICAgaWYgKHQudW5yZWYpIHtcbiAgICAgICAgICAgICAgICAgICAgdC51bnJlZigpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAvKiBjOCBpZ25vcmUgc3RvcCAqL1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIG47XG4gICAgICAgIH07XG4gICAgICAgIHRoaXMuZ2V0UmVtYWluaW5nVFRMID0ga2V5ID0+IHtcbiAgICAgICAgICAgIGNvbnN0IGluZGV4ID0gdGhpcy4ja2V5TWFwLmdldChrZXkpO1xuICAgICAgICAgICAgaWYgKGluZGV4ID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gMDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGNvbnN0IHR0bCA9IHR0bHNbaW5kZXhdO1xuICAgICAgICAgICAgY29uc3Qgc3RhcnQgPSBzdGFydHNbaW5kZXhdO1xuICAgICAgICAgICAgaWYgKCF0dGwgfHwgIXN0YXJ0KSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIEluZmluaXR5O1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgY29uc3QgYWdlID0gKGNhY2hlZE5vdyB8fCBnZXROb3coKSkgLSBzdGFydDtcbiAgICAgICAgICAgIHJldHVybiB0dGwgLSBhZ2U7XG4gICAgICAgIH07XG4gICAgICAgIHRoaXMuI2lzU3RhbGUgPSBpbmRleCA9PiB7XG4gICAgICAgICAgICBjb25zdCBzID0gc3RhcnRzW2luZGV4XTtcbiAgICAgICAgICAgIGNvbnN0IHQgPSB0dGxzW2luZGV4XTtcbiAgICAgICAgICAgIHJldHVybiAhIXQgJiYgISFzICYmIChjYWNoZWROb3cgfHwgZ2V0Tm93KCkpIC0gcyA+IHQ7XG4gICAgICAgIH07XG4gICAgfVxuICAgIC8vIGNvbmRpdGlvbmFsbHkgc2V0IHByaXZhdGUgbWV0aG9kcyByZWxhdGVkIHRvIFRUTFxuICAgICN1cGRhdGVJdGVtQWdlID0gKCkgPT4geyB9O1xuICAgICNzdGF0dXNUVEwgPSAoKSA9PiB7IH07XG4gICAgI3NldEl0ZW1UVEwgPSAoKSA9PiB7IH07XG4gICAgLyogYzggaWdub3JlIHN0b3AgKi9cbiAgICAjaXNTdGFsZSA9ICgpID0+IGZhbHNlO1xuICAgICNpbml0aWFsaXplU2l6ZVRyYWNraW5nKCkge1xuICAgICAgICBjb25zdCBzaXplcyA9IG5ldyBaZXJvQXJyYXkodGhpcy4jbWF4KTtcbiAgICAgICAgdGhpcy4jY2FsY3VsYXRlZFNpemUgPSAwO1xuICAgICAgICB0aGlzLiNzaXplcyA9IHNpemVzO1xuICAgICAgICB0aGlzLiNyZW1vdmVJdGVtU2l6ZSA9IGluZGV4ID0+IHtcbiAgICAgICAgICAgIHRoaXMuI2NhbGN1bGF0ZWRTaXplIC09IHNpemVzW2luZGV4XTtcbiAgICAgICAgICAgIHNpemVzW2luZGV4XSA9IDA7XG4gICAgICAgIH07XG4gICAgICAgIHRoaXMuI3JlcXVpcmVTaXplID0gKGssIHYsIHNpemUsIHNpemVDYWxjdWxhdGlvbikgPT4ge1xuICAgICAgICAgICAgLy8gcHJvdmlzaW9uYWxseSBhY2NlcHQgYmFja2dyb3VuZCBmZXRjaGVzLlxuICAgICAgICAgICAgLy8gYWN0dWFsIHZhbHVlIHNpemUgd2lsbCBiZSBjaGVja2VkIHdoZW4gdGhleSByZXR1cm4uXG4gICAgICAgICAgICBpZiAodGhpcy4jaXNCYWNrZ3JvdW5kRmV0Y2godikpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gMDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmICghaXNQb3NJbnQoc2l6ZSkpIHtcbiAgICAgICAgICAgICAgICBpZiAoc2l6ZUNhbGN1bGF0aW9uKSB7XG4gICAgICAgICAgICAgICAgICAgIGlmICh0eXBlb2Ygc2l6ZUNhbGN1bGF0aW9uICE9PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCdzaXplQ2FsY3VsYXRpb24gbXVzdCBiZSBhIGZ1bmN0aW9uJyk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgc2l6ZSA9IHNpemVDYWxjdWxhdGlvbih2LCBrKTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKCFpc1Bvc0ludChzaXplKSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcignc2l6ZUNhbGN1bGF0aW9uIHJldHVybiBpbnZhbGlkIChleHBlY3QgcG9zaXRpdmUgaW50ZWdlciknKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcignaW52YWxpZCBzaXplIHZhbHVlIChtdXN0IGJlIHBvc2l0aXZlIGludGVnZXIpLiAnICtcbiAgICAgICAgICAgICAgICAgICAgICAgICdXaGVuIG1heFNpemUgb3IgbWF4RW50cnlTaXplIGlzIHVzZWQsIHNpemVDYWxjdWxhdGlvbiAnICtcbiAgICAgICAgICAgICAgICAgICAgICAgICdvciBzaXplIG11c3QgYmUgc2V0LicpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiBzaXplO1xuICAgICAgICB9O1xuICAgICAgICB0aGlzLiNhZGRJdGVtU2l6ZSA9IChpbmRleCwgc2l6ZSwgc3RhdHVzKSA9PiB7XG4gICAgICAgICAgICBzaXplc1tpbmRleF0gPSBzaXplO1xuICAgICAgICAgICAgaWYgKHRoaXMuI21heFNpemUpIHtcbiAgICAgICAgICAgICAgICBjb25zdCBtYXhTaXplID0gdGhpcy4jbWF4U2l6ZSAtIHNpemVzW2luZGV4XTtcbiAgICAgICAgICAgICAgICB3aGlsZSAodGhpcy4jY2FsY3VsYXRlZFNpemUgPiBtYXhTaXplKSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuI2V2aWN0KHRydWUpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHRoaXMuI2NhbGN1bGF0ZWRTaXplICs9IHNpemVzW2luZGV4XTtcbiAgICAgICAgICAgIGlmIChzdGF0dXMpIHtcbiAgICAgICAgICAgICAgICBzdGF0dXMuZW50cnlTaXplID0gc2l6ZTtcbiAgICAgICAgICAgICAgICBzdGF0dXMudG90YWxDYWxjdWxhdGVkU2l6ZSA9IHRoaXMuI2NhbGN1bGF0ZWRTaXplO1xuICAgICAgICAgICAgfVxuICAgICAgICB9O1xuICAgIH1cbiAgICAjcmVtb3ZlSXRlbVNpemUgPSBfaSA9PiB7IH07XG4gICAgI2FkZEl0ZW1TaXplID0gKF9pLCBfcywgX3N0KSA9PiB7IH07XG4gICAgI3JlcXVpcmVTaXplID0gKF9rLCBfdiwgc2l6ZSwgc2l6ZUNhbGN1bGF0aW9uKSA9PiB7XG4gICAgICAgIGlmIChzaXplIHx8IHNpemVDYWxjdWxhdGlvbikge1xuICAgICAgICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcignY2Fubm90IHNldCBzaXplIHdpdGhvdXQgc2V0dGluZyBtYXhTaXplIG9yIG1heEVudHJ5U2l6ZSBvbiBjYWNoZScpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiAwO1xuICAgIH07XG4gICAgKiNpbmRleGVzKHsgYWxsb3dTdGFsZSA9IHRoaXMuYWxsb3dTdGFsZSB9ID0ge30pIHtcbiAgICAgICAgaWYgKHRoaXMuI3NpemUpIHtcbiAgICAgICAgICAgIGZvciAobGV0IGkgPSB0aGlzLiN0YWlsOyB0cnVlOykge1xuICAgICAgICAgICAgICAgIGlmICghdGhpcy4jaXNWYWxpZEluZGV4KGkpKSB7XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBpZiAoYWxsb3dTdGFsZSB8fCAhdGhpcy4jaXNTdGFsZShpKSkge1xuICAgICAgICAgICAgICAgICAgICB5aWVsZCBpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBpZiAoaSA9PT0gdGhpcy4jaGVhZCkge1xuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIGkgPSB0aGlzLiNwcmV2W2ldO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cbiAgICAqI3JpbmRleGVzKHsgYWxsb3dTdGFsZSA9IHRoaXMuYWxsb3dTdGFsZSB9ID0ge30pIHtcbiAgICAgICAgaWYgKHRoaXMuI3NpemUpIHtcbiAgICAgICAgICAgIGZvciAobGV0IGkgPSB0aGlzLiNoZWFkOyB0cnVlOykge1xuICAgICAgICAgICAgICAgIGlmICghdGhpcy4jaXNWYWxpZEluZGV4KGkpKSB7XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBpZiAoYWxsb3dTdGFsZSB8fCAhdGhpcy4jaXNTdGFsZShpKSkge1xuICAgICAgICAgICAgICAgICAgICB5aWVsZCBpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBpZiAoaSA9PT0gdGhpcy4jdGFpbCkge1xuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIGkgPSB0aGlzLiNuZXh0W2ldO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cbiAgICAjaXNWYWxpZEluZGV4KGluZGV4KSB7XG4gICAgICAgIHJldHVybiAoaW5kZXggIT09IHVuZGVmaW5lZCAmJlxuICAgICAgICAgICAgdGhpcy4ja2V5TWFwLmdldCh0aGlzLiNrZXlMaXN0W2luZGV4XSkgPT09IGluZGV4KTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogUmV0dXJuIGEgZ2VuZXJhdG9yIHlpZWxkaW5nIGBba2V5LCB2YWx1ZV1gIHBhaXJzLFxuICAgICAqIGluIG9yZGVyIGZyb20gbW9zdCByZWNlbnRseSB1c2VkIHRvIGxlYXN0IHJlY2VudGx5IHVzZWQuXG4gICAgICovXG4gICAgKmVudHJpZXMoKSB7XG4gICAgICAgIGZvciAoY29uc3QgaSBvZiB0aGlzLiNpbmRleGVzKCkpIHtcbiAgICAgICAgICAgIGlmICh0aGlzLiN2YWxMaXN0W2ldICE9PSB1bmRlZmluZWQgJiZcbiAgICAgICAgICAgICAgICB0aGlzLiNrZXlMaXN0W2ldICE9PSB1bmRlZmluZWQgJiZcbiAgICAgICAgICAgICAgICAhdGhpcy4jaXNCYWNrZ3JvdW5kRmV0Y2godGhpcy4jdmFsTGlzdFtpXSkpIHtcbiAgICAgICAgICAgICAgICB5aWVsZCBbdGhpcy4ja2V5TGlzdFtpXSwgdGhpcy4jdmFsTGlzdFtpXV07XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG4gICAgLyoqXG4gICAgICogSW52ZXJzZSBvcmRlciB2ZXJzaW9uIG9mIHtAbGluayBMUlVDYWNoZS5lbnRyaWVzfVxuICAgICAqXG4gICAgICogUmV0dXJuIGEgZ2VuZXJhdG9yIHlpZWxkaW5nIGBba2V5LCB2YWx1ZV1gIHBhaXJzLFxuICAgICAqIGluIG9yZGVyIGZyb20gbGVhc3QgcmVjZW50bHkgdXNlZCB0byBtb3N0IHJlY2VudGx5IHVzZWQuXG4gICAgICovXG4gICAgKnJlbnRyaWVzKCkge1xuICAgICAgICBmb3IgKGNvbnN0IGkgb2YgdGhpcy4jcmluZGV4ZXMoKSkge1xuICAgICAgICAgICAgaWYgKHRoaXMuI3ZhbExpc3RbaV0gIT09IHVuZGVmaW5lZCAmJlxuICAgICAgICAgICAgICAgIHRoaXMuI2tleUxpc3RbaV0gIT09IHVuZGVmaW5lZCAmJlxuICAgICAgICAgICAgICAgICF0aGlzLiNpc0JhY2tncm91bmRGZXRjaCh0aGlzLiN2YWxMaXN0W2ldKSkge1xuICAgICAgICAgICAgICAgIHlpZWxkIFt0aGlzLiNrZXlMaXN0W2ldLCB0aGlzLiN2YWxMaXN0W2ldXTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cbiAgICAvKipcbiAgICAgKiBSZXR1cm4gYSBnZW5lcmF0b3IgeWllbGRpbmcgdGhlIGtleXMgaW4gdGhlIGNhY2hlLFxuICAgICAqIGluIG9yZGVyIGZyb20gbW9zdCByZWNlbnRseSB1c2VkIHRvIGxlYXN0IHJlY2VudGx5IHVzZWQuXG4gICAgICovXG4gICAgKmtleXMoKSB7XG4gICAgICAgIGZvciAoY29uc3QgaSBvZiB0aGlzLiNpbmRleGVzKCkpIHtcbiAgICAgICAgICAgIGNvbnN0IGsgPSB0aGlzLiNrZXlMaXN0W2ldO1xuICAgICAgICAgICAgaWYgKGsgIT09IHVuZGVmaW5lZCAmJlxuICAgICAgICAgICAgICAgICF0aGlzLiNpc0JhY2tncm91bmRGZXRjaCh0aGlzLiN2YWxMaXN0W2ldKSkge1xuICAgICAgICAgICAgICAgIHlpZWxkIGs7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG4gICAgLyoqXG4gICAgICogSW52ZXJzZSBvcmRlciB2ZXJzaW9uIG9mIHtAbGluayBMUlVDYWNoZS5rZXlzfVxuICAgICAqXG4gICAgICogUmV0dXJuIGEgZ2VuZXJhdG9yIHlpZWxkaW5nIHRoZSBrZXlzIGluIHRoZSBjYWNoZSxcbiAgICAgKiBpbiBvcmRlciBmcm9tIGxlYXN0IHJlY2VudGx5IHVzZWQgdG8gbW9zdCByZWNlbnRseSB1c2VkLlxuICAgICAqL1xuICAgICpya2V5cygpIHtcbiAgICAgICAgZm9yIChjb25zdCBpIG9mIHRoaXMuI3JpbmRleGVzKCkpIHtcbiAgICAgICAgICAgIGNvbnN0IGsgPSB0aGlzLiNrZXlMaXN0W2ldO1xuICAgICAgICAgICAgaWYgKGsgIT09IHVuZGVmaW5lZCAmJlxuICAgICAgICAgICAgICAgICF0aGlzLiNpc0JhY2tncm91bmRGZXRjaCh0aGlzLiN2YWxMaXN0W2ldKSkge1xuICAgICAgICAgICAgICAgIHlpZWxkIGs7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG4gICAgLyoqXG4gICAgICogUmV0dXJuIGEgZ2VuZXJhdG9yIHlpZWxkaW5nIHRoZSB2YWx1ZXMgaW4gdGhlIGNhY2hlLFxuICAgICAqIGluIG9yZGVyIGZyb20gbW9zdCByZWNlbnRseSB1c2VkIHRvIGxlYXN0IHJlY2VudGx5IHVzZWQuXG4gICAgICovXG4gICAgKnZhbHVlcygpIHtcbiAgICAgICAgZm9yIChjb25zdCBpIG9mIHRoaXMuI2luZGV4ZXMoKSkge1xuICAgICAgICAgICAgY29uc3QgdiA9IHRoaXMuI3ZhbExpc3RbaV07XG4gICAgICAgICAgICBpZiAodiAhPT0gdW5kZWZpbmVkICYmXG4gICAgICAgICAgICAgICAgIXRoaXMuI2lzQmFja2dyb3VuZEZldGNoKHRoaXMuI3ZhbExpc3RbaV0pKSB7XG4gICAgICAgICAgICAgICAgeWllbGQgdGhpcy4jdmFsTGlzdFtpXTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cbiAgICAvKipcbiAgICAgKiBJbnZlcnNlIG9yZGVyIHZlcnNpb24gb2Yge0BsaW5rIExSVUNhY2hlLnZhbHVlc31cbiAgICAgKlxuICAgICAqIFJldHVybiBhIGdlbmVyYXRvciB5aWVsZGluZyB0aGUgdmFsdWVzIGluIHRoZSBjYWNoZSxcbiAgICAgKiBpbiBvcmRlciBmcm9tIGxlYXN0IHJlY2VudGx5IHVzZWQgdG8gbW9zdCByZWNlbnRseSB1c2VkLlxuICAgICAqL1xuICAgICpydmFsdWVzKCkge1xuICAgICAgICBmb3IgKGNvbnN0IGkgb2YgdGhpcy4jcmluZGV4ZXMoKSkge1xuICAgICAgICAgICAgY29uc3QgdiA9IHRoaXMuI3ZhbExpc3RbaV07XG4gICAgICAgICAgICBpZiAodiAhPT0gdW5kZWZpbmVkICYmXG4gICAgICAgICAgICAgICAgIXRoaXMuI2lzQmFja2dyb3VuZEZldGNoKHRoaXMuI3ZhbExpc3RbaV0pKSB7XG4gICAgICAgICAgICAgICAgeWllbGQgdGhpcy4jdmFsTGlzdFtpXTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cbiAgICAvKipcbiAgICAgKiBJdGVyYXRpbmcgb3ZlciB0aGUgY2FjaGUgaXRzZWxmIHlpZWxkcyB0aGUgc2FtZSByZXN1bHRzIGFzXG4gICAgICoge0BsaW5rIExSVUNhY2hlLmVudHJpZXN9XG4gICAgICovXG4gICAgW1N5bWJvbC5pdGVyYXRvcl0oKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmVudHJpZXMoKTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogQSBTdHJpbmcgdmFsdWUgdGhhdCBpcyB1c2VkIGluIHRoZSBjcmVhdGlvbiBvZiB0aGUgZGVmYXVsdCBzdHJpbmdcbiAgICAgKiBkZXNjcmlwdGlvbiBvZiBhbiBvYmplY3QuIENhbGxlZCBieSB0aGUgYnVpbHQtaW4gbWV0aG9kXG4gICAgICogYE9iamVjdC5wcm90b3R5cGUudG9TdHJpbmdgLlxuICAgICAqL1xuICAgIFtTeW1ib2wudG9TdHJpbmdUYWddID0gJ0xSVUNhY2hlJztcbiAgICAvKipcbiAgICAgKiBGaW5kIGEgdmFsdWUgZm9yIHdoaWNoIHRoZSBzdXBwbGllZCBmbiBtZXRob2QgcmV0dXJucyBhIHRydXRoeSB2YWx1ZSxcbiAgICAgKiBzaW1pbGFyIHRvIGBBcnJheS5maW5kKClgLiBmbiBpcyBjYWxsZWQgYXMgYGZuKHZhbHVlLCBrZXksIGNhY2hlKWAuXG4gICAgICovXG4gICAgZmluZChmbiwgZ2V0T3B0aW9ucyA9IHt9KSB7XG4gICAgICAgIGZvciAoY29uc3QgaSBvZiB0aGlzLiNpbmRleGVzKCkpIHtcbiAgICAgICAgICAgIGNvbnN0IHYgPSB0aGlzLiN2YWxMaXN0W2ldO1xuICAgICAgICAgICAgY29uc3QgdmFsdWUgPSB0aGlzLiNpc0JhY2tncm91bmRGZXRjaCh2KVxuICAgICAgICAgICAgICAgID8gdi5fX3N0YWxlV2hpbGVGZXRjaGluZ1xuICAgICAgICAgICAgICAgIDogdjtcbiAgICAgICAgICAgIGlmICh2YWx1ZSA9PT0gdW5kZWZpbmVkKVxuICAgICAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgICAgaWYgKGZuKHZhbHVlLCB0aGlzLiNrZXlMaXN0W2ldLCB0aGlzKSkge1xuICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLmdldCh0aGlzLiNrZXlMaXN0W2ldLCBnZXRPcHRpb25zKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cbiAgICAvKipcbiAgICAgKiBDYWxsIHRoZSBzdXBwbGllZCBmdW5jdGlvbiBvbiBlYWNoIGl0ZW0gaW4gdGhlIGNhY2hlLCBpbiBvcmRlciBmcm9tIG1vc3RcbiAgICAgKiByZWNlbnRseSB1c2VkIHRvIGxlYXN0IHJlY2VudGx5IHVzZWQuXG4gICAgICpcbiAgICAgKiBgZm5gIGlzIGNhbGxlZCBhcyBgZm4odmFsdWUsIGtleSwgY2FjaGUpYC5cbiAgICAgKlxuICAgICAqIElmIGB0aGlzcGAgaXMgcHJvdmlkZWQsIGZ1bmN0aW9uIHdpbGwgYmUgY2FsbGVkIGluIHRoZSBgdGhpc2AtY29udGV4dCBvZlxuICAgICAqIHRoZSBwcm92aWRlZCBvYmplY3QsIG9yIHRoZSBjYWNoZSBpZiBubyBgdGhpc3BgIG9iamVjdCBpcyBwcm92aWRlZC5cbiAgICAgKlxuICAgICAqIERvZXMgbm90IHVwZGF0ZSBhZ2Ugb3IgcmVjZW50eSBvZiB1c2UsIG9yIGl0ZXJhdGUgb3ZlciBzdGFsZSB2YWx1ZXMuXG4gICAgICovXG4gICAgZm9yRWFjaChmbiwgdGhpc3AgPSB0aGlzKSB7XG4gICAgICAgIGZvciAoY29uc3QgaSBvZiB0aGlzLiNpbmRleGVzKCkpIHtcbiAgICAgICAgICAgIGNvbnN0IHYgPSB0aGlzLiN2YWxMaXN0W2ldO1xuICAgICAgICAgICAgY29uc3QgdmFsdWUgPSB0aGlzLiNpc0JhY2tncm91bmRGZXRjaCh2KVxuICAgICAgICAgICAgICAgID8gdi5fX3N0YWxlV2hpbGVGZXRjaGluZ1xuICAgICAgICAgICAgICAgIDogdjtcbiAgICAgICAgICAgIGlmICh2YWx1ZSA9PT0gdW5kZWZpbmVkKVxuICAgICAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgICAgZm4uY2FsbCh0aGlzcCwgdmFsdWUsIHRoaXMuI2tleUxpc3RbaV0sIHRoaXMpO1xuICAgICAgICB9XG4gICAgfVxuICAgIC8qKlxuICAgICAqIFRoZSBzYW1lIGFzIHtAbGluayBMUlVDYWNoZS5mb3JFYWNofSBidXQgaXRlbXMgYXJlIGl0ZXJhdGVkIG92ZXIgaW5cbiAgICAgKiByZXZlcnNlIG9yZGVyLiAgKGllLCBsZXNzIHJlY2VudGx5IHVzZWQgaXRlbXMgYXJlIGl0ZXJhdGVkIG92ZXIgZmlyc3QuKVxuICAgICAqL1xuICAgIHJmb3JFYWNoKGZuLCB0aGlzcCA9IHRoaXMpIHtcbiAgICAgICAgZm9yIChjb25zdCBpIG9mIHRoaXMuI3JpbmRleGVzKCkpIHtcbiAgICAgICAgICAgIGNvbnN0IHYgPSB0aGlzLiN2YWxMaXN0W2ldO1xuICAgICAgICAgICAgY29uc3QgdmFsdWUgPSB0aGlzLiNpc0JhY2tncm91bmRGZXRjaCh2KVxuICAgICAgICAgICAgICAgID8gdi5fX3N0YWxlV2hpbGVGZXRjaGluZ1xuICAgICAgICAgICAgICAgIDogdjtcbiAgICAgICAgICAgIGlmICh2YWx1ZSA9PT0gdW5kZWZpbmVkKVxuICAgICAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgICAgZm4uY2FsbCh0aGlzcCwgdmFsdWUsIHRoaXMuI2tleUxpc3RbaV0sIHRoaXMpO1xuICAgICAgICB9XG4gICAgfVxuICAgIC8qKlxuICAgICAqIERlbGV0ZSBhbnkgc3RhbGUgZW50cmllcy4gUmV0dXJucyB0cnVlIGlmIGFueXRoaW5nIHdhcyByZW1vdmVkLFxuICAgICAqIGZhbHNlIG90aGVyd2lzZS5cbiAgICAgKi9cbiAgICBwdXJnZVN0YWxlKCkge1xuICAgICAgICBsZXQgZGVsZXRlZCA9IGZhbHNlO1xuICAgICAgICBmb3IgKGNvbnN0IGkgb2YgdGhpcy4jcmluZGV4ZXMoeyBhbGxvd1N0YWxlOiB0cnVlIH0pKSB7XG4gICAgICAgICAgICBpZiAodGhpcy4jaXNTdGFsZShpKSkge1xuICAgICAgICAgICAgICAgIHRoaXMuI2RlbGV0ZSh0aGlzLiNrZXlMaXN0W2ldLCAnZXhwaXJlJyk7XG4gICAgICAgICAgICAgICAgZGVsZXRlZCA9IHRydWU7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGRlbGV0ZWQ7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIEdldCB0aGUgZXh0ZW5kZWQgaW5mbyBhYm91dCBhIGdpdmVuIGVudHJ5LCB0byBnZXQgaXRzIHZhbHVlLCBzaXplLCBhbmRcbiAgICAgKiBUVEwgaW5mbyBzaW11bHRhbmVvdXNseS4gUmV0dXJucyBgdW5kZWZpbmVkYCBpZiB0aGUga2V5IGlzIG5vdCBwcmVzZW50LlxuICAgICAqXG4gICAgICogVW5saWtlIHtAbGluayBMUlVDYWNoZSNkdW1wfSwgd2hpY2ggaXMgZGVzaWduZWQgdG8gYmUgcG9ydGFibGUgYW5kIHN1cnZpdmVcbiAgICAgKiBzZXJpYWxpemF0aW9uLCB0aGUgYHN0YXJ0YCB2YWx1ZSBpcyBhbHdheXMgdGhlIGN1cnJlbnQgdGltZXN0YW1wLCBhbmQgdGhlXG4gICAgICogYHR0bGAgaXMgYSBjYWxjdWxhdGVkIHJlbWFpbmluZyB0aW1lIHRvIGxpdmUgKG5lZ2F0aXZlIGlmIGV4cGlyZWQpLlxuICAgICAqXG4gICAgICogQWx3YXlzIHJldHVybnMgc3RhbGUgdmFsdWVzLCBpZiB0aGVpciBpbmZvIGlzIGZvdW5kIGluIHRoZSBjYWNoZSwgc28gYmVcbiAgICAgKiBzdXJlIHRvIGNoZWNrIGZvciBleHBpcmF0aW9ucyAoaWUsIGEgbmVnYXRpdmUge0BsaW5rIExSVUNhY2hlLkVudHJ5I3R0bH0pXG4gICAgICogaWYgcmVsZXZhbnQuXG4gICAgICovXG4gICAgaW5mbyhrZXkpIHtcbiAgICAgICAgY29uc3QgaSA9IHRoaXMuI2tleU1hcC5nZXQoa2V5KTtcbiAgICAgICAgaWYgKGkgPT09IHVuZGVmaW5lZClcbiAgICAgICAgICAgIHJldHVybiB1bmRlZmluZWQ7XG4gICAgICAgIGNvbnN0IHYgPSB0aGlzLiN2YWxMaXN0W2ldO1xuICAgICAgICBjb25zdCB2YWx1ZSA9IHRoaXMuI2lzQmFja2dyb3VuZEZldGNoKHYpXG4gICAgICAgICAgICA/IHYuX19zdGFsZVdoaWxlRmV0Y2hpbmdcbiAgICAgICAgICAgIDogdjtcbiAgICAgICAgaWYgKHZhbHVlID09PSB1bmRlZmluZWQpXG4gICAgICAgICAgICByZXR1cm4gdW5kZWZpbmVkO1xuICAgICAgICBjb25zdCBlbnRyeSA9IHsgdmFsdWUgfTtcbiAgICAgICAgaWYgKHRoaXMuI3R0bHMgJiYgdGhpcy4jc3RhcnRzKSB7XG4gICAgICAgICAgICBjb25zdCB0dGwgPSB0aGlzLiN0dGxzW2ldO1xuICAgICAgICAgICAgY29uc3Qgc3RhcnQgPSB0aGlzLiNzdGFydHNbaV07XG4gICAgICAgICAgICBpZiAodHRsICYmIHN0YXJ0KSB7XG4gICAgICAgICAgICAgICAgY29uc3QgcmVtYWluID0gdHRsIC0gKHBlcmYubm93KCkgLSBzdGFydCk7XG4gICAgICAgICAgICAgICAgZW50cnkudHRsID0gcmVtYWluO1xuICAgICAgICAgICAgICAgIGVudHJ5LnN0YXJ0ID0gRGF0ZS5ub3coKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBpZiAodGhpcy4jc2l6ZXMpIHtcbiAgICAgICAgICAgIGVudHJ5LnNpemUgPSB0aGlzLiNzaXplc1tpXTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gZW50cnk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIFJldHVybiBhbiBhcnJheSBvZiBba2V5LCB7QGxpbmsgTFJVQ2FjaGUuRW50cnl9XSB0dXBsZXMgd2hpY2ggY2FuIGJlXG4gICAgICogcGFzc2VkIHRvIHtAbGluayBMUkxVQ2FjaGUjbG9hZH0uXG4gICAgICpcbiAgICAgKiBUaGUgYHN0YXJ0YCBmaWVsZHMgYXJlIGNhbGN1bGF0ZWQgcmVsYXRpdmUgdG8gYSBwb3J0YWJsZSBgRGF0ZS5ub3coKWBcbiAgICAgKiB0aW1lc3RhbXAsIGV2ZW4gaWYgYHBlcmZvcm1hbmNlLm5vdygpYCBpcyBhdmFpbGFibGUuXG4gICAgICpcbiAgICAgKiBTdGFsZSBlbnRyaWVzIGFyZSBhbHdheXMgaW5jbHVkZWQgaW4gdGhlIGBkdW1wYCwgZXZlbiBpZlxuICAgICAqIHtAbGluayBMUlVDYWNoZS5PcHRpb25zQmFzZS5hbGxvd1N0YWxlfSBpcyBmYWxzZS5cbiAgICAgKlxuICAgICAqIE5vdGU6IHRoaXMgcmV0dXJucyBhbiBhY3R1YWwgYXJyYXksIG5vdCBhIGdlbmVyYXRvciwgc28gaXQgY2FuIGJlIG1vcmVcbiAgICAgKiBlYXNpbHkgcGFzc2VkIGFyb3VuZC5cbiAgICAgKi9cbiAgICBkdW1wKCkge1xuICAgICAgICBjb25zdCBhcnIgPSBbXTtcbiAgICAgICAgZm9yIChjb25zdCBpIG9mIHRoaXMuI2luZGV4ZXMoeyBhbGxvd1N0YWxlOiB0cnVlIH0pKSB7XG4gICAgICAgICAgICBjb25zdCBrZXkgPSB0aGlzLiNrZXlMaXN0W2ldO1xuICAgICAgICAgICAgY29uc3QgdiA9IHRoaXMuI3ZhbExpc3RbaV07XG4gICAgICAgICAgICBjb25zdCB2YWx1ZSA9IHRoaXMuI2lzQmFja2dyb3VuZEZldGNoKHYpXG4gICAgICAgICAgICAgICAgPyB2Ll9fc3RhbGVXaGlsZUZldGNoaW5nXG4gICAgICAgICAgICAgICAgOiB2O1xuICAgICAgICAgICAgaWYgKHZhbHVlID09PSB1bmRlZmluZWQgfHwga2V5ID09PSB1bmRlZmluZWQpXG4gICAgICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgICBjb25zdCBlbnRyeSA9IHsgdmFsdWUgfTtcbiAgICAgICAgICAgIGlmICh0aGlzLiN0dGxzICYmIHRoaXMuI3N0YXJ0cykge1xuICAgICAgICAgICAgICAgIGVudHJ5LnR0bCA9IHRoaXMuI3R0bHNbaV07XG4gICAgICAgICAgICAgICAgLy8gYWx3YXlzIGR1bXAgdGhlIHN0YXJ0IHJlbGF0aXZlIHRvIGEgcG9ydGFibGUgdGltZXN0YW1wXG4gICAgICAgICAgICAgICAgLy8gaXQncyBvayBmb3IgdGhpcyB0byBiZSBhIGJpdCBzbG93LCBpdCdzIGEgcmFyZSBvcGVyYXRpb24uXG4gICAgICAgICAgICAgICAgY29uc3QgYWdlID0gcGVyZi5ub3coKSAtIHRoaXMuI3N0YXJ0c1tpXTtcbiAgICAgICAgICAgICAgICBlbnRyeS5zdGFydCA9IE1hdGguZmxvb3IoRGF0ZS5ub3coKSAtIGFnZSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAodGhpcy4jc2l6ZXMpIHtcbiAgICAgICAgICAgICAgICBlbnRyeS5zaXplID0gdGhpcy4jc2l6ZXNbaV07XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBhcnIudW5zaGlmdChba2V5LCBlbnRyeV0pO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBhcnI7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIFJlc2V0IHRoZSBjYWNoZSBhbmQgbG9hZCBpbiB0aGUgaXRlbXMgaW4gZW50cmllcyBpbiB0aGUgb3JkZXIgbGlzdGVkLlxuICAgICAqXG4gICAgICogVGhlIHNoYXBlIG9mIHRoZSByZXN1bHRpbmcgY2FjaGUgbWF5IGJlIGRpZmZlcmVudCBpZiB0aGUgc2FtZSBvcHRpb25zIGFyZVxuICAgICAqIG5vdCB1c2VkIGluIGJvdGggY2FjaGVzLlxuICAgICAqXG4gICAgICogVGhlIGBzdGFydGAgZmllbGRzIGFyZSBhc3N1bWVkIHRvIGJlIGNhbGN1bGF0ZWQgcmVsYXRpdmUgdG8gYSBwb3J0YWJsZVxuICAgICAqIGBEYXRlLm5vdygpYCB0aW1lc3RhbXAsIGV2ZW4gaWYgYHBlcmZvcm1hbmNlLm5vdygpYCBpcyBhdmFpbGFibGUuXG4gICAgICovXG4gICAgbG9hZChhcnIpIHtcbiAgICAgICAgdGhpcy5jbGVhcigpO1xuICAgICAgICBmb3IgKGNvbnN0IFtrZXksIGVudHJ5XSBvZiBhcnIpIHtcbiAgICAgICAgICAgIGlmIChlbnRyeS5zdGFydCkge1xuICAgICAgICAgICAgICAgIC8vIGVudHJ5LnN0YXJ0IGlzIGEgcG9ydGFibGUgdGltZXN0YW1wLCBidXQgd2UgbWF5IGJlIHVzaW5nXG4gICAgICAgICAgICAgICAgLy8gbm9kZSdzIHBlcmZvcm1hbmNlLm5vdygpLCBzbyBjYWxjdWxhdGUgdGhlIG9mZnNldCwgc28gdGhhdFxuICAgICAgICAgICAgICAgIC8vIHdlIGdldCB0aGUgaW50ZW5kZWQgcmVtYWluaW5nIFRUTCwgbm8gbWF0dGVyIGhvdyBsb25nIGl0J3NcbiAgICAgICAgICAgICAgICAvLyBiZWVuIG9uIGljZS5cbiAgICAgICAgICAgICAgICAvL1xuICAgICAgICAgICAgICAgIC8vIGl0J3Mgb2sgZm9yIHRoaXMgdG8gYmUgYSBiaXQgc2xvdywgaXQncyBhIHJhcmUgb3BlcmF0aW9uLlxuICAgICAgICAgICAgICAgIGNvbnN0IGFnZSA9IERhdGUubm93KCkgLSBlbnRyeS5zdGFydDtcbiAgICAgICAgICAgICAgICBlbnRyeS5zdGFydCA9IHBlcmYubm93KCkgLSBhZ2U7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICB0aGlzLnNldChrZXksIGVudHJ5LnZhbHVlLCBlbnRyeSk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgLyoqXG4gICAgICogQWRkIGEgdmFsdWUgdG8gdGhlIGNhY2hlLlxuICAgICAqXG4gICAgICogTm90ZTogaWYgYHVuZGVmaW5lZGAgaXMgc3BlY2lmaWVkIGFzIGEgdmFsdWUsIHRoaXMgaXMgYW4gYWxpYXMgZm9yXG4gICAgICoge0BsaW5rIExSVUNhY2hlI2RlbGV0ZX1cbiAgICAgKlxuICAgICAqIEZpZWxkcyBvbiB0aGUge0BsaW5rIExSVUNhY2hlLlNldE9wdGlvbnN9IG9wdGlvbnMgcGFyYW0gd2lsbCBvdmVycmlkZVxuICAgICAqIHRoZWlyIGNvcnJlc3BvbmRpbmcgdmFsdWVzIGluIHRoZSBjb25zdHJ1Y3RvciBvcHRpb25zIGZvciB0aGUgc2NvcGVcbiAgICAgKiBvZiB0aGlzIHNpbmdsZSBgc2V0KClgIG9wZXJhdGlvbi5cbiAgICAgKlxuICAgICAqIElmIGBzdGFydGAgaXMgcHJvdmlkZWQsIHRoZW4gdGhhdCB3aWxsIHNldCB0aGUgZWZmZWN0aXZlIHN0YXJ0XG4gICAgICogdGltZSBmb3IgdGhlIFRUTCBjYWxjdWxhdGlvbi4gTm90ZSB0aGF0IHRoaXMgbXVzdCBiZSBhIHByZXZpb3VzXG4gICAgICogdmFsdWUgb2YgYHBlcmZvcm1hbmNlLm5vdygpYCBpZiBzdXBwb3J0ZWQsIG9yIGEgcHJldmlvdXMgdmFsdWUgb2ZcbiAgICAgKiBgRGF0ZS5ub3coKWAgaWYgbm90LlxuICAgICAqXG4gICAgICogT3B0aW9ucyBvYmplY3QgbWF5IGFsc28gaW5jbHVkZSBgc2l6ZWAsIHdoaWNoIHdpbGwgcHJldmVudFxuICAgICAqIGNhbGxpbmcgdGhlIGBzaXplQ2FsY3VsYXRpb25gIGZ1bmN0aW9uIGFuZCBqdXN0IHVzZSB0aGUgc3BlY2lmaWVkXG4gICAgICogbnVtYmVyIGlmIGl0IGlzIGEgcG9zaXRpdmUgaW50ZWdlciwgYW5kIGBub0Rpc3Bvc2VPblNldGAgd2hpY2hcbiAgICAgKiB3aWxsIHByZXZlbnQgY2FsbGluZyBhIGBkaXNwb3NlYCBmdW5jdGlvbiBpbiB0aGUgY2FzZSBvZlxuICAgICAqIG92ZXJ3cml0ZXMuXG4gICAgICpcbiAgICAgKiBJZiB0aGUgYHNpemVgIChvciByZXR1cm4gdmFsdWUgb2YgYHNpemVDYWxjdWxhdGlvbmApIGZvciBhIGdpdmVuXG4gICAgICogZW50cnkgaXMgZ3JlYXRlciB0aGFuIGBtYXhFbnRyeVNpemVgLCB0aGVuIHRoZSBpdGVtIHdpbGwgbm90IGJlXG4gICAgICogYWRkZWQgdG8gdGhlIGNhY2hlLlxuICAgICAqXG4gICAgICogV2lsbCB1cGRhdGUgdGhlIHJlY2VuY3kgb2YgdGhlIGVudHJ5LlxuICAgICAqXG4gICAgICogSWYgdGhlIHZhbHVlIGlzIGB1bmRlZmluZWRgLCB0aGVuIHRoaXMgaXMgYW4gYWxpYXMgZm9yXG4gICAgICogYGNhY2hlLmRlbGV0ZShrZXkpYC4gYHVuZGVmaW5lZGAgaXMgbmV2ZXIgc3RvcmVkIGluIHRoZSBjYWNoZS5cbiAgICAgKi9cbiAgICBzZXQoaywgdiwgc2V0T3B0aW9ucyA9IHt9KSB7XG4gICAgICAgIGlmICh2ID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgIHRoaXMuZGVsZXRlKGspO1xuICAgICAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgeyB0dGwgPSB0aGlzLnR0bCwgc3RhcnQsIG5vRGlzcG9zZU9uU2V0ID0gdGhpcy5ub0Rpc3Bvc2VPblNldCwgc2l6ZUNhbGN1bGF0aW9uID0gdGhpcy5zaXplQ2FsY3VsYXRpb24sIHN0YXR1cywgfSA9IHNldE9wdGlvbnM7XG4gICAgICAgIGxldCB7IG5vVXBkYXRlVFRMID0gdGhpcy5ub1VwZGF0ZVRUTCB9ID0gc2V0T3B0aW9ucztcbiAgICAgICAgY29uc3Qgc2l6ZSA9IHRoaXMuI3JlcXVpcmVTaXplKGssIHYsIHNldE9wdGlvbnMuc2l6ZSB8fCAwLCBzaXplQ2FsY3VsYXRpb24pO1xuICAgICAgICAvLyBpZiB0aGUgaXRlbSBkb2Vzbid0IGZpdCwgZG9uJ3QgZG8gYW55dGhpbmdcbiAgICAgICAgLy8gTkI6IG1heEVudHJ5U2l6ZSBzZXQgdG8gbWF4U2l6ZSBieSBkZWZhdWx0XG4gICAgICAgIGlmICh0aGlzLm1heEVudHJ5U2l6ZSAmJiBzaXplID4gdGhpcy5tYXhFbnRyeVNpemUpIHtcbiAgICAgICAgICAgIGlmIChzdGF0dXMpIHtcbiAgICAgICAgICAgICAgICBzdGF0dXMuc2V0ID0gJ21pc3MnO1xuICAgICAgICAgICAgICAgIHN0YXR1cy5tYXhFbnRyeVNpemVFeGNlZWRlZCA9IHRydWU7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICAvLyBoYXZlIHRvIGRlbGV0ZSwgaW4gY2FzZSBzb21ldGhpbmcgaXMgdGhlcmUgYWxyZWFkeS5cbiAgICAgICAgICAgIHRoaXMuI2RlbGV0ZShrLCAnc2V0Jyk7XG4gICAgICAgICAgICByZXR1cm4gdGhpcztcbiAgICAgICAgfVxuICAgICAgICBsZXQgaW5kZXggPSB0aGlzLiNzaXplID09PSAwID8gdW5kZWZpbmVkIDogdGhpcy4ja2V5TWFwLmdldChrKTtcbiAgICAgICAgaWYgKGluZGV4ID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgIC8vIGFkZGl0aW9uXG4gICAgICAgICAgICBpbmRleCA9ICh0aGlzLiNzaXplID09PSAwXG4gICAgICAgICAgICAgICAgPyB0aGlzLiN0YWlsXG4gICAgICAgICAgICAgICAgOiB0aGlzLiNmcmVlLmxlbmd0aCAhPT0gMFxuICAgICAgICAgICAgICAgICAgICA/IHRoaXMuI2ZyZWUucG9wKClcbiAgICAgICAgICAgICAgICAgICAgOiB0aGlzLiNzaXplID09PSB0aGlzLiNtYXhcbiAgICAgICAgICAgICAgICAgICAgICAgID8gdGhpcy4jZXZpY3QoZmFsc2UpXG4gICAgICAgICAgICAgICAgICAgICAgICA6IHRoaXMuI3NpemUpO1xuICAgICAgICAgICAgdGhpcy4ja2V5TGlzdFtpbmRleF0gPSBrO1xuICAgICAgICAgICAgdGhpcy4jdmFsTGlzdFtpbmRleF0gPSB2O1xuICAgICAgICAgICAgdGhpcy4ja2V5TWFwLnNldChrLCBpbmRleCk7XG4gICAgICAgICAgICB0aGlzLiNuZXh0W3RoaXMuI3RhaWxdID0gaW5kZXg7XG4gICAgICAgICAgICB0aGlzLiNwcmV2W2luZGV4XSA9IHRoaXMuI3RhaWw7XG4gICAgICAgICAgICB0aGlzLiN0YWlsID0gaW5kZXg7XG4gICAgICAgICAgICB0aGlzLiNzaXplKys7XG4gICAgICAgICAgICB0aGlzLiNhZGRJdGVtU2l6ZShpbmRleCwgc2l6ZSwgc3RhdHVzKTtcbiAgICAgICAgICAgIGlmIChzdGF0dXMpXG4gICAgICAgICAgICAgICAgc3RhdHVzLnNldCA9ICdhZGQnO1xuICAgICAgICAgICAgbm9VcGRhdGVUVEwgPSBmYWxzZTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIC8vIHVwZGF0ZVxuICAgICAgICAgICAgdGhpcy4jbW92ZVRvVGFpbChpbmRleCk7XG4gICAgICAgICAgICBjb25zdCBvbGRWYWwgPSB0aGlzLiN2YWxMaXN0W2luZGV4XTtcbiAgICAgICAgICAgIGlmICh2ICE9PSBvbGRWYWwpIHtcbiAgICAgICAgICAgICAgICBpZiAodGhpcy4jaGFzRmV0Y2hNZXRob2QgJiYgdGhpcy4jaXNCYWNrZ3JvdW5kRmV0Y2gob2xkVmFsKSkge1xuICAgICAgICAgICAgICAgICAgICBvbGRWYWwuX19hYm9ydENvbnRyb2xsZXIuYWJvcnQobmV3IEVycm9yKCdyZXBsYWNlZCcpKTtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgeyBfX3N0YWxlV2hpbGVGZXRjaGluZzogcyB9ID0gb2xkVmFsO1xuICAgICAgICAgICAgICAgICAgICBpZiAocyAhPT0gdW5kZWZpbmVkICYmICFub0Rpc3Bvc2VPblNldCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHRoaXMuI2hhc0Rpc3Bvc2UpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLiNkaXNwb3NlPy4ocywgaywgJ3NldCcpO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHRoaXMuI2hhc0Rpc3Bvc2VBZnRlcikge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuI2Rpc3Bvc2VkPy5wdXNoKFtzLCBrLCAnc2V0J10pO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGVsc2UgaWYgKCFub0Rpc3Bvc2VPblNldCkge1xuICAgICAgICAgICAgICAgICAgICBpZiAodGhpcy4jaGFzRGlzcG9zZSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy4jZGlzcG9zZT8uKG9sZFZhbCwgaywgJ3NldCcpO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIGlmICh0aGlzLiNoYXNEaXNwb3NlQWZ0ZXIpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuI2Rpc3Bvc2VkPy5wdXNoKFtvbGRWYWwsIGssICdzZXQnXSk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgdGhpcy4jcmVtb3ZlSXRlbVNpemUoaW5kZXgpO1xuICAgICAgICAgICAgICAgIHRoaXMuI2FkZEl0ZW1TaXplKGluZGV4LCBzaXplLCBzdGF0dXMpO1xuICAgICAgICAgICAgICAgIHRoaXMuI3ZhbExpc3RbaW5kZXhdID0gdjtcbiAgICAgICAgICAgICAgICBpZiAoc3RhdHVzKSB7XG4gICAgICAgICAgICAgICAgICAgIHN0YXR1cy5zZXQgPSAncmVwbGFjZSc7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IG9sZFZhbHVlID0gb2xkVmFsICYmIHRoaXMuI2lzQmFja2dyb3VuZEZldGNoKG9sZFZhbClcbiAgICAgICAgICAgICAgICAgICAgICAgID8gb2xkVmFsLl9fc3RhbGVXaGlsZUZldGNoaW5nXG4gICAgICAgICAgICAgICAgICAgICAgICA6IG9sZFZhbDtcbiAgICAgICAgICAgICAgICAgICAgaWYgKG9sZFZhbHVlICE9PSB1bmRlZmluZWQpXG4gICAgICAgICAgICAgICAgICAgICAgICBzdGF0dXMub2xkVmFsdWUgPSBvbGRWYWx1ZTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIGlmIChzdGF0dXMpIHtcbiAgICAgICAgICAgICAgICBzdGF0dXMuc2V0ID0gJ3VwZGF0ZSc7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHR0bCAhPT0gMCAmJiAhdGhpcy4jdHRscykge1xuICAgICAgICAgICAgdGhpcy4jaW5pdGlhbGl6ZVRUTFRyYWNraW5nKCk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHRoaXMuI3R0bHMpIHtcbiAgICAgICAgICAgIGlmICghbm9VcGRhdGVUVEwpIHtcbiAgICAgICAgICAgICAgICB0aGlzLiNzZXRJdGVtVFRMKGluZGV4LCB0dGwsIHN0YXJ0KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmIChzdGF0dXMpXG4gICAgICAgICAgICAgICAgdGhpcy4jc3RhdHVzVFRMKHN0YXR1cywgaW5kZXgpO1xuICAgICAgICB9XG4gICAgICAgIGlmICghbm9EaXNwb3NlT25TZXQgJiYgdGhpcy4jaGFzRGlzcG9zZUFmdGVyICYmIHRoaXMuI2Rpc3Bvc2VkKSB7XG4gICAgICAgICAgICBjb25zdCBkdCA9IHRoaXMuI2Rpc3Bvc2VkO1xuICAgICAgICAgICAgbGV0IHRhc2s7XG4gICAgICAgICAgICB3aGlsZSAoKHRhc2sgPSBkdD8uc2hpZnQoKSkpIHtcbiAgICAgICAgICAgICAgICB0aGlzLiNkaXNwb3NlQWZ0ZXI/LiguLi50YXNrKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9XG4gICAgLyoqXG4gICAgICogRXZpY3QgdGhlIGxlYXN0IHJlY2VudGx5IHVzZWQgaXRlbSwgcmV0dXJuaW5nIGl0cyB2YWx1ZSBvclxuICAgICAqIGB1bmRlZmluZWRgIGlmIGNhY2hlIGlzIGVtcHR5LlxuICAgICAqL1xuICAgIHBvcCgpIHtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIHdoaWxlICh0aGlzLiNzaXplKSB7XG4gICAgICAgICAgICAgICAgY29uc3QgdmFsID0gdGhpcy4jdmFsTGlzdFt0aGlzLiNoZWFkXTtcbiAgICAgICAgICAgICAgICB0aGlzLiNldmljdCh0cnVlKTtcbiAgICAgICAgICAgICAgICBpZiAodGhpcy4jaXNCYWNrZ3JvdW5kRmV0Y2godmFsKSkge1xuICAgICAgICAgICAgICAgICAgICBpZiAodmFsLl9fc3RhbGVXaGlsZUZldGNoaW5nKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gdmFsLl9fc3RhbGVXaGlsZUZldGNoaW5nO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGVsc2UgaWYgKHZhbCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiB2YWw7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGZpbmFsbHkge1xuICAgICAgICAgICAgaWYgKHRoaXMuI2hhc0Rpc3Bvc2VBZnRlciAmJiB0aGlzLiNkaXNwb3NlZCkge1xuICAgICAgICAgICAgICAgIGNvbnN0IGR0ID0gdGhpcy4jZGlzcG9zZWQ7XG4gICAgICAgICAgICAgICAgbGV0IHRhc2s7XG4gICAgICAgICAgICAgICAgd2hpbGUgKCh0YXNrID0gZHQ/LnNoaWZ0KCkpKSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuI2Rpc3Bvc2VBZnRlcj8uKC4uLnRhc2spO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cbiAgICAjZXZpY3QoZnJlZSkge1xuICAgICAgICBjb25zdCBoZWFkID0gdGhpcy4jaGVhZDtcbiAgICAgICAgY29uc3QgayA9IHRoaXMuI2tleUxpc3RbaGVhZF07XG4gICAgICAgIGNvbnN0IHYgPSB0aGlzLiN2YWxMaXN0W2hlYWRdO1xuICAgICAgICBpZiAodGhpcy4jaGFzRmV0Y2hNZXRob2QgJiYgdGhpcy4jaXNCYWNrZ3JvdW5kRmV0Y2godikpIHtcbiAgICAgICAgICAgIHYuX19hYm9ydENvbnRyb2xsZXIuYWJvcnQobmV3IEVycm9yKCdldmljdGVkJykpO1xuICAgICAgICB9XG4gICAgICAgIGVsc2UgaWYgKHRoaXMuI2hhc0Rpc3Bvc2UgfHwgdGhpcy4jaGFzRGlzcG9zZUFmdGVyKSB7XG4gICAgICAgICAgICBpZiAodGhpcy4jaGFzRGlzcG9zZSkge1xuICAgICAgICAgICAgICAgIHRoaXMuI2Rpc3Bvc2U/Lih2LCBrLCAnZXZpY3QnKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmICh0aGlzLiNoYXNEaXNwb3NlQWZ0ZXIpIHtcbiAgICAgICAgICAgICAgICB0aGlzLiNkaXNwb3NlZD8ucHVzaChbdiwgaywgJ2V2aWN0J10pO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHRoaXMuI3JlbW92ZUl0ZW1TaXplKGhlYWQpO1xuICAgICAgICAvLyBpZiB3ZSBhcmVuJ3QgYWJvdXQgdG8gdXNlIHRoZSBpbmRleCwgdGhlbiBudWxsIHRoZXNlIG91dFxuICAgICAgICBpZiAoZnJlZSkge1xuICAgICAgICAgICAgdGhpcy4ja2V5TGlzdFtoZWFkXSA9IHVuZGVmaW5lZDtcbiAgICAgICAgICAgIHRoaXMuI3ZhbExpc3RbaGVhZF0gPSB1bmRlZmluZWQ7XG4gICAgICAgICAgICB0aGlzLiNmcmVlLnB1c2goaGVhZCk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHRoaXMuI3NpemUgPT09IDEpIHtcbiAgICAgICAgICAgIHRoaXMuI2hlYWQgPSB0aGlzLiN0YWlsID0gMDtcbiAgICAgICAgICAgIHRoaXMuI2ZyZWUubGVuZ3RoID0gMDtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIHRoaXMuI2hlYWQgPSB0aGlzLiNuZXh0W2hlYWRdO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMuI2tleU1hcC5kZWxldGUoayk7XG4gICAgICAgIHRoaXMuI3NpemUtLTtcbiAgICAgICAgcmV0dXJuIGhlYWQ7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIENoZWNrIGlmIGEga2V5IGlzIGluIHRoZSBjYWNoZSwgd2l0aG91dCB1cGRhdGluZyB0aGUgcmVjZW5jeSBvZiB1c2UuXG4gICAgICogV2lsbCByZXR1cm4gZmFsc2UgaWYgdGhlIGl0ZW0gaXMgc3RhbGUsIGV2ZW4gdGhvdWdoIGl0IGlzIHRlY2huaWNhbGx5XG4gICAgICogaW4gdGhlIGNhY2hlLlxuICAgICAqXG4gICAgICogQ2hlY2sgaWYgYSBrZXkgaXMgaW4gdGhlIGNhY2hlLCB3aXRob3V0IHVwZGF0aW5nIHRoZSByZWNlbmN5IG9mXG4gICAgICogdXNlLiBBZ2UgaXMgdXBkYXRlZCBpZiB7QGxpbmsgTFJVQ2FjaGUuT3B0aW9uc0Jhc2UudXBkYXRlQWdlT25IYXN9IGlzIHNldFxuICAgICAqIHRvIGB0cnVlYCBpbiBlaXRoZXIgdGhlIG9wdGlvbnMgb3IgdGhlIGNvbnN0cnVjdG9yLlxuICAgICAqXG4gICAgICogV2lsbCByZXR1cm4gYGZhbHNlYCBpZiB0aGUgaXRlbSBpcyBzdGFsZSwgZXZlbiB0aG91Z2ggaXQgaXMgdGVjaG5pY2FsbHkgaW5cbiAgICAgKiB0aGUgY2FjaGUuIFRoZSBkaWZmZXJlbmNlIGNhbiBiZSBkZXRlcm1pbmVkIChpZiBpdCBtYXR0ZXJzKSBieSB1c2luZyBhXG4gICAgICogYHN0YXR1c2AgYXJndW1lbnQsIGFuZCBpbnNwZWN0aW5nIHRoZSBgaGFzYCBmaWVsZC5cbiAgICAgKlxuICAgICAqIFdpbGwgbm90IHVwZGF0ZSBpdGVtIGFnZSB1bmxlc3NcbiAgICAgKiB7QGxpbmsgTFJVQ2FjaGUuT3B0aW9uc0Jhc2UudXBkYXRlQWdlT25IYXN9IGlzIHNldC5cbiAgICAgKi9cbiAgICBoYXMoaywgaGFzT3B0aW9ucyA9IHt9KSB7XG4gICAgICAgIGNvbnN0IHsgdXBkYXRlQWdlT25IYXMgPSB0aGlzLnVwZGF0ZUFnZU9uSGFzLCBzdGF0dXMgfSA9IGhhc09wdGlvbnM7XG4gICAgICAgIGNvbnN0IGluZGV4ID0gdGhpcy4ja2V5TWFwLmdldChrKTtcbiAgICAgICAgaWYgKGluZGV4ICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgIGNvbnN0IHYgPSB0aGlzLiN2YWxMaXN0W2luZGV4XTtcbiAgICAgICAgICAgIGlmICh0aGlzLiNpc0JhY2tncm91bmRGZXRjaCh2KSAmJlxuICAgICAgICAgICAgICAgIHYuX19zdGFsZVdoaWxlRmV0Y2hpbmcgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmICghdGhpcy4jaXNTdGFsZShpbmRleCkpIHtcbiAgICAgICAgICAgICAgICBpZiAodXBkYXRlQWdlT25IYXMpIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy4jdXBkYXRlSXRlbUFnZShpbmRleCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGlmIChzdGF0dXMpIHtcbiAgICAgICAgICAgICAgICAgICAgc3RhdHVzLmhhcyA9ICdoaXQnO1xuICAgICAgICAgICAgICAgICAgICB0aGlzLiNzdGF0dXNUVEwoc3RhdHVzLCBpbmRleCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSBpZiAoc3RhdHVzKSB7XG4gICAgICAgICAgICAgICAgc3RhdHVzLmhhcyA9ICdzdGFsZSc7XG4gICAgICAgICAgICAgICAgdGhpcy4jc3RhdHVzVFRMKHN0YXR1cywgaW5kZXgpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGVsc2UgaWYgKHN0YXR1cykge1xuICAgICAgICAgICAgc3RhdHVzLmhhcyA9ICdtaXNzJztcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIExpa2Uge0BsaW5rIExSVUNhY2hlI2dldH0gYnV0IGRvZXNuJ3QgdXBkYXRlIHJlY2VuY3kgb3IgZGVsZXRlIHN0YWxlXG4gICAgICogaXRlbXMuXG4gICAgICpcbiAgICAgKiBSZXR1cm5zIGB1bmRlZmluZWRgIGlmIHRoZSBpdGVtIGlzIHN0YWxlLCB1bmxlc3NcbiAgICAgKiB7QGxpbmsgTFJVQ2FjaGUuT3B0aW9uc0Jhc2UuYWxsb3dTdGFsZX0gaXMgc2V0LlxuICAgICAqL1xuICAgIHBlZWsoaywgcGVla09wdGlvbnMgPSB7fSkge1xuICAgICAgICBjb25zdCB7IGFsbG93U3RhbGUgPSB0aGlzLmFsbG93U3RhbGUgfSA9IHBlZWtPcHRpb25zO1xuICAgICAgICBjb25zdCBpbmRleCA9IHRoaXMuI2tleU1hcC5nZXQoayk7XG4gICAgICAgIGlmIChpbmRleCA9PT0gdW5kZWZpbmVkIHx8XG4gICAgICAgICAgICAoIWFsbG93U3RhbGUgJiYgdGhpcy4jaXNTdGFsZShpbmRleCkpKSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgdiA9IHRoaXMuI3ZhbExpc3RbaW5kZXhdO1xuICAgICAgICAvLyBlaXRoZXIgc3RhbGUgYW5kIGFsbG93ZWQsIG9yIGZvcmNpbmcgYSByZWZyZXNoIG9mIG5vbi1zdGFsZSB2YWx1ZVxuICAgICAgICByZXR1cm4gdGhpcy4jaXNCYWNrZ3JvdW5kRmV0Y2godikgPyB2Ll9fc3RhbGVXaGlsZUZldGNoaW5nIDogdjtcbiAgICB9XG4gICAgI2JhY2tncm91bmRGZXRjaChrLCBpbmRleCwgb3B0aW9ucywgY29udGV4dCkge1xuICAgICAgICBjb25zdCB2ID0gaW5kZXggPT09IHVuZGVmaW5lZCA/IHVuZGVmaW5lZCA6IHRoaXMuI3ZhbExpc3RbaW5kZXhdO1xuICAgICAgICBpZiAodGhpcy4jaXNCYWNrZ3JvdW5kRmV0Y2godikpIHtcbiAgICAgICAgICAgIHJldHVybiB2O1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IGFjID0gbmV3IEFDKCk7XG4gICAgICAgIGNvbnN0IHsgc2lnbmFsIH0gPSBvcHRpb25zO1xuICAgICAgICAvLyB3aGVuL2lmIG91ciBBQyBzaWduYWxzLCB0aGVuIHN0b3AgbGlzdGVuaW5nIHRvIHRoZWlycy5cbiAgICAgICAgc2lnbmFsPy5hZGRFdmVudExpc3RlbmVyKCdhYm9ydCcsICgpID0+IGFjLmFib3J0KHNpZ25hbC5yZWFzb24pLCB7XG4gICAgICAgICAgICBzaWduYWw6IGFjLnNpZ25hbCxcbiAgICAgICAgfSk7XG4gICAgICAgIGNvbnN0IGZldGNoT3B0cyA9IHtcbiAgICAgICAgICAgIHNpZ25hbDogYWMuc2lnbmFsLFxuICAgICAgICAgICAgb3B0aW9ucyxcbiAgICAgICAgICAgIGNvbnRleHQsXG4gICAgICAgIH07XG4gICAgICAgIGNvbnN0IGNiID0gKHYsIHVwZGF0ZUNhY2hlID0gZmFsc2UpID0+IHtcbiAgICAgICAgICAgIGNvbnN0IHsgYWJvcnRlZCB9ID0gYWMuc2lnbmFsO1xuICAgICAgICAgICAgY29uc3QgaWdub3JlQWJvcnQgPSBvcHRpb25zLmlnbm9yZUZldGNoQWJvcnQgJiYgdiAhPT0gdW5kZWZpbmVkO1xuICAgICAgICAgICAgaWYgKG9wdGlvbnMuc3RhdHVzKSB7XG4gICAgICAgICAgICAgICAgaWYgKGFib3J0ZWQgJiYgIXVwZGF0ZUNhY2hlKSB7XG4gICAgICAgICAgICAgICAgICAgIG9wdGlvbnMuc3RhdHVzLmZldGNoQWJvcnRlZCA9IHRydWU7XG4gICAgICAgICAgICAgICAgICAgIG9wdGlvbnMuc3RhdHVzLmZldGNoRXJyb3IgPSBhYy5zaWduYWwucmVhc29uO1xuICAgICAgICAgICAgICAgICAgICBpZiAoaWdub3JlQWJvcnQpXG4gICAgICAgICAgICAgICAgICAgICAgICBvcHRpb25zLnN0YXR1cy5mZXRjaEFib3J0SWdub3JlZCA9IHRydWU7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICBvcHRpb25zLnN0YXR1cy5mZXRjaFJlc29sdmVkID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAoYWJvcnRlZCAmJiAhaWdub3JlQWJvcnQgJiYgIXVwZGF0ZUNhY2hlKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGZldGNoRmFpbChhYy5zaWduYWwucmVhc29uKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIC8vIGVpdGhlciB3ZSBkaWRuJ3QgYWJvcnQsIGFuZCBhcmUgc3RpbGwgaGVyZSwgb3Igd2UgZGlkLCBhbmQgaWdub3JlZFxuICAgICAgICAgICAgY29uc3QgYmYgPSBwO1xuICAgICAgICAgICAgaWYgKHRoaXMuI3ZhbExpc3RbaW5kZXhdID09PSBwKSB7XG4gICAgICAgICAgICAgICAgaWYgKHYgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgICAgICAgICBpZiAoYmYuX19zdGFsZVdoaWxlRmV0Y2hpbmcpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuI3ZhbExpc3RbaW5kZXhdID0gYmYuX19zdGFsZVdoaWxlRmV0Y2hpbmc7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLiNkZWxldGUoaywgJ2ZldGNoJyk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIGlmIChvcHRpb25zLnN0YXR1cylcbiAgICAgICAgICAgICAgICAgICAgICAgIG9wdGlvbnMuc3RhdHVzLmZldGNoVXBkYXRlZCA9IHRydWU7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuc2V0KGssIHYsIGZldGNoT3B0cy5vcHRpb25zKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4gdjtcbiAgICAgICAgfTtcbiAgICAgICAgY29uc3QgZWIgPSAoZXIpID0+IHtcbiAgICAgICAgICAgIGlmIChvcHRpb25zLnN0YXR1cykge1xuICAgICAgICAgICAgICAgIG9wdGlvbnMuc3RhdHVzLmZldGNoUmVqZWN0ZWQgPSB0cnVlO1xuICAgICAgICAgICAgICAgIG9wdGlvbnMuc3RhdHVzLmZldGNoRXJyb3IgPSBlcjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiBmZXRjaEZhaWwoZXIpO1xuICAgICAgICB9O1xuICAgICAgICBjb25zdCBmZXRjaEZhaWwgPSAoZXIpID0+IHtcbiAgICAgICAgICAgIGNvbnN0IHsgYWJvcnRlZCB9ID0gYWMuc2lnbmFsO1xuICAgICAgICAgICAgY29uc3QgYWxsb3dTdGFsZUFib3J0ZWQgPSBhYm9ydGVkICYmIG9wdGlvbnMuYWxsb3dTdGFsZU9uRmV0Y2hBYm9ydDtcbiAgICAgICAgICAgIGNvbnN0IGFsbG93U3RhbGUgPSBhbGxvd1N0YWxlQWJvcnRlZCB8fCBvcHRpb25zLmFsbG93U3RhbGVPbkZldGNoUmVqZWN0aW9uO1xuICAgICAgICAgICAgY29uc3Qgbm9EZWxldGUgPSBhbGxvd1N0YWxlIHx8IG9wdGlvbnMubm9EZWxldGVPbkZldGNoUmVqZWN0aW9uO1xuICAgICAgICAgICAgY29uc3QgYmYgPSBwO1xuICAgICAgICAgICAgaWYgKHRoaXMuI3ZhbExpc3RbaW5kZXhdID09PSBwKSB7XG4gICAgICAgICAgICAgICAgLy8gaWYgd2UgYWxsb3cgc3RhbGUgb24gZmV0Y2ggcmVqZWN0aW9ucywgdGhlbiB3ZSBuZWVkIHRvIGVuc3VyZSB0aGF0XG4gICAgICAgICAgICAgICAgLy8gdGhlIHN0YWxlIHZhbHVlIGlzIG5vdCByZW1vdmVkIGZyb20gdGhlIGNhY2hlIHdoZW4gdGhlIGZldGNoIGZhaWxzLlxuICAgICAgICAgICAgICAgIGNvbnN0IGRlbCA9ICFub0RlbGV0ZSB8fCBiZi5fX3N0YWxlV2hpbGVGZXRjaGluZyA9PT0gdW5kZWZpbmVkO1xuICAgICAgICAgICAgICAgIGlmIChkZWwpIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy4jZGVsZXRlKGssICdmZXRjaCcpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBlbHNlIGlmICghYWxsb3dTdGFsZUFib3J0ZWQpIHtcbiAgICAgICAgICAgICAgICAgICAgLy8gc3RpbGwgcmVwbGFjZSB0aGUgKnByb21pc2UqIHdpdGggdGhlIHN0YWxlIHZhbHVlLFxuICAgICAgICAgICAgICAgICAgICAvLyBzaW5jZSB3ZSBhcmUgZG9uZSB3aXRoIHRoZSBwcm9taXNlIGF0IHRoaXMgcG9pbnQuXG4gICAgICAgICAgICAgICAgICAgIC8vIGxlYXZlIGl0IHVudG91Y2hlZCBpZiB3ZSdyZSBzdGlsbCB3YWl0aW5nIGZvciBhblxuICAgICAgICAgICAgICAgICAgICAvLyBhYm9ydGVkIGJhY2tncm91bmQgZmV0Y2ggdGhhdCBoYXNuJ3QgeWV0IHJldHVybmVkLlxuICAgICAgICAgICAgICAgICAgICB0aGlzLiN2YWxMaXN0W2luZGV4XSA9IGJmLl9fc3RhbGVXaGlsZUZldGNoaW5nO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmIChhbGxvd1N0YWxlKSB7XG4gICAgICAgICAgICAgICAgaWYgKG9wdGlvbnMuc3RhdHVzICYmIGJmLl9fc3RhbGVXaGlsZUZldGNoaW5nICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgICAgICAgICAgb3B0aW9ucy5zdGF0dXMucmV0dXJuZWRTdGFsZSA9IHRydWU7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHJldHVybiBiZi5fX3N0YWxlV2hpbGVGZXRjaGluZztcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2UgaWYgKGJmLl9fcmV0dXJuZWQgPT09IGJmKSB7XG4gICAgICAgICAgICAgICAgdGhyb3cgZXI7XG4gICAgICAgICAgICB9XG4gICAgICAgIH07XG4gICAgICAgIGNvbnN0IHBjYWxsID0gKHJlcywgcmVqKSA9PiB7XG4gICAgICAgICAgICBjb25zdCBmbXAgPSB0aGlzLiNmZXRjaE1ldGhvZD8uKGssIHYsIGZldGNoT3B0cyk7XG4gICAgICAgICAgICBpZiAoZm1wICYmIGZtcCBpbnN0YW5jZW9mIFByb21pc2UpIHtcbiAgICAgICAgICAgICAgICBmbXAudGhlbih2ID0+IHJlcyh2ID09PSB1bmRlZmluZWQgPyB1bmRlZmluZWQgOiB2KSwgcmVqKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIC8vIGlnbm9yZWQsIHdlIGdvIHVudGlsIHdlIGZpbmlzaCwgcmVnYXJkbGVzcy5cbiAgICAgICAgICAgIC8vIGRlZmVyIGNoZWNrIHVudGlsIHdlIGFyZSBhY3R1YWxseSBhYm9ydGluZyxcbiAgICAgICAgICAgIC8vIHNvIGZldGNoTWV0aG9kIGNhbiBvdmVycmlkZS5cbiAgICAgICAgICAgIGFjLnNpZ25hbC5hZGRFdmVudExpc3RlbmVyKCdhYm9ydCcsICgpID0+IHtcbiAgICAgICAgICAgICAgICBpZiAoIW9wdGlvbnMuaWdub3JlRmV0Y2hBYm9ydCB8fFxuICAgICAgICAgICAgICAgICAgICBvcHRpb25zLmFsbG93U3RhbGVPbkZldGNoQWJvcnQpIHtcbiAgICAgICAgICAgICAgICAgICAgcmVzKHVuZGVmaW5lZCk7XG4gICAgICAgICAgICAgICAgICAgIC8vIHdoZW4gaXQgZXZlbnR1YWxseSByZXNvbHZlcywgdXBkYXRlIHRoZSBjYWNoZS5cbiAgICAgICAgICAgICAgICAgICAgaWYgKG9wdGlvbnMuYWxsb3dTdGFsZU9uRmV0Y2hBYm9ydCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgcmVzID0gdiA9PiBjYih2LCB0cnVlKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9O1xuICAgICAgICBpZiAob3B0aW9ucy5zdGF0dXMpXG4gICAgICAgICAgICBvcHRpb25zLnN0YXR1cy5mZXRjaERpc3BhdGNoZWQgPSB0cnVlO1xuICAgICAgICBjb25zdCBwID0gbmV3IFByb21pc2UocGNhbGwpLnRoZW4oY2IsIGViKTtcbiAgICAgICAgY29uc3QgYmYgPSBPYmplY3QuYXNzaWduKHAsIHtcbiAgICAgICAgICAgIF9fYWJvcnRDb250cm9sbGVyOiBhYyxcbiAgICAgICAgICAgIF9fc3RhbGVXaGlsZUZldGNoaW5nOiB2LFxuICAgICAgICAgICAgX19yZXR1cm5lZDogdW5kZWZpbmVkLFxuICAgICAgICB9KTtcbiAgICAgICAgaWYgKGluZGV4ID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgIC8vIGludGVybmFsLCBkb24ndCBleHBvc2Ugc3RhdHVzLlxuICAgICAgICAgICAgdGhpcy5zZXQoaywgYmYsIHsgLi4uZmV0Y2hPcHRzLm9wdGlvbnMsIHN0YXR1czogdW5kZWZpbmVkIH0pO1xuICAgICAgICAgICAgaW5kZXggPSB0aGlzLiNrZXlNYXAuZ2V0KGspO1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgdGhpcy4jdmFsTGlzdFtpbmRleF0gPSBiZjtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gYmY7XG4gICAgfVxuICAgICNpc0JhY2tncm91bmRGZXRjaChwKSB7XG4gICAgICAgIGlmICghdGhpcy4jaGFzRmV0Y2hNZXRob2QpXG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgIGNvbnN0IGIgPSBwO1xuICAgICAgICByZXR1cm4gKCEhYiAmJlxuICAgICAgICAgICAgYiBpbnN0YW5jZW9mIFByb21pc2UgJiZcbiAgICAgICAgICAgIGIuaGFzT3duUHJvcGVydHkoJ19fc3RhbGVXaGlsZUZldGNoaW5nJykgJiZcbiAgICAgICAgICAgIGIuX19hYm9ydENvbnRyb2xsZXIgaW5zdGFuY2VvZiBBQyk7XG4gICAgfVxuICAgIGFzeW5jIGZldGNoKGssIGZldGNoT3B0aW9ucyA9IHt9KSB7XG4gICAgICAgIGNvbnN0IHsgXG4gICAgICAgIC8vIGdldCBvcHRpb25zXG4gICAgICAgIGFsbG93U3RhbGUgPSB0aGlzLmFsbG93U3RhbGUsIHVwZGF0ZUFnZU9uR2V0ID0gdGhpcy51cGRhdGVBZ2VPbkdldCwgbm9EZWxldGVPblN0YWxlR2V0ID0gdGhpcy5ub0RlbGV0ZU9uU3RhbGVHZXQsIFxuICAgICAgICAvLyBzZXQgb3B0aW9uc1xuICAgICAgICB0dGwgPSB0aGlzLnR0bCwgbm9EaXNwb3NlT25TZXQgPSB0aGlzLm5vRGlzcG9zZU9uU2V0LCBzaXplID0gMCwgc2l6ZUNhbGN1bGF0aW9uID0gdGhpcy5zaXplQ2FsY3VsYXRpb24sIG5vVXBkYXRlVFRMID0gdGhpcy5ub1VwZGF0ZVRUTCwgXG4gICAgICAgIC8vIGZldGNoIGV4Y2x1c2l2ZSBvcHRpb25zXG4gICAgICAgIG5vRGVsZXRlT25GZXRjaFJlamVjdGlvbiA9IHRoaXMubm9EZWxldGVPbkZldGNoUmVqZWN0aW9uLCBhbGxvd1N0YWxlT25GZXRjaFJlamVjdGlvbiA9IHRoaXMuYWxsb3dTdGFsZU9uRmV0Y2hSZWplY3Rpb24sIGlnbm9yZUZldGNoQWJvcnQgPSB0aGlzLmlnbm9yZUZldGNoQWJvcnQsIGFsbG93U3RhbGVPbkZldGNoQWJvcnQgPSB0aGlzLmFsbG93U3RhbGVPbkZldGNoQWJvcnQsIGNvbnRleHQsIGZvcmNlUmVmcmVzaCA9IGZhbHNlLCBzdGF0dXMsIHNpZ25hbCwgfSA9IGZldGNoT3B0aW9ucztcbiAgICAgICAgaWYgKCF0aGlzLiNoYXNGZXRjaE1ldGhvZCkge1xuICAgICAgICAgICAgaWYgKHN0YXR1cylcbiAgICAgICAgICAgICAgICBzdGF0dXMuZmV0Y2ggPSAnZ2V0JztcbiAgICAgICAgICAgIHJldHVybiB0aGlzLmdldChrLCB7XG4gICAgICAgICAgICAgICAgYWxsb3dTdGFsZSxcbiAgICAgICAgICAgICAgICB1cGRhdGVBZ2VPbkdldCxcbiAgICAgICAgICAgICAgICBub0RlbGV0ZU9uU3RhbGVHZXQsXG4gICAgICAgICAgICAgICAgc3RhdHVzLFxuICAgICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICAgICAgY29uc3Qgb3B0aW9ucyA9IHtcbiAgICAgICAgICAgIGFsbG93U3RhbGUsXG4gICAgICAgICAgICB1cGRhdGVBZ2VPbkdldCxcbiAgICAgICAgICAgIG5vRGVsZXRlT25TdGFsZUdldCxcbiAgICAgICAgICAgIHR0bCxcbiAgICAgICAgICAgIG5vRGlzcG9zZU9uU2V0LFxuICAgICAgICAgICAgc2l6ZSxcbiAgICAgICAgICAgIHNpemVDYWxjdWxhdGlvbixcbiAgICAgICAgICAgIG5vVXBkYXRlVFRMLFxuICAgICAgICAgICAgbm9EZWxldGVPbkZldGNoUmVqZWN0aW9uLFxuICAgICAgICAgICAgYWxsb3dTdGFsZU9uRmV0Y2hSZWplY3Rpb24sXG4gICAgICAgICAgICBhbGxvd1N0YWxlT25GZXRjaEFib3J0LFxuICAgICAgICAgICAgaWdub3JlRmV0Y2hBYm9ydCxcbiAgICAgICAgICAgIHN0YXR1cyxcbiAgICAgICAgICAgIHNpZ25hbCxcbiAgICAgICAgfTtcbiAgICAgICAgbGV0IGluZGV4ID0gdGhpcy4ja2V5TWFwLmdldChrKTtcbiAgICAgICAgaWYgKGluZGV4ID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgIGlmIChzdGF0dXMpXG4gICAgICAgICAgICAgICAgc3RhdHVzLmZldGNoID0gJ21pc3MnO1xuICAgICAgICAgICAgY29uc3QgcCA9IHRoaXMuI2JhY2tncm91bmRGZXRjaChrLCBpbmRleCwgb3B0aW9ucywgY29udGV4dCk7XG4gICAgICAgICAgICByZXR1cm4gKHAuX19yZXR1cm5lZCA9IHApO1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgLy8gaW4gY2FjaGUsIG1heWJlIGFscmVhZHkgZmV0Y2hpbmdcbiAgICAgICAgICAgIGNvbnN0IHYgPSB0aGlzLiN2YWxMaXN0W2luZGV4XTtcbiAgICAgICAgICAgIGlmICh0aGlzLiNpc0JhY2tncm91bmRGZXRjaCh2KSkge1xuICAgICAgICAgICAgICAgIGNvbnN0IHN0YWxlID0gYWxsb3dTdGFsZSAmJiB2Ll9fc3RhbGVXaGlsZUZldGNoaW5nICE9PSB1bmRlZmluZWQ7XG4gICAgICAgICAgICAgICAgaWYgKHN0YXR1cykge1xuICAgICAgICAgICAgICAgICAgICBzdGF0dXMuZmV0Y2ggPSAnaW5mbGlnaHQnO1xuICAgICAgICAgICAgICAgICAgICBpZiAoc3RhbGUpXG4gICAgICAgICAgICAgICAgICAgICAgICBzdGF0dXMucmV0dXJuZWRTdGFsZSA9IHRydWU7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHJldHVybiBzdGFsZSA/IHYuX19zdGFsZVdoaWxlRmV0Y2hpbmcgOiAodi5fX3JldHVybmVkID0gdik7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICAvLyBpZiB3ZSBmb3JjZSBhIHJlZnJlc2gsIHRoYXQgbWVhbnMgZG8gTk9UIHNlcnZlIHRoZSBjYWNoZWQgdmFsdWUsXG4gICAgICAgICAgICAvLyB1bmxlc3Mgd2UgYXJlIGFscmVhZHkgaW4gdGhlIHByb2Nlc3Mgb2YgcmVmcmVzaGluZyB0aGUgY2FjaGUuXG4gICAgICAgICAgICBjb25zdCBpc1N0YWxlID0gdGhpcy4jaXNTdGFsZShpbmRleCk7XG4gICAgICAgICAgICBpZiAoIWZvcmNlUmVmcmVzaCAmJiAhaXNTdGFsZSkge1xuICAgICAgICAgICAgICAgIGlmIChzdGF0dXMpXG4gICAgICAgICAgICAgICAgICAgIHN0YXR1cy5mZXRjaCA9ICdoaXQnO1xuICAgICAgICAgICAgICAgIHRoaXMuI21vdmVUb1RhaWwoaW5kZXgpO1xuICAgICAgICAgICAgICAgIGlmICh1cGRhdGVBZ2VPbkdldCkge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLiN1cGRhdGVJdGVtQWdlKGluZGV4KTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgaWYgKHN0YXR1cylcbiAgICAgICAgICAgICAgICAgICAgdGhpcy4jc3RhdHVzVFRMKHN0YXR1cywgaW5kZXgpO1xuICAgICAgICAgICAgICAgIHJldHVybiB2O1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgLy8gb2ssIGl0IGlzIHN0YWxlIG9yIGEgZm9yY2VkIHJlZnJlc2gsIGFuZCBub3QgYWxyZWFkeSBmZXRjaGluZy5cbiAgICAgICAgICAgIC8vIHJlZnJlc2ggdGhlIGNhY2hlLlxuICAgICAgICAgICAgY29uc3QgcCA9IHRoaXMuI2JhY2tncm91bmRGZXRjaChrLCBpbmRleCwgb3B0aW9ucywgY29udGV4dCk7XG4gICAgICAgICAgICBjb25zdCBoYXNTdGFsZSA9IHAuX19zdGFsZVdoaWxlRmV0Y2hpbmcgIT09IHVuZGVmaW5lZDtcbiAgICAgICAgICAgIGNvbnN0IHN0YWxlVmFsID0gaGFzU3RhbGUgJiYgYWxsb3dTdGFsZTtcbiAgICAgICAgICAgIGlmIChzdGF0dXMpIHtcbiAgICAgICAgICAgICAgICBzdGF0dXMuZmV0Y2ggPSBpc1N0YWxlID8gJ3N0YWxlJyA6ICdyZWZyZXNoJztcbiAgICAgICAgICAgICAgICBpZiAoc3RhbGVWYWwgJiYgaXNTdGFsZSlcbiAgICAgICAgICAgICAgICAgICAgc3RhdHVzLnJldHVybmVkU3RhbGUgPSB0cnVlO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIHN0YWxlVmFsID8gcC5fX3N0YWxlV2hpbGVGZXRjaGluZyA6IChwLl9fcmV0dXJuZWQgPSBwKTtcbiAgICAgICAgfVxuICAgIH1cbiAgICBhc3luYyBmb3JjZUZldGNoKGssIGZldGNoT3B0aW9ucyA9IHt9KSB7XG4gICAgICAgIGNvbnN0IHYgPSBhd2FpdCB0aGlzLmZldGNoKGssIGZldGNoT3B0aW9ucyk7XG4gICAgICAgIGlmICh2ID09PSB1bmRlZmluZWQpXG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ2ZldGNoKCkgcmV0dXJuZWQgdW5kZWZpbmVkJyk7XG4gICAgICAgIHJldHVybiB2O1xuICAgIH1cbiAgICBtZW1vKGssIG1lbW9PcHRpb25zID0ge30pIHtcbiAgICAgICAgY29uc3QgbWVtb01ldGhvZCA9IHRoaXMuI21lbW9NZXRob2Q7XG4gICAgICAgIGlmICghbWVtb01ldGhvZCkge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdubyBtZW1vTWV0aG9kIHByb3ZpZGVkIHRvIGNvbnN0cnVjdG9yJyk7XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgeyBjb250ZXh0LCBmb3JjZVJlZnJlc2gsIC4uLm9wdGlvbnMgfSA9IG1lbW9PcHRpb25zO1xuICAgICAgICBjb25zdCB2ID0gdGhpcy5nZXQoaywgb3B0aW9ucyk7XG4gICAgICAgIGlmICghZm9yY2VSZWZyZXNoICYmIHYgIT09IHVuZGVmaW5lZClcbiAgICAgICAgICAgIHJldHVybiB2O1xuICAgICAgICBjb25zdCB2diA9IG1lbW9NZXRob2Qoaywgdiwge1xuICAgICAgICAgICAgb3B0aW9ucyxcbiAgICAgICAgICAgIGNvbnRleHQsXG4gICAgICAgIH0pO1xuICAgICAgICB0aGlzLnNldChrLCB2diwgb3B0aW9ucyk7XG4gICAgICAgIHJldHVybiB2djtcbiAgICB9XG4gICAgLyoqXG4gICAgICogUmV0dXJuIGEgdmFsdWUgZnJvbSB0aGUgY2FjaGUuIFdpbGwgdXBkYXRlIHRoZSByZWNlbmN5IG9mIHRoZSBjYWNoZVxuICAgICAqIGVudHJ5IGZvdW5kLlxuICAgICAqXG4gICAgICogSWYgdGhlIGtleSBpcyBub3QgZm91bmQsIGdldCgpIHdpbGwgcmV0dXJuIGB1bmRlZmluZWRgLlxuICAgICAqL1xuICAgIGdldChrLCBnZXRPcHRpb25zID0ge30pIHtcbiAgICAgICAgY29uc3QgeyBhbGxvd1N0YWxlID0gdGhpcy5hbGxvd1N0YWxlLCB1cGRhdGVBZ2VPbkdldCA9IHRoaXMudXBkYXRlQWdlT25HZXQsIG5vRGVsZXRlT25TdGFsZUdldCA9IHRoaXMubm9EZWxldGVPblN0YWxlR2V0LCBzdGF0dXMsIH0gPSBnZXRPcHRpb25zO1xuICAgICAgICBjb25zdCBpbmRleCA9IHRoaXMuI2tleU1hcC5nZXQoayk7XG4gICAgICAgIGlmIChpbmRleCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICBjb25zdCB2YWx1ZSA9IHRoaXMuI3ZhbExpc3RbaW5kZXhdO1xuICAgICAgICAgICAgY29uc3QgZmV0Y2hpbmcgPSB0aGlzLiNpc0JhY2tncm91bmRGZXRjaCh2YWx1ZSk7XG4gICAgICAgICAgICBpZiAoc3RhdHVzKVxuICAgICAgICAgICAgICAgIHRoaXMuI3N0YXR1c1RUTChzdGF0dXMsIGluZGV4KTtcbiAgICAgICAgICAgIGlmICh0aGlzLiNpc1N0YWxlKGluZGV4KSkge1xuICAgICAgICAgICAgICAgIGlmIChzdGF0dXMpXG4gICAgICAgICAgICAgICAgICAgIHN0YXR1cy5nZXQgPSAnc3RhbGUnO1xuICAgICAgICAgICAgICAgIC8vIGRlbGV0ZSBvbmx5IGlmIG5vdCBhbiBpbi1mbGlnaHQgYmFja2dyb3VuZCBmZXRjaFxuICAgICAgICAgICAgICAgIGlmICghZmV0Y2hpbmcpIHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKCFub0RlbGV0ZU9uU3RhbGVHZXQpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuI2RlbGV0ZShrLCAnZXhwaXJlJyk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgaWYgKHN0YXR1cyAmJiBhbGxvd1N0YWxlKVxuICAgICAgICAgICAgICAgICAgICAgICAgc3RhdHVzLnJldHVybmVkU3RhbGUgPSB0cnVlO1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gYWxsb3dTdGFsZSA/IHZhbHVlIDogdW5kZWZpbmVkO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKHN0YXR1cyAmJlxuICAgICAgICAgICAgICAgICAgICAgICAgYWxsb3dTdGFsZSAmJlxuICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWUuX19zdGFsZVdoaWxlRmV0Y2hpbmcgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgc3RhdHVzLnJldHVybmVkU3RhbGUgPSB0cnVlO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBhbGxvd1N0YWxlID8gdmFsdWUuX19zdGFsZVdoaWxlRmV0Y2hpbmcgOiB1bmRlZmluZWQ7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgaWYgKHN0YXR1cylcbiAgICAgICAgICAgICAgICAgICAgc3RhdHVzLmdldCA9ICdoaXQnO1xuICAgICAgICAgICAgICAgIC8vIGlmIHdlJ3JlIGN1cnJlbnRseSBmZXRjaGluZyBpdCwgd2UgZG9uJ3QgYWN0dWFsbHkgaGF2ZSBpdCB5ZXRcbiAgICAgICAgICAgICAgICAvLyBpdCdzIG5vdCBzdGFsZSwgd2hpY2ggbWVhbnMgdGhpcyBpc24ndCBhIHN0YWxlV2hpbGVSZWZldGNoaW5nLlxuICAgICAgICAgICAgICAgIC8vIElmIGl0J3Mgbm90IHN0YWxlLCBhbmQgZmV0Y2hpbmcsIEFORCBoYXMgYSBfX3N0YWxlV2hpbGVGZXRjaGluZ1xuICAgICAgICAgICAgICAgIC8vIHZhbHVlLCB0aGVuIHRoYXQgbWVhbnMgdGhlIHVzZXIgZmV0Y2hlZCB3aXRoIHtmb3JjZVJlZnJlc2g6dHJ1ZX0sXG4gICAgICAgICAgICAgICAgLy8gc28gaXQncyBzYWZlIHRvIHJldHVybiB0aGF0IHZhbHVlLlxuICAgICAgICAgICAgICAgIGlmIChmZXRjaGluZykge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gdmFsdWUuX19zdGFsZVdoaWxlRmV0Y2hpbmc7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHRoaXMuI21vdmVUb1RhaWwoaW5kZXgpO1xuICAgICAgICAgICAgICAgIGlmICh1cGRhdGVBZ2VPbkdldCkge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLiN1cGRhdGVJdGVtQWdlKGluZGV4KTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgcmV0dXJuIHZhbHVlO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGVsc2UgaWYgKHN0YXR1cykge1xuICAgICAgICAgICAgc3RhdHVzLmdldCA9ICdtaXNzJztcbiAgICAgICAgfVxuICAgIH1cbiAgICAjY29ubmVjdChwLCBuKSB7XG4gICAgICAgIHRoaXMuI3ByZXZbbl0gPSBwO1xuICAgICAgICB0aGlzLiNuZXh0W3BdID0gbjtcbiAgICB9XG4gICAgI21vdmVUb1RhaWwoaW5kZXgpIHtcbiAgICAgICAgLy8gaWYgdGFpbCBhbHJlYWR5LCBub3RoaW5nIHRvIGRvXG4gICAgICAgIC8vIGlmIGhlYWQsIG1vdmUgaGVhZCB0byBuZXh0W2luZGV4XVxuICAgICAgICAvLyBlbHNlXG4gICAgICAgIC8vICAgbW92ZSBuZXh0W3ByZXZbaW5kZXhdXSB0byBuZXh0W2luZGV4XSAoaGVhZCBoYXMgbm8gcHJldilcbiAgICAgICAgLy8gICBtb3ZlIHByZXZbbmV4dFtpbmRleF1dIHRvIHByZXZbaW5kZXhdXG4gICAgICAgIC8vIHByZXZbaW5kZXhdID0gdGFpbFxuICAgICAgICAvLyBuZXh0W3RhaWxdID0gaW5kZXhcbiAgICAgICAgLy8gdGFpbCA9IGluZGV4XG4gICAgICAgIGlmIChpbmRleCAhPT0gdGhpcy4jdGFpbCkge1xuICAgICAgICAgICAgaWYgKGluZGV4ID09PSB0aGlzLiNoZWFkKSB7XG4gICAgICAgICAgICAgICAgdGhpcy4jaGVhZCA9IHRoaXMuI25leHRbaW5kZXhdO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgdGhpcy4jY29ubmVjdCh0aGlzLiNwcmV2W2luZGV4XSwgdGhpcy4jbmV4dFtpbmRleF0pO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgdGhpcy4jY29ubmVjdCh0aGlzLiN0YWlsLCBpbmRleCk7XG4gICAgICAgICAgICB0aGlzLiN0YWlsID0gaW5kZXg7XG4gICAgICAgIH1cbiAgICB9XG4gICAgLyoqXG4gICAgICogRGVsZXRlcyBhIGtleSBvdXQgb2YgdGhlIGNhY2hlLlxuICAgICAqXG4gICAgICogUmV0dXJucyB0cnVlIGlmIHRoZSBrZXkgd2FzIGRlbGV0ZWQsIGZhbHNlIG90aGVyd2lzZS5cbiAgICAgKi9cbiAgICBkZWxldGUoaykge1xuICAgICAgICByZXR1cm4gdGhpcy4jZGVsZXRlKGssICdkZWxldGUnKTtcbiAgICB9XG4gICAgI2RlbGV0ZShrLCByZWFzb24pIHtcbiAgICAgICAgbGV0IGRlbGV0ZWQgPSBmYWxzZTtcbiAgICAgICAgaWYgKHRoaXMuI3NpemUgIT09IDApIHtcbiAgICAgICAgICAgIGNvbnN0IGluZGV4ID0gdGhpcy4ja2V5TWFwLmdldChrKTtcbiAgICAgICAgICAgIGlmIChpbmRleCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICAgICAgZGVsZXRlZCA9IHRydWU7XG4gICAgICAgICAgICAgICAgaWYgKHRoaXMuI3NpemUgPT09IDEpIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy4jY2xlYXIocmVhc29uKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuI3JlbW92ZUl0ZW1TaXplKGluZGV4KTtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgdiA9IHRoaXMuI3ZhbExpc3RbaW5kZXhdO1xuICAgICAgICAgICAgICAgICAgICBpZiAodGhpcy4jaXNCYWNrZ3JvdW5kRmV0Y2godikpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHYuX19hYm9ydENvbnRyb2xsZXIuYWJvcnQobmV3IEVycm9yKCdkZWxldGVkJykpO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIGVsc2UgaWYgKHRoaXMuI2hhc0Rpc3Bvc2UgfHwgdGhpcy4jaGFzRGlzcG9zZUFmdGVyKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAodGhpcy4jaGFzRGlzcG9zZSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuI2Rpc3Bvc2U/Lih2LCBrLCByZWFzb24pO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHRoaXMuI2hhc0Rpc3Bvc2VBZnRlcikge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuI2Rpc3Bvc2VkPy5wdXNoKFt2LCBrLCByZWFzb25dKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB0aGlzLiNrZXlNYXAuZGVsZXRlKGspO1xuICAgICAgICAgICAgICAgICAgICB0aGlzLiNrZXlMaXN0W2luZGV4XSA9IHVuZGVmaW5lZDtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy4jdmFsTGlzdFtpbmRleF0gPSB1bmRlZmluZWQ7XG4gICAgICAgICAgICAgICAgICAgIGlmIChpbmRleCA9PT0gdGhpcy4jdGFpbCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy4jdGFpbCA9IHRoaXMuI3ByZXZbaW5kZXhdO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIGVsc2UgaWYgKGluZGV4ID09PSB0aGlzLiNoZWFkKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLiNoZWFkID0gdGhpcy4jbmV4dFtpbmRleF07XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBwaSA9IHRoaXMuI3ByZXZbaW5kZXhdO1xuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy4jbmV4dFtwaV0gPSB0aGlzLiNuZXh0W2luZGV4XTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IG5pID0gdGhpcy4jbmV4dFtpbmRleF07XG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLiNwcmV2W25pXSA9IHRoaXMuI3ByZXZbaW5kZXhdO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuI3NpemUtLTtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy4jZnJlZS5wdXNoKGluZGV4KTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHRoaXMuI2hhc0Rpc3Bvc2VBZnRlciAmJiB0aGlzLiNkaXNwb3NlZD8ubGVuZ3RoKSB7XG4gICAgICAgICAgICBjb25zdCBkdCA9IHRoaXMuI2Rpc3Bvc2VkO1xuICAgICAgICAgICAgbGV0IHRhc2s7XG4gICAgICAgICAgICB3aGlsZSAoKHRhc2sgPSBkdD8uc2hpZnQoKSkpIHtcbiAgICAgICAgICAgICAgICB0aGlzLiNkaXNwb3NlQWZ0ZXI/LiguLi50YXNrKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gZGVsZXRlZDtcbiAgICB9XG4gICAgLyoqXG4gICAgICogQ2xlYXIgdGhlIGNhY2hlIGVudGlyZWx5LCB0aHJvd2luZyBhd2F5IGFsbCB2YWx1ZXMuXG4gICAgICovXG4gICAgY2xlYXIoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLiNjbGVhcignZGVsZXRlJyk7XG4gICAgfVxuICAgICNjbGVhcihyZWFzb24pIHtcbiAgICAgICAgZm9yIChjb25zdCBpbmRleCBvZiB0aGlzLiNyaW5kZXhlcyh7IGFsbG93U3RhbGU6IHRydWUgfSkpIHtcbiAgICAgICAgICAgIGNvbnN0IHYgPSB0aGlzLiN2YWxMaXN0W2luZGV4XTtcbiAgICAgICAgICAgIGlmICh0aGlzLiNpc0JhY2tncm91bmRGZXRjaCh2KSkge1xuICAgICAgICAgICAgICAgIHYuX19hYm9ydENvbnRyb2xsZXIuYWJvcnQobmV3IEVycm9yKCdkZWxldGVkJykpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgY29uc3QgayA9IHRoaXMuI2tleUxpc3RbaW5kZXhdO1xuICAgICAgICAgICAgICAgIGlmICh0aGlzLiNoYXNEaXNwb3NlKSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuI2Rpc3Bvc2U/Lih2LCBrLCByZWFzb24pO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBpZiAodGhpcy4jaGFzRGlzcG9zZUFmdGVyKSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuI2Rpc3Bvc2VkPy5wdXNoKFt2LCBrLCByZWFzb25dKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy4ja2V5TWFwLmNsZWFyKCk7XG4gICAgICAgIHRoaXMuI3ZhbExpc3QuZmlsbCh1bmRlZmluZWQpO1xuICAgICAgICB0aGlzLiNrZXlMaXN0LmZpbGwodW5kZWZpbmVkKTtcbiAgICAgICAgaWYgKHRoaXMuI3R0bHMgJiYgdGhpcy4jc3RhcnRzKSB7XG4gICAgICAgICAgICB0aGlzLiN0dGxzLmZpbGwoMCk7XG4gICAgICAgICAgICB0aGlzLiNzdGFydHMuZmlsbCgwKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAodGhpcy4jc2l6ZXMpIHtcbiAgICAgICAgICAgIHRoaXMuI3NpemVzLmZpbGwoMCk7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy4jaGVhZCA9IDA7XG4gICAgICAgIHRoaXMuI3RhaWwgPSAwO1xuICAgICAgICB0aGlzLiNmcmVlLmxlbmd0aCA9IDA7XG4gICAgICAgIHRoaXMuI2NhbGN1bGF0ZWRTaXplID0gMDtcbiAgICAgICAgdGhpcy4jc2l6ZSA9IDA7XG4gICAgICAgIGlmICh0aGlzLiNoYXNEaXNwb3NlQWZ0ZXIgJiYgdGhpcy4jZGlzcG9zZWQpIHtcbiAgICAgICAgICAgIGNvbnN0IGR0ID0gdGhpcy4jZGlzcG9zZWQ7XG4gICAgICAgICAgICBsZXQgdGFzaztcbiAgICAgICAgICAgIHdoaWxlICgodGFzayA9IGR0Py5zaGlmdCgpKSkge1xuICAgICAgICAgICAgICAgIHRoaXMuI2Rpc3Bvc2VBZnRlcj8uKC4uLnRhc2spO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxufVxuZXhwb3J0cy5MUlVDYWNoZSA9IExSVUNhY2hlO1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9aW5kZXguanMubWFwIiwKICAgICJcInVzZSBzdHJpY3RcIjtcbnZhciBfX2ltcG9ydERlZmF1bHQgPSAodGhpcyAmJiB0aGlzLl9faW1wb3J0RGVmYXVsdCkgfHwgZnVuY3Rpb24gKG1vZCkge1xuICAgIHJldHVybiAobW9kICYmIG1vZC5fX2VzTW9kdWxlKSA/IG1vZCA6IHsgXCJkZWZhdWx0XCI6IG1vZCB9O1xufTtcbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIl9fZXNNb2R1bGVcIiwgeyB2YWx1ZTogdHJ1ZSB9KTtcbmV4cG9ydHMuTWluaXBhc3MgPSBleHBvcnRzLmlzV3JpdGFibGUgPSBleHBvcnRzLmlzUmVhZGFibGUgPSBleHBvcnRzLmlzU3RyZWFtID0gdm9pZCAwO1xuY29uc3QgcHJvYyA9IHR5cGVvZiBwcm9jZXNzID09PSAnb2JqZWN0JyAmJiBwcm9jZXNzXG4gICAgPyBwcm9jZXNzXG4gICAgOiB7XG4gICAgICAgIHN0ZG91dDogbnVsbCxcbiAgICAgICAgc3RkZXJyOiBudWxsLFxuICAgIH07XG5jb25zdCBub2RlX2V2ZW50c18xID0gcmVxdWlyZShcIm5vZGU6ZXZlbnRzXCIpO1xuY29uc3Qgbm9kZV9zdHJlYW1fMSA9IF9faW1wb3J0RGVmYXVsdChyZXF1aXJlKFwibm9kZTpzdHJlYW1cIikpO1xuY29uc3Qgbm9kZV9zdHJpbmdfZGVjb2Rlcl8xID0gcmVxdWlyZShcIm5vZGU6c3RyaW5nX2RlY29kZXJcIik7XG4vKipcbiAqIFJldHVybiB0cnVlIGlmIHRoZSBhcmd1bWVudCBpcyBhIE1pbmlwYXNzIHN0cmVhbSwgTm9kZSBzdHJlYW0sIG9yIHNvbWV0aGluZ1xuICogZWxzZSB0aGF0IE1pbmlwYXNzIGNhbiBpbnRlcmFjdCB3aXRoLlxuICovXG5jb25zdCBpc1N0cmVhbSA9IChzKSA9PiAhIXMgJiZcbiAgICB0eXBlb2YgcyA9PT0gJ29iamVjdCcgJiZcbiAgICAocyBpbnN0YW5jZW9mIE1pbmlwYXNzIHx8XG4gICAgICAgIHMgaW5zdGFuY2VvZiBub2RlX3N0cmVhbV8xLmRlZmF1bHQgfHxcbiAgICAgICAgKDAsIGV4cG9ydHMuaXNSZWFkYWJsZSkocykgfHxcbiAgICAgICAgKDAsIGV4cG9ydHMuaXNXcml0YWJsZSkocykpO1xuZXhwb3J0cy5pc1N0cmVhbSA9IGlzU3RyZWFtO1xuLyoqXG4gKiBSZXR1cm4gdHJ1ZSBpZiB0aGUgYXJndW1lbnQgaXMgYSB2YWxpZCB7QGxpbmsgTWluaXBhc3MuUmVhZGFibGV9XG4gKi9cbmNvbnN0IGlzUmVhZGFibGUgPSAocykgPT4gISFzICYmXG4gICAgdHlwZW9mIHMgPT09ICdvYmplY3QnICYmXG4gICAgcyBpbnN0YW5jZW9mIG5vZGVfZXZlbnRzXzEuRXZlbnRFbWl0dGVyICYmXG4gICAgdHlwZW9mIHMucGlwZSA9PT0gJ2Z1bmN0aW9uJyAmJlxuICAgIC8vIG5vZGUgY29yZSBXcml0YWJsZSBzdHJlYW1zIGhhdmUgYSBwaXBlKCkgbWV0aG9kLCBidXQgaXQgdGhyb3dzXG4gICAgcy5waXBlICE9PSBub2RlX3N0cmVhbV8xLmRlZmF1bHQuV3JpdGFibGUucHJvdG90eXBlLnBpcGU7XG5leHBvcnRzLmlzUmVhZGFibGUgPSBpc1JlYWRhYmxlO1xuLyoqXG4gKiBSZXR1cm4gdHJ1ZSBpZiB0aGUgYXJndW1lbnQgaXMgYSB2YWxpZCB7QGxpbmsgTWluaXBhc3MuV3JpdGFibGV9XG4gKi9cbmNvbnN0IGlzV3JpdGFibGUgPSAocykgPT4gISFzICYmXG4gICAgdHlwZW9mIHMgPT09ICdvYmplY3QnICYmXG4gICAgcyBpbnN0YW5jZW9mIG5vZGVfZXZlbnRzXzEuRXZlbnRFbWl0dGVyICYmXG4gICAgdHlwZW9mIHMud3JpdGUgPT09ICdmdW5jdGlvbicgJiZcbiAgICB0eXBlb2Ygcy5lbmQgPT09ICdmdW5jdGlvbic7XG5leHBvcnRzLmlzV3JpdGFibGUgPSBpc1dyaXRhYmxlO1xuY29uc3QgRU9GID0gU3ltYm9sKCdFT0YnKTtcbmNvbnN0IE1BWUJFX0VNSVRfRU5EID0gU3ltYm9sKCdtYXliZUVtaXRFbmQnKTtcbmNvbnN0IEVNSVRURURfRU5EID0gU3ltYm9sKCdlbWl0dGVkRW5kJyk7XG5jb25zdCBFTUlUVElOR19FTkQgPSBTeW1ib2woJ2VtaXR0aW5nRW5kJyk7XG5jb25zdCBFTUlUVEVEX0VSUk9SID0gU3ltYm9sKCdlbWl0dGVkRXJyb3InKTtcbmNvbnN0IENMT1NFRCA9IFN5bWJvbCgnY2xvc2VkJyk7XG5jb25zdCBSRUFEID0gU3ltYm9sKCdyZWFkJyk7XG5jb25zdCBGTFVTSCA9IFN5bWJvbCgnZmx1c2gnKTtcbmNvbnN0IEZMVVNIQ0hVTksgPSBTeW1ib2woJ2ZsdXNoQ2h1bmsnKTtcbmNvbnN0IEVOQ09ESU5HID0gU3ltYm9sKCdlbmNvZGluZycpO1xuY29uc3QgREVDT0RFUiA9IFN5bWJvbCgnZGVjb2RlcicpO1xuY29uc3QgRkxPV0lORyA9IFN5bWJvbCgnZmxvd2luZycpO1xuY29uc3QgUEFVU0VEID0gU3ltYm9sKCdwYXVzZWQnKTtcbmNvbnN0IFJFU1VNRSA9IFN5bWJvbCgncmVzdW1lJyk7XG5jb25zdCBCVUZGRVIgPSBTeW1ib2woJ2J1ZmZlcicpO1xuY29uc3QgUElQRVMgPSBTeW1ib2woJ3BpcGVzJyk7XG5jb25zdCBCVUZGRVJMRU5HVEggPSBTeW1ib2woJ2J1ZmZlckxlbmd0aCcpO1xuY29uc3QgQlVGRkVSUFVTSCA9IFN5bWJvbCgnYnVmZmVyUHVzaCcpO1xuY29uc3QgQlVGRkVSU0hJRlQgPSBTeW1ib2woJ2J1ZmZlclNoaWZ0Jyk7XG5jb25zdCBPQkpFQ1RNT0RFID0gU3ltYm9sKCdvYmplY3RNb2RlJyk7XG4vLyBpbnRlcm5hbCBldmVudCB3aGVuIHN0cmVhbSBpcyBkZXN0cm95ZWRcbmNvbnN0IERFU1RST1lFRCA9IFN5bWJvbCgnZGVzdHJveWVkJyk7XG4vLyBpbnRlcm5hbCBldmVudCB3aGVuIHN0cmVhbSBoYXMgYW4gZXJyb3JcbmNvbnN0IEVSUk9SID0gU3ltYm9sKCdlcnJvcicpO1xuY29uc3QgRU1JVERBVEEgPSBTeW1ib2woJ2VtaXREYXRhJyk7XG5jb25zdCBFTUlURU5EID0gU3ltYm9sKCdlbWl0RW5kJyk7XG5jb25zdCBFTUlURU5EMiA9IFN5bWJvbCgnZW1pdEVuZDInKTtcbmNvbnN0IEFTWU5DID0gU3ltYm9sKCdhc3luYycpO1xuY29uc3QgQUJPUlQgPSBTeW1ib2woJ2Fib3J0Jyk7XG5jb25zdCBBQk9SVEVEID0gU3ltYm9sKCdhYm9ydGVkJyk7XG5jb25zdCBTSUdOQUwgPSBTeW1ib2woJ3NpZ25hbCcpO1xuY29uc3QgREFUQUxJU1RFTkVSUyA9IFN5bWJvbCgnZGF0YUxpc3RlbmVycycpO1xuY29uc3QgRElTQ0FSREVEID0gU3ltYm9sKCdkaXNjYXJkZWQnKTtcbmNvbnN0IGRlZmVyID0gKGZuKSA9PiBQcm9taXNlLnJlc29sdmUoKS50aGVuKGZuKTtcbmNvbnN0IG5vZGVmZXIgPSAoZm4pID0+IGZuKCk7XG5jb25zdCBpc0VuZGlzaCA9IChldikgPT4gZXYgPT09ICdlbmQnIHx8IGV2ID09PSAnZmluaXNoJyB8fCBldiA9PT0gJ3ByZWZpbmlzaCc7XG5jb25zdCBpc0FycmF5QnVmZmVyTGlrZSA9IChiKSA9PiBiIGluc3RhbmNlb2YgQXJyYXlCdWZmZXIgfHxcbiAgICAoISFiICYmXG4gICAgICAgIHR5cGVvZiBiID09PSAnb2JqZWN0JyAmJlxuICAgICAgICBiLmNvbnN0cnVjdG9yICYmXG4gICAgICAgIGIuY29uc3RydWN0b3IubmFtZSA9PT0gJ0FycmF5QnVmZmVyJyAmJlxuICAgICAgICBiLmJ5dGVMZW5ndGggPj0gMCk7XG5jb25zdCBpc0FycmF5QnVmZmVyVmlldyA9IChiKSA9PiAhQnVmZmVyLmlzQnVmZmVyKGIpICYmIEFycmF5QnVmZmVyLmlzVmlldyhiKTtcbi8qKlxuICogSW50ZXJuYWwgY2xhc3MgcmVwcmVzZW50aW5nIGEgcGlwZSB0byBhIGRlc3RpbmF0aW9uIHN0cmVhbS5cbiAqXG4gKiBAaW50ZXJuYWxcbiAqL1xuY2xhc3MgUGlwZSB7XG4gICAgc3JjO1xuICAgIGRlc3Q7XG4gICAgb3B0cztcbiAgICBvbmRyYWluO1xuICAgIGNvbnN0cnVjdG9yKHNyYywgZGVzdCwgb3B0cykge1xuICAgICAgICB0aGlzLnNyYyA9IHNyYztcbiAgICAgICAgdGhpcy5kZXN0ID0gZGVzdDtcbiAgICAgICAgdGhpcy5vcHRzID0gb3B0cztcbiAgICAgICAgdGhpcy5vbmRyYWluID0gKCkgPT4gc3JjW1JFU1VNRV0oKTtcbiAgICAgICAgdGhpcy5kZXN0Lm9uKCdkcmFpbicsIHRoaXMub25kcmFpbik7XG4gICAgfVxuICAgIHVucGlwZSgpIHtcbiAgICAgICAgdGhpcy5kZXN0LnJlbW92ZUxpc3RlbmVyKCdkcmFpbicsIHRoaXMub25kcmFpbik7XG4gICAgfVxuICAgIC8vIG9ubHkgaGVyZSBmb3IgdGhlIHByb3RvdHlwZVxuICAgIC8qIGM4IGlnbm9yZSBzdGFydCAqL1xuICAgIHByb3h5RXJyb3JzKF9lcikgeyB9XG4gICAgLyogYzggaWdub3JlIHN0b3AgKi9cbiAgICBlbmQoKSB7XG4gICAgICAgIHRoaXMudW5waXBlKCk7XG4gICAgICAgIGlmICh0aGlzLm9wdHMuZW5kKVxuICAgICAgICAgICAgdGhpcy5kZXN0LmVuZCgpO1xuICAgIH1cbn1cbi8qKlxuICogSW50ZXJuYWwgY2xhc3MgcmVwcmVzZW50aW5nIGEgcGlwZSB0byBhIGRlc3RpbmF0aW9uIHN0cmVhbSB3aGVyZVxuICogZXJyb3JzIGFyZSBwcm94aWVkLlxuICpcbiAqIEBpbnRlcm5hbFxuICovXG5jbGFzcyBQaXBlUHJveHlFcnJvcnMgZXh0ZW5kcyBQaXBlIHtcbiAgICB1bnBpcGUoKSB7XG4gICAgICAgIHRoaXMuc3JjLnJlbW92ZUxpc3RlbmVyKCdlcnJvcicsIHRoaXMucHJveHlFcnJvcnMpO1xuICAgICAgICBzdXBlci51bnBpcGUoKTtcbiAgICB9XG4gICAgY29uc3RydWN0b3Ioc3JjLCBkZXN0LCBvcHRzKSB7XG4gICAgICAgIHN1cGVyKHNyYywgZGVzdCwgb3B0cyk7XG4gICAgICAgIHRoaXMucHJveHlFcnJvcnMgPSBlciA9PiBkZXN0LmVtaXQoJ2Vycm9yJywgZXIpO1xuICAgICAgICBzcmMub24oJ2Vycm9yJywgdGhpcy5wcm94eUVycm9ycyk7XG4gICAgfVxufVxuY29uc3QgaXNPYmplY3RNb2RlT3B0aW9ucyA9IChvKSA9PiAhIW8ub2JqZWN0TW9kZTtcbmNvbnN0IGlzRW5jb2RpbmdPcHRpb25zID0gKG8pID0+ICFvLm9iamVjdE1vZGUgJiYgISFvLmVuY29kaW5nICYmIG8uZW5jb2RpbmcgIT09ICdidWZmZXInO1xuLyoqXG4gKiBNYWluIGV4cG9ydCwgdGhlIE1pbmlwYXNzIGNsYXNzXG4gKlxuICogYFJUeXBlYCBpcyB0aGUgdHlwZSBvZiBkYXRhIGVtaXR0ZWQsIGRlZmF1bHRzIHRvIEJ1ZmZlclxuICpcbiAqIGBXVHlwZWAgaXMgdGhlIHR5cGUgb2YgZGF0YSB0byBiZSB3cml0dGVuLCBpZiBSVHlwZSBpcyBidWZmZXIgb3Igc3RyaW5nLFxuICogdGhlbiBhbnkge0BsaW5rIE1pbmlwYXNzLkNvbnRpZ3VvdXNEYXRhfSBpcyBhbGxvd2VkLlxuICpcbiAqIGBFdmVudHNgIGlzIHRoZSBzZXQgb2YgZXZlbnQgaGFuZGxlciBzaWduYXR1cmVzIHRoYXQgdGhpcyBvYmplY3RcbiAqIHdpbGwgZW1pdCwgc2VlIHtAbGluayBNaW5pcGFzcy5FdmVudHN9XG4gKi9cbmNsYXNzIE1pbmlwYXNzIGV4dGVuZHMgbm9kZV9ldmVudHNfMS5FdmVudEVtaXR0ZXIge1xuICAgIFtGTE9XSU5HXSA9IGZhbHNlO1xuICAgIFtQQVVTRURdID0gZmFsc2U7XG4gICAgW1BJUEVTXSA9IFtdO1xuICAgIFtCVUZGRVJdID0gW107XG4gICAgW09CSkVDVE1PREVdO1xuICAgIFtFTkNPRElOR107XG4gICAgW0FTWU5DXTtcbiAgICBbREVDT0RFUl07XG4gICAgW0VPRl0gPSBmYWxzZTtcbiAgICBbRU1JVFRFRF9FTkRdID0gZmFsc2U7XG4gICAgW0VNSVRUSU5HX0VORF0gPSBmYWxzZTtcbiAgICBbQ0xPU0VEXSA9IGZhbHNlO1xuICAgIFtFTUlUVEVEX0VSUk9SXSA9IG51bGw7XG4gICAgW0JVRkZFUkxFTkdUSF0gPSAwO1xuICAgIFtERVNUUk9ZRURdID0gZmFsc2U7XG4gICAgW1NJR05BTF07XG4gICAgW0FCT1JURURdID0gZmFsc2U7XG4gICAgW0RBVEFMSVNURU5FUlNdID0gMDtcbiAgICBbRElTQ0FSREVEXSA9IGZhbHNlO1xuICAgIC8qKlxuICAgICAqIHRydWUgaWYgdGhlIHN0cmVhbSBjYW4gYmUgd3JpdHRlblxuICAgICAqL1xuICAgIHdyaXRhYmxlID0gdHJ1ZTtcbiAgICAvKipcbiAgICAgKiB0cnVlIGlmIHRoZSBzdHJlYW0gY2FuIGJlIHJlYWRcbiAgICAgKi9cbiAgICByZWFkYWJsZSA9IHRydWU7XG4gICAgLyoqXG4gICAgICogSWYgYFJUeXBlYCBpcyBCdWZmZXIsIHRoZW4gb3B0aW9ucyBkbyBub3QgbmVlZCB0byBiZSBwcm92aWRlZC5cbiAgICAgKiBPdGhlcndpc2UsIGFuIG9wdGlvbnMgb2JqZWN0IG11c3QgYmUgcHJvdmlkZWQgdG8gc3BlY2lmeSBlaXRoZXJcbiAgICAgKiB7QGxpbmsgTWluaXBhc3MuU2hhcmVkT3B0aW9ucy5vYmplY3RNb2RlfSBvclxuICAgICAqIHtAbGluayBNaW5pcGFzcy5TaGFyZWRPcHRpb25zLmVuY29kaW5nfSwgYXMgYXBwcm9wcmlhdGUuXG4gICAgICovXG4gICAgY29uc3RydWN0b3IoLi4uYXJncykge1xuICAgICAgICBjb25zdCBvcHRpb25zID0gKGFyZ3NbMF0gfHxcbiAgICAgICAgICAgIHt9KTtcbiAgICAgICAgc3VwZXIoKTtcbiAgICAgICAgaWYgKG9wdGlvbnMub2JqZWN0TW9kZSAmJiB0eXBlb2Ygb3B0aW9ucy5lbmNvZGluZyA9PT0gJ3N0cmluZycpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoJ0VuY29kaW5nIGFuZCBvYmplY3RNb2RlIG1heSBub3QgYmUgdXNlZCB0b2dldGhlcicpO1xuICAgICAgICB9XG4gICAgICAgIGlmIChpc09iamVjdE1vZGVPcHRpb25zKG9wdGlvbnMpKSB7XG4gICAgICAgICAgICB0aGlzW09CSkVDVE1PREVdID0gdHJ1ZTtcbiAgICAgICAgICAgIHRoaXNbRU5DT0RJTkddID0gbnVsbDtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIGlmIChpc0VuY29kaW5nT3B0aW9ucyhvcHRpb25zKSkge1xuICAgICAgICAgICAgdGhpc1tFTkNPRElOR10gPSBvcHRpb25zLmVuY29kaW5nO1xuICAgICAgICAgICAgdGhpc1tPQkpFQ1RNT0RFXSA9IGZhbHNlO1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgdGhpc1tPQkpFQ1RNT0RFXSA9IGZhbHNlO1xuICAgICAgICAgICAgdGhpc1tFTkNPRElOR10gPSBudWxsO1xuICAgICAgICB9XG4gICAgICAgIHRoaXNbQVNZTkNdID0gISFvcHRpb25zLmFzeW5jO1xuICAgICAgICB0aGlzW0RFQ09ERVJdID0gdGhpc1tFTkNPRElOR11cbiAgICAgICAgICAgID8gbmV3IG5vZGVfc3RyaW5nX2RlY29kZXJfMS5TdHJpbmdEZWNvZGVyKHRoaXNbRU5DT0RJTkddKVxuICAgICAgICAgICAgOiBudWxsO1xuICAgICAgICAvL0B0cy1pZ25vcmUgLSBwcml2YXRlIG9wdGlvbiBmb3IgZGVidWdnaW5nIGFuZCB0ZXN0aW5nXG4gICAgICAgIGlmIChvcHRpb25zICYmIG9wdGlvbnMuZGVidWdFeHBvc2VCdWZmZXIgPT09IHRydWUpIHtcbiAgICAgICAgICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0aGlzLCAnYnVmZmVyJywgeyBnZXQ6ICgpID0+IHRoaXNbQlVGRkVSXSB9KTtcbiAgICAgICAgfVxuICAgICAgICAvL0B0cy1pZ25vcmUgLSBwcml2YXRlIG9wdGlvbiBmb3IgZGVidWdnaW5nIGFuZCB0ZXN0aW5nXG4gICAgICAgIGlmIChvcHRpb25zICYmIG9wdGlvbnMuZGVidWdFeHBvc2VQaXBlcyA9PT0gdHJ1ZSkge1xuICAgICAgICAgICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KHRoaXMsICdwaXBlcycsIHsgZ2V0OiAoKSA9PiB0aGlzW1BJUEVTXSB9KTtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCB7IHNpZ25hbCB9ID0gb3B0aW9ucztcbiAgICAgICAgaWYgKHNpZ25hbCkge1xuICAgICAgICAgICAgdGhpc1tTSUdOQUxdID0gc2lnbmFsO1xuICAgICAgICAgICAgaWYgKHNpZ25hbC5hYm9ydGVkKSB7XG4gICAgICAgICAgICAgICAgdGhpc1tBQk9SVF0oKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgIHNpZ25hbC5hZGRFdmVudExpc3RlbmVyKCdhYm9ydCcsICgpID0+IHRoaXNbQUJPUlRdKCkpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxuICAgIC8qKlxuICAgICAqIFRoZSBhbW91bnQgb2YgZGF0YSBzdG9yZWQgaW4gdGhlIGJ1ZmZlciB3YWl0aW5nIHRvIGJlIHJlYWQuXG4gICAgICpcbiAgICAgKiBGb3IgQnVmZmVyIHN0cmluZ3MsIHRoaXMgd2lsbCBiZSB0aGUgdG90YWwgYnl0ZSBsZW5ndGguXG4gICAgICogRm9yIHN0cmluZyBlbmNvZGluZyBzdHJlYW1zLCB0aGlzIHdpbGwgYmUgdGhlIHN0cmluZyBjaGFyYWN0ZXIgbGVuZ3RoLFxuICAgICAqIGFjY29yZGluZyB0byBKYXZhU2NyaXB0J3MgYHN0cmluZy5sZW5ndGhgIGxvZ2ljLlxuICAgICAqIEZvciBvYmplY3RNb2RlIHN0cmVhbXMsIHRoaXMgaXMgYSBjb3VudCBvZiB0aGUgaXRlbXMgd2FpdGluZyB0byBiZVxuICAgICAqIGVtaXR0ZWQuXG4gICAgICovXG4gICAgZ2V0IGJ1ZmZlckxlbmd0aCgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXNbQlVGRkVSTEVOR1RIXTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogVGhlIGBCdWZmZXJFbmNvZGluZ2AgY3VycmVudGx5IGluIHVzZSwgb3IgYG51bGxgXG4gICAgICovXG4gICAgZ2V0IGVuY29kaW5nKCkge1xuICAgICAgICByZXR1cm4gdGhpc1tFTkNPRElOR107XG4gICAgfVxuICAgIC8qKlxuICAgICAqIEBkZXByZWNhdGVkIC0gVGhpcyBpcyBhIHJlYWQgb25seSBwcm9wZXJ0eVxuICAgICAqL1xuICAgIHNldCBlbmNvZGluZyhfZW5jKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcignRW5jb2RpbmcgbXVzdCBiZSBzZXQgYXQgaW5zdGFudGlhdGlvbiB0aW1lJyk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIEBkZXByZWNhdGVkIC0gRW5jb2RpbmcgbWF5IG9ubHkgYmUgc2V0IGF0IGluc3RhbnRpYXRpb24gdGltZVxuICAgICAqL1xuICAgIHNldEVuY29kaW5nKF9lbmMpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdFbmNvZGluZyBtdXN0IGJlIHNldCBhdCBpbnN0YW50aWF0aW9uIHRpbWUnKTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogVHJ1ZSBpZiB0aGlzIGlzIGFuIG9iamVjdE1vZGUgc3RyZWFtXG4gICAgICovXG4gICAgZ2V0IG9iamVjdE1vZGUoKSB7XG4gICAgICAgIHJldHVybiB0aGlzW09CSkVDVE1PREVdO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBAZGVwcmVjYXRlZCAtIFRoaXMgaXMgYSByZWFkLW9ubHkgcHJvcGVydHlcbiAgICAgKi9cbiAgICBzZXQgb2JqZWN0TW9kZShfb20pIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdvYmplY3RNb2RlIG11c3QgYmUgc2V0IGF0IGluc3RhbnRpYXRpb24gdGltZScpO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiB0cnVlIGlmIHRoaXMgaXMgYW4gYXN5bmMgc3RyZWFtXG4gICAgICovXG4gICAgZ2V0IFsnYXN5bmMnXSgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXNbQVNZTkNdO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBTZXQgdG8gdHJ1ZSB0byBtYWtlIHRoaXMgc3RyZWFtIGFzeW5jLlxuICAgICAqXG4gICAgICogT25jZSBzZXQsIGl0IGNhbm5vdCBiZSB1bnNldCwgYXMgdGhpcyB3b3VsZCBwb3RlbnRpYWxseSBjYXVzZSBpbmNvcnJlY3RcbiAgICAgKiBiZWhhdmlvci4gIEllLCBhIHN5bmMgc3RyZWFtIGNhbiBiZSBtYWRlIGFzeW5jLCBidXQgYW4gYXN5bmMgc3RyZWFtXG4gICAgICogY2Fubm90IGJlIHNhZmVseSBtYWRlIHN5bmMuXG4gICAgICovXG4gICAgc2V0IFsnYXN5bmMnXShhKSB7XG4gICAgICAgIHRoaXNbQVNZTkNdID0gdGhpc1tBU1lOQ10gfHwgISFhO1xuICAgIH1cbiAgICAvLyBkcm9wIGV2ZXJ5dGhpbmcgYW5kIGdldCBvdXQgb2YgdGhlIGZsb3cgY29tcGxldGVseVxuICAgIFtBQk9SVF0oKSB7XG4gICAgICAgIHRoaXNbQUJPUlRFRF0gPSB0cnVlO1xuICAgICAgICB0aGlzLmVtaXQoJ2Fib3J0JywgdGhpc1tTSUdOQUxdPy5yZWFzb24pO1xuICAgICAgICB0aGlzLmRlc3Ryb3kodGhpc1tTSUdOQUxdPy5yZWFzb24pO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBUcnVlIGlmIHRoZSBzdHJlYW0gaGFzIGJlZW4gYWJvcnRlZC5cbiAgICAgKi9cbiAgICBnZXQgYWJvcnRlZCgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXNbQUJPUlRFRF07XG4gICAgfVxuICAgIC8qKlxuICAgICAqIE5vLW9wIHNldHRlci4gU3RyZWFtIGFib3J0ZWQgc3RhdHVzIGlzIHNldCB2aWEgdGhlIEFib3J0U2lnbmFsIHByb3ZpZGVkXG4gICAgICogaW4gdGhlIGNvbnN0cnVjdG9yIG9wdGlvbnMuXG4gICAgICovXG4gICAgc2V0IGFib3J0ZWQoXykgeyB9XG4gICAgd3JpdGUoY2h1bmssIGVuY29kaW5nLCBjYikge1xuICAgICAgICBpZiAodGhpc1tBQk9SVEVEXSlcbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgaWYgKHRoaXNbRU9GXSlcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcignd3JpdGUgYWZ0ZXIgZW5kJyk7XG4gICAgICAgIGlmICh0aGlzW0RFU1RST1lFRF0pIHtcbiAgICAgICAgICAgIHRoaXMuZW1pdCgnZXJyb3InLCBPYmplY3QuYXNzaWduKG5ldyBFcnJvcignQ2Fubm90IGNhbGwgd3JpdGUgYWZ0ZXIgYSBzdHJlYW0gd2FzIGRlc3Ryb3llZCcpLCB7IGNvZGU6ICdFUlJfU1RSRUFNX0RFU1RST1lFRCcgfSkpO1xuICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHR5cGVvZiBlbmNvZGluZyA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICAgICAgY2IgPSBlbmNvZGluZztcbiAgICAgICAgICAgIGVuY29kaW5nID0gJ3V0ZjgnO1xuICAgICAgICB9XG4gICAgICAgIGlmICghZW5jb2RpbmcpXG4gICAgICAgICAgICBlbmNvZGluZyA9ICd1dGY4JztcbiAgICAgICAgY29uc3QgZm4gPSB0aGlzW0FTWU5DXSA/IGRlZmVyIDogbm9kZWZlcjtcbiAgICAgICAgLy8gY29udmVydCBhcnJheSBidWZmZXJzIGFuZCB0eXBlZCBhcnJheSB2aWV3cyBpbnRvIGJ1ZmZlcnNcbiAgICAgICAgLy8gYXQgc29tZSBwb2ludCBpbiB0aGUgZnV0dXJlLCB3ZSBtYXkgd2FudCB0byBkbyB0aGUgb3Bwb3NpdGUhXG4gICAgICAgIC8vIGxlYXZlIHN0cmluZ3MgYW5kIGJ1ZmZlcnMgYXMtaXNcbiAgICAgICAgLy8gYW55dGhpbmcgaXMgb25seSBhbGxvd2VkIGlmIGluIG9iamVjdCBtb2RlLCBzbyB0aHJvd1xuICAgICAgICBpZiAoIXRoaXNbT0JKRUNUTU9ERV0gJiYgIUJ1ZmZlci5pc0J1ZmZlcihjaHVuaykpIHtcbiAgICAgICAgICAgIGlmIChpc0FycmF5QnVmZmVyVmlldyhjaHVuaykpIHtcbiAgICAgICAgICAgICAgICAvL0B0cy1pZ25vcmUgLSBzaW5mdWwgdW5zYWZlIHR5cGUgY2hhbmdpbmdcbiAgICAgICAgICAgICAgICBjaHVuayA9IEJ1ZmZlci5mcm9tKGNodW5rLmJ1ZmZlciwgY2h1bmsuYnl0ZU9mZnNldCwgY2h1bmsuYnl0ZUxlbmd0aCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIGlmIChpc0FycmF5QnVmZmVyTGlrZShjaHVuaykpIHtcbiAgICAgICAgICAgICAgICAvL0B0cy1pZ25vcmUgLSBzaW5mdWwgdW5zYWZlIHR5cGUgY2hhbmdpbmdcbiAgICAgICAgICAgICAgICBjaHVuayA9IEJ1ZmZlci5mcm9tKGNodW5rKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2UgaWYgKHR5cGVvZiBjaHVuayAhPT0gJ3N0cmluZycpIHtcbiAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ05vbi1jb250aWd1b3VzIGRhdGEgd3JpdHRlbiB0byBub24tb2JqZWN0TW9kZSBzdHJlYW0nKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICAvLyBoYW5kbGUgb2JqZWN0IG1vZGUgdXAgZnJvbnQsIHNpbmNlIGl0J3Mgc2ltcGxlclxuICAgICAgICAvLyB0aGlzIHlpZWxkcyBiZXR0ZXIgcGVyZm9ybWFuY2UsIGZld2VyIGNoZWNrcyBsYXRlci5cbiAgICAgICAgaWYgKHRoaXNbT0JKRUNUTU9ERV0pIHtcbiAgICAgICAgICAgIC8vIG1heWJlIGltcG9zc2libGU/XG4gICAgICAgICAgICAvKiBjOCBpZ25vcmUgc3RhcnQgKi9cbiAgICAgICAgICAgIGlmICh0aGlzW0ZMT1dJTkddICYmIHRoaXNbQlVGRkVSTEVOR1RIXSAhPT0gMClcbiAgICAgICAgICAgICAgICB0aGlzW0ZMVVNIXSh0cnVlKTtcbiAgICAgICAgICAgIC8qIGM4IGlnbm9yZSBzdG9wICovXG4gICAgICAgICAgICBpZiAodGhpc1tGTE9XSU5HXSlcbiAgICAgICAgICAgICAgICB0aGlzLmVtaXQoJ2RhdGEnLCBjaHVuayk7XG4gICAgICAgICAgICBlbHNlXG4gICAgICAgICAgICAgICAgdGhpc1tCVUZGRVJQVVNIXShjaHVuayk7XG4gICAgICAgICAgICBpZiAodGhpc1tCVUZGRVJMRU5HVEhdICE9PSAwKVxuICAgICAgICAgICAgICAgIHRoaXMuZW1pdCgncmVhZGFibGUnKTtcbiAgICAgICAgICAgIGlmIChjYilcbiAgICAgICAgICAgICAgICBmbihjYik7XG4gICAgICAgICAgICByZXR1cm4gdGhpc1tGTE9XSU5HXTtcbiAgICAgICAgfVxuICAgICAgICAvLyBhdCB0aGlzIHBvaW50IHRoZSBjaHVuayBpcyBhIGJ1ZmZlciBvciBzdHJpbmdcbiAgICAgICAgLy8gZG9uJ3QgYnVmZmVyIGl0IHVwIG9yIHNlbmQgaXQgdG8gdGhlIGRlY29kZXJcbiAgICAgICAgaWYgKCFjaHVuay5sZW5ndGgpIHtcbiAgICAgICAgICAgIGlmICh0aGlzW0JVRkZFUkxFTkdUSF0gIT09IDApXG4gICAgICAgICAgICAgICAgdGhpcy5lbWl0KCdyZWFkYWJsZScpO1xuICAgICAgICAgICAgaWYgKGNiKVxuICAgICAgICAgICAgICAgIGZuKGNiKTtcbiAgICAgICAgICAgIHJldHVybiB0aGlzW0ZMT1dJTkddO1xuICAgICAgICB9XG4gICAgICAgIC8vIGZhc3QtcGF0aCB3cml0aW5nIHN0cmluZ3Mgb2Ygc2FtZSBlbmNvZGluZyB0byBhIHN0cmVhbSB3aXRoXG4gICAgICAgIC8vIGFuIGVtcHR5IGJ1ZmZlciwgc2tpcHBpbmcgdGhlIGJ1ZmZlci9kZWNvZGVyIGRhbmNlXG4gICAgICAgIGlmICh0eXBlb2YgY2h1bmsgPT09ICdzdHJpbmcnICYmXG4gICAgICAgICAgICAvLyB1bmxlc3MgaXQgaXMgYSBzdHJpbmcgYWxyZWFkeSByZWFkeSBmb3IgdXMgdG8gdXNlXG4gICAgICAgICAgICAhKGVuY29kaW5nID09PSB0aGlzW0VOQ09ESU5HXSAmJiAhdGhpc1tERUNPREVSXT8ubGFzdE5lZWQpKSB7XG4gICAgICAgICAgICAvL0B0cy1pZ25vcmUgLSBzaW5mdWwgdW5zYWZlIHR5cGUgY2hhbmdlXG4gICAgICAgICAgICBjaHVuayA9IEJ1ZmZlci5mcm9tKGNodW5rLCBlbmNvZGluZyk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKEJ1ZmZlci5pc0J1ZmZlcihjaHVuaykgJiYgdGhpc1tFTkNPRElOR10pIHtcbiAgICAgICAgICAgIC8vQHRzLWlnbm9yZSAtIHNpbmZ1bCB1bnNhZmUgdHlwZSBjaGFuZ2VcbiAgICAgICAgICAgIGNodW5rID0gdGhpc1tERUNPREVSXS53cml0ZShjaHVuayk7XG4gICAgICAgIH1cbiAgICAgICAgLy8gTm90ZTogZmx1c2hpbmcgQ0FOIHBvdGVudGlhbGx5IHN3aXRjaCB1cyBpbnRvIG5vdC1mbG93aW5nIG1vZGVcbiAgICAgICAgaWYgKHRoaXNbRkxPV0lOR10gJiYgdGhpc1tCVUZGRVJMRU5HVEhdICE9PSAwKVxuICAgICAgICAgICAgdGhpc1tGTFVTSF0odHJ1ZSk7XG4gICAgICAgIGlmICh0aGlzW0ZMT1dJTkddKVxuICAgICAgICAgICAgdGhpcy5lbWl0KCdkYXRhJywgY2h1bmspO1xuICAgICAgICBlbHNlXG4gICAgICAgICAgICB0aGlzW0JVRkZFUlBVU0hdKGNodW5rKTtcbiAgICAgICAgaWYgKHRoaXNbQlVGRkVSTEVOR1RIXSAhPT0gMClcbiAgICAgICAgICAgIHRoaXMuZW1pdCgncmVhZGFibGUnKTtcbiAgICAgICAgaWYgKGNiKVxuICAgICAgICAgICAgZm4oY2IpO1xuICAgICAgICByZXR1cm4gdGhpc1tGTE9XSU5HXTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogTG93LWxldmVsIGV4cGxpY2l0IHJlYWQgbWV0aG9kLlxuICAgICAqXG4gICAgICogSW4gb2JqZWN0TW9kZSwgdGhlIGFyZ3VtZW50IGlzIGlnbm9yZWQsIGFuZCBvbmUgaXRlbSBpcyByZXR1cm5lZCBpZlxuICAgICAqIGF2YWlsYWJsZS5cbiAgICAgKlxuICAgICAqIGBuYCBpcyB0aGUgbnVtYmVyIG9mIGJ5dGVzIChvciBpbiB0aGUgY2FzZSBvZiBlbmNvZGluZyBzdHJlYW1zLFxuICAgICAqIGNoYXJhY3RlcnMpIHRvIGNvbnN1bWUuIElmIGBuYCBpcyBub3QgcHJvdmlkZWQsIHRoZW4gdGhlIGVudGlyZSBidWZmZXJcbiAgICAgKiBpcyByZXR1cm5lZCwgb3IgYG51bGxgIGlzIHJldHVybmVkIGlmIG5vIGRhdGEgaXMgYXZhaWxhYmxlLlxuICAgICAqXG4gICAgICogSWYgYG5gIGlzIGdyZWF0ZXIgdGhhdCB0aGUgYW1vdW50IG9mIGRhdGEgaW4gdGhlIGludGVybmFsIGJ1ZmZlcixcbiAgICAgKiB0aGVuIGBudWxsYCBpcyByZXR1cm5lZC5cbiAgICAgKi9cbiAgICByZWFkKG4pIHtcbiAgICAgICAgaWYgKHRoaXNbREVTVFJPWUVEXSlcbiAgICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICB0aGlzW0RJU0NBUkRFRF0gPSBmYWxzZTtcbiAgICAgICAgaWYgKHRoaXNbQlVGRkVSTEVOR1RIXSA9PT0gMCB8fFxuICAgICAgICAgICAgbiA9PT0gMCB8fFxuICAgICAgICAgICAgKG4gJiYgbiA+IHRoaXNbQlVGRkVSTEVOR1RIXSkpIHtcbiAgICAgICAgICAgIHRoaXNbTUFZQkVfRU1JVF9FTkRdKCk7XG4gICAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgICAgfVxuICAgICAgICBpZiAodGhpc1tPQkpFQ1RNT0RFXSlcbiAgICAgICAgICAgIG4gPSBudWxsO1xuICAgICAgICBpZiAodGhpc1tCVUZGRVJdLmxlbmd0aCA+IDEgJiYgIXRoaXNbT0JKRUNUTU9ERV0pIHtcbiAgICAgICAgICAgIC8vIG5vdCBvYmplY3QgbW9kZSwgc28gaWYgd2UgaGF2ZSBhbiBlbmNvZGluZywgdGhlbiBSVHlwZSBpcyBzdHJpbmdcbiAgICAgICAgICAgIC8vIG90aGVyd2lzZSwgbXVzdCBiZSBCdWZmZXJcbiAgICAgICAgICAgIHRoaXNbQlVGRkVSXSA9IFtcbiAgICAgICAgICAgICAgICAodGhpc1tFTkNPRElOR11cbiAgICAgICAgICAgICAgICAgICAgPyB0aGlzW0JVRkZFUl0uam9pbignJylcbiAgICAgICAgICAgICAgICAgICAgOiBCdWZmZXIuY29uY2F0KHRoaXNbQlVGRkVSXSwgdGhpc1tCVUZGRVJMRU5HVEhdKSksXG4gICAgICAgICAgICBdO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IHJldCA9IHRoaXNbUkVBRF0obiB8fCBudWxsLCB0aGlzW0JVRkZFUl1bMF0pO1xuICAgICAgICB0aGlzW01BWUJFX0VNSVRfRU5EXSgpO1xuICAgICAgICByZXR1cm4gcmV0O1xuICAgIH1cbiAgICBbUkVBRF0obiwgY2h1bmspIHtcbiAgICAgICAgaWYgKHRoaXNbT0JKRUNUTU9ERV0pXG4gICAgICAgICAgICB0aGlzW0JVRkZFUlNISUZUXSgpO1xuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIGNvbnN0IGMgPSBjaHVuaztcbiAgICAgICAgICAgIGlmIChuID09PSBjLmxlbmd0aCB8fCBuID09PSBudWxsKVxuICAgICAgICAgICAgICAgIHRoaXNbQlVGRkVSU0hJRlRdKCk7XG4gICAgICAgICAgICBlbHNlIGlmICh0eXBlb2YgYyA9PT0gJ3N0cmluZycpIHtcbiAgICAgICAgICAgICAgICB0aGlzW0JVRkZFUl1bMF0gPSBjLnNsaWNlKG4pO1xuICAgICAgICAgICAgICAgIGNodW5rID0gYy5zbGljZSgwLCBuKTtcbiAgICAgICAgICAgICAgICB0aGlzW0JVRkZFUkxFTkdUSF0gLT0gbjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgIHRoaXNbQlVGRkVSXVswXSA9IGMuc3ViYXJyYXkobik7XG4gICAgICAgICAgICAgICAgY2h1bmsgPSBjLnN1YmFycmF5KDAsIG4pO1xuICAgICAgICAgICAgICAgIHRoaXNbQlVGRkVSTEVOR1RIXSAtPSBuO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHRoaXMuZW1pdCgnZGF0YScsIGNodW5rKTtcbiAgICAgICAgaWYgKCF0aGlzW0JVRkZFUl0ubGVuZ3RoICYmICF0aGlzW0VPRl0pXG4gICAgICAgICAgICB0aGlzLmVtaXQoJ2RyYWluJyk7XG4gICAgICAgIHJldHVybiBjaHVuaztcbiAgICB9XG4gICAgZW5kKGNodW5rLCBlbmNvZGluZywgY2IpIHtcbiAgICAgICAgaWYgKHR5cGVvZiBjaHVuayA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICAgICAgY2IgPSBjaHVuaztcbiAgICAgICAgICAgIGNodW5rID0gdW5kZWZpbmVkO1xuICAgICAgICB9XG4gICAgICAgIGlmICh0eXBlb2YgZW5jb2RpbmcgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgICAgIGNiID0gZW5jb2Rpbmc7XG4gICAgICAgICAgICBlbmNvZGluZyA9ICd1dGY4JztcbiAgICAgICAgfVxuICAgICAgICBpZiAoY2h1bmsgIT09IHVuZGVmaW5lZClcbiAgICAgICAgICAgIHRoaXMud3JpdGUoY2h1bmssIGVuY29kaW5nKTtcbiAgICAgICAgaWYgKGNiKVxuICAgICAgICAgICAgdGhpcy5vbmNlKCdlbmQnLCBjYik7XG4gICAgICAgIHRoaXNbRU9GXSA9IHRydWU7XG4gICAgICAgIHRoaXMud3JpdGFibGUgPSBmYWxzZTtcbiAgICAgICAgLy8gaWYgd2UgaGF2ZW4ndCB3cml0dGVuIGFueXRoaW5nLCB0aGVuIGdvIGFoZWFkIGFuZCBlbWl0LFxuICAgICAgICAvLyBldmVuIGlmIHdlJ3JlIG5vdCByZWFkaW5nLlxuICAgICAgICAvLyB3ZSdsbCByZS1lbWl0IGlmIGEgbmV3ICdlbmQnIGxpc3RlbmVyIGlzIGFkZGVkIGFueXdheS5cbiAgICAgICAgLy8gVGhpcyBtYWtlcyBNUCBtb3JlIHN1aXRhYmxlIHRvIHdyaXRlLW9ubHkgdXNlIGNhc2VzLlxuICAgICAgICBpZiAodGhpc1tGTE9XSU5HXSB8fCAhdGhpc1tQQVVTRURdKVxuICAgICAgICAgICAgdGhpc1tNQVlCRV9FTUlUX0VORF0oKTtcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxuICAgIC8vIGRvbid0IGxldCB0aGUgaW50ZXJuYWwgcmVzdW1lIGJlIG92ZXJ3cml0dGVuXG4gICAgW1JFU1VNRV0oKSB7XG4gICAgICAgIGlmICh0aGlzW0RFU1RST1lFRF0pXG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIGlmICghdGhpc1tEQVRBTElTVEVORVJTXSAmJiAhdGhpc1tQSVBFU10ubGVuZ3RoKSB7XG4gICAgICAgICAgICB0aGlzW0RJU0NBUkRFRF0gPSB0cnVlO1xuICAgICAgICB9XG4gICAgICAgIHRoaXNbUEFVU0VEXSA9IGZhbHNlO1xuICAgICAgICB0aGlzW0ZMT1dJTkddID0gdHJ1ZTtcbiAgICAgICAgdGhpcy5lbWl0KCdyZXN1bWUnKTtcbiAgICAgICAgaWYgKHRoaXNbQlVGRkVSXS5sZW5ndGgpXG4gICAgICAgICAgICB0aGlzW0ZMVVNIXSgpO1xuICAgICAgICBlbHNlIGlmICh0aGlzW0VPRl0pXG4gICAgICAgICAgICB0aGlzW01BWUJFX0VNSVRfRU5EXSgpO1xuICAgICAgICBlbHNlXG4gICAgICAgICAgICB0aGlzLmVtaXQoJ2RyYWluJyk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIFJlc3VtZSB0aGUgc3RyZWFtIGlmIGl0IGlzIGN1cnJlbnRseSBpbiBhIHBhdXNlZCBzdGF0ZVxuICAgICAqXG4gICAgICogSWYgY2FsbGVkIHdoZW4gdGhlcmUgYXJlIG5vIHBpcGUgZGVzdGluYXRpb25zIG9yIGBkYXRhYCBldmVudCBsaXN0ZW5lcnMsXG4gICAgICogdGhpcyB3aWxsIHBsYWNlIHRoZSBzdHJlYW0gaW4gYSBcImRpc2NhcmRlZFwiIHN0YXRlLCB3aGVyZSBhbGwgZGF0YSB3aWxsXG4gICAgICogYmUgdGhyb3duIGF3YXkuIFRoZSBkaXNjYXJkZWQgc3RhdGUgaXMgcmVtb3ZlZCBpZiBhIHBpcGUgZGVzdGluYXRpb24gb3JcbiAgICAgKiBkYXRhIGhhbmRsZXIgaXMgYWRkZWQsIGlmIHBhdXNlKCkgaXMgY2FsbGVkLCBvciBpZiBhbnkgc3luY2hyb25vdXMgb3JcbiAgICAgKiBhc3luY2hyb25vdXMgaXRlcmF0aW9uIGlzIHN0YXJ0ZWQuXG4gICAgICovXG4gICAgcmVzdW1lKCkge1xuICAgICAgICByZXR1cm4gdGhpc1tSRVNVTUVdKCk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIFBhdXNlIHRoZSBzdHJlYW1cbiAgICAgKi9cbiAgICBwYXVzZSgpIHtcbiAgICAgICAgdGhpc1tGTE9XSU5HXSA9IGZhbHNlO1xuICAgICAgICB0aGlzW1BBVVNFRF0gPSB0cnVlO1xuICAgICAgICB0aGlzW0RJU0NBUkRFRF0gPSBmYWxzZTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogdHJ1ZSBpZiB0aGUgc3RyZWFtIGhhcyBiZWVuIGZvcmNpYmx5IGRlc3Ryb3llZFxuICAgICAqL1xuICAgIGdldCBkZXN0cm95ZWQoKSB7XG4gICAgICAgIHJldHVybiB0aGlzW0RFU1RST1lFRF07XG4gICAgfVxuICAgIC8qKlxuICAgICAqIHRydWUgaWYgdGhlIHN0cmVhbSBpcyBjdXJyZW50bHkgaW4gYSBmbG93aW5nIHN0YXRlLCBtZWFuaW5nIHRoYXRcbiAgICAgKiBhbnkgd3JpdGVzIHdpbGwgYmUgaW1tZWRpYXRlbHkgZW1pdHRlZC5cbiAgICAgKi9cbiAgICBnZXQgZmxvd2luZygpIHtcbiAgICAgICAgcmV0dXJuIHRoaXNbRkxPV0lOR107XG4gICAgfVxuICAgIC8qKlxuICAgICAqIHRydWUgaWYgdGhlIHN0cmVhbSBpcyBjdXJyZW50bHkgaW4gYSBwYXVzZWQgc3RhdGVcbiAgICAgKi9cbiAgICBnZXQgcGF1c2VkKCkge1xuICAgICAgICByZXR1cm4gdGhpc1tQQVVTRURdO1xuICAgIH1cbiAgICBbQlVGRkVSUFVTSF0oY2h1bmspIHtcbiAgICAgICAgaWYgKHRoaXNbT0JKRUNUTU9ERV0pXG4gICAgICAgICAgICB0aGlzW0JVRkZFUkxFTkdUSF0gKz0gMTtcbiAgICAgICAgZWxzZVxuICAgICAgICAgICAgdGhpc1tCVUZGRVJMRU5HVEhdICs9IGNodW5rLmxlbmd0aDtcbiAgICAgICAgdGhpc1tCVUZGRVJdLnB1c2goY2h1bmspO1xuICAgIH1cbiAgICBbQlVGRkVSU0hJRlRdKCkge1xuICAgICAgICBpZiAodGhpc1tPQkpFQ1RNT0RFXSlcbiAgICAgICAgICAgIHRoaXNbQlVGRkVSTEVOR1RIXSAtPSAxO1xuICAgICAgICBlbHNlXG4gICAgICAgICAgICB0aGlzW0JVRkZFUkxFTkdUSF0gLT0gdGhpc1tCVUZGRVJdWzBdLmxlbmd0aDtcbiAgICAgICAgcmV0dXJuIHRoaXNbQlVGRkVSXS5zaGlmdCgpO1xuICAgIH1cbiAgICBbRkxVU0hdKG5vRHJhaW4gPSBmYWxzZSkge1xuICAgICAgICBkbyB7IH0gd2hpbGUgKHRoaXNbRkxVU0hDSFVOS10odGhpc1tCVUZGRVJTSElGVF0oKSkgJiZcbiAgICAgICAgICAgIHRoaXNbQlVGRkVSXS5sZW5ndGgpO1xuICAgICAgICBpZiAoIW5vRHJhaW4gJiYgIXRoaXNbQlVGRkVSXS5sZW5ndGggJiYgIXRoaXNbRU9GXSlcbiAgICAgICAgICAgIHRoaXMuZW1pdCgnZHJhaW4nKTtcbiAgICB9XG4gICAgW0ZMVVNIQ0hVTktdKGNodW5rKSB7XG4gICAgICAgIHRoaXMuZW1pdCgnZGF0YScsIGNodW5rKTtcbiAgICAgICAgcmV0dXJuIHRoaXNbRkxPV0lOR107XG4gICAgfVxuICAgIC8qKlxuICAgICAqIFBpcGUgYWxsIGRhdGEgZW1pdHRlZCBieSB0aGlzIHN0cmVhbSBpbnRvIHRoZSBkZXN0aW5hdGlvbiBwcm92aWRlZC5cbiAgICAgKlxuICAgICAqIFRyaWdnZXJzIHRoZSBmbG93IG9mIGRhdGEuXG4gICAgICovXG4gICAgcGlwZShkZXN0LCBvcHRzKSB7XG4gICAgICAgIGlmICh0aGlzW0RFU1RST1lFRF0pXG4gICAgICAgICAgICByZXR1cm4gZGVzdDtcbiAgICAgICAgdGhpc1tESVNDQVJERURdID0gZmFsc2U7XG4gICAgICAgIGNvbnN0IGVuZGVkID0gdGhpc1tFTUlUVEVEX0VORF07XG4gICAgICAgIG9wdHMgPSBvcHRzIHx8IHt9O1xuICAgICAgICBpZiAoZGVzdCA9PT0gcHJvYy5zdGRvdXQgfHwgZGVzdCA9PT0gcHJvYy5zdGRlcnIpXG4gICAgICAgICAgICBvcHRzLmVuZCA9IGZhbHNlO1xuICAgICAgICBlbHNlXG4gICAgICAgICAgICBvcHRzLmVuZCA9IG9wdHMuZW5kICE9PSBmYWxzZTtcbiAgICAgICAgb3B0cy5wcm94eUVycm9ycyA9ICEhb3B0cy5wcm94eUVycm9ycztcbiAgICAgICAgLy8gcGlwaW5nIGFuIGVuZGVkIHN0cmVhbSBlbmRzIGltbWVkaWF0ZWx5XG4gICAgICAgIGlmIChlbmRlZCkge1xuICAgICAgICAgICAgaWYgKG9wdHMuZW5kKVxuICAgICAgICAgICAgICAgIGRlc3QuZW5kKCk7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAvLyBcImFzXCIgaGVyZSBqdXN0IGlnbm9yZXMgdGhlIFdUeXBlLCB3aGljaCBwaXBlcyBkb24ndCBjYXJlIGFib3V0LFxuICAgICAgICAgICAgLy8gc2luY2UgdGhleSdyZSBvbmx5IGNvbnN1bWluZyBmcm9tIHVzLCBhbmQgd3JpdGluZyB0byB0aGUgZGVzdFxuICAgICAgICAgICAgdGhpc1tQSVBFU10ucHVzaCghb3B0cy5wcm94eUVycm9yc1xuICAgICAgICAgICAgICAgID8gbmV3IFBpcGUodGhpcywgZGVzdCwgb3B0cylcbiAgICAgICAgICAgICAgICA6IG5ldyBQaXBlUHJveHlFcnJvcnModGhpcywgZGVzdCwgb3B0cykpO1xuICAgICAgICAgICAgaWYgKHRoaXNbQVNZTkNdKVxuICAgICAgICAgICAgICAgIGRlZmVyKCgpID0+IHRoaXNbUkVTVU1FXSgpKTtcbiAgICAgICAgICAgIGVsc2VcbiAgICAgICAgICAgICAgICB0aGlzW1JFU1VNRV0oKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gZGVzdDtcbiAgICB9XG4gICAgLyoqXG4gICAgICogRnVsbHkgdW5ob29rIGEgcGlwZWQgZGVzdGluYXRpb24gc3RyZWFtLlxuICAgICAqXG4gICAgICogSWYgdGhlIGRlc3RpbmF0aW9uIHN0cmVhbSB3YXMgdGhlIG9ubHkgY29uc3VtZXIgb2YgdGhpcyBzdHJlYW0gKGllLFxuICAgICAqIHRoZXJlIGFyZSBubyBvdGhlciBwaXBlZCBkZXN0aW5hdGlvbnMgb3IgYCdkYXRhJ2AgZXZlbnQgbGlzdGVuZXJzKVxuICAgICAqIHRoZW4gdGhlIGZsb3cgb2YgZGF0YSB3aWxsIHN0b3AgdW50aWwgdGhlcmUgaXMgYW5vdGhlciBjb25zdW1lciBvclxuICAgICAqIHtAbGluayBNaW5pcGFzcyNyZXN1bWV9IGlzIGV4cGxpY2l0bHkgY2FsbGVkLlxuICAgICAqL1xuICAgIHVucGlwZShkZXN0KSB7XG4gICAgICAgIGNvbnN0IHAgPSB0aGlzW1BJUEVTXS5maW5kKHAgPT4gcC5kZXN0ID09PSBkZXN0KTtcbiAgICAgICAgaWYgKHApIHtcbiAgICAgICAgICAgIGlmICh0aGlzW1BJUEVTXS5sZW5ndGggPT09IDEpIHtcbiAgICAgICAgICAgICAgICBpZiAodGhpc1tGTE9XSU5HXSAmJiB0aGlzW0RBVEFMSVNURU5FUlNdID09PSAwKSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXNbRkxPV0lOR10gPSBmYWxzZTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgdGhpc1tQSVBFU10gPSBbXTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2VcbiAgICAgICAgICAgICAgICB0aGlzW1BJUEVTXS5zcGxpY2UodGhpc1tQSVBFU10uaW5kZXhPZihwKSwgMSk7XG4gICAgICAgICAgICBwLnVucGlwZSgpO1xuICAgICAgICB9XG4gICAgfVxuICAgIC8qKlxuICAgICAqIEFsaWFzIGZvciB7QGxpbmsgTWluaXBhc3Mjb259XG4gICAgICovXG4gICAgYWRkTGlzdGVuZXIoZXYsIGhhbmRsZXIpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMub24oZXYsIGhhbmRsZXIpO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBNb3N0bHkgaWRlbnRpY2FsIHRvIGBFdmVudEVtaXR0ZXIub25gLCB3aXRoIHRoZSBmb2xsb3dpbmdcbiAgICAgKiBiZWhhdmlvciBkaWZmZXJlbmNlcyB0byBwcmV2ZW50IGRhdGEgbG9zcyBhbmQgdW5uZWNlc3NhcnkgaGFuZ3M6XG4gICAgICpcbiAgICAgKiAtIEFkZGluZyBhICdkYXRhJyBldmVudCBoYW5kbGVyIHdpbGwgdHJpZ2dlciB0aGUgZmxvdyBvZiBkYXRhXG4gICAgICpcbiAgICAgKiAtIEFkZGluZyBhICdyZWFkYWJsZScgZXZlbnQgaGFuZGxlciB3aGVuIHRoZXJlIGlzIGRhdGEgd2FpdGluZyB0byBiZSByZWFkXG4gICAgICogICB3aWxsIGNhdXNlICdyZWFkYWJsZScgdG8gYmUgZW1pdHRlZCBpbW1lZGlhdGVseS5cbiAgICAgKlxuICAgICAqIC0gQWRkaW5nIGFuICdlbmRpc2gnIGV2ZW50IGhhbmRsZXIgKCdlbmQnLCAnZmluaXNoJywgZXRjLikgd2hpY2ggaGFzXG4gICAgICogICBhbHJlYWR5IHBhc3NlZCB3aWxsIGNhdXNlIHRoZSBldmVudCB0byBiZSBlbWl0dGVkIGltbWVkaWF0ZWx5IGFuZCBhbGxcbiAgICAgKiAgIGhhbmRsZXJzIHJlbW92ZWQuXG4gICAgICpcbiAgICAgKiAtIEFkZGluZyBhbiAnZXJyb3InIGV2ZW50IGhhbmRsZXIgYWZ0ZXIgYW4gZXJyb3IgaGFzIGJlZW4gZW1pdHRlZCB3aWxsXG4gICAgICogICBjYXVzZSB0aGUgZXZlbnQgdG8gYmUgcmUtZW1pdHRlZCBpbW1lZGlhdGVseSB3aXRoIHRoZSBlcnJvciBwcmV2aW91c2x5XG4gICAgICogICByYWlzZWQuXG4gICAgICovXG4gICAgb24oZXYsIGhhbmRsZXIpIHtcbiAgICAgICAgY29uc3QgcmV0ID0gc3VwZXIub24oZXYsIGhhbmRsZXIpO1xuICAgICAgICBpZiAoZXYgPT09ICdkYXRhJykge1xuICAgICAgICAgICAgdGhpc1tESVNDQVJERURdID0gZmFsc2U7XG4gICAgICAgICAgICB0aGlzW0RBVEFMSVNURU5FUlNdKys7XG4gICAgICAgICAgICBpZiAoIXRoaXNbUElQRVNdLmxlbmd0aCAmJiAhdGhpc1tGTE9XSU5HXSkge1xuICAgICAgICAgICAgICAgIHRoaXNbUkVTVU1FXSgpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGVsc2UgaWYgKGV2ID09PSAncmVhZGFibGUnICYmIHRoaXNbQlVGRkVSTEVOR1RIXSAhPT0gMCkge1xuICAgICAgICAgICAgc3VwZXIuZW1pdCgncmVhZGFibGUnKTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIGlmIChpc0VuZGlzaChldikgJiYgdGhpc1tFTUlUVEVEX0VORF0pIHtcbiAgICAgICAgICAgIHN1cGVyLmVtaXQoZXYpO1xuICAgICAgICAgICAgdGhpcy5yZW1vdmVBbGxMaXN0ZW5lcnMoZXYpO1xuICAgICAgICB9XG4gICAgICAgIGVsc2UgaWYgKGV2ID09PSAnZXJyb3InICYmIHRoaXNbRU1JVFRFRF9FUlJPUl0pIHtcbiAgICAgICAgICAgIGNvbnN0IGggPSBoYW5kbGVyO1xuICAgICAgICAgICAgaWYgKHRoaXNbQVNZTkNdKVxuICAgICAgICAgICAgICAgIGRlZmVyKCgpID0+IGguY2FsbCh0aGlzLCB0aGlzW0VNSVRURURfRVJST1JdKSk7XG4gICAgICAgICAgICBlbHNlXG4gICAgICAgICAgICAgICAgaC5jYWxsKHRoaXMsIHRoaXNbRU1JVFRFRF9FUlJPUl0pO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiByZXQ7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIEFsaWFzIGZvciB7QGxpbmsgTWluaXBhc3Mjb2ZmfVxuICAgICAqL1xuICAgIHJlbW92ZUxpc3RlbmVyKGV2LCBoYW5kbGVyKSB7XG4gICAgICAgIHJldHVybiB0aGlzLm9mZihldiwgaGFuZGxlcik7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIE1vc3RseSBpZGVudGljYWwgdG8gYEV2ZW50RW1pdHRlci5vZmZgXG4gICAgICpcbiAgICAgKiBJZiBhICdkYXRhJyBldmVudCBoYW5kbGVyIGlzIHJlbW92ZWQsIGFuZCBpdCB3YXMgdGhlIGxhc3QgY29uc3VtZXJcbiAgICAgKiAoaWUsIHRoZXJlIGFyZSBubyBwaXBlIGRlc3RpbmF0aW9ucyBvciBvdGhlciAnZGF0YScgZXZlbnQgbGlzdGVuZXJzKSxcbiAgICAgKiB0aGVuIHRoZSBmbG93IG9mIGRhdGEgd2lsbCBzdG9wIHVudGlsIHRoZXJlIGlzIGFub3RoZXIgY29uc3VtZXIgb3JcbiAgICAgKiB7QGxpbmsgTWluaXBhc3MjcmVzdW1lfSBpcyBleHBsaWNpdGx5IGNhbGxlZC5cbiAgICAgKi9cbiAgICBvZmYoZXYsIGhhbmRsZXIpIHtcbiAgICAgICAgY29uc3QgcmV0ID0gc3VwZXIub2ZmKGV2LCBoYW5kbGVyKTtcbiAgICAgICAgLy8gaWYgd2UgcHJldmlvdXNseSBoYWQgbGlzdGVuZXJzLCBhbmQgbm93IHdlIGRvbid0LCBhbmQgd2UgZG9uJ3RcbiAgICAgICAgLy8gaGF2ZSBhbnkgcGlwZXMsIHRoZW4gc3RvcCB0aGUgZmxvdywgdW5sZXNzIGl0J3MgYmVlbiBleHBsaWNpdGx5XG4gICAgICAgIC8vIHB1dCBpbiBhIGRpc2NhcmRlZCBmbG93aW5nIHN0YXRlIHZpYSBzdHJlYW0ucmVzdW1lKCkuXG4gICAgICAgIGlmIChldiA9PT0gJ2RhdGEnKSB7XG4gICAgICAgICAgICB0aGlzW0RBVEFMSVNURU5FUlNdID0gdGhpcy5saXN0ZW5lcnMoJ2RhdGEnKS5sZW5ndGg7XG4gICAgICAgICAgICBpZiAodGhpc1tEQVRBTElTVEVORVJTXSA9PT0gMCAmJlxuICAgICAgICAgICAgICAgICF0aGlzW0RJU0NBUkRFRF0gJiZcbiAgICAgICAgICAgICAgICAhdGhpc1tQSVBFU10ubGVuZ3RoKSB7XG4gICAgICAgICAgICAgICAgdGhpc1tGTE9XSU5HXSA9IGZhbHNlO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiByZXQ7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIE1vc3RseSBpZGVudGljYWwgdG8gYEV2ZW50RW1pdHRlci5yZW1vdmVBbGxMaXN0ZW5lcnNgXG4gICAgICpcbiAgICAgKiBJZiBhbGwgJ2RhdGEnIGV2ZW50IGhhbmRsZXJzIGFyZSByZW1vdmVkLCBhbmQgdGhleSB3ZXJlIHRoZSBsYXN0IGNvbnN1bWVyXG4gICAgICogKGllLCB0aGVyZSBhcmUgbm8gcGlwZSBkZXN0aW5hdGlvbnMpLCB0aGVuIHRoZSBmbG93IG9mIGRhdGEgd2lsbCBzdG9wXG4gICAgICogdW50aWwgdGhlcmUgaXMgYW5vdGhlciBjb25zdW1lciBvciB7QGxpbmsgTWluaXBhc3MjcmVzdW1lfSBpcyBleHBsaWNpdGx5XG4gICAgICogY2FsbGVkLlxuICAgICAqL1xuICAgIHJlbW92ZUFsbExpc3RlbmVycyhldikge1xuICAgICAgICBjb25zdCByZXQgPSBzdXBlci5yZW1vdmVBbGxMaXN0ZW5lcnMoZXYpO1xuICAgICAgICBpZiAoZXYgPT09ICdkYXRhJyB8fCBldiA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICB0aGlzW0RBVEFMSVNURU5FUlNdID0gMDtcbiAgICAgICAgICAgIGlmICghdGhpc1tESVNDQVJERURdICYmICF0aGlzW1BJUEVTXS5sZW5ndGgpIHtcbiAgICAgICAgICAgICAgICB0aGlzW0ZMT1dJTkddID0gZmFsc2U7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHJldDtcbiAgICB9XG4gICAgLyoqXG4gICAgICogdHJ1ZSBpZiB0aGUgJ2VuZCcgZXZlbnQgaGFzIGJlZW4gZW1pdHRlZFxuICAgICAqL1xuICAgIGdldCBlbWl0dGVkRW5kKCkge1xuICAgICAgICByZXR1cm4gdGhpc1tFTUlUVEVEX0VORF07XG4gICAgfVxuICAgIFtNQVlCRV9FTUlUX0VORF0oKSB7XG4gICAgICAgIGlmICghdGhpc1tFTUlUVElOR19FTkRdICYmXG4gICAgICAgICAgICAhdGhpc1tFTUlUVEVEX0VORF0gJiZcbiAgICAgICAgICAgICF0aGlzW0RFU1RST1lFRF0gJiZcbiAgICAgICAgICAgIHRoaXNbQlVGRkVSXS5sZW5ndGggPT09IDAgJiZcbiAgICAgICAgICAgIHRoaXNbRU9GXSkge1xuICAgICAgICAgICAgdGhpc1tFTUlUVElOR19FTkRdID0gdHJ1ZTtcbiAgICAgICAgICAgIHRoaXMuZW1pdCgnZW5kJyk7XG4gICAgICAgICAgICB0aGlzLmVtaXQoJ3ByZWZpbmlzaCcpO1xuICAgICAgICAgICAgdGhpcy5lbWl0KCdmaW5pc2gnKTtcbiAgICAgICAgICAgIGlmICh0aGlzW0NMT1NFRF0pXG4gICAgICAgICAgICAgICAgdGhpcy5lbWl0KCdjbG9zZScpO1xuICAgICAgICAgICAgdGhpc1tFTUlUVElOR19FTkRdID0gZmFsc2U7XG4gICAgICAgIH1cbiAgICB9XG4gICAgLyoqXG4gICAgICogTW9zdGx5IGlkZW50aWNhbCB0byBgRXZlbnRFbWl0dGVyLmVtaXRgLCB3aXRoIHRoZSBmb2xsb3dpbmdcbiAgICAgKiBiZWhhdmlvciBkaWZmZXJlbmNlcyB0byBwcmV2ZW50IGRhdGEgbG9zcyBhbmQgdW5uZWNlc3NhcnkgaGFuZ3M6XG4gICAgICpcbiAgICAgKiBJZiB0aGUgc3RyZWFtIGhhcyBiZWVuIGRlc3Ryb3llZCwgYW5kIHRoZSBldmVudCBpcyBzb21ldGhpbmcgb3RoZXJcbiAgICAgKiB0aGFuICdjbG9zZScgb3IgJ2Vycm9yJywgdGhlbiBgZmFsc2VgIGlzIHJldHVybmVkIGFuZCBubyBoYW5kbGVyc1xuICAgICAqIGFyZSBjYWxsZWQuXG4gICAgICpcbiAgICAgKiBJZiB0aGUgZXZlbnQgaXMgJ2VuZCcsIGFuZCBoYXMgYWxyZWFkeSBiZWVuIGVtaXR0ZWQsIHRoZW4gdGhlIGV2ZW50XG4gICAgICogaXMgaWdub3JlZC4gSWYgdGhlIHN0cmVhbSBpcyBpbiBhIHBhdXNlZCBvciBub24tZmxvd2luZyBzdGF0ZSwgdGhlblxuICAgICAqIHRoZSBldmVudCB3aWxsIGJlIGRlZmVycmVkIHVudGlsIGRhdGEgZmxvdyByZXN1bWVzLiBJZiB0aGUgc3RyZWFtIGlzXG4gICAgICogYXN5bmMsIHRoZW4gaGFuZGxlcnMgd2lsbCBiZSBjYWxsZWQgb24gdGhlIG5leHQgdGljayByYXRoZXIgdGhhblxuICAgICAqIGltbWVkaWF0ZWx5LlxuICAgICAqXG4gICAgICogSWYgdGhlIGV2ZW50IGlzICdjbG9zZScsIGFuZCAnZW5kJyBoYXMgbm90IHlldCBiZWVuIGVtaXR0ZWQsIHRoZW5cbiAgICAgKiB0aGUgZXZlbnQgd2lsbCBiZSBkZWZlcnJlZCB1bnRpbCBhZnRlciAnZW5kJyBpcyBlbWl0dGVkLlxuICAgICAqXG4gICAgICogSWYgdGhlIGV2ZW50IGlzICdlcnJvcicsIGFuZCBhbiBBYm9ydFNpZ25hbCB3YXMgcHJvdmlkZWQgZm9yIHRoZSBzdHJlYW0sXG4gICAgICogYW5kIHRoZXJlIGFyZSBubyBsaXN0ZW5lcnMsIHRoZW4gdGhlIGV2ZW50IGlzIGlnbm9yZWQsIG1hdGNoaW5nIHRoZVxuICAgICAqIGJlaGF2aW9yIG9mIG5vZGUgY29yZSBzdHJlYW1zIGluIHRoZSBwcmVzZW5zZSBvZiBhbiBBYm9ydFNpZ25hbC5cbiAgICAgKlxuICAgICAqIElmIHRoZSBldmVudCBpcyAnZmluaXNoJyBvciAncHJlZmluaXNoJywgdGhlbiBhbGwgbGlzdGVuZXJzIHdpbGwgYmVcbiAgICAgKiByZW1vdmVkIGFmdGVyIGVtaXR0aW5nIHRoZSBldmVudCwgdG8gcHJldmVudCBkb3VibGUtZmlyaW5nLlxuICAgICAqL1xuICAgIGVtaXQoZXYsIC4uLmFyZ3MpIHtcbiAgICAgICAgY29uc3QgZGF0YSA9IGFyZ3NbMF07XG4gICAgICAgIC8vIGVycm9yIGFuZCBjbG9zZSBhcmUgb25seSBldmVudHMgYWxsb3dlZCBhZnRlciBjYWxsaW5nIGRlc3Ryb3koKVxuICAgICAgICBpZiAoZXYgIT09ICdlcnJvcicgJiZcbiAgICAgICAgICAgIGV2ICE9PSAnY2xvc2UnICYmXG4gICAgICAgICAgICBldiAhPT0gREVTVFJPWUVEICYmXG4gICAgICAgICAgICB0aGlzW0RFU1RST1lFRF0pIHtcbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIGlmIChldiA9PT0gJ2RhdGEnKSB7XG4gICAgICAgICAgICByZXR1cm4gIXRoaXNbT0JKRUNUTU9ERV0gJiYgIWRhdGFcbiAgICAgICAgICAgICAgICA/IGZhbHNlXG4gICAgICAgICAgICAgICAgOiB0aGlzW0FTWU5DXVxuICAgICAgICAgICAgICAgICAgICA/IChkZWZlcigoKSA9PiB0aGlzW0VNSVREQVRBXShkYXRhKSksIHRydWUpXG4gICAgICAgICAgICAgICAgICAgIDogdGhpc1tFTUlUREFUQV0oZGF0YSk7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSBpZiAoZXYgPT09ICdlbmQnKSB7XG4gICAgICAgICAgICByZXR1cm4gdGhpc1tFTUlURU5EXSgpO1xuICAgICAgICB9XG4gICAgICAgIGVsc2UgaWYgKGV2ID09PSAnY2xvc2UnKSB7XG4gICAgICAgICAgICB0aGlzW0NMT1NFRF0gPSB0cnVlO1xuICAgICAgICAgICAgLy8gZG9uJ3QgZW1pdCBjbG9zZSBiZWZvcmUgJ2VuZCcgYW5kICdmaW5pc2gnXG4gICAgICAgICAgICBpZiAoIXRoaXNbRU1JVFRFRF9FTkRdICYmICF0aGlzW0RFU1RST1lFRF0pXG4gICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICAgICAgY29uc3QgcmV0ID0gc3VwZXIuZW1pdCgnY2xvc2UnKTtcbiAgICAgICAgICAgIHRoaXMucmVtb3ZlQWxsTGlzdGVuZXJzKCdjbG9zZScpO1xuICAgICAgICAgICAgcmV0dXJuIHJldDtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIGlmIChldiA9PT0gJ2Vycm9yJykge1xuICAgICAgICAgICAgdGhpc1tFTUlUVEVEX0VSUk9SXSA9IGRhdGE7XG4gICAgICAgICAgICBzdXBlci5lbWl0KEVSUk9SLCBkYXRhKTtcbiAgICAgICAgICAgIGNvbnN0IHJldCA9ICF0aGlzW1NJR05BTF0gfHwgdGhpcy5saXN0ZW5lcnMoJ2Vycm9yJykubGVuZ3RoXG4gICAgICAgICAgICAgICAgPyBzdXBlci5lbWl0KCdlcnJvcicsIGRhdGEpXG4gICAgICAgICAgICAgICAgOiBmYWxzZTtcbiAgICAgICAgICAgIHRoaXNbTUFZQkVfRU1JVF9FTkRdKCk7XG4gICAgICAgICAgICByZXR1cm4gcmV0O1xuICAgICAgICB9XG4gICAgICAgIGVsc2UgaWYgKGV2ID09PSAncmVzdW1lJykge1xuICAgICAgICAgICAgY29uc3QgcmV0ID0gc3VwZXIuZW1pdCgncmVzdW1lJyk7XG4gICAgICAgICAgICB0aGlzW01BWUJFX0VNSVRfRU5EXSgpO1xuICAgICAgICAgICAgcmV0dXJuIHJldDtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIGlmIChldiA9PT0gJ2ZpbmlzaCcgfHwgZXYgPT09ICdwcmVmaW5pc2gnKSB7XG4gICAgICAgICAgICBjb25zdCByZXQgPSBzdXBlci5lbWl0KGV2KTtcbiAgICAgICAgICAgIHRoaXMucmVtb3ZlQWxsTGlzdGVuZXJzKGV2KTtcbiAgICAgICAgICAgIHJldHVybiByZXQ7XG4gICAgICAgIH1cbiAgICAgICAgLy8gU29tZSBvdGhlciB1bmtub3duIGV2ZW50XG4gICAgICAgIGNvbnN0IHJldCA9IHN1cGVyLmVtaXQoZXYsIC4uLmFyZ3MpO1xuICAgICAgICB0aGlzW01BWUJFX0VNSVRfRU5EXSgpO1xuICAgICAgICByZXR1cm4gcmV0O1xuICAgIH1cbiAgICBbRU1JVERBVEFdKGRhdGEpIHtcbiAgICAgICAgZm9yIChjb25zdCBwIG9mIHRoaXNbUElQRVNdKSB7XG4gICAgICAgICAgICBpZiAocC5kZXN0LndyaXRlKGRhdGEpID09PSBmYWxzZSlcbiAgICAgICAgICAgICAgICB0aGlzLnBhdXNlKCk7XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgcmV0ID0gdGhpc1tESVNDQVJERURdID8gZmFsc2UgOiBzdXBlci5lbWl0KCdkYXRhJywgZGF0YSk7XG4gICAgICAgIHRoaXNbTUFZQkVfRU1JVF9FTkRdKCk7XG4gICAgICAgIHJldHVybiByZXQ7XG4gICAgfVxuICAgIFtFTUlURU5EXSgpIHtcbiAgICAgICAgaWYgKHRoaXNbRU1JVFRFRF9FTkRdKVxuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICB0aGlzW0VNSVRURURfRU5EXSA9IHRydWU7XG4gICAgICAgIHRoaXMucmVhZGFibGUgPSBmYWxzZTtcbiAgICAgICAgcmV0dXJuIHRoaXNbQVNZTkNdXG4gICAgICAgICAgICA/IChkZWZlcigoKSA9PiB0aGlzW0VNSVRFTkQyXSgpKSwgdHJ1ZSlcbiAgICAgICAgICAgIDogdGhpc1tFTUlURU5EMl0oKTtcbiAgICB9XG4gICAgW0VNSVRFTkQyXSgpIHtcbiAgICAgICAgaWYgKHRoaXNbREVDT0RFUl0pIHtcbiAgICAgICAgICAgIGNvbnN0IGRhdGEgPSB0aGlzW0RFQ09ERVJdLmVuZCgpO1xuICAgICAgICAgICAgaWYgKGRhdGEpIHtcbiAgICAgICAgICAgICAgICBmb3IgKGNvbnN0IHAgb2YgdGhpc1tQSVBFU10pIHtcbiAgICAgICAgICAgICAgICAgICAgcC5kZXN0LndyaXRlKGRhdGEpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBpZiAoIXRoaXNbRElTQ0FSREVEXSlcbiAgICAgICAgICAgICAgICAgICAgc3VwZXIuZW1pdCgnZGF0YScsIGRhdGEpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGZvciAoY29uc3QgcCBvZiB0aGlzW1BJUEVTXSkge1xuICAgICAgICAgICAgcC5lbmQoKTtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCByZXQgPSBzdXBlci5lbWl0KCdlbmQnKTtcbiAgICAgICAgdGhpcy5yZW1vdmVBbGxMaXN0ZW5lcnMoJ2VuZCcpO1xuICAgICAgICByZXR1cm4gcmV0O1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBSZXR1cm4gYSBQcm9taXNlIHRoYXQgcmVzb2x2ZXMgdG8gYW4gYXJyYXkgb2YgYWxsIGVtaXR0ZWQgZGF0YSBvbmNlXG4gICAgICogdGhlIHN0cmVhbSBlbmRzLlxuICAgICAqL1xuICAgIGFzeW5jIGNvbGxlY3QoKSB7XG4gICAgICAgIGNvbnN0IGJ1ZiA9IE9iamVjdC5hc3NpZ24oW10sIHtcbiAgICAgICAgICAgIGRhdGFMZW5ndGg6IDAsXG4gICAgICAgIH0pO1xuICAgICAgICBpZiAoIXRoaXNbT0JKRUNUTU9ERV0pXG4gICAgICAgICAgICBidWYuZGF0YUxlbmd0aCA9IDA7XG4gICAgICAgIC8vIHNldCB0aGUgcHJvbWlzZSBmaXJzdCwgaW4gY2FzZSBhbiBlcnJvciBpcyByYWlzZWRcbiAgICAgICAgLy8gYnkgdHJpZ2dlcmluZyB0aGUgZmxvdyBoZXJlLlxuICAgICAgICBjb25zdCBwID0gdGhpcy5wcm9taXNlKCk7XG4gICAgICAgIHRoaXMub24oJ2RhdGEnLCBjID0+IHtcbiAgICAgICAgICAgIGJ1Zi5wdXNoKGMpO1xuICAgICAgICAgICAgaWYgKCF0aGlzW09CSkVDVE1PREVdKVxuICAgICAgICAgICAgICAgIGJ1Zi5kYXRhTGVuZ3RoICs9IGMubGVuZ3RoO1xuICAgICAgICB9KTtcbiAgICAgICAgYXdhaXQgcDtcbiAgICAgICAgcmV0dXJuIGJ1ZjtcbiAgICB9XG4gICAgLyoqXG4gICAgICogUmV0dXJuIGEgUHJvbWlzZSB0aGF0IHJlc29sdmVzIHRvIHRoZSBjb25jYXRlbmF0aW9uIG9mIGFsbCBlbWl0dGVkIGRhdGFcbiAgICAgKiBvbmNlIHRoZSBzdHJlYW0gZW5kcy5cbiAgICAgKlxuICAgICAqIE5vdCBhbGxvd2VkIG9uIG9iamVjdE1vZGUgc3RyZWFtcy5cbiAgICAgKi9cbiAgICBhc3luYyBjb25jYXQoKSB7XG4gICAgICAgIGlmICh0aGlzW09CSkVDVE1PREVdKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ2Nhbm5vdCBjb25jYXQgaW4gb2JqZWN0TW9kZScpO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IGJ1ZiA9IGF3YWl0IHRoaXMuY29sbGVjdCgpO1xuICAgICAgICByZXR1cm4gKHRoaXNbRU5DT0RJTkddXG4gICAgICAgICAgICA/IGJ1Zi5qb2luKCcnKVxuICAgICAgICAgICAgOiBCdWZmZXIuY29uY2F0KGJ1ZiwgYnVmLmRhdGFMZW5ndGgpKTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogUmV0dXJuIGEgdm9pZCBQcm9taXNlIHRoYXQgcmVzb2x2ZXMgb25jZSB0aGUgc3RyZWFtIGVuZHMuXG4gICAgICovXG4gICAgYXN5bmMgcHJvbWlzZSgpIHtcbiAgICAgICAgcmV0dXJuIG5ldyBQcm9taXNlKChyZXNvbHZlLCByZWplY3QpID0+IHtcbiAgICAgICAgICAgIHRoaXMub24oREVTVFJPWUVELCAoKSA9PiByZWplY3QobmV3IEVycm9yKCdzdHJlYW0gZGVzdHJveWVkJykpKTtcbiAgICAgICAgICAgIHRoaXMub24oJ2Vycm9yJywgZXIgPT4gcmVqZWN0KGVyKSk7XG4gICAgICAgICAgICB0aGlzLm9uKCdlbmQnLCAoKSA9PiByZXNvbHZlKCkpO1xuICAgICAgICB9KTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogQXN5bmNocm9ub3VzIGBmb3IgYXdhaXQgb2ZgIGl0ZXJhdGlvbi5cbiAgICAgKlxuICAgICAqIFRoaXMgd2lsbCBjb250aW51ZSBlbWl0dGluZyBhbGwgY2h1bmtzIHVudGlsIHRoZSBzdHJlYW0gdGVybWluYXRlcy5cbiAgICAgKi9cbiAgICBbU3ltYm9sLmFzeW5jSXRlcmF0b3JdKCkge1xuICAgICAgICAvLyBzZXQgdGhpcyB1cCBmcm9udCwgaW4gY2FzZSB0aGUgY29uc3VtZXIgZG9lc24ndCBjYWxsIG5leHQoKVxuICAgICAgICAvLyByaWdodCBhd2F5LlxuICAgICAgICB0aGlzW0RJU0NBUkRFRF0gPSBmYWxzZTtcbiAgICAgICAgbGV0IHN0b3BwZWQgPSBmYWxzZTtcbiAgICAgICAgY29uc3Qgc3RvcCA9IGFzeW5jICgpID0+IHtcbiAgICAgICAgICAgIHRoaXMucGF1c2UoKTtcbiAgICAgICAgICAgIHN0b3BwZWQgPSB0cnVlO1xuICAgICAgICAgICAgcmV0dXJuIHsgdmFsdWU6IHVuZGVmaW5lZCwgZG9uZTogdHJ1ZSB9O1xuICAgICAgICB9O1xuICAgICAgICBjb25zdCBuZXh0ID0gKCkgPT4ge1xuICAgICAgICAgICAgaWYgKHN0b3BwZWQpXG4gICAgICAgICAgICAgICAgcmV0dXJuIHN0b3AoKTtcbiAgICAgICAgICAgIGNvbnN0IHJlcyA9IHRoaXMucmVhZCgpO1xuICAgICAgICAgICAgaWYgKHJlcyAhPT0gbnVsbClcbiAgICAgICAgICAgICAgICByZXR1cm4gUHJvbWlzZS5yZXNvbHZlKHsgZG9uZTogZmFsc2UsIHZhbHVlOiByZXMgfSk7XG4gICAgICAgICAgICBpZiAodGhpc1tFT0ZdKVxuICAgICAgICAgICAgICAgIHJldHVybiBzdG9wKCk7XG4gICAgICAgICAgICBsZXQgcmVzb2x2ZTtcbiAgICAgICAgICAgIGxldCByZWplY3Q7XG4gICAgICAgICAgICBjb25zdCBvbmVyciA9IChlcikgPT4ge1xuICAgICAgICAgICAgICAgIHRoaXMub2ZmKCdkYXRhJywgb25kYXRhKTtcbiAgICAgICAgICAgICAgICB0aGlzLm9mZignZW5kJywgb25lbmQpO1xuICAgICAgICAgICAgICAgIHRoaXMub2ZmKERFU1RST1lFRCwgb25kZXN0cm95KTtcbiAgICAgICAgICAgICAgICBzdG9wKCk7XG4gICAgICAgICAgICAgICAgcmVqZWN0KGVyKTtcbiAgICAgICAgICAgIH07XG4gICAgICAgICAgICBjb25zdCBvbmRhdGEgPSAodmFsdWUpID0+IHtcbiAgICAgICAgICAgICAgICB0aGlzLm9mZignZXJyb3InLCBvbmVycik7XG4gICAgICAgICAgICAgICAgdGhpcy5vZmYoJ2VuZCcsIG9uZW5kKTtcbiAgICAgICAgICAgICAgICB0aGlzLm9mZihERVNUUk9ZRUQsIG9uZGVzdHJveSk7XG4gICAgICAgICAgICAgICAgdGhpcy5wYXVzZSgpO1xuICAgICAgICAgICAgICAgIHJlc29sdmUoeyB2YWx1ZSwgZG9uZTogISF0aGlzW0VPRl0gfSk7XG4gICAgICAgICAgICB9O1xuICAgICAgICAgICAgY29uc3Qgb25lbmQgPSAoKSA9PiB7XG4gICAgICAgICAgICAgICAgdGhpcy5vZmYoJ2Vycm9yJywgb25lcnIpO1xuICAgICAgICAgICAgICAgIHRoaXMub2ZmKCdkYXRhJywgb25kYXRhKTtcbiAgICAgICAgICAgICAgICB0aGlzLm9mZihERVNUUk9ZRUQsIG9uZGVzdHJveSk7XG4gICAgICAgICAgICAgICAgc3RvcCgpO1xuICAgICAgICAgICAgICAgIHJlc29sdmUoeyBkb25lOiB0cnVlLCB2YWx1ZTogdW5kZWZpbmVkIH0pO1xuICAgICAgICAgICAgfTtcbiAgICAgICAgICAgIGNvbnN0IG9uZGVzdHJveSA9ICgpID0+IG9uZXJyKG5ldyBFcnJvcignc3RyZWFtIGRlc3Ryb3llZCcpKTtcbiAgICAgICAgICAgIHJldHVybiBuZXcgUHJvbWlzZSgocmVzLCByZWopID0+IHtcbiAgICAgICAgICAgICAgICByZWplY3QgPSByZWo7XG4gICAgICAgICAgICAgICAgcmVzb2x2ZSA9IHJlcztcbiAgICAgICAgICAgICAgICB0aGlzLm9uY2UoREVTVFJPWUVELCBvbmRlc3Ryb3kpO1xuICAgICAgICAgICAgICAgIHRoaXMub25jZSgnZXJyb3InLCBvbmVycik7XG4gICAgICAgICAgICAgICAgdGhpcy5vbmNlKCdlbmQnLCBvbmVuZCk7XG4gICAgICAgICAgICAgICAgdGhpcy5vbmNlKCdkYXRhJywgb25kYXRhKTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9O1xuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgbmV4dCxcbiAgICAgICAgICAgIHRocm93OiBzdG9wLFxuICAgICAgICAgICAgcmV0dXJuOiBzdG9wLFxuICAgICAgICAgICAgW1N5bWJvbC5hc3luY0l0ZXJhdG9yXSgpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gdGhpcztcbiAgICAgICAgICAgIH0sXG4gICAgICAgIH07XG4gICAgfVxuICAgIC8qKlxuICAgICAqIFN5bmNocm9ub3VzIGBmb3Igb2ZgIGl0ZXJhdGlvbi5cbiAgICAgKlxuICAgICAqIFRoZSBpdGVyYXRpb24gd2lsbCB0ZXJtaW5hdGUgd2hlbiB0aGUgaW50ZXJuYWwgYnVmZmVyIHJ1bnMgb3V0LCBldmVuXG4gICAgICogaWYgdGhlIHN0cmVhbSBoYXMgbm90IHlldCB0ZXJtaW5hdGVkLlxuICAgICAqL1xuICAgIFtTeW1ib2wuaXRlcmF0b3JdKCkge1xuICAgICAgICAvLyBzZXQgdGhpcyB1cCBmcm9udCwgaW4gY2FzZSB0aGUgY29uc3VtZXIgZG9lc24ndCBjYWxsIG5leHQoKVxuICAgICAgICAvLyByaWdodCBhd2F5LlxuICAgICAgICB0aGlzW0RJU0NBUkRFRF0gPSBmYWxzZTtcbiAgICAgICAgbGV0IHN0b3BwZWQgPSBmYWxzZTtcbiAgICAgICAgY29uc3Qgc3RvcCA9ICgpID0+IHtcbiAgICAgICAgICAgIHRoaXMucGF1c2UoKTtcbiAgICAgICAgICAgIHRoaXMub2ZmKEVSUk9SLCBzdG9wKTtcbiAgICAgICAgICAgIHRoaXMub2ZmKERFU1RST1lFRCwgc3RvcCk7XG4gICAgICAgICAgICB0aGlzLm9mZignZW5kJywgc3RvcCk7XG4gICAgICAgICAgICBzdG9wcGVkID0gdHJ1ZTtcbiAgICAgICAgICAgIHJldHVybiB7IGRvbmU6IHRydWUsIHZhbHVlOiB1bmRlZmluZWQgfTtcbiAgICAgICAgfTtcbiAgICAgICAgY29uc3QgbmV4dCA9ICgpID0+IHtcbiAgICAgICAgICAgIGlmIChzdG9wcGVkKVxuICAgICAgICAgICAgICAgIHJldHVybiBzdG9wKCk7XG4gICAgICAgICAgICBjb25zdCB2YWx1ZSA9IHRoaXMucmVhZCgpO1xuICAgICAgICAgICAgcmV0dXJuIHZhbHVlID09PSBudWxsID8gc3RvcCgpIDogeyBkb25lOiBmYWxzZSwgdmFsdWUgfTtcbiAgICAgICAgfTtcbiAgICAgICAgdGhpcy5vbmNlKCdlbmQnLCBzdG9wKTtcbiAgICAgICAgdGhpcy5vbmNlKEVSUk9SLCBzdG9wKTtcbiAgICAgICAgdGhpcy5vbmNlKERFU1RST1lFRCwgc3RvcCk7XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICBuZXh0LFxuICAgICAgICAgICAgdGhyb3c6IHN0b3AsXG4gICAgICAgICAgICByZXR1cm46IHN0b3AsXG4gICAgICAgICAgICBbU3ltYm9sLml0ZXJhdG9yXSgpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gdGhpcztcbiAgICAgICAgICAgIH0sXG4gICAgICAgIH07XG4gICAgfVxuICAgIC8qKlxuICAgICAqIERlc3Ryb3kgYSBzdHJlYW0sIHByZXZlbnRpbmcgaXQgZnJvbSBiZWluZyB1c2VkIGZvciBhbnkgZnVydGhlciBwdXJwb3NlLlxuICAgICAqXG4gICAgICogSWYgdGhlIHN0cmVhbSBoYXMgYSBgY2xvc2UoKWAgbWV0aG9kLCB0aGVuIGl0IHdpbGwgYmUgY2FsbGVkIG9uXG4gICAgICogZGVzdHJ1Y3Rpb24uXG4gICAgICpcbiAgICAgKiBBZnRlciBkZXN0cnVjdGlvbiwgYW55IGF0dGVtcHQgdG8gd3JpdGUgZGF0YSwgcmVhZCBkYXRhLCBvciBlbWl0IG1vc3RcbiAgICAgKiBldmVudHMgd2lsbCBiZSBpZ25vcmVkLlxuICAgICAqXG4gICAgICogSWYgYW4gZXJyb3IgYXJndW1lbnQgaXMgcHJvdmlkZWQsIHRoZW4gaXQgd2lsbCBiZSBlbWl0dGVkIGluIGFuXG4gICAgICogJ2Vycm9yJyBldmVudC5cbiAgICAgKi9cbiAgICBkZXN0cm95KGVyKSB7XG4gICAgICAgIGlmICh0aGlzW0RFU1RST1lFRF0pIHtcbiAgICAgICAgICAgIGlmIChlcilcbiAgICAgICAgICAgICAgICB0aGlzLmVtaXQoJ2Vycm9yJywgZXIpO1xuICAgICAgICAgICAgZWxzZVxuICAgICAgICAgICAgICAgIHRoaXMuZW1pdChERVNUUk9ZRUQpO1xuICAgICAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgICAgIH1cbiAgICAgICAgdGhpc1tERVNUUk9ZRURdID0gdHJ1ZTtcbiAgICAgICAgdGhpc1tESVNDQVJERURdID0gdHJ1ZTtcbiAgICAgICAgLy8gdGhyb3cgYXdheSBhbGwgYnVmZmVyZWQgZGF0YSwgaXQncyBuZXZlciBjb21pbmcgb3V0XG4gICAgICAgIHRoaXNbQlVGRkVSXS5sZW5ndGggPSAwO1xuICAgICAgICB0aGlzW0JVRkZFUkxFTkdUSF0gPSAwO1xuICAgICAgICBjb25zdCB3YyA9IHRoaXM7XG4gICAgICAgIGlmICh0eXBlb2Ygd2MuY2xvc2UgPT09ICdmdW5jdGlvbicgJiYgIXRoaXNbQ0xPU0VEXSlcbiAgICAgICAgICAgIHdjLmNsb3NlKCk7XG4gICAgICAgIGlmIChlcilcbiAgICAgICAgICAgIHRoaXMuZW1pdCgnZXJyb3InLCBlcik7XG4gICAgICAgIC8vIGlmIG5vIGVycm9yIHRvIGVtaXQsIHN0aWxsIHJlamVjdCBwZW5kaW5nIHByb21pc2VzXG4gICAgICAgIGVsc2VcbiAgICAgICAgICAgIHRoaXMuZW1pdChERVNUUk9ZRUQpO1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9XG4gICAgLyoqXG4gICAgICogQWxpYXMgZm9yIHtAbGluayBpc1N0cmVhbX1cbiAgICAgKlxuICAgICAqIEZvcm1lciBleHBvcnQgbG9jYXRpb24sIG1haW50YWluZWQgZm9yIGJhY2t3YXJkcyBjb21wYXRpYmlsaXR5LlxuICAgICAqXG4gICAgICogQGRlcHJlY2F0ZWRcbiAgICAgKi9cbiAgICBzdGF0aWMgZ2V0IGlzU3RyZWFtKCkge1xuICAgICAgICByZXR1cm4gZXhwb3J0cy5pc1N0cmVhbTtcbiAgICB9XG59XG5leHBvcnRzLk1pbmlwYXNzID0gTWluaXBhc3M7XG4vLyMgc291cmNlTWFwcGluZ1VSTD1pbmRleC5qcy5tYXAiLAogICAgIlwidXNlIHN0cmljdFwiO1xudmFyIF9fY3JlYXRlQmluZGluZyA9ICh0aGlzICYmIHRoaXMuX19jcmVhdGVCaW5kaW5nKSB8fCAoT2JqZWN0LmNyZWF0ZSA/IChmdW5jdGlvbihvLCBtLCBrLCBrMikge1xuICAgIGlmIChrMiA9PT0gdW5kZWZpbmVkKSBrMiA9IGs7XG4gICAgdmFyIGRlc2MgPSBPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKG0sIGspO1xuICAgIGlmICghZGVzYyB8fCAoXCJnZXRcIiBpbiBkZXNjID8gIW0uX19lc01vZHVsZSA6IGRlc2Mud3JpdGFibGUgfHwgZGVzYy5jb25maWd1cmFibGUpKSB7XG4gICAgICBkZXNjID0geyBlbnVtZXJhYmxlOiB0cnVlLCBnZXQ6IGZ1bmN0aW9uKCkgeyByZXR1cm4gbVtrXTsgfSB9O1xuICAgIH1cbiAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkobywgazIsIGRlc2MpO1xufSkgOiAoZnVuY3Rpb24obywgbSwgaywgazIpIHtcbiAgICBpZiAoazIgPT09IHVuZGVmaW5lZCkgazIgPSBrO1xuICAgIG9bazJdID0gbVtrXTtcbn0pKTtcbnZhciBfX3NldE1vZHVsZURlZmF1bHQgPSAodGhpcyAmJiB0aGlzLl9fc2V0TW9kdWxlRGVmYXVsdCkgfHwgKE9iamVjdC5jcmVhdGUgPyAoZnVuY3Rpb24obywgdikge1xuICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShvLCBcImRlZmF1bHRcIiwgeyBlbnVtZXJhYmxlOiB0cnVlLCB2YWx1ZTogdiB9KTtcbn0pIDogZnVuY3Rpb24obywgdikge1xuICAgIG9bXCJkZWZhdWx0XCJdID0gdjtcbn0pO1xudmFyIF9faW1wb3J0U3RhciA9ICh0aGlzICYmIHRoaXMuX19pbXBvcnRTdGFyKSB8fCBmdW5jdGlvbiAobW9kKSB7XG4gICAgaWYgKG1vZCAmJiBtb2QuX19lc01vZHVsZSkgcmV0dXJuIG1vZDtcbiAgICB2YXIgcmVzdWx0ID0ge307XG4gICAgaWYgKG1vZCAhPSBudWxsKSBmb3IgKHZhciBrIGluIG1vZCkgaWYgKGsgIT09IFwiZGVmYXVsdFwiICYmIE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChtb2QsIGspKSBfX2NyZWF0ZUJpbmRpbmcocmVzdWx0LCBtb2QsIGspO1xuICAgIF9fc2V0TW9kdWxlRGVmYXVsdChyZXN1bHQsIG1vZCk7XG4gICAgcmV0dXJuIHJlc3VsdDtcbn07XG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJfX2VzTW9kdWxlXCIsIHsgdmFsdWU6IHRydWUgfSk7XG5leHBvcnRzLlBhdGhTY3VycnkgPSBleHBvcnRzLlBhdGggPSBleHBvcnRzLlBhdGhTY3VycnlEYXJ3aW4gPSBleHBvcnRzLlBhdGhTY3VycnlQb3NpeCA9IGV4cG9ydHMuUGF0aFNjdXJyeVdpbjMyID0gZXhwb3J0cy5QYXRoU2N1cnJ5QmFzZSA9IGV4cG9ydHMuUGF0aFBvc2l4ID0gZXhwb3J0cy5QYXRoV2luMzIgPSBleHBvcnRzLlBhdGhCYXNlID0gZXhwb3J0cy5DaGlsZHJlbkNhY2hlID0gZXhwb3J0cy5SZXNvbHZlQ2FjaGUgPSB2b2lkIDA7XG5jb25zdCBscnVfY2FjaGVfMSA9IHJlcXVpcmUoXCJscnUtY2FjaGVcIik7XG5jb25zdCBub2RlX3BhdGhfMSA9IHJlcXVpcmUoXCJub2RlOnBhdGhcIik7XG5jb25zdCBub2RlX3VybF8xID0gcmVxdWlyZShcIm5vZGU6dXJsXCIpO1xuY29uc3QgZnNfMSA9IHJlcXVpcmUoXCJmc1wiKTtcbmNvbnN0IGFjdHVhbEZTID0gX19pbXBvcnRTdGFyKHJlcXVpcmUoXCJub2RlOmZzXCIpKTtcbmNvbnN0IHJlYWxwYXRoU3luYyA9IGZzXzEucmVhbHBhdGhTeW5jLm5hdGl2ZTtcbi8vIFRPRE86IHRlc3QgcGVyZiBvZiBmcy9wcm9taXNlcyByZWFscGF0aCB2cyByZWFscGF0aENCLFxuLy8gc2luY2UgdGhlIHByb21pc2VzIG9uZSB1c2VzIHJlYWxwYXRoLm5hdGl2ZVxuY29uc3QgcHJvbWlzZXNfMSA9IHJlcXVpcmUoXCJub2RlOmZzL3Byb21pc2VzXCIpO1xuY29uc3QgbWluaXBhc3NfMSA9IHJlcXVpcmUoXCJtaW5pcGFzc1wiKTtcbmNvbnN0IGRlZmF1bHRGUyA9IHtcbiAgICBsc3RhdFN5bmM6IGZzXzEubHN0YXRTeW5jLFxuICAgIHJlYWRkaXI6IGZzXzEucmVhZGRpcixcbiAgICByZWFkZGlyU3luYzogZnNfMS5yZWFkZGlyU3luYyxcbiAgICByZWFkbGlua1N5bmM6IGZzXzEucmVhZGxpbmtTeW5jLFxuICAgIHJlYWxwYXRoU3luYyxcbiAgICBwcm9taXNlczoge1xuICAgICAgICBsc3RhdDogcHJvbWlzZXNfMS5sc3RhdCxcbiAgICAgICAgcmVhZGRpcjogcHJvbWlzZXNfMS5yZWFkZGlyLFxuICAgICAgICByZWFkbGluazogcHJvbWlzZXNfMS5yZWFkbGluayxcbiAgICAgICAgcmVhbHBhdGg6IHByb21pc2VzXzEucmVhbHBhdGgsXG4gICAgfSxcbn07XG4vLyBpZiB0aGV5IGp1c3QgZ2F2ZSB1cyByZXF1aXJlKCdmcycpIHRoZW4gdXNlIG91ciBkZWZhdWx0XG5jb25zdCBmc0Zyb21PcHRpb24gPSAoZnNPcHRpb24pID0+ICFmc09wdGlvbiB8fCBmc09wdGlvbiA9PT0gZGVmYXVsdEZTIHx8IGZzT3B0aW9uID09PSBhY3R1YWxGUyA/XG4gICAgZGVmYXVsdEZTXG4gICAgOiB7XG4gICAgICAgIC4uLmRlZmF1bHRGUyxcbiAgICAgICAgLi4uZnNPcHRpb24sXG4gICAgICAgIHByb21pc2VzOiB7XG4gICAgICAgICAgICAuLi5kZWZhdWx0RlMucHJvbWlzZXMsXG4gICAgICAgICAgICAuLi4oZnNPcHRpb24ucHJvbWlzZXMgfHwge30pLFxuICAgICAgICB9LFxuICAgIH07XG4vLyB0dXJuIHNvbWV0aGluZyBsaWtlIC8vPy9jOi8gaW50byBjOlxcXG5jb25zdCB1bmNEcml2ZVJlZ2V4cCA9IC9eXFxcXFxcXFxcXD9cXFxcKFthLXpdOilcXFxcPyQvaTtcbmNvbnN0IHVuY1RvRHJpdmUgPSAocm9vdFBhdGgpID0+IHJvb3RQYXRoLnJlcGxhY2UoL1xcLy9nLCAnXFxcXCcpLnJlcGxhY2UodW5jRHJpdmVSZWdleHAsICckMVxcXFwnKTtcbi8vIHdpbmRvd3MgcGF0aHMgYXJlIHNlcGFyYXRlZCBieSBlaXRoZXIgLyBvciBcXFxuY29uc3QgZWl0aGVyU2VwID0gL1tcXFxcXFwvXS87XG5jb25zdCBVTktOT1dOID0gMDsgLy8gbWF5IG5vdCBldmVuIGV4aXN0LCBmb3IgYWxsIHdlIGtub3dcbmNvbnN0IElGSUZPID0gMGIwMDAxO1xuY29uc3QgSUZDSFIgPSAwYjAwMTA7XG5jb25zdCBJRkRJUiA9IDBiMDEwMDtcbmNvbnN0IElGQkxLID0gMGIwMTEwO1xuY29uc3QgSUZSRUcgPSAwYjEwMDA7XG5jb25zdCBJRkxOSyA9IDBiMTAxMDtcbmNvbnN0IElGU09DSyA9IDBiMTEwMDtcbmNvbnN0IElGTVQgPSAwYjExMTE7XG4vLyBtYXNrIHRvIHVuc2V0IGxvdyA0IGJpdHNcbmNvbnN0IElGTVRfVU5LTk9XTiA9IH5JRk1UO1xuLy8gc2V0IGFmdGVyIHN1Y2Nlc3NmdWxseSBjYWxsaW5nIHJlYWRkaXIoKSBhbmQgZ2V0dGluZyBlbnRyaWVzLlxuY29uc3QgUkVBRERJUl9DQUxMRUQgPSAwYjAwMDBfMDAwMV8wMDAwO1xuLy8gc2V0IGFmdGVyIGEgc3VjY2Vzc2Z1bCBsc3RhdCgpXG5jb25zdCBMU1RBVF9DQUxMRUQgPSAwYjAwMDBfMDAxMF8wMDAwO1xuLy8gc2V0IGlmIGFuIGVudHJ5IChvciBvbmUgb2YgaXRzIHBhcmVudHMpIGlzIGRlZmluaXRlbHkgbm90IGEgZGlyXG5jb25zdCBFTk9URElSID0gMGIwMDAwXzAxMDBfMDAwMDtcbi8vIHNldCBpZiBhbiBlbnRyeSAob3Igb25lIG9mIGl0cyBwYXJlbnRzKSBkb2VzIG5vdCBleGlzdFxuLy8gKGNhbiBhbHNvIGJlIHNldCBvbiBsc3RhdCBlcnJvcnMgbGlrZSBFQUNDRVMgb3IgRU5BTUVUT09MT05HKVxuY29uc3QgRU5PRU5UID0gMGIwMDAwXzEwMDBfMDAwMDtcbi8vIGNhbm5vdCBoYXZlIGNoaWxkIGVudHJpZXMgLS0gYWxzbyB2ZXJpZnkgJklGTVQgaXMgZWl0aGVyIElGRElSIG9yIElGTE5LXG4vLyBzZXQgaWYgd2UgZmFpbCB0byByZWFkbGlua1xuY29uc3QgRU5PUkVBRExJTksgPSAwYjAwMDFfMDAwMF8wMDAwO1xuLy8gc2V0IGlmIHdlIGtub3cgcmVhbHBhdGgoKSB3aWxsIGZhaWxcbmNvbnN0IEVOT1JFQUxQQVRIID0gMGIwMDEwXzAwMDBfMDAwMDtcbmNvbnN0IEVOT0NISUxEID0gRU5PVERJUiB8IEVOT0VOVCB8IEVOT1JFQUxQQVRIO1xuY29uc3QgVFlQRU1BU0sgPSAwYjAwMTFfMTExMV8xMTExO1xuY29uc3QgZW50VG9UeXBlID0gKHMpID0+IHMuaXNGaWxlKCkgPyBJRlJFR1xuICAgIDogcy5pc0RpcmVjdG9yeSgpID8gSUZESVJcbiAgICAgICAgOiBzLmlzU3ltYm9saWNMaW5rKCkgPyBJRkxOS1xuICAgICAgICAgICAgOiBzLmlzQ2hhcmFjdGVyRGV2aWNlKCkgPyBJRkNIUlxuICAgICAgICAgICAgICAgIDogcy5pc0Jsb2NrRGV2aWNlKCkgPyBJRkJMS1xuICAgICAgICAgICAgICAgICAgICA6IHMuaXNTb2NrZXQoKSA/IElGU09DS1xuICAgICAgICAgICAgICAgICAgICAgICAgOiBzLmlzRklGTygpID8gSUZJRk9cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA6IFVOS05PV047XG4vLyBub3JtYWxpemUgdW5pY29kZSBwYXRoIG5hbWVzXG5jb25zdCBub3JtYWxpemVDYWNoZSA9IG5ldyBNYXAoKTtcbmNvbnN0IG5vcm1hbGl6ZSA9IChzKSA9PiB7XG4gICAgY29uc3QgYyA9IG5vcm1hbGl6ZUNhY2hlLmdldChzKTtcbiAgICBpZiAoYylcbiAgICAgICAgcmV0dXJuIGM7XG4gICAgY29uc3QgbiA9IHMubm9ybWFsaXplKCdORktEJyk7XG4gICAgbm9ybWFsaXplQ2FjaGUuc2V0KHMsIG4pO1xuICAgIHJldHVybiBuO1xufTtcbmNvbnN0IG5vcm1hbGl6ZU5vY2FzZUNhY2hlID0gbmV3IE1hcCgpO1xuY29uc3Qgbm9ybWFsaXplTm9jYXNlID0gKHMpID0+IHtcbiAgICBjb25zdCBjID0gbm9ybWFsaXplTm9jYXNlQ2FjaGUuZ2V0KHMpO1xuICAgIGlmIChjKVxuICAgICAgICByZXR1cm4gYztcbiAgICBjb25zdCBuID0gbm9ybWFsaXplKHMudG9Mb3dlckNhc2UoKSk7XG4gICAgbm9ybWFsaXplTm9jYXNlQ2FjaGUuc2V0KHMsIG4pO1xuICAgIHJldHVybiBuO1xufTtcbi8qKlxuICogQW4gTFJVQ2FjaGUgZm9yIHN0b3JpbmcgcmVzb2x2ZWQgcGF0aCBzdHJpbmdzIG9yIFBhdGggb2JqZWN0cy5cbiAqIEBpbnRlcm5hbFxuICovXG5jbGFzcyBSZXNvbHZlQ2FjaGUgZXh0ZW5kcyBscnVfY2FjaGVfMS5MUlVDYWNoZSB7XG4gICAgY29uc3RydWN0b3IoKSB7XG4gICAgICAgIHN1cGVyKHsgbWF4OiAyNTYgfSk7XG4gICAgfVxufVxuZXhwb3J0cy5SZXNvbHZlQ2FjaGUgPSBSZXNvbHZlQ2FjaGU7XG4vLyBJbiBvcmRlciB0byBwcmV2ZW50IGJsb3dpbmcgb3V0IHRoZSBqcyBoZWFwIGJ5IGFsbG9jYXRpbmcgaHVuZHJlZHMgb2Zcbi8vIHRob3VzYW5kcyBvZiBQYXRoIGVudHJpZXMgd2hlbiB3YWxraW5nIGV4dHJlbWVseSBsYXJnZSB0cmVlcywgdGhlIFwiY2hpbGRyZW5cIlxuLy8gaW4gdGhpcyB0cmVlIGFyZSByZXByZXNlbnRlZCBieSBzdG9yaW5nIGFuIGFycmF5IG9mIFBhdGggZW50cmllcyBpbiBhblxuLy8gTFJVQ2FjaGUsIGluZGV4ZWQgYnkgdGhlIHBhcmVudC4gIEF0IGFueSB0aW1lLCBQYXRoLmNoaWxkcmVuKCkgbWF5IHJldHVybiBhblxuLy8gZW1wdHkgYXJyYXksIGluZGljYXRpbmcgdGhhdCBpdCBkb2Vzbid0IGtub3cgYWJvdXQgYW55IG9mIGl0cyBjaGlsZHJlbiwgYW5kXG4vLyB0aHVzIGhhcyB0byByZWJ1aWxkIHRoYXQgY2FjaGUuICBUaGlzIGlzIGZpbmUsIGl0IGp1c3QgbWVhbnMgdGhhdCB3ZSBkb24ndFxuLy8gYmVuZWZpdCBhcyBtdWNoIGZyb20gaGF2aW5nIHRoZSBjYWNoZWQgZW50cmllcywgYnV0IGh1Z2UgZGlyZWN0b3J5IHdhbGtzXG4vLyBkb24ndCBibG93IG91dCB0aGUgc3RhY2ssIGFuZCBzbWFsbGVyIG9uZXMgYXJlIHN0aWxsIGFzIGZhc3QgYXMgcG9zc2libGUuXG4vL1xuLy9JdCBkb2VzIGltcG9zZSBzb21lIGNvbXBsZXhpdHkgd2hlbiBidWlsZGluZyB1cCB0aGUgcmVhZGRpciBkYXRhLCBiZWNhdXNlIHdlXG4vL25lZWQgdG8gcGFzcyBhIHJlZmVyZW5jZSB0byB0aGUgY2hpbGRyZW4gYXJyYXkgdGhhdCB3ZSBzdGFydGVkIHdpdGguXG4vKipcbiAqIGFuIExSVUNhY2hlIGZvciBzdG9yaW5nIGNoaWxkIGVudHJpZXMuXG4gKiBAaW50ZXJuYWxcbiAqL1xuY2xhc3MgQ2hpbGRyZW5DYWNoZSBleHRlbmRzIGxydV9jYWNoZV8xLkxSVUNhY2hlIHtcbiAgICBjb25zdHJ1Y3RvcihtYXhTaXplID0gMTYgKiAxMDI0KSB7XG4gICAgICAgIHN1cGVyKHtcbiAgICAgICAgICAgIG1heFNpemUsXG4gICAgICAgICAgICAvLyBwYXJlbnQgKyBjaGlsZHJlblxuICAgICAgICAgICAgc2l6ZUNhbGN1bGF0aW9uOiBhID0+IGEubGVuZ3RoICsgMSxcbiAgICAgICAgfSk7XG4gICAgfVxufVxuZXhwb3J0cy5DaGlsZHJlbkNhY2hlID0gQ2hpbGRyZW5DYWNoZTtcbmNvbnN0IHNldEFzQ3dkID0gU3ltYm9sKCdQYXRoU2N1cnJ5IHNldEFzQ3dkJyk7XG4vKipcbiAqIFBhdGggb2JqZWN0cyBhcmUgc29ydCBvZiBsaWtlIGEgc3VwZXItcG93ZXJlZFxuICoge0BsaW5rIGh0dHBzOi8vbm9kZWpzLm9yZy9kb2NzL2xhdGVzdC9hcGkvZnMuaHRtbCNjbGFzcy1mc2RpcmVudCBmcy5EaXJlbnR9XG4gKlxuICogRWFjaCBvbmUgcmVwcmVzZW50cyBhIHNpbmdsZSBmaWxlc3lzdGVtIGVudHJ5IG9uIGRpc2ssIHdoaWNoIG1heSBvciBtYXkgbm90XG4gKiBleGlzdC4gSXQgaW5jbHVkZXMgbWV0aG9kcyBmb3IgcmVhZGluZyB2YXJpb3VzIHR5cGVzIG9mIGluZm9ybWF0aW9uIHZpYVxuICogbHN0YXQsIHJlYWRsaW5rLCBhbmQgcmVhZGRpciwgYW5kIGNhY2hlcyBhbGwgaW5mb3JtYXRpb24gdG8gdGhlIGdyZWF0ZXN0XG4gKiBkZWdyZWUgcG9zc2libGUuXG4gKlxuICogTm90ZSB0aGF0IGZzIG9wZXJhdGlvbnMgdGhhdCB3b3VsZCBub3JtYWxseSB0aHJvdyB3aWxsIGluc3RlYWQgcmV0dXJuIGFuXG4gKiBcImVtcHR5XCIgdmFsdWUuIFRoaXMgaXMgaW4gb3JkZXIgdG8gcHJldmVudCBleGNlc3NpdmUgb3ZlcmhlYWQgZnJvbSBlcnJvclxuICogc3RhY2sgdHJhY2VzLlxuICovXG5jbGFzcyBQYXRoQmFzZSB7XG4gICAgLyoqXG4gICAgICogdGhlIGJhc2VuYW1lIG9mIHRoaXMgcGF0aFxuICAgICAqXG4gICAgICogKipJbXBvcnRhbnQqKjogKmFsd2F5cyogdGVzdCB0aGUgcGF0aCBuYW1lIGFnYWluc3QgYW55IHRlc3Qgc3RyaW5nXG4gICAgICogdXNpbmd0aGUge0BsaW5rIGlzTmFtZWR9IG1ldGhvZCwgYW5kIG5vdCBieSBkaXJlY3RseSBjb21wYXJpbmcgdGhpc1xuICAgICAqIHN0cmluZy4gT3RoZXJ3aXNlLCB1bmljb2RlIHBhdGggc3RyaW5ncyB0aGF0IHRoZSBzeXN0ZW0gc2VlcyBhcyBpZGVudGljYWxcbiAgICAgKiB3aWxsIG5vdCBiZSBwcm9wZXJseSB0cmVhdGVkIGFzIHRoZSBzYW1lIHBhdGgsIGxlYWRpbmcgdG8gaW5jb3JyZWN0XG4gICAgICogYmVoYXZpb3IgYW5kIHBvc3NpYmxlIHNlY3VyaXR5IGlzc3Vlcy5cbiAgICAgKi9cbiAgICBuYW1lO1xuICAgIC8qKlxuICAgICAqIHRoZSBQYXRoIGVudHJ5IGNvcnJlc3BvbmRpbmcgdG8gdGhlIHBhdGggcm9vdC5cbiAgICAgKlxuICAgICAqIEBpbnRlcm5hbFxuICAgICAqL1xuICAgIHJvb3Q7XG4gICAgLyoqXG4gICAgICogQWxsIHJvb3RzIGZvdW5kIHdpdGhpbiB0aGUgY3VycmVudCBQYXRoU2N1cnJ5IGZhbWlseVxuICAgICAqXG4gICAgICogQGludGVybmFsXG4gICAgICovXG4gICAgcm9vdHM7XG4gICAgLyoqXG4gICAgICogYSByZWZlcmVuY2UgdG8gdGhlIHBhcmVudCBwYXRoLCBvciB1bmRlZmluZWQgaW4gdGhlIGNhc2Ugb2Ygcm9vdCBlbnRyaWVzXG4gICAgICpcbiAgICAgKiBAaW50ZXJuYWxcbiAgICAgKi9cbiAgICBwYXJlbnQ7XG4gICAgLyoqXG4gICAgICogYm9vbGVhbiBpbmRpY2F0aW5nIHdoZXRoZXIgcGF0aHMgYXJlIGNvbXBhcmVkIGNhc2UtaW5zZW5zaXRpdmVseVxuICAgICAqIEBpbnRlcm5hbFxuICAgICAqL1xuICAgIG5vY2FzZTtcbiAgICAvKipcbiAgICAgKiBib29sZWFuIGluZGljYXRpbmcgdGhhdCB0aGlzIHBhdGggaXMgdGhlIGN1cnJlbnQgd29ya2luZyBkaXJlY3RvcnlcbiAgICAgKiBvZiB0aGUgUGF0aFNjdXJyeSBjb2xsZWN0aW9uIHRoYXQgY29udGFpbnMgaXQuXG4gICAgICovXG4gICAgaXNDV0QgPSBmYWxzZTtcbiAgICAvLyBwb3RlbnRpYWwgZGVmYXVsdCBmcyBvdmVycmlkZVxuICAgICNmcztcbiAgICAvLyBTdGF0cyBmaWVsZHNcbiAgICAjZGV2O1xuICAgIGdldCBkZXYoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLiNkZXY7XG4gICAgfVxuICAgICNtb2RlO1xuICAgIGdldCBtb2RlKCkge1xuICAgICAgICByZXR1cm4gdGhpcy4jbW9kZTtcbiAgICB9XG4gICAgI25saW5rO1xuICAgIGdldCBubGluaygpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuI25saW5rO1xuICAgIH1cbiAgICAjdWlkO1xuICAgIGdldCB1aWQoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLiN1aWQ7XG4gICAgfVxuICAgICNnaWQ7XG4gICAgZ2V0IGdpZCgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuI2dpZDtcbiAgICB9XG4gICAgI3JkZXY7XG4gICAgZ2V0IHJkZXYoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLiNyZGV2O1xuICAgIH1cbiAgICAjYmxrc2l6ZTtcbiAgICBnZXQgYmxrc2l6ZSgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuI2Jsa3NpemU7XG4gICAgfVxuICAgICNpbm87XG4gICAgZ2V0IGlubygpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuI2lubztcbiAgICB9XG4gICAgI3NpemU7XG4gICAgZ2V0IHNpemUoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLiNzaXplO1xuICAgIH1cbiAgICAjYmxvY2tzO1xuICAgIGdldCBibG9ja3MoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLiNibG9ja3M7XG4gICAgfVxuICAgICNhdGltZU1zO1xuICAgIGdldCBhdGltZU1zKCkge1xuICAgICAgICByZXR1cm4gdGhpcy4jYXRpbWVNcztcbiAgICB9XG4gICAgI210aW1lTXM7XG4gICAgZ2V0IG10aW1lTXMoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLiNtdGltZU1zO1xuICAgIH1cbiAgICAjY3RpbWVNcztcbiAgICBnZXQgY3RpbWVNcygpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuI2N0aW1lTXM7XG4gICAgfVxuICAgICNiaXJ0aHRpbWVNcztcbiAgICBnZXQgYmlydGh0aW1lTXMoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLiNiaXJ0aHRpbWVNcztcbiAgICB9XG4gICAgI2F0aW1lO1xuICAgIGdldCBhdGltZSgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuI2F0aW1lO1xuICAgIH1cbiAgICAjbXRpbWU7XG4gICAgZ2V0IG10aW1lKCkge1xuICAgICAgICByZXR1cm4gdGhpcy4jbXRpbWU7XG4gICAgfVxuICAgICNjdGltZTtcbiAgICBnZXQgY3RpbWUoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLiNjdGltZTtcbiAgICB9XG4gICAgI2JpcnRodGltZTtcbiAgICBnZXQgYmlydGh0aW1lKCkge1xuICAgICAgICByZXR1cm4gdGhpcy4jYmlydGh0aW1lO1xuICAgIH1cbiAgICAjbWF0Y2hOYW1lO1xuICAgICNkZXB0aDtcbiAgICAjZnVsbHBhdGg7XG4gICAgI2Z1bGxwYXRoUG9zaXg7XG4gICAgI3JlbGF0aXZlO1xuICAgICNyZWxhdGl2ZVBvc2l4O1xuICAgICN0eXBlO1xuICAgICNjaGlsZHJlbjtcbiAgICAjbGlua1RhcmdldDtcbiAgICAjcmVhbHBhdGg7XG4gICAgLyoqXG4gICAgICogVGhpcyBwcm9wZXJ0eSBpcyBmb3IgY29tcGF0aWJpbGl0eSB3aXRoIHRoZSBEaXJlbnQgY2xhc3MgYXMgb2ZcbiAgICAgKiBOb2RlIHYyMCwgd2hlcmUgRGlyZW50WydwYXJlbnRQYXRoJ10gcmVmZXJzIHRvIHRoZSBwYXRoIG9mIHRoZVxuICAgICAqIGRpcmVjdG9yeSB0aGF0IHdhcyBwYXNzZWQgdG8gcmVhZGRpci4gRm9yIHJvb3QgZW50cmllcywgaXQncyB0aGUgcGF0aFxuICAgICAqIHRvIHRoZSBlbnRyeSBpdHNlbGYuXG4gICAgICovXG4gICAgZ2V0IHBhcmVudFBhdGgoKSB7XG4gICAgICAgIHJldHVybiAodGhpcy5wYXJlbnQgfHwgdGhpcykuZnVsbHBhdGgoKTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogRGVwcmVjYXRlZCBhbGlhcyBmb3IgRGlyZW50WydwYXJlbnRQYXRoJ10gU29tZXdoYXQgY291bnRlcmludHVpdGl2ZWx5LFxuICAgICAqIHRoaXMgcHJvcGVydHkgcmVmZXJzIHRvIHRoZSAqcGFyZW50KiBwYXRoLCBub3QgdGhlIHBhdGggb2JqZWN0IGl0c2VsZi5cbiAgICAgKi9cbiAgICBnZXQgcGF0aCgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMucGFyZW50UGF0aDtcbiAgICB9XG4gICAgLyoqXG4gICAgICogRG8gbm90IGNyZWF0ZSBuZXcgUGF0aCBvYmplY3RzIGRpcmVjdGx5LiAgVGhleSBzaG91bGQgYWx3YXlzIGJlIGFjY2Vzc2VkXG4gICAgICogdmlhIHRoZSBQYXRoU2N1cnJ5IGNsYXNzIG9yIG90aGVyIG1ldGhvZHMgb24gdGhlIFBhdGggY2xhc3MuXG4gICAgICpcbiAgICAgKiBAaW50ZXJuYWxcbiAgICAgKi9cbiAgICBjb25zdHJ1Y3RvcihuYW1lLCB0eXBlID0gVU5LTk9XTiwgcm9vdCwgcm9vdHMsIG5vY2FzZSwgY2hpbGRyZW4sIG9wdHMpIHtcbiAgICAgICAgdGhpcy5uYW1lID0gbmFtZTtcbiAgICAgICAgdGhpcy4jbWF0Y2hOYW1lID0gbm9jYXNlID8gbm9ybWFsaXplTm9jYXNlKG5hbWUpIDogbm9ybWFsaXplKG5hbWUpO1xuICAgICAgICB0aGlzLiN0eXBlID0gdHlwZSAmIFRZUEVNQVNLO1xuICAgICAgICB0aGlzLm5vY2FzZSA9IG5vY2FzZTtcbiAgICAgICAgdGhpcy5yb290cyA9IHJvb3RzO1xuICAgICAgICB0aGlzLnJvb3QgPSByb290IHx8IHRoaXM7XG4gICAgICAgIHRoaXMuI2NoaWxkcmVuID0gY2hpbGRyZW47XG4gICAgICAgIHRoaXMuI2Z1bGxwYXRoID0gb3B0cy5mdWxscGF0aDtcbiAgICAgICAgdGhpcy4jcmVsYXRpdmUgPSBvcHRzLnJlbGF0aXZlO1xuICAgICAgICB0aGlzLiNyZWxhdGl2ZVBvc2l4ID0gb3B0cy5yZWxhdGl2ZVBvc2l4O1xuICAgICAgICB0aGlzLnBhcmVudCA9IG9wdHMucGFyZW50O1xuICAgICAgICBpZiAodGhpcy5wYXJlbnQpIHtcbiAgICAgICAgICAgIHRoaXMuI2ZzID0gdGhpcy5wYXJlbnQuI2ZzO1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgdGhpcy4jZnMgPSBmc0Zyb21PcHRpb24ob3B0cy5mcyk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgLyoqXG4gICAgICogUmV0dXJucyB0aGUgZGVwdGggb2YgdGhlIFBhdGggb2JqZWN0IGZyb20gaXRzIHJvb3QuXG4gICAgICpcbiAgICAgKiBGb3IgZXhhbXBsZSwgYSBwYXRoIGF0IGAvZm9vL2JhcmAgd291bGQgaGF2ZSBhIGRlcHRoIG9mIDIuXG4gICAgICovXG4gICAgZGVwdGgoKSB7XG4gICAgICAgIGlmICh0aGlzLiNkZXB0aCAhPT0gdW5kZWZpbmVkKVxuICAgICAgICAgICAgcmV0dXJuIHRoaXMuI2RlcHRoO1xuICAgICAgICBpZiAoIXRoaXMucGFyZW50KVxuICAgICAgICAgICAgcmV0dXJuICh0aGlzLiNkZXB0aCA9IDApO1xuICAgICAgICByZXR1cm4gKHRoaXMuI2RlcHRoID0gdGhpcy5wYXJlbnQuZGVwdGgoKSArIDEpO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBAaW50ZXJuYWxcbiAgICAgKi9cbiAgICBjaGlsZHJlbkNhY2hlKCkge1xuICAgICAgICByZXR1cm4gdGhpcy4jY2hpbGRyZW47XG4gICAgfVxuICAgIC8qKlxuICAgICAqIEdldCB0aGUgUGF0aCBvYmplY3QgcmVmZXJlbmNlZCBieSB0aGUgc3RyaW5nIHBhdGgsIHJlc29sdmVkIGZyb20gdGhpcyBQYXRoXG4gICAgICovXG4gICAgcmVzb2x2ZShwYXRoKSB7XG4gICAgICAgIGlmICghcGF0aCkge1xuICAgICAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgICAgIH1cbiAgICAgICAgY29uc3Qgcm9vdFBhdGggPSB0aGlzLmdldFJvb3RTdHJpbmcocGF0aCk7XG4gICAgICAgIGNvbnN0IGRpciA9IHBhdGguc3Vic3RyaW5nKHJvb3RQYXRoLmxlbmd0aCk7XG4gICAgICAgIGNvbnN0IGRpclBhcnRzID0gZGlyLnNwbGl0KHRoaXMuc3BsaXRTZXApO1xuICAgICAgICBjb25zdCByZXN1bHQgPSByb290UGF0aCA/XG4gICAgICAgICAgICB0aGlzLmdldFJvb3Qocm9vdFBhdGgpLiNyZXNvbHZlUGFydHMoZGlyUGFydHMpXG4gICAgICAgICAgICA6IHRoaXMuI3Jlc29sdmVQYXJ0cyhkaXJQYXJ0cyk7XG4gICAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgfVxuICAgICNyZXNvbHZlUGFydHMoZGlyUGFydHMpIHtcbiAgICAgICAgbGV0IHAgPSB0aGlzO1xuICAgICAgICBmb3IgKGNvbnN0IHBhcnQgb2YgZGlyUGFydHMpIHtcbiAgICAgICAgICAgIHAgPSBwLmNoaWxkKHBhcnQpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBwO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBSZXR1cm5zIHRoZSBjYWNoZWQgY2hpbGRyZW4gUGF0aCBvYmplY3RzLCBpZiBzdGlsbCBhdmFpbGFibGUuICBJZiB0aGV5XG4gICAgICogaGF2ZSBmYWxsZW4gb3V0IG9mIHRoZSBjYWNoZSwgdGhlbiByZXR1cm5zIGFuIGVtcHR5IGFycmF5LCBhbmQgcmVzZXRzIHRoZVxuICAgICAqIFJFQURESVJfQ0FMTEVEIGJpdCwgc28gdGhhdCBmdXR1cmUgY2FsbHMgdG8gcmVhZGRpcigpIHdpbGwgcmVxdWlyZSBhbiBmc1xuICAgICAqIGxvb2t1cC5cbiAgICAgKlxuICAgICAqIEBpbnRlcm5hbFxuICAgICAqL1xuICAgIGNoaWxkcmVuKCkge1xuICAgICAgICBjb25zdCBjYWNoZWQgPSB0aGlzLiNjaGlsZHJlbi5nZXQodGhpcyk7XG4gICAgICAgIGlmIChjYWNoZWQpIHtcbiAgICAgICAgICAgIHJldHVybiBjYWNoZWQ7XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgY2hpbGRyZW4gPSBPYmplY3QuYXNzaWduKFtdLCB7IHByb3Zpc2lvbmFsOiAwIH0pO1xuICAgICAgICB0aGlzLiNjaGlsZHJlbi5zZXQodGhpcywgY2hpbGRyZW4pO1xuICAgICAgICB0aGlzLiN0eXBlICY9IH5SRUFERElSX0NBTExFRDtcbiAgICAgICAgcmV0dXJuIGNoaWxkcmVuO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBSZXNvbHZlcyBhIHBhdGggcG9ydGlvbiBhbmQgcmV0dXJucyBvciBjcmVhdGVzIHRoZSBjaGlsZCBQYXRoLlxuICAgICAqXG4gICAgICogUmV0dXJucyBgdGhpc2AgaWYgcGF0aFBhcnQgaXMgYCcnYCBvciBgJy4nYCwgb3IgYHBhcmVudGAgaWYgcGF0aFBhcnQgaXNcbiAgICAgKiBgJy4uJ2AuXG4gICAgICpcbiAgICAgKiBUaGlzIHNob3VsZCBub3QgYmUgY2FsbGVkIGRpcmVjdGx5LiAgSWYgYHBhdGhQYXJ0YCBjb250YWlucyBhbnkgcGF0aFxuICAgICAqIHNlcGFyYXRvcnMsIGl0IHdpbGwgbGVhZCB0byB1bnNhZmUgdW5kZWZpbmVkIGJlaGF2aW9yLlxuICAgICAqXG4gICAgICogVXNlIGBQYXRoLnJlc29sdmUoKWAgaW5zdGVhZC5cbiAgICAgKlxuICAgICAqIEBpbnRlcm5hbFxuICAgICAqL1xuICAgIGNoaWxkKHBhdGhQYXJ0LCBvcHRzKSB7XG4gICAgICAgIGlmIChwYXRoUGFydCA9PT0gJycgfHwgcGF0aFBhcnQgPT09ICcuJykge1xuICAgICAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHBhdGhQYXJ0ID09PSAnLi4nKSB7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy5wYXJlbnQgfHwgdGhpcztcbiAgICAgICAgfVxuICAgICAgICAvLyBmaW5kIHRoZSBjaGlsZFxuICAgICAgICBjb25zdCBjaGlsZHJlbiA9IHRoaXMuY2hpbGRyZW4oKTtcbiAgICAgICAgY29uc3QgbmFtZSA9IHRoaXMubm9jYXNlID8gbm9ybWFsaXplTm9jYXNlKHBhdGhQYXJ0KSA6IG5vcm1hbGl6ZShwYXRoUGFydCk7XG4gICAgICAgIGZvciAoY29uc3QgcCBvZiBjaGlsZHJlbikge1xuICAgICAgICAgICAgaWYgKHAuI21hdGNoTmFtZSA9PT0gbmFtZSkge1xuICAgICAgICAgICAgICAgIHJldHVybiBwO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIC8vIGRpZG4ndCBmaW5kIGl0LCBjcmVhdGUgcHJvdmlzaW9uYWwgY2hpbGQsIHNpbmNlIGl0IG1pZ2h0IG5vdFxuICAgICAgICAvLyBhY3R1YWxseSBleGlzdC4gIElmIHdlIGtub3cgdGhlIHBhcmVudCBpc24ndCBhIGRpciwgdGhlblxuICAgICAgICAvLyBpbiBmYWN0IGl0IENBTidUIGV4aXN0LlxuICAgICAgICBjb25zdCBzID0gdGhpcy5wYXJlbnQgPyB0aGlzLnNlcCA6ICcnO1xuICAgICAgICBjb25zdCBmdWxscGF0aCA9IHRoaXMuI2Z1bGxwYXRoID8gdGhpcy4jZnVsbHBhdGggKyBzICsgcGF0aFBhcnQgOiB1bmRlZmluZWQ7XG4gICAgICAgIGNvbnN0IHBjaGlsZCA9IHRoaXMubmV3Q2hpbGQocGF0aFBhcnQsIFVOS05PV04sIHtcbiAgICAgICAgICAgIC4uLm9wdHMsXG4gICAgICAgICAgICBwYXJlbnQ6IHRoaXMsXG4gICAgICAgICAgICBmdWxscGF0aCxcbiAgICAgICAgfSk7XG4gICAgICAgIGlmICghdGhpcy5jYW5SZWFkZGlyKCkpIHtcbiAgICAgICAgICAgIHBjaGlsZC4jdHlwZSB8PSBFTk9FTlQ7XG4gICAgICAgIH1cbiAgICAgICAgLy8gZG9uJ3QgaGF2ZSB0byB1cGRhdGUgcHJvdmlzaW9uYWwsIGJlY2F1c2UgaWYgd2UgaGF2ZSByZWFsIGNoaWxkcmVuLFxuICAgICAgICAvLyB0aGVuIHByb3Zpc2lvbmFsIGlzIHNldCB0byBjaGlsZHJlbi5sZW5ndGgsIG90aGVyd2lzZSBhIGxvd2VyIG51bWJlclxuICAgICAgICBjaGlsZHJlbi5wdXNoKHBjaGlsZCk7XG4gICAgICAgIHJldHVybiBwY2hpbGQ7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIFRoZSByZWxhdGl2ZSBwYXRoIGZyb20gdGhlIGN3ZC4gSWYgaXQgZG9lcyBub3Qgc2hhcmUgYW4gYW5jZXN0b3Igd2l0aFxuICAgICAqIHRoZSBjd2QsIHRoZW4gdGhpcyBlbmRzIHVwIGJlaW5nIGVxdWl2YWxlbnQgdG8gdGhlIGZ1bGxwYXRoKClcbiAgICAgKi9cbiAgICByZWxhdGl2ZSgpIHtcbiAgICAgICAgaWYgKHRoaXMuaXNDV0QpXG4gICAgICAgICAgICByZXR1cm4gJyc7XG4gICAgICAgIGlmICh0aGlzLiNyZWxhdGl2ZSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy4jcmVsYXRpdmU7XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgbmFtZSA9IHRoaXMubmFtZTtcbiAgICAgICAgY29uc3QgcCA9IHRoaXMucGFyZW50O1xuICAgICAgICBpZiAoIXApIHtcbiAgICAgICAgICAgIHJldHVybiAodGhpcy4jcmVsYXRpdmUgPSB0aGlzLm5hbWUpO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IHB2ID0gcC5yZWxhdGl2ZSgpO1xuICAgICAgICByZXR1cm4gcHYgKyAoIXB2IHx8ICFwLnBhcmVudCA/ICcnIDogdGhpcy5zZXApICsgbmFtZTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogVGhlIHJlbGF0aXZlIHBhdGggZnJvbSB0aGUgY3dkLCB1c2luZyAvIGFzIHRoZSBwYXRoIHNlcGFyYXRvci5cbiAgICAgKiBJZiBpdCBkb2VzIG5vdCBzaGFyZSBhbiBhbmNlc3RvciB3aXRoXG4gICAgICogdGhlIGN3ZCwgdGhlbiB0aGlzIGVuZHMgdXAgYmVpbmcgZXF1aXZhbGVudCB0byB0aGUgZnVsbHBhdGhQb3NpeCgpXG4gICAgICogT24gcG9zaXggc3lzdGVtcywgdGhpcyBpcyBpZGVudGljYWwgdG8gcmVsYXRpdmUoKS5cbiAgICAgKi9cbiAgICByZWxhdGl2ZVBvc2l4KCkge1xuICAgICAgICBpZiAodGhpcy5zZXAgPT09ICcvJylcbiAgICAgICAgICAgIHJldHVybiB0aGlzLnJlbGF0aXZlKCk7XG4gICAgICAgIGlmICh0aGlzLmlzQ1dEKVxuICAgICAgICAgICAgcmV0dXJuICcnO1xuICAgICAgICBpZiAodGhpcy4jcmVsYXRpdmVQb3NpeCAhPT0gdW5kZWZpbmVkKVxuICAgICAgICAgICAgcmV0dXJuIHRoaXMuI3JlbGF0aXZlUG9zaXg7XG4gICAgICAgIGNvbnN0IG5hbWUgPSB0aGlzLm5hbWU7XG4gICAgICAgIGNvbnN0IHAgPSB0aGlzLnBhcmVudDtcbiAgICAgICAgaWYgKCFwKSB7XG4gICAgICAgICAgICByZXR1cm4gKHRoaXMuI3JlbGF0aXZlUG9zaXggPSB0aGlzLmZ1bGxwYXRoUG9zaXgoKSk7XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgcHYgPSBwLnJlbGF0aXZlUG9zaXgoKTtcbiAgICAgICAgcmV0dXJuIHB2ICsgKCFwdiB8fCAhcC5wYXJlbnQgPyAnJyA6ICcvJykgKyBuYW1lO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBUaGUgZnVsbHkgcmVzb2x2ZWQgcGF0aCBzdHJpbmcgZm9yIHRoaXMgUGF0aCBlbnRyeVxuICAgICAqL1xuICAgIGZ1bGxwYXRoKCkge1xuICAgICAgICBpZiAodGhpcy4jZnVsbHBhdGggIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMuI2Z1bGxwYXRoO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IG5hbWUgPSB0aGlzLm5hbWU7XG4gICAgICAgIGNvbnN0IHAgPSB0aGlzLnBhcmVudDtcbiAgICAgICAgaWYgKCFwKSB7XG4gICAgICAgICAgICByZXR1cm4gKHRoaXMuI2Z1bGxwYXRoID0gdGhpcy5uYW1lKTtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBwdiA9IHAuZnVsbHBhdGgoKTtcbiAgICAgICAgY29uc3QgZnAgPSBwdiArICghcC5wYXJlbnQgPyAnJyA6IHRoaXMuc2VwKSArIG5hbWU7XG4gICAgICAgIHJldHVybiAodGhpcy4jZnVsbHBhdGggPSBmcCk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIE9uIHBsYXRmb3JtcyBvdGhlciB0aGFuIHdpbmRvd3MsIHRoaXMgaXMgaWRlbnRpY2FsIHRvIGZ1bGxwYXRoLlxuICAgICAqXG4gICAgICogT24gd2luZG93cywgdGhpcyBpcyBvdmVycmlkZGVuIHRvIHJldHVybiB0aGUgZm9yd2FyZC1zbGFzaCBmb3JtIG9mIHRoZVxuICAgICAqIGZ1bGwgVU5DIHBhdGguXG4gICAgICovXG4gICAgZnVsbHBhdGhQb3NpeCgpIHtcbiAgICAgICAgaWYgKHRoaXMuI2Z1bGxwYXRoUG9zaXggIT09IHVuZGVmaW5lZClcbiAgICAgICAgICAgIHJldHVybiB0aGlzLiNmdWxscGF0aFBvc2l4O1xuICAgICAgICBpZiAodGhpcy5zZXAgPT09ICcvJylcbiAgICAgICAgICAgIHJldHVybiAodGhpcy4jZnVsbHBhdGhQb3NpeCA9IHRoaXMuZnVsbHBhdGgoKSk7XG4gICAgICAgIGlmICghdGhpcy5wYXJlbnQpIHtcbiAgICAgICAgICAgIGNvbnN0IHAgPSB0aGlzLmZ1bGxwYXRoKCkucmVwbGFjZSgvXFxcXC9nLCAnLycpO1xuICAgICAgICAgICAgaWYgKC9eW2Etel06XFwvL2kudGVzdChwKSkge1xuICAgICAgICAgICAgICAgIHJldHVybiAodGhpcy4jZnVsbHBhdGhQb3NpeCA9IGAvLz8vJHtwfWApO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuICh0aGlzLiNmdWxscGF0aFBvc2l4ID0gcCk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgcCA9IHRoaXMucGFyZW50O1xuICAgICAgICBjb25zdCBwZnBwID0gcC5mdWxscGF0aFBvc2l4KCk7XG4gICAgICAgIGNvbnN0IGZwcCA9IHBmcHAgKyAoIXBmcHAgfHwgIXAucGFyZW50ID8gJycgOiAnLycpICsgdGhpcy5uYW1lO1xuICAgICAgICByZXR1cm4gKHRoaXMuI2Z1bGxwYXRoUG9zaXggPSBmcHApO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBJcyB0aGUgUGF0aCBvZiBhbiB1bmtub3duIHR5cGU/XG4gICAgICpcbiAgICAgKiBOb3RlIHRoYXQgd2UgbWlnaHQga25vdyAqc29tZXRoaW5nKiBhYm91dCBpdCBpZiB0aGVyZSBoYXMgYmVlbiBhIHByZXZpb3VzXG4gICAgICogZmlsZXN5c3RlbSBvcGVyYXRpb24sIGZvciBleGFtcGxlIHRoYXQgaXQgZG9lcyBub3QgZXhpc3QsIG9yIGlzIG5vdCBhXG4gICAgICogbGluaywgb3Igd2hldGhlciBpdCBoYXMgY2hpbGQgZW50cmllcy5cbiAgICAgKi9cbiAgICBpc1Vua25vd24oKSB7XG4gICAgICAgIHJldHVybiAodGhpcy4jdHlwZSAmIElGTVQpID09PSBVTktOT1dOO1xuICAgIH1cbiAgICBpc1R5cGUodHlwZSkge1xuICAgICAgICByZXR1cm4gdGhpc1tgaXMke3R5cGV9YF0oKTtcbiAgICB9XG4gICAgZ2V0VHlwZSgpIHtcbiAgICAgICAgcmV0dXJuICh0aGlzLmlzVW5rbm93bigpID8gJ1Vua25vd24nXG4gICAgICAgICAgICA6IHRoaXMuaXNEaXJlY3RvcnkoKSA/ICdEaXJlY3RvcnknXG4gICAgICAgICAgICAgICAgOiB0aGlzLmlzRmlsZSgpID8gJ0ZpbGUnXG4gICAgICAgICAgICAgICAgICAgIDogdGhpcy5pc1N5bWJvbGljTGluaygpID8gJ1N5bWJvbGljTGluaydcbiAgICAgICAgICAgICAgICAgICAgICAgIDogdGhpcy5pc0ZJRk8oKSA/ICdGSUZPJ1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDogdGhpcy5pc0NoYXJhY3RlckRldmljZSgpID8gJ0NoYXJhY3RlckRldmljZSdcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOiB0aGlzLmlzQmxvY2tEZXZpY2UoKSA/ICdCbG9ja0RldmljZSdcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDogLyogYzggaWdub3JlIHN0YXJ0ICovIHRoaXMuaXNTb2NrZXQoKSA/ICdTb2NrZXQnXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOiAnVW5rbm93bicpO1xuICAgICAgICAvKiBjOCBpZ25vcmUgc3RvcCAqL1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBJcyB0aGUgUGF0aCBhIHJlZ3VsYXIgZmlsZT9cbiAgICAgKi9cbiAgICBpc0ZpbGUoKSB7XG4gICAgICAgIHJldHVybiAodGhpcy4jdHlwZSAmIElGTVQpID09PSBJRlJFRztcbiAgICB9XG4gICAgLyoqXG4gICAgICogSXMgdGhlIFBhdGggYSBkaXJlY3Rvcnk/XG4gICAgICovXG4gICAgaXNEaXJlY3RvcnkoKSB7XG4gICAgICAgIHJldHVybiAodGhpcy4jdHlwZSAmIElGTVQpID09PSBJRkRJUjtcbiAgICB9XG4gICAgLyoqXG4gICAgICogSXMgdGhlIHBhdGggYSBjaGFyYWN0ZXIgZGV2aWNlP1xuICAgICAqL1xuICAgIGlzQ2hhcmFjdGVyRGV2aWNlKCkge1xuICAgICAgICByZXR1cm4gKHRoaXMuI3R5cGUgJiBJRk1UKSA9PT0gSUZDSFI7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIElzIHRoZSBwYXRoIGEgYmxvY2sgZGV2aWNlP1xuICAgICAqL1xuICAgIGlzQmxvY2tEZXZpY2UoKSB7XG4gICAgICAgIHJldHVybiAodGhpcy4jdHlwZSAmIElGTVQpID09PSBJRkJMSztcbiAgICB9XG4gICAgLyoqXG4gICAgICogSXMgdGhlIHBhdGggYSBGSUZPIHBpcGU/XG4gICAgICovXG4gICAgaXNGSUZPKCkge1xuICAgICAgICByZXR1cm4gKHRoaXMuI3R5cGUgJiBJRk1UKSA9PT0gSUZJRk87XG4gICAgfVxuICAgIC8qKlxuICAgICAqIElzIHRoZSBwYXRoIGEgc29ja2V0P1xuICAgICAqL1xuICAgIGlzU29ja2V0KCkge1xuICAgICAgICByZXR1cm4gKHRoaXMuI3R5cGUgJiBJRk1UKSA9PT0gSUZTT0NLO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBJcyB0aGUgcGF0aCBhIHN5bWJvbGljIGxpbms/XG4gICAgICovXG4gICAgaXNTeW1ib2xpY0xpbmsoKSB7XG4gICAgICAgIHJldHVybiAodGhpcy4jdHlwZSAmIElGTE5LKSA9PT0gSUZMTks7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIFJldHVybiB0aGUgZW50cnkgaWYgaXQgaGFzIGJlZW4gc3ViamVjdCBvZiBhIHN1Y2Nlc3NmdWwgbHN0YXQsIG9yXG4gICAgICogdW5kZWZpbmVkIG90aGVyd2lzZS5cbiAgICAgKlxuICAgICAqIERvZXMgbm90IHJlYWQgdGhlIGZpbGVzeXN0ZW0sIHNvIGFuIHVuZGVmaW5lZCByZXN1bHQgKmNvdWxkKiBzaW1wbHlcbiAgICAgKiBtZWFuIHRoYXQgd2UgaGF2ZW4ndCBjYWxsZWQgbHN0YXQgb24gaXQuXG4gICAgICovXG4gICAgbHN0YXRDYWNoZWQoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLiN0eXBlICYgTFNUQVRfQ0FMTEVEID8gdGhpcyA6IHVuZGVmaW5lZDtcbiAgICB9XG4gICAgLyoqXG4gICAgICogUmV0dXJuIHRoZSBjYWNoZWQgbGluayB0YXJnZXQgaWYgdGhlIGVudHJ5IGhhcyBiZWVuIHRoZSBzdWJqZWN0IG9mIGFcbiAgICAgKiBzdWNjZXNzZnVsIHJlYWRsaW5rLCBvciB1bmRlZmluZWQgb3RoZXJ3aXNlLlxuICAgICAqXG4gICAgICogRG9lcyBub3QgcmVhZCB0aGUgZmlsZXN5c3RlbSwgc28gYW4gdW5kZWZpbmVkIHJlc3VsdCAqY291bGQqIGp1c3QgbWVhbiB3ZVxuICAgICAqIGRvbid0IGhhdmUgYW55IGNhY2hlZCBkYXRhLiBPbmx5IHVzZSBpdCBpZiB5b3UgYXJlIHZlcnkgc3VyZSB0aGF0IGFcbiAgICAgKiByZWFkbGluaygpIGhhcyBiZWVuIGNhbGxlZCBhdCBzb21lIHBvaW50LlxuICAgICAqL1xuICAgIHJlYWRsaW5rQ2FjaGVkKCkge1xuICAgICAgICByZXR1cm4gdGhpcy4jbGlua1RhcmdldDtcbiAgICB9XG4gICAgLyoqXG4gICAgICogUmV0dXJucyB0aGUgY2FjaGVkIHJlYWxwYXRoIHRhcmdldCBpZiB0aGUgZW50cnkgaGFzIGJlZW4gdGhlIHN1YmplY3RcbiAgICAgKiBvZiBhIHN1Y2Nlc3NmdWwgcmVhbHBhdGgsIG9yIHVuZGVmaW5lZCBvdGhlcndpc2UuXG4gICAgICpcbiAgICAgKiBEb2VzIG5vdCByZWFkIHRoZSBmaWxlc3lzdGVtLCBzbyBhbiB1bmRlZmluZWQgcmVzdWx0ICpjb3VsZCoganVzdCBtZWFuIHdlXG4gICAgICogZG9uJ3QgaGF2ZSBhbnkgY2FjaGVkIGRhdGEuIE9ubHkgdXNlIGl0IGlmIHlvdSBhcmUgdmVyeSBzdXJlIHRoYXQgYVxuICAgICAqIHJlYWxwYXRoKCkgaGFzIGJlZW4gY2FsbGVkIGF0IHNvbWUgcG9pbnQuXG4gICAgICovXG4gICAgcmVhbHBhdGhDYWNoZWQoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLiNyZWFscGF0aDtcbiAgICB9XG4gICAgLyoqXG4gICAgICogUmV0dXJucyB0aGUgY2FjaGVkIGNoaWxkIFBhdGggZW50cmllcyBhcnJheSBpZiB0aGUgZW50cnkgaGFzIGJlZW4gdGhlXG4gICAgICogc3ViamVjdCBvZiBhIHN1Y2Nlc3NmdWwgcmVhZGRpcigpLCBvciBbXSBvdGhlcndpc2UuXG4gICAgICpcbiAgICAgKiBEb2VzIG5vdCByZWFkIHRoZSBmaWxlc3lzdGVtLCBzbyBhbiBlbXB0eSBhcnJheSAqY291bGQqIGp1c3QgbWVhbiB3ZVxuICAgICAqIGRvbid0IGhhdmUgYW55IGNhY2hlZCBkYXRhLiBPbmx5IHVzZSBpdCBpZiB5b3UgYXJlIHZlcnkgc3VyZSB0aGF0IGFcbiAgICAgKiByZWFkZGlyKCkgaGFzIGJlZW4gY2FsbGVkIHJlY2VudGx5IGVub3VnaCB0byBzdGlsbCBiZSB2YWxpZC5cbiAgICAgKi9cbiAgICByZWFkZGlyQ2FjaGVkKCkge1xuICAgICAgICBjb25zdCBjaGlsZHJlbiA9IHRoaXMuY2hpbGRyZW4oKTtcbiAgICAgICAgcmV0dXJuIGNoaWxkcmVuLnNsaWNlKDAsIGNoaWxkcmVuLnByb3Zpc2lvbmFsKTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogUmV0dXJuIHRydWUgaWYgaXQncyB3b3J0aCB0cnlpbmcgdG8gcmVhZGxpbmsuICBJZSwgd2UgZG9uJ3QgKHlldCkgaGF2ZVxuICAgICAqIGFueSBpbmRpY2F0aW9uIHRoYXQgcmVhZGxpbmsgd2lsbCBkZWZpbml0ZWx5IGZhaWwuXG4gICAgICpcbiAgICAgKiBSZXR1cm5zIGZhbHNlIGlmIHRoZSBwYXRoIGlzIGtub3duIHRvIG5vdCBiZSBhIHN5bWxpbmssIGlmIGEgcHJldmlvdXNcbiAgICAgKiByZWFkbGluayBmYWlsZWQsIG9yIGlmIHRoZSBlbnRyeSBkb2VzIG5vdCBleGlzdC5cbiAgICAgKi9cbiAgICBjYW5SZWFkbGluaygpIHtcbiAgICAgICAgaWYgKHRoaXMuI2xpbmtUYXJnZXQpXG4gICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgaWYgKCF0aGlzLnBhcmVudClcbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgLy8gY2FzZXMgd2hlcmUgaXQgY2Fubm90IHBvc3NpYmx5IHN1Y2NlZWRcbiAgICAgICAgY29uc3QgaWZtdCA9IHRoaXMuI3R5cGUgJiBJRk1UO1xuICAgICAgICByZXR1cm4gISgoaWZtdCAhPT0gVU5LTk9XTiAmJiBpZm10ICE9PSBJRkxOSykgfHxcbiAgICAgICAgICAgIHRoaXMuI3R5cGUgJiBFTk9SRUFETElOSyB8fFxuICAgICAgICAgICAgdGhpcy4jdHlwZSAmIEVOT0VOVCk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIFJldHVybiB0cnVlIGlmIHJlYWRkaXIgaGFzIHByZXZpb3VzbHkgYmVlbiBzdWNjZXNzZnVsbHkgY2FsbGVkIG9uIHRoaXNcbiAgICAgKiBwYXRoLCBpbmRpY2F0aW5nIHRoYXQgY2FjaGVkUmVhZGRpcigpIGlzIGxpa2VseSB2YWxpZC5cbiAgICAgKi9cbiAgICBjYWxsZWRSZWFkZGlyKCkge1xuICAgICAgICByZXR1cm4gISEodGhpcy4jdHlwZSAmIFJFQURESVJfQ0FMTEVEKTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogUmV0dXJucyB0cnVlIGlmIHRoZSBwYXRoIGlzIGtub3duIHRvIG5vdCBleGlzdC4gVGhhdCBpcywgYSBwcmV2aW91cyBsc3RhdFxuICAgICAqIG9yIHJlYWRkaXIgZmFpbGVkIHRvIHZlcmlmeSBpdHMgZXhpc3RlbmNlIHdoZW4gdGhhdCB3b3VsZCBoYXZlIGJlZW5cbiAgICAgKiBleHBlY3RlZCwgb3IgYSBwYXJlbnQgZW50cnkgd2FzIG1hcmtlZCBlaXRoZXIgZW5vZW50IG9yIGVub3RkaXIuXG4gICAgICovXG4gICAgaXNFTk9FTlQoKSB7XG4gICAgICAgIHJldHVybiAhISh0aGlzLiN0eXBlICYgRU5PRU5UKTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogUmV0dXJuIHRydWUgaWYgdGhlIHBhdGggaXMgYSBtYXRjaCBmb3IgdGhlIGdpdmVuIHBhdGggbmFtZS4gIFRoaXMgaGFuZGxlc1xuICAgICAqIGNhc2Ugc2Vuc2l0aXZpdHkgYW5kIHVuaWNvZGUgbm9ybWFsaXphdGlvbi5cbiAgICAgKlxuICAgICAqIE5vdGU6IGV2ZW4gb24gY2FzZS1zZW5zaXRpdmUgc3lzdGVtcywgaXQgaXMgKipub3QqKiBzYWZlIHRvIHRlc3QgdGhlXG4gICAgICogZXF1YWxpdHkgb2YgdGhlIGAubmFtZWAgcHJvcGVydHkgdG8gZGV0ZXJtaW5lIHdoZXRoZXIgYSBnaXZlbiBwYXRobmFtZVxuICAgICAqIG1hdGNoZXMsIGR1ZSB0byB1bmljb2RlIG5vcm1hbGl6YXRpb24gbWlzbWF0Y2hlcy5cbiAgICAgKlxuICAgICAqIEFsd2F5cyB1c2UgdGhpcyBtZXRob2QgaW5zdGVhZCBvZiB0ZXN0aW5nIHRoZSBgcGF0aC5uYW1lYCBwcm9wZXJ0eVxuICAgICAqIGRpcmVjdGx5LlxuICAgICAqL1xuICAgIGlzTmFtZWQobikge1xuICAgICAgICByZXR1cm4gIXRoaXMubm9jYXNlID9cbiAgICAgICAgICAgIHRoaXMuI21hdGNoTmFtZSA9PT0gbm9ybWFsaXplKG4pXG4gICAgICAgICAgICA6IHRoaXMuI21hdGNoTmFtZSA9PT0gbm9ybWFsaXplTm9jYXNlKG4pO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBSZXR1cm4gdGhlIFBhdGggb2JqZWN0IGNvcnJlc3BvbmRpbmcgdG8gdGhlIHRhcmdldCBvZiBhIHN5bWJvbGljIGxpbmsuXG4gICAgICpcbiAgICAgKiBJZiB0aGUgUGF0aCBpcyBub3QgYSBzeW1ib2xpYyBsaW5rLCBvciBpZiB0aGUgcmVhZGxpbmsgY2FsbCBmYWlscyBmb3IgYW55XG4gICAgICogcmVhc29uLCBgdW5kZWZpbmVkYCBpcyByZXR1cm5lZC5cbiAgICAgKlxuICAgICAqIFJlc3VsdCBpcyBjYWNoZWQsIGFuZCB0aHVzIG1heSBiZSBvdXRkYXRlZCBpZiB0aGUgZmlsZXN5c3RlbSBpcyBtdXRhdGVkLlxuICAgICAqL1xuICAgIGFzeW5jIHJlYWRsaW5rKCkge1xuICAgICAgICBjb25zdCB0YXJnZXQgPSB0aGlzLiNsaW5rVGFyZ2V0O1xuICAgICAgICBpZiAodGFyZ2V0KSB7XG4gICAgICAgICAgICByZXR1cm4gdGFyZ2V0O1xuICAgICAgICB9XG4gICAgICAgIGlmICghdGhpcy5jYW5SZWFkbGluaygpKSB7XG4gICAgICAgICAgICByZXR1cm4gdW5kZWZpbmVkO1xuICAgICAgICB9XG4gICAgICAgIC8qIGM4IGlnbm9yZSBzdGFydCAqL1xuICAgICAgICAvLyBhbHJlYWR5IGNvdmVyZWQgYnkgdGhlIGNhblJlYWRsaW5rIHRlc3QsIGhlcmUgZm9yIHRzIGdydW1wbGVzXG4gICAgICAgIGlmICghdGhpcy5wYXJlbnQpIHtcbiAgICAgICAgICAgIHJldHVybiB1bmRlZmluZWQ7XG4gICAgICAgIH1cbiAgICAgICAgLyogYzggaWdub3JlIHN0b3AgKi9cbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIGNvbnN0IHJlYWQgPSBhd2FpdCB0aGlzLiNmcy5wcm9taXNlcy5yZWFkbGluayh0aGlzLmZ1bGxwYXRoKCkpO1xuICAgICAgICAgICAgY29uc3QgbGlua1RhcmdldCA9IChhd2FpdCB0aGlzLnBhcmVudC5yZWFscGF0aCgpKT8ucmVzb2x2ZShyZWFkKTtcbiAgICAgICAgICAgIGlmIChsaW5rVGFyZ2V0KSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuICh0aGlzLiNsaW5rVGFyZ2V0ID0gbGlua1RhcmdldCk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgY2F0Y2ggKGVyKSB7XG4gICAgICAgICAgICB0aGlzLiNyZWFkbGlua0ZhaWwoZXIuY29kZSk7XG4gICAgICAgICAgICByZXR1cm4gdW5kZWZpbmVkO1xuICAgICAgICB9XG4gICAgfVxuICAgIC8qKlxuICAgICAqIFN5bmNocm9ub3VzIHtAbGluayBQYXRoQmFzZS5yZWFkbGlua31cbiAgICAgKi9cbiAgICByZWFkbGlua1N5bmMoKSB7XG4gICAgICAgIGNvbnN0IHRhcmdldCA9IHRoaXMuI2xpbmtUYXJnZXQ7XG4gICAgICAgIGlmICh0YXJnZXQpIHtcbiAgICAgICAgICAgIHJldHVybiB0YXJnZXQ7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKCF0aGlzLmNhblJlYWRsaW5rKCkpIHtcbiAgICAgICAgICAgIHJldHVybiB1bmRlZmluZWQ7XG4gICAgICAgIH1cbiAgICAgICAgLyogYzggaWdub3JlIHN0YXJ0ICovXG4gICAgICAgIC8vIGFscmVhZHkgY292ZXJlZCBieSB0aGUgY2FuUmVhZGxpbmsgdGVzdCwgaGVyZSBmb3IgdHMgZ3J1bXBsZXNcbiAgICAgICAgaWYgKCF0aGlzLnBhcmVudCkge1xuICAgICAgICAgICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICAgICAgfVxuICAgICAgICAvKiBjOCBpZ25vcmUgc3RvcCAqL1xuICAgICAgICB0cnkge1xuICAgICAgICAgICAgY29uc3QgcmVhZCA9IHRoaXMuI2ZzLnJlYWRsaW5rU3luYyh0aGlzLmZ1bGxwYXRoKCkpO1xuICAgICAgICAgICAgY29uc3QgbGlua1RhcmdldCA9IHRoaXMucGFyZW50LnJlYWxwYXRoU3luYygpPy5yZXNvbHZlKHJlYWQpO1xuICAgICAgICAgICAgaWYgKGxpbmtUYXJnZXQpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gKHRoaXMuI2xpbmtUYXJnZXQgPSBsaW5rVGFyZ2V0KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBjYXRjaCAoZXIpIHtcbiAgICAgICAgICAgIHRoaXMuI3JlYWRsaW5rRmFpbChlci5jb2RlKTtcbiAgICAgICAgICAgIHJldHVybiB1bmRlZmluZWQ7XG4gICAgICAgIH1cbiAgICB9XG4gICAgI3JlYWRkaXJTdWNjZXNzKGNoaWxkcmVuKSB7XG4gICAgICAgIC8vIHN1Y2NlZWRlZCwgbWFyayByZWFkZGlyIGNhbGxlZCBiaXRcbiAgICAgICAgdGhpcy4jdHlwZSB8PSBSRUFERElSX0NBTExFRDtcbiAgICAgICAgLy8gbWFyayBhbGwgcmVtYWluaW5nIHByb3Zpc2lvbmFsIGNoaWxkcmVuIGFzIEVOT0VOVFxuICAgICAgICBmb3IgKGxldCBwID0gY2hpbGRyZW4ucHJvdmlzaW9uYWw7IHAgPCBjaGlsZHJlbi5sZW5ndGg7IHArKykge1xuICAgICAgICAgICAgY29uc3QgYyA9IGNoaWxkcmVuW3BdO1xuICAgICAgICAgICAgaWYgKGMpXG4gICAgICAgICAgICAgICAgYy4jbWFya0VOT0VOVCgpO1xuICAgICAgICB9XG4gICAgfVxuICAgICNtYXJrRU5PRU5UKCkge1xuICAgICAgICAvLyBtYXJrIGFzIFVOS05PV04gYW5kIEVOT0VOVFxuICAgICAgICBpZiAodGhpcy4jdHlwZSAmIEVOT0VOVClcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgdGhpcy4jdHlwZSA9ICh0aGlzLiN0eXBlIHwgRU5PRU5UKSAmIElGTVRfVU5LTk9XTjtcbiAgICAgICAgdGhpcy4jbWFya0NoaWxkcmVuRU5PRU5UKCk7XG4gICAgfVxuICAgICNtYXJrQ2hpbGRyZW5FTk9FTlQoKSB7XG4gICAgICAgIC8vIGFsbCBjaGlsZHJlbiBhcmUgcHJvdmlzaW9uYWwgYW5kIGRvIG5vdCBleGlzdFxuICAgICAgICBjb25zdCBjaGlsZHJlbiA9IHRoaXMuY2hpbGRyZW4oKTtcbiAgICAgICAgY2hpbGRyZW4ucHJvdmlzaW9uYWwgPSAwO1xuICAgICAgICBmb3IgKGNvbnN0IHAgb2YgY2hpbGRyZW4pIHtcbiAgICAgICAgICAgIHAuI21hcmtFTk9FTlQoKTtcbiAgICAgICAgfVxuICAgIH1cbiAgICAjbWFya0VOT1JFQUxQQVRIKCkge1xuICAgICAgICB0aGlzLiN0eXBlIHw9IEVOT1JFQUxQQVRIO1xuICAgICAgICB0aGlzLiNtYXJrRU5PVERJUigpO1xuICAgIH1cbiAgICAvLyBzYXZlIHRoZSBpbmZvcm1hdGlvbiB3aGVuIHdlIGtub3cgdGhlIGVudHJ5IGlzIG5vdCBhIGRpclxuICAgICNtYXJrRU5PVERJUigpIHtcbiAgICAgICAgLy8gZW50cnkgaXMgbm90IGEgZGlyZWN0b3J5LCBzbyBhbnkgY2hpbGRyZW4gY2FuJ3QgZXhpc3QuXG4gICAgICAgIC8vIHRoaXMgKnNob3VsZCogYmUgaW1wb3NzaWJsZSwgc2luY2UgYW55IGNoaWxkcmVuIGNyZWF0ZWRcbiAgICAgICAgLy8gYWZ0ZXIgaXQncyBiZWVuIG1hcmtlZCBFTk9URElSIHNob3VsZCBiZSBtYXJrZWQgRU5PRU5ULFxuICAgICAgICAvLyBzbyBpdCB3b24ndCBldmVuIGdldCB0byB0aGlzIHBvaW50LlxuICAgICAgICAvKiBjOCBpZ25vcmUgc3RhcnQgKi9cbiAgICAgICAgaWYgKHRoaXMuI3R5cGUgJiBFTk9URElSKVxuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAvKiBjOCBpZ25vcmUgc3RvcCAqL1xuICAgICAgICBsZXQgdCA9IHRoaXMuI3R5cGU7XG4gICAgICAgIC8vIHRoaXMgY291bGQgaGFwcGVuIGlmIHdlIHN0YXQgYSBkaXIsIHRoZW4gZGVsZXRlIGl0LFxuICAgICAgICAvLyB0aGVuIHRyeSB0byByZWFkIGl0IG9yIG9uZSBvZiBpdHMgY2hpbGRyZW4uXG4gICAgICAgIGlmICgodCAmIElGTVQpID09PSBJRkRJUilcbiAgICAgICAgICAgIHQgJj0gSUZNVF9VTktOT1dOO1xuICAgICAgICB0aGlzLiN0eXBlID0gdCB8IEVOT1RESVI7XG4gICAgICAgIHRoaXMuI21hcmtDaGlsZHJlbkVOT0VOVCgpO1xuICAgIH1cbiAgICAjcmVhZGRpckZhaWwoY29kZSA9ICcnKSB7XG4gICAgICAgIC8vIG1hcmtFTk9URElSIGFuZCBtYXJrRU5PRU5UIGFsc28gc2V0IHByb3Zpc2lvbmFsPTBcbiAgICAgICAgaWYgKGNvZGUgPT09ICdFTk9URElSJyB8fCBjb2RlID09PSAnRVBFUk0nKSB7XG4gICAgICAgICAgICB0aGlzLiNtYXJrRU5PVERJUigpO1xuICAgICAgICB9XG4gICAgICAgIGVsc2UgaWYgKGNvZGUgPT09ICdFTk9FTlQnKSB7XG4gICAgICAgICAgICB0aGlzLiNtYXJrRU5PRU5UKCk7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICB0aGlzLmNoaWxkcmVuKCkucHJvdmlzaW9uYWwgPSAwO1xuICAgICAgICB9XG4gICAgfVxuICAgICNsc3RhdEZhaWwoY29kZSA9ICcnKSB7XG4gICAgICAgIC8vIFdpbmRvd3MganVzdCByYWlzZXMgRU5PRU5UIGluIHRoaXMgY2FzZSwgZGlzYWJsZSBmb3Igd2luIENJXG4gICAgICAgIC8qIGM4IGlnbm9yZSBzdGFydCAqL1xuICAgICAgICBpZiAoY29kZSA9PT0gJ0VOT1RESVInKSB7XG4gICAgICAgICAgICAvLyBhbHJlYWR5IGtub3cgaXQgaGFzIGEgcGFyZW50IGJ5IHRoaXMgcG9pbnRcbiAgICAgICAgICAgIGNvbnN0IHAgPSB0aGlzLnBhcmVudDtcbiAgICAgICAgICAgIHAuI21hcmtFTk9URElSKCk7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSBpZiAoY29kZSA9PT0gJ0VOT0VOVCcpIHtcbiAgICAgICAgICAgIC8qIGM4IGlnbm9yZSBzdG9wICovXG4gICAgICAgICAgICB0aGlzLiNtYXJrRU5PRU5UKCk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgI3JlYWRsaW5rRmFpbChjb2RlID0gJycpIHtcbiAgICAgICAgbGV0IHRlciA9IHRoaXMuI3R5cGU7XG4gICAgICAgIHRlciB8PSBFTk9SRUFETElOSztcbiAgICAgICAgaWYgKGNvZGUgPT09ICdFTk9FTlQnKVxuICAgICAgICAgICAgdGVyIHw9IEVOT0VOVDtcbiAgICAgICAgLy8gd2luZG93cyBnZXRzIGEgd2VpcmQgZXJyb3Igd2hlbiB5b3UgdHJ5IHRvIHJlYWRsaW5rIGEgZmlsZVxuICAgICAgICBpZiAoY29kZSA9PT0gJ0VJTlZBTCcgfHwgY29kZSA9PT0gJ1VOS05PV04nKSB7XG4gICAgICAgICAgICAvLyBleGlzdHMsIGJ1dCBub3QgYSBzeW1saW5rLCB3ZSBkb24ndCBrbm93IFdIQVQgaXQgaXMsIHNvIHJlbW92ZVxuICAgICAgICAgICAgLy8gYWxsIElGTVQgYml0cy5cbiAgICAgICAgICAgIHRlciAmPSBJRk1UX1VOS05PV047XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy4jdHlwZSA9IHRlcjtcbiAgICAgICAgLy8gd2luZG93cyBqdXN0IGdldHMgRU5PRU5UIGluIHRoaXMgY2FzZS4gIFdlIGRvIGNvdmVyIHRoZSBjYXNlLFxuICAgICAgICAvLyBqdXN0IGRpc2FibGVkIGJlY2F1c2UgaXQncyBpbXBvc3NpYmxlIG9uIFdpbmRvd3MgQ0lcbiAgICAgICAgLyogYzggaWdub3JlIHN0YXJ0ICovXG4gICAgICAgIGlmIChjb2RlID09PSAnRU5PVERJUicgJiYgdGhpcy5wYXJlbnQpIHtcbiAgICAgICAgICAgIHRoaXMucGFyZW50LiNtYXJrRU5PVERJUigpO1xuICAgICAgICB9XG4gICAgICAgIC8qIGM4IGlnbm9yZSBzdG9wICovXG4gICAgfVxuICAgICNyZWFkZGlyQWRkQ2hpbGQoZSwgYykge1xuICAgICAgICByZXR1cm4gKHRoaXMuI3JlYWRkaXJNYXliZVByb21vdGVDaGlsZChlLCBjKSB8fFxuICAgICAgICAgICAgdGhpcy4jcmVhZGRpckFkZE5ld0NoaWxkKGUsIGMpKTtcbiAgICB9XG4gICAgI3JlYWRkaXJBZGROZXdDaGlsZChlLCBjKSB7XG4gICAgICAgIC8vIGFsbG9jIG5ldyBlbnRyeSBhdCBoZWFkLCBzbyBpdCdzIG5ldmVyIHByb3Zpc2lvbmFsXG4gICAgICAgIGNvbnN0IHR5cGUgPSBlbnRUb1R5cGUoZSk7XG4gICAgICAgIGNvbnN0IGNoaWxkID0gdGhpcy5uZXdDaGlsZChlLm5hbWUsIHR5cGUsIHsgcGFyZW50OiB0aGlzIH0pO1xuICAgICAgICBjb25zdCBpZm10ID0gY2hpbGQuI3R5cGUgJiBJRk1UO1xuICAgICAgICBpZiAoaWZtdCAhPT0gSUZESVIgJiYgaWZtdCAhPT0gSUZMTksgJiYgaWZtdCAhPT0gVU5LTk9XTikge1xuICAgICAgICAgICAgY2hpbGQuI3R5cGUgfD0gRU5PVERJUjtcbiAgICAgICAgfVxuICAgICAgICBjLnVuc2hpZnQoY2hpbGQpO1xuICAgICAgICBjLnByb3Zpc2lvbmFsKys7XG4gICAgICAgIHJldHVybiBjaGlsZDtcbiAgICB9XG4gICAgI3JlYWRkaXJNYXliZVByb21vdGVDaGlsZChlLCBjKSB7XG4gICAgICAgIGZvciAobGV0IHAgPSBjLnByb3Zpc2lvbmFsOyBwIDwgYy5sZW5ndGg7IHArKykge1xuICAgICAgICAgICAgY29uc3QgcGNoaWxkID0gY1twXTtcbiAgICAgICAgICAgIGNvbnN0IG5hbWUgPSB0aGlzLm5vY2FzZSA/IG5vcm1hbGl6ZU5vY2FzZShlLm5hbWUpIDogbm9ybWFsaXplKGUubmFtZSk7XG4gICAgICAgICAgICBpZiAobmFtZSAhPT0gcGNoaWxkLiNtYXRjaE5hbWUpIHtcbiAgICAgICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiB0aGlzLiNyZWFkZGlyUHJvbW90ZUNoaWxkKGUsIHBjaGlsZCwgcCwgYyk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgI3JlYWRkaXJQcm9tb3RlQ2hpbGQoZSwgcCwgaW5kZXgsIGMpIHtcbiAgICAgICAgY29uc3QgdiA9IHAubmFtZTtcbiAgICAgICAgLy8gcmV0YWluIGFueSBvdGhlciBmbGFncywgYnV0IHNldCBpZm10IGZyb20gZGlyZW50XG4gICAgICAgIHAuI3R5cGUgPSAocC4jdHlwZSAmIElGTVRfVU5LTk9XTikgfCBlbnRUb1R5cGUoZSk7XG4gICAgICAgIC8vIGNhc2Ugc2Vuc2l0aXZpdHkgZml4aW5nIHdoZW4gd2UgbGVhcm4gdGhlIHRydWUgbmFtZS5cbiAgICAgICAgaWYgKHYgIT09IGUubmFtZSlcbiAgICAgICAgICAgIHAubmFtZSA9IGUubmFtZTtcbiAgICAgICAgLy8ganVzdCBhZHZhbmNlIHByb3Zpc2lvbmFsIGluZGV4IChwb3RlbnRpYWxseSBvZmYgdGhlIGxpc3QpLFxuICAgICAgICAvLyBvdGhlcndpc2Ugd2UgaGF2ZSB0byBzcGxpY2UvcG9wIGl0IG91dCBhbmQgcmUtaW5zZXJ0IGF0IGhlYWRcbiAgICAgICAgaWYgKGluZGV4ICE9PSBjLnByb3Zpc2lvbmFsKSB7XG4gICAgICAgICAgICBpZiAoaW5kZXggPT09IGMubGVuZ3RoIC0gMSlcbiAgICAgICAgICAgICAgICBjLnBvcCgpO1xuICAgICAgICAgICAgZWxzZVxuICAgICAgICAgICAgICAgIGMuc3BsaWNlKGluZGV4LCAxKTtcbiAgICAgICAgICAgIGMudW5zaGlmdChwKTtcbiAgICAgICAgfVxuICAgICAgICBjLnByb3Zpc2lvbmFsKys7XG4gICAgICAgIHJldHVybiBwO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBDYWxsIGxzdGF0KCkgb24gdGhpcyBQYXRoLCBhbmQgdXBkYXRlIGFsbCBrbm93biBpbmZvcm1hdGlvbiB0aGF0IGNhbiBiZVxuICAgICAqIGRldGVybWluZWQuXG4gICAgICpcbiAgICAgKiBOb3RlIHRoYXQgdW5saWtlIGBmcy5sc3RhdCgpYCwgdGhlIHJldHVybmVkIHZhbHVlIGRvZXMgbm90IGNvbnRhaW4gc29tZVxuICAgICAqIGluZm9ybWF0aW9uLCBzdWNoIGFzIGBtb2RlYCwgYGRldmAsIGBubGlua2AsIGFuZCBgaW5vYC4gIElmIHRoYXRcbiAgICAgKiBpbmZvcm1hdGlvbiBpcyByZXF1aXJlZCwgeW91IHdpbGwgbmVlZCB0byBjYWxsIGBmcy5sc3RhdGAgeW91cnNlbGYuXG4gICAgICpcbiAgICAgKiBJZiB0aGUgUGF0aCByZWZlcnMgdG8gYSBub25leGlzdGVudCBmaWxlLCBvciBpZiB0aGUgbHN0YXQgY2FsbCBmYWlscyBmb3JcbiAgICAgKiBhbnkgcmVhc29uLCBgdW5kZWZpbmVkYCBpcyByZXR1cm5lZC4gIE90aGVyd2lzZSB0aGUgdXBkYXRlZCBQYXRoIG9iamVjdCBpc1xuICAgICAqIHJldHVybmVkLlxuICAgICAqXG4gICAgICogUmVzdWx0cyBhcmUgY2FjaGVkLCBhbmQgdGh1cyBtYXkgYmUgb3V0IG9mIGRhdGUgaWYgdGhlIGZpbGVzeXN0ZW0gaXNcbiAgICAgKiBtdXRhdGVkLlxuICAgICAqL1xuICAgIGFzeW5jIGxzdGF0KCkge1xuICAgICAgICBpZiAoKHRoaXMuI3R5cGUgJiBFTk9FTlQpID09PSAwKSB7XG4gICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgIHRoaXMuI2FwcGx5U3RhdChhd2FpdCB0aGlzLiNmcy5wcm9taXNlcy5sc3RhdCh0aGlzLmZ1bGxwYXRoKCkpKTtcbiAgICAgICAgICAgICAgICByZXR1cm4gdGhpcztcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGNhdGNoIChlcikge1xuICAgICAgICAgICAgICAgIHRoaXMuI2xzdGF0RmFpbChlci5jb2RlKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cbiAgICAvKipcbiAgICAgKiBzeW5jaHJvbm91cyB7QGxpbmsgUGF0aEJhc2UubHN0YXR9XG4gICAgICovXG4gICAgbHN0YXRTeW5jKCkge1xuICAgICAgICBpZiAoKHRoaXMuI3R5cGUgJiBFTk9FTlQpID09PSAwKSB7XG4gICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgIHRoaXMuI2FwcGx5U3RhdCh0aGlzLiNmcy5sc3RhdFN5bmModGhpcy5mdWxscGF0aCgpKSk7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBjYXRjaCAoZXIpIHtcbiAgICAgICAgICAgICAgICB0aGlzLiNsc3RhdEZhaWwoZXIuY29kZSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG4gICAgI2FwcGx5U3RhdChzdCkge1xuICAgICAgICBjb25zdCB7IGF0aW1lLCBhdGltZU1zLCBiaXJ0aHRpbWUsIGJpcnRodGltZU1zLCBibGtzaXplLCBibG9ja3MsIGN0aW1lLCBjdGltZU1zLCBkZXYsIGdpZCwgaW5vLCBtb2RlLCBtdGltZSwgbXRpbWVNcywgbmxpbmssIHJkZXYsIHNpemUsIHVpZCwgfSA9IHN0O1xuICAgICAgICB0aGlzLiNhdGltZSA9IGF0aW1lO1xuICAgICAgICB0aGlzLiNhdGltZU1zID0gYXRpbWVNcztcbiAgICAgICAgdGhpcy4jYmlydGh0aW1lID0gYmlydGh0aW1lO1xuICAgICAgICB0aGlzLiNiaXJ0aHRpbWVNcyA9IGJpcnRodGltZU1zO1xuICAgICAgICB0aGlzLiNibGtzaXplID0gYmxrc2l6ZTtcbiAgICAgICAgdGhpcy4jYmxvY2tzID0gYmxvY2tzO1xuICAgICAgICB0aGlzLiNjdGltZSA9IGN0aW1lO1xuICAgICAgICB0aGlzLiNjdGltZU1zID0gY3RpbWVNcztcbiAgICAgICAgdGhpcy4jZGV2ID0gZGV2O1xuICAgICAgICB0aGlzLiNnaWQgPSBnaWQ7XG4gICAgICAgIHRoaXMuI2lubyA9IGlubztcbiAgICAgICAgdGhpcy4jbW9kZSA9IG1vZGU7XG4gICAgICAgIHRoaXMuI210aW1lID0gbXRpbWU7XG4gICAgICAgIHRoaXMuI210aW1lTXMgPSBtdGltZU1zO1xuICAgICAgICB0aGlzLiNubGluayA9IG5saW5rO1xuICAgICAgICB0aGlzLiNyZGV2ID0gcmRldjtcbiAgICAgICAgdGhpcy4jc2l6ZSA9IHNpemU7XG4gICAgICAgIHRoaXMuI3VpZCA9IHVpZDtcbiAgICAgICAgY29uc3QgaWZtdCA9IGVudFRvVHlwZShzdCk7XG4gICAgICAgIC8vIHJldGFpbiBhbnkgb3RoZXIgZmxhZ3MsIGJ1dCBzZXQgdGhlIGlmbXRcbiAgICAgICAgdGhpcy4jdHlwZSA9ICh0aGlzLiN0eXBlICYgSUZNVF9VTktOT1dOKSB8IGlmbXQgfCBMU1RBVF9DQUxMRUQ7XG4gICAgICAgIGlmIChpZm10ICE9PSBVTktOT1dOICYmIGlmbXQgIT09IElGRElSICYmIGlmbXQgIT09IElGTE5LKSB7XG4gICAgICAgICAgICB0aGlzLiN0eXBlIHw9IEVOT1RESVI7XG4gICAgICAgIH1cbiAgICB9XG4gICAgI29uUmVhZGRpckNCID0gW107XG4gICAgI3JlYWRkaXJDQkluRmxpZ2h0ID0gZmFsc2U7XG4gICAgI2NhbGxPblJlYWRkaXJDQihjaGlsZHJlbikge1xuICAgICAgICB0aGlzLiNyZWFkZGlyQ0JJbkZsaWdodCA9IGZhbHNlO1xuICAgICAgICBjb25zdCBjYnMgPSB0aGlzLiNvblJlYWRkaXJDQi5zbGljZSgpO1xuICAgICAgICB0aGlzLiNvblJlYWRkaXJDQi5sZW5ndGggPSAwO1xuICAgICAgICBjYnMuZm9yRWFjaChjYiA9PiBjYihudWxsLCBjaGlsZHJlbikpO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBTdGFuZGFyZCBub2RlLXN0eWxlIGNhbGxiYWNrIGludGVyZmFjZSB0byBnZXQgbGlzdCBvZiBkaXJlY3RvcnkgZW50cmllcy5cbiAgICAgKlxuICAgICAqIElmIHRoZSBQYXRoIGNhbm5vdCBvciBkb2VzIG5vdCBjb250YWluIGFueSBjaGlsZHJlbiwgdGhlbiBhbiBlbXB0eSBhcnJheVxuICAgICAqIGlzIHJldHVybmVkLlxuICAgICAqXG4gICAgICogUmVzdWx0cyBhcmUgY2FjaGVkLCBhbmQgdGh1cyBtYXkgYmUgb3V0IG9mIGRhdGUgaWYgdGhlIGZpbGVzeXN0ZW0gaXNcbiAgICAgKiBtdXRhdGVkLlxuICAgICAqXG4gICAgICogQHBhcmFtIGNiIFRoZSBjYWxsYmFjayBjYWxsZWQgd2l0aCAoZXIsIGVudHJpZXMpLiAgTm90ZSB0aGF0IHRoZSBgZXJgXG4gICAgICogcGFyYW0gaXMgc29tZXdoYXQgZXh0cmFuZW91cywgYXMgYWxsIHJlYWRkaXIoKSBlcnJvcnMgYXJlIGhhbmRsZWQgYW5kXG4gICAgICogc2ltcGx5IHJlc3VsdCBpbiBhbiBlbXB0eSBzZXQgb2YgZW50cmllcyBiZWluZyByZXR1cm5lZC5cbiAgICAgKiBAcGFyYW0gYWxsb3daYWxnbyBCb29sZWFuIGluZGljYXRpbmcgdGhhdCBpbW1lZGlhdGVseSBrbm93biByZXN1bHRzIHNob3VsZFxuICAgICAqICpub3QqIGJlIGRlZmVycmVkIHdpdGggYHF1ZXVlTWljcm90YXNrYC4gRGVmYXVsdHMgdG8gYGZhbHNlYC4gUmVsZWFzZVxuICAgICAqIHphbGdvIGF0IHlvdXIgcGVyaWwsIHRoZSBkYXJrIHBvbnkgbG9yZCBpcyBkZXZpb3VzIGFuZCB1bmZvcmdpdmluZy5cbiAgICAgKi9cbiAgICByZWFkZGlyQ0IoY2IsIGFsbG93WmFsZ28gPSBmYWxzZSkge1xuICAgICAgICBpZiAoIXRoaXMuY2FuUmVhZGRpcigpKSB7XG4gICAgICAgICAgICBpZiAoYWxsb3daYWxnbylcbiAgICAgICAgICAgICAgICBjYihudWxsLCBbXSk7XG4gICAgICAgICAgICBlbHNlXG4gICAgICAgICAgICAgICAgcXVldWVNaWNyb3Rhc2soKCkgPT4gY2IobnVsbCwgW10pKTtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBjaGlsZHJlbiA9IHRoaXMuY2hpbGRyZW4oKTtcbiAgICAgICAgaWYgKHRoaXMuY2FsbGVkUmVhZGRpcigpKSB7XG4gICAgICAgICAgICBjb25zdCBjID0gY2hpbGRyZW4uc2xpY2UoMCwgY2hpbGRyZW4ucHJvdmlzaW9uYWwpO1xuICAgICAgICAgICAgaWYgKGFsbG93WmFsZ28pXG4gICAgICAgICAgICAgICAgY2IobnVsbCwgYyk7XG4gICAgICAgICAgICBlbHNlXG4gICAgICAgICAgICAgICAgcXVldWVNaWNyb3Rhc2soKCkgPT4gY2IobnVsbCwgYykpO1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIC8vIGRvbid0IGhhdmUgdG8gd29ycnkgYWJvdXQgemFsZ28gYXQgdGhpcyBwb2ludC5cbiAgICAgICAgdGhpcy4jb25SZWFkZGlyQ0IucHVzaChjYik7XG4gICAgICAgIGlmICh0aGlzLiNyZWFkZGlyQ0JJbkZsaWdodCkge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMuI3JlYWRkaXJDQkluRmxpZ2h0ID0gdHJ1ZTtcbiAgICAgICAgLy8gZWxzZSByZWFkIHRoZSBkaXJlY3RvcnksIGZpbGwgdXAgY2hpbGRyZW5cbiAgICAgICAgLy8gZGUtcHJvdmlzaW9uYWxpemUgYW55IHByb3Zpc2lvbmFsIGNoaWxkcmVuLlxuICAgICAgICBjb25zdCBmdWxscGF0aCA9IHRoaXMuZnVsbHBhdGgoKTtcbiAgICAgICAgdGhpcy4jZnMucmVhZGRpcihmdWxscGF0aCwgeyB3aXRoRmlsZVR5cGVzOiB0cnVlIH0sIChlciwgZW50cmllcykgPT4ge1xuICAgICAgICAgICAgaWYgKGVyKSB7XG4gICAgICAgICAgICAgICAgdGhpcy4jcmVhZGRpckZhaWwoZXIuY29kZSk7XG4gICAgICAgICAgICAgICAgY2hpbGRyZW4ucHJvdmlzaW9uYWwgPSAwO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgLy8gaWYgd2UgZGlkbid0IGdldCBhbiBlcnJvciwgd2UgYWx3YXlzIGdldCBlbnRyaWVzLlxuICAgICAgICAgICAgICAgIC8vQHRzLWlnbm9yZVxuICAgICAgICAgICAgICAgIGZvciAoY29uc3QgZSBvZiBlbnRyaWVzKSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuI3JlYWRkaXJBZGRDaGlsZChlLCBjaGlsZHJlbik7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHRoaXMuI3JlYWRkaXJTdWNjZXNzKGNoaWxkcmVuKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHRoaXMuI2NhbGxPblJlYWRkaXJDQihjaGlsZHJlbi5zbGljZSgwLCBjaGlsZHJlbi5wcm92aXNpb25hbCkpO1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9KTtcbiAgICB9XG4gICAgI2FzeW5jUmVhZGRpckluRmxpZ2h0O1xuICAgIC8qKlxuICAgICAqIFJldHVybiBhbiBhcnJheSBvZiBrbm93biBjaGlsZCBlbnRyaWVzLlxuICAgICAqXG4gICAgICogSWYgdGhlIFBhdGggY2Fubm90IG9yIGRvZXMgbm90IGNvbnRhaW4gYW55IGNoaWxkcmVuLCB0aGVuIGFuIGVtcHR5IGFycmF5XG4gICAgICogaXMgcmV0dXJuZWQuXG4gICAgICpcbiAgICAgKiBSZXN1bHRzIGFyZSBjYWNoZWQsIGFuZCB0aHVzIG1heSBiZSBvdXQgb2YgZGF0ZSBpZiB0aGUgZmlsZXN5c3RlbSBpc1xuICAgICAqIG11dGF0ZWQuXG4gICAgICovXG4gICAgYXN5bmMgcmVhZGRpcigpIHtcbiAgICAgICAgaWYgKCF0aGlzLmNhblJlYWRkaXIoKSkge1xuICAgICAgICAgICAgcmV0dXJuIFtdO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IGNoaWxkcmVuID0gdGhpcy5jaGlsZHJlbigpO1xuICAgICAgICBpZiAodGhpcy5jYWxsZWRSZWFkZGlyKCkpIHtcbiAgICAgICAgICAgIHJldHVybiBjaGlsZHJlbi5zbGljZSgwLCBjaGlsZHJlbi5wcm92aXNpb25hbCk7XG4gICAgICAgIH1cbiAgICAgICAgLy8gZWxzZSByZWFkIHRoZSBkaXJlY3RvcnksIGZpbGwgdXAgY2hpbGRyZW5cbiAgICAgICAgLy8gZGUtcHJvdmlzaW9uYWxpemUgYW55IHByb3Zpc2lvbmFsIGNoaWxkcmVuLlxuICAgICAgICBjb25zdCBmdWxscGF0aCA9IHRoaXMuZnVsbHBhdGgoKTtcbiAgICAgICAgaWYgKHRoaXMuI2FzeW5jUmVhZGRpckluRmxpZ2h0KSB7XG4gICAgICAgICAgICBhd2FpdCB0aGlzLiNhc3luY1JlYWRkaXJJbkZsaWdodDtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIC8qIGM4IGlnbm9yZSBzdGFydCAqL1xuICAgICAgICAgICAgbGV0IHJlc29sdmUgPSAoKSA9PiB7IH07XG4gICAgICAgICAgICAvKiBjOCBpZ25vcmUgc3RvcCAqL1xuICAgICAgICAgICAgdGhpcy4jYXN5bmNSZWFkZGlySW5GbGlnaHQgPSBuZXcgUHJvbWlzZShyZXMgPT4gKHJlc29sdmUgPSByZXMpKTtcbiAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgZm9yIChjb25zdCBlIG9mIGF3YWl0IHRoaXMuI2ZzLnByb21pc2VzLnJlYWRkaXIoZnVsbHBhdGgsIHtcbiAgICAgICAgICAgICAgICAgICAgd2l0aEZpbGVUeXBlczogdHJ1ZSxcbiAgICAgICAgICAgICAgICB9KSkge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLiNyZWFkZGlyQWRkQ2hpbGQoZSwgY2hpbGRyZW4pO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB0aGlzLiNyZWFkZGlyU3VjY2VzcyhjaGlsZHJlbik7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBjYXRjaCAoZXIpIHtcbiAgICAgICAgICAgICAgICB0aGlzLiNyZWFkZGlyRmFpbChlci5jb2RlKTtcbiAgICAgICAgICAgICAgICBjaGlsZHJlbi5wcm92aXNpb25hbCA9IDA7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICB0aGlzLiNhc3luY1JlYWRkaXJJbkZsaWdodCA9IHVuZGVmaW5lZDtcbiAgICAgICAgICAgIHJlc29sdmUoKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gY2hpbGRyZW4uc2xpY2UoMCwgY2hpbGRyZW4ucHJvdmlzaW9uYWwpO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBzeW5jaHJvbm91cyB7QGxpbmsgUGF0aEJhc2UucmVhZGRpcn1cbiAgICAgKi9cbiAgICByZWFkZGlyU3luYygpIHtcbiAgICAgICAgaWYgKCF0aGlzLmNhblJlYWRkaXIoKSkge1xuICAgICAgICAgICAgcmV0dXJuIFtdO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IGNoaWxkcmVuID0gdGhpcy5jaGlsZHJlbigpO1xuICAgICAgICBpZiAodGhpcy5jYWxsZWRSZWFkZGlyKCkpIHtcbiAgICAgICAgICAgIHJldHVybiBjaGlsZHJlbi5zbGljZSgwLCBjaGlsZHJlbi5wcm92aXNpb25hbCk7XG4gICAgICAgIH1cbiAgICAgICAgLy8gZWxzZSByZWFkIHRoZSBkaXJlY3RvcnksIGZpbGwgdXAgY2hpbGRyZW5cbiAgICAgICAgLy8gZGUtcHJvdmlzaW9uYWxpemUgYW55IHByb3Zpc2lvbmFsIGNoaWxkcmVuLlxuICAgICAgICBjb25zdCBmdWxscGF0aCA9IHRoaXMuZnVsbHBhdGgoKTtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIGZvciAoY29uc3QgZSBvZiB0aGlzLiNmcy5yZWFkZGlyU3luYyhmdWxscGF0aCwge1xuICAgICAgICAgICAgICAgIHdpdGhGaWxlVHlwZXM6IHRydWUsXG4gICAgICAgICAgICB9KSkge1xuICAgICAgICAgICAgICAgIHRoaXMuI3JlYWRkaXJBZGRDaGlsZChlLCBjaGlsZHJlbik7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICB0aGlzLiNyZWFkZGlyU3VjY2VzcyhjaGlsZHJlbik7XG4gICAgICAgIH1cbiAgICAgICAgY2F0Y2ggKGVyKSB7XG4gICAgICAgICAgICB0aGlzLiNyZWFkZGlyRmFpbChlci5jb2RlKTtcbiAgICAgICAgICAgIGNoaWxkcmVuLnByb3Zpc2lvbmFsID0gMDtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gY2hpbGRyZW4uc2xpY2UoMCwgY2hpbGRyZW4ucHJvdmlzaW9uYWwpO1xuICAgIH1cbiAgICBjYW5SZWFkZGlyKCkge1xuICAgICAgICBpZiAodGhpcy4jdHlwZSAmIEVOT0NISUxEKVxuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICBjb25zdCBpZm10ID0gSUZNVCAmIHRoaXMuI3R5cGU7XG4gICAgICAgIC8vIHdlIGFsd2F5cyBzZXQgRU5PVERJUiB3aGVuIHNldHRpbmcgSUZNVCwgc28gc2hvdWxkIGJlIGltcG9zc2libGVcbiAgICAgICAgLyogYzggaWdub3JlIHN0YXJ0ICovXG4gICAgICAgIGlmICghKGlmbXQgPT09IFVOS05PV04gfHwgaWZtdCA9PT0gSUZESVIgfHwgaWZtdCA9PT0gSUZMTkspKSB7XG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgIH1cbiAgICAgICAgLyogYzggaWdub3JlIHN0b3AgKi9cbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuICAgIHNob3VsZFdhbGsoZGlycywgd2Fsa0ZpbHRlcikge1xuICAgICAgICByZXR1cm4gKCh0aGlzLiN0eXBlICYgSUZESVIpID09PSBJRkRJUiAmJlxuICAgICAgICAgICAgISh0aGlzLiN0eXBlICYgRU5PQ0hJTEQpICYmXG4gICAgICAgICAgICAhZGlycy5oYXModGhpcykgJiZcbiAgICAgICAgICAgICghd2Fsa0ZpbHRlciB8fCB3YWxrRmlsdGVyKHRoaXMpKSk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIFJldHVybiB0aGUgUGF0aCBvYmplY3QgY29ycmVzcG9uZGluZyB0byBwYXRoIGFzIHJlc29sdmVkXG4gICAgICogYnkgcmVhbHBhdGgoMykuXG4gICAgICpcbiAgICAgKiBJZiB0aGUgcmVhbHBhdGggY2FsbCBmYWlscyBmb3IgYW55IHJlYXNvbiwgYHVuZGVmaW5lZGAgaXMgcmV0dXJuZWQuXG4gICAgICpcbiAgICAgKiBSZXN1bHQgaXMgY2FjaGVkLCBhbmQgdGh1cyBtYXkgYmUgb3V0ZGF0ZWQgaWYgdGhlIGZpbGVzeXN0ZW0gaXMgbXV0YXRlZC5cbiAgICAgKiBPbiBzdWNjZXNzLCByZXR1cm5zIGEgUGF0aCBvYmplY3QuXG4gICAgICovXG4gICAgYXN5bmMgcmVhbHBhdGgoKSB7XG4gICAgICAgIGlmICh0aGlzLiNyZWFscGF0aClcbiAgICAgICAgICAgIHJldHVybiB0aGlzLiNyZWFscGF0aDtcbiAgICAgICAgaWYgKChFTk9SRUFMUEFUSCB8IEVOT1JFQURMSU5LIHwgRU5PRU5UKSAmIHRoaXMuI3R5cGUpXG4gICAgICAgICAgICByZXR1cm4gdW5kZWZpbmVkO1xuICAgICAgICB0cnkge1xuICAgICAgICAgICAgY29uc3QgcnAgPSBhd2FpdCB0aGlzLiNmcy5wcm9taXNlcy5yZWFscGF0aCh0aGlzLmZ1bGxwYXRoKCkpO1xuICAgICAgICAgICAgcmV0dXJuICh0aGlzLiNyZWFscGF0aCA9IHRoaXMucmVzb2x2ZShycCkpO1xuICAgICAgICB9XG4gICAgICAgIGNhdGNoIChfKSB7XG4gICAgICAgICAgICB0aGlzLiNtYXJrRU5PUkVBTFBBVEgoKTtcbiAgICAgICAgfVxuICAgIH1cbiAgICAvKipcbiAgICAgKiBTeW5jaHJvbm91cyB7QGxpbmsgcmVhbHBhdGh9XG4gICAgICovXG4gICAgcmVhbHBhdGhTeW5jKCkge1xuICAgICAgICBpZiAodGhpcy4jcmVhbHBhdGgpXG4gICAgICAgICAgICByZXR1cm4gdGhpcy4jcmVhbHBhdGg7XG4gICAgICAgIGlmICgoRU5PUkVBTFBBVEggfCBFTk9SRUFETElOSyB8IEVOT0VOVCkgJiB0aGlzLiN0eXBlKVxuICAgICAgICAgICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIGNvbnN0IHJwID0gdGhpcy4jZnMucmVhbHBhdGhTeW5jKHRoaXMuZnVsbHBhdGgoKSk7XG4gICAgICAgICAgICByZXR1cm4gKHRoaXMuI3JlYWxwYXRoID0gdGhpcy5yZXNvbHZlKHJwKSk7XG4gICAgICAgIH1cbiAgICAgICAgY2F0Y2ggKF8pIHtcbiAgICAgICAgICAgIHRoaXMuI21hcmtFTk9SRUFMUEFUSCgpO1xuICAgICAgICB9XG4gICAgfVxuICAgIC8qKlxuICAgICAqIEludGVybmFsIG1ldGhvZCB0byBtYXJrIHRoaXMgUGF0aCBvYmplY3QgYXMgdGhlIHNjdXJyeSBjd2QsXG4gICAgICogY2FsbGVkIGJ5IHtAbGluayBQYXRoU2N1cnJ5I2NoZGlyfVxuICAgICAqXG4gICAgICogQGludGVybmFsXG4gICAgICovXG4gICAgW3NldEFzQ3dkXShvbGRDd2QpIHtcbiAgICAgICAgaWYgKG9sZEN3ZCA9PT0gdGhpcylcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgb2xkQ3dkLmlzQ1dEID0gZmFsc2U7XG4gICAgICAgIHRoaXMuaXNDV0QgPSB0cnVlO1xuICAgICAgICBjb25zdCBjaGFuZ2VkID0gbmV3IFNldChbXSk7XG4gICAgICAgIGxldCBycCA9IFtdO1xuICAgICAgICBsZXQgcCA9IHRoaXM7XG4gICAgICAgIHdoaWxlIChwICYmIHAucGFyZW50KSB7XG4gICAgICAgICAgICBjaGFuZ2VkLmFkZChwKTtcbiAgICAgICAgICAgIHAuI3JlbGF0aXZlID0gcnAuam9pbih0aGlzLnNlcCk7XG4gICAgICAgICAgICBwLiNyZWxhdGl2ZVBvc2l4ID0gcnAuam9pbignLycpO1xuICAgICAgICAgICAgcCA9IHAucGFyZW50O1xuICAgICAgICAgICAgcnAucHVzaCgnLi4nKTtcbiAgICAgICAgfVxuICAgICAgICAvLyBub3cgdW4tbWVtb2l6ZSBwYXJlbnRzIG9mIG9sZCBjd2RcbiAgICAgICAgcCA9IG9sZEN3ZDtcbiAgICAgICAgd2hpbGUgKHAgJiYgcC5wYXJlbnQgJiYgIWNoYW5nZWQuaGFzKHApKSB7XG4gICAgICAgICAgICBwLiNyZWxhdGl2ZSA9IHVuZGVmaW5lZDtcbiAgICAgICAgICAgIHAuI3JlbGF0aXZlUG9zaXggPSB1bmRlZmluZWQ7XG4gICAgICAgICAgICBwID0gcC5wYXJlbnQ7XG4gICAgICAgIH1cbiAgICB9XG59XG5leHBvcnRzLlBhdGhCYXNlID0gUGF0aEJhc2U7XG4vKipcbiAqIFBhdGggY2xhc3MgdXNlZCBvbiB3aW4zMiBzeXN0ZW1zXG4gKlxuICogVXNlcyBgJ1xcXFwnYCBhcyB0aGUgcGF0aCBzZXBhcmF0b3IgZm9yIHJldHVybmVkIHBhdGhzLCBlaXRoZXIgYCdcXFxcJ2Agb3IgYCcvJ2BcbiAqIGFzIHRoZSBwYXRoIHNlcGFyYXRvciBmb3IgcGFyc2luZyBwYXRocy5cbiAqL1xuY2xhc3MgUGF0aFdpbjMyIGV4dGVuZHMgUGF0aEJhc2Uge1xuICAgIC8qKlxuICAgICAqIFNlcGFyYXRvciBmb3IgZ2VuZXJhdGluZyBwYXRoIHN0cmluZ3MuXG4gICAgICovXG4gICAgc2VwID0gJ1xcXFwnO1xuICAgIC8qKlxuICAgICAqIFNlcGFyYXRvciBmb3IgcGFyc2luZyBwYXRoIHN0cmluZ3MuXG4gICAgICovXG4gICAgc3BsaXRTZXAgPSBlaXRoZXJTZXA7XG4gICAgLyoqXG4gICAgICogRG8gbm90IGNyZWF0ZSBuZXcgUGF0aCBvYmplY3RzIGRpcmVjdGx5LiAgVGhleSBzaG91bGQgYWx3YXlzIGJlIGFjY2Vzc2VkXG4gICAgICogdmlhIHRoZSBQYXRoU2N1cnJ5IGNsYXNzIG9yIG90aGVyIG1ldGhvZHMgb24gdGhlIFBhdGggY2xhc3MuXG4gICAgICpcbiAgICAgKiBAaW50ZXJuYWxcbiAgICAgKi9cbiAgICBjb25zdHJ1Y3RvcihuYW1lLCB0eXBlID0gVU5LTk9XTiwgcm9vdCwgcm9vdHMsIG5vY2FzZSwgY2hpbGRyZW4sIG9wdHMpIHtcbiAgICAgICAgc3VwZXIobmFtZSwgdHlwZSwgcm9vdCwgcm9vdHMsIG5vY2FzZSwgY2hpbGRyZW4sIG9wdHMpO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBAaW50ZXJuYWxcbiAgICAgKi9cbiAgICBuZXdDaGlsZChuYW1lLCB0eXBlID0gVU5LTk9XTiwgb3B0cyA9IHt9KSB7XG4gICAgICAgIHJldHVybiBuZXcgUGF0aFdpbjMyKG5hbWUsIHR5cGUsIHRoaXMucm9vdCwgdGhpcy5yb290cywgdGhpcy5ub2Nhc2UsIHRoaXMuY2hpbGRyZW5DYWNoZSgpLCBvcHRzKTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogQGludGVybmFsXG4gICAgICovXG4gICAgZ2V0Um9vdFN0cmluZyhwYXRoKSB7XG4gICAgICAgIHJldHVybiBub2RlX3BhdGhfMS53aW4zMi5wYXJzZShwYXRoKS5yb290O1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBAaW50ZXJuYWxcbiAgICAgKi9cbiAgICBnZXRSb290KHJvb3RQYXRoKSB7XG4gICAgICAgIHJvb3RQYXRoID0gdW5jVG9Ecml2ZShyb290UGF0aC50b1VwcGVyQ2FzZSgpKTtcbiAgICAgICAgaWYgKHJvb3RQYXRoID09PSB0aGlzLnJvb3QubmFtZSkge1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMucm9vdDtcbiAgICAgICAgfVxuICAgICAgICAvLyBvaywgbm90IHRoYXQgb25lLCBjaGVjayBpZiBpdCBtYXRjaGVzIGFub3RoZXIgd2Uga25vdyBhYm91dFxuICAgICAgICBmb3IgKGNvbnN0IFtjb21wYXJlLCByb290XSBvZiBPYmplY3QuZW50cmllcyh0aGlzLnJvb3RzKSkge1xuICAgICAgICAgICAgaWYgKHRoaXMuc2FtZVJvb3Qocm9vdFBhdGgsIGNvbXBhcmUpKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuICh0aGlzLnJvb3RzW3Jvb3RQYXRoXSA9IHJvb3QpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIC8vIG90aGVyd2lzZSwgaGF2ZSB0byBjcmVhdGUgYSBuZXcgb25lLlxuICAgICAgICByZXR1cm4gKHRoaXMucm9vdHNbcm9vdFBhdGhdID0gbmV3IFBhdGhTY3VycnlXaW4zMihyb290UGF0aCwgdGhpcykucm9vdCk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIEBpbnRlcm5hbFxuICAgICAqL1xuICAgIHNhbWVSb290KHJvb3RQYXRoLCBjb21wYXJlID0gdGhpcy5yb290Lm5hbWUpIHtcbiAgICAgICAgLy8gd2luZG93cyBjYW4gKHJhcmVseSkgaGF2ZSBjYXNlLXNlbnNpdGl2ZSBmaWxlc3lzdGVtLCBidXRcbiAgICAgICAgLy8gVU5DIGFuZCBkcml2ZSBsZXR0ZXJzIGFyZSBhbHdheXMgY2FzZS1pbnNlbnNpdGl2ZSwgYW5kIGNhbm9uaWNhbGx5XG4gICAgICAgIC8vIHJlcHJlc2VudGVkIHVwcGVyY2FzZS5cbiAgICAgICAgcm9vdFBhdGggPSByb290UGF0aFxuICAgICAgICAgICAgLnRvVXBwZXJDYXNlKClcbiAgICAgICAgICAgIC5yZXBsYWNlKC9cXC8vZywgJ1xcXFwnKVxuICAgICAgICAgICAgLnJlcGxhY2UodW5jRHJpdmVSZWdleHAsICckMVxcXFwnKTtcbiAgICAgICAgcmV0dXJuIHJvb3RQYXRoID09PSBjb21wYXJlO1xuICAgIH1cbn1cbmV4cG9ydHMuUGF0aFdpbjMyID0gUGF0aFdpbjMyO1xuLyoqXG4gKiBQYXRoIGNsYXNzIHVzZWQgb24gYWxsIHBvc2l4IHN5c3RlbXMuXG4gKlxuICogVXNlcyBgJy8nYCBhcyB0aGUgcGF0aCBzZXBhcmF0b3IuXG4gKi9cbmNsYXNzIFBhdGhQb3NpeCBleHRlbmRzIFBhdGhCYXNlIHtcbiAgICAvKipcbiAgICAgKiBzZXBhcmF0b3IgZm9yIHBhcnNpbmcgcGF0aCBzdHJpbmdzXG4gICAgICovXG4gICAgc3BsaXRTZXAgPSAnLyc7XG4gICAgLyoqXG4gICAgICogc2VwYXJhdG9yIGZvciBnZW5lcmF0aW5nIHBhdGggc3RyaW5nc1xuICAgICAqL1xuICAgIHNlcCA9ICcvJztcbiAgICAvKipcbiAgICAgKiBEbyBub3QgY3JlYXRlIG5ldyBQYXRoIG9iamVjdHMgZGlyZWN0bHkuICBUaGV5IHNob3VsZCBhbHdheXMgYmUgYWNjZXNzZWRcbiAgICAgKiB2aWEgdGhlIFBhdGhTY3VycnkgY2xhc3Mgb3Igb3RoZXIgbWV0aG9kcyBvbiB0aGUgUGF0aCBjbGFzcy5cbiAgICAgKlxuICAgICAqIEBpbnRlcm5hbFxuICAgICAqL1xuICAgIGNvbnN0cnVjdG9yKG5hbWUsIHR5cGUgPSBVTktOT1dOLCByb290LCByb290cywgbm9jYXNlLCBjaGlsZHJlbiwgb3B0cykge1xuICAgICAgICBzdXBlcihuYW1lLCB0eXBlLCByb290LCByb290cywgbm9jYXNlLCBjaGlsZHJlbiwgb3B0cyk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIEBpbnRlcm5hbFxuICAgICAqL1xuICAgIGdldFJvb3RTdHJpbmcocGF0aCkge1xuICAgICAgICByZXR1cm4gcGF0aC5zdGFydHNXaXRoKCcvJykgPyAnLycgOiAnJztcbiAgICB9XG4gICAgLyoqXG4gICAgICogQGludGVybmFsXG4gICAgICovXG4gICAgZ2V0Um9vdChfcm9vdFBhdGgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMucm9vdDtcbiAgICB9XG4gICAgLyoqXG4gICAgICogQGludGVybmFsXG4gICAgICovXG4gICAgbmV3Q2hpbGQobmFtZSwgdHlwZSA9IFVOS05PV04sIG9wdHMgPSB7fSkge1xuICAgICAgICByZXR1cm4gbmV3IFBhdGhQb3NpeChuYW1lLCB0eXBlLCB0aGlzLnJvb3QsIHRoaXMucm9vdHMsIHRoaXMubm9jYXNlLCB0aGlzLmNoaWxkcmVuQ2FjaGUoKSwgb3B0cyk7XG4gICAgfVxufVxuZXhwb3J0cy5QYXRoUG9zaXggPSBQYXRoUG9zaXg7XG4vKipcbiAqIFRoZSBiYXNlIGNsYXNzIGZvciBhbGwgUGF0aFNjdXJyeSBjbGFzc2VzLCBwcm92aWRpbmcgdGhlIGludGVyZmFjZSBmb3IgcGF0aFxuICogcmVzb2x1dGlvbiBhbmQgZmlsZXN5c3RlbSBvcGVyYXRpb25zLlxuICpcbiAqIFR5cGljYWxseSwgeW91IHNob3VsZCAqbm90KiBpbnN0YW50aWF0ZSB0aGlzIGNsYXNzIGRpcmVjdGx5LCBidXQgcmF0aGVyIG9uZVxuICogb2YgdGhlIHBsYXRmb3JtLXNwZWNpZmljIGNsYXNzZXMsIG9yIHRoZSBleHBvcnRlZCB7QGxpbmsgUGF0aFNjdXJyeX0gd2hpY2hcbiAqIGRlZmF1bHRzIHRvIHRoZSBjdXJyZW50IHBsYXRmb3JtLlxuICovXG5jbGFzcyBQYXRoU2N1cnJ5QmFzZSB7XG4gICAgLyoqXG4gICAgICogVGhlIHJvb3QgUGF0aCBlbnRyeSBmb3IgdGhlIGN1cnJlbnQgd29ya2luZyBkaXJlY3Rvcnkgb2YgdGhpcyBTY3VycnlcbiAgICAgKi9cbiAgICByb290O1xuICAgIC8qKlxuICAgICAqIFRoZSBzdHJpbmcgcGF0aCBmb3IgdGhlIHJvb3Qgb2YgdGhpcyBTY3VycnkncyBjdXJyZW50IHdvcmtpbmcgZGlyZWN0b3J5XG4gICAgICovXG4gICAgcm9vdFBhdGg7XG4gICAgLyoqXG4gICAgICogQSBjb2xsZWN0aW9uIG9mIGFsbCByb290cyBlbmNvdW50ZXJlZCwgcmVmZXJlbmNlZCBieSByb290UGF0aFxuICAgICAqL1xuICAgIHJvb3RzO1xuICAgIC8qKlxuICAgICAqIFRoZSBQYXRoIGVudHJ5IGNvcnJlc3BvbmRpbmcgdG8gdGhpcyBQYXRoU2N1cnJ5J3MgY3VycmVudCB3b3JraW5nIGRpcmVjdG9yeS5cbiAgICAgKi9cbiAgICBjd2Q7XG4gICAgI3Jlc29sdmVDYWNoZTtcbiAgICAjcmVzb2x2ZVBvc2l4Q2FjaGU7XG4gICAgI2NoaWxkcmVuO1xuICAgIC8qKlxuICAgICAqIFBlcmZvcm0gcGF0aCBjb21wYXJpc29ucyBjYXNlLWluc2Vuc2l0aXZlbHkuXG4gICAgICpcbiAgICAgKiBEZWZhdWx0cyB0cnVlIG9uIERhcndpbiBhbmQgV2luZG93cyBzeXN0ZW1zLCBmYWxzZSBlbHNld2hlcmUuXG4gICAgICovXG4gICAgbm9jYXNlO1xuICAgICNmcztcbiAgICAvKipcbiAgICAgKiBUaGlzIGNsYXNzIHNob3VsZCBub3QgYmUgaW5zdGFudGlhdGVkIGRpcmVjdGx5LlxuICAgICAqXG4gICAgICogVXNlIFBhdGhTY3VycnlXaW4zMiwgUGF0aFNjdXJyeURhcndpbiwgUGF0aFNjdXJyeVBvc2l4LCBvciBQYXRoU2N1cnJ5XG4gICAgICpcbiAgICAgKiBAaW50ZXJuYWxcbiAgICAgKi9cbiAgICBjb25zdHJ1Y3Rvcihjd2QgPSBwcm9jZXNzLmN3ZCgpLCBwYXRoSW1wbCwgc2VwLCB7IG5vY2FzZSwgY2hpbGRyZW5DYWNoZVNpemUgPSAxNiAqIDEwMjQsIGZzID0gZGVmYXVsdEZTLCB9ID0ge30pIHtcbiAgICAgICAgdGhpcy4jZnMgPSBmc0Zyb21PcHRpb24oZnMpO1xuICAgICAgICBpZiAoY3dkIGluc3RhbmNlb2YgVVJMIHx8IGN3ZC5zdGFydHNXaXRoKCdmaWxlOi8vJykpIHtcbiAgICAgICAgICAgIGN3ZCA9ICgwLCBub2RlX3VybF8xLmZpbGVVUkxUb1BhdGgpKGN3ZCk7XG4gICAgICAgIH1cbiAgICAgICAgLy8gcmVzb2x2ZSBhbmQgc3BsaXQgcm9vdCwgYW5kIHRoZW4gYWRkIHRvIHRoZSBzdG9yZS5cbiAgICAgICAgLy8gdGhpcyBpcyB0aGUgb25seSB0aW1lIHdlIGNhbGwgcGF0aC5yZXNvbHZlKClcbiAgICAgICAgY29uc3QgY3dkUGF0aCA9IHBhdGhJbXBsLnJlc29sdmUoY3dkKTtcbiAgICAgICAgdGhpcy5yb290cyA9IE9iamVjdC5jcmVhdGUobnVsbCk7XG4gICAgICAgIHRoaXMucm9vdFBhdGggPSB0aGlzLnBhcnNlUm9vdFBhdGgoY3dkUGF0aCk7XG4gICAgICAgIHRoaXMuI3Jlc29sdmVDYWNoZSA9IG5ldyBSZXNvbHZlQ2FjaGUoKTtcbiAgICAgICAgdGhpcy4jcmVzb2x2ZVBvc2l4Q2FjaGUgPSBuZXcgUmVzb2x2ZUNhY2hlKCk7XG4gICAgICAgIHRoaXMuI2NoaWxkcmVuID0gbmV3IENoaWxkcmVuQ2FjaGUoY2hpbGRyZW5DYWNoZVNpemUpO1xuICAgICAgICBjb25zdCBzcGxpdCA9IGN3ZFBhdGguc3Vic3RyaW5nKHRoaXMucm9vdFBhdGgubGVuZ3RoKS5zcGxpdChzZXApO1xuICAgICAgICAvLyByZXNvbHZlKCcvJykgbGVhdmVzICcnLCBzcGxpdHMgdG8gWycnXSwgd2UgZG9uJ3Qgd2FudCB0aGF0LlxuICAgICAgICBpZiAoc3BsaXQubGVuZ3RoID09PSAxICYmICFzcGxpdFswXSkge1xuICAgICAgICAgICAgc3BsaXQucG9wKCk7XG4gICAgICAgIH1cbiAgICAgICAgLyogYzggaWdub3JlIHN0YXJ0ICovXG4gICAgICAgIGlmIChub2Nhc2UgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcignbXVzdCBwcm92aWRlIG5vY2FzZSBzZXR0aW5nIHRvIFBhdGhTY3VycnlCYXNlIGN0b3InKTtcbiAgICAgICAgfVxuICAgICAgICAvKiBjOCBpZ25vcmUgc3RvcCAqL1xuICAgICAgICB0aGlzLm5vY2FzZSA9IG5vY2FzZTtcbiAgICAgICAgdGhpcy5yb290ID0gdGhpcy5uZXdSb290KHRoaXMuI2ZzKTtcbiAgICAgICAgdGhpcy5yb290c1t0aGlzLnJvb3RQYXRoXSA9IHRoaXMucm9vdDtcbiAgICAgICAgbGV0IHByZXYgPSB0aGlzLnJvb3Q7XG4gICAgICAgIGxldCBsZW4gPSBzcGxpdC5sZW5ndGggLSAxO1xuICAgICAgICBjb25zdCBqb2luU2VwID0gcGF0aEltcGwuc2VwO1xuICAgICAgICBsZXQgYWJzID0gdGhpcy5yb290UGF0aDtcbiAgICAgICAgbGV0IHNhd0ZpcnN0ID0gZmFsc2U7XG4gICAgICAgIGZvciAoY29uc3QgcGFydCBvZiBzcGxpdCkge1xuICAgICAgICAgICAgY29uc3QgbCA9IGxlbi0tO1xuICAgICAgICAgICAgcHJldiA9IHByZXYuY2hpbGQocGFydCwge1xuICAgICAgICAgICAgICAgIHJlbGF0aXZlOiBuZXcgQXJyYXkobCkuZmlsbCgnLi4nKS5qb2luKGpvaW5TZXApLFxuICAgICAgICAgICAgICAgIHJlbGF0aXZlUG9zaXg6IG5ldyBBcnJheShsKS5maWxsKCcuLicpLmpvaW4oJy8nKSxcbiAgICAgICAgICAgICAgICBmdWxscGF0aDogKGFicyArPSAoc2F3Rmlyc3QgPyAnJyA6IGpvaW5TZXApICsgcGFydCksXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIHNhd0ZpcnN0ID0gdHJ1ZTtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLmN3ZCA9IHByZXY7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIEdldCB0aGUgZGVwdGggb2YgYSBwcm92aWRlZCBwYXRoLCBzdHJpbmcsIG9yIHRoZSBjd2RcbiAgICAgKi9cbiAgICBkZXB0aChwYXRoID0gdGhpcy5jd2QpIHtcbiAgICAgICAgaWYgKHR5cGVvZiBwYXRoID09PSAnc3RyaW5nJykge1xuICAgICAgICAgICAgcGF0aCA9IHRoaXMuY3dkLnJlc29sdmUocGF0aCk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHBhdGguZGVwdGgoKTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogUmV0dXJuIHRoZSBjYWNoZSBvZiBjaGlsZCBlbnRyaWVzLiAgRXhwb3NlZCBzbyBzdWJjbGFzc2VzIGNhbiBjcmVhdGVcbiAgICAgKiBjaGlsZCBQYXRoIG9iamVjdHMgaW4gYSBwbGF0Zm9ybS1zcGVjaWZpYyB3YXkuXG4gICAgICpcbiAgICAgKiBAaW50ZXJuYWxcbiAgICAgKi9cbiAgICBjaGlsZHJlbkNhY2hlKCkge1xuICAgICAgICByZXR1cm4gdGhpcy4jY2hpbGRyZW47XG4gICAgfVxuICAgIC8qKlxuICAgICAqIFJlc29sdmUgb25lIG9yIG1vcmUgcGF0aCBzdHJpbmdzIHRvIGEgcmVzb2x2ZWQgc3RyaW5nXG4gICAgICpcbiAgICAgKiBTYW1lIGludGVyZmFjZSBhcyByZXF1aXJlKCdwYXRoJykucmVzb2x2ZS5cbiAgICAgKlxuICAgICAqIE11Y2ggZmFzdGVyIHRoYW4gcGF0aC5yZXNvbHZlKCkgd2hlbiBjYWxsZWQgbXVsdGlwbGUgdGltZXMgZm9yIHRoZSBzYW1lXG4gICAgICogcGF0aCwgYmVjYXVzZSB0aGUgcmVzb2x2ZWQgUGF0aCBvYmplY3RzIGFyZSBjYWNoZWQuICBNdWNoIHNsb3dlclxuICAgICAqIG90aGVyd2lzZS5cbiAgICAgKi9cbiAgICByZXNvbHZlKC4uLnBhdGhzKSB7XG4gICAgICAgIC8vIGZpcnN0IGZpZ3VyZSBvdXQgdGhlIG1pbmltdW0gbnVtYmVyIG9mIHBhdGhzIHdlIGhhdmUgdG8gdGVzdFxuICAgICAgICAvLyB3ZSBhbHdheXMgc3RhcnQgYXQgY3dkLCBidXQgYW55IGFic29sdXRlcyB3aWxsIGJ1bXAgdGhlIHN0YXJ0XG4gICAgICAgIGxldCByID0gJyc7XG4gICAgICAgIGZvciAobGV0IGkgPSBwYXRocy5sZW5ndGggLSAxOyBpID49IDA7IGktLSkge1xuICAgICAgICAgICAgY29uc3QgcCA9IHBhdGhzW2ldO1xuICAgICAgICAgICAgaWYgKCFwIHx8IHAgPT09ICcuJylcbiAgICAgICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICAgIHIgPSByID8gYCR7cH0vJHtyfWAgOiBwO1xuICAgICAgICAgICAgaWYgKHRoaXMuaXNBYnNvbHV0ZShwKSkge1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGNvbnN0IGNhY2hlZCA9IHRoaXMuI3Jlc29sdmVDYWNoZS5nZXQocik7XG4gICAgICAgIGlmIChjYWNoZWQgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgcmV0dXJuIGNhY2hlZDtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCByZXN1bHQgPSB0aGlzLmN3ZC5yZXNvbHZlKHIpLmZ1bGxwYXRoKCk7XG4gICAgICAgIHRoaXMuI3Jlc29sdmVDYWNoZS5zZXQociwgcmVzdWx0KTtcbiAgICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICB9XG4gICAgLyoqXG4gICAgICogUmVzb2x2ZSBvbmUgb3IgbW9yZSBwYXRoIHN0cmluZ3MgdG8gYSByZXNvbHZlZCBzdHJpbmcsIHJldHVybmluZ1xuICAgICAqIHRoZSBwb3NpeCBwYXRoLiAgSWRlbnRpY2FsIHRvIC5yZXNvbHZlKCkgb24gcG9zaXggc3lzdGVtcywgYnV0IG9uXG4gICAgICogd2luZG93cyB3aWxsIHJldHVybiBhIGZvcndhcmQtc2xhc2ggc2VwYXJhdGVkIFVOQyBwYXRoLlxuICAgICAqXG4gICAgICogU2FtZSBpbnRlcmZhY2UgYXMgcmVxdWlyZSgncGF0aCcpLnJlc29sdmUuXG4gICAgICpcbiAgICAgKiBNdWNoIGZhc3RlciB0aGFuIHBhdGgucmVzb2x2ZSgpIHdoZW4gY2FsbGVkIG11bHRpcGxlIHRpbWVzIGZvciB0aGUgc2FtZVxuICAgICAqIHBhdGgsIGJlY2F1c2UgdGhlIHJlc29sdmVkIFBhdGggb2JqZWN0cyBhcmUgY2FjaGVkLiAgTXVjaCBzbG93ZXJcbiAgICAgKiBvdGhlcndpc2UuXG4gICAgICovXG4gICAgcmVzb2x2ZVBvc2l4KC4uLnBhdGhzKSB7XG4gICAgICAgIC8vIGZpcnN0IGZpZ3VyZSBvdXQgdGhlIG1pbmltdW0gbnVtYmVyIG9mIHBhdGhzIHdlIGhhdmUgdG8gdGVzdFxuICAgICAgICAvLyB3ZSBhbHdheXMgc3RhcnQgYXQgY3dkLCBidXQgYW55IGFic29sdXRlcyB3aWxsIGJ1bXAgdGhlIHN0YXJ0XG4gICAgICAgIGxldCByID0gJyc7XG4gICAgICAgIGZvciAobGV0IGkgPSBwYXRocy5sZW5ndGggLSAxOyBpID49IDA7IGktLSkge1xuICAgICAgICAgICAgY29uc3QgcCA9IHBhdGhzW2ldO1xuICAgICAgICAgICAgaWYgKCFwIHx8IHAgPT09ICcuJylcbiAgICAgICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICAgIHIgPSByID8gYCR7cH0vJHtyfWAgOiBwO1xuICAgICAgICAgICAgaWYgKHRoaXMuaXNBYnNvbHV0ZShwKSkge1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGNvbnN0IGNhY2hlZCA9IHRoaXMuI3Jlc29sdmVQb3NpeENhY2hlLmdldChyKTtcbiAgICAgICAgaWYgKGNhY2hlZCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICByZXR1cm4gY2FjaGVkO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IHJlc3VsdCA9IHRoaXMuY3dkLnJlc29sdmUocikuZnVsbHBhdGhQb3NpeCgpO1xuICAgICAgICB0aGlzLiNyZXNvbHZlUG9zaXhDYWNoZS5zZXQociwgcmVzdWx0KTtcbiAgICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICB9XG4gICAgLyoqXG4gICAgICogZmluZCB0aGUgcmVsYXRpdmUgcGF0aCBmcm9tIHRoZSBjd2QgdG8gdGhlIHN1cHBsaWVkIHBhdGggc3RyaW5nIG9yIGVudHJ5XG4gICAgICovXG4gICAgcmVsYXRpdmUoZW50cnkgPSB0aGlzLmN3ZCkge1xuICAgICAgICBpZiAodHlwZW9mIGVudHJ5ID09PSAnc3RyaW5nJykge1xuICAgICAgICAgICAgZW50cnkgPSB0aGlzLmN3ZC5yZXNvbHZlKGVudHJ5KTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gZW50cnkucmVsYXRpdmUoKTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogZmluZCB0aGUgcmVsYXRpdmUgcGF0aCBmcm9tIHRoZSBjd2QgdG8gdGhlIHN1cHBsaWVkIHBhdGggc3RyaW5nIG9yXG4gICAgICogZW50cnksIHVzaW5nIC8gYXMgdGhlIHBhdGggZGVsaW1pdGVyLCBldmVuIG9uIFdpbmRvd3MuXG4gICAgICovXG4gICAgcmVsYXRpdmVQb3NpeChlbnRyeSA9IHRoaXMuY3dkKSB7XG4gICAgICAgIGlmICh0eXBlb2YgZW50cnkgPT09ICdzdHJpbmcnKSB7XG4gICAgICAgICAgICBlbnRyeSA9IHRoaXMuY3dkLnJlc29sdmUoZW50cnkpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBlbnRyeS5yZWxhdGl2ZVBvc2l4KCk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIFJldHVybiB0aGUgYmFzZW5hbWUgZm9yIHRoZSBwcm92aWRlZCBzdHJpbmcgb3IgUGF0aCBvYmplY3RcbiAgICAgKi9cbiAgICBiYXNlbmFtZShlbnRyeSA9IHRoaXMuY3dkKSB7XG4gICAgICAgIGlmICh0eXBlb2YgZW50cnkgPT09ICdzdHJpbmcnKSB7XG4gICAgICAgICAgICBlbnRyeSA9IHRoaXMuY3dkLnJlc29sdmUoZW50cnkpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBlbnRyeS5uYW1lO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBSZXR1cm4gdGhlIGRpcm5hbWUgZm9yIHRoZSBwcm92aWRlZCBzdHJpbmcgb3IgUGF0aCBvYmplY3RcbiAgICAgKi9cbiAgICBkaXJuYW1lKGVudHJ5ID0gdGhpcy5jd2QpIHtcbiAgICAgICAgaWYgKHR5cGVvZiBlbnRyeSA9PT0gJ3N0cmluZycpIHtcbiAgICAgICAgICAgIGVudHJ5ID0gdGhpcy5jd2QucmVzb2x2ZShlbnRyeSk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIChlbnRyeS5wYXJlbnQgfHwgZW50cnkpLmZ1bGxwYXRoKCk7XG4gICAgfVxuICAgIGFzeW5jIHJlYWRkaXIoZW50cnkgPSB0aGlzLmN3ZCwgb3B0cyA9IHtcbiAgICAgICAgd2l0aEZpbGVUeXBlczogdHJ1ZSxcbiAgICB9KSB7XG4gICAgICAgIGlmICh0eXBlb2YgZW50cnkgPT09ICdzdHJpbmcnKSB7XG4gICAgICAgICAgICBlbnRyeSA9IHRoaXMuY3dkLnJlc29sdmUoZW50cnkpO1xuICAgICAgICB9XG4gICAgICAgIGVsc2UgaWYgKCEoZW50cnkgaW5zdGFuY2VvZiBQYXRoQmFzZSkpIHtcbiAgICAgICAgICAgIG9wdHMgPSBlbnRyeTtcbiAgICAgICAgICAgIGVudHJ5ID0gdGhpcy5jd2Q7XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgeyB3aXRoRmlsZVR5cGVzIH0gPSBvcHRzO1xuICAgICAgICBpZiAoIWVudHJ5LmNhblJlYWRkaXIoKSkge1xuICAgICAgICAgICAgcmV0dXJuIFtdO1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgY29uc3QgcCA9IGF3YWl0IGVudHJ5LnJlYWRkaXIoKTtcbiAgICAgICAgICAgIHJldHVybiB3aXRoRmlsZVR5cGVzID8gcCA6IHAubWFwKGUgPT4gZS5uYW1lKTtcbiAgICAgICAgfVxuICAgIH1cbiAgICByZWFkZGlyU3luYyhlbnRyeSA9IHRoaXMuY3dkLCBvcHRzID0ge1xuICAgICAgICB3aXRoRmlsZVR5cGVzOiB0cnVlLFxuICAgIH0pIHtcbiAgICAgICAgaWYgKHR5cGVvZiBlbnRyeSA9PT0gJ3N0cmluZycpIHtcbiAgICAgICAgICAgIGVudHJ5ID0gdGhpcy5jd2QucmVzb2x2ZShlbnRyeSk7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSBpZiAoIShlbnRyeSBpbnN0YW5jZW9mIFBhdGhCYXNlKSkge1xuICAgICAgICAgICAgb3B0cyA9IGVudHJ5O1xuICAgICAgICAgICAgZW50cnkgPSB0aGlzLmN3ZDtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCB7IHdpdGhGaWxlVHlwZXMgPSB0cnVlIH0gPSBvcHRzO1xuICAgICAgICBpZiAoIWVudHJ5LmNhblJlYWRkaXIoKSkge1xuICAgICAgICAgICAgcmV0dXJuIFtdO1xuICAgICAgICB9XG4gICAgICAgIGVsc2UgaWYgKHdpdGhGaWxlVHlwZXMpIHtcbiAgICAgICAgICAgIHJldHVybiBlbnRyeS5yZWFkZGlyU3luYygpO1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgcmV0dXJuIGVudHJ5LnJlYWRkaXJTeW5jKCkubWFwKGUgPT4gZS5uYW1lKTtcbiAgICAgICAgfVxuICAgIH1cbiAgICAvKipcbiAgICAgKiBDYWxsIGxzdGF0KCkgb24gdGhlIHN0cmluZyBvciBQYXRoIG9iamVjdCwgYW5kIHVwZGF0ZSBhbGwga25vd25cbiAgICAgKiBpbmZvcm1hdGlvbiB0aGF0IGNhbiBiZSBkZXRlcm1pbmVkLlxuICAgICAqXG4gICAgICogTm90ZSB0aGF0IHVubGlrZSBgZnMubHN0YXQoKWAsIHRoZSByZXR1cm5lZCB2YWx1ZSBkb2VzIG5vdCBjb250YWluIHNvbWVcbiAgICAgKiBpbmZvcm1hdGlvbiwgc3VjaCBhcyBgbW9kZWAsIGBkZXZgLCBgbmxpbmtgLCBhbmQgYGlub2AuICBJZiB0aGF0XG4gICAgICogaW5mb3JtYXRpb24gaXMgcmVxdWlyZWQsIHlvdSB3aWxsIG5lZWQgdG8gY2FsbCBgZnMubHN0YXRgIHlvdXJzZWxmLlxuICAgICAqXG4gICAgICogSWYgdGhlIFBhdGggcmVmZXJzIHRvIGEgbm9uZXhpc3RlbnQgZmlsZSwgb3IgaWYgdGhlIGxzdGF0IGNhbGwgZmFpbHMgZm9yXG4gICAgICogYW55IHJlYXNvbiwgYHVuZGVmaW5lZGAgaXMgcmV0dXJuZWQuICBPdGhlcndpc2UgdGhlIHVwZGF0ZWQgUGF0aCBvYmplY3QgaXNcbiAgICAgKiByZXR1cm5lZC5cbiAgICAgKlxuICAgICAqIFJlc3VsdHMgYXJlIGNhY2hlZCwgYW5kIHRodXMgbWF5IGJlIG91dCBvZiBkYXRlIGlmIHRoZSBmaWxlc3lzdGVtIGlzXG4gICAgICogbXV0YXRlZC5cbiAgICAgKi9cbiAgICBhc3luYyBsc3RhdChlbnRyeSA9IHRoaXMuY3dkKSB7XG4gICAgICAgIGlmICh0eXBlb2YgZW50cnkgPT09ICdzdHJpbmcnKSB7XG4gICAgICAgICAgICBlbnRyeSA9IHRoaXMuY3dkLnJlc29sdmUoZW50cnkpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBlbnRyeS5sc3RhdCgpO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBzeW5jaHJvbm91cyB7QGxpbmsgUGF0aFNjdXJyeUJhc2UubHN0YXR9XG4gICAgICovXG4gICAgbHN0YXRTeW5jKGVudHJ5ID0gdGhpcy5jd2QpIHtcbiAgICAgICAgaWYgKHR5cGVvZiBlbnRyeSA9PT0gJ3N0cmluZycpIHtcbiAgICAgICAgICAgIGVudHJ5ID0gdGhpcy5jd2QucmVzb2x2ZShlbnRyeSk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGVudHJ5LmxzdGF0U3luYygpO1xuICAgIH1cbiAgICBhc3luYyByZWFkbGluayhlbnRyeSA9IHRoaXMuY3dkLCB7IHdpdGhGaWxlVHlwZXMgfSA9IHtcbiAgICAgICAgd2l0aEZpbGVUeXBlczogZmFsc2UsXG4gICAgfSkge1xuICAgICAgICBpZiAodHlwZW9mIGVudHJ5ID09PSAnc3RyaW5nJykge1xuICAgICAgICAgICAgZW50cnkgPSB0aGlzLmN3ZC5yZXNvbHZlKGVudHJ5KTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIGlmICghKGVudHJ5IGluc3RhbmNlb2YgUGF0aEJhc2UpKSB7XG4gICAgICAgICAgICB3aXRoRmlsZVR5cGVzID0gZW50cnkud2l0aEZpbGVUeXBlcztcbiAgICAgICAgICAgIGVudHJ5ID0gdGhpcy5jd2Q7XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgZSA9IGF3YWl0IGVudHJ5LnJlYWRsaW5rKCk7XG4gICAgICAgIHJldHVybiB3aXRoRmlsZVR5cGVzID8gZSA6IGU/LmZ1bGxwYXRoKCk7XG4gICAgfVxuICAgIHJlYWRsaW5rU3luYyhlbnRyeSA9IHRoaXMuY3dkLCB7IHdpdGhGaWxlVHlwZXMgfSA9IHtcbiAgICAgICAgd2l0aEZpbGVUeXBlczogZmFsc2UsXG4gICAgfSkge1xuICAgICAgICBpZiAodHlwZW9mIGVudHJ5ID09PSAnc3RyaW5nJykge1xuICAgICAgICAgICAgZW50cnkgPSB0aGlzLmN3ZC5yZXNvbHZlKGVudHJ5KTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIGlmICghKGVudHJ5IGluc3RhbmNlb2YgUGF0aEJhc2UpKSB7XG4gICAgICAgICAgICB3aXRoRmlsZVR5cGVzID0gZW50cnkud2l0aEZpbGVUeXBlcztcbiAgICAgICAgICAgIGVudHJ5ID0gdGhpcy5jd2Q7XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgZSA9IGVudHJ5LnJlYWRsaW5rU3luYygpO1xuICAgICAgICByZXR1cm4gd2l0aEZpbGVUeXBlcyA/IGUgOiBlPy5mdWxscGF0aCgpO1xuICAgIH1cbiAgICBhc3luYyByZWFscGF0aChlbnRyeSA9IHRoaXMuY3dkLCB7IHdpdGhGaWxlVHlwZXMgfSA9IHtcbiAgICAgICAgd2l0aEZpbGVUeXBlczogZmFsc2UsXG4gICAgfSkge1xuICAgICAgICBpZiAodHlwZW9mIGVudHJ5ID09PSAnc3RyaW5nJykge1xuICAgICAgICAgICAgZW50cnkgPSB0aGlzLmN3ZC5yZXNvbHZlKGVudHJ5KTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIGlmICghKGVudHJ5IGluc3RhbmNlb2YgUGF0aEJhc2UpKSB7XG4gICAgICAgICAgICB3aXRoRmlsZVR5cGVzID0gZW50cnkud2l0aEZpbGVUeXBlcztcbiAgICAgICAgICAgIGVudHJ5ID0gdGhpcy5jd2Q7XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgZSA9IGF3YWl0IGVudHJ5LnJlYWxwYXRoKCk7XG4gICAgICAgIHJldHVybiB3aXRoRmlsZVR5cGVzID8gZSA6IGU/LmZ1bGxwYXRoKCk7XG4gICAgfVxuICAgIHJlYWxwYXRoU3luYyhlbnRyeSA9IHRoaXMuY3dkLCB7IHdpdGhGaWxlVHlwZXMgfSA9IHtcbiAgICAgICAgd2l0aEZpbGVUeXBlczogZmFsc2UsXG4gICAgfSkge1xuICAgICAgICBpZiAodHlwZW9mIGVudHJ5ID09PSAnc3RyaW5nJykge1xuICAgICAgICAgICAgZW50cnkgPSB0aGlzLmN3ZC5yZXNvbHZlKGVudHJ5KTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIGlmICghKGVudHJ5IGluc3RhbmNlb2YgUGF0aEJhc2UpKSB7XG4gICAgICAgICAgICB3aXRoRmlsZVR5cGVzID0gZW50cnkud2l0aEZpbGVUeXBlcztcbiAgICAgICAgICAgIGVudHJ5ID0gdGhpcy5jd2Q7XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgZSA9IGVudHJ5LnJlYWxwYXRoU3luYygpO1xuICAgICAgICByZXR1cm4gd2l0aEZpbGVUeXBlcyA/IGUgOiBlPy5mdWxscGF0aCgpO1xuICAgIH1cbiAgICBhc3luYyB3YWxrKGVudHJ5ID0gdGhpcy5jd2QsIG9wdHMgPSB7fSkge1xuICAgICAgICBpZiAodHlwZW9mIGVudHJ5ID09PSAnc3RyaW5nJykge1xuICAgICAgICAgICAgZW50cnkgPSB0aGlzLmN3ZC5yZXNvbHZlKGVudHJ5KTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIGlmICghKGVudHJ5IGluc3RhbmNlb2YgUGF0aEJhc2UpKSB7XG4gICAgICAgICAgICBvcHRzID0gZW50cnk7XG4gICAgICAgICAgICBlbnRyeSA9IHRoaXMuY3dkO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IHsgd2l0aEZpbGVUeXBlcyA9IHRydWUsIGZvbGxvdyA9IGZhbHNlLCBmaWx0ZXIsIHdhbGtGaWx0ZXIsIH0gPSBvcHRzO1xuICAgICAgICBjb25zdCByZXN1bHRzID0gW107XG4gICAgICAgIGlmICghZmlsdGVyIHx8IGZpbHRlcihlbnRyeSkpIHtcbiAgICAgICAgICAgIHJlc3VsdHMucHVzaCh3aXRoRmlsZVR5cGVzID8gZW50cnkgOiBlbnRyeS5mdWxscGF0aCgpKTtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBkaXJzID0gbmV3IFNldCgpO1xuICAgICAgICBjb25zdCB3YWxrID0gKGRpciwgY2IpID0+IHtcbiAgICAgICAgICAgIGRpcnMuYWRkKGRpcik7XG4gICAgICAgICAgICBkaXIucmVhZGRpckNCKChlciwgZW50cmllcykgPT4ge1xuICAgICAgICAgICAgICAgIC8qIGM4IGlnbm9yZSBzdGFydCAqL1xuICAgICAgICAgICAgICAgIGlmIChlcikge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gY2IoZXIpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAvKiBjOCBpZ25vcmUgc3RvcCAqL1xuICAgICAgICAgICAgICAgIGxldCBsZW4gPSBlbnRyaWVzLmxlbmd0aDtcbiAgICAgICAgICAgICAgICBpZiAoIWxlbilcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGNiKCk7XG4gICAgICAgICAgICAgICAgY29uc3QgbmV4dCA9ICgpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKC0tbGVuID09PSAwKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBjYigpO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfTtcbiAgICAgICAgICAgICAgICBmb3IgKGNvbnN0IGUgb2YgZW50cmllcykge1xuICAgICAgICAgICAgICAgICAgICBpZiAoIWZpbHRlciB8fCBmaWx0ZXIoZSkpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJlc3VsdHMucHVzaCh3aXRoRmlsZVR5cGVzID8gZSA6IGUuZnVsbHBhdGgoKSk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgaWYgKGZvbGxvdyAmJiBlLmlzU3ltYm9saWNMaW5rKCkpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGUucmVhbHBhdGgoKVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIC50aGVuKHIgPT4gKHI/LmlzVW5rbm93bigpID8gci5sc3RhdCgpIDogcikpXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgLnRoZW4ociA9PiByPy5zaG91bGRXYWxrKGRpcnMsIHdhbGtGaWx0ZXIpID8gd2FsayhyLCBuZXh0KSA6IG5leHQoKSk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoZS5zaG91bGRXYWxrKGRpcnMsIHdhbGtGaWx0ZXIpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgd2FsayhlLCBuZXh0KTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5leHQoKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0sIHRydWUpOyAvLyB6YWxnb29vb29vb1xuICAgICAgICB9O1xuICAgICAgICBjb25zdCBzdGFydCA9IGVudHJ5O1xuICAgICAgICByZXR1cm4gbmV3IFByb21pc2UoKHJlcywgcmVqKSA9PiB7XG4gICAgICAgICAgICB3YWxrKHN0YXJ0LCBlciA9PiB7XG4gICAgICAgICAgICAgICAgLyogYzggaWdub3JlIHN0YXJ0ICovXG4gICAgICAgICAgICAgICAgaWYgKGVyKVxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gcmVqKGVyKTtcbiAgICAgICAgICAgICAgICAvKiBjOCBpZ25vcmUgc3RvcCAqL1xuICAgICAgICAgICAgICAgIHJlcyhyZXN1bHRzKTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9KTtcbiAgICB9XG4gICAgd2Fsa1N5bmMoZW50cnkgPSB0aGlzLmN3ZCwgb3B0cyA9IHt9KSB7XG4gICAgICAgIGlmICh0eXBlb2YgZW50cnkgPT09ICdzdHJpbmcnKSB7XG4gICAgICAgICAgICBlbnRyeSA9IHRoaXMuY3dkLnJlc29sdmUoZW50cnkpO1xuICAgICAgICB9XG4gICAgICAgIGVsc2UgaWYgKCEoZW50cnkgaW5zdGFuY2VvZiBQYXRoQmFzZSkpIHtcbiAgICAgICAgICAgIG9wdHMgPSBlbnRyeTtcbiAgICAgICAgICAgIGVudHJ5ID0gdGhpcy5jd2Q7XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgeyB3aXRoRmlsZVR5cGVzID0gdHJ1ZSwgZm9sbG93ID0gZmFsc2UsIGZpbHRlciwgd2Fsa0ZpbHRlciwgfSA9IG9wdHM7XG4gICAgICAgIGNvbnN0IHJlc3VsdHMgPSBbXTtcbiAgICAgICAgaWYgKCFmaWx0ZXIgfHwgZmlsdGVyKGVudHJ5KSkge1xuICAgICAgICAgICAgcmVzdWx0cy5wdXNoKHdpdGhGaWxlVHlwZXMgPyBlbnRyeSA6IGVudHJ5LmZ1bGxwYXRoKCkpO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IGRpcnMgPSBuZXcgU2V0KFtlbnRyeV0pO1xuICAgICAgICBmb3IgKGNvbnN0IGRpciBvZiBkaXJzKSB7XG4gICAgICAgICAgICBjb25zdCBlbnRyaWVzID0gZGlyLnJlYWRkaXJTeW5jKCk7XG4gICAgICAgICAgICBmb3IgKGNvbnN0IGUgb2YgZW50cmllcykge1xuICAgICAgICAgICAgICAgIGlmICghZmlsdGVyIHx8IGZpbHRlcihlKSkge1xuICAgICAgICAgICAgICAgICAgICByZXN1bHRzLnB1c2god2l0aEZpbGVUeXBlcyA/IGUgOiBlLmZ1bGxwYXRoKCkpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBsZXQgciA9IGU7XG4gICAgICAgICAgICAgICAgaWYgKGUuaXNTeW1ib2xpY0xpbmsoKSkge1xuICAgICAgICAgICAgICAgICAgICBpZiAoIShmb2xsb3cgJiYgKHIgPSBlLnJlYWxwYXRoU3luYygpKSkpXG4gICAgICAgICAgICAgICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKHIuaXNVbmtub3duKCkpXG4gICAgICAgICAgICAgICAgICAgICAgICByLmxzdGF0U3luYygpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBpZiAoci5zaG91bGRXYWxrKGRpcnMsIHdhbGtGaWx0ZXIpKSB7XG4gICAgICAgICAgICAgICAgICAgIGRpcnMuYWRkKHIpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gcmVzdWx0cztcbiAgICB9XG4gICAgLyoqXG4gICAgICogU3VwcG9ydCBmb3IgYGZvciBhd2FpdGBcbiAgICAgKlxuICAgICAqIEFsaWFzIGZvciB7QGxpbmsgUGF0aFNjdXJyeUJhc2UuaXRlcmF0ZX1cbiAgICAgKlxuICAgICAqIE5vdGU6IEFzIG9mIE5vZGUgMTksIHRoaXMgaXMgdmVyeSBzbG93LCBjb21wYXJlZCB0byBvdGhlciBtZXRob2RzIG9mXG4gICAgICogd2Fsa2luZy4gIENvbnNpZGVyIHVzaW5nIHtAbGluayBQYXRoU2N1cnJ5QmFzZS5zdHJlYW19IGlmIG1lbW9yeSBvdmVyaGVhZFxuICAgICAqIGFuZCBiYWNrcHJlc3N1cmUgYXJlIGNvbmNlcm5zLCBvciB7QGxpbmsgUGF0aFNjdXJyeUJhc2Uud2Fsa30gaWYgbm90LlxuICAgICAqL1xuICAgIFtTeW1ib2wuYXN5bmNJdGVyYXRvcl0oKSB7XG4gICAgICAgIHJldHVybiB0aGlzLml0ZXJhdGUoKTtcbiAgICB9XG4gICAgaXRlcmF0ZShlbnRyeSA9IHRoaXMuY3dkLCBvcHRpb25zID0ge30pIHtcbiAgICAgICAgLy8gaXRlcmF0aW5nIGFzeW5jIG92ZXIgdGhlIHN0cmVhbSBpcyBzaWduaWZpY2FudGx5IG1vcmUgcGVyZm9ybWFudCxcbiAgICAgICAgLy8gZXNwZWNpYWxseSBpbiB0aGUgd2FybS1jYWNoZSBzY2VuYXJpbywgYmVjYXVzZSBpdCBidWZmZXJzIHVwIGRpcmVjdG9yeVxuICAgICAgICAvLyBlbnRyaWVzIGluIHRoZSBiYWNrZ3JvdW5kIGluc3RlYWQgb2Ygd2FpdGluZyBmb3IgYSB5aWVsZCBmb3IgZWFjaCBvbmUuXG4gICAgICAgIGlmICh0eXBlb2YgZW50cnkgPT09ICdzdHJpbmcnKSB7XG4gICAgICAgICAgICBlbnRyeSA9IHRoaXMuY3dkLnJlc29sdmUoZW50cnkpO1xuICAgICAgICB9XG4gICAgICAgIGVsc2UgaWYgKCEoZW50cnkgaW5zdGFuY2VvZiBQYXRoQmFzZSkpIHtcbiAgICAgICAgICAgIG9wdGlvbnMgPSBlbnRyeTtcbiAgICAgICAgICAgIGVudHJ5ID0gdGhpcy5jd2Q7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHRoaXMuc3RyZWFtKGVudHJ5LCBvcHRpb25zKVtTeW1ib2wuYXN5bmNJdGVyYXRvcl0oKTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogSXRlcmF0aW5nIG92ZXIgYSBQYXRoU2N1cnJ5IHBlcmZvcm1zIGEgc3luY2hyb25vdXMgd2Fsay5cbiAgICAgKlxuICAgICAqIEFsaWFzIGZvciB7QGxpbmsgUGF0aFNjdXJyeUJhc2UuaXRlcmF0ZVN5bmN9XG4gICAgICovXG4gICAgW1N5bWJvbC5pdGVyYXRvcl0oKSB7XG4gICAgICAgIHJldHVybiB0aGlzLml0ZXJhdGVTeW5jKCk7XG4gICAgfVxuICAgICppdGVyYXRlU3luYyhlbnRyeSA9IHRoaXMuY3dkLCBvcHRzID0ge30pIHtcbiAgICAgICAgaWYgKHR5cGVvZiBlbnRyeSA9PT0gJ3N0cmluZycpIHtcbiAgICAgICAgICAgIGVudHJ5ID0gdGhpcy5jd2QucmVzb2x2ZShlbnRyeSk7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSBpZiAoIShlbnRyeSBpbnN0YW5jZW9mIFBhdGhCYXNlKSkge1xuICAgICAgICAgICAgb3B0cyA9IGVudHJ5O1xuICAgICAgICAgICAgZW50cnkgPSB0aGlzLmN3ZDtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCB7IHdpdGhGaWxlVHlwZXMgPSB0cnVlLCBmb2xsb3cgPSBmYWxzZSwgZmlsdGVyLCB3YWxrRmlsdGVyLCB9ID0gb3B0cztcbiAgICAgICAgaWYgKCFmaWx0ZXIgfHwgZmlsdGVyKGVudHJ5KSkge1xuICAgICAgICAgICAgeWllbGQgd2l0aEZpbGVUeXBlcyA/IGVudHJ5IDogZW50cnkuZnVsbHBhdGgoKTtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBkaXJzID0gbmV3IFNldChbZW50cnldKTtcbiAgICAgICAgZm9yIChjb25zdCBkaXIgb2YgZGlycykge1xuICAgICAgICAgICAgY29uc3QgZW50cmllcyA9IGRpci5yZWFkZGlyU3luYygpO1xuICAgICAgICAgICAgZm9yIChjb25zdCBlIG9mIGVudHJpZXMpIHtcbiAgICAgICAgICAgICAgICBpZiAoIWZpbHRlciB8fCBmaWx0ZXIoZSkpIHtcbiAgICAgICAgICAgICAgICAgICAgeWllbGQgd2l0aEZpbGVUeXBlcyA/IGUgOiBlLmZ1bGxwYXRoKCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGxldCByID0gZTtcbiAgICAgICAgICAgICAgICBpZiAoZS5pc1N5bWJvbGljTGluaygpKSB7XG4gICAgICAgICAgICAgICAgICAgIGlmICghKGZvbGxvdyAmJiAociA9IGUucmVhbHBhdGhTeW5jKCkpKSlcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgICAgICAgICAgICBpZiAoci5pc1Vua25vd24oKSlcbiAgICAgICAgICAgICAgICAgICAgICAgIHIubHN0YXRTeW5jKCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGlmIChyLnNob3VsZFdhbGsoZGlycywgd2Fsa0ZpbHRlcikpIHtcbiAgICAgICAgICAgICAgICAgICAgZGlycy5hZGQocik7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxuICAgIHN0cmVhbShlbnRyeSA9IHRoaXMuY3dkLCBvcHRzID0ge30pIHtcbiAgICAgICAgaWYgKHR5cGVvZiBlbnRyeSA9PT0gJ3N0cmluZycpIHtcbiAgICAgICAgICAgIGVudHJ5ID0gdGhpcy5jd2QucmVzb2x2ZShlbnRyeSk7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSBpZiAoIShlbnRyeSBpbnN0YW5jZW9mIFBhdGhCYXNlKSkge1xuICAgICAgICAgICAgb3B0cyA9IGVudHJ5O1xuICAgICAgICAgICAgZW50cnkgPSB0aGlzLmN3ZDtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCB7IHdpdGhGaWxlVHlwZXMgPSB0cnVlLCBmb2xsb3cgPSBmYWxzZSwgZmlsdGVyLCB3YWxrRmlsdGVyLCB9ID0gb3B0cztcbiAgICAgICAgY29uc3QgcmVzdWx0cyA9IG5ldyBtaW5pcGFzc18xLk1pbmlwYXNzKHsgb2JqZWN0TW9kZTogdHJ1ZSB9KTtcbiAgICAgICAgaWYgKCFmaWx0ZXIgfHwgZmlsdGVyKGVudHJ5KSkge1xuICAgICAgICAgICAgcmVzdWx0cy53cml0ZSh3aXRoRmlsZVR5cGVzID8gZW50cnkgOiBlbnRyeS5mdWxscGF0aCgpKTtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBkaXJzID0gbmV3IFNldCgpO1xuICAgICAgICBjb25zdCBxdWV1ZSA9IFtlbnRyeV07XG4gICAgICAgIGxldCBwcm9jZXNzaW5nID0gMDtcbiAgICAgICAgY29uc3QgcHJvY2VzcyA9ICgpID0+IHtcbiAgICAgICAgICAgIGxldCBwYXVzZWQgPSBmYWxzZTtcbiAgICAgICAgICAgIHdoaWxlICghcGF1c2VkKSB7XG4gICAgICAgICAgICAgICAgY29uc3QgZGlyID0gcXVldWUuc2hpZnQoKTtcbiAgICAgICAgICAgICAgICBpZiAoIWRpcikge1xuICAgICAgICAgICAgICAgICAgICBpZiAocHJvY2Vzc2luZyA9PT0gMClcbiAgICAgICAgICAgICAgICAgICAgICAgIHJlc3VsdHMuZW5kKCk7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgcHJvY2Vzc2luZysrO1xuICAgICAgICAgICAgICAgIGRpcnMuYWRkKGRpcik7XG4gICAgICAgICAgICAgICAgY29uc3Qgb25SZWFkZGlyID0gKGVyLCBlbnRyaWVzLCBkaWRSZWFscGF0aHMgPSBmYWxzZSkgPT4ge1xuICAgICAgICAgICAgICAgICAgICAvKiBjOCBpZ25vcmUgc3RhcnQgKi9cbiAgICAgICAgICAgICAgICAgICAgaWYgKGVyKVxuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHJlc3VsdHMuZW1pdCgnZXJyb3InLCBlcik7XG4gICAgICAgICAgICAgICAgICAgIC8qIGM4IGlnbm9yZSBzdG9wICovXG4gICAgICAgICAgICAgICAgICAgIGlmIChmb2xsb3cgJiYgIWRpZFJlYWxwYXRocykge1xuICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgcHJvbWlzZXMgPSBbXTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGZvciAoY29uc3QgZSBvZiBlbnRyaWVzKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGUuaXNTeW1ib2xpY0xpbmsoKSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcm9taXNlcy5wdXNoKGVcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5yZWFscGF0aCgpXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAudGhlbigocikgPT4gcj8uaXNVbmtub3duKCkgPyByLmxzdGF0KCkgOiByKSk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHByb21pc2VzLmxlbmd0aCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFByb21pc2UuYWxsKHByb21pc2VzKS50aGVuKCgpID0+IG9uUmVhZGRpcihudWxsLCBlbnRyaWVzLCB0cnVlKSk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIGZvciAoY29uc3QgZSBvZiBlbnRyaWVzKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoZSAmJiAoIWZpbHRlciB8fCBmaWx0ZXIoZSkpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFyZXN1bHRzLndyaXRlKHdpdGhGaWxlVHlwZXMgPyBlIDogZS5mdWxscGF0aCgpKSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYXVzZWQgPSB0cnVlO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBwcm9jZXNzaW5nLS07XG4gICAgICAgICAgICAgICAgICAgIGZvciAoY29uc3QgZSBvZiBlbnRyaWVzKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBjb25zdCByID0gZS5yZWFscGF0aENhY2hlZCgpIHx8IGU7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoci5zaG91bGRXYWxrKGRpcnMsIHdhbGtGaWx0ZXIpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcXVldWUucHVzaChyKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBpZiAocGF1c2VkICYmICFyZXN1bHRzLmZsb3dpbmcpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJlc3VsdHMub25jZSgnZHJhaW4nLCBwcm9jZXNzKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBlbHNlIGlmICghc3luYykge1xuICAgICAgICAgICAgICAgICAgICAgICAgcHJvY2VzcygpO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfTtcbiAgICAgICAgICAgICAgICAvLyB6YWxnbyBjb250YWlubWVudFxuICAgICAgICAgICAgICAgIGxldCBzeW5jID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICBkaXIucmVhZGRpckNCKG9uUmVhZGRpciwgdHJ1ZSk7XG4gICAgICAgICAgICAgICAgc3luYyA9IGZhbHNlO1xuICAgICAgICAgICAgfVxuICAgICAgICB9O1xuICAgICAgICBwcm9jZXNzKCk7XG4gICAgICAgIHJldHVybiByZXN1bHRzO1xuICAgIH1cbiAgICBzdHJlYW1TeW5jKGVudHJ5ID0gdGhpcy5jd2QsIG9wdHMgPSB7fSkge1xuICAgICAgICBpZiAodHlwZW9mIGVudHJ5ID09PSAnc3RyaW5nJykge1xuICAgICAgICAgICAgZW50cnkgPSB0aGlzLmN3ZC5yZXNvbHZlKGVudHJ5KTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIGlmICghKGVudHJ5IGluc3RhbmNlb2YgUGF0aEJhc2UpKSB7XG4gICAgICAgICAgICBvcHRzID0gZW50cnk7XG4gICAgICAgICAgICBlbnRyeSA9IHRoaXMuY3dkO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IHsgd2l0aEZpbGVUeXBlcyA9IHRydWUsIGZvbGxvdyA9IGZhbHNlLCBmaWx0ZXIsIHdhbGtGaWx0ZXIsIH0gPSBvcHRzO1xuICAgICAgICBjb25zdCByZXN1bHRzID0gbmV3IG1pbmlwYXNzXzEuTWluaXBhc3MoeyBvYmplY3RNb2RlOiB0cnVlIH0pO1xuICAgICAgICBjb25zdCBkaXJzID0gbmV3IFNldCgpO1xuICAgICAgICBpZiAoIWZpbHRlciB8fCBmaWx0ZXIoZW50cnkpKSB7XG4gICAgICAgICAgICByZXN1bHRzLndyaXRlKHdpdGhGaWxlVHlwZXMgPyBlbnRyeSA6IGVudHJ5LmZ1bGxwYXRoKCkpO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IHF1ZXVlID0gW2VudHJ5XTtcbiAgICAgICAgbGV0IHByb2Nlc3NpbmcgPSAwO1xuICAgICAgICBjb25zdCBwcm9jZXNzID0gKCkgPT4ge1xuICAgICAgICAgICAgbGV0IHBhdXNlZCA9IGZhbHNlO1xuICAgICAgICAgICAgd2hpbGUgKCFwYXVzZWQpIHtcbiAgICAgICAgICAgICAgICBjb25zdCBkaXIgPSBxdWV1ZS5zaGlmdCgpO1xuICAgICAgICAgICAgICAgIGlmICghZGlyKSB7XG4gICAgICAgICAgICAgICAgICAgIGlmIChwcm9jZXNzaW5nID09PSAwKVxuICAgICAgICAgICAgICAgICAgICAgICAgcmVzdWx0cy5lbmQoKTtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBwcm9jZXNzaW5nKys7XG4gICAgICAgICAgICAgICAgZGlycy5hZGQoZGlyKTtcbiAgICAgICAgICAgICAgICBjb25zdCBlbnRyaWVzID0gZGlyLnJlYWRkaXJTeW5jKCk7XG4gICAgICAgICAgICAgICAgZm9yIChjb25zdCBlIG9mIGVudHJpZXMpIHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKCFmaWx0ZXIgfHwgZmlsdGVyKGUpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoIXJlc3VsdHMud3JpdGUod2l0aEZpbGVUeXBlcyA/IGUgOiBlLmZ1bGxwYXRoKCkpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcGF1c2VkID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBwcm9jZXNzaW5nLS07XG4gICAgICAgICAgICAgICAgZm9yIChjb25zdCBlIG9mIGVudHJpZXMpIHtcbiAgICAgICAgICAgICAgICAgICAgbGV0IHIgPSBlO1xuICAgICAgICAgICAgICAgICAgICBpZiAoZS5pc1N5bWJvbGljTGluaygpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoIShmb2xsb3cgJiYgKHIgPSBlLnJlYWxwYXRoU3luYygpKSkpXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoci5pc1Vua25vd24oKSlcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICByLmxzdGF0U3luYygpO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIGlmIChyLnNob3VsZFdhbGsoZGlycywgd2Fsa0ZpbHRlcikpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHF1ZXVlLnB1c2gocik7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAocGF1c2VkICYmICFyZXN1bHRzLmZsb3dpbmcpXG4gICAgICAgICAgICAgICAgcmVzdWx0cy5vbmNlKCdkcmFpbicsIHByb2Nlc3MpO1xuICAgICAgICB9O1xuICAgICAgICBwcm9jZXNzKCk7XG4gICAgICAgIHJldHVybiByZXN1bHRzO1xuICAgIH1cbiAgICBjaGRpcihwYXRoID0gdGhpcy5jd2QpIHtcbiAgICAgICAgY29uc3Qgb2xkQ3dkID0gdGhpcy5jd2Q7XG4gICAgICAgIHRoaXMuY3dkID0gdHlwZW9mIHBhdGggPT09ICdzdHJpbmcnID8gdGhpcy5jd2QucmVzb2x2ZShwYXRoKSA6IHBhdGg7XG4gICAgICAgIHRoaXMuY3dkW3NldEFzQ3dkXShvbGRDd2QpO1xuICAgIH1cbn1cbmV4cG9ydHMuUGF0aFNjdXJyeUJhc2UgPSBQYXRoU2N1cnJ5QmFzZTtcbi8qKlxuICogV2luZG93cyBpbXBsZW1lbnRhdGlvbiBvZiB7QGxpbmsgUGF0aFNjdXJyeUJhc2V9XG4gKlxuICogRGVmYXVsdHMgdG8gY2FzZSBpbnNlbnNpdHZlLCB1c2VzIGAnXFxcXCdgIHRvIGdlbmVyYXRlIHBhdGggc3RyaW5ncy4gIFVzZXNcbiAqIHtAbGluayBQYXRoV2luMzJ9IGZvciBQYXRoIG9iamVjdHMuXG4gKi9cbmNsYXNzIFBhdGhTY3VycnlXaW4zMiBleHRlbmRzIFBhdGhTY3VycnlCYXNlIHtcbiAgICAvKipcbiAgICAgKiBzZXBhcmF0b3IgZm9yIGdlbmVyYXRpbmcgcGF0aCBzdHJpbmdzXG4gICAgICovXG4gICAgc2VwID0gJ1xcXFwnO1xuICAgIGNvbnN0cnVjdG9yKGN3ZCA9IHByb2Nlc3MuY3dkKCksIG9wdHMgPSB7fSkge1xuICAgICAgICBjb25zdCB7IG5vY2FzZSA9IHRydWUgfSA9IG9wdHM7XG4gICAgICAgIHN1cGVyKGN3ZCwgbm9kZV9wYXRoXzEud2luMzIsICdcXFxcJywgeyAuLi5vcHRzLCBub2Nhc2UgfSk7XG4gICAgICAgIHRoaXMubm9jYXNlID0gbm9jYXNlO1xuICAgICAgICBmb3IgKGxldCBwID0gdGhpcy5jd2Q7IHA7IHAgPSBwLnBhcmVudCkge1xuICAgICAgICAgICAgcC5ub2Nhc2UgPSB0aGlzLm5vY2FzZTtcbiAgICAgICAgfVxuICAgIH1cbiAgICAvKipcbiAgICAgKiBAaW50ZXJuYWxcbiAgICAgKi9cbiAgICBwYXJzZVJvb3RQYXRoKGRpcikge1xuICAgICAgICAvLyBpZiB0aGUgcGF0aCBzdGFydHMgd2l0aCBhIHNpbmdsZSBzZXBhcmF0b3IsIGl0J3Mgbm90IGEgVU5DLCBhbmQgd2UnbGxcbiAgICAgICAgLy8ganVzdCBnZXQgc2VwYXJhdG9yIGFzIHRoZSByb290LCBhbmQgZHJpdmVGcm9tVU5DIHdpbGwgcmV0dXJuIFxcXG4gICAgICAgIC8vIEluIHRoYXQgY2FzZSwgbW91bnQgXFwgb24gdGhlIHJvb3QgZnJvbSB0aGUgY3dkLlxuICAgICAgICByZXR1cm4gbm9kZV9wYXRoXzEud2luMzIucGFyc2UoZGlyKS5yb290LnRvVXBwZXJDYXNlKCk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIEBpbnRlcm5hbFxuICAgICAqL1xuICAgIG5ld1Jvb3QoZnMpIHtcbiAgICAgICAgcmV0dXJuIG5ldyBQYXRoV2luMzIodGhpcy5yb290UGF0aCwgSUZESVIsIHVuZGVmaW5lZCwgdGhpcy5yb290cywgdGhpcy5ub2Nhc2UsIHRoaXMuY2hpbGRyZW5DYWNoZSgpLCB7IGZzIH0pO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBSZXR1cm4gdHJ1ZSBpZiB0aGUgcHJvdmlkZWQgcGF0aCBzdHJpbmcgaXMgYW4gYWJzb2x1dGUgcGF0aFxuICAgICAqL1xuICAgIGlzQWJzb2x1dGUocCkge1xuICAgICAgICByZXR1cm4gKHAuc3RhcnRzV2l0aCgnLycpIHx8IHAuc3RhcnRzV2l0aCgnXFxcXCcpIHx8IC9eW2Etel06KFxcL3xcXFxcKS9pLnRlc3QocCkpO1xuICAgIH1cbn1cbmV4cG9ydHMuUGF0aFNjdXJyeVdpbjMyID0gUGF0aFNjdXJyeVdpbjMyO1xuLyoqXG4gKiB7QGxpbmsgUGF0aFNjdXJyeUJhc2V9IGltcGxlbWVudGF0aW9uIGZvciBhbGwgcG9zaXggc3lzdGVtcyBvdGhlciB0aGFuIERhcndpbi5cbiAqXG4gKiBEZWZhdWx0cyB0byBjYXNlLXNlbnNpdGl2ZSBtYXRjaGluZywgdXNlcyBgJy8nYCB0byBnZW5lcmF0ZSBwYXRoIHN0cmluZ3MuXG4gKlxuICogVXNlcyB7QGxpbmsgUGF0aFBvc2l4fSBmb3IgUGF0aCBvYmplY3RzLlxuICovXG5jbGFzcyBQYXRoU2N1cnJ5UG9zaXggZXh0ZW5kcyBQYXRoU2N1cnJ5QmFzZSB7XG4gICAgLyoqXG4gICAgICogc2VwYXJhdG9yIGZvciBnZW5lcmF0aW5nIHBhdGggc3RyaW5nc1xuICAgICAqL1xuICAgIHNlcCA9ICcvJztcbiAgICBjb25zdHJ1Y3Rvcihjd2QgPSBwcm9jZXNzLmN3ZCgpLCBvcHRzID0ge30pIHtcbiAgICAgICAgY29uc3QgeyBub2Nhc2UgPSBmYWxzZSB9ID0gb3B0cztcbiAgICAgICAgc3VwZXIoY3dkLCBub2RlX3BhdGhfMS5wb3NpeCwgJy8nLCB7IC4uLm9wdHMsIG5vY2FzZSB9KTtcbiAgICAgICAgdGhpcy5ub2Nhc2UgPSBub2Nhc2U7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIEBpbnRlcm5hbFxuICAgICAqL1xuICAgIHBhcnNlUm9vdFBhdGgoX2Rpcikge1xuICAgICAgICByZXR1cm4gJy8nO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBAaW50ZXJuYWxcbiAgICAgKi9cbiAgICBuZXdSb290KGZzKSB7XG4gICAgICAgIHJldHVybiBuZXcgUGF0aFBvc2l4KHRoaXMucm9vdFBhdGgsIElGRElSLCB1bmRlZmluZWQsIHRoaXMucm9vdHMsIHRoaXMubm9jYXNlLCB0aGlzLmNoaWxkcmVuQ2FjaGUoKSwgeyBmcyB9KTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogUmV0dXJuIHRydWUgaWYgdGhlIHByb3ZpZGVkIHBhdGggc3RyaW5nIGlzIGFuIGFic29sdXRlIHBhdGhcbiAgICAgKi9cbiAgICBpc0Fic29sdXRlKHApIHtcbiAgICAgICAgcmV0dXJuIHAuc3RhcnRzV2l0aCgnLycpO1xuICAgIH1cbn1cbmV4cG9ydHMuUGF0aFNjdXJyeVBvc2l4ID0gUGF0aFNjdXJyeVBvc2l4O1xuLyoqXG4gKiB7QGxpbmsgUGF0aFNjdXJyeUJhc2V9IGltcGxlbWVudGF0aW9uIGZvciBEYXJ3aW4gKG1hY09TKSBzeXN0ZW1zLlxuICpcbiAqIERlZmF1bHRzIHRvIGNhc2UtaW5zZW5zaXRpdmUgbWF0Y2hpbmcsIHVzZXMgYCcvJ2AgZm9yIGdlbmVyYXRpbmcgcGF0aFxuICogc3RyaW5ncy5cbiAqXG4gKiBVc2VzIHtAbGluayBQYXRoUG9zaXh9IGZvciBQYXRoIG9iamVjdHMuXG4gKi9cbmNsYXNzIFBhdGhTY3VycnlEYXJ3aW4gZXh0ZW5kcyBQYXRoU2N1cnJ5UG9zaXgge1xuICAgIGNvbnN0cnVjdG9yKGN3ZCA9IHByb2Nlc3MuY3dkKCksIG9wdHMgPSB7fSkge1xuICAgICAgICBjb25zdCB7IG5vY2FzZSA9IHRydWUgfSA9IG9wdHM7XG4gICAgICAgIHN1cGVyKGN3ZCwgeyAuLi5vcHRzLCBub2Nhc2UgfSk7XG4gICAgfVxufVxuZXhwb3J0cy5QYXRoU2N1cnJ5RGFyd2luID0gUGF0aFNjdXJyeURhcndpbjtcbi8qKlxuICogRGVmYXVsdCB7QGxpbmsgUGF0aEJhc2V9IGltcGxlbWVudGF0aW9uIGZvciB0aGUgY3VycmVudCBwbGF0Zm9ybS5cbiAqXG4gKiB7QGxpbmsgUGF0aFdpbjMyfSBvbiBXaW5kb3dzIHN5c3RlbXMsIHtAbGluayBQYXRoUG9zaXh9IG9uIGFsbCBvdGhlcnMuXG4gKi9cbmV4cG9ydHMuUGF0aCA9IHByb2Nlc3MucGxhdGZvcm0gPT09ICd3aW4zMicgPyBQYXRoV2luMzIgOiBQYXRoUG9zaXg7XG4vKipcbiAqIERlZmF1bHQge0BsaW5rIFBhdGhTY3VycnlCYXNlfSBpbXBsZW1lbnRhdGlvbiBmb3IgdGhlIGN1cnJlbnQgcGxhdGZvcm0uXG4gKlxuICoge0BsaW5rIFBhdGhTY3VycnlXaW4zMn0gb24gV2luZG93cyBzeXN0ZW1zLCB7QGxpbmsgUGF0aFNjdXJyeURhcndpbn0gb25cbiAqIERhcndpbiAobWFjT1MpIHN5c3RlbXMsIHtAbGluayBQYXRoU2N1cnJ5UG9zaXh9IG9uIGFsbCBvdGhlcnMuXG4gKi9cbmV4cG9ydHMuUGF0aFNjdXJyeSA9IHByb2Nlc3MucGxhdGZvcm0gPT09ICd3aW4zMicgPyBQYXRoU2N1cnJ5V2luMzJcbiAgICA6IHByb2Nlc3MucGxhdGZvcm0gPT09ICdkYXJ3aW4nID8gUGF0aFNjdXJyeURhcndpblxuICAgICAgICA6IFBhdGhTY3VycnlQb3NpeDtcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPWluZGV4LmpzLm1hcCIsCiAgICAiXCJ1c2Ugc3RyaWN0XCI7XG4vLyB0aGlzIGlzIGp1c3QgYSB2ZXJ5IGxpZ2h0IHdyYXBwZXIgYXJvdW5kIDIgYXJyYXlzIHdpdGggYW4gb2Zmc2V0IGluZGV4XG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJfX2VzTW9kdWxlXCIsIHsgdmFsdWU6IHRydWUgfSk7XG5leHBvcnRzLlBhdHRlcm4gPSB2b2lkIDA7XG5jb25zdCBtaW5pbWF0Y2hfMSA9IHJlcXVpcmUoXCJtaW5pbWF0Y2hcIik7XG5jb25zdCBpc1BhdHRlcm5MaXN0ID0gKHBsKSA9PiBwbC5sZW5ndGggPj0gMTtcbmNvbnN0IGlzR2xvYkxpc3QgPSAoZ2wpID0+IGdsLmxlbmd0aCA+PSAxO1xuLyoqXG4gKiBBbiBpbW11dGFibGUtaXNoIHZpZXcgb24gYW4gYXJyYXkgb2YgZ2xvYiBwYXJ0cyBhbmQgdGhlaXIgcGFyc2VkXG4gKiByZXN1bHRzXG4gKi9cbmNsYXNzIFBhdHRlcm4ge1xuICAgICNwYXR0ZXJuTGlzdDtcbiAgICAjZ2xvYkxpc3Q7XG4gICAgI2luZGV4O1xuICAgIGxlbmd0aDtcbiAgICAjcGxhdGZvcm07XG4gICAgI3Jlc3Q7XG4gICAgI2dsb2JTdHJpbmc7XG4gICAgI2lzRHJpdmU7XG4gICAgI2lzVU5DO1xuICAgICNpc0Fic29sdXRlO1xuICAgICNmb2xsb3dHbG9ic3RhciA9IHRydWU7XG4gICAgY29uc3RydWN0b3IocGF0dGVybkxpc3QsIGdsb2JMaXN0LCBpbmRleCwgcGxhdGZvcm0pIHtcbiAgICAgICAgaWYgKCFpc1BhdHRlcm5MaXN0KHBhdHRlcm5MaXN0KSkge1xuICAgICAgICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcignZW1wdHkgcGF0dGVybiBsaXN0Jyk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKCFpc0dsb2JMaXN0KGdsb2JMaXN0KSkge1xuICAgICAgICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcignZW1wdHkgZ2xvYiBsaXN0Jyk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGdsb2JMaXN0Lmxlbmd0aCAhPT0gcGF0dGVybkxpc3QubGVuZ3RoKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCdtaXNtYXRjaGVkIHBhdHRlcm4gbGlzdCBhbmQgZ2xvYiBsaXN0IGxlbmd0aHMnKTtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLmxlbmd0aCA9IHBhdHRlcm5MaXN0Lmxlbmd0aDtcbiAgICAgICAgaWYgKGluZGV4IDwgMCB8fCBpbmRleCA+PSB0aGlzLmxlbmd0aCkge1xuICAgICAgICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcignaW5kZXggb3V0IG9mIHJhbmdlJyk7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy4jcGF0dGVybkxpc3QgPSBwYXR0ZXJuTGlzdDtcbiAgICAgICAgdGhpcy4jZ2xvYkxpc3QgPSBnbG9iTGlzdDtcbiAgICAgICAgdGhpcy4jaW5kZXggPSBpbmRleDtcbiAgICAgICAgdGhpcy4jcGxhdGZvcm0gPSBwbGF0Zm9ybTtcbiAgICAgICAgLy8gbm9ybWFsaXplIHJvb3QgZW50cmllcyBvZiBhYnNvbHV0ZSBwYXR0ZXJucyBvbiBpbml0aWFsIGNyZWF0aW9uLlxuICAgICAgICBpZiAodGhpcy4jaW5kZXggPT09IDApIHtcbiAgICAgICAgICAgIC8vIGM6ID0+IFsnYzovJ11cbiAgICAgICAgICAgIC8vIEM6LyA9PiBbJ0M6LyddXG4gICAgICAgICAgICAvLyBDOi94ID0+IFsnQzovJywgJ3gnXVxuICAgICAgICAgICAgLy8gLy9ob3N0L3NoYXJlID0+IFsnLy9ob3N0L3NoYXJlLyddXG4gICAgICAgICAgICAvLyAvL2hvc3Qvc2hhcmUvID0+IFsnLy9ob3N0L3NoYXJlLyddXG4gICAgICAgICAgICAvLyAvL2hvc3Qvc2hhcmUveCA9PiBbJy8vaG9zdC9zaGFyZS8nLCAneCddXG4gICAgICAgICAgICAvLyAvZXRjID0+IFsnLycsICdldGMnXVxuICAgICAgICAgICAgLy8gLyA9PiBbJy8nXVxuICAgICAgICAgICAgaWYgKHRoaXMuaXNVTkMoKSkge1xuICAgICAgICAgICAgICAgIC8vICcnIC8gJycgLyAnaG9zdCcgLyAnc2hhcmUnXG4gICAgICAgICAgICAgICAgY29uc3QgW3AwLCBwMSwgcDIsIHAzLCAuLi5wcmVzdF0gPSB0aGlzLiNwYXR0ZXJuTGlzdDtcbiAgICAgICAgICAgICAgICBjb25zdCBbZzAsIGcxLCBnMiwgZzMsIC4uLmdyZXN0XSA9IHRoaXMuI2dsb2JMaXN0O1xuICAgICAgICAgICAgICAgIGlmIChwcmVzdFswXSA9PT0gJycpIHtcbiAgICAgICAgICAgICAgICAgICAgLy8gZW5kcyBpbiAvXG4gICAgICAgICAgICAgICAgICAgIHByZXN0LnNoaWZ0KCk7XG4gICAgICAgICAgICAgICAgICAgIGdyZXN0LnNoaWZ0KCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGNvbnN0IHAgPSBbcDAsIHAxLCBwMiwgcDMsICcnXS5qb2luKCcvJyk7XG4gICAgICAgICAgICAgICAgY29uc3QgZyA9IFtnMCwgZzEsIGcyLCBnMywgJyddLmpvaW4oJy8nKTtcbiAgICAgICAgICAgICAgICB0aGlzLiNwYXR0ZXJuTGlzdCA9IFtwLCAuLi5wcmVzdF07XG4gICAgICAgICAgICAgICAgdGhpcy4jZ2xvYkxpc3QgPSBbZywgLi4uZ3Jlc3RdO1xuICAgICAgICAgICAgICAgIHRoaXMubGVuZ3RoID0gdGhpcy4jcGF0dGVybkxpc3QubGVuZ3RoO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSBpZiAodGhpcy5pc0RyaXZlKCkgfHwgdGhpcy5pc0Fic29sdXRlKCkpIHtcbiAgICAgICAgICAgICAgICBjb25zdCBbcDEsIC4uLnByZXN0XSA9IHRoaXMuI3BhdHRlcm5MaXN0O1xuICAgICAgICAgICAgICAgIGNvbnN0IFtnMSwgLi4uZ3Jlc3RdID0gdGhpcy4jZ2xvYkxpc3Q7XG4gICAgICAgICAgICAgICAgaWYgKHByZXN0WzBdID09PSAnJykge1xuICAgICAgICAgICAgICAgICAgICAvLyBlbmRzIGluIC9cbiAgICAgICAgICAgICAgICAgICAgcHJlc3Quc2hpZnQoKTtcbiAgICAgICAgICAgICAgICAgICAgZ3Jlc3Quc2hpZnQoKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgY29uc3QgcCA9IHAxICsgJy8nO1xuICAgICAgICAgICAgICAgIGNvbnN0IGcgPSBnMSArICcvJztcbiAgICAgICAgICAgICAgICB0aGlzLiNwYXR0ZXJuTGlzdCA9IFtwLCAuLi5wcmVzdF07XG4gICAgICAgICAgICAgICAgdGhpcy4jZ2xvYkxpc3QgPSBbZywgLi4uZ3Jlc3RdO1xuICAgICAgICAgICAgICAgIHRoaXMubGVuZ3RoID0gdGhpcy4jcGF0dGVybkxpc3QubGVuZ3RoO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxuICAgIC8qKlxuICAgICAqIFRoZSBmaXJzdCBlbnRyeSBpbiB0aGUgcGFyc2VkIGxpc3Qgb2YgcGF0dGVybnNcbiAgICAgKi9cbiAgICBwYXR0ZXJuKCkge1xuICAgICAgICByZXR1cm4gdGhpcy4jcGF0dGVybkxpc3RbdGhpcy4jaW5kZXhdO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiB0cnVlIG9mIGlmIHBhdHRlcm4oKSByZXR1cm5zIGEgc3RyaW5nXG4gICAgICovXG4gICAgaXNTdHJpbmcoKSB7XG4gICAgICAgIHJldHVybiB0eXBlb2YgdGhpcy4jcGF0dGVybkxpc3RbdGhpcy4jaW5kZXhdID09PSAnc3RyaW5nJztcbiAgICB9XG4gICAgLyoqXG4gICAgICogdHJ1ZSBvZiBpZiBwYXR0ZXJuKCkgcmV0dXJucyBHTE9CU1RBUlxuICAgICAqL1xuICAgIGlzR2xvYnN0YXIoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLiNwYXR0ZXJuTGlzdFt0aGlzLiNpbmRleF0gPT09IG1pbmltYXRjaF8xLkdMT0JTVEFSO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiB0cnVlIGlmIHBhdHRlcm4oKSByZXR1cm5zIGEgcmVnZXhwXG4gICAgICovXG4gICAgaXNSZWdFeHAoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLiNwYXR0ZXJuTGlzdFt0aGlzLiNpbmRleF0gaW5zdGFuY2VvZiBSZWdFeHA7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIFRoZSAvLWpvaW5lZCBzZXQgb2YgZ2xvYiBwYXJ0cyB0aGF0IG1ha2UgdXAgdGhpcyBwYXR0ZXJuXG4gICAgICovXG4gICAgZ2xvYlN0cmluZygpIHtcbiAgICAgICAgcmV0dXJuICh0aGlzLiNnbG9iU3RyaW5nID1cbiAgICAgICAgICAgIHRoaXMuI2dsb2JTdHJpbmcgfHxcbiAgICAgICAgICAgICAgICAodGhpcy4jaW5kZXggPT09IDAgP1xuICAgICAgICAgICAgICAgICAgICB0aGlzLmlzQWJzb2x1dGUoKSA/XG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLiNnbG9iTGlzdFswXSArIHRoaXMuI2dsb2JMaXN0LnNsaWNlKDEpLmpvaW4oJy8nKVxuICAgICAgICAgICAgICAgICAgICAgICAgOiB0aGlzLiNnbG9iTGlzdC5qb2luKCcvJylcbiAgICAgICAgICAgICAgICAgICAgOiB0aGlzLiNnbG9iTGlzdC5zbGljZSh0aGlzLiNpbmRleCkuam9pbignLycpKSk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIHRydWUgaWYgdGhlcmUgYXJlIG1vcmUgcGF0dGVybiBwYXJ0cyBhZnRlciB0aGlzIG9uZVxuICAgICAqL1xuICAgIGhhc01vcmUoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmxlbmd0aCA+IHRoaXMuI2luZGV4ICsgMTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogVGhlIHJlc3Qgb2YgdGhlIHBhdHRlcm4gYWZ0ZXIgdGhpcyBwYXJ0LCBvciBudWxsIGlmIHRoaXMgaXMgdGhlIGVuZFxuICAgICAqL1xuICAgIHJlc3QoKSB7XG4gICAgICAgIGlmICh0aGlzLiNyZXN0ICE9PSB1bmRlZmluZWQpXG4gICAgICAgICAgICByZXR1cm4gdGhpcy4jcmVzdDtcbiAgICAgICAgaWYgKCF0aGlzLmhhc01vcmUoKSlcbiAgICAgICAgICAgIHJldHVybiAodGhpcy4jcmVzdCA9IG51bGwpO1xuICAgICAgICB0aGlzLiNyZXN0ID0gbmV3IFBhdHRlcm4odGhpcy4jcGF0dGVybkxpc3QsIHRoaXMuI2dsb2JMaXN0LCB0aGlzLiNpbmRleCArIDEsIHRoaXMuI3BsYXRmb3JtKTtcbiAgICAgICAgdGhpcy4jcmVzdC4jaXNBYnNvbHV0ZSA9IHRoaXMuI2lzQWJzb2x1dGU7XG4gICAgICAgIHRoaXMuI3Jlc3QuI2lzVU5DID0gdGhpcy4jaXNVTkM7XG4gICAgICAgIHRoaXMuI3Jlc3QuI2lzRHJpdmUgPSB0aGlzLiNpc0RyaXZlO1xuICAgICAgICByZXR1cm4gdGhpcy4jcmVzdDtcbiAgICB9XG4gICAgLyoqXG4gICAgICogdHJ1ZSBpZiB0aGUgcGF0dGVybiByZXByZXNlbnRzIGEgLy91bmMvcGF0aC8gb24gd2luZG93c1xuICAgICAqL1xuICAgIGlzVU5DKCkge1xuICAgICAgICBjb25zdCBwbCA9IHRoaXMuI3BhdHRlcm5MaXN0O1xuICAgICAgICByZXR1cm4gdGhpcy4jaXNVTkMgIT09IHVuZGVmaW5lZCA/XG4gICAgICAgICAgICB0aGlzLiNpc1VOQ1xuICAgICAgICAgICAgOiAodGhpcy4jaXNVTkMgPVxuICAgICAgICAgICAgICAgIHRoaXMuI3BsYXRmb3JtID09PSAnd2luMzInICYmXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuI2luZGV4ID09PSAwICYmXG4gICAgICAgICAgICAgICAgICAgIHBsWzBdID09PSAnJyAmJlxuICAgICAgICAgICAgICAgICAgICBwbFsxXSA9PT0gJycgJiZcbiAgICAgICAgICAgICAgICAgICAgdHlwZW9mIHBsWzJdID09PSAnc3RyaW5nJyAmJlxuICAgICAgICAgICAgICAgICAgICAhIXBsWzJdICYmXG4gICAgICAgICAgICAgICAgICAgIHR5cGVvZiBwbFszXSA9PT0gJ3N0cmluZycgJiZcbiAgICAgICAgICAgICAgICAgICAgISFwbFszXSk7XG4gICAgfVxuICAgIC8vIHBhdHRlcm4gbGlrZSBDOi8uLi5cbiAgICAvLyBzcGxpdCA9IFsnQzonLCAuLi5dXG4gICAgLy8gWFhYOiB3b3VsZCBiZSBuaWNlIHRvIGhhbmRsZSBwYXR0ZXJucyBsaWtlIGBjOipgIHRvIHRlc3QgdGhlIGN3ZFxuICAgIC8vIGluIGM6IGZvciAqLCBidXQgSSBkb24ndCBrbm93IG9mIGEgd2F5IHRvIGV2ZW4gZmlndXJlIG91dCB3aGF0IHRoYXRcbiAgICAvLyBjd2QgaXMgd2l0aG91dCBhY3R1YWxseSBjaGRpcidpbmcgaW50byBpdD9cbiAgICAvKipcbiAgICAgKiBUcnVlIGlmIHRoZSBwYXR0ZXJuIHN0YXJ0cyB3aXRoIGEgZHJpdmUgbGV0dGVyIG9uIFdpbmRvd3NcbiAgICAgKi9cbiAgICBpc0RyaXZlKCkge1xuICAgICAgICBjb25zdCBwbCA9IHRoaXMuI3BhdHRlcm5MaXN0O1xuICAgICAgICByZXR1cm4gdGhpcy4jaXNEcml2ZSAhPT0gdW5kZWZpbmVkID9cbiAgICAgICAgICAgIHRoaXMuI2lzRHJpdmVcbiAgICAgICAgICAgIDogKHRoaXMuI2lzRHJpdmUgPVxuICAgICAgICAgICAgICAgIHRoaXMuI3BsYXRmb3JtID09PSAnd2luMzInICYmXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuI2luZGV4ID09PSAwICYmXG4gICAgICAgICAgICAgICAgICAgIHRoaXMubGVuZ3RoID4gMSAmJlxuICAgICAgICAgICAgICAgICAgICB0eXBlb2YgcGxbMF0gPT09ICdzdHJpbmcnICYmXG4gICAgICAgICAgICAgICAgICAgIC9eW2Etel06JC9pLnRlc3QocGxbMF0pKTtcbiAgICB9XG4gICAgLy8gcGF0dGVybiA9ICcvJyBvciAnLy4uLicgb3IgJy94Ly4uLidcbiAgICAvLyBzcGxpdCA9IFsnJywgJyddIG9yIFsnJywgLi4uXSBvciBbJycsICd4JywgLi4uXVxuICAgIC8vIERyaXZlIGFuZCBVTkMgYm90aCBjb25zaWRlcmVkIGFic29sdXRlIG9uIHdpbmRvd3NcbiAgICAvKipcbiAgICAgKiBUcnVlIGlmIHRoZSBwYXR0ZXJuIGlzIHJvb3RlZCBvbiBhbiBhYnNvbHV0ZSBwYXRoXG4gICAgICovXG4gICAgaXNBYnNvbHV0ZSgpIHtcbiAgICAgICAgY29uc3QgcGwgPSB0aGlzLiNwYXR0ZXJuTGlzdDtcbiAgICAgICAgcmV0dXJuIHRoaXMuI2lzQWJzb2x1dGUgIT09IHVuZGVmaW5lZCA/XG4gICAgICAgICAgICB0aGlzLiNpc0Fic29sdXRlXG4gICAgICAgICAgICA6ICh0aGlzLiNpc0Fic29sdXRlID1cbiAgICAgICAgICAgICAgICAocGxbMF0gPT09ICcnICYmIHBsLmxlbmd0aCA+IDEpIHx8XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuaXNEcml2ZSgpIHx8XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuaXNVTkMoKSk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIGNvbnN1bWUgdGhlIHJvb3Qgb2YgdGhlIHBhdHRlcm4sIGFuZCByZXR1cm4gaXRcbiAgICAgKi9cbiAgICByb290KCkge1xuICAgICAgICBjb25zdCBwID0gdGhpcy4jcGF0dGVybkxpc3RbMF07XG4gICAgICAgIHJldHVybiAodHlwZW9mIHAgPT09ICdzdHJpbmcnICYmIHRoaXMuaXNBYnNvbHV0ZSgpICYmIHRoaXMuI2luZGV4ID09PSAwKSA/XG4gICAgICAgICAgICBwXG4gICAgICAgICAgICA6ICcnO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBDaGVjayB0byBzZWUgaWYgdGhlIGN1cnJlbnQgZ2xvYnN0YXIgcGF0dGVybiBpcyBhbGxvd2VkIHRvIGZvbGxvd1xuICAgICAqIGEgc3ltYm9saWMgbGluay5cbiAgICAgKi9cbiAgICBjaGVja0ZvbGxvd0dsb2JzdGFyKCkge1xuICAgICAgICByZXR1cm4gISh0aGlzLiNpbmRleCA9PT0gMCB8fFxuICAgICAgICAgICAgIXRoaXMuaXNHbG9ic3RhcigpIHx8XG4gICAgICAgICAgICAhdGhpcy4jZm9sbG93R2xvYnN0YXIpO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBNYXJrIHRoYXQgdGhlIGN1cnJlbnQgZ2xvYnN0YXIgcGF0dGVybiBpcyBmb2xsb3dpbmcgYSBzeW1ib2xpYyBsaW5rXG4gICAgICovXG4gICAgbWFya0ZvbGxvd0dsb2JzdGFyKCkge1xuICAgICAgICBpZiAodGhpcy4jaW5kZXggPT09IDAgfHwgIXRoaXMuaXNHbG9ic3RhcigpIHx8ICF0aGlzLiNmb2xsb3dHbG9ic3RhcilcbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgdGhpcy4jZm9sbG93R2xvYnN0YXIgPSBmYWxzZTtcbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxufVxuZXhwb3J0cy5QYXR0ZXJuID0gUGF0dGVybjtcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPXBhdHRlcm4uanMubWFwIiwKICAgICJcInVzZSBzdHJpY3RcIjtcbi8vIGdpdmUgaXQgYSBwYXR0ZXJuLCBhbmQgaXQnbGwgYmUgYWJsZSB0byB0ZWxsIHlvdSBpZlxuLy8gYSBnaXZlbiBwYXRoIHNob3VsZCBiZSBpZ25vcmVkLlxuLy8gSWdub3JpbmcgYSBwYXRoIGlnbm9yZXMgaXRzIGNoaWxkcmVuIGlmIHRoZSBwYXR0ZXJuIGVuZHMgaW4gLyoqXG4vLyBJZ25vcmVzIGFyZSBhbHdheXMgcGFyc2VkIGluIGRvdDp0cnVlIG1vZGVcbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIl9fZXNNb2R1bGVcIiwgeyB2YWx1ZTogdHJ1ZSB9KTtcbmV4cG9ydHMuSWdub3JlID0gdm9pZCAwO1xuY29uc3QgbWluaW1hdGNoXzEgPSByZXF1aXJlKFwibWluaW1hdGNoXCIpO1xuY29uc3QgcGF0dGVybl9qc18xID0gcmVxdWlyZShcIi4vcGF0dGVybi5qc1wiKTtcbmNvbnN0IGRlZmF1bHRQbGF0Zm9ybSA9ICh0eXBlb2YgcHJvY2VzcyA9PT0gJ29iamVjdCcgJiZcbiAgICBwcm9jZXNzICYmXG4gICAgdHlwZW9mIHByb2Nlc3MucGxhdGZvcm0gPT09ICdzdHJpbmcnKSA/XG4gICAgcHJvY2Vzcy5wbGF0Zm9ybVxuICAgIDogJ2xpbnV4Jztcbi8qKlxuICogQ2xhc3MgdXNlZCB0byBwcm9jZXNzIGlnbm9yZWQgcGF0dGVybnNcbiAqL1xuY2xhc3MgSWdub3JlIHtcbiAgICByZWxhdGl2ZTtcbiAgICByZWxhdGl2ZUNoaWxkcmVuO1xuICAgIGFic29sdXRlO1xuICAgIGFic29sdXRlQ2hpbGRyZW47XG4gICAgcGxhdGZvcm07XG4gICAgbW1vcHRzO1xuICAgIGNvbnN0cnVjdG9yKGlnbm9yZWQsIHsgbm9icmFjZSwgbm9jYXNlLCBub2V4dCwgbm9nbG9ic3RhciwgcGxhdGZvcm0gPSBkZWZhdWx0UGxhdGZvcm0sIH0pIHtcbiAgICAgICAgdGhpcy5yZWxhdGl2ZSA9IFtdO1xuICAgICAgICB0aGlzLmFic29sdXRlID0gW107XG4gICAgICAgIHRoaXMucmVsYXRpdmVDaGlsZHJlbiA9IFtdO1xuICAgICAgICB0aGlzLmFic29sdXRlQ2hpbGRyZW4gPSBbXTtcbiAgICAgICAgdGhpcy5wbGF0Zm9ybSA9IHBsYXRmb3JtO1xuICAgICAgICB0aGlzLm1tb3B0cyA9IHtcbiAgICAgICAgICAgIGRvdDogdHJ1ZSxcbiAgICAgICAgICAgIG5vYnJhY2UsXG4gICAgICAgICAgICBub2Nhc2UsXG4gICAgICAgICAgICBub2V4dCxcbiAgICAgICAgICAgIG5vZ2xvYnN0YXIsXG4gICAgICAgICAgICBvcHRpbWl6YXRpb25MZXZlbDogMixcbiAgICAgICAgICAgIHBsYXRmb3JtLFxuICAgICAgICAgICAgbm9jb21tZW50OiB0cnVlLFxuICAgICAgICAgICAgbm9uZWdhdGU6IHRydWUsXG4gICAgICAgIH07XG4gICAgICAgIGZvciAoY29uc3QgaWduIG9mIGlnbm9yZWQpXG4gICAgICAgICAgICB0aGlzLmFkZChpZ24pO1xuICAgIH1cbiAgICBhZGQoaWduKSB7XG4gICAgICAgIC8vIHRoaXMgaXMgYSBsaXR0bGUgd2VpcmQsIGJ1dCBpdCBnaXZlcyB1cyBhIGNsZWFuIHNldCBvZiBvcHRpbWl6ZWRcbiAgICAgICAgLy8gbWluaW1hdGNoIG1hdGNoZXJzLCB3aXRob3V0IGdldHRpbmcgdHJpcHBlZCB1cCBpZiBvbmUgb2YgdGhlbVxuICAgICAgICAvLyBlbmRzIGluIC8qKiBpbnNpZGUgYSBicmFjZSBzZWN0aW9uLCBhbmQgaXQncyBvbmx5IGluZWZmaWNpZW50IGF0XG4gICAgICAgIC8vIHRoZSBzdGFydCBvZiB0aGUgd2Fsaywgbm90IGFsb25nIGl0LlxuICAgICAgICAvLyBJdCdkIGJlIG5pY2UgaWYgdGhlIFBhdHRlcm4gY2xhc3MganVzdCBoYWQgYSAudGVzdCgpIG1ldGhvZCwgYnV0XG4gICAgICAgIC8vIGhhbmRsaW5nIGdsb2JzdGFycyBpcyBhIGJpdCBvZiBhIHBpdGEsIGFuZCB0aGF0IGNvZGUgYWxyZWFkeSBsaXZlc1xuICAgICAgICAvLyBpbiBtaW5pbWF0Y2ggYW55d2F5LlxuICAgICAgICAvLyBBbm90aGVyIHdheSB3b3VsZCBiZSBpZiBtYXliZSBNaW5pbWF0Y2ggY291bGQgdGFrZSBpdHMgc2V0L2dsb2JQYXJ0c1xuICAgICAgICAvLyBhcyBhbiBvcHRpb24sIGFuZCB0aGVuIHdlIGNvdWxkIGF0IGxlYXN0IGp1c3QgdXNlIFBhdHRlcm4gdG8gdGVzdFxuICAgICAgICAvLyBmb3IgYWJzb2x1dGUtbmVzcy5cbiAgICAgICAgLy8gWWV0IGFub3RoZXIgd2F5LCBNaW5pbWF0Y2ggY291bGQgdGFrZSBhbiBhcnJheSBvZiBnbG9iIHN0cmluZ3MsIGFuZFxuICAgICAgICAvLyBhIGN3ZCBvcHRpb24sIGFuZCBkbyB0aGUgcmlnaHQgdGhpbmcuXG4gICAgICAgIGNvbnN0IG1tID0gbmV3IG1pbmltYXRjaF8xLk1pbmltYXRjaChpZ24sIHRoaXMubW1vcHRzKTtcbiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBtbS5zZXQubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgIGNvbnN0IHBhcnNlZCA9IG1tLnNldFtpXTtcbiAgICAgICAgICAgIGNvbnN0IGdsb2JQYXJ0cyA9IG1tLmdsb2JQYXJ0c1tpXTtcbiAgICAgICAgICAgIC8qIGM4IGlnbm9yZSBzdGFydCAqL1xuICAgICAgICAgICAgaWYgKCFwYXJzZWQgfHwgIWdsb2JQYXJ0cykge1xuICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcignaW52YWxpZCBwYXR0ZXJuIG9iamVjdCcpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgLy8gc3RyaXAgb2ZmIGxlYWRpbmcgLi8gcG9ydGlvbnNcbiAgICAgICAgICAgIC8vIGh0dHBzOi8vZ2l0aHViLmNvbS9pc2FhY3Mvbm9kZS1nbG9iL2lzc3Vlcy81NzBcbiAgICAgICAgICAgIHdoaWxlIChwYXJzZWRbMF0gPT09ICcuJyAmJiBnbG9iUGFydHNbMF0gPT09ICcuJykge1xuICAgICAgICAgICAgICAgIHBhcnNlZC5zaGlmdCgpO1xuICAgICAgICAgICAgICAgIGdsb2JQYXJ0cy5zaGlmdCgpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgLyogYzggaWdub3JlIHN0b3AgKi9cbiAgICAgICAgICAgIGNvbnN0IHAgPSBuZXcgcGF0dGVybl9qc18xLlBhdHRlcm4ocGFyc2VkLCBnbG9iUGFydHMsIDAsIHRoaXMucGxhdGZvcm0pO1xuICAgICAgICAgICAgY29uc3QgbSA9IG5ldyBtaW5pbWF0Y2hfMS5NaW5pbWF0Y2gocC5nbG9iU3RyaW5nKCksIHRoaXMubW1vcHRzKTtcbiAgICAgICAgICAgIGNvbnN0IGNoaWxkcmVuID0gZ2xvYlBhcnRzW2dsb2JQYXJ0cy5sZW5ndGggLSAxXSA9PT0gJyoqJztcbiAgICAgICAgICAgIGNvbnN0IGFic29sdXRlID0gcC5pc0Fic29sdXRlKCk7XG4gICAgICAgICAgICBpZiAoYWJzb2x1dGUpXG4gICAgICAgICAgICAgICAgdGhpcy5hYnNvbHV0ZS5wdXNoKG0pO1xuICAgICAgICAgICAgZWxzZVxuICAgICAgICAgICAgICAgIHRoaXMucmVsYXRpdmUucHVzaChtKTtcbiAgICAgICAgICAgIGlmIChjaGlsZHJlbikge1xuICAgICAgICAgICAgICAgIGlmIChhYnNvbHV0ZSlcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5hYnNvbHV0ZUNoaWxkcmVuLnB1c2gobSk7XG4gICAgICAgICAgICAgICAgZWxzZVxuICAgICAgICAgICAgICAgICAgICB0aGlzLnJlbGF0aXZlQ2hpbGRyZW4ucHVzaChtKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cbiAgICBpZ25vcmVkKHApIHtcbiAgICAgICAgY29uc3QgZnVsbHBhdGggPSBwLmZ1bGxwYXRoKCk7XG4gICAgICAgIGNvbnN0IGZ1bGxwYXRocyA9IGAke2Z1bGxwYXRofS9gO1xuICAgICAgICBjb25zdCByZWxhdGl2ZSA9IHAucmVsYXRpdmUoKSB8fCAnLic7XG4gICAgICAgIGNvbnN0IHJlbGF0aXZlcyA9IGAke3JlbGF0aXZlfS9gO1xuICAgICAgICBmb3IgKGNvbnN0IG0gb2YgdGhpcy5yZWxhdGl2ZSkge1xuICAgICAgICAgICAgaWYgKG0ubWF0Y2gocmVsYXRpdmUpIHx8IG0ubWF0Y2gocmVsYXRpdmVzKSlcbiAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgfVxuICAgICAgICBmb3IgKGNvbnN0IG0gb2YgdGhpcy5hYnNvbHV0ZSkge1xuICAgICAgICAgICAgaWYgKG0ubWF0Y2goZnVsbHBhdGgpIHx8IG0ubWF0Y2goZnVsbHBhdGhzKSlcbiAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuICAgIGNoaWxkcmVuSWdub3JlZChwKSB7XG4gICAgICAgIGNvbnN0IGZ1bGxwYXRoID0gcC5mdWxscGF0aCgpICsgJy8nO1xuICAgICAgICBjb25zdCByZWxhdGl2ZSA9IChwLnJlbGF0aXZlKCkgfHwgJy4nKSArICcvJztcbiAgICAgICAgZm9yIChjb25zdCBtIG9mIHRoaXMucmVsYXRpdmVDaGlsZHJlbikge1xuICAgICAgICAgICAgaWYgKG0ubWF0Y2gocmVsYXRpdmUpKVxuICAgICAgICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICB9XG4gICAgICAgIGZvciAoY29uc3QgbSBvZiB0aGlzLmFic29sdXRlQ2hpbGRyZW4pIHtcbiAgICAgICAgICAgIGlmIChtLm1hdGNoKGZ1bGxwYXRoKSlcbiAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxufVxuZXhwb3J0cy5JZ25vcmUgPSBJZ25vcmU7XG4vLyMgc291cmNlTWFwcGluZ1VSTD1pZ25vcmUuanMubWFwIiwKICAgICJcInVzZSBzdHJpY3RcIjtcbi8vIHN5bmNocm9ub3VzIHV0aWxpdHkgZm9yIGZpbHRlcmluZyBlbnRyaWVzIGFuZCBjYWxjdWxhdGluZyBzdWJ3YWxrc1xuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiX19lc01vZHVsZVwiLCB7IHZhbHVlOiB0cnVlIH0pO1xuZXhwb3J0cy5Qcm9jZXNzb3IgPSBleHBvcnRzLlN1YldhbGtzID0gZXhwb3J0cy5NYXRjaFJlY29yZCA9IGV4cG9ydHMuSGFzV2Fsa2VkQ2FjaGUgPSB2b2lkIDA7XG5jb25zdCBtaW5pbWF0Y2hfMSA9IHJlcXVpcmUoXCJtaW5pbWF0Y2hcIik7XG4vKipcbiAqIEEgY2FjaGUgb2Ygd2hpY2ggcGF0dGVybnMgaGF2ZSBiZWVuIHByb2Nlc3NlZCBmb3IgYSBnaXZlbiBQYXRoXG4gKi9cbmNsYXNzIEhhc1dhbGtlZENhY2hlIHtcbiAgICBzdG9yZTtcbiAgICBjb25zdHJ1Y3RvcihzdG9yZSA9IG5ldyBNYXAoKSkge1xuICAgICAgICB0aGlzLnN0b3JlID0gc3RvcmU7XG4gICAgfVxuICAgIGNvcHkoKSB7XG4gICAgICAgIHJldHVybiBuZXcgSGFzV2Fsa2VkQ2FjaGUobmV3IE1hcCh0aGlzLnN0b3JlKSk7XG4gICAgfVxuICAgIGhhc1dhbGtlZCh0YXJnZXQsIHBhdHRlcm4pIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuc3RvcmUuZ2V0KHRhcmdldC5mdWxscGF0aCgpKT8uaGFzKHBhdHRlcm4uZ2xvYlN0cmluZygpKTtcbiAgICB9XG4gICAgc3RvcmVXYWxrZWQodGFyZ2V0LCBwYXR0ZXJuKSB7XG4gICAgICAgIGNvbnN0IGZ1bGxwYXRoID0gdGFyZ2V0LmZ1bGxwYXRoKCk7XG4gICAgICAgIGNvbnN0IGNhY2hlZCA9IHRoaXMuc3RvcmUuZ2V0KGZ1bGxwYXRoKTtcbiAgICAgICAgaWYgKGNhY2hlZClcbiAgICAgICAgICAgIGNhY2hlZC5hZGQocGF0dGVybi5nbG9iU3RyaW5nKCkpO1xuICAgICAgICBlbHNlXG4gICAgICAgICAgICB0aGlzLnN0b3JlLnNldChmdWxscGF0aCwgbmV3IFNldChbcGF0dGVybi5nbG9iU3RyaW5nKCldKSk7XG4gICAgfVxufVxuZXhwb3J0cy5IYXNXYWxrZWRDYWNoZSA9IEhhc1dhbGtlZENhY2hlO1xuLyoqXG4gKiBBIHJlY29yZCBvZiB3aGljaCBwYXRocyBoYXZlIGJlZW4gbWF0Y2hlZCBpbiBhIGdpdmVuIHdhbGsgc3RlcCxcbiAqIGFuZCB3aGV0aGVyIHRoZXkgb25seSBhcmUgY29uc2lkZXJlZCBhIG1hdGNoIGlmIHRoZXkgYXJlIGEgZGlyZWN0b3J5LFxuICogYW5kIHdoZXRoZXIgdGhlaXIgYWJzb2x1dGUgb3IgcmVsYXRpdmUgcGF0aCBzaG91bGQgYmUgcmV0dXJuZWQuXG4gKi9cbmNsYXNzIE1hdGNoUmVjb3JkIHtcbiAgICBzdG9yZSA9IG5ldyBNYXAoKTtcbiAgICBhZGQodGFyZ2V0LCBhYnNvbHV0ZSwgaWZEaXIpIHtcbiAgICAgICAgY29uc3QgbiA9IChhYnNvbHV0ZSA/IDIgOiAwKSB8IChpZkRpciA/IDEgOiAwKTtcbiAgICAgICAgY29uc3QgY3VycmVudCA9IHRoaXMuc3RvcmUuZ2V0KHRhcmdldCk7XG4gICAgICAgIHRoaXMuc3RvcmUuc2V0KHRhcmdldCwgY3VycmVudCA9PT0gdW5kZWZpbmVkID8gbiA6IG4gJiBjdXJyZW50KTtcbiAgICB9XG4gICAgLy8gbWF0Y2gsIGFic29sdXRlLCBpZmRpclxuICAgIGVudHJpZXMoKSB7XG4gICAgICAgIHJldHVybiBbLi4udGhpcy5zdG9yZS5lbnRyaWVzKCldLm1hcCgoW3BhdGgsIG5dKSA9PiBbXG4gICAgICAgICAgICBwYXRoLFxuICAgICAgICAgICAgISEobiAmIDIpLFxuICAgICAgICAgICAgISEobiAmIDEpLFxuICAgICAgICBdKTtcbiAgICB9XG59XG5leHBvcnRzLk1hdGNoUmVjb3JkID0gTWF0Y2hSZWNvcmQ7XG4vKipcbiAqIEEgY29sbGVjdGlvbiBvZiBwYXR0ZXJucyB0aGF0IG11c3QgYmUgcHJvY2Vzc2VkIGluIGEgc3Vic2VxdWVudCBzdGVwXG4gKiBmb3IgYSBnaXZlbiBwYXRoLlxuICovXG5jbGFzcyBTdWJXYWxrcyB7XG4gICAgc3RvcmUgPSBuZXcgTWFwKCk7XG4gICAgYWRkKHRhcmdldCwgcGF0dGVybikge1xuICAgICAgICBpZiAoIXRhcmdldC5jYW5SZWFkZGlyKCkpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBzdWJzID0gdGhpcy5zdG9yZS5nZXQodGFyZ2V0KTtcbiAgICAgICAgaWYgKHN1YnMpIHtcbiAgICAgICAgICAgIGlmICghc3Vicy5maW5kKHAgPT4gcC5nbG9iU3RyaW5nKCkgPT09IHBhdHRlcm4uZ2xvYlN0cmluZygpKSkge1xuICAgICAgICAgICAgICAgIHN1YnMucHVzaChwYXR0ZXJuKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBlbHNlXG4gICAgICAgICAgICB0aGlzLnN0b3JlLnNldCh0YXJnZXQsIFtwYXR0ZXJuXSk7XG4gICAgfVxuICAgIGdldCh0YXJnZXQpIHtcbiAgICAgICAgY29uc3Qgc3VicyA9IHRoaXMuc3RvcmUuZ2V0KHRhcmdldCk7XG4gICAgICAgIC8qIGM4IGlnbm9yZSBzdGFydCAqL1xuICAgICAgICBpZiAoIXN1YnMpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcignYXR0ZW1wdGluZyB0byB3YWxrIHVua25vd24gcGF0aCcpO1xuICAgICAgICB9XG4gICAgICAgIC8qIGM4IGlnbm9yZSBzdG9wICovXG4gICAgICAgIHJldHVybiBzdWJzO1xuICAgIH1cbiAgICBlbnRyaWVzKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5rZXlzKCkubWFwKGsgPT4gW2ssIHRoaXMuc3RvcmUuZ2V0KGspXSk7XG4gICAgfVxuICAgIGtleXMoKSB7XG4gICAgICAgIHJldHVybiBbLi4udGhpcy5zdG9yZS5rZXlzKCldLmZpbHRlcih0ID0+IHQuY2FuUmVhZGRpcigpKTtcbiAgICB9XG59XG5leHBvcnRzLlN1YldhbGtzID0gU3ViV2Fsa3M7XG4vKipcbiAqIFRoZSBjbGFzcyB0aGF0IHByb2Nlc3NlcyBwYXR0ZXJucyBmb3IgYSBnaXZlbiBwYXRoLlxuICpcbiAqIEhhbmRsZXMgY2hpbGQgZW50cnkgZmlsdGVyaW5nLCBhbmQgZGV0ZXJtaW5pbmcgd2hldGhlciBhIHBhdGgnc1xuICogZGlyZWN0b3J5IGNvbnRlbnRzIG11c3QgYmUgcmVhZC5cbiAqL1xuY2xhc3MgUHJvY2Vzc29yIHtcbiAgICBoYXNXYWxrZWRDYWNoZTtcbiAgICBtYXRjaGVzID0gbmV3IE1hdGNoUmVjb3JkKCk7XG4gICAgc3Vid2Fsa3MgPSBuZXcgU3ViV2Fsa3MoKTtcbiAgICBwYXR0ZXJucztcbiAgICBmb2xsb3c7XG4gICAgZG90O1xuICAgIG9wdHM7XG4gICAgY29uc3RydWN0b3Iob3B0cywgaGFzV2Fsa2VkQ2FjaGUpIHtcbiAgICAgICAgdGhpcy5vcHRzID0gb3B0cztcbiAgICAgICAgdGhpcy5mb2xsb3cgPSAhIW9wdHMuZm9sbG93O1xuICAgICAgICB0aGlzLmRvdCA9ICEhb3B0cy5kb3Q7XG4gICAgICAgIHRoaXMuaGFzV2Fsa2VkQ2FjaGUgPVxuICAgICAgICAgICAgaGFzV2Fsa2VkQ2FjaGUgPyBoYXNXYWxrZWRDYWNoZS5jb3B5KCkgOiBuZXcgSGFzV2Fsa2VkQ2FjaGUoKTtcbiAgICB9XG4gICAgcHJvY2Vzc1BhdHRlcm5zKHRhcmdldCwgcGF0dGVybnMpIHtcbiAgICAgICAgdGhpcy5wYXR0ZXJucyA9IHBhdHRlcm5zO1xuICAgICAgICBjb25zdCBwcm9jZXNzaW5nU2V0ID0gcGF0dGVybnMubWFwKHAgPT4gW3RhcmdldCwgcF0pO1xuICAgICAgICAvLyBtYXAgb2YgcGF0aHMgdG8gdGhlIG1hZ2ljLXN0YXJ0aW5nIHN1YndhbGtzIHRoZXkgbmVlZCB0byB3YWxrXG4gICAgICAgIC8vIGZpcnN0IGl0ZW0gaW4gcGF0dGVybnMgaXMgdGhlIGZpbHRlclxuICAgICAgICBmb3IgKGxldCBbdCwgcGF0dGVybl0gb2YgcHJvY2Vzc2luZ1NldCkge1xuICAgICAgICAgICAgdGhpcy5oYXNXYWxrZWRDYWNoZS5zdG9yZVdhbGtlZCh0LCBwYXR0ZXJuKTtcbiAgICAgICAgICAgIGNvbnN0IHJvb3QgPSBwYXR0ZXJuLnJvb3QoKTtcbiAgICAgICAgICAgIGNvbnN0IGFic29sdXRlID0gcGF0dGVybi5pc0Fic29sdXRlKCkgJiYgdGhpcy5vcHRzLmFic29sdXRlICE9PSBmYWxzZTtcbiAgICAgICAgICAgIC8vIHN0YXJ0IGFic29sdXRlIHBhdHRlcm5zIGF0IHJvb3RcbiAgICAgICAgICAgIGlmIChyb290KSB7XG4gICAgICAgICAgICAgICAgdCA9IHQucmVzb2x2ZShyb290ID09PSAnLycgJiYgdGhpcy5vcHRzLnJvb3QgIT09IHVuZGVmaW5lZCA/XG4gICAgICAgICAgICAgICAgICAgIHRoaXMub3B0cy5yb290XG4gICAgICAgICAgICAgICAgICAgIDogcm9vdCk7XG4gICAgICAgICAgICAgICAgY29uc3QgcmVzdCA9IHBhdHRlcm4ucmVzdCgpO1xuICAgICAgICAgICAgICAgIGlmICghcmVzdCkge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLm1hdGNoZXMuYWRkKHQsIHRydWUsIGZhbHNlKTtcbiAgICAgICAgICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICBwYXR0ZXJuID0gcmVzdDtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAodC5pc0VOT0VOVCgpKVxuICAgICAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgICAgbGV0IHA7XG4gICAgICAgICAgICBsZXQgcmVzdDtcbiAgICAgICAgICAgIGxldCBjaGFuZ2VkID0gZmFsc2U7XG4gICAgICAgICAgICB3aGlsZSAodHlwZW9mIChwID0gcGF0dGVybi5wYXR0ZXJuKCkpID09PSAnc3RyaW5nJyAmJlxuICAgICAgICAgICAgICAgIChyZXN0ID0gcGF0dGVybi5yZXN0KCkpKSB7XG4gICAgICAgICAgICAgICAgY29uc3QgYyA9IHQucmVzb2x2ZShwKTtcbiAgICAgICAgICAgICAgICB0ID0gYztcbiAgICAgICAgICAgICAgICBwYXR0ZXJuID0gcmVzdDtcbiAgICAgICAgICAgICAgICBjaGFuZ2VkID0gdHJ1ZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHAgPSBwYXR0ZXJuLnBhdHRlcm4oKTtcbiAgICAgICAgICAgIHJlc3QgPSBwYXR0ZXJuLnJlc3QoKTtcbiAgICAgICAgICAgIGlmIChjaGFuZ2VkKSB7XG4gICAgICAgICAgICAgICAgaWYgKHRoaXMuaGFzV2Fsa2VkQ2FjaGUuaGFzV2Fsa2VkKHQsIHBhdHRlcm4pKVxuICAgICAgICAgICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICAgICAgICB0aGlzLmhhc1dhbGtlZENhY2hlLnN0b3JlV2Fsa2VkKHQsIHBhdHRlcm4pO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgLy8gbm93IHdlIGhhdmUgZWl0aGVyIGEgZmluYWwgc3RyaW5nIGZvciBhIGtub3duIGVudHJ5LFxuICAgICAgICAgICAgLy8gbW9yZSBzdHJpbmdzIGZvciBhbiB1bmtub3duIGVudHJ5LFxuICAgICAgICAgICAgLy8gb3IgYSBwYXR0ZXJuIHN0YXJ0aW5nIHdpdGggbWFnaWMsIG1vdW50ZWQgb24gdC5cbiAgICAgICAgICAgIGlmICh0eXBlb2YgcCA9PT0gJ3N0cmluZycpIHtcbiAgICAgICAgICAgICAgICAvLyBtdXN0IG5vdCBiZSBmaW5hbCBlbnRyeSwgb3RoZXJ3aXNlIHdlIHdvdWxkIGhhdmVcbiAgICAgICAgICAgICAgICAvLyBjb25jYXRlbmF0ZWQgaXQgZWFybGllci5cbiAgICAgICAgICAgICAgICBjb25zdCBpZkRpciA9IHAgPT09ICcuLicgfHwgcCA9PT0gJycgfHwgcCA9PT0gJy4nO1xuICAgICAgICAgICAgICAgIHRoaXMubWF0Y2hlcy5hZGQodC5yZXNvbHZlKHApLCBhYnNvbHV0ZSwgaWZEaXIpO1xuICAgICAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSBpZiAocCA9PT0gbWluaW1hdGNoXzEuR0xPQlNUQVIpIHtcbiAgICAgICAgICAgICAgICAvLyBpZiBubyByZXN0LCBtYXRjaCBhbmQgc3Vid2FsayBwYXR0ZXJuXG4gICAgICAgICAgICAgICAgLy8gaWYgcmVzdCwgcHJvY2VzcyByZXN0IGFuZCBzdWJ3YWxrIHBhdHRlcm5cbiAgICAgICAgICAgICAgICAvLyBpZiBpdCdzIGEgc3ltbGluaywgYnV0IHdlIGRpZG4ndCBnZXQgaGVyZSBieSB3YXkgb2YgYVxuICAgICAgICAgICAgICAgIC8vIGdsb2JzdGFyIG1hdGNoIChtZWFuaW5nIGl0J3MgdGhlIGZpcnN0IHRpbWUgVEhJUyBnbG9ic3RhclxuICAgICAgICAgICAgICAgIC8vIGhhcyB0cmF2ZXJzZWQgYSBzeW1saW5rKSwgdGhlbiB3ZSBmb2xsb3cgaXQuIE90aGVyd2lzZSwgc3RvcC5cbiAgICAgICAgICAgICAgICBpZiAoIXQuaXNTeW1ib2xpY0xpbmsoKSB8fFxuICAgICAgICAgICAgICAgICAgICB0aGlzLmZvbGxvdyB8fFxuICAgICAgICAgICAgICAgICAgICBwYXR0ZXJuLmNoZWNrRm9sbG93R2xvYnN0YXIoKSkge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLnN1YndhbGtzLmFkZCh0LCBwYXR0ZXJuKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgY29uc3QgcnAgPSByZXN0Py5wYXR0ZXJuKCk7XG4gICAgICAgICAgICAgICAgY29uc3QgcnJlc3QgPSByZXN0Py5yZXN0KCk7XG4gICAgICAgICAgICAgICAgaWYgKCFyZXN0IHx8ICgocnAgPT09ICcnIHx8IHJwID09PSAnLicpICYmICFycmVzdCkpIHtcbiAgICAgICAgICAgICAgICAgICAgLy8gb25seSBIQVMgdG8gYmUgYSBkaXIgaWYgaXQgZW5kcyBpbiAqKi8gb3IgKiovLlxuICAgICAgICAgICAgICAgICAgICAvLyBidXQgZW5kaW5nIGluICoqIHdpbGwgbWF0Y2ggZmlsZXMgYXMgd2VsbC5cbiAgICAgICAgICAgICAgICAgICAgdGhpcy5tYXRjaGVzLmFkZCh0LCBhYnNvbHV0ZSwgcnAgPT09ICcnIHx8IHJwID09PSAnLicpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKHJwID09PSAnLi4nKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAvLyB0aGlzIHdvdWxkIG1lYW4geW91J3JlIG1hdGNoaW5nICoqLy4uIGF0IHRoZSBmcyByb290LFxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gYW5kIG5vIHRoYW5rcywgSSdtIG5vdCBnb25uYSB0ZXN0IHRoYXQgc3BlY2lmaWMgY2FzZS5cbiAgICAgICAgICAgICAgICAgICAgICAgIC8qIGM4IGlnbm9yZSBzdGFydCAqL1xuICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdHAgPSB0LnBhcmVudCB8fCB0O1xuICAgICAgICAgICAgICAgICAgICAgICAgLyogYzggaWdub3JlIHN0b3AgKi9cbiAgICAgICAgICAgICAgICAgICAgICAgIGlmICghcnJlc3QpXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5tYXRjaGVzLmFkZCh0cCwgYWJzb2x1dGUsIHRydWUpO1xuICAgICAgICAgICAgICAgICAgICAgICAgZWxzZSBpZiAoIXRoaXMuaGFzV2Fsa2VkQ2FjaGUuaGFzV2Fsa2VkKHRwLCBycmVzdCkpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnN1YndhbGtzLmFkZCh0cCwgcnJlc3QpO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSBpZiAocCBpbnN0YW5jZW9mIFJlZ0V4cCkge1xuICAgICAgICAgICAgICAgIHRoaXMuc3Vid2Fsa3MuYWRkKHQsIHBhdHRlcm4pO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cbiAgICBzdWJ3YWxrVGFyZ2V0cygpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuc3Vid2Fsa3Mua2V5cygpO1xuICAgIH1cbiAgICBjaGlsZCgpIHtcbiAgICAgICAgcmV0dXJuIG5ldyBQcm9jZXNzb3IodGhpcy5vcHRzLCB0aGlzLmhhc1dhbGtlZENhY2hlKTtcbiAgICB9XG4gICAgLy8gcmV0dXJuIGEgbmV3IFByb2Nlc3NvciBjb250YWluaW5nIHRoZSBzdWJ3YWxrcyBmb3IgZWFjaFxuICAgIC8vIGNoaWxkIGVudHJ5LCBhbmQgYSBzZXQgb2YgbWF0Y2hlcywgYW5kXG4gICAgLy8gYSBoYXNXYWxrZWRDYWNoZSB0aGF0J3MgYSBjb3B5IG9mIHRoaXMgb25lXG4gICAgLy8gdGhlbiB3ZSdyZSBnb2luZyB0byBjYWxsXG4gICAgZmlsdGVyRW50cmllcyhwYXJlbnQsIGVudHJpZXMpIHtcbiAgICAgICAgY29uc3QgcGF0dGVybnMgPSB0aGlzLnN1YndhbGtzLmdldChwYXJlbnQpO1xuICAgICAgICAvLyBwdXQgbWF0Y2hlcyBhbmQgZW50cnkgd2Fsa3MgaW50byB0aGUgcmVzdWx0cyBwcm9jZXNzb3JcbiAgICAgICAgY29uc3QgcmVzdWx0cyA9IHRoaXMuY2hpbGQoKTtcbiAgICAgICAgZm9yIChjb25zdCBlIG9mIGVudHJpZXMpIHtcbiAgICAgICAgICAgIGZvciAoY29uc3QgcGF0dGVybiBvZiBwYXR0ZXJucykge1xuICAgICAgICAgICAgICAgIGNvbnN0IGFic29sdXRlID0gcGF0dGVybi5pc0Fic29sdXRlKCk7XG4gICAgICAgICAgICAgICAgY29uc3QgcCA9IHBhdHRlcm4ucGF0dGVybigpO1xuICAgICAgICAgICAgICAgIGNvbnN0IHJlc3QgPSBwYXR0ZXJuLnJlc3QoKTtcbiAgICAgICAgICAgICAgICBpZiAocCA9PT0gbWluaW1hdGNoXzEuR0xPQlNUQVIpIHtcbiAgICAgICAgICAgICAgICAgICAgcmVzdWx0cy50ZXN0R2xvYnN0YXIoZSwgcGF0dGVybiwgcmVzdCwgYWJzb2x1dGUpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBlbHNlIGlmIChwIGluc3RhbmNlb2YgUmVnRXhwKSB7XG4gICAgICAgICAgICAgICAgICAgIHJlc3VsdHMudGVzdFJlZ0V4cChlLCBwLCByZXN0LCBhYnNvbHV0ZSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICByZXN1bHRzLnRlc3RTdHJpbmcoZSwgcCwgcmVzdCwgYWJzb2x1dGUpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gcmVzdWx0cztcbiAgICB9XG4gICAgdGVzdEdsb2JzdGFyKGUsIHBhdHRlcm4sIHJlc3QsIGFic29sdXRlKSB7XG4gICAgICAgIGlmICh0aGlzLmRvdCB8fCAhZS5uYW1lLnN0YXJ0c1dpdGgoJy4nKSkge1xuICAgICAgICAgICAgaWYgKCFwYXR0ZXJuLmhhc01vcmUoKSkge1xuICAgICAgICAgICAgICAgIHRoaXMubWF0Y2hlcy5hZGQoZSwgYWJzb2x1dGUsIGZhbHNlKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmIChlLmNhblJlYWRkaXIoKSkge1xuICAgICAgICAgICAgICAgIC8vIGlmIHdlJ3JlIGluIGZvbGxvdyBtb2RlIG9yIGl0J3Mgbm90IGEgc3ltbGluaywganVzdCBrZWVwXG4gICAgICAgICAgICAgICAgLy8gdGVzdGluZyB0aGUgc2FtZSBwYXR0ZXJuLiBJZiB0aGVyZSdzIG1vcmUgYWZ0ZXIgdGhlIGdsb2JzdGFyLFxuICAgICAgICAgICAgICAgIC8vIHRoZW4gdGhpcyBzeW1saW5rIGNvbnN1bWVzIHRoZSBnbG9ic3Rhci4gSWYgbm90LCB0aGVuIHdlIGNhblxuICAgICAgICAgICAgICAgIC8vIGZvbGxvdyBhdCBtb3N0IE9ORSBzeW1saW5rIGFsb25nIHRoZSB3YXksIHNvIHdlIG1hcmsgaXQsIHdoaWNoXG4gICAgICAgICAgICAgICAgLy8gYWxzbyBjaGVja3MgdG8gZW5zdXJlIHRoYXQgaXQgd2Fzbid0IGFscmVhZHkgbWFya2VkLlxuICAgICAgICAgICAgICAgIGlmICh0aGlzLmZvbGxvdyB8fCAhZS5pc1N5bWJvbGljTGluaygpKSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuc3Vid2Fsa3MuYWRkKGUsIHBhdHRlcm4pO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBlbHNlIGlmIChlLmlzU3ltYm9saWNMaW5rKCkpIHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKHJlc3QgJiYgcGF0dGVybi5jaGVja0ZvbGxvd0dsb2JzdGFyKCkpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuc3Vid2Fsa3MuYWRkKGUsIHJlc3QpO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIGVsc2UgaWYgKHBhdHRlcm4ubWFya0ZvbGxvd0dsb2JzdGFyKCkpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuc3Vid2Fsa3MuYWRkKGUsIHBhdHRlcm4pO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIC8vIGlmIHRoZSBORVhUIHRoaW5nIG1hdGNoZXMgdGhpcyBlbnRyeSwgdGhlbiBhbHNvIGFkZFxuICAgICAgICAvLyB0aGUgcmVzdC5cbiAgICAgICAgaWYgKHJlc3QpIHtcbiAgICAgICAgICAgIGNvbnN0IHJwID0gcmVzdC5wYXR0ZXJuKCk7XG4gICAgICAgICAgICBpZiAodHlwZW9mIHJwID09PSAnc3RyaW5nJyAmJlxuICAgICAgICAgICAgICAgIC8vIGRvdHMgYW5kIGVtcHR5IHdlcmUgaGFuZGxlZCBhbHJlYWR5XG4gICAgICAgICAgICAgICAgcnAgIT09ICcuLicgJiZcbiAgICAgICAgICAgICAgICBycCAhPT0gJycgJiZcbiAgICAgICAgICAgICAgICBycCAhPT0gJy4nKSB7XG4gICAgICAgICAgICAgICAgdGhpcy50ZXN0U3RyaW5nKGUsIHJwLCByZXN0LnJlc3QoKSwgYWJzb2x1dGUpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSBpZiAocnAgPT09ICcuLicpIHtcbiAgICAgICAgICAgICAgICAvKiBjOCBpZ25vcmUgc3RhcnQgKi9cbiAgICAgICAgICAgICAgICBjb25zdCBlcCA9IGUucGFyZW50IHx8IGU7XG4gICAgICAgICAgICAgICAgLyogYzggaWdub3JlIHN0b3AgKi9cbiAgICAgICAgICAgICAgICB0aGlzLnN1YndhbGtzLmFkZChlcCwgcmVzdCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIGlmIChycCBpbnN0YW5jZW9mIFJlZ0V4cCkge1xuICAgICAgICAgICAgICAgIHRoaXMudGVzdFJlZ0V4cChlLCBycCwgcmVzdC5yZXN0KCksIGFic29sdXRlKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cbiAgICB0ZXN0UmVnRXhwKGUsIHAsIHJlc3QsIGFic29sdXRlKSB7XG4gICAgICAgIGlmICghcC50ZXN0KGUubmFtZSkpXG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIGlmICghcmVzdCkge1xuICAgICAgICAgICAgdGhpcy5tYXRjaGVzLmFkZChlLCBhYnNvbHV0ZSwgZmFsc2UpO1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgdGhpcy5zdWJ3YWxrcy5hZGQoZSwgcmVzdCk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgdGVzdFN0cmluZyhlLCBwLCByZXN0LCBhYnNvbHV0ZSkge1xuICAgICAgICAvLyBzaG91bGQgbmV2ZXIgaGFwcGVuP1xuICAgICAgICBpZiAoIWUuaXNOYW1lZChwKSlcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgaWYgKCFyZXN0KSB7XG4gICAgICAgICAgICB0aGlzLm1hdGNoZXMuYWRkKGUsIGFic29sdXRlLCBmYWxzZSk7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICB0aGlzLnN1YndhbGtzLmFkZChlLCByZXN0KTtcbiAgICAgICAgfVxuICAgIH1cbn1cbmV4cG9ydHMuUHJvY2Vzc29yID0gUHJvY2Vzc29yO1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9cHJvY2Vzc29yLmpzLm1hcCIsCiAgICAiXCJ1c2Ugc3RyaWN0XCI7XG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJfX2VzTW9kdWxlXCIsIHsgdmFsdWU6IHRydWUgfSk7XG5leHBvcnRzLkdsb2JTdHJlYW0gPSBleHBvcnRzLkdsb2JXYWxrZXIgPSBleHBvcnRzLkdsb2JVdGlsID0gdm9pZCAwO1xuLyoqXG4gKiBTaW5nbGUtdXNlIHV0aWxpdHkgY2xhc3NlcyB0byBwcm92aWRlIGZ1bmN0aW9uYWxpdHkgdG8gdGhlIHtAbGluayBHbG9ifVxuICogbWV0aG9kcy5cbiAqXG4gKiBAbW9kdWxlXG4gKi9cbmNvbnN0IG1pbmlwYXNzXzEgPSByZXF1aXJlKFwibWluaXBhc3NcIik7XG5jb25zdCBpZ25vcmVfanNfMSA9IHJlcXVpcmUoXCIuL2lnbm9yZS5qc1wiKTtcbmNvbnN0IHByb2Nlc3Nvcl9qc18xID0gcmVxdWlyZShcIi4vcHJvY2Vzc29yLmpzXCIpO1xuY29uc3QgbWFrZUlnbm9yZSA9IChpZ25vcmUsIG9wdHMpID0+IHR5cGVvZiBpZ25vcmUgPT09ICdzdHJpbmcnID8gbmV3IGlnbm9yZV9qc18xLklnbm9yZShbaWdub3JlXSwgb3B0cylcbiAgICA6IEFycmF5LmlzQXJyYXkoaWdub3JlKSA/IG5ldyBpZ25vcmVfanNfMS5JZ25vcmUoaWdub3JlLCBvcHRzKVxuICAgICAgICA6IGlnbm9yZTtcbi8qKlxuICogYmFzaWMgd2Fsa2luZyB1dGlsaXRpZXMgdGhhdCBhbGwgdGhlIGdsb2Igd2Fsa2VyIHR5cGVzIHVzZVxuICovXG5jbGFzcyBHbG9iVXRpbCB7XG4gICAgcGF0aDtcbiAgICBwYXR0ZXJucztcbiAgICBvcHRzO1xuICAgIHNlZW4gPSBuZXcgU2V0KCk7XG4gICAgcGF1c2VkID0gZmFsc2U7XG4gICAgYWJvcnRlZCA9IGZhbHNlO1xuICAgICNvblJlc3VtZSA9IFtdO1xuICAgICNpZ25vcmU7XG4gICAgI3NlcDtcbiAgICBzaWduYWw7XG4gICAgbWF4RGVwdGg7XG4gICAgaW5jbHVkZUNoaWxkTWF0Y2hlcztcbiAgICBjb25zdHJ1Y3RvcihwYXR0ZXJucywgcGF0aCwgb3B0cykge1xuICAgICAgICB0aGlzLnBhdHRlcm5zID0gcGF0dGVybnM7XG4gICAgICAgIHRoaXMucGF0aCA9IHBhdGg7XG4gICAgICAgIHRoaXMub3B0cyA9IG9wdHM7XG4gICAgICAgIHRoaXMuI3NlcCA9ICFvcHRzLnBvc2l4ICYmIG9wdHMucGxhdGZvcm0gPT09ICd3aW4zMicgPyAnXFxcXCcgOiAnLyc7XG4gICAgICAgIHRoaXMuaW5jbHVkZUNoaWxkTWF0Y2hlcyA9IG9wdHMuaW5jbHVkZUNoaWxkTWF0Y2hlcyAhPT0gZmFsc2U7XG4gICAgICAgIGlmIChvcHRzLmlnbm9yZSB8fCAhdGhpcy5pbmNsdWRlQ2hpbGRNYXRjaGVzKSB7XG4gICAgICAgICAgICB0aGlzLiNpZ25vcmUgPSBtYWtlSWdub3JlKG9wdHMuaWdub3JlID8/IFtdLCBvcHRzKTtcbiAgICAgICAgICAgIGlmICghdGhpcy5pbmNsdWRlQ2hpbGRNYXRjaGVzICYmXG4gICAgICAgICAgICAgICAgdHlwZW9mIHRoaXMuI2lnbm9yZS5hZGQgIT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgICAgICAgICBjb25zdCBtID0gJ2Nhbm5vdCBpZ25vcmUgY2hpbGQgbWF0Y2hlcywgaWdub3JlIGxhY2tzIGFkZCgpIG1ldGhvZC4nO1xuICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihtKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICAvLyBpZ25vcmUsIGFsd2F5cyBzZXQgd2l0aCBtYXhEZXB0aCwgYnV0IGl0J3Mgb3B0aW9uYWwgb24gdGhlXG4gICAgICAgIC8vIEdsb2JPcHRpb25zIHR5cGVcbiAgICAgICAgLyogYzggaWdub3JlIHN0YXJ0ICovXG4gICAgICAgIHRoaXMubWF4RGVwdGggPSBvcHRzLm1heERlcHRoIHx8IEluZmluaXR5O1xuICAgICAgICAvKiBjOCBpZ25vcmUgc3RvcCAqL1xuICAgICAgICBpZiAob3B0cy5zaWduYWwpIHtcbiAgICAgICAgICAgIHRoaXMuc2lnbmFsID0gb3B0cy5zaWduYWw7XG4gICAgICAgICAgICB0aGlzLnNpZ25hbC5hZGRFdmVudExpc3RlbmVyKCdhYm9ydCcsICgpID0+IHtcbiAgICAgICAgICAgICAgICB0aGlzLiNvblJlc3VtZS5sZW5ndGggPSAwO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgI2lnbm9yZWQocGF0aCkge1xuICAgICAgICByZXR1cm4gdGhpcy5zZWVuLmhhcyhwYXRoKSB8fCAhIXRoaXMuI2lnbm9yZT8uaWdub3JlZD8uKHBhdGgpO1xuICAgIH1cbiAgICAjY2hpbGRyZW5JZ25vcmVkKHBhdGgpIHtcbiAgICAgICAgcmV0dXJuICEhdGhpcy4jaWdub3JlPy5jaGlsZHJlbklnbm9yZWQ/LihwYXRoKTtcbiAgICB9XG4gICAgLy8gYmFja3ByZXNzdXJlIG1lY2hhbmlzbVxuICAgIHBhdXNlKCkge1xuICAgICAgICB0aGlzLnBhdXNlZCA9IHRydWU7XG4gICAgfVxuICAgIHJlc3VtZSgpIHtcbiAgICAgICAgLyogYzggaWdub3JlIHN0YXJ0ICovXG4gICAgICAgIGlmICh0aGlzLnNpZ25hbD8uYWJvcnRlZClcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgLyogYzggaWdub3JlIHN0b3AgKi9cbiAgICAgICAgdGhpcy5wYXVzZWQgPSBmYWxzZTtcbiAgICAgICAgbGV0IGZuID0gdW5kZWZpbmVkO1xuICAgICAgICB3aGlsZSAoIXRoaXMucGF1c2VkICYmIChmbiA9IHRoaXMuI29uUmVzdW1lLnNoaWZ0KCkpKSB7XG4gICAgICAgICAgICBmbigpO1xuICAgICAgICB9XG4gICAgfVxuICAgIG9uUmVzdW1lKGZuKSB7XG4gICAgICAgIGlmICh0aGlzLnNpZ25hbD8uYWJvcnRlZClcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgLyogYzggaWdub3JlIHN0YXJ0ICovXG4gICAgICAgIGlmICghdGhpcy5wYXVzZWQpIHtcbiAgICAgICAgICAgIGZuKCk7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAvKiBjOCBpZ25vcmUgc3RvcCAqL1xuICAgICAgICAgICAgdGhpcy4jb25SZXN1bWUucHVzaChmbik7XG4gICAgICAgIH1cbiAgICB9XG4gICAgLy8gZG8gdGhlIHJlcXVpc2l0ZSByZWFscGF0aC9zdGF0IGNoZWNraW5nLCBhbmQgcmV0dXJuIHRoZSBwYXRoXG4gICAgLy8gdG8gYWRkIG9yIHVuZGVmaW5lZCB0byBmaWx0ZXIgaXQgb3V0LlxuICAgIGFzeW5jIG1hdGNoQ2hlY2soZSwgaWZEaXIpIHtcbiAgICAgICAgaWYgKGlmRGlyICYmIHRoaXMub3B0cy5ub2RpcilcbiAgICAgICAgICAgIHJldHVybiB1bmRlZmluZWQ7XG4gICAgICAgIGxldCBycGM7XG4gICAgICAgIGlmICh0aGlzLm9wdHMucmVhbHBhdGgpIHtcbiAgICAgICAgICAgIHJwYyA9IGUucmVhbHBhdGhDYWNoZWQoKSB8fCAoYXdhaXQgZS5yZWFscGF0aCgpKTtcbiAgICAgICAgICAgIGlmICghcnBjKVxuICAgICAgICAgICAgICAgIHJldHVybiB1bmRlZmluZWQ7XG4gICAgICAgICAgICBlID0gcnBjO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IG5lZWRTdGF0ID0gZS5pc1Vua25vd24oKSB8fCB0aGlzLm9wdHMuc3RhdDtcbiAgICAgICAgY29uc3QgcyA9IG5lZWRTdGF0ID8gYXdhaXQgZS5sc3RhdCgpIDogZTtcbiAgICAgICAgaWYgKHRoaXMub3B0cy5mb2xsb3cgJiYgdGhpcy5vcHRzLm5vZGlyICYmIHM/LmlzU3ltYm9saWNMaW5rKCkpIHtcbiAgICAgICAgICAgIGNvbnN0IHRhcmdldCA9IGF3YWl0IHMucmVhbHBhdGgoKTtcbiAgICAgICAgICAgIC8qIGM4IGlnbm9yZSBzdGFydCAqL1xuICAgICAgICAgICAgaWYgKHRhcmdldCAmJiAodGFyZ2V0LmlzVW5rbm93bigpIHx8IHRoaXMub3B0cy5zdGF0KSkge1xuICAgICAgICAgICAgICAgIGF3YWl0IHRhcmdldC5sc3RhdCgpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgLyogYzggaWdub3JlIHN0b3AgKi9cbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gdGhpcy5tYXRjaENoZWNrVGVzdChzLCBpZkRpcik7XG4gICAgfVxuICAgIG1hdGNoQ2hlY2tUZXN0KGUsIGlmRGlyKSB7XG4gICAgICAgIHJldHVybiAoZSAmJlxuICAgICAgICAgICAgKHRoaXMubWF4RGVwdGggPT09IEluZmluaXR5IHx8IGUuZGVwdGgoKSA8PSB0aGlzLm1heERlcHRoKSAmJlxuICAgICAgICAgICAgKCFpZkRpciB8fCBlLmNhblJlYWRkaXIoKSkgJiZcbiAgICAgICAgICAgICghdGhpcy5vcHRzLm5vZGlyIHx8ICFlLmlzRGlyZWN0b3J5KCkpICYmXG4gICAgICAgICAgICAoIXRoaXMub3B0cy5ub2RpciB8fFxuICAgICAgICAgICAgICAgICF0aGlzLm9wdHMuZm9sbG93IHx8XG4gICAgICAgICAgICAgICAgIWUuaXNTeW1ib2xpY0xpbmsoKSB8fFxuICAgICAgICAgICAgICAgICFlLnJlYWxwYXRoQ2FjaGVkKCk/LmlzRGlyZWN0b3J5KCkpICYmXG4gICAgICAgICAgICAhdGhpcy4jaWdub3JlZChlKSkgP1xuICAgICAgICAgICAgZVxuICAgICAgICAgICAgOiB1bmRlZmluZWQ7XG4gICAgfVxuICAgIG1hdGNoQ2hlY2tTeW5jKGUsIGlmRGlyKSB7XG4gICAgICAgIGlmIChpZkRpciAmJiB0aGlzLm9wdHMubm9kaXIpXG4gICAgICAgICAgICByZXR1cm4gdW5kZWZpbmVkO1xuICAgICAgICBsZXQgcnBjO1xuICAgICAgICBpZiAodGhpcy5vcHRzLnJlYWxwYXRoKSB7XG4gICAgICAgICAgICBycGMgPSBlLnJlYWxwYXRoQ2FjaGVkKCkgfHwgZS5yZWFscGF0aFN5bmMoKTtcbiAgICAgICAgICAgIGlmICghcnBjKVxuICAgICAgICAgICAgICAgIHJldHVybiB1bmRlZmluZWQ7XG4gICAgICAgICAgICBlID0gcnBjO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IG5lZWRTdGF0ID0gZS5pc1Vua25vd24oKSB8fCB0aGlzLm9wdHMuc3RhdDtcbiAgICAgICAgY29uc3QgcyA9IG5lZWRTdGF0ID8gZS5sc3RhdFN5bmMoKSA6IGU7XG4gICAgICAgIGlmICh0aGlzLm9wdHMuZm9sbG93ICYmIHRoaXMub3B0cy5ub2RpciAmJiBzPy5pc1N5bWJvbGljTGluaygpKSB7XG4gICAgICAgICAgICBjb25zdCB0YXJnZXQgPSBzLnJlYWxwYXRoU3luYygpO1xuICAgICAgICAgICAgaWYgKHRhcmdldCAmJiAodGFyZ2V0Py5pc1Vua25vd24oKSB8fCB0aGlzLm9wdHMuc3RhdCkpIHtcbiAgICAgICAgICAgICAgICB0YXJnZXQubHN0YXRTeW5jKCk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHRoaXMubWF0Y2hDaGVja1Rlc3QocywgaWZEaXIpO1xuICAgIH1cbiAgICBtYXRjaEZpbmlzaChlLCBhYnNvbHV0ZSkge1xuICAgICAgICBpZiAodGhpcy4jaWdub3JlZChlKSlcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgLy8gd2Uga25vdyB3ZSBoYXZlIGFuIGlnbm9yZSBpZiB0aGlzIGlzIGZhbHNlLCBidXQgVFMgZG9lc24ndFxuICAgICAgICBpZiAoIXRoaXMuaW5jbHVkZUNoaWxkTWF0Y2hlcyAmJiB0aGlzLiNpZ25vcmU/LmFkZCkge1xuICAgICAgICAgICAgY29uc3QgaWduID0gYCR7ZS5yZWxhdGl2ZVBvc2l4KCl9LyoqYDtcbiAgICAgICAgICAgIHRoaXMuI2lnbm9yZS5hZGQoaWduKTtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBhYnMgPSB0aGlzLm9wdHMuYWJzb2x1dGUgPT09IHVuZGVmaW5lZCA/IGFic29sdXRlIDogdGhpcy5vcHRzLmFic29sdXRlO1xuICAgICAgICB0aGlzLnNlZW4uYWRkKGUpO1xuICAgICAgICBjb25zdCBtYXJrID0gdGhpcy5vcHRzLm1hcmsgJiYgZS5pc0RpcmVjdG9yeSgpID8gdGhpcy4jc2VwIDogJyc7XG4gICAgICAgIC8vIG9rLCB3ZSBoYXZlIHdoYXQgd2UgbmVlZCFcbiAgICAgICAgaWYgKHRoaXMub3B0cy53aXRoRmlsZVR5cGVzKSB7XG4gICAgICAgICAgICB0aGlzLm1hdGNoRW1pdChlKTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIGlmIChhYnMpIHtcbiAgICAgICAgICAgIGNvbnN0IGFicyA9IHRoaXMub3B0cy5wb3NpeCA/IGUuZnVsbHBhdGhQb3NpeCgpIDogZS5mdWxscGF0aCgpO1xuICAgICAgICAgICAgdGhpcy5tYXRjaEVtaXQoYWJzICsgbWFyayk7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICBjb25zdCByZWwgPSB0aGlzLm9wdHMucG9zaXggPyBlLnJlbGF0aXZlUG9zaXgoKSA6IGUucmVsYXRpdmUoKTtcbiAgICAgICAgICAgIGNvbnN0IHByZSA9IHRoaXMub3B0cy5kb3RSZWxhdGl2ZSAmJiAhcmVsLnN0YXJ0c1dpdGgoJy4uJyArIHRoaXMuI3NlcCkgP1xuICAgICAgICAgICAgICAgICcuJyArIHRoaXMuI3NlcFxuICAgICAgICAgICAgICAgIDogJyc7XG4gICAgICAgICAgICB0aGlzLm1hdGNoRW1pdCghcmVsID8gJy4nICsgbWFyayA6IHByZSArIHJlbCArIG1hcmspO1xuICAgICAgICB9XG4gICAgfVxuICAgIGFzeW5jIG1hdGNoKGUsIGFic29sdXRlLCBpZkRpcikge1xuICAgICAgICBjb25zdCBwID0gYXdhaXQgdGhpcy5tYXRjaENoZWNrKGUsIGlmRGlyKTtcbiAgICAgICAgaWYgKHApXG4gICAgICAgICAgICB0aGlzLm1hdGNoRmluaXNoKHAsIGFic29sdXRlKTtcbiAgICB9XG4gICAgbWF0Y2hTeW5jKGUsIGFic29sdXRlLCBpZkRpcikge1xuICAgICAgICBjb25zdCBwID0gdGhpcy5tYXRjaENoZWNrU3luYyhlLCBpZkRpcik7XG4gICAgICAgIGlmIChwKVxuICAgICAgICAgICAgdGhpcy5tYXRjaEZpbmlzaChwLCBhYnNvbHV0ZSk7XG4gICAgfVxuICAgIHdhbGtDQih0YXJnZXQsIHBhdHRlcm5zLCBjYikge1xuICAgICAgICAvKiBjOCBpZ25vcmUgc3RhcnQgKi9cbiAgICAgICAgaWYgKHRoaXMuc2lnbmFsPy5hYm9ydGVkKVxuICAgICAgICAgICAgY2IoKTtcbiAgICAgICAgLyogYzggaWdub3JlIHN0b3AgKi9cbiAgICAgICAgdGhpcy53YWxrQ0IyKHRhcmdldCwgcGF0dGVybnMsIG5ldyBwcm9jZXNzb3JfanNfMS5Qcm9jZXNzb3IodGhpcy5vcHRzKSwgY2IpO1xuICAgIH1cbiAgICB3YWxrQ0IyKHRhcmdldCwgcGF0dGVybnMsIHByb2Nlc3NvciwgY2IpIHtcbiAgICAgICAgaWYgKHRoaXMuI2NoaWxkcmVuSWdub3JlZCh0YXJnZXQpKVxuICAgICAgICAgICAgcmV0dXJuIGNiKCk7XG4gICAgICAgIGlmICh0aGlzLnNpZ25hbD8uYWJvcnRlZClcbiAgICAgICAgICAgIGNiKCk7XG4gICAgICAgIGlmICh0aGlzLnBhdXNlZCkge1xuICAgICAgICAgICAgdGhpcy5vblJlc3VtZSgoKSA9PiB0aGlzLndhbGtDQjIodGFyZ2V0LCBwYXR0ZXJucywgcHJvY2Vzc29yLCBjYikpO1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIHByb2Nlc3Nvci5wcm9jZXNzUGF0dGVybnModGFyZ2V0LCBwYXR0ZXJucyk7XG4gICAgICAgIC8vIGRvbmUgcHJvY2Vzc2luZy4gIGFsbCBvZiB0aGUgYWJvdmUgaXMgc3luYywgY2FuIGJlIGFic3RyYWN0ZWQgb3V0LlxuICAgICAgICAvLyBzdWJ3YWxrcyBpcyBhIG1hcCBvZiBwYXRocyB0byB0aGUgZW50cnkgZmlsdGVycyB0aGV5IG5lZWRcbiAgICAgICAgLy8gbWF0Y2hlcyBpcyBhIG1hcCBvZiBwYXRocyB0byBbYWJzb2x1dGUsIGlmRGlyXSB0dXBsZXMuXG4gICAgICAgIGxldCB0YXNrcyA9IDE7XG4gICAgICAgIGNvbnN0IG5leHQgPSAoKSA9PiB7XG4gICAgICAgICAgICBpZiAoLS10YXNrcyA9PT0gMClcbiAgICAgICAgICAgICAgICBjYigpO1xuICAgICAgICB9O1xuICAgICAgICBmb3IgKGNvbnN0IFttLCBhYnNvbHV0ZSwgaWZEaXJdIG9mIHByb2Nlc3Nvci5tYXRjaGVzLmVudHJpZXMoKSkge1xuICAgICAgICAgICAgaWYgKHRoaXMuI2lnbm9yZWQobSkpXG4gICAgICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgICB0YXNrcysrO1xuICAgICAgICAgICAgdGhpcy5tYXRjaChtLCBhYnNvbHV0ZSwgaWZEaXIpLnRoZW4oKCkgPT4gbmV4dCgpKTtcbiAgICAgICAgfVxuICAgICAgICBmb3IgKGNvbnN0IHQgb2YgcHJvY2Vzc29yLnN1YndhbGtUYXJnZXRzKCkpIHtcbiAgICAgICAgICAgIGlmICh0aGlzLm1heERlcHRoICE9PSBJbmZpbml0eSAmJiB0LmRlcHRoKCkgPj0gdGhpcy5tYXhEZXB0aCkge1xuICAgICAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgdGFza3MrKztcbiAgICAgICAgICAgIGNvbnN0IGNoaWxkcmVuQ2FjaGVkID0gdC5yZWFkZGlyQ2FjaGVkKCk7XG4gICAgICAgICAgICBpZiAodC5jYWxsZWRSZWFkZGlyKCkpXG4gICAgICAgICAgICAgICAgdGhpcy53YWxrQ0IzKHQsIGNoaWxkcmVuQ2FjaGVkLCBwcm9jZXNzb3IsIG5leHQpO1xuICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgdC5yZWFkZGlyQ0IoKF8sIGVudHJpZXMpID0+IHRoaXMud2Fsa0NCMyh0LCBlbnRyaWVzLCBwcm9jZXNzb3IsIG5leHQpLCB0cnVlKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBuZXh0KCk7XG4gICAgfVxuICAgIHdhbGtDQjModGFyZ2V0LCBlbnRyaWVzLCBwcm9jZXNzb3IsIGNiKSB7XG4gICAgICAgIHByb2Nlc3NvciA9IHByb2Nlc3Nvci5maWx0ZXJFbnRyaWVzKHRhcmdldCwgZW50cmllcyk7XG4gICAgICAgIGxldCB0YXNrcyA9IDE7XG4gICAgICAgIGNvbnN0IG5leHQgPSAoKSA9PiB7XG4gICAgICAgICAgICBpZiAoLS10YXNrcyA9PT0gMClcbiAgICAgICAgICAgICAgICBjYigpO1xuICAgICAgICB9O1xuICAgICAgICBmb3IgKGNvbnN0IFttLCBhYnNvbHV0ZSwgaWZEaXJdIG9mIHByb2Nlc3Nvci5tYXRjaGVzLmVudHJpZXMoKSkge1xuICAgICAgICAgICAgaWYgKHRoaXMuI2lnbm9yZWQobSkpXG4gICAgICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgICB0YXNrcysrO1xuICAgICAgICAgICAgdGhpcy5tYXRjaChtLCBhYnNvbHV0ZSwgaWZEaXIpLnRoZW4oKCkgPT4gbmV4dCgpKTtcbiAgICAgICAgfVxuICAgICAgICBmb3IgKGNvbnN0IFt0YXJnZXQsIHBhdHRlcm5zXSBvZiBwcm9jZXNzb3Iuc3Vid2Fsa3MuZW50cmllcygpKSB7XG4gICAgICAgICAgICB0YXNrcysrO1xuICAgICAgICAgICAgdGhpcy53YWxrQ0IyKHRhcmdldCwgcGF0dGVybnMsIHByb2Nlc3Nvci5jaGlsZCgpLCBuZXh0KTtcbiAgICAgICAgfVxuICAgICAgICBuZXh0KCk7XG4gICAgfVxuICAgIHdhbGtDQlN5bmModGFyZ2V0LCBwYXR0ZXJucywgY2IpIHtcbiAgICAgICAgLyogYzggaWdub3JlIHN0YXJ0ICovXG4gICAgICAgIGlmICh0aGlzLnNpZ25hbD8uYWJvcnRlZClcbiAgICAgICAgICAgIGNiKCk7XG4gICAgICAgIC8qIGM4IGlnbm9yZSBzdG9wICovXG4gICAgICAgIHRoaXMud2Fsa0NCMlN5bmModGFyZ2V0LCBwYXR0ZXJucywgbmV3IHByb2Nlc3Nvcl9qc18xLlByb2Nlc3Nvcih0aGlzLm9wdHMpLCBjYik7XG4gICAgfVxuICAgIHdhbGtDQjJTeW5jKHRhcmdldCwgcGF0dGVybnMsIHByb2Nlc3NvciwgY2IpIHtcbiAgICAgICAgaWYgKHRoaXMuI2NoaWxkcmVuSWdub3JlZCh0YXJnZXQpKVxuICAgICAgICAgICAgcmV0dXJuIGNiKCk7XG4gICAgICAgIGlmICh0aGlzLnNpZ25hbD8uYWJvcnRlZClcbiAgICAgICAgICAgIGNiKCk7XG4gICAgICAgIGlmICh0aGlzLnBhdXNlZCkge1xuICAgICAgICAgICAgdGhpcy5vblJlc3VtZSgoKSA9PiB0aGlzLndhbGtDQjJTeW5jKHRhcmdldCwgcGF0dGVybnMsIHByb2Nlc3NvciwgY2IpKTtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICBwcm9jZXNzb3IucHJvY2Vzc1BhdHRlcm5zKHRhcmdldCwgcGF0dGVybnMpO1xuICAgICAgICAvLyBkb25lIHByb2Nlc3NpbmcuICBhbGwgb2YgdGhlIGFib3ZlIGlzIHN5bmMsIGNhbiBiZSBhYnN0cmFjdGVkIG91dC5cbiAgICAgICAgLy8gc3Vid2Fsa3MgaXMgYSBtYXAgb2YgcGF0aHMgdG8gdGhlIGVudHJ5IGZpbHRlcnMgdGhleSBuZWVkXG4gICAgICAgIC8vIG1hdGNoZXMgaXMgYSBtYXAgb2YgcGF0aHMgdG8gW2Fic29sdXRlLCBpZkRpcl0gdHVwbGVzLlxuICAgICAgICBsZXQgdGFza3MgPSAxO1xuICAgICAgICBjb25zdCBuZXh0ID0gKCkgPT4ge1xuICAgICAgICAgICAgaWYgKC0tdGFza3MgPT09IDApXG4gICAgICAgICAgICAgICAgY2IoKTtcbiAgICAgICAgfTtcbiAgICAgICAgZm9yIChjb25zdCBbbSwgYWJzb2x1dGUsIGlmRGlyXSBvZiBwcm9jZXNzb3IubWF0Y2hlcy5lbnRyaWVzKCkpIHtcbiAgICAgICAgICAgIGlmICh0aGlzLiNpZ25vcmVkKG0pKVxuICAgICAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgICAgdGhpcy5tYXRjaFN5bmMobSwgYWJzb2x1dGUsIGlmRGlyKTtcbiAgICAgICAgfVxuICAgICAgICBmb3IgKGNvbnN0IHQgb2YgcHJvY2Vzc29yLnN1YndhbGtUYXJnZXRzKCkpIHtcbiAgICAgICAgICAgIGlmICh0aGlzLm1heERlcHRoICE9PSBJbmZpbml0eSAmJiB0LmRlcHRoKCkgPj0gdGhpcy5tYXhEZXB0aCkge1xuICAgICAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgdGFza3MrKztcbiAgICAgICAgICAgIGNvbnN0IGNoaWxkcmVuID0gdC5yZWFkZGlyU3luYygpO1xuICAgICAgICAgICAgdGhpcy53YWxrQ0IzU3luYyh0LCBjaGlsZHJlbiwgcHJvY2Vzc29yLCBuZXh0KTtcbiAgICAgICAgfVxuICAgICAgICBuZXh0KCk7XG4gICAgfVxuICAgIHdhbGtDQjNTeW5jKHRhcmdldCwgZW50cmllcywgcHJvY2Vzc29yLCBjYikge1xuICAgICAgICBwcm9jZXNzb3IgPSBwcm9jZXNzb3IuZmlsdGVyRW50cmllcyh0YXJnZXQsIGVudHJpZXMpO1xuICAgICAgICBsZXQgdGFza3MgPSAxO1xuICAgICAgICBjb25zdCBuZXh0ID0gKCkgPT4ge1xuICAgICAgICAgICAgaWYgKC0tdGFza3MgPT09IDApXG4gICAgICAgICAgICAgICAgY2IoKTtcbiAgICAgICAgfTtcbiAgICAgICAgZm9yIChjb25zdCBbbSwgYWJzb2x1dGUsIGlmRGlyXSBvZiBwcm9jZXNzb3IubWF0Y2hlcy5lbnRyaWVzKCkpIHtcbiAgICAgICAgICAgIGlmICh0aGlzLiNpZ25vcmVkKG0pKVxuICAgICAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgICAgdGhpcy5tYXRjaFN5bmMobSwgYWJzb2x1dGUsIGlmRGlyKTtcbiAgICAgICAgfVxuICAgICAgICBmb3IgKGNvbnN0IFt0YXJnZXQsIHBhdHRlcm5zXSBvZiBwcm9jZXNzb3Iuc3Vid2Fsa3MuZW50cmllcygpKSB7XG4gICAgICAgICAgICB0YXNrcysrO1xuICAgICAgICAgICAgdGhpcy53YWxrQ0IyU3luYyh0YXJnZXQsIHBhdHRlcm5zLCBwcm9jZXNzb3IuY2hpbGQoKSwgbmV4dCk7XG4gICAgICAgIH1cbiAgICAgICAgbmV4dCgpO1xuICAgIH1cbn1cbmV4cG9ydHMuR2xvYlV0aWwgPSBHbG9iVXRpbDtcbmNsYXNzIEdsb2JXYWxrZXIgZXh0ZW5kcyBHbG9iVXRpbCB7XG4gICAgbWF0Y2hlcyA9IG5ldyBTZXQoKTtcbiAgICBjb25zdHJ1Y3RvcihwYXR0ZXJucywgcGF0aCwgb3B0cykge1xuICAgICAgICBzdXBlcihwYXR0ZXJucywgcGF0aCwgb3B0cyk7XG4gICAgfVxuICAgIG1hdGNoRW1pdChlKSB7XG4gICAgICAgIHRoaXMubWF0Y2hlcy5hZGQoZSk7XG4gICAgfVxuICAgIGFzeW5jIHdhbGsoKSB7XG4gICAgICAgIGlmICh0aGlzLnNpZ25hbD8uYWJvcnRlZClcbiAgICAgICAgICAgIHRocm93IHRoaXMuc2lnbmFsLnJlYXNvbjtcbiAgICAgICAgaWYgKHRoaXMucGF0aC5pc1Vua25vd24oKSkge1xuICAgICAgICAgICAgYXdhaXQgdGhpcy5wYXRoLmxzdGF0KCk7XG4gICAgICAgIH1cbiAgICAgICAgYXdhaXQgbmV3IFByb21pc2UoKHJlcywgcmVqKSA9PiB7XG4gICAgICAgICAgICB0aGlzLndhbGtDQih0aGlzLnBhdGgsIHRoaXMucGF0dGVybnMsICgpID0+IHtcbiAgICAgICAgICAgICAgICBpZiAodGhpcy5zaWduYWw/LmFib3J0ZWQpIHtcbiAgICAgICAgICAgICAgICAgICAgcmVqKHRoaXMuc2lnbmFsLnJlYXNvbik7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICByZXModGhpcy5tYXRjaGVzKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfSk7XG4gICAgICAgIHJldHVybiB0aGlzLm1hdGNoZXM7XG4gICAgfVxuICAgIHdhbGtTeW5jKCkge1xuICAgICAgICBpZiAodGhpcy5zaWduYWw/LmFib3J0ZWQpXG4gICAgICAgICAgICB0aHJvdyB0aGlzLnNpZ25hbC5yZWFzb247XG4gICAgICAgIGlmICh0aGlzLnBhdGguaXNVbmtub3duKCkpIHtcbiAgICAgICAgICAgIHRoaXMucGF0aC5sc3RhdFN5bmMoKTtcbiAgICAgICAgfVxuICAgICAgICAvLyBub3RoaW5nIGZvciB0aGUgY2FsbGJhY2sgdG8gZG8sIGJlY2F1c2UgdGhpcyBuZXZlciBwYXVzZXNcbiAgICAgICAgdGhpcy53YWxrQ0JTeW5jKHRoaXMucGF0aCwgdGhpcy5wYXR0ZXJucywgKCkgPT4ge1xuICAgICAgICAgICAgaWYgKHRoaXMuc2lnbmFsPy5hYm9ydGVkKVxuICAgICAgICAgICAgICAgIHRocm93IHRoaXMuc2lnbmFsLnJlYXNvbjtcbiAgICAgICAgfSk7XG4gICAgICAgIHJldHVybiB0aGlzLm1hdGNoZXM7XG4gICAgfVxufVxuZXhwb3J0cy5HbG9iV2Fsa2VyID0gR2xvYldhbGtlcjtcbmNsYXNzIEdsb2JTdHJlYW0gZXh0ZW5kcyBHbG9iVXRpbCB7XG4gICAgcmVzdWx0cztcbiAgICBjb25zdHJ1Y3RvcihwYXR0ZXJucywgcGF0aCwgb3B0cykge1xuICAgICAgICBzdXBlcihwYXR0ZXJucywgcGF0aCwgb3B0cyk7XG4gICAgICAgIHRoaXMucmVzdWx0cyA9IG5ldyBtaW5pcGFzc18xLk1pbmlwYXNzKHtcbiAgICAgICAgICAgIHNpZ25hbDogdGhpcy5zaWduYWwsXG4gICAgICAgICAgICBvYmplY3RNb2RlOiB0cnVlLFxuICAgICAgICB9KTtcbiAgICAgICAgdGhpcy5yZXN1bHRzLm9uKCdkcmFpbicsICgpID0+IHRoaXMucmVzdW1lKCkpO1xuICAgICAgICB0aGlzLnJlc3VsdHMub24oJ3Jlc3VtZScsICgpID0+IHRoaXMucmVzdW1lKCkpO1xuICAgIH1cbiAgICBtYXRjaEVtaXQoZSkge1xuICAgICAgICB0aGlzLnJlc3VsdHMud3JpdGUoZSk7XG4gICAgICAgIGlmICghdGhpcy5yZXN1bHRzLmZsb3dpbmcpXG4gICAgICAgICAgICB0aGlzLnBhdXNlKCk7XG4gICAgfVxuICAgIHN0cmVhbSgpIHtcbiAgICAgICAgY29uc3QgdGFyZ2V0ID0gdGhpcy5wYXRoO1xuICAgICAgICBpZiAodGFyZ2V0LmlzVW5rbm93bigpKSB7XG4gICAgICAgICAgICB0YXJnZXQubHN0YXQoKS50aGVuKCgpID0+IHtcbiAgICAgICAgICAgICAgICB0aGlzLndhbGtDQih0YXJnZXQsIHRoaXMucGF0dGVybnMsICgpID0+IHRoaXMucmVzdWx0cy5lbmQoKSk7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIHRoaXMud2Fsa0NCKHRhcmdldCwgdGhpcy5wYXR0ZXJucywgKCkgPT4gdGhpcy5yZXN1bHRzLmVuZCgpKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gdGhpcy5yZXN1bHRzO1xuICAgIH1cbiAgICBzdHJlYW1TeW5jKCkge1xuICAgICAgICBpZiAodGhpcy5wYXRoLmlzVW5rbm93bigpKSB7XG4gICAgICAgICAgICB0aGlzLnBhdGgubHN0YXRTeW5jKCk7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy53YWxrQ0JTeW5jKHRoaXMucGF0aCwgdGhpcy5wYXR0ZXJucywgKCkgPT4gdGhpcy5yZXN1bHRzLmVuZCgpKTtcbiAgICAgICAgcmV0dXJuIHRoaXMucmVzdWx0cztcbiAgICB9XG59XG5leHBvcnRzLkdsb2JTdHJlYW0gPSBHbG9iU3RyZWFtO1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9d2Fsa2VyLmpzLm1hcCIsCiAgICAiXCJ1c2Ugc3RyaWN0XCI7XG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJfX2VzTW9kdWxlXCIsIHsgdmFsdWU6IHRydWUgfSk7XG5leHBvcnRzLkdsb2IgPSB2b2lkIDA7XG5jb25zdCBtaW5pbWF0Y2hfMSA9IHJlcXVpcmUoXCJtaW5pbWF0Y2hcIik7XG5jb25zdCBub2RlX3VybF8xID0gcmVxdWlyZShcIm5vZGU6dXJsXCIpO1xuY29uc3QgcGF0aF9zY3VycnlfMSA9IHJlcXVpcmUoXCJwYXRoLXNjdXJyeVwiKTtcbmNvbnN0IHBhdHRlcm5fanNfMSA9IHJlcXVpcmUoXCIuL3BhdHRlcm4uanNcIik7XG5jb25zdCB3YWxrZXJfanNfMSA9IHJlcXVpcmUoXCIuL3dhbGtlci5qc1wiKTtcbi8vIGlmIG5vIHByb2Nlc3MgZ2xvYmFsLCBqdXN0IGNhbGwgaXQgbGludXguXG4vLyBzbyB3ZSBkZWZhdWx0IHRvIGNhc2Utc2Vuc2l0aXZlLCAvIHNlcGFyYXRvcnNcbmNvbnN0IGRlZmF1bHRQbGF0Zm9ybSA9ICh0eXBlb2YgcHJvY2VzcyA9PT0gJ29iamVjdCcgJiZcbiAgICBwcm9jZXNzICYmXG4gICAgdHlwZW9mIHByb2Nlc3MucGxhdGZvcm0gPT09ICdzdHJpbmcnKSA/XG4gICAgcHJvY2Vzcy5wbGF0Zm9ybVxuICAgIDogJ2xpbnV4Jztcbi8qKlxuICogQW4gb2JqZWN0IHRoYXQgY2FuIHBlcmZvcm0gZ2xvYiBwYXR0ZXJuIHRyYXZlcnNhbHMuXG4gKi9cbmNsYXNzIEdsb2Ige1xuICAgIGFic29sdXRlO1xuICAgIGN3ZDtcbiAgICByb290O1xuICAgIGRvdDtcbiAgICBkb3RSZWxhdGl2ZTtcbiAgICBmb2xsb3c7XG4gICAgaWdub3JlO1xuICAgIG1hZ2ljYWxCcmFjZXM7XG4gICAgbWFyaztcbiAgICBtYXRjaEJhc2U7XG4gICAgbWF4RGVwdGg7XG4gICAgbm9icmFjZTtcbiAgICBub2Nhc2U7XG4gICAgbm9kaXI7XG4gICAgbm9leHQ7XG4gICAgbm9nbG9ic3RhcjtcbiAgICBwYXR0ZXJuO1xuICAgIHBsYXRmb3JtO1xuICAgIHJlYWxwYXRoO1xuICAgIHNjdXJyeTtcbiAgICBzdGF0O1xuICAgIHNpZ25hbDtcbiAgICB3aW5kb3dzUGF0aHNOb0VzY2FwZTtcbiAgICB3aXRoRmlsZVR5cGVzO1xuICAgIGluY2x1ZGVDaGlsZE1hdGNoZXM7XG4gICAgLyoqXG4gICAgICogVGhlIG9wdGlvbnMgcHJvdmlkZWQgdG8gdGhlIGNvbnN0cnVjdG9yLlxuICAgICAqL1xuICAgIG9wdHM7XG4gICAgLyoqXG4gICAgICogQW4gYXJyYXkgb2YgcGFyc2VkIGltbXV0YWJsZSB7QGxpbmsgUGF0dGVybn0gb2JqZWN0cy5cbiAgICAgKi9cbiAgICBwYXR0ZXJucztcbiAgICAvKipcbiAgICAgKiBBbGwgb3B0aW9ucyBhcmUgc3RvcmVkIGFzIHByb3BlcnRpZXMgb24gdGhlIGBHbG9iYCBvYmplY3QuXG4gICAgICpcbiAgICAgKiBTZWUge0BsaW5rIEdsb2JPcHRpb25zfSBmb3IgZnVsbCBvcHRpb25zIGRlc2NyaXB0aW9ucy5cbiAgICAgKlxuICAgICAqIE5vdGUgdGhhdCBhIHByZXZpb3VzIGBHbG9iYCBvYmplY3QgY2FuIGJlIHBhc3NlZCBhcyB0aGVcbiAgICAgKiBgR2xvYk9wdGlvbnNgIHRvIGFub3RoZXIgYEdsb2JgIGluc3RhbnRpYXRpb24gdG8gcmUtdXNlIHNldHRpbmdzXG4gICAgICogYW5kIGNhY2hlcyB3aXRoIGEgbmV3IHBhdHRlcm4uXG4gICAgICpcbiAgICAgKiBUcmF2ZXJzYWwgZnVuY3Rpb25zIGNhbiBiZSBjYWxsZWQgbXVsdGlwbGUgdGltZXMgdG8gcnVuIHRoZSB3YWxrXG4gICAgICogYWdhaW4uXG4gICAgICovXG4gICAgY29uc3RydWN0b3IocGF0dGVybiwgb3B0cykge1xuICAgICAgICAvKiBjOCBpZ25vcmUgc3RhcnQgKi9cbiAgICAgICAgaWYgKCFvcHRzKVxuICAgICAgICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcignZ2xvYiBvcHRpb25zIHJlcXVpcmVkJyk7XG4gICAgICAgIC8qIGM4IGlnbm9yZSBzdG9wICovXG4gICAgICAgIHRoaXMud2l0aEZpbGVUeXBlcyA9ICEhb3B0cy53aXRoRmlsZVR5cGVzO1xuICAgICAgICB0aGlzLnNpZ25hbCA9IG9wdHMuc2lnbmFsO1xuICAgICAgICB0aGlzLmZvbGxvdyA9ICEhb3B0cy5mb2xsb3c7XG4gICAgICAgIHRoaXMuZG90ID0gISFvcHRzLmRvdDtcbiAgICAgICAgdGhpcy5kb3RSZWxhdGl2ZSA9ICEhb3B0cy5kb3RSZWxhdGl2ZTtcbiAgICAgICAgdGhpcy5ub2RpciA9ICEhb3B0cy5ub2RpcjtcbiAgICAgICAgdGhpcy5tYXJrID0gISFvcHRzLm1hcms7XG4gICAgICAgIGlmICghb3B0cy5jd2QpIHtcbiAgICAgICAgICAgIHRoaXMuY3dkID0gJyc7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSBpZiAob3B0cy5jd2QgaW5zdGFuY2VvZiBVUkwgfHwgb3B0cy5jd2Quc3RhcnRzV2l0aCgnZmlsZTovLycpKSB7XG4gICAgICAgICAgICBvcHRzLmN3ZCA9ICgwLCBub2RlX3VybF8xLmZpbGVVUkxUb1BhdGgpKG9wdHMuY3dkKTtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLmN3ZCA9IG9wdHMuY3dkIHx8ICcnO1xuICAgICAgICB0aGlzLnJvb3QgPSBvcHRzLnJvb3Q7XG4gICAgICAgIHRoaXMubWFnaWNhbEJyYWNlcyA9ICEhb3B0cy5tYWdpY2FsQnJhY2VzO1xuICAgICAgICB0aGlzLm5vYnJhY2UgPSAhIW9wdHMubm9icmFjZTtcbiAgICAgICAgdGhpcy5ub2V4dCA9ICEhb3B0cy5ub2V4dDtcbiAgICAgICAgdGhpcy5yZWFscGF0aCA9ICEhb3B0cy5yZWFscGF0aDtcbiAgICAgICAgdGhpcy5hYnNvbHV0ZSA9IG9wdHMuYWJzb2x1dGU7XG4gICAgICAgIHRoaXMuaW5jbHVkZUNoaWxkTWF0Y2hlcyA9IG9wdHMuaW5jbHVkZUNoaWxkTWF0Y2hlcyAhPT0gZmFsc2U7XG4gICAgICAgIHRoaXMubm9nbG9ic3RhciA9ICEhb3B0cy5ub2dsb2JzdGFyO1xuICAgICAgICB0aGlzLm1hdGNoQmFzZSA9ICEhb3B0cy5tYXRjaEJhc2U7XG4gICAgICAgIHRoaXMubWF4RGVwdGggPVxuICAgICAgICAgICAgdHlwZW9mIG9wdHMubWF4RGVwdGggPT09ICdudW1iZXInID8gb3B0cy5tYXhEZXB0aCA6IEluZmluaXR5O1xuICAgICAgICB0aGlzLnN0YXQgPSAhIW9wdHMuc3RhdDtcbiAgICAgICAgdGhpcy5pZ25vcmUgPSBvcHRzLmlnbm9yZTtcbiAgICAgICAgaWYgKHRoaXMud2l0aEZpbGVUeXBlcyAmJiB0aGlzLmFic29sdXRlICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcignY2Fubm90IHNldCBhYnNvbHV0ZSBhbmQgd2l0aEZpbGVUeXBlczp0cnVlJyk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHR5cGVvZiBwYXR0ZXJuID09PSAnc3RyaW5nJykge1xuICAgICAgICAgICAgcGF0dGVybiA9IFtwYXR0ZXJuXTtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLndpbmRvd3NQYXRoc05vRXNjYXBlID1cbiAgICAgICAgICAgICEhb3B0cy53aW5kb3dzUGF0aHNOb0VzY2FwZSB8fFxuICAgICAgICAgICAgICAgIG9wdHMuYWxsb3dXaW5kb3dzRXNjYXBlID09PVxuICAgICAgICAgICAgICAgICAgICBmYWxzZTtcbiAgICAgICAgaWYgKHRoaXMud2luZG93c1BhdGhzTm9Fc2NhcGUpIHtcbiAgICAgICAgICAgIHBhdHRlcm4gPSBwYXR0ZXJuLm1hcChwID0+IHAucmVwbGFjZSgvXFxcXC9nLCAnLycpKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAodGhpcy5tYXRjaEJhc2UpIHtcbiAgICAgICAgICAgIGlmIChvcHRzLm5vZ2xvYnN0YXIpIHtcbiAgICAgICAgICAgICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCdiYXNlIG1hdGNoaW5nIHJlcXVpcmVzIGdsb2JzdGFyJyk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBwYXR0ZXJuID0gcGF0dGVybi5tYXAocCA9PiAocC5pbmNsdWRlcygnLycpID8gcCA6IGAuLyoqLyR7cH1gKSk7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5wYXR0ZXJuID0gcGF0dGVybjtcbiAgICAgICAgdGhpcy5wbGF0Zm9ybSA9IG9wdHMucGxhdGZvcm0gfHwgZGVmYXVsdFBsYXRmb3JtO1xuICAgICAgICB0aGlzLm9wdHMgPSB7IC4uLm9wdHMsIHBsYXRmb3JtOiB0aGlzLnBsYXRmb3JtIH07XG4gICAgICAgIGlmIChvcHRzLnNjdXJyeSkge1xuICAgICAgICAgICAgdGhpcy5zY3VycnkgPSBvcHRzLnNjdXJyeTtcbiAgICAgICAgICAgIGlmIChvcHRzLm5vY2FzZSAhPT0gdW5kZWZpbmVkICYmXG4gICAgICAgICAgICAgICAgb3B0cy5ub2Nhc2UgIT09IG9wdHMuc2N1cnJ5Lm5vY2FzZSkge1xuICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcignbm9jYXNlIG9wdGlvbiBjb250cmFkaWN0cyBwcm92aWRlZCBzY3Vycnkgb3B0aW9uJyk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICBjb25zdCBTY3VycnkgPSBvcHRzLnBsYXRmb3JtID09PSAnd2luMzInID8gcGF0aF9zY3VycnlfMS5QYXRoU2N1cnJ5V2luMzJcbiAgICAgICAgICAgICAgICA6IG9wdHMucGxhdGZvcm0gPT09ICdkYXJ3aW4nID8gcGF0aF9zY3VycnlfMS5QYXRoU2N1cnJ5RGFyd2luXG4gICAgICAgICAgICAgICAgICAgIDogb3B0cy5wbGF0Zm9ybSA/IHBhdGhfc2N1cnJ5XzEuUGF0aFNjdXJyeVBvc2l4XG4gICAgICAgICAgICAgICAgICAgICAgICA6IHBhdGhfc2N1cnJ5XzEuUGF0aFNjdXJyeTtcbiAgICAgICAgICAgIHRoaXMuc2N1cnJ5ID0gbmV3IFNjdXJyeSh0aGlzLmN3ZCwge1xuICAgICAgICAgICAgICAgIG5vY2FzZTogb3B0cy5ub2Nhc2UsXG4gICAgICAgICAgICAgICAgZnM6IG9wdHMuZnMsXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLm5vY2FzZSA9IHRoaXMuc2N1cnJ5Lm5vY2FzZTtcbiAgICAgICAgLy8gSWYgeW91IGRvIG5vY2FzZTp0cnVlIG9uIGEgY2FzZS1zZW5zaXRpdmUgZmlsZSBzeXN0ZW0sIHRoZW5cbiAgICAgICAgLy8gd2UgbmVlZCB0byB1c2UgcmVnZXhwcyBpbnN0ZWFkIG9mIHN0cmluZ3MgZm9yIG5vbi1tYWdpY1xuICAgICAgICAvLyBwYXRoIHBvcnRpb25zLCBiZWNhdXNlIHN0YXR0aW5nIGBhQmNgIHdvbid0IHJldHVybiByZXN1bHRzXG4gICAgICAgIC8vIGZvciB0aGUgZmlsZSBgQWJDYCBmb3IgZXhhbXBsZS5cbiAgICAgICAgY29uc3Qgbm9jYXNlTWFnaWNPbmx5ID0gdGhpcy5wbGF0Zm9ybSA9PT0gJ2RhcndpbicgfHwgdGhpcy5wbGF0Zm9ybSA9PT0gJ3dpbjMyJztcbiAgICAgICAgY29uc3QgbW1vID0ge1xuICAgICAgICAgICAgLy8gZGVmYXVsdCBub2Nhc2UgYmFzZWQgb24gcGxhdGZvcm1cbiAgICAgICAgICAgIC4uLm9wdHMsXG4gICAgICAgICAgICBkb3Q6IHRoaXMuZG90LFxuICAgICAgICAgICAgbWF0Y2hCYXNlOiB0aGlzLm1hdGNoQmFzZSxcbiAgICAgICAgICAgIG5vYnJhY2U6IHRoaXMubm9icmFjZSxcbiAgICAgICAgICAgIG5vY2FzZTogdGhpcy5ub2Nhc2UsXG4gICAgICAgICAgICBub2Nhc2VNYWdpY09ubHksXG4gICAgICAgICAgICBub2NvbW1lbnQ6IHRydWUsXG4gICAgICAgICAgICBub2V4dDogdGhpcy5ub2V4dCxcbiAgICAgICAgICAgIG5vbmVnYXRlOiB0cnVlLFxuICAgICAgICAgICAgb3B0aW1pemF0aW9uTGV2ZWw6IDIsXG4gICAgICAgICAgICBwbGF0Zm9ybTogdGhpcy5wbGF0Zm9ybSxcbiAgICAgICAgICAgIHdpbmRvd3NQYXRoc05vRXNjYXBlOiB0aGlzLndpbmRvd3NQYXRoc05vRXNjYXBlLFxuICAgICAgICAgICAgZGVidWc6ICEhdGhpcy5vcHRzLmRlYnVnLFxuICAgICAgICB9O1xuICAgICAgICBjb25zdCBtbXMgPSB0aGlzLnBhdHRlcm4ubWFwKHAgPT4gbmV3IG1pbmltYXRjaF8xLk1pbmltYXRjaChwLCBtbW8pKTtcbiAgICAgICAgY29uc3QgW21hdGNoU2V0LCBnbG9iUGFydHNdID0gbW1zLnJlZHVjZSgoc2V0LCBtKSA9PiB7XG4gICAgICAgICAgICBzZXRbMF0ucHVzaCguLi5tLnNldCk7XG4gICAgICAgICAgICBzZXRbMV0ucHVzaCguLi5tLmdsb2JQYXJ0cyk7XG4gICAgICAgICAgICByZXR1cm4gc2V0O1xuICAgICAgICB9LCBbW10sIFtdXSk7XG4gICAgICAgIHRoaXMucGF0dGVybnMgPSBtYXRjaFNldC5tYXAoKHNldCwgaSkgPT4ge1xuICAgICAgICAgICAgY29uc3QgZyA9IGdsb2JQYXJ0c1tpXTtcbiAgICAgICAgICAgIC8qIGM4IGlnbm9yZSBzdGFydCAqL1xuICAgICAgICAgICAgaWYgKCFnKVxuICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcignaW52YWxpZCBwYXR0ZXJuIG9iamVjdCcpO1xuICAgICAgICAgICAgLyogYzggaWdub3JlIHN0b3AgKi9cbiAgICAgICAgICAgIHJldHVybiBuZXcgcGF0dGVybl9qc18xLlBhdHRlcm4oc2V0LCBnLCAwLCB0aGlzLnBsYXRmb3JtKTtcbiAgICAgICAgfSk7XG4gICAgfVxuICAgIGFzeW5jIHdhbGsoKSB7XG4gICAgICAgIC8vIFdhbGtlcnMgYWx3YXlzIHJldHVybiBhcnJheSBvZiBQYXRoIG9iamVjdHMsIHNvIHdlIGp1c3QgaGF2ZSB0b1xuICAgICAgICAvLyBjb2VyY2UgdGhlbSBpbnRvIHRoZSByaWdodCBzaGFwZS4gIEl0IHdpbGwgaGF2ZSBhbHJlYWR5IGNhbGxlZFxuICAgICAgICAvLyByZWFscGF0aCgpIGlmIHRoZSBvcHRpb24gd2FzIHNldCB0byBkbyBzbywgc28gd2Uga25vdyB0aGF0J3MgY2FjaGVkLlxuICAgICAgICAvLyBzdGFydCBvdXQga25vd2luZyB0aGUgY3dkLCBhdCBsZWFzdFxuICAgICAgICByZXR1cm4gW1xuICAgICAgICAgICAgLi4uKGF3YWl0IG5ldyB3YWxrZXJfanNfMS5HbG9iV2Fsa2VyKHRoaXMucGF0dGVybnMsIHRoaXMuc2N1cnJ5LmN3ZCwge1xuICAgICAgICAgICAgICAgIC4uLnRoaXMub3B0cyxcbiAgICAgICAgICAgICAgICBtYXhEZXB0aDogdGhpcy5tYXhEZXB0aCAhPT0gSW5maW5pdHkgP1xuICAgICAgICAgICAgICAgICAgICB0aGlzLm1heERlcHRoICsgdGhpcy5zY3VycnkuY3dkLmRlcHRoKClcbiAgICAgICAgICAgICAgICAgICAgOiBJbmZpbml0eSxcbiAgICAgICAgICAgICAgICBwbGF0Zm9ybTogdGhpcy5wbGF0Zm9ybSxcbiAgICAgICAgICAgICAgICBub2Nhc2U6IHRoaXMubm9jYXNlLFxuICAgICAgICAgICAgICAgIGluY2x1ZGVDaGlsZE1hdGNoZXM6IHRoaXMuaW5jbHVkZUNoaWxkTWF0Y2hlcyxcbiAgICAgICAgICAgIH0pLndhbGsoKSksXG4gICAgICAgIF07XG4gICAgfVxuICAgIHdhbGtTeW5jKCkge1xuICAgICAgICByZXR1cm4gW1xuICAgICAgICAgICAgLi4ubmV3IHdhbGtlcl9qc18xLkdsb2JXYWxrZXIodGhpcy5wYXR0ZXJucywgdGhpcy5zY3VycnkuY3dkLCB7XG4gICAgICAgICAgICAgICAgLi4udGhpcy5vcHRzLFxuICAgICAgICAgICAgICAgIG1heERlcHRoOiB0aGlzLm1heERlcHRoICE9PSBJbmZpbml0eSA/XG4gICAgICAgICAgICAgICAgICAgIHRoaXMubWF4RGVwdGggKyB0aGlzLnNjdXJyeS5jd2QuZGVwdGgoKVxuICAgICAgICAgICAgICAgICAgICA6IEluZmluaXR5LFxuICAgICAgICAgICAgICAgIHBsYXRmb3JtOiB0aGlzLnBsYXRmb3JtLFxuICAgICAgICAgICAgICAgIG5vY2FzZTogdGhpcy5ub2Nhc2UsXG4gICAgICAgICAgICAgICAgaW5jbHVkZUNoaWxkTWF0Y2hlczogdGhpcy5pbmNsdWRlQ2hpbGRNYXRjaGVzLFxuICAgICAgICAgICAgfSkud2Fsa1N5bmMoKSxcbiAgICAgICAgXTtcbiAgICB9XG4gICAgc3RyZWFtKCkge1xuICAgICAgICByZXR1cm4gbmV3IHdhbGtlcl9qc18xLkdsb2JTdHJlYW0odGhpcy5wYXR0ZXJucywgdGhpcy5zY3VycnkuY3dkLCB7XG4gICAgICAgICAgICAuLi50aGlzLm9wdHMsXG4gICAgICAgICAgICBtYXhEZXB0aDogdGhpcy5tYXhEZXB0aCAhPT0gSW5maW5pdHkgP1xuICAgICAgICAgICAgICAgIHRoaXMubWF4RGVwdGggKyB0aGlzLnNjdXJyeS5jd2QuZGVwdGgoKVxuICAgICAgICAgICAgICAgIDogSW5maW5pdHksXG4gICAgICAgICAgICBwbGF0Zm9ybTogdGhpcy5wbGF0Zm9ybSxcbiAgICAgICAgICAgIG5vY2FzZTogdGhpcy5ub2Nhc2UsXG4gICAgICAgICAgICBpbmNsdWRlQ2hpbGRNYXRjaGVzOiB0aGlzLmluY2x1ZGVDaGlsZE1hdGNoZXMsXG4gICAgICAgIH0pLnN0cmVhbSgpO1xuICAgIH1cbiAgICBzdHJlYW1TeW5jKCkge1xuICAgICAgICByZXR1cm4gbmV3IHdhbGtlcl9qc18xLkdsb2JTdHJlYW0odGhpcy5wYXR0ZXJucywgdGhpcy5zY3VycnkuY3dkLCB7XG4gICAgICAgICAgICAuLi50aGlzLm9wdHMsXG4gICAgICAgICAgICBtYXhEZXB0aDogdGhpcy5tYXhEZXB0aCAhPT0gSW5maW5pdHkgP1xuICAgICAgICAgICAgICAgIHRoaXMubWF4RGVwdGggKyB0aGlzLnNjdXJyeS5jd2QuZGVwdGgoKVxuICAgICAgICAgICAgICAgIDogSW5maW5pdHksXG4gICAgICAgICAgICBwbGF0Zm9ybTogdGhpcy5wbGF0Zm9ybSxcbiAgICAgICAgICAgIG5vY2FzZTogdGhpcy5ub2Nhc2UsXG4gICAgICAgICAgICBpbmNsdWRlQ2hpbGRNYXRjaGVzOiB0aGlzLmluY2x1ZGVDaGlsZE1hdGNoZXMsXG4gICAgICAgIH0pLnN0cmVhbVN5bmMoKTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogRGVmYXVsdCBzeW5jIGl0ZXJhdGlvbiBmdW5jdGlvbi4gUmV0dXJucyBhIEdlbmVyYXRvciB0aGF0XG4gICAgICogaXRlcmF0ZXMgb3ZlciB0aGUgcmVzdWx0cy5cbiAgICAgKi9cbiAgICBpdGVyYXRlU3luYygpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuc3RyZWFtU3luYygpW1N5bWJvbC5pdGVyYXRvcl0oKTtcbiAgICB9XG4gICAgW1N5bWJvbC5pdGVyYXRvcl0oKSB7XG4gICAgICAgIHJldHVybiB0aGlzLml0ZXJhdGVTeW5jKCk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIERlZmF1bHQgYXN5bmMgaXRlcmF0aW9uIGZ1bmN0aW9uLiBSZXR1cm5zIGFuIEFzeW5jR2VuZXJhdG9yIHRoYXRcbiAgICAgKiBpdGVyYXRlcyBvdmVyIHRoZSByZXN1bHRzLlxuICAgICAqL1xuICAgIGl0ZXJhdGUoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLnN0cmVhbSgpW1N5bWJvbC5hc3luY0l0ZXJhdG9yXSgpO1xuICAgIH1cbiAgICBbU3ltYm9sLmFzeW5jSXRlcmF0b3JdKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5pdGVyYXRlKCk7XG4gICAgfVxufVxuZXhwb3J0cy5HbG9iID0gR2xvYjtcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPWdsb2IuanMubWFwIiwKICAgICJcInVzZSBzdHJpY3RcIjtcbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIl9fZXNNb2R1bGVcIiwgeyB2YWx1ZTogdHJ1ZSB9KTtcbmV4cG9ydHMuaGFzTWFnaWMgPSB2b2lkIDA7XG5jb25zdCBtaW5pbWF0Y2hfMSA9IHJlcXVpcmUoXCJtaW5pbWF0Y2hcIik7XG4vKipcbiAqIFJldHVybiB0cnVlIGlmIHRoZSBwYXR0ZXJucyBwcm92aWRlZCBjb250YWluIGFueSBtYWdpYyBnbG9iIGNoYXJhY3RlcnMsXG4gKiBnaXZlbiB0aGUgb3B0aW9ucyBwcm92aWRlZC5cbiAqXG4gKiBCcmFjZSBleHBhbnNpb24gaXMgbm90IGNvbnNpZGVyZWQgXCJtYWdpY1wiIHVubGVzcyB0aGUgYG1hZ2ljYWxCcmFjZXNgIG9wdGlvblxuICogaXMgc2V0LCBhcyBicmFjZSBleHBhbnNpb24ganVzdCB0dXJucyBvbmUgc3RyaW5nIGludG8gYW4gYXJyYXkgb2Ygc3RyaW5ncy5cbiAqIFNvIGEgcGF0dGVybiBsaWtlIGAneHthLGJ9eSdgIHdvdWxkIHJldHVybiBgZmFsc2VgLCBiZWNhdXNlIGAneGF5J2AgYW5kXG4gKiBgJ3hieSdgIGJvdGggZG8gbm90IGNvbnRhaW4gYW55IG1hZ2ljIGdsb2IgY2hhcmFjdGVycywgYW5kIGl0J3MgdHJlYXRlZCB0aGVcbiAqIHNhbWUgYXMgaWYgeW91IGhhZCBjYWxsZWQgaXQgb24gYFsneGF5JywgJ3hieSddYC4gV2hlbiBgbWFnaWNhbEJyYWNlczp0cnVlYFxuICogaXMgaW4gdGhlIG9wdGlvbnMsIGJyYWNlIGV4cGFuc2lvbiBfaXNfIHRyZWF0ZWQgYXMgYSBwYXR0ZXJuIGhhdmluZyBtYWdpYy5cbiAqL1xuY29uc3QgaGFzTWFnaWMgPSAocGF0dGVybiwgb3B0aW9ucyA9IHt9KSA9PiB7XG4gICAgaWYgKCFBcnJheS5pc0FycmF5KHBhdHRlcm4pKSB7XG4gICAgICAgIHBhdHRlcm4gPSBbcGF0dGVybl07XG4gICAgfVxuICAgIGZvciAoY29uc3QgcCBvZiBwYXR0ZXJuKSB7XG4gICAgICAgIGlmIChuZXcgbWluaW1hdGNoXzEuTWluaW1hdGNoKHAsIG9wdGlvbnMpLmhhc01hZ2ljKCkpXG4gICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG4gICAgcmV0dXJuIGZhbHNlO1xufTtcbmV4cG9ydHMuaGFzTWFnaWMgPSBoYXNNYWdpYztcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPWhhcy1tYWdpYy5qcy5tYXAiLAogICAgIlwidXNlIHN0cmljdFwiO1xuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiX19lc01vZHVsZVwiLCB7IHZhbHVlOiB0cnVlIH0pO1xuZXhwb3J0cy5nbG9iID0gZXhwb3J0cy5zeW5jID0gZXhwb3J0cy5pdGVyYXRlID0gZXhwb3J0cy5pdGVyYXRlU3luYyA9IGV4cG9ydHMuc3RyZWFtID0gZXhwb3J0cy5zdHJlYW1TeW5jID0gZXhwb3J0cy5JZ25vcmUgPSBleHBvcnRzLmhhc01hZ2ljID0gZXhwb3J0cy5HbG9iID0gZXhwb3J0cy51bmVzY2FwZSA9IGV4cG9ydHMuZXNjYXBlID0gdm9pZCAwO1xuZXhwb3J0cy5nbG9iU3RyZWFtU3luYyA9IGdsb2JTdHJlYW1TeW5jO1xuZXhwb3J0cy5nbG9iU3RyZWFtID0gZ2xvYlN0cmVhbTtcbmV4cG9ydHMuZ2xvYlN5bmMgPSBnbG9iU3luYztcbmV4cG9ydHMuZ2xvYkl0ZXJhdGVTeW5jID0gZ2xvYkl0ZXJhdGVTeW5jO1xuZXhwb3J0cy5nbG9iSXRlcmF0ZSA9IGdsb2JJdGVyYXRlO1xuY29uc3QgbWluaW1hdGNoXzEgPSByZXF1aXJlKFwibWluaW1hdGNoXCIpO1xuY29uc3QgZ2xvYl9qc18xID0gcmVxdWlyZShcIi4vZ2xvYi5qc1wiKTtcbmNvbnN0IGhhc19tYWdpY19qc18xID0gcmVxdWlyZShcIi4vaGFzLW1hZ2ljLmpzXCIpO1xudmFyIG1pbmltYXRjaF8yID0gcmVxdWlyZShcIm1pbmltYXRjaFwiKTtcbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcImVzY2FwZVwiLCB7IGVudW1lcmFibGU6IHRydWUsIGdldDogZnVuY3Rpb24gKCkgeyByZXR1cm4gbWluaW1hdGNoXzIuZXNjYXBlOyB9IH0pO1xuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwidW5lc2NhcGVcIiwgeyBlbnVtZXJhYmxlOiB0cnVlLCBnZXQ6IGZ1bmN0aW9uICgpIHsgcmV0dXJuIG1pbmltYXRjaF8yLnVuZXNjYXBlOyB9IH0pO1xudmFyIGdsb2JfanNfMiA9IHJlcXVpcmUoXCIuL2dsb2IuanNcIik7XG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJHbG9iXCIsIHsgZW51bWVyYWJsZTogdHJ1ZSwgZ2V0OiBmdW5jdGlvbiAoKSB7IHJldHVybiBnbG9iX2pzXzIuR2xvYjsgfSB9KTtcbnZhciBoYXNfbWFnaWNfanNfMiA9IHJlcXVpcmUoXCIuL2hhcy1tYWdpYy5qc1wiKTtcbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcImhhc01hZ2ljXCIsIHsgZW51bWVyYWJsZTogdHJ1ZSwgZ2V0OiBmdW5jdGlvbiAoKSB7IHJldHVybiBoYXNfbWFnaWNfanNfMi5oYXNNYWdpYzsgfSB9KTtcbnZhciBpZ25vcmVfanNfMSA9IHJlcXVpcmUoXCIuL2lnbm9yZS5qc1wiKTtcbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIklnbm9yZVwiLCB7IGVudW1lcmFibGU6IHRydWUsIGdldDogZnVuY3Rpb24gKCkgeyByZXR1cm4gaWdub3JlX2pzXzEuSWdub3JlOyB9IH0pO1xuZnVuY3Rpb24gZ2xvYlN0cmVhbVN5bmMocGF0dGVybiwgb3B0aW9ucyA9IHt9KSB7XG4gICAgcmV0dXJuIG5ldyBnbG9iX2pzXzEuR2xvYihwYXR0ZXJuLCBvcHRpb25zKS5zdHJlYW1TeW5jKCk7XG59XG5mdW5jdGlvbiBnbG9iU3RyZWFtKHBhdHRlcm4sIG9wdGlvbnMgPSB7fSkge1xuICAgIHJldHVybiBuZXcgZ2xvYl9qc18xLkdsb2IocGF0dGVybiwgb3B0aW9ucykuc3RyZWFtKCk7XG59XG5mdW5jdGlvbiBnbG9iU3luYyhwYXR0ZXJuLCBvcHRpb25zID0ge30pIHtcbiAgICByZXR1cm4gbmV3IGdsb2JfanNfMS5HbG9iKHBhdHRlcm4sIG9wdGlvbnMpLndhbGtTeW5jKCk7XG59XG5hc3luYyBmdW5jdGlvbiBnbG9iXyhwYXR0ZXJuLCBvcHRpb25zID0ge30pIHtcbiAgICByZXR1cm4gbmV3IGdsb2JfanNfMS5HbG9iKHBhdHRlcm4sIG9wdGlvbnMpLndhbGsoKTtcbn1cbmZ1bmN0aW9uIGdsb2JJdGVyYXRlU3luYyhwYXR0ZXJuLCBvcHRpb25zID0ge30pIHtcbiAgICByZXR1cm4gbmV3IGdsb2JfanNfMS5HbG9iKHBhdHRlcm4sIG9wdGlvbnMpLml0ZXJhdGVTeW5jKCk7XG59XG5mdW5jdGlvbiBnbG9iSXRlcmF0ZShwYXR0ZXJuLCBvcHRpb25zID0ge30pIHtcbiAgICByZXR1cm4gbmV3IGdsb2JfanNfMS5HbG9iKHBhdHRlcm4sIG9wdGlvbnMpLml0ZXJhdGUoKTtcbn1cbi8vIGFsaWFzZXM6IGdsb2Iuc3luYy5zdHJlYW0oKSBnbG9iLnN0cmVhbS5zeW5jKCkgZ2xvYi5zeW5jKCkgZXRjXG5leHBvcnRzLnN0cmVhbVN5bmMgPSBnbG9iU3RyZWFtU3luYztcbmV4cG9ydHMuc3RyZWFtID0gT2JqZWN0LmFzc2lnbihnbG9iU3RyZWFtLCB7IHN5bmM6IGdsb2JTdHJlYW1TeW5jIH0pO1xuZXhwb3J0cy5pdGVyYXRlU3luYyA9IGdsb2JJdGVyYXRlU3luYztcbmV4cG9ydHMuaXRlcmF0ZSA9IE9iamVjdC5hc3NpZ24oZ2xvYkl0ZXJhdGUsIHtcbiAgICBzeW5jOiBnbG9iSXRlcmF0ZVN5bmMsXG59KTtcbmV4cG9ydHMuc3luYyA9IE9iamVjdC5hc3NpZ24oZ2xvYlN5bmMsIHtcbiAgICBzdHJlYW06IGdsb2JTdHJlYW1TeW5jLFxuICAgIGl0ZXJhdGU6IGdsb2JJdGVyYXRlU3luYyxcbn0pO1xuZXhwb3J0cy5nbG9iID0gT2JqZWN0LmFzc2lnbihnbG9iXywge1xuICAgIGdsb2I6IGdsb2JfLFxuICAgIGdsb2JTeW5jLFxuICAgIHN5bmM6IGV4cG9ydHMuc3luYyxcbiAgICBnbG9iU3RyZWFtLFxuICAgIHN0cmVhbTogZXhwb3J0cy5zdHJlYW0sXG4gICAgZ2xvYlN0cmVhbVN5bmMsXG4gICAgc3RyZWFtU3luYzogZXhwb3J0cy5zdHJlYW1TeW5jLFxuICAgIGdsb2JJdGVyYXRlLFxuICAgIGl0ZXJhdGU6IGV4cG9ydHMuaXRlcmF0ZSxcbiAgICBnbG9iSXRlcmF0ZVN5bmMsXG4gICAgaXRlcmF0ZVN5bmM6IGV4cG9ydHMuaXRlcmF0ZVN5bmMsXG4gICAgR2xvYjogZ2xvYl9qc18xLkdsb2IsXG4gICAgaGFzTWFnaWM6IGhhc19tYWdpY19qc18xLmhhc01hZ2ljLFxuICAgIGVzY2FwZTogbWluaW1hdGNoXzEuZXNjYXBlLFxuICAgIHVuZXNjYXBlOiBtaW5pbWF0Y2hfMS51bmVzY2FwZSxcbn0pO1xuZXhwb3J0cy5nbG9iLmdsb2IgPSBleHBvcnRzLmdsb2I7XG4vLyMgc291cmNlTWFwcGluZ1VSTD1pbmRleC5qcy5tYXAiLAogICAgIi8qKlxuICogYXJjaGl2ZXItdXRpbHNcbiAqXG4gKiBDb3B5cmlnaHQgKGMpIDIwMTItMjAxNCBDaHJpcyBUYWxraW5ndG9uLCBjb250cmlidXRvcnMuXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgTUlUIGxpY2Vuc2UuXG4gKiBodHRwczovL2dpdGh1Yi5jb20vYXJjaGl2ZXJqcy9ub2RlLWFyY2hpdmVyL2Jsb2IvbWFzdGVyL0xJQ0VOU0UtTUlUXG4gKi9cbnZhciBmcyA9IHJlcXVpcmUoJ2dyYWNlZnVsLWZzJyk7XG52YXIgcGF0aCA9IHJlcXVpcmUoJ3BhdGgnKTtcblxudmFyIGZsYXR0ZW4gPSByZXF1aXJlKCdsb2Rhc2gvZmxhdHRlbicpO1xudmFyIGRpZmZlcmVuY2UgPSByZXF1aXJlKCdsb2Rhc2gvZGlmZmVyZW5jZScpO1xudmFyIHVuaW9uID0gcmVxdWlyZSgnbG9kYXNoL3VuaW9uJyk7XG52YXIgaXNQbGFpbk9iamVjdCA9IHJlcXVpcmUoJ2xvZGFzaC9pc1BsYWluT2JqZWN0Jyk7XG5cbnZhciBnbG9iID0gcmVxdWlyZSgnZ2xvYicpO1xuXG52YXIgZmlsZSA9IG1vZHVsZS5leHBvcnRzID0ge307XG5cbnZhciBwYXRoU2VwYXJhdG9yUmUgPSAvW1xcL1xcXFxdL2c7XG5cbi8vIFByb2Nlc3Mgc3BlY2lmaWVkIHdpbGRjYXJkIGdsb2IgcGF0dGVybnMgb3IgZmlsZW5hbWVzIGFnYWluc3QgYVxuLy8gY2FsbGJhY2ssIGV4Y2x1ZGluZyBhbmQgdW5pcXVpbmcgZmlsZXMgaW4gdGhlIHJlc3VsdCBzZXQuXG52YXIgcHJvY2Vzc1BhdHRlcm5zID0gZnVuY3Rpb24ocGF0dGVybnMsIGZuKSB7XG4gIC8vIEZpbGVwYXRocyB0byByZXR1cm4uXG4gIHZhciByZXN1bHQgPSBbXTtcbiAgLy8gSXRlcmF0ZSBvdmVyIGZsYXR0ZW5lZCBwYXR0ZXJucyBhcnJheS5cbiAgZmxhdHRlbihwYXR0ZXJucykuZm9yRWFjaChmdW5jdGlvbihwYXR0ZXJuKSB7XG4gICAgLy8gSWYgdGhlIGZpcnN0IGNoYXJhY3RlciBpcyAhIGl0IHNob3VsZCBiZSBvbWl0dGVkXG4gICAgdmFyIGV4Y2x1c2lvbiA9IHBhdHRlcm4uaW5kZXhPZignIScpID09PSAwO1xuICAgIC8vIElmIHRoZSBwYXR0ZXJuIGlzIGFuIGV4Y2x1c2lvbiwgcmVtb3ZlIHRoZSAhXG4gICAgaWYgKGV4Y2x1c2lvbikgeyBwYXR0ZXJuID0gcGF0dGVybi5zbGljZSgxKTsgfVxuICAgIC8vIEZpbmQgYWxsIG1hdGNoaW5nIGZpbGVzIGZvciB0aGlzIHBhdHRlcm4uXG4gICAgdmFyIG1hdGNoZXMgPSBmbihwYXR0ZXJuKTtcbiAgICBpZiAoZXhjbHVzaW9uKSB7XG4gICAgICAvLyBJZiBhbiBleGNsdXNpb24sIHJlbW92ZSBtYXRjaGluZyBmaWxlcy5cbiAgICAgIHJlc3VsdCA9IGRpZmZlcmVuY2UocmVzdWx0LCBtYXRjaGVzKTtcbiAgICB9IGVsc2Uge1xuICAgICAgLy8gT3RoZXJ3aXNlIGFkZCBtYXRjaGluZyBmaWxlcy5cbiAgICAgIHJlc3VsdCA9IHVuaW9uKHJlc3VsdCwgbWF0Y2hlcyk7XG4gICAgfVxuICB9KTtcbiAgcmV0dXJuIHJlc3VsdDtcbn07XG5cbi8vIFRydWUgaWYgdGhlIGZpbGUgcGF0aCBleGlzdHMuXG5maWxlLmV4aXN0cyA9IGZ1bmN0aW9uKCkge1xuICB2YXIgZmlsZXBhdGggPSBwYXRoLmpvaW4uYXBwbHkocGF0aCwgYXJndW1lbnRzKTtcbiAgcmV0dXJuIGZzLmV4aXN0c1N5bmMoZmlsZXBhdGgpO1xufTtcblxuLy8gUmV0dXJuIGFuIGFycmF5IG9mIGFsbCBmaWxlIHBhdGhzIHRoYXQgbWF0Y2ggdGhlIGdpdmVuIHdpbGRjYXJkIHBhdHRlcm5zLlxuZmlsZS5leHBhbmQgPSBmdW5jdGlvbiguLi5hcmdzKSB7XG4gIC8vIElmIHRoZSBmaXJzdCBhcmd1bWVudCBpcyBhbiBvcHRpb25zIG9iamVjdCwgc2F2ZSB0aG9zZSBvcHRpb25zIHRvIHBhc3NcbiAgLy8gaW50byB0aGUgRmlsZS5wcm90b3R5cGUuZ2xvYi5zeW5jIG1ldGhvZC5cbiAgdmFyIG9wdGlvbnMgPSBpc1BsYWluT2JqZWN0KGFyZ3NbMF0pID8gYXJncy5zaGlmdCgpIDoge307XG4gIC8vIFVzZSB0aGUgZmlyc3QgYXJndW1lbnQgaWYgaXQncyBhbiBBcnJheSwgb3RoZXJ3aXNlIGNvbnZlcnQgdGhlIGFyZ3VtZW50c1xuICAvLyBvYmplY3QgdG8gYW4gYXJyYXkgYW5kIHVzZSB0aGF0LlxuICB2YXIgcGF0dGVybnMgPSBBcnJheS5pc0FycmF5KGFyZ3NbMF0pID8gYXJnc1swXSA6IGFyZ3M7XG4gIC8vIFJldHVybiBlbXB0eSBzZXQgaWYgdGhlcmUgYXJlIG5vIHBhdHRlcm5zIG9yIGZpbGVwYXRocy5cbiAgaWYgKHBhdHRlcm5zLmxlbmd0aCA9PT0gMCkgeyByZXR1cm4gW107IH1cbiAgLy8gUmV0dXJuIGFsbCBtYXRjaGluZyBmaWxlcGF0aHMuXG4gIHZhciBtYXRjaGVzID0gcHJvY2Vzc1BhdHRlcm5zKHBhdHRlcm5zLCBmdW5jdGlvbihwYXR0ZXJuKSB7XG4gICAgLy8gRmluZCBhbGwgbWF0Y2hpbmcgZmlsZXMgZm9yIHRoaXMgcGF0dGVybi5cbiAgICByZXR1cm4gZ2xvYi5zeW5jKHBhdHRlcm4sIG9wdGlvbnMpO1xuICB9KTtcbiAgLy8gRmlsdGVyIHJlc3VsdCBzZXQ/XG4gIGlmIChvcHRpb25zLmZpbHRlcikge1xuICAgIG1hdGNoZXMgPSBtYXRjaGVzLmZpbHRlcihmdW5jdGlvbihmaWxlcGF0aCkge1xuICAgICAgZmlsZXBhdGggPSBwYXRoLmpvaW4ob3B0aW9ucy5jd2QgfHwgJycsIGZpbGVwYXRoKTtcbiAgICAgIHRyeSB7XG4gICAgICAgIGlmICh0eXBlb2Ygb3B0aW9ucy5maWx0ZXIgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgICByZXR1cm4gb3B0aW9ucy5maWx0ZXIoZmlsZXBhdGgpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIC8vIElmIHRoZSBmaWxlIGlzIG9mIHRoZSByaWdodCB0eXBlIGFuZCBleGlzdHMsIHRoaXMgc2hvdWxkIHdvcmsuXG4gICAgICAgICAgcmV0dXJuIGZzLnN0YXRTeW5jKGZpbGVwYXRoKVtvcHRpb25zLmZpbHRlcl0oKTtcbiAgICAgICAgfVxuICAgICAgfSBjYXRjaChlKSB7XG4gICAgICAgIC8vIE90aGVyd2lzZSwgaXQncyBwcm9iYWJseSBub3QgdGhlIHJpZ2h0IHR5cGUuXG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgIH1cbiAgICB9KTtcbiAgfVxuICByZXR1cm4gbWF0Y2hlcztcbn07XG5cbi8vIEJ1aWxkIGEgbXVsdGkgdGFzayBcImZpbGVzXCIgb2JqZWN0IGR5bmFtaWNhbGx5LlxuZmlsZS5leHBhbmRNYXBwaW5nID0gZnVuY3Rpb24ocGF0dGVybnMsIGRlc3RCYXNlLCBvcHRpb25zKSB7XG4gIG9wdGlvbnMgPSBPYmplY3QuYXNzaWduKHtcbiAgICByZW5hbWU6IGZ1bmN0aW9uKGRlc3RCYXNlLCBkZXN0UGF0aCkge1xuICAgICAgcmV0dXJuIHBhdGguam9pbihkZXN0QmFzZSB8fCAnJywgZGVzdFBhdGgpO1xuICAgIH1cbiAgfSwgb3B0aW9ucyk7XG4gIHZhciBmaWxlcyA9IFtdO1xuICB2YXIgZmlsZUJ5RGVzdCA9IHt9O1xuICAvLyBGaW5kIGFsbCBmaWxlcyBtYXRjaGluZyBwYXR0ZXJuLCB1c2luZyBwYXNzZWQtaW4gb3B0aW9ucy5cbiAgZmlsZS5leHBhbmQob3B0aW9ucywgcGF0dGVybnMpLmZvckVhY2goZnVuY3Rpb24oc3JjKSB7XG4gICAgdmFyIGRlc3RQYXRoID0gc3JjO1xuICAgIC8vIEZsYXR0ZW4/XG4gICAgaWYgKG9wdGlvbnMuZmxhdHRlbikge1xuICAgICAgZGVzdFBhdGggPSBwYXRoLmJhc2VuYW1lKGRlc3RQYXRoKTtcbiAgICB9XG4gICAgLy8gQ2hhbmdlIHRoZSBleHRlbnNpb24/XG4gICAgaWYgKG9wdGlvbnMuZXh0KSB7XG4gICAgICBkZXN0UGF0aCA9IGRlc3RQYXRoLnJlcGxhY2UoLyhcXC5bXlxcL10qKT8kLywgb3B0aW9ucy5leHQpO1xuICAgIH1cbiAgICAvLyBHZW5lcmF0ZSBkZXN0aW5hdGlvbiBmaWxlbmFtZS5cbiAgICB2YXIgZGVzdCA9IG9wdGlvbnMucmVuYW1lKGRlc3RCYXNlLCBkZXN0UGF0aCwgb3B0aW9ucyk7XG4gICAgLy8gUHJlcGVuZCBjd2QgdG8gc3JjIHBhdGggaWYgbmVjZXNzYXJ5LlxuICAgIGlmIChvcHRpb25zLmN3ZCkgeyBzcmMgPSBwYXRoLmpvaW4ob3B0aW9ucy5jd2QsIHNyYyk7IH1cbiAgICAvLyBOb3JtYWxpemUgZmlsZXBhdGhzIHRvIGJlIHVuaXgtc3R5bGUuXG4gICAgZGVzdCA9IGRlc3QucmVwbGFjZShwYXRoU2VwYXJhdG9yUmUsICcvJyk7XG4gICAgc3JjID0gc3JjLnJlcGxhY2UocGF0aFNlcGFyYXRvclJlLCAnLycpO1xuICAgIC8vIE1hcCBjb3JyZWN0IHNyYyBwYXRoIHRvIGRlc3QgcGF0aC5cbiAgICBpZiAoZmlsZUJ5RGVzdFtkZXN0XSkge1xuICAgICAgLy8gSWYgZGVzdCBhbHJlYWR5IGV4aXN0cywgcHVzaCB0aGlzIHNyYyBvbnRvIHRoYXQgZGVzdCdzIHNyYyBhcnJheS5cbiAgICAgIGZpbGVCeURlc3RbZGVzdF0uc3JjLnB1c2goc3JjKTtcbiAgICB9IGVsc2Uge1xuICAgICAgLy8gT3RoZXJ3aXNlIGNyZWF0ZSBhIG5ldyBzcmMtZGVzdCBmaWxlIG1hcHBpbmcgb2JqZWN0LlxuICAgICAgZmlsZXMucHVzaCh7XG4gICAgICAgIHNyYzogW3NyY10sXG4gICAgICAgIGRlc3Q6IGRlc3QsXG4gICAgICB9KTtcbiAgICAgIC8vIEFuZCBzdG9yZSBhIHJlZmVyZW5jZSBmb3IgbGF0ZXIgdXNlLlxuICAgICAgZmlsZUJ5RGVzdFtkZXN0XSA9IGZpbGVzW2ZpbGVzLmxlbmd0aCAtIDFdO1xuICAgIH1cbiAgfSk7XG4gIHJldHVybiBmaWxlcztcbn07XG5cbi8vIHJldXNpbmcgYml0cyBvZiBncnVudCdzIG11bHRpLXRhc2sgc291cmNlIG5vcm1hbGl6YXRpb25cbmZpbGUubm9ybWFsaXplRmlsZXNBcnJheSA9IGZ1bmN0aW9uKGRhdGEpIHtcbiAgdmFyIGZpbGVzID0gW107XG5cbiAgZGF0YS5mb3JFYWNoKGZ1bmN0aW9uKG9iaikge1xuICAgIHZhciBwcm9wO1xuICAgIGlmICgnc3JjJyBpbiBvYmogfHwgJ2Rlc3QnIGluIG9iaikge1xuICAgICAgZmlsZXMucHVzaChvYmopO1xuICAgIH1cbiAgfSk7XG5cbiAgaWYgKGZpbGVzLmxlbmd0aCA9PT0gMCkge1xuICAgIHJldHVybiBbXTtcbiAgfVxuXG4gIGZpbGVzID0gXyhmaWxlcykuY2hhaW4oKS5mb3JFYWNoKGZ1bmN0aW9uKG9iaikge1xuICAgIGlmICghKCdzcmMnIGluIG9iaikgfHwgIW9iai5zcmMpIHsgcmV0dXJuOyB9XG4gICAgLy8gTm9ybWFsaXplIC5zcmMgcHJvcGVydGllcyB0byBmbGF0dGVuZWQgYXJyYXkuXG4gICAgaWYgKEFycmF5LmlzQXJyYXkob2JqLnNyYykpIHtcbiAgICAgIG9iai5zcmMgPSBmbGF0dGVuKG9iai5zcmMpO1xuICAgIH0gZWxzZSB7XG4gICAgICBvYmouc3JjID0gW29iai5zcmNdO1xuICAgIH1cbiAgfSkubWFwKGZ1bmN0aW9uKG9iaikge1xuICAgIC8vIEJ1aWxkIG9wdGlvbnMgb2JqZWN0LCByZW1vdmluZyB1bndhbnRlZCBwcm9wZXJ0aWVzLlxuICAgIHZhciBleHBhbmRPcHRpb25zID0gT2JqZWN0LmFzc2lnbih7fSwgb2JqKTtcbiAgICBkZWxldGUgZXhwYW5kT3B0aW9ucy5zcmM7XG4gICAgZGVsZXRlIGV4cGFuZE9wdGlvbnMuZGVzdDtcblxuICAgIC8vIEV4cGFuZCBmaWxlIG1hcHBpbmdzLlxuICAgIGlmIChvYmouZXhwYW5kKSB7XG4gICAgICByZXR1cm4gZmlsZS5leHBhbmRNYXBwaW5nKG9iai5zcmMsIG9iai5kZXN0LCBleHBhbmRPcHRpb25zKS5tYXAoZnVuY3Rpb24obWFwT2JqKSB7XG4gICAgICAgIC8vIENvcHkgb2JqIHByb3BlcnRpZXMgdG8gcmVzdWx0LlxuICAgICAgICB2YXIgcmVzdWx0ID0gT2JqZWN0LmFzc2lnbih7fSwgb2JqKTtcbiAgICAgICAgLy8gTWFrZSBhIGNsb25lIG9mIHRoZSBvcmlnIG9iaiBhdmFpbGFibGUuXG4gICAgICAgIHJlc3VsdC5vcmlnID0gT2JqZWN0LmFzc2lnbih7fSwgb2JqKTtcbiAgICAgICAgLy8gU2V0IC5zcmMgYW5kIC5kZXN0LCBwcm9jZXNzaW5nIGJvdGggYXMgdGVtcGxhdGVzLlxuICAgICAgICByZXN1bHQuc3JjID0gbWFwT2JqLnNyYztcbiAgICAgICAgcmVzdWx0LmRlc3QgPSBtYXBPYmouZGVzdDtcbiAgICAgICAgLy8gUmVtb3ZlIHVud2FudGVkIHByb3BlcnRpZXMuXG4gICAgICAgIFsnZXhwYW5kJywgJ2N3ZCcsICdmbGF0dGVuJywgJ3JlbmFtZScsICdleHQnXS5mb3JFYWNoKGZ1bmN0aW9uKHByb3ApIHtcbiAgICAgICAgICBkZWxldGUgcmVzdWx0W3Byb3BdO1xuICAgICAgICB9KTtcbiAgICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICAgIH0pO1xuICAgIH1cblxuICAgIC8vIENvcHkgb2JqIHByb3BlcnRpZXMgdG8gcmVzdWx0LCBhZGRpbmcgYW4gLm9yaWcgcHJvcGVydHkuXG4gICAgdmFyIHJlc3VsdCA9IE9iamVjdC5hc3NpZ24oe30sIG9iaik7XG4gICAgLy8gTWFrZSBhIGNsb25lIG9mIHRoZSBvcmlnIG9iaiBhdmFpbGFibGUuXG4gICAgcmVzdWx0Lm9yaWcgPSBPYmplY3QuYXNzaWduKHt9LCBvYmopO1xuXG4gICAgaWYgKCdzcmMnIGluIHJlc3VsdCkge1xuICAgICAgLy8gRXhwb3NlIGFuIGV4cGFuZC1vbi1kZW1hbmQgZ2V0dGVyIG1ldGhvZCBhcyAuc3JjLlxuICAgICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KHJlc3VsdCwgJ3NyYycsIHtcbiAgICAgICAgZW51bWVyYWJsZTogdHJ1ZSxcbiAgICAgICAgZ2V0OiBmdW5jdGlvbiBmbigpIHtcbiAgICAgICAgICB2YXIgc3JjO1xuICAgICAgICAgIGlmICghKCdyZXN1bHQnIGluIGZuKSkge1xuICAgICAgICAgICAgc3JjID0gb2JqLnNyYztcbiAgICAgICAgICAgIC8vIElmIHNyYyBpcyBhbiBhcnJheSwgZmxhdHRlbiBpdC4gT3RoZXJ3aXNlLCBtYWtlIGl0IGludG8gYW4gYXJyYXkuXG4gICAgICAgICAgICBzcmMgPSBBcnJheS5pc0FycmF5KHNyYykgPyBmbGF0dGVuKHNyYykgOiBbc3JjXTtcbiAgICAgICAgICAgIC8vIEV4cGFuZCBzcmMgZmlsZXMsIG1lbW9pemluZyByZXN1bHQuXG4gICAgICAgICAgICBmbi5yZXN1bHQgPSBmaWxlLmV4cGFuZChleHBhbmRPcHRpb25zLCBzcmMpO1xuICAgICAgICAgIH1cbiAgICAgICAgICByZXR1cm4gZm4ucmVzdWx0O1xuICAgICAgICB9XG4gICAgICB9KTtcbiAgICB9XG5cbiAgICBpZiAoJ2Rlc3QnIGluIHJlc3VsdCkge1xuICAgICAgcmVzdWx0LmRlc3QgPSBvYmouZGVzdDtcbiAgICB9XG5cbiAgICByZXR1cm4gcmVzdWx0O1xuICB9KS5mbGF0dGVuKCkudmFsdWUoKTtcblxuICByZXR1cm4gZmlsZXM7XG59O1xuIiwKICAgICIvKipcbiAqIGFyY2hpdmVyLXV0aWxzXG4gKlxuICogQ29weXJpZ2h0IChjKSAyMDE1IENocmlzIFRhbGtpbmd0b24uXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgTUlUIGxpY2Vuc2UuXG4gKiBodHRwczovL2dpdGh1Yi5jb20vYXJjaGl2ZXJqcy9hcmNoaXZlci11dGlscy9ibG9iL21hc3Rlci9MSUNFTlNFXG4gKi9cbnZhciBmcyA9IHJlcXVpcmUoJ2dyYWNlZnVsLWZzJyk7XG52YXIgcGF0aCA9IHJlcXVpcmUoJ3BhdGgnKTtcbnZhciBpc1N0cmVhbSA9IHJlcXVpcmUoJ2lzLXN0cmVhbScpO1xudmFyIGxhenlzdHJlYW0gPSByZXF1aXJlKCdsYXp5c3RyZWFtJyk7XG52YXIgbm9ybWFsaXplUGF0aCA9IHJlcXVpcmUoJ25vcm1hbGl6ZS1wYXRoJyk7XG52YXIgZGVmYXVsdHMgPSByZXF1aXJlKCdsb2Rhc2gvZGVmYXVsdHMnKTtcblxudmFyIFN0cmVhbSA9IHJlcXVpcmUoJ3N0cmVhbScpLlN0cmVhbTtcbnZhciBQYXNzVGhyb3VnaCA9IHJlcXVpcmUoJ3JlYWRhYmxlLXN0cmVhbScpLlBhc3NUaHJvdWdoO1xuXG52YXIgdXRpbHMgPSBtb2R1bGUuZXhwb3J0cyA9IHt9O1xudXRpbHMuZmlsZSA9IHJlcXVpcmUoJy4vZmlsZS5qcycpO1xuXG51dGlscy5jb2xsZWN0U3RyZWFtID0gZnVuY3Rpb24oc291cmNlLCBjYWxsYmFjaykge1xuICB2YXIgY29sbGVjdGlvbiA9IFtdO1xuICB2YXIgc2l6ZSA9IDA7XG5cbiAgc291cmNlLm9uKCdlcnJvcicsIGNhbGxiYWNrKTtcblxuICBzb3VyY2Uub24oJ2RhdGEnLCBmdW5jdGlvbihjaHVuaykge1xuICAgIGNvbGxlY3Rpb24ucHVzaChjaHVuayk7XG4gICAgc2l6ZSArPSBjaHVuay5sZW5ndGg7XG4gIH0pO1xuXG4gIHNvdXJjZS5vbignZW5kJywgZnVuY3Rpb24oKSB7XG4gICAgdmFyIGJ1ZiA9IEJ1ZmZlci5hbGxvYyhzaXplKTtcbiAgICB2YXIgb2Zmc2V0ID0gMDtcblxuICAgIGNvbGxlY3Rpb24uZm9yRWFjaChmdW5jdGlvbihkYXRhKSB7XG4gICAgICBkYXRhLmNvcHkoYnVmLCBvZmZzZXQpO1xuICAgICAgb2Zmc2V0ICs9IGRhdGEubGVuZ3RoO1xuICAgIH0pO1xuXG4gICAgY2FsbGJhY2sobnVsbCwgYnVmKTtcbiAgfSk7XG59O1xuXG51dGlscy5kYXRlaWZ5ID0gZnVuY3Rpb24oZGF0ZWlzaCkge1xuICBkYXRlaXNoID0gZGF0ZWlzaCB8fCBuZXcgRGF0ZSgpO1xuXG4gIGlmIChkYXRlaXNoIGluc3RhbmNlb2YgRGF0ZSkge1xuICAgIGRhdGVpc2ggPSBkYXRlaXNoO1xuICB9IGVsc2UgaWYgKHR5cGVvZiBkYXRlaXNoID09PSAnc3RyaW5nJykge1xuICAgIGRhdGVpc2ggPSBuZXcgRGF0ZShkYXRlaXNoKTtcbiAgfSBlbHNlIHtcbiAgICBkYXRlaXNoID0gbmV3IERhdGUoKTtcbiAgfVxuXG4gIHJldHVybiBkYXRlaXNoO1xufTtcblxuLy8gdGhpcyBpcyBzbGlnaHRseSBkaWZmZXJlbnQgZnJvbSBsb2Rhc2ggdmVyc2lvblxudXRpbHMuZGVmYXVsdHMgPSBmdW5jdGlvbihvYmplY3QsIHNvdXJjZSwgZ3VhcmQpIHtcbiAgdmFyIGFyZ3MgPSBhcmd1bWVudHM7XG4gIGFyZ3NbMF0gPSBhcmdzWzBdIHx8IHt9O1xuXG4gIHJldHVybiBkZWZhdWx0cyguLi5hcmdzKTtcbn07XG5cbnV0aWxzLmlzU3RyZWFtID0gZnVuY3Rpb24oc291cmNlKSB7XG4gIHJldHVybiBpc1N0cmVhbShzb3VyY2UpO1xufTtcblxudXRpbHMubGF6eVJlYWRTdHJlYW0gPSBmdW5jdGlvbihmaWxlcGF0aCkge1xuICByZXR1cm4gbmV3IGxhenlzdHJlYW0uUmVhZGFibGUoZnVuY3Rpb24oKSB7XG4gICAgcmV0dXJuIGZzLmNyZWF0ZVJlYWRTdHJlYW0oZmlsZXBhdGgpO1xuICB9KTtcbn07XG5cbnV0aWxzLm5vcm1hbGl6ZUlucHV0U291cmNlID0gZnVuY3Rpb24oc291cmNlKSB7XG4gIGlmIChzb3VyY2UgPT09IG51bGwpIHtcbiAgICByZXR1cm4gQnVmZmVyLmFsbG9jKDApO1xuICB9IGVsc2UgaWYgKHR5cGVvZiBzb3VyY2UgPT09ICdzdHJpbmcnKSB7XG4gICAgcmV0dXJuIEJ1ZmZlci5mcm9tKHNvdXJjZSk7XG4gIH0gZWxzZSBpZiAodXRpbHMuaXNTdHJlYW0oc291cmNlKSkge1xuICAgIC8vIEFsd2F5cyBwaXBlIHRocm91Z2ggYSBQYXNzVGhyb3VnaCBzdHJlYW0gdG8gZ3VhcmFudGVlIHBhdXNpbmcgdGhlIHN0cmVhbSBpZiBpdCdzIGFscmVhZHkgZmxvd2luZyxcbiAgICAvLyBzaW5jZSBpdCB3aWxsIG9ubHkgYmUgcHJvY2Vzc2VkIGluIGEgKGRpc3RhbnQpIGZ1dHVyZSBpdGVyYXRpb24gb2YgdGhlIGV2ZW50IGxvb3AsIGFuZCB3aWxsIGxvc2VcbiAgICAvLyBkYXRhIGlmIGFscmVhZHkgZmxvd2luZyBub3cuXG4gICAgcmV0dXJuIHNvdXJjZS5waXBlKG5ldyBQYXNzVGhyb3VnaCgpKTtcbiAgfVxuXG4gIHJldHVybiBzb3VyY2U7XG59O1xuXG51dGlscy5zYW5pdGl6ZVBhdGggPSBmdW5jdGlvbihmaWxlcGF0aCkge1xuICByZXR1cm4gbm9ybWFsaXplUGF0aChmaWxlcGF0aCwgZmFsc2UpLnJlcGxhY2UoL15cXHcrOi8sICcnKS5yZXBsYWNlKC9eKFxcLlxcLlxcL3xcXC8pKy8sICcnKTtcbn07XG5cbnV0aWxzLnRyYWlsaW5nU2xhc2hJdCA9IGZ1bmN0aW9uKHN0cikge1xuICByZXR1cm4gc3RyLnNsaWNlKC0xKSAhPT0gJy8nID8gc3RyICsgJy8nIDogc3RyO1xufTtcblxudXRpbHMudW5peGlmeVBhdGggPSBmdW5jdGlvbihmaWxlcGF0aCkge1xuICByZXR1cm4gbm9ybWFsaXplUGF0aChmaWxlcGF0aCwgZmFsc2UpLnJlcGxhY2UoL15cXHcrOi8sICcnKTtcbn07XG5cbnV0aWxzLndhbGtkaXIgPSBmdW5jdGlvbihkaXJwYXRoLCBiYXNlLCBjYWxsYmFjaykge1xuICB2YXIgcmVzdWx0cyA9IFtdO1xuXG4gIGlmICh0eXBlb2YgYmFzZSA9PT0gJ2Z1bmN0aW9uJykge1xuICAgIGNhbGxiYWNrID0gYmFzZTtcbiAgICBiYXNlID0gZGlycGF0aDtcbiAgfVxuXG4gIGZzLnJlYWRkaXIoZGlycGF0aCwgZnVuY3Rpb24oZXJyLCBsaXN0KSB7XG4gICAgdmFyIGkgPSAwO1xuICAgIHZhciBmaWxlO1xuICAgIHZhciBmaWxlcGF0aDtcblxuICAgIGlmIChlcnIpIHtcbiAgICAgIHJldHVybiBjYWxsYmFjayhlcnIpO1xuICAgIH1cblxuICAgIChmdW5jdGlvbiBuZXh0KCkge1xuICAgICAgZmlsZSA9IGxpc3RbaSsrXTtcblxuICAgICAgaWYgKCFmaWxlKSB7XG4gICAgICAgIHJldHVybiBjYWxsYmFjayhudWxsLCByZXN1bHRzKTtcbiAgICAgIH1cblxuICAgICAgZmlsZXBhdGggPSBwYXRoLmpvaW4oZGlycGF0aCwgZmlsZSk7XG5cbiAgICAgIGZzLnN0YXQoZmlsZXBhdGgsIGZ1bmN0aW9uKGVyciwgc3RhdHMpIHtcbiAgICAgICAgcmVzdWx0cy5wdXNoKHtcbiAgICAgICAgICBwYXRoOiBmaWxlcGF0aCxcbiAgICAgICAgICByZWxhdGl2ZTogcGF0aC5yZWxhdGl2ZShiYXNlLCBmaWxlcGF0aCkucmVwbGFjZSgvXFxcXC9nLCAnLycpLFxuICAgICAgICAgIHN0YXRzOiBzdGF0c1xuICAgICAgICB9KTtcblxuICAgICAgICBpZiAoc3RhdHMgJiYgc3RhdHMuaXNEaXJlY3RvcnkoKSkge1xuICAgICAgICAgIHV0aWxzLndhbGtkaXIoZmlsZXBhdGgsIGJhc2UsIGZ1bmN0aW9uKGVyciwgcmVzKSB7XG5cdCAgICBpZihlcnIpe1xuXHQgICAgICByZXR1cm4gY2FsbGJhY2soZXJyKTtcblx0ICAgIH1cblxuICAgICAgICAgICAgcmVzLmZvckVhY2goZnVuY3Rpb24oZGlyRW50cnkpIHtcbiAgICAgICAgICAgICAgcmVzdWx0cy5wdXNoKGRpckVudHJ5KTtcbiAgICAgICAgICAgIH0pO1xuXHRcdCAgXG4gICAgICAgICAgICBuZXh0KCk7ICBcbiAgICAgICAgICB9KTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBuZXh0KCk7XG4gICAgICAgIH1cbiAgICAgIH0pO1xuICAgIH0pKCk7XG4gIH0pO1xufTtcbiIsCiAgICAiLyoqXG4gKiBBcmNoaXZlciBDb3JlXG4gKlxuICogQGlnbm9yZVxuICogQGxpY2Vuc2UgW01JVF17QGxpbmsgaHR0cHM6Ly9naXRodWIuY29tL2FyY2hpdmVyanMvbm9kZS1hcmNoaXZlci9ibG9iL21hc3Rlci9MSUNFTlNFfVxuICogQGNvcHlyaWdodCAoYykgMjAxMi0yMDE0IENocmlzIFRhbGtpbmd0b24sIGNvbnRyaWJ1dG9ycy5cbiAqL1xuXG52YXIgdXRpbCA9IHJlcXVpcmUoJ3V0aWwnKTtcblxuY29uc3QgRVJST1JfQ09ERVMgPSB7XG4gICdBQk9SVEVEJzogJ2FyY2hpdmUgd2FzIGFib3J0ZWQnLFxuICAnRElSRUNUT1JZRElSUEFUSFJFUVVJUkVEJzogJ2RpcmV0b3J5IGRpcnBhdGggYXJndW1lbnQgbXVzdCBiZSBhIG5vbi1lbXB0eSBzdHJpbmcgdmFsdWUnLFxuICAnRElSRUNUT1JZRlVOQ1RJT05JTlZBTElEREFUQSc6ICdpbnZhbGlkIGRhdGEgcmV0dXJuZWQgYnkgZGlyZWN0b3J5IGN1c3RvbSBkYXRhIGZ1bmN0aW9uJyxcbiAgJ0VOVFJZTkFNRVJFUVVJUkVEJzogJ2VudHJ5IG5hbWUgbXVzdCBiZSBhIG5vbi1lbXB0eSBzdHJpbmcgdmFsdWUnLFxuICAnRklMRUZJTEVQQVRIUkVRVUlSRUQnOiAnZmlsZSBmaWxlcGF0aCBhcmd1bWVudCBtdXN0IGJlIGEgbm9uLWVtcHR5IHN0cmluZyB2YWx1ZScsXG4gICdGSU5BTElaSU5HJzogJ2FyY2hpdmUgYWxyZWFkeSBmaW5hbGl6aW5nJyxcbiAgJ1FVRVVFQ0xPU0VEJzogJ3F1ZXVlIGNsb3NlZCcsXG4gICdOT0VORE1FVEhPRCc6ICdubyBzdWl0YWJsZSBmaW5hbGl6ZS9lbmQgbWV0aG9kIGRlZmluZWQgYnkgbW9kdWxlJyxcbiAgJ0RJUkVDVE9SWU5PVFNVUFBPUlRFRCc6ICdzdXBwb3J0IGZvciBkaXJlY3RvcnkgZW50cmllcyBub3QgZGVmaW5lZCBieSBtb2R1bGUnLFxuICAnRk9STUFUU0VUJzogJ2FyY2hpdmUgZm9ybWF0IGFscmVhZHkgc2V0JyxcbiAgJ0lOUFVUU1RFQU1CVUZGRVJSRVFVSVJFRCc6ICdpbnB1dCBzb3VyY2UgbXVzdCBiZSB2YWxpZCBTdHJlYW0gb3IgQnVmZmVyIGluc3RhbmNlJyxcbiAgJ01PRFVMRVNFVCc6ICdtb2R1bGUgYWxyZWFkeSBzZXQnLFxuICAnU1lNTElOS05PVFNVUFBPUlRFRCc6ICdzdXBwb3J0IGZvciBzeW1saW5rIGVudHJpZXMgbm90IGRlZmluZWQgYnkgbW9kdWxlJyxcbiAgJ1NZTUxJTktGSUxFUEFUSFJFUVVJUkVEJzogJ3N5bWxpbmsgZmlsZXBhdGggYXJndW1lbnQgbXVzdCBiZSBhIG5vbi1lbXB0eSBzdHJpbmcgdmFsdWUnLFxuICAnU1lNTElOS1RBUkdFVFJFUVVJUkVEJzogJ3N5bWxpbmsgdGFyZ2V0IGFyZ3VtZW50IG11c3QgYmUgYSBub24tZW1wdHkgc3RyaW5nIHZhbHVlJyxcbiAgJ0VOVFJZTk9UU1VQUE9SVEVEJzogJ2VudHJ5IG5vdCBzdXBwb3J0ZWQnXG59O1xuXG5mdW5jdGlvbiBBcmNoaXZlckVycm9yKGNvZGUsIGRhdGEpIHtcbiAgRXJyb3IuY2FwdHVyZVN0YWNrVHJhY2UodGhpcywgdGhpcy5jb25zdHJ1Y3Rvcik7XG4gIC8vdGhpcy5uYW1lID0gdGhpcy5jb25zdHJ1Y3Rvci5uYW1lO1xuICB0aGlzLm1lc3NhZ2UgPSBFUlJPUl9DT0RFU1tjb2RlXSB8fCBjb2RlO1xuICB0aGlzLmNvZGUgPSBjb2RlO1xuICB0aGlzLmRhdGEgPSBkYXRhO1xufVxuXG51dGlsLmluaGVyaXRzKEFyY2hpdmVyRXJyb3IsIEVycm9yKTtcblxuZXhwb3J0cyA9IG1vZHVsZS5leHBvcnRzID0gQXJjaGl2ZXJFcnJvcjsiLAogICAgIi8qKlxuICogQXJjaGl2ZXIgQ29yZVxuICpcbiAqIEBpZ25vcmVcbiAqIEBsaWNlbnNlIFtNSVRde0BsaW5rIGh0dHBzOi8vZ2l0aHViLmNvbS9hcmNoaXZlcmpzL25vZGUtYXJjaGl2ZXIvYmxvYi9tYXN0ZXIvTElDRU5TRX1cbiAqIEBjb3B5cmlnaHQgKGMpIDIwMTItMjAxNCBDaHJpcyBUYWxraW5ndG9uLCBjb250cmlidXRvcnMuXG4gKi9cbnZhciBmcyA9IHJlcXVpcmUoJ2ZzJyk7XG52YXIgZ2xvYiA9IHJlcXVpcmUoJ3JlYWRkaXItZ2xvYicpO1xudmFyIGFzeW5jID0gcmVxdWlyZSgnYXN5bmMnKTtcbnZhciBwYXRoID0gcmVxdWlyZSgncGF0aCcpO1xudmFyIHV0aWwgPSByZXF1aXJlKCdhcmNoaXZlci11dGlscycpO1xuXG52YXIgaW5oZXJpdHMgPSByZXF1aXJlKCd1dGlsJykuaW5oZXJpdHM7XG52YXIgQXJjaGl2ZXJFcnJvciA9IHJlcXVpcmUoJy4vZXJyb3InKTtcbnZhciBUcmFuc2Zvcm0gPSByZXF1aXJlKCdyZWFkYWJsZS1zdHJlYW0nKS5UcmFuc2Zvcm07XG5cbnZhciB3aW4zMiA9IHByb2Nlc3MucGxhdGZvcm0gPT09ICd3aW4zMic7XG5cbi8qKlxuICogQGNvbnN0cnVjdG9yXG4gKiBAcGFyYW0ge1N0cmluZ30gZm9ybWF0IFRoZSBhcmNoaXZlIGZvcm1hdCB0byB1c2UuXG4gKiBAcGFyYW0geyhDb3JlT3B0aW9uc3xUcmFuc2Zvcm1PcHRpb25zKX0gb3B0aW9ucyBTZWUgYWxzbyB7QGxpbmsgWmlwT3B0aW9uc30gYW5kIHtAbGluayBUYXJPcHRpb25zfS5cbiAqL1xudmFyIEFyY2hpdmVyID0gZnVuY3Rpb24oZm9ybWF0LCBvcHRpb25zKSB7XG4gIGlmICghKHRoaXMgaW5zdGFuY2VvZiBBcmNoaXZlcikpIHtcbiAgICByZXR1cm4gbmV3IEFyY2hpdmVyKGZvcm1hdCwgb3B0aW9ucyk7XG4gIH1cblxuICBpZiAodHlwZW9mIGZvcm1hdCAhPT0gJ3N0cmluZycpIHtcbiAgICBvcHRpb25zID0gZm9ybWF0O1xuICAgIGZvcm1hdCA9ICd6aXAnO1xuICB9XG5cbiAgb3B0aW9ucyA9IHRoaXMub3B0aW9ucyA9IHV0aWwuZGVmYXVsdHMob3B0aW9ucywge1xuICAgIGhpZ2hXYXRlck1hcms6IDEwMjQgKiAxMDI0LFxuICAgIHN0YXRDb25jdXJyZW5jeTogNFxuICB9KTtcblxuICBUcmFuc2Zvcm0uY2FsbCh0aGlzLCBvcHRpb25zKTtcblxuICB0aGlzLl9mb3JtYXQgPSBmYWxzZTtcbiAgdGhpcy5fbW9kdWxlID0gZmFsc2U7XG4gIHRoaXMuX3BlbmRpbmcgPSAwO1xuICB0aGlzLl9wb2ludGVyID0gMDtcblxuICB0aGlzLl9lbnRyaWVzQ291bnQgPSAwO1xuICB0aGlzLl9lbnRyaWVzUHJvY2Vzc2VkQ291bnQgPSAwO1xuICB0aGlzLl9mc0VudHJpZXNUb3RhbEJ5dGVzID0gMDtcbiAgdGhpcy5fZnNFbnRyaWVzUHJvY2Vzc2VkQnl0ZXMgPSAwO1xuXG4gIHRoaXMuX3F1ZXVlID0gYXN5bmMucXVldWUodGhpcy5fb25RdWV1ZVRhc2suYmluZCh0aGlzKSwgMSk7XG4gIHRoaXMuX3F1ZXVlLmRyYWluKHRoaXMuX29uUXVldWVEcmFpbi5iaW5kKHRoaXMpKTtcblxuICB0aGlzLl9zdGF0UXVldWUgPSBhc3luYy5xdWV1ZSh0aGlzLl9vblN0YXRRdWV1ZVRhc2suYmluZCh0aGlzKSwgb3B0aW9ucy5zdGF0Q29uY3VycmVuY3kpO1xuICB0aGlzLl9zdGF0UXVldWUuZHJhaW4odGhpcy5fb25RdWV1ZURyYWluLmJpbmQodGhpcykpO1xuXG4gIHRoaXMuX3N0YXRlID0ge1xuICAgIGFib3J0ZWQ6IGZhbHNlLFxuICAgIGZpbmFsaXplOiBmYWxzZSxcbiAgICBmaW5hbGl6aW5nOiBmYWxzZSxcbiAgICBmaW5hbGl6ZWQ6IGZhbHNlLFxuICAgIG1vZHVsZVBpcGVkOiBmYWxzZVxuICB9O1xuXG4gIHRoaXMuX3N0cmVhbXMgPSBbXTtcbn07XG5cbmluaGVyaXRzKEFyY2hpdmVyLCBUcmFuc2Zvcm0pO1xuXG4vKipcbiAqIEludGVybmFsIGxvZ2ljIGZvciBgYWJvcnRgLlxuICpcbiAqIEBwcml2YXRlXG4gKiBAcmV0dXJuIHZvaWRcbiAqL1xuQXJjaGl2ZXIucHJvdG90eXBlLl9hYm9ydCA9IGZ1bmN0aW9uKCkge1xuICB0aGlzLl9zdGF0ZS5hYm9ydGVkID0gdHJ1ZTtcbiAgdGhpcy5fcXVldWUua2lsbCgpO1xuICB0aGlzLl9zdGF0UXVldWUua2lsbCgpO1xuXG4gIGlmICh0aGlzLl9xdWV1ZS5pZGxlKCkpIHtcbiAgICB0aGlzLl9zaHV0ZG93bigpO1xuICB9XG59O1xuXG4vKipcbiAqIEludGVybmFsIGhlbHBlciBmb3IgYXBwZW5kaW5nIGZpbGVzLlxuICpcbiAqIEBwcml2YXRlXG4gKiBAcGFyYW0gIHtTdHJpbmd9IGZpbGVwYXRoIFRoZSBzb3VyY2UgZmlsZXBhdGguXG4gKiBAcGFyYW0gIHtFbnRyeURhdGF9IGRhdGEgVGhlIGVudHJ5IGRhdGEuXG4gKiBAcmV0dXJuIHZvaWRcbiAqL1xuQXJjaGl2ZXIucHJvdG90eXBlLl9hcHBlbmQgPSBmdW5jdGlvbihmaWxlcGF0aCwgZGF0YSkge1xuICBkYXRhID0gZGF0YSB8fCB7fTtcblxuICB2YXIgdGFzayA9IHtcbiAgICBzb3VyY2U6IG51bGwsXG4gICAgZmlsZXBhdGg6IGZpbGVwYXRoXG4gIH07XG5cbiAgaWYgKCFkYXRhLm5hbWUpIHtcbiAgICBkYXRhLm5hbWUgPSBmaWxlcGF0aDtcbiAgfVxuXG4gIGRhdGEuc291cmNlUGF0aCA9IGZpbGVwYXRoO1xuICB0YXNrLmRhdGEgPSBkYXRhO1xuICB0aGlzLl9lbnRyaWVzQ291bnQrKztcblxuICBpZiAoZGF0YS5zdGF0cyAmJiBkYXRhLnN0YXRzIGluc3RhbmNlb2YgZnMuU3RhdHMpIHtcbiAgICB0YXNrID0gdGhpcy5fdXBkYXRlUXVldWVUYXNrV2l0aFN0YXRzKHRhc2ssIGRhdGEuc3RhdHMpO1xuICAgIGlmICh0YXNrKSB7XG4gICAgICBpZiAoZGF0YS5zdGF0cy5zaXplKSB7XG4gICAgICAgIHRoaXMuX2ZzRW50cmllc1RvdGFsQnl0ZXMgKz0gZGF0YS5zdGF0cy5zaXplO1xuICAgICAgfVxuXG4gICAgICB0aGlzLl9xdWV1ZS5wdXNoKHRhc2spO1xuICAgIH1cbiAgfSBlbHNlIHtcbiAgICB0aGlzLl9zdGF0UXVldWUucHVzaCh0YXNrKTtcbiAgfVxufTtcblxuLyoqXG4gKiBJbnRlcm5hbCBsb2dpYyBmb3IgYGZpbmFsaXplYC5cbiAqXG4gKiBAcHJpdmF0ZVxuICogQHJldHVybiB2b2lkXG4gKi9cbkFyY2hpdmVyLnByb3RvdHlwZS5fZmluYWxpemUgPSBmdW5jdGlvbigpIHtcbiAgaWYgKHRoaXMuX3N0YXRlLmZpbmFsaXppbmcgfHwgdGhpcy5fc3RhdGUuZmluYWxpemVkIHx8IHRoaXMuX3N0YXRlLmFib3J0ZWQpIHtcbiAgICByZXR1cm47XG4gIH1cblxuICB0aGlzLl9zdGF0ZS5maW5hbGl6aW5nID0gdHJ1ZTtcblxuICB0aGlzLl9tb2R1bGVGaW5hbGl6ZSgpO1xuXG4gIHRoaXMuX3N0YXRlLmZpbmFsaXppbmcgPSBmYWxzZTtcbiAgdGhpcy5fc3RhdGUuZmluYWxpemVkID0gdHJ1ZTtcbn07XG5cbi8qKlxuICogQ2hlY2tzIHRoZSB2YXJpb3VzIHN0YXRlIHZhcmlhYmxlcyB0byBkZXRlcm1pbmUgaWYgd2UgY2FuIGBmaW5hbGl6ZWAuXG4gKlxuICogQHByaXZhdGVcbiAqIEByZXR1cm4ge0Jvb2xlYW59XG4gKi9cbkFyY2hpdmVyLnByb3RvdHlwZS5fbWF5YmVGaW5hbGl6ZSA9IGZ1bmN0aW9uKCkge1xuICBpZiAodGhpcy5fc3RhdGUuZmluYWxpemluZyB8fCB0aGlzLl9zdGF0ZS5maW5hbGl6ZWQgfHwgdGhpcy5fc3RhdGUuYWJvcnRlZCkge1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuXG4gIGlmICh0aGlzLl9zdGF0ZS5maW5hbGl6ZSAmJiB0aGlzLl9wZW5kaW5nID09PSAwICYmIHRoaXMuX3F1ZXVlLmlkbGUoKSAmJiB0aGlzLl9zdGF0UXVldWUuaWRsZSgpKSB7XG4gICAgdGhpcy5fZmluYWxpemUoKTtcbiAgICByZXR1cm4gdHJ1ZTtcbiAgfVxuXG4gIHJldHVybiBmYWxzZTtcbn07XG5cbi8qKlxuICogQXBwZW5kcyBhbiBlbnRyeSB0byB0aGUgbW9kdWxlLlxuICpcbiAqIEBwcml2YXRlXG4gKiBAZmlyZXMgIEFyY2hpdmVyI2VudHJ5XG4gKiBAcGFyYW0gIHsoQnVmZmVyfFN0cmVhbSl9IHNvdXJjZVxuICogQHBhcmFtICB7RW50cnlEYXRhfSBkYXRhXG4gKiBAcGFyYW0gIHtGdW5jdGlvbn0gY2FsbGJhY2tcbiAqIEByZXR1cm4gdm9pZFxuICovXG5BcmNoaXZlci5wcm90b3R5cGUuX21vZHVsZUFwcGVuZCA9IGZ1bmN0aW9uKHNvdXJjZSwgZGF0YSwgY2FsbGJhY2spIHtcbiAgaWYgKHRoaXMuX3N0YXRlLmFib3J0ZWQpIHtcbiAgICBjYWxsYmFjaygpO1xuICAgIHJldHVybjtcbiAgfVxuXG4gIHRoaXMuX21vZHVsZS5hcHBlbmQoc291cmNlLCBkYXRhLCBmdW5jdGlvbihlcnIpIHtcbiAgICB0aGlzLl90YXNrID0gbnVsbDtcblxuICAgIGlmICh0aGlzLl9zdGF0ZS5hYm9ydGVkKSB7XG4gICAgICB0aGlzLl9zaHV0ZG93bigpO1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGlmIChlcnIpIHtcbiAgICAgIHRoaXMuZW1pdCgnZXJyb3InLCBlcnIpO1xuICAgICAgc2V0SW1tZWRpYXRlKGNhbGxiYWNrKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBGaXJlcyB3aGVuIHRoZSBlbnRyeSdzIGlucHV0IGhhcyBiZWVuIHByb2Nlc3NlZCBhbmQgYXBwZW5kZWQgdG8gdGhlIGFyY2hpdmUuXG4gICAgICpcbiAgICAgKiBAZXZlbnQgQXJjaGl2ZXIjZW50cnlcbiAgICAgKiBAdHlwZSB7RW50cnlEYXRhfVxuICAgICAqL1xuICAgIHRoaXMuZW1pdCgnZW50cnknLCBkYXRhKTtcbiAgICB0aGlzLl9lbnRyaWVzUHJvY2Vzc2VkQ291bnQrKztcblxuICAgIGlmIChkYXRhLnN0YXRzICYmIGRhdGEuc3RhdHMuc2l6ZSkge1xuICAgICAgdGhpcy5fZnNFbnRyaWVzUHJvY2Vzc2VkQnl0ZXMgKz0gZGF0YS5zdGF0cy5zaXplO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEBldmVudCBBcmNoaXZlciNwcm9ncmVzc1xuICAgICAqIEB0eXBlIHtQcm9ncmVzc0RhdGF9XG4gICAgICovXG4gICAgdGhpcy5lbWl0KCdwcm9ncmVzcycsIHtcbiAgICAgIGVudHJpZXM6IHtcbiAgICAgICAgdG90YWw6IHRoaXMuX2VudHJpZXNDb3VudCxcbiAgICAgICAgcHJvY2Vzc2VkOiB0aGlzLl9lbnRyaWVzUHJvY2Vzc2VkQ291bnRcbiAgICAgIH0sXG4gICAgICBmczoge1xuICAgICAgICB0b3RhbEJ5dGVzOiB0aGlzLl9mc0VudHJpZXNUb3RhbEJ5dGVzLFxuICAgICAgICBwcm9jZXNzZWRCeXRlczogdGhpcy5fZnNFbnRyaWVzUHJvY2Vzc2VkQnl0ZXNcbiAgICAgIH1cbiAgICB9KTtcblxuICAgIHNldEltbWVkaWF0ZShjYWxsYmFjayk7XG4gIH0uYmluZCh0aGlzKSk7XG59O1xuXG4vKipcbiAqIEZpbmFsaXplcyB0aGUgbW9kdWxlLlxuICpcbiAqIEBwcml2YXRlXG4gKiBAcmV0dXJuIHZvaWRcbiAqL1xuQXJjaGl2ZXIucHJvdG90eXBlLl9tb2R1bGVGaW5hbGl6ZSA9IGZ1bmN0aW9uKCkge1xuICBpZiAodHlwZW9mIHRoaXMuX21vZHVsZS5maW5hbGl6ZSA9PT0gJ2Z1bmN0aW9uJykge1xuICAgIHRoaXMuX21vZHVsZS5maW5hbGl6ZSgpO1xuICB9IGVsc2UgaWYgKHR5cGVvZiB0aGlzLl9tb2R1bGUuZW5kID09PSAnZnVuY3Rpb24nKSB7XG4gICAgdGhpcy5fbW9kdWxlLmVuZCgpO1xuICB9IGVsc2Uge1xuICAgIHRoaXMuZW1pdCgnZXJyb3InLCBuZXcgQXJjaGl2ZXJFcnJvcignTk9FTkRNRVRIT0QnKSk7XG4gIH1cbn07XG5cbi8qKlxuICogUGlwZXMgdGhlIG1vZHVsZSB0byBvdXIgaW50ZXJuYWwgc3RyZWFtIHdpdGggZXJyb3IgYnViYmxpbmcuXG4gKlxuICogQHByaXZhdGVcbiAqIEByZXR1cm4gdm9pZFxuICovXG5BcmNoaXZlci5wcm90b3R5cGUuX21vZHVsZVBpcGUgPSBmdW5jdGlvbigpIHtcbiAgdGhpcy5fbW9kdWxlLm9uKCdlcnJvcicsIHRoaXMuX29uTW9kdWxlRXJyb3IuYmluZCh0aGlzKSk7XG4gIHRoaXMuX21vZHVsZS5waXBlKHRoaXMpO1xuICB0aGlzLl9zdGF0ZS5tb2R1bGVQaXBlZCA9IHRydWU7XG59O1xuXG4vKipcbiAqIERldGVybWluZXMgaWYgdGhlIGN1cnJlbnQgbW9kdWxlIHN1cHBvcnRzIGEgZGVmaW5lZCBmZWF0dXJlLlxuICpcbiAqIEBwcml2YXRlXG4gKiBAcGFyYW0gIHtTdHJpbmd9IGtleVxuICogQHJldHVybiB7Qm9vbGVhbn1cbiAqL1xuQXJjaGl2ZXIucHJvdG90eXBlLl9tb2R1bGVTdXBwb3J0cyA9IGZ1bmN0aW9uKGtleSkge1xuICBpZiAoIXRoaXMuX21vZHVsZS5zdXBwb3J0cyB8fCAhdGhpcy5fbW9kdWxlLnN1cHBvcnRzW2tleV0pIHtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cblxuICByZXR1cm4gdGhpcy5fbW9kdWxlLnN1cHBvcnRzW2tleV07XG59O1xuXG4vKipcbiAqIFVucGlwZXMgdGhlIG1vZHVsZSBmcm9tIG91ciBpbnRlcm5hbCBzdHJlYW0uXG4gKlxuICogQHByaXZhdGVcbiAqIEByZXR1cm4gdm9pZFxuICovXG5BcmNoaXZlci5wcm90b3R5cGUuX21vZHVsZVVucGlwZSA9IGZ1bmN0aW9uKCkge1xuICB0aGlzLl9tb2R1bGUudW5waXBlKHRoaXMpO1xuICB0aGlzLl9zdGF0ZS5tb2R1bGVQaXBlZCA9IGZhbHNlO1xufTtcblxuLyoqXG4gKiBOb3JtYWxpemVzIGVudHJ5IGRhdGEgd2l0aCBmYWxsYmFja3MgZm9yIGtleSBwcm9wZXJ0aWVzLlxuICpcbiAqIEBwcml2YXRlXG4gKiBAcGFyYW0gIHtPYmplY3R9IGRhdGFcbiAqIEBwYXJhbSAge2ZzLlN0YXRzfSBzdGF0c1xuICogQHJldHVybiB7T2JqZWN0fVxuICovXG5BcmNoaXZlci5wcm90b3R5cGUuX25vcm1hbGl6ZUVudHJ5RGF0YSA9IGZ1bmN0aW9uKGRhdGEsIHN0YXRzKSB7XG4gIGRhdGEgPSB1dGlsLmRlZmF1bHRzKGRhdGEsIHtcbiAgICB0eXBlOiAnZmlsZScsXG4gICAgbmFtZTogbnVsbCxcbiAgICBkYXRlOiBudWxsLFxuICAgIG1vZGU6IG51bGwsXG4gICAgcHJlZml4OiBudWxsLFxuICAgIHNvdXJjZVBhdGg6IG51bGwsXG4gICAgc3RhdHM6IGZhbHNlXG4gIH0pO1xuXG4gIGlmIChzdGF0cyAmJiBkYXRhLnN0YXRzID09PSBmYWxzZSkge1xuICAgIGRhdGEuc3RhdHMgPSBzdGF0cztcbiAgfVxuXG4gIHZhciBpc0RpciA9IGRhdGEudHlwZSA9PT0gJ2RpcmVjdG9yeSc7XG5cbiAgaWYgKGRhdGEubmFtZSkge1xuICAgIGlmICh0eXBlb2YgZGF0YS5wcmVmaXggPT09ICdzdHJpbmcnICYmICcnICE9PSBkYXRhLnByZWZpeCkge1xuICAgICAgZGF0YS5uYW1lID0gZGF0YS5wcmVmaXggKyAnLycgKyBkYXRhLm5hbWU7XG4gICAgICBkYXRhLnByZWZpeCA9IG51bGw7XG4gICAgfVxuXG4gICAgZGF0YS5uYW1lID0gdXRpbC5zYW5pdGl6ZVBhdGgoZGF0YS5uYW1lKTtcblxuICAgIGlmIChkYXRhLnR5cGUgIT09ICdzeW1saW5rJyAmJiBkYXRhLm5hbWUuc2xpY2UoLTEpID09PSAnLycpIHtcbiAgICAgIGlzRGlyID0gdHJ1ZTtcbiAgICAgIGRhdGEudHlwZSA9ICdkaXJlY3RvcnknO1xuICAgIH0gZWxzZSBpZiAoaXNEaXIpIHtcbiAgICAgIGRhdGEubmFtZSArPSAnLyc7XG4gICAgfVxuICB9XG5cbiAgLy8gNTExID09PSAwNzc3OyA0OTMgPT09IDA3NTU7IDQzOCA9PT0gMDY2NjsgNDIwID09PSAwNjQ0XG4gIGlmICh0eXBlb2YgZGF0YS5tb2RlID09PSAnbnVtYmVyJykge1xuICAgIGlmICh3aW4zMikge1xuICAgICAgZGF0YS5tb2RlICY9IDUxMTtcbiAgICB9IGVsc2Uge1xuICAgICAgZGF0YS5tb2RlICY9IDQwOTVcbiAgICB9XG4gIH0gZWxzZSBpZiAoZGF0YS5zdGF0cyAmJiBkYXRhLm1vZGUgPT09IG51bGwpIHtcbiAgICBpZiAod2luMzIpIHtcbiAgICAgIGRhdGEubW9kZSA9IGRhdGEuc3RhdHMubW9kZSAmIDUxMTtcbiAgICB9IGVsc2Uge1xuICAgICAgZGF0YS5tb2RlID0gZGF0YS5zdGF0cy5tb2RlICYgNDA5NTtcbiAgICB9XG5cbiAgICAvLyBzdGF0IGlzbid0IHJlbGlhYmxlIG9uIHdpbmRvd3M7IGZvcmNlIDA3NTUgZm9yIGRpclxuICAgIGlmICh3aW4zMiAmJiBpc0Rpcikge1xuICAgICAgZGF0YS5tb2RlID0gNDkzO1xuICAgIH1cbiAgfSBlbHNlIGlmIChkYXRhLm1vZGUgPT09IG51bGwpIHtcbiAgICBkYXRhLm1vZGUgPSBpc0RpciA/IDQ5MyA6IDQyMDtcbiAgfVxuXG4gIGlmIChkYXRhLnN0YXRzICYmIGRhdGEuZGF0ZSA9PT0gbnVsbCkge1xuICAgIGRhdGEuZGF0ZSA9IGRhdGEuc3RhdHMubXRpbWU7XG4gIH0gZWxzZSB7XG4gICAgZGF0YS5kYXRlID0gdXRpbC5kYXRlaWZ5KGRhdGEuZGF0ZSk7XG4gIH1cblxuICByZXR1cm4gZGF0YTtcbn07XG5cbi8qKlxuICogRXJyb3IgbGlzdGVuZXIgdGhhdCByZS1lbWl0cyBlcnJvciBvbiB0byBvdXIgaW50ZXJuYWwgc3RyZWFtLlxuICpcbiAqIEBwcml2YXRlXG4gKiBAcGFyYW0gIHtFcnJvcn0gZXJyXG4gKiBAcmV0dXJuIHZvaWRcbiAqL1xuQXJjaGl2ZXIucHJvdG90eXBlLl9vbk1vZHVsZUVycm9yID0gZnVuY3Rpb24oZXJyKSB7XG4gIC8qKlxuICAgKiBAZXZlbnQgQXJjaGl2ZXIjZXJyb3JcbiAgICogQHR5cGUge0Vycm9yRGF0YX1cbiAgICovXG4gIHRoaXMuZW1pdCgnZXJyb3InLCBlcnIpO1xufTtcblxuLyoqXG4gKiBDaGVja3MgdGhlIHZhcmlvdXMgc3RhdGUgdmFyaWFibGVzIGFmdGVyIHF1ZXVlIGhhcyBkcmFpbmVkIHRvIGRldGVybWluZSBpZlxuICogd2UgbmVlZCB0byBgZmluYWxpemVgLlxuICpcbiAqIEBwcml2YXRlXG4gKiBAcmV0dXJuIHZvaWRcbiAqL1xuQXJjaGl2ZXIucHJvdG90eXBlLl9vblF1ZXVlRHJhaW4gPSBmdW5jdGlvbigpIHtcbiAgaWYgKHRoaXMuX3N0YXRlLmZpbmFsaXppbmcgfHwgdGhpcy5fc3RhdGUuZmluYWxpemVkIHx8IHRoaXMuX3N0YXRlLmFib3J0ZWQpIHtcbiAgICByZXR1cm47XG4gIH1cblxuICBpZiAodGhpcy5fc3RhdGUuZmluYWxpemUgJiYgdGhpcy5fcGVuZGluZyA9PT0gMCAmJiB0aGlzLl9xdWV1ZS5pZGxlKCkgJiYgdGhpcy5fc3RhdFF1ZXVlLmlkbGUoKSkge1xuICAgIHRoaXMuX2ZpbmFsaXplKCk7XG4gIH1cbn07XG5cbi8qKlxuICogQXBwZW5kcyBlYWNoIHF1ZXVlIHRhc2sgdG8gdGhlIG1vZHVsZS5cbiAqXG4gKiBAcHJpdmF0ZVxuICogQHBhcmFtICB7T2JqZWN0fSB0YXNrXG4gKiBAcGFyYW0gIHtGdW5jdGlvbn0gY2FsbGJhY2tcbiAqIEByZXR1cm4gdm9pZFxuICovXG5BcmNoaXZlci5wcm90b3R5cGUuX29uUXVldWVUYXNrID0gZnVuY3Rpb24odGFzaywgY2FsbGJhY2spIHtcbiAgdmFyIGZ1bGxDYWxsYmFjayA9ICgpID0+IHtcbiAgICBpZih0YXNrLmRhdGEuY2FsbGJhY2spIHtcbiAgICAgIHRhc2suZGF0YS5jYWxsYmFjaygpO1xuICAgIH1cbiAgICBjYWxsYmFjaygpO1xuICB9XG5cbiAgaWYgKHRoaXMuX3N0YXRlLmZpbmFsaXppbmcgfHwgdGhpcy5fc3RhdGUuZmluYWxpemVkIHx8IHRoaXMuX3N0YXRlLmFib3J0ZWQpIHtcbiAgICBmdWxsQ2FsbGJhY2soKTtcbiAgICByZXR1cm47XG4gIH1cblxuICB0aGlzLl90YXNrID0gdGFzaztcbiAgdGhpcy5fbW9kdWxlQXBwZW5kKHRhc2suc291cmNlLCB0YXNrLmRhdGEsIGZ1bGxDYWxsYmFjayk7XG59O1xuXG4vKipcbiAqIFBlcmZvcm1zIGEgZmlsZSBzdGF0IGFuZCByZWluamVjdHMgdGhlIHRhc2sgYmFjayBpbnRvIHRoZSBxdWV1ZS5cbiAqXG4gKiBAcHJpdmF0ZVxuICogQHBhcmFtICB7T2JqZWN0fSB0YXNrXG4gKiBAcGFyYW0gIHtGdW5jdGlvbn0gY2FsbGJhY2tcbiAqIEByZXR1cm4gdm9pZFxuICovXG5BcmNoaXZlci5wcm90b3R5cGUuX29uU3RhdFF1ZXVlVGFzayA9IGZ1bmN0aW9uKHRhc2ssIGNhbGxiYWNrKSB7XG4gIGlmICh0aGlzLl9zdGF0ZS5maW5hbGl6aW5nIHx8IHRoaXMuX3N0YXRlLmZpbmFsaXplZCB8fCB0aGlzLl9zdGF0ZS5hYm9ydGVkKSB7XG4gICAgY2FsbGJhY2soKTtcbiAgICByZXR1cm47XG4gIH1cblxuICBmcy5sc3RhdCh0YXNrLmZpbGVwYXRoLCBmdW5jdGlvbihlcnIsIHN0YXRzKSB7XG4gICAgaWYgKHRoaXMuX3N0YXRlLmFib3J0ZWQpIHtcbiAgICAgIHNldEltbWVkaWF0ZShjYWxsYmFjayk7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgaWYgKGVycikge1xuICAgICAgdGhpcy5fZW50cmllc0NvdW50LS07XG5cbiAgICAgIC8qKlxuICAgICAgICogQGV2ZW50IEFyY2hpdmVyI3dhcm5pbmdcbiAgICAgICAqIEB0eXBlIHtFcnJvckRhdGF9XG4gICAgICAgKi9cbiAgICAgIHRoaXMuZW1pdCgnd2FybmluZycsIGVycik7XG4gICAgICBzZXRJbW1lZGlhdGUoY2FsbGJhY2spO1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIHRhc2sgPSB0aGlzLl91cGRhdGVRdWV1ZVRhc2tXaXRoU3RhdHModGFzaywgc3RhdHMpO1xuXG4gICAgaWYgKHRhc2spIHtcbiAgICAgIGlmIChzdGF0cy5zaXplKSB7XG4gICAgICAgIHRoaXMuX2ZzRW50cmllc1RvdGFsQnl0ZXMgKz0gc3RhdHMuc2l6ZTtcbiAgICAgIH1cblxuICAgICAgdGhpcy5fcXVldWUucHVzaCh0YXNrKTtcbiAgICB9XG5cbiAgICBzZXRJbW1lZGlhdGUoY2FsbGJhY2spO1xuICB9LmJpbmQodGhpcykpO1xufTtcblxuLyoqXG4gKiBVbnBpcGVzIHRoZSBtb2R1bGUgYW5kIGVuZHMgb3VyIGludGVybmFsIHN0cmVhbS5cbiAqXG4gKiBAcHJpdmF0ZVxuICogQHJldHVybiB2b2lkXG4gKi9cbkFyY2hpdmVyLnByb3RvdHlwZS5fc2h1dGRvd24gPSBmdW5jdGlvbigpIHtcbiAgdGhpcy5fbW9kdWxlVW5waXBlKCk7XG4gIHRoaXMuZW5kKCk7XG59O1xuXG4vKipcbiAqIFRyYWNrcyB0aGUgYnl0ZXMgZW1pdHRlZCBieSBvdXIgaW50ZXJuYWwgc3RyZWFtLlxuICpcbiAqIEBwcml2YXRlXG4gKiBAcGFyYW0gIHtCdWZmZXJ9IGNodW5rXG4gKiBAcGFyYW0gIHtTdHJpbmd9IGVuY29kaW5nXG4gKiBAcGFyYW0gIHtGdW5jdGlvbn0gY2FsbGJhY2tcbiAqIEByZXR1cm4gdm9pZFxuICovXG5BcmNoaXZlci5wcm90b3R5cGUuX3RyYW5zZm9ybSA9IGZ1bmN0aW9uKGNodW5rLCBlbmNvZGluZywgY2FsbGJhY2spIHtcbiAgaWYgKGNodW5rKSB7XG4gICAgdGhpcy5fcG9pbnRlciArPSBjaHVuay5sZW5ndGg7XG4gIH1cblxuICBjYWxsYmFjayhudWxsLCBjaHVuayk7XG59O1xuXG4vKipcbiAqIFVwZGF0ZXMgYW5kIG5vcm1hbGl6ZXMgYSBxdWV1ZSB0YXNrIHVzaW5nIHN0YXRzIGRhdGEuXG4gKlxuICogQHByaXZhdGVcbiAqIEBwYXJhbSAge09iamVjdH0gdGFza1xuICogQHBhcmFtICB7ZnMuU3RhdHN9IHN0YXRzXG4gKiBAcmV0dXJuIHtPYmplY3R9XG4gKi9cbkFyY2hpdmVyLnByb3RvdHlwZS5fdXBkYXRlUXVldWVUYXNrV2l0aFN0YXRzID0gZnVuY3Rpb24odGFzaywgc3RhdHMpIHtcbiAgaWYgKHN0YXRzLmlzRmlsZSgpKSB7XG4gICAgdGFzay5kYXRhLnR5cGUgPSAnZmlsZSc7XG4gICAgdGFzay5kYXRhLnNvdXJjZVR5cGUgPSAnc3RyZWFtJztcbiAgICB0YXNrLnNvdXJjZSA9IHV0aWwubGF6eVJlYWRTdHJlYW0odGFzay5maWxlcGF0aCk7XG4gIH0gZWxzZSBpZiAoc3RhdHMuaXNEaXJlY3RvcnkoKSAmJiB0aGlzLl9tb2R1bGVTdXBwb3J0cygnZGlyZWN0b3J5JykpIHtcbiAgICB0YXNrLmRhdGEubmFtZSA9IHV0aWwudHJhaWxpbmdTbGFzaEl0KHRhc2suZGF0YS5uYW1lKTtcbiAgICB0YXNrLmRhdGEudHlwZSA9ICdkaXJlY3RvcnknO1xuICAgIHRhc2suZGF0YS5zb3VyY2VQYXRoID0gdXRpbC50cmFpbGluZ1NsYXNoSXQodGFzay5maWxlcGF0aCk7XG4gICAgdGFzay5kYXRhLnNvdXJjZVR5cGUgPSAnYnVmZmVyJztcbiAgICB0YXNrLnNvdXJjZSA9IEJ1ZmZlci5jb25jYXQoW10pO1xuICB9IGVsc2UgaWYgKHN0YXRzLmlzU3ltYm9saWNMaW5rKCkgJiYgdGhpcy5fbW9kdWxlU3VwcG9ydHMoJ3N5bWxpbmsnKSkge1xuICAgIHZhciBsaW5rUGF0aCA9IGZzLnJlYWRsaW5rU3luYyh0YXNrLmZpbGVwYXRoKTtcbiAgICB2YXIgZGlyTmFtZSA9IHBhdGguZGlybmFtZSh0YXNrLmZpbGVwYXRoKTtcbiAgICB0YXNrLmRhdGEudHlwZSA9ICdzeW1saW5rJztcbiAgICB0YXNrLmRhdGEubGlua25hbWUgPSBwYXRoLnJlbGF0aXZlKGRpck5hbWUsIHBhdGgucmVzb2x2ZShkaXJOYW1lLCBsaW5rUGF0aCkpO1xuICAgIHRhc2suZGF0YS5zb3VyY2VUeXBlID0gJ2J1ZmZlcic7XG4gICAgdGFzay5zb3VyY2UgPSBCdWZmZXIuY29uY2F0KFtdKTtcbiAgfSBlbHNlIHtcbiAgICBpZiAoc3RhdHMuaXNEaXJlY3RvcnkoKSkge1xuICAgICAgdGhpcy5lbWl0KCd3YXJuaW5nJywgbmV3IEFyY2hpdmVyRXJyb3IoJ0RJUkVDVE9SWU5PVFNVUFBPUlRFRCcsIHRhc2suZGF0YSkpO1xuICAgIH0gZWxzZSBpZiAoc3RhdHMuaXNTeW1ib2xpY0xpbmsoKSkge1xuICAgICAgdGhpcy5lbWl0KCd3YXJuaW5nJywgbmV3IEFyY2hpdmVyRXJyb3IoJ1NZTUxJTktOT1RTVVBQT1JURUQnLCB0YXNrLmRhdGEpKTtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5lbWl0KCd3YXJuaW5nJywgbmV3IEFyY2hpdmVyRXJyb3IoJ0VOVFJZTk9UU1VQUE9SVEVEJywgdGFzay5kYXRhKSk7XG4gICAgfVxuXG4gICAgcmV0dXJuIG51bGw7XG4gIH1cblxuICB0YXNrLmRhdGEgPSB0aGlzLl9ub3JtYWxpemVFbnRyeURhdGEodGFzay5kYXRhLCBzdGF0cyk7XG5cbiAgcmV0dXJuIHRhc2s7XG59O1xuXG4vKipcbiAqIEFib3J0cyB0aGUgYXJjaGl2aW5nIHByb2Nlc3MsIHRha2luZyBhIGJlc3QtZWZmb3J0IGFwcHJvYWNoLCBieTpcbiAqXG4gKiAtIHJlbW92aW5nIGFueSBwZW5kaW5nIHF1ZXVlIHRhc2tzXG4gKiAtIGFsbG93aW5nIGFueSBhY3RpdmUgcXVldWUgd29ya2VycyB0byBmaW5pc2hcbiAqIC0gZGV0YWNoaW5nIGludGVybmFsIG1vZHVsZSBwaXBlc1xuICogLSBlbmRpbmcgYm90aCBzaWRlcyBvZiB0aGUgVHJhbnNmb3JtIHN0cmVhbVxuICpcbiAqIEl0IHdpbGwgTk9UIGRyYWluIGFueSByZW1haW5pbmcgc291cmNlcy5cbiAqXG4gKiBAcmV0dXJuIHt0aGlzfVxuICovXG5BcmNoaXZlci5wcm90b3R5cGUuYWJvcnQgPSBmdW5jdGlvbigpIHtcbiAgaWYgKHRoaXMuX3N0YXRlLmFib3J0ZWQgfHwgdGhpcy5fc3RhdGUuZmluYWxpemVkKSB7XG4gICAgcmV0dXJuIHRoaXM7XG4gIH1cblxuICB0aGlzLl9hYm9ydCgpO1xuXG4gIHJldHVybiB0aGlzO1xufTtcblxuLyoqXG4gKiBBcHBlbmRzIGFuIGlucHV0IHNvdXJjZSAodGV4dCBzdHJpbmcsIGJ1ZmZlciwgb3Igc3RyZWFtKSB0byB0aGUgaW5zdGFuY2UuXG4gKlxuICogV2hlbiB0aGUgaW5zdGFuY2UgaGFzIHJlY2VpdmVkLCBwcm9jZXNzZWQsIGFuZCBlbWl0dGVkIHRoZSBpbnB1dCwgdGhlIGBlbnRyeWBcbiAqIGV2ZW50IGlzIGZpcmVkLlxuICpcbiAqIEBmaXJlcyAgQXJjaGl2ZXIjZW50cnlcbiAqIEBwYXJhbSAgeyhCdWZmZXJ8U3RyZWFtfFN0cmluZyl9IHNvdXJjZSBUaGUgaW5wdXQgc291cmNlLlxuICogQHBhcmFtICB7RW50cnlEYXRhfSBkYXRhIFNlZSBhbHNvIHtAbGluayBaaXBFbnRyeURhdGF9IGFuZCB7QGxpbmsgVGFyRW50cnlEYXRhfS5cbiAqIEByZXR1cm4ge3RoaXN9XG4gKi9cbkFyY2hpdmVyLnByb3RvdHlwZS5hcHBlbmQgPSBmdW5jdGlvbihzb3VyY2UsIGRhdGEpIHtcbiAgaWYgKHRoaXMuX3N0YXRlLmZpbmFsaXplIHx8IHRoaXMuX3N0YXRlLmFib3J0ZWQpIHtcbiAgICB0aGlzLmVtaXQoJ2Vycm9yJywgbmV3IEFyY2hpdmVyRXJyb3IoJ1FVRVVFQ0xPU0VEJykpO1xuICAgIHJldHVybiB0aGlzO1xuICB9XG5cbiAgZGF0YSA9IHRoaXMuX25vcm1hbGl6ZUVudHJ5RGF0YShkYXRhKTtcblxuICBpZiAodHlwZW9mIGRhdGEubmFtZSAhPT0gJ3N0cmluZycgfHwgZGF0YS5uYW1lLmxlbmd0aCA9PT0gMCkge1xuICAgIHRoaXMuZW1pdCgnZXJyb3InLCBuZXcgQXJjaGl2ZXJFcnJvcignRU5UUllOQU1FUkVRVUlSRUQnKSk7XG4gICAgcmV0dXJuIHRoaXM7XG4gIH1cblxuICBpZiAoZGF0YS50eXBlID09PSAnZGlyZWN0b3J5JyAmJiAhdGhpcy5fbW9kdWxlU3VwcG9ydHMoJ2RpcmVjdG9yeScpKSB7XG4gICAgdGhpcy5lbWl0KCdlcnJvcicsIG5ldyBBcmNoaXZlckVycm9yKCdESVJFQ1RPUllOT1RTVVBQT1JURUQnLCB7IG5hbWU6IGRhdGEubmFtZSB9KSk7XG4gICAgcmV0dXJuIHRoaXM7XG4gIH1cblxuICBzb3VyY2UgPSB1dGlsLm5vcm1hbGl6ZUlucHV0U291cmNlKHNvdXJjZSk7XG5cbiAgaWYgKEJ1ZmZlci5pc0J1ZmZlcihzb3VyY2UpKSB7XG4gICAgZGF0YS5zb3VyY2VUeXBlID0gJ2J1ZmZlcic7XG4gIH0gZWxzZSBpZiAodXRpbC5pc1N0cmVhbShzb3VyY2UpKSB7XG4gICAgZGF0YS5zb3VyY2VUeXBlID0gJ3N0cmVhbSc7XG4gIH0gZWxzZSB7XG4gICAgdGhpcy5lbWl0KCdlcnJvcicsIG5ldyBBcmNoaXZlckVycm9yKCdJTlBVVFNURUFNQlVGRkVSUkVRVUlSRUQnLCB7IG5hbWU6IGRhdGEubmFtZSB9KSk7XG4gICAgcmV0dXJuIHRoaXM7XG4gIH1cblxuICB0aGlzLl9lbnRyaWVzQ291bnQrKztcbiAgdGhpcy5fcXVldWUucHVzaCh7XG4gICAgZGF0YTogZGF0YSxcbiAgICBzb3VyY2U6IHNvdXJjZVxuICB9KTtcblxuICByZXR1cm4gdGhpcztcbn07XG5cbi8qKlxuICogQXBwZW5kcyBhIGRpcmVjdG9yeSBhbmQgaXRzIGZpbGVzLCByZWN1cnNpdmVseSwgZ2l2ZW4gaXRzIGRpcnBhdGguXG4gKlxuICogQHBhcmFtICB7U3RyaW5nfSBkaXJwYXRoIFRoZSBzb3VyY2UgZGlyZWN0b3J5IHBhdGguXG4gKiBAcGFyYW0gIHtTdHJpbmd9IGRlc3RwYXRoIFRoZSBkZXN0aW5hdGlvbiBwYXRoIHdpdGhpbiB0aGUgYXJjaGl2ZS5cbiAqIEBwYXJhbSAgeyhFbnRyeURhdGF8RnVuY3Rpb24pfSBkYXRhIFNlZSBhbHNvIFtaaXBFbnRyeURhdGFde0BsaW5rIFppcEVudHJ5RGF0YX0gYW5kXG4gKiBbVGFyRW50cnlEYXRhXXtAbGluayBUYXJFbnRyeURhdGF9LlxuICogQHJldHVybiB7dGhpc31cbiAqL1xuQXJjaGl2ZXIucHJvdG90eXBlLmRpcmVjdG9yeSA9IGZ1bmN0aW9uKGRpcnBhdGgsIGRlc3RwYXRoLCBkYXRhKSB7XG4gIGlmICh0aGlzLl9zdGF0ZS5maW5hbGl6ZSB8fCB0aGlzLl9zdGF0ZS5hYm9ydGVkKSB7XG4gICAgdGhpcy5lbWl0KCdlcnJvcicsIG5ldyBBcmNoaXZlckVycm9yKCdRVUVVRUNMT1NFRCcpKTtcbiAgICByZXR1cm4gdGhpcztcbiAgfVxuXG4gIGlmICh0eXBlb2YgZGlycGF0aCAhPT0gJ3N0cmluZycgfHwgZGlycGF0aC5sZW5ndGggPT09IDApIHtcbiAgICB0aGlzLmVtaXQoJ2Vycm9yJywgbmV3IEFyY2hpdmVyRXJyb3IoJ0RJUkVDVE9SWURJUlBBVEhSRVFVSVJFRCcpKTtcbiAgICByZXR1cm4gdGhpcztcbiAgfVxuXG4gIHRoaXMuX3BlbmRpbmcrKztcblxuICBpZiAoZGVzdHBhdGggPT09IGZhbHNlKSB7XG4gICAgZGVzdHBhdGggPSAnJztcbiAgfSBlbHNlIGlmICh0eXBlb2YgZGVzdHBhdGggIT09ICdzdHJpbmcnKXtcbiAgICBkZXN0cGF0aCA9IGRpcnBhdGg7XG4gIH1cblxuICB2YXIgZGF0YUZ1bmN0aW9uID0gZmFsc2U7XG4gIGlmICh0eXBlb2YgZGF0YSA9PT0gJ2Z1bmN0aW9uJykge1xuICAgIGRhdGFGdW5jdGlvbiA9IGRhdGE7XG4gICAgZGF0YSA9IHt9O1xuICB9IGVsc2UgaWYgKHR5cGVvZiBkYXRhICE9PSAnb2JqZWN0Jykge1xuICAgIGRhdGEgPSB7fTtcbiAgfVxuXG4gIHZhciBnbG9iT3B0aW9ucyA9IHtcbiAgICBzdGF0OiB0cnVlLFxuICAgIGRvdDogdHJ1ZVxuICB9O1xuXG4gIGZ1bmN0aW9uIG9uR2xvYkVuZCgpIHtcbiAgICB0aGlzLl9wZW5kaW5nLS07XG4gICAgdGhpcy5fbWF5YmVGaW5hbGl6ZSgpO1xuICB9XG5cbiAgZnVuY3Rpb24gb25HbG9iRXJyb3IoZXJyKSB7XG4gICAgdGhpcy5lbWl0KCdlcnJvcicsIGVycik7XG4gIH1cblxuICBmdW5jdGlvbiBvbkdsb2JNYXRjaChtYXRjaCl7XG4gICAgZ2xvYmJlci5wYXVzZSgpO1xuXG4gICAgdmFyIGlnbm9yZU1hdGNoID0gZmFsc2U7XG4gICAgdmFyIGVudHJ5RGF0YSA9IE9iamVjdC5hc3NpZ24oe30sIGRhdGEpO1xuICAgIGVudHJ5RGF0YS5uYW1lID0gbWF0Y2gucmVsYXRpdmU7XG4gICAgZW50cnlEYXRhLnByZWZpeCA9IGRlc3RwYXRoO1xuICAgIGVudHJ5RGF0YS5zdGF0cyA9IG1hdGNoLnN0YXQ7XG4gICAgZW50cnlEYXRhLmNhbGxiYWNrID0gZ2xvYmJlci5yZXN1bWUuYmluZChnbG9iYmVyKTtcblxuICAgIHRyeSB7XG4gICAgICBpZiAoZGF0YUZ1bmN0aW9uKSB7XG4gICAgICAgIGVudHJ5RGF0YSA9IGRhdGFGdW5jdGlvbihlbnRyeURhdGEpO1xuXG4gICAgICAgIGlmIChlbnRyeURhdGEgPT09IGZhbHNlKSB7XG4gICAgICAgICAgaWdub3JlTWF0Y2ggPSB0cnVlO1xuICAgICAgICB9IGVsc2UgaWYgKHR5cGVvZiBlbnRyeURhdGEgIT09ICdvYmplY3QnKSB7XG4gICAgICAgICAgdGhyb3cgbmV3IEFyY2hpdmVyRXJyb3IoJ0RJUkVDVE9SWUZVTkNUSU9OSU5WQUxJRERBVEEnLCB7IGRpcnBhdGg6IGRpcnBhdGggfSk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9IGNhdGNoKGUpIHtcbiAgICAgIHRoaXMuZW1pdCgnZXJyb3InLCBlKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBpZiAoaWdub3JlTWF0Y2gpIHtcbiAgICAgIGdsb2JiZXIucmVzdW1lKCk7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgdGhpcy5fYXBwZW5kKG1hdGNoLmFic29sdXRlLCBlbnRyeURhdGEpO1xuICB9XG5cbiAgdmFyIGdsb2JiZXIgPSBnbG9iKGRpcnBhdGgsIGdsb2JPcHRpb25zKTtcbiAgZ2xvYmJlci5vbignZXJyb3InLCBvbkdsb2JFcnJvci5iaW5kKHRoaXMpKTtcbiAgZ2xvYmJlci5vbignbWF0Y2gnLCBvbkdsb2JNYXRjaC5iaW5kKHRoaXMpKTtcbiAgZ2xvYmJlci5vbignZW5kJywgb25HbG9iRW5kLmJpbmQodGhpcykpO1xuXG4gIHJldHVybiB0aGlzO1xufTtcblxuLyoqXG4gKiBBcHBlbmRzIGEgZmlsZSBnaXZlbiBpdHMgZmlsZXBhdGggdXNpbmcgYVxuICogW2xhenlzdHJlYW1de0BsaW5rIGh0dHBzOi8vZ2l0aHViLmNvbS9qcG9tbWVyZW5pbmcvbm9kZS1sYXp5c3RyZWFtfSB3cmFwcGVyIHRvXG4gKiBwcmV2ZW50IGlzc3VlcyB3aXRoIG9wZW4gZmlsZSBsaW1pdHMuXG4gKlxuICogV2hlbiB0aGUgaW5zdGFuY2UgaGFzIHJlY2VpdmVkLCBwcm9jZXNzZWQsIGFuZCBlbWl0dGVkIHRoZSBmaWxlLCB0aGUgYGVudHJ5YFxuICogZXZlbnQgaXMgZmlyZWQuXG4gKlxuICogQHBhcmFtICB7U3RyaW5nfSBmaWxlcGF0aCBUaGUgc291cmNlIGZpbGVwYXRoLlxuICogQHBhcmFtICB7RW50cnlEYXRhfSBkYXRhIFNlZSBhbHNvIFtaaXBFbnRyeURhdGFde0BsaW5rIFppcEVudHJ5RGF0YX0gYW5kXG4gKiBbVGFyRW50cnlEYXRhXXtAbGluayBUYXJFbnRyeURhdGF9LlxuICogQHJldHVybiB7dGhpc31cbiAqL1xuQXJjaGl2ZXIucHJvdG90eXBlLmZpbGUgPSBmdW5jdGlvbihmaWxlcGF0aCwgZGF0YSkge1xuICBpZiAodGhpcy5fc3RhdGUuZmluYWxpemUgfHwgdGhpcy5fc3RhdGUuYWJvcnRlZCkge1xuICAgIHRoaXMuZW1pdCgnZXJyb3InLCBuZXcgQXJjaGl2ZXJFcnJvcignUVVFVUVDTE9TRUQnKSk7XG4gICAgcmV0dXJuIHRoaXM7XG4gIH1cblxuICBpZiAodHlwZW9mIGZpbGVwYXRoICE9PSAnc3RyaW5nJyB8fCBmaWxlcGF0aC5sZW5ndGggPT09IDApIHtcbiAgICB0aGlzLmVtaXQoJ2Vycm9yJywgbmV3IEFyY2hpdmVyRXJyb3IoJ0ZJTEVGSUxFUEFUSFJFUVVJUkVEJykpO1xuICAgIHJldHVybiB0aGlzO1xuICB9XG5cbiAgdGhpcy5fYXBwZW5kKGZpbGVwYXRoLCBkYXRhKTtcblxuICByZXR1cm4gdGhpcztcbn07XG5cbi8qKlxuICogQXBwZW5kcyBtdWx0aXBsZSBmaWxlcyB0aGF0IG1hdGNoIGEgZ2xvYiBwYXR0ZXJuLlxuICpcbiAqIEBwYXJhbSAge1N0cmluZ30gcGF0dGVybiBUaGUgW2dsb2IgcGF0dGVybl17QGxpbmsgaHR0cHM6Ly9naXRodWIuY29tL2lzYWFjcy9taW5pbWF0Y2h9IHRvIG1hdGNoLlxuICogQHBhcmFtICB7T2JqZWN0fSBvcHRpb25zIFNlZSBbbm9kZS1yZWFkZGlyLWdsb2Jde0BsaW5rIGh0dHBzOi8vZ2l0aHViLmNvbS95cW5uL25vZGUtcmVhZGRpci1nbG9iI29wdGlvbnN9LlxuICogQHBhcmFtICB7RW50cnlEYXRhfSBkYXRhIFNlZSBhbHNvIFtaaXBFbnRyeURhdGFde0BsaW5rIFppcEVudHJ5RGF0YX0gYW5kXG4gKiBbVGFyRW50cnlEYXRhXXtAbGluayBUYXJFbnRyeURhdGF9LlxuICogQHJldHVybiB7dGhpc31cbiAqL1xuQXJjaGl2ZXIucHJvdG90eXBlLmdsb2IgPSBmdW5jdGlvbihwYXR0ZXJuLCBvcHRpb25zLCBkYXRhKSB7XG4gIHRoaXMuX3BlbmRpbmcrKztcblxuICBvcHRpb25zID0gdXRpbC5kZWZhdWx0cyhvcHRpb25zLCB7XG4gICAgc3RhdDogdHJ1ZSxcbiAgICBwYXR0ZXJuOiBwYXR0ZXJuXG4gIH0pO1xuXG4gIGZ1bmN0aW9uIG9uR2xvYkVuZCgpIHtcbiAgICB0aGlzLl9wZW5kaW5nLS07XG4gICAgdGhpcy5fbWF5YmVGaW5hbGl6ZSgpO1xuICB9XG5cbiAgZnVuY3Rpb24gb25HbG9iRXJyb3IoZXJyKSB7XG4gICAgdGhpcy5lbWl0KCdlcnJvcicsIGVycik7XG4gIH1cblxuICBmdW5jdGlvbiBvbkdsb2JNYXRjaChtYXRjaCl7XG4gICAgZ2xvYmJlci5wYXVzZSgpO1xuICAgIHZhciBlbnRyeURhdGEgPSBPYmplY3QuYXNzaWduKHt9LCBkYXRhKTtcbiAgICBlbnRyeURhdGEuY2FsbGJhY2sgPSBnbG9iYmVyLnJlc3VtZS5iaW5kKGdsb2JiZXIpO1xuICAgIGVudHJ5RGF0YS5zdGF0cyA9IG1hdGNoLnN0YXQ7XG4gICAgZW50cnlEYXRhLm5hbWUgPSBtYXRjaC5yZWxhdGl2ZTtcblxuICAgIHRoaXMuX2FwcGVuZChtYXRjaC5hYnNvbHV0ZSwgZW50cnlEYXRhKTtcbiAgfVxuXG4gIHZhciBnbG9iYmVyID0gZ2xvYihvcHRpb25zLmN3ZCB8fCAnLicsIG9wdGlvbnMpO1xuICBnbG9iYmVyLm9uKCdlcnJvcicsIG9uR2xvYkVycm9yLmJpbmQodGhpcykpO1xuICBnbG9iYmVyLm9uKCdtYXRjaCcsIG9uR2xvYk1hdGNoLmJpbmQodGhpcykpO1xuICBnbG9iYmVyLm9uKCdlbmQnLCBvbkdsb2JFbmQuYmluZCh0aGlzKSk7XG5cbiAgcmV0dXJuIHRoaXM7XG59O1xuXG4vKipcbiAqIEZpbmFsaXplcyB0aGUgaW5zdGFuY2UgYW5kIHByZXZlbnRzIGZ1cnRoZXIgYXBwZW5kaW5nIHRvIHRoZSBhcmNoaXZlXG4gKiBzdHJ1Y3R1cmUgKHF1ZXVlIHdpbGwgY29udGludWUgdGlsIGRyYWluZWQpLlxuICpcbiAqIFRoZSBgZW5kYCwgYGNsb3NlYCBvciBgZmluaXNoYCBldmVudHMgb24gdGhlIGRlc3RpbmF0aW9uIHN0cmVhbSBtYXkgZmlyZVxuICogcmlnaHQgYWZ0ZXIgY2FsbGluZyB0aGlzIG1ldGhvZCBzbyB5b3Ugc2hvdWxkIHNldCBsaXN0ZW5lcnMgYmVmb3JlaGFuZCB0b1xuICogcHJvcGVybHkgZGV0ZWN0IHN0cmVhbSBjb21wbGV0aW9uLlxuICpcbiAqIEByZXR1cm4ge1Byb21pc2V9XG4gKi9cbkFyY2hpdmVyLnByb3RvdHlwZS5maW5hbGl6ZSA9IGZ1bmN0aW9uKCkge1xuICBpZiAodGhpcy5fc3RhdGUuYWJvcnRlZCkge1xuICAgIHZhciBhYm9ydGVkRXJyb3IgPSBuZXcgQXJjaGl2ZXJFcnJvcignQUJPUlRFRCcpO1xuICAgIHRoaXMuZW1pdCgnZXJyb3InLCBhYm9ydGVkRXJyb3IpO1xuICAgIHJldHVybiBQcm9taXNlLnJlamVjdChhYm9ydGVkRXJyb3IpO1xuICB9XG5cbiAgaWYgKHRoaXMuX3N0YXRlLmZpbmFsaXplKSB7XG4gICAgdmFyIGZpbmFsaXppbmdFcnJvciA9IG5ldyBBcmNoaXZlckVycm9yKCdGSU5BTElaSU5HJyk7XG4gICAgdGhpcy5lbWl0KCdlcnJvcicsIGZpbmFsaXppbmdFcnJvcik7XG4gICAgcmV0dXJuIFByb21pc2UucmVqZWN0KGZpbmFsaXppbmdFcnJvcik7XG4gIH1cblxuICB0aGlzLl9zdGF0ZS5maW5hbGl6ZSA9IHRydWU7XG5cbiAgaWYgKHRoaXMuX3BlbmRpbmcgPT09IDAgJiYgdGhpcy5fcXVldWUuaWRsZSgpICYmIHRoaXMuX3N0YXRRdWV1ZS5pZGxlKCkpIHtcbiAgICB0aGlzLl9maW5hbGl6ZSgpO1xuICB9XG5cbiAgdmFyIHNlbGYgPSB0aGlzO1xuXG4gIHJldHVybiBuZXcgUHJvbWlzZShmdW5jdGlvbihyZXNvbHZlLCByZWplY3QpIHtcbiAgICB2YXIgZXJyb3JlZDtcblxuICAgIHNlbGYuX21vZHVsZS5vbignZW5kJywgZnVuY3Rpb24oKSB7XG4gICAgICBpZiAoIWVycm9yZWQpIHtcbiAgICAgICAgcmVzb2x2ZSgpO1xuICAgICAgfVxuICAgIH0pXG5cbiAgICBzZWxmLl9tb2R1bGUub24oJ2Vycm9yJywgZnVuY3Rpb24oZXJyKSB7XG4gICAgICBlcnJvcmVkID0gdHJ1ZTtcbiAgICAgIHJlamVjdChlcnIpO1xuICAgIH0pXG4gIH0pXG59O1xuXG4vKipcbiAqIFNldHMgdGhlIG1vZHVsZSBmb3JtYXQgbmFtZSB1c2VkIGZvciBhcmNoaXZpbmcuXG4gKlxuICogQHBhcmFtIHtTdHJpbmd9IGZvcm1hdCBUaGUgbmFtZSBvZiB0aGUgZm9ybWF0LlxuICogQHJldHVybiB7dGhpc31cbiAqL1xuQXJjaGl2ZXIucHJvdG90eXBlLnNldEZvcm1hdCA9IGZ1bmN0aW9uKGZvcm1hdCkge1xuICBpZiAodGhpcy5fZm9ybWF0KSB7XG4gICAgdGhpcy5lbWl0KCdlcnJvcicsIG5ldyBBcmNoaXZlckVycm9yKCdGT1JNQVRTRVQnKSk7XG4gICAgcmV0dXJuIHRoaXM7XG4gIH1cblxuICB0aGlzLl9mb3JtYXQgPSBmb3JtYXQ7XG5cbiAgcmV0dXJuIHRoaXM7XG59O1xuXG4vKipcbiAqIFNldHMgdGhlIG1vZHVsZSB1c2VkIGZvciBhcmNoaXZpbmcuXG4gKlxuICogQHBhcmFtIHtGdW5jdGlvbn0gbW9kdWxlIFRoZSBmdW5jdGlvbiBmb3IgYXJjaGl2ZXIgdG8gaW50ZXJhY3Qgd2l0aC5cbiAqIEByZXR1cm4ge3RoaXN9XG4gKi9cbkFyY2hpdmVyLnByb3RvdHlwZS5zZXRNb2R1bGUgPSBmdW5jdGlvbihtb2R1bGUpIHtcbiAgaWYgKHRoaXMuX3N0YXRlLmFib3J0ZWQpIHtcbiAgICB0aGlzLmVtaXQoJ2Vycm9yJywgbmV3IEFyY2hpdmVyRXJyb3IoJ0FCT1JURUQnKSk7XG4gICAgcmV0dXJuIHRoaXM7XG4gIH1cblxuICBpZiAodGhpcy5fc3RhdGUubW9kdWxlKSB7XG4gICAgdGhpcy5lbWl0KCdlcnJvcicsIG5ldyBBcmNoaXZlckVycm9yKCdNT0RVTEVTRVQnKSk7XG4gICAgcmV0dXJuIHRoaXM7XG4gIH1cblxuICB0aGlzLl9tb2R1bGUgPSBtb2R1bGU7XG4gIHRoaXMuX21vZHVsZVBpcGUoKTtcblxuICByZXR1cm4gdGhpcztcbn07XG5cbi8qKlxuICogQXBwZW5kcyBhIHN5bWxpbmsgdG8gdGhlIGluc3RhbmNlLlxuICpcbiAqIFRoaXMgZG9lcyBOT1QgaW50ZXJhY3Qgd2l0aCBmaWxlc3lzdGVtIGFuZCBpcyB1c2VkIGZvciBwcm9ncmFtbWF0aWNhbGx5IGNyZWF0aW5nIHN5bWxpbmtzLlxuICpcbiAqIEBwYXJhbSAge1N0cmluZ30gZmlsZXBhdGggVGhlIHN5bWxpbmsgcGF0aCAod2l0aGluIGFyY2hpdmUpLlxuICogQHBhcmFtICB7U3RyaW5nfSB0YXJnZXQgVGhlIHRhcmdldCBwYXRoICh3aXRoaW4gYXJjaGl2ZSkuXG4gKiBAcGFyYW0gIHtOdW1iZXJ9IG1vZGUgU2V0cyB0aGUgZW50cnkgcGVybWlzc2lvbnMuXG4gKiBAcmV0dXJuIHt0aGlzfVxuICovXG5BcmNoaXZlci5wcm90b3R5cGUuc3ltbGluayA9IGZ1bmN0aW9uKGZpbGVwYXRoLCB0YXJnZXQsIG1vZGUpIHtcbiAgaWYgKHRoaXMuX3N0YXRlLmZpbmFsaXplIHx8IHRoaXMuX3N0YXRlLmFib3J0ZWQpIHtcbiAgICB0aGlzLmVtaXQoJ2Vycm9yJywgbmV3IEFyY2hpdmVyRXJyb3IoJ1FVRVVFQ0xPU0VEJykpO1xuICAgIHJldHVybiB0aGlzO1xuICB9XG5cbiAgaWYgKHR5cGVvZiBmaWxlcGF0aCAhPT0gJ3N0cmluZycgfHwgZmlsZXBhdGgubGVuZ3RoID09PSAwKSB7XG4gICAgdGhpcy5lbWl0KCdlcnJvcicsIG5ldyBBcmNoaXZlckVycm9yKCdTWU1MSU5LRklMRVBBVEhSRVFVSVJFRCcpKTtcbiAgICByZXR1cm4gdGhpcztcbiAgfVxuXG4gIGlmICh0eXBlb2YgdGFyZ2V0ICE9PSAnc3RyaW5nJyB8fCB0YXJnZXQubGVuZ3RoID09PSAwKSB7XG4gICAgdGhpcy5lbWl0KCdlcnJvcicsIG5ldyBBcmNoaXZlckVycm9yKCdTWU1MSU5LVEFSR0VUUkVRVUlSRUQnLCB7IGZpbGVwYXRoOiBmaWxlcGF0aCB9KSk7XG4gICAgcmV0dXJuIHRoaXM7XG4gIH1cblxuICBpZiAoIXRoaXMuX21vZHVsZVN1cHBvcnRzKCdzeW1saW5rJykpIHtcbiAgICB0aGlzLmVtaXQoJ2Vycm9yJywgbmV3IEFyY2hpdmVyRXJyb3IoJ1NZTUxJTktOT1RTVVBQT1JURUQnLCB7IGZpbGVwYXRoOiBmaWxlcGF0aCB9KSk7XG4gICAgcmV0dXJuIHRoaXM7XG4gIH1cblxuICB2YXIgZGF0YSA9IHt9O1xuICBkYXRhLnR5cGUgPSAnc3ltbGluayc7XG4gIGRhdGEubmFtZSA9IGZpbGVwYXRoLnJlcGxhY2UoL1xcXFwvZywgJy8nKTtcbiAgZGF0YS5saW5rbmFtZSA9IHRhcmdldC5yZXBsYWNlKC9cXFxcL2csICcvJyk7XG4gIGRhdGEuc291cmNlVHlwZSA9ICdidWZmZXInO1xuXG4gIGlmICh0eXBlb2YgbW9kZSA9PT0gXCJudW1iZXJcIikge1xuICAgIGRhdGEubW9kZSA9IG1vZGU7XG4gIH1cblxuICB0aGlzLl9lbnRyaWVzQ291bnQrKztcbiAgdGhpcy5fcXVldWUucHVzaCh7XG4gICAgZGF0YTogZGF0YSxcbiAgICBzb3VyY2U6IEJ1ZmZlci5jb25jYXQoW10pXG4gIH0pO1xuXG4gIHJldHVybiB0aGlzO1xufTtcblxuLyoqXG4gKiBSZXR1cm5zIHRoZSBjdXJyZW50IGxlbmd0aCAoaW4gYnl0ZXMpIHRoYXQgaGFzIGJlZW4gZW1pdHRlZC5cbiAqXG4gKiBAcmV0dXJuIHtOdW1iZXJ9XG4gKi9cbkFyY2hpdmVyLnByb3RvdHlwZS5wb2ludGVyID0gZnVuY3Rpb24oKSB7XG4gIHJldHVybiB0aGlzLl9wb2ludGVyO1xufTtcblxuLyoqXG4gKiBNaWRkbGV3YXJlLWxpa2UgaGVscGVyIHRoYXQgaGFzIHlldCB0byBiZSBmdWxseSBpbXBsZW1lbnRlZC5cbiAqXG4gKiBAcHJpdmF0ZVxuICogQHBhcmFtICB7RnVuY3Rpb259IHBsdWdpblxuICogQHJldHVybiB7dGhpc31cbiAqL1xuQXJjaGl2ZXIucHJvdG90eXBlLnVzZSA9IGZ1bmN0aW9uKHBsdWdpbikge1xuICB0aGlzLl9zdHJlYW1zLnB1c2gocGx1Z2luKTtcbiAgcmV0dXJuIHRoaXM7XG59O1xuXG5tb2R1bGUuZXhwb3J0cyA9IEFyY2hpdmVyO1xuXG4vKipcbiAqIEB0eXBlZGVmIHtPYmplY3R9IENvcmVPcHRpb25zXG4gKiBAZ2xvYmFsXG4gKiBAcHJvcGVydHkge051bWJlcn0gW3N0YXRDb25jdXJyZW5jeT00XSBTZXRzIHRoZSBudW1iZXIgb2Ygd29ya2VycyB1c2VkIHRvXG4gKiBwcm9jZXNzIHRoZSBpbnRlcm5hbCBmcyBzdGF0IHF1ZXVlLlxuICovXG5cbi8qKlxuICogQHR5cGVkZWYge09iamVjdH0gVHJhbnNmb3JtT3B0aW9uc1xuICogQHByb3BlcnR5IHtCb29sZWFufSBbYWxsb3dIYWxmT3Blbj10cnVlXSBJZiBzZXQgdG8gZmFsc2UsIHRoZW4gdGhlIHN0cmVhbVxuICogd2lsbCBhdXRvbWF0aWNhbGx5IGVuZCB0aGUgcmVhZGFibGUgc2lkZSB3aGVuIHRoZSB3cml0YWJsZSBzaWRlIGVuZHMgYW5kIHZpY2VcbiAqIHZlcnNhLlxuICogQHByb3BlcnR5IHtCb29sZWFufSBbcmVhZGFibGVPYmplY3RNb2RlPWZhbHNlXSBTZXRzIG9iamVjdE1vZGUgZm9yIHJlYWRhYmxlXG4gKiBzaWRlIG9mIHRoZSBzdHJlYW0uIEhhcyBubyBlZmZlY3QgaWYgb2JqZWN0TW9kZSBpcyB0cnVlLlxuICogQHByb3BlcnR5IHtCb29sZWFufSBbd3JpdGFibGVPYmplY3RNb2RlPWZhbHNlXSBTZXRzIG9iamVjdE1vZGUgZm9yIHdyaXRhYmxlXG4gKiBzaWRlIG9mIHRoZSBzdHJlYW0uIEhhcyBubyBlZmZlY3QgaWYgb2JqZWN0TW9kZSBpcyB0cnVlLlxuICogQHByb3BlcnR5IHtCb29sZWFufSBbZGVjb2RlU3RyaW5ncz10cnVlXSBXaGV0aGVyIG9yIG5vdCB0byBkZWNvZGUgc3RyaW5nc1xuICogaW50byBCdWZmZXJzIGJlZm9yZSBwYXNzaW5nIHRoZW0gdG8gX3dyaXRlKCkuIGBXcml0YWJsZWBcbiAqIEBwcm9wZXJ0eSB7U3RyaW5nfSBbZW5jb2Rpbmc9TlVMTF0gSWYgc3BlY2lmaWVkLCB0aGVuIGJ1ZmZlcnMgd2lsbCBiZSBkZWNvZGVkXG4gKiB0byBzdHJpbmdzIHVzaW5nIHRoZSBzcGVjaWZpZWQgZW5jb2RpbmcuIGBSZWFkYWJsZWBcbiAqIEBwcm9wZXJ0eSB7TnVtYmVyfSBbaGlnaFdhdGVyTWFyaz0xNmtiXSBUaGUgbWF4aW11bSBudW1iZXIgb2YgYnl0ZXMgdG8gc3RvcmVcbiAqIGluIHRoZSBpbnRlcm5hbCBidWZmZXIgYmVmb3JlIGNlYXNpbmcgdG8gcmVhZCBmcm9tIHRoZSB1bmRlcmx5aW5nIHJlc291cmNlLlxuICogYFJlYWRhYmxlYCBgV3JpdGFibGVgXG4gKiBAcHJvcGVydHkge0Jvb2xlYW59IFtvYmplY3RNb2RlPWZhbHNlXSBXaGV0aGVyIHRoaXMgc3RyZWFtIHNob3VsZCBiZWhhdmUgYXMgYVxuICogc3RyZWFtIG9mIG9iamVjdHMuIE1lYW5pbmcgdGhhdCBzdHJlYW0ucmVhZChuKSByZXR1cm5zIGEgc2luZ2xlIHZhbHVlIGluc3RlYWRcbiAqIG9mIGEgQnVmZmVyIG9mIHNpemUgbi4gYFJlYWRhYmxlYCBgV3JpdGFibGVgXG4gKi9cblxuLyoqXG4gKiBAdHlwZWRlZiB7T2JqZWN0fSBFbnRyeURhdGFcbiAqIEBwcm9wZXJ0eSB7U3RyaW5nfSBuYW1lIFNldHMgdGhlIGVudHJ5IG5hbWUgaW5jbHVkaW5nIGludGVybmFsIHBhdGguXG4gKiBAcHJvcGVydHkgeyhTdHJpbmd8RGF0ZSl9IFtkYXRlPU5PVygpXSBTZXRzIHRoZSBlbnRyeSBkYXRlLlxuICogQHByb3BlcnR5IHtOdW1iZXJ9IFttb2RlPUQ6MDc1NS9GOjA2NDRdIFNldHMgdGhlIGVudHJ5IHBlcm1pc3Npb25zLlxuICogQHByb3BlcnR5IHtTdHJpbmd9IFtwcmVmaXhdIFNldHMgYSBwYXRoIHByZWZpeCBmb3IgdGhlIGVudHJ5IG5hbWUuIFVzZWZ1bFxuICogd2hlbiB3b3JraW5nIHdpdGggbWV0aG9kcyBsaWtlIGBkaXJlY3RvcnlgIG9yIGBnbG9iYC5cbiAqIEBwcm9wZXJ0eSB7ZnMuU3RhdHN9IFtzdGF0c10gU2V0cyB0aGUgZnMgc3RhdCBkYXRhIGZvciB0aGlzIGVudHJ5IGFsbG93aW5nXG4gKiBmb3IgcmVkdWN0aW9uIG9mIGZzIHN0YXQgY2FsbHMgd2hlbiBzdGF0IGRhdGEgaXMgYWxyZWFkeSBrbm93bi5cbiAqL1xuXG4vKipcbiAqIEB0eXBlZGVmIHtPYmplY3R9IEVycm9yRGF0YVxuICogQHByb3BlcnR5IHtTdHJpbmd9IG1lc3NhZ2UgVGhlIG1lc3NhZ2Ugb2YgdGhlIGVycm9yLlxuICogQHByb3BlcnR5IHtTdHJpbmd9IGNvZGUgVGhlIGVycm9yIGNvZGUgYXNzaWduZWQgdG8gdGhpcyBlcnJvci5cbiAqIEBwcm9wZXJ0eSB7U3RyaW5nfSBkYXRhIEFkZGl0aW9uYWwgZGF0YSBwcm92aWRlZCBmb3IgcmVwb3J0aW5nIG9yIGRlYnVnZ2luZyAod2hlcmUgYXZhaWxhYmxlKS5cbiAqL1xuXG4vKipcbiAqIEB0eXBlZGVmIHtPYmplY3R9IFByb2dyZXNzRGF0YVxuICogQHByb3BlcnR5IHtPYmplY3R9IGVudHJpZXNcbiAqIEBwcm9wZXJ0eSB7TnVtYmVyfSBlbnRyaWVzLnRvdGFsIE51bWJlciBvZiBlbnRyaWVzIHRoYXQgaGF2ZSBiZWVuIGFwcGVuZGVkLlxuICogQHByb3BlcnR5IHtOdW1iZXJ9IGVudHJpZXMucHJvY2Vzc2VkIE51bWJlciBvZiBlbnRyaWVzIHRoYXQgaGF2ZSBiZWVuIHByb2Nlc3NlZC5cbiAqIEBwcm9wZXJ0eSB7T2JqZWN0fSBmc1xuICogQHByb3BlcnR5IHtOdW1iZXJ9IGZzLnRvdGFsQnl0ZXMgTnVtYmVyIG9mIGJ5dGVzIHRoYXQgaGF2ZSBiZWVuIGFwcGVuZGVkLiBDYWxjdWxhdGVkIGFzeW5jaHJvbm91c2x5IGFuZCBtaWdodCBub3QgYmUgYWNjdXJhdGU6IGl0IGdyb3d0aCB3aGlsZSBlbnRyaWVzIGFyZSBhZGRlZC4gKGJhc2VkIG9uIGZzLlN0YXRzKVxuICogQHByb3BlcnR5IHtOdW1iZXJ9IGZzLnByb2Nlc3NlZEJ5dGVzIE51bWJlciBvZiBieXRlcyB0aGF0IGhhdmUgYmVlbiBwcm9jZXNzZWQuIChiYXNlZCBvbiBmcy5TdGF0cylcbiAqL1xuIiwKICAgICIvKipcbiAqIG5vZGUtY29tcHJlc3MtY29tbW9uc1xuICpcbiAqIENvcHlyaWdodCAoYykgMjAxNCBDaHJpcyBUYWxraW5ndG9uLCBjb250cmlidXRvcnMuXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgTUlUIGxpY2Vuc2UuXG4gKiBodHRwczovL2dpdGh1Yi5jb20vYXJjaGl2ZXJqcy9ub2RlLWNvbXByZXNzLWNvbW1vbnMvYmxvYi9tYXN0ZXIvTElDRU5TRS1NSVRcbiAqL1xudmFyIEFyY2hpdmVFbnRyeSA9IG1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24oKSB7fTtcblxuQXJjaGl2ZUVudHJ5LnByb3RvdHlwZS5nZXROYW1lID0gZnVuY3Rpb24oKSB7fTtcblxuQXJjaGl2ZUVudHJ5LnByb3RvdHlwZS5nZXRTaXplID0gZnVuY3Rpb24oKSB7fTtcblxuQXJjaGl2ZUVudHJ5LnByb3RvdHlwZS5nZXRMYXN0TW9kaWZpZWREYXRlID0gZnVuY3Rpb24oKSB7fTtcblxuQXJjaGl2ZUVudHJ5LnByb3RvdHlwZS5pc0RpcmVjdG9yeSA9IGZ1bmN0aW9uKCkge307IiwKICAgICIvKipcbiAqIG5vZGUtY29tcHJlc3MtY29tbW9uc1xuICpcbiAqIENvcHlyaWdodCAoYykgMjAxNCBDaHJpcyBUYWxraW5ndG9uLCBjb250cmlidXRvcnMuXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgTUlUIGxpY2Vuc2UuXG4gKiBodHRwczovL2dpdGh1Yi5jb20vYXJjaGl2ZXJqcy9ub2RlLWNvbXByZXNzLWNvbW1vbnMvYmxvYi9tYXN0ZXIvTElDRU5TRS1NSVRcbiAqL1xudmFyIHV0aWwgPSBtb2R1bGUuZXhwb3J0cyA9IHt9O1xuXG51dGlsLmRhdGVUb0RvcyA9IGZ1bmN0aW9uKGQsIGZvcmNlTG9jYWxUaW1lKSB7XG4gIGZvcmNlTG9jYWxUaW1lID0gZm9yY2VMb2NhbFRpbWUgfHwgZmFsc2U7XG5cbiAgdmFyIHllYXIgPSBmb3JjZUxvY2FsVGltZSA/IGQuZ2V0RnVsbFllYXIoKSA6IGQuZ2V0VVRDRnVsbFllYXIoKTtcblxuICBpZiAoeWVhciA8IDE5ODApIHtcbiAgICByZXR1cm4gMjE2MjY4ODsgLy8gMTk4MC0xLTEgMDA6MDA6MDBcbiAgfSBlbHNlIGlmICh5ZWFyID49IDIwNDQpIHtcbiAgICByZXR1cm4gMjE0MTE3NTY3NzsgLy8gMjA0My0xMi0zMSAyMzo1OTo1OFxuICB9XG5cbiAgdmFyIHZhbCA9IHtcbiAgICB5ZWFyOiB5ZWFyLFxuICAgIG1vbnRoOiBmb3JjZUxvY2FsVGltZSA/IGQuZ2V0TW9udGgoKSA6IGQuZ2V0VVRDTW9udGgoKSxcbiAgICBkYXRlOiBmb3JjZUxvY2FsVGltZSA/IGQuZ2V0RGF0ZSgpIDogZC5nZXRVVENEYXRlKCksXG4gICAgaG91cnM6IGZvcmNlTG9jYWxUaW1lID8gZC5nZXRIb3VycygpIDogZC5nZXRVVENIb3VycygpLFxuICAgIG1pbnV0ZXM6IGZvcmNlTG9jYWxUaW1lID8gZC5nZXRNaW51dGVzKCkgOiBkLmdldFVUQ01pbnV0ZXMoKSxcbiAgICBzZWNvbmRzOiBmb3JjZUxvY2FsVGltZSA/IGQuZ2V0U2Vjb25kcygpIDogZC5nZXRVVENTZWNvbmRzKClcbiAgfTtcblxuICByZXR1cm4gKCh2YWwueWVhciAtIDE5ODApIDw8IDI1KSB8ICgodmFsLm1vbnRoICsgMSkgPDwgMjEpIHwgKHZhbC5kYXRlIDw8IDE2KSB8XG4gICAgKHZhbC5ob3VycyA8PCAxMSkgfCAodmFsLm1pbnV0ZXMgPDwgNSkgfCAodmFsLnNlY29uZHMgLyAyKTtcbn07XG5cbnV0aWwuZG9zVG9EYXRlID0gZnVuY3Rpb24oZG9zKSB7XG4gIHJldHVybiBuZXcgRGF0ZSgoKGRvcyA+PiAyNSkgJiAweDdmKSArIDE5ODAsICgoZG9zID4+IDIxKSAmIDB4MGYpIC0gMSwgKGRvcyA+PiAxNikgJiAweDFmLCAoZG9zID4+IDExKSAmIDB4MWYsIChkb3MgPj4gNSkgJiAweDNmLCAoZG9zICYgMHgxZikgPDwgMSk7XG59O1xuXG51dGlsLmZyb21Eb3NUaW1lID0gZnVuY3Rpb24oYnVmKSB7XG4gIHJldHVybiB1dGlsLmRvc1RvRGF0ZShidWYucmVhZFVJbnQzMkxFKDApKTtcbn07XG5cbnV0aWwuZ2V0RWlnaHRCeXRlcyA9IGZ1bmN0aW9uKHYpIHtcbiAgdmFyIGJ1ZiA9IEJ1ZmZlci5hbGxvYyg4KTtcbiAgYnVmLndyaXRlVUludDMyTEUodiAlIDB4MDEwMDAwMDAwMCwgMCk7XG4gIGJ1Zi53cml0ZVVJbnQzMkxFKCh2IC8gMHgwMTAwMDAwMDAwKSB8IDAsIDQpO1xuXG4gIHJldHVybiBidWY7XG59O1xuXG51dGlsLmdldFNob3J0Qnl0ZXMgPSBmdW5jdGlvbih2KSB7XG4gIHZhciBidWYgPSBCdWZmZXIuYWxsb2MoMik7XG4gIGJ1Zi53cml0ZVVJbnQxNkxFKCh2ICYgMHhGRkZGKSA+Pj4gMCwgMCk7XG5cbiAgcmV0dXJuIGJ1Zjtcbn07XG5cbnV0aWwuZ2V0U2hvcnRCeXRlc1ZhbHVlID0gZnVuY3Rpb24oYnVmLCBvZmZzZXQpIHtcbiAgcmV0dXJuIGJ1Zi5yZWFkVUludDE2TEUob2Zmc2V0KTtcbn07XG5cbnV0aWwuZ2V0TG9uZ0J5dGVzID0gZnVuY3Rpb24odikge1xuICB2YXIgYnVmID0gQnVmZmVyLmFsbG9jKDQpO1xuICBidWYud3JpdGVVSW50MzJMRSgodiAmIDB4RkZGRkZGRkYpID4+PiAwLCAwKTtcblxuICByZXR1cm4gYnVmO1xufTtcblxudXRpbC5nZXRMb25nQnl0ZXNWYWx1ZSA9IGZ1bmN0aW9uKGJ1Ziwgb2Zmc2V0KSB7XG4gIHJldHVybiBidWYucmVhZFVJbnQzMkxFKG9mZnNldCk7XG59O1xuXG51dGlsLnRvRG9zVGltZSA9IGZ1bmN0aW9uKGQpIHtcbiAgcmV0dXJuIHV0aWwuZ2V0TG9uZ0J5dGVzKHV0aWwuZGF0ZVRvRG9zKGQpKTtcbn07IiwKICAgICIvKipcbiAqIG5vZGUtY29tcHJlc3MtY29tbW9uc1xuICpcbiAqIENvcHlyaWdodCAoYykgMjAxNCBDaHJpcyBUYWxraW5ndG9uLCBjb250cmlidXRvcnMuXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgTUlUIGxpY2Vuc2UuXG4gKiBodHRwczovL2dpdGh1Yi5jb20vYXJjaGl2ZXJqcy9ub2RlLWNvbXByZXNzLWNvbW1vbnMvYmxvYi9tYXN0ZXIvTElDRU5TRS1NSVRcbiAqL1xudmFyIHppcFV0aWwgPSByZXF1aXJlKCcuL3V0aWwnKTtcblxudmFyIERBVEFfREVTQ1JJUFRPUl9GTEFHID0gMSA8PCAzO1xudmFyIEVOQ1JZUFRJT05fRkxBRyA9IDEgPDwgMDtcbnZhciBOVU1CRVJfT0ZfU0hBTk5PTl9GQU5PX1RSRUVTX0ZMQUcgPSAxIDw8IDI7XG52YXIgU0xJRElOR19ESUNUSU9OQVJZX1NJWkVfRkxBRyA9IDEgPDwgMTtcbnZhciBTVFJPTkdfRU5DUllQVElPTl9GTEFHID0gMSA8PCA2O1xudmFyIFVGVDhfTkFNRVNfRkxBRyA9IDEgPDwgMTE7XG5cbnZhciBHZW5lcmFsUHVycG9zZUJpdCA9IG1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24oKSB7XG4gIGlmICghKHRoaXMgaW5zdGFuY2VvZiBHZW5lcmFsUHVycG9zZUJpdCkpIHtcbiAgICByZXR1cm4gbmV3IEdlbmVyYWxQdXJwb3NlQml0KCk7XG4gIH1cblxuICB0aGlzLmRlc2NyaXB0b3IgPSBmYWxzZTtcbiAgdGhpcy5lbmNyeXB0aW9uID0gZmFsc2U7XG4gIHRoaXMudXRmOCA9IGZhbHNlO1xuICB0aGlzLm51bWJlck9mU2hhbm5vbkZhbm9UcmVlcyA9IDA7XG4gIHRoaXMuc3Ryb25nRW5jcnlwdGlvbiA9IGZhbHNlO1xuICB0aGlzLnNsaWRpbmdEaWN0aW9uYXJ5U2l6ZSA9IDA7XG5cbiAgcmV0dXJuIHRoaXM7XG59O1xuXG5HZW5lcmFsUHVycG9zZUJpdC5wcm90b3R5cGUuZW5jb2RlID0gZnVuY3Rpb24oKSB7XG4gIHJldHVybiB6aXBVdGlsLmdldFNob3J0Qnl0ZXMoXG4gICAgKHRoaXMuZGVzY3JpcHRvciA/IERBVEFfREVTQ1JJUFRPUl9GTEFHIDogMCkgfFxuICAgICh0aGlzLnV0ZjggPyBVRlQ4X05BTUVTX0ZMQUcgOiAwKSB8XG4gICAgKHRoaXMuZW5jcnlwdGlvbiA/IEVOQ1JZUFRJT05fRkxBRyA6IDApIHxcbiAgICAodGhpcy5zdHJvbmdFbmNyeXB0aW9uID8gU1RST05HX0VOQ1JZUFRJT05fRkxBRyA6IDApXG4gICk7XG59O1xuXG5HZW5lcmFsUHVycG9zZUJpdC5wcm90b3R5cGUucGFyc2UgPSBmdW5jdGlvbihidWYsIG9mZnNldCkge1xuICB2YXIgZmxhZyA9IHppcFV0aWwuZ2V0U2hvcnRCeXRlc1ZhbHVlKGJ1Ziwgb2Zmc2V0KTtcbiAgdmFyIGdicCA9IG5ldyBHZW5lcmFsUHVycG9zZUJpdCgpO1xuXG4gIGdicC51c2VEYXRhRGVzY3JpcHRvcigoZmxhZyAmIERBVEFfREVTQ1JJUFRPUl9GTEFHKSAhPT0gMCk7XG4gIGdicC51c2VVVEY4Rm9yTmFtZXMoKGZsYWcgJiBVRlQ4X05BTUVTX0ZMQUcpICE9PSAwKTtcbiAgZ2JwLnVzZVN0cm9uZ0VuY3J5cHRpb24oKGZsYWcgJiBTVFJPTkdfRU5DUllQVElPTl9GTEFHKSAhPT0gMCk7XG4gIGdicC51c2VFbmNyeXB0aW9uKChmbGFnICYgRU5DUllQVElPTl9GTEFHKSAhPT0gMCk7XG4gIGdicC5zZXRTbGlkaW5nRGljdGlvbmFyeVNpemUoKGZsYWcgJiBTTElESU5HX0RJQ1RJT05BUllfU0laRV9GTEFHKSAhPT0gMCA/IDgxOTIgOiA0MDk2KTtcbiAgZ2JwLnNldE51bWJlck9mU2hhbm5vbkZhbm9UcmVlcygoZmxhZyAmIE5VTUJFUl9PRl9TSEFOTk9OX0ZBTk9fVFJFRVNfRkxBRykgIT09IDAgPyAzIDogMik7XG5cbiAgcmV0dXJuIGdicDtcbn07XG5cbkdlbmVyYWxQdXJwb3NlQml0LnByb3RvdHlwZS5zZXROdW1iZXJPZlNoYW5ub25GYW5vVHJlZXMgPSBmdW5jdGlvbihuKSB7XG4gIHRoaXMubnVtYmVyT2ZTaGFubm9uRmFub1RyZWVzID0gbjtcbn07XG5cbkdlbmVyYWxQdXJwb3NlQml0LnByb3RvdHlwZS5nZXROdW1iZXJPZlNoYW5ub25GYW5vVHJlZXMgPSBmdW5jdGlvbigpIHtcbiAgcmV0dXJuIHRoaXMubnVtYmVyT2ZTaGFubm9uRmFub1RyZWVzO1xufTtcblxuR2VuZXJhbFB1cnBvc2VCaXQucHJvdG90eXBlLnNldFNsaWRpbmdEaWN0aW9uYXJ5U2l6ZSA9IGZ1bmN0aW9uKG4pIHtcbiAgdGhpcy5zbGlkaW5nRGljdGlvbmFyeVNpemUgPSBuO1xufTtcblxuR2VuZXJhbFB1cnBvc2VCaXQucHJvdG90eXBlLmdldFNsaWRpbmdEaWN0aW9uYXJ5U2l6ZSA9IGZ1bmN0aW9uKCkge1xuICByZXR1cm4gdGhpcy5zbGlkaW5nRGljdGlvbmFyeVNpemU7XG59O1xuXG5HZW5lcmFsUHVycG9zZUJpdC5wcm90b3R5cGUudXNlRGF0YURlc2NyaXB0b3IgPSBmdW5jdGlvbihiKSB7XG4gIHRoaXMuZGVzY3JpcHRvciA9IGI7XG59O1xuXG5HZW5lcmFsUHVycG9zZUJpdC5wcm90b3R5cGUudXNlc0RhdGFEZXNjcmlwdG9yID0gZnVuY3Rpb24oKSB7XG4gIHJldHVybiB0aGlzLmRlc2NyaXB0b3I7XG59O1xuXG5HZW5lcmFsUHVycG9zZUJpdC5wcm90b3R5cGUudXNlRW5jcnlwdGlvbiA9IGZ1bmN0aW9uKGIpIHtcbiAgdGhpcy5lbmNyeXB0aW9uID0gYjtcbn07XG5cbkdlbmVyYWxQdXJwb3NlQml0LnByb3RvdHlwZS51c2VzRW5jcnlwdGlvbiA9IGZ1bmN0aW9uKCkge1xuICByZXR1cm4gdGhpcy5lbmNyeXB0aW9uO1xufTtcblxuR2VuZXJhbFB1cnBvc2VCaXQucHJvdG90eXBlLnVzZVN0cm9uZ0VuY3J5cHRpb24gPSBmdW5jdGlvbihiKSB7XG4gIHRoaXMuc3Ryb25nRW5jcnlwdGlvbiA9IGI7XG59O1xuXG5HZW5lcmFsUHVycG9zZUJpdC5wcm90b3R5cGUudXNlc1N0cm9uZ0VuY3J5cHRpb24gPSBmdW5jdGlvbigpIHtcbiAgcmV0dXJuIHRoaXMuc3Ryb25nRW5jcnlwdGlvbjtcbn07XG5cbkdlbmVyYWxQdXJwb3NlQml0LnByb3RvdHlwZS51c2VVVEY4Rm9yTmFtZXMgPSBmdW5jdGlvbihiKSB7XG4gIHRoaXMudXRmOCA9IGI7XG59O1xuXG5HZW5lcmFsUHVycG9zZUJpdC5wcm90b3R5cGUudXNlc1VURjhGb3JOYW1lcyA9IGZ1bmN0aW9uKCkge1xuICByZXR1cm4gdGhpcy51dGY4O1xufTsiLAogICAgIi8qKlxuICogbm9kZS1jb21wcmVzcy1jb21tb25zXG4gKlxuICogQ29weXJpZ2h0IChjKSAyMDE0IENocmlzIFRhbGtpbmd0b24sIGNvbnRyaWJ1dG9ycy5cbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBNSVQgbGljZW5zZS5cbiAqIGh0dHBzOi8vZ2l0aHViLmNvbS9hcmNoaXZlcmpzL25vZGUtY29tcHJlc3MtY29tbW9ucy9ibG9iL21hc3Rlci9MSUNFTlNFLU1JVFxuICovXG5tb2R1bGUuZXhwb3J0cyA9IHtcbiAgICAvKipcbiAgICAgKiBCaXRzIHVzZWQgZm9yIHBlcm1pc3Npb25zIChhbmQgc3RpY2t5IGJpdClcbiAgICAgKi9cbiAgICBQRVJNX01BU0s6IDQwOTUsIC8vIDA3Nzc3XG5cbiAgICAvKipcbiAgICAgKiBCaXRzIHVzZWQgdG8gaW5kaWNhdGUgdGhlIGZpbGVzeXN0ZW0gb2JqZWN0IHR5cGUuXG4gICAgICovXG4gICAgRklMRV9UWVBFX0ZMQUc6IDYxNDQwLCAvLyAwMTcwMDAwXG5cbiAgICAvKipcbiAgICAgKiBJbmRpY2F0ZXMgc3ltYm9saWMgbGlua3MuXG4gICAgICovXG4gICAgTElOS19GTEFHOiA0MDk2MCwgLy8gMDEyMDAwMFxuXG4gICAgLyoqXG4gICAgICogSW5kaWNhdGVzIHBsYWluIGZpbGVzLlxuICAgICAqL1xuICAgIEZJTEVfRkxBRzogMzI3NjgsIC8vIDAxMDAwMDBcblxuICAgIC8qKlxuICAgICAqIEluZGljYXRlcyBkaXJlY3Rvcmllcy5cbiAgICAgKi9cbiAgICBESVJfRkxBRzogMTYzODQsIC8vIDA0MDAwMFxuXG4gICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuICAgIC8vIHNvbWV3aGF0IGFyYml0cmFyeSBjaG9pY2VzIHRoYXQgYXJlIHF1aXRlIGNvbW1vbiBmb3Igc2hhcmVkXG4gICAgLy8gaW5zdGFsbGF0aW9uc1xuICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG5cbiAgICAvKipcbiAgICAgKiBEZWZhdWx0IHBlcm1pc3Npb25zIGZvciBzeW1ib2xpYyBsaW5rcy5cbiAgICAgKi9cbiAgICBERUZBVUxUX0xJTktfUEVSTTogNTExLCAvLyAwNzc3XG5cbiAgICAvKipcbiAgICAgKiBEZWZhdWx0IHBlcm1pc3Npb25zIGZvciBkaXJlY3Rvcmllcy5cbiAgICAgKi9cbiAgICBERUZBVUxUX0RJUl9QRVJNOiA0OTMsIC8vIDA3NTVcblxuICAgIC8qKlxuICAgICAqIERlZmF1bHQgcGVybWlzc2lvbnMgZm9yIHBsYWluIGZpbGVzLlxuICAgICAqL1xuICAgIERFRkFVTFRfRklMRV9QRVJNOiA0MjAgLy8gMDY0NFxufTsiLAogICAgIi8qKlxuICogbm9kZS1jb21wcmVzcy1jb21tb25zXG4gKlxuICogQ29weXJpZ2h0IChjKSAyMDE0IENocmlzIFRhbGtpbmd0b24sIGNvbnRyaWJ1dG9ycy5cbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBNSVQgbGljZW5zZS5cbiAqIGh0dHBzOi8vZ2l0aHViLmNvbS9hcmNoaXZlcmpzL25vZGUtY29tcHJlc3MtY29tbW9ucy9ibG9iL21hc3Rlci9MSUNFTlNFLU1JVFxuICovXG5tb2R1bGUuZXhwb3J0cyA9IHtcbiAgV09SRDogNCxcbiAgRFdPUkQ6IDgsXG4gIEVNUFRZOiBCdWZmZXIuYWxsb2MoMCksXG5cbiAgU0hPUlQ6IDIsXG4gIFNIT1JUX01BU0s6IDB4ZmZmZixcbiAgU0hPUlRfU0hJRlQ6IDE2LFxuICBTSE9SVF9aRVJPOiBCdWZmZXIuZnJvbShBcnJheSgyKSksXG4gIExPTkc6IDQsXG4gIExPTkdfWkVSTzogQnVmZmVyLmZyb20oQXJyYXkoNCkpLFxuXG4gIE1JTl9WRVJTSU9OX0lOSVRJQUw6IDEwLFxuICBNSU5fVkVSU0lPTl9EQVRBX0RFU0NSSVBUT1I6IDIwLFxuICBNSU5fVkVSU0lPTl9aSVA2NDogNDUsXG4gIFZFUlNJT05fTUFERUJZOiA0NSxcblxuICBNRVRIT0RfU1RPUkVEOiAwLFxuICBNRVRIT0RfREVGTEFURUQ6IDgsXG5cbiAgUExBVEZPUk1fVU5JWDogMyxcbiAgUExBVEZPUk1fRkFUOiAwLFxuXG4gIFNJR19MRkg6IDB4MDQwMzRiNTAsXG4gIFNJR19ERDogMHgwODA3NGI1MCxcbiAgU0lHX0NGSDogMHgwMjAxNGI1MCxcbiAgU0lHX0VPQ0Q6IDB4MDYwNTRiNTAsXG4gIFNJR19aSVA2NF9FT0NEOiAweDA2MDY0QjUwLFxuICBTSUdfWklQNjRfRU9DRF9MT0M6IDB4MDcwNjRCNTAsXG5cbiAgWklQNjRfTUFHSUNfU0hPUlQ6IDB4ZmZmZixcbiAgWklQNjRfTUFHSUM6IDB4ZmZmZmZmZmYsXG4gIFpJUDY0X0VYVFJBX0lEOiAweDAwMDEsXG5cbiAgWkxJQl9OT19DT01QUkVTU0lPTjogMCxcbiAgWkxJQl9CRVNUX1NQRUVEOiAxLFxuICBaTElCX0JFU1RfQ09NUFJFU1NJT046IDksXG4gIFpMSUJfREVGQVVMVF9DT01QUkVTU0lPTjogLTEsXG5cbiAgTU9ERV9NQVNLOiAweEZGRixcbiAgREVGQVVMVF9GSUxFX01PREU6IDMzMTg4LCAvLyAwMTA2NDQgPSAtcnctci0tci0tID0gU19JRlJFRyB8IFNfSVJVU1IgfCBTX0lXVVNSIHwgU19JUkdSUCB8IFNfSVJPVEhcbiAgREVGQVVMVF9ESVJfTU9ERTogMTY4NzcsICAvLyAwNDA3NTUgPSBkcnd4ci14ci14ID0gU19JRkRJUiB8IFNfSVJXWFUgfCBTX0lSR1JQIHwgU19JWEdSUCB8IFNfSVJPVEggfCBTX0lYT1RIXG5cbiAgRVhUX0ZJTEVfQVRUUl9ESVI6IDExMDYwNTEwODgsICAvLyAwMTAxNzMyMDAwMjAgPSBkcnd4ci14ci14ID0gKCgoU19JRkRJUiB8IDA3NTUpIDw8IDE2KSB8IFNfRE9TX0QpXG4gIEVYVF9GSUxFX0FUVFJfRklMRTogMjE3NTAwODgwMCwgLy8gMDIwMTUxMDAwMDQwID0gLXJ3LXItLXItLSA9ICgoKFNfSUZSRUcgfCAwNjQ0KSA8PCAxNikgfCBTX0RPU19BKSA+Pj4gMFxuXG4gIC8vIFVuaXggZmlsZSB0eXBlc1xuICBTX0lGTVQ6IDYxNDQwLCAgIC8vIDAxNzAwMDAgdHlwZSBvZiBmaWxlIG1hc2tcbiAgU19JRklGTzogNDA5NiwgICAvLyAwMTAwMDAgbmFtZWQgcGlwZSAoZmlmbylcbiAgU19JRkNIUjogODE5MiwgICAvLyAwMjAwMDAgY2hhcmFjdGVyIHNwZWNpYWxcbiAgU19JRkRJUjogMTYzODQsICAvLyAwNDAwMDAgZGlyZWN0b3J5XG4gIFNfSUZCTEs6IDI0NTc2LCAgLy8gMDYwMDAwIGJsb2NrIHNwZWNpYWxcbiAgU19JRlJFRzogMzI3NjgsICAvLyAwMTAwMDAwIHJlZ3VsYXJcbiAgU19JRkxOSzogNDA5NjAsICAvLyAwMTIwMDAwIHN5bWJvbGljIGxpbmtcbiAgU19JRlNPQ0s6IDQ5MTUyLCAvLyAwMTQwMDAwIHNvY2tldFxuXG4gIC8vIERPUyBmaWxlIHR5cGUgZmxhZ3NcbiAgU19ET1NfQTogMzIsIC8vIDA0MCBBcmNoaXZlXG4gIFNfRE9TX0Q6IDE2LCAvLyAwMjAgRGlyZWN0b3J5XG4gIFNfRE9TX1Y6IDgsICAvLyAwMTAgVm9sdW1lXG4gIFNfRE9TX1M6IDQsICAvLyAwNCBTeXN0ZW1cbiAgU19ET1NfSDogMiwgIC8vIDAyIEhpZGRlblxuICBTX0RPU19SOiAxICAgLy8gMDEgUmVhZCBPbmx5XG59O1xuIiwKICAgICIvKipcbiAqIG5vZGUtY29tcHJlc3MtY29tbW9uc1xuICpcbiAqIENvcHlyaWdodCAoYykgMjAxNCBDaHJpcyBUYWxraW5ndG9uLCBjb250cmlidXRvcnMuXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgTUlUIGxpY2Vuc2UuXG4gKiBodHRwczovL2dpdGh1Yi5jb20vYXJjaGl2ZXJqcy9ub2RlLWNvbXByZXNzLWNvbW1vbnMvYmxvYi9tYXN0ZXIvTElDRU5TRS1NSVRcbiAqL1xudmFyIGluaGVyaXRzID0gcmVxdWlyZSgndXRpbCcpLmluaGVyaXRzO1xudmFyIG5vcm1hbGl6ZVBhdGggPSByZXF1aXJlKCdub3JtYWxpemUtcGF0aCcpO1xuXG52YXIgQXJjaGl2ZUVudHJ5ID0gcmVxdWlyZSgnLi4vYXJjaGl2ZS1lbnRyeScpO1xudmFyIEdlbmVyYWxQdXJwb3NlQml0ID0gcmVxdWlyZSgnLi9nZW5lcmFsLXB1cnBvc2UtYml0Jyk7XG52YXIgVW5peFN0YXQgPSByZXF1aXJlKCcuL3VuaXgtc3RhdCcpO1xuXG52YXIgY29uc3RhbnRzID0gcmVxdWlyZSgnLi9jb25zdGFudHMnKTtcbnZhciB6aXBVdGlsID0gcmVxdWlyZSgnLi91dGlsJyk7XG5cbnZhciBaaXBBcmNoaXZlRW50cnkgPSBtb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uKG5hbWUpIHtcbiAgaWYgKCEodGhpcyBpbnN0YW5jZW9mIFppcEFyY2hpdmVFbnRyeSkpIHtcbiAgICByZXR1cm4gbmV3IFppcEFyY2hpdmVFbnRyeShuYW1lKTtcbiAgfVxuXG4gIEFyY2hpdmVFbnRyeS5jYWxsKHRoaXMpO1xuXG4gIHRoaXMucGxhdGZvcm0gPSBjb25zdGFudHMuUExBVEZPUk1fRkFUO1xuICB0aGlzLm1ldGhvZCA9IC0xO1xuXG4gIHRoaXMubmFtZSA9IG51bGw7XG4gIHRoaXMuc2l6ZSA9IDA7XG4gIHRoaXMuY3NpemUgPSAwO1xuICB0aGlzLmdwYiA9IG5ldyBHZW5lcmFsUHVycG9zZUJpdCgpO1xuICB0aGlzLmNyYyA9IDA7XG4gIHRoaXMudGltZSA9IC0xO1xuXG4gIHRoaXMubWludmVyID0gY29uc3RhbnRzLk1JTl9WRVJTSU9OX0lOSVRJQUw7XG4gIHRoaXMubW9kZSA9IC0xO1xuICB0aGlzLmV4dHJhID0gbnVsbDtcbiAgdGhpcy5leGF0dHIgPSAwO1xuICB0aGlzLmluYXR0ciA9IDA7XG4gIHRoaXMuY29tbWVudCA9IG51bGw7XG5cbiAgaWYgKG5hbWUpIHtcbiAgICB0aGlzLnNldE5hbWUobmFtZSk7XG4gIH1cbn07XG5cbmluaGVyaXRzKFppcEFyY2hpdmVFbnRyeSwgQXJjaGl2ZUVudHJ5KTtcblxuLyoqXG4gKiBSZXR1cm5zIHRoZSBleHRyYSBmaWVsZHMgcmVsYXRlZCB0byB0aGUgZW50cnkuXG4gKlxuICogQHJldHVybnMge0J1ZmZlcn1cbiAqL1xuWmlwQXJjaGl2ZUVudHJ5LnByb3RvdHlwZS5nZXRDZW50cmFsRGlyZWN0b3J5RXh0cmEgPSBmdW5jdGlvbigpIHtcbiAgcmV0dXJuIHRoaXMuZ2V0RXh0cmEoKTtcbn07XG5cbi8qKlxuICogUmV0dXJucyB0aGUgY29tbWVudCBzZXQgZm9yIHRoZSBlbnRyeS5cbiAqXG4gKiBAcmV0dXJucyB7c3RyaW5nfVxuICovXG5aaXBBcmNoaXZlRW50cnkucHJvdG90eXBlLmdldENvbW1lbnQgPSBmdW5jdGlvbigpIHtcbiAgcmV0dXJuIHRoaXMuY29tbWVudCAhPT0gbnVsbCA/IHRoaXMuY29tbWVudCA6ICcnO1xufTtcblxuLyoqXG4gKiBSZXR1cm5zIHRoZSBjb21wcmVzc2VkIHNpemUgb2YgdGhlIGVudHJ5LlxuICpcbiAqIEByZXR1cm5zIHtudW1iZXJ9XG4gKi9cblppcEFyY2hpdmVFbnRyeS5wcm90b3R5cGUuZ2V0Q29tcHJlc3NlZFNpemUgPSBmdW5jdGlvbigpIHtcbiAgcmV0dXJuIHRoaXMuY3NpemU7XG59O1xuXG4vKipcbiAqIFJldHVybnMgdGhlIENSQzMyIGRpZ2VzdCBmb3IgdGhlIGVudHJ5LlxuICpcbiAqIEByZXR1cm5zIHtudW1iZXJ9XG4gKi9cblppcEFyY2hpdmVFbnRyeS5wcm90b3R5cGUuZ2V0Q3JjID0gZnVuY3Rpb24oKSB7XG4gIHJldHVybiB0aGlzLmNyYztcbn07XG5cbi8qKlxuICogUmV0dXJucyB0aGUgZXh0ZXJuYWwgZmlsZSBhdHRyaWJ1dGVzIGZvciB0aGUgZW50cnkuXG4gKlxuICogQHJldHVybnMge251bWJlcn1cbiAqL1xuWmlwQXJjaGl2ZUVudHJ5LnByb3RvdHlwZS5nZXRFeHRlcm5hbEF0dHJpYnV0ZXMgPSBmdW5jdGlvbigpIHtcbiAgcmV0dXJuIHRoaXMuZXhhdHRyO1xufTtcblxuLyoqXG4gKiBSZXR1cm5zIHRoZSBleHRyYSBmaWVsZHMgcmVsYXRlZCB0byB0aGUgZW50cnkuXG4gKlxuICogQHJldHVybnMge0J1ZmZlcn1cbiAqL1xuWmlwQXJjaGl2ZUVudHJ5LnByb3RvdHlwZS5nZXRFeHRyYSA9IGZ1bmN0aW9uKCkge1xuICByZXR1cm4gdGhpcy5leHRyYSAhPT0gbnVsbCA/IHRoaXMuZXh0cmEgOiBjb25zdGFudHMuRU1QVFk7XG59O1xuXG4vKipcbiAqIFJldHVybnMgdGhlIGdlbmVyYWwgcHVycG9zZSBiaXRzIHJlbGF0ZWQgdG8gdGhlIGVudHJ5LlxuICpcbiAqIEByZXR1cm5zIHtHZW5lcmFsUHVycG9zZUJpdH1cbiAqL1xuWmlwQXJjaGl2ZUVudHJ5LnByb3RvdHlwZS5nZXRHZW5lcmFsUHVycG9zZUJpdCA9IGZ1bmN0aW9uKCkge1xuICByZXR1cm4gdGhpcy5ncGI7XG59O1xuXG4vKipcbiAqIFJldHVybnMgdGhlIGludGVybmFsIGZpbGUgYXR0cmlidXRlcyBmb3IgdGhlIGVudHJ5LlxuICpcbiAqIEByZXR1cm5zIHtudW1iZXJ9XG4gKi9cblppcEFyY2hpdmVFbnRyeS5wcm90b3R5cGUuZ2V0SW50ZXJuYWxBdHRyaWJ1dGVzID0gZnVuY3Rpb24oKSB7XG4gIHJldHVybiB0aGlzLmluYXR0cjtcbn07XG5cbi8qKlxuICogUmV0dXJucyB0aGUgbGFzdCBtb2RpZmllZCBkYXRlIG9mIHRoZSBlbnRyeS5cbiAqXG4gKiBAcmV0dXJucyB7bnVtYmVyfVxuICovXG5aaXBBcmNoaXZlRW50cnkucHJvdG90eXBlLmdldExhc3RNb2RpZmllZERhdGUgPSBmdW5jdGlvbigpIHtcbiAgcmV0dXJuIHRoaXMuZ2V0VGltZSgpO1xufTtcblxuLyoqXG4gKiBSZXR1cm5zIHRoZSBleHRyYSBmaWVsZHMgcmVsYXRlZCB0byB0aGUgZW50cnkuXG4gKlxuICogQHJldHVybnMge0J1ZmZlcn1cbiAqL1xuWmlwQXJjaGl2ZUVudHJ5LnByb3RvdHlwZS5nZXRMb2NhbEZpbGVEYXRhRXh0cmEgPSBmdW5jdGlvbigpIHtcbiAgcmV0dXJuIHRoaXMuZ2V0RXh0cmEoKTtcbn07XG5cbi8qKlxuICogUmV0dXJucyB0aGUgY29tcHJlc3Npb24gbWV0aG9kIHVzZWQgb24gdGhlIGVudHJ5LlxuICpcbiAqIEByZXR1cm5zIHtudW1iZXJ9XG4gKi9cblppcEFyY2hpdmVFbnRyeS5wcm90b3R5cGUuZ2V0TWV0aG9kID0gZnVuY3Rpb24oKSB7XG4gIHJldHVybiB0aGlzLm1ldGhvZDtcbn07XG5cbi8qKlxuICogUmV0dXJucyB0aGUgZmlsZW5hbWUgb2YgdGhlIGVudHJ5LlxuICpcbiAqIEByZXR1cm5zIHtzdHJpbmd9XG4gKi9cblppcEFyY2hpdmVFbnRyeS5wcm90b3R5cGUuZ2V0TmFtZSA9IGZ1bmN0aW9uKCkge1xuICByZXR1cm4gdGhpcy5uYW1lO1xufTtcblxuLyoqXG4gKiBSZXR1cm5zIHRoZSBwbGF0Zm9ybSBvbiB3aGljaCB0aGUgZW50cnkgd2FzIG1hZGUuXG4gKlxuICogQHJldHVybnMge251bWJlcn1cbiAqL1xuWmlwQXJjaGl2ZUVudHJ5LnByb3RvdHlwZS5nZXRQbGF0Zm9ybSA9IGZ1bmN0aW9uKCkge1xuICByZXR1cm4gdGhpcy5wbGF0Zm9ybTtcbn07XG5cbi8qKlxuICogUmV0dXJucyB0aGUgc2l6ZSBvZiB0aGUgZW50cnkuXG4gKlxuICogQHJldHVybnMge251bWJlcn1cbiAqL1xuWmlwQXJjaGl2ZUVudHJ5LnByb3RvdHlwZS5nZXRTaXplID0gZnVuY3Rpb24oKSB7XG4gIHJldHVybiB0aGlzLnNpemU7XG59O1xuXG4vKipcbiAqIFJldHVybnMgYSBkYXRlIG9iamVjdCByZXByZXNlbnRpbmcgdGhlIGxhc3QgbW9kaWZpZWQgZGF0ZSBvZiB0aGUgZW50cnkuXG4gKlxuICogQHJldHVybnMge251bWJlcnxEYXRlfVxuICovXG5aaXBBcmNoaXZlRW50cnkucHJvdG90eXBlLmdldFRpbWUgPSBmdW5jdGlvbigpIHtcbiAgcmV0dXJuIHRoaXMudGltZSAhPT0gLTEgPyB6aXBVdGlsLmRvc1RvRGF0ZSh0aGlzLnRpbWUpIDogLTE7XG59O1xuXG4vKipcbiAqIFJldHVybnMgdGhlIERPUyB0aW1lc3RhbXAgZm9yIHRoZSBlbnRyeS5cbiAqXG4gKiBAcmV0dXJucyB7bnVtYmVyfVxuICovXG5aaXBBcmNoaXZlRW50cnkucHJvdG90eXBlLmdldFRpbWVEb3MgPSBmdW5jdGlvbigpIHtcbiAgcmV0dXJuIHRoaXMudGltZSAhPT0gLTEgPyB0aGlzLnRpbWUgOiAwO1xufTtcblxuLyoqXG4gKiBSZXR1cm5zIHRoZSBVTklYIGZpbGUgcGVybWlzc2lvbnMgZm9yIHRoZSBlbnRyeS5cbiAqXG4gKiBAcmV0dXJucyB7bnVtYmVyfVxuICovXG5aaXBBcmNoaXZlRW50cnkucHJvdG90eXBlLmdldFVuaXhNb2RlID0gZnVuY3Rpb24oKSB7XG4gIHJldHVybiB0aGlzLnBsYXRmb3JtICE9PSBjb25zdGFudHMuUExBVEZPUk1fVU5JWCA/IDAgOiAoKHRoaXMuZ2V0RXh0ZXJuYWxBdHRyaWJ1dGVzKCkgPj4gY29uc3RhbnRzLlNIT1JUX1NISUZUKSAmIGNvbnN0YW50cy5TSE9SVF9NQVNLKTtcbn07XG5cbi8qKlxuICogUmV0dXJucyB0aGUgdmVyc2lvbiBvZiBaSVAgbmVlZGVkIHRvIGV4dHJhY3QgdGhlIGVudHJ5LlxuICpcbiAqIEByZXR1cm5zIHtudW1iZXJ9XG4gKi9cblppcEFyY2hpdmVFbnRyeS5wcm90b3R5cGUuZ2V0VmVyc2lvbk5lZWRlZFRvRXh0cmFjdCA9IGZ1bmN0aW9uKCkge1xuICByZXR1cm4gdGhpcy5taW52ZXI7XG59O1xuXG4vKipcbiAqIFNldHMgdGhlIGNvbW1lbnQgb2YgdGhlIGVudHJ5LlxuICpcbiAqIEBwYXJhbSBjb21tZW50XG4gKi9cblppcEFyY2hpdmVFbnRyeS5wcm90b3R5cGUuc2V0Q29tbWVudCA9IGZ1bmN0aW9uKGNvbW1lbnQpIHtcbiAgaWYgKEJ1ZmZlci5ieXRlTGVuZ3RoKGNvbW1lbnQpICE9PSBjb21tZW50Lmxlbmd0aCkge1xuICAgIHRoaXMuZ2V0R2VuZXJhbFB1cnBvc2VCaXQoKS51c2VVVEY4Rm9yTmFtZXModHJ1ZSk7XG4gIH1cblxuICB0aGlzLmNvbW1lbnQgPSBjb21tZW50O1xufTtcblxuLyoqXG4gKiBTZXRzIHRoZSBjb21wcmVzc2VkIHNpemUgb2YgdGhlIGVudHJ5LlxuICpcbiAqIEBwYXJhbSBzaXplXG4gKi9cblppcEFyY2hpdmVFbnRyeS5wcm90b3R5cGUuc2V0Q29tcHJlc3NlZFNpemUgPSBmdW5jdGlvbihzaXplKSB7XG4gIGlmIChzaXplIDwgMCkge1xuICAgIHRocm93IG5ldyBFcnJvcignaW52YWxpZCBlbnRyeSBjb21wcmVzc2VkIHNpemUnKTtcbiAgfVxuXG4gIHRoaXMuY3NpemUgPSBzaXplO1xufTtcblxuLyoqXG4gKiBTZXRzIHRoZSBjaGVja3N1bSBvZiB0aGUgZW50cnkuXG4gKlxuICogQHBhcmFtIGNyY1xuICovXG5aaXBBcmNoaXZlRW50cnkucHJvdG90eXBlLnNldENyYyA9IGZ1bmN0aW9uKGNyYykge1xuICBpZiAoY3JjIDwgMCkge1xuICAgIHRocm93IG5ldyBFcnJvcignaW52YWxpZCBlbnRyeSBjcmMzMicpO1xuICB9XG5cbiAgdGhpcy5jcmMgPSBjcmM7XG59O1xuXG4vKipcbiAqIFNldHMgdGhlIGV4dGVybmFsIGZpbGUgYXR0cmlidXRlcyBvZiB0aGUgZW50cnkuXG4gKlxuICogQHBhcmFtIGF0dHJcbiAqL1xuWmlwQXJjaGl2ZUVudHJ5LnByb3RvdHlwZS5zZXRFeHRlcm5hbEF0dHJpYnV0ZXMgPSBmdW5jdGlvbihhdHRyKSB7XG4gIHRoaXMuZXhhdHRyID0gYXR0ciA+Pj4gMDtcbn07XG5cbi8qKlxuICogU2V0cyB0aGUgZXh0cmEgZmllbGRzIHJlbGF0ZWQgdG8gdGhlIGVudHJ5LlxuICpcbiAqIEBwYXJhbSBleHRyYVxuICovXG5aaXBBcmNoaXZlRW50cnkucHJvdG90eXBlLnNldEV4dHJhID0gZnVuY3Rpb24oZXh0cmEpIHtcbiAgdGhpcy5leHRyYSA9IGV4dHJhO1xufTtcblxuLyoqXG4gKiBTZXRzIHRoZSBnZW5lcmFsIHB1cnBvc2UgYml0cyByZWxhdGVkIHRvIHRoZSBlbnRyeS5cbiAqXG4gKiBAcGFyYW0gZ3BiXG4gKi9cblppcEFyY2hpdmVFbnRyeS5wcm90b3R5cGUuc2V0R2VuZXJhbFB1cnBvc2VCaXQgPSBmdW5jdGlvbihncGIpIHtcbiAgaWYgKCEoZ3BiIGluc3RhbmNlb2YgR2VuZXJhbFB1cnBvc2VCaXQpKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKCdpbnZhbGlkIGVudHJ5IEdlbmVyYWxQdXJwb3NlQml0Jyk7XG4gIH1cblxuICB0aGlzLmdwYiA9IGdwYjtcbn07XG5cbi8qKlxuICogU2V0cyB0aGUgaW50ZXJuYWwgZmlsZSBhdHRyaWJ1dGVzIG9mIHRoZSBlbnRyeS5cbiAqXG4gKiBAcGFyYW0gYXR0clxuICovXG5aaXBBcmNoaXZlRW50cnkucHJvdG90eXBlLnNldEludGVybmFsQXR0cmlidXRlcyA9IGZ1bmN0aW9uKGF0dHIpIHtcbiAgdGhpcy5pbmF0dHIgPSBhdHRyO1xufTtcblxuLyoqXG4gKiBTZXRzIHRoZSBjb21wcmVzc2lvbiBtZXRob2Qgb2YgdGhlIGVudHJ5LlxuICpcbiAqIEBwYXJhbSBtZXRob2RcbiAqL1xuWmlwQXJjaGl2ZUVudHJ5LnByb3RvdHlwZS5zZXRNZXRob2QgPSBmdW5jdGlvbihtZXRob2QpIHtcbiAgaWYgKG1ldGhvZCA8IDApIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoJ2ludmFsaWQgZW50cnkgY29tcHJlc3Npb24gbWV0aG9kJyk7XG4gIH1cblxuICB0aGlzLm1ldGhvZCA9IG1ldGhvZDtcbn07XG5cbi8qKlxuICogU2V0cyB0aGUgbmFtZSBvZiB0aGUgZW50cnkuXG4gKlxuICogQHBhcmFtIG5hbWVcbiAqIEBwYXJhbSBwcmVwZW5kU2xhc2hcbiAqL1xuWmlwQXJjaGl2ZUVudHJ5LnByb3RvdHlwZS5zZXROYW1lID0gZnVuY3Rpb24obmFtZSwgcHJlcGVuZFNsYXNoID0gZmFsc2UpIHtcbiAgbmFtZSA9IG5vcm1hbGl6ZVBhdGgobmFtZSwgZmFsc2UpXG4gICAgLnJlcGxhY2UoL15cXHcrOi8sICcnKVxuICAgIC5yZXBsYWNlKC9eKFxcLlxcLlxcL3xcXC8pKy8sICcnKTtcblxuICBpZiAocHJlcGVuZFNsYXNoKSB7XG4gICAgbmFtZSA9IGAvJHtuYW1lfWA7XG4gIH1cblxuICBpZiAoQnVmZmVyLmJ5dGVMZW5ndGgobmFtZSkgIT09IG5hbWUubGVuZ3RoKSB7XG4gICAgdGhpcy5nZXRHZW5lcmFsUHVycG9zZUJpdCgpLnVzZVVURjhGb3JOYW1lcyh0cnVlKTtcbiAgfVxuXG4gIHRoaXMubmFtZSA9IG5hbWU7XG59O1xuXG4vKipcbiAqIFNldHMgdGhlIHBsYXRmb3JtIG9uIHdoaWNoIHRoZSBlbnRyeSB3YXMgbWFkZS5cbiAqXG4gKiBAcGFyYW0gcGxhdGZvcm1cbiAqL1xuWmlwQXJjaGl2ZUVudHJ5LnByb3RvdHlwZS5zZXRQbGF0Zm9ybSA9IGZ1bmN0aW9uKHBsYXRmb3JtKSB7XG4gIHRoaXMucGxhdGZvcm0gPSBwbGF0Zm9ybTtcbn07XG5cbi8qKlxuICogU2V0cyB0aGUgc2l6ZSBvZiB0aGUgZW50cnkuXG4gKlxuICogQHBhcmFtIHNpemVcbiAqL1xuWmlwQXJjaGl2ZUVudHJ5LnByb3RvdHlwZS5zZXRTaXplID0gZnVuY3Rpb24oc2l6ZSkge1xuICBpZiAoc2l6ZSA8IDApIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoJ2ludmFsaWQgZW50cnkgc2l6ZScpO1xuICB9XG5cbiAgdGhpcy5zaXplID0gc2l6ZTtcbn07XG5cbi8qKlxuICogU2V0cyB0aGUgdGltZSBvZiB0aGUgZW50cnkuXG4gKlxuICogQHBhcmFtIHRpbWVcbiAqIEBwYXJhbSBmb3JjZUxvY2FsVGltZVxuICovXG5aaXBBcmNoaXZlRW50cnkucHJvdG90eXBlLnNldFRpbWUgPSBmdW5jdGlvbih0aW1lLCBmb3JjZUxvY2FsVGltZSkge1xuICBpZiAoISh0aW1lIGluc3RhbmNlb2YgRGF0ZSkpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoJ2ludmFsaWQgZW50cnkgdGltZScpO1xuICB9XG5cbiAgdGhpcy50aW1lID0gemlwVXRpbC5kYXRlVG9Eb3ModGltZSwgZm9yY2VMb2NhbFRpbWUpO1xufTtcblxuLyoqXG4gKiBTZXRzIHRoZSBVTklYIGZpbGUgcGVybWlzc2lvbnMgZm9yIHRoZSBlbnRyeS5cbiAqXG4gKiBAcGFyYW0gbW9kZVxuICovXG5aaXBBcmNoaXZlRW50cnkucHJvdG90eXBlLnNldFVuaXhNb2RlID0gZnVuY3Rpb24obW9kZSkge1xuICBtb2RlIHw9IHRoaXMuaXNEaXJlY3RvcnkoKSA/IGNvbnN0YW50cy5TX0lGRElSIDogY29uc3RhbnRzLlNfSUZSRUc7XG5cbiAgdmFyIGV4dGF0dHIgPSAwO1xuICBleHRhdHRyIHw9IChtb2RlIDw8IGNvbnN0YW50cy5TSE9SVF9TSElGVCkgfCAodGhpcy5pc0RpcmVjdG9yeSgpID8gY29uc3RhbnRzLlNfRE9TX0QgOiBjb25zdGFudHMuU19ET1NfQSk7XG5cbiAgdGhpcy5zZXRFeHRlcm5hbEF0dHJpYnV0ZXMoZXh0YXR0cik7XG4gIHRoaXMubW9kZSA9IG1vZGUgJiBjb25zdGFudHMuTU9ERV9NQVNLO1xuICB0aGlzLnBsYXRmb3JtID0gY29uc3RhbnRzLlBMQVRGT1JNX1VOSVg7XG59O1xuXG4vKipcbiAqIFNldHMgdGhlIHZlcnNpb24gb2YgWklQIG5lZWRlZCB0byBleHRyYWN0IHRoaXMgZW50cnkuXG4gKlxuICogQHBhcmFtIG1pbnZlclxuICovXG5aaXBBcmNoaXZlRW50cnkucHJvdG90eXBlLnNldFZlcnNpb25OZWVkZWRUb0V4dHJhY3QgPSBmdW5jdGlvbihtaW52ZXIpIHtcbiAgdGhpcy5taW52ZXIgPSBtaW52ZXI7XG59O1xuXG4vKipcbiAqIFJldHVybnMgdHJ1ZSBpZiB0aGlzIGVudHJ5IHJlcHJlc2VudHMgYSBkaXJlY3RvcnkuXG4gKlxuICogQHJldHVybnMge2Jvb2xlYW59XG4gKi9cblppcEFyY2hpdmVFbnRyeS5wcm90b3R5cGUuaXNEaXJlY3RvcnkgPSBmdW5jdGlvbigpIHtcbiAgcmV0dXJuIHRoaXMuZ2V0TmFtZSgpLnNsaWNlKC0xKSA9PT0gJy8nO1xufTtcblxuLyoqXG4gKiBSZXR1cm5zIHRydWUgaWYgdGhpcyBlbnRyeSByZXByZXNlbnRzIGEgdW5peCBzeW1saW5rLFxuICogaW4gd2hpY2ggY2FzZSB0aGUgZW50cnkncyBjb250ZW50IGNvbnRhaW5zIHRoZSB0YXJnZXQgcGF0aFxuICogZm9yIHRoZSBzeW1saW5rLlxuICpcbiAqIEByZXR1cm5zIHtib29sZWFufVxuICovXG5aaXBBcmNoaXZlRW50cnkucHJvdG90eXBlLmlzVW5peFN5bWxpbmsgPSBmdW5jdGlvbigpIHtcbiAgcmV0dXJuICh0aGlzLmdldFVuaXhNb2RlKCkgJiBVbml4U3RhdC5GSUxFX1RZUEVfRkxBRykgPT09IFVuaXhTdGF0LkxJTktfRkxBRztcbn07XG5cbi8qKlxuICogUmV0dXJucyB0cnVlIGlmIHRoaXMgZW50cnkgaXMgdXNpbmcgdGhlIFpJUDY0IGV4dGVuc2lvbiBvZiBaSVAuXG4gKlxuICogQHJldHVybnMge2Jvb2xlYW59XG4gKi9cblppcEFyY2hpdmVFbnRyeS5wcm90b3R5cGUuaXNaaXA2NCA9IGZ1bmN0aW9uKCkge1xuICByZXR1cm4gdGhpcy5jc2l6ZSA+IGNvbnN0YW50cy5aSVA2NF9NQUdJQyB8fCB0aGlzLnNpemUgPiBjb25zdGFudHMuWklQNjRfTUFHSUM7XG59O1xuIiwKICAgICIvKipcbiAqIG5vZGUtY29tcHJlc3MtY29tbW9uc1xuICpcbiAqIENvcHlyaWdodCAoYykgMjAxNCBDaHJpcyBUYWxraW5ndG9uLCBjb250cmlidXRvcnMuXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgTUlUIGxpY2Vuc2UuXG4gKiBodHRwczovL2dpdGh1Yi5jb20vYXJjaGl2ZXJqcy9ub2RlLWNvbXByZXNzLWNvbW1vbnMvYmxvYi9tYXN0ZXIvTElDRU5TRS1NSVRcbiAqL1xudmFyIFN0cmVhbSA9IHJlcXVpcmUoJ3N0cmVhbScpLlN0cmVhbTtcbnZhciBQYXNzVGhyb3VnaCA9IHJlcXVpcmUoJ3JlYWRhYmxlLXN0cmVhbScpLlBhc3NUaHJvdWdoO1xudmFyIGlzU3RyZWFtID0gcmVxdWlyZSgnaXMtc3RyZWFtJyk7XG5cbnZhciB1dGlsID0gbW9kdWxlLmV4cG9ydHMgPSB7fTtcblxudXRpbC5ub3JtYWxpemVJbnB1dFNvdXJjZSA9IGZ1bmN0aW9uKHNvdXJjZSkge1xuICBpZiAoc291cmNlID09PSBudWxsKSB7XG4gICAgcmV0dXJuIEJ1ZmZlci5hbGxvYygwKTtcbiAgfSBlbHNlIGlmICh0eXBlb2Ygc291cmNlID09PSAnc3RyaW5nJykge1xuICAgIHJldHVybiBCdWZmZXIuZnJvbShzb3VyY2UpO1xuICB9IGVsc2UgaWYgKGlzU3RyZWFtKHNvdXJjZSkgJiYgIXNvdXJjZS5fcmVhZGFibGVTdGF0ZSkge1xuICAgIHZhciBub3JtYWxpemVkID0gbmV3IFBhc3NUaHJvdWdoKCk7XG4gICAgc291cmNlLnBpcGUobm9ybWFsaXplZCk7XG5cbiAgICByZXR1cm4gbm9ybWFsaXplZDtcbiAgfVxuXG4gIHJldHVybiBzb3VyY2U7XG59OyIsCiAgICAiLyoqXG4gKiBub2RlLWNvbXByZXNzLWNvbW1vbnNcbiAqXG4gKiBDb3B5cmlnaHQgKGMpIDIwMTQgQ2hyaXMgVGFsa2luZ3RvbiwgY29udHJpYnV0b3JzLlxuICogTGljZW5zZWQgdW5kZXIgdGhlIE1JVCBsaWNlbnNlLlxuICogaHR0cHM6Ly9naXRodWIuY29tL2FyY2hpdmVyanMvbm9kZS1jb21wcmVzcy1jb21tb25zL2Jsb2IvbWFzdGVyL0xJQ0VOU0UtTUlUXG4gKi9cbnZhciBpbmhlcml0cyA9IHJlcXVpcmUoJ3V0aWwnKS5pbmhlcml0cztcbnZhciBpc1N0cmVhbSA9IHJlcXVpcmUoJ2lzLXN0cmVhbScpO1xudmFyIFRyYW5zZm9ybSA9IHJlcXVpcmUoJ3JlYWRhYmxlLXN0cmVhbScpLlRyYW5zZm9ybTtcblxudmFyIEFyY2hpdmVFbnRyeSA9IHJlcXVpcmUoJy4vYXJjaGl2ZS1lbnRyeScpO1xudmFyIHV0aWwgPSByZXF1aXJlKCcuLi91dGlsJyk7XG5cbnZhciBBcmNoaXZlT3V0cHV0U3RyZWFtID0gbW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbihvcHRpb25zKSB7XG4gIGlmICghKHRoaXMgaW5zdGFuY2VvZiBBcmNoaXZlT3V0cHV0U3RyZWFtKSkge1xuICAgIHJldHVybiBuZXcgQXJjaGl2ZU91dHB1dFN0cmVhbShvcHRpb25zKTtcbiAgfVxuXG4gIFRyYW5zZm9ybS5jYWxsKHRoaXMsIG9wdGlvbnMpO1xuXG4gIHRoaXMub2Zmc2V0ID0gMDtcbiAgdGhpcy5fYXJjaGl2ZSA9IHtcbiAgICBmaW5pc2g6IGZhbHNlLFxuICAgIGZpbmlzaGVkOiBmYWxzZSxcbiAgICBwcm9jZXNzaW5nOiBmYWxzZVxuICB9O1xufTtcblxuaW5oZXJpdHMoQXJjaGl2ZU91dHB1dFN0cmVhbSwgVHJhbnNmb3JtKTtcblxuQXJjaGl2ZU91dHB1dFN0cmVhbS5wcm90b3R5cGUuX2FwcGVuZEJ1ZmZlciA9IGZ1bmN0aW9uKHphZSwgc291cmNlLCBjYWxsYmFjaykge1xuICAvLyBzY2FmZm9sZCBvbmx5XG59O1xuXG5BcmNoaXZlT3V0cHV0U3RyZWFtLnByb3RvdHlwZS5fYXBwZW5kU3RyZWFtID0gZnVuY3Rpb24oemFlLCBzb3VyY2UsIGNhbGxiYWNrKSB7XG4gIC8vIHNjYWZmb2xkIG9ubHlcbn07XG5cbkFyY2hpdmVPdXRwdXRTdHJlYW0ucHJvdG90eXBlLl9lbWl0RXJyb3JDYWxsYmFjayA9IGZ1bmN0aW9uKGVycikge1xuICBpZiAoZXJyKSB7XG4gICAgdGhpcy5lbWl0KCdlcnJvcicsIGVycik7XG4gIH1cbn07XG5cbkFyY2hpdmVPdXRwdXRTdHJlYW0ucHJvdG90eXBlLl9maW5pc2ggPSBmdW5jdGlvbihhZSkge1xuICAvLyBzY2FmZm9sZCBvbmx5XG59O1xuXG5BcmNoaXZlT3V0cHV0U3RyZWFtLnByb3RvdHlwZS5fbm9ybWFsaXplRW50cnkgPSBmdW5jdGlvbihhZSkge1xuICAvLyBzY2FmZm9sZCBvbmx5XG59O1xuXG5BcmNoaXZlT3V0cHV0U3RyZWFtLnByb3RvdHlwZS5fdHJhbnNmb3JtID0gZnVuY3Rpb24oY2h1bmssIGVuY29kaW5nLCBjYWxsYmFjaykge1xuICBjYWxsYmFjayhudWxsLCBjaHVuayk7XG59O1xuXG5BcmNoaXZlT3V0cHV0U3RyZWFtLnByb3RvdHlwZS5lbnRyeSA9IGZ1bmN0aW9uKGFlLCBzb3VyY2UsIGNhbGxiYWNrKSB7XG4gIHNvdXJjZSA9IHNvdXJjZSB8fCBudWxsO1xuXG4gIGlmICh0eXBlb2YgY2FsbGJhY2sgIT09ICdmdW5jdGlvbicpIHtcbiAgICBjYWxsYmFjayA9IHRoaXMuX2VtaXRFcnJvckNhbGxiYWNrLmJpbmQodGhpcyk7XG4gIH1cblxuICBpZiAoIShhZSBpbnN0YW5jZW9mIEFyY2hpdmVFbnRyeSkpIHtcbiAgICBjYWxsYmFjayhuZXcgRXJyb3IoJ25vdCBhIHZhbGlkIGluc3RhbmNlIG9mIEFyY2hpdmVFbnRyeScpKTtcbiAgICByZXR1cm47XG4gIH1cblxuICBpZiAodGhpcy5fYXJjaGl2ZS5maW5pc2ggfHwgdGhpcy5fYXJjaGl2ZS5maW5pc2hlZCkge1xuICAgIGNhbGxiYWNrKG5ldyBFcnJvcigndW5hY2NlcHRhYmxlIGVudHJ5IGFmdGVyIGZpbmlzaCcpKTtcbiAgICByZXR1cm47XG4gIH1cblxuICBpZiAodGhpcy5fYXJjaGl2ZS5wcm9jZXNzaW5nKSB7XG4gICAgY2FsbGJhY2sobmV3IEVycm9yKCdhbHJlYWR5IHByb2Nlc3NpbmcgYW4gZW50cnknKSk7XG4gICAgcmV0dXJuO1xuICB9XG5cbiAgdGhpcy5fYXJjaGl2ZS5wcm9jZXNzaW5nID0gdHJ1ZTtcbiAgdGhpcy5fbm9ybWFsaXplRW50cnkoYWUpO1xuICB0aGlzLl9lbnRyeSA9IGFlO1xuXG4gIHNvdXJjZSA9IHV0aWwubm9ybWFsaXplSW5wdXRTb3VyY2Uoc291cmNlKTtcblxuICBpZiAoQnVmZmVyLmlzQnVmZmVyKHNvdXJjZSkpIHtcbiAgICB0aGlzLl9hcHBlbmRCdWZmZXIoYWUsIHNvdXJjZSwgY2FsbGJhY2spO1xuICB9IGVsc2UgaWYgKGlzU3RyZWFtKHNvdXJjZSkpIHtcbiAgICB0aGlzLl9hcHBlbmRTdHJlYW0oYWUsIHNvdXJjZSwgY2FsbGJhY2spO1xuICB9IGVsc2Uge1xuICAgIHRoaXMuX2FyY2hpdmUucHJvY2Vzc2luZyA9IGZhbHNlO1xuICAgIGNhbGxiYWNrKG5ldyBFcnJvcignaW5wdXQgc291cmNlIG11c3QgYmUgdmFsaWQgU3RyZWFtIG9yIEJ1ZmZlciBpbnN0YW5jZScpKTtcbiAgICByZXR1cm47XG4gIH1cblxuICByZXR1cm4gdGhpcztcbn07XG5cbkFyY2hpdmVPdXRwdXRTdHJlYW0ucHJvdG90eXBlLmZpbmlzaCA9IGZ1bmN0aW9uKCkge1xuICBpZiAodGhpcy5fYXJjaGl2ZS5wcm9jZXNzaW5nKSB7XG4gICAgdGhpcy5fYXJjaGl2ZS5maW5pc2ggPSB0cnVlO1xuICAgIHJldHVybjtcbiAgfVxuXG4gIHRoaXMuX2ZpbmlzaCgpO1xufTtcblxuQXJjaGl2ZU91dHB1dFN0cmVhbS5wcm90b3R5cGUuZ2V0Qnl0ZXNXcml0dGVuID0gZnVuY3Rpb24oKSB7XG4gIHJldHVybiB0aGlzLm9mZnNldDtcbn07XG5cbkFyY2hpdmVPdXRwdXRTdHJlYW0ucHJvdG90eXBlLndyaXRlID0gZnVuY3Rpb24oY2h1bmssIGNiKSB7XG4gIGlmIChjaHVuaykge1xuICAgIHRoaXMub2Zmc2V0ICs9IGNodW5rLmxlbmd0aDtcbiAgfVxuXG4gIHJldHVybiBUcmFuc2Zvcm0ucHJvdG90eXBlLndyaXRlLmNhbGwodGhpcywgY2h1bmssIGNiKTtcbn07IiwKICAgICIvKiEgY3JjMzIuanMgKEMpIDIwMTQtcHJlc2VudCBTaGVldEpTIC0tIGh0dHA6Ly9zaGVldGpzLmNvbSAqL1xuLyogdmltOiBzZXQgdHM9MjogKi9cbi8qZXhwb3J0ZWQgQ1JDMzIgKi9cbnZhciBDUkMzMjtcbihmdW5jdGlvbiAoZmFjdG9yeSkge1xuXHQvKmpzaGludCBpZ25vcmU6c3RhcnQgKi9cblx0Lyplc2xpbnQtZGlzYWJsZSAqL1xuXHRpZih0eXBlb2YgRE9fTk9UX0VYUE9SVF9DUkMgPT09ICd1bmRlZmluZWQnKSB7XG5cdFx0aWYoJ29iamVjdCcgPT09IHR5cGVvZiBleHBvcnRzKSB7XG5cdFx0XHRmYWN0b3J5KGV4cG9ydHMpO1xuXHRcdH0gZWxzZSBpZiAoJ2Z1bmN0aW9uJyA9PT0gdHlwZW9mIGRlZmluZSAmJiBkZWZpbmUuYW1kKSB7XG5cdFx0XHRkZWZpbmUoZnVuY3Rpb24gKCkge1xuXHRcdFx0XHR2YXIgbW9kdWxlID0ge307XG5cdFx0XHRcdGZhY3RvcnkobW9kdWxlKTtcblx0XHRcdFx0cmV0dXJuIG1vZHVsZTtcblx0XHRcdH0pO1xuXHRcdH0gZWxzZSB7XG5cdFx0XHRmYWN0b3J5KENSQzMyID0ge30pO1xuXHRcdH1cblx0fSBlbHNlIHtcblx0XHRmYWN0b3J5KENSQzMyID0ge30pO1xuXHR9XG5cdC8qZXNsaW50LWVuYWJsZSAqL1xuXHQvKmpzaGludCBpZ25vcmU6ZW5kICovXG59KGZ1bmN0aW9uKENSQzMyKSB7XG5DUkMzMi52ZXJzaW9uID0gJzEuMi4yJztcbi8qZ2xvYmFsIEludDMyQXJyYXkgKi9cbmZ1bmN0aW9uIHNpZ25lZF9jcmNfdGFibGUoKSB7XG5cdHZhciBjID0gMCwgdGFibGUgPSBuZXcgQXJyYXkoMjU2KTtcblxuXHRmb3IodmFyIG4gPTA7IG4gIT0gMjU2OyArK24pe1xuXHRcdGMgPSBuO1xuXHRcdGMgPSAoKGMmMSkgPyAoLTMwNjY3NDkxMiBeIChjID4+PiAxKSkgOiAoYyA+Pj4gMSkpO1xuXHRcdGMgPSAoKGMmMSkgPyAoLTMwNjY3NDkxMiBeIChjID4+PiAxKSkgOiAoYyA+Pj4gMSkpO1xuXHRcdGMgPSAoKGMmMSkgPyAoLTMwNjY3NDkxMiBeIChjID4+PiAxKSkgOiAoYyA+Pj4gMSkpO1xuXHRcdGMgPSAoKGMmMSkgPyAoLTMwNjY3NDkxMiBeIChjID4+PiAxKSkgOiAoYyA+Pj4gMSkpO1xuXHRcdGMgPSAoKGMmMSkgPyAoLTMwNjY3NDkxMiBeIChjID4+PiAxKSkgOiAoYyA+Pj4gMSkpO1xuXHRcdGMgPSAoKGMmMSkgPyAoLTMwNjY3NDkxMiBeIChjID4+PiAxKSkgOiAoYyA+Pj4gMSkpO1xuXHRcdGMgPSAoKGMmMSkgPyAoLTMwNjY3NDkxMiBeIChjID4+PiAxKSkgOiAoYyA+Pj4gMSkpO1xuXHRcdGMgPSAoKGMmMSkgPyAoLTMwNjY3NDkxMiBeIChjID4+PiAxKSkgOiAoYyA+Pj4gMSkpO1xuXHRcdHRhYmxlW25dID0gYztcblx0fVxuXG5cdHJldHVybiB0eXBlb2YgSW50MzJBcnJheSAhPT0gJ3VuZGVmaW5lZCcgPyBuZXcgSW50MzJBcnJheSh0YWJsZSkgOiB0YWJsZTtcbn1cblxudmFyIFQwID0gc2lnbmVkX2NyY190YWJsZSgpO1xuZnVuY3Rpb24gc2xpY2VfYnlfMTZfdGFibGVzKFQpIHtcblx0dmFyIGMgPSAwLCB2ID0gMCwgbiA9IDAsIHRhYmxlID0gdHlwZW9mIEludDMyQXJyYXkgIT09ICd1bmRlZmluZWQnID8gbmV3IEludDMyQXJyYXkoNDA5NikgOiBuZXcgQXJyYXkoNDA5NikgO1xuXG5cdGZvcihuID0gMDsgbiAhPSAyNTY7ICsrbikgdGFibGVbbl0gPSBUW25dO1xuXHRmb3IobiA9IDA7IG4gIT0gMjU2OyArK24pIHtcblx0XHR2ID0gVFtuXTtcblx0XHRmb3IoYyA9IDI1NiArIG47IGMgPCA0MDk2OyBjICs9IDI1NikgdiA9IHRhYmxlW2NdID0gKHYgPj4+IDgpIF4gVFt2ICYgMHhGRl07XG5cdH1cblx0dmFyIG91dCA9IFtdO1xuXHRmb3IobiA9IDE7IG4gIT0gMTY7ICsrbikgb3V0W24gLSAxXSA9IHR5cGVvZiBJbnQzMkFycmF5ICE9PSAndW5kZWZpbmVkJyA/IHRhYmxlLnN1YmFycmF5KG4gKiAyNTYsIG4gKiAyNTYgKyAyNTYpIDogdGFibGUuc2xpY2UobiAqIDI1NiwgbiAqIDI1NiArIDI1Nik7XG5cdHJldHVybiBvdXQ7XG59XG52YXIgVFQgPSBzbGljZV9ieV8xNl90YWJsZXMoVDApO1xudmFyIFQxID0gVFRbMF0sICBUMiA9IFRUWzFdLCAgVDMgPSBUVFsyXSwgIFQ0ID0gVFRbM10sICBUNSA9IFRUWzRdO1xudmFyIFQ2ID0gVFRbNV0sICBUNyA9IFRUWzZdLCAgVDggPSBUVFs3XSwgIFQ5ID0gVFRbOF0sICBUYSA9IFRUWzldO1xudmFyIFRiID0gVFRbMTBdLCBUYyA9IFRUWzExXSwgVGQgPSBUVFsxMl0sIFRlID0gVFRbMTNdLCBUZiA9IFRUWzE0XTtcbmZ1bmN0aW9uIGNyYzMyX2JzdHIoYnN0ciwgc2VlZCkge1xuXHR2YXIgQyA9IHNlZWQgXiAtMTtcblx0Zm9yKHZhciBpID0gMCwgTCA9IGJzdHIubGVuZ3RoOyBpIDwgTDspIEMgPSAoQz4+PjgpIF4gVDBbKENeYnN0ci5jaGFyQ29kZUF0KGkrKykpJjB4RkZdO1xuXHRyZXR1cm4gfkM7XG59XG5cbmZ1bmN0aW9uIGNyYzMyX2J1ZihCLCBzZWVkKSB7XG5cdHZhciBDID0gc2VlZCBeIC0xLCBMID0gQi5sZW5ndGggLSAxNSwgaSA9IDA7XG5cdGZvcig7IGkgPCBMOykgQyA9XG5cdFx0VGZbQltpKytdIF4gKEMgJiAyNTUpXSBeXG5cdFx0VGVbQltpKytdIF4gKChDID4+IDgpICYgMjU1KV0gXlxuXHRcdFRkW0JbaSsrXSBeICgoQyA+PiAxNikgJiAyNTUpXSBeXG5cdFx0VGNbQltpKytdIF4gKEMgPj4+IDI0KV0gXlxuXHRcdFRiW0JbaSsrXV0gXiBUYVtCW2krK11dIF4gVDlbQltpKytdXSBeIFQ4W0JbaSsrXV0gXlxuXHRcdFQ3W0JbaSsrXV0gXiBUNltCW2krK11dIF4gVDVbQltpKytdXSBeIFQ0W0JbaSsrXV0gXlxuXHRcdFQzW0JbaSsrXV0gXiBUMltCW2krK11dIF4gVDFbQltpKytdXSBeIFQwW0JbaSsrXV07XG5cdEwgKz0gMTU7XG5cdHdoaWxlKGkgPCBMKSBDID0gKEM+Pj44KSBeIFQwWyhDXkJbaSsrXSkmMHhGRl07XG5cdHJldHVybiB+Qztcbn1cblxuZnVuY3Rpb24gY3JjMzJfc3RyKHN0ciwgc2VlZCkge1xuXHR2YXIgQyA9IHNlZWQgXiAtMTtcblx0Zm9yKHZhciBpID0gMCwgTCA9IHN0ci5sZW5ndGgsIGMgPSAwLCBkID0gMDsgaSA8IEw7KSB7XG5cdFx0YyA9IHN0ci5jaGFyQ29kZUF0KGkrKyk7XG5cdFx0aWYoYyA8IDB4ODApIHtcblx0XHRcdEMgPSAoQz4+PjgpIF4gVDBbKENeYykmMHhGRl07XG5cdFx0fSBlbHNlIGlmKGMgPCAweDgwMCkge1xuXHRcdFx0QyA9IChDPj4+OCkgXiBUMFsoQyBeICgxOTJ8KChjPj42KSYzMSkpKSYweEZGXTtcblx0XHRcdEMgPSAoQz4+PjgpIF4gVDBbKEMgXiAoMTI4fChjJjYzKSkpJjB4RkZdO1xuXHRcdH0gZWxzZSBpZihjID49IDB4RDgwMCAmJiBjIDwgMHhFMDAwKSB7XG5cdFx0XHRjID0gKGMmMTAyMykrNjQ7IGQgPSBzdHIuY2hhckNvZGVBdChpKyspJjEwMjM7XG5cdFx0XHRDID0gKEM+Pj44KSBeIFQwWyhDIF4gKDI0MHwoKGM+PjgpJjcpKSkmMHhGRl07XG5cdFx0XHRDID0gKEM+Pj44KSBeIFQwWyhDIF4gKDEyOHwoKGM+PjIpJjYzKSkpJjB4RkZdO1xuXHRcdFx0QyA9IChDPj4+OCkgXiBUMFsoQyBeICgxMjh8KChkPj42KSYxNSl8KChjJjMpPDw0KSkpJjB4RkZdO1xuXHRcdFx0QyA9IChDPj4+OCkgXiBUMFsoQyBeICgxMjh8KGQmNjMpKSkmMHhGRl07XG5cdFx0fSBlbHNlIHtcblx0XHRcdEMgPSAoQz4+PjgpIF4gVDBbKEMgXiAoMjI0fCgoYz4+MTIpJjE1KSkpJjB4RkZdO1xuXHRcdFx0QyA9IChDPj4+OCkgXiBUMFsoQyBeICgxMjh8KChjPj42KSY2MykpKSYweEZGXTtcblx0XHRcdEMgPSAoQz4+PjgpIF4gVDBbKEMgXiAoMTI4fChjJjYzKSkpJjB4RkZdO1xuXHRcdH1cblx0fVxuXHRyZXR1cm4gfkM7XG59XG5DUkMzMi50YWJsZSA9IFQwO1xuLy8gJEZsb3dJZ25vcmVcbkNSQzMyLmJzdHIgPSBjcmMzMl9ic3RyO1xuLy8gJEZsb3dJZ25vcmVcbkNSQzMyLmJ1ZiA9IGNyYzMyX2J1Zjtcbi8vICRGbG93SWdub3JlXG5DUkMzMi5zdHIgPSBjcmMzMl9zdHI7XG59KSk7XG4iLAogICAgIi8qKlxuICogbm9kZS1jcmMzMi1zdHJlYW1cbiAqXG4gKiBDb3B5cmlnaHQgKGMpIDIwMTQgQ2hyaXMgVGFsa2luZ3RvbiwgY29udHJpYnV0b3JzLlxuICogTGljZW5zZWQgdW5kZXIgdGhlIE1JVCBsaWNlbnNlLlxuICogaHR0cHM6Ly9naXRodWIuY29tL2FyY2hpdmVyanMvbm9kZS1jcmMzMi1zdHJlYW0vYmxvYi9tYXN0ZXIvTElDRU5TRS1NSVRcbiAqL1xuXG4gJ3VzZSBzdHJpY3QnO1xuXG5jb25zdCB7VHJhbnNmb3JtfSA9IHJlcXVpcmUoJ3JlYWRhYmxlLXN0cmVhbScpO1xuXG5jb25zdCBjcmMzMiA9IHJlcXVpcmUoJ2NyYy0zMicpO1xuXG5jbGFzcyBDUkMzMlN0cmVhbSBleHRlbmRzIFRyYW5zZm9ybSB7XG4gIGNvbnN0cnVjdG9yKG9wdGlvbnMpIHtcbiAgICBzdXBlcihvcHRpb25zKTtcbiAgICB0aGlzLmNoZWNrc3VtID0gQnVmZmVyLmFsbG9jVW5zYWZlKDQpO1xuICAgIHRoaXMuY2hlY2tzdW0ud3JpdGVJbnQzMkJFKDAsIDApO1xuXG4gICAgdGhpcy5yYXdTaXplID0gMDtcbiAgfVxuXG4gIF90cmFuc2Zvcm0oY2h1bmssIGVuY29kaW5nLCBjYWxsYmFjaykge1xuICAgIGlmIChjaHVuaykge1xuICAgICAgdGhpcy5jaGVja3N1bSA9IGNyYzMyLmJ1ZihjaHVuaywgdGhpcy5jaGVja3N1bSkgPj4+IDA7XG4gICAgICB0aGlzLnJhd1NpemUgKz0gY2h1bmsubGVuZ3RoO1xuICAgIH1cblxuICAgIGNhbGxiYWNrKG51bGwsIGNodW5rKTtcbiAgfVxuXG4gIGRpZ2VzdChlbmNvZGluZykge1xuICAgIGNvbnN0IGNoZWNrc3VtID0gQnVmZmVyLmFsbG9jVW5zYWZlKDQpO1xuICAgIGNoZWNrc3VtLndyaXRlVUludDMyQkUodGhpcy5jaGVja3N1bSA+Pj4gMCwgMCk7XG4gICAgcmV0dXJuIGVuY29kaW5nID8gY2hlY2tzdW0udG9TdHJpbmcoZW5jb2RpbmcpIDogY2hlY2tzdW07XG4gIH1cblxuICBoZXgoKSB7XG4gICAgcmV0dXJuIHRoaXMuZGlnZXN0KCdoZXgnKS50b1VwcGVyQ2FzZSgpO1xuICB9XG5cbiAgc2l6ZSgpIHtcbiAgICByZXR1cm4gdGhpcy5yYXdTaXplO1xuICB9XG59XG5cbm1vZHVsZS5leHBvcnRzID0gQ1JDMzJTdHJlYW07XG4iLAogICAgIi8qKlxuICogbm9kZS1jcmMzMi1zdHJlYW1cbiAqXG4gKiBDb3B5cmlnaHQgKGMpIDIwMTQgQ2hyaXMgVGFsa2luZ3RvbiwgY29udHJpYnV0b3JzLlxuICogTGljZW5zZWQgdW5kZXIgdGhlIE1JVCBsaWNlbnNlLlxuICogaHR0cHM6Ly9naXRodWIuY29tL2FyY2hpdmVyanMvbm9kZS1jcmMzMi1zdHJlYW0vYmxvYi9tYXN0ZXIvTElDRU5TRS1NSVRcbiAqL1xuXG4ndXNlIHN0cmljdCc7XG5cbmNvbnN0IHtEZWZsYXRlUmF3fSA9IHJlcXVpcmUoJ3psaWInKTtcblxuY29uc3QgY3JjMzIgPSByZXF1aXJlKCdjcmMtMzInKTtcblxuY2xhc3MgRGVmbGF0ZUNSQzMyU3RyZWFtIGV4dGVuZHMgRGVmbGF0ZVJhdyB7XG4gIGNvbnN0cnVjdG9yKG9wdGlvbnMpIHtcbiAgICBzdXBlcihvcHRpb25zKTtcblxuICAgIHRoaXMuY2hlY2tzdW0gPSBCdWZmZXIuYWxsb2NVbnNhZmUoNCk7XG4gICAgdGhpcy5jaGVja3N1bS53cml0ZUludDMyQkUoMCwgMCk7XG5cbiAgICB0aGlzLnJhd1NpemUgPSAwO1xuICAgIHRoaXMuY29tcHJlc3NlZFNpemUgPSAwO1xuICB9XG5cbiAgcHVzaChjaHVuaywgZW5jb2RpbmcpIHtcbiAgICBpZiAoY2h1bmspIHtcbiAgICAgIHRoaXMuY29tcHJlc3NlZFNpemUgKz0gY2h1bmsubGVuZ3RoO1xuICAgIH1cblxuICAgIHJldHVybiBzdXBlci5wdXNoKGNodW5rLCBlbmNvZGluZyk7XG4gIH1cblxuICBfdHJhbnNmb3JtKGNodW5rLCBlbmNvZGluZywgY2FsbGJhY2spIHtcbiAgICBpZiAoY2h1bmspIHtcbiAgICAgIHRoaXMuY2hlY2tzdW0gPSBjcmMzMi5idWYoY2h1bmssIHRoaXMuY2hlY2tzdW0pID4+PiAwO1xuICAgICAgdGhpcy5yYXdTaXplICs9IGNodW5rLmxlbmd0aDtcbiAgICB9XG5cbiAgICBzdXBlci5fdHJhbnNmb3JtKGNodW5rLCBlbmNvZGluZywgY2FsbGJhY2spXG4gIH1cblxuICBkaWdlc3QoZW5jb2RpbmcpIHtcbiAgICBjb25zdCBjaGVja3N1bSA9IEJ1ZmZlci5hbGxvY1Vuc2FmZSg0KTtcbiAgICBjaGVja3N1bS53cml0ZVVJbnQzMkJFKHRoaXMuY2hlY2tzdW0gPj4+IDAsIDApO1xuICAgIHJldHVybiBlbmNvZGluZyA/IGNoZWNrc3VtLnRvU3RyaW5nKGVuY29kaW5nKSA6IGNoZWNrc3VtO1xuICB9XG5cbiAgaGV4KCkge1xuICAgIHJldHVybiB0aGlzLmRpZ2VzdCgnaGV4JykudG9VcHBlckNhc2UoKTtcbiAgfVxuXG4gIHNpemUoY29tcHJlc3NlZCA9IGZhbHNlKSB7XG4gICAgaWYgKGNvbXByZXNzZWQpIHtcbiAgICAgIHJldHVybiB0aGlzLmNvbXByZXNzZWRTaXplO1xuICAgIH0gZWxzZSB7XG4gICAgICByZXR1cm4gdGhpcy5yYXdTaXplO1xuICAgIH1cbiAgfVxufVxuXG5tb2R1bGUuZXhwb3J0cyA9IERlZmxhdGVDUkMzMlN0cmVhbTtcbiIsCiAgICAiLyoqXG4gKiBub2RlLWNyYzMyLXN0cmVhbVxuICpcbiAqIENvcHlyaWdodCAoYykgMjAxNCBDaHJpcyBUYWxraW5ndG9uLCBjb250cmlidXRvcnMuXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgTUlUIGxpY2Vuc2UuXG4gKiBodHRwczovL2dpdGh1Yi5jb20vYXJjaGl2ZXJqcy9ub2RlLWNyYzMyLXN0cmVhbS9ibG9iL21hc3Rlci9MSUNFTlNFLU1JVFxuICovXG5cbid1c2Ugc3RyaWN0JztcblxubW9kdWxlLmV4cG9ydHMgPSB7XG4gIENSQzMyU3RyZWFtOiByZXF1aXJlKCcuL2NyYzMyLXN0cmVhbScpLFxuICBEZWZsYXRlQ1JDMzJTdHJlYW06IHJlcXVpcmUoJy4vZGVmbGF0ZS1jcmMzMi1zdHJlYW0nKVxufVxuIiwKICAgICIvKipcbiAqIG5vZGUtY29tcHJlc3MtY29tbW9uc1xuICpcbiAqIENvcHlyaWdodCAoYykgMjAxNCBDaHJpcyBUYWxraW5ndG9uLCBjb250cmlidXRvcnMuXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgTUlUIGxpY2Vuc2UuXG4gKiBodHRwczovL2dpdGh1Yi5jb20vYXJjaGl2ZXJqcy9ub2RlLWNvbXByZXNzLWNvbW1vbnMvYmxvYi9tYXN0ZXIvTElDRU5TRS1NSVRcbiAqL1xudmFyIGluaGVyaXRzID0gcmVxdWlyZSgndXRpbCcpLmluaGVyaXRzO1xudmFyIGNyYzMyID0gcmVxdWlyZSgnY3JjLTMyJyk7XG52YXIge0NSQzMyU3RyZWFtfSA9IHJlcXVpcmUoJ2NyYzMyLXN0cmVhbScpO1xudmFyIHtEZWZsYXRlQ1JDMzJTdHJlYW19ID0gcmVxdWlyZSgnY3JjMzItc3RyZWFtJyk7XG5cbnZhciBBcmNoaXZlT3V0cHV0U3RyZWFtID0gcmVxdWlyZSgnLi4vYXJjaGl2ZS1vdXRwdXQtc3RyZWFtJyk7XG52YXIgWmlwQXJjaGl2ZUVudHJ5ID0gcmVxdWlyZSgnLi96aXAtYXJjaGl2ZS1lbnRyeScpO1xudmFyIEdlbmVyYWxQdXJwb3NlQml0ID0gcmVxdWlyZSgnLi9nZW5lcmFsLXB1cnBvc2UtYml0Jyk7XG5cbnZhciBjb25zdGFudHMgPSByZXF1aXJlKCcuL2NvbnN0YW50cycpO1xudmFyIHV0aWwgPSByZXF1aXJlKCcuLi8uLi91dGlsJyk7XG52YXIgemlwVXRpbCA9IHJlcXVpcmUoJy4vdXRpbCcpO1xuXG52YXIgWmlwQXJjaGl2ZU91dHB1dFN0cmVhbSA9IG1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24ob3B0aW9ucykge1xuICBpZiAoISh0aGlzIGluc3RhbmNlb2YgWmlwQXJjaGl2ZU91dHB1dFN0cmVhbSkpIHtcbiAgICByZXR1cm4gbmV3IFppcEFyY2hpdmVPdXRwdXRTdHJlYW0ob3B0aW9ucyk7XG4gIH1cblxuICBvcHRpb25zID0gdGhpcy5vcHRpb25zID0gdGhpcy5fZGVmYXVsdHMob3B0aW9ucyk7XG5cbiAgQXJjaGl2ZU91dHB1dFN0cmVhbS5jYWxsKHRoaXMsIG9wdGlvbnMpO1xuXG4gIHRoaXMuX2VudHJ5ID0gbnVsbDtcbiAgdGhpcy5fZW50cmllcyA9IFtdO1xuICB0aGlzLl9hcmNoaXZlID0ge1xuICAgIGNlbnRyYWxMZW5ndGg6IDAsXG4gICAgY2VudHJhbE9mZnNldDogMCxcbiAgICBjb21tZW50OiAnJyxcbiAgICBmaW5pc2g6IGZhbHNlLFxuICAgIGZpbmlzaGVkOiBmYWxzZSxcbiAgICBwcm9jZXNzaW5nOiBmYWxzZSxcbiAgICBmb3JjZVppcDY0OiBvcHRpb25zLmZvcmNlWmlwNjQsXG4gICAgZm9yY2VMb2NhbFRpbWU6IG9wdGlvbnMuZm9yY2VMb2NhbFRpbWVcbiAgfTtcbn07XG5cbmluaGVyaXRzKFppcEFyY2hpdmVPdXRwdXRTdHJlYW0sIEFyY2hpdmVPdXRwdXRTdHJlYW0pO1xuXG5aaXBBcmNoaXZlT3V0cHV0U3RyZWFtLnByb3RvdHlwZS5fYWZ0ZXJBcHBlbmQgPSBmdW5jdGlvbihhZSkge1xuICB0aGlzLl9lbnRyaWVzLnB1c2goYWUpO1xuXG4gIGlmIChhZS5nZXRHZW5lcmFsUHVycG9zZUJpdCgpLnVzZXNEYXRhRGVzY3JpcHRvcigpKSB7XG4gICAgdGhpcy5fd3JpdGVEYXRhRGVzY3JpcHRvcihhZSk7XG4gIH1cblxuICB0aGlzLl9hcmNoaXZlLnByb2Nlc3NpbmcgPSBmYWxzZTtcbiAgdGhpcy5fZW50cnkgPSBudWxsO1xuXG4gIGlmICh0aGlzLl9hcmNoaXZlLmZpbmlzaCAmJiAhdGhpcy5fYXJjaGl2ZS5maW5pc2hlZCkge1xuICAgIHRoaXMuX2ZpbmlzaCgpO1xuICB9XG59O1xuXG5aaXBBcmNoaXZlT3V0cHV0U3RyZWFtLnByb3RvdHlwZS5fYXBwZW5kQnVmZmVyID0gZnVuY3Rpb24oYWUsIHNvdXJjZSwgY2FsbGJhY2spIHtcbiAgaWYgKHNvdXJjZS5sZW5ndGggPT09IDApIHtcbiAgICBhZS5zZXRNZXRob2QoY29uc3RhbnRzLk1FVEhPRF9TVE9SRUQpO1xuICB9XG5cbiAgdmFyIG1ldGhvZCA9IGFlLmdldE1ldGhvZCgpO1xuXG4gIGlmIChtZXRob2QgPT09IGNvbnN0YW50cy5NRVRIT0RfU1RPUkVEKSB7XG4gICAgYWUuc2V0U2l6ZShzb3VyY2UubGVuZ3RoKTtcbiAgICBhZS5zZXRDb21wcmVzc2VkU2l6ZShzb3VyY2UubGVuZ3RoKTtcbiAgICBhZS5zZXRDcmMoY3JjMzIuYnVmKHNvdXJjZSkgPj4+IDApO1xuICB9XG5cbiAgdGhpcy5fd3JpdGVMb2NhbEZpbGVIZWFkZXIoYWUpO1xuXG4gIGlmIChtZXRob2QgPT09IGNvbnN0YW50cy5NRVRIT0RfU1RPUkVEKSB7XG4gICAgdGhpcy53cml0ZShzb3VyY2UpO1xuICAgIHRoaXMuX2FmdGVyQXBwZW5kKGFlKTtcbiAgICBjYWxsYmFjayhudWxsLCBhZSk7XG4gICAgcmV0dXJuO1xuICB9IGVsc2UgaWYgKG1ldGhvZCA9PT0gY29uc3RhbnRzLk1FVEhPRF9ERUZMQVRFRCkge1xuICAgIHRoaXMuX3NtYXJ0U3RyZWFtKGFlLCBjYWxsYmFjaykuZW5kKHNvdXJjZSk7XG4gICAgcmV0dXJuO1xuICB9IGVsc2Uge1xuICAgIGNhbGxiYWNrKG5ldyBFcnJvcignY29tcHJlc3Npb24gbWV0aG9kICcgKyBtZXRob2QgKyAnIG5vdCBpbXBsZW1lbnRlZCcpKTtcbiAgICByZXR1cm47XG4gIH1cbn07XG5cblppcEFyY2hpdmVPdXRwdXRTdHJlYW0ucHJvdG90eXBlLl9hcHBlbmRTdHJlYW0gPSBmdW5jdGlvbihhZSwgc291cmNlLCBjYWxsYmFjaykge1xuICBhZS5nZXRHZW5lcmFsUHVycG9zZUJpdCgpLnVzZURhdGFEZXNjcmlwdG9yKHRydWUpO1xuICBhZS5zZXRWZXJzaW9uTmVlZGVkVG9FeHRyYWN0KGNvbnN0YW50cy5NSU5fVkVSU0lPTl9EQVRBX0RFU0NSSVBUT1IpO1xuXG4gIHRoaXMuX3dyaXRlTG9jYWxGaWxlSGVhZGVyKGFlKTtcblxuICB2YXIgc21hcnQgPSB0aGlzLl9zbWFydFN0cmVhbShhZSwgY2FsbGJhY2spO1xuICBzb3VyY2Uub25jZSgnZXJyb3InLCBmdW5jdGlvbihlcnIpIHtcbiAgICBzbWFydC5lbWl0KCdlcnJvcicsIGVycik7XG4gICAgc21hcnQuZW5kKCk7XG4gIH0pXG4gIHNvdXJjZS5waXBlKHNtYXJ0KTtcbn07XG5cblppcEFyY2hpdmVPdXRwdXRTdHJlYW0ucHJvdG90eXBlLl9kZWZhdWx0cyA9IGZ1bmN0aW9uKG8pIHtcbiAgaWYgKHR5cGVvZiBvICE9PSAnb2JqZWN0Jykge1xuICAgIG8gPSB7fTtcbiAgfVxuXG4gIGlmICh0eXBlb2Ygby56bGliICE9PSAnb2JqZWN0Jykge1xuICAgIG8uemxpYiA9IHt9O1xuICB9XG5cbiAgaWYgKHR5cGVvZiBvLnpsaWIubGV2ZWwgIT09ICdudW1iZXInKSB7XG4gICAgby56bGliLmxldmVsID0gY29uc3RhbnRzLlpMSUJfQkVTVF9TUEVFRDtcbiAgfVxuXG4gIG8uZm9yY2VaaXA2NCA9ICEhby5mb3JjZVppcDY0O1xuICBvLmZvcmNlTG9jYWxUaW1lID0gISFvLmZvcmNlTG9jYWxUaW1lO1xuXG4gIHJldHVybiBvO1xufTtcblxuWmlwQXJjaGl2ZU91dHB1dFN0cmVhbS5wcm90b3R5cGUuX2ZpbmlzaCA9IGZ1bmN0aW9uKCkge1xuICB0aGlzLl9hcmNoaXZlLmNlbnRyYWxPZmZzZXQgPSB0aGlzLm9mZnNldDtcblxuICB0aGlzLl9lbnRyaWVzLmZvckVhY2goZnVuY3Rpb24oYWUpIHtcbiAgICB0aGlzLl93cml0ZUNlbnRyYWxGaWxlSGVhZGVyKGFlKTtcbiAgfS5iaW5kKHRoaXMpKTtcblxuICB0aGlzLl9hcmNoaXZlLmNlbnRyYWxMZW5ndGggPSB0aGlzLm9mZnNldCAtIHRoaXMuX2FyY2hpdmUuY2VudHJhbE9mZnNldDtcblxuICBpZiAodGhpcy5pc1ppcDY0KCkpIHtcbiAgICB0aGlzLl93cml0ZUNlbnRyYWxEaXJlY3RvcnlaaXA2NCgpO1xuICB9XG5cbiAgdGhpcy5fd3JpdGVDZW50cmFsRGlyZWN0b3J5RW5kKCk7XG5cbiAgdGhpcy5fYXJjaGl2ZS5wcm9jZXNzaW5nID0gZmFsc2U7XG4gIHRoaXMuX2FyY2hpdmUuZmluaXNoID0gdHJ1ZTtcbiAgdGhpcy5fYXJjaGl2ZS5maW5pc2hlZCA9IHRydWU7XG4gIHRoaXMuZW5kKCk7XG59O1xuXG5aaXBBcmNoaXZlT3V0cHV0U3RyZWFtLnByb3RvdHlwZS5fbm9ybWFsaXplRW50cnkgPSBmdW5jdGlvbihhZSkge1xuICBpZiAoYWUuZ2V0TWV0aG9kKCkgPT09IC0xKSB7XG4gICAgYWUuc2V0TWV0aG9kKGNvbnN0YW50cy5NRVRIT0RfREVGTEFURUQpO1xuICB9XG5cbiAgaWYgKGFlLmdldE1ldGhvZCgpID09PSBjb25zdGFudHMuTUVUSE9EX0RFRkxBVEVEKSB7XG4gICAgYWUuZ2V0R2VuZXJhbFB1cnBvc2VCaXQoKS51c2VEYXRhRGVzY3JpcHRvcih0cnVlKTtcbiAgICBhZS5zZXRWZXJzaW9uTmVlZGVkVG9FeHRyYWN0KGNvbnN0YW50cy5NSU5fVkVSU0lPTl9EQVRBX0RFU0NSSVBUT1IpO1xuICB9XG5cbiAgaWYgKGFlLmdldFRpbWUoKSA9PT0gLTEpIHtcbiAgICBhZS5zZXRUaW1lKG5ldyBEYXRlKCksIHRoaXMuX2FyY2hpdmUuZm9yY2VMb2NhbFRpbWUpO1xuICB9XG5cbiAgYWUuX29mZnNldHMgPSB7XG4gICAgZmlsZTogMCxcbiAgICBkYXRhOiAwLFxuICAgIGNvbnRlbnRzOiAwLFxuICB9O1xufTtcblxuWmlwQXJjaGl2ZU91dHB1dFN0cmVhbS5wcm90b3R5cGUuX3NtYXJ0U3RyZWFtID0gZnVuY3Rpb24oYWUsIGNhbGxiYWNrKSB7XG4gIHZhciBkZWZsYXRlID0gYWUuZ2V0TWV0aG9kKCkgPT09IGNvbnN0YW50cy5NRVRIT0RfREVGTEFURUQ7XG4gIHZhciBwcm9jZXNzID0gZGVmbGF0ZSA/IG5ldyBEZWZsYXRlQ1JDMzJTdHJlYW0odGhpcy5vcHRpb25zLnpsaWIpIDogbmV3IENSQzMyU3RyZWFtKCk7XG4gIHZhciBlcnJvciA9IG51bGw7XG5cbiAgZnVuY3Rpb24gaGFuZGxlU3R1ZmYoKSB7XG4gICAgdmFyIGRpZ2VzdCA9IHByb2Nlc3MuZGlnZXN0KCkucmVhZFVJbnQzMkJFKDApO1xuICAgIGFlLnNldENyYyhkaWdlc3QpO1xuICAgIGFlLnNldFNpemUocHJvY2Vzcy5zaXplKCkpO1xuICAgIGFlLnNldENvbXByZXNzZWRTaXplKHByb2Nlc3Muc2l6ZSh0cnVlKSk7XG4gICAgdGhpcy5fYWZ0ZXJBcHBlbmQoYWUpO1xuICAgIGNhbGxiYWNrKGVycm9yLCBhZSk7XG4gIH1cblxuICBwcm9jZXNzLm9uY2UoJ2VuZCcsIGhhbmRsZVN0dWZmLmJpbmQodGhpcykpO1xuICBwcm9jZXNzLm9uY2UoJ2Vycm9yJywgZnVuY3Rpb24oZXJyKSB7XG4gICAgZXJyb3IgPSBlcnI7XG4gIH0pO1xuXG4gIHByb2Nlc3MucGlwZSh0aGlzLCB7IGVuZDogZmFsc2UgfSk7XG5cbiAgcmV0dXJuIHByb2Nlc3M7XG59O1xuXG5aaXBBcmNoaXZlT3V0cHV0U3RyZWFtLnByb3RvdHlwZS5fd3JpdGVDZW50cmFsRGlyZWN0b3J5RW5kID0gZnVuY3Rpb24oKSB7XG4gIHZhciByZWNvcmRzID0gdGhpcy5fZW50cmllcy5sZW5ndGg7XG4gIHZhciBzaXplID0gdGhpcy5fYXJjaGl2ZS5jZW50cmFsTGVuZ3RoO1xuICB2YXIgb2Zmc2V0ID0gdGhpcy5fYXJjaGl2ZS5jZW50cmFsT2Zmc2V0O1xuXG4gIGlmICh0aGlzLmlzWmlwNjQoKSkge1xuICAgIHJlY29yZHMgPSBjb25zdGFudHMuWklQNjRfTUFHSUNfU0hPUlQ7XG4gICAgc2l6ZSA9IGNvbnN0YW50cy5aSVA2NF9NQUdJQztcbiAgICBvZmZzZXQgPSBjb25zdGFudHMuWklQNjRfTUFHSUM7XG4gIH1cblxuICAvLyBzaWduYXR1cmVcbiAgdGhpcy53cml0ZSh6aXBVdGlsLmdldExvbmdCeXRlcyhjb25zdGFudHMuU0lHX0VPQ0QpKTtcblxuICAvLyBkaXNrIG51bWJlcnNcbiAgdGhpcy53cml0ZShjb25zdGFudHMuU0hPUlRfWkVSTyk7XG4gIHRoaXMud3JpdGUoY29uc3RhbnRzLlNIT1JUX1pFUk8pO1xuXG4gIC8vIG51bWJlciBvZiBlbnRyaWVzXG4gIHRoaXMud3JpdGUoemlwVXRpbC5nZXRTaG9ydEJ5dGVzKHJlY29yZHMpKTtcbiAgdGhpcy53cml0ZSh6aXBVdGlsLmdldFNob3J0Qnl0ZXMocmVjb3JkcykpO1xuXG4gIC8vIGxlbmd0aCBhbmQgbG9jYXRpb24gb2YgQ0RcbiAgdGhpcy53cml0ZSh6aXBVdGlsLmdldExvbmdCeXRlcyhzaXplKSk7XG4gIHRoaXMud3JpdGUoemlwVXRpbC5nZXRMb25nQnl0ZXMob2Zmc2V0KSk7XG5cbiAgLy8gYXJjaGl2ZSBjb21tZW50XG4gIHZhciBjb21tZW50ID0gdGhpcy5nZXRDb21tZW50KCk7XG4gIHZhciBjb21tZW50TGVuZ3RoID0gQnVmZmVyLmJ5dGVMZW5ndGgoY29tbWVudCk7XG4gIHRoaXMud3JpdGUoemlwVXRpbC5nZXRTaG9ydEJ5dGVzKGNvbW1lbnRMZW5ndGgpKTtcbiAgdGhpcy53cml0ZShjb21tZW50KTtcbn07XG5cblppcEFyY2hpdmVPdXRwdXRTdHJlYW0ucHJvdG90eXBlLl93cml0ZUNlbnRyYWxEaXJlY3RvcnlaaXA2NCA9IGZ1bmN0aW9uKCkge1xuICAvLyBzaWduYXR1cmVcbiAgdGhpcy53cml0ZSh6aXBVdGlsLmdldExvbmdCeXRlcyhjb25zdGFudHMuU0lHX1pJUDY0X0VPQ0QpKTtcblxuICAvLyBzaXplIG9mIHRoZSBaSVA2NCBFT0NEIHJlY29yZFxuICB0aGlzLndyaXRlKHppcFV0aWwuZ2V0RWlnaHRCeXRlcyg0NCkpO1xuXG4gIC8vIHZlcnNpb24gbWFkZSBieVxuICB0aGlzLndyaXRlKHppcFV0aWwuZ2V0U2hvcnRCeXRlcyhjb25zdGFudHMuTUlOX1ZFUlNJT05fWklQNjQpKTtcblxuICAvLyB2ZXJzaW9uIHRvIGV4dHJhY3RcbiAgdGhpcy53cml0ZSh6aXBVdGlsLmdldFNob3J0Qnl0ZXMoY29uc3RhbnRzLk1JTl9WRVJTSU9OX1pJUDY0KSk7XG5cbiAgLy8gZGlzayBudW1iZXJzXG4gIHRoaXMud3JpdGUoY29uc3RhbnRzLkxPTkdfWkVSTyk7XG4gIHRoaXMud3JpdGUoY29uc3RhbnRzLkxPTkdfWkVSTyk7XG5cbiAgLy8gbnVtYmVyIG9mIGVudHJpZXNcbiAgdGhpcy53cml0ZSh6aXBVdGlsLmdldEVpZ2h0Qnl0ZXModGhpcy5fZW50cmllcy5sZW5ndGgpKTtcbiAgdGhpcy53cml0ZSh6aXBVdGlsLmdldEVpZ2h0Qnl0ZXModGhpcy5fZW50cmllcy5sZW5ndGgpKTtcblxuICAvLyBsZW5ndGggYW5kIGxvY2F0aW9uIG9mIENEXG4gIHRoaXMud3JpdGUoemlwVXRpbC5nZXRFaWdodEJ5dGVzKHRoaXMuX2FyY2hpdmUuY2VudHJhbExlbmd0aCkpO1xuICB0aGlzLndyaXRlKHppcFV0aWwuZ2V0RWlnaHRCeXRlcyh0aGlzLl9hcmNoaXZlLmNlbnRyYWxPZmZzZXQpKTtcblxuICAvLyBleHRlbnNpYmxlIGRhdGEgc2VjdG9yXG4gIC8vIG5vdCBpbXBsZW1lbnRlZCBhdCB0aGlzIHRpbWVcblxuICAvLyBlbmQgb2YgY2VudHJhbCBkaXJlY3RvcnkgbG9jYXRvclxuICB0aGlzLndyaXRlKHppcFV0aWwuZ2V0TG9uZ0J5dGVzKGNvbnN0YW50cy5TSUdfWklQNjRfRU9DRF9MT0MpKTtcblxuICAvLyBkaXNrIG51bWJlciBob2xkaW5nIHRoZSBaSVA2NCBFT0NEIHJlY29yZFxuICB0aGlzLndyaXRlKGNvbnN0YW50cy5MT05HX1pFUk8pO1xuXG4gIC8vIHJlbGF0aXZlIG9mZnNldCBvZiB0aGUgWklQNjQgRU9DRCByZWNvcmRcbiAgdGhpcy53cml0ZSh6aXBVdGlsLmdldEVpZ2h0Qnl0ZXModGhpcy5fYXJjaGl2ZS5jZW50cmFsT2Zmc2V0ICsgdGhpcy5fYXJjaGl2ZS5jZW50cmFsTGVuZ3RoKSk7XG5cbiAgLy8gdG90YWwgbnVtYmVyIG9mIGRpc2tzXG4gIHRoaXMud3JpdGUoemlwVXRpbC5nZXRMb25nQnl0ZXMoMSkpO1xufTtcblxuWmlwQXJjaGl2ZU91dHB1dFN0cmVhbS5wcm90b3R5cGUuX3dyaXRlQ2VudHJhbEZpbGVIZWFkZXIgPSBmdW5jdGlvbihhZSkge1xuICB2YXIgZ3BiID0gYWUuZ2V0R2VuZXJhbFB1cnBvc2VCaXQoKTtcbiAgdmFyIG1ldGhvZCA9IGFlLmdldE1ldGhvZCgpO1xuICB2YXIgZmlsZU9mZnNldCA9IGFlLl9vZmZzZXRzLmZpbGU7XG5cbiAgdmFyIHNpemUgPSBhZS5nZXRTaXplKCk7XG4gIHZhciBjb21wcmVzc2VkU2l6ZSA9IGFlLmdldENvbXByZXNzZWRTaXplKCk7XG5cbiAgaWYgKGFlLmlzWmlwNjQoKSB8fCBmaWxlT2Zmc2V0ID4gY29uc3RhbnRzLlpJUDY0X01BR0lDKSB7XG4gICAgc2l6ZSA9IGNvbnN0YW50cy5aSVA2NF9NQUdJQztcbiAgICBjb21wcmVzc2VkU2l6ZSA9IGNvbnN0YW50cy5aSVA2NF9NQUdJQztcbiAgICBmaWxlT2Zmc2V0ID0gY29uc3RhbnRzLlpJUDY0X01BR0lDO1xuXG4gICAgYWUuc2V0VmVyc2lvbk5lZWRlZFRvRXh0cmFjdChjb25zdGFudHMuTUlOX1ZFUlNJT05fWklQNjQpO1xuXG4gICAgdmFyIGV4dHJhQnVmID0gQnVmZmVyLmNvbmNhdChbXG4gICAgICB6aXBVdGlsLmdldFNob3J0Qnl0ZXMoY29uc3RhbnRzLlpJUDY0X0VYVFJBX0lEKSxcbiAgICAgIHppcFV0aWwuZ2V0U2hvcnRCeXRlcygyNCksXG4gICAgICB6aXBVdGlsLmdldEVpZ2h0Qnl0ZXMoYWUuZ2V0U2l6ZSgpKSxcbiAgICAgIHppcFV0aWwuZ2V0RWlnaHRCeXRlcyhhZS5nZXRDb21wcmVzc2VkU2l6ZSgpKSxcbiAgICAgIHppcFV0aWwuZ2V0RWlnaHRCeXRlcyhhZS5fb2Zmc2V0cy5maWxlKVxuICAgIF0sIDI4KTtcblxuICAgIGFlLnNldEV4dHJhKGV4dHJhQnVmKTtcbiAgfVxuXG4gIC8vIHNpZ25hdHVyZVxuICB0aGlzLndyaXRlKHppcFV0aWwuZ2V0TG9uZ0J5dGVzKGNvbnN0YW50cy5TSUdfQ0ZIKSk7XG5cbiAgLy8gdmVyc2lvbiBtYWRlIGJ5XG4gIHRoaXMud3JpdGUoemlwVXRpbC5nZXRTaG9ydEJ5dGVzKChhZS5nZXRQbGF0Zm9ybSgpIDw8IDgpIHwgY29uc3RhbnRzLlZFUlNJT05fTUFERUJZKSk7XG5cbiAgLy8gdmVyc2lvbiB0byBleHRyYWN0IGFuZCBnZW5lcmFsIGJpdCBmbGFnXG4gIHRoaXMud3JpdGUoemlwVXRpbC5nZXRTaG9ydEJ5dGVzKGFlLmdldFZlcnNpb25OZWVkZWRUb0V4dHJhY3QoKSkpO1xuICB0aGlzLndyaXRlKGdwYi5lbmNvZGUoKSk7XG5cbiAgLy8gY29tcHJlc3Npb24gbWV0aG9kXG4gIHRoaXMud3JpdGUoemlwVXRpbC5nZXRTaG9ydEJ5dGVzKG1ldGhvZCkpO1xuXG4gIC8vIGRhdGV0aW1lXG4gIHRoaXMud3JpdGUoemlwVXRpbC5nZXRMb25nQnl0ZXMoYWUuZ2V0VGltZURvcygpKSk7XG5cbiAgLy8gY3JjMzIgY2hlY2tzdW1cbiAgdGhpcy53cml0ZSh6aXBVdGlsLmdldExvbmdCeXRlcyhhZS5nZXRDcmMoKSkpO1xuXG4gIC8vIHNpemVzXG4gIHRoaXMud3JpdGUoemlwVXRpbC5nZXRMb25nQnl0ZXMoY29tcHJlc3NlZFNpemUpKTtcbiAgdGhpcy53cml0ZSh6aXBVdGlsLmdldExvbmdCeXRlcyhzaXplKSk7XG5cbiAgdmFyIG5hbWUgPSBhZS5nZXROYW1lKCk7XG4gIHZhciBjb21tZW50ID0gYWUuZ2V0Q29tbWVudCgpO1xuICB2YXIgZXh0cmEgPSBhZS5nZXRDZW50cmFsRGlyZWN0b3J5RXh0cmEoKTtcblxuICBpZiAoZ3BiLnVzZXNVVEY4Rm9yTmFtZXMoKSkge1xuICAgIG5hbWUgPSBCdWZmZXIuZnJvbShuYW1lKTtcbiAgICBjb21tZW50ID0gQnVmZmVyLmZyb20oY29tbWVudCk7XG4gIH1cblxuICAvLyBuYW1lIGxlbmd0aFxuICB0aGlzLndyaXRlKHppcFV0aWwuZ2V0U2hvcnRCeXRlcyhuYW1lLmxlbmd0aCkpO1xuXG4gIC8vIGV4dHJhIGxlbmd0aFxuICB0aGlzLndyaXRlKHppcFV0aWwuZ2V0U2hvcnRCeXRlcyhleHRyYS5sZW5ndGgpKTtcblxuICAvLyBjb21tZW50cyBsZW5ndGhcbiAgdGhpcy53cml0ZSh6aXBVdGlsLmdldFNob3J0Qnl0ZXMoY29tbWVudC5sZW5ndGgpKTtcblxuICAvLyBkaXNrIG51bWJlciBzdGFydFxuICB0aGlzLndyaXRlKGNvbnN0YW50cy5TSE9SVF9aRVJPKTtcblxuICAvLyBpbnRlcm5hbCBhdHRyaWJ1dGVzXG4gIHRoaXMud3JpdGUoemlwVXRpbC5nZXRTaG9ydEJ5dGVzKGFlLmdldEludGVybmFsQXR0cmlidXRlcygpKSk7XG5cbiAgLy8gZXh0ZXJuYWwgYXR0cmlidXRlc1xuICB0aGlzLndyaXRlKHppcFV0aWwuZ2V0TG9uZ0J5dGVzKGFlLmdldEV4dGVybmFsQXR0cmlidXRlcygpKSk7XG5cbiAgLy8gcmVsYXRpdmUgb2Zmc2V0IG9mIExGSFxuICB0aGlzLndyaXRlKHppcFV0aWwuZ2V0TG9uZ0J5dGVzKGZpbGVPZmZzZXQpKTtcblxuICAvLyBuYW1lXG4gIHRoaXMud3JpdGUobmFtZSk7XG5cbiAgLy8gZXh0cmFcbiAgdGhpcy53cml0ZShleHRyYSk7XG5cbiAgLy8gY29tbWVudFxuICB0aGlzLndyaXRlKGNvbW1lbnQpO1xufTtcblxuWmlwQXJjaGl2ZU91dHB1dFN0cmVhbS5wcm90b3R5cGUuX3dyaXRlRGF0YURlc2NyaXB0b3IgPSBmdW5jdGlvbihhZSkge1xuICAvLyBzaWduYXR1cmVcbiAgdGhpcy53cml0ZSh6aXBVdGlsLmdldExvbmdCeXRlcyhjb25zdGFudHMuU0lHX0REKSk7XG5cbiAgLy8gY3JjMzIgY2hlY2tzdW1cbiAgdGhpcy53cml0ZSh6aXBVdGlsLmdldExvbmdCeXRlcyhhZS5nZXRDcmMoKSkpO1xuXG4gIC8vIHNpemVzXG4gIGlmIChhZS5pc1ppcDY0KCkpIHtcbiAgICB0aGlzLndyaXRlKHppcFV0aWwuZ2V0RWlnaHRCeXRlcyhhZS5nZXRDb21wcmVzc2VkU2l6ZSgpKSk7XG4gICAgdGhpcy53cml0ZSh6aXBVdGlsLmdldEVpZ2h0Qnl0ZXMoYWUuZ2V0U2l6ZSgpKSk7XG4gIH0gZWxzZSB7XG4gICAgdGhpcy53cml0ZSh6aXBVdGlsLmdldExvbmdCeXRlcyhhZS5nZXRDb21wcmVzc2VkU2l6ZSgpKSk7XG4gICAgdGhpcy53cml0ZSh6aXBVdGlsLmdldExvbmdCeXRlcyhhZS5nZXRTaXplKCkpKTtcbiAgfVxufTtcblxuWmlwQXJjaGl2ZU91dHB1dFN0cmVhbS5wcm90b3R5cGUuX3dyaXRlTG9jYWxGaWxlSGVhZGVyID0gZnVuY3Rpb24oYWUpIHtcbiAgdmFyIGdwYiA9IGFlLmdldEdlbmVyYWxQdXJwb3NlQml0KCk7XG4gIHZhciBtZXRob2QgPSBhZS5nZXRNZXRob2QoKTtcbiAgdmFyIG5hbWUgPSBhZS5nZXROYW1lKCk7XG4gIHZhciBleHRyYSA9IGFlLmdldExvY2FsRmlsZURhdGFFeHRyYSgpO1xuXG4gIGlmIChhZS5pc1ppcDY0KCkpIHtcbiAgICBncGIudXNlRGF0YURlc2NyaXB0b3IodHJ1ZSk7XG4gICAgYWUuc2V0VmVyc2lvbk5lZWRlZFRvRXh0cmFjdChjb25zdGFudHMuTUlOX1ZFUlNJT05fWklQNjQpO1xuICB9XG5cbiAgaWYgKGdwYi51c2VzVVRGOEZvck5hbWVzKCkpIHtcbiAgICBuYW1lID0gQnVmZmVyLmZyb20obmFtZSk7XG4gIH1cblxuICBhZS5fb2Zmc2V0cy5maWxlID0gdGhpcy5vZmZzZXQ7XG5cbiAgLy8gc2lnbmF0dXJlXG4gIHRoaXMud3JpdGUoemlwVXRpbC5nZXRMb25nQnl0ZXMoY29uc3RhbnRzLlNJR19MRkgpKTtcblxuICAvLyB2ZXJzaW9uIHRvIGV4dHJhY3QgYW5kIGdlbmVyYWwgYml0IGZsYWdcbiAgdGhpcy53cml0ZSh6aXBVdGlsLmdldFNob3J0Qnl0ZXMoYWUuZ2V0VmVyc2lvbk5lZWRlZFRvRXh0cmFjdCgpKSk7XG4gIHRoaXMud3JpdGUoZ3BiLmVuY29kZSgpKTtcblxuICAvLyBjb21wcmVzc2lvbiBtZXRob2RcbiAgdGhpcy53cml0ZSh6aXBVdGlsLmdldFNob3J0Qnl0ZXMobWV0aG9kKSk7XG5cbiAgLy8gZGF0ZXRpbWVcbiAgdGhpcy53cml0ZSh6aXBVdGlsLmdldExvbmdCeXRlcyhhZS5nZXRUaW1lRG9zKCkpKTtcblxuICBhZS5fb2Zmc2V0cy5kYXRhID0gdGhpcy5vZmZzZXQ7XG5cbiAgLy8gY3JjMzIgY2hlY2tzdW0gYW5kIHNpemVzXG4gIGlmIChncGIudXNlc0RhdGFEZXNjcmlwdG9yKCkpIHtcbiAgICB0aGlzLndyaXRlKGNvbnN0YW50cy5MT05HX1pFUk8pO1xuICAgIHRoaXMud3JpdGUoY29uc3RhbnRzLkxPTkdfWkVSTyk7XG4gICAgdGhpcy53cml0ZShjb25zdGFudHMuTE9OR19aRVJPKTtcbiAgfSBlbHNlIHtcbiAgICB0aGlzLndyaXRlKHppcFV0aWwuZ2V0TG9uZ0J5dGVzKGFlLmdldENyYygpKSk7XG4gICAgdGhpcy53cml0ZSh6aXBVdGlsLmdldExvbmdCeXRlcyhhZS5nZXRDb21wcmVzc2VkU2l6ZSgpKSk7XG4gICAgdGhpcy53cml0ZSh6aXBVdGlsLmdldExvbmdCeXRlcyhhZS5nZXRTaXplKCkpKTtcbiAgfVxuXG4gIC8vIG5hbWUgbGVuZ3RoXG4gIHRoaXMud3JpdGUoemlwVXRpbC5nZXRTaG9ydEJ5dGVzKG5hbWUubGVuZ3RoKSk7XG5cbiAgLy8gZXh0cmEgbGVuZ3RoXG4gIHRoaXMud3JpdGUoemlwVXRpbC5nZXRTaG9ydEJ5dGVzKGV4dHJhLmxlbmd0aCkpO1xuXG4gIC8vIG5hbWVcbiAgdGhpcy53cml0ZShuYW1lKTtcblxuICAvLyBleHRyYVxuICB0aGlzLndyaXRlKGV4dHJhKTtcblxuICBhZS5fb2Zmc2V0cy5jb250ZW50cyA9IHRoaXMub2Zmc2V0O1xufTtcblxuWmlwQXJjaGl2ZU91dHB1dFN0cmVhbS5wcm90b3R5cGUuZ2V0Q29tbWVudCA9IGZ1bmN0aW9uKGNvbW1lbnQpIHtcbiAgcmV0dXJuIHRoaXMuX2FyY2hpdmUuY29tbWVudCAhPT0gbnVsbCA/IHRoaXMuX2FyY2hpdmUuY29tbWVudCA6ICcnO1xufTtcblxuWmlwQXJjaGl2ZU91dHB1dFN0cmVhbS5wcm90b3R5cGUuaXNaaXA2NCA9IGZ1bmN0aW9uKCkge1xuICByZXR1cm4gdGhpcy5fYXJjaGl2ZS5mb3JjZVppcDY0IHx8IHRoaXMuX2VudHJpZXMubGVuZ3RoID4gY29uc3RhbnRzLlpJUDY0X01BR0lDX1NIT1JUIHx8IHRoaXMuX2FyY2hpdmUuY2VudHJhbExlbmd0aCA+IGNvbnN0YW50cy5aSVA2NF9NQUdJQyB8fCB0aGlzLl9hcmNoaXZlLmNlbnRyYWxPZmZzZXQgPiBjb25zdGFudHMuWklQNjRfTUFHSUM7XG59O1xuXG5aaXBBcmNoaXZlT3V0cHV0U3RyZWFtLnByb3RvdHlwZS5zZXRDb21tZW50ID0gZnVuY3Rpb24oY29tbWVudCkge1xuICB0aGlzLl9hcmNoaXZlLmNvbW1lbnQgPSBjb21tZW50O1xufTtcbiIsCiAgICAiLyoqXG4gKiBub2RlLWNvbXByZXNzLWNvbW1vbnNcbiAqXG4gKiBDb3B5cmlnaHQgKGMpIDIwMTQgQ2hyaXMgVGFsa2luZ3RvbiwgY29udHJpYnV0b3JzLlxuICogTGljZW5zZWQgdW5kZXIgdGhlIE1JVCBsaWNlbnNlLlxuICogaHR0cHM6Ly9naXRodWIuY29tL2FyY2hpdmVyanMvbm9kZS1jb21wcmVzcy1jb21tb25zL2Jsb2IvbWFzdGVyL0xJQ0VOU0UtTUlUXG4gKi9cbm1vZHVsZS5leHBvcnRzID0ge1xuICBBcmNoaXZlRW50cnk6IHJlcXVpcmUoJy4vYXJjaGl2ZXJzL2FyY2hpdmUtZW50cnknKSxcbiAgWmlwQXJjaGl2ZUVudHJ5OiByZXF1aXJlKCcuL2FyY2hpdmVycy96aXAvemlwLWFyY2hpdmUtZW50cnknKSxcbiAgQXJjaGl2ZU91dHB1dFN0cmVhbTogcmVxdWlyZSgnLi9hcmNoaXZlcnMvYXJjaGl2ZS1vdXRwdXQtc3RyZWFtJyksXG4gIFppcEFyY2hpdmVPdXRwdXRTdHJlYW06IHJlcXVpcmUoJy4vYXJjaGl2ZXJzL3ppcC96aXAtYXJjaGl2ZS1vdXRwdXQtc3RyZWFtJylcbn07IiwKICAgICIvKipcbiAqIFppcFN0cmVhbVxuICpcbiAqIEBpZ25vcmVcbiAqIEBsaWNlbnNlIFtNSVRde0BsaW5rIGh0dHBzOi8vZ2l0aHViLmNvbS9hcmNoaXZlcmpzL25vZGUtemlwLXN0cmVhbS9ibG9iL21hc3Rlci9MSUNFTlNFfVxuICogQGNvcHlyaWdodCAoYykgMjAxNCBDaHJpcyBUYWxraW5ndG9uLCBjb250cmlidXRvcnMuXG4gKi9cbnZhciBpbmhlcml0cyA9IHJlcXVpcmUoJ3V0aWwnKS5pbmhlcml0cztcblxudmFyIFppcEFyY2hpdmVPdXRwdXRTdHJlYW0gPSByZXF1aXJlKCdjb21wcmVzcy1jb21tb25zJykuWmlwQXJjaGl2ZU91dHB1dFN0cmVhbTtcbnZhciBaaXBBcmNoaXZlRW50cnkgPSByZXF1aXJlKCdjb21wcmVzcy1jb21tb25zJykuWmlwQXJjaGl2ZUVudHJ5O1xuXG52YXIgdXRpbCA9IHJlcXVpcmUoJ2FyY2hpdmVyLXV0aWxzJyk7XG5cbi8qKlxuICogQGNvbnN0cnVjdG9yXG4gKiBAZXh0ZW5kcyBleHRlcm5hbDpaaXBBcmNoaXZlT3V0cHV0U3RyZWFtXG4gKiBAcGFyYW0ge09iamVjdH0gW29wdGlvbnNdXG4gKiBAcGFyYW0ge1N0cmluZ30gW29wdGlvbnMuY29tbWVudF0gU2V0cyB0aGUgemlwIGFyY2hpdmUgY29tbWVudC5cbiAqIEBwYXJhbSB7Qm9vbGVhbn0gW29wdGlvbnMuZm9yY2VMb2NhbFRpbWU9ZmFsc2VdIEZvcmNlcyB0aGUgYXJjaGl2ZSB0byBjb250YWluIGxvY2FsIGZpbGUgdGltZXMgaW5zdGVhZCBvZiBVVEMuXG4gKiBAcGFyYW0ge0Jvb2xlYW59IFtvcHRpb25zLmZvcmNlWmlwNjQ9ZmFsc2VdIEZvcmNlcyB0aGUgYXJjaGl2ZSB0byBjb250YWluIFpJUDY0IGhlYWRlcnMuXG4gKiBAcGFyYW0ge0Jvb2xlYW59IFtvcHRpb25zLnN0b3JlPWZhbHNlXSBTZXRzIHRoZSBjb21wcmVzc2lvbiBtZXRob2QgdG8gU1RPUkUuXG4gKiBAcGFyYW0ge09iamVjdH0gW29wdGlvbnMuemxpYl0gUGFzc2VkIHRvIFt6bGliXXtAbGluayBodHRwczovL25vZGVqcy5vcmcvYXBpL3psaWIuaHRtbCN6bGliX2NsYXNzX29wdGlvbnN9XG4gKiB0byBjb250cm9sIGNvbXByZXNzaW9uLlxuICovXG52YXIgWmlwU3RyZWFtID0gbW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbihvcHRpb25zKSB7XG4gIGlmICghKHRoaXMgaW5zdGFuY2VvZiBaaXBTdHJlYW0pKSB7XG4gICAgcmV0dXJuIG5ldyBaaXBTdHJlYW0ob3B0aW9ucyk7XG4gIH1cblxuICBvcHRpb25zID0gdGhpcy5vcHRpb25zID0gb3B0aW9ucyB8fCB7fTtcbiAgb3B0aW9ucy56bGliID0gb3B0aW9ucy56bGliIHx8IHt9O1xuXG4gIFppcEFyY2hpdmVPdXRwdXRTdHJlYW0uY2FsbCh0aGlzLCBvcHRpb25zKTtcblxuICBpZiAodHlwZW9mIG9wdGlvbnMubGV2ZWwgPT09ICdudW1iZXInICYmIG9wdGlvbnMubGV2ZWwgPj0gMCkge1xuICAgIG9wdGlvbnMuemxpYi5sZXZlbCA9IG9wdGlvbnMubGV2ZWw7XG4gICAgZGVsZXRlIG9wdGlvbnMubGV2ZWw7XG4gIH1cblxuICBpZiAoIW9wdGlvbnMuZm9yY2VaaXA2NCAmJiB0eXBlb2Ygb3B0aW9ucy56bGliLmxldmVsID09PSAnbnVtYmVyJyAmJiBvcHRpb25zLnpsaWIubGV2ZWwgPT09IDApIHtcbiAgICBvcHRpb25zLnN0b3JlID0gdHJ1ZTtcbiAgfVxuXG4gIG9wdGlvbnMubmFtZVByZXBlbmRTbGFzaCA9IG9wdGlvbnMubmFtZVByZXBlbmRTbGFzaCB8fCBmYWxzZTtcblxuICBpZiAob3B0aW9ucy5jb21tZW50ICYmIG9wdGlvbnMuY29tbWVudC5sZW5ndGggPiAwKSB7XG4gICAgdGhpcy5zZXRDb21tZW50KG9wdGlvbnMuY29tbWVudCk7XG4gIH1cbn07XG5cbmluaGVyaXRzKFppcFN0cmVhbSwgWmlwQXJjaGl2ZU91dHB1dFN0cmVhbSk7XG5cbi8qKlxuICogTm9ybWFsaXplcyBlbnRyeSBkYXRhIHdpdGggZmFsbGJhY2tzIGZvciBrZXkgcHJvcGVydGllcy5cbiAqXG4gKiBAcHJpdmF0ZVxuICogQHBhcmFtICB7T2JqZWN0fSBkYXRhXG4gKiBAcmV0dXJuIHtPYmplY3R9XG4gKi9cblppcFN0cmVhbS5wcm90b3R5cGUuX25vcm1hbGl6ZUZpbGVEYXRhID0gZnVuY3Rpb24oZGF0YSkge1xuICBkYXRhID0gdXRpbC5kZWZhdWx0cyhkYXRhLCB7XG4gICAgdHlwZTogJ2ZpbGUnLFxuICAgIG5hbWU6IG51bGwsXG4gICAgbmFtZVByZXBlbmRTbGFzaDogdGhpcy5vcHRpb25zLm5hbWVQcmVwZW5kU2xhc2gsXG4gICAgbGlua25hbWU6IG51bGwsXG4gICAgZGF0ZTogbnVsbCxcbiAgICBtb2RlOiBudWxsLFxuICAgIHN0b3JlOiB0aGlzLm9wdGlvbnMuc3RvcmUsXG4gICAgY29tbWVudDogJydcbiAgfSk7XG5cbiAgdmFyIGlzRGlyID0gZGF0YS50eXBlID09PSAnZGlyZWN0b3J5JztcbiAgdmFyIGlzU3ltbGluayA9IGRhdGEudHlwZSA9PT0gJ3N5bWxpbmsnO1xuXG4gIGlmIChkYXRhLm5hbWUpIHtcbiAgICBkYXRhLm5hbWUgPSB1dGlsLnNhbml0aXplUGF0aChkYXRhLm5hbWUpO1xuXG4gICAgaWYgKCFpc1N5bWxpbmsgJiYgZGF0YS5uYW1lLnNsaWNlKC0xKSA9PT0gJy8nKSB7XG4gICAgICBpc0RpciA9IHRydWU7XG4gICAgICBkYXRhLnR5cGUgPSAnZGlyZWN0b3J5JztcbiAgICB9IGVsc2UgaWYgKGlzRGlyKSB7XG4gICAgICBkYXRhLm5hbWUgKz0gJy8nO1xuICAgIH1cbiAgfVxuXG4gIGlmIChpc0RpciB8fCBpc1N5bWxpbmspIHtcbiAgICBkYXRhLnN0b3JlID0gdHJ1ZTtcbiAgfVxuXG4gIGRhdGEuZGF0ZSA9IHV0aWwuZGF0ZWlmeShkYXRhLmRhdGUpO1xuXG4gIHJldHVybiBkYXRhO1xufTtcblxuLyoqXG4gKiBBcHBlbmRzIGFuIGVudHJ5IGdpdmVuIGFuIGlucHV0IHNvdXJjZSAodGV4dCBzdHJpbmcsIGJ1ZmZlciwgb3Igc3RyZWFtKS5cbiAqXG4gKiBAcGFyYW0gIHsoQnVmZmVyfFN0cmVhbXxTdHJpbmcpfSBzb3VyY2UgVGhlIGlucHV0IHNvdXJjZS5cbiAqIEBwYXJhbSAge09iamVjdH0gZGF0YVxuICogQHBhcmFtICB7U3RyaW5nfSBkYXRhLm5hbWUgU2V0cyB0aGUgZW50cnkgbmFtZSBpbmNsdWRpbmcgaW50ZXJuYWwgcGF0aC5cbiAqIEBwYXJhbSAge1N0cmluZ30gW2RhdGEuY29tbWVudF0gU2V0cyB0aGUgZW50cnkgY29tbWVudC5cbiAqIEBwYXJhbSAgeyhTdHJpbmd8RGF0ZSl9IFtkYXRhLmRhdGU9Tk9XKCldIFNldHMgdGhlIGVudHJ5IGRhdGUuXG4gKiBAcGFyYW0gIHtOdW1iZXJ9IFtkYXRhLm1vZGU9RDowNzU1L0Y6MDY0NF0gU2V0cyB0aGUgZW50cnkgcGVybWlzc2lvbnMuXG4gKiBAcGFyYW0gIHtCb29sZWFufSBbZGF0YS5zdG9yZT1vcHRpb25zLnN0b3JlXSBTZXRzIHRoZSBjb21wcmVzc2lvbiBtZXRob2QgdG8gU1RPUkUuXG4gKiBAcGFyYW0gIHtTdHJpbmd9IFtkYXRhLnR5cGU9ZmlsZV0gU2V0cyB0aGUgZW50cnkgdHlwZS4gRGVmYXVsdHMgdG8gYGRpcmVjdG9yeWBcbiAqIGlmIG5hbWUgZW5kcyB3aXRoIHRyYWlsaW5nIHNsYXNoLlxuICogQHBhcmFtICB7RnVuY3Rpb259IGNhbGxiYWNrXG4gKiBAcmV0dXJuIHRoaXNcbiAqL1xuWmlwU3RyZWFtLnByb3RvdHlwZS5lbnRyeSA9IGZ1bmN0aW9uKHNvdXJjZSwgZGF0YSwgY2FsbGJhY2spIHtcbiAgaWYgKHR5cGVvZiBjYWxsYmFjayAhPT0gJ2Z1bmN0aW9uJykge1xuICAgIGNhbGxiYWNrID0gdGhpcy5fZW1pdEVycm9yQ2FsbGJhY2suYmluZCh0aGlzKTtcbiAgfVxuXG4gIGRhdGEgPSB0aGlzLl9ub3JtYWxpemVGaWxlRGF0YShkYXRhKTtcblxuICBpZiAoZGF0YS50eXBlICE9PSAnZmlsZScgJiYgZGF0YS50eXBlICE9PSAnZGlyZWN0b3J5JyAmJiBkYXRhLnR5cGUgIT09ICdzeW1saW5rJykge1xuICAgIGNhbGxiYWNrKG5ldyBFcnJvcihkYXRhLnR5cGUgKyAnIGVudHJpZXMgbm90IGN1cnJlbnRseSBzdXBwb3J0ZWQnKSk7XG4gICAgcmV0dXJuO1xuICB9XG5cbiAgaWYgKHR5cGVvZiBkYXRhLm5hbWUgIT09ICdzdHJpbmcnIHx8IGRhdGEubmFtZS5sZW5ndGggPT09IDApIHtcbiAgICBjYWxsYmFjayhuZXcgRXJyb3IoJ2VudHJ5IG5hbWUgbXVzdCBiZSBhIG5vbi1lbXB0eSBzdHJpbmcgdmFsdWUnKSk7XG4gICAgcmV0dXJuO1xuICB9XG5cbiAgaWYgKGRhdGEudHlwZSA9PT0gJ3N5bWxpbmsnICYmIHR5cGVvZiBkYXRhLmxpbmtuYW1lICE9PSAnc3RyaW5nJykge1xuICAgIGNhbGxiYWNrKG5ldyBFcnJvcignZW50cnkgbGlua25hbWUgbXVzdCBiZSBhIG5vbi1lbXB0eSBzdHJpbmcgdmFsdWUgd2hlbiB0eXBlIGVxdWFscyBzeW1saW5rJykpO1xuICAgIHJldHVybjtcbiAgfVxuXG4gIHZhciBlbnRyeSA9IG5ldyBaaXBBcmNoaXZlRW50cnkoZGF0YS5uYW1lKTtcbiAgZW50cnkuc2V0VGltZShkYXRhLmRhdGUsIHRoaXMub3B0aW9ucy5mb3JjZUxvY2FsVGltZSk7XG5cbiAgaWYgKGRhdGEubmFtZVByZXBlbmRTbGFzaCkge1xuICAgIGVudHJ5LnNldE5hbWUoZGF0YS5uYW1lLCB0cnVlKTtcbiAgfVxuXG4gIGlmIChkYXRhLnN0b3JlKSB7XG4gICAgZW50cnkuc2V0TWV0aG9kKDApO1xuICB9XG5cbiAgaWYgKGRhdGEuY29tbWVudC5sZW5ndGggPiAwKSB7XG4gICAgZW50cnkuc2V0Q29tbWVudChkYXRhLmNvbW1lbnQpO1xuICB9XG5cbiAgaWYgKGRhdGEudHlwZSA9PT0gJ3N5bWxpbmsnICYmIHR5cGVvZiBkYXRhLm1vZGUgIT09ICdudW1iZXInKSB7XG4gICAgZGF0YS5tb2RlID0gNDA5NjA7IC8vIDAxMjAwMDBcbiAgfVxuXG4gIGlmICh0eXBlb2YgZGF0YS5tb2RlID09PSAnbnVtYmVyJykge1xuICAgIGlmIChkYXRhLnR5cGUgPT09ICdzeW1saW5rJykge1xuICAgICAgZGF0YS5tb2RlIHw9IDQwOTYwO1xuICAgIH1cblxuICAgIGVudHJ5LnNldFVuaXhNb2RlKGRhdGEubW9kZSk7XG4gIH1cblxuICBpZiAoZGF0YS50eXBlID09PSAnc3ltbGluaycgJiYgdHlwZW9mIGRhdGEubGlua25hbWUgPT09ICdzdHJpbmcnKSB7XG4gICAgc291cmNlID0gQnVmZmVyLmZyb20oZGF0YS5saW5rbmFtZSk7XG4gIH1cblxuICByZXR1cm4gWmlwQXJjaGl2ZU91dHB1dFN0cmVhbS5wcm90b3R5cGUuZW50cnkuY2FsbCh0aGlzLCBlbnRyeSwgc291cmNlLCBjYWxsYmFjayk7XG59O1xuXG4vKipcbiAqIEZpbmFsaXplcyB0aGUgaW5zdGFuY2UgYW5kIHByZXZlbnRzIGZ1cnRoZXIgYXBwZW5kaW5nIHRvIHRoZSBhcmNoaXZlXG4gKiBzdHJ1Y3R1cmUgKHF1ZXVlIHdpbGwgY29udGludWUgdGlsIGRyYWluZWQpLlxuICpcbiAqIEByZXR1cm4gdm9pZFxuICovXG5aaXBTdHJlYW0ucHJvdG90eXBlLmZpbmFsaXplID0gZnVuY3Rpb24oKSB7XG4gIHRoaXMuZmluaXNoKCk7XG59O1xuXG4vKipcbiAqIFJldHVybnMgdGhlIGN1cnJlbnQgbnVtYmVyIG9mIGJ5dGVzIHdyaXR0ZW4gdG8gdGhpcyBzdHJlYW0uXG4gKiBAZnVuY3Rpb24gWmlwU3RyZWFtI2dldEJ5dGVzV3JpdHRlblxuICogQHJldHVybnMge051bWJlcn1cbiAqL1xuXG4vKipcbiAqIENvbXByZXNzIENvbW1vbnMgWmlwQXJjaGl2ZU91dHB1dFN0cmVhbVxuICogQGV4dGVybmFsIFppcEFyY2hpdmVPdXRwdXRTdHJlYW1cbiAqIEBzZWUge0BsaW5rIGh0dHBzOi8vZ2l0aHViLmNvbS9hcmNoaXZlcmpzL25vZGUtY29tcHJlc3MtY29tbW9uc31cbiAqL1xuIiwKICAgICIvKipcbiAqIFpJUCBGb3JtYXQgUGx1Z2luXG4gKlxuICogQG1vZHVsZSBwbHVnaW5zL3ppcFxuICogQGxpY2Vuc2UgW01JVF17QGxpbmsgaHR0cHM6Ly9naXRodWIuY29tL2FyY2hpdmVyanMvbm9kZS1hcmNoaXZlci9ibG9iL21hc3Rlci9MSUNFTlNFfVxuICogQGNvcHlyaWdodCAoYykgMjAxMi0yMDE0IENocmlzIFRhbGtpbmd0b24sIGNvbnRyaWJ1dG9ycy5cbiAqL1xudmFyIGVuZ2luZSA9IHJlcXVpcmUoJ3ppcC1zdHJlYW0nKTtcbnZhciB1dGlsID0gcmVxdWlyZSgnYXJjaGl2ZXItdXRpbHMnKTtcblxuLyoqXG4gKiBAY29uc3RydWN0b3JcbiAqIEBwYXJhbSB7WmlwT3B0aW9uc30gW29wdGlvbnNdXG4gKiBAcGFyYW0ge1N0cmluZ30gW29wdGlvbnMuY29tbWVudF0gU2V0cyB0aGUgemlwIGFyY2hpdmUgY29tbWVudC5cbiAqIEBwYXJhbSB7Qm9vbGVhbn0gW29wdGlvbnMuZm9yY2VMb2NhbFRpbWU9ZmFsc2VdIEZvcmNlcyB0aGUgYXJjaGl2ZSB0byBjb250YWluIGxvY2FsIGZpbGUgdGltZXMgaW5zdGVhZCBvZiBVVEMuXG4gKiBAcGFyYW0ge0Jvb2xlYW59IFtvcHRpb25zLmZvcmNlWmlwNjQ9ZmFsc2VdIEZvcmNlcyB0aGUgYXJjaGl2ZSB0byBjb250YWluIFpJUDY0IGhlYWRlcnMuXG4gKiBAcGFyYW0ge0Jvb2xlYW59IFtvcHRpb25zLm5hbWVQcmVwZW5kU2xhc2g9ZmFsc2VdIFByZXBlbmRzIGEgZm9yd2FyZCBzbGFzaCB0byBhcmNoaXZlIGZpbGUgcGF0aHMuXG4gKiBAcGFyYW0ge0Jvb2xlYW59IFtvcHRpb25zLnN0b3JlPWZhbHNlXSBTZXRzIHRoZSBjb21wcmVzc2lvbiBtZXRob2QgdG8gU1RPUkUuXG4gKiBAcGFyYW0ge09iamVjdH0gW29wdGlvbnMuemxpYl0gUGFzc2VkIHRvIFt6bGliXXtAbGluayBodHRwczovL25vZGVqcy5vcmcvYXBpL3psaWIuaHRtbCN6bGliX2NsYXNzX29wdGlvbnN9XG4gKi9cbnZhciBaaXAgPSBmdW5jdGlvbihvcHRpb25zKSB7XG4gIGlmICghKHRoaXMgaW5zdGFuY2VvZiBaaXApKSB7XG4gICAgcmV0dXJuIG5ldyBaaXAob3B0aW9ucyk7XG4gIH1cblxuICBvcHRpb25zID0gdGhpcy5vcHRpb25zID0gdXRpbC5kZWZhdWx0cyhvcHRpb25zLCB7XG4gICAgY29tbWVudDogJycsXG4gICAgZm9yY2VVVEM6IGZhbHNlLFxuICAgIG5hbWVQcmVwZW5kU2xhc2g6IGZhbHNlLFxuICAgIHN0b3JlOiBmYWxzZVxuICB9KTtcblxuICB0aGlzLnN1cHBvcnRzID0ge1xuICAgIGRpcmVjdG9yeTogdHJ1ZSxcbiAgICBzeW1saW5rOiB0cnVlXG4gIH07XG5cbiAgdGhpcy5lbmdpbmUgPSBuZXcgZW5naW5lKG9wdGlvbnMpO1xufTtcblxuLyoqXG4gKiBAcGFyYW0gIHsoQnVmZmVyfFN0cmVhbSl9IHNvdXJjZVxuICogQHBhcmFtICB7WmlwRW50cnlEYXRhfSBkYXRhXG4gKiBAcGFyYW0gIHtTdHJpbmd9IGRhdGEubmFtZSBTZXRzIHRoZSBlbnRyeSBuYW1lIGluY2x1ZGluZyBpbnRlcm5hbCBwYXRoLlxuICogQHBhcmFtICB7KFN0cmluZ3xEYXRlKX0gW2RhdGEuZGF0ZT1OT1coKV0gU2V0cyB0aGUgZW50cnkgZGF0ZS5cbiAqIEBwYXJhbSAge051bWJlcn0gW2RhdGEubW9kZT1EOjA3NTUvRjowNjQ0XSBTZXRzIHRoZSBlbnRyeSBwZXJtaXNzaW9ucy5cbiAqIEBwYXJhbSAge1N0cmluZ30gW2RhdGEucHJlZml4XSBTZXRzIGEgcGF0aCBwcmVmaXggZm9yIHRoZSBlbnRyeSBuYW1lLiBVc2VmdWxcbiAqIHdoZW4gd29ya2luZyB3aXRoIG1ldGhvZHMgbGlrZSBgZGlyZWN0b3J5YCBvciBgZ2xvYmAuXG4gKiBAcGFyYW0gIHtmcy5TdGF0c30gW2RhdGEuc3RhdHNdIFNldHMgdGhlIGZzIHN0YXQgZGF0YSBmb3IgdGhpcyBlbnRyeSBhbGxvd2luZ1xuICogZm9yIHJlZHVjdGlvbiBvZiBmcyBzdGF0IGNhbGxzIHdoZW4gc3RhdCBkYXRhIGlzIGFscmVhZHkga25vd24uXG4gKiBAcGFyYW0gIHtCb29sZWFufSBbZGF0YS5zdG9yZT1aaXBPcHRpb25zLnN0b3JlXSBTZXRzIHRoZSBjb21wcmVzc2lvbiBtZXRob2QgdG8gU1RPUkUuXG4gKiBAcGFyYW0gIHtGdW5jdGlvbn0gY2FsbGJhY2tcbiAqIEByZXR1cm4gdm9pZFxuICovXG5aaXAucHJvdG90eXBlLmFwcGVuZCA9IGZ1bmN0aW9uKHNvdXJjZSwgZGF0YSwgY2FsbGJhY2spIHtcbiAgdGhpcy5lbmdpbmUuZW50cnkoc291cmNlLCBkYXRhLCBjYWxsYmFjayk7XG59O1xuXG4vKipcbiAqIEByZXR1cm4gdm9pZFxuICovXG5aaXAucHJvdG90eXBlLmZpbmFsaXplID0gZnVuY3Rpb24oKSB7XG4gIHRoaXMuZW5naW5lLmZpbmFsaXplKCk7XG59O1xuXG4vKipcbiAqIEByZXR1cm4gdGhpcy5lbmdpbmVcbiAqL1xuWmlwLnByb3RvdHlwZS5vbiA9IGZ1bmN0aW9uKCkge1xuICByZXR1cm4gdGhpcy5lbmdpbmUub24uYXBwbHkodGhpcy5lbmdpbmUsIGFyZ3VtZW50cyk7XG59O1xuXG4vKipcbiAqIEByZXR1cm4gdGhpcy5lbmdpbmVcbiAqL1xuWmlwLnByb3RvdHlwZS5waXBlID0gZnVuY3Rpb24oKSB7XG4gIHJldHVybiB0aGlzLmVuZ2luZS5waXBlLmFwcGx5KHRoaXMuZW5naW5lLCBhcmd1bWVudHMpO1xufTtcblxuLyoqXG4gKiBAcmV0dXJuIHRoaXMuZW5naW5lXG4gKi9cblppcC5wcm90b3R5cGUudW5waXBlID0gZnVuY3Rpb24oKSB7XG4gIHJldHVybiB0aGlzLmVuZ2luZS51bnBpcGUuYXBwbHkodGhpcy5lbmdpbmUsIGFyZ3VtZW50cyk7XG59O1xuXG5tb2R1bGUuZXhwb3J0cyA9IFppcDtcblxuLyoqXG4gKiBAdHlwZWRlZiB7T2JqZWN0fSBaaXBPcHRpb25zXG4gKiBAZ2xvYmFsXG4gKiBAcHJvcGVydHkge1N0cmluZ30gW2NvbW1lbnRdIFNldHMgdGhlIHppcCBhcmNoaXZlIGNvbW1lbnQuXG4gKiBAcHJvcGVydHkge0Jvb2xlYW59IFtmb3JjZUxvY2FsVGltZT1mYWxzZV0gRm9yY2VzIHRoZSBhcmNoaXZlIHRvIGNvbnRhaW4gbG9jYWwgZmlsZSB0aW1lcyBpbnN0ZWFkIG9mIFVUQy5cbiAqIEBwcm9wZXJ0eSB7Qm9vbGVhbn0gW2ZvcmNlWmlwNjQ9ZmFsc2VdIEZvcmNlcyB0aGUgYXJjaGl2ZSB0byBjb250YWluIFpJUDY0IGhlYWRlcnMuXG4gKiBAcHJwcGVydHkge0Jvb2xlYW59IFtuYW1lUHJlcGVuZFNsYXNoPWZhbHNlXSBQcmVwZW5kcyBhIGZvcndhcmQgc2xhc2ggdG8gYXJjaGl2ZSBmaWxlIHBhdGhzLlxuICogQHByb3BlcnR5IHtCb29sZWFufSBbc3RvcmU9ZmFsc2VdIFNldHMgdGhlIGNvbXByZXNzaW9uIG1ldGhvZCB0byBTVE9SRS5cbiAqIEBwcm9wZXJ0eSB7T2JqZWN0fSBbemxpYl0gUGFzc2VkIHRvIFt6bGliXXtAbGluayBodHRwczovL25vZGVqcy5vcmcvYXBpL3psaWIuaHRtbCN6bGliX2NsYXNzX29wdGlvbnN9XG4gKiB0byBjb250cm9sIGNvbXByZXNzaW9uLlxuICogQHByb3BlcnR5IHsqfSBbKl0gU2VlIFt6aXAtc3RyZWFtXXtAbGluayBodHRwczovL2FyY2hpdmVyanMuY29tL3ppcC1zdHJlYW0vWmlwU3RyZWFtLmh0bWx9IGRvY3VtZW50YXRpb24gZm9yIGN1cnJlbnQgbGlzdCBvZiBwcm9wZXJ0aWVzLlxuICovXG5cbi8qKlxuICogQHR5cGVkZWYge09iamVjdH0gWmlwRW50cnlEYXRhXG4gKiBAZ2xvYmFsXG4gKiBAcHJvcGVydHkge1N0cmluZ30gbmFtZSBTZXRzIHRoZSBlbnRyeSBuYW1lIGluY2x1ZGluZyBpbnRlcm5hbCBwYXRoLlxuICogQHByb3BlcnR5IHsoU3RyaW5nfERhdGUpfSBbZGF0ZT1OT1coKV0gU2V0cyB0aGUgZW50cnkgZGF0ZS5cbiAqIEBwcm9wZXJ0eSB7TnVtYmVyfSBbbW9kZT1EOjA3NTUvRjowNjQ0XSBTZXRzIHRoZSBlbnRyeSBwZXJtaXNzaW9ucy5cbiAqIEBwcm9wZXJ0eSB7Qm9vbGVhbn0gW25hbWVQcmVwZW5kU2xhc2g9WmlwT3B0aW9ucy5uYW1lUHJlcGVuZFNsYXNoXSBQcmVwZW5kcyBhIGZvcndhcmQgc2xhc2ggdG8gYXJjaGl2ZSBmaWxlIHBhdGhzLlxuICogQHByb3BlcnR5IHtTdHJpbmd9IFtwcmVmaXhdIFNldHMgYSBwYXRoIHByZWZpeCBmb3IgdGhlIGVudHJ5IG5hbWUuIFVzZWZ1bFxuICogd2hlbiB3b3JraW5nIHdpdGggbWV0aG9kcyBsaWtlIGBkaXJlY3RvcnlgIG9yIGBnbG9iYC5cbiAqIEBwcm9wZXJ0eSB7ZnMuU3RhdHN9IFtzdGF0c10gU2V0cyB0aGUgZnMgc3RhdCBkYXRhIGZvciB0aGlzIGVudHJ5IGFsbG93aW5nXG4gKiBmb3IgcmVkdWN0aW9uIG9mIGZzIHN0YXQgY2FsbHMgd2hlbiBzdGF0IGRhdGEgaXMgYWxyZWFkeSBrbm93bi5cbiAqIEBwcm9wZXJ0eSB7Qm9vbGVhbn0gW3N0b3JlPVppcE9wdGlvbnMuc3RvcmVdIFNldHMgdGhlIGNvbXByZXNzaW9uIG1ldGhvZCB0byBTVE9SRS5cbiAqL1xuXG4vKipcbiAqIFppcFN0cmVhbSBNb2R1bGVcbiAqIEBleHRlcm5hbCBaaXBTdHJlYW1cbiAqIEBzZWUge0BsaW5rIGh0dHBzOi8vd3d3LmFyY2hpdmVyanMuY29tL3ppcC1zdHJlYW0vWmlwU3RyZWFtLmh0bWx9XG4gKi9cbiIsCiAgICAibW9kdWxlLmV4cG9ydHMgPSB0eXBlb2YgcXVldWVNaWNyb3Rhc2sgPT09ICdmdW5jdGlvbicgPyBxdWV1ZU1pY3JvdGFzayA6IChmbikgPT4gUHJvbWlzZS5yZXNvbHZlKCkudGhlbihmbilcbiIsCiAgICAibW9kdWxlLmV4cG9ydHMgPSAodHlwZW9mIHByb2Nlc3MgIT09ICd1bmRlZmluZWQnICYmIHR5cGVvZiBwcm9jZXNzLm5leHRUaWNrID09PSAnZnVuY3Rpb24nKVxuICA/IHByb2Nlc3MubmV4dFRpY2suYmluZChwcm9jZXNzKVxuICA6IHJlcXVpcmUoJy4vcXVldWUtbWljcm90YXNrJylcbiIsCiAgICAibW9kdWxlLmV4cG9ydHMgPSBjbGFzcyBGaXhlZEZJRk8ge1xuICBjb25zdHJ1Y3RvciAoaHdtKSB7XG4gICAgaWYgKCEoaHdtID4gMCkgfHwgKChod20gLSAxKSAmIGh3bSkgIT09IDApIHRocm93IG5ldyBFcnJvcignTWF4IHNpemUgZm9yIGEgRml4ZWRGSUZPIHNob3VsZCBiZSBhIHBvd2VyIG9mIHR3bycpXG4gICAgdGhpcy5idWZmZXIgPSBuZXcgQXJyYXkoaHdtKVxuICAgIHRoaXMubWFzayA9IGh3bSAtIDFcbiAgICB0aGlzLnRvcCA9IDBcbiAgICB0aGlzLmJ0bSA9IDBcbiAgICB0aGlzLm5leHQgPSBudWxsXG4gIH1cblxuICBjbGVhciAoKSB7XG4gICAgdGhpcy50b3AgPSB0aGlzLmJ0bSA9IDBcbiAgICB0aGlzLm5leHQgPSBudWxsXG4gICAgdGhpcy5idWZmZXIuZmlsbCh1bmRlZmluZWQpXG4gIH1cblxuICBwdXNoIChkYXRhKSB7XG4gICAgaWYgKHRoaXMuYnVmZmVyW3RoaXMudG9wXSAhPT0gdW5kZWZpbmVkKSByZXR1cm4gZmFsc2VcbiAgICB0aGlzLmJ1ZmZlclt0aGlzLnRvcF0gPSBkYXRhXG4gICAgdGhpcy50b3AgPSAodGhpcy50b3AgKyAxKSAmIHRoaXMubWFza1xuICAgIHJldHVybiB0cnVlXG4gIH1cblxuICBzaGlmdCAoKSB7XG4gICAgY29uc3QgbGFzdCA9IHRoaXMuYnVmZmVyW3RoaXMuYnRtXVxuICAgIGlmIChsYXN0ID09PSB1bmRlZmluZWQpIHJldHVybiB1bmRlZmluZWRcbiAgICB0aGlzLmJ1ZmZlclt0aGlzLmJ0bV0gPSB1bmRlZmluZWRcbiAgICB0aGlzLmJ0bSA9ICh0aGlzLmJ0bSArIDEpICYgdGhpcy5tYXNrXG4gICAgcmV0dXJuIGxhc3RcbiAgfVxuXG4gIHBlZWsgKCkge1xuICAgIHJldHVybiB0aGlzLmJ1ZmZlclt0aGlzLmJ0bV1cbiAgfVxuXG4gIGlzRW1wdHkgKCkge1xuICAgIHJldHVybiB0aGlzLmJ1ZmZlclt0aGlzLmJ0bV0gPT09IHVuZGVmaW5lZFxuICB9XG59XG4iLAogICAgImNvbnN0IEZpeGVkRklGTyA9IHJlcXVpcmUoJy4vZml4ZWQtc2l6ZScpXG5cbm1vZHVsZS5leHBvcnRzID0gY2xhc3MgRmFzdEZJRk8ge1xuICBjb25zdHJ1Y3RvciAoaHdtKSB7XG4gICAgdGhpcy5od20gPSBod20gfHwgMTZcbiAgICB0aGlzLmhlYWQgPSBuZXcgRml4ZWRGSUZPKHRoaXMuaHdtKVxuICAgIHRoaXMudGFpbCA9IHRoaXMuaGVhZFxuICAgIHRoaXMubGVuZ3RoID0gMFxuICB9XG5cbiAgY2xlYXIgKCkge1xuICAgIHRoaXMuaGVhZCA9IHRoaXMudGFpbFxuICAgIHRoaXMuaGVhZC5jbGVhcigpXG4gICAgdGhpcy5sZW5ndGggPSAwXG4gIH1cblxuICBwdXNoICh2YWwpIHtcbiAgICB0aGlzLmxlbmd0aCsrXG4gICAgaWYgKCF0aGlzLmhlYWQucHVzaCh2YWwpKSB7XG4gICAgICBjb25zdCBwcmV2ID0gdGhpcy5oZWFkXG4gICAgICB0aGlzLmhlYWQgPSBwcmV2Lm5leHQgPSBuZXcgRml4ZWRGSUZPKDIgKiB0aGlzLmhlYWQuYnVmZmVyLmxlbmd0aClcbiAgICAgIHRoaXMuaGVhZC5wdXNoKHZhbClcbiAgICB9XG4gIH1cblxuICBzaGlmdCAoKSB7XG4gICAgaWYgKHRoaXMubGVuZ3RoICE9PSAwKSB0aGlzLmxlbmd0aC0tXG4gICAgY29uc3QgdmFsID0gdGhpcy50YWlsLnNoaWZ0KClcbiAgICBpZiAodmFsID09PSB1bmRlZmluZWQgJiYgdGhpcy50YWlsLm5leHQpIHtcbiAgICAgIGNvbnN0IG5leHQgPSB0aGlzLnRhaWwubmV4dFxuICAgICAgdGhpcy50YWlsLm5leHQgPSBudWxsXG4gICAgICB0aGlzLnRhaWwgPSBuZXh0XG4gICAgICByZXR1cm4gdGhpcy50YWlsLnNoaWZ0KClcbiAgICB9XG5cbiAgICByZXR1cm4gdmFsXG4gIH1cblxuICBwZWVrICgpIHtcbiAgICBjb25zdCB2YWwgPSB0aGlzLnRhaWwucGVlaygpXG4gICAgaWYgKHZhbCA9PT0gdW5kZWZpbmVkICYmIHRoaXMudGFpbC5uZXh0KSByZXR1cm4gdGhpcy50YWlsLm5leHQucGVlaygpXG4gICAgcmV0dXJuIHZhbFxuICB9XG5cbiAgaXNFbXB0eSAoKSB7XG4gICAgcmV0dXJuIHRoaXMubGVuZ3RoID09PSAwXG4gIH1cbn1cbiIsCiAgICAibW9kdWxlLmV4cG9ydHMgPSBjbGFzcyBQYXNzVGhyb3VnaERlY29kZXIge1xuICBjb25zdHJ1Y3RvciAoZW5jb2RpbmcpIHtcbiAgICB0aGlzLmVuY29kaW5nID0gZW5jb2RpbmdcbiAgfVxuXG4gIGdldCByZW1haW5pbmcgKCkge1xuICAgIHJldHVybiAwXG4gIH1cblxuICBkZWNvZGUgKHRhaWwpIHtcbiAgICByZXR1cm4gdGFpbC50b1N0cmluZyh0aGlzLmVuY29kaW5nKVxuICB9XG5cbiAgZmx1c2ggKCkge1xuICAgIHJldHVybiAnJ1xuICB9XG59XG4iLAogICAgIi8qKlxuICogaHR0cHM6Ly9lbmNvZGluZy5zcGVjLndoYXR3Zy5vcmcvI3V0Zi04LWRlY29kZXJcbiAqL1xubW9kdWxlLmV4cG9ydHMgPSBjbGFzcyBVVEY4RGVjb2RlciB7XG4gIGNvbnN0cnVjdG9yICgpIHtcbiAgICB0aGlzLmNvZGVQb2ludCA9IDBcbiAgICB0aGlzLmJ5dGVzU2VlbiA9IDBcbiAgICB0aGlzLmJ5dGVzTmVlZGVkID0gMFxuICAgIHRoaXMubG93ZXJCb3VuZGFyeSA9IDB4ODBcbiAgICB0aGlzLnVwcGVyQm91bmRhcnkgPSAweGJmXG4gIH1cblxuICBnZXQgcmVtYWluaW5nICgpIHtcbiAgICByZXR1cm4gdGhpcy5ieXRlc1NlZW5cbiAgfVxuXG4gIGRlY29kZSAoZGF0YSkge1xuICAgIC8vIElmIHdlIGhhdmUgYSBmYXN0IHBhdGgsIGp1c3Qgc25pZmYgaWYgdGhlIGxhc3QgcGFydCBpcyBhIGJvdW5kYXJ5XG4gICAgaWYgKHRoaXMuYnl0ZXNOZWVkZWQgPT09IDApIHtcbiAgICAgIGxldCBpc0JvdW5kYXJ5ID0gdHJ1ZVxuXG4gICAgICBmb3IgKGxldCBpID0gTWF0aC5tYXgoMCwgZGF0YS5ieXRlTGVuZ3RoIC0gNCksIG4gPSBkYXRhLmJ5dGVMZW5ndGg7IGkgPCBuICYmIGlzQm91bmRhcnk7IGkrKykge1xuICAgICAgICBpc0JvdW5kYXJ5ID0gZGF0YVtpXSA8PSAweDdmXG4gICAgICB9XG5cbiAgICAgIGlmIChpc0JvdW5kYXJ5KSByZXR1cm4gZGF0YS50b1N0cmluZygpXG4gICAgfVxuXG4gICAgbGV0IHJlc3VsdCA9ICcnXG5cbiAgICBmb3IgKGxldCBpID0gMCwgbiA9IGRhdGEuYnl0ZUxlbmd0aDsgaSA8IG47IGkrKykge1xuICAgICAgY29uc3QgYnl0ZSA9IGRhdGFbaV1cblxuICAgICAgaWYgKHRoaXMuYnl0ZXNOZWVkZWQgPT09IDApIHtcbiAgICAgICAgaWYgKGJ5dGUgPD0gMHg3Zikge1xuICAgICAgICAgIHJlc3VsdCArPSBTdHJpbmcuZnJvbUNoYXJDb2RlKGJ5dGUpXG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgdGhpcy5ieXRlc1NlZW4gPSAxXG5cbiAgICAgICAgICBpZiAoYnl0ZSA+PSAweGMyICYmIGJ5dGUgPD0gMHhkZikge1xuICAgICAgICAgICAgdGhpcy5ieXRlc05lZWRlZCA9IDJcbiAgICAgICAgICAgIHRoaXMuY29kZVBvaW50ID0gYnl0ZSAmIDB4MWZcbiAgICAgICAgICB9IGVsc2UgaWYgKGJ5dGUgPj0gMHhlMCAmJiBieXRlIDw9IDB4ZWYpIHtcbiAgICAgICAgICAgIGlmIChieXRlID09PSAweGUwKSB0aGlzLmxvd2VyQm91bmRhcnkgPSAweGEwXG4gICAgICAgICAgICBlbHNlIGlmIChieXRlID09PSAweGVkKSB0aGlzLnVwcGVyQm91bmRhcnkgPSAweDlmXG4gICAgICAgICAgICB0aGlzLmJ5dGVzTmVlZGVkID0gM1xuICAgICAgICAgICAgdGhpcy5jb2RlUG9pbnQgPSBieXRlICYgMHhmXG4gICAgICAgICAgfSBlbHNlIGlmIChieXRlID49IDB4ZjAgJiYgYnl0ZSA8PSAweGY0KSB7XG4gICAgICAgICAgICBpZiAoYnl0ZSA9PT0gMHhmMCkgdGhpcy5sb3dlckJvdW5kYXJ5ID0gMHg5MFxuICAgICAgICAgICAgaWYgKGJ5dGUgPT09IDB4ZjQpIHRoaXMudXBwZXJCb3VuZGFyeSA9IDB4OGZcbiAgICAgICAgICAgIHRoaXMuYnl0ZXNOZWVkZWQgPSA0XG4gICAgICAgICAgICB0aGlzLmNvZGVQb2ludCA9IGJ5dGUgJiAweDdcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgcmVzdWx0ICs9ICdcXHVmZmZkJ1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnRpbnVlXG4gICAgICB9XG5cbiAgICAgIGlmIChieXRlIDwgdGhpcy5sb3dlckJvdW5kYXJ5IHx8IGJ5dGUgPiB0aGlzLnVwcGVyQm91bmRhcnkpIHtcbiAgICAgICAgdGhpcy5jb2RlUG9pbnQgPSAwXG4gICAgICAgIHRoaXMuYnl0ZXNOZWVkZWQgPSAwXG4gICAgICAgIHRoaXMuYnl0ZXNTZWVuID0gMFxuICAgICAgICB0aGlzLmxvd2VyQm91bmRhcnkgPSAweDgwXG4gICAgICAgIHRoaXMudXBwZXJCb3VuZGFyeSA9IDB4YmZcblxuICAgICAgICByZXN1bHQgKz0gJ1xcdWZmZmQnXG5cbiAgICAgICAgY29udGludWVcbiAgICAgIH1cblxuICAgICAgdGhpcy5sb3dlckJvdW5kYXJ5ID0gMHg4MFxuICAgICAgdGhpcy51cHBlckJvdW5kYXJ5ID0gMHhiZlxuXG4gICAgICB0aGlzLmNvZGVQb2ludCA9ICh0aGlzLmNvZGVQb2ludCA8PCA2KSB8IChieXRlICYgMHgzZilcbiAgICAgIHRoaXMuYnl0ZXNTZWVuKytcblxuICAgICAgaWYgKHRoaXMuYnl0ZXNTZWVuICE9PSB0aGlzLmJ5dGVzTmVlZGVkKSBjb250aW51ZVxuXG4gICAgICByZXN1bHQgKz0gU3RyaW5nLmZyb21Db2RlUG9pbnQodGhpcy5jb2RlUG9pbnQpXG5cbiAgICAgIHRoaXMuY29kZVBvaW50ID0gMFxuICAgICAgdGhpcy5ieXRlc05lZWRlZCA9IDBcbiAgICAgIHRoaXMuYnl0ZXNTZWVuID0gMFxuICAgIH1cblxuICAgIHJldHVybiByZXN1bHRcbiAgfVxuXG4gIGZsdXNoICgpIHtcbiAgICBjb25zdCByZXN1bHQgPSB0aGlzLmJ5dGVzTmVlZGVkID4gMCA/ICdcXHVmZmZkJyA6ICcnXG5cbiAgICB0aGlzLmNvZGVQb2ludCA9IDBcbiAgICB0aGlzLmJ5dGVzTmVlZGVkID0gMFxuICAgIHRoaXMuYnl0ZXNTZWVuID0gMFxuICAgIHRoaXMubG93ZXJCb3VuZGFyeSA9IDB4ODBcbiAgICB0aGlzLnVwcGVyQm91bmRhcnkgPSAweGJmXG5cbiAgICByZXR1cm4gcmVzdWx0XG4gIH1cbn1cbiIsCiAgICAiY29uc3QgUGFzc1Rocm91Z2hEZWNvZGVyID0gcmVxdWlyZSgnLi9saWIvcGFzcy10aHJvdWdoLWRlY29kZXInKVxuY29uc3QgVVRGOERlY29kZXIgPSByZXF1aXJlKCcuL2xpYi91dGY4LWRlY29kZXInKVxuXG5tb2R1bGUuZXhwb3J0cyA9IGNsYXNzIFRleHREZWNvZGVyIHtcbiAgY29uc3RydWN0b3IgKGVuY29kaW5nID0gJ3V0ZjgnKSB7XG4gICAgdGhpcy5lbmNvZGluZyA9IG5vcm1hbGl6ZUVuY29kaW5nKGVuY29kaW5nKVxuXG4gICAgc3dpdGNoICh0aGlzLmVuY29kaW5nKSB7XG4gICAgICBjYXNlICd1dGY4JzpcbiAgICAgICAgdGhpcy5kZWNvZGVyID0gbmV3IFVURjhEZWNvZGVyKClcbiAgICAgICAgYnJlYWtcbiAgICAgIGNhc2UgJ3V0ZjE2bGUnOlxuICAgICAgY2FzZSAnYmFzZTY0JzpcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdVbnN1cHBvcnRlZCBlbmNvZGluZzogJyArIHRoaXMuZW5jb2RpbmcpXG4gICAgICBkZWZhdWx0OlxuICAgICAgICB0aGlzLmRlY29kZXIgPSBuZXcgUGFzc1Rocm91Z2hEZWNvZGVyKHRoaXMuZW5jb2RpbmcpXG4gICAgfVxuICB9XG5cbiAgZ2V0IHJlbWFpbmluZyAoKSB7XG4gICAgcmV0dXJuIHRoaXMuZGVjb2Rlci5yZW1haW5pbmdcbiAgfVxuXG4gIHB1c2ggKGRhdGEpIHtcbiAgICBpZiAodHlwZW9mIGRhdGEgPT09ICdzdHJpbmcnKSByZXR1cm4gZGF0YVxuICAgIHJldHVybiB0aGlzLmRlY29kZXIuZGVjb2RlKGRhdGEpXG4gIH1cblxuICAvLyBGb3IgTm9kZS5qcyBjb21wYXRpYmlsaXR5XG4gIHdyaXRlIChkYXRhKSB7XG4gICAgcmV0dXJuIHRoaXMucHVzaChkYXRhKVxuICB9XG5cbiAgZW5kIChkYXRhKSB7XG4gICAgbGV0IHJlc3VsdCA9ICcnXG4gICAgaWYgKGRhdGEpIHJlc3VsdCA9IHRoaXMucHVzaChkYXRhKVxuICAgIHJlc3VsdCArPSB0aGlzLmRlY29kZXIuZmx1c2goKVxuICAgIHJldHVybiByZXN1bHRcbiAgfVxufVxuXG5mdW5jdGlvbiBub3JtYWxpemVFbmNvZGluZyAoZW5jb2RpbmcpIHtcbiAgZW5jb2RpbmcgPSBlbmNvZGluZy50b0xvd2VyQ2FzZSgpXG5cbiAgc3dpdGNoIChlbmNvZGluZykge1xuICAgIGNhc2UgJ3V0ZjgnOlxuICAgIGNhc2UgJ3V0Zi04JzpcbiAgICAgIHJldHVybiAndXRmOCdcbiAgICBjYXNlICd1Y3MyJzpcbiAgICBjYXNlICd1Y3MtMic6XG4gICAgY2FzZSAndXRmMTZsZSc6XG4gICAgY2FzZSAndXRmLTE2bGUnOlxuICAgICAgcmV0dXJuICd1dGYxNmxlJ1xuICAgIGNhc2UgJ2xhdGluMSc6XG4gICAgY2FzZSAnYmluYXJ5JzpcbiAgICAgIHJldHVybiAnbGF0aW4xJ1xuICAgIGNhc2UgJ2Jhc2U2NCc6XG4gICAgY2FzZSAnYXNjaWknOlxuICAgIGNhc2UgJ2hleCc6XG4gICAgICByZXR1cm4gZW5jb2RpbmdcbiAgICBkZWZhdWx0OlxuICAgICAgdGhyb3cgbmV3IEVycm9yKCdVbmtub3duIGVuY29kaW5nOiAnICsgZW5jb2RpbmcpXG4gIH1cbn07XG4iLAogICAgImNvbnN0IHsgRXZlbnRFbWl0dGVyIH0gPSByZXF1aXJlKCdldmVudHMnKVxuY29uc3QgU1RSRUFNX0RFU1RST1lFRCA9IG5ldyBFcnJvcignU3RyZWFtIHdhcyBkZXN0cm95ZWQnKVxuY29uc3QgUFJFTUFUVVJFX0NMT1NFID0gbmV3IEVycm9yKCdQcmVtYXR1cmUgY2xvc2UnKVxuXG5jb25zdCBxdWV1ZVRpY2sgPSByZXF1aXJlKCdxdWV1ZS10aWNrJylcbmNvbnN0IEZJRk8gPSByZXF1aXJlKCdmYXN0LWZpZm8nKVxuY29uc3QgVGV4dERlY29kZXIgPSByZXF1aXJlKCd0ZXh0LWRlY29kZXInKVxuXG4vKiBlc2xpbnQtZGlzYWJsZSBuby1tdWx0aS1zcGFjZXMgKi9cblxuLy8gMjkgYml0cyB1c2VkIHRvdGFsICg0IGZyb20gc2hhcmVkLCAxNCBmcm9tIHJlYWQsIGFuZCAxMSBmcm9tIHdyaXRlKVxuY29uc3QgTUFYID0gKCgxIDw8IDI5KSAtIDEpXG5cbi8vIFNoYXJlZCBzdGF0ZVxuY29uc3QgT1BFTklORyAgICAgICA9IDBiMDAwMVxuY29uc3QgUFJFREVTVFJPWUlORyA9IDBiMDAxMFxuY29uc3QgREVTVFJPWUlORyAgICA9IDBiMDEwMFxuY29uc3QgREVTVFJPWUVEICAgICA9IDBiMTAwMFxuXG5jb25zdCBOT1RfT1BFTklORyA9IE1BWCBeIE9QRU5JTkdcbmNvbnN0IE5PVF9QUkVERVNUUk9ZSU5HID0gTUFYIF4gUFJFREVTVFJPWUlOR1xuXG4vLyBSZWFkIHN0YXRlICg0IGJpdCBvZmZzZXQgZnJvbSBzaGFyZWQgc3RhdGUpXG5jb25zdCBSRUFEX0FDVElWRSAgICAgICAgICAgPSAwYjAwMDAwMDAwMDAwMDAxIDw8IDRcbmNvbnN0IFJFQURfVVBEQVRJTkcgICAgICAgICA9IDBiMDAwMDAwMDAwMDAwMTAgPDwgNFxuY29uc3QgUkVBRF9QUklNQVJZICAgICAgICAgID0gMGIwMDAwMDAwMDAwMDEwMCA8PCA0XG5jb25zdCBSRUFEX1FVRVVFRCAgICAgICAgICAgPSAwYjAwMDAwMDAwMDAxMDAwIDw8IDRcbmNvbnN0IFJFQURfUkVTVU1FRCAgICAgICAgICA9IDBiMDAwMDAwMDAwMTAwMDAgPDwgNFxuY29uc3QgUkVBRF9QSVBFX0RSQUlORUQgICAgID0gMGIwMDAwMDAwMDEwMDAwMCA8PCA0XG5jb25zdCBSRUFEX0VORElORyAgICAgICAgICAgPSAwYjAwMDAwMDAxMDAwMDAwIDw8IDRcbmNvbnN0IFJFQURfRU1JVF9EQVRBICAgICAgICA9IDBiMDAwMDAwMTAwMDAwMDAgPDwgNFxuY29uc3QgUkVBRF9FTUlUX1JFQURBQkxFICAgID0gMGIwMDAwMDEwMDAwMDAwMCA8PCA0XG5jb25zdCBSRUFEX0VNSVRURURfUkVBREFCTEUgPSAwYjAwMDAxMDAwMDAwMDAwIDw8IDRcbmNvbnN0IFJFQURfRE9ORSAgICAgICAgICAgICA9IDBiMDAwMTAwMDAwMDAwMDAgPDwgNFxuY29uc3QgUkVBRF9ORVhUX1RJQ0sgICAgICAgID0gMGIwMDEwMDAwMDAwMDAwMCA8PCA0XG5jb25zdCBSRUFEX05FRURTX1BVU0ggICAgICAgPSAwYjAxMDAwMDAwMDAwMDAwIDw8IDRcbmNvbnN0IFJFQURfUkVBRF9BSEVBRCAgICAgICA9IDBiMTAwMDAwMDAwMDAwMDAgPDwgNFxuXG4vLyBDb21iaW5lZCByZWFkIHN0YXRlXG5jb25zdCBSRUFEX0ZMT1dJTkcgPSBSRUFEX1JFU1VNRUQgfCBSRUFEX1BJUEVfRFJBSU5FRFxuY29uc3QgUkVBRF9BQ1RJVkVfQU5EX05FRURTX1BVU0ggPSBSRUFEX0FDVElWRSB8IFJFQURfTkVFRFNfUFVTSFxuY29uc3QgUkVBRF9QUklNQVJZX0FORF9BQ1RJVkUgPSBSRUFEX1BSSU1BUlkgfCBSRUFEX0FDVElWRVxuY29uc3QgUkVBRF9FTUlUX1JFQURBQkxFX0FORF9RVUVVRUQgPSBSRUFEX0VNSVRfUkVBREFCTEUgfCBSRUFEX1FVRVVFRFxuY29uc3QgUkVBRF9SRVNVTUVEX1JFQURfQUhFQUQgPSBSRUFEX1JFU1VNRUQgfCBSRUFEX1JFQURfQUhFQURcblxuY29uc3QgUkVBRF9OT1RfQUNUSVZFICAgICAgICAgICAgID0gTUFYIF4gUkVBRF9BQ1RJVkVcbmNvbnN0IFJFQURfTk9OX1BSSU1BUlkgICAgICAgICAgICA9IE1BWCBeIFJFQURfUFJJTUFSWVxuY29uc3QgUkVBRF9OT05fUFJJTUFSWV9BTkRfUFVTSEVEID0gTUFYIF4gKFJFQURfUFJJTUFSWSB8IFJFQURfTkVFRFNfUFVTSClcbmNvbnN0IFJFQURfUFVTSEVEICAgICAgICAgICAgICAgICA9IE1BWCBeIFJFQURfTkVFRFNfUFVTSFxuY29uc3QgUkVBRF9QQVVTRUQgICAgICAgICAgICAgICAgID0gTUFYIF4gUkVBRF9SRVNVTUVEXG5jb25zdCBSRUFEX05PVF9RVUVVRUQgICAgICAgICAgICAgPSBNQVggXiAoUkVBRF9RVUVVRUQgfCBSRUFEX0VNSVRURURfUkVBREFCTEUpXG5jb25zdCBSRUFEX05PVF9FTkRJTkcgICAgICAgICAgICAgPSBNQVggXiBSRUFEX0VORElOR1xuY29uc3QgUkVBRF9QSVBFX05PVF9EUkFJTkVEICAgICAgID0gTUFYIF4gUkVBRF9GTE9XSU5HXG5jb25zdCBSRUFEX05PVF9ORVhUX1RJQ0sgICAgICAgICAgPSBNQVggXiBSRUFEX05FWFRfVElDS1xuY29uc3QgUkVBRF9OT1RfVVBEQVRJTkcgICAgICAgICAgID0gTUFYIF4gUkVBRF9VUERBVElOR1xuY29uc3QgUkVBRF9OT19SRUFEX0FIRUFEICAgICAgICAgID0gTUFYIF4gUkVBRF9SRUFEX0FIRUFEXG5jb25zdCBSRUFEX1BBVVNFRF9OT19SRUFEX0FIRUFEICAgPSBNQVggXiBSRUFEX1JFU1VNRURfUkVBRF9BSEVBRFxuXG4vLyBXcml0ZSBzdGF0ZSAoMTggYml0IG9mZnNldCwgNCBiaXQgb2Zmc2V0IGZyb20gc2hhcmVkIHN0YXRlIGFuZCAxNCBmcm9tIHJlYWQgc3RhdGUpXG5jb25zdCBXUklURV9BQ1RJVkUgICAgID0gMGIwMDAwMDAwMDAwMSA8PCAxOFxuY29uc3QgV1JJVEVfVVBEQVRJTkcgICA9IDBiMDAwMDAwMDAwMTAgPDwgMThcbmNvbnN0IFdSSVRFX1BSSU1BUlkgICAgPSAwYjAwMDAwMDAwMTAwIDw8IDE4XG5jb25zdCBXUklURV9RVUVVRUQgICAgID0gMGIwMDAwMDAwMTAwMCA8PCAxOFxuY29uc3QgV1JJVEVfVU5EUkFJTkVEICA9IDBiMDAwMDAwMTAwMDAgPDwgMThcbmNvbnN0IFdSSVRFX0RPTkUgICAgICAgPSAwYjAwMDAwMTAwMDAwIDw8IDE4XG5jb25zdCBXUklURV9FTUlUX0RSQUlOID0gMGIwMDAwMTAwMDAwMCA8PCAxOFxuY29uc3QgV1JJVEVfTkVYVF9USUNLICA9IDBiMDAwMTAwMDAwMDAgPDwgMThcbmNvbnN0IFdSSVRFX1dSSVRJTkcgICAgPSAwYjAwMTAwMDAwMDAwIDw8IDE4XG5jb25zdCBXUklURV9GSU5JU0hJTkcgID0gMGIwMTAwMDAwMDAwMCA8PCAxOFxuY29uc3QgV1JJVEVfQ09SS0VEICAgICA9IDBiMTAwMDAwMDAwMDAgPDwgMThcblxuY29uc3QgV1JJVEVfTk9UX0FDVElWRSAgICA9IE1BWCBeIChXUklURV9BQ1RJVkUgfCBXUklURV9XUklUSU5HKVxuY29uc3QgV1JJVEVfTk9OX1BSSU1BUlkgICA9IE1BWCBeIFdSSVRFX1BSSU1BUllcbmNvbnN0IFdSSVRFX05PVF9GSU5JU0hJTkcgPSBNQVggXiBXUklURV9GSU5JU0hJTkdcbmNvbnN0IFdSSVRFX0RSQUlORUQgICAgICAgPSBNQVggXiBXUklURV9VTkRSQUlORURcbmNvbnN0IFdSSVRFX05PVF9RVUVVRUQgICAgPSBNQVggXiBXUklURV9RVUVVRURcbmNvbnN0IFdSSVRFX05PVF9ORVhUX1RJQ0sgPSBNQVggXiBXUklURV9ORVhUX1RJQ0tcbmNvbnN0IFdSSVRFX05PVF9VUERBVElORyAgPSBNQVggXiBXUklURV9VUERBVElOR1xuY29uc3QgV1JJVEVfTk9UX0NPUktFRCAgICA9IE1BWCBeIFdSSVRFX0NPUktFRFxuXG4vLyBDb21iaW5lZCBzaGFyZWQgc3RhdGVcbmNvbnN0IEFDVElWRSA9IFJFQURfQUNUSVZFIHwgV1JJVEVfQUNUSVZFXG5jb25zdCBOT1RfQUNUSVZFID0gTUFYIF4gQUNUSVZFXG5jb25zdCBET05FID0gUkVBRF9ET05FIHwgV1JJVEVfRE9ORVxuY29uc3QgREVTVFJPWV9TVEFUVVMgPSBERVNUUk9ZSU5HIHwgREVTVFJPWUVEIHwgUFJFREVTVFJPWUlOR1xuY29uc3QgT1BFTl9TVEFUVVMgPSBERVNUUk9ZX1NUQVRVUyB8IE9QRU5JTkdcbmNvbnN0IEFVVE9fREVTVFJPWSA9IERFU1RST1lfU1RBVFVTIHwgRE9ORVxuY29uc3QgTk9OX1BSSU1BUlkgPSBXUklURV9OT05fUFJJTUFSWSAmIFJFQURfTk9OX1BSSU1BUllcbmNvbnN0IEFDVElWRV9PUl9USUNLSU5HID0gV1JJVEVfTkVYVF9USUNLIHwgUkVBRF9ORVhUX1RJQ0tcbmNvbnN0IFRJQ0tJTkcgPSBBQ1RJVkVfT1JfVElDS0lORyAmIE5PVF9BQ1RJVkVcbmNvbnN0IElTX09QRU5JTkcgPSBPUEVOX1NUQVRVUyB8IFRJQ0tJTkdcblxuLy8gQ29tYmluZWQgc2hhcmVkIHN0YXRlIGFuZCByZWFkIHN0YXRlXG5jb25zdCBSRUFEX1BSSU1BUllfU1RBVFVTID0gT1BFTl9TVEFUVVMgfCBSRUFEX0VORElORyB8IFJFQURfRE9ORVxuY29uc3QgUkVBRF9TVEFUVVMgPSBPUEVOX1NUQVRVUyB8IFJFQURfRE9ORSB8IFJFQURfUVVFVUVEXG5jb25zdCBSRUFEX0VORElOR19TVEFUVVMgPSBPUEVOX1NUQVRVUyB8IFJFQURfRU5ESU5HIHwgUkVBRF9RVUVVRURcbmNvbnN0IFJFQURfUkVBREFCTEVfU1RBVFVTID0gT1BFTl9TVEFUVVMgfCBSRUFEX0VNSVRfUkVBREFCTEUgfCBSRUFEX1FVRVVFRCB8IFJFQURfRU1JVFRFRF9SRUFEQUJMRVxuY29uc3QgU0hPVUxEX05PVF9SRUFEID0gT1BFTl9TVEFUVVMgfCBSRUFEX0FDVElWRSB8IFJFQURfRU5ESU5HIHwgUkVBRF9ET05FIHwgUkVBRF9ORUVEU19QVVNIIHwgUkVBRF9SRUFEX0FIRUFEXG5jb25zdCBSRUFEX0JBQ0tQUkVTU1VSRV9TVEFUVVMgPSBERVNUUk9ZX1NUQVRVUyB8IFJFQURfRU5ESU5HIHwgUkVBRF9ET05FXG5jb25zdCBSRUFEX1VQREFURV9TWU5DX1NUQVRVUyA9IFJFQURfVVBEQVRJTkcgfCBPUEVOX1NUQVRVUyB8IFJFQURfTkVYVF9USUNLIHwgUkVBRF9QUklNQVJZXG5cbi8vIENvbWJpbmVkIHdyaXRlIHN0YXRlXG5jb25zdCBXUklURV9QUklNQVJZX1NUQVRVUyA9IE9QRU5fU1RBVFVTIHwgV1JJVEVfRklOSVNISU5HIHwgV1JJVEVfRE9ORVxuY29uc3QgV1JJVEVfUVVFVUVEX0FORF9VTkRSQUlORUQgPSBXUklURV9RVUVVRUQgfCBXUklURV9VTkRSQUlORURcbmNvbnN0IFdSSVRFX1FVRVVFRF9BTkRfQUNUSVZFID0gV1JJVEVfUVVFVUVEIHwgV1JJVEVfQUNUSVZFXG5jb25zdCBXUklURV9EUkFJTl9TVEFUVVMgPSBXUklURV9RVUVVRUQgfCBXUklURV9VTkRSQUlORUQgfCBPUEVOX1NUQVRVUyB8IFdSSVRFX0FDVElWRVxuY29uc3QgV1JJVEVfU1RBVFVTID0gT1BFTl9TVEFUVVMgfCBXUklURV9BQ1RJVkUgfCBXUklURV9RVUVVRUQgfCBXUklURV9DT1JLRURcbmNvbnN0IFdSSVRFX1BSSU1BUllfQU5EX0FDVElWRSA9IFdSSVRFX1BSSU1BUlkgfCBXUklURV9BQ1RJVkVcbmNvbnN0IFdSSVRFX0FDVElWRV9BTkRfV1JJVElORyA9IFdSSVRFX0FDVElWRSB8IFdSSVRFX1dSSVRJTkdcbmNvbnN0IFdSSVRFX0ZJTklTSElOR19TVEFUVVMgPSBPUEVOX1NUQVRVUyB8IFdSSVRFX0ZJTklTSElORyB8IFdSSVRFX1FVRVVFRF9BTkRfQUNUSVZFIHwgV1JJVEVfRE9ORVxuY29uc3QgV1JJVEVfQkFDS1BSRVNTVVJFX1NUQVRVUyA9IFdSSVRFX1VORFJBSU5FRCB8IERFU1RST1lfU1RBVFVTIHwgV1JJVEVfRklOSVNISU5HIHwgV1JJVEVfRE9ORVxuY29uc3QgV1JJVEVfVVBEQVRFX1NZTkNfU1RBVFVTID0gV1JJVEVfVVBEQVRJTkcgfCBPUEVOX1NUQVRVUyB8IFdSSVRFX05FWFRfVElDSyB8IFdSSVRFX1BSSU1BUllcblxuY29uc3QgYXN5bmNJdGVyYXRvciA9IFN5bWJvbC5hc3luY0l0ZXJhdG9yIHx8IFN5bWJvbCgnYXN5bmNJdGVyYXRvcicpXG5cbmNsYXNzIFdyaXRhYmxlU3RhdGUge1xuICBjb25zdHJ1Y3RvciAoc3RyZWFtLCB7IGhpZ2hXYXRlck1hcmsgPSAxNjM4NCwgbWFwID0gbnVsbCwgbWFwV3JpdGFibGUsIGJ5dGVMZW5ndGgsIGJ5dGVMZW5ndGhXcml0YWJsZSB9ID0ge30pIHtcbiAgICB0aGlzLnN0cmVhbSA9IHN0cmVhbVxuICAgIHRoaXMucXVldWUgPSBuZXcgRklGTygpXG4gICAgdGhpcy5oaWdoV2F0ZXJNYXJrID0gaGlnaFdhdGVyTWFya1xuICAgIHRoaXMuYnVmZmVyZWQgPSAwXG4gICAgdGhpcy5lcnJvciA9IG51bGxcbiAgICB0aGlzLnBpcGVsaW5lID0gbnVsbFxuICAgIHRoaXMuZHJhaW5zID0gbnVsbCAvLyBpZiB3ZSBhZGQgbW9yZSBzZWxkb21seSB1c2VkIGhlbHBlcnMgd2UgbWlnaHQgdGhlbSBpbnRvIGEgc3Vib2JqZWN0IHNvIGl0cyBhIHNpbmdsZSBwdHJcbiAgICB0aGlzLmJ5dGVMZW5ndGggPSBieXRlTGVuZ3RoV3JpdGFibGUgfHwgYnl0ZUxlbmd0aCB8fCBkZWZhdWx0Qnl0ZUxlbmd0aFxuICAgIHRoaXMubWFwID0gbWFwV3JpdGFibGUgfHwgbWFwXG4gICAgdGhpcy5hZnRlcldyaXRlID0gYWZ0ZXJXcml0ZS5iaW5kKHRoaXMpXG4gICAgdGhpcy5hZnRlclVwZGF0ZU5leHRUaWNrID0gdXBkYXRlV3JpdGVOVC5iaW5kKHRoaXMpXG4gIH1cblxuICBnZXQgZW5kZWQgKCkge1xuICAgIHJldHVybiAodGhpcy5zdHJlYW0uX2R1cGxleFN0YXRlICYgV1JJVEVfRE9ORSkgIT09IDBcbiAgfVxuXG4gIHB1c2ggKGRhdGEpIHtcbiAgICBpZiAodGhpcy5tYXAgIT09IG51bGwpIGRhdGEgPSB0aGlzLm1hcChkYXRhKVxuXG4gICAgdGhpcy5idWZmZXJlZCArPSB0aGlzLmJ5dGVMZW5ndGgoZGF0YSlcbiAgICB0aGlzLnF1ZXVlLnB1c2goZGF0YSlcblxuICAgIGlmICh0aGlzLmJ1ZmZlcmVkIDwgdGhpcy5oaWdoV2F0ZXJNYXJrKSB7XG4gICAgICB0aGlzLnN0cmVhbS5fZHVwbGV4U3RhdGUgfD0gV1JJVEVfUVVFVUVEXG4gICAgICByZXR1cm4gdHJ1ZVxuICAgIH1cblxuICAgIHRoaXMuc3RyZWFtLl9kdXBsZXhTdGF0ZSB8PSBXUklURV9RVUVVRURfQU5EX1VORFJBSU5FRFxuICAgIHJldHVybiBmYWxzZVxuICB9XG5cbiAgc2hpZnQgKCkge1xuICAgIGNvbnN0IGRhdGEgPSB0aGlzLnF1ZXVlLnNoaWZ0KClcblxuICAgIHRoaXMuYnVmZmVyZWQgLT0gdGhpcy5ieXRlTGVuZ3RoKGRhdGEpXG4gICAgaWYgKHRoaXMuYnVmZmVyZWQgPT09IDApIHRoaXMuc3RyZWFtLl9kdXBsZXhTdGF0ZSAmPSBXUklURV9OT1RfUVVFVUVEXG5cbiAgICByZXR1cm4gZGF0YVxuICB9XG5cbiAgZW5kIChkYXRhKSB7XG4gICAgaWYgKHR5cGVvZiBkYXRhID09PSAnZnVuY3Rpb24nKSB0aGlzLnN0cmVhbS5vbmNlKCdmaW5pc2gnLCBkYXRhKVxuICAgIGVsc2UgaWYgKGRhdGEgIT09IHVuZGVmaW5lZCAmJiBkYXRhICE9PSBudWxsKSB0aGlzLnB1c2goZGF0YSlcbiAgICB0aGlzLnN0cmVhbS5fZHVwbGV4U3RhdGUgPSAodGhpcy5zdHJlYW0uX2R1cGxleFN0YXRlIHwgV1JJVEVfRklOSVNISU5HKSAmIFdSSVRFX05PTl9QUklNQVJZXG4gIH1cblxuICBhdXRvQmF0Y2ggKGRhdGEsIGNiKSB7XG4gICAgY29uc3QgYnVmZmVyID0gW11cbiAgICBjb25zdCBzdHJlYW0gPSB0aGlzLnN0cmVhbVxuXG4gICAgYnVmZmVyLnB1c2goZGF0YSlcbiAgICB3aGlsZSAoKHN0cmVhbS5fZHVwbGV4U3RhdGUgJiBXUklURV9TVEFUVVMpID09PSBXUklURV9RVUVVRURfQU5EX0FDVElWRSkge1xuICAgICAgYnVmZmVyLnB1c2goc3RyZWFtLl93cml0YWJsZVN0YXRlLnNoaWZ0KCkpXG4gICAgfVxuXG4gICAgaWYgKChzdHJlYW0uX2R1cGxleFN0YXRlICYgT1BFTl9TVEFUVVMpICE9PSAwKSByZXR1cm4gY2IobnVsbClcbiAgICBzdHJlYW0uX3dyaXRldihidWZmZXIsIGNiKVxuICB9XG5cbiAgdXBkYXRlICgpIHtcbiAgICBjb25zdCBzdHJlYW0gPSB0aGlzLnN0cmVhbVxuXG4gICAgc3RyZWFtLl9kdXBsZXhTdGF0ZSB8PSBXUklURV9VUERBVElOR1xuXG4gICAgZG8ge1xuICAgICAgd2hpbGUgKChzdHJlYW0uX2R1cGxleFN0YXRlICYgV1JJVEVfU1RBVFVTKSA9PT0gV1JJVEVfUVVFVUVEKSB7XG4gICAgICAgIGNvbnN0IGRhdGEgPSB0aGlzLnNoaWZ0KClcbiAgICAgICAgc3RyZWFtLl9kdXBsZXhTdGF0ZSB8PSBXUklURV9BQ1RJVkVfQU5EX1dSSVRJTkdcbiAgICAgICAgc3RyZWFtLl93cml0ZShkYXRhLCB0aGlzLmFmdGVyV3JpdGUpXG4gICAgICB9XG5cbiAgICAgIGlmICgoc3RyZWFtLl9kdXBsZXhTdGF0ZSAmIFdSSVRFX1BSSU1BUllfQU5EX0FDVElWRSkgPT09IDApIHRoaXMudXBkYXRlTm9uUHJpbWFyeSgpXG4gICAgfSB3aGlsZSAodGhpcy5jb250aW51ZVVwZGF0ZSgpID09PSB0cnVlKVxuXG4gICAgc3RyZWFtLl9kdXBsZXhTdGF0ZSAmPSBXUklURV9OT1RfVVBEQVRJTkdcbiAgfVxuXG4gIHVwZGF0ZU5vblByaW1hcnkgKCkge1xuICAgIGNvbnN0IHN0cmVhbSA9IHRoaXMuc3RyZWFtXG5cbiAgICBpZiAoKHN0cmVhbS5fZHVwbGV4U3RhdGUgJiBXUklURV9GSU5JU0hJTkdfU1RBVFVTKSA9PT0gV1JJVEVfRklOSVNISU5HKSB7XG4gICAgICBzdHJlYW0uX2R1cGxleFN0YXRlID0gKHN0cmVhbS5fZHVwbGV4U3RhdGUgfCBXUklURV9BQ1RJVkUpICYgV1JJVEVfTk9UX0ZJTklTSElOR1xuICAgICAgc3RyZWFtLl9maW5hbChhZnRlckZpbmFsLmJpbmQodGhpcykpXG4gICAgICByZXR1cm5cbiAgICB9XG5cbiAgICBpZiAoKHN0cmVhbS5fZHVwbGV4U3RhdGUgJiBERVNUUk9ZX1NUQVRVUykgPT09IERFU1RST1lJTkcpIHtcbiAgICAgIGlmICgoc3RyZWFtLl9kdXBsZXhTdGF0ZSAmIEFDVElWRV9PUl9USUNLSU5HKSA9PT0gMCkge1xuICAgICAgICBzdHJlYW0uX2R1cGxleFN0YXRlIHw9IEFDVElWRVxuICAgICAgICBzdHJlYW0uX2Rlc3Ryb3koYWZ0ZXJEZXN0cm95LmJpbmQodGhpcykpXG4gICAgICB9XG4gICAgICByZXR1cm5cbiAgICB9XG5cbiAgICBpZiAoKHN0cmVhbS5fZHVwbGV4U3RhdGUgJiBJU19PUEVOSU5HKSA9PT0gT1BFTklORykge1xuICAgICAgc3RyZWFtLl9kdXBsZXhTdGF0ZSA9IChzdHJlYW0uX2R1cGxleFN0YXRlIHwgQUNUSVZFKSAmIE5PVF9PUEVOSU5HXG4gICAgICBzdHJlYW0uX29wZW4oYWZ0ZXJPcGVuLmJpbmQodGhpcykpXG4gICAgfVxuICB9XG5cbiAgY29udGludWVVcGRhdGUgKCkge1xuICAgIGlmICgodGhpcy5zdHJlYW0uX2R1cGxleFN0YXRlICYgV1JJVEVfTkVYVF9USUNLKSA9PT0gMCkgcmV0dXJuIGZhbHNlXG4gICAgdGhpcy5zdHJlYW0uX2R1cGxleFN0YXRlICY9IFdSSVRFX05PVF9ORVhUX1RJQ0tcbiAgICByZXR1cm4gdHJ1ZVxuICB9XG5cbiAgdXBkYXRlQ2FsbGJhY2sgKCkge1xuICAgIGlmICgodGhpcy5zdHJlYW0uX2R1cGxleFN0YXRlICYgV1JJVEVfVVBEQVRFX1NZTkNfU1RBVFVTKSA9PT0gV1JJVEVfUFJJTUFSWSkgdGhpcy51cGRhdGUoKVxuICAgIGVsc2UgdGhpcy51cGRhdGVOZXh0VGljaygpXG4gIH1cblxuICB1cGRhdGVOZXh0VGljayAoKSB7XG4gICAgaWYgKCh0aGlzLnN0cmVhbS5fZHVwbGV4U3RhdGUgJiBXUklURV9ORVhUX1RJQ0spICE9PSAwKSByZXR1cm5cbiAgICB0aGlzLnN0cmVhbS5fZHVwbGV4U3RhdGUgfD0gV1JJVEVfTkVYVF9USUNLXG4gICAgaWYgKCh0aGlzLnN0cmVhbS5fZHVwbGV4U3RhdGUgJiBXUklURV9VUERBVElORykgPT09IDApIHF1ZXVlVGljayh0aGlzLmFmdGVyVXBkYXRlTmV4dFRpY2spXG4gIH1cbn1cblxuY2xhc3MgUmVhZGFibGVTdGF0ZSB7XG4gIGNvbnN0cnVjdG9yIChzdHJlYW0sIHsgaGlnaFdhdGVyTWFyayA9IDE2Mzg0LCBtYXAgPSBudWxsLCBtYXBSZWFkYWJsZSwgYnl0ZUxlbmd0aCwgYnl0ZUxlbmd0aFJlYWRhYmxlIH0gPSB7fSkge1xuICAgIHRoaXMuc3RyZWFtID0gc3RyZWFtXG4gICAgdGhpcy5xdWV1ZSA9IG5ldyBGSUZPKClcbiAgICB0aGlzLmhpZ2hXYXRlck1hcmsgPSBoaWdoV2F0ZXJNYXJrID09PSAwID8gMSA6IGhpZ2hXYXRlck1hcmtcbiAgICB0aGlzLmJ1ZmZlcmVkID0gMFxuICAgIHRoaXMucmVhZEFoZWFkID0gaGlnaFdhdGVyTWFyayA+IDBcbiAgICB0aGlzLmVycm9yID0gbnVsbFxuICAgIHRoaXMucGlwZWxpbmUgPSBudWxsXG4gICAgdGhpcy5ieXRlTGVuZ3RoID0gYnl0ZUxlbmd0aFJlYWRhYmxlIHx8IGJ5dGVMZW5ndGggfHwgZGVmYXVsdEJ5dGVMZW5ndGhcbiAgICB0aGlzLm1hcCA9IG1hcFJlYWRhYmxlIHx8IG1hcFxuICAgIHRoaXMucGlwZVRvID0gbnVsbFxuICAgIHRoaXMuYWZ0ZXJSZWFkID0gYWZ0ZXJSZWFkLmJpbmQodGhpcylcbiAgICB0aGlzLmFmdGVyVXBkYXRlTmV4dFRpY2sgPSB1cGRhdGVSZWFkTlQuYmluZCh0aGlzKVxuICB9XG5cbiAgZ2V0IGVuZGVkICgpIHtcbiAgICByZXR1cm4gKHRoaXMuc3RyZWFtLl9kdXBsZXhTdGF0ZSAmIFJFQURfRE9ORSkgIT09IDBcbiAgfVxuXG4gIHBpcGUgKHBpcGVUbywgY2IpIHtcbiAgICBpZiAodGhpcy5waXBlVG8gIT09IG51bGwpIHRocm93IG5ldyBFcnJvcignQ2FuIG9ubHkgcGlwZSB0byBvbmUgZGVzdGluYXRpb24nKVxuICAgIGlmICh0eXBlb2YgY2IgIT09ICdmdW5jdGlvbicpIGNiID0gbnVsbFxuXG4gICAgdGhpcy5zdHJlYW0uX2R1cGxleFN0YXRlIHw9IFJFQURfUElQRV9EUkFJTkVEXG4gICAgdGhpcy5waXBlVG8gPSBwaXBlVG9cbiAgICB0aGlzLnBpcGVsaW5lID0gbmV3IFBpcGVsaW5lKHRoaXMuc3RyZWFtLCBwaXBlVG8sIGNiKVxuXG4gICAgaWYgKGNiKSB0aGlzLnN0cmVhbS5vbignZXJyb3InLCBub29wKSAvLyBXZSBhbHJlYWR5IGVycm9yIGhhbmRsZSB0aGlzIHNvIHN1cHJlc3MgY3Jhc2hlc1xuXG4gICAgaWYgKGlzU3RyZWFteChwaXBlVG8pKSB7XG4gICAgICBwaXBlVG8uX3dyaXRhYmxlU3RhdGUucGlwZWxpbmUgPSB0aGlzLnBpcGVsaW5lXG4gICAgICBpZiAoY2IpIHBpcGVUby5vbignZXJyb3InLCBub29wKSAvLyBXZSBhbHJlYWR5IGVycm9yIGhhbmRsZSB0aGlzIHNvIHN1cHJlc3MgY3Jhc2hlc1xuICAgICAgcGlwZVRvLm9uKCdmaW5pc2gnLCB0aGlzLnBpcGVsaW5lLmZpbmlzaGVkLmJpbmQodGhpcy5waXBlbGluZSkpIC8vIFRPRE86IGp1c3QgY2FsbCBmaW5pc2hlZCBmcm9tIHBpcGVUbyBpdHNlbGZcbiAgICB9IGVsc2Uge1xuICAgICAgY29uc3Qgb25lcnJvciA9IHRoaXMucGlwZWxpbmUuZG9uZS5iaW5kKHRoaXMucGlwZWxpbmUsIHBpcGVUbylcbiAgICAgIGNvbnN0IG9uY2xvc2UgPSB0aGlzLnBpcGVsaW5lLmRvbmUuYmluZCh0aGlzLnBpcGVsaW5lLCBwaXBlVG8sIG51bGwpIC8vIG9uY2xvc2UgaGFzIGEgd2VpcmQgYm9vbCBhcmdcbiAgICAgIHBpcGVUby5vbignZXJyb3InLCBvbmVycm9yKVxuICAgICAgcGlwZVRvLm9uKCdjbG9zZScsIG9uY2xvc2UpXG4gICAgICBwaXBlVG8ub24oJ2ZpbmlzaCcsIHRoaXMucGlwZWxpbmUuZmluaXNoZWQuYmluZCh0aGlzLnBpcGVsaW5lKSlcbiAgICB9XG5cbiAgICBwaXBlVG8ub24oJ2RyYWluJywgYWZ0ZXJEcmFpbi5iaW5kKHRoaXMpKVxuICAgIHRoaXMuc3RyZWFtLmVtaXQoJ3BpcGluZycsIHBpcGVUbylcbiAgICBwaXBlVG8uZW1pdCgncGlwZScsIHRoaXMuc3RyZWFtKVxuICB9XG5cbiAgcHVzaCAoZGF0YSkge1xuICAgIGNvbnN0IHN0cmVhbSA9IHRoaXMuc3RyZWFtXG5cbiAgICBpZiAoZGF0YSA9PT0gbnVsbCkge1xuICAgICAgdGhpcy5oaWdoV2F0ZXJNYXJrID0gMFxuICAgICAgc3RyZWFtLl9kdXBsZXhTdGF0ZSA9IChzdHJlYW0uX2R1cGxleFN0YXRlIHwgUkVBRF9FTkRJTkcpICYgUkVBRF9OT05fUFJJTUFSWV9BTkRfUFVTSEVEXG4gICAgICByZXR1cm4gZmFsc2VcbiAgICB9XG5cbiAgICBpZiAodGhpcy5tYXAgIT09IG51bGwpIHtcbiAgICAgIGRhdGEgPSB0aGlzLm1hcChkYXRhKVxuICAgICAgaWYgKGRhdGEgPT09IG51bGwpIHtcbiAgICAgICAgc3RyZWFtLl9kdXBsZXhTdGF0ZSAmPSBSRUFEX1BVU0hFRFxuICAgICAgICByZXR1cm4gdGhpcy5idWZmZXJlZCA8IHRoaXMuaGlnaFdhdGVyTWFya1xuICAgICAgfVxuICAgIH1cblxuICAgIHRoaXMuYnVmZmVyZWQgKz0gdGhpcy5ieXRlTGVuZ3RoKGRhdGEpXG4gICAgdGhpcy5xdWV1ZS5wdXNoKGRhdGEpXG5cbiAgICBzdHJlYW0uX2R1cGxleFN0YXRlID0gKHN0cmVhbS5fZHVwbGV4U3RhdGUgfCBSRUFEX1FVRVVFRCkgJiBSRUFEX1BVU0hFRFxuXG4gICAgcmV0dXJuIHRoaXMuYnVmZmVyZWQgPCB0aGlzLmhpZ2hXYXRlck1hcmtcbiAgfVxuXG4gIHNoaWZ0ICgpIHtcbiAgICBjb25zdCBkYXRhID0gdGhpcy5xdWV1ZS5zaGlmdCgpXG5cbiAgICB0aGlzLmJ1ZmZlcmVkIC09IHRoaXMuYnl0ZUxlbmd0aChkYXRhKVxuICAgIGlmICh0aGlzLmJ1ZmZlcmVkID09PSAwKSB0aGlzLnN0cmVhbS5fZHVwbGV4U3RhdGUgJj0gUkVBRF9OT1RfUVVFVUVEXG4gICAgcmV0dXJuIGRhdGFcbiAgfVxuXG4gIHVuc2hpZnQgKGRhdGEpIHtcbiAgICBjb25zdCBwZW5kaW5nID0gW3RoaXMubWFwICE9PSBudWxsID8gdGhpcy5tYXAoZGF0YSkgOiBkYXRhXVxuICAgIHdoaWxlICh0aGlzLmJ1ZmZlcmVkID4gMCkgcGVuZGluZy5wdXNoKHRoaXMuc2hpZnQoKSlcblxuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgcGVuZGluZy5sZW5ndGggLSAxOyBpKyspIHtcbiAgICAgIGNvbnN0IGRhdGEgPSBwZW5kaW5nW2ldXG4gICAgICB0aGlzLmJ1ZmZlcmVkICs9IHRoaXMuYnl0ZUxlbmd0aChkYXRhKVxuICAgICAgdGhpcy5xdWV1ZS5wdXNoKGRhdGEpXG4gICAgfVxuXG4gICAgdGhpcy5wdXNoKHBlbmRpbmdbcGVuZGluZy5sZW5ndGggLSAxXSlcbiAgfVxuXG4gIHJlYWQgKCkge1xuICAgIGNvbnN0IHN0cmVhbSA9IHRoaXMuc3RyZWFtXG5cbiAgICBpZiAoKHN0cmVhbS5fZHVwbGV4U3RhdGUgJiBSRUFEX1NUQVRVUykgPT09IFJFQURfUVVFVUVEKSB7XG4gICAgICBjb25zdCBkYXRhID0gdGhpcy5zaGlmdCgpXG4gICAgICBpZiAodGhpcy5waXBlVG8gIT09IG51bGwgJiYgdGhpcy5waXBlVG8ud3JpdGUoZGF0YSkgPT09IGZhbHNlKSBzdHJlYW0uX2R1cGxleFN0YXRlICY9IFJFQURfUElQRV9OT1RfRFJBSU5FRFxuICAgICAgaWYgKChzdHJlYW0uX2R1cGxleFN0YXRlICYgUkVBRF9FTUlUX0RBVEEpICE9PSAwKSBzdHJlYW0uZW1pdCgnZGF0YScsIGRhdGEpXG4gICAgICByZXR1cm4gZGF0YVxuICAgIH1cblxuICAgIGlmICh0aGlzLnJlYWRBaGVhZCA9PT0gZmFsc2UpIHtcbiAgICAgIHN0cmVhbS5fZHVwbGV4U3RhdGUgfD0gUkVBRF9SRUFEX0FIRUFEXG4gICAgICB0aGlzLnVwZGF0ZU5leHRUaWNrKClcbiAgICB9XG5cbiAgICByZXR1cm4gbnVsbFxuICB9XG5cbiAgZHJhaW4gKCkge1xuICAgIGNvbnN0IHN0cmVhbSA9IHRoaXMuc3RyZWFtXG5cbiAgICB3aGlsZSAoKHN0cmVhbS5fZHVwbGV4U3RhdGUgJiBSRUFEX1NUQVRVUykgPT09IFJFQURfUVVFVUVEICYmIChzdHJlYW0uX2R1cGxleFN0YXRlICYgUkVBRF9GTE9XSU5HKSAhPT0gMCkge1xuICAgICAgY29uc3QgZGF0YSA9IHRoaXMuc2hpZnQoKVxuICAgICAgaWYgKHRoaXMucGlwZVRvICE9PSBudWxsICYmIHRoaXMucGlwZVRvLndyaXRlKGRhdGEpID09PSBmYWxzZSkgc3RyZWFtLl9kdXBsZXhTdGF0ZSAmPSBSRUFEX1BJUEVfTk9UX0RSQUlORURcbiAgICAgIGlmICgoc3RyZWFtLl9kdXBsZXhTdGF0ZSAmIFJFQURfRU1JVF9EQVRBKSAhPT0gMCkgc3RyZWFtLmVtaXQoJ2RhdGEnLCBkYXRhKVxuICAgIH1cbiAgfVxuXG4gIHVwZGF0ZSAoKSB7XG4gICAgY29uc3Qgc3RyZWFtID0gdGhpcy5zdHJlYW1cblxuICAgIHN0cmVhbS5fZHVwbGV4U3RhdGUgfD0gUkVBRF9VUERBVElOR1xuXG4gICAgZG8ge1xuICAgICAgdGhpcy5kcmFpbigpXG5cbiAgICAgIHdoaWxlICh0aGlzLmJ1ZmZlcmVkIDwgdGhpcy5oaWdoV2F0ZXJNYXJrICYmIChzdHJlYW0uX2R1cGxleFN0YXRlICYgU0hPVUxEX05PVF9SRUFEKSA9PT0gUkVBRF9SRUFEX0FIRUFEKSB7XG4gICAgICAgIHN0cmVhbS5fZHVwbGV4U3RhdGUgfD0gUkVBRF9BQ1RJVkVfQU5EX05FRURTX1BVU0hcbiAgICAgICAgc3RyZWFtLl9yZWFkKHRoaXMuYWZ0ZXJSZWFkKVxuICAgICAgICB0aGlzLmRyYWluKClcbiAgICAgIH1cblxuICAgICAgaWYgKChzdHJlYW0uX2R1cGxleFN0YXRlICYgUkVBRF9SRUFEQUJMRV9TVEFUVVMpID09PSBSRUFEX0VNSVRfUkVBREFCTEVfQU5EX1FVRVVFRCkge1xuICAgICAgICBzdHJlYW0uX2R1cGxleFN0YXRlIHw9IFJFQURfRU1JVFRFRF9SRUFEQUJMRVxuICAgICAgICBzdHJlYW0uZW1pdCgncmVhZGFibGUnKVxuICAgICAgfVxuXG4gICAgICBpZiAoKHN0cmVhbS5fZHVwbGV4U3RhdGUgJiBSRUFEX1BSSU1BUllfQU5EX0FDVElWRSkgPT09IDApIHRoaXMudXBkYXRlTm9uUHJpbWFyeSgpXG4gICAgfSB3aGlsZSAodGhpcy5jb250aW51ZVVwZGF0ZSgpID09PSB0cnVlKVxuXG4gICAgc3RyZWFtLl9kdXBsZXhTdGF0ZSAmPSBSRUFEX05PVF9VUERBVElOR1xuICB9XG5cbiAgdXBkYXRlTm9uUHJpbWFyeSAoKSB7XG4gICAgY29uc3Qgc3RyZWFtID0gdGhpcy5zdHJlYW1cblxuICAgIGlmICgoc3RyZWFtLl9kdXBsZXhTdGF0ZSAmIFJFQURfRU5ESU5HX1NUQVRVUykgPT09IFJFQURfRU5ESU5HKSB7XG4gICAgICBzdHJlYW0uX2R1cGxleFN0YXRlID0gKHN0cmVhbS5fZHVwbGV4U3RhdGUgfCBSRUFEX0RPTkUpICYgUkVBRF9OT1RfRU5ESU5HXG4gICAgICBzdHJlYW0uZW1pdCgnZW5kJylcbiAgICAgIGlmICgoc3RyZWFtLl9kdXBsZXhTdGF0ZSAmIEFVVE9fREVTVFJPWSkgPT09IERPTkUpIHN0cmVhbS5fZHVwbGV4U3RhdGUgfD0gREVTVFJPWUlOR1xuICAgICAgaWYgKHRoaXMucGlwZVRvICE9PSBudWxsKSB0aGlzLnBpcGVUby5lbmQoKVxuICAgIH1cblxuICAgIGlmICgoc3RyZWFtLl9kdXBsZXhTdGF0ZSAmIERFU1RST1lfU1RBVFVTKSA9PT0gREVTVFJPWUlORykge1xuICAgICAgaWYgKChzdHJlYW0uX2R1cGxleFN0YXRlICYgQUNUSVZFX09SX1RJQ0tJTkcpID09PSAwKSB7XG4gICAgICAgIHN0cmVhbS5fZHVwbGV4U3RhdGUgfD0gQUNUSVZFXG4gICAgICAgIHN0cmVhbS5fZGVzdHJveShhZnRlckRlc3Ryb3kuYmluZCh0aGlzKSlcbiAgICAgIH1cbiAgICAgIHJldHVyblxuICAgIH1cblxuICAgIGlmICgoc3RyZWFtLl9kdXBsZXhTdGF0ZSAmIElTX09QRU5JTkcpID09PSBPUEVOSU5HKSB7XG4gICAgICBzdHJlYW0uX2R1cGxleFN0YXRlID0gKHN0cmVhbS5fZHVwbGV4U3RhdGUgfCBBQ1RJVkUpICYgTk9UX09QRU5JTkdcbiAgICAgIHN0cmVhbS5fb3BlbihhZnRlck9wZW4uYmluZCh0aGlzKSlcbiAgICB9XG4gIH1cblxuICBjb250aW51ZVVwZGF0ZSAoKSB7XG4gICAgaWYgKCh0aGlzLnN0cmVhbS5fZHVwbGV4U3RhdGUgJiBSRUFEX05FWFRfVElDSykgPT09IDApIHJldHVybiBmYWxzZVxuICAgIHRoaXMuc3RyZWFtLl9kdXBsZXhTdGF0ZSAmPSBSRUFEX05PVF9ORVhUX1RJQ0tcbiAgICByZXR1cm4gdHJ1ZVxuICB9XG5cbiAgdXBkYXRlQ2FsbGJhY2sgKCkge1xuICAgIGlmICgodGhpcy5zdHJlYW0uX2R1cGxleFN0YXRlICYgUkVBRF9VUERBVEVfU1lOQ19TVEFUVVMpID09PSBSRUFEX1BSSU1BUlkpIHRoaXMudXBkYXRlKClcbiAgICBlbHNlIHRoaXMudXBkYXRlTmV4dFRpY2soKVxuICB9XG5cbiAgdXBkYXRlTmV4dFRpY2sgKCkge1xuICAgIGlmICgodGhpcy5zdHJlYW0uX2R1cGxleFN0YXRlICYgUkVBRF9ORVhUX1RJQ0spICE9PSAwKSByZXR1cm5cbiAgICB0aGlzLnN0cmVhbS5fZHVwbGV4U3RhdGUgfD0gUkVBRF9ORVhUX1RJQ0tcbiAgICBpZiAoKHRoaXMuc3RyZWFtLl9kdXBsZXhTdGF0ZSAmIFJFQURfVVBEQVRJTkcpID09PSAwKSBxdWV1ZVRpY2sodGhpcy5hZnRlclVwZGF0ZU5leHRUaWNrKVxuICB9XG59XG5cbmNsYXNzIFRyYW5zZm9ybVN0YXRlIHtcbiAgY29uc3RydWN0b3IgKHN0cmVhbSkge1xuICAgIHRoaXMuZGF0YSA9IG51bGxcbiAgICB0aGlzLmFmdGVyVHJhbnNmb3JtID0gYWZ0ZXJUcmFuc2Zvcm0uYmluZChzdHJlYW0pXG4gICAgdGhpcy5hZnRlckZpbmFsID0gbnVsbFxuICB9XG59XG5cbmNsYXNzIFBpcGVsaW5lIHtcbiAgY29uc3RydWN0b3IgKHNyYywgZHN0LCBjYikge1xuICAgIHRoaXMuZnJvbSA9IHNyY1xuICAgIHRoaXMudG8gPSBkc3RcbiAgICB0aGlzLmFmdGVyUGlwZSA9IGNiXG4gICAgdGhpcy5lcnJvciA9IG51bGxcbiAgICB0aGlzLnBpcGVUb0ZpbmlzaGVkID0gZmFsc2VcbiAgfVxuXG4gIGZpbmlzaGVkICgpIHtcbiAgICB0aGlzLnBpcGVUb0ZpbmlzaGVkID0gdHJ1ZVxuICB9XG5cbiAgZG9uZSAoc3RyZWFtLCBlcnIpIHtcbiAgICBpZiAoZXJyKSB0aGlzLmVycm9yID0gZXJyXG5cbiAgICBpZiAoc3RyZWFtID09PSB0aGlzLnRvKSB7XG4gICAgICB0aGlzLnRvID0gbnVsbFxuXG4gICAgICBpZiAodGhpcy5mcm9tICE9PSBudWxsKSB7XG4gICAgICAgIGlmICgodGhpcy5mcm9tLl9kdXBsZXhTdGF0ZSAmIFJFQURfRE9ORSkgPT09IDAgfHwgIXRoaXMucGlwZVRvRmluaXNoZWQpIHtcbiAgICAgICAgICB0aGlzLmZyb20uZGVzdHJveSh0aGlzLmVycm9yIHx8IG5ldyBFcnJvcignV3JpdGFibGUgc3RyZWFtIGNsb3NlZCBwcmVtYXR1cmVseScpKVxuICAgICAgICB9XG4gICAgICAgIHJldHVyblxuICAgICAgfVxuICAgIH1cblxuICAgIGlmIChzdHJlYW0gPT09IHRoaXMuZnJvbSkge1xuICAgICAgdGhpcy5mcm9tID0gbnVsbFxuXG4gICAgICBpZiAodGhpcy50byAhPT0gbnVsbCkge1xuICAgICAgICBpZiAoKHN0cmVhbS5fZHVwbGV4U3RhdGUgJiBSRUFEX0RPTkUpID09PSAwKSB7XG4gICAgICAgICAgdGhpcy50by5kZXN0cm95KHRoaXMuZXJyb3IgfHwgbmV3IEVycm9yKCdSZWFkYWJsZSBzdHJlYW0gY2xvc2VkIGJlZm9yZSBlbmRpbmcnKSlcbiAgICAgICAgfVxuICAgICAgICByZXR1cm5cbiAgICAgIH1cbiAgICB9XG5cbiAgICBpZiAodGhpcy5hZnRlclBpcGUgIT09IG51bGwpIHRoaXMuYWZ0ZXJQaXBlKHRoaXMuZXJyb3IpXG4gICAgdGhpcy50byA9IHRoaXMuZnJvbSA9IHRoaXMuYWZ0ZXJQaXBlID0gbnVsbFxuICB9XG59XG5cbmZ1bmN0aW9uIGFmdGVyRHJhaW4gKCkge1xuICB0aGlzLnN0cmVhbS5fZHVwbGV4U3RhdGUgfD0gUkVBRF9QSVBFX0RSQUlORURcbiAgdGhpcy51cGRhdGVDYWxsYmFjaygpXG59XG5cbmZ1bmN0aW9uIGFmdGVyRmluYWwgKGVycikge1xuICBjb25zdCBzdHJlYW0gPSB0aGlzLnN0cmVhbVxuICBpZiAoZXJyKSBzdHJlYW0uZGVzdHJveShlcnIpXG4gIGlmICgoc3RyZWFtLl9kdXBsZXhTdGF0ZSAmIERFU1RST1lfU1RBVFVTKSA9PT0gMCkge1xuICAgIHN0cmVhbS5fZHVwbGV4U3RhdGUgfD0gV1JJVEVfRE9ORVxuICAgIHN0cmVhbS5lbWl0KCdmaW5pc2gnKVxuICB9XG4gIGlmICgoc3RyZWFtLl9kdXBsZXhTdGF0ZSAmIEFVVE9fREVTVFJPWSkgPT09IERPTkUpIHtcbiAgICBzdHJlYW0uX2R1cGxleFN0YXRlIHw9IERFU1RST1lJTkdcbiAgfVxuXG4gIHN0cmVhbS5fZHVwbGV4U3RhdGUgJj0gV1JJVEVfTk9UX0FDVElWRVxuXG4gIC8vIG5vIG5lZWQgdG8gd2FpdCB0aGUgZXh0cmEgdGljayBoZXJlLCBzbyB3ZSBzaG9ydCBjaXJjdWl0IHRoYXRcbiAgaWYgKChzdHJlYW0uX2R1cGxleFN0YXRlICYgV1JJVEVfVVBEQVRJTkcpID09PSAwKSB0aGlzLnVwZGF0ZSgpXG4gIGVsc2UgdGhpcy51cGRhdGVOZXh0VGljaygpXG59XG5cbmZ1bmN0aW9uIGFmdGVyRGVzdHJveSAoZXJyKSB7XG4gIGNvbnN0IHN0cmVhbSA9IHRoaXMuc3RyZWFtXG5cbiAgaWYgKCFlcnIgJiYgdGhpcy5lcnJvciAhPT0gU1RSRUFNX0RFU1RST1lFRCkgZXJyID0gdGhpcy5lcnJvclxuICBpZiAoZXJyKSBzdHJlYW0uZW1pdCgnZXJyb3InLCBlcnIpXG4gIHN0cmVhbS5fZHVwbGV4U3RhdGUgfD0gREVTVFJPWUVEXG4gIHN0cmVhbS5lbWl0KCdjbG9zZScpXG5cbiAgY29uc3QgcnMgPSBzdHJlYW0uX3JlYWRhYmxlU3RhdGVcbiAgY29uc3Qgd3MgPSBzdHJlYW0uX3dyaXRhYmxlU3RhdGVcblxuICBpZiAocnMgIT09IG51bGwgJiYgcnMucGlwZWxpbmUgIT09IG51bGwpIHJzLnBpcGVsaW5lLmRvbmUoc3RyZWFtLCBlcnIpXG5cbiAgaWYgKHdzICE9PSBudWxsKSB7XG4gICAgd2hpbGUgKHdzLmRyYWlucyAhPT0gbnVsbCAmJiB3cy5kcmFpbnMubGVuZ3RoID4gMCkgd3MuZHJhaW5zLnNoaWZ0KCkucmVzb2x2ZShmYWxzZSlcbiAgICBpZiAod3MucGlwZWxpbmUgIT09IG51bGwpIHdzLnBpcGVsaW5lLmRvbmUoc3RyZWFtLCBlcnIpXG4gIH1cbn1cblxuZnVuY3Rpb24gYWZ0ZXJXcml0ZSAoZXJyKSB7XG4gIGNvbnN0IHN0cmVhbSA9IHRoaXMuc3RyZWFtXG5cbiAgaWYgKGVycikgc3RyZWFtLmRlc3Ryb3koZXJyKVxuICBzdHJlYW0uX2R1cGxleFN0YXRlICY9IFdSSVRFX05PVF9BQ1RJVkVcblxuICBpZiAodGhpcy5kcmFpbnMgIT09IG51bGwpIHRpY2tEcmFpbnModGhpcy5kcmFpbnMpXG5cbiAgaWYgKChzdHJlYW0uX2R1cGxleFN0YXRlICYgV1JJVEVfRFJBSU5fU1RBVFVTKSA9PT0gV1JJVEVfVU5EUkFJTkVEKSB7XG4gICAgc3RyZWFtLl9kdXBsZXhTdGF0ZSAmPSBXUklURV9EUkFJTkVEXG4gICAgaWYgKChzdHJlYW0uX2R1cGxleFN0YXRlICYgV1JJVEVfRU1JVF9EUkFJTikgPT09IFdSSVRFX0VNSVRfRFJBSU4pIHtcbiAgICAgIHN0cmVhbS5lbWl0KCdkcmFpbicpXG4gICAgfVxuICB9XG5cbiAgdGhpcy51cGRhdGVDYWxsYmFjaygpXG59XG5cbmZ1bmN0aW9uIGFmdGVyUmVhZCAoZXJyKSB7XG4gIGlmIChlcnIpIHRoaXMuc3RyZWFtLmRlc3Ryb3koZXJyKVxuICB0aGlzLnN0cmVhbS5fZHVwbGV4U3RhdGUgJj0gUkVBRF9OT1RfQUNUSVZFXG4gIGlmICh0aGlzLnJlYWRBaGVhZCA9PT0gZmFsc2UgJiYgKHRoaXMuc3RyZWFtLl9kdXBsZXhTdGF0ZSAmIFJFQURfUkVTVU1FRCkgPT09IDApIHRoaXMuc3RyZWFtLl9kdXBsZXhTdGF0ZSAmPSBSRUFEX05PX1JFQURfQUhFQURcbiAgdGhpcy51cGRhdGVDYWxsYmFjaygpXG59XG5cbmZ1bmN0aW9uIHVwZGF0ZVJlYWROVCAoKSB7XG4gIGlmICgodGhpcy5zdHJlYW0uX2R1cGxleFN0YXRlICYgUkVBRF9VUERBVElORykgPT09IDApIHtcbiAgICB0aGlzLnN0cmVhbS5fZHVwbGV4U3RhdGUgJj0gUkVBRF9OT1RfTkVYVF9USUNLXG4gICAgdGhpcy51cGRhdGUoKVxuICB9XG59XG5cbmZ1bmN0aW9uIHVwZGF0ZVdyaXRlTlQgKCkge1xuICBpZiAoKHRoaXMuc3RyZWFtLl9kdXBsZXhTdGF0ZSAmIFdSSVRFX1VQREFUSU5HKSA9PT0gMCkge1xuICAgIHRoaXMuc3RyZWFtLl9kdXBsZXhTdGF0ZSAmPSBXUklURV9OT1RfTkVYVF9USUNLXG4gICAgdGhpcy51cGRhdGUoKVxuICB9XG59XG5cbmZ1bmN0aW9uIHRpY2tEcmFpbnMgKGRyYWlucykge1xuICBmb3IgKGxldCBpID0gMDsgaSA8IGRyYWlucy5sZW5ndGg7IGkrKykge1xuICAgIC8vIGRyYWlucy53cml0ZXMgYXJlIG1vbm90b25pYywgc28gaWYgb25lIGlzIDAgaXRzIGFsd2F5cyB0aGUgZmlyc3Qgb25lXG4gICAgaWYgKC0tZHJhaW5zW2ldLndyaXRlcyA9PT0gMCkge1xuICAgICAgZHJhaW5zLnNoaWZ0KCkucmVzb2x2ZSh0cnVlKVxuICAgICAgaS0tXG4gICAgfVxuICB9XG59XG5cbmZ1bmN0aW9uIGFmdGVyT3BlbiAoZXJyKSB7XG4gIGNvbnN0IHN0cmVhbSA9IHRoaXMuc3RyZWFtXG5cbiAgaWYgKGVycikgc3RyZWFtLmRlc3Ryb3koZXJyKVxuXG4gIGlmICgoc3RyZWFtLl9kdXBsZXhTdGF0ZSAmIERFU1RST1lJTkcpID09PSAwKSB7XG4gICAgaWYgKChzdHJlYW0uX2R1cGxleFN0YXRlICYgUkVBRF9QUklNQVJZX1NUQVRVUykgPT09IDApIHN0cmVhbS5fZHVwbGV4U3RhdGUgfD0gUkVBRF9QUklNQVJZXG4gICAgaWYgKChzdHJlYW0uX2R1cGxleFN0YXRlICYgV1JJVEVfUFJJTUFSWV9TVEFUVVMpID09PSAwKSBzdHJlYW0uX2R1cGxleFN0YXRlIHw9IFdSSVRFX1BSSU1BUllcbiAgICBzdHJlYW0uZW1pdCgnb3BlbicpXG4gIH1cblxuICBzdHJlYW0uX2R1cGxleFN0YXRlICY9IE5PVF9BQ1RJVkVcblxuICBpZiAoc3RyZWFtLl93cml0YWJsZVN0YXRlICE9PSBudWxsKSB7XG4gICAgc3RyZWFtLl93cml0YWJsZVN0YXRlLnVwZGF0ZUNhbGxiYWNrKClcbiAgfVxuXG4gIGlmIChzdHJlYW0uX3JlYWRhYmxlU3RhdGUgIT09IG51bGwpIHtcbiAgICBzdHJlYW0uX3JlYWRhYmxlU3RhdGUudXBkYXRlQ2FsbGJhY2soKVxuICB9XG59XG5cbmZ1bmN0aW9uIGFmdGVyVHJhbnNmb3JtIChlcnIsIGRhdGEpIHtcbiAgaWYgKGRhdGEgIT09IHVuZGVmaW5lZCAmJiBkYXRhICE9PSBudWxsKSB0aGlzLnB1c2goZGF0YSlcbiAgdGhpcy5fd3JpdGFibGVTdGF0ZS5hZnRlcldyaXRlKGVycilcbn1cblxuZnVuY3Rpb24gbmV3TGlzdGVuZXIgKG5hbWUpIHtcbiAgaWYgKHRoaXMuX3JlYWRhYmxlU3RhdGUgIT09IG51bGwpIHtcbiAgICBpZiAobmFtZSA9PT0gJ2RhdGEnKSB7XG4gICAgICB0aGlzLl9kdXBsZXhTdGF0ZSB8PSAoUkVBRF9FTUlUX0RBVEEgfCBSRUFEX1JFU1VNRURfUkVBRF9BSEVBRClcbiAgICAgIHRoaXMuX3JlYWRhYmxlU3RhdGUudXBkYXRlTmV4dFRpY2soKVxuICAgIH1cbiAgICBpZiAobmFtZSA9PT0gJ3JlYWRhYmxlJykge1xuICAgICAgdGhpcy5fZHVwbGV4U3RhdGUgfD0gUkVBRF9FTUlUX1JFQURBQkxFXG4gICAgICB0aGlzLl9yZWFkYWJsZVN0YXRlLnVwZGF0ZU5leHRUaWNrKClcbiAgICB9XG4gIH1cblxuICBpZiAodGhpcy5fd3JpdGFibGVTdGF0ZSAhPT0gbnVsbCkge1xuICAgIGlmIChuYW1lID09PSAnZHJhaW4nKSB7XG4gICAgICB0aGlzLl9kdXBsZXhTdGF0ZSB8PSBXUklURV9FTUlUX0RSQUlOXG4gICAgICB0aGlzLl93cml0YWJsZVN0YXRlLnVwZGF0ZU5leHRUaWNrKClcbiAgICB9XG4gIH1cbn1cblxuY2xhc3MgU3RyZWFtIGV4dGVuZHMgRXZlbnRFbWl0dGVyIHtcbiAgY29uc3RydWN0b3IgKG9wdHMpIHtcbiAgICBzdXBlcigpXG5cbiAgICB0aGlzLl9kdXBsZXhTdGF0ZSA9IDBcbiAgICB0aGlzLl9yZWFkYWJsZVN0YXRlID0gbnVsbFxuICAgIHRoaXMuX3dyaXRhYmxlU3RhdGUgPSBudWxsXG5cbiAgICBpZiAob3B0cykge1xuICAgICAgaWYgKG9wdHMub3BlbikgdGhpcy5fb3BlbiA9IG9wdHMub3BlblxuICAgICAgaWYgKG9wdHMuZGVzdHJveSkgdGhpcy5fZGVzdHJveSA9IG9wdHMuZGVzdHJveVxuICAgICAgaWYgKG9wdHMucHJlZGVzdHJveSkgdGhpcy5fcHJlZGVzdHJveSA9IG9wdHMucHJlZGVzdHJveVxuICAgICAgaWYgKG9wdHMuc2lnbmFsKSB7XG4gICAgICAgIG9wdHMuc2lnbmFsLmFkZEV2ZW50TGlzdGVuZXIoJ2Fib3J0JywgYWJvcnQuYmluZCh0aGlzKSlcbiAgICAgIH1cbiAgICB9XG5cbiAgICB0aGlzLm9uKCduZXdMaXN0ZW5lcicsIG5ld0xpc3RlbmVyKVxuICB9XG5cbiAgX29wZW4gKGNiKSB7XG4gICAgY2IobnVsbClcbiAgfVxuXG4gIF9kZXN0cm95IChjYikge1xuICAgIGNiKG51bGwpXG4gIH1cblxuICBfcHJlZGVzdHJveSAoKSB7XG4gICAgLy8gZG9lcyBub3RoaW5nXG4gIH1cblxuICBnZXQgcmVhZGFibGUgKCkge1xuICAgIHJldHVybiB0aGlzLl9yZWFkYWJsZVN0YXRlICE9PSBudWxsID8gdHJ1ZSA6IHVuZGVmaW5lZFxuICB9XG5cbiAgZ2V0IHdyaXRhYmxlICgpIHtcbiAgICByZXR1cm4gdGhpcy5fd3JpdGFibGVTdGF0ZSAhPT0gbnVsbCA/IHRydWUgOiB1bmRlZmluZWRcbiAgfVxuXG4gIGdldCBkZXN0cm95ZWQgKCkge1xuICAgIHJldHVybiAodGhpcy5fZHVwbGV4U3RhdGUgJiBERVNUUk9ZRUQpICE9PSAwXG4gIH1cblxuICBnZXQgZGVzdHJveWluZyAoKSB7XG4gICAgcmV0dXJuICh0aGlzLl9kdXBsZXhTdGF0ZSAmIERFU1RST1lfU1RBVFVTKSAhPT0gMFxuICB9XG5cbiAgZGVzdHJveSAoZXJyKSB7XG4gICAgaWYgKCh0aGlzLl9kdXBsZXhTdGF0ZSAmIERFU1RST1lfU1RBVFVTKSA9PT0gMCkge1xuICAgICAgaWYgKCFlcnIpIGVyciA9IFNUUkVBTV9ERVNUUk9ZRURcbiAgICAgIHRoaXMuX2R1cGxleFN0YXRlID0gKHRoaXMuX2R1cGxleFN0YXRlIHwgREVTVFJPWUlORykgJiBOT05fUFJJTUFSWVxuXG4gICAgICBpZiAodGhpcy5fcmVhZGFibGVTdGF0ZSAhPT0gbnVsbCkge1xuICAgICAgICB0aGlzLl9yZWFkYWJsZVN0YXRlLmhpZ2hXYXRlck1hcmsgPSAwXG4gICAgICAgIHRoaXMuX3JlYWRhYmxlU3RhdGUuZXJyb3IgPSBlcnJcbiAgICAgIH1cbiAgICAgIGlmICh0aGlzLl93cml0YWJsZVN0YXRlICE9PSBudWxsKSB7XG4gICAgICAgIHRoaXMuX3dyaXRhYmxlU3RhdGUuaGlnaFdhdGVyTWFyayA9IDBcbiAgICAgICAgdGhpcy5fd3JpdGFibGVTdGF0ZS5lcnJvciA9IGVyclxuICAgICAgfVxuXG4gICAgICB0aGlzLl9kdXBsZXhTdGF0ZSB8PSBQUkVERVNUUk9ZSU5HXG4gICAgICB0aGlzLl9wcmVkZXN0cm95KClcbiAgICAgIHRoaXMuX2R1cGxleFN0YXRlICY9IE5PVF9QUkVERVNUUk9ZSU5HXG5cbiAgICAgIGlmICh0aGlzLl9yZWFkYWJsZVN0YXRlICE9PSBudWxsKSB0aGlzLl9yZWFkYWJsZVN0YXRlLnVwZGF0ZU5leHRUaWNrKClcbiAgICAgIGlmICh0aGlzLl93cml0YWJsZVN0YXRlICE9PSBudWxsKSB0aGlzLl93cml0YWJsZVN0YXRlLnVwZGF0ZU5leHRUaWNrKClcbiAgICB9XG4gIH1cbn1cblxuY2xhc3MgUmVhZGFibGUgZXh0ZW5kcyBTdHJlYW0ge1xuICBjb25zdHJ1Y3RvciAob3B0cykge1xuICAgIHN1cGVyKG9wdHMpXG5cbiAgICB0aGlzLl9kdXBsZXhTdGF0ZSB8PSBPUEVOSU5HIHwgV1JJVEVfRE9ORSB8IFJFQURfUkVBRF9BSEVBRFxuICAgIHRoaXMuX3JlYWRhYmxlU3RhdGUgPSBuZXcgUmVhZGFibGVTdGF0ZSh0aGlzLCBvcHRzKVxuXG4gICAgaWYgKG9wdHMpIHtcbiAgICAgIGlmICh0aGlzLl9yZWFkYWJsZVN0YXRlLnJlYWRBaGVhZCA9PT0gZmFsc2UpIHRoaXMuX2R1cGxleFN0YXRlICY9IFJFQURfTk9fUkVBRF9BSEVBRFxuICAgICAgaWYgKG9wdHMucmVhZCkgdGhpcy5fcmVhZCA9IG9wdHMucmVhZFxuICAgICAgaWYgKG9wdHMuZWFnZXJPcGVuKSB0aGlzLl9yZWFkYWJsZVN0YXRlLnVwZGF0ZU5leHRUaWNrKClcbiAgICAgIGlmIChvcHRzLmVuY29kaW5nKSB0aGlzLnNldEVuY29kaW5nKG9wdHMuZW5jb2RpbmcpXG4gICAgfVxuICB9XG5cbiAgc2V0RW5jb2RpbmcgKGVuY29kaW5nKSB7XG4gICAgY29uc3QgZGVjID0gbmV3IFRleHREZWNvZGVyKGVuY29kaW5nKVxuICAgIGNvbnN0IG1hcCA9IHRoaXMuX3JlYWRhYmxlU3RhdGUubWFwIHx8IGVjaG9cbiAgICB0aGlzLl9yZWFkYWJsZVN0YXRlLm1hcCA9IG1hcE9yU2tpcFxuICAgIHJldHVybiB0aGlzXG5cbiAgICBmdW5jdGlvbiBtYXBPclNraXAgKGRhdGEpIHtcbiAgICAgIGNvbnN0IG5leHQgPSBkZWMucHVzaChkYXRhKVxuICAgICAgcmV0dXJuIG5leHQgPT09ICcnICYmIChkYXRhLmJ5dGVMZW5ndGggIT09IDAgfHwgZGVjLnJlbWFpbmluZyA+IDApID8gbnVsbCA6IG1hcChuZXh0KVxuICAgIH1cbiAgfVxuXG4gIF9yZWFkIChjYikge1xuICAgIGNiKG51bGwpXG4gIH1cblxuICBwaXBlIChkZXN0LCBjYikge1xuICAgIHRoaXMuX3JlYWRhYmxlU3RhdGUudXBkYXRlTmV4dFRpY2soKVxuICAgIHRoaXMuX3JlYWRhYmxlU3RhdGUucGlwZShkZXN0LCBjYilcbiAgICByZXR1cm4gZGVzdFxuICB9XG5cbiAgcmVhZCAoKSB7XG4gICAgdGhpcy5fcmVhZGFibGVTdGF0ZS51cGRhdGVOZXh0VGljaygpXG4gICAgcmV0dXJuIHRoaXMuX3JlYWRhYmxlU3RhdGUucmVhZCgpXG4gIH1cblxuICBwdXNoIChkYXRhKSB7XG4gICAgdGhpcy5fcmVhZGFibGVTdGF0ZS51cGRhdGVOZXh0VGljaygpXG4gICAgcmV0dXJuIHRoaXMuX3JlYWRhYmxlU3RhdGUucHVzaChkYXRhKVxuICB9XG5cbiAgdW5zaGlmdCAoZGF0YSkge1xuICAgIHRoaXMuX3JlYWRhYmxlU3RhdGUudXBkYXRlTmV4dFRpY2soKVxuICAgIHJldHVybiB0aGlzLl9yZWFkYWJsZVN0YXRlLnVuc2hpZnQoZGF0YSlcbiAgfVxuXG4gIHJlc3VtZSAoKSB7XG4gICAgdGhpcy5fZHVwbGV4U3RhdGUgfD0gUkVBRF9SRVNVTUVEX1JFQURfQUhFQURcbiAgICB0aGlzLl9yZWFkYWJsZVN0YXRlLnVwZGF0ZU5leHRUaWNrKClcbiAgICByZXR1cm4gdGhpc1xuICB9XG5cbiAgcGF1c2UgKCkge1xuICAgIHRoaXMuX2R1cGxleFN0YXRlICY9ICh0aGlzLl9yZWFkYWJsZVN0YXRlLnJlYWRBaGVhZCA9PT0gZmFsc2UgPyBSRUFEX1BBVVNFRF9OT19SRUFEX0FIRUFEIDogUkVBRF9QQVVTRUQpXG4gICAgcmV0dXJuIHRoaXNcbiAgfVxuXG4gIHN0YXRpYyBfZnJvbUFzeW5jSXRlcmF0b3IgKGl0ZSwgb3B0cykge1xuICAgIGxldCBkZXN0cm95XG5cbiAgICBjb25zdCBycyA9IG5ldyBSZWFkYWJsZSh7XG4gICAgICAuLi5vcHRzLFxuICAgICAgcmVhZCAoY2IpIHtcbiAgICAgICAgaXRlLm5leHQoKS50aGVuKHB1c2gpLnRoZW4oY2IuYmluZChudWxsLCBudWxsKSkuY2F0Y2goY2IpXG4gICAgICB9LFxuICAgICAgcHJlZGVzdHJveSAoKSB7XG4gICAgICAgIGRlc3Ryb3kgPSBpdGUucmV0dXJuKClcbiAgICAgIH0sXG4gICAgICBkZXN0cm95IChjYikge1xuICAgICAgICBpZiAoIWRlc3Ryb3kpIHJldHVybiBjYihudWxsKVxuICAgICAgICBkZXN0cm95LnRoZW4oY2IuYmluZChudWxsLCBudWxsKSkuY2F0Y2goY2IpXG4gICAgICB9XG4gICAgfSlcblxuICAgIHJldHVybiByc1xuXG4gICAgZnVuY3Rpb24gcHVzaCAoZGF0YSkge1xuICAgICAgaWYgKGRhdGEuZG9uZSkgcnMucHVzaChudWxsKVxuICAgICAgZWxzZSBycy5wdXNoKGRhdGEudmFsdWUpXG4gICAgfVxuICB9XG5cbiAgc3RhdGljIGZyb20gKGRhdGEsIG9wdHMpIHtcbiAgICBpZiAoaXNSZWFkU3RyZWFteChkYXRhKSkgcmV0dXJuIGRhdGFcbiAgICBpZiAoZGF0YVthc3luY0l0ZXJhdG9yXSkgcmV0dXJuIHRoaXMuX2Zyb21Bc3luY0l0ZXJhdG9yKGRhdGFbYXN5bmNJdGVyYXRvcl0oKSwgb3B0cylcbiAgICBpZiAoIUFycmF5LmlzQXJyYXkoZGF0YSkpIGRhdGEgPSBkYXRhID09PSB1bmRlZmluZWQgPyBbXSA6IFtkYXRhXVxuXG4gICAgbGV0IGkgPSAwXG4gICAgcmV0dXJuIG5ldyBSZWFkYWJsZSh7XG4gICAgICAuLi5vcHRzLFxuICAgICAgcmVhZCAoY2IpIHtcbiAgICAgICAgdGhpcy5wdXNoKGkgPT09IGRhdGEubGVuZ3RoID8gbnVsbCA6IGRhdGFbaSsrXSlcbiAgICAgICAgY2IobnVsbClcbiAgICAgIH1cbiAgICB9KVxuICB9XG5cbiAgc3RhdGljIGlzQmFja3ByZXNzdXJlZCAocnMpIHtcbiAgICByZXR1cm4gKHJzLl9kdXBsZXhTdGF0ZSAmIFJFQURfQkFDS1BSRVNTVVJFX1NUQVRVUykgIT09IDAgfHwgcnMuX3JlYWRhYmxlU3RhdGUuYnVmZmVyZWQgPj0gcnMuX3JlYWRhYmxlU3RhdGUuaGlnaFdhdGVyTWFya1xuICB9XG5cbiAgc3RhdGljIGlzUGF1c2VkIChycykge1xuICAgIHJldHVybiAocnMuX2R1cGxleFN0YXRlICYgUkVBRF9SRVNVTUVEKSA9PT0gMFxuICB9XG5cbiAgW2FzeW5jSXRlcmF0b3JdICgpIHtcbiAgICBjb25zdCBzdHJlYW0gPSB0aGlzXG5cbiAgICBsZXQgZXJyb3IgPSBudWxsXG4gICAgbGV0IHByb21pc2VSZXNvbHZlID0gbnVsbFxuICAgIGxldCBwcm9taXNlUmVqZWN0ID0gbnVsbFxuXG4gICAgdGhpcy5vbignZXJyb3InLCAoZXJyKSA9PiB7IGVycm9yID0gZXJyIH0pXG4gICAgdGhpcy5vbigncmVhZGFibGUnLCBvbnJlYWRhYmxlKVxuICAgIHRoaXMub24oJ2Nsb3NlJywgb25jbG9zZSlcblxuICAgIHJldHVybiB7XG4gICAgICBbYXN5bmNJdGVyYXRvcl0gKCkge1xuICAgICAgICByZXR1cm4gdGhpc1xuICAgICAgfSxcbiAgICAgIG5leHQgKCkge1xuICAgICAgICByZXR1cm4gbmV3IFByb21pc2UoZnVuY3Rpb24gKHJlc29sdmUsIHJlamVjdCkge1xuICAgICAgICAgIHByb21pc2VSZXNvbHZlID0gcmVzb2x2ZVxuICAgICAgICAgIHByb21pc2VSZWplY3QgPSByZWplY3RcbiAgICAgICAgICBjb25zdCBkYXRhID0gc3RyZWFtLnJlYWQoKVxuICAgICAgICAgIGlmIChkYXRhICE9PSBudWxsKSBvbmRhdGEoZGF0YSlcbiAgICAgICAgICBlbHNlIGlmICgoc3RyZWFtLl9kdXBsZXhTdGF0ZSAmIERFU1RST1lFRCkgIT09IDApIG9uZGF0YShudWxsKVxuICAgICAgICB9KVxuICAgICAgfSxcbiAgICAgIHJldHVybiAoKSB7XG4gICAgICAgIHJldHVybiBkZXN0cm95KG51bGwpXG4gICAgICB9LFxuICAgICAgdGhyb3cgKGVycikge1xuICAgICAgICByZXR1cm4gZGVzdHJveShlcnIpXG4gICAgICB9XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gb25yZWFkYWJsZSAoKSB7XG4gICAgICBpZiAocHJvbWlzZVJlc29sdmUgIT09IG51bGwpIG9uZGF0YShzdHJlYW0ucmVhZCgpKVxuICAgIH1cblxuICAgIGZ1bmN0aW9uIG9uY2xvc2UgKCkge1xuICAgICAgaWYgKHByb21pc2VSZXNvbHZlICE9PSBudWxsKSBvbmRhdGEobnVsbClcbiAgICB9XG5cbiAgICBmdW5jdGlvbiBvbmRhdGEgKGRhdGEpIHtcbiAgICAgIGlmIChwcm9taXNlUmVqZWN0ID09PSBudWxsKSByZXR1cm5cbiAgICAgIGlmIChlcnJvcikgcHJvbWlzZVJlamVjdChlcnJvcilcbiAgICAgIGVsc2UgaWYgKGRhdGEgPT09IG51bGwgJiYgKHN0cmVhbS5fZHVwbGV4U3RhdGUgJiBSRUFEX0RPTkUpID09PSAwKSBwcm9taXNlUmVqZWN0KFNUUkVBTV9ERVNUUk9ZRUQpXG4gICAgICBlbHNlIHByb21pc2VSZXNvbHZlKHsgdmFsdWU6IGRhdGEsIGRvbmU6IGRhdGEgPT09IG51bGwgfSlcbiAgICAgIHByb21pc2VSZWplY3QgPSBwcm9taXNlUmVzb2x2ZSA9IG51bGxcbiAgICB9XG5cbiAgICBmdW5jdGlvbiBkZXN0cm95IChlcnIpIHtcbiAgICAgIHN0cmVhbS5kZXN0cm95KGVycilcbiAgICAgIHJldHVybiBuZXcgUHJvbWlzZSgocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XG4gICAgICAgIGlmIChzdHJlYW0uX2R1cGxleFN0YXRlICYgREVTVFJPWUVEKSByZXR1cm4gcmVzb2x2ZSh7IHZhbHVlOiB1bmRlZmluZWQsIGRvbmU6IHRydWUgfSlcbiAgICAgICAgc3RyZWFtLm9uY2UoJ2Nsb3NlJywgZnVuY3Rpb24gKCkge1xuICAgICAgICAgIGlmIChlcnIpIHJlamVjdChlcnIpXG4gICAgICAgICAgZWxzZSByZXNvbHZlKHsgdmFsdWU6IHVuZGVmaW5lZCwgZG9uZTogdHJ1ZSB9KVxuICAgICAgICB9KVxuICAgICAgfSlcbiAgICB9XG4gIH1cbn1cblxuY2xhc3MgV3JpdGFibGUgZXh0ZW5kcyBTdHJlYW0ge1xuICBjb25zdHJ1Y3RvciAob3B0cykge1xuICAgIHN1cGVyKG9wdHMpXG5cbiAgICB0aGlzLl9kdXBsZXhTdGF0ZSB8PSBPUEVOSU5HIHwgUkVBRF9ET05FXG4gICAgdGhpcy5fd3JpdGFibGVTdGF0ZSA9IG5ldyBXcml0YWJsZVN0YXRlKHRoaXMsIG9wdHMpXG5cbiAgICBpZiAob3B0cykge1xuICAgICAgaWYgKG9wdHMud3JpdGV2KSB0aGlzLl93cml0ZXYgPSBvcHRzLndyaXRldlxuICAgICAgaWYgKG9wdHMud3JpdGUpIHRoaXMuX3dyaXRlID0gb3B0cy53cml0ZVxuICAgICAgaWYgKG9wdHMuZmluYWwpIHRoaXMuX2ZpbmFsID0gb3B0cy5maW5hbFxuICAgICAgaWYgKG9wdHMuZWFnZXJPcGVuKSB0aGlzLl93cml0YWJsZVN0YXRlLnVwZGF0ZU5leHRUaWNrKClcbiAgICB9XG4gIH1cblxuICBjb3JrICgpIHtcbiAgICB0aGlzLl9kdXBsZXhTdGF0ZSB8PSBXUklURV9DT1JLRURcbiAgfVxuXG4gIHVuY29yayAoKSB7XG4gICAgdGhpcy5fZHVwbGV4U3RhdGUgJj0gV1JJVEVfTk9UX0NPUktFRFxuICAgIHRoaXMuX3dyaXRhYmxlU3RhdGUudXBkYXRlTmV4dFRpY2soKVxuICB9XG5cbiAgX3dyaXRldiAoYmF0Y2gsIGNiKSB7XG4gICAgY2IobnVsbClcbiAgfVxuXG4gIF93cml0ZSAoZGF0YSwgY2IpIHtcbiAgICB0aGlzLl93cml0YWJsZVN0YXRlLmF1dG9CYXRjaChkYXRhLCBjYilcbiAgfVxuXG4gIF9maW5hbCAoY2IpIHtcbiAgICBjYihudWxsKVxuICB9XG5cbiAgc3RhdGljIGlzQmFja3ByZXNzdXJlZCAod3MpIHtcbiAgICByZXR1cm4gKHdzLl9kdXBsZXhTdGF0ZSAmIFdSSVRFX0JBQ0tQUkVTU1VSRV9TVEFUVVMpICE9PSAwXG4gIH1cblxuICBzdGF0aWMgZHJhaW5lZCAod3MpIHtcbiAgICBpZiAod3MuZGVzdHJveWVkKSByZXR1cm4gUHJvbWlzZS5yZXNvbHZlKGZhbHNlKVxuICAgIGNvbnN0IHN0YXRlID0gd3MuX3dyaXRhYmxlU3RhdGVcbiAgICBjb25zdCBwZW5kaW5nID0gKGlzV3JpdGV2KHdzKSA/IE1hdGgubWluKDEsIHN0YXRlLnF1ZXVlLmxlbmd0aCkgOiBzdGF0ZS5xdWV1ZS5sZW5ndGgpXG4gICAgY29uc3Qgd3JpdGVzID0gcGVuZGluZyArICgod3MuX2R1cGxleFN0YXRlICYgV1JJVEVfV1JJVElORykgPyAxIDogMClcbiAgICBpZiAod3JpdGVzID09PSAwKSByZXR1cm4gUHJvbWlzZS5yZXNvbHZlKHRydWUpXG4gICAgaWYgKHN0YXRlLmRyYWlucyA9PT0gbnVsbCkgc3RhdGUuZHJhaW5zID0gW11cbiAgICByZXR1cm4gbmV3IFByb21pc2UoKHJlc29sdmUpID0+IHtcbiAgICAgIHN0YXRlLmRyYWlucy5wdXNoKHsgd3JpdGVzLCByZXNvbHZlIH0pXG4gICAgfSlcbiAgfVxuXG4gIHdyaXRlIChkYXRhKSB7XG4gICAgdGhpcy5fd3JpdGFibGVTdGF0ZS51cGRhdGVOZXh0VGljaygpXG4gICAgcmV0dXJuIHRoaXMuX3dyaXRhYmxlU3RhdGUucHVzaChkYXRhKVxuICB9XG5cbiAgZW5kIChkYXRhKSB7XG4gICAgdGhpcy5fd3JpdGFibGVTdGF0ZS51cGRhdGVOZXh0VGljaygpXG4gICAgdGhpcy5fd3JpdGFibGVTdGF0ZS5lbmQoZGF0YSlcbiAgICByZXR1cm4gdGhpc1xuICB9XG59XG5cbmNsYXNzIER1cGxleCBleHRlbmRzIFJlYWRhYmxlIHsgLy8gYW5kIFdyaXRhYmxlXG4gIGNvbnN0cnVjdG9yIChvcHRzKSB7XG4gICAgc3VwZXIob3B0cylcblxuICAgIHRoaXMuX2R1cGxleFN0YXRlID0gT1BFTklORyB8ICh0aGlzLl9kdXBsZXhTdGF0ZSAmIFJFQURfUkVBRF9BSEVBRClcbiAgICB0aGlzLl93cml0YWJsZVN0YXRlID0gbmV3IFdyaXRhYmxlU3RhdGUodGhpcywgb3B0cylcblxuICAgIGlmIChvcHRzKSB7XG4gICAgICBpZiAob3B0cy53cml0ZXYpIHRoaXMuX3dyaXRldiA9IG9wdHMud3JpdGV2XG4gICAgICBpZiAob3B0cy53cml0ZSkgdGhpcy5fd3JpdGUgPSBvcHRzLndyaXRlXG4gICAgICBpZiAob3B0cy5maW5hbCkgdGhpcy5fZmluYWwgPSBvcHRzLmZpbmFsXG4gICAgfVxuICB9XG5cbiAgY29yayAoKSB7XG4gICAgdGhpcy5fZHVwbGV4U3RhdGUgfD0gV1JJVEVfQ09SS0VEXG4gIH1cblxuICB1bmNvcmsgKCkge1xuICAgIHRoaXMuX2R1cGxleFN0YXRlICY9IFdSSVRFX05PVF9DT1JLRURcbiAgICB0aGlzLl93cml0YWJsZVN0YXRlLnVwZGF0ZU5leHRUaWNrKClcbiAgfVxuXG4gIF93cml0ZXYgKGJhdGNoLCBjYikge1xuICAgIGNiKG51bGwpXG4gIH1cblxuICBfd3JpdGUgKGRhdGEsIGNiKSB7XG4gICAgdGhpcy5fd3JpdGFibGVTdGF0ZS5hdXRvQmF0Y2goZGF0YSwgY2IpXG4gIH1cblxuICBfZmluYWwgKGNiKSB7XG4gICAgY2IobnVsbClcbiAgfVxuXG4gIHdyaXRlIChkYXRhKSB7XG4gICAgdGhpcy5fd3JpdGFibGVTdGF0ZS51cGRhdGVOZXh0VGljaygpXG4gICAgcmV0dXJuIHRoaXMuX3dyaXRhYmxlU3RhdGUucHVzaChkYXRhKVxuICB9XG5cbiAgZW5kIChkYXRhKSB7XG4gICAgdGhpcy5fd3JpdGFibGVTdGF0ZS51cGRhdGVOZXh0VGljaygpXG4gICAgdGhpcy5fd3JpdGFibGVTdGF0ZS5lbmQoZGF0YSlcbiAgICByZXR1cm4gdGhpc1xuICB9XG59XG5cbmNsYXNzIFRyYW5zZm9ybSBleHRlbmRzIER1cGxleCB7XG4gIGNvbnN0cnVjdG9yIChvcHRzKSB7XG4gICAgc3VwZXIob3B0cylcbiAgICB0aGlzLl90cmFuc2Zvcm1TdGF0ZSA9IG5ldyBUcmFuc2Zvcm1TdGF0ZSh0aGlzKVxuXG4gICAgaWYgKG9wdHMpIHtcbiAgICAgIGlmIChvcHRzLnRyYW5zZm9ybSkgdGhpcy5fdHJhbnNmb3JtID0gb3B0cy50cmFuc2Zvcm1cbiAgICAgIGlmIChvcHRzLmZsdXNoKSB0aGlzLl9mbHVzaCA9IG9wdHMuZmx1c2hcbiAgICB9XG4gIH1cblxuICBfd3JpdGUgKGRhdGEsIGNiKSB7XG4gICAgaWYgKHRoaXMuX3JlYWRhYmxlU3RhdGUuYnVmZmVyZWQgPj0gdGhpcy5fcmVhZGFibGVTdGF0ZS5oaWdoV2F0ZXJNYXJrKSB7XG4gICAgICB0aGlzLl90cmFuc2Zvcm1TdGF0ZS5kYXRhID0gZGF0YVxuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLl90cmFuc2Zvcm0oZGF0YSwgdGhpcy5fdHJhbnNmb3JtU3RhdGUuYWZ0ZXJUcmFuc2Zvcm0pXG4gICAgfVxuICB9XG5cbiAgX3JlYWQgKGNiKSB7XG4gICAgaWYgKHRoaXMuX3RyYW5zZm9ybVN0YXRlLmRhdGEgIT09IG51bGwpIHtcbiAgICAgIGNvbnN0IGRhdGEgPSB0aGlzLl90cmFuc2Zvcm1TdGF0ZS5kYXRhXG4gICAgICB0aGlzLl90cmFuc2Zvcm1TdGF0ZS5kYXRhID0gbnVsbFxuICAgICAgY2IobnVsbClcbiAgICAgIHRoaXMuX3RyYW5zZm9ybShkYXRhLCB0aGlzLl90cmFuc2Zvcm1TdGF0ZS5hZnRlclRyYW5zZm9ybSlcbiAgICB9IGVsc2Uge1xuICAgICAgY2IobnVsbClcbiAgICB9XG4gIH1cblxuICBkZXN0cm95IChlcnIpIHtcbiAgICBzdXBlci5kZXN0cm95KGVycilcbiAgICBpZiAodGhpcy5fdHJhbnNmb3JtU3RhdGUuZGF0YSAhPT0gbnVsbCkge1xuICAgICAgdGhpcy5fdHJhbnNmb3JtU3RhdGUuZGF0YSA9IG51bGxcbiAgICAgIHRoaXMuX3RyYW5zZm9ybVN0YXRlLmFmdGVyVHJhbnNmb3JtKClcbiAgICB9XG4gIH1cblxuICBfdHJhbnNmb3JtIChkYXRhLCBjYikge1xuICAgIGNiKG51bGwsIGRhdGEpXG4gIH1cblxuICBfZmx1c2ggKGNiKSB7XG4gICAgY2IobnVsbClcbiAgfVxuXG4gIF9maW5hbCAoY2IpIHtcbiAgICB0aGlzLl90cmFuc2Zvcm1TdGF0ZS5hZnRlckZpbmFsID0gY2JcbiAgICB0aGlzLl9mbHVzaCh0cmFuc2Zvcm1BZnRlckZsdXNoLmJpbmQodGhpcykpXG4gIH1cbn1cblxuY2xhc3MgUGFzc1Rocm91Z2ggZXh0ZW5kcyBUcmFuc2Zvcm0ge31cblxuZnVuY3Rpb24gdHJhbnNmb3JtQWZ0ZXJGbHVzaCAoZXJyLCBkYXRhKSB7XG4gIGNvbnN0IGNiID0gdGhpcy5fdHJhbnNmb3JtU3RhdGUuYWZ0ZXJGaW5hbFxuICBpZiAoZXJyKSByZXR1cm4gY2IoZXJyKVxuICBpZiAoZGF0YSAhPT0gbnVsbCAmJiBkYXRhICE9PSB1bmRlZmluZWQpIHRoaXMucHVzaChkYXRhKVxuICB0aGlzLnB1c2gobnVsbClcbiAgY2IobnVsbClcbn1cblxuZnVuY3Rpb24gcGlwZWxpbmVQcm9taXNlICguLi5zdHJlYW1zKSB7XG4gIHJldHVybiBuZXcgUHJvbWlzZSgocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XG4gICAgcmV0dXJuIHBpcGVsaW5lKC4uLnN0cmVhbXMsIChlcnIpID0+IHtcbiAgICAgIGlmIChlcnIpIHJldHVybiByZWplY3QoZXJyKVxuICAgICAgcmVzb2x2ZSgpXG4gICAgfSlcbiAgfSlcbn1cblxuZnVuY3Rpb24gcGlwZWxpbmUgKHN0cmVhbSwgLi4uc3RyZWFtcykge1xuICBjb25zdCBhbGwgPSBBcnJheS5pc0FycmF5KHN0cmVhbSkgPyBbLi4uc3RyZWFtLCAuLi5zdHJlYW1zXSA6IFtzdHJlYW0sIC4uLnN0cmVhbXNdXG4gIGNvbnN0IGRvbmUgPSAoYWxsLmxlbmd0aCAmJiB0eXBlb2YgYWxsW2FsbC5sZW5ndGggLSAxXSA9PT0gJ2Z1bmN0aW9uJykgPyBhbGwucG9wKCkgOiBudWxsXG5cbiAgaWYgKGFsbC5sZW5ndGggPCAyKSB0aHJvdyBuZXcgRXJyb3IoJ1BpcGVsaW5lIHJlcXVpcmVzIGF0IGxlYXN0IDIgc3RyZWFtcycpXG5cbiAgbGV0IHNyYyA9IGFsbFswXVxuICBsZXQgZGVzdCA9IG51bGxcbiAgbGV0IGVycm9yID0gbnVsbFxuXG4gIGZvciAobGV0IGkgPSAxOyBpIDwgYWxsLmxlbmd0aDsgaSsrKSB7XG4gICAgZGVzdCA9IGFsbFtpXVxuXG4gICAgaWYgKGlzU3RyZWFteChzcmMpKSB7XG4gICAgICBzcmMucGlwZShkZXN0LCBvbmVycm9yKVxuICAgIH0gZWxzZSB7XG4gICAgICBlcnJvckhhbmRsZShzcmMsIHRydWUsIGkgPiAxLCBvbmVycm9yKVxuICAgICAgc3JjLnBpcGUoZGVzdClcbiAgICB9XG5cbiAgICBzcmMgPSBkZXN0XG4gIH1cblxuICBpZiAoZG9uZSkge1xuICAgIGxldCBmaW4gPSBmYWxzZVxuXG4gICAgY29uc3QgYXV0b0Rlc3Ryb3kgPSBpc1N0cmVhbXgoZGVzdCkgfHwgISEoZGVzdC5fd3JpdGFibGVTdGF0ZSAmJiBkZXN0Ll93cml0YWJsZVN0YXRlLmF1dG9EZXN0cm95KVxuXG4gICAgZGVzdC5vbignZXJyb3InLCAoZXJyKSA9PiB7XG4gICAgICBpZiAoZXJyb3IgPT09IG51bGwpIGVycm9yID0gZXJyXG4gICAgfSlcblxuICAgIGRlc3Qub24oJ2ZpbmlzaCcsICgpID0+IHtcbiAgICAgIGZpbiA9IHRydWVcbiAgICAgIGlmICghYXV0b0Rlc3Ryb3kpIGRvbmUoZXJyb3IpXG4gICAgfSlcblxuICAgIGlmIChhdXRvRGVzdHJveSkge1xuICAgICAgZGVzdC5vbignY2xvc2UnLCAoKSA9PiBkb25lKGVycm9yIHx8IChmaW4gPyBudWxsIDogUFJFTUFUVVJFX0NMT1NFKSkpXG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIGRlc3RcblxuICBmdW5jdGlvbiBlcnJvckhhbmRsZSAocywgcmQsIHdyLCBvbmVycm9yKSB7XG4gICAgcy5vbignZXJyb3InLCBvbmVycm9yKVxuICAgIHMub24oJ2Nsb3NlJywgb25jbG9zZSlcblxuICAgIGZ1bmN0aW9uIG9uY2xvc2UgKCkge1xuICAgICAgaWYgKHJkICYmIHMuX3JlYWRhYmxlU3RhdGUgJiYgIXMuX3JlYWRhYmxlU3RhdGUuZW5kZWQpIHJldHVybiBvbmVycm9yKFBSRU1BVFVSRV9DTE9TRSlcbiAgICAgIGlmICh3ciAmJiBzLl93cml0YWJsZVN0YXRlICYmICFzLl93cml0YWJsZVN0YXRlLmVuZGVkKSByZXR1cm4gb25lcnJvcihQUkVNQVRVUkVfQ0xPU0UpXG4gICAgfVxuICB9XG5cbiAgZnVuY3Rpb24gb25lcnJvciAoZXJyKSB7XG4gICAgaWYgKCFlcnIgfHwgZXJyb3IpIHJldHVyblxuICAgIGVycm9yID0gZXJyXG5cbiAgICBmb3IgKGNvbnN0IHMgb2YgYWxsKSB7XG4gICAgICBzLmRlc3Ryb3koZXJyKVxuICAgIH1cbiAgfVxufVxuXG5mdW5jdGlvbiBlY2hvIChzKSB7XG4gIHJldHVybiBzXG59XG5cbmZ1bmN0aW9uIGlzU3RyZWFtIChzdHJlYW0pIHtcbiAgcmV0dXJuICEhc3RyZWFtLl9yZWFkYWJsZVN0YXRlIHx8ICEhc3RyZWFtLl93cml0YWJsZVN0YXRlXG59XG5cbmZ1bmN0aW9uIGlzU3RyZWFteCAoc3RyZWFtKSB7XG4gIHJldHVybiB0eXBlb2Ygc3RyZWFtLl9kdXBsZXhTdGF0ZSA9PT0gJ251bWJlcicgJiYgaXNTdHJlYW0oc3RyZWFtKVxufVxuXG5mdW5jdGlvbiBpc0VuZGVkIChzdHJlYW0pIHtcbiAgcmV0dXJuICEhc3RyZWFtLl9yZWFkYWJsZVN0YXRlICYmIHN0cmVhbS5fcmVhZGFibGVTdGF0ZS5lbmRlZFxufVxuXG5mdW5jdGlvbiBpc0ZpbmlzaGVkIChzdHJlYW0pIHtcbiAgcmV0dXJuICEhc3RyZWFtLl93cml0YWJsZVN0YXRlICYmIHN0cmVhbS5fd3JpdGFibGVTdGF0ZS5lbmRlZFxufVxuXG5mdW5jdGlvbiBnZXRTdHJlYW1FcnJvciAoc3RyZWFtLCBvcHRzID0ge30pIHtcbiAgY29uc3QgZXJyID0gKHN0cmVhbS5fcmVhZGFibGVTdGF0ZSAmJiBzdHJlYW0uX3JlYWRhYmxlU3RhdGUuZXJyb3IpIHx8IChzdHJlYW0uX3dyaXRhYmxlU3RhdGUgJiYgc3RyZWFtLl93cml0YWJsZVN0YXRlLmVycm9yKVxuXG4gIC8vIGF2b2lkIGltcGxpY2l0IGVycm9ycyBieSBkZWZhdWx0XG4gIHJldHVybiAoIW9wdHMuYWxsICYmIGVyciA9PT0gU1RSRUFNX0RFU1RST1lFRCkgPyBudWxsIDogZXJyXG59XG5cbmZ1bmN0aW9uIGlzUmVhZFN0cmVhbXggKHN0cmVhbSkge1xuICByZXR1cm4gaXNTdHJlYW14KHN0cmVhbSkgJiYgc3RyZWFtLnJlYWRhYmxlXG59XG5cbmZ1bmN0aW9uIGlzVHlwZWRBcnJheSAoZGF0YSkge1xuICByZXR1cm4gdHlwZW9mIGRhdGEgPT09ICdvYmplY3QnICYmIGRhdGEgIT09IG51bGwgJiYgdHlwZW9mIGRhdGEuYnl0ZUxlbmd0aCA9PT0gJ251bWJlcidcbn1cblxuZnVuY3Rpb24gZGVmYXVsdEJ5dGVMZW5ndGggKGRhdGEpIHtcbiAgcmV0dXJuIGlzVHlwZWRBcnJheShkYXRhKSA/IGRhdGEuYnl0ZUxlbmd0aCA6IDEwMjRcbn1cblxuZnVuY3Rpb24gbm9vcCAoKSB7fVxuXG5mdW5jdGlvbiBhYm9ydCAoKSB7XG4gIHRoaXMuZGVzdHJveShuZXcgRXJyb3IoJ1N0cmVhbSBhYm9ydGVkLicpKVxufVxuXG5mdW5jdGlvbiBpc1dyaXRldiAocykge1xuICByZXR1cm4gcy5fd3JpdGV2ICE9PSBXcml0YWJsZS5wcm90b3R5cGUuX3dyaXRldiAmJiBzLl93cml0ZXYgIT09IER1cGxleC5wcm90b3R5cGUuX3dyaXRldlxufVxuXG5tb2R1bGUuZXhwb3J0cyA9IHtcbiAgcGlwZWxpbmUsXG4gIHBpcGVsaW5lUHJvbWlzZSxcbiAgaXNTdHJlYW0sXG4gIGlzU3RyZWFteCxcbiAgaXNFbmRlZCxcbiAgaXNGaW5pc2hlZCxcbiAgZ2V0U3RyZWFtRXJyb3IsXG4gIFN0cmVhbSxcbiAgV3JpdGFibGUsXG4gIFJlYWRhYmxlLFxuICBEdXBsZXgsXG4gIFRyYW5zZm9ybSxcbiAgLy8gRXhwb3J0IFBhc3NUaHJvdWdoIGZvciBjb21wYXRpYmlsaXR5IHdpdGggTm9kZS5qcyBjb3JlJ3Mgc3RyZWFtIG1vZHVsZVxuICBQYXNzVGhyb3VnaFxufVxuIiwKICAgICJmdW5jdGlvbiBpc0J1ZmZlciAodmFsdWUpIHtcbiAgcmV0dXJuIEJ1ZmZlci5pc0J1ZmZlcih2YWx1ZSkgfHwgdmFsdWUgaW5zdGFuY2VvZiBVaW50OEFycmF5XG59XG5cbmZ1bmN0aW9uIGlzRW5jb2RpbmcgKGVuY29kaW5nKSB7XG4gIHJldHVybiBCdWZmZXIuaXNFbmNvZGluZyhlbmNvZGluZylcbn1cblxuZnVuY3Rpb24gYWxsb2MgKHNpemUsIGZpbGwsIGVuY29kaW5nKSB7XG4gIHJldHVybiBCdWZmZXIuYWxsb2Moc2l6ZSwgZmlsbCwgZW5jb2RpbmcpXG59XG5cbmZ1bmN0aW9uIGFsbG9jVW5zYWZlIChzaXplKSB7XG4gIHJldHVybiBCdWZmZXIuYWxsb2NVbnNhZmUoc2l6ZSlcbn1cblxuZnVuY3Rpb24gYWxsb2NVbnNhZmVTbG93IChzaXplKSB7XG4gIHJldHVybiBCdWZmZXIuYWxsb2NVbnNhZmVTbG93KHNpemUpXG59XG5cbmZ1bmN0aW9uIGJ5dGVMZW5ndGggKHN0cmluZywgZW5jb2RpbmcpIHtcbiAgcmV0dXJuIEJ1ZmZlci5ieXRlTGVuZ3RoKHN0cmluZywgZW5jb2RpbmcpXG59XG5cbmZ1bmN0aW9uIGNvbXBhcmUgKGEsIGIpIHtcbiAgcmV0dXJuIEJ1ZmZlci5jb21wYXJlKGEsIGIpXG59XG5cbmZ1bmN0aW9uIGNvbmNhdCAoYnVmZmVycywgdG90YWxMZW5ndGgpIHtcbiAgcmV0dXJuIEJ1ZmZlci5jb25jYXQoYnVmZmVycywgdG90YWxMZW5ndGgpXG59XG5cbmZ1bmN0aW9uIGNvcHkgKHNvdXJjZSwgdGFyZ2V0LCB0YXJnZXRTdGFydCwgc3RhcnQsIGVuZCkge1xuICByZXR1cm4gdG9CdWZmZXIoc291cmNlKS5jb3B5KHRhcmdldCwgdGFyZ2V0U3RhcnQsIHN0YXJ0LCBlbmQpXG59XG5cbmZ1bmN0aW9uIGVxdWFscyAoYSwgYikge1xuICByZXR1cm4gdG9CdWZmZXIoYSkuZXF1YWxzKGIpXG59XG5cbmZ1bmN0aW9uIGZpbGwgKGJ1ZmZlciwgdmFsdWUsIG9mZnNldCwgZW5kLCBlbmNvZGluZykge1xuICByZXR1cm4gdG9CdWZmZXIoYnVmZmVyKS5maWxsKHZhbHVlLCBvZmZzZXQsIGVuZCwgZW5jb2RpbmcpXG59XG5cbmZ1bmN0aW9uIGZyb20gKHZhbHVlLCBlbmNvZGluZ09yT2Zmc2V0LCBsZW5ndGgpIHtcbiAgcmV0dXJuIEJ1ZmZlci5mcm9tKHZhbHVlLCBlbmNvZGluZ09yT2Zmc2V0LCBsZW5ndGgpXG59XG5cbmZ1bmN0aW9uIGluY2x1ZGVzIChidWZmZXIsIHZhbHVlLCBieXRlT2Zmc2V0LCBlbmNvZGluZykge1xuICByZXR1cm4gdG9CdWZmZXIoYnVmZmVyKS5pbmNsdWRlcyh2YWx1ZSwgYnl0ZU9mZnNldCwgZW5jb2RpbmcpXG59XG5cbmZ1bmN0aW9uIGluZGV4T2YgKGJ1ZmZlciwgdmFsdWUsIGJ5ZmVPZmZzZXQsIGVuY29kaW5nKSB7XG4gIHJldHVybiB0b0J1ZmZlcihidWZmZXIpLmluZGV4T2YodmFsdWUsIGJ5ZmVPZmZzZXQsIGVuY29kaW5nKVxufVxuXG5mdW5jdGlvbiBsYXN0SW5kZXhPZiAoYnVmZmVyLCB2YWx1ZSwgYnl0ZU9mZnNldCwgZW5jb2RpbmcpIHtcbiAgcmV0dXJuIHRvQnVmZmVyKGJ1ZmZlcikubGFzdEluZGV4T2YodmFsdWUsIGJ5dGVPZmZzZXQsIGVuY29kaW5nKVxufVxuXG5mdW5jdGlvbiBzd2FwMTYgKGJ1ZmZlcikge1xuICByZXR1cm4gdG9CdWZmZXIoYnVmZmVyKS5zd2FwMTYoKVxufVxuXG5mdW5jdGlvbiBzd2FwMzIgKGJ1ZmZlcikge1xuICByZXR1cm4gdG9CdWZmZXIoYnVmZmVyKS5zd2FwMzIoKVxufVxuXG5mdW5jdGlvbiBzd2FwNjQgKGJ1ZmZlcikge1xuICByZXR1cm4gdG9CdWZmZXIoYnVmZmVyKS5zd2FwNjQoKVxufVxuXG5mdW5jdGlvbiB0b0J1ZmZlciAoYnVmZmVyKSB7XG4gIGlmIChCdWZmZXIuaXNCdWZmZXIoYnVmZmVyKSkgcmV0dXJuIGJ1ZmZlclxuICByZXR1cm4gQnVmZmVyLmZyb20oYnVmZmVyLmJ1ZmZlciwgYnVmZmVyLmJ5dGVPZmZzZXQsIGJ1ZmZlci5ieXRlTGVuZ3RoKVxufVxuXG5mdW5jdGlvbiB0b1N0cmluZyAoYnVmZmVyLCBlbmNvZGluZywgc3RhcnQsIGVuZCkge1xuICByZXR1cm4gdG9CdWZmZXIoYnVmZmVyKS50b1N0cmluZyhlbmNvZGluZywgc3RhcnQsIGVuZClcbn1cblxuZnVuY3Rpb24gd3JpdGUgKGJ1ZmZlciwgc3RyaW5nLCBvZmZzZXQsIGxlbmd0aCwgZW5jb2RpbmcpIHtcbiAgcmV0dXJuIHRvQnVmZmVyKGJ1ZmZlcikud3JpdGUoc3RyaW5nLCBvZmZzZXQsIGxlbmd0aCwgZW5jb2RpbmcpXG59XG5cbmZ1bmN0aW9uIHdyaXRlRG91YmxlTEUgKGJ1ZmZlciwgdmFsdWUsIG9mZnNldCkge1xuICByZXR1cm4gdG9CdWZmZXIoYnVmZmVyKS53cml0ZURvdWJsZUxFKHZhbHVlLCBvZmZzZXQpXG59XG5cbmZ1bmN0aW9uIHdyaXRlRmxvYXRMRSAoYnVmZmVyLCB2YWx1ZSwgb2Zmc2V0KSB7XG4gIHJldHVybiB0b0J1ZmZlcihidWZmZXIpLndyaXRlRmxvYXRMRSh2YWx1ZSwgb2Zmc2V0KVxufVxuXG5mdW5jdGlvbiB3cml0ZVVJbnQzMkxFIChidWZmZXIsIHZhbHVlLCBvZmZzZXQpIHtcbiAgcmV0dXJuIHRvQnVmZmVyKGJ1ZmZlcikud3JpdGVVSW50MzJMRSh2YWx1ZSwgb2Zmc2V0KVxufVxuXG5mdW5jdGlvbiB3cml0ZUludDMyTEUgKGJ1ZmZlciwgdmFsdWUsIG9mZnNldCkge1xuICByZXR1cm4gdG9CdWZmZXIoYnVmZmVyKS53cml0ZUludDMyTEUodmFsdWUsIG9mZnNldClcbn1cblxuZnVuY3Rpb24gcmVhZERvdWJsZUxFIChidWZmZXIsIG9mZnNldCkge1xuICByZXR1cm4gdG9CdWZmZXIoYnVmZmVyKS5yZWFkRG91YmxlTEUob2Zmc2V0KVxufVxuXG5mdW5jdGlvbiByZWFkRmxvYXRMRSAoYnVmZmVyLCBvZmZzZXQpIHtcbiAgcmV0dXJuIHRvQnVmZmVyKGJ1ZmZlcikucmVhZEZsb2F0TEUob2Zmc2V0KVxufVxuXG5mdW5jdGlvbiByZWFkVUludDMyTEUgKGJ1ZmZlciwgb2Zmc2V0KSB7XG4gIHJldHVybiB0b0J1ZmZlcihidWZmZXIpLnJlYWRVSW50MzJMRShvZmZzZXQpXG59XG5cbmZ1bmN0aW9uIHJlYWRJbnQzMkxFIChidWZmZXIsIG9mZnNldCkge1xuICByZXR1cm4gdG9CdWZmZXIoYnVmZmVyKS5yZWFkSW50MzJMRShvZmZzZXQpXG59XG5cbmZ1bmN0aW9uIHdyaXRlRG91YmxlQkUgKGJ1ZmZlciwgdmFsdWUsIG9mZnNldCkge1xuICByZXR1cm4gdG9CdWZmZXIoYnVmZmVyKS53cml0ZURvdWJsZUJFKHZhbHVlLCBvZmZzZXQpXG59XG5cbmZ1bmN0aW9uIHdyaXRlRmxvYXRCRSAoYnVmZmVyLCB2YWx1ZSwgb2Zmc2V0KSB7XG4gIHJldHVybiB0b0J1ZmZlcihidWZmZXIpLndyaXRlRmxvYXRCRSh2YWx1ZSwgb2Zmc2V0KVxufVxuXG5mdW5jdGlvbiB3cml0ZVVJbnQzMkJFIChidWZmZXIsIHZhbHVlLCBvZmZzZXQpIHtcbiAgcmV0dXJuIHRvQnVmZmVyKGJ1ZmZlcikud3JpdGVVSW50MzJCRSh2YWx1ZSwgb2Zmc2V0KVxufVxuXG5mdW5jdGlvbiB3cml0ZUludDMyQkUgKGJ1ZmZlciwgdmFsdWUsIG9mZnNldCkge1xuICByZXR1cm4gdG9CdWZmZXIoYnVmZmVyKS53cml0ZUludDMyQkUodmFsdWUsIG9mZnNldClcbn1cblxuZnVuY3Rpb24gcmVhZERvdWJsZUJFIChidWZmZXIsIG9mZnNldCkge1xuICByZXR1cm4gdG9CdWZmZXIoYnVmZmVyKS5yZWFkRG91YmxlQkUob2Zmc2V0KVxufVxuXG5mdW5jdGlvbiByZWFkRmxvYXRCRSAoYnVmZmVyLCBvZmZzZXQpIHtcbiAgcmV0dXJuIHRvQnVmZmVyKGJ1ZmZlcikucmVhZEZsb2F0QkUob2Zmc2V0KVxufVxuXG5mdW5jdGlvbiByZWFkVUludDMyQkUgKGJ1ZmZlciwgb2Zmc2V0KSB7XG4gIHJldHVybiB0b0J1ZmZlcihidWZmZXIpLnJlYWRVSW50MzJCRShvZmZzZXQpXG59XG5cbmZ1bmN0aW9uIHJlYWRJbnQzMkJFIChidWZmZXIsIG9mZnNldCkge1xuICByZXR1cm4gdG9CdWZmZXIoYnVmZmVyKS5yZWFkSW50MzJCRShvZmZzZXQpXG59XG5cbm1vZHVsZS5leHBvcnRzID0ge1xuICBpc0J1ZmZlcixcbiAgaXNFbmNvZGluZyxcbiAgYWxsb2MsXG4gIGFsbG9jVW5zYWZlLFxuICBhbGxvY1Vuc2FmZVNsb3csXG4gIGJ5dGVMZW5ndGgsXG4gIGNvbXBhcmUsXG4gIGNvbmNhdCxcbiAgY29weSxcbiAgZXF1YWxzLFxuICBmaWxsLFxuICBmcm9tLFxuICBpbmNsdWRlcyxcbiAgaW5kZXhPZixcbiAgbGFzdEluZGV4T2YsXG4gIHN3YXAxNixcbiAgc3dhcDMyLFxuICBzd2FwNjQsXG4gIHRvQnVmZmVyLFxuICB0b1N0cmluZyxcbiAgd3JpdGUsXG4gIHdyaXRlRG91YmxlTEUsXG4gIHdyaXRlRmxvYXRMRSxcbiAgd3JpdGVVSW50MzJMRSxcbiAgd3JpdGVJbnQzMkxFLFxuICByZWFkRG91YmxlTEUsXG4gIHJlYWRGbG9hdExFLFxuICByZWFkVUludDMyTEUsXG4gIHJlYWRJbnQzMkxFLFxuICB3cml0ZURvdWJsZUJFLFxuICB3cml0ZUZsb2F0QkUsXG4gIHdyaXRlVUludDMyQkUsXG4gIHdyaXRlSW50MzJCRSxcbiAgcmVhZERvdWJsZUJFLFxuICByZWFkRmxvYXRCRSxcbiAgcmVhZFVJbnQzMkJFLFxuICByZWFkSW50MzJCRVxuXG59XG4iLAogICAgImNvbnN0IGI0YSA9IHJlcXVpcmUoJ2I0YScpXG5cbmNvbnN0IFpFUk9TID0gJzAwMDAwMDAwMDAwMDAwMDAwMDAnXG5jb25zdCBTRVZFTlMgPSAnNzc3Nzc3Nzc3Nzc3Nzc3Nzc3NydcbmNvbnN0IFpFUk9fT0ZGU0VUID0gJzAnLmNoYXJDb2RlQXQoMClcbmNvbnN0IFVTVEFSX01BR0lDID0gYjRhLmZyb20oWzB4NzUsIDB4NzMsIDB4NzQsIDB4NjEsIDB4NzIsIDB4MDBdKSAvLyB1c3RhclxceDAwXG5jb25zdCBVU1RBUl9WRVIgPSBiNGEuZnJvbShbWkVST19PRkZTRVQsIFpFUk9fT0ZGU0VUXSlcbmNvbnN0IEdOVV9NQUdJQyA9IGI0YS5mcm9tKFsweDc1LCAweDczLCAweDc0LCAweDYxLCAweDcyLCAweDIwXSkgLy8gdXN0YXJcXHgyMFxuY29uc3QgR05VX1ZFUiA9IGI0YS5mcm9tKFsweDIwLCAweDAwXSlcbmNvbnN0IE1BU0sgPSAwbzc3NzdcbmNvbnN0IE1BR0lDX09GRlNFVCA9IDI1N1xuY29uc3QgVkVSU0lPTl9PRkZTRVQgPSAyNjNcblxuZXhwb3J0cy5kZWNvZGVMb25nUGF0aCA9IGZ1bmN0aW9uIGRlY29kZUxvbmdQYXRoIChidWYsIGVuY29kaW5nKSB7XG4gIHJldHVybiBkZWNvZGVTdHIoYnVmLCAwLCBidWYubGVuZ3RoLCBlbmNvZGluZylcbn1cblxuZXhwb3J0cy5lbmNvZGVQYXggPSBmdW5jdGlvbiBlbmNvZGVQYXggKG9wdHMpIHsgLy8gVE9ETzogZW5jb2RlIG1vcmUgc3R1ZmYgaW4gcGF4XG4gIGxldCByZXN1bHQgPSAnJ1xuICBpZiAob3B0cy5uYW1lKSByZXN1bHQgKz0gYWRkTGVuZ3RoKCcgcGF0aD0nICsgb3B0cy5uYW1lICsgJ1xcbicpXG4gIGlmIChvcHRzLmxpbmtuYW1lKSByZXN1bHQgKz0gYWRkTGVuZ3RoKCcgbGlua3BhdGg9JyArIG9wdHMubGlua25hbWUgKyAnXFxuJylcbiAgY29uc3QgcGF4ID0gb3B0cy5wYXhcbiAgaWYgKHBheCkge1xuICAgIGZvciAoY29uc3Qga2V5IGluIHBheCkge1xuICAgICAgcmVzdWx0ICs9IGFkZExlbmd0aCgnICcgKyBrZXkgKyAnPScgKyBwYXhba2V5XSArICdcXG4nKVxuICAgIH1cbiAgfVxuICByZXR1cm4gYjRhLmZyb20ocmVzdWx0KVxufVxuXG5leHBvcnRzLmRlY29kZVBheCA9IGZ1bmN0aW9uIGRlY29kZVBheCAoYnVmKSB7XG4gIGNvbnN0IHJlc3VsdCA9IHt9XG5cbiAgd2hpbGUgKGJ1Zi5sZW5ndGgpIHtcbiAgICBsZXQgaSA9IDBcbiAgICB3aGlsZSAoaSA8IGJ1Zi5sZW5ndGggJiYgYnVmW2ldICE9PSAzMikgaSsrXG4gICAgY29uc3QgbGVuID0gcGFyc2VJbnQoYjRhLnRvU3RyaW5nKGJ1Zi5zdWJhcnJheSgwLCBpKSksIDEwKVxuICAgIGlmICghbGVuKSByZXR1cm4gcmVzdWx0XG5cbiAgICBjb25zdCBiID0gYjRhLnRvU3RyaW5nKGJ1Zi5zdWJhcnJheShpICsgMSwgbGVuIC0gMSkpXG4gICAgY29uc3Qga2V5SW5kZXggPSBiLmluZGV4T2YoJz0nKVxuICAgIGlmIChrZXlJbmRleCA9PT0gLTEpIHJldHVybiByZXN1bHRcbiAgICByZXN1bHRbYi5zbGljZSgwLCBrZXlJbmRleCldID0gYi5zbGljZShrZXlJbmRleCArIDEpXG5cbiAgICBidWYgPSBidWYuc3ViYXJyYXkobGVuKVxuICB9XG5cbiAgcmV0dXJuIHJlc3VsdFxufVxuXG5leHBvcnRzLmVuY29kZSA9IGZ1bmN0aW9uIGVuY29kZSAob3B0cykge1xuICBjb25zdCBidWYgPSBiNGEuYWxsb2MoNTEyKVxuICBsZXQgbmFtZSA9IG9wdHMubmFtZVxuICBsZXQgcHJlZml4ID0gJydcblxuICBpZiAob3B0cy50eXBlZmxhZyA9PT0gNSAmJiBuYW1lW25hbWUubGVuZ3RoIC0gMV0gIT09ICcvJykgbmFtZSArPSAnLydcbiAgaWYgKGI0YS5ieXRlTGVuZ3RoKG5hbWUpICE9PSBuYW1lLmxlbmd0aCkgcmV0dXJuIG51bGwgLy8gdXRmLThcblxuICB3aGlsZSAoYjRhLmJ5dGVMZW5ndGgobmFtZSkgPiAxMDApIHtcbiAgICBjb25zdCBpID0gbmFtZS5pbmRleE9mKCcvJylcbiAgICBpZiAoaSA9PT0gLTEpIHJldHVybiBudWxsXG4gICAgcHJlZml4ICs9IHByZWZpeCA/ICcvJyArIG5hbWUuc2xpY2UoMCwgaSkgOiBuYW1lLnNsaWNlKDAsIGkpXG4gICAgbmFtZSA9IG5hbWUuc2xpY2UoaSArIDEpXG4gIH1cblxuICBpZiAoYjRhLmJ5dGVMZW5ndGgobmFtZSkgPiAxMDAgfHwgYjRhLmJ5dGVMZW5ndGgocHJlZml4KSA+IDE1NSkgcmV0dXJuIG51bGxcbiAgaWYgKG9wdHMubGlua25hbWUgJiYgYjRhLmJ5dGVMZW5ndGgob3B0cy5saW5rbmFtZSkgPiAxMDApIHJldHVybiBudWxsXG5cbiAgYjRhLndyaXRlKGJ1ZiwgbmFtZSlcbiAgYjRhLndyaXRlKGJ1ZiwgZW5jb2RlT2N0KG9wdHMubW9kZSAmIE1BU0ssIDYpLCAxMDApXG4gIGI0YS53cml0ZShidWYsIGVuY29kZU9jdChvcHRzLnVpZCwgNiksIDEwOClcbiAgYjRhLndyaXRlKGJ1ZiwgZW5jb2RlT2N0KG9wdHMuZ2lkLCA2KSwgMTE2KVxuICBlbmNvZGVTaXplKG9wdHMuc2l6ZSwgYnVmLCAxMjQpXG4gIGI0YS53cml0ZShidWYsIGVuY29kZU9jdCgob3B0cy5tdGltZS5nZXRUaW1lKCkgLyAxMDAwKSB8IDAsIDExKSwgMTM2KVxuXG4gIGJ1ZlsxNTZdID0gWkVST19PRkZTRVQgKyB0b1R5cGVmbGFnKG9wdHMudHlwZSlcblxuICBpZiAob3B0cy5saW5rbmFtZSkgYjRhLndyaXRlKGJ1Ziwgb3B0cy5saW5rbmFtZSwgMTU3KVxuXG4gIGI0YS5jb3B5KFVTVEFSX01BR0lDLCBidWYsIE1BR0lDX09GRlNFVClcbiAgYjRhLmNvcHkoVVNUQVJfVkVSLCBidWYsIFZFUlNJT05fT0ZGU0VUKVxuICBpZiAob3B0cy51bmFtZSkgYjRhLndyaXRlKGJ1Ziwgb3B0cy51bmFtZSwgMjY1KVxuICBpZiAob3B0cy5nbmFtZSkgYjRhLndyaXRlKGJ1Ziwgb3B0cy5nbmFtZSwgMjk3KVxuICBiNGEud3JpdGUoYnVmLCBlbmNvZGVPY3Qob3B0cy5kZXZtYWpvciB8fCAwLCA2KSwgMzI5KVxuICBiNGEud3JpdGUoYnVmLCBlbmNvZGVPY3Qob3B0cy5kZXZtaW5vciB8fCAwLCA2KSwgMzM3KVxuXG4gIGlmIChwcmVmaXgpIGI0YS53cml0ZShidWYsIHByZWZpeCwgMzQ1KVxuXG4gIGI0YS53cml0ZShidWYsIGVuY29kZU9jdChja3N1bShidWYpLCA2KSwgMTQ4KVxuXG4gIHJldHVybiBidWZcbn1cblxuZXhwb3J0cy5kZWNvZGUgPSBmdW5jdGlvbiBkZWNvZGUgKGJ1ZiwgZmlsZW5hbWVFbmNvZGluZywgYWxsb3dVbmtub3duRm9ybWF0KSB7XG4gIGxldCB0eXBlZmxhZyA9IGJ1ZlsxNTZdID09PSAwID8gMCA6IGJ1ZlsxNTZdIC0gWkVST19PRkZTRVRcblxuICBsZXQgbmFtZSA9IGRlY29kZVN0cihidWYsIDAsIDEwMCwgZmlsZW5hbWVFbmNvZGluZylcbiAgY29uc3QgbW9kZSA9IGRlY29kZU9jdChidWYsIDEwMCwgOClcbiAgY29uc3QgdWlkID0gZGVjb2RlT2N0KGJ1ZiwgMTA4LCA4KVxuICBjb25zdCBnaWQgPSBkZWNvZGVPY3QoYnVmLCAxMTYsIDgpXG4gIGNvbnN0IHNpemUgPSBkZWNvZGVPY3QoYnVmLCAxMjQsIDEyKVxuICBjb25zdCBtdGltZSA9IGRlY29kZU9jdChidWYsIDEzNiwgMTIpXG4gIGNvbnN0IHR5cGUgPSB0b1R5cGUodHlwZWZsYWcpXG4gIGNvbnN0IGxpbmtuYW1lID0gYnVmWzE1N10gPT09IDAgPyBudWxsIDogZGVjb2RlU3RyKGJ1ZiwgMTU3LCAxMDAsIGZpbGVuYW1lRW5jb2RpbmcpXG4gIGNvbnN0IHVuYW1lID0gZGVjb2RlU3RyKGJ1ZiwgMjY1LCAzMilcbiAgY29uc3QgZ25hbWUgPSBkZWNvZGVTdHIoYnVmLCAyOTcsIDMyKVxuICBjb25zdCBkZXZtYWpvciA9IGRlY29kZU9jdChidWYsIDMyOSwgOClcbiAgY29uc3QgZGV2bWlub3IgPSBkZWNvZGVPY3QoYnVmLCAzMzcsIDgpXG5cbiAgY29uc3QgYyA9IGNrc3VtKGJ1ZilcblxuICAvLyBjaGVja3N1bSBpcyBzdGlsbCBpbml0aWFsIHZhbHVlIGlmIGhlYWRlciB3YXMgbnVsbC5cbiAgaWYgKGMgPT09IDggKiAzMikgcmV0dXJuIG51bGxcblxuICAvLyB2YWxpZCBjaGVja3N1bVxuICBpZiAoYyAhPT0gZGVjb2RlT2N0KGJ1ZiwgMTQ4LCA4KSkgdGhyb3cgbmV3IEVycm9yKCdJbnZhbGlkIHRhciBoZWFkZXIuIE1heWJlIHRoZSB0YXIgaXMgY29ycnVwdGVkIG9yIGl0IG5lZWRzIHRvIGJlIGd1bnppcHBlZD8nKVxuXG4gIGlmIChpc1VTVEFSKGJ1ZikpIHtcbiAgICAvLyB1c3RhciAocG9zaXgpIGZvcm1hdC5cbiAgICAvLyBwcmVwZW5kIHByZWZpeCwgaWYgcHJlc2VudC5cbiAgICBpZiAoYnVmWzM0NV0pIG5hbWUgPSBkZWNvZGVTdHIoYnVmLCAzNDUsIDE1NSwgZmlsZW5hbWVFbmNvZGluZykgKyAnLycgKyBuYW1lXG4gIH0gZWxzZSBpZiAoaXNHTlUoYnVmKSkge1xuICAgIC8vICdnbnUnLydvbGRnbnUnIGZvcm1hdC4gU2ltaWxhciB0byB1c3RhciwgYnV0IGhhcyBzdXBwb3J0IGZvciBpbmNyZW1lbnRhbCBhbmRcbiAgICAvLyBtdWx0aS12b2x1bWUgdGFyYmFsbHMuXG4gIH0gZWxzZSB7XG4gICAgaWYgKCFhbGxvd1Vua25vd25Gb3JtYXQpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignSW52YWxpZCB0YXIgaGVhZGVyOiB1bmtub3duIGZvcm1hdC4nKVxuICAgIH1cbiAgfVxuXG4gIC8vIHRvIHN1cHBvcnQgb2xkIHRhciB2ZXJzaW9ucyB0aGF0IHVzZSB0cmFpbGluZyAvIHRvIGluZGljYXRlIGRpcnNcbiAgaWYgKHR5cGVmbGFnID09PSAwICYmIG5hbWUgJiYgbmFtZVtuYW1lLmxlbmd0aCAtIDFdID09PSAnLycpIHR5cGVmbGFnID0gNVxuXG4gIHJldHVybiB7XG4gICAgbmFtZSxcbiAgICBtb2RlLFxuICAgIHVpZCxcbiAgICBnaWQsXG4gICAgc2l6ZSxcbiAgICBtdGltZTogbmV3IERhdGUoMTAwMCAqIG10aW1lKSxcbiAgICB0eXBlLFxuICAgIGxpbmtuYW1lLFxuICAgIHVuYW1lLFxuICAgIGduYW1lLFxuICAgIGRldm1ham9yLFxuICAgIGRldm1pbm9yLFxuICAgIHBheDogbnVsbFxuICB9XG59XG5cbmZ1bmN0aW9uIGlzVVNUQVIgKGJ1Zikge1xuICByZXR1cm4gYjRhLmVxdWFscyhVU1RBUl9NQUdJQywgYnVmLnN1YmFycmF5KE1BR0lDX09GRlNFVCwgTUFHSUNfT0ZGU0VUICsgNikpXG59XG5cbmZ1bmN0aW9uIGlzR05VIChidWYpIHtcbiAgcmV0dXJuIGI0YS5lcXVhbHMoR05VX01BR0lDLCBidWYuc3ViYXJyYXkoTUFHSUNfT0ZGU0VULCBNQUdJQ19PRkZTRVQgKyA2KSkgJiZcbiAgICBiNGEuZXF1YWxzKEdOVV9WRVIsIGJ1Zi5zdWJhcnJheShWRVJTSU9OX09GRlNFVCwgVkVSU0lPTl9PRkZTRVQgKyAyKSlcbn1cblxuZnVuY3Rpb24gY2xhbXAgKGluZGV4LCBsZW4sIGRlZmF1bHRWYWx1ZSkge1xuICBpZiAodHlwZW9mIGluZGV4ICE9PSAnbnVtYmVyJykgcmV0dXJuIGRlZmF1bHRWYWx1ZVxuICBpbmRleCA9IH5+aW5kZXggLy8gQ29lcmNlIHRvIGludGVnZXIuXG4gIGlmIChpbmRleCA+PSBsZW4pIHJldHVybiBsZW5cbiAgaWYgKGluZGV4ID49IDApIHJldHVybiBpbmRleFxuICBpbmRleCArPSBsZW5cbiAgaWYgKGluZGV4ID49IDApIHJldHVybiBpbmRleFxuICByZXR1cm4gMFxufVxuXG5mdW5jdGlvbiB0b1R5cGUgKGZsYWcpIHtcbiAgc3dpdGNoIChmbGFnKSB7XG4gICAgY2FzZSAwOlxuICAgICAgcmV0dXJuICdmaWxlJ1xuICAgIGNhc2UgMTpcbiAgICAgIHJldHVybiAnbGluaydcbiAgICBjYXNlIDI6XG4gICAgICByZXR1cm4gJ3N5bWxpbmsnXG4gICAgY2FzZSAzOlxuICAgICAgcmV0dXJuICdjaGFyYWN0ZXItZGV2aWNlJ1xuICAgIGNhc2UgNDpcbiAgICAgIHJldHVybiAnYmxvY2stZGV2aWNlJ1xuICAgIGNhc2UgNTpcbiAgICAgIHJldHVybiAnZGlyZWN0b3J5J1xuICAgIGNhc2UgNjpcbiAgICAgIHJldHVybiAnZmlmbydcbiAgICBjYXNlIDc6XG4gICAgICByZXR1cm4gJ2NvbnRpZ3VvdXMtZmlsZSdcbiAgICBjYXNlIDcyOlxuICAgICAgcmV0dXJuICdwYXgtaGVhZGVyJ1xuICAgIGNhc2UgNTU6XG4gICAgICByZXR1cm4gJ3BheC1nbG9iYWwtaGVhZGVyJ1xuICAgIGNhc2UgMjc6XG4gICAgICByZXR1cm4gJ2dudS1sb25nLWxpbmstcGF0aCdcbiAgICBjYXNlIDI4OlxuICAgIGNhc2UgMzA6XG4gICAgICByZXR1cm4gJ2dudS1sb25nLXBhdGgnXG4gIH1cblxuICByZXR1cm4gbnVsbFxufVxuXG5mdW5jdGlvbiB0b1R5cGVmbGFnIChmbGFnKSB7XG4gIHN3aXRjaCAoZmxhZykge1xuICAgIGNhc2UgJ2ZpbGUnOlxuICAgICAgcmV0dXJuIDBcbiAgICBjYXNlICdsaW5rJzpcbiAgICAgIHJldHVybiAxXG4gICAgY2FzZSAnc3ltbGluayc6XG4gICAgICByZXR1cm4gMlxuICAgIGNhc2UgJ2NoYXJhY3Rlci1kZXZpY2UnOlxuICAgICAgcmV0dXJuIDNcbiAgICBjYXNlICdibG9jay1kZXZpY2UnOlxuICAgICAgcmV0dXJuIDRcbiAgICBjYXNlICdkaXJlY3RvcnknOlxuICAgICAgcmV0dXJuIDVcbiAgICBjYXNlICdmaWZvJzpcbiAgICAgIHJldHVybiA2XG4gICAgY2FzZSAnY29udGlndW91cy1maWxlJzpcbiAgICAgIHJldHVybiA3XG4gICAgY2FzZSAncGF4LWhlYWRlcic6XG4gICAgICByZXR1cm4gNzJcbiAgfVxuXG4gIHJldHVybiAwXG59XG5cbmZ1bmN0aW9uIGluZGV4T2YgKGJsb2NrLCBudW0sIG9mZnNldCwgZW5kKSB7XG4gIGZvciAoOyBvZmZzZXQgPCBlbmQ7IG9mZnNldCsrKSB7XG4gICAgaWYgKGJsb2NrW29mZnNldF0gPT09IG51bSkgcmV0dXJuIG9mZnNldFxuICB9XG4gIHJldHVybiBlbmRcbn1cblxuZnVuY3Rpb24gY2tzdW0gKGJsb2NrKSB7XG4gIGxldCBzdW0gPSA4ICogMzJcbiAgZm9yIChsZXQgaSA9IDA7IGkgPCAxNDg7IGkrKykgc3VtICs9IGJsb2NrW2ldXG4gIGZvciAobGV0IGogPSAxNTY7IGogPCA1MTI7IGorKykgc3VtICs9IGJsb2NrW2pdXG4gIHJldHVybiBzdW1cbn1cblxuZnVuY3Rpb24gZW5jb2RlT2N0ICh2YWwsIG4pIHtcbiAgdmFsID0gdmFsLnRvU3RyaW5nKDgpXG4gIGlmICh2YWwubGVuZ3RoID4gbikgcmV0dXJuIFNFVkVOUy5zbGljZSgwLCBuKSArICcgJ1xuICByZXR1cm4gWkVST1Muc2xpY2UoMCwgbiAtIHZhbC5sZW5ndGgpICsgdmFsICsgJyAnXG59XG5cbmZ1bmN0aW9uIGVuY29kZVNpemVCaW4gKG51bSwgYnVmLCBvZmYpIHtcbiAgYnVmW29mZl0gPSAweDgwXG4gIGZvciAobGV0IGkgPSAxMTsgaSA+IDA7IGktLSkge1xuICAgIGJ1ZltvZmYgKyBpXSA9IG51bSAmIDB4ZmZcbiAgICBudW0gPSBNYXRoLmZsb29yKG51bSAvIDB4MTAwKVxuICB9XG59XG5cbmZ1bmN0aW9uIGVuY29kZVNpemUgKG51bSwgYnVmLCBvZmYpIHtcbiAgaWYgKG51bS50b1N0cmluZyg4KS5sZW5ndGggPiAxMSkge1xuICAgIGVuY29kZVNpemVCaW4obnVtLCBidWYsIG9mZilcbiAgfSBlbHNlIHtcbiAgICBiNGEud3JpdGUoYnVmLCBlbmNvZGVPY3QobnVtLCAxMSksIG9mZilcbiAgfVxufVxuXG4vKiBDb3BpZWQgZnJvbSB0aGUgbm9kZS10YXIgcmVwbyBhbmQgbW9kaWZpZWQgdG8gbWVldFxuICogdGFyLXN0cmVhbSBjb2Rpbmcgc3RhbmRhcmQuXG4gKlxuICogU291cmNlOiBodHRwczovL2dpdGh1Yi5jb20vbnBtL25vZGUtdGFyL2Jsb2IvNTFiNjYyN2ExZjM1N2QyZWI0MzNlNzM3OGU1ZjA1ZTgzYjdhYTZjZC9saWIvaGVhZGVyLmpzI0wzNDlcbiAqL1xuZnVuY3Rpb24gcGFyc2UyNTYgKGJ1Zikge1xuICAvLyBmaXJzdCBieXRlIE1VU1QgYmUgZWl0aGVyIDgwIG9yIEZGXG4gIC8vIDgwIGZvciBwb3NpdGl2ZSwgRkYgZm9yIDIncyBjb21wXG4gIGxldCBwb3NpdGl2ZVxuICBpZiAoYnVmWzBdID09PSAweDgwKSBwb3NpdGl2ZSA9IHRydWVcbiAgZWxzZSBpZiAoYnVmWzBdID09PSAweEZGKSBwb3NpdGl2ZSA9IGZhbHNlXG4gIGVsc2UgcmV0dXJuIG51bGxcblxuICAvLyBidWlsZCB1cCBhIGJhc2UtMjU2IHR1cGxlIGZyb20gdGhlIGxlYXN0IHNpZyB0byB0aGUgaGlnaGVzdFxuICBjb25zdCB0dXBsZSA9IFtdXG4gIGxldCBpXG4gIGZvciAoaSA9IGJ1Zi5sZW5ndGggLSAxOyBpID4gMDsgaS0tKSB7XG4gICAgY29uc3QgYnl0ZSA9IGJ1ZltpXVxuICAgIGlmIChwb3NpdGl2ZSkgdHVwbGUucHVzaChieXRlKVxuICAgIGVsc2UgdHVwbGUucHVzaCgweEZGIC0gYnl0ZSlcbiAgfVxuXG4gIGxldCBzdW0gPSAwXG4gIGNvbnN0IGwgPSB0dXBsZS5sZW5ndGhcbiAgZm9yIChpID0gMDsgaSA8IGw7IGkrKykge1xuICAgIHN1bSArPSB0dXBsZVtpXSAqIE1hdGgucG93KDI1NiwgaSlcbiAgfVxuXG4gIHJldHVybiBwb3NpdGl2ZSA/IHN1bSA6IC0xICogc3VtXG59XG5cbmZ1bmN0aW9uIGRlY29kZU9jdCAodmFsLCBvZmZzZXQsIGxlbmd0aCkge1xuICB2YWwgPSB2YWwuc3ViYXJyYXkob2Zmc2V0LCBvZmZzZXQgKyBsZW5ndGgpXG4gIG9mZnNldCA9IDBcblxuICAvLyBJZiBwcmVmaXhlZCB3aXRoIDB4ODAgdGhlbiBwYXJzZSBhcyBhIGJhc2UtMjU2IGludGVnZXJcbiAgaWYgKHZhbFtvZmZzZXRdICYgMHg4MCkge1xuICAgIHJldHVybiBwYXJzZTI1Nih2YWwpXG4gIH0gZWxzZSB7XG4gICAgLy8gT2xkZXIgdmVyc2lvbnMgb2YgdGFyIGNhbiBwcmVmaXggd2l0aCBzcGFjZXNcbiAgICB3aGlsZSAob2Zmc2V0IDwgdmFsLmxlbmd0aCAmJiB2YWxbb2Zmc2V0XSA9PT0gMzIpIG9mZnNldCsrXG4gICAgY29uc3QgZW5kID0gY2xhbXAoaW5kZXhPZih2YWwsIDMyLCBvZmZzZXQsIHZhbC5sZW5ndGgpLCB2YWwubGVuZ3RoLCB2YWwubGVuZ3RoKVxuICAgIHdoaWxlIChvZmZzZXQgPCBlbmQgJiYgdmFsW29mZnNldF0gPT09IDApIG9mZnNldCsrXG4gICAgaWYgKGVuZCA9PT0gb2Zmc2V0KSByZXR1cm4gMFxuICAgIHJldHVybiBwYXJzZUludChiNGEudG9TdHJpbmcodmFsLnN1YmFycmF5KG9mZnNldCwgZW5kKSksIDgpXG4gIH1cbn1cblxuZnVuY3Rpb24gZGVjb2RlU3RyICh2YWwsIG9mZnNldCwgbGVuZ3RoLCBlbmNvZGluZykge1xuICByZXR1cm4gYjRhLnRvU3RyaW5nKHZhbC5zdWJhcnJheShvZmZzZXQsIGluZGV4T2YodmFsLCAwLCBvZmZzZXQsIG9mZnNldCArIGxlbmd0aCkpLCBlbmNvZGluZylcbn1cblxuZnVuY3Rpb24gYWRkTGVuZ3RoIChzdHIpIHtcbiAgY29uc3QgbGVuID0gYjRhLmJ5dGVMZW5ndGgoc3RyKVxuICBsZXQgZGlnaXRzID0gTWF0aC5mbG9vcihNYXRoLmxvZyhsZW4pIC8gTWF0aC5sb2coMTApKSArIDFcbiAgaWYgKGxlbiArIGRpZ2l0cyA+PSBNYXRoLnBvdygxMCwgZGlnaXRzKSkgZGlnaXRzKytcblxuICByZXR1cm4gKGxlbiArIGRpZ2l0cykgKyBzdHJcbn1cbiIsCiAgICAiY29uc3QgeyBXcml0YWJsZSwgUmVhZGFibGUsIGdldFN0cmVhbUVycm9yIH0gPSByZXF1aXJlKCdzdHJlYW14JylcbmNvbnN0IEZJRk8gPSByZXF1aXJlKCdmYXN0LWZpZm8nKVxuY29uc3QgYjRhID0gcmVxdWlyZSgnYjRhJylcbmNvbnN0IGhlYWRlcnMgPSByZXF1aXJlKCcuL2hlYWRlcnMnKVxuXG5jb25zdCBFTVBUWSA9IGI0YS5hbGxvYygwKVxuXG5jbGFzcyBCdWZmZXJMaXN0IHtcbiAgY29uc3RydWN0b3IgKCkge1xuICAgIHRoaXMuYnVmZmVyZWQgPSAwXG4gICAgdGhpcy5zaGlmdGVkID0gMFxuICAgIHRoaXMucXVldWUgPSBuZXcgRklGTygpXG5cbiAgICB0aGlzLl9vZmZzZXQgPSAwXG4gIH1cblxuICBwdXNoIChidWZmZXIpIHtcbiAgICB0aGlzLmJ1ZmZlcmVkICs9IGJ1ZmZlci5ieXRlTGVuZ3RoXG4gICAgdGhpcy5xdWV1ZS5wdXNoKGJ1ZmZlcilcbiAgfVxuXG4gIHNoaWZ0Rmlyc3QgKHNpemUpIHtcbiAgICByZXR1cm4gdGhpcy5fYnVmZmVyZWQgPT09IDAgPyBudWxsIDogdGhpcy5fbmV4dChzaXplKVxuICB9XG5cbiAgc2hpZnQgKHNpemUpIHtcbiAgICBpZiAoc2l6ZSA+IHRoaXMuYnVmZmVyZWQpIHJldHVybiBudWxsXG4gICAgaWYgKHNpemUgPT09IDApIHJldHVybiBFTVBUWVxuXG4gICAgbGV0IGNodW5rID0gdGhpcy5fbmV4dChzaXplKVxuXG4gICAgaWYgKHNpemUgPT09IGNodW5rLmJ5dGVMZW5ndGgpIHJldHVybiBjaHVuayAvLyBsaWtlbHkgY2FzZVxuXG4gICAgY29uc3QgY2h1bmtzID0gW2NodW5rXVxuXG4gICAgd2hpbGUgKChzaXplIC09IGNodW5rLmJ5dGVMZW5ndGgpID4gMCkge1xuICAgICAgY2h1bmsgPSB0aGlzLl9uZXh0KHNpemUpXG4gICAgICBjaHVua3MucHVzaChjaHVuaylcbiAgICB9XG5cbiAgICByZXR1cm4gYjRhLmNvbmNhdChjaHVua3MpXG4gIH1cblxuICBfbmV4dCAoc2l6ZSkge1xuICAgIGNvbnN0IGJ1ZiA9IHRoaXMucXVldWUucGVlaygpXG4gICAgY29uc3QgcmVtID0gYnVmLmJ5dGVMZW5ndGggLSB0aGlzLl9vZmZzZXRcblxuICAgIGlmIChzaXplID49IHJlbSkge1xuICAgICAgY29uc3Qgc3ViID0gdGhpcy5fb2Zmc2V0ID8gYnVmLnN1YmFycmF5KHRoaXMuX29mZnNldCwgYnVmLmJ5dGVMZW5ndGgpIDogYnVmXG4gICAgICB0aGlzLnF1ZXVlLnNoaWZ0KClcbiAgICAgIHRoaXMuX29mZnNldCA9IDBcbiAgICAgIHRoaXMuYnVmZmVyZWQgLT0gcmVtXG4gICAgICB0aGlzLnNoaWZ0ZWQgKz0gcmVtXG4gICAgICByZXR1cm4gc3ViXG4gICAgfVxuXG4gICAgdGhpcy5idWZmZXJlZCAtPSBzaXplXG4gICAgdGhpcy5zaGlmdGVkICs9IHNpemVcblxuICAgIHJldHVybiBidWYuc3ViYXJyYXkodGhpcy5fb2Zmc2V0LCAodGhpcy5fb2Zmc2V0ICs9IHNpemUpKVxuICB9XG59XG5cbmNsYXNzIFNvdXJjZSBleHRlbmRzIFJlYWRhYmxlIHtcbiAgY29uc3RydWN0b3IgKHNlbGYsIGhlYWRlciwgb2Zmc2V0KSB7XG4gICAgc3VwZXIoKVxuXG4gICAgdGhpcy5oZWFkZXIgPSBoZWFkZXJcbiAgICB0aGlzLm9mZnNldCA9IG9mZnNldFxuXG4gICAgdGhpcy5fcGFyZW50ID0gc2VsZlxuICB9XG5cbiAgX3JlYWQgKGNiKSB7XG4gICAgaWYgKHRoaXMuaGVhZGVyLnNpemUgPT09IDApIHtcbiAgICAgIHRoaXMucHVzaChudWxsKVxuICAgIH1cbiAgICBpZiAodGhpcy5fcGFyZW50Ll9zdHJlYW0gPT09IHRoaXMpIHtcbiAgICAgIHRoaXMuX3BhcmVudC5fdXBkYXRlKClcbiAgICB9XG4gICAgY2IobnVsbClcbiAgfVxuXG4gIF9wcmVkZXN0cm95ICgpIHtcbiAgICB0aGlzLl9wYXJlbnQuZGVzdHJveShnZXRTdHJlYW1FcnJvcih0aGlzKSlcbiAgfVxuXG4gIF9kZXRhY2ggKCkge1xuICAgIGlmICh0aGlzLl9wYXJlbnQuX3N0cmVhbSA9PT0gdGhpcykge1xuICAgICAgdGhpcy5fcGFyZW50Ll9zdHJlYW0gPSBudWxsXG4gICAgICB0aGlzLl9wYXJlbnQuX21pc3NpbmcgPSBvdmVyZmxvdyh0aGlzLmhlYWRlci5zaXplKVxuICAgICAgdGhpcy5fcGFyZW50Ll91cGRhdGUoKVxuICAgIH1cbiAgfVxuXG4gIF9kZXN0cm95IChjYikge1xuICAgIHRoaXMuX2RldGFjaCgpXG4gICAgY2IobnVsbClcbiAgfVxufVxuXG5jbGFzcyBFeHRyYWN0IGV4dGVuZHMgV3JpdGFibGUge1xuICBjb25zdHJ1Y3RvciAob3B0cykge1xuICAgIHN1cGVyKG9wdHMpXG5cbiAgICBpZiAoIW9wdHMpIG9wdHMgPSB7fVxuXG4gICAgdGhpcy5fYnVmZmVyID0gbmV3IEJ1ZmZlckxpc3QoKVxuICAgIHRoaXMuX29mZnNldCA9IDBcbiAgICB0aGlzLl9oZWFkZXIgPSBudWxsXG4gICAgdGhpcy5fc3RyZWFtID0gbnVsbFxuICAgIHRoaXMuX21pc3NpbmcgPSAwXG4gICAgdGhpcy5fbG9uZ0hlYWRlciA9IGZhbHNlXG4gICAgdGhpcy5fY2FsbGJhY2sgPSBub29wXG4gICAgdGhpcy5fbG9ja2VkID0gZmFsc2VcbiAgICB0aGlzLl9maW5pc2hlZCA9IGZhbHNlXG4gICAgdGhpcy5fcGF4ID0gbnVsbFxuICAgIHRoaXMuX3BheEdsb2JhbCA9IG51bGxcbiAgICB0aGlzLl9nbnVMb25nUGF0aCA9IG51bGxcbiAgICB0aGlzLl9nbnVMb25nTGlua1BhdGggPSBudWxsXG4gICAgdGhpcy5fZmlsZW5hbWVFbmNvZGluZyA9IG9wdHMuZmlsZW5hbWVFbmNvZGluZyB8fCAndXRmLTgnXG4gICAgdGhpcy5fYWxsb3dVbmtub3duRm9ybWF0ID0gISFvcHRzLmFsbG93VW5rbm93bkZvcm1hdFxuICAgIHRoaXMuX3VubG9ja0JvdW5kID0gdGhpcy5fdW5sb2NrLmJpbmQodGhpcylcbiAgfVxuXG4gIF91bmxvY2sgKGVycikge1xuICAgIHRoaXMuX2xvY2tlZCA9IGZhbHNlXG5cbiAgICBpZiAoZXJyKSB7XG4gICAgICB0aGlzLmRlc3Ryb3koZXJyKVxuICAgICAgdGhpcy5fY29udGludWVXcml0ZShlcnIpXG4gICAgICByZXR1cm5cbiAgICB9XG5cbiAgICB0aGlzLl91cGRhdGUoKVxuICB9XG5cbiAgX2NvbnN1bWVIZWFkZXIgKCkge1xuICAgIGlmICh0aGlzLl9sb2NrZWQpIHJldHVybiBmYWxzZVxuXG4gICAgdGhpcy5fb2Zmc2V0ID0gdGhpcy5fYnVmZmVyLnNoaWZ0ZWRcblxuICAgIHRyeSB7XG4gICAgICB0aGlzLl9oZWFkZXIgPSBoZWFkZXJzLmRlY29kZSh0aGlzLl9idWZmZXIuc2hpZnQoNTEyKSwgdGhpcy5fZmlsZW5hbWVFbmNvZGluZywgdGhpcy5fYWxsb3dVbmtub3duRm9ybWF0KVxuICAgIH0gY2F0Y2ggKGVycikge1xuICAgICAgdGhpcy5fY29udGludWVXcml0ZShlcnIpXG4gICAgICByZXR1cm4gZmFsc2VcbiAgICB9XG5cbiAgICBpZiAoIXRoaXMuX2hlYWRlcikgcmV0dXJuIHRydWVcblxuICAgIHN3aXRjaCAodGhpcy5faGVhZGVyLnR5cGUpIHtcbiAgICAgIGNhc2UgJ2dudS1sb25nLXBhdGgnOlxuICAgICAgY2FzZSAnZ251LWxvbmctbGluay1wYXRoJzpcbiAgICAgIGNhc2UgJ3BheC1nbG9iYWwtaGVhZGVyJzpcbiAgICAgIGNhc2UgJ3BheC1oZWFkZXInOlxuICAgICAgICB0aGlzLl9sb25nSGVhZGVyID0gdHJ1ZVxuICAgICAgICB0aGlzLl9taXNzaW5nID0gdGhpcy5faGVhZGVyLnNpemVcbiAgICAgICAgcmV0dXJuIHRydWVcbiAgICB9XG5cbiAgICB0aGlzLl9sb2NrZWQgPSB0cnVlXG4gICAgdGhpcy5fYXBwbHlMb25nSGVhZGVycygpXG5cbiAgICBpZiAodGhpcy5faGVhZGVyLnNpemUgPT09IDAgfHwgdGhpcy5faGVhZGVyLnR5cGUgPT09ICdkaXJlY3RvcnknKSB7XG4gICAgICB0aGlzLmVtaXQoJ2VudHJ5JywgdGhpcy5faGVhZGVyLCB0aGlzLl9jcmVhdGVTdHJlYW0oKSwgdGhpcy5fdW5sb2NrQm91bmQpXG4gICAgICByZXR1cm4gdHJ1ZVxuICAgIH1cblxuICAgIHRoaXMuX3N0cmVhbSA9IHRoaXMuX2NyZWF0ZVN0cmVhbSgpXG4gICAgdGhpcy5fbWlzc2luZyA9IHRoaXMuX2hlYWRlci5zaXplXG5cbiAgICB0aGlzLmVtaXQoJ2VudHJ5JywgdGhpcy5faGVhZGVyLCB0aGlzLl9zdHJlYW0sIHRoaXMuX3VubG9ja0JvdW5kKVxuICAgIHJldHVybiB0cnVlXG4gIH1cblxuICBfYXBwbHlMb25nSGVhZGVycyAoKSB7XG4gICAgaWYgKHRoaXMuX2dudUxvbmdQYXRoKSB7XG4gICAgICB0aGlzLl9oZWFkZXIubmFtZSA9IHRoaXMuX2dudUxvbmdQYXRoXG4gICAgICB0aGlzLl9nbnVMb25nUGF0aCA9IG51bGxcbiAgICB9XG5cbiAgICBpZiAodGhpcy5fZ251TG9uZ0xpbmtQYXRoKSB7XG4gICAgICB0aGlzLl9oZWFkZXIubGlua25hbWUgPSB0aGlzLl9nbnVMb25nTGlua1BhdGhcbiAgICAgIHRoaXMuX2dudUxvbmdMaW5rUGF0aCA9IG51bGxcbiAgICB9XG5cbiAgICBpZiAodGhpcy5fcGF4KSB7XG4gICAgICBpZiAodGhpcy5fcGF4LnBhdGgpIHRoaXMuX2hlYWRlci5uYW1lID0gdGhpcy5fcGF4LnBhdGhcbiAgICAgIGlmICh0aGlzLl9wYXgubGlua3BhdGgpIHRoaXMuX2hlYWRlci5saW5rbmFtZSA9IHRoaXMuX3BheC5saW5rcGF0aFxuICAgICAgaWYgKHRoaXMuX3BheC5zaXplKSB0aGlzLl9oZWFkZXIuc2l6ZSA9IHBhcnNlSW50KHRoaXMuX3BheC5zaXplLCAxMClcbiAgICAgIHRoaXMuX2hlYWRlci5wYXggPSB0aGlzLl9wYXhcbiAgICAgIHRoaXMuX3BheCA9IG51bGxcbiAgICB9XG4gIH1cblxuICBfZGVjb2RlTG9uZ0hlYWRlciAoYnVmKSB7XG4gICAgc3dpdGNoICh0aGlzLl9oZWFkZXIudHlwZSkge1xuICAgICAgY2FzZSAnZ251LWxvbmctcGF0aCc6XG4gICAgICAgIHRoaXMuX2dudUxvbmdQYXRoID0gaGVhZGVycy5kZWNvZGVMb25nUGF0aChidWYsIHRoaXMuX2ZpbGVuYW1lRW5jb2RpbmcpXG4gICAgICAgIGJyZWFrXG4gICAgICBjYXNlICdnbnUtbG9uZy1saW5rLXBhdGgnOlxuICAgICAgICB0aGlzLl9nbnVMb25nTGlua1BhdGggPSBoZWFkZXJzLmRlY29kZUxvbmdQYXRoKGJ1ZiwgdGhpcy5fZmlsZW5hbWVFbmNvZGluZylcbiAgICAgICAgYnJlYWtcbiAgICAgIGNhc2UgJ3BheC1nbG9iYWwtaGVhZGVyJzpcbiAgICAgICAgdGhpcy5fcGF4R2xvYmFsID0gaGVhZGVycy5kZWNvZGVQYXgoYnVmKVxuICAgICAgICBicmVha1xuICAgICAgY2FzZSAncGF4LWhlYWRlcic6XG4gICAgICAgIHRoaXMuX3BheCA9IHRoaXMuX3BheEdsb2JhbCA9PT0gbnVsbFxuICAgICAgICAgID8gaGVhZGVycy5kZWNvZGVQYXgoYnVmKVxuICAgICAgICAgIDogT2JqZWN0LmFzc2lnbih7fSwgdGhpcy5fcGF4R2xvYmFsLCBoZWFkZXJzLmRlY29kZVBheChidWYpKVxuICAgICAgICBicmVha1xuICAgIH1cbiAgfVxuXG4gIF9jb25zdW1lTG9uZ0hlYWRlciAoKSB7XG4gICAgdGhpcy5fbG9uZ0hlYWRlciA9IGZhbHNlXG4gICAgdGhpcy5fbWlzc2luZyA9IG92ZXJmbG93KHRoaXMuX2hlYWRlci5zaXplKVxuXG4gICAgY29uc3QgYnVmID0gdGhpcy5fYnVmZmVyLnNoaWZ0KHRoaXMuX2hlYWRlci5zaXplKVxuXG4gICAgdHJ5IHtcbiAgICAgIHRoaXMuX2RlY29kZUxvbmdIZWFkZXIoYnVmKVxuICAgIH0gY2F0Y2ggKGVycikge1xuICAgICAgdGhpcy5fY29udGludWVXcml0ZShlcnIpXG4gICAgICByZXR1cm4gZmFsc2VcbiAgICB9XG5cbiAgICByZXR1cm4gdHJ1ZVxuICB9XG5cbiAgX2NvbnN1bWVTdHJlYW0gKCkge1xuICAgIGNvbnN0IGJ1ZiA9IHRoaXMuX2J1ZmZlci5zaGlmdEZpcnN0KHRoaXMuX21pc3NpbmcpXG4gICAgaWYgKGJ1ZiA9PT0gbnVsbCkgcmV0dXJuIGZhbHNlXG5cbiAgICB0aGlzLl9taXNzaW5nIC09IGJ1Zi5ieXRlTGVuZ3RoXG4gICAgY29uc3QgZHJhaW5lZCA9IHRoaXMuX3N0cmVhbS5wdXNoKGJ1ZilcblxuICAgIGlmICh0aGlzLl9taXNzaW5nID09PSAwKSB7XG4gICAgICB0aGlzLl9zdHJlYW0ucHVzaChudWxsKVxuICAgICAgaWYgKGRyYWluZWQpIHRoaXMuX3N0cmVhbS5fZGV0YWNoKClcbiAgICAgIHJldHVybiBkcmFpbmVkICYmIHRoaXMuX2xvY2tlZCA9PT0gZmFsc2VcbiAgICB9XG5cbiAgICByZXR1cm4gZHJhaW5lZFxuICB9XG5cbiAgX2NyZWF0ZVN0cmVhbSAoKSB7XG4gICAgcmV0dXJuIG5ldyBTb3VyY2UodGhpcywgdGhpcy5faGVhZGVyLCB0aGlzLl9vZmZzZXQpXG4gIH1cblxuICBfdXBkYXRlICgpIHtcbiAgICB3aGlsZSAodGhpcy5fYnVmZmVyLmJ1ZmZlcmVkID4gMCAmJiAhdGhpcy5kZXN0cm95aW5nKSB7XG4gICAgICBpZiAodGhpcy5fbWlzc2luZyA+IDApIHtcbiAgICAgICAgaWYgKHRoaXMuX3N0cmVhbSAhPT0gbnVsbCkge1xuICAgICAgICAgIGlmICh0aGlzLl9jb25zdW1lU3RyZWFtKCkgPT09IGZhbHNlKSByZXR1cm5cbiAgICAgICAgICBjb250aW51ZVxuICAgICAgICB9XG5cbiAgICAgICAgaWYgKHRoaXMuX2xvbmdIZWFkZXIgPT09IHRydWUpIHtcbiAgICAgICAgICBpZiAodGhpcy5fbWlzc2luZyA+IHRoaXMuX2J1ZmZlci5idWZmZXJlZCkgYnJlYWtcbiAgICAgICAgICBpZiAodGhpcy5fY29uc3VtZUxvbmdIZWFkZXIoKSA9PT0gZmFsc2UpIHJldHVybiBmYWxzZVxuICAgICAgICAgIGNvbnRpbnVlXG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCBpZ25vcmUgPSB0aGlzLl9idWZmZXIuc2hpZnRGaXJzdCh0aGlzLl9taXNzaW5nKVxuICAgICAgICBpZiAoaWdub3JlICE9PSBudWxsKSB0aGlzLl9taXNzaW5nIC09IGlnbm9yZS5ieXRlTGVuZ3RoXG4gICAgICAgIGNvbnRpbnVlXG4gICAgICB9XG5cbiAgICAgIGlmICh0aGlzLl9idWZmZXIuYnVmZmVyZWQgPCA1MTIpIGJyZWFrXG4gICAgICBpZiAodGhpcy5fc3RyZWFtICE9PSBudWxsIHx8IHRoaXMuX2NvbnN1bWVIZWFkZXIoKSA9PT0gZmFsc2UpIHJldHVyblxuICAgIH1cblxuICAgIHRoaXMuX2NvbnRpbnVlV3JpdGUobnVsbClcbiAgfVxuXG4gIF9jb250aW51ZVdyaXRlIChlcnIpIHtcbiAgICBjb25zdCBjYiA9IHRoaXMuX2NhbGxiYWNrXG4gICAgdGhpcy5fY2FsbGJhY2sgPSBub29wXG4gICAgY2IoZXJyKVxuICB9XG5cbiAgX3dyaXRlIChkYXRhLCBjYikge1xuICAgIHRoaXMuX2NhbGxiYWNrID0gY2JcbiAgICB0aGlzLl9idWZmZXIucHVzaChkYXRhKVxuICAgIHRoaXMuX3VwZGF0ZSgpXG4gIH1cblxuICBfZmluYWwgKGNiKSB7XG4gICAgdGhpcy5fZmluaXNoZWQgPSB0aGlzLl9taXNzaW5nID09PSAwICYmIHRoaXMuX2J1ZmZlci5idWZmZXJlZCA9PT0gMFxuICAgIGNiKHRoaXMuX2ZpbmlzaGVkID8gbnVsbCA6IG5ldyBFcnJvcignVW5leHBlY3RlZCBlbmQgb2YgZGF0YScpKVxuICB9XG5cbiAgX3ByZWRlc3Ryb3kgKCkge1xuICAgIHRoaXMuX2NvbnRpbnVlV3JpdGUobnVsbClcbiAgfVxuXG4gIF9kZXN0cm95IChjYikge1xuICAgIGlmICh0aGlzLl9zdHJlYW0pIHRoaXMuX3N0cmVhbS5kZXN0cm95KGdldFN0cmVhbUVycm9yKHRoaXMpKVxuICAgIGNiKG51bGwpXG4gIH1cblxuICBbU3ltYm9sLmFzeW5jSXRlcmF0b3JdICgpIHtcbiAgICBsZXQgZXJyb3IgPSBudWxsXG5cbiAgICBsZXQgcHJvbWlzZVJlc29sdmUgPSBudWxsXG4gICAgbGV0IHByb21pc2VSZWplY3QgPSBudWxsXG5cbiAgICBsZXQgZW50cnlTdHJlYW0gPSBudWxsXG4gICAgbGV0IGVudHJ5Q2FsbGJhY2sgPSBudWxsXG5cbiAgICBjb25zdCBleHRyYWN0ID0gdGhpc1xuXG4gICAgdGhpcy5vbignZW50cnknLCBvbmVudHJ5KVxuICAgIHRoaXMub24oJ2Vycm9yJywgKGVycikgPT4geyBlcnJvciA9IGVyciB9KVxuICAgIHRoaXMub24oJ2Nsb3NlJywgb25jbG9zZSlcblxuICAgIHJldHVybiB7XG4gICAgICBbU3ltYm9sLmFzeW5jSXRlcmF0b3JdICgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXNcbiAgICAgIH0sXG4gICAgICBuZXh0ICgpIHtcbiAgICAgICAgcmV0dXJuIG5ldyBQcm9taXNlKG9ubmV4dClcbiAgICAgIH0sXG4gICAgICByZXR1cm4gKCkge1xuICAgICAgICByZXR1cm4gZGVzdHJveShudWxsKVxuICAgICAgfSxcbiAgICAgIHRocm93IChlcnIpIHtcbiAgICAgICAgcmV0dXJuIGRlc3Ryb3koZXJyKVxuICAgICAgfVxuICAgIH1cblxuICAgIGZ1bmN0aW9uIGNvbnN1bWVDYWxsYmFjayAoZXJyKSB7XG4gICAgICBpZiAoIWVudHJ5Q2FsbGJhY2spIHJldHVyblxuICAgICAgY29uc3QgY2IgPSBlbnRyeUNhbGxiYWNrXG4gICAgICBlbnRyeUNhbGxiYWNrID0gbnVsbFxuICAgICAgY2IoZXJyKVxuICAgIH1cblxuICAgIGZ1bmN0aW9uIG9ubmV4dCAocmVzb2x2ZSwgcmVqZWN0KSB7XG4gICAgICBpZiAoZXJyb3IpIHtcbiAgICAgICAgcmV0dXJuIHJlamVjdChlcnJvcilcbiAgICAgIH1cblxuICAgICAgaWYgKGVudHJ5U3RyZWFtKSB7XG4gICAgICAgIHJlc29sdmUoeyB2YWx1ZTogZW50cnlTdHJlYW0sIGRvbmU6IGZhbHNlIH0pXG4gICAgICAgIGVudHJ5U3RyZWFtID0gbnVsbFxuICAgICAgICByZXR1cm5cbiAgICAgIH1cblxuICAgICAgcHJvbWlzZVJlc29sdmUgPSByZXNvbHZlXG4gICAgICBwcm9taXNlUmVqZWN0ID0gcmVqZWN0XG5cbiAgICAgIGNvbnN1bWVDYWxsYmFjayhudWxsKVxuXG4gICAgICBpZiAoZXh0cmFjdC5fZmluaXNoZWQgJiYgcHJvbWlzZVJlc29sdmUpIHtcbiAgICAgICAgcHJvbWlzZVJlc29sdmUoeyB2YWx1ZTogdW5kZWZpbmVkLCBkb25lOiB0cnVlIH0pXG4gICAgICAgIHByb21pc2VSZXNvbHZlID0gcHJvbWlzZVJlamVjdCA9IG51bGxcbiAgICAgIH1cbiAgICB9XG5cbiAgICBmdW5jdGlvbiBvbmVudHJ5IChoZWFkZXIsIHN0cmVhbSwgY2FsbGJhY2spIHtcbiAgICAgIGVudHJ5Q2FsbGJhY2sgPSBjYWxsYmFja1xuICAgICAgc3RyZWFtLm9uKCdlcnJvcicsIG5vb3ApIC8vIG5vIHdheSBhcm91bmQgdGhpcyBkdWUgdG8gdGljayBzaWxseW5lc3NcblxuICAgICAgaWYgKHByb21pc2VSZXNvbHZlKSB7XG4gICAgICAgIHByb21pc2VSZXNvbHZlKHsgdmFsdWU6IHN0cmVhbSwgZG9uZTogZmFsc2UgfSlcbiAgICAgICAgcHJvbWlzZVJlc29sdmUgPSBwcm9taXNlUmVqZWN0ID0gbnVsbFxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgZW50cnlTdHJlYW0gPSBzdHJlYW1cbiAgICAgIH1cbiAgICB9XG5cbiAgICBmdW5jdGlvbiBvbmNsb3NlICgpIHtcbiAgICAgIGNvbnN1bWVDYWxsYmFjayhlcnJvcilcbiAgICAgIGlmICghcHJvbWlzZVJlc29sdmUpIHJldHVyblxuICAgICAgaWYgKGVycm9yKSBwcm9taXNlUmVqZWN0KGVycm9yKVxuICAgICAgZWxzZSBwcm9taXNlUmVzb2x2ZSh7IHZhbHVlOiB1bmRlZmluZWQsIGRvbmU6IHRydWUgfSlcbiAgICAgIHByb21pc2VSZXNvbHZlID0gcHJvbWlzZVJlamVjdCA9IG51bGxcbiAgICB9XG5cbiAgICBmdW5jdGlvbiBkZXN0cm95IChlcnIpIHtcbiAgICAgIGV4dHJhY3QuZGVzdHJveShlcnIpXG4gICAgICBjb25zdW1lQ2FsbGJhY2soZXJyKVxuICAgICAgcmV0dXJuIG5ldyBQcm9taXNlKChyZXNvbHZlLCByZWplY3QpID0+IHtcbiAgICAgICAgaWYgKGV4dHJhY3QuZGVzdHJveWVkKSByZXR1cm4gcmVzb2x2ZSh7IHZhbHVlOiB1bmRlZmluZWQsIGRvbmU6IHRydWUgfSlcbiAgICAgICAgZXh0cmFjdC5vbmNlKCdjbG9zZScsIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICBpZiAoZXJyKSByZWplY3QoZXJyKVxuICAgICAgICAgIGVsc2UgcmVzb2x2ZSh7IHZhbHVlOiB1bmRlZmluZWQsIGRvbmU6IHRydWUgfSlcbiAgICAgICAgfSlcbiAgICAgIH0pXG4gICAgfVxuICB9XG59XG5cbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gZXh0cmFjdCAob3B0cykge1xuICByZXR1cm4gbmV3IEV4dHJhY3Qob3B0cylcbn1cblxuZnVuY3Rpb24gbm9vcCAoKSB7fVxuXG5mdW5jdGlvbiBvdmVyZmxvdyAoc2l6ZSkge1xuICBzaXplICY9IDUxMVxuICByZXR1cm4gc2l6ZSAmJiA1MTIgLSBzaXplXG59XG4iLAogICAgImNvbnN0IGNvbnN0YW50cyA9IHsgLy8ganVzdCBmb3IgZW52cyB3aXRob3V0IGZzXG4gIFNfSUZNVDogNjE0NDAsXG4gIFNfSUZESVI6IDE2Mzg0LFxuICBTX0lGQ0hSOiA4MTkyLFxuICBTX0lGQkxLOiAyNDU3NixcbiAgU19JRklGTzogNDA5NixcbiAgU19JRkxOSzogNDA5NjBcbn1cblxudHJ5IHtcbiAgbW9kdWxlLmV4cG9ydHMgPSByZXF1aXJlKCdmcycpLmNvbnN0YW50cyB8fCBjb25zdGFudHNcbn0gY2F0Y2gge1xuICBtb2R1bGUuZXhwb3J0cyA9IGNvbnN0YW50c1xufVxuIiwKICAgICJjb25zdCB7IFJlYWRhYmxlLCBXcml0YWJsZSwgZ2V0U3RyZWFtRXJyb3IgfSA9IHJlcXVpcmUoJ3N0cmVhbXgnKVxuY29uc3QgYjRhID0gcmVxdWlyZSgnYjRhJylcblxuY29uc3QgY29uc3RhbnRzID0gcmVxdWlyZSgnLi9jb25zdGFudHMnKVxuY29uc3QgaGVhZGVycyA9IHJlcXVpcmUoJy4vaGVhZGVycycpXG5cbmNvbnN0IERNT0RFID0gMG83NTVcbmNvbnN0IEZNT0RFID0gMG82NDRcblxuY29uc3QgRU5EX09GX1RBUiA9IGI0YS5hbGxvYygxMDI0KVxuXG5jbGFzcyBTaW5rIGV4dGVuZHMgV3JpdGFibGUge1xuICBjb25zdHJ1Y3RvciAocGFjaywgaGVhZGVyLCBjYWxsYmFjaykge1xuICAgIHN1cGVyKHsgbWFwV3JpdGFibGUsIGVhZ2VyT3BlbjogdHJ1ZSB9KVxuXG4gICAgdGhpcy53cml0dGVuID0gMFxuICAgIHRoaXMuaGVhZGVyID0gaGVhZGVyXG5cbiAgICB0aGlzLl9jYWxsYmFjayA9IGNhbGxiYWNrXG4gICAgdGhpcy5fbGlua25hbWUgPSBudWxsXG4gICAgdGhpcy5faXNMaW5rbmFtZSA9IGhlYWRlci50eXBlID09PSAnc3ltbGluaycgJiYgIWhlYWRlci5saW5rbmFtZVxuICAgIHRoaXMuX2lzVm9pZCA9IGhlYWRlci50eXBlICE9PSAnZmlsZScgJiYgaGVhZGVyLnR5cGUgIT09ICdjb250aWd1b3VzLWZpbGUnXG4gICAgdGhpcy5fZmluaXNoZWQgPSBmYWxzZVxuICAgIHRoaXMuX3BhY2sgPSBwYWNrXG4gICAgdGhpcy5fb3BlbkNhbGxiYWNrID0gbnVsbFxuXG4gICAgaWYgKHRoaXMuX3BhY2suX3N0cmVhbSA9PT0gbnVsbCkgdGhpcy5fcGFjay5fc3RyZWFtID0gdGhpc1xuICAgIGVsc2UgdGhpcy5fcGFjay5fcGVuZGluZy5wdXNoKHRoaXMpXG4gIH1cblxuICBfb3BlbiAoY2IpIHtcbiAgICB0aGlzLl9vcGVuQ2FsbGJhY2sgPSBjYlxuICAgIGlmICh0aGlzLl9wYWNrLl9zdHJlYW0gPT09IHRoaXMpIHRoaXMuX2NvbnRpbnVlT3BlbigpXG4gIH1cblxuICBfY29udGludWVQYWNrIChlcnIpIHtcbiAgICBpZiAodGhpcy5fY2FsbGJhY2sgPT09IG51bGwpIHJldHVyblxuXG4gICAgY29uc3QgY2FsbGJhY2sgPSB0aGlzLl9jYWxsYmFja1xuICAgIHRoaXMuX2NhbGxiYWNrID0gbnVsbFxuXG4gICAgY2FsbGJhY2soZXJyKVxuICB9XG5cbiAgX2NvbnRpbnVlT3BlbiAoKSB7XG4gICAgaWYgKHRoaXMuX3BhY2suX3N0cmVhbSA9PT0gbnVsbCkgdGhpcy5fcGFjay5fc3RyZWFtID0gdGhpc1xuXG4gICAgY29uc3QgY2IgPSB0aGlzLl9vcGVuQ2FsbGJhY2tcbiAgICB0aGlzLl9vcGVuQ2FsbGJhY2sgPSBudWxsXG4gICAgaWYgKGNiID09PSBudWxsKSByZXR1cm5cblxuICAgIGlmICh0aGlzLl9wYWNrLmRlc3Ryb3lpbmcpIHJldHVybiBjYihuZXcgRXJyb3IoJ3BhY2sgc3RyZWFtIGRlc3Ryb3llZCcpKVxuICAgIGlmICh0aGlzLl9wYWNrLl9maW5hbGl6ZWQpIHJldHVybiBjYihuZXcgRXJyb3IoJ3BhY2sgc3RyZWFtIGlzIGFscmVhZHkgZmluYWxpemVkJykpXG5cbiAgICB0aGlzLl9wYWNrLl9zdHJlYW0gPSB0aGlzXG5cbiAgICBpZiAoIXRoaXMuX2lzTGlua25hbWUpIHtcbiAgICAgIHRoaXMuX3BhY2suX2VuY29kZSh0aGlzLmhlYWRlcilcbiAgICB9XG5cbiAgICBpZiAodGhpcy5faXNWb2lkKSB7XG4gICAgICB0aGlzLl9maW5pc2goKVxuICAgICAgdGhpcy5fY29udGludWVQYWNrKG51bGwpXG4gICAgfVxuXG4gICAgY2IobnVsbClcbiAgfVxuXG4gIF93cml0ZSAoZGF0YSwgY2IpIHtcbiAgICBpZiAodGhpcy5faXNMaW5rbmFtZSkge1xuICAgICAgdGhpcy5fbGlua25hbWUgPSB0aGlzLl9saW5rbmFtZSA/IGI0YS5jb25jYXQoW3RoaXMuX2xpbmtuYW1lLCBkYXRhXSkgOiBkYXRhXG4gICAgICByZXR1cm4gY2IobnVsbClcbiAgICB9XG5cbiAgICBpZiAodGhpcy5faXNWb2lkKSB7XG4gICAgICBpZiAoZGF0YS5ieXRlTGVuZ3RoID4gMCkge1xuICAgICAgICByZXR1cm4gY2IobmV3IEVycm9yKCdObyBib2R5IGFsbG93ZWQgZm9yIHRoaXMgZW50cnknKSlcbiAgICAgIH1cbiAgICAgIHJldHVybiBjYigpXG4gICAgfVxuXG4gICAgdGhpcy53cml0dGVuICs9IGRhdGEuYnl0ZUxlbmd0aFxuICAgIGlmICh0aGlzLl9wYWNrLnB1c2goZGF0YSkpIHJldHVybiBjYigpXG4gICAgdGhpcy5fcGFjay5fZHJhaW4gPSBjYlxuICB9XG5cbiAgX2ZpbmlzaCAoKSB7XG4gICAgaWYgKHRoaXMuX2ZpbmlzaGVkKSByZXR1cm5cbiAgICB0aGlzLl9maW5pc2hlZCA9IHRydWVcblxuICAgIGlmICh0aGlzLl9pc0xpbmtuYW1lKSB7XG4gICAgICB0aGlzLmhlYWRlci5saW5rbmFtZSA9IHRoaXMuX2xpbmtuYW1lID8gYjRhLnRvU3RyaW5nKHRoaXMuX2xpbmtuYW1lLCAndXRmLTgnKSA6ICcnXG4gICAgICB0aGlzLl9wYWNrLl9lbmNvZGUodGhpcy5oZWFkZXIpXG4gICAgfVxuXG4gICAgb3ZlcmZsb3codGhpcy5fcGFjaywgdGhpcy5oZWFkZXIuc2l6ZSlcblxuICAgIHRoaXMuX3BhY2suX2RvbmUodGhpcylcbiAgfVxuXG4gIF9maW5hbCAoY2IpIHtcbiAgICBpZiAodGhpcy53cml0dGVuICE9PSB0aGlzLmhlYWRlci5zaXplKSB7IC8vIGNvcnJ1cHRpbmcgdGFyXG4gICAgICByZXR1cm4gY2IobmV3IEVycm9yKCdTaXplIG1pc21hdGNoJykpXG4gICAgfVxuXG4gICAgdGhpcy5fZmluaXNoKClcbiAgICBjYihudWxsKVxuICB9XG5cbiAgX2dldEVycm9yICgpIHtcbiAgICByZXR1cm4gZ2V0U3RyZWFtRXJyb3IodGhpcykgfHwgbmV3IEVycm9yKCd0YXIgZW50cnkgZGVzdHJveWVkJylcbiAgfVxuXG4gIF9wcmVkZXN0cm95ICgpIHtcbiAgICB0aGlzLl9wYWNrLmRlc3Ryb3kodGhpcy5fZ2V0RXJyb3IoKSlcbiAgfVxuXG4gIF9kZXN0cm95IChjYikge1xuICAgIHRoaXMuX3BhY2suX2RvbmUodGhpcylcblxuICAgIHRoaXMuX2NvbnRpbnVlUGFjayh0aGlzLl9maW5pc2hlZCA/IG51bGwgOiB0aGlzLl9nZXRFcnJvcigpKVxuXG4gICAgY2IoKVxuICB9XG59XG5cbmNsYXNzIFBhY2sgZXh0ZW5kcyBSZWFkYWJsZSB7XG4gIGNvbnN0cnVjdG9yIChvcHRzKSB7XG4gICAgc3VwZXIob3B0cylcbiAgICB0aGlzLl9kcmFpbiA9IG5vb3BcbiAgICB0aGlzLl9maW5hbGl6ZWQgPSBmYWxzZVxuICAgIHRoaXMuX2ZpbmFsaXppbmcgPSBmYWxzZVxuICAgIHRoaXMuX3BlbmRpbmcgPSBbXVxuICAgIHRoaXMuX3N0cmVhbSA9IG51bGxcbiAgfVxuXG4gIGVudHJ5IChoZWFkZXIsIGJ1ZmZlciwgY2FsbGJhY2spIHtcbiAgICBpZiAodGhpcy5fZmluYWxpemVkIHx8IHRoaXMuZGVzdHJveWluZykgdGhyb3cgbmV3IEVycm9yKCdhbHJlYWR5IGZpbmFsaXplZCBvciBkZXN0cm95ZWQnKVxuXG4gICAgaWYgKHR5cGVvZiBidWZmZXIgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgIGNhbGxiYWNrID0gYnVmZmVyXG4gICAgICBidWZmZXIgPSBudWxsXG4gICAgfVxuXG4gICAgaWYgKCFjYWxsYmFjaykgY2FsbGJhY2sgPSBub29wXG5cbiAgICBpZiAoIWhlYWRlci5zaXplIHx8IGhlYWRlci50eXBlID09PSAnc3ltbGluaycpIGhlYWRlci5zaXplID0gMFxuICAgIGlmICghaGVhZGVyLnR5cGUpIGhlYWRlci50eXBlID0gbW9kZVRvVHlwZShoZWFkZXIubW9kZSlcbiAgICBpZiAoIWhlYWRlci5tb2RlKSBoZWFkZXIubW9kZSA9IGhlYWRlci50eXBlID09PSAnZGlyZWN0b3J5JyA/IERNT0RFIDogRk1PREVcbiAgICBpZiAoIWhlYWRlci51aWQpIGhlYWRlci51aWQgPSAwXG4gICAgaWYgKCFoZWFkZXIuZ2lkKSBoZWFkZXIuZ2lkID0gMFxuICAgIGlmICghaGVhZGVyLm10aW1lKSBoZWFkZXIubXRpbWUgPSBuZXcgRGF0ZSgpXG5cbiAgICBpZiAodHlwZW9mIGJ1ZmZlciA9PT0gJ3N0cmluZycpIGJ1ZmZlciA9IGI0YS5mcm9tKGJ1ZmZlcilcblxuICAgIGNvbnN0IHNpbmsgPSBuZXcgU2luayh0aGlzLCBoZWFkZXIsIGNhbGxiYWNrKVxuXG4gICAgaWYgKGI0YS5pc0J1ZmZlcihidWZmZXIpKSB7XG4gICAgICBoZWFkZXIuc2l6ZSA9IGJ1ZmZlci5ieXRlTGVuZ3RoXG4gICAgICBzaW5rLndyaXRlKGJ1ZmZlcilcbiAgICAgIHNpbmsuZW5kKClcbiAgICAgIHJldHVybiBzaW5rXG4gICAgfVxuXG4gICAgaWYgKHNpbmsuX2lzVm9pZCkge1xuICAgICAgcmV0dXJuIHNpbmtcbiAgICB9XG5cbiAgICByZXR1cm4gc2lua1xuICB9XG5cbiAgZmluYWxpemUgKCkge1xuICAgIGlmICh0aGlzLl9zdHJlYW0gfHwgdGhpcy5fcGVuZGluZy5sZW5ndGggPiAwKSB7XG4gICAgICB0aGlzLl9maW5hbGl6aW5nID0gdHJ1ZVxuICAgICAgcmV0dXJuXG4gICAgfVxuXG4gICAgaWYgKHRoaXMuX2ZpbmFsaXplZCkgcmV0dXJuXG4gICAgdGhpcy5fZmluYWxpemVkID0gdHJ1ZVxuXG4gICAgdGhpcy5wdXNoKEVORF9PRl9UQVIpXG4gICAgdGhpcy5wdXNoKG51bGwpXG4gIH1cblxuICBfZG9uZSAoc3RyZWFtKSB7XG4gICAgaWYgKHN0cmVhbSAhPT0gdGhpcy5fc3RyZWFtKSByZXR1cm5cblxuICAgIHRoaXMuX3N0cmVhbSA9IG51bGxcblxuICAgIGlmICh0aGlzLl9maW5hbGl6aW5nKSB0aGlzLmZpbmFsaXplKClcbiAgICBpZiAodGhpcy5fcGVuZGluZy5sZW5ndGgpIHRoaXMuX3BlbmRpbmcuc2hpZnQoKS5fY29udGludWVPcGVuKClcbiAgfVxuXG4gIF9lbmNvZGUgKGhlYWRlcikge1xuICAgIGlmICghaGVhZGVyLnBheCkge1xuICAgICAgY29uc3QgYnVmID0gaGVhZGVycy5lbmNvZGUoaGVhZGVyKVxuICAgICAgaWYgKGJ1Zikge1xuICAgICAgICB0aGlzLnB1c2goYnVmKVxuICAgICAgICByZXR1cm5cbiAgICAgIH1cbiAgICB9XG4gICAgdGhpcy5fZW5jb2RlUGF4KGhlYWRlcilcbiAgfVxuXG4gIF9lbmNvZGVQYXggKGhlYWRlcikge1xuICAgIGNvbnN0IHBheEhlYWRlciA9IGhlYWRlcnMuZW5jb2RlUGF4KHtcbiAgICAgIG5hbWU6IGhlYWRlci5uYW1lLFxuICAgICAgbGlua25hbWU6IGhlYWRlci5saW5rbmFtZSxcbiAgICAgIHBheDogaGVhZGVyLnBheFxuICAgIH0pXG5cbiAgICBjb25zdCBuZXdIZWFkZXIgPSB7XG4gICAgICBuYW1lOiAnUGF4SGVhZGVyJyxcbiAgICAgIG1vZGU6IGhlYWRlci5tb2RlLFxuICAgICAgdWlkOiBoZWFkZXIudWlkLFxuICAgICAgZ2lkOiBoZWFkZXIuZ2lkLFxuICAgICAgc2l6ZTogcGF4SGVhZGVyLmJ5dGVMZW5ndGgsXG4gICAgICBtdGltZTogaGVhZGVyLm10aW1lLFxuICAgICAgdHlwZTogJ3BheC1oZWFkZXInLFxuICAgICAgbGlua25hbWU6IGhlYWRlci5saW5rbmFtZSAmJiAnUGF4SGVhZGVyJyxcbiAgICAgIHVuYW1lOiBoZWFkZXIudW5hbWUsXG4gICAgICBnbmFtZTogaGVhZGVyLmduYW1lLFxuICAgICAgZGV2bWFqb3I6IGhlYWRlci5kZXZtYWpvcixcbiAgICAgIGRldm1pbm9yOiBoZWFkZXIuZGV2bWlub3JcbiAgICB9XG5cbiAgICB0aGlzLnB1c2goaGVhZGVycy5lbmNvZGUobmV3SGVhZGVyKSlcbiAgICB0aGlzLnB1c2gocGF4SGVhZGVyKVxuICAgIG92ZXJmbG93KHRoaXMsIHBheEhlYWRlci5ieXRlTGVuZ3RoKVxuXG4gICAgbmV3SGVhZGVyLnNpemUgPSBoZWFkZXIuc2l6ZVxuICAgIG5ld0hlYWRlci50eXBlID0gaGVhZGVyLnR5cGVcbiAgICB0aGlzLnB1c2goaGVhZGVycy5lbmNvZGUobmV3SGVhZGVyKSlcbiAgfVxuXG4gIF9kb0RyYWluICgpIHtcbiAgICBjb25zdCBkcmFpbiA9IHRoaXMuX2RyYWluXG4gICAgdGhpcy5fZHJhaW4gPSBub29wXG4gICAgZHJhaW4oKVxuICB9XG5cbiAgX3ByZWRlc3Ryb3kgKCkge1xuICAgIGNvbnN0IGVyciA9IGdldFN0cmVhbUVycm9yKHRoaXMpXG5cbiAgICBpZiAodGhpcy5fc3RyZWFtKSB0aGlzLl9zdHJlYW0uZGVzdHJveShlcnIpXG5cbiAgICB3aGlsZSAodGhpcy5fcGVuZGluZy5sZW5ndGgpIHtcbiAgICAgIGNvbnN0IHN0cmVhbSA9IHRoaXMuX3BlbmRpbmcuc2hpZnQoKVxuICAgICAgc3RyZWFtLmRlc3Ryb3koZXJyKVxuICAgICAgc3RyZWFtLl9jb250aW51ZU9wZW4oKVxuICAgIH1cblxuICAgIHRoaXMuX2RvRHJhaW4oKVxuICB9XG5cbiAgX3JlYWQgKGNiKSB7XG4gICAgdGhpcy5fZG9EcmFpbigpXG4gICAgY2IoKVxuICB9XG59XG5cbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gcGFjayAob3B0cykge1xuICByZXR1cm4gbmV3IFBhY2sob3B0cylcbn1cblxuZnVuY3Rpb24gbW9kZVRvVHlwZSAobW9kZSkge1xuICBzd2l0Y2ggKG1vZGUgJiBjb25zdGFudHMuU19JRk1UKSB7XG4gICAgY2FzZSBjb25zdGFudHMuU19JRkJMSzogcmV0dXJuICdibG9jay1kZXZpY2UnXG4gICAgY2FzZSBjb25zdGFudHMuU19JRkNIUjogcmV0dXJuICdjaGFyYWN0ZXItZGV2aWNlJ1xuICAgIGNhc2UgY29uc3RhbnRzLlNfSUZESVI6IHJldHVybiAnZGlyZWN0b3J5J1xuICAgIGNhc2UgY29uc3RhbnRzLlNfSUZJRk86IHJldHVybiAnZmlmbydcbiAgICBjYXNlIGNvbnN0YW50cy5TX0lGTE5LOiByZXR1cm4gJ3N5bWxpbmsnXG4gIH1cblxuICByZXR1cm4gJ2ZpbGUnXG59XG5cbmZ1bmN0aW9uIG5vb3AgKCkge31cblxuZnVuY3Rpb24gb3ZlcmZsb3cgKHNlbGYsIHNpemUpIHtcbiAgc2l6ZSAmPSA1MTFcbiAgaWYgKHNpemUpIHNlbGYucHVzaChFTkRfT0ZfVEFSLnN1YmFycmF5KDAsIDUxMiAtIHNpemUpKVxufVxuXG5mdW5jdGlvbiBtYXBXcml0YWJsZSAoYnVmKSB7XG4gIHJldHVybiBiNGEuaXNCdWZmZXIoYnVmKSA/IGJ1ZiA6IGI0YS5mcm9tKGJ1Zilcbn1cbiIsCiAgICAiZXhwb3J0cy5leHRyYWN0ID0gcmVxdWlyZSgnLi9leHRyYWN0JylcbmV4cG9ydHMucGFjayA9IHJlcXVpcmUoJy4vcGFjaycpXG4iLAogICAgIi8qKlxuICogVEFSIEZvcm1hdCBQbHVnaW5cbiAqXG4gKiBAbW9kdWxlIHBsdWdpbnMvdGFyXG4gKiBAbGljZW5zZSBbTUlUXXtAbGluayBodHRwczovL2dpdGh1Yi5jb20vYXJjaGl2ZXJqcy9ub2RlLWFyY2hpdmVyL2Jsb2IvbWFzdGVyL0xJQ0VOU0V9XG4gKiBAY29weXJpZ2h0IChjKSAyMDEyLTIwMTQgQ2hyaXMgVGFsa2luZ3RvbiwgY29udHJpYnV0b3JzLlxuICovXG52YXIgemxpYiA9IHJlcXVpcmUoJ3psaWInKTtcblxudmFyIGVuZ2luZSA9IHJlcXVpcmUoJ3Rhci1zdHJlYW0nKTtcbnZhciB1dGlsID0gcmVxdWlyZSgnYXJjaGl2ZXItdXRpbHMnKTtcblxuLyoqXG4gKiBAY29uc3RydWN0b3JcbiAqIEBwYXJhbSB7VGFyT3B0aW9uc30gb3B0aW9uc1xuICovXG52YXIgVGFyID0gZnVuY3Rpb24ob3B0aW9ucykge1xuICBpZiAoISh0aGlzIGluc3RhbmNlb2YgVGFyKSkge1xuICAgIHJldHVybiBuZXcgVGFyKG9wdGlvbnMpO1xuICB9XG5cbiAgb3B0aW9ucyA9IHRoaXMub3B0aW9ucyA9IHV0aWwuZGVmYXVsdHMob3B0aW9ucywge1xuICAgIGd6aXA6IGZhbHNlXG4gIH0pO1xuXG4gIGlmICh0eXBlb2Ygb3B0aW9ucy5nemlwT3B0aW9ucyAhPT0gJ29iamVjdCcpIHtcbiAgICBvcHRpb25zLmd6aXBPcHRpb25zID0ge307XG4gIH1cblxuICB0aGlzLnN1cHBvcnRzID0ge1xuICAgIGRpcmVjdG9yeTogdHJ1ZSxcbiAgICBzeW1saW5rOiB0cnVlXG4gIH07XG5cbiAgdGhpcy5lbmdpbmUgPSBlbmdpbmUucGFjayhvcHRpb25zKTtcbiAgdGhpcy5jb21wcmVzc29yID0gZmFsc2U7XG5cbiAgaWYgKG9wdGlvbnMuZ3ppcCkge1xuICAgIHRoaXMuY29tcHJlc3NvciA9IHpsaWIuY3JlYXRlR3ppcChvcHRpb25zLmd6aXBPcHRpb25zKTtcbiAgICB0aGlzLmNvbXByZXNzb3Iub24oJ2Vycm9yJywgdGhpcy5fb25Db21wcmVzc29yRXJyb3IuYmluZCh0aGlzKSk7XG4gIH1cbn07XG5cbi8qKlxuICogW19vbkNvbXByZXNzb3JFcnJvciBkZXNjcmlwdGlvbl1cbiAqXG4gKiBAcHJpdmF0ZVxuICogQHBhcmFtICB7RXJyb3J9IGVyclxuICogQHJldHVybiB2b2lkXG4gKi9cblRhci5wcm90b3R5cGUuX29uQ29tcHJlc3NvckVycm9yID0gZnVuY3Rpb24oZXJyKSB7XG4gIHRoaXMuZW5naW5lLmVtaXQoJ2Vycm9yJywgZXJyKTtcbn07XG5cbi8qKlxuICogW2FwcGVuZCBkZXNjcmlwdGlvbl1cbiAqXG4gKiBAcGFyYW0gIHsoQnVmZmVyfFN0cmVhbSl9IHNvdXJjZVxuICogQHBhcmFtICB7VGFyRW50cnlEYXRhfSBkYXRhXG4gKiBAcGFyYW0gIHtGdW5jdGlvbn0gY2FsbGJhY2tcbiAqIEByZXR1cm4gdm9pZFxuICovXG5UYXIucHJvdG90eXBlLmFwcGVuZCA9IGZ1bmN0aW9uKHNvdXJjZSwgZGF0YSwgY2FsbGJhY2spIHtcbiAgdmFyIHNlbGYgPSB0aGlzO1xuXG4gIGRhdGEubXRpbWUgPSBkYXRhLmRhdGU7XG5cbiAgZnVuY3Rpb24gYXBwZW5kKGVyciwgc291cmNlQnVmZmVyKSB7XG4gICAgaWYgKGVycikge1xuICAgICAgY2FsbGJhY2soZXJyKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBzZWxmLmVuZ2luZS5lbnRyeShkYXRhLCBzb3VyY2VCdWZmZXIsIGZ1bmN0aW9uKGVycikge1xuICAgICAgY2FsbGJhY2soZXJyLCBkYXRhKTtcbiAgICB9KTtcbiAgfVxuXG4gIGlmIChkYXRhLnNvdXJjZVR5cGUgPT09ICdidWZmZXInKSB7XG4gICAgYXBwZW5kKG51bGwsIHNvdXJjZSk7XG4gIH0gZWxzZSBpZiAoZGF0YS5zb3VyY2VUeXBlID09PSAnc3RyZWFtJyAmJiBkYXRhLnN0YXRzKSB7XG4gICAgZGF0YS5zaXplID0gZGF0YS5zdGF0cy5zaXplO1xuXG4gICAgdmFyIGVudHJ5ID0gc2VsZi5lbmdpbmUuZW50cnkoZGF0YSwgZnVuY3Rpb24oZXJyKSB7XG4gICAgICBjYWxsYmFjayhlcnIsIGRhdGEpO1xuICAgIH0pO1xuXG4gICAgc291cmNlLnBpcGUoZW50cnkpO1xuICB9IGVsc2UgaWYgKGRhdGEuc291cmNlVHlwZSA9PT0gJ3N0cmVhbScpIHtcbiAgICB1dGlsLmNvbGxlY3RTdHJlYW0oc291cmNlLCBhcHBlbmQpO1xuICB9XG59O1xuXG4vKipcbiAqIFtmaW5hbGl6ZSBkZXNjcmlwdGlvbl1cbiAqXG4gKiBAcmV0dXJuIHZvaWRcbiAqL1xuVGFyLnByb3RvdHlwZS5maW5hbGl6ZSA9IGZ1bmN0aW9uKCkge1xuICB0aGlzLmVuZ2luZS5maW5hbGl6ZSgpO1xufTtcblxuLyoqXG4gKiBbb24gZGVzY3JpcHRpb25dXG4gKlxuICogQHJldHVybiB0aGlzLmVuZ2luZVxuICovXG5UYXIucHJvdG90eXBlLm9uID0gZnVuY3Rpb24oKSB7XG4gIHJldHVybiB0aGlzLmVuZ2luZS5vbi5hcHBseSh0aGlzLmVuZ2luZSwgYXJndW1lbnRzKTtcbn07XG5cbi8qKlxuICogW3BpcGUgZGVzY3JpcHRpb25dXG4gKlxuICogQHBhcmFtICB7U3RyaW5nfSBkZXN0aW5hdGlvblxuICogQHBhcmFtICB7T2JqZWN0fSBvcHRpb25zXG4gKiBAcmV0dXJuIHRoaXMuZW5naW5lXG4gKi9cblRhci5wcm90b3R5cGUucGlwZSA9IGZ1bmN0aW9uKGRlc3RpbmF0aW9uLCBvcHRpb25zKSB7XG4gIGlmICh0aGlzLmNvbXByZXNzb3IpIHtcbiAgICByZXR1cm4gdGhpcy5lbmdpbmUucGlwZS5hcHBseSh0aGlzLmVuZ2luZSwgW3RoaXMuY29tcHJlc3Nvcl0pLnBpcGUoZGVzdGluYXRpb24sIG9wdGlvbnMpO1xuICB9IGVsc2Uge1xuICAgIHJldHVybiB0aGlzLmVuZ2luZS5waXBlLmFwcGx5KHRoaXMuZW5naW5lLCBhcmd1bWVudHMpO1xuICB9XG59O1xuXG4vKipcbiAqIFt1bnBpcGUgZGVzY3JpcHRpb25dXG4gKlxuICogQHJldHVybiB0aGlzLmVuZ2luZVxuICovXG5UYXIucHJvdG90eXBlLnVucGlwZSA9IGZ1bmN0aW9uKCkge1xuICBpZiAodGhpcy5jb21wcmVzc29yKSB7XG4gICAgcmV0dXJuIHRoaXMuY29tcHJlc3Nvci51bnBpcGUuYXBwbHkodGhpcy5jb21wcmVzc29yLCBhcmd1bWVudHMpO1xuICB9IGVsc2Uge1xuICAgIHJldHVybiB0aGlzLmVuZ2luZS51bnBpcGUuYXBwbHkodGhpcy5lbmdpbmUsIGFyZ3VtZW50cyk7XG4gIH1cbn07XG5cbm1vZHVsZS5leHBvcnRzID0gVGFyO1xuXG4vKipcbiAqIEB0eXBlZGVmIHtPYmplY3R9IFRhck9wdGlvbnNcbiAqIEBnbG9iYWxcbiAqIEBwcm9wZXJ0eSB7Qm9vbGVhbn0gW2d6aXA9ZmFsc2VdIENvbXByZXNzIHRoZSB0YXIgYXJjaGl2ZSB1c2luZyBnemlwLlxuICogQHByb3BlcnR5IHtPYmplY3R9IFtnemlwT3B0aW9uc10gUGFzc2VkIHRvIFt6bGliXXtAbGluayBodHRwczovL25vZGVqcy5vcmcvYXBpL3psaWIuaHRtbCN6bGliX2NsYXNzX29wdGlvbnN9XG4gKiB0byBjb250cm9sIGNvbXByZXNzaW9uLlxuICogQHByb3BlcnR5IHsqfSBbKl0gU2VlIFt0YXItc3RyZWFtXXtAbGluayBodHRwczovL2dpdGh1Yi5jb20vbWFmaW50b3NoL3Rhci1zdHJlYW19IGRvY3VtZW50YXRpb24gZm9yIGFkZGl0aW9uYWwgcHJvcGVydGllcy5cbiAqL1xuXG4vKipcbiAqIEB0eXBlZGVmIHtPYmplY3R9IFRhckVudHJ5RGF0YVxuICogQGdsb2JhbFxuICogQHByb3BlcnR5IHtTdHJpbmd9IG5hbWUgU2V0cyB0aGUgZW50cnkgbmFtZSBpbmNsdWRpbmcgaW50ZXJuYWwgcGF0aC5cbiAqIEBwcm9wZXJ0eSB7KFN0cmluZ3xEYXRlKX0gW2RhdGU9Tk9XKCldIFNldHMgdGhlIGVudHJ5IGRhdGUuXG4gKiBAcHJvcGVydHkge051bWJlcn0gW21vZGU9RDowNzU1L0Y6MDY0NF0gU2V0cyB0aGUgZW50cnkgcGVybWlzc2lvbnMuXG4gKiBAcHJvcGVydHkge1N0cmluZ30gW3ByZWZpeF0gU2V0cyBhIHBhdGggcHJlZml4IGZvciB0aGUgZW50cnkgbmFtZS4gVXNlZnVsXG4gKiB3aGVuIHdvcmtpbmcgd2l0aCBtZXRob2RzIGxpa2UgYGRpcmVjdG9yeWAgb3IgYGdsb2JgLlxuICogQHByb3BlcnR5IHtmcy5TdGF0c30gW3N0YXRzXSBTZXRzIHRoZSBmcyBzdGF0IGRhdGEgZm9yIHRoaXMgZW50cnkgYWxsb3dpbmdcbiAqIGZvciByZWR1Y3Rpb24gb2YgZnMgc3RhdCBjYWxscyB3aGVuIHN0YXQgZGF0YSBpcyBhbHJlYWR5IGtub3duLlxuICovXG5cbi8qKlxuICogVGFyU3RyZWFtIE1vZHVsZVxuICogQGV4dGVybmFsIFRhclN0cmVhbVxuICogQHNlZSB7QGxpbmsgaHR0cHM6Ly9naXRodWIuY29tL21hZmludG9zaC90YXItc3RyZWFtfVxuICovXG4iLAogICAgIid1c2Ugc3RyaWN0JztcblxuZnVuY3Rpb24gZ2V0RGVmYXVsdEV4cG9ydEZyb21DanMgKHgpIHtcblx0cmV0dXJuIHggJiYgeC5fX2VzTW9kdWxlICYmIE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbCh4LCAnZGVmYXVsdCcpID8geFsnZGVmYXVsdCddIDogeDtcbn1cblxuY29uc3QgQ1JDX1RBQkxFID0gbmV3IEludDMyQXJyYXkoW1xuICAwLFxuICAxOTk2OTU5ODk0LFxuICAzOTkzOTE5Nzg4LFxuICAyNTY3NTI0Nzk0LFxuICAxMjQ2MzQxMzcsXG4gIDE4ODYwNTc2MTUsXG4gIDM5MTU2MjE2ODUsXG4gIDI2NTczOTIwMzUsXG4gIDI0OTI2ODI3NCxcbiAgMjA0NDUwODMyNCxcbiAgMzc3MjExNTIzMCxcbiAgMjU0NzE3Nzg2NCxcbiAgMTYyOTQxOTk1LFxuICAyMTI1NTYxMDIxLFxuICAzODg3NjA3MDQ3LFxuICAyNDI4NDQ0MDQ5LFxuICA0OTg1MzY1NDgsXG4gIDE3ODk5Mjc2NjYsXG4gIDQwODkwMTY2NDgsXG4gIDIyMjcwNjEyMTQsXG4gIDQ1MDU0ODg2MSxcbiAgMTg0MzI1ODYwMyxcbiAgNDEwNzU4MDc1MyxcbiAgMjIxMTY3NzYzOSxcbiAgMzI1ODgzOTkwLFxuICAxNjg0Nzc3MTUyLFxuICA0MjUxMTIyMDQyLFxuICAyMzIxOTI2NjM2LFxuICAzMzU2MzM0ODcsXG4gIDE2NjEzNjU0NjUsXG4gIDQxOTUzMDI3NTUsXG4gIDIzNjYxMTUzMTcsXG4gIDk5NzA3MzA5NixcbiAgMTI4MTk1Mzg4NixcbiAgMzU3OTg1NTMzMixcbiAgMjcyNDY4ODI0MixcbiAgMTAwNjg4ODE0NSxcbiAgMTI1ODYwNzY4NyxcbiAgMzUyNDEwMTYyOSxcbiAgMjc2ODk0MjQ0MyxcbiAgOTAxMDk3NzIyLFxuICAxMTE5MDAwNjg0LFxuICAzNjg2NTE3MjA2LFxuICAyODk4MDY1NzI4LFxuICA4NTMwNDQ0NTEsXG4gIDExNzIyNjYxMDEsXG4gIDM3MDUwMTU3NTksXG4gIDI4ODI2MTY2NjUsXG4gIDY1MTc2Nzk4MCxcbiAgMTM3MzUwMzU0NixcbiAgMzM2OTU1NDMwNCxcbiAgMzIxODEwNDU5OCxcbiAgNTY1NTA3MjUzLFxuICAxNDU0NjIxNzMxLFxuICAzNDg1MTExNzA1LFxuICAzMDk5NDM2MzAzLFxuICA2NzEyNjY5NzQsXG4gIDE1OTQxOTgwMjQsXG4gIDMzMjI3MzA5MzAsXG4gIDI5NzAzNDc4MTIsXG4gIDc5NTgzNTUyNyxcbiAgMTQ4MzIzMDIyNSxcbiAgMzI0NDM2NzI3NSxcbiAgMzA2MDE0OTU2NSxcbiAgMTk5NDE0NjE5MixcbiAgMzExNTg1MzQsXG4gIDI1NjM5MDc3NzIsXG4gIDQwMjM3MTc5MzAsXG4gIDE5MDc0NTk0NjUsXG4gIDExMjYzNzIxNSxcbiAgMjY4MDE1MzI1MyxcbiAgMzkwNDQyNzA1OSxcbiAgMjAxMzc3NjI5MCxcbiAgMjUxNzIyMDM2LFxuICAyNTE3MjE1Mzc0LFxuICAzNzc1ODMwMDQwLFxuICAyMTM3NjU2NzYzLFxuICAxNDEzNzY4MTMsXG4gIDI0MzkyNzc3MTksXG4gIDM4NjUyNzEyOTcsXG4gIDE4MDIxOTU0NDQsXG4gIDQ3Njg2NDg2NixcbiAgMjIzODAwMTM2OCxcbiAgNDA2NjUwODg3OCxcbiAgMTgxMjM3MDkyNSxcbiAgNDUzMDkyNzMxLFxuICAyMTgxNjI1MDI1LFxuICA0MTExNDUxMjIzLFxuICAxNzA2MDg4OTAyLFxuICAzMTQwNDI3MDQsXG4gIDIzNDQ1MzIyMDIsXG4gIDQyNDAwMTc1MzIsXG4gIDE2NTg2NTgyNzEsXG4gIDM2NjYxOTk3NyxcbiAgMjM2MjY3MDMyMyxcbiAgNDIyNDk5NDQwNSxcbiAgMTMwMzUzNTk2MCxcbiAgOTg0OTYxNDg2LFxuICAyNzQ3MDA3MDkyLFxuICAzNTY5MDM3NTM4LFxuICAxMjU2MTcwODE3LFxuICAxMDM3NjA0MzExLFxuICAyNzY1MjEwNzMzLFxuICAzNTU0MDc5OTk1LFxuICAxMTMxMDE0NTA2LFxuICA4Nzk2Nzk5OTYsXG4gIDI5MDkyNDM0NjIsXG4gIDM2NjM3NzE4NTYsXG4gIDExNDExMjQ0NjcsXG4gIDg1NTg0MjI3NyxcbiAgMjg1MjgwMTYzMSxcbiAgMzcwODY0ODY0OSxcbiAgMTM0MjUzMzk0OCxcbiAgNjU0NDU5MzA2LFxuICAzMTg4Mzk2MDQ4LFxuICAzMzczMDE1MTc0LFxuICAxNDY2NDc5OTA5LFxuICA1NDQxNzk2MzUsXG4gIDMxMTA1MjM5MTMsXG4gIDM0NjI1MjIwMTUsXG4gIDE1OTE2NzEwNTQsXG4gIDcwMjEzODc3NixcbiAgMjk2NjQ2MDQ1MCxcbiAgMzM1Mjc5OTQxMixcbiAgMTUwNDkxODgwNyxcbiAgNzgzNTUxODczLFxuICAzMDgyNjQwNDQzLFxuICAzMjMzNDQyOTg5LFxuICAzOTg4MjkyMzg0LFxuICAyNTk2MjU0NjQ2LFxuICA2MjMxNzA2OCxcbiAgMTk1NzgxMDg0MixcbiAgMzkzOTg0NTk0NSxcbiAgMjY0NzgxNjExMSxcbiAgODE0NzA5OTcsXG4gIDE5NDM4MDM1MjMsXG4gIDM4MTQ5MTg5MzAsXG4gIDI0ODk1OTY4MDQsXG4gIDIyNTI3NDQzMCxcbiAgMjA1Mzc5MDM3NixcbiAgMzgyNjE3NTc1NSxcbiAgMjQ2NjkwNjAxMyxcbiAgMTY3ODE2NzQzLFxuICAyMDk3NjUxMzc3LFxuICA0MDI3NTUyNTgwLFxuICAyMjY1NDkwMzg2LFxuICA1MDM0NDQwNzIsXG4gIDE3NjIwNTA4MTQsXG4gIDQxNTA0MTcyNDUsXG4gIDIxNTQxMjkzNTUsXG4gIDQyNjUyMjIyNSxcbiAgMTg1MjUwNzg3OSxcbiAgNDI3NTMxMzUyNixcbiAgMjMxMjMxNzkyMCxcbiAgMjgyNzUzNjI2LFxuICAxNzQyNTU1ODUyLFxuICA0MTg5NzA4MTQzLFxuICAyMzk0ODc3OTQ1LFxuICAzOTc5MTc3NjMsXG4gIDE2MjIxODM2MzcsXG4gIDM2MDQzOTA4ODgsXG4gIDI3MTQ4NjY1NTgsXG4gIDk1MzcyOTczMixcbiAgMTM0MDA3NjYyNixcbiAgMzUxODcxOTk4NSxcbiAgMjc5NzM2MDk5OSxcbiAgMTA2ODgyODM4MSxcbiAgMTIxOTYzODg1OSxcbiAgMzYyNDc0MTg1MCxcbiAgMjkzNjY3NTE0OCxcbiAgOTA2MTg1NDYyLFxuICAxMDkwODEyNTEyLFxuICAzNzQ3NjcyMDAzLFxuICAyODI1Mzc5NjY5LFxuICA4MjkzMjkxMzUsXG4gIDExODEzMzUxNjEsXG4gIDM0MTIxNzc4MDQsXG4gIDMxNjA4MzQ4NDIsXG4gIDYyODA4NTQwOCxcbiAgMTM4MjYwNTM2NixcbiAgMzQyMzM2OTEwOSxcbiAgMzEzODA3ODQ2NyxcbiAgNTcwNTYyMjMzLFxuICAxNDI2NDAwODE1LFxuICAzMzE3MzE2NTQyLFxuICAyOTk4NzMzNjA4LFxuICA3MzMyMzk5NTQsXG4gIDE1NTUyNjE5NTYsXG4gIDMyNjg5MzU1OTEsXG4gIDMwNTAzNjA2MjUsXG4gIDc1MjQ1OTQwMyxcbiAgMTU0MTMyMDIyMSxcbiAgMjYwNzA3MTkyMCxcbiAgMzk2NTk3MzAzMCxcbiAgMTk2OTkyMjk3MixcbiAgNDA3MzU0OTgsXG4gIDI2MTc4MzcyMjUsXG4gIDM5NDM1NzcxNTEsXG4gIDE5MTMwODc4NzcsXG4gIDgzOTA4MzcxLFxuICAyNTEyMzQxNjM0LFxuICAzODAzNzQwNjkyLFxuICAyMDc1MjA4NjIyLFxuICAyMTMyNjExMTIsXG4gIDI0NjMyNzI2MDMsXG4gIDM4NTU5OTAyODUsXG4gIDIwOTQ4NTQwNzEsXG4gIDE5ODk1ODg4MSxcbiAgMjI2MjAyOTAxMixcbiAgNDA1NzI2MDYxMCxcbiAgMTc1OTM1OTk5MixcbiAgNTM0NDE0MTkwLFxuICAyMTc2NzE4NTQxLFxuICA0MTM5MzI5MTE1LFxuICAxODczODM2MDAxLFxuICA0MTQ2NjQ1NjcsXG4gIDIyODIyNDg5MzQsXG4gIDQyNzkyMDAzNjgsXG4gIDE3MTE2ODQ1NTQsXG4gIDI4NTI4MTExNixcbiAgMjQwNTgwMTcyNyxcbiAgNDE2NzIxNjc0NSxcbiAgMTYzNDQ2Nzc5NSxcbiAgMzc2MjI5NzAxLFxuICAyNjg1MDY3ODk2LFxuICAzNjA4MDA3NDA2LFxuICAxMzA4OTE4NjEyLFxuICA5NTY1NDM5MzgsXG4gIDI4MDg1NTUxMDUsXG4gIDM0OTU5NTgyNjMsXG4gIDEyMzE2MzYzMDEsXG4gIDEwNDc0MjcwMzUsXG4gIDI5MzI5NTk4MTgsXG4gIDM2NTQ3MDM4MzYsXG4gIDEwODgzNTkyNzAsXG4gIDkzNjkxOGUzLFxuICAyODQ3NzE0ODk5LFxuICAzNzM2ODM3ODI5LFxuICAxMjAyOTAwODYzLFxuICA4MTcyMzM4OTcsXG4gIDMxODMzNDIxMDgsXG4gIDM0MDEyMzcxMzAsXG4gIDE0MDQyNzc1NTIsXG4gIDYxNTgxODE1MCxcbiAgMzEzNDIwNzQ5MyxcbiAgMzQ1MzQyMTIwMyxcbiAgMTQyMzg1NzQ0OSxcbiAgNjAxNDUwNDMxLFxuICAzMDA5ODM3NjE0LFxuICAzMjk0NzEwNDU2LFxuICAxNTY3MTAzNzQ2LFxuICA3MTE5Mjg3MjQsXG4gIDMwMjA2Njg0NzEsXG4gIDMyNzIzODAwNjUsXG4gIDE1MTAzMzQyMzUsXG4gIDc1NTE2NzExN1xuXSk7XG5mdW5jdGlvbiBlbnN1cmVCdWZmZXIoaW5wdXQpIHtcbiAgaWYgKEJ1ZmZlci5pc0J1ZmZlcihpbnB1dCkpIHtcbiAgICByZXR1cm4gaW5wdXQ7XG4gIH1cbiAgaWYgKHR5cGVvZiBpbnB1dCA9PT0gXCJudW1iZXJcIikge1xuICAgIHJldHVybiBCdWZmZXIuYWxsb2MoaW5wdXQpO1xuICB9IGVsc2UgaWYgKHR5cGVvZiBpbnB1dCA9PT0gXCJzdHJpbmdcIikge1xuICAgIHJldHVybiBCdWZmZXIuZnJvbShpbnB1dCk7XG4gIH0gZWxzZSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKFwiaW5wdXQgbXVzdCBiZSBidWZmZXIsIG51bWJlciwgb3Igc3RyaW5nLCByZWNlaXZlZCBcIiArIHR5cGVvZiBpbnB1dCk7XG4gIH1cbn1cbmZ1bmN0aW9uIGJ1ZmZlcml6ZUludChudW0pIHtcbiAgY29uc3QgdG1wID0gZW5zdXJlQnVmZmVyKDQpO1xuICB0bXAud3JpdGVJbnQzMkJFKG51bSwgMCk7XG4gIHJldHVybiB0bXA7XG59XG5mdW5jdGlvbiBfY3JjMzIoYnVmLCBwcmV2aW91cykge1xuICBidWYgPSBlbnN1cmVCdWZmZXIoYnVmKTtcbiAgaWYgKEJ1ZmZlci5pc0J1ZmZlcihwcmV2aW91cykpIHtcbiAgICBwcmV2aW91cyA9IHByZXZpb3VzLnJlYWRVSW50MzJCRSgwKTtcbiAgfVxuICBsZXQgY3JjID0gfn5wcmV2aW91cyBeIC0xO1xuICBmb3IgKHZhciBuID0gMDsgbiA8IGJ1Zi5sZW5ndGg7IG4rKykge1xuICAgIGNyYyA9IENSQ19UQUJMRVsoY3JjIF4gYnVmW25dKSAmIDI1NV0gXiBjcmMgPj4+IDg7XG4gIH1cbiAgcmV0dXJuIGNyYyBeIC0xO1xufVxuZnVuY3Rpb24gY3JjMzIoKSB7XG4gIHJldHVybiBidWZmZXJpemVJbnQoX2NyYzMyLmFwcGx5KG51bGwsIGFyZ3VtZW50cykpO1xufVxuY3JjMzIuc2lnbmVkID0gZnVuY3Rpb24oKSB7XG4gIHJldHVybiBfY3JjMzIuYXBwbHkobnVsbCwgYXJndW1lbnRzKTtcbn07XG5jcmMzMi51bnNpZ25lZCA9IGZ1bmN0aW9uKCkge1xuICByZXR1cm4gX2NyYzMyLmFwcGx5KG51bGwsIGFyZ3VtZW50cykgPj4+IDA7XG59O1xudmFyIGJ1ZmZlckNyYzMyID0gY3JjMzI7XG5cbmNvbnN0IGluZGV4ID0gLypAX19QVVJFX18qL2dldERlZmF1bHRFeHBvcnRGcm9tQ2pzKGJ1ZmZlckNyYzMyKTtcblxubW9kdWxlLmV4cG9ydHMgPSBpbmRleDtcbiIsCiAgICAiLyoqXG4gKiBKU09OIEZvcm1hdCBQbHVnaW5cbiAqXG4gKiBAbW9kdWxlIHBsdWdpbnMvanNvblxuICogQGxpY2Vuc2UgW01JVF17QGxpbmsgaHR0cHM6Ly9naXRodWIuY29tL2FyY2hpdmVyanMvbm9kZS1hcmNoaXZlci9ibG9iL21hc3Rlci9MSUNFTlNFfVxuICogQGNvcHlyaWdodCAoYykgMjAxMi0yMDE0IENocmlzIFRhbGtpbmd0b24sIGNvbnRyaWJ1dG9ycy5cbiAqL1xudmFyIGluaGVyaXRzID0gcmVxdWlyZSgndXRpbCcpLmluaGVyaXRzO1xudmFyIFRyYW5zZm9ybSA9IHJlcXVpcmUoJ3JlYWRhYmxlLXN0cmVhbScpLlRyYW5zZm9ybTtcblxudmFyIGNyYzMyID0gcmVxdWlyZSgnYnVmZmVyLWNyYzMyJyk7XG52YXIgdXRpbCA9IHJlcXVpcmUoJ2FyY2hpdmVyLXV0aWxzJyk7XG5cbi8qKlxuICogQGNvbnN0cnVjdG9yXG4gKiBAcGFyYW0geyhKc29uT3B0aW9uc3xUcmFuc2Zvcm1PcHRpb25zKX0gb3B0aW9uc1xuICovXG52YXIgSnNvbiA9IGZ1bmN0aW9uKG9wdGlvbnMpIHtcbiAgaWYgKCEodGhpcyBpbnN0YW5jZW9mIEpzb24pKSB7XG4gICAgcmV0dXJuIG5ldyBKc29uKG9wdGlvbnMpO1xuICB9XG5cbiAgb3B0aW9ucyA9IHRoaXMub3B0aW9ucyA9IHV0aWwuZGVmYXVsdHMob3B0aW9ucywge30pO1xuXG4gIFRyYW5zZm9ybS5jYWxsKHRoaXMsIG9wdGlvbnMpO1xuXG4gIHRoaXMuc3VwcG9ydHMgPSB7XG4gICAgZGlyZWN0b3J5OiB0cnVlLFxuICAgIHN5bWxpbms6IHRydWVcbiAgfTtcblxuICB0aGlzLmZpbGVzID0gW107XG59O1xuXG5pbmhlcml0cyhKc29uLCBUcmFuc2Zvcm0pO1xuXG4vKipcbiAqIFtfdHJhbnNmb3JtIGRlc2NyaXB0aW9uXVxuICpcbiAqIEBwcml2YXRlXG4gKiBAcGFyYW0gIHtCdWZmZXJ9ICAgY2h1bmtcbiAqIEBwYXJhbSAge1N0cmluZ30gICBlbmNvZGluZ1xuICogQHBhcmFtICB7RnVuY3Rpb259IGNhbGxiYWNrXG4gKiBAcmV0dXJuIHZvaWRcbiAqL1xuSnNvbi5wcm90b3R5cGUuX3RyYW5zZm9ybSA9IGZ1bmN0aW9uKGNodW5rLCBlbmNvZGluZywgY2FsbGJhY2spIHtcbiAgY2FsbGJhY2sobnVsbCwgY2h1bmspO1xufTtcblxuLyoqXG4gKiBbX3dyaXRlU3RyaW5naWZpZWQgZGVzY3JpcHRpb25dXG4gKlxuICogQHByaXZhdGVcbiAqIEByZXR1cm4gdm9pZFxuICovXG5Kc29uLnByb3RvdHlwZS5fd3JpdGVTdHJpbmdpZmllZCA9IGZ1bmN0aW9uKCkge1xuICB2YXIgZmlsZVN0cmluZyA9IEpTT04uc3RyaW5naWZ5KHRoaXMuZmlsZXMpO1xuICB0aGlzLndyaXRlKGZpbGVTdHJpbmcpO1xufTtcblxuLyoqXG4gKiBbYXBwZW5kIGRlc2NyaXB0aW9uXVxuICpcbiAqIEBwYXJhbSAgeyhCdWZmZXJ8U3RyZWFtKX0gICBzb3VyY2VcbiAqIEBwYXJhbSAge0VudHJ5RGF0YX0gICBkYXRhXG4gKiBAcGFyYW0gIHtGdW5jdGlvbn0gY2FsbGJhY2tcbiAqIEByZXR1cm4gdm9pZFxuICovXG5Kc29uLnByb3RvdHlwZS5hcHBlbmQgPSBmdW5jdGlvbihzb3VyY2UsIGRhdGEsIGNhbGxiYWNrKSB7XG4gIHZhciBzZWxmID0gdGhpcztcblxuICBkYXRhLmNyYzMyID0gMDtcblxuICBmdW5jdGlvbiBvbmVuZChlcnIsIHNvdXJjZUJ1ZmZlcikge1xuICAgIGlmIChlcnIpIHtcbiAgICAgIGNhbGxiYWNrKGVycik7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgZGF0YS5zaXplID0gc291cmNlQnVmZmVyLmxlbmd0aCB8fCAwO1xuICAgIGRhdGEuY3JjMzIgPSBjcmMzMi51bnNpZ25lZChzb3VyY2VCdWZmZXIpO1xuXG4gICAgc2VsZi5maWxlcy5wdXNoKGRhdGEpO1xuXG4gICAgY2FsbGJhY2sobnVsbCwgZGF0YSk7XG4gIH1cblxuICBpZiAoZGF0YS5zb3VyY2VUeXBlID09PSAnYnVmZmVyJykge1xuICAgIG9uZW5kKG51bGwsIHNvdXJjZSk7XG4gIH0gZWxzZSBpZiAoZGF0YS5zb3VyY2VUeXBlID09PSAnc3RyZWFtJykge1xuICAgIHV0aWwuY29sbGVjdFN0cmVhbShzb3VyY2UsIG9uZW5kKTtcbiAgfVxufTtcblxuLyoqXG4gKiBbZmluYWxpemUgZGVzY3JpcHRpb25dXG4gKlxuICogQHJldHVybiB2b2lkXG4gKi9cbkpzb24ucHJvdG90eXBlLmZpbmFsaXplID0gZnVuY3Rpb24oKSB7XG4gIHRoaXMuX3dyaXRlU3RyaW5naWZpZWQoKTtcbiAgdGhpcy5lbmQoKTtcbn07XG5cbm1vZHVsZS5leHBvcnRzID0gSnNvbjtcblxuLyoqXG4gKiBAdHlwZWRlZiB7T2JqZWN0fSBKc29uT3B0aW9uc1xuICogQGdsb2JhbFxuICovXG4iLAogICAgIi8qKlxuICogQXJjaGl2ZXIgVmVuZGluZ1xuICpcbiAqIEBpZ25vcmVcbiAqIEBsaWNlbnNlIFtNSVRde0BsaW5rIGh0dHBzOi8vZ2l0aHViLmNvbS9hcmNoaXZlcmpzL25vZGUtYXJjaGl2ZXIvYmxvYi9tYXN0ZXIvTElDRU5TRX1cbiAqIEBjb3B5cmlnaHQgKGMpIDIwMTItMjAxNCBDaHJpcyBUYWxraW5ndG9uLCBjb250cmlidXRvcnMuXG4gKi9cbnZhciBBcmNoaXZlciA9IHJlcXVpcmUoJy4vbGliL2NvcmUnKTtcblxudmFyIGZvcm1hdHMgPSB7fTtcblxuLyoqXG4gKiBEaXNwZW5zZXMgYSBuZXcgQXJjaGl2ZXIgaW5zdGFuY2UuXG4gKlxuICogQGNvbnN0cnVjdG9yXG4gKiBAcGFyYW0gIHtTdHJpbmd9IGZvcm1hdCBUaGUgYXJjaGl2ZSBmb3JtYXQgdG8gdXNlLlxuICogQHBhcmFtICB7T2JqZWN0fSBvcHRpb25zIFNlZSBbQXJjaGl2ZXJde0BsaW5rIEFyY2hpdmVyfVxuICogQHJldHVybiB7QXJjaGl2ZXJ9XG4gKi9cbnZhciB2ZW5kaW5nID0gZnVuY3Rpb24oZm9ybWF0LCBvcHRpb25zKSB7XG4gIHJldHVybiB2ZW5kaW5nLmNyZWF0ZShmb3JtYXQsIG9wdGlvbnMpO1xufTtcblxuLyoqXG4gKiBDcmVhdGVzIGEgbmV3IEFyY2hpdmVyIGluc3RhbmNlLlxuICpcbiAqIEBwYXJhbSAge1N0cmluZ30gZm9ybWF0IFRoZSBhcmNoaXZlIGZvcm1hdCB0byB1c2UuXG4gKiBAcGFyYW0gIHtPYmplY3R9IG9wdGlvbnMgU2VlIFtBcmNoaXZlcl17QGxpbmsgQXJjaGl2ZXJ9XG4gKiBAcmV0dXJuIHtBcmNoaXZlcn1cbiAqL1xudmVuZGluZy5jcmVhdGUgPSBmdW5jdGlvbihmb3JtYXQsIG9wdGlvbnMpIHtcbiAgaWYgKGZvcm1hdHNbZm9ybWF0XSkge1xuICAgIHZhciBpbnN0YW5jZSA9IG5ldyBBcmNoaXZlcihmb3JtYXQsIG9wdGlvbnMpO1xuICAgIGluc3RhbmNlLnNldEZvcm1hdChmb3JtYXQpO1xuICAgIGluc3RhbmNlLnNldE1vZHVsZShuZXcgZm9ybWF0c1tmb3JtYXRdKG9wdGlvbnMpKTtcblxuICAgIHJldHVybiBpbnN0YW5jZTtcbiAgfSBlbHNlIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoJ2NyZWF0ZSgnICsgZm9ybWF0ICsgJyk6IGZvcm1hdCBub3QgcmVnaXN0ZXJlZCcpO1xuICB9XG59O1xuXG4vKipcbiAqIFJlZ2lzdGVycyBhIGZvcm1hdCBmb3IgdXNlIHdpdGggYXJjaGl2ZXIuXG4gKlxuICogQHBhcmFtICB7U3RyaW5nfSBmb3JtYXQgVGhlIG5hbWUgb2YgdGhlIGZvcm1hdC5cbiAqIEBwYXJhbSAge0Z1bmN0aW9ufSBtb2R1bGUgVGhlIGZ1bmN0aW9uIGZvciBhcmNoaXZlciB0byBpbnRlcmFjdCB3aXRoLlxuICogQHJldHVybiB2b2lkXG4gKi9cbnZlbmRpbmcucmVnaXN0ZXJGb3JtYXQgPSBmdW5jdGlvbihmb3JtYXQsIG1vZHVsZSkge1xuICBpZiAoZm9ybWF0c1tmb3JtYXRdKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKCdyZWdpc3RlcignICsgZm9ybWF0ICsgJyk6IGZvcm1hdCBhbHJlYWR5IHJlZ2lzdGVyZWQnKTtcbiAgfVxuXG4gIGlmICh0eXBlb2YgbW9kdWxlICE9PSAnZnVuY3Rpb24nKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKCdyZWdpc3RlcignICsgZm9ybWF0ICsgJyk6IGZvcm1hdCBtb2R1bGUgaW52YWxpZCcpO1xuICB9XG5cbiAgaWYgKHR5cGVvZiBtb2R1bGUucHJvdG90eXBlLmFwcGVuZCAhPT0gJ2Z1bmN0aW9uJyB8fCB0eXBlb2YgbW9kdWxlLnByb3RvdHlwZS5maW5hbGl6ZSAhPT0gJ2Z1bmN0aW9uJykge1xuICAgIHRocm93IG5ldyBFcnJvcigncmVnaXN0ZXIoJyArIGZvcm1hdCArICcpOiBmb3JtYXQgbW9kdWxlIG1pc3NpbmcgbWV0aG9kcycpO1xuICB9XG5cbiAgZm9ybWF0c1tmb3JtYXRdID0gbW9kdWxlO1xufTtcblxuLyoqXG4gKiBDaGVjayBpZiB0aGUgZm9ybWF0IGlzIGFscmVhZHkgcmVnaXN0ZXJlZC5cbiAqIFxuICogQHBhcmFtIHtTdHJpbmd9IGZvcm1hdCB0aGUgbmFtZSBvZiB0aGUgZm9ybWF0LlxuICogQHJldHVybiBib29sZWFuXG4gKi9cbnZlbmRpbmcuaXNSZWdpc3RlcmVkRm9ybWF0ID0gZnVuY3Rpb24gKGZvcm1hdCkge1xuICBpZiAoZm9ybWF0c1tmb3JtYXRdKSB7XG4gICAgcmV0dXJuIHRydWU7XG4gIH1cbiAgXG4gIHJldHVybiBmYWxzZTtcbn07XG5cbnZlbmRpbmcucmVnaXN0ZXJGb3JtYXQoJ3ppcCcsIHJlcXVpcmUoJy4vbGliL3BsdWdpbnMvemlwJykpO1xudmVuZGluZy5yZWdpc3RlckZvcm1hdCgndGFyJywgcmVxdWlyZSgnLi9saWIvcGx1Z2lucy90YXInKSk7XG52ZW5kaW5nLnJlZ2lzdGVyRm9ybWF0KCdqc29uJywgcmVxdWlyZSgnLi9saWIvcGx1Z2lucy9qc29uJykpO1xuXG5tb2R1bGUuZXhwb3J0cyA9IHZlbmRpbmc7IiwKICAgICJcInVzZSBzdHJpY3RcIjtcbnZhciBfX2NyZWF0ZUJpbmRpbmcgPSAodGhpcyAmJiB0aGlzLl9fY3JlYXRlQmluZGluZykgfHwgKE9iamVjdC5jcmVhdGUgPyAoZnVuY3Rpb24obywgbSwgaywgazIpIHtcbiAgICBpZiAoazIgPT09IHVuZGVmaW5lZCkgazIgPSBrO1xuICAgIHZhciBkZXNjID0gT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcihtLCBrKTtcbiAgICBpZiAoIWRlc2MgfHwgKFwiZ2V0XCIgaW4gZGVzYyA/ICFtLl9fZXNNb2R1bGUgOiBkZXNjLndyaXRhYmxlIHx8IGRlc2MuY29uZmlndXJhYmxlKSkge1xuICAgICAgZGVzYyA9IHsgZW51bWVyYWJsZTogdHJ1ZSwgZ2V0OiBmdW5jdGlvbigpIHsgcmV0dXJuIG1ba107IH0gfTtcbiAgICB9XG4gICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KG8sIGsyLCBkZXNjKTtcbn0pIDogKGZ1bmN0aW9uKG8sIG0sIGssIGsyKSB7XG4gICAgaWYgKGsyID09PSB1bmRlZmluZWQpIGsyID0gaztcbiAgICBvW2syXSA9IG1ba107XG59KSk7XG52YXIgX19zZXRNb2R1bGVEZWZhdWx0ID0gKHRoaXMgJiYgdGhpcy5fX3NldE1vZHVsZURlZmF1bHQpIHx8IChPYmplY3QuY3JlYXRlID8gKGZ1bmN0aW9uKG8sIHYpIHtcbiAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkobywgXCJkZWZhdWx0XCIsIHsgZW51bWVyYWJsZTogdHJ1ZSwgdmFsdWU6IHYgfSk7XG59KSA6IGZ1bmN0aW9uKG8sIHYpIHtcbiAgICBvW1wiZGVmYXVsdFwiXSA9IHY7XG59KTtcbnZhciBfX2ltcG9ydFN0YXIgPSAodGhpcyAmJiB0aGlzLl9faW1wb3J0U3RhcikgfHwgZnVuY3Rpb24gKG1vZCkge1xuICAgIGlmIChtb2QgJiYgbW9kLl9fZXNNb2R1bGUpIHJldHVybiBtb2Q7XG4gICAgdmFyIHJlc3VsdCA9IHt9O1xuICAgIGlmIChtb2QgIT0gbnVsbCkgZm9yICh2YXIgayBpbiBtb2QpIGlmIChrICE9PSBcImRlZmF1bHRcIiAmJiBPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwobW9kLCBrKSkgX19jcmVhdGVCaW5kaW5nKHJlc3VsdCwgbW9kLCBrKTtcbiAgICBfX3NldE1vZHVsZURlZmF1bHQocmVzdWx0LCBtb2QpO1xuICAgIHJldHVybiByZXN1bHQ7XG59O1xudmFyIF9fYXdhaXRlciA9ICh0aGlzICYmIHRoaXMuX19hd2FpdGVyKSB8fCBmdW5jdGlvbiAodGhpc0FyZywgX2FyZ3VtZW50cywgUCwgZ2VuZXJhdG9yKSB7XG4gICAgZnVuY3Rpb24gYWRvcHQodmFsdWUpIHsgcmV0dXJuIHZhbHVlIGluc3RhbmNlb2YgUCA/IHZhbHVlIDogbmV3IFAoZnVuY3Rpb24gKHJlc29sdmUpIHsgcmVzb2x2ZSh2YWx1ZSk7IH0pOyB9XG4gICAgcmV0dXJuIG5ldyAoUCB8fCAoUCA9IFByb21pc2UpKShmdW5jdGlvbiAocmVzb2x2ZSwgcmVqZWN0KSB7XG4gICAgICAgIGZ1bmN0aW9uIGZ1bGZpbGxlZCh2YWx1ZSkgeyB0cnkgeyBzdGVwKGdlbmVyYXRvci5uZXh0KHZhbHVlKSk7IH0gY2F0Y2ggKGUpIHsgcmVqZWN0KGUpOyB9IH1cbiAgICAgICAgZnVuY3Rpb24gcmVqZWN0ZWQodmFsdWUpIHsgdHJ5IHsgc3RlcChnZW5lcmF0b3JbXCJ0aHJvd1wiXSh2YWx1ZSkpOyB9IGNhdGNoIChlKSB7IHJlamVjdChlKTsgfSB9XG4gICAgICAgIGZ1bmN0aW9uIHN0ZXAocmVzdWx0KSB7IHJlc3VsdC5kb25lID8gcmVzb2x2ZShyZXN1bHQudmFsdWUpIDogYWRvcHQocmVzdWx0LnZhbHVlKS50aGVuKGZ1bGZpbGxlZCwgcmVqZWN0ZWQpOyB9XG4gICAgICAgIHN0ZXAoKGdlbmVyYXRvciA9IGdlbmVyYXRvci5hcHBseSh0aGlzQXJnLCBfYXJndW1lbnRzIHx8IFtdKSkubmV4dCgpKTtcbiAgICB9KTtcbn07XG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJfX2VzTW9kdWxlXCIsIHsgdmFsdWU6IHRydWUgfSk7XG5leHBvcnRzLmNyZWF0ZVppcFVwbG9hZFN0cmVhbSA9IGV4cG9ydHMuWmlwVXBsb2FkU3RyZWFtID0gZXhwb3J0cy5ERUZBVUxUX0NPTVBSRVNTSU9OX0xFVkVMID0gdm9pZCAwO1xuY29uc3Qgc3RyZWFtID0gX19pbXBvcnRTdGFyKHJlcXVpcmUoXCJzdHJlYW1cIikpO1xuY29uc3QgcHJvbWlzZXNfMSA9IHJlcXVpcmUoXCJmcy9wcm9taXNlc1wiKTtcbmNvbnN0IGFyY2hpdmVyID0gX19pbXBvcnRTdGFyKHJlcXVpcmUoXCJhcmNoaXZlclwiKSk7XG5jb25zdCBjb3JlID0gX19pbXBvcnRTdGFyKHJlcXVpcmUoXCJAYWN0aW9ucy9jb3JlXCIpKTtcbmNvbnN0IGNvbmZpZ18xID0gcmVxdWlyZShcIi4uL3NoYXJlZC9jb25maWdcIik7XG5leHBvcnRzLkRFRkFVTFRfQ09NUFJFU1NJT05fTEVWRUwgPSA2O1xuLy8gQ3VzdG9tIHN0cmVhbSB0cmFuc2Zvcm1lciBzbyB3ZSBjYW4gc2V0IHRoZSBoaWdoV2F0ZXJNYXJrIHByb3BlcnR5XG4vLyBTZWUgaHR0cHM6Ly9naXRodWIuY29tL25vZGVqcy9ub2RlL2lzc3Vlcy84ODU1XG5jbGFzcyBaaXBVcGxvYWRTdHJlYW0gZXh0ZW5kcyBzdHJlYW0uVHJhbnNmb3JtIHtcbiAgICBjb25zdHJ1Y3RvcihidWZmZXJTaXplKSB7XG4gICAgICAgIHN1cGVyKHtcbiAgICAgICAgICAgIGhpZ2hXYXRlck1hcms6IGJ1ZmZlclNpemVcbiAgICAgICAgfSk7XG4gICAgfVxuICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tZXhwbGljaXQtYW55XG4gICAgX3RyYW5zZm9ybShjaHVuaywgZW5jLCBjYikge1xuICAgICAgICBjYihudWxsLCBjaHVuayk7XG4gICAgfVxufVxuZXhwb3J0cy5aaXBVcGxvYWRTdHJlYW0gPSBaaXBVcGxvYWRTdHJlYW07XG5mdW5jdGlvbiBjcmVhdGVaaXBVcGxvYWRTdHJlYW0odXBsb2FkU3BlY2lmaWNhdGlvbiwgY29tcHJlc3Npb25MZXZlbCA9IGV4cG9ydHMuREVGQVVMVF9DT01QUkVTU0lPTl9MRVZFTCkge1xuICAgIHJldHVybiBfX2F3YWl0ZXIodGhpcywgdm9pZCAwLCB2b2lkIDAsIGZ1bmN0aW9uKiAoKSB7XG4gICAgICAgIGNvcmUuZGVidWcoYENyZWF0aW5nIEFydGlmYWN0IGFyY2hpdmUgd2l0aCBjb21wcmVzc2lvbkxldmVsOiAke2NvbXByZXNzaW9uTGV2ZWx9YCk7XG4gICAgICAgIGNvbnN0IHppcCA9IGFyY2hpdmVyLmNyZWF0ZSgnemlwJywge1xuICAgICAgICAgICAgaGlnaFdhdGVyTWFyazogKDAsIGNvbmZpZ18xLmdldFVwbG9hZENodW5rU2l6ZSkoKSxcbiAgICAgICAgICAgIHpsaWI6IHsgbGV2ZWw6IGNvbXByZXNzaW9uTGV2ZWwgfVxuICAgICAgICB9KTtcbiAgICAgICAgLy8gcmVnaXN0ZXIgY2FsbGJhY2tzIGZvciB2YXJpb3VzIGV2ZW50cyBkdXJpbmcgdGhlIHppcCBsaWZlY3ljbGVcbiAgICAgICAgemlwLm9uKCdlcnJvcicsIHppcEVycm9yQ2FsbGJhY2spO1xuICAgICAgICB6aXAub24oJ3dhcm5pbmcnLCB6aXBXYXJuaW5nQ2FsbGJhY2spO1xuICAgICAgICB6aXAub24oJ2ZpbmlzaCcsIHppcEZpbmlzaENhbGxiYWNrKTtcbiAgICAgICAgemlwLm9uKCdlbmQnLCB6aXBFbmRDYWxsYmFjayk7XG4gICAgICAgIGZvciAoY29uc3QgZmlsZSBvZiB1cGxvYWRTcGVjaWZpY2F0aW9uKSB7XG4gICAgICAgICAgICBpZiAoZmlsZS5zb3VyY2VQYXRoICE9PSBudWxsKSB7XG4gICAgICAgICAgICAgICAgLy8gQ2hlY2sgaWYgc3ltbGluayBhbmQgcmVzb2x2ZSB0aGUgc291cmNlIHBhdGhcbiAgICAgICAgICAgICAgICBsZXQgc291cmNlUGF0aCA9IGZpbGUuc291cmNlUGF0aDtcbiAgICAgICAgICAgICAgICBpZiAoZmlsZS5zdGF0cy5pc1N5bWJvbGljTGluaygpKSB7XG4gICAgICAgICAgICAgICAgICAgIHNvdXJjZVBhdGggPSB5aWVsZCAoMCwgcHJvbWlzZXNfMS5yZWFscGF0aCkoZmlsZS5zb3VyY2VQYXRoKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgLy8gQWRkIHRoZSBmaWxlIHRvIHRoZSB6aXBcbiAgICAgICAgICAgICAgICB6aXAuZmlsZShzb3VyY2VQYXRoLCB7XG4gICAgICAgICAgICAgICAgICAgIG5hbWU6IGZpbGUuZGVzdGluYXRpb25QYXRoXG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICAvLyBBZGQgYSBkaXJlY3RvcnkgdG8gdGhlIHppcFxuICAgICAgICAgICAgICAgIHppcC5hcHBlbmQoJycsIHsgbmFtZTogZmlsZS5kZXN0aW5hdGlvblBhdGggfSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgYnVmZmVyU2l6ZSA9ICgwLCBjb25maWdfMS5nZXRVcGxvYWRDaHVua1NpemUpKCk7XG4gICAgICAgIGNvbnN0IHppcFVwbG9hZFN0cmVhbSA9IG5ldyBaaXBVcGxvYWRTdHJlYW0oYnVmZmVyU2l6ZSk7XG4gICAgICAgIGNvcmUuZGVidWcoYFppcCB3cml0ZSBoaWdoIHdhdGVybWFyayB2YWx1ZSAke3ppcFVwbG9hZFN0cmVhbS53cml0YWJsZUhpZ2hXYXRlck1hcmt9YCk7XG4gICAgICAgIGNvcmUuZGVidWcoYFppcCByZWFkIGhpZ2ggd2F0ZXJtYXJrIHZhbHVlICR7emlwVXBsb2FkU3RyZWFtLnJlYWRhYmxlSGlnaFdhdGVyTWFya31gKTtcbiAgICAgICAgemlwLnBpcGUoemlwVXBsb2FkU3RyZWFtKTtcbiAgICAgICAgemlwLmZpbmFsaXplKCk7XG4gICAgICAgIHJldHVybiB6aXBVcGxvYWRTdHJlYW07XG4gICAgfSk7XG59XG5leHBvcnRzLmNyZWF0ZVppcFVwbG9hZFN0cmVhbSA9IGNyZWF0ZVppcFVwbG9hZFN0cmVhbTtcbi8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tZXhwbGljaXQtYW55XG5jb25zdCB6aXBFcnJvckNhbGxiYWNrID0gKGVycm9yKSA9PiB7XG4gICAgY29yZS5lcnJvcignQW4gZXJyb3IgaGFzIG9jY3VycmVkIHdoaWxlIGNyZWF0aW5nIHRoZSB6aXAgZmlsZSBmb3IgdXBsb2FkJyk7XG4gICAgY29yZS5pbmZvKGVycm9yKTtcbiAgICB0aHJvdyBuZXcgRXJyb3IoJ0FuIGVycm9yIGhhcyBvY2N1cnJlZCBkdXJpbmcgemlwIGNyZWF0aW9uIGZvciB0aGUgYXJ0aWZhY3QnKTtcbn07XG4vLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLWV4cGxpY2l0LWFueVxuY29uc3QgemlwV2FybmluZ0NhbGxiYWNrID0gKGVycm9yKSA9PiB7XG4gICAgaWYgKGVycm9yLmNvZGUgPT09ICdFTk9FTlQnKSB7XG4gICAgICAgIGNvcmUud2FybmluZygnRU5PRU5UIHdhcm5pbmcgZHVyaW5nIGFydGlmYWN0IHppcCBjcmVhdGlvbi4gTm8gc3VjaCBmaWxlIG9yIGRpcmVjdG9yeScpO1xuICAgICAgICBjb3JlLmluZm8oZXJyb3IpO1xuICAgIH1cbiAgICBlbHNlIHtcbiAgICAgICAgY29yZS53YXJuaW5nKGBBIG5vbi1ibG9ja2luZyB3YXJuaW5nIGhhcyBvY2N1cnJlZCBkdXJpbmcgYXJ0aWZhY3QgemlwIGNyZWF0aW9uOiAke2Vycm9yLmNvZGV9YCk7XG4gICAgICAgIGNvcmUuaW5mbyhlcnJvcik7XG4gICAgfVxufTtcbmNvbnN0IHppcEZpbmlzaENhbGxiYWNrID0gKCkgPT4ge1xuICAgIGNvcmUuZGVidWcoJ1ppcCBzdHJlYW0gZm9yIHVwbG9hZCBoYXMgZmluaXNoZWQuJyk7XG59O1xuY29uc3QgemlwRW5kQ2FsbGJhY2sgPSAoKSA9PiB7XG4gICAgY29yZS5kZWJ1ZygnWmlwIHN0cmVhbSBmb3IgdXBsb2FkIGhhcyBlbmRlZC4nKTtcbn07XG4vLyMgc291cmNlTWFwcGluZ1VSTD16aXAuanMubWFwIiwKICAgICJcInVzZSBzdHJpY3RcIjtcbnZhciBfX2NyZWF0ZUJpbmRpbmcgPSAodGhpcyAmJiB0aGlzLl9fY3JlYXRlQmluZGluZykgfHwgKE9iamVjdC5jcmVhdGUgPyAoZnVuY3Rpb24obywgbSwgaywgazIpIHtcbiAgICBpZiAoazIgPT09IHVuZGVmaW5lZCkgazIgPSBrO1xuICAgIHZhciBkZXNjID0gT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcihtLCBrKTtcbiAgICBpZiAoIWRlc2MgfHwgKFwiZ2V0XCIgaW4gZGVzYyA/ICFtLl9fZXNNb2R1bGUgOiBkZXNjLndyaXRhYmxlIHx8IGRlc2MuY29uZmlndXJhYmxlKSkge1xuICAgICAgZGVzYyA9IHsgZW51bWVyYWJsZTogdHJ1ZSwgZ2V0OiBmdW5jdGlvbigpIHsgcmV0dXJuIG1ba107IH0gfTtcbiAgICB9XG4gICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KG8sIGsyLCBkZXNjKTtcbn0pIDogKGZ1bmN0aW9uKG8sIG0sIGssIGsyKSB7XG4gICAgaWYgKGsyID09PSB1bmRlZmluZWQpIGsyID0gaztcbiAgICBvW2syXSA9IG1ba107XG59KSk7XG52YXIgX19zZXRNb2R1bGVEZWZhdWx0ID0gKHRoaXMgJiYgdGhpcy5fX3NldE1vZHVsZURlZmF1bHQpIHx8IChPYmplY3QuY3JlYXRlID8gKGZ1bmN0aW9uKG8sIHYpIHtcbiAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkobywgXCJkZWZhdWx0XCIsIHsgZW51bWVyYWJsZTogdHJ1ZSwgdmFsdWU6IHYgfSk7XG59KSA6IGZ1bmN0aW9uKG8sIHYpIHtcbiAgICBvW1wiZGVmYXVsdFwiXSA9IHY7XG59KTtcbnZhciBfX2ltcG9ydFN0YXIgPSAodGhpcyAmJiB0aGlzLl9faW1wb3J0U3RhcikgfHwgZnVuY3Rpb24gKG1vZCkge1xuICAgIGlmIChtb2QgJiYgbW9kLl9fZXNNb2R1bGUpIHJldHVybiBtb2Q7XG4gICAgdmFyIHJlc3VsdCA9IHt9O1xuICAgIGlmIChtb2QgIT0gbnVsbCkgZm9yICh2YXIgayBpbiBtb2QpIGlmIChrICE9PSBcImRlZmF1bHRcIiAmJiBPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwobW9kLCBrKSkgX19jcmVhdGVCaW5kaW5nKHJlc3VsdCwgbW9kLCBrKTtcbiAgICBfX3NldE1vZHVsZURlZmF1bHQocmVzdWx0LCBtb2QpO1xuICAgIHJldHVybiByZXN1bHQ7XG59O1xudmFyIF9fYXdhaXRlciA9ICh0aGlzICYmIHRoaXMuX19hd2FpdGVyKSB8fCBmdW5jdGlvbiAodGhpc0FyZywgX2FyZ3VtZW50cywgUCwgZ2VuZXJhdG9yKSB7XG4gICAgZnVuY3Rpb24gYWRvcHQodmFsdWUpIHsgcmV0dXJuIHZhbHVlIGluc3RhbmNlb2YgUCA/IHZhbHVlIDogbmV3IFAoZnVuY3Rpb24gKHJlc29sdmUpIHsgcmVzb2x2ZSh2YWx1ZSk7IH0pOyB9XG4gICAgcmV0dXJuIG5ldyAoUCB8fCAoUCA9IFByb21pc2UpKShmdW5jdGlvbiAocmVzb2x2ZSwgcmVqZWN0KSB7XG4gICAgICAgIGZ1bmN0aW9uIGZ1bGZpbGxlZCh2YWx1ZSkgeyB0cnkgeyBzdGVwKGdlbmVyYXRvci5uZXh0KHZhbHVlKSk7IH0gY2F0Y2ggKGUpIHsgcmVqZWN0KGUpOyB9IH1cbiAgICAgICAgZnVuY3Rpb24gcmVqZWN0ZWQodmFsdWUpIHsgdHJ5IHsgc3RlcChnZW5lcmF0b3JbXCJ0aHJvd1wiXSh2YWx1ZSkpOyB9IGNhdGNoIChlKSB7IHJlamVjdChlKTsgfSB9XG4gICAgICAgIGZ1bmN0aW9uIHN0ZXAocmVzdWx0KSB7IHJlc3VsdC5kb25lID8gcmVzb2x2ZShyZXN1bHQudmFsdWUpIDogYWRvcHQocmVzdWx0LnZhbHVlKS50aGVuKGZ1bGZpbGxlZCwgcmVqZWN0ZWQpOyB9XG4gICAgICAgIHN0ZXAoKGdlbmVyYXRvciA9IGdlbmVyYXRvci5hcHBseSh0aGlzQXJnLCBfYXJndW1lbnRzIHx8IFtdKSkubmV4dCgpKTtcbiAgICB9KTtcbn07XG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJfX2VzTW9kdWxlXCIsIHsgdmFsdWU6IHRydWUgfSk7XG5leHBvcnRzLnVwbG9hZEFydGlmYWN0ID0gdm9pZCAwO1xuY29uc3QgY29yZSA9IF9faW1wb3J0U3RhcihyZXF1aXJlKFwiQGFjdGlvbnMvY29yZVwiKSk7XG5jb25zdCByZXRlbnRpb25fMSA9IHJlcXVpcmUoXCIuL3JldGVudGlvblwiKTtcbmNvbnN0IHBhdGhfYW5kX2FydGlmYWN0X25hbWVfdmFsaWRhdGlvbl8xID0gcmVxdWlyZShcIi4vcGF0aC1hbmQtYXJ0aWZhY3QtbmFtZS12YWxpZGF0aW9uXCIpO1xuY29uc3QgYXJ0aWZhY3RfdHdpcnBfY2xpZW50XzEgPSByZXF1aXJlKFwiLi4vc2hhcmVkL2FydGlmYWN0LXR3aXJwLWNsaWVudFwiKTtcbmNvbnN0IHVwbG9hZF96aXBfc3BlY2lmaWNhdGlvbl8xID0gcmVxdWlyZShcIi4vdXBsb2FkLXppcC1zcGVjaWZpY2F0aW9uXCIpO1xuY29uc3QgdXRpbF8xID0gcmVxdWlyZShcIi4uL3NoYXJlZC91dGlsXCIpO1xuY29uc3QgYmxvYl91cGxvYWRfMSA9IHJlcXVpcmUoXCIuL2Jsb2ItdXBsb2FkXCIpO1xuY29uc3QgemlwXzEgPSByZXF1aXJlKFwiLi96aXBcIik7XG5jb25zdCBnZW5lcmF0ZWRfMSA9IHJlcXVpcmUoXCIuLi8uLi9nZW5lcmF0ZWRcIik7XG5jb25zdCBlcnJvcnNfMSA9IHJlcXVpcmUoXCIuLi9zaGFyZWQvZXJyb3JzXCIpO1xuZnVuY3Rpb24gdXBsb2FkQXJ0aWZhY3QobmFtZSwgZmlsZXMsIHJvb3REaXJlY3RvcnksIG9wdGlvbnMpIHtcbiAgICByZXR1cm4gX19hd2FpdGVyKHRoaXMsIHZvaWQgMCwgdm9pZCAwLCBmdW5jdGlvbiogKCkge1xuICAgICAgICAoMCwgcGF0aF9hbmRfYXJ0aWZhY3RfbmFtZV92YWxpZGF0aW9uXzEudmFsaWRhdGVBcnRpZmFjdE5hbWUpKG5hbWUpO1xuICAgICAgICAoMCwgdXBsb2FkX3ppcF9zcGVjaWZpY2F0aW9uXzEudmFsaWRhdGVSb290RGlyZWN0b3J5KShyb290RGlyZWN0b3J5KTtcbiAgICAgICAgY29uc3QgemlwU3BlY2lmaWNhdGlvbiA9ICgwLCB1cGxvYWRfemlwX3NwZWNpZmljYXRpb25fMS5nZXRVcGxvYWRaaXBTcGVjaWZpY2F0aW9uKShmaWxlcywgcm9vdERpcmVjdG9yeSk7XG4gICAgICAgIGlmICh6aXBTcGVjaWZpY2F0aW9uLmxlbmd0aCA9PT0gMCkge1xuICAgICAgICAgICAgdGhyb3cgbmV3IGVycm9yc18xLkZpbGVzTm90Rm91bmRFcnJvcih6aXBTcGVjaWZpY2F0aW9uLmZsYXRNYXAocyA9PiAocy5zb3VyY2VQYXRoID8gW3Muc291cmNlUGF0aF0gOiBbXSkpKTtcbiAgICAgICAgfVxuICAgICAgICAvLyBnZXQgdGhlIElEcyBuZWVkZWQgZm9yIHRoZSBhcnRpZmFjdCBjcmVhdGlvblxuICAgICAgICBjb25zdCBiYWNrZW5kSWRzID0gKDAsIHV0aWxfMS5nZXRCYWNrZW5kSWRzRnJvbVRva2VuKSgpO1xuICAgICAgICAvLyBjcmVhdGUgdGhlIGFydGlmYWN0IGNsaWVudFxuICAgICAgICBjb25zdCBhcnRpZmFjdENsaWVudCA9ICgwLCBhcnRpZmFjdF90d2lycF9jbGllbnRfMS5pbnRlcm5hbEFydGlmYWN0VHdpcnBDbGllbnQpKCk7XG4gICAgICAgIC8vIGNyZWF0ZSB0aGUgYXJ0aWZhY3RcbiAgICAgICAgY29uc3QgY3JlYXRlQXJ0aWZhY3RSZXEgPSB7XG4gICAgICAgICAgICB3b3JrZmxvd1J1bkJhY2tlbmRJZDogYmFja2VuZElkcy53b3JrZmxvd1J1bkJhY2tlbmRJZCxcbiAgICAgICAgICAgIHdvcmtmbG93Sm9iUnVuQmFja2VuZElkOiBiYWNrZW5kSWRzLndvcmtmbG93Sm9iUnVuQmFja2VuZElkLFxuICAgICAgICAgICAgbmFtZSxcbiAgICAgICAgICAgIHZlcnNpb246IDRcbiAgICAgICAgfTtcbiAgICAgICAgLy8gaWYgdGhlcmUgaXMgYSByZXRlbnRpb24gcGVyaW9kLCBhZGQgaXQgdG8gdGhlIHJlcXVlc3RcbiAgICAgICAgY29uc3QgZXhwaXJlc0F0ID0gKDAsIHJldGVudGlvbl8xLmdldEV4cGlyYXRpb24pKG9wdGlvbnMgPT09IG51bGwgfHwgb3B0aW9ucyA9PT0gdm9pZCAwID8gdm9pZCAwIDogb3B0aW9ucy5yZXRlbnRpb25EYXlzKTtcbiAgICAgICAgaWYgKGV4cGlyZXNBdCkge1xuICAgICAgICAgICAgY3JlYXRlQXJ0aWZhY3RSZXEuZXhwaXJlc0F0ID0gZXhwaXJlc0F0O1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IGNyZWF0ZUFydGlmYWN0UmVzcCA9IHlpZWxkIGFydGlmYWN0Q2xpZW50LkNyZWF0ZUFydGlmYWN0KGNyZWF0ZUFydGlmYWN0UmVxKTtcbiAgICAgICAgaWYgKCFjcmVhdGVBcnRpZmFjdFJlc3Aub2spIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBlcnJvcnNfMS5JbnZhbGlkUmVzcG9uc2VFcnJvcignQ3JlYXRlQXJ0aWZhY3Q6IHJlc3BvbnNlIGZyb20gYmFja2VuZCB3YXMgbm90IG9rJyk7XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgemlwVXBsb2FkU3RyZWFtID0geWllbGQgKDAsIHppcF8xLmNyZWF0ZVppcFVwbG9hZFN0cmVhbSkoemlwU3BlY2lmaWNhdGlvbiwgb3B0aW9ucyA9PT0gbnVsbCB8fCBvcHRpb25zID09PSB2b2lkIDAgPyB2b2lkIDAgOiBvcHRpb25zLmNvbXByZXNzaW9uTGV2ZWwpO1xuICAgICAgICAvLyBVcGxvYWQgemlwIHRvIGJsb2Igc3RvcmFnZVxuICAgICAgICBjb25zdCB1cGxvYWRSZXN1bHQgPSB5aWVsZCAoMCwgYmxvYl91cGxvYWRfMS51cGxvYWRaaXBUb0Jsb2JTdG9yYWdlKShjcmVhdGVBcnRpZmFjdFJlc3Auc2lnbmVkVXBsb2FkVXJsLCB6aXBVcGxvYWRTdHJlYW0pO1xuICAgICAgICAvLyBmaW5hbGl6ZSB0aGUgYXJ0aWZhY3RcbiAgICAgICAgY29uc3QgZmluYWxpemVBcnRpZmFjdFJlcSA9IHtcbiAgICAgICAgICAgIHdvcmtmbG93UnVuQmFja2VuZElkOiBiYWNrZW5kSWRzLndvcmtmbG93UnVuQmFja2VuZElkLFxuICAgICAgICAgICAgd29ya2Zsb3dKb2JSdW5CYWNrZW5kSWQ6IGJhY2tlbmRJZHMud29ya2Zsb3dKb2JSdW5CYWNrZW5kSWQsXG4gICAgICAgICAgICBuYW1lLFxuICAgICAgICAgICAgc2l6ZTogdXBsb2FkUmVzdWx0LnVwbG9hZFNpemUgPyB1cGxvYWRSZXN1bHQudXBsb2FkU2l6ZS50b1N0cmluZygpIDogJzAnXG4gICAgICAgIH07XG4gICAgICAgIGlmICh1cGxvYWRSZXN1bHQuc2hhMjU2SGFzaCkge1xuICAgICAgICAgICAgZmluYWxpemVBcnRpZmFjdFJlcS5oYXNoID0gZ2VuZXJhdGVkXzEuU3RyaW5nVmFsdWUuY3JlYXRlKHtcbiAgICAgICAgICAgICAgICB2YWx1ZTogYHNoYTI1Njoke3VwbG9hZFJlc3VsdC5zaGEyNTZIYXNofWBcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgICAgIGNvcmUuaW5mbyhgRmluYWxpemluZyBhcnRpZmFjdCB1cGxvYWRgKTtcbiAgICAgICAgY29uc3QgZmluYWxpemVBcnRpZmFjdFJlc3AgPSB5aWVsZCBhcnRpZmFjdENsaWVudC5GaW5hbGl6ZUFydGlmYWN0KGZpbmFsaXplQXJ0aWZhY3RSZXEpO1xuICAgICAgICBpZiAoIWZpbmFsaXplQXJ0aWZhY3RSZXNwLm9rKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgZXJyb3JzXzEuSW52YWxpZFJlc3BvbnNlRXJyb3IoJ0ZpbmFsaXplQXJ0aWZhY3Q6IHJlc3BvbnNlIGZyb20gYmFja2VuZCB3YXMgbm90IG9rJyk7XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgYXJ0aWZhY3RJZCA9IEJpZ0ludChmaW5hbGl6ZUFydGlmYWN0UmVzcC5hcnRpZmFjdElkKTtcbiAgICAgICAgY29yZS5pbmZvKGBBcnRpZmFjdCAke25hbWV9LnppcCBzdWNjZXNzZnVsbHkgZmluYWxpemVkLiBBcnRpZmFjdCBJRCAke2FydGlmYWN0SWR9YCk7XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICBzaXplOiB1cGxvYWRSZXN1bHQudXBsb2FkU2l6ZSxcbiAgICAgICAgICAgIGlkOiBOdW1iZXIoYXJ0aWZhY3RJZClcbiAgICAgICAgfTtcbiAgICB9KTtcbn1cbmV4cG9ydHMudXBsb2FkQXJ0aWZhY3QgPSB1cGxvYWRBcnRpZmFjdDtcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPXVwbG9hZC1hcnRpZmFjdC5qcy5tYXAiLAogICAgIlwidXNlIHN0cmljdFwiO1xuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiX19lc01vZHVsZVwiLCB7IHZhbHVlOiB0cnVlIH0pO1xuZXhwb3J0cy5Db250ZXh0ID0gdm9pZCAwO1xuY29uc3QgZnNfMSA9IHJlcXVpcmUoXCJmc1wiKTtcbmNvbnN0IG9zXzEgPSByZXF1aXJlKFwib3NcIik7XG5jbGFzcyBDb250ZXh0IHtcbiAgICAvKipcbiAgICAgKiBIeWRyYXRlIHRoZSBjb250ZXh0IGZyb20gdGhlIGVudmlyb25tZW50XG4gICAgICovXG4gICAgY29uc3RydWN0b3IoKSB7XG4gICAgICAgIHZhciBfYSwgX2IsIF9jO1xuICAgICAgICB0aGlzLnBheWxvYWQgPSB7fTtcbiAgICAgICAgaWYgKHByb2Nlc3MuZW52LkdJVEhVQl9FVkVOVF9QQVRIKSB7XG4gICAgICAgICAgICBpZiAoZnNfMS5leGlzdHNTeW5jKHByb2Nlc3MuZW52LkdJVEhVQl9FVkVOVF9QQVRIKSkge1xuICAgICAgICAgICAgICAgIHRoaXMucGF5bG9hZCA9IEpTT04ucGFyc2UoZnNfMS5yZWFkRmlsZVN5bmMocHJvY2Vzcy5lbnYuR0lUSFVCX0VWRU5UX1BBVEgsIHsgZW5jb2Rpbmc6ICd1dGY4JyB9KSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICBjb25zdCBwYXRoID0gcHJvY2Vzcy5lbnYuR0lUSFVCX0VWRU5UX1BBVEg7XG4gICAgICAgICAgICAgICAgcHJvY2Vzcy5zdGRvdXQud3JpdGUoYEdJVEhVQl9FVkVOVF9QQVRIICR7cGF0aH0gZG9lcyBub3QgZXhpc3Qke29zXzEuRU9MfWApO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHRoaXMuZXZlbnROYW1lID0gcHJvY2Vzcy5lbnYuR0lUSFVCX0VWRU5UX05BTUU7XG4gICAgICAgIHRoaXMuc2hhID0gcHJvY2Vzcy5lbnYuR0lUSFVCX1NIQTtcbiAgICAgICAgdGhpcy5yZWYgPSBwcm9jZXNzLmVudi5HSVRIVUJfUkVGO1xuICAgICAgICB0aGlzLndvcmtmbG93ID0gcHJvY2Vzcy5lbnYuR0lUSFVCX1dPUktGTE9XO1xuICAgICAgICB0aGlzLmFjdGlvbiA9IHByb2Nlc3MuZW52LkdJVEhVQl9BQ1RJT047XG4gICAgICAgIHRoaXMuYWN0b3IgPSBwcm9jZXNzLmVudi5HSVRIVUJfQUNUT1I7XG4gICAgICAgIHRoaXMuam9iID0gcHJvY2Vzcy5lbnYuR0lUSFVCX0pPQjtcbiAgICAgICAgdGhpcy5ydW5OdW1iZXIgPSBwYXJzZUludChwcm9jZXNzLmVudi5HSVRIVUJfUlVOX05VTUJFUiwgMTApO1xuICAgICAgICB0aGlzLnJ1bklkID0gcGFyc2VJbnQocHJvY2Vzcy5lbnYuR0lUSFVCX1JVTl9JRCwgMTApO1xuICAgICAgICB0aGlzLmFwaVVybCA9IChfYSA9IHByb2Nlc3MuZW52LkdJVEhVQl9BUElfVVJMKSAhPT0gbnVsbCAmJiBfYSAhPT0gdm9pZCAwID8gX2EgOiBgaHR0cHM6Ly9hcGkuZ2l0aHViLmNvbWA7XG4gICAgICAgIHRoaXMuc2VydmVyVXJsID0gKF9iID0gcHJvY2Vzcy5lbnYuR0lUSFVCX1NFUlZFUl9VUkwpICE9PSBudWxsICYmIF9iICE9PSB2b2lkIDAgPyBfYiA6IGBodHRwczovL2dpdGh1Yi5jb21gO1xuICAgICAgICB0aGlzLmdyYXBocWxVcmwgPSAoX2MgPSBwcm9jZXNzLmVudi5HSVRIVUJfR1JBUEhRTF9VUkwpICE9PSBudWxsICYmIF9jICE9PSB2b2lkIDAgPyBfYyA6IGBodHRwczovL2FwaS5naXRodWIuY29tL2dyYXBocWxgO1xuICAgIH1cbiAgICBnZXQgaXNzdWUoKSB7XG4gICAgICAgIGNvbnN0IHBheWxvYWQgPSB0aGlzLnBheWxvYWQ7XG4gICAgICAgIHJldHVybiBPYmplY3QuYXNzaWduKE9iamVjdC5hc3NpZ24oe30sIHRoaXMucmVwbyksIHsgbnVtYmVyOiAocGF5bG9hZC5pc3N1ZSB8fCBwYXlsb2FkLnB1bGxfcmVxdWVzdCB8fCBwYXlsb2FkKS5udW1iZXIgfSk7XG4gICAgfVxuICAgIGdldCByZXBvKCkge1xuICAgICAgICBpZiAocHJvY2Vzcy5lbnYuR0lUSFVCX1JFUE9TSVRPUlkpIHtcbiAgICAgICAgICAgIGNvbnN0IFtvd25lciwgcmVwb10gPSBwcm9jZXNzLmVudi5HSVRIVUJfUkVQT1NJVE9SWS5zcGxpdCgnLycpO1xuICAgICAgICAgICAgcmV0dXJuIHsgb3duZXIsIHJlcG8gfTtcbiAgICAgICAgfVxuICAgICAgICBpZiAodGhpcy5wYXlsb2FkLnJlcG9zaXRvcnkpIHtcbiAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgb3duZXI6IHRoaXMucGF5bG9hZC5yZXBvc2l0b3J5Lm93bmVyLmxvZ2luLFxuICAgICAgICAgICAgICAgIHJlcG86IHRoaXMucGF5bG9hZC5yZXBvc2l0b3J5Lm5hbWVcbiAgICAgICAgICAgIH07XG4gICAgICAgIH1cbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwiY29udGV4dC5yZXBvIHJlcXVpcmVzIGEgR0lUSFVCX1JFUE9TSVRPUlkgZW52aXJvbm1lbnQgdmFyaWFibGUgbGlrZSAnb3duZXIvcmVwbydcIik7XG4gICAgfVxufVxuZXhwb3J0cy5Db250ZXh0ID0gQ29udGV4dDtcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPWNvbnRleHQuanMubWFwIiwKICAgICJcInVzZSBzdHJpY3RcIjtcbnZhciBfX2NyZWF0ZUJpbmRpbmcgPSAodGhpcyAmJiB0aGlzLl9fY3JlYXRlQmluZGluZykgfHwgKE9iamVjdC5jcmVhdGUgPyAoZnVuY3Rpb24obywgbSwgaywgazIpIHtcbiAgICBpZiAoazIgPT09IHVuZGVmaW5lZCkgazIgPSBrO1xuICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShvLCBrMiwgeyBlbnVtZXJhYmxlOiB0cnVlLCBnZXQ6IGZ1bmN0aW9uKCkgeyByZXR1cm4gbVtrXTsgfSB9KTtcbn0pIDogKGZ1bmN0aW9uKG8sIG0sIGssIGsyKSB7XG4gICAgaWYgKGsyID09PSB1bmRlZmluZWQpIGsyID0gaztcbiAgICBvW2syXSA9IG1ba107XG59KSk7XG52YXIgX19zZXRNb2R1bGVEZWZhdWx0ID0gKHRoaXMgJiYgdGhpcy5fX3NldE1vZHVsZURlZmF1bHQpIHx8IChPYmplY3QuY3JlYXRlID8gKGZ1bmN0aW9uKG8sIHYpIHtcbiAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkobywgXCJkZWZhdWx0XCIsIHsgZW51bWVyYWJsZTogdHJ1ZSwgdmFsdWU6IHYgfSk7XG59KSA6IGZ1bmN0aW9uKG8sIHYpIHtcbiAgICBvW1wiZGVmYXVsdFwiXSA9IHY7XG59KTtcbnZhciBfX2ltcG9ydFN0YXIgPSAodGhpcyAmJiB0aGlzLl9faW1wb3J0U3RhcikgfHwgZnVuY3Rpb24gKG1vZCkge1xuICAgIGlmIChtb2QgJiYgbW9kLl9fZXNNb2R1bGUpIHJldHVybiBtb2Q7XG4gICAgdmFyIHJlc3VsdCA9IHt9O1xuICAgIGlmIChtb2QgIT0gbnVsbCkgZm9yICh2YXIgayBpbiBtb2QpIGlmIChrICE9PSBcImRlZmF1bHRcIiAmJiBPYmplY3QuaGFzT3duUHJvcGVydHkuY2FsbChtb2QsIGspKSBfX2NyZWF0ZUJpbmRpbmcocmVzdWx0LCBtb2QsIGspO1xuICAgIF9fc2V0TW9kdWxlRGVmYXVsdChyZXN1bHQsIG1vZCk7XG4gICAgcmV0dXJuIHJlc3VsdDtcbn07XG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJfX2VzTW9kdWxlXCIsIHsgdmFsdWU6IHRydWUgfSk7XG5leHBvcnRzLmdldEFwaUJhc2VVcmwgPSBleHBvcnRzLmdldFByb3h5QWdlbnQgPSBleHBvcnRzLmdldEF1dGhTdHJpbmcgPSB2b2lkIDA7XG5jb25zdCBodHRwQ2xpZW50ID0gX19pbXBvcnRTdGFyKHJlcXVpcmUoXCJAYWN0aW9ucy9odHRwLWNsaWVudFwiKSk7XG5mdW5jdGlvbiBnZXRBdXRoU3RyaW5nKHRva2VuLCBvcHRpb25zKSB7XG4gICAgaWYgKCF0b2tlbiAmJiAhb3B0aW9ucy5hdXRoKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcignUGFyYW1ldGVyIHRva2VuIG9yIG9wdHMuYXV0aCBpcyByZXF1aXJlZCcpO1xuICAgIH1cbiAgICBlbHNlIGlmICh0b2tlbiAmJiBvcHRpb25zLmF1dGgpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdQYXJhbWV0ZXJzIHRva2VuIGFuZCBvcHRzLmF1dGggbWF5IG5vdCBib3RoIGJlIHNwZWNpZmllZCcpO1xuICAgIH1cbiAgICByZXR1cm4gdHlwZW9mIG9wdGlvbnMuYXV0aCA9PT0gJ3N0cmluZycgPyBvcHRpb25zLmF1dGggOiBgdG9rZW4gJHt0b2tlbn1gO1xufVxuZXhwb3J0cy5nZXRBdXRoU3RyaW5nID0gZ2V0QXV0aFN0cmluZztcbmZ1bmN0aW9uIGdldFByb3h5QWdlbnQoZGVzdGluYXRpb25VcmwpIHtcbiAgICBjb25zdCBoYyA9IG5ldyBodHRwQ2xpZW50Lkh0dHBDbGllbnQoKTtcbiAgICByZXR1cm4gaGMuZ2V0QWdlbnQoZGVzdGluYXRpb25VcmwpO1xufVxuZXhwb3J0cy5nZXRQcm94eUFnZW50ID0gZ2V0UHJveHlBZ2VudDtcbmZ1bmN0aW9uIGdldEFwaUJhc2VVcmwoKSB7XG4gICAgcmV0dXJuIHByb2Nlc3MuZW52WydHSVRIVUJfQVBJX1VSTCddIHx8ICdodHRwczovL2FwaS5naXRodWIuY29tJztcbn1cbmV4cG9ydHMuZ2V0QXBpQmFzZVVybCA9IGdldEFwaUJhc2VVcmw7XG4vLyMgc291cmNlTWFwcGluZ1VSTD11dGlscy5qcy5tYXAiLAogICAgIid1c2Ugc3RyaWN0JztcblxuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsICdfX2VzTW9kdWxlJywgeyB2YWx1ZTogdHJ1ZSB9KTtcblxuLyohXG4gKiBpcy1wbGFpbi1vYmplY3QgPGh0dHBzOi8vZ2l0aHViLmNvbS9qb25zY2hsaW5rZXJ0L2lzLXBsYWluLW9iamVjdD5cbiAqXG4gKiBDb3B5cmlnaHQgKGMpIDIwMTQtMjAxNywgSm9uIFNjaGxpbmtlcnQuXG4gKiBSZWxlYXNlZCB1bmRlciB0aGUgTUlUIExpY2Vuc2UuXG4gKi9cblxuZnVuY3Rpb24gaXNPYmplY3Qobykge1xuICByZXR1cm4gT2JqZWN0LnByb3RvdHlwZS50b1N0cmluZy5jYWxsKG8pID09PSAnW29iamVjdCBPYmplY3RdJztcbn1cblxuZnVuY3Rpb24gaXNQbGFpbk9iamVjdChvKSB7XG4gIHZhciBjdG9yLHByb3Q7XG5cbiAgaWYgKGlzT2JqZWN0KG8pID09PSBmYWxzZSkgcmV0dXJuIGZhbHNlO1xuXG4gIC8vIElmIGhhcyBtb2RpZmllZCBjb25zdHJ1Y3RvclxuICBjdG9yID0gby5jb25zdHJ1Y3RvcjtcbiAgaWYgKGN0b3IgPT09IHVuZGVmaW5lZCkgcmV0dXJuIHRydWU7XG5cbiAgLy8gSWYgaGFzIG1vZGlmaWVkIHByb3RvdHlwZVxuICBwcm90ID0gY3Rvci5wcm90b3R5cGU7XG4gIGlmIChpc09iamVjdChwcm90KSA9PT0gZmFsc2UpIHJldHVybiBmYWxzZTtcblxuICAvLyBJZiBjb25zdHJ1Y3RvciBkb2VzIG5vdCBoYXZlIGFuIE9iamVjdC1zcGVjaWZpYyBtZXRob2RcbiAgaWYgKHByb3QuaGFzT3duUHJvcGVydHkoJ2lzUHJvdG90eXBlT2YnKSA9PT0gZmFsc2UpIHtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cblxuICAvLyBNb3N0IGxpa2VseSBhIHBsYWluIE9iamVjdFxuICByZXR1cm4gdHJ1ZTtcbn1cblxuZXhwb3J0cy5pc1BsYWluT2JqZWN0ID0gaXNQbGFpbk9iamVjdDtcbiIsCiAgICAiJ3VzZSBzdHJpY3QnO1xuXG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgJ19fZXNNb2R1bGUnLCB7IHZhbHVlOiB0cnVlIH0pO1xuXG52YXIgaXNQbGFpbk9iamVjdCA9IHJlcXVpcmUoJ2lzLXBsYWluLW9iamVjdCcpO1xudmFyIHVuaXZlcnNhbFVzZXJBZ2VudCA9IHJlcXVpcmUoJ3VuaXZlcnNhbC11c2VyLWFnZW50Jyk7XG5cbmZ1bmN0aW9uIGxvd2VyY2FzZUtleXMob2JqZWN0KSB7XG4gIGlmICghb2JqZWN0KSB7XG4gICAgcmV0dXJuIHt9O1xuICB9XG5cbiAgcmV0dXJuIE9iamVjdC5rZXlzKG9iamVjdCkucmVkdWNlKChuZXdPYmosIGtleSkgPT4ge1xuICAgIG5ld09ialtrZXkudG9Mb3dlckNhc2UoKV0gPSBvYmplY3Rba2V5XTtcbiAgICByZXR1cm4gbmV3T2JqO1xuICB9LCB7fSk7XG59XG5cbmZ1bmN0aW9uIG1lcmdlRGVlcChkZWZhdWx0cywgb3B0aW9ucykge1xuICBjb25zdCByZXN1bHQgPSBPYmplY3QuYXNzaWduKHt9LCBkZWZhdWx0cyk7XG4gIE9iamVjdC5rZXlzKG9wdGlvbnMpLmZvckVhY2goa2V5ID0+IHtcbiAgICBpZiAoaXNQbGFpbk9iamVjdC5pc1BsYWluT2JqZWN0KG9wdGlvbnNba2V5XSkpIHtcbiAgICAgIGlmICghKGtleSBpbiBkZWZhdWx0cykpIE9iamVjdC5hc3NpZ24ocmVzdWx0LCB7XG4gICAgICAgIFtrZXldOiBvcHRpb25zW2tleV1cbiAgICAgIH0pO2Vsc2UgcmVzdWx0W2tleV0gPSBtZXJnZURlZXAoZGVmYXVsdHNba2V5XSwgb3B0aW9uc1trZXldKTtcbiAgICB9IGVsc2Uge1xuICAgICAgT2JqZWN0LmFzc2lnbihyZXN1bHQsIHtcbiAgICAgICAgW2tleV06IG9wdGlvbnNba2V5XVxuICAgICAgfSk7XG4gICAgfVxuICB9KTtcbiAgcmV0dXJuIHJlc3VsdDtcbn1cblxuZnVuY3Rpb24gcmVtb3ZlVW5kZWZpbmVkUHJvcGVydGllcyhvYmopIHtcbiAgZm9yIChjb25zdCBrZXkgaW4gb2JqKSB7XG4gICAgaWYgKG9ialtrZXldID09PSB1bmRlZmluZWQpIHtcbiAgICAgIGRlbGV0ZSBvYmpba2V5XTtcbiAgICB9XG4gIH1cblxuICByZXR1cm4gb2JqO1xufVxuXG5mdW5jdGlvbiBtZXJnZShkZWZhdWx0cywgcm91dGUsIG9wdGlvbnMpIHtcbiAgaWYgKHR5cGVvZiByb3V0ZSA9PT0gXCJzdHJpbmdcIikge1xuICAgIGxldCBbbWV0aG9kLCB1cmxdID0gcm91dGUuc3BsaXQoXCIgXCIpO1xuICAgIG9wdGlvbnMgPSBPYmplY3QuYXNzaWduKHVybCA/IHtcbiAgICAgIG1ldGhvZCxcbiAgICAgIHVybFxuICAgIH0gOiB7XG4gICAgICB1cmw6IG1ldGhvZFxuICAgIH0sIG9wdGlvbnMpO1xuICB9IGVsc2Uge1xuICAgIG9wdGlvbnMgPSBPYmplY3QuYXNzaWduKHt9LCByb3V0ZSk7XG4gIH0gLy8gbG93ZXJjYXNlIGhlYWRlciBuYW1lcyBiZWZvcmUgbWVyZ2luZyB3aXRoIGRlZmF1bHRzIHRvIGF2b2lkIGR1cGxpY2F0ZXNcblxuXG4gIG9wdGlvbnMuaGVhZGVycyA9IGxvd2VyY2FzZUtleXMob3B0aW9ucy5oZWFkZXJzKTsgLy8gcmVtb3ZlIHByb3BlcnRpZXMgd2l0aCB1bmRlZmluZWQgdmFsdWVzIGJlZm9yZSBtZXJnaW5nXG5cbiAgcmVtb3ZlVW5kZWZpbmVkUHJvcGVydGllcyhvcHRpb25zKTtcbiAgcmVtb3ZlVW5kZWZpbmVkUHJvcGVydGllcyhvcHRpb25zLmhlYWRlcnMpO1xuICBjb25zdCBtZXJnZWRPcHRpb25zID0gbWVyZ2VEZWVwKGRlZmF1bHRzIHx8IHt9LCBvcHRpb25zKTsgLy8gbWVkaWFUeXBlLnByZXZpZXdzIGFycmF5cyBhcmUgbWVyZ2VkLCBpbnN0ZWFkIG9mIG92ZXJ3cml0dGVuXG5cbiAgaWYgKGRlZmF1bHRzICYmIGRlZmF1bHRzLm1lZGlhVHlwZS5wcmV2aWV3cy5sZW5ndGgpIHtcbiAgICBtZXJnZWRPcHRpb25zLm1lZGlhVHlwZS5wcmV2aWV3cyA9IGRlZmF1bHRzLm1lZGlhVHlwZS5wcmV2aWV3cy5maWx0ZXIocHJldmlldyA9PiAhbWVyZ2VkT3B0aW9ucy5tZWRpYVR5cGUucHJldmlld3MuaW5jbHVkZXMocHJldmlldykpLmNvbmNhdChtZXJnZWRPcHRpb25zLm1lZGlhVHlwZS5wcmV2aWV3cyk7XG4gIH1cblxuICBtZXJnZWRPcHRpb25zLm1lZGlhVHlwZS5wcmV2aWV3cyA9IG1lcmdlZE9wdGlvbnMubWVkaWFUeXBlLnByZXZpZXdzLm1hcChwcmV2aWV3ID0+IHByZXZpZXcucmVwbGFjZSgvLXByZXZpZXcvLCBcIlwiKSk7XG4gIHJldHVybiBtZXJnZWRPcHRpb25zO1xufVxuXG5mdW5jdGlvbiBhZGRRdWVyeVBhcmFtZXRlcnModXJsLCBwYXJhbWV0ZXJzKSB7XG4gIGNvbnN0IHNlcGFyYXRvciA9IC9cXD8vLnRlc3QodXJsKSA/IFwiJlwiIDogXCI/XCI7XG4gIGNvbnN0IG5hbWVzID0gT2JqZWN0LmtleXMocGFyYW1ldGVycyk7XG5cbiAgaWYgKG5hbWVzLmxlbmd0aCA9PT0gMCkge1xuICAgIHJldHVybiB1cmw7XG4gIH1cblxuICByZXR1cm4gdXJsICsgc2VwYXJhdG9yICsgbmFtZXMubWFwKG5hbWUgPT4ge1xuICAgIGlmIChuYW1lID09PSBcInFcIikge1xuICAgICAgcmV0dXJuIFwicT1cIiArIHBhcmFtZXRlcnMucS5zcGxpdChcIitcIikubWFwKGVuY29kZVVSSUNvbXBvbmVudCkuam9pbihcIitcIik7XG4gICAgfVxuXG4gICAgcmV0dXJuIGAke25hbWV9PSR7ZW5jb2RlVVJJQ29tcG9uZW50KHBhcmFtZXRlcnNbbmFtZV0pfWA7XG4gIH0pLmpvaW4oXCImXCIpO1xufVxuXG5jb25zdCB1cmxWYXJpYWJsZVJlZ2V4ID0gL1xce1tefV0rXFx9L2c7XG5cbmZ1bmN0aW9uIHJlbW92ZU5vbkNoYXJzKHZhcmlhYmxlTmFtZSkge1xuICByZXR1cm4gdmFyaWFibGVOYW1lLnJlcGxhY2UoL15cXFcrfFxcVyskL2csIFwiXCIpLnNwbGl0KC8sLyk7XG59XG5cbmZ1bmN0aW9uIGV4dHJhY3RVcmxWYXJpYWJsZU5hbWVzKHVybCkge1xuICBjb25zdCBtYXRjaGVzID0gdXJsLm1hdGNoKHVybFZhcmlhYmxlUmVnZXgpO1xuXG4gIGlmICghbWF0Y2hlcykge1xuICAgIHJldHVybiBbXTtcbiAgfVxuXG4gIHJldHVybiBtYXRjaGVzLm1hcChyZW1vdmVOb25DaGFycykucmVkdWNlKChhLCBiKSA9PiBhLmNvbmNhdChiKSwgW10pO1xufVxuXG5mdW5jdGlvbiBvbWl0KG9iamVjdCwga2V5c1RvT21pdCkge1xuICByZXR1cm4gT2JqZWN0LmtleXMob2JqZWN0KS5maWx0ZXIob3B0aW9uID0+ICFrZXlzVG9PbWl0LmluY2x1ZGVzKG9wdGlvbikpLnJlZHVjZSgob2JqLCBrZXkpID0+IHtcbiAgICBvYmpba2V5XSA9IG9iamVjdFtrZXldO1xuICAgIHJldHVybiBvYmo7XG4gIH0sIHt9KTtcbn1cblxuLy8gQmFzZWQgb24gaHR0cHM6Ly9naXRodWIuY29tL2JyYW1zdGVpbi91cmwtdGVtcGxhdGUsIGxpY2Vuc2VkIHVuZGVyIEJTRFxuLy8gVE9ETzogY3JlYXRlIHNlcGFyYXRlIHBhY2thZ2UuXG4vL1xuLy8gQ29weXJpZ2h0IChjKSAyMDEyLTIwMTQsIEJyYW0gU3RlaW5cbi8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuXG4vLyBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXRcbi8vIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uc1xuLy8gYXJlIG1ldDpcbi8vICAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodFxuLy8gICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci5cbi8vICAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodFxuLy8gICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGVcbi8vICAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLlxuLy8gIDMuIFRoZSBuYW1lIG9mIHRoZSBhdXRob3IgbWF5IG5vdCBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0c1xuLy8gICAgIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLlxuLy8gVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQVVUSE9SIFwiQVMgSVNcIiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRFxuLy8gV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0Zcbi8vIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PXG4vLyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUIE9XTkVSIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsXG4vLyBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORyxcbi8vIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsXG4vLyBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZXG4vLyBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElOR1xuLy8gTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLFxuLy8gRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS5cblxuLyogaXN0YW5idWwgaWdub3JlIGZpbGUgKi9cbmZ1bmN0aW9uIGVuY29kZVJlc2VydmVkKHN0cikge1xuICByZXR1cm4gc3RyLnNwbGl0KC8oJVswLTlBLUZhLWZdezJ9KS9nKS5tYXAoZnVuY3Rpb24gKHBhcnQpIHtcbiAgICBpZiAoIS8lWzAtOUEtRmEtZl0vLnRlc3QocGFydCkpIHtcbiAgICAgIHBhcnQgPSBlbmNvZGVVUkkocGFydCkucmVwbGFjZSgvJTVCL2csIFwiW1wiKS5yZXBsYWNlKC8lNUQvZywgXCJdXCIpO1xuICAgIH1cblxuICAgIHJldHVybiBwYXJ0O1xuICB9KS5qb2luKFwiXCIpO1xufVxuXG5mdW5jdGlvbiBlbmNvZGVVbnJlc2VydmVkKHN0cikge1xuICByZXR1cm4gZW5jb2RlVVJJQ29tcG9uZW50KHN0cikucmVwbGFjZSgvWyEnKCkqXS9nLCBmdW5jdGlvbiAoYykge1xuICAgIHJldHVybiBcIiVcIiArIGMuY2hhckNvZGVBdCgwKS50b1N0cmluZygxNikudG9VcHBlckNhc2UoKTtcbiAgfSk7XG59XG5cbmZ1bmN0aW9uIGVuY29kZVZhbHVlKG9wZXJhdG9yLCB2YWx1ZSwga2V5KSB7XG4gIHZhbHVlID0gb3BlcmF0b3IgPT09IFwiK1wiIHx8IG9wZXJhdG9yID09PSBcIiNcIiA/IGVuY29kZVJlc2VydmVkKHZhbHVlKSA6IGVuY29kZVVucmVzZXJ2ZWQodmFsdWUpO1xuXG4gIGlmIChrZXkpIHtcbiAgICByZXR1cm4gZW5jb2RlVW5yZXNlcnZlZChrZXkpICsgXCI9XCIgKyB2YWx1ZTtcbiAgfSBlbHNlIHtcbiAgICByZXR1cm4gdmFsdWU7XG4gIH1cbn1cblxuZnVuY3Rpb24gaXNEZWZpbmVkKHZhbHVlKSB7XG4gIHJldHVybiB2YWx1ZSAhPT0gdW5kZWZpbmVkICYmIHZhbHVlICE9PSBudWxsO1xufVxuXG5mdW5jdGlvbiBpc0tleU9wZXJhdG9yKG9wZXJhdG9yKSB7XG4gIHJldHVybiBvcGVyYXRvciA9PT0gXCI7XCIgfHwgb3BlcmF0b3IgPT09IFwiJlwiIHx8IG9wZXJhdG9yID09PSBcIj9cIjtcbn1cblxuZnVuY3Rpb24gZ2V0VmFsdWVzKGNvbnRleHQsIG9wZXJhdG9yLCBrZXksIG1vZGlmaWVyKSB7XG4gIHZhciB2YWx1ZSA9IGNvbnRleHRba2V5XSxcbiAgICAgIHJlc3VsdCA9IFtdO1xuXG4gIGlmIChpc0RlZmluZWQodmFsdWUpICYmIHZhbHVlICE9PSBcIlwiKSB7XG4gICAgaWYgKHR5cGVvZiB2YWx1ZSA9PT0gXCJzdHJpbmdcIiB8fCB0eXBlb2YgdmFsdWUgPT09IFwibnVtYmVyXCIgfHwgdHlwZW9mIHZhbHVlID09PSBcImJvb2xlYW5cIikge1xuICAgICAgdmFsdWUgPSB2YWx1ZS50b1N0cmluZygpO1xuXG4gICAgICBpZiAobW9kaWZpZXIgJiYgbW9kaWZpZXIgIT09IFwiKlwiKSB7XG4gICAgICAgIHZhbHVlID0gdmFsdWUuc3Vic3RyaW5nKDAsIHBhcnNlSW50KG1vZGlmaWVyLCAxMCkpO1xuICAgICAgfVxuXG4gICAgICByZXN1bHQucHVzaChlbmNvZGVWYWx1ZShvcGVyYXRvciwgdmFsdWUsIGlzS2V5T3BlcmF0b3Iob3BlcmF0b3IpID8ga2V5IDogXCJcIikpO1xuICAgIH0gZWxzZSB7XG4gICAgICBpZiAobW9kaWZpZXIgPT09IFwiKlwiKSB7XG4gICAgICAgIGlmIChBcnJheS5pc0FycmF5KHZhbHVlKSkge1xuICAgICAgICAgIHZhbHVlLmZpbHRlcihpc0RlZmluZWQpLmZvckVhY2goZnVuY3Rpb24gKHZhbHVlKSB7XG4gICAgICAgICAgICByZXN1bHQucHVzaChlbmNvZGVWYWx1ZShvcGVyYXRvciwgdmFsdWUsIGlzS2V5T3BlcmF0b3Iob3BlcmF0b3IpID8ga2V5IDogXCJcIikpO1xuICAgICAgICAgIH0pO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIE9iamVjdC5rZXlzKHZhbHVlKS5mb3JFYWNoKGZ1bmN0aW9uIChrKSB7XG4gICAgICAgICAgICBpZiAoaXNEZWZpbmVkKHZhbHVlW2tdKSkge1xuICAgICAgICAgICAgICByZXN1bHQucHVzaChlbmNvZGVWYWx1ZShvcGVyYXRvciwgdmFsdWVba10sIGspKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgY29uc3QgdG1wID0gW107XG5cbiAgICAgICAgaWYgKEFycmF5LmlzQXJyYXkodmFsdWUpKSB7XG4gICAgICAgICAgdmFsdWUuZmlsdGVyKGlzRGVmaW5lZCkuZm9yRWFjaChmdW5jdGlvbiAodmFsdWUpIHtcbiAgICAgICAgICAgIHRtcC5wdXNoKGVuY29kZVZhbHVlKG9wZXJhdG9yLCB2YWx1ZSkpO1xuICAgICAgICAgIH0pO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIE9iamVjdC5rZXlzKHZhbHVlKS5mb3JFYWNoKGZ1bmN0aW9uIChrKSB7XG4gICAgICAgICAgICBpZiAoaXNEZWZpbmVkKHZhbHVlW2tdKSkge1xuICAgICAgICAgICAgICB0bXAucHVzaChlbmNvZGVVbnJlc2VydmVkKGspKTtcbiAgICAgICAgICAgICAgdG1wLnB1c2goZW5jb2RlVmFsdWUob3BlcmF0b3IsIHZhbHVlW2tdLnRvU3RyaW5nKCkpKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9KTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChpc0tleU9wZXJhdG9yKG9wZXJhdG9yKSkge1xuICAgICAgICAgIHJlc3VsdC5wdXNoKGVuY29kZVVucmVzZXJ2ZWQoa2V5KSArIFwiPVwiICsgdG1wLmpvaW4oXCIsXCIpKTtcbiAgICAgICAgfSBlbHNlIGlmICh0bXAubGVuZ3RoICE9PSAwKSB7XG4gICAgICAgICAgcmVzdWx0LnB1c2godG1wLmpvaW4oXCIsXCIpKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgfSBlbHNlIHtcbiAgICBpZiAob3BlcmF0b3IgPT09IFwiO1wiKSB7XG4gICAgICBpZiAoaXNEZWZpbmVkKHZhbHVlKSkge1xuICAgICAgICByZXN1bHQucHVzaChlbmNvZGVVbnJlc2VydmVkKGtleSkpO1xuICAgICAgfVxuICAgIH0gZWxzZSBpZiAodmFsdWUgPT09IFwiXCIgJiYgKG9wZXJhdG9yID09PSBcIiZcIiB8fCBvcGVyYXRvciA9PT0gXCI/XCIpKSB7XG4gICAgICByZXN1bHQucHVzaChlbmNvZGVVbnJlc2VydmVkKGtleSkgKyBcIj1cIik7XG4gICAgfSBlbHNlIGlmICh2YWx1ZSA9PT0gXCJcIikge1xuICAgICAgcmVzdWx0LnB1c2goXCJcIik7XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIHJlc3VsdDtcbn1cblxuZnVuY3Rpb24gcGFyc2VVcmwodGVtcGxhdGUpIHtcbiAgcmV0dXJuIHtcbiAgICBleHBhbmQ6IGV4cGFuZC5iaW5kKG51bGwsIHRlbXBsYXRlKVxuICB9O1xufVxuXG5mdW5jdGlvbiBleHBhbmQodGVtcGxhdGUsIGNvbnRleHQpIHtcbiAgdmFyIG9wZXJhdG9ycyA9IFtcIitcIiwgXCIjXCIsIFwiLlwiLCBcIi9cIiwgXCI7XCIsIFwiP1wiLCBcIiZcIl07XG4gIHJldHVybiB0ZW1wbGF0ZS5yZXBsYWNlKC9cXHsoW15cXHtcXH1dKylcXH18KFteXFx7XFx9XSspL2csIGZ1bmN0aW9uIChfLCBleHByZXNzaW9uLCBsaXRlcmFsKSB7XG4gICAgaWYgKGV4cHJlc3Npb24pIHtcbiAgICAgIGxldCBvcGVyYXRvciA9IFwiXCI7XG4gICAgICBjb25zdCB2YWx1ZXMgPSBbXTtcblxuICAgICAgaWYgKG9wZXJhdG9ycy5pbmRleE9mKGV4cHJlc3Npb24uY2hhckF0KDApKSAhPT0gLTEpIHtcbiAgICAgICAgb3BlcmF0b3IgPSBleHByZXNzaW9uLmNoYXJBdCgwKTtcbiAgICAgICAgZXhwcmVzc2lvbiA9IGV4cHJlc3Npb24uc3Vic3RyKDEpO1xuICAgICAgfVxuXG4gICAgICBleHByZXNzaW9uLnNwbGl0KC8sL2cpLmZvckVhY2goZnVuY3Rpb24gKHZhcmlhYmxlKSB7XG4gICAgICAgIHZhciB0bXAgPSAvKFteOlxcKl0qKSg/OjooXFxkKyl8KFxcKikpPy8uZXhlYyh2YXJpYWJsZSk7XG4gICAgICAgIHZhbHVlcy5wdXNoKGdldFZhbHVlcyhjb250ZXh0LCBvcGVyYXRvciwgdG1wWzFdLCB0bXBbMl0gfHwgdG1wWzNdKSk7XG4gICAgICB9KTtcblxuICAgICAgaWYgKG9wZXJhdG9yICYmIG9wZXJhdG9yICE9PSBcIitcIikge1xuICAgICAgICB2YXIgc2VwYXJhdG9yID0gXCIsXCI7XG5cbiAgICAgICAgaWYgKG9wZXJhdG9yID09PSBcIj9cIikge1xuICAgICAgICAgIHNlcGFyYXRvciA9IFwiJlwiO1xuICAgICAgICB9IGVsc2UgaWYgKG9wZXJhdG9yICE9PSBcIiNcIikge1xuICAgICAgICAgIHNlcGFyYXRvciA9IG9wZXJhdG9yO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuICh2YWx1ZXMubGVuZ3RoICE9PSAwID8gb3BlcmF0b3IgOiBcIlwiKSArIHZhbHVlcy5qb2luKHNlcGFyYXRvcik7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICByZXR1cm4gdmFsdWVzLmpvaW4oXCIsXCIpO1xuICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICByZXR1cm4gZW5jb2RlUmVzZXJ2ZWQobGl0ZXJhbCk7XG4gICAgfVxuICB9KTtcbn1cblxuZnVuY3Rpb24gcGFyc2Uob3B0aW9ucykge1xuICAvLyBodHRwczovL2ZldGNoLnNwZWMud2hhdHdnLm9yZy8jbWV0aG9kc1xuICBsZXQgbWV0aG9kID0gb3B0aW9ucy5tZXRob2QudG9VcHBlckNhc2UoKTsgLy8gcmVwbGFjZSA6dmFybmFtZSB3aXRoIHt2YXJuYW1lfSB0byBtYWtlIGl0IFJGQyA2NTcwIGNvbXBhdGlibGVcblxuICBsZXQgdXJsID0gKG9wdGlvbnMudXJsIHx8IFwiL1wiKS5yZXBsYWNlKC86KFthLXpdXFx3KykvZywgXCJ7JDF9XCIpO1xuICBsZXQgaGVhZGVycyA9IE9iamVjdC5hc3NpZ24oe30sIG9wdGlvbnMuaGVhZGVycyk7XG4gIGxldCBib2R5O1xuICBsZXQgcGFyYW1ldGVycyA9IG9taXQob3B0aW9ucywgW1wibWV0aG9kXCIsIFwiYmFzZVVybFwiLCBcInVybFwiLCBcImhlYWRlcnNcIiwgXCJyZXF1ZXN0XCIsIFwibWVkaWFUeXBlXCJdKTsgLy8gZXh0cmFjdCB2YXJpYWJsZSBuYW1lcyBmcm9tIFVSTCB0byBjYWxjdWxhdGUgcmVtYWluaW5nIHZhcmlhYmxlcyBsYXRlclxuXG4gIGNvbnN0IHVybFZhcmlhYmxlTmFtZXMgPSBleHRyYWN0VXJsVmFyaWFibGVOYW1lcyh1cmwpO1xuICB1cmwgPSBwYXJzZVVybCh1cmwpLmV4cGFuZChwYXJhbWV0ZXJzKTtcblxuICBpZiAoIS9eaHR0cC8udGVzdCh1cmwpKSB7XG4gICAgdXJsID0gb3B0aW9ucy5iYXNlVXJsICsgdXJsO1xuICB9XG5cbiAgY29uc3Qgb21pdHRlZFBhcmFtZXRlcnMgPSBPYmplY3Qua2V5cyhvcHRpb25zKS5maWx0ZXIob3B0aW9uID0+IHVybFZhcmlhYmxlTmFtZXMuaW5jbHVkZXMob3B0aW9uKSkuY29uY2F0KFwiYmFzZVVybFwiKTtcbiAgY29uc3QgcmVtYWluaW5nUGFyYW1ldGVycyA9IG9taXQocGFyYW1ldGVycywgb21pdHRlZFBhcmFtZXRlcnMpO1xuICBjb25zdCBpc0JpbmFyeVJlcXVlc3QgPSAvYXBwbGljYXRpb25cXC9vY3RldC1zdHJlYW0vaS50ZXN0KGhlYWRlcnMuYWNjZXB0KTtcblxuICBpZiAoIWlzQmluYXJ5UmVxdWVzdCkge1xuICAgIGlmIChvcHRpb25zLm1lZGlhVHlwZS5mb3JtYXQpIHtcbiAgICAgIC8vIGUuZy4gYXBwbGljYXRpb24vdm5kLmdpdGh1Yi52Mytqc29uID0+IGFwcGxpY2F0aW9uL3ZuZC5naXRodWIudjMucmF3XG4gICAgICBoZWFkZXJzLmFjY2VwdCA9IGhlYWRlcnMuYWNjZXB0LnNwbGl0KC8sLykubWFwKHByZXZpZXcgPT4gcHJldmlldy5yZXBsYWNlKC9hcHBsaWNhdGlvblxcL3ZuZChcXC5cXHcrKShcXC52Myk/KFxcLlxcdyspPyhcXCtqc29uKT8kLywgYGFwcGxpY2F0aW9uL3ZuZCQxJDIuJHtvcHRpb25zLm1lZGlhVHlwZS5mb3JtYXR9YCkpLmpvaW4oXCIsXCIpO1xuICAgIH1cblxuICAgIGlmIChvcHRpb25zLm1lZGlhVHlwZS5wcmV2aWV3cy5sZW5ndGgpIHtcbiAgICAgIGNvbnN0IHByZXZpZXdzRnJvbUFjY2VwdEhlYWRlciA9IGhlYWRlcnMuYWNjZXB0Lm1hdGNoKC9bXFx3LV0rKD89LXByZXZpZXcpL2cpIHx8IFtdO1xuICAgICAgaGVhZGVycy5hY2NlcHQgPSBwcmV2aWV3c0Zyb21BY2NlcHRIZWFkZXIuY29uY2F0KG9wdGlvbnMubWVkaWFUeXBlLnByZXZpZXdzKS5tYXAocHJldmlldyA9PiB7XG4gICAgICAgIGNvbnN0IGZvcm1hdCA9IG9wdGlvbnMubWVkaWFUeXBlLmZvcm1hdCA/IGAuJHtvcHRpb25zLm1lZGlhVHlwZS5mb3JtYXR9YCA6IFwiK2pzb25cIjtcbiAgICAgICAgcmV0dXJuIGBhcHBsaWNhdGlvbi92bmQuZ2l0aHViLiR7cHJldmlld30tcHJldmlldyR7Zm9ybWF0fWA7XG4gICAgICB9KS5qb2luKFwiLFwiKTtcbiAgICB9XG4gIH0gLy8gZm9yIEdFVC9IRUFEIHJlcXVlc3RzLCBzZXQgVVJMIHF1ZXJ5IHBhcmFtZXRlcnMgZnJvbSByZW1haW5pbmcgcGFyYW1ldGVyc1xuICAvLyBmb3IgUEFUQ0gvUE9TVC9QVVQvREVMRVRFIHJlcXVlc3RzLCBzZXQgcmVxdWVzdCBib2R5IGZyb20gcmVtYWluaW5nIHBhcmFtZXRlcnNcblxuXG4gIGlmIChbXCJHRVRcIiwgXCJIRUFEXCJdLmluY2x1ZGVzKG1ldGhvZCkpIHtcbiAgICB1cmwgPSBhZGRRdWVyeVBhcmFtZXRlcnModXJsLCByZW1haW5pbmdQYXJhbWV0ZXJzKTtcbiAgfSBlbHNlIHtcbiAgICBpZiAoXCJkYXRhXCIgaW4gcmVtYWluaW5nUGFyYW1ldGVycykge1xuICAgICAgYm9keSA9IHJlbWFpbmluZ1BhcmFtZXRlcnMuZGF0YTtcbiAgICB9IGVsc2Uge1xuICAgICAgaWYgKE9iamVjdC5rZXlzKHJlbWFpbmluZ1BhcmFtZXRlcnMpLmxlbmd0aCkge1xuICAgICAgICBib2R5ID0gcmVtYWluaW5nUGFyYW1ldGVycztcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGhlYWRlcnNbXCJjb250ZW50LWxlbmd0aFwiXSA9IDA7XG4gICAgICB9XG4gICAgfVxuICB9IC8vIGRlZmF1bHQgY29udGVudC10eXBlIGZvciBKU09OIGlmIGJvZHkgaXMgc2V0XG5cblxuICBpZiAoIWhlYWRlcnNbXCJjb250ZW50LXR5cGVcIl0gJiYgdHlwZW9mIGJvZHkgIT09IFwidW5kZWZpbmVkXCIpIHtcbiAgICBoZWFkZXJzW1wiY29udGVudC10eXBlXCJdID0gXCJhcHBsaWNhdGlvbi9qc29uOyBjaGFyc2V0PXV0Zi04XCI7XG4gIH0gLy8gR2l0SHViIGV4cGVjdHMgJ2NvbnRlbnQtbGVuZ3RoOiAwJyBoZWFkZXIgZm9yIFBVVC9QQVRDSCByZXF1ZXN0cyB3aXRob3V0IGJvZHkuXG4gIC8vIGZldGNoIGRvZXMgbm90IGFsbG93IHRvIHNldCBgY29udGVudC1sZW5ndGhgIGhlYWRlciwgYnV0IHdlIGNhbiBzZXQgYm9keSB0byBhbiBlbXB0eSBzdHJpbmdcblxuXG4gIGlmIChbXCJQQVRDSFwiLCBcIlBVVFwiXS5pbmNsdWRlcyhtZXRob2QpICYmIHR5cGVvZiBib2R5ID09PSBcInVuZGVmaW5lZFwiKSB7XG4gICAgYm9keSA9IFwiXCI7XG4gIH0gLy8gT25seSByZXR1cm4gYm9keS9yZXF1ZXN0IGtleXMgaWYgcHJlc2VudFxuXG5cbiAgcmV0dXJuIE9iamVjdC5hc3NpZ24oe1xuICAgIG1ldGhvZCxcbiAgICB1cmwsXG4gICAgaGVhZGVyc1xuICB9LCB0eXBlb2YgYm9keSAhPT0gXCJ1bmRlZmluZWRcIiA/IHtcbiAgICBib2R5XG4gIH0gOiBudWxsLCBvcHRpb25zLnJlcXVlc3QgPyB7XG4gICAgcmVxdWVzdDogb3B0aW9ucy5yZXF1ZXN0XG4gIH0gOiBudWxsKTtcbn1cblxuZnVuY3Rpb24gZW5kcG9pbnRXaXRoRGVmYXVsdHMoZGVmYXVsdHMsIHJvdXRlLCBvcHRpb25zKSB7XG4gIHJldHVybiBwYXJzZShtZXJnZShkZWZhdWx0cywgcm91dGUsIG9wdGlvbnMpKTtcbn1cblxuZnVuY3Rpb24gd2l0aERlZmF1bHRzKG9sZERlZmF1bHRzLCBuZXdEZWZhdWx0cykge1xuICBjb25zdCBERUZBVUxUUyA9IG1lcmdlKG9sZERlZmF1bHRzLCBuZXdEZWZhdWx0cyk7XG4gIGNvbnN0IGVuZHBvaW50ID0gZW5kcG9pbnRXaXRoRGVmYXVsdHMuYmluZChudWxsLCBERUZBVUxUUyk7XG4gIHJldHVybiBPYmplY3QuYXNzaWduKGVuZHBvaW50LCB7XG4gICAgREVGQVVMVFMsXG4gICAgZGVmYXVsdHM6IHdpdGhEZWZhdWx0cy5iaW5kKG51bGwsIERFRkFVTFRTKSxcbiAgICBtZXJnZTogbWVyZ2UuYmluZChudWxsLCBERUZBVUxUUyksXG4gICAgcGFyc2VcbiAgfSk7XG59XG5cbmNvbnN0IFZFUlNJT04gPSBcIjYuMC4xMlwiO1xuXG5jb25zdCB1c2VyQWdlbnQgPSBgb2N0b2tpdC1lbmRwb2ludC5qcy8ke1ZFUlNJT059ICR7dW5pdmVyc2FsVXNlckFnZW50LmdldFVzZXJBZ2VudCgpfWA7IC8vIERFRkFVTFRTIGhhcyBhbGwgcHJvcGVydGllcyBzZXQgdGhhdCBFbmRwb2ludE9wdGlvbnMgaGFzLCBleGNlcHQgdXJsLlxuLy8gU28gd2UgdXNlIFJlcXVlc3RQYXJhbWV0ZXJzIGFuZCBhZGQgbWV0aG9kIGFzIGFkZGl0aW9uYWwgcmVxdWlyZWQgcHJvcGVydHkuXG5cbmNvbnN0IERFRkFVTFRTID0ge1xuICBtZXRob2Q6IFwiR0VUXCIsXG4gIGJhc2VVcmw6IFwiaHR0cHM6Ly9hcGkuZ2l0aHViLmNvbVwiLFxuICBoZWFkZXJzOiB7XG4gICAgYWNjZXB0OiBcImFwcGxpY2F0aW9uL3ZuZC5naXRodWIudjMranNvblwiLFxuICAgIFwidXNlci1hZ2VudFwiOiB1c2VyQWdlbnRcbiAgfSxcbiAgbWVkaWFUeXBlOiB7XG4gICAgZm9ybWF0OiBcIlwiLFxuICAgIHByZXZpZXdzOiBbXVxuICB9XG59O1xuXG5jb25zdCBlbmRwb2ludCA9IHdpdGhEZWZhdWx0cyhudWxsLCBERUZBVUxUUyk7XG5cbmV4cG9ydHMuZW5kcG9pbnQgPSBlbmRwb2ludDtcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPWluZGV4LmpzLm1hcFxuIiwKICAgICJcInVzZSBzdHJpY3RcIjtcblxudmFyIGNvbnZlcnNpb25zID0ge307XG5tb2R1bGUuZXhwb3J0cyA9IGNvbnZlcnNpb25zO1xuXG5mdW5jdGlvbiBzaWduKHgpIHtcbiAgICByZXR1cm4geCA8IDAgPyAtMSA6IDE7XG59XG5cbmZ1bmN0aW9uIGV2ZW5Sb3VuZCh4KSB7XG4gICAgLy8gUm91bmQgeCB0byB0aGUgbmVhcmVzdCBpbnRlZ2VyLCBjaG9vc2luZyB0aGUgZXZlbiBpbnRlZ2VyIGlmIGl0IGxpZXMgaGFsZndheSBiZXR3ZWVuIHR3by5cbiAgICBpZiAoKHggJSAxKSA9PT0gMC41ICYmICh4ICYgMSkgPT09IDApIHsgLy8gW2V2ZW4gbnVtYmVyXS41OyByb3VuZCBkb3duIChpLmUuIGZsb29yKVxuICAgICAgICByZXR1cm4gTWF0aC5mbG9vcih4KTtcbiAgICB9IGVsc2Uge1xuICAgICAgICByZXR1cm4gTWF0aC5yb3VuZCh4KTtcbiAgICB9XG59XG5cbmZ1bmN0aW9uIGNyZWF0ZU51bWJlckNvbnZlcnNpb24oYml0TGVuZ3RoLCB0eXBlT3B0cykge1xuICAgIGlmICghdHlwZU9wdHMudW5zaWduZWQpIHtcbiAgICAgICAgLS1iaXRMZW5ndGg7XG4gICAgfVxuICAgIGNvbnN0IGxvd2VyQm91bmQgPSB0eXBlT3B0cy51bnNpZ25lZCA/IDAgOiAtTWF0aC5wb3coMiwgYml0TGVuZ3RoKTtcbiAgICBjb25zdCB1cHBlckJvdW5kID0gTWF0aC5wb3coMiwgYml0TGVuZ3RoKSAtIDE7XG5cbiAgICBjb25zdCBtb2R1bG9WYWwgPSB0eXBlT3B0cy5tb2R1bG9CaXRMZW5ndGggPyBNYXRoLnBvdygyLCB0eXBlT3B0cy5tb2R1bG9CaXRMZW5ndGgpIDogTWF0aC5wb3coMiwgYml0TGVuZ3RoKTtcbiAgICBjb25zdCBtb2R1bG9Cb3VuZCA9IHR5cGVPcHRzLm1vZHVsb0JpdExlbmd0aCA/IE1hdGgucG93KDIsIHR5cGVPcHRzLm1vZHVsb0JpdExlbmd0aCAtIDEpIDogTWF0aC5wb3coMiwgYml0TGVuZ3RoIC0gMSk7XG5cbiAgICByZXR1cm4gZnVuY3Rpb24oViwgb3B0cykge1xuICAgICAgICBpZiAoIW9wdHMpIG9wdHMgPSB7fTtcblxuICAgICAgICBsZXQgeCA9ICtWO1xuXG4gICAgICAgIGlmIChvcHRzLmVuZm9yY2VSYW5nZSkge1xuICAgICAgICAgICAgaWYgKCFOdW1iZXIuaXNGaW5pdGUoeCkpIHtcbiAgICAgICAgICAgICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKFwiQXJndW1lbnQgaXMgbm90IGEgZmluaXRlIG51bWJlclwiKTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgeCA9IHNpZ24oeCkgKiBNYXRoLmZsb29yKE1hdGguYWJzKHgpKTtcbiAgICAgICAgICAgIGlmICh4IDwgbG93ZXJCb3VuZCB8fCB4ID4gdXBwZXJCb3VuZCkge1xuICAgICAgICAgICAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoXCJBcmd1bWVudCBpcyBub3QgaW4gYnl0ZSByYW5nZVwiKTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgcmV0dXJuIHg7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoIWlzTmFOKHgpICYmIG9wdHMuY2xhbXApIHtcbiAgICAgICAgICAgIHggPSBldmVuUm91bmQoeCk7XG5cbiAgICAgICAgICAgIGlmICh4IDwgbG93ZXJCb3VuZCkgeCA9IGxvd2VyQm91bmQ7XG4gICAgICAgICAgICBpZiAoeCA+IHVwcGVyQm91bmQpIHggPSB1cHBlckJvdW5kO1xuICAgICAgICAgICAgcmV0dXJuIHg7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoIU51bWJlci5pc0Zpbml0ZSh4KSB8fCB4ID09PSAwKSB7XG4gICAgICAgICAgICByZXR1cm4gMDtcbiAgICAgICAgfVxuXG4gICAgICAgIHggPSBzaWduKHgpICogTWF0aC5mbG9vcihNYXRoLmFicyh4KSk7XG4gICAgICAgIHggPSB4ICUgbW9kdWxvVmFsO1xuXG4gICAgICAgIGlmICghdHlwZU9wdHMudW5zaWduZWQgJiYgeCA+PSBtb2R1bG9Cb3VuZCkge1xuICAgICAgICAgICAgcmV0dXJuIHggLSBtb2R1bG9WYWw7XG4gICAgICAgIH0gZWxzZSBpZiAodHlwZU9wdHMudW5zaWduZWQpIHtcbiAgICAgICAgICAgIGlmICh4IDwgMCkge1xuICAgICAgICAgICAgICB4ICs9IG1vZHVsb1ZhbDtcbiAgICAgICAgICAgIH0gZWxzZSBpZiAoeCA9PT0gLTApIHsgLy8gZG9uJ3QgcmV0dXJuIG5lZ2F0aXZlIHplcm9cbiAgICAgICAgICAgICAgcmV0dXJuIDA7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4geDtcbiAgICB9XG59XG5cbmNvbnZlcnNpb25zW1widm9pZFwiXSA9IGZ1bmN0aW9uICgpIHtcbiAgICByZXR1cm4gdW5kZWZpbmVkO1xufTtcblxuY29udmVyc2lvbnNbXCJib29sZWFuXCJdID0gZnVuY3Rpb24gKHZhbCkge1xuICAgIHJldHVybiAhIXZhbDtcbn07XG5cbmNvbnZlcnNpb25zW1wiYnl0ZVwiXSA9IGNyZWF0ZU51bWJlckNvbnZlcnNpb24oOCwgeyB1bnNpZ25lZDogZmFsc2UgfSk7XG5jb252ZXJzaW9uc1tcIm9jdGV0XCJdID0gY3JlYXRlTnVtYmVyQ29udmVyc2lvbig4LCB7IHVuc2lnbmVkOiB0cnVlIH0pO1xuXG5jb252ZXJzaW9uc1tcInNob3J0XCJdID0gY3JlYXRlTnVtYmVyQ29udmVyc2lvbigxNiwgeyB1bnNpZ25lZDogZmFsc2UgfSk7XG5jb252ZXJzaW9uc1tcInVuc2lnbmVkIHNob3J0XCJdID0gY3JlYXRlTnVtYmVyQ29udmVyc2lvbigxNiwgeyB1bnNpZ25lZDogdHJ1ZSB9KTtcblxuY29udmVyc2lvbnNbXCJsb25nXCJdID0gY3JlYXRlTnVtYmVyQ29udmVyc2lvbigzMiwgeyB1bnNpZ25lZDogZmFsc2UgfSk7XG5jb252ZXJzaW9uc1tcInVuc2lnbmVkIGxvbmdcIl0gPSBjcmVhdGVOdW1iZXJDb252ZXJzaW9uKDMyLCB7IHVuc2lnbmVkOiB0cnVlIH0pO1xuXG5jb252ZXJzaW9uc1tcImxvbmcgbG9uZ1wiXSA9IGNyZWF0ZU51bWJlckNvbnZlcnNpb24oMzIsIHsgdW5zaWduZWQ6IGZhbHNlLCBtb2R1bG9CaXRMZW5ndGg6IDY0IH0pO1xuY29udmVyc2lvbnNbXCJ1bnNpZ25lZCBsb25nIGxvbmdcIl0gPSBjcmVhdGVOdW1iZXJDb252ZXJzaW9uKDMyLCB7IHVuc2lnbmVkOiB0cnVlLCBtb2R1bG9CaXRMZW5ndGg6IDY0IH0pO1xuXG5jb252ZXJzaW9uc1tcImRvdWJsZVwiXSA9IGZ1bmN0aW9uIChWKSB7XG4gICAgY29uc3QgeCA9ICtWO1xuXG4gICAgaWYgKCFOdW1iZXIuaXNGaW5pdGUoeCkpIHtcbiAgICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcihcIkFyZ3VtZW50IGlzIG5vdCBhIGZpbml0ZSBmbG9hdGluZy1wb2ludCB2YWx1ZVwiKTtcbiAgICB9XG5cbiAgICByZXR1cm4geDtcbn07XG5cbmNvbnZlcnNpb25zW1widW5yZXN0cmljdGVkIGRvdWJsZVwiXSA9IGZ1bmN0aW9uIChWKSB7XG4gICAgY29uc3QgeCA9ICtWO1xuXG4gICAgaWYgKGlzTmFOKHgpKSB7XG4gICAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoXCJBcmd1bWVudCBpcyBOYU5cIik7XG4gICAgfVxuXG4gICAgcmV0dXJuIHg7XG59O1xuXG4vLyBub3QgcXVpdGUgdmFsaWQsIGJ1dCBnb29kIGVub3VnaCBmb3IgSlNcbmNvbnZlcnNpb25zW1wiZmxvYXRcIl0gPSBjb252ZXJzaW9uc1tcImRvdWJsZVwiXTtcbmNvbnZlcnNpb25zW1widW5yZXN0cmljdGVkIGZsb2F0XCJdID0gY29udmVyc2lvbnNbXCJ1bnJlc3RyaWN0ZWQgZG91YmxlXCJdO1xuXG5jb252ZXJzaW9uc1tcIkRPTVN0cmluZ1wiXSA9IGZ1bmN0aW9uIChWLCBvcHRzKSB7XG4gICAgaWYgKCFvcHRzKSBvcHRzID0ge307XG5cbiAgICBpZiAob3B0cy50cmVhdE51bGxBc0VtcHR5U3RyaW5nICYmIFYgPT09IG51bGwpIHtcbiAgICAgICAgcmV0dXJuIFwiXCI7XG4gICAgfVxuXG4gICAgcmV0dXJuIFN0cmluZyhWKTtcbn07XG5cbmNvbnZlcnNpb25zW1wiQnl0ZVN0cmluZ1wiXSA9IGZ1bmN0aW9uIChWLCBvcHRzKSB7XG4gICAgY29uc3QgeCA9IFN0cmluZyhWKTtcbiAgICBsZXQgYyA9IHVuZGVmaW5lZDtcbiAgICBmb3IgKGxldCBpID0gMDsgKGMgPSB4LmNvZGVQb2ludEF0KGkpKSAhPT0gdW5kZWZpbmVkOyArK2kpIHtcbiAgICAgICAgaWYgKGMgPiAyNTUpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoXCJBcmd1bWVudCBpcyBub3QgYSB2YWxpZCBieXRlc3RyaW5nXCIpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuIHg7XG59O1xuXG5jb252ZXJzaW9uc1tcIlVTVlN0cmluZ1wiXSA9IGZ1bmN0aW9uIChWKSB7XG4gICAgY29uc3QgUyA9IFN0cmluZyhWKTtcbiAgICBjb25zdCBuID0gUy5sZW5ndGg7XG4gICAgY29uc3QgVSA9IFtdO1xuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgbjsgKytpKSB7XG4gICAgICAgIGNvbnN0IGMgPSBTLmNoYXJDb2RlQXQoaSk7XG4gICAgICAgIGlmIChjIDwgMHhEODAwIHx8IGMgPiAweERGRkYpIHtcbiAgICAgICAgICAgIFUucHVzaChTdHJpbmcuZnJvbUNvZGVQb2ludChjKSk7XG4gICAgICAgIH0gZWxzZSBpZiAoMHhEQzAwIDw9IGMgJiYgYyA8PSAweERGRkYpIHtcbiAgICAgICAgICAgIFUucHVzaChTdHJpbmcuZnJvbUNvZGVQb2ludCgweEZGRkQpKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGlmIChpID09PSBuIC0gMSkge1xuICAgICAgICAgICAgICAgIFUucHVzaChTdHJpbmcuZnJvbUNvZGVQb2ludCgweEZGRkQpKTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgY29uc3QgZCA9IFMuY2hhckNvZGVBdChpICsgMSk7XG4gICAgICAgICAgICAgICAgaWYgKDB4REMwMCA8PSBkICYmIGQgPD0gMHhERkZGKSB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IGEgPSBjICYgMHgzRkY7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IGIgPSBkICYgMHgzRkY7XG4gICAgICAgICAgICAgICAgICAgIFUucHVzaChTdHJpbmcuZnJvbUNvZGVQb2ludCgoMiA8PCAxNSkgKyAoMiA8PCA5KSAqIGEgKyBiKSk7XG4gICAgICAgICAgICAgICAgICAgICsraTtcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICBVLnB1c2goU3RyaW5nLmZyb21Db2RlUG9pbnQoMHhGRkZEKSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuIFUuam9pbignJyk7XG59O1xuXG5jb252ZXJzaW9uc1tcIkRhdGVcIl0gPSBmdW5jdGlvbiAoViwgb3B0cykge1xuICAgIGlmICghKFYgaW5zdGFuY2VvZiBEYXRlKSkge1xuICAgICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKFwiQXJndW1lbnQgaXMgbm90IGEgRGF0ZSBvYmplY3RcIik7XG4gICAgfVxuICAgIGlmIChpc05hTihWKSkge1xuICAgICAgICByZXR1cm4gdW5kZWZpbmVkO1xuICAgIH1cblxuICAgIHJldHVybiBWO1xufTtcblxuY29udmVyc2lvbnNbXCJSZWdFeHBcIl0gPSBmdW5jdGlvbiAoViwgb3B0cykge1xuICAgIGlmICghKFYgaW5zdGFuY2VvZiBSZWdFeHApKSB7XG4gICAgICAgIFYgPSBuZXcgUmVnRXhwKFYpO1xuICAgIH1cblxuICAgIHJldHVybiBWO1xufTtcbiIsCiAgICAiXCJ1c2Ugc3RyaWN0XCI7XG5cbm1vZHVsZS5leHBvcnRzLm1peGluID0gZnVuY3Rpb24gbWl4aW4odGFyZ2V0LCBzb3VyY2UpIHtcbiAgY29uc3Qga2V5cyA9IE9iamVjdC5nZXRPd25Qcm9wZXJ0eU5hbWVzKHNvdXJjZSk7XG4gIGZvciAobGV0IGkgPSAwOyBpIDwga2V5cy5sZW5ndGg7ICsraSkge1xuICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0YXJnZXQsIGtleXNbaV0sIE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3Ioc291cmNlLCBrZXlzW2ldKSk7XG4gIH1cbn07XG5cbm1vZHVsZS5leHBvcnRzLndyYXBwZXJTeW1ib2wgPSBTeW1ib2woXCJ3cmFwcGVyXCIpO1xubW9kdWxlLmV4cG9ydHMuaW1wbFN5bWJvbCA9IFN5bWJvbChcImltcGxcIik7XG5cbm1vZHVsZS5leHBvcnRzLndyYXBwZXJGb3JJbXBsID0gZnVuY3Rpb24gKGltcGwpIHtcbiAgcmV0dXJuIGltcGxbbW9kdWxlLmV4cG9ydHMud3JhcHBlclN5bWJvbF07XG59O1xuXG5tb2R1bGUuZXhwb3J0cy5pbXBsRm9yV3JhcHBlciA9IGZ1bmN0aW9uICh3cmFwcGVyKSB7XG4gIHJldHVybiB3cmFwcGVyW21vZHVsZS5leHBvcnRzLmltcGxTeW1ib2xdO1xufTtcblxuIiwKICAgICJcInVzZSBzdHJpY3RcIjtcblxudmFyIHB1bnljb2RlID0gcmVxdWlyZShcInB1bnljb2RlXCIpO1xudmFyIG1hcHBpbmdUYWJsZSA9IHJlcXVpcmUoXCIuL2xpYi9tYXBwaW5nVGFibGUuanNvblwiKTtcblxudmFyIFBST0NFU1NJTkdfT1BUSU9OUyA9IHtcbiAgVFJBTlNJVElPTkFMOiAwLFxuICBOT05UUkFOU0lUSU9OQUw6IDFcbn07XG5cbmZ1bmN0aW9uIG5vcm1hbGl6ZShzdHIpIHsgLy8gZml4IGJ1ZyBpbiB2OFxuICByZXR1cm4gc3RyLnNwbGl0KCdcXHUwMDAwJykubWFwKGZ1bmN0aW9uIChzKSB7IHJldHVybiBzLm5vcm1hbGl6ZSgnTkZDJyk7IH0pLmpvaW4oJ1xcdTAwMDAnKTtcbn1cblxuZnVuY3Rpb24gZmluZFN0YXR1cyh2YWwpIHtcbiAgdmFyIHN0YXJ0ID0gMDtcbiAgdmFyIGVuZCA9IG1hcHBpbmdUYWJsZS5sZW5ndGggLSAxO1xuXG4gIHdoaWxlIChzdGFydCA8PSBlbmQpIHtcbiAgICB2YXIgbWlkID0gTWF0aC5mbG9vcigoc3RhcnQgKyBlbmQpIC8gMik7XG5cbiAgICB2YXIgdGFyZ2V0ID0gbWFwcGluZ1RhYmxlW21pZF07XG4gICAgaWYgKHRhcmdldFswXVswXSA8PSB2YWwgJiYgdGFyZ2V0WzBdWzFdID49IHZhbCkge1xuICAgICAgcmV0dXJuIHRhcmdldDtcbiAgICB9IGVsc2UgaWYgKHRhcmdldFswXVswXSA+IHZhbCkge1xuICAgICAgZW5kID0gbWlkIC0gMTtcbiAgICB9IGVsc2Uge1xuICAgICAgc3RhcnQgPSBtaWQgKyAxO1xuICAgIH1cbiAgfVxuXG4gIHJldHVybiBudWxsO1xufVxuXG52YXIgcmVnZXhBc3RyYWxTeW1ib2xzID0gL1tcXHVEODAwLVxcdURCRkZdW1xcdURDMDAtXFx1REZGRl0vZztcblxuZnVuY3Rpb24gY291bnRTeW1ib2xzKHN0cmluZykge1xuICByZXR1cm4gc3RyaW5nXG4gICAgLy8gcmVwbGFjZSBldmVyeSBzdXJyb2dhdGUgcGFpciB3aXRoIGEgQk1QIHN5bWJvbFxuICAgIC5yZXBsYWNlKHJlZ2V4QXN0cmFsU3ltYm9scywgJ18nKVxuICAgIC8vIHRoZW4gZ2V0IHRoZSBsZW5ndGhcbiAgICAubGVuZ3RoO1xufVxuXG5mdW5jdGlvbiBtYXBDaGFycyhkb21haW5fbmFtZSwgdXNlU1REMywgcHJvY2Vzc2luZ19vcHRpb24pIHtcbiAgdmFyIGhhc0Vycm9yID0gZmFsc2U7XG4gIHZhciBwcm9jZXNzZWQgPSBcIlwiO1xuXG4gIHZhciBsZW4gPSBjb3VudFN5bWJvbHMoZG9tYWluX25hbWUpO1xuICBmb3IgKHZhciBpID0gMDsgaSA8IGxlbjsgKytpKSB7XG4gICAgdmFyIGNvZGVQb2ludCA9IGRvbWFpbl9uYW1lLmNvZGVQb2ludEF0KGkpO1xuICAgIHZhciBzdGF0dXMgPSBmaW5kU3RhdHVzKGNvZGVQb2ludCk7XG5cbiAgICBzd2l0Y2ggKHN0YXR1c1sxXSkge1xuICAgICAgY2FzZSBcImRpc2FsbG93ZWRcIjpcbiAgICAgICAgaGFzRXJyb3IgPSB0cnVlO1xuICAgICAgICBwcm9jZXNzZWQgKz0gU3RyaW5nLmZyb21Db2RlUG9pbnQoY29kZVBvaW50KTtcbiAgICAgICAgYnJlYWs7XG4gICAgICBjYXNlIFwiaWdub3JlZFwiOlxuICAgICAgICBicmVhaztcbiAgICAgIGNhc2UgXCJtYXBwZWRcIjpcbiAgICAgICAgcHJvY2Vzc2VkICs9IFN0cmluZy5mcm9tQ29kZVBvaW50LmFwcGx5KFN0cmluZywgc3RhdHVzWzJdKTtcbiAgICAgICAgYnJlYWs7XG4gICAgICBjYXNlIFwiZGV2aWF0aW9uXCI6XG4gICAgICAgIGlmIChwcm9jZXNzaW5nX29wdGlvbiA9PT0gUFJPQ0VTU0lOR19PUFRJT05TLlRSQU5TSVRJT05BTCkge1xuICAgICAgICAgIHByb2Nlc3NlZCArPSBTdHJpbmcuZnJvbUNvZGVQb2ludC5hcHBseShTdHJpbmcsIHN0YXR1c1syXSk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgcHJvY2Vzc2VkICs9IFN0cmluZy5mcm9tQ29kZVBvaW50KGNvZGVQb2ludCk7XG4gICAgICAgIH1cbiAgICAgICAgYnJlYWs7XG4gICAgICBjYXNlIFwidmFsaWRcIjpcbiAgICAgICAgcHJvY2Vzc2VkICs9IFN0cmluZy5mcm9tQ29kZVBvaW50KGNvZGVQb2ludCk7XG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSBcImRpc2FsbG93ZWRfU1REM19tYXBwZWRcIjpcbiAgICAgICAgaWYgKHVzZVNURDMpIHtcbiAgICAgICAgICBoYXNFcnJvciA9IHRydWU7XG4gICAgICAgICAgcHJvY2Vzc2VkICs9IFN0cmluZy5mcm9tQ29kZVBvaW50KGNvZGVQb2ludCk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgcHJvY2Vzc2VkICs9IFN0cmluZy5mcm9tQ29kZVBvaW50LmFwcGx5KFN0cmluZywgc3RhdHVzWzJdKTtcbiAgICAgICAgfVxuICAgICAgICBicmVhaztcbiAgICAgIGNhc2UgXCJkaXNhbGxvd2VkX1NURDNfdmFsaWRcIjpcbiAgICAgICAgaWYgKHVzZVNURDMpIHtcbiAgICAgICAgICBoYXNFcnJvciA9IHRydWU7XG4gICAgICAgIH1cblxuICAgICAgICBwcm9jZXNzZWQgKz0gU3RyaW5nLmZyb21Db2RlUG9pbnQoY29kZVBvaW50KTtcbiAgICAgICAgYnJlYWs7XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIHtcbiAgICBzdHJpbmc6IHByb2Nlc3NlZCxcbiAgICBlcnJvcjogaGFzRXJyb3JcbiAgfTtcbn1cblxudmFyIGNvbWJpbmluZ01hcmtzUmVnZXggPSAvW1xcdTAzMDAtXFx1MDM2RlxcdTA0ODMtXFx1MDQ4OVxcdTA1OTEtXFx1MDVCRFxcdTA1QkZcXHUwNUMxXFx1MDVDMlxcdTA1QzRcXHUwNUM1XFx1MDVDN1xcdTA2MTAtXFx1MDYxQVxcdTA2NEItXFx1MDY1RlxcdTA2NzBcXHUwNkQ2LVxcdTA2RENcXHUwNkRGLVxcdTA2RTRcXHUwNkU3XFx1MDZFOFxcdTA2RUEtXFx1MDZFRFxcdTA3MTFcXHUwNzMwLVxcdTA3NEFcXHUwN0E2LVxcdTA3QjBcXHUwN0VCLVxcdTA3RjNcXHUwODE2LVxcdTA4MTlcXHUwODFCLVxcdTA4MjNcXHUwODI1LVxcdTA4MjdcXHUwODI5LVxcdTA4MkRcXHUwODU5LVxcdTA4NUJcXHUwOEU0LVxcdTA5MDNcXHUwOTNBLVxcdTA5M0NcXHUwOTNFLVxcdTA5NEZcXHUwOTUxLVxcdTA5NTdcXHUwOTYyXFx1MDk2M1xcdTA5ODEtXFx1MDk4M1xcdTA5QkNcXHUwOUJFLVxcdTA5QzRcXHUwOUM3XFx1MDlDOFxcdTA5Q0ItXFx1MDlDRFxcdTA5RDdcXHUwOUUyXFx1MDlFM1xcdTBBMDEtXFx1MEEwM1xcdTBBM0NcXHUwQTNFLVxcdTBBNDJcXHUwQTQ3XFx1MEE0OFxcdTBBNEItXFx1MEE0RFxcdTBBNTFcXHUwQTcwXFx1MEE3MVxcdTBBNzVcXHUwQTgxLVxcdTBBODNcXHUwQUJDXFx1MEFCRS1cXHUwQUM1XFx1MEFDNy1cXHUwQUM5XFx1MEFDQi1cXHUwQUNEXFx1MEFFMlxcdTBBRTNcXHUwQjAxLVxcdTBCMDNcXHUwQjNDXFx1MEIzRS1cXHUwQjQ0XFx1MEI0N1xcdTBCNDhcXHUwQjRCLVxcdTBCNERcXHUwQjU2XFx1MEI1N1xcdTBCNjJcXHUwQjYzXFx1MEI4MlxcdTBCQkUtXFx1MEJDMlxcdTBCQzYtXFx1MEJDOFxcdTBCQ0EtXFx1MEJDRFxcdTBCRDdcXHUwQzAwLVxcdTBDMDNcXHUwQzNFLVxcdTBDNDRcXHUwQzQ2LVxcdTBDNDhcXHUwQzRBLVxcdTBDNERcXHUwQzU1XFx1MEM1NlxcdTBDNjJcXHUwQzYzXFx1MEM4MS1cXHUwQzgzXFx1MENCQ1xcdTBDQkUtXFx1MENDNFxcdTBDQzYtXFx1MENDOFxcdTBDQ0EtXFx1MENDRFxcdTBDRDVcXHUwQ0Q2XFx1MENFMlxcdTBDRTNcXHUwRDAxLVxcdTBEMDNcXHUwRDNFLVxcdTBENDRcXHUwRDQ2LVxcdTBENDhcXHUwRDRBLVxcdTBENERcXHUwRDU3XFx1MEQ2MlxcdTBENjNcXHUwRDgyXFx1MEQ4M1xcdTBEQ0FcXHUwRENGLVxcdTBERDRcXHUwREQ2XFx1MEREOC1cXHUwRERGXFx1MERGMlxcdTBERjNcXHUwRTMxXFx1MEUzNC1cXHUwRTNBXFx1MEU0Ny1cXHUwRTRFXFx1MEVCMVxcdTBFQjQtXFx1MEVCOVxcdTBFQkJcXHUwRUJDXFx1MEVDOC1cXHUwRUNEXFx1MEYxOFxcdTBGMTlcXHUwRjM1XFx1MEYzN1xcdTBGMzlcXHUwRjNFXFx1MEYzRlxcdTBGNzEtXFx1MEY4NFxcdTBGODZcXHUwRjg3XFx1MEY4RC1cXHUwRjk3XFx1MEY5OS1cXHUwRkJDXFx1MEZDNlxcdTEwMkItXFx1MTAzRVxcdTEwNTYtXFx1MTA1OVxcdTEwNUUtXFx1MTA2MFxcdTEwNjItXFx1MTA2NFxcdTEwNjctXFx1MTA2RFxcdTEwNzEtXFx1MTA3NFxcdTEwODItXFx1MTA4RFxcdTEwOEZcXHUxMDlBLVxcdTEwOURcXHUxMzVELVxcdTEzNUZcXHUxNzEyLVxcdTE3MTRcXHUxNzMyLVxcdTE3MzRcXHUxNzUyXFx1MTc1M1xcdTE3NzJcXHUxNzczXFx1MTdCNC1cXHUxN0QzXFx1MTdERFxcdTE4MEItXFx1MTgwRFxcdTE4QTlcXHUxOTIwLVxcdTE5MkJcXHUxOTMwLVxcdTE5M0JcXHUxOUIwLVxcdTE5QzBcXHUxOUM4XFx1MTlDOVxcdTFBMTctXFx1MUExQlxcdTFBNTUtXFx1MUE1RVxcdTFBNjAtXFx1MUE3Q1xcdTFBN0ZcXHUxQUIwLVxcdTFBQkVcXHUxQjAwLVxcdTFCMDRcXHUxQjM0LVxcdTFCNDRcXHUxQjZCLVxcdTFCNzNcXHUxQjgwLVxcdTFCODJcXHUxQkExLVxcdTFCQURcXHUxQkU2LVxcdTFCRjNcXHUxQzI0LVxcdTFDMzdcXHUxQ0QwLVxcdTFDRDJcXHUxQ0Q0LVxcdTFDRThcXHUxQ0VEXFx1MUNGMi1cXHUxQ0Y0XFx1MUNGOFxcdTFDRjlcXHUxREMwLVxcdTFERjVcXHUxREZDLVxcdTFERkZcXHUyMEQwLVxcdTIwRjBcXHUyQ0VGLVxcdTJDRjFcXHUyRDdGXFx1MkRFMC1cXHUyREZGXFx1MzAyQS1cXHUzMDJGXFx1MzA5OVxcdTMwOUFcXHVBNjZGLVxcdUE2NzJcXHVBNjc0LVxcdUE2N0RcXHVBNjlGXFx1QTZGMFxcdUE2RjFcXHVBODAyXFx1QTgwNlxcdUE4MEJcXHVBODIzLVxcdUE4MjdcXHVBODgwXFx1QTg4MVxcdUE4QjQtXFx1QThDNFxcdUE4RTAtXFx1QThGMVxcdUE5MjYtXFx1QTkyRFxcdUE5NDctXFx1QTk1M1xcdUE5ODAtXFx1QTk4M1xcdUE5QjMtXFx1QTlDMFxcdUE5RTVcXHVBQTI5LVxcdUFBMzZcXHVBQTQzXFx1QUE0Q1xcdUFBNERcXHVBQTdCLVxcdUFBN0RcXHVBQUIwXFx1QUFCMi1cXHVBQUI0XFx1QUFCN1xcdUFBQjhcXHVBQUJFXFx1QUFCRlxcdUFBQzFcXHVBQUVCLVxcdUFBRUZcXHVBQUY1XFx1QUFGNlxcdUFCRTMtXFx1QUJFQVxcdUFCRUNcXHVBQkVEXFx1RkIxRVxcdUZFMDAtXFx1RkUwRlxcdUZFMjAtXFx1RkUyRF18XFx1RDgwMFtcXHVEREZEXFx1REVFMFxcdURGNzYtXFx1REY3QV18XFx1RDgwMltcXHVERTAxLVxcdURFMDNcXHVERTA1XFx1REUwNlxcdURFMEMtXFx1REUwRlxcdURFMzgtXFx1REUzQVxcdURFM0ZcXHVERUU1XFx1REVFNl18XFx1RDgwNFtcXHVEQzAwLVxcdURDMDJcXHVEQzM4LVxcdURDNDZcXHVEQzdGLVxcdURDODJcXHVEQ0IwLVxcdURDQkFcXHVERDAwLVxcdUREMDJcXHVERDI3LVxcdUREMzRcXHVERDczXFx1REQ4MC1cXHVERDgyXFx1RERCMy1cXHVEREMwXFx1REUyQy1cXHVERTM3XFx1REVERi1cXHVERUVBXFx1REYwMS1cXHVERjAzXFx1REYzQ1xcdURGM0UtXFx1REY0NFxcdURGNDdcXHVERjQ4XFx1REY0Qi1cXHVERjREXFx1REY1N1xcdURGNjJcXHVERjYzXFx1REY2Ni1cXHVERjZDXFx1REY3MC1cXHVERjc0XXxcXHVEODA1W1xcdURDQjAtXFx1RENDM1xcdUREQUYtXFx1RERCNVxcdUREQjgtXFx1RERDMFxcdURFMzAtXFx1REU0MFxcdURFQUItXFx1REVCN118XFx1RDgxQVtcXHVERUYwLVxcdURFRjRcXHVERjMwLVxcdURGMzZdfFxcdUQ4MUJbXFx1REY1MS1cXHVERjdFXFx1REY4Ri1cXHVERjkyXXxcXHVEODJGW1xcdURDOURcXHVEQzlFXXxcXHVEODM0W1xcdURENjUtXFx1REQ2OVxcdURENkQtXFx1REQ3MlxcdUREN0ItXFx1REQ4MlxcdUREODUtXFx1REQ4QlxcdUREQUEtXFx1RERBRFxcdURFNDItXFx1REU0NF18XFx1RDgzQVtcXHVEQ0QwLVxcdURDRDZdfFxcdURCNDBbXFx1REQwMC1cXHVEREVGXS87XG5cbmZ1bmN0aW9uIHZhbGlkYXRlTGFiZWwobGFiZWwsIHByb2Nlc3Npbmdfb3B0aW9uKSB7XG4gIGlmIChsYWJlbC5zdWJzdHIoMCwgNCkgPT09IFwieG4tLVwiKSB7XG4gICAgbGFiZWwgPSBwdW55Y29kZS50b1VuaWNvZGUobGFiZWwpO1xuICAgIHByb2Nlc3Npbmdfb3B0aW9uID0gUFJPQ0VTU0lOR19PUFRJT05TLk5PTlRSQU5TSVRJT05BTDtcbiAgfVxuXG4gIHZhciBlcnJvciA9IGZhbHNlO1xuXG4gIGlmIChub3JtYWxpemUobGFiZWwpICE9PSBsYWJlbCB8fFxuICAgICAgKGxhYmVsWzNdID09PSBcIi1cIiAmJiBsYWJlbFs0XSA9PT0gXCItXCIpIHx8XG4gICAgICBsYWJlbFswXSA9PT0gXCItXCIgfHwgbGFiZWxbbGFiZWwubGVuZ3RoIC0gMV0gPT09IFwiLVwiIHx8XG4gICAgICBsYWJlbC5pbmRleE9mKFwiLlwiKSAhPT0gLTEgfHxcbiAgICAgIGxhYmVsLnNlYXJjaChjb21iaW5pbmdNYXJrc1JlZ2V4KSA9PT0gMCkge1xuICAgIGVycm9yID0gdHJ1ZTtcbiAgfVxuXG4gIHZhciBsZW4gPSBjb3VudFN5bWJvbHMobGFiZWwpO1xuICBmb3IgKHZhciBpID0gMDsgaSA8IGxlbjsgKytpKSB7XG4gICAgdmFyIHN0YXR1cyA9IGZpbmRTdGF0dXMobGFiZWwuY29kZVBvaW50QXQoaSkpO1xuICAgIGlmICgocHJvY2Vzc2luZyA9PT0gUFJPQ0VTU0lOR19PUFRJT05TLlRSQU5TSVRJT05BTCAmJiBzdGF0dXNbMV0gIT09IFwidmFsaWRcIikgfHxcbiAgICAgICAgKHByb2Nlc3NpbmcgPT09IFBST0NFU1NJTkdfT1BUSU9OUy5OT05UUkFOU0lUSU9OQUwgJiZcbiAgICAgICAgIHN0YXR1c1sxXSAhPT0gXCJ2YWxpZFwiICYmIHN0YXR1c1sxXSAhPT0gXCJkZXZpYXRpb25cIikpIHtcbiAgICAgIGVycm9yID0gdHJ1ZTtcbiAgICAgIGJyZWFrO1xuICAgIH1cbiAgfVxuXG4gIHJldHVybiB7XG4gICAgbGFiZWw6IGxhYmVsLFxuICAgIGVycm9yOiBlcnJvclxuICB9O1xufVxuXG5mdW5jdGlvbiBwcm9jZXNzaW5nKGRvbWFpbl9uYW1lLCB1c2VTVEQzLCBwcm9jZXNzaW5nX29wdGlvbikge1xuICB2YXIgcmVzdWx0ID0gbWFwQ2hhcnMoZG9tYWluX25hbWUsIHVzZVNURDMsIHByb2Nlc3Npbmdfb3B0aW9uKTtcbiAgcmVzdWx0LnN0cmluZyA9IG5vcm1hbGl6ZShyZXN1bHQuc3RyaW5nKTtcblxuICB2YXIgbGFiZWxzID0gcmVzdWx0LnN0cmluZy5zcGxpdChcIi5cIik7XG4gIGZvciAodmFyIGkgPSAwOyBpIDwgbGFiZWxzLmxlbmd0aDsgKytpKSB7XG4gICAgdHJ5IHtcbiAgICAgIHZhciB2YWxpZGF0aW9uID0gdmFsaWRhdGVMYWJlbChsYWJlbHNbaV0pO1xuICAgICAgbGFiZWxzW2ldID0gdmFsaWRhdGlvbi5sYWJlbDtcbiAgICAgIHJlc3VsdC5lcnJvciA9IHJlc3VsdC5lcnJvciB8fCB2YWxpZGF0aW9uLmVycm9yO1xuICAgIH0gY2F0Y2goZSkge1xuICAgICAgcmVzdWx0LmVycm9yID0gdHJ1ZTtcbiAgICB9XG4gIH1cblxuICByZXR1cm4ge1xuICAgIHN0cmluZzogbGFiZWxzLmpvaW4oXCIuXCIpLFxuICAgIGVycm9yOiByZXN1bHQuZXJyb3JcbiAgfTtcbn1cblxubW9kdWxlLmV4cG9ydHMudG9BU0NJSSA9IGZ1bmN0aW9uKGRvbWFpbl9uYW1lLCB1c2VTVEQzLCBwcm9jZXNzaW5nX29wdGlvbiwgdmVyaWZ5RG5zTGVuZ3RoKSB7XG4gIHZhciByZXN1bHQgPSBwcm9jZXNzaW5nKGRvbWFpbl9uYW1lLCB1c2VTVEQzLCBwcm9jZXNzaW5nX29wdGlvbik7XG4gIHZhciBsYWJlbHMgPSByZXN1bHQuc3RyaW5nLnNwbGl0KFwiLlwiKTtcbiAgbGFiZWxzID0gbGFiZWxzLm1hcChmdW5jdGlvbihsKSB7XG4gICAgdHJ5IHtcbiAgICAgIHJldHVybiBwdW55Y29kZS50b0FTQ0lJKGwpO1xuICAgIH0gY2F0Y2goZSkge1xuICAgICAgcmVzdWx0LmVycm9yID0gdHJ1ZTtcbiAgICAgIHJldHVybiBsO1xuICAgIH1cbiAgfSk7XG5cbiAgaWYgKHZlcmlmeURuc0xlbmd0aCkge1xuICAgIHZhciB0b3RhbCA9IGxhYmVscy5zbGljZSgwLCBsYWJlbHMubGVuZ3RoIC0gMSkuam9pbihcIi5cIikubGVuZ3RoO1xuICAgIGlmICh0b3RhbC5sZW5ndGggPiAyNTMgfHwgdG90YWwubGVuZ3RoID09PSAwKSB7XG4gICAgICByZXN1bHQuZXJyb3IgPSB0cnVlO1xuICAgIH1cblxuICAgIGZvciAodmFyIGk9MDsgaSA8IGxhYmVscy5sZW5ndGg7ICsraSkge1xuICAgICAgaWYgKGxhYmVscy5sZW5ndGggPiA2MyB8fCBsYWJlbHMubGVuZ3RoID09PSAwKSB7XG4gICAgICAgIHJlc3VsdC5lcnJvciA9IHRydWU7XG4gICAgICAgIGJyZWFrO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIGlmIChyZXN1bHQuZXJyb3IpIHJldHVybiBudWxsO1xuICByZXR1cm4gbGFiZWxzLmpvaW4oXCIuXCIpO1xufTtcblxubW9kdWxlLmV4cG9ydHMudG9Vbmljb2RlID0gZnVuY3Rpb24oZG9tYWluX25hbWUsIHVzZVNURDMpIHtcbiAgdmFyIHJlc3VsdCA9IHByb2Nlc3NpbmcoZG9tYWluX25hbWUsIHVzZVNURDMsIFBST0NFU1NJTkdfT1BUSU9OUy5OT05UUkFOU0lUSU9OQUwpO1xuXG4gIHJldHVybiB7XG4gICAgZG9tYWluOiByZXN1bHQuc3RyaW5nLFxuICAgIGVycm9yOiByZXN1bHQuZXJyb3JcbiAgfTtcbn07XG5cbm1vZHVsZS5leHBvcnRzLlBST0NFU1NJTkdfT1BUSU9OUyA9IFBST0NFU1NJTkdfT1BUSU9OUztcbiIsCiAgICAiXCJ1c2Ugc3RyaWN0XCI7XHJcbmNvbnN0IHB1bnljb2RlID0gcmVxdWlyZShcInB1bnljb2RlXCIpO1xyXG5jb25zdCB0cjQ2ID0gcmVxdWlyZShcInRyNDZcIik7XHJcblxyXG5jb25zdCBzcGVjaWFsU2NoZW1lcyA9IHtcclxuICBmdHA6IDIxLFxyXG4gIGZpbGU6IG51bGwsXHJcbiAgZ29waGVyOiA3MCxcclxuICBodHRwOiA4MCxcclxuICBodHRwczogNDQzLFxyXG4gIHdzOiA4MCxcclxuICB3c3M6IDQ0M1xyXG59O1xyXG5cclxuY29uc3QgZmFpbHVyZSA9IFN5bWJvbChcImZhaWx1cmVcIik7XHJcblxyXG5mdW5jdGlvbiBjb3VudFN5bWJvbHMoc3RyKSB7XHJcbiAgcmV0dXJuIHB1bnljb2RlLnVjczIuZGVjb2RlKHN0cikubGVuZ3RoO1xyXG59XHJcblxyXG5mdW5jdGlvbiBhdChpbnB1dCwgaWR4KSB7XHJcbiAgY29uc3QgYyA9IGlucHV0W2lkeF07XHJcbiAgcmV0dXJuIGlzTmFOKGMpID8gdW5kZWZpbmVkIDogU3RyaW5nLmZyb21Db2RlUG9pbnQoYyk7XHJcbn1cclxuXHJcbmZ1bmN0aW9uIGlzQVNDSUlEaWdpdChjKSB7XHJcbiAgcmV0dXJuIGMgPj0gMHgzMCAmJiBjIDw9IDB4Mzk7XHJcbn1cclxuXHJcbmZ1bmN0aW9uIGlzQVNDSUlBbHBoYShjKSB7XHJcbiAgcmV0dXJuIChjID49IDB4NDEgJiYgYyA8PSAweDVBKSB8fCAoYyA+PSAweDYxICYmIGMgPD0gMHg3QSk7XHJcbn1cclxuXHJcbmZ1bmN0aW9uIGlzQVNDSUlBbHBoYW51bWVyaWMoYykge1xyXG4gIHJldHVybiBpc0FTQ0lJQWxwaGEoYykgfHwgaXNBU0NJSURpZ2l0KGMpO1xyXG59XHJcblxyXG5mdW5jdGlvbiBpc0FTQ0lJSGV4KGMpIHtcclxuICByZXR1cm4gaXNBU0NJSURpZ2l0KGMpIHx8IChjID49IDB4NDEgJiYgYyA8PSAweDQ2KSB8fCAoYyA+PSAweDYxICYmIGMgPD0gMHg2Nik7XHJcbn1cclxuXHJcbmZ1bmN0aW9uIGlzU2luZ2xlRG90KGJ1ZmZlcikge1xyXG4gIHJldHVybiBidWZmZXIgPT09IFwiLlwiIHx8IGJ1ZmZlci50b0xvd2VyQ2FzZSgpID09PSBcIiUyZVwiO1xyXG59XHJcblxyXG5mdW5jdGlvbiBpc0RvdWJsZURvdChidWZmZXIpIHtcclxuICBidWZmZXIgPSBidWZmZXIudG9Mb3dlckNhc2UoKTtcclxuICByZXR1cm4gYnVmZmVyID09PSBcIi4uXCIgfHwgYnVmZmVyID09PSBcIiUyZS5cIiB8fCBidWZmZXIgPT09IFwiLiUyZVwiIHx8IGJ1ZmZlciA9PT0gXCIlMmUlMmVcIjtcclxufVxyXG5cclxuZnVuY3Rpb24gaXNXaW5kb3dzRHJpdmVMZXR0ZXJDb2RlUG9pbnRzKGNwMSwgY3AyKSB7XHJcbiAgcmV0dXJuIGlzQVNDSUlBbHBoYShjcDEpICYmIChjcDIgPT09IDU4IHx8IGNwMiA9PT0gMTI0KTtcclxufVxyXG5cclxuZnVuY3Rpb24gaXNXaW5kb3dzRHJpdmVMZXR0ZXJTdHJpbmcoc3RyaW5nKSB7XHJcbiAgcmV0dXJuIHN0cmluZy5sZW5ndGggPT09IDIgJiYgaXNBU0NJSUFscGhhKHN0cmluZy5jb2RlUG9pbnRBdCgwKSkgJiYgKHN0cmluZ1sxXSA9PT0gXCI6XCIgfHwgc3RyaW5nWzFdID09PSBcInxcIik7XHJcbn1cclxuXHJcbmZ1bmN0aW9uIGlzTm9ybWFsaXplZFdpbmRvd3NEcml2ZUxldHRlclN0cmluZyhzdHJpbmcpIHtcclxuICByZXR1cm4gc3RyaW5nLmxlbmd0aCA9PT0gMiAmJiBpc0FTQ0lJQWxwaGEoc3RyaW5nLmNvZGVQb2ludEF0KDApKSAmJiBzdHJpbmdbMV0gPT09IFwiOlwiO1xyXG59XHJcblxyXG5mdW5jdGlvbiBjb250YWluc0ZvcmJpZGRlbkhvc3RDb2RlUG9pbnQoc3RyaW5nKSB7XHJcbiAgcmV0dXJuIHN0cmluZy5zZWFyY2goL1xcdTAwMDB8XFx1MDAwOXxcXHUwMDBBfFxcdTAwMER8XFx1MDAyMHwjfCV8XFwvfDp8XFw/fEB8XFxbfFxcXFx8XFxdLykgIT09IC0xO1xyXG59XHJcblxyXG5mdW5jdGlvbiBjb250YWluc0ZvcmJpZGRlbkhvc3RDb2RlUG9pbnRFeGNsdWRpbmdQZXJjZW50KHN0cmluZykge1xyXG4gIHJldHVybiBzdHJpbmcuc2VhcmNoKC9cXHUwMDAwfFxcdTAwMDl8XFx1MDAwQXxcXHUwMDBEfFxcdTAwMjB8I3xcXC98OnxcXD98QHxcXFt8XFxcXHxcXF0vKSAhPT0gLTE7XHJcbn1cclxuXHJcbmZ1bmN0aW9uIGlzU3BlY2lhbFNjaGVtZShzY2hlbWUpIHtcclxuICByZXR1cm4gc3BlY2lhbFNjaGVtZXNbc2NoZW1lXSAhPT0gdW5kZWZpbmVkO1xyXG59XHJcblxyXG5mdW5jdGlvbiBpc1NwZWNpYWwodXJsKSB7XHJcbiAgcmV0dXJuIGlzU3BlY2lhbFNjaGVtZSh1cmwuc2NoZW1lKTtcclxufVxyXG5cclxuZnVuY3Rpb24gZGVmYXVsdFBvcnQoc2NoZW1lKSB7XHJcbiAgcmV0dXJuIHNwZWNpYWxTY2hlbWVzW3NjaGVtZV07XHJcbn1cclxuXHJcbmZ1bmN0aW9uIHBlcmNlbnRFbmNvZGUoYykge1xyXG4gIGxldCBoZXggPSBjLnRvU3RyaW5nKDE2KS50b1VwcGVyQ2FzZSgpO1xyXG4gIGlmIChoZXgubGVuZ3RoID09PSAxKSB7XHJcbiAgICBoZXggPSBcIjBcIiArIGhleDtcclxuICB9XHJcblxyXG4gIHJldHVybiBcIiVcIiArIGhleDtcclxufVxyXG5cclxuZnVuY3Rpb24gdXRmOFBlcmNlbnRFbmNvZGUoYykge1xyXG4gIGNvbnN0IGJ1ZiA9IG5ldyBCdWZmZXIoYyk7XHJcblxyXG4gIGxldCBzdHIgPSBcIlwiO1xyXG5cclxuICBmb3IgKGxldCBpID0gMDsgaSA8IGJ1Zi5sZW5ndGg7ICsraSkge1xyXG4gICAgc3RyICs9IHBlcmNlbnRFbmNvZGUoYnVmW2ldKTtcclxuICB9XHJcblxyXG4gIHJldHVybiBzdHI7XHJcbn1cclxuXHJcbmZ1bmN0aW9uIHV0ZjhQZXJjZW50RGVjb2RlKHN0cikge1xyXG4gIGNvbnN0IGlucHV0ID0gbmV3IEJ1ZmZlcihzdHIpO1xyXG4gIGNvbnN0IG91dHB1dCA9IFtdO1xyXG4gIGZvciAobGV0IGkgPSAwOyBpIDwgaW5wdXQubGVuZ3RoOyArK2kpIHtcclxuICAgIGlmIChpbnB1dFtpXSAhPT0gMzcpIHtcclxuICAgICAgb3V0cHV0LnB1c2goaW5wdXRbaV0pO1xyXG4gICAgfSBlbHNlIGlmIChpbnB1dFtpXSA9PT0gMzcgJiYgaXNBU0NJSUhleChpbnB1dFtpICsgMV0pICYmIGlzQVNDSUlIZXgoaW5wdXRbaSArIDJdKSkge1xyXG4gICAgICBvdXRwdXQucHVzaChwYXJzZUludChpbnB1dC5zbGljZShpICsgMSwgaSArIDMpLnRvU3RyaW5nKCksIDE2KSk7XHJcbiAgICAgIGkgKz0gMjtcclxuICAgIH0gZWxzZSB7XHJcbiAgICAgIG91dHB1dC5wdXNoKGlucHV0W2ldKTtcclxuICAgIH1cclxuICB9XHJcbiAgcmV0dXJuIG5ldyBCdWZmZXIob3V0cHV0KS50b1N0cmluZygpO1xyXG59XHJcblxyXG5mdW5jdGlvbiBpc0MwQ29udHJvbFBlcmNlbnRFbmNvZGUoYykge1xyXG4gIHJldHVybiBjIDw9IDB4MUYgfHwgYyA+IDB4N0U7XHJcbn1cclxuXHJcbmNvbnN0IGV4dHJhUGF0aFBlcmNlbnRFbmNvZGVTZXQgPSBuZXcgU2V0KFszMiwgMzQsIDM1LCA2MCwgNjIsIDYzLCA5NiwgMTIzLCAxMjVdKTtcclxuZnVuY3Rpb24gaXNQYXRoUGVyY2VudEVuY29kZShjKSB7XHJcbiAgcmV0dXJuIGlzQzBDb250cm9sUGVyY2VudEVuY29kZShjKSB8fCBleHRyYVBhdGhQZXJjZW50RW5jb2RlU2V0LmhhcyhjKTtcclxufVxyXG5cclxuY29uc3QgZXh0cmFVc2VyaW5mb1BlcmNlbnRFbmNvZGVTZXQgPVxyXG4gIG5ldyBTZXQoWzQ3LCA1OCwgNTksIDYxLCA2NCwgOTEsIDkyLCA5MywgOTQsIDEyNF0pO1xyXG5mdW5jdGlvbiBpc1VzZXJpbmZvUGVyY2VudEVuY29kZShjKSB7XHJcbiAgcmV0dXJuIGlzUGF0aFBlcmNlbnRFbmNvZGUoYykgfHwgZXh0cmFVc2VyaW5mb1BlcmNlbnRFbmNvZGVTZXQuaGFzKGMpO1xyXG59XHJcblxyXG5mdW5jdGlvbiBwZXJjZW50RW5jb2RlQ2hhcihjLCBlbmNvZGVTZXRQcmVkaWNhdGUpIHtcclxuICBjb25zdCBjU3RyID0gU3RyaW5nLmZyb21Db2RlUG9pbnQoYyk7XHJcblxyXG4gIGlmIChlbmNvZGVTZXRQcmVkaWNhdGUoYykpIHtcclxuICAgIHJldHVybiB1dGY4UGVyY2VudEVuY29kZShjU3RyKTtcclxuICB9XHJcblxyXG4gIHJldHVybiBjU3RyO1xyXG59XHJcblxyXG5mdW5jdGlvbiBwYXJzZUlQdjROdW1iZXIoaW5wdXQpIHtcclxuICBsZXQgUiA9IDEwO1xyXG5cclxuICBpZiAoaW5wdXQubGVuZ3RoID49IDIgJiYgaW5wdXQuY2hhckF0KDApID09PSBcIjBcIiAmJiBpbnB1dC5jaGFyQXQoMSkudG9Mb3dlckNhc2UoKSA9PT0gXCJ4XCIpIHtcclxuICAgIGlucHV0ID0gaW5wdXQuc3Vic3RyaW5nKDIpO1xyXG4gICAgUiA9IDE2O1xyXG4gIH0gZWxzZSBpZiAoaW5wdXQubGVuZ3RoID49IDIgJiYgaW5wdXQuY2hhckF0KDApID09PSBcIjBcIikge1xyXG4gICAgaW5wdXQgPSBpbnB1dC5zdWJzdHJpbmcoMSk7XHJcbiAgICBSID0gODtcclxuICB9XHJcblxyXG4gIGlmIChpbnB1dCA9PT0gXCJcIikge1xyXG4gICAgcmV0dXJuIDA7XHJcbiAgfVxyXG5cclxuICBjb25zdCByZWdleCA9IFIgPT09IDEwID8gL1teMC05XS8gOiAoUiA9PT0gMTYgPyAvW14wLTlBLUZhLWZdLyA6IC9bXjAtN10vKTtcclxuICBpZiAocmVnZXgudGVzdChpbnB1dCkpIHtcclxuICAgIHJldHVybiBmYWlsdXJlO1xyXG4gIH1cclxuXHJcbiAgcmV0dXJuIHBhcnNlSW50KGlucHV0LCBSKTtcclxufVxyXG5cclxuZnVuY3Rpb24gcGFyc2VJUHY0KGlucHV0KSB7XHJcbiAgY29uc3QgcGFydHMgPSBpbnB1dC5zcGxpdChcIi5cIik7XHJcbiAgaWYgKHBhcnRzW3BhcnRzLmxlbmd0aCAtIDFdID09PSBcIlwiKSB7XHJcbiAgICBpZiAocGFydHMubGVuZ3RoID4gMSkge1xyXG4gICAgICBwYXJ0cy5wb3AoKTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIGlmIChwYXJ0cy5sZW5ndGggPiA0KSB7XHJcbiAgICByZXR1cm4gaW5wdXQ7XHJcbiAgfVxyXG5cclxuICBjb25zdCBudW1iZXJzID0gW107XHJcbiAgZm9yIChjb25zdCBwYXJ0IG9mIHBhcnRzKSB7XHJcbiAgICBpZiAocGFydCA9PT0gXCJcIikge1xyXG4gICAgICByZXR1cm4gaW5wdXQ7XHJcbiAgICB9XHJcbiAgICBjb25zdCBuID0gcGFyc2VJUHY0TnVtYmVyKHBhcnQpO1xyXG4gICAgaWYgKG4gPT09IGZhaWx1cmUpIHtcclxuICAgICAgcmV0dXJuIGlucHV0O1xyXG4gICAgfVxyXG5cclxuICAgIG51bWJlcnMucHVzaChuKTtcclxuICB9XHJcblxyXG4gIGZvciAobGV0IGkgPSAwOyBpIDwgbnVtYmVycy5sZW5ndGggLSAxOyArK2kpIHtcclxuICAgIGlmIChudW1iZXJzW2ldID4gMjU1KSB7XHJcbiAgICAgIHJldHVybiBmYWlsdXJlO1xyXG4gICAgfVxyXG4gIH1cclxuICBpZiAobnVtYmVyc1tudW1iZXJzLmxlbmd0aCAtIDFdID49IE1hdGgucG93KDI1NiwgNSAtIG51bWJlcnMubGVuZ3RoKSkge1xyXG4gICAgcmV0dXJuIGZhaWx1cmU7XHJcbiAgfVxyXG5cclxuICBsZXQgaXB2NCA9IG51bWJlcnMucG9wKCk7XHJcbiAgbGV0IGNvdW50ZXIgPSAwO1xyXG5cclxuICBmb3IgKGNvbnN0IG4gb2YgbnVtYmVycykge1xyXG4gICAgaXB2NCArPSBuICogTWF0aC5wb3coMjU2LCAzIC0gY291bnRlcik7XHJcbiAgICArK2NvdW50ZXI7XHJcbiAgfVxyXG5cclxuICByZXR1cm4gaXB2NDtcclxufVxyXG5cclxuZnVuY3Rpb24gc2VyaWFsaXplSVB2NChhZGRyZXNzKSB7XHJcbiAgbGV0IG91dHB1dCA9IFwiXCI7XHJcbiAgbGV0IG4gPSBhZGRyZXNzO1xyXG5cclxuICBmb3IgKGxldCBpID0gMTsgaSA8PSA0OyArK2kpIHtcclxuICAgIG91dHB1dCA9IFN0cmluZyhuICUgMjU2KSArIG91dHB1dDtcclxuICAgIGlmIChpICE9PSA0KSB7XHJcbiAgICAgIG91dHB1dCA9IFwiLlwiICsgb3V0cHV0O1xyXG4gICAgfVxyXG4gICAgbiA9IE1hdGguZmxvb3IobiAvIDI1Nik7XHJcbiAgfVxyXG5cclxuICByZXR1cm4gb3V0cHV0O1xyXG59XHJcblxyXG5mdW5jdGlvbiBwYXJzZUlQdjYoaW5wdXQpIHtcclxuICBjb25zdCBhZGRyZXNzID0gWzAsIDAsIDAsIDAsIDAsIDAsIDAsIDBdO1xyXG4gIGxldCBwaWVjZUluZGV4ID0gMDtcclxuICBsZXQgY29tcHJlc3MgPSBudWxsO1xyXG4gIGxldCBwb2ludGVyID0gMDtcclxuXHJcbiAgaW5wdXQgPSBwdW55Y29kZS51Y3MyLmRlY29kZShpbnB1dCk7XHJcblxyXG4gIGlmIChpbnB1dFtwb2ludGVyXSA9PT0gNTgpIHtcclxuICAgIGlmIChpbnB1dFtwb2ludGVyICsgMV0gIT09IDU4KSB7XHJcbiAgICAgIHJldHVybiBmYWlsdXJlO1xyXG4gICAgfVxyXG5cclxuICAgIHBvaW50ZXIgKz0gMjtcclxuICAgICsrcGllY2VJbmRleDtcclxuICAgIGNvbXByZXNzID0gcGllY2VJbmRleDtcclxuICB9XHJcblxyXG4gIHdoaWxlIChwb2ludGVyIDwgaW5wdXQubGVuZ3RoKSB7XHJcbiAgICBpZiAocGllY2VJbmRleCA9PT0gOCkge1xyXG4gICAgICByZXR1cm4gZmFpbHVyZTtcclxuICAgIH1cclxuXHJcbiAgICBpZiAoaW5wdXRbcG9pbnRlcl0gPT09IDU4KSB7XHJcbiAgICAgIGlmIChjb21wcmVzcyAhPT0gbnVsbCkge1xyXG4gICAgICAgIHJldHVybiBmYWlsdXJlO1xyXG4gICAgICB9XHJcbiAgICAgICsrcG9pbnRlcjtcclxuICAgICAgKytwaWVjZUluZGV4O1xyXG4gICAgICBjb21wcmVzcyA9IHBpZWNlSW5kZXg7XHJcbiAgICAgIGNvbnRpbnVlO1xyXG4gICAgfVxyXG5cclxuICAgIGxldCB2YWx1ZSA9IDA7XHJcbiAgICBsZXQgbGVuZ3RoID0gMDtcclxuXHJcbiAgICB3aGlsZSAobGVuZ3RoIDwgNCAmJiBpc0FTQ0lJSGV4KGlucHV0W3BvaW50ZXJdKSkge1xyXG4gICAgICB2YWx1ZSA9IHZhbHVlICogMHgxMCArIHBhcnNlSW50KGF0KGlucHV0LCBwb2ludGVyKSwgMTYpO1xyXG4gICAgICArK3BvaW50ZXI7XHJcbiAgICAgICsrbGVuZ3RoO1xyXG4gICAgfVxyXG5cclxuICAgIGlmIChpbnB1dFtwb2ludGVyXSA9PT0gNDYpIHtcclxuICAgICAgaWYgKGxlbmd0aCA9PT0gMCkge1xyXG4gICAgICAgIHJldHVybiBmYWlsdXJlO1xyXG4gICAgICB9XHJcblxyXG4gICAgICBwb2ludGVyIC09IGxlbmd0aDtcclxuXHJcbiAgICAgIGlmIChwaWVjZUluZGV4ID4gNikge1xyXG4gICAgICAgIHJldHVybiBmYWlsdXJlO1xyXG4gICAgICB9XHJcblxyXG4gICAgICBsZXQgbnVtYmVyc1NlZW4gPSAwO1xyXG5cclxuICAgICAgd2hpbGUgKGlucHV0W3BvaW50ZXJdICE9PSB1bmRlZmluZWQpIHtcclxuICAgICAgICBsZXQgaXB2NFBpZWNlID0gbnVsbDtcclxuXHJcbiAgICAgICAgaWYgKG51bWJlcnNTZWVuID4gMCkge1xyXG4gICAgICAgICAgaWYgKGlucHV0W3BvaW50ZXJdID09PSA0NiAmJiBudW1iZXJzU2VlbiA8IDQpIHtcclxuICAgICAgICAgICAgKytwb2ludGVyO1xyXG4gICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgcmV0dXJuIGZhaWx1cmU7XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBpZiAoIWlzQVNDSUlEaWdpdChpbnB1dFtwb2ludGVyXSkpIHtcclxuICAgICAgICAgIHJldHVybiBmYWlsdXJlO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgd2hpbGUgKGlzQVNDSUlEaWdpdChpbnB1dFtwb2ludGVyXSkpIHtcclxuICAgICAgICAgIGNvbnN0IG51bWJlciA9IHBhcnNlSW50KGF0KGlucHV0LCBwb2ludGVyKSk7XHJcbiAgICAgICAgICBpZiAoaXB2NFBpZWNlID09PSBudWxsKSB7XHJcbiAgICAgICAgICAgIGlwdjRQaWVjZSA9IG51bWJlcjtcclxuICAgICAgICAgIH0gZWxzZSBpZiAoaXB2NFBpZWNlID09PSAwKSB7XHJcbiAgICAgICAgICAgIHJldHVybiBmYWlsdXJlO1xyXG4gICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgaXB2NFBpZWNlID0gaXB2NFBpZWNlICogMTAgKyBudW1iZXI7XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgICBpZiAoaXB2NFBpZWNlID4gMjU1KSB7XHJcbiAgICAgICAgICAgIHJldHVybiBmYWlsdXJlO1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgICAgKytwb2ludGVyO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgYWRkcmVzc1twaWVjZUluZGV4XSA9IGFkZHJlc3NbcGllY2VJbmRleF0gKiAweDEwMCArIGlwdjRQaWVjZTtcclxuXHJcbiAgICAgICAgKytudW1iZXJzU2VlbjtcclxuXHJcbiAgICAgICAgaWYgKG51bWJlcnNTZWVuID09PSAyIHx8IG51bWJlcnNTZWVuID09PSA0KSB7XHJcbiAgICAgICAgICArK3BpZWNlSW5kZXg7XHJcbiAgICAgICAgfVxyXG4gICAgICB9XHJcblxyXG4gICAgICBpZiAobnVtYmVyc1NlZW4gIT09IDQpIHtcclxuICAgICAgICByZXR1cm4gZmFpbHVyZTtcclxuICAgICAgfVxyXG5cclxuICAgICAgYnJlYWs7XHJcbiAgICB9IGVsc2UgaWYgKGlucHV0W3BvaW50ZXJdID09PSA1OCkge1xyXG4gICAgICArK3BvaW50ZXI7XHJcbiAgICAgIGlmIChpbnB1dFtwb2ludGVyXSA9PT0gdW5kZWZpbmVkKSB7XHJcbiAgICAgICAgcmV0dXJuIGZhaWx1cmU7XHJcbiAgICAgIH1cclxuICAgIH0gZWxzZSBpZiAoaW5wdXRbcG9pbnRlcl0gIT09IHVuZGVmaW5lZCkge1xyXG4gICAgICByZXR1cm4gZmFpbHVyZTtcclxuICAgIH1cclxuXHJcbiAgICBhZGRyZXNzW3BpZWNlSW5kZXhdID0gdmFsdWU7XHJcbiAgICArK3BpZWNlSW5kZXg7XHJcbiAgfVxyXG5cclxuICBpZiAoY29tcHJlc3MgIT09IG51bGwpIHtcclxuICAgIGxldCBzd2FwcyA9IHBpZWNlSW5kZXggLSBjb21wcmVzcztcclxuICAgIHBpZWNlSW5kZXggPSA3O1xyXG4gICAgd2hpbGUgKHBpZWNlSW5kZXggIT09IDAgJiYgc3dhcHMgPiAwKSB7XHJcbiAgICAgIGNvbnN0IHRlbXAgPSBhZGRyZXNzW2NvbXByZXNzICsgc3dhcHMgLSAxXTtcclxuICAgICAgYWRkcmVzc1tjb21wcmVzcyArIHN3YXBzIC0gMV0gPSBhZGRyZXNzW3BpZWNlSW5kZXhdO1xyXG4gICAgICBhZGRyZXNzW3BpZWNlSW5kZXhdID0gdGVtcDtcclxuICAgICAgLS1waWVjZUluZGV4O1xyXG4gICAgICAtLXN3YXBzO1xyXG4gICAgfVxyXG4gIH0gZWxzZSBpZiAoY29tcHJlc3MgPT09IG51bGwgJiYgcGllY2VJbmRleCAhPT0gOCkge1xyXG4gICAgcmV0dXJuIGZhaWx1cmU7XHJcbiAgfVxyXG5cclxuICByZXR1cm4gYWRkcmVzcztcclxufVxyXG5cclxuZnVuY3Rpb24gc2VyaWFsaXplSVB2NihhZGRyZXNzKSB7XHJcbiAgbGV0IG91dHB1dCA9IFwiXCI7XHJcbiAgY29uc3Qgc2VxUmVzdWx0ID0gZmluZExvbmdlc3RaZXJvU2VxdWVuY2UoYWRkcmVzcyk7XHJcbiAgY29uc3QgY29tcHJlc3MgPSBzZXFSZXN1bHQuaWR4O1xyXG4gIGxldCBpZ25vcmUwID0gZmFsc2U7XHJcblxyXG4gIGZvciAobGV0IHBpZWNlSW5kZXggPSAwOyBwaWVjZUluZGV4IDw9IDc7ICsrcGllY2VJbmRleCkge1xyXG4gICAgaWYgKGlnbm9yZTAgJiYgYWRkcmVzc1twaWVjZUluZGV4XSA9PT0gMCkge1xyXG4gICAgICBjb250aW51ZTtcclxuICAgIH0gZWxzZSBpZiAoaWdub3JlMCkge1xyXG4gICAgICBpZ25vcmUwID0gZmFsc2U7XHJcbiAgICB9XHJcblxyXG4gICAgaWYgKGNvbXByZXNzID09PSBwaWVjZUluZGV4KSB7XHJcbiAgICAgIGNvbnN0IHNlcGFyYXRvciA9IHBpZWNlSW5kZXggPT09IDAgPyBcIjo6XCIgOiBcIjpcIjtcclxuICAgICAgb3V0cHV0ICs9IHNlcGFyYXRvcjtcclxuICAgICAgaWdub3JlMCA9IHRydWU7XHJcbiAgICAgIGNvbnRpbnVlO1xyXG4gICAgfVxyXG5cclxuICAgIG91dHB1dCArPSBhZGRyZXNzW3BpZWNlSW5kZXhdLnRvU3RyaW5nKDE2KTtcclxuXHJcbiAgICBpZiAocGllY2VJbmRleCAhPT0gNykge1xyXG4gICAgICBvdXRwdXQgKz0gXCI6XCI7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICByZXR1cm4gb3V0cHV0O1xyXG59XHJcblxyXG5mdW5jdGlvbiBwYXJzZUhvc3QoaW5wdXQsIGlzU3BlY2lhbEFyZykge1xyXG4gIGlmIChpbnB1dFswXSA9PT0gXCJbXCIpIHtcclxuICAgIGlmIChpbnB1dFtpbnB1dC5sZW5ndGggLSAxXSAhPT0gXCJdXCIpIHtcclxuICAgICAgcmV0dXJuIGZhaWx1cmU7XHJcbiAgICB9XHJcblxyXG4gICAgcmV0dXJuIHBhcnNlSVB2NihpbnB1dC5zdWJzdHJpbmcoMSwgaW5wdXQubGVuZ3RoIC0gMSkpO1xyXG4gIH1cclxuXHJcbiAgaWYgKCFpc1NwZWNpYWxBcmcpIHtcclxuICAgIHJldHVybiBwYXJzZU9wYXF1ZUhvc3QoaW5wdXQpO1xyXG4gIH1cclxuXHJcbiAgY29uc3QgZG9tYWluID0gdXRmOFBlcmNlbnREZWNvZGUoaW5wdXQpO1xyXG4gIGNvbnN0IGFzY2lpRG9tYWluID0gdHI0Ni50b0FTQ0lJKGRvbWFpbiwgZmFsc2UsIHRyNDYuUFJPQ0VTU0lOR19PUFRJT05TLk5PTlRSQU5TSVRJT05BTCwgZmFsc2UpO1xyXG4gIGlmIChhc2NpaURvbWFpbiA9PT0gbnVsbCkge1xyXG4gICAgcmV0dXJuIGZhaWx1cmU7XHJcbiAgfVxyXG5cclxuICBpZiAoY29udGFpbnNGb3JiaWRkZW5Ib3N0Q29kZVBvaW50KGFzY2lpRG9tYWluKSkge1xyXG4gICAgcmV0dXJuIGZhaWx1cmU7XHJcbiAgfVxyXG5cclxuICBjb25zdCBpcHY0SG9zdCA9IHBhcnNlSVB2NChhc2NpaURvbWFpbik7XHJcbiAgaWYgKHR5cGVvZiBpcHY0SG9zdCA9PT0gXCJudW1iZXJcIiB8fCBpcHY0SG9zdCA9PT0gZmFpbHVyZSkge1xyXG4gICAgcmV0dXJuIGlwdjRIb3N0O1xyXG4gIH1cclxuXHJcbiAgcmV0dXJuIGFzY2lpRG9tYWluO1xyXG59XHJcblxyXG5mdW5jdGlvbiBwYXJzZU9wYXF1ZUhvc3QoaW5wdXQpIHtcclxuICBpZiAoY29udGFpbnNGb3JiaWRkZW5Ib3N0Q29kZVBvaW50RXhjbHVkaW5nUGVyY2VudChpbnB1dCkpIHtcclxuICAgIHJldHVybiBmYWlsdXJlO1xyXG4gIH1cclxuXHJcbiAgbGV0IG91dHB1dCA9IFwiXCI7XHJcbiAgY29uc3QgZGVjb2RlZCA9IHB1bnljb2RlLnVjczIuZGVjb2RlKGlucHV0KTtcclxuICBmb3IgKGxldCBpID0gMDsgaSA8IGRlY29kZWQubGVuZ3RoOyArK2kpIHtcclxuICAgIG91dHB1dCArPSBwZXJjZW50RW5jb2RlQ2hhcihkZWNvZGVkW2ldLCBpc0MwQ29udHJvbFBlcmNlbnRFbmNvZGUpO1xyXG4gIH1cclxuICByZXR1cm4gb3V0cHV0O1xyXG59XHJcblxyXG5mdW5jdGlvbiBmaW5kTG9uZ2VzdFplcm9TZXF1ZW5jZShhcnIpIHtcclxuICBsZXQgbWF4SWR4ID0gbnVsbDtcclxuICBsZXQgbWF4TGVuID0gMTsgLy8gb25seSBmaW5kIGVsZW1lbnRzID4gMVxyXG4gIGxldCBjdXJyU3RhcnQgPSBudWxsO1xyXG4gIGxldCBjdXJyTGVuID0gMDtcclxuXHJcbiAgZm9yIChsZXQgaSA9IDA7IGkgPCBhcnIubGVuZ3RoOyArK2kpIHtcclxuICAgIGlmIChhcnJbaV0gIT09IDApIHtcclxuICAgICAgaWYgKGN1cnJMZW4gPiBtYXhMZW4pIHtcclxuICAgICAgICBtYXhJZHggPSBjdXJyU3RhcnQ7XHJcbiAgICAgICAgbWF4TGVuID0gY3VyckxlbjtcclxuICAgICAgfVxyXG5cclxuICAgICAgY3VyclN0YXJ0ID0gbnVsbDtcclxuICAgICAgY3VyckxlbiA9IDA7XHJcbiAgICB9IGVsc2Uge1xyXG4gICAgICBpZiAoY3VyclN0YXJ0ID09PSBudWxsKSB7XHJcbiAgICAgICAgY3VyclN0YXJ0ID0gaTtcclxuICAgICAgfVxyXG4gICAgICArK2N1cnJMZW47XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICAvLyBpZiB0cmFpbGluZyB6ZXJvc1xyXG4gIGlmIChjdXJyTGVuID4gbWF4TGVuKSB7XHJcbiAgICBtYXhJZHggPSBjdXJyU3RhcnQ7XHJcbiAgICBtYXhMZW4gPSBjdXJyTGVuO1xyXG4gIH1cclxuXHJcbiAgcmV0dXJuIHtcclxuICAgIGlkeDogbWF4SWR4LFxyXG4gICAgbGVuOiBtYXhMZW5cclxuICB9O1xyXG59XHJcblxyXG5mdW5jdGlvbiBzZXJpYWxpemVIb3N0KGhvc3QpIHtcclxuICBpZiAodHlwZW9mIGhvc3QgPT09IFwibnVtYmVyXCIpIHtcclxuICAgIHJldHVybiBzZXJpYWxpemVJUHY0KGhvc3QpO1xyXG4gIH1cclxuXHJcbiAgLy8gSVB2NiBzZXJpYWxpemVyXHJcbiAgaWYgKGhvc3QgaW5zdGFuY2VvZiBBcnJheSkge1xyXG4gICAgcmV0dXJuIFwiW1wiICsgc2VyaWFsaXplSVB2Nihob3N0KSArIFwiXVwiO1xyXG4gIH1cclxuXHJcbiAgcmV0dXJuIGhvc3Q7XHJcbn1cclxuXHJcbmZ1bmN0aW9uIHRyaW1Db250cm9sQ2hhcnModXJsKSB7XHJcbiAgcmV0dXJuIHVybC5yZXBsYWNlKC9eW1xcdTAwMDAtXFx1MDAxRlxcdTAwMjBdK3xbXFx1MDAwMC1cXHUwMDFGXFx1MDAyMF0rJC9nLCBcIlwiKTtcclxufVxyXG5cclxuZnVuY3Rpb24gdHJpbVRhYkFuZE5ld2xpbmUodXJsKSB7XHJcbiAgcmV0dXJuIHVybC5yZXBsYWNlKC9cXHUwMDA5fFxcdTAwMEF8XFx1MDAwRC9nLCBcIlwiKTtcclxufVxyXG5cclxuZnVuY3Rpb24gc2hvcnRlblBhdGgodXJsKSB7XHJcbiAgY29uc3QgcGF0aCA9IHVybC5wYXRoO1xyXG4gIGlmIChwYXRoLmxlbmd0aCA9PT0gMCkge1xyXG4gICAgcmV0dXJuO1xyXG4gIH1cclxuICBpZiAodXJsLnNjaGVtZSA9PT0gXCJmaWxlXCIgJiYgcGF0aC5sZW5ndGggPT09IDEgJiYgaXNOb3JtYWxpemVkV2luZG93c0RyaXZlTGV0dGVyKHBhdGhbMF0pKSB7XHJcbiAgICByZXR1cm47XHJcbiAgfVxyXG5cclxuICBwYXRoLnBvcCgpO1xyXG59XHJcblxyXG5mdW5jdGlvbiBpbmNsdWRlc0NyZWRlbnRpYWxzKHVybCkge1xyXG4gIHJldHVybiB1cmwudXNlcm5hbWUgIT09IFwiXCIgfHwgdXJsLnBhc3N3b3JkICE9PSBcIlwiO1xyXG59XHJcblxyXG5mdW5jdGlvbiBjYW5ub3RIYXZlQVVzZXJuYW1lUGFzc3dvcmRQb3J0KHVybCkge1xyXG4gIHJldHVybiB1cmwuaG9zdCA9PT0gbnVsbCB8fCB1cmwuaG9zdCA9PT0gXCJcIiB8fCB1cmwuY2Fubm90QmVBQmFzZVVSTCB8fCB1cmwuc2NoZW1lID09PSBcImZpbGVcIjtcclxufVxyXG5cclxuZnVuY3Rpb24gaXNOb3JtYWxpemVkV2luZG93c0RyaXZlTGV0dGVyKHN0cmluZykge1xyXG4gIHJldHVybiAvXltBLVphLXpdOiQvLnRlc3Qoc3RyaW5nKTtcclxufVxyXG5cclxuZnVuY3Rpb24gVVJMU3RhdGVNYWNoaW5lKGlucHV0LCBiYXNlLCBlbmNvZGluZ092ZXJyaWRlLCB1cmwsIHN0YXRlT3ZlcnJpZGUpIHtcclxuICB0aGlzLnBvaW50ZXIgPSAwO1xyXG4gIHRoaXMuaW5wdXQgPSBpbnB1dDtcclxuICB0aGlzLmJhc2UgPSBiYXNlIHx8IG51bGw7XHJcbiAgdGhpcy5lbmNvZGluZ092ZXJyaWRlID0gZW5jb2RpbmdPdmVycmlkZSB8fCBcInV0Zi04XCI7XHJcbiAgdGhpcy5zdGF0ZU92ZXJyaWRlID0gc3RhdGVPdmVycmlkZTtcclxuICB0aGlzLnVybCA9IHVybDtcclxuICB0aGlzLmZhaWx1cmUgPSBmYWxzZTtcclxuICB0aGlzLnBhcnNlRXJyb3IgPSBmYWxzZTtcclxuXHJcbiAgaWYgKCF0aGlzLnVybCkge1xyXG4gICAgdGhpcy51cmwgPSB7XHJcbiAgICAgIHNjaGVtZTogXCJcIixcclxuICAgICAgdXNlcm5hbWU6IFwiXCIsXHJcbiAgICAgIHBhc3N3b3JkOiBcIlwiLFxyXG4gICAgICBob3N0OiBudWxsLFxyXG4gICAgICBwb3J0OiBudWxsLFxyXG4gICAgICBwYXRoOiBbXSxcclxuICAgICAgcXVlcnk6IG51bGwsXHJcbiAgICAgIGZyYWdtZW50OiBudWxsLFxyXG5cclxuICAgICAgY2Fubm90QmVBQmFzZVVSTDogZmFsc2VcclxuICAgIH07XHJcblxyXG4gICAgY29uc3QgcmVzID0gdHJpbUNvbnRyb2xDaGFycyh0aGlzLmlucHV0KTtcclxuICAgIGlmIChyZXMgIT09IHRoaXMuaW5wdXQpIHtcclxuICAgICAgdGhpcy5wYXJzZUVycm9yID0gdHJ1ZTtcclxuICAgIH1cclxuICAgIHRoaXMuaW5wdXQgPSByZXM7XHJcbiAgfVxyXG5cclxuICBjb25zdCByZXMgPSB0cmltVGFiQW5kTmV3bGluZSh0aGlzLmlucHV0KTtcclxuICBpZiAocmVzICE9PSB0aGlzLmlucHV0KSB7XHJcbiAgICB0aGlzLnBhcnNlRXJyb3IgPSB0cnVlO1xyXG4gIH1cclxuICB0aGlzLmlucHV0ID0gcmVzO1xyXG5cclxuICB0aGlzLnN0YXRlID0gc3RhdGVPdmVycmlkZSB8fCBcInNjaGVtZSBzdGFydFwiO1xyXG5cclxuICB0aGlzLmJ1ZmZlciA9IFwiXCI7XHJcbiAgdGhpcy5hdEZsYWcgPSBmYWxzZTtcclxuICB0aGlzLmFyckZsYWcgPSBmYWxzZTtcclxuICB0aGlzLnBhc3N3b3JkVG9rZW5TZWVuRmxhZyA9IGZhbHNlO1xyXG5cclxuICB0aGlzLmlucHV0ID0gcHVueWNvZGUudWNzMi5kZWNvZGUodGhpcy5pbnB1dCk7XHJcblxyXG4gIGZvciAoOyB0aGlzLnBvaW50ZXIgPD0gdGhpcy5pbnB1dC5sZW5ndGg7ICsrdGhpcy5wb2ludGVyKSB7XHJcbiAgICBjb25zdCBjID0gdGhpcy5pbnB1dFt0aGlzLnBvaW50ZXJdO1xyXG4gICAgY29uc3QgY1N0ciA9IGlzTmFOKGMpID8gdW5kZWZpbmVkIDogU3RyaW5nLmZyb21Db2RlUG9pbnQoYyk7XHJcblxyXG4gICAgLy8gZXhlYyBzdGF0ZSBtYWNoaW5lXHJcbiAgICBjb25zdCByZXQgPSB0aGlzW1wicGFyc2UgXCIgKyB0aGlzLnN0YXRlXShjLCBjU3RyKTtcclxuICAgIGlmICghcmV0KSB7XHJcbiAgICAgIGJyZWFrOyAvLyB0ZXJtaW5hdGUgYWxnb3JpdGhtXHJcbiAgICB9IGVsc2UgaWYgKHJldCA9PT0gZmFpbHVyZSkge1xyXG4gICAgICB0aGlzLmZhaWx1cmUgPSB0cnVlO1xyXG4gICAgICBicmVhaztcclxuICAgIH1cclxuICB9XHJcbn1cclxuXHJcblVSTFN0YXRlTWFjaGluZS5wcm90b3R5cGVbXCJwYXJzZSBzY2hlbWUgc3RhcnRcIl0gPSBmdW5jdGlvbiBwYXJzZVNjaGVtZVN0YXJ0KGMsIGNTdHIpIHtcclxuICBpZiAoaXNBU0NJSUFscGhhKGMpKSB7XHJcbiAgICB0aGlzLmJ1ZmZlciArPSBjU3RyLnRvTG93ZXJDYXNlKCk7XHJcbiAgICB0aGlzLnN0YXRlID0gXCJzY2hlbWVcIjtcclxuICB9IGVsc2UgaWYgKCF0aGlzLnN0YXRlT3ZlcnJpZGUpIHtcclxuICAgIHRoaXMuc3RhdGUgPSBcIm5vIHNjaGVtZVwiO1xyXG4gICAgLS10aGlzLnBvaW50ZXI7XHJcbiAgfSBlbHNlIHtcclxuICAgIHRoaXMucGFyc2VFcnJvciA9IHRydWU7XHJcbiAgICByZXR1cm4gZmFpbHVyZTtcclxuICB9XHJcblxyXG4gIHJldHVybiB0cnVlO1xyXG59O1xyXG5cclxuVVJMU3RhdGVNYWNoaW5lLnByb3RvdHlwZVtcInBhcnNlIHNjaGVtZVwiXSA9IGZ1bmN0aW9uIHBhcnNlU2NoZW1lKGMsIGNTdHIpIHtcclxuICBpZiAoaXNBU0NJSUFscGhhbnVtZXJpYyhjKSB8fCBjID09PSA0MyB8fCBjID09PSA0NSB8fCBjID09PSA0Nikge1xyXG4gICAgdGhpcy5idWZmZXIgKz0gY1N0ci50b0xvd2VyQ2FzZSgpO1xyXG4gIH0gZWxzZSBpZiAoYyA9PT0gNTgpIHtcclxuICAgIGlmICh0aGlzLnN0YXRlT3ZlcnJpZGUpIHtcclxuICAgICAgaWYgKGlzU3BlY2lhbCh0aGlzLnVybCkgJiYgIWlzU3BlY2lhbFNjaGVtZSh0aGlzLmJ1ZmZlcikpIHtcclxuICAgICAgICByZXR1cm4gZmFsc2U7XHJcbiAgICAgIH1cclxuXHJcbiAgICAgIGlmICghaXNTcGVjaWFsKHRoaXMudXJsKSAmJiBpc1NwZWNpYWxTY2hlbWUodGhpcy5idWZmZXIpKSB7XHJcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xyXG4gICAgICB9XHJcblxyXG4gICAgICBpZiAoKGluY2x1ZGVzQ3JlZGVudGlhbHModGhpcy51cmwpIHx8IHRoaXMudXJsLnBvcnQgIT09IG51bGwpICYmIHRoaXMuYnVmZmVyID09PSBcImZpbGVcIikge1xyXG4gICAgICAgIHJldHVybiBmYWxzZTtcclxuICAgICAgfVxyXG5cclxuICAgICAgaWYgKHRoaXMudXJsLnNjaGVtZSA9PT0gXCJmaWxlXCIgJiYgKHRoaXMudXJsLmhvc3QgPT09IFwiXCIgfHwgdGhpcy51cmwuaG9zdCA9PT0gbnVsbCkpIHtcclxuICAgICAgICByZXR1cm4gZmFsc2U7XHJcbiAgICAgIH1cclxuICAgIH1cclxuICAgIHRoaXMudXJsLnNjaGVtZSA9IHRoaXMuYnVmZmVyO1xyXG4gICAgdGhpcy5idWZmZXIgPSBcIlwiO1xyXG4gICAgaWYgKHRoaXMuc3RhdGVPdmVycmlkZSkge1xyXG4gICAgICByZXR1cm4gZmFsc2U7XHJcbiAgICB9XHJcbiAgICBpZiAodGhpcy51cmwuc2NoZW1lID09PSBcImZpbGVcIikge1xyXG4gICAgICBpZiAodGhpcy5pbnB1dFt0aGlzLnBvaW50ZXIgKyAxXSAhPT0gNDcgfHwgdGhpcy5pbnB1dFt0aGlzLnBvaW50ZXIgKyAyXSAhPT0gNDcpIHtcclxuICAgICAgICB0aGlzLnBhcnNlRXJyb3IgPSB0cnVlO1xyXG4gICAgICB9XHJcbiAgICAgIHRoaXMuc3RhdGUgPSBcImZpbGVcIjtcclxuICAgIH0gZWxzZSBpZiAoaXNTcGVjaWFsKHRoaXMudXJsKSAmJiB0aGlzLmJhc2UgIT09IG51bGwgJiYgdGhpcy5iYXNlLnNjaGVtZSA9PT0gdGhpcy51cmwuc2NoZW1lKSB7XHJcbiAgICAgIHRoaXMuc3RhdGUgPSBcInNwZWNpYWwgcmVsYXRpdmUgb3IgYXV0aG9yaXR5XCI7XHJcbiAgICB9IGVsc2UgaWYgKGlzU3BlY2lhbCh0aGlzLnVybCkpIHtcclxuICAgICAgdGhpcy5zdGF0ZSA9IFwic3BlY2lhbCBhdXRob3JpdHkgc2xhc2hlc1wiO1xyXG4gICAgfSBlbHNlIGlmICh0aGlzLmlucHV0W3RoaXMucG9pbnRlciArIDFdID09PSA0Nykge1xyXG4gICAgICB0aGlzLnN0YXRlID0gXCJwYXRoIG9yIGF1dGhvcml0eVwiO1xyXG4gICAgICArK3RoaXMucG9pbnRlcjtcclxuICAgIH0gZWxzZSB7XHJcbiAgICAgIHRoaXMudXJsLmNhbm5vdEJlQUJhc2VVUkwgPSB0cnVlO1xyXG4gICAgICB0aGlzLnVybC5wYXRoLnB1c2goXCJcIik7XHJcbiAgICAgIHRoaXMuc3RhdGUgPSBcImNhbm5vdC1iZS1hLWJhc2UtVVJMIHBhdGhcIjtcclxuICAgIH1cclxuICB9IGVsc2UgaWYgKCF0aGlzLnN0YXRlT3ZlcnJpZGUpIHtcclxuICAgIHRoaXMuYnVmZmVyID0gXCJcIjtcclxuICAgIHRoaXMuc3RhdGUgPSBcIm5vIHNjaGVtZVwiO1xyXG4gICAgdGhpcy5wb2ludGVyID0gLTE7XHJcbiAgfSBlbHNlIHtcclxuICAgIHRoaXMucGFyc2VFcnJvciA9IHRydWU7XHJcbiAgICByZXR1cm4gZmFpbHVyZTtcclxuICB9XHJcblxyXG4gIHJldHVybiB0cnVlO1xyXG59O1xyXG5cclxuVVJMU3RhdGVNYWNoaW5lLnByb3RvdHlwZVtcInBhcnNlIG5vIHNjaGVtZVwiXSA9IGZ1bmN0aW9uIHBhcnNlTm9TY2hlbWUoYykge1xyXG4gIGlmICh0aGlzLmJhc2UgPT09IG51bGwgfHwgKHRoaXMuYmFzZS5jYW5ub3RCZUFCYXNlVVJMICYmIGMgIT09IDM1KSkge1xyXG4gICAgcmV0dXJuIGZhaWx1cmU7XHJcbiAgfSBlbHNlIGlmICh0aGlzLmJhc2UuY2Fubm90QmVBQmFzZVVSTCAmJiBjID09PSAzNSkge1xyXG4gICAgdGhpcy51cmwuc2NoZW1lID0gdGhpcy5iYXNlLnNjaGVtZTtcclxuICAgIHRoaXMudXJsLnBhdGggPSB0aGlzLmJhc2UucGF0aC5zbGljZSgpO1xyXG4gICAgdGhpcy51cmwucXVlcnkgPSB0aGlzLmJhc2UucXVlcnk7XHJcbiAgICB0aGlzLnVybC5mcmFnbWVudCA9IFwiXCI7XHJcbiAgICB0aGlzLnVybC5jYW5ub3RCZUFCYXNlVVJMID0gdHJ1ZTtcclxuICAgIHRoaXMuc3RhdGUgPSBcImZyYWdtZW50XCI7XHJcbiAgfSBlbHNlIGlmICh0aGlzLmJhc2Uuc2NoZW1lID09PSBcImZpbGVcIikge1xyXG4gICAgdGhpcy5zdGF0ZSA9IFwiZmlsZVwiO1xyXG4gICAgLS10aGlzLnBvaW50ZXI7XHJcbiAgfSBlbHNlIHtcclxuICAgIHRoaXMuc3RhdGUgPSBcInJlbGF0aXZlXCI7XHJcbiAgICAtLXRoaXMucG9pbnRlcjtcclxuICB9XHJcblxyXG4gIHJldHVybiB0cnVlO1xyXG59O1xyXG5cclxuVVJMU3RhdGVNYWNoaW5lLnByb3RvdHlwZVtcInBhcnNlIHNwZWNpYWwgcmVsYXRpdmUgb3IgYXV0aG9yaXR5XCJdID0gZnVuY3Rpb24gcGFyc2VTcGVjaWFsUmVsYXRpdmVPckF1dGhvcml0eShjKSB7XHJcbiAgaWYgKGMgPT09IDQ3ICYmIHRoaXMuaW5wdXRbdGhpcy5wb2ludGVyICsgMV0gPT09IDQ3KSB7XHJcbiAgICB0aGlzLnN0YXRlID0gXCJzcGVjaWFsIGF1dGhvcml0eSBpZ25vcmUgc2xhc2hlc1wiO1xyXG4gICAgKyt0aGlzLnBvaW50ZXI7XHJcbiAgfSBlbHNlIHtcclxuICAgIHRoaXMucGFyc2VFcnJvciA9IHRydWU7XHJcbiAgICB0aGlzLnN0YXRlID0gXCJyZWxhdGl2ZVwiO1xyXG4gICAgLS10aGlzLnBvaW50ZXI7XHJcbiAgfVxyXG5cclxuICByZXR1cm4gdHJ1ZTtcclxufTtcclxuXHJcblVSTFN0YXRlTWFjaGluZS5wcm90b3R5cGVbXCJwYXJzZSBwYXRoIG9yIGF1dGhvcml0eVwiXSA9IGZ1bmN0aW9uIHBhcnNlUGF0aE9yQXV0aG9yaXR5KGMpIHtcclxuICBpZiAoYyA9PT0gNDcpIHtcclxuICAgIHRoaXMuc3RhdGUgPSBcImF1dGhvcml0eVwiO1xyXG4gIH0gZWxzZSB7XHJcbiAgICB0aGlzLnN0YXRlID0gXCJwYXRoXCI7XHJcbiAgICAtLXRoaXMucG9pbnRlcjtcclxuICB9XHJcblxyXG4gIHJldHVybiB0cnVlO1xyXG59O1xyXG5cclxuVVJMU3RhdGVNYWNoaW5lLnByb3RvdHlwZVtcInBhcnNlIHJlbGF0aXZlXCJdID0gZnVuY3Rpb24gcGFyc2VSZWxhdGl2ZShjKSB7XHJcbiAgdGhpcy51cmwuc2NoZW1lID0gdGhpcy5iYXNlLnNjaGVtZTtcclxuICBpZiAoaXNOYU4oYykpIHtcclxuICAgIHRoaXMudXJsLnVzZXJuYW1lID0gdGhpcy5iYXNlLnVzZXJuYW1lO1xyXG4gICAgdGhpcy51cmwucGFzc3dvcmQgPSB0aGlzLmJhc2UucGFzc3dvcmQ7XHJcbiAgICB0aGlzLnVybC5ob3N0ID0gdGhpcy5iYXNlLmhvc3Q7XHJcbiAgICB0aGlzLnVybC5wb3J0ID0gdGhpcy5iYXNlLnBvcnQ7XHJcbiAgICB0aGlzLnVybC5wYXRoID0gdGhpcy5iYXNlLnBhdGguc2xpY2UoKTtcclxuICAgIHRoaXMudXJsLnF1ZXJ5ID0gdGhpcy5iYXNlLnF1ZXJ5O1xyXG4gIH0gZWxzZSBpZiAoYyA9PT0gNDcpIHtcclxuICAgIHRoaXMuc3RhdGUgPSBcInJlbGF0aXZlIHNsYXNoXCI7XHJcbiAgfSBlbHNlIGlmIChjID09PSA2Mykge1xyXG4gICAgdGhpcy51cmwudXNlcm5hbWUgPSB0aGlzLmJhc2UudXNlcm5hbWU7XHJcbiAgICB0aGlzLnVybC5wYXNzd29yZCA9IHRoaXMuYmFzZS5wYXNzd29yZDtcclxuICAgIHRoaXMudXJsLmhvc3QgPSB0aGlzLmJhc2UuaG9zdDtcclxuICAgIHRoaXMudXJsLnBvcnQgPSB0aGlzLmJhc2UucG9ydDtcclxuICAgIHRoaXMudXJsLnBhdGggPSB0aGlzLmJhc2UucGF0aC5zbGljZSgpO1xyXG4gICAgdGhpcy51cmwucXVlcnkgPSBcIlwiO1xyXG4gICAgdGhpcy5zdGF0ZSA9IFwicXVlcnlcIjtcclxuICB9IGVsc2UgaWYgKGMgPT09IDM1KSB7XHJcbiAgICB0aGlzLnVybC51c2VybmFtZSA9IHRoaXMuYmFzZS51c2VybmFtZTtcclxuICAgIHRoaXMudXJsLnBhc3N3b3JkID0gdGhpcy5iYXNlLnBhc3N3b3JkO1xyXG4gICAgdGhpcy51cmwuaG9zdCA9IHRoaXMuYmFzZS5ob3N0O1xyXG4gICAgdGhpcy51cmwucG9ydCA9IHRoaXMuYmFzZS5wb3J0O1xyXG4gICAgdGhpcy51cmwucGF0aCA9IHRoaXMuYmFzZS5wYXRoLnNsaWNlKCk7XHJcbiAgICB0aGlzLnVybC5xdWVyeSA9IHRoaXMuYmFzZS5xdWVyeTtcclxuICAgIHRoaXMudXJsLmZyYWdtZW50ID0gXCJcIjtcclxuICAgIHRoaXMuc3RhdGUgPSBcImZyYWdtZW50XCI7XHJcbiAgfSBlbHNlIGlmIChpc1NwZWNpYWwodGhpcy51cmwpICYmIGMgPT09IDkyKSB7XHJcbiAgICB0aGlzLnBhcnNlRXJyb3IgPSB0cnVlO1xyXG4gICAgdGhpcy5zdGF0ZSA9IFwicmVsYXRpdmUgc2xhc2hcIjtcclxuICB9IGVsc2Uge1xyXG4gICAgdGhpcy51cmwudXNlcm5hbWUgPSB0aGlzLmJhc2UudXNlcm5hbWU7XHJcbiAgICB0aGlzLnVybC5wYXNzd29yZCA9IHRoaXMuYmFzZS5wYXNzd29yZDtcclxuICAgIHRoaXMudXJsLmhvc3QgPSB0aGlzLmJhc2UuaG9zdDtcclxuICAgIHRoaXMudXJsLnBvcnQgPSB0aGlzLmJhc2UucG9ydDtcclxuICAgIHRoaXMudXJsLnBhdGggPSB0aGlzLmJhc2UucGF0aC5zbGljZSgwLCB0aGlzLmJhc2UucGF0aC5sZW5ndGggLSAxKTtcclxuXHJcbiAgICB0aGlzLnN0YXRlID0gXCJwYXRoXCI7XHJcbiAgICAtLXRoaXMucG9pbnRlcjtcclxuICB9XHJcblxyXG4gIHJldHVybiB0cnVlO1xyXG59O1xyXG5cclxuVVJMU3RhdGVNYWNoaW5lLnByb3RvdHlwZVtcInBhcnNlIHJlbGF0aXZlIHNsYXNoXCJdID0gZnVuY3Rpb24gcGFyc2VSZWxhdGl2ZVNsYXNoKGMpIHtcclxuICBpZiAoaXNTcGVjaWFsKHRoaXMudXJsKSAmJiAoYyA9PT0gNDcgfHwgYyA9PT0gOTIpKSB7XHJcbiAgICBpZiAoYyA9PT0gOTIpIHtcclxuICAgICAgdGhpcy5wYXJzZUVycm9yID0gdHJ1ZTtcclxuICAgIH1cclxuICAgIHRoaXMuc3RhdGUgPSBcInNwZWNpYWwgYXV0aG9yaXR5IGlnbm9yZSBzbGFzaGVzXCI7XHJcbiAgfSBlbHNlIGlmIChjID09PSA0Nykge1xyXG4gICAgdGhpcy5zdGF0ZSA9IFwiYXV0aG9yaXR5XCI7XHJcbiAgfSBlbHNlIHtcclxuICAgIHRoaXMudXJsLnVzZXJuYW1lID0gdGhpcy5iYXNlLnVzZXJuYW1lO1xyXG4gICAgdGhpcy51cmwucGFzc3dvcmQgPSB0aGlzLmJhc2UucGFzc3dvcmQ7XHJcbiAgICB0aGlzLnVybC5ob3N0ID0gdGhpcy5iYXNlLmhvc3Q7XHJcbiAgICB0aGlzLnVybC5wb3J0ID0gdGhpcy5iYXNlLnBvcnQ7XHJcbiAgICB0aGlzLnN0YXRlID0gXCJwYXRoXCI7XHJcbiAgICAtLXRoaXMucG9pbnRlcjtcclxuICB9XHJcblxyXG4gIHJldHVybiB0cnVlO1xyXG59O1xyXG5cclxuVVJMU3RhdGVNYWNoaW5lLnByb3RvdHlwZVtcInBhcnNlIHNwZWNpYWwgYXV0aG9yaXR5IHNsYXNoZXNcIl0gPSBmdW5jdGlvbiBwYXJzZVNwZWNpYWxBdXRob3JpdHlTbGFzaGVzKGMpIHtcclxuICBpZiAoYyA9PT0gNDcgJiYgdGhpcy5pbnB1dFt0aGlzLnBvaW50ZXIgKyAxXSA9PT0gNDcpIHtcclxuICAgIHRoaXMuc3RhdGUgPSBcInNwZWNpYWwgYXV0aG9yaXR5IGlnbm9yZSBzbGFzaGVzXCI7XHJcbiAgICArK3RoaXMucG9pbnRlcjtcclxuICB9IGVsc2Uge1xyXG4gICAgdGhpcy5wYXJzZUVycm9yID0gdHJ1ZTtcclxuICAgIHRoaXMuc3RhdGUgPSBcInNwZWNpYWwgYXV0aG9yaXR5IGlnbm9yZSBzbGFzaGVzXCI7XHJcbiAgICAtLXRoaXMucG9pbnRlcjtcclxuICB9XHJcblxyXG4gIHJldHVybiB0cnVlO1xyXG59O1xyXG5cclxuVVJMU3RhdGVNYWNoaW5lLnByb3RvdHlwZVtcInBhcnNlIHNwZWNpYWwgYXV0aG9yaXR5IGlnbm9yZSBzbGFzaGVzXCJdID0gZnVuY3Rpb24gcGFyc2VTcGVjaWFsQXV0aG9yaXR5SWdub3JlU2xhc2hlcyhjKSB7XHJcbiAgaWYgKGMgIT09IDQ3ICYmIGMgIT09IDkyKSB7XHJcbiAgICB0aGlzLnN0YXRlID0gXCJhdXRob3JpdHlcIjtcclxuICAgIC0tdGhpcy5wb2ludGVyO1xyXG4gIH0gZWxzZSB7XHJcbiAgICB0aGlzLnBhcnNlRXJyb3IgPSB0cnVlO1xyXG4gIH1cclxuXHJcbiAgcmV0dXJuIHRydWU7XHJcbn07XHJcblxyXG5VUkxTdGF0ZU1hY2hpbmUucHJvdG90eXBlW1wicGFyc2UgYXV0aG9yaXR5XCJdID0gZnVuY3Rpb24gcGFyc2VBdXRob3JpdHkoYywgY1N0cikge1xyXG4gIGlmIChjID09PSA2NCkge1xyXG4gICAgdGhpcy5wYXJzZUVycm9yID0gdHJ1ZTtcclxuICAgIGlmICh0aGlzLmF0RmxhZykge1xyXG4gICAgICB0aGlzLmJ1ZmZlciA9IFwiJTQwXCIgKyB0aGlzLmJ1ZmZlcjtcclxuICAgIH1cclxuICAgIHRoaXMuYXRGbGFnID0gdHJ1ZTtcclxuXHJcbiAgICAvLyBjYXJlZnVsLCB0aGlzIGlzIGJhc2VkIG9uIGJ1ZmZlciBhbmQgaGFzIGl0cyBvd24gcG9pbnRlciAodGhpcy5wb2ludGVyICE9IHBvaW50ZXIpIGFuZCBpbm5lciBjaGFyc1xyXG4gICAgY29uc3QgbGVuID0gY291bnRTeW1ib2xzKHRoaXMuYnVmZmVyKTtcclxuICAgIGZvciAobGV0IHBvaW50ZXIgPSAwOyBwb2ludGVyIDwgbGVuOyArK3BvaW50ZXIpIHtcclxuICAgICAgY29uc3QgY29kZVBvaW50ID0gdGhpcy5idWZmZXIuY29kZVBvaW50QXQocG9pbnRlcik7XHJcblxyXG4gICAgICBpZiAoY29kZVBvaW50ID09PSA1OCAmJiAhdGhpcy5wYXNzd29yZFRva2VuU2VlbkZsYWcpIHtcclxuICAgICAgICB0aGlzLnBhc3N3b3JkVG9rZW5TZWVuRmxhZyA9IHRydWU7XHJcbiAgICAgICAgY29udGludWU7XHJcbiAgICAgIH1cclxuICAgICAgY29uc3QgZW5jb2RlZENvZGVQb2ludHMgPSBwZXJjZW50RW5jb2RlQ2hhcihjb2RlUG9pbnQsIGlzVXNlcmluZm9QZXJjZW50RW5jb2RlKTtcclxuICAgICAgaWYgKHRoaXMucGFzc3dvcmRUb2tlblNlZW5GbGFnKSB7XHJcbiAgICAgICAgdGhpcy51cmwucGFzc3dvcmQgKz0gZW5jb2RlZENvZGVQb2ludHM7XHJcbiAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgdGhpcy51cmwudXNlcm5hbWUgKz0gZW5jb2RlZENvZGVQb2ludHM7XHJcbiAgICAgIH1cclxuICAgIH1cclxuICAgIHRoaXMuYnVmZmVyID0gXCJcIjtcclxuICB9IGVsc2UgaWYgKGlzTmFOKGMpIHx8IGMgPT09IDQ3IHx8IGMgPT09IDYzIHx8IGMgPT09IDM1IHx8XHJcbiAgICAgICAgICAgICAoaXNTcGVjaWFsKHRoaXMudXJsKSAmJiBjID09PSA5MikpIHtcclxuICAgIGlmICh0aGlzLmF0RmxhZyAmJiB0aGlzLmJ1ZmZlciA9PT0gXCJcIikge1xyXG4gICAgICB0aGlzLnBhcnNlRXJyb3IgPSB0cnVlO1xyXG4gICAgICByZXR1cm4gZmFpbHVyZTtcclxuICAgIH1cclxuICAgIHRoaXMucG9pbnRlciAtPSBjb3VudFN5bWJvbHModGhpcy5idWZmZXIpICsgMTtcclxuICAgIHRoaXMuYnVmZmVyID0gXCJcIjtcclxuICAgIHRoaXMuc3RhdGUgPSBcImhvc3RcIjtcclxuICB9IGVsc2Uge1xyXG4gICAgdGhpcy5idWZmZXIgKz0gY1N0cjtcclxuICB9XHJcblxyXG4gIHJldHVybiB0cnVlO1xyXG59O1xyXG5cclxuVVJMU3RhdGVNYWNoaW5lLnByb3RvdHlwZVtcInBhcnNlIGhvc3RuYW1lXCJdID1cclxuVVJMU3RhdGVNYWNoaW5lLnByb3RvdHlwZVtcInBhcnNlIGhvc3RcIl0gPSBmdW5jdGlvbiBwYXJzZUhvc3ROYW1lKGMsIGNTdHIpIHtcclxuICBpZiAodGhpcy5zdGF0ZU92ZXJyaWRlICYmIHRoaXMudXJsLnNjaGVtZSA9PT0gXCJmaWxlXCIpIHtcclxuICAgIC0tdGhpcy5wb2ludGVyO1xyXG4gICAgdGhpcy5zdGF0ZSA9IFwiZmlsZSBob3N0XCI7XHJcbiAgfSBlbHNlIGlmIChjID09PSA1OCAmJiAhdGhpcy5hcnJGbGFnKSB7XHJcbiAgICBpZiAodGhpcy5idWZmZXIgPT09IFwiXCIpIHtcclxuICAgICAgdGhpcy5wYXJzZUVycm9yID0gdHJ1ZTtcclxuICAgICAgcmV0dXJuIGZhaWx1cmU7XHJcbiAgICB9XHJcblxyXG4gICAgY29uc3QgaG9zdCA9IHBhcnNlSG9zdCh0aGlzLmJ1ZmZlciwgaXNTcGVjaWFsKHRoaXMudXJsKSk7XHJcbiAgICBpZiAoaG9zdCA9PT0gZmFpbHVyZSkge1xyXG4gICAgICByZXR1cm4gZmFpbHVyZTtcclxuICAgIH1cclxuXHJcbiAgICB0aGlzLnVybC5ob3N0ID0gaG9zdDtcclxuICAgIHRoaXMuYnVmZmVyID0gXCJcIjtcclxuICAgIHRoaXMuc3RhdGUgPSBcInBvcnRcIjtcclxuICAgIGlmICh0aGlzLnN0YXRlT3ZlcnJpZGUgPT09IFwiaG9zdG5hbWVcIikge1xyXG4gICAgICByZXR1cm4gZmFsc2U7XHJcbiAgICB9XHJcbiAgfSBlbHNlIGlmIChpc05hTihjKSB8fCBjID09PSA0NyB8fCBjID09PSA2MyB8fCBjID09PSAzNSB8fFxyXG4gICAgICAgICAgICAgKGlzU3BlY2lhbCh0aGlzLnVybCkgJiYgYyA9PT0gOTIpKSB7XHJcbiAgICAtLXRoaXMucG9pbnRlcjtcclxuICAgIGlmIChpc1NwZWNpYWwodGhpcy51cmwpICYmIHRoaXMuYnVmZmVyID09PSBcIlwiKSB7XHJcbiAgICAgIHRoaXMucGFyc2VFcnJvciA9IHRydWU7XHJcbiAgICAgIHJldHVybiBmYWlsdXJlO1xyXG4gICAgfSBlbHNlIGlmICh0aGlzLnN0YXRlT3ZlcnJpZGUgJiYgdGhpcy5idWZmZXIgPT09IFwiXCIgJiZcclxuICAgICAgICAgICAgICAgKGluY2x1ZGVzQ3JlZGVudGlhbHModGhpcy51cmwpIHx8IHRoaXMudXJsLnBvcnQgIT09IG51bGwpKSB7XHJcbiAgICAgIHRoaXMucGFyc2VFcnJvciA9IHRydWU7XHJcbiAgICAgIHJldHVybiBmYWxzZTtcclxuICAgIH1cclxuXHJcbiAgICBjb25zdCBob3N0ID0gcGFyc2VIb3N0KHRoaXMuYnVmZmVyLCBpc1NwZWNpYWwodGhpcy51cmwpKTtcclxuICAgIGlmIChob3N0ID09PSBmYWlsdXJlKSB7XHJcbiAgICAgIHJldHVybiBmYWlsdXJlO1xyXG4gICAgfVxyXG5cclxuICAgIHRoaXMudXJsLmhvc3QgPSBob3N0O1xyXG4gICAgdGhpcy5idWZmZXIgPSBcIlwiO1xyXG4gICAgdGhpcy5zdGF0ZSA9IFwicGF0aCBzdGFydFwiO1xyXG4gICAgaWYgKHRoaXMuc3RhdGVPdmVycmlkZSkge1xyXG4gICAgICByZXR1cm4gZmFsc2U7XHJcbiAgICB9XHJcbiAgfSBlbHNlIHtcclxuICAgIGlmIChjID09PSA5MSkge1xyXG4gICAgICB0aGlzLmFyckZsYWcgPSB0cnVlO1xyXG4gICAgfSBlbHNlIGlmIChjID09PSA5Mykge1xyXG4gICAgICB0aGlzLmFyckZsYWcgPSBmYWxzZTtcclxuICAgIH1cclxuICAgIHRoaXMuYnVmZmVyICs9IGNTdHI7XHJcbiAgfVxyXG5cclxuICByZXR1cm4gdHJ1ZTtcclxufTtcclxuXHJcblVSTFN0YXRlTWFjaGluZS5wcm90b3R5cGVbXCJwYXJzZSBwb3J0XCJdID0gZnVuY3Rpb24gcGFyc2VQb3J0KGMsIGNTdHIpIHtcclxuICBpZiAoaXNBU0NJSURpZ2l0KGMpKSB7XHJcbiAgICB0aGlzLmJ1ZmZlciArPSBjU3RyO1xyXG4gIH0gZWxzZSBpZiAoaXNOYU4oYykgfHwgYyA9PT0gNDcgfHwgYyA9PT0gNjMgfHwgYyA9PT0gMzUgfHxcclxuICAgICAgICAgICAgIChpc1NwZWNpYWwodGhpcy51cmwpICYmIGMgPT09IDkyKSB8fFxyXG4gICAgICAgICAgICAgdGhpcy5zdGF0ZU92ZXJyaWRlKSB7XHJcbiAgICBpZiAodGhpcy5idWZmZXIgIT09IFwiXCIpIHtcclxuICAgICAgY29uc3QgcG9ydCA9IHBhcnNlSW50KHRoaXMuYnVmZmVyKTtcclxuICAgICAgaWYgKHBvcnQgPiBNYXRoLnBvdygyLCAxNikgLSAxKSB7XHJcbiAgICAgICAgdGhpcy5wYXJzZUVycm9yID0gdHJ1ZTtcclxuICAgICAgICByZXR1cm4gZmFpbHVyZTtcclxuICAgICAgfVxyXG4gICAgICB0aGlzLnVybC5wb3J0ID0gcG9ydCA9PT0gZGVmYXVsdFBvcnQodGhpcy51cmwuc2NoZW1lKSA/IG51bGwgOiBwb3J0O1xyXG4gICAgICB0aGlzLmJ1ZmZlciA9IFwiXCI7XHJcbiAgICB9XHJcbiAgICBpZiAodGhpcy5zdGF0ZU92ZXJyaWRlKSB7XHJcbiAgICAgIHJldHVybiBmYWxzZTtcclxuICAgIH1cclxuICAgIHRoaXMuc3RhdGUgPSBcInBhdGggc3RhcnRcIjtcclxuICAgIC0tdGhpcy5wb2ludGVyO1xyXG4gIH0gZWxzZSB7XHJcbiAgICB0aGlzLnBhcnNlRXJyb3IgPSB0cnVlO1xyXG4gICAgcmV0dXJuIGZhaWx1cmU7XHJcbiAgfVxyXG5cclxuICByZXR1cm4gdHJ1ZTtcclxufTtcclxuXHJcbmNvbnN0IGZpbGVPdGhlcndpc2VDb2RlUG9pbnRzID0gbmV3IFNldChbNDcsIDkyLCA2MywgMzVdKTtcclxuXHJcblVSTFN0YXRlTWFjaGluZS5wcm90b3R5cGVbXCJwYXJzZSBmaWxlXCJdID0gZnVuY3Rpb24gcGFyc2VGaWxlKGMpIHtcclxuICB0aGlzLnVybC5zY2hlbWUgPSBcImZpbGVcIjtcclxuXHJcbiAgaWYgKGMgPT09IDQ3IHx8IGMgPT09IDkyKSB7XHJcbiAgICBpZiAoYyA9PT0gOTIpIHtcclxuICAgICAgdGhpcy5wYXJzZUVycm9yID0gdHJ1ZTtcclxuICAgIH1cclxuICAgIHRoaXMuc3RhdGUgPSBcImZpbGUgc2xhc2hcIjtcclxuICB9IGVsc2UgaWYgKHRoaXMuYmFzZSAhPT0gbnVsbCAmJiB0aGlzLmJhc2Uuc2NoZW1lID09PSBcImZpbGVcIikge1xyXG4gICAgaWYgKGlzTmFOKGMpKSB7XHJcbiAgICAgIHRoaXMudXJsLmhvc3QgPSB0aGlzLmJhc2UuaG9zdDtcclxuICAgICAgdGhpcy51cmwucGF0aCA9IHRoaXMuYmFzZS5wYXRoLnNsaWNlKCk7XHJcbiAgICAgIHRoaXMudXJsLnF1ZXJ5ID0gdGhpcy5iYXNlLnF1ZXJ5O1xyXG4gICAgfSBlbHNlIGlmIChjID09PSA2Mykge1xyXG4gICAgICB0aGlzLnVybC5ob3N0ID0gdGhpcy5iYXNlLmhvc3Q7XHJcbiAgICAgIHRoaXMudXJsLnBhdGggPSB0aGlzLmJhc2UucGF0aC5zbGljZSgpO1xyXG4gICAgICB0aGlzLnVybC5xdWVyeSA9IFwiXCI7XHJcbiAgICAgIHRoaXMuc3RhdGUgPSBcInF1ZXJ5XCI7XHJcbiAgICB9IGVsc2UgaWYgKGMgPT09IDM1KSB7XHJcbiAgICAgIHRoaXMudXJsLmhvc3QgPSB0aGlzLmJhc2UuaG9zdDtcclxuICAgICAgdGhpcy51cmwucGF0aCA9IHRoaXMuYmFzZS5wYXRoLnNsaWNlKCk7XHJcbiAgICAgIHRoaXMudXJsLnF1ZXJ5ID0gdGhpcy5iYXNlLnF1ZXJ5O1xyXG4gICAgICB0aGlzLnVybC5mcmFnbWVudCA9IFwiXCI7XHJcbiAgICAgIHRoaXMuc3RhdGUgPSBcImZyYWdtZW50XCI7XHJcbiAgICB9IGVsc2Uge1xyXG4gICAgICBpZiAodGhpcy5pbnB1dC5sZW5ndGggLSB0aGlzLnBvaW50ZXIgLSAxID09PSAwIHx8IC8vIHJlbWFpbmluZyBjb25zaXN0cyBvZiAwIGNvZGUgcG9pbnRzXHJcbiAgICAgICAgICAhaXNXaW5kb3dzRHJpdmVMZXR0ZXJDb2RlUG9pbnRzKGMsIHRoaXMuaW5wdXRbdGhpcy5wb2ludGVyICsgMV0pIHx8XHJcbiAgICAgICAgICAodGhpcy5pbnB1dC5sZW5ndGggLSB0aGlzLnBvaW50ZXIgLSAxID49IDIgJiYgLy8gcmVtYWluaW5nIGhhcyBhdCBsZWFzdCAyIGNvZGUgcG9pbnRzXHJcbiAgICAgICAgICAgIWZpbGVPdGhlcndpc2VDb2RlUG9pbnRzLmhhcyh0aGlzLmlucHV0W3RoaXMucG9pbnRlciArIDJdKSkpIHtcclxuICAgICAgICB0aGlzLnVybC5ob3N0ID0gdGhpcy5iYXNlLmhvc3Q7XHJcbiAgICAgICAgdGhpcy51cmwucGF0aCA9IHRoaXMuYmFzZS5wYXRoLnNsaWNlKCk7XHJcbiAgICAgICAgc2hvcnRlblBhdGgodGhpcy51cmwpO1xyXG4gICAgICB9IGVsc2Uge1xyXG4gICAgICAgIHRoaXMucGFyc2VFcnJvciA9IHRydWU7XHJcbiAgICAgIH1cclxuXHJcbiAgICAgIHRoaXMuc3RhdGUgPSBcInBhdGhcIjtcclxuICAgICAgLS10aGlzLnBvaW50ZXI7XHJcbiAgICB9XHJcbiAgfSBlbHNlIHtcclxuICAgIHRoaXMuc3RhdGUgPSBcInBhdGhcIjtcclxuICAgIC0tdGhpcy5wb2ludGVyO1xyXG4gIH1cclxuXHJcbiAgcmV0dXJuIHRydWU7XHJcbn07XHJcblxyXG5VUkxTdGF0ZU1hY2hpbmUucHJvdG90eXBlW1wicGFyc2UgZmlsZSBzbGFzaFwiXSA9IGZ1bmN0aW9uIHBhcnNlRmlsZVNsYXNoKGMpIHtcclxuICBpZiAoYyA9PT0gNDcgfHwgYyA9PT0gOTIpIHtcclxuICAgIGlmIChjID09PSA5Mikge1xyXG4gICAgICB0aGlzLnBhcnNlRXJyb3IgPSB0cnVlO1xyXG4gICAgfVxyXG4gICAgdGhpcy5zdGF0ZSA9IFwiZmlsZSBob3N0XCI7XHJcbiAgfSBlbHNlIHtcclxuICAgIGlmICh0aGlzLmJhc2UgIT09IG51bGwgJiYgdGhpcy5iYXNlLnNjaGVtZSA9PT0gXCJmaWxlXCIpIHtcclxuICAgICAgaWYgKGlzTm9ybWFsaXplZFdpbmRvd3NEcml2ZUxldHRlclN0cmluZyh0aGlzLmJhc2UucGF0aFswXSkpIHtcclxuICAgICAgICB0aGlzLnVybC5wYXRoLnB1c2godGhpcy5iYXNlLnBhdGhbMF0pO1xyXG4gICAgICB9IGVsc2Uge1xyXG4gICAgICAgIHRoaXMudXJsLmhvc3QgPSB0aGlzLmJhc2UuaG9zdDtcclxuICAgICAgfVxyXG4gICAgfVxyXG4gICAgdGhpcy5zdGF0ZSA9IFwicGF0aFwiO1xyXG4gICAgLS10aGlzLnBvaW50ZXI7XHJcbiAgfVxyXG5cclxuICByZXR1cm4gdHJ1ZTtcclxufTtcclxuXHJcblVSTFN0YXRlTWFjaGluZS5wcm90b3R5cGVbXCJwYXJzZSBmaWxlIGhvc3RcIl0gPSBmdW5jdGlvbiBwYXJzZUZpbGVIb3N0KGMsIGNTdHIpIHtcclxuICBpZiAoaXNOYU4oYykgfHwgYyA9PT0gNDcgfHwgYyA9PT0gOTIgfHwgYyA9PT0gNjMgfHwgYyA9PT0gMzUpIHtcclxuICAgIC0tdGhpcy5wb2ludGVyO1xyXG4gICAgaWYgKCF0aGlzLnN0YXRlT3ZlcnJpZGUgJiYgaXNXaW5kb3dzRHJpdmVMZXR0ZXJTdHJpbmcodGhpcy5idWZmZXIpKSB7XHJcbiAgICAgIHRoaXMucGFyc2VFcnJvciA9IHRydWU7XHJcbiAgICAgIHRoaXMuc3RhdGUgPSBcInBhdGhcIjtcclxuICAgIH0gZWxzZSBpZiAodGhpcy5idWZmZXIgPT09IFwiXCIpIHtcclxuICAgICAgdGhpcy51cmwuaG9zdCA9IFwiXCI7XHJcbiAgICAgIGlmICh0aGlzLnN0YXRlT3ZlcnJpZGUpIHtcclxuICAgICAgICByZXR1cm4gZmFsc2U7XHJcbiAgICAgIH1cclxuICAgICAgdGhpcy5zdGF0ZSA9IFwicGF0aCBzdGFydFwiO1xyXG4gICAgfSBlbHNlIHtcclxuICAgICAgbGV0IGhvc3QgPSBwYXJzZUhvc3QodGhpcy5idWZmZXIsIGlzU3BlY2lhbCh0aGlzLnVybCkpO1xyXG4gICAgICBpZiAoaG9zdCA9PT0gZmFpbHVyZSkge1xyXG4gICAgICAgIHJldHVybiBmYWlsdXJlO1xyXG4gICAgICB9XHJcbiAgICAgIGlmIChob3N0ID09PSBcImxvY2FsaG9zdFwiKSB7XHJcbiAgICAgICAgaG9zdCA9IFwiXCI7XHJcbiAgICAgIH1cclxuICAgICAgdGhpcy51cmwuaG9zdCA9IGhvc3Q7XHJcblxyXG4gICAgICBpZiAodGhpcy5zdGF0ZU92ZXJyaWRlKSB7XHJcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xyXG4gICAgICB9XHJcblxyXG4gICAgICB0aGlzLmJ1ZmZlciA9IFwiXCI7XHJcbiAgICAgIHRoaXMuc3RhdGUgPSBcInBhdGggc3RhcnRcIjtcclxuICAgIH1cclxuICB9IGVsc2Uge1xyXG4gICAgdGhpcy5idWZmZXIgKz0gY1N0cjtcclxuICB9XHJcblxyXG4gIHJldHVybiB0cnVlO1xyXG59O1xyXG5cclxuVVJMU3RhdGVNYWNoaW5lLnByb3RvdHlwZVtcInBhcnNlIHBhdGggc3RhcnRcIl0gPSBmdW5jdGlvbiBwYXJzZVBhdGhTdGFydChjKSB7XHJcbiAgaWYgKGlzU3BlY2lhbCh0aGlzLnVybCkpIHtcclxuICAgIGlmIChjID09PSA5Mikge1xyXG4gICAgICB0aGlzLnBhcnNlRXJyb3IgPSB0cnVlO1xyXG4gICAgfVxyXG4gICAgdGhpcy5zdGF0ZSA9IFwicGF0aFwiO1xyXG5cclxuICAgIGlmIChjICE9PSA0NyAmJiBjICE9PSA5Mikge1xyXG4gICAgICAtLXRoaXMucG9pbnRlcjtcclxuICAgIH1cclxuICB9IGVsc2UgaWYgKCF0aGlzLnN0YXRlT3ZlcnJpZGUgJiYgYyA9PT0gNjMpIHtcclxuICAgIHRoaXMudXJsLnF1ZXJ5ID0gXCJcIjtcclxuICAgIHRoaXMuc3RhdGUgPSBcInF1ZXJ5XCI7XHJcbiAgfSBlbHNlIGlmICghdGhpcy5zdGF0ZU92ZXJyaWRlICYmIGMgPT09IDM1KSB7XHJcbiAgICB0aGlzLnVybC5mcmFnbWVudCA9IFwiXCI7XHJcbiAgICB0aGlzLnN0YXRlID0gXCJmcmFnbWVudFwiO1xyXG4gIH0gZWxzZSBpZiAoYyAhPT0gdW5kZWZpbmVkKSB7XHJcbiAgICB0aGlzLnN0YXRlID0gXCJwYXRoXCI7XHJcbiAgICBpZiAoYyAhPT0gNDcpIHtcclxuICAgICAgLS10aGlzLnBvaW50ZXI7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICByZXR1cm4gdHJ1ZTtcclxufTtcclxuXHJcblVSTFN0YXRlTWFjaGluZS5wcm90b3R5cGVbXCJwYXJzZSBwYXRoXCJdID0gZnVuY3Rpb24gcGFyc2VQYXRoKGMpIHtcclxuICBpZiAoaXNOYU4oYykgfHwgYyA9PT0gNDcgfHwgKGlzU3BlY2lhbCh0aGlzLnVybCkgJiYgYyA9PT0gOTIpIHx8XHJcbiAgICAgICghdGhpcy5zdGF0ZU92ZXJyaWRlICYmIChjID09PSA2MyB8fCBjID09PSAzNSkpKSB7XHJcbiAgICBpZiAoaXNTcGVjaWFsKHRoaXMudXJsKSAmJiBjID09PSA5Mikge1xyXG4gICAgICB0aGlzLnBhcnNlRXJyb3IgPSB0cnVlO1xyXG4gICAgfVxyXG5cclxuICAgIGlmIChpc0RvdWJsZURvdCh0aGlzLmJ1ZmZlcikpIHtcclxuICAgICAgc2hvcnRlblBhdGgodGhpcy51cmwpO1xyXG4gICAgICBpZiAoYyAhPT0gNDcgJiYgIShpc1NwZWNpYWwodGhpcy51cmwpICYmIGMgPT09IDkyKSkge1xyXG4gICAgICAgIHRoaXMudXJsLnBhdGgucHVzaChcIlwiKTtcclxuICAgICAgfVxyXG4gICAgfSBlbHNlIGlmIChpc1NpbmdsZURvdCh0aGlzLmJ1ZmZlcikgJiYgYyAhPT0gNDcgJiZcclxuICAgICAgICAgICAgICAgIShpc1NwZWNpYWwodGhpcy51cmwpICYmIGMgPT09IDkyKSkge1xyXG4gICAgICB0aGlzLnVybC5wYXRoLnB1c2goXCJcIik7XHJcbiAgICB9IGVsc2UgaWYgKCFpc1NpbmdsZURvdCh0aGlzLmJ1ZmZlcikpIHtcclxuICAgICAgaWYgKHRoaXMudXJsLnNjaGVtZSA9PT0gXCJmaWxlXCIgJiYgdGhpcy51cmwucGF0aC5sZW5ndGggPT09IDAgJiYgaXNXaW5kb3dzRHJpdmVMZXR0ZXJTdHJpbmcodGhpcy5idWZmZXIpKSB7XHJcbiAgICAgICAgaWYgKHRoaXMudXJsLmhvc3QgIT09IFwiXCIgJiYgdGhpcy51cmwuaG9zdCAhPT0gbnVsbCkge1xyXG4gICAgICAgICAgdGhpcy5wYXJzZUVycm9yID0gdHJ1ZTtcclxuICAgICAgICAgIHRoaXMudXJsLmhvc3QgPSBcIlwiO1xyXG4gICAgICAgIH1cclxuICAgICAgICB0aGlzLmJ1ZmZlciA9IHRoaXMuYnVmZmVyWzBdICsgXCI6XCI7XHJcbiAgICAgIH1cclxuICAgICAgdGhpcy51cmwucGF0aC5wdXNoKHRoaXMuYnVmZmVyKTtcclxuICAgIH1cclxuICAgIHRoaXMuYnVmZmVyID0gXCJcIjtcclxuICAgIGlmICh0aGlzLnVybC5zY2hlbWUgPT09IFwiZmlsZVwiICYmIChjID09PSB1bmRlZmluZWQgfHwgYyA9PT0gNjMgfHwgYyA9PT0gMzUpKSB7XHJcbiAgICAgIHdoaWxlICh0aGlzLnVybC5wYXRoLmxlbmd0aCA+IDEgJiYgdGhpcy51cmwucGF0aFswXSA9PT0gXCJcIikge1xyXG4gICAgICAgIHRoaXMucGFyc2VFcnJvciA9IHRydWU7XHJcbiAgICAgICAgdGhpcy51cmwucGF0aC5zaGlmdCgpO1xyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgICBpZiAoYyA9PT0gNjMpIHtcclxuICAgICAgdGhpcy51cmwucXVlcnkgPSBcIlwiO1xyXG4gICAgICB0aGlzLnN0YXRlID0gXCJxdWVyeVwiO1xyXG4gICAgfVxyXG4gICAgaWYgKGMgPT09IDM1KSB7XHJcbiAgICAgIHRoaXMudXJsLmZyYWdtZW50ID0gXCJcIjtcclxuICAgICAgdGhpcy5zdGF0ZSA9IFwiZnJhZ21lbnRcIjtcclxuICAgIH1cclxuICB9IGVsc2Uge1xyXG4gICAgLy8gVE9ETzogSWYgYyBpcyBub3QgYSBVUkwgY29kZSBwb2ludCBhbmQgbm90IFwiJVwiLCBwYXJzZSBlcnJvci5cclxuXHJcbiAgICBpZiAoYyA9PT0gMzcgJiZcclxuICAgICAgKCFpc0FTQ0lJSGV4KHRoaXMuaW5wdXRbdGhpcy5wb2ludGVyICsgMV0pIHx8XHJcbiAgICAgICAgIWlzQVNDSUlIZXgodGhpcy5pbnB1dFt0aGlzLnBvaW50ZXIgKyAyXSkpKSB7XHJcbiAgICAgIHRoaXMucGFyc2VFcnJvciA9IHRydWU7XHJcbiAgICB9XHJcblxyXG4gICAgdGhpcy5idWZmZXIgKz0gcGVyY2VudEVuY29kZUNoYXIoYywgaXNQYXRoUGVyY2VudEVuY29kZSk7XHJcbiAgfVxyXG5cclxuICByZXR1cm4gdHJ1ZTtcclxufTtcclxuXHJcblVSTFN0YXRlTWFjaGluZS5wcm90b3R5cGVbXCJwYXJzZSBjYW5ub3QtYmUtYS1iYXNlLVVSTCBwYXRoXCJdID0gZnVuY3Rpb24gcGFyc2VDYW5ub3RCZUFCYXNlVVJMUGF0aChjKSB7XHJcbiAgaWYgKGMgPT09IDYzKSB7XHJcbiAgICB0aGlzLnVybC5xdWVyeSA9IFwiXCI7XHJcbiAgICB0aGlzLnN0YXRlID0gXCJxdWVyeVwiO1xyXG4gIH0gZWxzZSBpZiAoYyA9PT0gMzUpIHtcclxuICAgIHRoaXMudXJsLmZyYWdtZW50ID0gXCJcIjtcclxuICAgIHRoaXMuc3RhdGUgPSBcImZyYWdtZW50XCI7XHJcbiAgfSBlbHNlIHtcclxuICAgIC8vIFRPRE86IEFkZDogbm90IGEgVVJMIGNvZGUgcG9pbnRcclxuICAgIGlmICghaXNOYU4oYykgJiYgYyAhPT0gMzcpIHtcclxuICAgICAgdGhpcy5wYXJzZUVycm9yID0gdHJ1ZTtcclxuICAgIH1cclxuXHJcbiAgICBpZiAoYyA9PT0gMzcgJiZcclxuICAgICAgICAoIWlzQVNDSUlIZXgodGhpcy5pbnB1dFt0aGlzLnBvaW50ZXIgKyAxXSkgfHxcclxuICAgICAgICAgIWlzQVNDSUlIZXgodGhpcy5pbnB1dFt0aGlzLnBvaW50ZXIgKyAyXSkpKSB7XHJcbiAgICAgIHRoaXMucGFyc2VFcnJvciA9IHRydWU7XHJcbiAgICB9XHJcblxyXG4gICAgaWYgKCFpc05hTihjKSkge1xyXG4gICAgICB0aGlzLnVybC5wYXRoWzBdID0gdGhpcy51cmwucGF0aFswXSArIHBlcmNlbnRFbmNvZGVDaGFyKGMsIGlzQzBDb250cm9sUGVyY2VudEVuY29kZSk7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICByZXR1cm4gdHJ1ZTtcclxufTtcclxuXHJcblVSTFN0YXRlTWFjaGluZS5wcm90b3R5cGVbXCJwYXJzZSBxdWVyeVwiXSA9IGZ1bmN0aW9uIHBhcnNlUXVlcnkoYywgY1N0cikge1xyXG4gIGlmIChpc05hTihjKSB8fCAoIXRoaXMuc3RhdGVPdmVycmlkZSAmJiBjID09PSAzNSkpIHtcclxuICAgIGlmICghaXNTcGVjaWFsKHRoaXMudXJsKSB8fCB0aGlzLnVybC5zY2hlbWUgPT09IFwid3NcIiB8fCB0aGlzLnVybC5zY2hlbWUgPT09IFwid3NzXCIpIHtcclxuICAgICAgdGhpcy5lbmNvZGluZ092ZXJyaWRlID0gXCJ1dGYtOFwiO1xyXG4gICAgfVxyXG5cclxuICAgIGNvbnN0IGJ1ZmZlciA9IG5ldyBCdWZmZXIodGhpcy5idWZmZXIpOyAvLyBUT0RPOiBVc2UgZW5jb2Rpbmcgb3ZlcnJpZGUgaW5zdGVhZFxyXG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCBidWZmZXIubGVuZ3RoOyArK2kpIHtcclxuICAgICAgaWYgKGJ1ZmZlcltpXSA8IDB4MjEgfHwgYnVmZmVyW2ldID4gMHg3RSB8fCBidWZmZXJbaV0gPT09IDB4MjIgfHwgYnVmZmVyW2ldID09PSAweDIzIHx8XHJcbiAgICAgICAgICBidWZmZXJbaV0gPT09IDB4M0MgfHwgYnVmZmVyW2ldID09PSAweDNFKSB7XHJcbiAgICAgICAgdGhpcy51cmwucXVlcnkgKz0gcGVyY2VudEVuY29kZShidWZmZXJbaV0pO1xyXG4gICAgICB9IGVsc2Uge1xyXG4gICAgICAgIHRoaXMudXJsLnF1ZXJ5ICs9IFN0cmluZy5mcm9tQ29kZVBvaW50KGJ1ZmZlcltpXSk7XHJcbiAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICB0aGlzLmJ1ZmZlciA9IFwiXCI7XHJcbiAgICBpZiAoYyA9PT0gMzUpIHtcclxuICAgICAgdGhpcy51cmwuZnJhZ21lbnQgPSBcIlwiO1xyXG4gICAgICB0aGlzLnN0YXRlID0gXCJmcmFnbWVudFwiO1xyXG4gICAgfVxyXG4gIH0gZWxzZSB7XHJcbiAgICAvLyBUT0RPOiBJZiBjIGlzIG5vdCBhIFVSTCBjb2RlIHBvaW50IGFuZCBub3QgXCIlXCIsIHBhcnNlIGVycm9yLlxyXG4gICAgaWYgKGMgPT09IDM3ICYmXHJcbiAgICAgICghaXNBU0NJSUhleCh0aGlzLmlucHV0W3RoaXMucG9pbnRlciArIDFdKSB8fFxyXG4gICAgICAgICFpc0FTQ0lJSGV4KHRoaXMuaW5wdXRbdGhpcy5wb2ludGVyICsgMl0pKSkge1xyXG4gICAgICB0aGlzLnBhcnNlRXJyb3IgPSB0cnVlO1xyXG4gICAgfVxyXG5cclxuICAgIHRoaXMuYnVmZmVyICs9IGNTdHI7XHJcbiAgfVxyXG5cclxuICByZXR1cm4gdHJ1ZTtcclxufTtcclxuXHJcblVSTFN0YXRlTWFjaGluZS5wcm90b3R5cGVbXCJwYXJzZSBmcmFnbWVudFwiXSA9IGZ1bmN0aW9uIHBhcnNlRnJhZ21lbnQoYykge1xyXG4gIGlmIChpc05hTihjKSkgeyAvLyBkbyBub3RoaW5nXHJcbiAgfSBlbHNlIGlmIChjID09PSAweDApIHtcclxuICAgIHRoaXMucGFyc2VFcnJvciA9IHRydWU7XHJcbiAgfSBlbHNlIHtcclxuICAgIC8vIFRPRE86IElmIGMgaXMgbm90IGEgVVJMIGNvZGUgcG9pbnQgYW5kIG5vdCBcIiVcIiwgcGFyc2UgZXJyb3IuXHJcbiAgICBpZiAoYyA9PT0gMzcgJiZcclxuICAgICAgKCFpc0FTQ0lJSGV4KHRoaXMuaW5wdXRbdGhpcy5wb2ludGVyICsgMV0pIHx8XHJcbiAgICAgICAgIWlzQVNDSUlIZXgodGhpcy5pbnB1dFt0aGlzLnBvaW50ZXIgKyAyXSkpKSB7XHJcbiAgICAgIHRoaXMucGFyc2VFcnJvciA9IHRydWU7XHJcbiAgICB9XHJcblxyXG4gICAgdGhpcy51cmwuZnJhZ21lbnQgKz0gcGVyY2VudEVuY29kZUNoYXIoYywgaXNDMENvbnRyb2xQZXJjZW50RW5jb2RlKTtcclxuICB9XHJcblxyXG4gIHJldHVybiB0cnVlO1xyXG59O1xyXG5cclxuZnVuY3Rpb24gc2VyaWFsaXplVVJMKHVybCwgZXhjbHVkZUZyYWdtZW50KSB7XHJcbiAgbGV0IG91dHB1dCA9IHVybC5zY2hlbWUgKyBcIjpcIjtcclxuICBpZiAodXJsLmhvc3QgIT09IG51bGwpIHtcclxuICAgIG91dHB1dCArPSBcIi8vXCI7XHJcblxyXG4gICAgaWYgKHVybC51c2VybmFtZSAhPT0gXCJcIiB8fCB1cmwucGFzc3dvcmQgIT09IFwiXCIpIHtcclxuICAgICAgb3V0cHV0ICs9IHVybC51c2VybmFtZTtcclxuICAgICAgaWYgKHVybC5wYXNzd29yZCAhPT0gXCJcIikge1xyXG4gICAgICAgIG91dHB1dCArPSBcIjpcIiArIHVybC5wYXNzd29yZDtcclxuICAgICAgfVxyXG4gICAgICBvdXRwdXQgKz0gXCJAXCI7XHJcbiAgICB9XHJcblxyXG4gICAgb3V0cHV0ICs9IHNlcmlhbGl6ZUhvc3QodXJsLmhvc3QpO1xyXG5cclxuICAgIGlmICh1cmwucG9ydCAhPT0gbnVsbCkge1xyXG4gICAgICBvdXRwdXQgKz0gXCI6XCIgKyB1cmwucG9ydDtcclxuICAgIH1cclxuICB9IGVsc2UgaWYgKHVybC5ob3N0ID09PSBudWxsICYmIHVybC5zY2hlbWUgPT09IFwiZmlsZVwiKSB7XHJcbiAgICBvdXRwdXQgKz0gXCIvL1wiO1xyXG4gIH1cclxuXHJcbiAgaWYgKHVybC5jYW5ub3RCZUFCYXNlVVJMKSB7XHJcbiAgICBvdXRwdXQgKz0gdXJsLnBhdGhbMF07XHJcbiAgfSBlbHNlIHtcclxuICAgIGZvciAoY29uc3Qgc3RyaW5nIG9mIHVybC5wYXRoKSB7XHJcbiAgICAgIG91dHB1dCArPSBcIi9cIiArIHN0cmluZztcclxuICAgIH1cclxuICB9XHJcblxyXG4gIGlmICh1cmwucXVlcnkgIT09IG51bGwpIHtcclxuICAgIG91dHB1dCArPSBcIj9cIiArIHVybC5xdWVyeTtcclxuICB9XHJcblxyXG4gIGlmICghZXhjbHVkZUZyYWdtZW50ICYmIHVybC5mcmFnbWVudCAhPT0gbnVsbCkge1xyXG4gICAgb3V0cHV0ICs9IFwiI1wiICsgdXJsLmZyYWdtZW50O1xyXG4gIH1cclxuXHJcbiAgcmV0dXJuIG91dHB1dDtcclxufVxyXG5cclxuZnVuY3Rpb24gc2VyaWFsaXplT3JpZ2luKHR1cGxlKSB7XHJcbiAgbGV0IHJlc3VsdCA9IHR1cGxlLnNjaGVtZSArIFwiOi8vXCI7XHJcbiAgcmVzdWx0ICs9IHNlcmlhbGl6ZUhvc3QodHVwbGUuaG9zdCk7XHJcblxyXG4gIGlmICh0dXBsZS5wb3J0ICE9PSBudWxsKSB7XHJcbiAgICByZXN1bHQgKz0gXCI6XCIgKyB0dXBsZS5wb3J0O1xyXG4gIH1cclxuXHJcbiAgcmV0dXJuIHJlc3VsdDtcclxufVxyXG5cclxubW9kdWxlLmV4cG9ydHMuc2VyaWFsaXplVVJMID0gc2VyaWFsaXplVVJMO1xyXG5cclxubW9kdWxlLmV4cG9ydHMuc2VyaWFsaXplVVJMT3JpZ2luID0gZnVuY3Rpb24gKHVybCkge1xyXG4gIC8vIGh0dHBzOi8vdXJsLnNwZWMud2hhdHdnLm9yZy8jY29uY2VwdC11cmwtb3JpZ2luXHJcbiAgc3dpdGNoICh1cmwuc2NoZW1lKSB7XHJcbiAgICBjYXNlIFwiYmxvYlwiOlxyXG4gICAgICB0cnkge1xyXG4gICAgICAgIHJldHVybiBtb2R1bGUuZXhwb3J0cy5zZXJpYWxpemVVUkxPcmlnaW4obW9kdWxlLmV4cG9ydHMucGFyc2VVUkwodXJsLnBhdGhbMF0pKTtcclxuICAgICAgfSBjYXRjaCAoZSkge1xyXG4gICAgICAgIC8vIHNlcmlhbGl6aW5nIGFuIG9wYXF1ZSBvcmlnaW4gcmV0dXJucyBcIm51bGxcIlxyXG4gICAgICAgIHJldHVybiBcIm51bGxcIjtcclxuICAgICAgfVxyXG4gICAgY2FzZSBcImZ0cFwiOlxyXG4gICAgY2FzZSBcImdvcGhlclwiOlxyXG4gICAgY2FzZSBcImh0dHBcIjpcclxuICAgIGNhc2UgXCJodHRwc1wiOlxyXG4gICAgY2FzZSBcIndzXCI6XHJcbiAgICBjYXNlIFwid3NzXCI6XHJcbiAgICAgIHJldHVybiBzZXJpYWxpemVPcmlnaW4oe1xyXG4gICAgICAgIHNjaGVtZTogdXJsLnNjaGVtZSxcclxuICAgICAgICBob3N0OiB1cmwuaG9zdCxcclxuICAgICAgICBwb3J0OiB1cmwucG9ydFxyXG4gICAgICB9KTtcclxuICAgIGNhc2UgXCJmaWxlXCI6XHJcbiAgICAgIC8vIHNwZWMgc2F5cyBcImV4ZXJjaXNlIHRvIHRoZSByZWFkZXJcIiwgY2hyb21lIHNheXMgXCJmaWxlOi8vXCJcclxuICAgICAgcmV0dXJuIFwiZmlsZTovL1wiO1xyXG4gICAgZGVmYXVsdDpcclxuICAgICAgLy8gc2VyaWFsaXppbmcgYW4gb3BhcXVlIG9yaWdpbiByZXR1cm5zIFwibnVsbFwiXHJcbiAgICAgIHJldHVybiBcIm51bGxcIjtcclxuICB9XHJcbn07XHJcblxyXG5tb2R1bGUuZXhwb3J0cy5iYXNpY1VSTFBhcnNlID0gZnVuY3Rpb24gKGlucHV0LCBvcHRpb25zKSB7XHJcbiAgaWYgKG9wdGlvbnMgPT09IHVuZGVmaW5lZCkge1xyXG4gICAgb3B0aW9ucyA9IHt9O1xyXG4gIH1cclxuXHJcbiAgY29uc3QgdXNtID0gbmV3IFVSTFN0YXRlTWFjaGluZShpbnB1dCwgb3B0aW9ucy5iYXNlVVJMLCBvcHRpb25zLmVuY29kaW5nT3ZlcnJpZGUsIG9wdGlvbnMudXJsLCBvcHRpb25zLnN0YXRlT3ZlcnJpZGUpO1xyXG4gIGlmICh1c20uZmFpbHVyZSkge1xyXG4gICAgcmV0dXJuIFwiZmFpbHVyZVwiO1xyXG4gIH1cclxuXHJcbiAgcmV0dXJuIHVzbS51cmw7XHJcbn07XHJcblxyXG5tb2R1bGUuZXhwb3J0cy5zZXRUaGVVc2VybmFtZSA9IGZ1bmN0aW9uICh1cmwsIHVzZXJuYW1lKSB7XHJcbiAgdXJsLnVzZXJuYW1lID0gXCJcIjtcclxuICBjb25zdCBkZWNvZGVkID0gcHVueWNvZGUudWNzMi5kZWNvZGUodXNlcm5hbWUpO1xyXG4gIGZvciAobGV0IGkgPSAwOyBpIDwgZGVjb2RlZC5sZW5ndGg7ICsraSkge1xyXG4gICAgdXJsLnVzZXJuYW1lICs9IHBlcmNlbnRFbmNvZGVDaGFyKGRlY29kZWRbaV0sIGlzVXNlcmluZm9QZXJjZW50RW5jb2RlKTtcclxuICB9XHJcbn07XHJcblxyXG5tb2R1bGUuZXhwb3J0cy5zZXRUaGVQYXNzd29yZCA9IGZ1bmN0aW9uICh1cmwsIHBhc3N3b3JkKSB7XHJcbiAgdXJsLnBhc3N3b3JkID0gXCJcIjtcclxuICBjb25zdCBkZWNvZGVkID0gcHVueWNvZGUudWNzMi5kZWNvZGUocGFzc3dvcmQpO1xyXG4gIGZvciAobGV0IGkgPSAwOyBpIDwgZGVjb2RlZC5sZW5ndGg7ICsraSkge1xyXG4gICAgdXJsLnBhc3N3b3JkICs9IHBlcmNlbnRFbmNvZGVDaGFyKGRlY29kZWRbaV0sIGlzVXNlcmluZm9QZXJjZW50RW5jb2RlKTtcclxuICB9XHJcbn07XHJcblxyXG5tb2R1bGUuZXhwb3J0cy5zZXJpYWxpemVIb3N0ID0gc2VyaWFsaXplSG9zdDtcclxuXHJcbm1vZHVsZS5leHBvcnRzLmNhbm5vdEhhdmVBVXNlcm5hbWVQYXNzd29yZFBvcnQgPSBjYW5ub3RIYXZlQVVzZXJuYW1lUGFzc3dvcmRQb3J0O1xyXG5cclxubW9kdWxlLmV4cG9ydHMuc2VyaWFsaXplSW50ZWdlciA9IGZ1bmN0aW9uIChpbnRlZ2VyKSB7XHJcbiAgcmV0dXJuIFN0cmluZyhpbnRlZ2VyKTtcclxufTtcclxuXHJcbm1vZHVsZS5leHBvcnRzLnBhcnNlVVJMID0gZnVuY3Rpb24gKGlucHV0LCBvcHRpb25zKSB7XHJcbiAgaWYgKG9wdGlvbnMgPT09IHVuZGVmaW5lZCkge1xyXG4gICAgb3B0aW9ucyA9IHt9O1xyXG4gIH1cclxuXHJcbiAgLy8gV2UgZG9uJ3QgaGFuZGxlIGJsb2JzLCBzbyB0aGlzIGp1c3QgZGVsZWdhdGVzOlxyXG4gIHJldHVybiBtb2R1bGUuZXhwb3J0cy5iYXNpY1VSTFBhcnNlKGlucHV0LCB7IGJhc2VVUkw6IG9wdGlvbnMuYmFzZVVSTCwgZW5jb2RpbmdPdmVycmlkZTogb3B0aW9ucy5lbmNvZGluZ092ZXJyaWRlIH0pO1xyXG59O1xyXG4iLAogICAgIlwidXNlIHN0cmljdFwiO1xuY29uc3QgdXNtID0gcmVxdWlyZShcIi4vdXJsLXN0YXRlLW1hY2hpbmVcIik7XG5cbmV4cG9ydHMuaW1wbGVtZW50YXRpb24gPSBjbGFzcyBVUkxJbXBsIHtcbiAgY29uc3RydWN0b3IoY29uc3RydWN0b3JBcmdzKSB7XG4gICAgY29uc3QgdXJsID0gY29uc3RydWN0b3JBcmdzWzBdO1xuICAgIGNvbnN0IGJhc2UgPSBjb25zdHJ1Y3RvckFyZ3NbMV07XG5cbiAgICBsZXQgcGFyc2VkQmFzZSA9IG51bGw7XG4gICAgaWYgKGJhc2UgIT09IHVuZGVmaW5lZCkge1xuICAgICAgcGFyc2VkQmFzZSA9IHVzbS5iYXNpY1VSTFBhcnNlKGJhc2UpO1xuICAgICAgaWYgKHBhcnNlZEJhc2UgPT09IFwiZmFpbHVyZVwiKSB7XG4gICAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoXCJJbnZhbGlkIGJhc2UgVVJMXCIpO1xuICAgICAgfVxuICAgIH1cblxuICAgIGNvbnN0IHBhcnNlZFVSTCA9IHVzbS5iYXNpY1VSTFBhcnNlKHVybCwgeyBiYXNlVVJMOiBwYXJzZWRCYXNlIH0pO1xuICAgIGlmIChwYXJzZWRVUkwgPT09IFwiZmFpbHVyZVwiKSB7XG4gICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKFwiSW52YWxpZCBVUkxcIik7XG4gICAgfVxuXG4gICAgdGhpcy5fdXJsID0gcGFyc2VkVVJMO1xuXG4gICAgLy8gVE9ETzogcXVlcnkgc3R1ZmZcbiAgfVxuXG4gIGdldCBocmVmKCkge1xuICAgIHJldHVybiB1c20uc2VyaWFsaXplVVJMKHRoaXMuX3VybCk7XG4gIH1cblxuICBzZXQgaHJlZih2KSB7XG4gICAgY29uc3QgcGFyc2VkVVJMID0gdXNtLmJhc2ljVVJMUGFyc2Uodik7XG4gICAgaWYgKHBhcnNlZFVSTCA9PT0gXCJmYWlsdXJlXCIpIHtcbiAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoXCJJbnZhbGlkIFVSTFwiKTtcbiAgICB9XG5cbiAgICB0aGlzLl91cmwgPSBwYXJzZWRVUkw7XG4gIH1cblxuICBnZXQgb3JpZ2luKCkge1xuICAgIHJldHVybiB1c20uc2VyaWFsaXplVVJMT3JpZ2luKHRoaXMuX3VybCk7XG4gIH1cblxuICBnZXQgcHJvdG9jb2woKSB7XG4gICAgcmV0dXJuIHRoaXMuX3VybC5zY2hlbWUgKyBcIjpcIjtcbiAgfVxuXG4gIHNldCBwcm90b2NvbCh2KSB7XG4gICAgdXNtLmJhc2ljVVJMUGFyc2UodiArIFwiOlwiLCB7IHVybDogdGhpcy5fdXJsLCBzdGF0ZU92ZXJyaWRlOiBcInNjaGVtZSBzdGFydFwiIH0pO1xuICB9XG5cbiAgZ2V0IHVzZXJuYW1lKCkge1xuICAgIHJldHVybiB0aGlzLl91cmwudXNlcm5hbWU7XG4gIH1cblxuICBzZXQgdXNlcm5hbWUodikge1xuICAgIGlmICh1c20uY2Fubm90SGF2ZUFVc2VybmFtZVBhc3N3b3JkUG9ydCh0aGlzLl91cmwpKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgdXNtLnNldFRoZVVzZXJuYW1lKHRoaXMuX3VybCwgdik7XG4gIH1cblxuICBnZXQgcGFzc3dvcmQoKSB7XG4gICAgcmV0dXJuIHRoaXMuX3VybC5wYXNzd29yZDtcbiAgfVxuXG4gIHNldCBwYXNzd29yZCh2KSB7XG4gICAgaWYgKHVzbS5jYW5ub3RIYXZlQVVzZXJuYW1lUGFzc3dvcmRQb3J0KHRoaXMuX3VybCkpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICB1c20uc2V0VGhlUGFzc3dvcmQodGhpcy5fdXJsLCB2KTtcbiAgfVxuXG4gIGdldCBob3N0KCkge1xuICAgIGNvbnN0IHVybCA9IHRoaXMuX3VybDtcblxuICAgIGlmICh1cmwuaG9zdCA9PT0gbnVsbCkge1xuICAgICAgcmV0dXJuIFwiXCI7XG4gICAgfVxuXG4gICAgaWYgKHVybC5wb3J0ID09PSBudWxsKSB7XG4gICAgICByZXR1cm4gdXNtLnNlcmlhbGl6ZUhvc3QodXJsLmhvc3QpO1xuICAgIH1cblxuICAgIHJldHVybiB1c20uc2VyaWFsaXplSG9zdCh1cmwuaG9zdCkgKyBcIjpcIiArIHVzbS5zZXJpYWxpemVJbnRlZ2VyKHVybC5wb3J0KTtcbiAgfVxuXG4gIHNldCBob3N0KHYpIHtcbiAgICBpZiAodGhpcy5fdXJsLmNhbm5vdEJlQUJhc2VVUkwpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICB1c20uYmFzaWNVUkxQYXJzZSh2LCB7IHVybDogdGhpcy5fdXJsLCBzdGF0ZU92ZXJyaWRlOiBcImhvc3RcIiB9KTtcbiAgfVxuXG4gIGdldCBob3N0bmFtZSgpIHtcbiAgICBpZiAodGhpcy5fdXJsLmhvc3QgPT09IG51bGwpIHtcbiAgICAgIHJldHVybiBcIlwiO1xuICAgIH1cblxuICAgIHJldHVybiB1c20uc2VyaWFsaXplSG9zdCh0aGlzLl91cmwuaG9zdCk7XG4gIH1cblxuICBzZXQgaG9zdG5hbWUodikge1xuICAgIGlmICh0aGlzLl91cmwuY2Fubm90QmVBQmFzZVVSTCkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIHVzbS5iYXNpY1VSTFBhcnNlKHYsIHsgdXJsOiB0aGlzLl91cmwsIHN0YXRlT3ZlcnJpZGU6IFwiaG9zdG5hbWVcIiB9KTtcbiAgfVxuXG4gIGdldCBwb3J0KCkge1xuICAgIGlmICh0aGlzLl91cmwucG9ydCA9PT0gbnVsbCkge1xuICAgICAgcmV0dXJuIFwiXCI7XG4gICAgfVxuXG4gICAgcmV0dXJuIHVzbS5zZXJpYWxpemVJbnRlZ2VyKHRoaXMuX3VybC5wb3J0KTtcbiAgfVxuXG4gIHNldCBwb3J0KHYpIHtcbiAgICBpZiAodXNtLmNhbm5vdEhhdmVBVXNlcm5hbWVQYXNzd29yZFBvcnQodGhpcy5fdXJsKSkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGlmICh2ID09PSBcIlwiKSB7XG4gICAgICB0aGlzLl91cmwucG9ydCA9IG51bGw7XG4gICAgfSBlbHNlIHtcbiAgICAgIHVzbS5iYXNpY1VSTFBhcnNlKHYsIHsgdXJsOiB0aGlzLl91cmwsIHN0YXRlT3ZlcnJpZGU6IFwicG9ydFwiIH0pO1xuICAgIH1cbiAgfVxuXG4gIGdldCBwYXRobmFtZSgpIHtcbiAgICBpZiAodGhpcy5fdXJsLmNhbm5vdEJlQUJhc2VVUkwpIHtcbiAgICAgIHJldHVybiB0aGlzLl91cmwucGF0aFswXTtcbiAgICB9XG5cbiAgICBpZiAodGhpcy5fdXJsLnBhdGgubGVuZ3RoID09PSAwKSB7XG4gICAgICByZXR1cm4gXCJcIjtcbiAgICB9XG5cbiAgICByZXR1cm4gXCIvXCIgKyB0aGlzLl91cmwucGF0aC5qb2luKFwiL1wiKTtcbiAgfVxuXG4gIHNldCBwYXRobmFtZSh2KSB7XG4gICAgaWYgKHRoaXMuX3VybC5jYW5ub3RCZUFCYXNlVVJMKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgdGhpcy5fdXJsLnBhdGggPSBbXTtcbiAgICB1c20uYmFzaWNVUkxQYXJzZSh2LCB7IHVybDogdGhpcy5fdXJsLCBzdGF0ZU92ZXJyaWRlOiBcInBhdGggc3RhcnRcIiB9KTtcbiAgfVxuXG4gIGdldCBzZWFyY2goKSB7XG4gICAgaWYgKHRoaXMuX3VybC5xdWVyeSA9PT0gbnVsbCB8fCB0aGlzLl91cmwucXVlcnkgPT09IFwiXCIpIHtcbiAgICAgIHJldHVybiBcIlwiO1xuICAgIH1cblxuICAgIHJldHVybiBcIj9cIiArIHRoaXMuX3VybC5xdWVyeTtcbiAgfVxuXG4gIHNldCBzZWFyY2godikge1xuICAgIC8vIFRPRE86IHF1ZXJ5IHN0dWZmXG5cbiAgICBjb25zdCB1cmwgPSB0aGlzLl91cmw7XG5cbiAgICBpZiAodiA9PT0gXCJcIikge1xuICAgICAgdXJsLnF1ZXJ5ID0gbnVsbDtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBjb25zdCBpbnB1dCA9IHZbMF0gPT09IFwiP1wiID8gdi5zdWJzdHJpbmcoMSkgOiB2O1xuICAgIHVybC5xdWVyeSA9IFwiXCI7XG4gICAgdXNtLmJhc2ljVVJMUGFyc2UoaW5wdXQsIHsgdXJsLCBzdGF0ZU92ZXJyaWRlOiBcInF1ZXJ5XCIgfSk7XG4gIH1cblxuICBnZXQgaGFzaCgpIHtcbiAgICBpZiAodGhpcy5fdXJsLmZyYWdtZW50ID09PSBudWxsIHx8IHRoaXMuX3VybC5mcmFnbWVudCA9PT0gXCJcIikge1xuICAgICAgcmV0dXJuIFwiXCI7XG4gICAgfVxuXG4gICAgcmV0dXJuIFwiI1wiICsgdGhpcy5fdXJsLmZyYWdtZW50O1xuICB9XG5cbiAgc2V0IGhhc2godikge1xuICAgIGlmICh2ID09PSBcIlwiKSB7XG4gICAgICB0aGlzLl91cmwuZnJhZ21lbnQgPSBudWxsO1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGNvbnN0IGlucHV0ID0gdlswXSA9PT0gXCIjXCIgPyB2LnN1YnN0cmluZygxKSA6IHY7XG4gICAgdGhpcy5fdXJsLmZyYWdtZW50ID0gXCJcIjtcbiAgICB1c20uYmFzaWNVUkxQYXJzZShpbnB1dCwgeyB1cmw6IHRoaXMuX3VybCwgc3RhdGVPdmVycmlkZTogXCJmcmFnbWVudFwiIH0pO1xuICB9XG5cbiAgdG9KU09OKCkge1xuICAgIHJldHVybiB0aGlzLmhyZWY7XG4gIH1cbn07XG4iLAogICAgIlwidXNlIHN0cmljdFwiO1xuXG5jb25zdCBjb252ZXJzaW9ucyA9IHJlcXVpcmUoXCJ3ZWJpZGwtY29udmVyc2lvbnNcIik7XG5jb25zdCB1dGlscyA9IHJlcXVpcmUoXCIuL3V0aWxzLmpzXCIpO1xuY29uc3QgSW1wbCA9IHJlcXVpcmUoXCIuLy9VUkwtaW1wbC5qc1wiKTtcblxuY29uc3QgaW1wbCA9IHV0aWxzLmltcGxTeW1ib2w7XG5cbmZ1bmN0aW9uIFVSTCh1cmwpIHtcbiAgaWYgKCF0aGlzIHx8IHRoaXNbaW1wbF0gfHwgISh0aGlzIGluc3RhbmNlb2YgVVJMKSkge1xuICAgIHRocm93IG5ldyBUeXBlRXJyb3IoXCJGYWlsZWQgdG8gY29uc3RydWN0ICdVUkwnOiBQbGVhc2UgdXNlIHRoZSAnbmV3JyBvcGVyYXRvciwgdGhpcyBET00gb2JqZWN0IGNvbnN0cnVjdG9yIGNhbm5vdCBiZSBjYWxsZWQgYXMgYSBmdW5jdGlvbi5cIik7XG4gIH1cbiAgaWYgKGFyZ3VtZW50cy5sZW5ndGggPCAxKSB7XG4gICAgdGhyb3cgbmV3IFR5cGVFcnJvcihcIkZhaWxlZCB0byBjb25zdHJ1Y3QgJ1VSTCc6IDEgYXJndW1lbnQgcmVxdWlyZWQsIGJ1dCBvbmx5IFwiICsgYXJndW1lbnRzLmxlbmd0aCArIFwiIHByZXNlbnQuXCIpO1xuICB9XG4gIGNvbnN0IGFyZ3MgPSBbXTtcbiAgZm9yIChsZXQgaSA9IDA7IGkgPCBhcmd1bWVudHMubGVuZ3RoICYmIGkgPCAyOyArK2kpIHtcbiAgICBhcmdzW2ldID0gYXJndW1lbnRzW2ldO1xuICB9XG4gIGFyZ3NbMF0gPSBjb252ZXJzaW9uc1tcIlVTVlN0cmluZ1wiXShhcmdzWzBdKTtcbiAgaWYgKGFyZ3NbMV0gIT09IHVuZGVmaW5lZCkge1xuICBhcmdzWzFdID0gY29udmVyc2lvbnNbXCJVU1ZTdHJpbmdcIl0oYXJnc1sxXSk7XG4gIH1cblxuICBtb2R1bGUuZXhwb3J0cy5zZXR1cCh0aGlzLCBhcmdzKTtcbn1cblxuVVJMLnByb3RvdHlwZS50b0pTT04gPSBmdW5jdGlvbiB0b0pTT04oKSB7XG4gIGlmICghdGhpcyB8fCAhbW9kdWxlLmV4cG9ydHMuaXModGhpcykpIHtcbiAgICB0aHJvdyBuZXcgVHlwZUVycm9yKFwiSWxsZWdhbCBpbnZvY2F0aW9uXCIpO1xuICB9XG4gIGNvbnN0IGFyZ3MgPSBbXTtcbiAgZm9yIChsZXQgaSA9IDA7IGkgPCBhcmd1bWVudHMubGVuZ3RoICYmIGkgPCAwOyArK2kpIHtcbiAgICBhcmdzW2ldID0gYXJndW1lbnRzW2ldO1xuICB9XG4gIHJldHVybiB0aGlzW2ltcGxdLnRvSlNPTi5hcHBseSh0aGlzW2ltcGxdLCBhcmdzKTtcbn07XG5PYmplY3QuZGVmaW5lUHJvcGVydHkoVVJMLnByb3RvdHlwZSwgXCJocmVmXCIsIHtcbiAgZ2V0KCkge1xuICAgIHJldHVybiB0aGlzW2ltcGxdLmhyZWY7XG4gIH0sXG4gIHNldChWKSB7XG4gICAgViA9IGNvbnZlcnNpb25zW1wiVVNWU3RyaW5nXCJdKFYpO1xuICAgIHRoaXNbaW1wbF0uaHJlZiA9IFY7XG4gIH0sXG4gIGVudW1lcmFibGU6IHRydWUsXG4gIGNvbmZpZ3VyYWJsZTogdHJ1ZVxufSk7XG5cblVSTC5wcm90b3R5cGUudG9TdHJpbmcgPSBmdW5jdGlvbiAoKSB7XG4gIGlmICghdGhpcyB8fCAhbW9kdWxlLmV4cG9ydHMuaXModGhpcykpIHtcbiAgICB0aHJvdyBuZXcgVHlwZUVycm9yKFwiSWxsZWdhbCBpbnZvY2F0aW9uXCIpO1xuICB9XG4gIHJldHVybiB0aGlzLmhyZWY7XG59O1xuXG5PYmplY3QuZGVmaW5lUHJvcGVydHkoVVJMLnByb3RvdHlwZSwgXCJvcmlnaW5cIiwge1xuICBnZXQoKSB7XG4gICAgcmV0dXJuIHRoaXNbaW1wbF0ub3JpZ2luO1xuICB9LFxuICBlbnVtZXJhYmxlOiB0cnVlLFxuICBjb25maWd1cmFibGU6IHRydWVcbn0pO1xuXG5PYmplY3QuZGVmaW5lUHJvcGVydHkoVVJMLnByb3RvdHlwZSwgXCJwcm90b2NvbFwiLCB7XG4gIGdldCgpIHtcbiAgICByZXR1cm4gdGhpc1tpbXBsXS5wcm90b2NvbDtcbiAgfSxcbiAgc2V0KFYpIHtcbiAgICBWID0gY29udmVyc2lvbnNbXCJVU1ZTdHJpbmdcIl0oVik7XG4gICAgdGhpc1tpbXBsXS5wcm90b2NvbCA9IFY7XG4gIH0sXG4gIGVudW1lcmFibGU6IHRydWUsXG4gIGNvbmZpZ3VyYWJsZTogdHJ1ZVxufSk7XG5cbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShVUkwucHJvdG90eXBlLCBcInVzZXJuYW1lXCIsIHtcbiAgZ2V0KCkge1xuICAgIHJldHVybiB0aGlzW2ltcGxdLnVzZXJuYW1lO1xuICB9LFxuICBzZXQoVikge1xuICAgIFYgPSBjb252ZXJzaW9uc1tcIlVTVlN0cmluZ1wiXShWKTtcbiAgICB0aGlzW2ltcGxdLnVzZXJuYW1lID0gVjtcbiAgfSxcbiAgZW51bWVyYWJsZTogdHJ1ZSxcbiAgY29uZmlndXJhYmxlOiB0cnVlXG59KTtcblxuT2JqZWN0LmRlZmluZVByb3BlcnR5KFVSTC5wcm90b3R5cGUsIFwicGFzc3dvcmRcIiwge1xuICBnZXQoKSB7XG4gICAgcmV0dXJuIHRoaXNbaW1wbF0ucGFzc3dvcmQ7XG4gIH0sXG4gIHNldChWKSB7XG4gICAgViA9IGNvbnZlcnNpb25zW1wiVVNWU3RyaW5nXCJdKFYpO1xuICAgIHRoaXNbaW1wbF0ucGFzc3dvcmQgPSBWO1xuICB9LFxuICBlbnVtZXJhYmxlOiB0cnVlLFxuICBjb25maWd1cmFibGU6IHRydWVcbn0pO1xuXG5PYmplY3QuZGVmaW5lUHJvcGVydHkoVVJMLnByb3RvdHlwZSwgXCJob3N0XCIsIHtcbiAgZ2V0KCkge1xuICAgIHJldHVybiB0aGlzW2ltcGxdLmhvc3Q7XG4gIH0sXG4gIHNldChWKSB7XG4gICAgViA9IGNvbnZlcnNpb25zW1wiVVNWU3RyaW5nXCJdKFYpO1xuICAgIHRoaXNbaW1wbF0uaG9zdCA9IFY7XG4gIH0sXG4gIGVudW1lcmFibGU6IHRydWUsXG4gIGNvbmZpZ3VyYWJsZTogdHJ1ZVxufSk7XG5cbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShVUkwucHJvdG90eXBlLCBcImhvc3RuYW1lXCIsIHtcbiAgZ2V0KCkge1xuICAgIHJldHVybiB0aGlzW2ltcGxdLmhvc3RuYW1lO1xuICB9LFxuICBzZXQoVikge1xuICAgIFYgPSBjb252ZXJzaW9uc1tcIlVTVlN0cmluZ1wiXShWKTtcbiAgICB0aGlzW2ltcGxdLmhvc3RuYW1lID0gVjtcbiAgfSxcbiAgZW51bWVyYWJsZTogdHJ1ZSxcbiAgY29uZmlndXJhYmxlOiB0cnVlXG59KTtcblxuT2JqZWN0LmRlZmluZVByb3BlcnR5KFVSTC5wcm90b3R5cGUsIFwicG9ydFwiLCB7XG4gIGdldCgpIHtcbiAgICByZXR1cm4gdGhpc1tpbXBsXS5wb3J0O1xuICB9LFxuICBzZXQoVikge1xuICAgIFYgPSBjb252ZXJzaW9uc1tcIlVTVlN0cmluZ1wiXShWKTtcbiAgICB0aGlzW2ltcGxdLnBvcnQgPSBWO1xuICB9LFxuICBlbnVtZXJhYmxlOiB0cnVlLFxuICBjb25maWd1cmFibGU6IHRydWVcbn0pO1xuXG5PYmplY3QuZGVmaW5lUHJvcGVydHkoVVJMLnByb3RvdHlwZSwgXCJwYXRobmFtZVwiLCB7XG4gIGdldCgpIHtcbiAgICByZXR1cm4gdGhpc1tpbXBsXS5wYXRobmFtZTtcbiAgfSxcbiAgc2V0KFYpIHtcbiAgICBWID0gY29udmVyc2lvbnNbXCJVU1ZTdHJpbmdcIl0oVik7XG4gICAgdGhpc1tpbXBsXS5wYXRobmFtZSA9IFY7XG4gIH0sXG4gIGVudW1lcmFibGU6IHRydWUsXG4gIGNvbmZpZ3VyYWJsZTogdHJ1ZVxufSk7XG5cbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShVUkwucHJvdG90eXBlLCBcInNlYXJjaFwiLCB7XG4gIGdldCgpIHtcbiAgICByZXR1cm4gdGhpc1tpbXBsXS5zZWFyY2g7XG4gIH0sXG4gIHNldChWKSB7XG4gICAgViA9IGNvbnZlcnNpb25zW1wiVVNWU3RyaW5nXCJdKFYpO1xuICAgIHRoaXNbaW1wbF0uc2VhcmNoID0gVjtcbiAgfSxcbiAgZW51bWVyYWJsZTogdHJ1ZSxcbiAgY29uZmlndXJhYmxlOiB0cnVlXG59KTtcblxuT2JqZWN0LmRlZmluZVByb3BlcnR5KFVSTC5wcm90b3R5cGUsIFwiaGFzaFwiLCB7XG4gIGdldCgpIHtcbiAgICByZXR1cm4gdGhpc1tpbXBsXS5oYXNoO1xuICB9LFxuICBzZXQoVikge1xuICAgIFYgPSBjb252ZXJzaW9uc1tcIlVTVlN0cmluZ1wiXShWKTtcbiAgICB0aGlzW2ltcGxdLmhhc2ggPSBWO1xuICB9LFxuICBlbnVtZXJhYmxlOiB0cnVlLFxuICBjb25maWd1cmFibGU6IHRydWVcbn0pO1xuXG5cbm1vZHVsZS5leHBvcnRzID0ge1xuICBpcyhvYmopIHtcbiAgICByZXR1cm4gISFvYmogJiYgb2JqW2ltcGxdIGluc3RhbmNlb2YgSW1wbC5pbXBsZW1lbnRhdGlvbjtcbiAgfSxcbiAgY3JlYXRlKGNvbnN0cnVjdG9yQXJncywgcHJpdmF0ZURhdGEpIHtcbiAgICBsZXQgb2JqID0gT2JqZWN0LmNyZWF0ZShVUkwucHJvdG90eXBlKTtcbiAgICB0aGlzLnNldHVwKG9iaiwgY29uc3RydWN0b3JBcmdzLCBwcml2YXRlRGF0YSk7XG4gICAgcmV0dXJuIG9iajtcbiAgfSxcbiAgc2V0dXAob2JqLCBjb25zdHJ1Y3RvckFyZ3MsIHByaXZhdGVEYXRhKSB7XG4gICAgaWYgKCFwcml2YXRlRGF0YSkgcHJpdmF0ZURhdGEgPSB7fTtcbiAgICBwcml2YXRlRGF0YS53cmFwcGVyID0gb2JqO1xuXG4gICAgb2JqW2ltcGxdID0gbmV3IEltcGwuaW1wbGVtZW50YXRpb24oY29uc3RydWN0b3JBcmdzLCBwcml2YXRlRGF0YSk7XG4gICAgb2JqW2ltcGxdW3V0aWxzLndyYXBwZXJTeW1ib2xdID0gb2JqO1xuICB9LFxuICBpbnRlcmZhY2U6IFVSTCxcbiAgZXhwb3NlOiB7XG4gICAgV2luZG93OiB7IFVSTDogVVJMIH0sXG4gICAgV29ya2VyOiB7IFVSTDogVVJMIH1cbiAgfVxufTtcblxuIiwKICAgICJcInVzZSBzdHJpY3RcIjtcblxuZXhwb3J0cy5VUkwgPSByZXF1aXJlKFwiLi9VUkxcIikuaW50ZXJmYWNlO1xuZXhwb3J0cy5zZXJpYWxpemVVUkwgPSByZXF1aXJlKFwiLi91cmwtc3RhdGUtbWFjaGluZVwiKS5zZXJpYWxpemVVUkw7XG5leHBvcnRzLnNlcmlhbGl6ZVVSTE9yaWdpbiA9IHJlcXVpcmUoXCIuL3VybC1zdGF0ZS1tYWNoaW5lXCIpLnNlcmlhbGl6ZVVSTE9yaWdpbjtcbmV4cG9ydHMuYmFzaWNVUkxQYXJzZSA9IHJlcXVpcmUoXCIuL3VybC1zdGF0ZS1tYWNoaW5lXCIpLmJhc2ljVVJMUGFyc2U7XG5leHBvcnRzLnNldFRoZVVzZXJuYW1lID0gcmVxdWlyZShcIi4vdXJsLXN0YXRlLW1hY2hpbmVcIikuc2V0VGhlVXNlcm5hbWU7XG5leHBvcnRzLnNldFRoZVBhc3N3b3JkID0gcmVxdWlyZShcIi4vdXJsLXN0YXRlLW1hY2hpbmVcIikuc2V0VGhlUGFzc3dvcmQ7XG5leHBvcnRzLnNlcmlhbGl6ZUhvc3QgPSByZXF1aXJlKFwiLi91cmwtc3RhdGUtbWFjaGluZVwiKS5zZXJpYWxpemVIb3N0O1xuZXhwb3J0cy5zZXJpYWxpemVJbnRlZ2VyID0gcmVxdWlyZShcIi4vdXJsLXN0YXRlLW1hY2hpbmVcIikuc2VyaWFsaXplSW50ZWdlcjtcbmV4cG9ydHMucGFyc2VVUkwgPSByZXF1aXJlKFwiLi91cmwtc3RhdGUtbWFjaGluZVwiKS5wYXJzZVVSTDtcbiIsCiAgICAiJ3VzZSBzdHJpY3QnO1xuXG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgJ19fZXNNb2R1bGUnLCB7IHZhbHVlOiB0cnVlIH0pO1xuXG5mdW5jdGlvbiBfaW50ZXJvcERlZmF1bHQgKGV4KSB7IHJldHVybiAoZXggJiYgKHR5cGVvZiBleCA9PT0gJ29iamVjdCcpICYmICdkZWZhdWx0JyBpbiBleCkgPyBleFsnZGVmYXVsdCddIDogZXg7IH1cblxudmFyIFN0cmVhbSA9IF9pbnRlcm9wRGVmYXVsdChyZXF1aXJlKCdzdHJlYW0nKSk7XG52YXIgaHR0cCA9IF9pbnRlcm9wRGVmYXVsdChyZXF1aXJlKCdodHRwJykpO1xudmFyIFVybCA9IF9pbnRlcm9wRGVmYXVsdChyZXF1aXJlKCd1cmwnKSk7XG52YXIgd2hhdHdnVXJsID0gX2ludGVyb3BEZWZhdWx0KHJlcXVpcmUoJ3doYXR3Zy11cmwnKSk7XG52YXIgaHR0cHMgPSBfaW50ZXJvcERlZmF1bHQocmVxdWlyZSgnaHR0cHMnKSk7XG52YXIgemxpYiA9IF9pbnRlcm9wRGVmYXVsdChyZXF1aXJlKCd6bGliJykpO1xuXG4vLyBCYXNlZCBvbiBodHRwczovL2dpdGh1Yi5jb20vdG1wdmFyL2pzZG9tL2Jsb2IvYWE4NWIyYWJmMDc3NjZmZjdiZjVjMWY2ZGFhZmIzNzI2ZjJmMmRiNS9saWIvanNkb20vbGl2aW5nL2Jsb2IuanNcblxuLy8gZml4IGZvciBcIlJlYWRhYmxlXCIgaXNuJ3QgYSBuYW1lZCBleHBvcnQgaXNzdWVcbmNvbnN0IFJlYWRhYmxlID0gU3RyZWFtLlJlYWRhYmxlO1xuXG5jb25zdCBCVUZGRVIgPSBTeW1ib2woJ2J1ZmZlcicpO1xuY29uc3QgVFlQRSA9IFN5bWJvbCgndHlwZScpO1xuXG5jbGFzcyBCbG9iIHtcblx0Y29uc3RydWN0b3IoKSB7XG5cdFx0dGhpc1tUWVBFXSA9ICcnO1xuXG5cdFx0Y29uc3QgYmxvYlBhcnRzID0gYXJndW1lbnRzWzBdO1xuXHRcdGNvbnN0IG9wdGlvbnMgPSBhcmd1bWVudHNbMV07XG5cblx0XHRjb25zdCBidWZmZXJzID0gW107XG5cdFx0bGV0IHNpemUgPSAwO1xuXG5cdFx0aWYgKGJsb2JQYXJ0cykge1xuXHRcdFx0Y29uc3QgYSA9IGJsb2JQYXJ0cztcblx0XHRcdGNvbnN0IGxlbmd0aCA9IE51bWJlcihhLmxlbmd0aCk7XG5cdFx0XHRmb3IgKGxldCBpID0gMDsgaSA8IGxlbmd0aDsgaSsrKSB7XG5cdFx0XHRcdGNvbnN0IGVsZW1lbnQgPSBhW2ldO1xuXHRcdFx0XHRsZXQgYnVmZmVyO1xuXHRcdFx0XHRpZiAoZWxlbWVudCBpbnN0YW5jZW9mIEJ1ZmZlcikge1xuXHRcdFx0XHRcdGJ1ZmZlciA9IGVsZW1lbnQ7XG5cdFx0XHRcdH0gZWxzZSBpZiAoQXJyYXlCdWZmZXIuaXNWaWV3KGVsZW1lbnQpKSB7XG5cdFx0XHRcdFx0YnVmZmVyID0gQnVmZmVyLmZyb20oZWxlbWVudC5idWZmZXIsIGVsZW1lbnQuYnl0ZU9mZnNldCwgZWxlbWVudC5ieXRlTGVuZ3RoKTtcblx0XHRcdFx0fSBlbHNlIGlmIChlbGVtZW50IGluc3RhbmNlb2YgQXJyYXlCdWZmZXIpIHtcblx0XHRcdFx0XHRidWZmZXIgPSBCdWZmZXIuZnJvbShlbGVtZW50KTtcblx0XHRcdFx0fSBlbHNlIGlmIChlbGVtZW50IGluc3RhbmNlb2YgQmxvYikge1xuXHRcdFx0XHRcdGJ1ZmZlciA9IGVsZW1lbnRbQlVGRkVSXTtcblx0XHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0XHRidWZmZXIgPSBCdWZmZXIuZnJvbSh0eXBlb2YgZWxlbWVudCA9PT0gJ3N0cmluZycgPyBlbGVtZW50IDogU3RyaW5nKGVsZW1lbnQpKTtcblx0XHRcdFx0fVxuXHRcdFx0XHRzaXplICs9IGJ1ZmZlci5sZW5ndGg7XG5cdFx0XHRcdGJ1ZmZlcnMucHVzaChidWZmZXIpO1xuXHRcdFx0fVxuXHRcdH1cblxuXHRcdHRoaXNbQlVGRkVSXSA9IEJ1ZmZlci5jb25jYXQoYnVmZmVycyk7XG5cblx0XHRsZXQgdHlwZSA9IG9wdGlvbnMgJiYgb3B0aW9ucy50eXBlICE9PSB1bmRlZmluZWQgJiYgU3RyaW5nKG9wdGlvbnMudHlwZSkudG9Mb3dlckNhc2UoKTtcblx0XHRpZiAodHlwZSAmJiAhL1teXFx1MDAyMC1cXHUwMDdFXS8udGVzdCh0eXBlKSkge1xuXHRcdFx0dGhpc1tUWVBFXSA9IHR5cGU7XG5cdFx0fVxuXHR9XG5cdGdldCBzaXplKCkge1xuXHRcdHJldHVybiB0aGlzW0JVRkZFUl0ubGVuZ3RoO1xuXHR9XG5cdGdldCB0eXBlKCkge1xuXHRcdHJldHVybiB0aGlzW1RZUEVdO1xuXHR9XG5cdHRleHQoKSB7XG5cdFx0cmV0dXJuIFByb21pc2UucmVzb2x2ZSh0aGlzW0JVRkZFUl0udG9TdHJpbmcoKSk7XG5cdH1cblx0YXJyYXlCdWZmZXIoKSB7XG5cdFx0Y29uc3QgYnVmID0gdGhpc1tCVUZGRVJdO1xuXHRcdGNvbnN0IGFiID0gYnVmLmJ1ZmZlci5zbGljZShidWYuYnl0ZU9mZnNldCwgYnVmLmJ5dGVPZmZzZXQgKyBidWYuYnl0ZUxlbmd0aCk7XG5cdFx0cmV0dXJuIFByb21pc2UucmVzb2x2ZShhYik7XG5cdH1cblx0c3RyZWFtKCkge1xuXHRcdGNvbnN0IHJlYWRhYmxlID0gbmV3IFJlYWRhYmxlKCk7XG5cdFx0cmVhZGFibGUuX3JlYWQgPSBmdW5jdGlvbiAoKSB7fTtcblx0XHRyZWFkYWJsZS5wdXNoKHRoaXNbQlVGRkVSXSk7XG5cdFx0cmVhZGFibGUucHVzaChudWxsKTtcblx0XHRyZXR1cm4gcmVhZGFibGU7XG5cdH1cblx0dG9TdHJpbmcoKSB7XG5cdFx0cmV0dXJuICdbb2JqZWN0IEJsb2JdJztcblx0fVxuXHRzbGljZSgpIHtcblx0XHRjb25zdCBzaXplID0gdGhpcy5zaXplO1xuXG5cdFx0Y29uc3Qgc3RhcnQgPSBhcmd1bWVudHNbMF07XG5cdFx0Y29uc3QgZW5kID0gYXJndW1lbnRzWzFdO1xuXHRcdGxldCByZWxhdGl2ZVN0YXJ0LCByZWxhdGl2ZUVuZDtcblx0XHRpZiAoc3RhcnQgPT09IHVuZGVmaW5lZCkge1xuXHRcdFx0cmVsYXRpdmVTdGFydCA9IDA7XG5cdFx0fSBlbHNlIGlmIChzdGFydCA8IDApIHtcblx0XHRcdHJlbGF0aXZlU3RhcnQgPSBNYXRoLm1heChzaXplICsgc3RhcnQsIDApO1xuXHRcdH0gZWxzZSB7XG5cdFx0XHRyZWxhdGl2ZVN0YXJ0ID0gTWF0aC5taW4oc3RhcnQsIHNpemUpO1xuXHRcdH1cblx0XHRpZiAoZW5kID09PSB1bmRlZmluZWQpIHtcblx0XHRcdHJlbGF0aXZlRW5kID0gc2l6ZTtcblx0XHR9IGVsc2UgaWYgKGVuZCA8IDApIHtcblx0XHRcdHJlbGF0aXZlRW5kID0gTWF0aC5tYXgoc2l6ZSArIGVuZCwgMCk7XG5cdFx0fSBlbHNlIHtcblx0XHRcdHJlbGF0aXZlRW5kID0gTWF0aC5taW4oZW5kLCBzaXplKTtcblx0XHR9XG5cdFx0Y29uc3Qgc3BhbiA9IE1hdGgubWF4KHJlbGF0aXZlRW5kIC0gcmVsYXRpdmVTdGFydCwgMCk7XG5cblx0XHRjb25zdCBidWZmZXIgPSB0aGlzW0JVRkZFUl07XG5cdFx0Y29uc3Qgc2xpY2VkQnVmZmVyID0gYnVmZmVyLnNsaWNlKHJlbGF0aXZlU3RhcnQsIHJlbGF0aXZlU3RhcnQgKyBzcGFuKTtcblx0XHRjb25zdCBibG9iID0gbmV3IEJsb2IoW10sIHsgdHlwZTogYXJndW1lbnRzWzJdIH0pO1xuXHRcdGJsb2JbQlVGRkVSXSA9IHNsaWNlZEJ1ZmZlcjtcblx0XHRyZXR1cm4gYmxvYjtcblx0fVxufVxuXG5PYmplY3QuZGVmaW5lUHJvcGVydGllcyhCbG9iLnByb3RvdHlwZSwge1xuXHRzaXplOiB7IGVudW1lcmFibGU6IHRydWUgfSxcblx0dHlwZTogeyBlbnVtZXJhYmxlOiB0cnVlIH0sXG5cdHNsaWNlOiB7IGVudW1lcmFibGU6IHRydWUgfVxufSk7XG5cbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShCbG9iLnByb3RvdHlwZSwgU3ltYm9sLnRvU3RyaW5nVGFnLCB7XG5cdHZhbHVlOiAnQmxvYicsXG5cdHdyaXRhYmxlOiBmYWxzZSxcblx0ZW51bWVyYWJsZTogZmFsc2UsXG5cdGNvbmZpZ3VyYWJsZTogdHJ1ZVxufSk7XG5cbi8qKlxuICogZmV0Y2gtZXJyb3IuanNcbiAqXG4gKiBGZXRjaEVycm9yIGludGVyZmFjZSBmb3Igb3BlcmF0aW9uYWwgZXJyb3JzXG4gKi9cblxuLyoqXG4gKiBDcmVhdGUgRmV0Y2hFcnJvciBpbnN0YW5jZVxuICpcbiAqIEBwYXJhbSAgIFN0cmluZyAgICAgIG1lc3NhZ2UgICAgICBFcnJvciBtZXNzYWdlIGZvciBodW1hblxuICogQHBhcmFtICAgU3RyaW5nICAgICAgdHlwZSAgICAgICAgIEVycm9yIHR5cGUgZm9yIG1hY2hpbmVcbiAqIEBwYXJhbSAgIFN0cmluZyAgICAgIHN5c3RlbUVycm9yICBGb3IgTm9kZS5qcyBzeXN0ZW0gZXJyb3JcbiAqIEByZXR1cm4gIEZldGNoRXJyb3JcbiAqL1xuZnVuY3Rpb24gRmV0Y2hFcnJvcihtZXNzYWdlLCB0eXBlLCBzeXN0ZW1FcnJvcikge1xuICBFcnJvci5jYWxsKHRoaXMsIG1lc3NhZ2UpO1xuXG4gIHRoaXMubWVzc2FnZSA9IG1lc3NhZ2U7XG4gIHRoaXMudHlwZSA9IHR5cGU7XG5cbiAgLy8gd2hlbiBlcnIudHlwZSBpcyBgc3lzdGVtYCwgZXJyLmNvZGUgY29udGFpbnMgc3lzdGVtIGVycm9yIGNvZGVcbiAgaWYgKHN5c3RlbUVycm9yKSB7XG4gICAgdGhpcy5jb2RlID0gdGhpcy5lcnJubyA9IHN5c3RlbUVycm9yLmNvZGU7XG4gIH1cblxuICAvLyBoaWRlIGN1c3RvbSBlcnJvciBpbXBsZW1lbnRhdGlvbiBkZXRhaWxzIGZyb20gZW5kLXVzZXJzXG4gIEVycm9yLmNhcHR1cmVTdGFja1RyYWNlKHRoaXMsIHRoaXMuY29uc3RydWN0b3IpO1xufVxuXG5GZXRjaEVycm9yLnByb3RvdHlwZSA9IE9iamVjdC5jcmVhdGUoRXJyb3IucHJvdG90eXBlKTtcbkZldGNoRXJyb3IucHJvdG90eXBlLmNvbnN0cnVjdG9yID0gRmV0Y2hFcnJvcjtcbkZldGNoRXJyb3IucHJvdG90eXBlLm5hbWUgPSAnRmV0Y2hFcnJvcic7XG5cbmxldCBjb252ZXJ0O1xudHJ5IHtcblx0Y29udmVydCA9IHJlcXVpcmUoJ2VuY29kaW5nJykuY29udmVydDtcbn0gY2F0Y2ggKGUpIHt9XG5cbmNvbnN0IElOVEVSTkFMUyA9IFN5bWJvbCgnQm9keSBpbnRlcm5hbHMnKTtcblxuLy8gZml4IGFuIGlzc3VlIHdoZXJlIFwiUGFzc1Rocm91Z2hcIiBpc24ndCBhIG5hbWVkIGV4cG9ydCBmb3Igbm9kZSA8MTBcbmNvbnN0IFBhc3NUaHJvdWdoID0gU3RyZWFtLlBhc3NUaHJvdWdoO1xuXG4vKipcbiAqIEJvZHkgbWl4aW5cbiAqXG4gKiBSZWY6IGh0dHBzOi8vZmV0Y2guc3BlYy53aGF0d2cub3JnLyNib2R5XG4gKlxuICogQHBhcmFtICAgU3RyZWFtICBib2R5ICBSZWFkYWJsZSBzdHJlYW1cbiAqIEBwYXJhbSAgIE9iamVjdCAgb3B0cyAgUmVzcG9uc2Ugb3B0aW9uc1xuICogQHJldHVybiAgVm9pZFxuICovXG5mdW5jdGlvbiBCb2R5KGJvZHkpIHtcblx0dmFyIF90aGlzID0gdGhpcztcblxuXHR2YXIgX3JlZiA9IGFyZ3VtZW50cy5sZW5ndGggPiAxICYmIGFyZ3VtZW50c1sxXSAhPT0gdW5kZWZpbmVkID8gYXJndW1lbnRzWzFdIDoge30sXG5cdCAgICBfcmVmJHNpemUgPSBfcmVmLnNpemU7XG5cblx0bGV0IHNpemUgPSBfcmVmJHNpemUgPT09IHVuZGVmaW5lZCA/IDAgOiBfcmVmJHNpemU7XG5cdHZhciBfcmVmJHRpbWVvdXQgPSBfcmVmLnRpbWVvdXQ7XG5cdGxldCB0aW1lb3V0ID0gX3JlZiR0aW1lb3V0ID09PSB1bmRlZmluZWQgPyAwIDogX3JlZiR0aW1lb3V0O1xuXG5cdGlmIChib2R5ID09IG51bGwpIHtcblx0XHQvLyBib2R5IGlzIHVuZGVmaW5lZCBvciBudWxsXG5cdFx0Ym9keSA9IG51bGw7XG5cdH0gZWxzZSBpZiAoaXNVUkxTZWFyY2hQYXJhbXMoYm9keSkpIHtcblx0XHQvLyBib2R5IGlzIGEgVVJMU2VhcmNoUGFyYW1zXG5cdFx0Ym9keSA9IEJ1ZmZlci5mcm9tKGJvZHkudG9TdHJpbmcoKSk7XG5cdH0gZWxzZSBpZiAoaXNCbG9iKGJvZHkpKSA7IGVsc2UgaWYgKEJ1ZmZlci5pc0J1ZmZlcihib2R5KSkgOyBlbHNlIGlmIChPYmplY3QucHJvdG90eXBlLnRvU3RyaW5nLmNhbGwoYm9keSkgPT09ICdbb2JqZWN0IEFycmF5QnVmZmVyXScpIHtcblx0XHQvLyBib2R5IGlzIEFycmF5QnVmZmVyXG5cdFx0Ym9keSA9IEJ1ZmZlci5mcm9tKGJvZHkpO1xuXHR9IGVsc2UgaWYgKEFycmF5QnVmZmVyLmlzVmlldyhib2R5KSkge1xuXHRcdC8vIGJvZHkgaXMgQXJyYXlCdWZmZXJWaWV3XG5cdFx0Ym9keSA9IEJ1ZmZlci5mcm9tKGJvZHkuYnVmZmVyLCBib2R5LmJ5dGVPZmZzZXQsIGJvZHkuYnl0ZUxlbmd0aCk7XG5cdH0gZWxzZSBpZiAoYm9keSBpbnN0YW5jZW9mIFN0cmVhbSkgOyBlbHNlIHtcblx0XHQvLyBub25lIG9mIHRoZSBhYm92ZVxuXHRcdC8vIGNvZXJjZSB0byBzdHJpbmcgdGhlbiBidWZmZXJcblx0XHRib2R5ID0gQnVmZmVyLmZyb20oU3RyaW5nKGJvZHkpKTtcblx0fVxuXHR0aGlzW0lOVEVSTkFMU10gPSB7XG5cdFx0Ym9keSxcblx0XHRkaXN0dXJiZWQ6IGZhbHNlLFxuXHRcdGVycm9yOiBudWxsXG5cdH07XG5cdHRoaXMuc2l6ZSA9IHNpemU7XG5cdHRoaXMudGltZW91dCA9IHRpbWVvdXQ7XG5cblx0aWYgKGJvZHkgaW5zdGFuY2VvZiBTdHJlYW0pIHtcblx0XHRib2R5Lm9uKCdlcnJvcicsIGZ1bmN0aW9uIChlcnIpIHtcblx0XHRcdGNvbnN0IGVycm9yID0gZXJyLm5hbWUgPT09ICdBYm9ydEVycm9yJyA/IGVyciA6IG5ldyBGZXRjaEVycm9yKGBJbnZhbGlkIHJlc3BvbnNlIGJvZHkgd2hpbGUgdHJ5aW5nIHRvIGZldGNoICR7X3RoaXMudXJsfTogJHtlcnIubWVzc2FnZX1gLCAnc3lzdGVtJywgZXJyKTtcblx0XHRcdF90aGlzW0lOVEVSTkFMU10uZXJyb3IgPSBlcnJvcjtcblx0XHR9KTtcblx0fVxufVxuXG5Cb2R5LnByb3RvdHlwZSA9IHtcblx0Z2V0IGJvZHkoKSB7XG5cdFx0cmV0dXJuIHRoaXNbSU5URVJOQUxTXS5ib2R5O1xuXHR9LFxuXG5cdGdldCBib2R5VXNlZCgpIHtcblx0XHRyZXR1cm4gdGhpc1tJTlRFUk5BTFNdLmRpc3R1cmJlZDtcblx0fSxcblxuXHQvKipcbiAgKiBEZWNvZGUgcmVzcG9uc2UgYXMgQXJyYXlCdWZmZXJcbiAgKlxuICAqIEByZXR1cm4gIFByb21pc2VcbiAgKi9cblx0YXJyYXlCdWZmZXIoKSB7XG5cdFx0cmV0dXJuIGNvbnN1bWVCb2R5LmNhbGwodGhpcykudGhlbihmdW5jdGlvbiAoYnVmKSB7XG5cdFx0XHRyZXR1cm4gYnVmLmJ1ZmZlci5zbGljZShidWYuYnl0ZU9mZnNldCwgYnVmLmJ5dGVPZmZzZXQgKyBidWYuYnl0ZUxlbmd0aCk7XG5cdFx0fSk7XG5cdH0sXG5cblx0LyoqXG4gICogUmV0dXJuIHJhdyByZXNwb25zZSBhcyBCbG9iXG4gICpcbiAgKiBAcmV0dXJuIFByb21pc2VcbiAgKi9cblx0YmxvYigpIHtcblx0XHRsZXQgY3QgPSB0aGlzLmhlYWRlcnMgJiYgdGhpcy5oZWFkZXJzLmdldCgnY29udGVudC10eXBlJykgfHwgJyc7XG5cdFx0cmV0dXJuIGNvbnN1bWVCb2R5LmNhbGwodGhpcykudGhlbihmdW5jdGlvbiAoYnVmKSB7XG5cdFx0XHRyZXR1cm4gT2JqZWN0LmFzc2lnbihcblx0XHRcdC8vIFByZXZlbnQgY29weWluZ1xuXHRcdFx0bmV3IEJsb2IoW10sIHtcblx0XHRcdFx0dHlwZTogY3QudG9Mb3dlckNhc2UoKVxuXHRcdFx0fSksIHtcblx0XHRcdFx0W0JVRkZFUl06IGJ1ZlxuXHRcdFx0fSk7XG5cdFx0fSk7XG5cdH0sXG5cblx0LyoqXG4gICogRGVjb2RlIHJlc3BvbnNlIGFzIGpzb25cbiAgKlxuICAqIEByZXR1cm4gIFByb21pc2VcbiAgKi9cblx0anNvbigpIHtcblx0XHR2YXIgX3RoaXMyID0gdGhpcztcblxuXHRcdHJldHVybiBjb25zdW1lQm9keS5jYWxsKHRoaXMpLnRoZW4oZnVuY3Rpb24gKGJ1ZmZlcikge1xuXHRcdFx0dHJ5IHtcblx0XHRcdFx0cmV0dXJuIEpTT04ucGFyc2UoYnVmZmVyLnRvU3RyaW5nKCkpO1xuXHRcdFx0fSBjYXRjaCAoZXJyKSB7XG5cdFx0XHRcdHJldHVybiBCb2R5LlByb21pc2UucmVqZWN0KG5ldyBGZXRjaEVycm9yKGBpbnZhbGlkIGpzb24gcmVzcG9uc2UgYm9keSBhdCAke190aGlzMi51cmx9IHJlYXNvbjogJHtlcnIubWVzc2FnZX1gLCAnaW52YWxpZC1qc29uJykpO1xuXHRcdFx0fVxuXHRcdH0pO1xuXHR9LFxuXG5cdC8qKlxuICAqIERlY29kZSByZXNwb25zZSBhcyB0ZXh0XG4gICpcbiAgKiBAcmV0dXJuICBQcm9taXNlXG4gICovXG5cdHRleHQoKSB7XG5cdFx0cmV0dXJuIGNvbnN1bWVCb2R5LmNhbGwodGhpcykudGhlbihmdW5jdGlvbiAoYnVmZmVyKSB7XG5cdFx0XHRyZXR1cm4gYnVmZmVyLnRvU3RyaW5nKCk7XG5cdFx0fSk7XG5cdH0sXG5cblx0LyoqXG4gICogRGVjb2RlIHJlc3BvbnNlIGFzIGJ1ZmZlciAobm9uLXNwZWMgYXBpKVxuICAqXG4gICogQHJldHVybiAgUHJvbWlzZVxuICAqL1xuXHRidWZmZXIoKSB7XG5cdFx0cmV0dXJuIGNvbnN1bWVCb2R5LmNhbGwodGhpcyk7XG5cdH0sXG5cblx0LyoqXG4gICogRGVjb2RlIHJlc3BvbnNlIGFzIHRleHQsIHdoaWxlIGF1dG9tYXRpY2FsbHkgZGV0ZWN0aW5nIHRoZSBlbmNvZGluZyBhbmRcbiAgKiB0cnlpbmcgdG8gZGVjb2RlIHRvIFVURi04IChub24tc3BlYyBhcGkpXG4gICpcbiAgKiBAcmV0dXJuICBQcm9taXNlXG4gICovXG5cdHRleHRDb252ZXJ0ZWQoKSB7XG5cdFx0dmFyIF90aGlzMyA9IHRoaXM7XG5cblx0XHRyZXR1cm4gY29uc3VtZUJvZHkuY2FsbCh0aGlzKS50aGVuKGZ1bmN0aW9uIChidWZmZXIpIHtcblx0XHRcdHJldHVybiBjb252ZXJ0Qm9keShidWZmZXIsIF90aGlzMy5oZWFkZXJzKTtcblx0XHR9KTtcblx0fVxufTtcblxuLy8gSW4gYnJvd3NlcnMsIGFsbCBwcm9wZXJ0aWVzIGFyZSBlbnVtZXJhYmxlLlxuT2JqZWN0LmRlZmluZVByb3BlcnRpZXMoQm9keS5wcm90b3R5cGUsIHtcblx0Ym9keTogeyBlbnVtZXJhYmxlOiB0cnVlIH0sXG5cdGJvZHlVc2VkOiB7IGVudW1lcmFibGU6IHRydWUgfSxcblx0YXJyYXlCdWZmZXI6IHsgZW51bWVyYWJsZTogdHJ1ZSB9LFxuXHRibG9iOiB7IGVudW1lcmFibGU6IHRydWUgfSxcblx0anNvbjogeyBlbnVtZXJhYmxlOiB0cnVlIH0sXG5cdHRleHQ6IHsgZW51bWVyYWJsZTogdHJ1ZSB9XG59KTtcblxuQm9keS5taXhJbiA9IGZ1bmN0aW9uIChwcm90bykge1xuXHRmb3IgKGNvbnN0IG5hbWUgb2YgT2JqZWN0LmdldE93blByb3BlcnR5TmFtZXMoQm9keS5wcm90b3R5cGUpKSB7XG5cdFx0Ly8gaXN0YW5idWwgaWdub3JlIGVsc2U6IGZ1dHVyZSBwcm9vZlxuXHRcdGlmICghKG5hbWUgaW4gcHJvdG8pKSB7XG5cdFx0XHRjb25zdCBkZXNjID0gT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcihCb2R5LnByb3RvdHlwZSwgbmFtZSk7XG5cdFx0XHRPYmplY3QuZGVmaW5lUHJvcGVydHkocHJvdG8sIG5hbWUsIGRlc2MpO1xuXHRcdH1cblx0fVxufTtcblxuLyoqXG4gKiBDb25zdW1lIGFuZCBjb252ZXJ0IGFuIGVudGlyZSBCb2R5IHRvIGEgQnVmZmVyLlxuICpcbiAqIFJlZjogaHR0cHM6Ly9mZXRjaC5zcGVjLndoYXR3Zy5vcmcvI2NvbmNlcHQtYm9keS1jb25zdW1lLWJvZHlcbiAqXG4gKiBAcmV0dXJuICBQcm9taXNlXG4gKi9cbmZ1bmN0aW9uIGNvbnN1bWVCb2R5KCkge1xuXHR2YXIgX3RoaXM0ID0gdGhpcztcblxuXHRpZiAodGhpc1tJTlRFUk5BTFNdLmRpc3R1cmJlZCkge1xuXHRcdHJldHVybiBCb2R5LlByb21pc2UucmVqZWN0KG5ldyBUeXBlRXJyb3IoYGJvZHkgdXNlZCBhbHJlYWR5IGZvcjogJHt0aGlzLnVybH1gKSk7XG5cdH1cblxuXHR0aGlzW0lOVEVSTkFMU10uZGlzdHVyYmVkID0gdHJ1ZTtcblxuXHRpZiAodGhpc1tJTlRFUk5BTFNdLmVycm9yKSB7XG5cdFx0cmV0dXJuIEJvZHkuUHJvbWlzZS5yZWplY3QodGhpc1tJTlRFUk5BTFNdLmVycm9yKTtcblx0fVxuXG5cdGxldCBib2R5ID0gdGhpcy5ib2R5O1xuXG5cdC8vIGJvZHkgaXMgbnVsbFxuXHRpZiAoYm9keSA9PT0gbnVsbCkge1xuXHRcdHJldHVybiBCb2R5LlByb21pc2UucmVzb2x2ZShCdWZmZXIuYWxsb2MoMCkpO1xuXHR9XG5cblx0Ly8gYm9keSBpcyBibG9iXG5cdGlmIChpc0Jsb2IoYm9keSkpIHtcblx0XHRib2R5ID0gYm9keS5zdHJlYW0oKTtcblx0fVxuXG5cdC8vIGJvZHkgaXMgYnVmZmVyXG5cdGlmIChCdWZmZXIuaXNCdWZmZXIoYm9keSkpIHtcblx0XHRyZXR1cm4gQm9keS5Qcm9taXNlLnJlc29sdmUoYm9keSk7XG5cdH1cblxuXHQvLyBpc3RhbmJ1bCBpZ25vcmUgaWY6IHNob3VsZCBuZXZlciBoYXBwZW5cblx0aWYgKCEoYm9keSBpbnN0YW5jZW9mIFN0cmVhbSkpIHtcblx0XHRyZXR1cm4gQm9keS5Qcm9taXNlLnJlc29sdmUoQnVmZmVyLmFsbG9jKDApKTtcblx0fVxuXG5cdC8vIGJvZHkgaXMgc3RyZWFtXG5cdC8vIGdldCByZWFkeSB0byBhY3R1YWxseSBjb25zdW1lIHRoZSBib2R5XG5cdGxldCBhY2N1bSA9IFtdO1xuXHRsZXQgYWNjdW1CeXRlcyA9IDA7XG5cdGxldCBhYm9ydCA9IGZhbHNlO1xuXG5cdHJldHVybiBuZXcgQm9keS5Qcm9taXNlKGZ1bmN0aW9uIChyZXNvbHZlLCByZWplY3QpIHtcblx0XHRsZXQgcmVzVGltZW91dDtcblxuXHRcdC8vIGFsbG93IHRpbWVvdXQgb24gc2xvdyByZXNwb25zZSBib2R5XG5cdFx0aWYgKF90aGlzNC50aW1lb3V0KSB7XG5cdFx0XHRyZXNUaW1lb3V0ID0gc2V0VGltZW91dChmdW5jdGlvbiAoKSB7XG5cdFx0XHRcdGFib3J0ID0gdHJ1ZTtcblx0XHRcdFx0cmVqZWN0KG5ldyBGZXRjaEVycm9yKGBSZXNwb25zZSB0aW1lb3V0IHdoaWxlIHRyeWluZyB0byBmZXRjaCAke190aGlzNC51cmx9IChvdmVyICR7X3RoaXM0LnRpbWVvdXR9bXMpYCwgJ2JvZHktdGltZW91dCcpKTtcblx0XHRcdH0sIF90aGlzNC50aW1lb3V0KTtcblx0XHR9XG5cblx0XHQvLyBoYW5kbGUgc3RyZWFtIGVycm9yc1xuXHRcdGJvZHkub24oJ2Vycm9yJywgZnVuY3Rpb24gKGVycikge1xuXHRcdFx0aWYgKGVyci5uYW1lID09PSAnQWJvcnRFcnJvcicpIHtcblx0XHRcdFx0Ly8gaWYgdGhlIHJlcXVlc3Qgd2FzIGFib3J0ZWQsIHJlamVjdCB3aXRoIHRoaXMgRXJyb3Jcblx0XHRcdFx0YWJvcnQgPSB0cnVlO1xuXHRcdFx0XHRyZWplY3QoZXJyKTtcblx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdC8vIG90aGVyIGVycm9ycywgc3VjaCBhcyBpbmNvcnJlY3QgY29udGVudC1lbmNvZGluZ1xuXHRcdFx0XHRyZWplY3QobmV3IEZldGNoRXJyb3IoYEludmFsaWQgcmVzcG9uc2UgYm9keSB3aGlsZSB0cnlpbmcgdG8gZmV0Y2ggJHtfdGhpczQudXJsfTogJHtlcnIubWVzc2FnZX1gLCAnc3lzdGVtJywgZXJyKSk7XG5cdFx0XHR9XG5cdFx0fSk7XG5cblx0XHRib2R5Lm9uKCdkYXRhJywgZnVuY3Rpb24gKGNodW5rKSB7XG5cdFx0XHRpZiAoYWJvcnQgfHwgY2h1bmsgPT09IG51bGwpIHtcblx0XHRcdFx0cmV0dXJuO1xuXHRcdFx0fVxuXG5cdFx0XHRpZiAoX3RoaXM0LnNpemUgJiYgYWNjdW1CeXRlcyArIGNodW5rLmxlbmd0aCA+IF90aGlzNC5zaXplKSB7XG5cdFx0XHRcdGFib3J0ID0gdHJ1ZTtcblx0XHRcdFx0cmVqZWN0KG5ldyBGZXRjaEVycm9yKGBjb250ZW50IHNpemUgYXQgJHtfdGhpczQudXJsfSBvdmVyIGxpbWl0OiAke190aGlzNC5zaXplfWAsICdtYXgtc2l6ZScpKTtcblx0XHRcdFx0cmV0dXJuO1xuXHRcdFx0fVxuXG5cdFx0XHRhY2N1bUJ5dGVzICs9IGNodW5rLmxlbmd0aDtcblx0XHRcdGFjY3VtLnB1c2goY2h1bmspO1xuXHRcdH0pO1xuXG5cdFx0Ym9keS5vbignZW5kJywgZnVuY3Rpb24gKCkge1xuXHRcdFx0aWYgKGFib3J0KSB7XG5cdFx0XHRcdHJldHVybjtcblx0XHRcdH1cblxuXHRcdFx0Y2xlYXJUaW1lb3V0KHJlc1RpbWVvdXQpO1xuXG5cdFx0XHR0cnkge1xuXHRcdFx0XHRyZXNvbHZlKEJ1ZmZlci5jb25jYXQoYWNjdW0sIGFjY3VtQnl0ZXMpKTtcblx0XHRcdH0gY2F0Y2ggKGVycikge1xuXHRcdFx0XHQvLyBoYW5kbGUgc3RyZWFtcyB0aGF0IGhhdmUgYWNjdW11bGF0ZWQgdG9vIG11Y2ggZGF0YSAoaXNzdWUgIzQxNClcblx0XHRcdFx0cmVqZWN0KG5ldyBGZXRjaEVycm9yKGBDb3VsZCBub3QgY3JlYXRlIEJ1ZmZlciBmcm9tIHJlc3BvbnNlIGJvZHkgZm9yICR7X3RoaXM0LnVybH06ICR7ZXJyLm1lc3NhZ2V9YCwgJ3N5c3RlbScsIGVycikpO1xuXHRcdFx0fVxuXHRcdH0pO1xuXHR9KTtcbn1cblxuLyoqXG4gKiBEZXRlY3QgYnVmZmVyIGVuY29kaW5nIGFuZCBjb252ZXJ0IHRvIHRhcmdldCBlbmNvZGluZ1xuICogcmVmOiBodHRwOi8vd3d3LnczLm9yZy9UUi8yMDExL1dELWh0bWw1LTIwMTEwMTEzL3BhcnNpbmcuaHRtbCNkZXRlcm1pbmluZy10aGUtY2hhcmFjdGVyLWVuY29kaW5nXG4gKlxuICogQHBhcmFtICAgQnVmZmVyICBidWZmZXIgICAgSW5jb21pbmcgYnVmZmVyXG4gKiBAcGFyYW0gICBTdHJpbmcgIGVuY29kaW5nICBUYXJnZXQgZW5jb2RpbmdcbiAqIEByZXR1cm4gIFN0cmluZ1xuICovXG5mdW5jdGlvbiBjb252ZXJ0Qm9keShidWZmZXIsIGhlYWRlcnMpIHtcblx0aWYgKHR5cGVvZiBjb252ZXJ0ICE9PSAnZnVuY3Rpb24nKSB7XG5cdFx0dGhyb3cgbmV3IEVycm9yKCdUaGUgcGFja2FnZSBgZW5jb2RpbmdgIG11c3QgYmUgaW5zdGFsbGVkIHRvIHVzZSB0aGUgdGV4dENvbnZlcnRlZCgpIGZ1bmN0aW9uJyk7XG5cdH1cblxuXHRjb25zdCBjdCA9IGhlYWRlcnMuZ2V0KCdjb250ZW50LXR5cGUnKTtcblx0bGV0IGNoYXJzZXQgPSAndXRmLTgnO1xuXHRsZXQgcmVzLCBzdHI7XG5cblx0Ly8gaGVhZGVyXG5cdGlmIChjdCkge1xuXHRcdHJlcyA9IC9jaGFyc2V0PShbXjtdKikvaS5leGVjKGN0KTtcblx0fVxuXG5cdC8vIG5vIGNoYXJzZXQgaW4gY29udGVudCB0eXBlLCBwZWVrIGF0IHJlc3BvbnNlIGJvZHkgZm9yIGF0IG1vc3QgMTAyNCBieXRlc1xuXHRzdHIgPSBidWZmZXIuc2xpY2UoMCwgMTAyNCkudG9TdHJpbmcoKTtcblxuXHQvLyBodG1sNVxuXHRpZiAoIXJlcyAmJiBzdHIpIHtcblx0XHRyZXMgPSAvPG1ldGEuKz9jaGFyc2V0PShbJ1wiXSkoLis/KVxcMS9pLmV4ZWMoc3RyKTtcblx0fVxuXG5cdC8vIGh0bWw0XG5cdGlmICghcmVzICYmIHN0cikge1xuXHRcdHJlcyA9IC88bWV0YVtcXHNdKz9odHRwLWVxdWl2PShbJ1wiXSljb250ZW50LXR5cGVcXDFbXFxzXSs/Y29udGVudD0oWydcIl0pKC4rPylcXDIvaS5leGVjKHN0cik7XG5cdFx0aWYgKCFyZXMpIHtcblx0XHRcdHJlcyA9IC88bWV0YVtcXHNdKz9jb250ZW50PShbJ1wiXSkoLis/KVxcMVtcXHNdKz9odHRwLWVxdWl2PShbJ1wiXSljb250ZW50LXR5cGVcXDMvaS5leGVjKHN0cik7XG5cdFx0XHRpZiAocmVzKSB7XG5cdFx0XHRcdHJlcy5wb3AoKTsgLy8gZHJvcCBsYXN0IHF1b3RlXG5cdFx0XHR9XG5cdFx0fVxuXG5cdFx0aWYgKHJlcykge1xuXHRcdFx0cmVzID0gL2NoYXJzZXQ9KC4qKS9pLmV4ZWMocmVzLnBvcCgpKTtcblx0XHR9XG5cdH1cblxuXHQvLyB4bWxcblx0aWYgKCFyZXMgJiYgc3RyKSB7XG5cdFx0cmVzID0gLzxcXD94bWwuKz9lbmNvZGluZz0oWydcIl0pKC4rPylcXDEvaS5leGVjKHN0cik7XG5cdH1cblxuXHQvLyBmb3VuZCBjaGFyc2V0XG5cdGlmIChyZXMpIHtcblx0XHRjaGFyc2V0ID0gcmVzLnBvcCgpO1xuXG5cdFx0Ly8gcHJldmVudCBkZWNvZGUgaXNzdWVzIHdoZW4gc2l0ZXMgdXNlIGluY29ycmVjdCBlbmNvZGluZ1xuXHRcdC8vIHJlZjogaHR0cHM6Ly9oc2l2b25lbi5maS9lbmNvZGluZy1tZW51L1xuXHRcdGlmIChjaGFyc2V0ID09PSAnZ2IyMzEyJyB8fCBjaGFyc2V0ID09PSAnZ2JrJykge1xuXHRcdFx0Y2hhcnNldCA9ICdnYjE4MDMwJztcblx0XHR9XG5cdH1cblxuXHQvLyB0dXJuIHJhdyBidWZmZXJzIGludG8gYSBzaW5nbGUgdXRmLTggYnVmZmVyXG5cdHJldHVybiBjb252ZXJ0KGJ1ZmZlciwgJ1VURi04JywgY2hhcnNldCkudG9TdHJpbmcoKTtcbn1cblxuLyoqXG4gKiBEZXRlY3QgYSBVUkxTZWFyY2hQYXJhbXMgb2JqZWN0XG4gKiByZWY6IGh0dHBzOi8vZ2l0aHViLmNvbS9iaXRpbm4vbm9kZS1mZXRjaC9pc3N1ZXMvMjk2I2lzc3VlY29tbWVudC0zMDc1OTgxNDNcbiAqXG4gKiBAcGFyYW0gICBPYmplY3QgIG9iaiAgICAgT2JqZWN0IHRvIGRldGVjdCBieSB0eXBlIG9yIGJyYW5kXG4gKiBAcmV0dXJuICBTdHJpbmdcbiAqL1xuZnVuY3Rpb24gaXNVUkxTZWFyY2hQYXJhbXMob2JqKSB7XG5cdC8vIER1Y2stdHlwaW5nIGFzIGEgbmVjZXNzYXJ5IGNvbmRpdGlvbi5cblx0aWYgKHR5cGVvZiBvYmogIT09ICdvYmplY3QnIHx8IHR5cGVvZiBvYmouYXBwZW5kICE9PSAnZnVuY3Rpb24nIHx8IHR5cGVvZiBvYmouZGVsZXRlICE9PSAnZnVuY3Rpb24nIHx8IHR5cGVvZiBvYmouZ2V0ICE9PSAnZnVuY3Rpb24nIHx8IHR5cGVvZiBvYmouZ2V0QWxsICE9PSAnZnVuY3Rpb24nIHx8IHR5cGVvZiBvYmouaGFzICE9PSAnZnVuY3Rpb24nIHx8IHR5cGVvZiBvYmouc2V0ICE9PSAnZnVuY3Rpb24nKSB7XG5cdFx0cmV0dXJuIGZhbHNlO1xuXHR9XG5cblx0Ly8gQnJhbmQtY2hlY2tpbmcgYW5kIG1vcmUgZHVjay10eXBpbmcgYXMgb3B0aW9uYWwgY29uZGl0aW9uLlxuXHRyZXR1cm4gb2JqLmNvbnN0cnVjdG9yLm5hbWUgPT09ICdVUkxTZWFyY2hQYXJhbXMnIHx8IE9iamVjdC5wcm90b3R5cGUudG9TdHJpbmcuY2FsbChvYmopID09PSAnW29iamVjdCBVUkxTZWFyY2hQYXJhbXNdJyB8fCB0eXBlb2Ygb2JqLnNvcnQgPT09ICdmdW5jdGlvbic7XG59XG5cbi8qKlxuICogQ2hlY2sgaWYgYG9iamAgaXMgYSBXM0MgYEJsb2JgIG9iamVjdCAod2hpY2ggYEZpbGVgIGluaGVyaXRzIGZyb20pXG4gKiBAcGFyYW0gIHsqfSBvYmpcbiAqIEByZXR1cm4ge2Jvb2xlYW59XG4gKi9cbmZ1bmN0aW9uIGlzQmxvYihvYmopIHtcblx0cmV0dXJuIHR5cGVvZiBvYmogPT09ICdvYmplY3QnICYmIHR5cGVvZiBvYmouYXJyYXlCdWZmZXIgPT09ICdmdW5jdGlvbicgJiYgdHlwZW9mIG9iai50eXBlID09PSAnc3RyaW5nJyAmJiB0eXBlb2Ygb2JqLnN0cmVhbSA9PT0gJ2Z1bmN0aW9uJyAmJiB0eXBlb2Ygb2JqLmNvbnN0cnVjdG9yID09PSAnZnVuY3Rpb24nICYmIHR5cGVvZiBvYmouY29uc3RydWN0b3IubmFtZSA9PT0gJ3N0cmluZycgJiYgL14oQmxvYnxGaWxlKSQvLnRlc3Qob2JqLmNvbnN0cnVjdG9yLm5hbWUpICYmIC9eKEJsb2J8RmlsZSkkLy50ZXN0KG9ialtTeW1ib2wudG9TdHJpbmdUYWddKTtcbn1cblxuLyoqXG4gKiBDbG9uZSBib2R5IGdpdmVuIFJlcy9SZXEgaW5zdGFuY2VcbiAqXG4gKiBAcGFyYW0gICBNaXhlZCAgaW5zdGFuY2UgIFJlc3BvbnNlIG9yIFJlcXVlc3QgaW5zdGFuY2VcbiAqIEByZXR1cm4gIE1peGVkXG4gKi9cbmZ1bmN0aW9uIGNsb25lKGluc3RhbmNlKSB7XG5cdGxldCBwMSwgcDI7XG5cdGxldCBib2R5ID0gaW5zdGFuY2UuYm9keTtcblxuXHQvLyBkb24ndCBhbGxvdyBjbG9uaW5nIGEgdXNlZCBib2R5XG5cdGlmIChpbnN0YW5jZS5ib2R5VXNlZCkge1xuXHRcdHRocm93IG5ldyBFcnJvcignY2Fubm90IGNsb25lIGJvZHkgYWZ0ZXIgaXQgaXMgdXNlZCcpO1xuXHR9XG5cblx0Ly8gY2hlY2sgdGhhdCBib2R5IGlzIGEgc3RyZWFtIGFuZCBub3QgZm9ybS1kYXRhIG9iamVjdFxuXHQvLyBub3RlOiB3ZSBjYW4ndCBjbG9uZSB0aGUgZm9ybS1kYXRhIG9iamVjdCB3aXRob3V0IGhhdmluZyBpdCBhcyBhIGRlcGVuZGVuY3lcblx0aWYgKGJvZHkgaW5zdGFuY2VvZiBTdHJlYW0gJiYgdHlwZW9mIGJvZHkuZ2V0Qm91bmRhcnkgIT09ICdmdW5jdGlvbicpIHtcblx0XHQvLyB0ZWUgaW5zdGFuY2UgYm9keVxuXHRcdHAxID0gbmV3IFBhc3NUaHJvdWdoKCk7XG5cdFx0cDIgPSBuZXcgUGFzc1Rocm91Z2goKTtcblx0XHRib2R5LnBpcGUocDEpO1xuXHRcdGJvZHkucGlwZShwMik7XG5cdFx0Ly8gc2V0IGluc3RhbmNlIGJvZHkgdG8gdGVlZCBib2R5IGFuZCByZXR1cm4gdGhlIG90aGVyIHRlZWQgYm9keVxuXHRcdGluc3RhbmNlW0lOVEVSTkFMU10uYm9keSA9IHAxO1xuXHRcdGJvZHkgPSBwMjtcblx0fVxuXG5cdHJldHVybiBib2R5O1xufVxuXG4vKipcbiAqIFBlcmZvcm1zIHRoZSBvcGVyYXRpb24gXCJleHRyYWN0IGEgYENvbnRlbnQtVHlwZWAgdmFsdWUgZnJvbSB8b2JqZWN0fFwiIGFzXG4gKiBzcGVjaWZpZWQgaW4gdGhlIHNwZWNpZmljYXRpb246XG4gKiBodHRwczovL2ZldGNoLnNwZWMud2hhdHdnLm9yZy8jY29uY2VwdC1ib2R5aW5pdC1leHRyYWN0XG4gKlxuICogVGhpcyBmdW5jdGlvbiBhc3N1bWVzIHRoYXQgaW5zdGFuY2UuYm9keSBpcyBwcmVzZW50LlxuICpcbiAqIEBwYXJhbSAgIE1peGVkICBpbnN0YW5jZSAgQW55IG9wdGlvbnMuYm9keSBpbnB1dFxuICovXG5mdW5jdGlvbiBleHRyYWN0Q29udGVudFR5cGUoYm9keSkge1xuXHRpZiAoYm9keSA9PT0gbnVsbCkge1xuXHRcdC8vIGJvZHkgaXMgbnVsbFxuXHRcdHJldHVybiBudWxsO1xuXHR9IGVsc2UgaWYgKHR5cGVvZiBib2R5ID09PSAnc3RyaW5nJykge1xuXHRcdC8vIGJvZHkgaXMgc3RyaW5nXG5cdFx0cmV0dXJuICd0ZXh0L3BsYWluO2NoYXJzZXQ9VVRGLTgnO1xuXHR9IGVsc2UgaWYgKGlzVVJMU2VhcmNoUGFyYW1zKGJvZHkpKSB7XG5cdFx0Ly8gYm9keSBpcyBhIFVSTFNlYXJjaFBhcmFtc1xuXHRcdHJldHVybiAnYXBwbGljYXRpb24veC13d3ctZm9ybS11cmxlbmNvZGVkO2NoYXJzZXQ9VVRGLTgnO1xuXHR9IGVsc2UgaWYgKGlzQmxvYihib2R5KSkge1xuXHRcdC8vIGJvZHkgaXMgYmxvYlxuXHRcdHJldHVybiBib2R5LnR5cGUgfHwgbnVsbDtcblx0fSBlbHNlIGlmIChCdWZmZXIuaXNCdWZmZXIoYm9keSkpIHtcblx0XHQvLyBib2R5IGlzIGJ1ZmZlclxuXHRcdHJldHVybiBudWxsO1xuXHR9IGVsc2UgaWYgKE9iamVjdC5wcm90b3R5cGUudG9TdHJpbmcuY2FsbChib2R5KSA9PT0gJ1tvYmplY3QgQXJyYXlCdWZmZXJdJykge1xuXHRcdC8vIGJvZHkgaXMgQXJyYXlCdWZmZXJcblx0XHRyZXR1cm4gbnVsbDtcblx0fSBlbHNlIGlmIChBcnJheUJ1ZmZlci5pc1ZpZXcoYm9keSkpIHtcblx0XHQvLyBib2R5IGlzIEFycmF5QnVmZmVyVmlld1xuXHRcdHJldHVybiBudWxsO1xuXHR9IGVsc2UgaWYgKHR5cGVvZiBib2R5LmdldEJvdW5kYXJ5ID09PSAnZnVuY3Rpb24nKSB7XG5cdFx0Ly8gZGV0ZWN0IGZvcm0gZGF0YSBpbnB1dCBmcm9tIGZvcm0tZGF0YSBtb2R1bGVcblx0XHRyZXR1cm4gYG11bHRpcGFydC9mb3JtLWRhdGE7Ym91bmRhcnk9JHtib2R5LmdldEJvdW5kYXJ5KCl9YDtcblx0fSBlbHNlIGlmIChib2R5IGluc3RhbmNlb2YgU3RyZWFtKSB7XG5cdFx0Ly8gYm9keSBpcyBzdHJlYW1cblx0XHQvLyBjYW4ndCByZWFsbHkgZG8gbXVjaCBhYm91dCB0aGlzXG5cdFx0cmV0dXJuIG51bGw7XG5cdH0gZWxzZSB7XG5cdFx0Ly8gQm9keSBjb25zdHJ1Y3RvciBkZWZhdWx0cyBvdGhlciB0aGluZ3MgdG8gc3RyaW5nXG5cdFx0cmV0dXJuICd0ZXh0L3BsYWluO2NoYXJzZXQ9VVRGLTgnO1xuXHR9XG59XG5cbi8qKlxuICogVGhlIEZldGNoIFN0YW5kYXJkIHRyZWF0cyB0aGlzIGFzIGlmIFwidG90YWwgYnl0ZXNcIiBpcyBhIHByb3BlcnR5IG9uIHRoZSBib2R5LlxuICogRm9yIHVzLCB3ZSBoYXZlIHRvIGV4cGxpY2l0bHkgZ2V0IGl0IHdpdGggYSBmdW5jdGlvbi5cbiAqXG4gKiByZWY6IGh0dHBzOi8vZmV0Y2guc3BlYy53aGF0d2cub3JnLyNjb25jZXB0LWJvZHktdG90YWwtYnl0ZXNcbiAqXG4gKiBAcGFyYW0gICBCb2R5ICAgIGluc3RhbmNlICAgSW5zdGFuY2Ugb2YgQm9keVxuICogQHJldHVybiAgTnVtYmVyPyAgICAgICAgICAgIE51bWJlciBvZiBieXRlcywgb3IgbnVsbCBpZiBub3QgcG9zc2libGVcbiAqL1xuZnVuY3Rpb24gZ2V0VG90YWxCeXRlcyhpbnN0YW5jZSkge1xuXHRjb25zdCBib2R5ID0gaW5zdGFuY2UuYm9keTtcblxuXG5cdGlmIChib2R5ID09PSBudWxsKSB7XG5cdFx0Ly8gYm9keSBpcyBudWxsXG5cdFx0cmV0dXJuIDA7XG5cdH0gZWxzZSBpZiAoaXNCbG9iKGJvZHkpKSB7XG5cdFx0cmV0dXJuIGJvZHkuc2l6ZTtcblx0fSBlbHNlIGlmIChCdWZmZXIuaXNCdWZmZXIoYm9keSkpIHtcblx0XHQvLyBib2R5IGlzIGJ1ZmZlclxuXHRcdHJldHVybiBib2R5Lmxlbmd0aDtcblx0fSBlbHNlIGlmIChib2R5ICYmIHR5cGVvZiBib2R5LmdldExlbmd0aFN5bmMgPT09ICdmdW5jdGlvbicpIHtcblx0XHQvLyBkZXRlY3QgZm9ybSBkYXRhIGlucHV0IGZyb20gZm9ybS1kYXRhIG1vZHVsZVxuXHRcdGlmIChib2R5Ll9sZW5ndGhSZXRyaWV2ZXJzICYmIGJvZHkuX2xlbmd0aFJldHJpZXZlcnMubGVuZ3RoID09IDAgfHwgLy8gMS54XG5cdFx0Ym9keS5oYXNLbm93bkxlbmd0aCAmJiBib2R5Lmhhc0tub3duTGVuZ3RoKCkpIHtcblx0XHRcdC8vIDIueFxuXHRcdFx0cmV0dXJuIGJvZHkuZ2V0TGVuZ3RoU3luYygpO1xuXHRcdH1cblx0XHRyZXR1cm4gbnVsbDtcblx0fSBlbHNlIHtcblx0XHQvLyBib2R5IGlzIHN0cmVhbVxuXHRcdHJldHVybiBudWxsO1xuXHR9XG59XG5cbi8qKlxuICogV3JpdGUgYSBCb2R5IHRvIGEgTm9kZS5qcyBXcml0YWJsZVN0cmVhbSAoZS5nLiBodHRwLlJlcXVlc3QpIG9iamVjdC5cbiAqXG4gKiBAcGFyYW0gICBCb2R5ICAgIGluc3RhbmNlICAgSW5zdGFuY2Ugb2YgQm9keVxuICogQHJldHVybiAgVm9pZFxuICovXG5mdW5jdGlvbiB3cml0ZVRvU3RyZWFtKGRlc3QsIGluc3RhbmNlKSB7XG5cdGNvbnN0IGJvZHkgPSBpbnN0YW5jZS5ib2R5O1xuXG5cblx0aWYgKGJvZHkgPT09IG51bGwpIHtcblx0XHQvLyBib2R5IGlzIG51bGxcblx0XHRkZXN0LmVuZCgpO1xuXHR9IGVsc2UgaWYgKGlzQmxvYihib2R5KSkge1xuXHRcdGJvZHkuc3RyZWFtKCkucGlwZShkZXN0KTtcblx0fSBlbHNlIGlmIChCdWZmZXIuaXNCdWZmZXIoYm9keSkpIHtcblx0XHQvLyBib2R5IGlzIGJ1ZmZlclxuXHRcdGRlc3Qud3JpdGUoYm9keSk7XG5cdFx0ZGVzdC5lbmQoKTtcblx0fSBlbHNlIHtcblx0XHQvLyBib2R5IGlzIHN0cmVhbVxuXHRcdGJvZHkucGlwZShkZXN0KTtcblx0fVxufVxuXG4vLyBleHBvc2UgUHJvbWlzZVxuQm9keS5Qcm9taXNlID0gZ2xvYmFsLlByb21pc2U7XG5cbi8qKlxuICogaGVhZGVycy5qc1xuICpcbiAqIEhlYWRlcnMgY2xhc3Mgb2ZmZXJzIGNvbnZlbmllbnQgaGVscGVyc1xuICovXG5cbmNvbnN0IGludmFsaWRUb2tlblJlZ2V4ID0gL1teXFxeX2BhLXpBLVpcXC0wLTkhIyQlJicqKy58fl0vO1xuY29uc3QgaW52YWxpZEhlYWRlckNoYXJSZWdleCA9IC9bXlxcdFxceDIwLVxceDdlXFx4ODAtXFx4ZmZdLztcblxuZnVuY3Rpb24gdmFsaWRhdGVOYW1lKG5hbWUpIHtcblx0bmFtZSA9IGAke25hbWV9YDtcblx0aWYgKGludmFsaWRUb2tlblJlZ2V4LnRlc3QobmFtZSkgfHwgbmFtZSA9PT0gJycpIHtcblx0XHR0aHJvdyBuZXcgVHlwZUVycm9yKGAke25hbWV9IGlzIG5vdCBhIGxlZ2FsIEhUVFAgaGVhZGVyIG5hbWVgKTtcblx0fVxufVxuXG5mdW5jdGlvbiB2YWxpZGF0ZVZhbHVlKHZhbHVlKSB7XG5cdHZhbHVlID0gYCR7dmFsdWV9YDtcblx0aWYgKGludmFsaWRIZWFkZXJDaGFyUmVnZXgudGVzdCh2YWx1ZSkpIHtcblx0XHR0aHJvdyBuZXcgVHlwZUVycm9yKGAke3ZhbHVlfSBpcyBub3QgYSBsZWdhbCBIVFRQIGhlYWRlciB2YWx1ZWApO1xuXHR9XG59XG5cbi8qKlxuICogRmluZCB0aGUga2V5IGluIHRoZSBtYXAgb2JqZWN0IGdpdmVuIGEgaGVhZGVyIG5hbWUuXG4gKlxuICogUmV0dXJucyB1bmRlZmluZWQgaWYgbm90IGZvdW5kLlxuICpcbiAqIEBwYXJhbSAgIFN0cmluZyAgbmFtZSAgSGVhZGVyIG5hbWVcbiAqIEByZXR1cm4gIFN0cmluZ3xVbmRlZmluZWRcbiAqL1xuZnVuY3Rpb24gZmluZChtYXAsIG5hbWUpIHtcblx0bmFtZSA9IG5hbWUudG9Mb3dlckNhc2UoKTtcblx0Zm9yIChjb25zdCBrZXkgaW4gbWFwKSB7XG5cdFx0aWYgKGtleS50b0xvd2VyQ2FzZSgpID09PSBuYW1lKSB7XG5cdFx0XHRyZXR1cm4ga2V5O1xuXHRcdH1cblx0fVxuXHRyZXR1cm4gdW5kZWZpbmVkO1xufVxuXG5jb25zdCBNQVAgPSBTeW1ib2woJ21hcCcpO1xuY2xhc3MgSGVhZGVycyB7XG5cdC8qKlxuICAqIEhlYWRlcnMgY2xhc3NcbiAgKlxuICAqIEBwYXJhbSAgIE9iamVjdCAgaGVhZGVycyAgUmVzcG9uc2UgaGVhZGVyc1xuICAqIEByZXR1cm4gIFZvaWRcbiAgKi9cblx0Y29uc3RydWN0b3IoKSB7XG5cdFx0bGV0IGluaXQgPSBhcmd1bWVudHMubGVuZ3RoID4gMCAmJiBhcmd1bWVudHNbMF0gIT09IHVuZGVmaW5lZCA/IGFyZ3VtZW50c1swXSA6IHVuZGVmaW5lZDtcblxuXHRcdHRoaXNbTUFQXSA9IE9iamVjdC5jcmVhdGUobnVsbCk7XG5cblx0XHRpZiAoaW5pdCBpbnN0YW5jZW9mIEhlYWRlcnMpIHtcblx0XHRcdGNvbnN0IHJhd0hlYWRlcnMgPSBpbml0LnJhdygpO1xuXHRcdFx0Y29uc3QgaGVhZGVyTmFtZXMgPSBPYmplY3Qua2V5cyhyYXdIZWFkZXJzKTtcblxuXHRcdFx0Zm9yIChjb25zdCBoZWFkZXJOYW1lIG9mIGhlYWRlck5hbWVzKSB7XG5cdFx0XHRcdGZvciAoY29uc3QgdmFsdWUgb2YgcmF3SGVhZGVyc1toZWFkZXJOYW1lXSkge1xuXHRcdFx0XHRcdHRoaXMuYXBwZW5kKGhlYWRlck5hbWUsIHZhbHVlKTtcblx0XHRcdFx0fVxuXHRcdFx0fVxuXG5cdFx0XHRyZXR1cm47XG5cdFx0fVxuXG5cdFx0Ly8gV2UgZG9uJ3Qgd29ycnkgYWJvdXQgY29udmVydGluZyBwcm9wIHRvIEJ5dGVTdHJpbmcgaGVyZSBhcyBhcHBlbmQoKVxuXHRcdC8vIHdpbGwgaGFuZGxlIGl0LlxuXHRcdGlmIChpbml0ID09IG51bGwpIDsgZWxzZSBpZiAodHlwZW9mIGluaXQgPT09ICdvYmplY3QnKSB7XG5cdFx0XHRjb25zdCBtZXRob2QgPSBpbml0W1N5bWJvbC5pdGVyYXRvcl07XG5cdFx0XHRpZiAobWV0aG9kICE9IG51bGwpIHtcblx0XHRcdFx0aWYgKHR5cGVvZiBtZXRob2QgIT09ICdmdW5jdGlvbicpIHtcblx0XHRcdFx0XHR0aHJvdyBuZXcgVHlwZUVycm9yKCdIZWFkZXIgcGFpcnMgbXVzdCBiZSBpdGVyYWJsZScpO1xuXHRcdFx0XHR9XG5cblx0XHRcdFx0Ly8gc2VxdWVuY2U8c2VxdWVuY2U8Qnl0ZVN0cmluZz4+XG5cdFx0XHRcdC8vIE5vdGU6IHBlciBzcGVjIHdlIGhhdmUgdG8gZmlyc3QgZXhoYXVzdCB0aGUgbGlzdHMgdGhlbiBwcm9jZXNzIHRoZW1cblx0XHRcdFx0Y29uc3QgcGFpcnMgPSBbXTtcblx0XHRcdFx0Zm9yIChjb25zdCBwYWlyIG9mIGluaXQpIHtcblx0XHRcdFx0XHRpZiAodHlwZW9mIHBhaXIgIT09ICdvYmplY3QnIHx8IHR5cGVvZiBwYWlyW1N5bWJvbC5pdGVyYXRvcl0gIT09ICdmdW5jdGlvbicpIHtcblx0XHRcdFx0XHRcdHRocm93IG5ldyBUeXBlRXJyb3IoJ0VhY2ggaGVhZGVyIHBhaXIgbXVzdCBiZSBpdGVyYWJsZScpO1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0XHRwYWlycy5wdXNoKEFycmF5LmZyb20ocGFpcikpO1xuXHRcdFx0XHR9XG5cblx0XHRcdFx0Zm9yIChjb25zdCBwYWlyIG9mIHBhaXJzKSB7XG5cdFx0XHRcdFx0aWYgKHBhaXIubGVuZ3RoICE9PSAyKSB7XG5cdFx0XHRcdFx0XHR0aHJvdyBuZXcgVHlwZUVycm9yKCdFYWNoIGhlYWRlciBwYWlyIG11c3QgYmUgYSBuYW1lL3ZhbHVlIHR1cGxlJyk7XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHRcdHRoaXMuYXBwZW5kKHBhaXJbMF0sIHBhaXJbMV0pO1xuXHRcdFx0XHR9XG5cdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHQvLyByZWNvcmQ8Qnl0ZVN0cmluZywgQnl0ZVN0cmluZz5cblx0XHRcdFx0Zm9yIChjb25zdCBrZXkgb2YgT2JqZWN0LmtleXMoaW5pdCkpIHtcblx0XHRcdFx0XHRjb25zdCB2YWx1ZSA9IGluaXRba2V5XTtcblx0XHRcdFx0XHR0aGlzLmFwcGVuZChrZXksIHZhbHVlKTtcblx0XHRcdFx0fVxuXHRcdFx0fVxuXHRcdH0gZWxzZSB7XG5cdFx0XHR0aHJvdyBuZXcgVHlwZUVycm9yKCdQcm92aWRlZCBpbml0aWFsaXplciBtdXN0IGJlIGFuIG9iamVjdCcpO1xuXHRcdH1cblx0fVxuXG5cdC8qKlxuICAqIFJldHVybiBjb21iaW5lZCBoZWFkZXIgdmFsdWUgZ2l2ZW4gbmFtZVxuICAqXG4gICogQHBhcmFtICAgU3RyaW5nICBuYW1lICBIZWFkZXIgbmFtZVxuICAqIEByZXR1cm4gIE1peGVkXG4gICovXG5cdGdldChuYW1lKSB7XG5cdFx0bmFtZSA9IGAke25hbWV9YDtcblx0XHR2YWxpZGF0ZU5hbWUobmFtZSk7XG5cdFx0Y29uc3Qga2V5ID0gZmluZCh0aGlzW01BUF0sIG5hbWUpO1xuXHRcdGlmIChrZXkgPT09IHVuZGVmaW5lZCkge1xuXHRcdFx0cmV0dXJuIG51bGw7XG5cdFx0fVxuXG5cdFx0cmV0dXJuIHRoaXNbTUFQXVtrZXldLmpvaW4oJywgJyk7XG5cdH1cblxuXHQvKipcbiAgKiBJdGVyYXRlIG92ZXIgYWxsIGhlYWRlcnNcbiAgKlxuICAqIEBwYXJhbSAgIEZ1bmN0aW9uICBjYWxsYmFjayAgRXhlY3V0ZWQgZm9yIGVhY2ggaXRlbSB3aXRoIHBhcmFtZXRlcnMgKHZhbHVlLCBuYW1lLCB0aGlzQXJnKVxuICAqIEBwYXJhbSAgIEJvb2xlYW4gICB0aGlzQXJnICAgYHRoaXNgIGNvbnRleHQgZm9yIGNhbGxiYWNrIGZ1bmN0aW9uXG4gICogQHJldHVybiAgVm9pZFxuICAqL1xuXHRmb3JFYWNoKGNhbGxiYWNrKSB7XG5cdFx0bGV0IHRoaXNBcmcgPSBhcmd1bWVudHMubGVuZ3RoID4gMSAmJiBhcmd1bWVudHNbMV0gIT09IHVuZGVmaW5lZCA/IGFyZ3VtZW50c1sxXSA6IHVuZGVmaW5lZDtcblxuXHRcdGxldCBwYWlycyA9IGdldEhlYWRlcnModGhpcyk7XG5cdFx0bGV0IGkgPSAwO1xuXHRcdHdoaWxlIChpIDwgcGFpcnMubGVuZ3RoKSB7XG5cdFx0XHR2YXIgX3BhaXJzJGkgPSBwYWlyc1tpXTtcblx0XHRcdGNvbnN0IG5hbWUgPSBfcGFpcnMkaVswXSxcblx0XHRcdCAgICAgIHZhbHVlID0gX3BhaXJzJGlbMV07XG5cblx0XHRcdGNhbGxiYWNrLmNhbGwodGhpc0FyZywgdmFsdWUsIG5hbWUsIHRoaXMpO1xuXHRcdFx0cGFpcnMgPSBnZXRIZWFkZXJzKHRoaXMpO1xuXHRcdFx0aSsrO1xuXHRcdH1cblx0fVxuXG5cdC8qKlxuICAqIE92ZXJ3cml0ZSBoZWFkZXIgdmFsdWVzIGdpdmVuIG5hbWVcbiAgKlxuICAqIEBwYXJhbSAgIFN0cmluZyAgbmFtZSAgIEhlYWRlciBuYW1lXG4gICogQHBhcmFtICAgU3RyaW5nICB2YWx1ZSAgSGVhZGVyIHZhbHVlXG4gICogQHJldHVybiAgVm9pZFxuICAqL1xuXHRzZXQobmFtZSwgdmFsdWUpIHtcblx0XHRuYW1lID0gYCR7bmFtZX1gO1xuXHRcdHZhbHVlID0gYCR7dmFsdWV9YDtcblx0XHR2YWxpZGF0ZU5hbWUobmFtZSk7XG5cdFx0dmFsaWRhdGVWYWx1ZSh2YWx1ZSk7XG5cdFx0Y29uc3Qga2V5ID0gZmluZCh0aGlzW01BUF0sIG5hbWUpO1xuXHRcdHRoaXNbTUFQXVtrZXkgIT09IHVuZGVmaW5lZCA/IGtleSA6IG5hbWVdID0gW3ZhbHVlXTtcblx0fVxuXG5cdC8qKlxuICAqIEFwcGVuZCBhIHZhbHVlIG9udG8gZXhpc3RpbmcgaGVhZGVyXG4gICpcbiAgKiBAcGFyYW0gICBTdHJpbmcgIG5hbWUgICBIZWFkZXIgbmFtZVxuICAqIEBwYXJhbSAgIFN0cmluZyAgdmFsdWUgIEhlYWRlciB2YWx1ZVxuICAqIEByZXR1cm4gIFZvaWRcbiAgKi9cblx0YXBwZW5kKG5hbWUsIHZhbHVlKSB7XG5cdFx0bmFtZSA9IGAke25hbWV9YDtcblx0XHR2YWx1ZSA9IGAke3ZhbHVlfWA7XG5cdFx0dmFsaWRhdGVOYW1lKG5hbWUpO1xuXHRcdHZhbGlkYXRlVmFsdWUodmFsdWUpO1xuXHRcdGNvbnN0IGtleSA9IGZpbmQodGhpc1tNQVBdLCBuYW1lKTtcblx0XHRpZiAoa2V5ICE9PSB1bmRlZmluZWQpIHtcblx0XHRcdHRoaXNbTUFQXVtrZXldLnB1c2godmFsdWUpO1xuXHRcdH0gZWxzZSB7XG5cdFx0XHR0aGlzW01BUF1bbmFtZV0gPSBbdmFsdWVdO1xuXHRcdH1cblx0fVxuXG5cdC8qKlxuICAqIENoZWNrIGZvciBoZWFkZXIgbmFtZSBleGlzdGVuY2VcbiAgKlxuICAqIEBwYXJhbSAgIFN0cmluZyAgIG5hbWUgIEhlYWRlciBuYW1lXG4gICogQHJldHVybiAgQm9vbGVhblxuICAqL1xuXHRoYXMobmFtZSkge1xuXHRcdG5hbWUgPSBgJHtuYW1lfWA7XG5cdFx0dmFsaWRhdGVOYW1lKG5hbWUpO1xuXHRcdHJldHVybiBmaW5kKHRoaXNbTUFQXSwgbmFtZSkgIT09IHVuZGVmaW5lZDtcblx0fVxuXG5cdC8qKlxuICAqIERlbGV0ZSBhbGwgaGVhZGVyIHZhbHVlcyBnaXZlbiBuYW1lXG4gICpcbiAgKiBAcGFyYW0gICBTdHJpbmcgIG5hbWUgIEhlYWRlciBuYW1lXG4gICogQHJldHVybiAgVm9pZFxuICAqL1xuXHRkZWxldGUobmFtZSkge1xuXHRcdG5hbWUgPSBgJHtuYW1lfWA7XG5cdFx0dmFsaWRhdGVOYW1lKG5hbWUpO1xuXHRcdGNvbnN0IGtleSA9IGZpbmQodGhpc1tNQVBdLCBuYW1lKTtcblx0XHRpZiAoa2V5ICE9PSB1bmRlZmluZWQpIHtcblx0XHRcdGRlbGV0ZSB0aGlzW01BUF1ba2V5XTtcblx0XHR9XG5cdH1cblxuXHQvKipcbiAgKiBSZXR1cm4gcmF3IGhlYWRlcnMgKG5vbi1zcGVjIGFwaSlcbiAgKlxuICAqIEByZXR1cm4gIE9iamVjdFxuICAqL1xuXHRyYXcoKSB7XG5cdFx0cmV0dXJuIHRoaXNbTUFQXTtcblx0fVxuXG5cdC8qKlxuICAqIEdldCBhbiBpdGVyYXRvciBvbiBrZXlzLlxuICAqXG4gICogQHJldHVybiAgSXRlcmF0b3JcbiAgKi9cblx0a2V5cygpIHtcblx0XHRyZXR1cm4gY3JlYXRlSGVhZGVyc0l0ZXJhdG9yKHRoaXMsICdrZXknKTtcblx0fVxuXG5cdC8qKlxuICAqIEdldCBhbiBpdGVyYXRvciBvbiB2YWx1ZXMuXG4gICpcbiAgKiBAcmV0dXJuICBJdGVyYXRvclxuICAqL1xuXHR2YWx1ZXMoKSB7XG5cdFx0cmV0dXJuIGNyZWF0ZUhlYWRlcnNJdGVyYXRvcih0aGlzLCAndmFsdWUnKTtcblx0fVxuXG5cdC8qKlxuICAqIEdldCBhbiBpdGVyYXRvciBvbiBlbnRyaWVzLlxuICAqXG4gICogVGhpcyBpcyB0aGUgZGVmYXVsdCBpdGVyYXRvciBvZiB0aGUgSGVhZGVycyBvYmplY3QuXG4gICpcbiAgKiBAcmV0dXJuICBJdGVyYXRvclxuICAqL1xuXHRbU3ltYm9sLml0ZXJhdG9yXSgpIHtcblx0XHRyZXR1cm4gY3JlYXRlSGVhZGVyc0l0ZXJhdG9yKHRoaXMsICdrZXkrdmFsdWUnKTtcblx0fVxufVxuSGVhZGVycy5wcm90b3R5cGUuZW50cmllcyA9IEhlYWRlcnMucHJvdG90eXBlW1N5bWJvbC5pdGVyYXRvcl07XG5cbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShIZWFkZXJzLnByb3RvdHlwZSwgU3ltYm9sLnRvU3RyaW5nVGFnLCB7XG5cdHZhbHVlOiAnSGVhZGVycycsXG5cdHdyaXRhYmxlOiBmYWxzZSxcblx0ZW51bWVyYWJsZTogZmFsc2UsXG5cdGNvbmZpZ3VyYWJsZTogdHJ1ZVxufSk7XG5cbk9iamVjdC5kZWZpbmVQcm9wZXJ0aWVzKEhlYWRlcnMucHJvdG90eXBlLCB7XG5cdGdldDogeyBlbnVtZXJhYmxlOiB0cnVlIH0sXG5cdGZvckVhY2g6IHsgZW51bWVyYWJsZTogdHJ1ZSB9LFxuXHRzZXQ6IHsgZW51bWVyYWJsZTogdHJ1ZSB9LFxuXHRhcHBlbmQ6IHsgZW51bWVyYWJsZTogdHJ1ZSB9LFxuXHRoYXM6IHsgZW51bWVyYWJsZTogdHJ1ZSB9LFxuXHRkZWxldGU6IHsgZW51bWVyYWJsZTogdHJ1ZSB9LFxuXHRrZXlzOiB7IGVudW1lcmFibGU6IHRydWUgfSxcblx0dmFsdWVzOiB7IGVudW1lcmFibGU6IHRydWUgfSxcblx0ZW50cmllczogeyBlbnVtZXJhYmxlOiB0cnVlIH1cbn0pO1xuXG5mdW5jdGlvbiBnZXRIZWFkZXJzKGhlYWRlcnMpIHtcblx0bGV0IGtpbmQgPSBhcmd1bWVudHMubGVuZ3RoID4gMSAmJiBhcmd1bWVudHNbMV0gIT09IHVuZGVmaW5lZCA/IGFyZ3VtZW50c1sxXSA6ICdrZXkrdmFsdWUnO1xuXG5cdGNvbnN0IGtleXMgPSBPYmplY3Qua2V5cyhoZWFkZXJzW01BUF0pLnNvcnQoKTtcblx0cmV0dXJuIGtleXMubWFwKGtpbmQgPT09ICdrZXknID8gZnVuY3Rpb24gKGspIHtcblx0XHRyZXR1cm4gay50b0xvd2VyQ2FzZSgpO1xuXHR9IDoga2luZCA9PT0gJ3ZhbHVlJyA/IGZ1bmN0aW9uIChrKSB7XG5cdFx0cmV0dXJuIGhlYWRlcnNbTUFQXVtrXS5qb2luKCcsICcpO1xuXHR9IDogZnVuY3Rpb24gKGspIHtcblx0XHRyZXR1cm4gW2sudG9Mb3dlckNhc2UoKSwgaGVhZGVyc1tNQVBdW2tdLmpvaW4oJywgJyldO1xuXHR9KTtcbn1cblxuY29uc3QgSU5URVJOQUwgPSBTeW1ib2woJ2ludGVybmFsJyk7XG5cbmZ1bmN0aW9uIGNyZWF0ZUhlYWRlcnNJdGVyYXRvcih0YXJnZXQsIGtpbmQpIHtcblx0Y29uc3QgaXRlcmF0b3IgPSBPYmplY3QuY3JlYXRlKEhlYWRlcnNJdGVyYXRvclByb3RvdHlwZSk7XG5cdGl0ZXJhdG9yW0lOVEVSTkFMXSA9IHtcblx0XHR0YXJnZXQsXG5cdFx0a2luZCxcblx0XHRpbmRleDogMFxuXHR9O1xuXHRyZXR1cm4gaXRlcmF0b3I7XG59XG5cbmNvbnN0IEhlYWRlcnNJdGVyYXRvclByb3RvdHlwZSA9IE9iamVjdC5zZXRQcm90b3R5cGVPZih7XG5cdG5leHQoKSB7XG5cdFx0Ly8gaXN0YW5idWwgaWdub3JlIGlmXG5cdFx0aWYgKCF0aGlzIHx8IE9iamVjdC5nZXRQcm90b3R5cGVPZih0aGlzKSAhPT0gSGVhZGVyc0l0ZXJhdG9yUHJvdG90eXBlKSB7XG5cdFx0XHR0aHJvdyBuZXcgVHlwZUVycm9yKCdWYWx1ZSBvZiBgdGhpc2AgaXMgbm90IGEgSGVhZGVyc0l0ZXJhdG9yJyk7XG5cdFx0fVxuXG5cdFx0dmFyIF9JTlRFUk5BTCA9IHRoaXNbSU5URVJOQUxdO1xuXHRcdGNvbnN0IHRhcmdldCA9IF9JTlRFUk5BTC50YXJnZXQsXG5cdFx0ICAgICAga2luZCA9IF9JTlRFUk5BTC5raW5kLFxuXHRcdCAgICAgIGluZGV4ID0gX0lOVEVSTkFMLmluZGV4O1xuXG5cdFx0Y29uc3QgdmFsdWVzID0gZ2V0SGVhZGVycyh0YXJnZXQsIGtpbmQpO1xuXHRcdGNvbnN0IGxlbiA9IHZhbHVlcy5sZW5ndGg7XG5cdFx0aWYgKGluZGV4ID49IGxlbikge1xuXHRcdFx0cmV0dXJuIHtcblx0XHRcdFx0dmFsdWU6IHVuZGVmaW5lZCxcblx0XHRcdFx0ZG9uZTogdHJ1ZVxuXHRcdFx0fTtcblx0XHR9XG5cblx0XHR0aGlzW0lOVEVSTkFMXS5pbmRleCA9IGluZGV4ICsgMTtcblxuXHRcdHJldHVybiB7XG5cdFx0XHR2YWx1ZTogdmFsdWVzW2luZGV4XSxcblx0XHRcdGRvbmU6IGZhbHNlXG5cdFx0fTtcblx0fVxufSwgT2JqZWN0LmdldFByb3RvdHlwZU9mKE9iamVjdC5nZXRQcm90b3R5cGVPZihbXVtTeW1ib2wuaXRlcmF0b3JdKCkpKSk7XG5cbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShIZWFkZXJzSXRlcmF0b3JQcm90b3R5cGUsIFN5bWJvbC50b1N0cmluZ1RhZywge1xuXHR2YWx1ZTogJ0hlYWRlcnNJdGVyYXRvcicsXG5cdHdyaXRhYmxlOiBmYWxzZSxcblx0ZW51bWVyYWJsZTogZmFsc2UsXG5cdGNvbmZpZ3VyYWJsZTogdHJ1ZVxufSk7XG5cbi8qKlxuICogRXhwb3J0IHRoZSBIZWFkZXJzIG9iamVjdCBpbiBhIGZvcm0gdGhhdCBOb2RlLmpzIGNhbiBjb25zdW1lLlxuICpcbiAqIEBwYXJhbSAgIEhlYWRlcnMgIGhlYWRlcnNcbiAqIEByZXR1cm4gIE9iamVjdFxuICovXG5mdW5jdGlvbiBleHBvcnROb2RlQ29tcGF0aWJsZUhlYWRlcnMoaGVhZGVycykge1xuXHRjb25zdCBvYmogPSBPYmplY3QuYXNzaWduKHsgX19wcm90b19fOiBudWxsIH0sIGhlYWRlcnNbTUFQXSk7XG5cblx0Ly8gaHR0cC5yZXF1ZXN0KCkgb25seSBzdXBwb3J0cyBzdHJpbmcgYXMgSG9zdCBoZWFkZXIuIFRoaXMgaGFjayBtYWtlc1xuXHQvLyBzcGVjaWZ5aW5nIGN1c3RvbSBIb3N0IGhlYWRlciBwb3NzaWJsZS5cblx0Y29uc3QgaG9zdEhlYWRlcktleSA9IGZpbmQoaGVhZGVyc1tNQVBdLCAnSG9zdCcpO1xuXHRpZiAoaG9zdEhlYWRlcktleSAhPT0gdW5kZWZpbmVkKSB7XG5cdFx0b2JqW2hvc3RIZWFkZXJLZXldID0gb2JqW2hvc3RIZWFkZXJLZXldWzBdO1xuXHR9XG5cblx0cmV0dXJuIG9iajtcbn1cblxuLyoqXG4gKiBDcmVhdGUgYSBIZWFkZXJzIG9iamVjdCBmcm9tIGFuIG9iamVjdCBvZiBoZWFkZXJzLCBpZ25vcmluZyB0aG9zZSB0aGF0IGRvXG4gKiBub3QgY29uZm9ybSB0byBIVFRQIGdyYW1tYXIgcHJvZHVjdGlvbnMuXG4gKlxuICogQHBhcmFtICAgT2JqZWN0ICBvYmogIE9iamVjdCBvZiBoZWFkZXJzXG4gKiBAcmV0dXJuICBIZWFkZXJzXG4gKi9cbmZ1bmN0aW9uIGNyZWF0ZUhlYWRlcnNMZW5pZW50KG9iaikge1xuXHRjb25zdCBoZWFkZXJzID0gbmV3IEhlYWRlcnMoKTtcblx0Zm9yIChjb25zdCBuYW1lIG9mIE9iamVjdC5rZXlzKG9iaikpIHtcblx0XHRpZiAoaW52YWxpZFRva2VuUmVnZXgudGVzdChuYW1lKSkge1xuXHRcdFx0Y29udGludWU7XG5cdFx0fVxuXHRcdGlmIChBcnJheS5pc0FycmF5KG9ialtuYW1lXSkpIHtcblx0XHRcdGZvciAoY29uc3QgdmFsIG9mIG9ialtuYW1lXSkge1xuXHRcdFx0XHRpZiAoaW52YWxpZEhlYWRlckNoYXJSZWdleC50ZXN0KHZhbCkpIHtcblx0XHRcdFx0XHRjb250aW51ZTtcblx0XHRcdFx0fVxuXHRcdFx0XHRpZiAoaGVhZGVyc1tNQVBdW25hbWVdID09PSB1bmRlZmluZWQpIHtcblx0XHRcdFx0XHRoZWFkZXJzW01BUF1bbmFtZV0gPSBbdmFsXTtcblx0XHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0XHRoZWFkZXJzW01BUF1bbmFtZV0ucHVzaCh2YWwpO1xuXHRcdFx0XHR9XG5cdFx0XHR9XG5cdFx0fSBlbHNlIGlmICghaW52YWxpZEhlYWRlckNoYXJSZWdleC50ZXN0KG9ialtuYW1lXSkpIHtcblx0XHRcdGhlYWRlcnNbTUFQXVtuYW1lXSA9IFtvYmpbbmFtZV1dO1xuXHRcdH1cblx0fVxuXHRyZXR1cm4gaGVhZGVycztcbn1cblxuY29uc3QgSU5URVJOQUxTJDEgPSBTeW1ib2woJ1Jlc3BvbnNlIGludGVybmFscycpO1xuXG4vLyBmaXggYW4gaXNzdWUgd2hlcmUgXCJTVEFUVVNfQ09ERVNcIiBhcmVuJ3QgYSBuYW1lZCBleHBvcnQgZm9yIG5vZGUgPDEwXG5jb25zdCBTVEFUVVNfQ09ERVMgPSBodHRwLlNUQVRVU19DT0RFUztcblxuLyoqXG4gKiBSZXNwb25zZSBjbGFzc1xuICpcbiAqIEBwYXJhbSAgIFN0cmVhbSAgYm9keSAgUmVhZGFibGUgc3RyZWFtXG4gKiBAcGFyYW0gICBPYmplY3QgIG9wdHMgIFJlc3BvbnNlIG9wdGlvbnNcbiAqIEByZXR1cm4gIFZvaWRcbiAqL1xuY2xhc3MgUmVzcG9uc2Uge1xuXHRjb25zdHJ1Y3RvcigpIHtcblx0XHRsZXQgYm9keSA9IGFyZ3VtZW50cy5sZW5ndGggPiAwICYmIGFyZ3VtZW50c1swXSAhPT0gdW5kZWZpbmVkID8gYXJndW1lbnRzWzBdIDogbnVsbDtcblx0XHRsZXQgb3B0cyA9IGFyZ3VtZW50cy5sZW5ndGggPiAxICYmIGFyZ3VtZW50c1sxXSAhPT0gdW5kZWZpbmVkID8gYXJndW1lbnRzWzFdIDoge307XG5cblx0XHRCb2R5LmNhbGwodGhpcywgYm9keSwgb3B0cyk7XG5cblx0XHRjb25zdCBzdGF0dXMgPSBvcHRzLnN0YXR1cyB8fCAyMDA7XG5cdFx0Y29uc3QgaGVhZGVycyA9IG5ldyBIZWFkZXJzKG9wdHMuaGVhZGVycyk7XG5cblx0XHRpZiAoYm9keSAhPSBudWxsICYmICFoZWFkZXJzLmhhcygnQ29udGVudC1UeXBlJykpIHtcblx0XHRcdGNvbnN0IGNvbnRlbnRUeXBlID0gZXh0cmFjdENvbnRlbnRUeXBlKGJvZHkpO1xuXHRcdFx0aWYgKGNvbnRlbnRUeXBlKSB7XG5cdFx0XHRcdGhlYWRlcnMuYXBwZW5kKCdDb250ZW50LVR5cGUnLCBjb250ZW50VHlwZSk7XG5cdFx0XHR9XG5cdFx0fVxuXG5cdFx0dGhpc1tJTlRFUk5BTFMkMV0gPSB7XG5cdFx0XHR1cmw6IG9wdHMudXJsLFxuXHRcdFx0c3RhdHVzLFxuXHRcdFx0c3RhdHVzVGV4dDogb3B0cy5zdGF0dXNUZXh0IHx8IFNUQVRVU19DT0RFU1tzdGF0dXNdLFxuXHRcdFx0aGVhZGVycyxcblx0XHRcdGNvdW50ZXI6IG9wdHMuY291bnRlclxuXHRcdH07XG5cdH1cblxuXHRnZXQgdXJsKCkge1xuXHRcdHJldHVybiB0aGlzW0lOVEVSTkFMUyQxXS51cmwgfHwgJyc7XG5cdH1cblxuXHRnZXQgc3RhdHVzKCkge1xuXHRcdHJldHVybiB0aGlzW0lOVEVSTkFMUyQxXS5zdGF0dXM7XG5cdH1cblxuXHQvKipcbiAgKiBDb252ZW5pZW5jZSBwcm9wZXJ0eSByZXByZXNlbnRpbmcgaWYgdGhlIHJlcXVlc3QgZW5kZWQgbm9ybWFsbHlcbiAgKi9cblx0Z2V0IG9rKCkge1xuXHRcdHJldHVybiB0aGlzW0lOVEVSTkFMUyQxXS5zdGF0dXMgPj0gMjAwICYmIHRoaXNbSU5URVJOQUxTJDFdLnN0YXR1cyA8IDMwMDtcblx0fVxuXG5cdGdldCByZWRpcmVjdGVkKCkge1xuXHRcdHJldHVybiB0aGlzW0lOVEVSTkFMUyQxXS5jb3VudGVyID4gMDtcblx0fVxuXG5cdGdldCBzdGF0dXNUZXh0KCkge1xuXHRcdHJldHVybiB0aGlzW0lOVEVSTkFMUyQxXS5zdGF0dXNUZXh0O1xuXHR9XG5cblx0Z2V0IGhlYWRlcnMoKSB7XG5cdFx0cmV0dXJuIHRoaXNbSU5URVJOQUxTJDFdLmhlYWRlcnM7XG5cdH1cblxuXHQvKipcbiAgKiBDbG9uZSB0aGlzIHJlc3BvbnNlXG4gICpcbiAgKiBAcmV0dXJuICBSZXNwb25zZVxuICAqL1xuXHRjbG9uZSgpIHtcblx0XHRyZXR1cm4gbmV3IFJlc3BvbnNlKGNsb25lKHRoaXMpLCB7XG5cdFx0XHR1cmw6IHRoaXMudXJsLFxuXHRcdFx0c3RhdHVzOiB0aGlzLnN0YXR1cyxcblx0XHRcdHN0YXR1c1RleHQ6IHRoaXMuc3RhdHVzVGV4dCxcblx0XHRcdGhlYWRlcnM6IHRoaXMuaGVhZGVycyxcblx0XHRcdG9rOiB0aGlzLm9rLFxuXHRcdFx0cmVkaXJlY3RlZDogdGhpcy5yZWRpcmVjdGVkXG5cdFx0fSk7XG5cdH1cbn1cblxuQm9keS5taXhJbihSZXNwb25zZS5wcm90b3R5cGUpO1xuXG5PYmplY3QuZGVmaW5lUHJvcGVydGllcyhSZXNwb25zZS5wcm90b3R5cGUsIHtcblx0dXJsOiB7IGVudW1lcmFibGU6IHRydWUgfSxcblx0c3RhdHVzOiB7IGVudW1lcmFibGU6IHRydWUgfSxcblx0b2s6IHsgZW51bWVyYWJsZTogdHJ1ZSB9LFxuXHRyZWRpcmVjdGVkOiB7IGVudW1lcmFibGU6IHRydWUgfSxcblx0c3RhdHVzVGV4dDogeyBlbnVtZXJhYmxlOiB0cnVlIH0sXG5cdGhlYWRlcnM6IHsgZW51bWVyYWJsZTogdHJ1ZSB9LFxuXHRjbG9uZTogeyBlbnVtZXJhYmxlOiB0cnVlIH1cbn0pO1xuXG5PYmplY3QuZGVmaW5lUHJvcGVydHkoUmVzcG9uc2UucHJvdG90eXBlLCBTeW1ib2wudG9TdHJpbmdUYWcsIHtcblx0dmFsdWU6ICdSZXNwb25zZScsXG5cdHdyaXRhYmxlOiBmYWxzZSxcblx0ZW51bWVyYWJsZTogZmFsc2UsXG5cdGNvbmZpZ3VyYWJsZTogdHJ1ZVxufSk7XG5cbmNvbnN0IElOVEVSTkFMUyQyID0gU3ltYm9sKCdSZXF1ZXN0IGludGVybmFscycpO1xuY29uc3QgVVJMID0gVXJsLlVSTCB8fCB3aGF0d2dVcmwuVVJMO1xuXG4vLyBmaXggYW4gaXNzdWUgd2hlcmUgXCJmb3JtYXRcIiwgXCJwYXJzZVwiIGFyZW4ndCBhIG5hbWVkIGV4cG9ydCBmb3Igbm9kZSA8MTBcbmNvbnN0IHBhcnNlX3VybCA9IFVybC5wYXJzZTtcbmNvbnN0IGZvcm1hdF91cmwgPSBVcmwuZm9ybWF0O1xuXG4vKipcbiAqIFdyYXBwZXIgYXJvdW5kIGBuZXcgVVJMYCB0byBoYW5kbGUgYXJiaXRyYXJ5IFVSTHNcbiAqXG4gKiBAcGFyYW0gIHtzdHJpbmd9IHVybFN0clxuICogQHJldHVybiB7dm9pZH1cbiAqL1xuZnVuY3Rpb24gcGFyc2VVUkwodXJsU3RyKSB7XG5cdC8qXG4gXHRDaGVjayB3aGV0aGVyIHRoZSBVUkwgaXMgYWJzb2x1dGUgb3Igbm90XG4gXHRcdFNjaGVtZTogaHR0cHM6Ly90b29scy5pZXRmLm9yZy9odG1sL3JmYzM5ODYjc2VjdGlvbi0zLjFcbiBcdEFic29sdXRlIFVSTDogaHR0cHM6Ly90b29scy5pZXRmLm9yZy9odG1sL3JmYzM5ODYjc2VjdGlvbi00LjNcbiAqL1xuXHRpZiAoL15bYS16QS1aXVthLXpBLVpcXGQrXFwtLl0qOi8uZXhlYyh1cmxTdHIpKSB7XG5cdFx0dXJsU3RyID0gbmV3IFVSTCh1cmxTdHIpLnRvU3RyaW5nKCk7XG5cdH1cblxuXHQvLyBGYWxsYmFjayB0byBvbGQgaW1wbGVtZW50YXRpb24gZm9yIGFyYml0cmFyeSBVUkxzXG5cdHJldHVybiBwYXJzZV91cmwodXJsU3RyKTtcbn1cblxuY29uc3Qgc3RyZWFtRGVzdHJ1Y3Rpb25TdXBwb3J0ZWQgPSAnZGVzdHJveScgaW4gU3RyZWFtLlJlYWRhYmxlLnByb3RvdHlwZTtcblxuLyoqXG4gKiBDaGVjayBpZiBhIHZhbHVlIGlzIGFuIGluc3RhbmNlIG9mIFJlcXVlc3QuXG4gKlxuICogQHBhcmFtICAgTWl4ZWQgICBpbnB1dFxuICogQHJldHVybiAgQm9vbGVhblxuICovXG5mdW5jdGlvbiBpc1JlcXVlc3QoaW5wdXQpIHtcblx0cmV0dXJuIHR5cGVvZiBpbnB1dCA9PT0gJ29iamVjdCcgJiYgdHlwZW9mIGlucHV0W0lOVEVSTkFMUyQyXSA9PT0gJ29iamVjdCc7XG59XG5cbmZ1bmN0aW9uIGlzQWJvcnRTaWduYWwoc2lnbmFsKSB7XG5cdGNvbnN0IHByb3RvID0gc2lnbmFsICYmIHR5cGVvZiBzaWduYWwgPT09ICdvYmplY3QnICYmIE9iamVjdC5nZXRQcm90b3R5cGVPZihzaWduYWwpO1xuXHRyZXR1cm4gISEocHJvdG8gJiYgcHJvdG8uY29uc3RydWN0b3IubmFtZSA9PT0gJ0Fib3J0U2lnbmFsJyk7XG59XG5cbi8qKlxuICogUmVxdWVzdCBjbGFzc1xuICpcbiAqIEBwYXJhbSAgIE1peGVkICAgaW5wdXQgIFVybCBvciBSZXF1ZXN0IGluc3RhbmNlXG4gKiBAcGFyYW0gICBPYmplY3QgIGluaXQgICBDdXN0b20gb3B0aW9uc1xuICogQHJldHVybiAgVm9pZFxuICovXG5jbGFzcyBSZXF1ZXN0IHtcblx0Y29uc3RydWN0b3IoaW5wdXQpIHtcblx0XHRsZXQgaW5pdCA9IGFyZ3VtZW50cy5sZW5ndGggPiAxICYmIGFyZ3VtZW50c1sxXSAhPT0gdW5kZWZpbmVkID8gYXJndW1lbnRzWzFdIDoge307XG5cblx0XHRsZXQgcGFyc2VkVVJMO1xuXG5cdFx0Ly8gbm9ybWFsaXplIGlucHV0XG5cdFx0aWYgKCFpc1JlcXVlc3QoaW5wdXQpKSB7XG5cdFx0XHRpZiAoaW5wdXQgJiYgaW5wdXQuaHJlZikge1xuXHRcdFx0XHQvLyBpbiBvcmRlciB0byBzdXBwb3J0IE5vZGUuanMnIFVybCBvYmplY3RzOyB0aG91Z2ggV0hBVFdHJ3MgVVJMIG9iamVjdHNcblx0XHRcdFx0Ly8gd2lsbCBmYWxsIGludG8gdGhpcyBicmFuY2ggYWxzbyAoc2luY2UgdGhlaXIgYHRvU3RyaW5nKClgIHdpbGwgcmV0dXJuXG5cdFx0XHRcdC8vIGBocmVmYCBwcm9wZXJ0eSBhbnl3YXkpXG5cdFx0XHRcdHBhcnNlZFVSTCA9IHBhcnNlVVJMKGlucHV0LmhyZWYpO1xuXHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0Ly8gY29lcmNlIGlucHV0IHRvIGEgc3RyaW5nIGJlZm9yZSBhdHRlbXB0aW5nIHRvIHBhcnNlXG5cdFx0XHRcdHBhcnNlZFVSTCA9IHBhcnNlVVJMKGAke2lucHV0fWApO1xuXHRcdFx0fVxuXHRcdFx0aW5wdXQgPSB7fTtcblx0XHR9IGVsc2Uge1xuXHRcdFx0cGFyc2VkVVJMID0gcGFyc2VVUkwoaW5wdXQudXJsKTtcblx0XHR9XG5cblx0XHRsZXQgbWV0aG9kID0gaW5pdC5tZXRob2QgfHwgaW5wdXQubWV0aG9kIHx8ICdHRVQnO1xuXHRcdG1ldGhvZCA9IG1ldGhvZC50b1VwcGVyQ2FzZSgpO1xuXG5cdFx0aWYgKChpbml0LmJvZHkgIT0gbnVsbCB8fCBpc1JlcXVlc3QoaW5wdXQpICYmIGlucHV0LmJvZHkgIT09IG51bGwpICYmIChtZXRob2QgPT09ICdHRVQnIHx8IG1ldGhvZCA9PT0gJ0hFQUQnKSkge1xuXHRcdFx0dGhyb3cgbmV3IFR5cGVFcnJvcignUmVxdWVzdCB3aXRoIEdFVC9IRUFEIG1ldGhvZCBjYW5ub3QgaGF2ZSBib2R5Jyk7XG5cdFx0fVxuXG5cdFx0bGV0IGlucHV0Qm9keSA9IGluaXQuYm9keSAhPSBudWxsID8gaW5pdC5ib2R5IDogaXNSZXF1ZXN0KGlucHV0KSAmJiBpbnB1dC5ib2R5ICE9PSBudWxsID8gY2xvbmUoaW5wdXQpIDogbnVsbDtcblxuXHRcdEJvZHkuY2FsbCh0aGlzLCBpbnB1dEJvZHksIHtcblx0XHRcdHRpbWVvdXQ6IGluaXQudGltZW91dCB8fCBpbnB1dC50aW1lb3V0IHx8IDAsXG5cdFx0XHRzaXplOiBpbml0LnNpemUgfHwgaW5wdXQuc2l6ZSB8fCAwXG5cdFx0fSk7XG5cblx0XHRjb25zdCBoZWFkZXJzID0gbmV3IEhlYWRlcnMoaW5pdC5oZWFkZXJzIHx8IGlucHV0LmhlYWRlcnMgfHwge30pO1xuXG5cdFx0aWYgKGlucHV0Qm9keSAhPSBudWxsICYmICFoZWFkZXJzLmhhcygnQ29udGVudC1UeXBlJykpIHtcblx0XHRcdGNvbnN0IGNvbnRlbnRUeXBlID0gZXh0cmFjdENvbnRlbnRUeXBlKGlucHV0Qm9keSk7XG5cdFx0XHRpZiAoY29udGVudFR5cGUpIHtcblx0XHRcdFx0aGVhZGVycy5hcHBlbmQoJ0NvbnRlbnQtVHlwZScsIGNvbnRlbnRUeXBlKTtcblx0XHRcdH1cblx0XHR9XG5cblx0XHRsZXQgc2lnbmFsID0gaXNSZXF1ZXN0KGlucHV0KSA/IGlucHV0LnNpZ25hbCA6IG51bGw7XG5cdFx0aWYgKCdzaWduYWwnIGluIGluaXQpIHNpZ25hbCA9IGluaXQuc2lnbmFsO1xuXG5cdFx0aWYgKHNpZ25hbCAhPSBudWxsICYmICFpc0Fib3J0U2lnbmFsKHNpZ25hbCkpIHtcblx0XHRcdHRocm93IG5ldyBUeXBlRXJyb3IoJ0V4cGVjdGVkIHNpZ25hbCB0byBiZSBhbiBpbnN0YW5jZW9mIEFib3J0U2lnbmFsJyk7XG5cdFx0fVxuXG5cdFx0dGhpc1tJTlRFUk5BTFMkMl0gPSB7XG5cdFx0XHRtZXRob2QsXG5cdFx0XHRyZWRpcmVjdDogaW5pdC5yZWRpcmVjdCB8fCBpbnB1dC5yZWRpcmVjdCB8fCAnZm9sbG93Jyxcblx0XHRcdGhlYWRlcnMsXG5cdFx0XHRwYXJzZWRVUkwsXG5cdFx0XHRzaWduYWxcblx0XHR9O1xuXG5cdFx0Ly8gbm9kZS1mZXRjaC1vbmx5IG9wdGlvbnNcblx0XHR0aGlzLmZvbGxvdyA9IGluaXQuZm9sbG93ICE9PSB1bmRlZmluZWQgPyBpbml0LmZvbGxvdyA6IGlucHV0LmZvbGxvdyAhPT0gdW5kZWZpbmVkID8gaW5wdXQuZm9sbG93IDogMjA7XG5cdFx0dGhpcy5jb21wcmVzcyA9IGluaXQuY29tcHJlc3MgIT09IHVuZGVmaW5lZCA/IGluaXQuY29tcHJlc3MgOiBpbnB1dC5jb21wcmVzcyAhPT0gdW5kZWZpbmVkID8gaW5wdXQuY29tcHJlc3MgOiB0cnVlO1xuXHRcdHRoaXMuY291bnRlciA9IGluaXQuY291bnRlciB8fCBpbnB1dC5jb3VudGVyIHx8IDA7XG5cdFx0dGhpcy5hZ2VudCA9IGluaXQuYWdlbnQgfHwgaW5wdXQuYWdlbnQ7XG5cdH1cblxuXHRnZXQgbWV0aG9kKCkge1xuXHRcdHJldHVybiB0aGlzW0lOVEVSTkFMUyQyXS5tZXRob2Q7XG5cdH1cblxuXHRnZXQgdXJsKCkge1xuXHRcdHJldHVybiBmb3JtYXRfdXJsKHRoaXNbSU5URVJOQUxTJDJdLnBhcnNlZFVSTCk7XG5cdH1cblxuXHRnZXQgaGVhZGVycygpIHtcblx0XHRyZXR1cm4gdGhpc1tJTlRFUk5BTFMkMl0uaGVhZGVycztcblx0fVxuXG5cdGdldCByZWRpcmVjdCgpIHtcblx0XHRyZXR1cm4gdGhpc1tJTlRFUk5BTFMkMl0ucmVkaXJlY3Q7XG5cdH1cblxuXHRnZXQgc2lnbmFsKCkge1xuXHRcdHJldHVybiB0aGlzW0lOVEVSTkFMUyQyXS5zaWduYWw7XG5cdH1cblxuXHQvKipcbiAgKiBDbG9uZSB0aGlzIHJlcXVlc3RcbiAgKlxuICAqIEByZXR1cm4gIFJlcXVlc3RcbiAgKi9cblx0Y2xvbmUoKSB7XG5cdFx0cmV0dXJuIG5ldyBSZXF1ZXN0KHRoaXMpO1xuXHR9XG59XG5cbkJvZHkubWl4SW4oUmVxdWVzdC5wcm90b3R5cGUpO1xuXG5PYmplY3QuZGVmaW5lUHJvcGVydHkoUmVxdWVzdC5wcm90b3R5cGUsIFN5bWJvbC50b1N0cmluZ1RhZywge1xuXHR2YWx1ZTogJ1JlcXVlc3QnLFxuXHR3cml0YWJsZTogZmFsc2UsXG5cdGVudW1lcmFibGU6IGZhbHNlLFxuXHRjb25maWd1cmFibGU6IHRydWVcbn0pO1xuXG5PYmplY3QuZGVmaW5lUHJvcGVydGllcyhSZXF1ZXN0LnByb3RvdHlwZSwge1xuXHRtZXRob2Q6IHsgZW51bWVyYWJsZTogdHJ1ZSB9LFxuXHR1cmw6IHsgZW51bWVyYWJsZTogdHJ1ZSB9LFxuXHRoZWFkZXJzOiB7IGVudW1lcmFibGU6IHRydWUgfSxcblx0cmVkaXJlY3Q6IHsgZW51bWVyYWJsZTogdHJ1ZSB9LFxuXHRjbG9uZTogeyBlbnVtZXJhYmxlOiB0cnVlIH0sXG5cdHNpZ25hbDogeyBlbnVtZXJhYmxlOiB0cnVlIH1cbn0pO1xuXG4vKipcbiAqIENvbnZlcnQgYSBSZXF1ZXN0IHRvIE5vZGUuanMgaHR0cCByZXF1ZXN0IG9wdGlvbnMuXG4gKlxuICogQHBhcmFtICAgUmVxdWVzdCAgQSBSZXF1ZXN0IGluc3RhbmNlXG4gKiBAcmV0dXJuICBPYmplY3QgICBUaGUgb3B0aW9ucyBvYmplY3QgdG8gYmUgcGFzc2VkIHRvIGh0dHAucmVxdWVzdFxuICovXG5mdW5jdGlvbiBnZXROb2RlUmVxdWVzdE9wdGlvbnMocmVxdWVzdCkge1xuXHRjb25zdCBwYXJzZWRVUkwgPSByZXF1ZXN0W0lOVEVSTkFMUyQyXS5wYXJzZWRVUkw7XG5cdGNvbnN0IGhlYWRlcnMgPSBuZXcgSGVhZGVycyhyZXF1ZXN0W0lOVEVSTkFMUyQyXS5oZWFkZXJzKTtcblxuXHQvLyBmZXRjaCBzdGVwIDEuM1xuXHRpZiAoIWhlYWRlcnMuaGFzKCdBY2NlcHQnKSkge1xuXHRcdGhlYWRlcnMuc2V0KCdBY2NlcHQnLCAnKi8qJyk7XG5cdH1cblxuXHQvLyBCYXNpYyBmZXRjaFxuXHRpZiAoIXBhcnNlZFVSTC5wcm90b2NvbCB8fCAhcGFyc2VkVVJMLmhvc3RuYW1lKSB7XG5cdFx0dGhyb3cgbmV3IFR5cGVFcnJvcignT25seSBhYnNvbHV0ZSBVUkxzIGFyZSBzdXBwb3J0ZWQnKTtcblx0fVxuXG5cdGlmICghL15odHRwcz86JC8udGVzdChwYXJzZWRVUkwucHJvdG9jb2wpKSB7XG5cdFx0dGhyb3cgbmV3IFR5cGVFcnJvcignT25seSBIVFRQKFMpIHByb3RvY29scyBhcmUgc3VwcG9ydGVkJyk7XG5cdH1cblxuXHRpZiAocmVxdWVzdC5zaWduYWwgJiYgcmVxdWVzdC5ib2R5IGluc3RhbmNlb2YgU3RyZWFtLlJlYWRhYmxlICYmICFzdHJlYW1EZXN0cnVjdGlvblN1cHBvcnRlZCkge1xuXHRcdHRocm93IG5ldyBFcnJvcignQ2FuY2VsbGF0aW9uIG9mIHN0cmVhbWVkIHJlcXVlc3RzIHdpdGggQWJvcnRTaWduYWwgaXMgbm90IHN1cHBvcnRlZCBpbiBub2RlIDwgOCcpO1xuXHR9XG5cblx0Ly8gSFRUUC1uZXR3b3JrLW9yLWNhY2hlIGZldGNoIHN0ZXBzIDIuNC0yLjdcblx0bGV0IGNvbnRlbnRMZW5ndGhWYWx1ZSA9IG51bGw7XG5cdGlmIChyZXF1ZXN0LmJvZHkgPT0gbnVsbCAmJiAvXihQT1NUfFBVVCkkL2kudGVzdChyZXF1ZXN0Lm1ldGhvZCkpIHtcblx0XHRjb250ZW50TGVuZ3RoVmFsdWUgPSAnMCc7XG5cdH1cblx0aWYgKHJlcXVlc3QuYm9keSAhPSBudWxsKSB7XG5cdFx0Y29uc3QgdG90YWxCeXRlcyA9IGdldFRvdGFsQnl0ZXMocmVxdWVzdCk7XG5cdFx0aWYgKHR5cGVvZiB0b3RhbEJ5dGVzID09PSAnbnVtYmVyJykge1xuXHRcdFx0Y29udGVudExlbmd0aFZhbHVlID0gU3RyaW5nKHRvdGFsQnl0ZXMpO1xuXHRcdH1cblx0fVxuXHRpZiAoY29udGVudExlbmd0aFZhbHVlKSB7XG5cdFx0aGVhZGVycy5zZXQoJ0NvbnRlbnQtTGVuZ3RoJywgY29udGVudExlbmd0aFZhbHVlKTtcblx0fVxuXG5cdC8vIEhUVFAtbmV0d29yay1vci1jYWNoZSBmZXRjaCBzdGVwIDIuMTFcblx0aWYgKCFoZWFkZXJzLmhhcygnVXNlci1BZ2VudCcpKSB7XG5cdFx0aGVhZGVycy5zZXQoJ1VzZXItQWdlbnQnLCAnbm9kZS1mZXRjaC8xLjAgKCtodHRwczovL2dpdGh1Yi5jb20vYml0aW5uL25vZGUtZmV0Y2gpJyk7XG5cdH1cblxuXHQvLyBIVFRQLW5ldHdvcmstb3ItY2FjaGUgZmV0Y2ggc3RlcCAyLjE1XG5cdGlmIChyZXF1ZXN0LmNvbXByZXNzICYmICFoZWFkZXJzLmhhcygnQWNjZXB0LUVuY29kaW5nJykpIHtcblx0XHRoZWFkZXJzLnNldCgnQWNjZXB0LUVuY29kaW5nJywgJ2d6aXAsZGVmbGF0ZScpO1xuXHR9XG5cblx0bGV0IGFnZW50ID0gcmVxdWVzdC5hZ2VudDtcblx0aWYgKHR5cGVvZiBhZ2VudCA9PT0gJ2Z1bmN0aW9uJykge1xuXHRcdGFnZW50ID0gYWdlbnQocGFyc2VkVVJMKTtcblx0fVxuXG5cdC8vIEhUVFAtbmV0d29yayBmZXRjaCBzdGVwIDQuMlxuXHQvLyBjaHVua2VkIGVuY29kaW5nIGlzIGhhbmRsZWQgYnkgTm9kZS5qc1xuXG5cdHJldHVybiBPYmplY3QuYXNzaWduKHt9LCBwYXJzZWRVUkwsIHtcblx0XHRtZXRob2Q6IHJlcXVlc3QubWV0aG9kLFxuXHRcdGhlYWRlcnM6IGV4cG9ydE5vZGVDb21wYXRpYmxlSGVhZGVycyhoZWFkZXJzKSxcblx0XHRhZ2VudFxuXHR9KTtcbn1cblxuLyoqXG4gKiBhYm9ydC1lcnJvci5qc1xuICpcbiAqIEFib3J0RXJyb3IgaW50ZXJmYWNlIGZvciBjYW5jZWxsZWQgcmVxdWVzdHNcbiAqL1xuXG4vKipcbiAqIENyZWF0ZSBBYm9ydEVycm9yIGluc3RhbmNlXG4gKlxuICogQHBhcmFtICAgU3RyaW5nICAgICAgbWVzc2FnZSAgICAgIEVycm9yIG1lc3NhZ2UgZm9yIGh1bWFuXG4gKiBAcmV0dXJuICBBYm9ydEVycm9yXG4gKi9cbmZ1bmN0aW9uIEFib3J0RXJyb3IobWVzc2FnZSkge1xuICBFcnJvci5jYWxsKHRoaXMsIG1lc3NhZ2UpO1xuXG4gIHRoaXMudHlwZSA9ICdhYm9ydGVkJztcbiAgdGhpcy5tZXNzYWdlID0gbWVzc2FnZTtcblxuICAvLyBoaWRlIGN1c3RvbSBlcnJvciBpbXBsZW1lbnRhdGlvbiBkZXRhaWxzIGZyb20gZW5kLXVzZXJzXG4gIEVycm9yLmNhcHR1cmVTdGFja1RyYWNlKHRoaXMsIHRoaXMuY29uc3RydWN0b3IpO1xufVxuXG5BYm9ydEVycm9yLnByb3RvdHlwZSA9IE9iamVjdC5jcmVhdGUoRXJyb3IucHJvdG90eXBlKTtcbkFib3J0RXJyb3IucHJvdG90eXBlLmNvbnN0cnVjdG9yID0gQWJvcnRFcnJvcjtcbkFib3J0RXJyb3IucHJvdG90eXBlLm5hbWUgPSAnQWJvcnRFcnJvcic7XG5cbmNvbnN0IFVSTCQxID0gVXJsLlVSTCB8fCB3aGF0d2dVcmwuVVJMO1xuXG4vLyBmaXggYW4gaXNzdWUgd2hlcmUgXCJQYXNzVGhyb3VnaFwiLCBcInJlc29sdmVcIiBhcmVuJ3QgYSBuYW1lZCBleHBvcnQgZm9yIG5vZGUgPDEwXG5jb25zdCBQYXNzVGhyb3VnaCQxID0gU3RyZWFtLlBhc3NUaHJvdWdoO1xuXG5jb25zdCBpc0RvbWFpbk9yU3ViZG9tYWluID0gZnVuY3Rpb24gaXNEb21haW5PclN1YmRvbWFpbihkZXN0aW5hdGlvbiwgb3JpZ2luYWwpIHtcblx0Y29uc3Qgb3JpZyA9IG5ldyBVUkwkMShvcmlnaW5hbCkuaG9zdG5hbWU7XG5cdGNvbnN0IGRlc3QgPSBuZXcgVVJMJDEoZGVzdGluYXRpb24pLmhvc3RuYW1lO1xuXG5cdHJldHVybiBvcmlnID09PSBkZXN0IHx8IG9yaWdbb3JpZy5sZW5ndGggLSBkZXN0Lmxlbmd0aCAtIDFdID09PSAnLicgJiYgb3JpZy5lbmRzV2l0aChkZXN0KTtcbn07XG5cbi8qKlxuICogaXNTYW1lUHJvdG9jb2wgcmVwb3J0cyB3aGV0aGVyIHRoZSB0d28gcHJvdmlkZWQgVVJMcyB1c2UgdGhlIHNhbWUgcHJvdG9jb2wuXG4gKlxuICogQm90aCBkb21haW5zIG11c3QgYWxyZWFkeSBiZSBpbiBjYW5vbmljYWwgZm9ybS5cbiAqIEBwYXJhbSB7c3RyaW5nfFVSTH0gb3JpZ2luYWxcbiAqIEBwYXJhbSB7c3RyaW5nfFVSTH0gZGVzdGluYXRpb25cbiAqL1xuY29uc3QgaXNTYW1lUHJvdG9jb2wgPSBmdW5jdGlvbiBpc1NhbWVQcm90b2NvbChkZXN0aW5hdGlvbiwgb3JpZ2luYWwpIHtcblx0Y29uc3Qgb3JpZyA9IG5ldyBVUkwkMShvcmlnaW5hbCkucHJvdG9jb2w7XG5cdGNvbnN0IGRlc3QgPSBuZXcgVVJMJDEoZGVzdGluYXRpb24pLnByb3RvY29sO1xuXG5cdHJldHVybiBvcmlnID09PSBkZXN0O1xufTtcblxuLyoqXG4gKiBGZXRjaCBmdW5jdGlvblxuICpcbiAqIEBwYXJhbSAgIE1peGVkICAgIHVybCAgIEFic29sdXRlIHVybCBvciBSZXF1ZXN0IGluc3RhbmNlXG4gKiBAcGFyYW0gICBPYmplY3QgICBvcHRzICBGZXRjaCBvcHRpb25zXG4gKiBAcmV0dXJuICBQcm9taXNlXG4gKi9cbmZ1bmN0aW9uIGZldGNoKHVybCwgb3B0cykge1xuXG5cdC8vIGFsbG93IGN1c3RvbSBwcm9taXNlXG5cdGlmICghZmV0Y2guUHJvbWlzZSkge1xuXHRcdHRocm93IG5ldyBFcnJvcignbmF0aXZlIHByb21pc2UgbWlzc2luZywgc2V0IGZldGNoLlByb21pc2UgdG8geW91ciBmYXZvcml0ZSBhbHRlcm5hdGl2ZScpO1xuXHR9XG5cblx0Qm9keS5Qcm9taXNlID0gZmV0Y2guUHJvbWlzZTtcblxuXHQvLyB3cmFwIGh0dHAucmVxdWVzdCBpbnRvIGZldGNoXG5cdHJldHVybiBuZXcgZmV0Y2guUHJvbWlzZShmdW5jdGlvbiAocmVzb2x2ZSwgcmVqZWN0KSB7XG5cdFx0Ly8gYnVpbGQgcmVxdWVzdCBvYmplY3Rcblx0XHRjb25zdCByZXF1ZXN0ID0gbmV3IFJlcXVlc3QodXJsLCBvcHRzKTtcblx0XHRjb25zdCBvcHRpb25zID0gZ2V0Tm9kZVJlcXVlc3RPcHRpb25zKHJlcXVlc3QpO1xuXG5cdFx0Y29uc3Qgc2VuZCA9IChvcHRpb25zLnByb3RvY29sID09PSAnaHR0cHM6JyA/IGh0dHBzIDogaHR0cCkucmVxdWVzdDtcblx0XHRjb25zdCBzaWduYWwgPSByZXF1ZXN0LnNpZ25hbDtcblxuXHRcdGxldCByZXNwb25zZSA9IG51bGw7XG5cblx0XHRjb25zdCBhYm9ydCA9IGZ1bmN0aW9uIGFib3J0KCkge1xuXHRcdFx0bGV0IGVycm9yID0gbmV3IEFib3J0RXJyb3IoJ1RoZSB1c2VyIGFib3J0ZWQgYSByZXF1ZXN0LicpO1xuXHRcdFx0cmVqZWN0KGVycm9yKTtcblx0XHRcdGlmIChyZXF1ZXN0LmJvZHkgJiYgcmVxdWVzdC5ib2R5IGluc3RhbmNlb2YgU3RyZWFtLlJlYWRhYmxlKSB7XG5cdFx0XHRcdGRlc3Ryb3lTdHJlYW0ocmVxdWVzdC5ib2R5LCBlcnJvcik7XG5cdFx0XHR9XG5cdFx0XHRpZiAoIXJlc3BvbnNlIHx8ICFyZXNwb25zZS5ib2R5KSByZXR1cm47XG5cdFx0XHRyZXNwb25zZS5ib2R5LmVtaXQoJ2Vycm9yJywgZXJyb3IpO1xuXHRcdH07XG5cblx0XHRpZiAoc2lnbmFsICYmIHNpZ25hbC5hYm9ydGVkKSB7XG5cdFx0XHRhYm9ydCgpO1xuXHRcdFx0cmV0dXJuO1xuXHRcdH1cblxuXHRcdGNvbnN0IGFib3J0QW5kRmluYWxpemUgPSBmdW5jdGlvbiBhYm9ydEFuZEZpbmFsaXplKCkge1xuXHRcdFx0YWJvcnQoKTtcblx0XHRcdGZpbmFsaXplKCk7XG5cdFx0fTtcblxuXHRcdC8vIHNlbmQgcmVxdWVzdFxuXHRcdGNvbnN0IHJlcSA9IHNlbmQob3B0aW9ucyk7XG5cdFx0bGV0IHJlcVRpbWVvdXQ7XG5cblx0XHRpZiAoc2lnbmFsKSB7XG5cdFx0XHRzaWduYWwuYWRkRXZlbnRMaXN0ZW5lcignYWJvcnQnLCBhYm9ydEFuZEZpbmFsaXplKTtcblx0XHR9XG5cblx0XHRmdW5jdGlvbiBmaW5hbGl6ZSgpIHtcblx0XHRcdHJlcS5hYm9ydCgpO1xuXHRcdFx0aWYgKHNpZ25hbCkgc2lnbmFsLnJlbW92ZUV2ZW50TGlzdGVuZXIoJ2Fib3J0JywgYWJvcnRBbmRGaW5hbGl6ZSk7XG5cdFx0XHRjbGVhclRpbWVvdXQocmVxVGltZW91dCk7XG5cdFx0fVxuXG5cdFx0aWYgKHJlcXVlc3QudGltZW91dCkge1xuXHRcdFx0cmVxLm9uY2UoJ3NvY2tldCcsIGZ1bmN0aW9uIChzb2NrZXQpIHtcblx0XHRcdFx0cmVxVGltZW91dCA9IHNldFRpbWVvdXQoZnVuY3Rpb24gKCkge1xuXHRcdFx0XHRcdHJlamVjdChuZXcgRmV0Y2hFcnJvcihgbmV0d29yayB0aW1lb3V0IGF0OiAke3JlcXVlc3QudXJsfWAsICdyZXF1ZXN0LXRpbWVvdXQnKSk7XG5cdFx0XHRcdFx0ZmluYWxpemUoKTtcblx0XHRcdFx0fSwgcmVxdWVzdC50aW1lb3V0KTtcblx0XHRcdH0pO1xuXHRcdH1cblxuXHRcdHJlcS5vbignZXJyb3InLCBmdW5jdGlvbiAoZXJyKSB7XG5cdFx0XHRyZWplY3QobmV3IEZldGNoRXJyb3IoYHJlcXVlc3QgdG8gJHtyZXF1ZXN0LnVybH0gZmFpbGVkLCByZWFzb246ICR7ZXJyLm1lc3NhZ2V9YCwgJ3N5c3RlbScsIGVycikpO1xuXG5cdFx0XHRpZiAocmVzcG9uc2UgJiYgcmVzcG9uc2UuYm9keSkge1xuXHRcdFx0XHRkZXN0cm95U3RyZWFtKHJlc3BvbnNlLmJvZHksIGVycik7XG5cdFx0XHR9XG5cblx0XHRcdGZpbmFsaXplKCk7XG5cdFx0fSk7XG5cblx0XHRmaXhSZXNwb25zZUNodW5rZWRUcmFuc2ZlckJhZEVuZGluZyhyZXEsIGZ1bmN0aW9uIChlcnIpIHtcblx0XHRcdGlmIChzaWduYWwgJiYgc2lnbmFsLmFib3J0ZWQpIHtcblx0XHRcdFx0cmV0dXJuO1xuXHRcdFx0fVxuXG5cdFx0XHRpZiAocmVzcG9uc2UgJiYgcmVzcG9uc2UuYm9keSkge1xuXHRcdFx0XHRkZXN0cm95U3RyZWFtKHJlc3BvbnNlLmJvZHksIGVycik7XG5cdFx0XHR9XG5cdFx0fSk7XG5cblx0XHQvKiBjOCBpZ25vcmUgbmV4dCAxOCAqL1xuXHRcdGlmIChwYXJzZUludChwcm9jZXNzLnZlcnNpb24uc3Vic3RyaW5nKDEpKSA8IDE0KSB7XG5cdFx0XHQvLyBCZWZvcmUgTm9kZS5qcyAxNCwgcGlwZWxpbmUoKSBkb2VzIG5vdCBmdWxseSBzdXBwb3J0IGFzeW5jIGl0ZXJhdG9ycyBhbmQgZG9lcyBub3QgYWx3YXlzXG5cdFx0XHQvLyBwcm9wZXJseSBoYW5kbGUgd2hlbiB0aGUgc29ja2V0IGNsb3NlL2VuZCBldmVudHMgYXJlIG91dCBvZiBvcmRlci5cblx0XHRcdHJlcS5vbignc29ja2V0JywgZnVuY3Rpb24gKHMpIHtcblx0XHRcdFx0cy5hZGRMaXN0ZW5lcignY2xvc2UnLCBmdW5jdGlvbiAoaGFkRXJyb3IpIHtcblx0XHRcdFx0XHQvLyBpZiBhIGRhdGEgbGlzdGVuZXIgaXMgc3RpbGwgcHJlc2VudCB3ZSBkaWRuJ3QgZW5kIGNsZWFubHlcblx0XHRcdFx0XHRjb25zdCBoYXNEYXRhTGlzdGVuZXIgPSBzLmxpc3RlbmVyQ291bnQoJ2RhdGEnKSA+IDA7XG5cblx0XHRcdFx0XHQvLyBpZiBlbmQgaGFwcGVuZWQgYmVmb3JlIGNsb3NlIGJ1dCB0aGUgc29ja2V0IGRpZG4ndCBlbWl0IGFuIGVycm9yLCBkbyBpdCBub3dcblx0XHRcdFx0XHRpZiAocmVzcG9uc2UgJiYgaGFzRGF0YUxpc3RlbmVyICYmICFoYWRFcnJvciAmJiAhKHNpZ25hbCAmJiBzaWduYWwuYWJvcnRlZCkpIHtcblx0XHRcdFx0XHRcdGNvbnN0IGVyciA9IG5ldyBFcnJvcignUHJlbWF0dXJlIGNsb3NlJyk7XG5cdFx0XHRcdFx0XHRlcnIuY29kZSA9ICdFUlJfU1RSRUFNX1BSRU1BVFVSRV9DTE9TRSc7XG5cdFx0XHRcdFx0XHRyZXNwb25zZS5ib2R5LmVtaXQoJ2Vycm9yJywgZXJyKTtcblx0XHRcdFx0XHR9XG5cdFx0XHRcdH0pO1xuXHRcdFx0fSk7XG5cdFx0fVxuXG5cdFx0cmVxLm9uKCdyZXNwb25zZScsIGZ1bmN0aW9uIChyZXMpIHtcblx0XHRcdGNsZWFyVGltZW91dChyZXFUaW1lb3V0KTtcblxuXHRcdFx0Y29uc3QgaGVhZGVycyA9IGNyZWF0ZUhlYWRlcnNMZW5pZW50KHJlcy5oZWFkZXJzKTtcblxuXHRcdFx0Ly8gSFRUUCBmZXRjaCBzdGVwIDVcblx0XHRcdGlmIChmZXRjaC5pc1JlZGlyZWN0KHJlcy5zdGF0dXNDb2RlKSkge1xuXHRcdFx0XHQvLyBIVFRQIGZldGNoIHN0ZXAgNS4yXG5cdFx0XHRcdGNvbnN0IGxvY2F0aW9uID0gaGVhZGVycy5nZXQoJ0xvY2F0aW9uJyk7XG5cblx0XHRcdFx0Ly8gSFRUUCBmZXRjaCBzdGVwIDUuM1xuXHRcdFx0XHRsZXQgbG9jYXRpb25VUkwgPSBudWxsO1xuXHRcdFx0XHR0cnkge1xuXHRcdFx0XHRcdGxvY2F0aW9uVVJMID0gbG9jYXRpb24gPT09IG51bGwgPyBudWxsIDogbmV3IFVSTCQxKGxvY2F0aW9uLCByZXF1ZXN0LnVybCkudG9TdHJpbmcoKTtcblx0XHRcdFx0fSBjYXRjaCAoZXJyKSB7XG5cdFx0XHRcdFx0Ly8gZXJyb3IgaGVyZSBjYW4gb25seSBiZSBpbnZhbGlkIFVSTCBpbiBMb2NhdGlvbjogaGVhZGVyXG5cdFx0XHRcdFx0Ly8gZG8gbm90IHRocm93IHdoZW4gb3B0aW9ucy5yZWRpcmVjdCA9PSBtYW51YWxcblx0XHRcdFx0XHQvLyBsZXQgdGhlIHVzZXIgZXh0cmFjdCB0aGUgZXJyb3JuZW91cyByZWRpcmVjdCBVUkxcblx0XHRcdFx0XHRpZiAocmVxdWVzdC5yZWRpcmVjdCAhPT0gJ21hbnVhbCcpIHtcblx0XHRcdFx0XHRcdHJlamVjdChuZXcgRmV0Y2hFcnJvcihgdXJpIHJlcXVlc3RlZCByZXNwb25kcyB3aXRoIGFuIGludmFsaWQgcmVkaXJlY3QgVVJMOiAke2xvY2F0aW9ufWAsICdpbnZhbGlkLXJlZGlyZWN0JykpO1xuXHRcdFx0XHRcdFx0ZmluYWxpemUoKTtcblx0XHRcdFx0XHRcdHJldHVybjtcblx0XHRcdFx0XHR9XG5cdFx0XHRcdH1cblxuXHRcdFx0XHQvLyBIVFRQIGZldGNoIHN0ZXAgNS41XG5cdFx0XHRcdHN3aXRjaCAocmVxdWVzdC5yZWRpcmVjdCkge1xuXHRcdFx0XHRcdGNhc2UgJ2Vycm9yJzpcblx0XHRcdFx0XHRcdHJlamVjdChuZXcgRmV0Y2hFcnJvcihgdXJpIHJlcXVlc3RlZCByZXNwb25kcyB3aXRoIGEgcmVkaXJlY3QsIHJlZGlyZWN0IG1vZGUgaXMgc2V0IHRvIGVycm9yOiAke3JlcXVlc3QudXJsfWAsICduby1yZWRpcmVjdCcpKTtcblx0XHRcdFx0XHRcdGZpbmFsaXplKCk7XG5cdFx0XHRcdFx0XHRyZXR1cm47XG5cdFx0XHRcdFx0Y2FzZSAnbWFudWFsJzpcblx0XHRcdFx0XHRcdC8vIG5vZGUtZmV0Y2gtc3BlY2lmaWMgc3RlcDogbWFrZSBtYW51YWwgcmVkaXJlY3QgYSBiaXQgZWFzaWVyIHRvIHVzZSBieSBzZXR0aW5nIHRoZSBMb2NhdGlvbiBoZWFkZXIgdmFsdWUgdG8gdGhlIHJlc29sdmVkIFVSTC5cblx0XHRcdFx0XHRcdGlmIChsb2NhdGlvblVSTCAhPT0gbnVsbCkge1xuXHRcdFx0XHRcdFx0XHQvLyBoYW5kbGUgY29ycnVwdGVkIGhlYWRlclxuXHRcdFx0XHRcdFx0XHR0cnkge1xuXHRcdFx0XHRcdFx0XHRcdGhlYWRlcnMuc2V0KCdMb2NhdGlvbicsIGxvY2F0aW9uVVJMKTtcblx0XHRcdFx0XHRcdFx0fSBjYXRjaCAoZXJyKSB7XG5cdFx0XHRcdFx0XHRcdFx0Ly8gaXN0YW5idWwgaWdub3JlIG5leHQ6IG5vZGVqcyBzZXJ2ZXIgcHJldmVudCBpbnZhbGlkIHJlc3BvbnNlIGhlYWRlcnMsIHdlIGNhbid0IHRlc3QgdGhpcyB0aHJvdWdoIG5vcm1hbCByZXF1ZXN0XG5cdFx0XHRcdFx0XHRcdFx0cmVqZWN0KGVycik7XG5cdFx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHRcdGJyZWFrO1xuXHRcdFx0XHRcdGNhc2UgJ2ZvbGxvdyc6XG5cdFx0XHRcdFx0XHQvLyBIVFRQLXJlZGlyZWN0IGZldGNoIHN0ZXAgMlxuXHRcdFx0XHRcdFx0aWYgKGxvY2F0aW9uVVJMID09PSBudWxsKSB7XG5cdFx0XHRcdFx0XHRcdGJyZWFrO1xuXHRcdFx0XHRcdFx0fVxuXG5cdFx0XHRcdFx0XHQvLyBIVFRQLXJlZGlyZWN0IGZldGNoIHN0ZXAgNVxuXHRcdFx0XHRcdFx0aWYgKHJlcXVlc3QuY291bnRlciA+PSByZXF1ZXN0LmZvbGxvdykge1xuXHRcdFx0XHRcdFx0XHRyZWplY3QobmV3IEZldGNoRXJyb3IoYG1heGltdW0gcmVkaXJlY3QgcmVhY2hlZCBhdDogJHtyZXF1ZXN0LnVybH1gLCAnbWF4LXJlZGlyZWN0JykpO1xuXHRcdFx0XHRcdFx0XHRmaW5hbGl6ZSgpO1xuXHRcdFx0XHRcdFx0XHRyZXR1cm47XG5cdFx0XHRcdFx0XHR9XG5cblx0XHRcdFx0XHRcdC8vIEhUVFAtcmVkaXJlY3QgZmV0Y2ggc3RlcCA2IChjb3VudGVyIGluY3JlbWVudClcblx0XHRcdFx0XHRcdC8vIENyZWF0ZSBhIG5ldyBSZXF1ZXN0IG9iamVjdC5cblx0XHRcdFx0XHRcdGNvbnN0IHJlcXVlc3RPcHRzID0ge1xuXHRcdFx0XHRcdFx0XHRoZWFkZXJzOiBuZXcgSGVhZGVycyhyZXF1ZXN0LmhlYWRlcnMpLFxuXHRcdFx0XHRcdFx0XHRmb2xsb3c6IHJlcXVlc3QuZm9sbG93LFxuXHRcdFx0XHRcdFx0XHRjb3VudGVyOiByZXF1ZXN0LmNvdW50ZXIgKyAxLFxuXHRcdFx0XHRcdFx0XHRhZ2VudDogcmVxdWVzdC5hZ2VudCxcblx0XHRcdFx0XHRcdFx0Y29tcHJlc3M6IHJlcXVlc3QuY29tcHJlc3MsXG5cdFx0XHRcdFx0XHRcdG1ldGhvZDogcmVxdWVzdC5tZXRob2QsXG5cdFx0XHRcdFx0XHRcdGJvZHk6IHJlcXVlc3QuYm9keSxcblx0XHRcdFx0XHRcdFx0c2lnbmFsOiByZXF1ZXN0LnNpZ25hbCxcblx0XHRcdFx0XHRcdFx0dGltZW91dDogcmVxdWVzdC50aW1lb3V0LFxuXHRcdFx0XHRcdFx0XHRzaXplOiByZXF1ZXN0LnNpemVcblx0XHRcdFx0XHRcdH07XG5cblx0XHRcdFx0XHRcdGlmICghaXNEb21haW5PclN1YmRvbWFpbihyZXF1ZXN0LnVybCwgbG9jYXRpb25VUkwpIHx8ICFpc1NhbWVQcm90b2NvbChyZXF1ZXN0LnVybCwgbG9jYXRpb25VUkwpKSB7XG5cdFx0XHRcdFx0XHRcdGZvciAoY29uc3QgbmFtZSBvZiBbJ2F1dGhvcml6YXRpb24nLCAnd3d3LWF1dGhlbnRpY2F0ZScsICdjb29raWUnLCAnY29va2llMiddKSB7XG5cdFx0XHRcdFx0XHRcdFx0cmVxdWVzdE9wdHMuaGVhZGVycy5kZWxldGUobmFtZSk7XG5cdFx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHRcdH1cblxuXHRcdFx0XHRcdFx0Ly8gSFRUUC1yZWRpcmVjdCBmZXRjaCBzdGVwIDlcblx0XHRcdFx0XHRcdGlmIChyZXMuc3RhdHVzQ29kZSAhPT0gMzAzICYmIHJlcXVlc3QuYm9keSAmJiBnZXRUb3RhbEJ5dGVzKHJlcXVlc3QpID09PSBudWxsKSB7XG5cdFx0XHRcdFx0XHRcdHJlamVjdChuZXcgRmV0Y2hFcnJvcignQ2Fubm90IGZvbGxvdyByZWRpcmVjdCB3aXRoIGJvZHkgYmVpbmcgYSByZWFkYWJsZSBzdHJlYW0nLCAndW5zdXBwb3J0ZWQtcmVkaXJlY3QnKSk7XG5cdFx0XHRcdFx0XHRcdGZpbmFsaXplKCk7XG5cdFx0XHRcdFx0XHRcdHJldHVybjtcblx0XHRcdFx0XHRcdH1cblxuXHRcdFx0XHRcdFx0Ly8gSFRUUC1yZWRpcmVjdCBmZXRjaCBzdGVwIDExXG5cdFx0XHRcdFx0XHRpZiAocmVzLnN0YXR1c0NvZGUgPT09IDMwMyB8fCAocmVzLnN0YXR1c0NvZGUgPT09IDMwMSB8fCByZXMuc3RhdHVzQ29kZSA9PT0gMzAyKSAmJiByZXF1ZXN0Lm1ldGhvZCA9PT0gJ1BPU1QnKSB7XG5cdFx0XHRcdFx0XHRcdHJlcXVlc3RPcHRzLm1ldGhvZCA9ICdHRVQnO1xuXHRcdFx0XHRcdFx0XHRyZXF1ZXN0T3B0cy5ib2R5ID0gdW5kZWZpbmVkO1xuXHRcdFx0XHRcdFx0XHRyZXF1ZXN0T3B0cy5oZWFkZXJzLmRlbGV0ZSgnY29udGVudC1sZW5ndGgnKTtcblx0XHRcdFx0XHRcdH1cblxuXHRcdFx0XHRcdFx0Ly8gSFRUUC1yZWRpcmVjdCBmZXRjaCBzdGVwIDE1XG5cdFx0XHRcdFx0XHRyZXNvbHZlKGZldGNoKG5ldyBSZXF1ZXN0KGxvY2F0aW9uVVJMLCByZXF1ZXN0T3B0cykpKTtcblx0XHRcdFx0XHRcdGZpbmFsaXplKCk7XG5cdFx0XHRcdFx0XHRyZXR1cm47XG5cdFx0XHRcdH1cblx0XHRcdH1cblxuXHRcdFx0Ly8gcHJlcGFyZSByZXNwb25zZVxuXHRcdFx0cmVzLm9uY2UoJ2VuZCcsIGZ1bmN0aW9uICgpIHtcblx0XHRcdFx0aWYgKHNpZ25hbCkgc2lnbmFsLnJlbW92ZUV2ZW50TGlzdGVuZXIoJ2Fib3J0JywgYWJvcnRBbmRGaW5hbGl6ZSk7XG5cdFx0XHR9KTtcblx0XHRcdGxldCBib2R5ID0gcmVzLnBpcGUobmV3IFBhc3NUaHJvdWdoJDEoKSk7XG5cblx0XHRcdGNvbnN0IHJlc3BvbnNlX29wdGlvbnMgPSB7XG5cdFx0XHRcdHVybDogcmVxdWVzdC51cmwsXG5cdFx0XHRcdHN0YXR1czogcmVzLnN0YXR1c0NvZGUsXG5cdFx0XHRcdHN0YXR1c1RleHQ6IHJlcy5zdGF0dXNNZXNzYWdlLFxuXHRcdFx0XHRoZWFkZXJzOiBoZWFkZXJzLFxuXHRcdFx0XHRzaXplOiByZXF1ZXN0LnNpemUsXG5cdFx0XHRcdHRpbWVvdXQ6IHJlcXVlc3QudGltZW91dCxcblx0XHRcdFx0Y291bnRlcjogcmVxdWVzdC5jb3VudGVyXG5cdFx0XHR9O1xuXG5cdFx0XHQvLyBIVFRQLW5ldHdvcmsgZmV0Y2ggc3RlcCAxMi4xLjEuM1xuXHRcdFx0Y29uc3QgY29kaW5ncyA9IGhlYWRlcnMuZ2V0KCdDb250ZW50LUVuY29kaW5nJyk7XG5cblx0XHRcdC8vIEhUVFAtbmV0d29yayBmZXRjaCBzdGVwIDEyLjEuMS40OiBoYW5kbGUgY29udGVudCBjb2RpbmdzXG5cblx0XHRcdC8vIGluIGZvbGxvd2luZyBzY2VuYXJpb3Mgd2UgaWdub3JlIGNvbXByZXNzaW9uIHN1cHBvcnRcblx0XHRcdC8vIDEuIGNvbXByZXNzaW9uIHN1cHBvcnQgaXMgZGlzYWJsZWRcblx0XHRcdC8vIDIuIEhFQUQgcmVxdWVzdFxuXHRcdFx0Ly8gMy4gbm8gQ29udGVudC1FbmNvZGluZyBoZWFkZXJcblx0XHRcdC8vIDQuIG5vIGNvbnRlbnQgcmVzcG9uc2UgKDIwNClcblx0XHRcdC8vIDUuIGNvbnRlbnQgbm90IG1vZGlmaWVkIHJlc3BvbnNlICgzMDQpXG5cdFx0XHRpZiAoIXJlcXVlc3QuY29tcHJlc3MgfHwgcmVxdWVzdC5tZXRob2QgPT09ICdIRUFEJyB8fCBjb2RpbmdzID09PSBudWxsIHx8IHJlcy5zdGF0dXNDb2RlID09PSAyMDQgfHwgcmVzLnN0YXR1c0NvZGUgPT09IDMwNCkge1xuXHRcdFx0XHRyZXNwb25zZSA9IG5ldyBSZXNwb25zZShib2R5LCByZXNwb25zZV9vcHRpb25zKTtcblx0XHRcdFx0cmVzb2x2ZShyZXNwb25zZSk7XG5cdFx0XHRcdHJldHVybjtcblx0XHRcdH1cblxuXHRcdFx0Ly8gRm9yIE5vZGUgdjYrXG5cdFx0XHQvLyBCZSBsZXNzIHN0cmljdCB3aGVuIGRlY29kaW5nIGNvbXByZXNzZWQgcmVzcG9uc2VzLCBzaW5jZSBzb21ldGltZXNcblx0XHRcdC8vIHNlcnZlcnMgc2VuZCBzbGlnaHRseSBpbnZhbGlkIHJlc3BvbnNlcyB0aGF0IGFyZSBzdGlsbCBhY2NlcHRlZFxuXHRcdFx0Ly8gYnkgY29tbW9uIGJyb3dzZXJzLlxuXHRcdFx0Ly8gQWx3YXlzIHVzaW5nIFpfU1lOQ19GTFVTSCBpcyB3aGF0IGNVUkwgZG9lcy5cblx0XHRcdGNvbnN0IHpsaWJPcHRpb25zID0ge1xuXHRcdFx0XHRmbHVzaDogemxpYi5aX1NZTkNfRkxVU0gsXG5cdFx0XHRcdGZpbmlzaEZsdXNoOiB6bGliLlpfU1lOQ19GTFVTSFxuXHRcdFx0fTtcblxuXHRcdFx0Ly8gZm9yIGd6aXBcblx0XHRcdGlmIChjb2RpbmdzID09ICdnemlwJyB8fCBjb2RpbmdzID09ICd4LWd6aXAnKSB7XG5cdFx0XHRcdGJvZHkgPSBib2R5LnBpcGUoemxpYi5jcmVhdGVHdW56aXAoemxpYk9wdGlvbnMpKTtcblx0XHRcdFx0cmVzcG9uc2UgPSBuZXcgUmVzcG9uc2UoYm9keSwgcmVzcG9uc2Vfb3B0aW9ucyk7XG5cdFx0XHRcdHJlc29sdmUocmVzcG9uc2UpO1xuXHRcdFx0XHRyZXR1cm47XG5cdFx0XHR9XG5cblx0XHRcdC8vIGZvciBkZWZsYXRlXG5cdFx0XHRpZiAoY29kaW5ncyA9PSAnZGVmbGF0ZScgfHwgY29kaW5ncyA9PSAneC1kZWZsYXRlJykge1xuXHRcdFx0XHQvLyBoYW5kbGUgdGhlIGluZmFtb3VzIHJhdyBkZWZsYXRlIHJlc3BvbnNlIGZyb20gb2xkIHNlcnZlcnNcblx0XHRcdFx0Ly8gYSBoYWNrIGZvciBvbGQgSUlTIGFuZCBBcGFjaGUgc2VydmVyc1xuXHRcdFx0XHRjb25zdCByYXcgPSByZXMucGlwZShuZXcgUGFzc1Rocm91Z2gkMSgpKTtcblx0XHRcdFx0cmF3Lm9uY2UoJ2RhdGEnLCBmdW5jdGlvbiAoY2h1bmspIHtcblx0XHRcdFx0XHQvLyBzZWUgaHR0cDovL3N0YWNrb3ZlcmZsb3cuY29tL3F1ZXN0aW9ucy8zNzUxOTgyOFxuXHRcdFx0XHRcdGlmICgoY2h1bmtbMF0gJiAweDBGKSA9PT0gMHgwOCkge1xuXHRcdFx0XHRcdFx0Ym9keSA9IGJvZHkucGlwZSh6bGliLmNyZWF0ZUluZmxhdGUoKSk7XG5cdFx0XHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0XHRcdGJvZHkgPSBib2R5LnBpcGUoemxpYi5jcmVhdGVJbmZsYXRlUmF3KCkpO1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0XHRyZXNwb25zZSA9IG5ldyBSZXNwb25zZShib2R5LCByZXNwb25zZV9vcHRpb25zKTtcblx0XHRcdFx0XHRyZXNvbHZlKHJlc3BvbnNlKTtcblx0XHRcdFx0fSk7XG5cdFx0XHRcdHJhdy5vbignZW5kJywgZnVuY3Rpb24gKCkge1xuXHRcdFx0XHRcdC8vIHNvbWUgb2xkIElJUyBzZXJ2ZXJzIHJldHVybiB6ZXJvLWxlbmd0aCBPSyBkZWZsYXRlIHJlc3BvbnNlcywgc28gJ2RhdGEnIGlzIG5ldmVyIGVtaXR0ZWQuXG5cdFx0XHRcdFx0aWYgKCFyZXNwb25zZSkge1xuXHRcdFx0XHRcdFx0cmVzcG9uc2UgPSBuZXcgUmVzcG9uc2UoYm9keSwgcmVzcG9uc2Vfb3B0aW9ucyk7XG5cdFx0XHRcdFx0XHRyZXNvbHZlKHJlc3BvbnNlKTtcblx0XHRcdFx0XHR9XG5cdFx0XHRcdH0pO1xuXHRcdFx0XHRyZXR1cm47XG5cdFx0XHR9XG5cblx0XHRcdC8vIGZvciBiclxuXHRcdFx0aWYgKGNvZGluZ3MgPT0gJ2JyJyAmJiB0eXBlb2YgemxpYi5jcmVhdGVCcm90bGlEZWNvbXByZXNzID09PSAnZnVuY3Rpb24nKSB7XG5cdFx0XHRcdGJvZHkgPSBib2R5LnBpcGUoemxpYi5jcmVhdGVCcm90bGlEZWNvbXByZXNzKCkpO1xuXHRcdFx0XHRyZXNwb25zZSA9IG5ldyBSZXNwb25zZShib2R5LCByZXNwb25zZV9vcHRpb25zKTtcblx0XHRcdFx0cmVzb2x2ZShyZXNwb25zZSk7XG5cdFx0XHRcdHJldHVybjtcblx0XHRcdH1cblxuXHRcdFx0Ly8gb3RoZXJ3aXNlLCB1c2UgcmVzcG9uc2UgYXMtaXNcblx0XHRcdHJlc3BvbnNlID0gbmV3IFJlc3BvbnNlKGJvZHksIHJlc3BvbnNlX29wdGlvbnMpO1xuXHRcdFx0cmVzb2x2ZShyZXNwb25zZSk7XG5cdFx0fSk7XG5cblx0XHR3cml0ZVRvU3RyZWFtKHJlcSwgcmVxdWVzdCk7XG5cdH0pO1xufVxuZnVuY3Rpb24gZml4UmVzcG9uc2VDaHVua2VkVHJhbnNmZXJCYWRFbmRpbmcocmVxdWVzdCwgZXJyb3JDYWxsYmFjaykge1xuXHRsZXQgc29ja2V0O1xuXG5cdHJlcXVlc3Qub24oJ3NvY2tldCcsIGZ1bmN0aW9uIChzKSB7XG5cdFx0c29ja2V0ID0gcztcblx0fSk7XG5cblx0cmVxdWVzdC5vbigncmVzcG9uc2UnLCBmdW5jdGlvbiAocmVzcG9uc2UpIHtcblx0XHRjb25zdCBoZWFkZXJzID0gcmVzcG9uc2UuaGVhZGVycztcblxuXHRcdGlmIChoZWFkZXJzWyd0cmFuc2Zlci1lbmNvZGluZyddID09PSAnY2h1bmtlZCcgJiYgIWhlYWRlcnNbJ2NvbnRlbnQtbGVuZ3RoJ10pIHtcblx0XHRcdHJlc3BvbnNlLm9uY2UoJ2Nsb3NlJywgZnVuY3Rpb24gKGhhZEVycm9yKSB7XG5cdFx0XHRcdC8vIHRlc3RzIGZvciBzb2NrZXQgcHJlc2VuY2UsIGFzIGluIHNvbWUgc2l0dWF0aW9ucyB0aGVcblx0XHRcdFx0Ly8gdGhlICdzb2NrZXQnIGV2ZW50IGlzIG5vdCB0cmlnZ2VyZWQgZm9yIHRoZSByZXF1ZXN0XG5cdFx0XHRcdC8vIChoYXBwZW5zIGluIGRlbm8pLCBhdm9pZHMgYFR5cGVFcnJvcmBcblx0XHRcdFx0Ly8gaWYgYSBkYXRhIGxpc3RlbmVyIGlzIHN0aWxsIHByZXNlbnQgd2UgZGlkbid0IGVuZCBjbGVhbmx5XG5cdFx0XHRcdGNvbnN0IGhhc0RhdGFMaXN0ZW5lciA9IHNvY2tldCAmJiBzb2NrZXQubGlzdGVuZXJDb3VudCgnZGF0YScpID4gMDtcblxuXHRcdFx0XHRpZiAoaGFzRGF0YUxpc3RlbmVyICYmICFoYWRFcnJvcikge1xuXHRcdFx0XHRcdGNvbnN0IGVyciA9IG5ldyBFcnJvcignUHJlbWF0dXJlIGNsb3NlJyk7XG5cdFx0XHRcdFx0ZXJyLmNvZGUgPSAnRVJSX1NUUkVBTV9QUkVNQVRVUkVfQ0xPU0UnO1xuXHRcdFx0XHRcdGVycm9yQ2FsbGJhY2soZXJyKTtcblx0XHRcdFx0fVxuXHRcdFx0fSk7XG5cdFx0fVxuXHR9KTtcbn1cblxuZnVuY3Rpb24gZGVzdHJveVN0cmVhbShzdHJlYW0sIGVycikge1xuXHRpZiAoc3RyZWFtLmRlc3Ryb3kpIHtcblx0XHRzdHJlYW0uZGVzdHJveShlcnIpO1xuXHR9IGVsc2Uge1xuXHRcdC8vIG5vZGUgPCA4XG5cdFx0c3RyZWFtLmVtaXQoJ2Vycm9yJywgZXJyKTtcblx0XHRzdHJlYW0uZW5kKCk7XG5cdH1cbn1cblxuLyoqXG4gKiBSZWRpcmVjdCBjb2RlIG1hdGNoaW5nXG4gKlxuICogQHBhcmFtICAgTnVtYmVyICAgY29kZSAgU3RhdHVzIGNvZGVcbiAqIEByZXR1cm4gIEJvb2xlYW5cbiAqL1xuZmV0Y2guaXNSZWRpcmVjdCA9IGZ1bmN0aW9uIChjb2RlKSB7XG5cdHJldHVybiBjb2RlID09PSAzMDEgfHwgY29kZSA9PT0gMzAyIHx8IGNvZGUgPT09IDMwMyB8fCBjb2RlID09PSAzMDcgfHwgY29kZSA9PT0gMzA4O1xufTtcblxuLy8gZXhwb3NlIFByb21pc2VcbmZldGNoLlByb21pc2UgPSBnbG9iYWwuUHJvbWlzZTtcblxubW9kdWxlLmV4cG9ydHMgPSBleHBvcnRzID0gZmV0Y2g7XG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJfX2VzTW9kdWxlXCIsIHsgdmFsdWU6IHRydWUgfSk7XG5leHBvcnRzLmRlZmF1bHQgPSBleHBvcnRzO1xuZXhwb3J0cy5IZWFkZXJzID0gSGVhZGVycztcbmV4cG9ydHMuUmVxdWVzdCA9IFJlcXVlc3Q7XG5leHBvcnRzLlJlc3BvbnNlID0gUmVzcG9uc2U7XG5leHBvcnRzLkZldGNoRXJyb3IgPSBGZXRjaEVycm9yO1xuZXhwb3J0cy5BYm9ydEVycm9yID0gQWJvcnRFcnJvcjtcbiIsCiAgICAiJ3VzZSBzdHJpY3QnO1xuXG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgJ19fZXNNb2R1bGUnLCB7IHZhbHVlOiB0cnVlIH0pO1xuXG5mdW5jdGlvbiBfaW50ZXJvcERlZmF1bHQgKGV4KSB7IHJldHVybiAoZXggJiYgKHR5cGVvZiBleCA9PT0gJ29iamVjdCcpICYmICdkZWZhdWx0JyBpbiBleCkgPyBleFsnZGVmYXVsdCddIDogZXg7IH1cblxudmFyIGRlcHJlY2F0aW9uID0gcmVxdWlyZSgnZGVwcmVjYXRpb24nKTtcbnZhciBvbmNlID0gX2ludGVyb3BEZWZhdWx0KHJlcXVpcmUoJ29uY2UnKSk7XG5cbmNvbnN0IGxvZ09uY2VDb2RlID0gb25jZShkZXByZWNhdGlvbiA9PiBjb25zb2xlLndhcm4oZGVwcmVjYXRpb24pKTtcbmNvbnN0IGxvZ09uY2VIZWFkZXJzID0gb25jZShkZXByZWNhdGlvbiA9PiBjb25zb2xlLndhcm4oZGVwcmVjYXRpb24pKTtcbi8qKlxuICogRXJyb3Igd2l0aCBleHRyYSBwcm9wZXJ0aWVzIHRvIGhlbHAgd2l0aCBkZWJ1Z2dpbmdcbiAqL1xuXG5jbGFzcyBSZXF1ZXN0RXJyb3IgZXh0ZW5kcyBFcnJvciB7XG4gIGNvbnN0cnVjdG9yKG1lc3NhZ2UsIHN0YXR1c0NvZGUsIG9wdGlvbnMpIHtcbiAgICBzdXBlcihtZXNzYWdlKTsgLy8gTWFpbnRhaW5zIHByb3BlciBzdGFjayB0cmFjZSAob25seSBhdmFpbGFibGUgb24gVjgpXG5cbiAgICAvKiBpc3RhbmJ1bCBpZ25vcmUgbmV4dCAqL1xuXG4gICAgaWYgKEVycm9yLmNhcHR1cmVTdGFja1RyYWNlKSB7XG4gICAgICBFcnJvci5jYXB0dXJlU3RhY2tUcmFjZSh0aGlzLCB0aGlzLmNvbnN0cnVjdG9yKTtcbiAgICB9XG5cbiAgICB0aGlzLm5hbWUgPSBcIkh0dHBFcnJvclwiO1xuICAgIHRoaXMuc3RhdHVzID0gc3RhdHVzQ29kZTtcbiAgICBsZXQgaGVhZGVycztcblxuICAgIGlmIChcImhlYWRlcnNcIiBpbiBvcHRpb25zICYmIHR5cGVvZiBvcHRpb25zLmhlYWRlcnMgIT09IFwidW5kZWZpbmVkXCIpIHtcbiAgICAgIGhlYWRlcnMgPSBvcHRpb25zLmhlYWRlcnM7XG4gICAgfVxuXG4gICAgaWYgKFwicmVzcG9uc2VcIiBpbiBvcHRpb25zKSB7XG4gICAgICB0aGlzLnJlc3BvbnNlID0gb3B0aW9ucy5yZXNwb25zZTtcbiAgICAgIGhlYWRlcnMgPSBvcHRpb25zLnJlc3BvbnNlLmhlYWRlcnM7XG4gICAgfSAvLyByZWRhY3QgcmVxdWVzdCBjcmVkZW50aWFscyB3aXRob3V0IG11dGF0aW5nIG9yaWdpbmFsIHJlcXVlc3Qgb3B0aW9uc1xuXG5cbiAgICBjb25zdCByZXF1ZXN0Q29weSA9IE9iamVjdC5hc3NpZ24oe30sIG9wdGlvbnMucmVxdWVzdCk7XG5cbiAgICBpZiAob3B0aW9ucy5yZXF1ZXN0LmhlYWRlcnMuYXV0aG9yaXphdGlvbikge1xuICAgICAgcmVxdWVzdENvcHkuaGVhZGVycyA9IE9iamVjdC5hc3NpZ24oe30sIG9wdGlvbnMucmVxdWVzdC5oZWFkZXJzLCB7XG4gICAgICAgIGF1dGhvcml6YXRpb246IG9wdGlvbnMucmVxdWVzdC5oZWFkZXJzLmF1dGhvcml6YXRpb24ucmVwbGFjZSgvIC4qJC8sIFwiIFtSRURBQ1RFRF1cIilcbiAgICAgIH0pO1xuICAgIH1cblxuICAgIHJlcXVlc3RDb3B5LnVybCA9IHJlcXVlc3RDb3B5LnVybCAvLyBjbGllbnRfaWQgJiBjbGllbnRfc2VjcmV0IGNhbiBiZSBwYXNzZWQgYXMgVVJMIHF1ZXJ5IHBhcmFtZXRlcnMgdG8gaW5jcmVhc2UgcmF0ZSBsaW1pdFxuICAgIC8vIHNlZSBodHRwczovL2RldmVsb3Blci5naXRodWIuY29tL3YzLyNpbmNyZWFzaW5nLXRoZS11bmF1dGhlbnRpY2F0ZWQtcmF0ZS1saW1pdC1mb3Itb2F1dGgtYXBwbGljYXRpb25zXG4gICAgLnJlcGxhY2UoL1xcYmNsaWVudF9zZWNyZXQ9XFx3Ky9nLCBcImNsaWVudF9zZWNyZXQ9W1JFREFDVEVEXVwiKSAvLyBPQXV0aCB0b2tlbnMgY2FuIGJlIHBhc3NlZCBhcyBVUkwgcXVlcnkgcGFyYW1ldGVycywgYWx0aG91Z2ggaXQgaXMgbm90IHJlY29tbWVuZGVkXG4gICAgLy8gc2VlIGh0dHBzOi8vZGV2ZWxvcGVyLmdpdGh1Yi5jb20vdjMvI29hdXRoMi10b2tlbi1zZW50LWluLWEtaGVhZGVyXG4gICAgLnJlcGxhY2UoL1xcYmFjY2Vzc190b2tlbj1cXHcrL2csIFwiYWNjZXNzX3Rva2VuPVtSRURBQ1RFRF1cIik7XG4gICAgdGhpcy5yZXF1ZXN0ID0gcmVxdWVzdENvcHk7IC8vIGRlcHJlY2F0aW9uc1xuXG4gICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KHRoaXMsIFwiY29kZVwiLCB7XG4gICAgICBnZXQoKSB7XG4gICAgICAgIGxvZ09uY2VDb2RlKG5ldyBkZXByZWNhdGlvbi5EZXByZWNhdGlvbihcIltAb2N0b2tpdC9yZXF1ZXN0LWVycm9yXSBgZXJyb3IuY29kZWAgaXMgZGVwcmVjYXRlZCwgdXNlIGBlcnJvci5zdGF0dXNgLlwiKSk7XG4gICAgICAgIHJldHVybiBzdGF0dXNDb2RlO1xuICAgICAgfVxuXG4gICAgfSk7XG4gICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KHRoaXMsIFwiaGVhZGVyc1wiLCB7XG4gICAgICBnZXQoKSB7XG4gICAgICAgIGxvZ09uY2VIZWFkZXJzKG5ldyBkZXByZWNhdGlvbi5EZXByZWNhdGlvbihcIltAb2N0b2tpdC9yZXF1ZXN0LWVycm9yXSBgZXJyb3IuaGVhZGVyc2AgaXMgZGVwcmVjYXRlZCwgdXNlIGBlcnJvci5yZXNwb25zZS5oZWFkZXJzYC5cIikpO1xuICAgICAgICByZXR1cm4gaGVhZGVycyB8fCB7fTtcbiAgICAgIH1cblxuICAgIH0pO1xuICB9XG5cbn1cblxuZXhwb3J0cy5SZXF1ZXN0RXJyb3IgPSBSZXF1ZXN0RXJyb3I7XG4vLyMgc291cmNlTWFwcGluZ1VSTD1pbmRleC5qcy5tYXBcbiIsCiAgICAiJ3VzZSBzdHJpY3QnO1xuXG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgJ19fZXNNb2R1bGUnLCB7IHZhbHVlOiB0cnVlIH0pO1xuXG5mdW5jdGlvbiBfaW50ZXJvcERlZmF1bHQgKGV4KSB7IHJldHVybiAoZXggJiYgKHR5cGVvZiBleCA9PT0gJ29iamVjdCcpICYmICdkZWZhdWx0JyBpbiBleCkgPyBleFsnZGVmYXVsdCddIDogZXg7IH1cblxudmFyIGVuZHBvaW50ID0gcmVxdWlyZSgnQG9jdG9raXQvZW5kcG9pbnQnKTtcbnZhciB1bml2ZXJzYWxVc2VyQWdlbnQgPSByZXF1aXJlKCd1bml2ZXJzYWwtdXNlci1hZ2VudCcpO1xudmFyIGlzUGxhaW5PYmplY3QgPSByZXF1aXJlKCdpcy1wbGFpbi1vYmplY3QnKTtcbnZhciBub2RlRmV0Y2ggPSBfaW50ZXJvcERlZmF1bHQocmVxdWlyZSgnbm9kZS1mZXRjaCcpKTtcbnZhciByZXF1ZXN0RXJyb3IgPSByZXF1aXJlKCdAb2N0b2tpdC9yZXF1ZXN0LWVycm9yJyk7XG5cbmNvbnN0IFZFUlNJT04gPSBcIjUuNi4zXCI7XG5cbmZ1bmN0aW9uIGdldEJ1ZmZlclJlc3BvbnNlKHJlc3BvbnNlKSB7XG4gIHJldHVybiByZXNwb25zZS5hcnJheUJ1ZmZlcigpO1xufVxuXG5mdW5jdGlvbiBmZXRjaFdyYXBwZXIocmVxdWVzdE9wdGlvbnMpIHtcbiAgY29uc3QgbG9nID0gcmVxdWVzdE9wdGlvbnMucmVxdWVzdCAmJiByZXF1ZXN0T3B0aW9ucy5yZXF1ZXN0LmxvZyA/IHJlcXVlc3RPcHRpb25zLnJlcXVlc3QubG9nIDogY29uc29sZTtcblxuICBpZiAoaXNQbGFpbk9iamVjdC5pc1BsYWluT2JqZWN0KHJlcXVlc3RPcHRpb25zLmJvZHkpIHx8IEFycmF5LmlzQXJyYXkocmVxdWVzdE9wdGlvbnMuYm9keSkpIHtcbiAgICByZXF1ZXN0T3B0aW9ucy5ib2R5ID0gSlNPTi5zdHJpbmdpZnkocmVxdWVzdE9wdGlvbnMuYm9keSk7XG4gIH1cblxuICBsZXQgaGVhZGVycyA9IHt9O1xuICBsZXQgc3RhdHVzO1xuICBsZXQgdXJsO1xuICBjb25zdCBmZXRjaCA9IHJlcXVlc3RPcHRpb25zLnJlcXVlc3QgJiYgcmVxdWVzdE9wdGlvbnMucmVxdWVzdC5mZXRjaCB8fCBub2RlRmV0Y2g7XG4gIHJldHVybiBmZXRjaChyZXF1ZXN0T3B0aW9ucy51cmwsIE9iamVjdC5hc3NpZ24oe1xuICAgIG1ldGhvZDogcmVxdWVzdE9wdGlvbnMubWV0aG9kLFxuICAgIGJvZHk6IHJlcXVlc3RPcHRpb25zLmJvZHksXG4gICAgaGVhZGVyczogcmVxdWVzdE9wdGlvbnMuaGVhZGVycyxcbiAgICByZWRpcmVjdDogcmVxdWVzdE9wdGlvbnMucmVkaXJlY3RcbiAgfSwgLy8gYHJlcXVlc3RPcHRpb25zLnJlcXVlc3QuYWdlbnRgIHR5cGUgaXMgaW5jb21wYXRpYmxlXG4gIC8vIHNlZSBodHRwczovL2dpdGh1Yi5jb20vb2N0b2tpdC90eXBlcy50cy9wdWxsLzI2NFxuICByZXF1ZXN0T3B0aW9ucy5yZXF1ZXN0KSkudGhlbihhc3luYyByZXNwb25zZSA9PiB7XG4gICAgdXJsID0gcmVzcG9uc2UudXJsO1xuICAgIHN0YXR1cyA9IHJlc3BvbnNlLnN0YXR1cztcblxuICAgIGZvciAoY29uc3Qga2V5QW5kVmFsdWUgb2YgcmVzcG9uc2UuaGVhZGVycykge1xuICAgICAgaGVhZGVyc1trZXlBbmRWYWx1ZVswXV0gPSBrZXlBbmRWYWx1ZVsxXTtcbiAgICB9XG5cbiAgICBpZiAoXCJkZXByZWNhdGlvblwiIGluIGhlYWRlcnMpIHtcbiAgICAgIGNvbnN0IG1hdGNoZXMgPSBoZWFkZXJzLmxpbmsgJiYgaGVhZGVycy5saW5rLm1hdGNoKC88KFtePl0rKT47IHJlbD1cImRlcHJlY2F0aW9uXCIvKTtcbiAgICAgIGNvbnN0IGRlcHJlY2F0aW9uTGluayA9IG1hdGNoZXMgJiYgbWF0Y2hlcy5wb3AoKTtcbiAgICAgIGxvZy53YXJuKGBbQG9jdG9raXQvcmVxdWVzdF0gXCIke3JlcXVlc3RPcHRpb25zLm1ldGhvZH0gJHtyZXF1ZXN0T3B0aW9ucy51cmx9XCIgaXMgZGVwcmVjYXRlZC4gSXQgaXMgc2NoZWR1bGVkIHRvIGJlIHJlbW92ZWQgb24gJHtoZWFkZXJzLnN1bnNldH0ke2RlcHJlY2F0aW9uTGluayA/IGAuIFNlZSAke2RlcHJlY2F0aW9uTGlua31gIDogXCJcIn1gKTtcbiAgICB9XG5cbiAgICBpZiAoc3RhdHVzID09PSAyMDQgfHwgc3RhdHVzID09PSAyMDUpIHtcbiAgICAgIHJldHVybjtcbiAgICB9IC8vIEdpdEh1YiBBUEkgcmV0dXJucyAyMDAgZm9yIEhFQUQgcmVxdWVzdHNcblxuXG4gICAgaWYgKHJlcXVlc3RPcHRpb25zLm1ldGhvZCA9PT0gXCJIRUFEXCIpIHtcbiAgICAgIGlmIChzdGF0dXMgPCA0MDApIHtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuXG4gICAgICB0aHJvdyBuZXcgcmVxdWVzdEVycm9yLlJlcXVlc3RFcnJvcihyZXNwb25zZS5zdGF0dXNUZXh0LCBzdGF0dXMsIHtcbiAgICAgICAgcmVzcG9uc2U6IHtcbiAgICAgICAgICB1cmwsXG4gICAgICAgICAgc3RhdHVzLFxuICAgICAgICAgIGhlYWRlcnMsXG4gICAgICAgICAgZGF0YTogdW5kZWZpbmVkXG4gICAgICAgIH0sXG4gICAgICAgIHJlcXVlc3Q6IHJlcXVlc3RPcHRpb25zXG4gICAgICB9KTtcbiAgICB9XG5cbiAgICBpZiAoc3RhdHVzID09PSAzMDQpIHtcbiAgICAgIHRocm93IG5ldyByZXF1ZXN0RXJyb3IuUmVxdWVzdEVycm9yKFwiTm90IG1vZGlmaWVkXCIsIHN0YXR1cywge1xuICAgICAgICByZXNwb25zZToge1xuICAgICAgICAgIHVybCxcbiAgICAgICAgICBzdGF0dXMsXG4gICAgICAgICAgaGVhZGVycyxcbiAgICAgICAgICBkYXRhOiBhd2FpdCBnZXRSZXNwb25zZURhdGEocmVzcG9uc2UpXG4gICAgICAgIH0sXG4gICAgICAgIHJlcXVlc3Q6IHJlcXVlc3RPcHRpb25zXG4gICAgICB9KTtcbiAgICB9XG5cbiAgICBpZiAoc3RhdHVzID49IDQwMCkge1xuICAgICAgY29uc3QgZGF0YSA9IGF3YWl0IGdldFJlc3BvbnNlRGF0YShyZXNwb25zZSk7XG4gICAgICBjb25zdCBlcnJvciA9IG5ldyByZXF1ZXN0RXJyb3IuUmVxdWVzdEVycm9yKHRvRXJyb3JNZXNzYWdlKGRhdGEpLCBzdGF0dXMsIHtcbiAgICAgICAgcmVzcG9uc2U6IHtcbiAgICAgICAgICB1cmwsXG4gICAgICAgICAgc3RhdHVzLFxuICAgICAgICAgIGhlYWRlcnMsXG4gICAgICAgICAgZGF0YVxuICAgICAgICB9LFxuICAgICAgICByZXF1ZXN0OiByZXF1ZXN0T3B0aW9uc1xuICAgICAgfSk7XG4gICAgICB0aHJvdyBlcnJvcjtcbiAgICB9XG5cbiAgICByZXR1cm4gZ2V0UmVzcG9uc2VEYXRhKHJlc3BvbnNlKTtcbiAgfSkudGhlbihkYXRhID0+IHtcbiAgICByZXR1cm4ge1xuICAgICAgc3RhdHVzLFxuICAgICAgdXJsLFxuICAgICAgaGVhZGVycyxcbiAgICAgIGRhdGFcbiAgICB9O1xuICB9KS5jYXRjaChlcnJvciA9PiB7XG4gICAgaWYgKGVycm9yIGluc3RhbmNlb2YgcmVxdWVzdEVycm9yLlJlcXVlc3RFcnJvcikgdGhyb3cgZXJyb3I7XG4gICAgdGhyb3cgbmV3IHJlcXVlc3RFcnJvci5SZXF1ZXN0RXJyb3IoZXJyb3IubWVzc2FnZSwgNTAwLCB7XG4gICAgICByZXF1ZXN0OiByZXF1ZXN0T3B0aW9uc1xuICAgIH0pO1xuICB9KTtcbn1cblxuYXN5bmMgZnVuY3Rpb24gZ2V0UmVzcG9uc2VEYXRhKHJlc3BvbnNlKSB7XG4gIGNvbnN0IGNvbnRlbnRUeXBlID0gcmVzcG9uc2UuaGVhZGVycy5nZXQoXCJjb250ZW50LXR5cGVcIik7XG5cbiAgaWYgKC9hcHBsaWNhdGlvblxcL2pzb24vLnRlc3QoY29udGVudFR5cGUpKSB7XG4gICAgcmV0dXJuIHJlc3BvbnNlLmpzb24oKTtcbiAgfVxuXG4gIGlmICghY29udGVudFR5cGUgfHwgL150ZXh0XFwvfGNoYXJzZXQ9dXRmLTgkLy50ZXN0KGNvbnRlbnRUeXBlKSkge1xuICAgIHJldHVybiByZXNwb25zZS50ZXh0KCk7XG4gIH1cblxuICByZXR1cm4gZ2V0QnVmZmVyUmVzcG9uc2UocmVzcG9uc2UpO1xufVxuXG5mdW5jdGlvbiB0b0Vycm9yTWVzc2FnZShkYXRhKSB7XG4gIGlmICh0eXBlb2YgZGF0YSA9PT0gXCJzdHJpbmdcIikgcmV0dXJuIGRhdGE7IC8vIGlzdGFuYnVsIGlnbm9yZSBlbHNlIC0ganVzdCBpbiBjYXNlXG5cbiAgaWYgKFwibWVzc2FnZVwiIGluIGRhdGEpIHtcbiAgICBpZiAoQXJyYXkuaXNBcnJheShkYXRhLmVycm9ycykpIHtcbiAgICAgIHJldHVybiBgJHtkYXRhLm1lc3NhZ2V9OiAke2RhdGEuZXJyb3JzLm1hcChKU09OLnN0cmluZ2lmeSkuam9pbihcIiwgXCIpfWA7XG4gICAgfVxuXG4gICAgcmV0dXJuIGRhdGEubWVzc2FnZTtcbiAgfSAvLyBpc3RhbmJ1bCBpZ25vcmUgbmV4dCAtIGp1c3QgaW4gY2FzZVxuXG5cbiAgcmV0dXJuIGBVbmtub3duIGVycm9yOiAke0pTT04uc3RyaW5naWZ5KGRhdGEpfWA7XG59XG5cbmZ1bmN0aW9uIHdpdGhEZWZhdWx0cyhvbGRFbmRwb2ludCwgbmV3RGVmYXVsdHMpIHtcbiAgY29uc3QgZW5kcG9pbnQgPSBvbGRFbmRwb2ludC5kZWZhdWx0cyhuZXdEZWZhdWx0cyk7XG5cbiAgY29uc3QgbmV3QXBpID0gZnVuY3Rpb24gKHJvdXRlLCBwYXJhbWV0ZXJzKSB7XG4gICAgY29uc3QgZW5kcG9pbnRPcHRpb25zID0gZW5kcG9pbnQubWVyZ2Uocm91dGUsIHBhcmFtZXRlcnMpO1xuXG4gICAgaWYgKCFlbmRwb2ludE9wdGlvbnMucmVxdWVzdCB8fCAhZW5kcG9pbnRPcHRpb25zLnJlcXVlc3QuaG9vaykge1xuICAgICAgcmV0dXJuIGZldGNoV3JhcHBlcihlbmRwb2ludC5wYXJzZShlbmRwb2ludE9wdGlvbnMpKTtcbiAgICB9XG5cbiAgICBjb25zdCByZXF1ZXN0ID0gKHJvdXRlLCBwYXJhbWV0ZXJzKSA9PiB7XG4gICAgICByZXR1cm4gZmV0Y2hXcmFwcGVyKGVuZHBvaW50LnBhcnNlKGVuZHBvaW50Lm1lcmdlKHJvdXRlLCBwYXJhbWV0ZXJzKSkpO1xuICAgIH07XG5cbiAgICBPYmplY3QuYXNzaWduKHJlcXVlc3QsIHtcbiAgICAgIGVuZHBvaW50LFxuICAgICAgZGVmYXVsdHM6IHdpdGhEZWZhdWx0cy5iaW5kKG51bGwsIGVuZHBvaW50KVxuICAgIH0pO1xuICAgIHJldHVybiBlbmRwb2ludE9wdGlvbnMucmVxdWVzdC5ob29rKHJlcXVlc3QsIGVuZHBvaW50T3B0aW9ucyk7XG4gIH07XG5cbiAgcmV0dXJuIE9iamVjdC5hc3NpZ24obmV3QXBpLCB7XG4gICAgZW5kcG9pbnQsXG4gICAgZGVmYXVsdHM6IHdpdGhEZWZhdWx0cy5iaW5kKG51bGwsIGVuZHBvaW50KVxuICB9KTtcbn1cblxuY29uc3QgcmVxdWVzdCA9IHdpdGhEZWZhdWx0cyhlbmRwb2ludC5lbmRwb2ludCwge1xuICBoZWFkZXJzOiB7XG4gICAgXCJ1c2VyLWFnZW50XCI6IGBvY3Rva2l0LXJlcXVlc3QuanMvJHtWRVJTSU9OfSAke3VuaXZlcnNhbFVzZXJBZ2VudC5nZXRVc2VyQWdlbnQoKX1gXG4gIH1cbn0pO1xuXG5leHBvcnRzLnJlcXVlc3QgPSByZXF1ZXN0O1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9aW5kZXguanMubWFwXG4iLAogICAgIid1c2Ugc3RyaWN0JztcblxuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsICdfX2VzTW9kdWxlJywgeyB2YWx1ZTogdHJ1ZSB9KTtcblxudmFyIHJlcXVlc3QgPSByZXF1aXJlKCdAb2N0b2tpdC9yZXF1ZXN0Jyk7XG52YXIgdW5pdmVyc2FsVXNlckFnZW50ID0gcmVxdWlyZSgndW5pdmVyc2FsLXVzZXItYWdlbnQnKTtcblxuY29uc3QgVkVSU0lPTiA9IFwiNC44LjBcIjtcblxuZnVuY3Rpb24gX2J1aWxkTWVzc2FnZUZvclJlc3BvbnNlRXJyb3JzKGRhdGEpIHtcbiAgcmV0dXJuIGBSZXF1ZXN0IGZhaWxlZCBkdWUgdG8gZm9sbG93aW5nIHJlc3BvbnNlIGVycm9yczpcXG5gICsgZGF0YS5lcnJvcnMubWFwKGUgPT4gYCAtICR7ZS5tZXNzYWdlfWApLmpvaW4oXCJcXG5cIik7XG59XG5cbmNsYXNzIEdyYXBocWxSZXNwb25zZUVycm9yIGV4dGVuZHMgRXJyb3Ige1xuICBjb25zdHJ1Y3RvcihyZXF1ZXN0LCBoZWFkZXJzLCByZXNwb25zZSkge1xuICAgIHN1cGVyKF9idWlsZE1lc3NhZ2VGb3JSZXNwb25zZUVycm9ycyhyZXNwb25zZSkpO1xuICAgIHRoaXMucmVxdWVzdCA9IHJlcXVlc3Q7XG4gICAgdGhpcy5oZWFkZXJzID0gaGVhZGVycztcbiAgICB0aGlzLnJlc3BvbnNlID0gcmVzcG9uc2U7XG4gICAgdGhpcy5uYW1lID0gXCJHcmFwaHFsUmVzcG9uc2VFcnJvclwiOyAvLyBFeHBvc2UgdGhlIGVycm9ycyBhbmQgcmVzcG9uc2UgZGF0YSBpbiB0aGVpciBzaG9ydGhhbmQgcHJvcGVydGllcy5cblxuICAgIHRoaXMuZXJyb3JzID0gcmVzcG9uc2UuZXJyb3JzO1xuICAgIHRoaXMuZGF0YSA9IHJlc3BvbnNlLmRhdGE7IC8vIE1haW50YWlucyBwcm9wZXIgc3RhY2sgdHJhY2UgKG9ubHkgYXZhaWxhYmxlIG9uIFY4KVxuXG4gICAgLyogaXN0YW5idWwgaWdub3JlIG5leHQgKi9cblxuICAgIGlmIChFcnJvci5jYXB0dXJlU3RhY2tUcmFjZSkge1xuICAgICAgRXJyb3IuY2FwdHVyZVN0YWNrVHJhY2UodGhpcywgdGhpcy5jb25zdHJ1Y3Rvcik7XG4gICAgfVxuICB9XG5cbn1cblxuY29uc3QgTk9OX1ZBUklBQkxFX09QVElPTlMgPSBbXCJtZXRob2RcIiwgXCJiYXNlVXJsXCIsIFwidXJsXCIsIFwiaGVhZGVyc1wiLCBcInJlcXVlc3RcIiwgXCJxdWVyeVwiLCBcIm1lZGlhVHlwZVwiXTtcbmNvbnN0IEZPUkJJRERFTl9WQVJJQUJMRV9PUFRJT05TID0gW1wicXVlcnlcIiwgXCJtZXRob2RcIiwgXCJ1cmxcIl07XG5jb25zdCBHSEVTX1YzX1NVRkZJWF9SRUdFWCA9IC9cXC9hcGlcXC92M1xcLz8kLztcbmZ1bmN0aW9uIGdyYXBocWwocmVxdWVzdCwgcXVlcnksIG9wdGlvbnMpIHtcbiAgaWYgKG9wdGlvbnMpIHtcbiAgICBpZiAodHlwZW9mIHF1ZXJ5ID09PSBcInN0cmluZ1wiICYmIFwicXVlcnlcIiBpbiBvcHRpb25zKSB7XG4gICAgICByZXR1cm4gUHJvbWlzZS5yZWplY3QobmV3IEVycm9yKGBbQG9jdG9raXQvZ3JhcGhxbF0gXCJxdWVyeVwiIGNhbm5vdCBiZSB1c2VkIGFzIHZhcmlhYmxlIG5hbWVgKSk7XG4gICAgfVxuXG4gICAgZm9yIChjb25zdCBrZXkgaW4gb3B0aW9ucykge1xuICAgICAgaWYgKCFGT1JCSURERU5fVkFSSUFCTEVfT1BUSU9OUy5pbmNsdWRlcyhrZXkpKSBjb250aW51ZTtcbiAgICAgIHJldHVybiBQcm9taXNlLnJlamVjdChuZXcgRXJyb3IoYFtAb2N0b2tpdC9ncmFwaHFsXSBcIiR7a2V5fVwiIGNhbm5vdCBiZSB1c2VkIGFzIHZhcmlhYmxlIG5hbWVgKSk7XG4gICAgfVxuICB9XG5cbiAgY29uc3QgcGFyc2VkT3B0aW9ucyA9IHR5cGVvZiBxdWVyeSA9PT0gXCJzdHJpbmdcIiA/IE9iamVjdC5hc3NpZ24oe1xuICAgIHF1ZXJ5XG4gIH0sIG9wdGlvbnMpIDogcXVlcnk7XG4gIGNvbnN0IHJlcXVlc3RPcHRpb25zID0gT2JqZWN0LmtleXMocGFyc2VkT3B0aW9ucykucmVkdWNlKChyZXN1bHQsIGtleSkgPT4ge1xuICAgIGlmIChOT05fVkFSSUFCTEVfT1BUSU9OUy5pbmNsdWRlcyhrZXkpKSB7XG4gICAgICByZXN1bHRba2V5XSA9IHBhcnNlZE9wdGlvbnNba2V5XTtcbiAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgfVxuXG4gICAgaWYgKCFyZXN1bHQudmFyaWFibGVzKSB7XG4gICAgICByZXN1bHQudmFyaWFibGVzID0ge307XG4gICAgfVxuXG4gICAgcmVzdWx0LnZhcmlhYmxlc1trZXldID0gcGFyc2VkT3B0aW9uc1trZXldO1xuICAgIHJldHVybiByZXN1bHQ7XG4gIH0sIHt9KTsgLy8gd29ya2Fyb3VuZCBmb3IgR2l0SHViIEVudGVycHJpc2UgYmFzZVVybCBzZXQgd2l0aCAvYXBpL3YzIHN1ZmZpeFxuICAvLyBodHRwczovL2dpdGh1Yi5jb20vb2N0b2tpdC9hdXRoLWFwcC5qcy9pc3N1ZXMvMTExI2lzc3VlY29tbWVudC02NTc2MTA0NTFcblxuICBjb25zdCBiYXNlVXJsID0gcGFyc2VkT3B0aW9ucy5iYXNlVXJsIHx8IHJlcXVlc3QuZW5kcG9pbnQuREVGQVVMVFMuYmFzZVVybDtcblxuICBpZiAoR0hFU19WM19TVUZGSVhfUkVHRVgudGVzdChiYXNlVXJsKSkge1xuICAgIHJlcXVlc3RPcHRpb25zLnVybCA9IGJhc2VVcmwucmVwbGFjZShHSEVTX1YzX1NVRkZJWF9SRUdFWCwgXCIvYXBpL2dyYXBocWxcIik7XG4gIH1cblxuICByZXR1cm4gcmVxdWVzdChyZXF1ZXN0T3B0aW9ucykudGhlbihyZXNwb25zZSA9PiB7XG4gICAgaWYgKHJlc3BvbnNlLmRhdGEuZXJyb3JzKSB7XG4gICAgICBjb25zdCBoZWFkZXJzID0ge307XG5cbiAgICAgIGZvciAoY29uc3Qga2V5IG9mIE9iamVjdC5rZXlzKHJlc3BvbnNlLmhlYWRlcnMpKSB7XG4gICAgICAgIGhlYWRlcnNba2V5XSA9IHJlc3BvbnNlLmhlYWRlcnNba2V5XTtcbiAgICAgIH1cblxuICAgICAgdGhyb3cgbmV3IEdyYXBocWxSZXNwb25zZUVycm9yKHJlcXVlc3RPcHRpb25zLCBoZWFkZXJzLCByZXNwb25zZS5kYXRhKTtcbiAgICB9XG5cbiAgICByZXR1cm4gcmVzcG9uc2UuZGF0YS5kYXRhO1xuICB9KTtcbn1cblxuZnVuY3Rpb24gd2l0aERlZmF1bHRzKHJlcXVlc3QkMSwgbmV3RGVmYXVsdHMpIHtcbiAgY29uc3QgbmV3UmVxdWVzdCA9IHJlcXVlc3QkMS5kZWZhdWx0cyhuZXdEZWZhdWx0cyk7XG5cbiAgY29uc3QgbmV3QXBpID0gKHF1ZXJ5LCBvcHRpb25zKSA9PiB7XG4gICAgcmV0dXJuIGdyYXBocWwobmV3UmVxdWVzdCwgcXVlcnksIG9wdGlvbnMpO1xuICB9O1xuXG4gIHJldHVybiBPYmplY3QuYXNzaWduKG5ld0FwaSwge1xuICAgIGRlZmF1bHRzOiB3aXRoRGVmYXVsdHMuYmluZChudWxsLCBuZXdSZXF1ZXN0KSxcbiAgICBlbmRwb2ludDogcmVxdWVzdC5yZXF1ZXN0LmVuZHBvaW50XG4gIH0pO1xufVxuXG5jb25zdCBncmFwaHFsJDEgPSB3aXRoRGVmYXVsdHMocmVxdWVzdC5yZXF1ZXN0LCB7XG4gIGhlYWRlcnM6IHtcbiAgICBcInVzZXItYWdlbnRcIjogYG9jdG9raXQtZ3JhcGhxbC5qcy8ke1ZFUlNJT059ICR7dW5pdmVyc2FsVXNlckFnZW50LmdldFVzZXJBZ2VudCgpfWBcbiAgfSxcbiAgbWV0aG9kOiBcIlBPU1RcIixcbiAgdXJsOiBcIi9ncmFwaHFsXCJcbn0pO1xuZnVuY3Rpb24gd2l0aEN1c3RvbVJlcXVlc3QoY3VzdG9tUmVxdWVzdCkge1xuICByZXR1cm4gd2l0aERlZmF1bHRzKGN1c3RvbVJlcXVlc3QsIHtcbiAgICBtZXRob2Q6IFwiUE9TVFwiLFxuICAgIHVybDogXCIvZ3JhcGhxbFwiXG4gIH0pO1xufVxuXG5leHBvcnRzLkdyYXBocWxSZXNwb25zZUVycm9yID0gR3JhcGhxbFJlc3BvbnNlRXJyb3I7XG5leHBvcnRzLmdyYXBocWwgPSBncmFwaHFsJDE7XG5leHBvcnRzLndpdGhDdXN0b21SZXF1ZXN0ID0gd2l0aEN1c3RvbVJlcXVlc3Q7XG4vLyMgc291cmNlTWFwcGluZ1VSTD1pbmRleC5qcy5tYXBcbiIsCiAgICAiJ3VzZSBzdHJpY3QnO1xuXG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgJ19fZXNNb2R1bGUnLCB7IHZhbHVlOiB0cnVlIH0pO1xuXG5jb25zdCBSRUdFWF9JU19JTlNUQUxMQVRJT05fTEVHQUNZID0gL152MVxcLi87XG5jb25zdCBSRUdFWF9JU19JTlNUQUxMQVRJT04gPSAvXmdoc18vO1xuY29uc3QgUkVHRVhfSVNfVVNFUl9UT19TRVJWRVIgPSAvXmdodV8vO1xuYXN5bmMgZnVuY3Rpb24gYXV0aCh0b2tlbikge1xuICBjb25zdCBpc0FwcCA9IHRva2VuLnNwbGl0KC9cXC4vKS5sZW5ndGggPT09IDM7XG4gIGNvbnN0IGlzSW5zdGFsbGF0aW9uID0gUkVHRVhfSVNfSU5TVEFMTEFUSU9OX0xFR0FDWS50ZXN0KHRva2VuKSB8fCBSRUdFWF9JU19JTlNUQUxMQVRJT04udGVzdCh0b2tlbik7XG4gIGNvbnN0IGlzVXNlclRvU2VydmVyID0gUkVHRVhfSVNfVVNFUl9UT19TRVJWRVIudGVzdCh0b2tlbik7XG4gIGNvbnN0IHRva2VuVHlwZSA9IGlzQXBwID8gXCJhcHBcIiA6IGlzSW5zdGFsbGF0aW9uID8gXCJpbnN0YWxsYXRpb25cIiA6IGlzVXNlclRvU2VydmVyID8gXCJ1c2VyLXRvLXNlcnZlclwiIDogXCJvYXV0aFwiO1xuICByZXR1cm4ge1xuICAgIHR5cGU6IFwidG9rZW5cIixcbiAgICB0b2tlbjogdG9rZW4sXG4gICAgdG9rZW5UeXBlXG4gIH07XG59XG5cbi8qKlxuICogUHJlZml4IHRva2VuIGZvciB1c2FnZSBpbiB0aGUgQXV0aG9yaXphdGlvbiBoZWFkZXJcbiAqXG4gKiBAcGFyYW0gdG9rZW4gT0F1dGggdG9rZW4gb3IgSlNPTiBXZWIgVG9rZW5cbiAqL1xuZnVuY3Rpb24gd2l0aEF1dGhvcml6YXRpb25QcmVmaXgodG9rZW4pIHtcbiAgaWYgKHRva2VuLnNwbGl0KC9cXC4vKS5sZW5ndGggPT09IDMpIHtcbiAgICByZXR1cm4gYGJlYXJlciAke3Rva2VufWA7XG4gIH1cblxuICByZXR1cm4gYHRva2VuICR7dG9rZW59YDtcbn1cblxuYXN5bmMgZnVuY3Rpb24gaG9vayh0b2tlbiwgcmVxdWVzdCwgcm91dGUsIHBhcmFtZXRlcnMpIHtcbiAgY29uc3QgZW5kcG9pbnQgPSByZXF1ZXN0LmVuZHBvaW50Lm1lcmdlKHJvdXRlLCBwYXJhbWV0ZXJzKTtcbiAgZW5kcG9pbnQuaGVhZGVycy5hdXRob3JpemF0aW9uID0gd2l0aEF1dGhvcml6YXRpb25QcmVmaXgodG9rZW4pO1xuICByZXR1cm4gcmVxdWVzdChlbmRwb2ludCk7XG59XG5cbmNvbnN0IGNyZWF0ZVRva2VuQXV0aCA9IGZ1bmN0aW9uIGNyZWF0ZVRva2VuQXV0aCh0b2tlbikge1xuICBpZiAoIXRva2VuKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKFwiW0BvY3Rva2l0L2F1dGgtdG9rZW5dIE5vIHRva2VuIHBhc3NlZCB0byBjcmVhdGVUb2tlbkF1dGhcIik7XG4gIH1cblxuICBpZiAodHlwZW9mIHRva2VuICE9PSBcInN0cmluZ1wiKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKFwiW0BvY3Rva2l0L2F1dGgtdG9rZW5dIFRva2VuIHBhc3NlZCB0byBjcmVhdGVUb2tlbkF1dGggaXMgbm90IGEgc3RyaW5nXCIpO1xuICB9XG5cbiAgdG9rZW4gPSB0b2tlbi5yZXBsYWNlKC9eKHRva2VufGJlYXJlcikgKy9pLCBcIlwiKTtcbiAgcmV0dXJuIE9iamVjdC5hc3NpZ24oYXV0aC5iaW5kKG51bGwsIHRva2VuKSwge1xuICAgIGhvb2s6IGhvb2suYmluZChudWxsLCB0b2tlbilcbiAgfSk7XG59O1xuXG5leHBvcnRzLmNyZWF0ZVRva2VuQXV0aCA9IGNyZWF0ZVRva2VuQXV0aDtcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPWluZGV4LmpzLm1hcFxuIiwKICAgICIndXNlIHN0cmljdCc7XG5cbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCAnX19lc01vZHVsZScsIHsgdmFsdWU6IHRydWUgfSk7XG5cbnZhciB1bml2ZXJzYWxVc2VyQWdlbnQgPSByZXF1aXJlKCd1bml2ZXJzYWwtdXNlci1hZ2VudCcpO1xudmFyIGJlZm9yZUFmdGVySG9vayA9IHJlcXVpcmUoJ2JlZm9yZS1hZnRlci1ob29rJyk7XG52YXIgcmVxdWVzdCA9IHJlcXVpcmUoJ0BvY3Rva2l0L3JlcXVlc3QnKTtcbnZhciBncmFwaHFsID0gcmVxdWlyZSgnQG9jdG9raXQvZ3JhcGhxbCcpO1xudmFyIGF1dGhUb2tlbiA9IHJlcXVpcmUoJ0BvY3Rva2l0L2F1dGgtdG9rZW4nKTtcblxuZnVuY3Rpb24gX29iamVjdFdpdGhvdXRQcm9wZXJ0aWVzTG9vc2Uoc291cmNlLCBleGNsdWRlZCkge1xuICBpZiAoc291cmNlID09IG51bGwpIHJldHVybiB7fTtcbiAgdmFyIHRhcmdldCA9IHt9O1xuICB2YXIgc291cmNlS2V5cyA9IE9iamVjdC5rZXlzKHNvdXJjZSk7XG4gIHZhciBrZXksIGk7XG5cbiAgZm9yIChpID0gMDsgaSA8IHNvdXJjZUtleXMubGVuZ3RoOyBpKyspIHtcbiAgICBrZXkgPSBzb3VyY2VLZXlzW2ldO1xuICAgIGlmIChleGNsdWRlZC5pbmRleE9mKGtleSkgPj0gMCkgY29udGludWU7XG4gICAgdGFyZ2V0W2tleV0gPSBzb3VyY2Vba2V5XTtcbiAgfVxuXG4gIHJldHVybiB0YXJnZXQ7XG59XG5cbmZ1bmN0aW9uIF9vYmplY3RXaXRob3V0UHJvcGVydGllcyhzb3VyY2UsIGV4Y2x1ZGVkKSB7XG4gIGlmIChzb3VyY2UgPT0gbnVsbCkgcmV0dXJuIHt9O1xuXG4gIHZhciB0YXJnZXQgPSBfb2JqZWN0V2l0aG91dFByb3BlcnRpZXNMb29zZShzb3VyY2UsIGV4Y2x1ZGVkKTtcblxuICB2YXIga2V5LCBpO1xuXG4gIGlmIChPYmplY3QuZ2V0T3duUHJvcGVydHlTeW1ib2xzKSB7XG4gICAgdmFyIHNvdXJjZVN5bWJvbEtleXMgPSBPYmplY3QuZ2V0T3duUHJvcGVydHlTeW1ib2xzKHNvdXJjZSk7XG5cbiAgICBmb3IgKGkgPSAwOyBpIDwgc291cmNlU3ltYm9sS2V5cy5sZW5ndGg7IGkrKykge1xuICAgICAga2V5ID0gc291cmNlU3ltYm9sS2V5c1tpXTtcbiAgICAgIGlmIChleGNsdWRlZC5pbmRleE9mKGtleSkgPj0gMCkgY29udGludWU7XG4gICAgICBpZiAoIU9iamVjdC5wcm90b3R5cGUucHJvcGVydHlJc0VudW1lcmFibGUuY2FsbChzb3VyY2UsIGtleSkpIGNvbnRpbnVlO1xuICAgICAgdGFyZ2V0W2tleV0gPSBzb3VyY2Vba2V5XTtcbiAgICB9XG4gIH1cblxuICByZXR1cm4gdGFyZ2V0O1xufVxuXG5jb25zdCBWRVJTSU9OID0gXCIzLjYuMFwiO1xuXG5jb25zdCBfZXhjbHVkZWQgPSBbXCJhdXRoU3RyYXRlZ3lcIl07XG5jbGFzcyBPY3Rva2l0IHtcbiAgY29uc3RydWN0b3Iob3B0aW9ucyA9IHt9KSB7XG4gICAgY29uc3QgaG9vayA9IG5ldyBiZWZvcmVBZnRlckhvb2suQ29sbGVjdGlvbigpO1xuICAgIGNvbnN0IHJlcXVlc3REZWZhdWx0cyA9IHtcbiAgICAgIGJhc2VVcmw6IHJlcXVlc3QucmVxdWVzdC5lbmRwb2ludC5ERUZBVUxUUy5iYXNlVXJsLFxuICAgICAgaGVhZGVyczoge30sXG4gICAgICByZXF1ZXN0OiBPYmplY3QuYXNzaWduKHt9LCBvcHRpb25zLnJlcXVlc3QsIHtcbiAgICAgICAgLy8gQHRzLWlnbm9yZSBpbnRlcm5hbCB1c2FnZSBvbmx5LCBubyBuZWVkIHRvIHR5cGVcbiAgICAgICAgaG9vazogaG9vay5iaW5kKG51bGwsIFwicmVxdWVzdFwiKVxuICAgICAgfSksXG4gICAgICBtZWRpYVR5cGU6IHtcbiAgICAgICAgcHJldmlld3M6IFtdLFxuICAgICAgICBmb3JtYXQ6IFwiXCJcbiAgICAgIH1cbiAgICB9OyAvLyBwcmVwZW5kIGRlZmF1bHQgdXNlciBhZ2VudCB3aXRoIGBvcHRpb25zLnVzZXJBZ2VudGAgaWYgc2V0XG5cbiAgICByZXF1ZXN0RGVmYXVsdHMuaGVhZGVyc1tcInVzZXItYWdlbnRcIl0gPSBbb3B0aW9ucy51c2VyQWdlbnQsIGBvY3Rva2l0LWNvcmUuanMvJHtWRVJTSU9OfSAke3VuaXZlcnNhbFVzZXJBZ2VudC5nZXRVc2VyQWdlbnQoKX1gXS5maWx0ZXIoQm9vbGVhbikuam9pbihcIiBcIik7XG5cbiAgICBpZiAob3B0aW9ucy5iYXNlVXJsKSB7XG4gICAgICByZXF1ZXN0RGVmYXVsdHMuYmFzZVVybCA9IG9wdGlvbnMuYmFzZVVybDtcbiAgICB9XG5cbiAgICBpZiAob3B0aW9ucy5wcmV2aWV3cykge1xuICAgICAgcmVxdWVzdERlZmF1bHRzLm1lZGlhVHlwZS5wcmV2aWV3cyA9IG9wdGlvbnMucHJldmlld3M7XG4gICAgfVxuXG4gICAgaWYgKG9wdGlvbnMudGltZVpvbmUpIHtcbiAgICAgIHJlcXVlc3REZWZhdWx0cy5oZWFkZXJzW1widGltZS16b25lXCJdID0gb3B0aW9ucy50aW1lWm9uZTtcbiAgICB9XG5cbiAgICB0aGlzLnJlcXVlc3QgPSByZXF1ZXN0LnJlcXVlc3QuZGVmYXVsdHMocmVxdWVzdERlZmF1bHRzKTtcbiAgICB0aGlzLmdyYXBocWwgPSBncmFwaHFsLndpdGhDdXN0b21SZXF1ZXN0KHRoaXMucmVxdWVzdCkuZGVmYXVsdHMocmVxdWVzdERlZmF1bHRzKTtcbiAgICB0aGlzLmxvZyA9IE9iamVjdC5hc3NpZ24oe1xuICAgICAgZGVidWc6ICgpID0+IHt9LFxuICAgICAgaW5mbzogKCkgPT4ge30sXG4gICAgICB3YXJuOiBjb25zb2xlLndhcm4uYmluZChjb25zb2xlKSxcbiAgICAgIGVycm9yOiBjb25zb2xlLmVycm9yLmJpbmQoY29uc29sZSlcbiAgICB9LCBvcHRpb25zLmxvZyk7XG4gICAgdGhpcy5ob29rID0gaG9vazsgLy8gKDEpIElmIG5laXRoZXIgYG9wdGlvbnMuYXV0aFN0cmF0ZWd5YCBub3IgYG9wdGlvbnMuYXV0aGAgYXJlIHNldCwgdGhlIGBvY3Rva2l0YCBpbnN0YW5jZVxuICAgIC8vICAgICBpcyB1bmF1dGhlbnRpY2F0ZWQuIFRoZSBgdGhpcy5hdXRoKClgIG1ldGhvZCBpcyBhIG5vLW9wIGFuZCBubyByZXF1ZXN0IGhvb2sgaXMgcmVnaXN0ZXJlZC5cbiAgICAvLyAoMikgSWYgb25seSBgb3B0aW9ucy5hdXRoYCBpcyBzZXQsIHVzZSB0aGUgZGVmYXVsdCB0b2tlbiBhdXRoZW50aWNhdGlvbiBzdHJhdGVneS5cbiAgICAvLyAoMykgSWYgYG9wdGlvbnMuYXV0aFN0cmF0ZWd5YCBpcyBzZXQgdGhlbiB1c2UgaXQgYW5kIHBhc3MgaW4gYG9wdGlvbnMuYXV0aGAuIEFsd2F5cyBwYXNzIG93biByZXF1ZXN0IGFzIG1hbnkgc3RyYXRlZ2llcyBhY2NlcHQgYSBjdXN0b20gcmVxdWVzdCBpbnN0YW5jZS5cbiAgICAvLyBUT0RPOiB0eXBlIGBvcHRpb25zLmF1dGhgIGJhc2VkIG9uIGBvcHRpb25zLmF1dGhTdHJhdGVneWAuXG5cbiAgICBpZiAoIW9wdGlvbnMuYXV0aFN0cmF0ZWd5KSB7XG4gICAgICBpZiAoIW9wdGlvbnMuYXV0aCkge1xuICAgICAgICAvLyAoMSlcbiAgICAgICAgdGhpcy5hdXRoID0gYXN5bmMgKCkgPT4gKHtcbiAgICAgICAgICB0eXBlOiBcInVuYXV0aGVudGljYXRlZFwiXG4gICAgICAgIH0pO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgLy8gKDIpXG4gICAgICAgIGNvbnN0IGF1dGggPSBhdXRoVG9rZW4uY3JlYXRlVG9rZW5BdXRoKG9wdGlvbnMuYXV0aCk7IC8vIEB0cy1pZ25vcmUgIMKvXFxfKOODhClfL8KvXG5cbiAgICAgICAgaG9vay53cmFwKFwicmVxdWVzdFwiLCBhdXRoLmhvb2spO1xuICAgICAgICB0aGlzLmF1dGggPSBhdXRoO1xuICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICBjb25zdCB7XG4gICAgICAgIGF1dGhTdHJhdGVneVxuICAgICAgfSA9IG9wdGlvbnMsXG4gICAgICAgICAgICBvdGhlck9wdGlvbnMgPSBfb2JqZWN0V2l0aG91dFByb3BlcnRpZXMob3B0aW9ucywgX2V4Y2x1ZGVkKTtcblxuICAgICAgY29uc3QgYXV0aCA9IGF1dGhTdHJhdGVneShPYmplY3QuYXNzaWduKHtcbiAgICAgICAgcmVxdWVzdDogdGhpcy5yZXF1ZXN0LFxuICAgICAgICBsb2c6IHRoaXMubG9nLFxuICAgICAgICAvLyB3ZSBwYXNzIHRoZSBjdXJyZW50IG9jdG9raXQgaW5zdGFuY2UgYXMgd2VsbCBhcyBpdHMgY29uc3RydWN0b3Igb3B0aW9uc1xuICAgICAgICAvLyB0byBhbGxvdyBmb3IgYXV0aGVudGljYXRpb24gc3RyYXRlZ2llcyB0aGF0IHJldHVybiBhIG5ldyBvY3Rva2l0IGluc3RhbmNlXG4gICAgICAgIC8vIHRoYXQgc2hhcmVzIHRoZSBzYW1lIGludGVybmFsIHN0YXRlIGFzIHRoZSBjdXJyZW50IG9uZS4gVGhlIG9yaWdpbmFsXG4gICAgICAgIC8vIHJlcXVpcmVtZW50IGZvciB0aGlzIHdhcyB0aGUgXCJldmVudC1vY3Rva2l0XCIgYXV0aGVudGljYXRpb24gc3RyYXRlZ3lcbiAgICAgICAgLy8gb2YgaHR0cHM6Ly9naXRodWIuY29tL3Byb2JvdC9vY3Rva2l0LWF1dGgtcHJvYm90LlxuICAgICAgICBvY3Rva2l0OiB0aGlzLFxuICAgICAgICBvY3Rva2l0T3B0aW9uczogb3RoZXJPcHRpb25zXG4gICAgICB9LCBvcHRpb25zLmF1dGgpKTsgLy8gQHRzLWlnbm9yZSAgwq9cXF8o44OEKV8vwq9cblxuICAgICAgaG9vay53cmFwKFwicmVxdWVzdFwiLCBhdXRoLmhvb2spO1xuICAgICAgdGhpcy5hdXRoID0gYXV0aDtcbiAgICB9IC8vIGFwcGx5IHBsdWdpbnNcbiAgICAvLyBodHRwczovL3N0YWNrb3ZlcmZsb3cuY29tL2EvMTYzNDUxNzJcblxuXG4gICAgY29uc3QgY2xhc3NDb25zdHJ1Y3RvciA9IHRoaXMuY29uc3RydWN0b3I7XG4gICAgY2xhc3NDb25zdHJ1Y3Rvci5wbHVnaW5zLmZvckVhY2gocGx1Z2luID0+IHtcbiAgICAgIE9iamVjdC5hc3NpZ24odGhpcywgcGx1Z2luKHRoaXMsIG9wdGlvbnMpKTtcbiAgICB9KTtcbiAgfVxuXG4gIHN0YXRpYyBkZWZhdWx0cyhkZWZhdWx0cykge1xuICAgIGNvbnN0IE9jdG9raXRXaXRoRGVmYXVsdHMgPSBjbGFzcyBleHRlbmRzIHRoaXMge1xuICAgICAgY29uc3RydWN0b3IoLi4uYXJncykge1xuICAgICAgICBjb25zdCBvcHRpb25zID0gYXJnc1swXSB8fCB7fTtcblxuICAgICAgICBpZiAodHlwZW9mIGRlZmF1bHRzID09PSBcImZ1bmN0aW9uXCIpIHtcbiAgICAgICAgICBzdXBlcihkZWZhdWx0cyhvcHRpb25zKSk7XG4gICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgc3VwZXIoT2JqZWN0LmFzc2lnbih7fSwgZGVmYXVsdHMsIG9wdGlvbnMsIG9wdGlvbnMudXNlckFnZW50ICYmIGRlZmF1bHRzLnVzZXJBZ2VudCA/IHtcbiAgICAgICAgICB1c2VyQWdlbnQ6IGAke29wdGlvbnMudXNlckFnZW50fSAke2RlZmF1bHRzLnVzZXJBZ2VudH1gXG4gICAgICAgIH0gOiBudWxsKSk7XG4gICAgICB9XG5cbiAgICB9O1xuICAgIHJldHVybiBPY3Rva2l0V2l0aERlZmF1bHRzO1xuICB9XG4gIC8qKlxuICAgKiBBdHRhY2ggYSBwbHVnaW4gKG9yIG1hbnkpIHRvIHlvdXIgT2N0b2tpdCBpbnN0YW5jZS5cbiAgICpcbiAgICogQGV4YW1wbGVcbiAgICogY29uc3QgQVBJID0gT2N0b2tpdC5wbHVnaW4ocGx1Z2luMSwgcGx1Z2luMiwgcGx1Z2luMywgLi4uKVxuICAgKi9cblxuXG4gIHN0YXRpYyBwbHVnaW4oLi4ubmV3UGx1Z2lucykge1xuICAgIHZhciBfYTtcblxuICAgIGNvbnN0IGN1cnJlbnRQbHVnaW5zID0gdGhpcy5wbHVnaW5zO1xuICAgIGNvbnN0IE5ld09jdG9raXQgPSAoX2EgPSBjbGFzcyBleHRlbmRzIHRoaXMge30sIF9hLnBsdWdpbnMgPSBjdXJyZW50UGx1Z2lucy5jb25jYXQobmV3UGx1Z2lucy5maWx0ZXIocGx1Z2luID0+ICFjdXJyZW50UGx1Z2lucy5pbmNsdWRlcyhwbHVnaW4pKSksIF9hKTtcbiAgICByZXR1cm4gTmV3T2N0b2tpdDtcbiAgfVxuXG59XG5PY3Rva2l0LlZFUlNJT04gPSBWRVJTSU9OO1xuT2N0b2tpdC5wbHVnaW5zID0gW107XG5cbmV4cG9ydHMuT2N0b2tpdCA9IE9jdG9raXQ7XG4vLyMgc291cmNlTWFwcGluZ1VSTD1pbmRleC5qcy5tYXBcbiIsCiAgICAiJ3VzZSBzdHJpY3QnO1xuXG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgJ19fZXNNb2R1bGUnLCB7IHZhbHVlOiB0cnVlIH0pO1xuXG5mdW5jdGlvbiBvd25LZXlzKG9iamVjdCwgZW51bWVyYWJsZU9ubHkpIHtcbiAgdmFyIGtleXMgPSBPYmplY3Qua2V5cyhvYmplY3QpO1xuXG4gIGlmIChPYmplY3QuZ2V0T3duUHJvcGVydHlTeW1ib2xzKSB7XG4gICAgdmFyIHN5bWJvbHMgPSBPYmplY3QuZ2V0T3duUHJvcGVydHlTeW1ib2xzKG9iamVjdCk7XG5cbiAgICBpZiAoZW51bWVyYWJsZU9ubHkpIHtcbiAgICAgIHN5bWJvbHMgPSBzeW1ib2xzLmZpbHRlcihmdW5jdGlvbiAoc3ltKSB7XG4gICAgICAgIHJldHVybiBPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKG9iamVjdCwgc3ltKS5lbnVtZXJhYmxlO1xuICAgICAgfSk7XG4gICAgfVxuXG4gICAga2V5cy5wdXNoLmFwcGx5KGtleXMsIHN5bWJvbHMpO1xuICB9XG5cbiAgcmV0dXJuIGtleXM7XG59XG5cbmZ1bmN0aW9uIF9vYmplY3RTcHJlYWQyKHRhcmdldCkge1xuICBmb3IgKHZhciBpID0gMTsgaSA8IGFyZ3VtZW50cy5sZW5ndGg7IGkrKykge1xuICAgIHZhciBzb3VyY2UgPSBhcmd1bWVudHNbaV0gIT0gbnVsbCA/IGFyZ3VtZW50c1tpXSA6IHt9O1xuXG4gICAgaWYgKGkgJSAyKSB7XG4gICAgICBvd25LZXlzKE9iamVjdChzb3VyY2UpLCB0cnVlKS5mb3JFYWNoKGZ1bmN0aW9uIChrZXkpIHtcbiAgICAgICAgX2RlZmluZVByb3BlcnR5KHRhcmdldCwga2V5LCBzb3VyY2Vba2V5XSk7XG4gICAgICB9KTtcbiAgICB9IGVsc2UgaWYgKE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3JzKSB7XG4gICAgICBPYmplY3QuZGVmaW5lUHJvcGVydGllcyh0YXJnZXQsIE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3JzKHNvdXJjZSkpO1xuICAgIH0gZWxzZSB7XG4gICAgICBvd25LZXlzKE9iamVjdChzb3VyY2UpKS5mb3JFYWNoKGZ1bmN0aW9uIChrZXkpIHtcbiAgICAgICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KHRhcmdldCwga2V5LCBPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKHNvdXJjZSwga2V5KSk7XG4gICAgICB9KTtcbiAgICB9XG4gIH1cblxuICByZXR1cm4gdGFyZ2V0O1xufVxuXG5mdW5jdGlvbiBfZGVmaW5lUHJvcGVydHkob2JqLCBrZXksIHZhbHVlKSB7XG4gIGlmIChrZXkgaW4gb2JqKSB7XG4gICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KG9iaiwga2V5LCB7XG4gICAgICB2YWx1ZTogdmFsdWUsXG4gICAgICBlbnVtZXJhYmxlOiB0cnVlLFxuICAgICAgY29uZmlndXJhYmxlOiB0cnVlLFxuICAgICAgd3JpdGFibGU6IHRydWVcbiAgICB9KTtcbiAgfSBlbHNlIHtcbiAgICBvYmpba2V5XSA9IHZhbHVlO1xuICB9XG5cbiAgcmV0dXJuIG9iajtcbn1cblxuY29uc3QgRW5kcG9pbnRzID0ge1xuICBhY3Rpb25zOiB7XG4gICAgYWRkQ3VzdG9tTGFiZWxzVG9TZWxmSG9zdGVkUnVubmVyRm9yT3JnOiBbXCJQT1NUIC9vcmdzL3tvcmd9L2FjdGlvbnMvcnVubmVycy97cnVubmVyX2lkfS9sYWJlbHNcIl0sXG4gICAgYWRkQ3VzdG9tTGFiZWxzVG9TZWxmSG9zdGVkUnVubmVyRm9yUmVwbzogW1wiUE9TVCAvcmVwb3Mve293bmVyfS97cmVwb30vYWN0aW9ucy9ydW5uZXJzL3tydW5uZXJfaWR9L2xhYmVsc1wiXSxcbiAgICBhZGRTZWxlY3RlZFJlcG9Ub09yZ1NlY3JldDogW1wiUFVUIC9vcmdzL3tvcmd9L2FjdGlvbnMvc2VjcmV0cy97c2VjcmV0X25hbWV9L3JlcG9zaXRvcmllcy97cmVwb3NpdG9yeV9pZH1cIl0sXG4gICAgYXBwcm92ZVdvcmtmbG93UnVuOiBbXCJQT1NUIC9yZXBvcy97b3duZXJ9L3tyZXBvfS9hY3Rpb25zL3J1bnMve3J1bl9pZH0vYXBwcm92ZVwiXSxcbiAgICBjYW5jZWxXb3JrZmxvd1J1bjogW1wiUE9TVCAvcmVwb3Mve293bmVyfS97cmVwb30vYWN0aW9ucy9ydW5zL3tydW5faWR9L2NhbmNlbFwiXSxcbiAgICBjcmVhdGVPclVwZGF0ZUVudmlyb25tZW50U2VjcmV0OiBbXCJQVVQgL3JlcG9zaXRvcmllcy97cmVwb3NpdG9yeV9pZH0vZW52aXJvbm1lbnRzL3tlbnZpcm9ubWVudF9uYW1lfS9zZWNyZXRzL3tzZWNyZXRfbmFtZX1cIl0sXG4gICAgY3JlYXRlT3JVcGRhdGVPcmdTZWNyZXQ6IFtcIlBVVCAvb3Jncy97b3JnfS9hY3Rpb25zL3NlY3JldHMve3NlY3JldF9uYW1lfVwiXSxcbiAgICBjcmVhdGVPclVwZGF0ZVJlcG9TZWNyZXQ6IFtcIlBVVCAvcmVwb3Mve293bmVyfS97cmVwb30vYWN0aW9ucy9zZWNyZXRzL3tzZWNyZXRfbmFtZX1cIl0sXG4gICAgY3JlYXRlUmVnaXN0cmF0aW9uVG9rZW5Gb3JPcmc6IFtcIlBPU1QgL29yZ3Mve29yZ30vYWN0aW9ucy9ydW5uZXJzL3JlZ2lzdHJhdGlvbi10b2tlblwiXSxcbiAgICBjcmVhdGVSZWdpc3RyYXRpb25Ub2tlbkZvclJlcG86IFtcIlBPU1QgL3JlcG9zL3tvd25lcn0ve3JlcG99L2FjdGlvbnMvcnVubmVycy9yZWdpc3RyYXRpb24tdG9rZW5cIl0sXG4gICAgY3JlYXRlUmVtb3ZlVG9rZW5Gb3JPcmc6IFtcIlBPU1QgL29yZ3Mve29yZ30vYWN0aW9ucy9ydW5uZXJzL3JlbW92ZS10b2tlblwiXSxcbiAgICBjcmVhdGVSZW1vdmVUb2tlbkZvclJlcG86IFtcIlBPU1QgL3JlcG9zL3tvd25lcn0ve3JlcG99L2FjdGlvbnMvcnVubmVycy9yZW1vdmUtdG9rZW5cIl0sXG4gICAgY3JlYXRlV29ya2Zsb3dEaXNwYXRjaDogW1wiUE9TVCAvcmVwb3Mve293bmVyfS97cmVwb30vYWN0aW9ucy93b3JrZmxvd3Mve3dvcmtmbG93X2lkfS9kaXNwYXRjaGVzXCJdLFxuICAgIGRlbGV0ZUFjdGlvbnNDYWNoZUJ5SWQ6IFtcIkRFTEVURSAvcmVwb3Mve293bmVyfS97cmVwb30vYWN0aW9ucy9jYWNoZXMve2NhY2hlX2lkfVwiXSxcbiAgICBkZWxldGVBY3Rpb25zQ2FjaGVCeUtleTogW1wiREVMRVRFIC9yZXBvcy97b3duZXJ9L3tyZXBvfS9hY3Rpb25zL2NhY2hlc3s/a2V5LHJlZn1cIl0sXG4gICAgZGVsZXRlQXJ0aWZhY3Q6IFtcIkRFTEVURSAvcmVwb3Mve293bmVyfS97cmVwb30vYWN0aW9ucy9hcnRpZmFjdHMve2FydGlmYWN0X2lkfVwiXSxcbiAgICBkZWxldGVFbnZpcm9ubWVudFNlY3JldDogW1wiREVMRVRFIC9yZXBvc2l0b3JpZXMve3JlcG9zaXRvcnlfaWR9L2Vudmlyb25tZW50cy97ZW52aXJvbm1lbnRfbmFtZX0vc2VjcmV0cy97c2VjcmV0X25hbWV9XCJdLFxuICAgIGRlbGV0ZU9yZ1NlY3JldDogW1wiREVMRVRFIC9vcmdzL3tvcmd9L2FjdGlvbnMvc2VjcmV0cy97c2VjcmV0X25hbWV9XCJdLFxuICAgIGRlbGV0ZVJlcG9TZWNyZXQ6IFtcIkRFTEVURSAvcmVwb3Mve293bmVyfS97cmVwb30vYWN0aW9ucy9zZWNyZXRzL3tzZWNyZXRfbmFtZX1cIl0sXG4gICAgZGVsZXRlU2VsZkhvc3RlZFJ1bm5lckZyb21Pcmc6IFtcIkRFTEVURSAvb3Jncy97b3JnfS9hY3Rpb25zL3J1bm5lcnMve3J1bm5lcl9pZH1cIl0sXG4gICAgZGVsZXRlU2VsZkhvc3RlZFJ1bm5lckZyb21SZXBvOiBbXCJERUxFVEUgL3JlcG9zL3tvd25lcn0ve3JlcG99L2FjdGlvbnMvcnVubmVycy97cnVubmVyX2lkfVwiXSxcbiAgICBkZWxldGVXb3JrZmxvd1J1bjogW1wiREVMRVRFIC9yZXBvcy97b3duZXJ9L3tyZXBvfS9hY3Rpb25zL3J1bnMve3J1bl9pZH1cIl0sXG4gICAgZGVsZXRlV29ya2Zsb3dSdW5Mb2dzOiBbXCJERUxFVEUgL3JlcG9zL3tvd25lcn0ve3JlcG99L2FjdGlvbnMvcnVucy97cnVuX2lkfS9sb2dzXCJdLFxuICAgIGRpc2FibGVTZWxlY3RlZFJlcG9zaXRvcnlHaXRodWJBY3Rpb25zT3JnYW5pemF0aW9uOiBbXCJERUxFVEUgL29yZ3Mve29yZ30vYWN0aW9ucy9wZXJtaXNzaW9ucy9yZXBvc2l0b3JpZXMve3JlcG9zaXRvcnlfaWR9XCJdLFxuICAgIGRpc2FibGVXb3JrZmxvdzogW1wiUFVUIC9yZXBvcy97b3duZXJ9L3tyZXBvfS9hY3Rpb25zL3dvcmtmbG93cy97d29ya2Zsb3dfaWR9L2Rpc2FibGVcIl0sXG4gICAgZG93bmxvYWRBcnRpZmFjdDogW1wiR0VUIC9yZXBvcy97b3duZXJ9L3tyZXBvfS9hY3Rpb25zL2FydGlmYWN0cy97YXJ0aWZhY3RfaWR9L3thcmNoaXZlX2Zvcm1hdH1cIl0sXG4gICAgZG93bmxvYWRKb2JMb2dzRm9yV29ya2Zsb3dSdW46IFtcIkdFVCAvcmVwb3Mve293bmVyfS97cmVwb30vYWN0aW9ucy9qb2JzL3tqb2JfaWR9L2xvZ3NcIl0sXG4gICAgZG93bmxvYWRXb3JrZmxvd1J1bkF0dGVtcHRMb2dzOiBbXCJHRVQgL3JlcG9zL3tvd25lcn0ve3JlcG99L2FjdGlvbnMvcnVucy97cnVuX2lkfS9hdHRlbXB0cy97YXR0ZW1wdF9udW1iZXJ9L2xvZ3NcIl0sXG4gICAgZG93bmxvYWRXb3JrZmxvd1J1bkxvZ3M6IFtcIkdFVCAvcmVwb3Mve293bmVyfS97cmVwb30vYWN0aW9ucy9ydW5zL3tydW5faWR9L2xvZ3NcIl0sXG4gICAgZW5hYmxlU2VsZWN0ZWRSZXBvc2l0b3J5R2l0aHViQWN0aW9uc09yZ2FuaXphdGlvbjogW1wiUFVUIC9vcmdzL3tvcmd9L2FjdGlvbnMvcGVybWlzc2lvbnMvcmVwb3NpdG9yaWVzL3tyZXBvc2l0b3J5X2lkfVwiXSxcbiAgICBlbmFibGVXb3JrZmxvdzogW1wiUFVUIC9yZXBvcy97b3duZXJ9L3tyZXBvfS9hY3Rpb25zL3dvcmtmbG93cy97d29ya2Zsb3dfaWR9L2VuYWJsZVwiXSxcbiAgICBnZXRBY3Rpb25zQ2FjaGVMaXN0OiBbXCJHRVQgL3JlcG9zL3tvd25lcn0ve3JlcG99L2FjdGlvbnMvY2FjaGVzXCJdLFxuICAgIGdldEFjdGlvbnNDYWNoZVVzYWdlOiBbXCJHRVQgL3JlcG9zL3tvd25lcn0ve3JlcG99L2FjdGlvbnMvY2FjaGUvdXNhZ2VcIl0sXG4gICAgZ2V0QWN0aW9uc0NhY2hlVXNhZ2VCeVJlcG9Gb3JPcmc6IFtcIkdFVCAvb3Jncy97b3JnfS9hY3Rpb25zL2NhY2hlL3VzYWdlLWJ5LXJlcG9zaXRvcnlcIl0sXG4gICAgZ2V0QWN0aW9uc0NhY2hlVXNhZ2VGb3JFbnRlcnByaXNlOiBbXCJHRVQgL2VudGVycHJpc2VzL3tlbnRlcnByaXNlfS9hY3Rpb25zL2NhY2hlL3VzYWdlXCJdLFxuICAgIGdldEFjdGlvbnNDYWNoZVVzYWdlRm9yT3JnOiBbXCJHRVQgL29yZ3Mve29yZ30vYWN0aW9ucy9jYWNoZS91c2FnZVwiXSxcbiAgICBnZXRBbGxvd2VkQWN0aW9uc09yZ2FuaXphdGlvbjogW1wiR0VUIC9vcmdzL3tvcmd9L2FjdGlvbnMvcGVybWlzc2lvbnMvc2VsZWN0ZWQtYWN0aW9uc1wiXSxcbiAgICBnZXRBbGxvd2VkQWN0aW9uc1JlcG9zaXRvcnk6IFtcIkdFVCAvcmVwb3Mve293bmVyfS97cmVwb30vYWN0aW9ucy9wZXJtaXNzaW9ucy9zZWxlY3RlZC1hY3Rpb25zXCJdLFxuICAgIGdldEFydGlmYWN0OiBbXCJHRVQgL3JlcG9zL3tvd25lcn0ve3JlcG99L2FjdGlvbnMvYXJ0aWZhY3RzL3thcnRpZmFjdF9pZH1cIl0sXG4gICAgZ2V0RW52aXJvbm1lbnRQdWJsaWNLZXk6IFtcIkdFVCAvcmVwb3NpdG9yaWVzL3tyZXBvc2l0b3J5X2lkfS9lbnZpcm9ubWVudHMve2Vudmlyb25tZW50X25hbWV9L3NlY3JldHMvcHVibGljLWtleVwiXSxcbiAgICBnZXRFbnZpcm9ubWVudFNlY3JldDogW1wiR0VUIC9yZXBvc2l0b3JpZXMve3JlcG9zaXRvcnlfaWR9L2Vudmlyb25tZW50cy97ZW52aXJvbm1lbnRfbmFtZX0vc2VjcmV0cy97c2VjcmV0X25hbWV9XCJdLFxuICAgIGdldEdpdGh1YkFjdGlvbnNEZWZhdWx0V29ya2Zsb3dQZXJtaXNzaW9uc0VudGVycHJpc2U6IFtcIkdFVCAvZW50ZXJwcmlzZXMve2VudGVycHJpc2V9L2FjdGlvbnMvcGVybWlzc2lvbnMvd29ya2Zsb3dcIl0sXG4gICAgZ2V0R2l0aHViQWN0aW9uc0RlZmF1bHRXb3JrZmxvd1Blcm1pc3Npb25zT3JnYW5pemF0aW9uOiBbXCJHRVQgL29yZ3Mve29yZ30vYWN0aW9ucy9wZXJtaXNzaW9ucy93b3JrZmxvd1wiXSxcbiAgICBnZXRHaXRodWJBY3Rpb25zRGVmYXVsdFdvcmtmbG93UGVybWlzc2lvbnNSZXBvc2l0b3J5OiBbXCJHRVQgL3JlcG9zL3tvd25lcn0ve3JlcG99L2FjdGlvbnMvcGVybWlzc2lvbnMvd29ya2Zsb3dcIl0sXG4gICAgZ2V0R2l0aHViQWN0aW9uc1Blcm1pc3Npb25zT3JnYW5pemF0aW9uOiBbXCJHRVQgL29yZ3Mve29yZ30vYWN0aW9ucy9wZXJtaXNzaW9uc1wiXSxcbiAgICBnZXRHaXRodWJBY3Rpb25zUGVybWlzc2lvbnNSZXBvc2l0b3J5OiBbXCJHRVQgL3JlcG9zL3tvd25lcn0ve3JlcG99L2FjdGlvbnMvcGVybWlzc2lvbnNcIl0sXG4gICAgZ2V0Sm9iRm9yV29ya2Zsb3dSdW46IFtcIkdFVCAvcmVwb3Mve293bmVyfS97cmVwb30vYWN0aW9ucy9qb2JzL3tqb2JfaWR9XCJdLFxuICAgIGdldE9yZ1B1YmxpY0tleTogW1wiR0VUIC9vcmdzL3tvcmd9L2FjdGlvbnMvc2VjcmV0cy9wdWJsaWMta2V5XCJdLFxuICAgIGdldE9yZ1NlY3JldDogW1wiR0VUIC9vcmdzL3tvcmd9L2FjdGlvbnMvc2VjcmV0cy97c2VjcmV0X25hbWV9XCJdLFxuICAgIGdldFBlbmRpbmdEZXBsb3ltZW50c0ZvclJ1bjogW1wiR0VUIC9yZXBvcy97b3duZXJ9L3tyZXBvfS9hY3Rpb25zL3J1bnMve3J1bl9pZH0vcGVuZGluZ19kZXBsb3ltZW50c1wiXSxcbiAgICBnZXRSZXBvUGVybWlzc2lvbnM6IFtcIkdFVCAvcmVwb3Mve293bmVyfS97cmVwb30vYWN0aW9ucy9wZXJtaXNzaW9uc1wiLCB7fSwge1xuICAgICAgcmVuYW1lZDogW1wiYWN0aW9uc1wiLCBcImdldEdpdGh1YkFjdGlvbnNQZXJtaXNzaW9uc1JlcG9zaXRvcnlcIl1cbiAgICB9XSxcbiAgICBnZXRSZXBvUHVibGljS2V5OiBbXCJHRVQgL3JlcG9zL3tvd25lcn0ve3JlcG99L2FjdGlvbnMvc2VjcmV0cy9wdWJsaWMta2V5XCJdLFxuICAgIGdldFJlcG9TZWNyZXQ6IFtcIkdFVCAvcmVwb3Mve293bmVyfS97cmVwb30vYWN0aW9ucy9zZWNyZXRzL3tzZWNyZXRfbmFtZX1cIl0sXG4gICAgZ2V0UmV2aWV3c0ZvclJ1bjogW1wiR0VUIC9yZXBvcy97b3duZXJ9L3tyZXBvfS9hY3Rpb25zL3J1bnMve3J1bl9pZH0vYXBwcm92YWxzXCJdLFxuICAgIGdldFNlbGZIb3N0ZWRSdW5uZXJGb3JPcmc6IFtcIkdFVCAvb3Jncy97b3JnfS9hY3Rpb25zL3J1bm5lcnMve3J1bm5lcl9pZH1cIl0sXG4gICAgZ2V0U2VsZkhvc3RlZFJ1bm5lckZvclJlcG86IFtcIkdFVCAvcmVwb3Mve293bmVyfS97cmVwb30vYWN0aW9ucy9ydW5uZXJzL3tydW5uZXJfaWR9XCJdLFxuICAgIGdldFdvcmtmbG93OiBbXCJHRVQgL3JlcG9zL3tvd25lcn0ve3JlcG99L2FjdGlvbnMvd29ya2Zsb3dzL3t3b3JrZmxvd19pZH1cIl0sXG4gICAgZ2V0V29ya2Zsb3dBY2Nlc3NUb1JlcG9zaXRvcnk6IFtcIkdFVCAvcmVwb3Mve293bmVyfS97cmVwb30vYWN0aW9ucy9wZXJtaXNzaW9ucy9hY2Nlc3NcIl0sXG4gICAgZ2V0V29ya2Zsb3dSdW46IFtcIkdFVCAvcmVwb3Mve293bmVyfS97cmVwb30vYWN0aW9ucy9ydW5zL3tydW5faWR9XCJdLFxuICAgIGdldFdvcmtmbG93UnVuQXR0ZW1wdDogW1wiR0VUIC9yZXBvcy97b3duZXJ9L3tyZXBvfS9hY3Rpb25zL3J1bnMve3J1bl9pZH0vYXR0ZW1wdHMve2F0dGVtcHRfbnVtYmVyfVwiXSxcbiAgICBnZXRXb3JrZmxvd1J1blVzYWdlOiBbXCJHRVQgL3JlcG9zL3tvd25lcn0ve3JlcG99L2FjdGlvbnMvcnVucy97cnVuX2lkfS90aW1pbmdcIl0sXG4gICAgZ2V0V29ya2Zsb3dVc2FnZTogW1wiR0VUIC9yZXBvcy97b3duZXJ9L3tyZXBvfS9hY3Rpb25zL3dvcmtmbG93cy97d29ya2Zsb3dfaWR9L3RpbWluZ1wiXSxcbiAgICBsaXN0QXJ0aWZhY3RzRm9yUmVwbzogW1wiR0VUIC9yZXBvcy97b3duZXJ9L3tyZXBvfS9hY3Rpb25zL2FydGlmYWN0c1wiXSxcbiAgICBsaXN0RW52aXJvbm1lbnRTZWNyZXRzOiBbXCJHRVQgL3JlcG9zaXRvcmllcy97cmVwb3NpdG9yeV9pZH0vZW52aXJvbm1lbnRzL3tlbnZpcm9ubWVudF9uYW1lfS9zZWNyZXRzXCJdLFxuICAgIGxpc3RKb2JzRm9yV29ya2Zsb3dSdW46IFtcIkdFVCAvcmVwb3Mve293bmVyfS97cmVwb30vYWN0aW9ucy9ydW5zL3tydW5faWR9L2pvYnNcIl0sXG4gICAgbGlzdEpvYnNGb3JXb3JrZmxvd1J1bkF0dGVtcHQ6IFtcIkdFVCAvcmVwb3Mve293bmVyfS97cmVwb30vYWN0aW9ucy9ydW5zL3tydW5faWR9L2F0dGVtcHRzL3thdHRlbXB0X251bWJlcn0vam9ic1wiXSxcbiAgICBsaXN0TGFiZWxzRm9yU2VsZkhvc3RlZFJ1bm5lckZvck9yZzogW1wiR0VUIC9vcmdzL3tvcmd9L2FjdGlvbnMvcnVubmVycy97cnVubmVyX2lkfS9sYWJlbHNcIl0sXG4gICAgbGlzdExhYmVsc0ZvclNlbGZIb3N0ZWRSdW5uZXJGb3JSZXBvOiBbXCJHRVQgL3JlcG9zL3tvd25lcn0ve3JlcG99L2FjdGlvbnMvcnVubmVycy97cnVubmVyX2lkfS9sYWJlbHNcIl0sXG4gICAgbGlzdE9yZ1NlY3JldHM6IFtcIkdFVCAvb3Jncy97b3JnfS9hY3Rpb25zL3NlY3JldHNcIl0sXG4gICAgbGlzdFJlcG9TZWNyZXRzOiBbXCJHRVQgL3JlcG9zL3tvd25lcn0ve3JlcG99L2FjdGlvbnMvc2VjcmV0c1wiXSxcbiAgICBsaXN0UmVwb1dvcmtmbG93czogW1wiR0VUIC9yZXBvcy97b3duZXJ9L3tyZXBvfS9hY3Rpb25zL3dvcmtmbG93c1wiXSxcbiAgICBsaXN0UnVubmVyQXBwbGljYXRpb25zRm9yT3JnOiBbXCJHRVQgL29yZ3Mve29yZ30vYWN0aW9ucy9ydW5uZXJzL2Rvd25sb2Fkc1wiXSxcbiAgICBsaXN0UnVubmVyQXBwbGljYXRpb25zRm9yUmVwbzogW1wiR0VUIC9yZXBvcy97b3duZXJ9L3tyZXBvfS9hY3Rpb25zL3J1bm5lcnMvZG93bmxvYWRzXCJdLFxuICAgIGxpc3RTZWxlY3RlZFJlcG9zRm9yT3JnU2VjcmV0OiBbXCJHRVQgL29yZ3Mve29yZ30vYWN0aW9ucy9zZWNyZXRzL3tzZWNyZXRfbmFtZX0vcmVwb3NpdG9yaWVzXCJdLFxuICAgIGxpc3RTZWxlY3RlZFJlcG9zaXRvcmllc0VuYWJsZWRHaXRodWJBY3Rpb25zT3JnYW5pemF0aW9uOiBbXCJHRVQgL29yZ3Mve29yZ30vYWN0aW9ucy9wZXJtaXNzaW9ucy9yZXBvc2l0b3JpZXNcIl0sXG4gICAgbGlzdFNlbGZIb3N0ZWRSdW5uZXJzRm9yT3JnOiBbXCJHRVQgL29yZ3Mve29yZ30vYWN0aW9ucy9ydW5uZXJzXCJdLFxuICAgIGxpc3RTZWxmSG9zdGVkUnVubmVyc0ZvclJlcG86IFtcIkdFVCAvcmVwb3Mve293bmVyfS97cmVwb30vYWN0aW9ucy9ydW5uZXJzXCJdLFxuICAgIGxpc3RXb3JrZmxvd1J1bkFydGlmYWN0czogW1wiR0VUIC9yZXBvcy97b3duZXJ9L3tyZXBvfS9hY3Rpb25zL3J1bnMve3J1bl9pZH0vYXJ0aWZhY3RzXCJdLFxuICAgIGxpc3RXb3JrZmxvd1J1bnM6IFtcIkdFVCAvcmVwb3Mve293bmVyfS97cmVwb30vYWN0aW9ucy93b3JrZmxvd3Mve3dvcmtmbG93X2lkfS9ydW5zXCJdLFxuICAgIGxpc3RXb3JrZmxvd1J1bnNGb3JSZXBvOiBbXCJHRVQgL3JlcG9zL3tvd25lcn0ve3JlcG99L2FjdGlvbnMvcnVuc1wiXSxcbiAgICByZVJ1bkpvYkZvcldvcmtmbG93UnVuOiBbXCJQT1NUIC9yZXBvcy97b3duZXJ9L3tyZXBvfS9hY3Rpb25zL2pvYnMve2pvYl9pZH0vcmVydW5cIl0sXG4gICAgcmVSdW5Xb3JrZmxvdzogW1wiUE9TVCAvcmVwb3Mve293bmVyfS97cmVwb30vYWN0aW9ucy9ydW5zL3tydW5faWR9L3JlcnVuXCJdLFxuICAgIHJlUnVuV29ya2Zsb3dGYWlsZWRKb2JzOiBbXCJQT1NUIC9yZXBvcy97b3duZXJ9L3tyZXBvfS9hY3Rpb25zL3J1bnMve3J1bl9pZH0vcmVydW4tZmFpbGVkLWpvYnNcIl0sXG4gICAgcmVtb3ZlQWxsQ3VzdG9tTGFiZWxzRnJvbVNlbGZIb3N0ZWRSdW5uZXJGb3JPcmc6IFtcIkRFTEVURSAvb3Jncy97b3JnfS9hY3Rpb25zL3J1bm5lcnMve3J1bm5lcl9pZH0vbGFiZWxzXCJdLFxuICAgIHJlbW92ZUFsbEN1c3RvbUxhYmVsc0Zyb21TZWxmSG9zdGVkUnVubmVyRm9yUmVwbzogW1wiREVMRVRFIC9yZXBvcy97b3duZXJ9L3tyZXBvfS9hY3Rpb25zL3J1bm5lcnMve3J1bm5lcl9pZH0vbGFiZWxzXCJdLFxuICAgIHJlbW92ZUN1c3RvbUxhYmVsRnJvbVNlbGZIb3N0ZWRSdW5uZXJGb3JPcmc6IFtcIkRFTEVURSAvb3Jncy97b3JnfS9hY3Rpb25zL3J1bm5lcnMve3J1bm5lcl9pZH0vbGFiZWxzL3tuYW1lfVwiXSxcbiAgICByZW1vdmVDdXN0b21MYWJlbEZyb21TZWxmSG9zdGVkUnVubmVyRm9yUmVwbzogW1wiREVMRVRFIC9yZXBvcy97b3duZXJ9L3tyZXBvfS9hY3Rpb25zL3J1bm5lcnMve3J1bm5lcl9pZH0vbGFiZWxzL3tuYW1lfVwiXSxcbiAgICByZW1vdmVTZWxlY3RlZFJlcG9Gcm9tT3JnU2VjcmV0OiBbXCJERUxFVEUgL29yZ3Mve29yZ30vYWN0aW9ucy9zZWNyZXRzL3tzZWNyZXRfbmFtZX0vcmVwb3NpdG9yaWVzL3tyZXBvc2l0b3J5X2lkfVwiXSxcbiAgICByZXZpZXdQZW5kaW5nRGVwbG95bWVudHNGb3JSdW46IFtcIlBPU1QgL3JlcG9zL3tvd25lcn0ve3JlcG99L2FjdGlvbnMvcnVucy97cnVuX2lkfS9wZW5kaW5nX2RlcGxveW1lbnRzXCJdLFxuICAgIHNldEFsbG93ZWRBY3Rpb25zT3JnYW5pemF0aW9uOiBbXCJQVVQgL29yZ3Mve29yZ30vYWN0aW9ucy9wZXJtaXNzaW9ucy9zZWxlY3RlZC1hY3Rpb25zXCJdLFxuICAgIHNldEFsbG93ZWRBY3Rpb25zUmVwb3NpdG9yeTogW1wiUFVUIC9yZXBvcy97b3duZXJ9L3tyZXBvfS9hY3Rpb25zL3Blcm1pc3Npb25zL3NlbGVjdGVkLWFjdGlvbnNcIl0sXG4gICAgc2V0Q3VzdG9tTGFiZWxzRm9yU2VsZkhvc3RlZFJ1bm5lckZvck9yZzogW1wiUFVUIC9vcmdzL3tvcmd9L2FjdGlvbnMvcnVubmVycy97cnVubmVyX2lkfS9sYWJlbHNcIl0sXG4gICAgc2V0Q3VzdG9tTGFiZWxzRm9yU2VsZkhvc3RlZFJ1bm5lckZvclJlcG86IFtcIlBVVCAvcmVwb3Mve293bmVyfS97cmVwb30vYWN0aW9ucy9ydW5uZXJzL3tydW5uZXJfaWR9L2xhYmVsc1wiXSxcbiAgICBzZXRHaXRodWJBY3Rpb25zRGVmYXVsdFdvcmtmbG93UGVybWlzc2lvbnNFbnRlcnByaXNlOiBbXCJQVVQgL2VudGVycHJpc2VzL3tlbnRlcnByaXNlfS9hY3Rpb25zL3Blcm1pc3Npb25zL3dvcmtmbG93XCJdLFxuICAgIHNldEdpdGh1YkFjdGlvbnNEZWZhdWx0V29ya2Zsb3dQZXJtaXNzaW9uc09yZ2FuaXphdGlvbjogW1wiUFVUIC9vcmdzL3tvcmd9L2FjdGlvbnMvcGVybWlzc2lvbnMvd29ya2Zsb3dcIl0sXG4gICAgc2V0R2l0aHViQWN0aW9uc0RlZmF1bHRXb3JrZmxvd1Blcm1pc3Npb25zUmVwb3NpdG9yeTogW1wiUFVUIC9yZXBvcy97b3duZXJ9L3tyZXBvfS9hY3Rpb25zL3Blcm1pc3Npb25zL3dvcmtmbG93XCJdLFxuICAgIHNldEdpdGh1YkFjdGlvbnNQZXJtaXNzaW9uc09yZ2FuaXphdGlvbjogW1wiUFVUIC9vcmdzL3tvcmd9L2FjdGlvbnMvcGVybWlzc2lvbnNcIl0sXG4gICAgc2V0R2l0aHViQWN0aW9uc1Blcm1pc3Npb25zUmVwb3NpdG9yeTogW1wiUFVUIC9yZXBvcy97b3duZXJ9L3tyZXBvfS9hY3Rpb25zL3Blcm1pc3Npb25zXCJdLFxuICAgIHNldFNlbGVjdGVkUmVwb3NGb3JPcmdTZWNyZXQ6IFtcIlBVVCAvb3Jncy97b3JnfS9hY3Rpb25zL3NlY3JldHMve3NlY3JldF9uYW1lfS9yZXBvc2l0b3JpZXNcIl0sXG4gICAgc2V0U2VsZWN0ZWRSZXBvc2l0b3JpZXNFbmFibGVkR2l0aHViQWN0aW9uc09yZ2FuaXphdGlvbjogW1wiUFVUIC9vcmdzL3tvcmd9L2FjdGlvbnMvcGVybWlzc2lvbnMvcmVwb3NpdG9yaWVzXCJdLFxuICAgIHNldFdvcmtmbG93QWNjZXNzVG9SZXBvc2l0b3J5OiBbXCJQVVQgL3JlcG9zL3tvd25lcn0ve3JlcG99L2FjdGlvbnMvcGVybWlzc2lvbnMvYWNjZXNzXCJdXG4gIH0sXG4gIGFjdGl2aXR5OiB7XG4gICAgY2hlY2tSZXBvSXNTdGFycmVkQnlBdXRoZW50aWNhdGVkVXNlcjogW1wiR0VUIC91c2VyL3N0YXJyZWQve293bmVyfS97cmVwb31cIl0sXG4gICAgZGVsZXRlUmVwb1N1YnNjcmlwdGlvbjogW1wiREVMRVRFIC9yZXBvcy97b3duZXJ9L3tyZXBvfS9zdWJzY3JpcHRpb25cIl0sXG4gICAgZGVsZXRlVGhyZWFkU3Vic2NyaXB0aW9uOiBbXCJERUxFVEUgL25vdGlmaWNhdGlvbnMvdGhyZWFkcy97dGhyZWFkX2lkfS9zdWJzY3JpcHRpb25cIl0sXG4gICAgZ2V0RmVlZHM6IFtcIkdFVCAvZmVlZHNcIl0sXG4gICAgZ2V0UmVwb1N1YnNjcmlwdGlvbjogW1wiR0VUIC9yZXBvcy97b3duZXJ9L3tyZXBvfS9zdWJzY3JpcHRpb25cIl0sXG4gICAgZ2V0VGhyZWFkOiBbXCJHRVQgL25vdGlmaWNhdGlvbnMvdGhyZWFkcy97dGhyZWFkX2lkfVwiXSxcbiAgICBnZXRUaHJlYWRTdWJzY3JpcHRpb25Gb3JBdXRoZW50aWNhdGVkVXNlcjogW1wiR0VUIC9ub3RpZmljYXRpb25zL3RocmVhZHMve3RocmVhZF9pZH0vc3Vic2NyaXB0aW9uXCJdLFxuICAgIGxpc3RFdmVudHNGb3JBdXRoZW50aWNhdGVkVXNlcjogW1wiR0VUIC91c2Vycy97dXNlcm5hbWV9L2V2ZW50c1wiXSxcbiAgICBsaXN0Tm90aWZpY2F0aW9uc0ZvckF1dGhlbnRpY2F0ZWRVc2VyOiBbXCJHRVQgL25vdGlmaWNhdGlvbnNcIl0sXG4gICAgbGlzdE9yZ0V2ZW50c0ZvckF1dGhlbnRpY2F0ZWRVc2VyOiBbXCJHRVQgL3VzZXJzL3t1c2VybmFtZX0vZXZlbnRzL29yZ3Mve29yZ31cIl0sXG4gICAgbGlzdFB1YmxpY0V2ZW50czogW1wiR0VUIC9ldmVudHNcIl0sXG4gICAgbGlzdFB1YmxpY0V2ZW50c0ZvclJlcG9OZXR3b3JrOiBbXCJHRVQgL25ldHdvcmtzL3tvd25lcn0ve3JlcG99L2V2ZW50c1wiXSxcbiAgICBsaXN0UHVibGljRXZlbnRzRm9yVXNlcjogW1wiR0VUIC91c2Vycy97dXNlcm5hbWV9L2V2ZW50cy9wdWJsaWNcIl0sXG4gICAgbGlzdFB1YmxpY09yZ0V2ZW50czogW1wiR0VUIC9vcmdzL3tvcmd9L2V2ZW50c1wiXSxcbiAgICBsaXN0UmVjZWl2ZWRFdmVudHNGb3JVc2VyOiBbXCJHRVQgL3VzZXJzL3t1c2VybmFtZX0vcmVjZWl2ZWRfZXZlbnRzXCJdLFxuICAgIGxpc3RSZWNlaXZlZFB1YmxpY0V2ZW50c0ZvclVzZXI6IFtcIkdFVCAvdXNlcnMve3VzZXJuYW1lfS9yZWNlaXZlZF9ldmVudHMvcHVibGljXCJdLFxuICAgIGxpc3RSZXBvRXZlbnRzOiBbXCJHRVQgL3JlcG9zL3tvd25lcn0ve3JlcG99L2V2ZW50c1wiXSxcbiAgICBsaXN0UmVwb05vdGlmaWNhdGlvbnNGb3JBdXRoZW50aWNhdGVkVXNlcjogW1wiR0VUIC9yZXBvcy97b3duZXJ9L3tyZXBvfS9ub3RpZmljYXRpb25zXCJdLFxuICAgIGxpc3RSZXBvc1N0YXJyZWRCeUF1dGhlbnRpY2F0ZWRVc2VyOiBbXCJHRVQgL3VzZXIvc3RhcnJlZFwiXSxcbiAgICBsaXN0UmVwb3NTdGFycmVkQnlVc2VyOiBbXCJHRVQgL3VzZXJzL3t1c2VybmFtZX0vc3RhcnJlZFwiXSxcbiAgICBsaXN0UmVwb3NXYXRjaGVkQnlVc2VyOiBbXCJHRVQgL3VzZXJzL3t1c2VybmFtZX0vc3Vic2NyaXB0aW9uc1wiXSxcbiAgICBsaXN0U3RhcmdhemVyc0ZvclJlcG86IFtcIkdFVCAvcmVwb3Mve293bmVyfS97cmVwb30vc3RhcmdhemVyc1wiXSxcbiAgICBsaXN0V2F0Y2hlZFJlcG9zRm9yQXV0aGVudGljYXRlZFVzZXI6IFtcIkdFVCAvdXNlci9zdWJzY3JpcHRpb25zXCJdLFxuICAgIGxpc3RXYXRjaGVyc0ZvclJlcG86IFtcIkdFVCAvcmVwb3Mve293bmVyfS97cmVwb30vc3Vic2NyaWJlcnNcIl0sXG4gICAgbWFya05vdGlmaWNhdGlvbnNBc1JlYWQ6IFtcIlBVVCAvbm90aWZpY2F0aW9uc1wiXSxcbiAgICBtYXJrUmVwb05vdGlmaWNhdGlvbnNBc1JlYWQ6IFtcIlBVVCAvcmVwb3Mve293bmVyfS97cmVwb30vbm90aWZpY2F0aW9uc1wiXSxcbiAgICBtYXJrVGhyZWFkQXNSZWFkOiBbXCJQQVRDSCAvbm90aWZpY2F0aW9ucy90aHJlYWRzL3t0aHJlYWRfaWR9XCJdLFxuICAgIHNldFJlcG9TdWJzY3JpcHRpb246IFtcIlBVVCAvcmVwb3Mve293bmVyfS97cmVwb30vc3Vic2NyaXB0aW9uXCJdLFxuICAgIHNldFRocmVhZFN1YnNjcmlwdGlvbjogW1wiUFVUIC9ub3RpZmljYXRpb25zL3RocmVhZHMve3RocmVhZF9pZH0vc3Vic2NyaXB0aW9uXCJdLFxuICAgIHN0YXJSZXBvRm9yQXV0aGVudGljYXRlZFVzZXI6IFtcIlBVVCAvdXNlci9zdGFycmVkL3tvd25lcn0ve3JlcG99XCJdLFxuICAgIHVuc3RhclJlcG9Gb3JBdXRoZW50aWNhdGVkVXNlcjogW1wiREVMRVRFIC91c2VyL3N0YXJyZWQve293bmVyfS97cmVwb31cIl1cbiAgfSxcbiAgYXBwczoge1xuICAgIGFkZFJlcG9Ub0luc3RhbGxhdGlvbjogW1wiUFVUIC91c2VyL2luc3RhbGxhdGlvbnMve2luc3RhbGxhdGlvbl9pZH0vcmVwb3NpdG9yaWVzL3tyZXBvc2l0b3J5X2lkfVwiLCB7fSwge1xuICAgICAgcmVuYW1lZDogW1wiYXBwc1wiLCBcImFkZFJlcG9Ub0luc3RhbGxhdGlvbkZvckF1dGhlbnRpY2F0ZWRVc2VyXCJdXG4gICAgfV0sXG4gICAgYWRkUmVwb1RvSW5zdGFsbGF0aW9uRm9yQXV0aGVudGljYXRlZFVzZXI6IFtcIlBVVCAvdXNlci9pbnN0YWxsYXRpb25zL3tpbnN0YWxsYXRpb25faWR9L3JlcG9zaXRvcmllcy97cmVwb3NpdG9yeV9pZH1cIl0sXG4gICAgY2hlY2tUb2tlbjogW1wiUE9TVCAvYXBwbGljYXRpb25zL3tjbGllbnRfaWR9L3Rva2VuXCJdLFxuICAgIGNyZWF0ZUZyb21NYW5pZmVzdDogW1wiUE9TVCAvYXBwLW1hbmlmZXN0cy97Y29kZX0vY29udmVyc2lvbnNcIl0sXG4gICAgY3JlYXRlSW5zdGFsbGF0aW9uQWNjZXNzVG9rZW46IFtcIlBPU1QgL2FwcC9pbnN0YWxsYXRpb25zL3tpbnN0YWxsYXRpb25faWR9L2FjY2Vzc190b2tlbnNcIl0sXG4gICAgZGVsZXRlQXV0aG9yaXphdGlvbjogW1wiREVMRVRFIC9hcHBsaWNhdGlvbnMve2NsaWVudF9pZH0vZ3JhbnRcIl0sXG4gICAgZGVsZXRlSW5zdGFsbGF0aW9uOiBbXCJERUxFVEUgL2FwcC9pbnN0YWxsYXRpb25zL3tpbnN0YWxsYXRpb25faWR9XCJdLFxuICAgIGRlbGV0ZVRva2VuOiBbXCJERUxFVEUgL2FwcGxpY2F0aW9ucy97Y2xpZW50X2lkfS90b2tlblwiXSxcbiAgICBnZXRBdXRoZW50aWNhdGVkOiBbXCJHRVQgL2FwcFwiXSxcbiAgICBnZXRCeVNsdWc6IFtcIkdFVCAvYXBwcy97YXBwX3NsdWd9XCJdLFxuICAgIGdldEluc3RhbGxhdGlvbjogW1wiR0VUIC9hcHAvaW5zdGFsbGF0aW9ucy97aW5zdGFsbGF0aW9uX2lkfVwiXSxcbiAgICBnZXRPcmdJbnN0YWxsYXRpb246IFtcIkdFVCAvb3Jncy97b3JnfS9pbnN0YWxsYXRpb25cIl0sXG4gICAgZ2V0UmVwb0luc3RhbGxhdGlvbjogW1wiR0VUIC9yZXBvcy97b3duZXJ9L3tyZXBvfS9pbnN0YWxsYXRpb25cIl0sXG4gICAgZ2V0U3Vic2NyaXB0aW9uUGxhbkZvckFjY291bnQ6IFtcIkdFVCAvbWFya2V0cGxhY2VfbGlzdGluZy9hY2NvdW50cy97YWNjb3VudF9pZH1cIl0sXG4gICAgZ2V0U3Vic2NyaXB0aW9uUGxhbkZvckFjY291bnRTdHViYmVkOiBbXCJHRVQgL21hcmtldHBsYWNlX2xpc3Rpbmcvc3R1YmJlZC9hY2NvdW50cy97YWNjb3VudF9pZH1cIl0sXG4gICAgZ2V0VXNlckluc3RhbGxhdGlvbjogW1wiR0VUIC91c2Vycy97dXNlcm5hbWV9L2luc3RhbGxhdGlvblwiXSxcbiAgICBnZXRXZWJob29rQ29uZmlnRm9yQXBwOiBbXCJHRVQgL2FwcC9ob29rL2NvbmZpZ1wiXSxcbiAgICBnZXRXZWJob29rRGVsaXZlcnk6IFtcIkdFVCAvYXBwL2hvb2svZGVsaXZlcmllcy97ZGVsaXZlcnlfaWR9XCJdLFxuICAgIGxpc3RBY2NvdW50c0ZvclBsYW46IFtcIkdFVCAvbWFya2V0cGxhY2VfbGlzdGluZy9wbGFucy97cGxhbl9pZH0vYWNjb3VudHNcIl0sXG4gICAgbGlzdEFjY291bnRzRm9yUGxhblN0dWJiZWQ6IFtcIkdFVCAvbWFya2V0cGxhY2VfbGlzdGluZy9zdHViYmVkL3BsYW5zL3twbGFuX2lkfS9hY2NvdW50c1wiXSxcbiAgICBsaXN0SW5zdGFsbGF0aW9uUmVwb3NGb3JBdXRoZW50aWNhdGVkVXNlcjogW1wiR0VUIC91c2VyL2luc3RhbGxhdGlvbnMve2luc3RhbGxhdGlvbl9pZH0vcmVwb3NpdG9yaWVzXCJdLFxuICAgIGxpc3RJbnN0YWxsYXRpb25zOiBbXCJHRVQgL2FwcC9pbnN0YWxsYXRpb25zXCJdLFxuICAgIGxpc3RJbnN0YWxsYXRpb25zRm9yQXV0aGVudGljYXRlZFVzZXI6IFtcIkdFVCAvdXNlci9pbnN0YWxsYXRpb25zXCJdLFxuICAgIGxpc3RQbGFuczogW1wiR0VUIC9tYXJrZXRwbGFjZV9saXN0aW5nL3BsYW5zXCJdLFxuICAgIGxpc3RQbGFuc1N0dWJiZWQ6IFtcIkdFVCAvbWFya2V0cGxhY2VfbGlzdGluZy9zdHViYmVkL3BsYW5zXCJdLFxuICAgIGxpc3RSZXBvc0FjY2Vzc2libGVUb0luc3RhbGxhdGlvbjogW1wiR0VUIC9pbnN0YWxsYXRpb24vcmVwb3NpdG9yaWVzXCJdLFxuICAgIGxpc3RTdWJzY3JpcHRpb25zRm9yQXV0aGVudGljYXRlZFVzZXI6IFtcIkdFVCAvdXNlci9tYXJrZXRwbGFjZV9wdXJjaGFzZXNcIl0sXG4gICAgbGlzdFN1YnNjcmlwdGlvbnNGb3JBdXRoZW50aWNhdGVkVXNlclN0dWJiZWQ6IFtcIkdFVCAvdXNlci9tYXJrZXRwbGFjZV9wdXJjaGFzZXMvc3R1YmJlZFwiXSxcbiAgICBsaXN0V2ViaG9va0RlbGl2ZXJpZXM6IFtcIkdFVCAvYXBwL2hvb2svZGVsaXZlcmllc1wiXSxcbiAgICByZWRlbGl2ZXJXZWJob29rRGVsaXZlcnk6IFtcIlBPU1QgL2FwcC9ob29rL2RlbGl2ZXJpZXMve2RlbGl2ZXJ5X2lkfS9hdHRlbXB0c1wiXSxcbiAgICByZW1vdmVSZXBvRnJvbUluc3RhbGxhdGlvbjogW1wiREVMRVRFIC91c2VyL2luc3RhbGxhdGlvbnMve2luc3RhbGxhdGlvbl9pZH0vcmVwb3NpdG9yaWVzL3tyZXBvc2l0b3J5X2lkfVwiLCB7fSwge1xuICAgICAgcmVuYW1lZDogW1wiYXBwc1wiLCBcInJlbW92ZVJlcG9Gcm9tSW5zdGFsbGF0aW9uRm9yQXV0aGVudGljYXRlZFVzZXJcIl1cbiAgICB9XSxcbiAgICByZW1vdmVSZXBvRnJvbUluc3RhbGxhdGlvbkZvckF1dGhlbnRpY2F0ZWRVc2VyOiBbXCJERUxFVEUgL3VzZXIvaW5zdGFsbGF0aW9ucy97aW5zdGFsbGF0aW9uX2lkfS9yZXBvc2l0b3JpZXMve3JlcG9zaXRvcnlfaWR9XCJdLFxuICAgIHJlc2V0VG9rZW46IFtcIlBBVENIIC9hcHBsaWNhdGlvbnMve2NsaWVudF9pZH0vdG9rZW5cIl0sXG4gICAgcmV2b2tlSW5zdGFsbGF0aW9uQWNjZXNzVG9rZW46IFtcIkRFTEVURSAvaW5zdGFsbGF0aW9uL3Rva2VuXCJdLFxuICAgIHNjb3BlVG9rZW46IFtcIlBPU1QgL2FwcGxpY2F0aW9ucy97Y2xpZW50X2lkfS90b2tlbi9zY29wZWRcIl0sXG4gICAgc3VzcGVuZEluc3RhbGxhdGlvbjogW1wiUFVUIC9hcHAvaW5zdGFsbGF0aW9ucy97aW5zdGFsbGF0aW9uX2lkfS9zdXNwZW5kZWRcIl0sXG4gICAgdW5zdXNwZW5kSW5zdGFsbGF0aW9uOiBbXCJERUxFVEUgL2FwcC9pbnN0YWxsYXRpb25zL3tpbnN0YWxsYXRpb25faWR9L3N1c3BlbmRlZFwiXSxcbiAgICB1cGRhdGVXZWJob29rQ29uZmlnRm9yQXBwOiBbXCJQQVRDSCAvYXBwL2hvb2svY29uZmlnXCJdXG4gIH0sXG4gIGJpbGxpbmc6IHtcbiAgICBnZXRHaXRodWJBY3Rpb25zQmlsbGluZ09yZzogW1wiR0VUIC9vcmdzL3tvcmd9L3NldHRpbmdzL2JpbGxpbmcvYWN0aW9uc1wiXSxcbiAgICBnZXRHaXRodWJBY3Rpb25zQmlsbGluZ1VzZXI6IFtcIkdFVCAvdXNlcnMve3VzZXJuYW1lfS9zZXR0aW5ncy9iaWxsaW5nL2FjdGlvbnNcIl0sXG4gICAgZ2V0R2l0aHViQWR2YW5jZWRTZWN1cml0eUJpbGxpbmdHaGU6IFtcIkdFVCAvZW50ZXJwcmlzZXMve2VudGVycHJpc2V9L3NldHRpbmdzL2JpbGxpbmcvYWR2YW5jZWQtc2VjdXJpdHlcIl0sXG4gICAgZ2V0R2l0aHViQWR2YW5jZWRTZWN1cml0eUJpbGxpbmdPcmc6IFtcIkdFVCAvb3Jncy97b3JnfS9zZXR0aW5ncy9iaWxsaW5nL2FkdmFuY2VkLXNlY3VyaXR5XCJdLFxuICAgIGdldEdpdGh1YlBhY2thZ2VzQmlsbGluZ09yZzogW1wiR0VUIC9vcmdzL3tvcmd9L3NldHRpbmdzL2JpbGxpbmcvcGFja2FnZXNcIl0sXG4gICAgZ2V0R2l0aHViUGFja2FnZXNCaWxsaW5nVXNlcjogW1wiR0VUIC91c2Vycy97dXNlcm5hbWV9L3NldHRpbmdzL2JpbGxpbmcvcGFja2FnZXNcIl0sXG4gICAgZ2V0U2hhcmVkU3RvcmFnZUJpbGxpbmdPcmc6IFtcIkdFVCAvb3Jncy97b3JnfS9zZXR0aW5ncy9iaWxsaW5nL3NoYXJlZC1zdG9yYWdlXCJdLFxuICAgIGdldFNoYXJlZFN0b3JhZ2VCaWxsaW5nVXNlcjogW1wiR0VUIC91c2Vycy97dXNlcm5hbWV9L3NldHRpbmdzL2JpbGxpbmcvc2hhcmVkLXN0b3JhZ2VcIl1cbiAgfSxcbiAgY2hlY2tzOiB7XG4gICAgY3JlYXRlOiBbXCJQT1NUIC9yZXBvcy97b3duZXJ9L3tyZXBvfS9jaGVjay1ydW5zXCJdLFxuICAgIGNyZWF0ZVN1aXRlOiBbXCJQT1NUIC9yZXBvcy97b3duZXJ9L3tyZXBvfS9jaGVjay1zdWl0ZXNcIl0sXG4gICAgZ2V0OiBbXCJHRVQgL3JlcG9zL3tvd25lcn0ve3JlcG99L2NoZWNrLXJ1bnMve2NoZWNrX3J1bl9pZH1cIl0sXG4gICAgZ2V0U3VpdGU6IFtcIkdFVCAvcmVwb3Mve293bmVyfS97cmVwb30vY2hlY2stc3VpdGVzL3tjaGVja19zdWl0ZV9pZH1cIl0sXG4gICAgbGlzdEFubm90YXRpb25zOiBbXCJHRVQgL3JlcG9zL3tvd25lcn0ve3JlcG99L2NoZWNrLXJ1bnMve2NoZWNrX3J1bl9pZH0vYW5ub3RhdGlvbnNcIl0sXG4gICAgbGlzdEZvclJlZjogW1wiR0VUIC9yZXBvcy97b3duZXJ9L3tyZXBvfS9jb21taXRzL3tyZWZ9L2NoZWNrLXJ1bnNcIl0sXG4gICAgbGlzdEZvclN1aXRlOiBbXCJHRVQgL3JlcG9zL3tvd25lcn0ve3JlcG99L2NoZWNrLXN1aXRlcy97Y2hlY2tfc3VpdGVfaWR9L2NoZWNrLXJ1bnNcIl0sXG4gICAgbGlzdFN1aXRlc0ZvclJlZjogW1wiR0VUIC9yZXBvcy97b3duZXJ9L3tyZXBvfS9jb21taXRzL3tyZWZ9L2NoZWNrLXN1aXRlc1wiXSxcbiAgICByZXJlcXVlc3RSdW46IFtcIlBPU1QgL3JlcG9zL3tvd25lcn0ve3JlcG99L2NoZWNrLXJ1bnMve2NoZWNrX3J1bl9pZH0vcmVyZXF1ZXN0XCJdLFxuICAgIHJlcmVxdWVzdFN1aXRlOiBbXCJQT1NUIC9yZXBvcy97b3duZXJ9L3tyZXBvfS9jaGVjay1zdWl0ZXMve2NoZWNrX3N1aXRlX2lkfS9yZXJlcXVlc3RcIl0sXG4gICAgc2V0U3VpdGVzUHJlZmVyZW5jZXM6IFtcIlBBVENIIC9yZXBvcy97b3duZXJ9L3tyZXBvfS9jaGVjay1zdWl0ZXMvcHJlZmVyZW5jZXNcIl0sXG4gICAgdXBkYXRlOiBbXCJQQVRDSCAvcmVwb3Mve293bmVyfS97cmVwb30vY2hlY2stcnVucy97Y2hlY2tfcnVuX2lkfVwiXVxuICB9LFxuICBjb2RlU2Nhbm5pbmc6IHtcbiAgICBkZWxldGVBbmFseXNpczogW1wiREVMRVRFIC9yZXBvcy97b3duZXJ9L3tyZXBvfS9jb2RlLXNjYW5uaW5nL2FuYWx5c2VzL3thbmFseXNpc19pZH17P2NvbmZpcm1fZGVsZXRlfVwiXSxcbiAgICBnZXRBbGVydDogW1wiR0VUIC9yZXBvcy97b3duZXJ9L3tyZXBvfS9jb2RlLXNjYW5uaW5nL2FsZXJ0cy97YWxlcnRfbnVtYmVyfVwiLCB7fSwge1xuICAgICAgcmVuYW1lZFBhcmFtZXRlcnM6IHtcbiAgICAgICAgYWxlcnRfaWQ6IFwiYWxlcnRfbnVtYmVyXCJcbiAgICAgIH1cbiAgICB9XSxcbiAgICBnZXRBbmFseXNpczogW1wiR0VUIC9yZXBvcy97b3duZXJ9L3tyZXBvfS9jb2RlLXNjYW5uaW5nL2FuYWx5c2VzL3thbmFseXNpc19pZH1cIl0sXG4gICAgZ2V0U2FyaWY6IFtcIkdFVCAvcmVwb3Mve293bmVyfS97cmVwb30vY29kZS1zY2FubmluZy9zYXJpZnMve3NhcmlmX2lkfVwiXSxcbiAgICBsaXN0QWxlcnRJbnN0YW5jZXM6IFtcIkdFVCAvcmVwb3Mve293bmVyfS97cmVwb30vY29kZS1zY2FubmluZy9hbGVydHMve2FsZXJ0X251bWJlcn0vaW5zdGFuY2VzXCJdLFxuICAgIGxpc3RBbGVydHNGb3JPcmc6IFtcIkdFVCAvb3Jncy97b3JnfS9jb2RlLXNjYW5uaW5nL2FsZXJ0c1wiXSxcbiAgICBsaXN0QWxlcnRzRm9yUmVwbzogW1wiR0VUIC9yZXBvcy97b3duZXJ9L3tyZXBvfS9jb2RlLXNjYW5uaW5nL2FsZXJ0c1wiXSxcbiAgICBsaXN0QWxlcnRzSW5zdGFuY2VzOiBbXCJHRVQgL3JlcG9zL3tvd25lcn0ve3JlcG99L2NvZGUtc2Nhbm5pbmcvYWxlcnRzL3thbGVydF9udW1iZXJ9L2luc3RhbmNlc1wiLCB7fSwge1xuICAgICAgcmVuYW1lZDogW1wiY29kZVNjYW5uaW5nXCIsIFwibGlzdEFsZXJ0SW5zdGFuY2VzXCJdXG4gICAgfV0sXG4gICAgbGlzdFJlY2VudEFuYWx5c2VzOiBbXCJHRVQgL3JlcG9zL3tvd25lcn0ve3JlcG99L2NvZGUtc2Nhbm5pbmcvYW5hbHlzZXNcIl0sXG4gICAgdXBkYXRlQWxlcnQ6IFtcIlBBVENIIC9yZXBvcy97b3duZXJ9L3tyZXBvfS9jb2RlLXNjYW5uaW5nL2FsZXJ0cy97YWxlcnRfbnVtYmVyfVwiXSxcbiAgICB1cGxvYWRTYXJpZjogW1wiUE9TVCAvcmVwb3Mve293bmVyfS97cmVwb30vY29kZS1zY2FubmluZy9zYXJpZnNcIl1cbiAgfSxcbiAgY29kZXNPZkNvbmR1Y3Q6IHtcbiAgICBnZXRBbGxDb2Rlc09mQ29uZHVjdDogW1wiR0VUIC9jb2Rlc19vZl9jb25kdWN0XCJdLFxuICAgIGdldENvbmR1Y3RDb2RlOiBbXCJHRVQgL2NvZGVzX29mX2NvbmR1Y3Qve2tleX1cIl1cbiAgfSxcbiAgY29kZXNwYWNlczoge1xuICAgIGFkZFJlcG9zaXRvcnlGb3JTZWNyZXRGb3JBdXRoZW50aWNhdGVkVXNlcjogW1wiUFVUIC91c2VyL2NvZGVzcGFjZXMvc2VjcmV0cy97c2VjcmV0X25hbWV9L3JlcG9zaXRvcmllcy97cmVwb3NpdG9yeV9pZH1cIl0sXG4gICAgY29kZXNwYWNlTWFjaGluZXNGb3JBdXRoZW50aWNhdGVkVXNlcjogW1wiR0VUIC91c2VyL2NvZGVzcGFjZXMve2NvZGVzcGFjZV9uYW1lfS9tYWNoaW5lc1wiXSxcbiAgICBjcmVhdGVGb3JBdXRoZW50aWNhdGVkVXNlcjogW1wiUE9TVCAvdXNlci9jb2Rlc3BhY2VzXCJdLFxuICAgIGNyZWF0ZU9yVXBkYXRlUmVwb1NlY3JldDogW1wiUFVUIC9yZXBvcy97b3duZXJ9L3tyZXBvfS9jb2Rlc3BhY2VzL3NlY3JldHMve3NlY3JldF9uYW1lfVwiXSxcbiAgICBjcmVhdGVPclVwZGF0ZVNlY3JldEZvckF1dGhlbnRpY2F0ZWRVc2VyOiBbXCJQVVQgL3VzZXIvY29kZXNwYWNlcy9zZWNyZXRzL3tzZWNyZXRfbmFtZX1cIl0sXG4gICAgY3JlYXRlV2l0aFByRm9yQXV0aGVudGljYXRlZFVzZXI6IFtcIlBPU1QgL3JlcG9zL3tvd25lcn0ve3JlcG99L3B1bGxzL3twdWxsX251bWJlcn0vY29kZXNwYWNlc1wiXSxcbiAgICBjcmVhdGVXaXRoUmVwb0ZvckF1dGhlbnRpY2F0ZWRVc2VyOiBbXCJQT1NUIC9yZXBvcy97b3duZXJ9L3tyZXBvfS9jb2Rlc3BhY2VzXCJdLFxuICAgIGRlbGV0ZUZvckF1dGhlbnRpY2F0ZWRVc2VyOiBbXCJERUxFVEUgL3VzZXIvY29kZXNwYWNlcy97Y29kZXNwYWNlX25hbWV9XCJdLFxuICAgIGRlbGV0ZUZyb21Pcmdhbml6YXRpb246IFtcIkRFTEVURSAvb3Jncy97b3JnfS9tZW1iZXJzL3t1c2VybmFtZX0vY29kZXNwYWNlcy97Y29kZXNwYWNlX25hbWV9XCJdLFxuICAgIGRlbGV0ZVJlcG9TZWNyZXQ6IFtcIkRFTEVURSAvcmVwb3Mve293bmVyfS97cmVwb30vY29kZXNwYWNlcy9zZWNyZXRzL3tzZWNyZXRfbmFtZX1cIl0sXG4gICAgZGVsZXRlU2VjcmV0Rm9yQXV0aGVudGljYXRlZFVzZXI6IFtcIkRFTEVURSAvdXNlci9jb2Rlc3BhY2VzL3NlY3JldHMve3NlY3JldF9uYW1lfVwiXSxcbiAgICBleHBvcnRGb3JBdXRoZW50aWNhdGVkVXNlcjogW1wiUE9TVCAvdXNlci9jb2Rlc3BhY2VzL3tjb2Rlc3BhY2VfbmFtZX0vZXhwb3J0c1wiXSxcbiAgICBnZXRFeHBvcnREZXRhaWxzRm9yQXV0aGVudGljYXRlZFVzZXI6IFtcIkdFVCAvdXNlci9jb2Rlc3BhY2VzL3tjb2Rlc3BhY2VfbmFtZX0vZXhwb3J0cy97ZXhwb3J0X2lkfVwiXSxcbiAgICBnZXRGb3JBdXRoZW50aWNhdGVkVXNlcjogW1wiR0VUIC91c2VyL2NvZGVzcGFjZXMve2NvZGVzcGFjZV9uYW1lfVwiXSxcbiAgICBnZXRQdWJsaWNLZXlGb3JBdXRoZW50aWNhdGVkVXNlcjogW1wiR0VUIC91c2VyL2NvZGVzcGFjZXMvc2VjcmV0cy9wdWJsaWMta2V5XCJdLFxuICAgIGdldFJlcG9QdWJsaWNLZXk6IFtcIkdFVCAvcmVwb3Mve293bmVyfS97cmVwb30vY29kZXNwYWNlcy9zZWNyZXRzL3B1YmxpYy1rZXlcIl0sXG4gICAgZ2V0UmVwb1NlY3JldDogW1wiR0VUIC9yZXBvcy97b3duZXJ9L3tyZXBvfS9jb2Rlc3BhY2VzL3NlY3JldHMve3NlY3JldF9uYW1lfVwiXSxcbiAgICBnZXRTZWNyZXRGb3JBdXRoZW50aWNhdGVkVXNlcjogW1wiR0VUIC91c2VyL2NvZGVzcGFjZXMvc2VjcmV0cy97c2VjcmV0X25hbWV9XCJdLFxuICAgIGxpc3REZXZjb250YWluZXJzSW5SZXBvc2l0b3J5Rm9yQXV0aGVudGljYXRlZFVzZXI6IFtcIkdFVCAvcmVwb3Mve293bmVyfS97cmVwb30vY29kZXNwYWNlcy9kZXZjb250YWluZXJzXCJdLFxuICAgIGxpc3RGb3JBdXRoZW50aWNhdGVkVXNlcjogW1wiR0VUIC91c2VyL2NvZGVzcGFjZXNcIl0sXG4gICAgbGlzdEluT3JnYW5pemF0aW9uOiBbXCJHRVQgL29yZ3Mve29yZ30vY29kZXNwYWNlc1wiLCB7fSwge1xuICAgICAgcmVuYW1lZFBhcmFtZXRlcnM6IHtcbiAgICAgICAgb3JnX2lkOiBcIm9yZ1wiXG4gICAgICB9XG4gICAgfV0sXG4gICAgbGlzdEluUmVwb3NpdG9yeUZvckF1dGhlbnRpY2F0ZWRVc2VyOiBbXCJHRVQgL3JlcG9zL3tvd25lcn0ve3JlcG99L2NvZGVzcGFjZXNcIl0sXG4gICAgbGlzdFJlcG9TZWNyZXRzOiBbXCJHRVQgL3JlcG9zL3tvd25lcn0ve3JlcG99L2NvZGVzcGFjZXMvc2VjcmV0c1wiXSxcbiAgICBsaXN0UmVwb3NpdG9yaWVzRm9yU2VjcmV0Rm9yQXV0aGVudGljYXRlZFVzZXI6IFtcIkdFVCAvdXNlci9jb2Rlc3BhY2VzL3NlY3JldHMve3NlY3JldF9uYW1lfS9yZXBvc2l0b3JpZXNcIl0sXG4gICAgbGlzdFNlY3JldHNGb3JBdXRoZW50aWNhdGVkVXNlcjogW1wiR0VUIC91c2VyL2NvZGVzcGFjZXMvc2VjcmV0c1wiXSxcbiAgICByZW1vdmVSZXBvc2l0b3J5Rm9yU2VjcmV0Rm9yQXV0aGVudGljYXRlZFVzZXI6IFtcIkRFTEVURSAvdXNlci9jb2Rlc3BhY2VzL3NlY3JldHMve3NlY3JldF9uYW1lfS9yZXBvc2l0b3JpZXMve3JlcG9zaXRvcnlfaWR9XCJdLFxuICAgIHJlcG9NYWNoaW5lc0ZvckF1dGhlbnRpY2F0ZWRVc2VyOiBbXCJHRVQgL3JlcG9zL3tvd25lcn0ve3JlcG99L2NvZGVzcGFjZXMvbWFjaGluZXNcIl0sXG4gICAgc2V0UmVwb3NpdG9yaWVzRm9yU2VjcmV0Rm9yQXV0aGVudGljYXRlZFVzZXI6IFtcIlBVVCAvdXNlci9jb2Rlc3BhY2VzL3NlY3JldHMve3NlY3JldF9uYW1lfS9yZXBvc2l0b3JpZXNcIl0sXG4gICAgc3RhcnRGb3JBdXRoZW50aWNhdGVkVXNlcjogW1wiUE9TVCAvdXNlci9jb2Rlc3BhY2VzL3tjb2Rlc3BhY2VfbmFtZX0vc3RhcnRcIl0sXG4gICAgc3RvcEZvckF1dGhlbnRpY2F0ZWRVc2VyOiBbXCJQT1NUIC91c2VyL2NvZGVzcGFjZXMve2NvZGVzcGFjZV9uYW1lfS9zdG9wXCJdLFxuICAgIHN0b3BJbk9yZ2FuaXphdGlvbjogW1wiUE9TVCAvb3Jncy97b3JnfS9tZW1iZXJzL3t1c2VybmFtZX0vY29kZXNwYWNlcy97Y29kZXNwYWNlX25hbWV9L3N0b3BcIl0sXG4gICAgdXBkYXRlRm9yQXV0aGVudGljYXRlZFVzZXI6IFtcIlBBVENIIC91c2VyL2NvZGVzcGFjZXMve2NvZGVzcGFjZV9uYW1lfVwiXVxuICB9LFxuICBkZXBlbmRhYm90OiB7XG4gICAgYWRkU2VsZWN0ZWRSZXBvVG9PcmdTZWNyZXQ6IFtcIlBVVCAvb3Jncy97b3JnfS9kZXBlbmRhYm90L3NlY3JldHMve3NlY3JldF9uYW1lfS9yZXBvc2l0b3JpZXMve3JlcG9zaXRvcnlfaWR9XCJdLFxuICAgIGNyZWF0ZU9yVXBkYXRlT3JnU2VjcmV0OiBbXCJQVVQgL29yZ3Mve29yZ30vZGVwZW5kYWJvdC9zZWNyZXRzL3tzZWNyZXRfbmFtZX1cIl0sXG4gICAgY3JlYXRlT3JVcGRhdGVSZXBvU2VjcmV0OiBbXCJQVVQgL3JlcG9zL3tvd25lcn0ve3JlcG99L2RlcGVuZGFib3Qvc2VjcmV0cy97c2VjcmV0X25hbWV9XCJdLFxuICAgIGRlbGV0ZU9yZ1NlY3JldDogW1wiREVMRVRFIC9vcmdzL3tvcmd9L2RlcGVuZGFib3Qvc2VjcmV0cy97c2VjcmV0X25hbWV9XCJdLFxuICAgIGRlbGV0ZVJlcG9TZWNyZXQ6IFtcIkRFTEVURSAvcmVwb3Mve293bmVyfS97cmVwb30vZGVwZW5kYWJvdC9zZWNyZXRzL3tzZWNyZXRfbmFtZX1cIl0sXG4gICAgZ2V0T3JnUHVibGljS2V5OiBbXCJHRVQgL29yZ3Mve29yZ30vZGVwZW5kYWJvdC9zZWNyZXRzL3B1YmxpYy1rZXlcIl0sXG4gICAgZ2V0T3JnU2VjcmV0OiBbXCJHRVQgL29yZ3Mve29yZ30vZGVwZW5kYWJvdC9zZWNyZXRzL3tzZWNyZXRfbmFtZX1cIl0sXG4gICAgZ2V0UmVwb1B1YmxpY0tleTogW1wiR0VUIC9yZXBvcy97b3duZXJ9L3tyZXBvfS9kZXBlbmRhYm90L3NlY3JldHMvcHVibGljLWtleVwiXSxcbiAgICBnZXRSZXBvU2VjcmV0OiBbXCJHRVQgL3JlcG9zL3tvd25lcn0ve3JlcG99L2RlcGVuZGFib3Qvc2VjcmV0cy97c2VjcmV0X25hbWV9XCJdLFxuICAgIGxpc3RPcmdTZWNyZXRzOiBbXCJHRVQgL29yZ3Mve29yZ30vZGVwZW5kYWJvdC9zZWNyZXRzXCJdLFxuICAgIGxpc3RSZXBvU2VjcmV0czogW1wiR0VUIC9yZXBvcy97b3duZXJ9L3tyZXBvfS9kZXBlbmRhYm90L3NlY3JldHNcIl0sXG4gICAgbGlzdFNlbGVjdGVkUmVwb3NGb3JPcmdTZWNyZXQ6IFtcIkdFVCAvb3Jncy97b3JnfS9kZXBlbmRhYm90L3NlY3JldHMve3NlY3JldF9uYW1lfS9yZXBvc2l0b3JpZXNcIl0sXG4gICAgcmVtb3ZlU2VsZWN0ZWRSZXBvRnJvbU9yZ1NlY3JldDogW1wiREVMRVRFIC9vcmdzL3tvcmd9L2RlcGVuZGFib3Qvc2VjcmV0cy97c2VjcmV0X25hbWV9L3JlcG9zaXRvcmllcy97cmVwb3NpdG9yeV9pZH1cIl0sXG4gICAgc2V0U2VsZWN0ZWRSZXBvc0Zvck9yZ1NlY3JldDogW1wiUFVUIC9vcmdzL3tvcmd9L2RlcGVuZGFib3Qvc2VjcmV0cy97c2VjcmV0X25hbWV9L3JlcG9zaXRvcmllc1wiXVxuICB9LFxuICBkZXBlbmRlbmN5R3JhcGg6IHtcbiAgICBjcmVhdGVSZXBvc2l0b3J5U25hcHNob3Q6IFtcIlBPU1QgL3JlcG9zL3tvd25lcn0ve3JlcG99L2RlcGVuZGVuY3ktZ3JhcGgvc25hcHNob3RzXCJdLFxuICAgIGRpZmZSYW5nZTogW1wiR0VUIC9yZXBvcy97b3duZXJ9L3tyZXBvfS9kZXBlbmRlbmN5LWdyYXBoL2NvbXBhcmUve2Jhc2VoZWFkfVwiXVxuICB9LFxuICBlbW9qaXM6IHtcbiAgICBnZXQ6IFtcIkdFVCAvZW1vamlzXCJdXG4gIH0sXG4gIGVudGVycHJpc2VBZG1pbjoge1xuICAgIGFkZEN1c3RvbUxhYmVsc1RvU2VsZkhvc3RlZFJ1bm5lckZvckVudGVycHJpc2U6IFtcIlBPU1QgL2VudGVycHJpc2VzL3tlbnRlcnByaXNlfS9hY3Rpb25zL3J1bm5lcnMve3J1bm5lcl9pZH0vbGFiZWxzXCJdLFxuICAgIGRpc2FibGVTZWxlY3RlZE9yZ2FuaXphdGlvbkdpdGh1YkFjdGlvbnNFbnRlcnByaXNlOiBbXCJERUxFVEUgL2VudGVycHJpc2VzL3tlbnRlcnByaXNlfS9hY3Rpb25zL3Blcm1pc3Npb25zL29yZ2FuaXphdGlvbnMve29yZ19pZH1cIl0sXG4gICAgZW5hYmxlU2VsZWN0ZWRPcmdhbml6YXRpb25HaXRodWJBY3Rpb25zRW50ZXJwcmlzZTogW1wiUFVUIC9lbnRlcnByaXNlcy97ZW50ZXJwcmlzZX0vYWN0aW9ucy9wZXJtaXNzaW9ucy9vcmdhbml6YXRpb25zL3tvcmdfaWR9XCJdLFxuICAgIGdldEFsbG93ZWRBY3Rpb25zRW50ZXJwcmlzZTogW1wiR0VUIC9lbnRlcnByaXNlcy97ZW50ZXJwcmlzZX0vYWN0aW9ucy9wZXJtaXNzaW9ucy9zZWxlY3RlZC1hY3Rpb25zXCJdLFxuICAgIGdldEdpdGh1YkFjdGlvbnNQZXJtaXNzaW9uc0VudGVycHJpc2U6IFtcIkdFVCAvZW50ZXJwcmlzZXMve2VudGVycHJpc2V9L2FjdGlvbnMvcGVybWlzc2lvbnNcIl0sXG4gICAgZ2V0U2VydmVyU3RhdGlzdGljczogW1wiR0VUIC9lbnRlcnByaXNlLWluc3RhbGxhdGlvbi97ZW50ZXJwcmlzZV9vcl9vcmd9L3NlcnZlci1zdGF0aXN0aWNzXCJdLFxuICAgIGxpc3RMYWJlbHNGb3JTZWxmSG9zdGVkUnVubmVyRm9yRW50ZXJwcmlzZTogW1wiR0VUIC9lbnRlcnByaXNlcy97ZW50ZXJwcmlzZX0vYWN0aW9ucy9ydW5uZXJzL3tydW5uZXJfaWR9L2xhYmVsc1wiXSxcbiAgICBsaXN0U2VsZWN0ZWRPcmdhbml6YXRpb25zRW5hYmxlZEdpdGh1YkFjdGlvbnNFbnRlcnByaXNlOiBbXCJHRVQgL2VudGVycHJpc2VzL3tlbnRlcnByaXNlfS9hY3Rpb25zL3Blcm1pc3Npb25zL29yZ2FuaXphdGlvbnNcIl0sXG4gICAgcmVtb3ZlQWxsQ3VzdG9tTGFiZWxzRnJvbVNlbGZIb3N0ZWRSdW5uZXJGb3JFbnRlcnByaXNlOiBbXCJERUxFVEUgL2VudGVycHJpc2VzL3tlbnRlcnByaXNlfS9hY3Rpb25zL3J1bm5lcnMve3J1bm5lcl9pZH0vbGFiZWxzXCJdLFxuICAgIHJlbW92ZUN1c3RvbUxhYmVsRnJvbVNlbGZIb3N0ZWRSdW5uZXJGb3JFbnRlcnByaXNlOiBbXCJERUxFVEUgL2VudGVycHJpc2VzL3tlbnRlcnByaXNlfS9hY3Rpb25zL3J1bm5lcnMve3J1bm5lcl9pZH0vbGFiZWxzL3tuYW1lfVwiXSxcbiAgICBzZXRBbGxvd2VkQWN0aW9uc0VudGVycHJpc2U6IFtcIlBVVCAvZW50ZXJwcmlzZXMve2VudGVycHJpc2V9L2FjdGlvbnMvcGVybWlzc2lvbnMvc2VsZWN0ZWQtYWN0aW9uc1wiXSxcbiAgICBzZXRDdXN0b21MYWJlbHNGb3JTZWxmSG9zdGVkUnVubmVyRm9yRW50ZXJwcmlzZTogW1wiUFVUIC9lbnRlcnByaXNlcy97ZW50ZXJwcmlzZX0vYWN0aW9ucy9ydW5uZXJzL3tydW5uZXJfaWR9L2xhYmVsc1wiXSxcbiAgICBzZXRHaXRodWJBY3Rpb25zUGVybWlzc2lvbnNFbnRlcnByaXNlOiBbXCJQVVQgL2VudGVycHJpc2VzL3tlbnRlcnByaXNlfS9hY3Rpb25zL3Blcm1pc3Npb25zXCJdLFxuICAgIHNldFNlbGVjdGVkT3JnYW5pemF0aW9uc0VuYWJsZWRHaXRodWJBY3Rpb25zRW50ZXJwcmlzZTogW1wiUFVUIC9lbnRlcnByaXNlcy97ZW50ZXJwcmlzZX0vYWN0aW9ucy9wZXJtaXNzaW9ucy9vcmdhbml6YXRpb25zXCJdXG4gIH0sXG4gIGdpc3RzOiB7XG4gICAgY2hlY2tJc1N0YXJyZWQ6IFtcIkdFVCAvZ2lzdHMve2dpc3RfaWR9L3N0YXJcIl0sXG4gICAgY3JlYXRlOiBbXCJQT1NUIC9naXN0c1wiXSxcbiAgICBjcmVhdGVDb21tZW50OiBbXCJQT1NUIC9naXN0cy97Z2lzdF9pZH0vY29tbWVudHNcIl0sXG4gICAgZGVsZXRlOiBbXCJERUxFVEUgL2dpc3RzL3tnaXN0X2lkfVwiXSxcbiAgICBkZWxldGVDb21tZW50OiBbXCJERUxFVEUgL2dpc3RzL3tnaXN0X2lkfS9jb21tZW50cy97Y29tbWVudF9pZH1cIl0sXG4gICAgZm9yazogW1wiUE9TVCAvZ2lzdHMve2dpc3RfaWR9L2ZvcmtzXCJdLFxuICAgIGdldDogW1wiR0VUIC9naXN0cy97Z2lzdF9pZH1cIl0sXG4gICAgZ2V0Q29tbWVudDogW1wiR0VUIC9naXN0cy97Z2lzdF9pZH0vY29tbWVudHMve2NvbW1lbnRfaWR9XCJdLFxuICAgIGdldFJldmlzaW9uOiBbXCJHRVQgL2dpc3RzL3tnaXN0X2lkfS97c2hhfVwiXSxcbiAgICBsaXN0OiBbXCJHRVQgL2dpc3RzXCJdLFxuICAgIGxpc3RDb21tZW50czogW1wiR0VUIC9naXN0cy97Z2lzdF9pZH0vY29tbWVudHNcIl0sXG4gICAgbGlzdENvbW1pdHM6IFtcIkdFVCAvZ2lzdHMve2dpc3RfaWR9L2NvbW1pdHNcIl0sXG4gICAgbGlzdEZvclVzZXI6IFtcIkdFVCAvdXNlcnMve3VzZXJuYW1lfS9naXN0c1wiXSxcbiAgICBsaXN0Rm9ya3M6IFtcIkdFVCAvZ2lzdHMve2dpc3RfaWR9L2ZvcmtzXCJdLFxuICAgIGxpc3RQdWJsaWM6IFtcIkdFVCAvZ2lzdHMvcHVibGljXCJdLFxuICAgIGxpc3RTdGFycmVkOiBbXCJHRVQgL2dpc3RzL3N0YXJyZWRcIl0sXG4gICAgc3RhcjogW1wiUFVUIC9naXN0cy97Z2lzdF9pZH0vc3RhclwiXSxcbiAgICB1bnN0YXI6IFtcIkRFTEVURSAvZ2lzdHMve2dpc3RfaWR9L3N0YXJcIl0sXG4gICAgdXBkYXRlOiBbXCJQQVRDSCAvZ2lzdHMve2dpc3RfaWR9XCJdLFxuICAgIHVwZGF0ZUNvbW1lbnQ6IFtcIlBBVENIIC9naXN0cy97Z2lzdF9pZH0vY29tbWVudHMve2NvbW1lbnRfaWR9XCJdXG4gIH0sXG4gIGdpdDoge1xuICAgIGNyZWF0ZUJsb2I6IFtcIlBPU1QgL3JlcG9zL3tvd25lcn0ve3JlcG99L2dpdC9ibG9ic1wiXSxcbiAgICBjcmVhdGVDb21taXQ6IFtcIlBPU1QgL3JlcG9zL3tvd25lcn0ve3JlcG99L2dpdC9jb21taXRzXCJdLFxuICAgIGNyZWF0ZVJlZjogW1wiUE9TVCAvcmVwb3Mve293bmVyfS97cmVwb30vZ2l0L3JlZnNcIl0sXG4gICAgY3JlYXRlVGFnOiBbXCJQT1NUIC9yZXBvcy97b3duZXJ9L3tyZXBvfS9naXQvdGFnc1wiXSxcbiAgICBjcmVhdGVUcmVlOiBbXCJQT1NUIC9yZXBvcy97b3duZXJ9L3tyZXBvfS9naXQvdHJlZXNcIl0sXG4gICAgZGVsZXRlUmVmOiBbXCJERUxFVEUgL3JlcG9zL3tvd25lcn0ve3JlcG99L2dpdC9yZWZzL3tyZWZ9XCJdLFxuICAgIGdldEJsb2I6IFtcIkdFVCAvcmVwb3Mve293bmVyfS97cmVwb30vZ2l0L2Jsb2JzL3tmaWxlX3NoYX1cIl0sXG4gICAgZ2V0Q29tbWl0OiBbXCJHRVQgL3JlcG9zL3tvd25lcn0ve3JlcG99L2dpdC9jb21taXRzL3tjb21taXRfc2hhfVwiXSxcbiAgICBnZXRSZWY6IFtcIkdFVCAvcmVwb3Mve293bmVyfS97cmVwb30vZ2l0L3JlZi97cmVmfVwiXSxcbiAgICBnZXRUYWc6IFtcIkdFVCAvcmVwb3Mve293bmVyfS97cmVwb30vZ2l0L3RhZ3Mve3RhZ19zaGF9XCJdLFxuICAgIGdldFRyZWU6IFtcIkdFVCAvcmVwb3Mve293bmVyfS97cmVwb30vZ2l0L3RyZWVzL3t0cmVlX3NoYX1cIl0sXG4gICAgbGlzdE1hdGNoaW5nUmVmczogW1wiR0VUIC9yZXBvcy97b3duZXJ9L3tyZXBvfS9naXQvbWF0Y2hpbmctcmVmcy97cmVmfVwiXSxcbiAgICB1cGRhdGVSZWY6IFtcIlBBVENIIC9yZXBvcy97b3duZXJ9L3tyZXBvfS9naXQvcmVmcy97cmVmfVwiXVxuICB9LFxuICBnaXRpZ25vcmU6IHtcbiAgICBnZXRBbGxUZW1wbGF0ZXM6IFtcIkdFVCAvZ2l0aWdub3JlL3RlbXBsYXRlc1wiXSxcbiAgICBnZXRUZW1wbGF0ZTogW1wiR0VUIC9naXRpZ25vcmUvdGVtcGxhdGVzL3tuYW1lfVwiXVxuICB9LFxuICBpbnRlcmFjdGlvbnM6IHtcbiAgICBnZXRSZXN0cmljdGlvbnNGb3JBdXRoZW50aWNhdGVkVXNlcjogW1wiR0VUIC91c2VyL2ludGVyYWN0aW9uLWxpbWl0c1wiXSxcbiAgICBnZXRSZXN0cmljdGlvbnNGb3JPcmc6IFtcIkdFVCAvb3Jncy97b3JnfS9pbnRlcmFjdGlvbi1saW1pdHNcIl0sXG4gICAgZ2V0UmVzdHJpY3Rpb25zRm9yUmVwbzogW1wiR0VUIC9yZXBvcy97b3duZXJ9L3tyZXBvfS9pbnRlcmFjdGlvbi1saW1pdHNcIl0sXG4gICAgZ2V0UmVzdHJpY3Rpb25zRm9yWW91clB1YmxpY1JlcG9zOiBbXCJHRVQgL3VzZXIvaW50ZXJhY3Rpb24tbGltaXRzXCIsIHt9LCB7XG4gICAgICByZW5hbWVkOiBbXCJpbnRlcmFjdGlvbnNcIiwgXCJnZXRSZXN0cmljdGlvbnNGb3JBdXRoZW50aWNhdGVkVXNlclwiXVxuICAgIH1dLFxuICAgIHJlbW92ZVJlc3RyaWN0aW9uc0ZvckF1dGhlbnRpY2F0ZWRVc2VyOiBbXCJERUxFVEUgL3VzZXIvaW50ZXJhY3Rpb24tbGltaXRzXCJdLFxuICAgIHJlbW92ZVJlc3RyaWN0aW9uc0Zvck9yZzogW1wiREVMRVRFIC9vcmdzL3tvcmd9L2ludGVyYWN0aW9uLWxpbWl0c1wiXSxcbiAgICByZW1vdmVSZXN0cmljdGlvbnNGb3JSZXBvOiBbXCJERUxFVEUgL3JlcG9zL3tvd25lcn0ve3JlcG99L2ludGVyYWN0aW9uLWxpbWl0c1wiXSxcbiAgICByZW1vdmVSZXN0cmljdGlvbnNGb3JZb3VyUHVibGljUmVwb3M6IFtcIkRFTEVURSAvdXNlci9pbnRlcmFjdGlvbi1saW1pdHNcIiwge30sIHtcbiAgICAgIHJlbmFtZWQ6IFtcImludGVyYWN0aW9uc1wiLCBcInJlbW92ZVJlc3RyaWN0aW9uc0ZvckF1dGhlbnRpY2F0ZWRVc2VyXCJdXG4gICAgfV0sXG4gICAgc2V0UmVzdHJpY3Rpb25zRm9yQXV0aGVudGljYXRlZFVzZXI6IFtcIlBVVCAvdXNlci9pbnRlcmFjdGlvbi1saW1pdHNcIl0sXG4gICAgc2V0UmVzdHJpY3Rpb25zRm9yT3JnOiBbXCJQVVQgL29yZ3Mve29yZ30vaW50ZXJhY3Rpb24tbGltaXRzXCJdLFxuICAgIHNldFJlc3RyaWN0aW9uc0ZvclJlcG86IFtcIlBVVCAvcmVwb3Mve293bmVyfS97cmVwb30vaW50ZXJhY3Rpb24tbGltaXRzXCJdLFxuICAgIHNldFJlc3RyaWN0aW9uc0ZvcllvdXJQdWJsaWNSZXBvczogW1wiUFVUIC91c2VyL2ludGVyYWN0aW9uLWxpbWl0c1wiLCB7fSwge1xuICAgICAgcmVuYW1lZDogW1wiaW50ZXJhY3Rpb25zXCIsIFwic2V0UmVzdHJpY3Rpb25zRm9yQXV0aGVudGljYXRlZFVzZXJcIl1cbiAgICB9XVxuICB9LFxuICBpc3N1ZXM6IHtcbiAgICBhZGRBc3NpZ25lZXM6IFtcIlBPU1QgL3JlcG9zL3tvd25lcn0ve3JlcG99L2lzc3Vlcy97aXNzdWVfbnVtYmVyfS9hc3NpZ25lZXNcIl0sXG4gICAgYWRkTGFiZWxzOiBbXCJQT1NUIC9yZXBvcy97b3duZXJ9L3tyZXBvfS9pc3N1ZXMve2lzc3VlX251bWJlcn0vbGFiZWxzXCJdLFxuICAgIGNoZWNrVXNlckNhbkJlQXNzaWduZWQ6IFtcIkdFVCAvcmVwb3Mve293bmVyfS97cmVwb30vYXNzaWduZWVzL3thc3NpZ25lZX1cIl0sXG4gICAgY3JlYXRlOiBbXCJQT1NUIC9yZXBvcy97b3duZXJ9L3tyZXBvfS9pc3N1ZXNcIl0sXG4gICAgY3JlYXRlQ29tbWVudDogW1wiUE9TVCAvcmVwb3Mve293bmVyfS97cmVwb30vaXNzdWVzL3tpc3N1ZV9udW1iZXJ9L2NvbW1lbnRzXCJdLFxuICAgIGNyZWF0ZUxhYmVsOiBbXCJQT1NUIC9yZXBvcy97b3duZXJ9L3tyZXBvfS9sYWJlbHNcIl0sXG4gICAgY3JlYXRlTWlsZXN0b25lOiBbXCJQT1NUIC9yZXBvcy97b3duZXJ9L3tyZXBvfS9taWxlc3RvbmVzXCJdLFxuICAgIGRlbGV0ZUNvbW1lbnQ6IFtcIkRFTEVURSAvcmVwb3Mve293bmVyfS97cmVwb30vaXNzdWVzL2NvbW1lbnRzL3tjb21tZW50X2lkfVwiXSxcbiAgICBkZWxldGVMYWJlbDogW1wiREVMRVRFIC9yZXBvcy97b3duZXJ9L3tyZXBvfS9sYWJlbHMve25hbWV9XCJdLFxuICAgIGRlbGV0ZU1pbGVzdG9uZTogW1wiREVMRVRFIC9yZXBvcy97b3duZXJ9L3tyZXBvfS9taWxlc3RvbmVzL3ttaWxlc3RvbmVfbnVtYmVyfVwiXSxcbiAgICBnZXQ6IFtcIkdFVCAvcmVwb3Mve293bmVyfS97cmVwb30vaXNzdWVzL3tpc3N1ZV9udW1iZXJ9XCJdLFxuICAgIGdldENvbW1lbnQ6IFtcIkdFVCAvcmVwb3Mve293bmVyfS97cmVwb30vaXNzdWVzL2NvbW1lbnRzL3tjb21tZW50X2lkfVwiXSxcbiAgICBnZXRFdmVudDogW1wiR0VUIC9yZXBvcy97b3duZXJ9L3tyZXBvfS9pc3N1ZXMvZXZlbnRzL3tldmVudF9pZH1cIl0sXG4gICAgZ2V0TGFiZWw6IFtcIkdFVCAvcmVwb3Mve293bmVyfS97cmVwb30vbGFiZWxzL3tuYW1lfVwiXSxcbiAgICBnZXRNaWxlc3RvbmU6IFtcIkdFVCAvcmVwb3Mve293bmVyfS97cmVwb30vbWlsZXN0b25lcy97bWlsZXN0b25lX251bWJlcn1cIl0sXG4gICAgbGlzdDogW1wiR0VUIC9pc3N1ZXNcIl0sXG4gICAgbGlzdEFzc2lnbmVlczogW1wiR0VUIC9yZXBvcy97b3duZXJ9L3tyZXBvfS9hc3NpZ25lZXNcIl0sXG4gICAgbGlzdENvbW1lbnRzOiBbXCJHRVQgL3JlcG9zL3tvd25lcn0ve3JlcG99L2lzc3Vlcy97aXNzdWVfbnVtYmVyfS9jb21tZW50c1wiXSxcbiAgICBsaXN0Q29tbWVudHNGb3JSZXBvOiBbXCJHRVQgL3JlcG9zL3tvd25lcn0ve3JlcG99L2lzc3Vlcy9jb21tZW50c1wiXSxcbiAgICBsaXN0RXZlbnRzOiBbXCJHRVQgL3JlcG9zL3tvd25lcn0ve3JlcG99L2lzc3Vlcy97aXNzdWVfbnVtYmVyfS9ldmVudHNcIl0sXG4gICAgbGlzdEV2ZW50c0ZvclJlcG86IFtcIkdFVCAvcmVwb3Mve293bmVyfS97cmVwb30vaXNzdWVzL2V2ZW50c1wiXSxcbiAgICBsaXN0RXZlbnRzRm9yVGltZWxpbmU6IFtcIkdFVCAvcmVwb3Mve293bmVyfS97cmVwb30vaXNzdWVzL3tpc3N1ZV9udW1iZXJ9L3RpbWVsaW5lXCJdLFxuICAgIGxpc3RGb3JBdXRoZW50aWNhdGVkVXNlcjogW1wiR0VUIC91c2VyL2lzc3Vlc1wiXSxcbiAgICBsaXN0Rm9yT3JnOiBbXCJHRVQgL29yZ3Mve29yZ30vaXNzdWVzXCJdLFxuICAgIGxpc3RGb3JSZXBvOiBbXCJHRVQgL3JlcG9zL3tvd25lcn0ve3JlcG99L2lzc3Vlc1wiXSxcbiAgICBsaXN0TGFiZWxzRm9yTWlsZXN0b25lOiBbXCJHRVQgL3JlcG9zL3tvd25lcn0ve3JlcG99L21pbGVzdG9uZXMve21pbGVzdG9uZV9udW1iZXJ9L2xhYmVsc1wiXSxcbiAgICBsaXN0TGFiZWxzRm9yUmVwbzogW1wiR0VUIC9yZXBvcy97b3duZXJ9L3tyZXBvfS9sYWJlbHNcIl0sXG4gICAgbGlzdExhYmVsc09uSXNzdWU6IFtcIkdFVCAvcmVwb3Mve293bmVyfS97cmVwb30vaXNzdWVzL3tpc3N1ZV9udW1iZXJ9L2xhYmVsc1wiXSxcbiAgICBsaXN0TWlsZXN0b25lczogW1wiR0VUIC9yZXBvcy97b3duZXJ9L3tyZXBvfS9taWxlc3RvbmVzXCJdLFxuICAgIGxvY2s6IFtcIlBVVCAvcmVwb3Mve293bmVyfS97cmVwb30vaXNzdWVzL3tpc3N1ZV9udW1iZXJ9L2xvY2tcIl0sXG4gICAgcmVtb3ZlQWxsTGFiZWxzOiBbXCJERUxFVEUgL3JlcG9zL3tvd25lcn0ve3JlcG99L2lzc3Vlcy97aXNzdWVfbnVtYmVyfS9sYWJlbHNcIl0sXG4gICAgcmVtb3ZlQXNzaWduZWVzOiBbXCJERUxFVEUgL3JlcG9zL3tvd25lcn0ve3JlcG99L2lzc3Vlcy97aXNzdWVfbnVtYmVyfS9hc3NpZ25lZXNcIl0sXG4gICAgcmVtb3ZlTGFiZWw6IFtcIkRFTEVURSAvcmVwb3Mve293bmVyfS97cmVwb30vaXNzdWVzL3tpc3N1ZV9udW1iZXJ9L2xhYmVscy97bmFtZX1cIl0sXG4gICAgc2V0TGFiZWxzOiBbXCJQVVQgL3JlcG9zL3tvd25lcn0ve3JlcG99L2lzc3Vlcy97aXNzdWVfbnVtYmVyfS9sYWJlbHNcIl0sXG4gICAgdW5sb2NrOiBbXCJERUxFVEUgL3JlcG9zL3tvd25lcn0ve3JlcG99L2lzc3Vlcy97aXNzdWVfbnVtYmVyfS9sb2NrXCJdLFxuICAgIHVwZGF0ZTogW1wiUEFUQ0ggL3JlcG9zL3tvd25lcn0ve3JlcG99L2lzc3Vlcy97aXNzdWVfbnVtYmVyfVwiXSxcbiAgICB1cGRhdGVDb21tZW50OiBbXCJQQVRDSCAvcmVwb3Mve293bmVyfS97cmVwb30vaXNzdWVzL2NvbW1lbnRzL3tjb21tZW50X2lkfVwiXSxcbiAgICB1cGRhdGVMYWJlbDogW1wiUEFUQ0ggL3JlcG9zL3tvd25lcn0ve3JlcG99L2xhYmVscy97bmFtZX1cIl0sXG4gICAgdXBkYXRlTWlsZXN0b25lOiBbXCJQQVRDSCAvcmVwb3Mve293bmVyfS97cmVwb30vbWlsZXN0b25lcy97bWlsZXN0b25lX251bWJlcn1cIl1cbiAgfSxcbiAgbGljZW5zZXM6IHtcbiAgICBnZXQ6IFtcIkdFVCAvbGljZW5zZXMve2xpY2Vuc2V9XCJdLFxuICAgIGdldEFsbENvbW1vbmx5VXNlZDogW1wiR0VUIC9saWNlbnNlc1wiXSxcbiAgICBnZXRGb3JSZXBvOiBbXCJHRVQgL3JlcG9zL3tvd25lcn0ve3JlcG99L2xpY2Vuc2VcIl1cbiAgfSxcbiAgbWFya2Rvd246IHtcbiAgICByZW5kZXI6IFtcIlBPU1QgL21hcmtkb3duXCJdLFxuICAgIHJlbmRlclJhdzogW1wiUE9TVCAvbWFya2Rvd24vcmF3XCIsIHtcbiAgICAgIGhlYWRlcnM6IHtcbiAgICAgICAgXCJjb250ZW50LXR5cGVcIjogXCJ0ZXh0L3BsYWluOyBjaGFyc2V0PXV0Zi04XCJcbiAgICAgIH1cbiAgICB9XVxuICB9LFxuICBtZXRhOiB7XG4gICAgZ2V0OiBbXCJHRVQgL21ldGFcIl0sXG4gICAgZ2V0T2N0b2NhdDogW1wiR0VUIC9vY3RvY2F0XCJdLFxuICAgIGdldFplbjogW1wiR0VUIC96ZW5cIl0sXG4gICAgcm9vdDogW1wiR0VUIC9cIl1cbiAgfSxcbiAgbWlncmF0aW9uczoge1xuICAgIGNhbmNlbEltcG9ydDogW1wiREVMRVRFIC9yZXBvcy97b3duZXJ9L3tyZXBvfS9pbXBvcnRcIl0sXG4gICAgZGVsZXRlQXJjaGl2ZUZvckF1dGhlbnRpY2F0ZWRVc2VyOiBbXCJERUxFVEUgL3VzZXIvbWlncmF0aW9ucy97bWlncmF0aW9uX2lkfS9hcmNoaXZlXCJdLFxuICAgIGRlbGV0ZUFyY2hpdmVGb3JPcmc6IFtcIkRFTEVURSAvb3Jncy97b3JnfS9taWdyYXRpb25zL3ttaWdyYXRpb25faWR9L2FyY2hpdmVcIl0sXG4gICAgZG93bmxvYWRBcmNoaXZlRm9yT3JnOiBbXCJHRVQgL29yZ3Mve29yZ30vbWlncmF0aW9ucy97bWlncmF0aW9uX2lkfS9hcmNoaXZlXCJdLFxuICAgIGdldEFyY2hpdmVGb3JBdXRoZW50aWNhdGVkVXNlcjogW1wiR0VUIC91c2VyL21pZ3JhdGlvbnMve21pZ3JhdGlvbl9pZH0vYXJjaGl2ZVwiXSxcbiAgICBnZXRDb21taXRBdXRob3JzOiBbXCJHRVQgL3JlcG9zL3tvd25lcn0ve3JlcG99L2ltcG9ydC9hdXRob3JzXCJdLFxuICAgIGdldEltcG9ydFN0YXR1czogW1wiR0VUIC9yZXBvcy97b3duZXJ9L3tyZXBvfS9pbXBvcnRcIl0sXG4gICAgZ2V0TGFyZ2VGaWxlczogW1wiR0VUIC9yZXBvcy97b3duZXJ9L3tyZXBvfS9pbXBvcnQvbGFyZ2VfZmlsZXNcIl0sXG4gICAgZ2V0U3RhdHVzRm9yQXV0aGVudGljYXRlZFVzZXI6IFtcIkdFVCAvdXNlci9taWdyYXRpb25zL3ttaWdyYXRpb25faWR9XCJdLFxuICAgIGdldFN0YXR1c0Zvck9yZzogW1wiR0VUIC9vcmdzL3tvcmd9L21pZ3JhdGlvbnMve21pZ3JhdGlvbl9pZH1cIl0sXG4gICAgbGlzdEZvckF1dGhlbnRpY2F0ZWRVc2VyOiBbXCJHRVQgL3VzZXIvbWlncmF0aW9uc1wiXSxcbiAgICBsaXN0Rm9yT3JnOiBbXCJHRVQgL29yZ3Mve29yZ30vbWlncmF0aW9uc1wiXSxcbiAgICBsaXN0UmVwb3NGb3JBdXRoZW50aWNhdGVkVXNlcjogW1wiR0VUIC91c2VyL21pZ3JhdGlvbnMve21pZ3JhdGlvbl9pZH0vcmVwb3NpdG9yaWVzXCJdLFxuICAgIGxpc3RSZXBvc0Zvck9yZzogW1wiR0VUIC9vcmdzL3tvcmd9L21pZ3JhdGlvbnMve21pZ3JhdGlvbl9pZH0vcmVwb3NpdG9yaWVzXCJdLFxuICAgIGxpc3RSZXBvc0ZvclVzZXI6IFtcIkdFVCAvdXNlci9taWdyYXRpb25zL3ttaWdyYXRpb25faWR9L3JlcG9zaXRvcmllc1wiLCB7fSwge1xuICAgICAgcmVuYW1lZDogW1wibWlncmF0aW9uc1wiLCBcImxpc3RSZXBvc0ZvckF1dGhlbnRpY2F0ZWRVc2VyXCJdXG4gICAgfV0sXG4gICAgbWFwQ29tbWl0QXV0aG9yOiBbXCJQQVRDSCAvcmVwb3Mve293bmVyfS97cmVwb30vaW1wb3J0L2F1dGhvcnMve2F1dGhvcl9pZH1cIl0sXG4gICAgc2V0TGZzUHJlZmVyZW5jZTogW1wiUEFUQ0ggL3JlcG9zL3tvd25lcn0ve3JlcG99L2ltcG9ydC9sZnNcIl0sXG4gICAgc3RhcnRGb3JBdXRoZW50aWNhdGVkVXNlcjogW1wiUE9TVCAvdXNlci9taWdyYXRpb25zXCJdLFxuICAgIHN0YXJ0Rm9yT3JnOiBbXCJQT1NUIC9vcmdzL3tvcmd9L21pZ3JhdGlvbnNcIl0sXG4gICAgc3RhcnRJbXBvcnQ6IFtcIlBVVCAvcmVwb3Mve293bmVyfS97cmVwb30vaW1wb3J0XCJdLFxuICAgIHVubG9ja1JlcG9Gb3JBdXRoZW50aWNhdGVkVXNlcjogW1wiREVMRVRFIC91c2VyL21pZ3JhdGlvbnMve21pZ3JhdGlvbl9pZH0vcmVwb3Mve3JlcG9fbmFtZX0vbG9ja1wiXSxcbiAgICB1bmxvY2tSZXBvRm9yT3JnOiBbXCJERUxFVEUgL29yZ3Mve29yZ30vbWlncmF0aW9ucy97bWlncmF0aW9uX2lkfS9yZXBvcy97cmVwb19uYW1lfS9sb2NrXCJdLFxuICAgIHVwZGF0ZUltcG9ydDogW1wiUEFUQ0ggL3JlcG9zL3tvd25lcn0ve3JlcG99L2ltcG9ydFwiXVxuICB9LFxuICBvcmdzOiB7XG4gICAgYmxvY2tVc2VyOiBbXCJQVVQgL29yZ3Mve29yZ30vYmxvY2tzL3t1c2VybmFtZX1cIl0sXG4gICAgY2FuY2VsSW52aXRhdGlvbjogW1wiREVMRVRFIC9vcmdzL3tvcmd9L2ludml0YXRpb25zL3tpbnZpdGF0aW9uX2lkfVwiXSxcbiAgICBjaGVja0Jsb2NrZWRVc2VyOiBbXCJHRVQgL29yZ3Mve29yZ30vYmxvY2tzL3t1c2VybmFtZX1cIl0sXG4gICAgY2hlY2tNZW1iZXJzaGlwRm9yVXNlcjogW1wiR0VUIC9vcmdzL3tvcmd9L21lbWJlcnMve3VzZXJuYW1lfVwiXSxcbiAgICBjaGVja1B1YmxpY01lbWJlcnNoaXBGb3JVc2VyOiBbXCJHRVQgL29yZ3Mve29yZ30vcHVibGljX21lbWJlcnMve3VzZXJuYW1lfVwiXSxcbiAgICBjb252ZXJ0TWVtYmVyVG9PdXRzaWRlQ29sbGFib3JhdG9yOiBbXCJQVVQgL29yZ3Mve29yZ30vb3V0c2lkZV9jb2xsYWJvcmF0b3JzL3t1c2VybmFtZX1cIl0sXG4gICAgY3JlYXRlSW52aXRhdGlvbjogW1wiUE9TVCAvb3Jncy97b3JnfS9pbnZpdGF0aW9uc1wiXSxcbiAgICBjcmVhdGVXZWJob29rOiBbXCJQT1NUIC9vcmdzL3tvcmd9L2hvb2tzXCJdLFxuICAgIGRlbGV0ZVdlYmhvb2s6IFtcIkRFTEVURSAvb3Jncy97b3JnfS9ob29rcy97aG9va19pZH1cIl0sXG4gICAgZ2V0OiBbXCJHRVQgL29yZ3Mve29yZ31cIl0sXG4gICAgZ2V0TWVtYmVyc2hpcEZvckF1dGhlbnRpY2F0ZWRVc2VyOiBbXCJHRVQgL3VzZXIvbWVtYmVyc2hpcHMvb3Jncy97b3JnfVwiXSxcbiAgICBnZXRNZW1iZXJzaGlwRm9yVXNlcjogW1wiR0VUIC9vcmdzL3tvcmd9L21lbWJlcnNoaXBzL3t1c2VybmFtZX1cIl0sXG4gICAgZ2V0V2ViaG9vazogW1wiR0VUIC9vcmdzL3tvcmd9L2hvb2tzL3tob29rX2lkfVwiXSxcbiAgICBnZXRXZWJob29rQ29uZmlnRm9yT3JnOiBbXCJHRVQgL29yZ3Mve29yZ30vaG9va3Mve2hvb2tfaWR9L2NvbmZpZ1wiXSxcbiAgICBnZXRXZWJob29rRGVsaXZlcnk6IFtcIkdFVCAvb3Jncy97b3JnfS9ob29rcy97aG9va19pZH0vZGVsaXZlcmllcy97ZGVsaXZlcnlfaWR9XCJdLFxuICAgIGxpc3Q6IFtcIkdFVCAvb3JnYW5pemF0aW9uc1wiXSxcbiAgICBsaXN0QXBwSW5zdGFsbGF0aW9uczogW1wiR0VUIC9vcmdzL3tvcmd9L2luc3RhbGxhdGlvbnNcIl0sXG4gICAgbGlzdEJsb2NrZWRVc2VyczogW1wiR0VUIC9vcmdzL3tvcmd9L2Jsb2Nrc1wiXSxcbiAgICBsaXN0Q3VzdG9tUm9sZXM6IFtcIkdFVCAvb3JnYW5pemF0aW9ucy97b3JnYW5pemF0aW9uX2lkfS9jdXN0b21fcm9sZXNcIl0sXG4gICAgbGlzdEZhaWxlZEludml0YXRpb25zOiBbXCJHRVQgL29yZ3Mve29yZ30vZmFpbGVkX2ludml0YXRpb25zXCJdLFxuICAgIGxpc3RGb3JBdXRoZW50aWNhdGVkVXNlcjogW1wiR0VUIC91c2VyL29yZ3NcIl0sXG4gICAgbGlzdEZvclVzZXI6IFtcIkdFVCAvdXNlcnMve3VzZXJuYW1lfS9vcmdzXCJdLFxuICAgIGxpc3RJbnZpdGF0aW9uVGVhbXM6IFtcIkdFVCAvb3Jncy97b3JnfS9pbnZpdGF0aW9ucy97aW52aXRhdGlvbl9pZH0vdGVhbXNcIl0sXG4gICAgbGlzdE1lbWJlcnM6IFtcIkdFVCAvb3Jncy97b3JnfS9tZW1iZXJzXCJdLFxuICAgIGxpc3RNZW1iZXJzaGlwc0ZvckF1dGhlbnRpY2F0ZWRVc2VyOiBbXCJHRVQgL3VzZXIvbWVtYmVyc2hpcHMvb3Jnc1wiXSxcbiAgICBsaXN0T3V0c2lkZUNvbGxhYm9yYXRvcnM6IFtcIkdFVCAvb3Jncy97b3JnfS9vdXRzaWRlX2NvbGxhYm9yYXRvcnNcIl0sXG4gICAgbGlzdFBlbmRpbmdJbnZpdGF0aW9uczogW1wiR0VUIC9vcmdzL3tvcmd9L2ludml0YXRpb25zXCJdLFxuICAgIGxpc3RQdWJsaWNNZW1iZXJzOiBbXCJHRVQgL29yZ3Mve29yZ30vcHVibGljX21lbWJlcnNcIl0sXG4gICAgbGlzdFdlYmhvb2tEZWxpdmVyaWVzOiBbXCJHRVQgL29yZ3Mve29yZ30vaG9va3Mve2hvb2tfaWR9L2RlbGl2ZXJpZXNcIl0sXG4gICAgbGlzdFdlYmhvb2tzOiBbXCJHRVQgL29yZ3Mve29yZ30vaG9va3NcIl0sXG4gICAgcGluZ1dlYmhvb2s6IFtcIlBPU1QgL29yZ3Mve29yZ30vaG9va3Mve2hvb2tfaWR9L3BpbmdzXCJdLFxuICAgIHJlZGVsaXZlcldlYmhvb2tEZWxpdmVyeTogW1wiUE9TVCAvb3Jncy97b3JnfS9ob29rcy97aG9va19pZH0vZGVsaXZlcmllcy97ZGVsaXZlcnlfaWR9L2F0dGVtcHRzXCJdLFxuICAgIHJlbW92ZU1lbWJlcjogW1wiREVMRVRFIC9vcmdzL3tvcmd9L21lbWJlcnMve3VzZXJuYW1lfVwiXSxcbiAgICByZW1vdmVNZW1iZXJzaGlwRm9yVXNlcjogW1wiREVMRVRFIC9vcmdzL3tvcmd9L21lbWJlcnNoaXBzL3t1c2VybmFtZX1cIl0sXG4gICAgcmVtb3ZlT3V0c2lkZUNvbGxhYm9yYXRvcjogW1wiREVMRVRFIC9vcmdzL3tvcmd9L291dHNpZGVfY29sbGFib3JhdG9ycy97dXNlcm5hbWV9XCJdLFxuICAgIHJlbW92ZVB1YmxpY01lbWJlcnNoaXBGb3JBdXRoZW50aWNhdGVkVXNlcjogW1wiREVMRVRFIC9vcmdzL3tvcmd9L3B1YmxpY19tZW1iZXJzL3t1c2VybmFtZX1cIl0sXG4gICAgc2V0TWVtYmVyc2hpcEZvclVzZXI6IFtcIlBVVCAvb3Jncy97b3JnfS9tZW1iZXJzaGlwcy97dXNlcm5hbWV9XCJdLFxuICAgIHNldFB1YmxpY01lbWJlcnNoaXBGb3JBdXRoZW50aWNhdGVkVXNlcjogW1wiUFVUIC9vcmdzL3tvcmd9L3B1YmxpY19tZW1iZXJzL3t1c2VybmFtZX1cIl0sXG4gICAgdW5ibG9ja1VzZXI6IFtcIkRFTEVURSAvb3Jncy97b3JnfS9ibG9ja3Mve3VzZXJuYW1lfVwiXSxcbiAgICB1cGRhdGU6IFtcIlBBVENIIC9vcmdzL3tvcmd9XCJdLFxuICAgIHVwZGF0ZU1lbWJlcnNoaXBGb3JBdXRoZW50aWNhdGVkVXNlcjogW1wiUEFUQ0ggL3VzZXIvbWVtYmVyc2hpcHMvb3Jncy97b3JnfVwiXSxcbiAgICB1cGRhdGVXZWJob29rOiBbXCJQQVRDSCAvb3Jncy97b3JnfS9ob29rcy97aG9va19pZH1cIl0sXG4gICAgdXBkYXRlV2ViaG9va0NvbmZpZ0Zvck9yZzogW1wiUEFUQ0ggL29yZ3Mve29yZ30vaG9va3Mve2hvb2tfaWR9L2NvbmZpZ1wiXVxuICB9LFxuICBwYWNrYWdlczoge1xuICAgIGRlbGV0ZVBhY2thZ2VGb3JBdXRoZW50aWNhdGVkVXNlcjogW1wiREVMRVRFIC91c2VyL3BhY2thZ2VzL3twYWNrYWdlX3R5cGV9L3twYWNrYWdlX25hbWV9XCJdLFxuICAgIGRlbGV0ZVBhY2thZ2VGb3JPcmc6IFtcIkRFTEVURSAvb3Jncy97b3JnfS9wYWNrYWdlcy97cGFja2FnZV90eXBlfS97cGFja2FnZV9uYW1lfVwiXSxcbiAgICBkZWxldGVQYWNrYWdlRm9yVXNlcjogW1wiREVMRVRFIC91c2Vycy97dXNlcm5hbWV9L3BhY2thZ2VzL3twYWNrYWdlX3R5cGV9L3twYWNrYWdlX25hbWV9XCJdLFxuICAgIGRlbGV0ZVBhY2thZ2VWZXJzaW9uRm9yQXV0aGVudGljYXRlZFVzZXI6IFtcIkRFTEVURSAvdXNlci9wYWNrYWdlcy97cGFja2FnZV90eXBlfS97cGFja2FnZV9uYW1lfS92ZXJzaW9ucy97cGFja2FnZV92ZXJzaW9uX2lkfVwiXSxcbiAgICBkZWxldGVQYWNrYWdlVmVyc2lvbkZvck9yZzogW1wiREVMRVRFIC9vcmdzL3tvcmd9L3BhY2thZ2VzL3twYWNrYWdlX3R5cGV9L3twYWNrYWdlX25hbWV9L3ZlcnNpb25zL3twYWNrYWdlX3ZlcnNpb25faWR9XCJdLFxuICAgIGRlbGV0ZVBhY2thZ2VWZXJzaW9uRm9yVXNlcjogW1wiREVMRVRFIC91c2Vycy97dXNlcm5hbWV9L3BhY2thZ2VzL3twYWNrYWdlX3R5cGV9L3twYWNrYWdlX25hbWV9L3ZlcnNpb25zL3twYWNrYWdlX3ZlcnNpb25faWR9XCJdLFxuICAgIGdldEFsbFBhY2thZ2VWZXJzaW9uc0ZvckFQYWNrYWdlT3duZWRCeUFuT3JnOiBbXCJHRVQgL29yZ3Mve29yZ30vcGFja2FnZXMve3BhY2thZ2VfdHlwZX0ve3BhY2thZ2VfbmFtZX0vdmVyc2lvbnNcIiwge30sIHtcbiAgICAgIHJlbmFtZWQ6IFtcInBhY2thZ2VzXCIsIFwiZ2V0QWxsUGFja2FnZVZlcnNpb25zRm9yUGFja2FnZU93bmVkQnlPcmdcIl1cbiAgICB9XSxcbiAgICBnZXRBbGxQYWNrYWdlVmVyc2lvbnNGb3JBUGFja2FnZU93bmVkQnlUaGVBdXRoZW50aWNhdGVkVXNlcjogW1wiR0VUIC91c2VyL3BhY2thZ2VzL3twYWNrYWdlX3R5cGV9L3twYWNrYWdlX25hbWV9L3ZlcnNpb25zXCIsIHt9LCB7XG4gICAgICByZW5hbWVkOiBbXCJwYWNrYWdlc1wiLCBcImdldEFsbFBhY2thZ2VWZXJzaW9uc0ZvclBhY2thZ2VPd25lZEJ5QXV0aGVudGljYXRlZFVzZXJcIl1cbiAgICB9XSxcbiAgICBnZXRBbGxQYWNrYWdlVmVyc2lvbnNGb3JQYWNrYWdlT3duZWRCeUF1dGhlbnRpY2F0ZWRVc2VyOiBbXCJHRVQgL3VzZXIvcGFja2FnZXMve3BhY2thZ2VfdHlwZX0ve3BhY2thZ2VfbmFtZX0vdmVyc2lvbnNcIl0sXG4gICAgZ2V0QWxsUGFja2FnZVZlcnNpb25zRm9yUGFja2FnZU93bmVkQnlPcmc6IFtcIkdFVCAvb3Jncy97b3JnfS9wYWNrYWdlcy97cGFja2FnZV90eXBlfS97cGFja2FnZV9uYW1lfS92ZXJzaW9uc1wiXSxcbiAgICBnZXRBbGxQYWNrYWdlVmVyc2lvbnNGb3JQYWNrYWdlT3duZWRCeVVzZXI6IFtcIkdFVCAvdXNlcnMve3VzZXJuYW1lfS9wYWNrYWdlcy97cGFja2FnZV90eXBlfS97cGFja2FnZV9uYW1lfS92ZXJzaW9uc1wiXSxcbiAgICBnZXRQYWNrYWdlRm9yQXV0aGVudGljYXRlZFVzZXI6IFtcIkdFVCAvdXNlci9wYWNrYWdlcy97cGFja2FnZV90eXBlfS97cGFja2FnZV9uYW1lfVwiXSxcbiAgICBnZXRQYWNrYWdlRm9yT3JnYW5pemF0aW9uOiBbXCJHRVQgL29yZ3Mve29yZ30vcGFja2FnZXMve3BhY2thZ2VfdHlwZX0ve3BhY2thZ2VfbmFtZX1cIl0sXG4gICAgZ2V0UGFja2FnZUZvclVzZXI6IFtcIkdFVCAvdXNlcnMve3VzZXJuYW1lfS9wYWNrYWdlcy97cGFja2FnZV90eXBlfS97cGFja2FnZV9uYW1lfVwiXSxcbiAgICBnZXRQYWNrYWdlVmVyc2lvbkZvckF1dGhlbnRpY2F0ZWRVc2VyOiBbXCJHRVQgL3VzZXIvcGFja2FnZXMve3BhY2thZ2VfdHlwZX0ve3BhY2thZ2VfbmFtZX0vdmVyc2lvbnMve3BhY2thZ2VfdmVyc2lvbl9pZH1cIl0sXG4gICAgZ2V0UGFja2FnZVZlcnNpb25Gb3JPcmdhbml6YXRpb246IFtcIkdFVCAvb3Jncy97b3JnfS9wYWNrYWdlcy97cGFja2FnZV90eXBlfS97cGFja2FnZV9uYW1lfS92ZXJzaW9ucy97cGFja2FnZV92ZXJzaW9uX2lkfVwiXSxcbiAgICBnZXRQYWNrYWdlVmVyc2lvbkZvclVzZXI6IFtcIkdFVCAvdXNlcnMve3VzZXJuYW1lfS9wYWNrYWdlcy97cGFja2FnZV90eXBlfS97cGFja2FnZV9uYW1lfS92ZXJzaW9ucy97cGFja2FnZV92ZXJzaW9uX2lkfVwiXSxcbiAgICBsaXN0UGFja2FnZXNGb3JBdXRoZW50aWNhdGVkVXNlcjogW1wiR0VUIC91c2VyL3BhY2thZ2VzXCJdLFxuICAgIGxpc3RQYWNrYWdlc0Zvck9yZ2FuaXphdGlvbjogW1wiR0VUIC9vcmdzL3tvcmd9L3BhY2thZ2VzXCJdLFxuICAgIGxpc3RQYWNrYWdlc0ZvclVzZXI6IFtcIkdFVCAvdXNlcnMve3VzZXJuYW1lfS9wYWNrYWdlc1wiXSxcbiAgICByZXN0b3JlUGFja2FnZUZvckF1dGhlbnRpY2F0ZWRVc2VyOiBbXCJQT1NUIC91c2VyL3BhY2thZ2VzL3twYWNrYWdlX3R5cGV9L3twYWNrYWdlX25hbWV9L3Jlc3RvcmV7P3Rva2VufVwiXSxcbiAgICByZXN0b3JlUGFja2FnZUZvck9yZzogW1wiUE9TVCAvb3Jncy97b3JnfS9wYWNrYWdlcy97cGFja2FnZV90eXBlfS97cGFja2FnZV9uYW1lfS9yZXN0b3Jlez90b2tlbn1cIl0sXG4gICAgcmVzdG9yZVBhY2thZ2VGb3JVc2VyOiBbXCJQT1NUIC91c2Vycy97dXNlcm5hbWV9L3BhY2thZ2VzL3twYWNrYWdlX3R5cGV9L3twYWNrYWdlX25hbWV9L3Jlc3RvcmV7P3Rva2VufVwiXSxcbiAgICByZXN0b3JlUGFja2FnZVZlcnNpb25Gb3JBdXRoZW50aWNhdGVkVXNlcjogW1wiUE9TVCAvdXNlci9wYWNrYWdlcy97cGFja2FnZV90eXBlfS97cGFja2FnZV9uYW1lfS92ZXJzaW9ucy97cGFja2FnZV92ZXJzaW9uX2lkfS9yZXN0b3JlXCJdLFxuICAgIHJlc3RvcmVQYWNrYWdlVmVyc2lvbkZvck9yZzogW1wiUE9TVCAvb3Jncy97b3JnfS9wYWNrYWdlcy97cGFja2FnZV90eXBlfS97cGFja2FnZV9uYW1lfS92ZXJzaW9ucy97cGFja2FnZV92ZXJzaW9uX2lkfS9yZXN0b3JlXCJdLFxuICAgIHJlc3RvcmVQYWNrYWdlVmVyc2lvbkZvclVzZXI6IFtcIlBPU1QgL3VzZXJzL3t1c2VybmFtZX0vcGFja2FnZXMve3BhY2thZ2VfdHlwZX0ve3BhY2thZ2VfbmFtZX0vdmVyc2lvbnMve3BhY2thZ2VfdmVyc2lvbl9pZH0vcmVzdG9yZVwiXVxuICB9LFxuICBwcm9qZWN0czoge1xuICAgIGFkZENvbGxhYm9yYXRvcjogW1wiUFVUIC9wcm9qZWN0cy97cHJvamVjdF9pZH0vY29sbGFib3JhdG9ycy97dXNlcm5hbWV9XCJdLFxuICAgIGNyZWF0ZUNhcmQ6IFtcIlBPU1QgL3Byb2plY3RzL2NvbHVtbnMve2NvbHVtbl9pZH0vY2FyZHNcIl0sXG4gICAgY3JlYXRlQ29sdW1uOiBbXCJQT1NUIC9wcm9qZWN0cy97cHJvamVjdF9pZH0vY29sdW1uc1wiXSxcbiAgICBjcmVhdGVGb3JBdXRoZW50aWNhdGVkVXNlcjogW1wiUE9TVCAvdXNlci9wcm9qZWN0c1wiXSxcbiAgICBjcmVhdGVGb3JPcmc6IFtcIlBPU1QgL29yZ3Mve29yZ30vcHJvamVjdHNcIl0sXG4gICAgY3JlYXRlRm9yUmVwbzogW1wiUE9TVCAvcmVwb3Mve293bmVyfS97cmVwb30vcHJvamVjdHNcIl0sXG4gICAgZGVsZXRlOiBbXCJERUxFVEUgL3Byb2plY3RzL3twcm9qZWN0X2lkfVwiXSxcbiAgICBkZWxldGVDYXJkOiBbXCJERUxFVEUgL3Byb2plY3RzL2NvbHVtbnMvY2FyZHMve2NhcmRfaWR9XCJdLFxuICAgIGRlbGV0ZUNvbHVtbjogW1wiREVMRVRFIC9wcm9qZWN0cy9jb2x1bW5zL3tjb2x1bW5faWR9XCJdLFxuICAgIGdldDogW1wiR0VUIC9wcm9qZWN0cy97cHJvamVjdF9pZH1cIl0sXG4gICAgZ2V0Q2FyZDogW1wiR0VUIC9wcm9qZWN0cy9jb2x1bW5zL2NhcmRzL3tjYXJkX2lkfVwiXSxcbiAgICBnZXRDb2x1bW46IFtcIkdFVCAvcHJvamVjdHMvY29sdW1ucy97Y29sdW1uX2lkfVwiXSxcbiAgICBnZXRQZXJtaXNzaW9uRm9yVXNlcjogW1wiR0VUIC9wcm9qZWN0cy97cHJvamVjdF9pZH0vY29sbGFib3JhdG9ycy97dXNlcm5hbWV9L3Blcm1pc3Npb25cIl0sXG4gICAgbGlzdENhcmRzOiBbXCJHRVQgL3Byb2plY3RzL2NvbHVtbnMve2NvbHVtbl9pZH0vY2FyZHNcIl0sXG4gICAgbGlzdENvbGxhYm9yYXRvcnM6IFtcIkdFVCAvcHJvamVjdHMve3Byb2plY3RfaWR9L2NvbGxhYm9yYXRvcnNcIl0sXG4gICAgbGlzdENvbHVtbnM6IFtcIkdFVCAvcHJvamVjdHMve3Byb2plY3RfaWR9L2NvbHVtbnNcIl0sXG4gICAgbGlzdEZvck9yZzogW1wiR0VUIC9vcmdzL3tvcmd9L3Byb2plY3RzXCJdLFxuICAgIGxpc3RGb3JSZXBvOiBbXCJHRVQgL3JlcG9zL3tvd25lcn0ve3JlcG99L3Byb2plY3RzXCJdLFxuICAgIGxpc3RGb3JVc2VyOiBbXCJHRVQgL3VzZXJzL3t1c2VybmFtZX0vcHJvamVjdHNcIl0sXG4gICAgbW92ZUNhcmQ6IFtcIlBPU1QgL3Byb2plY3RzL2NvbHVtbnMvY2FyZHMve2NhcmRfaWR9L21vdmVzXCJdLFxuICAgIG1vdmVDb2x1bW46IFtcIlBPU1QgL3Byb2plY3RzL2NvbHVtbnMve2NvbHVtbl9pZH0vbW92ZXNcIl0sXG4gICAgcmVtb3ZlQ29sbGFib3JhdG9yOiBbXCJERUxFVEUgL3Byb2plY3RzL3twcm9qZWN0X2lkfS9jb2xsYWJvcmF0b3JzL3t1c2VybmFtZX1cIl0sXG4gICAgdXBkYXRlOiBbXCJQQVRDSCAvcHJvamVjdHMve3Byb2plY3RfaWR9XCJdLFxuICAgIHVwZGF0ZUNhcmQ6IFtcIlBBVENIIC9wcm9qZWN0cy9jb2x1bW5zL2NhcmRzL3tjYXJkX2lkfVwiXSxcbiAgICB1cGRhdGVDb2x1bW46IFtcIlBBVENIIC9wcm9qZWN0cy9jb2x1bW5zL3tjb2x1bW5faWR9XCJdXG4gIH0sXG4gIHB1bGxzOiB7XG4gICAgY2hlY2tJZk1lcmdlZDogW1wiR0VUIC9yZXBvcy97b3duZXJ9L3tyZXBvfS9wdWxscy97cHVsbF9udW1iZXJ9L21lcmdlXCJdLFxuICAgIGNyZWF0ZTogW1wiUE9TVCAvcmVwb3Mve293bmVyfS97cmVwb30vcHVsbHNcIl0sXG4gICAgY3JlYXRlUmVwbHlGb3JSZXZpZXdDb21tZW50OiBbXCJQT1NUIC9yZXBvcy97b3duZXJ9L3tyZXBvfS9wdWxscy97cHVsbF9udW1iZXJ9L2NvbW1lbnRzL3tjb21tZW50X2lkfS9yZXBsaWVzXCJdLFxuICAgIGNyZWF0ZVJldmlldzogW1wiUE9TVCAvcmVwb3Mve293bmVyfS97cmVwb30vcHVsbHMve3B1bGxfbnVtYmVyfS9yZXZpZXdzXCJdLFxuICAgIGNyZWF0ZVJldmlld0NvbW1lbnQ6IFtcIlBPU1QgL3JlcG9zL3tvd25lcn0ve3JlcG99L3B1bGxzL3twdWxsX251bWJlcn0vY29tbWVudHNcIl0sXG4gICAgZGVsZXRlUGVuZGluZ1JldmlldzogW1wiREVMRVRFIC9yZXBvcy97b3duZXJ9L3tyZXBvfS9wdWxscy97cHVsbF9udW1iZXJ9L3Jldmlld3Mve3Jldmlld19pZH1cIl0sXG4gICAgZGVsZXRlUmV2aWV3Q29tbWVudDogW1wiREVMRVRFIC9yZXBvcy97b3duZXJ9L3tyZXBvfS9wdWxscy9jb21tZW50cy97Y29tbWVudF9pZH1cIl0sXG4gICAgZGlzbWlzc1JldmlldzogW1wiUFVUIC9yZXBvcy97b3duZXJ9L3tyZXBvfS9wdWxscy97cHVsbF9udW1iZXJ9L3Jldmlld3Mve3Jldmlld19pZH0vZGlzbWlzc2Fsc1wiXSxcbiAgICBnZXQ6IFtcIkdFVCAvcmVwb3Mve293bmVyfS97cmVwb30vcHVsbHMve3B1bGxfbnVtYmVyfVwiXSxcbiAgICBnZXRSZXZpZXc6IFtcIkdFVCAvcmVwb3Mve293bmVyfS97cmVwb30vcHVsbHMve3B1bGxfbnVtYmVyfS9yZXZpZXdzL3tyZXZpZXdfaWR9XCJdLFxuICAgIGdldFJldmlld0NvbW1lbnQ6IFtcIkdFVCAvcmVwb3Mve293bmVyfS97cmVwb30vcHVsbHMvY29tbWVudHMve2NvbW1lbnRfaWR9XCJdLFxuICAgIGxpc3Q6IFtcIkdFVCAvcmVwb3Mve293bmVyfS97cmVwb30vcHVsbHNcIl0sXG4gICAgbGlzdENvbW1lbnRzRm9yUmV2aWV3OiBbXCJHRVQgL3JlcG9zL3tvd25lcn0ve3JlcG99L3B1bGxzL3twdWxsX251bWJlcn0vcmV2aWV3cy97cmV2aWV3X2lkfS9jb21tZW50c1wiXSxcbiAgICBsaXN0Q29tbWl0czogW1wiR0VUIC9yZXBvcy97b3duZXJ9L3tyZXBvfS9wdWxscy97cHVsbF9udW1iZXJ9L2NvbW1pdHNcIl0sXG4gICAgbGlzdEZpbGVzOiBbXCJHRVQgL3JlcG9zL3tvd25lcn0ve3JlcG99L3B1bGxzL3twdWxsX251bWJlcn0vZmlsZXNcIl0sXG4gICAgbGlzdFJlcXVlc3RlZFJldmlld2VyczogW1wiR0VUIC9yZXBvcy97b3duZXJ9L3tyZXBvfS9wdWxscy97cHVsbF9udW1iZXJ9L3JlcXVlc3RlZF9yZXZpZXdlcnNcIl0sXG4gICAgbGlzdFJldmlld0NvbW1lbnRzOiBbXCJHRVQgL3JlcG9zL3tvd25lcn0ve3JlcG99L3B1bGxzL3twdWxsX251bWJlcn0vY29tbWVudHNcIl0sXG4gICAgbGlzdFJldmlld0NvbW1lbnRzRm9yUmVwbzogW1wiR0VUIC9yZXBvcy97b3duZXJ9L3tyZXBvfS9wdWxscy9jb21tZW50c1wiXSxcbiAgICBsaXN0UmV2aWV3czogW1wiR0VUIC9yZXBvcy97b3duZXJ9L3tyZXBvfS9wdWxscy97cHVsbF9udW1iZXJ9L3Jldmlld3NcIl0sXG4gICAgbWVyZ2U6IFtcIlBVVCAvcmVwb3Mve293bmVyfS97cmVwb30vcHVsbHMve3B1bGxfbnVtYmVyfS9tZXJnZVwiXSxcbiAgICByZW1vdmVSZXF1ZXN0ZWRSZXZpZXdlcnM6IFtcIkRFTEVURSAvcmVwb3Mve293bmVyfS97cmVwb30vcHVsbHMve3B1bGxfbnVtYmVyfS9yZXF1ZXN0ZWRfcmV2aWV3ZXJzXCJdLFxuICAgIHJlcXVlc3RSZXZpZXdlcnM6IFtcIlBPU1QgL3JlcG9zL3tvd25lcn0ve3JlcG99L3B1bGxzL3twdWxsX251bWJlcn0vcmVxdWVzdGVkX3Jldmlld2Vyc1wiXSxcbiAgICBzdWJtaXRSZXZpZXc6IFtcIlBPU1QgL3JlcG9zL3tvd25lcn0ve3JlcG99L3B1bGxzL3twdWxsX251bWJlcn0vcmV2aWV3cy97cmV2aWV3X2lkfS9ldmVudHNcIl0sXG4gICAgdXBkYXRlOiBbXCJQQVRDSCAvcmVwb3Mve293bmVyfS97cmVwb30vcHVsbHMve3B1bGxfbnVtYmVyfVwiXSxcbiAgICB1cGRhdGVCcmFuY2g6IFtcIlBVVCAvcmVwb3Mve293bmVyfS97cmVwb30vcHVsbHMve3B1bGxfbnVtYmVyfS91cGRhdGUtYnJhbmNoXCJdLFxuICAgIHVwZGF0ZVJldmlldzogW1wiUFVUIC9yZXBvcy97b3duZXJ9L3tyZXBvfS9wdWxscy97cHVsbF9udW1iZXJ9L3Jldmlld3Mve3Jldmlld19pZH1cIl0sXG4gICAgdXBkYXRlUmV2aWV3Q29tbWVudDogW1wiUEFUQ0ggL3JlcG9zL3tvd25lcn0ve3JlcG99L3B1bGxzL2NvbW1lbnRzL3tjb21tZW50X2lkfVwiXVxuICB9LFxuICByYXRlTGltaXQ6IHtcbiAgICBnZXQ6IFtcIkdFVCAvcmF0ZV9saW1pdFwiXVxuICB9LFxuICByZWFjdGlvbnM6IHtcbiAgICBjcmVhdGVGb3JDb21taXRDb21tZW50OiBbXCJQT1NUIC9yZXBvcy97b3duZXJ9L3tyZXBvfS9jb21tZW50cy97Y29tbWVudF9pZH0vcmVhY3Rpb25zXCJdLFxuICAgIGNyZWF0ZUZvcklzc3VlOiBbXCJQT1NUIC9yZXBvcy97b3duZXJ9L3tyZXBvfS9pc3N1ZXMve2lzc3VlX251bWJlcn0vcmVhY3Rpb25zXCJdLFxuICAgIGNyZWF0ZUZvcklzc3VlQ29tbWVudDogW1wiUE9TVCAvcmVwb3Mve293bmVyfS97cmVwb30vaXNzdWVzL2NvbW1lbnRzL3tjb21tZW50X2lkfS9yZWFjdGlvbnNcIl0sXG4gICAgY3JlYXRlRm9yUHVsbFJlcXVlc3RSZXZpZXdDb21tZW50OiBbXCJQT1NUIC9yZXBvcy97b3duZXJ9L3tyZXBvfS9wdWxscy9jb21tZW50cy97Y29tbWVudF9pZH0vcmVhY3Rpb25zXCJdLFxuICAgIGNyZWF0ZUZvclJlbGVhc2U6IFtcIlBPU1QgL3JlcG9zL3tvd25lcn0ve3JlcG99L3JlbGVhc2VzL3tyZWxlYXNlX2lkfS9yZWFjdGlvbnNcIl0sXG4gICAgY3JlYXRlRm9yVGVhbURpc2N1c3Npb25Db21tZW50SW5Pcmc6IFtcIlBPU1QgL29yZ3Mve29yZ30vdGVhbXMve3RlYW1fc2x1Z30vZGlzY3Vzc2lvbnMve2Rpc2N1c3Npb25fbnVtYmVyfS9jb21tZW50cy97Y29tbWVudF9udW1iZXJ9L3JlYWN0aW9uc1wiXSxcbiAgICBjcmVhdGVGb3JUZWFtRGlzY3Vzc2lvbkluT3JnOiBbXCJQT1NUIC9vcmdzL3tvcmd9L3RlYW1zL3t0ZWFtX3NsdWd9L2Rpc2N1c3Npb25zL3tkaXNjdXNzaW9uX251bWJlcn0vcmVhY3Rpb25zXCJdLFxuICAgIGRlbGV0ZUZvckNvbW1pdENvbW1lbnQ6IFtcIkRFTEVURSAvcmVwb3Mve293bmVyfS97cmVwb30vY29tbWVudHMve2NvbW1lbnRfaWR9L3JlYWN0aW9ucy97cmVhY3Rpb25faWR9XCJdLFxuICAgIGRlbGV0ZUZvcklzc3VlOiBbXCJERUxFVEUgL3JlcG9zL3tvd25lcn0ve3JlcG99L2lzc3Vlcy97aXNzdWVfbnVtYmVyfS9yZWFjdGlvbnMve3JlYWN0aW9uX2lkfVwiXSxcbiAgICBkZWxldGVGb3JJc3N1ZUNvbW1lbnQ6IFtcIkRFTEVURSAvcmVwb3Mve293bmVyfS97cmVwb30vaXNzdWVzL2NvbW1lbnRzL3tjb21tZW50X2lkfS9yZWFjdGlvbnMve3JlYWN0aW9uX2lkfVwiXSxcbiAgICBkZWxldGVGb3JQdWxsUmVxdWVzdENvbW1lbnQ6IFtcIkRFTEVURSAvcmVwb3Mve293bmVyfS97cmVwb30vcHVsbHMvY29tbWVudHMve2NvbW1lbnRfaWR9L3JlYWN0aW9ucy97cmVhY3Rpb25faWR9XCJdLFxuICAgIGRlbGV0ZUZvclJlbGVhc2U6IFtcIkRFTEVURSAvcmVwb3Mve293bmVyfS97cmVwb30vcmVsZWFzZXMve3JlbGVhc2VfaWR9L3JlYWN0aW9ucy97cmVhY3Rpb25faWR9XCJdLFxuICAgIGRlbGV0ZUZvclRlYW1EaXNjdXNzaW9uOiBbXCJERUxFVEUgL29yZ3Mve29yZ30vdGVhbXMve3RlYW1fc2x1Z30vZGlzY3Vzc2lvbnMve2Rpc2N1c3Npb25fbnVtYmVyfS9yZWFjdGlvbnMve3JlYWN0aW9uX2lkfVwiXSxcbiAgICBkZWxldGVGb3JUZWFtRGlzY3Vzc2lvbkNvbW1lbnQ6IFtcIkRFTEVURSAvb3Jncy97b3JnfS90ZWFtcy97dGVhbV9zbHVnfS9kaXNjdXNzaW9ucy97ZGlzY3Vzc2lvbl9udW1iZXJ9L2NvbW1lbnRzL3tjb21tZW50X251bWJlcn0vcmVhY3Rpb25zL3tyZWFjdGlvbl9pZH1cIl0sXG4gICAgbGlzdEZvckNvbW1pdENvbW1lbnQ6IFtcIkdFVCAvcmVwb3Mve293bmVyfS97cmVwb30vY29tbWVudHMve2NvbW1lbnRfaWR9L3JlYWN0aW9uc1wiXSxcbiAgICBsaXN0Rm9ySXNzdWU6IFtcIkdFVCAvcmVwb3Mve293bmVyfS97cmVwb30vaXNzdWVzL3tpc3N1ZV9udW1iZXJ9L3JlYWN0aW9uc1wiXSxcbiAgICBsaXN0Rm9ySXNzdWVDb21tZW50OiBbXCJHRVQgL3JlcG9zL3tvd25lcn0ve3JlcG99L2lzc3Vlcy9jb21tZW50cy97Y29tbWVudF9pZH0vcmVhY3Rpb25zXCJdLFxuICAgIGxpc3RGb3JQdWxsUmVxdWVzdFJldmlld0NvbW1lbnQ6IFtcIkdFVCAvcmVwb3Mve293bmVyfS97cmVwb30vcHVsbHMvY29tbWVudHMve2NvbW1lbnRfaWR9L3JlYWN0aW9uc1wiXSxcbiAgICBsaXN0Rm9yUmVsZWFzZTogW1wiR0VUIC9yZXBvcy97b3duZXJ9L3tyZXBvfS9yZWxlYXNlcy97cmVsZWFzZV9pZH0vcmVhY3Rpb25zXCJdLFxuICAgIGxpc3RGb3JUZWFtRGlzY3Vzc2lvbkNvbW1lbnRJbk9yZzogW1wiR0VUIC9vcmdzL3tvcmd9L3RlYW1zL3t0ZWFtX3NsdWd9L2Rpc2N1c3Npb25zL3tkaXNjdXNzaW9uX251bWJlcn0vY29tbWVudHMve2NvbW1lbnRfbnVtYmVyfS9yZWFjdGlvbnNcIl0sXG4gICAgbGlzdEZvclRlYW1EaXNjdXNzaW9uSW5Pcmc6IFtcIkdFVCAvb3Jncy97b3JnfS90ZWFtcy97dGVhbV9zbHVnfS9kaXNjdXNzaW9ucy97ZGlzY3Vzc2lvbl9udW1iZXJ9L3JlYWN0aW9uc1wiXVxuICB9LFxuICByZXBvczoge1xuICAgIGFjY2VwdEludml0YXRpb246IFtcIlBBVENIIC91c2VyL3JlcG9zaXRvcnlfaW52aXRhdGlvbnMve2ludml0YXRpb25faWR9XCIsIHt9LCB7XG4gICAgICByZW5hbWVkOiBbXCJyZXBvc1wiLCBcImFjY2VwdEludml0YXRpb25Gb3JBdXRoZW50aWNhdGVkVXNlclwiXVxuICAgIH1dLFxuICAgIGFjY2VwdEludml0YXRpb25Gb3JBdXRoZW50aWNhdGVkVXNlcjogW1wiUEFUQ0ggL3VzZXIvcmVwb3NpdG9yeV9pbnZpdGF0aW9ucy97aW52aXRhdGlvbl9pZH1cIl0sXG4gICAgYWRkQXBwQWNjZXNzUmVzdHJpY3Rpb25zOiBbXCJQT1NUIC9yZXBvcy97b3duZXJ9L3tyZXBvfS9icmFuY2hlcy97YnJhbmNofS9wcm90ZWN0aW9uL3Jlc3RyaWN0aW9ucy9hcHBzXCIsIHt9LCB7XG4gICAgICBtYXBUb0RhdGE6IFwiYXBwc1wiXG4gICAgfV0sXG4gICAgYWRkQ29sbGFib3JhdG9yOiBbXCJQVVQgL3JlcG9zL3tvd25lcn0ve3JlcG99L2NvbGxhYm9yYXRvcnMve3VzZXJuYW1lfVwiXSxcbiAgICBhZGRTdGF0dXNDaGVja0NvbnRleHRzOiBbXCJQT1NUIC9yZXBvcy97b3duZXJ9L3tyZXBvfS9icmFuY2hlcy97YnJhbmNofS9wcm90ZWN0aW9uL3JlcXVpcmVkX3N0YXR1c19jaGVja3MvY29udGV4dHNcIiwge30sIHtcbiAgICAgIG1hcFRvRGF0YTogXCJjb250ZXh0c1wiXG4gICAgfV0sXG4gICAgYWRkVGVhbUFjY2Vzc1Jlc3RyaWN0aW9uczogW1wiUE9TVCAvcmVwb3Mve293bmVyfS97cmVwb30vYnJhbmNoZXMve2JyYW5jaH0vcHJvdGVjdGlvbi9yZXN0cmljdGlvbnMvdGVhbXNcIiwge30sIHtcbiAgICAgIG1hcFRvRGF0YTogXCJ0ZWFtc1wiXG4gICAgfV0sXG4gICAgYWRkVXNlckFjY2Vzc1Jlc3RyaWN0aW9uczogW1wiUE9TVCAvcmVwb3Mve293bmVyfS97cmVwb30vYnJhbmNoZXMve2JyYW5jaH0vcHJvdGVjdGlvbi9yZXN0cmljdGlvbnMvdXNlcnNcIiwge30sIHtcbiAgICAgIG1hcFRvRGF0YTogXCJ1c2Vyc1wiXG4gICAgfV0sXG4gICAgY2hlY2tDb2xsYWJvcmF0b3I6IFtcIkdFVCAvcmVwb3Mve293bmVyfS97cmVwb30vY29sbGFib3JhdG9ycy97dXNlcm5hbWV9XCJdLFxuICAgIGNoZWNrVnVsbmVyYWJpbGl0eUFsZXJ0czogW1wiR0VUIC9yZXBvcy97b3duZXJ9L3tyZXBvfS92dWxuZXJhYmlsaXR5LWFsZXJ0c1wiXSxcbiAgICBjb2Rlb3duZXJzRXJyb3JzOiBbXCJHRVQgL3JlcG9zL3tvd25lcn0ve3JlcG99L2NvZGVvd25lcnMvZXJyb3JzXCJdLFxuICAgIGNvbXBhcmVDb21taXRzOiBbXCJHRVQgL3JlcG9zL3tvd25lcn0ve3JlcG99L2NvbXBhcmUve2Jhc2V9Li4ue2hlYWR9XCJdLFxuICAgIGNvbXBhcmVDb21taXRzV2l0aEJhc2VoZWFkOiBbXCJHRVQgL3JlcG9zL3tvd25lcn0ve3JlcG99L2NvbXBhcmUve2Jhc2VoZWFkfVwiXSxcbiAgICBjcmVhdGVBdXRvbGluazogW1wiUE9TVCAvcmVwb3Mve293bmVyfS97cmVwb30vYXV0b2xpbmtzXCJdLFxuICAgIGNyZWF0ZUNvbW1pdENvbW1lbnQ6IFtcIlBPU1QgL3JlcG9zL3tvd25lcn0ve3JlcG99L2NvbW1pdHMve2NvbW1pdF9zaGF9L2NvbW1lbnRzXCJdLFxuICAgIGNyZWF0ZUNvbW1pdFNpZ25hdHVyZVByb3RlY3Rpb246IFtcIlBPU1QgL3JlcG9zL3tvd25lcn0ve3JlcG99L2JyYW5jaGVzL3ticmFuY2h9L3Byb3RlY3Rpb24vcmVxdWlyZWRfc2lnbmF0dXJlc1wiXSxcbiAgICBjcmVhdGVDb21taXRTdGF0dXM6IFtcIlBPU1QgL3JlcG9zL3tvd25lcn0ve3JlcG99L3N0YXR1c2VzL3tzaGF9XCJdLFxuICAgIGNyZWF0ZURlcGxveUtleTogW1wiUE9TVCAvcmVwb3Mve293bmVyfS97cmVwb30va2V5c1wiXSxcbiAgICBjcmVhdGVEZXBsb3ltZW50OiBbXCJQT1NUIC9yZXBvcy97b3duZXJ9L3tyZXBvfS9kZXBsb3ltZW50c1wiXSxcbiAgICBjcmVhdGVEZXBsb3ltZW50U3RhdHVzOiBbXCJQT1NUIC9yZXBvcy97b3duZXJ9L3tyZXBvfS9kZXBsb3ltZW50cy97ZGVwbG95bWVudF9pZH0vc3RhdHVzZXNcIl0sXG4gICAgY3JlYXRlRGlzcGF0Y2hFdmVudDogW1wiUE9TVCAvcmVwb3Mve293bmVyfS97cmVwb30vZGlzcGF0Y2hlc1wiXSxcbiAgICBjcmVhdGVGb3JBdXRoZW50aWNhdGVkVXNlcjogW1wiUE9TVCAvdXNlci9yZXBvc1wiXSxcbiAgICBjcmVhdGVGb3JrOiBbXCJQT1NUIC9yZXBvcy97b3duZXJ9L3tyZXBvfS9mb3Jrc1wiXSxcbiAgICBjcmVhdGVJbk9yZzogW1wiUE9TVCAvb3Jncy97b3JnfS9yZXBvc1wiXSxcbiAgICBjcmVhdGVPclVwZGF0ZUVudmlyb25tZW50OiBbXCJQVVQgL3JlcG9zL3tvd25lcn0ve3JlcG99L2Vudmlyb25tZW50cy97ZW52aXJvbm1lbnRfbmFtZX1cIl0sXG4gICAgY3JlYXRlT3JVcGRhdGVGaWxlQ29udGVudHM6IFtcIlBVVCAvcmVwb3Mve293bmVyfS97cmVwb30vY29udGVudHMve3BhdGh9XCJdLFxuICAgIGNyZWF0ZVBhZ2VzU2l0ZTogW1wiUE9TVCAvcmVwb3Mve293bmVyfS97cmVwb30vcGFnZXNcIl0sXG4gICAgY3JlYXRlUmVsZWFzZTogW1wiUE9TVCAvcmVwb3Mve293bmVyfS97cmVwb30vcmVsZWFzZXNcIl0sXG4gICAgY3JlYXRlVGFnUHJvdGVjdGlvbjogW1wiUE9TVCAvcmVwb3Mve293bmVyfS97cmVwb30vdGFncy9wcm90ZWN0aW9uXCJdLFxuICAgIGNyZWF0ZVVzaW5nVGVtcGxhdGU6IFtcIlBPU1QgL3JlcG9zL3t0ZW1wbGF0ZV9vd25lcn0ve3RlbXBsYXRlX3JlcG99L2dlbmVyYXRlXCJdLFxuICAgIGNyZWF0ZVdlYmhvb2s6IFtcIlBPU1QgL3JlcG9zL3tvd25lcn0ve3JlcG99L2hvb2tzXCJdLFxuICAgIGRlY2xpbmVJbnZpdGF0aW9uOiBbXCJERUxFVEUgL3VzZXIvcmVwb3NpdG9yeV9pbnZpdGF0aW9ucy97aW52aXRhdGlvbl9pZH1cIiwge30sIHtcbiAgICAgIHJlbmFtZWQ6IFtcInJlcG9zXCIsIFwiZGVjbGluZUludml0YXRpb25Gb3JBdXRoZW50aWNhdGVkVXNlclwiXVxuICAgIH1dLFxuICAgIGRlY2xpbmVJbnZpdGF0aW9uRm9yQXV0aGVudGljYXRlZFVzZXI6IFtcIkRFTEVURSAvdXNlci9yZXBvc2l0b3J5X2ludml0YXRpb25zL3tpbnZpdGF0aW9uX2lkfVwiXSxcbiAgICBkZWxldGU6IFtcIkRFTEVURSAvcmVwb3Mve293bmVyfS97cmVwb31cIl0sXG4gICAgZGVsZXRlQWNjZXNzUmVzdHJpY3Rpb25zOiBbXCJERUxFVEUgL3JlcG9zL3tvd25lcn0ve3JlcG99L2JyYW5jaGVzL3ticmFuY2h9L3Byb3RlY3Rpb24vcmVzdHJpY3Rpb25zXCJdLFxuICAgIGRlbGV0ZUFkbWluQnJhbmNoUHJvdGVjdGlvbjogW1wiREVMRVRFIC9yZXBvcy97b3duZXJ9L3tyZXBvfS9icmFuY2hlcy97YnJhbmNofS9wcm90ZWN0aW9uL2VuZm9yY2VfYWRtaW5zXCJdLFxuICAgIGRlbGV0ZUFuRW52aXJvbm1lbnQ6IFtcIkRFTEVURSAvcmVwb3Mve293bmVyfS97cmVwb30vZW52aXJvbm1lbnRzL3tlbnZpcm9ubWVudF9uYW1lfVwiXSxcbiAgICBkZWxldGVBdXRvbGluazogW1wiREVMRVRFIC9yZXBvcy97b3duZXJ9L3tyZXBvfS9hdXRvbGlua3Mve2F1dG9saW5rX2lkfVwiXSxcbiAgICBkZWxldGVCcmFuY2hQcm90ZWN0aW9uOiBbXCJERUxFVEUgL3JlcG9zL3tvd25lcn0ve3JlcG99L2JyYW5jaGVzL3ticmFuY2h9L3Byb3RlY3Rpb25cIl0sXG4gICAgZGVsZXRlQ29tbWl0Q29tbWVudDogW1wiREVMRVRFIC9yZXBvcy97b3duZXJ9L3tyZXBvfS9jb21tZW50cy97Y29tbWVudF9pZH1cIl0sXG4gICAgZGVsZXRlQ29tbWl0U2lnbmF0dXJlUHJvdGVjdGlvbjogW1wiREVMRVRFIC9yZXBvcy97b3duZXJ9L3tyZXBvfS9icmFuY2hlcy97YnJhbmNofS9wcm90ZWN0aW9uL3JlcXVpcmVkX3NpZ25hdHVyZXNcIl0sXG4gICAgZGVsZXRlRGVwbG95S2V5OiBbXCJERUxFVEUgL3JlcG9zL3tvd25lcn0ve3JlcG99L2tleXMve2tleV9pZH1cIl0sXG4gICAgZGVsZXRlRGVwbG95bWVudDogW1wiREVMRVRFIC9yZXBvcy97b3duZXJ9L3tyZXBvfS9kZXBsb3ltZW50cy97ZGVwbG95bWVudF9pZH1cIl0sXG4gICAgZGVsZXRlRmlsZTogW1wiREVMRVRFIC9yZXBvcy97b3duZXJ9L3tyZXBvfS9jb250ZW50cy97cGF0aH1cIl0sXG4gICAgZGVsZXRlSW52aXRhdGlvbjogW1wiREVMRVRFIC9yZXBvcy97b3duZXJ9L3tyZXBvfS9pbnZpdGF0aW9ucy97aW52aXRhdGlvbl9pZH1cIl0sXG4gICAgZGVsZXRlUGFnZXNTaXRlOiBbXCJERUxFVEUgL3JlcG9zL3tvd25lcn0ve3JlcG99L3BhZ2VzXCJdLFxuICAgIGRlbGV0ZVB1bGxSZXF1ZXN0UmV2aWV3UHJvdGVjdGlvbjogW1wiREVMRVRFIC9yZXBvcy97b3duZXJ9L3tyZXBvfS9icmFuY2hlcy97YnJhbmNofS9wcm90ZWN0aW9uL3JlcXVpcmVkX3B1bGxfcmVxdWVzdF9yZXZpZXdzXCJdLFxuICAgIGRlbGV0ZVJlbGVhc2U6IFtcIkRFTEVURSAvcmVwb3Mve293bmVyfS97cmVwb30vcmVsZWFzZXMve3JlbGVhc2VfaWR9XCJdLFxuICAgIGRlbGV0ZVJlbGVhc2VBc3NldDogW1wiREVMRVRFIC9yZXBvcy97b3duZXJ9L3tyZXBvfS9yZWxlYXNlcy9hc3NldHMve2Fzc2V0X2lkfVwiXSxcbiAgICBkZWxldGVUYWdQcm90ZWN0aW9uOiBbXCJERUxFVEUgL3JlcG9zL3tvd25lcn0ve3JlcG99L3RhZ3MvcHJvdGVjdGlvbi97dGFnX3Byb3RlY3Rpb25faWR9XCJdLFxuICAgIGRlbGV0ZVdlYmhvb2s6IFtcIkRFTEVURSAvcmVwb3Mve293bmVyfS97cmVwb30vaG9va3Mve2hvb2tfaWR9XCJdLFxuICAgIGRpc2FibGVBdXRvbWF0ZWRTZWN1cml0eUZpeGVzOiBbXCJERUxFVEUgL3JlcG9zL3tvd25lcn0ve3JlcG99L2F1dG9tYXRlZC1zZWN1cml0eS1maXhlc1wiXSxcbiAgICBkaXNhYmxlTGZzRm9yUmVwbzogW1wiREVMRVRFIC9yZXBvcy97b3duZXJ9L3tyZXBvfS9sZnNcIl0sXG4gICAgZGlzYWJsZVZ1bG5lcmFiaWxpdHlBbGVydHM6IFtcIkRFTEVURSAvcmVwb3Mve293bmVyfS97cmVwb30vdnVsbmVyYWJpbGl0eS1hbGVydHNcIl0sXG4gICAgZG93bmxvYWRBcmNoaXZlOiBbXCJHRVQgL3JlcG9zL3tvd25lcn0ve3JlcG99L3ppcGJhbGwve3JlZn1cIiwge30sIHtcbiAgICAgIHJlbmFtZWQ6IFtcInJlcG9zXCIsIFwiZG93bmxvYWRaaXBiYWxsQXJjaGl2ZVwiXVxuICAgIH1dLFxuICAgIGRvd25sb2FkVGFyYmFsbEFyY2hpdmU6IFtcIkdFVCAvcmVwb3Mve293bmVyfS97cmVwb30vdGFyYmFsbC97cmVmfVwiXSxcbiAgICBkb3dubG9hZFppcGJhbGxBcmNoaXZlOiBbXCJHRVQgL3JlcG9zL3tvd25lcn0ve3JlcG99L3ppcGJhbGwve3JlZn1cIl0sXG4gICAgZW5hYmxlQXV0b21hdGVkU2VjdXJpdHlGaXhlczogW1wiUFVUIC9yZXBvcy97b3duZXJ9L3tyZXBvfS9hdXRvbWF0ZWQtc2VjdXJpdHktZml4ZXNcIl0sXG4gICAgZW5hYmxlTGZzRm9yUmVwbzogW1wiUFVUIC9yZXBvcy97b3duZXJ9L3tyZXBvfS9sZnNcIl0sXG4gICAgZW5hYmxlVnVsbmVyYWJpbGl0eUFsZXJ0czogW1wiUFVUIC9yZXBvcy97b3duZXJ9L3tyZXBvfS92dWxuZXJhYmlsaXR5LWFsZXJ0c1wiXSxcbiAgICBnZW5lcmF0ZVJlbGVhc2VOb3RlczogW1wiUE9TVCAvcmVwb3Mve293bmVyfS97cmVwb30vcmVsZWFzZXMvZ2VuZXJhdGUtbm90ZXNcIl0sXG4gICAgZ2V0OiBbXCJHRVQgL3JlcG9zL3tvd25lcn0ve3JlcG99XCJdLFxuICAgIGdldEFjY2Vzc1Jlc3RyaWN0aW9uczogW1wiR0VUIC9yZXBvcy97b3duZXJ9L3tyZXBvfS9icmFuY2hlcy97YnJhbmNofS9wcm90ZWN0aW9uL3Jlc3RyaWN0aW9uc1wiXSxcbiAgICBnZXRBZG1pbkJyYW5jaFByb3RlY3Rpb246IFtcIkdFVCAvcmVwb3Mve293bmVyfS97cmVwb30vYnJhbmNoZXMve2JyYW5jaH0vcHJvdGVjdGlvbi9lbmZvcmNlX2FkbWluc1wiXSxcbiAgICBnZXRBbGxFbnZpcm9ubWVudHM6IFtcIkdFVCAvcmVwb3Mve293bmVyfS97cmVwb30vZW52aXJvbm1lbnRzXCJdLFxuICAgIGdldEFsbFN0YXR1c0NoZWNrQ29udGV4dHM6IFtcIkdFVCAvcmVwb3Mve293bmVyfS97cmVwb30vYnJhbmNoZXMve2JyYW5jaH0vcHJvdGVjdGlvbi9yZXF1aXJlZF9zdGF0dXNfY2hlY2tzL2NvbnRleHRzXCJdLFxuICAgIGdldEFsbFRvcGljczogW1wiR0VUIC9yZXBvcy97b3duZXJ9L3tyZXBvfS90b3BpY3NcIl0sXG4gICAgZ2V0QXBwc1dpdGhBY2Nlc3NUb1Byb3RlY3RlZEJyYW5jaDogW1wiR0VUIC9yZXBvcy97b3duZXJ9L3tyZXBvfS9icmFuY2hlcy97YnJhbmNofS9wcm90ZWN0aW9uL3Jlc3RyaWN0aW9ucy9hcHBzXCJdLFxuICAgIGdldEF1dG9saW5rOiBbXCJHRVQgL3JlcG9zL3tvd25lcn0ve3JlcG99L2F1dG9saW5rcy97YXV0b2xpbmtfaWR9XCJdLFxuICAgIGdldEJyYW5jaDogW1wiR0VUIC9yZXBvcy97b3duZXJ9L3tyZXBvfS9icmFuY2hlcy97YnJhbmNofVwiXSxcbiAgICBnZXRCcmFuY2hQcm90ZWN0aW9uOiBbXCJHRVQgL3JlcG9zL3tvd25lcn0ve3JlcG99L2JyYW5jaGVzL3ticmFuY2h9L3Byb3RlY3Rpb25cIl0sXG4gICAgZ2V0Q2xvbmVzOiBbXCJHRVQgL3JlcG9zL3tvd25lcn0ve3JlcG99L3RyYWZmaWMvY2xvbmVzXCJdLFxuICAgIGdldENvZGVGcmVxdWVuY3lTdGF0czogW1wiR0VUIC9yZXBvcy97b3duZXJ9L3tyZXBvfS9zdGF0cy9jb2RlX2ZyZXF1ZW5jeVwiXSxcbiAgICBnZXRDb2xsYWJvcmF0b3JQZXJtaXNzaW9uTGV2ZWw6IFtcIkdFVCAvcmVwb3Mve293bmVyfS97cmVwb30vY29sbGFib3JhdG9ycy97dXNlcm5hbWV9L3Blcm1pc3Npb25cIl0sXG4gICAgZ2V0Q29tYmluZWRTdGF0dXNGb3JSZWY6IFtcIkdFVCAvcmVwb3Mve293bmVyfS97cmVwb30vY29tbWl0cy97cmVmfS9zdGF0dXNcIl0sXG4gICAgZ2V0Q29tbWl0OiBbXCJHRVQgL3JlcG9zL3tvd25lcn0ve3JlcG99L2NvbW1pdHMve3JlZn1cIl0sXG4gICAgZ2V0Q29tbWl0QWN0aXZpdHlTdGF0czogW1wiR0VUIC9yZXBvcy97b3duZXJ9L3tyZXBvfS9zdGF0cy9jb21taXRfYWN0aXZpdHlcIl0sXG4gICAgZ2V0Q29tbWl0Q29tbWVudDogW1wiR0VUIC9yZXBvcy97b3duZXJ9L3tyZXBvfS9jb21tZW50cy97Y29tbWVudF9pZH1cIl0sXG4gICAgZ2V0Q29tbWl0U2lnbmF0dXJlUHJvdGVjdGlvbjogW1wiR0VUIC9yZXBvcy97b3duZXJ9L3tyZXBvfS9icmFuY2hlcy97YnJhbmNofS9wcm90ZWN0aW9uL3JlcXVpcmVkX3NpZ25hdHVyZXNcIl0sXG4gICAgZ2V0Q29tbXVuaXR5UHJvZmlsZU1ldHJpY3M6IFtcIkdFVCAvcmVwb3Mve293bmVyfS97cmVwb30vY29tbXVuaXR5L3Byb2ZpbGVcIl0sXG4gICAgZ2V0Q29udGVudDogW1wiR0VUIC9yZXBvcy97b3duZXJ9L3tyZXBvfS9jb250ZW50cy97cGF0aH1cIl0sXG4gICAgZ2V0Q29udHJpYnV0b3JzU3RhdHM6IFtcIkdFVCAvcmVwb3Mve293bmVyfS97cmVwb30vc3RhdHMvY29udHJpYnV0b3JzXCJdLFxuICAgIGdldERlcGxveUtleTogW1wiR0VUIC9yZXBvcy97b3duZXJ9L3tyZXBvfS9rZXlzL3trZXlfaWR9XCJdLFxuICAgIGdldERlcGxveW1lbnQ6IFtcIkdFVCAvcmVwb3Mve293bmVyfS97cmVwb30vZGVwbG95bWVudHMve2RlcGxveW1lbnRfaWR9XCJdLFxuICAgIGdldERlcGxveW1lbnRTdGF0dXM6IFtcIkdFVCAvcmVwb3Mve293bmVyfS97cmVwb30vZGVwbG95bWVudHMve2RlcGxveW1lbnRfaWR9L3N0YXR1c2VzL3tzdGF0dXNfaWR9XCJdLFxuICAgIGdldEVudmlyb25tZW50OiBbXCJHRVQgL3JlcG9zL3tvd25lcn0ve3JlcG99L2Vudmlyb25tZW50cy97ZW52aXJvbm1lbnRfbmFtZX1cIl0sXG4gICAgZ2V0TGF0ZXN0UGFnZXNCdWlsZDogW1wiR0VUIC9yZXBvcy97b3duZXJ9L3tyZXBvfS9wYWdlcy9idWlsZHMvbGF0ZXN0XCJdLFxuICAgIGdldExhdGVzdFJlbGVhc2U6IFtcIkdFVCAvcmVwb3Mve293bmVyfS97cmVwb30vcmVsZWFzZXMvbGF0ZXN0XCJdLFxuICAgIGdldFBhZ2VzOiBbXCJHRVQgL3JlcG9zL3tvd25lcn0ve3JlcG99L3BhZ2VzXCJdLFxuICAgIGdldFBhZ2VzQnVpbGQ6IFtcIkdFVCAvcmVwb3Mve293bmVyfS97cmVwb30vcGFnZXMvYnVpbGRzL3tidWlsZF9pZH1cIl0sXG4gICAgZ2V0UGFnZXNIZWFsdGhDaGVjazogW1wiR0VUIC9yZXBvcy97b3duZXJ9L3tyZXBvfS9wYWdlcy9oZWFsdGhcIl0sXG4gICAgZ2V0UGFydGljaXBhdGlvblN0YXRzOiBbXCJHRVQgL3JlcG9zL3tvd25lcn0ve3JlcG99L3N0YXRzL3BhcnRpY2lwYXRpb25cIl0sXG4gICAgZ2V0UHVsbFJlcXVlc3RSZXZpZXdQcm90ZWN0aW9uOiBbXCJHRVQgL3JlcG9zL3tvd25lcn0ve3JlcG99L2JyYW5jaGVzL3ticmFuY2h9L3Byb3RlY3Rpb24vcmVxdWlyZWRfcHVsbF9yZXF1ZXN0X3Jldmlld3NcIl0sXG4gICAgZ2V0UHVuY2hDYXJkU3RhdHM6IFtcIkdFVCAvcmVwb3Mve293bmVyfS97cmVwb30vc3RhdHMvcHVuY2hfY2FyZFwiXSxcbiAgICBnZXRSZWFkbWU6IFtcIkdFVCAvcmVwb3Mve293bmVyfS97cmVwb30vcmVhZG1lXCJdLFxuICAgIGdldFJlYWRtZUluRGlyZWN0b3J5OiBbXCJHRVQgL3JlcG9zL3tvd25lcn0ve3JlcG99L3JlYWRtZS97ZGlyfVwiXSxcbiAgICBnZXRSZWxlYXNlOiBbXCJHRVQgL3JlcG9zL3tvd25lcn0ve3JlcG99L3JlbGVhc2VzL3tyZWxlYXNlX2lkfVwiXSxcbiAgICBnZXRSZWxlYXNlQXNzZXQ6IFtcIkdFVCAvcmVwb3Mve293bmVyfS97cmVwb30vcmVsZWFzZXMvYXNzZXRzL3thc3NldF9pZH1cIl0sXG4gICAgZ2V0UmVsZWFzZUJ5VGFnOiBbXCJHRVQgL3JlcG9zL3tvd25lcn0ve3JlcG99L3JlbGVhc2VzL3RhZ3Mve3RhZ31cIl0sXG4gICAgZ2V0U3RhdHVzQ2hlY2tzUHJvdGVjdGlvbjogW1wiR0VUIC9yZXBvcy97b3duZXJ9L3tyZXBvfS9icmFuY2hlcy97YnJhbmNofS9wcm90ZWN0aW9uL3JlcXVpcmVkX3N0YXR1c19jaGVja3NcIl0sXG4gICAgZ2V0VGVhbXNXaXRoQWNjZXNzVG9Qcm90ZWN0ZWRCcmFuY2g6IFtcIkdFVCAvcmVwb3Mve293bmVyfS97cmVwb30vYnJhbmNoZXMve2JyYW5jaH0vcHJvdGVjdGlvbi9yZXN0cmljdGlvbnMvdGVhbXNcIl0sXG4gICAgZ2V0VG9wUGF0aHM6IFtcIkdFVCAvcmVwb3Mve293bmVyfS97cmVwb30vdHJhZmZpYy9wb3B1bGFyL3BhdGhzXCJdLFxuICAgIGdldFRvcFJlZmVycmVyczogW1wiR0VUIC9yZXBvcy97b3duZXJ9L3tyZXBvfS90cmFmZmljL3BvcHVsYXIvcmVmZXJyZXJzXCJdLFxuICAgIGdldFVzZXJzV2l0aEFjY2Vzc1RvUHJvdGVjdGVkQnJhbmNoOiBbXCJHRVQgL3JlcG9zL3tvd25lcn0ve3JlcG99L2JyYW5jaGVzL3ticmFuY2h9L3Byb3RlY3Rpb24vcmVzdHJpY3Rpb25zL3VzZXJzXCJdLFxuICAgIGdldFZpZXdzOiBbXCJHRVQgL3JlcG9zL3tvd25lcn0ve3JlcG99L3RyYWZmaWMvdmlld3NcIl0sXG4gICAgZ2V0V2ViaG9vazogW1wiR0VUIC9yZXBvcy97b3duZXJ9L3tyZXBvfS9ob29rcy97aG9va19pZH1cIl0sXG4gICAgZ2V0V2ViaG9va0NvbmZpZ0ZvclJlcG86IFtcIkdFVCAvcmVwb3Mve293bmVyfS97cmVwb30vaG9va3Mve2hvb2tfaWR9L2NvbmZpZ1wiXSxcbiAgICBnZXRXZWJob29rRGVsaXZlcnk6IFtcIkdFVCAvcmVwb3Mve293bmVyfS97cmVwb30vaG9va3Mve2hvb2tfaWR9L2RlbGl2ZXJpZXMve2RlbGl2ZXJ5X2lkfVwiXSxcbiAgICBsaXN0QXV0b2xpbmtzOiBbXCJHRVQgL3JlcG9zL3tvd25lcn0ve3JlcG99L2F1dG9saW5rc1wiXSxcbiAgICBsaXN0QnJhbmNoZXM6IFtcIkdFVCAvcmVwb3Mve293bmVyfS97cmVwb30vYnJhbmNoZXNcIl0sXG4gICAgbGlzdEJyYW5jaGVzRm9ySGVhZENvbW1pdDogW1wiR0VUIC9yZXBvcy97b3duZXJ9L3tyZXBvfS9jb21taXRzL3tjb21taXRfc2hhfS9icmFuY2hlcy13aGVyZS1oZWFkXCJdLFxuICAgIGxpc3RDb2xsYWJvcmF0b3JzOiBbXCJHRVQgL3JlcG9zL3tvd25lcn0ve3JlcG99L2NvbGxhYm9yYXRvcnNcIl0sXG4gICAgbGlzdENvbW1lbnRzRm9yQ29tbWl0OiBbXCJHRVQgL3JlcG9zL3tvd25lcn0ve3JlcG99L2NvbW1pdHMve2NvbW1pdF9zaGF9L2NvbW1lbnRzXCJdLFxuICAgIGxpc3RDb21taXRDb21tZW50c0ZvclJlcG86IFtcIkdFVCAvcmVwb3Mve293bmVyfS97cmVwb30vY29tbWVudHNcIl0sXG4gICAgbGlzdENvbW1pdFN0YXR1c2VzRm9yUmVmOiBbXCJHRVQgL3JlcG9zL3tvd25lcn0ve3JlcG99L2NvbW1pdHMve3JlZn0vc3RhdHVzZXNcIl0sXG4gICAgbGlzdENvbW1pdHM6IFtcIkdFVCAvcmVwb3Mve293bmVyfS97cmVwb30vY29tbWl0c1wiXSxcbiAgICBsaXN0Q29udHJpYnV0b3JzOiBbXCJHRVQgL3JlcG9zL3tvd25lcn0ve3JlcG99L2NvbnRyaWJ1dG9yc1wiXSxcbiAgICBsaXN0RGVwbG95S2V5czogW1wiR0VUIC9yZXBvcy97b3duZXJ9L3tyZXBvfS9rZXlzXCJdLFxuICAgIGxpc3REZXBsb3ltZW50U3RhdHVzZXM6IFtcIkdFVCAvcmVwb3Mve293bmVyfS97cmVwb30vZGVwbG95bWVudHMve2RlcGxveW1lbnRfaWR9L3N0YXR1c2VzXCJdLFxuICAgIGxpc3REZXBsb3ltZW50czogW1wiR0VUIC9yZXBvcy97b3duZXJ9L3tyZXBvfS9kZXBsb3ltZW50c1wiXSxcbiAgICBsaXN0Rm9yQXV0aGVudGljYXRlZFVzZXI6IFtcIkdFVCAvdXNlci9yZXBvc1wiXSxcbiAgICBsaXN0Rm9yT3JnOiBbXCJHRVQgL29yZ3Mve29yZ30vcmVwb3NcIl0sXG4gICAgbGlzdEZvclVzZXI6IFtcIkdFVCAvdXNlcnMve3VzZXJuYW1lfS9yZXBvc1wiXSxcbiAgICBsaXN0Rm9ya3M6IFtcIkdFVCAvcmVwb3Mve293bmVyfS97cmVwb30vZm9ya3NcIl0sXG4gICAgbGlzdEludml0YXRpb25zOiBbXCJHRVQgL3JlcG9zL3tvd25lcn0ve3JlcG99L2ludml0YXRpb25zXCJdLFxuICAgIGxpc3RJbnZpdGF0aW9uc0ZvckF1dGhlbnRpY2F0ZWRVc2VyOiBbXCJHRVQgL3VzZXIvcmVwb3NpdG9yeV9pbnZpdGF0aW9uc1wiXSxcbiAgICBsaXN0TGFuZ3VhZ2VzOiBbXCJHRVQgL3JlcG9zL3tvd25lcn0ve3JlcG99L2xhbmd1YWdlc1wiXSxcbiAgICBsaXN0UGFnZXNCdWlsZHM6IFtcIkdFVCAvcmVwb3Mve293bmVyfS97cmVwb30vcGFnZXMvYnVpbGRzXCJdLFxuICAgIGxpc3RQdWJsaWM6IFtcIkdFVCAvcmVwb3NpdG9yaWVzXCJdLFxuICAgIGxpc3RQdWxsUmVxdWVzdHNBc3NvY2lhdGVkV2l0aENvbW1pdDogW1wiR0VUIC9yZXBvcy97b3duZXJ9L3tyZXBvfS9jb21taXRzL3tjb21taXRfc2hhfS9wdWxsc1wiXSxcbiAgICBsaXN0UmVsZWFzZUFzc2V0czogW1wiR0VUIC9yZXBvcy97b3duZXJ9L3tyZXBvfS9yZWxlYXNlcy97cmVsZWFzZV9pZH0vYXNzZXRzXCJdLFxuICAgIGxpc3RSZWxlYXNlczogW1wiR0VUIC9yZXBvcy97b3duZXJ9L3tyZXBvfS9yZWxlYXNlc1wiXSxcbiAgICBsaXN0VGFnUHJvdGVjdGlvbjogW1wiR0VUIC9yZXBvcy97b3duZXJ9L3tyZXBvfS90YWdzL3Byb3RlY3Rpb25cIl0sXG4gICAgbGlzdFRhZ3M6IFtcIkdFVCAvcmVwb3Mve293bmVyfS97cmVwb30vdGFnc1wiXSxcbiAgICBsaXN0VGVhbXM6IFtcIkdFVCAvcmVwb3Mve293bmVyfS97cmVwb30vdGVhbXNcIl0sXG4gICAgbGlzdFdlYmhvb2tEZWxpdmVyaWVzOiBbXCJHRVQgL3JlcG9zL3tvd25lcn0ve3JlcG99L2hvb2tzL3tob29rX2lkfS9kZWxpdmVyaWVzXCJdLFxuICAgIGxpc3RXZWJob29rczogW1wiR0VUIC9yZXBvcy97b3duZXJ9L3tyZXBvfS9ob29rc1wiXSxcbiAgICBtZXJnZTogW1wiUE9TVCAvcmVwb3Mve293bmVyfS97cmVwb30vbWVyZ2VzXCJdLFxuICAgIG1lcmdlVXBzdHJlYW06IFtcIlBPU1QgL3JlcG9zL3tvd25lcn0ve3JlcG99L21lcmdlLXVwc3RyZWFtXCJdLFxuICAgIHBpbmdXZWJob29rOiBbXCJQT1NUIC9yZXBvcy97b3duZXJ9L3tyZXBvfS9ob29rcy97aG9va19pZH0vcGluZ3NcIl0sXG4gICAgcmVkZWxpdmVyV2ViaG9va0RlbGl2ZXJ5OiBbXCJQT1NUIC9yZXBvcy97b3duZXJ9L3tyZXBvfS9ob29rcy97aG9va19pZH0vZGVsaXZlcmllcy97ZGVsaXZlcnlfaWR9L2F0dGVtcHRzXCJdLFxuICAgIHJlbW92ZUFwcEFjY2Vzc1Jlc3RyaWN0aW9uczogW1wiREVMRVRFIC9yZXBvcy97b3duZXJ9L3tyZXBvfS9icmFuY2hlcy97YnJhbmNofS9wcm90ZWN0aW9uL3Jlc3RyaWN0aW9ucy9hcHBzXCIsIHt9LCB7XG4gICAgICBtYXBUb0RhdGE6IFwiYXBwc1wiXG4gICAgfV0sXG4gICAgcmVtb3ZlQ29sbGFib3JhdG9yOiBbXCJERUxFVEUgL3JlcG9zL3tvd25lcn0ve3JlcG99L2NvbGxhYm9yYXRvcnMve3VzZXJuYW1lfVwiXSxcbiAgICByZW1vdmVTdGF0dXNDaGVja0NvbnRleHRzOiBbXCJERUxFVEUgL3JlcG9zL3tvd25lcn0ve3JlcG99L2JyYW5jaGVzL3ticmFuY2h9L3Byb3RlY3Rpb24vcmVxdWlyZWRfc3RhdHVzX2NoZWNrcy9jb250ZXh0c1wiLCB7fSwge1xuICAgICAgbWFwVG9EYXRhOiBcImNvbnRleHRzXCJcbiAgICB9XSxcbiAgICByZW1vdmVTdGF0dXNDaGVja1Byb3RlY3Rpb246IFtcIkRFTEVURSAvcmVwb3Mve293bmVyfS97cmVwb30vYnJhbmNoZXMve2JyYW5jaH0vcHJvdGVjdGlvbi9yZXF1aXJlZF9zdGF0dXNfY2hlY2tzXCJdLFxuICAgIHJlbW92ZVRlYW1BY2Nlc3NSZXN0cmljdGlvbnM6IFtcIkRFTEVURSAvcmVwb3Mve293bmVyfS97cmVwb30vYnJhbmNoZXMve2JyYW5jaH0vcHJvdGVjdGlvbi9yZXN0cmljdGlvbnMvdGVhbXNcIiwge30sIHtcbiAgICAgIG1hcFRvRGF0YTogXCJ0ZWFtc1wiXG4gICAgfV0sXG4gICAgcmVtb3ZlVXNlckFjY2Vzc1Jlc3RyaWN0aW9uczogW1wiREVMRVRFIC9yZXBvcy97b3duZXJ9L3tyZXBvfS9icmFuY2hlcy97YnJhbmNofS9wcm90ZWN0aW9uL3Jlc3RyaWN0aW9ucy91c2Vyc1wiLCB7fSwge1xuICAgICAgbWFwVG9EYXRhOiBcInVzZXJzXCJcbiAgICB9XSxcbiAgICByZW5hbWVCcmFuY2g6IFtcIlBPU1QgL3JlcG9zL3tvd25lcn0ve3JlcG99L2JyYW5jaGVzL3ticmFuY2h9L3JlbmFtZVwiXSxcbiAgICByZXBsYWNlQWxsVG9waWNzOiBbXCJQVVQgL3JlcG9zL3tvd25lcn0ve3JlcG99L3RvcGljc1wiXSxcbiAgICByZXF1ZXN0UGFnZXNCdWlsZDogW1wiUE9TVCAvcmVwb3Mve293bmVyfS97cmVwb30vcGFnZXMvYnVpbGRzXCJdLFxuICAgIHNldEFkbWluQnJhbmNoUHJvdGVjdGlvbjogW1wiUE9TVCAvcmVwb3Mve293bmVyfS97cmVwb30vYnJhbmNoZXMve2JyYW5jaH0vcHJvdGVjdGlvbi9lbmZvcmNlX2FkbWluc1wiXSxcbiAgICBzZXRBcHBBY2Nlc3NSZXN0cmljdGlvbnM6IFtcIlBVVCAvcmVwb3Mve293bmVyfS97cmVwb30vYnJhbmNoZXMve2JyYW5jaH0vcHJvdGVjdGlvbi9yZXN0cmljdGlvbnMvYXBwc1wiLCB7fSwge1xuICAgICAgbWFwVG9EYXRhOiBcImFwcHNcIlxuICAgIH1dLFxuICAgIHNldFN0YXR1c0NoZWNrQ29udGV4dHM6IFtcIlBVVCAvcmVwb3Mve293bmVyfS97cmVwb30vYnJhbmNoZXMve2JyYW5jaH0vcHJvdGVjdGlvbi9yZXF1aXJlZF9zdGF0dXNfY2hlY2tzL2NvbnRleHRzXCIsIHt9LCB7XG4gICAgICBtYXBUb0RhdGE6IFwiY29udGV4dHNcIlxuICAgIH1dLFxuICAgIHNldFRlYW1BY2Nlc3NSZXN0cmljdGlvbnM6IFtcIlBVVCAvcmVwb3Mve293bmVyfS97cmVwb30vYnJhbmNoZXMve2JyYW5jaH0vcHJvdGVjdGlvbi9yZXN0cmljdGlvbnMvdGVhbXNcIiwge30sIHtcbiAgICAgIG1hcFRvRGF0YTogXCJ0ZWFtc1wiXG4gICAgfV0sXG4gICAgc2V0VXNlckFjY2Vzc1Jlc3RyaWN0aW9uczogW1wiUFVUIC9yZXBvcy97b3duZXJ9L3tyZXBvfS9icmFuY2hlcy97YnJhbmNofS9wcm90ZWN0aW9uL3Jlc3RyaWN0aW9ucy91c2Vyc1wiLCB7fSwge1xuICAgICAgbWFwVG9EYXRhOiBcInVzZXJzXCJcbiAgICB9XSxcbiAgICB0ZXN0UHVzaFdlYmhvb2s6IFtcIlBPU1QgL3JlcG9zL3tvd25lcn0ve3JlcG99L2hvb2tzL3tob29rX2lkfS90ZXN0c1wiXSxcbiAgICB0cmFuc2ZlcjogW1wiUE9TVCAvcmVwb3Mve293bmVyfS97cmVwb30vdHJhbnNmZXJcIl0sXG4gICAgdXBkYXRlOiBbXCJQQVRDSCAvcmVwb3Mve293bmVyfS97cmVwb31cIl0sXG4gICAgdXBkYXRlQnJhbmNoUHJvdGVjdGlvbjogW1wiUFVUIC9yZXBvcy97b3duZXJ9L3tyZXBvfS9icmFuY2hlcy97YnJhbmNofS9wcm90ZWN0aW9uXCJdLFxuICAgIHVwZGF0ZUNvbW1pdENvbW1lbnQ6IFtcIlBBVENIIC9yZXBvcy97b3duZXJ9L3tyZXBvfS9jb21tZW50cy97Y29tbWVudF9pZH1cIl0sXG4gICAgdXBkYXRlSW5mb3JtYXRpb25BYm91dFBhZ2VzU2l0ZTogW1wiUFVUIC9yZXBvcy97b3duZXJ9L3tyZXBvfS9wYWdlc1wiXSxcbiAgICB1cGRhdGVJbnZpdGF0aW9uOiBbXCJQQVRDSCAvcmVwb3Mve293bmVyfS97cmVwb30vaW52aXRhdGlvbnMve2ludml0YXRpb25faWR9XCJdLFxuICAgIHVwZGF0ZVB1bGxSZXF1ZXN0UmV2aWV3UHJvdGVjdGlvbjogW1wiUEFUQ0ggL3JlcG9zL3tvd25lcn0ve3JlcG99L2JyYW5jaGVzL3ticmFuY2h9L3Byb3RlY3Rpb24vcmVxdWlyZWRfcHVsbF9yZXF1ZXN0X3Jldmlld3NcIl0sXG4gICAgdXBkYXRlUmVsZWFzZTogW1wiUEFUQ0ggL3JlcG9zL3tvd25lcn0ve3JlcG99L3JlbGVhc2VzL3tyZWxlYXNlX2lkfVwiXSxcbiAgICB1cGRhdGVSZWxlYXNlQXNzZXQ6IFtcIlBBVENIIC9yZXBvcy97b3duZXJ9L3tyZXBvfS9yZWxlYXNlcy9hc3NldHMve2Fzc2V0X2lkfVwiXSxcbiAgICB1cGRhdGVTdGF0dXNDaGVja1BvdGVjdGlvbjogW1wiUEFUQ0ggL3JlcG9zL3tvd25lcn0ve3JlcG99L2JyYW5jaGVzL3ticmFuY2h9L3Byb3RlY3Rpb24vcmVxdWlyZWRfc3RhdHVzX2NoZWNrc1wiLCB7fSwge1xuICAgICAgcmVuYW1lZDogW1wicmVwb3NcIiwgXCJ1cGRhdGVTdGF0dXNDaGVja1Byb3RlY3Rpb25cIl1cbiAgICB9XSxcbiAgICB1cGRhdGVTdGF0dXNDaGVja1Byb3RlY3Rpb246IFtcIlBBVENIIC9yZXBvcy97b3duZXJ9L3tyZXBvfS9icmFuY2hlcy97YnJhbmNofS9wcm90ZWN0aW9uL3JlcXVpcmVkX3N0YXR1c19jaGVja3NcIl0sXG4gICAgdXBkYXRlV2ViaG9vazogW1wiUEFUQ0ggL3JlcG9zL3tvd25lcn0ve3JlcG99L2hvb2tzL3tob29rX2lkfVwiXSxcbiAgICB1cGRhdGVXZWJob29rQ29uZmlnRm9yUmVwbzogW1wiUEFUQ0ggL3JlcG9zL3tvd25lcn0ve3JlcG99L2hvb2tzL3tob29rX2lkfS9jb25maWdcIl0sXG4gICAgdXBsb2FkUmVsZWFzZUFzc2V0OiBbXCJQT1NUIC9yZXBvcy97b3duZXJ9L3tyZXBvfS9yZWxlYXNlcy97cmVsZWFzZV9pZH0vYXNzZXRzez9uYW1lLGxhYmVsfVwiLCB7XG4gICAgICBiYXNlVXJsOiBcImh0dHBzOi8vdXBsb2Fkcy5naXRodWIuY29tXCJcbiAgICB9XVxuICB9LFxuICBzZWFyY2g6IHtcbiAgICBjb2RlOiBbXCJHRVQgL3NlYXJjaC9jb2RlXCJdLFxuICAgIGNvbW1pdHM6IFtcIkdFVCAvc2VhcmNoL2NvbW1pdHNcIl0sXG4gICAgaXNzdWVzQW5kUHVsbFJlcXVlc3RzOiBbXCJHRVQgL3NlYXJjaC9pc3N1ZXNcIl0sXG4gICAgbGFiZWxzOiBbXCJHRVQgL3NlYXJjaC9sYWJlbHNcIl0sXG4gICAgcmVwb3M6IFtcIkdFVCAvc2VhcmNoL3JlcG9zaXRvcmllc1wiXSxcbiAgICB0b3BpY3M6IFtcIkdFVCAvc2VhcmNoL3RvcGljc1wiXSxcbiAgICB1c2VyczogW1wiR0VUIC9zZWFyY2gvdXNlcnNcIl1cbiAgfSxcbiAgc2VjcmV0U2Nhbm5pbmc6IHtcbiAgICBnZXRBbGVydDogW1wiR0VUIC9yZXBvcy97b3duZXJ9L3tyZXBvfS9zZWNyZXQtc2Nhbm5pbmcvYWxlcnRzL3thbGVydF9udW1iZXJ9XCJdLFxuICAgIGxpc3RBbGVydHNGb3JFbnRlcnByaXNlOiBbXCJHRVQgL2VudGVycHJpc2VzL3tlbnRlcnByaXNlfS9zZWNyZXQtc2Nhbm5pbmcvYWxlcnRzXCJdLFxuICAgIGxpc3RBbGVydHNGb3JPcmc6IFtcIkdFVCAvb3Jncy97b3JnfS9zZWNyZXQtc2Nhbm5pbmcvYWxlcnRzXCJdLFxuICAgIGxpc3RBbGVydHNGb3JSZXBvOiBbXCJHRVQgL3JlcG9zL3tvd25lcn0ve3JlcG99L3NlY3JldC1zY2FubmluZy9hbGVydHNcIl0sXG4gICAgbGlzdExvY2F0aW9uc0ZvckFsZXJ0OiBbXCJHRVQgL3JlcG9zL3tvd25lcn0ve3JlcG99L3NlY3JldC1zY2FubmluZy9hbGVydHMve2FsZXJ0X251bWJlcn0vbG9jYXRpb25zXCJdLFxuICAgIHVwZGF0ZUFsZXJ0OiBbXCJQQVRDSCAvcmVwb3Mve293bmVyfS97cmVwb30vc2VjcmV0LXNjYW5uaW5nL2FsZXJ0cy97YWxlcnRfbnVtYmVyfVwiXVxuICB9LFxuICB0ZWFtczoge1xuICAgIGFkZE9yVXBkYXRlTWVtYmVyc2hpcEZvclVzZXJJbk9yZzogW1wiUFVUIC9vcmdzL3tvcmd9L3RlYW1zL3t0ZWFtX3NsdWd9L21lbWJlcnNoaXBzL3t1c2VybmFtZX1cIl0sXG4gICAgYWRkT3JVcGRhdGVQcm9qZWN0UGVybWlzc2lvbnNJbk9yZzogW1wiUFVUIC9vcmdzL3tvcmd9L3RlYW1zL3t0ZWFtX3NsdWd9L3Byb2plY3RzL3twcm9qZWN0X2lkfVwiXSxcbiAgICBhZGRPclVwZGF0ZVJlcG9QZXJtaXNzaW9uc0luT3JnOiBbXCJQVVQgL29yZ3Mve29yZ30vdGVhbXMve3RlYW1fc2x1Z30vcmVwb3Mve293bmVyfS97cmVwb31cIl0sXG4gICAgY2hlY2tQZXJtaXNzaW9uc0ZvclByb2plY3RJbk9yZzogW1wiR0VUIC9vcmdzL3tvcmd9L3RlYW1zL3t0ZWFtX3NsdWd9L3Byb2plY3RzL3twcm9qZWN0X2lkfVwiXSxcbiAgICBjaGVja1Blcm1pc3Npb25zRm9yUmVwb0luT3JnOiBbXCJHRVQgL29yZ3Mve29yZ30vdGVhbXMve3RlYW1fc2x1Z30vcmVwb3Mve293bmVyfS97cmVwb31cIl0sXG4gICAgY3JlYXRlOiBbXCJQT1NUIC9vcmdzL3tvcmd9L3RlYW1zXCJdLFxuICAgIGNyZWF0ZURpc2N1c3Npb25Db21tZW50SW5Pcmc6IFtcIlBPU1QgL29yZ3Mve29yZ30vdGVhbXMve3RlYW1fc2x1Z30vZGlzY3Vzc2lvbnMve2Rpc2N1c3Npb25fbnVtYmVyfS9jb21tZW50c1wiXSxcbiAgICBjcmVhdGVEaXNjdXNzaW9uSW5Pcmc6IFtcIlBPU1QgL29yZ3Mve29yZ30vdGVhbXMve3RlYW1fc2x1Z30vZGlzY3Vzc2lvbnNcIl0sXG4gICAgZGVsZXRlRGlzY3Vzc2lvbkNvbW1lbnRJbk9yZzogW1wiREVMRVRFIC9vcmdzL3tvcmd9L3RlYW1zL3t0ZWFtX3NsdWd9L2Rpc2N1c3Npb25zL3tkaXNjdXNzaW9uX251bWJlcn0vY29tbWVudHMve2NvbW1lbnRfbnVtYmVyfVwiXSxcbiAgICBkZWxldGVEaXNjdXNzaW9uSW5Pcmc6IFtcIkRFTEVURSAvb3Jncy97b3JnfS90ZWFtcy97dGVhbV9zbHVnfS9kaXNjdXNzaW9ucy97ZGlzY3Vzc2lvbl9udW1iZXJ9XCJdLFxuICAgIGRlbGV0ZUluT3JnOiBbXCJERUxFVEUgL29yZ3Mve29yZ30vdGVhbXMve3RlYW1fc2x1Z31cIl0sXG4gICAgZ2V0QnlOYW1lOiBbXCJHRVQgL29yZ3Mve29yZ30vdGVhbXMve3RlYW1fc2x1Z31cIl0sXG4gICAgZ2V0RGlzY3Vzc2lvbkNvbW1lbnRJbk9yZzogW1wiR0VUIC9vcmdzL3tvcmd9L3RlYW1zL3t0ZWFtX3NsdWd9L2Rpc2N1c3Npb25zL3tkaXNjdXNzaW9uX251bWJlcn0vY29tbWVudHMve2NvbW1lbnRfbnVtYmVyfVwiXSxcbiAgICBnZXREaXNjdXNzaW9uSW5Pcmc6IFtcIkdFVCAvb3Jncy97b3JnfS90ZWFtcy97dGVhbV9zbHVnfS9kaXNjdXNzaW9ucy97ZGlzY3Vzc2lvbl9udW1iZXJ9XCJdLFxuICAgIGdldE1lbWJlcnNoaXBGb3JVc2VySW5Pcmc6IFtcIkdFVCAvb3Jncy97b3JnfS90ZWFtcy97dGVhbV9zbHVnfS9tZW1iZXJzaGlwcy97dXNlcm5hbWV9XCJdLFxuICAgIGxpc3Q6IFtcIkdFVCAvb3Jncy97b3JnfS90ZWFtc1wiXSxcbiAgICBsaXN0Q2hpbGRJbk9yZzogW1wiR0VUIC9vcmdzL3tvcmd9L3RlYW1zL3t0ZWFtX3NsdWd9L3RlYW1zXCJdLFxuICAgIGxpc3REaXNjdXNzaW9uQ29tbWVudHNJbk9yZzogW1wiR0VUIC9vcmdzL3tvcmd9L3RlYW1zL3t0ZWFtX3NsdWd9L2Rpc2N1c3Npb25zL3tkaXNjdXNzaW9uX251bWJlcn0vY29tbWVudHNcIl0sXG4gICAgbGlzdERpc2N1c3Npb25zSW5Pcmc6IFtcIkdFVCAvb3Jncy97b3JnfS90ZWFtcy97dGVhbV9zbHVnfS9kaXNjdXNzaW9uc1wiXSxcbiAgICBsaXN0Rm9yQXV0aGVudGljYXRlZFVzZXI6IFtcIkdFVCAvdXNlci90ZWFtc1wiXSxcbiAgICBsaXN0TWVtYmVyc0luT3JnOiBbXCJHRVQgL29yZ3Mve29yZ30vdGVhbXMve3RlYW1fc2x1Z30vbWVtYmVyc1wiXSxcbiAgICBsaXN0UGVuZGluZ0ludml0YXRpb25zSW5Pcmc6IFtcIkdFVCAvb3Jncy97b3JnfS90ZWFtcy97dGVhbV9zbHVnfS9pbnZpdGF0aW9uc1wiXSxcbiAgICBsaXN0UHJvamVjdHNJbk9yZzogW1wiR0VUIC9vcmdzL3tvcmd9L3RlYW1zL3t0ZWFtX3NsdWd9L3Byb2plY3RzXCJdLFxuICAgIGxpc3RSZXBvc0luT3JnOiBbXCJHRVQgL29yZ3Mve29yZ30vdGVhbXMve3RlYW1fc2x1Z30vcmVwb3NcIl0sXG4gICAgcmVtb3ZlTWVtYmVyc2hpcEZvclVzZXJJbk9yZzogW1wiREVMRVRFIC9vcmdzL3tvcmd9L3RlYW1zL3t0ZWFtX3NsdWd9L21lbWJlcnNoaXBzL3t1c2VybmFtZX1cIl0sXG4gICAgcmVtb3ZlUHJvamVjdEluT3JnOiBbXCJERUxFVEUgL29yZ3Mve29yZ30vdGVhbXMve3RlYW1fc2x1Z30vcHJvamVjdHMve3Byb2plY3RfaWR9XCJdLFxuICAgIHJlbW92ZVJlcG9Jbk9yZzogW1wiREVMRVRFIC9vcmdzL3tvcmd9L3RlYW1zL3t0ZWFtX3NsdWd9L3JlcG9zL3tvd25lcn0ve3JlcG99XCJdLFxuICAgIHVwZGF0ZURpc2N1c3Npb25Db21tZW50SW5Pcmc6IFtcIlBBVENIIC9vcmdzL3tvcmd9L3RlYW1zL3t0ZWFtX3NsdWd9L2Rpc2N1c3Npb25zL3tkaXNjdXNzaW9uX251bWJlcn0vY29tbWVudHMve2NvbW1lbnRfbnVtYmVyfVwiXSxcbiAgICB1cGRhdGVEaXNjdXNzaW9uSW5Pcmc6IFtcIlBBVENIIC9vcmdzL3tvcmd9L3RlYW1zL3t0ZWFtX3NsdWd9L2Rpc2N1c3Npb25zL3tkaXNjdXNzaW9uX251bWJlcn1cIl0sXG4gICAgdXBkYXRlSW5Pcmc6IFtcIlBBVENIIC9vcmdzL3tvcmd9L3RlYW1zL3t0ZWFtX3NsdWd9XCJdXG4gIH0sXG4gIHVzZXJzOiB7XG4gICAgYWRkRW1haWxGb3JBdXRoZW50aWNhdGVkOiBbXCJQT1NUIC91c2VyL2VtYWlsc1wiLCB7fSwge1xuICAgICAgcmVuYW1lZDogW1widXNlcnNcIiwgXCJhZGRFbWFpbEZvckF1dGhlbnRpY2F0ZWRVc2VyXCJdXG4gICAgfV0sXG4gICAgYWRkRW1haWxGb3JBdXRoZW50aWNhdGVkVXNlcjogW1wiUE9TVCAvdXNlci9lbWFpbHNcIl0sXG4gICAgYmxvY2s6IFtcIlBVVCAvdXNlci9ibG9ja3Mve3VzZXJuYW1lfVwiXSxcbiAgICBjaGVja0Jsb2NrZWQ6IFtcIkdFVCAvdXNlci9ibG9ja3Mve3VzZXJuYW1lfVwiXSxcbiAgICBjaGVja0ZvbGxvd2luZ0ZvclVzZXI6IFtcIkdFVCAvdXNlcnMve3VzZXJuYW1lfS9mb2xsb3dpbmcve3RhcmdldF91c2VyfVwiXSxcbiAgICBjaGVja1BlcnNvbklzRm9sbG93ZWRCeUF1dGhlbnRpY2F0ZWQ6IFtcIkdFVCAvdXNlci9mb2xsb3dpbmcve3VzZXJuYW1lfVwiXSxcbiAgICBjcmVhdGVHcGdLZXlGb3JBdXRoZW50aWNhdGVkOiBbXCJQT1NUIC91c2VyL2dwZ19rZXlzXCIsIHt9LCB7XG4gICAgICByZW5hbWVkOiBbXCJ1c2Vyc1wiLCBcImNyZWF0ZUdwZ0tleUZvckF1dGhlbnRpY2F0ZWRVc2VyXCJdXG4gICAgfV0sXG4gICAgY3JlYXRlR3BnS2V5Rm9yQXV0aGVudGljYXRlZFVzZXI6IFtcIlBPU1QgL3VzZXIvZ3BnX2tleXNcIl0sXG4gICAgY3JlYXRlUHVibGljU3NoS2V5Rm9yQXV0aGVudGljYXRlZDogW1wiUE9TVCAvdXNlci9rZXlzXCIsIHt9LCB7XG4gICAgICByZW5hbWVkOiBbXCJ1c2Vyc1wiLCBcImNyZWF0ZVB1YmxpY1NzaEtleUZvckF1dGhlbnRpY2F0ZWRVc2VyXCJdXG4gICAgfV0sXG4gICAgY3JlYXRlUHVibGljU3NoS2V5Rm9yQXV0aGVudGljYXRlZFVzZXI6IFtcIlBPU1QgL3VzZXIva2V5c1wiXSxcbiAgICBkZWxldGVFbWFpbEZvckF1dGhlbnRpY2F0ZWQ6IFtcIkRFTEVURSAvdXNlci9lbWFpbHNcIiwge30sIHtcbiAgICAgIHJlbmFtZWQ6IFtcInVzZXJzXCIsIFwiZGVsZXRlRW1haWxGb3JBdXRoZW50aWNhdGVkVXNlclwiXVxuICAgIH1dLFxuICAgIGRlbGV0ZUVtYWlsRm9yQXV0aGVudGljYXRlZFVzZXI6IFtcIkRFTEVURSAvdXNlci9lbWFpbHNcIl0sXG4gICAgZGVsZXRlR3BnS2V5Rm9yQXV0aGVudGljYXRlZDogW1wiREVMRVRFIC91c2VyL2dwZ19rZXlzL3tncGdfa2V5X2lkfVwiLCB7fSwge1xuICAgICAgcmVuYW1lZDogW1widXNlcnNcIiwgXCJkZWxldGVHcGdLZXlGb3JBdXRoZW50aWNhdGVkVXNlclwiXVxuICAgIH1dLFxuICAgIGRlbGV0ZUdwZ0tleUZvckF1dGhlbnRpY2F0ZWRVc2VyOiBbXCJERUxFVEUgL3VzZXIvZ3BnX2tleXMve2dwZ19rZXlfaWR9XCJdLFxuICAgIGRlbGV0ZVB1YmxpY1NzaEtleUZvckF1dGhlbnRpY2F0ZWQ6IFtcIkRFTEVURSAvdXNlci9rZXlzL3trZXlfaWR9XCIsIHt9LCB7XG4gICAgICByZW5hbWVkOiBbXCJ1c2Vyc1wiLCBcImRlbGV0ZVB1YmxpY1NzaEtleUZvckF1dGhlbnRpY2F0ZWRVc2VyXCJdXG4gICAgfV0sXG4gICAgZGVsZXRlUHVibGljU3NoS2V5Rm9yQXV0aGVudGljYXRlZFVzZXI6IFtcIkRFTEVURSAvdXNlci9rZXlzL3trZXlfaWR9XCJdLFxuICAgIGZvbGxvdzogW1wiUFVUIC91c2VyL2ZvbGxvd2luZy97dXNlcm5hbWV9XCJdLFxuICAgIGdldEF1dGhlbnRpY2F0ZWQ6IFtcIkdFVCAvdXNlclwiXSxcbiAgICBnZXRCeVVzZXJuYW1lOiBbXCJHRVQgL3VzZXJzL3t1c2VybmFtZX1cIl0sXG4gICAgZ2V0Q29udGV4dEZvclVzZXI6IFtcIkdFVCAvdXNlcnMve3VzZXJuYW1lfS9ob3ZlcmNhcmRcIl0sXG4gICAgZ2V0R3BnS2V5Rm9yQXV0aGVudGljYXRlZDogW1wiR0VUIC91c2VyL2dwZ19rZXlzL3tncGdfa2V5X2lkfVwiLCB7fSwge1xuICAgICAgcmVuYW1lZDogW1widXNlcnNcIiwgXCJnZXRHcGdLZXlGb3JBdXRoZW50aWNhdGVkVXNlclwiXVxuICAgIH1dLFxuICAgIGdldEdwZ0tleUZvckF1dGhlbnRpY2F0ZWRVc2VyOiBbXCJHRVQgL3VzZXIvZ3BnX2tleXMve2dwZ19rZXlfaWR9XCJdLFxuICAgIGdldFB1YmxpY1NzaEtleUZvckF1dGhlbnRpY2F0ZWQ6IFtcIkdFVCAvdXNlci9rZXlzL3trZXlfaWR9XCIsIHt9LCB7XG4gICAgICByZW5hbWVkOiBbXCJ1c2Vyc1wiLCBcImdldFB1YmxpY1NzaEtleUZvckF1dGhlbnRpY2F0ZWRVc2VyXCJdXG4gICAgfV0sXG4gICAgZ2V0UHVibGljU3NoS2V5Rm9yQXV0aGVudGljYXRlZFVzZXI6IFtcIkdFVCAvdXNlci9rZXlzL3trZXlfaWR9XCJdLFxuICAgIGxpc3Q6IFtcIkdFVCAvdXNlcnNcIl0sXG4gICAgbGlzdEJsb2NrZWRCeUF1dGhlbnRpY2F0ZWQ6IFtcIkdFVCAvdXNlci9ibG9ja3NcIiwge30sIHtcbiAgICAgIHJlbmFtZWQ6IFtcInVzZXJzXCIsIFwibGlzdEJsb2NrZWRCeUF1dGhlbnRpY2F0ZWRVc2VyXCJdXG4gICAgfV0sXG4gICAgbGlzdEJsb2NrZWRCeUF1dGhlbnRpY2F0ZWRVc2VyOiBbXCJHRVQgL3VzZXIvYmxvY2tzXCJdLFxuICAgIGxpc3RFbWFpbHNGb3JBdXRoZW50aWNhdGVkOiBbXCJHRVQgL3VzZXIvZW1haWxzXCIsIHt9LCB7XG4gICAgICByZW5hbWVkOiBbXCJ1c2Vyc1wiLCBcImxpc3RFbWFpbHNGb3JBdXRoZW50aWNhdGVkVXNlclwiXVxuICAgIH1dLFxuICAgIGxpc3RFbWFpbHNGb3JBdXRoZW50aWNhdGVkVXNlcjogW1wiR0VUIC91c2VyL2VtYWlsc1wiXSxcbiAgICBsaXN0Rm9sbG93ZWRCeUF1dGhlbnRpY2F0ZWQ6IFtcIkdFVCAvdXNlci9mb2xsb3dpbmdcIiwge30sIHtcbiAgICAgIHJlbmFtZWQ6IFtcInVzZXJzXCIsIFwibGlzdEZvbGxvd2VkQnlBdXRoZW50aWNhdGVkVXNlclwiXVxuICAgIH1dLFxuICAgIGxpc3RGb2xsb3dlZEJ5QXV0aGVudGljYXRlZFVzZXI6IFtcIkdFVCAvdXNlci9mb2xsb3dpbmdcIl0sXG4gICAgbGlzdEZvbGxvd2Vyc0ZvckF1dGhlbnRpY2F0ZWRVc2VyOiBbXCJHRVQgL3VzZXIvZm9sbG93ZXJzXCJdLFxuICAgIGxpc3RGb2xsb3dlcnNGb3JVc2VyOiBbXCJHRVQgL3VzZXJzL3t1c2VybmFtZX0vZm9sbG93ZXJzXCJdLFxuICAgIGxpc3RGb2xsb3dpbmdGb3JVc2VyOiBbXCJHRVQgL3VzZXJzL3t1c2VybmFtZX0vZm9sbG93aW5nXCJdLFxuICAgIGxpc3RHcGdLZXlzRm9yQXV0aGVudGljYXRlZDogW1wiR0VUIC91c2VyL2dwZ19rZXlzXCIsIHt9LCB7XG4gICAgICByZW5hbWVkOiBbXCJ1c2Vyc1wiLCBcImxpc3RHcGdLZXlzRm9yQXV0aGVudGljYXRlZFVzZXJcIl1cbiAgICB9XSxcbiAgICBsaXN0R3BnS2V5c0ZvckF1dGhlbnRpY2F0ZWRVc2VyOiBbXCJHRVQgL3VzZXIvZ3BnX2tleXNcIl0sXG4gICAgbGlzdEdwZ0tleXNGb3JVc2VyOiBbXCJHRVQgL3VzZXJzL3t1c2VybmFtZX0vZ3BnX2tleXNcIl0sXG4gICAgbGlzdFB1YmxpY0VtYWlsc0ZvckF1dGhlbnRpY2F0ZWQ6IFtcIkdFVCAvdXNlci9wdWJsaWNfZW1haWxzXCIsIHt9LCB7XG4gICAgICByZW5hbWVkOiBbXCJ1c2Vyc1wiLCBcImxpc3RQdWJsaWNFbWFpbHNGb3JBdXRoZW50aWNhdGVkVXNlclwiXVxuICAgIH1dLFxuICAgIGxpc3RQdWJsaWNFbWFpbHNGb3JBdXRoZW50aWNhdGVkVXNlcjogW1wiR0VUIC91c2VyL3B1YmxpY19lbWFpbHNcIl0sXG4gICAgbGlzdFB1YmxpY0tleXNGb3JVc2VyOiBbXCJHRVQgL3VzZXJzL3t1c2VybmFtZX0va2V5c1wiXSxcbiAgICBsaXN0UHVibGljU3NoS2V5c0ZvckF1dGhlbnRpY2F0ZWQ6IFtcIkdFVCAvdXNlci9rZXlzXCIsIHt9LCB7XG4gICAgICByZW5hbWVkOiBbXCJ1c2Vyc1wiLCBcImxpc3RQdWJsaWNTc2hLZXlzRm9yQXV0aGVudGljYXRlZFVzZXJcIl1cbiAgICB9XSxcbiAgICBsaXN0UHVibGljU3NoS2V5c0ZvckF1dGhlbnRpY2F0ZWRVc2VyOiBbXCJHRVQgL3VzZXIva2V5c1wiXSxcbiAgICBzZXRQcmltYXJ5RW1haWxWaXNpYmlsaXR5Rm9yQXV0aGVudGljYXRlZDogW1wiUEFUQ0ggL3VzZXIvZW1haWwvdmlzaWJpbGl0eVwiLCB7fSwge1xuICAgICAgcmVuYW1lZDogW1widXNlcnNcIiwgXCJzZXRQcmltYXJ5RW1haWxWaXNpYmlsaXR5Rm9yQXV0aGVudGljYXRlZFVzZXJcIl1cbiAgICB9XSxcbiAgICBzZXRQcmltYXJ5RW1haWxWaXNpYmlsaXR5Rm9yQXV0aGVudGljYXRlZFVzZXI6IFtcIlBBVENIIC91c2VyL2VtYWlsL3Zpc2liaWxpdHlcIl0sXG4gICAgdW5ibG9jazogW1wiREVMRVRFIC91c2VyL2Jsb2Nrcy97dXNlcm5hbWV9XCJdLFxuICAgIHVuZm9sbG93OiBbXCJERUxFVEUgL3VzZXIvZm9sbG93aW5nL3t1c2VybmFtZX1cIl0sXG4gICAgdXBkYXRlQXV0aGVudGljYXRlZDogW1wiUEFUQ0ggL3VzZXJcIl1cbiAgfVxufTtcblxuY29uc3QgVkVSU0lPTiA9IFwiNS4xNi4yXCI7XG5cbmZ1bmN0aW9uIGVuZHBvaW50c1RvTWV0aG9kcyhvY3Rva2l0LCBlbmRwb2ludHNNYXApIHtcbiAgY29uc3QgbmV3TWV0aG9kcyA9IHt9O1xuXG4gIGZvciAoY29uc3QgW3Njb3BlLCBlbmRwb2ludHNdIG9mIE9iamVjdC5lbnRyaWVzKGVuZHBvaW50c01hcCkpIHtcbiAgICBmb3IgKGNvbnN0IFttZXRob2ROYW1lLCBlbmRwb2ludF0gb2YgT2JqZWN0LmVudHJpZXMoZW5kcG9pbnRzKSkge1xuICAgICAgY29uc3QgW3JvdXRlLCBkZWZhdWx0cywgZGVjb3JhdGlvbnNdID0gZW5kcG9pbnQ7XG4gICAgICBjb25zdCBbbWV0aG9kLCB1cmxdID0gcm91dGUuc3BsaXQoLyAvKTtcbiAgICAgIGNvbnN0IGVuZHBvaW50RGVmYXVsdHMgPSBPYmplY3QuYXNzaWduKHtcbiAgICAgICAgbWV0aG9kLFxuICAgICAgICB1cmxcbiAgICAgIH0sIGRlZmF1bHRzKTtcblxuICAgICAgaWYgKCFuZXdNZXRob2RzW3Njb3BlXSkge1xuICAgICAgICBuZXdNZXRob2RzW3Njb3BlXSA9IHt9O1xuICAgICAgfVxuXG4gICAgICBjb25zdCBzY29wZU1ldGhvZHMgPSBuZXdNZXRob2RzW3Njb3BlXTtcblxuICAgICAgaWYgKGRlY29yYXRpb25zKSB7XG4gICAgICAgIHNjb3BlTWV0aG9kc1ttZXRob2ROYW1lXSA9IGRlY29yYXRlKG9jdG9raXQsIHNjb3BlLCBtZXRob2ROYW1lLCBlbmRwb2ludERlZmF1bHRzLCBkZWNvcmF0aW9ucyk7XG4gICAgICAgIGNvbnRpbnVlO1xuICAgICAgfVxuXG4gICAgICBzY29wZU1ldGhvZHNbbWV0aG9kTmFtZV0gPSBvY3Rva2l0LnJlcXVlc3QuZGVmYXVsdHMoZW5kcG9pbnREZWZhdWx0cyk7XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIG5ld01ldGhvZHM7XG59XG5cbmZ1bmN0aW9uIGRlY29yYXRlKG9jdG9raXQsIHNjb3BlLCBtZXRob2ROYW1lLCBkZWZhdWx0cywgZGVjb3JhdGlvbnMpIHtcbiAgY29uc3QgcmVxdWVzdFdpdGhEZWZhdWx0cyA9IG9jdG9raXQucmVxdWVzdC5kZWZhdWx0cyhkZWZhdWx0cyk7XG4gIC8qIGlzdGFuYnVsIGlnbm9yZSBuZXh0ICovXG5cbiAgZnVuY3Rpb24gd2l0aERlY29yYXRpb25zKC4uLmFyZ3MpIHtcbiAgICAvLyBAdHMtaWdub3JlIGh0dHBzOi8vZ2l0aHViLmNvbS9taWNyb3NvZnQvVHlwZVNjcmlwdC9pc3N1ZXMvMjU0ODhcbiAgICBsZXQgb3B0aW9ucyA9IHJlcXVlc3RXaXRoRGVmYXVsdHMuZW5kcG9pbnQubWVyZ2UoLi4uYXJncyk7IC8vIFRoZXJlIGFyZSBjdXJyZW50bHkgbm8gb3RoZXIgZGVjb3JhdGlvbnMgdGhhbiBgLm1hcFRvRGF0YWBcblxuICAgIGlmIChkZWNvcmF0aW9ucy5tYXBUb0RhdGEpIHtcbiAgICAgIG9wdGlvbnMgPSBPYmplY3QuYXNzaWduKHt9LCBvcHRpb25zLCB7XG4gICAgICAgIGRhdGE6IG9wdGlvbnNbZGVjb3JhdGlvbnMubWFwVG9EYXRhXSxcbiAgICAgICAgW2RlY29yYXRpb25zLm1hcFRvRGF0YV06IHVuZGVmaW5lZFxuICAgICAgfSk7XG4gICAgICByZXR1cm4gcmVxdWVzdFdpdGhEZWZhdWx0cyhvcHRpb25zKTtcbiAgICB9XG5cbiAgICBpZiAoZGVjb3JhdGlvbnMucmVuYW1lZCkge1xuICAgICAgY29uc3QgW25ld1Njb3BlLCBuZXdNZXRob2ROYW1lXSA9IGRlY29yYXRpb25zLnJlbmFtZWQ7XG4gICAgICBvY3Rva2l0LmxvZy53YXJuKGBvY3Rva2l0LiR7c2NvcGV9LiR7bWV0aG9kTmFtZX0oKSBoYXMgYmVlbiByZW5hbWVkIHRvIG9jdG9raXQuJHtuZXdTY29wZX0uJHtuZXdNZXRob2ROYW1lfSgpYCk7XG4gICAgfVxuXG4gICAgaWYgKGRlY29yYXRpb25zLmRlcHJlY2F0ZWQpIHtcbiAgICAgIG9jdG9raXQubG9nLndhcm4oZGVjb3JhdGlvbnMuZGVwcmVjYXRlZCk7XG4gICAgfVxuXG4gICAgaWYgKGRlY29yYXRpb25zLnJlbmFtZWRQYXJhbWV0ZXJzKSB7XG4gICAgICAvLyBAdHMtaWdub3JlIGh0dHBzOi8vZ2l0aHViLmNvbS9taWNyb3NvZnQvVHlwZVNjcmlwdC9pc3N1ZXMvMjU0ODhcbiAgICAgIGNvbnN0IG9wdGlvbnMgPSByZXF1ZXN0V2l0aERlZmF1bHRzLmVuZHBvaW50Lm1lcmdlKC4uLmFyZ3MpO1xuXG4gICAgICBmb3IgKGNvbnN0IFtuYW1lLCBhbGlhc10gb2YgT2JqZWN0LmVudHJpZXMoZGVjb3JhdGlvbnMucmVuYW1lZFBhcmFtZXRlcnMpKSB7XG4gICAgICAgIGlmIChuYW1lIGluIG9wdGlvbnMpIHtcbiAgICAgICAgICBvY3Rva2l0LmxvZy53YXJuKGBcIiR7bmFtZX1cIiBwYXJhbWV0ZXIgaXMgZGVwcmVjYXRlZCBmb3IgXCJvY3Rva2l0LiR7c2NvcGV9LiR7bWV0aG9kTmFtZX0oKVwiLiBVc2UgXCIke2FsaWFzfVwiIGluc3RlYWRgKTtcblxuICAgICAgICAgIGlmICghKGFsaWFzIGluIG9wdGlvbnMpKSB7XG4gICAgICAgICAgICBvcHRpb25zW2FsaWFzXSA9IG9wdGlvbnNbbmFtZV07XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgZGVsZXRlIG9wdGlvbnNbbmFtZV07XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgcmV0dXJuIHJlcXVlc3RXaXRoRGVmYXVsdHMob3B0aW9ucyk7XG4gICAgfSAvLyBAdHMtaWdub3JlIGh0dHBzOi8vZ2l0aHViLmNvbS9taWNyb3NvZnQvVHlwZVNjcmlwdC9pc3N1ZXMvMjU0ODhcblxuXG4gICAgcmV0dXJuIHJlcXVlc3RXaXRoRGVmYXVsdHMoLi4uYXJncyk7XG4gIH1cblxuICByZXR1cm4gT2JqZWN0LmFzc2lnbih3aXRoRGVjb3JhdGlvbnMsIHJlcXVlc3RXaXRoRGVmYXVsdHMpO1xufVxuXG5mdW5jdGlvbiByZXN0RW5kcG9pbnRNZXRob2RzKG9jdG9raXQpIHtcbiAgY29uc3QgYXBpID0gZW5kcG9pbnRzVG9NZXRob2RzKG9jdG9raXQsIEVuZHBvaW50cyk7XG4gIHJldHVybiB7XG4gICAgcmVzdDogYXBpXG4gIH07XG59XG5yZXN0RW5kcG9pbnRNZXRob2RzLlZFUlNJT04gPSBWRVJTSU9OO1xuZnVuY3Rpb24gbGVnYWN5UmVzdEVuZHBvaW50TWV0aG9kcyhvY3Rva2l0KSB7XG4gIGNvbnN0IGFwaSA9IGVuZHBvaW50c1RvTWV0aG9kcyhvY3Rva2l0LCBFbmRwb2ludHMpO1xuICByZXR1cm4gX29iamVjdFNwcmVhZDIoX29iamVjdFNwcmVhZDIoe30sIGFwaSksIHt9LCB7XG4gICAgcmVzdDogYXBpXG4gIH0pO1xufVxubGVnYWN5UmVzdEVuZHBvaW50TWV0aG9kcy5WRVJTSU9OID0gVkVSU0lPTjtcblxuZXhwb3J0cy5sZWdhY3lSZXN0RW5kcG9pbnRNZXRob2RzID0gbGVnYWN5UmVzdEVuZHBvaW50TWV0aG9kcztcbmV4cG9ydHMucmVzdEVuZHBvaW50TWV0aG9kcyA9IHJlc3RFbmRwb2ludE1ldGhvZHM7XG4vLyMgc291cmNlTWFwcGluZ1VSTD1pbmRleC5qcy5tYXBcbiIsCiAgICAiJ3VzZSBzdHJpY3QnO1xuXG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgJ19fZXNNb2R1bGUnLCB7IHZhbHVlOiB0cnVlIH0pO1xuXG5jb25zdCBWRVJTSU9OID0gXCIyLjIxLjNcIjtcblxuZnVuY3Rpb24gb3duS2V5cyhvYmplY3QsIGVudW1lcmFibGVPbmx5KSB7XG4gIHZhciBrZXlzID0gT2JqZWN0LmtleXMob2JqZWN0KTtcblxuICBpZiAoT2JqZWN0LmdldE93blByb3BlcnR5U3ltYm9scykge1xuICAgIHZhciBzeW1ib2xzID0gT2JqZWN0LmdldE93blByb3BlcnR5U3ltYm9scyhvYmplY3QpO1xuICAgIGVudW1lcmFibGVPbmx5ICYmIChzeW1ib2xzID0gc3ltYm9scy5maWx0ZXIoZnVuY3Rpb24gKHN5bSkge1xuICAgICAgcmV0dXJuIE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3Iob2JqZWN0LCBzeW0pLmVudW1lcmFibGU7XG4gICAgfSkpLCBrZXlzLnB1c2guYXBwbHkoa2V5cywgc3ltYm9scyk7XG4gIH1cblxuICByZXR1cm4ga2V5cztcbn1cblxuZnVuY3Rpb24gX29iamVjdFNwcmVhZDIodGFyZ2V0KSB7XG4gIGZvciAodmFyIGkgPSAxOyBpIDwgYXJndW1lbnRzLmxlbmd0aDsgaSsrKSB7XG4gICAgdmFyIHNvdXJjZSA9IG51bGwgIT0gYXJndW1lbnRzW2ldID8gYXJndW1lbnRzW2ldIDoge307XG4gICAgaSAlIDIgPyBvd25LZXlzKE9iamVjdChzb3VyY2UpLCAhMCkuZm9yRWFjaChmdW5jdGlvbiAoa2V5KSB7XG4gICAgICBfZGVmaW5lUHJvcGVydHkodGFyZ2V0LCBrZXksIHNvdXJjZVtrZXldKTtcbiAgICB9KSA6IE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3JzID8gT2JqZWN0LmRlZmluZVByb3BlcnRpZXModGFyZ2V0LCBPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9ycyhzb3VyY2UpKSA6IG93bktleXMoT2JqZWN0KHNvdXJjZSkpLmZvckVhY2goZnVuY3Rpb24gKGtleSkge1xuICAgICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KHRhcmdldCwga2V5LCBPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKHNvdXJjZSwga2V5KSk7XG4gICAgfSk7XG4gIH1cblxuICByZXR1cm4gdGFyZ2V0O1xufVxuXG5mdW5jdGlvbiBfZGVmaW5lUHJvcGVydHkob2JqLCBrZXksIHZhbHVlKSB7XG4gIGlmIChrZXkgaW4gb2JqKSB7XG4gICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KG9iaiwga2V5LCB7XG4gICAgICB2YWx1ZTogdmFsdWUsXG4gICAgICBlbnVtZXJhYmxlOiB0cnVlLFxuICAgICAgY29uZmlndXJhYmxlOiB0cnVlLFxuICAgICAgd3JpdGFibGU6IHRydWVcbiAgICB9KTtcbiAgfSBlbHNlIHtcbiAgICBvYmpba2V5XSA9IHZhbHVlO1xuICB9XG5cbiAgcmV0dXJuIG9iajtcbn1cblxuLyoqXG4gKiBTb21lIOKAnGxpc3TigJ0gcmVzcG9uc2UgdGhhdCBjYW4gYmUgcGFnaW5hdGVkIGhhdmUgYSBkaWZmZXJlbnQgcmVzcG9uc2Ugc3RydWN0dXJlXG4gKlxuICogVGhleSBoYXZlIGEgYHRvdGFsX2NvdW50YCBrZXkgaW4gdGhlIHJlc3BvbnNlIChzZWFyY2ggYWxzbyBoYXMgYGluY29tcGxldGVfcmVzdWx0c2AsXG4gKiAvaW5zdGFsbGF0aW9uL3JlcG9zaXRvcmllcyBhbHNvIGhhcyBgcmVwb3NpdG9yeV9zZWxlY3Rpb25gKSwgYXMgd2VsbCBhcyBhIGtleSB3aXRoXG4gKiB0aGUgbGlzdCBvZiB0aGUgaXRlbXMgd2hpY2ggbmFtZSB2YXJpZXMgZnJvbSBlbmRwb2ludCB0byBlbmRwb2ludC5cbiAqXG4gKiBPY3Rva2l0IG5vcm1hbGl6ZXMgdGhlc2UgcmVzcG9uc2VzIHNvIHRoYXQgcGFnaW5hdGVkIHJlc3VsdHMgYXJlIGFsd2F5cyByZXR1cm5lZCBmb2xsb3dpbmdcbiAqIHRoZSBzYW1lIHN0cnVjdHVyZS4gT25lIGNoYWxsZW5nZSBpcyB0aGF0IGlmIHRoZSBsaXN0IHJlc3BvbnNlIGhhcyBvbmx5IG9uZSBwYWdlLCBubyBMaW5rXG4gKiBoZWFkZXIgaXMgcHJvdmlkZWQsIHNvIHRoaXMgaGVhZGVyIGFsb25lIGlzIG5vdCBzdWZmaWNpZW50IHRvIGNoZWNrIHdldGhlciBhIHJlc3BvbnNlIGlzXG4gKiBwYWdpbmF0ZWQgb3Igbm90LlxuICpcbiAqIFdlIGNoZWNrIGlmIGEgXCJ0b3RhbF9jb3VudFwiIGtleSBpcyBwcmVzZW50IGluIHRoZSByZXNwb25zZSBkYXRhLCBidXQgYWxzbyBtYWtlIHN1cmUgdGhhdFxuICogYSBcInVybFwiIHByb3BlcnR5IGlzIG5vdCwgYXMgdGhlIFwiR2V0IHRoZSBjb21iaW5lZCBzdGF0dXMgZm9yIGEgc3BlY2lmaWMgcmVmXCIgZW5kcG9pbnQgd291bGRcbiAqIG90aGVyd2lzZSBtYXRjaDogaHR0cHM6Ly9kZXZlbG9wZXIuZ2l0aHViLmNvbS92My9yZXBvcy9zdGF0dXNlcy8jZ2V0LXRoZS1jb21iaW5lZC1zdGF0dXMtZm9yLWEtc3BlY2lmaWMtcmVmXG4gKi9cbmZ1bmN0aW9uIG5vcm1hbGl6ZVBhZ2luYXRlZExpc3RSZXNwb25zZShyZXNwb25zZSkge1xuICAvLyBlbmRwb2ludHMgY2FuIHJlc3BvbmQgd2l0aCAyMDQgaWYgcmVwb3NpdG9yeSBpcyBlbXB0eVxuICBpZiAoIXJlc3BvbnNlLmRhdGEpIHtcbiAgICByZXR1cm4gX29iamVjdFNwcmVhZDIoX29iamVjdFNwcmVhZDIoe30sIHJlc3BvbnNlKSwge30sIHtcbiAgICAgIGRhdGE6IFtdXG4gICAgfSk7XG4gIH1cblxuICBjb25zdCByZXNwb25zZU5lZWRzTm9ybWFsaXphdGlvbiA9IFwidG90YWxfY291bnRcIiBpbiByZXNwb25zZS5kYXRhICYmICEoXCJ1cmxcIiBpbiByZXNwb25zZS5kYXRhKTtcbiAgaWYgKCFyZXNwb25zZU5lZWRzTm9ybWFsaXphdGlvbikgcmV0dXJuIHJlc3BvbnNlOyAvLyBrZWVwIHRoZSBhZGRpdGlvbmFsIHByb3BlcnRpZXMgaW50YWN0IGFzIHRoZXJlIGlzIGN1cnJlbnRseSBubyBvdGhlciB3YXlcbiAgLy8gdG8gcmV0cmlldmUgdGhlIHNhbWUgaW5mb3JtYXRpb24uXG5cbiAgY29uc3QgaW5jb21wbGV0ZVJlc3VsdHMgPSByZXNwb25zZS5kYXRhLmluY29tcGxldGVfcmVzdWx0cztcbiAgY29uc3QgcmVwb3NpdG9yeVNlbGVjdGlvbiA9IHJlc3BvbnNlLmRhdGEucmVwb3NpdG9yeV9zZWxlY3Rpb247XG4gIGNvbnN0IHRvdGFsQ291bnQgPSByZXNwb25zZS5kYXRhLnRvdGFsX2NvdW50O1xuICBkZWxldGUgcmVzcG9uc2UuZGF0YS5pbmNvbXBsZXRlX3Jlc3VsdHM7XG4gIGRlbGV0ZSByZXNwb25zZS5kYXRhLnJlcG9zaXRvcnlfc2VsZWN0aW9uO1xuICBkZWxldGUgcmVzcG9uc2UuZGF0YS50b3RhbF9jb3VudDtcbiAgY29uc3QgbmFtZXNwYWNlS2V5ID0gT2JqZWN0LmtleXMocmVzcG9uc2UuZGF0YSlbMF07XG4gIGNvbnN0IGRhdGEgPSByZXNwb25zZS5kYXRhW25hbWVzcGFjZUtleV07XG4gIHJlc3BvbnNlLmRhdGEgPSBkYXRhO1xuXG4gIGlmICh0eXBlb2YgaW5jb21wbGV0ZVJlc3VsdHMgIT09IFwidW5kZWZpbmVkXCIpIHtcbiAgICByZXNwb25zZS5kYXRhLmluY29tcGxldGVfcmVzdWx0cyA9IGluY29tcGxldGVSZXN1bHRzO1xuICB9XG5cbiAgaWYgKHR5cGVvZiByZXBvc2l0b3J5U2VsZWN0aW9uICE9PSBcInVuZGVmaW5lZFwiKSB7XG4gICAgcmVzcG9uc2UuZGF0YS5yZXBvc2l0b3J5X3NlbGVjdGlvbiA9IHJlcG9zaXRvcnlTZWxlY3Rpb247XG4gIH1cblxuICByZXNwb25zZS5kYXRhLnRvdGFsX2NvdW50ID0gdG90YWxDb3VudDtcbiAgcmV0dXJuIHJlc3BvbnNlO1xufVxuXG5mdW5jdGlvbiBpdGVyYXRvcihvY3Rva2l0LCByb3V0ZSwgcGFyYW1ldGVycykge1xuICBjb25zdCBvcHRpb25zID0gdHlwZW9mIHJvdXRlID09PSBcImZ1bmN0aW9uXCIgPyByb3V0ZS5lbmRwb2ludChwYXJhbWV0ZXJzKSA6IG9jdG9raXQucmVxdWVzdC5lbmRwb2ludChyb3V0ZSwgcGFyYW1ldGVycyk7XG4gIGNvbnN0IHJlcXVlc3RNZXRob2QgPSB0eXBlb2Ygcm91dGUgPT09IFwiZnVuY3Rpb25cIiA/IHJvdXRlIDogb2N0b2tpdC5yZXF1ZXN0O1xuICBjb25zdCBtZXRob2QgPSBvcHRpb25zLm1ldGhvZDtcbiAgY29uc3QgaGVhZGVycyA9IG9wdGlvbnMuaGVhZGVycztcbiAgbGV0IHVybCA9IG9wdGlvbnMudXJsO1xuICByZXR1cm4ge1xuICAgIFtTeW1ib2wuYXN5bmNJdGVyYXRvcl06ICgpID0+ICh7XG4gICAgICBhc3luYyBuZXh0KCkge1xuICAgICAgICBpZiAoIXVybCkgcmV0dXJuIHtcbiAgICAgICAgICBkb25lOiB0cnVlXG4gICAgICAgIH07XG5cbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICBjb25zdCByZXNwb25zZSA9IGF3YWl0IHJlcXVlc3RNZXRob2Qoe1xuICAgICAgICAgICAgbWV0aG9kLFxuICAgICAgICAgICAgdXJsLFxuICAgICAgICAgICAgaGVhZGVyc1xuICAgICAgICAgIH0pO1xuICAgICAgICAgIGNvbnN0IG5vcm1hbGl6ZWRSZXNwb25zZSA9IG5vcm1hbGl6ZVBhZ2luYXRlZExpc3RSZXNwb25zZShyZXNwb25zZSk7IC8vIGByZXNwb25zZS5oZWFkZXJzLmxpbmtgIGZvcm1hdDpcbiAgICAgICAgICAvLyAnPGh0dHBzOi8vYXBpLmdpdGh1Yi5jb20vdXNlcnMvYXNlZW1rL2ZvbGxvd2Vycz9wYWdlPTI+OyByZWw9XCJuZXh0XCIsIDxodHRwczovL2FwaS5naXRodWIuY29tL3VzZXJzL2FzZWVtay9mb2xsb3dlcnM/cGFnZT0yPjsgcmVsPVwibGFzdFwiJ1xuICAgICAgICAgIC8vIHNldHMgYHVybGAgdG8gdW5kZWZpbmVkIGlmIFwibmV4dFwiIFVSTCBpcyBub3QgcHJlc2VudCBvciBgbGlua2AgaGVhZGVyIGlzIG5vdCBzZXRcblxuICAgICAgICAgIHVybCA9ICgobm9ybWFsaXplZFJlc3BvbnNlLmhlYWRlcnMubGluayB8fCBcIlwiKS5tYXRjaCgvPChbXj5dKyk+O1xccypyZWw9XCJuZXh0XCIvKSB8fCBbXSlbMV07XG4gICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgIHZhbHVlOiBub3JtYWxpemVkUmVzcG9uc2VcbiAgICAgICAgICB9O1xuICAgICAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgICAgIGlmIChlcnJvci5zdGF0dXMgIT09IDQwOSkgdGhyb3cgZXJyb3I7XG4gICAgICAgICAgdXJsID0gXCJcIjtcbiAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgdmFsdWU6IHtcbiAgICAgICAgICAgICAgc3RhdHVzOiAyMDAsXG4gICAgICAgICAgICAgIGhlYWRlcnM6IHt9LFxuICAgICAgICAgICAgICBkYXRhOiBbXVxuICAgICAgICAgICAgfVxuICAgICAgICAgIH07XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgIH0pXG4gIH07XG59XG5cbmZ1bmN0aW9uIHBhZ2luYXRlKG9jdG9raXQsIHJvdXRlLCBwYXJhbWV0ZXJzLCBtYXBGbikge1xuICBpZiAodHlwZW9mIHBhcmFtZXRlcnMgPT09IFwiZnVuY3Rpb25cIikge1xuICAgIG1hcEZuID0gcGFyYW1ldGVycztcbiAgICBwYXJhbWV0ZXJzID0gdW5kZWZpbmVkO1xuICB9XG5cbiAgcmV0dXJuIGdhdGhlcihvY3Rva2l0LCBbXSwgaXRlcmF0b3Iob2N0b2tpdCwgcm91dGUsIHBhcmFtZXRlcnMpW1N5bWJvbC5hc3luY0l0ZXJhdG9yXSgpLCBtYXBGbik7XG59XG5cbmZ1bmN0aW9uIGdhdGhlcihvY3Rva2l0LCByZXN1bHRzLCBpdGVyYXRvciwgbWFwRm4pIHtcbiAgcmV0dXJuIGl0ZXJhdG9yLm5leHQoKS50aGVuKHJlc3VsdCA9PiB7XG4gICAgaWYgKHJlc3VsdC5kb25lKSB7XG4gICAgICByZXR1cm4gcmVzdWx0cztcbiAgICB9XG5cbiAgICBsZXQgZWFybHlFeGl0ID0gZmFsc2U7XG5cbiAgICBmdW5jdGlvbiBkb25lKCkge1xuICAgICAgZWFybHlFeGl0ID0gdHJ1ZTtcbiAgICB9XG5cbiAgICByZXN1bHRzID0gcmVzdWx0cy5jb25jYXQobWFwRm4gPyBtYXBGbihyZXN1bHQudmFsdWUsIGRvbmUpIDogcmVzdWx0LnZhbHVlLmRhdGEpO1xuXG4gICAgaWYgKGVhcmx5RXhpdCkge1xuICAgICAgcmV0dXJuIHJlc3VsdHM7XG4gICAgfVxuXG4gICAgcmV0dXJuIGdhdGhlcihvY3Rva2l0LCByZXN1bHRzLCBpdGVyYXRvciwgbWFwRm4pO1xuICB9KTtcbn1cblxuY29uc3QgY29tcG9zZVBhZ2luYXRlUmVzdCA9IE9iamVjdC5hc3NpZ24ocGFnaW5hdGUsIHtcbiAgaXRlcmF0b3Jcbn0pO1xuXG5jb25zdCBwYWdpbmF0aW5nRW5kcG9pbnRzID0gW1wiR0VUIC9hcHAvaG9vay9kZWxpdmVyaWVzXCIsIFwiR0VUIC9hcHAvaW5zdGFsbGF0aW9uc1wiLCBcIkdFVCAvYXBwbGljYXRpb25zL2dyYW50c1wiLCBcIkdFVCAvYXV0aG9yaXphdGlvbnNcIiwgXCJHRVQgL2VudGVycHJpc2VzL3tlbnRlcnByaXNlfS9hY3Rpb25zL3Blcm1pc3Npb25zL29yZ2FuaXphdGlvbnNcIiwgXCJHRVQgL2VudGVycHJpc2VzL3tlbnRlcnByaXNlfS9hY3Rpb25zL3J1bm5lci1ncm91cHNcIiwgXCJHRVQgL2VudGVycHJpc2VzL3tlbnRlcnByaXNlfS9hY3Rpb25zL3J1bm5lci1ncm91cHMve3J1bm5lcl9ncm91cF9pZH0vb3JnYW5pemF0aW9uc1wiLCBcIkdFVCAvZW50ZXJwcmlzZXMve2VudGVycHJpc2V9L2FjdGlvbnMvcnVubmVyLWdyb3Vwcy97cnVubmVyX2dyb3VwX2lkfS9ydW5uZXJzXCIsIFwiR0VUIC9lbnRlcnByaXNlcy97ZW50ZXJwcmlzZX0vYWN0aW9ucy9ydW5uZXJzXCIsIFwiR0VUIC9lbnRlcnByaXNlcy97ZW50ZXJwcmlzZX0vYXVkaXQtbG9nXCIsIFwiR0VUIC9lbnRlcnByaXNlcy97ZW50ZXJwcmlzZX0vc2VjcmV0LXNjYW5uaW5nL2FsZXJ0c1wiLCBcIkdFVCAvZW50ZXJwcmlzZXMve2VudGVycHJpc2V9L3NldHRpbmdzL2JpbGxpbmcvYWR2YW5jZWQtc2VjdXJpdHlcIiwgXCJHRVQgL2V2ZW50c1wiLCBcIkdFVCAvZ2lzdHNcIiwgXCJHRVQgL2dpc3RzL3B1YmxpY1wiLCBcIkdFVCAvZ2lzdHMvc3RhcnJlZFwiLCBcIkdFVCAvZ2lzdHMve2dpc3RfaWR9L2NvbW1lbnRzXCIsIFwiR0VUIC9naXN0cy97Z2lzdF9pZH0vY29tbWl0c1wiLCBcIkdFVCAvZ2lzdHMve2dpc3RfaWR9L2ZvcmtzXCIsIFwiR0VUIC9pbnN0YWxsYXRpb24vcmVwb3NpdG9yaWVzXCIsIFwiR0VUIC9pc3N1ZXNcIiwgXCJHRVQgL2xpY2Vuc2VzXCIsIFwiR0VUIC9tYXJrZXRwbGFjZV9saXN0aW5nL3BsYW5zXCIsIFwiR0VUIC9tYXJrZXRwbGFjZV9saXN0aW5nL3BsYW5zL3twbGFuX2lkfS9hY2NvdW50c1wiLCBcIkdFVCAvbWFya2V0cGxhY2VfbGlzdGluZy9zdHViYmVkL3BsYW5zXCIsIFwiR0VUIC9tYXJrZXRwbGFjZV9saXN0aW5nL3N0dWJiZWQvcGxhbnMve3BsYW5faWR9L2FjY291bnRzXCIsIFwiR0VUIC9uZXR3b3Jrcy97b3duZXJ9L3tyZXBvfS9ldmVudHNcIiwgXCJHRVQgL25vdGlmaWNhdGlvbnNcIiwgXCJHRVQgL29yZ2FuaXphdGlvbnNcIiwgXCJHRVQgL29yZ3Mve29yZ30vYWN0aW9ucy9jYWNoZS91c2FnZS1ieS1yZXBvc2l0b3J5XCIsIFwiR0VUIC9vcmdzL3tvcmd9L2FjdGlvbnMvcGVybWlzc2lvbnMvcmVwb3NpdG9yaWVzXCIsIFwiR0VUIC9vcmdzL3tvcmd9L2FjdGlvbnMvcnVubmVyLWdyb3Vwc1wiLCBcIkdFVCAvb3Jncy97b3JnfS9hY3Rpb25zL3J1bm5lci1ncm91cHMve3J1bm5lcl9ncm91cF9pZH0vcmVwb3NpdG9yaWVzXCIsIFwiR0VUIC9vcmdzL3tvcmd9L2FjdGlvbnMvcnVubmVyLWdyb3Vwcy97cnVubmVyX2dyb3VwX2lkfS9ydW5uZXJzXCIsIFwiR0VUIC9vcmdzL3tvcmd9L2FjdGlvbnMvcnVubmVyc1wiLCBcIkdFVCAvb3Jncy97b3JnfS9hY3Rpb25zL3NlY3JldHNcIiwgXCJHRVQgL29yZ3Mve29yZ30vYWN0aW9ucy9zZWNyZXRzL3tzZWNyZXRfbmFtZX0vcmVwb3NpdG9yaWVzXCIsIFwiR0VUIC9vcmdzL3tvcmd9L2F1ZGl0LWxvZ1wiLCBcIkdFVCAvb3Jncy97b3JnfS9ibG9ja3NcIiwgXCJHRVQgL29yZ3Mve29yZ30vY29kZS1zY2FubmluZy9hbGVydHNcIiwgXCJHRVQgL29yZ3Mve29yZ30vY29kZXNwYWNlc1wiLCBcIkdFVCAvb3Jncy97b3JnfS9jcmVkZW50aWFsLWF1dGhvcml6YXRpb25zXCIsIFwiR0VUIC9vcmdzL3tvcmd9L2RlcGVuZGFib3Qvc2VjcmV0c1wiLCBcIkdFVCAvb3Jncy97b3JnfS9kZXBlbmRhYm90L3NlY3JldHMve3NlY3JldF9uYW1lfS9yZXBvc2l0b3JpZXNcIiwgXCJHRVQgL29yZ3Mve29yZ30vZXZlbnRzXCIsIFwiR0VUIC9vcmdzL3tvcmd9L2V4dGVybmFsLWdyb3Vwc1wiLCBcIkdFVCAvb3Jncy97b3JnfS9mYWlsZWRfaW52aXRhdGlvbnNcIiwgXCJHRVQgL29yZ3Mve29yZ30vaG9va3NcIiwgXCJHRVQgL29yZ3Mve29yZ30vaG9va3Mve2hvb2tfaWR9L2RlbGl2ZXJpZXNcIiwgXCJHRVQgL29yZ3Mve29yZ30vaW5zdGFsbGF0aW9uc1wiLCBcIkdFVCAvb3Jncy97b3JnfS9pbnZpdGF0aW9uc1wiLCBcIkdFVCAvb3Jncy97b3JnfS9pbnZpdGF0aW9ucy97aW52aXRhdGlvbl9pZH0vdGVhbXNcIiwgXCJHRVQgL29yZ3Mve29yZ30vaXNzdWVzXCIsIFwiR0VUIC9vcmdzL3tvcmd9L21lbWJlcnNcIiwgXCJHRVQgL29yZ3Mve29yZ30vbWlncmF0aW9uc1wiLCBcIkdFVCAvb3Jncy97b3JnfS9taWdyYXRpb25zL3ttaWdyYXRpb25faWR9L3JlcG9zaXRvcmllc1wiLCBcIkdFVCAvb3Jncy97b3JnfS9vdXRzaWRlX2NvbGxhYm9yYXRvcnNcIiwgXCJHRVQgL29yZ3Mve29yZ30vcGFja2FnZXNcIiwgXCJHRVQgL29yZ3Mve29yZ30vcGFja2FnZXMve3BhY2thZ2VfdHlwZX0ve3BhY2thZ2VfbmFtZX0vdmVyc2lvbnNcIiwgXCJHRVQgL29yZ3Mve29yZ30vcHJvamVjdHNcIiwgXCJHRVQgL29yZ3Mve29yZ30vcHVibGljX21lbWJlcnNcIiwgXCJHRVQgL29yZ3Mve29yZ30vcmVwb3NcIiwgXCJHRVQgL29yZ3Mve29yZ30vc2VjcmV0LXNjYW5uaW5nL2FsZXJ0c1wiLCBcIkdFVCAvb3Jncy97b3JnfS9zZXR0aW5ncy9iaWxsaW5nL2FkdmFuY2VkLXNlY3VyaXR5XCIsIFwiR0VUIC9vcmdzL3tvcmd9L3RlYW0tc3luYy9ncm91cHNcIiwgXCJHRVQgL29yZ3Mve29yZ30vdGVhbXNcIiwgXCJHRVQgL29yZ3Mve29yZ30vdGVhbXMve3RlYW1fc2x1Z30vZGlzY3Vzc2lvbnNcIiwgXCJHRVQgL29yZ3Mve29yZ30vdGVhbXMve3RlYW1fc2x1Z30vZGlzY3Vzc2lvbnMve2Rpc2N1c3Npb25fbnVtYmVyfS9jb21tZW50c1wiLCBcIkdFVCAvb3Jncy97b3JnfS90ZWFtcy97dGVhbV9zbHVnfS9kaXNjdXNzaW9ucy97ZGlzY3Vzc2lvbl9udW1iZXJ9L2NvbW1lbnRzL3tjb21tZW50X251bWJlcn0vcmVhY3Rpb25zXCIsIFwiR0VUIC9vcmdzL3tvcmd9L3RlYW1zL3t0ZWFtX3NsdWd9L2Rpc2N1c3Npb25zL3tkaXNjdXNzaW9uX251bWJlcn0vcmVhY3Rpb25zXCIsIFwiR0VUIC9vcmdzL3tvcmd9L3RlYW1zL3t0ZWFtX3NsdWd9L2ludml0YXRpb25zXCIsIFwiR0VUIC9vcmdzL3tvcmd9L3RlYW1zL3t0ZWFtX3NsdWd9L21lbWJlcnNcIiwgXCJHRVQgL29yZ3Mve29yZ30vdGVhbXMve3RlYW1fc2x1Z30vcHJvamVjdHNcIiwgXCJHRVQgL29yZ3Mve29yZ30vdGVhbXMve3RlYW1fc2x1Z30vcmVwb3NcIiwgXCJHRVQgL29yZ3Mve29yZ30vdGVhbXMve3RlYW1fc2x1Z30vdGVhbXNcIiwgXCJHRVQgL3Byb2plY3RzL2NvbHVtbnMve2NvbHVtbl9pZH0vY2FyZHNcIiwgXCJHRVQgL3Byb2plY3RzL3twcm9qZWN0X2lkfS9jb2xsYWJvcmF0b3JzXCIsIFwiR0VUIC9wcm9qZWN0cy97cHJvamVjdF9pZH0vY29sdW1uc1wiLCBcIkdFVCAvcmVwb3Mve293bmVyfS97cmVwb30vYWN0aW9ucy9hcnRpZmFjdHNcIiwgXCJHRVQgL3JlcG9zL3tvd25lcn0ve3JlcG99L2FjdGlvbnMvY2FjaGVzXCIsIFwiR0VUIC9yZXBvcy97b3duZXJ9L3tyZXBvfS9hY3Rpb25zL3J1bm5lcnNcIiwgXCJHRVQgL3JlcG9zL3tvd25lcn0ve3JlcG99L2FjdGlvbnMvcnVuc1wiLCBcIkdFVCAvcmVwb3Mve293bmVyfS97cmVwb30vYWN0aW9ucy9ydW5zL3tydW5faWR9L2FydGlmYWN0c1wiLCBcIkdFVCAvcmVwb3Mve293bmVyfS97cmVwb30vYWN0aW9ucy9ydW5zL3tydW5faWR9L2F0dGVtcHRzL3thdHRlbXB0X251bWJlcn0vam9ic1wiLCBcIkdFVCAvcmVwb3Mve293bmVyfS97cmVwb30vYWN0aW9ucy9ydW5zL3tydW5faWR9L2pvYnNcIiwgXCJHRVQgL3JlcG9zL3tvd25lcn0ve3JlcG99L2FjdGlvbnMvc2VjcmV0c1wiLCBcIkdFVCAvcmVwb3Mve293bmVyfS97cmVwb30vYWN0aW9ucy93b3JrZmxvd3NcIiwgXCJHRVQgL3JlcG9zL3tvd25lcn0ve3JlcG99L2FjdGlvbnMvd29ya2Zsb3dzL3t3b3JrZmxvd19pZH0vcnVuc1wiLCBcIkdFVCAvcmVwb3Mve293bmVyfS97cmVwb30vYXNzaWduZWVzXCIsIFwiR0VUIC9yZXBvcy97b3duZXJ9L3tyZXBvfS9icmFuY2hlc1wiLCBcIkdFVCAvcmVwb3Mve293bmVyfS97cmVwb30vY2hlY2stcnVucy97Y2hlY2tfcnVuX2lkfS9hbm5vdGF0aW9uc1wiLCBcIkdFVCAvcmVwb3Mve293bmVyfS97cmVwb30vY2hlY2stc3VpdGVzL3tjaGVja19zdWl0ZV9pZH0vY2hlY2stcnVuc1wiLCBcIkdFVCAvcmVwb3Mve293bmVyfS97cmVwb30vY29kZS1zY2FubmluZy9hbGVydHNcIiwgXCJHRVQgL3JlcG9zL3tvd25lcn0ve3JlcG99L2NvZGUtc2Nhbm5pbmcvYWxlcnRzL3thbGVydF9udW1iZXJ9L2luc3RhbmNlc1wiLCBcIkdFVCAvcmVwb3Mve293bmVyfS97cmVwb30vY29kZS1zY2FubmluZy9hbmFseXNlc1wiLCBcIkdFVCAvcmVwb3Mve293bmVyfS97cmVwb30vY29kZXNwYWNlc1wiLCBcIkdFVCAvcmVwb3Mve293bmVyfS97cmVwb30vY29kZXNwYWNlcy9kZXZjb250YWluZXJzXCIsIFwiR0VUIC9yZXBvcy97b3duZXJ9L3tyZXBvfS9jb2Rlc3BhY2VzL3NlY3JldHNcIiwgXCJHRVQgL3JlcG9zL3tvd25lcn0ve3JlcG99L2NvbGxhYm9yYXRvcnNcIiwgXCJHRVQgL3JlcG9zL3tvd25lcn0ve3JlcG99L2NvbW1lbnRzXCIsIFwiR0VUIC9yZXBvcy97b3duZXJ9L3tyZXBvfS9jb21tZW50cy97Y29tbWVudF9pZH0vcmVhY3Rpb25zXCIsIFwiR0VUIC9yZXBvcy97b3duZXJ9L3tyZXBvfS9jb21taXRzXCIsIFwiR0VUIC9yZXBvcy97b3duZXJ9L3tyZXBvfS9jb21taXRzL3tjb21taXRfc2hhfS9jb21tZW50c1wiLCBcIkdFVCAvcmVwb3Mve293bmVyfS97cmVwb30vY29tbWl0cy97Y29tbWl0X3NoYX0vcHVsbHNcIiwgXCJHRVQgL3JlcG9zL3tvd25lcn0ve3JlcG99L2NvbW1pdHMve3JlZn0vY2hlY2stcnVuc1wiLCBcIkdFVCAvcmVwb3Mve293bmVyfS97cmVwb30vY29tbWl0cy97cmVmfS9jaGVjay1zdWl0ZXNcIiwgXCJHRVQgL3JlcG9zL3tvd25lcn0ve3JlcG99L2NvbW1pdHMve3JlZn0vc3RhdHVzXCIsIFwiR0VUIC9yZXBvcy97b3duZXJ9L3tyZXBvfS9jb21taXRzL3tyZWZ9L3N0YXR1c2VzXCIsIFwiR0VUIC9yZXBvcy97b3duZXJ9L3tyZXBvfS9jb250cmlidXRvcnNcIiwgXCJHRVQgL3JlcG9zL3tvd25lcn0ve3JlcG99L2RlcGVuZGFib3Qvc2VjcmV0c1wiLCBcIkdFVCAvcmVwb3Mve293bmVyfS97cmVwb30vZGVwbG95bWVudHNcIiwgXCJHRVQgL3JlcG9zL3tvd25lcn0ve3JlcG99L2RlcGxveW1lbnRzL3tkZXBsb3ltZW50X2lkfS9zdGF0dXNlc1wiLCBcIkdFVCAvcmVwb3Mve293bmVyfS97cmVwb30vZW52aXJvbm1lbnRzXCIsIFwiR0VUIC9yZXBvcy97b3duZXJ9L3tyZXBvfS9ldmVudHNcIiwgXCJHRVQgL3JlcG9zL3tvd25lcn0ve3JlcG99L2ZvcmtzXCIsIFwiR0VUIC9yZXBvcy97b3duZXJ9L3tyZXBvfS9naXQvbWF0Y2hpbmctcmVmcy97cmVmfVwiLCBcIkdFVCAvcmVwb3Mve293bmVyfS97cmVwb30vaG9va3NcIiwgXCJHRVQgL3JlcG9zL3tvd25lcn0ve3JlcG99L2hvb2tzL3tob29rX2lkfS9kZWxpdmVyaWVzXCIsIFwiR0VUIC9yZXBvcy97b3duZXJ9L3tyZXBvfS9pbnZpdGF0aW9uc1wiLCBcIkdFVCAvcmVwb3Mve293bmVyfS97cmVwb30vaXNzdWVzXCIsIFwiR0VUIC9yZXBvcy97b3duZXJ9L3tyZXBvfS9pc3N1ZXMvY29tbWVudHNcIiwgXCJHRVQgL3JlcG9zL3tvd25lcn0ve3JlcG99L2lzc3Vlcy9jb21tZW50cy97Y29tbWVudF9pZH0vcmVhY3Rpb25zXCIsIFwiR0VUIC9yZXBvcy97b3duZXJ9L3tyZXBvfS9pc3N1ZXMvZXZlbnRzXCIsIFwiR0VUIC9yZXBvcy97b3duZXJ9L3tyZXBvfS9pc3N1ZXMve2lzc3VlX251bWJlcn0vY29tbWVudHNcIiwgXCJHRVQgL3JlcG9zL3tvd25lcn0ve3JlcG99L2lzc3Vlcy97aXNzdWVfbnVtYmVyfS9ldmVudHNcIiwgXCJHRVQgL3JlcG9zL3tvd25lcn0ve3JlcG99L2lzc3Vlcy97aXNzdWVfbnVtYmVyfS9sYWJlbHNcIiwgXCJHRVQgL3JlcG9zL3tvd25lcn0ve3JlcG99L2lzc3Vlcy97aXNzdWVfbnVtYmVyfS9yZWFjdGlvbnNcIiwgXCJHRVQgL3JlcG9zL3tvd25lcn0ve3JlcG99L2lzc3Vlcy97aXNzdWVfbnVtYmVyfS90aW1lbGluZVwiLCBcIkdFVCAvcmVwb3Mve293bmVyfS97cmVwb30va2V5c1wiLCBcIkdFVCAvcmVwb3Mve293bmVyfS97cmVwb30vbGFiZWxzXCIsIFwiR0VUIC9yZXBvcy97b3duZXJ9L3tyZXBvfS9taWxlc3RvbmVzXCIsIFwiR0VUIC9yZXBvcy97b3duZXJ9L3tyZXBvfS9taWxlc3RvbmVzL3ttaWxlc3RvbmVfbnVtYmVyfS9sYWJlbHNcIiwgXCJHRVQgL3JlcG9zL3tvd25lcn0ve3JlcG99L25vdGlmaWNhdGlvbnNcIiwgXCJHRVQgL3JlcG9zL3tvd25lcn0ve3JlcG99L3BhZ2VzL2J1aWxkc1wiLCBcIkdFVCAvcmVwb3Mve293bmVyfS97cmVwb30vcHJvamVjdHNcIiwgXCJHRVQgL3JlcG9zL3tvd25lcn0ve3JlcG99L3B1bGxzXCIsIFwiR0VUIC9yZXBvcy97b3duZXJ9L3tyZXBvfS9wdWxscy9jb21tZW50c1wiLCBcIkdFVCAvcmVwb3Mve293bmVyfS97cmVwb30vcHVsbHMvY29tbWVudHMve2NvbW1lbnRfaWR9L3JlYWN0aW9uc1wiLCBcIkdFVCAvcmVwb3Mve293bmVyfS97cmVwb30vcHVsbHMve3B1bGxfbnVtYmVyfS9jb21tZW50c1wiLCBcIkdFVCAvcmVwb3Mve293bmVyfS97cmVwb30vcHVsbHMve3B1bGxfbnVtYmVyfS9jb21taXRzXCIsIFwiR0VUIC9yZXBvcy97b3duZXJ9L3tyZXBvfS9wdWxscy97cHVsbF9udW1iZXJ9L2ZpbGVzXCIsIFwiR0VUIC9yZXBvcy97b3duZXJ9L3tyZXBvfS9wdWxscy97cHVsbF9udW1iZXJ9L3JlcXVlc3RlZF9yZXZpZXdlcnNcIiwgXCJHRVQgL3JlcG9zL3tvd25lcn0ve3JlcG99L3B1bGxzL3twdWxsX251bWJlcn0vcmV2aWV3c1wiLCBcIkdFVCAvcmVwb3Mve293bmVyfS97cmVwb30vcHVsbHMve3B1bGxfbnVtYmVyfS9yZXZpZXdzL3tyZXZpZXdfaWR9L2NvbW1lbnRzXCIsIFwiR0VUIC9yZXBvcy97b3duZXJ9L3tyZXBvfS9yZWxlYXNlc1wiLCBcIkdFVCAvcmVwb3Mve293bmVyfS97cmVwb30vcmVsZWFzZXMve3JlbGVhc2VfaWR9L2Fzc2V0c1wiLCBcIkdFVCAvcmVwb3Mve293bmVyfS97cmVwb30vcmVsZWFzZXMve3JlbGVhc2VfaWR9L3JlYWN0aW9uc1wiLCBcIkdFVCAvcmVwb3Mve293bmVyfS97cmVwb30vc2VjcmV0LXNjYW5uaW5nL2FsZXJ0c1wiLCBcIkdFVCAvcmVwb3Mve293bmVyfS97cmVwb30vc2VjcmV0LXNjYW5uaW5nL2FsZXJ0cy97YWxlcnRfbnVtYmVyfS9sb2NhdGlvbnNcIiwgXCJHRVQgL3JlcG9zL3tvd25lcn0ve3JlcG99L3N0YXJnYXplcnNcIiwgXCJHRVQgL3JlcG9zL3tvd25lcn0ve3JlcG99L3N1YnNjcmliZXJzXCIsIFwiR0VUIC9yZXBvcy97b3duZXJ9L3tyZXBvfS90YWdzXCIsIFwiR0VUIC9yZXBvcy97b3duZXJ9L3tyZXBvfS90ZWFtc1wiLCBcIkdFVCAvcmVwb3Mve293bmVyfS97cmVwb30vdG9waWNzXCIsIFwiR0VUIC9yZXBvc2l0b3JpZXNcIiwgXCJHRVQgL3JlcG9zaXRvcmllcy97cmVwb3NpdG9yeV9pZH0vZW52aXJvbm1lbnRzL3tlbnZpcm9ubWVudF9uYW1lfS9zZWNyZXRzXCIsIFwiR0VUIC9zZWFyY2gvY29kZVwiLCBcIkdFVCAvc2VhcmNoL2NvbW1pdHNcIiwgXCJHRVQgL3NlYXJjaC9pc3N1ZXNcIiwgXCJHRVQgL3NlYXJjaC9sYWJlbHNcIiwgXCJHRVQgL3NlYXJjaC9yZXBvc2l0b3JpZXNcIiwgXCJHRVQgL3NlYXJjaC90b3BpY3NcIiwgXCJHRVQgL3NlYXJjaC91c2Vyc1wiLCBcIkdFVCAvdGVhbXMve3RlYW1faWR9L2Rpc2N1c3Npb25zXCIsIFwiR0VUIC90ZWFtcy97dGVhbV9pZH0vZGlzY3Vzc2lvbnMve2Rpc2N1c3Npb25fbnVtYmVyfS9jb21tZW50c1wiLCBcIkdFVCAvdGVhbXMve3RlYW1faWR9L2Rpc2N1c3Npb25zL3tkaXNjdXNzaW9uX251bWJlcn0vY29tbWVudHMve2NvbW1lbnRfbnVtYmVyfS9yZWFjdGlvbnNcIiwgXCJHRVQgL3RlYW1zL3t0ZWFtX2lkfS9kaXNjdXNzaW9ucy97ZGlzY3Vzc2lvbl9udW1iZXJ9L3JlYWN0aW9uc1wiLCBcIkdFVCAvdGVhbXMve3RlYW1faWR9L2ludml0YXRpb25zXCIsIFwiR0VUIC90ZWFtcy97dGVhbV9pZH0vbWVtYmVyc1wiLCBcIkdFVCAvdGVhbXMve3RlYW1faWR9L3Byb2plY3RzXCIsIFwiR0VUIC90ZWFtcy97dGVhbV9pZH0vcmVwb3NcIiwgXCJHRVQgL3RlYW1zL3t0ZWFtX2lkfS90ZWFtc1wiLCBcIkdFVCAvdXNlci9ibG9ja3NcIiwgXCJHRVQgL3VzZXIvY29kZXNwYWNlc1wiLCBcIkdFVCAvdXNlci9jb2Rlc3BhY2VzL3NlY3JldHNcIiwgXCJHRVQgL3VzZXIvZW1haWxzXCIsIFwiR0VUIC91c2VyL2ZvbGxvd2Vyc1wiLCBcIkdFVCAvdXNlci9mb2xsb3dpbmdcIiwgXCJHRVQgL3VzZXIvZ3BnX2tleXNcIiwgXCJHRVQgL3VzZXIvaW5zdGFsbGF0aW9uc1wiLCBcIkdFVCAvdXNlci9pbnN0YWxsYXRpb25zL3tpbnN0YWxsYXRpb25faWR9L3JlcG9zaXRvcmllc1wiLCBcIkdFVCAvdXNlci9pc3N1ZXNcIiwgXCJHRVQgL3VzZXIva2V5c1wiLCBcIkdFVCAvdXNlci9tYXJrZXRwbGFjZV9wdXJjaGFzZXNcIiwgXCJHRVQgL3VzZXIvbWFya2V0cGxhY2VfcHVyY2hhc2VzL3N0dWJiZWRcIiwgXCJHRVQgL3VzZXIvbWVtYmVyc2hpcHMvb3Jnc1wiLCBcIkdFVCAvdXNlci9taWdyYXRpb25zXCIsIFwiR0VUIC91c2VyL21pZ3JhdGlvbnMve21pZ3JhdGlvbl9pZH0vcmVwb3NpdG9yaWVzXCIsIFwiR0VUIC91c2VyL29yZ3NcIiwgXCJHRVQgL3VzZXIvcGFja2FnZXNcIiwgXCJHRVQgL3VzZXIvcGFja2FnZXMve3BhY2thZ2VfdHlwZX0ve3BhY2thZ2VfbmFtZX0vdmVyc2lvbnNcIiwgXCJHRVQgL3VzZXIvcHVibGljX2VtYWlsc1wiLCBcIkdFVCAvdXNlci9yZXBvc1wiLCBcIkdFVCAvdXNlci9yZXBvc2l0b3J5X2ludml0YXRpb25zXCIsIFwiR0VUIC91c2VyL3N0YXJyZWRcIiwgXCJHRVQgL3VzZXIvc3Vic2NyaXB0aW9uc1wiLCBcIkdFVCAvdXNlci90ZWFtc1wiLCBcIkdFVCAvdXNlcnNcIiwgXCJHRVQgL3VzZXJzL3t1c2VybmFtZX0vZXZlbnRzXCIsIFwiR0VUIC91c2Vycy97dXNlcm5hbWV9L2V2ZW50cy9vcmdzL3tvcmd9XCIsIFwiR0VUIC91c2Vycy97dXNlcm5hbWV9L2V2ZW50cy9wdWJsaWNcIiwgXCJHRVQgL3VzZXJzL3t1c2VybmFtZX0vZm9sbG93ZXJzXCIsIFwiR0VUIC91c2Vycy97dXNlcm5hbWV9L2ZvbGxvd2luZ1wiLCBcIkdFVCAvdXNlcnMve3VzZXJuYW1lfS9naXN0c1wiLCBcIkdFVCAvdXNlcnMve3VzZXJuYW1lfS9ncGdfa2V5c1wiLCBcIkdFVCAvdXNlcnMve3VzZXJuYW1lfS9rZXlzXCIsIFwiR0VUIC91c2Vycy97dXNlcm5hbWV9L29yZ3NcIiwgXCJHRVQgL3VzZXJzL3t1c2VybmFtZX0vcGFja2FnZXNcIiwgXCJHRVQgL3VzZXJzL3t1c2VybmFtZX0vcHJvamVjdHNcIiwgXCJHRVQgL3VzZXJzL3t1c2VybmFtZX0vcmVjZWl2ZWRfZXZlbnRzXCIsIFwiR0VUIC91c2Vycy97dXNlcm5hbWV9L3JlY2VpdmVkX2V2ZW50cy9wdWJsaWNcIiwgXCJHRVQgL3VzZXJzL3t1c2VybmFtZX0vcmVwb3NcIiwgXCJHRVQgL3VzZXJzL3t1c2VybmFtZX0vc3RhcnJlZFwiLCBcIkdFVCAvdXNlcnMve3VzZXJuYW1lfS9zdWJzY3JpcHRpb25zXCJdO1xuXG5mdW5jdGlvbiBpc1BhZ2luYXRpbmdFbmRwb2ludChhcmcpIHtcbiAgaWYgKHR5cGVvZiBhcmcgPT09IFwic3RyaW5nXCIpIHtcbiAgICByZXR1cm4gcGFnaW5hdGluZ0VuZHBvaW50cy5pbmNsdWRlcyhhcmcpO1xuICB9IGVsc2Uge1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxufVxuXG4vKipcbiAqIEBwYXJhbSBvY3Rva2l0IE9jdG9raXQgaW5zdGFuY2VcbiAqIEBwYXJhbSBvcHRpb25zIE9wdGlvbnMgcGFzc2VkIHRvIE9jdG9raXQgY29uc3RydWN0b3JcbiAqL1xuXG5mdW5jdGlvbiBwYWdpbmF0ZVJlc3Qob2N0b2tpdCkge1xuICByZXR1cm4ge1xuICAgIHBhZ2luYXRlOiBPYmplY3QuYXNzaWduKHBhZ2luYXRlLmJpbmQobnVsbCwgb2N0b2tpdCksIHtcbiAgICAgIGl0ZXJhdG9yOiBpdGVyYXRvci5iaW5kKG51bGwsIG9jdG9raXQpXG4gICAgfSlcbiAgfTtcbn1cbnBhZ2luYXRlUmVzdC5WRVJTSU9OID0gVkVSU0lPTjtcblxuZXhwb3J0cy5jb21wb3NlUGFnaW5hdGVSZXN0ID0gY29tcG9zZVBhZ2luYXRlUmVzdDtcbmV4cG9ydHMuaXNQYWdpbmF0aW5nRW5kcG9pbnQgPSBpc1BhZ2luYXRpbmdFbmRwb2ludDtcbmV4cG9ydHMucGFnaW5hdGVSZXN0ID0gcGFnaW5hdGVSZXN0O1xuZXhwb3J0cy5wYWdpbmF0aW5nRW5kcG9pbnRzID0gcGFnaW5hdGluZ0VuZHBvaW50cztcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPWluZGV4LmpzLm1hcFxuIiwKICAgICJcInVzZSBzdHJpY3RcIjtcbnZhciBfX2NyZWF0ZUJpbmRpbmcgPSAodGhpcyAmJiB0aGlzLl9fY3JlYXRlQmluZGluZykgfHwgKE9iamVjdC5jcmVhdGUgPyAoZnVuY3Rpb24obywgbSwgaywgazIpIHtcbiAgICBpZiAoazIgPT09IHVuZGVmaW5lZCkgazIgPSBrO1xuICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShvLCBrMiwgeyBlbnVtZXJhYmxlOiB0cnVlLCBnZXQ6IGZ1bmN0aW9uKCkgeyByZXR1cm4gbVtrXTsgfSB9KTtcbn0pIDogKGZ1bmN0aW9uKG8sIG0sIGssIGsyKSB7XG4gICAgaWYgKGsyID09PSB1bmRlZmluZWQpIGsyID0gaztcbiAgICBvW2syXSA9IG1ba107XG59KSk7XG52YXIgX19zZXRNb2R1bGVEZWZhdWx0ID0gKHRoaXMgJiYgdGhpcy5fX3NldE1vZHVsZURlZmF1bHQpIHx8IChPYmplY3QuY3JlYXRlID8gKGZ1bmN0aW9uKG8sIHYpIHtcbiAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkobywgXCJkZWZhdWx0XCIsIHsgZW51bWVyYWJsZTogdHJ1ZSwgdmFsdWU6IHYgfSk7XG59KSA6IGZ1bmN0aW9uKG8sIHYpIHtcbiAgICBvW1wiZGVmYXVsdFwiXSA9IHY7XG59KTtcbnZhciBfX2ltcG9ydFN0YXIgPSAodGhpcyAmJiB0aGlzLl9faW1wb3J0U3RhcikgfHwgZnVuY3Rpb24gKG1vZCkge1xuICAgIGlmIChtb2QgJiYgbW9kLl9fZXNNb2R1bGUpIHJldHVybiBtb2Q7XG4gICAgdmFyIHJlc3VsdCA9IHt9O1xuICAgIGlmIChtb2QgIT0gbnVsbCkgZm9yICh2YXIgayBpbiBtb2QpIGlmIChrICE9PSBcImRlZmF1bHRcIiAmJiBPYmplY3QuaGFzT3duUHJvcGVydHkuY2FsbChtb2QsIGspKSBfX2NyZWF0ZUJpbmRpbmcocmVzdWx0LCBtb2QsIGspO1xuICAgIF9fc2V0TW9kdWxlRGVmYXVsdChyZXN1bHQsIG1vZCk7XG4gICAgcmV0dXJuIHJlc3VsdDtcbn07XG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJfX2VzTW9kdWxlXCIsIHsgdmFsdWU6IHRydWUgfSk7XG5leHBvcnRzLmdldE9jdG9raXRPcHRpb25zID0gZXhwb3J0cy5HaXRIdWIgPSBleHBvcnRzLmRlZmF1bHRzID0gZXhwb3J0cy5jb250ZXh0ID0gdm9pZCAwO1xuY29uc3QgQ29udGV4dCA9IF9faW1wb3J0U3RhcihyZXF1aXJlKFwiLi9jb250ZXh0XCIpKTtcbmNvbnN0IFV0aWxzID0gX19pbXBvcnRTdGFyKHJlcXVpcmUoXCIuL2ludGVybmFsL3V0aWxzXCIpKTtcbi8vIG9jdG9raXQgKyBwbHVnaW5zXG5jb25zdCBjb3JlXzEgPSByZXF1aXJlKFwiQG9jdG9raXQvY29yZVwiKTtcbmNvbnN0IHBsdWdpbl9yZXN0X2VuZHBvaW50X21ldGhvZHNfMSA9IHJlcXVpcmUoXCJAb2N0b2tpdC9wbHVnaW4tcmVzdC1lbmRwb2ludC1tZXRob2RzXCIpO1xuY29uc3QgcGx1Z2luX3BhZ2luYXRlX3Jlc3RfMSA9IHJlcXVpcmUoXCJAb2N0b2tpdC9wbHVnaW4tcGFnaW5hdGUtcmVzdFwiKTtcbmV4cG9ydHMuY29udGV4dCA9IG5ldyBDb250ZXh0LkNvbnRleHQoKTtcbmNvbnN0IGJhc2VVcmwgPSBVdGlscy5nZXRBcGlCYXNlVXJsKCk7XG5leHBvcnRzLmRlZmF1bHRzID0ge1xuICAgIGJhc2VVcmwsXG4gICAgcmVxdWVzdDoge1xuICAgICAgICBhZ2VudDogVXRpbHMuZ2V0UHJveHlBZ2VudChiYXNlVXJsKVxuICAgIH1cbn07XG5leHBvcnRzLkdpdEh1YiA9IGNvcmVfMS5PY3Rva2l0LnBsdWdpbihwbHVnaW5fcmVzdF9lbmRwb2ludF9tZXRob2RzXzEucmVzdEVuZHBvaW50TWV0aG9kcywgcGx1Z2luX3BhZ2luYXRlX3Jlc3RfMS5wYWdpbmF0ZVJlc3QpLmRlZmF1bHRzKGV4cG9ydHMuZGVmYXVsdHMpO1xuLyoqXG4gKiBDb252aWVuY2UgZnVuY3Rpb24gdG8gY29ycmVjdGx5IGZvcm1hdCBPY3Rva2l0IE9wdGlvbnMgdG8gcGFzcyBpbnRvIHRoZSBjb25zdHJ1Y3Rvci5cbiAqXG4gKiBAcGFyYW0gICAgIHRva2VuICAgIHRoZSByZXBvIFBBVCBvciBHSVRIVUJfVE9LRU5cbiAqIEBwYXJhbSAgICAgb3B0aW9ucyAgb3RoZXIgb3B0aW9ucyB0byBzZXRcbiAqL1xuZnVuY3Rpb24gZ2V0T2N0b2tpdE9wdGlvbnModG9rZW4sIG9wdGlvbnMpIHtcbiAgICBjb25zdCBvcHRzID0gT2JqZWN0LmFzc2lnbih7fSwgb3B0aW9ucyB8fCB7fSk7IC8vIFNoYWxsb3cgY2xvbmUgLSBkb24ndCBtdXRhdGUgdGhlIG9iamVjdCBwcm92aWRlZCBieSB0aGUgY2FsbGVyXG4gICAgLy8gQXV0aFxuICAgIGNvbnN0IGF1dGggPSBVdGlscy5nZXRBdXRoU3RyaW5nKHRva2VuLCBvcHRzKTtcbiAgICBpZiAoYXV0aCkge1xuICAgICAgICBvcHRzLmF1dGggPSBhdXRoO1xuICAgIH1cbiAgICByZXR1cm4gb3B0cztcbn1cbmV4cG9ydHMuZ2V0T2N0b2tpdE9wdGlvbnMgPSBnZXRPY3Rva2l0T3B0aW9ucztcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPXV0aWxzLmpzLm1hcCIsCiAgICAiXCJ1c2Ugc3RyaWN0XCI7XG52YXIgX19jcmVhdGVCaW5kaW5nID0gKHRoaXMgJiYgdGhpcy5fX2NyZWF0ZUJpbmRpbmcpIHx8IChPYmplY3QuY3JlYXRlID8gKGZ1bmN0aW9uKG8sIG0sIGssIGsyKSB7XG4gICAgaWYgKGsyID09PSB1bmRlZmluZWQpIGsyID0gaztcbiAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkobywgazIsIHsgZW51bWVyYWJsZTogdHJ1ZSwgZ2V0OiBmdW5jdGlvbigpIHsgcmV0dXJuIG1ba107IH0gfSk7XG59KSA6IChmdW5jdGlvbihvLCBtLCBrLCBrMikge1xuICAgIGlmIChrMiA9PT0gdW5kZWZpbmVkKSBrMiA9IGs7XG4gICAgb1trMl0gPSBtW2tdO1xufSkpO1xudmFyIF9fc2V0TW9kdWxlRGVmYXVsdCA9ICh0aGlzICYmIHRoaXMuX19zZXRNb2R1bGVEZWZhdWx0KSB8fCAoT2JqZWN0LmNyZWF0ZSA/IChmdW5jdGlvbihvLCB2KSB7XG4gICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KG8sIFwiZGVmYXVsdFwiLCB7IGVudW1lcmFibGU6IHRydWUsIHZhbHVlOiB2IH0pO1xufSkgOiBmdW5jdGlvbihvLCB2KSB7XG4gICAgb1tcImRlZmF1bHRcIl0gPSB2O1xufSk7XG52YXIgX19pbXBvcnRTdGFyID0gKHRoaXMgJiYgdGhpcy5fX2ltcG9ydFN0YXIpIHx8IGZ1bmN0aW9uIChtb2QpIHtcbiAgICBpZiAobW9kICYmIG1vZC5fX2VzTW9kdWxlKSByZXR1cm4gbW9kO1xuICAgIHZhciByZXN1bHQgPSB7fTtcbiAgICBpZiAobW9kICE9IG51bGwpIGZvciAodmFyIGsgaW4gbW9kKSBpZiAoayAhPT0gXCJkZWZhdWx0XCIgJiYgT2JqZWN0Lmhhc093blByb3BlcnR5LmNhbGwobW9kLCBrKSkgX19jcmVhdGVCaW5kaW5nKHJlc3VsdCwgbW9kLCBrKTtcbiAgICBfX3NldE1vZHVsZURlZmF1bHQocmVzdWx0LCBtb2QpO1xuICAgIHJldHVybiByZXN1bHQ7XG59O1xuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiX19lc01vZHVsZVwiLCB7IHZhbHVlOiB0cnVlIH0pO1xuZXhwb3J0cy5nZXRPY3Rva2l0ID0gZXhwb3J0cy5jb250ZXh0ID0gdm9pZCAwO1xuY29uc3QgQ29udGV4dCA9IF9faW1wb3J0U3RhcihyZXF1aXJlKFwiLi9jb250ZXh0XCIpKTtcbmNvbnN0IHV0aWxzXzEgPSByZXF1aXJlKFwiLi91dGlsc1wiKTtcbmV4cG9ydHMuY29udGV4dCA9IG5ldyBDb250ZXh0LkNvbnRleHQoKTtcbi8qKlxuICogUmV0dXJucyBhIGh5ZHJhdGVkIG9jdG9raXQgcmVhZHkgdG8gdXNlIGZvciBHaXRIdWIgQWN0aW9uc1xuICpcbiAqIEBwYXJhbSAgICAgdG9rZW4gICAgdGhlIHJlcG8gUEFUIG9yIEdJVEhVQl9UT0tFTlxuICogQHBhcmFtICAgICBvcHRpb25zICBvdGhlciBvcHRpb25zIHRvIHNldFxuICovXG5mdW5jdGlvbiBnZXRPY3Rva2l0KHRva2VuLCBvcHRpb25zLCAuLi5hZGRpdGlvbmFsUGx1Z2lucykge1xuICAgIGNvbnN0IEdpdEh1YldpdGhQbHVnaW5zID0gdXRpbHNfMS5HaXRIdWIucGx1Z2luKC4uLmFkZGl0aW9uYWxQbHVnaW5zKTtcbiAgICByZXR1cm4gbmV3IEdpdEh1YldpdGhQbHVnaW5zKHV0aWxzXzEuZ2V0T2N0b2tpdE9wdGlvbnModG9rZW4sIG9wdGlvbnMpKTtcbn1cbmV4cG9ydHMuZ2V0T2N0b2tpdCA9IGdldE9jdG9raXQ7XG4vLyMgc291cmNlTWFwcGluZ1VSTD1naXRodWIuanMubWFwIiwKICAgICJtb2R1bGUuZXhwb3J0cyA9IFRyYXZlcnNlO1xuZnVuY3Rpb24gVHJhdmVyc2UgKG9iaikge1xuICAgIGlmICghKHRoaXMgaW5zdGFuY2VvZiBUcmF2ZXJzZSkpIHJldHVybiBuZXcgVHJhdmVyc2Uob2JqKTtcbiAgICB0aGlzLnZhbHVlID0gb2JqO1xufVxuXG5UcmF2ZXJzZS5wcm90b3R5cGUuZ2V0ID0gZnVuY3Rpb24gKHBzKSB7XG4gICAgdmFyIG5vZGUgPSB0aGlzLnZhbHVlO1xuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgcHMubGVuZ3RoOyBpICsrKSB7XG4gICAgICAgIHZhciBrZXkgPSBwc1tpXTtcbiAgICAgICAgaWYgKCFPYmplY3QuaGFzT3duUHJvcGVydHkuY2FsbChub2RlLCBrZXkpKSB7XG4gICAgICAgICAgICBub2RlID0gdW5kZWZpbmVkO1xuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cbiAgICAgICAgbm9kZSA9IG5vZGVba2V5XTtcbiAgICB9XG4gICAgcmV0dXJuIG5vZGU7XG59O1xuXG5UcmF2ZXJzZS5wcm90b3R5cGUuc2V0ID0gZnVuY3Rpb24gKHBzLCB2YWx1ZSkge1xuICAgIHZhciBub2RlID0gdGhpcy52YWx1ZTtcbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IHBzLmxlbmd0aCAtIDE7IGkgKyspIHtcbiAgICAgICAgdmFyIGtleSA9IHBzW2ldO1xuICAgICAgICBpZiAoIU9iamVjdC5oYXNPd25Qcm9wZXJ0eS5jYWxsKG5vZGUsIGtleSkpIG5vZGVba2V5XSA9IHt9O1xuICAgICAgICBub2RlID0gbm9kZVtrZXldO1xuICAgIH1cbiAgICBub2RlW3BzW2ldXSA9IHZhbHVlO1xuICAgIHJldHVybiB2YWx1ZTtcbn07XG5cblRyYXZlcnNlLnByb3RvdHlwZS5tYXAgPSBmdW5jdGlvbiAoY2IpIHtcbiAgICByZXR1cm4gd2Fsayh0aGlzLnZhbHVlLCBjYiwgdHJ1ZSk7XG59O1xuXG5UcmF2ZXJzZS5wcm90b3R5cGUuZm9yRWFjaCA9IGZ1bmN0aW9uIChjYikge1xuICAgIHRoaXMudmFsdWUgPSB3YWxrKHRoaXMudmFsdWUsIGNiLCBmYWxzZSk7XG4gICAgcmV0dXJuIHRoaXMudmFsdWU7XG59O1xuXG5UcmF2ZXJzZS5wcm90b3R5cGUucmVkdWNlID0gZnVuY3Rpb24gKGNiLCBpbml0KSB7XG4gICAgdmFyIHNraXAgPSBhcmd1bWVudHMubGVuZ3RoID09PSAxO1xuICAgIHZhciBhY2MgPSBza2lwID8gdGhpcy52YWx1ZSA6IGluaXQ7XG4gICAgdGhpcy5mb3JFYWNoKGZ1bmN0aW9uICh4KSB7XG4gICAgICAgIGlmICghdGhpcy5pc1Jvb3QgfHwgIXNraXApIHtcbiAgICAgICAgICAgIGFjYyA9IGNiLmNhbGwodGhpcywgYWNjLCB4KTtcbiAgICAgICAgfVxuICAgIH0pO1xuICAgIHJldHVybiBhY2M7XG59O1xuXG5UcmF2ZXJzZS5wcm90b3R5cGUuZGVlcEVxdWFsID0gZnVuY3Rpb24gKG9iaikge1xuICAgIGlmIChhcmd1bWVudHMubGVuZ3RoICE9PSAxKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICAgICAgICdkZWVwRXF1YWwgcmVxdWlyZXMgZXhhY3RseSBvbmUgb2JqZWN0IHRvIGNvbXBhcmUgYWdhaW5zdCdcbiAgICAgICAgKTtcbiAgICB9XG4gICAgXG4gICAgdmFyIGVxdWFsID0gdHJ1ZTtcbiAgICB2YXIgbm9kZSA9IG9iajtcbiAgICBcbiAgICB0aGlzLmZvckVhY2goZnVuY3Rpb24gKHkpIHtcbiAgICAgICAgdmFyIG5vdEVxdWFsID0gKGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgIGVxdWFsID0gZmFsc2U7XG4gICAgICAgICAgICAvL3RoaXMuc3RvcCgpO1xuICAgICAgICAgICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICAgICAgfSkuYmluZCh0aGlzKTtcbiAgICAgICAgXG4gICAgICAgIC8vaWYgKG5vZGUgPT09IHVuZGVmaW5lZCB8fCBub2RlID09PSBudWxsKSByZXR1cm4gbm90RXF1YWwoKTtcbiAgICAgICAgXG4gICAgICAgIGlmICghdGhpcy5pc1Jvb3QpIHtcbiAgICAgICAgLypcbiAgICAgICAgICAgIGlmICghT2JqZWN0Lmhhc093blByb3BlcnR5LmNhbGwobm9kZSwgdGhpcy5rZXkpKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIG5vdEVxdWFsKCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICovXG4gICAgICAgICAgICBpZiAodHlwZW9mIG5vZGUgIT09ICdvYmplY3QnKSByZXR1cm4gbm90RXF1YWwoKTtcbiAgICAgICAgICAgIG5vZGUgPSBub2RlW3RoaXMua2V5XTtcbiAgICAgICAgfVxuICAgICAgICBcbiAgICAgICAgdmFyIHggPSBub2RlO1xuICAgICAgICBcbiAgICAgICAgdGhpcy5wb3N0KGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgIG5vZGUgPSB4O1xuICAgICAgICB9KTtcbiAgICAgICAgXG4gICAgICAgIHZhciB0b1MgPSBmdW5jdGlvbiAobykge1xuICAgICAgICAgICAgcmV0dXJuIE9iamVjdC5wcm90b3R5cGUudG9TdHJpbmcuY2FsbChvKTtcbiAgICAgICAgfTtcbiAgICAgICAgXG4gICAgICAgIGlmICh0aGlzLmNpcmN1bGFyKSB7XG4gICAgICAgICAgICBpZiAoVHJhdmVyc2Uob2JqKS5nZXQodGhpcy5jaXJjdWxhci5wYXRoKSAhPT0geCkgbm90RXF1YWwoKTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIGlmICh0eXBlb2YgeCAhPT0gdHlwZW9mIHkpIHtcbiAgICAgICAgICAgIG5vdEVxdWFsKCk7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSBpZiAoeCA9PT0gbnVsbCB8fCB5ID09PSBudWxsIHx8IHggPT09IHVuZGVmaW5lZCB8fCB5ID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgIGlmICh4ICE9PSB5KSBub3RFcXVhbCgpO1xuICAgICAgICB9XG4gICAgICAgIGVsc2UgaWYgKHguX19wcm90b19fICE9PSB5Ll9fcHJvdG9fXykge1xuICAgICAgICAgICAgbm90RXF1YWwoKTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIGlmICh4ID09PSB5KSB7XG4gICAgICAgICAgICAvLyBub3BcbiAgICAgICAgfVxuICAgICAgICBlbHNlIGlmICh0eXBlb2YgeCA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICAgICAgaWYgKHggaW5zdGFuY2VvZiBSZWdFeHApIHtcbiAgICAgICAgICAgICAgICAvLyBib3RoIHJlZ2V4cHMgb24gYWNjb3VudCBvZiB0aGUgX19wcm90b19fIGNoZWNrXG4gICAgICAgICAgICAgICAgaWYgKHgudG9TdHJpbmcoKSAhPSB5LnRvU3RyaW5nKCkpIG5vdEVxdWFsKCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIGlmICh4ICE9PSB5KSBub3RFcXVhbCgpO1xuICAgICAgICB9XG4gICAgICAgIGVsc2UgaWYgKHR5cGVvZiB4ID09PSAnb2JqZWN0Jykge1xuICAgICAgICAgICAgaWYgKHRvUyh5KSA9PT0gJ1tvYmplY3QgQXJndW1lbnRzXSdcbiAgICAgICAgICAgIHx8IHRvUyh4KSA9PT0gJ1tvYmplY3QgQXJndW1lbnRzXScpIHtcbiAgICAgICAgICAgICAgICBpZiAodG9TKHgpICE9PSB0b1MoeSkpIHtcbiAgICAgICAgICAgICAgICAgICAgbm90RXF1YWwoKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIGlmICh4IGluc3RhbmNlb2YgRGF0ZSB8fCB5IGluc3RhbmNlb2YgRGF0ZSkge1xuICAgICAgICAgICAgICAgIGlmICghKHggaW5zdGFuY2VvZiBEYXRlKSB8fCAhKHkgaW5zdGFuY2VvZiBEYXRlKVxuICAgICAgICAgICAgICAgIHx8IHguZ2V0VGltZSgpICE9PSB5LmdldFRpbWUoKSkge1xuICAgICAgICAgICAgICAgICAgICBub3RFcXVhbCgpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgIHZhciBreCA9IE9iamVjdC5rZXlzKHgpO1xuICAgICAgICAgICAgICAgIHZhciBreSA9IE9iamVjdC5rZXlzKHkpO1xuICAgICAgICAgICAgICAgIGlmIChreC5sZW5ndGggIT09IGt5Lmxlbmd0aCkgcmV0dXJuIG5vdEVxdWFsKCk7XG4gICAgICAgICAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBreC5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgICAgICAgICB2YXIgayA9IGt4W2ldO1xuICAgICAgICAgICAgICAgICAgICBpZiAoIU9iamVjdC5oYXNPd25Qcm9wZXJ0eS5jYWxsKHksIGspKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBub3RFcXVhbCgpO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfSk7XG4gICAgXG4gICAgcmV0dXJuIGVxdWFsO1xufTtcblxuVHJhdmVyc2UucHJvdG90eXBlLnBhdGhzID0gZnVuY3Rpb24gKCkge1xuICAgIHZhciBhY2MgPSBbXTtcbiAgICB0aGlzLmZvckVhY2goZnVuY3Rpb24gKHgpIHtcbiAgICAgICAgYWNjLnB1c2godGhpcy5wYXRoKTsgXG4gICAgfSk7XG4gICAgcmV0dXJuIGFjYztcbn07XG5cblRyYXZlcnNlLnByb3RvdHlwZS5ub2RlcyA9IGZ1bmN0aW9uICgpIHtcbiAgICB2YXIgYWNjID0gW107XG4gICAgdGhpcy5mb3JFYWNoKGZ1bmN0aW9uICh4KSB7XG4gICAgICAgIGFjYy5wdXNoKHRoaXMubm9kZSk7XG4gICAgfSk7XG4gICAgcmV0dXJuIGFjYztcbn07XG5cblRyYXZlcnNlLnByb3RvdHlwZS5jbG9uZSA9IGZ1bmN0aW9uICgpIHtcbiAgICB2YXIgcGFyZW50cyA9IFtdLCBub2RlcyA9IFtdO1xuICAgIFxuICAgIHJldHVybiAoZnVuY3Rpb24gY2xvbmUgKHNyYykge1xuICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IHBhcmVudHMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgIGlmIChwYXJlbnRzW2ldID09PSBzcmMpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gbm9kZXNbaV07XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgXG4gICAgICAgIGlmICh0eXBlb2Ygc3JjID09PSAnb2JqZWN0JyAmJiBzcmMgIT09IG51bGwpIHtcbiAgICAgICAgICAgIHZhciBkc3QgPSBjb3B5KHNyYyk7XG4gICAgICAgICAgICBcbiAgICAgICAgICAgIHBhcmVudHMucHVzaChzcmMpO1xuICAgICAgICAgICAgbm9kZXMucHVzaChkc3QpO1xuICAgICAgICAgICAgXG4gICAgICAgICAgICBPYmplY3Qua2V5cyhzcmMpLmZvckVhY2goZnVuY3Rpb24gKGtleSkge1xuICAgICAgICAgICAgICAgIGRzdFtrZXldID0gY2xvbmUoc3JjW2tleV0pO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICBcbiAgICAgICAgICAgIHBhcmVudHMucG9wKCk7XG4gICAgICAgICAgICBub2Rlcy5wb3AoKTtcbiAgICAgICAgICAgIHJldHVybiBkc3Q7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICByZXR1cm4gc3JjO1xuICAgICAgICB9XG4gICAgfSkodGhpcy52YWx1ZSk7XG59O1xuXG5mdW5jdGlvbiB3YWxrIChyb290LCBjYiwgaW1tdXRhYmxlKSB7XG4gICAgdmFyIHBhdGggPSBbXTtcbiAgICB2YXIgcGFyZW50cyA9IFtdO1xuICAgIHZhciBhbGl2ZSA9IHRydWU7XG4gICAgXG4gICAgcmV0dXJuIChmdW5jdGlvbiB3YWxrZXIgKG5vZGVfKSB7XG4gICAgICAgIHZhciBub2RlID0gaW1tdXRhYmxlID8gY29weShub2RlXykgOiBub2RlXztcbiAgICAgICAgdmFyIG1vZGlmaWVycyA9IHt9O1xuICAgICAgICBcbiAgICAgICAgdmFyIHN0YXRlID0ge1xuICAgICAgICAgICAgbm9kZSA6IG5vZGUsXG4gICAgICAgICAgICBub2RlXyA6IG5vZGVfLFxuICAgICAgICAgICAgcGF0aCA6IFtdLmNvbmNhdChwYXRoKSxcbiAgICAgICAgICAgIHBhcmVudCA6IHBhcmVudHMuc2xpY2UoLTEpWzBdLFxuICAgICAgICAgICAga2V5IDogcGF0aC5zbGljZSgtMSlbMF0sXG4gICAgICAgICAgICBpc1Jvb3QgOiBwYXRoLmxlbmd0aCA9PT0gMCxcbiAgICAgICAgICAgIGxldmVsIDogcGF0aC5sZW5ndGgsXG4gICAgICAgICAgICBjaXJjdWxhciA6IG51bGwsXG4gICAgICAgICAgICB1cGRhdGUgOiBmdW5jdGlvbiAoeCkge1xuICAgICAgICAgICAgICAgIGlmICghc3RhdGUuaXNSb290KSB7XG4gICAgICAgICAgICAgICAgICAgIHN0YXRlLnBhcmVudC5ub2RlW3N0YXRlLmtleV0gPSB4O1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBzdGF0ZS5ub2RlID0geDtcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAnZGVsZXRlJyA6IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgICAgICBkZWxldGUgc3RhdGUucGFyZW50Lm5vZGVbc3RhdGUua2V5XTtcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICByZW1vdmUgOiBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICAgICAgaWYgKEFycmF5LmlzQXJyYXkoc3RhdGUucGFyZW50Lm5vZGUpKSB7XG4gICAgICAgICAgICAgICAgICAgIHN0YXRlLnBhcmVudC5ub2RlLnNwbGljZShzdGF0ZS5rZXksIDEpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgZGVsZXRlIHN0YXRlLnBhcmVudC5ub2RlW3N0YXRlLmtleV07XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIGJlZm9yZSA6IGZ1bmN0aW9uIChmKSB7IG1vZGlmaWVycy5iZWZvcmUgPSBmIH0sXG4gICAgICAgICAgICBhZnRlciA6IGZ1bmN0aW9uIChmKSB7IG1vZGlmaWVycy5hZnRlciA9IGYgfSxcbiAgICAgICAgICAgIHByZSA6IGZ1bmN0aW9uIChmKSB7IG1vZGlmaWVycy5wcmUgPSBmIH0sXG4gICAgICAgICAgICBwb3N0IDogZnVuY3Rpb24gKGYpIHsgbW9kaWZpZXJzLnBvc3QgPSBmIH0sXG4gICAgICAgICAgICBzdG9wIDogZnVuY3Rpb24gKCkgeyBhbGl2ZSA9IGZhbHNlIH1cbiAgICAgICAgfTtcbiAgICAgICAgXG4gICAgICAgIGlmICghYWxpdmUpIHJldHVybiBzdGF0ZTtcbiAgICAgICAgXG4gICAgICAgIGlmICh0eXBlb2Ygbm9kZSA9PT0gJ29iamVjdCcgJiYgbm9kZSAhPT0gbnVsbCkge1xuICAgICAgICAgICAgc3RhdGUuaXNMZWFmID0gT2JqZWN0LmtleXMobm9kZSkubGVuZ3RoID09IDA7XG4gICAgICAgICAgICBcbiAgICAgICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgcGFyZW50cy5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgICAgIGlmIChwYXJlbnRzW2ldLm5vZGVfID09PSBub2RlXykge1xuICAgICAgICAgICAgICAgICAgICBzdGF0ZS5jaXJjdWxhciA9IHBhcmVudHNbaV07XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIHN0YXRlLmlzTGVhZiA9IHRydWU7XG4gICAgICAgIH1cbiAgICAgICAgXG4gICAgICAgIHN0YXRlLm5vdExlYWYgPSAhc3RhdGUuaXNMZWFmO1xuICAgICAgICBzdGF0ZS5ub3RSb290ID0gIXN0YXRlLmlzUm9vdDtcbiAgICAgICAgXG4gICAgICAgIC8vIHVzZSByZXR1cm4gdmFsdWVzIHRvIHVwZGF0ZSBpZiBkZWZpbmVkXG4gICAgICAgIHZhciByZXQgPSBjYi5jYWxsKHN0YXRlLCBzdGF0ZS5ub2RlKTtcbiAgICAgICAgaWYgKHJldCAhPT0gdW5kZWZpbmVkICYmIHN0YXRlLnVwZGF0ZSkgc3RhdGUudXBkYXRlKHJldCk7XG4gICAgICAgIGlmIChtb2RpZmllcnMuYmVmb3JlKSBtb2RpZmllcnMuYmVmb3JlLmNhbGwoc3RhdGUsIHN0YXRlLm5vZGUpO1xuICAgICAgICBcbiAgICAgICAgaWYgKHR5cGVvZiBzdGF0ZS5ub2RlID09ICdvYmplY3QnXG4gICAgICAgICYmIHN0YXRlLm5vZGUgIT09IG51bGwgJiYgIXN0YXRlLmNpcmN1bGFyKSB7XG4gICAgICAgICAgICBwYXJlbnRzLnB1c2goc3RhdGUpO1xuICAgICAgICAgICAgXG4gICAgICAgICAgICB2YXIga2V5cyA9IE9iamVjdC5rZXlzKHN0YXRlLm5vZGUpO1xuICAgICAgICAgICAga2V5cy5mb3JFYWNoKGZ1bmN0aW9uIChrZXksIGkpIHtcbiAgICAgICAgICAgICAgICBwYXRoLnB1c2goa2V5KTtcbiAgICAgICAgICAgICAgICBcbiAgICAgICAgICAgICAgICBpZiAobW9kaWZpZXJzLnByZSkgbW9kaWZpZXJzLnByZS5jYWxsKHN0YXRlLCBzdGF0ZS5ub2RlW2tleV0sIGtleSk7XG4gICAgICAgICAgICAgICAgXG4gICAgICAgICAgICAgICAgdmFyIGNoaWxkID0gd2Fsa2VyKHN0YXRlLm5vZGVba2V5XSk7XG4gICAgICAgICAgICAgICAgaWYgKGltbXV0YWJsZSAmJiBPYmplY3QuaGFzT3duUHJvcGVydHkuY2FsbChzdGF0ZS5ub2RlLCBrZXkpKSB7XG4gICAgICAgICAgICAgICAgICAgIHN0YXRlLm5vZGVba2V5XSA9IGNoaWxkLm5vZGU7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIFxuICAgICAgICAgICAgICAgIGNoaWxkLmlzTGFzdCA9IGkgPT0ga2V5cy5sZW5ndGggLSAxO1xuICAgICAgICAgICAgICAgIGNoaWxkLmlzRmlyc3QgPSBpID09IDA7XG4gICAgICAgICAgICAgICAgXG4gICAgICAgICAgICAgICAgaWYgKG1vZGlmaWVycy5wb3N0KSBtb2RpZmllcnMucG9zdC5jYWxsKHN0YXRlLCBjaGlsZCk7XG4gICAgICAgICAgICAgICAgXG4gICAgICAgICAgICAgICAgcGF0aC5wb3AoKTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgcGFyZW50cy5wb3AoKTtcbiAgICAgICAgfVxuICAgICAgICBcbiAgICAgICAgaWYgKG1vZGlmaWVycy5hZnRlcikgbW9kaWZpZXJzLmFmdGVyLmNhbGwoc3RhdGUsIHN0YXRlLm5vZGUpO1xuICAgICAgICBcbiAgICAgICAgcmV0dXJuIHN0YXRlO1xuICAgIH0pKHJvb3QpLm5vZGU7XG59XG5cbk9iamVjdC5rZXlzKFRyYXZlcnNlLnByb3RvdHlwZSkuZm9yRWFjaChmdW5jdGlvbiAoa2V5KSB7XG4gICAgVHJhdmVyc2Vba2V5XSA9IGZ1bmN0aW9uIChvYmopIHtcbiAgICAgICAgdmFyIGFyZ3MgPSBbXS5zbGljZS5jYWxsKGFyZ3VtZW50cywgMSk7XG4gICAgICAgIHZhciB0ID0gVHJhdmVyc2Uob2JqKTtcbiAgICAgICAgcmV0dXJuIHRba2V5XS5hcHBseSh0LCBhcmdzKTtcbiAgICB9O1xufSk7XG5cbmZ1bmN0aW9uIGNvcHkgKHNyYykge1xuICAgIGlmICh0eXBlb2Ygc3JjID09PSAnb2JqZWN0JyAmJiBzcmMgIT09IG51bGwpIHtcbiAgICAgICAgdmFyIGRzdDtcbiAgICAgICAgXG4gICAgICAgIGlmIChBcnJheS5pc0FycmF5KHNyYykpIHtcbiAgICAgICAgICAgIGRzdCA9IFtdO1xuICAgICAgICB9XG4gICAgICAgIGVsc2UgaWYgKHNyYyBpbnN0YW5jZW9mIERhdGUpIHtcbiAgICAgICAgICAgIGRzdCA9IG5ldyBEYXRlKHNyYyk7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSBpZiAoc3JjIGluc3RhbmNlb2YgQm9vbGVhbikge1xuICAgICAgICAgICAgZHN0ID0gbmV3IEJvb2xlYW4oc3JjKTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIGlmIChzcmMgaW5zdGFuY2VvZiBOdW1iZXIpIHtcbiAgICAgICAgICAgIGRzdCA9IG5ldyBOdW1iZXIoc3JjKTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIGlmIChzcmMgaW5zdGFuY2VvZiBTdHJpbmcpIHtcbiAgICAgICAgICAgIGRzdCA9IG5ldyBTdHJpbmcoc3JjKTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIGRzdCA9IE9iamVjdC5jcmVhdGUoT2JqZWN0LmdldFByb3RvdHlwZU9mKHNyYykpO1xuICAgICAgICB9XG4gICAgICAgIFxuICAgICAgICBPYmplY3Qua2V5cyhzcmMpLmZvckVhY2goZnVuY3Rpb24gKGtleSkge1xuICAgICAgICAgICAgZHN0W2tleV0gPSBzcmNba2V5XTtcbiAgICAgICAgfSk7XG4gICAgICAgIHJldHVybiBkc3Q7XG4gICAgfVxuICAgIGVsc2UgcmV0dXJuIHNyYztcbn1cbiIsCiAgICAidmFyIFRyYXZlcnNlID0gcmVxdWlyZSgndHJhdmVyc2UnKTtcbnZhciBFdmVudEVtaXR0ZXIgPSByZXF1aXJlKCdldmVudHMnKS5FdmVudEVtaXR0ZXI7XG5cbm1vZHVsZS5leHBvcnRzID0gQ2hhaW5zYXc7XG5mdW5jdGlvbiBDaGFpbnNhdyAoYnVpbGRlcikge1xuICAgIHZhciBzYXcgPSBDaGFpbnNhdy5zYXcoYnVpbGRlciwge30pO1xuICAgIHZhciByID0gYnVpbGRlci5jYWxsKHNhdy5oYW5kbGVycywgc2F3KTtcbiAgICBpZiAociAhPT0gdW5kZWZpbmVkKSBzYXcuaGFuZGxlcnMgPSByO1xuICAgIHNhdy5yZWNvcmQoKTtcbiAgICByZXR1cm4gc2F3LmNoYWluKCk7XG59O1xuXG5DaGFpbnNhdy5saWdodCA9IGZ1bmN0aW9uIENoYWluc2F3TGlnaHQgKGJ1aWxkZXIpIHtcbiAgICB2YXIgc2F3ID0gQ2hhaW5zYXcuc2F3KGJ1aWxkZXIsIHt9KTtcbiAgICB2YXIgciA9IGJ1aWxkZXIuY2FsbChzYXcuaGFuZGxlcnMsIHNhdyk7XG4gICAgaWYgKHIgIT09IHVuZGVmaW5lZCkgc2F3LmhhbmRsZXJzID0gcjtcbiAgICByZXR1cm4gc2F3LmNoYWluKCk7XG59O1xuXG5DaGFpbnNhdy5zYXcgPSBmdW5jdGlvbiAoYnVpbGRlciwgaGFuZGxlcnMpIHtcbiAgICB2YXIgc2F3ID0gbmV3IEV2ZW50RW1pdHRlcjtcbiAgICBzYXcuaGFuZGxlcnMgPSBoYW5kbGVycztcbiAgICBzYXcuYWN0aW9ucyA9IFtdO1xuXG4gICAgc2F3LmNoYWluID0gZnVuY3Rpb24gKCkge1xuICAgICAgICB2YXIgY2ggPSBUcmF2ZXJzZShzYXcuaGFuZGxlcnMpLm1hcChmdW5jdGlvbiAobm9kZSkge1xuICAgICAgICAgICAgaWYgKHRoaXMuaXNSb290KSByZXR1cm4gbm9kZTtcbiAgICAgICAgICAgIHZhciBwcyA9IHRoaXMucGF0aDtcblxuICAgICAgICAgICAgaWYgKHR5cGVvZiBub2RlID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgICAgICAgICAgdGhpcy51cGRhdGUoZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgICAgICAgICBzYXcuYWN0aW9ucy5wdXNoKHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHBhdGggOiBwcyxcbiAgICAgICAgICAgICAgICAgICAgICAgIGFyZ3MgOiBbXS5zbGljZS5jYWxsKGFyZ3VtZW50cylcbiAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBjaDtcbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSk7XG5cbiAgICAgICAgcHJvY2Vzcy5uZXh0VGljayhmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICBzYXcuZW1pdCgnYmVnaW4nKTtcbiAgICAgICAgICAgIHNhdy5uZXh0KCk7XG4gICAgICAgIH0pO1xuXG4gICAgICAgIHJldHVybiBjaDtcbiAgICB9O1xuXG4gICAgc2F3LnBvcCA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgcmV0dXJuIHNhdy5hY3Rpb25zLnNoaWZ0KCk7XG4gICAgfTtcblxuICAgIHNhdy5uZXh0ID0gZnVuY3Rpb24gKCkge1xuICAgICAgICB2YXIgYWN0aW9uID0gc2F3LnBvcCgpO1xuXG4gICAgICAgIGlmICghYWN0aW9uKSB7XG4gICAgICAgICAgICBzYXcuZW1pdCgnZW5kJyk7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSBpZiAoIWFjdGlvbi50cmFwKSB7XG4gICAgICAgICAgICB2YXIgbm9kZSA9IHNhdy5oYW5kbGVycztcbiAgICAgICAgICAgIGFjdGlvbi5wYXRoLmZvckVhY2goZnVuY3Rpb24gKGtleSkgeyBub2RlID0gbm9kZVtrZXldIH0pO1xuICAgICAgICAgICAgbm9kZS5hcHBseShzYXcuaGFuZGxlcnMsIGFjdGlvbi5hcmdzKTtcbiAgICAgICAgfVxuICAgIH07XG5cbiAgICBzYXcubmVzdCA9IGZ1bmN0aW9uIChjYikge1xuICAgICAgICB2YXIgYXJncyA9IFtdLnNsaWNlLmNhbGwoYXJndW1lbnRzLCAxKTtcbiAgICAgICAgdmFyIGF1dG9uZXh0ID0gdHJ1ZTtcblxuICAgICAgICBpZiAodHlwZW9mIGNiID09PSAnYm9vbGVhbicpIHtcbiAgICAgICAgICAgIHZhciBhdXRvbmV4dCA9IGNiO1xuICAgICAgICAgICAgY2IgPSBhcmdzLnNoaWZ0KCk7XG4gICAgICAgIH1cblxuICAgICAgICB2YXIgcyA9IENoYWluc2F3LnNhdyhidWlsZGVyLCB7fSk7XG4gICAgICAgIHZhciByID0gYnVpbGRlci5jYWxsKHMuaGFuZGxlcnMsIHMpO1xuXG4gICAgICAgIGlmIChyICE9PSB1bmRlZmluZWQpIHMuaGFuZGxlcnMgPSByO1xuXG4gICAgICAgIC8vIElmIHdlIGFyZSByZWNvcmRpbmcuLi5cbiAgICAgICAgaWYgKFwidW5kZWZpbmVkXCIgIT09IHR5cGVvZiBzYXcuc3RlcCkge1xuICAgICAgICAgICAgLy8gLi4uIG91ciBjaGlsZHJlbiBzaG91bGQsIHRvb1xuICAgICAgICAgICAgcy5yZWNvcmQoKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGNiLmFwcGx5KHMuY2hhaW4oKSwgYXJncyk7XG4gICAgICAgIGlmIChhdXRvbmV4dCAhPT0gZmFsc2UpIHMub24oJ2VuZCcsIHNhdy5uZXh0KTtcbiAgICB9O1xuXG4gICAgc2F3LnJlY29yZCA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgdXBncmFkZUNoYWluc2F3KHNhdyk7XG4gICAgfTtcblxuICAgIFsndHJhcCcsICdkb3duJywgJ2p1bXAnXS5mb3JFYWNoKGZ1bmN0aW9uIChtZXRob2QpIHtcbiAgICAgICAgc2F3W21ldGhvZF0gPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJUbyB1c2UgdGhlIHRyYXAsIGRvd24gYW5kIGp1bXAgZmVhdHVyZXMsIHBsZWFzZSBcIitcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBcImNhbGwgcmVjb3JkKCkgZmlyc3QgdG8gc3RhcnQgcmVjb3JkaW5nIGFjdGlvbnMuXCIpO1xuICAgICAgICB9O1xuICAgIH0pO1xuXG4gICAgcmV0dXJuIHNhdztcbn07XG5cbmZ1bmN0aW9uIHVwZ3JhZGVDaGFpbnNhdyhzYXcpIHtcbiAgICBzYXcuc3RlcCA9IDA7XG5cbiAgICAvLyBvdmVycmlkZSBwb3BcbiAgICBzYXcucG9wID0gZnVuY3Rpb24gKCkge1xuICAgICAgICByZXR1cm4gc2F3LmFjdGlvbnNbc2F3LnN0ZXArK107XG4gICAgfTtcblxuICAgIHNhdy50cmFwID0gZnVuY3Rpb24gKG5hbWUsIGNiKSB7XG4gICAgICAgIHZhciBwcyA9IEFycmF5LmlzQXJyYXkobmFtZSkgPyBuYW1lIDogW25hbWVdO1xuICAgICAgICBzYXcuYWN0aW9ucy5wdXNoKHtcbiAgICAgICAgICAgIHBhdGggOiBwcyxcbiAgICAgICAgICAgIHN0ZXAgOiBzYXcuc3RlcCxcbiAgICAgICAgICAgIGNiIDogY2IsXG4gICAgICAgICAgICB0cmFwIDogdHJ1ZVxuICAgICAgICB9KTtcbiAgICB9O1xuXG4gICAgc2F3LmRvd24gPSBmdW5jdGlvbiAobmFtZSkge1xuICAgICAgICB2YXIgcHMgPSAoQXJyYXkuaXNBcnJheShuYW1lKSA/IG5hbWUgOiBbbmFtZV0pLmpvaW4oJy8nKTtcbiAgICAgICAgdmFyIGkgPSBzYXcuYWN0aW9ucy5zbGljZShzYXcuc3RlcCkubWFwKGZ1bmN0aW9uICh4KSB7XG4gICAgICAgICAgICBpZiAoeC50cmFwICYmIHguc3RlcCA8PSBzYXcuc3RlcCkgcmV0dXJuIGZhbHNlO1xuICAgICAgICAgICAgcmV0dXJuIHgucGF0aC5qb2luKCcvJykgPT0gcHM7XG4gICAgICAgIH0pLmluZGV4T2YodHJ1ZSk7XG5cbiAgICAgICAgaWYgKGkgPj0gMCkgc2F3LnN0ZXAgKz0gaTtcbiAgICAgICAgZWxzZSBzYXcuc3RlcCA9IHNhdy5hY3Rpb25zLmxlbmd0aDtcblxuICAgICAgICB2YXIgYWN0ID0gc2F3LmFjdGlvbnNbc2F3LnN0ZXAgLSAxXTtcbiAgICAgICAgaWYgKGFjdCAmJiBhY3QudHJhcCkge1xuICAgICAgICAgICAgLy8gSXQncyBhIHRyYXAhXG4gICAgICAgICAgICBzYXcuc3RlcCA9IGFjdC5zdGVwO1xuICAgICAgICAgICAgYWN0LmNiKCk7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSBzYXcubmV4dCgpO1xuICAgIH07XG5cbiAgICBzYXcuanVtcCA9IGZ1bmN0aW9uIChzdGVwKSB7XG4gICAgICAgIHNhdy5zdGVwID0gc3RlcDtcbiAgICAgICAgc2F3Lm5leHQoKTtcbiAgICB9O1xufTtcbiIsCiAgICAibW9kdWxlLmV4cG9ydHMgPSBCdWZmZXJzO1xuXG5mdW5jdGlvbiBCdWZmZXJzIChidWZzKSB7XG4gICAgaWYgKCEodGhpcyBpbnN0YW5jZW9mIEJ1ZmZlcnMpKSByZXR1cm4gbmV3IEJ1ZmZlcnMoYnVmcyk7XG4gICAgdGhpcy5idWZmZXJzID0gYnVmcyB8fCBbXTtcbiAgICB0aGlzLmxlbmd0aCA9IHRoaXMuYnVmZmVycy5yZWR1Y2UoZnVuY3Rpb24gKHNpemUsIGJ1Zikge1xuICAgICAgICByZXR1cm4gc2l6ZSArIGJ1Zi5sZW5ndGhcbiAgICB9LCAwKTtcbn1cblxuQnVmZmVycy5wcm90b3R5cGUucHVzaCA9IGZ1bmN0aW9uICgpIHtcbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IGFyZ3VtZW50cy5sZW5ndGg7IGkrKykge1xuICAgICAgICBpZiAoIUJ1ZmZlci5pc0J1ZmZlcihhcmd1bWVudHNbaV0pKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCdUcmllZCB0byBwdXNoIGEgbm9uLWJ1ZmZlcicpO1xuICAgICAgICB9XG4gICAgfVxuICAgIFxuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgYXJndW1lbnRzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgIHZhciBidWYgPSBhcmd1bWVudHNbaV07XG4gICAgICAgIHRoaXMuYnVmZmVycy5wdXNoKGJ1Zik7XG4gICAgICAgIHRoaXMubGVuZ3RoICs9IGJ1Zi5sZW5ndGg7XG4gICAgfVxuICAgIHJldHVybiB0aGlzLmxlbmd0aDtcbn07XG5cbkJ1ZmZlcnMucHJvdG90eXBlLnVuc2hpZnQgPSBmdW5jdGlvbiAoKSB7XG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCBhcmd1bWVudHMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgaWYgKCFCdWZmZXIuaXNCdWZmZXIoYXJndW1lbnRzW2ldKSkge1xuICAgICAgICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcignVHJpZWQgdG8gdW5zaGlmdCBhIG5vbi1idWZmZXInKTtcbiAgICAgICAgfVxuICAgIH1cbiAgICBcbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IGFyZ3VtZW50cy5sZW5ndGg7IGkrKykge1xuICAgICAgICB2YXIgYnVmID0gYXJndW1lbnRzW2ldO1xuICAgICAgICB0aGlzLmJ1ZmZlcnMudW5zaGlmdChidWYpO1xuICAgICAgICB0aGlzLmxlbmd0aCArPSBidWYubGVuZ3RoO1xuICAgIH1cbiAgICByZXR1cm4gdGhpcy5sZW5ndGg7XG59O1xuXG5CdWZmZXJzLnByb3RvdHlwZS5jb3B5ID0gZnVuY3Rpb24gKGRzdCwgZFN0YXJ0LCBzdGFydCwgZW5kKSB7XG4gICAgcmV0dXJuIHRoaXMuc2xpY2Uoc3RhcnQsIGVuZCkuY29weShkc3QsIGRTdGFydCwgMCwgZW5kIC0gc3RhcnQpO1xufTtcblxuQnVmZmVycy5wcm90b3R5cGUuc3BsaWNlID0gZnVuY3Rpb24gKGksIGhvd01hbnkpIHtcbiAgICB2YXIgYnVmZmVycyA9IHRoaXMuYnVmZmVycztcbiAgICB2YXIgaW5kZXggPSBpID49IDAgPyBpIDogdGhpcy5sZW5ndGggLSBpO1xuICAgIHZhciByZXBzID0gW10uc2xpY2UuY2FsbChhcmd1bWVudHMsIDIpO1xuICAgIFxuICAgIGlmIChob3dNYW55ID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgaG93TWFueSA9IHRoaXMubGVuZ3RoIC0gaW5kZXg7XG4gICAgfVxuICAgIGVsc2UgaWYgKGhvd01hbnkgPiB0aGlzLmxlbmd0aCAtIGluZGV4KSB7XG4gICAgICAgIGhvd01hbnkgPSB0aGlzLmxlbmd0aCAtIGluZGV4O1xuICAgIH1cbiAgICBcbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IHJlcHMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgdGhpcy5sZW5ndGggKz0gcmVwc1tpXS5sZW5ndGg7XG4gICAgfVxuICAgIFxuICAgIHZhciByZW1vdmVkID0gbmV3IEJ1ZmZlcnMoKTtcbiAgICB2YXIgYnl0ZXMgPSAwO1xuICAgIFxuICAgIHZhciBzdGFydEJ5dGVzID0gMDtcbiAgICBmb3IgKFxuICAgICAgICB2YXIgaWkgPSAwO1xuICAgICAgICBpaSA8IGJ1ZmZlcnMubGVuZ3RoICYmIHN0YXJ0Qnl0ZXMgKyBidWZmZXJzW2lpXS5sZW5ndGggPCBpbmRleDtcbiAgICAgICAgaWkgKytcbiAgICApIHsgc3RhcnRCeXRlcyArPSBidWZmZXJzW2lpXS5sZW5ndGggfVxuICAgIFxuICAgIGlmIChpbmRleCAtIHN0YXJ0Qnl0ZXMgPiAwKSB7XG4gICAgICAgIHZhciBzdGFydCA9IGluZGV4IC0gc3RhcnRCeXRlcztcbiAgICAgICAgXG4gICAgICAgIGlmIChzdGFydCArIGhvd01hbnkgPCBidWZmZXJzW2lpXS5sZW5ndGgpIHtcbiAgICAgICAgICAgIHJlbW92ZWQucHVzaChidWZmZXJzW2lpXS5zbGljZShzdGFydCwgc3RhcnQgKyBob3dNYW55KSk7XG4gICAgICAgICAgICBcbiAgICAgICAgICAgIHZhciBvcmlnID0gYnVmZmVyc1tpaV07XG4gICAgICAgICAgICAvL3ZhciBidWYgPSBuZXcgQnVmZmVyKG9yaWcubGVuZ3RoIC0gaG93TWFueSk7XG4gICAgICAgICAgICB2YXIgYnVmMCA9IG5ldyBCdWZmZXIoc3RhcnQpO1xuICAgICAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBzdGFydDsgaSsrKSB7XG4gICAgICAgICAgICAgICAgYnVmMFtpXSA9IG9yaWdbaV07XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBcbiAgICAgICAgICAgIHZhciBidWYxID0gbmV3IEJ1ZmZlcihvcmlnLmxlbmd0aCAtIHN0YXJ0IC0gaG93TWFueSk7XG4gICAgICAgICAgICBmb3IgKHZhciBpID0gc3RhcnQgKyBob3dNYW55OyBpIDwgb3JpZy5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgICAgIGJ1ZjFbIGkgLSBob3dNYW55IC0gc3RhcnQgXSA9IG9yaWdbaV1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIFxuICAgICAgICAgICAgaWYgKHJlcHMubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgICAgIHZhciByZXBzXyA9IHJlcHMuc2xpY2UoKTtcbiAgICAgICAgICAgICAgICByZXBzXy51bnNoaWZ0KGJ1ZjApO1xuICAgICAgICAgICAgICAgIHJlcHNfLnB1c2goYnVmMSk7XG4gICAgICAgICAgICAgICAgYnVmZmVycy5zcGxpY2UuYXBwbHkoYnVmZmVycywgWyBpaSwgMSBdLmNvbmNhdChyZXBzXykpO1xuICAgICAgICAgICAgICAgIGlpICs9IHJlcHNfLmxlbmd0aDtcbiAgICAgICAgICAgICAgICByZXBzID0gW107XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICBidWZmZXJzLnNwbGljZShpaSwgMSwgYnVmMCwgYnVmMSk7XG4gICAgICAgICAgICAgICAgLy9idWZmZXJzW2lpXSA9IGJ1ZjtcbiAgICAgICAgICAgICAgICBpaSArPSAyO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgcmVtb3ZlZC5wdXNoKGJ1ZmZlcnNbaWldLnNsaWNlKHN0YXJ0KSk7XG4gICAgICAgICAgICBidWZmZXJzW2lpXSA9IGJ1ZmZlcnNbaWldLnNsaWNlKDAsIHN0YXJ0KTtcbiAgICAgICAgICAgIGlpICsrO1xuICAgICAgICB9XG4gICAgfVxuICAgIFxuICAgIGlmIChyZXBzLmxlbmd0aCA+IDApIHtcbiAgICAgICAgYnVmZmVycy5zcGxpY2UuYXBwbHkoYnVmZmVycywgWyBpaSwgMCBdLmNvbmNhdChyZXBzKSk7XG4gICAgICAgIGlpICs9IHJlcHMubGVuZ3RoO1xuICAgIH1cbiAgICBcbiAgICB3aGlsZSAocmVtb3ZlZC5sZW5ndGggPCBob3dNYW55KSB7XG4gICAgICAgIHZhciBidWYgPSBidWZmZXJzW2lpXTtcbiAgICAgICAgdmFyIGxlbiA9IGJ1Zi5sZW5ndGg7XG4gICAgICAgIHZhciB0YWtlID0gTWF0aC5taW4obGVuLCBob3dNYW55IC0gcmVtb3ZlZC5sZW5ndGgpO1xuICAgICAgICBcbiAgICAgICAgaWYgKHRha2UgPT09IGxlbikge1xuICAgICAgICAgICAgcmVtb3ZlZC5wdXNoKGJ1Zik7XG4gICAgICAgICAgICBidWZmZXJzLnNwbGljZShpaSwgMSk7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICByZW1vdmVkLnB1c2goYnVmLnNsaWNlKDAsIHRha2UpKTtcbiAgICAgICAgICAgIGJ1ZmZlcnNbaWldID0gYnVmZmVyc1tpaV0uc2xpY2UodGFrZSk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgXG4gICAgdGhpcy5sZW5ndGggLT0gcmVtb3ZlZC5sZW5ndGg7XG4gICAgXG4gICAgcmV0dXJuIHJlbW92ZWQ7XG59O1xuIFxuQnVmZmVycy5wcm90b3R5cGUuc2xpY2UgPSBmdW5jdGlvbiAoaSwgaikge1xuICAgIHZhciBidWZmZXJzID0gdGhpcy5idWZmZXJzO1xuICAgIGlmIChqID09PSB1bmRlZmluZWQpIGogPSB0aGlzLmxlbmd0aDtcbiAgICBpZiAoaSA9PT0gdW5kZWZpbmVkKSBpID0gMDtcbiAgICBcbiAgICBpZiAoaiA+IHRoaXMubGVuZ3RoKSBqID0gdGhpcy5sZW5ndGg7XG4gICAgXG4gICAgdmFyIHN0YXJ0Qnl0ZXMgPSAwO1xuICAgIGZvciAoXG4gICAgICAgIHZhciBzaSA9IDA7XG4gICAgICAgIHNpIDwgYnVmZmVycy5sZW5ndGggJiYgc3RhcnRCeXRlcyArIGJ1ZmZlcnNbc2ldLmxlbmd0aCA8PSBpO1xuICAgICAgICBzaSArK1xuICAgICkgeyBzdGFydEJ5dGVzICs9IGJ1ZmZlcnNbc2ldLmxlbmd0aCB9XG4gICAgXG4gICAgdmFyIHRhcmdldCA9IG5ldyBCdWZmZXIoaiAtIGkpO1xuICAgIFxuICAgIHZhciB0aSA9IDA7XG4gICAgZm9yICh2YXIgaWkgPSBzaTsgdGkgPCBqIC0gaSAmJiBpaSA8IGJ1ZmZlcnMubGVuZ3RoOyBpaSsrKSB7XG4gICAgICAgIHZhciBsZW4gPSBidWZmZXJzW2lpXS5sZW5ndGg7XG4gICAgICAgIFxuICAgICAgICB2YXIgc3RhcnQgPSB0aSA9PT0gMCA/IGkgLSBzdGFydEJ5dGVzIDogMDtcbiAgICAgICAgdmFyIGVuZCA9IHRpICsgbGVuID49IGogLSBpXG4gICAgICAgICAgICA/IE1hdGgubWluKHN0YXJ0ICsgKGogLSBpKSAtIHRpLCBsZW4pXG4gICAgICAgICAgICA6IGxlblxuICAgICAgICA7XG4gICAgICAgIFxuICAgICAgICBidWZmZXJzW2lpXS5jb3B5KHRhcmdldCwgdGksIHN0YXJ0LCBlbmQpO1xuICAgICAgICB0aSArPSBlbmQgLSBzdGFydDtcbiAgICB9XG4gICAgXG4gICAgcmV0dXJuIHRhcmdldDtcbn07XG5cbkJ1ZmZlcnMucHJvdG90eXBlLnBvcyA9IGZ1bmN0aW9uIChpKSB7XG4gICAgaWYgKGkgPCAwIHx8IGkgPj0gdGhpcy5sZW5ndGgpIHRocm93IG5ldyBFcnJvcignb29iJyk7XG4gICAgdmFyIGwgPSBpLCBiaSA9IDAsIGJ1ID0gbnVsbDtcbiAgICBmb3IgKDs7KSB7XG4gICAgICAgIGJ1ID0gdGhpcy5idWZmZXJzW2JpXTtcbiAgICAgICAgaWYgKGwgPCBidS5sZW5ndGgpIHtcbiAgICAgICAgICAgIHJldHVybiB7YnVmOiBiaSwgb2Zmc2V0OiBsfTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGwgLT0gYnUubGVuZ3RoO1xuICAgICAgICB9XG4gICAgICAgIGJpKys7XG4gICAgfVxufTtcblxuQnVmZmVycy5wcm90b3R5cGUuZ2V0ID0gZnVuY3Rpb24gZ2V0IChpKSB7XG4gICAgdmFyIHBvcyA9IHRoaXMucG9zKGkpO1xuXG4gICAgcmV0dXJuIHRoaXMuYnVmZmVyc1twb3MuYnVmXS5nZXQocG9zLm9mZnNldCk7XG59O1xuXG5CdWZmZXJzLnByb3RvdHlwZS5zZXQgPSBmdW5jdGlvbiBzZXQgKGksIGIpIHtcbiAgICB2YXIgcG9zID0gdGhpcy5wb3MoaSk7XG5cbiAgICByZXR1cm4gdGhpcy5idWZmZXJzW3Bvcy5idWZdLnNldChwb3Mub2Zmc2V0LCBiKTtcbn07XG5cbkJ1ZmZlcnMucHJvdG90eXBlLmluZGV4T2YgPSBmdW5jdGlvbiAobmVlZGxlLCBvZmZzZXQpIHtcbiAgICBpZiAoXCJzdHJpbmdcIiA9PT0gdHlwZW9mIG5lZWRsZSkge1xuICAgICAgICBuZWVkbGUgPSBuZXcgQnVmZmVyKG5lZWRsZSk7XG4gICAgfSBlbHNlIGlmIChuZWVkbGUgaW5zdGFuY2VvZiBCdWZmZXIpIHtcbiAgICAgICAgLy8gYWxyZWFkeSBhIGJ1ZmZlclxuICAgIH0gZWxzZSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcignSW52YWxpZCB0eXBlIGZvciBhIHNlYXJjaCBzdHJpbmcnKTtcbiAgICB9XG5cbiAgICBpZiAoIW5lZWRsZS5sZW5ndGgpIHtcbiAgICAgICAgcmV0dXJuIDA7XG4gICAgfVxuXG4gICAgaWYgKCF0aGlzLmxlbmd0aCkge1xuICAgICAgICByZXR1cm4gLTE7XG4gICAgfVxuXG4gICAgdmFyIGkgPSAwLCBqID0gMCwgbWF0Y2ggPSAwLCBtc3RhcnQsIHBvcyA9IDA7XG5cbiAgICAvLyBzdGFydCBzZWFyY2ggZnJvbSBhIHBhcnRpY3VsYXIgcG9pbnQgaW4gdGhlIHZpcnR1YWwgYnVmZmVyXG4gICAgaWYgKG9mZnNldCkge1xuICAgICAgICB2YXIgcCA9IHRoaXMucG9zKG9mZnNldCk7XG4gICAgICAgIGkgPSBwLmJ1ZjtcbiAgICAgICAgaiA9IHAub2Zmc2V0O1xuICAgICAgICBwb3MgPSBvZmZzZXQ7XG4gICAgfVxuXG4gICAgLy8gZm9yIGVhY2ggY2hhcmFjdGVyIGluIHZpcnR1YWwgYnVmZmVyXG4gICAgZm9yICg7Oykge1xuICAgICAgICB3aGlsZSAoaiA+PSB0aGlzLmJ1ZmZlcnNbaV0ubGVuZ3RoKSB7XG4gICAgICAgICAgICBqID0gMDtcbiAgICAgICAgICAgIGkrKztcblxuICAgICAgICAgICAgaWYgKGkgPj0gdGhpcy5idWZmZXJzLmxlbmd0aCkge1xuICAgICAgICAgICAgICAgIC8vIHNlYXJjaCBzdHJpbmcgbm90IGZvdW5kXG4gICAgICAgICAgICAgICAgcmV0dXJuIC0xO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgdmFyIGNoYXIgPSB0aGlzLmJ1ZmZlcnNbaV1bal07XG5cbiAgICAgICAgaWYgKGNoYXIgPT0gbmVlZGxlW21hdGNoXSkge1xuICAgICAgICAgICAgLy8ga2VlcCB0cmFjayB3aGVyZSBtYXRjaCBzdGFydGVkXG4gICAgICAgICAgICBpZiAobWF0Y2ggPT0gMCkge1xuICAgICAgICAgICAgICAgIG1zdGFydCA9IHtcbiAgICAgICAgICAgICAgICAgICAgaTogaSxcbiAgICAgICAgICAgICAgICAgICAgajogaixcbiAgICAgICAgICAgICAgICAgICAgcG9zOiBwb3NcbiAgICAgICAgICAgICAgICB9O1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgbWF0Y2grKztcbiAgICAgICAgICAgIGlmIChtYXRjaCA9PSBuZWVkbGUubGVuZ3RoKSB7XG4gICAgICAgICAgICAgICAgLy8gZnVsbCBtYXRjaFxuICAgICAgICAgICAgICAgIHJldHVybiBtc3RhcnQucG9zO1xuICAgICAgICAgICAgfVxuICAgICAgICB9IGVsc2UgaWYgKG1hdGNoICE9IDApIHtcbiAgICAgICAgICAgIC8vIGEgcGFydGlhbCBtYXRjaCBlbmRlZCwgZ28gYmFjayB0byBtYXRjaCBzdGFydGluZyBwb3NpdGlvblxuICAgICAgICAgICAgLy8gdGhpcyB3aWxsIGNvbnRpbnVlIHRoZSBzZWFyY2ggYXQgdGhlIG5leHQgY2hhcmFjdGVyXG4gICAgICAgICAgICBpID0gbXN0YXJ0Lmk7XG4gICAgICAgICAgICBqID0gbXN0YXJ0Lmo7XG4gICAgICAgICAgICBwb3MgPSBtc3RhcnQucG9zO1xuICAgICAgICAgICAgbWF0Y2ggPSAwO1xuICAgICAgICB9XG5cbiAgICAgICAgaisrO1xuICAgICAgICBwb3MrKztcbiAgICB9XG59O1xuXG5CdWZmZXJzLnByb3RvdHlwZS50b0J1ZmZlciA9IGZ1bmN0aW9uKCkge1xuICAgIHJldHVybiB0aGlzLnNsaWNlKCk7XG59XG5cbkJ1ZmZlcnMucHJvdG90eXBlLnRvU3RyaW5nID0gZnVuY3Rpb24oZW5jb2RpbmcsIHN0YXJ0LCBlbmQpIHtcbiAgICByZXR1cm4gdGhpcy5zbGljZShzdGFydCwgZW5kKS50b1N0cmluZyhlbmNvZGluZyk7XG59XG4iLAogICAgIm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gKHN0b3JlKSB7XG4gICAgZnVuY3Rpb24gZ2V0c2V0IChuYW1lLCB2YWx1ZSkge1xuICAgICAgICB2YXIgbm9kZSA9IHZhcnMuc3RvcmU7XG4gICAgICAgIHZhciBrZXlzID0gbmFtZS5zcGxpdCgnLicpO1xuICAgICAgICBrZXlzLnNsaWNlKDAsLTEpLmZvckVhY2goZnVuY3Rpb24gKGspIHtcbiAgICAgICAgICAgIGlmIChub2RlW2tdID09PSB1bmRlZmluZWQpIG5vZGVba10gPSB7fTtcbiAgICAgICAgICAgIG5vZGUgPSBub2RlW2tdXG4gICAgICAgIH0pO1xuICAgICAgICB2YXIga2V5ID0ga2V5c1trZXlzLmxlbmd0aCAtIDFdO1xuICAgICAgICBpZiAoYXJndW1lbnRzLmxlbmd0aCA9PSAxKSB7XG4gICAgICAgICAgICByZXR1cm4gbm9kZVtrZXldO1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgcmV0dXJuIG5vZGVba2V5XSA9IHZhbHVlO1xuICAgICAgICB9XG4gICAgfVxuICAgIFxuICAgIHZhciB2YXJzID0ge1xuICAgICAgICBnZXQgOiBmdW5jdGlvbiAobmFtZSkge1xuICAgICAgICAgICAgcmV0dXJuIGdldHNldChuYW1lKTtcbiAgICAgICAgfSxcbiAgICAgICAgc2V0IDogZnVuY3Rpb24gKG5hbWUsIHZhbHVlKSB7XG4gICAgICAgICAgICByZXR1cm4gZ2V0c2V0KG5hbWUsIHZhbHVlKTtcbiAgICAgICAgfSxcbiAgICAgICAgc3RvcmUgOiBzdG9yZSB8fCB7fSxcbiAgICB9O1xuICAgIHJldHVybiB2YXJzO1xufTtcbiIsCiAgICAidmFyIENoYWluc2F3ID0gcmVxdWlyZSgnY2hhaW5zYXcnKTtcbnZhciBFdmVudEVtaXR0ZXIgPSByZXF1aXJlKCdldmVudHMnKS5FdmVudEVtaXR0ZXI7XG52YXIgQnVmZmVycyA9IHJlcXVpcmUoJ2J1ZmZlcnMnKTtcbnZhciBWYXJzID0gcmVxdWlyZSgnLi9saWIvdmFycy5qcycpO1xudmFyIFN0cmVhbSA9IHJlcXVpcmUoJ3N0cmVhbScpLlN0cmVhbTtcblxuZXhwb3J0cyA9IG1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gKGJ1Zk9yRW0sIGV2ZW50TmFtZSkge1xuICAgIGlmIChCdWZmZXIuaXNCdWZmZXIoYnVmT3JFbSkpIHtcbiAgICAgICAgcmV0dXJuIGV4cG9ydHMucGFyc2UoYnVmT3JFbSk7XG4gICAgfVxuICAgIFxuICAgIHZhciBzID0gZXhwb3J0cy5zdHJlYW0oKTtcbiAgICBpZiAoYnVmT3JFbSAmJiBidWZPckVtLnBpcGUpIHtcbiAgICAgICAgYnVmT3JFbS5waXBlKHMpO1xuICAgIH1cbiAgICBlbHNlIGlmIChidWZPckVtKSB7XG4gICAgICAgIGJ1Zk9yRW0ub24oZXZlbnROYW1lIHx8ICdkYXRhJywgZnVuY3Rpb24gKGJ1Zikge1xuICAgICAgICAgICAgcy53cml0ZShidWYpO1xuICAgICAgICB9KTtcbiAgICAgICAgXG4gICAgICAgIGJ1Zk9yRW0ub24oJ2VuZCcsIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgIHMuZW5kKCk7XG4gICAgICAgIH0pO1xuICAgIH1cbiAgICByZXR1cm4gcztcbn07XG5cbmV4cG9ydHMuc3RyZWFtID0gZnVuY3Rpb24gKGlucHV0KSB7XG4gICAgaWYgKGlucHV0KSByZXR1cm4gZXhwb3J0cy5hcHBseShudWxsLCBhcmd1bWVudHMpO1xuICAgIFxuICAgIHZhciBwZW5kaW5nID0gbnVsbDtcbiAgICBmdW5jdGlvbiBnZXRCeXRlcyAoYnl0ZXMsIGNiLCBza2lwKSB7XG4gICAgICAgIHBlbmRpbmcgPSB7XG4gICAgICAgICAgICBieXRlcyA6IGJ5dGVzLFxuICAgICAgICAgICAgc2tpcCA6IHNraXAsXG4gICAgICAgICAgICBjYiA6IGZ1bmN0aW9uIChidWYpIHtcbiAgICAgICAgICAgICAgICBwZW5kaW5nID0gbnVsbDtcbiAgICAgICAgICAgICAgICBjYihidWYpO1xuICAgICAgICAgICAgfSxcbiAgICAgICAgfTtcbiAgICAgICAgZGlzcGF0Y2goKTtcbiAgICB9XG4gICAgXG4gICAgdmFyIG9mZnNldCA9IG51bGw7XG4gICAgZnVuY3Rpb24gZGlzcGF0Y2ggKCkge1xuICAgICAgICBpZiAoIXBlbmRpbmcpIHtcbiAgICAgICAgICAgIGlmIChjYXVnaHRFbmQpIGRvbmUgPSB0cnVlO1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIGlmICh0eXBlb2YgcGVuZGluZyA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICAgICAgcGVuZGluZygpO1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgdmFyIGJ5dGVzID0gb2Zmc2V0ICsgcGVuZGluZy5ieXRlcztcbiAgICAgICAgICAgIFxuICAgICAgICAgICAgaWYgKGJ1ZmZlcnMubGVuZ3RoID49IGJ5dGVzKSB7XG4gICAgICAgICAgICAgICAgdmFyIGJ1ZjtcbiAgICAgICAgICAgICAgICBpZiAob2Zmc2V0ID09IG51bGwpIHtcbiAgICAgICAgICAgICAgICAgICAgYnVmID0gYnVmZmVycy5zcGxpY2UoMCwgYnl0ZXMpO1xuICAgICAgICAgICAgICAgICAgICBpZiAoIXBlbmRpbmcuc2tpcCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgYnVmID0gYnVmLnNsaWNlKCk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIGlmICghcGVuZGluZy5za2lwKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBidWYgPSBidWZmZXJzLnNsaWNlKG9mZnNldCwgYnl0ZXMpO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIG9mZnNldCA9IGJ5dGVzO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBcbiAgICAgICAgICAgICAgICBpZiAocGVuZGluZy5za2lwKSB7XG4gICAgICAgICAgICAgICAgICAgIHBlbmRpbmcuY2IoKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIHBlbmRpbmcuY2IoYnVmKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG4gICAgXG4gICAgZnVuY3Rpb24gYnVpbGRlciAoc2F3KSB7XG4gICAgICAgIGZ1bmN0aW9uIG5leHQgKCkgeyBpZiAoIWRvbmUpIHNhdy5uZXh0KCkgfVxuICAgICAgICBcbiAgICAgICAgdmFyIHNlbGYgPSB3b3JkcyhmdW5jdGlvbiAoYnl0ZXMsIGNiKSB7XG4gICAgICAgICAgICByZXR1cm4gZnVuY3Rpb24gKG5hbWUpIHtcbiAgICAgICAgICAgICAgICBnZXRCeXRlcyhieXRlcywgZnVuY3Rpb24gKGJ1Zikge1xuICAgICAgICAgICAgICAgICAgICB2YXJzLnNldChuYW1lLCBjYihidWYpKTtcbiAgICAgICAgICAgICAgICAgICAgbmV4dCgpO1xuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgfTtcbiAgICAgICAgfSk7XG4gICAgICAgIFxuICAgICAgICBzZWxmLnRhcCA9IGZ1bmN0aW9uIChjYikge1xuICAgICAgICAgICAgc2F3Lm5lc3QoY2IsIHZhcnMuc3RvcmUpO1xuICAgICAgICB9O1xuICAgICAgICBcbiAgICAgICAgc2VsZi5pbnRvID0gZnVuY3Rpb24gKGtleSwgY2IpIHtcbiAgICAgICAgICAgIGlmICghdmFycy5nZXQoa2V5KSkgdmFycy5zZXQoa2V5LCB7fSk7XG4gICAgICAgICAgICB2YXIgcGFyZW50ID0gdmFycztcbiAgICAgICAgICAgIHZhcnMgPSBWYXJzKHBhcmVudC5nZXQoa2V5KSk7XG4gICAgICAgICAgICBcbiAgICAgICAgICAgIHNhdy5uZXN0KGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgICAgICBjYi5hcHBseSh0aGlzLCBhcmd1bWVudHMpO1xuICAgICAgICAgICAgICAgIHRoaXMudGFwKGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgICAgICAgICAgdmFycyA9IHBhcmVudDtcbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIH0sIHZhcnMuc3RvcmUpO1xuICAgICAgICB9O1xuICAgICAgICBcbiAgICAgICAgc2VsZi5mbHVzaCA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgIHZhcnMuc3RvcmUgPSB7fTtcbiAgICAgICAgICAgIG5leHQoKTtcbiAgICAgICAgfTtcbiAgICAgICAgXG4gICAgICAgIHNlbGYubG9vcCA9IGZ1bmN0aW9uIChjYikge1xuICAgICAgICAgICAgdmFyIGVuZCA9IGZhbHNlO1xuICAgICAgICAgICAgXG4gICAgICAgICAgICBzYXcubmVzdChmYWxzZSwgZnVuY3Rpb24gbG9vcCAoKSB7XG4gICAgICAgICAgICAgICAgdGhpcy52YXJzID0gdmFycy5zdG9yZTtcbiAgICAgICAgICAgICAgICBjYi5jYWxsKHRoaXMsIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgICAgICAgICAgZW5kID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICAgICAgbmV4dCgpO1xuICAgICAgICAgICAgICAgIH0sIHZhcnMuc3RvcmUpO1xuICAgICAgICAgICAgICAgIHRoaXMudGFwKGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKGVuZCkgc2F3Lm5leHQoKVxuICAgICAgICAgICAgICAgICAgICBlbHNlIGxvb3AuY2FsbCh0aGlzKVxuICAgICAgICAgICAgICAgIH0uYmluZCh0aGlzKSk7XG4gICAgICAgICAgICB9LCB2YXJzLnN0b3JlKTtcbiAgICAgICAgfTtcbiAgICAgICAgXG4gICAgICAgIHNlbGYuYnVmZmVyID0gZnVuY3Rpb24gKG5hbWUsIGJ5dGVzKSB7XG4gICAgICAgICAgICBpZiAodHlwZW9mIGJ5dGVzID09PSAnc3RyaW5nJykge1xuICAgICAgICAgICAgICAgIGJ5dGVzID0gdmFycy5nZXQoYnl0ZXMpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgXG4gICAgICAgICAgICBnZXRCeXRlcyhieXRlcywgZnVuY3Rpb24gKGJ1Zikge1xuICAgICAgICAgICAgICAgIHZhcnMuc2V0KG5hbWUsIGJ1Zik7XG4gICAgICAgICAgICAgICAgbmV4dCgpO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgIH07XG4gICAgICAgIFxuICAgICAgICBzZWxmLnNraXAgPSBmdW5jdGlvbiAoYnl0ZXMpIHtcbiAgICAgICAgICAgIGlmICh0eXBlb2YgYnl0ZXMgPT09ICdzdHJpbmcnKSB7XG4gICAgICAgICAgICAgICAgYnl0ZXMgPSB2YXJzLmdldChieXRlcyk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBcbiAgICAgICAgICAgIGdldEJ5dGVzKGJ5dGVzLCBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICAgICAgbmV4dCgpO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgIH07XG4gICAgICAgIFxuICAgICAgICBzZWxmLnNjYW4gPSBmdW5jdGlvbiBmaW5kIChuYW1lLCBzZWFyY2gpIHtcbiAgICAgICAgICAgIGlmICh0eXBlb2Ygc2VhcmNoID09PSAnc3RyaW5nJykge1xuICAgICAgICAgICAgICAgIHNlYXJjaCA9IG5ldyBCdWZmZXIoc2VhcmNoKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2UgaWYgKCFCdWZmZXIuaXNCdWZmZXIoc2VhcmNoKSkge1xuICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcignc2VhcmNoIG11c3QgYmUgYSBCdWZmZXIgb3IgYSBzdHJpbmcnKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIFxuICAgICAgICAgICAgdmFyIHRha2VuID0gMDtcbiAgICAgICAgICAgIHBlbmRpbmcgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICAgICAgdmFyIHBvcyA9IGJ1ZmZlcnMuaW5kZXhPZihzZWFyY2gsIG9mZnNldCArIHRha2VuKTtcbiAgICAgICAgICAgICAgICB2YXIgaSA9IHBvcy1vZmZzZXQtdGFrZW47XG4gICAgICAgICAgICAgICAgaWYgKHBvcyAhPT0gLTEpIHtcbiAgICAgICAgICAgICAgICAgICAgcGVuZGluZyA9IG51bGw7XG4gICAgICAgICAgICAgICAgICAgIGlmIChvZmZzZXQgIT0gbnVsbCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgdmFycy5zZXQoXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgbmFtZSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBidWZmZXJzLnNsaWNlKG9mZnNldCwgb2Zmc2V0ICsgdGFrZW4gKyBpKVxuICAgICAgICAgICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIG9mZnNldCArPSB0YWtlbiArIGkgKyBzZWFyY2gubGVuZ3RoO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgdmFycy5zZXQoXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgbmFtZSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBidWZmZXJzLnNsaWNlKDAsIHRha2VuICsgaSlcbiAgICAgICAgICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgICAgICAgICAgICBidWZmZXJzLnNwbGljZSgwLCB0YWtlbiArIGkgKyBzZWFyY2gubGVuZ3RoKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBuZXh0KCk7XG4gICAgICAgICAgICAgICAgICAgIGRpc3BhdGNoKCk7XG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgaSA9IE1hdGgubWF4KGJ1ZmZlcnMubGVuZ3RoIC0gc2VhcmNoLmxlbmd0aCAtIG9mZnNldCAtIHRha2VuLCAwKTtcblx0XHRcdFx0fVxuICAgICAgICAgICAgICAgIHRha2VuICs9IGk7XG4gICAgICAgICAgICB9O1xuICAgICAgICAgICAgZGlzcGF0Y2goKTtcbiAgICAgICAgfTtcbiAgICAgICAgXG4gICAgICAgIHNlbGYucGVlayA9IGZ1bmN0aW9uIChjYikge1xuICAgICAgICAgICAgb2Zmc2V0ID0gMDtcbiAgICAgICAgICAgIHNhdy5uZXN0KGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgICAgICBjYi5jYWxsKHRoaXMsIHZhcnMuc3RvcmUpO1xuICAgICAgICAgICAgICAgIHRoaXMudGFwKGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgICAgICAgICAgb2Zmc2V0ID0gbnVsbDtcbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9O1xuICAgICAgICBcbiAgICAgICAgcmV0dXJuIHNlbGY7XG4gICAgfTtcbiAgICBcbiAgICB2YXIgc3RyZWFtID0gQ2hhaW5zYXcubGlnaHQoYnVpbGRlcik7XG4gICAgc3RyZWFtLndyaXRhYmxlID0gdHJ1ZTtcbiAgICBcbiAgICB2YXIgYnVmZmVycyA9IEJ1ZmZlcnMoKTtcbiAgICBcbiAgICBzdHJlYW0ud3JpdGUgPSBmdW5jdGlvbiAoYnVmKSB7XG4gICAgICAgIGJ1ZmZlcnMucHVzaChidWYpO1xuICAgICAgICBkaXNwYXRjaCgpO1xuICAgIH07XG4gICAgXG4gICAgdmFyIHZhcnMgPSBWYXJzKCk7XG4gICAgXG4gICAgdmFyIGRvbmUgPSBmYWxzZSwgY2F1Z2h0RW5kID0gZmFsc2U7XG4gICAgc3RyZWFtLmVuZCA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgY2F1Z2h0RW5kID0gdHJ1ZTtcbiAgICB9O1xuICAgIFxuICAgIHN0cmVhbS5waXBlID0gU3RyZWFtLnByb3RvdHlwZS5waXBlO1xuICAgIE9iamVjdC5nZXRPd25Qcm9wZXJ0eU5hbWVzKEV2ZW50RW1pdHRlci5wcm90b3R5cGUpLmZvckVhY2goZnVuY3Rpb24gKG5hbWUpIHtcbiAgICAgICAgc3RyZWFtW25hbWVdID0gRXZlbnRFbWl0dGVyLnByb3RvdHlwZVtuYW1lXTtcbiAgICB9KTtcbiAgICBcbiAgICByZXR1cm4gc3RyZWFtO1xufTtcblxuZXhwb3J0cy5wYXJzZSA9IGZ1bmN0aW9uIHBhcnNlIChidWZmZXIpIHtcbiAgICB2YXIgc2VsZiA9IHdvcmRzKGZ1bmN0aW9uIChieXRlcywgY2IpIHtcbiAgICAgICAgcmV0dXJuIGZ1bmN0aW9uIChuYW1lKSB7XG4gICAgICAgICAgICBpZiAob2Zmc2V0ICsgYnl0ZXMgPD0gYnVmZmVyLmxlbmd0aCkge1xuICAgICAgICAgICAgICAgIHZhciBidWYgPSBidWZmZXIuc2xpY2Uob2Zmc2V0LCBvZmZzZXQgKyBieXRlcyk7XG4gICAgICAgICAgICAgICAgb2Zmc2V0ICs9IGJ5dGVzO1xuICAgICAgICAgICAgICAgIHZhcnMuc2V0KG5hbWUsIGNiKGJ1ZikpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgdmFycy5zZXQobmFtZSwgbnVsbCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4gc2VsZjtcbiAgICAgICAgfTtcbiAgICB9KTtcbiAgICBcbiAgICB2YXIgb2Zmc2V0ID0gMDtcbiAgICB2YXIgdmFycyA9IFZhcnMoKTtcbiAgICBzZWxmLnZhcnMgPSB2YXJzLnN0b3JlO1xuICAgIFxuICAgIHNlbGYudGFwID0gZnVuY3Rpb24gKGNiKSB7XG4gICAgICAgIGNiLmNhbGwoc2VsZiwgdmFycy5zdG9yZSk7XG4gICAgICAgIHJldHVybiBzZWxmO1xuICAgIH07XG4gICAgXG4gICAgc2VsZi5pbnRvID0gZnVuY3Rpb24gKGtleSwgY2IpIHtcbiAgICAgICAgaWYgKCF2YXJzLmdldChrZXkpKSB7XG4gICAgICAgICAgICB2YXJzLnNldChrZXksIHt9KTtcbiAgICAgICAgfVxuICAgICAgICB2YXIgcGFyZW50ID0gdmFycztcbiAgICAgICAgdmFycyA9IFZhcnMocGFyZW50LmdldChrZXkpKTtcbiAgICAgICAgY2IuY2FsbChzZWxmLCB2YXJzLnN0b3JlKTtcbiAgICAgICAgdmFycyA9IHBhcmVudDtcbiAgICAgICAgcmV0dXJuIHNlbGY7XG4gICAgfTtcbiAgICBcbiAgICBzZWxmLmxvb3AgPSBmdW5jdGlvbiAoY2IpIHtcbiAgICAgICAgdmFyIGVuZCA9IGZhbHNlO1xuICAgICAgICB2YXIgZW5kZXIgPSBmdW5jdGlvbiAoKSB7IGVuZCA9IHRydWUgfTtcbiAgICAgICAgd2hpbGUgKGVuZCA9PT0gZmFsc2UpIHtcbiAgICAgICAgICAgIGNiLmNhbGwoc2VsZiwgZW5kZXIsIHZhcnMuc3RvcmUpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBzZWxmO1xuICAgIH07XG4gICAgXG4gICAgc2VsZi5idWZmZXIgPSBmdW5jdGlvbiAobmFtZSwgc2l6ZSkge1xuICAgICAgICBpZiAodHlwZW9mIHNpemUgPT09ICdzdHJpbmcnKSB7XG4gICAgICAgICAgICBzaXplID0gdmFycy5nZXQoc2l6ZSk7XG4gICAgICAgIH1cbiAgICAgICAgdmFyIGJ1ZiA9IGJ1ZmZlci5zbGljZShvZmZzZXQsIE1hdGgubWluKGJ1ZmZlci5sZW5ndGgsIG9mZnNldCArIHNpemUpKTtcbiAgICAgICAgb2Zmc2V0ICs9IHNpemU7XG4gICAgICAgIHZhcnMuc2V0KG5hbWUsIGJ1Zik7XG4gICAgICAgIFxuICAgICAgICByZXR1cm4gc2VsZjtcbiAgICB9O1xuICAgIFxuICAgIHNlbGYuc2tpcCA9IGZ1bmN0aW9uIChieXRlcykge1xuICAgICAgICBpZiAodHlwZW9mIGJ5dGVzID09PSAnc3RyaW5nJykge1xuICAgICAgICAgICAgYnl0ZXMgPSB2YXJzLmdldChieXRlcyk7XG4gICAgICAgIH1cbiAgICAgICAgb2Zmc2V0ICs9IGJ5dGVzO1xuICAgICAgICBcbiAgICAgICAgcmV0dXJuIHNlbGY7XG4gICAgfTtcbiAgICBcbiAgICBzZWxmLnNjYW4gPSBmdW5jdGlvbiAobmFtZSwgc2VhcmNoKSB7XG4gICAgICAgIGlmICh0eXBlb2Ygc2VhcmNoID09PSAnc3RyaW5nJykge1xuICAgICAgICAgICAgc2VhcmNoID0gbmV3IEJ1ZmZlcihzZWFyY2gpO1xuICAgICAgICB9XG4gICAgICAgIGVsc2UgaWYgKCFCdWZmZXIuaXNCdWZmZXIoc2VhcmNoKSkge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdzZWFyY2ggbXVzdCBiZSBhIEJ1ZmZlciBvciBhIHN0cmluZycpO1xuICAgICAgICB9XG4gICAgICAgIHZhcnMuc2V0KG5hbWUsIG51bGwpO1xuICAgICAgICBcbiAgICAgICAgLy8gc2ltcGxlIGJ1dCBzbG93IHN0cmluZyBzZWFyY2hcbiAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgKyBvZmZzZXQgPD0gYnVmZmVyLmxlbmd0aCAtIHNlYXJjaC5sZW5ndGggKyAxOyBpKyspIHtcbiAgICAgICAgICAgIGZvciAoXG4gICAgICAgICAgICAgICAgdmFyIGogPSAwO1xuICAgICAgICAgICAgICAgIGogPCBzZWFyY2gubGVuZ3RoICYmIGJ1ZmZlcltvZmZzZXQraStqXSA9PT0gc2VhcmNoW2pdO1xuICAgICAgICAgICAgICAgIGorK1xuICAgICAgICAgICAgKTtcbiAgICAgICAgICAgIGlmIChqID09PSBzZWFyY2gubGVuZ3RoKSBicmVhaztcbiAgICAgICAgfVxuICAgICAgICBcbiAgICAgICAgdmFycy5zZXQobmFtZSwgYnVmZmVyLnNsaWNlKG9mZnNldCwgb2Zmc2V0ICsgaSkpO1xuICAgICAgICBvZmZzZXQgKz0gaSArIHNlYXJjaC5sZW5ndGg7XG4gICAgICAgIHJldHVybiBzZWxmO1xuICAgIH07XG4gICAgXG4gICAgc2VsZi5wZWVrID0gZnVuY3Rpb24gKGNiKSB7XG4gICAgICAgIHZhciB3YXMgPSBvZmZzZXQ7XG4gICAgICAgIGNiLmNhbGwoc2VsZiwgdmFycy5zdG9yZSk7XG4gICAgICAgIG9mZnNldCA9IHdhcztcbiAgICAgICAgcmV0dXJuIHNlbGY7XG4gICAgfTtcbiAgICBcbiAgICBzZWxmLmZsdXNoID0gZnVuY3Rpb24gKCkge1xuICAgICAgICB2YXJzLnN0b3JlID0ge307XG4gICAgICAgIHJldHVybiBzZWxmO1xuICAgIH07XG4gICAgXG4gICAgc2VsZi5lb2YgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHJldHVybiBvZmZzZXQgPj0gYnVmZmVyLmxlbmd0aDtcbiAgICB9O1xuICAgIFxuICAgIHJldHVybiBzZWxmO1xufTtcblxuLy8gY29udmVydCBieXRlIHN0cmluZ3MgdG8gdW5zaWduZWQgbGl0dGxlIGVuZGlhbiBudW1iZXJzXG5mdW5jdGlvbiBkZWNvZGVMRXUgKGJ5dGVzKSB7XG4gICAgdmFyIGFjYyA9IDA7XG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCBieXRlcy5sZW5ndGg7IGkrKykge1xuICAgICAgICBhY2MgKz0gTWF0aC5wb3coMjU2LGkpICogYnl0ZXNbaV07XG4gICAgfVxuICAgIHJldHVybiBhY2M7XG59XG5cbi8vIGNvbnZlcnQgYnl0ZSBzdHJpbmdzIHRvIHVuc2lnbmVkIGJpZyBlbmRpYW4gbnVtYmVyc1xuZnVuY3Rpb24gZGVjb2RlQkV1IChieXRlcykge1xuICAgIHZhciBhY2MgPSAwO1xuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgYnl0ZXMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgYWNjICs9IE1hdGgucG93KDI1NiwgYnl0ZXMubGVuZ3RoIC0gaSAtIDEpICogYnl0ZXNbaV07XG4gICAgfVxuICAgIHJldHVybiBhY2M7XG59XG5cbi8vIGNvbnZlcnQgYnl0ZSBzdHJpbmdzIHRvIHNpZ25lZCBiaWcgZW5kaWFuIG51bWJlcnNcbmZ1bmN0aW9uIGRlY29kZUJFcyAoYnl0ZXMpIHtcbiAgICB2YXIgdmFsID0gZGVjb2RlQkV1KGJ5dGVzKTtcbiAgICBpZiAoKGJ5dGVzWzBdICYgMHg4MCkgPT0gMHg4MCkge1xuICAgICAgICB2YWwgLT0gTWF0aC5wb3coMjU2LCBieXRlcy5sZW5ndGgpO1xuICAgIH1cbiAgICByZXR1cm4gdmFsO1xufVxuXG4vLyBjb252ZXJ0IGJ5dGUgc3RyaW5ncyB0byBzaWduZWQgbGl0dGxlIGVuZGlhbiBudW1iZXJzXG5mdW5jdGlvbiBkZWNvZGVMRXMgKGJ5dGVzKSB7XG4gICAgdmFyIHZhbCA9IGRlY29kZUxFdShieXRlcyk7XG4gICAgaWYgKChieXRlc1tieXRlcy5sZW5ndGggLSAxXSAmIDB4ODApID09IDB4ODApIHtcbiAgICAgICAgdmFsIC09IE1hdGgucG93KDI1NiwgYnl0ZXMubGVuZ3RoKTtcbiAgICB9XG4gICAgcmV0dXJuIHZhbDtcbn1cblxuZnVuY3Rpb24gd29yZHMgKGRlY29kZSkge1xuICAgIHZhciBzZWxmID0ge307XG4gICAgXG4gICAgWyAxLCAyLCA0LCA4IF0uZm9yRWFjaChmdW5jdGlvbiAoYnl0ZXMpIHtcbiAgICAgICAgdmFyIGJpdHMgPSBieXRlcyAqIDg7XG4gICAgICAgIFxuICAgICAgICBzZWxmWyd3b3JkJyArIGJpdHMgKyAnbGUnXVxuICAgICAgICA9IHNlbGZbJ3dvcmQnICsgYml0cyArICdsdSddXG4gICAgICAgID0gZGVjb2RlKGJ5dGVzLCBkZWNvZGVMRXUpO1xuICAgICAgICBcbiAgICAgICAgc2VsZlsnd29yZCcgKyBiaXRzICsgJ2xzJ11cbiAgICAgICAgPSBkZWNvZGUoYnl0ZXMsIGRlY29kZUxFcyk7XG4gICAgICAgIFxuICAgICAgICBzZWxmWyd3b3JkJyArIGJpdHMgKyAnYmUnXVxuICAgICAgICA9IHNlbGZbJ3dvcmQnICsgYml0cyArICdidSddXG4gICAgICAgID0gZGVjb2RlKGJ5dGVzLCBkZWNvZGVCRXUpO1xuICAgICAgICBcbiAgICAgICAgc2VsZlsnd29yZCcgKyBiaXRzICsgJ2JzJ11cbiAgICAgICAgPSBkZWNvZGUoYnl0ZXMsIGRlY29kZUJFcyk7XG4gICAgfSk7XG4gICAgXG4gICAgLy8gd29yZDhiZShuKSA9PSB3b3JkOGxlKG4pIGZvciBhbGwgblxuICAgIHNlbGYud29yZDggPSBzZWxmLndvcmQ4dSA9IHNlbGYud29yZDhiZTtcbiAgICBzZWxmLndvcmQ4cyA9IHNlbGYud29yZDhicztcbiAgICBcbiAgICByZXR1cm4gc2VsZjtcbn1cbiIsCiAgICAidmFyIFRyYW5zZm9ybSA9IHJlcXVpcmUoJ3N0cmVhbScpLlRyYW5zZm9ybTtcbnZhciB1dGlsID0gcmVxdWlyZSgndXRpbCcpO1xuXG5mdW5jdGlvbiBNYXRjaGVyU3RyZWFtKHBhdHRlcm5EZXNjLCBtYXRjaEZuKSB7XG4gICAgaWYgKCEodGhpcyBpbnN0YW5jZW9mIE1hdGNoZXJTdHJlYW0pKSB7XG4gICAgICAgIHJldHVybiBuZXcgTWF0Y2hlclN0cmVhbSgpO1xuICAgIH1cblxuICAgIFRyYW5zZm9ybS5jYWxsKHRoaXMpO1xuXG4gICAgdmFyIHAgPSB0eXBlb2YgcGF0dGVybkRlc2MgPT09ICdvYmplY3QnID8gcGF0dGVybkRlc2MucGF0dGVybiA6IHBhdHRlcm5EZXNjO1xuXG4gICAgdGhpcy5wYXR0ZXJuID0gQnVmZmVyLmlzQnVmZmVyKHApID8gcCA6IEJ1ZmZlci5mcm9tKHApO1xuICAgIHRoaXMucmVxdWlyZWRMZW5ndGggPSB0aGlzLnBhdHRlcm4ubGVuZ3RoO1xuICAgIGlmIChwYXR0ZXJuRGVzYy5yZXF1aXJlZEV4dHJhU2l6ZSkgdGhpcy5yZXF1aXJlZExlbmd0aCArPSBwYXR0ZXJuRGVzYy5yZXF1aXJlZEV4dHJhU2l6ZTtcblxuICAgIHRoaXMuZGF0YSA9IG5ldyBCdWZmZXIoJycpO1xuICAgIHRoaXMuYnl0ZXNTb0ZhciA9IDA7XG5cbiAgICB0aGlzLm1hdGNoRm4gPSBtYXRjaEZuO1xufVxuXG51dGlsLmluaGVyaXRzKE1hdGNoZXJTdHJlYW0sIFRyYW5zZm9ybSk7XG5cbk1hdGNoZXJTdHJlYW0ucHJvdG90eXBlLmNoZWNrRGF0YUNodW5rID0gZnVuY3Rpb24gKGlnbm9yZU1hdGNoWmVybykge1xuICAgIHZhciBlbm91Z2hEYXRhID0gdGhpcy5kYXRhLmxlbmd0aCA+PSB0aGlzLnJlcXVpcmVkTGVuZ3RoOyAvLyBzdHJpY3QgbW9yZSB0aGFuID9cbiAgICBpZiAoIWVub3VnaERhdGEpIHsgcmV0dXJuOyB9XG5cbiAgICB2YXIgbWF0Y2hJbmRleCA9IHRoaXMuZGF0YS5pbmRleE9mKHRoaXMucGF0dGVybiwgaWdub3JlTWF0Y2haZXJvID8gMSA6IDApO1xuICAgIGlmIChtYXRjaEluZGV4ID49IDAgJiYgbWF0Y2hJbmRleCArIHRoaXMucmVxdWlyZWRMZW5ndGggPiB0aGlzLmRhdGEubGVuZ3RoKSB7XG4gICAgICAgIGlmIChtYXRjaEluZGV4ID4gMCkge1xuICAgICAgICAgICAgdmFyIHBhY2tldCA9IHRoaXMuZGF0YS5zbGljZSgwLCBtYXRjaEluZGV4KTtcbiAgICAgICAgICAgIHRoaXMucHVzaChwYWNrZXQpO1xuICAgICAgICAgICAgdGhpcy5ieXRlc1NvRmFyICs9IG1hdGNoSW5kZXg7XG4gICAgICAgICAgICB0aGlzLmRhdGEgPSB0aGlzLmRhdGEuc2xpY2UobWF0Y2hJbmRleCk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGlmIChtYXRjaEluZGV4ID09PSAtMSkge1xuICAgICAgICB2YXIgcGFja2V0TGVuID0gdGhpcy5kYXRhLmxlbmd0aCAtIHRoaXMucmVxdWlyZWRMZW5ndGggKyAxO1xuXG4gICAgICAgIHZhciBwYWNrZXQgPSB0aGlzLmRhdGEuc2xpY2UoMCwgcGFja2V0TGVuKTtcbiAgICAgICAgdGhpcy5wdXNoKHBhY2tldCk7XG4gICAgICAgIHRoaXMuYnl0ZXNTb0ZhciArPSBwYWNrZXRMZW47XG4gICAgICAgIHRoaXMuZGF0YSA9IHRoaXMuZGF0YS5zbGljZShwYWNrZXRMZW4pO1xuICAgICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgLy8gZm91bmQgbWF0Y2hcbiAgICBpZiAobWF0Y2hJbmRleCA+IDApIHtcbiAgICAgICAgdmFyIHBhY2tldCA9IHRoaXMuZGF0YS5zbGljZSgwLCBtYXRjaEluZGV4KTtcbiAgICAgICAgdGhpcy5kYXRhID0gdGhpcy5kYXRhLnNsaWNlKG1hdGNoSW5kZXgpO1xuICAgICAgICB0aGlzLnB1c2gocGFja2V0KTtcbiAgICAgICAgdGhpcy5ieXRlc1NvRmFyICs9IG1hdGNoSW5kZXg7XG4gICAgfVxuXG4gICAgdmFyIGZpbmlzaGVkID0gdGhpcy5tYXRjaEZuID8gdGhpcy5tYXRjaEZuKHRoaXMuZGF0YSwgdGhpcy5ieXRlc1NvRmFyKSA6IHRydWU7XG4gICAgaWYgKGZpbmlzaGVkKSB7XG4gICAgICAgIHRoaXMuZGF0YSA9IG5ldyBCdWZmZXIoJycpO1xuICAgICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgcmV0dXJuIHRydWU7XG59XG5cbk1hdGNoZXJTdHJlYW0ucHJvdG90eXBlLl90cmFuc2Zvcm0gPSBmdW5jdGlvbiAoY2h1bmssIGVuY29kaW5nLCBjYikge1xuICAgIHRoaXMuZGF0YSA9IEJ1ZmZlci5jb25jYXQoW3RoaXMuZGF0YSwgY2h1bmtdKTtcblxuICAgIHZhciBmaXJzdEl0ZXJhdGlvbiA9IHRydWU7XG4gICAgd2hpbGUgKHRoaXMuY2hlY2tEYXRhQ2h1bmsoIWZpcnN0SXRlcmF0aW9uKSkge1xuICAgICAgICBmaXJzdEl0ZXJhdGlvbiA9IGZhbHNlO1xuICAgIH1cblxuICAgIGNiKCk7XG59XG5cbk1hdGNoZXJTdHJlYW0ucHJvdG90eXBlLl9mbHVzaCA9IGZ1bmN0aW9uIChjYikge1xuICAgIGlmICh0aGlzLmRhdGEubGVuZ3RoID4gMCkge1xuICAgICAgICB2YXIgZmlyc3RJdGVyYXRpb24gPSB0cnVlO1xuICAgICAgICB3aGlsZSAodGhpcy5jaGVja0RhdGFDaHVuayghZmlyc3RJdGVyYXRpb24pKSB7XG4gICAgICAgICAgICBmaXJzdEl0ZXJhdGlvbiA9IGZhbHNlO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgaWYgKHRoaXMuZGF0YS5sZW5ndGggPiAwKSB7XG4gICAgICAgIHRoaXMucHVzaCh0aGlzLmRhdGEpO1xuICAgICAgICB0aGlzLmRhdGEgPSBudWxsO1xuICAgIH1cblxuICAgIGNiKCk7XG59XG5cbm1vZHVsZS5leHBvcnRzID0gTWF0Y2hlclN0cmVhbTsiLAogICAgIid1c2Ugc3RyaWN0JztcblxudmFyIHN0cmVhbSA9IHJlcXVpcmUoJ3N0cmVhbScpO1xudmFyIGluaGVyaXRzID0gcmVxdWlyZSgndXRpbCcpLmluaGVyaXRzO1xuXG5mdW5jdGlvbiBFbnRyeSgpIHtcbiAgICBpZiAoISh0aGlzIGluc3RhbmNlb2YgRW50cnkpKSB7XG4gICAgICAgIHJldHVybiBuZXcgRW50cnkoKTtcbiAgICB9XG5cbiAgICBzdHJlYW0uUGFzc1Rocm91Z2guY2FsbCh0aGlzKTtcblxuICAgIHRoaXMucGF0aCA9IG51bGw7XG4gICAgdGhpcy50eXBlID0gbnVsbDtcbiAgICB0aGlzLmlzRGlyZWN0b3J5ID0gZmFsc2U7XG59XG5cbmluaGVyaXRzKEVudHJ5LCBzdHJlYW0uUGFzc1Rocm91Z2gpO1xuXG5FbnRyeS5wcm90b3R5cGUuYXV0b2RyYWluID0gZnVuY3Rpb24gKCkge1xuICAgIHJldHVybiB0aGlzLnBpcGUobmV3IHN0cmVhbS5UcmFuc2Zvcm0oeyB0cmFuc2Zvcm06IGZ1bmN0aW9uIChkLCBlLCBjYikgeyBjYigpOyB9IH0pKTtcbn1cblxubW9kdWxlLmV4cG9ydHMgPSBFbnRyeTsiLAogICAgIid1c2Ugc3RyaWN0JztcblxudmFyIGJpbmFyeSA9IHJlcXVpcmUoJ2JpbmFyeScpO1xudmFyIHN0cmVhbSA9IHJlcXVpcmUoJ3N0cmVhbScpO1xudmFyIHV0aWwgPSByZXF1aXJlKCd1dGlsJyk7XG52YXIgemxpYiA9IHJlcXVpcmUoJ3psaWInKTtcbnZhciBNYXRjaGVyU3RyZWFtID0gcmVxdWlyZSgnLi9tYXRjaGVyLXN0cmVhbScpO1xudmFyIEVudHJ5ID0gcmVxdWlyZSgnLi9lbnRyeScpO1xuXG5jb25zdCBzdGF0ZXMgPSB7XG4gICAgU1RSRUFNX1NUQVJUOiAgICAgICAgICAgICAgICAgICAgICAgICAwLFxuICAgIFNUQVJUOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMSxcbiAgICBMT0NBTF9GSUxFX0hFQURFUjogICAgICAgICAgICAgICAgICAgIDIsXG4gICAgTE9DQUxfRklMRV9IRUFERVJfU1VGRklYOiAgICAgICAgICAgICAzLFxuICAgIEZJTEVfREFUQTogICAgICAgICAgICAgICAgICAgICAgICAgICAgNCxcbiAgICBGSUxFX0RBVEFfRU5EOiAgICAgICAgICAgICAgICAgICAgICAgIDUsXG4gICAgREFUQV9ERVNDUklQVE9SOiAgICAgICAgICAgICAgICAgICAgICA2LFxuICAgIENFTlRSQUxfRElSRUNUT1JZX0ZJTEVfSEVBREVSOiAgICAgICAgNyxcbiAgICBDRU5UUkFMX0RJUkVDVE9SWV9GSUxFX0hFQURFUl9TVUZGSVg6IDgsXG4gICAgQ0RJUjY0X0VORDogICAgICAgICAgICAgICAgICAgICAgICAgICA5LFxuICAgIENESVI2NF9FTkRfREFUQV9TRUNUT1I6ICAgICAgICAgICAgICAgMTAsXG4gICAgQ0RJUjY0X0xPQ0FUT1I6ICAgICAgICAgICAgICAgICAgICAgICAxMSxcbiAgICBDRU5UUkFMX0RJUkVDVE9SWV9FTkQ6ICAgICAgICAgICAgICAgIDEyLFxuICAgIENFTlRSQUxfRElSRUNUT1JZX0VORF9DT01NRU5UOiAgICAgICAgMTMsXG4gICAgVFJBSUxJTkdfSlVOSzogICAgICAgICAgICAgICAgICAgICAgICAxNCxcblxuICAgIEVSUk9SOiA5OVxufVxuXG5jb25zdCBGT1VSX0dJR1MgPSA0Mjk0OTY3Mjk2O1xuXG5jb25zdCBTSUdfTE9DQUxfRklMRV9IRUFERVIgID0gMHgwNDAzNGI1MDtcbmNvbnN0IFNJR19EQVRBX0RFU0NSSVBUT1IgICAgPSAweDA4MDc0YjUwO1xuY29uc3QgU0lHX0NESVJfUkVDT1JEICAgICAgICA9IDB4MDIwMTRiNTA7XG5jb25zdCBTSUdfQ0RJUjY0X1JFQ09SRF9FTkQgID0gMHgwNjA2NGI1MDtcbmNvbnN0IFNJR19DRElSNjRfTE9DQVRPUl9FTkQgPSAweDA3MDY0YjUwO1xuY29uc3QgU0lHX0NESVJfUkVDT1JEX0VORCAgICA9IDB4MDYwNTRiNTA7XG5cbmZ1bmN0aW9uIFVuemlwU3RyZWFtKG9wdGlvbnMpIHtcbiAgICBpZiAoISh0aGlzIGluc3RhbmNlb2YgVW56aXBTdHJlYW0pKSB7XG4gICAgICAgIHJldHVybiBuZXcgVW56aXBTdHJlYW0ob3B0aW9ucyk7XG4gICAgfVxuXG4gICAgc3RyZWFtLlRyYW5zZm9ybS5jYWxsKHRoaXMpO1xuXG4gICAgdGhpcy5vcHRpb25zID0gb3B0aW9ucyB8fCB7fTtcbiAgICB0aGlzLmRhdGEgPSBuZXcgQnVmZmVyKCcnKTtcbiAgICB0aGlzLnN0YXRlID0gc3RhdGVzLlNUUkVBTV9TVEFSVDtcbiAgICB0aGlzLnNraXBwZWRCeXRlcyA9IDA7XG4gICAgdGhpcy5wYXJzZWRFbnRpdHkgPSBudWxsO1xuICAgIHRoaXMub3V0U3RyZWFtSW5mbyA9IHt9O1xufVxuXG51dGlsLmluaGVyaXRzKFVuemlwU3RyZWFtLCBzdHJlYW0uVHJhbnNmb3JtKTtcblxuVW56aXBTdHJlYW0ucHJvdG90eXBlLnByb2Nlc3NEYXRhQ2h1bmsgPSBmdW5jdGlvbiAoY2h1bmspIHtcbiAgICB2YXIgcmVxdWlyZWRMZW5ndGg7XG5cbiAgICBzd2l0Y2ggKHRoaXMuc3RhdGUpIHtcbiAgICAgICAgY2FzZSBzdGF0ZXMuU1RSRUFNX1NUQVJUOlxuICAgICAgICBjYXNlIHN0YXRlcy5TVEFSVDpcbiAgICAgICAgICAgIHJlcXVpcmVkTGVuZ3RoID0gNDtcbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICBjYXNlIHN0YXRlcy5MT0NBTF9GSUxFX0hFQURFUjpcbiAgICAgICAgICAgIHJlcXVpcmVkTGVuZ3RoID0gMjY7XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgY2FzZSBzdGF0ZXMuTE9DQUxfRklMRV9IRUFERVJfU1VGRklYOlxuICAgICAgICAgICAgcmVxdWlyZWRMZW5ndGggPSB0aGlzLnBhcnNlZEVudGl0eS5maWxlTmFtZUxlbmd0aCArIHRoaXMucGFyc2VkRW50aXR5LmV4dHJhRmllbGRMZW5ndGg7XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgY2FzZSBzdGF0ZXMuREFUQV9ERVNDUklQVE9SOlxuICAgICAgICAgICAgcmVxdWlyZWRMZW5ndGggPSAxMjtcbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICBjYXNlIHN0YXRlcy5DRU5UUkFMX0RJUkVDVE9SWV9GSUxFX0hFQURFUjpcbiAgICAgICAgICAgIHJlcXVpcmVkTGVuZ3RoID0gNDI7XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgY2FzZSBzdGF0ZXMuQ0VOVFJBTF9ESVJFQ1RPUllfRklMRV9IRUFERVJfU1VGRklYOlxuICAgICAgICAgICAgcmVxdWlyZWRMZW5ndGggPSB0aGlzLnBhcnNlZEVudGl0eS5maWxlTmFtZUxlbmd0aCArIHRoaXMucGFyc2VkRW50aXR5LmV4dHJhRmllbGRMZW5ndGggKyB0aGlzLnBhcnNlZEVudGl0eS5maWxlQ29tbWVudExlbmd0aDtcbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICBjYXNlIHN0YXRlcy5DRElSNjRfRU5EOlxuICAgICAgICAgICAgcmVxdWlyZWRMZW5ndGggPSA1MjtcbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICBjYXNlIHN0YXRlcy5DRElSNjRfRU5EX0RBVEFfU0VDVE9SOlxuICAgICAgICAgICAgcmVxdWlyZWRMZW5ndGggPSB0aGlzLnBhcnNlZEVudGl0eS5jZW50cmFsRGlyZWN0b3J5UmVjb3JkU2l6ZSAtIDQ0O1xuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgIGNhc2Ugc3RhdGVzLkNESVI2NF9MT0NBVE9SOlxuICAgICAgICAgICAgcmVxdWlyZWRMZW5ndGggPSAxNjtcbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICBjYXNlIHN0YXRlcy5DRU5UUkFMX0RJUkVDVE9SWV9FTkQ6XG4gICAgICAgICAgICByZXF1aXJlZExlbmd0aCA9IDE4O1xuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgIGNhc2Ugc3RhdGVzLkNFTlRSQUxfRElSRUNUT1JZX0VORF9DT01NRU5UOlxuICAgICAgICAgICAgcmVxdWlyZWRMZW5ndGggPSB0aGlzLnBhcnNlZEVudGl0eS5jb21tZW50TGVuZ3RoO1xuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgIGNhc2Ugc3RhdGVzLkZJTEVfREFUQTpcbiAgICAgICAgICAgIHJldHVybiAwO1xuICAgICAgICBjYXNlIHN0YXRlcy5GSUxFX0RBVEFfRU5EOlxuICAgICAgICAgICAgcmV0dXJuIDA7XG4gICAgICAgIGNhc2Ugc3RhdGVzLlRSQUlMSU5HX0pVTks6XG4gICAgICAgICAgICBpZiAodGhpcy5vcHRpb25zLmRlYnVnKSBjb25zb2xlLmxvZyhcImZvdW5kXCIsIGNodW5rLmxlbmd0aCwgXCJieXRlcyBvZiBUUkFJTElOR19KVU5LXCIpO1xuICAgICAgICAgICAgcmV0dXJuIGNodW5rLmxlbmd0aDtcbiAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICAgIHJldHVybiBjaHVuay5sZW5ndGg7XG4gICAgfVxuXG4gICAgdmFyIGNodW5rTGVuZ3RoID0gY2h1bmsubGVuZ3RoO1xuICAgIGlmIChjaHVua0xlbmd0aCA8IHJlcXVpcmVkTGVuZ3RoKSB7XG4gICAgICAgIHJldHVybiAwO1xuICAgIH1cblxuICAgIHN3aXRjaCAodGhpcy5zdGF0ZSkge1xuICAgICAgICBjYXNlIHN0YXRlcy5TVFJFQU1fU1RBUlQ6XG4gICAgICAgIGNhc2Ugc3RhdGVzLlNUQVJUOlxuICAgICAgICAgICAgdmFyIHNpZ25hdHVyZSA9IGNodW5rLnJlYWRVSW50MzJMRSgwKTtcbiAgICAgICAgICAgIHN3aXRjaCAoc2lnbmF0dXJlKSB7XG4gICAgICAgICAgICAgICAgY2FzZSBTSUdfTE9DQUxfRklMRV9IRUFERVI6XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuc3RhdGUgPSBzdGF0ZXMuTE9DQUxfRklMRV9IRUFERVI7XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIGNhc2UgU0lHX0NESVJfUkVDT1JEOlxuICAgICAgICAgICAgICAgICAgICB0aGlzLnN0YXRlID0gc3RhdGVzLkNFTlRSQUxfRElSRUNUT1JZX0ZJTEVfSEVBREVSO1xuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICBjYXNlIFNJR19DRElSNjRfUkVDT1JEX0VORDpcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5zdGF0ZSA9IHN0YXRlcy5DRElSNjRfRU5EO1xuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICBjYXNlIFNJR19DRElSNjRfTE9DQVRPUl9FTkQ6XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuc3RhdGUgPSBzdGF0ZXMuQ0RJUjY0X0xPQ0FUT1I7XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIGNhc2UgU0lHX0NESVJfUkVDT1JEX0VORDpcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5zdGF0ZSA9IHN0YXRlcy5DRU5UUkFMX0RJUkVDVE9SWV9FTkQ7XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgICAgICAgICAgIHZhciBpc1N0cmVhbVN0YXJ0ID0gdGhpcy5zdGF0ZSA9PT0gc3RhdGVzLlNUUkVBTV9TVEFSVDtcbiAgICAgICAgICAgICAgICAgICAgaWYgKCFpc1N0cmVhbVN0YXJ0ICYmIChzaWduYXR1cmUgJiAweGZmZmYpICE9PSAweDRiNTAgJiYgdGhpcy5za2lwcGVkQnl0ZXMgPCAyNikge1xuICAgICAgICAgICAgICAgICAgICAgICAgLy8gd2UnbGwgYWxsb3cgYSBwYWRkaW5nIG9mIG1heCAyOCBieXRlc1xuICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHJlbWFpbmluZyA9IHNpZ25hdHVyZTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHZhciB0b1NraXAgPSA0O1xuICAgICAgICAgICAgICAgICAgICAgICAgZm9yICh2YXIgaSA9IDE7IGkgPCA0ICYmIHJlbWFpbmluZyAhPT0gMDsgaSsrKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVtYWluaW5nID0gcmVtYWluaW5nID4+PiA4O1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICgocmVtYWluaW5nICYgMHhmZikgPT09IDB4NTApIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdG9Ta2lwID0gaTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5za2lwcGVkQnl0ZXMgKz0gdG9Ta2lwO1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHRoaXMub3B0aW9ucy5kZWJ1ZykgY29uc29sZS5sb2coJ1NraXBwZWQnLCB0aGlzLnNraXBwZWRCeXRlcywgJ2J5dGVzJyk7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gdG9Ta2lwO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuc3RhdGUgPSBzdGF0ZXMuRVJST1I7XG4gICAgICAgICAgICAgICAgICAgIHZhciBlcnJNc2cgPSBpc1N0cmVhbVN0YXJ0ID8gXCJOb3QgYSB2YWxpZCB6aXAgZmlsZVwiIDogXCJJbnZhbGlkIHNpZ25hdHVyZSBpbiB6aXAgZmlsZVwiO1xuICAgICAgICAgICAgICAgICAgICBpZiAodGhpcy5vcHRpb25zLmRlYnVnKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICB2YXIgc2lnID0gY2h1bmsucmVhZFVJbnQzMkxFKDApO1xuICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGFzU3RyaW5nO1xuICAgICAgICAgICAgICAgICAgICAgICAgdHJ5IHsgYXNTdHJpbmcgPSBjaHVuay5zbGljZSgwLCA0KS50b1N0cmluZygpOyB9IGNhdGNoIChlKSB7fVxuICAgICAgICAgICAgICAgICAgICAgICAgY29uc29sZS5sb2coXCJVbmV4cGVjdGVkIHNpZ25hdHVyZSBpbiB6aXAgZmlsZTogMHhcIiArIHNpZy50b1N0cmluZygxNiksICdcIicgKyBhc1N0cmluZyArICdcIiwgc2tpcHBlZCcsIHRoaXMuc2tpcHBlZEJ5dGVzLCAnYnl0ZXMnKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB0aGlzLmVtaXQoXCJlcnJvclwiLCBuZXcgRXJyb3IoZXJyTXNnKSk7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBjaHVuay5sZW5ndGg7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICB0aGlzLnNraXBwZWRCeXRlcyA9IDA7XG4gICAgICAgICAgICByZXR1cm4gcmVxdWlyZWRMZW5ndGg7XG5cbiAgICAgICAgY2FzZSBzdGF0ZXMuTE9DQUxfRklMRV9IRUFERVI6XG4gICAgICAgICAgICB0aGlzLnBhcnNlZEVudGl0eSA9IHRoaXMuX3JlYWRGaWxlKGNodW5rKTtcbiAgICAgICAgICAgIHRoaXMuc3RhdGUgPSBzdGF0ZXMuTE9DQUxfRklMRV9IRUFERVJfU1VGRklYO1xuXG4gICAgICAgICAgICByZXR1cm4gcmVxdWlyZWRMZW5ndGg7XG5cbiAgICAgICAgY2FzZSBzdGF0ZXMuTE9DQUxfRklMRV9IRUFERVJfU1VGRklYOlxuICAgICAgICAgICAgdmFyIGVudHJ5ID0gbmV3IEVudHJ5KCk7XG4gICAgICAgICAgICB2YXIgaXNVdGY4ID0gKHRoaXMucGFyc2VkRW50aXR5LmZsYWdzICYgMHg4MDApICE9PSAwO1xuICAgICAgICAgICAgZW50cnkucGF0aCA9IHRoaXMuX2RlY29kZVN0cmluZyhjaHVuay5zbGljZSgwLCB0aGlzLnBhcnNlZEVudGl0eS5maWxlTmFtZUxlbmd0aCksIGlzVXRmOCk7XG4gICAgICAgICAgICB2YXIgZXh0cmFEYXRhQnVmZmVyID0gY2h1bmsuc2xpY2UodGhpcy5wYXJzZWRFbnRpdHkuZmlsZU5hbWVMZW5ndGgsIHRoaXMucGFyc2VkRW50aXR5LmZpbGVOYW1lTGVuZ3RoICsgdGhpcy5wYXJzZWRFbnRpdHkuZXh0cmFGaWVsZExlbmd0aCk7XG4gICAgICAgICAgICB2YXIgZXh0cmEgPSB0aGlzLl9yZWFkRXh0cmFGaWVsZHMoZXh0cmFEYXRhQnVmZmVyKTtcbiAgICAgICAgICAgIGlmIChleHRyYSAmJiBleHRyYS5wYXJzZWQpIHtcbiAgICAgICAgICAgICAgICBpZiAoZXh0cmEucGFyc2VkLnBhdGggJiYgIWlzVXRmOCkge1xuICAgICAgICAgICAgICAgICAgICBlbnRyeS5wYXRoID0gZXh0cmEucGFyc2VkLnBhdGg7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGlmIChOdW1iZXIuaXNGaW5pdGUoZXh0cmEucGFyc2VkLnVuY29tcHJlc3NlZFNpemUpICYmIHRoaXMucGFyc2VkRW50aXR5LnVuY29tcHJlc3NlZFNpemUgPT09IEZPVVJfR0lHUy0xKSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMucGFyc2VkRW50aXR5LnVuY29tcHJlc3NlZFNpemUgPSBleHRyYS5wYXJzZWQudW5jb21wcmVzc2VkU2l6ZTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgaWYgKE51bWJlci5pc0Zpbml0ZShleHRyYS5wYXJzZWQuY29tcHJlc3NlZFNpemUpICYmIHRoaXMucGFyc2VkRW50aXR5LmNvbXByZXNzZWRTaXplID09PSBGT1VSX0dJR1MtMSkge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLnBhcnNlZEVudGl0eS5jb21wcmVzc2VkU2l6ZSA9IGV4dHJhLnBhcnNlZC5jb21wcmVzc2VkU2l6ZTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICB0aGlzLnBhcnNlZEVudGl0eS5leHRyYSA9IGV4dHJhLnBhcnNlZCB8fCB7fTtcblxuICAgICAgICAgICAgaWYgKHRoaXMub3B0aW9ucy5kZWJ1Zykge1xuICAgICAgICAgICAgICAgIGNvbnN0IGRlYnVnT2JqID0gT2JqZWN0LmFzc2lnbih7fSwgdGhpcy5wYXJzZWRFbnRpdHksIHtcbiAgICAgICAgICAgICAgICAgICAgcGF0aDogZW50cnkucGF0aCxcbiAgICAgICAgICAgICAgICAgICAgZmxhZ3M6ICcweCcgKyB0aGlzLnBhcnNlZEVudGl0eS5mbGFncy50b1N0cmluZygxNiksXG4gICAgICAgICAgICAgICAgICAgIGV4dHJhRmllbGRzOiBleHRyYSAmJiBleHRyYS5kZWJ1Z1xuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgIGNvbnNvbGUubG9nKFwiZGVjb2RlZCBMT0NBTF9GSUxFX0hFQURFUjpcIiwgSlNPTi5zdHJpbmdpZnkoZGVidWdPYmosIG51bGwsIDIpKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHRoaXMuX3ByZXBhcmVPdXRTdHJlYW0odGhpcy5wYXJzZWRFbnRpdHksIGVudHJ5KTtcblxuICAgICAgICAgICAgdGhpcy5lbWl0KFwiZW50cnlcIiwgZW50cnkpO1xuXG4gICAgICAgICAgICB0aGlzLnN0YXRlID0gc3RhdGVzLkZJTEVfREFUQTtcblxuICAgICAgICAgICAgcmV0dXJuIHJlcXVpcmVkTGVuZ3RoO1xuXG4gICAgICAgIGNhc2Ugc3RhdGVzLkNFTlRSQUxfRElSRUNUT1JZX0ZJTEVfSEVBREVSOlxuICAgICAgICAgICAgdGhpcy5wYXJzZWRFbnRpdHkgPSB0aGlzLl9yZWFkQ2VudHJhbERpcmVjdG9yeUVudHJ5KGNodW5rKTtcbiAgICAgICAgICAgIHRoaXMuc3RhdGUgPSBzdGF0ZXMuQ0VOVFJBTF9ESVJFQ1RPUllfRklMRV9IRUFERVJfU1VGRklYO1xuXG4gICAgICAgICAgICByZXR1cm4gcmVxdWlyZWRMZW5ndGg7XG5cbiAgICAgICAgY2FzZSBzdGF0ZXMuQ0VOVFJBTF9ESVJFQ1RPUllfRklMRV9IRUFERVJfU1VGRklYOlxuICAgICAgICAgICAgLy8gZ290IGZpbGUgbmFtZSBpbiBjaHVua1swLi5dXG4gICAgICAgICAgICB2YXIgaXNVdGY4ID0gKHRoaXMucGFyc2VkRW50aXR5LmZsYWdzICYgMHg4MDApICE9PSAwO1xuICAgICAgICAgICAgdmFyIHBhdGggPSB0aGlzLl9kZWNvZGVTdHJpbmcoY2h1bmsuc2xpY2UoMCwgdGhpcy5wYXJzZWRFbnRpdHkuZmlsZU5hbWVMZW5ndGgpLCBpc1V0ZjgpO1xuICAgICAgICAgICAgdmFyIGV4dHJhRGF0YUJ1ZmZlciA9IGNodW5rLnNsaWNlKHRoaXMucGFyc2VkRW50aXR5LmZpbGVOYW1lTGVuZ3RoLCB0aGlzLnBhcnNlZEVudGl0eS5maWxlTmFtZUxlbmd0aCArIHRoaXMucGFyc2VkRW50aXR5LmV4dHJhRmllbGRMZW5ndGgpO1xuICAgICAgICAgICAgdmFyIGV4dHJhID0gdGhpcy5fcmVhZEV4dHJhRmllbGRzKGV4dHJhRGF0YUJ1ZmZlcik7XG4gICAgICAgICAgICBpZiAoZXh0cmEgJiYgZXh0cmEucGFyc2VkICYmIGV4dHJhLnBhcnNlZC5wYXRoICYmICFpc1V0ZjgpIHtcbiAgICAgICAgICAgICAgICBwYXRoID0gZXh0cmEucGFyc2VkLnBhdGg7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICB0aGlzLnBhcnNlZEVudGl0eS5leHRyYSA9IGV4dHJhLnBhcnNlZDtcblxuICAgICAgICAgICAgdmFyIGlzVW5peCA9ICgodGhpcy5wYXJzZWRFbnRpdHkudmVyc2lvbk1hZGVCeSAmIDB4ZmYwMCkgPj4gOCkgPT09IDM7XG4gICAgICAgICAgICB2YXIgdW5peEF0dHJzLCBpc1N5bWxpbms7XG4gICAgICAgICAgICBpZiAoaXNVbml4KSB7XG4gICAgICAgICAgICAgICAgdW5peEF0dHJzID0gdGhpcy5wYXJzZWRFbnRpdHkuZXh0ZXJuYWxGaWxlQXR0cmlidXRlcyA+Pj4gMTY7XG4gICAgICAgICAgICAgICAgdmFyIGZpbGVUeXBlID0gdW5peEF0dHJzID4+PiAxMjtcbiAgICAgICAgICAgICAgICBpc1N5bWxpbmsgPSAoZmlsZVR5cGUgJiAwbzEyKSA9PT0gMG8xMjsgLy8gX19TX0lGTE5LXG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAodGhpcy5vcHRpb25zLmRlYnVnKSB7XG4gICAgICAgICAgICAgICAgY29uc3QgZGVidWdPYmogPSBPYmplY3QuYXNzaWduKHt9LCB0aGlzLnBhcnNlZEVudGl0eSwge1xuICAgICAgICAgICAgICAgICAgICBwYXRoOiBwYXRoLFxuICAgICAgICAgICAgICAgICAgICBmbGFnczogJzB4JyArIHRoaXMucGFyc2VkRW50aXR5LmZsYWdzLnRvU3RyaW5nKDE2KSxcbiAgICAgICAgICAgICAgICAgICAgdW5peEF0dHJzOiB1bml4QXR0cnMgJiYgJzAnICsgdW5peEF0dHJzLnRvU3RyaW5nKDgpLFxuICAgICAgICAgICAgICAgICAgICBpc1N5bWxpbms6IGlzU3ltbGluayxcbiAgICAgICAgICAgICAgICAgICAgZXh0cmFGaWVsZHM6IGV4dHJhLmRlYnVnLFxuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgIGNvbnNvbGUubG9nKFwiZGVjb2RlZCBDRU5UUkFMX0RJUkVDVE9SWV9GSUxFX0hFQURFUjpcIiwgSlNPTi5zdHJpbmdpZnkoZGVidWdPYmosIG51bGwsIDIpKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHRoaXMuc3RhdGUgPSBzdGF0ZXMuU1RBUlQ7XG5cbiAgICAgICAgICAgIHJldHVybiByZXF1aXJlZExlbmd0aDtcblxuICAgICAgICBjYXNlIHN0YXRlcy5DRElSNjRfRU5EOlxuICAgICAgICAgICAgdGhpcy5wYXJzZWRFbnRpdHkgPSB0aGlzLl9yZWFkRW5kT2ZDZW50cmFsRGlyZWN0b3J5NjQoY2h1bmspO1xuICAgICAgICAgICAgaWYgKHRoaXMub3B0aW9ucy5kZWJ1Zykge1xuICAgICAgICAgICAgICAgIGNvbnNvbGUubG9nKFwiZGVjb2RlZCBDRElSNjRfRU5EX1JFQ09SRDpcIiwgdGhpcy5wYXJzZWRFbnRpdHkpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgdGhpcy5zdGF0ZSA9IHN0YXRlcy5DRElSNjRfRU5EX0RBVEFfU0VDVE9SO1xuXG4gICAgICAgICAgICByZXR1cm4gcmVxdWlyZWRMZW5ndGg7XG5cbiAgICAgICAgY2FzZSBzdGF0ZXMuQ0RJUjY0X0VORF9EQVRBX1NFQ1RPUjpcbiAgICAgICAgICAgIHRoaXMuc3RhdGUgPSBzdGF0ZXMuU1RBUlQ7XG5cbiAgICAgICAgICAgIHJldHVybiByZXF1aXJlZExlbmd0aDtcblxuICAgICAgICBjYXNlIHN0YXRlcy5DRElSNjRfTE9DQVRPUjpcbiAgICAgICAgICAgIC8vIGlnbm9yZSwgbm90aGluZyBpbnRlcmVzdGluZ1xuICAgICAgICAgICAgdGhpcy5zdGF0ZSA9IHN0YXRlcy5TVEFSVDtcblxuICAgICAgICAgICAgcmV0dXJuIHJlcXVpcmVkTGVuZ3RoO1xuXG4gICAgICAgIGNhc2Ugc3RhdGVzLkNFTlRSQUxfRElSRUNUT1JZX0VORDpcbiAgICAgICAgICAgIHRoaXMucGFyc2VkRW50aXR5ID0gdGhpcy5fcmVhZEVuZE9mQ2VudHJhbERpcmVjdG9yeShjaHVuayk7XG4gICAgICAgICAgICBpZiAodGhpcy5vcHRpb25zLmRlYnVnKSB7XG4gICAgICAgICAgICAgICAgY29uc29sZS5sb2coXCJkZWNvZGVkIENFTlRSQUxfRElSRUNUT1JZX0VORDpcIiwgdGhpcy5wYXJzZWRFbnRpdHkpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgdGhpcy5zdGF0ZSA9IHN0YXRlcy5DRU5UUkFMX0RJUkVDVE9SWV9FTkRfQ09NTUVOVDtcblxuICAgICAgICAgICAgcmV0dXJuIHJlcXVpcmVkTGVuZ3RoO1xuXG4gICAgICAgIGNhc2Ugc3RhdGVzLkNFTlRSQUxfRElSRUNUT1JZX0VORF9DT01NRU5UOlxuICAgICAgICAgICAgaWYgKHRoaXMub3B0aW9ucy5kZWJ1Zykge1xuICAgICAgICAgICAgICAgIGNvbnNvbGUubG9nKFwiZGVjb2RlZCBDRU5UUkFMX0RJUkVDVE9SWV9FTkRfQ09NTUVOVDpcIiwgY2h1bmsuc2xpY2UoMCwgcmVxdWlyZWRMZW5ndGgpLnRvU3RyaW5nKCkpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgdGhpcy5zdGF0ZSA9IHN0YXRlcy5UUkFJTElOR19KVU5LO1xuXG4gICAgICAgICAgICByZXR1cm4gcmVxdWlyZWRMZW5ndGg7XG5cbiAgICAgICAgY2FzZSBzdGF0ZXMuRVJST1I6XG4gICAgICAgICAgICByZXR1cm4gY2h1bmsubGVuZ3RoOyAvLyBkaXNjYXJkXG5cbiAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICAgIGNvbnNvbGUubG9nKFwiZGlkbid0IGhhbmRsZSBzdGF0ZSAjXCIsIHRoaXMuc3RhdGUsIFwiZGlzY2FyZGluZ1wiKTtcbiAgICAgICAgICAgIHJldHVybiBjaHVuay5sZW5ndGg7XG4gICAgfVxufVxuXG5VbnppcFN0cmVhbS5wcm90b3R5cGUuX3ByZXBhcmVPdXRTdHJlYW0gPSBmdW5jdGlvbiAodmFycywgZW50cnkpIHtcbiAgICB2YXIgc2VsZiA9IHRoaXM7XG5cbiAgICB2YXIgaXNEaXJlY3RvcnkgPSB2YXJzLnVuY29tcHJlc3NlZFNpemUgPT09IDAgJiYgL1tcXC9cXFxcXSQvLnRlc3QoZW50cnkucGF0aCk7XG4gICAgLy8gcHJvdGVjdCBhZ2FpbnN0IG1hbGljaW91cyB6aXAgZmlsZXMgd2hpY2ggd2FudCB0byBleHRyYWN0IHRvIHBhcmVudCBkaXJzXG4gICAgZW50cnkucGF0aCA9IGVudHJ5LnBhdGgucmVwbGFjZSgvKD88PV58Wy9cXFxcXSspWy5dWy5dKyg/PVsvXFxcXF0rfCQpL2csIFwiLlwiKTtcbiAgICBlbnRyeS50eXBlID0gaXNEaXJlY3RvcnkgPyAnRGlyZWN0b3J5JyA6ICdGaWxlJztcbiAgICBlbnRyeS5pc0RpcmVjdG9yeSA9IGlzRGlyZWN0b3J5O1xuXG4gICAgdmFyIGZpbGVTaXplS25vd24gPSAhKHZhcnMuZmxhZ3MgJiAweDA4KTtcbiAgICBpZiAoZmlsZVNpemVLbm93bikge1xuICAgICAgICBlbnRyeS5zaXplID0gdmFycy51bmNvbXByZXNzZWRTaXplO1xuICAgIH1cblxuICAgIHZhciBpc1ZlcnNpb25TdXBwb3J0ZWQgPSB2YXJzLnZlcnNpb25zTmVlZGVkVG9FeHRyYWN0IDw9IDQ1O1xuXG4gICAgdGhpcy5vdXRTdHJlYW1JbmZvID0ge1xuICAgICAgICBzdHJlYW06IG51bGwsXG4gICAgICAgIGxpbWl0OiBmaWxlU2l6ZUtub3duID8gdmFycy5jb21wcmVzc2VkU2l6ZSA6IC0xLFxuICAgICAgICB3cml0dGVuOiAwXG4gICAgfTtcblxuICAgIGlmICghZmlsZVNpemVLbm93bikge1xuICAgICAgICB2YXIgcGF0dGVybiA9IG5ldyBCdWZmZXIoNCk7XG4gICAgICAgIHBhdHRlcm4ud3JpdGVVSW50MzJMRShTSUdfREFUQV9ERVNDUklQVE9SLCAwKTtcbiAgICAgICAgdmFyIHppcDY0TW9kZSA9IHZhcnMuZXh0cmEuemlwNjRNb2RlO1xuICAgICAgICB2YXIgZXh0cmFTaXplID0gemlwNjRNb2RlID8gMjAgOiAxMjtcbiAgICAgICAgdmFyIHNlYXJjaFBhdHRlcm4gPSB7XG4gICAgICAgICAgICBwYXR0ZXJuOiBwYXR0ZXJuLFxuICAgICAgICAgICAgcmVxdWlyZWRFeHRyYVNpemU6IGV4dHJhU2l6ZVxuICAgICAgICB9XG5cbiAgICAgICAgdmFyIG1hdGNoZXJTdHJlYW0gPSBuZXcgTWF0Y2hlclN0cmVhbShzZWFyY2hQYXR0ZXJuLCBmdW5jdGlvbiAobWF0Y2hlZENodW5rLCBzaXplU29GYXIpIHtcbiAgICAgICAgICAgIHZhciB2YXJzID0gc2VsZi5fcmVhZERhdGFEZXNjcmlwdG9yKG1hdGNoZWRDaHVuaywgemlwNjRNb2RlKTtcblxuICAgICAgICAgICAgdmFyIGNvbXByZXNzZWRTaXplTWF0Y2hlcyA9IHZhcnMuY29tcHJlc3NlZFNpemUgPT09IHNpemVTb0ZhcjtcbiAgICAgICAgICAgIC8vIGxldCdzIGFsc28gZGVhbCB3aXRoIGFyY2hpdmVzIHdpdGggNEdpQisgZmlsZXMgd2l0aG91dCB6aXA2NFxuICAgICAgICAgICAgaWYgKCF6aXA2NE1vZGUgJiYgIWNvbXByZXNzZWRTaXplTWF0Y2hlcyAmJiBzaXplU29GYXIgPj0gRk9VUl9HSUdTKSB7XG4gICAgICAgICAgICAgICAgdmFyIG92ZXJmbG93biA9IHNpemVTb0ZhciAtIEZPVVJfR0lHUztcbiAgICAgICAgICAgICAgICB3aGlsZSAob3ZlcmZsb3duID49IDApIHtcbiAgICAgICAgICAgICAgICAgICAgY29tcHJlc3NlZFNpemVNYXRjaGVzID0gdmFycy5jb21wcmVzc2VkU2l6ZSA9PT0gb3ZlcmZsb3duO1xuICAgICAgICAgICAgICAgICAgICBpZiAoY29tcHJlc3NlZFNpemVNYXRjaGVzKSBicmVhaztcbiAgICAgICAgICAgICAgICAgICAgb3ZlcmZsb3duIC09IEZPVVJfR0lHUztcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAoIWNvbXByZXNzZWRTaXplTWF0Y2hlcykgeyByZXR1cm47IH1cblxuICAgICAgICAgICAgc2VsZi5zdGF0ZSA9IHN0YXRlcy5GSUxFX0RBVEFfRU5EO1xuICAgICAgICAgICAgdmFyIHNsaWNlT2Zmc2V0ID0gemlwNjRNb2RlID8gMjQgOiAxNjtcbiAgICAgICAgICAgIGlmIChzZWxmLmRhdGEubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgICAgIHNlbGYuZGF0YSA9IEJ1ZmZlci5jb25jYXQoW21hdGNoZWRDaHVuay5zbGljZShzbGljZU9mZnNldCksIHNlbGYuZGF0YV0pO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICBzZWxmLmRhdGEgPSBtYXRjaGVkQ2h1bmsuc2xpY2Uoc2xpY2VPZmZzZXQpO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgfSk7XG4gICAgICAgIHRoaXMub3V0U3RyZWFtSW5mby5zdHJlYW0gPSBtYXRjaGVyU3RyZWFtO1xuICAgIH0gZWxzZSB7XG4gICAgICAgIHRoaXMub3V0U3RyZWFtSW5mby5zdHJlYW0gPSBuZXcgc3RyZWFtLlBhc3NUaHJvdWdoKCk7XG4gICAgfVxuXG4gICAgdmFyIGlzRW5jcnlwdGVkID0gKHZhcnMuZmxhZ3MgJiAweDAxKSB8fCAodmFycy5mbGFncyAmIDB4NDApO1xuICAgIGlmIChpc0VuY3J5cHRlZCB8fCAhaXNWZXJzaW9uU3VwcG9ydGVkKSB7XG4gICAgICAgIHZhciBtZXNzYWdlID0gaXNFbmNyeXB0ZWQgPyBcIkVuY3J5cHRlZCBmaWxlcyBhcmUgbm90IHN1cHBvcnRlZCFcIlxuICAgICAgICAgICAgOiAoXCJaaXAgdmVyc2lvbiBcIiArIE1hdGguZmxvb3IodmFycy52ZXJzaW9uc05lZWRlZFRvRXh0cmFjdCAvIDEwKSArIFwiLlwiICsgdmFycy52ZXJzaW9uc05lZWRlZFRvRXh0cmFjdCAlIDEwICsgXCIgaXMgbm90IHN1cHBvcnRlZFwiKTtcblxuICAgICAgICBlbnRyeS5za2lwID0gdHJ1ZTtcbiAgICAgICAgc2V0SW1tZWRpYXRlKCgpID0+IHtcbiAgICAgICAgICAgIHNlbGYuZW1pdCgnZXJyb3InLCBuZXcgRXJyb3IobWVzc2FnZSkpO1xuICAgICAgICB9KTtcblxuICAgICAgICAvLyB0cnkgdG8gc2tpcCBvdmVyIHRoaXMgZW50cnlcbiAgICAgICAgdGhpcy5vdXRTdHJlYW1JbmZvLnN0cmVhbS5waXBlKG5ldyBFbnRyeSgpLmF1dG9kcmFpbigpKTtcbiAgICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIHZhciBpc0NvbXByZXNzZWQgPSB2YXJzLmNvbXByZXNzaW9uTWV0aG9kID4gMDtcbiAgICBpZiAoaXNDb21wcmVzc2VkKSB7XG4gICAgICAgIHZhciBpbmZsYXRlciA9IHpsaWIuY3JlYXRlSW5mbGF0ZVJhdygpO1xuICAgICAgICBpbmZsYXRlci5vbignZXJyb3InLCBmdW5jdGlvbiAoZXJyKSB7XG4gICAgICAgICAgICBzZWxmLnN0YXRlID0gc3RhdGVzLkVSUk9SO1xuICAgICAgICAgICAgc2VsZi5lbWl0KCdlcnJvcicsIGVycik7XG4gICAgICAgIH0pO1xuICAgICAgICB0aGlzLm91dFN0cmVhbUluZm8uc3RyZWFtLnBpcGUoaW5mbGF0ZXIpLnBpcGUoZW50cnkpO1xuICAgIH0gZWxzZSB7XG4gICAgICAgIHRoaXMub3V0U3RyZWFtSW5mby5zdHJlYW0ucGlwZShlbnRyeSk7XG4gICAgfVxuXG4gICAgaWYgKHRoaXMuX2RyYWluQWxsRW50cmllcykge1xuICAgICAgICBlbnRyeS5hdXRvZHJhaW4oKTtcbiAgICB9XG59XG5cblVuemlwU3RyZWFtLnByb3RvdHlwZS5fcmVhZEZpbGUgPSBmdW5jdGlvbiAoZGF0YSkge1xuICAgIHZhciB2YXJzID0gYmluYXJ5LnBhcnNlKGRhdGEpXG4gICAgICAgIC53b3JkMTZsdSgndmVyc2lvbnNOZWVkZWRUb0V4dHJhY3QnKVxuICAgICAgICAud29yZDE2bHUoJ2ZsYWdzJylcbiAgICAgICAgLndvcmQxNmx1KCdjb21wcmVzc2lvbk1ldGhvZCcpXG4gICAgICAgIC53b3JkMTZsdSgnbGFzdE1vZGlmaWVkVGltZScpXG4gICAgICAgIC53b3JkMTZsdSgnbGFzdE1vZGlmaWVkRGF0ZScpXG4gICAgICAgIC53b3JkMzJsdSgnY3JjMzInKVxuICAgICAgICAud29yZDMybHUoJ2NvbXByZXNzZWRTaXplJylcbiAgICAgICAgLndvcmQzMmx1KCd1bmNvbXByZXNzZWRTaXplJylcbiAgICAgICAgLndvcmQxNmx1KCdmaWxlTmFtZUxlbmd0aCcpXG4gICAgICAgIC53b3JkMTZsdSgnZXh0cmFGaWVsZExlbmd0aCcpXG4gICAgICAgIC52YXJzO1xuXG4gICAgcmV0dXJuIHZhcnM7XG59XG5cblVuemlwU3RyZWFtLnByb3RvdHlwZS5fcmVhZEV4dHJhRmllbGRzID0gZnVuY3Rpb24gKGRhdGEpIHtcbiAgICB2YXIgZXh0cmEgPSB7fTtcbiAgICB2YXIgcmVzdWx0ID0geyBwYXJzZWQ6IGV4dHJhIH07XG4gICAgaWYgKHRoaXMub3B0aW9ucy5kZWJ1Zykge1xuICAgICAgICByZXN1bHQuZGVidWcgPSBbXTtcbiAgICB9XG4gICAgdmFyIGluZGV4ID0gMDtcbiAgICB3aGlsZSAoaW5kZXggPCBkYXRhLmxlbmd0aCkge1xuICAgICAgICB2YXIgdmFycyA9IGJpbmFyeS5wYXJzZShkYXRhKVxuICAgICAgICAgICAgLnNraXAoaW5kZXgpXG4gICAgICAgICAgICAud29yZDE2bHUoJ2V4dHJhSWQnKVxuICAgICAgICAgICAgLndvcmQxNmx1KCdleHRyYVNpemUnKVxuICAgICAgICAgICAgLnZhcnM7XG5cbiAgICAgICAgaW5kZXggKz0gNDtcblxuICAgICAgICB2YXIgZmllbGRUeXBlID0gdW5kZWZpbmVkO1xuICAgICAgICBzd2l0Y2ggKHZhcnMuZXh0cmFJZCkge1xuICAgICAgICAgICAgY2FzZSAweDAwMDE6XG4gICAgICAgICAgICAgICAgZmllbGRUeXBlID0gXCJaaXA2NCBleHRlbmRlZCBpbmZvcm1hdGlvbiBleHRyYSBmaWVsZFwiO1xuICAgICAgICAgICAgICAgIHZhciB6NjR2YXJzID0gYmluYXJ5LnBhcnNlKGRhdGEuc2xpY2UoaW5kZXgsIGluZGV4K3ZhcnMuZXh0cmFTaXplKSlcbiAgICAgICAgICAgICAgICAgICAgLndvcmQ2NGx1KCd1bmNvbXByZXNzZWRTaXplJylcbiAgICAgICAgICAgICAgICAgICAgLndvcmQ2NGx1KCdjb21wcmVzc2VkU2l6ZScpXG4gICAgICAgICAgICAgICAgICAgIC53b3JkNjRsdSgnb2Zmc2V0VG9Mb2NhbEhlYWRlcicpXG4gICAgICAgICAgICAgICAgICAgIC53b3JkMzJsdSgnZGlza1N0YXJ0TnVtYmVyJylcbiAgICAgICAgICAgICAgICAgICAgLnZhcnM7XG4gICAgICAgICAgICAgICAgaWYgKHo2NHZhcnMudW5jb21wcmVzc2VkU2l6ZSAhPT0gbnVsbCkge1xuICAgICAgICAgICAgICAgICAgICBleHRyYS51bmNvbXByZXNzZWRTaXplID0gejY0dmFycy51bmNvbXByZXNzZWRTaXplO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBpZiAoejY0dmFycy5jb21wcmVzc2VkU2l6ZSAhPT0gbnVsbCkge1xuICAgICAgICAgICAgICAgICAgICBleHRyYS5jb21wcmVzc2VkU2l6ZSA9IHo2NHZhcnMuY29tcHJlc3NlZFNpemU7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGV4dHJhLnppcDY0TW9kZSA9IHRydWU7XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICBjYXNlIDB4MDAwYTpcbiAgICAgICAgICAgICAgICBmaWVsZFR5cGUgPSBcIk5URlMgZXh0cmEgZmllbGRcIjtcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIGNhc2UgMHg1NDU1OlxuICAgICAgICAgICAgICAgIGZpZWxkVHlwZSA9IFwiZXh0ZW5kZWQgdGltZXN0YW1wXCI7XG4gICAgICAgICAgICAgICAgdmFyIHRpbWVzdGFtcEZpZWxkcyA9IGRhdGEucmVhZFVJbnQ4KGluZGV4KTtcbiAgICAgICAgICAgICAgICB2YXIgb2Zmc2V0ID0gMTtcbiAgICAgICAgICAgICAgICBpZiAodmFycy5leHRyYVNpemUgPj0gb2Zmc2V0ICsgNCAmJiB0aW1lc3RhbXBGaWVsZHMgJiAxKSB7XG4gICAgICAgICAgICAgICAgICAgIGV4dHJhLm10aW1lID0gbmV3IERhdGUoZGF0YS5yZWFkVUludDMyTEUoaW5kZXggKyBvZmZzZXQpICogMTAwMCk7XG4gICAgICAgICAgICAgICAgICAgIG9mZnNldCArPSA0O1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBpZiAodmFycy5leHRyYVNpemUgPj0gb2Zmc2V0ICsgNCAmJiB0aW1lc3RhbXBGaWVsZHMgJiAyKSB7XG4gICAgICAgICAgICAgICAgICAgIGV4dHJhLmF0aW1lID0gbmV3IERhdGUoZGF0YS5yZWFkVUludDMyTEUoaW5kZXggKyBvZmZzZXQpICogMTAwMCk7XG4gICAgICAgICAgICAgICAgICAgIG9mZnNldCArPSA0O1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBpZiAodmFycy5leHRyYVNpemUgPj0gb2Zmc2V0ICsgNCAmJiB0aW1lc3RhbXBGaWVsZHMgJiA0KSB7XG4gICAgICAgICAgICAgICAgICAgIGV4dHJhLmN0aW1lID0gbmV3IERhdGUoZGF0YS5yZWFkVUludDMyTEUoaW5kZXggKyBvZmZzZXQpICogMTAwMCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgY2FzZSAweDcwNzU6XG4gICAgICAgICAgICAgICAgZmllbGRUeXBlID0gXCJJbmZvLVpJUCBVbmljb2RlIFBhdGggRXh0cmEgRmllbGRcIjtcbiAgICAgICAgICAgICAgICB2YXIgZmllbGRWZXIgPSBkYXRhLnJlYWRVSW50OChpbmRleCk7XG4gICAgICAgICAgICAgICAgaWYgKGZpZWxkVmVyID09PSAxKSB7XG4gICAgICAgICAgICAgICAgICAgIHZhciBvZmZzZXQgPSAxO1xuICAgICAgICAgICAgICAgICAgICAvLyBUT0RPOiBzaG91bGQgYmUgY2hlY2tpbmcgdGhpcyBhZ2FpbnN0IG91ciBwYXRoIGJ1ZmZlclxuICAgICAgICAgICAgICAgICAgICB2YXIgbmFtZUNyYzMyID0gZGF0YS5yZWFkVUludDMyTEUoaW5kZXggKyBvZmZzZXQpO1xuICAgICAgICAgICAgICAgICAgICBvZmZzZXQgKz0gNDtcbiAgICAgICAgICAgICAgICAgICAgdmFyIHBhdGhCdWZmZXIgPSBkYXRhLnNsaWNlKGluZGV4ICsgb2Zmc2V0KTtcbiAgICAgICAgICAgICAgICAgICAgZXh0cmEucGF0aCA9IHBhdGhCdWZmZXIudG9TdHJpbmcoKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICBjYXNlIDB4MDAwZDpcbiAgICAgICAgICAgIGNhc2UgMHg1ODU1OlxuICAgICAgICAgICAgICAgIGZpZWxkVHlwZSA9IHZhcnMuZXh0cmFJZCA9PT0gMHgwMDBkID8gXCJQS1dBUkUgVW5peFwiIDogXCJJbmZvLVpJUCBVTklYICh0eXBlIDEpXCI7XG4gICAgICAgICAgICAgICAgdmFyIG9mZnNldCA9IDA7XG4gICAgICAgICAgICAgICAgaWYgKHZhcnMuZXh0cmFTaXplID49IDgpIHtcbiAgICAgICAgICAgICAgICAgICAgdmFyIGF0aW1lID0gbmV3IERhdGUoZGF0YS5yZWFkVUludDMyTEUoaW5kZXggKyBvZmZzZXQpICogMTAwMCk7XG4gICAgICAgICAgICAgICAgICAgIG9mZnNldCArPSA0O1xuICAgICAgICAgICAgICAgICAgICB2YXIgbXRpbWUgPSBuZXcgRGF0ZShkYXRhLnJlYWRVSW50MzJMRShpbmRleCArIG9mZnNldCkgKiAxMDAwKTtcbiAgICAgICAgICAgICAgICAgICAgb2Zmc2V0ICs9IDQ7XG4gICAgICAgICAgICAgICAgICAgIGV4dHJhLmF0aW1lID0gYXRpbWU7XG4gICAgICAgICAgICAgICAgICAgIGV4dHJhLm10aW1lID0gbXRpbWU7XG5cbiAgICAgICAgICAgICAgICAgICAgaWYgKHZhcnMuZXh0cmFTaXplID49IDEyKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICB2YXIgdWlkID0gZGF0YS5yZWFkVUludDE2TEUoaW5kZXggKyBvZmZzZXQpO1xuICAgICAgICAgICAgICAgICAgICAgICAgb2Zmc2V0ICs9IDI7XG4gICAgICAgICAgICAgICAgICAgICAgICB2YXIgZ2lkID0gZGF0YS5yZWFkVUludDE2TEUoaW5kZXggKyBvZmZzZXQpO1xuICAgICAgICAgICAgICAgICAgICAgICAgb2Zmc2V0ICs9IDI7XG4gICAgICAgICAgICAgICAgICAgICAgICBleHRyYS51aWQgPSB1aWQ7XG4gICAgICAgICAgICAgICAgICAgICAgICBleHRyYS5naWQgPSBnaWQ7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICBjYXNlIDB4Nzg1NTpcbiAgICAgICAgICAgICAgICBmaWVsZFR5cGUgPSBcIkluZm8tWklQIFVOSVggKHR5cGUgMilcIjtcbiAgICAgICAgICAgICAgICB2YXIgb2Zmc2V0ID0gMDtcbiAgICAgICAgICAgICAgICBpZiAodmFycy5leHRyYVNpemUgPj0gNCkge1xuICAgICAgICAgICAgICAgICAgICB2YXIgdWlkID0gZGF0YS5yZWFkVUludDE2TEUoaW5kZXggKyBvZmZzZXQpO1xuICAgICAgICAgICAgICAgICAgICBvZmZzZXQgKz0gMjtcbiAgICAgICAgICAgICAgICAgICAgdmFyIGdpZCA9IGRhdGEucmVhZFVJbnQxNkxFKGluZGV4ICsgb2Zmc2V0KTtcbiAgICAgICAgICAgICAgICAgICAgb2Zmc2V0ICs9IDI7XG4gICAgICAgICAgICAgICAgICAgIGV4dHJhLnVpZCA9IHVpZDtcbiAgICAgICAgICAgICAgICAgICAgZXh0cmEuZ2lkID0gZ2lkO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIGNhc2UgMHg3ODc1OlxuICAgICAgICAgICAgICAgIGZpZWxkVHlwZSA9IFwiSW5mby1aSVAgTmV3IFVuaXhcIjtcbiAgICAgICAgICAgICAgICB2YXIgb2Zmc2V0ID0gMDtcbiAgICAgICAgICAgICAgICB2YXIgZXh0cmFWZXIgPSBkYXRhLnJlYWRVSW50OChpbmRleCk7XG4gICAgICAgICAgICAgICAgb2Zmc2V0ICs9IDE7XG4gICAgICAgICAgICAgICAgaWYgKGV4dHJhVmVyID09PSAxKSB7XG4gICAgICAgICAgICAgICAgICAgIHZhciB1aWRTaXplID0gZGF0YS5yZWFkVUludDgoaW5kZXggKyBvZmZzZXQpO1xuICAgICAgICAgICAgICAgICAgICBvZmZzZXQgKz0gMTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKHVpZFNpemUgPD0gNikge1xuICAgICAgICAgICAgICAgICAgICAgICAgZXh0cmEudWlkID0gZGF0YS5yZWFkVUludExFKGluZGV4ICsgb2Zmc2V0LCB1aWRTaXplKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBvZmZzZXQgKz0gdWlkU2l6ZTtcblxuICAgICAgICAgICAgICAgICAgICB2YXIgZ2lkU2l6ZSA9IGRhdGEucmVhZFVJbnQ4KGluZGV4ICsgb2Zmc2V0KTtcbiAgICAgICAgICAgICAgICAgICAgb2Zmc2V0ICs9IDE7XG4gICAgICAgICAgICAgICAgICAgIGlmIChnaWRTaXplIDw9IDYpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGV4dHJhLmdpZCA9IGRhdGEucmVhZFVJbnRMRShpbmRleCArIG9mZnNldCwgZ2lkU2l6ZSk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICBjYXNlIDB4NzU2ZTpcbiAgICAgICAgICAgICAgICBmaWVsZFR5cGUgPSBcIkFTaSBVbml4XCI7XG4gICAgICAgICAgICAgICAgdmFyIG9mZnNldCA9IDA7XG4gICAgICAgICAgICAgICAgaWYgKHZhcnMuZXh0cmFTaXplID49IDE0KSB7XG4gICAgICAgICAgICAgICAgICAgIHZhciBjcmMgPSBkYXRhLnJlYWRVSW50MzJMRShpbmRleCArIG9mZnNldCk7XG4gICAgICAgICAgICAgICAgICAgIG9mZnNldCArPSA0O1xuICAgICAgICAgICAgICAgICAgICB2YXIgbW9kZSA9IGRhdGEucmVhZFVJbnQxNkxFKGluZGV4ICsgb2Zmc2V0KTtcbiAgICAgICAgICAgICAgICAgICAgb2Zmc2V0ICs9IDI7XG4gICAgICAgICAgICAgICAgICAgIHZhciBzaXpkZXYgPSBkYXRhLnJlYWRVSW50MzJMRShpbmRleCArIG9mZnNldCk7XG4gICAgICAgICAgICAgICAgICAgIG9mZnNldCArPSA0O1xuICAgICAgICAgICAgICAgICAgICB2YXIgdWlkID0gZGF0YS5yZWFkVUludDE2TEUoaW5kZXggKyBvZmZzZXQpO1xuICAgICAgICAgICAgICAgICAgICBvZmZzZXQgKz0gMjtcbiAgICAgICAgICAgICAgICAgICAgdmFyIGdpZCA9IGRhdGEucmVhZFVJbnQxNkxFKGluZGV4ICsgb2Zmc2V0KTtcbiAgICAgICAgICAgICAgICAgICAgb2Zmc2V0ICs9IDI7XG4gICAgICAgICAgICAgICAgICAgIGV4dHJhLm1vZGUgPSBtb2RlO1xuICAgICAgICAgICAgICAgICAgICBleHRyYS51aWQgPSB1aWQ7XG4gICAgICAgICAgICAgICAgICAgIGV4dHJhLmdpZCA9IGdpZDtcbiAgICAgICAgICAgICAgICAgICAgaWYgKHZhcnMuZXh0cmFTaXplID4gMTQpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHZhciBzdGFydCA9IGluZGV4ICsgb2Zmc2V0O1xuICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGVuZCA9IGluZGV4ICsgdmFycy5leHRyYVNpemUgLSAxNDtcbiAgICAgICAgICAgICAgICAgICAgICAgIHZhciBzeW1saW5rTmFtZSA9IHRoaXMuX2RlY29kZVN0cmluZyhkYXRhLnNsaWNlKHN0YXJ0LCBlbmQpKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGV4dHJhLnN5bWxpbmsgPSBzeW1saW5rTmFtZTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuXG4gICAgICAgIGlmICh0aGlzLm9wdGlvbnMuZGVidWcpIHtcbiAgICAgICAgICAgIHJlc3VsdC5kZWJ1Zy5wdXNoKHtcbiAgICAgICAgICAgICAgICBleHRyYUlkOiAnMHgnICsgdmFycy5leHRyYUlkLnRvU3RyaW5nKDE2KSxcbiAgICAgICAgICAgICAgICBkZXNjcmlwdGlvbjogZmllbGRUeXBlLFxuICAgICAgICAgICAgICAgIGRhdGE6IGRhdGEuc2xpY2UoaW5kZXgsIGluZGV4ICsgdmFycy5leHRyYVNpemUpLmluc3BlY3QoKVxuICAgICAgICAgICAgfSk7XG4gICAgICAgIH1cblxuICAgICAgICBpbmRleCArPSB2YXJzLmV4dHJhU2l6ZTtcbiAgICB9XG5cbiAgICByZXR1cm4gcmVzdWx0O1xufVxuXG5VbnppcFN0cmVhbS5wcm90b3R5cGUuX3JlYWREYXRhRGVzY3JpcHRvciA9IGZ1bmN0aW9uIChkYXRhLCB6aXA2NE1vZGUpIHtcbiAgICBpZiAoemlwNjRNb2RlKSB7XG4gICAgICAgIHZhciB2YXJzID0gYmluYXJ5LnBhcnNlKGRhdGEpXG4gICAgICAgICAgICAud29yZDMybHUoJ2RhdGFEZXNjcmlwdG9yU2lnbmF0dXJlJylcbiAgICAgICAgICAgIC53b3JkMzJsdSgnY3JjMzInKVxuICAgICAgICAgICAgLndvcmQ2NGx1KCdjb21wcmVzc2VkU2l6ZScpXG4gICAgICAgICAgICAud29yZDY0bHUoJ3VuY29tcHJlc3NlZFNpemUnKVxuICAgICAgICAgICAgLnZhcnM7XG5cbiAgICAgICAgcmV0dXJuIHZhcnM7XG4gICAgfVxuXG4gICAgdmFyIHZhcnMgPSBiaW5hcnkucGFyc2UoZGF0YSlcbiAgICAgICAgLndvcmQzMmx1KCdkYXRhRGVzY3JpcHRvclNpZ25hdHVyZScpXG4gICAgICAgIC53b3JkMzJsdSgnY3JjMzInKVxuICAgICAgICAud29yZDMybHUoJ2NvbXByZXNzZWRTaXplJylcbiAgICAgICAgLndvcmQzMmx1KCd1bmNvbXByZXNzZWRTaXplJylcbiAgICAgICAgLnZhcnM7XG5cbiAgICByZXR1cm4gdmFycztcbn1cblxuVW56aXBTdHJlYW0ucHJvdG90eXBlLl9yZWFkQ2VudHJhbERpcmVjdG9yeUVudHJ5ID0gZnVuY3Rpb24gKGRhdGEpIHtcbiAgICB2YXIgdmFycyA9IGJpbmFyeS5wYXJzZShkYXRhKVxuICAgICAgICAud29yZDE2bHUoJ3ZlcnNpb25NYWRlQnknKVxuICAgICAgICAud29yZDE2bHUoJ3ZlcnNpb25zTmVlZGVkVG9FeHRyYWN0JylcbiAgICAgICAgLndvcmQxNmx1KCdmbGFncycpXG4gICAgICAgIC53b3JkMTZsdSgnY29tcHJlc3Npb25NZXRob2QnKVxuICAgICAgICAud29yZDE2bHUoJ2xhc3RNb2RpZmllZFRpbWUnKVxuICAgICAgICAud29yZDE2bHUoJ2xhc3RNb2RpZmllZERhdGUnKVxuICAgICAgICAud29yZDMybHUoJ2NyYzMyJylcbiAgICAgICAgLndvcmQzMmx1KCdjb21wcmVzc2VkU2l6ZScpXG4gICAgICAgIC53b3JkMzJsdSgndW5jb21wcmVzc2VkU2l6ZScpXG4gICAgICAgIC53b3JkMTZsdSgnZmlsZU5hbWVMZW5ndGgnKVxuICAgICAgICAud29yZDE2bHUoJ2V4dHJhRmllbGRMZW5ndGgnKVxuICAgICAgICAud29yZDE2bHUoJ2ZpbGVDb21tZW50TGVuZ3RoJylcbiAgICAgICAgLndvcmQxNmx1KCdkaXNrTnVtYmVyJylcbiAgICAgICAgLndvcmQxNmx1KCdpbnRlcm5hbEZpbGVBdHRyaWJ1dGVzJylcbiAgICAgICAgLndvcmQzMmx1KCdleHRlcm5hbEZpbGVBdHRyaWJ1dGVzJylcbiAgICAgICAgLndvcmQzMmx1KCdvZmZzZXRUb0xvY2FsRmlsZUhlYWRlcicpXG4gICAgICAgIC52YXJzO1xuXG4gICAgcmV0dXJuIHZhcnM7XG59XG5cblVuemlwU3RyZWFtLnByb3RvdHlwZS5fcmVhZEVuZE9mQ2VudHJhbERpcmVjdG9yeTY0ID0gZnVuY3Rpb24gKGRhdGEpIHtcbiAgICB2YXIgdmFycyA9IGJpbmFyeS5wYXJzZShkYXRhKVxuICAgICAgICAud29yZDY0bHUoJ2NlbnRyYWxEaXJlY3RvcnlSZWNvcmRTaXplJylcbiAgICAgICAgLndvcmQxNmx1KCd2ZXJzaW9uTWFkZUJ5JylcbiAgICAgICAgLndvcmQxNmx1KCd2ZXJzaW9uc05lZWRlZFRvRXh0cmFjdCcpXG4gICAgICAgIC53b3JkMzJsdSgnZGlza051bWJlcicpXG4gICAgICAgIC53b3JkMzJsdSgnZGlza051bWJlcldpdGhDZW50cmFsRGlyZWN0b3J5U3RhcnQnKVxuICAgICAgICAud29yZDY0bHUoJ2NlbnRyYWxEaXJlY3RvcnlFbnRyaWVzJylcbiAgICAgICAgLndvcmQ2NGx1KCd0b3RhbENlbnRyYWxEaXJlY3RvcnlFbnRyaWVzJylcbiAgICAgICAgLndvcmQ2NGx1KCdzaXplT2ZDZW50cmFsRGlyZWN0b3J5JylcbiAgICAgICAgLndvcmQ2NGx1KCdvZmZzZXRUb1N0YXJ0T2ZDZW50cmFsRGlyZWN0b3J5JylcbiAgICAgICAgLnZhcnM7XG5cbiAgICByZXR1cm4gdmFycztcbn1cblxuVW56aXBTdHJlYW0ucHJvdG90eXBlLl9yZWFkRW5kT2ZDZW50cmFsRGlyZWN0b3J5ID0gZnVuY3Rpb24gKGRhdGEpIHtcbiAgICB2YXIgdmFycyA9IGJpbmFyeS5wYXJzZShkYXRhKVxuICAgICAgICAud29yZDE2bHUoJ2Rpc2tOdW1iZXInKVxuICAgICAgICAud29yZDE2bHUoJ2Rpc2tTdGFydCcpXG4gICAgICAgIC53b3JkMTZsdSgnY2VudHJhbERpcmVjdG9yeUVudHJpZXMnKVxuICAgICAgICAud29yZDE2bHUoJ3RvdGFsQ2VudHJhbERpcmVjdG9yeUVudHJpZXMnKVxuICAgICAgICAud29yZDMybHUoJ3NpemVPZkNlbnRyYWxEaXJlY3RvcnknKVxuICAgICAgICAud29yZDMybHUoJ29mZnNldFRvU3RhcnRPZkNlbnRyYWxEaXJlY3RvcnknKVxuICAgICAgICAud29yZDE2bHUoJ2NvbW1lbnRMZW5ndGgnKVxuICAgICAgICAudmFycztcblxuICAgIHJldHVybiB2YXJzO1xufVxuXG5jb25zdCBjcDQzNyA9ICdcXHUwMDAw4pi64pi74pml4pmm4pmj4pmg4oCi4peY4peL4peZ4pmC4pmA4pmq4pmr4pi84pa64peE4oaV4oC8wrbCp+KWrOKGqOKGkeKGk+KGkuKGkOKIn+KGlOKWsuKWvCAhXCIjJCUmXFwnKCkqKywtLi8wMTIzNDU2Nzg5Ojs8PT4/QEFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaW1xcXFxdXl9gYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXp7fH1+4oyCw4fDvMOpw6LDpMOgw6XDp8Oqw6vDqMOvw67DrMOEw4XDicOmw4bDtMO2w7LDu8O5w7/DlsOcwqLCo8Kl4oKnxpLDocOtw7PDusOxw5HCqsK6wr/ijJDCrMK9wrzCocKrwrvilpHilpLilpPilILilKTilaHilaLilZbilZXilaPilZHilZfilZ3ilZzilZvilJDilJTilLTilKzilJzilIDilLzilZ7ilZ/ilZrilZTilanilabilaDilZDilazilafilajilaTilaXilZnilZjilZLilZPilavilarilJjilIzilojiloTilozilpDiloDOscOfzpPPgM6jz4PCtc+EzqbOmM6pzrTiiJ7Phs614oip4omhwrHiiaXiiaTijKDijKHDt+KJiMKw4oiZwrfiiJrigb/CsuKWoCAnO1xuXG5VbnppcFN0cmVhbS5wcm90b3R5cGUuX2RlY29kZVN0cmluZyA9IGZ1bmN0aW9uIChidWZmZXIsIGlzVXRmOCkge1xuICAgIGlmIChpc1V0ZjgpIHtcbiAgICAgICAgcmV0dXJuIGJ1ZmZlci50b1N0cmluZygndXRmOCcpO1xuICAgIH1cbiAgICAvLyBhbGxvdyBwYXNzaW5nIGN1c3RvbSBkZWNvZGVyXG4gICAgaWYgKHRoaXMub3B0aW9ucy5kZWNvZGVTdHJpbmcpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMub3B0aW9ucy5kZWNvZGVTdHJpbmcoYnVmZmVyKTtcbiAgICB9XG4gICAgbGV0IHJlc3VsdCA9IFwiXCI7XG4gICAgZm9yICh2YXIgaT0wOyBpPGJ1ZmZlci5sZW5ndGg7IGkrKykge1xuICAgICAgICByZXN1bHQgKz0gY3A0MzdbYnVmZmVyW2ldXTtcbiAgICB9XG4gICAgcmV0dXJuIHJlc3VsdDtcbn1cblxuVW56aXBTdHJlYW0ucHJvdG90eXBlLl9wYXJzZU9yT3V0cHV0ID0gZnVuY3Rpb24gKGVuY29kaW5nLCBjYikge1xuICAgIHZhciBjb25zdW1lO1xuICAgIHdoaWxlICgoY29uc3VtZSA9IHRoaXMucHJvY2Vzc0RhdGFDaHVuayh0aGlzLmRhdGEpKSA+IDApIHtcbiAgICAgICAgdGhpcy5kYXRhID0gdGhpcy5kYXRhLnNsaWNlKGNvbnN1bWUpO1xuICAgICAgICBpZiAodGhpcy5kYXRhLmxlbmd0aCA9PT0gMCkgYnJlYWs7XG4gICAgfVxuXG4gICAgaWYgKHRoaXMuc3RhdGUgPT09IHN0YXRlcy5GSUxFX0RBVEEpIHtcbiAgICAgICAgaWYgKHRoaXMub3V0U3RyZWFtSW5mby5saW1pdCA+PSAwKSB7XG4gICAgICAgICAgICB2YXIgcmVtYWluaW5nID0gdGhpcy5vdXRTdHJlYW1JbmZvLmxpbWl0IC0gdGhpcy5vdXRTdHJlYW1JbmZvLndyaXR0ZW47XG4gICAgICAgICAgICB2YXIgcGFja2V0O1xuICAgICAgICAgICAgaWYgKHJlbWFpbmluZyA8IHRoaXMuZGF0YS5sZW5ndGgpIHtcbiAgICAgICAgICAgICAgICBwYWNrZXQgPSB0aGlzLmRhdGEuc2xpY2UoMCwgcmVtYWluaW5nKTtcbiAgICAgICAgICAgICAgICB0aGlzLmRhdGEgPSB0aGlzLmRhdGEuc2xpY2UocmVtYWluaW5nKTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgcGFja2V0ID0gdGhpcy5kYXRhO1xuICAgICAgICAgICAgICAgIHRoaXMuZGF0YSA9IG5ldyBCdWZmZXIoJycpO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICB0aGlzLm91dFN0cmVhbUluZm8ud3JpdHRlbiArPSBwYWNrZXQubGVuZ3RoO1xuICAgICAgICAgICAgaWYgKHRoaXMub3V0U3RyZWFtSW5mby5saW1pdCA9PT0gdGhpcy5vdXRTdHJlYW1JbmZvLndyaXR0ZW4pIHtcbiAgICAgICAgICAgICAgICB0aGlzLnN0YXRlID0gc3RhdGVzLlNUQVJUO1xuXG4gICAgICAgICAgICAgICAgdGhpcy5vdXRTdHJlYW1JbmZvLnN0cmVhbS5lbmQocGFja2V0LCBlbmNvZGluZywgY2IpO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICB0aGlzLm91dFN0cmVhbUluZm8uc3RyZWFtLndyaXRlKHBhY2tldCwgZW5jb2RpbmcsIGNiKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHZhciBwYWNrZXQgPSB0aGlzLmRhdGE7XG4gICAgICAgICAgICB0aGlzLmRhdGEgPSBuZXcgQnVmZmVyKCcnKTtcblxuICAgICAgICAgICAgdGhpcy5vdXRTdHJlYW1JbmZvLndyaXR0ZW4gKz0gcGFja2V0Lmxlbmd0aDtcbiAgICAgICAgICAgIHZhciBvdXRwdXRTdHJlYW0gPSB0aGlzLm91dFN0cmVhbUluZm8uc3RyZWFtO1xuICAgICAgICAgICAgb3V0cHV0U3RyZWFtLndyaXRlKHBhY2tldCwgZW5jb2RpbmcsICgpID0+IHtcbiAgICAgICAgICAgICAgICBpZiAodGhpcy5zdGF0ZSA9PT0gc3RhdGVzLkZJTEVfREFUQV9FTkQpIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5zdGF0ZSA9IHN0YXRlcy5TVEFSVDtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG91dHB1dFN0cmVhbS5lbmQoY2IpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBjYigpO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICAgICAgLy8gd2UndmUgd3JpdHRlbiB0byB0aGUgb3V0cHV0IHN0cmVhbSwgbGV0dGluZyB0aGF0IHdyaXRlIGRlYWwgd2l0aCB0aGUgY2FsbGJhY2tcbiAgICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGNiKCk7XG59XG5cblVuemlwU3RyZWFtLnByb3RvdHlwZS5kcmFpbkFsbCA9IGZ1bmN0aW9uICgpIHtcbiAgICB0aGlzLl9kcmFpbkFsbEVudHJpZXMgPSB0cnVlO1xufVxuXG5VbnppcFN0cmVhbS5wcm90b3R5cGUuX3RyYW5zZm9ybSA9IGZ1bmN0aW9uIChjaHVuaywgZW5jb2RpbmcsIGNiKSB7XG4gICAgdmFyIHNlbGYgPSB0aGlzO1xuICAgIGlmIChzZWxmLmRhdGEubGVuZ3RoID4gMCkge1xuICAgICAgICBzZWxmLmRhdGEgPSBCdWZmZXIuY29uY2F0KFtzZWxmLmRhdGEsIGNodW5rXSk7XG4gICAgfSBlbHNlIHtcbiAgICAgICAgc2VsZi5kYXRhID0gY2h1bms7XG4gICAgfVxuXG4gICAgdmFyIHN0YXJ0RGF0YUxlbmd0aCA9IHNlbGYuZGF0YS5sZW5ndGg7XG4gICAgdmFyIGRvbmUgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIGlmIChzZWxmLmRhdGEubGVuZ3RoID4gMCAmJiBzZWxmLmRhdGEubGVuZ3RoIDwgc3RhcnREYXRhTGVuZ3RoKSB7XG4gICAgICAgICAgICBzdGFydERhdGFMZW5ndGggPSBzZWxmLmRhdGEubGVuZ3RoO1xuICAgICAgICAgICAgc2VsZi5fcGFyc2VPck91dHB1dChlbmNvZGluZywgZG9uZSk7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgY2IoKTtcbiAgICB9O1xuICAgIHNlbGYuX3BhcnNlT3JPdXRwdXQoZW5jb2RpbmcsIGRvbmUpO1xufVxuXG5VbnppcFN0cmVhbS5wcm90b3R5cGUuX2ZsdXNoID0gZnVuY3Rpb24gKGNiKSB7XG4gICAgdmFyIHNlbGYgPSB0aGlzO1xuICAgIGlmIChzZWxmLmRhdGEubGVuZ3RoID4gMCkge1xuICAgICAgICBzZWxmLl9wYXJzZU9yT3V0cHV0KCdidWZmZXInLCBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICBpZiAoc2VsZi5kYXRhLmxlbmd0aCA+IDApIHJldHVybiBzZXRJbW1lZGlhdGUoZnVuY3Rpb24gKCkgeyBzZWxmLl9mbHVzaChjYik7IH0pO1xuICAgICAgICAgICAgY2IoKTtcbiAgICAgICAgfSk7XG5cbiAgICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGlmIChzZWxmLnN0YXRlID09PSBzdGF0ZXMuRklMRV9EQVRBKSB7XG4gICAgICAgIC8vIHVoIG9oLCBzb21ldGhpbmcgd2VudCB3cm9uZ1xuICAgICAgICByZXR1cm4gY2IobmV3IEVycm9yKFwiU3RyZWFtIGZpbmlzaGVkIGluIGFuIGludmFsaWQgc3RhdGUsIHVuY29tcHJlc3Npb24gZmFpbGVkXCIpKTtcbiAgICB9XG5cbiAgICBzZXRJbW1lZGlhdGUoY2IpO1xufVxuXG5tb2R1bGUuZXhwb3J0cyA9IFVuemlwU3RyZWFtO1xuIiwKICAgICJ2YXIgVHJhbnNmb3JtID0gcmVxdWlyZSgnc3RyZWFtJykuVHJhbnNmb3JtO1xudmFyIHV0aWwgPSByZXF1aXJlKCd1dGlsJyk7XG52YXIgVW56aXBTdHJlYW0gPSByZXF1aXJlKCcuL3VuemlwLXN0cmVhbScpO1xuXG5mdW5jdGlvbiBQYXJzZXJTdHJlYW0ob3B0cykge1xuICAgIGlmICghKHRoaXMgaW5zdGFuY2VvZiBQYXJzZXJTdHJlYW0pKSB7XG4gICAgICAgIHJldHVybiBuZXcgUGFyc2VyU3RyZWFtKG9wdHMpO1xuICAgIH1cblxuICAgIHZhciB0cmFuc2Zvcm1PcHRzID0gb3B0cyB8fCB7fTtcbiAgICBUcmFuc2Zvcm0uY2FsbCh0aGlzLCB7IHJlYWRhYmxlT2JqZWN0TW9kZTogdHJ1ZSB9KTtcblxuICAgIHRoaXMub3B0cyA9IG9wdHMgfHwge307XG4gICAgdGhpcy51bnppcFN0cmVhbSA9IG5ldyBVbnppcFN0cmVhbSh0aGlzLm9wdHMpO1xuXG4gICAgdmFyIHNlbGYgPSB0aGlzO1xuICAgIHRoaXMudW56aXBTdHJlYW0ub24oJ2VudHJ5JywgZnVuY3Rpb24oZW50cnkpIHtcbiAgICAgICAgc2VsZi5wdXNoKGVudHJ5KTtcbiAgICB9KTtcbiAgICB0aGlzLnVuemlwU3RyZWFtLm9uKCdlcnJvcicsIGZ1bmN0aW9uKGVycm9yKSB7XG4gICAgICAgIHNlbGYuZW1pdCgnZXJyb3InLCBlcnJvcik7XG4gICAgfSk7XG59XG5cbnV0aWwuaW5oZXJpdHMoUGFyc2VyU3RyZWFtLCBUcmFuc2Zvcm0pO1xuXG5QYXJzZXJTdHJlYW0ucHJvdG90eXBlLl90cmFuc2Zvcm0gPSBmdW5jdGlvbiAoY2h1bmssIGVuY29kaW5nLCBjYikge1xuICAgIHRoaXMudW56aXBTdHJlYW0ud3JpdGUoY2h1bmssIGVuY29kaW5nLCBjYik7XG59XG5cblBhcnNlclN0cmVhbS5wcm90b3R5cGUuX2ZsdXNoID0gZnVuY3Rpb24gKGNiKSB7XG4gICAgdmFyIHNlbGYgPSB0aGlzO1xuICAgIHRoaXMudW56aXBTdHJlYW0uZW5kKGZ1bmN0aW9uKCkge1xuICAgICAgICBwcm9jZXNzLm5leHRUaWNrKGZ1bmN0aW9uKCkgeyBzZWxmLmVtaXQoJ2Nsb3NlJyk7IH0pO1xuICAgICAgICBjYigpO1xuICAgIH0pO1xufVxuXG5QYXJzZXJTdHJlYW0ucHJvdG90eXBlLm9uID0gZnVuY3Rpb24oZXZlbnROYW1lLCBmbikge1xuICAgIGlmIChldmVudE5hbWUgPT09ICdlbnRyeScpIHtcbiAgICAgICAgcmV0dXJuIFRyYW5zZm9ybS5wcm90b3R5cGUub24uY2FsbCh0aGlzLCAnZGF0YScsIGZuKTtcbiAgICB9XG4gICAgcmV0dXJuIFRyYW5zZm9ybS5wcm90b3R5cGUub24uY2FsbCh0aGlzLCBldmVudE5hbWUsIGZuKTtcbn1cblxuUGFyc2VyU3RyZWFtLnByb3RvdHlwZS5kcmFpbkFsbCA9IGZ1bmN0aW9uICgpIHtcbiAgICB0aGlzLnVuemlwU3RyZWFtLmRyYWluQWxsKCk7XG4gICAgcmV0dXJuIHRoaXMucGlwZShuZXcgVHJhbnNmb3JtKHsgb2JqZWN0TW9kZTogdHJ1ZSwgdHJhbnNmb3JtOiBmdW5jdGlvbiAoZCwgZSwgY2IpIHsgY2IoKTsgfSB9KSk7XG59XG5cbm1vZHVsZS5leHBvcnRzID0gUGFyc2VyU3RyZWFtO1xuIiwKICAgICJ2YXIgcGF0aCA9IHJlcXVpcmUoJ3BhdGgnKTtcbnZhciBmcyA9IHJlcXVpcmUoJ2ZzJyk7XG52YXIgXzA3NzcgPSBwYXJzZUludCgnMDc3NycsIDgpO1xuXG5tb2R1bGUuZXhwb3J0cyA9IG1rZGlyUC5ta2RpcnAgPSBta2RpclAubWtkaXJQID0gbWtkaXJQO1xuXG5mdW5jdGlvbiBta2RpclAgKHAsIG9wdHMsIGYsIG1hZGUpIHtcbiAgICBpZiAodHlwZW9mIG9wdHMgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgZiA9IG9wdHM7XG4gICAgICAgIG9wdHMgPSB7fTtcbiAgICB9XG4gICAgZWxzZSBpZiAoIW9wdHMgfHwgdHlwZW9mIG9wdHMgIT09ICdvYmplY3QnKSB7XG4gICAgICAgIG9wdHMgPSB7IG1vZGU6IG9wdHMgfTtcbiAgICB9XG4gICAgXG4gICAgdmFyIG1vZGUgPSBvcHRzLm1vZGU7XG4gICAgdmFyIHhmcyA9IG9wdHMuZnMgfHwgZnM7XG4gICAgXG4gICAgaWYgKG1vZGUgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICBtb2RlID0gXzA3NzdcbiAgICB9XG4gICAgaWYgKCFtYWRlKSBtYWRlID0gbnVsbDtcbiAgICBcbiAgICB2YXIgY2IgPSBmIHx8IC8qIGlzdGFuYnVsIGlnbm9yZSBuZXh0ICovIGZ1bmN0aW9uICgpIHt9O1xuICAgIHAgPSBwYXRoLnJlc29sdmUocCk7XG4gICAgXG4gICAgeGZzLm1rZGlyKHAsIG1vZGUsIGZ1bmN0aW9uIChlcikge1xuICAgICAgICBpZiAoIWVyKSB7XG4gICAgICAgICAgICBtYWRlID0gbWFkZSB8fCBwO1xuICAgICAgICAgICAgcmV0dXJuIGNiKG51bGwsIG1hZGUpO1xuICAgICAgICB9XG4gICAgICAgIHN3aXRjaCAoZXIuY29kZSkge1xuICAgICAgICAgICAgY2FzZSAnRU5PRU5UJzpcbiAgICAgICAgICAgICAgICAvKiBpc3RhbmJ1bCBpZ25vcmUgaWYgKi9cbiAgICAgICAgICAgICAgICBpZiAocGF0aC5kaXJuYW1lKHApID09PSBwKSByZXR1cm4gY2IoZXIpO1xuICAgICAgICAgICAgICAgIG1rZGlyUChwYXRoLmRpcm5hbWUocCksIG9wdHMsIGZ1bmN0aW9uIChlciwgbWFkZSkge1xuICAgICAgICAgICAgICAgICAgICAvKiBpc3RhbmJ1bCBpZ25vcmUgaWYgKi9cbiAgICAgICAgICAgICAgICAgICAgaWYgKGVyKSBjYihlciwgbWFkZSk7XG4gICAgICAgICAgICAgICAgICAgIGVsc2UgbWtkaXJQKHAsIG9wdHMsIGNiLCBtYWRlKTtcbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICBicmVhaztcblxuICAgICAgICAgICAgLy8gSW4gdGhlIGNhc2Ugb2YgYW55IG90aGVyIGVycm9yLCBqdXN0IHNlZSBpZiB0aGVyZSdzIGEgZGlyXG4gICAgICAgICAgICAvLyB0aGVyZSBhbHJlYWR5LiAgSWYgc28sIHRoZW4gaG9vcmF5ISAgSWYgbm90LCB0aGVuIHNvbWV0aGluZ1xuICAgICAgICAgICAgLy8gaXMgYm9ya2VkLlxuICAgICAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICAgICAgICB4ZnMuc3RhdChwLCBmdW5jdGlvbiAoZXIyLCBzdGF0KSB7XG4gICAgICAgICAgICAgICAgICAgIC8vIGlmIHRoZSBzdGF0IGZhaWxzLCB0aGVuIHRoYXQncyBzdXBlciB3ZWlyZC5cbiAgICAgICAgICAgICAgICAgICAgLy8gbGV0IHRoZSBvcmlnaW5hbCBlcnJvciBiZSB0aGUgZmFpbHVyZSByZWFzb24uXG4gICAgICAgICAgICAgICAgICAgIGlmIChlcjIgfHwgIXN0YXQuaXNEaXJlY3RvcnkoKSkgY2IoZXIsIG1hZGUpXG4gICAgICAgICAgICAgICAgICAgIGVsc2UgY2IobnVsbCwgbWFkZSk7XG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cbiAgICB9KTtcbn1cblxubWtkaXJQLnN5bmMgPSBmdW5jdGlvbiBzeW5jIChwLCBvcHRzLCBtYWRlKSB7XG4gICAgaWYgKCFvcHRzIHx8IHR5cGVvZiBvcHRzICE9PSAnb2JqZWN0Jykge1xuICAgICAgICBvcHRzID0geyBtb2RlOiBvcHRzIH07XG4gICAgfVxuICAgIFxuICAgIHZhciBtb2RlID0gb3B0cy5tb2RlO1xuICAgIHZhciB4ZnMgPSBvcHRzLmZzIHx8IGZzO1xuICAgIFxuICAgIGlmIChtb2RlID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgbW9kZSA9IF8wNzc3XG4gICAgfVxuICAgIGlmICghbWFkZSkgbWFkZSA9IG51bGw7XG5cbiAgICBwID0gcGF0aC5yZXNvbHZlKHApO1xuXG4gICAgdHJ5IHtcbiAgICAgICAgeGZzLm1rZGlyU3luYyhwLCBtb2RlKTtcbiAgICAgICAgbWFkZSA9IG1hZGUgfHwgcDtcbiAgICB9XG4gICAgY2F0Y2ggKGVycjApIHtcbiAgICAgICAgc3dpdGNoIChlcnIwLmNvZGUpIHtcbiAgICAgICAgICAgIGNhc2UgJ0VOT0VOVCcgOlxuICAgICAgICAgICAgICAgIG1hZGUgPSBzeW5jKHBhdGguZGlybmFtZShwKSwgb3B0cywgbWFkZSk7XG4gICAgICAgICAgICAgICAgc3luYyhwLCBvcHRzLCBtYWRlKTtcbiAgICAgICAgICAgICAgICBicmVhaztcblxuICAgICAgICAgICAgLy8gSW4gdGhlIGNhc2Ugb2YgYW55IG90aGVyIGVycm9yLCBqdXN0IHNlZSBpZiB0aGVyZSdzIGEgZGlyXG4gICAgICAgICAgICAvLyB0aGVyZSBhbHJlYWR5LiAgSWYgc28sIHRoZW4gaG9vcmF5ISAgSWYgbm90LCB0aGVuIHNvbWV0aGluZ1xuICAgICAgICAgICAgLy8gaXMgYm9ya2VkLlxuICAgICAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICAgICAgICB2YXIgc3RhdDtcbiAgICAgICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgICAgICBzdGF0ID0geGZzLnN0YXRTeW5jKHApO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBjYXRjaCAoZXJyMSkgLyogaXN0YW5idWwgaWdub3JlIG5leHQgKi8ge1xuICAgICAgICAgICAgICAgICAgICB0aHJvdyBlcnIwO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAvKiBpc3RhbmJ1bCBpZ25vcmUgaWYgKi9cbiAgICAgICAgICAgICAgICBpZiAoIXN0YXQuaXNEaXJlY3RvcnkoKSkgdGhyb3cgZXJyMDtcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiBtYWRlO1xufTtcbiIsCiAgICAidmFyIGZzID0gcmVxdWlyZSgnZnMnKTtcbnZhciBwYXRoID0gcmVxdWlyZSgncGF0aCcpO1xudmFyIHV0aWwgPSByZXF1aXJlKCd1dGlsJyk7XG52YXIgbWtkaXJwID0gcmVxdWlyZSgnbWtkaXJwJyk7XG52YXIgVHJhbnNmb3JtID0gcmVxdWlyZSgnc3RyZWFtJykuVHJhbnNmb3JtO1xudmFyIFVuemlwU3RyZWFtID0gcmVxdWlyZSgnLi91bnppcC1zdHJlYW0nKTtcblxuZnVuY3Rpb24gRXh0cmFjdCAob3B0cykge1xuICAgIGlmICghKHRoaXMgaW5zdGFuY2VvZiBFeHRyYWN0KSlcbiAgICByZXR1cm4gbmV3IEV4dHJhY3Qob3B0cyk7XG5cbiAgICBUcmFuc2Zvcm0uY2FsbCh0aGlzKTtcblxuICAgIHRoaXMub3B0cyA9IG9wdHMgfHwge307XG4gICAgdGhpcy51bnppcFN0cmVhbSA9IG5ldyBVbnppcFN0cmVhbSh0aGlzLm9wdHMpO1xuICAgIHRoaXMudW5maW5pc2hlZEVudHJpZXMgPSAwO1xuICAgIHRoaXMuYWZ0ZXJGbHVzaFdhaXQgPSBmYWxzZTtcbiAgICB0aGlzLmNyZWF0ZWREaXJlY3RvcmllcyA9IHt9O1xuXG4gICAgdmFyIHNlbGYgPSB0aGlzO1xuICAgIHRoaXMudW56aXBTdHJlYW0ub24oJ2VudHJ5JywgdGhpcy5fcHJvY2Vzc0VudHJ5LmJpbmQodGhpcykpO1xuICAgIHRoaXMudW56aXBTdHJlYW0ub24oJ2Vycm9yJywgZnVuY3Rpb24oZXJyb3IpIHtcbiAgICAgICAgc2VsZi5lbWl0KCdlcnJvcicsIGVycm9yKTtcbiAgICB9KTtcbn1cblxudXRpbC5pbmhlcml0cyhFeHRyYWN0LCBUcmFuc2Zvcm0pO1xuXG5FeHRyYWN0LnByb3RvdHlwZS5fdHJhbnNmb3JtID0gZnVuY3Rpb24gKGNodW5rLCBlbmNvZGluZywgY2IpIHtcbiAgICB0aGlzLnVuemlwU3RyZWFtLndyaXRlKGNodW5rLCBlbmNvZGluZywgY2IpO1xufVxuXG5FeHRyYWN0LnByb3RvdHlwZS5fZmx1c2ggPSBmdW5jdGlvbiAoY2IpIHtcbiAgICB2YXIgc2VsZiA9IHRoaXM7XG5cbiAgICB2YXIgYWxsRG9uZSA9IGZ1bmN0aW9uKCkge1xuICAgICAgICBwcm9jZXNzLm5leHRUaWNrKGZ1bmN0aW9uKCkgeyBzZWxmLmVtaXQoJ2Nsb3NlJyk7IH0pO1xuICAgICAgICBjYigpO1xuICAgIH1cblxuICAgIHRoaXMudW56aXBTdHJlYW0uZW5kKGZ1bmN0aW9uKCkge1xuICAgICAgICBpZiAoc2VsZi51bmZpbmlzaGVkRW50cmllcyA+IDApIHtcbiAgICAgICAgICAgIHNlbGYuYWZ0ZXJGbHVzaFdhaXQgPSB0cnVlO1xuICAgICAgICAgICAgcmV0dXJuIHNlbGYub24oJ2F3YWl0LWZpbmlzaGVkJywgYWxsRG9uZSk7XG4gICAgICAgIH1cbiAgICAgICAgYWxsRG9uZSgpO1xuICAgIH0pO1xufVxuXG5FeHRyYWN0LnByb3RvdHlwZS5fcHJvY2Vzc0VudHJ5ID0gZnVuY3Rpb24gKGVudHJ5KSB7XG4gICAgdmFyIHNlbGYgPSB0aGlzO1xuICAgIHZhciBkZXN0UGF0aCA9IHBhdGguam9pbih0aGlzLm9wdHMucGF0aCwgZW50cnkucGF0aCk7XG4gICAgdmFyIGRpcmVjdG9yeSA9IGVudHJ5LmlzRGlyZWN0b3J5ID8gZGVzdFBhdGggOiBwYXRoLmRpcm5hbWUoZGVzdFBhdGgpO1xuXG4gICAgdGhpcy51bmZpbmlzaGVkRW50cmllcysrO1xuXG4gICAgdmFyIHdyaXRlRmlsZUZuID0gZnVuY3Rpb24oKSB7XG4gICAgICAgIHZhciBwaXBlZFN0cmVhbSA9IGZzLmNyZWF0ZVdyaXRlU3RyZWFtKGRlc3RQYXRoKTtcblxuICAgICAgICBwaXBlZFN0cmVhbS5vbignY2xvc2UnLCBmdW5jdGlvbigpIHtcbiAgICAgICAgICAgIHNlbGYudW5maW5pc2hlZEVudHJpZXMtLTtcbiAgICAgICAgICAgIHNlbGYuX25vdGlmeUF3YWl0ZXIoKTtcbiAgICAgICAgfSk7XG4gICAgICAgIHBpcGVkU3RyZWFtLm9uKCdlcnJvcicsIGZ1bmN0aW9uIChlcnJvcikge1xuICAgICAgICAgICAgc2VsZi5lbWl0KCdlcnJvcicsIGVycm9yKTtcbiAgICAgICAgfSk7XG4gICAgICAgIGVudHJ5LnBpcGUocGlwZWRTdHJlYW0pO1xuICAgIH1cblxuICAgIGlmICh0aGlzLmNyZWF0ZWREaXJlY3Rvcmllc1tkaXJlY3RvcnldIHx8IGRpcmVjdG9yeSA9PT0gJy4nKSB7XG4gICAgICAgIHJldHVybiB3cml0ZUZpbGVGbigpO1xuICAgIH1cblxuICAgIC8vIEZJWE1FOiBjYWxscyB0byBta2RpcnAgY2FuIHN0aWxsIGJlIGR1cGxpY2F0ZWRcbiAgICBta2RpcnAoZGlyZWN0b3J5LCBmdW5jdGlvbihlcnIpIHtcbiAgICAgICAgaWYgKGVycikgcmV0dXJuIHNlbGYuZW1pdCgnZXJyb3InLCBlcnIpO1xuXG4gICAgICAgIHNlbGYuY3JlYXRlZERpcmVjdG9yaWVzW2RpcmVjdG9yeV0gPSB0cnVlO1xuXG4gICAgICAgIGlmIChlbnRyeS5pc0RpcmVjdG9yeSkge1xuICAgICAgICAgICAgc2VsZi51bmZpbmlzaGVkRW50cmllcy0tO1xuICAgICAgICAgICAgc2VsZi5fbm90aWZ5QXdhaXRlcigpO1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgd3JpdGVGaWxlRm4oKTtcbiAgICB9KTtcbn1cblxuRXh0cmFjdC5wcm90b3R5cGUuX25vdGlmeUF3YWl0ZXIgPSBmdW5jdGlvbigpIHtcbiAgICBpZiAodGhpcy5hZnRlckZsdXNoV2FpdCAmJiB0aGlzLnVuZmluaXNoZWRFbnRyaWVzID09PSAwKSB7XG4gICAgICAgIHRoaXMuZW1pdCgnYXdhaXQtZmluaXNoZWQnKTtcbiAgICAgICAgdGhpcy5hZnRlckZsdXNoV2FpdCA9IGZhbHNlO1xuICAgIH1cbn1cblxubW9kdWxlLmV4cG9ydHMgPSBFeHRyYWN0OyIsCiAgICAiJ3VzZSBzdHJpY3QnO1xuXG5leHBvcnRzLlBhcnNlID0gcmVxdWlyZSgnLi9saWIvcGFyc2VyLXN0cmVhbScpO1xuZXhwb3J0cy5FeHRyYWN0ID0gcmVxdWlyZSgnLi9saWIvZXh0cmFjdCcpOyIsCiAgICAiXCJ1c2Ugc3RyaWN0XCI7XG52YXIgX19jcmVhdGVCaW5kaW5nID0gKHRoaXMgJiYgdGhpcy5fX2NyZWF0ZUJpbmRpbmcpIHx8IChPYmplY3QuY3JlYXRlID8gKGZ1bmN0aW9uKG8sIG0sIGssIGsyKSB7XG4gICAgaWYgKGsyID09PSB1bmRlZmluZWQpIGsyID0gaztcbiAgICB2YXIgZGVzYyA9IE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IobSwgayk7XG4gICAgaWYgKCFkZXNjIHx8IChcImdldFwiIGluIGRlc2MgPyAhbS5fX2VzTW9kdWxlIDogZGVzYy53cml0YWJsZSB8fCBkZXNjLmNvbmZpZ3VyYWJsZSkpIHtcbiAgICAgIGRlc2MgPSB7IGVudW1lcmFibGU6IHRydWUsIGdldDogZnVuY3Rpb24oKSB7IHJldHVybiBtW2tdOyB9IH07XG4gICAgfVxuICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShvLCBrMiwgZGVzYyk7XG59KSA6IChmdW5jdGlvbihvLCBtLCBrLCBrMikge1xuICAgIGlmIChrMiA9PT0gdW5kZWZpbmVkKSBrMiA9IGs7XG4gICAgb1trMl0gPSBtW2tdO1xufSkpO1xudmFyIF9fc2V0TW9kdWxlRGVmYXVsdCA9ICh0aGlzICYmIHRoaXMuX19zZXRNb2R1bGVEZWZhdWx0KSB8fCAoT2JqZWN0LmNyZWF0ZSA/IChmdW5jdGlvbihvLCB2KSB7XG4gICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KG8sIFwiZGVmYXVsdFwiLCB7IGVudW1lcmFibGU6IHRydWUsIHZhbHVlOiB2IH0pO1xufSkgOiBmdW5jdGlvbihvLCB2KSB7XG4gICAgb1tcImRlZmF1bHRcIl0gPSB2O1xufSk7XG52YXIgX19pbXBvcnRTdGFyID0gKHRoaXMgJiYgdGhpcy5fX2ltcG9ydFN0YXIpIHx8IGZ1bmN0aW9uIChtb2QpIHtcbiAgICBpZiAobW9kICYmIG1vZC5fX2VzTW9kdWxlKSByZXR1cm4gbW9kO1xuICAgIHZhciByZXN1bHQgPSB7fTtcbiAgICBpZiAobW9kICE9IG51bGwpIGZvciAodmFyIGsgaW4gbW9kKSBpZiAoayAhPT0gXCJkZWZhdWx0XCIgJiYgT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKG1vZCwgaykpIF9fY3JlYXRlQmluZGluZyhyZXN1bHQsIG1vZCwgayk7XG4gICAgX19zZXRNb2R1bGVEZWZhdWx0KHJlc3VsdCwgbW9kKTtcbiAgICByZXR1cm4gcmVzdWx0O1xufTtcbnZhciBfX2F3YWl0ZXIgPSAodGhpcyAmJiB0aGlzLl9fYXdhaXRlcikgfHwgZnVuY3Rpb24gKHRoaXNBcmcsIF9hcmd1bWVudHMsIFAsIGdlbmVyYXRvcikge1xuICAgIGZ1bmN0aW9uIGFkb3B0KHZhbHVlKSB7IHJldHVybiB2YWx1ZSBpbnN0YW5jZW9mIFAgPyB2YWx1ZSA6IG5ldyBQKGZ1bmN0aW9uIChyZXNvbHZlKSB7IHJlc29sdmUodmFsdWUpOyB9KTsgfVxuICAgIHJldHVybiBuZXcgKFAgfHwgKFAgPSBQcm9taXNlKSkoZnVuY3Rpb24gKHJlc29sdmUsIHJlamVjdCkge1xuICAgICAgICBmdW5jdGlvbiBmdWxmaWxsZWQodmFsdWUpIHsgdHJ5IHsgc3RlcChnZW5lcmF0b3IubmV4dCh2YWx1ZSkpOyB9IGNhdGNoIChlKSB7IHJlamVjdChlKTsgfSB9XG4gICAgICAgIGZ1bmN0aW9uIHJlamVjdGVkKHZhbHVlKSB7IHRyeSB7IHN0ZXAoZ2VuZXJhdG9yW1widGhyb3dcIl0odmFsdWUpKTsgfSBjYXRjaCAoZSkgeyByZWplY3QoZSk7IH0gfVxuICAgICAgICBmdW5jdGlvbiBzdGVwKHJlc3VsdCkgeyByZXN1bHQuZG9uZSA/IHJlc29sdmUocmVzdWx0LnZhbHVlKSA6IGFkb3B0KHJlc3VsdC52YWx1ZSkudGhlbihmdWxmaWxsZWQsIHJlamVjdGVkKTsgfVxuICAgICAgICBzdGVwKChnZW5lcmF0b3IgPSBnZW5lcmF0b3IuYXBwbHkodGhpc0FyZywgX2FyZ3VtZW50cyB8fCBbXSkpLm5leHQoKSk7XG4gICAgfSk7XG59O1xudmFyIF9faW1wb3J0RGVmYXVsdCA9ICh0aGlzICYmIHRoaXMuX19pbXBvcnREZWZhdWx0KSB8fCBmdW5jdGlvbiAobW9kKSB7XG4gICAgcmV0dXJuIChtb2QgJiYgbW9kLl9fZXNNb2R1bGUpID8gbW9kIDogeyBcImRlZmF1bHRcIjogbW9kIH07XG59O1xuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiX19lc01vZHVsZVwiLCB7IHZhbHVlOiB0cnVlIH0pO1xuZXhwb3J0cy5kb3dubG9hZEFydGlmYWN0SW50ZXJuYWwgPSBleHBvcnRzLmRvd25sb2FkQXJ0aWZhY3RQdWJsaWMgPSBleHBvcnRzLnN0cmVhbUV4dHJhY3RFeHRlcm5hbCA9IHZvaWQgMDtcbmNvbnN0IHByb21pc2VzXzEgPSBfX2ltcG9ydERlZmF1bHQocmVxdWlyZShcImZzL3Byb21pc2VzXCIpKTtcbmNvbnN0IGdpdGh1YiA9IF9faW1wb3J0U3RhcihyZXF1aXJlKFwiQGFjdGlvbnMvZ2l0aHViXCIpKTtcbmNvbnN0IGNvcmUgPSBfX2ltcG9ydFN0YXIocmVxdWlyZShcIkBhY3Rpb25zL2NvcmVcIikpO1xuY29uc3QgaHR0cENsaWVudCA9IF9faW1wb3J0U3RhcihyZXF1aXJlKFwiQGFjdGlvbnMvaHR0cC1jbGllbnRcIikpO1xuY29uc3QgdW56aXBfc3RyZWFtXzEgPSBfX2ltcG9ydERlZmF1bHQocmVxdWlyZShcInVuemlwLXN0cmVhbVwiKSk7XG5jb25zdCB1c2VyX2FnZW50XzEgPSByZXF1aXJlKFwiLi4vc2hhcmVkL3VzZXItYWdlbnRcIik7XG5jb25zdCBjb25maWdfMSA9IHJlcXVpcmUoXCIuLi9zaGFyZWQvY29uZmlnXCIpO1xuY29uc3QgYXJ0aWZhY3RfdHdpcnBfY2xpZW50XzEgPSByZXF1aXJlKFwiLi4vc2hhcmVkL2FydGlmYWN0LXR3aXJwLWNsaWVudFwiKTtcbmNvbnN0IGdlbmVyYXRlZF8xID0gcmVxdWlyZShcIi4uLy4uL2dlbmVyYXRlZFwiKTtcbmNvbnN0IHV0aWxfMSA9IHJlcXVpcmUoXCIuLi9zaGFyZWQvdXRpbFwiKTtcbmNvbnN0IGVycm9yc18xID0gcmVxdWlyZShcIi4uL3NoYXJlZC9lcnJvcnNcIik7XG5jb25zdCBzY3J1YlF1ZXJ5UGFyYW1ldGVycyA9ICh1cmwpID0+IHtcbiAgICBjb25zdCBwYXJzZWQgPSBuZXcgVVJMKHVybCk7XG4gICAgcGFyc2VkLnNlYXJjaCA9ICcnO1xuICAgIHJldHVybiBwYXJzZWQudG9TdHJpbmcoKTtcbn07XG5mdW5jdGlvbiBleGlzdHMocGF0aCkge1xuICAgIHJldHVybiBfX2F3YWl0ZXIodGhpcywgdm9pZCAwLCB2b2lkIDAsIGZ1bmN0aW9uKiAoKSB7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgICB5aWVsZCBwcm9taXNlc18xLmRlZmF1bHQuYWNjZXNzKHBhdGgpO1xuICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgIH1cbiAgICAgICAgY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgICAgICBpZiAoZXJyb3IuY29kZSA9PT0gJ0VOT0VOVCcpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICB0aHJvdyBlcnJvcjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH0pO1xufVxuZnVuY3Rpb24gc3RyZWFtRXh0cmFjdCh1cmwsIGRpcmVjdG9yeSkge1xuICAgIHJldHVybiBfX2F3YWl0ZXIodGhpcywgdm9pZCAwLCB2b2lkIDAsIGZ1bmN0aW9uKiAoKSB7XG4gICAgICAgIGxldCByZXRyeUNvdW50ID0gMDtcbiAgICAgICAgd2hpbGUgKHJldHJ5Q291bnQgPCA1KSB7XG4gICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgIHlpZWxkIHN0cmVhbUV4dHJhY3RFeHRlcm5hbCh1cmwsIGRpcmVjdG9yeSk7XG4gICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgICAgICAgICAgcmV0cnlDb3VudCsrO1xuICAgICAgICAgICAgICAgIGNvcmUuZGVidWcoYEZhaWxlZCB0byBkb3dubG9hZCBhcnRpZmFjdCBhZnRlciAke3JldHJ5Q291bnR9IHJldHJpZXMgZHVlIHRvICR7ZXJyb3IubWVzc2FnZX0uIFJldHJ5aW5nIGluIDUgc2Vjb25kcy4uLmApO1xuICAgICAgICAgICAgICAgIC8vIHdhaXQgNSBzZWNvbmRzIGJlZm9yZSByZXRyeWluZ1xuICAgICAgICAgICAgICAgIHlpZWxkIG5ldyBQcm9taXNlKHJlc29sdmUgPT4gc2V0VGltZW91dChyZXNvbHZlLCA1MDAwKSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBBcnRpZmFjdCBkb3dubG9hZCBmYWlsZWQgYWZ0ZXIgJHtyZXRyeUNvdW50fSByZXRyaWVzLmApO1xuICAgIH0pO1xufVxuZnVuY3Rpb24gc3RyZWFtRXh0cmFjdEV4dGVybmFsKHVybCwgZGlyZWN0b3J5KSB7XG4gICAgcmV0dXJuIF9fYXdhaXRlcih0aGlzLCB2b2lkIDAsIHZvaWQgMCwgZnVuY3Rpb24qICgpIHtcbiAgICAgICAgY29uc3QgY2xpZW50ID0gbmV3IGh0dHBDbGllbnQuSHR0cENsaWVudCgoMCwgdXNlcl9hZ2VudF8xLmdldFVzZXJBZ2VudFN0cmluZykoKSk7XG4gICAgICAgIGNvbnN0IHJlc3BvbnNlID0geWllbGQgY2xpZW50LmdldCh1cmwpO1xuICAgICAgICBpZiAocmVzcG9uc2UubWVzc2FnZS5zdGF0dXNDb2RlICE9PSAyMDApIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihgVW5leHBlY3RlZCBIVFRQIHJlc3BvbnNlIGZyb20gYmxvYiBzdG9yYWdlOiAke3Jlc3BvbnNlLm1lc3NhZ2Uuc3RhdHVzQ29kZX0gJHtyZXNwb25zZS5tZXNzYWdlLnN0YXR1c01lc3NhZ2V9YCk7XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgdGltZW91dCA9IDMwICogMTAwMDsgLy8gMzAgc2Vjb25kc1xuICAgICAgICByZXR1cm4gbmV3IFByb21pc2UoKHJlc29sdmUsIHJlamVjdCkgPT4ge1xuICAgICAgICAgICAgY29uc3QgdGltZXJGbiA9ICgpID0+IHtcbiAgICAgICAgICAgICAgICByZXNwb25zZS5tZXNzYWdlLmRlc3Ryb3kobmV3IEVycm9yKGBCbG9iIHN0b3JhZ2UgY2h1bmsgZGlkIG5vdCByZXNwb25kIGluICR7dGltZW91dH1tc2ApKTtcbiAgICAgICAgICAgIH07XG4gICAgICAgICAgICBjb25zdCB0aW1lciA9IHNldFRpbWVvdXQodGltZXJGbiwgdGltZW91dCk7XG4gICAgICAgICAgICByZXNwb25zZS5tZXNzYWdlXG4gICAgICAgICAgICAgICAgLm9uKCdkYXRhJywgKCkgPT4ge1xuICAgICAgICAgICAgICAgIHRpbWVyLnJlZnJlc2goKTtcbiAgICAgICAgICAgIH0pXG4gICAgICAgICAgICAgICAgLm9uKCdlcnJvcicsIChlcnJvcikgPT4ge1xuICAgICAgICAgICAgICAgIGNvcmUuZGVidWcoYHJlc3BvbnNlLm1lc3NhZ2U6IEFydGlmYWN0IGRvd25sb2FkIGZhaWxlZDogJHtlcnJvci5tZXNzYWdlfWApO1xuICAgICAgICAgICAgICAgIGNsZWFyVGltZW91dCh0aW1lcik7XG4gICAgICAgICAgICAgICAgcmVqZWN0KGVycm9yKTtcbiAgICAgICAgICAgIH0pXG4gICAgICAgICAgICAgICAgLnBpcGUodW56aXBfc3RyZWFtXzEuZGVmYXVsdC5FeHRyYWN0KHsgcGF0aDogZGlyZWN0b3J5IH0pKVxuICAgICAgICAgICAgICAgIC5vbignY2xvc2UnLCAoKSA9PiB7XG4gICAgICAgICAgICAgICAgY2xlYXJUaW1lb3V0KHRpbWVyKTtcbiAgICAgICAgICAgICAgICByZXNvbHZlKCk7XG4gICAgICAgICAgICB9KVxuICAgICAgICAgICAgICAgIC5vbignZXJyb3InLCAoZXJyb3IpID0+IHtcbiAgICAgICAgICAgICAgICByZWplY3QoZXJyb3IpO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgIH0pO1xuICAgIH0pO1xufVxuZXhwb3J0cy5zdHJlYW1FeHRyYWN0RXh0ZXJuYWwgPSBzdHJlYW1FeHRyYWN0RXh0ZXJuYWw7XG5mdW5jdGlvbiBkb3dubG9hZEFydGlmYWN0UHVibGljKGFydGlmYWN0SWQsIHJlcG9zaXRvcnlPd25lciwgcmVwb3NpdG9yeU5hbWUsIHRva2VuLCBvcHRpb25zKSB7XG4gICAgcmV0dXJuIF9fYXdhaXRlcih0aGlzLCB2b2lkIDAsIHZvaWQgMCwgZnVuY3Rpb24qICgpIHtcbiAgICAgICAgY29uc3QgZG93bmxvYWRQYXRoID0geWllbGQgcmVzb2x2ZU9yQ3JlYXRlRGlyZWN0b3J5KG9wdGlvbnMgPT09IG51bGwgfHwgb3B0aW9ucyA9PT0gdm9pZCAwID8gdm9pZCAwIDogb3B0aW9ucy5wYXRoKTtcbiAgICAgICAgY29uc3QgYXBpID0gZ2l0aHViLmdldE9jdG9raXQodG9rZW4pO1xuICAgICAgICBjb3JlLmluZm8oYERvd25sb2FkaW5nIGFydGlmYWN0ICcke2FydGlmYWN0SWR9JyBmcm9tICcke3JlcG9zaXRvcnlPd25lcn0vJHtyZXBvc2l0b3J5TmFtZX0nYCk7XG4gICAgICAgIGNvbnN0IHsgaGVhZGVycywgc3RhdHVzIH0gPSB5aWVsZCBhcGkucmVzdC5hY3Rpb25zLmRvd25sb2FkQXJ0aWZhY3Qoe1xuICAgICAgICAgICAgb3duZXI6IHJlcG9zaXRvcnlPd25lcixcbiAgICAgICAgICAgIHJlcG86IHJlcG9zaXRvcnlOYW1lLFxuICAgICAgICAgICAgYXJ0aWZhY3RfaWQ6IGFydGlmYWN0SWQsXG4gICAgICAgICAgICBhcmNoaXZlX2Zvcm1hdDogJ3ppcCcsXG4gICAgICAgICAgICByZXF1ZXN0OiB7XG4gICAgICAgICAgICAgICAgcmVkaXJlY3Q6ICdtYW51YWwnXG4gICAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgICAgICBpZiAoc3RhdHVzICE9PSAzMDIpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihgVW5hYmxlIHRvIGRvd25sb2FkIGFydGlmYWN0LiBVbmV4cGVjdGVkIHN0YXR1czogJHtzdGF0dXN9YCk7XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgeyBsb2NhdGlvbiB9ID0gaGVhZGVycztcbiAgICAgICAgaWYgKCFsb2NhdGlvbikge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBVbmFibGUgdG8gcmVkaXJlY3QgdG8gYXJ0aWZhY3QgZG93bmxvYWQgdXJsYCk7XG4gICAgICAgIH1cbiAgICAgICAgY29yZS5pbmZvKGBSZWRpcmVjdGluZyB0byBibG9iIGRvd25sb2FkIHVybDogJHtzY3J1YlF1ZXJ5UGFyYW1ldGVycyhsb2NhdGlvbil9YCk7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgICBjb3JlLmluZm8oYFN0YXJ0aW5nIGRvd25sb2FkIG9mIGFydGlmYWN0IHRvOiAke2Rvd25sb2FkUGF0aH1gKTtcbiAgICAgICAgICAgIHlpZWxkIHN0cmVhbUV4dHJhY3QobG9jYXRpb24sIGRvd25sb2FkUGF0aCk7XG4gICAgICAgICAgICBjb3JlLmluZm8oYEFydGlmYWN0IGRvd25sb2FkIGNvbXBsZXRlZCBzdWNjZXNzZnVsbHkuYCk7XG4gICAgICAgIH1cbiAgICAgICAgY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYFVuYWJsZSB0byBkb3dubG9hZCBhbmQgZXh0cmFjdCBhcnRpZmFjdDogJHtlcnJvci5tZXNzYWdlfWApO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB7IGRvd25sb2FkUGF0aCB9O1xuICAgIH0pO1xufVxuZXhwb3J0cy5kb3dubG9hZEFydGlmYWN0UHVibGljID0gZG93bmxvYWRBcnRpZmFjdFB1YmxpYztcbmZ1bmN0aW9uIGRvd25sb2FkQXJ0aWZhY3RJbnRlcm5hbChhcnRpZmFjdElkLCBvcHRpb25zKSB7XG4gICAgcmV0dXJuIF9fYXdhaXRlcih0aGlzLCB2b2lkIDAsIHZvaWQgMCwgZnVuY3Rpb24qICgpIHtcbiAgICAgICAgY29uc3QgZG93bmxvYWRQYXRoID0geWllbGQgcmVzb2x2ZU9yQ3JlYXRlRGlyZWN0b3J5KG9wdGlvbnMgPT09IG51bGwgfHwgb3B0aW9ucyA9PT0gdm9pZCAwID8gdm9pZCAwIDogb3B0aW9ucy5wYXRoKTtcbiAgICAgICAgY29uc3QgYXJ0aWZhY3RDbGllbnQgPSAoMCwgYXJ0aWZhY3RfdHdpcnBfY2xpZW50XzEuaW50ZXJuYWxBcnRpZmFjdFR3aXJwQ2xpZW50KSgpO1xuICAgICAgICBjb25zdCB7IHdvcmtmbG93UnVuQmFja2VuZElkLCB3b3JrZmxvd0pvYlJ1bkJhY2tlbmRJZCB9ID0gKDAsIHV0aWxfMS5nZXRCYWNrZW5kSWRzRnJvbVRva2VuKSgpO1xuICAgICAgICBjb25zdCBsaXN0UmVxID0ge1xuICAgICAgICAgICAgd29ya2Zsb3dSdW5CYWNrZW5kSWQsXG4gICAgICAgICAgICB3b3JrZmxvd0pvYlJ1bkJhY2tlbmRJZCxcbiAgICAgICAgICAgIGlkRmlsdGVyOiBnZW5lcmF0ZWRfMS5JbnQ2NFZhbHVlLmNyZWF0ZSh7IHZhbHVlOiBhcnRpZmFjdElkLnRvU3RyaW5nKCkgfSlcbiAgICAgICAgfTtcbiAgICAgICAgY29uc3QgeyBhcnRpZmFjdHMgfSA9IHlpZWxkIGFydGlmYWN0Q2xpZW50Lkxpc3RBcnRpZmFjdHMobGlzdFJlcSk7XG4gICAgICAgIGlmIChhcnRpZmFjdHMubGVuZ3RoID09PSAwKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgZXJyb3JzXzEuQXJ0aWZhY3ROb3RGb3VuZEVycm9yKGBObyBhcnRpZmFjdHMgZm91bmQgZm9yIElEOiAke2FydGlmYWN0SWR9XFxuQXJlIHlvdSB0cnlpbmcgdG8gZG93bmxvYWQgZnJvbSBhIGRpZmZlcmVudCBydW4/IFRyeSBzcGVjaWZ5aW5nIGEgZ2l0aHViLXRva2VuIHdpdGggXFxgYWN0aW9uczpyZWFkXFxgIHNjb3BlLmApO1xuICAgICAgICB9XG4gICAgICAgIGlmIChhcnRpZmFjdHMubGVuZ3RoID4gMSkge1xuICAgICAgICAgICAgY29yZS53YXJuaW5nKCdNdWx0aXBsZSBhcnRpZmFjdHMgZm91bmQsIGRlZmF1bHRpbmcgdG8gZmlyc3QuJyk7XG4gICAgICAgIH1cbiAgICAgICAgY29uc3Qgc2lnbmVkUmVxID0ge1xuICAgICAgICAgICAgd29ya2Zsb3dSdW5CYWNrZW5kSWQ6IGFydGlmYWN0c1swXS53b3JrZmxvd1J1bkJhY2tlbmRJZCxcbiAgICAgICAgICAgIHdvcmtmbG93Sm9iUnVuQmFja2VuZElkOiBhcnRpZmFjdHNbMF0ud29ya2Zsb3dKb2JSdW5CYWNrZW5kSWQsXG4gICAgICAgICAgICBuYW1lOiBhcnRpZmFjdHNbMF0ubmFtZVxuICAgICAgICB9O1xuICAgICAgICBjb25zdCB7IHNpZ25lZFVybCB9ID0geWllbGQgYXJ0aWZhY3RDbGllbnQuR2V0U2lnbmVkQXJ0aWZhY3RVUkwoc2lnbmVkUmVxKTtcbiAgICAgICAgY29yZS5pbmZvKGBSZWRpcmVjdGluZyB0byBibG9iIGRvd25sb2FkIHVybDogJHtzY3J1YlF1ZXJ5UGFyYW1ldGVycyhzaWduZWRVcmwpfWApO1xuICAgICAgICB0cnkge1xuICAgICAgICAgICAgY29yZS5pbmZvKGBTdGFydGluZyBkb3dubG9hZCBvZiBhcnRpZmFjdCB0bzogJHtkb3dubG9hZFBhdGh9YCk7XG4gICAgICAgICAgICB5aWVsZCBzdHJlYW1FeHRyYWN0KHNpZ25lZFVybCwgZG93bmxvYWRQYXRoKTtcbiAgICAgICAgICAgIGNvcmUuaW5mbyhgQXJ0aWZhY3QgZG93bmxvYWQgY29tcGxldGVkIHN1Y2Nlc3NmdWxseS5gKTtcbiAgICAgICAgfVxuICAgICAgICBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihgVW5hYmxlIHRvIGRvd25sb2FkIGFuZCBleHRyYWN0IGFydGlmYWN0OiAke2Vycm9yLm1lc3NhZ2V9YCk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHsgZG93bmxvYWRQYXRoIH07XG4gICAgfSk7XG59XG5leHBvcnRzLmRvd25sb2FkQXJ0aWZhY3RJbnRlcm5hbCA9IGRvd25sb2FkQXJ0aWZhY3RJbnRlcm5hbDtcbmZ1bmN0aW9uIHJlc29sdmVPckNyZWF0ZURpcmVjdG9yeShkb3dubG9hZFBhdGggPSAoMCwgY29uZmlnXzEuZ2V0R2l0SHViV29ya3NwYWNlRGlyKSgpKSB7XG4gICAgcmV0dXJuIF9fYXdhaXRlcih0aGlzLCB2b2lkIDAsIHZvaWQgMCwgZnVuY3Rpb24qICgpIHtcbiAgICAgICAgaWYgKCEoeWllbGQgZXhpc3RzKGRvd25sb2FkUGF0aCkpKSB7XG4gICAgICAgICAgICBjb3JlLmRlYnVnKGBBcnRpZmFjdCBkZXN0aW5hdGlvbiBmb2xkZXIgZG9lcyBub3QgZXhpc3QsIGNyZWF0aW5nOiAke2Rvd25sb2FkUGF0aH1gKTtcbiAgICAgICAgICAgIHlpZWxkIHByb21pc2VzXzEuZGVmYXVsdC5ta2Rpcihkb3dubG9hZFBhdGgsIHsgcmVjdXJzaXZlOiB0cnVlIH0pO1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgY29yZS5kZWJ1ZyhgQXJ0aWZhY3QgZGVzdGluYXRpb24gZm9sZGVyIGFscmVhZHkgZXhpc3RzOiAke2Rvd25sb2FkUGF0aH1gKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gZG93bmxvYWRQYXRoO1xuICAgIH0pO1xufVxuLy8jIHNvdXJjZU1hcHBpbmdVUkw9ZG93bmxvYWQtYXJ0aWZhY3QuanMubWFwIiwKICAgICJcInVzZSBzdHJpY3RcIjtcbnZhciBfX2NyZWF0ZUJpbmRpbmcgPSAodGhpcyAmJiB0aGlzLl9fY3JlYXRlQmluZGluZykgfHwgKE9iamVjdC5jcmVhdGUgPyAoZnVuY3Rpb24obywgbSwgaywgazIpIHtcbiAgICBpZiAoazIgPT09IHVuZGVmaW5lZCkgazIgPSBrO1xuICAgIHZhciBkZXNjID0gT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcihtLCBrKTtcbiAgICBpZiAoIWRlc2MgfHwgKFwiZ2V0XCIgaW4gZGVzYyA/ICFtLl9fZXNNb2R1bGUgOiBkZXNjLndyaXRhYmxlIHx8IGRlc2MuY29uZmlndXJhYmxlKSkge1xuICAgICAgZGVzYyA9IHsgZW51bWVyYWJsZTogdHJ1ZSwgZ2V0OiBmdW5jdGlvbigpIHsgcmV0dXJuIG1ba107IH0gfTtcbiAgICB9XG4gICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KG8sIGsyLCBkZXNjKTtcbn0pIDogKGZ1bmN0aW9uKG8sIG0sIGssIGsyKSB7XG4gICAgaWYgKGsyID09PSB1bmRlZmluZWQpIGsyID0gaztcbiAgICBvW2syXSA9IG1ba107XG59KSk7XG52YXIgX19zZXRNb2R1bGVEZWZhdWx0ID0gKHRoaXMgJiYgdGhpcy5fX3NldE1vZHVsZURlZmF1bHQpIHx8IChPYmplY3QuY3JlYXRlID8gKGZ1bmN0aW9uKG8sIHYpIHtcbiAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkobywgXCJkZWZhdWx0XCIsIHsgZW51bWVyYWJsZTogdHJ1ZSwgdmFsdWU6IHYgfSk7XG59KSA6IGZ1bmN0aW9uKG8sIHYpIHtcbiAgICBvW1wiZGVmYXVsdFwiXSA9IHY7XG59KTtcbnZhciBfX2ltcG9ydFN0YXIgPSAodGhpcyAmJiB0aGlzLl9faW1wb3J0U3RhcikgfHwgZnVuY3Rpb24gKG1vZCkge1xuICAgIGlmIChtb2QgJiYgbW9kLl9fZXNNb2R1bGUpIHJldHVybiBtb2Q7XG4gICAgdmFyIHJlc3VsdCA9IHt9O1xuICAgIGlmIChtb2QgIT0gbnVsbCkgZm9yICh2YXIgayBpbiBtb2QpIGlmIChrICE9PSBcImRlZmF1bHRcIiAmJiBPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwobW9kLCBrKSkgX19jcmVhdGVCaW5kaW5nKHJlc3VsdCwgbW9kLCBrKTtcbiAgICBfX3NldE1vZHVsZURlZmF1bHQocmVzdWx0LCBtb2QpO1xuICAgIHJldHVybiByZXN1bHQ7XG59O1xuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiX19lc01vZHVsZVwiLCB7IHZhbHVlOiB0cnVlIH0pO1xuZXhwb3J0cy5nZXRSZXRyeU9wdGlvbnMgPSB2b2lkIDA7XG5jb25zdCBjb3JlID0gX19pbXBvcnRTdGFyKHJlcXVpcmUoXCJAYWN0aW9ucy9jb3JlXCIpKTtcbi8vIERlZmF1bHRzIGZvciBmZXRjaGluZyBhcnRpZmFjdHNcbmNvbnN0IGRlZmF1bHRNYXhSZXRyeU51bWJlciA9IDU7XG5jb25zdCBkZWZhdWx0RXhlbXB0U3RhdHVzQ29kZXMgPSBbNDAwLCA0MDEsIDQwMywgNDA0LCA0MjJdOyAvLyBodHRwczovL2dpdGh1Yi5jb20vb2N0b2tpdC9wbHVnaW4tcmV0cnkuanMvYmxvYi85YTI0NDM3NDZjMzUwYjNiZWVkZWMzNWNmMjZlMTk3ZWEzMThhMjYxL3NyYy9pbmRleC50cyNMMTRcbmZ1bmN0aW9uIGdldFJldHJ5T3B0aW9ucyhkZWZhdWx0T3B0aW9ucywgcmV0cmllcyA9IGRlZmF1bHRNYXhSZXRyeU51bWJlciwgZXhlbXB0U3RhdHVzQ29kZXMgPSBkZWZhdWx0RXhlbXB0U3RhdHVzQ29kZXMpIHtcbiAgICB2YXIgX2E7XG4gICAgaWYgKHJldHJpZXMgPD0gMCkge1xuICAgICAgICByZXR1cm4gW3sgZW5hYmxlZDogZmFsc2UgfSwgZGVmYXVsdE9wdGlvbnMucmVxdWVzdF07XG4gICAgfVxuICAgIGNvbnN0IHJldHJ5T3B0aW9ucyA9IHtcbiAgICAgICAgZW5hYmxlZDogdHJ1ZVxuICAgIH07XG4gICAgaWYgKGV4ZW1wdFN0YXR1c0NvZGVzLmxlbmd0aCA+IDApIHtcbiAgICAgICAgcmV0cnlPcHRpb25zLmRvTm90UmV0cnkgPSBleGVtcHRTdGF0dXNDb2RlcztcbiAgICB9XG4gICAgLy8gVGhlIEdpdEh1YiB0eXBlIGhhcyBzb21lIGRlZmF1bHRzIGZvciBgb3B0aW9ucy5yZXF1ZXN0YFxuICAgIC8vIHNlZTogaHR0cHM6Ly9naXRodWIuY29tL2FjdGlvbnMvdG9vbGtpdC9ibG9iLzRmYmM1Yzk0MWE1NzI0OWIxOTU2MjAxNWVkYmQ3MmFkZDE0YmU5M2QvcGFja2FnZXMvZ2l0aHViL3NyYy91dGlscy50cyNMMTVcbiAgICAvLyBXZSBwYXNzIHRoZXNlIGluIGhlcmUgc28gdGhleSBhcmUgbm90IG92ZXJyaWRkZW4uXG4gICAgY29uc3QgcmVxdWVzdE9wdGlvbnMgPSBPYmplY3QuYXNzaWduKE9iamVjdC5hc3NpZ24oe30sIGRlZmF1bHRPcHRpb25zLnJlcXVlc3QpLCB7IHJldHJpZXMgfSk7XG4gICAgY29yZS5kZWJ1ZyhgR2l0SHViIGNsaWVudCBjb25maWd1cmVkIHdpdGg6IChyZXRyaWVzOiAke3JlcXVlc3RPcHRpb25zLnJldHJpZXN9LCByZXRyeS1leGVtcHQtc3RhdHVzLWNvZGU6ICR7KF9hID0gcmV0cnlPcHRpb25zLmRvTm90UmV0cnkpICE9PSBudWxsICYmIF9hICE9PSB2b2lkIDAgPyBfYSA6ICdvY3Rva2l0IGRlZmF1bHQ6IFs0MDAsIDQwMSwgNDAzLCA0MDQsIDQyMl0nfSlgKTtcbiAgICByZXR1cm4gW3JldHJ5T3B0aW9ucywgcmVxdWVzdE9wdGlvbnNdO1xufVxuZXhwb3J0cy5nZXRSZXRyeU9wdGlvbnMgPSBnZXRSZXRyeU9wdGlvbnM7XG4vLyMgc291cmNlTWFwcGluZ1VSTD1yZXRyeS1vcHRpb25zLmpzLm1hcCIsCiAgICAiJ3VzZSBzdHJpY3QnO1xuXG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgJ19fZXNNb2R1bGUnLCB7IHZhbHVlOiB0cnVlIH0pO1xuXG5jb25zdCBWRVJTSU9OID0gXCIxLjAuNFwiO1xuXG4vKipcbiAqIEBwYXJhbSBvY3Rva2l0IE9jdG9raXQgaW5zdGFuY2VcbiAqIEBwYXJhbSBvcHRpb25zIE9wdGlvbnMgcGFzc2VkIHRvIE9jdG9raXQgY29uc3RydWN0b3JcbiAqL1xuXG5mdW5jdGlvbiByZXF1ZXN0TG9nKG9jdG9raXQpIHtcbiAgb2N0b2tpdC5ob29rLndyYXAoXCJyZXF1ZXN0XCIsIChyZXF1ZXN0LCBvcHRpb25zKSA9PiB7XG4gICAgb2N0b2tpdC5sb2cuZGVidWcoXCJyZXF1ZXN0XCIsIG9wdGlvbnMpO1xuICAgIGNvbnN0IHN0YXJ0ID0gRGF0ZS5ub3coKTtcbiAgICBjb25zdCByZXF1ZXN0T3B0aW9ucyA9IG9jdG9raXQucmVxdWVzdC5lbmRwb2ludC5wYXJzZShvcHRpb25zKTtcbiAgICBjb25zdCBwYXRoID0gcmVxdWVzdE9wdGlvbnMudXJsLnJlcGxhY2Uob3B0aW9ucy5iYXNlVXJsLCBcIlwiKTtcbiAgICByZXR1cm4gcmVxdWVzdChvcHRpb25zKS50aGVuKHJlc3BvbnNlID0+IHtcbiAgICAgIG9jdG9raXQubG9nLmluZm8oYCR7cmVxdWVzdE9wdGlvbnMubWV0aG9kfSAke3BhdGh9IC0gJHtyZXNwb25zZS5zdGF0dXN9IGluICR7RGF0ZS5ub3coKSAtIHN0YXJ0fW1zYCk7XG4gICAgICByZXR1cm4gcmVzcG9uc2U7XG4gICAgfSkuY2F0Y2goZXJyb3IgPT4ge1xuICAgICAgb2N0b2tpdC5sb2cuaW5mbyhgJHtyZXF1ZXN0T3B0aW9ucy5tZXRob2R9ICR7cGF0aH0gLSAke2Vycm9yLnN0YXR1c30gaW4gJHtEYXRlLm5vdygpIC0gc3RhcnR9bXNgKTtcbiAgICAgIHRocm93IGVycm9yO1xuICAgIH0pO1xuICB9KTtcbn1cbnJlcXVlc3RMb2cuVkVSU0lPTiA9IFZFUlNJT047XG5cbmV4cG9ydHMucmVxdWVzdExvZyA9IHJlcXVlc3RMb2c7XG4vLyMgc291cmNlTWFwcGluZ1VSTD1pbmRleC5qcy5tYXBcbiIsCiAgICAiLyoqXG4gICogVGhpcyBmaWxlIGNvbnRhaW5zIHRoZSBCb3R0bGVuZWNrIGxpYnJhcnkgKE1JVCksIGNvbXBpbGVkIHRvIEVTMjAxNywgYW5kIHdpdGhvdXQgQ2x1c3RlcmluZyBzdXBwb3J0LlxuICAqIGh0dHBzOi8vZ2l0aHViLmNvbS9TR3JvbmRpbi9ib3R0bGVuZWNrXG4gICovXG4oZnVuY3Rpb24gKGdsb2JhbCwgZmFjdG9yeSkge1xuXHR0eXBlb2YgZXhwb3J0cyA9PT0gJ29iamVjdCcgJiYgdHlwZW9mIG1vZHVsZSAhPT0gJ3VuZGVmaW5lZCcgPyBtb2R1bGUuZXhwb3J0cyA9IGZhY3RvcnkoKSA6XG5cdHR5cGVvZiBkZWZpbmUgPT09ICdmdW5jdGlvbicgJiYgZGVmaW5lLmFtZCA/IGRlZmluZShmYWN0b3J5KSA6XG5cdChnbG9iYWwuQm90dGxlbmVjayA9IGZhY3RvcnkoKSk7XG59KHRoaXMsIChmdW5jdGlvbiAoKSB7ICd1c2Ugc3RyaWN0JztcblxuXHR2YXIgY29tbW9uanNHbG9iYWwgPSB0eXBlb2YgZ2xvYmFsVGhpcyAhPT0gJ3VuZGVmaW5lZCcgPyBnbG9iYWxUaGlzIDogdHlwZW9mIHdpbmRvdyAhPT0gJ3VuZGVmaW5lZCcgPyB3aW5kb3cgOiB0eXBlb2YgZ2xvYmFsICE9PSAndW5kZWZpbmVkJyA/IGdsb2JhbCA6IHR5cGVvZiBzZWxmICE9PSAndW5kZWZpbmVkJyA/IHNlbGYgOiB7fTtcblxuXHRmdW5jdGlvbiBnZXRDanNFeHBvcnRGcm9tTmFtZXNwYWNlIChuKSB7XG5cdFx0cmV0dXJuIG4gJiYgblsnZGVmYXVsdCddIHx8IG47XG5cdH1cblxuXHR2YXIgbG9hZCA9IGZ1bmN0aW9uKHJlY2VpdmVkLCBkZWZhdWx0cywgb250byA9IHt9KSB7XG5cdCAgdmFyIGssIHJlZiwgdjtcblx0ICBmb3IgKGsgaW4gZGVmYXVsdHMpIHtcblx0ICAgIHYgPSBkZWZhdWx0c1trXTtcblx0ICAgIG9udG9ba10gPSAocmVmID0gcmVjZWl2ZWRba10pICE9IG51bGwgPyByZWYgOiB2O1xuXHQgIH1cblx0ICByZXR1cm4gb250bztcblx0fTtcblxuXHR2YXIgb3ZlcndyaXRlID0gZnVuY3Rpb24ocmVjZWl2ZWQsIGRlZmF1bHRzLCBvbnRvID0ge30pIHtcblx0ICB2YXIgaywgdjtcblx0ICBmb3IgKGsgaW4gcmVjZWl2ZWQpIHtcblx0ICAgIHYgPSByZWNlaXZlZFtrXTtcblx0ICAgIGlmIChkZWZhdWx0c1trXSAhPT0gdm9pZCAwKSB7XG5cdCAgICAgIG9udG9ba10gPSB2O1xuXHQgICAgfVxuXHQgIH1cblx0ICByZXR1cm4gb250bztcblx0fTtcblxuXHR2YXIgcGFyc2VyID0ge1xuXHRcdGxvYWQ6IGxvYWQsXG5cdFx0b3ZlcndyaXRlOiBvdmVyd3JpdGVcblx0fTtcblxuXHR2YXIgRExMaXN0O1xuXG5cdERMTGlzdCA9IGNsYXNzIERMTGlzdCB7XG5cdCAgY29uc3RydWN0b3IoaW5jciwgZGVjcikge1xuXHQgICAgdGhpcy5pbmNyID0gaW5jcjtcblx0ICAgIHRoaXMuZGVjciA9IGRlY3I7XG5cdCAgICB0aGlzLl9maXJzdCA9IG51bGw7XG5cdCAgICB0aGlzLl9sYXN0ID0gbnVsbDtcblx0ICAgIHRoaXMubGVuZ3RoID0gMDtcblx0ICB9XG5cblx0ICBwdXNoKHZhbHVlKSB7XG5cdCAgICB2YXIgbm9kZTtcblx0ICAgIHRoaXMubGVuZ3RoKys7XG5cdCAgICBpZiAodHlwZW9mIHRoaXMuaW5jciA9PT0gXCJmdW5jdGlvblwiKSB7XG5cdCAgICAgIHRoaXMuaW5jcigpO1xuXHQgICAgfVxuXHQgICAgbm9kZSA9IHtcblx0ICAgICAgdmFsdWUsXG5cdCAgICAgIHByZXY6IHRoaXMuX2xhc3QsXG5cdCAgICAgIG5leHQ6IG51bGxcblx0ICAgIH07XG5cdCAgICBpZiAodGhpcy5fbGFzdCAhPSBudWxsKSB7XG5cdCAgICAgIHRoaXMuX2xhc3QubmV4dCA9IG5vZGU7XG5cdCAgICAgIHRoaXMuX2xhc3QgPSBub2RlO1xuXHQgICAgfSBlbHNlIHtcblx0ICAgICAgdGhpcy5fZmlyc3QgPSB0aGlzLl9sYXN0ID0gbm9kZTtcblx0ICAgIH1cblx0ICAgIHJldHVybiB2b2lkIDA7XG5cdCAgfVxuXG5cdCAgc2hpZnQoKSB7XG5cdCAgICB2YXIgdmFsdWU7XG5cdCAgICBpZiAodGhpcy5fZmlyc3QgPT0gbnVsbCkge1xuXHQgICAgICByZXR1cm47XG5cdCAgICB9IGVsc2Uge1xuXHQgICAgICB0aGlzLmxlbmd0aC0tO1xuXHQgICAgICBpZiAodHlwZW9mIHRoaXMuZGVjciA9PT0gXCJmdW5jdGlvblwiKSB7XG5cdCAgICAgICAgdGhpcy5kZWNyKCk7XG5cdCAgICAgIH1cblx0ICAgIH1cblx0ICAgIHZhbHVlID0gdGhpcy5fZmlyc3QudmFsdWU7XG5cdCAgICBpZiAoKHRoaXMuX2ZpcnN0ID0gdGhpcy5fZmlyc3QubmV4dCkgIT0gbnVsbCkge1xuXHQgICAgICB0aGlzLl9maXJzdC5wcmV2ID0gbnVsbDtcblx0ICAgIH0gZWxzZSB7XG5cdCAgICAgIHRoaXMuX2xhc3QgPSBudWxsO1xuXHQgICAgfVxuXHQgICAgcmV0dXJuIHZhbHVlO1xuXHQgIH1cblxuXHQgIGZpcnN0KCkge1xuXHQgICAgaWYgKHRoaXMuX2ZpcnN0ICE9IG51bGwpIHtcblx0ICAgICAgcmV0dXJuIHRoaXMuX2ZpcnN0LnZhbHVlO1xuXHQgICAgfVxuXHQgIH1cblxuXHQgIGdldEFycmF5KCkge1xuXHQgICAgdmFyIG5vZGUsIHJlZiwgcmVzdWx0cztcblx0ICAgIG5vZGUgPSB0aGlzLl9maXJzdDtcblx0ICAgIHJlc3VsdHMgPSBbXTtcblx0ICAgIHdoaWxlIChub2RlICE9IG51bGwpIHtcblx0ICAgICAgcmVzdWx0cy5wdXNoKChyZWYgPSBub2RlLCBub2RlID0gbm9kZS5uZXh0LCByZWYudmFsdWUpKTtcblx0ICAgIH1cblx0ICAgIHJldHVybiByZXN1bHRzO1xuXHQgIH1cblxuXHQgIGZvckVhY2hTaGlmdChjYikge1xuXHQgICAgdmFyIG5vZGU7XG5cdCAgICBub2RlID0gdGhpcy5zaGlmdCgpO1xuXHQgICAgd2hpbGUgKG5vZGUgIT0gbnVsbCkge1xuXHQgICAgICAoY2Iobm9kZSksIG5vZGUgPSB0aGlzLnNoaWZ0KCkpO1xuXHQgICAgfVxuXHQgICAgcmV0dXJuIHZvaWQgMDtcblx0ICB9XG5cblx0ICBkZWJ1ZygpIHtcblx0ICAgIHZhciBub2RlLCByZWYsIHJlZjEsIHJlZjIsIHJlc3VsdHM7XG5cdCAgICBub2RlID0gdGhpcy5fZmlyc3Q7XG5cdCAgICByZXN1bHRzID0gW107XG5cdCAgICB3aGlsZSAobm9kZSAhPSBudWxsKSB7XG5cdCAgICAgIHJlc3VsdHMucHVzaCgocmVmID0gbm9kZSwgbm9kZSA9IG5vZGUubmV4dCwge1xuXHQgICAgICAgIHZhbHVlOiByZWYudmFsdWUsXG5cdCAgICAgICAgcHJldjogKHJlZjEgPSByZWYucHJldikgIT0gbnVsbCA/IHJlZjEudmFsdWUgOiB2b2lkIDAsXG5cdCAgICAgICAgbmV4dDogKHJlZjIgPSByZWYubmV4dCkgIT0gbnVsbCA/IHJlZjIudmFsdWUgOiB2b2lkIDBcblx0ICAgICAgfSkpO1xuXHQgICAgfVxuXHQgICAgcmV0dXJuIHJlc3VsdHM7XG5cdCAgfVxuXG5cdH07XG5cblx0dmFyIERMTGlzdF8xID0gRExMaXN0O1xuXG5cdHZhciBFdmVudHM7XG5cblx0RXZlbnRzID0gY2xhc3MgRXZlbnRzIHtcblx0ICBjb25zdHJ1Y3RvcihpbnN0YW5jZSkge1xuXHQgICAgdGhpcy5pbnN0YW5jZSA9IGluc3RhbmNlO1xuXHQgICAgdGhpcy5fZXZlbnRzID0ge307XG5cdCAgICBpZiAoKHRoaXMuaW5zdGFuY2Uub24gIT0gbnVsbCkgfHwgKHRoaXMuaW5zdGFuY2Uub25jZSAhPSBudWxsKSB8fCAodGhpcy5pbnN0YW5jZS5yZW1vdmVBbGxMaXN0ZW5lcnMgIT0gbnVsbCkpIHtcblx0ICAgICAgdGhyb3cgbmV3IEVycm9yKFwiQW4gRW1pdHRlciBhbHJlYWR5IGV4aXN0cyBmb3IgdGhpcyBvYmplY3RcIik7XG5cdCAgICB9XG5cdCAgICB0aGlzLmluc3RhbmNlLm9uID0gKG5hbWUsIGNiKSA9PiB7XG5cdCAgICAgIHJldHVybiB0aGlzLl9hZGRMaXN0ZW5lcihuYW1lLCBcIm1hbnlcIiwgY2IpO1xuXHQgICAgfTtcblx0ICAgIHRoaXMuaW5zdGFuY2Uub25jZSA9IChuYW1lLCBjYikgPT4ge1xuXHQgICAgICByZXR1cm4gdGhpcy5fYWRkTGlzdGVuZXIobmFtZSwgXCJvbmNlXCIsIGNiKTtcblx0ICAgIH07XG5cdCAgICB0aGlzLmluc3RhbmNlLnJlbW92ZUFsbExpc3RlbmVycyA9IChuYW1lID0gbnVsbCkgPT4ge1xuXHQgICAgICBpZiAobmFtZSAhPSBudWxsKSB7XG5cdCAgICAgICAgcmV0dXJuIGRlbGV0ZSB0aGlzLl9ldmVudHNbbmFtZV07XG5cdCAgICAgIH0gZWxzZSB7XG5cdCAgICAgICAgcmV0dXJuIHRoaXMuX2V2ZW50cyA9IHt9O1xuXHQgICAgICB9XG5cdCAgICB9O1xuXHQgIH1cblxuXHQgIF9hZGRMaXN0ZW5lcihuYW1lLCBzdGF0dXMsIGNiKSB7XG5cdCAgICB2YXIgYmFzZTtcblx0ICAgIGlmICgoYmFzZSA9IHRoaXMuX2V2ZW50cylbbmFtZV0gPT0gbnVsbCkge1xuXHQgICAgICBiYXNlW25hbWVdID0gW107XG5cdCAgICB9XG5cdCAgICB0aGlzLl9ldmVudHNbbmFtZV0ucHVzaCh7Y2IsIHN0YXR1c30pO1xuXHQgICAgcmV0dXJuIHRoaXMuaW5zdGFuY2U7XG5cdCAgfVxuXG5cdCAgbGlzdGVuZXJDb3VudChuYW1lKSB7XG5cdCAgICBpZiAodGhpcy5fZXZlbnRzW25hbWVdICE9IG51bGwpIHtcblx0ICAgICAgcmV0dXJuIHRoaXMuX2V2ZW50c1tuYW1lXS5sZW5ndGg7XG5cdCAgICB9IGVsc2Uge1xuXHQgICAgICByZXR1cm4gMDtcblx0ICAgIH1cblx0ICB9XG5cblx0ICBhc3luYyB0cmlnZ2VyKG5hbWUsIC4uLmFyZ3MpIHtcblx0ICAgIHZhciBlLCBwcm9taXNlcztcblx0ICAgIHRyeSB7XG5cdCAgICAgIGlmIChuYW1lICE9PSBcImRlYnVnXCIpIHtcblx0ICAgICAgICB0aGlzLnRyaWdnZXIoXCJkZWJ1Z1wiLCBgRXZlbnQgdHJpZ2dlcmVkOiAke25hbWV9YCwgYXJncyk7XG5cdCAgICAgIH1cblx0ICAgICAgaWYgKHRoaXMuX2V2ZW50c1tuYW1lXSA9PSBudWxsKSB7XG5cdCAgICAgICAgcmV0dXJuO1xuXHQgICAgICB9XG5cdCAgICAgIHRoaXMuX2V2ZW50c1tuYW1lXSA9IHRoaXMuX2V2ZW50c1tuYW1lXS5maWx0ZXIoZnVuY3Rpb24obGlzdGVuZXIpIHtcblx0ICAgICAgICByZXR1cm4gbGlzdGVuZXIuc3RhdHVzICE9PSBcIm5vbmVcIjtcblx0ICAgICAgfSk7XG5cdCAgICAgIHByb21pc2VzID0gdGhpcy5fZXZlbnRzW25hbWVdLm1hcChhc3luYyhsaXN0ZW5lcikgPT4ge1xuXHQgICAgICAgIHZhciBlLCByZXR1cm5lZDtcblx0ICAgICAgICBpZiAobGlzdGVuZXIuc3RhdHVzID09PSBcIm5vbmVcIikge1xuXHQgICAgICAgICAgcmV0dXJuO1xuXHQgICAgICAgIH1cblx0ICAgICAgICBpZiAobGlzdGVuZXIuc3RhdHVzID09PSBcIm9uY2VcIikge1xuXHQgICAgICAgICAgbGlzdGVuZXIuc3RhdHVzID0gXCJub25lXCI7XG5cdCAgICAgICAgfVxuXHQgICAgICAgIHRyeSB7XG5cdCAgICAgICAgICByZXR1cm5lZCA9IHR5cGVvZiBsaXN0ZW5lci5jYiA9PT0gXCJmdW5jdGlvblwiID8gbGlzdGVuZXIuY2IoLi4uYXJncykgOiB2b2lkIDA7XG5cdCAgICAgICAgICBpZiAodHlwZW9mIChyZXR1cm5lZCAhPSBudWxsID8gcmV0dXJuZWQudGhlbiA6IHZvaWQgMCkgPT09IFwiZnVuY3Rpb25cIikge1xuXHQgICAgICAgICAgICByZXR1cm4gKGF3YWl0IHJldHVybmVkKTtcblx0ICAgICAgICAgIH0gZWxzZSB7XG5cdCAgICAgICAgICAgIHJldHVybiByZXR1cm5lZDtcblx0ICAgICAgICAgIH1cblx0ICAgICAgICB9IGNhdGNoIChlcnJvcikge1xuXHQgICAgICAgICAgZSA9IGVycm9yO1xuXHQgICAgICAgICAge1xuXHQgICAgICAgICAgICB0aGlzLnRyaWdnZXIoXCJlcnJvclwiLCBlKTtcblx0ICAgICAgICAgIH1cblx0ICAgICAgICAgIHJldHVybiBudWxsO1xuXHQgICAgICAgIH1cblx0ICAgICAgfSk7XG5cdCAgICAgIHJldHVybiAoKGF3YWl0IFByb21pc2UuYWxsKHByb21pc2VzKSkpLmZpbmQoZnVuY3Rpb24oeCkge1xuXHQgICAgICAgIHJldHVybiB4ICE9IG51bGw7XG5cdCAgICAgIH0pO1xuXHQgICAgfSBjYXRjaCAoZXJyb3IpIHtcblx0ICAgICAgZSA9IGVycm9yO1xuXHQgICAgICB7XG5cdCAgICAgICAgdGhpcy50cmlnZ2VyKFwiZXJyb3JcIiwgZSk7XG5cdCAgICAgIH1cblx0ICAgICAgcmV0dXJuIG51bGw7XG5cdCAgICB9XG5cdCAgfVxuXG5cdH07XG5cblx0dmFyIEV2ZW50c18xID0gRXZlbnRzO1xuXG5cdHZhciBETExpc3QkMSwgRXZlbnRzJDEsIFF1ZXVlcztcblxuXHRETExpc3QkMSA9IERMTGlzdF8xO1xuXG5cdEV2ZW50cyQxID0gRXZlbnRzXzE7XG5cblx0UXVldWVzID0gY2xhc3MgUXVldWVzIHtcblx0ICBjb25zdHJ1Y3RvcihudW1fcHJpb3JpdGllcykge1xuXHQgICAgdmFyIGk7XG5cdCAgICB0aGlzLkV2ZW50cyA9IG5ldyBFdmVudHMkMSh0aGlzKTtcblx0ICAgIHRoaXMuX2xlbmd0aCA9IDA7XG5cdCAgICB0aGlzLl9saXN0cyA9IChmdW5jdGlvbigpIHtcblx0ICAgICAgdmFyIGosIHJlZiwgcmVzdWx0cztcblx0ICAgICAgcmVzdWx0cyA9IFtdO1xuXHQgICAgICBmb3IgKGkgPSBqID0gMSwgcmVmID0gbnVtX3ByaW9yaXRpZXM7ICgxIDw9IHJlZiA/IGogPD0gcmVmIDogaiA+PSByZWYpOyBpID0gMSA8PSByZWYgPyArK2ogOiAtLWopIHtcblx0ICAgICAgICByZXN1bHRzLnB1c2gobmV3IERMTGlzdCQxKCgoKSA9PiB7XG5cdCAgICAgICAgICByZXR1cm4gdGhpcy5pbmNyKCk7XG5cdCAgICAgICAgfSksICgoKSA9PiB7XG5cdCAgICAgICAgICByZXR1cm4gdGhpcy5kZWNyKCk7XG5cdCAgICAgICAgfSkpKTtcblx0ICAgICAgfVxuXHQgICAgICByZXR1cm4gcmVzdWx0cztcblx0ICAgIH0pLmNhbGwodGhpcyk7XG5cdCAgfVxuXG5cdCAgaW5jcigpIHtcblx0ICAgIGlmICh0aGlzLl9sZW5ndGgrKyA9PT0gMCkge1xuXHQgICAgICByZXR1cm4gdGhpcy5FdmVudHMudHJpZ2dlcihcImxlZnR6ZXJvXCIpO1xuXHQgICAgfVxuXHQgIH1cblxuXHQgIGRlY3IoKSB7XG5cdCAgICBpZiAoLS10aGlzLl9sZW5ndGggPT09IDApIHtcblx0ICAgICAgcmV0dXJuIHRoaXMuRXZlbnRzLnRyaWdnZXIoXCJ6ZXJvXCIpO1xuXHQgICAgfVxuXHQgIH1cblxuXHQgIHB1c2goam9iKSB7XG5cdCAgICByZXR1cm4gdGhpcy5fbGlzdHNbam9iLm9wdGlvbnMucHJpb3JpdHldLnB1c2goam9iKTtcblx0ICB9XG5cblx0ICBxdWV1ZWQocHJpb3JpdHkpIHtcblx0ICAgIGlmIChwcmlvcml0eSAhPSBudWxsKSB7XG5cdCAgICAgIHJldHVybiB0aGlzLl9saXN0c1twcmlvcml0eV0ubGVuZ3RoO1xuXHQgICAgfSBlbHNlIHtcblx0ICAgICAgcmV0dXJuIHRoaXMuX2xlbmd0aDtcblx0ICAgIH1cblx0ICB9XG5cblx0ICBzaGlmdEFsbChmbikge1xuXHQgICAgcmV0dXJuIHRoaXMuX2xpc3RzLmZvckVhY2goZnVuY3Rpb24obGlzdCkge1xuXHQgICAgICByZXR1cm4gbGlzdC5mb3JFYWNoU2hpZnQoZm4pO1xuXHQgICAgfSk7XG5cdCAgfVxuXG5cdCAgZ2V0Rmlyc3QoYXJyID0gdGhpcy5fbGlzdHMpIHtcblx0ICAgIHZhciBqLCBsZW4sIGxpc3Q7XG5cdCAgICBmb3IgKGogPSAwLCBsZW4gPSBhcnIubGVuZ3RoOyBqIDwgbGVuOyBqKyspIHtcblx0ICAgICAgbGlzdCA9IGFycltqXTtcblx0ICAgICAgaWYgKGxpc3QubGVuZ3RoID4gMCkge1xuXHQgICAgICAgIHJldHVybiBsaXN0O1xuXHQgICAgICB9XG5cdCAgICB9XG5cdCAgICByZXR1cm4gW107XG5cdCAgfVxuXG5cdCAgc2hpZnRMYXN0RnJvbShwcmlvcml0eSkge1xuXHQgICAgcmV0dXJuIHRoaXMuZ2V0Rmlyc3QodGhpcy5fbGlzdHMuc2xpY2UocHJpb3JpdHkpLnJldmVyc2UoKSkuc2hpZnQoKTtcblx0ICB9XG5cblx0fTtcblxuXHR2YXIgUXVldWVzXzEgPSBRdWV1ZXM7XG5cblx0dmFyIEJvdHRsZW5lY2tFcnJvcjtcblxuXHRCb3R0bGVuZWNrRXJyb3IgPSBjbGFzcyBCb3R0bGVuZWNrRXJyb3IgZXh0ZW5kcyBFcnJvciB7fTtcblxuXHR2YXIgQm90dGxlbmVja0Vycm9yXzEgPSBCb3R0bGVuZWNrRXJyb3I7XG5cblx0dmFyIEJvdHRsZW5lY2tFcnJvciQxLCBERUZBVUxUX1BSSU9SSVRZLCBKb2IsIE5VTV9QUklPUklUSUVTLCBwYXJzZXIkMTtcblxuXHROVU1fUFJJT1JJVElFUyA9IDEwO1xuXG5cdERFRkFVTFRfUFJJT1JJVFkgPSA1O1xuXG5cdHBhcnNlciQxID0gcGFyc2VyO1xuXG5cdEJvdHRsZW5lY2tFcnJvciQxID0gQm90dGxlbmVja0Vycm9yXzE7XG5cblx0Sm9iID0gY2xhc3MgSm9iIHtcblx0ICBjb25zdHJ1Y3Rvcih0YXNrLCBhcmdzLCBvcHRpb25zLCBqb2JEZWZhdWx0cywgcmVqZWN0T25Ecm9wLCBFdmVudHMsIF9zdGF0ZXMsIFByb21pc2UpIHtcblx0ICAgIHRoaXMudGFzayA9IHRhc2s7XG5cdCAgICB0aGlzLmFyZ3MgPSBhcmdzO1xuXHQgICAgdGhpcy5yZWplY3RPbkRyb3AgPSByZWplY3RPbkRyb3A7XG5cdCAgICB0aGlzLkV2ZW50cyA9IEV2ZW50cztcblx0ICAgIHRoaXMuX3N0YXRlcyA9IF9zdGF0ZXM7XG5cdCAgICB0aGlzLlByb21pc2UgPSBQcm9taXNlO1xuXHQgICAgdGhpcy5vcHRpb25zID0gcGFyc2VyJDEubG9hZChvcHRpb25zLCBqb2JEZWZhdWx0cyk7XG5cdCAgICB0aGlzLm9wdGlvbnMucHJpb3JpdHkgPSB0aGlzLl9zYW5pdGl6ZVByaW9yaXR5KHRoaXMub3B0aW9ucy5wcmlvcml0eSk7XG5cdCAgICBpZiAodGhpcy5vcHRpb25zLmlkID09PSBqb2JEZWZhdWx0cy5pZCkge1xuXHQgICAgICB0aGlzLm9wdGlvbnMuaWQgPSBgJHt0aGlzLm9wdGlvbnMuaWR9LSR7dGhpcy5fcmFuZG9tSW5kZXgoKX1gO1xuXHQgICAgfVxuXHQgICAgdGhpcy5wcm9taXNlID0gbmV3IHRoaXMuUHJvbWlzZSgoX3Jlc29sdmUsIF9yZWplY3QpID0+IHtcblx0ICAgICAgdGhpcy5fcmVzb2x2ZSA9IF9yZXNvbHZlO1xuXHQgICAgICB0aGlzLl9yZWplY3QgPSBfcmVqZWN0O1xuXHQgICAgfSk7XG5cdCAgICB0aGlzLnJldHJ5Q291bnQgPSAwO1xuXHQgIH1cblxuXHQgIF9zYW5pdGl6ZVByaW9yaXR5KHByaW9yaXR5KSB7XG5cdCAgICB2YXIgc1Byb3BlcnR5O1xuXHQgICAgc1Byb3BlcnR5ID0gfn5wcmlvcml0eSAhPT0gcHJpb3JpdHkgPyBERUZBVUxUX1BSSU9SSVRZIDogcHJpb3JpdHk7XG5cdCAgICBpZiAoc1Byb3BlcnR5IDwgMCkge1xuXHQgICAgICByZXR1cm4gMDtcblx0ICAgIH0gZWxzZSBpZiAoc1Byb3BlcnR5ID4gTlVNX1BSSU9SSVRJRVMgLSAxKSB7XG5cdCAgICAgIHJldHVybiBOVU1fUFJJT1JJVElFUyAtIDE7XG5cdCAgICB9IGVsc2Uge1xuXHQgICAgICByZXR1cm4gc1Byb3BlcnR5O1xuXHQgICAgfVxuXHQgIH1cblxuXHQgIF9yYW5kb21JbmRleCgpIHtcblx0ICAgIHJldHVybiBNYXRoLnJhbmRvbSgpLnRvU3RyaW5nKDM2KS5zbGljZSgyKTtcblx0ICB9XG5cblx0ICBkb0Ryb3Aoe2Vycm9yLCBtZXNzYWdlID0gXCJUaGlzIGpvYiBoYXMgYmVlbiBkcm9wcGVkIGJ5IEJvdHRsZW5lY2tcIn0gPSB7fSkge1xuXHQgICAgaWYgKHRoaXMuX3N0YXRlcy5yZW1vdmUodGhpcy5vcHRpb25zLmlkKSkge1xuXHQgICAgICBpZiAodGhpcy5yZWplY3RPbkRyb3ApIHtcblx0ICAgICAgICB0aGlzLl9yZWplY3QoZXJyb3IgIT0gbnVsbCA/IGVycm9yIDogbmV3IEJvdHRsZW5lY2tFcnJvciQxKG1lc3NhZ2UpKTtcblx0ICAgICAgfVxuXHQgICAgICB0aGlzLkV2ZW50cy50cmlnZ2VyKFwiZHJvcHBlZFwiLCB7YXJnczogdGhpcy5hcmdzLCBvcHRpb25zOiB0aGlzLm9wdGlvbnMsIHRhc2s6IHRoaXMudGFzaywgcHJvbWlzZTogdGhpcy5wcm9taXNlfSk7XG5cdCAgICAgIHJldHVybiB0cnVlO1xuXHQgICAgfSBlbHNlIHtcblx0ICAgICAgcmV0dXJuIGZhbHNlO1xuXHQgICAgfVxuXHQgIH1cblxuXHQgIF9hc3NlcnRTdGF0dXMoZXhwZWN0ZWQpIHtcblx0ICAgIHZhciBzdGF0dXM7XG5cdCAgICBzdGF0dXMgPSB0aGlzLl9zdGF0ZXMuam9iU3RhdHVzKHRoaXMub3B0aW9ucy5pZCk7XG5cdCAgICBpZiAoIShzdGF0dXMgPT09IGV4cGVjdGVkIHx8IChleHBlY3RlZCA9PT0gXCJET05FXCIgJiYgc3RhdHVzID09PSBudWxsKSkpIHtcblx0ICAgICAgdGhyb3cgbmV3IEJvdHRsZW5lY2tFcnJvciQxKGBJbnZhbGlkIGpvYiBzdGF0dXMgJHtzdGF0dXN9LCBleHBlY3RlZCAke2V4cGVjdGVkfS4gUGxlYXNlIG9wZW4gYW4gaXNzdWUgYXQgaHR0cHM6Ly9naXRodWIuY29tL1NHcm9uZGluL2JvdHRsZW5lY2svaXNzdWVzYCk7XG5cdCAgICB9XG5cdCAgfVxuXG5cdCAgZG9SZWNlaXZlKCkge1xuXHQgICAgdGhpcy5fc3RhdGVzLnN0YXJ0KHRoaXMub3B0aW9ucy5pZCk7XG5cdCAgICByZXR1cm4gdGhpcy5FdmVudHMudHJpZ2dlcihcInJlY2VpdmVkXCIsIHthcmdzOiB0aGlzLmFyZ3MsIG9wdGlvbnM6IHRoaXMub3B0aW9uc30pO1xuXHQgIH1cblxuXHQgIGRvUXVldWUocmVhY2hlZEhXTSwgYmxvY2tlZCkge1xuXHQgICAgdGhpcy5fYXNzZXJ0U3RhdHVzKFwiUkVDRUlWRURcIik7XG5cdCAgICB0aGlzLl9zdGF0ZXMubmV4dCh0aGlzLm9wdGlvbnMuaWQpO1xuXHQgICAgcmV0dXJuIHRoaXMuRXZlbnRzLnRyaWdnZXIoXCJxdWV1ZWRcIiwge2FyZ3M6IHRoaXMuYXJncywgb3B0aW9uczogdGhpcy5vcHRpb25zLCByZWFjaGVkSFdNLCBibG9ja2VkfSk7XG5cdCAgfVxuXG5cdCAgZG9SdW4oKSB7XG5cdCAgICBpZiAodGhpcy5yZXRyeUNvdW50ID09PSAwKSB7XG5cdCAgICAgIHRoaXMuX2Fzc2VydFN0YXR1cyhcIlFVRVVFRFwiKTtcblx0ICAgICAgdGhpcy5fc3RhdGVzLm5leHQodGhpcy5vcHRpb25zLmlkKTtcblx0ICAgIH0gZWxzZSB7XG5cdCAgICAgIHRoaXMuX2Fzc2VydFN0YXR1cyhcIkVYRUNVVElOR1wiKTtcblx0ICAgIH1cblx0ICAgIHJldHVybiB0aGlzLkV2ZW50cy50cmlnZ2VyKFwic2NoZWR1bGVkXCIsIHthcmdzOiB0aGlzLmFyZ3MsIG9wdGlvbnM6IHRoaXMub3B0aW9uc30pO1xuXHQgIH1cblxuXHQgIGFzeW5jIGRvRXhlY3V0ZShjaGFpbmVkLCBjbGVhckdsb2JhbFN0YXRlLCBydW4sIGZyZWUpIHtcblx0ICAgIHZhciBlcnJvciwgZXZlbnRJbmZvLCBwYXNzZWQ7XG5cdCAgICBpZiAodGhpcy5yZXRyeUNvdW50ID09PSAwKSB7XG5cdCAgICAgIHRoaXMuX2Fzc2VydFN0YXR1cyhcIlJVTk5JTkdcIik7XG5cdCAgICAgIHRoaXMuX3N0YXRlcy5uZXh0KHRoaXMub3B0aW9ucy5pZCk7XG5cdCAgICB9IGVsc2Uge1xuXHQgICAgICB0aGlzLl9hc3NlcnRTdGF0dXMoXCJFWEVDVVRJTkdcIik7XG5cdCAgICB9XG5cdCAgICBldmVudEluZm8gPSB7YXJnczogdGhpcy5hcmdzLCBvcHRpb25zOiB0aGlzLm9wdGlvbnMsIHJldHJ5Q291bnQ6IHRoaXMucmV0cnlDb3VudH07XG5cdCAgICB0aGlzLkV2ZW50cy50cmlnZ2VyKFwiZXhlY3V0aW5nXCIsIGV2ZW50SW5mbyk7XG5cdCAgICB0cnkge1xuXHQgICAgICBwYXNzZWQgPSAoYXdhaXQgKGNoYWluZWQgIT0gbnVsbCA/IGNoYWluZWQuc2NoZWR1bGUodGhpcy5vcHRpb25zLCB0aGlzLnRhc2ssIC4uLnRoaXMuYXJncykgOiB0aGlzLnRhc2soLi4udGhpcy5hcmdzKSkpO1xuXHQgICAgICBpZiAoY2xlYXJHbG9iYWxTdGF0ZSgpKSB7XG5cdCAgICAgICAgdGhpcy5kb0RvbmUoZXZlbnRJbmZvKTtcblx0ICAgICAgICBhd2FpdCBmcmVlKHRoaXMub3B0aW9ucywgZXZlbnRJbmZvKTtcblx0ICAgICAgICB0aGlzLl9hc3NlcnRTdGF0dXMoXCJET05FXCIpO1xuXHQgICAgICAgIHJldHVybiB0aGlzLl9yZXNvbHZlKHBhc3NlZCk7XG5cdCAgICAgIH1cblx0ICAgIH0gY2F0Y2ggKGVycm9yMSkge1xuXHQgICAgICBlcnJvciA9IGVycm9yMTtcblx0ICAgICAgcmV0dXJuIHRoaXMuX29uRmFpbHVyZShlcnJvciwgZXZlbnRJbmZvLCBjbGVhckdsb2JhbFN0YXRlLCBydW4sIGZyZWUpO1xuXHQgICAgfVxuXHQgIH1cblxuXHQgIGRvRXhwaXJlKGNsZWFyR2xvYmFsU3RhdGUsIHJ1biwgZnJlZSkge1xuXHQgICAgdmFyIGVycm9yLCBldmVudEluZm87XG5cdCAgICBpZiAodGhpcy5fc3RhdGVzLmpvYlN0YXR1cyh0aGlzLm9wdGlvbnMuaWQgPT09IFwiUlVOTklOR1wiKSkge1xuXHQgICAgICB0aGlzLl9zdGF0ZXMubmV4dCh0aGlzLm9wdGlvbnMuaWQpO1xuXHQgICAgfVxuXHQgICAgdGhpcy5fYXNzZXJ0U3RhdHVzKFwiRVhFQ1VUSU5HXCIpO1xuXHQgICAgZXZlbnRJbmZvID0ge2FyZ3M6IHRoaXMuYXJncywgb3B0aW9uczogdGhpcy5vcHRpb25zLCByZXRyeUNvdW50OiB0aGlzLnJldHJ5Q291bnR9O1xuXHQgICAgZXJyb3IgPSBuZXcgQm90dGxlbmVja0Vycm9yJDEoYFRoaXMgam9iIHRpbWVkIG91dCBhZnRlciAke3RoaXMub3B0aW9ucy5leHBpcmF0aW9ufSBtcy5gKTtcblx0ICAgIHJldHVybiB0aGlzLl9vbkZhaWx1cmUoZXJyb3IsIGV2ZW50SW5mbywgY2xlYXJHbG9iYWxTdGF0ZSwgcnVuLCBmcmVlKTtcblx0ICB9XG5cblx0ICBhc3luYyBfb25GYWlsdXJlKGVycm9yLCBldmVudEluZm8sIGNsZWFyR2xvYmFsU3RhdGUsIHJ1biwgZnJlZSkge1xuXHQgICAgdmFyIHJldHJ5LCByZXRyeUFmdGVyO1xuXHQgICAgaWYgKGNsZWFyR2xvYmFsU3RhdGUoKSkge1xuXHQgICAgICByZXRyeSA9IChhd2FpdCB0aGlzLkV2ZW50cy50cmlnZ2VyKFwiZmFpbGVkXCIsIGVycm9yLCBldmVudEluZm8pKTtcblx0ICAgICAgaWYgKHJldHJ5ICE9IG51bGwpIHtcblx0ICAgICAgICByZXRyeUFmdGVyID0gfn5yZXRyeTtcblx0ICAgICAgICB0aGlzLkV2ZW50cy50cmlnZ2VyKFwicmV0cnlcIiwgYFJldHJ5aW5nICR7dGhpcy5vcHRpb25zLmlkfSBhZnRlciAke3JldHJ5QWZ0ZXJ9IG1zYCwgZXZlbnRJbmZvKTtcblx0ICAgICAgICB0aGlzLnJldHJ5Q291bnQrKztcblx0ICAgICAgICByZXR1cm4gcnVuKHJldHJ5QWZ0ZXIpO1xuXHQgICAgICB9IGVsc2Uge1xuXHQgICAgICAgIHRoaXMuZG9Eb25lKGV2ZW50SW5mbyk7XG5cdCAgICAgICAgYXdhaXQgZnJlZSh0aGlzLm9wdGlvbnMsIGV2ZW50SW5mbyk7XG5cdCAgICAgICAgdGhpcy5fYXNzZXJ0U3RhdHVzKFwiRE9ORVwiKTtcblx0ICAgICAgICByZXR1cm4gdGhpcy5fcmVqZWN0KGVycm9yKTtcblx0ICAgICAgfVxuXHQgICAgfVxuXHQgIH1cblxuXHQgIGRvRG9uZShldmVudEluZm8pIHtcblx0ICAgIHRoaXMuX2Fzc2VydFN0YXR1cyhcIkVYRUNVVElOR1wiKTtcblx0ICAgIHRoaXMuX3N0YXRlcy5uZXh0KHRoaXMub3B0aW9ucy5pZCk7XG5cdCAgICByZXR1cm4gdGhpcy5FdmVudHMudHJpZ2dlcihcImRvbmVcIiwgZXZlbnRJbmZvKTtcblx0ICB9XG5cblx0fTtcblxuXHR2YXIgSm9iXzEgPSBKb2I7XG5cblx0dmFyIEJvdHRsZW5lY2tFcnJvciQyLCBMb2NhbERhdGFzdG9yZSwgcGFyc2VyJDI7XG5cblx0cGFyc2VyJDIgPSBwYXJzZXI7XG5cblx0Qm90dGxlbmVja0Vycm9yJDIgPSBCb3R0bGVuZWNrRXJyb3JfMTtcblxuXHRMb2NhbERhdGFzdG9yZSA9IGNsYXNzIExvY2FsRGF0YXN0b3JlIHtcblx0ICBjb25zdHJ1Y3RvcihpbnN0YW5jZSwgc3RvcmVPcHRpb25zLCBzdG9yZUluc3RhbmNlT3B0aW9ucykge1xuXHQgICAgdGhpcy5pbnN0YW5jZSA9IGluc3RhbmNlO1xuXHQgICAgdGhpcy5zdG9yZU9wdGlvbnMgPSBzdG9yZU9wdGlvbnM7XG5cdCAgICB0aGlzLmNsaWVudElkID0gdGhpcy5pbnN0YW5jZS5fcmFuZG9tSW5kZXgoKTtcblx0ICAgIHBhcnNlciQyLmxvYWQoc3RvcmVJbnN0YW5jZU9wdGlvbnMsIHN0b3JlSW5zdGFuY2VPcHRpb25zLCB0aGlzKTtcblx0ICAgIHRoaXMuX25leHRSZXF1ZXN0ID0gdGhpcy5fbGFzdFJlc2Vydm9pclJlZnJlc2ggPSB0aGlzLl9sYXN0UmVzZXJ2b2lySW5jcmVhc2UgPSBEYXRlLm5vdygpO1xuXHQgICAgdGhpcy5fcnVubmluZyA9IDA7XG5cdCAgICB0aGlzLl9kb25lID0gMDtcblx0ICAgIHRoaXMuX3VuYmxvY2tUaW1lID0gMDtcblx0ICAgIHRoaXMucmVhZHkgPSB0aGlzLlByb21pc2UucmVzb2x2ZSgpO1xuXHQgICAgdGhpcy5jbGllbnRzID0ge307XG5cdCAgICB0aGlzLl9zdGFydEhlYXJ0YmVhdCgpO1xuXHQgIH1cblxuXHQgIF9zdGFydEhlYXJ0YmVhdCgpIHtcblx0ICAgIHZhciBiYXNlO1xuXHQgICAgaWYgKCh0aGlzLmhlYXJ0YmVhdCA9PSBudWxsKSAmJiAoKCh0aGlzLnN0b3JlT3B0aW9ucy5yZXNlcnZvaXJSZWZyZXNoSW50ZXJ2YWwgIT0gbnVsbCkgJiYgKHRoaXMuc3RvcmVPcHRpb25zLnJlc2Vydm9pclJlZnJlc2hBbW91bnQgIT0gbnVsbCkpIHx8ICgodGhpcy5zdG9yZU9wdGlvbnMucmVzZXJ2b2lySW5jcmVhc2VJbnRlcnZhbCAhPSBudWxsKSAmJiAodGhpcy5zdG9yZU9wdGlvbnMucmVzZXJ2b2lySW5jcmVhc2VBbW91bnQgIT0gbnVsbCkpKSkge1xuXHQgICAgICByZXR1cm4gdHlwZW9mIChiYXNlID0gKHRoaXMuaGVhcnRiZWF0ID0gc2V0SW50ZXJ2YWwoKCkgPT4ge1xuXHQgICAgICAgIHZhciBhbW91bnQsIGluY3IsIG1heGltdW0sIG5vdywgcmVzZXJ2b2lyO1xuXHQgICAgICAgIG5vdyA9IERhdGUubm93KCk7XG5cdCAgICAgICAgaWYgKCh0aGlzLnN0b3JlT3B0aW9ucy5yZXNlcnZvaXJSZWZyZXNoSW50ZXJ2YWwgIT0gbnVsbCkgJiYgbm93ID49IHRoaXMuX2xhc3RSZXNlcnZvaXJSZWZyZXNoICsgdGhpcy5zdG9yZU9wdGlvbnMucmVzZXJ2b2lyUmVmcmVzaEludGVydmFsKSB7XG5cdCAgICAgICAgICB0aGlzLl9sYXN0UmVzZXJ2b2lyUmVmcmVzaCA9IG5vdztcblx0ICAgICAgICAgIHRoaXMuc3RvcmVPcHRpb25zLnJlc2Vydm9pciA9IHRoaXMuc3RvcmVPcHRpb25zLnJlc2Vydm9pclJlZnJlc2hBbW91bnQ7XG5cdCAgICAgICAgICB0aGlzLmluc3RhbmNlLl9kcmFpbkFsbCh0aGlzLmNvbXB1dGVDYXBhY2l0eSgpKTtcblx0ICAgICAgICB9XG5cdCAgICAgICAgaWYgKCh0aGlzLnN0b3JlT3B0aW9ucy5yZXNlcnZvaXJJbmNyZWFzZUludGVydmFsICE9IG51bGwpICYmIG5vdyA+PSB0aGlzLl9sYXN0UmVzZXJ2b2lySW5jcmVhc2UgKyB0aGlzLnN0b3JlT3B0aW9ucy5yZXNlcnZvaXJJbmNyZWFzZUludGVydmFsKSB7XG5cdCAgICAgICAgICAoe1xuXHQgICAgICAgICAgICByZXNlcnZvaXJJbmNyZWFzZUFtb3VudDogYW1vdW50LFxuXHQgICAgICAgICAgICByZXNlcnZvaXJJbmNyZWFzZU1heGltdW06IG1heGltdW0sXG5cdCAgICAgICAgICAgIHJlc2Vydm9pclxuXHQgICAgICAgICAgfSA9IHRoaXMuc3RvcmVPcHRpb25zKTtcblx0ICAgICAgICAgIHRoaXMuX2xhc3RSZXNlcnZvaXJJbmNyZWFzZSA9IG5vdztcblx0ICAgICAgICAgIGluY3IgPSBtYXhpbXVtICE9IG51bGwgPyBNYXRoLm1pbihhbW91bnQsIG1heGltdW0gLSByZXNlcnZvaXIpIDogYW1vdW50O1xuXHQgICAgICAgICAgaWYgKGluY3IgPiAwKSB7XG5cdCAgICAgICAgICAgIHRoaXMuc3RvcmVPcHRpb25zLnJlc2Vydm9pciArPSBpbmNyO1xuXHQgICAgICAgICAgICByZXR1cm4gdGhpcy5pbnN0YW5jZS5fZHJhaW5BbGwodGhpcy5jb21wdXRlQ2FwYWNpdHkoKSk7XG5cdCAgICAgICAgICB9XG5cdCAgICAgICAgfVxuXHQgICAgICB9LCB0aGlzLmhlYXJ0YmVhdEludGVydmFsKSkpLnVucmVmID09PSBcImZ1bmN0aW9uXCIgPyBiYXNlLnVucmVmKCkgOiB2b2lkIDA7XG5cdCAgICB9IGVsc2Uge1xuXHQgICAgICByZXR1cm4gY2xlYXJJbnRlcnZhbCh0aGlzLmhlYXJ0YmVhdCk7XG5cdCAgICB9XG5cdCAgfVxuXG5cdCAgYXN5bmMgX19wdWJsaXNoX18obWVzc2FnZSkge1xuXHQgICAgYXdhaXQgdGhpcy55aWVsZExvb3AoKTtcblx0ICAgIHJldHVybiB0aGlzLmluc3RhbmNlLkV2ZW50cy50cmlnZ2VyKFwibWVzc2FnZVwiLCBtZXNzYWdlLnRvU3RyaW5nKCkpO1xuXHQgIH1cblxuXHQgIGFzeW5jIF9fZGlzY29ubmVjdF9fKGZsdXNoKSB7XG5cdCAgICBhd2FpdCB0aGlzLnlpZWxkTG9vcCgpO1xuXHQgICAgY2xlYXJJbnRlcnZhbCh0aGlzLmhlYXJ0YmVhdCk7XG5cdCAgICByZXR1cm4gdGhpcy5Qcm9taXNlLnJlc29sdmUoKTtcblx0ICB9XG5cblx0ICB5aWVsZExvb3AodCA9IDApIHtcblx0ICAgIHJldHVybiBuZXcgdGhpcy5Qcm9taXNlKGZ1bmN0aW9uKHJlc29sdmUsIHJlamVjdCkge1xuXHQgICAgICByZXR1cm4gc2V0VGltZW91dChyZXNvbHZlLCB0KTtcblx0ICAgIH0pO1xuXHQgIH1cblxuXHQgIGNvbXB1dGVQZW5hbHR5KCkge1xuXHQgICAgdmFyIHJlZjtcblx0ICAgIHJldHVybiAocmVmID0gdGhpcy5zdG9yZU9wdGlvbnMucGVuYWx0eSkgIT0gbnVsbCA/IHJlZiA6ICgxNSAqIHRoaXMuc3RvcmVPcHRpb25zLm1pblRpbWUpIHx8IDUwMDA7XG5cdCAgfVxuXG5cdCAgYXN5bmMgX191cGRhdGVTZXR0aW5nc19fKG9wdGlvbnMpIHtcblx0ICAgIGF3YWl0IHRoaXMueWllbGRMb29wKCk7XG5cdCAgICBwYXJzZXIkMi5vdmVyd3JpdGUob3B0aW9ucywgb3B0aW9ucywgdGhpcy5zdG9yZU9wdGlvbnMpO1xuXHQgICAgdGhpcy5fc3RhcnRIZWFydGJlYXQoKTtcblx0ICAgIHRoaXMuaW5zdGFuY2UuX2RyYWluQWxsKHRoaXMuY29tcHV0ZUNhcGFjaXR5KCkpO1xuXHQgICAgcmV0dXJuIHRydWU7XG5cdCAgfVxuXG5cdCAgYXN5bmMgX19ydW5uaW5nX18oKSB7XG5cdCAgICBhd2FpdCB0aGlzLnlpZWxkTG9vcCgpO1xuXHQgICAgcmV0dXJuIHRoaXMuX3J1bm5pbmc7XG5cdCAgfVxuXG5cdCAgYXN5bmMgX19xdWV1ZWRfXygpIHtcblx0ICAgIGF3YWl0IHRoaXMueWllbGRMb29wKCk7XG5cdCAgICByZXR1cm4gdGhpcy5pbnN0YW5jZS5xdWV1ZWQoKTtcblx0ICB9XG5cblx0ICBhc3luYyBfX2RvbmVfXygpIHtcblx0ICAgIGF3YWl0IHRoaXMueWllbGRMb29wKCk7XG5cdCAgICByZXR1cm4gdGhpcy5fZG9uZTtcblx0ICB9XG5cblx0ICBhc3luYyBfX2dyb3VwQ2hlY2tfXyh0aW1lKSB7XG5cdCAgICBhd2FpdCB0aGlzLnlpZWxkTG9vcCgpO1xuXHQgICAgcmV0dXJuICh0aGlzLl9uZXh0UmVxdWVzdCArIHRoaXMudGltZW91dCkgPCB0aW1lO1xuXHQgIH1cblxuXHQgIGNvbXB1dGVDYXBhY2l0eSgpIHtcblx0ICAgIHZhciBtYXhDb25jdXJyZW50LCByZXNlcnZvaXI7XG5cdCAgICAoe21heENvbmN1cnJlbnQsIHJlc2Vydm9pcn0gPSB0aGlzLnN0b3JlT3B0aW9ucyk7XG5cdCAgICBpZiAoKG1heENvbmN1cnJlbnQgIT0gbnVsbCkgJiYgKHJlc2Vydm9pciAhPSBudWxsKSkge1xuXHQgICAgICByZXR1cm4gTWF0aC5taW4obWF4Q29uY3VycmVudCAtIHRoaXMuX3J1bm5pbmcsIHJlc2Vydm9pcik7XG5cdCAgICB9IGVsc2UgaWYgKG1heENvbmN1cnJlbnQgIT0gbnVsbCkge1xuXHQgICAgICByZXR1cm4gbWF4Q29uY3VycmVudCAtIHRoaXMuX3J1bm5pbmc7XG5cdCAgICB9IGVsc2UgaWYgKHJlc2Vydm9pciAhPSBudWxsKSB7XG5cdCAgICAgIHJldHVybiByZXNlcnZvaXI7XG5cdCAgICB9IGVsc2Uge1xuXHQgICAgICByZXR1cm4gbnVsbDtcblx0ICAgIH1cblx0ICB9XG5cblx0ICBjb25kaXRpb25zQ2hlY2sod2VpZ2h0KSB7XG5cdCAgICB2YXIgY2FwYWNpdHk7XG5cdCAgICBjYXBhY2l0eSA9IHRoaXMuY29tcHV0ZUNhcGFjaXR5KCk7XG5cdCAgICByZXR1cm4gKGNhcGFjaXR5ID09IG51bGwpIHx8IHdlaWdodCA8PSBjYXBhY2l0eTtcblx0ICB9XG5cblx0ICBhc3luYyBfX2luY3JlbWVudFJlc2Vydm9pcl9fKGluY3IpIHtcblx0ICAgIHZhciByZXNlcnZvaXI7XG5cdCAgICBhd2FpdCB0aGlzLnlpZWxkTG9vcCgpO1xuXHQgICAgcmVzZXJ2b2lyID0gdGhpcy5zdG9yZU9wdGlvbnMucmVzZXJ2b2lyICs9IGluY3I7XG5cdCAgICB0aGlzLmluc3RhbmNlLl9kcmFpbkFsbCh0aGlzLmNvbXB1dGVDYXBhY2l0eSgpKTtcblx0ICAgIHJldHVybiByZXNlcnZvaXI7XG5cdCAgfVxuXG5cdCAgYXN5bmMgX19jdXJyZW50UmVzZXJ2b2lyX18oKSB7XG5cdCAgICBhd2FpdCB0aGlzLnlpZWxkTG9vcCgpO1xuXHQgICAgcmV0dXJuIHRoaXMuc3RvcmVPcHRpb25zLnJlc2Vydm9pcjtcblx0ICB9XG5cblx0ICBpc0Jsb2NrZWQobm93KSB7XG5cdCAgICByZXR1cm4gdGhpcy5fdW5ibG9ja1RpbWUgPj0gbm93O1xuXHQgIH1cblxuXHQgIGNoZWNrKHdlaWdodCwgbm93KSB7XG5cdCAgICByZXR1cm4gdGhpcy5jb25kaXRpb25zQ2hlY2sod2VpZ2h0KSAmJiAodGhpcy5fbmV4dFJlcXVlc3QgLSBub3cpIDw9IDA7XG5cdCAgfVxuXG5cdCAgYXN5bmMgX19jaGVja19fKHdlaWdodCkge1xuXHQgICAgdmFyIG5vdztcblx0ICAgIGF3YWl0IHRoaXMueWllbGRMb29wKCk7XG5cdCAgICBub3cgPSBEYXRlLm5vdygpO1xuXHQgICAgcmV0dXJuIHRoaXMuY2hlY2sod2VpZ2h0LCBub3cpO1xuXHQgIH1cblxuXHQgIGFzeW5jIF9fcmVnaXN0ZXJfXyhpbmRleCwgd2VpZ2h0LCBleHBpcmF0aW9uKSB7XG5cdCAgICB2YXIgbm93LCB3YWl0O1xuXHQgICAgYXdhaXQgdGhpcy55aWVsZExvb3AoKTtcblx0ICAgIG5vdyA9IERhdGUubm93KCk7XG5cdCAgICBpZiAodGhpcy5jb25kaXRpb25zQ2hlY2sod2VpZ2h0KSkge1xuXHQgICAgICB0aGlzLl9ydW5uaW5nICs9IHdlaWdodDtcblx0ICAgICAgaWYgKHRoaXMuc3RvcmVPcHRpb25zLnJlc2Vydm9pciAhPSBudWxsKSB7XG5cdCAgICAgICAgdGhpcy5zdG9yZU9wdGlvbnMucmVzZXJ2b2lyIC09IHdlaWdodDtcblx0ICAgICAgfVxuXHQgICAgICB3YWl0ID0gTWF0aC5tYXgodGhpcy5fbmV4dFJlcXVlc3QgLSBub3csIDApO1xuXHQgICAgICB0aGlzLl9uZXh0UmVxdWVzdCA9IG5vdyArIHdhaXQgKyB0aGlzLnN0b3JlT3B0aW9ucy5taW5UaW1lO1xuXHQgICAgICByZXR1cm4ge1xuXHQgICAgICAgIHN1Y2Nlc3M6IHRydWUsXG5cdCAgICAgICAgd2FpdCxcblx0ICAgICAgICByZXNlcnZvaXI6IHRoaXMuc3RvcmVPcHRpb25zLnJlc2Vydm9pclxuXHQgICAgICB9O1xuXHQgICAgfSBlbHNlIHtcblx0ICAgICAgcmV0dXJuIHtcblx0ICAgICAgICBzdWNjZXNzOiBmYWxzZVxuXHQgICAgICB9O1xuXHQgICAgfVxuXHQgIH1cblxuXHQgIHN0cmF0ZWd5SXNCbG9jaygpIHtcblx0ICAgIHJldHVybiB0aGlzLnN0b3JlT3B0aW9ucy5zdHJhdGVneSA9PT0gMztcblx0ICB9XG5cblx0ICBhc3luYyBfX3N1Ym1pdF9fKHF1ZXVlTGVuZ3RoLCB3ZWlnaHQpIHtcblx0ICAgIHZhciBibG9ja2VkLCBub3csIHJlYWNoZWRIV007XG5cdCAgICBhd2FpdCB0aGlzLnlpZWxkTG9vcCgpO1xuXHQgICAgaWYgKCh0aGlzLnN0b3JlT3B0aW9ucy5tYXhDb25jdXJyZW50ICE9IG51bGwpICYmIHdlaWdodCA+IHRoaXMuc3RvcmVPcHRpb25zLm1heENvbmN1cnJlbnQpIHtcblx0ICAgICAgdGhyb3cgbmV3IEJvdHRsZW5lY2tFcnJvciQyKGBJbXBvc3NpYmxlIHRvIGFkZCBhIGpvYiBoYXZpbmcgYSB3ZWlnaHQgb2YgJHt3ZWlnaHR9IHRvIGEgbGltaXRlciBoYXZpbmcgYSBtYXhDb25jdXJyZW50IHNldHRpbmcgb2YgJHt0aGlzLnN0b3JlT3B0aW9ucy5tYXhDb25jdXJyZW50fWApO1xuXHQgICAgfVxuXHQgICAgbm93ID0gRGF0ZS5ub3coKTtcblx0ICAgIHJlYWNoZWRIV00gPSAodGhpcy5zdG9yZU9wdGlvbnMuaGlnaFdhdGVyICE9IG51bGwpICYmIHF1ZXVlTGVuZ3RoID09PSB0aGlzLnN0b3JlT3B0aW9ucy5oaWdoV2F0ZXIgJiYgIXRoaXMuY2hlY2sod2VpZ2h0LCBub3cpO1xuXHQgICAgYmxvY2tlZCA9IHRoaXMuc3RyYXRlZ3lJc0Jsb2NrKCkgJiYgKHJlYWNoZWRIV00gfHwgdGhpcy5pc0Jsb2NrZWQobm93KSk7XG5cdCAgICBpZiAoYmxvY2tlZCkge1xuXHQgICAgICB0aGlzLl91bmJsb2NrVGltZSA9IG5vdyArIHRoaXMuY29tcHV0ZVBlbmFsdHkoKTtcblx0ICAgICAgdGhpcy5fbmV4dFJlcXVlc3QgPSB0aGlzLl91bmJsb2NrVGltZSArIHRoaXMuc3RvcmVPcHRpb25zLm1pblRpbWU7XG5cdCAgICAgIHRoaXMuaW5zdGFuY2UuX2Ryb3BBbGxRdWV1ZWQoKTtcblx0ICAgIH1cblx0ICAgIHJldHVybiB7XG5cdCAgICAgIHJlYWNoZWRIV00sXG5cdCAgICAgIGJsb2NrZWQsXG5cdCAgICAgIHN0cmF0ZWd5OiB0aGlzLnN0b3JlT3B0aW9ucy5zdHJhdGVneVxuXHQgICAgfTtcblx0ICB9XG5cblx0ICBhc3luYyBfX2ZyZWVfXyhpbmRleCwgd2VpZ2h0KSB7XG5cdCAgICBhd2FpdCB0aGlzLnlpZWxkTG9vcCgpO1xuXHQgICAgdGhpcy5fcnVubmluZyAtPSB3ZWlnaHQ7XG5cdCAgICB0aGlzLl9kb25lICs9IHdlaWdodDtcblx0ICAgIHRoaXMuaW5zdGFuY2UuX2RyYWluQWxsKHRoaXMuY29tcHV0ZUNhcGFjaXR5KCkpO1xuXHQgICAgcmV0dXJuIHtcblx0ICAgICAgcnVubmluZzogdGhpcy5fcnVubmluZ1xuXHQgICAgfTtcblx0ICB9XG5cblx0fTtcblxuXHR2YXIgTG9jYWxEYXRhc3RvcmVfMSA9IExvY2FsRGF0YXN0b3JlO1xuXG5cdHZhciBCb3R0bGVuZWNrRXJyb3IkMywgU3RhdGVzO1xuXG5cdEJvdHRsZW5lY2tFcnJvciQzID0gQm90dGxlbmVja0Vycm9yXzE7XG5cblx0U3RhdGVzID0gY2xhc3MgU3RhdGVzIHtcblx0ICBjb25zdHJ1Y3RvcihzdGF0dXMxKSB7XG5cdCAgICB0aGlzLnN0YXR1cyA9IHN0YXR1czE7XG5cdCAgICB0aGlzLl9qb2JzID0ge307XG5cdCAgICB0aGlzLmNvdW50cyA9IHRoaXMuc3RhdHVzLm1hcChmdW5jdGlvbigpIHtcblx0ICAgICAgcmV0dXJuIDA7XG5cdCAgICB9KTtcblx0ICB9XG5cblx0ICBuZXh0KGlkKSB7XG5cdCAgICB2YXIgY3VycmVudCwgbmV4dDtcblx0ICAgIGN1cnJlbnQgPSB0aGlzLl9qb2JzW2lkXTtcblx0ICAgIG5leHQgPSBjdXJyZW50ICsgMTtcblx0ICAgIGlmICgoY3VycmVudCAhPSBudWxsKSAmJiBuZXh0IDwgdGhpcy5zdGF0dXMubGVuZ3RoKSB7XG5cdCAgICAgIHRoaXMuY291bnRzW2N1cnJlbnRdLS07XG5cdCAgICAgIHRoaXMuY291bnRzW25leHRdKys7XG5cdCAgICAgIHJldHVybiB0aGlzLl9qb2JzW2lkXSsrO1xuXHQgICAgfSBlbHNlIGlmIChjdXJyZW50ICE9IG51bGwpIHtcblx0ICAgICAgdGhpcy5jb3VudHNbY3VycmVudF0tLTtcblx0ICAgICAgcmV0dXJuIGRlbGV0ZSB0aGlzLl9qb2JzW2lkXTtcblx0ICAgIH1cblx0ICB9XG5cblx0ICBzdGFydChpZCkge1xuXHQgICAgdmFyIGluaXRpYWw7XG5cdCAgICBpbml0aWFsID0gMDtcblx0ICAgIHRoaXMuX2pvYnNbaWRdID0gaW5pdGlhbDtcblx0ICAgIHJldHVybiB0aGlzLmNvdW50c1tpbml0aWFsXSsrO1xuXHQgIH1cblxuXHQgIHJlbW92ZShpZCkge1xuXHQgICAgdmFyIGN1cnJlbnQ7XG5cdCAgICBjdXJyZW50ID0gdGhpcy5fam9ic1tpZF07XG5cdCAgICBpZiAoY3VycmVudCAhPSBudWxsKSB7XG5cdCAgICAgIHRoaXMuY291bnRzW2N1cnJlbnRdLS07XG5cdCAgICAgIGRlbGV0ZSB0aGlzLl9qb2JzW2lkXTtcblx0ICAgIH1cblx0ICAgIHJldHVybiBjdXJyZW50ICE9IG51bGw7XG5cdCAgfVxuXG5cdCAgam9iU3RhdHVzKGlkKSB7XG5cdCAgICB2YXIgcmVmO1xuXHQgICAgcmV0dXJuIChyZWYgPSB0aGlzLnN0YXR1c1t0aGlzLl9qb2JzW2lkXV0pICE9IG51bGwgPyByZWYgOiBudWxsO1xuXHQgIH1cblxuXHQgIHN0YXR1c0pvYnMoc3RhdHVzKSB7XG5cdCAgICB2YXIgaywgcG9zLCByZWYsIHJlc3VsdHMsIHY7XG5cdCAgICBpZiAoc3RhdHVzICE9IG51bGwpIHtcblx0ICAgICAgcG9zID0gdGhpcy5zdGF0dXMuaW5kZXhPZihzdGF0dXMpO1xuXHQgICAgICBpZiAocG9zIDwgMCkge1xuXHQgICAgICAgIHRocm93IG5ldyBCb3R0bGVuZWNrRXJyb3IkMyhgc3RhdHVzIG11c3QgYmUgb25lIG9mICR7dGhpcy5zdGF0dXMuam9pbignLCAnKX1gKTtcblx0ICAgICAgfVxuXHQgICAgICByZWYgPSB0aGlzLl9qb2JzO1xuXHQgICAgICByZXN1bHRzID0gW107XG5cdCAgICAgIGZvciAoayBpbiByZWYpIHtcblx0ICAgICAgICB2ID0gcmVmW2tdO1xuXHQgICAgICAgIGlmICh2ID09PSBwb3MpIHtcblx0ICAgICAgICAgIHJlc3VsdHMucHVzaChrKTtcblx0ICAgICAgICB9XG5cdCAgICAgIH1cblx0ICAgICAgcmV0dXJuIHJlc3VsdHM7XG5cdCAgICB9IGVsc2Uge1xuXHQgICAgICByZXR1cm4gT2JqZWN0LmtleXModGhpcy5fam9icyk7XG5cdCAgICB9XG5cdCAgfVxuXG5cdCAgc3RhdHVzQ291bnRzKCkge1xuXHQgICAgcmV0dXJuIHRoaXMuY291bnRzLnJlZHVjZSgoKGFjYywgdiwgaSkgPT4ge1xuXHQgICAgICBhY2NbdGhpcy5zdGF0dXNbaV1dID0gdjtcblx0ICAgICAgcmV0dXJuIGFjYztcblx0ICAgIH0pLCB7fSk7XG5cdCAgfVxuXG5cdH07XG5cblx0dmFyIFN0YXRlc18xID0gU3RhdGVzO1xuXG5cdHZhciBETExpc3QkMiwgU3luYztcblxuXHRETExpc3QkMiA9IERMTGlzdF8xO1xuXG5cdFN5bmMgPSBjbGFzcyBTeW5jIHtcblx0ICBjb25zdHJ1Y3RvcihuYW1lLCBQcm9taXNlKSB7XG5cdCAgICB0aGlzLnNjaGVkdWxlID0gdGhpcy5zY2hlZHVsZS5iaW5kKHRoaXMpO1xuXHQgICAgdGhpcy5uYW1lID0gbmFtZTtcblx0ICAgIHRoaXMuUHJvbWlzZSA9IFByb21pc2U7XG5cdCAgICB0aGlzLl9ydW5uaW5nID0gMDtcblx0ICAgIHRoaXMuX3F1ZXVlID0gbmV3IERMTGlzdCQyKCk7XG5cdCAgfVxuXG5cdCAgaXNFbXB0eSgpIHtcblx0ICAgIHJldHVybiB0aGlzLl9xdWV1ZS5sZW5ndGggPT09IDA7XG5cdCAgfVxuXG5cdCAgYXN5bmMgX3RyeVRvUnVuKCkge1xuXHQgICAgdmFyIGFyZ3MsIGNiLCBlcnJvciwgcmVqZWN0LCByZXNvbHZlLCByZXR1cm5lZCwgdGFzaztcblx0ICAgIGlmICgodGhpcy5fcnVubmluZyA8IDEpICYmIHRoaXMuX3F1ZXVlLmxlbmd0aCA+IDApIHtcblx0ICAgICAgdGhpcy5fcnVubmluZysrO1xuXHQgICAgICAoe3Rhc2ssIGFyZ3MsIHJlc29sdmUsIHJlamVjdH0gPSB0aGlzLl9xdWV1ZS5zaGlmdCgpKTtcblx0ICAgICAgY2IgPSAoYXdhaXQgKGFzeW5jIGZ1bmN0aW9uKCkge1xuXHQgICAgICAgIHRyeSB7XG5cdCAgICAgICAgICByZXR1cm5lZCA9IChhd2FpdCB0YXNrKC4uLmFyZ3MpKTtcblx0ICAgICAgICAgIHJldHVybiBmdW5jdGlvbigpIHtcblx0ICAgICAgICAgICAgcmV0dXJuIHJlc29sdmUocmV0dXJuZWQpO1xuXHQgICAgICAgICAgfTtcblx0ICAgICAgICB9IGNhdGNoIChlcnJvcjEpIHtcblx0ICAgICAgICAgIGVycm9yID0gZXJyb3IxO1xuXHQgICAgICAgICAgcmV0dXJuIGZ1bmN0aW9uKCkge1xuXHQgICAgICAgICAgICByZXR1cm4gcmVqZWN0KGVycm9yKTtcblx0ICAgICAgICAgIH07XG5cdCAgICAgICAgfVxuXHQgICAgICB9KSgpKTtcblx0ICAgICAgdGhpcy5fcnVubmluZy0tO1xuXHQgICAgICB0aGlzLl90cnlUb1J1bigpO1xuXHQgICAgICByZXR1cm4gY2IoKTtcblx0ICAgIH1cblx0ICB9XG5cblx0ICBzY2hlZHVsZSh0YXNrLCAuLi5hcmdzKSB7XG5cdCAgICB2YXIgcHJvbWlzZSwgcmVqZWN0LCByZXNvbHZlO1xuXHQgICAgcmVzb2x2ZSA9IHJlamVjdCA9IG51bGw7XG5cdCAgICBwcm9taXNlID0gbmV3IHRoaXMuUHJvbWlzZShmdW5jdGlvbihfcmVzb2x2ZSwgX3JlamVjdCkge1xuXHQgICAgICByZXNvbHZlID0gX3Jlc29sdmU7XG5cdCAgICAgIHJldHVybiByZWplY3QgPSBfcmVqZWN0O1xuXHQgICAgfSk7XG5cdCAgICB0aGlzLl9xdWV1ZS5wdXNoKHt0YXNrLCBhcmdzLCByZXNvbHZlLCByZWplY3R9KTtcblx0ICAgIHRoaXMuX3RyeVRvUnVuKCk7XG5cdCAgICByZXR1cm4gcHJvbWlzZTtcblx0ICB9XG5cblx0fTtcblxuXHR2YXIgU3luY18xID0gU3luYztcblxuXHR2YXIgdmVyc2lvbiA9IFwiMi4xOS41XCI7XG5cdHZhciB2ZXJzaW9uJDEgPSB7XG5cdFx0dmVyc2lvbjogdmVyc2lvblxuXHR9O1xuXG5cdHZhciB2ZXJzaW9uJDIgPSAvKiNfX1BVUkVfXyovT2JqZWN0LmZyZWV6ZSh7XG5cdFx0dmVyc2lvbjogdmVyc2lvbixcblx0XHRkZWZhdWx0OiB2ZXJzaW9uJDFcblx0fSk7XG5cblx0dmFyIHJlcXVpcmUkJDIgPSAoKSA9PiBjb25zb2xlLmxvZygnWW91IG11c3QgaW1wb3J0IHRoZSBmdWxsIHZlcnNpb24gb2YgQm90dGxlbmVjayBpbiBvcmRlciB0byB1c2UgdGhpcyBmZWF0dXJlLicpO1xuXG5cdHZhciByZXF1aXJlJCQzID0gKCkgPT4gY29uc29sZS5sb2coJ1lvdSBtdXN0IGltcG9ydCB0aGUgZnVsbCB2ZXJzaW9uIG9mIEJvdHRsZW5lY2sgaW4gb3JkZXIgdG8gdXNlIHRoaXMgZmVhdHVyZS4nKTtcblxuXHR2YXIgcmVxdWlyZSQkNCA9ICgpID0+IGNvbnNvbGUubG9nKCdZb3UgbXVzdCBpbXBvcnQgdGhlIGZ1bGwgdmVyc2lvbiBvZiBCb3R0bGVuZWNrIGluIG9yZGVyIHRvIHVzZSB0aGlzIGZlYXR1cmUuJyk7XG5cblx0dmFyIEV2ZW50cyQyLCBHcm91cCwgSU9SZWRpc0Nvbm5lY3Rpb24kMSwgUmVkaXNDb25uZWN0aW9uJDEsIFNjcmlwdHMkMSwgcGFyc2VyJDM7XG5cblx0cGFyc2VyJDMgPSBwYXJzZXI7XG5cblx0RXZlbnRzJDIgPSBFdmVudHNfMTtcblxuXHRSZWRpc0Nvbm5lY3Rpb24kMSA9IHJlcXVpcmUkJDI7XG5cblx0SU9SZWRpc0Nvbm5lY3Rpb24kMSA9IHJlcXVpcmUkJDM7XG5cblx0U2NyaXB0cyQxID0gcmVxdWlyZSQkNDtcblxuXHRHcm91cCA9IChmdW5jdGlvbigpIHtcblx0ICBjbGFzcyBHcm91cCB7XG5cdCAgICBjb25zdHJ1Y3RvcihsaW1pdGVyT3B0aW9ucyA9IHt9KSB7XG5cdCAgICAgIHRoaXMuZGVsZXRlS2V5ID0gdGhpcy5kZWxldGVLZXkuYmluZCh0aGlzKTtcblx0ICAgICAgdGhpcy5saW1pdGVyT3B0aW9ucyA9IGxpbWl0ZXJPcHRpb25zO1xuXHQgICAgICBwYXJzZXIkMy5sb2FkKHRoaXMubGltaXRlck9wdGlvbnMsIHRoaXMuZGVmYXVsdHMsIHRoaXMpO1xuXHQgICAgICB0aGlzLkV2ZW50cyA9IG5ldyBFdmVudHMkMih0aGlzKTtcblx0ICAgICAgdGhpcy5pbnN0YW5jZXMgPSB7fTtcblx0ICAgICAgdGhpcy5Cb3R0bGVuZWNrID0gQm90dGxlbmVja18xO1xuXHQgICAgICB0aGlzLl9zdGFydEF1dG9DbGVhbnVwKCk7XG5cdCAgICAgIHRoaXMuc2hhcmVkQ29ubmVjdGlvbiA9IHRoaXMuY29ubmVjdGlvbiAhPSBudWxsO1xuXHQgICAgICBpZiAodGhpcy5jb25uZWN0aW9uID09IG51bGwpIHtcblx0ICAgICAgICBpZiAodGhpcy5saW1pdGVyT3B0aW9ucy5kYXRhc3RvcmUgPT09IFwicmVkaXNcIikge1xuXHQgICAgICAgICAgdGhpcy5jb25uZWN0aW9uID0gbmV3IFJlZGlzQ29ubmVjdGlvbiQxKE9iamVjdC5hc3NpZ24oe30sIHRoaXMubGltaXRlck9wdGlvbnMsIHtFdmVudHM6IHRoaXMuRXZlbnRzfSkpO1xuXHQgICAgICAgIH0gZWxzZSBpZiAodGhpcy5saW1pdGVyT3B0aW9ucy5kYXRhc3RvcmUgPT09IFwiaW9yZWRpc1wiKSB7XG5cdCAgICAgICAgICB0aGlzLmNvbm5lY3Rpb24gPSBuZXcgSU9SZWRpc0Nvbm5lY3Rpb24kMShPYmplY3QuYXNzaWduKHt9LCB0aGlzLmxpbWl0ZXJPcHRpb25zLCB7RXZlbnRzOiB0aGlzLkV2ZW50c30pKTtcblx0ICAgICAgICB9XG5cdCAgICAgIH1cblx0ICAgIH1cblxuXHQgICAga2V5KGtleSA9IFwiXCIpIHtcblx0ICAgICAgdmFyIHJlZjtcblx0ICAgICAgcmV0dXJuIChyZWYgPSB0aGlzLmluc3RhbmNlc1trZXldKSAhPSBudWxsID8gcmVmIDogKCgpID0+IHtcblx0ICAgICAgICB2YXIgbGltaXRlcjtcblx0ICAgICAgICBsaW1pdGVyID0gdGhpcy5pbnN0YW5jZXNba2V5XSA9IG5ldyB0aGlzLkJvdHRsZW5lY2soT2JqZWN0LmFzc2lnbih0aGlzLmxpbWl0ZXJPcHRpb25zLCB7XG5cdCAgICAgICAgICBpZDogYCR7dGhpcy5pZH0tJHtrZXl9YCxcblx0ICAgICAgICAgIHRpbWVvdXQ6IHRoaXMudGltZW91dCxcblx0ICAgICAgICAgIGNvbm5lY3Rpb246IHRoaXMuY29ubmVjdGlvblxuXHQgICAgICAgIH0pKTtcblx0ICAgICAgICB0aGlzLkV2ZW50cy50cmlnZ2VyKFwiY3JlYXRlZFwiLCBsaW1pdGVyLCBrZXkpO1xuXHQgICAgICAgIHJldHVybiBsaW1pdGVyO1xuXHQgICAgICB9KSgpO1xuXHQgICAgfVxuXG5cdCAgICBhc3luYyBkZWxldGVLZXkoa2V5ID0gXCJcIikge1xuXHQgICAgICB2YXIgZGVsZXRlZCwgaW5zdGFuY2U7XG5cdCAgICAgIGluc3RhbmNlID0gdGhpcy5pbnN0YW5jZXNba2V5XTtcblx0ICAgICAgaWYgKHRoaXMuY29ubmVjdGlvbikge1xuXHQgICAgICAgIGRlbGV0ZWQgPSAoYXdhaXQgdGhpcy5jb25uZWN0aW9uLl9fcnVuQ29tbWFuZF9fKFsnZGVsJywgLi4uU2NyaXB0cyQxLmFsbEtleXMoYCR7dGhpcy5pZH0tJHtrZXl9YCldKSk7XG5cdCAgICAgIH1cblx0ICAgICAgaWYgKGluc3RhbmNlICE9IG51bGwpIHtcblx0ICAgICAgICBkZWxldGUgdGhpcy5pbnN0YW5jZXNba2V5XTtcblx0ICAgICAgICBhd2FpdCBpbnN0YW5jZS5kaXNjb25uZWN0KCk7XG5cdCAgICAgIH1cblx0ICAgICAgcmV0dXJuIChpbnN0YW5jZSAhPSBudWxsKSB8fCBkZWxldGVkID4gMDtcblx0ICAgIH1cblxuXHQgICAgbGltaXRlcnMoKSB7XG5cdCAgICAgIHZhciBrLCByZWYsIHJlc3VsdHMsIHY7XG5cdCAgICAgIHJlZiA9IHRoaXMuaW5zdGFuY2VzO1xuXHQgICAgICByZXN1bHRzID0gW107XG5cdCAgICAgIGZvciAoayBpbiByZWYpIHtcblx0ICAgICAgICB2ID0gcmVmW2tdO1xuXHQgICAgICAgIHJlc3VsdHMucHVzaCh7XG5cdCAgICAgICAgICBrZXk6IGssXG5cdCAgICAgICAgICBsaW1pdGVyOiB2XG5cdCAgICAgICAgfSk7XG5cdCAgICAgIH1cblx0ICAgICAgcmV0dXJuIHJlc3VsdHM7XG5cdCAgICB9XG5cblx0ICAgIGtleXMoKSB7XG5cdCAgICAgIHJldHVybiBPYmplY3Qua2V5cyh0aGlzLmluc3RhbmNlcyk7XG5cdCAgICB9XG5cblx0ICAgIGFzeW5jIGNsdXN0ZXJLZXlzKCkge1xuXHQgICAgICB2YXIgY3Vyc29yLCBlbmQsIGZvdW5kLCBpLCBrLCBrZXlzLCBsZW4sIG5leHQsIHN0YXJ0O1xuXHQgICAgICBpZiAodGhpcy5jb25uZWN0aW9uID09IG51bGwpIHtcblx0ICAgICAgICByZXR1cm4gdGhpcy5Qcm9taXNlLnJlc29sdmUodGhpcy5rZXlzKCkpO1xuXHQgICAgICB9XG5cdCAgICAgIGtleXMgPSBbXTtcblx0ICAgICAgY3Vyc29yID0gbnVsbDtcblx0ICAgICAgc3RhcnQgPSBgYl8ke3RoaXMuaWR9LWAubGVuZ3RoO1xuXHQgICAgICBlbmQgPSBcIl9zZXR0aW5nc1wiLmxlbmd0aDtcblx0ICAgICAgd2hpbGUgKGN1cnNvciAhPT0gMCkge1xuXHQgICAgICAgIFtuZXh0LCBmb3VuZF0gPSAoYXdhaXQgdGhpcy5jb25uZWN0aW9uLl9fcnVuQ29tbWFuZF9fKFtcInNjYW5cIiwgY3Vyc29yICE9IG51bGwgPyBjdXJzb3IgOiAwLCBcIm1hdGNoXCIsIGBiXyR7dGhpcy5pZH0tKl9zZXR0aW5nc2AsIFwiY291bnRcIiwgMTAwMDBdKSk7XG5cdCAgICAgICAgY3Vyc29yID0gfn5uZXh0O1xuXHQgICAgICAgIGZvciAoaSA9IDAsIGxlbiA9IGZvdW5kLmxlbmd0aDsgaSA8IGxlbjsgaSsrKSB7XG5cdCAgICAgICAgICBrID0gZm91bmRbaV07XG5cdCAgICAgICAgICBrZXlzLnB1c2goay5zbGljZShzdGFydCwgLWVuZCkpO1xuXHQgICAgICAgIH1cblx0ICAgICAgfVxuXHQgICAgICByZXR1cm4ga2V5cztcblx0ICAgIH1cblxuXHQgICAgX3N0YXJ0QXV0b0NsZWFudXAoKSB7XG5cdCAgICAgIHZhciBiYXNlO1xuXHQgICAgICBjbGVhckludGVydmFsKHRoaXMuaW50ZXJ2YWwpO1xuXHQgICAgICByZXR1cm4gdHlwZW9mIChiYXNlID0gKHRoaXMuaW50ZXJ2YWwgPSBzZXRJbnRlcnZhbChhc3luYygpID0+IHtcblx0ICAgICAgICB2YXIgZSwgaywgcmVmLCByZXN1bHRzLCB0aW1lLCB2O1xuXHQgICAgICAgIHRpbWUgPSBEYXRlLm5vdygpO1xuXHQgICAgICAgIHJlZiA9IHRoaXMuaW5zdGFuY2VzO1xuXHQgICAgICAgIHJlc3VsdHMgPSBbXTtcblx0ICAgICAgICBmb3IgKGsgaW4gcmVmKSB7XG5cdCAgICAgICAgICB2ID0gcmVmW2tdO1xuXHQgICAgICAgICAgdHJ5IHtcblx0ICAgICAgICAgICAgaWYgKChhd2FpdCB2Ll9zdG9yZS5fX2dyb3VwQ2hlY2tfXyh0aW1lKSkpIHtcblx0ICAgICAgICAgICAgICByZXN1bHRzLnB1c2godGhpcy5kZWxldGVLZXkoaykpO1xuXHQgICAgICAgICAgICB9IGVsc2Uge1xuXHQgICAgICAgICAgICAgIHJlc3VsdHMucHVzaCh2b2lkIDApO1xuXHQgICAgICAgICAgICB9XG5cdCAgICAgICAgICB9IGNhdGNoIChlcnJvcikge1xuXHQgICAgICAgICAgICBlID0gZXJyb3I7XG5cdCAgICAgICAgICAgIHJlc3VsdHMucHVzaCh2LkV2ZW50cy50cmlnZ2VyKFwiZXJyb3JcIiwgZSkpO1xuXHQgICAgICAgICAgfVxuXHQgICAgICAgIH1cblx0ICAgICAgICByZXR1cm4gcmVzdWx0cztcblx0ICAgICAgfSwgdGhpcy50aW1lb3V0IC8gMikpKS51bnJlZiA9PT0gXCJmdW5jdGlvblwiID8gYmFzZS51bnJlZigpIDogdm9pZCAwO1xuXHQgICAgfVxuXG5cdCAgICB1cGRhdGVTZXR0aW5ncyhvcHRpb25zID0ge30pIHtcblx0ICAgICAgcGFyc2VyJDMub3ZlcndyaXRlKG9wdGlvbnMsIHRoaXMuZGVmYXVsdHMsIHRoaXMpO1xuXHQgICAgICBwYXJzZXIkMy5vdmVyd3JpdGUob3B0aW9ucywgb3B0aW9ucywgdGhpcy5saW1pdGVyT3B0aW9ucyk7XG5cdCAgICAgIGlmIChvcHRpb25zLnRpbWVvdXQgIT0gbnVsbCkge1xuXHQgICAgICAgIHJldHVybiB0aGlzLl9zdGFydEF1dG9DbGVhbnVwKCk7XG5cdCAgICAgIH1cblx0ICAgIH1cblxuXHQgICAgZGlzY29ubmVjdChmbHVzaCA9IHRydWUpIHtcblx0ICAgICAgdmFyIHJlZjtcblx0ICAgICAgaWYgKCF0aGlzLnNoYXJlZENvbm5lY3Rpb24pIHtcblx0ICAgICAgICByZXR1cm4gKHJlZiA9IHRoaXMuY29ubmVjdGlvbikgIT0gbnVsbCA/IHJlZi5kaXNjb25uZWN0KGZsdXNoKSA6IHZvaWQgMDtcblx0ICAgICAgfVxuXHQgICAgfVxuXG5cdCAgfVxuXHQgIEdyb3VwLnByb3RvdHlwZS5kZWZhdWx0cyA9IHtcblx0ICAgIHRpbWVvdXQ6IDEwMDAgKiA2MCAqIDUsXG5cdCAgICBjb25uZWN0aW9uOiBudWxsLFxuXHQgICAgUHJvbWlzZTogUHJvbWlzZSxcblx0ICAgIGlkOiBcImdyb3VwLWtleVwiXG5cdCAgfTtcblxuXHQgIHJldHVybiBHcm91cDtcblxuXHR9KS5jYWxsKGNvbW1vbmpzR2xvYmFsKTtcblxuXHR2YXIgR3JvdXBfMSA9IEdyb3VwO1xuXG5cdHZhciBCYXRjaGVyLCBFdmVudHMkMywgcGFyc2VyJDQ7XG5cblx0cGFyc2VyJDQgPSBwYXJzZXI7XG5cblx0RXZlbnRzJDMgPSBFdmVudHNfMTtcblxuXHRCYXRjaGVyID0gKGZ1bmN0aW9uKCkge1xuXHQgIGNsYXNzIEJhdGNoZXIge1xuXHQgICAgY29uc3RydWN0b3Iob3B0aW9ucyA9IHt9KSB7XG5cdCAgICAgIHRoaXMub3B0aW9ucyA9IG9wdGlvbnM7XG5cdCAgICAgIHBhcnNlciQ0LmxvYWQodGhpcy5vcHRpb25zLCB0aGlzLmRlZmF1bHRzLCB0aGlzKTtcblx0ICAgICAgdGhpcy5FdmVudHMgPSBuZXcgRXZlbnRzJDModGhpcyk7XG5cdCAgICAgIHRoaXMuX2FyciA9IFtdO1xuXHQgICAgICB0aGlzLl9yZXNldFByb21pc2UoKTtcblx0ICAgICAgdGhpcy5fbGFzdEZsdXNoID0gRGF0ZS5ub3coKTtcblx0ICAgIH1cblxuXHQgICAgX3Jlc2V0UHJvbWlzZSgpIHtcblx0ICAgICAgcmV0dXJuIHRoaXMuX3Byb21pc2UgPSBuZXcgdGhpcy5Qcm9taXNlKChyZXMsIHJlaikgPT4ge1xuXHQgICAgICAgIHJldHVybiB0aGlzLl9yZXNvbHZlID0gcmVzO1xuXHQgICAgICB9KTtcblx0ICAgIH1cblxuXHQgICAgX2ZsdXNoKCkge1xuXHQgICAgICBjbGVhclRpbWVvdXQodGhpcy5fdGltZW91dCk7XG5cdCAgICAgIHRoaXMuX2xhc3RGbHVzaCA9IERhdGUubm93KCk7XG5cdCAgICAgIHRoaXMuX3Jlc29sdmUoKTtcblx0ICAgICAgdGhpcy5FdmVudHMudHJpZ2dlcihcImJhdGNoXCIsIHRoaXMuX2Fycik7XG5cdCAgICAgIHRoaXMuX2FyciA9IFtdO1xuXHQgICAgICByZXR1cm4gdGhpcy5fcmVzZXRQcm9taXNlKCk7XG5cdCAgICB9XG5cblx0ICAgIGFkZChkYXRhKSB7XG5cdCAgICAgIHZhciByZXQ7XG5cdCAgICAgIHRoaXMuX2Fyci5wdXNoKGRhdGEpO1xuXHQgICAgICByZXQgPSB0aGlzLl9wcm9taXNlO1xuXHQgICAgICBpZiAodGhpcy5fYXJyLmxlbmd0aCA9PT0gdGhpcy5tYXhTaXplKSB7XG5cdCAgICAgICAgdGhpcy5fZmx1c2goKTtcblx0ICAgICAgfSBlbHNlIGlmICgodGhpcy5tYXhUaW1lICE9IG51bGwpICYmIHRoaXMuX2Fyci5sZW5ndGggPT09IDEpIHtcblx0ICAgICAgICB0aGlzLl90aW1lb3V0ID0gc2V0VGltZW91dCgoKSA9PiB7XG5cdCAgICAgICAgICByZXR1cm4gdGhpcy5fZmx1c2goKTtcblx0ICAgICAgICB9LCB0aGlzLm1heFRpbWUpO1xuXHQgICAgICB9XG5cdCAgICAgIHJldHVybiByZXQ7XG5cdCAgICB9XG5cblx0ICB9XG5cdCAgQmF0Y2hlci5wcm90b3R5cGUuZGVmYXVsdHMgPSB7XG5cdCAgICBtYXhUaW1lOiBudWxsLFxuXHQgICAgbWF4U2l6ZTogbnVsbCxcblx0ICAgIFByb21pc2U6IFByb21pc2Vcblx0ICB9O1xuXG5cdCAgcmV0dXJuIEJhdGNoZXI7XG5cblx0fSkuY2FsbChjb21tb25qc0dsb2JhbCk7XG5cblx0dmFyIEJhdGNoZXJfMSA9IEJhdGNoZXI7XG5cblx0dmFyIHJlcXVpcmUkJDQkMSA9ICgpID0+IGNvbnNvbGUubG9nKCdZb3UgbXVzdCBpbXBvcnQgdGhlIGZ1bGwgdmVyc2lvbiBvZiBCb3R0bGVuZWNrIGluIG9yZGVyIHRvIHVzZSB0aGlzIGZlYXR1cmUuJyk7XG5cblx0dmFyIHJlcXVpcmUkJDggPSBnZXRDanNFeHBvcnRGcm9tTmFtZXNwYWNlKHZlcnNpb24kMik7XG5cblx0dmFyIEJvdHRsZW5lY2ssIERFRkFVTFRfUFJJT1JJVFkkMSwgRXZlbnRzJDQsIEpvYiQxLCBMb2NhbERhdGFzdG9yZSQxLCBOVU1fUFJJT1JJVElFUyQxLCBRdWV1ZXMkMSwgUmVkaXNEYXRhc3RvcmUkMSwgU3RhdGVzJDEsIFN5bmMkMSwgcGFyc2VyJDUsXG5cdCAgc3BsaWNlID0gW10uc3BsaWNlO1xuXG5cdE5VTV9QUklPUklUSUVTJDEgPSAxMDtcblxuXHRERUZBVUxUX1BSSU9SSVRZJDEgPSA1O1xuXG5cdHBhcnNlciQ1ID0gcGFyc2VyO1xuXG5cdFF1ZXVlcyQxID0gUXVldWVzXzE7XG5cblx0Sm9iJDEgPSBKb2JfMTtcblxuXHRMb2NhbERhdGFzdG9yZSQxID0gTG9jYWxEYXRhc3RvcmVfMTtcblxuXHRSZWRpc0RhdGFzdG9yZSQxID0gcmVxdWlyZSQkNCQxO1xuXG5cdEV2ZW50cyQ0ID0gRXZlbnRzXzE7XG5cblx0U3RhdGVzJDEgPSBTdGF0ZXNfMTtcblxuXHRTeW5jJDEgPSBTeW5jXzE7XG5cblx0Qm90dGxlbmVjayA9IChmdW5jdGlvbigpIHtcblx0ICBjbGFzcyBCb3R0bGVuZWNrIHtcblx0ICAgIGNvbnN0cnVjdG9yKG9wdGlvbnMgPSB7fSwgLi4uaW52YWxpZCkge1xuXHQgICAgICB2YXIgc3RvcmVJbnN0YW5jZU9wdGlvbnMsIHN0b3JlT3B0aW9ucztcblx0ICAgICAgdGhpcy5fYWRkVG9RdWV1ZSA9IHRoaXMuX2FkZFRvUXVldWUuYmluZCh0aGlzKTtcblx0ICAgICAgdGhpcy5fdmFsaWRhdGVPcHRpb25zKG9wdGlvbnMsIGludmFsaWQpO1xuXHQgICAgICBwYXJzZXIkNS5sb2FkKG9wdGlvbnMsIHRoaXMuaW5zdGFuY2VEZWZhdWx0cywgdGhpcyk7XG5cdCAgICAgIHRoaXMuX3F1ZXVlcyA9IG5ldyBRdWV1ZXMkMShOVU1fUFJJT1JJVElFUyQxKTtcblx0ICAgICAgdGhpcy5fc2NoZWR1bGVkID0ge307XG5cdCAgICAgIHRoaXMuX3N0YXRlcyA9IG5ldyBTdGF0ZXMkMShbXCJSRUNFSVZFRFwiLCBcIlFVRVVFRFwiLCBcIlJVTk5JTkdcIiwgXCJFWEVDVVRJTkdcIl0uY29uY2F0KHRoaXMudHJhY2tEb25lU3RhdHVzID8gW1wiRE9ORVwiXSA6IFtdKSk7XG5cdCAgICAgIHRoaXMuX2xpbWl0ZXIgPSBudWxsO1xuXHQgICAgICB0aGlzLkV2ZW50cyA9IG5ldyBFdmVudHMkNCh0aGlzKTtcblx0ICAgICAgdGhpcy5fc3VibWl0TG9jayA9IG5ldyBTeW5jJDEoXCJzdWJtaXRcIiwgdGhpcy5Qcm9taXNlKTtcblx0ICAgICAgdGhpcy5fcmVnaXN0ZXJMb2NrID0gbmV3IFN5bmMkMShcInJlZ2lzdGVyXCIsIHRoaXMuUHJvbWlzZSk7XG5cdCAgICAgIHN0b3JlT3B0aW9ucyA9IHBhcnNlciQ1LmxvYWQob3B0aW9ucywgdGhpcy5zdG9yZURlZmF1bHRzLCB7fSk7XG5cdCAgICAgIHRoaXMuX3N0b3JlID0gKGZ1bmN0aW9uKCkge1xuXHQgICAgICAgIGlmICh0aGlzLmRhdGFzdG9yZSA9PT0gXCJyZWRpc1wiIHx8IHRoaXMuZGF0YXN0b3JlID09PSBcImlvcmVkaXNcIiB8fCAodGhpcy5jb25uZWN0aW9uICE9IG51bGwpKSB7XG5cdCAgICAgICAgICBzdG9yZUluc3RhbmNlT3B0aW9ucyA9IHBhcnNlciQ1LmxvYWQob3B0aW9ucywgdGhpcy5yZWRpc1N0b3JlRGVmYXVsdHMsIHt9KTtcblx0ICAgICAgICAgIHJldHVybiBuZXcgUmVkaXNEYXRhc3RvcmUkMSh0aGlzLCBzdG9yZU9wdGlvbnMsIHN0b3JlSW5zdGFuY2VPcHRpb25zKTtcblx0ICAgICAgICB9IGVsc2UgaWYgKHRoaXMuZGF0YXN0b3JlID09PSBcImxvY2FsXCIpIHtcblx0ICAgICAgICAgIHN0b3JlSW5zdGFuY2VPcHRpb25zID0gcGFyc2VyJDUubG9hZChvcHRpb25zLCB0aGlzLmxvY2FsU3RvcmVEZWZhdWx0cywge30pO1xuXHQgICAgICAgICAgcmV0dXJuIG5ldyBMb2NhbERhdGFzdG9yZSQxKHRoaXMsIHN0b3JlT3B0aW9ucywgc3RvcmVJbnN0YW5jZU9wdGlvbnMpO1xuXHQgICAgICAgIH0gZWxzZSB7XG5cdCAgICAgICAgICB0aHJvdyBuZXcgQm90dGxlbmVjay5wcm90b3R5cGUuQm90dGxlbmVja0Vycm9yKGBJbnZhbGlkIGRhdGFzdG9yZSB0eXBlOiAke3RoaXMuZGF0YXN0b3JlfWApO1xuXHQgICAgICAgIH1cblx0ICAgICAgfSkuY2FsbCh0aGlzKTtcblx0ICAgICAgdGhpcy5fcXVldWVzLm9uKFwibGVmdHplcm9cIiwgKCkgPT4ge1xuXHQgICAgICAgIHZhciByZWY7XG5cdCAgICAgICAgcmV0dXJuIChyZWYgPSB0aGlzLl9zdG9yZS5oZWFydGJlYXQpICE9IG51bGwgPyB0eXBlb2YgcmVmLnJlZiA9PT0gXCJmdW5jdGlvblwiID8gcmVmLnJlZigpIDogdm9pZCAwIDogdm9pZCAwO1xuXHQgICAgICB9KTtcblx0ICAgICAgdGhpcy5fcXVldWVzLm9uKFwiemVyb1wiLCAoKSA9PiB7XG5cdCAgICAgICAgdmFyIHJlZjtcblx0ICAgICAgICByZXR1cm4gKHJlZiA9IHRoaXMuX3N0b3JlLmhlYXJ0YmVhdCkgIT0gbnVsbCA/IHR5cGVvZiByZWYudW5yZWYgPT09IFwiZnVuY3Rpb25cIiA/IHJlZi51bnJlZigpIDogdm9pZCAwIDogdm9pZCAwO1xuXHQgICAgICB9KTtcblx0ICAgIH1cblxuXHQgICAgX3ZhbGlkYXRlT3B0aW9ucyhvcHRpb25zLCBpbnZhbGlkKSB7XG5cdCAgICAgIGlmICghKChvcHRpb25zICE9IG51bGwpICYmIHR5cGVvZiBvcHRpb25zID09PSBcIm9iamVjdFwiICYmIGludmFsaWQubGVuZ3RoID09PSAwKSkge1xuXHQgICAgICAgIHRocm93IG5ldyBCb3R0bGVuZWNrLnByb3RvdHlwZS5Cb3R0bGVuZWNrRXJyb3IoXCJCb3R0bGVuZWNrIHYyIHRha2VzIGEgc2luZ2xlIG9iamVjdCBhcmd1bWVudC4gUmVmZXIgdG8gaHR0cHM6Ly9naXRodWIuY29tL1NHcm9uZGluL2JvdHRsZW5lY2sjdXBncmFkaW5nLXRvLXYyIGlmIHlvdSdyZSB1cGdyYWRpbmcgZnJvbSBCb3R0bGVuZWNrIHYxLlwiKTtcblx0ICAgICAgfVxuXHQgICAgfVxuXG5cdCAgICByZWFkeSgpIHtcblx0ICAgICAgcmV0dXJuIHRoaXMuX3N0b3JlLnJlYWR5O1xuXHQgICAgfVxuXG5cdCAgICBjbGllbnRzKCkge1xuXHQgICAgICByZXR1cm4gdGhpcy5fc3RvcmUuY2xpZW50cztcblx0ICAgIH1cblxuXHQgICAgY2hhbm5lbCgpIHtcblx0ICAgICAgcmV0dXJuIGBiXyR7dGhpcy5pZH1gO1xuXHQgICAgfVxuXG5cdCAgICBjaGFubmVsX2NsaWVudCgpIHtcblx0ICAgICAgcmV0dXJuIGBiXyR7dGhpcy5pZH1fJHt0aGlzLl9zdG9yZS5jbGllbnRJZH1gO1xuXHQgICAgfVxuXG5cdCAgICBwdWJsaXNoKG1lc3NhZ2UpIHtcblx0ICAgICAgcmV0dXJuIHRoaXMuX3N0b3JlLl9fcHVibGlzaF9fKG1lc3NhZ2UpO1xuXHQgICAgfVxuXG5cdCAgICBkaXNjb25uZWN0KGZsdXNoID0gdHJ1ZSkge1xuXHQgICAgICByZXR1cm4gdGhpcy5fc3RvcmUuX19kaXNjb25uZWN0X18oZmx1c2gpO1xuXHQgICAgfVxuXG5cdCAgICBjaGFpbihfbGltaXRlcikge1xuXHQgICAgICB0aGlzLl9saW1pdGVyID0gX2xpbWl0ZXI7XG5cdCAgICAgIHJldHVybiB0aGlzO1xuXHQgICAgfVxuXG5cdCAgICBxdWV1ZWQocHJpb3JpdHkpIHtcblx0ICAgICAgcmV0dXJuIHRoaXMuX3F1ZXVlcy5xdWV1ZWQocHJpb3JpdHkpO1xuXHQgICAgfVxuXG5cdCAgICBjbHVzdGVyUXVldWVkKCkge1xuXHQgICAgICByZXR1cm4gdGhpcy5fc3RvcmUuX19xdWV1ZWRfXygpO1xuXHQgICAgfVxuXG5cdCAgICBlbXB0eSgpIHtcblx0ICAgICAgcmV0dXJuIHRoaXMucXVldWVkKCkgPT09IDAgJiYgdGhpcy5fc3VibWl0TG9jay5pc0VtcHR5KCk7XG5cdCAgICB9XG5cblx0ICAgIHJ1bm5pbmcoKSB7XG5cdCAgICAgIHJldHVybiB0aGlzLl9zdG9yZS5fX3J1bm5pbmdfXygpO1xuXHQgICAgfVxuXG5cdCAgICBkb25lKCkge1xuXHQgICAgICByZXR1cm4gdGhpcy5fc3RvcmUuX19kb25lX18oKTtcblx0ICAgIH1cblxuXHQgICAgam9iU3RhdHVzKGlkKSB7XG5cdCAgICAgIHJldHVybiB0aGlzLl9zdGF0ZXMuam9iU3RhdHVzKGlkKTtcblx0ICAgIH1cblxuXHQgICAgam9icyhzdGF0dXMpIHtcblx0ICAgICAgcmV0dXJuIHRoaXMuX3N0YXRlcy5zdGF0dXNKb2JzKHN0YXR1cyk7XG5cdCAgICB9XG5cblx0ICAgIGNvdW50cygpIHtcblx0ICAgICAgcmV0dXJuIHRoaXMuX3N0YXRlcy5zdGF0dXNDb3VudHMoKTtcblx0ICAgIH1cblxuXHQgICAgX3JhbmRvbUluZGV4KCkge1xuXHQgICAgICByZXR1cm4gTWF0aC5yYW5kb20oKS50b1N0cmluZygzNikuc2xpY2UoMik7XG5cdCAgICB9XG5cblx0ICAgIGNoZWNrKHdlaWdodCA9IDEpIHtcblx0ICAgICAgcmV0dXJuIHRoaXMuX3N0b3JlLl9fY2hlY2tfXyh3ZWlnaHQpO1xuXHQgICAgfVxuXG5cdCAgICBfY2xlYXJHbG9iYWxTdGF0ZShpbmRleCkge1xuXHQgICAgICBpZiAodGhpcy5fc2NoZWR1bGVkW2luZGV4XSAhPSBudWxsKSB7XG5cdCAgICAgICAgY2xlYXJUaW1lb3V0KHRoaXMuX3NjaGVkdWxlZFtpbmRleF0uZXhwaXJhdGlvbik7XG5cdCAgICAgICAgZGVsZXRlIHRoaXMuX3NjaGVkdWxlZFtpbmRleF07XG5cdCAgICAgICAgcmV0dXJuIHRydWU7XG5cdCAgICAgIH0gZWxzZSB7XG5cdCAgICAgICAgcmV0dXJuIGZhbHNlO1xuXHQgICAgICB9XG5cdCAgICB9XG5cblx0ICAgIGFzeW5jIF9mcmVlKGluZGV4LCBqb2IsIG9wdGlvbnMsIGV2ZW50SW5mbykge1xuXHQgICAgICB2YXIgZSwgcnVubmluZztcblx0ICAgICAgdHJ5IHtcblx0ICAgICAgICAoe3J1bm5pbmd9ID0gKGF3YWl0IHRoaXMuX3N0b3JlLl9fZnJlZV9fKGluZGV4LCBvcHRpb25zLndlaWdodCkpKTtcblx0ICAgICAgICB0aGlzLkV2ZW50cy50cmlnZ2VyKFwiZGVidWdcIiwgYEZyZWVkICR7b3B0aW9ucy5pZH1gLCBldmVudEluZm8pO1xuXHQgICAgICAgIGlmIChydW5uaW5nID09PSAwICYmIHRoaXMuZW1wdHkoKSkge1xuXHQgICAgICAgICAgcmV0dXJuIHRoaXMuRXZlbnRzLnRyaWdnZXIoXCJpZGxlXCIpO1xuXHQgICAgICAgIH1cblx0ICAgICAgfSBjYXRjaCAoZXJyb3IxKSB7XG5cdCAgICAgICAgZSA9IGVycm9yMTtcblx0ICAgICAgICByZXR1cm4gdGhpcy5FdmVudHMudHJpZ2dlcihcImVycm9yXCIsIGUpO1xuXHQgICAgICB9XG5cdCAgICB9XG5cblx0ICAgIF9ydW4oaW5kZXgsIGpvYiwgd2FpdCkge1xuXHQgICAgICB2YXIgY2xlYXJHbG9iYWxTdGF0ZSwgZnJlZSwgcnVuO1xuXHQgICAgICBqb2IuZG9SdW4oKTtcblx0ICAgICAgY2xlYXJHbG9iYWxTdGF0ZSA9IHRoaXMuX2NsZWFyR2xvYmFsU3RhdGUuYmluZCh0aGlzLCBpbmRleCk7XG5cdCAgICAgIHJ1biA9IHRoaXMuX3J1bi5iaW5kKHRoaXMsIGluZGV4LCBqb2IpO1xuXHQgICAgICBmcmVlID0gdGhpcy5fZnJlZS5iaW5kKHRoaXMsIGluZGV4LCBqb2IpO1xuXHQgICAgICByZXR1cm4gdGhpcy5fc2NoZWR1bGVkW2luZGV4XSA9IHtcblx0ICAgICAgICB0aW1lb3V0OiBzZXRUaW1lb3V0KCgpID0+IHtcblx0ICAgICAgICAgIHJldHVybiBqb2IuZG9FeGVjdXRlKHRoaXMuX2xpbWl0ZXIsIGNsZWFyR2xvYmFsU3RhdGUsIHJ1biwgZnJlZSk7XG5cdCAgICAgICAgfSwgd2FpdCksXG5cdCAgICAgICAgZXhwaXJhdGlvbjogam9iLm9wdGlvbnMuZXhwaXJhdGlvbiAhPSBudWxsID8gc2V0VGltZW91dChmdW5jdGlvbigpIHtcblx0ICAgICAgICAgIHJldHVybiBqb2IuZG9FeHBpcmUoY2xlYXJHbG9iYWxTdGF0ZSwgcnVuLCBmcmVlKTtcblx0ICAgICAgICB9LCB3YWl0ICsgam9iLm9wdGlvbnMuZXhwaXJhdGlvbikgOiB2b2lkIDAsXG5cdCAgICAgICAgam9iOiBqb2Jcblx0ICAgICAgfTtcblx0ICAgIH1cblxuXHQgICAgX2RyYWluT25lKGNhcGFjaXR5KSB7XG5cdCAgICAgIHJldHVybiB0aGlzLl9yZWdpc3RlckxvY2suc2NoZWR1bGUoKCkgPT4ge1xuXHQgICAgICAgIHZhciBhcmdzLCBpbmRleCwgbmV4dCwgb3B0aW9ucywgcXVldWU7XG5cdCAgICAgICAgaWYgKHRoaXMucXVldWVkKCkgPT09IDApIHtcblx0ICAgICAgICAgIHJldHVybiB0aGlzLlByb21pc2UucmVzb2x2ZShudWxsKTtcblx0ICAgICAgICB9XG5cdCAgICAgICAgcXVldWUgPSB0aGlzLl9xdWV1ZXMuZ2V0Rmlyc3QoKTtcblx0ICAgICAgICAoe29wdGlvbnMsIGFyZ3N9ID0gbmV4dCA9IHF1ZXVlLmZpcnN0KCkpO1xuXHQgICAgICAgIGlmICgoY2FwYWNpdHkgIT0gbnVsbCkgJiYgb3B0aW9ucy53ZWlnaHQgPiBjYXBhY2l0eSkge1xuXHQgICAgICAgICAgcmV0dXJuIHRoaXMuUHJvbWlzZS5yZXNvbHZlKG51bGwpO1xuXHQgICAgICAgIH1cblx0ICAgICAgICB0aGlzLkV2ZW50cy50cmlnZ2VyKFwiZGVidWdcIiwgYERyYWluaW5nICR7b3B0aW9ucy5pZH1gLCB7YXJncywgb3B0aW9uc30pO1xuXHQgICAgICAgIGluZGV4ID0gdGhpcy5fcmFuZG9tSW5kZXgoKTtcblx0ICAgICAgICByZXR1cm4gdGhpcy5fc3RvcmUuX19yZWdpc3Rlcl9fKGluZGV4LCBvcHRpb25zLndlaWdodCwgb3B0aW9ucy5leHBpcmF0aW9uKS50aGVuKCh7c3VjY2Vzcywgd2FpdCwgcmVzZXJ2b2lyfSkgPT4ge1xuXHQgICAgICAgICAgdmFyIGVtcHR5O1xuXHQgICAgICAgICAgdGhpcy5FdmVudHMudHJpZ2dlcihcImRlYnVnXCIsIGBEcmFpbmVkICR7b3B0aW9ucy5pZH1gLCB7c3VjY2VzcywgYXJncywgb3B0aW9uc30pO1xuXHQgICAgICAgICAgaWYgKHN1Y2Nlc3MpIHtcblx0ICAgICAgICAgICAgcXVldWUuc2hpZnQoKTtcblx0ICAgICAgICAgICAgZW1wdHkgPSB0aGlzLmVtcHR5KCk7XG5cdCAgICAgICAgICAgIGlmIChlbXB0eSkge1xuXHQgICAgICAgICAgICAgIHRoaXMuRXZlbnRzLnRyaWdnZXIoXCJlbXB0eVwiKTtcblx0ICAgICAgICAgICAgfVxuXHQgICAgICAgICAgICBpZiAocmVzZXJ2b2lyID09PSAwKSB7XG5cdCAgICAgICAgICAgICAgdGhpcy5FdmVudHMudHJpZ2dlcihcImRlcGxldGVkXCIsIGVtcHR5KTtcblx0ICAgICAgICAgICAgfVxuXHQgICAgICAgICAgICB0aGlzLl9ydW4oaW5kZXgsIG5leHQsIHdhaXQpO1xuXHQgICAgICAgICAgICByZXR1cm4gdGhpcy5Qcm9taXNlLnJlc29sdmUob3B0aW9ucy53ZWlnaHQpO1xuXHQgICAgICAgICAgfSBlbHNlIHtcblx0ICAgICAgICAgICAgcmV0dXJuIHRoaXMuUHJvbWlzZS5yZXNvbHZlKG51bGwpO1xuXHQgICAgICAgICAgfVxuXHQgICAgICAgIH0pO1xuXHQgICAgICB9KTtcblx0ICAgIH1cblxuXHQgICAgX2RyYWluQWxsKGNhcGFjaXR5LCB0b3RhbCA9IDApIHtcblx0ICAgICAgcmV0dXJuIHRoaXMuX2RyYWluT25lKGNhcGFjaXR5KS50aGVuKChkcmFpbmVkKSA9PiB7XG5cdCAgICAgICAgdmFyIG5ld0NhcGFjaXR5O1xuXHQgICAgICAgIGlmIChkcmFpbmVkICE9IG51bGwpIHtcblx0ICAgICAgICAgIG5ld0NhcGFjaXR5ID0gY2FwYWNpdHkgIT0gbnVsbCA/IGNhcGFjaXR5IC0gZHJhaW5lZCA6IGNhcGFjaXR5O1xuXHQgICAgICAgICAgcmV0dXJuIHRoaXMuX2RyYWluQWxsKG5ld0NhcGFjaXR5LCB0b3RhbCArIGRyYWluZWQpO1xuXHQgICAgICAgIH0gZWxzZSB7XG5cdCAgICAgICAgICByZXR1cm4gdGhpcy5Qcm9taXNlLnJlc29sdmUodG90YWwpO1xuXHQgICAgICAgIH1cblx0ICAgICAgfSkuY2F0Y2goKGUpID0+IHtcblx0ICAgICAgICByZXR1cm4gdGhpcy5FdmVudHMudHJpZ2dlcihcImVycm9yXCIsIGUpO1xuXHQgICAgICB9KTtcblx0ICAgIH1cblxuXHQgICAgX2Ryb3BBbGxRdWV1ZWQobWVzc2FnZSkge1xuXHQgICAgICByZXR1cm4gdGhpcy5fcXVldWVzLnNoaWZ0QWxsKGZ1bmN0aW9uKGpvYikge1xuXHQgICAgICAgIHJldHVybiBqb2IuZG9Ecm9wKHttZXNzYWdlfSk7XG5cdCAgICAgIH0pO1xuXHQgICAgfVxuXG5cdCAgICBzdG9wKG9wdGlvbnMgPSB7fSkge1xuXHQgICAgICB2YXIgZG9uZSwgd2FpdEZvckV4ZWN1dGluZztcblx0ICAgICAgb3B0aW9ucyA9IHBhcnNlciQ1LmxvYWQob3B0aW9ucywgdGhpcy5zdG9wRGVmYXVsdHMpO1xuXHQgICAgICB3YWl0Rm9yRXhlY3V0aW5nID0gKGF0KSA9PiB7XG5cdCAgICAgICAgdmFyIGZpbmlzaGVkO1xuXHQgICAgICAgIGZpbmlzaGVkID0gKCkgPT4ge1xuXHQgICAgICAgICAgdmFyIGNvdW50cztcblx0ICAgICAgICAgIGNvdW50cyA9IHRoaXMuX3N0YXRlcy5jb3VudHM7XG5cdCAgICAgICAgICByZXR1cm4gKGNvdW50c1swXSArIGNvdW50c1sxXSArIGNvdW50c1syXSArIGNvdW50c1szXSkgPT09IGF0O1xuXHQgICAgICAgIH07XG5cdCAgICAgICAgcmV0dXJuIG5ldyB0aGlzLlByb21pc2UoKHJlc29sdmUsIHJlamVjdCkgPT4ge1xuXHQgICAgICAgICAgaWYgKGZpbmlzaGVkKCkpIHtcblx0ICAgICAgICAgICAgcmV0dXJuIHJlc29sdmUoKTtcblx0ICAgICAgICAgIH0gZWxzZSB7XG5cdCAgICAgICAgICAgIHJldHVybiB0aGlzLm9uKFwiZG9uZVwiLCAoKSA9PiB7XG5cdCAgICAgICAgICAgICAgaWYgKGZpbmlzaGVkKCkpIHtcblx0ICAgICAgICAgICAgICAgIHRoaXMucmVtb3ZlQWxsTGlzdGVuZXJzKFwiZG9uZVwiKTtcblx0ICAgICAgICAgICAgICAgIHJldHVybiByZXNvbHZlKCk7XG5cdCAgICAgICAgICAgICAgfVxuXHQgICAgICAgICAgICB9KTtcblx0ICAgICAgICAgIH1cblx0ICAgICAgICB9KTtcblx0ICAgICAgfTtcblx0ICAgICAgZG9uZSA9IG9wdGlvbnMuZHJvcFdhaXRpbmdKb2JzID8gKHRoaXMuX3J1biA9IGZ1bmN0aW9uKGluZGV4LCBuZXh0KSB7XG5cdCAgICAgICAgcmV0dXJuIG5leHQuZG9Ecm9wKHtcblx0ICAgICAgICAgIG1lc3NhZ2U6IG9wdGlvbnMuZHJvcEVycm9yTWVzc2FnZVxuXHQgICAgICAgIH0pO1xuXHQgICAgICB9LCB0aGlzLl9kcmFpbk9uZSA9ICgpID0+IHtcblx0ICAgICAgICByZXR1cm4gdGhpcy5Qcm9taXNlLnJlc29sdmUobnVsbCk7XG5cdCAgICAgIH0sIHRoaXMuX3JlZ2lzdGVyTG9jay5zY2hlZHVsZSgoKSA9PiB7XG5cdCAgICAgICAgcmV0dXJuIHRoaXMuX3N1Ym1pdExvY2suc2NoZWR1bGUoKCkgPT4ge1xuXHQgICAgICAgICAgdmFyIGssIHJlZiwgdjtcblx0ICAgICAgICAgIHJlZiA9IHRoaXMuX3NjaGVkdWxlZDtcblx0ICAgICAgICAgIGZvciAoayBpbiByZWYpIHtcblx0ICAgICAgICAgICAgdiA9IHJlZltrXTtcblx0ICAgICAgICAgICAgaWYgKHRoaXMuam9iU3RhdHVzKHYuam9iLm9wdGlvbnMuaWQpID09PSBcIlJVTk5JTkdcIikge1xuXHQgICAgICAgICAgICAgIGNsZWFyVGltZW91dCh2LnRpbWVvdXQpO1xuXHQgICAgICAgICAgICAgIGNsZWFyVGltZW91dCh2LmV4cGlyYXRpb24pO1xuXHQgICAgICAgICAgICAgIHYuam9iLmRvRHJvcCh7XG5cdCAgICAgICAgICAgICAgICBtZXNzYWdlOiBvcHRpb25zLmRyb3BFcnJvck1lc3NhZ2Vcblx0ICAgICAgICAgICAgICB9KTtcblx0ICAgICAgICAgICAgfVxuXHQgICAgICAgICAgfVxuXHQgICAgICAgICAgdGhpcy5fZHJvcEFsbFF1ZXVlZChvcHRpb25zLmRyb3BFcnJvck1lc3NhZ2UpO1xuXHQgICAgICAgICAgcmV0dXJuIHdhaXRGb3JFeGVjdXRpbmcoMCk7XG5cdCAgICAgICAgfSk7XG5cdCAgICAgIH0pKSA6IHRoaXMuc2NoZWR1bGUoe1xuXHQgICAgICAgIHByaW9yaXR5OiBOVU1fUFJJT1JJVElFUyQxIC0gMSxcblx0ICAgICAgICB3ZWlnaHQ6IDBcblx0ICAgICAgfSwgKCkgPT4ge1xuXHQgICAgICAgIHJldHVybiB3YWl0Rm9yRXhlY3V0aW5nKDEpO1xuXHQgICAgICB9KTtcblx0ICAgICAgdGhpcy5fcmVjZWl2ZSA9IGZ1bmN0aW9uKGpvYikge1xuXHQgICAgICAgIHJldHVybiBqb2IuX3JlamVjdChuZXcgQm90dGxlbmVjay5wcm90b3R5cGUuQm90dGxlbmVja0Vycm9yKG9wdGlvbnMuZW5xdWV1ZUVycm9yTWVzc2FnZSkpO1xuXHQgICAgICB9O1xuXHQgICAgICB0aGlzLnN0b3AgPSAoKSA9PiB7XG5cdCAgICAgICAgcmV0dXJuIHRoaXMuUHJvbWlzZS5yZWplY3QobmV3IEJvdHRsZW5lY2sucHJvdG90eXBlLkJvdHRsZW5lY2tFcnJvcihcInN0b3AoKSBoYXMgYWxyZWFkeSBiZWVuIGNhbGxlZFwiKSk7XG5cdCAgICAgIH07XG5cdCAgICAgIHJldHVybiBkb25lO1xuXHQgICAgfVxuXG5cdCAgICBhc3luYyBfYWRkVG9RdWV1ZShqb2IpIHtcblx0ICAgICAgdmFyIGFyZ3MsIGJsb2NrZWQsIGVycm9yLCBvcHRpb25zLCByZWFjaGVkSFdNLCBzaGlmdGVkLCBzdHJhdGVneTtcblx0ICAgICAgKHthcmdzLCBvcHRpb25zfSA9IGpvYik7XG5cdCAgICAgIHRyeSB7XG5cdCAgICAgICAgKHtyZWFjaGVkSFdNLCBibG9ja2VkLCBzdHJhdGVneX0gPSAoYXdhaXQgdGhpcy5fc3RvcmUuX19zdWJtaXRfXyh0aGlzLnF1ZXVlZCgpLCBvcHRpb25zLndlaWdodCkpKTtcblx0ICAgICAgfSBjYXRjaCAoZXJyb3IxKSB7XG5cdCAgICAgICAgZXJyb3IgPSBlcnJvcjE7XG5cdCAgICAgICAgdGhpcy5FdmVudHMudHJpZ2dlcihcImRlYnVnXCIsIGBDb3VsZCBub3QgcXVldWUgJHtvcHRpb25zLmlkfWAsIHthcmdzLCBvcHRpb25zLCBlcnJvcn0pO1xuXHQgICAgICAgIGpvYi5kb0Ryb3Aoe2Vycm9yfSk7XG5cdCAgICAgICAgcmV0dXJuIGZhbHNlO1xuXHQgICAgICB9XG5cdCAgICAgIGlmIChibG9ja2VkKSB7XG5cdCAgICAgICAgam9iLmRvRHJvcCgpO1xuXHQgICAgICAgIHJldHVybiB0cnVlO1xuXHQgICAgICB9IGVsc2UgaWYgKHJlYWNoZWRIV00pIHtcblx0ICAgICAgICBzaGlmdGVkID0gc3RyYXRlZ3kgPT09IEJvdHRsZW5lY2sucHJvdG90eXBlLnN0cmF0ZWd5LkxFQUsgPyB0aGlzLl9xdWV1ZXMuc2hpZnRMYXN0RnJvbShvcHRpb25zLnByaW9yaXR5KSA6IHN0cmF0ZWd5ID09PSBCb3R0bGVuZWNrLnByb3RvdHlwZS5zdHJhdGVneS5PVkVSRkxPV19QUklPUklUWSA/IHRoaXMuX3F1ZXVlcy5zaGlmdExhc3RGcm9tKG9wdGlvbnMucHJpb3JpdHkgKyAxKSA6IHN0cmF0ZWd5ID09PSBCb3R0bGVuZWNrLnByb3RvdHlwZS5zdHJhdGVneS5PVkVSRkxPVyA/IGpvYiA6IHZvaWQgMDtcblx0ICAgICAgICBpZiAoc2hpZnRlZCAhPSBudWxsKSB7XG5cdCAgICAgICAgICBzaGlmdGVkLmRvRHJvcCgpO1xuXHQgICAgICAgIH1cblx0ICAgICAgICBpZiAoKHNoaWZ0ZWQgPT0gbnVsbCkgfHwgc3RyYXRlZ3kgPT09IEJvdHRsZW5lY2sucHJvdG90eXBlLnN0cmF0ZWd5Lk9WRVJGTE9XKSB7XG5cdCAgICAgICAgICBpZiAoc2hpZnRlZCA9PSBudWxsKSB7XG5cdCAgICAgICAgICAgIGpvYi5kb0Ryb3AoKTtcblx0ICAgICAgICAgIH1cblx0ICAgICAgICAgIHJldHVybiByZWFjaGVkSFdNO1xuXHQgICAgICAgIH1cblx0ICAgICAgfVxuXHQgICAgICBqb2IuZG9RdWV1ZShyZWFjaGVkSFdNLCBibG9ja2VkKTtcblx0ICAgICAgdGhpcy5fcXVldWVzLnB1c2goam9iKTtcblx0ICAgICAgYXdhaXQgdGhpcy5fZHJhaW5BbGwoKTtcblx0ICAgICAgcmV0dXJuIHJlYWNoZWRIV007XG5cdCAgICB9XG5cblx0ICAgIF9yZWNlaXZlKGpvYikge1xuXHQgICAgICBpZiAodGhpcy5fc3RhdGVzLmpvYlN0YXR1cyhqb2Iub3B0aW9ucy5pZCkgIT0gbnVsbCkge1xuXHQgICAgICAgIGpvYi5fcmVqZWN0KG5ldyBCb3R0bGVuZWNrLnByb3RvdHlwZS5Cb3R0bGVuZWNrRXJyb3IoYEEgam9iIHdpdGggdGhlIHNhbWUgaWQgYWxyZWFkeSBleGlzdHMgKGlkPSR7am9iLm9wdGlvbnMuaWR9KWApKTtcblx0ICAgICAgICByZXR1cm4gZmFsc2U7XG5cdCAgICAgIH0gZWxzZSB7XG5cdCAgICAgICAgam9iLmRvUmVjZWl2ZSgpO1xuXHQgICAgICAgIHJldHVybiB0aGlzLl9zdWJtaXRMb2NrLnNjaGVkdWxlKHRoaXMuX2FkZFRvUXVldWUsIGpvYik7XG5cdCAgICAgIH1cblx0ICAgIH1cblxuXHQgICAgc3VibWl0KC4uLmFyZ3MpIHtcblx0ICAgICAgdmFyIGNiLCBmbiwgam9iLCBvcHRpb25zLCByZWYsIHJlZjEsIHRhc2s7XG5cdCAgICAgIGlmICh0eXBlb2YgYXJnc1swXSA9PT0gXCJmdW5jdGlvblwiKSB7XG5cdCAgICAgICAgcmVmID0gYXJncywgW2ZuLCAuLi5hcmdzXSA9IHJlZiwgW2NiXSA9IHNwbGljZS5jYWxsKGFyZ3MsIC0xKTtcblx0ICAgICAgICBvcHRpb25zID0gcGFyc2VyJDUubG9hZCh7fSwgdGhpcy5qb2JEZWZhdWx0cyk7XG5cdCAgICAgIH0gZWxzZSB7XG5cdCAgICAgICAgcmVmMSA9IGFyZ3MsIFtvcHRpb25zLCBmbiwgLi4uYXJnc10gPSByZWYxLCBbY2JdID0gc3BsaWNlLmNhbGwoYXJncywgLTEpO1xuXHQgICAgICAgIG9wdGlvbnMgPSBwYXJzZXIkNS5sb2FkKG9wdGlvbnMsIHRoaXMuam9iRGVmYXVsdHMpO1xuXHQgICAgICB9XG5cdCAgICAgIHRhc2sgPSAoLi4uYXJncykgPT4ge1xuXHQgICAgICAgIHJldHVybiBuZXcgdGhpcy5Qcm9taXNlKGZ1bmN0aW9uKHJlc29sdmUsIHJlamVjdCkge1xuXHQgICAgICAgICAgcmV0dXJuIGZuKC4uLmFyZ3MsIGZ1bmN0aW9uKC4uLmFyZ3MpIHtcblx0ICAgICAgICAgICAgcmV0dXJuIChhcmdzWzBdICE9IG51bGwgPyByZWplY3QgOiByZXNvbHZlKShhcmdzKTtcblx0ICAgICAgICAgIH0pO1xuXHQgICAgICAgIH0pO1xuXHQgICAgICB9O1xuXHQgICAgICBqb2IgPSBuZXcgSm9iJDEodGFzaywgYXJncywgb3B0aW9ucywgdGhpcy5qb2JEZWZhdWx0cywgdGhpcy5yZWplY3RPbkRyb3AsIHRoaXMuRXZlbnRzLCB0aGlzLl9zdGF0ZXMsIHRoaXMuUHJvbWlzZSk7XG5cdCAgICAgIGpvYi5wcm9taXNlLnRoZW4oZnVuY3Rpb24oYXJncykge1xuXHQgICAgICAgIHJldHVybiB0eXBlb2YgY2IgPT09IFwiZnVuY3Rpb25cIiA/IGNiKC4uLmFyZ3MpIDogdm9pZCAwO1xuXHQgICAgICB9KS5jYXRjaChmdW5jdGlvbihhcmdzKSB7XG5cdCAgICAgICAgaWYgKEFycmF5LmlzQXJyYXkoYXJncykpIHtcblx0ICAgICAgICAgIHJldHVybiB0eXBlb2YgY2IgPT09IFwiZnVuY3Rpb25cIiA/IGNiKC4uLmFyZ3MpIDogdm9pZCAwO1xuXHQgICAgICAgIH0gZWxzZSB7XG5cdCAgICAgICAgICByZXR1cm4gdHlwZW9mIGNiID09PSBcImZ1bmN0aW9uXCIgPyBjYihhcmdzKSA6IHZvaWQgMDtcblx0ICAgICAgICB9XG5cdCAgICAgIH0pO1xuXHQgICAgICByZXR1cm4gdGhpcy5fcmVjZWl2ZShqb2IpO1xuXHQgICAgfVxuXG5cdCAgICBzY2hlZHVsZSguLi5hcmdzKSB7XG5cdCAgICAgIHZhciBqb2IsIG9wdGlvbnMsIHRhc2s7XG5cdCAgICAgIGlmICh0eXBlb2YgYXJnc1swXSA9PT0gXCJmdW5jdGlvblwiKSB7XG5cdCAgICAgICAgW3Rhc2ssIC4uLmFyZ3NdID0gYXJncztcblx0ICAgICAgICBvcHRpb25zID0ge307XG5cdCAgICAgIH0gZWxzZSB7XG5cdCAgICAgICAgW29wdGlvbnMsIHRhc2ssIC4uLmFyZ3NdID0gYXJncztcblx0ICAgICAgfVxuXHQgICAgICBqb2IgPSBuZXcgSm9iJDEodGFzaywgYXJncywgb3B0aW9ucywgdGhpcy5qb2JEZWZhdWx0cywgdGhpcy5yZWplY3RPbkRyb3AsIHRoaXMuRXZlbnRzLCB0aGlzLl9zdGF0ZXMsIHRoaXMuUHJvbWlzZSk7XG5cdCAgICAgIHRoaXMuX3JlY2VpdmUoam9iKTtcblx0ICAgICAgcmV0dXJuIGpvYi5wcm9taXNlO1xuXHQgICAgfVxuXG5cdCAgICB3cmFwKGZuKSB7XG5cdCAgICAgIHZhciBzY2hlZHVsZSwgd3JhcHBlZDtcblx0ICAgICAgc2NoZWR1bGUgPSB0aGlzLnNjaGVkdWxlLmJpbmQodGhpcyk7XG5cdCAgICAgIHdyYXBwZWQgPSBmdW5jdGlvbiguLi5hcmdzKSB7XG5cdCAgICAgICAgcmV0dXJuIHNjaGVkdWxlKGZuLmJpbmQodGhpcyksIC4uLmFyZ3MpO1xuXHQgICAgICB9O1xuXHQgICAgICB3cmFwcGVkLndpdGhPcHRpb25zID0gZnVuY3Rpb24ob3B0aW9ucywgLi4uYXJncykge1xuXHQgICAgICAgIHJldHVybiBzY2hlZHVsZShvcHRpb25zLCBmbiwgLi4uYXJncyk7XG5cdCAgICAgIH07XG5cdCAgICAgIHJldHVybiB3cmFwcGVkO1xuXHQgICAgfVxuXG5cdCAgICBhc3luYyB1cGRhdGVTZXR0aW5ncyhvcHRpb25zID0ge30pIHtcblx0ICAgICAgYXdhaXQgdGhpcy5fc3RvcmUuX191cGRhdGVTZXR0aW5nc19fKHBhcnNlciQ1Lm92ZXJ3cml0ZShvcHRpb25zLCB0aGlzLnN0b3JlRGVmYXVsdHMpKTtcblx0ICAgICAgcGFyc2VyJDUub3ZlcndyaXRlKG9wdGlvbnMsIHRoaXMuaW5zdGFuY2VEZWZhdWx0cywgdGhpcyk7XG5cdCAgICAgIHJldHVybiB0aGlzO1xuXHQgICAgfVxuXG5cdCAgICBjdXJyZW50UmVzZXJ2b2lyKCkge1xuXHQgICAgICByZXR1cm4gdGhpcy5fc3RvcmUuX19jdXJyZW50UmVzZXJ2b2lyX18oKTtcblx0ICAgIH1cblxuXHQgICAgaW5jcmVtZW50UmVzZXJ2b2lyKGluY3IgPSAwKSB7XG5cdCAgICAgIHJldHVybiB0aGlzLl9zdG9yZS5fX2luY3JlbWVudFJlc2Vydm9pcl9fKGluY3IpO1xuXHQgICAgfVxuXG5cdCAgfVxuXHQgIEJvdHRsZW5lY2suZGVmYXVsdCA9IEJvdHRsZW5lY2s7XG5cblx0ICBCb3R0bGVuZWNrLkV2ZW50cyA9IEV2ZW50cyQ0O1xuXG5cdCAgQm90dGxlbmVjay52ZXJzaW9uID0gQm90dGxlbmVjay5wcm90b3R5cGUudmVyc2lvbiA9IHJlcXVpcmUkJDgudmVyc2lvbjtcblxuXHQgIEJvdHRsZW5lY2suc3RyYXRlZ3kgPSBCb3R0bGVuZWNrLnByb3RvdHlwZS5zdHJhdGVneSA9IHtcblx0ICAgIExFQUs6IDEsXG5cdCAgICBPVkVSRkxPVzogMixcblx0ICAgIE9WRVJGTE9XX1BSSU9SSVRZOiA0LFxuXHQgICAgQkxPQ0s6IDNcblx0ICB9O1xuXG5cdCAgQm90dGxlbmVjay5Cb3R0bGVuZWNrRXJyb3IgPSBCb3R0bGVuZWNrLnByb3RvdHlwZS5Cb3R0bGVuZWNrRXJyb3IgPSBCb3R0bGVuZWNrRXJyb3JfMTtcblxuXHQgIEJvdHRsZW5lY2suR3JvdXAgPSBCb3R0bGVuZWNrLnByb3RvdHlwZS5Hcm91cCA9IEdyb3VwXzE7XG5cblx0ICBCb3R0bGVuZWNrLlJlZGlzQ29ubmVjdGlvbiA9IEJvdHRsZW5lY2sucHJvdG90eXBlLlJlZGlzQ29ubmVjdGlvbiA9IHJlcXVpcmUkJDI7XG5cblx0ICBCb3R0bGVuZWNrLklPUmVkaXNDb25uZWN0aW9uID0gQm90dGxlbmVjay5wcm90b3R5cGUuSU9SZWRpc0Nvbm5lY3Rpb24gPSByZXF1aXJlJCQzO1xuXG5cdCAgQm90dGxlbmVjay5CYXRjaGVyID0gQm90dGxlbmVjay5wcm90b3R5cGUuQmF0Y2hlciA9IEJhdGNoZXJfMTtcblxuXHQgIEJvdHRsZW5lY2sucHJvdG90eXBlLmpvYkRlZmF1bHRzID0ge1xuXHQgICAgcHJpb3JpdHk6IERFRkFVTFRfUFJJT1JJVFkkMSxcblx0ICAgIHdlaWdodDogMSxcblx0ICAgIGV4cGlyYXRpb246IG51bGwsXG5cdCAgICBpZDogXCI8bm8taWQ+XCJcblx0ICB9O1xuXG5cdCAgQm90dGxlbmVjay5wcm90b3R5cGUuc3RvcmVEZWZhdWx0cyA9IHtcblx0ICAgIG1heENvbmN1cnJlbnQ6IG51bGwsXG5cdCAgICBtaW5UaW1lOiAwLFxuXHQgICAgaGlnaFdhdGVyOiBudWxsLFxuXHQgICAgc3RyYXRlZ3k6IEJvdHRsZW5lY2sucHJvdG90eXBlLnN0cmF0ZWd5LkxFQUssXG5cdCAgICBwZW5hbHR5OiBudWxsLFxuXHQgICAgcmVzZXJ2b2lyOiBudWxsLFxuXHQgICAgcmVzZXJ2b2lyUmVmcmVzaEludGVydmFsOiBudWxsLFxuXHQgICAgcmVzZXJ2b2lyUmVmcmVzaEFtb3VudDogbnVsbCxcblx0ICAgIHJlc2Vydm9pckluY3JlYXNlSW50ZXJ2YWw6IG51bGwsXG5cdCAgICByZXNlcnZvaXJJbmNyZWFzZUFtb3VudDogbnVsbCxcblx0ICAgIHJlc2Vydm9pckluY3JlYXNlTWF4aW11bTogbnVsbFxuXHQgIH07XG5cblx0ICBCb3R0bGVuZWNrLnByb3RvdHlwZS5sb2NhbFN0b3JlRGVmYXVsdHMgPSB7XG5cdCAgICBQcm9taXNlOiBQcm9taXNlLFxuXHQgICAgdGltZW91dDogbnVsbCxcblx0ICAgIGhlYXJ0YmVhdEludGVydmFsOiAyNTBcblx0ICB9O1xuXG5cdCAgQm90dGxlbmVjay5wcm90b3R5cGUucmVkaXNTdG9yZURlZmF1bHRzID0ge1xuXHQgICAgUHJvbWlzZTogUHJvbWlzZSxcblx0ICAgIHRpbWVvdXQ6IG51bGwsXG5cdCAgICBoZWFydGJlYXRJbnRlcnZhbDogNTAwMCxcblx0ICAgIGNsaWVudFRpbWVvdXQ6IDEwMDAwLFxuXHQgICAgUmVkaXM6IG51bGwsXG5cdCAgICBjbGllbnRPcHRpb25zOiB7fSxcblx0ICAgIGNsdXN0ZXJOb2RlczogbnVsbCxcblx0ICAgIGNsZWFyRGF0YXN0b3JlOiBmYWxzZSxcblx0ICAgIGNvbm5lY3Rpb246IG51bGxcblx0ICB9O1xuXG5cdCAgQm90dGxlbmVjay5wcm90b3R5cGUuaW5zdGFuY2VEZWZhdWx0cyA9IHtcblx0ICAgIGRhdGFzdG9yZTogXCJsb2NhbFwiLFxuXHQgICAgY29ubmVjdGlvbjogbnVsbCxcblx0ICAgIGlkOiBcIjxuby1pZD5cIixcblx0ICAgIHJlamVjdE9uRHJvcDogdHJ1ZSxcblx0ICAgIHRyYWNrRG9uZVN0YXR1czogZmFsc2UsXG5cdCAgICBQcm9taXNlOiBQcm9taXNlXG5cdCAgfTtcblxuXHQgIEJvdHRsZW5lY2sucHJvdG90eXBlLnN0b3BEZWZhdWx0cyA9IHtcblx0ICAgIGVucXVldWVFcnJvck1lc3NhZ2U6IFwiVGhpcyBsaW1pdGVyIGhhcyBiZWVuIHN0b3BwZWQgYW5kIGNhbm5vdCBhY2NlcHQgbmV3IGpvYnMuXCIsXG5cdCAgICBkcm9wV2FpdGluZ0pvYnM6IHRydWUsXG5cdCAgICBkcm9wRXJyb3JNZXNzYWdlOiBcIlRoaXMgbGltaXRlciBoYXMgYmVlbiBzdG9wcGVkLlwiXG5cdCAgfTtcblxuXHQgIHJldHVybiBCb3R0bGVuZWNrO1xuXG5cdH0pLmNhbGwoY29tbW9uanNHbG9iYWwpO1xuXG5cdHZhciBCb3R0bGVuZWNrXzEgPSBCb3R0bGVuZWNrO1xuXG5cdHZhciBsaWIgPSBCb3R0bGVuZWNrXzE7XG5cblx0cmV0dXJuIGxpYjtcblxufSkpKTtcbiIsCiAgICAiJ3VzZSBzdHJpY3QnO1xuXG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgJ19fZXNNb2R1bGUnLCB7IHZhbHVlOiB0cnVlIH0pO1xuXG5mdW5jdGlvbiBfaW50ZXJvcERlZmF1bHQgKGV4KSB7IHJldHVybiAoZXggJiYgKHR5cGVvZiBleCA9PT0gJ29iamVjdCcpICYmICdkZWZhdWx0JyBpbiBleCkgPyBleFsnZGVmYXVsdCddIDogZXg7IH1cblxudmFyIEJvdHRsZW5lY2sgPSBfaW50ZXJvcERlZmF1bHQocmVxdWlyZSgnYm90dGxlbmVjay9saWdodCcpKTtcblxuLy8gQHRzLWlnbm9yZVxuYXN5bmMgZnVuY3Rpb24gZXJyb3JSZXF1ZXN0KG9jdG9raXQsIHN0YXRlLCBlcnJvciwgb3B0aW9ucykge1xuICBpZiAoIWVycm9yLnJlcXVlc3QgfHwgIWVycm9yLnJlcXVlc3QucmVxdWVzdCkge1xuICAgIC8vIGFkZHJlc3MgaHR0cHM6Ly9naXRodWIuY29tL29jdG9raXQvcGx1Z2luLXJldHJ5LmpzL2lzc3Vlcy84XG4gICAgdGhyb3cgZXJyb3I7XG4gIH0gLy8gcmV0cnkgYWxsID49IDQwMCAmJiBub3QgZG9Ob3RSZXRyeVxuXG5cbiAgaWYgKGVycm9yLnN0YXR1cyA+PSA0MDAgJiYgIXN0YXRlLmRvTm90UmV0cnkuaW5jbHVkZXMoZXJyb3Iuc3RhdHVzKSkge1xuICAgIGNvbnN0IHJldHJpZXMgPSBvcHRpb25zLnJlcXVlc3QucmV0cmllcyAhPSBudWxsID8gb3B0aW9ucy5yZXF1ZXN0LnJldHJpZXMgOiBzdGF0ZS5yZXRyaWVzO1xuICAgIGNvbnN0IHJldHJ5QWZ0ZXIgPSBNYXRoLnBvdygob3B0aW9ucy5yZXF1ZXN0LnJldHJ5Q291bnQgfHwgMCkgKyAxLCAyKTtcbiAgICB0aHJvdyBvY3Rva2l0LnJldHJ5LnJldHJ5UmVxdWVzdChlcnJvciwgcmV0cmllcywgcmV0cnlBZnRlcik7XG4gIH0gLy8gTWF5YmUgZXZlbnR1YWxseSB0aGVyZSB3aWxsIGJlIG1vcmUgY2FzZXMgaGVyZVxuXG5cbiAgdGhyb3cgZXJyb3I7XG59XG5cbi8vIEB0cy1pZ25vcmVcblxuYXN5bmMgZnVuY3Rpb24gd3JhcFJlcXVlc3Qoc3RhdGUsIHJlcXVlc3QsIG9wdGlvbnMpIHtcbiAgY29uc3QgbGltaXRlciA9IG5ldyBCb3R0bGVuZWNrKCk7IC8vIEB0cy1pZ25vcmVcblxuICBsaW1pdGVyLm9uKFwiZmFpbGVkXCIsIGZ1bmN0aW9uIChlcnJvciwgaW5mbykge1xuICAgIGNvbnN0IG1heFJldHJpZXMgPSB+fmVycm9yLnJlcXVlc3QucmVxdWVzdC5yZXRyaWVzO1xuICAgIGNvbnN0IGFmdGVyID0gfn5lcnJvci5yZXF1ZXN0LnJlcXVlc3QucmV0cnlBZnRlcjtcbiAgICBvcHRpb25zLnJlcXVlc3QucmV0cnlDb3VudCA9IGluZm8ucmV0cnlDb3VudCArIDE7XG5cbiAgICBpZiAobWF4UmV0cmllcyA+IGluZm8ucmV0cnlDb3VudCkge1xuICAgICAgLy8gUmV0dXJuaW5nIGEgbnVtYmVyIGluc3RydWN0cyB0aGUgbGltaXRlciB0byByZXRyeVxuICAgICAgLy8gdGhlIHJlcXVlc3QgYWZ0ZXIgdGhhdCBudW1iZXIgb2YgbWlsbGlzZWNvbmRzIGhhdmUgcGFzc2VkXG4gICAgICByZXR1cm4gYWZ0ZXIgKiBzdGF0ZS5yZXRyeUFmdGVyQmFzZVZhbHVlO1xuICAgIH1cbiAgfSk7XG4gIHJldHVybiBsaW1pdGVyLnNjaGVkdWxlKHJlcXVlc3QsIG9wdGlvbnMpO1xufVxuXG5jb25zdCBWRVJTSU9OID0gXCIzLjAuOVwiO1xuZnVuY3Rpb24gcmV0cnkob2N0b2tpdCwgb2N0b2tpdE9wdGlvbnMpIHtcbiAgY29uc3Qgc3RhdGUgPSBPYmplY3QuYXNzaWduKHtcbiAgICBlbmFibGVkOiB0cnVlLFxuICAgIHJldHJ5QWZ0ZXJCYXNlVmFsdWU6IDEwMDAsXG4gICAgZG9Ob3RSZXRyeTogWzQwMCwgNDAxLCA0MDMsIDQwNCwgNDIyXSxcbiAgICByZXRyaWVzOiAzXG4gIH0sIG9jdG9raXRPcHRpb25zLnJldHJ5KTtcblxuICBpZiAoc3RhdGUuZW5hYmxlZCkge1xuICAgIG9jdG9raXQuaG9vay5lcnJvcihcInJlcXVlc3RcIiwgZXJyb3JSZXF1ZXN0LmJpbmQobnVsbCwgb2N0b2tpdCwgc3RhdGUpKTtcbiAgICBvY3Rva2l0Lmhvb2sud3JhcChcInJlcXVlc3RcIiwgd3JhcFJlcXVlc3QuYmluZChudWxsLCBzdGF0ZSkpO1xuICB9XG5cbiAgcmV0dXJuIHtcbiAgICByZXRyeToge1xuICAgICAgcmV0cnlSZXF1ZXN0OiAoZXJyb3IsIHJldHJpZXMsIHJldHJ5QWZ0ZXIpID0+IHtcbiAgICAgICAgZXJyb3IucmVxdWVzdC5yZXF1ZXN0ID0gT2JqZWN0LmFzc2lnbih7fSwgZXJyb3IucmVxdWVzdC5yZXF1ZXN0LCB7XG4gICAgICAgICAgcmV0cmllczogcmV0cmllcyxcbiAgICAgICAgICByZXRyeUFmdGVyOiByZXRyeUFmdGVyXG4gICAgICAgIH0pO1xuICAgICAgICByZXR1cm4gZXJyb3I7XG4gICAgICB9XG4gICAgfVxuICB9O1xufVxucmV0cnkuVkVSU0lPTiA9IFZFUlNJT047XG5cbmV4cG9ydHMuVkVSU0lPTiA9IFZFUlNJT047XG5leHBvcnRzLnJldHJ5ID0gcmV0cnk7XG4vLyMgc291cmNlTWFwcGluZ1VSTD1pbmRleC5qcy5tYXBcbiIsCiAgICAiXCJ1c2Ugc3RyaWN0XCI7XG52YXIgX19jcmVhdGVCaW5kaW5nID0gKHRoaXMgJiYgdGhpcy5fX2NyZWF0ZUJpbmRpbmcpIHx8IChPYmplY3QuY3JlYXRlID8gKGZ1bmN0aW9uKG8sIG0sIGssIGsyKSB7XG4gICAgaWYgKGsyID09PSB1bmRlZmluZWQpIGsyID0gaztcbiAgICB2YXIgZGVzYyA9IE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IobSwgayk7XG4gICAgaWYgKCFkZXNjIHx8IChcImdldFwiIGluIGRlc2MgPyAhbS5fX2VzTW9kdWxlIDogZGVzYy53cml0YWJsZSB8fCBkZXNjLmNvbmZpZ3VyYWJsZSkpIHtcbiAgICAgIGRlc2MgPSB7IGVudW1lcmFibGU6IHRydWUsIGdldDogZnVuY3Rpb24oKSB7IHJldHVybiBtW2tdOyB9IH07XG4gICAgfVxuICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShvLCBrMiwgZGVzYyk7XG59KSA6IChmdW5jdGlvbihvLCBtLCBrLCBrMikge1xuICAgIGlmIChrMiA9PT0gdW5kZWZpbmVkKSBrMiA9IGs7XG4gICAgb1trMl0gPSBtW2tdO1xufSkpO1xudmFyIF9fc2V0TW9kdWxlRGVmYXVsdCA9ICh0aGlzICYmIHRoaXMuX19zZXRNb2R1bGVEZWZhdWx0KSB8fCAoT2JqZWN0LmNyZWF0ZSA/IChmdW5jdGlvbihvLCB2KSB7XG4gICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KG8sIFwiZGVmYXVsdFwiLCB7IGVudW1lcmFibGU6IHRydWUsIHZhbHVlOiB2IH0pO1xufSkgOiBmdW5jdGlvbihvLCB2KSB7XG4gICAgb1tcImRlZmF1bHRcIl0gPSB2O1xufSk7XG52YXIgX19pbXBvcnRTdGFyID0gKHRoaXMgJiYgdGhpcy5fX2ltcG9ydFN0YXIpIHx8IGZ1bmN0aW9uIChtb2QpIHtcbiAgICBpZiAobW9kICYmIG1vZC5fX2VzTW9kdWxlKSByZXR1cm4gbW9kO1xuICAgIHZhciByZXN1bHQgPSB7fTtcbiAgICBpZiAobW9kICE9IG51bGwpIGZvciAodmFyIGsgaW4gbW9kKSBpZiAoayAhPT0gXCJkZWZhdWx0XCIgJiYgT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKG1vZCwgaykpIF9fY3JlYXRlQmluZGluZyhyZXN1bHQsIG1vZCwgayk7XG4gICAgX19zZXRNb2R1bGVEZWZhdWx0KHJlc3VsdCwgbW9kKTtcbiAgICByZXR1cm4gcmVzdWx0O1xufTtcbnZhciBfX2F3YWl0ZXIgPSAodGhpcyAmJiB0aGlzLl9fYXdhaXRlcikgfHwgZnVuY3Rpb24gKHRoaXNBcmcsIF9hcmd1bWVudHMsIFAsIGdlbmVyYXRvcikge1xuICAgIGZ1bmN0aW9uIGFkb3B0KHZhbHVlKSB7IHJldHVybiB2YWx1ZSBpbnN0YW5jZW9mIFAgPyB2YWx1ZSA6IG5ldyBQKGZ1bmN0aW9uIChyZXNvbHZlKSB7IHJlc29sdmUodmFsdWUpOyB9KTsgfVxuICAgIHJldHVybiBuZXcgKFAgfHwgKFAgPSBQcm9taXNlKSkoZnVuY3Rpb24gKHJlc29sdmUsIHJlamVjdCkge1xuICAgICAgICBmdW5jdGlvbiBmdWxmaWxsZWQodmFsdWUpIHsgdHJ5IHsgc3RlcChnZW5lcmF0b3IubmV4dCh2YWx1ZSkpOyB9IGNhdGNoIChlKSB7IHJlamVjdChlKTsgfSB9XG4gICAgICAgIGZ1bmN0aW9uIHJlamVjdGVkKHZhbHVlKSB7IHRyeSB7IHN0ZXAoZ2VuZXJhdG9yW1widGhyb3dcIl0odmFsdWUpKTsgfSBjYXRjaCAoZSkgeyByZWplY3QoZSk7IH0gfVxuICAgICAgICBmdW5jdGlvbiBzdGVwKHJlc3VsdCkgeyByZXN1bHQuZG9uZSA/IHJlc29sdmUocmVzdWx0LnZhbHVlKSA6IGFkb3B0KHJlc3VsdC52YWx1ZSkudGhlbihmdWxmaWxsZWQsIHJlamVjdGVkKTsgfVxuICAgICAgICBzdGVwKChnZW5lcmF0b3IgPSBnZW5lcmF0b3IuYXBwbHkodGhpc0FyZywgX2FyZ3VtZW50cyB8fCBbXSkpLm5leHQoKSk7XG4gICAgfSk7XG59O1xuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiX19lc01vZHVsZVwiLCB7IHZhbHVlOiB0cnVlIH0pO1xuZXhwb3J0cy5nZXRBcnRpZmFjdEludGVybmFsID0gZXhwb3J0cy5nZXRBcnRpZmFjdFB1YmxpYyA9IHZvaWQgMDtcbmNvbnN0IGdpdGh1Yl8xID0gcmVxdWlyZShcIkBhY3Rpb25zL2dpdGh1YlwiKTtcbmNvbnN0IHBsdWdpbl9yZXRyeV8xID0gcmVxdWlyZShcIkBvY3Rva2l0L3BsdWdpbi1yZXRyeVwiKTtcbmNvbnN0IGNvcmUgPSBfX2ltcG9ydFN0YXIocmVxdWlyZShcIkBhY3Rpb25zL2NvcmVcIikpO1xuY29uc3QgdXRpbHNfMSA9IHJlcXVpcmUoXCJAYWN0aW9ucy9naXRodWIvbGliL3V0aWxzXCIpO1xuY29uc3QgcmV0cnlfb3B0aW9uc18xID0gcmVxdWlyZShcIi4vcmV0cnktb3B0aW9uc1wiKTtcbmNvbnN0IHBsdWdpbl9yZXF1ZXN0X2xvZ18xID0gcmVxdWlyZShcIkBvY3Rva2l0L3BsdWdpbi1yZXF1ZXN0LWxvZ1wiKTtcbmNvbnN0IHV0aWxfMSA9IHJlcXVpcmUoXCIuLi9zaGFyZWQvdXRpbFwiKTtcbmNvbnN0IHVzZXJfYWdlbnRfMSA9IHJlcXVpcmUoXCIuLi9zaGFyZWQvdXNlci1hZ2VudFwiKTtcbmNvbnN0IGFydGlmYWN0X3R3aXJwX2NsaWVudF8xID0gcmVxdWlyZShcIi4uL3NoYXJlZC9hcnRpZmFjdC10d2lycC1jbGllbnRcIik7XG5jb25zdCBnZW5lcmF0ZWRfMSA9IHJlcXVpcmUoXCIuLi8uLi9nZW5lcmF0ZWRcIik7XG5jb25zdCBlcnJvcnNfMSA9IHJlcXVpcmUoXCIuLi9zaGFyZWQvZXJyb3JzXCIpO1xuZnVuY3Rpb24gZ2V0QXJ0aWZhY3RQdWJsaWMoYXJ0aWZhY3ROYW1lLCB3b3JrZmxvd1J1bklkLCByZXBvc2l0b3J5T3duZXIsIHJlcG9zaXRvcnlOYW1lLCB0b2tlbikge1xuICAgIHZhciBfYTtcbiAgICByZXR1cm4gX19hd2FpdGVyKHRoaXMsIHZvaWQgMCwgdm9pZCAwLCBmdW5jdGlvbiogKCkge1xuICAgICAgICBjb25zdCBbcmV0cnlPcHRzLCByZXF1ZXN0T3B0c10gPSAoMCwgcmV0cnlfb3B0aW9uc18xLmdldFJldHJ5T3B0aW9ucykodXRpbHNfMS5kZWZhdWx0cyk7XG4gICAgICAgIGNvbnN0IG9wdHMgPSB7XG4gICAgICAgICAgICBsb2c6IHVuZGVmaW5lZCxcbiAgICAgICAgICAgIHVzZXJBZ2VudDogKDAsIHVzZXJfYWdlbnRfMS5nZXRVc2VyQWdlbnRTdHJpbmcpKCksXG4gICAgICAgICAgICBwcmV2aWV3czogdW5kZWZpbmVkLFxuICAgICAgICAgICAgcmV0cnk6IHJldHJ5T3B0cyxcbiAgICAgICAgICAgIHJlcXVlc3Q6IHJlcXVlc3RPcHRzXG4gICAgICAgIH07XG4gICAgICAgIGNvbnN0IGdpdGh1YiA9ICgwLCBnaXRodWJfMS5nZXRPY3Rva2l0KSh0b2tlbiwgb3B0cywgcGx1Z2luX3JldHJ5XzEucmV0cnksIHBsdWdpbl9yZXF1ZXN0X2xvZ18xLnJlcXVlc3RMb2cpO1xuICAgICAgICBjb25zdCBnZXRBcnRpZmFjdFJlc3AgPSB5aWVsZCBnaXRodWIucmVxdWVzdCgnR0VUIC9yZXBvcy97b3duZXJ9L3tyZXBvfS9hY3Rpb25zL3J1bnMve3J1bl9pZH0vYXJ0aWZhY3Rzez9uYW1lfScsIHtcbiAgICAgICAgICAgIG93bmVyOiByZXBvc2l0b3J5T3duZXIsXG4gICAgICAgICAgICByZXBvOiByZXBvc2l0b3J5TmFtZSxcbiAgICAgICAgICAgIHJ1bl9pZDogd29ya2Zsb3dSdW5JZCxcbiAgICAgICAgICAgIG5hbWU6IGFydGlmYWN0TmFtZVxuICAgICAgICB9KTtcbiAgICAgICAgaWYgKGdldEFydGlmYWN0UmVzcC5zdGF0dXMgIT09IDIwMCkge1xuICAgICAgICAgICAgdGhyb3cgbmV3IGVycm9yc18xLkludmFsaWRSZXNwb25zZUVycm9yKGBJbnZhbGlkIHJlc3BvbnNlIGZyb20gR2l0SHViIEFQSTogJHtnZXRBcnRpZmFjdFJlc3Auc3RhdHVzfSAoJHsoX2EgPSBnZXRBcnRpZmFjdFJlc3AgPT09IG51bGwgfHwgZ2V0QXJ0aWZhY3RSZXNwID09PSB2b2lkIDAgPyB2b2lkIDAgOiBnZXRBcnRpZmFjdFJlc3AuaGVhZGVycykgPT09IG51bGwgfHwgX2EgPT09IHZvaWQgMCA/IHZvaWQgMCA6IF9hWyd4LWdpdGh1Yi1yZXF1ZXN0LWlkJ119KWApO1xuICAgICAgICB9XG4gICAgICAgIGlmIChnZXRBcnRpZmFjdFJlc3AuZGF0YS5hcnRpZmFjdHMubGVuZ3RoID09PSAwKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgZXJyb3JzXzEuQXJ0aWZhY3ROb3RGb3VuZEVycm9yKGBBcnRpZmFjdCBub3QgZm91bmQgZm9yIG5hbWU6ICR7YXJ0aWZhY3ROYW1lfVxuICAgICAgICBQbGVhc2UgZW5zdXJlIHRoYXQgeW91ciBhcnRpZmFjdCBpcyBub3QgZXhwaXJlZCBhbmQgdGhlIGFydGlmYWN0IHdhcyB1cGxvYWRlZCB1c2luZyBhIGNvbXBhdGlibGUgdmVyc2lvbiBvZiB0b29sa2l0L3VwbG9hZC1hcnRpZmFjdC5cbiAgICAgICAgRm9yIG1vcmUgaW5mb3JtYXRpb24sIHZpc2l0IHRoZSBHaXRIdWIgQXJ0aWZhY3RzIEZBUTogaHR0cHM6Ly9naXRodWIuY29tL2FjdGlvbnMvdG9vbGtpdC9ibG9iL21haW4vcGFja2FnZXMvYXJ0aWZhY3QvZG9jcy9mYXEubWRgKTtcbiAgICAgICAgfVxuICAgICAgICBsZXQgYXJ0aWZhY3QgPSBnZXRBcnRpZmFjdFJlc3AuZGF0YS5hcnRpZmFjdHNbMF07XG4gICAgICAgIGlmIChnZXRBcnRpZmFjdFJlc3AuZGF0YS5hcnRpZmFjdHMubGVuZ3RoID4gMSkge1xuICAgICAgICAgICAgYXJ0aWZhY3QgPSBnZXRBcnRpZmFjdFJlc3AuZGF0YS5hcnRpZmFjdHMuc29ydCgoYSwgYikgPT4gYi5pZCAtIGEuaWQpWzBdO1xuICAgICAgICAgICAgY29yZS5kZWJ1ZyhgTW9yZSB0aGFuIG9uZSBhcnRpZmFjdCBmb3VuZCBmb3IgYSBzaW5nbGUgbmFtZSwgcmV0dXJuaW5nIG5ld2VzdCAoaWQ6ICR7YXJ0aWZhY3QuaWR9KWApO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICBhcnRpZmFjdDoge1xuICAgICAgICAgICAgICAgIG5hbWU6IGFydGlmYWN0Lm5hbWUsXG4gICAgICAgICAgICAgICAgaWQ6IGFydGlmYWN0LmlkLFxuICAgICAgICAgICAgICAgIHNpemU6IGFydGlmYWN0LnNpemVfaW5fYnl0ZXMsXG4gICAgICAgICAgICAgICAgY3JlYXRlZEF0OiBhcnRpZmFjdC5jcmVhdGVkX2F0ID8gbmV3IERhdGUoYXJ0aWZhY3QuY3JlYXRlZF9hdCkgOiB1bmRlZmluZWRcbiAgICAgICAgICAgIH1cbiAgICAgICAgfTtcbiAgICB9KTtcbn1cbmV4cG9ydHMuZ2V0QXJ0aWZhY3RQdWJsaWMgPSBnZXRBcnRpZmFjdFB1YmxpYztcbmZ1bmN0aW9uIGdldEFydGlmYWN0SW50ZXJuYWwoYXJ0aWZhY3ROYW1lKSB7XG4gICAgcmV0dXJuIF9fYXdhaXRlcih0aGlzLCB2b2lkIDAsIHZvaWQgMCwgZnVuY3Rpb24qICgpIHtcbiAgICAgICAgY29uc3QgYXJ0aWZhY3RDbGllbnQgPSAoMCwgYXJ0aWZhY3RfdHdpcnBfY2xpZW50XzEuaW50ZXJuYWxBcnRpZmFjdFR3aXJwQ2xpZW50KSgpO1xuICAgICAgICBjb25zdCB7IHdvcmtmbG93UnVuQmFja2VuZElkLCB3b3JrZmxvd0pvYlJ1bkJhY2tlbmRJZCB9ID0gKDAsIHV0aWxfMS5nZXRCYWNrZW5kSWRzRnJvbVRva2VuKSgpO1xuICAgICAgICBjb25zdCByZXEgPSB7XG4gICAgICAgICAgICB3b3JrZmxvd1J1bkJhY2tlbmRJZCxcbiAgICAgICAgICAgIHdvcmtmbG93Sm9iUnVuQmFja2VuZElkLFxuICAgICAgICAgICAgbmFtZUZpbHRlcjogZ2VuZXJhdGVkXzEuU3RyaW5nVmFsdWUuY3JlYXRlKHsgdmFsdWU6IGFydGlmYWN0TmFtZSB9KVxuICAgICAgICB9O1xuICAgICAgICBjb25zdCByZXMgPSB5aWVsZCBhcnRpZmFjdENsaWVudC5MaXN0QXJ0aWZhY3RzKHJlcSk7XG4gICAgICAgIGlmIChyZXMuYXJ0aWZhY3RzLmxlbmd0aCA9PT0gMCkge1xuICAgICAgICAgICAgdGhyb3cgbmV3IGVycm9yc18xLkFydGlmYWN0Tm90Rm91bmRFcnJvcihgQXJ0aWZhY3Qgbm90IGZvdW5kIGZvciBuYW1lOiAke2FydGlmYWN0TmFtZX1cbiAgICAgICAgUGxlYXNlIGVuc3VyZSB0aGF0IHlvdXIgYXJ0aWZhY3QgaXMgbm90IGV4cGlyZWQgYW5kIHRoZSBhcnRpZmFjdCB3YXMgdXBsb2FkZWQgdXNpbmcgYSBjb21wYXRpYmxlIHZlcnNpb24gb2YgdG9vbGtpdC91cGxvYWQtYXJ0aWZhY3QuXG4gICAgICAgIEZvciBtb3JlIGluZm9ybWF0aW9uLCB2aXNpdCB0aGUgR2l0SHViIEFydGlmYWN0cyBGQVE6IGh0dHBzOi8vZ2l0aHViLmNvbS9hY3Rpb25zL3Rvb2xraXQvYmxvYi9tYWluL3BhY2thZ2VzL2FydGlmYWN0L2RvY3MvZmFxLm1kYCk7XG4gICAgICAgIH1cbiAgICAgICAgbGV0IGFydGlmYWN0ID0gcmVzLmFydGlmYWN0c1swXTtcbiAgICAgICAgaWYgKHJlcy5hcnRpZmFjdHMubGVuZ3RoID4gMSkge1xuICAgICAgICAgICAgYXJ0aWZhY3QgPSByZXMuYXJ0aWZhY3RzLnNvcnQoKGEsIGIpID0+IE51bWJlcihiLmRhdGFiYXNlSWQpIC0gTnVtYmVyKGEuZGF0YWJhc2VJZCkpWzBdO1xuICAgICAgICAgICAgY29yZS5kZWJ1ZyhgTW9yZSB0aGFuIG9uZSBhcnRpZmFjdCBmb3VuZCBmb3IgYSBzaW5nbGUgbmFtZSwgcmV0dXJuaW5nIG5ld2VzdCAoaWQ6ICR7YXJ0aWZhY3QuZGF0YWJhc2VJZH0pYCk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgIGFydGlmYWN0OiB7XG4gICAgICAgICAgICAgICAgbmFtZTogYXJ0aWZhY3QubmFtZSxcbiAgICAgICAgICAgICAgICBpZDogTnVtYmVyKGFydGlmYWN0LmRhdGFiYXNlSWQpLFxuICAgICAgICAgICAgICAgIHNpemU6IE51bWJlcihhcnRpZmFjdC5zaXplKSxcbiAgICAgICAgICAgICAgICBjcmVhdGVkQXQ6IGFydGlmYWN0LmNyZWF0ZWRBdFxuICAgICAgICAgICAgICAgICAgICA/IGdlbmVyYXRlZF8xLlRpbWVzdGFtcC50b0RhdGUoYXJ0aWZhY3QuY3JlYXRlZEF0KVxuICAgICAgICAgICAgICAgICAgICA6IHVuZGVmaW5lZFxuICAgICAgICAgICAgfVxuICAgICAgICB9O1xuICAgIH0pO1xufVxuZXhwb3J0cy5nZXRBcnRpZmFjdEludGVybmFsID0gZ2V0QXJ0aWZhY3RJbnRlcm5hbDtcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPWdldC1hcnRpZmFjdC5qcy5tYXAiLAogICAgIlwidXNlIHN0cmljdFwiO1xudmFyIF9fYXdhaXRlciA9ICh0aGlzICYmIHRoaXMuX19hd2FpdGVyKSB8fCBmdW5jdGlvbiAodGhpc0FyZywgX2FyZ3VtZW50cywgUCwgZ2VuZXJhdG9yKSB7XG4gICAgZnVuY3Rpb24gYWRvcHQodmFsdWUpIHsgcmV0dXJuIHZhbHVlIGluc3RhbmNlb2YgUCA/IHZhbHVlIDogbmV3IFAoZnVuY3Rpb24gKHJlc29sdmUpIHsgcmVzb2x2ZSh2YWx1ZSk7IH0pOyB9XG4gICAgcmV0dXJuIG5ldyAoUCB8fCAoUCA9IFByb21pc2UpKShmdW5jdGlvbiAocmVzb2x2ZSwgcmVqZWN0KSB7XG4gICAgICAgIGZ1bmN0aW9uIGZ1bGZpbGxlZCh2YWx1ZSkgeyB0cnkgeyBzdGVwKGdlbmVyYXRvci5uZXh0KHZhbHVlKSk7IH0gY2F0Y2ggKGUpIHsgcmVqZWN0KGUpOyB9IH1cbiAgICAgICAgZnVuY3Rpb24gcmVqZWN0ZWQodmFsdWUpIHsgdHJ5IHsgc3RlcChnZW5lcmF0b3JbXCJ0aHJvd1wiXSh2YWx1ZSkpOyB9IGNhdGNoIChlKSB7IHJlamVjdChlKTsgfSB9XG4gICAgICAgIGZ1bmN0aW9uIHN0ZXAocmVzdWx0KSB7IHJlc3VsdC5kb25lID8gcmVzb2x2ZShyZXN1bHQudmFsdWUpIDogYWRvcHQocmVzdWx0LnZhbHVlKS50aGVuKGZ1bGZpbGxlZCwgcmVqZWN0ZWQpOyB9XG4gICAgICAgIHN0ZXAoKGdlbmVyYXRvciA9IGdlbmVyYXRvci5hcHBseSh0aGlzQXJnLCBfYXJndW1lbnRzIHx8IFtdKSkubmV4dCgpKTtcbiAgICB9KTtcbn07XG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJfX2VzTW9kdWxlXCIsIHsgdmFsdWU6IHRydWUgfSk7XG5leHBvcnRzLmRlbGV0ZUFydGlmYWN0SW50ZXJuYWwgPSBleHBvcnRzLmRlbGV0ZUFydGlmYWN0UHVibGljID0gdm9pZCAwO1xuY29uc3QgY29yZV8xID0gcmVxdWlyZShcIkBhY3Rpb25zL2NvcmVcIik7XG5jb25zdCBnaXRodWJfMSA9IHJlcXVpcmUoXCJAYWN0aW9ucy9naXRodWJcIik7XG5jb25zdCB1c2VyX2FnZW50XzEgPSByZXF1aXJlKFwiLi4vc2hhcmVkL3VzZXItYWdlbnRcIik7XG5jb25zdCByZXRyeV9vcHRpb25zXzEgPSByZXF1aXJlKFwiLi4vZmluZC9yZXRyeS1vcHRpb25zXCIpO1xuY29uc3QgdXRpbHNfMSA9IHJlcXVpcmUoXCJAYWN0aW9ucy9naXRodWIvbGliL3V0aWxzXCIpO1xuY29uc3QgcGx1Z2luX3JlcXVlc3RfbG9nXzEgPSByZXF1aXJlKFwiQG9jdG9raXQvcGx1Z2luLXJlcXVlc3QtbG9nXCIpO1xuY29uc3QgcGx1Z2luX3JldHJ5XzEgPSByZXF1aXJlKFwiQG9jdG9raXQvcGx1Z2luLXJldHJ5XCIpO1xuY29uc3QgYXJ0aWZhY3RfdHdpcnBfY2xpZW50XzEgPSByZXF1aXJlKFwiLi4vc2hhcmVkL2FydGlmYWN0LXR3aXJwLWNsaWVudFwiKTtcbmNvbnN0IHV0aWxfMSA9IHJlcXVpcmUoXCIuLi9zaGFyZWQvdXRpbFwiKTtcbmNvbnN0IGdlbmVyYXRlZF8xID0gcmVxdWlyZShcIi4uLy4uL2dlbmVyYXRlZFwiKTtcbmNvbnN0IGdldF9hcnRpZmFjdF8xID0gcmVxdWlyZShcIi4uL2ZpbmQvZ2V0LWFydGlmYWN0XCIpO1xuY29uc3QgZXJyb3JzXzEgPSByZXF1aXJlKFwiLi4vc2hhcmVkL2Vycm9yc1wiKTtcbmZ1bmN0aW9uIGRlbGV0ZUFydGlmYWN0UHVibGljKGFydGlmYWN0TmFtZSwgd29ya2Zsb3dSdW5JZCwgcmVwb3NpdG9yeU93bmVyLCByZXBvc2l0b3J5TmFtZSwgdG9rZW4pIHtcbiAgICB2YXIgX2E7XG4gICAgcmV0dXJuIF9fYXdhaXRlcih0aGlzLCB2b2lkIDAsIHZvaWQgMCwgZnVuY3Rpb24qICgpIHtcbiAgICAgICAgY29uc3QgW3JldHJ5T3B0cywgcmVxdWVzdE9wdHNdID0gKDAsIHJldHJ5X29wdGlvbnNfMS5nZXRSZXRyeU9wdGlvbnMpKHV0aWxzXzEuZGVmYXVsdHMpO1xuICAgICAgICBjb25zdCBvcHRzID0ge1xuICAgICAgICAgICAgbG9nOiB1bmRlZmluZWQsXG4gICAgICAgICAgICB1c2VyQWdlbnQ6ICgwLCB1c2VyX2FnZW50XzEuZ2V0VXNlckFnZW50U3RyaW5nKSgpLFxuICAgICAgICAgICAgcHJldmlld3M6IHVuZGVmaW5lZCxcbiAgICAgICAgICAgIHJldHJ5OiByZXRyeU9wdHMsXG4gICAgICAgICAgICByZXF1ZXN0OiByZXF1ZXN0T3B0c1xuICAgICAgICB9O1xuICAgICAgICBjb25zdCBnaXRodWIgPSAoMCwgZ2l0aHViXzEuZ2V0T2N0b2tpdCkodG9rZW4sIG9wdHMsIHBsdWdpbl9yZXRyeV8xLnJldHJ5LCBwbHVnaW5fcmVxdWVzdF9sb2dfMS5yZXF1ZXN0TG9nKTtcbiAgICAgICAgY29uc3QgZ2V0QXJ0aWZhY3RSZXNwID0geWllbGQgKDAsIGdldF9hcnRpZmFjdF8xLmdldEFydGlmYWN0UHVibGljKShhcnRpZmFjdE5hbWUsIHdvcmtmbG93UnVuSWQsIHJlcG9zaXRvcnlPd25lciwgcmVwb3NpdG9yeU5hbWUsIHRva2VuKTtcbiAgICAgICAgY29uc3QgZGVsZXRlQXJ0aWZhY3RSZXNwID0geWllbGQgZ2l0aHViLnJlc3QuYWN0aW9ucy5kZWxldGVBcnRpZmFjdCh7XG4gICAgICAgICAgICBvd25lcjogcmVwb3NpdG9yeU93bmVyLFxuICAgICAgICAgICAgcmVwbzogcmVwb3NpdG9yeU5hbWUsXG4gICAgICAgICAgICBhcnRpZmFjdF9pZDogZ2V0QXJ0aWZhY3RSZXNwLmFydGlmYWN0LmlkXG4gICAgICAgIH0pO1xuICAgICAgICBpZiAoZGVsZXRlQXJ0aWZhY3RSZXNwLnN0YXR1cyAhPT0gMjA0KSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgZXJyb3JzXzEuSW52YWxpZFJlc3BvbnNlRXJyb3IoYEludmFsaWQgcmVzcG9uc2UgZnJvbSBHaXRIdWIgQVBJOiAke2RlbGV0ZUFydGlmYWN0UmVzcC5zdGF0dXN9ICgkeyhfYSA9IGRlbGV0ZUFydGlmYWN0UmVzcCA9PT0gbnVsbCB8fCBkZWxldGVBcnRpZmFjdFJlc3AgPT09IHZvaWQgMCA/IHZvaWQgMCA6IGRlbGV0ZUFydGlmYWN0UmVzcC5oZWFkZXJzKSA9PT0gbnVsbCB8fCBfYSA9PT0gdm9pZCAwID8gdm9pZCAwIDogX2FbJ3gtZ2l0aHViLXJlcXVlc3QtaWQnXX0pYCk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgIGlkOiBnZXRBcnRpZmFjdFJlc3AuYXJ0aWZhY3QuaWRcbiAgICAgICAgfTtcbiAgICB9KTtcbn1cbmV4cG9ydHMuZGVsZXRlQXJ0aWZhY3RQdWJsaWMgPSBkZWxldGVBcnRpZmFjdFB1YmxpYztcbmZ1bmN0aW9uIGRlbGV0ZUFydGlmYWN0SW50ZXJuYWwoYXJ0aWZhY3ROYW1lKSB7XG4gICAgcmV0dXJuIF9fYXdhaXRlcih0aGlzLCB2b2lkIDAsIHZvaWQgMCwgZnVuY3Rpb24qICgpIHtcbiAgICAgICAgY29uc3QgYXJ0aWZhY3RDbGllbnQgPSAoMCwgYXJ0aWZhY3RfdHdpcnBfY2xpZW50XzEuaW50ZXJuYWxBcnRpZmFjdFR3aXJwQ2xpZW50KSgpO1xuICAgICAgICBjb25zdCB7IHdvcmtmbG93UnVuQmFja2VuZElkLCB3b3JrZmxvd0pvYlJ1bkJhY2tlbmRJZCB9ID0gKDAsIHV0aWxfMS5nZXRCYWNrZW5kSWRzRnJvbVRva2VuKSgpO1xuICAgICAgICBjb25zdCBsaXN0UmVxID0ge1xuICAgICAgICAgICAgd29ya2Zsb3dSdW5CYWNrZW5kSWQsXG4gICAgICAgICAgICB3b3JrZmxvd0pvYlJ1bkJhY2tlbmRJZCxcbiAgICAgICAgICAgIG5hbWVGaWx0ZXI6IGdlbmVyYXRlZF8xLlN0cmluZ1ZhbHVlLmNyZWF0ZSh7IHZhbHVlOiBhcnRpZmFjdE5hbWUgfSlcbiAgICAgICAgfTtcbiAgICAgICAgY29uc3QgbGlzdFJlcyA9IHlpZWxkIGFydGlmYWN0Q2xpZW50Lkxpc3RBcnRpZmFjdHMobGlzdFJlcSk7XG4gICAgICAgIGlmIChsaXN0UmVzLmFydGlmYWN0cy5sZW5ndGggPT09IDApIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBlcnJvcnNfMS5BcnRpZmFjdE5vdEZvdW5kRXJyb3IoYEFydGlmYWN0IG5vdCBmb3VuZCBmb3IgbmFtZTogJHthcnRpZmFjdE5hbWV9YCk7XG4gICAgICAgIH1cbiAgICAgICAgbGV0IGFydGlmYWN0ID0gbGlzdFJlcy5hcnRpZmFjdHNbMF07XG4gICAgICAgIGlmIChsaXN0UmVzLmFydGlmYWN0cy5sZW5ndGggPiAxKSB7XG4gICAgICAgICAgICBhcnRpZmFjdCA9IGxpc3RSZXMuYXJ0aWZhY3RzLnNvcnQoKGEsIGIpID0+IE51bWJlcihiLmRhdGFiYXNlSWQpIC0gTnVtYmVyKGEuZGF0YWJhc2VJZCkpWzBdO1xuICAgICAgICAgICAgKDAsIGNvcmVfMS5kZWJ1ZykoYE1vcmUgdGhhbiBvbmUgYXJ0aWZhY3QgZm91bmQgZm9yIGEgc2luZ2xlIG5hbWUsIHJldHVybmluZyBuZXdlc3QgKGlkOiAke2FydGlmYWN0LmRhdGFiYXNlSWR9KWApO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IHJlcSA9IHtcbiAgICAgICAgICAgIHdvcmtmbG93UnVuQmFja2VuZElkOiBhcnRpZmFjdC53b3JrZmxvd1J1bkJhY2tlbmRJZCxcbiAgICAgICAgICAgIHdvcmtmbG93Sm9iUnVuQmFja2VuZElkOiBhcnRpZmFjdC53b3JrZmxvd0pvYlJ1bkJhY2tlbmRJZCxcbiAgICAgICAgICAgIG5hbWU6IGFydGlmYWN0Lm5hbWVcbiAgICAgICAgfTtcbiAgICAgICAgY29uc3QgcmVzID0geWllbGQgYXJ0aWZhY3RDbGllbnQuRGVsZXRlQXJ0aWZhY3QocmVxKTtcbiAgICAgICAgKDAsIGNvcmVfMS5pbmZvKShgQXJ0aWZhY3QgJyR7YXJ0aWZhY3ROYW1lfScgKElEOiAke3Jlcy5hcnRpZmFjdElkfSkgZGVsZXRlZGApO1xuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgaWQ6IE51bWJlcihyZXMuYXJ0aWZhY3RJZClcbiAgICAgICAgfTtcbiAgICB9KTtcbn1cbmV4cG9ydHMuZGVsZXRlQXJ0aWZhY3RJbnRlcm5hbCA9IGRlbGV0ZUFydGlmYWN0SW50ZXJuYWw7XG4vLyMgc291cmNlTWFwcGluZ1VSTD1kZWxldGUtYXJ0aWZhY3QuanMubWFwIiwKICAgICJcInVzZSBzdHJpY3RcIjtcbnZhciBfX2F3YWl0ZXIgPSAodGhpcyAmJiB0aGlzLl9fYXdhaXRlcikgfHwgZnVuY3Rpb24gKHRoaXNBcmcsIF9hcmd1bWVudHMsIFAsIGdlbmVyYXRvcikge1xuICAgIGZ1bmN0aW9uIGFkb3B0KHZhbHVlKSB7IHJldHVybiB2YWx1ZSBpbnN0YW5jZW9mIFAgPyB2YWx1ZSA6IG5ldyBQKGZ1bmN0aW9uIChyZXNvbHZlKSB7IHJlc29sdmUodmFsdWUpOyB9KTsgfVxuICAgIHJldHVybiBuZXcgKFAgfHwgKFAgPSBQcm9taXNlKSkoZnVuY3Rpb24gKHJlc29sdmUsIHJlamVjdCkge1xuICAgICAgICBmdW5jdGlvbiBmdWxmaWxsZWQodmFsdWUpIHsgdHJ5IHsgc3RlcChnZW5lcmF0b3IubmV4dCh2YWx1ZSkpOyB9IGNhdGNoIChlKSB7IHJlamVjdChlKTsgfSB9XG4gICAgICAgIGZ1bmN0aW9uIHJlamVjdGVkKHZhbHVlKSB7IHRyeSB7IHN0ZXAoZ2VuZXJhdG9yW1widGhyb3dcIl0odmFsdWUpKTsgfSBjYXRjaCAoZSkgeyByZWplY3QoZSk7IH0gfVxuICAgICAgICBmdW5jdGlvbiBzdGVwKHJlc3VsdCkgeyByZXN1bHQuZG9uZSA/IHJlc29sdmUocmVzdWx0LnZhbHVlKSA6IGFkb3B0KHJlc3VsdC52YWx1ZSkudGhlbihmdWxmaWxsZWQsIHJlamVjdGVkKTsgfVxuICAgICAgICBzdGVwKChnZW5lcmF0b3IgPSBnZW5lcmF0b3IuYXBwbHkodGhpc0FyZywgX2FyZ3VtZW50cyB8fCBbXSkpLm5leHQoKSk7XG4gICAgfSk7XG59O1xuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiX19lc01vZHVsZVwiLCB7IHZhbHVlOiB0cnVlIH0pO1xuZXhwb3J0cy5saXN0QXJ0aWZhY3RzSW50ZXJuYWwgPSBleHBvcnRzLmxpc3RBcnRpZmFjdHNQdWJsaWMgPSB2b2lkIDA7XG5jb25zdCBjb3JlXzEgPSByZXF1aXJlKFwiQGFjdGlvbnMvY29yZVwiKTtcbmNvbnN0IGdpdGh1Yl8xID0gcmVxdWlyZShcIkBhY3Rpb25zL2dpdGh1YlwiKTtcbmNvbnN0IHVzZXJfYWdlbnRfMSA9IHJlcXVpcmUoXCIuLi9zaGFyZWQvdXNlci1hZ2VudFwiKTtcbmNvbnN0IHJldHJ5X29wdGlvbnNfMSA9IHJlcXVpcmUoXCIuL3JldHJ5LW9wdGlvbnNcIik7XG5jb25zdCB1dGlsc18xID0gcmVxdWlyZShcIkBhY3Rpb25zL2dpdGh1Yi9saWIvdXRpbHNcIik7XG5jb25zdCBwbHVnaW5fcmVxdWVzdF9sb2dfMSA9IHJlcXVpcmUoXCJAb2N0b2tpdC9wbHVnaW4tcmVxdWVzdC1sb2dcIik7XG5jb25zdCBwbHVnaW5fcmV0cnlfMSA9IHJlcXVpcmUoXCJAb2N0b2tpdC9wbHVnaW4tcmV0cnlcIik7XG5jb25zdCBhcnRpZmFjdF90d2lycF9jbGllbnRfMSA9IHJlcXVpcmUoXCIuLi9zaGFyZWQvYXJ0aWZhY3QtdHdpcnAtY2xpZW50XCIpO1xuY29uc3QgdXRpbF8xID0gcmVxdWlyZShcIi4uL3NoYXJlZC91dGlsXCIpO1xuY29uc3QgZ2VuZXJhdGVkXzEgPSByZXF1aXJlKFwiLi4vLi4vZ2VuZXJhdGVkXCIpO1xuLy8gTGltaXRpbmcgdG8gMTAwMCBmb3IgcGVyZiByZWFzb25zXG5jb25zdCBtYXhpbXVtQXJ0aWZhY3RDb3VudCA9IDEwMDA7XG5jb25zdCBwYWdpbmF0aW9uQ291bnQgPSAxMDA7XG5jb25zdCBtYXhOdW1iZXJPZlBhZ2VzID0gbWF4aW11bUFydGlmYWN0Q291bnQgLyBwYWdpbmF0aW9uQ291bnQ7XG5mdW5jdGlvbiBsaXN0QXJ0aWZhY3RzUHVibGljKHdvcmtmbG93UnVuSWQsIHJlcG9zaXRvcnlPd25lciwgcmVwb3NpdG9yeU5hbWUsIHRva2VuLCBsYXRlc3QgPSBmYWxzZSkge1xuICAgIHJldHVybiBfX2F3YWl0ZXIodGhpcywgdm9pZCAwLCB2b2lkIDAsIGZ1bmN0aW9uKiAoKSB7XG4gICAgICAgICgwLCBjb3JlXzEuaW5mbykoYEZldGNoaW5nIGFydGlmYWN0IGxpc3QgZm9yIHdvcmtmbG93IHJ1biAke3dvcmtmbG93UnVuSWR9IGluIHJlcG9zaXRvcnkgJHtyZXBvc2l0b3J5T3duZXJ9LyR7cmVwb3NpdG9yeU5hbWV9YCk7XG4gICAgICAgIGxldCBhcnRpZmFjdHMgPSBbXTtcbiAgICAgICAgY29uc3QgW3JldHJ5T3B0cywgcmVxdWVzdE9wdHNdID0gKDAsIHJldHJ5X29wdGlvbnNfMS5nZXRSZXRyeU9wdGlvbnMpKHV0aWxzXzEuZGVmYXVsdHMpO1xuICAgICAgICBjb25zdCBvcHRzID0ge1xuICAgICAgICAgICAgbG9nOiB1bmRlZmluZWQsXG4gICAgICAgICAgICB1c2VyQWdlbnQ6ICgwLCB1c2VyX2FnZW50XzEuZ2V0VXNlckFnZW50U3RyaW5nKSgpLFxuICAgICAgICAgICAgcHJldmlld3M6IHVuZGVmaW5lZCxcbiAgICAgICAgICAgIHJldHJ5OiByZXRyeU9wdHMsXG4gICAgICAgICAgICByZXF1ZXN0OiByZXF1ZXN0T3B0c1xuICAgICAgICB9O1xuICAgICAgICBjb25zdCBnaXRodWIgPSAoMCwgZ2l0aHViXzEuZ2V0T2N0b2tpdCkodG9rZW4sIG9wdHMsIHBsdWdpbl9yZXRyeV8xLnJldHJ5LCBwbHVnaW5fcmVxdWVzdF9sb2dfMS5yZXF1ZXN0TG9nKTtcbiAgICAgICAgbGV0IGN1cnJlbnRQYWdlTnVtYmVyID0gMTtcbiAgICAgICAgY29uc3QgeyBkYXRhOiBsaXN0QXJ0aWZhY3RSZXNwb25zZSB9ID0geWllbGQgZ2l0aHViLnJlc3QuYWN0aW9ucy5saXN0V29ya2Zsb3dSdW5BcnRpZmFjdHMoe1xuICAgICAgICAgICAgb3duZXI6IHJlcG9zaXRvcnlPd25lcixcbiAgICAgICAgICAgIHJlcG86IHJlcG9zaXRvcnlOYW1lLFxuICAgICAgICAgICAgcnVuX2lkOiB3b3JrZmxvd1J1bklkLFxuICAgICAgICAgICAgcGVyX3BhZ2U6IHBhZ2luYXRpb25Db3VudCxcbiAgICAgICAgICAgIHBhZ2U6IGN1cnJlbnRQYWdlTnVtYmVyXG4gICAgICAgIH0pO1xuICAgICAgICBsZXQgbnVtYmVyT2ZQYWdlcyA9IE1hdGguY2VpbChsaXN0QXJ0aWZhY3RSZXNwb25zZS50b3RhbF9jb3VudCAvIHBhZ2luYXRpb25Db3VudCk7XG4gICAgICAgIGNvbnN0IHRvdGFsQXJ0aWZhY3RDb3VudCA9IGxpc3RBcnRpZmFjdFJlc3BvbnNlLnRvdGFsX2NvdW50O1xuICAgICAgICBpZiAodG90YWxBcnRpZmFjdENvdW50ID4gbWF4aW11bUFydGlmYWN0Q291bnQpIHtcbiAgICAgICAgICAgICgwLCBjb3JlXzEud2FybmluZykoYFdvcmtmbG93IHJ1biAke3dvcmtmbG93UnVuSWR9IGhhcyBtb3JlIHRoYW4gMTAwMCBhcnRpZmFjdHMuIFJlc3VsdHMgd2lsbCBiZSBpbmNvbXBsZXRlIGFzIG9ubHkgdGhlIGZpcnN0ICR7bWF4aW11bUFydGlmYWN0Q291bnR9IGFydGlmYWN0cyB3aWxsIGJlIHJldHVybmVkYCk7XG4gICAgICAgICAgICBudW1iZXJPZlBhZ2VzID0gbWF4TnVtYmVyT2ZQYWdlcztcbiAgICAgICAgfVxuICAgICAgICAvLyBJdGVyYXRlIG92ZXIgdGhlIGZpcnN0IHBhZ2VcbiAgICAgICAgZm9yIChjb25zdCBhcnRpZmFjdCBvZiBsaXN0QXJ0aWZhY3RSZXNwb25zZS5hcnRpZmFjdHMpIHtcbiAgICAgICAgICAgIGFydGlmYWN0cy5wdXNoKHtcbiAgICAgICAgICAgICAgICBuYW1lOiBhcnRpZmFjdC5uYW1lLFxuICAgICAgICAgICAgICAgIGlkOiBhcnRpZmFjdC5pZCxcbiAgICAgICAgICAgICAgICBzaXplOiBhcnRpZmFjdC5zaXplX2luX2J5dGVzLFxuICAgICAgICAgICAgICAgIGNyZWF0ZWRBdDogYXJ0aWZhY3QuY3JlYXRlZF9hdCA/IG5ldyBEYXRlKGFydGlmYWN0LmNyZWF0ZWRfYXQpIDogdW5kZWZpbmVkXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgICAgICAvLyBJdGVyYXRlIG92ZXIgYW55IHJlbWFpbmluZyBwYWdlc1xuICAgICAgICBmb3IgKGN1cnJlbnRQYWdlTnVtYmVyOyBjdXJyZW50UGFnZU51bWJlciA8IG51bWJlck9mUGFnZXM7IGN1cnJlbnRQYWdlTnVtYmVyKyspIHtcbiAgICAgICAgICAgIGN1cnJlbnRQYWdlTnVtYmVyKys7XG4gICAgICAgICAgICAoMCwgY29yZV8xLmRlYnVnKShgRmV0Y2hpbmcgcGFnZSAke2N1cnJlbnRQYWdlTnVtYmVyfSBvZiBhcnRpZmFjdCBsaXN0YCk7XG4gICAgICAgICAgICBjb25zdCB7IGRhdGE6IGxpc3RBcnRpZmFjdFJlc3BvbnNlIH0gPSB5aWVsZCBnaXRodWIucmVzdC5hY3Rpb25zLmxpc3RXb3JrZmxvd1J1bkFydGlmYWN0cyh7XG4gICAgICAgICAgICAgICAgb3duZXI6IHJlcG9zaXRvcnlPd25lcixcbiAgICAgICAgICAgICAgICByZXBvOiByZXBvc2l0b3J5TmFtZSxcbiAgICAgICAgICAgICAgICBydW5faWQ6IHdvcmtmbG93UnVuSWQsXG4gICAgICAgICAgICAgICAgcGVyX3BhZ2U6IHBhZ2luYXRpb25Db3VudCxcbiAgICAgICAgICAgICAgICBwYWdlOiBjdXJyZW50UGFnZU51bWJlclxuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICBmb3IgKGNvbnN0IGFydGlmYWN0IG9mIGxpc3RBcnRpZmFjdFJlc3BvbnNlLmFydGlmYWN0cykge1xuICAgICAgICAgICAgICAgIGFydGlmYWN0cy5wdXNoKHtcbiAgICAgICAgICAgICAgICAgICAgbmFtZTogYXJ0aWZhY3QubmFtZSxcbiAgICAgICAgICAgICAgICAgICAgaWQ6IGFydGlmYWN0LmlkLFxuICAgICAgICAgICAgICAgICAgICBzaXplOiBhcnRpZmFjdC5zaXplX2luX2J5dGVzLFxuICAgICAgICAgICAgICAgICAgICBjcmVhdGVkQXQ6IGFydGlmYWN0LmNyZWF0ZWRfYXRcbiAgICAgICAgICAgICAgICAgICAgICAgID8gbmV3IERhdGUoYXJ0aWZhY3QuY3JlYXRlZF9hdClcbiAgICAgICAgICAgICAgICAgICAgICAgIDogdW5kZWZpbmVkXG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGxhdGVzdCkge1xuICAgICAgICAgICAgYXJ0aWZhY3RzID0gZmlsdGVyTGF0ZXN0KGFydGlmYWN0cyk7XG4gICAgICAgIH1cbiAgICAgICAgKDAsIGNvcmVfMS5pbmZvKShgRm91bmQgJHthcnRpZmFjdHMubGVuZ3RofSBhcnRpZmFjdChzKWApO1xuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgYXJ0aWZhY3RzXG4gICAgICAgIH07XG4gICAgfSk7XG59XG5leHBvcnRzLmxpc3RBcnRpZmFjdHNQdWJsaWMgPSBsaXN0QXJ0aWZhY3RzUHVibGljO1xuZnVuY3Rpb24gbGlzdEFydGlmYWN0c0ludGVybmFsKGxhdGVzdCA9IGZhbHNlKSB7XG4gICAgcmV0dXJuIF9fYXdhaXRlcih0aGlzLCB2b2lkIDAsIHZvaWQgMCwgZnVuY3Rpb24qICgpIHtcbiAgICAgICAgY29uc3QgYXJ0aWZhY3RDbGllbnQgPSAoMCwgYXJ0aWZhY3RfdHdpcnBfY2xpZW50XzEuaW50ZXJuYWxBcnRpZmFjdFR3aXJwQ2xpZW50KSgpO1xuICAgICAgICBjb25zdCB7IHdvcmtmbG93UnVuQmFja2VuZElkLCB3b3JrZmxvd0pvYlJ1bkJhY2tlbmRJZCB9ID0gKDAsIHV0aWxfMS5nZXRCYWNrZW5kSWRzRnJvbVRva2VuKSgpO1xuICAgICAgICBjb25zdCByZXEgPSB7XG4gICAgICAgICAgICB3b3JrZmxvd1J1bkJhY2tlbmRJZCxcbiAgICAgICAgICAgIHdvcmtmbG93Sm9iUnVuQmFja2VuZElkXG4gICAgICAgIH07XG4gICAgICAgIGNvbnN0IHJlcyA9IHlpZWxkIGFydGlmYWN0Q2xpZW50Lkxpc3RBcnRpZmFjdHMocmVxKTtcbiAgICAgICAgbGV0IGFydGlmYWN0cyA9IHJlcy5hcnRpZmFjdHMubWFwKGFydGlmYWN0ID0+ICh7XG4gICAgICAgICAgICBuYW1lOiBhcnRpZmFjdC5uYW1lLFxuICAgICAgICAgICAgaWQ6IE51bWJlcihhcnRpZmFjdC5kYXRhYmFzZUlkKSxcbiAgICAgICAgICAgIHNpemU6IE51bWJlcihhcnRpZmFjdC5zaXplKSxcbiAgICAgICAgICAgIGNyZWF0ZWRBdDogYXJ0aWZhY3QuY3JlYXRlZEF0XG4gICAgICAgICAgICAgICAgPyBnZW5lcmF0ZWRfMS5UaW1lc3RhbXAudG9EYXRlKGFydGlmYWN0LmNyZWF0ZWRBdClcbiAgICAgICAgICAgICAgICA6IHVuZGVmaW5lZFxuICAgICAgICB9KSk7XG4gICAgICAgIGlmIChsYXRlc3QpIHtcbiAgICAgICAgICAgIGFydGlmYWN0cyA9IGZpbHRlckxhdGVzdChhcnRpZmFjdHMpO1xuICAgICAgICB9XG4gICAgICAgICgwLCBjb3JlXzEuaW5mbykoYEZvdW5kICR7YXJ0aWZhY3RzLmxlbmd0aH0gYXJ0aWZhY3QocylgKTtcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgIGFydGlmYWN0c1xuICAgICAgICB9O1xuICAgIH0pO1xufVxuZXhwb3J0cy5saXN0QXJ0aWZhY3RzSW50ZXJuYWwgPSBsaXN0QXJ0aWZhY3RzSW50ZXJuYWw7XG4vKipcbiAqIEZpbHRlcnMgYSBsaXN0IG9mIGFydGlmYWN0cyB0byBvbmx5IGluY2x1ZGUgdGhlIGxhdGVzdCBhcnRpZmFjdCBmb3IgZWFjaCBuYW1lXG4gKiBAcGFyYW0gYXJ0aWZhY3RzIFRoZSBhcnRpZmFjdHMgdG8gZmlsdGVyXG4gKiBAcmV0dXJucyBUaGUgZmlsdGVyZWQgbGlzdCBvZiBhcnRpZmFjdHNcbiAqL1xuZnVuY3Rpb24gZmlsdGVyTGF0ZXN0KGFydGlmYWN0cykge1xuICAgIGFydGlmYWN0cy5zb3J0KChhLCBiKSA9PiBiLmlkIC0gYS5pZCk7XG4gICAgY29uc3QgbGF0ZXN0QXJ0aWZhY3RzID0gW107XG4gICAgY29uc3Qgc2VlbkFydGlmYWN0TmFtZXMgPSBuZXcgU2V0KCk7XG4gICAgZm9yIChjb25zdCBhcnRpZmFjdCBvZiBhcnRpZmFjdHMpIHtcbiAgICAgICAgaWYgKCFzZWVuQXJ0aWZhY3ROYW1lcy5oYXMoYXJ0aWZhY3QubmFtZSkpIHtcbiAgICAgICAgICAgIGxhdGVzdEFydGlmYWN0cy5wdXNoKGFydGlmYWN0KTtcbiAgICAgICAgICAgIHNlZW5BcnRpZmFjdE5hbWVzLmFkZChhcnRpZmFjdC5uYW1lKTtcbiAgICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gbGF0ZXN0QXJ0aWZhY3RzO1xufVxuLy8jIHNvdXJjZU1hcHBpbmdVUkw9bGlzdC1hcnRpZmFjdHMuanMubWFwIiwKICAgICJcInVzZSBzdHJpY3RcIjtcbnZhciBfX2F3YWl0ZXIgPSAodGhpcyAmJiB0aGlzLl9fYXdhaXRlcikgfHwgZnVuY3Rpb24gKHRoaXNBcmcsIF9hcmd1bWVudHMsIFAsIGdlbmVyYXRvcikge1xuICAgIGZ1bmN0aW9uIGFkb3B0KHZhbHVlKSB7IHJldHVybiB2YWx1ZSBpbnN0YW5jZW9mIFAgPyB2YWx1ZSA6IG5ldyBQKGZ1bmN0aW9uIChyZXNvbHZlKSB7IHJlc29sdmUodmFsdWUpOyB9KTsgfVxuICAgIHJldHVybiBuZXcgKFAgfHwgKFAgPSBQcm9taXNlKSkoZnVuY3Rpb24gKHJlc29sdmUsIHJlamVjdCkge1xuICAgICAgICBmdW5jdGlvbiBmdWxmaWxsZWQodmFsdWUpIHsgdHJ5IHsgc3RlcChnZW5lcmF0b3IubmV4dCh2YWx1ZSkpOyB9IGNhdGNoIChlKSB7IHJlamVjdChlKTsgfSB9XG4gICAgICAgIGZ1bmN0aW9uIHJlamVjdGVkKHZhbHVlKSB7IHRyeSB7IHN0ZXAoZ2VuZXJhdG9yW1widGhyb3dcIl0odmFsdWUpKTsgfSBjYXRjaCAoZSkgeyByZWplY3QoZSk7IH0gfVxuICAgICAgICBmdW5jdGlvbiBzdGVwKHJlc3VsdCkgeyByZXN1bHQuZG9uZSA/IHJlc29sdmUocmVzdWx0LnZhbHVlKSA6IGFkb3B0KHJlc3VsdC52YWx1ZSkudGhlbihmdWxmaWxsZWQsIHJlamVjdGVkKTsgfVxuICAgICAgICBzdGVwKChnZW5lcmF0b3IgPSBnZW5lcmF0b3IuYXBwbHkodGhpc0FyZywgX2FyZ3VtZW50cyB8fCBbXSkpLm5leHQoKSk7XG4gICAgfSk7XG59O1xudmFyIF9fcmVzdCA9ICh0aGlzICYmIHRoaXMuX19yZXN0KSB8fCBmdW5jdGlvbiAocywgZSkge1xuICAgIHZhciB0ID0ge307XG4gICAgZm9yICh2YXIgcCBpbiBzKSBpZiAoT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKHMsIHApICYmIGUuaW5kZXhPZihwKSA8IDApXG4gICAgICAgIHRbcF0gPSBzW3BdO1xuICAgIGlmIChzICE9IG51bGwgJiYgdHlwZW9mIE9iamVjdC5nZXRPd25Qcm9wZXJ0eVN5bWJvbHMgPT09IFwiZnVuY3Rpb25cIilcbiAgICAgICAgZm9yICh2YXIgaSA9IDAsIHAgPSBPYmplY3QuZ2V0T3duUHJvcGVydHlTeW1ib2xzKHMpOyBpIDwgcC5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgaWYgKGUuaW5kZXhPZihwW2ldKSA8IDAgJiYgT2JqZWN0LnByb3RvdHlwZS5wcm9wZXJ0eUlzRW51bWVyYWJsZS5jYWxsKHMsIHBbaV0pKVxuICAgICAgICAgICAgICAgIHRbcFtpXV0gPSBzW3BbaV1dO1xuICAgICAgICB9XG4gICAgcmV0dXJuIHQ7XG59O1xuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiX19lc01vZHVsZVwiLCB7IHZhbHVlOiB0cnVlIH0pO1xuZXhwb3J0cy5EZWZhdWx0QXJ0aWZhY3RDbGllbnQgPSB2b2lkIDA7XG5jb25zdCBjb3JlXzEgPSByZXF1aXJlKFwiQGFjdGlvbnMvY29yZVwiKTtcbmNvbnN0IGNvbmZpZ18xID0gcmVxdWlyZShcIi4vc2hhcmVkL2NvbmZpZ1wiKTtcbmNvbnN0IHVwbG9hZF9hcnRpZmFjdF8xID0gcmVxdWlyZShcIi4vdXBsb2FkL3VwbG9hZC1hcnRpZmFjdFwiKTtcbmNvbnN0IGRvd25sb2FkX2FydGlmYWN0XzEgPSByZXF1aXJlKFwiLi9kb3dubG9hZC9kb3dubG9hZC1hcnRpZmFjdFwiKTtcbmNvbnN0IGRlbGV0ZV9hcnRpZmFjdF8xID0gcmVxdWlyZShcIi4vZGVsZXRlL2RlbGV0ZS1hcnRpZmFjdFwiKTtcbmNvbnN0IGdldF9hcnRpZmFjdF8xID0gcmVxdWlyZShcIi4vZmluZC9nZXQtYXJ0aWZhY3RcIik7XG5jb25zdCBsaXN0X2FydGlmYWN0c18xID0gcmVxdWlyZShcIi4vZmluZC9saXN0LWFydGlmYWN0c1wiKTtcbmNvbnN0IGVycm9yc18xID0gcmVxdWlyZShcIi4vc2hhcmVkL2Vycm9yc1wiKTtcbi8qKlxuICogVGhlIGRlZmF1bHQgYXJ0aWZhY3QgY2xpZW50IHRoYXQgaXMgdXNlZCBieSB0aGUgYXJ0aWZhY3QgYWN0aW9uKHMpLlxuICovXG5jbGFzcyBEZWZhdWx0QXJ0aWZhY3RDbGllbnQge1xuICAgIHVwbG9hZEFydGlmYWN0KG5hbWUsIGZpbGVzLCByb290RGlyZWN0b3J5LCBvcHRpb25zKSB7XG4gICAgICAgIHJldHVybiBfX2F3YWl0ZXIodGhpcywgdm9pZCAwLCB2b2lkIDAsIGZ1bmN0aW9uKiAoKSB7XG4gICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgIGlmICgoMCwgY29uZmlnXzEuaXNHaGVzKSgpKSB7XG4gICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBlcnJvcnNfMS5HSEVTTm90U3VwcG9ydGVkRXJyb3IoKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgcmV0dXJuICgwLCB1cGxvYWRfYXJ0aWZhY3RfMS51cGxvYWRBcnRpZmFjdCkobmFtZSwgZmlsZXMsIHJvb3REaXJlY3RvcnksIG9wdGlvbnMpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgICAgICAgICAgKDAsIGNvcmVfMS53YXJuaW5nKShgQXJ0aWZhY3QgdXBsb2FkIGZhaWxlZCB3aXRoIGVycm9yOiAke2Vycm9yfS5cblxuRXJyb3JzIGNhbiBiZSB0ZW1wb3JhcnksIHNvIHBsZWFzZSB0cnkgYWdhaW4gYW5kIG9wdGlvbmFsbHkgcnVuIHRoZSBhY3Rpb24gd2l0aCBkZWJ1ZyBtb2RlIGVuYWJsZWQgZm9yIG1vcmUgaW5mb3JtYXRpb24uXG5cbklmIHRoZSBlcnJvciBwZXJzaXN0cywgcGxlYXNlIGNoZWNrIHdoZXRoZXIgQWN0aW9ucyBpcyBvcGVyYXRpbmcgbm9ybWFsbHkgYXQgW2h0dHBzOi8vZ2l0aHVic3RhdHVzLmNvbV0oaHR0cHM6Ly93d3cuZ2l0aHVic3RhdHVzLmNvbSkuYCk7XG4gICAgICAgICAgICAgICAgdGhyb3cgZXJyb3I7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgIH1cbiAgICBkb3dubG9hZEFydGlmYWN0KGFydGlmYWN0SWQsIG9wdGlvbnMpIHtcbiAgICAgICAgcmV0dXJuIF9fYXdhaXRlcih0aGlzLCB2b2lkIDAsIHZvaWQgMCwgZnVuY3Rpb24qICgpIHtcbiAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgaWYgKCgwLCBjb25maWdfMS5pc0doZXMpKCkpIHtcbiAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IGVycm9yc18xLkdIRVNOb3RTdXBwb3J0ZWRFcnJvcigpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBpZiAob3B0aW9ucyA9PT0gbnVsbCB8fCBvcHRpb25zID09PSB2b2lkIDAgPyB2b2lkIDAgOiBvcHRpb25zLmZpbmRCeSkge1xuICAgICAgICAgICAgICAgICAgICBjb25zdCB7IGZpbmRCeTogeyByZXBvc2l0b3J5T3duZXIsIHJlcG9zaXRvcnlOYW1lLCB0b2tlbiB9IH0gPSBvcHRpb25zLCBkb3dubG9hZE9wdGlvbnMgPSBfX3Jlc3Qob3B0aW9ucywgW1wiZmluZEJ5XCJdKTtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuICgwLCBkb3dubG9hZF9hcnRpZmFjdF8xLmRvd25sb2FkQXJ0aWZhY3RQdWJsaWMpKGFydGlmYWN0SWQsIHJlcG9zaXRvcnlPd25lciwgcmVwb3NpdG9yeU5hbWUsIHRva2VuLCBkb3dubG9hZE9wdGlvbnMpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICByZXR1cm4gKDAsIGRvd25sb2FkX2FydGlmYWN0XzEuZG93bmxvYWRBcnRpZmFjdEludGVybmFsKShhcnRpZmFjdElkLCBvcHRpb25zKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGNhdGNoIChlcnJvcikge1xuICAgICAgICAgICAgICAgICgwLCBjb3JlXzEud2FybmluZykoYERvd25sb2FkIEFydGlmYWN0IGZhaWxlZCB3aXRoIGVycm9yOiAke2Vycm9yfS5cblxuRXJyb3JzIGNhbiBiZSB0ZW1wb3JhcnksIHNvIHBsZWFzZSB0cnkgYWdhaW4gYW5kIG9wdGlvbmFsbHkgcnVuIHRoZSBhY3Rpb24gd2l0aCBkZWJ1ZyBtb2RlIGVuYWJsZWQgZm9yIG1vcmUgaW5mb3JtYXRpb24uXG5cbklmIHRoZSBlcnJvciBwZXJzaXN0cywgcGxlYXNlIGNoZWNrIHdoZXRoZXIgQWN0aW9ucyBhbmQgQVBJIHJlcXVlc3RzIGFyZSBvcGVyYXRpbmcgbm9ybWFsbHkgYXQgW2h0dHBzOi8vZ2l0aHVic3RhdHVzLmNvbV0oaHR0cHM6Ly93d3cuZ2l0aHVic3RhdHVzLmNvbSkuYCk7XG4gICAgICAgICAgICAgICAgdGhyb3cgZXJyb3I7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgIH1cbiAgICBsaXN0QXJ0aWZhY3RzKG9wdGlvbnMpIHtcbiAgICAgICAgcmV0dXJuIF9fYXdhaXRlcih0aGlzLCB2b2lkIDAsIHZvaWQgMCwgZnVuY3Rpb24qICgpIHtcbiAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgaWYgKCgwLCBjb25maWdfMS5pc0doZXMpKCkpIHtcbiAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IGVycm9yc18xLkdIRVNOb3RTdXBwb3J0ZWRFcnJvcigpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBpZiAob3B0aW9ucyA9PT0gbnVsbCB8fCBvcHRpb25zID09PSB2b2lkIDAgPyB2b2lkIDAgOiBvcHRpb25zLmZpbmRCeSkge1xuICAgICAgICAgICAgICAgICAgICBjb25zdCB7IGZpbmRCeTogeyB3b3JrZmxvd1J1bklkLCByZXBvc2l0b3J5T3duZXIsIHJlcG9zaXRvcnlOYW1lLCB0b2tlbiB9IH0gPSBvcHRpb25zO1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gKDAsIGxpc3RfYXJ0aWZhY3RzXzEubGlzdEFydGlmYWN0c1B1YmxpYykod29ya2Zsb3dSdW5JZCwgcmVwb3NpdG9yeU93bmVyLCByZXBvc2l0b3J5TmFtZSwgdG9rZW4sIG9wdGlvbnMgPT09IG51bGwgfHwgb3B0aW9ucyA9PT0gdm9pZCAwID8gdm9pZCAwIDogb3B0aW9ucy5sYXRlc3QpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICByZXR1cm4gKDAsIGxpc3RfYXJ0aWZhY3RzXzEubGlzdEFydGlmYWN0c0ludGVybmFsKShvcHRpb25zID09PSBudWxsIHx8IG9wdGlvbnMgPT09IHZvaWQgMCA/IHZvaWQgMCA6IG9wdGlvbnMubGF0ZXN0KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGNhdGNoIChlcnJvcikge1xuICAgICAgICAgICAgICAgICgwLCBjb3JlXzEud2FybmluZykoYExpc3RpbmcgQXJ0aWZhY3RzIGZhaWxlZCB3aXRoIGVycm9yOiAke2Vycm9yfS5cblxuRXJyb3JzIGNhbiBiZSB0ZW1wb3JhcnksIHNvIHBsZWFzZSB0cnkgYWdhaW4gYW5kIG9wdGlvbmFsbHkgcnVuIHRoZSBhY3Rpb24gd2l0aCBkZWJ1ZyBtb2RlIGVuYWJsZWQgZm9yIG1vcmUgaW5mb3JtYXRpb24uXG5cbklmIHRoZSBlcnJvciBwZXJzaXN0cywgcGxlYXNlIGNoZWNrIHdoZXRoZXIgQWN0aW9ucyBhbmQgQVBJIHJlcXVlc3RzIGFyZSBvcGVyYXRpbmcgbm9ybWFsbHkgYXQgW2h0dHBzOi8vZ2l0aHVic3RhdHVzLmNvbV0oaHR0cHM6Ly93d3cuZ2l0aHVic3RhdHVzLmNvbSkuYCk7XG4gICAgICAgICAgICAgICAgdGhyb3cgZXJyb3I7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgIH1cbiAgICBnZXRBcnRpZmFjdChhcnRpZmFjdE5hbWUsIG9wdGlvbnMpIHtcbiAgICAgICAgcmV0dXJuIF9fYXdhaXRlcih0aGlzLCB2b2lkIDAsIHZvaWQgMCwgZnVuY3Rpb24qICgpIHtcbiAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgaWYgKCgwLCBjb25maWdfMS5pc0doZXMpKCkpIHtcbiAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IGVycm9yc18xLkdIRVNOb3RTdXBwb3J0ZWRFcnJvcigpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBpZiAob3B0aW9ucyA9PT0gbnVsbCB8fCBvcHRpb25zID09PSB2b2lkIDAgPyB2b2lkIDAgOiBvcHRpb25zLmZpbmRCeSkge1xuICAgICAgICAgICAgICAgICAgICBjb25zdCB7IGZpbmRCeTogeyB3b3JrZmxvd1J1bklkLCByZXBvc2l0b3J5T3duZXIsIHJlcG9zaXRvcnlOYW1lLCB0b2tlbiB9IH0gPSBvcHRpb25zO1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gKDAsIGdldF9hcnRpZmFjdF8xLmdldEFydGlmYWN0UHVibGljKShhcnRpZmFjdE5hbWUsIHdvcmtmbG93UnVuSWQsIHJlcG9zaXRvcnlPd25lciwgcmVwb3NpdG9yeU5hbWUsIHRva2VuKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgcmV0dXJuICgwLCBnZXRfYXJ0aWZhY3RfMS5nZXRBcnRpZmFjdEludGVybmFsKShhcnRpZmFjdE5hbWUpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgICAgICAgICAgKDAsIGNvcmVfMS53YXJuaW5nKShgR2V0IEFydGlmYWN0IGZhaWxlZCB3aXRoIGVycm9yOiAke2Vycm9yfS5cblxuRXJyb3JzIGNhbiBiZSB0ZW1wb3JhcnksIHNvIHBsZWFzZSB0cnkgYWdhaW4gYW5kIG9wdGlvbmFsbHkgcnVuIHRoZSBhY3Rpb24gd2l0aCBkZWJ1ZyBtb2RlIGVuYWJsZWQgZm9yIG1vcmUgaW5mb3JtYXRpb24uXG5cbklmIHRoZSBlcnJvciBwZXJzaXN0cywgcGxlYXNlIGNoZWNrIHdoZXRoZXIgQWN0aW9ucyBhbmQgQVBJIHJlcXVlc3RzIGFyZSBvcGVyYXRpbmcgbm9ybWFsbHkgYXQgW2h0dHBzOi8vZ2l0aHVic3RhdHVzLmNvbV0oaHR0cHM6Ly93d3cuZ2l0aHVic3RhdHVzLmNvbSkuYCk7XG4gICAgICAgICAgICAgICAgdGhyb3cgZXJyb3I7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgIH1cbiAgICBkZWxldGVBcnRpZmFjdChhcnRpZmFjdE5hbWUsIG9wdGlvbnMpIHtcbiAgICAgICAgcmV0dXJuIF9fYXdhaXRlcih0aGlzLCB2b2lkIDAsIHZvaWQgMCwgZnVuY3Rpb24qICgpIHtcbiAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgaWYgKCgwLCBjb25maWdfMS5pc0doZXMpKCkpIHtcbiAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IGVycm9yc18xLkdIRVNOb3RTdXBwb3J0ZWRFcnJvcigpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBpZiAob3B0aW9ucyA9PT0gbnVsbCB8fCBvcHRpb25zID09PSB2b2lkIDAgPyB2b2lkIDAgOiBvcHRpb25zLmZpbmRCeSkge1xuICAgICAgICAgICAgICAgICAgICBjb25zdCB7IGZpbmRCeTogeyByZXBvc2l0b3J5T3duZXIsIHJlcG9zaXRvcnlOYW1lLCB3b3JrZmxvd1J1bklkLCB0b2tlbiB9IH0gPSBvcHRpb25zO1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gKDAsIGRlbGV0ZV9hcnRpZmFjdF8xLmRlbGV0ZUFydGlmYWN0UHVibGljKShhcnRpZmFjdE5hbWUsIHdvcmtmbG93UnVuSWQsIHJlcG9zaXRvcnlPd25lciwgcmVwb3NpdG9yeU5hbWUsIHRva2VuKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgcmV0dXJuICgwLCBkZWxldGVfYXJ0aWZhY3RfMS5kZWxldGVBcnRpZmFjdEludGVybmFsKShhcnRpZmFjdE5hbWUpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgICAgICAgICAgKDAsIGNvcmVfMS53YXJuaW5nKShgRGVsZXRlIEFydGlmYWN0IGZhaWxlZCB3aXRoIGVycm9yOiAke2Vycm9yfS5cblxuRXJyb3JzIGNhbiBiZSB0ZW1wb3JhcnksIHNvIHBsZWFzZSB0cnkgYWdhaW4gYW5kIG9wdGlvbmFsbHkgcnVuIHRoZSBhY3Rpb24gd2l0aCBkZWJ1ZyBtb2RlIGVuYWJsZWQgZm9yIG1vcmUgaW5mb3JtYXRpb24uXG5cbklmIHRoZSBlcnJvciBwZXJzaXN0cywgcGxlYXNlIGNoZWNrIHdoZXRoZXIgQWN0aW9ucyBhbmQgQVBJIHJlcXVlc3RzIGFyZSBvcGVyYXRpbmcgbm9ybWFsbHkgYXQgW2h0dHBzOi8vZ2l0aHVic3RhdHVzLmNvbV0oaHR0cHM6Ly93d3cuZ2l0aHVic3RhdHVzLmNvbSkuYCk7XG4gICAgICAgICAgICAgICAgdGhyb3cgZXJyb3I7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgIH1cbn1cbmV4cG9ydHMuRGVmYXVsdEFydGlmYWN0Q2xpZW50ID0gRGVmYXVsdEFydGlmYWN0Q2xpZW50O1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9Y2xpZW50LmpzLm1hcCIsCiAgICAiXCJ1c2Ugc3RyaWN0XCI7XG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJfX2VzTW9kdWxlXCIsIHsgdmFsdWU6IHRydWUgfSk7XG4vLyMgc291cmNlTWFwcGluZ1VSTD1pbnRlcmZhY2VzLmpzLm1hcCIsCiAgICAiXCJ1c2Ugc3RyaWN0XCI7XG52YXIgX19jcmVhdGVCaW5kaW5nID0gKHRoaXMgJiYgdGhpcy5fX2NyZWF0ZUJpbmRpbmcpIHx8IChPYmplY3QuY3JlYXRlID8gKGZ1bmN0aW9uKG8sIG0sIGssIGsyKSB7XG4gICAgaWYgKGsyID09PSB1bmRlZmluZWQpIGsyID0gaztcbiAgICB2YXIgZGVzYyA9IE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IobSwgayk7XG4gICAgaWYgKCFkZXNjIHx8IChcImdldFwiIGluIGRlc2MgPyAhbS5fX2VzTW9kdWxlIDogZGVzYy53cml0YWJsZSB8fCBkZXNjLmNvbmZpZ3VyYWJsZSkpIHtcbiAgICAgIGRlc2MgPSB7IGVudW1lcmFibGU6IHRydWUsIGdldDogZnVuY3Rpb24oKSB7IHJldHVybiBtW2tdOyB9IH07XG4gICAgfVxuICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShvLCBrMiwgZGVzYyk7XG59KSA6IChmdW5jdGlvbihvLCBtLCBrLCBrMikge1xuICAgIGlmIChrMiA9PT0gdW5kZWZpbmVkKSBrMiA9IGs7XG4gICAgb1trMl0gPSBtW2tdO1xufSkpO1xudmFyIF9fZXhwb3J0U3RhciA9ICh0aGlzICYmIHRoaXMuX19leHBvcnRTdGFyKSB8fCBmdW5jdGlvbihtLCBleHBvcnRzKSB7XG4gICAgZm9yICh2YXIgcCBpbiBtKSBpZiAocCAhPT0gXCJkZWZhdWx0XCIgJiYgIU9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChleHBvcnRzLCBwKSkgX19jcmVhdGVCaW5kaW5nKGV4cG9ydHMsIG0sIHApO1xufTtcbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIl9fZXNNb2R1bGVcIiwgeyB2YWx1ZTogdHJ1ZSB9KTtcbmNvbnN0IGNsaWVudF8xID0gcmVxdWlyZShcIi4vaW50ZXJuYWwvY2xpZW50XCIpO1xuX19leHBvcnRTdGFyKHJlcXVpcmUoXCIuL2ludGVybmFsL3NoYXJlZC9pbnRlcmZhY2VzXCIpLCBleHBvcnRzKTtcbl9fZXhwb3J0U3RhcihyZXF1aXJlKFwiLi9pbnRlcm5hbC9zaGFyZWQvZXJyb3JzXCIpLCBleHBvcnRzKTtcbl9fZXhwb3J0U3RhcihyZXF1aXJlKFwiLi9pbnRlcm5hbC9jbGllbnRcIiksIGV4cG9ydHMpO1xuY29uc3QgY2xpZW50ID0gbmV3IGNsaWVudF8xLkRlZmF1bHRBcnRpZmFjdENsaWVudCgpO1xuZXhwb3J0cy5kZWZhdWx0ID0gY2xpZW50O1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9YXJ0aWZhY3QuanMubWFwIiwKICAgICJpbXBvcnQgeyBqb2luIH0gZnJvbSAnbm9kZTpwYXRoJ1xuaW1wb3J0IHsgZXhlYyB9IGZyb20gJ25vZGU6Y2hpbGRfcHJvY2VzcydcbmltcG9ydCB7IHByb21pc2lmeSB9IGZyb20gJ25vZGU6dXRpbCdcbmltcG9ydCB7IHJlYWRGaWxlLCB3cml0ZUZpbGUgfSBmcm9tICdub2RlOmZzL3Byb21pc2VzJ1xuXG5pbXBvcnQgeyBlcnJvciwgZ2V0SW5wdXQsIHNldEZhaWxlZCB9IGZyb20gJ0BhY3Rpb25zL2NvcmUnO1xuaW1wb3J0IHsgZ2V0T2N0b2tpdCwgY29udGV4dCB9IGZyb20gJ0BhY3Rpb25zL2dpdGh1Yic7XG5pbXBvcnQgeyBEZWZhdWx0QXJ0aWZhY3RDbGllbnQgfSBmcm9tICdAYWN0aW9ucy9hcnRpZmFjdCc7XG5cbmltcG9ydCB7IHByZXBhcmVEZXBsb3lDb25maWdzIH0gZnJvbSAnLi9kZXBsb3knO1xuaW1wb3J0IHsgUFJPTUVUSEVVU19QVVNIR0FURVdBWV9VUkwsIFlCRF9DT05ORUNUSU9OX1NUUklORyB9IGZyb20gJy4vY29uc3RhbnRzJztcbmltcG9ydCB7IGNvbGxlY3RQcm9tZXRoZXVzLCB0eXBlIFdlbGxrbm93bk1ldHJpY3MgfSBmcm9tICcuL3Byb21ldGhldXMnO1xuaW1wb3J0IHsgY3JlYXRlUmVwb3J0IH0gZnJvbSAnLi9yZXBvcnQnO1xuaW1wb3J0IHR5cGUgeyBDaGFydCwgV2VsbGtub3duQ2hhcnRzIH0gZnJvbSAnLi9jaGFydCc7XG5cbi8vIFRlc3QgUGxhbjpcbi8vIDAuIFByZXNjcmlwdGlvblxuLy8gMC4xIEFjcXVpcmUgdGVtcCBkaXJcbi8vIDAuMiBDcmVhdGUgZGVwbG95bWVudCBjb25maWdzXG4vLyAxLiBSb2xsaW5nIHVwXG4vLyAxLjEgUnVuIFlEQlxuLy8gMS4yIFJ1biB3b3JrbG9hZFxuLy8gMS4zIFJ1biBjaGFvcyB0ZXN0aW5nXG4vLyAyLiBTYXZlIFJlc3VsdHNcbi8vIDIuMSBQdWxsIFByb21ldGhldXMgTWV0cmljc1xuLy8gMi4yIFN0b3JlIGl0IGFzIGFuIGFydGlmYWN0XG4vLyAzLiBSb2xsaW5nIGRvd25cbi8vIDMuMSBTdG9wIFlEQlxuLy8gNC4gUHVibGlzaCByZXBvcnRcbi8vIDQuMSBEb3dubG9hZCBtZXRyaWNzIGZvciBiYXNlIGJyYW5jaCAobWFpbilcbi8vIDQuMiBNZXJnZSBjdXJyZW50IG1ldHJpY3MgYW5kIGJhc2UgYnJhbmNoIG1ldHJpY3Ncbi8vIDQuMyBSZW5kZXIgY2hhcnRzXG4vLyA0LjQgUHVibGlzaCByZXBvcnQgaWYgUFJcblxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIHJ1bigpIHtcbiAgICBsZXQgaGVhZCA9IGdldElucHV0KFwiR0lUSFVCX0hFQURfUkVGXCIpXG4gICAgbGV0IGJhc2UgPSBnZXRJbnB1dChcIkdJVEhVQl9CQVNFX1JFRlwiLCB7IHJlcXVpcmVkOiB0cnVlIH0pLnJlcGxhY2UoL15yZWZzXFwvaGVhZHNcXC8vLCBcIlwiKVxuICAgIGxldCBpc01haW4gPSBiYXNlID09PSBcIm1haW5cIiB8fCBiYXNlID09PSBcIm1hc3RlclwiXG5cbiAgICAvLyAwLjEgQWNxdWlyZSB0ZW1wIGRpclxuICAgIGxldCB0bXBEaXIgPSBwcm9jZXNzLmVudlsnUlVOTkVSX1RFTVAnXSE7XG5cbiAgICAvLyAxLjEgQ3JlYXRlIGRlcGxveW1lbnQgY29uZmlnc1xuICAgIGxldCBjb21wb3NlRmlsZVBhdGggPSBhd2FpdCBwcmVwYXJlRGVwbG95Q29uZmlncyh0bXBEaXIsIHBhcnNlSW50KGdldElucHV0KFwiWURCX0RBVEFCQVNFX05PREVfQ09VTlRcIikpKTtcblxuICAgIC8vIDEuMSBSdW4gWURCXG4gICAgYXdhaXQgcHJvbWlzaWZ5KGV4ZWMpKGBkb2NrZXIgY29tcG9zZSAtZiAke2NvbXBvc2VGaWxlUGF0aH0gdXAgLS1xdWlldC1wdWxsIC1kYClcblxuICAgIGxldCBzdGFydCA9IG5ldyBEYXRlKClcblxuICAgIGNvbnN0IHNpZ25hbCA9IEFib3J0U2lnbmFsLnRpbWVvdXQoMTAwMCAqIDYwICogMTUpXG4gICAgdHJ5IHtcbiAgICAgICAgY29uc3QgZW52ID0ge1xuICAgICAgICAgICAgW1wiWURCX0NPTk5FQ1RJT05fU1RSSU5HXCJdOiBZQkRfQ09OTkVDVElPTl9TVFJJTkcsXG4gICAgICAgICAgICBbXCJQUk9NRVRIRVVTX1BVU0hHQVRFV0FZX1VSTFwiXTogUFJPTUVUSEVVU19QVVNIR0FURVdBWV9VUkwsXG4gICAgICAgIH1cblxuICAgICAgICBhd2FpdCBQcm9taXNlLnJhY2UoW1xuICAgICAgICAgICAgLy8gUnVuIHdvcmtsb2FkXG4gICAgICAgICAgICBwcm9taXNpZnkoZXhlYykoZ2V0SW5wdXQoXCJXT1JLTE9BRF9SVU5ORVJcIiksIHsgc2lnbmFsLCBlbnYgfSlcbiAgICAgICAgICAgICAgICAudGhlbigoeyBzdGRlcnIgfSkgPT4ge1xuICAgICAgICAgICAgICAgICAgICBlcnJvcihzdGRlcnIsIHsgdGl0bGU6IFwiRXJyb3IgZHVyaW5nIHdvcmtsb2FkIHJ1blwiIH0pXG4gICAgICAgICAgICAgICAgfSlcbiAgICAgICAgICAgICAgICAuY2F0Y2goZXJyb3IpLFxuICAgICAgICAgICAgLy8gUnVuIGNoYW9zIHRlc3RpbmdcbiAgICAgICAgICAgIHByb21pc2lmeShleGVjKShnZXRJbnB1dChcIkNIQU9TX1RFU1RfUlVOTkVSXCIpLCB7IHNpZ25hbCwgZW52IH0pXG4gICAgICAgICAgICAgICAgLnRoZW4oKHsgc3RkZXJyIH0pID0+IHtcbiAgICAgICAgICAgICAgICAgICAgZXJyb3Ioc3RkZXJyLCB7IHRpdGxlOiBcIkVycm9yIGR1cmluZyBjaGFvcyB0ZXN0IHJ1blwiIH0pXG4gICAgICAgICAgICAgICAgfSlcbiAgICAgICAgICAgICAgICAuY2F0Y2goZXJyb3IpLFxuICAgICAgICBdKVxuXG4gICAgICAgIEFib3J0U2lnbmFsLmFib3J0KClcbiAgICB9IGNhdGNoIChlcnIpIHtcbiAgICAgICAgaWYgKGVyciAhPSBzaWduYWwucmVhc29uKSB7XG4gICAgICAgICAgICBzZXRGYWlsZWQoZXJyIGFzIEVycm9yKVxuICAgICAgICB9XG4gICAgfVxuXG4gICAgbGV0IGVuZCA9IG5ldyBEYXRlKClcblxuICAgIGxldCBiYXNlTWV0cmljczogV2VsbGtub3duTWV0cmljcyB8IHVuZGVmaW5lZCA9IHVuZGVmaW5lZDtcbiAgICBsZXQgaGVhZE1ldHJpY3M6IFdlbGxrbm93bk1ldHJpY3MgfCB1bmRlZmluZWQgPSB1bmRlZmluZWQ7XG5cbiAgICAvLyAyLjEgUHVsbCBQcm9tZXRoZXVzIE1ldHJpY3NcbiAgICBpZiAoaGVhZCkge1xuICAgICAgICBoZWFkTWV0cmljcyA9IGF3YWl0IGNvbGxlY3RQcm9tZXRoZXVzKHN0YXJ0LCBlbmQpXG4gICAgfSBlbHNlIHtcbiAgICAgICAgYmFzZU1ldHJpY3MgPSBhd2FpdCBjb2xsZWN0UHJvbWV0aGV1cyhzdGFydCwgZW5kKVxuICAgIH1cblxuICAgIC8vIDMuMiBTdG9yZSBpdCBhcyBhbiBhcnRpZmFjdFxuICAgIGxldCBhcnRpZmFjdCA9IG5ldyBEZWZhdWx0QXJ0aWZhY3RDbGllbnQoKVxuICAgIGxldCBhcnRpZmFjdFBhdGggPSBqb2luKHRtcERpciwgXCJtZXRyaWNzLmpzb25cIilcblxuICAgIGF3YWl0IHdyaXRlRmlsZShhcnRpZmFjdFBhdGgsIEpTT04uc3RyaW5naWZ5KGhlYWRNZXRyaWNzIHx8IGJhc2VNZXRyaWNzKSwgeyBlbmNvZGluZzogXCJ1dGYtOFwiIH0pXG4gICAgYXdhaXQgYXJ0aWZhY3QudXBsb2FkQXJ0aWZhY3QoYHNsby0ke2hlYWQgfHwgYmFzZX1gLCBbYXJ0aWZhY3RQYXRoXSwgdG1wRGlyLCB7IHJldGVudGlvbkRheXM6IGlzTWFpbiA/IDcgOiAxIH0pXG5cbiAgICAvLyAzLjEgU3RvcCBZREJcbiAgICBhd2FpdCBwcm9taXNpZnkoZXhlYykoYGRvY2tlciBjb21wb3NlIC1mICR7Y29tcG9zZUZpbGVQYXRofSBkb3duYClcblxuICAgIGlmICghaGVhZCkge1xuICAgICAgICByZXR1cm5cbiAgICB9XG5cbiAgICAvLyA0LiBQdWJsaXNoIHJlcG9ydFxuXG4gICAgLy8gNC4xIERvd25sb2FkIG1ldHJpY3MgZm9yIGJhc2UgYnJhbmNoIChtYWluKVxuICAgIGxldCB7IGFydGlmYWN0OiBiYXNlQXJ0aWZhY3QgfSA9IGF3YWl0IGFydGlmYWN0LmdldEFydGlmYWN0KGBzbG8tJHtiYXNlfWAsIHtcbiAgICAgICAgZmluZEJ5OiB7XG4gICAgICAgICAgICB0b2tlbjogZ2V0SW5wdXQoXCJHSVRIVUJfVE9LRU5cIiksXG4gICAgICAgICAgICB3b3JrZmxvd1J1bklkOiBjb250ZXh0LnJ1bklkLFxuICAgICAgICAgICAgcmVwb3NpdG9yeU93bmVyOiBjb250ZXh0LnJlcG8ub3duZXIsXG4gICAgICAgICAgICByZXBvc2l0b3J5TmFtZTogY29udGV4dC5yZXBvLnJlcG8sXG4gICAgICAgIH1cbiAgICB9KTtcblxuICAgIGNvbnNvbGUubG9nKHsgYmFzZUFydGlmYWN0IH0pXG5cbiAgICBpZiAoYmFzZUFydGlmYWN0KSB7XG4gICAgICAgIGxldCB7IGRvd25sb2FkUGF0aCB9ID0gYXdhaXQgYXJ0aWZhY3QuZG93bmxvYWRBcnRpZmFjdChiYXNlQXJ0aWZhY3QuaWQsIHtcbiAgICAgICAgICAgIHBhdGg6IHRtcERpcixcbiAgICAgICAgICAgIGZpbmRCeToge1xuICAgICAgICAgICAgICAgIHRva2VuOiBnZXRJbnB1dChcIkdJVEhVQl9UT0tFTlwiKSxcbiAgICAgICAgICAgICAgICB3b3JrZmxvd1J1bklkOiBjb250ZXh0LnJ1bklkLFxuICAgICAgICAgICAgICAgIHJlcG9zaXRvcnlPd25lcjogY29udGV4dC5yZXBvLm93bmVyLFxuICAgICAgICAgICAgICAgIHJlcG9zaXRvcnlOYW1lOiBjb250ZXh0LnJlcG8ucmVwbyxcbiAgICAgICAgICAgIH0sXG4gICAgICAgIH0pXG5cbiAgICAgICAgY29uc29sZS5sb2coeyBkb3dubG9hZFBhdGggfSlcblxuICAgICAgICBiYXNlTWV0cmljcyA9IEpTT04ucGFyc2UoYXdhaXQgcmVhZEZpbGUoZG93bmxvYWRQYXRoISwgXCJ1dGY4XCIpKVxuICAgIH1cblxuICAgIC8vIDQuMiBNZXJnZSBjdXJyZW50IG1ldHJpY3MgYW5kIGJhc2UgYnJhbmNoIG1ldHJpY3NcbiAgICBsZXQgY2hhcnRzOiBXZWxsa25vd25DaGFydHMgPSB7XG4gICAgICAgIGF2YWlsYWJpbGl0eVJlYWQ6IFtdLFxuICAgICAgICBhdmFpbGFiaWxpdHlXcml0ZTogW10sXG4gICAgICAgIHRocm91Z2hwdXRSZWFkOiBbXSxcbiAgICAgICAgdGhyb3VnaHB1dFdyaXRlOiBbXSxcbiAgICAgICAgbGF0ZW5jeVJlYWQ6IFtdLFxuICAgICAgICBsYXRlbmN5V3JpdGU6IFtdLFxuICAgIH1cblxuICAgIGlmIChoZWFkTWV0cmljcykge1xuICAgICAgICBjaGFydHMuYXZhaWxhYmlsaXR5UmVhZC5wdXNoKGhlYWRNZXRyaWNzLmF2YWlsYWJpbGl0eVJlYWQpXG4gICAgICAgIGNoYXJ0cy5hdmFpbGFiaWxpdHlXcml0ZS5wdXNoKGhlYWRNZXRyaWNzLmF2YWlsYWJpbGl0eVdyaXRlKVxuICAgICAgICBjaGFydHMudGhyb3VnaHB1dFJlYWQucHVzaChoZWFkTWV0cmljcy50aHJvdWdocHV0UmVhZClcbiAgICAgICAgY2hhcnRzLnRocm91Z2hwdXRXcml0ZS5wdXNoKGhlYWRNZXRyaWNzLnRocm91Z2hwdXRXcml0ZSlcbiAgICAgICAgY2hhcnRzLmxhdGVuY3lSZWFkLnB1c2goaGVhZE1ldHJpY3MubGF0ZW5jeVJlYWQpXG4gICAgICAgIGNoYXJ0cy5sYXRlbmN5V3JpdGUucHVzaChoZWFkTWV0cmljcy5sYXRlbmN5V3JpdGUpXG4gICAgfVxuXG4gICAgaWYgKGJhc2VNZXRyaWNzKSB7XG4gICAgICAgIGNoYXJ0cy5hdmFpbGFiaWxpdHlSZWFkLnB1c2goYmFzZU1ldHJpY3MuYXZhaWxhYmlsaXR5UmVhZClcbiAgICAgICAgY2hhcnRzLmF2YWlsYWJpbGl0eVdyaXRlLnB1c2goYmFzZU1ldHJpY3MuYXZhaWxhYmlsaXR5V3JpdGUpXG4gICAgICAgIGNoYXJ0cy50aHJvdWdocHV0UmVhZC5wdXNoKGJhc2VNZXRyaWNzLnRocm91Z2hwdXRSZWFkKVxuICAgICAgICBjaGFydHMudGhyb3VnaHB1dFdyaXRlLnB1c2goYmFzZU1ldHJpY3MudGhyb3VnaHB1dFdyaXRlKVxuICAgICAgICBjaGFydHMubGF0ZW5jeVJlYWQucHVzaChiYXNlTWV0cmljcy5sYXRlbmN5UmVhZClcbiAgICAgICAgY2hhcnRzLmxhdGVuY3lXcml0ZS5wdXNoKGJhc2VNZXRyaWNzLmxhdGVuY3lXcml0ZSlcbiAgICB9XG5cbiAgICBsZXQgeyBkYXRhIH0gPSBhd2FpdCBnZXRPY3Rva2l0KGdldElucHV0KFwiR0lUSFVCX1RPS0VOXCIpKS5yZXN0LnJlcG9zLmxpc3RQdWxsUmVxdWVzdHNBc3NvY2lhdGVkV2l0aENvbW1pdCh7XG4gICAgICAgIGNvbW1pdF9zaGE6IGNvbnRleHQuc2hhLFxuICAgICAgICBvd25lcjogY29udGV4dC5yZXBvLm93bmVyLFxuICAgICAgICByZXBvOiBjb250ZXh0LnJlcG8ucmVwbyxcbiAgICB9KVxuXG4gICAgZm9yIChsZXQgeyBudW1iZXIgfSBvZiBkYXRhKSB7XG4gICAgICAgIGNvbnN0IHByID0gYXdhaXQgZ2V0T2N0b2tpdChnZXRJbnB1dChcIkdJVEhVQl9UT0tFTlwiKSkucmVzdC5wdWxscy5nZXQoe1xuICAgICAgICAgICAgb3duZXI6IGNvbnRleHQucmVwby5vd25lcixcbiAgICAgICAgICAgIHJlcG86IGNvbnRleHQucmVwby5yZXBvLFxuICAgICAgICAgICAgcHVsbF9udW1iZXI6IG51bWJlcixcbiAgICAgICAgfSkudGhlbihSID0+IFIuZGF0YSlcblxuICAgICAgICBhd2FpdCBnZXRPY3Rva2l0KGdldElucHV0KFwiR0lUSFVCX1RPS0VOXCIpKS5yZXN0Lmlzc3Vlcy5jcmVhdGVDb21tZW50KHtcbiAgICAgICAgICAgIG93bmVyOiBjb250ZXh0LnJlcG8ub3duZXIsXG4gICAgICAgICAgICByZXBvOiBjb250ZXh0LnJlcG8ucmVwbyxcbiAgICAgICAgICAgIGlzc3VlX251bWJlcjogcHIubnVtYmVyLFxuICAgICAgICAgICAgYm9keTogYXdhaXQgY3JlYXRlUmVwb3J0KGNoYXJ0cylcbiAgICAgICAgfSlcbiAgICB9XG59XG4iLAogICAgIi8vIFRoaXMgc2NyaXB0cyBnZW5lcmF0ZSBjb21wb3NlIGZpbGVcbmltcG9ydCBmcyBmcm9tICdub2RlOmZzL3Byb21pc2VzJztcbmltcG9ydCBwYXRoIGZyb20gJ25vZGU6cGF0aCc7XG5pbXBvcnQgeyBvayB9IGZyb20gJ25vZGU6YXNzZXJ0JztcbmltcG9ydCB7IFlEQl9HUlBDX1BPUlQsIFlEQl9NT05fUE9SVCwgWURCX0lDX1BPUlQsIFlEQl9URU5BTlQsIFlEQl9FTkRQT0lOVCB9IGZyb20gJy4vY29uc3RhbnRzJztcbmltcG9ydCBZREJfQ09ORklHX0ZJTEUgZnJvbSBcIi4vY29uZmlncy95ZGIueWFtbFwiIHdpdGggeyB0eXBlOiBcInRleHRcIiB9O1xuaW1wb3J0IFBST01FVEhFVVNfQ09ORklHX0ZJTEUgZnJvbSBcIi4vY29uZmlncy9wcm9tZXRoZXVzLnlhbWxcIiB3aXRoIHsgdHlwZTogXCJ0ZXh0XCIgfTtcblxuLy8gR2VuZXJhdGUgWURCIFN0YXRpYyBOb2RlXG5sZXQgZ2VuZXJhdGVTdGF0aWNOb2RlID0gKCkgPT4gLyoqIFlBTUwgKi9gXG4gIHN0YXRpYy0wOlxuICAgIDw8OiAqeWRiLWNvbW1vblxuICAgIGNvbnRhaW5lcl9uYW1lOiB5ZGItc3RhdGljLTBcbiAgICBjb21tYW5kOlxuICAgICAgLSAvb3B0L3lkYi9iaW4veWRiZFxuICAgICAgLSBzZXJ2ZXJcbiAgICAgIC0gLS1ncnBjLXBvcnRcbiAgICAgIC0gXCIke1lEQl9HUlBDX1BPUlR9XCJcbiAgICAgIC0gLS1tb24tcG9ydFxuICAgICAgLSBcIiR7WURCX01PTl9QT1JUfVwiXG4gICAgICAtIC0taWMtcG9ydFxuICAgICAgLSBcIiR7WURCX0lDX1BPUlR9XCJcbiAgICAgIC0gLS15YW1sLWNvbmZpZ1xuICAgICAgLSAvb3B0L3lkYi9jZmcvY29uZmlnLnlhbWxcbiAgICAgIC0gLS1ub2RlXG4gICAgICAtIHN0YXRpY1xuICAgICAgLSAtLWxhYmVsXG4gICAgICAtIGRlcGxveW1lbnQ9ZG9ja2VyXG4gICAgcG9ydHM6XG4gICAgICAtICR7WURCX0dSUENfUE9SVH06JHtZREJfR1JQQ19QT1JUfVxuICAgICAgLSAke1lEQl9NT05fUE9SVH06JHtZREJfTU9OX1BPUlR9XG4gICAgICAtICR7WURCX0lDX1BPUlR9OiR7WURCX0lDX1BPUlR9XG4gICAgaGVhbHRoY2hlY2s6XG4gICAgICB0ZXN0OiBiYXNoIC1jIFwiZXhlYyA2PD4gL2Rldi90Y3AvbG9jYWxob3N0LyR7WURCX0dSUENfUE9SVH1cIlxuICAgICAgaW50ZXJ2YWw6IDEwc1xuICAgICAgdGltZW91dDogMXNcbiAgICAgIHJldHJpZXM6IDNcbiAgICAgIHN0YXJ0X3BlcmlvZDogMzBzXG4gICAgZGVwbG95OlxuICAgICAgPDw6ICp5ZGItZGVwbG95XG5cbiAgc3RhdGljLWluaXQ6XG4gICAgPDw6ICp5ZGItY29tbW9uXG4gICAgcmVzdGFydDogb24tZmFpbHVyZVxuICAgIGNvbnRhaW5lcl9uYW1lOiB5ZGItc3RhdGljLWluaXRcbiAgICBjb21tYW5kOlxuICAgICAgLSAvb3B0L3lkYi9iaW4veWRiZFxuICAgICAgLSAtc1xuICAgICAgLSAke1lEQl9FTkRQT0lOVH1cbiAgICAgIC0gYWRtaW5cbiAgICAgIC0gYmxvYnN0b3JhZ2VcbiAgICAgIC0gY29uZmlnXG4gICAgICAtIGluaXRcbiAgICAgIC0gLS15YW1sLWZpbGVcbiAgICAgIC0gL29wdC95ZGIvY2ZnL2NvbmZpZy55YW1sXG4gICAgZGVwZW5kc19vbjpcbiAgICAgIHN0YXRpYy0wOlxuICAgICAgICBjb25kaXRpb246IHNlcnZpY2VfaGVhbHRoeVxuXG4gIHRlbmFudC1pbml0OlxuICAgIDw8OiAqeWRiLWNvbW1vblxuICAgIHJlc3RhcnQ6IG9uLWZhaWx1cmVcbiAgICBjb250YWluZXJfbmFtZTogeWRiLXRlbmFudC1pbml0XG4gICAgY29tbWFuZDpcbiAgICAgIC0gL29wdC95ZGIvYmluL3lkYmRcbiAgICAgIC0gLXNcbiAgICAgIC0gJHtZREJfRU5EUE9JTlR9XG4gICAgICAtIGFkbWluXG4gICAgICAtIGRhdGFiYXNlXG4gICAgICAtICR7WURCX1RFTkFOVH1cbiAgICAgIC0gY3JlYXRlXG4gICAgICAtIHNzZDoxXG4gICAgZGVwZW5kc19vbjpcbiAgICAgIHN0YXRpYy1pbml0OlxuICAgICAgICBjb25kaXRpb246IHNlcnZpY2VfY29tcGxldGVkX3N1Y2Nlc3NmdWxseVxuYC5zbGljZSgxKVxuXG4vLyBHZW5lcmF0ZSBZREIgRHluYW1pYyBOb2RlXG5sZXQgZ2VuZXJhdGVEeW5hbWljTm9kZSA9IChpZHg6IG51bWJlcikgPT4gLyoqIFlBTUwgKi9gXG4gIGR5bmFtaWMtJHtpZHh9OlxuICAgIDw8OiAqeWRiLWNvbW1vblxuICAgIGNvbnRhaW5lcl9uYW1lOiB5ZGItZHluYW1pYy0ke2lkeH1cbiAgICBjb21tYW5kOlxuICAgICAgLSAvb3B0L3lkYi9iaW4veWRiZFxuICAgICAgLSBzZXJ2ZXJcbiAgICAgIC0gLS1ncnBjLXBvcnRcbiAgICAgIC0gXCIke1lEQl9HUlBDX1BPUlQgKyBpZHh9XCJcbiAgICAgIC0gLS1tb24tcG9ydFxuICAgICAgLSBcIiR7WURCX01PTl9QT1JUICsgaWR4fVwiXG4gICAgICAtIC0taWMtcG9ydFxuICAgICAgLSBcIiR7WURCX0lDX1BPUlQgKyBpZHh9XCJcbiAgICAgIC0gLS15YW1sLWNvbmZpZ1xuICAgICAgLSAvb3B0L3lkYi9jZmcvY29uZmlnLnlhbWxcbiAgICAgIC0gLS10ZW5hbnRcbiAgICAgIC0gJHtZREJfVEVOQU5UfVxuICAgICAgLSAtLW5vZGUtYnJva2VyXG4gICAgICAtICR7WURCX0VORFBPSU5UfVxuICAgICAgLSAtLWxhYmVsXG4gICAgICAtIGRlcGxveW1lbnQ9ZG9ja2VyXG4gICAgcG9ydHM6XG4gICAgICAtICR7WURCX0dSUENfUE9SVCArIGlkeH06JHtZREJfR1JQQ19QT1JUICsgaWR4fVxuICAgICAgLSAke1lEQl9NT05fUE9SVCArIGlkeH06JHtZREJfTU9OX1BPUlQgKyBpZHh9XG4gICAgICAtICR7WURCX0lDX1BPUlQgKyBpZHh9OiR7WURCX0lDX1BPUlQgKyBpZHh9XG4gICAgaGVhbHRoY2hlY2s6XG4gICAgICB0ZXN0OiBiYXNoIC1jIFwiZXhlYyA2PD4gL2Rldi90Y3AvbG9jYWxob3N0LyR7WURCX0dSUENfUE9SVCArIGlkeH1cIlxuICAgICAgaW50ZXJ2YWw6IDEwc1xuICAgICAgdGltZW91dDogMXNcbiAgICAgIHJldHJpZXM6IDNcbiAgICAgIHN0YXJ0X3BlcmlvZDogMzBzXG4gICAgZGVwZW5kc19vbjpcbiAgICAgIHN0YXRpYy0wOlxuICAgICAgICBjb25kaXRpb246IHNlcnZpY2VfaGVhbHRoeVxuICAgICAgc3RhdGljLWluaXQ6XG4gICAgICAgIGNvbmRpdGlvbjogc2VydmljZV9jb21wbGV0ZWRfc3VjY2Vzc2Z1bGx5XG4gICAgICB0ZW5hbnQtaW5pdDpcbiAgICAgICAgY29uZGl0aW9uOiBzZXJ2aWNlX2NvbXBsZXRlZF9zdWNjZXNzZnVsbHlcbiAgICBkZXBsb3k6XG4gICAgICA8PDogKnlkYi1kZXBsb3lcbmAuc2xpY2UoMSlcblxuLy8gR2VuZXJhdGUgTW9uaXRvcmluZ1xubGV0IGdlbmVyYXRlTW9uaXRvcmluZyA9ICgpID0+IC8qKiBZQU1MICovYFxuICBwcm9tZXRoZXVzOlxuICAgIGltYWdlOiBwcm9tL3Byb21ldGhldXNcbiAgICByZXN0YXJ0OiB1bmxlc3Mtc3RvcHBlZFxuICAgIDw8OiAqcnVudGltZVxuICAgIHBvcnRzOlxuICAgICAgLSBcIjkwOTA6OTA5MFwiXG4gICAgdm9sdW1lczpcbiAgICAgIC0gLi9wcm9tZXRoZXVzLnltbDovZXRjL3Byb21ldGhldXMvcHJvbWV0aGV1cy55bWxcbiAgICBkZXBsb3k6ICZtb25pdG9yaW5nLWRlcGxveVxuICAgICAgcmVzb3VyY2VzOlxuICAgICAgICBsaW1pdHM6XG4gICAgICAgICAgY3B1czogJzAuMSdcbiAgICAgICAgICBtZW1vcnk6IDEwMDBNXG4gICAgICAgIHJlc2VydmF0aW9uczpcbiAgICAgICAgICBjcHVzOiAnMC4wMDEnXG4gICAgICAgICAgbWVtb3J5OiA1ME1cblxuICBwcm9tZXRoZXVzLXB1c2hnYXRld2F5OlxuICAgIGltYWdlOiBwcm9tL3B1c2hnYXRld2F5XG4gICAgcmVzdGFydDogdW5sZXNzLXN0b3BwZWRcbiAgICA8PDogKnJ1bnRpbWVcbiAgICBwb3J0czpcbiAgICAgIC0gXCI5MDkxOjkwOTFcIlxuICAgIG5ldHdvcmtfbW9kZTogaG9zdFxuICAgIGRlcGxveTpcbiAgICAgIDw8OiAqbW9uaXRvcmluZy1kZXBsb3lcbmAuc2xpY2UoMSlcblxuLy8gR2VuZXJhdGUgQ29tcG9zZVxubGV0IGdlbmVyYXRlQ29tcG9zZUZpbGUgPSAoeWRiRGF0YWJhc2VOb2RlQ291bnQ6IG51bWJlcikgPT4gLyoqIFlBTUwgKi9gIyBDb2RlIGdlbmVyYXRlZCBieSBHaXRodWIgQWN0aW9uOyBETyBOT1QgRURJVC5cblxueC1ydW50aW1lOiAmcnVudGltZVxuICBwbGF0Zm9ybTogbGludXgvYW1kNjRcbiAgcHJpdmlsZWdlZDogdHJ1ZVxuICBuZXR3b3JrX21vZGU6IGhvc3RcblxueC1ub2RlOiAmeWRiLWNvbW1vblxuICBpbWFnZTogY3IueWFuZGV4L2NycHRxb251b2RmNTFrZGo3YTdkL3lkYjoyNC4yLjdcbiAgcmVzdGFydDogYWx3YXlzXG4gIGhvc3RuYW1lOiBsb2NhbGhvc3RcbiAgPDw6ICpydW50aW1lXG4gIHZvbHVtZXM6XG4gICAgLSAuL3lkYi55YW1sOi9vcHQveWRiL2NmZy9jb25maWcueWFtbFxuXG54LWRlcGxveTogJnlkYi1kZXBsb3lcbiAgcmVzdGFydF9wb2xpY3k6XG4gICAgY29uZGl0aW9uOiBhbnlcbiAgcmVzb3VyY2VzOlxuICAgIGxpbWl0czpcbiAgICAgIGNwdXM6ICcxJ1xuICAgICAgbWVtb3J5OiAxMDAwTVxuICAgIHJlc2VydmF0aW9uczpcbiAgICAgIGNwdXM6ICcwLjEnXG4gICAgICBtZW1vcnk6IDI1ME1cblxubmFtZTogeWRiXG5cbnNlcnZpY2VzOlxuJHtnZW5lcmF0ZVN0YXRpY05vZGUoKX1cbiR7QXJyYXkuZnJvbSh7IGxlbmd0aDogeWRiRGF0YWJhc2VOb2RlQ291bnQgfSwgKF8sIGkpID0+IGkgKyAxKS5tYXAoZ2VuZXJhdGVEeW5hbWljTm9kZSkuam9pbignXFxuJyl9XG4ke2dlbmVyYXRlTW9uaXRvcmluZygpfVxuYDtcblxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIHByZXBhcmVEZXBsb3lDb25maWdzKHRtcERpcjogc3RyaW5nLCB5ZGJEYXRhYmFzZU5vZGVDb3VudDogbnVtYmVyID0gMyk6IFByb21pc2U8c3RyaW5nPiB7XG4gIC8vIFdyaXRlIGNvbmZpZ3NcbiAgYXdhaXQgZnMud3JpdGVGaWxlKHBhdGguam9pbih0bXBEaXIsICd5ZGIueWFtbCcpLCBZREJfQ09ORklHX0ZJTEUpO1xuICBhd2FpdCBmcy53cml0ZUZpbGUocGF0aC5qb2luKHRtcERpciwgJ3Byb21ldGhldXMueW1sJyksIFBST01FVEhFVVNfQ09ORklHX0ZJTEUpO1xuXG4gIC8vIFdyaXRlIGNvbXBvc2UgZmlsZVxuICBhd2FpdCBmcy53cml0ZUZpbGUocGF0aC5qb2luKHRtcERpciwgJ2NvbXBvc2UueWFtbCcpLCBnZW5lcmF0ZUNvbXBvc2VGaWxlKHlkYkRhdGFiYXNlTm9kZUNvdW50KSk7XG5cbiAgcmV0dXJuIHBhdGguam9pbih0bXBEaXIsICdjb21wb3NlLnlhbWwnKVxufVxuXG5pZiAoaW1wb3J0Lm1ldGEubWFpbikge1xuICBjb25zdCB0ZW1wRGlyZWN0b3J5ID0gcHJvY2Vzcy5lbnZbJ1JVTk5FUl9URU1QJ10gfHwgJydcbiAgb2sodGVtcERpcmVjdG9yeSwgJ0V4cGVjdGVkIFJVTk5FUl9URU1QIHRvIGJlIGRlZmluZWQnKVxuXG4gIHByZXBhcmVEZXBsb3lDb25maWdzKHRlbXBEaXJlY3RvcnkpXG59XG4iLAogICAgIi8vIFlEQiBTdGF0aWMgbm9kZSBjb25maWd1cmF0aW9uLiBQcmVmZXJlIGRvIG5vdCBlZGl0LiBJZiB5b3UgY2hhbmdlIGl0LCBtb2RpZnkgY29uZmlncy95ZGIueWFtbC5cbmV4cG9ydCBjb25zdCBZREJfR1JQQ19QT1JUID0gMjEzNVxuZXhwb3J0IGNvbnN0IFlEQl9NT05fUE9SVCA9IDg3NjVcbmV4cG9ydCBjb25zdCBZREJfSUNfUE9SVCA9IDE5MDAxXG5leHBvcnQgY29uc3QgWURCX1RFTkFOVCA9IFwiL1Jvb3QvdGVzdGRiXCJcblxuLy8gUGFzcyBpbnRvIHdvcmtsb2FkXG5leHBvcnQgY29uc3QgWURCX0VORFBPSU5UID0gYGdycGM6Ly9sb2NhbGhvc3Q6JHtZREJfR1JQQ19QT1JUfWBcbmV4cG9ydCBjb25zdCBZQkRfQ09OTkVDVElPTl9TVFJJTkcgPSBgJHtZREJfRU5EUE9JTlR9JHtZREJfVEVOQU5UfWBcblxuZXhwb3J0IGNvbnN0IFBST01FVEhFVVNfVVJMID0gXCJodHRwOi8vbG9jYWxob3N0OjkwOTBcIlxuZXhwb3J0IGNvbnN0IFBST01FVEhFVVNfUFVTSEdBVEVXQVlfVVJMID0gXCJodHRwOi8vbG9jYWxob3N0OjkwOTFcIlxuIiwKICAgICJpbXBvcnQgdHlwZSB7IENoYXJ0IH0gZnJvbSBcIi4vY2hhcnRcIlxuaW1wb3J0IHsgUFJPTUVUSEVVU19VUkwgfSBmcm9tIFwiLi9jb25zdGFudHNcIlxuXG5leHBvcnQgdHlwZSBQcm9tZXRoZXVzUXVlcnlSYW5nZVJlc3BvbnNlID0ge1xuICAgIFwic3RhdHVzXCI6IFwic3VjY2Vzc1wiIHwgXCJlcnJvclwiLFxuICAgIFwiZGF0YVwiOiB7XG4gICAgICAgIFwicmVzdWx0VHlwZVwiOiBcIm1hdHJpeFwiIHwgXCJ2ZWN0b3JcIiB8IFwic2NhbGFyXCIgfCBcInN0cmluZ1wiLFxuICAgICAgICBcInJlc3VsdFwiOiBDaGFydFxuICAgIH0sXG4gICAgXCJ3YXJuaW5nc1wiOiBzdHJpbmdbXSxcbiAgICBcImluZm9zXCI6IHN0cmluZ1tdLFxuICAgIFwiZXJyb3JcIjogc3RyaW5nLFxufVxuXG5mdW5jdGlvbiBxdWVyeVJhbmdlKHF1ZXJ5OiBzdHJpbmcsIHN0YXJ0OiBEYXRlLCBlbmQ6IERhdGUpIHtcbiAgICBsZXQgdXJsID0gbmV3IFVSTChcIi9hcGkvdjEvcXVlcnlfcmFuZ2VcIiwgUFJPTUVUSEVVU19VUkwpXG4gICAgdXJsLnNlYXJjaFBhcmFtcy5zZXQoXCJxdWVyeVwiLCBxdWVyeSlcbiAgICB1cmwuc2VhcmNoUGFyYW1zLnNldChcInN0YXJ0XCIsIE1hdGguY2VpbChzdGFydC5nZXRUaW1lKCkgLyAxMDAwKS50b1N0cmluZygpKVxuICAgIHVybC5zZWFyY2hQYXJhbXMuc2V0KFwiZW5kXCIsIE1hdGguZmxvb3IoZW5kLmdldFRpbWUoKSAvIDEwMDApLnRvU3RyaW5nKCkpXG4gICAgdXJsLnNlYXJjaFBhcmFtcy5zZXQoXCJzdGVwXCIsIFwiMVwiKVxuXG4gICAgcmV0dXJuIGZldGNoKHVybCkudGhlbihyID0+IHIuanNvbigpKSBhcyBQcm9taXNlPFByb21ldGhldXNRdWVyeVJhbmdlUmVzcG9uc2U+XG59XG5cbmNvbnN0IEFWQUlMQUJJTElUWSA9IChvcDogc3RyaW5nKSA9PiAvKiogUHJvbVFMICovIGAxMDAgKiBzdW0gYnkgKHJlZikgKGluY3JlYXNlKHNka19vcGVyYXRpb25zX3N1Y2Nlc3NfdG90YWx7b3BlcmF0aW9uX3R5cGU9XCIke29wfVwifVsyc10pKSAvIHN1bSBieSAocmVmKSAoaW5jcmVhc2Uoc2RrX29wZXJhdGlvbnNfdG90YWx7b3BlcmF0aW9uX3R5cGU9XCIke29wfVwifVsyc10pKWBcbmNvbnN0IFRIUk9VR0hQVVQgPSAob3A6IHN0cmluZykgPT4gLyoqIFByb21RTCAqLyBgc3VtIGJ5IChyZWYpIChyYXRlKHNka19vcGVyYXRpb25zX3RvdGFse29wZXJhdGlvbl90eXBlPVwiJHtvcH1cIn1bMnNdKSlgXG5jb25zdCBMQVRFTkNZID0gKG9wOiBzdHJpbmcpID0+IC8qKiBQcm9tUUwgKi8gYDEwMDAgKiBoaXN0b2dyYW1fcXVhbnRpbGUoMC45NSwgc3VtIGJ5KHJlZiwgbGUpIChyYXRlKHNka19vcGVyYXRpb25fbGF0ZW5jeV9zZWNvbmRzX2J1Y2tldHtvcGVyYXRpb25fdHlwZT1cIiR7b3B9XCJ9WzJzXSkpKWBcblxuZW51bSBPcGVyYXRpb25UeXBlIHtcbiAgICByZWFkID0gXCJyZWFkXCIsXG4gICAgd3JpdGUgPSBcIndyaXRlXCIsXG59XG5cbmV4cG9ydCB0eXBlIFdlbGxrbm93bk1ldHJpY3MgPSB7XG4gICAgYXZhaWxhYmlsaXR5UmVhZDogQ2hhcnRbbnVtYmVyXVxuICAgIGF2YWlsYWJpbGl0eVdyaXRlOiBDaGFydFtudW1iZXJdXG4gICAgdGhyb3VnaHB1dFJlYWQ6IENoYXJ0W251bWJlcl1cbiAgICB0aHJvdWdocHV0V3JpdGU6IENoYXJ0W251bWJlcl1cbiAgICBsYXRlbmN5UmVhZDogQ2hhcnRbbnVtYmVyXVxuICAgIGxhdGVuY3lXcml0ZTogQ2hhcnRbbnVtYmVyXVxufVxuXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gY29sbGVjdFByb21ldGhldXMoc3RhcnQ6IERhdGUsIGVuZDogRGF0ZSk6IFByb21pc2U8V2VsbGtub3duTWV0cmljcz4ge1xuICAgIGNvbnN0IGF2YWlsYWJpbGl0eVJlYWQgPSBhd2FpdCBxdWVyeVJhbmdlKEFWQUlMQUJJTElUWShPcGVyYXRpb25UeXBlLnJlYWQpLCBzdGFydCwgZW5kKVxuICAgIGNvbnN0IGF2YWlsYWJpbGl0eVdyaXRlID0gYXdhaXQgcXVlcnlSYW5nZShBVkFJTEFCSUxJVFkoT3BlcmF0aW9uVHlwZS53cml0ZSksIHN0YXJ0LCBlbmQpXG5cbiAgICBjb25zdCB0aHJvdWdocHV0UmVhZCA9IGF3YWl0IHF1ZXJ5UmFuZ2UoVEhST1VHSFBVVChPcGVyYXRpb25UeXBlLnJlYWQpLCBzdGFydCwgZW5kKVxuICAgIGNvbnN0IHRocm91Z2hwdXRXcml0ZSA9IGF3YWl0IHF1ZXJ5UmFuZ2UoVEhST1VHSFBVVChPcGVyYXRpb25UeXBlLndyaXRlKSwgc3RhcnQsIGVuZClcblxuICAgIGNvbnN0IGxhdGVuY3lSZWFkID0gYXdhaXQgcXVlcnlSYW5nZShMQVRFTkNZKE9wZXJhdGlvblR5cGUucmVhZCksIHN0YXJ0LCBlbmQpXG4gICAgY29uc3QgbGF0ZW5jeVdyaXRlID0gYXdhaXQgcXVlcnlSYW5nZShMQVRFTkNZKE9wZXJhdGlvblR5cGUud3JpdGUpLCBzdGFydCwgZW5kKVxuXG4gICAgcmV0dXJuIHtcbiAgICAgICAgYXZhaWxhYmlsaXR5UmVhZDogYXZhaWxhYmlsaXR5UmVhZC5kYXRhLnJlc3VsdFswXSxcbiAgICAgICAgYXZhaWxhYmlsaXR5V3JpdGU6IGF2YWlsYWJpbGl0eVdyaXRlLmRhdGEucmVzdWx0WzBdLFxuICAgICAgICB0aHJvdWdocHV0UmVhZDogdGhyb3VnaHB1dFJlYWQuZGF0YS5yZXN1bHRbMF0sXG4gICAgICAgIHRocm91Z2hwdXRXcml0ZTogdGhyb3VnaHB1dFdyaXRlLmRhdGEucmVzdWx0WzBdLFxuICAgICAgICBsYXRlbmN5UmVhZDogbGF0ZW5jeVJlYWQuZGF0YS5yZXN1bHRbMF0sXG4gICAgICAgIGxhdGVuY3lXcml0ZTogbGF0ZW5jeVdyaXRlLmRhdGEucmVzdWx0WzBdLFxuICAgIH1cbn1cbiIsCiAgICAiLy8gVGFibGVhdSAxMFxuZXhwb3J0IGNvbnN0IHBhbGV0dGUgPSBbXG4gICAgXCIjMkNBMDJDXCIsXG4gICAgXCIjMUY3N0I0XCIsXG4gICAgXCIjRDYyNzI4XCIsXG4gICAgXCIjRkY3RjBFXCIsXG4gICAgXCIjOTQ2N0JEXCIsXG4gICAgXCIjOEM1NjRCXCIsXG4gICAgXCIjRTM3N0MyXCIsXG4gICAgXCIjN0Y3RjdGXCIsXG4gICAgXCIjQkNCRDIyXCIsXG4gICAgXCIjMTdCRUNGXCJcbl1cbiIsCiAgICAiaW1wb3J0IHsgcGFsZXR0ZSBhcyBkZWZhdWx0UGFsZXR0ZSB9IGZyb20gXCIuL2NvbG9yc1wiO1xuXG50eXBlIFNlcmllcyA9IHtcbiAgICBcIm1ldHJpY1wiOiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+LFxuICAgIFwidmFsdWVzXCI6IFtudW1iZXIsIHN0cmluZ11bXSAvLyBbdGltZXN0YW1wIChzZWMpLCB2YWx1ZSAoZmxvYXQpXVxufVxuXG5leHBvcnQgdHlwZSBDaGFydCA9IFNlcmllc1tdXG5cbmV4cG9ydCB0eXBlIFdlbGxrbm93bkNoYXJ0cyA9IHtcbiAgICBhdmFpbGFiaWxpdHlSZWFkOiBDaGFydFxuICAgIGF2YWlsYWJpbGl0eVdyaXRlOiBDaGFydFxuICAgIHRocm91Z2hwdXRSZWFkOiBDaGFydFxuICAgIHRocm91Z2hwdXRXcml0ZTogQ2hhcnRcbiAgICBsYXRlbmN5UmVhZDogQ2hhcnRcbiAgICBsYXRlbmN5V3JpdGU6IENoYXJ0XG59XG5cbmV4cG9ydCBmdW5jdGlvbiByZW5kZXJDaGFydCh0aXRsZTogc3RyaW5nLCBjaGFydDogQ2hhcnQsIHBhbGV0dGUgPSBkZWZhdWx0UGFsZXR0ZSk6IHN0cmluZyB7XG4gICAgLy8gMS4gRmlsdGVyIHplcm9zXG4gICAgbGV0IG1pbkxlbmd0aCA9IE51bWJlci5QT1NJVElWRV9JTkZJTklUWTtcbiAgICBmb3IgKGNvbnN0IG1ldHJpYyBvZiBjaGFydCkge1xuICAgICAgICBtZXRyaWMudmFsdWVzID0gbWV0cmljLnZhbHVlcy5maWx0ZXIodiA9PiB2WzFdICE9ICcwJyk7XG4gICAgICAgIGlmIChtZXRyaWMudmFsdWVzLmxlbmd0aCA8IG1pbkxlbmd0aCkgbWluTGVuZ3RoID0gbWV0cmljLnZhbHVlcy5sZW5ndGg7XG4gICAgfVxuICAgIC8vIDIuIExpbWl0IHZhbHVlcyAoY291bnQpXG4gICAgZm9yIChjb25zdCBtZXRyaWMgb2YgY2hhcnQpIHtcbiAgICAgICAgLy8gU2tpcCBmaXJzdCB2YWx1ZXMgdGhlbiBhZGp1c3RpbmdcbiAgICAgICAgbWV0cmljLnZhbHVlcyA9IG1ldHJpYy52YWx1ZXMuc2xpY2UoLTEgKiBtaW5MZW5ndGgpO1xuICAgIH1cblxuICAgIGxldCBtaW4gPSBOdW1iZXIuUE9TSVRJVkVfSU5GSU5JVFk7XG4gICAgbGV0IG1heCA9IE51bWJlci5ORUdBVElWRV9JTkZJTklUWTtcblxuICAgIGxldCBsaW5lcyA9IFtdO1xuICAgIGZvciAoY29uc3Qgc2VyaWVzIG9mIGNoYXJ0KSB7XG4gICAgICAgIGxldCBsaW5lID0gW11cblxuICAgICAgICBmb3IgKGxldCBbLCB2YWx1ZV0gb2Ygc2VyaWVzLnZhbHVlcykge1xuICAgICAgICAgICAgbGV0IHYgPSBNYXRoLnJvdW5kKHBhcnNlRmxvYXQodmFsdWUpICogMTAwMCkgLyAxMDAwO1xuICAgICAgICAgICAgaWYgKGlzTmFOKHYpKSB7XG4gICAgICAgICAgICAgICAgdiA9IDA7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGxpbmUucHVzaCh2KTtcblxuICAgICAgICAgICAgaWYgKHYgPCBtaW4pIG1pbiA9IHY7XG4gICAgICAgICAgICBpZiAodiA+IG1heCkgbWF4ID0gdjtcbiAgICAgICAgfVxuXG4gICAgICAgIGxpbmVzLnB1c2goYGxpbmUgXCIke3Nlcmllcy5tZXRyaWNbXCJyZWZcIl19XCIgWyR7bGluZS5qb2luKCl9XWApO1xuICAgIH1cblxuICAgIHJldHVybiBgXFxgXFxgXFxgbWVybWFpZFxuLS0tXG5jb25maWc6XG4gICAgeHlDaGFydDpcbiAgICAgICAgd2lkdGg6IDEyMDBcbiAgICAgICAgaGVpZ2h0OiA0MDBcbiAgICB0aGVtZVZhcmlhYmxlczpcbiAgICAgICAgeHlDaGFydDpcbiAgICAgICAgICAgIHRpdGxlQ29sb3I6IFwiIzIyMlwiXG4gICAgICAgICAgICBiYWNrZ3JvdW5kQ29sb3I6IFwiI2ZmZlwiXG4gICAgICAgICAgICB4QXhpc0xpbmVDb2xvcjogXCIjMjIyXCJcbiAgICAgICAgICAgIHlBeGlzTGluZUNvbG9yOiBcIiMyMjJcIlxuICAgICAgICAgICAgcGxvdENvbG9yUGFsZXR0ZTogXCIke3BhbGV0dGUuam9pbigpfVwiXG4tLS1cbnh5Y2hhcnQtYmV0YVxuICAgIHRpdGxlIFwiJHt0aXRsZX1cIlxuICAgIHgtYXhpcyAwIC0tPiAxMFxuICAgIHktYXhpcyAke01hdGguZmxvb3IobWluICogMC45KX0gLS0+ICR7TWF0aC5mbG9vcihtYXggKiAxLjEpfVxuICAgICR7bGluZXMuam9pbihcIlxcbiAgICBcIil9XG5cXGBcXGBcXGBcbmBcbn1cbiIsCiAgICAiaW1wb3J0IHsgcmVuZGVyQ2hhcnQsIHR5cGUgV2VsbGtub3duQ2hhcnRzIH0gZnJvbSBcIi4vY2hhcnRcIjtcblxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGNyZWF0ZVJlcG9ydChjaGFydHM6IFdlbGxrbm93bkNoYXJ0cyk6IFByb21pc2U8c3RyaW5nPiB7XG4gICAgcmV0dXJuIGAjIFNMTyBUZXN0aW5nIDxpbWcgYWxpZ249XCJyaWdodFwiIGhlaWdodD1cIjM2XCIgc3JjPVwiaHR0cHM6Ly9pbWcuc2hpZWxkcy5pby9iYWRnZS/ijoctaGVhZC0lMjNGRjdGMEU/c3R5bGU9Zm9yLXRoZS1iYWRnZVwiPjxpbWcgYWxpZ249XCJyaWdodFwiIGhlaWdodD1cIjM2XCIgIHNyYz1cImh0dHBzOi8vaW1nLnNoaWVsZHMuaW8vYmFkZ2Uv4o6HLWJhc2UtJTIzMUY3N0I0P3N0eWxlPWZvci10aGUtYmFkZ2VcIj48aW1nIGFsaWduPVwicmlnaHRcIiBoZWlnaHQ9XCIzNlwiIHNyYz1cImh0dHBzOi8vaW1nLnNoaWVsZHMuaW8vYmFkZ2Uvc2RrLWdvLS1uYXRpdmUtLXF1ZXJ5LSUyM0UzNzdDMj9zdHlsZT1mb3ItdGhlLWJhZGdlXCI+XG5cbjxkZXRhaWxzPjxzdW1tYXJ5Pk9wZXJhdGlvbiBTdWNjZXNzIFJhdGU8L3N1bW1hcnk+XG4ke3JlbmRlckNoYXJ0KFwib3BlcmF0aW9uX3R5cGU9cmVhZFwiLCBjaGFydHMuYXZhaWxhYmlsaXR5UmVhZCl9XG5cbiR7cmVuZGVyQ2hhcnQoXCJvcGVyYXRpb25fdHlwZT13cml0ZVwiLCBjaGFydHMuYXZhaWxhYmlsaXR5V3JpdGUpfVxuPC9kZXRhaWxzPlxuXG48ZGV0YWlscz48c3VtbWFyeT5PcGVyYXRpb25zIFBlciBTZWNvbmQ8L3N1bW1hcnk+XG4ke3JlbmRlckNoYXJ0KFwib3BlcmF0aW9uX3R5cGU9cmVhZFwiLCBjaGFydHMudGhyb3VnaHB1dFJlYWQpfVxuXG4ke3JlbmRlckNoYXJ0KFwib3BlcmF0aW9uX3R5cGU9d3JpdGVcIiwgY2hhcnRzLnRocm91Z2hwdXRXcml0ZSl9XG48L2RldGFpbHM+XG5cbjxkZXRhaWxzPjxzdW1tYXJ5Pjk1dGggUGVyY2VudGlsZSBMYXRlbmN5PC9zdW1tYXJ5PlxuJHtyZW5kZXJDaGFydChcIm9wZXJhdGlvbl90eXBlPXJlYWRcIiwgY2hhcnRzLmxhdGVuY3lSZWFkKX1cblxuJHtyZW5kZXJDaGFydChcIm9wZXJhdGlvbl90eXBlPXdyaXRlXCIsIGNoYXJ0cy5sYXRlbmN5V3JpdGUpfVxuPC9kZXRhaWxzPlxuYFxufVxuIiwKICAgICJpbXBvcnQgeyBydW4gfSBmcm9tICcuL21haW4nXG5cbnJ1bigpXG4iCiAgXSwKICAibWFwcGluZ3MiOiAiOzs7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQUdBLFNBQU8sZUFBZSxVQUFTLGNBQWMsRUFBRSxPQUFPLEtBQUssQ0FBQztBQUM1RCxXQUFRLHNCQUFzQixTQUFRLGlCQUFzQjtBQUs1RCxXQUFTLGNBQWMsQ0FBQyxPQUFPO0FBQzNCLFFBQUksVUFB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QUEsSUFBUSxPQUFPO0FBQUEsSUFBUSxPQUFPO0FBQUEsSUFBUSxPQUFPO0FBQUEsSUFBUSxPQUFPO0FBQUEsSUFDbkUsT0FBTztBQUFBLElBQVEsT0FBTztBQUFBLElBQVEsT0FBTztBQUFBLElBQVEsT0FBTztBQUFBLElBQVEsT0FBTztBQUFBLElBQ25FLE9BQU87QUFBQSxJQUFRLE9BQU87QUFBQSxJQUFRLE9BQU87QUFBQSxJQUFRLE9BQU87QUFBQSxJQUFRLE9BQU87QUFBQSxJQUNuRSxPQUFPO0FBQUEsSUFBUSxPQUFPO0FBQUEsSUFBUSxPQUFPO0FBQUEsSUFBUSxPQUFPO0FBQUEsSUFBUSxPQUFPO0FBQUEsSUFDbkUsT0FBTztBQUFBLElBQVEsT0FBTztBQUFBLElBQVEsT0FBTztBQUFBLElBQVEsT0FBTztBQUFBLElBQVEsT0FBTztBQUFBLElBQ25FLE9BQU87QUFBQSxJQUFRLE9BQU87QUFBQSxJQUFRLE9BQU87QUFBQSxJQUFRLE9BQU87QUFBQSxJQUFRLE9BQU87QUFBQSxJQUNuRSxPQUFPO0FBQUEsSUFBUSxPQUFPO0FBQUEsSUFBUSxPQUFPO0FBQUEsSUFBUSxPQUFPO0FBQUEsSUFBUSxPQUFPO0FBQUEsSUFDbkUsT0FBTztBQUFBLElBQVEsT0FBTztBQUFBLElBQVEsT0FBTztBQUFBLElBQVEsT0FBTztBQUFBLElBQVEsT0FBTztBQUFBLElBQ25FLE9BQU87QUFBQSxJQUFRLE9BQU87QUFBQSxJQUFRLE9BQU87QUFBQSxJQUFRLE9BQU87QUFBQSxJQUFRLE9BQU87QUFBQSxJQUNuRSxPQUFPO0FBQUEsSUFBUSxPQUFPO0FBQUEsSUFBUSxPQUFPO0FBQUEsSUFBUSxPQUFPO0FBQUEsSUFBUSxPQUFPO0FBQUEsSUFDbkUsT0FBTztBQUFBLElBQVEsT0FBTztBQUFBLElBQVEsT0FBTztBQUFBLElBQVEsT0FBTztBQUFBLElBQVEsT0FBTztBQUFBLElBQ25FLE9BQU87QUFBQSxJQUFRLE9BQU87QUFBQSxJQUFRLE9BQU87QUFBQSxJQUFRLE9BQU87QUFBQSxJQUFRLE9BQU87QUFBQSxJQUNuRSxPQUFPO0FBQUEsSUFBUSxPQUFPO0FBQUEsSUFBUSxPQUFPO0FBQUEsSUFBUSxPQUFPO0FBQUEsSUFBUSxPQUFPO0FBQUEsSUFDbkUsT0FBTztBQUFBLElBQVEsT0FBTztBQUFBLElBQVEsT0FBTztBQUFBLElBQVEsT0FBTztBQUFBLElBQVEsT0FBTztBQUFBLElBQ25FLE9BQU87QUFBQSxJQUFRLE9BQU87QUFBQSxJQUFRLE9BQU87QUFBQSxJQUFRLE9BQU87QUFBQSxJQUFRLE9BQU87QUFBQSxJQUNuRSxPQUFPO0FBQUEsSUFBUSxPQUFPO0FBQUEsSUFBUSxPQUFPO0FBQUEsSUFBUSxPQUFPO0FBQUEsSUFBUSxPQUFPO0FBQUEsSUFDbkUsT0FBTztBQUFBLElBQVEsT0FBTztBQUFBLElBQVEsT0FBTztBQUFBLElBQVEsT0FBTztBQUFBLElBQVEsT0FBTztBQUFBLElBQ25FLE9BQU87QUFBQSxJQUFRLE9BQU87QUFBQSxJQUFRLE9BQU87QUFBQSxJQUFRLE9BQU87QUFBQSxJQUFRLE9BQU87QUFBQSxJQUNuRSxPQUFPO0FBQUEsSUFBUSxPQUFPO0FBQUEsSUFBUSxPQUFPO0FBQUEsSUFBUSxPQUFPO0FBQUEsSUFBUSxPQUFPO0FBQUEsSUFDbkUsT0FBTztBQUFBLElBQVEsT0FBTztBQUFBLElBQVEsT0FBTztBQUFBLElBQVEsT0FBTztBQUFBLElBQVEsT0FBTztBQUFBLElBQ25FLE9BQU87QUFBQSxJQUFRLE9BQU87QUFBQSxJQUFRLE9BQU87QUFBQSxJQUFRLE9BQU87QUFBQSxJQUFRLE9BQU87QUFBQSxJQUNuRSxPQUFPO0FBQUEsSUFBUSxPQUFPO0FBQUEsSUFBUSxPQUFPO0FBQUEsSUFBUSxPQUFPO0FBQUEsSUFBUSxPQUFPO0FBQUEsSUFDbkUsT0FBTztBQUFBLElBQVEsT0FBTztBQUFBLElBQVEsT0FBTztBQUFBLElBQVEsT0FBTztBQUFBLElBQVEsT0FBTztBQUFBLElBQ25FLE9BQU87QUFBQSxJQUFRLE9BQU87QUFBQSxJQUFRLE9BQU87QUFBQSxJQUFRLE9BQU87QUFBQSxJQUFRLE9BQU87QUFBQSxJQUNuRSxPQUFPO0FBQUEsSUFBUSxPQUFPO0FBQUEsSUFBUSxPQUFPO0FBQUEsSUFBUSxPQUFPO0FBQUEsSUFBUSxPQUFPO0FBQUEsSUFDbkUsT0FBTztBQUFBLElBQVEsT0FBTztBQUFBLElBQVEsT0FBTztBQUFBLElBQVEsT0FBTztBQUFBLElBQVEsT0FBTztBQUFBLElBQ25FLE9BQU87QUFBQSxJQUFRLE9BQU87QUFBQSxJQUFRLE9BQU87QUFBQSxJQUFRLE9BQU87QUFBQSxJQUFRLE9BQU87QUFBQSxJQUNuRSxPQUFPO0FBQUEsSUFBUSxPQUFPO0FBQUEsSUFBUSxPQUFPO0FBQUEsSUFBUSxPQUFPO0FBQUEsSUFBUSxPQUFPO0FBQUEsSUFDbkUsT0FBTztBQUFBLElBQVEsT0FBTztBQUFBLElBQVEsT0FBTztBQUFBLElBQVEsT0FBTztBQUFBLElBQVEsT0FBTztBQUFBLElBQ25FLE9BQU87QUFBQSxJQUFRLE9BQU87QUFBQSxJQUFRLE9BQU87QUFBQSxJQUFRLE9BQU87QUFBQSxJQUFRLE9BQU87QUFBQSxJQUNuRSxPQUFPO0FBQUEsSUFBUSxPQUFPO0FBQUEsSUFBUSxPQUFPO0FBQUEsSUFBUSxPQUFPO0FBQUEsSUFBUSxPQUFPO0FBQUEsSUFDbkUsT0FBTztBQUFBLElBQVEsT0FBTztBQUFBLElBQVEsT0FBTztBQUFBLElBQVEsT0FBTztBQUFBLElBQVEsT0FBTztBQUFBLElBQ25FLE9BQU87QUFBQSxJQUFRLE9BQU87QUFBQSxJQUFRLE9BQU87QUFBQSxJQUFRLE9BQU87QUFBQSxJQUFRLE9BQU87QUFBQSxJQUNuRSxPQUFPO0FBQUEsSUFBUSxPQUFPO0FBQUEsSUFBUSxPQUFPO0FBQUEsSUFBUSxPQUFPO0FBQUEsSUFBUSxPQUFPO0FBQUEsSUFDbkUsT0FBTztBQUFBLElBQVEsT0FBTztBQUFBLElBQVEsT0FBTztBQUFBLElBQVEsT0FBTztBQUFBLElBQVEsT0FBTztBQUFBLElBQ25FLE9BQU87QUFBQSxJQUFRLE9BQU87QUFBQSxJQUFRLE9BQU87QUFBQSxJQUFRLE9BQU87QUFBQSxJQUFRLE9BQU87QUFBQSxJQUNuRSxPQUFPO0FBQUEsSUFBUSxPQUFPO0FBQUEsSUFBUSxPQUFPO0FBQUEsSUFBUSxPQUFPO0FBQUEsSUFBUSxPQUFPO0FBQUEsSUFDbkUsT0FBTztBQUFBLElBQVEsT0FBTztBQUFBLElBQVEsT0FBTztBQUFBLElBQVEsT0FBTztBQUFBLElBQVEsT0FBTztBQUFBLElBQ25FLE9BQU87QUFBQSxJQUFRLE9BQU87QUFBQSxJQUFRLE9BQU87QUFBQSxJQUFRLE9BQU87QUFBQSxJQUFRLE9BQU87QUFBQSxJQUNuRSxPQUFPO0FBQUEsSUFBUSxPQUFPO0FBQUEsSUFBUSxPQUFPO0FBQUEsSUFBUSxPQUFPO0FBQUEsSUFBUSxPQUFPO0FBQUEsSUFDbkUsT0FBTztBQUFBLElBQVEsT0FBTztBQUFBLElBQVEsT0FBTztBQUFBLElBQVEsT0FBTztBQUFBLElBQVEsT0FBTztBQUFBLElBQ25FLE9BQU87QUFBQSxJQUFRLE9BQU87QUFBQSxJQUFRLE9BQU87QUFBQSxJQUFRLE9BQU87QUFBQSxJQUFRLE9BQU87QUFBQSxJQUNuRSxPQUFPO0FBQUEsSUFBUSxPQUFPO0FBQUEsSUFBUSxPQUFPO0FBQUEsSUFBUSxPQUFPO0FBQUEsSUFBUSxPQUFPO0FBQUEsSUFDbkUsT0FBTztBQUFBLElBQVEsT0FBTztBQUFBLElBQVEsT0FBTztBQUFBLElBQVEsT0FBTztBQUFBLElBQVEsT0FBTztBQUFBLElBQ25FLE9BQU87QUFBQSxJQUFRLE9BQU87QUFBQSxJQUFRLE9BQU87QUFBQSxJQUFRLE9BQU87QUFBQSxJQUFRLE9BQU87QUFBQSxJQUNuRSxPQUFPO0FBQUEsSUFBUSxPQUFPO0FBQUEsSUFBUSxPQUFPO0FBQUEsSUFBUSxPQUFPO0FBQUEsSUFBUSxPQUFPO0FBQUEsSUFDbkUsT0FBTztBQUFBLElBQVEsT0FBTztBQUFBLElBQVEsT0FBTztBQUFBLElBQVEsT0FBTztBQUFBLElBQVEsT0FBTztBQUFBLElBQ25FLE9BQU87QUFBQSxJQUFRLE9BQU87QUFBQSxJQUFRLE9BQU87QUFBQSxJQUFRLE9BQU87QUFBQSxJQUFRLE9BQU87QUFBQSxJQUNuRSxPQUFPO0FBQUEsSUFBUSxPQUFPO0FBQUEsSUFBUSxPQUFPO0FBQUEsSUFBUSxPQUFPO0FBQUEsSUFBUSxPQUFPO0FBQUEsSUFDbkUsT0FBTztBQUFBLElBQVEsT0FBTztBQUFBLElBQVEsT0FBTztBQUFBLElBQVEsT0FBTztBQUFBLElBQVEsT0FBTztBQUFBLElBQ25FLE9BQU87QUFBQSxJQUFRLE9BQU87QUFBQSxJQUFRLE9BQU87QUFBQSxJQUFRLE9BQU87QUFBQSxJQUFRLE9BQU87QUFBQSxJQUNuRSxPQUFPO0FBQUEsSUFBUSxPQUFPO0FBQUEsSUFBUSxPQUFPO0FBQUEsSUFBUSxPQUFPO0FBQUEsSUFBUSxPQUFPO0FBQUEsSUFDbkUsT0FBTztBQUFBLElBQVEsT0FBTztBQUFBLElBQVEsT0FBTztBQUFBLElBQVEsT0FBTztBQUFBLElBQVEsT0FBTztBQUFBLElBQ25FLE9BQU87QUFBQSxJQUFRLE9BQU87QUFBQSxJQUFRLE9BQU87QUFBQSxJQUFRLE9BQU87QUFBQSxJQUFRLE9BQU87QUFBQSxJQUNuRSxPQUFPO0FBQUEsSUFBUSxPQUFPO0FBQUEsSUFBUSxPQUFPO0FBQUEsSUFBUSxPQUFPO0FBQUEsSUFBUSxPQUFPO0FBQUEsSUFDbkUsT0FBTztBQUFBLElBQVEsT0FBTztBQUFBLElBQVEsT0FBTztBQUFBLElBQVEsT0FBTztBQUFBLElBQVEsT0FBTztBQUFBLElBQ25FLE9BQU87QUFBQSxJQUFRLE9BQU87QUFBQSxJQUFRLE9BQU87QUFBQSxJQUFRLE9BQU87QUFBQSxJQUFRLE9BQU87QUFBQSxJQUNuRSxPQUFPO0FBQUEsSUFBUSxPQUFPO0FBQUEsSUFBUSxPQUFPO0FBQUEsSUFBUSxPQUFPO0FBQUEsSUFBUSxPQUFPO0FBQUEsSUFDbkUsT0FBTztBQUFBLElBQVEsT0FBTztBQUFBLElBQVEsT0FBTztBQUFBLElBQVEsT0FBTztBQUFBLElBQVEsT0FBTztBQUFBLElBQ25FLE9BQU87QUFBQSxJQUFRLE9BQU87QUFBQSxJQUFRLE9BQU87QUFBQSxJQUFRLE9BQU87QUFBQSxJQUFRLE9BQU87QUFBQSxJQUNuRSxPQUFPO0FBQUEsSUFBUSxPQUFPO0FBQUEsSUFBUSxPQUFPO0FBQUEsSUFBUSxPQUFPO0FBQUEsSUFBUSxPQUFPO0FBQUEsSUFDbkUsT0FBTztBQUFBLElBQVEsT0FBTztBQUFBLElBQVEsT0FBTztBQUFBLElBQVEsT0FBTztBQUFBLElBQVEsT0FBTztBQUFBLElBQ25FLE9BQU87QUFBQSxJQUFRLE9BQU87QUFBQSxJQUFRLE9BQU87QUFBQSxJQUFRLE9BQU87QUFBQSxJQUFRLE9BQU87QUFBQSxJQUNuRSxPQUFPO0FBQUEsSUFBUSxPQUFPO0FBQUEsSUFBUSxPQUFPO0FBQUEsSUFBUSxPQUFPO0FBQUEsSUFBUSxPQUFPO0FBQUEsSUFDbkUsT0FBTztBQUFBLElBQVEsT0FBTztBQUFBLElBQVEsT0FBTztBQUFBLElBQVEsT0FBTztBQUFBLElBQVEsT0FBTztBQUFBLElBQ25FLE9BQU87QUFBQSxJQUFRLE9BQU87QUFBQSxJQUFRLE9BQU87QUFBQSxJQUFRLE9BQU87QUFBQSxJQUFRLE9BQU87QUFBQSxJQUNuRSxPQUFPO0FBQUEsSUFBUSxPQUFPO0FBQUEsSUFBUSxPQUFPO0FBQUEsSUFBUSxPQUFPO0FBQUEsSUFBUSxPQUFPO0FBQUEsSUFDbkUsT0FBTztBQUFBLElBQVEsT0FBTztBQUFBLElBQVEsT0FBTztBQUFBLElBQVEsT0FBTztBQUFBLElBQVEsT0FBTztBQUFBLElBQ25FLE9BQU87QUFBQSxJQUFRLE9BQU87QUFBQSxJQUFRLE9BQU87QUFBQSxJQUFRLE9BQU87QUFBQSxJQUFRLE9BQU87QUFBQSxJQUNuRSxPQUFPO0FBQUEsSUFBUSxPQUFPO0FBQUEsSUFBUSxPQUFPO0FBQUEsSUFBUSxPQUFPO0FBQUEsSUFBUSxPQUFPO0FBQUEsSUFDbkUsT0FBTztBQUFBLElBQVEsT0FBTztBQUFBLElBQVEsT0FBTztBQUFBLElBQVEsT0FBTztBQUFBLElBQVEsT0FBTztBQUFBLElBQ25FLE9BQU87QUFBQSxJQUFRLE9BQU87QUFBQSxJQUFRLE9BQU87QUFBQSxJQUFRLE9BQU87QUFBQSxJQUFRLE9BQU87QUFBQSxJQUNuRSxPQUFPO0FBQUEsSUFBUSxPQUFPO0FBQUEsSUFBUSxPQUFPO0FBQUEsSUFBUSxPQUFPO0FBQUEsSUFBUSxPQUFPO0FBQUEsSUFDbkUsT0FBTztBQUFBLElBQVEsT0FBTztBQUFBLElBQVEsT0FBTztBQUFBLElBQVEsT0FBTztBQUFBLElBQVEsT0FBTztBQUFBLElBQ25FLE9BQU87QUFBQSxJQUFRLE9BQU87QUFBQSxJQUFRLE9BQU87QUFBQSxJQUFRLE9BQU87QUFBQSxJQUFRLE9BQU87QUFBQSxJQUNuRSxPQUFPO0FBQUEsSUFBUSxPQUFPO0FBQUEsSUFBUSxPQUFPO0FBQUEsSUFBUSxPQUFPO0FBQUEsSUFBUSxPQUFPO0FBQUEsSUFDbkUsT0FBTztBQUFBLElBQVEsT0FBTztBQUFBLElBQVEsT0FBTztBQUFBLElBQVEsT0FBTztBQUFBLElBQVEsT0FBTztBQUFBLElBQ25FLE9BQU87QUFBQSxJQUFRLE9BQU87QUFBQSxJQUFRLE9BQU87QUFBQSxJQUFRLE9BQU87QUFBQSxJQUFRLE9BQU87QUFBQSxJQUNuRSxPQUFPO0FBQUEsSUFBUSxPQUFPO0FBQUEsSUFBUSxPQUFPO0FBQUEsSUFBUSxPQUFPO0FBQUEsSUFBUSxPQUFPO0FBQUEsSUFDbkUsT0FBTztBQUFBLElBQVEsT0FBTztBQUFBLElBQVEsT0FBTztBQUFBLElBQVEsT0FBTztBQUFBLElBQVEsT0FBTztBQUFBLElBQ25FLE9BQU87QUFBQSxJQUFRLE9BQU87QUFBQSxJQUFRLE9BQU87QUFBQSxJQUFRLE9BQU87QUFBQSxJQUFRLE9BQU87QUFBQSxJQUNuRSxPQUFPO0FBQUEsSUFBUSxPQUFPO0FBQUEsSUFBUSxPQUFPO0FBQUEsSUFBUSxPQUFPO0FBQUEsSUFBUSxPQUFPO0FBQUEsSUFDbkUsT0FBTztBQUFBLElBQVEsT0FBTztBQUFBLElBQVEsT0FBTztBQUFBLElBQVEsT0FBTztBQUFBLElBQVEsT0FBTztBQUFBLElBQ25F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QUEsSUFBRztBQUFBLElBQUc7QUFBQSxJQUFHO0FBQUEsSUFBRztBQUFBLElBQUc7QUFBQSxJQUFHO0FBQUEsSUFBRztBQUFBLElBQzdDO0FBQUEsSUFBRztBQUFBLElBQUc7QUFBQSxJQUFHO0FBQUEsSUFBRztBQUFBLElBQUc7QUFBQSxJQUFHO0FBQUEsSUFBRztBQUFBLElBQUc7QUFBQSxJQUFHO0FBQUEsSUFBRztBQUFBLElBQUc7QUFBQSxJQUFHO0FBQUEsSUFBRztBQUFBLElBQUc7QUFBQSxJQUFHO0FBQUEsSUFDN0M7QUFBQSxJQUFHO0FBQUEsSUFBRztBQUFBLElBQUc7QUFBQSxJQUFHO0FBQUEsSUFBRztBQUFBLElBQUc7QUFBQSxJQUFHO0FBQUEsSUFBRztBQUFBLElBQUc7QUFBQSxJQUFHO0FBQUEsSUFBRztBQUFBLElBQUc7QUFBQSxJQUFHO0FBQUEsSUFBRztBQUFBLElBQUc7QUFBQSxJQUM3QztBQUFBLElBQUc7QUFBQSxJQUFHO0FBQUEsSUFBRztBQUFBLElBQUc7QUFBQSxJQUFHO0FBQUEsSUFBRztBQUFBLElBQUc7QUFBQSxJQUFHO0FBQUEsSUFBRztBQUFBLElBQUc7QUFBQSxJQUFHO0FBQUEsSUFBRztBQUFBLElBQUc7QUFBQSxJQUFHO0FBQUEsSUFBRztBQUFBLElBQzdDO0FBQUEsSUFBRztBQUFBLElBQUc7QUFBQSxJQUFHO0FBQUEsSUFBRztBQUFBLElBQUc7QUFBQSxJQUFHO0FBQUEsSUFBRztBQUFBLElBQUc7QUFBQSxJQUFHO0FBQUEsSUFBRztBQUFBLElBQUc7QUFBQSxJQUFHO0FBQUEsSUFBRztBQUFBLElBQUc7QUFBQSxJQUFHO0FBQUEsSUFDN0M7QUFBQSxJQUFHO0FBQUEsSUFBRztBQUFBLElBQUc7QUFBQSxJQUFHO0FBQUEsSUFBRztBQUFBLElBQUc7QUFBQSxJQUFHO0FBQUEsSUFBRztBQUFBLElBQUc7QUFBQSxJQUFHO0FBQUEsSUFBRztBQUFBLElBQUc7QUFBQSxJQUFHO0FBQUEsSUFBRztBQUFBLElBQUc7QUFBQSxJQUM3QztBQUFBLElBQUc7QUFBQSxJ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QUFBQSxXQUNBO0FBQUEsV0FDQTtBQUFBLFdBQ0E7QUFBQSxXQUNBO0FBQUEsV0FDQTtBQUFBLFdBQ0E7QUFBQSxXQUNBO0FBQUEsV0FDQTtBQUFBLFdBQ0E7QUFBQSxXQUNBO0FBQ0gsZUFBTztBQUFBLFdBQ0o7QUFBQSxXQUNBO0FBQUEsV0FDQTtBQUFBLFdBQ0E7QUFBQSxXQUNBO0FBQUEsV0FDQTtBQUFBLFdBQ0E7QUFBQSxXQUNBO0FBQUEsV0FDQTtBQUFBLFdBQ0E7QUFBQSxXQUNBO0FBQUEsV0FDQTtBQUNILGVBQU87QUFBQSxXQUNKO0FBQUEsV0FDQTtBQUFBLFdBQ0E7QUFBQSxXQUNBO0FBQUEsV0FDQTtBQUFBLFdBQ0E7QUFBQSxXQUNBO0FBQUEsV0FDQTtBQUFBLFdBQ0E7QUFBQSxXQUNBO0FBQUEsV0FDQTtBQUNILGVBQU87QUFBQSxXQUNKO0FBQUEsV0FDQTtBQUFBLFdBQ0E7QUFDSCxlQUFPO0FBQUEsV0FDSjtBQUFBLFdBQ0E7QUFBQSxXQUNBO0FBQUEsV0FDQTtBQUFBLFdBQ0E7QUFBQSxXQUNBO0FBQUEsV0FDQTtBQUNILGVBQU87QUFBQSxXQUNKO0FBQUEsV0FDQTtBQUFBLFdBQ0E7QUFDSCxlQUFPO0FBQUEsV0FDSjtBQUFBLFdBQ0E7QUFBQSxXQUNBO0FBQ0gsZUFBTztBQUFBLFdBQ0o7QUFBQSxXQUNBO0FBQUEsV0FDQTtBQUFBLFdBQ0E7QUFBQSxXQUNBO0FBQUEsV0FDQTtBQUNILGVBQU87QUFBQSxXQUNKO0FBQ0gsZUFBTztBQUFBLFdBQ0o7QUFBQSxXQUNBO0FBQUEsV0FDQTtBQUFBLFdBQ0E7QUFBQSxXQUNBO0FBQ0gsZUFBTztBQUFBLFdBQ0o7QUFBQSxXQUNBO0FBQ0gsZUFBTztBQUFBLFdBQ0o7QUFBQSxXQUNBO0FBQUEsV0FDQTtBQUFBLFdBQ0E7QUFDSCxlQUFPO0FBQUEsV0FDSjtBQUFBLFdBQ0E7QUFBQSxXQUNBO0FBQUEsV0FDQTtBQUFBLFdBQ0E7QUFDSCxlQUFPO0FBQUEsV0FDSjtBQUFBLFdBQ0E7QUFBQSxXQUNBO0FBQ0gsZUFBTztBQUFBLFdBQ0o7QUFBQSxXQUNBO0FBQUEsV0FDQTtBQUNILGVBQU87QUFBQSxXQUNKO0FBQUEsV0FDQTtBQUFBLFdBQ0E7QUFBQSxXQUNBO0FBQUEsV0FDQTtBQUFBLFdBQ0E7QUFBQSxXQUNBO0FBQUEsV0FDQTtBQUFBLFdBQ0E7QUFBQSxXQUNBO0FBQUEsV0FDQTtBQUFBLFdBQ0E7QUFBQSxXQUNBO0FBQUEsV0FDQTtBQUFBLFdBQ0E7QUFBQSxXQUNBO0FBQUEsV0FDQTtBQUNILGVBQU87QUFBQSxXQUNKO0FBQUEsV0FDQTtBQUFBLFdBQ0E7QUFDSCxlQUFPO0FBQUEsV0FDSjtBQUFBLFdBQ0E7QUFBQSxXQUNBO0FBQUEsV0FDQTtBQUFBLFdBQ0E7QUFBQSxXQUNBO0FBQUEsV0FDQTtBQUFBLFdBQ0E7QUFBQSxXQUNBO0FBQUEsV0FDQTtBQUFBLFdBQ0E7QUFBQSxXQUNBO0FBQ0gsZUFBTztBQUFBLFdBQ0o7QUFBQSxXQUNBO0FBQUEsV0FDQTtBQUNILGVBQU87QUFBQSxXQUNKO0FBQUEsV0FDQTtBQUFBLFdBQ0E7QUFDSCxlQUFPO0FBQUEsV0FDSjtBQUFBLFdBQ0E7QUFBQSxXQUNBO0FBQ0gsZUFBTztBQUFBLFdBQ0o7QUFBQSxXQUNBO0FBQUEsV0FDQTtBQUNILGVBQU87QUFBQSxXQUNKO0FBQUEsV0FDQTtBQUNILGVBQU87QUFBQSxXQUNKO0FBQUEsV0FDQTtBQUFBLFdBQ0E7QUFBQSxXQUNBO0FBQUEsV0FDQTtBQUFBLFdBQ0E7QUFBQSxXQUNBO0FBQUEsV0FDQTtBQUFBLFdBQ0E7QUFDSCxlQUFPO0FBQUEsV0FDSjtBQUNILGVBQU87QUFBQSxXQUNKO0FBQUEsV0FDQTtBQUFBLFdBQ0E7QUFBQSxXQUNBO0FBQUEsV0FDQTtBQUNILGVBQU87QUFBQSxXQUNKO0FBQUEsV0FDQTtBQUFBLFdBQ0E7QUFDSCxlQUFPO0FBQUEsV0FDSjtBQUFBLFdBQ0E7QUFDSCxlQUFPO0FBQUEsV0FDSjtBQUFBLFdBQ0E7QUFBQSxXQUNBO0FBQUEsV0FDQTtBQUFBLFdBQ0E7QUFBQSxXQUNBO0FBQUEsV0FDQTtBQUFBLFdBQ0E7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T0FBTyxPQUFPLFVBQVU7QUFBQSxJQUNoRDtBQUFBLEVBQ0YsQ0FBQztBQUdELE1BQUksc0JBQXNCO0FBQUEsSUFDeEI7QUFBQSxJQUNBO0FBQUEsSUFDQTtBQUFBLElBQ0E7QUFBQSxJQUNBO0FBQUEsSUFDQTtBQUFBLElBQ0E7QUFBQSxJQUNBO0FBQUEsSUFDQTtBQUFBLElBQ0E7QUFBQSxJQUNBO0FBQUEsSUFDQTtBQUFBLElBQ0E7QUFBQSxJQUNBO0FBQUEsSUFDQTtBQUFBLElBQ0E7QUFBQSxJQUNBO0FBQUEsSUFDQTtBQUFBLElBQ0E7QUFBQSxJQUNBO0FBQUEsSUFDQTtBQUFBLElBQ0E7QUFBQSxJQUNBO0FBQUEsSUFDQTtBQUFBLElBQ0E7QUFBQSxJQUNBO0FBQUEsSUFDQTtBQUFBLElBQ0E7QUFBQSxJQUNBO0FBQUEsSUFDQTtBQUFBLElBQ0E7QUFBQSxJQUNBO0FBQUEsSUFDQTtBQUFBLElBQ0E7QUFBQSxJQUNBO0FBQUEsSUFDQTtBQUFBLElBQ0E7QUFBQSxJQUNBO0FBQUEsSUFDQTtBQUFBLElBQ0E7QUFBQSxJQUNBO0FBQUEsSUFDQTtBQUFBLElBQ0E7QUFBQSxJQUNBO0FBQUEsSUFDQTtBQUFBLElBQ0E7QUFBQSxJQUNBO0FBQUEsSUFDQTtBQUFBLElBQ0E7QUFBQSxJQUNBO0FBQUEsSUFDQTtBQUFBLElBQ0E7QUFBQSxJQUNBO0FBQUEsSUFDQTtBQUFBLElBQ0E7QUFBQSxJQUNBO0FBQUEsSUFDQTtBQUFBLElBQ0E7QUFBQSxJQUNBO0FBQUEsSUFDQTtBQUFBLElBQ0E7QUFBQSxJQUNBO0FBQUEsSUFDQTtBQUFBLElBQ0E7QUFBQSxJQUNBO0FBQUEsSUFDQTtBQUFBLElBQ0E7QUFBQSxJQUNBO0FBQUEsSUFDQTtBQUFBLElBQ0E7QUFBQSxJQUNBO0FBQUEsSUFDQTtBQUFBLElBQ0E7QUFBQSxJQUNBO0FBQUEsSUFDQTtBQUFBLElBQ0E7QUFBQSxJQUNBO0FBQUEsSUFDQTtBQUFBLElBQ0E7QUFBQSxJQUNBO0FBQUEsSUFDQTtBQUFBLElBQ0E7QUFBQSxJQUNBO0FBQUEsSUFDQTtBQUFBLElBQ0E7QUFBQSxJQUNBO0FBQUEsSUFDQTtBQUFBLElBQ0E7QUFBQSxJQUNBO0FBQUEsSUFDQTtBQUFBLElBQ0E7QUFBQSxJQUNBO0FBQUEsSUFDQTtBQUFBLElBQ0E7QUFBQSxJQUNBO0FBQUEsSUFDQTtBQUFBLElBQ0E7QUFBQSxJQUNBO0FBQUEsSUFDQTtBQUFBLElBQ0E7QUFBQSxJQUNBO0FBQUEsSUFDQTtBQUFBLElBQ0E7QUFBQSxJQUNBO0FBQUEsSUFDQTtBQUFBLElBQ0E7QUFBQSxJQUNBO0FBQUEsSUFDQTtBQUFBLElBQ0E7QUFBQSxJQUNBO0FBQUEsSUFDQTtBQUFBLElBQ0E7QUFBQSxJQUNBO0FBQUEsSUFDQTtBQUFBLElBQ0E7QUFBQSxJQUNBO0FBQUEsSUFDQTtBQUFBLElBQ0E7QUFBQSxJQUNBO0FBQUEsSUFDQTtBQUFBLElBQ0E7QUFBQSxJQUNBO0FBQUEsSUFDQTtBQUFBLElBQ0E7QUFBQSxJQUNBO0FBQUEsSUFDQTtBQUFBLElBQ0E7QUFBQSxJQUNBO0FBQUEsSUFDQTtBQUFBLElBQ0E7QUFBQSxJQUNBO0FBQUEsSUFDQTtBQUFBLElBQ0E7QUFBQSxJQUNBO0FBQUEsSUFDQTtBQUFBLElBQ0E7QUFBQSxJQUNBO0FBQUEsSUFDQTtBQUFBLElBQ0E7QUFBQSxJQUNBO0FBQUEsSUFDQTtBQUFBLElBQ0E7QUFBQSxJQUNBO0FBQUEsSUFDQTtBQUFBLElBQ0E7QUFBQSxJQUNBO0FBQUEsSUFDQTtBQUFBLElBQ0E7QUFBQSxJQUNBO0FBQUEsSUFDQTtBQUFBLElBQ0E7QUFBQSxJQUNBO0FBQUEsSUFDQTtBQUFBLElBQ0E7QUFBQSxJQUNBO0FBQUEsSUFDQTtBQUFBLElBQ0E7QUFBQSxJQUNBO0FBQUEsSUFDQTtBQUFBLElBQ0E7QUFBQSxJQUNBO0FBQUEsSUFDQTtBQUFBLElBQ0E7QUFBQSxJQUNBO0FBQUEsSUFDQTtBQUFBLElBQ0E7QUFBQSxJQUNBO0FBQUEsSUFDQTtBQUFBLElBQ0E7QUFBQSxJQUNBO0FBQUEsSUFDQTtBQUFBLElBQ0E7QUFBQSxJQUNBO0FBQUEsSUFDQTtB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QUFDcEIsV0FBUSxVQUFVLGFBQWE7QUFDL0IsV0FBUSxXQUFXLE1BQU07QUFDeEIsUUFBSSxTQUFTO0FBRWIsV0FBTyxNQUFNO0FBQ1osV0FBSyxRQUFRO0FBQ1osaUJBQVM7QUFDVCxnQkFBUSxLQUFLLHVJQUF1STtBQUFBLE1BQ3JKO0FBQUE7QUFBQSxLQUVDO0FBTUgsV0FBUSxTQUFTO0FBQUEsSUFDaEI7QUFBQSxJQUNBO0FBQUEsSUFDQTtBQUFBLElBQ0E7QUFBQSxJQUNBO0FBQUEsSUFDQTtBQUFBLElBQ0E7QUFBQSxJQUNBO0FBQUEsSUFDQTtBQUFBLElBQ0E7QUFBQSxJQUNBO0FBQUEsSUFDQTtBQUFBLElBQ0E7QUFBQSxJQUNBO0FBQUEsSUFDQTtBQUFBLElBQ0E7QUFBQSxJQUNBO0FBQUEsSUFDQTtBQUFBLElBQ0E7QUFBQSxJQUNBO0FBQUEsSUFDQTtBQUFBLElBQ0E7QUFBQSxJQUNBO0FBQUEsSUFDQTtBQUFBLElBQ0E7QUFBQSxJQUNBO0FBQUEsSUFDQTtBQUFBLElBQ0E7QUFBQSxJQUNBO0FBQUEsSUFDQTtBQUFBLElBQ0E7QUFBQSxJQUNBO0FBQUEsSUFDQTtBQUFBLElBQ0E7QUFBQSxJQUNBO0FBQUEsSUFDQTtBQUFBLElBQ0E7QUFBQSxJQUNBO0FBQUEsSUFDQTtBQUFBLElBQ0E7QUFBQSxJQUNBO0FBQUEsSUFDQTtBQUFBLElBQ0E7QUFBQSxJQUNBO0FBQUEsSUFDQTtBQUFBLElBQ0E7QUFBQSxJQUNBO0FBQUEsSUFDQTtBQUFBLElBQ0E7QUFBQSxJQUNBO0FBQUEsSUFDQTtBQUFBLElBQ0E7QUFBQSxJQUNBO0FBQUEsSUFDQTtBQUFBLElBQ0E7QUFBQSxJQUNBO0FBQUEsSUFDQTtBQUFBLElBQ0E7QUFBQSxJQUNBO0FBQUEsSUFDQTtBQUFBLElBQ0E7QUFBQSxJQUNBO0FBQUEsSUFDQTtBQUFBLElBQ0E7QUFBQSxJQUNBO0FBQUEsSUFDQTtBQUFBLElBQ0E7QUFBQSxJQUNBO0FBQUEsSUFDQTtBQUFBLElBQ0E7QUFBQSxJQUNBO0FBQUEsSUFDQTtBQUFBLElBQ0E7QUFBQSxJ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R0gsVUFBTTtBQUVOLFFBQUksa0JBQWtCLGNBQWMsVUFBVSxlQUFlLFNBQVMsR0FBRztBQUN4RSxlQUFRLFNBQVM7QUFBQSxRQUNoQjtBQUFBLFFBQ0E7QUFBQSxRQUNBO0FBQUEsUUFDQTtBQUFBLFFBQ0E7QUFBQSxRQUNBO0FBQUEsUUFDQTtBQUFBLFFBQ0E7QUFBQSxRQUNBO0FBQUEsUUFDQTtBQUFBLFFBQ0E7QUFBQSxRQUNBO0FBQUEsUUFDQTtBQUFBLFFBQ0E7QUFBQSxRQUNBO0FBQUEsUUFDQTtBQUFBLFFBQ0E7QUFBQSxRQUNBO0FBQUEsUUFDQTtBQUFBLFFBQ0E7QUFBQSxRQUNBO0FBQUEsUUFDQTtBQUFBLFFBQ0E7QUFBQSxRQUNBO0FBQUEsUUFDQTtBQUFBLFFBQ0E7QUFBQSxRQUNBO0FBQUEsUUFDQTtBQUFBLFFBQ0E7QUFBQSxRQUNBO0FBQUEsUUFDQTtBQUFBLFFBQ0E7QUFBQSxRQUNBO0FBQUEsUUFDQTtBQUFBLFFBQ0E7QUFBQSxRQUNBO0FBQUEsUUFDQTtBQUFBLFFBQ0E7QUFBQSxRQUNBO0FBQUEsUUFDQTtBQUFBLFFBQ0E7QUFBQSxRQUNBO0FBQUEsUUFDQTtBQUFBLFFBQ0E7QUFBQSxRQUNBO0FBQUEsUUFDQTtBQUFBLFFBQ0E7QUFBQSxRQUNBO0FBQUEsUUFDQTtBQUFBLFFBQ0E7QUFBQSxRQUNBO0FBQUEsUUFDQTtBQUFBLFFBQ0E7QUFBQSxRQUNBO0FBQUEsUUFDQTtBQUFBLFFBQ0E7QUFBQSxRQUNBO0FBQUEsUUFDQTtBQUFBLFFBQ0E7QUFBQSxRQUNBO0FBQUEsUUFDQTtBQUFBLFFBQ0E7QUFBQSxRQUNBO0FBQUEsUUFDQTtBQUFBLFFBQ0E7QUFBQSxRQUNBO0FBQUEsUUFDQTtBQUFBLFFBQ0E7QUFBQSxRQUNBO0FBQUEsUUFDQTtBQUFBLFFBQ0E7QUFBQSxRQUNBO0FBQUEsUUFDQTtBQUFBLFFBQ0E7QUFBQSxRQUNBO0FBQUEsUUFDQTtBQUFBLE1BQ0Q7QUFBQSxJQUNEO0FBQUEsV0FDUSxPQUFQO0FBQUE7QUFVRixXQUFRLGNBQWMsT0FBTyxLQUFLLFFBQVEsR0FB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QUFBLElBQ0E7QUFBQSxJQUNBO0FBQUEsSUFDQTtBQUFBLElBQ0E7QUFBQSxJQUNBO0FBQUEsSUFDQTtBQUFBLElBQ0E7QUFBQSxJQUNBO0FBQUEsSUFDQTtBQUFBLElBQ0E7QUFBQSxJQUNBO0FBQUEsSUFDQTtBQUFBLElBQ0E7QUFBQSxJQUNBO0FBQUEsSUFDQTtBQUFBLElBQ0E7QUFBQSxJQUNBO0FBQUEsSUFDQTtBQUFBLElBQ0E7QUFBQSxJQUNBO0FBQUEsSUFDQTtBQUFBLElBQ0E7QUFBQSxJQUNBO0FBQUEsSUFDQTtBQUFBLElBQ0E7QUFBQSxJQUNBO0FBQUEsSUFDQTtBQUFBLElBQ0E7QUFBQSxJQUNBO0FBQUEsSUFDQTtBQUFBLElBQ0E7QUFBQSxJQUNBO0FBQUEsSUFDQTtBQUFBLElBQ0E7QUFBQSxJQUNBO0FBQUEsSUFDQTtBQUFBLElBQ0E7QUFBQSxJQUNBO0FBQUEsSUFDQTtBQUFBLElBQ0E7QUFBQSxJQUNBO0FBQUEsSUFDQTtBQUFBLElBQ0E7QUFBQSxJQUNBO0FBQUEsSUFDQTtBQUFBLElBQ0E7QUFBQSxJQUNBO0FBQUEsSUFDQTtBQUFBLElBQ0E7QUFBQSxJQUNBO0FBQUEsSUFDQTtBQUFBLElBQ0E7QUFBQSxJQUNBO0FBQUEsSUFDQTtBQUFBLElBQ0E7QUFBQSxJQUNBO0FBQUEsSUFDQTtBQUFBLElBQ0E7QUFBQSxJQUNBO0FBQUEsSUFDQTtBQUFBLElBQ0E7QUFBQSxJQUNBO0FBQUEsSUFDQTtBQUFBLElBQ0E7QUFBQSxJQUNBO0FBQUEsSUFDQTtBQUFBLElBQ0E7QUFBQSxJQUNBO0FBQUEsSUFDQTtBQUFBLElBQ0E7QUFBQSxJQUNBO0FBQUEsSUFDQTtBQUFBLElBQ0E7QUFBQSxJQUNBO0FBQUEsSUFDQTtBQUFBLElBQ0E7QUFBQSxJQUNBO0FBQUEsSUFDQTtBQUFBLElBQ0E7QUFBQSxJQUNBO0FBQUEsSUFDQTtBQUFBLElBQ0E7QUFBQSxJQUNBO0FBQUEsSUFDQTtBQUFBLElBQ0E7QUFBQSxFQUNKO0FBQ0EsTUFBTSwyQ0FBMkM7QUFBQSxJQUM3QztBQUFBLElBQ0E7QUFB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QU87QUFBQSxJQUN6RjtBQUFBLElBQU87QUFBQSxJQUFPO0FBQUEsSUFBSztBQUFBLElBQUs7QUFBQSxJQUFLO0FBQUEsSUFBTztBQUFBLElBQU87QUFBQSxJQUFLO0FBQUEsSUFBSztBQUFBLElBQU87QUFBQSxJQUFLO0FBQUEsSUFBTztBQUFBLElBQU87QUFBQSxJQUFPO0FBQUEsSUFDdEY7QUFBQSxJQUFPO0FBQUEsSUFBTztBQUFBLElBQU87QUFBQSxJQUFPO0FBQUEsSUFBTztBQUFBLElBQU87QUFBQSxJQUFLO0FBQUEsSUFBSztBQUFBLElBQUs7QUFBQSxJQUFLO0FBQUEsSUFBSztBQUFBLElBQUs7QUFBQSxJQUFLO0FBQUEsSUFBTztBQUFBLElBQU87QUFBQSxJQUMzRjtBQUFBLElBQU87QUFBQSxJQUFPO0FBQUEsSUFBTztBQUFBLElBQU87QUFBQSxJQUFPO0FBQUEsSUFBTztBQUFBLElBQU87QUFBQSxJQUFPO0FBQUEsSUFBTztBQUFBLElBQU87QUFBQSxJQUFPO0FBQUEsSUFBTztBQUFBLElBQU87QUFBQSxJQUMzRjtBQUFBLElBQU87QUFBQSxJQUFPO0FBQUEsSUFBTztBQUFBLElBQU87QUFBQSxJQUFPO0FBQUEsSUFBTztBQUFBLElBQU87QUFBQSxJQUFPO0FBQUEsSUFBTztBQUFBLElBQUs7QUFBQSxJQUFLO0FBQUEsSUFBSztBQUFBLElBQU87QUFBQSxJQUFPO0FBQUEsSUFDNUY7QUFBQSxJQUFPO0FBQUEsSUFBTztBQUFBLElBQU87QUFBQSxJQUFPO0FBQUEsSUFBTztBQUFBLElBQU87QUFBQSxJQUFPO0FBQUEsSUFBTztBQUFBLElBQU87QUFBQSxJQUFPO0FBQUEsSUFBTztBQUFBLElBQU87QUFBQSxJQUFPO0FBQUEsSUFDM0Y7QUFBQSxJQUFPO0FBQUEsSUFBTztBQUFBLElBQU87QUFBQSxJQUFPO0FBQUEsSUFBTztBQUFBLElBQU87QUFBQSxJQUFPO0FBQUEsSUFBTztBQUFBLElBQU87QUFBQSxJQUFPO0FBQUEsSUFBTztBQUFBLElBQU87QUFBQSxJQUFLO0FBQUEsSUFDekY7QUFBQSxJQUFLO0FBQUEsSUFBTztBQUFBLEVBQ2hCLENBQUM7QUFDRCxNQUFNLFlBQVksSUFBSSxZQUFZO0FBQUEsSUFDOUI7QUFBQSxJQUFLO0FBQUEsSUFBSztBQUFBLElBQUs7QUFBQSxJQUFLO0FBQUEsSUFBSztBQUFBLElBQUs7QUFBQSxJQUFLO0FBQUEsSUFBSztBQUFBLElBQUs7QUFBQSxJQUFLO0FBQUEsSUFBSztBQUFBLElBQUs7QUFBQSxJQUFLO0FBQUEsSUFBSztBQUFBLElBQUs7QUFBQSxJQUFLO0FBQUEsSUFBSztBQUFBLElBQUs7QUFBQSxJQUMxRjtBQUFBLElBQUs7QUFBQSxJQUFLO0FBQUEsSUFBSztBQUFBLElBQUs7QUFBQSxJQUFLO0FBQUEsSUFBSztBQUFBLElBQUs7QUFBQSxJQUFLO0FBQUEsSUFBSztBQUFBLElBQUs7QUFBQSxJQUFLO0FBQUEsSUFBSztBQUFBLElBQUs7QUFBQSxJQUFLO0FBQUEsSUFBSztBQUFBLElBQUs7QUFBQSxJQUFLO0FBQUEsSUFBSztBQUFBLElBQzFGO0FBQUEsSUFBSztBQUFBLElBQUs7QUFBQSxJQUFLO0FBQUEsSUFBSztBQUFBLElBQUs7QUFBQSxJQUFLO0FBQUEsSUFBSztBQUFBLElBQUs7QUFBQSxJQUFLO0FBQUEsSUFBSztBQUFBLElBQUs7QUFBQSxJQUFLO0FBQUEsSUFBSztBQUFBLElBQUs7QUFBQSxJQUFLO0FBQUEsSUFBSztBQUFBLElBQUs7QUFBQSxJQUFLO0FBQUEsSUFDMUY7QUFBQSxJQUFLO0FBQUEsSUFBSztBQUFBLElBQUs7QUFBQSxJQUFLO0FBQUEsSUFBSztBQUFBLElBQUs7QUFBQSxJQUFLO0FBQUEsSUFBSztBQUFBLElBQU07QUFBQSxJQUFNO0FBQUEsSUFBTTtBQUFBLElBQU07QUFBQSxJQUFNO0FBQUEsSUFBTTtBQUFBLElBQU07QUFBQSxJQUFNO0FBQUEsSUFDeEY7QUFBQSxJQUFNO0FBQUEsSUFBTTtBQUFBLElBQU07QUFBQSxJQUFNO0FBQUEsSUFBTTtBQUFBLElBQU07QUFBQSxJQUFNO0FBQUEsSUFBTTtBQUFBLElBQU07QUFBQSxJQUFNO0FBQUEsSUFBTTtBQUFBLElBQU07QUFBQSxJQUFNO0FBQUEsSUFBTTtBQUFBLElBQU07QUFBQSxJQUMxRjtBQUFBLElBQU07QUFBQSxJQUFLO0FBQUEsSUFBSztBQUFBLElBQUs7QUFBQSxJQUFLO0FBQUEsSUFBSztBQUFBLElBQUs7QUFBQSxJQUFLO0FBQUEsSUFBSztBQUFBLElBQUs7QUFBQSxJQUFLO0FBQUEsSUFBSztBQUFBLElBQUs7QUFBQSxJQUFLO0FBQUEsSUFBSztBQUFBLElBQUs7QUFBQSxJQUFLO0FBQUEsSUFBSztBQUFBLElBQzNGO0FBQUEsSUFBSztBQUFBLElBQUs7QUFBQSxJQUFLO0FBQUEsSUFBSztBQUFBLElBQUs7QUFBQSxJQUFLO0FBQUEsSUFBSztBQUFBLElBQUs7QUFBQSxJQUFLO0FBQUEsSUFBSztBQUFBLElBQUs7QUFBQSxJQUFLO0FBQUEsSUFBSztBQUFBLElBQUs7QUFBQSxJQUFLO0FBQUEsSUFBSztBQUFBLElBQUs7QUFBQSxJQUFLO0FBQUEsRUFDOUYsQ0FBQztBQUNELE1BQU0sWUFBWSxJQUFJLFlBQVk7QUFBQSxJQUM5QjtBQUFBLElBQUs7QUFBQSxJQUFLO0FBQUEsSUFBSztBQUFBLElBQUs7QUFBQSxJQUFLO0FBQUEsSUFBSztBQUFBLElBQUs7QUFBQSxJQUFLO0FBQUEsSUFBSztBQUFBLElBQUs7QUFBQSxJQUFLO0FBQUEsSUFBSztBQUFBLElBQUs7QUFBQSxJQUFLO0FBQUEsSUFBSztBQUFBLElBQUs7QUFBQSxJQUFLO0FBQUEsSUFBSztBQUFBLElBQzFGO0FBQUEsSUFBSztBQUFBLElBQUs7QUFBQSxJQUFLO0FBQUEsSUFBSztBQUFBLElBQUs7QUFBQSxJQUFLO0FBQUEsSUFBSztBQUFBLElBQUs7QUFBQSxJQUFLO0FBQUEsSUFBSztBQUFBLElBQUs7QUFBQSxJQUFLO0FBQUEsSUFBSztBQUFBLElBQUs7QUFBQSxJQUFLO0FBQUEsSUFBSztBQUFBLElBQUs7QUFBQSxJQUFLO0FBQUEsSUFDMUY7QUFBQSxJQUFLO0FBQUEsSUFBUTtBQUFBLElBQUs7QUFBQSxJQUFLO0FBQUEsSUFBSztBQUFBLElBQUs7QUFBQSxJQUFLO0FBQUEsSUFBUTtBQUFBLElBQUs7QUFBQSxJQUFLO0FBQUEsSUFBSztBQUFBLElBQUs7QUFBQSxJQUFLO0FBQUEsSUFBSztBQUFBLElBQUs7QUFBQSxJQUFLO0FBQUEsSUFBSztBQUFBLElBQzNGO0FBQUEsSUFBSztBQUFBLElBQUs7QUFBQSxJQUFLO0FBQUEsSUFBSztBQUFBLElBQUs7QUFBQSxJQUFLO0FBQUEsSUFBSztBQUFBLElBQUs7QUFBQSxJQUFLO0FBQUEsSUFBSztBQUFBLElBQUs7QUFBQSxJQUFLO0FBQUEsSUFBSztBQUFBLElBQUs7QUFBQSxJQUFLO0FBQUEsSUFBSztBQUFBLElBQUs7QUFBQSxJQUFLO0FBQUEsSUFDMUY7QUFBQSxJQUFLO0FBQUEsSUFBSztBQUFBLElBQUs7QUFBQSxJQUFLO0FBQUEsSUFBSztBQUFBLElBQUs7QUFBQSxJQUFLO0FBQUEsSUFBSztBQUFBLElBQUs7QUFBQSxJQUFLO0FBQUEsSUFBSztBQUFBLElBQUs7QUFBQSxJQUFLO0FBQUEsSUFBSztBQUFBLElBQUs7QUFBQSxJQUFLO0FBQUEsSUFBSztBQUFBLElBQUs7QUFBQSxJQUMxRjtBQUFBLElBQUs7QUFBQSxJQUFLO0FBQUEsSUFBSztBQUFBLElBQUs7QUFBQSxJQUFLO0FBQUEsSUFBSztBQUFBLElBQUs7QUFBQSxJQUFLO0FBQUEsSUFBSztBQUFBLElBQUs7QUFBQSxJQUFLO0FBQUEsSUFBSztBQUFBLElBQUs7QUFBQSxJQUFLO0FBQUEsSUFBSztBQUFBLElBQUs7QUFBQSxJQUFLO0FBQUEsSUFBSztBQUFBLElBQzFGO0FBQUEsSUFBSztBQUFBLElBQUs7QUFBQSxJQUFLO0FBQUEsSUFBSztBQUFBLElBQUs7QUFBQSxJQUFLO0FBQUEsSUFBSztBQUFBLElBQUs7QUFBQSxJQUFLO0FBQUEsSUFBSztBQUFBLElBQUs7QUFBQSxJQUFLO0FBQUEsSUFBSztBQUFBLElBQUs7QUFBQSxFQUMxRSxDQUFDO0FBQ0QsV0FBUyxhQUFhLENBQUMsS0FBSyxLQUFLO0FBQzdCLFFBQUksV0FBVyxLQUFLLEdBQUc7QUFDbkIsYUFBTztBQUNYLFdBQU87QUFBQTtBQUVYLFdBQVMsVUFBVSxDQUFDLEtBQUssS0FBSztBQUMxQixVQUFNLFNBQVMsQ0FBQyxXQUFXLFdBQVcsU0FBUztBQUMvQyxRQUFJLGFBQWE7QUFDakIsUUFBSSxJQUFJO0FBQ1IsUUFBSSxJQUFJO0FBQ1IsV0FBTyxhQUFhLE9BQU8sUUFBUTtBQUMvQixVQUFJLGVBQWUsT0FBTyxTQUFTLEtBQUssTUFBTSxHQUFHO0FBQzdDLGVBQU8sSUFBSTtBQUFBLE1BQ2Y7QUFDQSxZQUFNLFVBQVUsSUFBSSxJQUFJLFNBQVMsT0FBTyxZQUFZLElBQUksR0FBRyxXQUFXLENBQUMsS0FBSztBQUM1RSxZQUFNLFVBQVUsSUFBSSxJQUFJLFNBQVMsT0FBTyxZQUFZLElBQUksR0FBRyxXQUFXLENBQUMsS0FBSztBQUM1RSxVQUFJLFlBQVksS0FBTyxZQUFZLEdBQUs7QUFDcEMsWUFBSTtBQUNKLFlBQUk7QUFDSixVQUFFO0FBQUEsTUFDTixXQUNTLFlBQVksU0FBUztBQUMxQixVQUFFO0FBQ0YsVUFBRTtBQUFBLE1BQ04sV0FDUyxZQUFZLEdBQUc7QUFDcEIsVUFBRTtBQUFBLE1BQ04sV0FDUyxZQUFZLEdBQUc7QUFDcEIsVUFBRTtBQUFBLE1BQ04sT0FDSztBQUNELGVBQU8sVUFBVTtBQUFBO0FBQUEsSUFFekI7QUFDQSxXQUFPO0FBQUE7QUFRWDtBQUFBLFFBQU0seUNBQXlDLGlCQUFpQjtBQUFBLElBTzVELFdBQVcsQ0FBQyxZQUFZLFNBQVMsU0FBUztBQUN0QyxZQUFNLFlBQVksT0FBTztBQUN6QixXQUFLLFVBQVU7QUFBQTtBQUFBLElBT25CLFdBQVcsQ0FBQyxTQUFTO0FBQ2pCLGNBQVEsUUFBUSxJQUFJLGdCQUFnQixXQUFXLElBQUksS0FBSyxFQUFFLFlBQVksQ0FBQztBQUN2RSxVQUFJLFFBQVEsZ0JBQ0EsUUFBUSxTQUFTLFlBQVksUUFBUSxTQUFTLGNBQ3RELFFBQVEsS0FBSyxTQUFTLEdBQUc7QUFDekIsZ0JBQVEsUUFBUSxJQUFJLGdCQUFnQixnQkFBZ0IsT0FBTyxXQUFXLFFBQVEsSUFBSSxDQUFDO0FBQUEsTUFDdkY7QUFDQSxZQUFNLGVBQWU7QUFBQSxRQUNqQixRQUFRLE9BQU8sWUFBWTtBQUFBLFFBQzNCLEtBQUsscUJBQXFCLFNBQVMsZ0JBQWdCLGdCQUFnQjtBQUFBLFFBQ25FLEtBQUsscUJBQXFCLFNBQVMsZ0JBQWdCLGdCQUFnQjtBQUFBLFFBQ25FLEtBQUsscUJBQXFCLFNBQVMsZ0JBQWdCLGNBQWM7QUFBQSxRQUNqRSxLQUFLLHFCQUFxQixTQUFTLGdCQUFnQixXQUFXO0FBQUEsUUFDOUQsS0FBSyxxQkFBcUIsU0FBUyxnQkFBZ0IsWUFBWTtBQUFBLFFBQy9ELEtBQUsscUJBQXFCLFNBQVMsZ0JBQWdCLElBQUk7QUFBQSxRQUN2RCxLQUFLLHFCQUFxQixTQUFTLGdCQUFnQixpQkFBaUI7QUFBQSxRQUNwRSxLQUFLLHFCQUFxQixTQUFTLGdCQUFnQixRQUFRO0FBQUEsUUFDM0QsS0FBSyxxQkFBcUIsU0FBUyxnQkFBZ0IsYUFBYTtBQUFBLFFBQ2hFLEtBQUsscUJBQXFCLFNBQVMsZ0JBQWdCLG1CQUFtQjtBQUFBLFFBQ3RFLEtBQUsscUJBQXFCLFNBQVMsZ0JBQWdCLEtBQUs7QUFBQSxNQUM1RCxFQUFFLEtBQUssSUFBSSxJQUNQLE9BQ0EsS0FBSyw4QkFBOEIsT0FBTyxJQUMxQyxLQUFLLCtCQUErQixPQUFPO0FBQy9DLFlBQU0sWUFBWSxLQUFLLFFBQVEsa0JBQWtCLFlBQVk7QUFDN0QsY0FBUSxRQUFRLElBQUksZ0JBQWdCLGVBQWUsYUFBYSxLQUFLLFFBQVEsZUFBZSxXQUFXO0FBS3ZHLGFBQU87QUFBQTtBQUFBLElBU1gsb0JBQW9CLENBQUMsU0FBUyxZQUFZO0FBQ3RDLFlBQU0sUUFBUSxRQUFRLFFBQVEsSUFBSSxVQUFVO0FBQzVDLFdBQUssT0FBTztBQUNSLGVBQU87QUFBQSxNQUNYO0FBSUEsVUFBSSxlQUFlLGdCQUFnQixrQkFBa0IsVUFBVSxLQUFLO0FBQ2hFLGVBQU87QUFBQSxNQUNYO0FBQ0EsYUFBTztBQUFBO0FBQUEsSUFlWCw2QkFBNkIsQ0FBQyxTQUFTO0FBQ25DLFVBQUksZUFBZSxRQUFRLFFBQVEsYUFBYSxFQUFFLE9BQU8sQ0FBQyxVQUFVO0FBQ2hFLGVBQU8sTUFBTSxLQUFLLFlBQVksRUFBRSxXQUFXLGdCQUFnQixrQkFBa0I7QUFBQSxPQUNoRjtBQUNELG1CQUFhLEtBQUssQ0FBQyxHQUFHLE1BQU07QUFDeEIsZUFBTyxjQUFjLEVBQUUsS0FBSyxZQUFZLEdBQUcsRUFBRSxLQUFLLFlBQVksQ0FBQztBQUFBLE9BQ2xFO0FBRUQscUJBQWUsYUFBYSxPQUFPLENBQUMsT0FBTyxPQUFPLFVBQVU7QUFDeEQsWUFBSSxRQUFRLEtBQUssTUFBTSxLQUFLLFlBQVksTUFBTSxNQUFNLFFBQVEsR0FBRyxLQUFLLFlBQVksR0FBRztBQUMvRSxpQkFBTztBQUFBLFFBQ1g7QUFDQSxlQUFPO0FBQUEsT0FDVjtBQUNELFVBQUksbUNBQW1DO0FBQ3ZDLG1CQUFhLFFBQVEsQ0FBQyxXQUFXO0FBQzdCLDRDQUFvQyxHQUFHLE9BQU8sS0FDekMsWUFBWSxFQUNaLFVBQVUsS0FBSyxPQUFPLE1BQU0sU0FBUztBQUFBLE9BQzdDO0FBQ0QsYUFBTztBQUFBO0FBQUEsSUFPWCw4QkFBOEIsQ0FBQyxTQUFTO0FBQ3BDLFlBQU0sT0FBTyxXQUFXLFFBQVEsR0FBRyxLQUFLO0FBQ3hDLFVBQUksOEJBQThCO0FBQ2xDLHFDQUErQixJQUFJLEtBQUssUUFBUSxjQUFjO0FBQzlELFlBQU0sVUFBVSxjQUFjLFFBQVEsR0FBRztBQUN6QyxZQUFNLG1CQUFtQixDQUFDO0FBQzFCLFVBQUksU0FBUztBQUNULGNBQU0sWUFBWSxDQUFDO0FBQ25CLG1CQUFXLE9BQU8sU0FBUztBQUN2QixjQUFJLE9BQU8sVUFBVSxlQUFlLEtBQUssU0FBUyxHQUFHLEdBQUc7QUFDcEQsa0JBQU0sZUFBZSxJQUFJLFlBQVk7QUFDckMsNkJBQWlCLGdCQUFnQixRQUFRO0FBQ3pDLHNCQUFVLEtBQUssWUFBWTtBQUFBLFVBQy9CO0FBQUEsUUFDSjtBQUNBLGtCQUFVLEtBQUs7QUFDZixtQkFBVyxPQUFPLFdBQVc7QUFDekIseUNBQStCLEtBQUssT0FBTyxtQkFBbUIsaUJBQWlCLElBQUk7QUFBQSxRQUN2RjtBQUFBLE1BQ0o7QUFDQSxhQUFPO0FBQUE7QUFBQSxFQUVmO0FBUUE7QUFBQSxRQUFNLFdBQVc7QUFBQSxJQU9iLE1BQU0sQ0FBQyxhQUFhLFVBQVU7QUFDMUIsWUFBTSxJQUFJLE1BQU0sbURBQW1EO0FBQUE7QUFBQSxFQUUzRTtBQVNBO0FBQUEsUUFBTSxtQ0FBbUMsV0FBVztBQUFBLElBTWhELFdBQVcsQ0FBQyxhQUFhLFlBQVk7QUFDakMsWUFBTTtBQUNOLFdBQUssY0FBYztBQUNuQixXQUFLLGFBQWEsT0FBTyxLQUFLLFlBQVksUUFBUTtBQUFBO0FBQUEsSUFRdEQsTUFBTSxDQUFDLFlBQVksU0FBUztBQUN4QixhQUFPLElBQUksaUNBQWlDLFlBQVksU0FBUyxJQUFJO0FBQUE7QUFBQSxJQU96RSxpQkFBaUIsQ0FBQyxjQUFjO0FBQzVCLGFBQU8sT0FBTyxXQUFXLFVBQVUsS0FBSyxVQUFVLEVBQUUsT0FBTyxjQUFjLE1BQU0sRUFBRSxPQUFPLFFBQVE7QUFBQTtBQUFBLEVBRXhHO0FBUUE7QUFBQSxRQUFNLGtDQUFrQyxpQkFBaUI7QUFBQSxJQVFyRCxXQUFXLENBQUMsWUFBWSxTQUFTO0FBQzdCLFlBQU0sWUFBWSxPQUFPO0FBQUE7QUFBQSxFQUVqQztBQVVBO0FBQUEsUUFBTSw0QkFBNEIsV0FBVztBQUFBLElBT3pDLE1BQU0sQ0FBQyxZQUFZLFNBQVM7QUFDeEIsYUFBTyxJQUFJLDBCQUEwQixZQUFZLE9BQU87QUFBQTtBQUFBLEVBRWhFO0FBSUEsTUFBSTtBQUNKLFdBQVMsMEJBQTBCLEdBQUc7QUFDbEMsU0FBSyxvQkFBb0I7QUFDckIsMkJBQXFCLGlCQUFpQix3QkFBd0I7QUFBQSxJQUNsRTtBQUNBLFdBQU87QUFBQTtBQVFYLE1BQU0sMkJBQTJCO0FBS2pDLFdBQVMsb0JBQW9CLEdBQUc7QUFDNUIsV0FBTztBQUFBLE1BQ0gsTUFBTTtBQUFBLFdBQ0EsWUFBVyxDQUFDLFNBQVMsTUFBTTtBQUM3QixZQUFJLFNBQVMsUUFBUTtBQUNqQixpQkFBTyxLQUFLLE9BQU87QUFBQSxRQUN2QjtBQUNBLFlBQUksUUFBUSxXQUFXLFNBQVMsUUFBUSxXQUFXLFFBQVE7QUFDdkQsa0JBQVEsTUFBTSxnQkFBZ0IsUUFBUSxLQUFLLGFBQWEsV0FBVyx3QkFBd0IsSUFBSSxLQUFLLEVBQUUsUUFBUSxFQUFFLFNBQVMsQ0FBQztBQUFBLFFBQzlIO0FBQ0EsZ0JBQVEsUUFBUSxPQUFPLGdCQUFnQixNQUFNO0FBRTdDLGdCQUFRLFFBQVEsT0FBTyxnQkFBZ0IsY0FBYztBQUNyRCxlQUFPLEtBQUssT0FBTztBQUFBO0FBQUEsSUFFM0I7QUFBQTtBQVFKLE1BQU0seUJBQXlCO0FBSS9CLE1BQUk7QUFDSixXQUFVLENBQUMseUJBQXdCO0FBSS9CLDRCQUF1Qix3QkFBdUIsaUJBQWlCLEtBQUs7QUFJcEUsNEJBQXVCLHdCQUF1QixXQUFXLEtBQUs7QUFBQSxLQUMvRCwyQkFBMkIseUJBQXlCLENBQUMsRUFBRTtBQUUxRCxNQUFNLHdCQUF3QjtBQUFBLElBQzFCLG1CQUFtQixNQUFNO0FBQUEsSUFDekIsVUFBVTtBQUFBLElBQ1YsZ0JBQWdCLElBQUk7QUFBQSxJQUNwQixpQkFBaUIsdUJBQXVCO0FBQUEsSUFDeEMsZUFBZTtBQUFBLElBQ2YsZ0JBQWdCO0FBQUEsRUFDcEI7QUFDQSxNQUFNLGtCQUFrQjtBQUFBLElBQ3BCO0FBQUEsSUFDQTtBQUFBLElBQ0E7QUFBQSxJQUNBO0FBQUEsSUFDQTtBQUFBLElBQ0E7QUFBQSxJQUNBO0FBQUEsSUFDQTtBQUFBLElBQ0E7QUFBQSxFQUNKO0FBQ0EsTUFBTSxvQkFBb0IsSUFBSSxnQkFBZ0IsV0FBVyw0QkFBNEI7QUFJckYsV0FBUyxrQkFBa0IsQ0FBQyxVQUFVLENBQUMsR0FBRztBQUN0QyxRQUFJLElBQUksSUFBSSxJQUFJLElBQUksSUFBSTtBQUN4QixVQUFNLG1CQUFtQixLQUFLLFFBQVEscUJBQXFCLFFBQVEsT0FBWSxZQUFJLEtBQUssc0JBQXNCO0FBQzlHLFVBQU0sWUFBWSxLQUFLLFFBQVEsY0FBYyxRQUFRLE9BQVksWUFBSSxLQUFLLHNCQUFzQjtBQUNoRyxVQUFNLGtCQUFrQixLQUFLLFFBQVEsb0JBQW9CLFFBQVEsT0FBWSxZQUFJLEtBQUssc0JBQXNCO0FBQzVHLFVBQU0scUJBQXFCLEtBQUssUUFBUSx1QkFBdUIsUUFBUSxPQUFZLFlBQUksS0FBSyxzQkFBc0I7QUFDbEgsVUFBTSxpQkFBaUIsS0FBSyxRQUFRLG1CQUFtQixRQUFRLE9BQVksWUFBSSxLQUFLLHNCQUFzQjtBQUMxRyxVQUFNLGtCQUFrQixLQUFLLFFBQVEsb0JBQW9CLFFBQVEsT0FBWSxZQUFJLEtBQUssc0JBQXNCO0FBQzVHLGFBQVMsV0FBVyxHQUFHLGdCQUFnQixTQUFTLFVBQVUsU0FBVTtBQUNoRSxVQUFJLEtBQUk7QUFDUixVQUFJLFdBQVcsVUFBVTtBQUNyQixlQUFPLEtBQUssMkJBQTJCLHVCQUF1QiwyQkFBMkI7QUFDekYsZUFBTztBQUFBLE1BQ1g7QUFDQSxVQUFJLE9BQU87QUFDUCxtQkFBVyxrQkFBa0IsaUJBQWlCO0FBQzFDLGNBQUksTUFBTSxLQUFLLFlBQVksRUFBRSxTQUFTLGNBQWMsS0FDaEQsTUFBTSxRQUFRLFlBQVksRUFBRSxTQUFTLGNBQWMsS0FDbEQsTUFBTSxRQUFRLE1BQU0sS0FBSyxTQUFTLEVBQUUsWUFBWSxNQUFNLGdCQUFpQjtBQUN4RSxtQkFBTyxLQUFLLDhCQUE4QixtQ0FBbUM7QUFDN0UsbUJBQU87QUFBQSxVQUNYO0FBQUEsUUFDSjtBQUNBLGFBQUssVUFBVSxRQUFRLFVBQWUsWUFBUyxZQUFJLE1BQU0sVUFBVSxrQkFDOUQsVUFBVSxRQUFRLFVBQWUsWUFBUyxZQUFJLE1BQU0sUUFBUSxXQUFXLGlDQUFpQyxJQUFJO0FBQzdHLGlCQUFPLEtBQUssaUZBQWlGO0FBQzdGLGlCQUFPO0FBQUEsUUFDWDtBQUFBLE1BQ0o7QUFJQSxVQUFJLFlBQVksT0FBTztBQUNuQixjQUFNLGNBQWMsT0FBTSxNQUFLLGFBQWEsUUFBUSxhQUFrQixZQUFTLFlBQUksU0FBUyxZQUFZLFFBQVEsUUFBWSxZQUFJLE1BQUssVUFBVSxRQUFRLFVBQWUsWUFBUyxZQUFJLE1BQU0sZ0JBQWdCLFFBQVEsUUFBWSxZQUFJLE1BQUs7QUFDdE8sYUFBSyxrQkFBa0IsZUFBZSxLQUFLO0FBQ3ZDLGlCQUFPLEtBQUsscURBQXFEO0FBQ2pFLGlCQUFPO0FBQUEsUUFDWDtBQUVBLFlBQUksZUFBZSxPQUFPLGVBQWUsS0FBSztBQUMxQyxpQkFBTyxLQUFLLDJDQUEyQyxhQUFhO0FBQ3BFLGlCQUFPO0FBQUEsUUFDWDtBQUFBLE1BQ0o7QUFnQkEsYUFBTztBQUFBO0FBRVgsYUFBUyxjQUFjLENBQUMsZ0JBQWdCLFNBQVM7QUFDN0MsVUFBSSxnQkFBZ0I7QUFDcEIsVUFBSSxnQkFBZ0I7QUFDaEIsZ0JBQVE7QUFBQSxlQUNDLHVCQUF1QjtBQUN4Qiw0QkFBZ0IsS0FBSyxLQUFLLEtBQUssSUFBSSxHQUFHLFVBQVUsQ0FBQyxJQUFJLEtBQUssZ0JBQWdCLGlCQUFpQjtBQUMzRjtBQUFBLGVBQ0MsdUJBQXVCO0FBQ3hCLDRCQUFnQjtBQUNoQjtBQUFBO0FBQUEsTUFFWixPQUNLO0FBQ0Qsd0JBQWdCLEtBQUssT0FBTyxJQUFJO0FBQUE7QUFFcEMsYUFBTyxLQUFLLDBCQUEwQixpQkFBaUI7QUFDdkQsYUFBTztBQUFBO0FBRVgsV0FBTztBQUFBLE1BQ0gsTUFBTTtBQUFBLFdBQ0EsWUFBVyxDQUFDLFNBQVMsTUFBTTtBQUU3QixZQUFJLGdCQUFnQjtBQUNoQixrQkFBUSxNQUFNLGdCQUFnQixRQUFRLEtBQUssYUFBYSxXQUFXLFNBQVMsT0FBTyxLQUFLLE1BQU0saUJBQWlCLElBQUksQ0FBQyxDQUFDO0FBQUEsUUFDekg7QUFDQSxjQUFNLGFBQWEsUUFBUTtBQUMzQixjQUFNLGVBQWUsZ0JBQWdCLFdBQVcsUUFBUSxLQUFLLGFBQWEsSUFBSTtBQUM5RSxZQUFJLGtCQUFrQjtBQUN0QixZQUFJLFVBQVU7QUFDZCxZQUFJLGFBQWE7QUFDakIsWUFBSTtBQUNKLFlBQUk7QUFDSixlQUFPLFlBQVk7QUFDZixnQkFBTSxpQkFBaUIsb0JBQ2xCLGlCQUNBLENBQUMsT0FBTyxRQUFRLFNBQVMsRUFBRSxTQUFTLFFBQVEsTUFBTSxLQUNuRCxVQUFVLE1BQU07QUFDcEIsa0JBQVEsTUFBTSxpQkFBaUIsYUFBYTtBQUM1QyxxQkFBVztBQUNYLGtCQUFRO0FBQ1IsY0FBSTtBQUNBLG1CQUFPLEtBQUssMkJBQTJCLFdBQVcsaUJBQWlCLFlBQVksYUFBYTtBQUM1Rix1QkFBVyxNQUFNLEtBQUssT0FBTztBQUM3Qiw4QkFBa0Isb0JBQXFCLGtCQUFrQixTQUFTLFdBQVc7QUFBQSxtQkFFMUUsR0FBUDtBQUNJLGdCQUFJLGlCQUFpQixZQUFZLENBQUMsR0FBRztBQUNqQyxxQkFBTyxNQUFNLHVDQUF1QyxFQUFFLGtCQUFrQixFQUFFLE1BQU07QUFDaEYsc0JBQVE7QUFBQSxZQUNaLE9BQ0s7QUFDRCxxQkFBTyxNQUFNLHVDQUF1QyxTQUFTLGdCQUFnQixDQUFDLEdBQUc7QUFDakYsb0JBQU07QUFBQTtBQUFBO0FBR2QsdUJBQWEsWUFBWSxFQUFFLGdCQUFnQixTQUFTLFVBQVUsTUFBTSxDQUFDO0FBQ3JFLGNBQUksWUFBWTtBQUNaLGtCQUFNLE1BQU0sZUFBZSxnQkFBZ0IsT0FBTyxHQUFHLFFBQVEsYUFBYSxpQkFBaUI7QUFBQSxVQUMvRjtBQUNBO0FBQUEsUUFDSjtBQUNBLFlBQUksVUFBVTtBQUNWLGlCQUFPO0FBQUEsUUFDWDtBQUNBLGNBQU0sVUFBVSxRQUFRLFVBQWUsWUFBSSxRQUFRLElBQUksaUJBQWlCLFVBQVUseUNBQXlDO0FBQUE7QUFBQSxJQUVuSTtBQUFBO0FBUUosTUFBTSx1Q0FBdUM7QUFJN0MsV0FBUyxnQ0FBZ0MsQ0FBQyxTQUFTO0FBQy9DLGFBQVMsV0FBVyxDQUFDLFNBQVM7QUFDMUIsY0FBUSxRQUFRLElBQUksZ0JBQWdCLFdBQVcsSUFBSSxLQUFLLEVBQUUsWUFBWSxDQUFDO0FBQ3ZFLFVBQUksUUFBUSxnQkFDQSxRQUFRLFNBQVMsWUFBWSxPQUFPLFNBQVMsUUFBUSxJQUFJLE1BQ2pFLFFBQVEsS0FBSyxTQUFTLEdBQUc7QUFDekIsZ0JBQVEsUUFBUSxJQUFJLGdCQUFnQixnQkFBZ0IsT0FBTyxXQUFXLFFBQVEsSUFBSSxDQUFDO0FBQUEsTUFDdkY7QUFDQSxZQUFNLGVBQWU7QUFBQSxRQUNqQixRQUFRLE9BQU8sWUFBWTtBQUFBLFFBQzNCLHFCQUFxQixTQUFTLGdCQUFnQixnQkFBZ0I7QUFBQSxRQUM5RCxxQkFBcUIsU0FBUyxnQkFBZ0IsZ0JBQWdCO0FBQUEsUUFDOUQscUJBQXFCLFNBQVMsZ0JBQWdCLGNBQWM7QUFBQSxRQUM1RCxxQkFBcUIsU0FBUyxnQkFBZ0IsV0FBVztBQUFBLFFBQ3pELHFCQUFxQixTQUFTLGdCQUFnQixZQUFZO0FBQUEsUUFDMUQscUJBQXFCLFNBQVMsZ0JBQWdCLElBQUk7QUFBQSxRQUNsRCxxQkFBcUIsU0FBUyxnQkFBZ0IsaUJBQWlCO0FBQUEsUUFDL0QscUJBQXFCLFNBQVMsZ0JBQWdCLFFBQVE7QUFBQSxRQUN0RCxxQkFBcUIsU0FBUyxnQkFBZ0IsYUFBYTtBQUFBLFFBQzNELHFCQUFxQixTQUFTLGdCQUFnQixtQkFBbUI7QUFBQSxRQUNqRSxxQkFBcUIsU0FBUyxnQkFBZ0IsS0FBSztBQUFBLE1BQ3ZELEVBQUUsS0FBSyxJQUFJLElBQ1AsT0FDQSw4QkFBOEIsT0FBTyxJQUNyQywrQkFBK0IsT0FBTztBQUMxQyxZQUFNLFlBQVksT0FBTyxXQUFXLFVBQVUsUUFBUSxVQUFVLEVBQzNELE9BQU8sY0FBYyxNQUFNLEVBQzNCLE9BQU8sUUFBUTtBQUNwQixjQUFRLFFBQVEsSUFBSSxnQkFBZ0IsZUFBZSxhQUFhLFFBQVEsZUFBZSxXQUFXO0FBQUE7QUFVdEcsYUFBUyxvQkFBb0IsQ0FBQyxTQUFTLFlBQVk7QUFDL0MsWUFBTSxRQUFRLFFBQVEsUUFBUSxJQUFJLFVBQVU7QUFDNUMsV0FBSyxPQUFPO0FBQ1IsZUFBTztBQUFBLE1BQ1g7QUFJQSxVQUFJLGVBQWUsZ0JBQWdCLGtCQUFrQixVQUFVLEtBQUs7QUFDaEUsZUFBTztBQUFBLE1BQ1g7QUFDQSxhQUFPO0FBQUE7QUFjWCxhQUFTLDZCQUE2QixDQUFDLFNBQVM7QUFDNUMsVUFBSSxlQUFlLENBQUM7QUFDcEIsa0JBQVksTUFBTSxVQUFVLFFBQVEsU0FBUztBQUN6QyxZQUFJLEtBQUssWUFBWSxFQUFFLFdBQVcsZ0JBQWdCLGtCQUFrQixHQUFHO0FBQ25FLHVCQUFhLEtBQUssRUFBRSxNQUFNLE1BQU0sQ0FBQztBQUFBLFFBQ3JDO0FBQUEsTUFDSjtBQUNBLG1CQUFhLEtBQUssQ0FBQyxHQUFHLE1BQU07QUFDeEIsZUFBTyxjQUFjLEVBQUUsS0FBSyxZQUFZLEdBQUcsRUFBRSxLQUFLLFlBQVksQ0FBQztBQUFBLE9BQ2xFO0FBRUQscUJBQWUsYUFBYSxPQUFPLENBQUMsT0FBTyxPQUFPLFVBQVU7QUFDeEQsWUFBSSxRQUFRLEtBQUssTUFBTSxLQUFLLFlBQVksTUFBTSxNQUFNLFFBQVEsR0FBRyxLQUFLLFlBQVksR0FBRztBQUMvRSxpQkFBTztBQUFBLFFBQ1g7QUFDQSxlQUFPO0FBQUEsT0FDVjtBQUNELFVBQUksbUNBQW1DO0FBQ3ZDLG1CQUFhLFFBQVEsQ0FBQyxXQUFXO0FBQzdCLDRDQUFvQyxHQUFHLE9BQU8sS0FDekMsWUFBWSxFQUNaLFVBQVUsS0FBSyxPQUFPLE1BQU0sU0FBUztBQUFBLE9BQzdDO0FBQ0QsYUFBTztBQUFBO0FBRVgsYUFBUyw4QkFBOEIsQ0FBQyxTQUFTO0FBQzdDLFlBQU0sT0FBTyxXQUFXLFFBQVEsR0FBRyxLQUFLO0FBQ3hDLFVBQUksOEJBQThCO0FBQ2xDLHFDQUErQixJQUFJLFFBQVEsY0FBYztBQUN6RCxZQUFNLFVBQVUsY0FBYyxRQUFRLEdBQUc7QUFDekMsWUFBTSxtQkFBbUIsQ0FBQztBQUMxQixVQUFJLFNBQVM7QUFDVCxjQUFNLFlBQVksQ0FBQztBQUNuQixtQkFBVyxPQUFPLFNBQVM7QUFDdkIsY0FBSSxPQUFPLFVBQVUsZUFBZSxLQUFLLFNBQVMsR0FBRyxHQUFHO0FBQ3BELGtCQUFNLGVBQWUsSUFBSSxZQUFZO0FBQ3JDLDZCQUFpQixnQkFBZ0IsUUFBUTtBQUN6QyxzQkFBVSxLQUFLLFlBQVk7QUFBQSxVQUMvQjtBQUFBLFFBQ0o7QUFDQSxrQkFBVSxLQUFLO0FBQ2YsbUJBQVcsT0FBTyxXQUFXO0FBQ3pCLHlDQUErQixLQUFLLE9BQU8sbUJBQW1CLGlCQUFpQixJQUFJO0FBQUEsUUFDdkY7QUFBQSxNQUNKO0FBQ0EsYUFBTztBQUFBO0FBRVgsV0FBTztBQUFBLE1BQ0gsTUFBTTtBQUFBLFdBQ0EsWUFBVyxDQUFDLFNBQVMsTUFBTTtBQUM3QixvQkFBWSxPQUFPO0FBQ25CLGVBQU8sS0FBSyxPQUFPO0FBQUE7QUFBQSxJQUUzQjtBQUFBO0FBZ0JKO0FBQUEsUUFBTSw2QkFBNkIsa0JBQWtCO0FBQUEsSUFRakQsV0FBVyxDQUFDLFlBQVksU0FBUztBQUM3QixZQUFNLFlBQVksT0FBTztBQUFBO0FBQUEsU0FPdkIsWUFBVyxDQUFDLFNBQVM7QUFDdkIsVUFBSSxTQUFTLFFBQVE7QUFDakIsZUFBTyxLQUFLLFlBQVksWUFBWSxPQUFPO0FBQUEsTUFDL0M7QUFDQSxVQUFJLFFBQVEsT0FBTyxZQUFZLE1BQU0sU0FBUyxRQUFRLE9BQU8sWUFBWSxNQUFNLFFBQVE7QUFDbkYsZ0JBQVEsTUFBTSxnQkFBZ0IsUUFBUSxLQUFLLGFBQWEsV0FBVyx3QkFBd0IsSUFBSSxLQUFLLEVBQUUsUUFBUSxFQUFFLFNBQVMsQ0FBQztBQUFBLE1BQzlIO0FBQ0EsY0FBUSxRQUFRLE9BQU8sZ0JBQWdCLE1BQU07QUFFN0MsY0FBUSxRQUFRLE9BQU8sZ0JBQWdCLGNBQWM7QUFDckQsYUFBTyxLQUFLLFlBQVksWUFBWSxPQUFPO0FBQUE7QUFBQSxFQUVuRDtBQU9BO0FBQUEsUUFBTSw0QkFBNEI7QUFBQSxJQU85QixNQUFNLENBQUMsWUFBWSxTQUFTO0FBQ3hCLGFBQU8sSUFBSSxxQkFBcUIsWUFBWSxPQUFPO0FBQUE7QUFBQSxFQUUzRDtBQU9BLE1BQU0sd0NBQXdDO0FBSTlDLFdBQVMsaUNBQWlDLEdBQUc7QUFDekMsYUFBUyxvQkFBb0IsQ0FBQyxTQUFTO0FBQ25DLFVBQUksUUFBUSxnQkFDQSxRQUFRLFNBQVMsWUFBWSxPQUFPLFNBQVMsUUFBUSxJQUFJLE1BQ2pFLFFBQVEsS0FBSyxTQUFTLEdBQUc7QUFDekIsZ0JBQVEsUUFBUSxJQUFJLGdCQUFnQixnQkFBZ0IsT0FBTyxXQUFXLFFBQVEsSUFBSSxDQUFDO0FBQUEsTUFDdkY7QUFBQTtBQUVKLFdBQU87QUFBQSxNQUNILE1BQU07QUFBQSxXQUNBLFlBQVcsQ0FBQyxTQUFTLE1BQU07QUFDN0IsNkJBQXFCLE9BQU87QUFDNUIsZUFBTyxLQUFLLE9BQU87QUFBQTtBQUFBLElBRTNCO0FBQUE7QUFVSixXQUFTLGNBQWMsQ0FBQyxVQUFVO0FBQzlCLFNBQUssbUJBQW1CLGFBQWEsVUFBVTtBQUMzQyxhQUFPO0FBQUEsSUFDWDtBQUNBLFVBQU0sZUFBZTtBQUNyQixXQUFRLE1BQU0sUUFBUSxhQUFhLFNBQVMsWUFDakMsYUFBYSxZQUFZLG1CQUN6QixhQUFhLDJCQUEyQjtBQUFBO0FBVXZEO0FBQUEsUUFBTSxTQUFTO0FBQUEsSUFPWCxXQUFXLENBQUMsV0FBVyxVQUFVLENBQUMsR0FBRztBQUNqQyxXQUFLLFlBQVk7QUFDakIsV0FBSyxVQUFVO0FBQUE7QUFBQSxJQVFuQixzQkFBc0IsR0FBRztBQUNyQixhQUFPO0FBQUEsUUFDSCxZQUFZLEtBQUssUUFBUTtBQUFBLFFBQ3pCLHdCQUF3QixLQUFLO0FBQUEsTUFDakM7QUFBQTtBQUFBLEVBRVI7QUFRQSxXQUFTLFdBQVcsQ0FBQyxZQUFZLGtCQUFrQixDQUFDLEdBQUc7QUFDbkQsU0FBSyxZQUFZO0FBQ2IsbUJBQWEsSUFBSTtBQUFBLElBQ3JCO0FBQ0EsVUFBTSxXQUFXLElBQUksU0FBUyxDQUFDLEdBQUcsZUFBZTtBQUNqRCxhQUFTLGNBQWM7QUFDdkIsV0FBTztBQUFBO0FBRVgsV0FBUyx3QkFBd0IsQ0FBQyxVQUFVO0FBQ3hDLFVBQU0sd0JBQXdCO0FBQUEsTUFDMUI7QUFBQSxNQUNBO0FBQUEsTUFDQTtBQUFBLE1BQ0E7QUFBQSxNQUNBO0FBQUEsTUFDQTtBQUFBLE1BQ0E7QUFBQSxJQUNKO0FBQ0EsUUFBSSxTQUFTLFVBQVUsUUFBUTtBQUMzQixZQUFNLGlCQUFpQixTQUFTLFVBQVUsT0FBTyxDQUFDLFlBQVk7QUFDMUQsZ0JBQVEsc0JBQXNCLEtBQUssQ0FBQyxpQkFBaUIsYUFBYSxPQUFPLENBQUM7QUFBQSxPQUM3RTtBQUNELFVBQUksZUFBZSxRQUFRO0FBQ3ZCLGNBQU0sY0FBYyxlQUFlLEtBQUssQ0FBQyxZQUFZLHdCQUF3QixPQUFPLENBQUM7QUFFckYsZUFBTztBQUFBLFVBQ0gsaUJBQWlCLGVBQWUsaUNBQWlDLGNBQWM7QUFBQSxVQUMvRSxZQUFZO0FBQUEsUUFDaEI7QUFBQSxNQUNKO0FBQUEsSUFDSjtBQUNBO0FBQUE7QUFFSixXQUFTLG9CQUFvQixDQUFDLFVBQVU7QUFDcEMsUUFBSTtBQUNKLFVBQU0sS0FBSyxTQUFTLFdBQVcsWUFBWSxhQUFhLElBQUksY0FBYyxNQUFNLE9BQU8sSUFBSSxDQUFDLFlBQVksQ0FBQztBQUN6RyxRQUFJLGFBQWEsU0FBUztBQUMxQixTQUFLLFlBQVk7QUFDYixtQkFBYSxXQUFXLGVBQWUsa0JBQWtCLFFBQVEsSUFBSSwyQkFBMkI7QUFDaEcsZUFBUyxrQkFBa0I7QUFBQSxJQUMvQjtBQUNBLFFBQUksZUFBZSxTQUFTO0FBQzVCLFNBQUssY0FBYztBQUNmLFlBQU0saUJBQWlCLCtCQUErQjtBQUN0RCxZQUFNLGtCQUFrQixZQUFZLG9CQUFvQixZQUFZLGlCQUFpQixrQkFDL0UsR0FBRyxZQUFZLGlCQUFpQixtQkFBbUIsbUJBQ25ELEdBQUc7QUFDVCxxQkFBZSxXQUFXLHFCQUFxQixPQUFPLE9BQU8sT0FBTyxPQUFPLENBQUMsR0FBRyxXQUFXLEdBQUcsRUFBRSxnQkFBZ0I7QUFBQSxRQUN2Ryw4QkFBOEI7QUFBQSxRQUM5QixrQ0FBa0M7QUFBQSxRQUNsQyxRQUFRLE9BQU87QUFBQSxNQUNuQixHQUFHLGtCQUFrQjtBQUFBLFFBQ2pCO0FBQUEsTUFDSixHQUFHLHNCQUFzQjtBQUFBLFFBQ3JCLGNBQWMsUUFBUTtBQUFBLFFBQ3RCLG1CQUFtQjtBQUFBLFVBQ2YsS0FBSztBQUFBLFlBR0QsWUFBWTtBQUFBLFVBQ2hCO0FBQUEsUUFDSjtBQUFBLE1BQ0osR0FBRyx3QkFBd0I7QUFBQSxRQUN2QixVQUFVLFFBQVE7QUFBQSxRQUNsQixtQkFBbUI7QUFBQSxVQUNmLEtBQUs7QUFBQSxZQUdELFlBQVk7QUFBQSxVQUNoQjtBQUFBLFFBQ0o7QUFBQSxNQUNKLEVBQUUsQ0FBQyxDQUFDO0FBQ1IsbUJBQWEsYUFBYSxFQUFFLE9BQU8sUUFBUSxDQUFDO0FBQzVDLG1CQUFhLGFBQWEsRUFBRSxNQUFNLGlCQUFpQiw2QkFBNkIsQ0FBQztBQUNqRixtQkFBYSxVQUFVLGtDQUFrQyxDQUFDO0FBQzFELG1CQUFhLFVBQVUsbUJBQW1CLFlBQVksWUFBWSxHQUFHLEVBQUUsT0FBTyxRQUFRLENBQUM7QUFDdkYsbUJBQWEsVUFBVSxxQkFBcUIsQ0FBQztBQUM3QyxZQUFNLG1CQUFtQix5QkFBeUIsUUFBUTtBQUMxRCxVQUFJLGtCQUFrQjtBQUNsQixxQkFBYSxVQUFVLGlCQUFpQixpQkFBaUIsaUJBQWlCLGFBQWEsRUFBRSxZQUFZLFFBQVEsSUFBSSxTQUFTO0FBQUEsTUFDOUg7QUFDQSxZQUFNLGFBQWEsMEJBQTBCLFFBQVE7QUFDckQsVUFBSSxTQUFTLGtCQUFrQixVQUFVLEdBQUc7QUFDeEMscUJBQWEsVUFBVSxpQkFBaUIsZ0NBQWdDO0FBQUEsVUFDcEU7QUFBQSxVQUNBLFNBQVMsS0FBSyxZQUFZLGNBQWMsUUFBUSxPQUFZLFlBQUksS0FBSztBQUFBLFVBQ3JFLG9CQUFvQixFQUFFLDZCQUE2QixXQUFXLGtDQUFrQztBQUFBLFFBQ3BHLENBQUMsR0FBRyxFQUFFLE9BQU8sT0FBTyxDQUFDO0FBQUEsTUFDekIsV0FDUyxzQkFBc0IsNEJBQTRCO0FBQ3ZELHFCQUFhLFVBQVUsaUNBQWlDO0FBQUEsVUFDcEQsYUFBYSxXQUFXO0FBQUEsVUFDeEIsWUFBWSxXQUFXO0FBQUEsUUFDM0IsQ0FBQyxHQUFHLEVBQUUsT0FBTyxPQUFPLENBQUM7QUFBQSxNQUN6QjtBQUNBLGVBQVMsZ0JBQWdCO0FBQUEsSUFDN0I7QUFDQSxXQUFPLE9BQU8sT0FBTyxPQUFPLE9BQU8sQ0FBQyxHQUFHLFdBQVcsR0FBRyxFQUFFLHlCQUF5QixNQUFNLFlBQVksVUFBVSxhQUFhLENBQUM7QUFBQTtBQUU5SCxXQUFTLHlCQUF5QixDQUFDLFVBQVU7QUFFekMsUUFBSSxTQUFTLGFBQWE7QUFDdEIsYUFBTyxTQUFTO0FBQUEsSUFDcEI7QUFFQSxRQUFJLGFBQWEsSUFBSTtBQUNyQixlQUFXLFdBQVcsU0FBUyxXQUFXO0FBQ3RDLFVBQUksU0FBUyxrQkFBa0IsUUFBUSxVQUFVLEdBQUc7QUFHaEQscUJBQWEsUUFBUTtBQUFBLE1BQ3pCLFdBQ1MsNkJBQTZCLE9BQU8sR0FBRztBQUM1QyxlQUFPO0FBQUEsTUFDWDtBQUFBLElBQ0o7QUFDQSxXQUFPO0FBQUE7QUFFWCxXQUFTLDRCQUE0QixDQUFDLFNBQVM7QUFDM0MsUUFBSSxtQkFBbUIsNEJBQTRCO0FBQy9DLGFBQU87QUFBQSxJQUNYO0FBQ0EsV0FBTyxRQUFRLFlBQVksU0FBUztBQUFBO0FBRXhDLFdBQVMscUJBQXFCLENBQUMsU0FBUztBQUNwQyxRQUFJLG1CQUFtQixxQkFBcUI7QUFDeEMsYUFBTztBQUFBLElBQ1g7QUFDQSxXQUFPLFFBQVEsWUFBWSxTQUFTO0FBQUE7QUFFeEMsV0FBUyw0QkFBNEIsQ0FBQyxTQUFTO0FBQzNDLFdBQU8sU0FBUyxrQkFBa0IsUUFBUSxVQUFVO0FBQUE7QUFFeEQsV0FBUyw2QkFBNkIsQ0FBQyxTQUFTO0FBQzVDLFFBQUksbUJBQW1CLDZCQUE2QjtBQUNoRCxhQUFPO0FBQUEsSUFDWDtBQUNBLFdBQU8sUUFBUSxZQUFZLFNBQVM7QUFBQTtBQUV4QyxXQUFTLDJCQUEyQixDQUFDLFNBQVM7QUFDMUMsUUFBSSxtQkFBbUIsMkJBQTJCO0FBQzlDLGFBQU87QUFBQSxJQUNYO0FBQ0EsV0FBTyxRQUFRLFlBQVksU0FBUztBQUFBO0FBRXhDLFdBQVMsK0JBQStCLENBQUMsU0FBUztBQUM5QyxXQUFPLFFBQVEsWUFBWSxTQUFTO0FBQUE7QUFFeEMsV0FBUyx1QkFBdUIsQ0FBQyxTQUFTO0FBQ3RDLFdBQU8sUUFBUSxZQUFZLFNBQVM7QUFBQTtBQUV4QyxXQUFTLHVCQUF1QixDQUFDLFNBQVM7QUFDdEMsVUFBTSxnQkFBZ0I7QUFBQSxNQUNsQjtBQUFBLE1BQ0E7QUFBQSxNQUNBO0FBQUEsTUFDQTtBQUFBLE1BQ0E7QUFBQSxNQUNBO0FBQUEsTUFDQTtBQUFBLElBQ0o7QUFDQSxVQUFNLGlCQUFpQjtBQUFBLE1BQ25CLGFBQWEsT0FBTyxZQUFZO0FBQzVCLGVBQU87QUFBQSxVQUNIO0FBQUEsVUFDQSxTQUFTLFFBQVEsUUFBUSxNQUFNO0FBQUEsVUFDL0IsUUFBUTtBQUFBLFFBQ1o7QUFBQTtBQUFBLElBRVI7QUFDQSxVQUFNLDJCQUEyQjtBQUFBLE1BQzdCLEdBQUcsQ0FBQyxXQUFXLFVBQVU7QUFBQTtBQUFBLE1BR3pCLFNBQVMsQ0FBQyxXQUFXO0FBQ2pCLGVBQU87QUFBQTtBQUFBLElBRWY7QUFDQSxVQUFNLGlCQUFpQixRQUFRLE9BQU8sZ0JBQWdCLHdCQUF3QjtBQUM5RSxVQUFNLGFBQWEsZUFBZSxZQUFZO0FBRTlDLFdBQU8sY0FBYyxLQUFLLENBQUMsb0JBQW9CO0FBQzNDLGFBQU8sV0FBVyxXQUFXLGVBQWU7QUFBQSxLQUMvQztBQUFBO0FBVUwsTUFBTSx3QkFBd0I7QUFBQSxJQUMxQixnQkFBZ0I7QUFBQSxJQUNoQixTQUFTO0FBQUEsSUFDVCxNQUFNO0FBQUEsTUFDRixNQUFNO0FBQUEsTUFDTixXQUFXO0FBQUEsTUFDWCxpQkFBaUI7QUFBQSxRQUNiLHNCQUFzQjtBQUFBLFVBQ2xCLGdCQUFnQjtBQUFBLFVBQ2hCLFNBQVM7QUFBQSxVQUNULE1BQU07QUFBQSxZQUNGLE1BQU07QUFBQSxZQUNOLFdBQVc7QUFBQSxVQUNmO0FBQUEsUUFDSjtBQUFBLFFBQ0EsYUFBYTtBQUFBLFVBQ1QsZ0JBQWdCO0FBQUEsVUFDaEIsU0FBUztBQUFBLFVBQ1QsTUFBTTtBQUFBLFlBQ0YsTUFBTTtBQUFBLFlBQ04sV0FBVztBQUFBLFVBQ2Y7QUFBQSxRQUNKO0FBQUEsUUFDQSxlQUFlO0FBQUEsVUFDWCxnQkFBZ0I7QUFBQSxVQUNoQixTQUFTO0FBQUEsVUFDVCxNQUFNO0FBQUEsWUFDRixNQUFNO0FBQUEsWUFDTixXQUFXO0FBQUEsVUFDZjtBQUFBLFFBQ0o7QUFBQSxRQUNBLE1BQU07QUFBQSxVQUNGLGdCQUFnQjtBQUFBLFVBQ2hCLFNBQVM7QUFBQSxVQUNULGNBQWM7QUFBQSxVQUNkLGdCQUFnQjtBQUFBLFVBQ2hCLE1BQU07QUFBQSxZQUNGLE1BQU07QUFBQSxZQUNOLFNBQVM7QUFBQSxjQUNMLE1BQU07QUFBQSxnQkFDRixNQUFNO0FBQUEsZ0JBQ04sV0FBVztBQUFBLGNBQ2Y7QUFBQSxZQUNKO0FBQUEsVUFDSjtBQUFBLFFBQ0o7QUFBQSxRQUNBLHVCQUF1QjtBQUFBLFVBQ25CLGdCQUFnQjtBQUFBLFVBQ2hCLFNBQVM7QUFBQSxVQUNULE1BQU07QUFBQSxZQUNGLE1BQU07QUFBQSxVQUNWO0FBQUEsUUFDSjtBQUFBLFFBQ0EsdUJBQXVCO0FBQUEsVUFDbkIsZ0JBQWdCO0FBQUEsVUFDaEIsU0FBUztBQUFBLFVBQ1QsTUFBTTtBQUFBLFlBQ0YsTUFBTTtBQUFBLFlBQ04sV0FBVztBQUFBLFVBQ2Y7QUFBQSxRQUNKO0FBQUEsUUFDQSxlQUFlO0FBQUEsVUFDWCxnQkFBZ0I7QUFBQSxVQUNoQixTQUFTO0FBQUEsVUFDVCxNQUFNO0FBQUEsWUFDRixNQUFNO0FBQUEsWUFDTixXQUFXO0FBQUEsVUFDZjtBQUFBLFFBQ0o7QUFBQSxNQUNKO0FBQUEsSUFDSjtBQUFBLEVBQ0o7QUFDQSxNQUFNLFVBQVU7QUFBQSxJQUNaLGdCQUFnQjtBQUFBLElBQ2hCLE1BQU07QUFBQSxNQUNGLE1BQU07QUFBQSxNQUNOLFdBQVc7QUFBQSxNQUNYLGlCQUFpQjtBQUFBLFFBQ2IsU0FBUztBQUFBLFVBQ0wsZ0JBQWdCO0FBQUEsVUFDaEIsVUFBVTtBQUFBLFVBQ1YsU0FBUztBQUFBLFVBQ1QsTUFBTTtBQUFBLFlBQ0YsTUFBTTtBQUFBLFVBQ1Y7QUFBQSxRQUNKO0FBQUEsUUFDQSxnQkFBZ0I7QUFBQSxVQUNaLGdCQUFnQjtBQUFBLFVBQ2hCLFVBQVU7QUFBQSxVQUNWLFNBQVM7QUFBQSxVQUNULE1BQU07QUFBQSxZQUNGLE1BQU07QUFBQSxVQUNWO0FBQUEsUUFDSjtBQUFBLFFBQ0EsTUFBTTtBQUFBLFVBQ0YsZ0JBQWdCO0FBQUEsVUFDaEIsVUFBVTtBQUFBLFVBQ1YsU0FBUztBQUFBLFVBQ1QsTUFBTTtBQUFBLFlBQ0YsTUFBTTtBQUFBLFVBQ1Y7QUFBQSxRQUNKO0FBQUEsUUFDQSxPQUFPO0FBQUEsVUFDSCxnQkFBZ0I7QUFBQSxVQUNoQixVQUFVO0FBQUEsVUFDVixTQUFTO0FBQUEsVUFDVCxNQUFNO0FBQUEsWUFDRixNQUFNO0FBQUEsVUFDVjtBQUFBLFFBQ0o7QUFBQSxRQUNBLGlCQUFpQjtBQUFBLFVBQ2IsZ0JBQWdCO0FBQUEsVUFDaEIsU0FBUztBQUFBLFVBQ1QsTUFBTTtBQUFBLFlBQ0YsTUFBTTtBQUFBLFlBQ04sV0FBVztBQUFBLFVBQ2Y7QUFBQSxRQUNKO0FBQUEsTUFDSjtBQUFBLElBQ0o7QUFBQSxFQUNKO0FBQ0EsTUFBTSxrQkFBa0I7QUFBQSxJQUNwQixnQkFBZ0I7QUFBQSxJQUNoQixNQUFNO0FBQUEsTUFDRixNQUFNO0FBQUEsTUFDTixXQUFXO0FBQUEsTUFDWCxpQkFBaUI7QUFBQSxRQUNiLFNBQVM7QUFBQSxVQUNMLGdCQUFnQjtBQUFBLFVBQ2hCLFVBQVU7QUFBQSxVQUNWLFNBQVM7QUFBQSxVQUNULE1BQU07QUFBQSxZQUNGLE1BQU07QUFBQSxVQUNWO0FBQUEsUUFDSjtBQUFBLFFBQ0EsTUFBTTtBQUFBLFVBQ0YsYUFBYTtBQUFBLFlBQ1Qsa0JBQWtCO0FBQUEsVUFDdEI7QUFBQSxVQUNBLGdCQUFnQjtBQUFBLFVBQ2hCLFNBQVM7QUFBQSxVQUNULE1BQU07QUFBQSxZQUNGLE1BQU07QUFBQSxVQUNWO0FBQUEsUUFDSjtBQUFBLE1BQ0o7QUFBQSxJQUNKO0FBQUEsRUFDSjtBQUNBLE1BQU0sVUFBVTtBQUFBLElBQ1osZ0JBQWdCO0FBQUEsSUFDaEIsTUFBTTtBQUFBLE1BQ0YsTUFBTTtBQUFBLE1BQ04sV0FBVztBQUFBLE1BQ1gsaUJBQWlCO0FBQUEsUUFDYixTQUFTO0FBQUEsVUFDTCxnQkFBZ0I7QUFBQSxVQUNoQixTQUFTO0FBQUEsVUFDVCxNQUFNO0FBQUEsWUFDRixNQUFNO0FBQUEsVUFDVjtBQUFBLFFBQ0o7QUFBQSxRQUNBLFNBQVM7QUFBQSxVQUNMLGdCQUFnQjtBQUFBLFVBQ2hCLFVBQVU7QUFBQSxVQUNWLFNBQVM7QUFBQSxVQUNULE1BQU07QUFBQSxZQUNGLE1BQU07QUFBQSxVQUNWO0FBQUEsUUFDSjtBQUFBLFFBQ0EsYUFBYTtBQUFBLFVBQ1QsZ0JBQWdCO0FBQUEsVUFDaEIsU0FBUztBQUFBLFVBQ1QsTUFBTTtBQUFBLFlBQ0YsTUFBTTtBQUFBLFVBQ1Y7QUFBQSxRQUNKO0FBQUEsUUFDQSxpQkFBaUI7QUFBQSxVQUNiLGdCQUFnQjtBQUFBLFVBQ2hCLFNBQVM7QUFBQSxVQUNULE1BQU07QUFBQSxZQUNGLE1BQU07QUFBQSxZQUNOLFdBQVc7QUFBQSxVQUNmO0FBQUEsUUFDSjtBQUFBLE1BQ0o7QUFBQSxJQUNKO0FBQUEsRUFDSjtBQUNBLE1BQU0sV0FBVztBQUFBLElBQ2IsZ0JBQWdCO0FBQUEsSUFDaEIsTUFBTTtBQUFBLE1BQ0YsTUFBTTtBQUFBLE1BQ04sV0FBVztBQUFBLE1BQ1gsaUJBQWlCO0FBQUEsUUFDYixnQkFBZ0I7QUFBQSxVQUNaLGdCQUFnQjtBQUFBLFVBQ2hCLFVBQVU7QUFBQSxVQUNWLFNBQVM7QUFBQSxVQUNULE1BQU07QUFBQSxZQUNGLE1BQU07QUFBQSxVQUNWO0FBQUEsUUFDSjtBQUFBLFFBQ0EsZ0JBQWdCO0FBQUEsVUFDWixnQkFBZ0I7QUFBQSxVQUNoQixVQUFVO0FBQUEsVUFDVixTQUFTO0FBQUEsVUFDVCxNQUFNO0FBQUEsWUFDRixNQUFNO0FBQUEsVUFDVjtBQUFBLFFBQ0o7QUFBQSxRQUNBLGdCQUFnQjtBQUFBLFVBQ1osZ0JBQWdCO0FBQUEsVUFDaEIsVUFBVTtBQUFBLFVBQ1YsU0FBUztBQUFBLFVBQ1QsTUFBTTtBQUFBLFlBQ0YsTUFBTTtBQUFBLFVBQ1Y7QUFBQSxRQUNKO0FBQUEsUUFDQSxnQkFBZ0I7QUFBQSxVQUNaLGdCQUFnQjtBQUFBLFVBQ2hCLFVBQVU7QUFBQSxVQUNWLFNBQVM7QUFBQSxVQUNULE1BQU07QUFBQSxZQUNGLE1BQU07QUFBQSxVQUNWO0FBQUEsUUFDSjtBQUFBLFFBQ0EsaUJBQWlCO0FBQUEsVUFDYixhQUFhO0FBQUEsWUFDVCxrQkFBa0I7QUFBQSxVQUN0QjtBQUFBLFVBQ0EsZ0JBQWdCO0FBQUEsVUFDaEIsVUFBVTtBQUFBLFVBQ1YsU0FBUztBQUFBLFVBQ1QsTUFBTTtBQUFBLFlBQ0YsTUFBTTtBQUFBLFVBQ1Y7QUFBQSxRQUNKO0FBQUEsTUFDSjtBQUFBLElBQ0o7QUFBQSxFQUNKO0FBQ0EsTUFBTSxnQkFBZ0I7QUFBQSxJQUNsQixnQkFBZ0I7QUFBQSxJQUNoQixNQUFNO0FBQUEsTUFDRixNQUFNO0FBQUEsTUFDTixXQUFXO0FBQUEsTUFDWCxpQkFBaUI7QUFBQSxRQUNiLFNBQVM7QUFBQSxVQUNMLGdCQUFnQjtBQUFBLFVBQ2hCLFVBQVU7QUFBQSxVQUNWLFNBQVM7QUFBQSxVQUNULE1BQU07QUFBQSxZQUNGLE1BQU07QUFBQSxVQUNWO0FBQUEsUUFDSjtBQUFBLFFBQ0EsZUFBZTtBQUFBLFVBQ1gsZ0JBQWdCO0FBQUEsVUFDaEIsU0FBUztBQUFBLFVBQ1QsTUFBTTtBQUFBLFlBQ0YsTUFBTTtBQUFBLFVBQ1Y7QUFBQSxRQUNKO0FBQUEsUUFDQSxzQkFBc0I7QUFBQSxVQUNsQixnQkFBZ0I7QUFBQSxVQUNoQixTQUFTO0FBQUEsVUFDVCxNQUFNO0FBQUEsWUFDRixNQUFNO0FBQUEsVUFDVjtBQUFBLFFBQ0o7QUFBQSxRQUNBLDBCQUEwQjtBQUFBLFVBQ3RCLGdCQUFnQjtBQUFBLFVBQ2hCLFNBQVM7QUFBQSxVQUNULE1BQU07QUFBQSxZQUNGLE1BQU07QUFBQSxVQUNWO0FBQUEsUUFDSjtBQUFBLE1BQ0o7QUFBQSxJQUNKO0FBQUEsRUFDSjtBQUNBLE1BQU0sZUFBZTtBQUFBLElBQ2pCLGdCQUFnQjtBQUFBLElBQ2hCLE1BQU07QUFBQSxNQUNGLE1BQU07QUFBQSxNQUNOLFdBQVc7QUFBQSxNQUNYLGlCQUFpQjtBQUFBLFFBQ2IsU0FBUztBQUFBLFVBQ0wsZ0JBQWdCO0FBQUEsVUFDaEIsU0FBUztBQUFBLFVBQ1QsTUFBTTtBQUFBLFlBQ0YsTUFBTTtBQUFBLFVBQ1Y7QUFBQSxRQUNKO0FBQUEsUUFDQSxNQUFNO0FBQUEsVUFDRixnQkFBZ0I7QUFBQSxVQUNoQixTQUFTO0FBQUEsVUFDVCxNQUFNO0FBQUEsWUFDRixNQUFNO0FBQUEsVUFDVjtBQUFBLFFBQ0o7QUFBQSxRQUNBLDJCQUEyQjtBQUFBLFVBQ3ZCLGdCQUFnQjtBQUFBLFVBQ2hCLFNBQVM7QUFBQSxVQUNULE1BQU07QUFBQSxZQUNGLE1BQU07QUFBQSxVQUNWO0FBQUEsUUFDSjtBQUFBLE1BQ0o7QUFBQSxJQUNKO0FBQUEsRUFDSjtBQUNBLE1BQU0sd0JBQXdCO0FBQUEsSUFDMUIsZ0JBQWdCO0FBQUEsSUFDaEIsU0FBUztBQUFBLElBQ1QsTUFBTTtBQUFBLE1BQ0YsTUFBTTtBQUFBLE1BQ04sV0FBVztBQUFBLE1BQ1gsaUJBQWlCO0FBQUEsUUFDYixnQkFBZ0I7QUFBQSxVQUNaLGdCQUFnQjtBQUFBLFVBQ2hCLFNBQVM7QUFBQSxVQUNULE1BQU07QUFBQSxZQUNGLE1BQU07QUFBQSxZQUNOLFdBQVc7QUFBQSxVQUNmO0FBQUEsUUFDSjtBQUFBLE1BQ0o7QUFBQSxJQUNKO0FBQUEsRUFDSjtBQUNBLE1BQU0saUJBQWlCO0FBQUEsSUFDbkIsZ0JBQWdCO0FBQUEsSUFDaEIsTUFBTTtBQUFBLE1BQ0YsTUFBTTtBQUFBLE1BQ04sV0FBVztBQUFBLE1BQ1gsaUJBQWlCO0FBQUEsUUFDYixRQUFRO0FBQUEsVUFDSixnQkFBZ0I7QUFBQSxVQUNoQixVQUFVO0FBQUEsVUFDVixTQUFTO0FBQUEsVUFDVCxNQUFNO0FBQUEsWUFDRixNQUFNO0FBQUEsWUFDTixlQUFlLENBQUMsUUFBUSxhQUFhLGFBQWE7QUFBQSxVQUN0RDtBQUFBLFFBQ0o7QUFBQSxRQUNBLFlBQVk7QUFBQSxVQUNSLGdCQUFnQjtBQUFBLFVBQ2hCLFVBQVU7QUFBQSxVQUNWLFNBQVM7QUFBQSxVQUNULE1BQU07QUFBQSxZQUNGLE1BQU07QUFBQSxVQUNWO0FBQUEsUUFDSjtBQUFBLE1BQ0o7QUFBQSxJQUNKO0FBQUEsRUFDSjtBQUNBLE1BQU0sZ0NBQWdDO0FBQUEsSUFDbEMsZ0JBQWdCO0FBQUEsSUFDaEIsU0FBUztBQUFBLElBQ1QsTUFBTTtBQUFBLE1BQ0YsTUFBTTtBQUFBLE1BQ04sV0FBVztBQUFBLE1BQ1gsaUJBQWlCO0FBQUEsUUFDYixpQkFBaUI7QUFBQSxVQUNiLGdCQUFnQjtBQUFBLFVBQ2hCLFVBQVU7QUFBQSxVQUNWLFNBQVM7QUFBQSxVQUNULGdCQUFnQjtBQUFBLFVBQ2hCLE1BQU07QUFBQSxZQUNGLE1BQU07QUFBQSxVQUNWO0FBQUEsUUFDSjtBQUFBLFFBQ0EsUUFBUTtBQUFBLFVBQ0osZ0JBQWdCO0FBQUEsVUFDaEIsU0FBUztBQUFBLFVBQ1QsTUFBTTtBQUFBLFlBQ0YsTUFBTTtBQUFBLFVBQ1Y7QUFBQSxRQUNKO0FBQUEsUUFDQSxRQUFRO0FBQUEsVUFDSixnQkFBZ0I7QUFBQSxVQUNoQixTQUFTO0FBQUEsVUFDVCxNQUFNO0FBQUEsWUFDRixNQUFNO0FBQUEsVUFDVjtBQUFBLFFBQ0o7QUFBQSxRQUNBLGFBQWE7QUFBQSxVQUNULGdCQUFnQjtBQUFBLFVBQ2hCLFNBQVM7QUFBQSxVQUNULE1BQU07QUFBQSxZQUNGLE1BQU07QUFBQSxVQUNWO0FBQUEsUUFDSjtBQUFBLFFBQ0EsZ0JBQWdCO0FBQUEsVUFDWixnQkFBZ0I7QUFBQSxVQUNoQixVQUFVO0FBQUEsVUFDVixTQUFTO0FBQUEsVUFDVCxjQUFjO0FBQUEsVUFDZCxnQkFBZ0I7QUFBQSxVQUNoQixNQUFNO0FBQUEsWUFDRixNQUFNO0FBQUEsWUFDTixTQUFTO0FBQUEsY0FDTCxNQUFNO0FBQUEsZ0JBQ0YsTUFBTTtBQUFBLGdCQUNOLFdBQVc7QUFBQSxjQUNmO0FBQUEsWUFDSjtBQUFBLFVBQ0o7QUFBQSxRQUNKO0FBQUEsUUFDQSxtQkFBbUI7QUFBQSxVQUNmLGdCQUFnQjtBQUFBLFVBQ2hCLFNBQVM7QUFBQSxVQUNULE1BQU07QUFBQSxZQUNGLE1BQU07QUFBQSxVQUNWO0FBQUEsUUFDSjtBQUFBLE1BQ0o7QUFBQSxJQUNKO0FBQUEsRUFDSjtBQUNBLE1BQU0sZ0JBQWdCO0FBQUEsSUFDbEIsZ0JBQWdCO0FBQUEsSUFDaEIsU0FBUztBQUFBLElBQ1QsTUFBTTtBQUFBLE1BQ0YsTUFBTTtBQUFBLE1BQ04sV0FBVztBQUFBLE1BQ1gsaUJBQWlCO0FBQUEsUUFDYixNQUFNO0FBQUEsVUFDRixnQkFBZ0I7QUFBQSxVQUNoQixVQUFVO0FBQUEsVUFDVixTQUFTO0FBQUEsVUFDVCxNQUFNO0FBQUEsWUFDRixNQUFNO0FBQUEsVUFDVjtBQUFBLFFBQ0o7QUFBQSxRQUNBLFNBQVM7QUFBQSxVQUNMLGdCQUFnQjtBQUFBLFVBQ2hCLFNBQVM7QUFBQSxVQUNULE1BQU07QUFBQSxZQUNGLE1BQU07QUFBQSxVQUNWO0FBQUEsUUFDSjtBQUFBLFFBQ0EsU0FBUztBQUFBLFVBQ0wsZ0JBQWdCO0FBQUEsVUFDaEIsU0FBUztBQUFBLFVBQ1QsTUFBTTtBQUFBLFlBQ0YsTUFBTTtBQUFBLFVBQ1Y7QUFBQSxRQUNKO0FBQUEsUUFDQSxZQUFZO0FBQUEsVUFDUixnQkFBZ0I7QUFBQSxVQUNoQixTQUFTO0FBQUEsVUFDVCxNQUFNO0FBQUEsWUFDRixNQUFNO0FBQUEsWUFDTixXQUFXO0FBQUEsVUFDZjtBQUFBLFFBQ0o7QUFBQSxRQUNBLFVBQVU7QUFBQSxVQUNOLGdCQUFnQjtBQUFBLFVBQ2hCLFNBQVM7QUFBQSxVQUNULE1BQU07QUFBQSxZQUNGLE1BQU07QUFBQSxZQUNOLE9BQU8sRUFBRSxNQUFNLEVBQUUsTUFBTSxTQUFTLEVBQUU7QUFBQSxVQUN0QztBQUFBLFFBQ0o7QUFBQSxNQUNKO0FBQUEsSUFDSjtBQUFBLEVBQ0o7QUFDQSxNQUFNLHNCQUFzQjtBQUFBLElBQ3hCLGdCQUFnQjtBQUFBLElBQ2hCLE1BQU07QUFBQSxNQUNGLE1BQU07QUFBQSxNQUNOLFdBQVc7QUFBQSxNQUNYLGlCQUFpQjtBQUFBLFFBQ2IsY0FBYztBQUFBLFVBQ1YsZ0JBQWdCO0FBQUEsVUFDaEIsVUFBVTtBQUFBLFVBQ1YsU0FBUztBQUFBLFVBQ1QsTUFBTTtBQUFBLFlBQ0YsTUFBTTtBQUFBLFVBQ1Y7QUFBQSxRQUNKO0FBQUEsUUFDQSxNQUFNO0FBQUEsVUFDRixnQkFBZ0I7QUFBQSxVQUNoQixVQUFVO0FBQUEsVUFDVixTQUFTO0FBQUEsVUFDVCxNQUFNO0FBQUEsWUFDRixNQUFNO0FBQUEsVUFDVjtBQUFBLFFBQ0o7QUFBQSxRQUNBLGFBQWE7QUFBQSxVQUNULGdCQUFnQjtBQUFBLFVBQ2hCLFNBQVM7QUFBQSxVQUNULE1BQU07QUFBQSxZQUNGLE1BQU07QUFBQSxZQUNOLGVBQWUsQ0FBQyxVQUFVLFVBQVU7QUFBQSxVQUN4QztBQUFBLFFBQ0o7QUFBQSxRQUNBLFlBQVk7QUFBQSxVQUNSLGdCQUFnQjtBQUFBLFVBQ2hCLFNBQVM7QUFBQSxVQUNULE1BQU07QUFBQSxZQUNGLE1BQU07QUFBQSxZQUNOLGVBQWU7QUFBQSxjQUNYO0FBQUEsY0FDQTtBQUFBLGNBQ0E7QUFBQSxjQUNBO0FBQUEsY0FDQTtBQUFBLFlBQ0o7QUFBQSxVQUNKO0FBQUEsUUFDSjtBQUFBLFFBQ0EsZUFBZTtBQUFBLFVBQ1gsZ0JBQWdCO0FBQUEsVUFDaEIsU0FBUztBQUFBLFVBQ1QsTUFBTTtBQUFBLFlBQ0YsTUFBTTtBQUFBLFlBQ04sZUFBZSxDQUFDLFlBQVksT0FBTztBQUFBLFVBQ3ZDO0FBQUEsUUFDSjtBQUFBLFFBQ0EsY0FBYztBQUFBLFVBQ1YsZ0JBQWdCO0FBQUEsVUFDaEIsU0FBUztBQUFBLFVBQ1QsTUFBTTtBQUFBLFlBQ0YsTUFBTTtBQUFBLFlBQ04sZUFBZSxDQUFDLGFBQWEsTUFBTTtBQUFBLFVBQ3ZDO0FBQUEsUUFDSjtBQUFBLFFBQ0EsdUJBQXVCO0FBQUEsVUFDbkIsZ0JBQWdCO0FBQUEsVUFDaEIsU0FBUztBQUFBLFVBQ1QsTUFBTTtBQUFBLFlBQ0YsTUFBTTtBQUFBLFVBQ1Y7QUFBQSxRQUNKO0FBQUEsUUFDQSxjQUFjO0FBQUEsVUFDVixnQkFBZ0I7QUFBQSxVQUNoQixTQUFTO0FBQUEsVUFDVCxNQUFNO0FBQUEsWUFDRixNQUFNO0FBQUEsVUFDVjtBQUFBLFFBQ0o7QUFBQSxRQUNBLHdCQUF3QjtBQUFBLFVBQ3BCLGdCQUFnQjtBQUFBLFVBQ2hCLFNBQVM7QUFBQSxVQUNULE1BQU07QUFBQSxZQUNGLE1BQU07QUFBQSxVQUNWO0FBQUEsUUFDSjtBQUFBLFFBQ0EsZ0NBQWdDO0FBQUEsVUFDNUIsZ0JBQWdCO0FBQUEsVUFDaEIsU0FBUztBQUFBLFVBQ1QsTUFBTTtBQUFBLFlBQ0YsTUFBTTtBQUFBLFVBQ1Y7QUFBQSxRQUNKO0FBQUEsUUFDQSxXQUFXO0FBQUEsVUFDUCxnQkFBZ0I7QUFBQSxVQUNoQixTQUFTO0FBQUEsVUFDVCxNQUFNO0FBQUEsWUFDRixNQUFNO0FBQUEsVUFDVjtBQUFBLFFBQ0o7QUFBQSxRQUNBLHdCQUF3QjtBQUFBLFVBQ3BCLGdCQUFnQjtBQUFBLFVBQ2hCLFNBQVM7QUFBQSxVQUNULE1BQU07QUFBQSxZQUNGLE1BQU07QUFBQSxVQUNWO0FBQUEsUUFDSjtBQUFBLFFBQ0EseUNBQXlDO0FBQUEsVUFDckMsZ0JBQWdCO0FBQUEsVUFDaEIsU0FBUztBQUFBLFVBQ1QsTUFBTTtBQUFBLFlBQ0YsTUFBTTtBQUFBLFVBQ1Y7QUFBQSxRQUNKO0FBQUEsTUFDSjtBQUFBLElBQ0o7QUFBQSxFQUNKO0FBQ0EsTUFBTSxVQUFVO0FBQUEsSUFDWixnQkFBZ0I7QUFBQSxJQUNoQixNQUFNO0FBQUEsTUFDRixNQUFNO0FBQUEsTUFDTixXQUFXO0FBQUEsTUFDWCxpQkFBaUI7QUFBQSxRQUNiLFVBQVU7QUFBQSxVQUNOLGdCQUFnQjtBQUFBLFVBQ2hCLFVBQVU7QUFBQSxVQUNWLFNBQVM7QUFBQSxVQUNULE1BQU07QUFBQSxZQUNGLE1BQU07QUFBQSxVQUNWO0FBQUEsUUFDSjtBQUFBLFFBQ0EsV0FBVztBQUFBLFVBQ1AsZ0JBQWdCO0FBQUEsVUFDaEIsVUFBVTtBQUFBLFVBQ1YsU0FBUztBQUFBLFVBQ1QsTUFBTTtBQUFBLFlBQ0YsTUFBTTtBQUFBLFVBQ1Y7QUFBQSxRQUNKO0FBQUEsTUFDSjtBQUFBLElBQ0o7QUFBQSxFQUNKO0FBQ0EsTUFBTSxvQkFBb0I7QUFBQSxJQUN0QixnQkFBZ0I7QUFBQSxJQUNoQixNQUFNO0FBQUEsTUFDRixNQUFNO0FBQUEsTUFDTixXQUFXO0FBQUEsTUFDWCxpQkFBaUI7QUFBQSxRQUNiLGdCQUFnQjtBQUFBLFVBQ1osZ0JBQWdCO0FBQUEsVUFDaEIsVUFBVTtBQUFBLFVBQ1YsU0FBUztBQUFBLFVBQ1QsTUFBTTtBQUFBLFlBQ0YsTUFBTTtBQUFBLFVBQ1Y7QUFBQSxRQUNKO0FBQUEsUUFDQSxnQkFBZ0I7QUFBQSxVQUNaLGdCQUFnQjtBQUFBLFVBQ2hCLFVBQVU7QUFBQSxVQUNWLFNBQVM7QUFBQSxVQUNULE1BQU07QUFBQSxZQUNGLE1BQU07QUFBQSxVQUNWO0FBQUEsUUFDSjtBQUFBLFFBQ0EsZ0JBQWdCO0FBQUEsVUFDWixnQkFBZ0I7QUFBQSxVQUNoQixVQUFVO0FBQUEsVUFDVixTQUFTO0FBQUEsVUFDVCxNQUFNO0FBQUEsWUFDRixNQUFNO0FBQUEsVUFDVjtBQUFBLFFBQ0o7QUFBQSxRQUNBLGlCQUFpQjtBQUFBLFVBQ2IsZ0JBQWdCO0FBQUEsVUFDaEIsVUFBVTtBQUFBLFVBQ1YsU0FBUztBQUFBLFVBQ1QsTUFBTTtBQUFBLFlBQ0YsTUFBTTtBQUFBLFVBQ1Y7QUFBQSxRQUNKO0FBQUEsUUFDQSxlQUFlO0FBQUEsVUFDWCxnQkFBZ0I7QUFBQSxVQUNoQixVQUFVO0FBQUEsVUFDVixTQUFTO0FBQUEsVUFDVCxNQUFNO0FBQUEsWUFDRixNQUFNO0FBQUEsVUFDVjtBQUFBLFFBQ0o7QUFBQSxRQUNBLGVBQWU7QUFBQSxVQUNYLGdCQUFnQjtBQUFBLFVBQ2hCLFVBQVU7QUFBQSxVQUNWLFNBQVM7QUFBQSxVQUNULE1BQU07QUFBQSxZQUNGLE1BQU07QUFBQSxVQUNWO0FBQUEsUUFDSjtBQUFBLFFBQ0EsT0FBTztBQUFBLFVBQ0gsZ0JBQWdCO0FBQUEsVUFDaEIsVUFBVTtBQUFBLFVBQ1YsU0FBUztBQUFBLFVBQ1QsTUFBTTtBQUFBLFlBQ0YsTUFBTTtBQUFBLFVBQ1Y7QUFBQSxRQUNKO0FBQUEsTUFDSjtBQUFBLElBQ0o7QUFBQSxFQUNKO0FBQ0EsTUFBTSxvQkFBb0I7QUFBQSxJQUN0QixnQkFBZ0I7QUFBQSxJQUNoQixTQUFTO0FBQUEsSUFDVCxNQUFNO0FBQUEsTUFDRixNQUFNO0FBQUEsTUFDTixXQUFXO0FBQUEsTUFDWCxpQkFBaUI7QUFBQSxRQUNiLGlCQUFpQjtBQUFBLFVBQ2IsZ0JBQWdCO0FBQUEsVUFDaEIsVUFBVTtBQUFBLFVBQ1YsU0FBUztBQUFBLFVBQ1QsZ0JBQWdCO0FBQUEsVUFDaEIsTUFBTTtBQUFBLFlBQ0YsTUFBTTtBQUFBLFVBQ1Y7QUFBQSxRQUNKO0FBQUEsUUFDQSxPQUFPO0FBQUEsVUFDSCxnQkFBZ0I7QUFBQSxVQUNoQixVQUFVO0FBQUEsVUFDVixTQUFTO0FBQUEsVUFDVCxNQUFNO0FBQUEsWUFDRixNQUFNO0FBQUEsVUFDVjtBQUFBLFFBQ0o7QUFBQSxRQUNBLE9BQU87QUFBQSxVQUNILGdCQUFnQjtBQUFBLFVBQ2hCLFVBQVU7QUFBQSxVQUNWLFNBQVM7QUFBQSxVQUNULGNBQWM7QUFBQSxVQUNkLGdCQUFnQjtBQUFBLFVBQ2hCLE1BQU07QUFBQSxZQUNGLE1BQU07QUFBQSxZQUNOLFNBQVM7QUFBQSxjQUNMLE1BQU07QUFBQSxnQkFDRixNQUFNO0FBQUEsZ0JBQ04sV0FBVztBQUFBLGNBQ2Y7QUFBQSxZQUNKO0FBQUEsVUFDSjtBQUFBLFFBQ0o7QUFBQSxRQUNBLG1CQUFtQjtBQUFBLFVBQ2YsZ0JBQWdCO0FBQUEsVUFDaEIsU0FBUztBQUFBLFVBQ1QsTUFBTTtBQUFBLFlBQ0YsTUFBTTtBQUFBLFVBQ1Y7QUFBQSxRQUNKO0FBQUEsTUFDSjtBQUFBLElBQ0o7QUFBQSxFQUNKO0FBQ0EsTUFBTSxpQkFBaUI7QUFBQSxJQUNuQixnQkFBZ0I7QUFBQSxJQUNoQixTQUFTO0FBQUEsSUFDVCxNQUFNO0FBQUEsTUFDRixNQUFNO0FBQUEsTUFDTixXQUFXO0FBQUEsTUFDWCxpQkFBaUI7QUFBQSxRQUNiLE1BQU07QUFBQSxVQUNGLGdCQUFnQjtBQUFBLFVBQ2hCLFVBQVU7QUFBQSxVQUNWLFNBQVM7QUFBQSxVQUNULE1BQU07QUFBQSxZQUNGLE1BQU07QUFBQSxVQUNWO0FBQUEsUUFDSjtBQUFBLFFBQ0EsZUFBZTtBQUFBLFVBQ1gsZ0JBQWdCO0FBQUEsVUFDaEIsVUFBVTtBQUFBLFVBQ1YsU0FBUztBQUFBLFVBQ1QsTUFBTTtBQUFBLFlBQ0YsTUFBTTtBQUFBLFVBQ1Y7QUFBQSxRQUNKO0FBQUEsUUFDQSxNQUFNO0FBQUEsVUFDRixnQkFBZ0I7QUFBQSxVQUNoQixTQUFTO0FBQUEsVUFDVCxNQUFNO0FBQUEsWUFDRixNQUFNO0FBQUEsWUFDTixXQUFXO0FBQUEsVUFDZjtBQUFBLFFBQ0o7QUFBQSxNQUNKO0FBQUEsSUFDSjtBQUFBLEVBQ0o7QUFDQSxNQUFNLFdBQVc7QUFBQSxJQUNiLGdCQUFnQjtBQUFBLElBQ2hCLFNBQVM7QUFBQSxJQUNULE1BQU07QUFBQSxNQUNGLE1BQU07QUFBQSxNQUNOLFdBQVc7QUFBQSxNQUNYLGlCQUFpQjtBQUFBLFFBQ2IsWUFBWTtBQUFBLFVBQ1IsZ0JBQWdCO0FBQUEsVUFDaEIsVUFBVTtBQUFBLFVBQ1YsU0FBUztBQUFBLFVBQ1QsY0FBYztBQUFBLFVBQ2QsZ0JBQWdCO0FBQUEsVUFDaEIsTUFBTTtBQUFBLFlBQ0YsTUFBTTtBQUFBLFlBQ04sU0FBUztBQUFBLGNBQ0wsTUFBTTtBQUFBLGdCQUNGLE1BQU07QUFBQSxnQkFDTixXQUFXO0FBQUEsY0FDZjtBQUFBLFlBQ0o7QUFBQSxVQUNKO0FBQUEsUUFDSjtBQUFBLE1BQ0o7QUFBQSxJQUNKO0FBQUEsRUFDSjtBQUNBLE1BQU0sVUFBVTtBQUFBLElBQ1osZ0JBQWdCO0FBQUEsSUFDaEIsU0FBUztBQUFBLElBQ1QsTUFBTTtBQUFBLE1BQ0YsTUFBTTtBQUFBLE1BQ04sV0FBVztBQUFBLE1BQ1gsaUJBQWlCO0FBQUEsUUFDYixLQUFLO0FBQUEsVUFDRCxnQkFBZ0I7QUFBQSxVQUNoQixVQUFVO0FBQUEsVUFDVixTQUFTO0FBQUEsVUFDVCxNQUFNO0FBQUEsWUFDRixNQUFNO0FBQUEsVUFDVjtBQUFBLFFBQ0o7QUFBQSxRQUNBLE9BQU87QUFBQSxVQUNILGdCQUFnQjtBQUFBLFVBQ2hCLFVBQVU7QUFBQSxVQUNWLFNBQVM7QUFBQSxVQUNULE1BQU07QUFBQSxZQUNGLE1BQU07QUFBQSxVQUNWO0FBQUEsUUFDSjtBQUFBLE1BQ0o7QUFBQSxJQUNKO0FBQUEsRUFDSjtBQUNBLE1BQU0sbUJBQW1CO0FBQUEsSUFDckIsZ0JBQWdCO0FBQUEsSUFDaEIsU0FBUztBQUFBLElBQ1QsTUFBTTtBQUFBLE1BQ0YsTUFBTTtBQUFBLE1BQ04sV0FBVztBQUFBLE1BQ1gsaUJBQWlCO0FBQUEsUUFDYixJQUFJO0FBQUEsVUFDQSxnQkFBZ0I7QUFBQSxVQUNoQixVQUFVO0FBQUEsVUFDVixTQUFTO0FBQUEsVUFDVCxNQUFNO0FBQUEsWUFDRixNQUFNO0FBQUEsVUFDVjtBQUFBLFFBQ0o7QUFBQSxRQUNBLGNBQWM7QUFBQSxVQUNWLGdCQUFnQjtBQUFBLFVBQ2hCLFNBQVM7QUFBQSxVQUNULE1BQU07QUFBQSxZQUNGLE1BQU07QUFBQSxZQUNOLFdBQVc7QUFBQSxVQUNmO0FBQUEsUUFDSjtBQUFBLE1BQ0o7QUFBQSxJQUNKO0FBQUEsRUFDSjtBQUNBLE1BQU0sZUFBZTtBQUFBLElBQ2pCLGdCQUFnQjtBQUFBLElBQ2hCLE1BQU07QUFBQSxNQUNGLE1BQU07QUFBQSxNQUNOLFdBQVc7QUFBQSxNQUNYLGlCQUFpQjtBQUFBLFFBQ2IsVUFBVTtBQUFBLFVBQ04sZ0JBQWdCO0FBQUEsVUFDaEIsU0FBUztBQUFBLFVBQ1QsTUFBTTtBQUFBLFlBQ0YsTUFBTTtBQUFBLFVBQ1Y7QUFBQSxRQUNKO0FBQUEsUUFDQSxXQUFXO0FBQUEsVUFDUCxnQkFBZ0I7QUFBQSxVQUNoQixTQUFTO0FBQUEsVUFDVCxNQUFNO0FBQUEsWUFDRixNQUFNO0FBQUEsVUFDVjtBQUFBLFFBQ0o7QUFBQSxRQUNBLGFBQWE7QUFBQSxVQUNULGdCQUFnQjtBQUFBLFVBQ2hCLFNBQVM7QUFBQSxVQUNULE1BQU07QUFBQSxZQUNGLE1BQU07QUFBQSxVQUNWO0FBQUEsUUFDSjtBQUFBLE1BQ0o7QUFBQSxJQUNKO0FBQUEsRUFDSjtBQUNBLE1BQU0sK0JBQStCO0FBQUEsSUFDakMsZ0JBQWdCO0FBQUEsSUFDaEIsU0FBUztBQUFBLElBQ1QsTUFBTTtBQUFBLE1BQ0YsTUFBTTtBQUFBLE1BQ04sV0FBVztBQUFBLE1BQ1gsaUJBQWlCO0FBQUEsUUFDYixpQkFBaUI7QUFBQSxVQUNiLGdCQUFnQjtBQUFBLFVBQ2hCLFVBQVU7QUFBQSxVQUNWLFNBQVM7QUFBQSxVQUNULGdCQUFnQjtBQUFBLFVBQ2hCLE1BQU07QUFBQSxZQUNGLE1BQU07QUFBQSxVQUNWO0FBQUEsUUFDSjtBQUFBLFFBQ0EsZUFBZTtBQUFBLFVBQ1gsZ0JBQWdCO0FBQUEsVUFDaEIsVUFBVTtBQUFBLFVBQ1YsU0FBUztBQUFBLFVBQ1QsZ0JBQWdCO0FBQUEsVUFDaEIsTUFBTTtBQUFBLFlBQ0YsTUFBTTtBQUFBLFVBQ1Y7QUFBQSxRQUNKO0FBQUEsUUFDQSxRQUFRO0FBQUEsVUFDSixnQkFBZ0I7QUFBQSxVQUNoQixTQUFTO0FBQUEsVUFDVCxNQUFNO0FBQUEsWUFDRixNQUFNO0FBQUEsVUFDVjtBQUFBLFFBQ0o7QUFBQSxRQUNBLFFBQVE7QUFBQSxVQUNKLGdCQUFnQjtBQUFBLFVBQ2hCLFNBQVM7QUFBQSxVQUNULE1BQU07QUFBQSxZQUNGLE1BQU07QUFBQSxVQUNWO0FBQUEsUUFDSjtBQUFBLFFBQ0EsYUFBYTtBQUFBLFVBQ1QsZ0JBQWdCO0FBQUEsVUFDaEIsU0FBUztBQUFBLFVBQ1QsTUFBTTtBQUFBLFlBQ0YsTUFBTTtBQUFBLFVBQ1Y7QUFBQSxRQUNKO0FBQUEsUUFDQSxTQUFTO0FBQUEsVUFDTCxnQkFBZ0I7QUFBQSxVQUNoQixTQUFTO0FBQUEsVUFDVCxNQUFNO0FBQUEsWUFDRixNQUFNO0FBQUEsWUFDTixXQUFXO0FBQUEsVUFDZjtBQUFBLFFBQ0o7QUFBQSxRQUNBLG1CQUFtQjtBQUFBLFVBQ2YsZ0JBQWdCO0FBQUEsVUFDaEIsU0FBUztBQUFBLFVBQ1QsTUFBTTtBQUFBLFlBQ0YsTUFBTTtBQUFBLFVBQ1Y7QUFBQSxRQUNKO0FBQUEsTUFDSjtBQUFBLElBQ0o7QUFBQSxFQUNKO0FBQ0EsTUFBTSxzQkFBc0I7QUFBQSxJQUN4QixnQkFBZ0I7QUFBQSxJQUNoQixTQUFTO0FBQUEsSUFDVCxNQUFNO0FBQUEsTUFDRixNQUFNO0FBQUEsTUFDTixXQUFXO0FBQUEsTUFDWCxpQkFBaUI7QUFBQSxRQUNiLFdBQVc7QUFBQSxVQUNQLGdCQUFnQjtBQUFBLFVBQ2hCLFVBQVU7QUFBQSxVQUNWLFNBQVM7QUFBQSxVQUNULGdCQUFnQjtBQUFBLFVBQ2hCLE1BQU07QUFBQSxZQUNGLE1BQU07QUFBQSxZQUNOLFNBQVM7QUFBQSxjQUNMLE1BQU07QUFBQSxnQkFDRixNQUFNO0FBQUEsZ0JBQ04sV0FBVztBQUFBLGNBQ2Y7QUFBQSxZQUNKO0FBQUEsVUFDSjtBQUFBLFFBQ0o7QUFBQSxNQUNKO0FBQUEsSUFDSjtBQUFBLEVBQ0o7QUFDQSxNQUFNLG1CQUFtQjtBQUFBLElBQ3JCLGdCQUFnQjtBQUFBLElBQ2hCLFNBQVM7QUFBQSxJQUNULE1BQU07QUFBQSxNQUNGLE1BQU07QUFBQSxNQUNOLFdBQVc7QUFBQSxNQUNYLGlCQUFpQjtBQUFBLFFBQ2IsTUFBTTtBQUFBLFVBQ0YsZ0JBQWdCO0FBQUEsVUFDaEIsU0FBUztBQUFBLFVBQ1QsTUFBTTtBQUFBLFlBQ0YsTUFBTTtBQUFBLFlBQ04sV0FBVztBQUFBLFVBQ2Y7QUFBQSxRQUNKO0FBQUEsUUFDQSxTQUFTO0FBQUEsVUFDTCxnQkFBZ0I7QUFBQSxVQUNoQixVQUFVO0FBQUEsVUFDVixTQUFTO0FBQUEsVUFDVCxNQUFNO0FBQUEsWUFDRixNQUFNO0FBQUEsVUFDVjtBQUFBLFFBQ0o7QUFBQSxRQUNBLFVBQVU7QUFBQSxVQUNOLGdCQUFnQjtBQUFBLFVBQ2hCLFVBQVU7QUFBQSxVQUNWLFNBQVM7QUFBQSxVQUNULE1BQU07QUFBQSxZQUNGLE1BQU07QUFBQSxVQUNWO0FBQUEsUUFDSjtBQUFBLFFBQ0EsV0FBVztBQUFBLFVBQ1AsZ0JBQWdCO0FBQUEsVUFDaEIsU0FBUztBQUFBLFVBQ1QsTUFBTTtBQUFBLFlBQ0YsTUFBTTtBQUFBLFVBQ1Y7QUFBQSxRQUNKO0FBQUEsUUFDQSxrQkFBa0I7QUFBQSxVQUNkLGdCQUFnQjtBQUFBLFVBQ2hCLFNBQVM7QUFBQSxVQUNULE1BQU07QUFBQSxZQUNGLE1BQU07QUFBQSxVQUNWO0FBQUEsUUFDSjtBQUFBLFFBQ0EsWUFBWTtBQUFBLFVBQ1IsZ0JBQWdCO0FBQUEsVUFDaEIsU0FBUztBQUFBLFVBQ1QsTUFBTTtBQUFBLFlBQ0YsTUFBTTtBQUFBLFlBQ04sV0FBVztBQUFBLFVBQ2Y7QUFBQSxRQUNKO0FBQUEsUUFDQSxVQUFVO0FBQUEsVUFDTixnQkFBZ0I7QUFBQSxVQUNoQixTQUFTO0FBQUEsVUFDVCxNQUFNO0FBQUEsWUFDRixNQUFNO0FBQUEsWUFDTixPQUFPLEVBQUUsTUFBTSxFQUFFLE1BQU0sU0FBUyxFQUFFO0FBQUEsVUFDdEM7QUFBQSxRQUNKO0FBQUEsUUFDQSxVQUFVO0FBQUEsVUFDTixnQkFBZ0I7QUFBQSxVQUNoQixTQUFTO0FBQUEsVUFDVCxNQUFNO0FBQUEsWUFDRixNQUFNO0FBQUEsWUFDTixXQUFXO0FBQUEsVUFDZjtBQUFBLFFBQ0o7QUFBQSxRQUNBLDJCQUEyQjtBQUFBLFVBQ3ZCLGdCQUFnQjtBQUFBLFVBQ2hCLFNBQVM7QUFBQSxVQUNULE1BQU07QUFBQSxZQUNGLE1BQU07QUFBQSxZQUNOLE9BQU8sRUFBRSxNQUFNLEVBQUUsTUFBTSxTQUFTLEVBQUU7QUFBQSxVQUN0QztBQUFBLFFBQ0o7QUFBQSxRQUNBLGlCQUFpQjtBQUFBLFVBQ2IsZ0JBQWdCO0FBQUEsVUFDaEIsU0FBUztBQUFBLFVBQ1QsTUFBTTtBQUFBLFlBQ0YsTUFBTTtBQUFBLFVBQ1Y7QUFBQSxRQUNKO0FBQUEsTUFDSjtBQUFBLElBQ0o7QUFBQSxFQUNKO0FBQ0EsTUFBTSxXQUFXO0FBQUEsSUFDYixnQkFBZ0I7QUFBQSxJQUNoQixNQUFNO0FBQUEsTUFDRixNQUFNO0FBQUEsTUFDTixXQUFXO0FBQUEsTUFDWCxpQkFBaUI7QUFBQSxRQUNiLFNBQVM7QUFBQSxVQUNMLGdCQUFnQjtBQUFBLFVBQ2hCLFNBQVM7QUFBQSxVQUNULGdCQUFnQjtBQUFBLFVBQ2hCLE1BQU07QUFBQSxZQUNGLE1BQU07QUFBQSxVQUNWO0FBQUEsUUFDSjtBQUFBLFFBQ0EsU0FBUztBQUFBLFVBQ0wsZ0JBQWdCO0FBQUEsVUFDaEIsU0FBUztBQUFBLFVBQ1QsYUFBYTtBQUFBLFVBQ2IsTUFBTTtBQUFBLFlBQ0YsTUFBTTtBQUFBLFVBQ1Y7QUFBQSxRQUNKO0FBQUEsTUFDSjtBQUFBLElBQ0o7QUFBQSxFQUNKO0FBQ0EsTUFBTSx5QkFBeUI7QUFBQSxJQUMzQixnQkFBZ0I7QUFBQSxJQUNoQixTQUFTO0FBQUEsSUFDVCxNQUFNO0FBQUEsTUFDRixNQUFNO0FBQUEsTUFDTixXQUFXO0FBQUEsTUFDWCxpQkFBaUI7QUFBQSxRQUNiLFdBQVc7QUFBQSxVQUNQLGdCQUFnQjtBQUFBLFVBQ2hCLFNBQVM7QUFBQSxVQUNULE1BQU07QUFBQSxZQUNGLE1BQU07QUFBQSxVQUNWO0FBQUEsUUFDSjtBQUFBLFFBQ0EsY0FBYztBQUFBLFVBQ1YsZ0JBQWdCO0FBQUEsVUFDaEIsVUFBVTtBQUFBLFVBQ1YsU0FBUztBQUFBLFVBQ1QsTUFBTTtBQUFBLFlBQ0YsTUFBTTtBQUFBLFVBQ1Y7QUFBQSxRQUNKO0FBQUEsUUFDQSxNQUFNO0FBQUEsVUFDRixnQkFBZ0I7QUFBQSxVQUNoQixVQUFVO0FBQUEsVUFDVixTQUFTO0FBQUEsVUFDVCxNQUFNO0FBQUEsWUFDRixNQUFNO0FBQUEsVUFDVjtBQUFBLFFBQ0o7QUFBQSxRQUNBLGVBQWU7QUFBQSxVQUNYLGdCQUFnQjtBQUFBLFVBQ2hCLFNBQVM7QUFBQSxVQUNULE1BQU07QUFBQSxZQUNGLE1BQU07QUFBQSxVQUNWO0FBQUEsUUFDSjtBQUFBLFFBQ0EsYUFBYTtBQUFBLFVBQ1QsZ0JBQWdCO0FBQUEsVUFDaEIsU0FBUztBQUFBLFVBQ1QsTUFBTTtBQUFBLFlBQ0YsTUFBTTtBQUFBLFVBQ1Y7QUFBQSxRQUNKO0FBQUEsUUFDQSxpQkFBaUI7QUFBQSxVQUNiLGdCQUFnQjtBQUFBLFVBQ2hCLFNBQVM7QUFBQSxVQUNULE1BQU07QUFBQSxZQUNGLE1BQU07QUFBQSxVQUNWO0FBQUEsUUFDSjtBQUFBLFFBQ0EsaUJBQWlCO0FBQUEsVUFDYixnQkFBZ0I7QUFBQSxVQUNoQixTQUFTO0FBQUEsVUFDVCxNQUFNO0FBQUEsWUFDRixNQUFNO0FBQUEsVUFDVjtBQUFBLFFBQ0o7QUFBQSxRQUNBLFlBQVk7QUFBQSxVQUNSLGdCQUFnQjtBQUFBLFVBQ2hCLFNBQVM7QUFBQSxVQUNULE1BQU07QUFBQSxZQUNGLE1BQU07QUFBQSxVQUNWO0FBQUEsUUFDSjtBQUFBLFFBQ0Esb0JBQW9CO0FBQUEsVUFDaEIsZ0JBQWdCO0FBQUEsVUFDaEIsU0FBUztBQUFBLFVBQ1QsTUFBTTtBQUFBLFlBQ0YsTUFBTTtBQUFBLFVBQ1Y7QUFBQSxRQUNKO0FBQUEsUUFDQSxjQUFjO0FBQUEsVUFDVixnQkFBZ0I7QUFBQSxVQUNoQixTQUFTO0FBQUEsVUFDVCxNQUFNO0FBQUEsWUFDRixNQUFNO0FBQUEsVUFDVjtBQUFBLFFBQ0o7QUFBQSxRQUNBLG9CQUFvQjtBQUFBLFVBQ2hCLGdCQUFnQjtBQUFBLFVBQ2hCLFNBQVM7QUFBQSxVQUNULE1BQU07QUFBQSxZQUNGLE1BQU07QUFBQSxVQUNWO0FBQUEsUUFDSjtBQUFBLFFBQ0EsVUFBVTtBQUFBLFVBQ04sZ0JBQWdCO0FBQUEsVUFDaEIsU0FBUztBQUFBLFVBQ1QsTUFBTTtBQUFBLFlBQ0YsTUFBTTtBQUFBLFlBQ04sZUFBZSxDQUFDLGFBQWEsWUFBWSxZQUFZO0FBQUEsVUFDekQ7QUFBQSxRQUNKO0FBQUEsUUFDQSxhQUFhO0FBQUEsVUFDVCxnQkFBZ0I7QUFBQSxVQUNoQixTQUFTO0FBQUEsVUFDVCxNQUFNO0FBQUEsWUFDRixNQUFNO0FBQUEsWUFDTixlQUFlLENBQUMsVUFBVSxVQUFVO0FBQUEsVUFDeEM7QUFBQSxRQUNKO0FBQUEsUUFDQSxZQUFZO0FBQUEsVUFDUixnQkFBZ0I7QUFBQSxVQUNoQixTQUFTO0FBQUEsVUFDVCxNQUFNO0FBQUEsWUFDRixNQUFNO0FBQUEsWUFDTixlQUFlO0FBQUEsY0FDWDtBQUFBLGNBQ0E7QUFBQSxjQUNBO0FBQUEsY0FDQTtBQUFBLGNBQ0E7QUFBQSxZQUNKO0FBQUEsVUFDSjtBQUFBLFFBQ0o7QUFBQSxRQUNBLGVBQWU7QUFBQSxVQUNYLGdCQUFnQjtBQUFBLFVBQ2hCLFNBQVM7QUFBQSxVQUNULE1BQU07QUFBQSxZQUNGLE1BQU07QUFBQSxZQUNOLGVBQWUsQ0FBQyxZQUFZLE9BQU87QUFBQSxVQUN2QztBQUFBLFFBQ0o7QUFBQSxRQUNBLFFBQVE7QUFBQSxVQUNKLGdCQUFnQjtBQUFBLFVBQ2hCLFNBQVM7QUFBQSxVQUNULE1BQU07QUFBQSxZQUNGLE1BQU07QUFBQSxVQUNWO0FBQUEsUUFDSjtBQUFBLFFBQ0EsWUFBWTtBQUFBLFVBQ1IsZ0JBQWdCO0FBQUEsVUFDaEIsU0FBUztBQUFBLFVBQ1QsTUFBTTtBQUFBLFlBQ0YsTUFBTTtBQUFBLFlBQ04sZUFBZSxDQUFDLFdBQVcsV0FBVyxXQUFXLFFBQVE7QUFBQSxVQUM3RDtBQUFBLFFBQ0o7QUFBQSxRQUNBLFlBQVk7QUFBQSxVQUNSLGdCQUFnQjtBQUFBLFVBQ2hCLFNBQVM7QUFBQSxVQUNULE1BQU07QUFBQSxZQUNGLE1BQU07QUFBQSxVQUNWO0FBQUEsUUFDSjtBQUFBLFFBQ0EsY0FBYztBQUFBLFVBQ1YsZ0JBQWdCO0FBQUEsVUFDaEIsU0FBUztBQUFBLFVBQ1QsTUFBTTtBQUFBLFlBQ0YsTUFBTTtBQUFBLFVBQ1Y7QUFBQSxRQUNKO0FBQUEsUUFDQSxpQkFBaUI7QUFBQSxVQUNiLGdCQUFnQjtBQUFBLFVBQ2hCLFNBQVM7QUFBQSxVQUNULE1BQU07QUFBQSxZQUNGLE1BQU07QUFBQSxVQUNWO0FBQUEsUUFDSjtBQUFBLFFBQ0EsdUJBQXVCO0FBQUEsVUFDbkIsZ0JBQWdCO0FBQUEsVUFDaEIsU0FBUztBQUFBLFVBQ1QsTUFBTTtBQUFBLFlBQ0YsTUFBTTtBQUFBLFVBQ1Y7QUFBQSxRQUNKO0FBQUEsUUFDQSxpQkFBaUI7QUFBQSxVQUNiLGdCQUFnQjtBQUFBLFVBQ2hCLFNBQVM7QUFBQSxVQUNULE1BQU07QUFBQSxZQUNGLE1BQU07QUFBQSxVQUNWO0FBQUEsUUFDSjtBQUFBLFFBQ0EsaUJBQWlCO0FBQUEsVUFDYixnQkFBZ0I7QUFBQSxVQUNoQixTQUFTO0FBQUEsVUFDVCxNQUFNO0FBQUEsWUFDRixNQUFNO0FBQUEsVUFDVjtBQUFBLFFBQ0o7QUFBQSxRQUNBLHFCQUFxQjtBQUFBLFVBQ2pCLGdCQUFnQjtBQUFBLFVBQ2hCLFNBQVM7QUFBQSxVQUNULE1BQU07QUFBQSxZQUNGLE1BQU07QUFBQSxVQUNWO0FBQUEsUUFDSjtBQUFBLFFBQ0EsV0FBVztBQUFBLFVBQ1AsZ0JBQWdCO0FBQUEsVUFDaEIsU0FBUztBQUFBLFVBQ1QsTUFBTTtBQUFBLFlBQ0YsTUFBTTtBQUFBLFVBQ1Y7QUFBQSxRQUNKO0FBQUEsUUFDQSx3QkFBd0I7QUFBQSxVQUNwQixnQkFBZ0I7QUFBQSxVQUNoQixTQUFTO0FBQUEsVUFDVCxNQUFNO0FBQUEsWUFDRixNQUFNO0FBQUEsVUFDVjtBQUFBLFFBQ0o7QUFBQSxRQUNBLFlBQVk7QUFBQSxVQUNSLGdCQUFnQjtBQUFBLFVBQ2hCLFNBQVM7QUFBQSxVQUNULE1BQU07QUFBQSxZQUNGLE1BQU07QUFBQSxZQUNOLGVBQWU7QUFBQSxjQUNYO0FBQUEsY0FDQTtBQUFBLGNBQ0E7QUFBQSxjQUNBO0FBQUEsY0FDQTtBQUFBLGNBQ0E7QUFBQSxjQUNBO0FBQUEsY0FDQTtBQUFBLGNBQ0E7QUFBQSxjQUNBO0FBQUEsY0FDQTtBQUFBLGNBQ0E7QUFBQSxjQUNBO0FBQUEsY0FDQTtBQUFBLGNBQ0E7QUFBQSxZQUNKO0FBQUEsVUFDSjtBQUFBLFFBQ0o7QUFBQSxRQUNBLG9CQUFvQjtBQUFBLFVBQ2hCLGdCQUFnQjtBQUFBLFVBQ2hCLFNBQVM7QUFBQSxVQUNULE1BQU07QUFBQSxZQUNGLE1BQU07QUFBQSxVQUNWO0FBQUEsUUFDSjtBQUFBLFFBQ0EsZUFBZTtBQUFBLFVBQ1gsZ0JBQWdCO0FBQUEsVUFDaEIsU0FBUztBQUFBLFVBQ1QsTUFBTTtBQUFBLFlBQ0YsTUFBTTtBQUFBLFlBQ04sZUFBZTtBQUFBLGNBQ1g7QUFBQSxjQUNBO0FBQUEsY0FDQTtBQUFBLFlBQ0o7QUFBQSxVQUNKO0FBQUEsUUFDSjtBQUFBLFFBQ0EsMkJBQTJCO0FBQUEsVUFDdkIsZ0JBQWdCO0FBQUEsVUFDaEIsU0FBUztBQUFBLFVBQ1QsTUFBTTtBQUFBLFlBQ0YsTUFBTTtBQUFBLFVBQ1Y7QUFBQSxRQUNKO0FBQUEsUUFDQSxpQkFBaUI7QUFBQSxVQUNiLGdCQUFnQjtBQUFBLFVBQ2hCLFNBQVM7QUFBQSxVQUNULE1BQU07QUFBQSxZQUNGLE1BQU07QUFBQSxVQUNWO0FBQUEsUUFDSjtBQUFBLFFBQ0EscUJBQXFCO0FBQUEsVUFDakIsZ0JBQWdCO0FBQUEsVUFDaEIsU0FBUztBQUFBLFVBQ1QsTUFBTTtBQUFBLFlBQ0YsTUFBTTtBQUFBLFVBQ1Y7QUFBQSxRQUNKO0FBQUEsUUFDQSxVQUFVO0FBQUEsVUFDTixnQkFBZ0I7QUFBQSxVQUNoQixTQUFTO0FBQUEsVUFDVCxNQUFNO0FBQUEsWUFDRixNQUFNO0FBQUEsVUFDVjtBQUFBLFFBQ0o7QUFBQSxRQUNBLFdBQVc7QUFBQSxVQUNQLGdCQUFnQjtBQUFBLFVBQ2hCLFNBQVM7QUFBQSxVQUNULE1BQU07QUFBQSxZQUNGLE1BQU07QUFBQSxVQUNWO0FBQUEsUUFDSjtBQUFBLFFBQ0EsVUFBVTtBQUFBLFVBQ04sZ0JBQWdCO0FBQUEsVUFDaEIsU0FBUztBQUFBLFVBQ1QsTUFBTTtBQUFBLFlBQ0YsTUFBTTtBQUFBLFVBQ1Y7QUFBQSxRQUNKO0FBQUEsUUFDQSxtQkFBbUI7QUFBQSxVQUNmLGdCQUFnQjtBQUFBLFVBQ2hCLFNBQVM7QUFBQSxVQUNULE1BQU07QUFBQSxZQUNGLE1BQU07QUFBQSxZQUNOLGVBQWUsQ0FBQyxRQUFRLFVBQVU7QUFBQSxVQUN0QztBQUFBLFFBQ0o7QUFBQSxRQUNBLGdCQUFnQjtBQUFBLFVBQ1osZ0JBQWdCO0FBQUEsVUFDaEIsU0FBUztBQUFBLFVBQ1QsTUFBTTtBQUFBLFlBQ0YsTUFBTTtBQUFBLFVBQ1Y7QUFBQSxRQUNKO0FBQUEsUUFDQSw2QkFBNkI7QUFBQSxVQUN6QixnQkFBZ0I7QUFBQSxVQUNoQixTQUFTO0FBQUEsVUFDVCxNQUFNO0FBQUEsWUFDRixNQUFNO0FBQUEsVUFDVjtBQUFBLFFBQ0o7QUFBQSxRQUNBLHdCQUF3QjtBQUFBLFVBQ3BCLGdCQUFnQjtBQUFBLFVBQ2hCLFNBQVM7QUFBQSxVQUNULE1BQU07QUFBQSxZQUNGLE1BQU07QUFBQSxZQUNOLGVBQWUsQ0FBQyxXQUFXLFlBQVksUUFBUTtBQUFBLFVBQ25EO0FBQUEsUUFDSjtBQUFBLFFBQ0EsV0FBVztBQUFBLFVBQ1AsZ0JBQWdCO0FBQUEsVUFDaEIsU0FBUztBQUFBLFVBQ1QsTUFBTTtBQUFBLFlBQ0YsTUFBTTtBQUFBLFVBQ1Y7QUFBQSxRQUNKO0FBQUEsTUFDSjtBQUFBLElBQ0o7QUFBQSxFQUNKO0FBQ0EsTUFBTSxvQ0FBb0M7QUFBQSxJQUN0QyxnQkFBZ0I7QUFBQSxJQUNoQixTQUFTO0FBQUEsSUFDVCxNQUFNO0FBQUEsTUFDRixNQUFNO0FBQUEsTUFDTixXQUFXO0FBQUEsTUFDWCxpQkFBaUI7QUFBQSxRQUNiLGlCQUFpQjtBQUFBLFVBQ2IsZ0JBQWdCO0FBQUEsVUFDaEIsVUFBVTtBQUFBLFVBQ1YsU0FBUztBQUFBLFVBQ1QsZ0JBQWdCO0FBQUEsVUFDaEIsTUFBTTtBQUFBLFlBQ0YsTUFBTTtBQUFBLFVBQ1Y7QUFBQSxRQUNKO0FBQUEsUUFDQSxlQUFlO0FBQUEsVUFDWCxnQkFBZ0I7QUFBQSxVQUNoQixVQUFVO0FBQUEsVUFDVixTQUFTO0FBQUEsVUFDVCxnQkFBZ0I7QUFBQSxVQUNoQixNQUFNO0FBQUEsWUFDRixNQUFNO0FBQUEsVUFDVjtBQUFBLFFBQ0o7QUFBQSxRQUNBLFFBQVE7QUFBQSxVQUNKLGdCQUFnQjtBQUFBLFVBQ2hCLFNBQVM7QUFBQSxVQUNULE1BQU07QUFBQSxZQUNGLE1BQU07QUFBQSxVQUNWO0FBQUEsUUFDSjtBQUFBLFFBQ0EsUUFBUTtBQUFBLFVBQ0osZ0JBQWdCO0FBQUEsVUFDaEIsU0FBUztBQUFBLFVBQ1QsTUFBTTtBQUFBLFlBQ0YsTUFBTTtBQUFBLFVBQ1Y7QUFBQSxRQUNKO0FBQUEsUUFDQSxhQUFhO0FBQUEsVUFDVCxnQkFBZ0I7QUFBQSxVQUNoQixTQUFTO0FBQUEsVUFDVCxNQUFNO0FBQUEsWUFDRixNQUFNO0FBQUEsVUFDVjtBQUFBLFFBQ0o7QUFBQSxRQUNBLFdBQVc7QUFBQSxVQUNQLGdCQUFnQjtBQUFBLFVBQ2hCLFNBQVM7QUFBQSxVQUNULE1BQU07QUFBQSxZQUNGLE1BQU07QUFBQSxVQUNWO0FBQUEsUUFDSjtBQUFBLFFBQ0EsU0FBUztBQUFBLFVBQ0wsZ0JBQWdCO0FBQUEsVUFDaEIsU0FBUztBQUFBLFVBQ1QsTUFBTTtBQUFBLFlBQ0YsTUFBTTtBQUFBLFlBQ04sV0FBVztBQUFBLFVBQ2Y7QUFBQSxRQUNKO0FBQUEsUUFDQSxtQkFBbUI7QUFBQSxVQUNmLGdCQUFnQjtBQUFBLFVBQ2hCLFNBQVM7QUFBQSxVQUNULE1BQU07QUFBQSxZQUNGLE1BQU07QUFBQSxVQUNWO0FBQUEsUUFDSjtBQUFBLE1BQ0o7QUFBQSxJQUNKO0FBQUEsRUFDSjtBQUNBLE1BQU0sMkJBQTJCO0FBQUEsSUFDN0IsZ0JBQWdCO0FBQUEsSUFDaEIsU0FBUztBQUFBLElBQ1QsTUFBTTtBQUFBLE1BQ0YsTUFBTTtBQUFBLE1BQ04sV0FBVztBQUFBLE1BQ1gsaUJBQWlCO0FBQUEsUUFDYixjQUFjO0FBQUEsVUFDVixnQkFBZ0I7QUFBQSxVQUNoQixTQUFTO0FBQUEsVUFDVCxnQkFBZ0I7QUFBQSxVQUNoQixNQUFNO0FBQUEsWUFDRixNQUFNO0FBQUEsWUFDTixTQUFTO0FBQUEsY0FDTCxNQUFNO0FBQUEsZ0JBQ0YsTUFBTTtBQUFBLGdCQUNOLFdBQVc7QUFBQSxjQUNmO0FBQUEsWUFDSjtBQUFBLFVBQ0o7QUFBQSxRQUNKO0FBQUEsUUFDQSxXQUFXO0FBQUEsVUFDUCxnQkFBZ0I7QUFBQSxVQUNoQixVQUFVO0FBQUEsVUFDVixTQUFTO0FBQUEsVUFDVCxnQkFBZ0I7QUFBQSxVQUNoQixNQUFNO0FBQUEsWUFDRixNQUFNO0FBQUEsWUFDTixTQUFTO0FBQUEsY0FDTCxNQUFNO0FBQUEsZ0JBQ0YsTUFBTTtBQUFBLGdCQUNOLFdBQVc7QUFBQSxjQUNmO0FBQUEsWUFDSjtBQUFBLFVBQ0o7QUFBQSxRQUNKO0FBQUEsTUFDSjtBQUFBLElBQ0o7QUFBQSxFQUNKO0FBQ0EsTUFBTSxhQUFhO0FBQUEsSUFDZixnQkFBZ0I7QUFBQSxJQUNoQixNQUFNO0FBQUEsTUFDRixNQUFNO0FBQUEsTUFDTixXQUFXO0FBQUEsTUFDWCxpQkFBaUI7QUFBQSxRQUNiLE1BQU07QUFBQSxVQUNGLGdCQUFnQjtBQUFBLFVBQ2hCLFNBQVM7QUFBQSxVQUNULE1BQU07QUFBQSxZQUNGLE1BQU07QUFBQSxZQUNOLFdBQVc7QUFBQSxVQUNmO0FBQUEsUUFDSjtBQUFBLE1BQ0o7QUFBQSxJQUNKO0FBQUEsRUFDSjtBQUNBLE1BQU0sa0JBQWtCO0FBQUEsSUFDcEIsZ0JBQWdCO0FBQUEsSUFDaEIsU0FBUztBQUFBLElBQ1QsTUFBTTtBQUFBLE1BQ0YsTUFBTTtBQUFBLE1BQ04sV0FBVztBQUFBLE1BQ1gsaUJBQWlCO0FBQUEsUUFDYixXQUFXO0FBQUEsVUFDUCxnQkFBZ0I7QUFBQSxVQUNoQixTQUFTO0FBQUEsVUFDVCxnQkFBZ0I7QUFBQSxVQUNoQixNQUFNO0FBQUEsWUFDRixNQUFNO0FBQUEsWUFDTixTQUFTO0FBQUEsY0FDTCxNQUFNO0FBQUEsZ0JBQ0YsTUFBTTtBQUFBLGNBQ1Y7QUFBQSxZQUNKO0FBQUEsVUFDSjtBQUFBLFFBQ0o7QUFBQSxRQUNBLGFBQWE7QUFBQSxVQUNULGdCQUFnQjtBQUFBLFVBQ2hCLFNBQVM7QUFBQSxVQUNULGdCQUFnQjtBQUFBLFVBQ2hCLE1BQU07QUFBQSxZQUNGLE1BQU07QUFBQSxZQUNOLFNBQVM7QUFBQSxjQUNMLE1BQU07QUFBQSxnQkFDRixNQUFNO0FBQUEsY0FDVjtBQUFBLFlBQ0o7QUFBQSxVQUNKO0FBQUEsUUFDSjtBQUFBLFFBQ0EsUUFBUTtBQUFBLFVBQ0osZ0JBQWdCO0FBQUEsVUFDaEIsU0FBUztBQUFBLFVBQ1QsZ0JBQWdCO0FBQUEsVUFDaEIsTUFBTTtBQUFBLFlBQ0YsTUFBTTtBQUFBLFlBQ04sU0FBUztBQUFBLGNBQ0wsTUFBTTtBQUFBLGdCQUNGLE1BQU07QUFBQSxjQUNWO0FBQUEsWUFDSjtBQUFBLFVBQ0o7QUFBQSxRQUNKO0FBQUEsTUFDSjtBQUFBLElBQ0o7QUFBQSxFQUNKO0FBQ0EsTUFBTSxZQUFZO0FBQUEsSUFDZCxnQkFBZ0I7QUFBQSxJQUNoQixNQUFNO0FBQUEsTUFDRixNQUFNO0FBQUEsTUFDTixXQUFXO0FBQUEsTUFDWCxpQkFBaUI7QUFBQSxRQUNiLGlCQUFpQjtBQUFBLFVBQ2IsZ0JBQWdCO0FBQUEsVUFDaEIsU0FBUztBQUFBLFVBQ1QsY0FBYztBQUFBLFVBQ2QsZ0JBQWdCO0FBQUEsVUFDaEIsTUFBTTtBQUFBLFlBQ0YsTUFBTTtBQUFBLFlBQ04sU0FBUztBQUFBLGNBQ0wsTUFBTTtBQUFBLGdCQUNGLE1BQU07QUFBQSxnQkFDTixXQUFXO0FBQUEsY0FDZjtBQUFBLFlBQ0o7QUFBQSxVQUNKO0FBQUEsUUFDSjtBQUFBLFFBQ0EsbUJBQW1CO0FBQUEsVUFDZixnQkFBZ0I7QUFBQSxVQUNoQixTQUFTO0FBQUEsVUFDVCxjQUFjO0FBQUEsVUFDZCxnQkFBZ0I7QUFBQSxVQUNoQixNQUFNO0FBQUEsWUFDRixNQUFNO0FBQUEsWUFDTixTQUFTO0FBQUEsY0FDTCxNQUFNO0FBQUEsZ0JBQ0YsTUFBTTtBQUFBLGdCQUNOLFdBQVc7QUFBQSxjQUNmO0FBQUEsWUFDSjtBQUFBLFVBQ0o7QUFBQSxRQUNKO0FBQUEsTUFDSjtBQUFBLElBQ0o7QUFBQSxFQUNKO0FBQ0EsTUFBTSxRQUFRO0FBQUEsSUFDVixnQkFBZ0I7QUFBQSxJQUNoQixNQUFNO0FBQUEsTUFDRixNQUFNO0FBQUEsTUFDTixXQUFXO0FBQUEsTUFDWCxpQkFBaUI7QUFBQSxRQUNiLE1BQU07QUFBQSxVQUNGLGdCQUFnQjtBQUFBLFVBQ2hCLFVBQVU7QUFBQSxVQUNWLFNBQVM7QUFBQSxVQUNULE1BQU07QUFBQSxZQUNGLE1BQU07QUFBQSxVQUNWO0FBQUEsUUFDSjtBQUFBLFFBQ0EsTUFBTTtBQUFBLFVBQ0YsZ0JBQWdCO0FBQUEsVUFDaEIsVUFBVTtBQUFBLFVBQ1YsU0FBUztBQUFBLFVBQ1QsTUFBTTtBQUFBLFlBQ0YsTUFBTTtBQUFBLFVBQ1Y7QUFBQSxRQUNKO0FBQUEsTUFDSjtBQUFBLElBQ0o7QUFBQSxFQUNKO0FBQ0EsTUFBTSxXQUFXO0FBQUEsSUFDYixnQkFBZ0I7QUFBQSxJQUNoQixNQUFNO0FBQUEsTUFDRixNQUFNO0FBQUEsTUFDTixXQUFXO0FBQUEsTUFDWCxpQkFBaUI7QUFBQSxRQUNiLFdBQVc7QUFBQSxVQUNQLGdCQUFnQjtBQUFBLFVBQ2hCLFNBQVM7QUFBQSxVQUNULGdCQUFnQjtBQUFBLFVBQ2hCLE1BQU07QUFBQSxZQUNGLE1BQU07QUFBQSxZQUNOLFNBQVM7QUFBQSxjQUNMLE1BQU07QUFBQSxnQkFDRixNQUFNO0FBQUEsZ0JBQ04sV0FBVztBQUFBLGNBQ2Y7QUFBQSxZQUNKO0FBQUEsVUFDSjtBQUFBLFFBQ0o7QUFBQSxRQUNBLFlBQVk7QUFBQSxVQUNSLGdCQUFnQjtBQUFBLFVBQ2hCLFNBQVM7QUFBQSxVQUNULGdCQUFnQjtBQUFBLFVBQ2hCLE1BQU07QUFBQSxZQUNGLE1BQU07QUFBQSxZQUNOLFNBQVM7QUFBQSxjQUNMLE1BQU07QUFBQSxnQkFDRixNQUFNO0FBQUEsZ0JBQ04sV0FBVztBQUFBLGNBQ2Y7QUFBQSxZQUNKO0FBQUEsVUFDSjtBQUFBLFFBQ0o7QUFBQSxRQUNBLG1CQUFtQjtBQUFBLFVBQ2YsZ0JBQWdCO0FBQUEsVUFDaEIsU0FBUztBQUFBLFVBQ1QsTUFBTTtBQUFBLFlBQ0YsTUFBTTtBQUFBLFVBQ1Y7QUFBQSxRQUNKO0FBQUEsTUFDSjtBQUFBLElBQ0o7QUFBQSxFQUNKO0FBQ0EsTUFBTSxZQUFZO0FBQUEsSUFDZCxnQkFBZ0I7QUFBQSxJQUNoQixTQUFTO0FBQUEsSUFDVCxNQUFNO0FBQUEsTUFDRixNQUFNO0FBQUEsTUFDTixXQUFXO0FBQUEsTUFDWCxpQkFBaUI7QUFBQSxRQUNiLE9BQU87QUFBQSxVQUNILGdCQUFnQjtBQUFBLFVBQ2hCLFVBQVU7QUFBQSxVQUNWLFNBQVM7QUFBQSxVQUNULE1BQU07QUFBQSxZQUNGLE1BQU07QUFBQSxVQUNWO0FBQUEsUUFDSjtBQUFBLFFBQ0EsS0FBSztBQUFBLFVBQ0QsZ0JBQWdCO0FBQUEsVUFDaEIsVUFBVTtBQUFBLFVBQ1YsU0FBUztBQUFBLFVBQ1QsTUFBTTtBQUFBLFlBQ0YsTUFBTTtBQUFBLFVBQ1Y7QUFBQSxRQUNKO0FBQUEsTUFDSjtBQUFBLElBQ0o7QUFBQSxFQUNKO0FBQ0EsTUFBTSxhQUFhO0FBQUEsSUFDZixnQkFBZ0I7QUFBQSxJQUNoQixTQUFTO0FBQUEsSUFDVCxNQUFNO0FBQUEsTUFDRixNQUFNO0FBQUEsTUFDTixXQUFXO0FBQUEsTUFDWCxpQkFBaUI7QUFBQSxRQUNiLE9BQU87QUFBQSxVQUNILGdCQUFnQjtBQUFBLFVBQ2hCLFVBQVU7QUFBQSxVQUNWLFNBQVM7QUFBQSxVQUNULE1BQU07QUFBQSxZQUNGLE1BQU07QUFBQSxVQUNWO0FBQUEsUUFDSjtBQUFBLFFBQ0EsS0FBSztBQUFBLFVBQ0QsZ0JBQWdCO0FBQUEsVUFDaEIsVUFBVTtBQUFBLFVBQ1YsU0FBUztBQUFBLFVBQ1QsTUFBTTtBQUFBLFlBQ0YsTUFBTTtBQUFBLFVBQ1Y7QUFBQSxRQUNKO0FBQUEsTUFDSjtBQUFBLElBQ0o7QUFBQSxFQUNKO0FBQ0EsTUFBTSxlQUFlO0FBQUEsSUFDakIsZ0JBQWdCO0FBQUEsSUFDaEIsU0FBUztBQUFBLElBQ1QsTUFBTTtBQUFBLE1BQ0YsTUFBTTtBQUFBLE1BQ04sV0FBVztBQUFBLE1BQ1gsaUJBQWlCO0FBQUEsUUFDYixXQUFXO0FBQUEsVUFDUCxnQkFBZ0I7QUFBQSxVQUNoQixVQUFVO0FBQUEsVUFDVixTQUFTO0FBQUEsVUFDVCxNQUFNO0FBQUEsWUFDRixNQUFNO0FBQUEsVUFDVjtBQUFBLFFBQ0o7QUFBQSxRQUNBLFlBQVk7QUFBQSxVQUNSLGdCQUFnQjtBQUFBLFVBQ2hCLFVBQVU7QUFBQSxVQUNWLFNBQVM7QUFBQSxVQUNULE1BQU07QUFBQSxZQUNGLE1BQU07QUFBQSxVQUNWO0FBQUEsUUFDSjtBQUFBLFFBQ0Esb0JBQW9CO0FBQUEsVUFDaEIsZ0JBQWdCO0FBQUEsVUFDaEIsU0FBUztBQUFBLFVBQ1QsTUFBTTtBQUFBLFlBQ0YsTUFBTTtBQUFBLFlBQ04sV0FBVztBQUFBLFVBQ2Y7QUFBQSxRQUNKO0FBQUEsUUFDQSxxQkFBcUI7QUFBQSxVQUNqQixnQkFBZ0I7QUFBQSxVQUNoQixTQUFTO0FBQUEsVUFDVCxNQUFNO0FBQUEsWUFDRixNQUFNO0FBQUEsWUFDTixXQUFXO0FBQUEsVUFDZjtBQUFBLFFBQ0o7QUFBQSxNQUNKO0FBQUEsSUFDSjtBQUFBLEVBQ0o7QUFDQSxNQUFNLHFCQUFxQjtBQUFBLElBQ3ZCLGdCQUFnQjtBQUFBLElBQ2hCLE1BQU07QUFBQSxNQUNGLE1BQU07QUFBQSxNQUNOLFdBQVc7QUFBQSxNQUNYLGlCQUFpQjtBQUFBLFFBQ2IsUUFBUTtBQUFBLFVBQ0osZ0JBQWdCO0FBQUEsVUFDaEIsU0FBUztBQUFBLFVBQ1QsTUFBTTtBQUFBLFlBQ0YsTUFBTTtBQUFBLFlBQ04sV0FBVztBQUFBLFVBQ2Y7QUFBQSxRQUNKO0FBQUEsTUFDSjtBQUFBLElBQ0o7QUFBQSxFQUNKO0FBQ0EsTUFBTSxjQUFjO0FBQUEsSUFDaEIsZ0JBQWdCO0FBQUEsSUFDaEIsTUFBTTtBQUFBLE1BQ0YsTUFBTTtBQUFBLE1BQ04sV0FBVztBQUFBLE1BQ1gsaUJBQWlCO0FBQUEsUUFDYixNQUFNO0FBQUEsVUFDRixnQkFBZ0I7QUFBQSxVQUNoQixVQUFVO0FBQUEsVUFDVixTQUFTO0FBQUEsVUFDVCxNQUFNO0FBQUEsWUFDRixNQUFNO0FBQUEsWUFDTixlQUFlLENBQUMsYUFBYSxRQUFRLFNBQVMsU0FBUztBQUFBLFVBQzNEO0FBQUEsUUFDSjtBQUFBLFFBQ0EsNEJBQTRCO0FBQUEsVUFDeEIsZ0JBQWdCO0FBQUEsVUFDaEIsU0FBUztBQUFBLFVBQ1QsTUFBTTtBQUFBLFlBQ0YsTUFBTTtBQUFBLFlBQ04sV0FBVztBQUFBLFVBQ2Y7QUFBQSxRQUNKO0FBQUEsUUFDQSx1QkFBdUI7QUFBQSxVQUNuQixnQkFBZ0I7QUFBQSxVQUNoQixTQUFTO0FBQUEsVUFDVCxNQUFNO0FBQUEsWUFDRixNQUFNO0FBQUEsWUFDTixXQUFXO0FBQUEsVUFDZjtBQUFBLFFBQ0o7QUFBQSxRQUNBLG9CQUFvQjtBQUFBLFVBQ2hCLGdCQUFnQjtBQUFBLFVBQ2hCLFNBQVM7QUFBQSxVQUNULE1BQU07QUFBQSxZQUNGLE1BQU07QUFBQSxZQUNOLFdBQVc7QUFBQSxVQUNmO0FBQUEsUUFDSjtBQUFBLFFBQ0EsMEJBQTBCO0FBQUEsVUFDdEIsZ0JBQWdCO0FBQUEsVUFDaEIsU0FBUztBQUFBLFVBQ1QsTUFBTTtBQUFBLFlBQ0YsTUFBTTtBQUFBLFlBQ04sT0FBTyxFQUFFLE1BQU0sRUFBRSxNQUFNLE1BQU0sRUFBRTtBQUFBLFVBQ25DO0FBQUEsUUFDSjtBQUFBLE1BQ0o7QUFBQSxJQUNKO0FBQUEsRUFDSjtBQUNBLE1BQU0sNkJBQTZCO0FBQUEsSUFDL0IsZ0JBQWdCO0FBQUEsSUFDaEIsU0FBUztBQUFBLElBQ1QsTUFBTTtBQUFBLE1BQ0YsTUFBTTtBQUFBLE1BQ04sV0FBVztBQUFBLE1BQ1gsaUJBQWlCO0FBQUEsUUFDYixpQkFBaUI7QUFBQSxVQUNiLGdCQUFnQjtBQUFBLFVBQ2hCLFNBQVM7QUFBQSxVQUNULE1BQU07QUFBQSxZQUNGLE1BQU07QUFBQSxVQUNWO0FBQUEsUUFDSjtBQUFBLFFBQ0EsWUFBWTtBQUFBLFVBQ1IsZ0JBQWdCO0FBQUEsVUFDaEIsU0FBUztBQUFBLFVBQ1QsTUFBTTtBQUFBLFlBQ0YsTUFBTTtBQUFBLFVBQ1Y7QUFBQSxRQUNKO0FBQUEsUUFDQSxpQkFBaUI7QUFBQSxVQUNiLGdCQUFnQjtBQUFBLFVBQ2hCLFNBQVM7QUFBQSxVQUNULE1BQU07QUFBQSxZQUNGLE1BQU07QUFBQSxVQUNWO0FBQUEsUUFDSjtBQUFBLFFBQ0EsWUFBWTtBQUFBLFVBQ1IsZ0JBQWdCO0FBQUEsVUFDaEIsU0FBUztBQUFBLFVBQ1QsTUFBTTtBQUFBLFlBQ0YsTUFBTTtBQUFBLFVBQ1Y7QUFBQSxRQUNKO0FBQUEsUUFDQSxnQkFBZ0I7QUFBQSxVQUNaLGdCQUFnQjtBQUFBLFVBQ2hCLFNBQVM7QUFBQSxVQUNULE1BQU07QUFBQSxZQUNGLE1BQU07QUFBQSxVQUNWO0FBQUEsUUFDSjtBQUFBLE1BQ0o7QUFBQSxJQUNKO0FBQUEsRUFDSjtBQUNBLE1BQU0sd0JBQXdCO0FBQUEsSUFDMUIsZ0JBQWdCO0FBQUEsSUFDaEIsU0FBUztBQUFBLElBQ1QsTUFBTTtBQUFBLE1BQ0YsTUFBTTtBQUFBLE1BQ04sV0FBVztBQUFBLE1BQ1gsaUJBQWlCO0FBQUEsUUFDYixpQkFBaUI7QUFBQSxVQUNiLGdCQUFnQjtBQUFBLFVBQ2hCLFNBQVM7QUFBQSxVQUNULE1BQU07QUFBQSxZQUNGLE1BQU07QUFBQSxVQUNWO0FBQUEsUUFDSjtBQUFBLE1BQ0o7QUFBQSxJQUNKO0FBQUEsRUFDSjtBQUNBLE1BQU0scUJBQXFCO0FBQUEsSUFDdkIsZ0JBQWdCO0FBQUEsSUFDaEIsU0FBUztBQUFBLElBQ1QsTUFBTTtBQUFBLE1BQ0YsTUFBTTtBQUFBLE1BQ04sV0FBVztBQUFBLE1BQ1gsaUJBQWlCO0FBQUEsUUFDYixRQUFRO0FBQUEsVUFDSixnQkFBZ0I7QUFBQSxVQUNoQixVQUFVO0FBQUEsVUFDVixTQUFTO0FBQUEsVUFDVCxjQUFjO0FBQUEsVUFDZCxnQkFBZ0I7QUFBQSxVQUNoQixNQUFNO0FBQUEsWUFDRixNQUFNO0FBQUEsWUFDTixTQUFTO0FBQUEsY0FDTCxNQUFNO0FBQUEsZ0JBQ0YsTUFBTTtBQUFBLGdCQUNOLFdBQVc7QUFBQSxjQUNmO0FBQUEsWUFDSjtBQUFBLFVBQ0o7QUFBQSxRQUNKO0FBQUEsTUFDSjtBQUFBLElBQ0o7QUFBQSxFQUNKO0FBQ0EsTUFBTSxhQUFhO0FBQUEsSUFDZixnQkFBZ0I7QUFBQSxJQUNoQixTQUFTO0FBQUEsSUFDVCxNQUFNO0FBQUEsTUFDRixNQUFNO0FBQUEsTUFDTixXQUFXO0FBQUEsTUFDWCxpQkFBaUI7QUFBQSxRQUNiLE1BQU07QUFBQSxVQUNGLGdCQUFnQjtBQUFBLFVBQ2hCLFVBQVU7QUFBQSxVQUNWLFNBQVM7QUFBQSxVQUNULE1BQU07QUFBQSxZQUNGLE1BQU07QUFBQSxVQUNWO0FBQUEsUUFDSjtBQUFBLFFBQ0EsTUFBTTtBQUFBLFVBQ0YsZ0JBQWdCO0FBQUEsVUFDaEIsU0FBUztBQUFBLFVBQ1QsTUFBTTtBQUFBLFlBQ0YsTUFBTTtBQUFBLFVBQ1Y7QUFBQSxRQUNKO0FBQUEsUUFDQSxXQUFXO0FBQUEsVUFDUCxnQkFBZ0I7QUFBQSxVQUNoQixTQUFTO0FBQUEsVUFDVCxNQUFNO0FBQUEsWUFDRixNQUFNO0FBQUEsVUFDVjtBQUFBLFFBQ0o7QUFBQSxRQUNBLE9BQU87QUFBQSxVQUNILGdCQUFnQjtBQUFBLFVBQ2hCLFNBQVM7QUFBQSxVQUNULE1BQU07QUFBQSxZQUNGLE1BQU07QUFBQSxVQUNWO0FBQUEsUUFDSjtBQUFBLE1BQ0o7QUFBQSxJQUNKO0FBQUEsRUFDSjtBQUNBLE1BQU0sOEJBQThCO0FBQUEsSUFDaEMsZ0JBQWdCO0FBQUEsSUFDaEIsTUFBTTtBQUFBLE1BQ0YsTUFBTTtBQUFBLE1BQ04sV0FBVztBQUFBLE1BQ1gsaUJBQWlCO0FBQUEsUUFDYixpQkFBaUI7QUFBQSxVQUNiLGdCQUFnQjtBQUFBLFVBQ2hCLFNBQVM7QUFBQSxVQUNULE1BQU07QUFBQSxZQUNGLE1BQU07QUFBQSxVQUNWO0FBQUEsUUFDSjtBQUFBLFFBQ0EsV0FBVztBQUFBLFVBQ1AsZ0JBQWdCO0FBQUEsVUFDaEIsU0FBUztBQUFBLFVBQ1QsTUFBTTtBQUFBLFlBQ0YsTUFBTTtBQUFBLFVBQ1Y7QUFBQSxRQUNKO0FBQUEsUUFDQSxTQUFTO0FBQUEsVUFDTCxnQkFBZ0I7QUFBQSxVQUNoQixTQUFTO0FBQUEsVUFDVCxNQUFNO0FBQUEsWUFDRixNQUFNO0FBQUEsVUFDVjtBQUFBLFFBQ0o7QUFBQSxRQUNBLFdBQVc7QUFBQSxVQUNQLGdCQUFnQjtBQUFBLFVBQ2hCLFNBQVM7QUFBQSxVQUNULE1BQU07QUFBQSxZQUNGLE1BQU07QUFBQSxVQUNWO0FBQUEsUUFDSjtBQUFBLE1BQ0o7QUFBQSxJQUNKO0FBQUEsRUFDSjtBQUNBLE1BQU0sdUNBQXVDO0FBQUEsSUFDekMsZ0JBQWdCO0FBQUEsSUFDaEIsTUFBTTtBQUFBLE1BQ0YsTUFBTTtBQUFBLE1BQ04sV0FBVztBQUFBLE1BQ1gsaUJBQWlCO0FBQUEsUUFDYixXQUFXO0FBQUEsVUFDUCxnQkFBZ0I7QUFBQSxVQUNoQixTQUFTO0FBQUEsVUFDVCxNQUFNO0FBQUEsWUFDRixNQUFNO0FBQUEsVUFDVjtBQUFBLFFBQ0o7QUFBQSxNQUNKO0FBQUEsSUFDSjtBQUFBLEVBQ0o7QUFDQSxNQUFNLDhCQUE4QjtBQUFBLElBQ2hDLGdCQUFnQjtBQUFBLElBQ2hCLE1BQU07QUFBQSxNQUNGLE1BQU07QUFBQSxNQUNOLFdBQVc7QUFBQSxNQUNYLGlCQUFpQjtBQUFBLFFBQ2IsaUJBQWlCO0FBQUEsVUFDYixnQkFBZ0I7QUFBQSxVQUNoQixTQUFTO0FBQUEsVUFDVCxNQUFNO0FBQUEsWUFDRixNQUFNO0FBQUEsVUFDVjtBQUFBLFFBQ0o7QUFBQSxRQUNBLFdBQVc7QUFBQSxVQUNQLGdCQUFnQjtBQUFBLFVBQ2hCLFNBQVM7QUFBQSxVQUNULE1BQU07QUFBQSxZQUNGLE1BQU07QUFBQSxVQUNWO0FBQUEsUUFDSjtBQUFBLFFBQ0EsU0FBUztBQUFBLFVBQ0wsZ0JBQWdCO0FBQUEsVUFDaEIsU0FBUztBQUFBLFVBQ1QsTUFBTTtBQUFBLFlBQ0YsTUFBTTtBQUFBLFVBQ1Y7QUFBQSxRQUNKO0FBQUEsUUFDQSxXQUFXO0FBQUEsVUFDUCxnQkFBZ0I7QUFBQSxVQUNoQixTQUFTO0FBQUEsVUFDVCxNQUFNO0FBQUEsWUFDRixNQUFNO0FBQUEsVUFDVjtBQUFBLFFBQ0o7QUFBQSxNQUNKO0FBQUEsSUFDSjtBQUFBLEVBQ0o7QUFDQSxNQUFNLHVDQUF1QztBQUFBLElBQ3pDLGdCQUFnQjtBQUFBLElBQ2hCLE1BQU07QUFBQSxNQUNGLE1BQU07QUFBQSxNQUNOLFdBQVc7QUFBQSxNQUNYLGlCQUFpQjtBQUFBLFFBQ2IsV0FBVztBQUFBLFVBQ1AsZ0JBQWdCO0FBQUEsVUFDaEIsU0FBUztBQUFBLFVBQ1QsTUFBTTtBQUFBLFlBQ0YsTUFBTTtBQUFBLFVBQ1Y7QUFBQSxRQUNKO0FBQUEsTUFDSjtBQUFBLElBQ0o7QUFBQSxFQUNKO0FBQ0EsTUFBTSw4QkFBOEI7QUFBQSxJQUNoQyxnQkFBZ0I7QUFBQSxJQUNoQixNQUFNO0FBQUEsTUFDRixNQUFNO0FBQUEsTUFDTixXQUFXO0FBQUEsTUFDWCxpQkFBaUI7QUFBQSxRQUNiLGlCQUFpQjtBQUFBLFVBQ2IsZ0JBQWdCO0FBQUEsVUFDaEIsU0FBUztBQUFBLFVBQ1QsTUFBTTtBQUFBLFlBQ0YsTUFBTTtBQUFBLFVBQ1Y7QUFBQSxRQUNKO0FBQUEsUUFDQSxXQUFXO0FBQUEsVUFDUCxnQkFBZ0I7QUFBQSxVQUNoQixTQUFTO0FBQUEsVUFDVCxNQUFNO0FBQUEsWUFDRixNQUFNO0FBQUEsVUFDVjtBQUFBLFFBQ0o7QUFBQSxRQUNBLFNBQVM7QUFBQSxVQUNMLGdCQUFnQjtBQUFBLFVBQ2hCLFNBQVM7QUFBQSxVQUNULE1BQU07QUFBQSxZQUNGLE1BQU07QUFBQSxVQUNWO0FBQUEsUUFDSjtBQUFBLFFBQ0EsTUFBTTtBQUFBLFVBQ0YsZ0JBQWdCO0FBQUEsVUFDaEIsU0FBUztBQUFBLFVBQ1QsTUFBTTtBQUFBLFlBQ0YsTUFBTTtBQUFBLFVBQ1Y7QUFBQSxRQUNKO0FBQUEsUUFDQSxXQUFXO0FBQUEsVUFDUCxnQkFBZ0I7QUFBQSxVQUNoQixTQUFTO0FBQUEsVUFDVCxNQUFNO0FBQUEsWUFDRixNQUFNO0FBQUEsVUFDVjtBQUFBLFFBQ0o7QUFBQSxNQUNKO0FBQUEsSUFDSjtBQUFBLEVBQ0o7QUFDQSxNQUFNLHVDQUF1QztBQUFBLElBQ3pDLGdCQUFnQjtBQUFBLElBQ2hCLE1BQU07QUFBQSxNQUNGLE1BQU07QUFBQSxNQUNOLFdBQVc7QUFBQSxNQUNYLGlCQUFpQjtBQUFBLFFBQ2IsV0FBVztBQUFBLFVBQ1AsZ0JBQWdCO0FBQUEsVUFDaEIsU0FBUztBQUFBLFVBQ1QsTUFBTTtBQUFBLFlBQ0YsTUFBTTtBQUFBLFVBQ1Y7QUFBQSxRQUNKO0FBQUEsTUFDSjtBQUFBLElBQ0o7QUFBQSxFQUNKO0FBQ0EsTUFBTSxzQ0FBc0M7QUFBQSxJQUN4QyxnQkFBZ0I7QUFBQSxJQUNoQixNQUFNO0FBQUEsTUFDRixNQUFNO0FBQUEsTUFDTixXQUFXO0FBQUEsTUFDWCxpQkFBaUI7QUFBQSxRQUNiLGlCQUFpQjtBQUFBLFVBQ2IsZ0JBQWdCO0FBQUEsVUFDaEIsU0FBUztBQUFBLFVBQ1QsTUFBTTtBQUFBLFlBQ0YsTUFBTTtBQUFBLFVBQ1Y7QUFBQSxRQUNKO0FBQUEsUUFDQSxXQUFXO0FBQUEsVUFDUCxnQkFBZ0I7QUFBQSxVQUNoQixTQUFTO0FBQUEsVUFDVCxNQUFNO0FBQUEsWUFDRixNQUFNO0FBQUEsVUFDVjtBQUFBLFFBQ0o7QUFBQSxRQUNBLFNBQVM7QUFBQSxVQUNMLGdCQUFnQjtBQUFBLFVBQ2hCLFNBQVM7QUFBQSxVQUNULE1BQU07QUFBQSxZQUNGLE1BQU07QUFBQSxVQUNWO0FBQUEsUUFDSjtBQUFBLFFBQ0EsV0FBVztBQUFBLFVBQ1AsZ0JBQWdCO0FBQUEsVUFDaEIsU0FBUztBQUFBLFVBQ1QsTUFBTTtBQUFBLFlBQ0YsTUFBTTtBQUFBLFVBQ1Y7QUFBQSxRQUNKO0FBQUEsTUFDSjtBQUFBLElBQ0o7QUFBQSxFQUNKO0FBQ0EsTUFBTSwrQ0FBK0M7QUFBQSxJQUNqRCxnQkFBZ0I7QUFBQSxJQUNoQixNQUFNO0FBQUEsTUFDRixNQUFNO0FBQUEsTUFDTixXQUFXO0FBQUEsTUFDWCxpQkFBaUI7QUFBQSxRQUNiLFdBQVc7QUFBQSxVQUNQLGdCQUFnQjtBQUFBLFVBQ2hCLFNBQVM7QUFBQSxVQUNULE1BQU07QUFBQSxZQUNGLE1BQU07QUFBQSxVQUNWO0FBQUEsUUFDSjtBQUFBLE1BQ0o7QUFBQSxJQUNKO0FBQUEsRUFDSjtBQUNBLE1BQU0scUNBQXFDO0FBQUEsSUFDdkMsZ0JBQWdCO0FBQUEsSUFDaEIsTUFBTTtBQUFBLE1BQ0YsTUFBTTtBQUFBLE1BQ04sV0FBVztBQUFBLE1BQ1gsaUJBQWlCO0FBQUEsUUFDYixpQkFBaUI7QUFBQSxVQUNiLGdCQUFnQjtBQUFBLFVBQ2hCLFNBQVM7QUFBQSxVQUNULE1BQU07QUFBQSxZQUNGLE1BQU07QUFBQSxVQUNWO0FBQUEsUUFDSjtBQUFBLFFBQ0EsV0FBVztBQUFBLFVBQ1AsZ0JBQWdCO0FBQUEsVUFDaEIsU0FBUztBQUFBLFVBQ1QsTUFBTTtBQUFBLFlBQ0YsTUFBTTtBQUFBLFVBQ1Y7QUFBQSxRQUNKO0FBQUEsUUFDQSxTQUFTO0FBQUEsVUFDTCxnQkFBZ0I7QUFBQSxVQUNoQixTQUFTO0FBQUEsVUFDVCxNQUFNO0FBQUEsWUFDRixNQUFNO0FBQUEsVUFDVjtBQUFBLFFBQ0o7QUFBQSxRQUNBLE1BQU07QUFBQSxVQUNGLGdCQUFnQjtBQUFBLFVBQ2hCLFNBQVM7QUFBQSxVQUNULE1BQU07QUFBQSxZQUNGLE1BQU07QUFBQSxVQUNWO0FBQUEsUUFDSjtBQUFBLFFBQ0EsV0FBVztBQUFBLFVBQ1AsZ0JBQWdCO0FBQUEsVUFDaEIsU0FBUztBQUFBLFVBQ1QsTUFBTTtBQUFBLFlBQ0YsTUFBTTtBQUFBLFVBQ1Y7QUFBQSxRQUNKO0FBQUEsTUFDSjtBQUFBLElBQ0o7QUFBQSxFQUNKO0FBQ0EsTUFBTSw4Q0FBOEM7QUFBQSxJQUNoRCxnQkFBZ0I7QUFBQSxJQUNoQixNQUFNO0FBQUEsTUFDRixNQUFNO0FBQUEsTUFDTixXQUFXO0FBQUEsTUFDWCxpQkFBaUI7QUFBQSxRQUNiLFdBQVc7QUFBQSxVQUNQLGdCQUFnQjtBQUFBLFVBQ2hCLFNBQVM7QUFBQSxVQUNULE1BQU07QUFBQSxZQUNGLE1BQU07QUFBQSxVQUNWO0FBQUEsUUFDSjtBQUFBLE1BQ0o7QUFBQSxJQUNKO0FBQUEsRUFDSjtBQUNBLE1BQU0sK0JBQStCO0FBQUEsSUFDakMsZ0JBQWdCO0FBQUEsSUFDaEIsTUFBTTtBQUFBLE1BQ0YsTUFBTTtBQUFBLE1BQ04sV0FBVztBQUFBLE1BQ1gsaUJBQWlCO0FBQUEsUUFDYixpQkFBaUI7QUFBQSxVQUNiLGdCQUFnQjtBQUFBLFVBQ2hCLFNBQVM7QUFBQSxVQUNULE1BQU07QUFBQSxZQUNGLE1BQU07QUFBQSxVQUNWO0FBQUEsUUFDSjtBQUFBLFFBQ0EsV0FBVztBQUFBLFVBQ1AsZ0JBQWdCO0FBQUEsVUFDaEIsU0FBUztBQUFBLFVBQ1QsTUFBTTtBQUFBLFlBQ0YsTUFBTTtBQUFBLFVBQ1Y7QUFBQSxRQUNKO0FBQUEsUUFDQSxTQUFTO0FBQUEsVUFDTCxnQkFBZ0I7QUFBQSxVQUNoQixTQUFTO0FBQUEsVUFDVCxNQUFNO0FBQUEsWUFDRixNQUFNO0FBQUEsVUFDVjtBQUFBLFFBQ0o7QUFBQSxRQUNBLE1BQU07QUFBQSxVQUNGLGdCQUFnQjtBQUFBLFVBQ2hCLFNBQVM7QUFBQSxVQUNULE1BQU07QUFBQSxZQUNGLE1BQU07QUFBQSxVQUNWO0FBQUEsUUFDSjtBQUFBLFFBQ0EsU0FBUztBQUFBLFVBQ0wsZ0JBQWdCO0FBQUEsVUFDaEIsU0FBUztBQUFBLFVBQ1QsTUFBTTtBQUFBLFlBQ0YsTUFBTTtBQUFBLFlBQ04sZUFBZTtBQUFBLGNBQ1g7QUFBQSxjQUNBO0FBQUEsY0FDQTtBQUFBLGNBQ0E7QUFBQSxjQUNBO0FBQUEsWUFDSjtBQUFBLFVBQ0o7QUFBQSxRQUNKO0FBQUEsUUFDQSxhQUFhO0FBQUEsVUFDVCxnQkFBZ0I7QUFBQSxVQUNoQixTQUFTO0FBQUEsVUFDVCxNQUFNO0FBQUEsWUFDRixNQUFNO0FBQUEsWUFDTixlQUFlO0FBQUEsY0FDWDtBQUFBLGNBQ0E7QUFBQSxjQUNBO0FBQUEsY0FDQTtBQUFBLGNBQ0E7QUFBQSxZQUNKO0FBQUEsVUFDSjtBQUFBLFFBQ0o7QUFBQSxRQUNBLGdDQUFnQztBQUFBLFVBQzVCLGdCQUFnQjtBQUFBLFVBQ2hCLFNBQVM7QUFBQSxVQUNULE1BQU07QUFBQSxZQUNGLE1BQU07QUFBQSxVQUNWO0FBQUEsUUFDSjtBQUFBLFFBQ0EsV0FBVztBQUFBLFVBQ1AsZ0JBQWdCO0FBQUEsVUFDaEIsU0FBUztBQUFBLFVBQ1QsTUFBTTtBQUFBLFlBQ0YsTUFBTTtBQUFBLFVBQ1Y7QUFBQSxRQUNKO0FBQUEsTUFDSjtBQUFBLElBQ0o7QUFBQSxFQUNKO0FBQ0EsTUFBTSx3Q0FBd0M7QUFBQSxJQUMxQyxnQkFBZ0I7QUFBQSxJQUNoQixNQUFNO0FBQUEsTUFDRixNQUFNO0FBQUEsTUFDTixXQUFXO0FBQUEsTUFDWCxpQkFBaUI7QUFBQSxRQUNiLFdBQVc7QUFBQSxVQUNQLGdCQUFnQjtBQUFBLFVBQ2hCLFNBQVM7QUFBQSxVQUNULE1BQU07QUFBQSxZQUNGLE1BQU07QUFBQSxVQUNWO0FBQUEsUUFDSjtBQUFBLE1BQ0o7QUFBQSxJQUNKO0FBQUEsRUFDSjtBQUNBLE1BQU0sNEJBQTRCO0FBQUEsSUFDOUIsZ0JBQWdCO0FBQUEsSUFDaEIsTUFBTTtBQUFBLE1BQ0YsTUFBTTtBQUFBLE1BQ04sV0FBVztBQUFBLE1BQ1gsaUJBQWlCO0FBQUEsUUFDYixhQUFhO0FBQUEsVUFDVCxnQkFBZ0I7QUFBQSxVQUNoQixTQUFTO0FBQUEsVUFDVCxNQUFNO0FBQUEsWUFDRixNQUFNO0FBQUEsVUFDVjtBQUFBLFFBQ0o7QUFBQSxRQUNBLFdBQVc7QUFBQSxVQUNQLGdCQUFnQjtBQUFBLFVBQ2hCLFNBQVM7QUFBQSxVQUNULE1BQU07QUFBQSxZQUNGLE1BQU07QUFBQSxVQUNWO0FBQUEsUUFDSjtBQUFBLFFBQ0EsU0FBUztBQUFBLFVBQ0wsZ0JBQWdCO0FBQUEsVUFDaEIsU0FBUztBQUFBLFVBQ1QsTUFBTTtBQUFBLFlBQ0YsTUFBTTtBQUFBLFVBQ1Y7QUFBQSxRQUNKO0FBQUEsUUFDQSxpQkFBaUI7QUFBQSxVQUNiLGdCQUFnQjtBQUFBLFVBQ2hCLFNBQVM7QUFBQSxVQUNULE1BQU07QUFBQSxZQUNGLE1BQU07QUFBQSxVQUNWO0FBQUEsUUFDSjtBQUFBLFFBQ0EsV0FBVztBQUFBLFVBQ1AsZ0JBQWdCO0FBQUEsVUFDaEIsU0FBUztBQUFBLFVBQ1QsTUFBTTtBQUFBLFlBQ0YsTUFBTTtBQUFBLFVBQ1Y7QUFBQSxRQUNKO0FBQUEsTUFDSjtBQUFBLElBQ0o7QUFBQSxFQUNKO0FBQ0EsTUFBTSxxQ0FBcUM7QUFBQSxJQUN2QyxnQkFBZ0I7QUFBQSxJQUNoQixNQUFNO0FBQUEsTUFDRixNQUFNO0FBQUEsTUFDTixXQUFXO0FBQUEsTUFDWCxpQkFBaUI7QUFBQSxRQUNiLFdBQVc7QUFBQSxVQUNQLGdCQUFnQjtBQUFBLFVBQ2hCLFNBQVM7QUFBQSxVQUNULE1BQU07QUFBQSxZQUNGLE1BQU07QUFBQSxVQUNWO0FBQUEsUUFDSjtBQUFBLE1BQ0o7QUFBQSxJQUNKO0FBQUEsRUFDSjtBQUNBLE1BQU0sNEJBQTRCO0FBQUEsSUFDOUIsZ0JBQWdCO0FBQUEsSUFDaEIsTUFBTTtBQUFBLE1BQ0YsTUFBTTtBQUFBLE1BQ04sV0FBVztBQUFBLE1BQ1gsaUJBQWlCO0FBQUEsUUFDYixpQkFBaUI7QUFBQSxVQUNiLGdCQUFnQjtBQUFBLFVBQ2hCLFNBQVM7QUFBQSxVQUNULE1BQU07QUFBQSxZQUNGLE1BQU07QUFBQSxVQUNWO0FBQUEsUUFDSjtBQUFBLFFBQ0EsV0FBVztBQUFBLFVBQ1AsZ0JBQWdCO0FBQUEsVUFDaEIsU0FBUztBQUFBLFVBQ1QsTUFBTTtBQUFBLFlBQ0YsTUFBTTtBQUFBLFVBQ1Y7QUFBQSxRQUNKO0FBQUEsUUFDQSxTQUFTO0FBQUEsVUFDTCxnQkFBZ0I7QUFBQSxVQUNoQixTQUFTO0FBQUEsVUFDVCxNQUFNO0FBQUEsWUFDRixNQUFNO0FBQUEsVUFDVjtBQUFBLFFBQ0o7QUFBQSxRQUNBLE1BQU07QUFBQSxVQUNGLGdCQUFnQjtBQUFBLFVBQ2hCLFNBQVM7QUFBQSxVQUNULE1BQU07QUFBQSxZQUNGLE1BQU07QUFBQSxVQUNWO0FBQUEsUUFDSjtBQUFBLFFBQ0EsV0FBVztBQUFBLFVBQ1AsZ0JBQWdCO0FBQUEsVUFDaEIsU0FBUztBQUFBLFVBQ1QsTUFBTTtBQUFBLFlBQ0YsTUFBTTtBQUFBLFVBQ1Y7QUFBQSxRQUNKO0FBQUEsTUFDSjtBQUFBLElBQ0o7QUFBQSxFQUNKO0FBQ0EsTUFBTSxxQ0FBcUM7QUFBQSxJQUN2QyxnQkFBZ0I7QUFBQSxJQUNoQixNQUFNO0FBQUEsTUFDRixNQUFNO0FBQUEsTUFDTixXQUFXO0FBQUEsTUFDWCxpQkFBaUI7QUFBQSxRQUNiLFdBQVc7QUFBQSxVQUNQLGdCQUFnQjtBQUFBLFVBQ2hCLFNBQVM7QUFBQSxVQUNULE1BQU07QUFBQSxZQUNGLE1BQU07QUFBQSxVQUNWO0FBQUEsUUFDSjtBQUFBLE1BQ0o7QUFBQSxJQUNKO0FBQUEsRUFDSjtBQUNBLE1BQU0seUJBQXlCO0FBQUEsSUFDM0IsZ0JBQWdCO0FBQUEsSUFDaEIsTUFBTTtBQUFBLE1BQ0YsTUFBTTtBQUFBLE1BQ04sV0FBVztBQUFBLE1BQ1gsaUJBQWlCO0FBQUEsUUFDYixNQUFNO0FBQUEsVUFDRixnQkFBZ0I7QUFBQSxVQUNoQixTQUFTO0FBQUEsVUFDVCxNQUFNO0FBQUEsWUFDRixNQUFNO0FBQUEsVUFDVjtBQUFBLFFBQ0o7QUFBQSxRQUNBLGNBQWM7QUFBQSxVQUNWLGdCQUFnQjtBQUFBLFVBQ2hCLFNBQVM7QUFBQSxVQUNULE1BQU07QUFBQSxZQUNGLE1BQU07QUFBQSxVQUNWO0FBQUEsUUFDSjtBQUFBLFFBQ0EsaUJBQWlCO0FBQUEsVUFDYixnQkFBZ0I7QUFBQSxVQUNoQixTQUFTO0FBQUEsVUFDVCxNQUFNO0FBQUEsWUFDRixNQUFNO0FBQUEsVUFDVjtBQUFBLFFBQ0o7QUFBQSxRQUNBLFdBQVc7QUFBQSxVQUNQLGdCQUFnQjtBQUFBLFVBQ2hCLFNBQVM7QUFBQSxVQUNULE1BQU07QUFBQSxZQUNGLE1BQU07QUFBQSxVQUNWO0FBQUEsUUFDSjtBQUFBLFFBQ0EsU0FBUztBQUFBLFVBQ0wsZ0JBQWdCO0FBQUEsVUFDaEIsU0FBUztBQUFBLFVBQ1QsTUFBTTtBQUFBLFlBQ0YsTUFBTTtBQUFBLFVBQ1Y7QUFBQSxRQUNKO0FBQUEsUUFDQSxNQUFNO0FBQUEsVUFDRixnQkFBZ0I7QUFBQSxVQUNoQixTQUFTO0FBQUEsVUFDVCxNQUFNO0FBQUEsWUFDRixNQUFNO0FBQUEsVUFDVjtBQUFBLFFBQ0o7QUFBQSxRQUNBLFdBQVc7QUFBQSxVQUNQLGdCQUFnQjtBQUFBLFVBQ2hCLFNBQVM7QUFBQSxVQUNULE1BQU07QUFBQSxZQUNGLE1BQU07QUFBQSxVQUNWO0FBQUEsUUFDSjtBQUFBLE1BQ0o7QUFBQSxJQUNKO0FBQUEsRUFDSjtBQUNBLE1BQU0sa0NBQWtDO0FBQUEsSUFDcEMsZ0JBQWdCO0FBQUEsSUFDaEIsTUFBTTtBQUFBLE1BQ0YsTUFBTTtBQUFBLE1BQ04sV0FBVztBQUFBLE1BQ1gsaUJBQWlCO0FBQUEsUUFDYixXQUFXO0FBQUEsVUFDUCxnQkFBZ0I7QUFBQSxVQUNoQixTQUFTO0FBQUEsVUFDVCxNQUFNO0FBQUEsWUFDRixNQUFNO0FBQUEsVUFDVjtBQUFBLFFBQ0o7QUFBQSxNQUNKO0FBQUEsSUFDSjtBQUFBLEVBQ0o7QUFDQSxNQUFNLGdDQUFnQztBQUFBLElBQ2xDLGdCQUFnQjtBQUFBLElBQ2hCLE1BQU07QUFBQSxNQUNGLE1BQU07QUFBQSxNQUNOLFdBQVc7QUFBQSxNQUNYLGlCQUFpQjtBQUFBLFFBQ2IsVUFBVTtBQUFBLFVBQ04sZ0JBQWdCO0FBQUEsVUFDaEIsd0JBQXdCO0FBQUEsVUFDeEIsU0FBUztBQUFBLFVBQ1QsTUFBTTtBQUFBLFlBQ0YsTUFBTTtBQUFBLFlBQ04sT0FBTyxFQUFFLE1BQU0sRUFBRSxNQUFNLFNBQVMsRUFBRTtBQUFBLFVBQ3RDO0FBQUEsUUFDSjtBQUFBLFFBQ0EsTUFBTTtBQUFBLFVBQ0YsZ0JBQWdCO0FBQUEsVUFDaEIsU0FBUztBQUFBLFVBQ1QsTUFBTTtBQUFBLFlBQ0YsTUFBTTtBQUFBLFVBQ1Y7QUFBQSxRQUNKO0FBQUEsUUFDQSxjQUFjO0FBQUEsVUFDVixnQkFBZ0I7QUFBQSxVQUNoQixTQUFTO0FBQUEsVUFDVCxNQUFNO0FBQUEsWUFDRixNQUFNO0FBQUEsVUFDVjtBQUFBLFFBQ0o7QUFBQSxRQUNBLGVBQWU7QUFBQSxVQUNYLGdCQUFnQjtBQUFBLFVBQ2hCLFNBQVM7QUFBQSxVQUNULE1BQU07QUFBQSxZQUNGLE1BQU07QUFBQSxZQUNOLGVBQWUsQ0FBQyxZQUFZLE9BQU87QUFBQSxVQUN2QztBQUFBLFFBQ0o7QUFBQSxRQUNBLFlBQVk7QUFBQSxVQUNSLGdCQUFnQjtBQUFBLFVBQ2hCLFNBQVM7QUFBQSxVQUNULE1BQU07QUFBQSxZQUNGLE1BQU07QUFBQSxZQUNOLGVBQWU7QUFBQSxjQUNYO0FBQUEsY0FDQTtBQUFBLGNBQ0E7QUFBQSxjQUNBO0FBQUEsY0FDQTtBQUFBLFlBQ0o7QUFBQSxVQUNKO0FBQUEsUUFDSjtBQUFBLFFBQ0EsYUFBYTtBQUFBLFVBQ1QsZ0JBQWdCO0FBQUEsVUFDaEIsU0FBUztBQUFBLFVBQ1QsTUFBTTtBQUFBLFlBQ0YsTUFBTTtBQUFBLFlBQ04sZUFBZSxDQUFDLFVBQVUsVUFBVTtBQUFBLFVBQ3hDO0FBQUEsUUFDSjtBQUFBLFFBQ0EsaUJBQWlCO0FBQUEsVUFDYixnQkFBZ0I7QUFBQSxVQUNoQixTQUFTO0FBQUEsVUFDVCxNQUFNO0FBQUEsWUFDRixNQUFNO0FBQUEsVUFDVjtBQUFBLFFBQ0o7QUFBQSxRQUNBLFdBQVc7QUFBQSxVQUNQLGdCQUFnQjtBQUFBLFVBQ2hCLFNBQVM7QUFBQSxVQUNULE1BQU07QUFBQSxZQUNGLE1BQU07QUFBQSxVQUNWO0FBQUEsUUFDSjtBQUFBLFFBQ0EsU0FBUztBQUFBLFVBQ0wsZ0JBQWdCO0FBQUEsVUFDaEIsU0FBUztBQUFBLFVBQ1QsTUFBTTtBQUFBLFlBQ0YsTUFBTTtBQUFBLFVBQ1Y7QUFBQSxRQUNKO0FBQUEsUUFDQSxNQUFNO0FBQUEsVUFDRixnQkFBZ0I7QUFBQSxVQUNoQixTQUFTO0FBQUEsVUFDVCxNQUFNO0FBQUEsWUFDRixNQUFNO0FBQUEsVUFDVjtBQUFBLFFBQ0o7QUFBQSxRQUNBLGtCQUFrQjtBQUFBLFVBQ2QsZ0JBQWdCO0FBQUEsVUFDaEIsU0FBUztBQUFBLFVBQ1QsTUFBTTtBQUFBLFlBQ0YsTUFBTTtBQUFBLFlBQ04sZUFBZSxDQUFDLGFBQWEsTUFBTTtBQUFBLFVBQ3ZDO0FBQUEsUUFDSjtBQUFBLFFBQ0EsdUJBQXVCO0FBQUEsVUFDbkIsZ0JBQWdCO0FBQUEsVUFDaEIsU0FBUztBQUFBLFVBQ1QsTUFBTTtBQUFBLFlBQ0YsTUFBTTtBQUFBLFVBQ1Y7QUFBQSxRQUNKO0FBQUEsUUFDQSxjQUFjO0FBQUEsVUFDVixnQkFBZ0I7QUFBQSxVQUNoQixTQUFTO0FBQUEsVUFDVCxNQUFNO0FBQUEsWUFDRixNQUFNO0FBQUEsVUFDVjtBQUFBLFFBQ0o7QUFBQSxRQUNBLHdCQUF3QjtBQUFBLFVBQ3BCLGdCQUFnQjtBQUFBLFVBQ2hCLFNBQVM7QUFBQSxVQUNULE1BQU07QUFBQSxZQUNGLE1BQU07QUFBQSxVQUNWO0FBQUEsUUFDSjtBQUFBLFFBQ0EsNkJBQTZCO0FBQUEsVUFDekIsZ0JBQWdCO0FBQUEsVUFDaEIsU0FBUztBQUFBLFVBQ1QsTUFBTTtBQUFBLFlBQ0YsTUFBTTtBQUFBLFVBQ1Y7QUFBQSxRQUNKO0FBQUEsUUFDQSx5Q0FBeUM7QUFBQSxVQUNyQyxnQkFBZ0I7QUFBQSxVQUNoQixTQUFTO0FBQUEsVUFDVCxNQUFNO0FBQUEsWUFDRixNQUFNO0FBQUEsVUFDVjtBQUFBLFFBQ0o7QUFBQSxRQUNBLFdBQVc7QUFBQSxVQUNQLGdCQUFnQjtBQUFBLFVBQ2hCLFNBQVM7QUFBQSxVQUNULE1BQU07QUFBQSxZQUNGLE1BQU07QUFBQSxVQUNWO0FBQUEsUUFDSjtBQUFBLE1BQ0o7QUFBQSxJQUNKO0FBQUEsRUFDSjtBQUNBLE1BQU0seUNBQXlDO0FBQUEsSUFDM0MsZ0JBQWdCO0FBQUEsSUFDaEIsTUFBTTtBQUFBLE1BQ0YsTUFBTTtBQUFBLE1BQ04sV0FBVztBQUFBLE1BQ1gsaUJBQWlCO0FBQUEsUUFDYixXQUFXO0FBQUEsVUFDUCxnQkFBZ0I7QUFBQSxVQUNoQixTQUFTO0FBQUEsVUFDVCxNQUFNO0FBQUEsWUFDRixNQUFNO0FBQUEsVUFDVjtBQUFBLFFBQ0o7QUFBQSxNQUNKO0FBQUEsSUFDSjtBQUFBLEVBQ0o7QUFDQSxNQUFNLHlCQUF5QjtBQUFBLElBQzNCLGdCQUFnQjtBQUFBLElBQ2hCLE1BQU07QUFBQSxNQUNGLE1BQU07QUFBQSxNQUNOLFdBQVc7QUFBQSxNQUNYLGlCQUFpQjtBQUFBLFFBQ2IsaUJBQWlCO0FBQUEsVUFDYixnQkFBZ0I7QUFBQSxVQUNoQixTQUFTO0FBQUEsVUFDVCxNQUFNO0FBQUEsWUFDRixNQUFNO0FBQUEsVUFDVjtBQUFBLFFBQ0o7QUFBQSxRQUNBLFdBQVc7QUFBQSxVQUNQLGdCQUFnQjtBQUFBLFVBQ2hCLFNBQVM7QUFBQSxVQUNULE1BQU07QUFBQSxZQUNGLE1BQU07QUFBQSxVQUNWO0FBQUEsUUFDSjtBQUFBLFFBQ0EsU0FBUztBQUFBLFVBQ0wsZ0JBQWdCO0FBQUEsVUFDaEIsU0FBUztBQUFBLFVBQ1QsTUFBTTtBQUFBLFlBQ0YsTUFBTTtBQUFBLFVBQ1Y7QUFBQSxRQUNKO0FBQUEsUUFDQSxNQUFNO0FBQUEsVUFDRixnQkFBZ0I7QUFBQSxVQUNoQixTQUFTO0FBQUEsVUFDVCxNQUFNO0FBQUEsWUFDRixNQUFNO0FBQUEsVUFDVjtBQUFBLFFBQ0o7QUFBQSxRQUNBLFdBQVc7QUFBQSxVQUNQLGdCQUFnQjtBQUFBLFVBQ2hCLFNBQVM7QUFBQSxVQUNULE1BQU07QUFBQSxZQUNGLE1BQU07QUFBQSxVQUNWO0FBQUEsUUFDSjtBQUFBLE1BQ0o7QUFBQSxJQUNKO0FBQUEsRUFDSjtBQUNBLE1BQU0sa0NBQWtDO0FBQUEsSUFDcEMsZ0JBQWdCO0FBQUEsSUFDaEIsTUFBTTtBQUFBLE1BQ0YsTUFBTTtBQUFBLE1BQ04sV0FBVztBQUFBLE1BQ1gsaUJBQWlCO0FBQUEsUUFDYixXQUFXO0FBQUEsVUFDUCxnQkFBZ0I7QUFBQSxVQUNoQixTQUFTO0FBQUEsVUFDVCxNQUFNO0FBQUEsWUFDRixNQUFNO0FBQUEsVUFDVjtBQUFBLFFBQ0o7QUFBQSxNQUNKO0FBQUEsSUFDSjtBQUFBLEVBQ0o7QUFDQSxNQUFNLDhCQUE4QjtBQUFBLElBQ2hDLGdCQUFnQjtBQUFBLElBQ2hCLE1BQU07QUFBQSxNQUNGLE1BQU07QUFBQSxNQUNOLFdBQVc7QUFBQSxNQUNYLGlCQUFpQjtBQUFBLFFBQ2IsTUFBTTtBQUFBLFVBQ0YsZ0JBQWdCO0FBQUEsVUFDaEIsU0FBUztBQUFBLFVBQ1QsTUFBTTtBQUFBLFlBQ0YsTUFBTTtBQUFBLFVBQ1Y7QUFBQSxRQUNKO0FBQUEsUUFDQSxjQUFjO0FBQUEsVUFDVixnQkFBZ0I7QUFBQSxVQUNoQixTQUFTO0FBQUEsVUFDVCxNQUFNO0FBQUEsWUFDRixNQUFNO0FBQUEsVUFDVjtBQUFBLFFBQ0o7QUFBQSxRQUNBLGlCQUFpQjtBQUFBLFVBQ2IsZ0JBQWdCO0FBQUEsVUFDaEIsU0FBUztBQUFBLFVBQ1QsTUFBTTtBQUFBLFlBQ0YsTUFBTTtBQUFBLFVBQ1Y7QUFBQSxRQUNKO0FBQUEsUUFDQSxXQUFXO0FBQUEsVUFDUCxnQkFBZ0I7QUFBQSxVQUNoQixTQUFTO0FBQUEsVUFDVCxNQUFNO0FBQUEsWUFDRixNQUFNO0FBQUEsVUFDVjtBQUFBLFFBQ0o7QUFBQSxRQUNBLFNBQVM7QUFBQSxVQUNMLGdCQUFnQjtBQUFBLFVBQ2hCLFNBQVM7QUFBQSxVQUNULE1BQU07QUFBQSxZQUNGLE1BQU07QUFBQSxVQUNWO0FBQUEsUUFDSjtBQUFBLFFBQ0EsTUFBTTtBQUFBLFVBQ0YsZ0JBQWdCO0FBQUEsVUFDaEIsU0FBUztBQUFBLFVBQ1QsTUFBTTtBQUFBLFlBQ0YsTUFBTTtBQUFBLFVBQ1Y7QUFBQSxRQUNKO0FBQUEsUUFDQSxXQUFXO0FBQUEsVUFDUCxnQkFBZ0I7QUFBQSxVQUNoQixTQUFTO0FBQUEsVUFDVCxNQUFNO0FBQUEsWUFDRixNQUFNO0FBQUEsVUFDVjtBQUFBLFFBQ0o7QUFBQSxNQUNKO0FBQUEsSUFDSjtBQUFBLEVBQ0o7QUFDQSxNQUFNLHVDQUF1QztBQUFBLElBQ3pDLGdCQUFnQjtBQUFBLElBQ2hCLE1BQU07QUFBQSxNQUNGLE1BQU07QUFBQSxNQUNOLFdBQVc7QUFBQSxNQUNYLGlCQUFpQjtBQUFBLFFBQ2IsV0FBVztBQUFBLFVBQ1AsZ0JBQWdCO0FBQUEsVUFDaEIsU0FBUztBQUFBLFVBQ1QsTUFBTTtBQUFBLFlBQ0YsTUFBTTtBQUFBLFVBQ1Y7QUFBQSxRQUNKO0FBQUEsTUFDSjtBQUFBLElBQ0o7QUFBQSxFQUNKO0FBQ0EsTUFBTSxrQ0FBa0M7QUFBQSxJQUNwQyxnQkFBZ0I7QUFBQSxJQUNoQixNQUFNO0FBQUEsTUFDRixNQUFNO0FBQUEsTUFDTixXQUFXO0FBQUEsTUFDWCxpQkFBaUI7QUFBQSxRQUNiLGtCQUFrQjtBQUFBLFVBQ2QsZ0JBQWdCO0FBQUEsVUFDaEIsU0FBUztBQUFBLFVBQ1QsTUFBTTtBQUFBLFlBQ0YsTUFBTTtBQUFBLFlBQ04sZUFBZSxDQUFDLGFBQWEsTUFBTTtBQUFBLFVBQ3ZDO0FBQUEsUUFDSjtBQUFBLFFBQ0EsTUFBTTtBQUFBLFVBQ0YsZ0JBQWdCO0FBQUEsVUFDaEIsU0FBUztBQUFBLFVBQ1QsTUFBTTtBQUFBLFlBQ0YsTUFBTTtBQUFBLFVBQ1Y7QUFBQSxRQUNKO0FBQUEsUUFDQSxjQUFjO0FBQUEsVUFDVixnQkFBZ0I7QUFBQSxVQUNoQixTQUFTO0FBQUEsVUFDVCxNQUFNO0FBQUEsWUFDRixNQUFNO0FBQUEsVUFDVjtBQUFBLFFBQ0o7QUFBQSxRQUNBLGlCQUFpQjtBQUFBLFVBQ2IsZ0JBQWdCO0FBQUEsVUFDaEIsU0FBUztBQUFBLFVBQ1QsTUFBTTtBQUFBLFlBQ0YsTUFBTTtBQUFBLFVBQ1Y7QUFBQSxRQUNKO0FBQUEsUUFDQSxXQUFXO0FBQUEsVUFDUCxnQkFBZ0I7QUFBQSxVQUNoQixTQUFTO0FBQUEsVUFDVCxNQUFNO0FBQUEsWUFDRixNQUFNO0FBQUEsVUFDVjtBQUFBLFFBQ0o7QUFBQSxRQUNBLFNBQVM7QUFBQSxVQUNMLGdCQUFnQjtBQUFBLFVBQ2hCLFNBQVM7QUFBQSxVQUNULE1BQU07QUFBQSxZQUNGLE1BQU07QUFBQSxVQUNWO0FBQUEsUUFDSjtBQUFBLFFBQ0EsTUFBTTtBQUFBLFVBQ0YsZ0JBQWdCO0FBQUEsVUFDaEIsU0FBUztBQUFBLFVBQ1QsTUFBTTtBQUFBLFlBQ0YsTUFBTTtBQUFBLFVBQ1Y7QUFBQSxRQUNKO0FBQUEsUUFDQSxXQUFXO0FBQUEsVUFDUCxnQkFBZ0I7QUFBQSxVQUNoQixTQUFTO0FBQUEsVUFDVCxNQUFNO0FBQUEsWUFDRixNQUFNO0FBQUEsVUFDVjtBQUFBLFFBQ0o7QUFBQSxNQUNKO0FBQUEsSUFDSjtBQUFBLEVBQ0o7QUFDQSxNQUFNLDJDQUEyQztBQUFBLElBQzdDLGdCQUFnQjtBQUFBLElBQ2hCLE1BQU07QUFBQSxNQUNGLE1BQU07QUFBQSxNQUNOLFdBQVc7QUFBQSxNQUNYLGlCQUFpQjtBQUFBLFFBQ2IsV0FBVztBQUFBLFVBQ1AsZ0JBQWdCO0FBQUEsVUFDaEIsU0FBUztBQUFBLFVBQ1QsTUFBTTtBQUFBLFlBQ0YsTUFBTTtBQUFBLFVBQ1Y7QUFBQSxRQUNKO0FBQUEsTUFDSjtBQUFBLElBQ0o7QUFBQSxFQUNKO0FBQ0EsTUFBTSxrQ0FBa0M7QUFBQSxJQUNwQyxnQkFBZ0I7QUFBQSxJQUNoQixNQUFNO0FBQUEsTUFDRixNQUFNO0FBQUEsTUFDTixXQUFXO0FBQUEsTUFDWCxpQkFBaUI7QUFBQSxRQUNiLE1BQU07QUFBQSxVQUNGLGdCQUFnQjtBQUFBLFVBQ2hCLFNBQVM7QUFBQSxVQUNULE1BQU07QUFBQSxZQUNGLE1BQU07QUFBQSxVQUNWO0FBQUEsUUFDSjtBQUFBLFFBQ0EsY0FBYztBQUFBLFVBQ1YsZ0JBQWdCO0FBQUEsVUFDaEIsU0FBUztBQUFBLFVBQ1QsTUFBTTtBQUFBLFlBQ0YsTUFBTTtBQUFBLFVBQ1Y7QUFBQSxRQUNKO0FBQUEsUUFDQSxpQkFBaUI7QUFBQSxVQUNiLGdCQUFnQjtBQUFBLFVBQ2hCLFNBQVM7QUFBQSxVQUNULE1BQU07QUFBQSxZQUNGLE1BQU07QUFBQSxVQUNWO0FBQUEsUUFDSjtBQUFBLFFBQ0EsV0FBVztBQUFBLFVBQ1AsZ0JBQWdCO0FBQUEsVUFDaEIsU0FBUztBQUFBLFVBQ1QsTUFBTTtBQUFBLFlBQ0YsTUFBTTtBQUFBLFVBQ1Y7QUFBQSxRQUNKO0FBQUEsUUFDQSxTQUFTO0FBQUEsVUFDTCxnQkFBZ0I7QUFBQSxVQUNoQixTQUFTO0FBQUEsVUFDVCxNQUFNO0FBQUEsWUFDRixNQUFNO0FBQUEsVUFDVjtBQUFBLFFBQ0o7QUFBQSxRQUNBLE1BQU07QUFBQSxVQUNGLGdCQUFnQjtBQUFBLFVBQ2hCLFNBQVM7QUFBQSxVQUNULE1BQU07QUFBQSxZQUNGLE1BQU07QUFBQSxVQUNWO0FBQUEsUUFDSjtBQUFBLFFBQ0EsV0FBVztBQUFBLFVBQ1AsZ0JBQWdCO0FBQUEsVUFDaEIsU0FBUztBQUFBLFVBQ1QsTUFBTTtBQUFBLFlBQ0YsTUFBTTtBQUFBLFVBQ1Y7QUFBQSxRQUNKO0FBQUEsTUFDSjtBQUFBLElBQ0o7QUFBQSxFQUNKO0FBQ0EsTUFBTSwyQ0FBMkM7QUFBQSxJQUM3QyxnQkFBZ0I7QUFBQSxJQUNoQixNQUFNO0FBQUEsTUFDRixNQUFNO0FBQUEsTUFDTixXQUFXO0FBQUEsTUFDWCxpQkFBaUI7QUFBQSxRQUNiLFdBQVc7QUFBQSxVQUNQLGdCQUFnQjtBQUFBLFVBQ2hCLFNBQVM7QUFBQSxVQUNULE1BQU07QUFBQSxZQUNGLE1BQU07QUFBQSxVQUNWO0FBQUEsUUFDSjtBQUFBLE1BQ0o7QUFBQSxJQUNKO0FBQUEsRUFDSjtBQUNBLE1BQU0sMEJBQTBCO0FBQUEsSUFDNUIsZ0JBQWdCO0FBQUEsSUFDaEIsTUFBTTtBQUFBLE1BQ0YsTUFBTTtBQUFBLE1BQ04sV0FBVztBQUFBLE1BQ1gsaUJBQWlCO0FBQUEsUUFDYixpQkFBaUI7QUFBQSxVQUNiLGdCQUFnQjtBQUFBLFVBQ2hCLFNBQVM7QUFBQSxVQUNULE1BQU07QUFBQSxZQUNGLE1BQU07QUFBQSxVQUNWO0FBQUEsUUFDSjtBQUFBLFFBQ0EsV0FBVztBQUFBLFVBQ1AsZ0JBQWdCO0FBQUEsVUFDaEIsU0FBUztBQUFBLFVBQ1QsTUFBTTtBQUFBLFlBQ0YsTUFBTTtBQUFBLFVBQ1Y7QUFBQSxRQUNKO0FBQUEsUUFDQSxTQUFTO0FBQUEsVUFDTCxnQkFBZ0I7QUFBQSxVQUNoQixTQUFTO0FBQUEsVUFDVCxNQUFNO0FBQUEsWUFDRixNQUFNO0FBQUEsVUFDVjtBQUFBLFFBQ0o7QUFBQSxRQUNBLE1BQU07QUFBQSxVQUNGLGdCQUFnQjtBQUFBLFVBQ2hCLFNBQVM7QUFBQSxVQUNULE1BQU07QUFBQSxZQUNGLE1BQU07QUFBQSxVQUNWO0FBQUEsUUFDSjtBQUFBLFFBQ0EsV0FBVztBQUFBLFVBQ1AsZ0JBQWdCO0FBQUEsVUFDaEIsU0FBUztBQUFBLFVBQ1QsTUFBTTtBQUFBLFlBQ0YsTUFBTTtBQUFBLFVBQ1Y7QUFBQSxRQUNKO0FBQUEsTUFDSjtBQUFBLElBQ0o7QUFBQSxFQUNKO0FBQ0EsTUFBTSxtQ0FBbUM7QUFBQSxJQUNyQyxnQkFBZ0I7QUFBQSxJQUNoQixNQUFNO0FBQUEsTUFDRixNQUFNO0FBQUEsTUFDTixXQUFXO0FBQUEsTUFDWCxpQkFBaUI7QUFBQSxRQUNiLFdBQVc7QUFBQSxVQUNQLGdCQUFnQjtBQUFBLFVBQ2hCLFNBQVM7QUFBQSxVQUNULE1BQU07QUFBQSxZQUNGLE1BQU07QUFBQSxVQUNWO0FBQUEsUUFDSjtBQUFBLE1BQ0o7QUFBQSxJQUNKO0FBQUEsRUFDSjtBQUNBLE1BQU0seUJBQXlCO0FBQUEsSUFDM0IsZ0JBQWdCO0FBQUEsSUFDaEIsTUFBTTtBQUFBLE1BQ0YsTUFBTTtBQUFBLE1BQ04sV0FBVztBQUFBLE1BQ1gsaUJBQWlCO0FBQUEsUUFDYixpQkFBaUI7QUFBQSxVQUNiLGdCQUFnQjtBQUFBLFVBQ2hCLFNBQVM7QUFBQSxVQUNULE1BQU07QUFBQSxZQUNGLE1BQU07QUFBQSxVQUNWO0FBQUEsUUFDSjtBQUFBLFFBQ0EsV0FBVztBQUFBLFVBQ1AsZ0JBQWdCO0FBQUEsVUFDaEIsU0FBUztBQUFBLFVBQ1QsTUFBTTtBQUFBLFlBQ0YsTUFBTTtBQUFBLFVBQ1Y7QUFBQSxRQUNKO0FBQUEsUUFDQSxTQUFTO0FBQUEsVUFDTCxnQkFBZ0I7QUFBQSxVQUNoQixTQUFTO0FBQUEsVUFDVCxNQUFNO0FBQUEsWUFDRixNQUFNO0FBQUEsVUFDVjtBQUFBLFFBQ0o7QUFBQSxRQUNBLE1BQU07QUFBQSxVQUNGLGdCQUFnQjtBQUFBLFVBQ2hCLFNBQVM7QUFBQSxVQUNULE1BQU07QUFBQSxZQUNGLE1BQU07QUFBQSxVQUNWO0FBQUEsUUFDSjtBQUFBLFFBQ0EsV0FBVztBQUFBLFVBQ1AsZ0JBQWdCO0FBQUEsVUFDaEIsU0FBUztBQUFBLFVBQ1QsTUFBTTtBQUFBLFlBQ0YsTUFBTTtBQUFBLFVBQ1Y7QUFBQSxRQUNKO0FBQUEsTUFDSjtBQUFBLElBQ0o7QUFBQSxFQUNKO0FBQ0EsTUFBTSxrQ0FBa0M7QUFBQSxJQUNwQyxnQkFBZ0I7QUFBQSxJQUNoQixNQUFNO0FBQUEsTUFDRixNQUFNO0FBQUEsTUFDTixXQUFXO0FBQUEsTUFDWCxpQkFBaUI7QUFBQSxRQUNiLFdBQVc7QUFBQSxVQUNQLGdCQUFnQjtBQUFBLFVBQ2hCLFNBQVM7QUFBQSxVQUNULE1BQU07QUFBQSxZQUNGLE1BQU07QUFBQSxVQUNWO0FBQUEsUUFDSjtBQUFBLE1BQ0o7QUFBQSxJQUNKO0FBQUEsRUFDSjtBQUNBLE1BQU0sOEJBQThCO0FBQUEsSUFDaEMsZ0JBQWdCO0FBQUEsSUFDaEIsTUFBTTtBQUFBLE1BQ0YsTUFBTTtBQUFBLE1BQ04sV0FBVztBQUFBLE1BQ1gsaUJBQWlCO0FBQUEsUUFDYixhQUFhO0FBQUEsVUFDVCxnQkFBZ0I7QUFBQSxVQUNoQixTQUFTO0FBQUEsVUFDVCxNQUFNO0FBQUEsWUFDRixNQUFNO0FBQUEsVUFDVjtBQUFBLFFBQ0o7QUFBQSxRQUNBLFdBQVc7QUFBQSxVQUNQLGdCQUFnQjtBQUFBLFVBQ2hCLFNBQVM7QUFBQSxVQUNULE1BQU07QUFBQSxZQUNGLE1BQU07QUFBQSxVQUNWO0FBQUEsUUFDSjtBQUFBLFFBQ0EsU0FBUztBQUFBLFVBQ0wsZ0JBQWdCO0FBQUEsVUFDaEIsU0FBUztBQUFBLFVBQ1QsTUFBTTtBQUFBLFlBQ0YsTUFBTTtBQUFBLFVBQ1Y7QUFBQSxRQUNKO0FBQUEsTUFDSjtBQUFBLElBQ0o7QUFBQSxFQUNKO0FBQ0EsTUFBTSx1Q0FBdUM7QUFBQSxJQUN6QyxnQkFBZ0I7QUFBQSxJQUNoQixNQUFNO0FBQUEsTUFDRixNQUFNO0FBQUEsTUFDTixXQUFXO0FBQUEsTUFDWCxpQkFBaUI7QUFBQSxRQUNiLFdBQVc7QUFBQSxVQUNQLGdCQUFnQjtBQUFBLFVBQ2hCLFNBQVM7QUFBQSxVQUNULE1BQU07QUFBQSxZQUNGLE1BQU07QUFBQSxVQUNWO0FBQUEsUUFDSjtBQUFBLE1BQ0o7QUFBQSxJQUNKO0FBQUEsRUFDSjtBQUNBLE1BQU0sOEJBQThCO0FBQUEsSUFDaEMsZ0JBQWdCO0FBQUEsSUFDaEIsTUFBTTtBQUFBLE1BQ0YsTUFBTTtBQUFBLE1BQ04sV0FBVztBQUFBLE1BQ1gsaUJBQWlCO0FBQUEsUUFDYixpQkFBaUI7QUFBQSxVQUNiLGdCQUFnQjtBQUFBLFVBQ2hCLFNBQVM7QUFBQSxVQUNULE1BQU07QUFBQSxZQUNGLE1BQU07QUFBQSxVQUNWO0FBQUEsUUFDSjtBQUFBLFFBQ0EsV0FBVztBQUFBLFVBQ1AsZ0JBQWdCO0FBQUEsVUFDaEIsU0FBUztBQUFBLFVBQ1QsTUFBTTtBQUFBLFlBQ0YsTUFBTTtBQUFBLFVBQ1Y7QUFBQSxRQUNKO0FBQUEsUUFDQSxTQUFTO0FBQUEsVUFDTCxnQkFBZ0I7QUFBQSxVQUNoQixTQUFTO0FBQUEsVUFDVCxNQUFNO0FBQUEsWUFDRixNQUFNO0FBQUEsVUFDVjtBQUFBLFFBQ0o7QUFBQSxRQUNBLE1BQU07QUFBQSxVQUNGLGdCQUFnQjtBQUFBLFVBQ2hCLFNBQVM7QUFBQSxVQUNULE1BQU07QUFBQSxZQUNGLE1BQU07QUFBQSxVQUNWO0FBQUEsUUFDSjtBQUFBLE1BQ0o7QUFBQSxJQUNKO0FBQUEsRUFDSjtBQUNBLE1BQU0sdUNBQXVDO0FBQUEsSUFDekMsZ0JBQWdCO0FBQUEsSUFDaEIsTUFBTTtBQUFBLE1BQ0YsTUFBTTtBQUFBLE1BQ04sV0FBVztBQUFBLE1BQ1gsaUJBQWlCO0FBQUEsUUFDYixXQUFXO0FBQUEsVUFDUCxnQkFBZ0I7QUFBQSxVQUNoQixTQUFTO0FBQUEsVUFDVCxNQUFNO0FBQUEsWUFDRixNQUFNO0FBQUEsVUFDVjtBQUFBLFFBQ0o7QUFBQSxNQUNKO0FBQUEsSUFDSjtBQUFBLEVBQ0o7QUFDQSxNQUFNLCtCQUErQjtBQUFBLElBQ2pDLGdCQUFnQjtBQUFBLElBQ2hCLE1BQU07QUFBQSxNQUNGLE1BQU07QUFBQSxNQUNOLFdBQVc7QUFBQSxNQUNYLGlCQUFpQjtBQUFBLFFBQ2IsTUFBTTtBQUFBLFVBQ0YsZ0JBQWdCO0FBQUEsVUFDaEIsU0FBUztBQUFBLFVBQ1QsTUFBTTtBQUFBLFlBQ0YsTUFBTTtBQUFBLFVBQ1Y7QUFBQSxRQUNKO0FBQUEsUUFDQSxjQUFjO0FBQUEsVUFDVixnQkFBZ0I7QUFBQSxVQUNoQixTQUFTO0FBQUEsVUFDVCxNQUFNO0FBQUEsWUFDRixNQUFNO0FBQUEsVUFDVjtBQUFBLFFBQ0o7QUFBQSxRQUNBLFNBQVM7QUFBQSxVQUNMLGdCQUFnQjtBQUFBLFVBQ2hCLFNBQVM7QUFBQSxVQUNULE1BQU07QUFBQSxZQUNGLE1BQU07QUFBQSxVQUNWO0FBQUEsUUFDSjtBQUFBLFFBQ0EsaUJBQWlCO0FBQUEsVUFDYixnQkFBZ0I7QUFBQSxVQUNoQixTQUFTO0FBQUEsVUFDVCxNQUFNO0FBQUEsWUFDRixNQUFNO0FBQUEsVUFDVjtBQUFBLFFBQ0o7QUFBQSxRQUNBLFdBQVc7QUFBQSxVQUNQLGdCQUFnQjtBQUFBLFVBQ2hCLFNBQVM7QUFBQSxVQUNULE1BQU07QUFBQSxZQUNGLE1BQU07QUFBQSxVQUNWO0FBQUEsUUFDSjtBQUFBLFFBQ0EsU0FBUztBQUFBLFVBQ0wsZ0JBQWdCO0FBQUEsVUFDaEIsU0FBUztBQUFBLFVBQ1QsTUFBTTtBQUFBLFlBQ0YsTUFBTTtBQUFBLFVBQ1Y7QUFBQSxRQUNKO0FBQUEsUUFDQSxNQUFNO0FBQUEsVUFDRixnQkFBZ0I7QUFBQSxVQUNoQixTQUFTO0FBQUEsVUFDVCxNQUFNO0FBQUEsWUFDRixNQUFNO0FBQUEsVUFDVjtBQUFBLFFBQ0o7QUFBQSxNQUNKO0FBQUEsSUFDSjtBQUFBLEVBQ0o7QUFDQSxNQUFNLHdDQUF3QztBQUFBLElBQzFDLGdCQUFnQjtBQUFBLElBQ2hCLE1BQU07QUFBQSxNQUNGLE1BQU07QUFBQSxNQUNOLFdBQVc7QUFBQSxNQUNYLGlCQUFpQjtBQUFBLFFBQ2IsV0FBVztBQUFBLFVBQ1AsZ0JBQWdCO0FBQUEsVUFDaEIsU0FBUztBQUFBLFVBQ1QsTUFBTTtBQUFBLFlBQ0YsTUFBTTtBQUFBLFVBQ1Y7QUFBQSxRQUNKO0FBQUEsTUFDSjtBQUFBLElBQ0o7QUFBQSxFQUNKO0FBQ0EsTUFBTSwrQkFBK0I7QUFBQSxJQUNqQyxnQkFBZ0I7QUFBQSxJQUNoQixNQUFNO0FBQUEsTUFDRixNQUFNO0FBQUEsTUFDTixXQUFXO0FBQUEsTUFDWCxpQkFBaUI7QUFBQSxRQUNiLE1BQU07QUFBQSxVQUNGLGdCQUFnQjtBQUFBLFVBQ2hCLFNBQVM7QUFBQSxVQUNULE1BQU07QUFBQSxZQUNGLE1BQU07QUFBQSxVQUNWO0FBQUEsUUFDSjtBQUFBLFFBQ0EsY0FBYztBQUFBLFVBQ1YsZ0JBQWdCO0FBQUEsVUFDaEIsU0FBUztBQUFBLFVBQ1QsTUFBTTtBQUFBLFlBQ0YsTUFBTTtBQUFBLFVBQ1Y7QUFBQSxRQUNKO0FBQUEsUUFDQSxpQkFBaUI7QUFBQSxVQUNiLGdCQUFnQjtBQUFBLFVBQ2hCLFNBQVM7QUFBQSxVQUNULE1BQU07QUFBQSxZQUNGLE1BQU07QUFBQSxVQUNWO0FBQUEsUUFDSjtBQUFBLFFBQ0EsV0FBVztBQUFBLFVBQ1AsZ0JBQWdCO0FBQUEsVUFDaEIsU0FBUztBQUFBLFVBQ1QsTUFBTTtBQUFBLFlBQ0YsTUFBTTtBQUFBLFVBQ1Y7QUFBQSxRQUNKO0FBQUEsUUFDQSxTQUFTO0FBQUEsVUFDTCxnQkFBZ0I7QUFBQSxVQUNoQixTQUFTO0FBQUEsVUFDVCxNQUFNO0FBQUEsWUFDRixNQUFNO0FBQUEsVUFDVjtBQUFBLFFBQ0o7QUFBQSxRQUNBLE1BQU07QUFBQSxVQUNGLGdCQUFnQjtBQUFBLFVBQ2hCLFNBQVM7QUFBQSxVQUNULE1BQU07QUFBQSxZQUNGLE1BQU07QUFBQSxVQUNWO0FBQUEsUUFDSjtBQUFBLE1BQ0o7QUFBQSxJQUNKO0FBQUEsRUFDSjtBQUNBLE1BQU0sd0NBQXdDO0FBQUEsSUFDMUMsZ0JBQWdCO0FBQUEsSUFDaEIsTUFBTTtBQUFBLE1BQ0YsTUFBTTtBQUFBLE1BQ04sV0FBVztBQUFBLE1BQ1gsaUJBQWlCO0FBQUEsUUFDYixXQUFXO0FBQUEsVUFDUCxnQkFBZ0I7QUFBQSxVQUNoQixTQUFTO0FBQUEsVUFDVCxNQUFNO0FBQUEsWUFDRixNQUFNO0FBQUEsVUFDVjtBQUFBLFFBQ0o7QUFBQSxNQUNKO0FBQUEsSUFDSjtBQUFBLEVBQ0o7QUFDQSxNQUFNLDZCQUE2QjtBQUFBLElBQy9CLGdCQUFnQjtBQUFBLElBQ2hCLE1BQU07QUFBQSxNQUNGLE1BQU07QUFBQSxNQUNOLFdBQVc7QUFBQSxNQUNYLGlCQUFpQjtBQUFBLFFBQ2IsTUFBTTtBQUFBLFVBQ0YsZ0JBQWdCO0FBQUEsVUFDaEIsU0FBUztBQUFBLFVBQ1QsTUFBTTtBQUFBLFlBQ0YsTUFBTTtBQUFBLFVBQ1Y7QUFBQSxRQUNKO0FBQUEsUUFDQSxjQUFjO0FBQUEsVUFDVixnQkFBZ0I7QUFBQSxVQUNoQixTQUFTO0FBQUEsVUFDVCxNQUFNO0FBQUEsWUFDRixNQUFNO0FBQUEsVUFDVjtBQUFBLFFBQ0o7QUFBQSxRQUNBLFNBQVM7QUFBQSxVQUNMLGdCQUFnQjtBQUFBLFVBQ2hCLFNBQVM7QUFBQSxVQUNULE1BQU07QUFBQSxZQUNGLE1BQU07QUFBQSxVQUNWO0FBQUEsUUFDSjtBQUFBLFFBQ0EsaUJBQWlCO0FBQUEsVUFDYixnQkFBZ0I7QUFBQSxVQUNoQixTQUFTO0FBQUEsVUFDVCxNQUFNO0FBQUEsWUFDRixNQUFNO0FBQUEsVUFDVjtBQUFBLFFBQ0o7QUFBQSxRQUNBLFdBQVc7QUFBQSxVQUNQLGdCQUFnQjtBQUFBLFVBQ2hCLFNBQVM7QUFBQSxVQUNULE1BQU07QUFBQSxZQUNGLE1BQU07QUFBQSxVQUNWO0FBQUEsUUFDSjtBQUFBLFFBQ0EsU0FBUztBQUFBLFVBQ0wsZ0JBQWdCO0FBQUEsVUFDaEIsU0FBUztBQUFBLFVBQ1QsTUFBTTtBQUFBLFlBQ0YsTUFBTTtBQUFBLFVBQ1Y7QUFBQSxRQUNKO0FBQUEsUUFDQSxNQUFNO0FBQUEsVUFDRixnQkFBZ0I7QUFBQSxVQUNoQixTQUFTO0FBQUEsVUFDVCxNQUFNO0FBQUEsWUFDRixNQUFNO0FBQUEsVUFDVjtBQUFBLFFBQ0o7QUFBQSxNQUNKO0FBQUEsSUFDSjtBQUFBLEVBQ0o7QUFDQSxNQUFNLHNDQUFzQztBQUFBLElBQ3hDLGdCQUFnQjtBQUFBLElBQ2hCLE1BQU07QUFBQSxNQUNGLE1BQU07QUFBQSxNQUNOLFdBQVc7QUFBQSxNQUNYLGlCQUFpQjtBQUFBLFFBQ2IsV0FBVztBQUFBLFVBQ1AsZ0JBQWdCO0FBQUEsVUFDaEIsU0FBUztBQUFBLFVBQ1QsTUFBTTtBQUFBLFlBQ0YsTUFBTTtBQUFBLFVBQ1Y7QUFBQSxRQUNKO0FBQUEsTUFDSjtBQUFBLElBQ0o7QUFBQSxFQUNKO0FBQ0EsTUFBTSw2QkFBNkI7QUFBQSxJQUMvQixnQkFBZ0I7QUFBQSxJQUNoQixNQUFNO0FBQUEsTUFDRixNQUFNO0FBQUEsTUFDTixXQUFXO0FBQUEsTUFDWCxpQkFBaUI7QUFBQSxRQUNiLE1BQU07QUFBQSxVQUNGLGdCQUFnQjtBQUFBLFVBQ2hCLFNBQVM7QUFBQSxVQUNULE1BQU07QUFBQSxZQUNGLE1BQU07QUFBQSxVQUNWO0FBQUEsUUFDSjtBQUFBLFFBQ0EsY0FBYztBQUFBLFVBQ1YsZ0JBQWdCO0FBQUEsVUFDaEIsU0FBUztBQUFBLFVBQ1QsTUFBTTtBQUFBLFlBQ0YsTUFBTTtBQUFBLFVBQ1Y7QUFBQSxRQUNKO0FBQUEsUUFDQSxXQUFXO0FBQUEsVUFDUCxnQkFBZ0I7QUFBQSxVQUNoQixTQUFTO0FBQUEsVUFDVCxNQUFNO0FBQUEsWUFDRixNQUFNO0FBQUEsVUFDVjtBQUFBLFFBQ0o7QUFBQSxRQUNBLGlCQUFpQjtBQUFBLFVBQ2IsZ0JBQWdCO0FBQUEsVUFDaEIsU0FBUztBQUFBLFVBQ1QsTUFBTTtBQUFBLFlBQ0YsTUFBTTtBQUFBLFVBQ1Y7QUFBQSxRQUNKO0FBQUEsUUFDQSxXQUFXO0FBQUEsVUFDUCxnQkFBZ0I7QUFBQSxVQUNoQixTQUFTO0FBQUEsVUFDVCxNQUFNO0FBQUEsWUFDRixNQUFNO0FBQUEsVUFDVjtBQUFBLFFBQ0o7QUFBQSxRQUNBLFNBQVM7QUFBQSxVQUNMLGdCQUFnQjtBQUFBLFVBQ2hCLFNBQVM7QUFBQSxVQUNULE1BQU07QUFBQSxZQUNGLE1BQU07QUFBQSxVQUNWO0FBQUEsUUFDSjtBQUFBLFFBQ0EsTUFBTTtBQUFBLFVBQ0YsZ0JBQWdCO0FBQUEsVUFDaEIsU0FBUztBQUFBLFVBQ1QsTUFBTTtBQUFBLFlBQ0YsTUFBTTtBQUFBLFVBQ1Y7QUFBQSxRQUNKO0FBQUEsTUFDSjtBQUFBLElBQ0o7QUFBQSxFQUNKO0FBQ0EsTUFBTSxzQ0FBc0M7QUFBQSxJQUN4QyxnQkFBZ0I7QUFBQSxJQUNoQixNQUFNO0FBQUEsTUFDRixNQUFNO0FBQUEsTUFDTixXQUFXO0FBQUEsTUFDWCxpQkFBaUI7QUFBQSxRQUNiLFdBQVc7QUFBQSxVQUNQLGdCQUFnQjtBQUFBLFVBQ2hCLFNBQVM7QUFBQSxVQUNULE1BQU07QUFBQSxZQUNGLE1BQU07QUFBQSxVQUNWO0FBQUEsUUFDSjtBQUFBLE1BQ0o7QUFBQSxJQUNKO0FBQUEsRUFDSjtBQUNBLE1BQU0sOEJBQThCO0FBQUEsSUFDaEMsZ0JBQWdCO0FBQUEsSUFDaEIsTUFBTTtBQUFBLE1BQ0YsTUFBTTtBQUFBLE1BQ04sV0FBVztBQUFBLE1BQ1gsaUJBQWlCO0FBQUEsUUFDYixNQUFNO0FBQUEsVUFDRixnQkFBZ0I7QUFBQSxVQUNoQixTQUFTO0FBQUEsVUFDVCxNQUFNO0FBQUEsWUFDRixNQUFNO0FBQUEsVUFDVjtBQUFBLFFBQ0o7QUFBQSxRQUNBLGNBQWM7QUFBQSxVQUNWLGdCQUFnQjtBQUFBLFVBQ2hCLFNBQVM7QUFBQSxVQUNULE1BQU07QUFBQSxZQUNGLE1BQU07QUFBQSxVQUNWO0FBQUEsUUFDSjtBQUFBLFFBQ0EsU0FBUztBQUFBLFVBQ0wsZ0JBQWdCO0FBQUEsVUFDaEIsU0FBUztBQUFBLFVBQ1QsTUFBTTtBQUFBLFlBQ0YsTUFBTTtBQUFBLFVBQ1Y7QUFBQSxRQUNKO0FBQUEsUUFDQSxpQkFBaUI7QUFBQSxVQUNiLGdCQUFnQjtBQUFBLFVBQ2hCLFNBQVM7QUFBQSxVQUNULE1BQU07QUFBQSxZQUNGLE1BQU07QUFBQSxVQUNWO0FBQUEsUUFDSjtBQUFBLFFBQ0EsV0FBVztBQUFBLFVBQ1AsZ0JBQWdCO0FBQUEsVUFDaEIsU0FBUztBQUFBLFVBQ1QsTUFBTTtBQUFBLFlBQ0YsTUFBTTtBQUFBLFVBQ1Y7QUFBQSxRQUNKO0FBQUEsUUFDQSxTQUFTO0FBQUEsVUFDTCxnQkFBZ0I7QUFBQSxVQUNoQixTQUFTO0FBQUEsVUFDVCxNQUFNO0FBQUEsWUFDRixNQUFNO0FBQUEsVUFDVjtBQUFBLFFBQ0o7QUFBQSxRQUNBLE1BQU07QUFBQSxVQUNGLGdCQUFnQjtBQUFBLFVBQ2hCLFNBQVM7QUFBQSxVQUNULE1BQU07QUFBQSxZQUNGLE1BQU07QUFBQSxVQUNWO0FBQUEsUUFDSjtBQUFBLE1BQ0o7QUFBQSxJQUNKO0FBQUEsRUFDSjtBQUNBLE1BQU0sdUNBQXVDO0FBQUEsSUFDekMsZ0JBQWdCO0FBQUEsSUFDaEIsTUFBTTtBQUFBLE1BQ0YsTUFBTTtBQUFBLE1BQ04sV0FBVztBQUFBLE1BQ1gsaUJBQWlCO0FBQUEsUUFDYixXQUFXO0FBQUEsVUFDUCxnQkFBZ0I7QUFBQSxVQUNoQixTQUFTO0FBQUEsVUFDVCxNQUFNO0FBQUEsWUFDRixNQUFNO0FBQUEsVUFDVjtBQUFBLFFBQ0o7QUFBQSxNQUNKO0FBQUEsSUFDSjtBQUFBLEVBQ0o7QUFDQSxNQUFNLHNDQUFzQztBQUFBLElBQ3hDLGdCQUFnQjtBQUFBLElBQ2hCLE1BQU07QUFBQSxNQUNGLE1BQU07QUFBQSxNQUNOLFdBQVc7QUFBQSxNQUNYLGlCQUFpQjtBQUFBLFFBQ2IsYUFBYTtBQUFBLFVBQ1QsZ0JBQWdCO0FBQUEsVUFDaEIsU0FBUztBQUFBLFVBQ1QsTUFBTTtBQUFBLFlBQ0YsTUFBTTtBQUFBLFVBQ1Y7QUFBQSxRQUNKO0FBQUEsUUFDQSxpQkFBaUI7QUFBQSxVQUNiLGdCQUFnQjtBQUFBLFVBQ2hCLFNBQVM7QUFBQSxVQUNULE1BQU07QUFBQSxZQUNGLE1BQU07QUFBQSxVQUNWO0FBQUEsUUFDSjtBQUFBLFFBQ0EsV0FBVztBQUFBLFVBQ1AsZ0JBQWdCO0FBQUEsVUFDaEIsU0FBUztBQUFBLFVBQ1QsTUFBTTtBQUFBLFlBQ0YsTUFBTTtBQUFBLFVBQ1Y7QUFBQSxRQUNKO0FBQUEsUUFDQSxTQUFTO0FBQUEsVUFDTCxnQkFBZ0I7QUFBQSxVQUNoQixTQUFTO0FBQUEsVUFDVCxNQUFNO0FBQUEsWUFDRixNQUFNO0FBQUEsVUFDVjtBQUFBLFFBQ0o7QUFBQSxRQUNBLE1BQU07QUFBQSxVQUNGLGdCQUFnQjtBQUFBLFVBQ2hCLFNBQVM7QUFBQSxVQUNULE1BQU07QUFBQSxZQUNGLE1BQU07QUFBQSxVQUNWO0FBQUEsUUFDSjtBQUFBLFFBQ0EsV0FBVztBQUFBLFVBQ1AsZ0JBQWdCO0FBQUEsVUFDaEIsU0FBUztBQUFBLFVBQ1QsTUFBTTtBQUFBLFlBQ0YsTUFBTTtBQUFBLFVBQ1Y7QUFBQSxRQUNKO0FBQUEsTUFDSjtBQUFBLElBQ0o7QUFBQSxFQUNKO0FBQ0EsTUFBTSwrQ0FBK0M7QUFBQSxJQUNqRCxnQkFBZ0I7QUFBQSxJQUNoQixNQUFNO0FBQUEsTUFDRixNQUFNO0FBQUEsTUFDTixXQUFXO0FBQUEsTUFDWCxpQkFBaUI7QUFBQSxRQUNiLFdBQVc7QUFBQSxVQUNQLGdCQUFnQjtBQUFBLFVBQ2hCLFNBQVM7QUFBQSxVQUNULE1BQU07QUFBQSxZQUNGLE1BQU07QUFBQSxVQUNWO0FBQUEsUUFDSjtBQUFBLE1BQ0o7QUFBQSxJQUNKO0FBQUEsRUFDSjtBQUNBLE1BQU0sMkNBQTJDO0FBQUEsSUFDN0MsZ0JBQWdCO0FBQUEsSUFDaEIsTUFBTTtBQUFBLE1BQ0YsTUFBTTtBQUFBLE1BQ04sV0FBVztBQUFBLE1BQ1gsaUJBQWlCO0FBQUEsUUFDYixhQUFhO0FBQUEsVUFDVCxnQkFBZ0I7QUFBQSxVQUNoQixTQUFTO0FBQUEsVUFDVCxNQUFNO0FBQUEsWUFDRixNQUFNO0FBQUEsVUFDVjtBQUFBLFFBQ0o7QUFBQSxRQUNBLGlCQUFpQjtBQUFBLFVBQ2IsZ0JBQWdCO0FBQUEsVUFDaEIsU0FBUztBQUFBLFVBQ1QsTUFBTTtBQUFBLFlBQ0YsTUFBTTtBQUFBLFVBQ1Y7QUFBQSxRQUNKO0FBQUEsUUFDQSxXQUFXO0FBQUEsVUFDUCxnQkFBZ0I7QUFBQSxVQUNoQixTQUFTO0FBQUEsVUFDVCxNQUFNO0FBQUEsWUFDRixNQUFNO0FBQUEsVUFDVjtBQUFBLFFBQ0o7QUFBQSxRQUNBLFNBQVM7QUFBQSxVQUNMLGdCQUFnQjtBQUFBLFVBQ2hCLFNBQVM7QUFBQSxVQUNULE1BQU07QUFBQSxZQUNGLE1BQU07QUFBQSxVQUNWO0FBQUEsUUFDSjtBQUFBLFFBQ0EsTUFBTTtBQUFBLFVBQ0YsZ0JBQWdCO0FBQUEsVUFDaEIsU0FBUztBQUFBLFVBQ1QsTUFBTTtBQUFBLFlBQ0YsTUFBTTtBQUFBLFVBQ1Y7QUFBQSxRQUNKO0FBQUEsUUFDQSxXQUFXO0FBQUEsVUFDUCxnQkFBZ0I7QUFBQSxVQUNoQixTQUFTO0FBQUEsVUFDVCxNQUFNO0FBQUEsWUFDRixNQUFNO0FBQUEsVUFDVjtBQUFBLFFBQ0o7QUFBQSxNQUNKO0FBQUEsSUFDSjtBQUFBLEVBQ0o7QUFDQSxNQUFNLG9EQUFvRDtBQUFBLElBQ3RELGdCQUFnQjtBQUFBLElBQ2hCLE1BQU07QUFBQSxNQUNGLE1BQU07QUFBQSxNQUNOLFdBQVc7QUFBQSxNQUNYLGlCQUFpQjtBQUFBLFFBQ2IsV0FBVztBQUFBLFVBQ1AsZ0JBQWdCO0FBQUEsVUFDaEIsU0FBUztBQUFBLFVBQ1QsTUFBTTtBQUFBLFlBQ0YsTUFBTTtBQUFBLFVBQ1Y7QUFBQSxRQUNKO0FBQUEsTUFDSjtBQUFBLElBQ0o7QUFBQSxFQUNKO0FBQ0EsTUFBTSxpQ0FBaUM7QUFBQSxJQUNuQyxnQkFBZ0I7QUFBQSxJQUNoQixNQUFNO0FBQUEsTUFDRixNQUFNO0FBQUEsTUFDTixXQUFXO0FBQUEsTUFDWCxpQkFBaUI7QUFBQSxRQUNiLGlCQUFpQjtBQUFBLFVBQ2IsZ0JBQWdCO0FBQUEsVUFDaEIsU0FBUztBQUFBLFVBQ1QsTUFBTTtBQUFBLFlBQ0YsTUFBTTtBQUFBLFVBQ1Y7QUFBQSxRQUNKO0FBQUEsUUFDQSxXQUFXO0FBQUEsVUFDUCxnQkFBZ0I7QUFBQSxVQUNoQixTQUFTO0FBQUEsVUFDVCxNQUFNO0FBQUEsWUFDRixNQUFNO0FBQUEsVUFDVjtBQUFBLFFBQ0o7QUFBQSxRQUNBLFNBQVM7QUFBQSxVQUNMLGdCQUFnQjtBQUFBLFVBQ2hCLFNBQVM7QUFBQSxVQUNULE1BQU07QUFBQSxZQUNGLE1BQU07QUFBQSxVQUNWO0FBQUEsUUFDSjtBQUFBLFFBQ0EsTUFBTTtBQUFBLFVBQ0YsZ0JBQWdCO0FBQUEsVUFDaEIsU0FBUztBQUFBLFVBQ1QsTUFBTTtBQUFBLFlBQ0YsTUFBTTtBQUFBLFVBQ1Y7QUFBQSxRQUNKO0FBQUEsUUFDQSxTQUFTO0FBQUEsVUFDTCxnQkFBZ0I7QUFBQSxVQUNoQixTQUFTO0FBQUEsVUFDVCxNQUFNO0FBQUEsWUFDRixNQUFNO0FBQUEsWUFDTixlQUFlO0FBQUEsY0FDWDtBQUFBLGNBQ0E7QUFBQSxjQUNBO0FBQUEsY0FDQTtBQUFBLGNBQ0E7QUFBQSxZQUNKO0FBQUEsVUFDSjtBQUFBLFFBQ0o7QUFBQSxRQUNBLGFBQWE7QUFBQSxVQUNULGdCQUFnQjtBQUFBLFVBQ2hCLFNBQVM7QUFBQSxVQUNULE1BQU07QUFBQSxZQUNGLE1BQU07QUFBQSxZQUNOLGVBQWU7QUFBQSxjQUNYO0FBQUEsY0FDQTtBQUFBLGNBQ0E7QUFBQSxjQUNBO0FBQUEsY0FDQTtBQUFBLFlBQ0o7QUFBQSxVQUNKO0FBQUEsUUFDSjtBQUFBLFFBQ0EsZ0NBQWdDO0FBQUEsVUFDNUIsZ0JBQWdCO0FBQUEsVUFDaEIsU0FBUztBQUFBLFVBQ1QsTUFBTTtBQUFBLFlBQ0YsTUFBTTtBQUFBLFVBQ1Y7QUFBQSxRQUNKO0FBQUEsTUFDSjtBQUFBLElBQ0o7QUFBQSxFQUNKO0FBQ0EsTUFBTSwwQ0FBMEM7QUFBQSxJQUM1QyxnQkFBZ0I7QUFBQSxJQUNoQixNQUFNO0FBQUEsTUFDRixNQUFNO0FBQUEsTUFDTixXQUFXO0FBQUEsTUFDWCxpQkFBaUI7QUFBQSxRQUNiLFdBQVc7QUFBQSxVQUNQLGdCQUFnQjtBQUFBLFVBQ2hCLFNBQVM7QUFBQSxVQUNULE1BQU07QUFBQSxZQUNGLE1BQU07QUFBQSxVQUNWO0FBQUEsUUFDSjtBQUFBLE1BQ0o7QUFBQSxJQUNKO0FBQUEsRUFDSjtBQUNBLE1BQU0sc0JBQXNCO0FBQUEsSUFDeEIsZ0JBQWdCO0FBQUEsSUFDaEIsTUFBTTtBQUFBLE1BQ0YsTUFBTTtBQUFBLE1BQ04sV0FBVztBQUFBLE1BQ1gsaUJBQWlCO0FBQUEsUUFDYixjQUFjO0FBQUEsVUFDVixnQkFBZ0I7QUFBQSxVQUNoQixTQUFTO0FBQUEsVUFDVCxNQUFNO0FBQUEsWUFDRixNQUFNO0FBQUEsVUFDVjtBQUFBLFFBQ0o7QUFBQSxRQUNBLFdBQVc7QUFBQSxVQUNQLGdCQUFnQjtBQUFBLFVBQ2hCLFNBQVM7QUFBQSxVQUNULE1BQU07QUFBQSxZQUNGLE1BQU07QUFBQSxVQUNWO0FBQUEsUUFDSjtBQUFBLFFBQ0EsVUFBVTtBQUFBLFVBQ04sZ0JBQWdCO0FBQUEsVUFDaEIsd0JBQXdCO0FBQUEsVUFDeEIsU0FBUztBQUFBLFVBQ1QsTUFBTTtBQUFBLFlBQ0YsTUFBTTtBQUFBLFlBQ04sT0FBTyxFQUFFLE1BQU0sRUFBRSxNQUFNLFNBQVMsRUFBRTtBQUFBLFVBQ3RDO0FBQUEsUUFDSjtBQUFBLFFBQ0EsMkJBQTJCO0FBQUEsVUFDdkIsZ0JBQWdCO0FBQUEsVUFDaEIsU0FBUztBQUFBLFVBQ1QsTUFBTTtBQUFBLFlBQ0YsTUFBTTtBQUFBLFVBQ1Y7QUFBQSxRQUNKO0FBQUEsUUFDQSx3QkFBd0I7QUFBQSxVQUNwQixnQkFBZ0I7QUFBQSxVQUNoQix3QkFBd0I7QUFBQSxVQUN4QixTQUFTO0FBQUEsVUFDVCxNQUFNO0FBQUEsWUFDRixNQUFNO0FBQUEsWUFDTixPQUFPLEVBQUUsTUFBTSxFQUFFLE1BQU0sU0FBUyxFQUFFO0FBQUEsVUFDdEM7QUFBQSxRQUNKO0FBQUEsUUFDQSxlQUFlO0FBQUEsVUFDWCxnQkFBZ0I7QUFBQSxVQUNoQixTQUFTO0FBQUEsVUFDVCxNQUFNO0FBQUEsWUFDRixNQUFNO0FBQUEsVUFDVjtBQUFBLFFBQ0o7QUFBQSxRQUNBLGFBQWE7QUFBQSxVQUNULGdCQUFnQjtBQUFBLFVBQ2hCLFNBQVM7QUFBQSxVQUNULE1BQU07QUFBQSxZQUNGLE1BQU07QUFBQSxVQUNWO0FBQUEsUUFDSjtBQUFBLFFBQ0EsY0FBYztBQUFBLFVBQ1YsZ0JBQWdCO0FBQUEsVUFDaEIsU0FBUztBQUFBLFVBQ1QsTUFBTTtBQUFBLFlBQ0YsTUFBTTtBQUFBLFVBQ1Y7QUFBQSxRQUNKO0FBQUEsUUFDQSxNQUFNO0FBQUEsVUFDRixnQkFBZ0I7QUFBQSxVQUNoQixTQUFTO0FBQUEsVUFDVCxNQUFNO0FBQUEsWUFDRixNQUFNO0FBQUEsVUFDVjtBQUFBLFFBQ0o7QUFBQSxRQUNBLFlBQVk7QUFBQSxVQUNSLGdCQUFnQjtBQUFBLFVBQ2hCLFNBQVM7QUFBQSxVQUNULE1BQU07QUFBQSxZQUNGLE1BQU07QUFBQSxVQUNWO0FBQUEsUUFDSjtBQUFBLFFBQ0EsaUJBQWlCO0FBQUEsVUFDYixnQkFBZ0I7QUFBQSxVQUNoQixTQUFTO0FBQUEsVUFDVCxNQUFNO0FBQUEsWUFDRixNQUFNO0FBQUEsVUFDVjtBQUFBLFFBQ0o7QUFBQSxRQUNBLGNBQWM7QUFBQSxVQUNWLGdCQUFnQjtBQUFBLFVBQ2hCLFNBQVM7QUFBQSxVQUNULE1BQU07QUFBQSxZQUNGLE1BQU07QUFBQSxVQUNWO0FBQUEsUUFDSjtBQUFBLFFBQ0Esb0JBQW9CO0FBQUEsVUFDaEIsZ0JBQWdCO0FBQUEsVUFDaEIsU0FBUztBQUFBLFVBQ1QsTUFBTTtBQUFBLFlBQ0YsTUFBTTtBQUFBLFVBQ1Y7QUFBQSxRQUNKO0FBQUEsUUFDQSxpQkFBaUI7QUFBQSxVQUNiLGdCQUFnQjtBQUFBLFVBQ2hCLFNBQVM7QUFBQSxVQUNULE1BQU07QUFBQSxZQUNGLE1BQU07QUFBQSxVQUNWO0FBQUEsUUFDSjtBQUFBLFFBQ0Esb0JBQW9CO0FBQUEsVUFDaEIsZ0JBQWdCO0FBQUEsVUFDaEIsU0FBUztBQUFBLFVBQ1QsTUFBTTtBQUFBLFlBQ0YsTUFBTTtBQUFBLFVBQ1Y7QUFBQSxRQUNKO0FBQUEsUUFDQSxVQUFVO0FBQUEsVUFDTixnQkFBZ0I7QUFBQSxVQUNoQixTQUFTO0FBQUEsVUFDVCxNQUFNO0FBQUEsWUFDRixNQUFNO0FBQUEsWUFDTixlQUFlLENBQUMsYUFBYSxZQUFZLFlBQVk7QUFBQSxVQUN6RDtBQUFBLFFBQ0o7QUFBQSxRQUNBLGlCQUFpQjtBQUFBLFVBQ2IsZ0JBQWdCO0FBQUEsVUFDaEIsU0FBUztBQUFBLFVBQ1QsTUFBTTtBQUFBLFlBQ0YsTUFBTTtBQUFBLFVBQ1Y7QUFBQSxRQUNKO0FBQUEsUUFDQSx1QkFBdUI7QUFBQSxVQUNuQixnQkFBZ0I7QUFBQSxVQUNoQixTQUFTO0FBQUEsVUFDVCxNQUFNO0FBQUEsWUFDRixNQUFNO0FBQUEsVUFDVjtBQUFBLFFBQ0o7QUFBQSxRQUNBLFFBQVE7QUFBQSxVQUNKLGdCQUFnQjtBQUFBLFVBQ2hCLFNBQVM7QUFBQSxVQUNULE1BQU07QUFBQSxZQUNGLE1BQU07QUFBQSxVQUNWO0FBQUEsUUFDSjtBQUFBLFFBQ0EsY0FBYztBQUFBLFVBQ1YsZ0JBQWdCO0FBQUEsVUFDaEIsU0FBUztBQUFBLFVBQ1QsTUFBTTtBQUFBLFlBQ0YsTUFBTTtBQUFBLFVBQ1Y7QUFBQSxRQUNKO0FBQUEsUUFDQSxZQUFZO0FBQUEsVUFDUixnQkFBZ0I7QUFBQSxVQUNoQixTQUFTO0FBQUEsVUFDVCxNQUFNO0FBQUEsWUFDRixNQUFNO0FBQUEsVUFDVjtBQUFBLFFBQ0o7QUFBQSxRQUNBLFlBQVk7QUFBQSxVQUNSLGdCQUFnQjtBQUFBLFVBQ2hCLFNBQVM7QUFBQSxVQUNULE1BQU07QUFBQSxZQUNGLE1BQU07QUFBQSxZQUNOLGVBQWUsQ0FBQyxXQUFXLFdBQVcsV0FBVyxRQUFRO0FBQUEsVUFDN0Q7QUFBQSxRQUNKO0FBQUEsUUFDQSxlQUFlO0FBQUEsVUFDWCxnQkFBZ0I7QUFBQSxVQUNoQixTQUFTO0FBQUEsVUFDVCxNQUFNO0FBQUEsWUFDRixNQUFNO0FBQUEsWUFDTixlQUFlLENBQUMsWUFBWSxPQUFPO0FBQUEsVUFDdkM7QUFBQSxRQUNKO0FBQUEsUUFDQSxZQUFZO0FBQUEsVUFDUixnQkFBZ0I7QUFBQSxVQUNoQixTQUFTO0FBQUEsVUFDVCxNQUFNO0FBQUEsWUFDRixNQUFNO0FBQUEsWUFDTixlQUFlO0FBQUEsY0FDWDtBQUFBLGNBQ0E7QUFBQSxjQUNBO0FBQUEsY0FDQTtBQUFBLGNBQ0E7QUFBQSxZQUNKO0FBQUEsVUFDSjtBQUFBLFFBQ0o7QUFBQSxRQUNBLGFBQWE7QUFBQSxVQUNULGdCQUFnQjtBQUFBLFVBQ2hCLFNBQVM7QUFBQSxVQUNULE1BQU07QUFBQSxZQUNGLE1BQU07QUFBQSxZQUNOLGVBQWUsQ0FBQyxVQUFVLFVBQVU7QUFBQSxVQUN4QztBQUFBLFFBQ0o7QUFBQSxRQUNBLGlCQUFpQjtBQUFBLFVBQ2IsZ0JBQWdCO0FBQUEsVUFDaEIsU0FBUztBQUFBLFVBQ1QsTUFBTTtBQUFBLFlBQ0YsTUFBTTtBQUFBLFVBQ1Y7QUFBQSxRQUNKO0FBQUEsUUFDQSxXQUFXO0FBQUEsVUFDUCxnQkFBZ0I7QUFBQSxVQUNoQixTQUFTO0FBQUEsVUFDVCxNQUFNO0FBQUEsWUFDRixNQUFNO0FBQUEsVUFDVjtBQUFBLFFBQ0o7QUFBQSxRQUNBLFNBQVM7QUFBQSxVQUNMLGdCQUFnQjtBQUFBLFVBQ2hCLFNBQVM7QUFBQSxVQUNULE1BQU07QUFBQSxZQUNGLE1BQU07QUFBQSxVQUNWO0FBQUEsUUFDSjtBQUFBLFFBQ0EsV0FBVztBQUFBLFVBQ1AsZ0JBQWdCO0FBQUEsVUFDaEIsU0FBUztBQUFBLFVBQ1QsTUFBTTtBQUFBLFlBQ0YsTUFBTTtBQUFBLFVBQ1Y7QUFBQSxRQUNKO0FBQUEsUUFDQSxrQkFBa0I7QUFBQSxVQUNkLGdCQUFnQjtBQUFBLFVBQ2hCLFNBQVM7QUFBQSxVQUNULE1BQU07QUFBQSxZQUNGLE1BQU07QUFBQSxVQUNWO0FBQUEsUUFDSjtBQUFBLFFBQ0EsY0FBYztBQUFBLFVBQ1YsZ0JBQWdCO0FBQUEsVUFDaEIsU0FBUztBQUFBLFVBQ1QsTUFBTTtBQUFBLFlBQ0YsTUFBTTtBQUFBLFVBQ1Y7QUFBQSxRQUNKO0FBQUEsUUFDQSxNQUFNO0FBQUEsVUFDRixnQkFBZ0I7QUFBQSxVQUNoQixTQUFTO0FBQUEsVUFDVCxNQUFNO0FBQUEsWUFDRixNQUFNO0FBQUEsVUFDVjtBQUFBLFFBQ0o7QUFBQSxRQUNBLHlCQUF5QjtBQUFBLFVBQ3JCLGdCQUFnQjtBQUFBLFVBQ2hCLFNBQVM7QUFBQSxVQUNULE1BQU07QUFBQSxZQUNGLE1BQU07QUFBQSxVQUNWO0FBQUEsUUFDSjtBQUFBLFFBQ0EsbUJBQW1CO0FBQUEsVUFDZixnQkFBZ0I7QUFBQSxVQUNoQixTQUFTO0FBQUEsVUFDVCxNQUFNO0FBQUEsWUFDRixNQUFNO0FBQUEsVUFDVjtBQUFBLFFBQ0o7QUFBQSxRQUNBLHFCQUFxQjtBQUFBLFVBQ2pCLGdCQUFnQjtBQUFBLFVBQ2hCLFNBQVM7QUFBQSxVQUNULE1BQU07QUFBQSxZQUNGLE1BQU07QUFBQSxVQUNWO0FBQUEsUUFDSjtBQUFBLFFBQ0EsaUJBQWlCO0FBQUEsVUFDYixnQkFBZ0I7QUFBQSxVQUNoQixTQUFTO0FBQUEsVUFDVCxNQUFNO0FBQUEsWUFDRixNQUFNO0FBQUEsVUFDVjtBQUFBLFFBQ0o7QUFBQSxRQUNBLGdCQUFnQjtBQUFBLFVBQ1osZ0JBQWdCO0FBQUEsVUFDaEIsU0FBUztBQUFBLFVBQ1QsTUFBTTtBQUFBLFlBQ0YsTUFBTTtBQUFBLFVBQ1Y7QUFBQSxRQUNKO0FBQUEsUUFDQSxVQUFVO0FBQUEsVUFDTixnQkFBZ0I7QUFBQSxVQUNoQixTQUFTO0FBQUEsVUFDVCxNQUFNO0FBQUEsWUFDRixNQUFNO0FBQUEsVUFDVjtBQUFBLFFBQ0o7QUFBQSxRQUNBLFVBQVU7QUFBQSxVQUNOLGdCQUFnQjtBQUFBLFVBQ2hCLFNBQVM7QUFBQSxVQUNULE1BQU07QUFBQSxZQUNGLE1BQU07QUFBQSxVQUNWO0FBQUEsUUFDSjtBQUFBLFFBQ0EsY0FBYztBQUFBLFVBQ1YsZ0JBQWdCO0FBQUEsVUFDaEIsU0FBUztBQUFBLFVBQ1QsTUFBTTtBQUFBLFlBQ0YsTUFBTTtBQUFBLFVBQ1Y7QUFBQSxRQUNKO0FBQUEsUUFDQSw2QkFBNkI7QUFBQSxVQUN6QixnQkFBZ0I7QUFBQSxVQUNoQixTQUFTO0FBQUEsVUFDVCxNQUFNO0FBQUEsWUFDRixNQUFNO0FBQUEsVUFDVjtBQUFBLFFBQ0o7QUFBQSxRQUNBLHdCQUF3QjtBQUFBLFVBQ3BCLGdCQUFnQjtBQUFBLFVBQ2hCLFNBQVM7QUFBQSxVQUNULE1BQU07QUFBQSxZQUNGLE1BQU07QUFBQSxZQUNOLGVBQWUsQ0FBQyxXQUFXLFlBQVksUUFBUTtBQUFBLFVBQ25EO0FBQUEsUUFDSjtBQUFBLFFBQ0EsV0FBVztBQUFBLFVBQ1AsZ0JBQWdCO0FBQUEsVUFDaEIsU0FBUztBQUFBLFVBQ1QsTUFBTTtBQUFBLFlBQ0YsTUFBTTtBQUFBLFVBQ1Y7QUFBQSxRQUNKO0FBQUEsUUFDQSxXQUFXO0FBQUEsVUFDUCxnQkFBZ0I7QUFBQSxVQUNoQixTQUFTO0FBQUEsVUFDVCxNQUFNO0FBQUEsWUFDRixNQUFNO0FBQUEsVUFDVjtBQUFBLFFBQ0o7QUFBQSxRQUNBLGNBQWM7QUFBQSxVQUNWLGdCQUFnQjtBQUFBLFVBQ2hCLFNBQVM7QUFBQSxVQUNULE1BQU07QUFBQSxZQUNGLE1BQU07QUFBQSxVQUNWO0FBQUEsUUFDSjtBQUFBLE1BQ0o7QUFBQSxJQUNKO0FBQUEsRUFDSjtBQUNBLE1BQU0sK0JBQStCO0FBQUEsSUFDakMsZ0JBQWdCO0FBQUEsSUFDaEIsTUFBTTtBQUFBLE1BQ0YsTUFBTTtBQUFBLE1BQ04sV0FBVztBQUFBLE1BQ1gsaUJBQWlCO0FBQUEsUUFDYixXQUFXO0FBQUEsVUFDUCxnQkFBZ0I7QUFBQSxVQUNoQixTQUFTO0FBQUEsVUFDVCxNQUFNO0FBQUEsWUFDRixNQUFNO0FBQUEsVUFDVjtBQUFBLFFBQ0o7QUFBQSxNQUNKO0FBQUEsSUFDSjtBQUFBLEVBQ0o7QUFDQSxNQUFNLDJCQUEyQjtBQUFBLElBQzdCLGdCQUFnQjtBQUFBLElBQ2hCLE1BQU07QUFBQSxNQUNGLE1BQU07QUFBQSxNQUNOLFdBQVc7QUFBQSxNQUNYLGlCQUFpQjtBQUFBLFFBQ2IsY0FBYztBQUFBLFVBQ1YsZ0JBQWdCO0FBQUEsVUFDaEIsU0FBUztBQUFBLFVBQ1QsTUFBTTtBQUFBLFlBQ0YsTUFBTTtBQUFBLFVBQ1Y7QUFBQSxRQUNKO0FBQUEsUUFDQSxXQUFXO0FBQUEsVUFDUCxnQkFBZ0I7QUFBQSxVQUNoQixTQUFTO0FBQUEsVUFDVCxNQUFNO0FBQUEsWUFDRixNQUFNO0FBQUEsVUFDVjtBQUFBLFFBQ0o7QUFBQSxRQUNBLFVBQVU7QUFBQSxVQUNOLGdCQUFnQjtBQUFBLFVBQ2hCLHdCQUF3QjtBQUFBLFVBQ3hCLFNBQVM7QUFBQSxVQUNULE1BQU07QUFBQSxZQUNGLE1BQU07QUFBQSxZQUNOLE9BQU8sRUFBRSxNQUFNLEVBQUUsTUFBTSxTQUFTLEVBQUU7QUFBQSxVQUN0QztBQUFBLFFBQ0o7QUFBQSxRQUNBLDJCQUEyQjtBQUFBLFVBQ3ZCLGdCQUFnQjtBQUFBLFVBQ2hCLFNBQVM7QUFBQSxVQUNULE1BQU07QUFBQSxZQUNGLE1BQU07QUFBQSxVQUNWO0FBQUEsUUFDSjtBQUFBLFFBQ0Esd0JBQXdCO0FBQUEsVUFDcEIsZ0JBQWdCO0FBQUEsVUFDaEIsd0JBQXdCO0FBQUEsVUFDeEIsU0FBUztBQUFBLFVBQ1QsTUFBTTtBQUFBLFlBQ0YsTUFBTTtBQUFBLFlBQ04sT0FBTyxFQUFFLE1BQU0sRUFBRSxNQUFNLFNBQVMsRUFBRTtBQUFBLFVBQ3RDO0FBQUEsUUFDSjtBQUFBLFFBQ0EsVUFBVTtBQUFBLFVBQ04sZ0JBQWdCO0FBQUEsVUFDaEIsU0FBUztBQUFBLFVBQ1QsTUFBTTtBQUFBLFlBQ0YsTUFBTTtBQUFBLFlBQ04sZUFBZSxDQUFDLGFBQWEsWUFBWSxZQUFZO0FBQUEsVUFDekQ7QUFBQSxRQUNKO0FBQUEsUUFDQSxpQkFBaUI7QUFBQSxVQUNiLGdCQUFnQjtBQUFBLFVBQ2hCLFNBQVM7QUFBQSxVQUNULE1BQU07QUFBQSxZQUNGLE1BQU07QUFBQSxVQUNWO0FBQUEsUUFDSjtBQUFBLFFBQ0EsdUJBQXVCO0FBQUEsVUFDbkIsZ0JBQWdCO0FBQUEsVUFDaEIsU0FBUztBQUFBLFVBQ1QsTUFBTTtBQUFBLFlBQ0YsTUFBTTtBQUFBLFVBQ1Y7QUFBQSxRQUNKO0FBQUEsUUFDQSxRQUFRO0FBQUEsVUFDSixnQkFBZ0I7QUFBQSxVQUNoQixTQUFTO0FBQUEsVUFDVCxNQUFNO0FBQUEsWUFDRixNQUFNO0FBQUEsVUFDVjtBQUFBLFFBQ0o7QUFBQSxRQUNBLGNBQWM7QUFBQSxVQUNWLGdCQUFnQjtBQUFBLFVBQ2hCLFNBQVM7QUFBQSxVQUNULE1BQU07QUFBQSxZQUNGLE1BQU07QUFBQSxVQUNWO0FBQUEsUUFDSjtBQUFBLFFBQ0EsWUFBWTtBQUFBLFVBQ1IsZ0JBQWdCO0FBQUEsVUFDaEIsU0FBUztBQUFBLFVBQ1QsTUFBTTtBQUFBLFlBQ0YsTUFBTTtBQUFBLFVBQ1Y7QUFBQSxRQUNKO0FBQUEsUUFDQSxZQUFZO0FBQUEsVUFDUixnQkFBZ0I7QUFBQSxVQUNoQixTQUFTO0FBQUEsVUFDVCxNQUFNO0FBQUEsWUFDRixNQUFNO0FBQUEsWUFDTixlQUFlLENBQUMsV0FBVyxXQUFXLFdBQVcsUUFBUTtBQUFBLFVBQzdEO0FBQUEsUUFDSjtBQUFBLFFBQ0EsbUJBQW1CO0FBQUEsVUFDZixnQkFBZ0I7QUFBQSxVQUNoQixTQUFTO0FBQUEsVUFDVCxNQUFNO0FBQUEsWUFDRixNQUFNO0FBQUEsVUFDVjtBQUFBLFFBQ0o7QUFBQSxRQUNBLHFCQUFxQjtBQUFBLFVBQ2pCLGdCQUFnQjtBQUFBLFVBQ2hCLFNBQVM7QUFBQSxVQUNULE1BQU07QUFBQSxZQUNGLE1BQU07QUFBQSxVQUNWO0FBQUEsUUFDSjtBQUFBLFFBQ0EsZUFBZTtBQUFBLFVBQ1gsZ0JBQWdCO0FBQUEsVUFDaEIsU0FBUztBQUFBLFVBQ1QsTUFBTTtBQUFBLFlBQ0YsTUFBTTtBQUFBLFlBQ04sZUFBZSxDQUFDLFlBQVksT0FBTztBQUFBLFVBQ3ZDO0FBQUEsUUFDSjtBQUFBLFFBQ0EsWUFBWTtBQUFBLFVBQ1IsZ0JBQWdCO0FBQUEsVUFDaEIsU0FBUztBQUFBLFVBQ1QsTUFBTTtBQUFBLFlBQ0YsTUFBTTtBQUFBLFlBQ04sZUFBZTtBQUFBLGNBQ1g7QUFBQSxjQUNBO0FBQUEsY0FDQTtBQUFBLGNBQ0E7QUFBQSxjQUNBO0FBQUEsWUFDSjtBQUFBLFVBQ0o7QUFBQSxRQUNKO0FBQUEsUUFDQSxhQUFhO0FBQUEsVUFDVCxnQkFBZ0I7QUFBQSxVQUNoQixTQUFTO0FBQUEsVUFDVCxNQUFNO0FBQUEsWUFDRixNQUFNO0FBQUEsWUFDTixlQUFlLENBQUMsVUFBVSxVQUFVO0FBQUEsVUFDeEM7QUFBQSxRQUNKO0FBQUEsUUFDQSxlQUFlO0FBQUEsVUFDWCxnQkFBZ0I7QUFBQSxVQUNoQixTQUFTO0FBQUEsVUFDVCxNQUFNO0FBQUEsWUFDRixNQUFNO0FBQUEsVUFDVjtBQUFBLFFBQ0o7QUFBQSxRQUNBLGFBQWE7QUFBQSxVQUNULGdCQUFnQjtBQUFBLFVBQ2hCLFNBQVM7QUFBQSxVQUNULE1BQU07QUFBQSxZQUNGLE1BQU07QUFBQSxVQUNWO0FBQUEsUUFDSjtBQUFBLFFBQ0EsTUFBTTtBQUFBLFVBQ0YsZ0JBQWdCO0FBQUEsVUFDaEIsU0FBUztBQUFBLFVBQ1QsTUFBTTtBQUFBLFlBQ0YsTUFBTTtBQUFBLFVBQ1Y7QUFBQSxRQUNKO0FBQUEsUUFDQSxZQUFZO0FBQUEsVUFDUixnQkFBZ0I7QUFBQSxVQUNoQixTQUFTO0FBQUEsVUFDVCxNQUFNO0FBQUEsWUFDRixNQUFNO0FBQUEsVUFDVjtBQUFBLFFBQ0o7QUFBQSxRQUNBLGlCQUFpQjtBQUFBLFVBQ2IsZ0JBQWdCO0FBQUEsVUFDaEIsU0FBUztBQUFBLFVBQ1QsTUFBTTtBQUFBLFlBQ0YsTUFBTTtBQUFBLFVBQ1Y7QUFBQSxRQUNKO0FBQUEsUUFDQSxvQkFBb0I7QUFBQSxVQUNoQixnQkFBZ0I7QUFBQSxVQUNoQixTQUFTO0FBQUEsVUFDVCxNQUFNO0FBQUEsWUFDRixNQUFNO0FBQUEsVUFDVjtBQUFBLFFBQ0o7QUFBQSxRQUNBLGlCQUFpQjtBQUFBLFVBQ2IsZ0JBQWdCO0FBQUEsVUFDaEIsU0FBUztBQUFBLFVBQ1QsTUFBTTtBQUFBLFlBQ0YsTUFBTTtBQUFBLFVBQ1Y7QUFBQSxRQUNKO0FBQUEsUUFDQSxjQUFjO0FBQUEsVUFDVixnQkFBZ0I7QUFBQSxVQUNoQixTQUFTO0FBQUEsVUFDVCxNQUFNO0FBQUEsWUFDRixNQUFNO0FBQUEsVUFDVjtBQUFBLFFBQ0o7QUFBQSxRQUNBLG9CQUFvQjtBQUFBLFVBQ2hCLGdCQUFnQjtBQUFBLFVBQ2hCLFNBQVM7QUFBQSxVQUNULE1BQU07QUFBQSxZQUNGLE1BQU07QUFBQSxVQUNWO0FBQUEsUUFDSjtBQUFBLFFBQ0EsaUJBQWlCO0FBQUEsVUFDYixnQkFBZ0I7QUFBQSxVQUNoQixTQUFTO0FBQUEsVUFDVCxNQUFNO0FBQUEsWUFDRixNQUFNO0FBQUEsVUFDVjtBQUFBLFFBQ0o7QUFBQSxRQUNBLFdBQVc7QUFBQSxVQUNQLGdCQUFnQjtBQUFBLFVBQ2hCLFNBQVM7QUFBQSxVQUNULE1BQU07QUFBQSxZQUNGLE1BQU07QUFBQSxVQUNWO0FBQUEsUUFDSjtBQUFBLFFBQ0EsU0FBUztBQUFBLFVBQ0wsZ0JBQWdCO0FBQUEsVUFDaEIsU0FBUztBQUFBLFVBQ1QsTUFBTTtBQUFBLFlBQ0YsTUFBTTtBQUFBLFVBQ1Y7QUFBQSxRQUNKO0FBQUEsUUFDQSxNQUFNO0FBQUEsVUFDRixnQkFBZ0I7QUFBQSxVQUNoQixTQUFTO0FBQUEsVUFDVCxNQUFNO0FBQUEsWUFDRixNQUFNO0FBQUEsVUFDVjtBQUFBLFFBQ0o7QUFBQSxRQUNBLGNBQWM7QUFBQSxVQUNWLGdCQUFnQjtBQUFBLFVBQ2hCLFNBQVM7QUFBQSxVQUNULE1BQU07QUFBQSxZQUNGLE1BQU07QUFBQSxVQUNWO0FBQUEsUUFDSjtBQUFBLFFBQ0EseUJBQXlCO0FBQUEsVUFDckIsZ0JBQWdCO0FBQUEsVUFDaEIsU0FBUztBQUFBLFVBQ1QsTUFBTTtBQUFBLFlBQ0YsTUFBTTtBQUFBLFVBQ1Y7QUFBQSxRQUNKO0FBQUEsUUFDQSxtQkFBbUI7QUFBQSxVQUNmLGdCQUFnQjtBQUFBLFVBQ2hCLFNBQVM7QUFBQSxVQUNULE1BQU07QUFBQSxZQUNGLE1BQU07QUFBQSxVQUNWO0FBQUEsUUFDSjtBQUFBLFFBQ0EscUJBQXFCO0FBQUEsVUFDakIsZ0JBQWdCO0FBQUEsVUFDaEIsU0FBUztBQUFBLFVBQ1QsTUFBTTtBQUFBLFlBQ0YsTUFBTTtBQUFBLFVBQ1Y7QUFBQSxRQUNKO0FBQUEsUUFDQSxpQkFBaUI7QUFBQSxVQUNiLGdCQUFnQjtBQUFBLFVBQ2hCLFNBQVM7QUFBQSxVQUNULE1BQU07QUFBQSxZQUNGLE1BQU07QUFBQSxVQUNWO0FBQUEsUUFDSjtBQUFBLFFBQ0EsWUFBWTtBQUFBLFVBQ1IsZ0JBQWdCO0FBQUEsVUFDaEIsU0FBUztBQUFBLFVBQ1QsTUFBTTtBQUFBLFlBQ0YsTUFBTTtBQUFBLFVBQ1Y7QUFBQSxRQUNKO0FBQUEsUUFDQSxvQkFBb0I7QUFBQSxVQUNoQixnQkFBZ0I7QUFBQSxVQUNoQixTQUFTO0FBQUEsVUFDVCxNQUFNO0FBQUEsWUFDRixNQUFNO0FBQUEsVUFDVjtBQUFBLFFBQ0o7QUFBQSxRQUNBLGVBQWU7QUFBQSxVQUNYLGdCQUFnQjtBQUFBLFVBQ2hCLFNBQVM7QUFBQSxVQUNULE1BQU07QUFBQSxZQUNGLE1BQU07QUFBQSxVQUNWO0FBQUEsUUFDSjtBQUFBLFFBQ0EscUJBQXFCO0FBQUEsVUFDakIsZ0JBQWdCO0FBQUEsVUFDaEIsU0FBUztBQUFBLFVBQ1QsTUFBTTtBQUFBLFlBQ0YsTUFBTTtBQUFBLFVBQ1Y7QUFBQSxRQUNKO0FBQUEsUUFDQSxXQUFXO0FBQUEsVUFDUCxnQkFBZ0I7QUFBQSxVQUNoQixTQUFTO0FBQUEsVUFDVCxNQUFNO0FBQUEsWUFDRixNQUFNO0FBQUEsVUFDVjtBQUFBLFFBQ0o7QUFBQSxRQUNBLGtCQUFrQjtBQUFBLFVBQ2QsZ0JBQWdCO0FBQUEsVUFDaEIsU0FBUztBQUFBLFVBQ1QsTUFBTTtBQUFBLFlBQ0YsTUFBTTtBQUFBLFVBQ1Y7QUFBQSxRQUNKO0FBQUEsUUFDQSxVQUFVO0FBQUEsVUFDTixnQkFBZ0I7QUFBQSxVQUNoQixTQUFTO0FBQUEsVUFDVCxNQUFNO0FBQUEsWUFDRixNQUFNO0FBQUEsVUFDVjtBQUFBLFFBQ0o7QUFBQSxRQUNBLFdBQVc7QUFBQSxVQUNQLGdCQUFnQjtBQUFBLFVBQ2hCLFNBQVM7QUFBQSxVQUNULE1BQU07QUFBQSxZQUNGLE1BQU07QUFBQSxVQUNWO0FBQUEsUUFDSjtBQUFBLFFBQ0EsVUFBVTtBQUFBLFVBQ04sZ0JBQWdCO0FBQUEsVUFDaEIsU0FBUztBQUFBLFVBQ1QsTUFBTTtBQUFBLFlBQ0YsTUFBTTtBQUFBLFVBQ1Y7QUFBQSxRQUNKO0FBQUEsUUFDQSxtQkFBbUI7QUFBQSxVQUNmLGdCQUFnQjtBQUFBLFVBQ2hCLFNBQVM7QUFBQSxVQUNULE1BQU07QUFBQSxZQUNGLE1BQU07QUFBQSxZQUNOLGVBQWUsQ0FBQyxRQUFRLFVBQVU7QUFBQSxVQUN0QztBQUFBLFFBQ0o7QUFBQSxRQUNBLGNBQWM7QUFBQSxVQUNWLGdCQUFnQjtBQUFBLFVBQ2hCLFNBQVM7QUFBQSxVQUNULE1BQU07QUFBQSxZQUNGLE1BQU07QUFBQSxVQUNWO0FBQUEsUUFDSjtBQUFBLFFBQ0EsNkJBQTZCO0FBQUEsVUFDekIsZ0JBQWdCO0FBQUEsVUFDaEIsU0FBUztBQUFBLFVBQ1QsTUFBTTtBQUFBLFlBQ0YsTUFBTTtBQUFBLFVBQ1Y7QUFBQSxRQUNKO0FBQUEsUUFDQSx3QkFBd0I7QUFBQSxVQUNwQixnQkFBZ0I7QUFBQSxVQUNoQixTQUFTO0FBQUEsVUFDVCxNQUFNO0FBQUEsWUFDRixNQUFNO0FBQUEsWUFDTixlQUFlLENBQUMsV0FBVyxZQUFZLFFBQVE7QUFBQSxVQUNuRDtBQUFBLFFBQ0o7QUFBQSxRQUNBLFdBQVc7QUFBQSxVQUNQLGdCQUFnQjtBQUFBLFVBQ2hCLFNBQVM7QUFBQSxVQUNULE1BQU07QUFBQSxZQUNGLE1BQU07QUFBQSxVQUNWO0FBQUEsUUFDSjtBQUFBLFFBQ0EsV0FBVztBQUFBLFVBQ1AsZ0JBQWdCO0FBQUEsVUFDaEIsU0FBUztBQUFBLFVBQ1QsTUFBTTtBQUFBLFlBQ0YsTUFBTTtBQUFBLFVBQ1Y7QUFBQSxRQUNKO0FBQUEsTUFDSjtBQUFBLElBQ0o7QUFBQSxFQUNKO0FBQ0EsTUFBTSxvQ0FBb0M7QUFBQSxJQUN0QyxnQkFBZ0I7QUFBQSxJQUNoQixNQUFNO0FBQUEsTUFDRixNQUFNO0FBQUEsTUFDTixXQUFXO0FBQUEsTUFDWCxpQkFBaUI7QUFBQSxRQUNiLFdBQVc7QUFBQSxVQUNQLGdCQUFnQjtBQUFBLFVBQ2hCLFNBQVM7QUFBQSxVQUNULE1BQU07QUFBQSxZQUNGLE1BQU07QUFBQSxVQUNWO0FBQUEsUUFDSjtBQUFBLE1BQ0o7QUFBQSxJQUNKO0FBQUEsRUFDSjtBQUNBLE1BQU0sb0JBQW9CO0FBQUEsSUFDdEIsZ0JBQWdCO0FBQUEsSUFDaEIsTUFBTTtBQUFBLE1BQ0YsTUFBTTtBQUFBLE1BQ04sV0FBVztBQUFBLE1BQ1gsaUJBQWlCO0FBQUEsUUFDYixpQkFBaUI7QUFBQSxVQUNiLGdCQUFnQjtBQUFBLFVBQ2hCLFNBQVM7QUFBQSxVQUNULE1BQU07QUFBQSxZQUNGLE1BQU07QUFBQSxVQUNWO0FBQUEsUUFDSjtBQUFBLFFBQ0EsV0FBVztBQUFBLFVBQ1AsZ0JBQWdCO0FBQUEsVUFDaEIsU0FBUztBQUFBLFVBQ1QsTUFBTTtBQUFBLFlBQ0YsTUFBTTtBQUFBLFVBQ1Y7QUFBQSxRQUNKO0FBQUEsUUFDQSxTQUFTO0FBQUEsVUFDTCxnQkFBZ0I7QUFBQSxVQUNoQixTQUFTO0FBQUEsVUFDVCxNQUFNO0FBQUEsWUFDRixNQUFNO0FBQUEsVUFDVjtBQUFBLFFBQ0o7QUFBQSxRQUNBLE1BQU07QUFBQSxVQUNGLGdCQUFnQjtBQUFBLFVBQ2hCLFNBQVM7QUFBQSxVQUNULE1BQU07QUFBQSxZQUNGLE1BQU07QUFBQSxVQUNWO0FBQUEsUUFDSjtBQUFBLFFBQ0EsV0FBVztBQUFBLFVBQ1AsZ0JBQWdCO0FBQUEsVUFDaEIsU0FBUztBQUFBLFVBQ1QsTUFBTTtBQUFBLFlBQ0YsTUFBTTtBQUFBLFVBQ1Y7QUFBQSxRQUNKO0FBQUEsTUFDSjtBQUFBLElBQ0o7QUFBQSxFQUNKO0FBQ0EsTUFBTSw2QkFBNkI7QUFBQSxJQUMvQixnQkFBZ0I7QUFBQSxJQUNoQixNQUFNO0FBQUEsTUFDRixNQUFNO0FBQUEsTUFDTixXQUFXO0FBQUEsTUFDWCxpQkFBaUI7QUFBQSxRQUNiLFdBQVc7QUFBQSxVQUNQLGdCQUFnQjtBQUFBLFVBQ2hCLFNBQVM7QUFBQSxVQUNULE1BQU07QUFBQSxZQUNGLE1BQU07QUFBQSxVQUNWO0FBQUEsUUFDSjtBQUFBLE1BQ0o7QUFBQSxJQUNKO0FBQUEsRUFDSjtBQUNBLE1BQU0sc0JBQXNCO0FBQUEsSUFDeEIsZ0JBQWdCO0FBQUEsSUFDaEIsTUFBTTtBQUFBLE1BQ0YsTUFBTTtBQUFBLE1BQ04sV0FBVztBQUFBLE1BQ1gsaUJBQWlCO0FBQUEsUUFDYixpQkFBaUI7QUFBQSxVQUNiLGdCQUFnQjtBQUFBLFVBQ2hCLFNBQVM7QUFBQSxVQUNULE1BQU07QUFBQSxZQUNGLE1BQU07QUFBQSxVQUNWO0FBQUEsUUFDSjtBQUFBLFFBQ0EsV0FBVztBQUFBLFVBQ1AsZ0JBQWdCO0FBQUEsVUFDaEIsU0FBUztBQUFBLFVBQ1QsTUFBTTtBQUFBLFlBQ0YsTUFBTTtBQUFBLFVBQ1Y7QUFBQSxRQUNKO0FBQUEsUUFDQSxTQUFTO0FBQUEsVUFDTCxnQkFBZ0I7QUFBQSxVQUNoQixTQUFTO0FBQUEsVUFDVCxNQUFNO0FBQUEsWUFDRixNQUFNO0FBQUEsVUFDVjtBQUFBLFFBQ0o7QUFBQSxRQUNBLE1BQU07QUFBQSxVQUNGLGdCQUFnQjtBQUFBLFVBQ2hCLFNBQVM7QUFBQSxVQUNULE1BQU07QUFBQSxZQUNGLE1BQU07QUFBQSxVQUNWO0FBQUEsUUFDSjtBQUFBLFFBQ0EsV0FBVztBQUFBLFVBQ1AsZ0JBQWdCO0FBQUEsVUFDaEIsU0FBUztBQUFBLFVBQ1QsTUFBTTtBQUFBLFlBQ0YsTUFBTTtBQUFBLFVBQ1Y7QUFBQSxRQUNKO0FBQUEsTUFDSjtBQUFBLElBQ0o7QUFBQSxFQUNKO0FBQ0EsTUFBTSwrQkFBK0I7QUFBQSxJQUNqQyxnQkFBZ0I7QUFBQSxJQUNoQixNQUFNO0FBQUEsTUFDRixNQUFNO0FBQUEsTUFDTixXQUFXO0FBQUEsTUFDWCxpQkFBaUI7QUFBQSxRQUNiLFdBQVc7QUFBQSxVQUNQLGdCQUFnQjtBQUFBLFVBQ2hCLFNBQVM7QUFBQSxVQUNULE1BQU07QUFBQSxZQUNGLE1BQU07QUFBQSxVQUNWO0FBQUEsUUFDSjtBQUFBLE1BQ0o7QUFBQSxJQUNKO0FBQUEsRUFDSjtBQUNBLE1BQU0sdUJBQXVCO0FBQUEsSUFDekIsZ0JBQWdCO0FBQUEsSUFDaEIsTUFBTTtBQUFBLE1BQ0YsTUFBTTtBQUFBLE1BQ04sV0FBVztBQUFBLE1BQ1gsaUJBQWlCO0FBQUEsUUFDYixNQUFNO0FBQUEsVUFDRixnQkFBZ0I7QUFBQSxVQUNoQixTQUFTO0FBQUEsVUFDVCxNQUFNO0FBQUEsWUFDRixNQUFNO0FBQUEsVUFDVjtBQUFBLFFBQ0o7QUFBQSxRQUNBLGNBQWM7QUFBQSxVQUNWLGdCQUFnQjtBQUFBLFVBQ2hCLFNBQVM7QUFBQSxVQUNULE1BQU07QUFBQSxZQUNGLE1BQU07QUFBQSxVQUNWO0FBQUEsUUFDSjtBQUFBLFFBQ0EsaUJBQWlCO0FBQUEsVUFDYixnQkFBZ0I7QUFBQSxVQUNoQixTQUFTO0FBQUEsVUFDVCxNQUFNO0FBQUEsWUFDRixNQUFNO0FBQUEsVUFDVjtBQUFBLFFBQ0o7QUFBQSxRQUNBLFdBQVc7QUFBQSxVQUNQLGdCQUFnQjtBQUFBLFVBQ2hCLFNBQVM7QUFBQSxVQUNULE1BQU07QUFBQSxZQUNGLE1BQU07QUFBQSxVQUNWO0FBQUEsUUFDSjtBQUFBLFFBQ0EsU0FBUztBQUFBLFVBQ0wsZ0JBQWdCO0FBQUEsVUFDaEIsU0FBUztBQUFBLFVBQ1QsTUFBTTtBQUFBLFlBQ0YsTUFBTTtBQUFBLFVBQ1Y7QUFBQSxRQUNKO0FBQUEsUUFDQSxNQUFNO0FBQUEsVUFDRixnQkFBZ0I7QUFBQSxVQUNoQixTQUFTO0FBQUEsVUFDVCxNQUFNO0FBQUEsWUFDRixNQUFNO0FBQUEsVUFDVjtBQUFBLFFBQ0o7QUFBQSxNQUNKO0FBQUEsSUFDSjtBQUFBLEVBQ0o7QUFDQSxNQUFNLGdDQUFnQztBQUFBLElBQ2xDLGdCQUFnQjtBQUFBLElBQ2hCLE1BQU07QUFBQSxNQUNGLE1BQU07QUFBQSxNQUNOLFdBQVc7QUFBQSxNQUNYLGlCQUFpQjtBQUFBLFFBQ2IsV0FBVztBQUFBLFVBQ1AsZ0JBQWdCO0FBQUEsVUFDaEIsU0FBUztBQUFBLFVBQ1QsTUFBTTtBQUFBLFlBQ0YsTUFBTTtBQUFBLFVBQ1Y7QUFBQSxRQUNKO0FBQUEsTUFDSjtBQUFBLElBQ0o7QUFBQSxFQUNKO0FBQ0EsTUFBTSw0QkFBNEI7QUFBQSxJQUM5QixnQkFBZ0I7QUFBQSxJQUNoQixNQUFNO0FBQUEsTUFDRixNQUFNO0FBQUEsTUFDTixXQUFXO0FBQUEsTUFDWCxpQkFBaUI7QUFBQSxRQUNiLE1BQU07QUFBQSxVQUNGLGdCQUFnQjtBQUFBLFVBQ2hCLFNBQVM7QUFBQSxVQUNULE1BQU07QUFBQSxZQUNGLE1BQU07QUFBQSxVQUNWO0FBQUEsUUFDSjtBQUFBLFFBQ0EsY0FBYztBQUFBLFVBQ1YsZ0JBQWdCO0FBQUEsVUFDaEIsU0FBUztBQUFBLFVBQ1QsTUFBTTtBQUFBLFlBQ0YsTUFBTTtBQUFBLFVBQ1Y7QUFBQSxRQUNKO0FBQUEsUUFDQSxvQkFBb0I7QUFBQSxVQUNoQixnQkFBZ0I7QUFBQSxVQUNoQixTQUFTO0FBQUEsVUFDVCxNQUFNO0FBQUEsWUFDRixNQUFNO0FBQUEsVUFDVjtBQUFBLFFBQ0o7QUFBQSxRQUNBLGlCQUFpQjtBQUFBLFVBQ2IsZ0JBQWdCO0FBQUEsVUFDaEIsU0FBUztBQUFBLFVBQ1QsTUFBTTtBQUFBLFlBQ0YsTUFBTTtBQUFBLFVBQ1Y7QUFBQSxRQUNKO0FBQUEsUUFDQSxXQUFXO0FBQUEsVUFDUCxnQkFBZ0I7QUFBQSxVQUNoQixTQUFTO0FBQUEsVUFDVCxNQUFNO0FBQUEsWUFDRixNQUFNO0FBQUEsVUFDVjtBQUFBLFFBQ0o7QUFBQSxRQUNBLFNBQVM7QUFBQSxVQUNMLGdCQUFnQjtBQUFBLFVBQ2hCLFNBQVM7QUFBQSxVQUNULE1BQU07QUFBQSxZQUNGLE1BQU07QUFBQSxVQUNWO0FBQUEsUUFDSjtBQUFBLFFBQ0EsTUFBTTtBQUFBLFVBQ0YsZ0JBQWdCO0FBQUEsVUFDaEIsU0FBUztBQUFBLFVBQ1QsTUFBTTtBQUFBLFlBQ0YsTUFBTTtBQUFBLFVBQ1Y7QUFBQSxRQUNKO0FBQUEsUUFDQSxXQUFXO0FBQUEsVUFDUCxnQkFBZ0I7QUFBQSxVQUNoQixTQUFTO0FBQUEsVUFDVCxNQUFNO0FBQUEsWUFDRixNQUFNO0FBQUEsVUFDVjtBQUFBLFFBQ0o7QUFBQSxNQUNKO0FBQUEsSUFDSjtBQUFBLEVBQ0o7QUFDQSxNQUFNLHFDQUFxQztBQUFBLElBQ3ZDLGdCQUFnQjtBQUFBLElBQ2hCLE1BQU07QUFBQSxNQUNGLE1BQU07QUFBQSxNQUNOLFdBQVc7QUFBQSxNQUNYLGlCQUFpQjtBQUFBLFFBQ2IsV0FBVztBQUFBLFVBQ1AsZ0JBQWdCO0FBQUEsVUFDaEIsU0FBUztBQUFBLFVBQ1QsTUFBTTtBQUFBLFlBQ0YsTUFBTTtBQUFBLFVBQ1Y7QUFBQSxRQUNKO0FBQUEsTUFDSjtBQUFBLElBQ0o7QUFBQSxFQUNKO0FBQ0EsTUFBTSxtQ0FBbUM7QUFBQSxJQUNyQyxnQkFBZ0I7QUFBQSxJQUNoQixNQUFNO0FBQUEsTUFDRixNQUFNO0FBQUEsTUFDTixXQUFXO0FBQUEsTUFDWCxpQkFBaUI7QUFBQSxRQUNiLGlCQUFpQjtBQUFBLFVBQ2IsZ0JBQWdCO0FBQUEsVUFDaEIsU0FBUztBQUFBLFVBQ1QsTUFBTTtBQUFBLFlBQ0YsTUFBTTtBQUFBLFVBQ1Y7QUFBQSxRQUNKO0FBQUEsUUFDQSxXQUFXO0FBQUEsVUFDUCxnQkFBZ0I7QUFBQSxVQUNoQixTQUFTO0FBQUEsVUFDVCxNQUFNO0FBQUEsWUFDRixNQUFNO0FBQUEsVUFDVjtBQUFBLFFBQ0o7QUFBQSxRQUNBLFNBQVM7QUFBQSxVQUNMLGdCQUFnQjtBQUFBLFVBQ2hCLFNBQVM7QUFBQSxVQUNULE1BQU07QUFBQSxZQUNGLE1BQU07QUFBQSxVQUNWO0FBQUEsUUFDSjtBQUFBLFFBQ0EsTUFBTTtBQUFBLFVBQ0YsZ0JBQWdCO0FBQUEsVUFDaEIsU0FBUztBQUFBLFVBQ1QsTUFBTTtBQUFBLFlBQ0YsTUFBTTtBQUFBLFVBQ1Y7QUFBQSxRQUNKO0FBQUEsUUFDQSwwQkFBMEI7QUFBQSxVQUN0QixnQkFBZ0I7QUFBQSxVQUNoQixTQUFTO0FBQUEsVUFDVCxNQUFNO0FBQUEsWUFDRixNQUFNO0FBQUEsVUFDVjtBQUFBLFFBQ0o7QUFBQSxRQUNBLHdCQUF3QjtBQUFBLFVBQ3BCLGdCQUFnQjtBQUFBLFVBQ2hCLFNBQVM7QUFBQSxVQUNULE1BQU07QUFBQSxZQUNGLE1BQU07QUFBQSxZQUNOLGVBQWUsQ0FBQyxXQUFXLFlBQVksUUFBUTtBQUFBLFVBQ25EO0FBQUEsUUFDSjtBQUFBLE1BQ0o7QUFBQSxJQUNKO0FBQUEsRUFDSjtBQUNBLE1BQU0sNENBQTRDO0FBQUEsSUFDOUMsZ0JBQWdCO0FBQUEsSUFDaEIsTUFBTTtBQUFBLE1BQ0YsTUFBTTtBQUFBLE1BQ04sV0FBVztBQUFBLE1BQ1gsaUJBQWlCO0FBQUEsUUFDYixXQUFXO0FBQUEsVUFDUCxnQkFBZ0I7QUFBQSxVQUNoQixTQUFTO0FBQUEsVUFDVCxNQUFNO0FBQUEsWUFDRixNQUFNO0FBQUEsVUFDVjtBQUFBLFFBQ0o7QUFBQSxNQUNKO0FBQUEsSUFDSjtBQUFBLEVBQ0o7QUFDQSxNQUFNLHNDQUFzQztBQUFBLElBQ3hDLGdCQUFnQjtBQUFBLElBQ2hCLE1BQU07QUFBQSxNQUNGLE1BQU07QUFBQSxNQUNOLFdBQVc7QUFBQSxNQUNYLGlCQUFpQjtBQUFBLFFBQ2IsaUJBQWlCO0FBQUEsVUFDYixnQkFBZ0I7QUFBQSxVQUNoQixTQUFTO0FBQUEsVUFDVCxNQUFNO0FBQUEsWUFDRixNQUFNO0FBQUEsVUFDVjtBQUFBLFFBQ0o7QUFBQSxRQUNBLFdBQVc7QUFBQSxVQUNQLGdCQUFnQjtBQUFBLFVBQ2hCLFNBQVM7QUFBQSxVQUNULE1BQU07QUFBQSxZQUNGLE1BQU07QUFBQSxVQUNWO0FBQUEsUUFDSjtBQUFBLFFBQ0EsU0FBUztBQUFBLFVBQ0wsZ0JBQWdCO0FBQUEsVUFDaEIsU0FBUztBQUFBLFVBQ1QsTUFBTTtBQUFBLFlBQ0YsTUFBTTtBQUFBLFVBQ1Y7QUFBQSxRQUNKO0FBQUEsUUFDQSxNQUFNO0FBQUEsVUFDRixnQkFBZ0I7QUFBQSxVQUNoQixTQUFTO0FBQUEsVUFDVCxNQUFNO0FBQUEsWUFDRixNQUFNO0FBQUEsVUFDVjtBQUFBLFFBQ0o7QUFBQSxNQUNKO0FBQUEsSUFDSjtBQUFBLEVBQ0o7QUFDQSxNQUFNLCtDQUErQztBQUFBLElBQ2pELGdCQUFnQjtBQUFBLElBQ2hCLE1BQU07QUFBQSxNQUNGLE1BQU07QUFBQSxNQUNOLFdBQVc7QUFBQSxNQUNYLGlCQUFpQjtBQUFBLFFBQ2IsV0FBVztBQUFBLFVBQ1AsZ0JBQWdCO0FBQUEsVUFDaEIsU0FBUztBQUFBLFVBQ1QsTUFBTTtBQUFBLFlBQ0YsTUFBTTtBQUFBLFVBQ1Y7QUFBQSxRQUNKO0FBQUEsTUFDSjtBQUFBLElBQ0o7QUFBQSxFQUNKO0FBQ0EsTUFBTSwwQkFBMEI7QUFBQSxJQUM1QixnQkFBZ0I7QUFBQSxJQUNoQixNQUFNO0FBQUEsTUFDRixNQUFNO0FBQUEsTUFDTixXQUFXO0FBQUEsTUFDWCxpQkFBaUI7QUFBQSxRQUNiLGlCQUFpQjtBQUFBLFVBQ2IsZ0JBQWdCO0FBQUEsVUFDaEIsU0FBUztBQUFBLFVBQ1QsTUFBTTtBQUFBLFlBQ0YsTUFBTTtBQUFBLFVBQ1Y7QUFBQSxRQUNKO0FBQUEsUUFDQSxXQUFXO0FBQUEsVUFDUCxnQkFBZ0I7QUFBQSxVQUNoQixTQUFTO0FBQUEsVUFDVCxNQUFNO0FBQUEsWUFDRixNQUFNO0FBQUEsVUFDVjtBQUFBLFFBQ0o7QUFBQSxRQUNBLFNBQVM7QUFBQSxVQUNMLGdCQUFnQjtBQUFBLFVBQ2hCLFNBQVM7QUFBQSxVQUNULE1BQU07QUFBQSxZQUNGLE1BQU07QUFBQSxVQUNWO0FBQUEsUUFDSjtBQUFBLFFBQ0EsTUFBTTtBQUFBLFVBQ0YsZ0JBQWdCO0FBQUEsVUFDaEIsU0FBUztBQUFBLFVBQ1QsTUFBTTtBQUFBLFlBQ0YsTUFBTTtBQUFBLFVBQ1Y7QUFBQSxRQUNKO0FBQUEsUUFDQSxXQUFXO0FBQUEsVUFDUCxnQkFBZ0I7QUFBQSxVQUNoQixTQUFTO0FBQUEsVUFDVCxNQUFNO0FBQUEsWUFDRixNQUFNO0FBQUEsVUFDVjtBQUFBLFFBQ0o7QUFBQSxNQUNKO0FBQUEsSUFDSjtBQUFBLEVBQ0o7QUFDQSxNQUFNLG1DQUFtQztBQUFBLElBQ3JDLGdCQUFnQjtBQUFBLElBQ2hCLE1BQU07QUFBQSxNQUNGLE1BQU07QUFBQSxNQUNOLFdBQVc7QUFBQSxNQUNYLGlCQUFpQjtBQUFBLFFBQ2IsV0FBVztBQUFBLFVBQ1AsZ0JBQWdCO0FBQUEsVUFDaEIsU0FBUztBQUFBLFVBQ1QsTUFBTTtBQUFBLFlBQ0YsTUFBTTtBQUFBLFVBQ1Y7QUFBQSxRQUNKO0FBQUEsTUFDSjtBQUFBLElBQ0o7QUFBQSxFQUNKO0FBQ0EsTUFBTSx5QkFBeUI7QUFBQSxJQUMzQixnQkFBZ0I7QUFBQSxJQUNoQixNQUFNO0FBQUEsTUFDRixNQUFNO0FBQUEsTUFDTixXQUFXO0FBQUEsTUFDWCxpQkFBaUI7QUFBQSxRQUNiLE1BQU07QUFBQSxVQUNGLGdCQUFnQjtBQUFBLFVBQ2hCLFNBQVM7QUFBQSxVQUNULE1BQU07QUFBQSxZQUNGLE1BQU07QUFBQSxVQUNWO0FBQUEsUUFDSjtBQUFBLFFBQ0EsY0FBYztBQUFBLFVBQ1YsZ0JBQWdCO0FBQUEsVUFDaEIsU0FBUztBQUFBLFVBQ1QsTUFBTTtBQUFBLFlBQ0YsTUFBTTtBQUFBLFVBQ1Y7QUFBQSxRQUNKO0FBQUEsUUFDQSxpQkFBaUI7QUFBQSxVQUNiLGdCQUFnQjtBQUFBLFVBQ2hCLFNBQVM7QUFBQSxVQUNULE1BQU07QUFBQSxZQUNGLE1BQU07QUFBQSxVQUNWO0FBQUEsUUFDSjtBQUFBLFFBQ0EsV0FBVztBQUFBLFVBQ1AsZ0JBQWdCO0FBQUEsVUFDaEIsU0FBUztBQUFBLFVBQ1QsTUFBTTtBQUFBLFlBQ0YsTUFBTTtBQUFBLFVBQ1Y7QUFBQSxRQUNKO0FBQUEsUUFDQSxTQUFTO0FBQUEsVUFDTCxnQkFBZ0I7QUFBQSxVQUNoQixTQUFTO0FBQUEsVUFDVCxNQUFNO0FBQUEsWUFDRixNQUFNO0FBQUEsVUFDVjtBQUFBLFFBQ0o7QUFBQSxRQUNBLFdBQVc7QUFBQSxVQUNQLGdCQUFnQjtBQUFBLFVBQ2hCLFNBQVM7QUFBQSxVQUNULE1BQU07QUFBQSxZQUNGLE1BQU07QUFBQSxVQUNWO0FBQUEsUUFDSjtBQUFBLFFBQ0EsTUFBTTtBQUFBLFVBQ0YsZ0JBQWdCO0FBQUEsVUFDaEIsU0FBUztBQUFBLFVBQ1QsTUFBTTtBQUFBLFlBQ0YsTUFBTTtBQUFBLFVBQ1Y7QUFBQSxRQUNKO0FBQUEsUUFDQSxtQkFBbUI7QUFBQSxVQUNmLGdCQUFnQjtBQUFBLFVBQ2hCLFNBQVM7QUFBQSxVQUNULE1BQU07QUFBQSxZQUNGLE1BQU07QUFBQSxVQUNWO0FBQUEsUUFDSjtBQUFBLFFBQ0EscUJBQXFCO0FBQUEsVUFDakIsZ0JBQWdCO0FBQUEsVUFDaEIsU0FBUztBQUFBLFVBQ1QsTUFBTTtBQUFBLFlBQ0YsTUFBTTtBQUFBLFVBQ1Y7QUFBQSxRQUNKO0FBQUEsUUFDQSxpQkFBaUI7QUFBQSxVQUNiLGdCQUFnQjtBQUFBLFVBQ2hCLFNBQVM7QUFBQSxVQUNULE1BQU07QUFBQSxZQUNGLE1BQU07QUFBQSxVQUNWO0FBQUEsUUFDSjtBQUFBLFFBQ0EsV0FBVztBQUFBLFVBQ1AsZ0JBQWdCO0FBQUEsVUFDaEIsU0FBUztBQUFBLFVBQ1QsTUFBTTtBQUFBLFlBQ0YsTUFBTTtBQUFBLFVBQ1Y7QUFBQSxRQUNKO0FBQUEsTUFDSjtBQUFBLElBQ0o7QUFBQSxFQUNKO0FBQ0EsTUFBTSxrQ0FBa0M7QUFBQSxJQUNwQyxnQkFBZ0I7QUFBQSxJQUNoQixNQUFNO0FBQUEsTUFDRixNQUFNO0FBQUEsTUFDTixXQUFXO0FBQUEsTUFDWCxpQkFBaUI7QUFBQSxRQUNiLFdBQVc7QUFBQSxVQUNQLGdCQUFnQjtBQUFBLFVBQ2hCLFNBQVM7QUFBQSxVQUNULE1BQU07QUFBQSxZQUNGLE1BQU07QUFBQSxVQUNWO0FBQUEsUUFDSjtBQUFBLE1BQ0o7QUFBQSxJQUNKO0FBQUEsRUFDSjtBQUNBLE1BQU0sMEJBQTBCO0FBQUEsSUFDNUIsZ0JBQWdCO0FBQUEsSUFDaEIsTUFBTTtBQUFBLE1BQ0YsTUFBTTtBQUFBLE1BQ04sV0FBVztBQUFBLE1BQ1gsaUJBQWlCO0FBQUEsUUFDYixNQUFNO0FBQUEsVUFDRixnQkFBZ0I7QUFBQSxVQUNoQixTQUFTO0FBQUEsVUFDVCxNQUFNO0FBQUEsWUFDRixNQUFNO0FBQUEsVUFDVjtBQUFBLFFBQ0o7QUFBQSxRQUNBLGNBQWM7QUFBQSxVQUNWLGdCQUFnQjtBQUFBLFVBQ2hCLFNBQVM7QUFBQSxVQUNULE1BQU07QUFBQSxZQUNGLE1BQU07QUFBQSxVQUNWO0FBQUEsUUFDSjtBQUFBLFFBQ0EsU0FBUztBQUFBLFVBQ0wsZ0JBQWdCO0FBQUEsVUFDaEIsU0FBUztBQUFBLFVBQ1QsTUFBTTtBQUFBLFlBQ0YsTUFBTTtBQUFBLFVBQ1Y7QUFBQSxRQUNKO0FBQUEsUUFDQSxpQkFBaUI7QUFBQSxVQUNiLGdCQUFnQjtBQUFBLFVBQ2hCLFNBQVM7QUFBQSxVQUNULE1BQU07QUFBQSxZQUNGLE1BQU07QUFBQSxVQUNWO0FBQUEsUUFDSjtBQUFBLFFBQ0EsV0FBVztBQUFBLFVBQ1AsZ0JBQWdCO0FBQUEsVUFDaEIsU0FBUztBQUFBLFVBQ1QsTUFBTTtBQUFBLFlBQ0YsTUFBTTtBQUFBLFVBQ1Y7QUFBQSxRQUNKO0FBQUEsUUFDQSxTQUFTO0FBQUEsVUFDTCxnQkFBZ0I7QUFBQSxVQUNoQixTQUFTO0FBQUEsVUFDVCxNQUFNO0FBQUEsWUFDRixNQUFNO0FBQUEsVUFDVjtBQUFBLFFBQ0o7QUFBQSxRQUNBLE1BQU07QUFBQSxVQUNGLGdCQUFnQjtBQUFBLFVBQ2hCLFNBQVM7QUFBQSxVQUNULE1BQU07QUFBQSxZQUNGLE1BQU07QUFBQSxVQUNWO0FBQUEsUUFDSjtBQUFBLE1BQ0o7QUFBQSxJQUNKO0FBQUEsRUFDSjtBQUNBLE1BQU0sbUNBQW1DO0FBQUEsSUFDckMsZ0JBQWdCO0FBQUEsSUFDaEIsTUFBTTtBQUFBLE1BQ0YsTUFBTTtBQUFBLE1BQ04sV0FBVztBQUFBLE1BQ1gsaUJBQWlCO0FBQUEsUUFDYixXQUFXO0FBQUEsVUFDUCxnQkFBZ0I7QUFBQSxVQUNoQixTQUFTO0FBQUEsVUFDVCxNQUFNO0FBQUEsWUFDRixNQUFNO0FBQUEsVUFDVjtBQUFBLFFBQ0o7QUFBQSxNQUNKO0FBQUEsSUFDSjtBQUFBLEVBQ0o7QUFDQSxNQUFNLDBCQUEwQjtBQUFBLElBQzVCLGdCQUFnQjtBQUFBLElBQ2hCLE1BQU07QUFBQSxNQUNGLE1BQU07QUFBQSxNQUNOLFdBQVc7QUFBQSxNQUNYLGlCQUFpQjtBQUFBLFFBQ2IsTUFBTTtBQUFBLFVBQ0YsZ0JBQWdCO0FBQUEsVUFDaEIsU0FBUztBQUFBLFVBQ1QsTUFBTTtBQUFBLFlBQ0YsTUFBTTtBQUFBLFVBQ1Y7QUFBQSxRQUNKO0FBQUEsUUFDQSxjQUFjO0FBQUEsVUFDVixnQkFBZ0I7QUFBQSxVQUNoQixTQUFTO0FBQUEsVUFDVCxNQUFNO0FBQUEsWUFDRixNQUFNO0FBQUEsVUFDVjtBQUFBLFFBQ0o7QUFBQSxRQUNBLGlCQUFpQjtBQUFBLFVBQ2IsZ0JBQWdCO0FBQUEsVUFDaEIsU0FBUztBQUFBLFVBQ1QsTUFBTTtBQUFBLFlBQ0YsTUFBTTtBQUFBLFVBQ1Y7QUFBQSxRQUNKO0FBQUEsUUFDQSxXQUFXO0FBQUEsVUFDUCxnQkFBZ0I7QUFBQSxVQUNoQixTQUFTO0FBQUEsVUFDVCxNQUFNO0FBQUEsWUFDRixNQUFNO0FBQUEsVUFDVjtBQUFBLFFBQ0o7QUFBQSxRQUNBLFNBQVM7QUFBQSxVQUNMLGdCQUFnQjtBQUFBLFVBQ2hCLFNBQVM7QUFBQSxVQUNULE1BQU07QUFBQSxZQUNGLE1BQU07QUFBQSxVQUNWO0FBQUEsUUFDSjtBQUFBLFFBQ0EsTUFBTTtBQUFBLFVBQ0YsZ0JBQWdCO0FBQUEsVUFDaEIsU0FBUztBQUFBLFVBQ1QsTUFBTTtBQUFBLFlBQ0YsTUFBTTtBQUFBLFVBQ1Y7QUFBQSxRQUNKO0FBQUEsTUFDSjtBQUFBLElBQ0o7QUFBQSxFQUNKO0FBQ0EsTUFBTSxtQ0FBbUM7QUFBQSxJQUNyQyxnQkFBZ0I7QUFBQSxJQUNoQixNQUFNO0FBQUEsTUFDRixNQUFNO0FBQUEsTUFDTixXQUFXO0FBQUEsTUFDWCxpQkFBaUI7QUFBQSxRQUNiLFdBQVc7QUFBQSxVQUNQLGdCQUFnQjtBQUFBLFVBQ2hCLFNBQVM7QUFBQSxVQUNULE1BQU07QUFBQSxZQUNGLE1BQU07QUFBQSxVQUNWO0FBQUEsUUFDSjtBQUFBLE1BQ0o7QUFBQSxJQUNKO0FBQUEsRUFDSjtBQUNBLE1BQU0sd0JBQXdCO0FBQUEsSUFDMUIsZ0JBQWdCO0FBQUEsSUFDaEIsTUFBTTtBQUFBLE1BQ0YsTUFBTTtBQUFBLE1BQ04sV0FBVztBQUFBLE1BQ1gsaUJBQWlCO0FBQUEsUUFDYixNQUFNO0FBQUEsVUFDRixnQkFBZ0I7QUFBQSxVQUNoQixTQUFTO0FBQUEsVUFDVCxNQUFNO0FBQUEsWUFDRixNQUFNO0FBQUEsVUFDVjtBQUFBLFFBQ0o7QUFBQSxRQUNBLGNBQWM7QUFBQSxVQUNWLGdCQUFnQjtBQUFBLFVBQ2hCLFNBQVM7QUFBQSxVQUNULE1BQU07QUFBQSxZQUNGLE1BQU07QUFBQSxVQUNWO0FBQUEsUUFDSjtBQUFBLFFBQ0EsU0FBUztBQUFBLFVBQ0wsZ0JBQWdCO0FBQUEsVUFDaEIsU0FBUztBQUFBLFVBQ1QsTUFBTTtBQUFBLFlBQ0YsTUFBTTtBQUFBLFVBQ1Y7QUFBQSxRQUNKO0FBQUEsUUFDQSxpQkFBaUI7QUFBQSxVQUNiLGdCQUFnQjtBQUFBLFVBQ2hCLFNBQVM7QUFBQSxVQUNULE1BQU07QUFBQSxZQUNGLE1BQU07QUFBQSxVQUNWO0FBQUEsUUFDSjtBQUFBLFFBQ0EsV0FBVztBQUFBLFVBQ1AsZ0JBQWdCO0FBQUEsVUFDaEIsU0FBUztBQUFBLFVBQ1QsTUFBTTtBQUFBLFlBQ0YsTUFBTTtBQUFBLFVBQ1Y7QUFBQSxRQUNKO0FBQUEsUUFDQSxTQUFTO0FBQUEsVUFDTCxnQkFBZ0I7QUFBQSxVQUNoQixTQUFTO0FBQUEsVUFDVCxNQUFNO0FBQUEsWUFDRixNQUFNO0FBQUEsVUFDVjtBQUFBLFFBQ0o7QUFBQSxRQUNBLE1BQU07QUFBQSxVQUNGLGdCQUFnQjtBQUFBLFVBQ2hCLFNBQVM7QUFBQSxVQUNULE1BQU07QUFBQSxZQUNGLE1BQU07QUFBQSxVQUNWO0FBQUEsUUFDSjtBQUFBLE1BQ0o7QUFBQSxJQUNKO0FBQUEsRUFDSjtBQUNBLE1BQU0saUNBQWlDO0FBQUEsSUFDbkMsZ0JBQWdCO0FBQUEsSUFDaEIsTUFBTTtBQUFBLE1BQ0YsTUFBTTtBQUFBLE1BQ04sV0FBVztBQUFBLE1BQ1gsaUJBQWlCO0FBQUEsUUFDYixXQUFXO0FBQUEsVUFDUCxnQkFBZ0I7QUFBQSxVQUNoQixTQUFTO0FBQUEsVUFDVCxNQUFNO0FBQUEsWUFDRixNQUFNO0FBQUEsVUFDVjtBQUFBLFFBQ0o7QUFBQSxNQUNKO0FBQUEsSUFDSjtBQUFBLEVBQ0o7QUFDQSxNQUFNLHlCQUF5QjtBQUFBLElBQzNCLGdCQUFnQjtBQUFBLElBQ2hCLE1BQU07QUFBQSxNQUNGLE1BQU07QUFBQSxNQUNOLFdBQVc7QUFBQSxNQUNYLGlCQUFpQjtBQUFBLFFBQ2IsTUFBTTtBQUFBLFVBQ0YsZ0JBQWdCO0FBQUEsVUFDaEIsU0FBUztBQUFBLFVBQ1QsTUFBTTtBQUFBLFlBQ0YsTUFBTTtBQUFBLFVBQ1Y7QUFBQSxRQUNKO0FBQUEsUUFDQSxjQUFjO0FBQUEsVUFDVixnQkFBZ0I7QUFBQSxVQUNoQixTQUFTO0FBQUEsVUFDVCxNQUFNO0FBQUEsWUFDRixNQUFNO0FBQUEsVUFDVjtBQUFBLFFBQ0o7QUFBQSxRQUNBLGlCQUFpQjtBQUFBLFVBQ2IsZ0JBQWdCO0FBQUEsVUFDaEIsU0FBUztBQUFBLFVBQ1QsTUFBTTtBQUFBLFlBQ0YsTUFBTTtBQUFBLFVBQ1Y7QUFBQSxRQUNKO0FBQUEsUUFDQSxXQUFXO0FBQUEsVUFDUCxnQkFBZ0I7QUFBQSxVQUNoQixTQUFTO0FBQUEsVUFDVCxNQUFNO0FBQUEsWUFDRixNQUFNO0FBQUEsVUFDVjtBQUFBLFFBQ0o7QUFBQSxRQUNBLFNBQVM7QUFBQSxVQUNMLGdCQUFnQjtBQUFBLFVBQ2hCLFNBQVM7QUFBQSxVQUNULE1BQU07QUFBQSxZQUNGLE1BQU07QUFBQSxVQUNWO0FBQUEsUUFDSjtBQUFBLFFBQ0EsU0FBUztBQUFBLFVBQ0wsZ0JBQWdCO0FBQUEsVUFDaEIsU0FBUztBQUFBLFVBQ1QsTUFBTTtBQUFBLFlBQ0YsTUFBTTtBQUFBLFVBQ1Y7QUFBQSxRQUNKO0FBQUEsUUFDQSxNQUFNO0FBQUEsVUFDRixnQkFBZ0I7QUFBQSxVQUNoQixTQUFTO0FBQUEsVUFDVCxNQUFNO0FBQUEsWUFDRixNQUFNO0FBQUEsVUFDVjtBQUFBLFFBQ0o7QUFBQSxNQUNKO0FBQUEsSUFDSjtBQUFBLEVBQ0o7QUFDQSxNQUFNLGtDQUFrQztBQUFBLElBQ3BDLGdCQUFnQjtBQUFBLElBQ2hCLE1BQU07QUFBQSxNQUNGLE1BQU07QUFBQSxNQUNOLFdBQVc7QUFBQSxNQUNYLGlCQUFpQjtBQUFBLFFBQ2IsV0FBVztBQUFBLFVBQ1AsZ0JBQWdCO0FBQUEsVUFDaEIsU0FBUztBQUFBLFVBQ1QsTUFBTTtBQUFBLFlBQ0YsTUFBTTtBQUFBLFVBQ1Y7QUFBQSxRQUNKO0FBQUEsTUFDSjtBQUFBLElBQ0o7QUFBQSxFQUNKO0FBQ0EsTUFBTSx3QkFBd0I7QUFBQSxJQUMxQixnQkFBZ0I7QUFBQSxJQUNoQixNQUFNO0FBQUEsTUFDRixNQUFNO0FBQUEsTUFDTixXQUFXO0FBQUEsTUFDWCxpQkFBaUI7QUFBQSxRQUNiLE1BQU07QUFBQSxVQUNGLGdCQUFnQjtBQUFBLFVBQ2hCLFNBQVM7QUFBQSxVQUNULE1BQU07QUFBQSxZQUNGLE1BQU07QUFBQSxVQUNWO0FBQUEsUUFDSjtBQUFBLFFBQ0EsY0FBYztBQUFBLFVBQ1YsZ0JBQWdCO0FBQUEsVUFDaEIsU0FBUztBQUFBLFVBQ1QsTUFBTTtBQUFBLFlBQ0YsTUFBTTtBQUFBLFVBQ1Y7QUFBQSxRQUNKO0FBQUEsUUFDQSxXQUFXO0FBQUEsVUFDUCxnQkFBZ0I7QUFBQSxVQUNoQixTQUFTO0FBQUEsVUFDVCxNQUFNO0FBQUEsWUFDRixNQUFNO0FBQUEsVUFDVjtBQUFBLFFBQ0o7QUFBQSxRQUNBLGlCQUFpQjtBQUFBLFVBQ2IsZ0JBQWdCO0FBQUEsVUFDaEIsU0FBUztBQUFBLFVBQ1QsTUFBTTtBQUFBLFlBQ0YsTUFBTTtBQUFBLFVBQ1Y7QUFBQSxRQUNKO0FBQUEsUUFDQSxXQUFXO0FBQUEsVUFDUCxnQkFBZ0I7QUFBQSxVQUNoQixTQUFTO0FBQUEsVUFDVCxNQUFNO0FBQUEsWUFDRixNQUFNO0FBQUEsVUFDVjtBQUFBLFFBQ0o7QUFBQSxRQUNBLFNBQVM7QUFBQSxVQUNMLGdCQUFnQjtBQUFBLFVBQ2hCLFNBQVM7QUFBQSxVQUNULE1BQU07QUFBQSxZQUNGLE1BQU07QUFBQSxVQUNWO0FBQUEsUUFDSjtBQUFBLFFBQ0EsTUFBTTtBQUFBLFVBQ0YsZ0JBQWdCO0FBQUEsVUFDaEIsU0FBUztBQUFBLFVBQ1QsTUFBTTtBQUFBLFlBQ0YsTUFBTTtBQUFBLFVBQ1Y7QUFBQSxRQUNKO0FBQUEsTUFDSjtBQUFBLElBQ0o7QUFBQSxFQUNKO0FBQ0EsTUFBTSxpQ0FBaUM7QUFBQSxJQUNuQyxnQkFBZ0I7QUFBQSxJQUNoQixNQUFNO0FBQUEsTUFDRixNQUFNO0FBQUEsTUFDTixXQUFXO0FBQUEsTUFDWCxpQkFBaUI7QUFBQSxRQUNiLFdBQVc7QUFBQSxVQUNQLGdCQUFnQjtBQUFBLFVBQ2hCLFNBQVM7QUFBQSxVQUNULE1BQU07QUFBQSxZQUNGLE1BQU07QUFBQSxVQUNWO0FBQUEsUUFDSjtBQUFBLE1BQ0o7QUFBQSxJQUNKO0FBQUEsRUFDSjtBQUNBLE1BQU0sNEJBQTRCO0FBQUEsSUFDOUIsZ0JBQWdCO0FBQUEsSUFDaEIsTUFBTTtBQUFBLE1BQ0YsTUFBTTtBQUFBLE1BQ04sV0FBVztBQUFBLE1BQ1gsaUJBQWlCO0FBQUEsUUFDYixVQUFVO0FBQUEsVUFDTixnQkFBZ0I7QUFBQSxVQUNoQixTQUFTO0FBQUEsVUFDVCxNQUFNO0FBQUEsWUFDRixNQUFNO0FBQUEsVUFDVjtBQUFBLFFBQ0o7QUFBQSxRQUNBLE1BQU07QUFBQSxVQUNGLGdCQUFnQjtBQUFBLFVBQ2hCLFNBQVM7QUFBQSxVQUNULE1BQU07QUFBQSxZQUNGLE1BQU07QUFBQSxVQUNWO0FBQUEsUUFDSjtBQUFBLFFBQ0EsY0FBYztBQUFBLFVBQ1YsZ0JBQWdCO0FBQUEsVUFDaEIsU0FBUztBQUFBLFVBQ1QsTUFBTTtBQUFBLFlBQ0YsTUFBTTtBQUFBLFVBQ1Y7QUFBQSxRQUNKO0FBQUEsUUFDQSxpQkFBaUI7QUFBQSxVQUNiLGdCQUFnQjtBQUFBLFVBQ2hCLFNBQVM7QUFBQSxVQUNULE1BQU07QUFBQSxZQUNGLE1BQU07QUFBQSxVQUNWO0FBQUEsUUFDSjtBQUFBLFFBQ0EsV0FBVztBQUFBLFVBQ1AsZ0JBQWdCO0FBQUEsVUFDaEIsU0FBUztBQUFBLFVBQ1QsTUFBTTtBQUFBLFlBQ0YsTUFBTTtBQUFBLFVBQ1Y7QUFBQSxRQUNKO0FBQUEsUUFDQSxTQUFTO0FBQUEsVUFDTCxnQkFBZ0I7QUFBQSxVQUNoQixTQUFTO0FBQUEsVUFDVCxNQUFNO0FBQUEsWUFDRixNQUFNO0FBQUEsVUFDVjtBQUFBLFFBQ0o7QUFBQSxRQUNBLFdBQVc7QUFBQSxVQUNQLGdCQUFnQjtBQUFBLFVBQ2hCLFNBQVM7QUFBQSxVQUNULE1BQU07QUFBQSxZQUNGLE1BQU07QUFBQSxVQUNWO0FBQUEsUUFDSjtBQUFBLFFBQ0EsTUFBTTtBQUFBLFVBQ0YsZ0JBQWdCO0FBQUEsVUFDaEIsU0FBUztBQUFBLFVBQ1QsTUFBTTtBQUFBLFlBQ0YsTUFBTTtBQUFBLFVBQ1Y7QUFBQSxRQUNKO0FBQUEsUUFDQSxtQkFBbUI7QUFBQSxVQUNmLGdCQUFnQjtBQUFBLFVBQ2hCLFNBQVM7QUFBQSxVQUNULE1BQU07QUFBQSxZQUNGLE1BQU07QUFBQSxVQUNWO0FBQUEsUUFDSjtBQUFBLFFBQ0EsV0FBVztBQUFBLFVBQ1AsZ0JBQWdCO0FBQUEsVUFDaEIsU0FBUztBQUFBLFVBQ1QsTUFBTTtBQUFBLFlBQ0YsTUFBTTtBQUFBLFVBQ1Y7QUFBQSxRQUNKO0FBQUEsTUFDSjtBQUFBLElBQ0o7QUFBQSxFQUNKO0FBQ0EsTUFBTSxxQ0FBcUM7QUFBQSxJQUN2QyxnQkFBZ0I7QUFBQSxJQUNoQixNQUFNO0FBQUEsTUFDRixNQUFNO0FBQUEsTUFDTixXQUFXO0FBQUEsTUFDWCxpQkFBaUI7QUFBQSxRQUNiLFdBQVc7QUFBQSxVQUNQLGdCQUFnQjtBQUFBLFVBQ2hCLFNBQVM7QUFBQSxVQUNULE1BQU07QUFBQSxZQUNGLE1BQU07QUFBQSxVQUNWO0FBQUEsUUFDSjtBQUFBLE1BQ0o7QUFBQSxJQUNKO0FBQUEsRUFDSjtBQUNBLE1BQU0sOEJBQThCO0FBQUEsSUFDaEMsZ0JBQWdCO0FBQUEsSUFDaEIsTUFBTTtBQUFBLE1BQ0YsTUFBTTtBQUFBLE1BQ04sV0FBVztBQUFBLE1BQ1gsaUJBQWlCO0FBQUEsUUFDYixNQUFNO0FBQUEsVUFDRixnQkFBZ0I7QUFBQSxVQUNoQixTQUFTO0FBQUEsVUFDVCxNQUFNO0FBQUEsWUFDRixNQUFNO0FBQUEsVUFDVjtBQUFBLFFBQ0o7QUFBQSxRQUNBLGNBQWM7QUFBQSxVQUNWLGdCQUFnQjtBQUFBLFVBQ2hCLFNBQVM7QUFBQSxVQUNULE1BQU07QUFBQSxZQUNGLE1BQU07QUFBQSxVQUNWO0FBQUEsUUFDSjtBQUFBLFFBQ0EsaUJBQWlCO0FBQUEsVUFDYixnQkFBZ0I7QUFBQSxVQUNoQixTQUFTO0FBQUEsVUFDVCxNQUFNO0FBQUEsWUFDRixNQUFNO0FBQUEsVUFDVjtBQUFBLFFBQ0o7QUFBQSxRQUNBLFdBQVc7QUFBQSxVQUNQLGdCQUFnQjtBQUFBLFVBQ2hCLFNBQVM7QUFBQSxVQUNULE1BQU07QUFBQSxZQUNGLE1BQU07QUFBQSxVQUNWO0FBQUEsUUFDSjtBQUFBLFFBQ0EsU0FBUztBQUFBLFVBQ0wsZ0JBQWdCO0FBQUEsVUFDaEIsU0FBUztBQUFBLFVBQ1QsTUFBTTtBQUFBLFlBQ0YsTUFBTTtBQUFBLFVBQ1Y7QUFBQSxRQUNKO0FBQUEsUUFDQSxXQUFXO0FBQUEsVUFDUCxnQkFBZ0I7QUFBQSxVQUNoQixTQUFTO0FBQUEsVUFDVCxNQUFNO0FBQUEsWUFDRixNQUFNO0FBQUEsVUFDVjtBQUFBLFFBQ0o7QUFBQSxRQUNBLE1BQU07QUFBQSxVQUNGLGdCQUFnQjtBQUFBLFVBQ2hCLFNBQVM7QUFBQSxVQUNULE1BQU07QUFBQSxZQUNGLE1BQU07QUFBQSxVQUNWO0FBQUEsUUFDSjtBQUFBLFFBQ0EsUUFBUTtBQUFBLFVBQ0osZ0JBQWdCO0FBQUEsVUFDaEIsU0FBUztBQUFBLFVBQ1QsTUFBTTtBQUFBLFlBQ0YsTUFBTTtBQUFBLFVBQ1Y7QUFBQSxRQUNKO0FBQUEsUUFDQSxZQUFZO0FBQUEsVUFDUixnQkFBZ0I7QUFBQSxVQUNoQixTQUFTO0FBQUEsVUFDVCxNQUFNO0FBQUEsWUFDRixNQUFNO0FBQUEsWUFDTixlQUFlLENBQUMsV0FBVyxXQUFXLFdBQVcsUUFBUTtBQUFBLFVBQzdEO0FBQUEsUUFDSjtBQUFBLFFBQ0EsV0FBVztBQUFBLFVBQ1AsZ0JBQWdCO0FBQUEsVUFDaEIsU0FBUztBQUFBLFVBQ1QsTUFBTTtBQUFBLFlBQ0YsTUFBTTtBQUFBLFVBQ1Y7QUFBQSxRQUNKO0FBQUEsTUFDSjtBQUFBLElBQ0o7QUFBQSxFQUNKO0FBQ0EsTUFBTSx1Q0FBdUM7QUFBQSxJQUN6QyxnQkFBZ0I7QUFBQSxJQUNoQixNQUFNO0FBQUEsTUFDRixNQUFNO0FBQUEsTUFDTixXQUFXO0FBQUEsTUFDWCxpQkFBaUI7QUFBQSxRQUNiLFdBQVc7QUFBQSxVQUNQLGdCQUFnQjtBQUFBLFVBQ2hCLFNBQVM7QUFBQSxVQUNULE1BQU07QUFBQSxZQUNGLE1BQU07QUFBQSxVQUNWO0FBQUEsUUFDSjtBQUFBLE1BQ0o7QUFBQSxJQUNKO0FBQUEsRUFDSjtBQUNBLE1BQU0seUJBQXlCO0FBQUEsSUFDM0IsZ0JBQWdCO0FBQUEsSUFDaEIsTUFBTTtBQUFBLE1BQ0YsTUFBTTtBQUFBLE1BQ04sV0FBVztBQUFBLE1BQ1gsaUJBQWlCO0FBQUEsUUFDYixNQUFNO0FBQUEsVUFDRixnQkFBZ0I7QUFBQSxVQUNoQixTQUFTO0FBQUEsVUFDVCxNQUFNO0FBQUEsWUFDRixNQUFNO0FBQUEsVUFDVjtBQUFBLFFBQ0o7QUFBQSxRQUNBLGNBQWM7QUFBQSxVQUNWLGdCQUFnQjtBQUFBLFVBQ2hCLFNBQVM7QUFBQSxVQUNULE1BQU07QUFBQSxZQUNGLE1BQU07QUFBQSxVQUNWO0FBQUEsUUFDSjtBQUFBLFFBQ0EsaUJBQWlCO0FBQUEsVUFDYixnQkFBZ0I7QUFBQSxVQUNoQixTQUFTO0FBQUEsVUFDVCxNQUFNO0FBQUEsWUFDRixNQUFNO0FBQUEsVUFDVjtBQUFBLFFBQ0o7QUFBQSxRQUNBLFdBQVc7QUFBQSxVQUNQLGdCQUFnQjtBQUFBLFVBQ2hCLFNBQVM7QUFBQSxVQUNULE1BQU07QUFBQSxZQUNGLE1BQU07QUFBQSxVQUNWO0FBQUEsUUFDSjtBQUFBLFFBQ0EsU0FBUztBQUFBLFVBQ0wsZ0JBQWdCO0FBQUEsVUFDaEIsU0FBUztBQUFBLFVBQ1QsTUFBTTtBQUFBLFlBQ0YsTUFBTTtBQUFBLFVBQ1Y7QUFBQSxRQUNKO0FBQUEsUUFDQSxXQUFXO0FBQUEsVUFDUCxnQkFBZ0I7QUFBQSxVQUNoQixTQUFTO0FBQUEsVUFDVCxNQUFNO0FBQUEsWUFDRixNQUFNO0FBQUEsVUFDVjtBQUFBLFFBQ0o7QUFBQSxRQUNBLE1BQU07QUFBQSxVQUNGLGdCQUFnQjtBQUFBLFVBQ2hCLFNBQVM7QUFBQSxVQUNULE1BQU07QUFBQSxZQUNGLE1BQU07QUFBQSxVQUNWO0FBQUEsUUFDSjtBQUFBLFFBQ0EsUUFBUTtBQUFBLFVBQ0osZ0JBQWdCO0FBQUEsVUFDaEIsU0FBUztBQUFBLFVBQ1QsTUFBTTtBQUFBLFlBQ0YsTUFBTTtBQUFBLFVBQ1Y7QUFBQSxRQUNKO0FBQUEsUUFDQSxZQUFZO0FBQUEsVUFDUixjQUFjO0FBQUEsVUFDZCxZQUFZO0FBQUEsVUFDWixnQkFBZ0I7QUFBQSxVQUNoQixNQUFNO0FBQUEsWUFDRixNQUFNO0FBQUEsVUFDVjtBQUFBLFFBQ0o7QUFBQSxRQUNBLFlBQVk7QUFBQSxVQUNSLGdCQUFnQjtBQUFBLFVBQ2hCLFNBQVM7QUFBQSxVQUNULE1BQU07QUFBQSxZQUNGLE1BQU07QUFBQSxVQUNWO0FBQUEsUUFDSjtBQUFBLFFBQ0EsaUJBQWlCO0FBQUEsVUFDYixnQkFBZ0I7QUFBQSxVQUNoQixTQUFTO0FBQUEsVUFDVCxNQUFNO0FBQUEsWUFDRixNQUFNO0FBQUEsVUFDVjtBQUFBLFFBQ0o7QUFBQSxRQUNBLGlCQUFpQjtBQUFBLFVBQ2IsZ0JBQWdCO0FBQUEsVUFDaEIsU0FBUztBQUFBLFVBQ1QsTUFBTTtBQUFBLFlBQ0YsTUFBTTtBQUFBLFVBQ1Y7QUFBQSxRQUNKO0FBQUEsUUFDQSxXQUFXO0FBQUEsVUFDUCxnQkFBZ0I7QUFBQSxVQUNoQixTQUFTO0FBQUEsVUFDVCxNQUFNO0FBQUEsWUFDRixNQUFNO0FBQUEsVUFDVjtBQUFBLFFBQ0o7QUFBQSxNQUNKO0FBQUEsSUFDSjtBQUFBLEVBQ0o7QUFDQSxNQUFNLGtDQUFrQztBQUFBLElBQ3BDLGdCQUFnQjtBQUFBLElBQ2hCLE1BQU07QUFBQSxNQUNGLE1BQU07QUFBQSxNQUNOLFdBQVc7QUFBQSxNQUNYLGlCQUFpQjtBQUFBLFFBQ2IsV0FBVztBQUFBLFVBQ1AsZ0JBQWdCO0FBQUEsVUFDaEIsU0FBUztBQUFBLFVBQ1QsTUFBTTtBQUFBLFlBQ0YsTUFBTTtBQUFBLFVBQ1Y7QUFBQSxRQUNKO0FBQUEsTUFDSjtBQUFBLElBQ0o7QUFBQSxFQUNKO0FBQ0EsTUFBTSw4QkFBOEI7QUFBQSxJQUNoQyxnQkFBZ0I7QUFBQSxJQUNoQixNQUFNO0FBQUEsTUFDRixNQUFNO0FBQUEsTUFDTixXQUFXO0FBQUEsTUFDWCxpQkFBaUI7QUFBQSxRQUNiLGlCQUFpQjtBQUFBLFVBQ2IsZ0JBQWdCO0FBQUEsVUFDaEIsU0FBUztBQUFBLFVBQ1QsTUFBTTtBQUFBLFlBQ0YsTUFBTTtBQUFBLFVBQ1Y7QUFBQSxRQUNKO0FBQUEsUUFDQSxXQUFXO0FBQUEsVUFDUCxnQkFBZ0I7QUFBQSxVQUNoQixTQUFTO0FBQUEsVUFDVCxNQUFNO0FBQUEsWUFDRixNQUFNO0FBQUEsVUFDVjtBQUFBLFFBQ0o7QUFBQSxRQUNBLFNBQVM7QUFBQSxVQUNMLGdCQUFnQjtBQUFBLFVBQ2hCLFNBQVM7QUFBQSxVQUNULE1BQU07QUFBQSxZQUNGLE1BQU07QUFBQSxVQUNWO0FBQUEsUUFDSjtBQUFBLFFBQ0EsTUFBTTtBQUFBLFVBQ0YsZ0JBQWdCO0FBQUEsVUFDaEIsU0FBUztBQUFBLFVBQ1QsTUFBTTtBQUFBLFlBQ0YsTUFBTTtBQUFBLFVBQ1Y7QUFBQSxRQUNKO0FBQUEsUUFDQSxXQUFXO0FBQUEsVUFDUCxnQkFBZ0I7QUFBQSxVQUNoQixTQUFTO0FBQUEsVUFDVCxNQUFNO0FBQUEsWUFDRixNQUFNO0FBQUEsVUFDVjtBQUFBLFFBQ0o7QUFBQSxNQUNKO0FBQUEsSUFDSjtBQUFBLEVBQ0o7QUFDQSxNQUFNLHVDQUF1QztBQUFBLElBQ3pDLGdCQUFnQjtBQUFBLElBQ2hCLE1BQU07QUFBQSxNQUNGLE1BQU07QUFBQSxNQUNOLFdBQVc7QUFBQSxNQUNYLGlCQUFpQjtBQUFBLFFBQ2IsV0FBVztBQUFBLFVBQ1AsZ0JBQWdCO0FBQUEsVUFDaEIsU0FBUztBQUFBLFVBQ1QsTUFBTTtBQUFBLFlBQ0YsTUFBTTtBQUFBLFVBQ1Y7QUFBQSxRQUNKO0FBQUEsTUFDSjtBQUFBLElBQ0o7QUFBQSxFQUNKO0FBQ0EsTUFBTSxxQkFBcUI7QUFBQSxJQUN2QixnQkFBZ0I7QUFBQSxJQUNoQixNQUFNO0FBQUEsTUFDRixNQUFNO0FBQUEsTUFDTixXQUFXO0FBQUEsTUFDWCxpQkFBaUI7QUFBQSxRQUNiLGlCQUFpQjtBQUFBLFVBQ2IsZ0JBQWdCO0FBQUEsVUFDaEIsU0FBUztBQUFBLFVBQ1QsTUFBTTtBQUFBLFlBQ0YsTUFBTTtBQUFBLFVBQ1Y7QUFBQSxRQUNKO0FBQUEsUUFDQSxXQUFXO0FBQUEsVUFDUCxnQkFBZ0I7QUFBQSxVQUNoQixTQUFTO0FBQUEsVUFDVCxNQUFNO0FBQUEsWUFDRixNQUFNO0FBQUEsVUFDVjtBQUFBLFFBQ0o7QUFBQSxRQUNBLFNBQVM7QUFBQSxVQUNMLGdCQUFnQjtBQUFBLFVBQ2hCLFNBQVM7QUFBQSxVQUNULE1BQU07QUFBQSxZQUNGLE1BQU07QUFBQSxVQUNWO0FBQUEsUUFDSjtBQUFBLFFBQ0EsV0FBVztBQUFBLFVBQ1AsZ0JBQWdCO0FBQUEsVUFDaEIsU0FBUztBQUFBLFVBQ1QsTUFBTTtBQUFBLFlBQ0YsTUFBTTtBQUFBLFVBQ1Y7QUFBQSxRQUNKO0FBQUEsTUFDSjtBQUFBLElBQ0o7QUFBQSxFQUNKO0FBQ0EsTUFBTSw4QkFBOEI7QUFBQSxJQUNoQyxnQkFBZ0I7QUFBQSxJQUNoQixNQUFNO0FBQUEsTUFDRixNQUFNO0FBQUEsTUFDTixXQUFXO0FBQUEsTUFDWCxpQkFBaUI7QUFBQSxRQUNiLFdBQVc7QUFBQSxVQUNQLGdCQUFnQjtBQUFBLFVBQ2hCLFNBQVM7QUFBQSxVQUNULE1BQU07QUFBQSxZQUNGLE1BQU07QUFBQSxVQUNWO0FBQUEsUUFDSjtBQUFBLE1BQ0o7QUFBQSxJQUNKO0FBQUEsRUFDSjtBQUNBLE1BQU0sNEJBQTRCO0FBQUEsSUFDOUIsZ0JBQWdCO0FBQUEsSUFDaEIsTUFBTTtBQUFBLE1BQ0YsTUFBTTtBQUFBLE1BQ04sV0FBVztBQUFBLE1BQ1gsaUJBQWlCO0FBQUEsUUFDYixpQkFBaUI7QUFBQSxVQUNiLGdCQUFnQjtBQUFBLFVBQ2hCLFNBQVM7QUFBQSxVQUNULE1BQU07QUFBQSxZQUNGLE1BQU07QUFBQSxVQUNWO0FBQUEsUUFDSjtBQUFBLFFBQ0EsV0FBVztBQUFBLFVBQ1AsZ0JBQWdCO0FBQUEsVUFDaEIsU0FBUztBQUFBLFVBQ1QsTUFBTTtBQUFBLFlBQ0YsTUFBTTtBQUFBLFVBQ1Y7QUFBQSxRQUNKO0FBQUEsUUFDQSxTQUFTO0FBQUEsVUFDTCxnQkFBZ0I7QUFBQSxVQUNoQixTQUFTO0FBQUEsVUFDVCxNQUFNO0FBQUEsWUFDRixNQUFNO0FBQUEsVUFDVjtBQUFBLFFBQ0o7QUFBQSxRQUNBLE1BQU07QUFBQSxVQUNGLGdCQUFnQjtBQUFBLFVBQ2hCLFNBQVM7QUFBQSxVQUNULE1BQU07QUFBQSxZQUNGLE1BQU07QUFBQSxVQUNWO0FBQUEsUUFDSjtBQUFBLFFBQ0EsU0FBUztBQUFBLFVBQ0wsZ0JBQWdCO0FBQUEsVUFDaEIsU0FBUztBQUFBLFVBQ1QsTUFBTTtBQUFBLFlBQ0YsTUFBTTtBQUFBLFlBQ04sZUFBZTtBQUFBLGNBQ1g7QUFBQSxjQUNBO0FBQUEsY0FDQTtBQUFBLGNBQ0E7QUFBQSxjQUNBO0FBQUEsWUFDSjtBQUFBLFVBQ0o7QUFBQSxRQUNKO0FBQUEsUUFDQSxhQUFhO0FBQUEsVUFDVCxnQkFBZ0I7QUFBQSxVQUNoQixTQUFTO0FBQUEsVUFDVCxNQUFNO0FBQUEsWUFDRixNQUFNO0FBQUEsWUFDTixlQUFlO0FBQUEsY0FDWDtBQUFBLGNBQ0E7QUFBQSxjQUNBO0FBQUEsY0FDQTtBQUFBLGNBQ0E7QUFBQSxZQUNKO0FBQUEsVUFDSjtBQUFBLFFBQ0o7QUFBQSxRQUNBLGdDQUFnQztBQUFBLFVBQzVCLGdCQUFnQjtBQUFBLFVBQ2hCLFNBQVM7QUFBQSxVQUNULE1BQU07QUFBQSxZQUNGLE1BQU07QUFBQSxVQUNWO0FBQUEsUUFDSjtBQUFBLE1BQ0o7QUFBQSxJQUNKO0FBQUEsRUFDSjtBQUNBLE1BQU0scUNBQXFDO0FBQUEsSUFDdkMsZ0JBQWdCO0FBQUEsSUFDaEIsTUFBTTtBQUFBLE1BQ0YsTUFBTTtBQUFBLE1BQ04sV0FBVztBQUFBLE1BQ1gsaUJBQWlCO0FBQUEsUUFDYixXQUFXO0FBQUEsVUFDUCxnQkFBZ0I7QUFBQSxVQUNoQixTQUFTO0FBQUEsVUFDVCxNQUFNO0FBQUEsWUFDRixNQUFNO0FBQUEsVUFDVjtBQUFBLFFBQ0o7QUFBQSxNQUNKO0FBQUEsSUFDSjtBQUFBLEVBQ0o7QUFDQSxNQUFNLG1CQUFtQjtBQUFBLElBQ3JCLGdCQUFnQjtBQUFBLElBQ2hCLE1BQU07QUFBQSxNQUNGLE1BQU07QUFBQSxNQUNOLFdBQVc7QUFBQSxNQUNYLGlCQUFpQjtBQUFBLFFBQ2IsY0FBYztBQUFBLFVBQ1YsZ0JBQWdCO0FBQUEsVUFDaEIsU0FBUztBQUFBLFVBQ1QsTUFBTTtBQUFBLFlBQ0YsTUFBTTtBQUFBLFVBQ1Y7QUFBQSxRQUNKO0FBQUEsUUFDQSxVQUFVO0FBQUEsVUFDTixnQkFBZ0I7QUFBQSxVQUNoQix3QkFBd0I7QUFBQSxVQUN4QixTQUFTO0FBQUEsVUFDVCxNQUFNO0FBQUEsWUFDRixNQUFNO0FBQUEsWUFDTixPQUFPLEVBQUUsTUFBTSxFQUFFLE1BQU0sU0FBUyxFQUFFO0FBQUEsVUFDdEM7QUFBQSxRQUNKO0FBQUEsUUFDQSxlQUFlO0FBQUEsVUFDWCxnQkFBZ0I7QUFBQSxVQUNoQixTQUFTO0FBQUEsVUFDVCxNQUFNO0FBQUEsWUFDRixNQUFNO0FBQUEsVUFDVjtBQUFBLFFBQ0o7QUFBQSxRQUNBLGFBQWE7QUFBQSxVQUNULGdCQUFnQjtBQUFBLFVBQ2hCLFNBQVM7QUFBQSxVQUNULE1BQU07QUFBQSxZQUNGLE1BQU07QUFBQSxVQUNWO0FBQUEsUUFDSjtBQUFBLFFBQ0EsY0FBYztBQUFBLFVBQ1YsZ0JBQWdCO0FBQUEsVUFDaEIsU0FBUztBQUFBLFVBQ1QsTUFBTTtBQUFBLFlBQ0YsTUFBTTtBQUFBLFVBQ1Y7QUFBQSxRQUNKO0FBQUEsUUFDQSxNQUFNO0FBQUEsVUFDRixnQkFBZ0I7QUFBQSxVQUNoQixTQUFTO0FBQUEsVUFDVCxNQUFNO0FBQUEsWUFDRixNQUFNO0FBQUEsVUFDVjtBQUFBLFFBQ0o7QUFBQSxRQUNBLFlBQVk7QUFBQSxVQUNSLGdCQUFnQjtBQUFBLFVBQ2hCLFNBQVM7QUFBQSxVQUNULE1BQU07QUFBQSxZQUNGLE1BQU07QUFBQSxVQUNWO0FBQUEsUUFDSjtBQUFBLFFBQ0EsaUJBQWlCO0FBQUEsVUFDYixnQkFBZ0I7QUFBQSxVQUNoQixTQUFTO0FBQUEsVUFDVCxNQUFNO0FBQUEsWUFDRixNQUFNO0FBQUEsVUFDVjtBQUFBLFFBQ0o7QUFBQSxRQUNBLGNBQWM7QUFBQSxVQUNWLGdCQUFnQjtBQUFBLFVBQ2hCLFNBQVM7QUFBQSxVQUNULE1BQU07QUFBQSxZQUNGLE1BQU07QUFBQSxVQUNWO0FBQUEsUUFDSjtBQUFBLFFBQ0Esb0JBQW9CO0FBQUEsVUFDaEIsZ0JBQWdCO0FBQUEsVUFDaEIsU0FBUztBQUFBLFVBQ1QsTUFBTTtBQUFBLFlBQ0YsTUFBTTtBQUFBLFVBQ1Y7QUFBQSxRQUNKO0FBQUEsUUFDQSxpQkFBaUI7QUFBQSxVQUNiLGdCQUFnQjtBQUFBLFVBQ2hCLFNBQVM7QUFBQSxVQUNULE1BQU07QUFBQSxZQUNGLE1BQU07QUFBQSxVQUNWO0FBQUEsUUFDSjtBQUFBLFFBQ0Esb0JBQW9CO0FBQUEsVUFDaEIsZ0JBQWdCO0FBQUEsVUFDaEIsU0FBUztBQUFBLFVBQ1QsTUFBTTtBQUFBLFlBQ0YsTUFBTTtBQUFBLFVBQ1Y7QUFBQSxRQUNKO0FBQUEsUUFDQSxVQUFVO0FBQUEsVUFDTixnQkFBZ0I7QUFBQSxVQUNoQixTQUFTO0FBQUEsVUFDVCxNQUFNO0FBQUEsWUFDRixNQUFNO0FBQUEsWUFDTixlQUFlLENBQUMsYUFBYSxZQUFZLFlBQVk7QUFBQSxVQUN6RDtBQUFBLFFBQ0o7QUFBQSxRQUNBLG9CQUFvQjtBQUFBLFVBQ2hCLGdCQUFnQjtBQUFBLFVBQ2hCLFNBQVM7QUFBQSxVQUNULE1BQU07QUFBQSxZQUNGLE1BQU07QUFBQSxVQUNWO0FBQUEsUUFDSjtBQUFBLFFBQ0EsdUJBQXVCO0FBQUEsVUFDbkIsZ0JBQWdCO0FBQUEsVUFDaEIsU0FBUztBQUFBLFVBQ1QsTUFBTTtBQUFBLFlBQ0YsTUFBTTtBQUFBLFVBQ1Y7QUFBQSxRQUNKO0FBQUEsUUFDQSxRQUFRO0FBQUEsVUFDSixnQkFBZ0I7QUFBQSxVQUNoQixTQUFTO0FBQUEsVUFDVCxNQUFNO0FBQUEsWUFDRixNQUFNO0FBQUEsVUFDVjtBQUFBLFFBQ0o7QUFBQSxRQUNBLGNBQWM7QUFBQSxVQUNWLGdCQUFnQjtBQUFBLFVBQ2hCLFNBQVM7QUFBQSxVQUNULE1BQU07QUFBQSxZQUNGLE1BQU07QUFBQSxVQUNWO0FBQUEsUUFDSjtBQUFBLFFBQ0EsWUFBWTtBQUFBLFVBQ1IsZ0JBQWdCO0FBQUEsVUFDaEIsU0FBUztBQUFBLFVBQ1QsTUFBTTtBQUFBLFlBQ0YsTUFBTTtBQUFBLFVBQ1Y7QUFBQSxRQUNKO0FBQUEsUUFDQSxZQUFZO0FBQUEsVUFDUixnQkFBZ0I7QUFBQSxVQUNoQixTQUFTO0FBQUEsVUFDVCxNQUFNO0FBQUEsWUFDRixNQUFNO0FBQUEsWUFDTixlQUFlLENBQUMsV0FBVyxXQUFXLFdBQVcsUUFBUTtBQUFBLFVBQzdEO0FBQUEsUUFDSjtBQUFBLFFBQ0EsZUFBZTtBQUFBLFVBQ1gsZ0JBQWdCO0FBQUEsVUFDaEIsU0FBUztBQUFBLFVBQ1QsTUFBTTtBQUFBLFlBQ0YsTUFBTTtBQUFBLFlBQ04sZUFBZSxDQUFDLFlBQVksT0FBTztBQUFBLFVBQ3ZDO0FBQUEsUUFDSjtBQUFBLFFBQ0EsWUFBWTtBQUFBLFVBQ1IsZ0JBQWdCO0FBQUEsVUFDaEIsU0FBUztBQUFBLFVBQ1QsTUFBTTtBQUFBLFlBQ0YsTUFBTTtBQUFBLFlBQ04sZUFBZTtBQUFBLGNBQ1g7QUFBQSxjQUNBO0FBQUEsY0FDQTtBQUFBLGNBQ0E7QUFBQSxjQUNBO0FBQUEsWUFDSjtBQUFBLFVBQ0o7QUFBQSxRQUNKO0FBQUEsUUFDQSxhQUFhO0FBQUEsVUFDVCxnQkFBZ0I7QUFBQSxVQUNoQixTQUFTO0FBQUEsVUFDVCxNQUFNO0FBQUEsWUFDRixNQUFNO0FBQUEsWUFDTixlQUFlLENBQUMsVUFBVSxVQUFVO0FBQUEsVUFDeEM7QUFBQSxRQUNKO0FBQUEsUUFDQSxpQkFBaUI7QUFBQSxVQUNiLGdCQUFnQjtBQUFBLFVBQ2hCLFNBQVM7QUFBQSxVQUNULE1BQU07QUFBQSxZQUNGLE1BQU07QUFBQSxVQUNWO0FBQUEsUUFDSjtBQUFBLFFBQ0EsV0FBVztBQUFBLFVBQ1AsZ0JBQWdCO0FBQUEsVUFDaEIsU0FBUztBQUFBLFVBQ1QsTUFBTTtBQUFBLFlBQ0YsTUFBTTtBQUFBLFVBQ1Y7QUFBQSxRQUNKO0FBQUEsUUFDQSxTQUFTO0FBQUEsVUFDTCxnQkFBZ0I7QUFBQSxVQUNoQixTQUFTO0FBQUEsVUFDVCxNQUFNO0FBQUEsWUFDRixNQUFNO0FBQUEsVUFDVjtBQUFBLFFBQ0o7QUFBQSxRQUNBLGNBQWM7QUFBQSxVQUNWLGdCQUFnQjtBQUFBLFVBQ2hCLFNBQVM7QUFBQSxVQUNULE1BQU07QUFBQSxZQUNGLE1BQU07QUFBQSxVQUNWO0FBQUEsUUFDSjtBQUFBLFFBQ0EsTUFBTTtBQUFBLFVBQ0YsZ0JBQWdCO0FBQUEsVUFDaEIsU0FBUztBQUFBLFVBQ1QsTUFBTTtBQUFBLFlBQ0YsTUFBTTtBQUFBLFVBQ1Y7QUFBQSxRQUNKO0FBQUEsUUFDQSx5QkFBeUI7QUFBQSxVQUNyQixnQkFBZ0I7QUFBQSxVQUNoQixTQUFTO0FBQUEsVUFDVCxNQUFNO0FBQUEsWUFDRixNQUFNO0FBQUEsVUFDVjtBQUFBLFFBQ0o7QUFBQSxRQUNBLG1CQUFtQjtBQUFBLFVBQ2YsZ0JBQWdCO0FBQUEsVUFDaEIsU0FBUztBQUFBLFVBQ1QsTUFBTTtBQUFBLFlBQ0YsTUFBTTtBQUFBLFVBQ1Y7QUFBQSxRQUNKO0FBQUEsUUFDQSxxQkFBcUI7QUFBQSxVQUNqQixnQkFBZ0I7QUFBQSxVQUNoQixTQUFTO0FBQUEsVUFDVCxNQUFNO0FBQUEsWUFDRixNQUFNO0FBQUEsVUFDVjtBQUFBLFFBQ0o7QUFBQSxRQUNBLGlCQUFpQjtBQUFBLFVBQ2IsZ0JBQWdCO0FBQUEsVUFDaEIsU0FBUztBQUFBLFVBQ1QsTUFBTTtBQUFBLFlBQ0YsTUFBTTtBQUFBLFVBQ1Y7QUFBQSxRQUNKO0FBQUEsUUFDQSxnQkFBZ0I7QUFBQSxVQUNaLGdCQUFnQjtBQUFBLFVBQ2hCLFNBQVM7QUFBQSxVQUNULE1BQU07QUFBQSxZQUNGLE1BQU07QUFBQSxVQUNWO0FBQUEsUUFDSjtBQUFBLFFBQ0EsV0FBVztBQUFBLFVBQ1AsZ0JBQWdCO0FBQUEsVUFDaEIsU0FBUztBQUFBLFVBQ1QsTUFBTTtBQUFBLFlBQ0YsTUFBTTtBQUFBLFVBQ1Y7QUFBQSxRQUNKO0FBQUEsUUFDQSxjQUFjO0FBQUEsVUFDVixnQkFBZ0I7QUFBQSxVQUNoQixTQUFTO0FBQUEsVUFDVCxNQUFNO0FBQUEsWUFDRixNQUFNO0FBQUEsVUFDVjtBQUFBLFFBQ0o7QUFBQSxNQUNKO0FBQUEsSUFDSjtBQUFBLEVBQ0o7QUFDQSxNQUFNLDRCQUE0QjtBQUFBLElBQzlCLGdCQUFnQjtBQUFBLElBQ2hCLE1BQU07QUFBQSxNQUNGLE1BQU07QUFBQSxNQUNOLFdBQVc7QUFBQSxNQUNYLGlCQUFpQjtBQUFBLFFBQ2IsV0FBVztBQUFBLFVBQ1AsZ0JBQWdCO0FBQUEsVUFDaEIsU0FBUztBQUFBLFVBQ1QsTUFBTTtBQUFBLFlBQ0YsTUFBTTtBQUFBLFVBQ1Y7QUFBQSxRQUNKO0FBQUEsTUFDSjtBQUFBLElBQ0o7QUFBQSxFQUNKO0FBQ0EsTUFBTSxxQkFBcUI7QUFBQSxJQUN2QixnQkFBZ0I7QUFBQSxJQUNoQixNQUFNO0FBQUEsTUFDRixNQUFNO0FBQUEsTUFDTixXQUFXO0FBQUEsTUFDWCxpQkFBaUI7QUFBQSxRQUNiLGlCQUFpQjtBQUFBLFVBQ2IsZ0JBQWdCO0FBQUEsVUFDaEIsU0FBUztBQUFBLFVBQ1QsTUFBTTtBQUFBLFlBQ0YsTUFBTTtBQUFBLFVBQ1Y7QUFBQSxRQUNKO0FBQUEsUUFDQSxXQUFXO0FBQUEsVUFDUCxnQkFBZ0I7QUFBQSxVQUNoQixTQUFTO0FBQUEsVUFDVCxNQUFNO0FBQUEsWUFDRixNQUFNO0FBQUEsVUFDVjtBQUFBLFFBQ0o7QUFBQSxRQUNBLFNBQVM7QUFBQSxVQUNMLGdCQUFnQjtBQUFBLFVBQ2hCLFNBQVM7QUFBQSxVQUNULE1BQU07QUFBQSxZQUNGLE1BQU07QUFBQSxVQUNWO0FBQUEsUUFDSjtBQUFBLFFBQ0EsTUFBTTtBQUFBLFVBQ0YsZ0JBQWdCO0FBQUEsVUFDaEIsU0FBUztBQUFBLFVBQ1QsTUFBTTtBQUFBLFlBQ0YsTUFBTTtBQUFBLFVBQ1Y7QUFBQSxRQUNKO0FBQUEsUUFDQSxXQUFXO0FBQUEsVUFDUCxnQkFBZ0I7QUFBQSxVQUNoQixTQUFTO0FBQUEsVUFDVCxNQUFNO0FBQUEsWUFDRixNQUFNO0FBQUEsVUFDVjtBQUFBLFFBQ0o7QUFBQSxNQUNKO0FBQUEsSUFDSjtBQUFBLEVBQ0o7QUFDQSxNQUFNLDhCQUE4QjtBQUFBLElBQ2hDLGdCQUFnQjtBQUFBLElBQ2hCLE1BQU07QUFBQSxNQUNGLE1BQU07QUFBQSxNQUNOLFdBQVc7QUFBQSxNQUNYLGlCQUFpQjtBQUFBLFFBQ2IsV0FBVztBQUFBLFVBQ1AsZ0JBQWdCO0FBQUEsVUFDaEIsU0FBUztBQUFBLFVBQ1QsTUFBTTtBQUFBLFlBQ0YsTUFBTTtBQUFBLFVBQ1Y7QUFBQSxRQUNKO0FBQUEsTUFDSjtBQUFBLElBQ0o7QUFBQSxFQUNKO0FBQ0EsTUFBTSxxQkFBcUI7QUFBQSxJQUN2QixnQkFBZ0I7QUFBQSxJQUNoQixNQUFNO0FBQUEsTUFDRixNQUFNO0FBQUEsTUFDTixXQUFXO0FBQUEsTUFDWCxpQkFBaUI7QUFBQSxRQUNiLGlCQUFpQjtBQUFBLFVBQ2IsZ0JBQWdCO0FBQUEsVUFDaEIsU0FBUztBQUFBLFVBQ1QsTUFBTTtBQUFBLFlBQ0YsTUFBTTtBQUFBLFVBQ1Y7QUFBQSxRQUNKO0FBQUEsUUFDQSxXQUFXO0FBQUEsVUFDUCxnQkFBZ0I7QUFBQSxVQUNoQixTQUFTO0FBQUEsVUFDVCxNQUFNO0FBQUEsWUFDRixNQUFNO0FBQUEsVUFDVjtBQUFBLFFBQ0o7QUFBQSxRQUNBLFNBQVM7QUFBQSxVQUNMLGdCQUFnQjtBQUFBLFVBQ2hCLFNBQVM7QUFBQSxVQUNULE1BQU07QUFBQSxZQUNGLE1BQU07QUFBQSxVQUNWO0FBQUEsUUFDSjtBQUFBLFFBQ0EsTUFBTTtBQUFBLFVBQ0YsZ0JBQWdCO0FBQUEsVUFDaEIsU0FBUztBQUFBLFVBQ1QsTUFBTTtBQUFBLFlBQ0YsTUFBTTtBQUFBLFVBQ1Y7QUFBQSxRQUNKO0FBQUEsUUFDQSxXQUFXO0FBQUEsVUFDUCxnQkFBZ0I7QUFBQSxVQUNoQixTQUFTO0FBQUEsVUFDVCxNQUFNO0FBQUEsWUFDRixNQUFNO0FBQUEsVUFDVjtBQUFBLFFBQ0o7QUFBQSxNQUNKO0FBQUEsSUFDSjtBQUFBLEVBQ0o7QUFDQSxNQUFNLDhCQUE4QjtBQUFBLElBQ2hDLGdCQUFnQjtBQUFBLElBQ2hCLE1BQU07QUFBQSxNQUNGLE1BQU07QUFBQSxNQUNOLFdBQVc7QUFBQSxNQUNYLGlCQUFpQjtBQUFBLFFBQ2IsV0FBVztBQUFBLFVBQ1AsZ0JBQWdCO0FBQUEsVUFDaEIsU0FBUztBQUFBLFVBQ1QsTUFBTTtBQUFBLFlBQ0YsTUFBTTtBQUFBLFVBQ1Y7QUFBQSxRQUNKO0FBQUEsTUFDSjtBQUFBLElBQ0o7QUFBQSxFQUNKO0FBQ0EsTUFBTSx3QkFBd0I7QUFBQSxJQUMxQixnQkFBZ0I7QUFBQSxJQUNoQixNQUFNO0FBQUEsTUFDRixNQUFNO0FBQUEsTUFDTixXQUFXO0FBQUEsTUFDWCxpQkFBaUI7QUFBQSxRQUNiLE1BQU07QUFBQSxVQUNGLGdCQUFnQjtBQUFBLFVBQ2hCLFNBQVM7QUFBQSxVQUNULE1BQU07QUFBQSxZQUNGLE1BQU07QUFBQSxVQUNWO0FBQUEsUUFDSjtBQUFBLFFBQ0EsY0FBYztBQUFBLFVBQ1YsZ0JBQWdCO0FBQUEsVUFDaEIsU0FBUztBQUFBLFVBQ1QsTUFBTTtBQUFBLFlBQ0YsTUFBTTtBQUFBLFVBQ1Y7QUFBQSxRQUNKO0FBQUEsUUFDQSxZQUFZO0FBQUEsVUFDUixnQkFBZ0I7QUFBQSxVQUNoQixTQUFTO0FBQUEsVUFDVCxNQUFNO0FBQUEsWUFDRixNQUFNO0FBQUEsVUFDVjtBQUFBLFFBQ0o7QUFBQSxRQUNBLGlCQUFpQjtBQUFBLFVBQ2IsZ0JBQWdCO0FBQUEsVUFDaEIsU0FBUztBQUFBLFVBQ1QsTUFBTTtBQUFBLFlBQ0YsTUFBTTtBQUFBLFVBQ1Y7QUFBQSxRQUNKO0FBQUEsUUFDQSxXQUFXO0FBQUEsVUFDUCxnQkFBZ0I7QUFBQSxVQUNoQixTQUFTO0FBQUEsVUFDVCxNQUFNO0FBQUEsWUFDRixNQUFNO0FBQUEsVUFDVjtBQUFBLFFBQ0o7QUFBQSxRQUNBLFNBQVM7QUFBQSxVQUNMLGdCQUFnQjtBQUFBLFVBQ2hCLFNBQVM7QUFBQSxVQUNULE1BQU07QUFBQSxZQUNGLE1BQU07QUFBQSxVQUNWO0FBQUEsUUFDSjtBQUFBLFFBQ0EsV0FBVztBQUFBLFVBQ1AsZ0JBQWdCO0FBQUEsVUFDaEIsU0FBUztBQUFBLFVBQ1QsTUFBTTtBQUFBLFlBQ0YsTUFBTTtBQUFBLFVBQ1Y7QUFBQSxRQUNKO0FBQUEsUUFDQSxNQUFNO0FBQUEsVUFDRixnQkFBZ0I7QUFBQSxVQUNoQixTQUFTO0FBQUEsVUFDVCxNQUFNO0FBQUEsWUFDRixNQUFNO0FBQUEsVUFDVjtBQUFBLFFBQ0o7QUFBQSxRQUNBLG1CQUFtQjtBQUFBLFVBQ2YsZ0JBQWdCO0FBQUEsVUFDaEIsU0FBUztBQUFBLFVBQ1QsTUFBTTtBQUFBLFlBQ0YsTUFBTTtBQUFBLFVBQ1Y7QUFBQSxRQUNKO0FBQUEsUUFDQSxxQkFBcUI7QUFBQSxVQUNqQixnQkFBZ0I7QUFBQSxVQUNoQixTQUFTO0FBQUEsVUFDVCxNQUFNO0FBQUEsWUFDRixNQUFNO0FBQUEsVUFDVjtBQUFBLFFBQ0o7QUFBQSxRQUNBLGlCQUFpQjtBQUFBLFVBQ2IsZ0JBQWdCO0FBQUEsVUFDaEIsU0FBUztBQUFBLFVBQ1QsTUFBTTtBQUFBLFlBQ0YsTUFBTTtBQUFBLFVBQ1Y7QUFBQSxRQUNKO0FBQUEsUUFDQSxXQUFXO0FBQUEsVUFDUCxnQkFBZ0I7QUFBQSxVQUNoQixTQUFTO0FBQUEsVUFDVCxNQUFNO0FBQUEsWUFDRixNQUFNO0FBQUEsVUFDVjtBQUFBLFFBQ0o7QUFBQSxNQUNKO0FBQUEsSUFDSjtBQUFBLEVBQ0o7QUFDQSxNQUFNLGlDQUFpQztBQUFBLElBQ25DLGdCQUFnQjtBQUFBLElBQ2hCLE1BQU07QUFBQSxNQUNGLE1BQU07QUFBQSxNQUNOLFdBQVc7QUFBQSxNQUNYLGlCQUFpQjtBQUFBLFFBQ2IsV0FBVztBQUFBLFVBQ1AsZ0JBQWdCO0FBQUEsVUFDaEIsU0FBUztBQUFBLFVBQ1QsTUFBTTtBQUFBLFlBQ0YsTUFBTTtBQUFBLFVBQ1Y7QUFBQSxRQUNKO0FBQUEsTUFDSjtBQUFBLElBQ0o7QUFBQSxFQUNKO0FBQ0EsTUFBTSw2QkFBNkI7QUFBQSxJQUMvQixnQkFBZ0I7QUFBQSxJQUNoQixNQUFNO0FBQUEsTUFDRixNQUFNO0FBQUEsTUFDTixXQUFXO0FBQUEsTUFDWCxpQkFBaUI7QUFBQSxRQUNiLE1BQU07QUFBQSxVQUNGLGdCQUFnQjtBQUFBLFVBQ2hCLFNBQVM7QUFBQSxVQUNULE1BQU07QUFBQSxZQUNGLE1BQU07QUFBQSxVQUNWO0FBQUEsUUFDSjtBQUFBLFFBQ0EsY0FBYztBQUFBLFVBQ1YsZ0JBQWdCO0FBQUEsVUFDaEIsU0FBUztBQUFBLFVBQ1QsTUFBTTtBQUFBLFlBQ0YsTUFBTTtBQUFBLFVBQ1Y7QUFBQSxRQUNKO0FBQUEsUUFDQSxZQUFZO0FBQUEsVUFDUixnQkFBZ0I7QUFBQSxVQUNoQixTQUFTO0FBQUEsVUFDVCxNQUFNO0FBQUEsWUFDRixNQUFNO0FBQUEsVUFDVjtBQUFBLFFBQ0o7QUFBQSxRQUNBLGlCQUFpQjtBQUFBLFVBQ2IsZ0JBQWdCO0FBQUEsVUFDaEIsU0FBUztBQUFBLFVBQ1QsTUFBTTtBQUFBLFlBQ0YsTUFBTTtBQUFBLFVBQ1Y7QUFBQSxRQUNKO0FBQUEsUUFDQSxvQkFBb0I7QUFBQSxVQUNoQixnQkFBZ0I7QUFBQSxVQUNoQixTQUFTO0FBQUEsVUFDVCxNQUFNO0FBQUEsWUFDRixNQUFNO0FBQUEsVUFDVjtBQUFBLFFBQ0o7QUFBQSxRQUNBLGlCQUFpQjtBQUFBLFVBQ2IsZ0JBQWdCO0FBQUEsVUFDaEIsU0FBUztBQUFBLFVBQ1QsTUFBTTtBQUFBLFlBQ0YsTUFBTTtBQUFBLFVBQ1Y7QUFBQSxRQUNKO0FBQUEsUUFDQSxXQUFXO0FBQUEsVUFDUCxnQkFBZ0I7QUFBQSxVQUNoQixTQUFTO0FBQUEsVUFDVCxNQUFNO0FBQUEsWUFDRixNQUFNO0FBQUEsVUFDVjtBQUFBLFFBQ0o7QUFBQSxRQUNBLFNBQVM7QUFBQSxVQUNMLGdCQUFnQjtBQUFBLFVBQ2hCLFNBQVM7QUFBQSxVQUNULE1BQU07QUFBQSxZQUNGLE1BQU07QUFBQSxVQUNWO0FBQUEsUUFDSjtBQUFBLFFBQ0EsTUFBTTtBQUFBLFVBQ0YsZ0JBQWdCO0FBQUEsVUFDaEIsU0FBUztBQUFBLFVBQ1QsTUFBTTtBQUFBLFlBQ0YsTUFBTTtBQUFBLFVBQ1Y7QUFBQSxRQUNKO0FBQUEsUUFDQSxtQkFBbUI7QUFBQSxVQUNmLGdCQUFnQjtBQUFBLFVBQ2hCLFNBQVM7QUFBQSxVQUNULE1BQU07QUFBQSxZQUNGLE1BQU07QUFBQSxVQUNWO0FBQUEsUUFDSjtBQUFBLFFBQ0EscUJBQXFCO0FBQUEsVUFDakIsZ0JBQWdCO0FBQUEsVUFDaEIsU0FBUztBQUFBLFVBQ1QsTUFBTTtBQUFBLFlBQ0YsTUFBTTtBQUFBLFVBQ1Y7QUFBQSxRQUNKO0FBQUEsUUFDQSxpQkFBaUI7QUFBQSxVQUNiLGdCQUFnQjtBQUFBLFVBQ2hCLFNBQVM7QUFBQSxVQUNULE1BQU07QUFBQSxZQUNGLE1BQU07QUFBQSxVQUNWO0FBQUEsUUFDSjtBQUFBLFFBQ0EsV0FBVztBQUFBLFVBQ1AsZ0JBQWdCO0FBQUEsVUFDaEIsU0FBUztBQUFBLFVBQ1QsTUFBTTtBQUFBLFlBQ0YsTUFBTTtBQUFBLFVBQ1Y7QUFBQSxRQUNKO0FBQUEsTUFDSjtBQUFBLElBQ0o7QUFBQSxFQUNKO0FBQ0EsTUFBTSxzQ0FBc0M7QUFBQSxJQUN4QyxnQkFBZ0I7QUFBQSxJQUNoQixNQUFNO0FBQUEsTUFDRixNQUFNO0FBQUEsTUFDTixXQUFXO0FBQUEsTUFDWCxpQkFBaUI7QUFBQSxRQUNiLFdBQVc7QUFBQSxVQUNQLGdCQUFnQjtBQUFBLFVBQ2hCLFNBQVM7QUFBQSxVQUNULE1BQU07QUFBQSxZQUNGLE1BQU07QUFBQSxVQUNWO0FBQUEsUUFDSjtBQUFBLE1BQ0o7QUFBQSxJQUNKO0FBQUEsRUFDSjtBQUNBLE1BQU0sNEJBQTRCO0FBQUEsSUFDOUIsZ0JBQWdCO0FBQUEsSUFDaEIsTUFBTTtBQUFBLE1BQ0YsTUFBTTtBQUFBLE1BQ04sV0FBVztBQUFBLE1BQ1gsaUJBQWlCO0FBQUEsUUFDYixNQUFNO0FBQUEsVUFDRixnQkFBZ0I7QUFBQSxVQUNoQixTQUFTO0FBQUEsVUFDVCxNQUFNO0FBQUEsWUFDRixNQUFNO0FBQUEsVUFDVjtBQUFBLFFBQ0o7QUFBQSxRQUNBLGNBQWM7QUFBQSxVQUNWLGdCQUFnQjtBQUFBLFVBQ2hCLFNBQVM7QUFBQSxVQUNULE1BQU07QUFBQSxZQUNGLE1BQU07QUFBQSxVQUNWO0FBQUEsUUFDSjtBQUFBLFFBQ0EsWUFBWTtBQUFBLFVBQ1IsZ0JBQWdCO0FBQUEsVUFDaEIsU0FBUztBQUFBLFVBQ1QsTUFBTTtBQUFBLFlBQ0YsTUFBTTtBQUFBLFVBQ1Y7QUFBQSxRQUNKO0FBQUEsUUFDQSxpQkFBaUI7QUFBQSxVQUNiLGdCQUFnQjtBQUFBLFVBQ2hCLFNBQVM7QUFBQSxVQUNULE1BQU07QUFBQSxZQUNGLE1BQU07QUFBQSxVQUNWO0FBQUEsUUFDSjtBQUFBLFFBQ0Esb0JBQW9CO0FBQUEsVUFDaEIsZ0JBQWdCO0FBQUEsVUFDaEIsU0FBUztBQUFBLFVBQ1QsTUFBTTtBQUFBLFlBQ0YsTUFBTTtBQUFBLFVBQ1Y7QUFBQSxRQUNKO0FBQUEsUUFDQSxpQkFBaUI7QUFBQSxVQUNiLGdCQUFnQjtBQUFBLFVBQ2hCLFNBQVM7QUFBQSxVQUNULE1BQU07QUFBQSxZQUNGLE1BQU07QUFBQSxVQUNWO0FBQUEsUUFDSjtBQUFBLFFBQ0EsV0FBVztBQUFBLFVBQ1AsZ0JBQWdCO0FBQUEsVUFDaEIsU0FBUztBQUFBLFVBQ1QsTUFBTTtBQUFBLFlBQ0YsTUFBTTtBQUFBLFVBQ1Y7QUFBQSxRQUNKO0FBQUEsUUFDQSxTQUFTO0FBQUEsVUFDTCxnQkFBZ0I7QUFBQSxVQUNoQixTQUFTO0FBQUEsVUFDVCxNQUFNO0FBQUEsWUFDRixNQUFNO0FBQUEsVUFDVjtBQUFBLFFBQ0o7QUFBQSxRQUNBLE1BQU07QUFBQSxVQUNGLGdCQUFnQjtBQUFBLFVBQ2hCLFNBQVM7QUFBQSxVQUNULE1BQU07QUFBQSxZQUNGLE1BQU07QUFBQSxVQUNWO0FBQUEsUUFDSjtBQUFBLFFBQ0EsV0FBVztBQUFBLFVBQ1AsZ0JBQWdCO0FBQUEsVUFDaEIsU0FBUztBQUFBLFVBQ1QsTUFBTTtBQUFBLFlBQ0YsTUFBTTtBQUFBLFVBQ1Y7QUFBQSxRQUNKO0FBQUEsTUFDSjtBQUFBLElBQ0o7QUFBQSxFQUNKO0FBQ0EsTUFBTSxxQ0FBcUM7QUFBQSxJQUN2QyxnQkFBZ0I7QUFBQSxJQUNoQixNQUFNO0FBQUEsTUFDRixNQUFNO0FBQUEsTUFDTixXQUFXO0FBQUEsTUFDWCxpQkFBaUI7QUFBQSxRQUNiLFdBQVc7QUFBQSxVQUNQLGdCQUFnQjtBQUFBLFVBQ2hCLFNBQVM7QUFBQSxVQUNULE1BQU07QUFBQSxZQUNGLE1BQU07QUFBQSxVQUNWO0FBQUEsUUFDSjtBQUFBLE1BQ0o7QUFBQSxJQUNKO0FBQUEsRUFDSjtBQUNBLE1BQU0sb0NBQW9DO0FBQUEsSUFDdEMsZ0JBQWdCO0FBQUEsSUFDaEIsTUFBTTtBQUFBLE1BQ0YsTUFBTTtBQUFBLE1BQ04sV0FBVztBQUFBLE1BQ1gsaUJBQWlCO0FBQUEsUUFDYixNQUFNO0FBQUEsVUFDRixnQkFBZ0I7QUFBQSxVQUNoQixTQUFTO0FBQUEsVUFDVCxNQUFNO0FBQUEsWUFDRixNQUFNO0FBQUEsVUFDVjtBQUFBLFFBQ0o7QUFBQSxRQUNBLGNBQWM7QUFBQSxVQUNWLGdCQUFnQjtBQUFBLFVBQ2hCLFNBQVM7QUFBQSxVQUNULE1BQU07QUFBQSxZQUNGLE1BQU07QUFBQSxVQUNWO0FBQUEsUUFDSjtBQUFBLFFBQ0EsWUFBWTtBQUFBLFVBQ1IsZ0JBQWdCO0FBQUEsVUFDaEIsU0FBUztBQUFBLFVBQ1QsTUFBTTtBQUFBLFlBQ0YsTUFBTTtBQUFBLFVBQ1Y7QUFBQSxRQUNKO0FBQUEsUUFDQSxpQkFBaUI7QUFBQSxVQUNiLGdCQUFnQjtBQUFBLFVBQ2hCLFNBQVM7QUFBQSxVQUNULE1BQU07QUFBQSxZQUNGLE1BQU07QUFBQSxVQUNWO0FBQUEsUUFDSjtBQUFBLFFBQ0Esb0JBQW9CO0FBQUEsVUFDaEIsZ0JBQWdCO0FBQUEsVUFDaEIsU0FBUztBQUFBLFVBQ1QsTUFBTTtBQUFBLFlBQ0YsTUFBTTtBQUFBLFVBQ1Y7QUFBQSxRQUNKO0FBQUEsUUFDQSxXQUFXO0FBQUEsVUFDUCxnQkFBZ0I7QUFBQSxVQUNoQixTQUFTO0FBQUEsVUFDVCxNQUFNO0FBQUEsWUFDRixNQUFNO0FBQUEsVUFDVjtBQUFBLFFBQ0o7QUFBQSxRQUNBLFNBQVM7QUFBQSxVQUNMLGdCQUFnQjtBQUFBLFVBQ2hCLFNBQVM7QUFBQSxVQUNULE1BQU07QUFBQSxZQUNGLE1BQU07QUFBQSxVQUNWO0FBQUEsUUFDSjtBQUFBLFFBQ0EsTUFBTTtBQUFBLFVBQ0YsZ0JBQWdCO0FBQUEsVUFDaEIsU0FBUztBQUFBLFVBQ1QsTUFBTTtBQUFBLFlBQ0YsTUFBTTtBQUFBLFVBQ1Y7QUFBQSxRQUNKO0FBQUEsUUFDQSxtQkFBbUI7QUFBQSxVQUNmLGdCQUFnQjtBQUFBLFVBQ2hCLFNBQVM7QUFBQSxVQUNULE1BQU07QUFBQSxZQUNGLE1BQU07QUFBQSxVQUNWO0FBQUEsUUFDSjtBQUFBLFFBQ0EscUJBQXFCO0FBQUEsVUFDakIsZ0JBQWdCO0FBQUEsVUFDaEIsU0FBUztBQUFBLFVBQ1QsTUFBTTtBQUFBLFlBQ0YsTUFBTTtBQUFBLFVBQ1Y7QUFBQSxRQUNKO0FBQUEsUUFDQSxpQkFBaUI7QUFBQSxVQUNiLGdCQUFnQjtBQUFBLFVBQ2hCLFNBQVM7QUFBQSxVQUNULE1BQU07QUFBQSxZQUNGLE1BQU07QUFBQSxVQUNWO0FBQUEsUUFDSjtBQUFBLFFBQ0EsV0FBVztBQUFBLFVBQ1AsZ0JBQWdCO0FBQUEsVUFDaEIsU0FBUztBQUFBLFVBQ1QsTUFBTTtBQUFBLFlBQ0YsTUFBTTtBQUFBLFVBQ1Y7QUFBQSxRQUNKO0FBQUEsTUFDSjtBQUFBLElBQ0o7QUFBQSxFQUNKO0FBQ0EsTUFBTSw2Q0FBNkM7QUFBQSxJQUMvQyxnQkFBZ0I7QUFBQSxJQUNoQixNQUFNO0FBQUEsTUFDRixNQUFNO0FBQUEsTUFDTixXQUFXO0FBQUEsTUFDWCxpQkFBaUI7QUFBQSxRQUNiLFdBQVc7QUFBQSxVQUNQLGdCQUFnQjtBQUFBLFVBQ2hCLFNBQVM7QUFBQSxVQUNULE1BQU07QUFBQSxZQUNGLE1BQU07QUFBQSxVQUNWO0FBQUEsUUFDSjtBQUFBLE1BQ0o7QUFBQSxJQUNKO0FBQUEsRUFDSjtBQUNBLE1BQU0sK0JBQStCO0FBQUEsSUFDakMsZ0JBQWdCO0FBQUEsSUFDaEIsTUFBTTtBQUFBLE1BQ0YsTUFBTTtBQUFBLE1BQ04sV0FBVztBQUFBLE1BQ1gsaUJBQWlCO0FBQUEsUUFDYixjQUFjO0FBQUEsVUFDVixnQkFBZ0I7QUFBQSxVQUNoQixTQUFTO0FBQUEsVUFDVCxNQUFNO0FBQUEsWUFDRixNQUFNO0FBQUEsVUFDVjtBQUFBLFFBQ0o7QUFBQSxRQUNBLE1BQU07QUFBQSxVQUNGLGdCQUFnQjtBQUFBLFVBQ2hCLFNBQVM7QUFBQSxVQUNULE1BQU07QUFBQSxZQUNGLE1BQU07QUFBQSxVQUNWO0FBQUEsUUFDSjtBQUFBLFFBQ0EsbUJBQW1CO0FBQUEsVUFDZixnQkFBZ0I7QUFBQSxVQUNoQixTQUFTO0FBQUEsVUFDVCxNQUFNO0FBQUEsWUFDRixNQUFNO0FBQUEsVUFDVjtBQUFBLFFBQ0o7QUFBQSxRQUNBLGlCQUFpQjtBQUFBLFVBQ2IsZ0JBQWdCO0FBQUEsVUFDaEIsU0FBUztBQUFBLFVBQ1QsTUFBTTtBQUFBLFlBQ0YsTUFBTTtBQUFBLFVBQ1Y7QUFBQSxRQUNKO0FBQUEsUUFDQSxXQUFXO0FBQUEsVUFDUCxnQkFBZ0I7QUFBQSxVQUNoQixTQUFTO0FBQUEsVUFDVCxNQUFNO0FBQUEsWUFDRixNQUFNO0FBQUEsVUFDVjtBQUFBLFFBQ0o7QUFBQSxRQUNBLFNBQVM7QUFBQSxVQUNMLGdCQUFnQjtBQUFBLFVBQ2hCLFNBQVM7QUFBQSxVQUNULE1BQU07QUFBQSxZQUNGLE1BQU07QUFBQSxVQUNWO0FBQUEsUUFDSjtBQUFBLFFBQ0EsTUFBTTtBQUFBLFVBQ0YsZ0JBQWdCO0FBQUEsVUFDaEIsU0FBUztBQUFBLFVBQ1QsTUFBTTtBQUFBLFlBQ0YsTUFBTTtBQUFBLFVBQ1Y7QUFBQSxRQUNKO0FBQUEsUUFDQSxXQUFXO0FBQUEsVUFDUCxnQkFBZ0I7QUFBQSxVQUNoQixTQUFTO0FBQUEsVUFDVCxNQUFNO0FBQUEsWUFDRixNQUFNO0FBQUEsVUFDVjtBQUFBLFFBQ0o7QUFBQSxNQUNKO0FBQUEsSUFDSjtBQUFBLEVBQ0o7QUFDQSxNQUFNLHdDQUF3QztBQUFBLElBQzFDLGdCQUFnQjtBQUFBLElBQ2hCLE1BQU07QUFBQSxNQUNGLE1BQU07QUFBQSxNQUNOLFdBQVc7QUFBQSxNQUNYLGlCQUFpQjtBQUFBLFFBQ2IsV0FBVztBQUFBLFVBQ1AsZ0JBQWdCO0FBQUEsVUFDaEIsU0FBUztBQUFBLFVBQ1QsTUFBTTtBQUFBLFlBQ0YsTUFBTTtBQUFBLFVBQ1Y7QUFBQSxRQUNKO0FBQUEsTUFDSjtBQUFBLElBQ0o7QUFBQSxFQUNKO0FBQ0EsTUFBTSxtQ0FBbUM7QUFBQSxJQUNyQyxnQkFBZ0I7QUFBQSxJQUNoQixNQUFNO0FBQUEsTUFDRixNQUFNO0FBQUEsTUFDTixXQUFXO0FBQUEsTUFDWCxpQkFBaUI7QUFBQSxRQUNiLGNBQWM7QUFBQSxVQUNWLGdCQUFnQjtBQUFBLFVBQ2hCLFNBQVM7QUFBQSxVQUNULE1BQU07QUFBQSxZQUNGLE1BQU07QUFBQSxVQUNWO0FBQUEsUUFDSjtBQUFBLFFBQ0EsTUFBTTtBQUFBLFVBQ0YsZ0JBQWdCO0FBQUEsVUFDaEIsU0FBUztBQUFBLFVBQ1QsTUFBTTtBQUFBLFlBQ0YsTUFBTTtBQUFBLFVBQ1Y7QUFBQSxRQUNKO0FBQUEsUUFDQSxtQkFBbUI7QUFBQSxVQUNmLGdCQUFnQjtBQUFBLFVBQ2hCLFNBQVM7QUFBQSxVQUNULE1BQU07QUFBQSxZQUNGLE1BQU07QUFBQSxVQUNWO0FBQUEsUUFDSjtBQUFBLFFBQ0EsaUJBQWlCO0FBQUEsVUFDYixnQkFBZ0I7QUFBQSxVQUNoQixTQUFTO0FBQUEsVUFDVCxNQUFNO0FBQUEsWUFDRixNQUFNO0FBQUEsVUFDVjtBQUFBLFFBQ0o7QUFBQSxRQUNBLFdBQVc7QUFBQSxVQUNQLGdCQUFnQjtBQUFBLFVBQ2hCLFNBQVM7QUFBQSxVQUNULE1BQU07QUFBQSxZQUNGLE1BQU07QUFBQSxVQUNWO0FBQUEsUUFDSjtBQUFBLFFBQ0EsU0FBUztBQUFBLFVBQ0wsZ0JBQWdCO0FBQUEsVUFDaEIsU0FBUztBQUFBLFVBQ1QsTUFBTTtBQUFBLFlBQ0YsTUFBTTtBQUFBLFVBQ1Y7QUFBQSxRQUNKO0FBQUEsUUFDQSxNQUFNO0FBQUEsVUFDRixnQkFBZ0I7QUFBQSxVQUNoQixTQUFTO0FBQUEsVUFDVCxNQUFNO0FBQUEsWUFDRixNQUFNO0FBQUEsVUFDVjtBQUFBLFFBQ0o7QUFBQSxRQUNBLFdBQVc7QUFBQSxVQUNQLGdCQUFnQjtBQUFBLFVBQ2hCLFNBQVM7QUFBQSxVQUNULE1BQU07QUFBQSxZQUNGLE1BQU07QUFBQSxVQUNWO0FBQUEsUUFDSjtBQUFBLE1BQ0o7QUFBQSxJQUNKO0FBQUEsRUFDSjtBQUNBLE1BQU0sNENBQTRDO0FBQUEsSUFDOUMsZ0JBQWdCO0FBQUEsSUFDaEIsTUFBTTtBQUFBLE1BQ0YsTUFBTTtBQUFBLE1BQ04sV0FBVztBQUFBLE1BQ1gsaUJBQWlCO0FBQUEsUUFDYixXQUFXO0FBQUEsVUFDUCxnQkFBZ0I7QUFBQSxVQUNoQixTQUFTO0FBQUEsVUFDVCxNQUFNO0FBQUEsWUFDRixNQUFNO0FBQUEsVUFDVjtBQUFBLFFBQ0o7QUFBQSxNQUNKO0FBQUEsSUFDSjtBQUFBLEVBQ0o7QUFDQSxNQUFNLHdCQUF3QjtBQUFBLElBQzFCLGdCQUFnQjtBQUFBLElBQ2hCLE1BQU07QUFBQSxNQUNGLE1BQU07QUFBQSxNQUNOLFdBQVc7QUFBQSxNQUNYLGlCQUFpQjtBQUFBLFFBQ2IsTUFBTTtBQUFBLFVBQ0YsZ0JBQWdCO0FBQUEsVUFDaEIsU0FBUztBQUFBLFVBQ1QsTUFBTTtBQUFBLFlBQ0YsTUFBTTtBQUFBLFVBQ1Y7QUFBQSxRQUNKO0FBQUEsUUFDQSxjQUFjO0FBQUEsVUFDVixnQkFBZ0I7QUFBQSxVQUNoQixTQUFTO0FBQUEsVUFDVCxNQUFNO0FBQUEsWUFDRixNQUFNO0FBQUEsVUFDVjtBQUFBLFFBQ0o7QUFBQSxRQUNBLG9CQUFvQjtBQUFBLFVBQ2hCLGdCQUFnQjtBQUFBLFVBQ2hCLFNBQVM7QUFBQSxVQUNULE1BQU07QUFBQSxZQUNGLE1BQU07QUFBQSxVQUNWO0FBQUEsUUFDSjtBQUFBLFFBQ0EsaUJBQWlCO0FBQUEsVUFDYixnQkFBZ0I7QUFBQSxVQUNoQixTQUFTO0FBQUEsVUFDVCxNQUFNO0FBQUEsWUFDRixNQUFNO0FBQUEsVUFDVjtBQUFBLFFBQ0o7QUFBQSxRQUNBLFdBQVc7QUFBQSxVQUNQLGdCQUFnQjtBQUFBLFVBQ2hCLFNBQVM7QUFBQSxVQUNULE1BQU07QUFBQSxZQUNGLE1BQU07QUFBQSxVQUNWO0FBQUEsUUFDSjtBQUFBLFFBQ0EsU0FBUztBQUFBLFVBQ0wsZ0JBQWdCO0FBQUEsVUFDaEIsU0FBUztBQUFBLFVBQ1QsTUFBTTtBQUFBLFlBQ0YsTUFBTTtBQUFBLFVBQ1Y7QUFBQSxRQUNKO0FBQUEsUUFDQSxNQUFNO0FBQUEsVUFDRixnQkFBZ0I7QUFBQSxVQUNoQixTQUFTO0FBQUEsVUFDVCxNQUFNO0FBQUEsWUFDRixNQUFNO0FBQUEsVUFDVjtBQUFBLFFBQ0o7QUFBQSxRQUNBLFdBQVc7QUFBQSxVQUNQLGdCQUFnQjtBQUFBLFVBQ2hCLFNBQVM7QUFBQSxVQUNULE1BQU07QUFBQSxZQUNGLE1BQU07QUFBQSxVQUNWO0FBQUEsUUFDSjtBQUFBLE1BQ0o7QUFBQSxJQUNKO0FBQUEsRUFDSjtBQUNBLE1BQU0saUNBQWlDO0FBQUEsSUFDbkMsZ0JBQWdCO0FBQUEsSUFDaEIsTUFBTTtBQUFBLE1BQ0YsTUFBTTtBQUFBLE1BQ04sV0FBVztBQUFBLE1BQ1gsaUJBQWlCO0FBQUEsUUFDYixXQUFXO0FBQUEsVUFDUCxnQkFBZ0I7QUFBQSxVQUNoQixTQUFTO0FBQUEsVUFDVCxNQUFNO0FBQUEsWUFDRixNQUFNO0FBQUEsVUFDVjtBQUFBLFFBQ0o7QUFBQSxNQUNKO0FBQUEsSUFDSjtBQUFBLEVBQ0o7QUFDQSxNQUFNLHNDQUFzQztBQUFBLElBQ3hDLGdCQUFnQjtBQUFBLElBQ2hCLE1BQU07QUFBQSxNQUNGLE1BQU07QUFBQSxNQUNOLFdBQVc7QUFBQSxNQUNYLGlCQUFpQjtBQUFBLFFBQ2IsTUFBTTtBQUFBLFVBQ0YsZ0JBQWdCO0FBQUEsVUFDaEIsU0FBUztBQUFBLFVBQ1QsTUFBTTtBQUFBLFlBQ0YsTUFBTTtBQUFBLFVBQ1Y7QUFBQSxRQUNKO0FBQUEsUUFDQSxjQUFjO0FBQUEsVUFDVixnQkFBZ0I7QUFBQSxVQUNoQixTQUFTO0FBQUEsVUFDVCxNQUFNO0FBQUEsWUFDRixNQUFNO0FBQUEsVUFDVjtBQUFBLFFBQ0o7QUFBQSxRQUNBLG9CQUFvQjtBQUFBLFVBQ2hCLGdCQUFnQjtBQUFBLFVBQ2hCLFNBQVM7QUFBQSxVQUNULE1BQU07QUFBQSxZQUNGLE1BQU07QUFBQSxVQUNWO0FBQUEsUUFDSjtBQUFBLFFBQ0EsaUJBQWlCO0FBQUEsVUFDYixnQkFBZ0I7QUFBQSxVQUNoQixTQUFTO0FBQUEsVUFDVCxNQUFNO0FBQUEsWUFDRixNQUFNO0FBQUEsVUFDVjtBQUFBLFFBQ0o7QUFBQSxRQUNBLFdBQVc7QUFBQSxVQUNQLGdCQUFnQjtBQUFBLFVBQ2hCLFNBQVM7QUFBQSxVQUNULE1BQU07QUFBQSxZQUNGLE1BQU07QUFBQSxVQUNWO0FBQUEsUUFDSjtBQUFBLFFBQ0EsU0FBUztBQUFBLFVBQ0wsZ0JBQWdCO0FBQUEsVUFDaEIsU0FBUztBQUFBLFVBQ1QsTUFBTTtBQUFBLFlBQ0YsTUFBTTtBQUFBLFVBQ1Y7QUFBQSxRQUNKO0FBQUEsUUFDQSxNQUFNO0FBQUEsVUFDRixnQkFBZ0I7QUFBQSxVQUNoQixTQUFTO0FBQUEsVUFDVCxNQUFNO0FBQUEsWUFDRixNQUFNO0FBQUEsVUFDVjtBQUFBLFFBQ0o7QUFBQSxRQUNBLFdBQVc7QUFBQSxVQUNQLGdCQUFnQjtBQUFBLFVBQ2hCLFNBQVM7QUFBQSxVQUNULE1BQU07QUFBQSxZQUNGLE1BQU07QUFBQSxVQUNWO0FBQUEsUUFDSjtBQUFBLE1BQ0o7QUFBQSxJQUNKO0FBQUEsRUFDSjtBQUNBLE1BQU0sK0NBQStDO0FBQUEsSUFDakQsZ0JBQWdCO0FBQUEsSUFDaEIsTUFBTTtBQUFBLE1BQ0YsTUFBTTtBQUFBLE1BQ04sV0FBVztBQUFBLE1BQ1gsaUJBQWlCO0FBQUEsUUFDYixXQUFXO0FBQUEsVUFDUCxnQkFBZ0I7QUFBQSxVQUNoQixTQUFTO0FBQUEsVUFDVCxNQUFNO0FBQUEsWUFDRixNQUFNO0FBQUEsVUFDVjtBQUFBLFFBQ0o7QUFBQSxNQUNKO0FBQUEsSUFDSjtBQUFBLEVBQ0o7QUFDQSxNQUFNLGlDQUFpQztBQUFBLElBQ25DLGdCQUFnQjtBQUFBLElBQ2hCLE1BQU07QUFBQSxNQUNGLE1BQU07QUFBQSxNQUNOLFdBQVc7QUFBQSxNQUNYLGlCQUFpQjtBQUFBLFFBQ2IsTUFBTTtBQUFBLFVBQ0YsZ0JBQWdCO0FBQUEsVUFDaEIsU0FBUztBQUFBLFVBQ1QsTUFBTTtBQUFBLFlBQ0YsTUFBTTtBQUFBLFVBQ1Y7QUFBQSxRQUNKO0FBQUEsUUFDQSxjQUFjO0FBQUEsVUFDVixnQkFBZ0I7QUFBQSxVQUNoQixTQUFTO0FBQUEsVUFDVCxNQUFNO0FBQUEsWUFDRixNQUFNO0FBQUEsVUFDVjtBQUFBLFFBQ0o7QUFBQSxRQUNBLGlCQUFpQjtBQUFBLFVBQ2IsZ0JBQWdCO0FBQUEsVUFDaEIsU0FBUztBQUFBLFVBQ1QsTUFBTTtBQUFBLFlBQ0YsTUFBTTtBQUFBLFVBQ1Y7QUFBQSxRQUNKO0FBQUEsUUFDQSxXQUFXO0FBQUEsVUFDUCxnQkFBZ0I7QUFBQSxVQUNoQixTQUFTO0FBQUEsVUFDVCxNQUFNO0FBQUEsWUFDRixNQUFNO0FBQUEsVUFDVjtBQUFBLFFBQ0o7QUFBQSxRQUNBLFNBQVM7QUFBQSxVQUNMLGdCQUFnQjtBQUFBLFVBQ2hCLFNBQVM7QUFBQSxVQUNULE1BQU07QUFBQSxZQUNGLE1BQU07QUFBQSxVQUNWO0FBQUEsUUFDSjtBQUFBLFFBQ0EsTUFBTTtBQUFBLFVBQ0YsZ0JBQWdCO0FBQUEsVUFDaEIsU0FBUztBQUFBLFVBQ1QsTUFBTTtBQUFBLFlBQ0YsTUFBTTtBQUFBLFVBQ1Y7QUFBQSxRQUNKO0FBQUEsUUFDQSxRQUFRO0FBQUEsVUFDSixnQkFBZ0I7QUFBQSxVQUNoQixTQUFTO0FBQUEsVUFDVCxNQUFNO0FBQUEsWUFDRixNQUFNO0FBQUEsVUFDVjtBQUFBLFFBQ0o7QUFBQSxRQUNBLFlBQVk7QUFBQSxVQUNSLGdCQUFnQjtBQUFBLFVBQ2hCLFNBQVM7QUFBQSxVQUNULE1BQU07QUFBQSxZQUNGLE1BQU07QUFBQSxZQUNOLGVBQWUsQ0FBQyxXQUFXLFdBQVcsV0FBVyxRQUFRO0FBQUEsVUFDN0Q7QUFBQSxRQUNKO0FBQUEsUUFDQSxXQUFXO0FBQUEsVUFDUCxnQkFBZ0I7QUFBQSxVQUNoQixTQUFTO0FBQUEsVUFDVCxNQUFNO0FBQUEsWUFDRixNQUFNO0FBQUEsVUFDVjtBQUFBLFFBQ0o7QUFBQSxNQUNKO0FBQUEsSUFDSjtBQUFBLEVBQ0o7QUFDQSxNQUFNLDBDQUEwQztBQUFBLElBQzVDLGdCQUFnQjtBQUFBLElBQ2hCLE1BQU07QUFBQSxNQUNGLE1BQU07QUFBQSxNQUNOLFdBQVc7QUFBQSxNQUNYLGlCQUFpQjtBQUFBLFFBQ2IsV0FBVztBQUFBLFVBQ1AsZ0JBQWdCO0FBQUEsVUFDaEIsU0FBUztBQUFBLFVBQ1QsTUFBTTtBQUFBLFlBQ0YsTUFBTTtBQUFBLFVBQ1Y7QUFBQSxRQUNKO0FBQUEsTUFDSjtBQUFBLElBQ0o7QUFBQSxFQUNKO0FBQ0EsTUFBTSwwQkFBMEI7QUFBQSxJQUM1QixnQkFBZ0I7QUFBQSxJQUNoQixNQUFNO0FBQUEsTUFDRixNQUFNO0FBQUEsTUFDTixXQUFXO0FBQUEsTUFDWCxpQkFBaUI7QUFBQSxRQUNiLE1BQU07QUFBQSxVQUNGLGdCQUFnQjtBQUFBLFVBQ2hCLFNBQVM7QUFBQSxVQUNULE1BQU07QUFBQSxZQUNGLE1BQU07QUFBQSxVQUNWO0FBQUEsUUFDSjtBQUFBLFFBQ0EsY0FBYztBQUFBLFVBQ1YsZ0JBQWdCO0FBQUEsVUFDaEIsU0FBUztBQUFBLFVBQ1QsTUFBTTtBQUFBLFlBQ0YsTUFBTTtBQUFBLFVBQ1Y7QUFBQSxRQUNKO0FBQUEsUUFDQSxZQUFZO0FBQUEsVUFDUixnQkFBZ0I7QUFBQSxVQUNoQixTQUFTO0FBQUEsVUFDVCxNQUFNO0FBQUEsWUFDRixNQUFNO0FBQUEsVUFDVjtBQUFBLFFBQ0o7QUFBQSxRQUNBLGlCQUFpQjtBQUFBLFVBQ2IsZ0JBQWdCO0FBQUEsVUFDaEIsU0FBUztBQUFBLFVBQ1QsTUFBTTtBQUFBLFlBQ0YsTUFBTTtBQUFBLFVBQ1Y7QUFBQSxRQUNKO0FBQUEsUUFDQSxXQUFXO0FBQUEsVUFDUCxnQkFBZ0I7QUFBQSxVQUNoQixTQUFTO0FBQUEsVUFDVCxNQUFNO0FBQUEsWUFDRixNQUFNO0FBQUEsVUFDVjtBQUFBLFFBQ0o7QUFBQSxRQUNBLFNBQVM7QUFBQSxVQUNMLGdCQUFnQjtBQUFBLFVBQ2hCLFNBQVM7QUFBQSxVQUNULE1BQU07QUFBQSxZQUNGLE1BQU07QUFBQSxVQUNWO0FBQUEsUUFDSjtBQUFBLFFBQ0EsV0FBVztBQUFBLFVBQ1AsZ0JBQWdCO0FBQUEsVUFDaEIsU0FBUztBQUFBLFVBQ1QsTUFBTTtBQUFBLFlBQ0YsTUFBTTtBQUFBLFVBQ1Y7QUFBQSxRQUNKO0FBQUEsUUFDQSxNQUFNO0FBQUEsVUFDRixnQkFBZ0I7QUFBQSxVQUNoQixTQUFTO0FBQUEsVUFDVCxNQUFNO0FBQUEsWUFDRixNQUFNO0FBQUEsVUFDVjtBQUFBLFFBQ0o7QUFBQSxRQUNBLG1CQUFtQjtBQUFBLFVBQ2YsZ0JBQWdCO0FBQUEsVUFDaEIsU0FBUztBQUFBLFVBQ1QsTUFBTTtBQUFBLFlBQ0YsTUFBTTtBQUFBLFVBQ1Y7QUFBQSxRQUNKO0FBQUEsUUFDQSxxQkFBcUI7QUFBQSxVQUNqQixnQkFBZ0I7QUFBQSxVQUNoQixTQUFTO0FBQUEsVUFDVCxNQUFNO0FBQUEsWUFDRixNQUFNO0FBQUEsVUFDVjtBQUFBLFFBQ0o7QUFBQSxRQUNBLGlCQUFpQjtBQUFBLFVBQ2IsZ0JBQWdCO0FBQUEsVUFDaEIsU0FBUztBQUFBLFVBQ1QsTUFBTTtBQUFBLFlBQ0YsTUFBTTtBQUFBLFVBQ1Y7QUFBQSxRQUNKO0FBQUEsUUFDQSxXQUFXO0FBQUEsVUFDUCxnQkFBZ0I7QUFBQSxVQUNoQixTQUFTO0FBQUEsVUFDVCxNQUFNO0FBQUEsWUFDRixNQUFNO0FBQUEsVUFDVjtBQUFBLFFBQ0o7QUFBQSxNQUNKO0FBQUEsSUFDSjtBQUFBLEVBQ0o7QUFDQSxNQUFNLG1DQUFtQztBQUFBLElBQ3JDLGdCQUFnQjtBQUFBLElBQ2hCLE1BQU07QUFBQSxNQUNGLE1BQU07QUFBQSxNQUNOLFdBQVc7QUFBQSxNQUNYLGlCQUFpQjtBQUFBLFFBQ2IsV0FBVztBQUFBLFVBQ1AsZ0JBQWdCO0FBQUEsVUFDaEIsU0FBUztBQUFBLFVBQ1QsTUFBTTtBQUFBLFlBQ0YsTUFBTTtBQUFBLFVBQ1Y7QUFBQSxRQUNKO0FBQUEsTUFDSjtBQUFBLElBQ0o7QUFBQSxFQUNKO0FBQ0EsTUFBTSwrQkFBK0I7QUFBQSxJQUNqQyxnQkFBZ0I7QUFBQSxJQUNoQixNQUFNO0FBQUEsTUFDRixNQUFNO0FBQUEsTUFDTixXQUFXO0FBQUEsTUFDWCxpQkFBaUI7QUFBQSxRQUNiLE1BQU07QUFBQSxVQUNGLGdCQUFnQjtBQUFBLFVBQ2hCLFNBQVM7QUFBQSxVQUNULE1BQU07QUFBQSxZQUNGLE1BQU07QUFBQSxVQUNWO0FBQUEsUUFDSjtBQUFBLFFBQ0EsY0FBYztBQUFBLFVBQ1YsZ0JBQWdCO0FBQUEsVUFDaEIsU0FBUztBQUFBLFVBQ1QsTUFBTTtBQUFBLFlBQ0YsTUFBTTtBQUFBLFVBQ1Y7QUFBQSxRQUNKO0FBQUEsUUFDQSxZQUFZO0FBQUEsVUFDUixnQkFBZ0I7QUFBQSxVQUNoQixTQUFTO0FBQUEsVUFDVCxNQUFNO0FBQUEsWUFDRixNQUFNO0FBQUEsVUFDVjtBQUFBLFFBQ0o7QUFBQSxRQUNBLGlCQUFpQjtBQUFBLFVBQ2IsZ0JBQWdCO0FBQUEsVUFDaEIsU0FBUztBQUFBLFVBQ1QsTUFBTTtBQUFBLFlBQ0YsTUFBTTtBQUFBLFVBQ1Y7QUFBQSxRQUNKO0FBQUEsUUFDQSxpQkFBaUI7QUFBQSxVQUNiLGdCQUFnQjtBQUFBLFVBQ2hCLFNBQVM7QUFBQSxVQUNULE1BQU07QUFBQSxZQUNGLE1BQU07QUFBQSxVQUNWO0FBQUEsUUFDSjtBQUFBLFFBQ0EsV0FBVztBQUFBLFVBQ1AsZ0JBQWdCO0FBQUEsVUFDaEIsU0FBUztBQUFBLFVBQ1QsTUFBTTtBQUFBLFlBQ0YsTUFBTTtBQUFBLFVBQ1Y7QUFBQSxRQUNKO0FBQUEsUUFDQSxTQUFTO0FBQUEsVUFDTCxnQkFBZ0I7QUFBQSxVQUNoQixTQUFTO0FBQUEsVUFDVCxNQUFNO0FBQUEsWUFDRixNQUFNO0FBQUEsVUFDVjtBQUFBLFFBQ0o7QUFBQSxRQUNBLE1BQU07QUFBQSxVQUNGLGdCQUFnQjtBQUFBLFVBQ2hCLFNBQVM7QUFBQSxVQUNULE1BQU07QUFBQSxZQUNGLE1BQU07QUFBQSxVQUNWO0FBQUEsUUFDSjtBQUFBLFFBQ0Esa0JBQWtCO0FBQUEsVUFDZCxnQkFBZ0I7QUFBQSxVQUNoQixTQUFTO0FBQUEsVUFDVCxNQUFNO0FBQUEsWUFDRixNQUFNO0FBQUEsVUFDVjtBQUFBLFFBQ0o7QUFBQSxRQUNBLHlCQUF5QjtBQUFBLFVBQ3JCLGdCQUFnQjtBQUFBLFVBQ2hCLFNBQVM7QUFBQSxVQUNULE1BQU07QUFBQSxZQUNGLE1BQU07QUFBQSxVQUNWO0FBQUEsUUFDSjtBQUFBLFFBQ0EsbUJBQW1CO0FBQUEsVUFDZixnQkFBZ0I7QUFBQSxVQUNoQixTQUFTO0FBQUEsVUFDVCxNQUFNO0FBQUEsWUFDRixNQUFNO0FBQUEsVUFDVjtBQUFBLFFBQ0o7QUFBQSxRQUNBLHFCQUFxQjtBQUFBLFVBQ2pCLGdCQUFnQjtBQUFBLFVBQ2hCLFNBQVM7QUFBQSxVQUNULE1BQU07QUFBQSxZQUNGLE1BQU07QUFBQSxVQUNWO0FBQUEsUUFDSjtBQUFBLFFBQ0EsaUJBQWlCO0FBQUEsVUFDYixnQkFBZ0I7QUFBQSxVQUNoQixTQUFTO0FBQUEsVUFDVCxNQUFNO0FBQUEsWUFDRixNQUFNO0FBQUEsVUFDVjtBQUFBLFFBQ0o7QUFBQSxRQUNBLFdBQVc7QUFBQSxVQUNQLGdCQUFnQjtBQUFBLFVBQ2hCLFNBQVM7QUFBQSxVQUNULE1BQU07QUFBQSxZQUNGLE1BQU07QUFBQSxVQUNWO0FBQUEsUUFDSjtBQUFBLE1BQ0o7QUFBQSxJQUNKO0FBQUEsRUFDSjtBQUNBLE1BQU0sd0NBQXdDO0FBQUEsSUFDMUMsZ0JBQWdCO0FBQUEsSUFDaEIsTUFBTTtBQUFBLE1BQ0YsTUFBTTtBQUFBLE1BQ04sV0FBVztBQUFBLE1BQ1gsaUJBQWlCO0FBQUEsUUFDYixXQUFXO0FBQUEsVUFDUCxnQkFBZ0I7QUFBQSxVQUNoQixTQUFTO0FBQUEsVUFDVCxNQUFNO0FBQUEsWUFDRixNQUFNO0FBQUEsVUFDVjtBQUFBLFFBQ0o7QUFBQSxNQUNKO0FBQUEsSUFDSjtBQUFBLEVBQ0o7QUFDQSxNQUFNLHNDQUFzQztBQUFBLElBQ3hDLGdCQUFnQjtBQUFBLElBQ2hCLE1BQU07QUFBQSxNQUNGLE1BQU07QUFBQSxNQUNOLFdBQVc7QUFBQSxNQUNYLGlCQUFpQjtBQUFBLFFBQ2IsTUFBTTtBQUFBLFVBQ0YsZ0JBQWdCO0FBQUEsVUFDaEIsU0FBUztBQUFBLFVBQ1QsTUFBTTtBQUFBLFlBQ0YsTUFBTTtBQUFBLFVBQ1Y7QUFBQSxRQUNKO0FBQUEsUUFDQSxjQUFjO0FBQUEsVUFDVixnQkFBZ0I7QUFBQSxVQUNoQixTQUFTO0FBQUEsVUFDVCxNQUFNO0FBQUEsWUFDRixNQUFNO0FBQUEsVUFDVjtBQUFBLFFBQ0o7QUFBQSxRQUNBLFlBQVk7QUFBQSxVQUNSLGdCQUFnQjtBQUFBLFVBQ2hCLFNBQVM7QUFBQSxVQUNULE1BQU07QUFBQSxZQUNGLE1BQU07QUFBQSxVQUNWO0FBQUEsUUFDSjtBQUFBLFFBQ0EsaUJBQWlCO0FBQUEsVUFDYixnQkFBZ0I7QUFBQSxVQUNoQixTQUFTO0FBQUEsVUFDVCxNQUFNO0FBQUEsWUFDRixNQUFNO0FBQUEsVUFDVjtBQUFBLFFBQ0o7QUFBQSxRQUNBLFdBQVc7QUFBQSxVQUNQLGdCQUFnQjtBQUFBLFVBQ2hCLFNBQVM7QUFBQSxVQUNULE1BQU07QUFBQSxZQUNGLE1BQU07QUFBQSxVQUNWO0FBQUEsUUFDSjtBQUFBLFFBQ0EsU0FBUztBQUFBLFVBQ0wsZ0JBQWdCO0FBQUEsVUFDaEIsU0FBUztBQUFBLFVBQ1QsTUFBTTtBQUFBLFlBQ0YsTUFBTTtBQUFBLFVBQ1Y7QUFBQSxRQUNKO0FBQUEsUUFDQSxNQUFNO0FBQUEsVUFDRixnQkFBZ0I7QUFBQSxVQUNoQixTQUFTO0FBQUEsVUFDVCxNQUFNO0FBQUEsWUFDRixNQUFNO0FBQUEsVUFDVjtBQUFBLFFBQ0o7QUFBQSxRQUNBLGtCQUFrQjtBQUFBLFVBQ2QsZ0JBQWdCO0FBQUEsVUFDaEIsU0FBUztBQUFBLFVBQ1QsTUFBTTtBQUFBLFlBQ0YsTUFBTTtBQUFBLFVBQ1Y7QUFBQSxRQUNKO0FBQUEsUUFDQSx5QkFBeUI7QUFBQSxVQUNyQixnQkFBZ0I7QUFBQSxVQUNoQixTQUFTO0FBQUEsVUFDVCxNQUFNO0FBQUEsWUFDRixNQUFNO0FBQUEsVUFDVjtBQUFBLFFBQ0o7QUFBQSxRQUNBLHFCQUFxQjtBQUFBLFVBQ2pCLGdCQUFnQjtBQUFBLFVBQ2hCLFNBQVM7QUFBQSxVQUNULE1BQU07QUFBQSxZQUNGLE1BQU07QUFBQSxVQUNWO0FBQUEsUUFDSjtBQUFBLFFBQ0EsaUJBQWlCO0FBQUEsVUFDYixnQkFBZ0I7QUFBQSxVQUNoQixTQUFTO0FBQUEsVUFDVCxNQUFNO0FBQUEsWUFDRixNQUFNO0FBQUEsVUFDVjtBQUFBLFFBQ0o7QUFBQSxRQUNBLG1CQUFtQjtBQUFBLFVBQ2YsZ0JBQWdCO0FBQUEsVUFDaEIsU0FBUztBQUFBLFVBQ1QsTUFBTTtBQUFBLFlBQ0YsTUFBTTtBQUFBLFVBQ1Y7QUFBQSxRQUNKO0FBQUEsUUFDQSxXQUFXO0FBQUEsVUFDUCxnQkFBZ0I7QUFBQSxVQUNoQixTQUFTO0FBQUEsVUFDVCxNQUFNO0FBQUEsWUFDRixNQUFNO0FBQUEsVUFDVjtBQUFBLFFBQ0o7QUFBQSxNQUNKO0FBQUEsSUFDSjtBQUFBLEVBQ0o7QUFDQSxNQUFNLCtDQUErQztBQUFBLElBQ2pELGdCQUFnQjtBQUFBLElBQ2hCLE1BQU07QUFBQSxNQUNGLE1BQU07QUFBQSxNQUNOLFdBQVc7QUFBQSxNQUNYLGlCQUFpQjtBQUFBLFFBQ2IsV0FBVztBQUFBLFVBQ1AsZ0JBQWdCO0FBQUEsVUFDaEIsU0FBUztBQUFBLFVBQ1QsTUFBTTtBQUFBLFlBQ0YsTUFBTTtBQUFBLFVBQ1Y7QUFBQSxRQUNKO0FBQUEsTUFDSjtBQUFBLElBQ0o7QUFBQSxFQUNKO0FBQ0EsTUFBTSx3QkFBd0I7QUFBQSxJQUMxQixnQkFBZ0I7QUFBQSxJQUNoQixNQUFNO0FBQUEsTUFDRixNQUFNO0FBQUEsTUFDTixXQUFXO0FBQUEsTUFDWCxpQkFBaUI7QUFBQSxRQUNiLE1BQU07QUFBQSxVQUNGLGdCQUFnQjtBQUFBLFVBQ2hCLFNBQVM7QUFBQSxVQUNULE1BQU07QUFBQSxZQUNGLE1BQU07QUFBQSxVQUNWO0FBQUEsUUFDSjtBQUFBLFFBQ0EsY0FBYztBQUFBLFVBQ1YsZ0JBQWdCO0FBQUEsVUFDaEIsU0FBUztBQUFBLFVBQ1QsTUFBTTtBQUFBLFlBQ0YsTUFBTTtBQUFBLFVBQ1Y7QUFBQSxRQUNKO0FBQUEsUUFDQSxpQkFBaUI7QUFBQSxVQUNiLGdCQUFnQjtBQUFBLFVBQ2hCLFNBQVM7QUFBQSxVQUNULE1BQU07QUFBQSxZQUNGLE1BQU07QUFBQSxVQUNWO0FBQUEsUUFDSjtBQUFBLFFBQ0EsV0FBVztBQUFBLFVBQ1AsZ0JBQWdCO0FBQUEsVUFDaEIsU0FBUztBQUFBLFVBQ1QsTUFBTTtBQUFBLFlBQ0YsTUFBTTtBQUFBLFVBQ1Y7QUFBQSxRQUNKO0FBQUEsUUFDQSxTQUFTO0FBQUEsVUFDTCxnQkFBZ0I7QUFBQSxVQUNoQixTQUFTO0FBQUEsVUFDVCxNQUFNO0FBQUEsWUFDRixNQUFNO0FBQUEsVUFDVjtBQUFBLFFBQ0o7QUFBQSxRQUNBLE1BQU07QUFBQSxVQUNGLGdCQUFnQjtBQUFBLFVBQ2hCLFNBQVM7QUFBQSxVQUNULE1BQU07QUFBQSxZQUNGLE1BQU07QUFBQSxVQUNWO0FBQUEsUUFDSjtBQUFBLFFBQ0EsVUFBVTtBQUFBLFVBQ04sZ0JBQWdCO0FBQUEsVUFDaEIsU0FBUztBQUFBLFVBQ1QsTUFBTTtBQUFBLFlBQ0YsTUFBTTtBQUFBLFVBQ1Y7QUFBQSxRQUNKO0FBQUEsTUFDSjtBQUFBLElBQ0o7QUFBQSxFQUNKO0FBQ0EsTUFBTSxpQ0FBaUM7QUFBQSxJQUNuQyxnQkFBZ0I7QUFBQSxJQUNoQixNQUFNO0FBQUEsTUFDRixNQUFNO0FBQUEsTUFDTixXQUFXO0FBQUEsTUFDWCxpQkFBaUI7QUFBQSxRQUNiLFdBQVc7QUFBQSxVQUNQLGdCQUFnQjtBQUFBLFVBQ2hCLFNBQVM7QUFBQSxVQUNULE1BQU07QUFBQSxZQUNGLE1BQU07QUFBQSxVQUNWO0FBQUEsUUFDSjtBQUFBLE1BQ0o7QUFBQSxJQUNKO0FBQUEsRUFDSjtBQUNBLE1BQU0seUJBQXlCO0FBQUEsSUFDM0IsZ0JBQWdCO0FBQUEsSUFDaEIsTUFBTTtBQUFBLE1BQ0YsTUFBTTtBQUFBLE1BQ04sV0FBVztBQUFBLE1BQ1gsaUJBQWlCO0FBQUEsUUFDYixNQUFNO0FBQUEsVUFDRixnQkFBZ0I7QUFBQSxVQUNoQixTQUFTO0FBQUEsVUFDVCxNQUFNO0FBQUEsWUFDRixNQUFNO0FBQUEsVUFDVjtBQUFBLFFBQ0o7QUFBQSxRQUNBLGNBQWM7QUFBQSxVQUNWLGdCQUFnQjtBQUFBLFVBQ2hCLFNBQVM7QUFBQSxVQUNULE1BQU07QUFBQSxZQUNGLE1BQU07QUFBQSxVQUNWO0FBQUEsUUFDSjtBQUFBLFFBQ0EsWUFBWTtBQUFBLFVBQ1IsZ0JBQWdCO0FBQUEsVUFDaEIsU0FBUztBQUFBLFVBQ1QsTUFBTTtBQUFBLFlBQ0YsTUFBTTtBQUFBLFVBQ1Y7QUFBQSxRQUNKO0FBQUEsUUFDQSxpQkFBaUI7QUFBQSxVQUNiLGdCQUFnQjtBQUFBLFVBQ2hCLFNBQVM7QUFBQSxVQUNULE1BQU07QUFBQSxZQUNGLE1BQU07QUFBQSxVQUNWO0FBQUEsUUFDSjtBQUFBLFFBQ0EsV0FBVztBQUFBLFVBQ1AsZ0JBQWdCO0FBQUEsVUFDaEIsU0FBUztBQUFBLFVBQ1QsTUFBTTtBQUFBLFlBQ0YsTUFBTTtBQUFBLFVBQ1Y7QUFBQSxRQUNKO0FBQUEsUUFDQSxTQUFTO0FBQUEsVUFDTCxnQkFBZ0I7QUFBQSxVQUNoQixTQUFTO0FBQUEsVUFDVCxNQUFNO0FBQUEsWUFDRixNQUFNO0FBQUEsVUFDVjtBQUFBLFFBQ0o7QUFBQSxRQUNBLFdBQVc7QUFBQSxVQUNQLGdCQUFnQjtBQUFBLFVBQ2hCLFNBQVM7QUFBQSxVQUNULE1BQU07QUFBQSxZQUNGLE1BQU07QUFBQSxVQUNWO0FBQUEsUUFDSjtBQUFBLFFBQ0EsTUFBTTtBQUFBLFVBQ0YsZ0JBQWdCO0FBQUEsVUFDaEIsU0FBUztBQUFBLFVBQ1QsTUFBTTtBQUFBLFlBQ0YsTUFBTTtBQUFBLFVBQ1Y7QUFBQSxRQUNKO0FBQUEsUUFDQSxtQkFBbUI7QUFBQSxVQUNmLGdCQUFnQjtBQUFBLFVBQ2hCLFNBQVM7QUFBQSxVQUNULE1BQU07QUFBQSxZQUNGLE1BQU07QUFBQSxVQUNWO0FBQUEsUUFDSjtBQUFBLFFBQ0EscUJBQXFCO0FBQUEsVUFDakIsZ0JBQWdCO0FBQUEsVUFDaEIsU0FBUztBQUFBLFVBQ1QsTUFBTTtBQUFBLFlBQ0YsTUFBTTtBQUFBLFVBQ1Y7QUFBQSxRQUNKO0FBQUEsUUFDQSxpQkFBaUI7QUFBQSxVQUNiLGdCQUFnQjtBQUFBLFVBQ2hCLFNBQVM7QUFBQSxVQUNULE1BQU07QUFBQSxZQUNGLE1BQU07QUFBQSxVQUNWO0FBQUEsUUFDSjtBQUFBLFFBQ0EsV0FBVztBQUFBLFVBQ1AsZ0JBQWdCO0FBQUEsVUFDaEIsU0FBUztBQUFBLFVBQ1QsTUFBTTtBQUFBLFlBQ0YsTUFBTTtBQUFBLFVBQ1Y7QUFBQSxRQUNKO0FBQUEsTUFDSjtBQUFBLElBQ0o7QUFBQSxFQUNKO0FBQ0EsTUFBTSxrQ0FBa0M7QUFBQSxJQUNwQyxnQkFBZ0I7QUFBQSxJQUNoQixNQUFNO0FBQUEsTUFDRixNQUFNO0FBQUEsTUFDTixXQUFXO0FBQUEsTUFDWCxpQkFBaUI7QUFBQSxRQUNiLFdBQVc7QUFBQSxVQUNQLGdCQUFnQjtBQUFBLFVBQ2hCLFNBQVM7QUFBQSxVQUNULE1BQU07QUFBQSxZQUNGLE1BQU07QUFBQSxVQUNWO0FBQUEsUUFDSjtBQUFBLE1BQ0o7QUFBQSxJQUNKO0FBQUEsRUFDSjtBQUNBLE1BQU0saUNBQWlDO0FBQUEsSUFDbkMsZ0JBQWdCO0FBQUEsSUFDaEIsTUFBTTtBQUFBLE1BQ0YsTUFBTTtBQUFBLE1BQ04sV0FBVztBQUFBLE1BQ1gsaUJBQWlCO0FBQUEsUUFDYixNQUFNO0FBQUEsVUFDRixnQkFBZ0I7QUFBQSxVQUNoQixTQUFTO0FBQUEsVUFDVCxNQUFNO0FBQUEsWUFDRixNQUFNO0FBQUEsVUFDVjtBQUFBLFFBQ0o7QUFBQSxRQUNBLGNBQWM7QUFBQSxVQUNWLGdCQUFnQjtBQUFBLFVBQ2hCLFNBQVM7QUFBQSxVQUNULE1BQU07QUFBQSxZQUNGLE1BQU07QUFBQSxVQUNWO0FBQUEsUUFDSjtBQUFBLFFBQ0EsWUFBWTtBQUFBLFVBQ1IsZ0JBQWdCO0FBQUEsVUFDaEIsU0FBUztBQUFBLFVBQ1QsTUFBTTtBQUFBLFlBQ0YsTUFBTTtBQUFBLFVBQ1Y7QUFBQSxRQUNKO0FBQUEsUUFDQSxpQkFBaUI7QUFBQSxVQUNiLGdCQUFnQjtBQUFBLFVBQ2hCLFNBQVM7QUFBQSxVQUNULE1BQU07QUFBQSxZQUNGLE1BQU07QUFBQSxVQUNWO0FBQUEsUUFDSjtBQUFBLFFBQ0EsV0FBVztBQUFBLFVBQ1AsZ0JBQWdCO0FBQUEsVUFDaEIsU0FBUztBQUFBLFVBQ1QsTUFBTTtBQUFBLFlBQ0YsTUFBTTtBQUFBLFVBQ1Y7QUFBQSxRQUNKO0FBQUEsUUFDQSxTQUFTO0FBQUEsVUFDTCxnQkFBZ0I7QUFBQSxVQUNoQixTQUFTO0FBQUEsVUFDVCxNQUFNO0FBQUEsWUFDRixNQUFNO0FBQUEsVUFDVjtBQUFBLFFBQ0o7QUFBQSxRQUNBLFdBQVc7QUFBQSxVQUNQLGdCQUFnQjtBQUFBLFVBQ2hCLFNBQVM7QUFBQSxVQUNULE1BQU07QUFBQSxZQUNGLE1BQU07QUFBQSxVQUNWO0FBQUEsUUFDSjtBQUFBLFFBQ0EsTUFBTTtBQUFBLFVBQ0YsZ0JBQWdCO0FBQUEsVUFDaEIsU0FBUztBQUFBLFVBQ1QsTUFBTTtBQUFBLFlBQ0YsTUFBTTtBQUFBLFVBQ1Y7QUFBQSxRQUNKO0FBQUEsUUFDQSxtQkFBbUI7QUFBQSxVQUNmLGdCQUFnQjtBQUFBLFVBQ2hCLFNBQVM7QUFBQSxVQUNULE1BQU07QUFBQSxZQUNGLE1BQU07QUFBQSxVQUNWO0FBQUEsUUFDSjtBQUFBLFFBQ0EscUJBQXFCO0FBQUEsVUFDakIsZ0JBQWdCO0FBQUEsVUFDaEIsU0FBUztBQUFBLFVBQ1QsTUFBTTtBQUFBLFlBQ0YsTUFBTTtBQUFBLFVBQ1Y7QUFBQSxRQUNKO0FBQUEsUUFDQSxpQkFBaUI7QUFBQSxVQUNiLGdCQUFnQjtBQUFBLFVBQ2hCLFNBQVM7QUFBQSxVQUNULE1BQU07QUFBQSxZQUNGLE1BQU07QUFBQSxVQUNWO0FBQUEsUUFDSjtBQUFBLFFBQ0EsV0FBVztBQUFBLFVBQ1AsZ0JBQWdCO0FBQUEsVUFDaEIsU0FBUztBQUFBLFVBQ1QsTUFBTTtBQUFBLFlBQ0YsTUFBTTtBQUFBLFVBQ1Y7QUFBQSxRQUNKO0FBQUEsTUFDSjtBQUFBLElBQ0o7QUFBQSxFQUNKO0FBQ0EsTUFBTSwwQ0FBMEM7QUFBQSxJQUM1QyxnQkFBZ0I7QUFBQSxJQUNoQixNQUFNO0FBQUEsTUFDRixNQUFNO0FBQUEsTUFDTixXQUFXO0FBQUEsTUFDWCxpQkFBaUI7QUFBQSxRQUNiLFdBQVc7QUFBQSxVQUNQLGdCQUFnQjtBQUFBLFVBQ2hCLFNBQVM7QUFBQSxVQUNULE1BQU07QUFBQSxZQUNGLE1BQU07QUFBQSxVQUNWO0FBQUEsUUFDSjtBQUFBLE1BQ0o7QUFBQSxJQUNKO0FBQUEsRUFDSjtBQUNBLE1BQU0sNkJBQTZCO0FBQUEsSUFDL0IsZ0JBQWdCO0FBQUEsSUFDaEIsTUFBTTtBQUFBLE1BQ0YsTUFBTTtBQUFBLE1BQ04sV0FBVztBQUFBLE1BQ1gsaUJBQWlCO0FBQUEsUUFDYixZQUFZO0FBQUEsVUFDUixnQkFBZ0I7QUFBQSxVQUNoQixTQUFTO0FBQUEsVUFDVCxNQUFNO0FBQUEsWUFDRixNQUFNO0FBQUEsVUFDVjtBQUFBLFFBQ0o7QUFBQSxRQUNBLGlCQUFpQjtBQUFBLFVBQ2IsZ0JBQWdCO0FBQUEsVUFDaEIsU0FBUztBQUFBLFVBQ1QsTUFBTTtBQUFBLFlBQ0YsTUFBTTtBQUFBLFVBQ1Y7QUFBQSxRQUNKO0FBQUEsUUFDQSxXQUFXO0FBQUEsVUFDUCxnQkFBZ0I7QUFBQSxVQUNoQixTQUFTO0FBQUEsVUFDVCxNQUFNO0FBQUEsWUFDRixNQUFNO0FBQUEsVUFDVjtBQUFBLFFBQ0o7QUFBQSxRQUNBLFNBQVM7QUFBQSxVQUNMLGdCQUFnQjtBQUFBLFVBQ2hCLFNBQVM7QUFBQSxVQUNULE1BQU07QUFBQSxZQUNGLE1BQU07QUFBQSxVQUNWO0FBQUEsUUFDSjtBQUFBLFFBQ0EsTUFBTTtBQUFBLFVBQ0YsZ0JBQWdCO0FBQUEsVUFDaEIsU0FBUztBQUFBLFVBQ1QsTUFBTTtBQUFBLFlBQ0YsTUFBTTtBQUFBLFVBQ1Y7QUFBQSxRQUNKO0FBQUEsUUFDQSxpQkFBaUI7QUFBQSxVQUNiLGdCQUFnQjtBQUFBLFVBQ2hCLFNBQVM7QUFBQSxVQUNULE1BQU07QUFBQSxZQUNGLE1BQU07QUFBQSxVQUNWO0FBQUEsUUFDSjtBQUFBLFFBQ0EsbUJBQW1CO0FBQUEsVUFDZixnQkFBZ0I7QUFBQSxVQUNoQixTQUFTO0FBQUEsVUFDVCxNQUFNO0FBQUEsWUFDRixNQUFNO0FBQUEsVUFDVjtBQUFBLFFBQ0o7QUFBQSxRQUNBLHFCQUFxQjtBQUFBLFVBQ2pCLGdCQUFnQjtBQUFBLFVBQ2hCLFNBQVM7QUFBQSxVQUNULE1BQU07QUFBQSxZQUNGLE1BQU07QUFBQSxVQUNWO0FBQUEsUUFDSjtBQUFBLFFBQ0EsaUJBQWlCO0FBQUEsVUFDYixnQkFBZ0I7QUFBQSxVQUNoQixTQUFTO0FBQUEsVUFDVCxNQUFNO0FBQUEsWUFDRixNQUFNO0FBQUEsVUFDVjtBQUFBLFFBQ0o7QUFBQSxRQUNBLFdBQVc7QUFBQSxVQUNQLGdCQUFnQjtBQUFBLFVBQ2hCLFNBQVM7QUFBQSxVQUNULE1BQU07QUFBQSxZQUNGLE1BQU07QUFBQSxVQUNWO0FBQUEsUUFDSjtBQUFBLE1BQ0o7QUFBQSxJQUNKO0FBQUEsRUFDSjtBQUNBLE1BQU0sc0NBQXNDO0FBQUEsSUFDeEMsZ0JBQWdCO0FBQUEsSUFDaEIsTUFBTTtBQUFBLE1BQ0YsTUFBTTtBQUFBLE1BQ04sV0FBVztBQUFBLE1BQ1gsaUJBQWlCO0FBQUEsUUFDYixXQUFXO0FBQUEsVUFDUCxnQkFBZ0I7QUFBQSxVQUNoQixTQUFTO0FBQUEsVUFDVCxNQUFNO0FBQUEsWUFDRixNQUFNO0FBQUEsVUFDVjtBQUFBLFFBQ0o7QUFBQSxNQUNKO0FBQUEsSUFDSjtBQUFBLEVBQ0o7QUFDQSxNQUFNLG9DQUFvQztBQUFBLElBQ3RDLGdCQUFnQjtBQUFBLElBQ2hCLE1BQU07QUFBQSxNQUNGLE1BQU07QUFBQSxNQUNOLFdBQVc7QUFBQSxNQUNYLGlCQUFpQjtBQUFBLFFBQ2IsWUFBWTtBQUFBLFVBQ1IsZ0JBQWdCO0FBQUEsVUFDaEIsU0FBUztBQUFBLFVBQ1QsTUFBTTtBQUFBLFlBQ0YsTUFBTTtBQUFBLFVBQ1Y7QUFBQSxRQUNKO0FBQUEsUUFDQSxpQkFBaUI7QUFBQSxVQUNiLGdCQUFnQjtBQUFBLFVBQ2hCLFNBQVM7QUFBQSxVQUNULE1BQU07QUFBQSxZQUNGLE1BQU07QUFBQSxVQUNWO0FBQUEsUUFDSjtBQUFBLFFBQ0EsaUJBQWlCO0FBQUEsVUFDYixnQkFBZ0I7QUFBQSxVQUNoQixTQUFTO0FBQUEsVUFDVCxNQUFNO0FBQUEsWUFDRixNQUFNO0FBQUEsVUFDVjtBQUFBLFFBQ0o7QUFBQSxRQUNBLFdBQVc7QUFBQSxVQUNQLGdCQUFnQjtBQUFBLFVBQ2hCLFNBQVM7QUFBQSxVQUNULE1BQU07QUFBQSxZQUNGLE1BQU07QUFBQSxVQUNWO0FBQUEsUUFDSjtBQUFBLFFBQ0EsU0FBUztBQUFBLFVBQ0wsZ0JBQWdCO0FBQUEsVUFDaEIsU0FBUztBQUFBLFVBQ1QsTUFBTTtBQUFBLFlBQ0YsTUFBTTtBQUFBLFVBQ1Y7QUFBQSxRQUNKO0FBQUEsUUFDQSxNQUFNO0FBQUEsVUFDRixnQkFBZ0I7QUFBQSxVQUNoQixTQUFTO0FBQUEsVUFDVCxNQUFNO0FBQUEsWUFDRixNQUFNO0FBQUEsVUFDVjtBQUFBLFFBQ0o7QUFBQSxRQUNBLG1CQUFtQjtBQUFBLFVBQ2YsZ0JBQWdCO0FBQUEsVUFDaEIsU0FBUztBQUFBLFVBQ1QsTUFBTTtBQUFBLFlBQ0YsTUFBTTtBQUFBLFVBQ1Y7QUFBQSxRQUNKO0FBQUEsUUFDQSxxQkFBcUI7QUFBQSxVQUNqQixnQkFBZ0I7QUFBQSxVQUNoQixTQUFTO0FBQUEsVUFDVCxNQUFNO0FBQUEsWUFDRixNQUFNO0FBQUEsVUFDVjtBQUFBLFFBQ0o7QUFBQSxRQUNBLGlCQUFpQjtBQUFBLFVBQ2IsZ0JBQWdCO0FBQUEsVUFDaEIsU0FBUztBQUFBLFVBQ1QsTUFBTTtBQUFBLFlBQ0YsTUFBTTtBQUFBLFVBQ1Y7QUFBQSxRQUNKO0FBQUEsUUFDQSxXQUFXO0FBQUEsVUFDUCxnQkFBZ0I7QUFBQSxVQUNoQixTQUFTO0FBQUEsVUFDVCxNQUFNO0FBQUEsWUFDRixNQUFNO0FBQUEsVUFDVjtBQUFBLFFBQ0o7QUFBQSxNQUNKO0FBQUEsSUFDSjtBQUFBLEVBQ0o7QUFDQSxNQUFNLDZDQUE2QztBQUFBLElBQy9DLGdCQUFnQjtBQUFBLElBQ2hCLE1BQU07QUFBQSxNQUNGLE1BQU07QUFBQSxNQUNOLFdBQVc7QUFBQSxNQUNYLGlCQUFpQjtBQUFBLFFBQ2IsV0FBVztBQUFBLFVBQ1AsZ0JBQWdCO0FBQUEsVUFDaEIsU0FBUztBQUFBLFVBQ1QsTUFBTTtBQUFBLFlBQ0YsTUFBTTtBQUFBLFVBQ1Y7QUFBQSxRQUNKO0FBQUEsTUFDSjtBQUFBLElBQ0o7QUFBQSxFQUNKO0FBQ0EsTUFBTSxrQ0FBa0M7QUFBQSxJQUNwQyxnQkFBZ0I7QUFBQSxJQUNoQixNQUFNO0FBQUEsTUFDRixNQUFNO0FBQUEsTUFDTixXQUFXO0FBQUEsTUFDWCxpQkFBaUI7QUFBQSxRQUNiLE1BQU07QUFBQSxVQUNGLGdCQUFnQjtBQUFBLFVBQ2hCLFNBQVM7QUFBQSxVQUNULE1BQU07QUFBQSxZQUNGLE1BQU07QUFBQSxVQUNWO0FBQUEsUUFDSjtBQUFBLFFBQ0EsY0FBYztBQUFBLFVBQ1YsZ0JBQWdCO0FBQUEsVUFDaEIsU0FBUztBQUFBLFVBQ1QsTUFBTTtBQUFBLFlBQ0YsTUFBTTtBQUFBLFVBQ1Y7QUFBQSxRQUNKO0FBQUEsUUFDQSxZQUFZO0FBQUEsVUFDUixnQkFBZ0I7QUFBQSxVQUNoQixTQUFTO0FBQUEsVUFDVCxNQUFNO0FBQUEsWUFDRixNQUFNO0FBQUEsVUFDVjtBQUFBLFFBQ0o7QUFBQSxRQUNBLGlCQUFpQjtBQUFBLFVBQ2IsZ0JBQWdCO0FBQUEsVUFDaEIsU0FBUztBQUFBLFVBQ1QsTUFBTTtBQUFBLFlBQ0YsTUFBTTtBQUFBLFVBQ1Y7QUFBQSxRQUNKO0FBQUEsUUFDQSxpQkFBaUI7QUFBQSxVQUNiLGdCQUFnQjtBQUFBLFVBQ2hCLFNBQVM7QUFBQSxVQUNULE1BQU07QUFBQSxZQUNGLE1BQU07QUFBQSxVQUNWO0FBQUEsUUFDSjtBQUFBLFFBQ0EsV0FBVztBQUFBLFVBQ1AsZ0JBQWdCO0FBQUEsVUFDaEIsU0FBUztBQUFBLFVBQ1QsTUFBTTtBQUFBLFlBQ0YsTUFBTTtBQUFBLFVBQ1Y7QUFBQSxRQUNKO0FBQUEsUUFDQSxTQUFTO0FBQUEsVUFDTCxnQkFBZ0I7QUFBQSxVQUNoQixTQUFTO0FBQUEsVUFDVCxNQUFNO0FBQUEsWUFDRixNQUFNO0FBQUEsVUFDVjtBQUFBLFFBQ0o7QUFBQSxRQUNBLFdBQVc7QUFBQSxVQUNQLGdCQUFnQjtBQUFBLFVBQ2hCLFNBQVM7QUFBQSxVQUNULE1BQU07QUFBQSxZQUNGLE1BQU07QUFBQSxVQUNWO0FBQUEsUUFDSjtBQUFBLFFBQ0EsTUFBTTtBQUFBLFVBQ0YsZ0JBQWdCO0FBQUEsVUFDaEIsU0FBUztBQUFBLFVBQ1QsTUFBTTtBQUFBLFlBQ0YsTUFBTTtBQUFBLFVBQ1Y7QUFBQSxRQUNKO0FBQUEsUUFDQSxtQkFBbUI7QUFBQSxVQUNmLGdCQUFnQjtBQUFBLFVBQ2hCLFNBQVM7QUFBQSxVQUNULE1BQU07QUFBQSxZQUNGLE1BQU07QUFBQSxVQUNWO0FBQUEsUUFDSjtBQUFBLFFBQ0EscUJBQXFCO0FBQUEsVUFDakIsZ0JBQWdCO0FBQUEsVUFDaEIsU0FBUztBQUFBLFVBQ1QsTUFBTTtBQUFBLFlBQ0YsTUFBTTtBQUFBLFVBQ1Y7QUFBQSxRQUNKO0FBQUEsUUFDQSxpQkFBaUI7QUFBQSxVQUNiLGdCQUFnQjtBQUFBLFVBQ2hCLFNBQVM7QUFBQSxVQUNULE1BQU07QUFBQSxZQUNGLE1BQU07QUFBQSxVQUNWO0FBQUEsUUFDSjtBQUFBLFFBQ0EsV0FBVztBQUFBLFVBQ1AsZ0JBQWdCO0FBQUEsVUFDaEIsU0FBUztBQUFBLFVBQ1QsTUFBTTtBQUFBLFlBQ0YsTUFBTTtBQUFBLFVBQ1Y7QUFBQSxRQUNKO0FBQUEsTUFDSjtBQUFBLElBQ0o7QUFBQSxFQUNKO0FBQ0EsTUFBTSwyQ0FBMkM7QUFBQSxJQUM3QyxnQkFBZ0I7QUFBQSxJQUNoQixNQUFNO0FBQUEsTUFDRixNQUFNO0FBQUEsTUFDTixXQUFXO0FBQUEsTUFDWCxpQkFBaUI7QUFBQSxRQUNiLFdBQVc7QUFBQSxVQUNQLGdCQUFnQjtBQUFBLFVBQ2hCLFNBQVM7QUFBQSxVQUNULE1BQU07QUFBQSxZQUNGLE1BQU07QUFBQSxVQUNWO0FBQUEsUUFDSjtBQUFBLE1BQ0o7QUFBQSxJQUNKO0FBQUEsRUFDSjtBQUNBLE1BQU0sK0JBQStCO0FBQUEsSUFDakMsZ0JBQWdCO0FBQUEsSUFDaEIsTUFBTTtBQUFBLE1BQ0YsTUFBTTtBQUFBLE1BQ04sV0FBVztBQUFBLE1BQ1gsaUJBQWlCO0FBQUEsUUFDYixjQUFjO0FBQUEsVUFDVixnQkFBZ0I7QUFBQSxVQUNoQixTQUFTO0FBQUEsVUFDVCxNQUFNO0FBQUEsWUFDRixNQUFNO0FBQUEsVUFDVjtBQUFBLFFBQ0o7QUFBQSxRQUNBLE1BQU07QUFBQSxVQUNGLGdCQUFnQjtBQUFBLFVBQ2hCLFNBQVM7QUFBQSxVQUNULE1BQU07QUFBQSxZQUNGLE1BQU07QUFBQSxVQUNWO0FBQUEsUUFDSjtBQUFBLFFBQ0EsYUFBYTtBQUFBLFVBQ1QsZ0JBQWdCO0FBQUEsVUFDaEIsU0FBUztBQUFBLFVBQ1QsTUFBTTtBQUFBLFlBQ0YsTUFBTTtBQUFBLFVBQ1Y7QUFBQSxRQUNKO0FBQUEsUUFDQSxtQkFBbUI7QUFBQSxVQUNmLGdCQUFnQjtBQUFBLFVBQ2hCLFNBQVM7QUFBQSxVQUNULE1BQU07QUFBQSxZQUNGLE1BQU07QUFBQSxVQUNWO0FBQUEsUUFDSjtBQUFBLFFBQ0EsaUJBQWlCO0FBQUEsVUFDYixnQkFBZ0I7QUFBQSxVQUNoQixTQUFTO0FBQUEsVUFDVCxNQUFNO0FBQUEsWUFDRixNQUFNO0FBQUEsVUFDVjtBQUFBLFFBQ0o7QUFBQSxRQUNBLFdBQVc7QUFBQSxVQUNQLGdCQUFnQjtBQUFBLFVBQ2hCLFNBQVM7QUFBQSxVQUNULE1BQU07QUFBQSxZQUNGLE1BQU07QUFBQSxVQUNWO0FBQUEsUUFDSjtBQUFBLFFBQ0EsU0FBUztBQUFBLFVBQ0wsZ0JBQWdCO0FBQUEsVUFDaEIsU0FBUztBQUFBLFVBQ1QsTUFBTTtBQUFBLFlBQ0YsTUFBTTtBQUFBLFVBQ1Y7QUFBQSxRQUNKO0FBQUEsUUFDQSxNQUFNO0FBQUEsVUFDRixnQkFBZ0I7QUFBQSxVQUNoQixTQUFTO0FBQUEsVUFDVCxNQUFNO0FBQUEsWUFDRixNQUFNO0FBQUEsVUFDVjtBQUFBLFFBQ0o7QUFBQSxRQUNBLFdBQVc7QUFBQSxVQUNQLGdCQUFnQjtBQUFBLFVBQ2hCLFNBQVM7QUFBQSxVQUNULE1BQU07QUFBQSxZQUNGLE1BQU07QUFBQSxVQUNWO0FBQUEsUUFDSjtBQUFBLE1BQ0o7QUFBQSxJQUNKO0FBQUEsRUFDSjtBQUNBLE1BQU0sd0NBQXdDO0FBQUEsSUFDMUMsZ0JBQWdCO0FBQUEsSUFDaEIsTUFBTTtBQUFBLE1BQ0YsTUFBTTtBQUFBLE1BQ04sV0FBVztBQUFBLE1BQ1gsaUJBQWlCO0FBQUEsUUFDYixXQUFXO0FBQUEsVUFDUCxnQkFBZ0I7QUFBQSxVQUNoQixTQUFTO0FBQUEsVUFDVCxNQUFNO0FBQUEsWUFDRixNQUFNO0FBQUEsVUFDVjtBQUFBLFFBQ0o7QUFBQSxNQUNKO0FBQUEsSUFDSjtBQUFBLEVBQ0o7QUFFQSxNQUFJLDBCQUF1QixPQUFPLE9BQU87QUFBQSxJQUNyQyxXQUFXO0FBQUEsSUFDWDtBQUFBLElBQ0E7QUFBQSxJQUNBO0FBQUEsSUFDQTtBQUFBLElBQ0E7QUFBQSxJQUNBO0FBQUEsSUFDQTtBQUFBLElBQ0E7QUFBQSxJQUNBO0FBQUEsSUFDQTtBQUFBLElBQ0E7QUFBQSxJQUNBO0FBQUEsSUFDQTtBQUFBLElBQ0E7QUFBQSxJQUNBO0FBQUEsSUFDQTtBQUFBLElBQ0E7QUFBQSxJQUNBO0FBQUEsSUFDQTtBQUFBLElBQ0E7QUFBQSxJQUNBO0FBQUEsSUFDQTtBQUFBLElBQ0E7QUFBQSxJQUNBO0FBQUEsSUFDQTtBQUFBLElBQ0E7QUFBQSxJQUNBO0FBQUEsSUFDQTtBQUFBLElBQ0E7QUFBQSxJQUNBO0FBQUEsSUFDQTtBQUFBLElBQ0E7QUFBQSxJQUNBO0FBQUEsSUFDQTtBQUFBLElBQ0E7QUFBQSxJQUNBO0FBQUEsSUFDQTtBQUFBLElBQ0E7QUFBQSxJQUNBO0FBQUEsSUFDQTtBQUFBLElBQ0E7QUFBQSxJQUNBO0FBQUEsSUFDQTtBQUFBLElBQ0E7QUFBQSxJQUNBO0FBQUEsSUFDQTtBQUFBLElBQ0E7QUFBQSxJQUNBO0FBQUEsSUFDQTtBQUFBLElBQ0E7QUFBQSxJQUNBO0FBQUEsSUFDQTtBQUFBLElBQ0E7QUFBQSxJQUNBO0FBQUEsSUFDQTtBQUFBLElBQ0E7QUFBQSxJQUNBO0FBQUEsSUFDQTtBQUFBLElBQ0E7QUFBQSxJQUNBO0FBQUEsSUFDQTtBQUFBLElBQ0E7QUFBQSxJQUNBO0FBQUEsSUFDQTtBQUFBLElBQ0E7QUFBQSxJQUNBO0FBQUEsSUFDQTtBQUFBLElBQ0E7QUFBQSxJQUNBO0FBQUEsSUFDQTtBQUFBLElBQ0E7QUFBQSxJQUNBO0FBQUEsSUFDQTtBQUFBLElBQ0E7QUFBQSxJQUNBO0FBQUEsSUFDQTtBQUFBLElBQ0E7QUFBQSxJQUNBO0FBQUEsSUFDQTtBQUFBLElBQ0E7QUFBQSxJQUNBO0FBQUEsSUFDQTtBQUFBLElBQ0E7QUFBQSxJQUNBO0FBQUEsSUFDQTtBQUFBLElBQ0E7QUFBQSxJQUNBO0FBQUEsSUFDQTtBQUFBLElBQ0E7QUFBQSxJQUNBO0FBQUEsSUFDQTtBQUFBLElBQ0E7QUFBQSxJQUNBO0FBQUEsSUFDQTtBQUFBLElBQ0E7QUFBQSxJQUNBO0FBQUEsSUFDQTtBQUFBLElBQ0E7QUFBQSxJQUNBO0FBQUEsSUFDQTtBQUFBLElBQ0E7QUFBQSxJQUNBO0FBQUEsSUFDQTtBQUFBLElBQ0E7QUFBQSxJQUNBO0FBQUEsSUFDQTtBQUFBLElBQ0E7QUFBQSxJQUNBO0FBQUEsSUFDQTtBQUFBLElBQ0E7QUFBQSxJQUNBO0FBQUEsSUFDQTtBQUFBLElBQ0E7QUFBQSxJQUNBO0FBQUEsSUFDQTtBQUFBLElBQ0E7QUFBQSxJQUNBO0FBQUEsSUFDQTtBQUFBLElBQ0E7QUFBQSxJQUNBO0FBQUEsSUFDQTtBQUFBLElBQ0E7QUFBQSxJQUNBO0FBQUEsSUFDQTtBQUFBLElBQ0E7QUFBQSxJQUNBO0FBQUEsSUFDQTtBQUFBLElBQ0E7QUFBQSxJQUNBO0FBQUEsSUFDQTtBQUFBLElBQ0E7QUFBQSxJQUNBO0FBQUEsSUFD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QUEsUUFDSSxJQUFJLEdBQUc7QUFDUCxhQUFPLEtBQUs7QUFBQTtBQUFBLElBRWhCO0FBQUEsUUFDSSxLQUFLLEdBQUc7QUFDUixhQUFPLEtBQUs7QUFBQTtBQUFBLElBRWhCO0FBQUEsUUFDSSxHQUFHLEdBQUc7QUFDTixhQUFPLEtBQUs7QUFBQTtBQUFBLElBRWhCO0FBQUEsUUFDSSxHQUFHLEdBQUc7QUFDTixhQUFPLEtBQUs7QUFBQTtBQUFBLElBRWhCO0FBQUEsUUFDSSxJQUFJLEdBQUc7QUFDUCxhQUFPLEtBQUs7QUFBQTtBQUFBLElBRWhCO0FBQUEsUUFDSSxPQUFPLEdBQUc7QUFDVixhQUFPLEtBQUs7QUFBQTtBQUFBLElBRWhCO0FBQUEsUUFDSSxHQUFHLEdBQUc7QUFDTixhQUFPLEtBQUs7QUFBQTtBQUFBLElBRWhCO0FBQUEsUUFDSSxJQUFJLEdBQUc7QUFDUCxhQUFPLEtBQUs7QUFBQTtBQUFBLElBRWhCO0FBQUEsUUFDSSxNQUFNLEdBQUc7QUFDVCxhQUFPLEtBQUs7QUFBQTtBQUFBLElBRWhCO0FBQUEsUUFDSSxPQUFPLEdBQUc7QUFDVixhQUFPLEtBQUs7QUFBQTtBQUFBLElBRWhCO0FBQUEsUUFDSSxPQUFPLEdBQUc7QUFDVixhQUFPLEtBQUs7QUFBQTtBQUFBLElBRWhCO0FBQUEsUUFDSSxPQUFPLEdBQUc7QUFDVixhQUFPLEtBQUs7QUFBQTtBQUFBLElBRWhCO0FBQUEsUUFDSSxXQUFXLEdBQUc7QUFDZCxhQUFPLEtBQUs7QUFBQTtBQUFBLElBRWhCO0FBQUEsUUFDSSxLQUFLLEdBQUc7QUFDUixhQUFPLEtBQUs7QUFBQTtBQUFBLElBRWhCO0FBQUEsUUFDSSxLQUFLLEdBQUc7QUFDUixhQUFPLEtBQUs7QUFBQTtBQUFBLElBRWhCO0FBQUEsUUFDSSxLQUFLLEdBQUc7QUFDUixhQUFPLEtBQUs7QUFBQTtBQUFBLElBRWhCO0FBQUEsUUFDSSxTQUFTLEdBQUc7QUFDWixhQUFPLEtBQUs7QUFBQTtBQUFBLElBRWhCO0FBQUEsSUFDQTtBQUFBLElBQ0E7QUFBQSxJQUNBO0FBQUEs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SUFDQTtBQUFBLElBQ0E7QUFBQSxJQUNBO0FBQUEsSUFDQTtBQUFBLElBQ0E7QUFBQSxJQUNBO0FBQUEsSUFDQTtBQUFBLElBQ0E7QUFBQSxJQUNBO0FBQUEsSUFDQTtBQUFBLElBQ0E7QUFBQSxJQUNBO0FBQUEsSUFDQTtBQUFBLElBQ0E7QUFBQSxJQUNBO0FBQUEsSUFDQTtBQUFBLElBQ0E7QUFBQSxJQUNBO0FBQUEsSUFDQTtBQUFBLElBQ0E7QUFBQSxJQUNBO0FBQUEsSUFDQTtBQUFBLElBQ0E7QUFBQSxJQUNBO0FBQUEsSUFDQTtBQUFBLElBQ0E7QUFBQSxJQUNBO0FBQUEsSUFDQTtBQUFBLElBQ0E7QUFBQSxJQUNBO0FBQUEsSUFDQTtBQUFBLElBQ0E7QUFBQSxJQUNBO0FBQUEsSUFDQTtBQUFBLElBQ0E7QUFBQSxJQUNBO0FBQUEsSUFDQTtBQUFBLElBQ0E7QUFBQSxJQUNBO0FBQUEsSUFDQTtBQUFBLElBQ0E7QUFBQSxJQUNBO0FBQUEsSUFDQTtBQUFBLElBQ0E7QUFBQSxJQUNBO0FBQUEsSUFDQTtBQUFBLElBQ0E7QUFBQSxJQUNBO0FBQUEsSUFDQTtBQUFBLElBQ0E7QUFBQSxJQUNBO0FBQUEsSUFDQTtBQUFBLElBQ0E7QUFBQSxJQUNBO0FBQUEsSUFDQTtBQUFBLElBQ0E7QUFBQSxJQUNBO0FBQUEsSUFDQTtBQUFBLElBQ0E7QUFBQSxJQUNBO0FBQUEsSUFDQTtBQUFBLElBQ0E7QUFBQSxJQUNBO0FBQUEsSUFDQTtBQUFBLElBQ0E7QUFBQSxJQUNBO0FBQUEsSUFDQTtBQUFBLElBQ0E7QUFBQSxJQUNBO0FBQUEsSUFDQTtBQUFBLElBQ0E7QUFBQSxJQUNBO0FBQUEsSUFDQTtBQUFBLElBQ0E7QUFBQSxJQUNBO0FBQUEsSUFDQTtBQUFBLElBQ0E7QUFBQSxJQUNBO0FBQUEsSUFDQTtBQUFBLElBQ0E7QUFBQSxJQUNBO0FBQUEsSUFDQTtBQUFBLElBQ0E7QUFBQSxJQUNBO0FBQUEsSUFDQTtBQUFBLElBQ0E7QUFBQSxJQUNBO0FBQUEsSUFDQTtBQUFBLElBQ0E7QUFBQSxJQUNBO0FBQUEsSUFDQTtBQUFBLElBQ0E7QUFBQSxJQUNBO0FBQUEsSUFDQTtBQUFBLElBQ0E7QUFBQSxJQUNBO0FBQUEsSUFDQTtBQUFBLElBQ0E7QUFBQSxJQUNBO0FBQUEsSUFDQTtBQUFBLElBQ0E7QUFBQSxJQUNBO0FBQUEsSUFDQTtBQUFBLElBQ0E7QUFBQSxJQUNBO0FBQUEsSUFDQTtBQUFBLElBQ0E7QUFBQSxJQUNBO0FBQUEsSUFDQTtBQUFBLElBQ0E7QUFBQSxJQUNBO0FBQUEsSUFDQTtBQUFBLElBQ0E7QUFBQSxJQUNBO0FBQUEsSUFDQTtBQUFBLElBQ0E7QUFBQSxJQUNBO0FBQUEsSUFDQTtBQUFBLElBQ0E7QUFBQSxJQUNBO0FBQUEsSUFDQTtBQUFBLElBQ0E7QUFBQSxJQUNBO0FBQUEsSUFDQTtBQUFBLElBQ0E7QUFBQSxJQUNBO0FBQUEsSUFDQTtBQUFBLElBQ0E7QUFBQSxJQUNBO0FBQUEsSUFDQTtBQUFBLElBQ0E7QUFBQSxJQUNBO0FBQUEsSUFDQTtBQUFBLElBQ0E7QUFBQSxJQUNBO0FBQUEsSUFDQTtBQUFBLElBQ0E7QUFBQSxJQUNBO0FBQUEsSUFDQTtBQUFBLElBQ0E7QUFBQSxJQUNBO0FBQUEsSUFDQTtBQUFBLElBQ0E7QUFBQSxJQUNBO0FBQUEsSUFDQTtBQUFBLElBQ0E7QUFBQSxJQUNBO0FBQUEsSUFDQTtBQUFBLElBQ0E7QUFBQSxJQUNBO0FBQUEsSUFDQTtBQUFBLElBQ0E7QUFBQSxJQUNBO0FBQUEsSUFDQTtBQUFBLElBQ0E7QUFBQSxJQUNBO0FBQUEsSUFDQTtBQUFBLElBQ0E7QUFBQSxJQUNBO0FBQUEsSUFDQTtBQUFBLElBQ0E7QUFBQSxJQUNBO0FBQUEsSUFDQTtBQUFBLElBQ0E7QUFBQSxJQUNBO0FBQUEsSUFDQTtBQUFBLElBQ0E7QUFBQSxJQUNBO0FBQUEsSUFDQTtBQUFBLElBQ0E7QUFBQSxJQUNBO0FBQUEsSUFDQTtBQUFBLElBQ0E7QUFBQSxJQUNBO0FBQUEsSUFDQTtBQUFBLElBQ0E7QUFBQSxJQUNBO0FBQUEsSUFDQTtBQUFBLElBQ0E7QUFBQSxJQUNBO0FBQUEs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 diff --git a/jest.config.js b/jest.config.js deleted file mode 100644 index 5a822283..00000000 --- a/jest.config.js +++ /dev/null @@ -1,9 +0,0 @@ -module.exports = { - clearMocks: true, - moduleFileExtensions: ['js', 'ts'], - testMatch: ['**/*.test.ts'], - transform: { - '^.+\\.ts$': 'ts-jest' - }, - verbose: true -} \ No newline at end of file diff --git a/k8s/.gitignore b/k8s/.gitignore deleted file mode 100644 index dd338222..00000000 --- a/k8s/.gitignore +++ /dev/null @@ -1,2 +0,0 @@ -ca.pem -ci-config.kubeconfig \ No newline at end of file diff --git a/k8s/README.md b/k8s/README.md deleted file mode 100644 index e07caf52..00000000 --- a/k8s/README.md +++ /dev/null @@ -1,175 +0,0 @@ -# How to setup cluster: - -1. [Setup k8s cluster to use in actions](#setup-k8s) - 1. [Create Service Account](#create-sa) - 2. [Create kube config](#create-k8s-conf) - 3. [(Optionally) Test if k8s config is working](#test-k8s-conf) -2. [Setup prometheus and grafana](#prom-grafana) -3. [Setup ingress controller](#setup-ingress) -4. [Additional commands in case of manual work](#manual) - 1. [YDB cluster startup](#manual-startup) - 2. [YDB cluster shutdown](#manual-shutdown) - - - -## Setup k8s cluster to use in actions - - - -### Create Service Account - -`kubectl create -f k8s/create-sa.yaml` - -Get service account token and save it to `$SA_TOKEN` - -``` -SA_TOKEN=$(kubectl -n kube-system get secret $(kubectl -n kube-system get secret | \ - grep ci-user | \ - awk '{print $1}') -o json | \ - jq -r .data.token | \ - base64 --d) -``` - - - -### Create kube config - -Get ca.pem from your cluster (depends on your setup) and save it to `ca.pem` - -Get master **external** endpoint of your cluster and save it to `$MASTER_ENDPOINT` - -``` -kubectl config set-cluster ci-cluster-config \ - --certificate-authority=ca.pem \ - --server=$MASTER_ENDPOINT \ - --embed-certs \ - --kubeconfig=ci-config.kubeconfig - -kubectl config set-credentials ci-user \ - --token=$SA_TOKEN \ - --kubeconfig=ci-config.kubeconfig - -kubectl config set-context default \ - --cluster=ci-cluster-config \ - --user=ci-user \ - --kubeconfig=ci-config.kubeconfig - -kubectl config use-context default \ - --kubeconfig=ci-config.kubeconfig -``` - - - -### (Optionally) Test if k8s config is working - -**this command must show your cluster's namespaces** - -``` -kubectl get namespace --kubeconfig=ci-config.kubeconfig -``` - -Run base64 through config to get secret string (`pbcopy` is OSX util) - -``` -cat ci-config.kubeconfig | base64 | pbcopy -``` - - - -## Setup prometheus and grafana - -``` -helm repo add prometheus-community https://prometheus-community.github.io/helm-charts -helm repo add grafana https://grafana.github.io/helm-charts -helm repo add ingress-nginx https://kubernetes.github.io/ingress-nginx -helm repo update - -kubectl create -f https://raw.githubusercontent.com/prometheus-operator/prometheus-operator/v0.64.0/bundle.yaml -kubectl apply -f k8s/prometheus.yaml -helm upgrade --install prometheus-pushgateway prometheus-community/prometheus-pushgateway --values k8s/helms/prometheus-pushgateway.yaml -helm upgrade --install grafana grafana/grafana --values k8s/helms/grafana.yaml -kubectl apply -f k8s/grafana-renderer.yaml -``` - - - -### Setup ingress controller - -Create htpasswd file - -``` -htpasswd -c auth ACC_NAME -``` - -Create secret from this file inside of k8s - -``` -kubectl create secret generic ingress-basic-auth --from-file=auth -``` - -Set up node with external IP in your cloud provider and run command below to disable sheduling pods on it: - -``` -kubectl taint nodes type=DMZ:NoSchedule -``` - -Install nginx-ingress helm chart and ingress kube config: - -``` -helm upgrade --install ingress-nginx ingress-nginx/ingress-nginx --values k8s/helms/ingress.yaml --namespace dmz-ns --create-namespace - -kubectl apply -f k8s/ingress.yaml -``` - -
- - - -## Additional commands in case of manual work - - - -### Whole process of cluster startup - it is automated - -``` -# install ydb-operator -helm upgrade --install ydb-operator ydb/ydb-operator --values k8s/helms/ydb-operator.yaml - -# check if ydb-operator is up -kubectl get pods -l 'app.kubernetes.io/instance=ydb-operator' -o=jsonpath="{.items[0].status.phase}" - -# create storage -kubectl apply -f k8s/ci/storage.yaml - -# check if storage created -kubectl get storages.ydb.tech -o=jsonpath="{.items[0].status.state}" - -# create DBs -kubectl apply -f k8s/ci/database.yaml - -# check if database created -kubectl get database.ydb.tech -o=jsonpath="{.items[0].status.state}" -``` - -To port-forward database admin panel run this command: - -``` -kubectl port-forward database-sample-0 8765 -``` - - - -### Whole process of cluster shutdown - it is automated (but not turned on) - -``` -# delete DBs -kubectl delete -f k8s/database.yaml - -# delete storage -kubectl delete -f k8s/storage.yaml - -# remove PVCs -kubectl delete pvc `kubectl get pvc -o=jsonpath="{.items[*].metadata.name}"` -l ydb-cluster=slo-storage - -helm uninstall ydb-operator -``` diff --git a/k8s/ci/database.yaml b/k8s/ci/database.yaml deleted file mode 100644 index 75f986e9..00000000 --- a/k8s/ci/database.yaml +++ /dev/null @@ -1,34 +0,0 @@ -apiVersion: ydb.tech/v1alpha1 -kind: Database -metadata: - name: database-sample -spec: - monitoring: - enabled: true - interval: 3s - additionalLabels: - ydb-cluster: slo-storage - ydb-cluster-monitor: slo-storage - affinity: - podAntiAffinity: - requiredDuringSchedulingIgnoredDuringExecution: - - labelSelector: - matchExpressions: - - key: ydb-cluster - operator: In - values: - - slo-storage - topologyKey: 'kubernetes.io/hostname' - image: - name: cr.yandex/crptqonuodf51kdj7a7d/ydb:${{VERSION}} - domain: root - nodes: 6 - resources: - containerResources: - limits: - cpu: 1 - storageUnits: - - count: 1 - unitKind: ssd - storageClusterRef: - name: storage-sample diff --git a/k8s/ci/storage.yaml b/k8s/ci/storage.yaml deleted file mode 100644 index 5a2c2130..00000000 --- a/k8s/ci/storage.yaml +++ /dev/null @@ -1,153 +0,0 @@ -apiVersion: ydb.tech/v1alpha1 -kind: Storage -metadata: - name: storage-sample -spec: - monitoring: - enabled: true - interval: 3s - additionalLabels: - ydb-cluster: slo-storage - ydb-cluster-monitor: slo-storage - affinity: - podAntiAffinity: - requiredDuringSchedulingIgnoredDuringExecution: - - labelSelector: - matchExpressions: - - key: ydb-cluster - operator: In - values: - - slo-storage - topologyKey: 'kubernetes.io/hostname' - dataStore: - - volumeMode: Block - storageClassName: yc-network-ssd-nonreplicated - accessModes: - - ReadWriteOnce - resources: - requests: - storage: 93Gi - image: - name: cr.yandex/crptqonuodf51kdj7a7d/ydb:${{VERSION}} - domain: root - nodes: 9 - erasure: mirror-3-dc - configuration: |- - static_erasure: mirror-3-dc - host_configs: - - drive: - - path: /dev/kikimr_ssd_00 - type: SSD - host_config_id: 1 - grpc_config: - port: 2135 - domains_config: - domain: - - name: root - storage_pool_types: - - kind: ssd - pool_config: - box_id: 1 - erasure_species: mirror-3-dc - kind: ssd - pdisk_filter: - - property: - - type: SSD - vdisk_kind: Default - state_storage: - - ring: - node: [ 1, 2, 3, 4, 5, 6, 7, 8, 9 ] - nto_select: 5 - ssid: 1 - actor_system_config: - batch_executor: 2 - io_executor: 3 - executor: - - name: System - spin_threshold: 0 - threads: 2 - type: BASIC - - name: User - spin_threshold: 0 - threads: 3 - type: BASIC - - name: Batch - spin_threshold: 0 - threads: 2 - type: BASIC - - name: IO - threads: 1 - time_per_mailbox_micro_secs: 100 - type: IO - - name: IC - spin_threshold: 10 - threads: 1 - time_per_mailbox_micro_secs: 100 - type: BASIC - scheduler: - progress_threshold: 10000 - resolution: 256 - spin_threshold: 0 - service_executor: - - executor_id: 4 - service_name: Interconnect - blob_storage_config: - service_set: - availability_domains: 1 - groups: - - erasure_species: mirror-3-dc - group_id: 0 - group_generation: 1 - rings: - - fail_domains: - - vdisk_locations: - - node_id: 1 - pdisk_category: SSD - path: /dev/kikimr_ssd_00 - - vdisk_locations: - - node_id: 2 - pdisk_category: SSD - path: /dev/kikimr_ssd_00 - - vdisk_locations: - - node_id: 3 - pdisk_category: SSD - path: /dev/kikimr_ssd_00 - - fail_domains: - - vdisk_locations: - - node_id: 4 - pdisk_category: SSD - path: /dev/kikimr_ssd_00 - - vdisk_locations: - - node_id: 5 - pdisk_category: SSD - path: /dev/kikimr_ssd_00 - - vdisk_locations: - - node_id: 6 - pdisk_category: SSD - path: /dev/kikimr_ssd_00 - - fail_domains: - - vdisk_locations: - - node_id: 7 - pdisk_category: SSD - path: /dev/kikimr_ssd_00 - - vdisk_locations: - - node_id: 8 - pdisk_category: SSD - path: /dev/kikimr_ssd_00 - - vdisk_locations: - - node_id: 9 - pdisk_category: SSD - path: /dev/kikimr_ssd_00 - channel_profile_config: - profile: - - channel: - - erasure_species: mirror-3-dc - pdisk_category: 1 - storage_pool_kind: ssd - - erasure_species: mirror-3-dc - pdisk_category: 1 - storage_pool_kind: ssd - - erasure_species: mirror-3-dc - pdisk_category: 1 - storage_pool_kind: ssd - profile_id: 0 diff --git a/k8s/ci/workload.yaml b/k8s/ci/workload.yaml deleted file mode 100644 index 3993513c..00000000 --- a/k8s/ci/workload.yaml +++ /dev/null @@ -1,18 +0,0 @@ -apiVersion: batch/v1 -kind: Job -metadata: - name: ${{LANGUAGE_ID}}-wl-${{COMMAND}} -spec: - ttlSecondsAfterFinished: 120 - backoffLimit: 0 - template: - metadata: - name: ${{LANGUAGE_ID}}-wl-${{COMMAND}} - spec: - containers: - - name: ${{LANGUAGE_ID}}-wl-${{COMMAND}} - image: ${{DOCKER_IMAGE}}:latest - args: - - '${{COMMAND}}' - - ${{ARGS}} - restartPolicy: Never diff --git a/k8s/create-sa.yaml b/k8s/create-sa.yaml deleted file mode 100644 index bfb9b13b..00000000 --- a/k8s/create-sa.yaml +++ /dev/null @@ -1,18 +0,0 @@ -apiVersion: v1 -kind: ServiceAccount -metadata: - name: ci-user - namespace: kube-system ---- -apiVersion: rbac.authorization.k8s.io/v1 -kind: ClusterRoleBinding -metadata: - name: ci-user -roleRef: - apiGroup: rbac.authorization.k8s.io - kind: ClusterRole - name: cluster-admin -subjects: -- kind: ServiceAccount - name: ci-user - namespace: kube-system \ No newline at end of file diff --git a/k8s/grafana-renderer.yaml b/k8s/grafana-renderer.yaml deleted file mode 100644 index babff83f..00000000 --- a/k8s/grafana-renderer.yaml +++ /dev/null @@ -1,33 +0,0 @@ -kind: Service -apiVersion: v1 -metadata: - name: grafana-renderer -spec: - selector: - app: grafana-renderer - ports: - - port: 80 - targetPort: 8081 ---- -apiVersion: apps/v1 -kind: Deployment -metadata: - name: grafana-renderer - labels: - app: grafana-renderer -spec: - replicas: 1 - selector: - matchLabels: - app: grafana-renderer - template: - metadata: - labels: - app: grafana-renderer - app.kubernetes.io/name: grafana-renderer - spec: - containers: - - name: grafana-renderer - image: grafana/grafana-image-renderer:latest - ports: - - containerPort: 8081 diff --git a/k8s/helms/grafana.yaml b/k8s/helms/grafana.yaml deleted file mode 100644 index 139edd96..00000000 --- a/k8s/helms/grafana.yaml +++ /dev/null @@ -1,728 +0,0 @@ -# https://github.com/grafana/helm-charts/blob/main/charts/grafana/values.yaml -datasources: - datasources.yaml: - apiVersion: 1 - datasources: - - name: Prometheus - type: prometheus - url: http://prometheus-operated:9090 - access: proxy - isDefault: true - uid: prometheus - jsonData: - timeInterval: 5s - -adminUser: admin -adminPassword: passw0rD - -# Use an existing secret for the admin user. -admin: {} - -# need this to take screenshots -env: - GF_RENDERING_SERVER_URL: http://grafana-renderer/render - GF_RENDERING_CALLBACK_URL: http://grafana:80/ - GF_LOG_FILTERS: rendering:debug - -# need to downgrade to take screenshots of dashboard, not only of panel -# image: -# tag: 7.5.15 - -persistence: - enabled: true - storageClassName: yc-network-hdd - -grafana.ini: - auth.anonymous: - enabled: true - org_name: Main Org. - # Can't set custom org name due to grafana default config - org_role: Admin - -## Configure grafana dashboard providers -## ref: http://docs.grafana.org/administration/provisioning/#dashboards -## -## `path` must be /var/lib/grafana/dashboards/ -## -dashboardProviders: - dashboardproviders.yaml: - apiVersion: 1 - providers: - - name: "default" - orgId: 1 - folder: "" - type: file - disableDeletion: false - editable: true - options: - path: /var/lib/grafana/dashboards/default - -## Configure grafana dashboard to import -## NOTE: To use dashboards you must also enable/configure dashboardProviders -## ref: https://grafana.com/dashboards -## -## dashboards per provider, use provider name as key. -## -dashboards: - default: - slo: - json: |- - { - "annotations": { - "list": [ - { - "builtIn": 1, - "datasource": { - "type": "grafana", - "uid": "-- Grafana --" - }, - "enable": true, - "hide": true, - "iconColor": "rgba(0, 211, 255, 1)", - "name": "Annotations & Alerts", - "target": { - "limit": 100, - "matchAny": false, - "tags": [], - "type": "dashboard" - }, - "type": "dashboard" - } - ] - }, - "editable": true, - "fiscalYearStartMonth": 0, - "graphTooltip": 0, - "links": [], - "liveNow": false, - "panels": [ - { - "datasource": { - "type": "prometheus", - "uid": "prometheus" - }, - "fieldConfig": { - "defaults": { - "color": { - "mode": "palette-classic" - }, - "custom": { - "axisCenteredZero": false, - "axisColorMode": "text", - "axisLabel": "", - "axisPlacement": "auto", - "barAlignment": 0, - "drawStyle": "line", - "fillOpacity": 0, - "gradientMode": "none", - "hideFrom": { - "legend": false, - "tooltip": false, - "viz": false - }, - "lineInterpolation": "linear", - "lineWidth": 1, - "pointSize": 5, - "scaleDistribution": { - "type": "linear" - }, - "showPoints": "auto", - "spanNulls": false, - "stacking": { - "group": "A", - "mode": "none" - }, - "thresholdsStyle": { - "mode": "off" - } - }, - "mappings": [], - "thresholds": { - "mode": "absolute", - "steps": [ - { - "color": "green", - "value": null - }, - { - "color": "red", - "value": 80 - } - ] - } - }, - "overrides": [] - }, - "gridPos": { - "h": 9, - "w": 12, - "x": 0, - "y": 0 - }, - "id": 12, - "options": { - "legend": { - "calcs": [], - "displayMode": "list", - "placement": "bottom", - "showLegend": true - }, - "tooltip": { - "mode": "single", - "sort": "none" - } - }, - "targets": [ - { - "datasource": { - "type": "prometheus", - "uid": "prometheus" - }, - "editorMode": "builder", - "expr": "rate(oks[$__rate_interval]) > 0", - "hide": false, - "legendFormat": "({{sdk}}-{{sdkVersion}}) {{jobName}} OK", - "range": true, - "refId": "B" - }, - { - "datasource": { - "type": "prometheus", - "uid": "prometheus" - }, - "editorMode": "builder", - "expr": "rate(not_oks[$__rate_interval]) > 0", - "hide": false, - "legendFormat": "({{sdk}}-{{sdkVersion}}) {{jobName}} not OK", - "range": true, - "refId": "C" - } - ], - "title": "SLO Requests RPS", - "transformations": [], - "type": "timeseries" - }, - { - "datasource": { - "type": "prometheus", - "uid": "prometheus" - }, - "fieldConfig": { - "defaults": { - "color": { - "mode": "palette-classic" - }, - "custom": { - "axisCenteredZero": false, - "axisColorMode": "text", - "axisLabel": "", - "axisPlacement": "auto", - "axisSoftMin": 0, - "barAlignment": 0, - "drawStyle": "line", - "fillOpacity": 0, - "gradientMode": "none", - "hideFrom": { - "legend": false, - "tooltip": false, - "viz": false - }, - "lineInterpolation": "linear", - "lineWidth": 1, - "pointSize": 5, - "scaleDistribution": { - "type": "linear" - }, - "showPoints": "auto", - "spanNulls": false, - "stacking": { - "group": "A", - "mode": "none" - }, - "thresholdsStyle": { - "mode": "off" - } - }, - "decimals": 0, - "mappings": [], - "thresholds": { - "mode": "absolute", - "steps": [ - { - "color": "green", - "value": null - }, - { - "color": "red", - "value": 80 - } - ] - } - }, - "overrides": [] - }, - "gridPos": { - "h": 9, - "w": 12, - "x": 12, - "y": 0 - }, - "id": 14, - "options": { - "legend": { - "calcs": [], - "displayMode": "list", - "placement": "bottom", - "showLegend": true - }, - "tooltip": { - "mode": "single", - "sort": "none" - } - }, - "targets": [ - { - "datasource": { - "type": "prometheus", - "uid": "prometheus" - }, - "editorMode": "builder", - "expr": "histogram_quantile(1, rate(attempts_bucket[$__rate_interval]))", - "hide": false, - "legendFormat": "{{sdk}}-{{sdkVersion}} {{jobName}}-{{status}}", - "range": true, - "refId": "A" - } - ], - "title": "Attempts", - "transformations": [], - "type": "timeseries" - }, - { - "collapsed": false, - "gridPos": { - "h": 1, - "w": 24, - "x": 0, - "y": 9 - }, - "id": 7, - "panels": [], - "title": "Latencies", - "type": "row" - }, - { - "datasource": { - "type": "prometheus", - "uid": "prometheus" - }, - "fieldConfig": { - "defaults": { - "color": { - "mode": "palette-classic" - }, - "custom": { - "axisCenteredZero": false, - "axisColorMode": "text", - "axisLabel": "", - "axisPlacement": "auto", - "barAlignment": 0, - "drawStyle": "line", - "fillOpacity": 0, - "gradientMode": "none", - "hideFrom": { - "legend": false, - "tooltip": false, - "viz": false - }, - "lineInterpolation": "linear", - "lineWidth": 1, - "pointSize": 5, - "scaleDistribution": { - "type": "linear" - }, - "showPoints": "auto", - "spanNulls": false, - "stacking": { - "group": "A", - "mode": "none" - }, - "thresholdsStyle": { - "mode": "off" - } - }, - "mappings": [], - "thresholds": { - "mode": "absolute", - "steps": [ - { - "color": "green", - "value": null - }, - { - "color": "red", - "value": 80 - } - ] - } - }, - "overrides": [] - }, - "gridPos": { - "h": 8, - "w": 12, - "x": 0, - "y": 10 - }, - "id": 4, - "options": { - "legend": { - "calcs": [], - "displayMode": "list", - "placement": "bottom", - "showLegend": true - }, - "tooltip": { - "mode": "single", - "sort": "none" - } - }, - "pluginVersion": "9.3.1", - "targets": [ - { - "datasource": { - "type": "prometheus", - "uid": "prometheus" - }, - "editorMode": "builder", - "expr": "latency{jobName=\"read\", status=\"ok\"} > 0", - "legendFormat": "{{sdk}}-{{sdkVersion}}-p{{quantile}}", - "range": true, - "refId": "A" - } - ], - "title": "Read Latencies (OK)", - "type": "timeseries" - }, - { - "datasource": { - "type": "prometheus", - "uid": "prometheus" - }, - "fieldConfig": { - "defaults": { - "color": { - "mode": "palette-classic" - }, - "custom": { - "axisCenteredZero": false, - "axisColorMode": "text", - "axisLabel": "", - "axisPlacement": "auto", - "barAlignment": 0, - "drawStyle": "line", - "fillOpacity": 0, - "gradientMode": "none", - "hideFrom": { - "legend": false, - "tooltip": false, - "viz": false - }, - "lineInterpolation": "linear", - "lineWidth": 1, - "pointSize": 5, - "scaleDistribution": { - "type": "linear" - }, - "showPoints": "auto", - "spanNulls": false, - "stacking": { - "group": "A", - "mode": "none" - }, - "thresholdsStyle": { - "mode": "off" - } - }, - "mappings": [], - "thresholds": { - "mode": "absolute", - "steps": [ - { - "color": "green", - "value": null - }, - { - "color": "red", - "value": 80 - } - ] - } - }, - "overrides": [] - }, - "gridPos": { - "h": 8, - "w": 12, - "x": 12, - "y": 10 - }, - "id": 5, - "options": { - "legend": { - "calcs": [], - "displayMode": "list", - "placement": "bottom", - "showLegend": true - }, - "tooltip": { - "mode": "single", - "sort": "none" - } - }, - "targets": [ - { - "datasource": { - "type": "prometheus", - "uid": "prometheus" - }, - "editorMode": "builder", - "expr": "latency{jobName=\"write\", status=\"ok\"} > 0", - "legendFormat": "{{sdk}}-{{sdkVersion}}-p{{quantile}}", - "range": true, - "refId": "A" - } - ], - "title": "Write Latencies (OK)", - "type": "timeseries" - }, - { - "datasource": { - "type": "prometheus", - "uid": "prometheus" - }, - "fieldConfig": { - "defaults": { - "color": { - "mode": "palette-classic" - }, - "custom": { - "axisCenteredZero": false, - "axisColorMode": "text", - "axisLabel": "", - "axisPlacement": "auto", - "barAlignment": 0, - "drawStyle": "line", - "fillOpacity": 0, - "gradientMode": "none", - "hideFrom": { - "legend": false, - "tooltip": false, - "viz": false - }, - "lineInterpolation": "linear", - "lineWidth": 1, - "pointSize": 5, - "scaleDistribution": { - "type": "linear" - }, - "showPoints": "auto", - "spanNulls": false, - "stacking": { - "group": "A", - "mode": "none" - }, - "thresholdsStyle": { - "mode": "off" - } - }, - "mappings": [], - "thresholds": { - "mode": "absolute", - "steps": [ - { - "color": "green", - "value": null - }, - { - "color": "red", - "value": 80 - } - ] - } - }, - "overrides": [] - }, - "gridPos": { - "h": 8, - "w": 12, - "x": 0, - "y": 18 - }, - "id": 10, - "options": { - "legend": { - "calcs": [], - "displayMode": "list", - "placement": "bottom", - "showLegend": true - }, - "tooltip": { - "mode": "single", - "sort": "none" - } - }, - "targets": [ - { - "datasource": { - "type": "prometheus", - "uid": "prometheus" - }, - "editorMode": "builder", - "expr": "latency{jobName=\"read\", status=\"err\"} > 0", - "legendFormat": "{{sdk}}-{{sdkVersion}}-p{{quantile}}", - "range": true, - "refId": "A" - } - ], - "title": "Read Latencies (NOT OK)", - "type": "timeseries" - }, - { - "datasource": { - "type": "prometheus", - "uid": "prometheus" - }, - "fieldConfig": { - "defaults": { - "color": { - "mode": "palette-classic" - }, - "custom": { - "axisCenteredZero": false, - "axisColorMode": "text", - "axisLabel": "", - "axisPlacement": "auto", - "barAlignment": 0, - "drawStyle": "line", - "fillOpacity": 0, - "gradientMode": "none", - "hideFrom": { - "legend": false, - "tooltip": false, - "viz": false - }, - "lineInterpolation": "linear", - "lineWidth": 1, - "pointSize": 5, - "scaleDistribution": { - "type": "linear" - }, - "showPoints": "auto", - "spanNulls": false, - "stacking": { - "group": "A", - "mode": "none" - }, - "thresholdsStyle": { - "mode": "off" - } - }, - "mappings": [], - "thresholds": { - "mode": "absolute", - "steps": [ - { - "color": "green", - "value": null - }, - { - "color": "red", - "value": 80 - } - ] - } - }, - "overrides": [] - }, - "gridPos": { - "h": 8, - "w": 12, - "x": 12, - "y": 18 - }, - "id": 11, - "options": { - "legend": { - "calcs": [], - "displayMode": "list", - "placement": "bottom", - "showLegend": true - }, - "tooltip": { - "mode": "single", - "sort": "none" - } - }, - "targets": [ - { - "datasource": { - "type": "prometheus", - "uid": "prometheus" - }, - "editorMode": "builder", - "expr": "latency{jobName=\"write\", status=\"err\"} > 0", - "legendFormat": "{{sdk}}-{{sdkVersion}}-p{{quantile}}", - "range": true, - "refId": "A" - } - ], - "title": "Write Latencies (NOT OK)", - "type": "timeseries" - } - ], - "refresh": "", - "revision": 1, - "schemaVersion": 38, - "style": "dark", - "tags": [], - "templating": { - "list": [ - { - "datasource": { - "type": "prometheus", - "uid": "prometheus" - }, - "filters": [], - "hide": 0, - "label": "", - "name": "filter", - "skipUrlSync": false, - "type": "adhoc" - } - ] - }, - "time": { - "from": "now-15m", - "to": "now" - }, - "timepicker": {}, - "timezone": "", - "title": "SLO", - "uid": "7CzMl5t4k", - "version": 1, - "weekStart": "" - } - # custom-dashboard: - # file: dashboards/custom-dashboard.json - # prometheus-stats: - # gnetId: 2 - # revision: 2 - # datasource: Prometheus - # local-dashboard: - # url: https://example.com/repository/test.json - # token: '' - # local-dashboard-base64: - # url: https://example.com/repository/test-b64.json - # token: '' - # b64content: true diff --git a/k8s/helms/ingress.yaml b/k8s/helms/ingress.yaml deleted file mode 100644 index 5c69552a..00000000 --- a/k8s/helms/ingress.yaml +++ /dev/null @@ -1,27 +0,0 @@ -controller: - containerPort: - http: 80 - https: 443 - - nodeSelector: - kubernetes.io/os: linux - DMZ: "true" - - tolerations: - - key: "type" - operator: "Equal" - value: "DMZ" - effect: "NoExecute" - - resources: - requests: - cpu: 100m - memory: 90Mi - - service: - namespace: dmz-ns - - type: NodePort - nodePorts: - http: 32080 - https: 32443 diff --git a/k8s/helms/prometheus-pushgateway.yaml b/k8s/helms/prometheus-pushgateway.yaml deleted file mode 100644 index 6c8d4bbb..00000000 --- a/k8s/helms/prometheus-pushgateway.yaml +++ /dev/null @@ -1,45 +0,0 @@ -namespaceOverride: default -# Enable this if you're using https://github.com/coreos/prometheus-operator -serviceMonitor: - enabled: true - namespace: default - - # Fallback to the prometheus default unless specified - interval: 1s - - ## scheme: HTTP scheme to use for scraping. Can be used with `tlsConfig` for example if using istio mTLS. - # scheme: "" - - ## tlsConfig: TLS configuration to use when scraping the endpoint. For example if using istio mTLS. - ## Of type: https://github.com/coreos/prometheus-operator/blob/master/Documentation/api.md#tlsconfig - # tlsConfig: {} - - # bearerTokenFile: - # Fallback to the prometheus default unless specified - # scrapeTimeout: 30s - - ## Used to pass Labels that are used by the Prometheus installed in your cluster to select Service Monitors to work with - ## ref: https://github.com/coreos/prometheus-operator/blob/master/Documentation/api.md#prometheusspec - additionalLabels: - ydb-cluster-monitor: slo-storage - - # Retain the job and instance labels of the metrics pushed to the Pushgateway - # [Scraping Pushgateway](https://github.com/prometheus/pushgateway#configure-the-pushgateway-as-a-target-to-scrape) - honorLabels: true - - ## Metric relabel configs to apply to samples before ingestion. - ## [Metric Relabeling](https://prometheus.io/docs/prometheus/latest/configuration/configuration/#metric_relabel_configs) - metricRelabelings: [] - # - action: keep - # regex: 'kube_(daemonset|deployment|pod|namespace|node|statefulset).+' - # sourceLabels: [__name__] - - ## Relabel configs to apply to samples before ingestion. - ## [Relabeling](https://prometheus.io/docs/prometheus/latest/configuration/configuration/#relabel_config) - relabelings: [] - # - sourceLabels: [__meta_kubernetes_pod_node_name] - # separator: ; - # regex: ^(.*)$ - # targetLabel: nodename - # replacement: $1 - # action: replace diff --git a/k8s/helms/ydb-operator.yaml b/k8s/helms/ydb-operator.yaml deleted file mode 100644 index db1ecae5..00000000 --- a/k8s/helms/ydb-operator.yaml +++ /dev/null @@ -1,2 +0,0 @@ -metrics: - enabled: true diff --git a/k8s/ingress.yaml b/k8s/ingress.yaml deleted file mode 100644 index 146e32b4..00000000 --- a/k8s/ingress.yaml +++ /dev/null @@ -1,35 +0,0 @@ -kind: Service -apiVersion: v1 -metadata: - name: grafana-local - namespace: dmz-ns -spec: - type: ExternalName - externalName: grafana.default.svc.cluster.local - # ports: - # - port: 80 ---- -apiVersion: networking.k8s.io/v1 -kind: Ingress -metadata: - name: slo-ingress - namespace: dmz-ns - annotations: - # type of authentication - nginx.ingress.kubernetes.io/auth-type: basic - # name of the secret that contains the user/password definitions - nginx.ingress.kubernetes.io/auth-secret: default/ingress-basic-auth - # message to display with an appropriate context why the authentication is required - nginx.ingress.kubernetes.io/auth-realm: "Authentication Required" -spec: - rules: - - http: - paths: - - path: / - pathType: Prefix - backend: - service: - name: grafana-local - port: - number: 80 - ingressClassName: nginx diff --git a/k8s/prometheus.yaml b/k8s/prometheus.yaml deleted file mode 100644 index 2ca63312..00000000 --- a/k8s/prometheus.yaml +++ /dev/null @@ -1,71 +0,0 @@ -apiVersion: v1 -kind: ServiceAccount -metadata: - name: prometheus ---- -apiVersion: rbac.authorization.k8s.io/v1 -kind: ClusterRole -metadata: - name: prometheus -rules: - - apiGroups: [""] - resources: - - nodes - - nodes/metrics - - services - - endpoints - - pods - verbs: ["get", "list", "watch"] - - apiGroups: [""] - resources: - - configmaps - verbs: ["get"] - - apiGroups: - - networking.k8s.io - resources: - - ingresses - verbs: ["get", "list", "watch"] - - nonResourceURLs: ["/metrics"] - verbs: ["get"] ---- -apiVersion: rbac.authorization.k8s.io/v1 -kind: ClusterRoleBinding -metadata: - name: prometheus -roleRef: - apiGroup: rbac.authorization.k8s.io - kind: ClusterRole - name: prometheus -subjects: - - kind: ServiceAccount - name: prometheus - namespace: default ---- -apiVersion: monitoring.coreos.com/v1 -kind: Prometheus -metadata: - name: prometheus -spec: - serviceAccountName: prometheus - serviceMonitorSelector: - matchLabels: - ydb-cluster-monitor: slo-storage - resources: - requests: - memory: 400Mi - enableAdminAPI: false - replicas: 1 - securityContext: - runAsUser: 1000 - runAsNonRoot: true - runAsGroup: 65534 - fsGroup: 2000 - storage: - volumeClaimTemplate: - spec: - accessModes: - - ReadWriteOnce - resources: - requests: - storage: 93Gi - storageClassName: yc-network-ssd-nonreplicated diff --git a/package-lock.json b/package-lock.json deleted file mode 100644 index 72fad58e..00000000 --- a/package-lock.json +++ /dev/null @@ -1,8165 +0,0 @@ -{ - "name": "slo-tests", - "version": "1.1.0", - "lockfileVersion": 3, - "requires": true, - "packages": { - "": { - "name": "slo-tests", - "version": "1.1.0", - "license": "MIT", - "dependencies": { - "@actions/core": "^1.10.1", - "@actions/github": "^6.0.0", - "@octokit/rest": "^21.0.2", - "fs-to-json": "^0.2.0" - }, - "devDependencies": { - "@types/node": "^22.7.4", - "@typescript-eslint/parser": "^5.62.0", - "@vercel/ncc": "^0.38.1", - "eslint": "^8.39.0", - "eslint-plugin-github": "^5.0.1", - "eslint-plugin-jest": "^28.8.3", - "jest": "^29.7.0", - "js-yaml": "^4.1.0", - "prettier": "^3.3.3", - "ts-jest": "^29.2.5", - "typescript": "^5.6.2" - } - }, - "node_modules/@actions/core": { - "version": "1.11.0", - "resolved": "https://registry.npmjs.org/@actions/core/-/core-1.11.0.tgz", - "integrity": "sha512-I21jQUzEjbZolw3jFZ/0iHGCb+rePCww9MaA0SbVFae4FpBTQWP1GIvr/m5Y6GVaxrDz7p3RhBtpBzwkA3rPSA==", - "license": "MIT", - "dependencies": { - "@actions/exec": "^1.1.1", - "@actions/http-client": "^2.0.1" - } - }, - "node_modules/@actions/exec": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/@actions/exec/-/exec-1.1.1.tgz", - "integrity": "sha512-+sCcHHbVdk93a0XT19ECtO/gIXoxvdsgQLzb2fE2/5sIZmWQuluYyjPQtrtTHdU1YzTZ7bAPN4sITq2xi1679w==", - "license": "MIT", - "dependencies": { - "@actions/io": "^1.0.1" - } - }, - "node_modules/@actions/github": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/@actions/github/-/github-6.0.0.tgz", - "integrity": "sha512-alScpSVnYmjNEXboZjarjukQEzgCRmjMv6Xj47fsdnqGS73bjJNDpiiXmp8jr0UZLdUB6d9jW63IcmddUP+l0g==", - "license": "MIT", - "dependencies": { - "@actions/http-client": "^2.2.0", - "@octokit/core": "^5.0.1", - "@octokit/plugin-paginate-rest": "^9.0.0", - "@octokit/plugin-rest-endpoint-methods": "^10.0.0" - } - }, - "node_modules/@actions/http-client": { - "version": "2.2.3", - "resolved": "https://registry.npmjs.org/@actions/http-client/-/http-client-2.2.3.tgz", - "integrity": "sha512-mx8hyJi/hjFvbPokCg4uRd4ZX78t+YyRPtnKWwIl+RzNaVuFpQHfmlGVfsKEJN8LwTCvL+DfVgAM04XaHkm6bA==", - "license": "MIT", - "dependencies": { - "tunnel": "^0.0.6", - "undici": "^5.25.4" - } - }, - "node_modules/@actions/io": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/@actions/io/-/io-1.1.3.tgz", - "integrity": "sha512-wi9JjgKLYS7U/z8PPbco+PvTb/nRWjeoFlJ1Qer83k/3C5PHQi28hiVdeE2kHXmIL99mQFawx8qt/JPjZilJ8Q==", - "license": "MIT" - }, - "node_modules/@ampproject/remapping": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/@ampproject/remapping/-/remapping-2.3.0.tgz", - "integrity": "sha512-30iZtAPgz+LTIYoeivqYo853f02jBYSd5uGnGpkFV0M3xOt9aN73erkgYAmZU43x4VfqcnLxW9Kpg3R5LC4YYw==", - "dev": true, - "license": "Apache-2.0", - "dependencies": { - "@jridgewell/gen-mapping": "^0.3.5", - "@jridgewell/trace-mapping": "^0.3.24" - }, - "engines": { - "node": ">=6.0.0" - } - }, - "node_modules/@babel/code-frame": { - "version": "7.25.7", - "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.25.7.tgz", - "integrity": "sha512-0xZJFNE5XMpENsgfHYTw8FbX4kv53mFLn2i3XPoq69LyhYSCBJtitaHx9QnsVTrsogI4Z3+HtEfZ2/GFPOtf5g==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/highlight": "^7.25.7", - "picocolors": "^1.0.0" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/compat-data": { - "version": "7.25.7", - "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.25.7.tgz", - "integrity": "sha512-9ickoLz+hcXCeh7jrcin+/SLWm+GkxE2kTvoYyp38p4WkdFXfQJxDFGWp/YHjiKLPx06z2A7W8XKuqbReXDzsw==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/core": { - "version": "7.25.7", - "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.25.7.tgz", - "integrity": "sha512-yJ474Zv3cwiSOO9nXJuqzvwEeM+chDuQ8GJirw+pZ91sCGCyOZ3dJkVE09fTV0VEVzXyLWhh3G/AolYTPX7Mow==", - "dev": true, - "license": "MIT", - "dependencies": { - "@ampproject/remapping": "^2.2.0", - "@babel/code-frame": "^7.25.7", - "@babel/generator": "^7.25.7", - "@babel/helper-compilation-targets": "^7.25.7", - "@babel/helper-module-transforms": "^7.25.7", - "@babel/helpers": "^7.25.7", - "@babel/parser": "^7.25.7", - "@babel/template": "^7.25.7", - "@babel/traverse": "^7.25.7", - "@babel/types": "^7.25.7", - "convert-source-map": "^2.0.0", - "debug": "^4.1.0", - "gensync": "^1.0.0-beta.2", - "json5": "^2.2.3", - "semver": "^6.3.1" - }, - "engines": { - "node": ">=6.9.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/babel" - } - }, - "node_modules/@babel/core/node_modules/semver": { - "version": "6.3.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", - "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", - "dev": true, - "license": "ISC", - "bin": { - "semver": "bin/semver.js" - } - }, - "node_modules/@babel/generator": { - "version": "7.25.7", - "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.25.7.tgz", - "integrity": "sha512-5Dqpl5fyV9pIAD62yK9P7fcA768uVPUyrQmqpqstHWgMma4feF1x/oFysBCVZLY5wJ2GkMUCdsNDnGZrPoR6rA==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/types": "^7.25.7", - "@jridgewell/gen-mapping": "^0.3.5", - "@jridgewell/trace-mapping": "^0.3.25", - "jsesc": "^3.0.2" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helper-compilation-targets": { - "version": "7.25.7", - "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.25.7.tgz", - "integrity": "sha512-DniTEax0sv6isaw6qSQSfV4gVRNtw2rte8HHM45t9ZR0xILaufBRNkpMifCRiAPyvL4ACD6v0gfCwCmtOQaV4A==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/compat-data": "^7.25.7", - "@babel/helper-validator-option": "^7.25.7", - "browserslist": "^4.24.0", - "lru-cache": "^5.1.1", - "semver": "^6.3.1" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helper-compilation-targets/node_modules/semver": { - "version": "6.3.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", - "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", - "dev": true, - "license": "ISC", - "bin": { - "semver": "bin/semver.js" - } - }, - "node_modules/@babel/helper-module-imports": { - "version": "7.25.7", - "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.25.7.tgz", - "integrity": "sha512-o0xCgpNmRohmnoWKQ0Ij8IdddjyBFE4T2kagL/x6M3+4zUgc+4qTOUBoNe4XxDskt1HPKO007ZPiMgLDq2s7Kw==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/traverse": "^7.25.7", - "@babel/types": "^7.25.7" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helper-module-transforms": { - "version": "7.25.7", - "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.25.7.tgz", - "integrity": "sha512-k/6f8dKG3yDz/qCwSM+RKovjMix563SLxQFo0UhRNo239SP6n9u5/eLtKD6EAjwta2JHJ49CsD8pms2HdNiMMQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/helper-module-imports": "^7.25.7", - "@babel/helper-simple-access": "^7.25.7", - "@babel/helper-validator-identifier": "^7.25.7", - "@babel/traverse": "^7.25.7" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0" - } - }, - "node_modules/@babel/helper-plugin-utils": { - "version": "7.25.7", - "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.25.7.tgz", - "integrity": "sha512-eaPZai0PiqCi09pPs3pAFfl/zYgGaE6IdXtYvmf0qlcDTd3WCtO7JWCcRd64e0EQrcYgiHibEZnOGsSY4QSgaw==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helper-simple-access": { - "version": "7.25.7", - "resolved": "https://registry.npmjs.org/@babel/helper-simple-access/-/helper-simple-access-7.25.7.tgz", - "integrity": "sha512-FPGAkJmyoChQeM+ruBGIDyrT2tKfZJO8NcxdC+CWNJi7N8/rZpSxK7yvBJ5O/nF1gfu5KzN7VKG3YVSLFfRSxQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/traverse": "^7.25.7", - "@babel/types": "^7.25.7" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helper-string-parser": { - "version": "7.25.7", - "resolved": "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.25.7.tgz", - "integrity": "sha512-CbkjYdsJNHFk8uqpEkpCvRs3YRp9tY6FmFY7wLMSYuGYkrdUi7r2lc4/wqsvlHoMznX3WJ9IP8giGPq68T/Y6g==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helper-validator-identifier": { - "version": "7.25.7", - "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.25.7.tgz", - "integrity": "sha512-AM6TzwYqGChO45oiuPqwL2t20/HdMC1rTPAesnBCgPCSF1x3oN9MVUwQV2iyz4xqWrctwK5RNC8LV22kaQCNYg==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helper-validator-option": { - "version": "7.25.7", - "resolved": "https://registry.npmjs.org/@babel/helper-validator-option/-/helper-validator-option-7.25.7.tgz", - "integrity": "sha512-ytbPLsm+GjArDYXJ8Ydr1c/KJuutjF2besPNbIZnZ6MKUxi/uTA22t2ymmA4WFjZFpjiAMO0xuuJPqK2nvDVfQ==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helpers": { - "version": "7.25.7", - "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.25.7.tgz", - "integrity": "sha512-Sv6pASx7Esm38KQpF/U/OXLwPPrdGHNKoeblRxgZRLXnAtnkEe4ptJPDtAZM7fBLadbc1Q07kQpSiGQ0Jg6tRA==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/template": "^7.25.7", - "@babel/types": "^7.25.7" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/highlight": { - "version": "7.25.7", - "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.25.7.tgz", - "integrity": "sha512-iYyACpW3iW8Fw+ZybQK+drQre+ns/tKpXbNESfrhNnPLIklLbXr7MYJ6gPEd0iETGLOK+SxMjVvKb/ffmk+FEw==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/helper-validator-identifier": "^7.25.7", - "chalk": "^2.4.2", - "js-tokens": "^4.0.0", - "picocolors": "^1.0.0" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/highlight/node_modules/ansi-styles": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", - "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", - "dev": true, - "license": "MIT", - "dependencies": { - "color-convert": "^1.9.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/@babel/highlight/node_modules/chalk": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", - "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "ansi-styles": "^3.2.1", - "escape-string-regexp": "^1.0.5", - "supports-color": "^5.3.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/@babel/highlight/node_modules/color-convert": { - "version": "1.9.3", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", - "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", - "dev": true, - "license": "MIT", - "dependencies": { - "color-name": "1.1.3" - } - }, - "node_modules/@babel/highlight/node_modules/color-name": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", - "integrity": "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==", - "dev": true, - "license": "MIT" - }, - "node_modules/@babel/highlight/node_modules/escape-string-regexp": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", - "integrity": "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=0.8.0" - } - }, - "node_modules/@babel/highlight/node_modules/has-flag": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", - "integrity": "sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=4" - } - }, - "node_modules/@babel/highlight/node_modules/supports-color": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", - "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", - "dev": true, - "license": "MIT", - "dependencies": { - "has-flag": "^3.0.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/@babel/parser": { - "version": "7.25.7", - "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.25.7.tgz", - "integrity": "sha512-aZn7ETtQsjjGG5HruveUK06cU3Hljuhd9Iojm4M8WWv3wLE6OkE5PWbDUkItmMgegmccaITudyuW5RPYrYlgWw==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/types": "^7.25.7" - }, - "bin": { - "parser": "bin/babel-parser.js" - }, - "engines": { - "node": ">=6.0.0" - } - }, - "node_modules/@babel/plugin-syntax-async-generators": { - "version": "7.8.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-async-generators/-/plugin-syntax-async-generators-7.8.4.tgz", - "integrity": "sha512-tycmZxkGfZaxhMRbXlPXuVFpdWlXpir2W4AMhSJgRKzk/eDlIXOhb2LHWoLpDF7TEHylV5zNhykX6KAgHJmTNw==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/helper-plugin-utils": "^7.8.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-syntax-bigint": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-bigint/-/plugin-syntax-bigint-7.8.3.tgz", - "integrity": "sha512-wnTnFlG+YxQm3vDxpGE57Pj0srRU4sHE/mDkt1qv2YJJSeUAec2ma4WLUnUPeKjyrfntVwe/N6dCXpU+zL3Npg==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/helper-plugin-utils": "^7.8.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-syntax-class-properties": { - "version": "7.12.13", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-class-properties/-/plugin-syntax-class-properties-7.12.13.tgz", - "integrity": "sha512-fm4idjKla0YahUNgFNLCB0qySdsoPiZP3iQE3rky0mBUtMZ23yDJ9SJdg6dXTSDnulOVqiF3Hgr9nbXvXTQZYA==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/helper-plugin-utils": "^7.12.13" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-syntax-class-static-block": { - "version": "7.14.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-class-static-block/-/plugin-syntax-class-static-block-7.14.5.tgz", - "integrity": "sha512-b+YyPmr6ldyNnM6sqYeMWE+bgJcJpO6yS4QD7ymxgH34GBPNDM/THBh8iunyvKIZztiwLH4CJZ0RxTk9emgpjw==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/helper-plugin-utils": "^7.14.5" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-syntax-import-attributes": { - "version": "7.25.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-import-attributes/-/plugin-syntax-import-attributes-7.25.7.tgz", - "integrity": "sha512-AqVo+dguCgmpi/3mYBdu9lkngOBlQ2w2vnNpa6gfiCxQZLzV4ZbhsXitJ2Yblkoe1VQwtHSaNmIaGll/26YWRw==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/helper-plugin-utils": "^7.25.7" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-syntax-import-meta": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-import-meta/-/plugin-syntax-import-meta-7.10.4.tgz", - "integrity": "sha512-Yqfm+XDx0+Prh3VSeEQCPU81yC+JWZ2pDPFSS4ZdpfZhp4MkFMaDC1UqseovEKwSUpnIL7+vK+Clp7bfh0iD7g==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/helper-plugin-utils": "^7.10.4" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-syntax-json-strings": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-json-strings/-/plugin-syntax-json-strings-7.8.3.tgz", - "integrity": "sha512-lY6kdGpWHvjoe2vk4WrAapEuBR69EMxZl+RoGRhrFGNYVK8mOPAW8VfbT/ZgrFbXlDNiiaxQnAtgVCZ6jv30EA==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/helper-plugin-utils": "^7.8.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-syntax-jsx": { - "version": "7.25.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-jsx/-/plugin-syntax-jsx-7.25.7.tgz", - "integrity": "sha512-ruZOnKO+ajVL/MVx+PwNBPOkrnXTXoWMtte1MBpegfCArhqOe3Bj52avVj1huLLxNKYKXYaSxZ2F+woK1ekXfw==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/helper-plugin-utils": "^7.25.7" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-syntax-logical-assignment-operators": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-logical-assignment-operators/-/plugin-syntax-logical-assignment-operators-7.10.4.tgz", - "integrity": "sha512-d8waShlpFDinQ5MtvGU9xDAOzKH47+FFoney2baFIoMr952hKOLp1HR7VszoZvOsV/4+RRszNY7D17ba0te0ig==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/helper-plugin-utils": "^7.10.4" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-syntax-nullish-coalescing-operator": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-nullish-coalescing-operator/-/plugin-syntax-nullish-coalescing-operator-7.8.3.tgz", - "integrity": "sha512-aSff4zPII1u2QD7y+F8oDsz19ew4IGEJg9SVW+bqwpwtfFleiQDMdzA/R+UlWDzfnHFCxxleFT0PMIrR36XLNQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/helper-plugin-utils": "^7.8.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-syntax-numeric-separator": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-numeric-separator/-/plugin-syntax-numeric-separator-7.10.4.tgz", - "integrity": "sha512-9H6YdfkcK/uOnY/K7/aA2xpzaAgkQn37yzWUMRK7OaPOqOpGS1+n0H5hxT9AUw9EsSjPW8SVyMJwYRtWs3X3ug==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/helper-plugin-utils": "^7.10.4" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-syntax-object-rest-spread": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-object-rest-spread/-/plugin-syntax-object-rest-spread-7.8.3.tgz", - "integrity": "sha512-XoqMijGZb9y3y2XskN+P1wUGiVwWZ5JmoDRwx5+3GmEplNyVM2s2Dg8ILFQm8rWM48orGy5YpI5Bl8U1y7ydlA==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/helper-plugin-utils": "^7.8.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-syntax-optional-catch-binding": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-optional-catch-binding/-/plugin-syntax-optional-catch-binding-7.8.3.tgz", - "integrity": "sha512-6VPD0Pc1lpTqw0aKoeRTMiB+kWhAoT24PA+ksWSBrFtl5SIRVpZlwN3NNPQjehA2E/91FV3RjLWoVTglWcSV3Q==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/helper-plugin-utils": "^7.8.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-syntax-optional-chaining": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-optional-chaining/-/plugin-syntax-optional-chaining-7.8.3.tgz", - "integrity": "sha512-KoK9ErH1MBlCPxV0VANkXW2/dw4vlbGDrFgz8bmUsBGYkFRcbRwMh6cIJubdPrkxRwuGdtCk0v/wPTKbQgBjkg==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/helper-plugin-utils": "^7.8.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-syntax-private-property-in-object": { - "version": "7.14.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-private-property-in-object/-/plugin-syntax-private-property-in-object-7.14.5.tgz", - "integrity": "sha512-0wVnp9dxJ72ZUJDV27ZfbSj6iHLoytYZmh3rFcxNnvsJF3ktkzLDZPy/mA17HGsaQT3/DQsWYX1f1QGWkCoVUg==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/helper-plugin-utils": "^7.14.5" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-syntax-top-level-await": { - "version": "7.14.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-top-level-await/-/plugin-syntax-top-level-await-7.14.5.tgz", - "integrity": "sha512-hx++upLv5U1rgYfwe1xBQUhRmU41NEvpUvrp8jkrSCdvGSnM5/qdRMtylJ6PG5OFkBaHkbTAKTnd3/YyESRHFw==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/helper-plugin-utils": "^7.14.5" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-syntax-typescript": { - "version": "7.25.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-typescript/-/plugin-syntax-typescript-7.25.7.tgz", - "integrity": "sha512-rR+5FDjpCHqqZN2bzZm18bVYGaejGq5ZkpVCJLXor/+zlSrSoc4KWcHI0URVWjl/68Dyr1uwZUz/1njycEAv9g==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/helper-plugin-utils": "^7.25.7" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/template": { - "version": "7.25.7", - "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.25.7.tgz", - "integrity": "sha512-wRwtAgI3bAS+JGU2upWNL9lSlDcRCqD05BZ1n3X2ONLH1WilFP6O1otQjeMK/1g0pvYcXC7b/qVUB1keofjtZA==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/code-frame": "^7.25.7", - "@babel/parser": "^7.25.7", - "@babel/types": "^7.25.7" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/traverse": { - "version": "7.25.7", - "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.25.7.tgz", - "integrity": "sha512-jatJPT1Zjqvh/1FyJs6qAHL+Dzb7sTb+xr7Q+gM1b+1oBsMsQQ4FkVKb6dFlJvLlVssqkRzV05Jzervt9yhnzg==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/code-frame": "^7.25.7", - "@babel/generator": "^7.25.7", - "@babel/parser": "^7.25.7", - "@babel/template": "^7.25.7", - "@babel/types": "^7.25.7", - "debug": "^4.3.1", - "globals": "^11.1.0" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/traverse/node_modules/globals": { - "version": "11.12.0", - "resolved": "https://registry.npmjs.org/globals/-/globals-11.12.0.tgz", - "integrity": "sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=4" - } - }, - "node_modules/@babel/types": { - "version": "7.25.7", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.25.7.tgz", - "integrity": "sha512-vwIVdXG+j+FOpkwqHRcBgHLYNL7XMkufrlaFvL9o6Ai9sJn9+PdyIL5qa0XzTZw084c+u9LOls53eoZWP/W5WQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/helper-string-parser": "^7.25.7", - "@babel/helper-validator-identifier": "^7.25.7", - "to-fast-properties": "^2.0.0" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@bcoe/v8-coverage": { - "version": "0.2.3", - "resolved": "https://registry.npmjs.org/@bcoe/v8-coverage/-/v8-coverage-0.2.3.tgz", - "integrity": "sha512-0hYQ8SB4Db5zvZB4axdMHGwEaQjkZzFjQiN9LVYvIFB2nSUHW9tYpxWriPrWDASIxiaXax83REcLxuSdnGPZtw==", - "dev": true, - "license": "MIT" - }, - "node_modules/@eslint-community/eslint-utils": { - "version": "4.4.0", - "resolved": "https://registry.npmjs.org/@eslint-community/eslint-utils/-/eslint-utils-4.4.0.tgz", - "integrity": "sha512-1/sA4dwrzBAyeUoQ6oxahHKmrZvsnLCg4RfxW3ZFGGmQkSNQPFNLV9CUEFQP1x9EYXHTo5p6xdhZM1Ne9p/AfA==", - "dev": true, - "license": "MIT", - "dependencies": { - "eslint-visitor-keys": "^3.3.0" - }, - "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" - }, - "peerDependencies": { - "eslint": "^6.0.0 || ^7.0.0 || >=8.0.0" - } - }, - "node_modules/@eslint-community/regexpp": { - "version": "4.11.1", - "resolved": "https://registry.npmjs.org/@eslint-community/regexpp/-/regexpp-4.11.1.tgz", - "integrity": "sha512-m4DVN9ZqskZoLU5GlWZadwDnYo3vAEydiUayB9widCl9ffWx2IvPnp6n3on5rJmziJSw9Bv+Z3ChDVdMwXCY8Q==", - "dev": true, - "license": "MIT", - "engines": { - "node": "^12.0.0 || ^14.0.0 || >=16.0.0" - } - }, - "node_modules/@eslint/eslintrc": { - "version": "2.1.4", - "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-2.1.4.tgz", - "integrity": "sha512-269Z39MS6wVJtsoUl10L60WdkhJVdPG24Q4eZTH3nnF6lpvSShEK3wQjDX9JRWAUPvPh7COouPpU9IrqaZFvtQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "ajv": "^6.12.4", - "debug": "^4.3.2", - "espree": "^9.6.0", - "globals": "^13.19.0", - "ignore": "^5.2.0", - "import-fresh": "^3.2.1", - "js-yaml": "^4.1.0", - "minimatch": "^3.1.2", - "strip-json-comments": "^3.1.1" - }, - "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" - }, - "funding": { - "url": "https://opencollective.com/eslint" - } - }, - "node_modules/@eslint/js": { - "version": "8.57.1", - "resolved": "https://registry.npmjs.org/@eslint/js/-/js-8.57.1.tgz", - "integrity": "sha512-d9zaMRSTIKDLhctzH12MtXvJKSSUhaHcjV+2Z+GK+EEY7XKpP5yR4x+N3TAcHTcu963nIr+TMcCb4DBCYX1z6Q==", - "dev": true, - "license": "MIT", - "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" - } - }, - "node_modules/@fastify/busboy": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/@fastify/busboy/-/busboy-2.1.1.tgz", - "integrity": "sha512-vBZP4NlzfOlerQTnba4aqZoMhE/a9HY7HRqoOPaETQcSQuWEIyZMHGfVu6w9wGtGK5fED5qRs2DteVCjOH60sA==", - "license": "MIT", - "engines": { - "node": ">=14" - } - }, - "node_modules/@github/browserslist-config": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/@github/browserslist-config/-/browserslist-config-1.0.0.tgz", - "integrity": "sha512-gIhjdJp/c2beaIWWIlsXdqXVRUz3r2BxBCpfz/F3JXHvSAQ1paMYjLH+maEATtENg+k5eLV7gA+9yPp762ieuw==", - "dev": true, - "license": "MIT" - }, - "node_modules/@humanwhocodes/config-array": { - "version": "0.13.0", - "resolved": "https://registry.npmjs.org/@humanwhocodes/config-array/-/config-array-0.13.0.tgz", - "integrity": "sha512-DZLEEqFWQFiyK6h5YIeynKx7JlvCYWL0cImfSRXZ9l4Sg2efkFGTuFf6vzXjK1cq6IYkU+Eg/JizXw+TD2vRNw==", - "deprecated": "Use @eslint/config-array instead", - "dev": true, - "license": "Apache-2.0", - "dependencies": { - "@humanwhocodes/object-schema": "^2.0.3", - "debug": "^4.3.1", - "minimatch": "^3.0.5" - }, - "engines": { - "node": ">=10.10.0" - } - }, - "node_modules/@humanwhocodes/module-importer": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/@humanwhocodes/module-importer/-/module-importer-1.0.1.tgz", - "integrity": "sha512-bxveV4V8v5Yb4ncFTT3rPSgZBOpCkjfK0y4oVVVJwIuDVBRMDXrPyXRL988i5ap9m9bnyEEjWfm5WkBmtffLfA==", - "dev": true, - "license": "Apache-2.0", - "engines": { - "node": ">=12.22" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/nzakas" - } - }, - "node_modules/@humanwhocodes/object-schema": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/@humanwhocodes/object-schema/-/object-schema-2.0.3.tgz", - "integrity": "sha512-93zYdMES/c1D69yZiKDBj0V24vqNzB/koF26KPaagAfd3P/4gUlh3Dys5ogAK+Exi9QyzlD8x/08Zt7wIKcDcA==", - "deprecated": "Use @eslint/object-schema instead", - "dev": true, - "license": "BSD-3-Clause" - }, - "node_modules/@istanbuljs/load-nyc-config": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/@istanbuljs/load-nyc-config/-/load-nyc-config-1.1.0.tgz", - "integrity": "sha512-VjeHSlIzpv/NyD3N0YuHfXOPDIixcA1q2ZV98wsMqcYlPmv2n3Yb2lYP9XMElnaFVXg5A7YLTeLu6V84uQDjmQ==", - "dev": true, - "license": "ISC", - "dependencies": { - "camelcase": "^5.3.1", - "find-up": "^4.1.0", - "get-package-type": "^0.1.0", - "js-yaml": "^3.13.1", - "resolve-from": "^5.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/@istanbuljs/load-nyc-config/node_modules/argparse": { - "version": "1.0.10", - "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz", - "integrity": "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==", - "dev": true, - "license": "MIT", - "dependencies": { - "sprintf-js": "~1.0.2" - } - }, - "node_modules/@istanbuljs/load-nyc-config/node_modules/find-up": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz", - "integrity": "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==", - "dev": true, - "license": "MIT", - "dependencies": { - "locate-path": "^5.0.0", - "path-exists": "^4.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/@istanbuljs/load-nyc-config/node_modules/js-yaml": { - "version": "3.14.1", - "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.14.1.tgz", - "integrity": "sha512-okMH7OXXJ7YrN9Ok3/SXrnu4iX9yOk+25nqX4imS2npuvTYDmo/QEZoqwZkYaIDk3jVvBOTOIEgEhaLOynBS9g==", - "dev": true, - "license": "MIT", - "dependencies": { - "argparse": "^1.0.7", - "esprima": "^4.0.0" - }, - "bin": { - "js-yaml": "bin/js-yaml.js" - } - }, - "node_modules/@istanbuljs/load-nyc-config/node_modules/locate-path": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz", - "integrity": "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==", - "dev": true, - "license": "MIT", - "dependencies": { - "p-locate": "^4.1.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/@istanbuljs/load-nyc-config/node_modules/p-limit": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz", - "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==", - "dev": true, - "license": "MIT", - "dependencies": { - "p-try": "^2.0.0" - }, - "engines": { - "node": ">=6" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/@istanbuljs/load-nyc-config/node_modules/p-locate": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-4.1.0.tgz", - "integrity": "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==", - "dev": true, - "license": "MIT", - "dependencies": { - "p-limit": "^2.2.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/@istanbuljs/load-nyc-config/node_modules/resolve-from": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-5.0.0.tgz", - "integrity": "sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=8" - } - }, - "node_modules/@istanbuljs/schema": { - "version": "0.1.3", - "resolved": "https://registry.npmjs.org/@istanbuljs/schema/-/schema-0.1.3.tgz", - "integrity": "sha512-ZXRY4jNvVgSVQ8DL3LTcakaAtXwTVUxE81hslsyD2AtoXW/wVob10HkOJ1X/pAlcI7D+2YoZKg5do8G/w6RYgA==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=8" - } - }, - "node_modules/@jest/console": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/@jest/console/-/console-29.7.0.tgz", - "integrity": "sha512-5Ni4CU7XHQi32IJ398EEP4RrB8eV09sXP2ROqD4bksHrnTree52PsxvX8tpL8LvTZ3pFzXyPbNQReSN41CAhOg==", - "dev": true, - "license": "MIT", - "dependencies": { - "@jest/types": "^29.6.3", - "@types/node": "*", - "chalk": "^4.0.0", - "jest-message-util": "^29.7.0", - "jest-util": "^29.7.0", - "slash": "^3.0.0" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, - "node_modules/@jest/core": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/@jest/core/-/core-29.7.0.tgz", - "integrity": "sha512-n7aeXWKMnGtDA48y8TLWJPJmLmmZ642Ceo78cYWEpiD7FzDgmNDV/GCVRorPABdXLJZ/9wzzgZAlHjXjxDHGsg==", - "dev": true, - "license": "MIT", - "dependencies": { - "@jest/console": "^29.7.0", - "@jest/reporters": "^29.7.0", - "@jest/test-result": "^29.7.0", - "@jest/transform": "^29.7.0", - "@jest/types": "^29.6.3", - "@types/node": "*", - "ansi-escapes": "^4.2.1", - "chalk": "^4.0.0", - "ci-info": "^3.2.0", - "exit": "^0.1.2", - "graceful-fs": "^4.2.9", - "jest-changed-files": "^29.7.0", - "jest-config": "^29.7.0", - "jest-haste-map": "^29.7.0", - "jest-message-util": "^29.7.0", - "jest-regex-util": "^29.6.3", - "jest-resolve": "^29.7.0", - "jest-resolve-dependencies": "^29.7.0", - "jest-runner": "^29.7.0", - "jest-runtime": "^29.7.0", - "jest-snapshot": "^29.7.0", - "jest-util": "^29.7.0", - "jest-validate": "^29.7.0", - "jest-watcher": "^29.7.0", - "micromatch": "^4.0.4", - "pretty-format": "^29.7.0", - "slash": "^3.0.0", - "strip-ansi": "^6.0.0" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - }, - "peerDependencies": { - "node-notifier": "^8.0.1 || ^9.0.0 || ^10.0.0" - }, - "peerDependenciesMeta": { - "node-notifier": { - "optional": true - } - } - }, - "node_modules/@jest/environment": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/@jest/environment/-/environment-29.7.0.tgz", - "integrity": "sha512-aQIfHDq33ExsN4jP1NWGXhxgQ/wixs60gDiKO+XVMd8Mn0NWPWgc34ZQDTb2jKaUWQ7MuwoitXAsN2XVXNMpAw==", - "dev": true, - "license": "MIT", - "dependencies": { - "@jest/fake-timers": "^29.7.0", - "@jest/types": "^29.6.3", - "@types/node": "*", - "jest-mock": "^29.7.0" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, - "node_modules/@jest/expect": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/@jest/expect/-/expect-29.7.0.tgz", - "integrity": "sha512-8uMeAMycttpva3P1lBHB8VciS9V0XAr3GymPpipdyQXbBcuhkLQOSe8E/p92RyAdToS6ZD1tFkX+CkhoECE0dQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "expect": "^29.7.0", - "jest-snapshot": "^29.7.0" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, - "node_modules/@jest/expect-utils": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/@jest/expect-utils/-/expect-utils-29.7.0.tgz", - "integrity": "sha512-GlsNBWiFQFCVi9QVSx7f5AgMeLxe9YCCs5PuP2O2LdjDAA8Jh9eX7lA1Jq/xdXw3Wb3hyvlFNfZIfcRetSzYcA==", - "dev": true, - "license": "MIT", - "dependencies": { - "jest-get-type": "^29.6.3" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, - "node_modules/@jest/fake-timers": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/@jest/fake-timers/-/fake-timers-29.7.0.tgz", - "integrity": "sha512-q4DH1Ha4TTFPdxLsqDXK1d3+ioSL7yL5oCMJZgDYm6i+6CygW5E5xVr/D1HdsGxjt1ZWSfUAs9OxSB/BNelWrQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "@jest/types": "^29.6.3", - "@sinonjs/fake-timers": "^10.0.2", - "@types/node": "*", - "jest-message-util": "^29.7.0", - "jest-mock": "^29.7.0", - "jest-util": "^29.7.0" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, - "node_modules/@jest/globals": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/@jest/globals/-/globals-29.7.0.tgz", - "integrity": "sha512-mpiz3dutLbkW2MNFubUGUEVLkTGiqW6yLVTA+JbP6fI6J5iL9Y0Nlg8k95pcF8ctKwCS7WVxteBs29hhfAotzQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "@jest/environment": "^29.7.0", - "@jest/expect": "^29.7.0", - "@jest/types": "^29.6.3", - "jest-mock": "^29.7.0" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, - "node_modules/@jest/reporters": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/@jest/reporters/-/reporters-29.7.0.tgz", - "integrity": "sha512-DApq0KJbJOEzAFYjHADNNxAE3KbhxQB1y5Kplb5Waqw6zVbuWatSnMjE5gs8FUgEPmNsnZA3NCWl9NG0ia04Pg==", - "dev": true, - "license": "MIT", - "dependencies": { - "@bcoe/v8-coverage": "^0.2.3", - "@jest/console": "^29.7.0", - "@jest/test-result": "^29.7.0", - "@jest/transform": "^29.7.0", - "@jest/types": "^29.6.3", - "@jridgewell/trace-mapping": "^0.3.18", - "@types/node": "*", - "chalk": "^4.0.0", - "collect-v8-coverage": "^1.0.0", - "exit": "^0.1.2", - "glob": "^7.1.3", - "graceful-fs": "^4.2.9", - "istanbul-lib-coverage": "^3.0.0", - "istanbul-lib-instrument": "^6.0.0", - "istanbul-lib-report": "^3.0.0", - "istanbul-lib-source-maps": "^4.0.0", - "istanbul-reports": "^3.1.3", - "jest-message-util": "^29.7.0", - "jest-util": "^29.7.0", - "jest-worker": "^29.7.0", - "slash": "^3.0.0", - "string-length": "^4.0.1", - "strip-ansi": "^6.0.0", - "v8-to-istanbul": "^9.0.1" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - }, - "peerDependencies": { - "node-notifier": "^8.0.1 || ^9.0.0 || ^10.0.0" - }, - "peerDependenciesMeta": { - "node-notifier": { - "optional": true - } - } - }, - "node_modules/@jest/schemas": { - "version": "29.6.3", - "resolved": "https://registry.npmjs.org/@jest/schemas/-/schemas-29.6.3.tgz", - "integrity": "sha512-mo5j5X+jIZmJQveBKeS/clAueipV7KgiX1vMgCxam1RNYiqE1w62n0/tJJnHtjW8ZHcQco5gY85jA3mi0L+nSA==", - "dev": true, - "license": "MIT", - "dependencies": { - "@sinclair/typebox": "^0.27.8" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, - "node_modules/@jest/source-map": { - "version": "29.6.3", - "resolved": "https://registry.npmjs.org/@jest/source-map/-/source-map-29.6.3.tgz", - "integrity": "sha512-MHjT95QuipcPrpLM+8JMSzFx6eHp5Bm+4XeFDJlwsvVBjmKNiIAvasGK2fxz2WbGRlnvqehFbh07MMa7n3YJnw==", - "dev": true, - "license": "MIT", - "dependencies": { - "@jridgewell/trace-mapping": "^0.3.18", - "callsites": "^3.0.0", - "graceful-fs": "^4.2.9" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, - "node_modules/@jest/test-result": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/@jest/test-result/-/test-result-29.7.0.tgz", - "integrity": "sha512-Fdx+tv6x1zlkJPcWXmMDAG2HBnaR9XPSd5aDWQVsfrZmLVT3lU1cwyxLgRmXR9yrq4NBoEm9BMsfgFzTQAbJYA==", - "dev": true, - "license": "MIT", - "dependencies": { - "@jest/console": "^29.7.0", - "@jest/types": "^29.6.3", - "@types/istanbul-lib-coverage": "^2.0.0", - "collect-v8-coverage": "^1.0.0" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, - "node_modules/@jest/test-sequencer": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/@jest/test-sequencer/-/test-sequencer-29.7.0.tgz", - "integrity": "sha512-GQwJ5WZVrKnOJuiYiAF52UNUJXgTZx1NHjFSEB0qEMmSZKAkdMoIzw/Cj6x6NF4AvV23AUqDpFzQkN/eYCYTxw==", - "dev": true, - "license": "MIT", - "dependencies": { - "@jest/test-result": "^29.7.0", - "graceful-fs": "^4.2.9", - "jest-haste-map": "^29.7.0", - "slash": "^3.0.0" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, - "node_modules/@jest/transform": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/@jest/transform/-/transform-29.7.0.tgz", - "integrity": "sha512-ok/BTPFzFKVMwO5eOHRrvnBVHdRy9IrsrW1GpMaQ9MCnilNLXQKmAX8s1YXDFaai9xJpac2ySzV0YeRRECr2Vw==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/core": "^7.11.6", - "@jest/types": "^29.6.3", - "@jridgewell/trace-mapping": "^0.3.18", - "babel-plugin-istanbul": "^6.1.1", - "chalk": "^4.0.0", - "convert-source-map": "^2.0.0", - "fast-json-stable-stringify": "^2.1.0", - "graceful-fs": "^4.2.9", - "jest-haste-map": "^29.7.0", - "jest-regex-util": "^29.6.3", - "jest-util": "^29.7.0", - "micromatch": "^4.0.4", - "pirates": "^4.0.4", - "slash": "^3.0.0", - "write-file-atomic": "^4.0.2" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, - "node_modules/@jest/types": { - "version": "29.6.3", - "resolved": "https://registry.npmjs.org/@jest/types/-/types-29.6.3.tgz", - "integrity": "sha512-u3UPsIilWKOM3F9CXtrG8LEJmNxwoCQC/XVj4IKYXvvpx7QIi/Kg1LI5uDmDpKlac62NUtX7eLjRh+jVZcLOzw==", - "dev": true, - "license": "MIT", - "dependencies": { - "@jest/schemas": "^29.6.3", - "@types/istanbul-lib-coverage": "^2.0.0", - "@types/istanbul-reports": "^3.0.0", - "@types/node": "*", - "@types/yargs": "^17.0.8", - "chalk": "^4.0.0" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, - "node_modules/@jridgewell/gen-mapping": { - "version": "0.3.5", - "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.5.tgz", - "integrity": "sha512-IzL8ZoEDIBRWEzlCcRhOaCupYyN5gdIK+Q6fbFdPDg6HqX6jpkItn7DFIpW9LQzXG6Df9sA7+OKnq0qlz/GaQg==", - "dev": true, - "license": "MIT", - "dependencies": { - "@jridgewell/set-array": "^1.2.1", - "@jridgewell/sourcemap-codec": "^1.4.10", - "@jridgewell/trace-mapping": "^0.3.24" - }, - "engines": { - "node": ">=6.0.0" - } - }, - "node_modules/@jridgewell/resolve-uri": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.2.tgz", - "integrity": "sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=6.0.0" - } - }, - "node_modules/@jridgewell/set-array": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/@jridgewell/set-array/-/set-array-1.2.1.tgz", - "integrity": "sha512-R8gLRTZeyp03ymzP/6Lil/28tGeGEzhx1q2k703KGWRAI1VdvPIXdG70VJc2pAMw3NA6JKL5hhFu1sJX0Mnn/A==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=6.0.0" - } - }, - "node_modules/@jridgewell/sourcemap-codec": { - "version": "1.5.0", - "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.5.0.tgz", - "integrity": "sha512-gv3ZRaISU3fjPAgNsriBRqGWQL6quFx04YMPW/zD8XMLsU32mhCCbfbO6KZFLjvYpCZ8zyDEgqsgf+PwPaM7GQ==", - "dev": true, - "license": "MIT" - }, - "node_modules/@jridgewell/trace-mapping": { - "version": "0.3.25", - "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.25.tgz", - "integrity": "sha512-vNk6aEwybGtawWmy/PzwnGDOjCkLWSD2wqvjGGAgOAwCGWySYXfYoxt00IJkTF+8Lb57DwOb3Aa0o9CApepiYQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "@jridgewell/resolve-uri": "^3.1.0", - "@jridgewell/sourcemap-codec": "^1.4.14" - } - }, - "node_modules/@nodelib/fs.scandir": { - "version": "2.1.5", - "resolved": "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz", - "integrity": "sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==", - "dev": true, - "license": "MIT", - "dependencies": { - "@nodelib/fs.stat": "2.0.5", - "run-parallel": "^1.1.9" - }, - "engines": { - "node": ">= 8" - } - }, - "node_modules/@nodelib/fs.stat": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/@nodelib/fs.stat/-/fs.stat-2.0.5.tgz", - "integrity": "sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 8" - } - }, - "node_modules/@nodelib/fs.walk": { - "version": "1.2.8", - "resolved": "https://registry.npmjs.org/@nodelib/fs.walk/-/fs.walk-1.2.8.tgz", - "integrity": "sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==", - "dev": true, - "license": "MIT", - "dependencies": { - "@nodelib/fs.scandir": "2.1.5", - "fastq": "^1.6.0" - }, - "engines": { - "node": ">= 8" - } - }, - "node_modules/@octokit/auth-token": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/@octokit/auth-token/-/auth-token-4.0.0.tgz", - "integrity": "sha512-tY/msAuJo6ARbK6SPIxZrPBms3xPbfwBrulZe0Wtr/DIY9lje2HeV1uoebShn6mx7SjCHif6EjMvoREj+gZ+SA==", - "license": "MIT", - "engines": { - "node": ">= 18" - } - }, - "node_modules/@octokit/core": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/@octokit/core/-/core-5.2.0.tgz", - "integrity": "sha512-1LFfa/qnMQvEOAdzlQymH0ulepxbxnCYAKJZfMci/5XJyIHWgEYnDmgnKakbTh7CH2tFQ5O60oYDvns4i9RAIg==", - "license": "MIT", - "dependencies": { - "@octokit/auth-token": "^4.0.0", - "@octokit/graphql": "^7.1.0", - "@octokit/request": "^8.3.1", - "@octokit/request-error": "^5.1.0", - "@octokit/types": "^13.0.0", - "before-after-hook": "^2.2.0", - "universal-user-agent": "^6.0.0" - }, - "engines": { - "node": ">= 18" - } - }, - "node_modules/@octokit/endpoint": { - "version": "9.0.5", - "resolved": "https://registry.npmjs.org/@octokit/endpoint/-/endpoint-9.0.5.tgz", - "integrity": "sha512-ekqR4/+PCLkEBF6qgj8WqJfvDq65RH85OAgrtnVp1mSxaXF03u2xW/hUdweGS5654IlC0wkNYC18Z50tSYTAFw==", - "license": "MIT", - "dependencies": { - "@octokit/types": "^13.1.0", - "universal-user-agent": "^6.0.0" - }, - "engines": { - "node": ">= 18" - } - }, - "node_modules/@octokit/graphql": { - "version": "7.1.0", - "resolved": "https://registry.npmjs.org/@octokit/graphql/-/graphql-7.1.0.tgz", - "integrity": "sha512-r+oZUH7aMFui1ypZnAvZmn0KSqAUgE1/tUXIWaqUCa1758ts/Jio84GZuzsvUkme98kv0WFY8//n0J1Z+vsIsQ==", - "license": "MIT", - "dependencies": { - "@octokit/request": "^8.3.0", - "@octokit/types": "^13.0.0", - "universal-user-agent": "^6.0.0" - }, - "engines": { - "node": ">= 18" - } - }, - "node_modules/@octokit/openapi-types": { - "version": "22.2.0", - "resolved": "https://registry.npmjs.org/@octokit/openapi-types/-/openapi-types-22.2.0.tgz", - "integrity": "sha512-QBhVjcUa9W7Wwhm6DBFu6ZZ+1/t/oYxqc2tp81Pi41YNuJinbFRx8B133qVOrAaBbF7D/m0Et6f9/pZt9Rc+tg==", - "license": "MIT" - }, - "node_modules/@octokit/plugin-paginate-rest": { - "version": "9.2.1", - "resolved": "https://registry.npmjs.org/@octokit/plugin-paginate-rest/-/plugin-paginate-rest-9.2.1.tgz", - "integrity": "sha512-wfGhE/TAkXZRLjksFXuDZdmGnJQHvtU/joFQdweXUgzo1XwvBCD4o4+75NtFfjfLK5IwLf9vHTfSiU3sLRYpRw==", - "license": "MIT", - "dependencies": { - "@octokit/types": "^12.6.0" - }, - "engines": { - "node": ">= 18" - }, - "peerDependencies": { - "@octokit/core": "5" - } - }, - "node_modules/@octokit/plugin-paginate-rest/node_modules/@octokit/openapi-types": { - "version": "20.0.0", - "resolved": "https://registry.npmjs.org/@octokit/openapi-types/-/openapi-types-20.0.0.tgz", - "integrity": "sha512-EtqRBEjp1dL/15V7WiX5LJMIxxkdiGJnabzYx5Apx4FkQIFgAfKumXeYAqqJCj1s+BMX4cPFIFC4OLCR6stlnA==", - "license": "MIT" - }, - "node_modules/@octokit/plugin-paginate-rest/node_modules/@octokit/types": { - "version": "12.6.0", - "resolved": "https://registry.npmjs.org/@octokit/types/-/types-12.6.0.tgz", - "integrity": "sha512-1rhSOfRa6H9w4YwK0yrf5faDaDTb+yLyBUKOCV4xtCDB5VmIPqd/v9yr9o6SAzOAlRxMiRiCic6JVM1/kunVkw==", - "license": "MIT", - "dependencies": { - "@octokit/openapi-types": "^20.0.0" - } - }, - "node_modules/@octokit/plugin-rest-endpoint-methods": { - "version": "10.4.1", - "resolved": "https://registry.npmjs.org/@octokit/plugin-rest-endpoint-methods/-/plugin-rest-endpoint-methods-10.4.1.tgz", - "integrity": "sha512-xV1b+ceKV9KytQe3zCVqjg+8GTGfDYwaT1ATU5isiUyVtlVAO3HNdzpS4sr4GBx4hxQ46s7ITtZrAsxG22+rVg==", - "license": "MIT", - "dependencies": { - "@octokit/types": "^12.6.0" - }, - "engines": { - "node": ">= 18" - }, - "peerDependencies": { - "@octokit/core": "5" - } - }, - "node_modules/@octokit/plugin-rest-endpoint-methods/node_modules/@octokit/openapi-types": { - "version": "20.0.0", - "resolved": "https://registry.npmjs.org/@octokit/openapi-types/-/openapi-types-20.0.0.tgz", - "integrity": "sha512-EtqRBEjp1dL/15V7WiX5LJMIxxkdiGJnabzYx5Apx4FkQIFgAfKumXeYAqqJCj1s+BMX4cPFIFC4OLCR6stlnA==", - "license": "MIT" - }, - "node_modules/@octokit/plugin-rest-endpoint-methods/node_modules/@octokit/types": { - "version": "12.6.0", - "resolved": "https://registry.npmjs.org/@octokit/types/-/types-12.6.0.tgz", - "integrity": "sha512-1rhSOfRa6H9w4YwK0yrf5faDaDTb+yLyBUKOCV4xtCDB5VmIPqd/v9yr9o6SAzOAlRxMiRiCic6JVM1/kunVkw==", - "license": "MIT", - "dependencies": { - "@octokit/openapi-types": "^20.0.0" - } - }, - "node_modules/@octokit/request": { - "version": "8.4.0", - "resolved": "https://registry.npmjs.org/@octokit/request/-/request-8.4.0.tgz", - "integrity": "sha512-9Bb014e+m2TgBeEJGEbdplMVWwPmL1FPtggHQRkV+WVsMggPtEkLKPlcVYm/o8xKLkpJ7B+6N8WfQMtDLX2Dpw==", - "license": "MIT", - "dependencies": { - "@octokit/endpoint": "^9.0.1", - "@octokit/request-error": "^5.1.0", - "@octokit/types": "^13.1.0", - "universal-user-agent": "^6.0.0" - }, - "engines": { - "node": ">= 18" - } - }, - "node_modules/@octokit/request-error": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/@octokit/request-error/-/request-error-5.1.0.tgz", - "integrity": "sha512-GETXfE05J0+7H2STzekpKObFe765O5dlAKUTLNGeH+x47z7JjXHfsHKo5z21D/o/IOZTUEI6nyWyR+bZVP/n5Q==", - "license": "MIT", - "dependencies": { - "@octokit/types": "^13.1.0", - "deprecation": "^2.0.0", - "once": "^1.4.0" - }, - "engines": { - "node": ">= 18" - } - }, - "node_modules/@octokit/rest": { - "version": "21.0.2", - "resolved": "https://registry.npmjs.org/@octokit/rest/-/rest-21.0.2.tgz", - "integrity": "sha512-+CiLisCoyWmYicH25y1cDfCrv41kRSvTq6pPWtRroRJzhsCZWZyCqGyI8foJT5LmScADSwRAnr/xo+eewL04wQ==", - "license": "MIT", - "dependencies": { - "@octokit/core": "^6.1.2", - "@octokit/plugin-paginate-rest": "^11.0.0", - "@octokit/plugin-request-log": "^5.3.1", - "@octokit/plugin-rest-endpoint-methods": "^13.0.0" - }, - "engines": { - "node": ">= 18" - } - }, - "node_modules/@octokit/rest/node_modules/@octokit/auth-token": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/@octokit/auth-token/-/auth-token-5.1.1.tgz", - "integrity": "sha512-rh3G3wDO8J9wSjfI436JUKzHIxq8NaiL0tVeB2aXmG6p/9859aUOAjA9pmSPNGGZxfwmaJ9ozOJImuNVJdpvbA==", - "license": "MIT", - "engines": { - "node": ">= 18" - } - }, - "node_modules/@octokit/rest/node_modules/@octokit/core": { - "version": "6.1.2", - "resolved": "https://registry.npmjs.org/@octokit/core/-/core-6.1.2.tgz", - "integrity": "sha512-hEb7Ma4cGJGEUNOAVmyfdB/3WirWMg5hDuNFVejGEDFqupeOysLc2sG6HJxY2etBp5YQu5Wtxwi020jS9xlUwg==", - "license": "MIT", - "dependencies": { - "@octokit/auth-token": "^5.0.0", - "@octokit/graphql": "^8.0.0", - "@octokit/request": "^9.0.0", - "@octokit/request-error": "^6.0.1", - "@octokit/types": "^13.0.0", - "before-after-hook": "^3.0.2", - "universal-user-agent": "^7.0.0" - }, - "engines": { - "node": ">= 18" - } - }, - "node_modules/@octokit/rest/node_modules/@octokit/endpoint": { - "version": "10.1.1", - "resolved": "https://registry.npmjs.org/@octokit/endpoint/-/endpoint-10.1.1.tgz", - "integrity": "sha512-JYjh5rMOwXMJyUpj028cu0Gbp7qe/ihxfJMLc8VZBMMqSwLgOxDI1911gV4Enl1QSavAQNJcwmwBF9M0VvLh6Q==", - "license": "MIT", - "dependencies": { - "@octokit/types": "^13.0.0", - "universal-user-agent": "^7.0.2" - }, - "engines": { - "node": ">= 18" - } - }, - "node_modules/@octokit/rest/node_modules/@octokit/graphql": { - "version": "8.1.1", - "resolved": "https://registry.npmjs.org/@octokit/graphql/-/graphql-8.1.1.tgz", - "integrity": "sha512-ukiRmuHTi6ebQx/HFRCXKbDlOh/7xEV6QUXaE7MJEKGNAncGI/STSbOkl12qVXZrfZdpXctx5O9X1AIaebiDBg==", - "license": "MIT", - "dependencies": { - "@octokit/request": "^9.0.0", - "@octokit/types": "^13.0.0", - "universal-user-agent": "^7.0.0" - }, - "engines": { - "node": ">= 18" - } - }, - "node_modules/@octokit/rest/node_modules/@octokit/plugin-paginate-rest": { - "version": "11.3.5", - "resolved": "https://registry.npmjs.org/@octokit/plugin-paginate-rest/-/plugin-paginate-rest-11.3.5.tgz", - "integrity": "sha512-cgwIRtKrpwhLoBi0CUNuY83DPGRMaWVjqVI/bGKsLJ4PzyWZNaEmhHroI2xlrVXkk6nFv0IsZpOp+ZWSWUS2AQ==", - "license": "MIT", - "dependencies": { - "@octokit/types": "^13.6.0" - }, - "engines": { - "node": ">= 18" - }, - "peerDependencies": { - "@octokit/core": ">=6" - } - }, - "node_modules/@octokit/rest/node_modules/@octokit/plugin-request-log": { - "version": "5.3.1", - "resolved": "https://registry.npmjs.org/@octokit/plugin-request-log/-/plugin-request-log-5.3.1.tgz", - "integrity": "sha512-n/lNeCtq+9ofhC15xzmJCNKP2BWTv8Ih2TTy+jatNCCq/gQP/V7rK3fjIfuz0pDWDALO/o/4QY4hyOF6TQQFUw==", - "license": "MIT", - "engines": { - "node": ">= 18" - }, - "peerDependencies": { - "@octokit/core": ">=6" - } - }, - "node_modules/@octokit/rest/node_modules/@octokit/plugin-rest-endpoint-methods": { - "version": "13.2.6", - "resolved": "https://registry.npmjs.org/@octokit/plugin-rest-endpoint-methods/-/plugin-rest-endpoint-methods-13.2.6.tgz", - "integrity": "sha512-wMsdyHMjSfKjGINkdGKki06VEkgdEldIGstIEyGX0wbYHGByOwN/KiM+hAAlUwAtPkP3gvXtVQA9L3ITdV2tVw==", - "license": "MIT", - "dependencies": { - "@octokit/types": "^13.6.1" - }, - "engines": { - "node": ">= 18" - }, - "peerDependencies": { - "@octokit/core": ">=6" - } - }, - "node_modules/@octokit/rest/node_modules/@octokit/request": { - "version": "9.1.3", - "resolved": "https://registry.npmjs.org/@octokit/request/-/request-9.1.3.tgz", - "integrity": "sha512-V+TFhu5fdF3K58rs1pGUJIDH5RZLbZm5BI+MNF+6o/ssFNT4vWlCh/tVpF3NxGtP15HUxTTMUbsG5llAuU2CZA==", - "license": "MIT", - "dependencies": { - "@octokit/endpoint": "^10.0.0", - "@octokit/request-error": "^6.0.1", - "@octokit/types": "^13.1.0", - "universal-user-agent": "^7.0.2" - }, - "engines": { - "node": ">= 18" - } - }, - "node_modules/@octokit/rest/node_modules/@octokit/request-error": { - "version": "6.1.5", - "resolved": "https://registry.npmjs.org/@octokit/request-error/-/request-error-6.1.5.tgz", - "integrity": "sha512-IlBTfGX8Yn/oFPMwSfvugfncK2EwRLjzbrpifNaMY8o/HTEAFqCA1FZxjD9cWvSKBHgrIhc4CSBIzMxiLsbzFQ==", - "license": "MIT", - "dependencies": { - "@octokit/types": "^13.0.0" - }, - "engines": { - "node": ">= 18" - } - }, - "node_modules/@octokit/rest/node_modules/before-after-hook": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/before-after-hook/-/before-after-hook-3.0.2.tgz", - "integrity": "sha512-Nik3Sc0ncrMK4UUdXQmAnRtzmNQTAAXmXIopizwZ1W1t8QmfJj+zL4OA2I7XPTPW5z5TDqv4hRo/JzouDJnX3A==", - "license": "Apache-2.0" - }, - "node_modules/@octokit/rest/node_modules/universal-user-agent": { - "version": "7.0.2", - "resolved": "https://registry.npmjs.org/universal-user-agent/-/universal-user-agent-7.0.2.tgz", - "integrity": "sha512-0JCqzSKnStlRRQfCdowvqy3cy0Dvtlb8xecj/H8JFZuCze4rwjPZQOgvFvn0Ws/usCHQFGpyr+pB9adaGwXn4Q==", - "license": "ISC" - }, - "node_modules/@octokit/types": { - "version": "13.6.1", - "resolved": "https://registry.npmjs.org/@octokit/types/-/types-13.6.1.tgz", - "integrity": "sha512-PHZE9Z+kWXb23Ndik8MKPirBPziOc0D2/3KH1P+6jK5nGWe96kadZuE4jev2/Jq7FvIfTlT2Ltg8Fv2x1v0a5g==", - "license": "MIT", - "dependencies": { - "@octokit/openapi-types": "^22.2.0" - } - }, - "node_modules/@pkgr/core": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/@pkgr/core/-/core-0.1.1.tgz", - "integrity": "sha512-cq8o4cWH0ibXh9VGi5P20Tu9XF/0fFXl9EUinr9QfTM7a7p0oTA4iJRCQWppXR1Pg8dSM0UCItCkPwsk9qWWYA==", - "dev": true, - "license": "MIT", - "engines": { - "node": "^12.20.0 || ^14.18.0 || >=16.0.0" - }, - "funding": { - "url": "https://opencollective.com/unts" - } - }, - "node_modules/@rtsao/scc": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/@rtsao/scc/-/scc-1.1.0.tgz", - "integrity": "sha512-zt6OdqaDoOnJ1ZYsCYGt9YmWzDXl4vQdKTyJev62gFhRGKdx7mcT54V9KIjg+d2wi9EXsPvAPKe7i7WjfVWB8g==", - "dev": true, - "license": "MIT" - }, - "node_modules/@sinclair/typebox": { - "version": "0.27.8", - "resolved": "https://registry.npmjs.org/@sinclair/typebox/-/typebox-0.27.8.tgz", - "integrity": "sha512-+Fj43pSMwJs4KRrH/938Uf+uAELIgVBmQzg/q1YG10djyfA3TnrU8N8XzqCh/okZdszqBQTZf96idMfE5lnwTA==", - "dev": true, - "license": "MIT" - }, - "node_modules/@sinonjs/commons": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/@sinonjs/commons/-/commons-3.0.1.tgz", - "integrity": "sha512-K3mCHKQ9sVh8o1C9cxkwxaOmXoAMlDxC1mYyHrjqOWEcBjYr76t96zL2zlj5dUGZ3HSw240X1qgH3Mjf1yJWpQ==", - "dev": true, - "license": "BSD-3-Clause", - "dependencies": { - "type-detect": "4.0.8" - } - }, - "node_modules/@sinonjs/fake-timers": { - "version": "10.3.0", - "resolved": "https://registry.npmjs.org/@sinonjs/fake-timers/-/fake-timers-10.3.0.tgz", - "integrity": "sha512-V4BG07kuYSUkTCSBHG8G8TNhM+F19jXFWnQtzj+we8DrkpSBCee9Z3Ms8yiGer/dlmhe35/Xdgyo3/0rQKg7YA==", - "dev": true, - "license": "BSD-3-Clause", - "dependencies": { - "@sinonjs/commons": "^3.0.0" - } - }, - "node_modules/@types/babel__core": { - "version": "7.20.5", - "resolved": "https://registry.npmjs.org/@types/babel__core/-/babel__core-7.20.5.tgz", - "integrity": "sha512-qoQprZvz5wQFJwMDqeseRXWv3rqMvhgpbXFfVyWhbx9X47POIA6i/+dXefEmZKoAgOaTdaIgNSMqMIU61yRyzA==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/parser": "^7.20.7", - "@babel/types": "^7.20.7", - "@types/babel__generator": "*", - "@types/babel__template": "*", - "@types/babel__traverse": "*" - } - }, - "node_modules/@types/babel__generator": { - "version": "7.6.8", - "resolved": "https://registry.npmjs.org/@types/babel__generator/-/babel__generator-7.6.8.tgz", - "integrity": "sha512-ASsj+tpEDsEiFr1arWrlN6V3mdfjRMZt6LtK/Vp/kreFLnr5QH5+DhvD5nINYZXzwJvXeGq+05iUXcAzVrqWtw==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/types": "^7.0.0" - } - }, - "node_modules/@types/babel__template": { - "version": "7.4.4", - "resolved": "https://registry.npmjs.org/@types/babel__template/-/babel__template-7.4.4.tgz", - "integrity": "sha512-h/NUaSyG5EyxBIp8YRxo4RMe2/qQgvyowRwVMzhYhBCONbW8PUsg4lkFMrhgZhUe5z3L3MiLDuvyJ/CaPa2A8A==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/parser": "^7.1.0", - "@babel/types": "^7.0.0" - } - }, - "node_modules/@types/babel__traverse": { - "version": "7.20.6", - "resolved": "https://registry.npmjs.org/@types/babel__traverse/-/babel__traverse-7.20.6.tgz", - "integrity": "sha512-r1bzfrm0tomOI8g1SzvCaQHo6Lcv6zu0EA+W2kHrt8dyrHQxGzBBL4kdkzIS+jBMV+EYcMAEAqXqYaLJq5rOZg==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/types": "^7.20.7" - } - }, - "node_modules/@types/graceful-fs": { - "version": "4.1.9", - "resolved": "https://registry.npmjs.org/@types/graceful-fs/-/graceful-fs-4.1.9.tgz", - "integrity": "sha512-olP3sd1qOEe5dXTSaFvQG+02VdRXcdytWLAZsAq1PecU8uqQAhkrnbli7DagjtXKW/Bl7YJbUsa8MPcuc8LHEQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "@types/node": "*" - } - }, - "node_modules/@types/istanbul-lib-coverage": { - "version": "2.0.6", - "resolved": "https://registry.npmjs.org/@types/istanbul-lib-coverage/-/istanbul-lib-coverage-2.0.6.tgz", - "integrity": "sha512-2QF/t/auWm0lsy8XtKVPG19v3sSOQlJe/YHZgfjb/KBBHOGSV+J2q/S671rcq9uTBrLAXmZpqJiaQbMT+zNU1w==", - "dev": true, - "license": "MIT" - }, - "node_modules/@types/istanbul-lib-report": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/@types/istanbul-lib-report/-/istanbul-lib-report-3.0.3.tgz", - "integrity": "sha512-NQn7AHQnk/RSLOxrBbGyJM/aVQ+pjj5HCgasFxc0K/KhoATfQ/47AyUl15I2yBUpihjmas+a+VJBOqecrFH+uA==", - "dev": true, - "license": "MIT", - "dependencies": { - "@types/istanbul-lib-coverage": "*" - } - }, - "node_modules/@types/istanbul-reports": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/@types/istanbul-reports/-/istanbul-reports-3.0.4.tgz", - "integrity": "sha512-pk2B1NWalF9toCRu6gjBzR69syFjP4Od8WRAX+0mmf9lAjCRicLOWc+ZrxZHx/0XRjotgkF9t6iaMJ+aXcOdZQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "@types/istanbul-lib-report": "*" - } - }, - "node_modules/@types/json5": { - "version": "0.0.29", - "resolved": "https://registry.npmjs.org/@types/json5/-/json5-0.0.29.tgz", - "integrity": "sha512-dRLjCWHYg4oaA77cxO64oO+7JwCwnIzkZPdrrC71jQmQtlhM556pwKo5bUzqvZndkVbeFLIIi+9TC40JNF5hNQ==", - "dev": true, - "license": "MIT" - }, - "node_modules/@types/node": { - "version": "22.7.4", - "resolved": "https://registry.npmjs.org/@types/node/-/node-22.7.4.tgz", - "integrity": "sha512-y+NPi1rFzDs1NdQHHToqeiX2TIS79SWEAw9GYhkkx8bD0ChpfqC+n2j5OXOCpzfojBEBt6DnEnnG9MY0zk1XLg==", - "dev": true, - "license": "MIT", - "dependencies": { - "undici-types": "~6.19.2" - } - }, - "node_modules/@types/stack-utils": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/@types/stack-utils/-/stack-utils-2.0.3.tgz", - "integrity": "sha512-9aEbYZ3TbYMznPdcdr3SmIrLXwC/AKZXQeCf9Pgao5CKb8CyHuEX5jzWPTkvregvhRJHcpRO6BFoGW9ycaOkYw==", - "dev": true, - "license": "MIT" - }, - "node_modules/@types/yargs": { - "version": "17.0.33", - "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-17.0.33.tgz", - "integrity": "sha512-WpxBCKWPLr4xSsHgz511rFJAM+wS28w2zEO1QDNY5zM/S8ok70NNfztH0xwhqKyaK0OHCbN98LDAZuy1ctxDkA==", - "dev": true, - "license": "MIT", - "dependencies": { - "@types/yargs-parser": "*" - } - }, - "node_modules/@types/yargs-parser": { - "version": "21.0.3", - "resolved": "https://registry.npmjs.org/@types/yargs-parser/-/yargs-parser-21.0.3.tgz", - "integrity": "sha512-I4q9QU9MQv4oEOz4tAHJtNz1cwuLxn2F3xcc2iV5WdqLPpUnj30aUuxt1mAxYTG+oe8CZMV/+6rU4S4gRDzqtQ==", - "dev": true, - "license": "MIT" - }, - "node_modules/@typescript-eslint/parser": { - "version": "5.62.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-5.62.0.tgz", - "integrity": "sha512-VlJEV0fOQ7BExOsHYAGrgbEiZoi8D+Bl2+f6V2RrXerRSylnp+ZBHmPvaIa8cz0Ajx7WO7Z5RqfgYg7ED1nRhA==", - "dev": true, - "license": "BSD-2-Clause", - "dependencies": { - "@typescript-eslint/scope-manager": "5.62.0", - "@typescript-eslint/types": "5.62.0", - "@typescript-eslint/typescript-estree": "5.62.0", - "debug": "^4.3.4" - }, - "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - }, - "peerDependencies": { - "eslint": "^6.0.0 || ^7.0.0 || ^8.0.0" - }, - "peerDependenciesMeta": { - "typescript": { - "optional": true - } - } - }, - "node_modules/@typescript-eslint/scope-manager": { - "version": "5.62.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-5.62.0.tgz", - "integrity": "sha512-VXuvVvZeQCQb5Zgf4HAxc04q5j+WrNAtNh9OwCsCgpKqESMTu3tF/jhZ3xG6T4NZwWl65Bg8KuS2uEvhSfLl0w==", - "dev": true, - "license": "MIT", - "dependencies": { - "@typescript-eslint/types": "5.62.0", - "@typescript-eslint/visitor-keys": "5.62.0" - }, - "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - } - }, - "node_modules/@typescript-eslint/type-utils": { - "version": "8.8.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-8.8.0.tgz", - "integrity": "sha512-IKwJSS7bCqyCeG4NVGxnOP6lLT9Okc3Zj8hLO96bpMkJab+10HIfJbMouLrlpyOr3yrQ1cA413YPFiGd1mW9/Q==", - "dev": true, - "license": "MIT", - "dependencies": { - "@typescript-eslint/typescript-estree": "8.8.0", - "@typescript-eslint/utils": "8.8.0", - "debug": "^4.3.4", - "ts-api-utils": "^1.3.0" - }, - "engines": { - "node": "^18.18.0 || ^20.9.0 || >=21.1.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - }, - "peerDependenciesMeta": { - "typescript": { - "optional": true - } - } - }, - "node_modules/@typescript-eslint/type-utils/node_modules/@typescript-eslint/types": { - "version": "8.8.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-8.8.0.tgz", - "integrity": "sha512-QJwc50hRCgBd/k12sTykOJbESe1RrzmX6COk8Y525C9l7oweZ+1lw9JiU56im7Amm8swlz00DRIlxMYLizr2Vw==", - "dev": true, - "license": "MIT", - "engines": { - "node": "^18.18.0 || ^20.9.0 || >=21.1.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - } - }, - "node_modules/@typescript-eslint/type-utils/node_modules/@typescript-eslint/typescript-estree": { - "version": "8.8.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-8.8.0.tgz", - "integrity": "sha512-ZaMJwc/0ckLz5DaAZ+pNLmHv8AMVGtfWxZe/x2JVEkD5LnmhWiQMMcYT7IY7gkdJuzJ9P14fRy28lUrlDSWYdw==", - "dev": true, - "license": "BSD-2-Clause", - "dependencies": { - "@typescript-eslint/types": "8.8.0", - "@typescript-eslint/visitor-keys": "8.8.0", - "debug": "^4.3.4", - "fast-glob": "^3.3.2", - "is-glob": "^4.0.3", - "minimatch": "^9.0.4", - "semver": "^7.6.0", - "ts-api-utils": "^1.3.0" - }, - "engines": { - "node": "^18.18.0 || ^20.9.0 || >=21.1.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - }, - "peerDependenciesMeta": { - "typescript": { - "optional": true - } - } - }, - "node_modules/@typescript-eslint/type-utils/node_modules/@typescript-eslint/visitor-keys": { - "version": "8.8.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-8.8.0.tgz", - "integrity": "sha512-8mq51Lx6Hpmd7HnA2fcHQo3YgfX1qbccxQOgZcb4tvasu//zXRaA1j5ZRFeCw/VRAdFi4mRM9DnZw0Nu0Q2d1g==", - "dev": true, - "license": "MIT", - "dependencies": { - "@typescript-eslint/types": "8.8.0", - "eslint-visitor-keys": "^3.4.3" - }, - "engines": { - "node": "^18.18.0 || ^20.9.0 || >=21.1.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - } - }, - "node_modules/@typescript-eslint/type-utils/node_modules/brace-expansion": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz", - "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==", - "dev": true, - "license": "MIT", - "dependencies": { - "balanced-match": "^1.0.0" - } - }, - "node_modules/@typescript-eslint/type-utils/node_modules/minimatch": { - "version": "9.0.5", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.5.tgz", - "integrity": "sha512-G6T0ZX48xgozx7587koeX9Ys2NYy6Gmv//P89sEte9V9whIapMNF4idKxnW2QtCcLiTWlb/wfCabAtAFWhhBow==", - "dev": true, - "license": "ISC", - "dependencies": { - "brace-expansion": "^2.0.1" - }, - "engines": { - "node": ">=16 || 14 >=14.17" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "node_modules/@typescript-eslint/types": { - "version": "5.62.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-5.62.0.tgz", - "integrity": "sha512-87NVngcbVXUahrRTqIK27gD2t5Cu1yuCXxbLcFtCzZGlfyVWWh8mLHkoxzjsB6DDNnvdL+fW8MiwPEJyGJQDgQ==", - "dev": true, - "license": "MIT", - "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - } - }, - "node_modules/@typescript-eslint/typescript-estree": { - "version": "5.62.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-5.62.0.tgz", - "integrity": "sha512-CmcQ6uY7b9y694lKdRB8FEel7JbU/40iSAPomu++SjLMntB+2Leay2LO6i8VnJk58MtE9/nQSFIH6jpyRWyYzA==", - "dev": true, - "license": "BSD-2-Clause", - "dependencies": { - "@typescript-eslint/types": "5.62.0", - "@typescript-eslint/visitor-keys": "5.62.0", - "debug": "^4.3.4", - "globby": "^11.1.0", - "is-glob": "^4.0.3", - "semver": "^7.3.7", - "tsutils": "^3.21.0" - }, - "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - }, - "peerDependenciesMeta": { - "typescript": { - "optional": true - } - } - }, - "node_modules/@typescript-eslint/utils": { - "version": "8.8.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-8.8.0.tgz", - "integrity": "sha512-QE2MgfOTem00qrlPgyByaCHay9yb1+9BjnMFnSFkUKQfu7adBXDTnCAivURnuPPAG/qiB+kzKkZKmKfaMT0zVg==", - "dev": true, - "license": "MIT", - "dependencies": { - "@eslint-community/eslint-utils": "^4.4.0", - "@typescript-eslint/scope-manager": "8.8.0", - "@typescript-eslint/types": "8.8.0", - "@typescript-eslint/typescript-estree": "8.8.0" - }, - "engines": { - "node": "^18.18.0 || ^20.9.0 || >=21.1.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - }, - "peerDependencies": { - "eslint": "^8.57.0 || ^9.0.0" - } - }, - "node_modules/@typescript-eslint/utils/node_modules/@typescript-eslint/scope-manager": { - "version": "8.8.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-8.8.0.tgz", - "integrity": "sha512-EL8eaGC6gx3jDd8GwEFEV091210U97J0jeEHrAYvIYosmEGet4wJ+g0SYmLu+oRiAwbSA5AVrt6DxLHfdd+bUg==", - "dev": true, - "license": "MIT", - "dependencies": { - "@typescript-eslint/types": "8.8.0", - "@typescript-eslint/visitor-keys": "8.8.0" - }, - "engines": { - "node": "^18.18.0 || ^20.9.0 || >=21.1.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - } - }, - "node_modules/@typescript-eslint/utils/node_modules/@typescript-eslint/types": { - "version": "8.8.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-8.8.0.tgz", - "integrity": "sha512-QJwc50hRCgBd/k12sTykOJbESe1RrzmX6COk8Y525C9l7oweZ+1lw9JiU56im7Amm8swlz00DRIlxMYLizr2Vw==", - "dev": true, - "license": "MIT", - "engines": { - "node": "^18.18.0 || ^20.9.0 || >=21.1.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - } - }, - "node_modules/@typescript-eslint/utils/node_modules/@typescript-eslint/typescript-estree": { - "version": "8.8.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-8.8.0.tgz", - "integrity": "sha512-ZaMJwc/0ckLz5DaAZ+pNLmHv8AMVGtfWxZe/x2JVEkD5LnmhWiQMMcYT7IY7gkdJuzJ9P14fRy28lUrlDSWYdw==", - "dev": true, - "license": "BSD-2-Clause", - "dependencies": { - "@typescript-eslint/types": "8.8.0", - "@typescript-eslint/visitor-keys": "8.8.0", - "debug": "^4.3.4", - "fast-glob": "^3.3.2", - "is-glob": "^4.0.3", - "minimatch": "^9.0.4", - "semver": "^7.6.0", - "ts-api-utils": "^1.3.0" - }, - "engines": { - "node": "^18.18.0 || ^20.9.0 || >=21.1.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - }, - "peerDependenciesMeta": { - "typescript": { - "optional": true - } - } - }, - "node_modules/@typescript-eslint/utils/node_modules/@typescript-eslint/visitor-keys": { - "version": "8.8.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-8.8.0.tgz", - "integrity": "sha512-8mq51Lx6Hpmd7HnA2fcHQo3YgfX1qbccxQOgZcb4tvasu//zXRaA1j5ZRFeCw/VRAdFi4mRM9DnZw0Nu0Q2d1g==", - "dev": true, - "license": "MIT", - "dependencies": { - "@typescript-eslint/types": "8.8.0", - "eslint-visitor-keys": "^3.4.3" - }, - "engines": { - "node": "^18.18.0 || ^20.9.0 || >=21.1.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - } - }, - "node_modules/@typescript-eslint/utils/node_modules/brace-expansion": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz", - "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==", - "dev": true, - "license": "MIT", - "dependencies": { - "balanced-match": "^1.0.0" - } - }, - "node_modules/@typescript-eslint/utils/node_modules/minimatch": { - "version": "9.0.5", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.5.tgz", - "integrity": "sha512-G6T0ZX48xgozx7587koeX9Ys2NYy6Gmv//P89sEte9V9whIapMNF4idKxnW2QtCcLiTWlb/wfCabAtAFWhhBow==", - "dev": true, - "license": "ISC", - "dependencies": { - "brace-expansion": "^2.0.1" - }, - "engines": { - "node": ">=16 || 14 >=14.17" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "node_modules/@typescript-eslint/visitor-keys": { - "version": "5.62.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-5.62.0.tgz", - "integrity": "sha512-07ny+LHRzQXepkGg6w0mFY41fVUNBrL2Roj/++7V1txKugfjm/Ci/qSND03r2RhlJhJYMcTn9AhhSSqQp0Ysyw==", - "dev": true, - "license": "MIT", - "dependencies": { - "@typescript-eslint/types": "5.62.0", - "eslint-visitor-keys": "^3.3.0" - }, - "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - } - }, - "node_modules/@ungap/structured-clone": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/@ungap/structured-clone/-/structured-clone-1.2.0.tgz", - "integrity": "sha512-zuVdFrMJiuCDQUMCzQaD6KL28MjnqqN8XnAqiEq9PNm/hCPTSGfrXCOfwj1ow4LFb/tNymJPwsNbVePc1xFqrQ==", - "dev": true, - "license": "ISC" - }, - "node_modules/@vercel/ncc": { - "version": "0.38.2", - "resolved": "https://registry.npmjs.org/@vercel/ncc/-/ncc-0.38.2.tgz", - "integrity": "sha512-3yel3jaxUg9pHBv4+KeC9qlbdZPug+UMtUOlhvpDYCMSgcNSrS2Hv1LoqMsOV7hf2lYscx+BESfJOIla1WsmMQ==", - "dev": true, - "license": "MIT", - "bin": { - "ncc": "dist/ncc/cli.js" - } - }, - "node_modules/acorn": { - "version": "8.12.1", - "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.12.1.tgz", - "integrity": "sha512-tcpGyI9zbizT9JbV6oYE477V6mTlXvvi0T0G3SNIYE2apm/G5huBa1+K89VGeovbg+jycCrfhl3ADxErOuO6Jg==", - "dev": true, - "license": "MIT", - "bin": { - "acorn": "bin/acorn" - }, - "engines": { - "node": ">=0.4.0" - } - }, - "node_modules/acorn-jsx": { - "version": "5.3.2", - "resolved": "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-5.3.2.tgz", - "integrity": "sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==", - "dev": true, - "license": "MIT", - "peerDependencies": { - "acorn": "^6.0.0 || ^7.0.0 || ^8.0.0" - } - }, - "node_modules/ajv": { - "version": "6.12.6", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", - "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", - "dev": true, - "license": "MIT", - "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" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/epoberezkin" - } - }, - "node_modules/ansi-escapes": { - "version": "4.3.2", - "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-4.3.2.tgz", - "integrity": "sha512-gKXj5ALrKWQLsYG9jlTRmR/xKluxHV+Z9QEwNIgCfM1/uwPMCuzVVnh5mwTd+OuBZcwSIMbqssNWRm1lE51QaQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "type-fest": "^0.21.3" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/ansi-escapes/node_modules/type-fest": { - "version": "0.21.3", - "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.21.3.tgz", - "integrity": "sha512-t0rzBq87m3fVcduHDUFhKmyyX+9eo6WQjZvf51Ea/M0Q7+T374Jp1aUiyUl0GKxp8M/OETVHSDvmkyPgvX+X2w==", - "dev": true, - "license": "(MIT OR CC0-1.0)", - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/ansi-regex": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", - "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=8" - } - }, - "node_modules/ansi-styles": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", - "dev": true, - "license": "MIT", - "dependencies": { - "color-convert": "^2.0.1" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" - } - }, - "node_modules/anymatch": { - "version": "3.1.3", - "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.3.tgz", - "integrity": "sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==", - "dev": true, - "license": "ISC", - "dependencies": { - "normalize-path": "^3.0.0", - "picomatch": "^2.0.4" - }, - "engines": { - "node": ">= 8" - } - }, - "node_modules/argparse": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz", - "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==", - "dev": true, - "license": "Python-2.0" - }, - "node_modules/aria-query": { - "version": "5.3.2", - "resolved": "https://registry.npmjs.org/aria-query/-/aria-query-5.3.2.tgz", - "integrity": "sha512-COROpnaoap1E2F000S62r6A60uHZnmlvomhfyT2DlTcrY1OrBKn2UhH7qn5wTC9zMvD0AY7csdPSNwKP+7WiQw==", - "dev": true, - "license": "Apache-2.0", - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/array-buffer-byte-length": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/array-buffer-byte-length/-/array-buffer-byte-length-1.0.1.tgz", - "integrity": "sha512-ahC5W1xgou+KTXix4sAO8Ki12Q+jf4i0+tmk3sC+zgcynshkHxzpXdImBehiUYKKKDwvfFiJl1tZt6ewscS1Mg==", - "dev": true, - "license": "MIT", - "dependencies": { - "call-bind": "^1.0.5", - "is-array-buffer": "^3.0.4" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/array-includes": { - "version": "3.1.8", - "resolved": "https://registry.npmjs.org/array-includes/-/array-includes-3.1.8.tgz", - "integrity": "sha512-itaWrbYbqpGXkGhZPGUulwnhVf5Hpy1xiCFsGqyIGglbBxmG5vSjxQen3/WGOjPpNEv1RtBLKxbmVXm8HpJStQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "call-bind": "^1.0.7", - "define-properties": "^1.2.1", - "es-abstract": "^1.23.2", - "es-object-atoms": "^1.0.0", - "get-intrinsic": "^1.2.4", - "is-string": "^1.0.7" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/array-union": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/array-union/-/array-union-2.1.0.tgz", - "integrity": "sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=8" - } - }, - "node_modules/array.prototype.findlastindex": { - "version": "1.2.5", - "resolved": "https://registry.npmjs.org/array.prototype.findlastindex/-/array.prototype.findlastindex-1.2.5.tgz", - "integrity": "sha512-zfETvRFA8o7EiNn++N5f/kaCw221hrpGsDmcpndVupkPzEc1Wuf3VgC0qby1BbHs7f5DVYjgtEU2LLh5bqeGfQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "call-bind": "^1.0.7", - "define-properties": "^1.2.1", - "es-abstract": "^1.23.2", - "es-errors": "^1.3.0", - "es-object-atoms": "^1.0.0", - "es-shim-unscopables": "^1.0.2" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/array.prototype.flat": { - "version": "1.3.2", - "resolved": "https://registry.npmjs.org/array.prototype.flat/-/array.prototype.flat-1.3.2.tgz", - "integrity": "sha512-djYB+Zx2vLewY8RWlNCUdHjDXs2XOgm602S9E7P/UpHgfeHL00cRiIF+IN/G/aUJ7kGPb6yO/ErDI5V2s8iycA==", - "dev": true, - "license": "MIT", - "dependencies": { - "call-bind": "^1.0.2", - "define-properties": "^1.2.0", - "es-abstract": "^1.22.1", - "es-shim-unscopables": "^1.0.0" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/array.prototype.flatmap": { - "version": "1.3.2", - "resolved": "https://registry.npmjs.org/array.prototype.flatmap/-/array.prototype.flatmap-1.3.2.tgz", - "integrity": "sha512-Ewyx0c9PmpcsByhSW4r+9zDU7sGjFc86qf/kKtuSCRdhfbk0SNLLkaT5qvcHnRGgc5NP/ly/y+qkXkqONX54CQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "call-bind": "^1.0.2", - "define-properties": "^1.2.0", - "es-abstract": "^1.22.1", - "es-shim-unscopables": "^1.0.0" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/arraybuffer.prototype.slice": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/arraybuffer.prototype.slice/-/arraybuffer.prototype.slice-1.0.3.tgz", - "integrity": "sha512-bMxMKAjg13EBSVscxTaYA4mRc5t1UAXa2kXiGTNfZ079HIWXEkKmkgFrh/nJqamaLSrXO5H4WFFkPEaLJWbs3A==", - "dev": true, - "license": "MIT", - "dependencies": { - "array-buffer-byte-length": "^1.0.1", - "call-bind": "^1.0.5", - "define-properties": "^1.2.1", - "es-abstract": "^1.22.3", - "es-errors": "^1.2.1", - "get-intrinsic": "^1.2.3", - "is-array-buffer": "^3.0.4", - "is-shared-array-buffer": "^1.0.2" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/ast-types-flow": { - "version": "0.0.8", - "resolved": "https://registry.npmjs.org/ast-types-flow/-/ast-types-flow-0.0.8.tgz", - "integrity": "sha512-OH/2E5Fg20h2aPrbe+QL8JZQFko0YZaF+j4mnQ7BGhfavO7OpSLa8a0y9sBwomHdSbkhTS8TQNayBfnW5DwbvQ==", - "dev": true, - "license": "MIT" - }, - "node_modules/async": { - "version": "2.6.4", - "resolved": "https://registry.npmjs.org/async/-/async-2.6.4.tgz", - "integrity": "sha512-mzo5dfJYwAn29PeiJ0zvwTo04zj8HDJj0Mn8TD7sno7q12prdbnasKJHhkm2c1LgrhlJ0teaea8860oxi51mGA==", - "license": "MIT", - "dependencies": { - "lodash": "^4.17.14" - } - }, - "node_modules/available-typed-arrays": { - "version": "1.0.7", - "resolved": "https://registry.npmjs.org/available-typed-arrays/-/available-typed-arrays-1.0.7.tgz", - "integrity": "sha512-wvUjBtSGN7+7SjNpq/9M2Tg350UZD3q62IFZLbRAR1bSMlCo1ZaeW+BJ+D090e4hIIZLBcTDWe4Mh4jvUDajzQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "possible-typed-array-names": "^1.0.0" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/axe-core": { - "version": "4.10.0", - "resolved": "https://registry.npmjs.org/axe-core/-/axe-core-4.10.0.tgz", - "integrity": "sha512-Mr2ZakwQ7XUAjp7pAwQWRhhK8mQQ6JAaNWSjmjxil0R8BPioMtQsTLOolGYkji1rcL++3dCqZA3zWqpT+9Ew6g==", - "dev": true, - "license": "MPL-2.0", - "engines": { - "node": ">=4" - } - }, - "node_modules/axobject-query": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/axobject-query/-/axobject-query-4.1.0.tgz", - "integrity": "sha512-qIj0G9wZbMGNLjLmg1PT6v2mE9AH2zlnADJD/2tC6E00hgmhUOfEB6greHPAfLRSufHqROIUTkw6E+M3lH0PTQ==", - "dev": true, - "license": "Apache-2.0", - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/babel-jest": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/babel-jest/-/babel-jest-29.7.0.tgz", - "integrity": "sha512-BrvGY3xZSwEcCzKvKsCi2GgHqDqsYkOP4/by5xCgIwGXQxIEh+8ew3gmrE1y7XRR6LHZIj6yLYnUi/mm2KXKBg==", - "dev": true, - "license": "MIT", - "dependencies": { - "@jest/transform": "^29.7.0", - "@types/babel__core": "^7.1.14", - "babel-plugin-istanbul": "^6.1.1", - "babel-preset-jest": "^29.6.3", - "chalk": "^4.0.0", - "graceful-fs": "^4.2.9", - "slash": "^3.0.0" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - }, - "peerDependencies": { - "@babel/core": "^7.8.0" - } - }, - "node_modules/babel-plugin-istanbul": { - "version": "6.1.1", - "resolved": "https://registry.npmjs.org/babel-plugin-istanbul/-/babel-plugin-istanbul-6.1.1.tgz", - "integrity": "sha512-Y1IQok9821cC9onCx5otgFfRm7Lm+I+wwxOx738M/WLPZ9Q42m4IG5W0FNX8WLL2gYMZo3JkuXIH2DOpWM+qwA==", - "dev": true, - "license": "BSD-3-Clause", - "dependencies": { - "@babel/helper-plugin-utils": "^7.0.0", - "@istanbuljs/load-nyc-config": "^1.0.0", - "@istanbuljs/schema": "^0.1.2", - "istanbul-lib-instrument": "^5.0.4", - "test-exclude": "^6.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/babel-plugin-istanbul/node_modules/istanbul-lib-instrument": { - "version": "5.2.1", - "resolved": "https://registry.npmjs.org/istanbul-lib-instrument/-/istanbul-lib-instrument-5.2.1.tgz", - "integrity": "sha512-pzqtp31nLv/XFOzXGuvhCb8qhjmTVo5vjVk19XE4CRlSWz0KoeJ3bw9XsA7nOp9YBf4qHjwBxkDzKcME/J29Yg==", - "dev": true, - "license": "BSD-3-Clause", - "dependencies": { - "@babel/core": "^7.12.3", - "@babel/parser": "^7.14.7", - "@istanbuljs/schema": "^0.1.2", - "istanbul-lib-coverage": "^3.2.0", - "semver": "^6.3.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/babel-plugin-istanbul/node_modules/semver": { - "version": "6.3.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", - "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", - "dev": true, - "license": "ISC", - "bin": { - "semver": "bin/semver.js" - } - }, - "node_modules/babel-plugin-jest-hoist": { - "version": "29.6.3", - "resolved": "https://registry.npmjs.org/babel-plugin-jest-hoist/-/babel-plugin-jest-hoist-29.6.3.tgz", - "integrity": "sha512-ESAc/RJvGTFEzRwOTT4+lNDk/GNHMkKbNzsvT0qKRfDyyYTskxB5rnU2njIDYVxXCBHHEI1c0YwHob3WaYujOg==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/template": "^7.3.3", - "@babel/types": "^7.3.3", - "@types/babel__core": "^7.1.14", - "@types/babel__traverse": "^7.0.6" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, - "node_modules/babel-preset-current-node-syntax": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/babel-preset-current-node-syntax/-/babel-preset-current-node-syntax-1.1.0.tgz", - "integrity": "sha512-ldYss8SbBlWva1bs28q78Ju5Zq1F+8BrqBZZ0VFhLBvhh6lCpC2o3gDJi/5DRLs9FgYZCnmPYIVFU4lRXCkyUw==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/plugin-syntax-async-generators": "^7.8.4", - "@babel/plugin-syntax-bigint": "^7.8.3", - "@babel/plugin-syntax-class-properties": "^7.12.13", - "@babel/plugin-syntax-class-static-block": "^7.14.5", - "@babel/plugin-syntax-import-attributes": "^7.24.7", - "@babel/plugin-syntax-import-meta": "^7.10.4", - "@babel/plugin-syntax-json-strings": "^7.8.3", - "@babel/plugin-syntax-logical-assignment-operators": "^7.10.4", - "@babel/plugin-syntax-nullish-coalescing-operator": "^7.8.3", - "@babel/plugin-syntax-numeric-separator": "^7.10.4", - "@babel/plugin-syntax-object-rest-spread": "^7.8.3", - "@babel/plugin-syntax-optional-catch-binding": "^7.8.3", - "@babel/plugin-syntax-optional-chaining": "^7.8.3", - "@babel/plugin-syntax-private-property-in-object": "^7.14.5", - "@babel/plugin-syntax-top-level-await": "^7.14.5" - }, - "peerDependencies": { - "@babel/core": "^7.0.0" - } - }, - "node_modules/babel-preset-jest": { - "version": "29.6.3", - "resolved": "https://registry.npmjs.org/babel-preset-jest/-/babel-preset-jest-29.6.3.tgz", - "integrity": "sha512-0B3bhxR6snWXJZtR/RliHTDPRgn1sNHOR0yVtq/IiQFyuOVjFS+wuio/R4gSNkyYmKmJB4wGZv2NZanmKmTnNA==", - "dev": true, - "license": "MIT", - "dependencies": { - "babel-plugin-jest-hoist": "^29.6.3", - "babel-preset-current-node-syntax": "^1.0.0" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0" - } - }, - "node_modules/balanced-match": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", - "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==", - "license": "MIT" - }, - "node_modules/before-after-hook": { - "version": "2.2.3", - "resolved": "https://registry.npmjs.org/before-after-hook/-/before-after-hook-2.2.3.tgz", - "integrity": "sha512-NzUnlZexiaH/46WDhANlyR2bXRopNg4F/zuSA3OpZnllCUgRaOF2znDioDWrmbNVsuZk6l9pMquQB38cfBZwkQ==", - "license": "Apache-2.0" - }, - "node_modules/binaryextensions": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/binaryextensions/-/binaryextensions-2.3.0.tgz", - "integrity": "sha512-nAihlQsYGyc5Bwq6+EsubvANYGExeJKHDO3RjnvwU042fawQTQfM3Kxn7IHUXQOz4bzfwsGYYHGSvXyW4zOGLg==", - "license": "MIT", - "engines": { - "node": ">=0.8" - }, - "funding": { - "url": "https://bevry.me/fund" - } - }, - "node_modules/brace-expansion": { - "version": "1.1.11", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", - "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", - "license": "MIT", - "dependencies": { - "balanced-match": "^1.0.0", - "concat-map": "0.0.1" - } - }, - "node_modules/braces": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.3.tgz", - "integrity": "sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA==", - "dev": true, - "license": "MIT", - "dependencies": { - "fill-range": "^7.1.1" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/browserslist": { - "version": "4.24.0", - "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.24.0.tgz", - "integrity": "sha512-Rmb62sR1Zpjql25eSanFGEhAxcFwfA1K0GuQcLoaJBAcENegrQut3hYdhXFF1obQfiDyqIW/cLM5HSJ/9k884A==", - "dev": true, - "funding": [ - { - "type": "opencollective", - "url": "https://opencollective.com/browserslist" - }, - { - "type": "tidelift", - "url": "https://tidelift.com/funding/github/npm/browserslist" - }, - { - "type": "github", - "url": "https://github.com/sponsors/ai" - } - ], - "license": "MIT", - "dependencies": { - "caniuse-lite": "^1.0.30001663", - "electron-to-chromium": "^1.5.28", - "node-releases": "^2.0.18", - "update-browserslist-db": "^1.1.0" - }, - "bin": { - "browserslist": "cli.js" - }, - "engines": { - "node": "^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7" - } - }, - "node_modules/bs-logger": { - "version": "0.2.6", - "resolved": "https://registry.npmjs.org/bs-logger/-/bs-logger-0.2.6.tgz", - "integrity": "sha512-pd8DCoxmbgc7hyPKOvxtqNcjYoOsABPQdcCUjGp3d42VR2CX1ORhk2A87oqqu5R1kk+76nsxZupkmyd+MVtCog==", - "dev": true, - "license": "MIT", - "dependencies": { - "fast-json-stable-stringify": "2.x" - }, - "engines": { - "node": ">= 6" - } - }, - "node_modules/bser": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/bser/-/bser-2.1.1.tgz", - "integrity": "sha512-gQxTNE/GAfIIrmHLUE3oJyp5FO6HRBfhjnw4/wMmA63ZGDJnWBmgY/lyQBpnDUkGmAhbSe39tx2d/iTOAfglwQ==", - "dev": true, - "license": "Apache-2.0", - "dependencies": { - "node-int64": "^0.4.0" - } - }, - "node_modules/buffer-from": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.2.tgz", - "integrity": "sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==", - "dev": true, - "license": "MIT" - }, - "node_modules/call-bind": { - "version": "1.0.7", - "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.7.tgz", - "integrity": "sha512-GHTSNSYICQ7scH7sZ+M2rFopRoLh8t2bLSW6BbgrtLsahOIB5iyAVJf9GjWK3cYTDaMj4XdBpM1cA6pIS0Kv2w==", - "dev": true, - "license": "MIT", - "dependencies": { - "es-define-property": "^1.0.0", - "es-errors": "^1.3.0", - "function-bind": "^1.1.2", - "get-intrinsic": "^1.2.4", - "set-function-length": "^1.2.1" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/callsites": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz", - "integrity": "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=6" - } - }, - "node_modules/camelcase": { - "version": "5.3.1", - "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-5.3.1.tgz", - "integrity": "sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=6" - } - }, - "node_modules/caniuse-lite": { - "version": "1.0.30001666", - "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001666.tgz", - "integrity": "sha512-gD14ICmoV5ZZM1OdzPWmpx+q4GyefaK06zi8hmfHV5xe4/2nOQX3+Dw5o+fSqOws2xVwL9j+anOPFwHzdEdV4g==", - "dev": true, - "funding": [ - { - "type": "opencollective", - "url": "https://opencollective.com/browserslist" - }, - { - "type": "tidelift", - "url": "https://tidelift.com/funding/github/npm/caniuse-lite" - }, - { - "type": "github", - "url": "https://github.com/sponsors/ai" - } - ], - "license": "CC-BY-4.0" - }, - "node_modules/chalk": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", - "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", - "dev": true, - "license": "MIT", - "dependencies": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/chalk?sponsor=1" - } - }, - "node_modules/char-regex": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/char-regex/-/char-regex-1.0.2.tgz", - "integrity": "sha512-kWWXztvZ5SBQV+eRgKFeh8q5sLuZY2+8WUIzlxWVTg+oGwY14qylx1KbKzHd8P6ZYkAg0xyIDU9JMHhyJMZ1jw==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=10" - } - }, - "node_modules/ci-info": { - "version": "3.9.0", - "resolved": "https://registry.npmjs.org/ci-info/-/ci-info-3.9.0.tgz", - "integrity": "sha512-NIxF55hv4nSqQswkAeiOi1r83xy8JldOFDTWiug55KBu9Jnblncd2U6ViHmYgHf01TPZS77NJBhBMKdWj9HQMQ==", - "dev": true, - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/sibiraj-s" - } - ], - "license": "MIT", - "engines": { - "node": ">=8" - } - }, - "node_modules/cjs-module-lexer": { - "version": "1.4.1", - "resolved": "https://registry.npmjs.org/cjs-module-lexer/-/cjs-module-lexer-1.4.1.tgz", - "integrity": "sha512-cuSVIHi9/9E/+821Qjdvngor+xpnlwnuwIyZOaLmHBVdXL+gP+I6QQB9VkO7RI77YIcTV+S1W9AreJ5eN63JBA==", - "dev": true, - "license": "MIT" - }, - "node_modules/cliui": { - "version": "8.0.1", - "resolved": "https://registry.npmjs.org/cliui/-/cliui-8.0.1.tgz", - "integrity": "sha512-BSeNnyus75C4//NQ9gQt1/csTXyo/8Sb+afLAkzAptFuMsod9HFokGNudZpi/oQV73hnVK+sR+5PVRMd+Dr7YQ==", - "dev": true, - "license": "ISC", - "dependencies": { - "string-width": "^4.2.0", - "strip-ansi": "^6.0.1", - "wrap-ansi": "^7.0.0" - }, - "engines": { - "node": ">=12" - } - }, - "node_modules/co": { - "version": "4.6.0", - "resolved": "https://registry.npmjs.org/co/-/co-4.6.0.tgz", - "integrity": "sha512-QVb0dM5HvG+uaxitm8wONl7jltx8dqhfU33DcqtOZcLSVIKSDDLDi7+0LbAKiyI8hD9u42m2YxXSkMGWThaecQ==", - "dev": true, - "license": "MIT", - "engines": { - "iojs": ">= 1.0.0", - "node": ">= 0.12.0" - } - }, - "node_modules/collect-v8-coverage": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/collect-v8-coverage/-/collect-v8-coverage-1.0.2.tgz", - "integrity": "sha512-lHl4d5/ONEbLlJvaJNtsF/Lz+WvB07u2ycqTYbdrq7UypDXailES4valYb2eWiJFxZlVmpGekfqoxQhzyFdT4Q==", - "dev": true, - "license": "MIT" - }, - "node_modules/color-convert": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "color-name": "~1.1.4" - }, - "engines": { - "node": ">=7.0.0" - } - }, - "node_modules/color-name": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", - "dev": true, - "license": "MIT" - }, - "node_modules/concat-map": { - "version": "0.0.1", - "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", - "integrity": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==", - "license": "MIT" - }, - "node_modules/convert-source-map": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-2.0.0.tgz", - "integrity": "sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg==", - "dev": true, - "license": "MIT" - }, - "node_modules/create-jest": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/create-jest/-/create-jest-29.7.0.tgz", - "integrity": "sha512-Adz2bdH0Vq3F53KEMJOoftQFutWCukm6J24wbPWRO4k1kMY7gS7ds/uoJkNuV8wDCtWWnuwGcJwpWcih+zEW1Q==", - "dev": true, - "license": "MIT", - "dependencies": { - "@jest/types": "^29.6.3", - "chalk": "^4.0.0", - "exit": "^0.1.2", - "graceful-fs": "^4.2.9", - "jest-config": "^29.7.0", - "jest-util": "^29.7.0", - "prompts": "^2.0.1" - }, - "bin": { - "create-jest": "bin/create-jest.js" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, - "node_modules/cross-spawn": { - "version": "7.0.3", - "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.3.tgz", - "integrity": "sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==", - "dev": true, - "license": "MIT", - "dependencies": { - "path-key": "^3.1.0", - "shebang-command": "^2.0.0", - "which": "^2.0.1" - }, - "engines": { - "node": ">= 8" - } - }, - "node_modules/damerau-levenshtein": { - "version": "1.0.8", - "resolved": "https://registry.npmjs.org/damerau-levenshtein/-/damerau-levenshtein-1.0.8.tgz", - "integrity": "sha512-sdQSFB7+llfUcQHUQO3+B8ERRj0Oa4w9POWMI/puGtuf7gFywGmkaLCElnudfTiKZV+NvHqL0ifzdrI8Ro7ESA==", - "dev": true, - "license": "BSD-2-Clause" - }, - "node_modules/data-view-buffer": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/data-view-buffer/-/data-view-buffer-1.0.1.tgz", - "integrity": "sha512-0lht7OugA5x3iJLOWFhWK/5ehONdprk0ISXqVFn/NFrDu+cuc8iADFrGQz5BnRK7LLU3JmkbXSxaqX+/mXYtUA==", - "dev": true, - "license": "MIT", - "dependencies": { - "call-bind": "^1.0.6", - "es-errors": "^1.3.0", - "is-data-view": "^1.0.1" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/data-view-byte-length": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/data-view-byte-length/-/data-view-byte-length-1.0.1.tgz", - "integrity": "sha512-4J7wRJD3ABAzr8wP+OcIcqq2dlUKp4DVflx++hs5h5ZKydWMI6/D/fAot+yh6g2tHh8fLFTvNOaVN357NvSrOQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "call-bind": "^1.0.7", - "es-errors": "^1.3.0", - "is-data-view": "^1.0.1" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/data-view-byte-offset": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/data-view-byte-offset/-/data-view-byte-offset-1.0.0.tgz", - "integrity": "sha512-t/Ygsytq+R995EJ5PZlD4Cu56sWa8InXySaViRzw9apusqsOO2bQP+SbYzAhR0pFKoB+43lYy8rWban9JSuXnA==", - "dev": true, - "license": "MIT", - "dependencies": { - "call-bind": "^1.0.6", - "es-errors": "^1.3.0", - "is-data-view": "^1.0.1" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/debug": { - "version": "4.3.7", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.7.tgz", - "integrity": "sha512-Er2nc/H7RrMXZBFCEim6TCmMk02Z8vLC2Rbi1KEBggpo0fS6l0S1nnapwmIi3yW/+GOJap1Krg4w0Hg80oCqgQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "ms": "^2.1.3" - }, - "engines": { - "node": ">=6.0" - }, - "peerDependenciesMeta": { - "supports-color": { - "optional": true - } - } - }, - "node_modules/dedent": { - "version": "1.5.3", - "resolved": "https://registry.npmjs.org/dedent/-/dedent-1.5.3.tgz", - "integrity": "sha512-NHQtfOOW68WD8lgypbLA5oT+Bt0xXJhiYvoR6SmmNXZfpzOGXwdKWmcwG8N7PwVVWV3eF/68nmD9BaJSsTBhyQ==", - "dev": true, - "license": "MIT", - "peerDependencies": { - "babel-plugin-macros": "^3.1.0" - }, - "peerDependenciesMeta": { - "babel-plugin-macros": { - "optional": true - } - } - }, - "node_modules/deep-equal": { - "version": "2.2.3", - "resolved": "https://registry.npmjs.org/deep-equal/-/deep-equal-2.2.3.tgz", - "integrity": "sha512-ZIwpnevOurS8bpT4192sqAowWM76JDKSHYzMLty3BZGSswgq6pBaH3DhCSW5xVAZICZyKdOBPjwww5wfgT/6PA==", - "dev": true, - "license": "MIT", - "dependencies": { - "array-buffer-byte-length": "^1.0.0", - "call-bind": "^1.0.5", - "es-get-iterator": "^1.1.3", - "get-intrinsic": "^1.2.2", - "is-arguments": "^1.1.1", - "is-array-buffer": "^3.0.2", - "is-date-object": "^1.0.5", - "is-regex": "^1.1.4", - "is-shared-array-buffer": "^1.0.2", - "isarray": "^2.0.5", - "object-is": "^1.1.5", - "object-keys": "^1.1.1", - "object.assign": "^4.1.4", - "regexp.prototype.flags": "^1.5.1", - "side-channel": "^1.0.4", - "which-boxed-primitive": "^1.0.2", - "which-collection": "^1.0.1", - "which-typed-array": "^1.1.13" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/deep-is": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/deep-is/-/deep-is-0.1.4.tgz", - "integrity": "sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==", - "dev": true, - "license": "MIT" - }, - "node_modules/deepmerge": { - "version": "4.3.1", - "resolved": "https://registry.npmjs.org/deepmerge/-/deepmerge-4.3.1.tgz", - "integrity": "sha512-3sUqbMEc77XqpdNO7FRyRog+eW3ph+GYCbj+rK+uYyRMuwsVy0rMiVtPn+QJlKFvWP/1PYpapqYn0Me2knFn+A==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/define-data-property": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/define-data-property/-/define-data-property-1.1.4.tgz", - "integrity": "sha512-rBMvIzlpA8v6E+SJZoo++HAYqsLrkg7MSfIinMPFhmkorw7X+dOXVJQs+QT69zGkzMyfDnIMN2Wid1+NbL3T+A==", - "dev": true, - "license": "MIT", - "dependencies": { - "es-define-property": "^1.0.0", - "es-errors": "^1.3.0", - "gopd": "^1.0.1" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/define-properties": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/define-properties/-/define-properties-1.2.1.tgz", - "integrity": "sha512-8QmQKqEASLd5nx0U1B1okLElbUuuttJ/AnYmRXbbbGDWh6uS208EjD4Xqq/I9wK7u0v6O08XhTWnt5XtEbR6Dg==", - "dev": true, - "license": "MIT", - "dependencies": { - "define-data-property": "^1.0.1", - "has-property-descriptors": "^1.0.0", - "object-keys": "^1.1.1" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/deprecation": { - "version": "2.3.1", - "resolved": "https://registry.npmjs.org/deprecation/-/deprecation-2.3.1.tgz", - "integrity": "sha512-xmHIy4F3scKVwMsQ4WnVaS8bHOx0DmVwRywosKhaILI0ywMDWPtBSku2HNxRvF7jtwDRsoEwYQSfbxj8b7RlJQ==", - "license": "ISC" - }, - "node_modules/detect-newline": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/detect-newline/-/detect-newline-3.1.0.tgz", - "integrity": "sha512-TLz+x/vEXm/Y7P7wn1EJFNLxYpUD4TgMosxY6fAVJUnJMbupHBOncxyWUG9OpTaH9EBD7uFI5LfEgmMOc54DsA==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=8" - } - }, - "node_modules/diff-sequences": { - "version": "29.6.3", - "resolved": "https://registry.npmjs.org/diff-sequences/-/diff-sequences-29.6.3.tgz", - "integrity": "sha512-EjePK1srD3P08o2j4f0ExnylqRs5B9tJjcp9t1krH2qRi8CCdsYfwe9JgSLurFBWwq4uOlipzfk5fHNvwFKr8Q==", - "dev": true, - "license": "MIT", - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, - "node_modules/dir-glob": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/dir-glob/-/dir-glob-3.0.1.tgz", - "integrity": "sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA==", - "dev": true, - "license": "MIT", - "dependencies": { - "path-type": "^4.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/doctrine": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-3.0.0.tgz", - "integrity": "sha512-yS+Q5i3hBf7GBkd4KG8a7eBNNWNGLTaEwwYWUijIYM7zrlYDM0BFXHjjPWlWZ1Rg7UaddZeIDmi9jF3HmqiQ2w==", - "dev": true, - "license": "Apache-2.0", - "dependencies": { - "esutils": "^2.0.2" - }, - "engines": { - "node": ">=6.0.0" - } - }, - "node_modules/editions": { - "version": "2.3.1", - "resolved": "https://registry.npmjs.org/editions/-/editions-2.3.1.tgz", - "integrity": "sha512-ptGvkwTvGdGfC0hfhKg0MT+TRLRKGtUiWGBInxOm5pz7ssADezahjCUaYuZ8Dr+C05FW0AECIIPt4WBxVINEhA==", - "license": "MIT", - "dependencies": { - "errlop": "^2.0.0", - "semver": "^6.3.0" - }, - "engines": { - "node": ">=0.8" - }, - "funding": { - "url": "https://bevry.me/fund" - } - }, - "node_modules/editions/node_modules/semver": { - "version": "6.3.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", - "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", - "license": "ISC", - "bin": { - "semver": "bin/semver.js" - } - }, - "node_modules/ejs": { - "version": "3.1.10", - "resolved": "https://registry.npmjs.org/ejs/-/ejs-3.1.10.tgz", - "integrity": "sha512-UeJmFfOrAQS8OJWPZ4qtgHyWExa088/MtK5UEyoJGFH67cDEXkZSviOiKRCZ4Xij0zxI3JECgYs3oKx+AizQBA==", - "dev": true, - "license": "Apache-2.0", - "dependencies": { - "jake": "^10.8.5" - }, - "bin": { - "ejs": "bin/cli.js" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/electron-to-chromium": { - "version": "1.5.32", - "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.5.32.tgz", - "integrity": "sha512-M+7ph0VGBQqqpTT2YrabjNKSQ2fEl9PVx6AK3N558gDH9NO8O6XN9SXXFWRo9u9PbEg/bWq+tjXQr+eXmxubCw==", - "dev": true, - "license": "ISC" - }, - "node_modules/emittery": { - "version": "0.13.1", - "resolved": "https://registry.npmjs.org/emittery/-/emittery-0.13.1.tgz", - "integrity": "sha512-DeWwawk6r5yR9jFgnDKYt4sLS0LmHJJi3ZOnb5/JdbYwj3nW+FxQnHIjhBKz8YLC7oRNPVM9NQ47I3CVx34eqQ==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sindresorhus/emittery?sponsor=1" - } - }, - "node_modules/emoji-regex": { - "version": "9.2.2", - "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-9.2.2.tgz", - "integrity": "sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg==", - "dev": true, - "license": "MIT" - }, - "node_modules/errlop": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/errlop/-/errlop-2.2.0.tgz", - "integrity": "sha512-e64Qj9+4aZzjzzFpZC7p5kmm/ccCrbLhAJplhsDXQFs87XTsXwOpH4s1Io2s90Tau/8r2j9f4l/thhDevRjzxw==", - "license": "MIT", - "engines": { - "node": ">=0.8" - }, - "funding": { - "url": "https://bevry.me/fund" - } - }, - "node_modules/error-ex": { - "version": "1.3.2", - "resolved": "https://registry.npmjs.org/error-ex/-/error-ex-1.3.2.tgz", - "integrity": "sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g==", - "dev": true, - "license": "MIT", - "dependencies": { - "is-arrayish": "^0.2.1" - } - }, - "node_modules/es-abstract": { - "version": "1.23.3", - "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.23.3.tgz", - "integrity": "sha512-e+HfNH61Bj1X9/jLc5v1owaLYuHdeHHSQlkhCBiTK8rBvKaULl/beGMxwrMXjpYrv4pz22BlY570vVePA2ho4A==", - "dev": true, - "license": "MIT", - "dependencies": { - "array-buffer-byte-length": "^1.0.1", - "arraybuffer.prototype.slice": "^1.0.3", - "available-typed-arrays": "^1.0.7", - "call-bind": "^1.0.7", - "data-view-buffer": "^1.0.1", - "data-view-byte-length": "^1.0.1", - "data-view-byte-offset": "^1.0.0", - "es-define-property": "^1.0.0", - "es-errors": "^1.3.0", - "es-object-atoms": "^1.0.0", - "es-set-tostringtag": "^2.0.3", - "es-to-primitive": "^1.2.1", - "function.prototype.name": "^1.1.6", - "get-intrinsic": "^1.2.4", - "get-symbol-description": "^1.0.2", - "globalthis": "^1.0.3", - "gopd": "^1.0.1", - "has-property-descriptors": "^1.0.2", - "has-proto": "^1.0.3", - "has-symbols": "^1.0.3", - "hasown": "^2.0.2", - "internal-slot": "^1.0.7", - "is-array-buffer": "^3.0.4", - "is-callable": "^1.2.7", - "is-data-view": "^1.0.1", - "is-negative-zero": "^2.0.3", - "is-regex": "^1.1.4", - "is-shared-array-buffer": "^1.0.3", - "is-string": "^1.0.7", - "is-typed-array": "^1.1.13", - "is-weakref": "^1.0.2", - "object-inspect": "^1.13.1", - "object-keys": "^1.1.1", - "object.assign": "^4.1.5", - "regexp.prototype.flags": "^1.5.2", - "safe-array-concat": "^1.1.2", - "safe-regex-test": "^1.0.3", - "string.prototype.trim": "^1.2.9", - "string.prototype.trimend": "^1.0.8", - "string.prototype.trimstart": "^1.0.8", - "typed-array-buffer": "^1.0.2", - "typed-array-byte-length": "^1.0.1", - "typed-array-byte-offset": "^1.0.2", - "typed-array-length": "^1.0.6", - "unbox-primitive": "^1.0.2", - "which-typed-array": "^1.1.15" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/es-define-property": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/es-define-property/-/es-define-property-1.0.0.tgz", - "integrity": "sha512-jxayLKShrEqqzJ0eumQbVhTYQM27CfT1T35+gCgDFoL82JLsXqTJ76zv6A0YLOgEnLUMvLzsDsGIrl8NFpT2gQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "get-intrinsic": "^1.2.4" - }, - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/es-errors": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/es-errors/-/es-errors-1.3.0.tgz", - "integrity": "sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/es-get-iterator": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/es-get-iterator/-/es-get-iterator-1.1.3.tgz", - "integrity": "sha512-sPZmqHBe6JIiTfN5q2pEi//TwxmAFHwj/XEuYjTuse78i8KxaqMTTzxPoFKuzRpDpTJ+0NAbpfenkmH2rePtuw==", - "dev": true, - "license": "MIT", - "dependencies": { - "call-bind": "^1.0.2", - "get-intrinsic": "^1.1.3", - "has-symbols": "^1.0.3", - "is-arguments": "^1.1.1", - "is-map": "^2.0.2", - "is-set": "^2.0.2", - "is-string": "^1.0.7", - "isarray": "^2.0.5", - "stop-iteration-iterator": "^1.0.0" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/es-iterator-helpers": { - "version": "1.0.19", - "resolved": "https://registry.npmjs.org/es-iterator-helpers/-/es-iterator-helpers-1.0.19.tgz", - "integrity": "sha512-zoMwbCcH5hwUkKJkT8kDIBZSz9I6mVG//+lDCinLCGov4+r7NIy0ld8o03M0cJxl2spVf6ESYVS6/gpIfq1FFw==", - "dev": true, - "license": "MIT", - "dependencies": { - "call-bind": "^1.0.7", - "define-properties": "^1.2.1", - "es-abstract": "^1.23.3", - "es-errors": "^1.3.0", - "es-set-tostringtag": "^2.0.3", - "function-bind": "^1.1.2", - "get-intrinsic": "^1.2.4", - "globalthis": "^1.0.3", - "has-property-descriptors": "^1.0.2", - "has-proto": "^1.0.3", - "has-symbols": "^1.0.3", - "internal-slot": "^1.0.7", - "iterator.prototype": "^1.1.2", - "safe-array-concat": "^1.1.2" - }, - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/es-object-atoms": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/es-object-atoms/-/es-object-atoms-1.0.0.tgz", - "integrity": "sha512-MZ4iQ6JwHOBQjahnjwaC1ZtIBH+2ohjamzAO3oaHcXYup7qxjF2fixyH+Q71voWHeOkI2q/TnJao/KfXYIZWbw==", - "dev": true, - "license": "MIT", - "dependencies": { - "es-errors": "^1.3.0" - }, - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/es-set-tostringtag": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/es-set-tostringtag/-/es-set-tostringtag-2.0.3.tgz", - "integrity": "sha512-3T8uNMC3OQTHkFUsFq8r/BwAXLHvU/9O9mE0fBc/MY5iq/8H7ncvO947LmYA6ldWw9Uh8Yhf25zu6n7nML5QWQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "get-intrinsic": "^1.2.4", - "has-tostringtag": "^1.0.2", - "hasown": "^2.0.1" - }, - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/es-shim-unscopables": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/es-shim-unscopables/-/es-shim-unscopables-1.0.2.tgz", - "integrity": "sha512-J3yBRXCzDu4ULnQwxyToo/OjdMx6akgVC7K6few0a7F/0wLtmKKN7I73AH5T2836UuXRqN7Qg+IIUw/+YJksRw==", - "dev": true, - "license": "MIT", - "dependencies": { - "hasown": "^2.0.0" - } - }, - "node_modules/es-to-primitive": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/es-to-primitive/-/es-to-primitive-1.2.1.tgz", - "integrity": "sha512-QCOllgZJtaUo9miYBcLChTUaHNjJF3PYs1VidD7AwiEj1kYxKeQTctLAezAOH5ZKRH0g2IgPn6KwB4IT8iRpvA==", - "dev": true, - "license": "MIT", - "dependencies": { - "is-callable": "^1.1.4", - "is-date-object": "^1.0.1", - "is-symbol": "^1.0.2" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/escalade": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.2.0.tgz", - "integrity": "sha512-WUj2qlxaQtO4g6Pq5c29GTcWGDyd8itL8zTlipgECz3JesAiiOKotd8JU6otB3PACgG6xkJUyVhboMS+bje/jA==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=6" - } - }, - "node_modules/escape-string-regexp": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz", - "integrity": "sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/eslint": { - "version": "8.57.1", - "resolved": "https://registry.npmjs.org/eslint/-/eslint-8.57.1.tgz", - "integrity": "sha512-ypowyDxpVSYpkXr9WPv2PAZCtNip1Mv5KTW0SCurXv/9iOpcrH9PaqUElksqEB6pChqHGDRCFTyrZlGhnLNGiA==", - "dev": true, - "license": "MIT", - "dependencies": { - "@eslint-community/eslint-utils": "^4.2.0", - "@eslint-community/regexpp": "^4.6.1", - "@eslint/eslintrc": "^2.1.4", - "@eslint/js": "8.57.1", - "@humanwhocodes/config-array": "^0.13.0", - "@humanwhocodes/module-importer": "^1.0.1", - "@nodelib/fs.walk": "^1.2.8", - "@ungap/structured-clone": "^1.2.0", - "ajv": "^6.12.4", - "chalk": "^4.0.0", - "cross-spawn": "^7.0.2", - "debug": "^4.3.2", - "doctrine": "^3.0.0", - "escape-string-regexp": "^4.0.0", - "eslint-scope": "^7.2.2", - "eslint-visitor-keys": "^3.4.3", - "espree": "^9.6.1", - "esquery": "^1.4.2", - "esutils": "^2.0.2", - "fast-deep-equal": "^3.1.3", - "file-entry-cache": "^6.0.1", - "find-up": "^5.0.0", - "glob-parent": "^6.0.2", - "globals": "^13.19.0", - "graphemer": "^1.4.0", - "ignore": "^5.2.0", - "imurmurhash": "^0.1.4", - "is-glob": "^4.0.0", - "is-path-inside": "^3.0.3", - "js-yaml": "^4.1.0", - "json-stable-stringify-without-jsonify": "^1.0.1", - "levn": "^0.4.1", - "lodash.merge": "^4.6.2", - "minimatch": "^3.1.2", - "natural-compare": "^1.4.0", - "optionator": "^0.9.3", - "strip-ansi": "^6.0.1", - "text-table": "^0.2.0" - }, - "bin": { - "eslint": "bin/eslint.js" - }, - "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" - }, - "funding": { - "url": "https://opencollective.com/eslint" - } - }, - "node_modules/eslint-config-prettier": { - "version": "9.1.0", - "resolved": "https://registry.npmjs.org/eslint-config-prettier/-/eslint-config-prettier-9.1.0.tgz", - "integrity": "sha512-NSWl5BFQWEPi1j4TjVNItzYV7dZXZ+wP6I6ZhrBGpChQhZRUaElihE9uRRkcbRnNb76UMKDF3r+WTmNcGPKsqw==", - "dev": true, - "license": "MIT", - "bin": { - "eslint-config-prettier": "bin/cli.js" - }, - "peerDependencies": { - "eslint": ">=7.0.0" - } - }, - "node_modules/eslint-import-resolver-node": { - "version": "0.3.9", - "resolved": "https://registry.npmjs.org/eslint-import-resolver-node/-/eslint-import-resolver-node-0.3.9.tgz", - "integrity": "sha512-WFj2isz22JahUv+B788TlO3N6zL3nNJGU8CcZbPZvVEkBPaJdCV4vy5wyghty5ROFbCRnm132v8BScu5/1BQ8g==", - "dev": true, - "license": "MIT", - "dependencies": { - "debug": "^3.2.7", - "is-core-module": "^2.13.0", - "resolve": "^1.22.4" - } - }, - "node_modules/eslint-import-resolver-node/node_modules/debug": { - "version": "3.2.7", - "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz", - "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "ms": "^2.1.1" - } - }, - "node_modules/eslint-module-utils": { - "version": "2.12.0", - "resolved": "https://registry.npmjs.org/eslint-module-utils/-/eslint-module-utils-2.12.0.tgz", - "integrity": "sha512-wALZ0HFoytlyh/1+4wuZ9FJCD/leWHQzzrxJ8+rebyReSLk7LApMyd3WJaLVoN+D5+WIdJyDK1c6JnE65V4Zyg==", - "dev": true, - "license": "MIT", - "dependencies": { - "debug": "^3.2.7" - }, - "engines": { - "node": ">=4" - }, - "peerDependenciesMeta": { - "eslint": { - "optional": true - } - } - }, - "node_modules/eslint-module-utils/node_modules/debug": { - "version": "3.2.7", - "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz", - "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "ms": "^2.1.1" - } - }, - "node_modules/eslint-plugin-escompat": { - "version": "3.11.3", - "resolved": "https://registry.npmjs.org/eslint-plugin-escompat/-/eslint-plugin-escompat-3.11.3.tgz", - "integrity": "sha512-Gz/eTJzl7fK9SPBkvB3t+xc1iribxRc5Fgu6Z7206b5q1d7kG0t8Drtin8MRY4UgGBg8Zu1HG6RGzR35LCUpLA==", - "dev": true, - "license": "MIT", - "dependencies": { - "browserslist": "^4.23.1" - }, - "peerDependencies": { - "eslint": ">=5.14.1" - } - }, - "node_modules/eslint-plugin-eslint-comments": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/eslint-plugin-eslint-comments/-/eslint-plugin-eslint-comments-3.2.0.tgz", - "integrity": "sha512-0jkOl0hfojIHHmEHgmNdqv4fmh7300NdpA9FFpF7zaoLvB/QeXOGNLIo86oAveJFrfB1p05kC8hpEMHM8DwWVQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "escape-string-regexp": "^1.0.5", - "ignore": "^5.0.5" - }, - "engines": { - "node": ">=6.5.0" - }, - "funding": { - "url": "https://github.com/sponsors/mysticatea" - }, - "peerDependencies": { - "eslint": ">=4.19.1" - } - }, - "node_modules/eslint-plugin-eslint-comments/node_modules/escape-string-regexp": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", - "integrity": "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=0.8.0" - } - }, - "node_modules/eslint-plugin-filenames": { - "version": "1.3.2", - "resolved": "https://registry.npmjs.org/eslint-plugin-filenames/-/eslint-plugin-filenames-1.3.2.tgz", - "integrity": "sha512-tqxJTiEM5a0JmRCUYQmxw23vtTxrb2+a3Q2mMOPhFxvt7ZQQJmdiuMby9B/vUAuVMghyP7oET+nIf6EO6CBd/w==", - "dev": true, - "license": "MIT", - "dependencies": { - "lodash.camelcase": "4.3.0", - "lodash.kebabcase": "4.1.1", - "lodash.snakecase": "4.1.1", - "lodash.upperfirst": "4.3.1" - }, - "peerDependencies": { - "eslint": "*" - } - }, - "node_modules/eslint-plugin-github": { - "version": "5.0.2", - "resolved": "https://registry.npmjs.org/eslint-plugin-github/-/eslint-plugin-github-5.0.2.tgz", - "integrity": "sha512-nMdzWJQ5CimjQDY6SFeJ0KIXuNFf0dgDWEd4eP3UWfuTuP/dXcZJDg7MQRvAFt743T1zUi4+/HdOihfu8xJkLA==", - "dev": true, - "license": "MIT", - "dependencies": { - "@github/browserslist-config": "^1.0.0", - "@typescript-eslint/eslint-plugin": "^8.0.0", - "@typescript-eslint/parser": "^8.0.0", - "aria-query": "^5.3.0", - "eslint-config-prettier": ">=8.0.0", - "eslint-plugin-escompat": "^3.3.3", - "eslint-plugin-eslint-comments": "^3.2.0", - "eslint-plugin-filenames": "^1.3.2", - "eslint-plugin-i18n-text": "^1.0.1", - "eslint-plugin-import": "^2.25.2", - "eslint-plugin-jsx-a11y": "^6.7.1", - "eslint-plugin-no-only-tests": "^3.0.0", - "eslint-plugin-prettier": "^5.0.0", - "eslint-rule-documentation": ">=1.0.0", - "jsx-ast-utils": "^3.3.2", - "prettier": "^3.0.0", - "svg-element-attributes": "^1.3.1" - }, - "bin": { - "eslint-ignore-errors": "bin/eslint-ignore-errors.js" - }, - "peerDependencies": { - "eslint": "^8.0.1" - } - }, - "node_modules/eslint-plugin-github/node_modules/@typescript-eslint/eslint-plugin": { - "version": "8.8.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-8.8.0.tgz", - "integrity": "sha512-wORFWjU30B2WJ/aXBfOm1LX9v9nyt9D3jsSOxC3cCaTQGCW5k4jNpmjFv3U7p/7s4yvdjHzwtv2Sd2dOyhjS0A==", - "dev": true, - "license": "MIT", - "dependencies": { - "@eslint-community/regexpp": "^4.10.0", - "@typescript-eslint/scope-manager": "8.8.0", - "@typescript-eslint/type-utils": "8.8.0", - "@typescript-eslint/utils": "8.8.0", - "@typescript-eslint/visitor-keys": "8.8.0", - "graphemer": "^1.4.0", - "ignore": "^5.3.1", - "natural-compare": "^1.4.0", - "ts-api-utils": "^1.3.0" - }, - "engines": { - "node": "^18.18.0 || ^20.9.0 || >=21.1.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - }, - "peerDependencies": { - "@typescript-eslint/parser": "^8.0.0 || ^8.0.0-alpha.0", - "eslint": "^8.57.0 || ^9.0.0" - }, - "peerDependenciesMeta": { - "typescript": { - "optional": true - } - } - }, - "node_modules/eslint-plugin-github/node_modules/@typescript-eslint/parser": { - "version": "8.8.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-8.8.0.tgz", - "integrity": "sha512-uEFUsgR+tl8GmzmLjRqz+VrDv4eoaMqMXW7ruXfgThaAShO9JTciKpEsB+TvnfFfbg5IpujgMXVV36gOJRLtZg==", - "dev": true, - "license": "BSD-2-Clause", - "dependencies": { - "@typescript-eslint/scope-manager": "8.8.0", - "@typescript-eslint/types": "8.8.0", - "@typescript-eslint/typescript-estree": "8.8.0", - "@typescript-eslint/visitor-keys": "8.8.0", - "debug": "^4.3.4" - }, - "engines": { - "node": "^18.18.0 || ^20.9.0 || >=21.1.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - }, - "peerDependencies": { - "eslint": "^8.57.0 || ^9.0.0" - }, - "peerDependenciesMeta": { - "typescript": { - "optional": true - } - } - }, - "node_modules/eslint-plugin-github/node_modules/@typescript-eslint/scope-manager": { - "version": "8.8.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-8.8.0.tgz", - "integrity": "sha512-EL8eaGC6gx3jDd8GwEFEV091210U97J0jeEHrAYvIYosmEGet4wJ+g0SYmLu+oRiAwbSA5AVrt6DxLHfdd+bUg==", - "dev": true, - "license": "MIT", - "dependencies": { - "@typescript-eslint/types": "8.8.0", - "@typescript-eslint/visitor-keys": "8.8.0" - }, - "engines": { - "node": "^18.18.0 || ^20.9.0 || >=21.1.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - } - }, - "node_modules/eslint-plugin-github/node_modules/@typescript-eslint/types": { - "version": "8.8.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-8.8.0.tgz", - "integrity": "sha512-QJwc50hRCgBd/k12sTykOJbESe1RrzmX6COk8Y525C9l7oweZ+1lw9JiU56im7Amm8swlz00DRIlxMYLizr2Vw==", - "dev": true, - "license": "MIT", - "engines": { - "node": "^18.18.0 || ^20.9.0 || >=21.1.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - } - }, - "node_modules/eslint-plugin-github/node_modules/@typescript-eslint/typescript-estree": { - "version": "8.8.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-8.8.0.tgz", - "integrity": "sha512-ZaMJwc/0ckLz5DaAZ+pNLmHv8AMVGtfWxZe/x2JVEkD5LnmhWiQMMcYT7IY7gkdJuzJ9P14fRy28lUrlDSWYdw==", - "dev": true, - "license": "BSD-2-Clause", - "dependencies": { - "@typescript-eslint/types": "8.8.0", - "@typescript-eslint/visitor-keys": "8.8.0", - "debug": "^4.3.4", - "fast-glob": "^3.3.2", - "is-glob": "^4.0.3", - "minimatch": "^9.0.4", - "semver": "^7.6.0", - "ts-api-utils": "^1.3.0" - }, - "engines": { - "node": "^18.18.0 || ^20.9.0 || >=21.1.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - }, - "peerDependenciesMeta": { - "typescript": { - "optional": true - } - } - }, - "node_modules/eslint-plugin-github/node_modules/@typescript-eslint/visitor-keys": { - "version": "8.8.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-8.8.0.tgz", - "integrity": "sha512-8mq51Lx6Hpmd7HnA2fcHQo3YgfX1qbccxQOgZcb4tvasu//zXRaA1j5ZRFeCw/VRAdFi4mRM9DnZw0Nu0Q2d1g==", - "dev": true, - "license": "MIT", - "dependencies": { - "@typescript-eslint/types": "8.8.0", - "eslint-visitor-keys": "^3.4.3" - }, - "engines": { - "node": "^18.18.0 || ^20.9.0 || >=21.1.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - } - }, - "node_modules/eslint-plugin-github/node_modules/brace-expansion": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz", - "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==", - "dev": true, - "license": "MIT", - "dependencies": { - "balanced-match": "^1.0.0" - } - }, - "node_modules/eslint-plugin-github/node_modules/minimatch": { - "version": "9.0.5", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.5.tgz", - "integrity": "sha512-G6T0ZX48xgozx7587koeX9Ys2NYy6Gmv//P89sEte9V9whIapMNF4idKxnW2QtCcLiTWlb/wfCabAtAFWhhBow==", - "dev": true, - "license": "ISC", - "dependencies": { - "brace-expansion": "^2.0.1" - }, - "engines": { - "node": ">=16 || 14 >=14.17" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "node_modules/eslint-plugin-i18n-text": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/eslint-plugin-i18n-text/-/eslint-plugin-i18n-text-1.0.1.tgz", - "integrity": "sha512-3G3UetST6rdqhqW9SfcfzNYMpQXS7wNkJvp6dsXnjzGiku6Iu5hl3B0kmk6lIcFPwYjhQIY+tXVRtK9TlGT7RA==", - "dev": true, - "license": "MIT", - "peerDependencies": { - "eslint": ">=5.0.0" - } - }, - "node_modules/eslint-plugin-import": { - "version": "2.31.0", - "resolved": "https://registry.npmjs.org/eslint-plugin-import/-/eslint-plugin-import-2.31.0.tgz", - "integrity": "sha512-ixmkI62Rbc2/w8Vfxyh1jQRTdRTF52VxwRVHl/ykPAmqG+Nb7/kNn+byLP0LxPgI7zWA16Jt82SybJInmMia3A==", - "dev": true, - "license": "MIT", - "dependencies": { - "@rtsao/scc": "^1.1.0", - "array-includes": "^3.1.8", - "array.prototype.findlastindex": "^1.2.5", - "array.prototype.flat": "^1.3.2", - "array.prototype.flatmap": "^1.3.2", - "debug": "^3.2.7", - "doctrine": "^2.1.0", - "eslint-import-resolver-node": "^0.3.9", - "eslint-module-utils": "^2.12.0", - "hasown": "^2.0.2", - "is-core-module": "^2.15.1", - "is-glob": "^4.0.3", - "minimatch": "^3.1.2", - "object.fromentries": "^2.0.8", - "object.groupby": "^1.0.3", - "object.values": "^1.2.0", - "semver": "^6.3.1", - "string.prototype.trimend": "^1.0.8", - "tsconfig-paths": "^3.15.0" - }, - "engines": { - "node": ">=4" - }, - "peerDependencies": { - "eslint": "^2 || ^3 || ^4 || ^5 || ^6 || ^7.2.0 || ^8 || ^9" - } - }, - "node_modules/eslint-plugin-import/node_modules/debug": { - "version": "3.2.7", - "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz", - "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "ms": "^2.1.1" - } - }, - "node_modules/eslint-plugin-import/node_modules/doctrine": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-2.1.0.tgz", - "integrity": "sha512-35mSku4ZXK0vfCuHEDAwt55dg2jNajHZ1odvF+8SSr82EsZY4QmXfuWso8oEd8zRhVObSN18aM0CjSdoBX7zIw==", - "dev": true, - "license": "Apache-2.0", - "dependencies": { - "esutils": "^2.0.2" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/eslint-plugin-import/node_modules/semver": { - "version": "6.3.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", - "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", - "dev": true, - "license": "ISC", - "bin": { - "semver": "bin/semver.js" - } - }, - "node_modules/eslint-plugin-jest": { - "version": "28.8.3", - "resolved": "https://registry.npmjs.org/eslint-plugin-jest/-/eslint-plugin-jest-28.8.3.tgz", - "integrity": "sha512-HIQ3t9hASLKm2IhIOqnu+ifw7uLZkIlR7RYNv7fMcEi/p0CIiJmfriStQS2LDkgtY4nyLbIZAD+JL347Yc2ETQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "@typescript-eslint/utils": "^6.0.0 || ^7.0.0 || ^8.0.0" - }, - "engines": { - "node": "^16.10.0 || ^18.12.0 || >=20.0.0" - }, - "peerDependencies": { - "@typescript-eslint/eslint-plugin": "^6.0.0 || ^7.0.0 || ^8.0.0", - "eslint": "^7.0.0 || ^8.0.0 || ^9.0.0", - "jest": "*" - }, - "peerDependenciesMeta": { - "@typescript-eslint/eslint-plugin": { - "optional": true - }, - "jest": { - "optional": true - } - } - }, - "node_modules/eslint-plugin-jsx-a11y": { - "version": "6.10.0", - "resolved": "https://registry.npmjs.org/eslint-plugin-jsx-a11y/-/eslint-plugin-jsx-a11y-6.10.0.tgz", - "integrity": "sha512-ySOHvXX8eSN6zz8Bywacm7CvGNhUtdjvqfQDVe6020TUK34Cywkw7m0KsCCk1Qtm9G1FayfTN1/7mMYnYO2Bhg==", - "dev": true, - "license": "MIT", - "dependencies": { - "aria-query": "~5.1.3", - "array-includes": "^3.1.8", - "array.prototype.flatmap": "^1.3.2", - "ast-types-flow": "^0.0.8", - "axe-core": "^4.10.0", - "axobject-query": "^4.1.0", - "damerau-levenshtein": "^1.0.8", - "emoji-regex": "^9.2.2", - "es-iterator-helpers": "^1.0.19", - "hasown": "^2.0.2", - "jsx-ast-utils": "^3.3.5", - "language-tags": "^1.0.9", - "minimatch": "^3.1.2", - "object.fromentries": "^2.0.8", - "safe-regex-test": "^1.0.3", - "string.prototype.includes": "^2.0.0" - }, - "engines": { - "node": ">=4.0" - }, - "peerDependencies": { - "eslint": "^3 || ^4 || ^5 || ^6 || ^7 || ^8 || ^9" - } - }, - "node_modules/eslint-plugin-jsx-a11y/node_modules/aria-query": { - "version": "5.1.3", - "resolved": "https://registry.npmjs.org/aria-query/-/aria-query-5.1.3.tgz", - "integrity": "sha512-R5iJ5lkuHybztUfuOAznmboyjWq8O6sqNqtK7CLOqdydi54VNbORp49mb14KbWgG1QD3JFO9hJdZ+y4KutfdOQ==", - "dev": true, - "license": "Apache-2.0", - "dependencies": { - "deep-equal": "^2.0.5" - } - }, - "node_modules/eslint-plugin-no-only-tests": { - "version": "3.3.0", - "resolved": "https://registry.npmjs.org/eslint-plugin-no-only-tests/-/eslint-plugin-no-only-tests-3.3.0.tgz", - "integrity": "sha512-brcKcxGnISN2CcVhXJ/kEQlNa0MEfGRtwKtWA16SkqXHKitaKIMrfemJKLKX1YqDU5C/5JY3PvZXd5jEW04e0Q==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=5.0.0" - } - }, - "node_modules/eslint-plugin-prettier": { - "version": "5.2.1", - "resolved": "https://registry.npmjs.org/eslint-plugin-prettier/-/eslint-plugin-prettier-5.2.1.tgz", - "integrity": "sha512-gH3iR3g4JfF+yYPaJYkN7jEl9QbweL/YfkoRlNnuIEHEz1vHVlCmWOS+eGGiRuzHQXdJFCOTxRgvju9b8VUmrw==", - "dev": true, - "license": "MIT", - "dependencies": { - "prettier-linter-helpers": "^1.0.0", - "synckit": "^0.9.1" - }, - "engines": { - "node": "^14.18.0 || >=16.0.0" - }, - "funding": { - "url": "https://opencollective.com/eslint-plugin-prettier" - }, - "peerDependencies": { - "@types/eslint": ">=8.0.0", - "eslint": ">=8.0.0", - "eslint-config-prettier": "*", - "prettier": ">=3.0.0" - }, - "peerDependenciesMeta": { - "@types/eslint": { - "optional": true - }, - "eslint-config-prettier": { - "optional": true - } - } - }, - "node_modules/eslint-rule-documentation": { - "version": "1.0.23", - "resolved": "https://registry.npmjs.org/eslint-rule-documentation/-/eslint-rule-documentation-1.0.23.tgz", - "integrity": "sha512-pWReu3fkohwyvztx/oQWWgld2iad25TfUdi6wvhhaDPIQjHU/pyvlKgXFw1kX31SQK2Nq9MH+vRDWB0ZLy8fYw==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=4.0.0" - } - }, - "node_modules/eslint-scope": { - "version": "7.2.2", - "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-7.2.2.tgz", - "integrity": "sha512-dOt21O7lTMhDM+X9mB4GX+DZrZtCUJPL/wlcTqxyrx5IvO0IYtILdtrQGQp+8n5S0gwSVmOf9NQrjMOgfQZlIg==", - "dev": true, - "license": "BSD-2-Clause", - "dependencies": { - "esrecurse": "^4.3.0", - "estraverse": "^5.2.0" - }, - "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" - }, - "funding": { - "url": "https://opencollective.com/eslint" - } - }, - "node_modules/eslint-visitor-keys": { - "version": "3.4.3", - "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-3.4.3.tgz", - "integrity": "sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag==", - "dev": true, - "license": "Apache-2.0", - "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" - }, - "funding": { - "url": "https://opencollective.com/eslint" - } - }, - "node_modules/espree": { - "version": "9.6.1", - "resolved": "https://registry.npmjs.org/espree/-/espree-9.6.1.tgz", - "integrity": "sha512-oruZaFkjorTpF32kDSI5/75ViwGeZginGGy2NoOSg3Q9bnwlnmDm4HLnkl0RE3n+njDXR037aY1+x58Z/zFdwQ==", - "dev": true, - "license": "BSD-2-Clause", - "dependencies": { - "acorn": "^8.9.0", - "acorn-jsx": "^5.3.2", - "eslint-visitor-keys": "^3.4.1" - }, - "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" - }, - "funding": { - "url": "https://opencollective.com/eslint" - } - }, - "node_modules/esprima": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/esprima/-/esprima-4.0.1.tgz", - "integrity": "sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==", - "dev": true, - "license": "BSD-2-Clause", - "bin": { - "esparse": "bin/esparse.js", - "esvalidate": "bin/esvalidate.js" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/esquery": { - "version": "1.6.0", - "resolved": "https://registry.npmjs.org/esquery/-/esquery-1.6.0.tgz", - "integrity": "sha512-ca9pw9fomFcKPvFLXhBKUK90ZvGibiGOvRJNbjljY7s7uq/5YO4BOzcYtJqExdx99rF6aAcnRxHmcUHcz6sQsg==", - "dev": true, - "license": "BSD-3-Clause", - "dependencies": { - "estraverse": "^5.1.0" - }, - "engines": { - "node": ">=0.10" - } - }, - "node_modules/esrecurse": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/esrecurse/-/esrecurse-4.3.0.tgz", - "integrity": "sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==", - "dev": true, - "license": "BSD-2-Clause", - "dependencies": { - "estraverse": "^5.2.0" - }, - "engines": { - "node": ">=4.0" - } - }, - "node_modules/estraverse": { - "version": "5.3.0", - "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz", - "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==", - "dev": true, - "license": "BSD-2-Clause", - "engines": { - "node": ">=4.0" - } - }, - "node_modules/esutils": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.3.tgz", - "integrity": "sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==", - "dev": true, - "license": "BSD-2-Clause", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/execa": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/execa/-/execa-5.1.1.tgz", - "integrity": "sha512-8uSpZZocAZRBAPIEINJj3Lo9HyGitllczc27Eh5YYojjMFMn8yHMDMaUHE2Jqfq05D/wucwI4JGURyXt1vchyg==", - "dev": true, - "license": "MIT", - "dependencies": { - "cross-spawn": "^7.0.3", - "get-stream": "^6.0.0", - "human-signals": "^2.1.0", - "is-stream": "^2.0.0", - "merge-stream": "^2.0.0", - "npm-run-path": "^4.0.1", - "onetime": "^5.1.2", - "signal-exit": "^3.0.3", - "strip-final-newline": "^2.0.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sindresorhus/execa?sponsor=1" - } - }, - "node_modules/exit": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/exit/-/exit-0.1.2.tgz", - "integrity": "sha512-Zk/eNKV2zbjpKzrsQ+n1G6poVbErQxJ0LBOJXaKZ1EViLzH+hrLu9cdXI4zw9dBQJslwBEpbQ2P1oS7nDxs6jQ==", - "dev": true, - "engines": { - "node": ">= 0.8.0" - } - }, - "node_modules/expect": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/expect/-/expect-29.7.0.tgz", - "integrity": "sha512-2Zks0hf1VLFYI1kbh0I5jP3KHHyCHpkfyHBzsSXRFgl/Bg9mWYfMW8oD+PdMPlEwy5HNsR9JutYy6pMeOh61nw==", - "dev": true, - "license": "MIT", - "dependencies": { - "@jest/expect-utils": "^29.7.0", - "jest-get-type": "^29.6.3", - "jest-matcher-utils": "^29.7.0", - "jest-message-util": "^29.7.0", - "jest-util": "^29.7.0" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, - "node_modules/fast-deep-equal": { - "version": "3.1.3", - "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz", - "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==", - "dev": true, - "license": "MIT" - }, - "node_modules/fast-diff": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/fast-diff/-/fast-diff-1.3.0.tgz", - "integrity": "sha512-VxPP4NqbUjj6MaAOafWeUn2cXWLcCtljklUtZf0Ind4XQ+QPtmA0b18zZy0jIQx+ExRVCR/ZQpBmik5lXshNsw==", - "dev": true, - "license": "Apache-2.0" - }, - "node_modules/fast-glob": { - "version": "3.3.2", - "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.3.2.tgz", - "integrity": "sha512-oX2ruAFQwf/Orj8m737Y5adxDQO0LAB7/S5MnxCdTNDd4p6BsyIVsv9JQsATbTSq8KHRpLwIHbVlUNatxd+1Ow==", - "dev": true, - "license": "MIT", - "dependencies": { - "@nodelib/fs.stat": "^2.0.2", - "@nodelib/fs.walk": "^1.2.3", - "glob-parent": "^5.1.2", - "merge2": "^1.3.0", - "micromatch": "^4.0.4" - }, - "engines": { - "node": ">=8.6.0" - } - }, - "node_modules/fast-glob/node_modules/glob-parent": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", - "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", - "dev": true, - "license": "ISC", - "dependencies": { - "is-glob": "^4.0.1" - }, - "engines": { - "node": ">= 6" - } - }, - "node_modules/fast-json-stable-stringify": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz", - "integrity": "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==", - "dev": true, - "license": "MIT" - }, - "node_modules/fast-levenshtein": { - "version": "2.0.6", - "resolved": "https://registry.npmjs.org/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz", - "integrity": "sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw==", - "dev": true, - "license": "MIT" - }, - "node_modules/fastq": { - "version": "1.17.1", - "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.17.1.tgz", - "integrity": "sha512-sRVD3lWVIXWg6By68ZN7vho9a1pQcN/WBFaAAsDDFzlJjvoGx0P8z7V1t72grFJfJhu3YPZBuu25f7Kaw2jN1w==", - "dev": true, - "license": "ISC", - "dependencies": { - "reusify": "^1.0.4" - } - }, - "node_modules/fb-watchman": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/fb-watchman/-/fb-watchman-2.0.2.tgz", - "integrity": "sha512-p5161BqbuCaSnB8jIbzQHOlpgsPmK5rJVDfDKO91Axs5NC1uu3HRQm6wt9cd9/+GtQQIO53JdGXXoyDpTAsgYA==", - "dev": true, - "license": "Apache-2.0", - "dependencies": { - "bser": "2.1.1" - } - }, - "node_modules/file-entry-cache": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-6.0.1.tgz", - "integrity": "sha512-7Gps/XWymbLk2QLYK4NzpMOrYjMhdIxXuIvy2QBsLE6ljuodKvdkWs/cpyJJ3CVIVpH0Oi1Hvg1ovbMzLdFBBg==", - "dev": true, - "license": "MIT", - "dependencies": { - "flat-cache": "^3.0.4" - }, - "engines": { - "node": "^10.12.0 || >=12.0.0" - } - }, - "node_modules/filelist": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/filelist/-/filelist-1.0.4.tgz", - "integrity": "sha512-w1cEuf3S+DrLCQL7ET6kz+gmlJdbq9J7yXCSjK/OZCPA+qEN1WyF4ZAf0YYJa4/shHJra2t/d/r8SV4Ji+x+8Q==", - "dev": true, - "license": "Apache-2.0", - "dependencies": { - "minimatch": "^5.0.1" - } - }, - "node_modules/filelist/node_modules/brace-expansion": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz", - "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==", - "dev": true, - "license": "MIT", - "dependencies": { - "balanced-match": "^1.0.0" - } - }, - "node_modules/filelist/node_modules/minimatch": { - "version": "5.1.6", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-5.1.6.tgz", - "integrity": "sha512-lKwV/1brpG6mBUFHtb7NUmtABCb2WZZmm2wNiOA5hAb8VdCS4B3dtMWyvcoViccwAW/COERjXLt0zP1zXUN26g==", - "dev": true, - "license": "ISC", - "dependencies": { - "brace-expansion": "^2.0.1" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/fill-range": { - "version": "7.1.1", - "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.1.1.tgz", - "integrity": "sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg==", - "dev": true, - "license": "MIT", - "dependencies": { - "to-regex-range": "^5.0.1" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/find-up": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/find-up/-/find-up-5.0.0.tgz", - "integrity": "sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==", - "dev": true, - "license": "MIT", - "dependencies": { - "locate-path": "^6.0.0", - "path-exists": "^4.0.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/flat-cache": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-3.2.0.tgz", - "integrity": "sha512-CYcENa+FtcUKLmhhqyctpclsq7QF38pKjZHsGNiSQF5r4FtoKDWabFDl3hzaEQMvT1LHEysw5twgLvpYYb4vbw==", - "dev": true, - "license": "MIT", - "dependencies": { - "flatted": "^3.2.9", - "keyv": "^4.5.3", - "rimraf": "^3.0.2" - }, - "engines": { - "node": "^10.12.0 || >=12.0.0" - } - }, - "node_modules/flatted": { - "version": "3.3.1", - "resolved": "https://registry.npmjs.org/flatted/-/flatted-3.3.1.tgz", - "integrity": "sha512-X8cqMLLie7KsNUDSdzeN8FYK9rEt4Dt67OsG/DNGnYTSDBG4uFAJFBnUeiV+zCVAvwFy56IjM9sH51jVaEhNxw==", - "dev": true, - "license": "ISC" - }, - "node_modules/for-each": { - "version": "0.3.3", - "resolved": "https://registry.npmjs.org/for-each/-/for-each-0.3.3.tgz", - "integrity": "sha512-jqYfLp7mo9vIyQf8ykW2v7A+2N4QjeCeI5+Dz9XraiO1ign81wjiH7Fb9vSOWvQfNtmSa4H2RoQTrrXivdUZmw==", - "dev": true, - "license": "MIT", - "dependencies": { - "is-callable": "^1.1.3" - } - }, - "node_modules/fs-to-json": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/fs-to-json/-/fs-to-json-0.2.0.tgz", - "integrity": "sha512-Su6A40uKNna/BEQeSct2AsS/IaZN24vMU87PWLsr3eFJyEVHry108Qdg0tFqyOgQZIEsIykp65/eIKMqYkKnnw==", - "license": "MIT", - "dependencies": { - "async": "^2.6.0", - "glob": "^7.1.2", - "istextorbinary": "^2.1.0", - "shelljs": "^0.8.2", - "yargs-parser": "^10.0.0" - }, - "bin": { - "fs-to-json": "src/cli.js" - } - }, - "node_modules/fs.realpath": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", - "integrity": "sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==", - "license": "ISC" - }, - "node_modules/function-bind": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.2.tgz", - "integrity": "sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==", - "license": "MIT", - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/function.prototype.name": { - "version": "1.1.6", - "resolved": "https://registry.npmjs.org/function.prototype.name/-/function.prototype.name-1.1.6.tgz", - "integrity": "sha512-Z5kx79swU5P27WEayXM1tBi5Ze/lbIyiNgU3qyXUOf9b2rgXYyF9Dy9Cx+IQv/Lc8WCG6L82zwUPpSS9hGehIg==", - "dev": true, - "license": "MIT", - "dependencies": { - "call-bind": "^1.0.2", - "define-properties": "^1.2.0", - "es-abstract": "^1.22.1", - "functions-have-names": "^1.2.3" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/functions-have-names": { - "version": "1.2.3", - "resolved": "https://registry.npmjs.org/functions-have-names/-/functions-have-names-1.2.3.tgz", - "integrity": "sha512-xckBUXyTIqT97tq2x2AMb+g163b5JFysYk0x4qxNFwbfQkmNZoiRHb6sPzI9/QV33WeuvVYBUIiD4NzNIyqaRQ==", - "dev": true, - "license": "MIT", - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/gensync": { - "version": "1.0.0-beta.2", - "resolved": "https://registry.npmjs.org/gensync/-/gensync-1.0.0-beta.2.tgz", - "integrity": "sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/get-caller-file": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz", - "integrity": "sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==", - "dev": true, - "license": "ISC", - "engines": { - "node": "6.* || 8.* || >= 10.*" - } - }, - "node_modules/get-intrinsic": { - "version": "1.2.4", - "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.2.4.tgz", - "integrity": "sha512-5uYhsJH8VJBTv7oslg4BznJYhDoRI6waYCxMmCdnTrcCrHA/fCFKoTFz2JKKE0HdDFUF7/oQuhzumXJK7paBRQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "es-errors": "^1.3.0", - "function-bind": "^1.1.2", - "has-proto": "^1.0.1", - "has-symbols": "^1.0.3", - "hasown": "^2.0.0" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/get-package-type": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/get-package-type/-/get-package-type-0.1.0.tgz", - "integrity": "sha512-pjzuKtY64GYfWizNAJ0fr9VqttZkNiK2iS430LtIHzjBEr6bX8Am2zm4sW4Ro5wjWW5cAlRL1qAMTcXbjNAO2Q==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=8.0.0" - } - }, - "node_modules/get-stream": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-6.0.1.tgz", - "integrity": "sha512-ts6Wi+2j3jQjqi70w5AlN8DFnkSwC+MqmxEzdEALB2qXZYV3X/b1CTfgPLGJNMeAWxdPfU8FO1ms3NUfaHCPYg==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/get-symbol-description": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/get-symbol-description/-/get-symbol-description-1.0.2.tgz", - "integrity": "sha512-g0QYk1dZBxGwk+Ngc+ltRH2IBp2f7zBkBMBJZCDerh6EhlhSR6+9irMCuT/09zD6qkarHUSn529sK/yL4S27mg==", - "dev": true, - "license": "MIT", - "dependencies": { - "call-bind": "^1.0.5", - "es-errors": "^1.3.0", - "get-intrinsic": "^1.2.4" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/glob": { - "version": "7.2.3", - "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", - "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==", - "deprecated": "Glob versions prior to v9 are no longer supported", - "license": "ISC", - "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" - }, - "engines": { - "node": "*" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "node_modules/glob-parent": { - "version": "6.0.2", - "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-6.0.2.tgz", - "integrity": "sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==", - "dev": true, - "license": "ISC", - "dependencies": { - "is-glob": "^4.0.3" - }, - "engines": { - "node": ">=10.13.0" - } - }, - "node_modules/globals": { - "version": "13.24.0", - "resolved": "https://registry.npmjs.org/globals/-/globals-13.24.0.tgz", - "integrity": "sha512-AhO5QUcj8llrbG09iWhPU2B204J1xnPeL8kQmVorSsy+Sjj1sk8gIyh6cUocGmH4L0UuhAJy+hJMRA4mgA4mFQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "type-fest": "^0.20.2" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/globalthis": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/globalthis/-/globalthis-1.0.4.tgz", - "integrity": "sha512-DpLKbNU4WylpxJykQujfCcwYWiV/Jhm50Goo0wrVILAv5jOr9d+H+UR3PhSCD2rCCEIg0uc+G+muBTwD54JhDQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "define-properties": "^1.2.1", - "gopd": "^1.0.1" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/globby": { - "version": "11.1.0", - "resolved": "https://registry.npmjs.org/globby/-/globby-11.1.0.tgz", - "integrity": "sha512-jhIXaOzy1sb8IyocaruWSn1TjmnBVs8Ayhcy83rmxNJ8q2uWKCAj3CnJY+KpGSXCueAPc0i05kVvVKtP1t9S3g==", - "dev": true, - "license": "MIT", - "dependencies": { - "array-union": "^2.1.0", - "dir-glob": "^3.0.1", - "fast-glob": "^3.2.9", - "ignore": "^5.2.0", - "merge2": "^1.4.1", - "slash": "^3.0.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/gopd": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/gopd/-/gopd-1.0.1.tgz", - "integrity": "sha512-d65bNlIadxvpb/A2abVdlqKqV563juRnZ1Wtk6s1sIR8uNsXR70xqIzVqxVf1eTqDunwT2MkczEeaezCKTZhwA==", - "dev": true, - "license": "MIT", - "dependencies": { - "get-intrinsic": "^1.1.3" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/graceful-fs": { - "version": "4.2.11", - "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.11.tgz", - "integrity": "sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==", - "dev": true, - "license": "ISC" - }, - "node_modules/graphemer": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/graphemer/-/graphemer-1.4.0.tgz", - "integrity": "sha512-EtKwoO6kxCL9WO5xipiHTZlSzBm7WLT627TqC/uVRd0HKmq8NXyebnNYxDoBi7wt8eTWrUrKXCOVaFq9x1kgag==", - "dev": true, - "license": "MIT" - }, - "node_modules/has-bigints": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/has-bigints/-/has-bigints-1.0.2.tgz", - "integrity": "sha512-tSvCKtBr9lkF0Ex0aQiP9N+OpV4zi2r/Nee5VkRDbaqv35RLYMzbwQfFSZZH0kR+Rd6302UJZ2p/bJCEoR3VoQ==", - "dev": true, - "license": "MIT", - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/has-flag": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", - "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=8" - } - }, - "node_modules/has-property-descriptors": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/has-property-descriptors/-/has-property-descriptors-1.0.2.tgz", - "integrity": "sha512-55JNKuIW+vq4Ke1BjOTjM2YctQIvCT7GFzHwmfZPGo5wnrgkid0YQtnAleFSqumZm4az3n2BS+erby5ipJdgrg==", - "dev": true, - "license": "MIT", - "dependencies": { - "es-define-property": "^1.0.0" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/has-proto": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/has-proto/-/has-proto-1.0.3.tgz", - "integrity": "sha512-SJ1amZAJUiZS+PhsVLf5tGydlaVB8EdFpaSO4gmiUKUOxk8qzn5AIy4ZeJUmh22znIdk/uMAUT2pl3FxzVUH+Q==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/has-symbols": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.3.tgz", - "integrity": "sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/has-tostringtag": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/has-tostringtag/-/has-tostringtag-1.0.2.tgz", - "integrity": "sha512-NqADB8VjPFLM2V0VvHUewwwsw0ZWBaIdgo+ieHtK3hasLz4qeCRjYcqfB6AQrBggRKppKF8L52/VqdVsO47Dlw==", - "dev": true, - "license": "MIT", - "dependencies": { - "has-symbols": "^1.0.3" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/hasown": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/hasown/-/hasown-2.0.2.tgz", - "integrity": "sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ==", - "license": "MIT", - "dependencies": { - "function-bind": "^1.1.2" - }, - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/html-escaper": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/html-escaper/-/html-escaper-2.0.2.tgz", - "integrity": "sha512-H2iMtd0I4Mt5eYiapRdIDjp+XzelXQ0tFE4JS7YFwFevXXMmOp9myNrUvCg0D6ws8iqkRPBfKHgbwig1SmlLfg==", - "dev": true, - "license": "MIT" - }, - "node_modules/human-signals": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/human-signals/-/human-signals-2.1.0.tgz", - "integrity": "sha512-B4FFZ6q/T2jhhksgkbEW3HBvWIfDW85snkQgawt07S7J5QXTk6BkNV+0yAeZrM5QpMAdYlocGoljn0sJ/WQkFw==", - "dev": true, - "license": "Apache-2.0", - "engines": { - "node": ">=10.17.0" - } - }, - "node_modules/ignore": { - "version": "5.3.2", - "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.3.2.tgz", - "integrity": "sha512-hsBTNUqQTDwkWtcdYI2i06Y/nUBEsNEDJKjWdigLvegy8kDuJAS8uRlpkkcQpyEXL0Z/pjDy5HBmMjRCJ2gq+g==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 4" - } - }, - "node_modules/import-fresh": { - "version": "3.3.0", - "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-3.3.0.tgz", - "integrity": "sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw==", - "dev": true, - "license": "MIT", - "dependencies": { - "parent-module": "^1.0.0", - "resolve-from": "^4.0.0" - }, - "engines": { - "node": ">=6" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/import-local": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/import-local/-/import-local-3.2.0.tgz", - "integrity": "sha512-2SPlun1JUPWoM6t3F0dw0FkCF/jWY8kttcY4f599GLTSjh2OCuuhdTkJQsEcZzBqbXZGKMK2OqW1oZsjtf/gQA==", - "dev": true, - "license": "MIT", - "dependencies": { - "pkg-dir": "^4.2.0", - "resolve-cwd": "^3.0.0" - }, - "bin": { - "import-local-fixture": "fixtures/cli.js" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/imurmurhash": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz", - "integrity": "sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=0.8.19" - } - }, - "node_modules/inflight": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", - "integrity": "sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==", - "deprecated": "This module is not supported, and leaks memory. Do not use it. Check out lru-cache if you want a good and tested way to coalesce async requests by a key value, which is much more comprehensive and powerful.", - "license": "ISC", - "dependencies": { - "once": "^1.3.0", - "wrappy": "1" - } - }, - "node_modules/inherits": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", - "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==", - "license": "ISC" - }, - "node_modules/internal-slot": { - "version": "1.0.7", - "resolved": "https://registry.npmjs.org/internal-slot/-/internal-slot-1.0.7.tgz", - "integrity": "sha512-NGnrKwXzSms2qUUih/ILZ5JBqNTSa1+ZmP6flaIp6KmSElgE9qdndzS3cqjrDovwFdmwsGsLdeFgB6suw+1e9g==", - "dev": true, - "license": "MIT", - "dependencies": { - "es-errors": "^1.3.0", - "hasown": "^2.0.0", - "side-channel": "^1.0.4" - }, - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/interpret": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/interpret/-/interpret-1.4.0.tgz", - "integrity": "sha512-agE4QfB2Lkp9uICn7BAqoscw4SZP9kTE2hxiFI3jBPmXJfdqiahTbUuKGsMoN2GtqL9AxhYioAcVvgsb1HvRbA==", - "license": "MIT", - "engines": { - "node": ">= 0.10" - } - }, - "node_modules/is-arguments": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/is-arguments/-/is-arguments-1.1.1.tgz", - "integrity": "sha512-8Q7EARjzEnKpt/PCD7e1cgUS0a6X8u5tdSiMqXhojOdoV9TsMsiO+9VLC5vAmO8N7/GmXn7yjR8qnA6bVAEzfA==", - "dev": true, - "license": "MIT", - "dependencies": { - "call-bind": "^1.0.2", - "has-tostringtag": "^1.0.0" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/is-array-buffer": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/is-array-buffer/-/is-array-buffer-3.0.4.tgz", - "integrity": "sha512-wcjaerHw0ydZwfhiKbXJWLDY8A7yV7KhjQOpb83hGgGfId/aQa4TOvwyzn2PuswW2gPCYEL/nEAiSVpdOj1lXw==", - "dev": true, - "license": "MIT", - "dependencies": { - "call-bind": "^1.0.2", - "get-intrinsic": "^1.2.1" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/is-arrayish": { - "version": "0.2.1", - "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.2.1.tgz", - "integrity": "sha512-zz06S8t0ozoDXMG+ube26zeCTNXcKIPJZJi8hBrF4idCLms4CG9QtK7qBl1boi5ODzFpjswb5JPmHCbMpjaYzg==", - "dev": true, - "license": "MIT" - }, - "node_modules/is-async-function": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/is-async-function/-/is-async-function-2.0.0.tgz", - "integrity": "sha512-Y1JXKrfykRJGdlDwdKlLpLyMIiWqWvuSd17TvZk68PLAOGOoF4Xyav1z0Xhoi+gCYjZVeC5SI+hYFOfvXmGRCA==", - "dev": true, - "license": "MIT", - "dependencies": { - "has-tostringtag": "^1.0.0" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/is-bigint": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/is-bigint/-/is-bigint-1.0.4.tgz", - "integrity": "sha512-zB9CruMamjym81i2JZ3UMn54PKGsQzsJeo6xvN3HJJ4CAsQNB6iRutp2To77OfCNuoxspsIhzaPoO1zyCEhFOg==", - "dev": true, - "license": "MIT", - "dependencies": { - "has-bigints": "^1.0.1" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/is-boolean-object": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/is-boolean-object/-/is-boolean-object-1.1.2.tgz", - "integrity": "sha512-gDYaKHJmnj4aWxyj6YHyXVpdQawtVLHU5cb+eztPGczf6cjuTdwve5ZIEfgXqH4e57An1D1AKf8CZ3kYrQRqYA==", - "dev": true, - "license": "MIT", - "dependencies": { - "call-bind": "^1.0.2", - "has-tostringtag": "^1.0.0" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/is-callable": { - "version": "1.2.7", - "resolved": "https://registry.npmjs.org/is-callable/-/is-callable-1.2.7.tgz", - "integrity": "sha512-1BC0BVFhS/p0qtw6enp8e+8OD0UrK0oFLztSjNzhcKA3WDuJxxAPXzPuPtKkjEY9UUoEWlX/8fgKeu2S8i9JTA==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/is-core-module": { - "version": "2.15.1", - "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.15.1.tgz", - "integrity": "sha512-z0vtXSwucUJtANQWldhbtbt7BnL0vxiFjIdDLAatwhDYty2bad6s+rijD6Ri4YuYJubLzIJLUidCh09e1djEVQ==", - "license": "MIT", - "dependencies": { - "hasown": "^2.0.2" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/is-data-view": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/is-data-view/-/is-data-view-1.0.1.tgz", - "integrity": "sha512-AHkaJrsUVW6wq6JS8y3JnM/GJF/9cf+k20+iDzlSaJrinEo5+7vRiteOSwBhHRiAyQATN1AmY4hwzxJKPmYf+w==", - "dev": true, - "license": "MIT", - "dependencies": { - "is-typed-array": "^1.1.13" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/is-date-object": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/is-date-object/-/is-date-object-1.0.5.tgz", - "integrity": "sha512-9YQaSxsAiSwcvS33MBk3wTCVnWK+HhF8VZR2jRxehM16QcVOdHqPn4VPHmRK4lSr38n9JriurInLcP90xsYNfQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "has-tostringtag": "^1.0.0" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/is-extglob": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", - "integrity": "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/is-finalizationregistry": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/is-finalizationregistry/-/is-finalizationregistry-1.0.2.tgz", - "integrity": "sha512-0by5vtUJs8iFQb5TYUHHPudOR+qXYIMKtiUzvLIZITZUjknFmziyBJuLhVRc+Ds0dREFlskDNJKYIdIzu/9pfw==", - "dev": true, - "license": "MIT", - "dependencies": { - "call-bind": "^1.0.2" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/is-fullwidth-code-point": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", - "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=8" - } - }, - "node_modules/is-generator-fn": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/is-generator-fn/-/is-generator-fn-2.1.0.tgz", - "integrity": "sha512-cTIB4yPYL/Grw0EaSzASzg6bBy9gqCofvWN8okThAYIxKJZC+udlRAmGbM0XLeniEJSs8uEgHPGuHSe1XsOLSQ==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=6" - } - }, - "node_modules/is-generator-function": { - "version": "1.0.10", - "resolved": "https://registry.npmjs.org/is-generator-function/-/is-generator-function-1.0.10.tgz", - "integrity": "sha512-jsEjy9l3yiXEQ+PsXdmBwEPcOxaXWLspKdplFUVI9vq1iZgIekeC0L167qeu86czQaxed3q/Uzuw0swL0irL8A==", - "dev": true, - "license": "MIT", - "dependencies": { - "has-tostringtag": "^1.0.0" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/is-glob": { - "version": "4.0.3", - "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz", - "integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==", - "dev": true, - "license": "MIT", - "dependencies": { - "is-extglob": "^2.1.1" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/is-map": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/is-map/-/is-map-2.0.3.tgz", - "integrity": "sha512-1Qed0/Hr2m+YqxnM09CjA2d/i6YZNfF6R2oRAOj36eUdS6qIV/huPJNSEpKbupewFs+ZsJlxsjjPbc0/afW6Lw==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/is-negative-zero": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/is-negative-zero/-/is-negative-zero-2.0.3.tgz", - "integrity": "sha512-5KoIu2Ngpyek75jXodFvnafB6DJgr3u8uuK0LEZJjrU19DrMD3EVERaR8sjz8CCGgpZvxPl9SuE1GMVPFHx1mw==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/is-number": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", - "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=0.12.0" - } - }, - "node_modules/is-number-object": { - "version": "1.0.7", - "resolved": "https://registry.npmjs.org/is-number-object/-/is-number-object-1.0.7.tgz", - "integrity": "sha512-k1U0IRzLMo7ZlYIfzRu23Oh6MiIFasgpb9X76eqfFZAqwH44UI4KTBvBYIZ1dSL9ZzChTB9ShHfLkR4pdW5krQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "has-tostringtag": "^1.0.0" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/is-path-inside": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/is-path-inside/-/is-path-inside-3.0.3.tgz", - "integrity": "sha512-Fd4gABb+ycGAmKou8eMftCupSir5lRxqf4aD/vd0cD2qc4HL07OjCeuHMr8Ro4CoMaeCKDB0/ECBOVWjTwUvPQ==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=8" - } - }, - "node_modules/is-regex": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/is-regex/-/is-regex-1.1.4.tgz", - "integrity": "sha512-kvRdxDsxZjhzUX07ZnLydzS1TU/TJlTUHHY4YLL87e37oUA49DfkLqgy+VjFocowy29cKvcSiu+kIv728jTTVg==", - "dev": true, - "license": "MIT", - "dependencies": { - "call-bind": "^1.0.2", - "has-tostringtag": "^1.0.0" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/is-set": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/is-set/-/is-set-2.0.3.tgz", - "integrity": "sha512-iPAjerrse27/ygGLxw+EBR9agv9Y6uLeYVJMu+QNCoouJ1/1ri0mGrcWpfCqFZuzzx3WjtwxG098X+n4OuRkPg==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/is-shared-array-buffer": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/is-shared-array-buffer/-/is-shared-array-buffer-1.0.3.tgz", - "integrity": "sha512-nA2hv5XIhLR3uVzDDfCIknerhx8XUKnstuOERPNNIinXG7v9u+ohXF67vxm4TPTEPU6lm61ZkwP3c9PCB97rhg==", - "dev": true, - "license": "MIT", - "dependencies": { - "call-bind": "^1.0.7" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/is-stream": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-2.0.1.tgz", - "integrity": "sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/is-string": { - "version": "1.0.7", - "resolved": "https://registry.npmjs.org/is-string/-/is-string-1.0.7.tgz", - "integrity": "sha512-tE2UXzivje6ofPW7l23cjDOMa09gb7xlAqG6jG5ej6uPV32TlWP3NKPigtaGeHNu9fohccRYvIiZMfOOnOYUtg==", - "dev": true, - "license": "MIT", - "dependencies": { - "has-tostringtag": "^1.0.0" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/is-symbol": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/is-symbol/-/is-symbol-1.0.4.tgz", - "integrity": "sha512-C/CPBqKWnvdcxqIARxyOh4v1UUEOCHpgDa0WYgpKDFMszcrPcffg5uhwSgPCLD2WWxmq6isisz87tzT01tuGhg==", - "dev": true, - "license": "MIT", - "dependencies": { - "has-symbols": "^1.0.2" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/is-typed-array": { - "version": "1.1.13", - "resolved": "https://registry.npmjs.org/is-typed-array/-/is-typed-array-1.1.13.tgz", - "integrity": "sha512-uZ25/bUAlUY5fR4OKT4rZQEBrzQWYV9ZJYGGsUmEJ6thodVJ1HX64ePQ6Z0qPWP+m+Uq6e9UugrE38jeYsDSMw==", - "dev": true, - "license": "MIT", - "dependencies": { - "which-typed-array": "^1.1.14" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/is-weakmap": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/is-weakmap/-/is-weakmap-2.0.2.tgz", - "integrity": "sha512-K5pXYOm9wqY1RgjpL3YTkF39tni1XajUIkawTLUo9EZEVUFga5gSQJF8nNS7ZwJQ02y+1YCNYcMh+HIf1ZqE+w==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/is-weakref": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/is-weakref/-/is-weakref-1.0.2.tgz", - "integrity": "sha512-qctsuLZmIQ0+vSSMfoVvyFe2+GSEvnmZ2ezTup1SBse9+twCCeial6EEi3Nc2KFcf6+qz2FBPnjXsk8xhKSaPQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "call-bind": "^1.0.2" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/is-weakset": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/is-weakset/-/is-weakset-2.0.3.tgz", - "integrity": "sha512-LvIm3/KWzS9oRFHugab7d+M/GcBXuXX5xZkzPmN+NxihdQlZUQ4dWuSV1xR/sq6upL1TJEDrfBgRepHFdBtSNQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "call-bind": "^1.0.7", - "get-intrinsic": "^1.2.4" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/isarray": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/isarray/-/isarray-2.0.5.tgz", - "integrity": "sha512-xHjhDr3cNBK0BzdUJSPXZntQUx/mwMS5Rw4A7lPJ90XGAO6ISP/ePDNuo0vhqOZU+UD5JoodwCAAoZQd3FeAKw==", - "dev": true, - "license": "MIT" - }, - "node_modules/isexe": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", - "integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==", - "dev": true, - "license": "ISC" - }, - "node_modules/istanbul-lib-coverage": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/istanbul-lib-coverage/-/istanbul-lib-coverage-3.2.2.tgz", - "integrity": "sha512-O8dpsF+r0WV/8MNRKfnmrtCWhuKjxrq2w+jpzBL5UZKTi2LeVWnWOmWRxFlesJONmc+wLAGvKQZEOanko0LFTg==", - "dev": true, - "license": "BSD-3-Clause", - "engines": { - "node": ">=8" - } - }, - "node_modules/istanbul-lib-instrument": { - "version": "6.0.3", - "resolved": "https://registry.npmjs.org/istanbul-lib-instrument/-/istanbul-lib-instrument-6.0.3.tgz", - "integrity": "sha512-Vtgk7L/R2JHyyGW07spoFlB8/lpjiOLTjMdms6AFMraYt3BaJauod/NGrfnVG/y4Ix1JEuMRPDPEj2ua+zz1/Q==", - "dev": true, - "license": "BSD-3-Clause", - "dependencies": { - "@babel/core": "^7.23.9", - "@babel/parser": "^7.23.9", - "@istanbuljs/schema": "^0.1.3", - "istanbul-lib-coverage": "^3.2.0", - "semver": "^7.5.4" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/istanbul-lib-report": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/istanbul-lib-report/-/istanbul-lib-report-3.0.1.tgz", - "integrity": "sha512-GCfE1mtsHGOELCU8e/Z7YWzpmybrx/+dSTfLrvY8qRmaY6zXTKWn6WQIjaAFw069icm6GVMNkgu0NzI4iPZUNw==", - "dev": true, - "license": "BSD-3-Clause", - "dependencies": { - "istanbul-lib-coverage": "^3.0.0", - "make-dir": "^4.0.0", - "supports-color": "^7.1.0" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/istanbul-lib-source-maps": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/istanbul-lib-source-maps/-/istanbul-lib-source-maps-4.0.1.tgz", - "integrity": "sha512-n3s8EwkdFIJCG3BPKBYvskgXGoy88ARzvegkitk60NxRdwltLOTaH7CUiMRXvwYorl0Q712iEjcWB+fK/MrWVw==", - "dev": true, - "license": "BSD-3-Clause", - "dependencies": { - "debug": "^4.1.1", - "istanbul-lib-coverage": "^3.0.0", - "source-map": "^0.6.1" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/istanbul-reports": { - "version": "3.1.7", - "resolved": "https://registry.npmjs.org/istanbul-reports/-/istanbul-reports-3.1.7.tgz", - "integrity": "sha512-BewmUXImeuRk2YY0PVbxgKAysvhRPUQE0h5QRM++nVWyubKGV0l8qQ5op8+B2DOmwSe63Jivj0BjkPQVf8fP5g==", - "dev": true, - "license": "BSD-3-Clause", - "dependencies": { - "html-escaper": "^2.0.0", - "istanbul-lib-report": "^3.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/istextorbinary": { - "version": "2.6.0", - "resolved": "https://registry.npmjs.org/istextorbinary/-/istextorbinary-2.6.0.tgz", - "integrity": "sha512-+XRlFseT8B3L9KyjxxLjfXSLMuErKDsd8DBNrsaxoViABMEZlOSCstwmw0qpoFX3+U6yWU1yhLudAe6/lETGGA==", - "license": "MIT", - "dependencies": { - "binaryextensions": "^2.1.2", - "editions": "^2.2.0", - "textextensions": "^2.5.0" - }, - "engines": { - "node": ">=0.12" - }, - "funding": { - "url": "https://bevry.me/fund" - } - }, - "node_modules/iterator.prototype": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/iterator.prototype/-/iterator.prototype-1.1.2.tgz", - "integrity": "sha512-DR33HMMr8EzwuRL8Y9D3u2BMj8+RqSE850jfGu59kS7tbmPLzGkZmVSfyCFSDxuZiEY6Rzt3T2NA/qU+NwVj1w==", - "dev": true, - "license": "MIT", - "dependencies": { - "define-properties": "^1.2.1", - "get-intrinsic": "^1.2.1", - "has-symbols": "^1.0.3", - "reflect.getprototypeof": "^1.0.4", - "set-function-name": "^2.0.1" - } - }, - "node_modules/jake": { - "version": "10.9.2", - "resolved": "https://registry.npmjs.org/jake/-/jake-10.9.2.tgz", - "integrity": "sha512-2P4SQ0HrLQ+fw6llpLnOaGAvN2Zu6778SJMrCUwns4fOoG9ayrTiZk3VV8sCPkVZF8ab0zksVpS8FDY5pRCNBA==", - "dev": true, - "license": "Apache-2.0", - "dependencies": { - "async": "^3.2.3", - "chalk": "^4.0.2", - "filelist": "^1.0.4", - "minimatch": "^3.1.2" - }, - "bin": { - "jake": "bin/cli.js" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/jake/node_modules/async": { - "version": "3.2.6", - "resolved": "https://registry.npmjs.org/async/-/async-3.2.6.tgz", - "integrity": "sha512-htCUDlxyyCLMgaM3xXg0C0LW2xqfuQ6p05pCEIsXuyQ+a1koYKTuBMzRNwmybfLgvJDMd0r1LTn4+E0Ti6C2AA==", - "dev": true, - "license": "MIT" - }, - "node_modules/jest": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/jest/-/jest-29.7.0.tgz", - "integrity": "sha512-NIy3oAFp9shda19hy4HK0HRTWKtPJmGdnvywu01nOqNC2vZg+Z+fvJDxpMQA88eb2I9EcafcdjYgsDthnYTvGw==", - "dev": true, - "license": "MIT", - "dependencies": { - "@jest/core": "^29.7.0", - "@jest/types": "^29.6.3", - "import-local": "^3.0.2", - "jest-cli": "^29.7.0" - }, - "bin": { - "jest": "bin/jest.js" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - }, - "peerDependencies": { - "node-notifier": "^8.0.1 || ^9.0.0 || ^10.0.0" - }, - "peerDependenciesMeta": { - "node-notifier": { - "optional": true - } - } - }, - "node_modules/jest-changed-files": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/jest-changed-files/-/jest-changed-files-29.7.0.tgz", - "integrity": "sha512-fEArFiwf1BpQ+4bXSprcDc3/x4HSzL4al2tozwVpDFpsxALjLYdyiIK4e5Vz66GQJIbXJ82+35PtysofptNX2w==", - "dev": true, - "license": "MIT", - "dependencies": { - "execa": "^5.0.0", - "jest-util": "^29.7.0", - "p-limit": "^3.1.0" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, - "node_modules/jest-circus": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/jest-circus/-/jest-circus-29.7.0.tgz", - "integrity": "sha512-3E1nCMgipcTkCocFwM90XXQab9bS+GMsjdpmPrlelaxwD93Ad8iVEjX/vvHPdLPnFf+L40u+5+iutRdA1N9myw==", - "dev": true, - "license": "MIT", - "dependencies": { - "@jest/environment": "^29.7.0", - "@jest/expect": "^29.7.0", - "@jest/test-result": "^29.7.0", - "@jest/types": "^29.6.3", - "@types/node": "*", - "chalk": "^4.0.0", - "co": "^4.6.0", - "dedent": "^1.0.0", - "is-generator-fn": "^2.0.0", - "jest-each": "^29.7.0", - "jest-matcher-utils": "^29.7.0", - "jest-message-util": "^29.7.0", - "jest-runtime": "^29.7.0", - "jest-snapshot": "^29.7.0", - "jest-util": "^29.7.0", - "p-limit": "^3.1.0", - "pretty-format": "^29.7.0", - "pure-rand": "^6.0.0", - "slash": "^3.0.0", - "stack-utils": "^2.0.3" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, - "node_modules/jest-cli": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/jest-cli/-/jest-cli-29.7.0.tgz", - "integrity": "sha512-OVVobw2IubN/GSYsxETi+gOe7Ka59EFMR/twOU3Jb2GnKKeMGJB5SGUUrEz3SFVmJASUdZUzy83sLNNQ2gZslg==", - "dev": true, - "license": "MIT", - "dependencies": { - "@jest/core": "^29.7.0", - "@jest/test-result": "^29.7.0", - "@jest/types": "^29.6.3", - "chalk": "^4.0.0", - "create-jest": "^29.7.0", - "exit": "^0.1.2", - "import-local": "^3.0.2", - "jest-config": "^29.7.0", - "jest-util": "^29.7.0", - "jest-validate": "^29.7.0", - "yargs": "^17.3.1" - }, - "bin": { - "jest": "bin/jest.js" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - }, - "peerDependencies": { - "node-notifier": "^8.0.1 || ^9.0.0 || ^10.0.0" - }, - "peerDependenciesMeta": { - "node-notifier": { - "optional": true - } - } - }, - "node_modules/jest-config": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/jest-config/-/jest-config-29.7.0.tgz", - "integrity": "sha512-uXbpfeQ7R6TZBqI3/TxCU4q4ttk3u0PJeC+E0zbfSoSjq6bJ7buBPxzQPL0ifrkY4DNu4JUdk0ImlBUYi840eQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/core": "^7.11.6", - "@jest/test-sequencer": "^29.7.0", - "@jest/types": "^29.6.3", - "babel-jest": "^29.7.0", - "chalk": "^4.0.0", - "ci-info": "^3.2.0", - "deepmerge": "^4.2.2", - "glob": "^7.1.3", - "graceful-fs": "^4.2.9", - "jest-circus": "^29.7.0", - "jest-environment-node": "^29.7.0", - "jest-get-type": "^29.6.3", - "jest-regex-util": "^29.6.3", - "jest-resolve": "^29.7.0", - "jest-runner": "^29.7.0", - "jest-util": "^29.7.0", - "jest-validate": "^29.7.0", - "micromatch": "^4.0.4", - "parse-json": "^5.2.0", - "pretty-format": "^29.7.0", - "slash": "^3.0.0", - "strip-json-comments": "^3.1.1" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - }, - "peerDependencies": { - "@types/node": "*", - "ts-node": ">=9.0.0" - }, - "peerDependenciesMeta": { - "@types/node": { - "optional": true - }, - "ts-node": { - "optional": true - } - } - }, - "node_modules/jest-diff": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/jest-diff/-/jest-diff-29.7.0.tgz", - "integrity": "sha512-LMIgiIrhigmPrs03JHpxUh2yISK3vLFPkAodPeo0+BuF7wA2FoQbkEg1u8gBYBThncu7e1oEDUfIXVuTqLRUjw==", - "dev": true, - "license": "MIT", - "dependencies": { - "chalk": "^4.0.0", - "diff-sequences": "^29.6.3", - "jest-get-type": "^29.6.3", - "pretty-format": "^29.7.0" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, - "node_modules/jest-docblock": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/jest-docblock/-/jest-docblock-29.7.0.tgz", - "integrity": "sha512-q617Auw3A612guyaFgsbFeYpNP5t2aoUNLwBUbc/0kD1R4t9ixDbyFTHd1nok4epoVFpr7PmeWHrhvuV3XaJ4g==", - "dev": true, - "license": "MIT", - "dependencies": { - "detect-newline": "^3.0.0" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, - "node_modules/jest-each": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/jest-each/-/jest-each-29.7.0.tgz", - "integrity": "sha512-gns+Er14+ZrEoC5fhOfYCY1LOHHr0TI+rQUHZS8Ttw2l7gl+80eHc/gFf2Ktkw0+SIACDTeWvpFcv3B04VembQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "@jest/types": "^29.6.3", - "chalk": "^4.0.0", - "jest-get-type": "^29.6.3", - "jest-util": "^29.7.0", - "pretty-format": "^29.7.0" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, - "node_modules/jest-environment-node": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/jest-environment-node/-/jest-environment-node-29.7.0.tgz", - "integrity": "sha512-DOSwCRqXirTOyheM+4d5YZOrWcdu0LNZ87ewUoywbcb2XR4wKgqiG8vNeYwhjFMbEkfju7wx2GYH0P2gevGvFw==", - "dev": true, - "license": "MIT", - "dependencies": { - "@jest/environment": "^29.7.0", - "@jest/fake-timers": "^29.7.0", - "@jest/types": "^29.6.3", - "@types/node": "*", - "jest-mock": "^29.7.0", - "jest-util": "^29.7.0" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, - "node_modules/jest-get-type": { - "version": "29.6.3", - "resolved": "https://registry.npmjs.org/jest-get-type/-/jest-get-type-29.6.3.tgz", - "integrity": "sha512-zrteXnqYxfQh7l5FHyL38jL39di8H8rHoecLH3JNxH3BwOrBsNeabdap5e0I23lD4HHI8W5VFBZqG4Eaq5LNcw==", - "dev": true, - "license": "MIT", - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, - "node_modules/jest-haste-map": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/jest-haste-map/-/jest-haste-map-29.7.0.tgz", - "integrity": "sha512-fP8u2pyfqx0K1rGn1R9pyE0/KTn+G7PxktWidOBTqFPLYX0b9ksaMFkhK5vrS3DVun09pckLdlx90QthlW7AmA==", - "dev": true, - "license": "MIT", - "dependencies": { - "@jest/types": "^29.6.3", - "@types/graceful-fs": "^4.1.3", - "@types/node": "*", - "anymatch": "^3.0.3", - "fb-watchman": "^2.0.0", - "graceful-fs": "^4.2.9", - "jest-regex-util": "^29.6.3", - "jest-util": "^29.7.0", - "jest-worker": "^29.7.0", - "micromatch": "^4.0.4", - "walker": "^1.0.8" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - }, - "optionalDependencies": { - "fsevents": "^2.3.2" - } - }, - "node_modules/jest-leak-detector": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/jest-leak-detector/-/jest-leak-detector-29.7.0.tgz", - "integrity": "sha512-kYA8IJcSYtST2BY9I+SMC32nDpBT3J2NvWJx8+JCuCdl/CR1I4EKUJROiP8XtCcxqgTTBGJNdbB1A8XRKbTetw==", - "dev": true, - "license": "MIT", - "dependencies": { - "jest-get-type": "^29.6.3", - "pretty-format": "^29.7.0" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, - "node_modules/jest-matcher-utils": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/jest-matcher-utils/-/jest-matcher-utils-29.7.0.tgz", - "integrity": "sha512-sBkD+Xi9DtcChsI3L3u0+N0opgPYnCRPtGcQYrgXmR+hmt/fYfWAL0xRXYU8eWOdfuLgBe0YCW3AFtnRLagq/g==", - "dev": true, - "license": "MIT", - "dependencies": { - "chalk": "^4.0.0", - "jest-diff": "^29.7.0", - "jest-get-type": "^29.6.3", - "pretty-format": "^29.7.0" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, - "node_modules/jest-message-util": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/jest-message-util/-/jest-message-util-29.7.0.tgz", - "integrity": "sha512-GBEV4GRADeP+qtB2+6u61stea8mGcOT4mCtrYISZwfu9/ISHFJ/5zOMXYbpBE9RsS5+Gb63DW4FgmnKJ79Kf6w==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/code-frame": "^7.12.13", - "@jest/types": "^29.6.3", - "@types/stack-utils": "^2.0.0", - "chalk": "^4.0.0", - "graceful-fs": "^4.2.9", - "micromatch": "^4.0.4", - "pretty-format": "^29.7.0", - "slash": "^3.0.0", - "stack-utils": "^2.0.3" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, - "node_modules/jest-mock": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/jest-mock/-/jest-mock-29.7.0.tgz", - "integrity": "sha512-ITOMZn+UkYS4ZFh83xYAOzWStloNzJFO2s8DWrE4lhtGD+AorgnbkiKERe4wQVBydIGPx059g6riW5Btp6Llnw==", - "dev": true, - "license": "MIT", - "dependencies": { - "@jest/types": "^29.6.3", - "@types/node": "*", - "jest-util": "^29.7.0" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, - "node_modules/jest-pnp-resolver": { - "version": "1.2.3", - "resolved": "https://registry.npmjs.org/jest-pnp-resolver/-/jest-pnp-resolver-1.2.3.tgz", - "integrity": "sha512-+3NpwQEnRoIBtx4fyhblQDPgJI0H1IEIkX7ShLUjPGA7TtUTvI1oiKi3SR4oBR0hQhQR80l4WAe5RrXBwWMA8w==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=6" - }, - "peerDependencies": { - "jest-resolve": "*" - }, - "peerDependenciesMeta": { - "jest-resolve": { - "optional": true - } - } - }, - "node_modules/jest-regex-util": { - "version": "29.6.3", - "resolved": "https://registry.npmjs.org/jest-regex-util/-/jest-regex-util-29.6.3.tgz", - "integrity": "sha512-KJJBsRCyyLNWCNBOvZyRDnAIfUiRJ8v+hOBQYGn8gDyF3UegwiP4gwRR3/SDa42g1YbVycTidUF3rKjyLFDWbg==", - "dev": true, - "license": "MIT", - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, - "node_modules/jest-resolve": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/jest-resolve/-/jest-resolve-29.7.0.tgz", - "integrity": "sha512-IOVhZSrg+UvVAshDSDtHyFCCBUl/Q3AAJv8iZ6ZjnZ74xzvwuzLXid9IIIPgTnY62SJjfuupMKZsZQRsCvxEgA==", - "dev": true, - "license": "MIT", - "dependencies": { - "chalk": "^4.0.0", - "graceful-fs": "^4.2.9", - "jest-haste-map": "^29.7.0", - "jest-pnp-resolver": "^1.2.2", - "jest-util": "^29.7.0", - "jest-validate": "^29.7.0", - "resolve": "^1.20.0", - "resolve.exports": "^2.0.0", - "slash": "^3.0.0" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, - "node_modules/jest-resolve-dependencies": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/jest-resolve-dependencies/-/jest-resolve-dependencies-29.7.0.tgz", - "integrity": "sha512-un0zD/6qxJ+S0et7WxeI3H5XSe9lTBBR7bOHCHXkKR6luG5mwDDlIzVQ0V5cZCuoTgEdcdwzTghYkTWfubi+nA==", - "dev": true, - "license": "MIT", - "dependencies": { - "jest-regex-util": "^29.6.3", - "jest-snapshot": "^29.7.0" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, - "node_modules/jest-runner": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/jest-runner/-/jest-runner-29.7.0.tgz", - "integrity": "sha512-fsc4N6cPCAahybGBfTRcq5wFR6fpLznMg47sY5aDpsoejOcVYFb07AHuSnR0liMcPTgBsA3ZJL6kFOjPdoNipQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "@jest/console": "^29.7.0", - "@jest/environment": "^29.7.0", - "@jest/test-result": "^29.7.0", - "@jest/transform": "^29.7.0", - "@jest/types": "^29.6.3", - "@types/node": "*", - "chalk": "^4.0.0", - "emittery": "^0.13.1", - "graceful-fs": "^4.2.9", - "jest-docblock": "^29.7.0", - "jest-environment-node": "^29.7.0", - "jest-haste-map": "^29.7.0", - "jest-leak-detector": "^29.7.0", - "jest-message-util": "^29.7.0", - "jest-resolve": "^29.7.0", - "jest-runtime": "^29.7.0", - "jest-util": "^29.7.0", - "jest-watcher": "^29.7.0", - "jest-worker": "^29.7.0", - "p-limit": "^3.1.0", - "source-map-support": "0.5.13" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, - "node_modules/jest-runtime": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/jest-runtime/-/jest-runtime-29.7.0.tgz", - "integrity": "sha512-gUnLjgwdGqW7B4LvOIkbKs9WGbn+QLqRQQ9juC6HndeDiezIwhDP+mhMwHWCEcfQ5RUXa6OPnFF8BJh5xegwwQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "@jest/environment": "^29.7.0", - "@jest/fake-timers": "^29.7.0", - "@jest/globals": "^29.7.0", - "@jest/source-map": "^29.6.3", - "@jest/test-result": "^29.7.0", - "@jest/transform": "^29.7.0", - "@jest/types": "^29.6.3", - "@types/node": "*", - "chalk": "^4.0.0", - "cjs-module-lexer": "^1.0.0", - "collect-v8-coverage": "^1.0.0", - "glob": "^7.1.3", - "graceful-fs": "^4.2.9", - "jest-haste-map": "^29.7.0", - "jest-message-util": "^29.7.0", - "jest-mock": "^29.7.0", - "jest-regex-util": "^29.6.3", - "jest-resolve": "^29.7.0", - "jest-snapshot": "^29.7.0", - "jest-util": "^29.7.0", - "slash": "^3.0.0", - "strip-bom": "^4.0.0" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, - "node_modules/jest-snapshot": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/jest-snapshot/-/jest-snapshot-29.7.0.tgz", - "integrity": "sha512-Rm0BMWtxBcioHr1/OX5YCP8Uov4riHvKPknOGs804Zg9JGZgmIBkbtlxJC/7Z4msKYVbIJtfU+tKb8xlYNfdkw==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/core": "^7.11.6", - "@babel/generator": "^7.7.2", - "@babel/plugin-syntax-jsx": "^7.7.2", - "@babel/plugin-syntax-typescript": "^7.7.2", - "@babel/types": "^7.3.3", - "@jest/expect-utils": "^29.7.0", - "@jest/transform": "^29.7.0", - "@jest/types": "^29.6.3", - "babel-preset-current-node-syntax": "^1.0.0", - "chalk": "^4.0.0", - "expect": "^29.7.0", - "graceful-fs": "^4.2.9", - "jest-diff": "^29.7.0", - "jest-get-type": "^29.6.3", - "jest-matcher-utils": "^29.7.0", - "jest-message-util": "^29.7.0", - "jest-util": "^29.7.0", - "natural-compare": "^1.4.0", - "pretty-format": "^29.7.0", - "semver": "^7.5.3" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, - "node_modules/jest-util": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/jest-util/-/jest-util-29.7.0.tgz", - "integrity": "sha512-z6EbKajIpqGKU56y5KBUgy1dt1ihhQJgWzUlZHArA/+X2ad7Cb5iF+AK1EWVL/Bo7Rz9uurpqw6SiBCefUbCGA==", - "dev": true, - "license": "MIT", - "dependencies": { - "@jest/types": "^29.6.3", - "@types/node": "*", - "chalk": "^4.0.0", - "ci-info": "^3.2.0", - "graceful-fs": "^4.2.9", - "picomatch": "^2.2.3" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, - "node_modules/jest-validate": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/jest-validate/-/jest-validate-29.7.0.tgz", - "integrity": "sha512-ZB7wHqaRGVw/9hST/OuFUReG7M8vKeq0/J2egIGLdvjHCmYqGARhzXmtgi+gVeZ5uXFF219aOc3Ls2yLg27tkw==", - "dev": true, - "license": "MIT", - "dependencies": { - "@jest/types": "^29.6.3", - "camelcase": "^6.2.0", - "chalk": "^4.0.0", - "jest-get-type": "^29.6.3", - "leven": "^3.1.0", - "pretty-format": "^29.7.0" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, - "node_modules/jest-validate/node_modules/camelcase": { - "version": "6.3.0", - "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-6.3.0.tgz", - "integrity": "sha512-Gmy6FhYlCY7uOElZUSbxo2UCDH8owEk996gkbrpsgGtrJLM3J7jGxl9Ic7Qwwj4ivOE5AWZWRMecDdF7hqGjFA==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/jest-watcher": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/jest-watcher/-/jest-watcher-29.7.0.tgz", - "integrity": "sha512-49Fg7WXkU3Vl2h6LbLtMQ/HyB6rXSIX7SqvBLQmssRBGN9I0PNvPmAmCWSOY6SOvrjhI/F7/bGAv9RtnsPA03g==", - "dev": true, - "license": "MIT", - "dependencies": { - "@jest/test-result": "^29.7.0", - "@jest/types": "^29.6.3", - "@types/node": "*", - "ansi-escapes": "^4.2.1", - "chalk": "^4.0.0", - "emittery": "^0.13.1", - "jest-util": "^29.7.0", - "string-length": "^4.0.1" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, - "node_modules/jest-worker": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/jest-worker/-/jest-worker-29.7.0.tgz", - "integrity": "sha512-eIz2msL/EzL9UFTFFx7jBTkeZfku0yUAyZZZmJ93H2TYEiroIx2PQjEXcwYtYl8zXCxb+PAmA2hLIt/6ZEkPHw==", - "dev": true, - "license": "MIT", - "dependencies": { - "@types/node": "*", - "jest-util": "^29.7.0", - "merge-stream": "^2.0.0", - "supports-color": "^8.0.0" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, - "node_modules/jest-worker/node_modules/supports-color": { - "version": "8.1.1", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-8.1.1.tgz", - "integrity": "sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q==", - "dev": true, - "license": "MIT", - "dependencies": { - "has-flag": "^4.0.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/supports-color?sponsor=1" - } - }, - "node_modules/js-tokens": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz", - "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==", - "dev": true, - "license": "MIT" - }, - "node_modules/js-yaml": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.0.tgz", - "integrity": "sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==", - "dev": true, - "license": "MIT", - "dependencies": { - "argparse": "^2.0.1" - }, - "bin": { - "js-yaml": "bin/js-yaml.js" - } - }, - "node_modules/jsesc": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-3.0.2.tgz", - "integrity": "sha512-xKqzzWXDttJuOcawBt4KnKHHIf5oQ/Cxax+0PWFG+DFDgHNAdi+TXECADI+RYiFUMmx8792xsMbbgXj4CwnP4g==", - "dev": true, - "license": "MIT", - "bin": { - "jsesc": "bin/jsesc" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/json-buffer": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/json-buffer/-/json-buffer-3.0.1.tgz", - "integrity": "sha512-4bV5BfR2mqfQTJm+V5tPPdf+ZpuhiIvTuAB5g8kcrXOZpTT/QwwVRWBywX1ozr6lEuPdbHxwaJlm9G6mI2sfSQ==", - "dev": true, - "license": "MIT" - }, - "node_modules/json-parse-even-better-errors": { - "version": "2.3.1", - "resolved": "https://registry.npmjs.org/json-parse-even-better-errors/-/json-parse-even-better-errors-2.3.1.tgz", - "integrity": "sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w==", - "dev": true, - "license": "MIT" - }, - "node_modules/json-schema-traverse": { - "version": "0.4.1", - "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", - "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==", - "dev": true, - "license": "MIT" - }, - "node_modules/json-stable-stringify-without-jsonify": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz", - "integrity": "sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw==", - "dev": true, - "license": "MIT" - }, - "node_modules/json5": { - "version": "2.2.3", - "resolved": "https://registry.npmjs.org/json5/-/json5-2.2.3.tgz", - "integrity": "sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg==", - "dev": true, - "license": "MIT", - "bin": { - "json5": "lib/cli.js" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/jsx-ast-utils": { - "version": "3.3.5", - "resolved": "https://registry.npmjs.org/jsx-ast-utils/-/jsx-ast-utils-3.3.5.tgz", - "integrity": "sha512-ZZow9HBI5O6EPgSJLUb8n2NKgmVWTwCvHGwFuJlMjvLFqlGG6pjirPhtdsseaLZjSibD8eegzmYpUZwoIlj2cQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "array-includes": "^3.1.6", - "array.prototype.flat": "^1.3.1", - "object.assign": "^4.1.4", - "object.values": "^1.1.6" - }, - "engines": { - "node": ">=4.0" - } - }, - "node_modules/keyv": { - "version": "4.5.4", - "resolved": "https://registry.npmjs.org/keyv/-/keyv-4.5.4.tgz", - "integrity": "sha512-oxVHkHR/EJf2CNXnWxRLW6mg7JyCCUcG0DtEGmL2ctUo1PNTin1PUil+r/+4r5MpVgC/fn1kjsx7mjSujKqIpw==", - "dev": true, - "license": "MIT", - "dependencies": { - "json-buffer": "3.0.1" - } - }, - "node_modules/kleur": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/kleur/-/kleur-3.0.3.tgz", - "integrity": "sha512-eTIzlVOSUR+JxdDFepEYcBMtZ9Qqdef+rnzWdRZuMbOywu5tO2w2N7rqjoANZ5k9vywhL6Br1VRjUIgTQx4E8w==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=6" - } - }, - "node_modules/language-subtag-registry": { - "version": "0.3.23", - "resolved": "https://registry.npmjs.org/language-subtag-registry/-/language-subtag-registry-0.3.23.tgz", - "integrity": "sha512-0K65Lea881pHotoGEa5gDlMxt3pctLi2RplBb7Ezh4rRdLEOtgi7n4EwK9lamnUCkKBqaeKRVebTq6BAxSkpXQ==", - "dev": true, - "license": "CC0-1.0" - }, - "node_modules/language-tags": { - "version": "1.0.9", - "resolved": "https://registry.npmjs.org/language-tags/-/language-tags-1.0.9.tgz", - "integrity": "sha512-MbjN408fEndfiQXbFQ1vnd+1NoLDsnQW41410oQBXiyXDMYH5z505juWa4KUE1LqxRC7DgOgZDbKLxHIwm27hA==", - "dev": true, - "license": "MIT", - "dependencies": { - "language-subtag-registry": "^0.3.20" - }, - "engines": { - "node": ">=0.10" - } - }, - "node_modules/leven": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/leven/-/leven-3.1.0.tgz", - "integrity": "sha512-qsda+H8jTaUaN/x5vzW2rzc+8Rw4TAQ/4KjB46IwK5VH+IlVeeeje/EoZRpiXvIqjFgK84QffqPztGI3VBLG1A==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=6" - } - }, - "node_modules/levn": { - "version": "0.4.1", - "resolved": "https://registry.npmjs.org/levn/-/levn-0.4.1.tgz", - "integrity": "sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "prelude-ls": "^1.2.1", - "type-check": "~0.4.0" - }, - "engines": { - "node": ">= 0.8.0" - } - }, - "node_modules/lines-and-columns": { - "version": "1.2.4", - "resolved": "https://registry.npmjs.org/lines-and-columns/-/lines-and-columns-1.2.4.tgz", - "integrity": "sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg==", - "dev": true, - "license": "MIT" - }, - "node_modules/locate-path": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-6.0.0.tgz", - "integrity": "sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==", - "dev": true, - "license": "MIT", - "dependencies": { - "p-locate": "^5.0.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/lodash": { - "version": "4.17.21", - "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz", - "integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==", - "license": "MIT" - }, - "node_modules/lodash.camelcase": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/lodash.camelcase/-/lodash.camelcase-4.3.0.tgz", - "integrity": "sha512-TwuEnCnxbc3rAvhf/LbG7tJUDzhqXyFnv3dtzLOPgCG/hODL7WFnsbwktkD7yUV0RrreP/l1PALq/YSg6VvjlA==", - "dev": true, - "license": "MIT" - }, - "node_modules/lodash.kebabcase": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/lodash.kebabcase/-/lodash.kebabcase-4.1.1.tgz", - "integrity": "sha512-N8XRTIMMqqDgSy4VLKPnJ/+hpGZN+PHQiJnSenYqPaVV/NCqEogTnAdZLQiGKhxX+JCs8waWq2t1XHWKOmlY8g==", - "dev": true, - "license": "MIT" - }, - "node_modules/lodash.memoize": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/lodash.memoize/-/lodash.memoize-4.1.2.tgz", - "integrity": "sha512-t7j+NzmgnQzTAYXcsHYLgimltOV1MXHtlOWf6GjL9Kj8GK5FInw5JotxvbOs+IvV1/Dzo04/fCGfLVs7aXb4Ag==", - "dev": true, - "license": "MIT" - }, - "node_modules/lodash.merge": { - "version": "4.6.2", - "resolved": "https://registry.npmjs.org/lodash.merge/-/lodash.merge-4.6.2.tgz", - "integrity": "sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==", - "dev": true, - "license": "MIT" - }, - "node_modules/lodash.snakecase": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/lodash.snakecase/-/lodash.snakecase-4.1.1.tgz", - "integrity": "sha512-QZ1d4xoBHYUeuouhEq3lk3Uq7ldgyFXGBhg04+oRLnIz8o9T65Eh+8YdroUwn846zchkA9yDsDl5CVVaV2nqYw==", - "dev": true, - "license": "MIT" - }, - "node_modules/lodash.upperfirst": { - "version": "4.3.1", - "resolved": "https://registry.npmjs.org/lodash.upperfirst/-/lodash.upperfirst-4.3.1.tgz", - "integrity": "sha512-sReKOYJIJf74dhJONhU4e0/shzi1trVbSWDOhKYE5XV2O+H7Sb2Dihwuc7xWxVl+DgFPyTqIN3zMfT9cq5iWDg==", - "dev": true, - "license": "MIT" - }, - "node_modules/lru-cache": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-5.1.1.tgz", - "integrity": "sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==", - "dev": true, - "license": "ISC", - "dependencies": { - "yallist": "^3.0.2" - } - }, - "node_modules/make-dir": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-4.0.0.tgz", - "integrity": "sha512-hXdUTZYIVOt1Ex//jAQi+wTZZpUpwBj/0QsOzqegb3rGMMeJiSEu5xLHnYfBrRV4RH2+OCSOO95Is/7x1WJ4bw==", - "dev": true, - "license": "MIT", - "dependencies": { - "semver": "^7.5.3" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/make-error": { - "version": "1.3.6", - "resolved": "https://registry.npmjs.org/make-error/-/make-error-1.3.6.tgz", - "integrity": "sha512-s8UhlNe7vPKomQhC1qFelMokr/Sc3AgNbso3n74mVPA5LTZwkB9NlXf4XPamLxJE8h0gh73rM94xvwRT2CVInw==", - "dev": true, - "license": "ISC" - }, - "node_modules/makeerror": { - "version": "1.0.12", - "resolved": "https://registry.npmjs.org/makeerror/-/makeerror-1.0.12.tgz", - "integrity": "sha512-JmqCvUhmt43madlpFzG4BQzG2Z3m6tvQDNKdClZnO3VbIudJYmxsT0FNJMeiB2+JTSlTQTSbU8QdesVmwJcmLg==", - "dev": true, - "license": "BSD-3-Clause", - "dependencies": { - "tmpl": "1.0.5" - } - }, - "node_modules/merge-stream": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/merge-stream/-/merge-stream-2.0.0.tgz", - "integrity": "sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w==", - "dev": true, - "license": "MIT" - }, - "node_modules/merge2": { - "version": "1.4.1", - "resolved": "https://registry.npmjs.org/merge2/-/merge2-1.4.1.tgz", - "integrity": "sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 8" - } - }, - "node_modules/micromatch": { - "version": "4.0.8", - "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.8.tgz", - "integrity": "sha512-PXwfBhYu0hBCPw8Dn0E+WDYb7af3dSLVWKi3HGv84IdF4TyFoC0ysxFd0Goxw7nSv4T/PzEJQxsYsEiFCKo2BA==", - "dev": true, - "license": "MIT", - "dependencies": { - "braces": "^3.0.3", - "picomatch": "^2.3.1" - }, - "engines": { - "node": ">=8.6" - } - }, - "node_modules/mimic-fn": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-2.1.0.tgz", - "integrity": "sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=6" - } - }, - "node_modules/minimatch": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", - "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", - "license": "ISC", - "dependencies": { - "brace-expansion": "^1.1.7" - }, - "engines": { - "node": "*" - } - }, - "node_modules/minimist": { - "version": "1.2.8", - "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.8.tgz", - "integrity": "sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==", - "dev": true, - "license": "MIT", - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/ms": { - "version": "2.1.3", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", - "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==", - "dev": true, - "license": "MIT" - }, - "node_modules/natural-compare": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/natural-compare/-/natural-compare-1.4.0.tgz", - "integrity": "sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==", - "dev": true, - "license": "MIT" - }, - "node_modules/node-int64": { - "version": "0.4.0", - "resolved": "https://registry.npmjs.org/node-int64/-/node-int64-0.4.0.tgz", - "integrity": "sha512-O5lz91xSOeoXP6DulyHfllpq+Eg00MWitZIbtPfoSEvqIHdl5gfcY6hYzDWnj0qD5tz52PI08u9qUvSVeUBeHw==", - "dev": true, - "license": "MIT" - }, - "node_modules/node-releases": { - "version": "2.0.18", - "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.18.tgz", - "integrity": "sha512-d9VeXT4SJ7ZeOqGX6R5EM022wpL+eWPooLI+5UpWn2jCT1aosUQEhQP214x33Wkwx3JQMvIm+tIoVOdodFS40g==", - "dev": true, - "license": "MIT" - }, - "node_modules/normalize-path": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz", - "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/npm-run-path": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-4.0.1.tgz", - "integrity": "sha512-S48WzZW777zhNIrn7gxOlISNAqi9ZC/uQFnRdbeIHhZhCA6UqpkOT8T1G7BvfdgP4Er8gF4sUbaS0i7QvIfCWw==", - "dev": true, - "license": "MIT", - "dependencies": { - "path-key": "^3.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/object-inspect": { - "version": "1.13.2", - "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.13.2.tgz", - "integrity": "sha512-IRZSRuzJiynemAXPYtPe5BoI/RESNYR7TYm50MC5Mqbd3Jmw5y790sErYw3V6SryFJD64b74qQQs9wn5Bg/k3g==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/object-is": { - "version": "1.1.6", - "resolved": "https://registry.npmjs.org/object-is/-/object-is-1.1.6.tgz", - "integrity": "sha512-F8cZ+KfGlSGi09lJT7/Nd6KJZ9ygtvYC0/UYYLI9nmQKLMnydpB9yvbv9K1uSkEu7FU9vYPmVwLg328tX+ot3Q==", - "dev": true, - "license": "MIT", - "dependencies": { - "call-bind": "^1.0.7", - "define-properties": "^1.2.1" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/object-keys": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/object-keys/-/object-keys-1.1.1.tgz", - "integrity": "sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/object.assign": { - "version": "4.1.5", - "resolved": "https://registry.npmjs.org/object.assign/-/object.assign-4.1.5.tgz", - "integrity": "sha512-byy+U7gp+FVwmyzKPYhW2h5l3crpmGsxl7X2s8y43IgxvG4g3QZ6CffDtsNQy1WsmZpQbO+ybo0AlW7TY6DcBQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "call-bind": "^1.0.5", - "define-properties": "^1.2.1", - "has-symbols": "^1.0.3", - "object-keys": "^1.1.1" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/object.fromentries": { - "version": "2.0.8", - "resolved": "https://registry.npmjs.org/object.fromentries/-/object.fromentries-2.0.8.tgz", - "integrity": "sha512-k6E21FzySsSK5a21KRADBd/NGneRegFO5pLHfdQLpRDETUNJueLXs3WCzyQ3tFRDYgbq3KHGXfTbi2bs8WQ6rQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "call-bind": "^1.0.7", - "define-properties": "^1.2.1", - "es-abstract": "^1.23.2", - "es-object-atoms": "^1.0.0" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/object.groupby": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/object.groupby/-/object.groupby-1.0.3.tgz", - "integrity": "sha512-+Lhy3TQTuzXI5hevh8sBGqbmurHbbIjAi0Z4S63nthVLmLxfbj4T54a4CfZrXIrt9iP4mVAPYMo/v99taj3wjQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "call-bind": "^1.0.7", - "define-properties": "^1.2.1", - "es-abstract": "^1.23.2" - }, - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/object.values": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/object.values/-/object.values-1.2.0.tgz", - "integrity": "sha512-yBYjY9QX2hnRmZHAjG/f13MzmBzxzYgQhFrke06TTyKY5zSTEqkOeukBzIdVA3j3ulu8Qa3MbVFShV7T2RmGtQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "call-bind": "^1.0.7", - "define-properties": "^1.2.1", - "es-object-atoms": "^1.0.0" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/once": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", - "integrity": "sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==", - "license": "ISC", - "dependencies": { - "wrappy": "1" - } - }, - "node_modules/onetime": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/onetime/-/onetime-5.1.2.tgz", - "integrity": "sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg==", - "dev": true, - "license": "MIT", - "dependencies": { - "mimic-fn": "^2.1.0" - }, - "engines": { - "node": ">=6" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/optionator": { - "version": "0.9.4", - "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.9.4.tgz", - "integrity": "sha512-6IpQ7mKUxRcZNLIObR0hz7lxsapSSIYNZJwXPGeF0mTVqGKFIXj1DQcMoT22S3ROcLyY/rz0PWaWZ9ayWmad9g==", - "dev": true, - "license": "MIT", - "dependencies": { - "deep-is": "^0.1.3", - "fast-levenshtein": "^2.0.6", - "levn": "^0.4.1", - "prelude-ls": "^1.2.1", - "type-check": "^0.4.0", - "word-wrap": "^1.2.5" - }, - "engines": { - "node": ">= 0.8.0" - } - }, - "node_modules/p-limit": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-3.1.0.tgz", - "integrity": "sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "yocto-queue": "^0.1.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/p-locate": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-5.0.0.tgz", - "integrity": "sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==", - "dev": true, - "license": "MIT", - "dependencies": { - "p-limit": "^3.0.2" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/p-try": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/p-try/-/p-try-2.2.0.tgz", - "integrity": "sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=6" - } - }, - "node_modules/parent-module": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/parent-module/-/parent-module-1.0.1.tgz", - "integrity": "sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==", - "dev": true, - "license": "MIT", - "dependencies": { - "callsites": "^3.0.0" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/parse-json": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-5.2.0.tgz", - "integrity": "sha512-ayCKvm/phCGxOkYRSCM82iDwct8/EonSEgCSxWxD7ve6jHggsFl4fZVQBPRNgQoKiuV/odhFrGzQXZwbifC8Rg==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/code-frame": "^7.0.0", - "error-ex": "^1.3.1", - "json-parse-even-better-errors": "^2.3.0", - "lines-and-columns": "^1.1.6" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/path-exists": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz", - "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=8" - } - }, - "node_modules/path-is-absolute": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", - "integrity": "sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==", - "license": "MIT", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/path-key": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz", - "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=8" - } - }, - "node_modules/path-parse": { - "version": "1.0.7", - "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.7.tgz", - "integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==", - "license": "MIT" - }, - "node_modules/path-type": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/path-type/-/path-type-4.0.0.tgz", - "integrity": "sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=8" - } - }, - "node_modules/picocolors": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.1.0.tgz", - "integrity": "sha512-TQ92mBOW0l3LeMeyLV6mzy/kWr8lkd/hp3mTg7wYK7zJhuBStmGMBG0BdeDZS/dZx1IukaX6Bk11zcln25o1Aw==", - "dev": true, - "license": "ISC" - }, - "node_modules/picomatch": { - "version": "2.3.1", - "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz", - "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=8.6" - }, - "funding": { - "url": "https://github.com/sponsors/jonschlinkert" - } - }, - "node_modules/pirates": { - "version": "4.0.6", - "resolved": "https://registry.npmjs.org/pirates/-/pirates-4.0.6.tgz", - "integrity": "sha512-saLsH7WeYYPiD25LDuLRRY/i+6HaPYr6G1OUlN39otzkSTxKnubR9RTxS3/Kk50s1g2JTgFwWQDQyplC5/SHZg==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 6" - } - }, - "node_modules/pkg-dir": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-4.2.0.tgz", - "integrity": "sha512-HRDzbaKjC+AOWVXxAU/x54COGeIv9eb+6CkDSQoNTt4XyWoIJvuPsXizxu/Fr23EiekbtZwmh1IcIG/l/a10GQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "find-up": "^4.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/pkg-dir/node_modules/find-up": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz", - "integrity": "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==", - "dev": true, - "license": "MIT", - "dependencies": { - "locate-path": "^5.0.0", - "path-exists": "^4.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/pkg-dir/node_modules/locate-path": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz", - "integrity": "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==", - "dev": true, - "license": "MIT", - "dependencies": { - "p-locate": "^4.1.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/pkg-dir/node_modules/p-limit": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz", - "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==", - "dev": true, - "license": "MIT", - "dependencies": { - "p-try": "^2.0.0" - }, - "engines": { - "node": ">=6" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/pkg-dir/node_modules/p-locate": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-4.1.0.tgz", - "integrity": "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==", - "dev": true, - "license": "MIT", - "dependencies": { - "p-limit": "^2.2.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/possible-typed-array-names": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/possible-typed-array-names/-/possible-typed-array-names-1.0.0.tgz", - "integrity": "sha512-d7Uw+eZoloe0EHDIYoe+bQ5WXnGMOpmiZFTuMWCwpjzzkL2nTjcKiAk4hh8TjnGye2TwWOk3UXucZ+3rbmBa8Q==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/prelude-ls": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.2.1.tgz", - "integrity": "sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 0.8.0" - } - }, - "node_modules/prettier": { - "version": "3.3.3", - "resolved": "https://registry.npmjs.org/prettier/-/prettier-3.3.3.tgz", - "integrity": "sha512-i2tDNA0O5IrMO757lfrdQZCc2jPNDVntV0m/+4whiDfWaTKfMNgR7Qz0NAeGz/nRqF4m5/6CLzbP4/liHt12Ew==", - "dev": true, - "license": "MIT", - "bin": { - "prettier": "bin/prettier.cjs" - }, - "engines": { - "node": ">=14" - }, - "funding": { - "url": "https://github.com/prettier/prettier?sponsor=1" - } - }, - "node_modules/prettier-linter-helpers": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/prettier-linter-helpers/-/prettier-linter-helpers-1.0.0.tgz", - "integrity": "sha512-GbK2cP9nraSSUF9N2XwUwqfzlAFlMNYYl+ShE/V+H8a9uNl/oUqB1w2EL54Jh0OlyRSd8RfWYJ3coVS4TROP2w==", - "dev": true, - "license": "MIT", - "dependencies": { - "fast-diff": "^1.1.2" - }, - "engines": { - "node": ">=6.0.0" - } - }, - "node_modules/pretty-format": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-29.7.0.tgz", - "integrity": "sha512-Pdlw/oPxN+aXdmM9R00JVC9WVFoCLTKJvDVLgmJ+qAffBMxsV85l/Lu7sNx4zSzPyoL2euImuEwHhOXdEgNFZQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "@jest/schemas": "^29.6.3", - "ansi-styles": "^5.0.0", - "react-is": "^18.0.0" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, - "node_modules/pretty-format/node_modules/ansi-styles": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-5.2.0.tgz", - "integrity": "sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" - } - }, - "node_modules/prompts": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/prompts/-/prompts-2.4.2.tgz", - "integrity": "sha512-NxNv/kLguCA7p3jE8oL2aEBsrJWgAakBpgmgK6lpPWV+WuOmY6r2/zbAVnP+T8bQlA0nzHXSJSJW0Hq7ylaD2Q==", - "dev": true, - "license": "MIT", - "dependencies": { - "kleur": "^3.0.3", - "sisteransi": "^1.0.5" - }, - "engines": { - "node": ">= 6" - } - }, - "node_modules/punycode": { - "version": "2.3.1", - "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.3.1.tgz", - "integrity": "sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=6" - } - }, - "node_modules/pure-rand": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/pure-rand/-/pure-rand-6.1.0.tgz", - "integrity": "sha512-bVWawvoZoBYpp6yIoQtQXHZjmz35RSVHnUOTefl8Vcjr8snTPY1wnpSPMWekcFwbxI6gtmT7rSYPFvz71ldiOA==", - "dev": true, - "funding": [ - { - "type": "individual", - "url": "https://github.com/sponsors/dubzzz" - }, - { - "type": "opencollective", - "url": "https://opencollective.com/fast-check" - } - ], - "license": "MIT" - }, - "node_modules/queue-microtask": { - "version": "1.2.3", - "resolved": "https://registry.npmjs.org/queue-microtask/-/queue-microtask-1.2.3.tgz", - "integrity": "sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==", - "dev": true, - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/feross" - }, - { - "type": "patreon", - "url": "https://www.patreon.com/feross" - }, - { - "type": "consulting", - "url": "https://feross.org/support" - } - ], - "license": "MIT" - }, - "node_modules/react-is": { - "version": "18.3.1", - "resolved": "https://registry.npmjs.org/react-is/-/react-is-18.3.1.tgz", - "integrity": "sha512-/LLMVyas0ljjAtoYiPqYiL8VWXzUUdThrmU5+n20DZv+a+ClRoevUzw5JxU+Ieh5/c87ytoTBV9G1FiKfNJdmg==", - "dev": true, - "license": "MIT" - }, - "node_modules/rechoir": { - "version": "0.6.2", - "resolved": "https://registry.npmjs.org/rechoir/-/rechoir-0.6.2.tgz", - "integrity": "sha512-HFM8rkZ+i3zrV+4LQjwQ0W+ez98pApMGM3HUrN04j3CqzPOzl9nmP15Y8YXNm8QHGv/eacOVEjqhmWpkRV0NAw==", - "dependencies": { - "resolve": "^1.1.6" - }, - "engines": { - "node": ">= 0.10" - } - }, - "node_modules/reflect.getprototypeof": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/reflect.getprototypeof/-/reflect.getprototypeof-1.0.6.tgz", - "integrity": "sha512-fmfw4XgoDke3kdI6h4xcUz1dG8uaiv5q9gcEwLS4Pnth2kxT+GZ7YehS1JTMGBQmtV7Y4GFGbs2re2NqhdozUg==", - "dev": true, - "license": "MIT", - "dependencies": { - "call-bind": "^1.0.7", - "define-properties": "^1.2.1", - "es-abstract": "^1.23.1", - "es-errors": "^1.3.0", - "get-intrinsic": "^1.2.4", - "globalthis": "^1.0.3", - "which-builtin-type": "^1.1.3" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/regexp.prototype.flags": { - "version": "1.5.3", - "resolved": "https://registry.npmjs.org/regexp.prototype.flags/-/regexp.prototype.flags-1.5.3.tgz", - "integrity": "sha512-vqlC04+RQoFalODCbCumG2xIOvapzVMHwsyIGM/SIE8fRhFFsXeH8/QQ+s0T0kDAhKc4k30s73/0ydkHQz6HlQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "call-bind": "^1.0.7", - "define-properties": "^1.2.1", - "es-errors": "^1.3.0", - "set-function-name": "^2.0.2" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/require-directory": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz", - "integrity": "sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/resolve": { - "version": "1.22.8", - "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.8.tgz", - "integrity": "sha512-oKWePCxqpd6FlLvGV1VU0x7bkPmmCNolxzjMf4NczoDnQcIWrAF+cPtZn5i6n+RfD2d9i0tzpKnG6Yk168yIyw==", - "license": "MIT", - "dependencies": { - "is-core-module": "^2.13.0", - "path-parse": "^1.0.7", - "supports-preserve-symlinks-flag": "^1.0.0" - }, - "bin": { - "resolve": "bin/resolve" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/resolve-cwd": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/resolve-cwd/-/resolve-cwd-3.0.0.tgz", - "integrity": "sha512-OrZaX2Mb+rJCpH/6CpSqt9xFVpN++x01XnN2ie9g6P5/3xelLAkXWVADpdz1IHD/KFfEXyE6V0U01OQ3UO2rEg==", - "dev": true, - "license": "MIT", - "dependencies": { - "resolve-from": "^5.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/resolve-cwd/node_modules/resolve-from": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-5.0.0.tgz", - "integrity": "sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=8" - } - }, - "node_modules/resolve-from": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-4.0.0.tgz", - "integrity": "sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=4" - } - }, - "node_modules/resolve.exports": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/resolve.exports/-/resolve.exports-2.0.2.tgz", - "integrity": "sha512-X2UW6Nw3n/aMgDVy+0rSqgHlv39WZAlZrXCdnbyEiKm17DSqHX4MmQMaST3FbeWR5FTuRcUwYAziZajji0Y7mg==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=10" - } - }, - "node_modules/reusify": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/reusify/-/reusify-1.0.4.tgz", - "integrity": "sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==", - "dev": true, - "license": "MIT", - "engines": { - "iojs": ">=1.0.0", - "node": ">=0.10.0" - } - }, - "node_modules/rimraf": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz", - "integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==", - "deprecated": "Rimraf versions prior to v4 are no longer supported", - "dev": true, - "license": "ISC", - "dependencies": { - "glob": "^7.1.3" - }, - "bin": { - "rimraf": "bin.js" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "node_modules/run-parallel": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/run-parallel/-/run-parallel-1.2.0.tgz", - "integrity": "sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==", - "dev": true, - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/feross" - }, - { - "type": "patreon", - "url": "https://www.patreon.com/feross" - }, - { - "type": "consulting", - "url": "https://feross.org/support" - } - ], - "license": "MIT", - "dependencies": { - "queue-microtask": "^1.2.2" - } - }, - "node_modules/safe-array-concat": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/safe-array-concat/-/safe-array-concat-1.1.2.tgz", - "integrity": "sha512-vj6RsCsWBCf19jIeHEfkRMw8DPiBb+DMXklQ/1SGDHOMlHdPUkZXFQ2YdplS23zESTijAcurb1aSgJA3AgMu1Q==", - "dev": true, - "license": "MIT", - "dependencies": { - "call-bind": "^1.0.7", - "get-intrinsic": "^1.2.4", - "has-symbols": "^1.0.3", - "isarray": "^2.0.5" - }, - "engines": { - "node": ">=0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/safe-regex-test": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/safe-regex-test/-/safe-regex-test-1.0.3.tgz", - "integrity": "sha512-CdASjNJPvRa7roO6Ra/gLYBTzYzzPyyBXxIMdGW3USQLyjWEls2RgW5UBTXaQVp+OrpeCK3bLem8smtmheoRuw==", - "dev": true, - "license": "MIT", - "dependencies": { - "call-bind": "^1.0.6", - "es-errors": "^1.3.0", - "is-regex": "^1.1.4" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/semver": { - "version": "7.6.3", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.6.3.tgz", - "integrity": "sha512-oVekP1cKtI+CTDvHWYFUcMtsK/00wmAEfyqKfNdARm8u1wNVhSgaX7A8d4UuIlUI5e84iEwOhs7ZPYRmzU9U6A==", - "dev": true, - "license": "ISC", - "bin": { - "semver": "bin/semver.js" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/set-function-length": { - "version": "1.2.2", - "resolved": "https://registry.npmjs.org/set-function-length/-/set-function-length-1.2.2.tgz", - "integrity": "sha512-pgRc4hJ4/sNjWCSS9AmnS40x3bNMDTknHgL5UaMBTMyJnU90EgWh1Rz+MC9eFu4BuN/UwZjKQuY/1v3rM7HMfg==", - "dev": true, - "license": "MIT", - "dependencies": { - "define-data-property": "^1.1.4", - "es-errors": "^1.3.0", - "function-bind": "^1.1.2", - "get-intrinsic": "^1.2.4", - "gopd": "^1.0.1", - "has-property-descriptors": "^1.0.2" - }, - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/set-function-name": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/set-function-name/-/set-function-name-2.0.2.tgz", - "integrity": "sha512-7PGFlmtwsEADb0WYyvCMa1t+yke6daIG4Wirafur5kcf+MhUnPms1UeR0CKQdTZD81yESwMHbtn+TR+dMviakQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "define-data-property": "^1.1.4", - "es-errors": "^1.3.0", - "functions-have-names": "^1.2.3", - "has-property-descriptors": "^1.0.2" - }, - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/shebang-command": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz", - "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==", - "dev": true, - "license": "MIT", - "dependencies": { - "shebang-regex": "^3.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/shebang-regex": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz", - "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=8" - } - }, - "node_modules/shelljs": { - "version": "0.8.5", - "resolved": "https://registry.npmjs.org/shelljs/-/shelljs-0.8.5.tgz", - "integrity": "sha512-TiwcRcrkhHvbrZbnRcFYMLl30Dfov3HKqzp5tO5b4pt6G/SezKcYhmDg15zXVBswHmctSAQKznqNW2LO5tTDow==", - "license": "BSD-3-Clause", - "dependencies": { - "glob": "^7.0.0", - "interpret": "^1.0.0", - "rechoir": "^0.6.2" - }, - "bin": { - "shjs": "bin/shjs" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/side-channel": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.0.6.tgz", - "integrity": "sha512-fDW/EZ6Q9RiO8eFG8Hj+7u/oW+XrPTIChwCOM2+th2A6OblDtYYIpve9m+KvI9Z4C9qSEXlaGR6bTEYHReuglA==", - "dev": true, - "license": "MIT", - "dependencies": { - "call-bind": "^1.0.7", - "es-errors": "^1.3.0", - "get-intrinsic": "^1.2.4", - "object-inspect": "^1.13.1" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/signal-exit": { - "version": "3.0.7", - "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.7.tgz", - "integrity": "sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==", - "dev": true, - "license": "ISC" - }, - "node_modules/sisteransi": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/sisteransi/-/sisteransi-1.0.5.tgz", - "integrity": "sha512-bLGGlR1QxBcynn2d5YmDX4MGjlZvy2MRBDRNHLJ8VI6l6+9FUiyTFNJ0IveOSP0bcXgVDPRcfGqA0pjaqUpfVg==", - "dev": true, - "license": "MIT" - }, - "node_modules/slash": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/slash/-/slash-3.0.0.tgz", - "integrity": "sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=8" - } - }, - "node_modules/source-map": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", - "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", - "dev": true, - "license": "BSD-3-Clause", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/source-map-support": { - "version": "0.5.13", - "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.13.tgz", - "integrity": "sha512-SHSKFHadjVA5oR4PPqhtAVdcBWwRYVd6g6cAXnIbRiIwc2EhPrTuKUBdSLvlEKyIP3GCf89fltvcZiP9MMFA1w==", - "dev": true, - "license": "MIT", - "dependencies": { - "buffer-from": "^1.0.0", - "source-map": "^0.6.0" - } - }, - "node_modules/sprintf-js": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz", - "integrity": "sha512-D9cPgkvLlV3t3IzL0D0YLvGA9Ahk4PcvVwUbN0dSGr1aP0Nrt4AEnTUbuGvquEC0mA64Gqt1fzirlRs5ibXx8g==", - "dev": true, - "license": "BSD-3-Clause" - }, - "node_modules/stack-utils": { - "version": "2.0.6", - "resolved": "https://registry.npmjs.org/stack-utils/-/stack-utils-2.0.6.tgz", - "integrity": "sha512-XlkWvfIm6RmsWtNJx+uqtKLS8eqFbxUg0ZzLXqY0caEy9l7hruX8IpiDnjsLavoBgqCCR71TqWO8MaXYheJ3RQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "escape-string-regexp": "^2.0.0" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/stack-utils/node_modules/escape-string-regexp": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-2.0.0.tgz", - "integrity": "sha512-UpzcLCXolUWcNu5HtVMHYdXJjArjsF9C0aNnquZYY4uW/Vu0miy5YoWvbV345HauVvcAUnpRuhMMcqTcGOY2+w==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=8" - } - }, - "node_modules/stop-iteration-iterator": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/stop-iteration-iterator/-/stop-iteration-iterator-1.0.0.tgz", - "integrity": "sha512-iCGQj+0l0HOdZ2AEeBADlsRC+vsnDsZsbdSiH1yNSjcfKM7fdpCMfqAL/dwF5BLiw/XhRft/Wax6zQbhq2BcjQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "internal-slot": "^1.0.4" - }, - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/string-length": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/string-length/-/string-length-4.0.2.tgz", - "integrity": "sha512-+l6rNN5fYHNhZZy41RXsYptCjA2Igmq4EG7kZAYFQI1E1VTXarr6ZPXBg6eq7Y6eK4FEhY6AJlyuFIb/v/S0VQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "char-regex": "^1.0.2", - "strip-ansi": "^6.0.0" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/string-width": { - "version": "4.2.3", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", - "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", - "dev": true, - "license": "MIT", - "dependencies": { - "emoji-regex": "^8.0.0", - "is-fullwidth-code-point": "^3.0.0", - "strip-ansi": "^6.0.1" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/string-width/node_modules/emoji-regex": { - "version": "8.0.0", - "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", - "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", - "dev": true, - "license": "MIT" - }, - "node_modules/string.prototype.includes": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/string.prototype.includes/-/string.prototype.includes-2.0.0.tgz", - "integrity": "sha512-E34CkBgyeqNDcrbU76cDjL5JLcVrtSdYq0MEh/B10r17pRP4ciHLwTgnuLV8Ay6cgEMLkcBkFCKyFZ43YldYzg==", - "dev": true, - "license": "MIT", - "dependencies": { - "define-properties": "^1.1.3", - "es-abstract": "^1.17.5" - } - }, - "node_modules/string.prototype.trim": { - "version": "1.2.9", - "resolved": "https://registry.npmjs.org/string.prototype.trim/-/string.prototype.trim-1.2.9.tgz", - "integrity": "sha512-klHuCNxiMZ8MlsOihJhJEBJAiMVqU3Z2nEXWfWnIqjN0gEFS9J9+IxKozWWtQGcgoa1WUZzLjKPTr4ZHNFTFxw==", - "dev": true, - "license": "MIT", - "dependencies": { - "call-bind": "^1.0.7", - "define-properties": "^1.2.1", - "es-abstract": "^1.23.0", - "es-object-atoms": "^1.0.0" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/string.prototype.trimend": { - "version": "1.0.8", - "resolved": "https://registry.npmjs.org/string.prototype.trimend/-/string.prototype.trimend-1.0.8.tgz", - "integrity": "sha512-p73uL5VCHCO2BZZ6krwwQE3kCzM7NKmis8S//xEC6fQonchbum4eP6kR4DLEjQFO3Wnj3Fuo8NM0kOSjVdHjZQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "call-bind": "^1.0.7", - "define-properties": "^1.2.1", - "es-object-atoms": "^1.0.0" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/string.prototype.trimstart": { - "version": "1.0.8", - "resolved": "https://registry.npmjs.org/string.prototype.trimstart/-/string.prototype.trimstart-1.0.8.tgz", - "integrity": "sha512-UXSH262CSZY1tfu3G3Secr6uGLCFVPMhIqHjlgCUtCCcgihYc/xKs9djMTMUOb2j1mVSeU8EU6NWc/iQKU6Gfg==", - "dev": true, - "license": "MIT", - "dependencies": { - "call-bind": "^1.0.7", - "define-properties": "^1.2.1", - "es-object-atoms": "^1.0.0" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/strip-ansi": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", - "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", - "dev": true, - "license": "MIT", - "dependencies": { - "ansi-regex": "^5.0.1" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/strip-bom": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-4.0.0.tgz", - "integrity": "sha512-3xurFv5tEgii33Zi8Jtp55wEIILR9eh34FAW00PZf+JnSsTmV/ioewSgQl97JHvgjoRGwPShsWm+IdrxB35d0w==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=8" - } - }, - "node_modules/strip-final-newline": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/strip-final-newline/-/strip-final-newline-2.0.0.tgz", - "integrity": "sha512-BrpvfNAE3dcvq7ll3xVumzjKjZQ5tI1sEUIKr3Uoks0XUl45St3FlatVqef9prk4jRDzhW6WZg+3bk93y6pLjA==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=6" - } - }, - "node_modules/strip-json-comments": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-3.1.1.tgz", - "integrity": "sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/supports-color": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", - "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", - "dev": true, - "license": "MIT", - "dependencies": { - "has-flag": "^4.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/supports-preserve-symlinks-flag": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz", - "integrity": "sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==", - "license": "MIT", - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/svg-element-attributes": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/svg-element-attributes/-/svg-element-attributes-1.3.1.tgz", - "integrity": "sha512-Bh05dSOnJBf3miNMqpsormfNtfidA/GxQVakhtn0T4DECWKeXQRQUceYjJ+OxYiiLdGe4Jo9iFV8wICFapFeIA==", - "dev": true, - "license": "MIT", - "funding": { - "type": "github", - "url": "https://github.com/sponsors/wooorm" - } - }, - "node_modules/synckit": { - "version": "0.9.1", - "resolved": "https://registry.npmjs.org/synckit/-/synckit-0.9.1.tgz", - "integrity": "sha512-7gr8p9TQP6RAHusBOSLs46F4564ZrjV8xFmw5zCmgmhGUcw2hxsShhJ6CEiHQMgPDwAQ1fWHPM0ypc4RMAig4A==", - "dev": true, - "license": "MIT", - "dependencies": { - "@pkgr/core": "^0.1.0", - "tslib": "^2.6.2" - }, - "engines": { - "node": "^14.18.0 || >=16.0.0" - }, - "funding": { - "url": "https://opencollective.com/unts" - } - }, - "node_modules/test-exclude": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/test-exclude/-/test-exclude-6.0.0.tgz", - "integrity": "sha512-cAGWPIyOHU6zlmg88jwm7VRyXnMN7iV68OGAbYDk/Mh/xC/pzVPlQtY6ngoIH/5/tciuhGfvESU8GrHrcxD56w==", - "dev": true, - "license": "ISC", - "dependencies": { - "@istanbuljs/schema": "^0.1.2", - "glob": "^7.1.4", - "minimatch": "^3.0.4" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/text-table": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/text-table/-/text-table-0.2.0.tgz", - "integrity": "sha512-N+8UisAXDGk8PFXP4HAzVR9nbfmVJ3zYLAWiTIoqC5v5isinhr+r5uaO8+7r3BMfuNIufIsA7RdpVgacC2cSpw==", - "dev": true, - "license": "MIT" - }, - "node_modules/textextensions": { - "version": "2.6.0", - "resolved": "https://registry.npmjs.org/textextensions/-/textextensions-2.6.0.tgz", - "integrity": "sha512-49WtAWS+tcsy93dRt6P0P3AMD2m5PvXRhuEA0kaXos5ZLlujtYmpmFsB+QvWUSxE1ZsstmYXfQ7L40+EcQgpAQ==", - "license": "MIT", - "engines": { - "node": ">=0.8" - }, - "funding": { - "url": "https://bevry.me/fund" - } - }, - "node_modules/tmpl": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/tmpl/-/tmpl-1.0.5.tgz", - "integrity": "sha512-3f0uOEAQwIqGuWW2MVzYg8fV/QNnc/IpuJNG837rLuczAaLVHslWHZQj4IGiEl5Hs3kkbhwL9Ab7Hrsmuj+Smw==", - "dev": true, - "license": "BSD-3-Clause" - }, - "node_modules/to-fast-properties": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/to-fast-properties/-/to-fast-properties-2.0.0.tgz", - "integrity": "sha512-/OaKK0xYrs3DmxRYqL/yDc+FxFUVYhDlXMhRmv3z915w2HF1tnN1omB354j8VUGO/hbRzyD6Y3sA7v7GS/ceog==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=4" - } - }, - "node_modules/to-regex-range": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", - "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "is-number": "^7.0.0" - }, - "engines": { - "node": ">=8.0" - } - }, - "node_modules/ts-api-utils": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/ts-api-utils/-/ts-api-utils-1.3.0.tgz", - "integrity": "sha512-UQMIo7pb8WRomKR1/+MFVLTroIvDVtMX3K6OUir8ynLyzB8Jeriont2bTAtmNPa1ekAgN7YPDyf6V+ygrdU+eQ==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=16" - }, - "peerDependencies": { - "typescript": ">=4.2.0" - } - }, - "node_modules/ts-jest": { - "version": "29.2.5", - "resolved": "https://registry.npmjs.org/ts-jest/-/ts-jest-29.2.5.tgz", - "integrity": "sha512-KD8zB2aAZrcKIdGk4OwpJggeLcH1FgrICqDSROWqlnJXGCXK4Mn6FcdK2B6670Xr73lHMG1kHw8R87A0ecZ+vA==", - "dev": true, - "license": "MIT", - "dependencies": { - "bs-logger": "^0.2.6", - "ejs": "^3.1.10", - "fast-json-stable-stringify": "^2.1.0", - "jest-util": "^29.0.0", - "json5": "^2.2.3", - "lodash.memoize": "^4.1.2", - "make-error": "^1.3.6", - "semver": "^7.6.3", - "yargs-parser": "^21.1.1" - }, - "bin": { - "ts-jest": "cli.js" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || ^18.0.0 || >=20.0.0" - }, - "peerDependencies": { - "@babel/core": ">=7.0.0-beta.0 <8", - "@jest/transform": "^29.0.0", - "@jest/types": "^29.0.0", - "babel-jest": "^29.0.0", - "jest": "^29.0.0", - "typescript": ">=4.3 <6" - }, - "peerDependenciesMeta": { - "@babel/core": { - "optional": true - }, - "@jest/transform": { - "optional": true - }, - "@jest/types": { - "optional": true - }, - "babel-jest": { - "optional": true - }, - "esbuild": { - "optional": true - } - } - }, - "node_modules/ts-jest/node_modules/yargs-parser": { - "version": "21.1.1", - "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-21.1.1.tgz", - "integrity": "sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw==", - "dev": true, - "license": "ISC", - "engines": { - "node": ">=12" - } - }, - "node_modules/tsconfig-paths": { - "version": "3.15.0", - "resolved": "https://registry.npmjs.org/tsconfig-paths/-/tsconfig-paths-3.15.0.tgz", - "integrity": "sha512-2Ac2RgzDe/cn48GvOe3M+o82pEFewD3UPbyoUHHdKasHwJKjds4fLXWf/Ux5kATBKN20oaFGu+jbElp1pos0mg==", - "dev": true, - "license": "MIT", - "dependencies": { - "@types/json5": "^0.0.29", - "json5": "^1.0.2", - "minimist": "^1.2.6", - "strip-bom": "^3.0.0" - } - }, - "node_modules/tsconfig-paths/node_modules/json5": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/json5/-/json5-1.0.2.tgz", - "integrity": "sha512-g1MWMLBiz8FKi1e4w0UyVL3w+iJceWAFBAaBnnGKOpNa5f8TLktkbre1+s6oICydWAm+HRUGTmI+//xv2hvXYA==", - "dev": true, - "license": "MIT", - "dependencies": { - "minimist": "^1.2.0" - }, - "bin": { - "json5": "lib/cli.js" - } - }, - "node_modules/tsconfig-paths/node_modules/strip-bom": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-3.0.0.tgz", - "integrity": "sha512-vavAMRXOgBVNF6nyEEmL3DBK19iRpDcoIwW+swQ+CbGiu7lju6t+JklA1MHweoWtadgt4ISVUsXLyDq34ddcwA==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=4" - } - }, - "node_modules/tslib": { - "version": "2.7.0", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.7.0.tgz", - "integrity": "sha512-gLXCKdN1/j47AiHiOkJN69hJmcbGTHI0ImLmbYLHykhgeN0jVGola9yVjFgzCUklsZQMW55o+dW7IXv3RCXDzA==", - "dev": true, - "license": "0BSD" - }, - "node_modules/tsutils": { - "version": "3.21.0", - "resolved": "https://registry.npmjs.org/tsutils/-/tsutils-3.21.0.tgz", - "integrity": "sha512-mHKK3iUXL+3UF6xL5k0PEhKRUBKPBCv/+RkEOpjRWxxx27KKRBmmA60A9pgOUvMi8GKhRMPEmjBRPzs2W7O1OA==", - "dev": true, - "license": "MIT", - "dependencies": { - "tslib": "^1.8.1" - }, - "engines": { - "node": ">= 6" - }, - "peerDependencies": { - "typescript": ">=2.8.0 || >= 3.2.0-dev || >= 3.3.0-dev || >= 3.4.0-dev || >= 3.5.0-dev || >= 3.6.0-dev || >= 3.6.0-beta || >= 3.7.0-dev || >= 3.7.0-beta" - } - }, - "node_modules/tsutils/node_modules/tslib": { - "version": "1.14.1", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz", - "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==", - "dev": true, - "license": "0BSD" - }, - "node_modules/tunnel": { - "version": "0.0.6", - "resolved": "https://registry.npmjs.org/tunnel/-/tunnel-0.0.6.tgz", - "integrity": "sha512-1h/Lnq9yajKY2PEbBadPXj3VxsDDu844OnaAo52UVmIzIvwwtBPIuNvkjuzBlTWpfJyUbG3ez0KSBibQkj4ojg==", - "license": "MIT", - "engines": { - "node": ">=0.6.11 <=0.7.0 || >=0.7.3" - } - }, - "node_modules/type-check": { - "version": "0.4.0", - "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.4.0.tgz", - "integrity": "sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew==", - "dev": true, - "license": "MIT", - "dependencies": { - "prelude-ls": "^1.2.1" - }, - "engines": { - "node": ">= 0.8.0" - } - }, - "node_modules/type-detect": { - "version": "4.0.8", - "resolved": "https://registry.npmjs.org/type-detect/-/type-detect-4.0.8.tgz", - "integrity": "sha512-0fr/mIH1dlO+x7TlcMy+bIDqKPsw/70tVyeHW787goQjhmqaZe10uwLujubK9q9Lg6Fiho1KUKDYz0Z7k7g5/g==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=4" - } - }, - "node_modules/type-fest": { - "version": "0.20.2", - "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.20.2.tgz", - "integrity": "sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ==", - "dev": true, - "license": "(MIT OR CC0-1.0)", - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/typed-array-buffer": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/typed-array-buffer/-/typed-array-buffer-1.0.2.tgz", - "integrity": "sha512-gEymJYKZtKXzzBzM4jqa9w6Q1Jjm7x2d+sh19AdsD4wqnMPDYyvwpsIc2Q/835kHuo3BEQ7CjelGhfTsoBb2MQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "call-bind": "^1.0.7", - "es-errors": "^1.3.0", - "is-typed-array": "^1.1.13" - }, - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/typed-array-byte-length": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/typed-array-byte-length/-/typed-array-byte-length-1.0.1.tgz", - "integrity": "sha512-3iMJ9q0ao7WE9tWcaYKIptkNBuOIcZCCT0d4MRvuuH88fEoEH62IuQe0OtraD3ebQEoTRk8XCBoknUNc1Y67pw==", - "dev": true, - "license": "MIT", - "dependencies": { - "call-bind": "^1.0.7", - "for-each": "^0.3.3", - "gopd": "^1.0.1", - "has-proto": "^1.0.3", - "is-typed-array": "^1.1.13" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/typed-array-byte-offset": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/typed-array-byte-offset/-/typed-array-byte-offset-1.0.2.tgz", - "integrity": "sha512-Ous0vodHa56FviZucS2E63zkgtgrACj7omjwd/8lTEMEPFFyjfixMZ1ZXenpgCFBBt4EC1J2XsyVS2gkG0eTFA==", - "dev": true, - "license": "MIT", - "dependencies": { - "available-typed-arrays": "^1.0.7", - "call-bind": "^1.0.7", - "for-each": "^0.3.3", - "gopd": "^1.0.1", - "has-proto": "^1.0.3", - "is-typed-array": "^1.1.13" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/typed-array-length": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/typed-array-length/-/typed-array-length-1.0.6.tgz", - "integrity": "sha512-/OxDN6OtAk5KBpGb28T+HZc2M+ADtvRxXrKKbUwtsLgdoxgX13hyy7ek6bFRl5+aBs2yZzB0c4CnQfAtVypW/g==", - "dev": true, - "license": "MIT", - "dependencies": { - "call-bind": "^1.0.7", - "for-each": "^0.3.3", - "gopd": "^1.0.1", - "has-proto": "^1.0.3", - "is-typed-array": "^1.1.13", - "possible-typed-array-names": "^1.0.0" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/typescript": { - "version": "5.6.2", - "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.6.2.tgz", - "integrity": "sha512-NW8ByodCSNCwZeghjN3o+JX5OFH0Ojg6sadjEKY4huZ52TqbJTJnDo5+Tw98lSy63NZvi4n+ez5m2u5d4PkZyw==", - "dev": true, - "license": "Apache-2.0", - "bin": { - "tsc": "bin/tsc", - "tsserver": "bin/tsserver" - }, - "engines": { - "node": ">=14.17" - } - }, - "node_modules/unbox-primitive": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/unbox-primitive/-/unbox-primitive-1.0.2.tgz", - "integrity": "sha512-61pPlCD9h51VoreyJ0BReideM3MDKMKnh6+V9L08331ipq6Q8OFXZYiqP6n/tbHx4s5I9uRhcye6BrbkizkBDw==", - "dev": true, - "license": "MIT", - "dependencies": { - "call-bind": "^1.0.2", - "has-bigints": "^1.0.2", - "has-symbols": "^1.0.3", - "which-boxed-primitive": "^1.0.2" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/undici": { - "version": "5.28.4", - "resolved": "https://registry.npmjs.org/undici/-/undici-5.28.4.tgz", - "integrity": "sha512-72RFADWFqKmUb2hmmvNODKL3p9hcB6Gt2DOQMis1SEBaV6a4MH8soBvzg+95CYhCKPFedut2JY9bMfrDl9D23g==", - "license": "MIT", - "dependencies": { - "@fastify/busboy": "^2.0.0" - }, - "engines": { - "node": ">=14.0" - } - }, - "node_modules/undici-types": { - "version": "6.19.8", - "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-6.19.8.tgz", - "integrity": "sha512-ve2KP6f/JnbPBFyobGHuerC9g1FYGn/F8n1LWTwNxCEzd6IfqTwUQcNXgEtmmQ6DlRrC1hrSrBnCZPokRrDHjw==", - "dev": true, - "license": "MIT" - }, - "node_modules/universal-user-agent": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/universal-user-agent/-/universal-user-agent-6.0.1.tgz", - "integrity": "sha512-yCzhz6FN2wU1NiiQRogkTQszlQSlpWaw8SvVegAc+bDxbzHgh1vX8uIe8OYyMH6DwH+sdTJsgMl36+mSMdRJIQ==", - "license": "ISC" - }, - "node_modules/update-browserslist-db": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.1.1.tgz", - "integrity": "sha512-R8UzCaa9Az+38REPiJ1tXlImTJXlVfgHZsglwBD/k6nj76ctsH1E3q4doGrukiLQd3sGQYu56r5+lo5r94l29A==", - "dev": true, - "funding": [ - { - "type": "opencollective", - "url": "https://opencollective.com/browserslist" - }, - { - "type": "tidelift", - "url": "https://tidelift.com/funding/github/npm/browserslist" - }, - { - "type": "github", - "url": "https://github.com/sponsors/ai" - } - ], - "license": "MIT", - "dependencies": { - "escalade": "^3.2.0", - "picocolors": "^1.1.0" - }, - "bin": { - "update-browserslist-db": "cli.js" - }, - "peerDependencies": { - "browserslist": ">= 4.21.0" - } - }, - "node_modules/uri-js": { - "version": "4.4.1", - "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.4.1.tgz", - "integrity": "sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==", - "dev": true, - "license": "BSD-2-Clause", - "dependencies": { - "punycode": "^2.1.0" - } - }, - "node_modules/v8-to-istanbul": { - "version": "9.3.0", - "resolved": "https://registry.npmjs.org/v8-to-istanbul/-/v8-to-istanbul-9.3.0.tgz", - "integrity": "sha512-kiGUalWN+rgBJ/1OHZsBtU4rXZOfj/7rKQxULKlIzwzQSvMJUUNgPwJEEh7gU6xEVxC0ahoOBvN2YI8GH6FNgA==", - "dev": true, - "license": "ISC", - "dependencies": { - "@jridgewell/trace-mapping": "^0.3.12", - "@types/istanbul-lib-coverage": "^2.0.1", - "convert-source-map": "^2.0.0" - }, - "engines": { - "node": ">=10.12.0" - } - }, - "node_modules/walker": { - "version": "1.0.8", - "resolved": "https://registry.npmjs.org/walker/-/walker-1.0.8.tgz", - "integrity": "sha512-ts/8E8l5b7kY0vlWLewOkDXMmPdLcVV4GmOQLyxuSswIJsweeFZtAsMF7k1Nszz+TYBQrlYRmzOnr398y1JemQ==", - "dev": true, - "license": "Apache-2.0", - "dependencies": { - "makeerror": "1.0.12" - } - }, - "node_modules/which": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", - "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", - "dev": true, - "license": "ISC", - "dependencies": { - "isexe": "^2.0.0" - }, - "bin": { - "node-which": "bin/node-which" - }, - "engines": { - "node": ">= 8" - } - }, - "node_modules/which-boxed-primitive": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/which-boxed-primitive/-/which-boxed-primitive-1.0.2.tgz", - "integrity": "sha512-bwZdv0AKLpplFY2KZRX6TvyuN7ojjr7lwkg6ml0roIy9YeuSr7JS372qlNW18UQYzgYK9ziGcerWqZOmEn9VNg==", - "dev": true, - "license": "MIT", - "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" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/which-builtin-type": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/which-builtin-type/-/which-builtin-type-1.1.4.tgz", - "integrity": "sha512-bppkmBSsHFmIMSl8BO9TbsyzsvGjVoppt8xUiGzwiu/bhDCGxnpOKCxgqj6GuyHE0mINMDecBFPlOm2hzY084w==", - "dev": true, - "license": "MIT", - "dependencies": { - "function.prototype.name": "^1.1.6", - "has-tostringtag": "^1.0.2", - "is-async-function": "^2.0.0", - "is-date-object": "^1.0.5", - "is-finalizationregistry": "^1.0.2", - "is-generator-function": "^1.0.10", - "is-regex": "^1.1.4", - "is-weakref": "^1.0.2", - "isarray": "^2.0.5", - "which-boxed-primitive": "^1.0.2", - "which-collection": "^1.0.2", - "which-typed-array": "^1.1.15" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/which-collection": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/which-collection/-/which-collection-1.0.2.tgz", - "integrity": "sha512-K4jVyjnBdgvc86Y6BkaLZEN933SwYOuBFkdmBu9ZfkcAbdVbpITnDmjvZ/aQjRXQrv5EPkTnD1s39GiiqbngCw==", - "dev": true, - "license": "MIT", - "dependencies": { - "is-map": "^2.0.3", - "is-set": "^2.0.3", - "is-weakmap": "^2.0.2", - "is-weakset": "^2.0.3" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/which-typed-array": { - "version": "1.1.15", - "resolved": "https://registry.npmjs.org/which-typed-array/-/which-typed-array-1.1.15.tgz", - "integrity": "sha512-oV0jmFtUky6CXfkqehVvBP/LSWJ2sy4vWMioiENyJLePrBO/yKyV9OyJySfAKosh+RYkIl5zJCNZ8/4JncrpdA==", - "dev": true, - "license": "MIT", - "dependencies": { - "available-typed-arrays": "^1.0.7", - "call-bind": "^1.0.7", - "for-each": "^0.3.3", - "gopd": "^1.0.1", - "has-tostringtag": "^1.0.2" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/word-wrap": { - "version": "1.2.5", - "resolved": "https://registry.npmjs.org/word-wrap/-/word-wrap-1.2.5.tgz", - "integrity": "sha512-BN22B5eaMMI9UMtjrGd5g5eCYPpCPDUy0FJXbYsaT5zYxjFOckS53SQDE3pWkVoWpHXVb3BrYcEN4Twa55B5cA==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/wrap-ansi": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", - "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==", - "dev": true, - "license": "MIT", - "dependencies": { - "ansi-styles": "^4.0.0", - "string-width": "^4.1.0", - "strip-ansi": "^6.0.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/wrap-ansi?sponsor=1" - } - }, - "node_modules/wrappy": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", - "integrity": "sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==", - "license": "ISC" - }, - "node_modules/write-file-atomic": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/write-file-atomic/-/write-file-atomic-4.0.2.tgz", - "integrity": "sha512-7KxauUdBmSdWnmpaGFg+ppNjKF8uNLry8LyzjauQDOVONfFLNKrKvQOxZ/VuTIcS/gge/YNahf5RIIQWTSarlg==", - "dev": true, - "license": "ISC", - "dependencies": { - "imurmurhash": "^0.1.4", - "signal-exit": "^3.0.7" - }, - "engines": { - "node": "^12.13.0 || ^14.15.0 || >=16.0.0" - } - }, - "node_modules/y18n": { - "version": "5.0.8", - "resolved": "https://registry.npmjs.org/y18n/-/y18n-5.0.8.tgz", - "integrity": "sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==", - "dev": true, - "license": "ISC", - "engines": { - "node": ">=10" - } - }, - "node_modules/yallist": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/yallist/-/yallist-3.1.1.tgz", - "integrity": "sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==", - "dev": true, - "license": "ISC" - }, - "node_modules/yargs": { - "version": "17.7.2", - "resolved": "https://registry.npmjs.org/yargs/-/yargs-17.7.2.tgz", - "integrity": "sha512-7dSzzRQ++CKnNI/krKnYRV7JKKPUXMEh61soaHKg9mrWEhzFWhFnxPxGl+69cD1Ou63C13NUPCnmIcrvqCuM6w==", - "dev": true, - "license": "MIT", - "dependencies": { - "cliui": "^8.0.1", - "escalade": "^3.1.1", - "get-caller-file": "^2.0.5", - "require-directory": "^2.1.1", - "string-width": "^4.2.3", - "y18n": "^5.0.5", - "yargs-parser": "^21.1.1" - }, - "engines": { - "node": ">=12" - } - }, - "node_modules/yargs-parser": { - "version": "10.1.0", - "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-10.1.0.tgz", - "integrity": "sha512-VCIyR1wJoEBZUqk5PA+oOBF6ypbwh5aNB3I50guxAL/quggdfs4TtNHQrSazFA3fYZ+tEqfs0zIGlv0c/rgjbQ==", - "license": "ISC", - "dependencies": { - "camelcase": "^4.1.0" - } - }, - "node_modules/yargs-parser/node_modules/camelcase": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-4.1.0.tgz", - "integrity": "sha512-FxAv7HpHrXbh3aPo4o2qxHay2lkLY3x5Mw3KeE4KQE8ysVfziWeRZDwcjauvwBSGEC/nXUPzZy8zeh4HokqOnw==", - "license": "MIT", - "engines": { - "node": ">=4" - } - }, - "node_modules/yargs/node_modules/yargs-parser": { - "version": "21.1.1", - "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-21.1.1.tgz", - "integrity": "sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw==", - "dev": true, - "license": "ISC", - "engines": { - "node": ">=12" - } - }, - "node_modules/yocto-queue": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/yocto-queue/-/yocto-queue-0.1.0.tgz", - "integrity": "sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - } - } -} diff --git a/package.json b/package.json index b81666a3..128c2da6 100644 --- a/package.json +++ b/package.json @@ -1,43 +1,37 @@ { "name": "slo-tests", - "version": "1.1.0", - "private": true, - "description": "TypeScript action for performing SLO tests for YDB in k8s cluster", - "main": "lib/main.js", - "scripts": { - "manifests": "ls k8s/ci/*.yaml | sed -e 's/k8s\\/ci\\///g; s/\\.yaml//g' | xargs -I NAME npx fs-to-json --input k8s/ci/NAME.yaml --output src/manifests/NAME.json", - "build": "npm run manifests && tsc", - "format": "prettier --write '**/*.ts'", - "format-check": "prettier --check '**/*.ts'", - "lint": "eslint src/**/*.ts", - "package": "npm run build && ncc build -o dist/main --minify --no-cache --license licenses.txt lib/main.js && ncc build -o dist/post --minify --no-cache --license licenses.txt lib/post.js", - "test": "jest", - "all": "npm run build && npm run format && npm run lint && npm run package && npm test" - }, + "description": "YDB SLO action for performing SLO tests", + "version": "2.0.0", + "license": "MIT", + "author": "Vladislav Polyakov ", "repository": { "type": "git", "url": "git+https://github.com/ydb-platform/slo-tests.git" }, - "keywords": ["actions", "node", "setup"], - "author": "", - "license": "MIT", + "bugs": { + "url": "https://github.com/ydb-platform/slo-tests/issues" + }, + "keywords": [ + "GitHub", + "Actions", + "YDB", + "SLO" + ], + "engines": { + "node": ">=20" + }, + "scripts": { + "bundle": "bun build src/index.ts --target node --format cjs --minify > index.js", + "bundle:dev": "bun build src/index.ts --target node --format cjs --sourcemap > index.js" + }, "dependencies": { - "@actions/core": "^1.10.1", - "@actions/github": "^6.0.0", - "@octokit/rest": "^21.0.2", - "fs-to-json": "^0.2.0" + "@actions/artifact": "^2.1.11", + "@actions/core": "^1.11.1", + "@actions/exec": "^1.1.1", + "@actions/github": "^6.0.0" }, "devDependencies": { - "@types/node": "^22.7.4", - "@typescript-eslint/parser": "^5.62.0", - "@vercel/ncc": "^0.38.1", - "eslint": "^8.39.0", - "eslint-plugin-github": "^5.0.1", - "eslint-plugin-jest": "^28.8.3", - "jest": "^29.7.0", - "js-yaml": "^4.1.0", - "prettier": "^3.3.3", - "ts-jest": "^29.2.5", - "typescript": "^5.6.2" + "typescript": "^5.6.3", + "@types/bun": "latest" } -} \ No newline at end of file +} diff --git a/playground/.gitignore b/playground/.gitignore deleted file mode 100644 index 8fce6030..00000000 --- a/playground/.gitignore +++ /dev/null @@ -1 +0,0 @@ -data/ diff --git a/playground/README.md b/playground/README.md deleted file mode 100644 index eefb5cf0..00000000 --- a/playground/README.md +++ /dev/null @@ -1,40 +0,0 @@ -# SLO playground - -Playground may be used for testing SLO workloads locally - -It has several services: - -- `prometheus` - storage for metrics -- `prometheus-pushgateway` - push acceptor for prometheus -- `grafana` - provides chats for metrics -- `ydb` - local instance of ydb-database to run workload with - -## Network addresses - -- Grafana dashboard: http://localhost:3000 -- Prometheus pushgateway: http://localhost:9091 -- YDB monitoring: http://localhost:8765 -- YDB GRPC: grpc://localhost:2136 -- YDB GRPC TLS: grpcs://localhost:2135 - -## Start - -```shell -docker-compose up -d -``` - -## Stop - -```shell -docker-compose down -``` - -## Configs - -Grafana's dashboards stored in `configs/grafana/provisioning/dashboards` - -## Data - -YDB databases are not persistent - -All other data like metrics and certs stored in `data/` \ No newline at end of file diff --git a/playground/configs/grafana/provisioning/dashboards/dashboard.yml b/playground/configs/grafana/provisioning/dashboards/dashboard.yml deleted file mode 100644 index c6784142..00000000 --- a/playground/configs/grafana/provisioning/dashboards/dashboard.yml +++ /dev/null @@ -1,6 +0,0 @@ -apiVersion: 1 - -providers: - - name: 'SLO' - options: - path: /etc/grafana/provisioning/dashboards diff --git a/playground/configs/grafana/provisioning/dashboards/slo.json b/playground/configs/grafana/provisioning/dashboards/slo.json deleted file mode 100644 index 69d76bf7..00000000 --- a/playground/configs/grafana/provisioning/dashboards/slo.json +++ /dev/null @@ -1,646 +0,0 @@ -{ - "annotations": { - "list": [ - { - "builtIn": 1, - "datasource": { - "type": "grafana", - "uid": "-- Grafana --" - }, - "enable": true, - "hide": true, - "iconColor": "rgba(0, 211, 255, 1)", - "name": "Annotations & Alerts", - "target": { - "limit": 100, - "matchAny": false, - "tags": [], - "type": "dashboard" - }, - "type": "dashboard" - } - ] - }, - "editable": true, - "fiscalYearStartMonth": 0, - "graphTooltip": 0, - "links": [], - "liveNow": false, - "panels": [ - { - "datasource": { - "type": "prometheus", - "uid": "prometheus" - }, - "fieldConfig": { - "defaults": { - "color": { - "mode": "palette-classic" - }, - "custom": { - "axisCenteredZero": false, - "axisColorMode": "text", - "axisLabel": "", - "axisPlacement": "auto", - "barAlignment": 0, - "drawStyle": "line", - "fillOpacity": 0, - "gradientMode": "none", - "hideFrom": { - "legend": false, - "tooltip": false, - "viz": false - }, - "lineInterpolation": "linear", - "lineWidth": 1, - "pointSize": 5, - "scaleDistribution": { - "type": "linear" - }, - "showPoints": "auto", - "spanNulls": false, - "stacking": { - "group": "A", - "mode": "none" - }, - "thresholdsStyle": { - "mode": "off" - } - }, - "mappings": [], - "thresholds": { - "mode": "absolute", - "steps": [ - { - "color": "green", - "value": null - }, - { - "color": "red", - "value": 80 - } - ] - } - }, - "overrides": [] - }, - "gridPos": { - "h": 9, - "w": 12, - "x": 0, - "y": 0 - }, - "id": 12, - "options": { - "legend": { - "calcs": [], - "displayMode": "list", - "placement": "bottom", - "showLegend": true - }, - "tooltip": { - "mode": "single", - "sort": "none" - } - }, - "targets": [ - { - "datasource": { - "type": "prometheus", - "uid": "prometheus" - }, - "editorMode": "builder", - "expr": "rate(oks[$__rate_interval]) > 0", - "hide": false, - "legendFormat": "({{sdk}}-{{sdkVersion}}) {{jobName}} OK", - "range": true, - "refId": "B" - }, - { - "datasource": { - "type": "prometheus", - "uid": "prometheus" - }, - "editorMode": "builder", - "expr": "rate(not_oks[$__rate_interval]) > 0", - "hide": false, - "legendFormat": "({{sdk}}-{{sdkVersion}}) {{jobName}} not OK", - "range": true, - "refId": "C" - } - ], - "title": "SLO Requests RPS", - "transformations": [], - "type": "timeseries" - }, - { - "datasource": { - "type": "prometheus", - "uid": "prometheus" - }, - "fieldConfig": { - "defaults": { - "color": { - "mode": "palette-classic" - }, - "custom": { - "axisCenteredZero": false, - "axisColorMode": "text", - "axisLabel": "", - "axisPlacement": "auto", - "axisSoftMin": 0, - "barAlignment": 0, - "drawStyle": "line", - "fillOpacity": 0, - "gradientMode": "none", - "hideFrom": { - "legend": false, - "tooltip": false, - "viz": false - }, - "lineInterpolation": "linear", - "lineWidth": 1, - "pointSize": 5, - "scaleDistribution": { - "type": "linear" - }, - "showPoints": "auto", - "spanNulls": false, - "stacking": { - "group": "A", - "mode": "none" - }, - "thresholdsStyle": { - "mode": "off" - } - }, - "decimals": 0, - "mappings": [], - "thresholds": { - "mode": "absolute", - "steps": [ - { - "color": "green", - "value": null - }, - { - "color": "red", - "value": 80 - } - ] - } - }, - "overrides": [] - }, - "gridPos": { - "h": 9, - "w": 12, - "x": 12, - "y": 0 - }, - "id": 14, - "options": { - "legend": { - "calcs": [], - "displayMode": "list", - "placement": "bottom", - "showLegend": true - }, - "tooltip": { - "mode": "single", - "sort": "none" - } - }, - "targets": [ - { - "datasource": { - "type": "prometheus", - "uid": "prometheus" - }, - "editorMode": "builder", - "expr": "histogram_quantile(1, rate(attempts_bucket[$__rate_interval]))", - "hide": false, - "legendFormat": "{{sdk}}-{{sdkVersion}} {{jobName}}-{{status}}", - "range": true, - "refId": "A" - } - ], - "title": "Attempts", - "transformations": [], - "type": "timeseries" - }, - { - "collapsed": false, - "gridPos": { - "h": 1, - "w": 24, - "x": 0, - "y": 9 - }, - "id": 7, - "panels": [], - "title": "Latencies", - "type": "row" - }, - { - "datasource": { - "type": "prometheus", - "uid": "prometheus" - }, - "fieldConfig": { - "defaults": { - "color": { - "mode": "palette-classic" - }, - "custom": { - "axisCenteredZero": false, - "axisColorMode": "text", - "axisLabel": "", - "axisPlacement": "auto", - "barAlignment": 0, - "drawStyle": "line", - "fillOpacity": 0, - "gradientMode": "none", - "hideFrom": { - "legend": false, - "tooltip": false, - "viz": false - }, - "lineInterpolation": "linear", - "lineWidth": 1, - "pointSize": 5, - "scaleDistribution": { - "type": "linear" - }, - "showPoints": "auto", - "spanNulls": false, - "stacking": { - "group": "A", - "mode": "none" - }, - "thresholdsStyle": { - "mode": "off" - } - }, - "mappings": [], - "thresholds": { - "mode": "absolute", - "steps": [ - { - "color": "green", - "value": null - }, - { - "color": "red", - "value": 80 - } - ] - } - }, - "overrides": [] - }, - "gridPos": { - "h": 8, - "w": 12, - "x": 0, - "y": 10 - }, - "id": 4, - "options": { - "legend": { - "calcs": [], - "displayMode": "list", - "placement": "bottom", - "showLegend": true - }, - "tooltip": { - "mode": "single", - "sort": "none" - } - }, - "pluginVersion": "9.3.1", - "targets": [ - { - "datasource": { - "type": "prometheus", - "uid": "prometheus" - }, - "editorMode": "builder", - "expr": "latency{jobName=\"read\", status=\"ok\"} > 0", - "legendFormat": "{{sdk}}-{{sdkVersion}}-p{{quantile}}", - "range": true, - "refId": "A" - } - ], - "title": "Read Latencies (OK)", - "type": "timeseries" - }, - { - "datasource": { - "type": "prometheus", - "uid": "prometheus" - }, - "fieldConfig": { - "defaults": { - "color": { - "mode": "palette-classic" - }, - "custom": { - "axisCenteredZero": false, - "axisColorMode": "text", - "axisLabel": "", - "axisPlacement": "auto", - "barAlignment": 0, - "drawStyle": "line", - "fillOpacity": 0, - "gradientMode": "none", - "hideFrom": { - "legend": false, - "tooltip": false, - "viz": false - }, - "lineInterpolation": "linear", - "lineWidth": 1, - "pointSize": 5, - "scaleDistribution": { - "type": "linear" - }, - "showPoints": "auto", - "spanNulls": false, - "stacking": { - "group": "A", - "mode": "none" - }, - "thresholdsStyle": { - "mode": "off" - } - }, - "mappings": [], - "thresholds": { - "mode": "absolute", - "steps": [ - { - "color": "green", - "value": null - }, - { - "color": "red", - "value": 80 - } - ] - } - }, - "overrides": [] - }, - "gridPos": { - "h": 8, - "w": 12, - "x": 12, - "y": 10 - }, - "id": 5, - "options": { - "legend": { - "calcs": [], - "displayMode": "list", - "placement": "bottom", - "showLegend": true - }, - "tooltip": { - "mode": "single", - "sort": "none" - } - }, - "targets": [ - { - "datasource": { - "type": "prometheus", - "uid": "prometheus" - }, - "editorMode": "builder", - "expr": "latency{jobName=\"write\", status=\"ok\"} > 0", - "legendFormat": "{{sdk}}-{{sdkVersion}}-p{{quantile}}", - "range": true, - "refId": "A" - } - ], - "title": "Write Latencies (OK)", - "type": "timeseries" - }, - { - "datasource": { - "type": "prometheus", - "uid": "prometheus" - }, - "fieldConfig": { - "defaults": { - "color": { - "mode": "palette-classic" - }, - "custom": { - "axisCenteredZero": false, - "axisColorMode": "text", - "axisLabel": "", - "axisPlacement": "auto", - "barAlignment": 0, - "drawStyle": "line", - "fillOpacity": 0, - "gradientMode": "none", - "hideFrom": { - "legend": false, - "tooltip": false, - "viz": false - }, - "lineInterpolation": "linear", - "lineWidth": 1, - "pointSize": 5, - "scaleDistribution": { - "type": "linear" - }, - "showPoints": "auto", - "spanNulls": false, - "stacking": { - "group": "A", - "mode": "none" - }, - "thresholdsStyle": { - "mode": "off" - } - }, - "mappings": [], - "thresholds": { - "mode": "absolute", - "steps": [ - { - "color": "green", - "value": null - }, - { - "color": "red", - "value": 80 - } - ] - } - }, - "overrides": [] - }, - "gridPos": { - "h": 8, - "w": 12, - "x": 0, - "y": 18 - }, - "id": 10, - "options": { - "legend": { - "calcs": [], - "displayMode": "list", - "placement": "bottom", - "showLegend": true - }, - "tooltip": { - "mode": "single", - "sort": "none" - } - }, - "targets": [ - { - "datasource": { - "type": "prometheus", - "uid": "prometheus" - }, - "editorMode": "builder", - "expr": "latency{jobName=\"read\", status=\"err\"} > 0", - "legendFormat": "{{sdk}}-{{sdkVersion}}-p{{quantile}}", - "range": true, - "refId": "A" - } - ], - "title": "Read Latencies (NOT OK)", - "type": "timeseries" - }, - { - "datasource": { - "type": "prometheus", - "uid": "prometheus" - }, - "fieldConfig": { - "defaults": { - "color": { - "mode": "palette-classic" - }, - "custom": { - "axisCenteredZero": false, - "axisColorMode": "text", - "axisLabel": "", - "axisPlacement": "auto", - "barAlignment": 0, - "drawStyle": "line", - "fillOpacity": 0, - "gradientMode": "none", - "hideFrom": { - "legend": false, - "tooltip": false, - "viz": false - }, - "lineInterpolation": "linear", - "lineWidth": 1, - "pointSize": 5, - "scaleDistribution": { - "type": "linear" - }, - "showPoints": "auto", - "spanNulls": false, - "stacking": { - "group": "A", - "mode": "none" - }, - "thresholdsStyle": { - "mode": "off" - } - }, - "mappings": [], - "thresholds": { - "mode": "absolute", - "steps": [ - { - "color": "green", - "value": null - }, - { - "color": "red", - "value": 80 - } - ] - } - }, - "overrides": [] - }, - "gridPos": { - "h": 8, - "w": 12, - "x": 12, - "y": 18 - }, - "id": 11, - "options": { - "legend": { - "calcs": [], - "displayMode": "list", - "placement": "bottom", - "showLegend": true - }, - "tooltip": { - "mode": "single", - "sort": "none" - } - }, - "targets": [ - { - "datasource": { - "type": "prometheus", - "uid": "prometheus" - }, - "editorMode": "builder", - "expr": "latency{jobName=\"write\", status=\"err\"} > 0", - "legendFormat": "{{sdk}}-{{sdkVersion}}-p{{quantile}}", - "range": true, - "refId": "A" - } - ], - "title": "Write Latencies (NOT OK)", - "type": "timeseries" - } - ], - "refresh": "", - "revision": 1, - "schemaVersion": 38, - "style": "dark", - "tags": [], - "templating": { - "list": [ - { - "datasource": { - "type": "prometheus", - "uid": "prometheus" - }, - "filters": [], - "hide": 0, - "label": "", - "name": "filter", - "skipUrlSync": false, - "type": "adhoc" - } - ] - }, - "time": { - "from": "now-15m", - "to": "now" - }, - "timepicker": {}, - "timezone": "", - "title": "SLO", - "uid": "7CzMl5t4k", - "version": 1, - "weekStart": "" -} diff --git a/playground/configs/grafana/provisioning/datasources/datasource.yml b/playground/configs/grafana/provisioning/datasources/datasource.yml deleted file mode 100644 index 0b62b9c3..00000000 --- a/playground/configs/grafana/provisioning/datasources/datasource.yml +++ /dev/null @@ -1,11 +0,0 @@ -apiVersion: 1 - -datasources: - - name: prometheus - type: prometheus - access: proxy - orgId: 1 - url: http://prometheus:9090 - basicAuth: false - isDefault: true - editable: true diff --git a/playground/configs/prometheus/prometheus.yml b/playground/configs/prometheus/prometheus.yml deleted file mode 100644 index 281b390b..00000000 --- a/playground/configs/prometheus/prometheus.yml +++ /dev/null @@ -1,8 +0,0 @@ -global: - scrape_interval: 1s - evaluation_interval: 1s - -scrape_configs: - - job_name: 'slo' - static_configs: - - targets: ['prometheus-pushgateway:9091'] diff --git a/playground/docker-compose.yml b/playground/docker-compose.yml deleted file mode 100644 index 233a4fcd..00000000 --- a/playground/docker-compose.yml +++ /dev/null @@ -1,63 +0,0 @@ -networks: - monitor-net: - driver: bridge - -services: - prometheus: - image: prom/prometheus:v2.44.0 - container_name: prometheus - volumes: - - ./configs/prometheus:/etc/prometheus - - ./data/prometheus:/prometheus - command: - - '--config.file=/etc/prometheus/prometheus.yml' - - '--storage.tsdb.path=/prometheus' - - '--storage.tsdb.retention.time=200h' - - '--web.enable-lifecycle' - restart: unless-stopped - expose: - - 9090 - networks: - - monitor-net - - prometheus-pushgateway: - image: prom/pushgateway:v1.6.0 - container_name: prometheus-pushgateway - ports: - - "9091:9091" - networks: - - monitor-net - - grafana: - image: grafana/grafana:9.5.3 - container_name: grafana - volumes: - - ./configs/grafana/provisioning:/etc/grafana/provisioning - - ./data/grafana:/var/lib/grafana - environment: - - GF_SECURITY_ADMIN_USER=admin - - GF_SECURITY_ADMIN_PASSWORD=passw0rD - restart: unless-stopped - ports: - - "3000:3000" - networks: - - monitor-net - - ydb: - # image: ydbplatform/local-ydb:23.4 - image: ydbplatform/local-ydb:24.1 - container_name: ydb-local - hostname: localhost - environment: - - GRPC_TLS_PORT=2135 - - GRPC_PORT=2136 - - MON_PORT=8765 - - YDB_USE_IN_MEMORY_PDISKS=true - - YDB_DEFAULT_LOG_LEVEL=NOTICE -# - YDB_TABLE_ENABLE_PREPARED_DDL=true - ports: - - "2135:2135" - - "2136:2136" - - "8765:8765" - volumes: - - ./data/ydb_certs:/ydb_certs diff --git a/scripts/checkGrafanaValues.js b/scripts/checkGrafanaValues.js deleted file mode 100644 index 86846f9e..00000000 --- a/scripts/checkGrafanaValues.js +++ /dev/null @@ -1,127 +0,0 @@ -const fs = require("fs"); -const os = require("os"); -console.log("Arguments", process.argv); - -let [, , inputPath, desiredParamsPath] = process.argv; - -let parsed; // SLO run results -let desiredParams; // desired run results - -try { - parsed = JSON.parse(fs.readFileSync(inputPath)); - desiredParams = JSON.parse(fs.readFileSync(desiredParamsPath)); -} catch (error) { - console.error("Error while reading file", error); - process.exit(1); -} - -let checksResults = desiredParams.map((desiredParam, index) => { - // find values where every search value is valid AND value of param is not undefined - const filtered = parsed.filter( - (value) => - Object.entries(desiredParam.find) - .map(([k, v]) => value[k] == v) - .every((v) => v) && typeof value[desiredParam.cmp[0]] !== "undefined" - ); - const paramsForPrint = JSON.stringify(desiredParam.find); - console.log( - `Filtered ${filtered.length} metrics for desired param #${index} (${paramsForPrint})`, - filtered - ); - const res = filtered.map((value) => { - const resultParam = value[desiredParam.cmp[0]]; - console.log( - "Compare", - resultParam, - desiredParam.cmp[1], - desiredParam.cmp[2] - ); - let compared = false; - if (desiredParam.cmp[1] === "<") - compared = resultParam < desiredParam.cmp[2]; - else if (desiredParam.cmp[1] === ">") - compared = resultParam > desiredParam.cmp[2]; - else if (desiredParam.cmp[1] === "==") - compared = resultParam == desiredParam.cmp[2]; - - // return result of comparison - return { - ok: compared, - name: `${desiredParam.cmp[0]} ${desiredParam.cmp[1]} ${desiredParam.cmp[2]} (${paramsForPrint})`, - actual: resultParam, - }; - }); - return res; -}); - -checksResults = checksResults.flat(); - -console.log("checkRun", checksResults); - -setOutput( - "checks_matrix", - JSON.stringify(checksResults.map((_, i) => `check_${i}`)) -); - -fs.mkdirSync("checks_results"); -checksResults.map((result, i) => { - fs.writeFileSync( - `checks_results/check_${i}_conclusion`, - result.ok ? "success" : "failure" - ); - fs.writeFileSync( - `checks_results/check_${i}_output`, - JSON.stringify({ - title: result.name, - summary: `Must be ${result.name}\nbut actual is: ${result.actual}`, - }) - ); - fs.writeFileSync(`checks_results/check_${i}_name`, result.name); -}); - -///////////////// -// Let's imagine that below are libraries :-) -///////////////// -// code taken from here -> https://github.com/actions/toolkit/blob/main/packages/core/src/core.ts#L192: - -function setOutput(name, value) { - console.log(`//// set output //// ${name} = ${value}`); - const filePath = process.env["GITHUB_OUTPUT"] || ""; - if (filePath) { - return issueFileCommand("OUTPUT", prepareKeyValueMessage(name, value)); - } - - // process.stdout.write(os.EOL); - // issueCommand("set-output", { name }, toCommandValue(value)); -} - -function issueFileCommand(command, message) { - const filePath = process.env[`GITHUB_${command}`]; - if (!filePath) { - throw new Error( - `Unable to find environment variable for file command ${command}` - ); - } - if (!fs.existsSync(filePath)) { - throw new Error(`Missing file at path: ${filePath}`); - } - - fs.appendFileSync(filePath, `${toCommandValue(message)}${os.EOL}`, { - encoding: "utf8", - }); -} - -function prepareKeyValueMessage(key, value) { - const delimiter = `ghadelimiter_75442486-0878-440c-9db1-a7006c25a39f`; - const convertedValue = toCommandValue(value); - return `${key}<<${delimiter}${os.EOL}${convertedValue}${os.EOL}${delimiter}`; -} - -function toCommandValue(input) { - if (input === null || input === undefined) { - return ""; - } else if (typeof input === "string" || input instanceof String) { - return input; - } - return JSON.stringify(input); -} diff --git a/scripts/objectives.json b/scripts/objectives.json deleted file mode 100644 index 51e77def..00000000 --- a/scripts/objectives.json +++ /dev/null @@ -1,34 +0,0 @@ -[ - { - "find": { "jobName": "read", "status": "ok" }, - "cmp": ["max_99_latency", "<", 100] - }, - { - "find": { "jobName": "write", "status": "ok" }, - "cmp": ["max_99_latency", "<", 100] - }, - { - "find": { "jobName": "read", "status": "err" }, - "cmp": ["max_99_latency", "<", 30000] - }, - { - "find": { "jobName": "write", "status": "err" }, - "cmp": ["max_99_latency", "<", 30000] - }, - { - "find": { "jobName": "read" }, - "cmp": ["success_rate", ">", 0.98] - }, - { - "find": { "jobName": "write" }, - "cmp": ["success_rate", ">", 0.98] - }, - { - "find": { "jobName": "read" }, - "cmp": ["fail_interval", "<", 20] - }, - { - "find": { "jobName": "write" }, - "cmp": ["fail_interval", "<", 20] - } -] diff --git a/scripts/parseGrafanaOutput.js b/scripts/parseGrafanaOutput.js deleted file mode 100644 index c7442e87..00000000 --- a/scripts/parseGrafanaOutput.js +++ /dev/null @@ -1,35 +0,0 @@ -const fs = require("fs"); -console.log("Arguments", process.argv); - -let [, , inputPath, outputPath] = process.argv; - -let results; -try { - const file = JSON.parse(fs.readFileSync(inputPath)); - results = file.results; -} catch (error) { - console.error("Error while reading file", error); - process.exit(1); -} - -const queries = Object.keys(results); -console.log("queries", queries); - -const res = new Map(); -queries.map((q) => { - if (!results[q].frames) { - console.log(`No results for ${q}`, results[q]); - } else - results[q].frames.map((v) => { - const key = Object.values(v.schema.fields[1].labels).join(";"); - res.set(key, { - ...res.get(key), - ...v.schema.fields[1].labels, - [q]: v.data.values[1][0], - }); - }); -}); - -const array = Array.from(res.values()); -console.log(array); -fs.writeFileSync(outputPath, JSON.stringify(array)); diff --git a/src/__tests__/callInParallel.test.ts b/src/__tests__/callInParallel.test.ts deleted file mode 100644 index 9f8e79dc..00000000 --- a/src/__tests__/callInParallel.test.ts +++ /dev/null @@ -1,20 +0,0 @@ -import {expect, test, beforeAll} from '@jest/globals' -import * as core from '@actions/core' -import {callAsync} from '../callExecutables' -beforeAll(() => { - // @ts-ignore - core.debug = () => {} - // @ts-ignore - core.info = () => {} -}) - -test('Sleep in parallel', async () => { - const timeStart = new Date().valueOf() - const res = await Promise.all([ - callAsync('sleep 1; echo "sleeped 1"'), - callAsync('sleep 2; echo "sleeped 2"') - ]) - expect(res[0]).toBe('sleeped 1\n') - expect(res[1]).toBe('sleeped 2\n') - expect(Math.floor((new Date().valueOf() - timeStart) / 1000)).toBe(2) -}) diff --git a/src/__tests__/checkResults.test.ts b/src/__tests__/checkResults.test.ts deleted file mode 100644 index ef391f54..00000000 --- a/src/__tests__/checkResults.test.ts +++ /dev/null @@ -1,157 +0,0 @@ -import {expect, test, jest, afterEach, beforeAll} from '@jest/globals' -import * as core from '@actions/core' -import * as callExecutables from '../callExecutables' -import { - filterGraphData, - getDataFromGrafana, - checkGraphValues -} from '../checkResults' - -beforeAll(() => { - // @ts-ignore - core.debug = () => {} - // @ts-ignore - core.info = () => {} -}) - -afterEach(() => { - jest.restoreAllMocks() -}) - -test('checkResults wget generation', async () => { - const spiedĐĄallAsync = jest - .spyOn(callExecutables, 'callAsync') - .mockImplementation(async (v: string) => v) - const spiedĐĄallKubernetesAsync = jest - .spyOn(callExecutables, 'callKubernetesAsync') - .mockImplementation(async (v: string) => 'kubectl ' + v) - const spiedĐĄallKubernetesPathAsync = jest - .spyOn(callExecutables, 'callKubernetesPathAsync') - .mockImplementation(async (generator: (s: string) => string) => { - return Buffer.from(generator('kubectl'), 'utf8').toString('base64') - }) - - const res = await getDataFromGrafana(new Date(1234000), new Date(5678000), [ - { - expr: 'expr1', - refId: 'refId1', - interval: '1s' - }, - { - expr: 'expr2', - refId: 'refId2', - interval: '', - format: 'time_series' - } - ]) - - // const requestId = res.match(/requestId":"([Q\-0-9a-zA-Z]+)"/)![1] - const keys = [...res.matchAll(/key":"([Q\-0-9a-z]+)"/g)].map(v => v![1]) - - const sample = `--post-data='\\''{ -"queries": [ - { - "requestId": "${keys.join('')}refId1", - "refId": "refId1", - "expr": "expr1", - "key": "${keys[0]}", - "interval": "1s", - "datasource": { - "type": "prometheus", - "uid": "prometheus" - }, - "editorMode": "code", - "legendFormat": "__auto", - "range": false, - "instant": true, - "exemplar": false, - "hide": false, - "queryType": "timeSeriesQuery", - "utcOffsetSec": 14400, - "datasourceId": 1, - "intervalMs": 5000, - "maxDataPoints": 1514 - }, - { - "requestId": "${keys.join('')}refId2", - "refId": "refId2", - "expr": "expr2", - "key": "${keys[1]}", - "interval": "", - "format": "time_series", - "datasource": { - "type": "prometheus", - "uid": "prometheus" - }, - "editorMode": "code", - "legendFormat": "__auto", - "range": false, - "instant": true, - "exemplar": false, - "hide": false, - "queryType": "timeSeriesQuery", - "utcOffsetSec": 14400, - "datasourceId": 1, - "intervalMs": 5000, - "maxDataPoints": 1514 - } -], -"range": { - "from": "1970-01-01T00:20:34.000Z", - "to": "1970-01-01T01:34:38.000Z", - "raw": { - "from": "1970-01-01T00:20:34.000Z", - "to": "1970-01-01T01:34:38.000Z" - } -}, -"from": "1234000", -"to": "5678000" -}'\\''`.replace(/[\n ]/g, '') - - expect(res).toContain( - 'kubectl run -q -i --image=busybox --rm grafana-result-peeker' - ) - expect(res).toContain( - ` --restart=Never -- sh -c 'wget -q -O- --header='\\''content-type: application/json'\\'' ` + - sample + - ` '\\''http://grafana/api/ds/query'\\'' | base64'` - ) -}) - -test('filterGraphData', () => { - const sampleFilter = filterGraphData({a: '123', b: '234'}) - expect(sampleFilter({value: 1, labels: {a: '123'}})).toBe(false) - expect(sampleFilter({value: 1, labels: {a: '123', b: '234'}})).toBe(true) -}) - -test('checkGraphValues', () => { - const checks = checkGraphValues( - { - abc: [{labels: {a: 'a', b: 'b', c: 'c'}, value: 15}], - def: [ - {labels: {d: 'd', e: 'e'}, value: -10}, - {labels: {e: 'e', f: 'f'}, value: 10} - ] - }, - { - abc: [ - {filter: {a: 'a', b: 'b', c: 'c'}, value: ['>', 10]}, - {filter: {}, value: ['<', 10]} - ], - def: [ - {filter: {e: 'e'}, value: ['<', 0]}, - {filter: {c: 'c', e: 'e'}, value: ['<', 0]} - ], - xyz: [{filter: {a: 'a'}, value: ['>', 0]}] - } - ) - - expect(checks).toStrictEqual([ - ['abc{"a":"a","b":"b","c":"c"}[0]', 'ok', '15 > 10'], - ['abc{}[0]', 'error', '15 !< 10'], - ['def{"e":"e"}[0]', 'ok', '-10 < 0'], - ['def{"e":"e"}[1]', 'error', '10 !< 0'], - ['def{"c":"c","e":"e"}', 'error', 'Not found results by filter to inspect'], - ['xyz{"a":"a"}', 'error', 'Not found results by filter to inspect'] - ]) -}) diff --git a/src/__tests__/parseArguments.test.ts b/src/__tests__/parseArguments.test.ts deleted file mode 100644 index f14884d0..00000000 --- a/src/__tests__/parseArguments.test.ts +++ /dev/null @@ -1,44 +0,0 @@ -import {expect, test, beforeAll} from '@jest/globals' -import * as core from '@actions/core' -import {parseArguments} from '../parseArguments' - -beforeAll(() => { - // @ts-ignore - core.debug = () => {} - // @ts-ignore - core.info = () => {} - // @ts-ignore - core.startGroup = () => {} - // @ts-ignore - core.endGroup = () => {} -}) - -function checkSuffixes(suffixes: string[]) { - suffixes.map(suffix => { - process.env[`INPUT_LANGUAGE_ID${suffix}`] = `my_test_language_id${suffix}` - process.env[ - `INPUT_WORKLOAD_PATH${suffix}` - ] = `my_test_workload_path${suffix}` - }) - expect(parseArguments().workloads).toStrictEqual( - suffixes.map(suffix => ({ - id: `my_test_language_id${suffix}`, - path: `my_test_workload_path${suffix}` - })) - ) - - suffixes.map(suffix => { - delete process.env[`INPUT_LANGUAGE_ID${suffix}`] - delete process.env[`INPUT_WORKLOAD_PATH${suffix}`] - }) -} - -test('parseArguments 1 arg', () => { - checkSuffixes(['']) -}) -test('parseArguments 2 arg (variant 1)', () => { - checkSuffixes(['', '0']) -}) -test('parseArguments 2 arg (variant 2)', () => { - checkSuffixes(['0', '1']) -}) diff --git a/src/__tests__/workload.test.ts b/src/__tests__/workload.test.ts deleted file mode 100644 index 1a5acb29..00000000 --- a/src/__tests__/workload.test.ts +++ /dev/null @@ -1,89 +0,0 @@ -import {expect, test, jest, afterEach, beforeAll} from '@jest/globals' -import * as core from '@actions/core' - -import * as callExecutables from '../callExecutables' -import * as withTimeoutUtils from '../utils/withTimeout' -import {runWorkload} from '../workload' - -beforeAll(() => { - // @ts-ignore - core.debug = () => {} - // @ts-ignore - core.info = () => {} - // @ts-ignore - core.startGroup = () => {} - // @ts-ignore - core.endGroup = () => {} -}) - -afterEach(() => { - jest.restoreAllMocks() -}) - -test('Workload `create` command generation', async () => { - const params = { - args: 'my test arguments', - dockerPath: 'reg.exmpl/org/image', - id: 'test_create_id', - timeoutMins: 3 - } - let counter = 0 - const spiedCheck = jest - .spyOn(callExecutables, 'callKubernetesAsync') - .mockImplementation(async (v: string) => { - if (v.indexOf(`-o=jsonpath={.status}`) > -1) { - counter++ - if (counter < 3) return '{"active": 1, "ready": 0}' - else return '{"complete": 1}' - } else return v - }) - let createCall = '' - const spiedCreate = jest - .spyOn(callExecutables, 'callKubernetesPathAsync') - .mockImplementation(async generator => { - createCall = generator('kubectl') - return generator('kubectl') - }) - - // remove waiting to speed up tests - const originalWithTimeout = withTimeoutUtils.withTimeout - const spiedWithTimeout = jest - .spyOn(withTimeoutUtils, 'withTimeout') - .mockImplementation((timeout, _, actionName, checkFunc) => - originalWithTimeout(timeout, 0.1, actionName, checkFunc) - ) - - await runWorkload('create', params) - expect(spiedCheck).toBeCalledWith( - 'get job/test_create_id-wl-create -o=jsonpath={.status}' - ) - expect(spiedCheck).toBeCalledTimes(4) - expect(spiedCreate).toBeCalledTimes(1) - expect(createCall).toStrictEqual(`kubectl apply -f - < { - // create ~/.kube folder - const kubePath = path.join(homedir(), '.kube') - core.info(`mkdir ${kubePath}`) - try { - mkdirSync(kubePath) - } catch (error: any) { - core.debug('error' + JSON.stringify(error)) - if (error?.code === 'EEXIST') { - core.debug(kubePath + ' EEXIST') - } else throw error - } - - // add kubeconfig - if (base64kubeconfig.length > 0) { - core.debug('Get kubeconfig string') - const kubeconfig = Buffer.from(base64kubeconfig, 'base64').toString( - 'utf8' - ) - core.info(`Write kubeconfig to ~/.kube/config`) - writeFileSync(path.join(homedir(), '.kube/config'), kubeconfig) - } - - kubectlPath = call('which kubectl').split('\n')[0] - core.info(`kubectl path: ${kubectlPath}`) - }) -} - -export function prepareAWS(awsCredentialsB64: string, awsConfigB64: string) { - // create ~/.aws folder - const kubePath = path.join(homedir(), '.aws') - core.info(`mkdir ${kubePath}`) - try { - mkdirSync(kubePath) - } catch (error: any) { - core.debug('error' + JSON.stringify(error)) - if (error?.code === 'EEXIST') { - core.debug(kubePath + ' EEXIST') - } else throw error - } - - // add awsCredentials - if (awsCredentialsB64.length > 0) { - core.debug('Get aws credentials string') - const awsCredentials = Buffer.from(awsCredentialsB64, 'base64').toString( - 'utf8' - ) - core.info(`Write awsCredentials to ~/.aws/credentials`) - writeFileSync(path.join(homedir(), '.aws/credentials'), awsCredentials) - } - - // add awsConfig - if (awsConfigB64.length > 0) { - core.debug('Get aws credentials string') - const awsConfig = Buffer.from(awsConfigB64, 'base64').toString('utf8') - core.info(`Write awsConfig to ~/.aws/config`) - writeFileSync(path.join(homedir(), '.aws/config'), awsConfig) - } -} - -export function call(command: string, secret = false) { - const id = ++callId - !secret && core.info(`Call #${id} command: '${command}'`) - const spawnResult = execSync(command, { - encoding: 'utf8', - maxBuffer: Infinity, - stdio: 'pipe' - }) - core.debug(`Call #${id} result ${spawnResult}`) - return spawnResult -} - -export function callAsync( - command: string, - secret = false, - cwd = '.' -): Promise { - return new Promise((resolve, reject) => { - const id = ++callId - !secret && core.info(`Call #${id} command: '${command}' with cwd '${cwd}'`) - const proc = exec(command, {encoding: 'utf8', maxBuffer: Infinity, cwd}) - if (!proc.stdio || !proc.stdout || !proc.stderr) { - core.info(`Error in callAsync #${id}: can't spawn process`) - throw new Error(`Error in callAsync #${id}: can't spawn process`) - } - - let out = '', - err = '' - proc.stdout.on('data', data => (out += data.toString())) - proc.stderr.on('data', data => (err += data.toString())) - - proc.on('close', code => { - core.debug(`Call #${id} async code = ${code}`) - if (code == 0) { - if (out.length > 3000) - core.debug( - `Call #${id} async TRUNCATED (full size is ${ - out.length / 1024 - }kb - showing 3000 symbols) output: \n${out.slice( - 0, - 1500 - )}\n.........\n${out.slice(-1500)}` - ) - else core.debug(`Call #${id} async output \n${out}`) - resolve(out) - } else { - if (secret) - core.info(`Call #${id} async with secrets failed - on close`) - else - core.info( - `Call #${id} async failed - on close:\nError: ${err}\nOutput: ${out}` - ) - - reject(new Error(err)) - } - }) - proc.on('error', err => { - if (secret) core.info(`Call #${id} async with secrets failed - on error`) - else - core.info( - `Call #${id} async failed - on error:\nError: ${err}\nOutput: ${out}` - ) - - reject(err) - }) - }) -} - -export function callKubernetes(command: string) { - if (kubectlPath === null) - throw new Error('K8s not initialized, call prepareK8S first') - return call(`${kubectlPath} ${command}`) -} - -export function callKubernetesPath( - commandGenerator: (kPath: string) => string -) { - if (kubectlPath === null) - throw new Error('K8s not initialized, call prepareK8S first') - return call(commandGenerator(kubectlPath)) -} - -export function callKubernetesAsync(command: string) { - if (kubectlPath === null) - throw new Error('K8s not initialized, call prepareK8S first') - return callAsync(`${kubectlPath} ${command}`) -} - -export function callKubernetesPathAsync( - commandGenerator: (kPath: string) => string -) { - if (kubectlPath === null) - throw new Error('K8s not initialized, call prepareK8S first') - return callAsync(commandGenerator(kubectlPath)) -} diff --git a/src/chart.ts b/src/chart.ts new file mode 100644 index 00000000..c6994d2d --- /dev/null +++ b/src/chart.ts @@ -0,0 +1,75 @@ +import { palette as defaultPalette } from "./colors"; + +type Series = { + "metric": Record, + "values": [number, string][] // [timestamp (sec), value (float)] +} + +export type Chart = Series[] + +export type WellknownCharts = { + availabilityRead: Chart + availabilityWrite: Chart + throughputRead: Chart + throughputWrite: Chart + latencyRead: Chart + latencyWrite: Chart +} + +export function renderChart(title: string, chart: Chart, palette = defaultPalette): string { + // 1. Filter zeros + let minLength = Number.POSITIVE_INFINITY; + for (const metric of chart) { + metric.values = metric.values.filter(v => v[1] != '0'); + if (metric.values.length < minLength) minLength = metric.values.length; + } + // 2. Limit values (count) + for (const metric of chart) { + // Skip first values then adjusting + metric.values = metric.values.slice(-1 * minLength); + } + + let min = Number.POSITIVE_INFINITY; + let max = Number.NEGATIVE_INFINITY; + + let lines = []; + for (const series of chart) { + let line = [] + + for (let [, value] of series.values) { + let v = Math.round(parseFloat(value) * 1000) / 1000; + if (isNaN(v)) { + v = 0; + } + + line.push(v); + + if (v < min) min = v; + if (v > max) max = v; + } + + lines.push(`line "${series.metric["ref"]}" [${line.join()}]`); + } + + return `\`\`\`mermaid +--- +config: + xyChart: + width: 1200 + height: 400 + themeVariables: + xyChart: + titleColor: "#222" + backgroundColor: "#fff" + xAxisLineColor: "#222" + yAxisLineColor: "#222" + plotColorPalette: "${palette.join()}" +--- +xychart-beta + title "${title}" + x-axis 0 --> 10 + y-axis ${Math.floor(min * 0.9)} --> ${Math.floor(max * 1.1)} + ${lines.join("\n ")} +\`\`\` +` +} diff --git a/src/checkResults.ts b/src/checkResults.ts deleted file mode 100644 index c6ae0e95..00000000 --- a/src/checkResults.ts +++ /dev/null @@ -1,293 +0,0 @@ -import crypto from 'crypto' -import * as core from '@actions/core' -import * as github from '@actions/github' -import {GitHub} from '@actions/github/lib/utils' -import {callKubernetesPathAsync} from './callExecutables' -import {retry} from './utils/retry' -import { - RestEndpointMethodTypes -} from "@octokit/plugin-rest-endpoint-methods/dist-types/generated/parameters-and-response-types"; - -export interface IGrafanaQuery { - refId: string - expr: string - interval: '1s' | '' - format?: 'time_series' -} - -export function getUUID() { - const hexstring = crypto.randomBytes(16).toString('hex') - return ( - hexstring.substring(0, 8) + - '-' + - hexstring.substring(8, 12) + - '-' + - hexstring.substring(12, 16) + - '-' + - hexstring.substring(16, 20) + - '-' + - hexstring.substring(20) - ) -} - -export async function getDataFromGrafana( - fromDate: Date, - toDate: Date, - queries: IGrafanaQuery[] -) { - const data = { - queries: queries.map((q, i) => ({ - refId: q.refId, - expr: q.expr, - key: `Q-${getUUID()}-${i}`, - // requestId: `Q-${getUUID()}-${i}`, - interval: q.interval, - ...(q.format ? {format: q.format} : {}), - datasource: { - type: 'prometheus', - uid: 'prometheus' - }, - editorMode: 'code', - legendFormat: '__auto', - range: false, - instant: true, - exemplar: false, - hide: false, - queryType: 'timeSeriesQuery', - utcOffsetSec: 14400, - datasourceId: 1, - intervalMs: 5000, - maxDataPoints: 1514 - })), - range: { - from: fromDate.toISOString(), - to: toDate.toISOString(), - raw: { - from: fromDate.toISOString(), - to: toDate.toISOString() - } - }, - from: '' + fromDate.valueOf(), - to: '' + toDate.valueOf() - } - - let requestId = data.queries.reduce((acc, v) => (acc += v.key), '') - data.queries = data.queries.map(q => ({ - requestId: `${requestId}${q.refId}`, - ...q - })) - - let busyboxCmd = `wget -q -O- --header='content-type: application/json' --post-data='${JSON.stringify( - data - )}' 'http://grafana/api/ds/query' | base64` - - busyboxCmd = busyboxCmd.replace(/'/g, "'\\''") - - core.debug( - `getDataFromGrafana kube request:\nkubectl run -q -i --image=busybox --rm grafana-result-peeker --restart=Never -- sh -c '${busyboxCmd}'` - ) - - return Buffer.from( - await callKubernetesPathAsync( - kubectl => - `${kubectl} run -q -i --image=busybox --rm grafana-result-peeker-${Math.ceil( - (Math.random() * 1000) % 1000 - )} --restart=Never -- sh -c '${busyboxCmd}'` - ), - 'base64' - ).toString('utf8') -} - -interface IParsedResult { - value: number - labels: { - [key: string]: string - } -} -export interface IParsedResults { - [queryName: string]: IParsedResult[] -} - -interface IDesiredResult { - filter: {[label: string]: string} - value: ['>' | '<', number] -} -export interface IDesiredResults { - [queryName: keyof IParsedResults]: IDesiredResult[] -} - -export function parseRawGraph(dataString: string) { - const data = JSON.parse(dataString) - core.debug('Parsed JSON graph data ' + JSON.stringify(data)) - const keys = Object.keys(data.results) - core.debug('Process graph data') - return keys.reduce((acc, k) => { - acc[k] = data.results[k].frames.map((f: any) => ({ - value: f?.data?.values?.[1]?.[0], - labels: f?.schema?.fields?.[1]?.labels - })) - return acc - }, {} as IParsedResults) -} - -export function filterGraphData(filter: IDesiredResult['filter']) { - return function filterGraphFun(result: IParsedResult) { - return Object.entries(filter).reduce((prev, filt) => { - return prev && result.labels[filt[0]] === filt[1] - }, true) - } -} - -export function checkGraphValues( - workloadId: string, - realResults: IParsedResults, - desiredResults: IDesiredResults -) { - // let results: {[k: keyof IDesiredResults]: {decision: boolean; text: string}[]} - let checks: [ - key: string, - decision: 'ok' | 'error' | 'notfound', - title: string, - text: string - ][] = [] - for (const queryName of Object.keys(desiredResults)) { - const result = realResults[queryName] - const desired = desiredResults[queryName] - core.debug( - `Check query '${queryName}': result: ${JSON.stringify( - result - )}; desired result:${JSON.stringify(desired)}` - ) - - for (const desiredRes of desired) { - const filter = {job: `workload-${workloadId}`, ...desiredRes.filter} - let inspected = (result || []).filter(filterGraphData(filter)) - core.debug( - `Apply filter '${JSON.stringify(filter)}': ${JSON.stringify(inspected)}` - ) - const checkName = `${queryName}${JSON.stringify(filter)}` - const checkId = `slo-${checkName.replace(/[{":}\[\]]/g, '-')}` - - if (inspected.length === 0) { - core.debug(`Not found results by filter to inspect`) - checks.push([ - checkId, - 'notfound', - checkName, - `Not found results by filter to inspect` - ]) - } else { - core.debug( - `Found results by filter to inspect: ${JSON.stringify( - Object.entries(inspected) - )}` - ) - for (const [i, inspectedRes] of Object.entries(inspected)) { - const decision = - desiredRes.value[0] === '>' - ? inspectedRes.value > desiredRes.value[1] - : inspectedRes.value < desiredRes.value[1] - - core.debug( - `Inspection '${checkName}[${i}]' (${inspectedRes.value} ${desiredRes.value[0]} ${desiredRes.value[1]}) result: ${decision}` - ) - checks.push([ - `${checkId}-${i}`, - decision ? 'ok' : 'error', - checkName, - `${inspectedRes.value} ${decision ? '' : '!'}${ - desiredRes.value[0] - } ${desiredRes.value[1]}` - ]) - } - } - } - } - return checks -} - -export async function checkResults( - octokit: InstanceType, - workloadId: string, - fromDate: Date, - toDate: Date, - desiredResults: IDesiredResults, - queries?: IGrafanaQuery[] -) { - core.info('Check results') - core.debug( - `Check results (${fromDate}, ${toDate}, ${JSON.stringify(queries)})` - ) - if (!queries) - queries = [ - { - refId: 'success_rate', - expr: 'max_over_time(oks[$__range])/(0.0001+max_over_time(not_oks[$__range])+max_over_time(oks[$__range]))>0', - interval: '1s' - }, - { - refId: 'max_99_latency', - expr: 'max_over_time(latency{quantile="0.99"}[$__range])>0', - interval: '' - }, - { - refId: 'fail_interval', - expr: 'sum_over_time(clamp(irate(not_oks[2s])*2, 0, 1)[$__range:1s])>0', - interval: '1s' - } - ] - - const parsed = await retry(2, async () => { - const graphsRaw = await getDataFromGrafana(fromDate, toDate, queries!) - core.debug('graphsRaw: ' + graphsRaw) - return parseRawGraph(graphsRaw) - }) - - core.debug('parsed: ' + JSON.stringify(parsed)) - const checks = checkGraphValues(workloadId, parsed, desiredResults) - core.info('checks: ' + JSON.stringify(checks)) - - let failed = false - let failedMsg = 'SLO check failed: ' - for (let i = 0; i < checks.length; i++) { - if (checks[i][1] === 'error') { - failed = true - failedMsg += `${checks[i][2]}: ${checks[i][3]}` - } - try { - // try to add to checks - const conclusion = - checks[i][1] === 'error' - ? 'failure' - : checks[i][1] === 'notfound' - ? 'neutral' - : 'success' - const checkParams: RestEndpointMethodTypes["checks"]["create"]["parameters"] = { - owner: github.context.repo.owner, - repo: github.context.repo.repo, - name: `slo-check-${i}`, - head_sha: github.context.sha, - status: 'completed', - conclusion: conclusion, - started_at: fromDate.toISOString(), - output: { - title: `SLO check ${i}`, - summary: checks[i][3], - text: checks[i][3] - } - } - - core.info('create check: ' + JSON.stringify(checkParams)) - core.info( - 'Create check response: ' + - JSON.stringify(await octokit.rest.checks.create(checkParams)) - ) - } catch (error) { - core.info('Create check error: ' + JSON.stringify(error)) - } - } - if (failed) { - core.setFailed(failedMsg) - } - return checks.filter(ch => ch[1] == 'error').length > 0 -} diff --git a/src/cluster.ts b/src/cluster.ts deleted file mode 100644 index e22f0cab..00000000 --- a/src/cluster.ts +++ /dev/null @@ -1,119 +0,0 @@ -import * as core from '@actions/core' -import {logGroup} from './utils/groupDecorator' -import {call, callKubernetes, callKubernetesPath} from './callExecutables' - -import {databaseManifestTemplate, storageManifestTemplate} from './manifests/manifests' -import {withTimeout} from './utils/withTimeout' - - -/** - * Create cluster with selected version - * @param version YDB docker version - * @param timeout timeout in minutes - * @param checkPeriod update period in seconds - */ -export async function createCluster( - version: string = '24.1', - timeout: number, - checkPeriod: number = 10 -) { - return logGroup('Create cluster', async () => { - const databaseManifest = databaseManifestTemplate.replace('${{VERSION}}', version) - const storageManifest = storageManifestTemplate.replace('${{VERSION}}', version) - - core.debug('database manifest:\n\n' + databaseManifest) - core.debug('storage manifest:\n\n' + storageManifest) - core.info('Apply database and storage manifests') - core.info( - 'storage apply result:\n' + - callKubernetesPath( - kubectl => `${kubectl} apply -f - < `${kubectl} apply -f - < { - core.debug('check status of cluster') - const databaseStatus = getStatus('database') - const storageStatus = getStatus('storage') - core.debug( - `Current status of cluster: database - ${databaseStatus}, storage - ${storageStatus}` - ) - if (databaseStatus !== lastDatabaseStatus) { - core.info( - `Database become '${databaseStatus}', storage is '${storageStatus}'` - ) - lastDatabaseStatus = databaseStatus - } - if (storageStatus !== lastStorageStatus) { - core.info( - `Storage become '${storageStatus}', database is '${databaseStatus}'` - ) - lastStorageStatus = storageStatus - } - if (databaseStatus === 'Ready' && storageStatus === 'Ready') return true - return false - }) - }) -} - -export function getYdbVersions() { - return logGroup('Get versions', () => { - const versionsString = call( - 'docker run --rm ghcr.io/regclient/regctl:v0.4.8 tag ls cr.yandex/crptqonuodf51kdj7a7d/ydb' - ) - const versions = versionsString.split('\n').filter(s => s.length > 0) - versions.sort() - return versions - }) -} - -function getStatus(statusOf: 'database' | 'storage') { - const res = callKubernetes( - `get ${statusOf}s.ydb.tech ${statusOf}-sample -ojsonpath={.status}` - ) - return JSON.parse(res).state -} - -export function deleteCluster() { - return logGroup('Delete cluster', () => { - core.info('Delete database and storage manifests') - try { - core.info( - 'Database delete result:\n' + - callKubernetes('delete databases.ydb.tech database-sample') - ) - } catch (error) { - core.info('Error while deleting database' + JSON.stringify(error)) - } - - try { - core.info( - 'Storage delete result:\n' + - callKubernetes('delete storages.ydb.tech storage-sample') - ) - } catch (error) { - core.info('Error while deleting storage' + JSON.stringify(error)) - } - - try { - const pvcs = callKubernetes( - 'get pvc -o=jsonpath="{.items[*].metadata.name}" -l ydb.tech/statefulset-name=storage-sample' - ) - core.debug('pvcs' + pvcs) - core.info('PVC delete result:\n' + callKubernetes(`delete pvc ${pvcs}`)) - } catch (error) { - core.info('Error while deleting pvcs' + JSON.stringify(error)) - } - }) -} diff --git a/src/colors.ts b/src/colors.ts new file mode 100644 index 00000000..3b5a1371 --- /dev/null +++ b/src/colors.ts @@ -0,0 +1,13 @@ +// Tableau 10 +export const palette = [ + "#2CA02C", + "#1F77B4", + "#D62728", + "#FF7F0E", + "#9467BD", + "#8C564B", + "#E377C2", + "#7F7F7F", + "#BCBD22", + "#17BECF" +] diff --git a/docker/configs/prometheus/prometheus.yml b/src/configs/prometheus.yaml similarity index 100% rename from docker/configs/prometheus/prometheus.yml rename to src/configs/prometheus.yaml diff --git a/docker/configs/ydb/config.yaml b/src/configs/ydb.yaml similarity index 100% rename from docker/configs/ydb/config.yaml rename to src/configs/ydb.yaml diff --git a/src/constants.ts b/src/constants.ts new file mode 100644 index 00000000..728f6b4a --- /dev/null +++ b/src/constants.ts @@ -0,0 +1,12 @@ +// YDB Static node configuration. Prefere do not edit. If you change it, modify configs/ydb.yaml. +export const YDB_GRPC_PORT = 2135 +export const YDB_MON_PORT = 8765 +export const YDB_IC_PORT = 19001 +export const YDB_TENANT = "/Root/testdb" + +// Pass into workload +export const YDB_ENDPOINT = `grpc://localhost:${YDB_GRPC_PORT}` +export const YBD_CONNECTION_STRING = `${YDB_ENDPOINT}${YDB_TENANT}` + +export const PROMETHEUS_URL = "http://localhost:9090" +export const PROMETHEUS_PUSHGATEWAY_URL = "http://localhost:9091" diff --git a/docker/gen.js b/src/deploy.ts similarity index 62% rename from docker/gen.js rename to src/deploy.ts index 1ab77ebd..002170b8 100644 --- a/docker/gen.js +++ b/src/deploy.ts @@ -1,13 +1,10 @@ // This scripts generate compose file - -import fs from 'node:fs'; - -let tenant = "/Root/slo" - -// YDB Ports -let YDB_GRPC_PORT = 2135 -let YDB_MON_PORT = 8765 -let YDB_IC_PORT = 19001 +import fs from 'node:fs/promises'; +import path from 'node:path'; +import { ok } from 'node:assert'; +import { YDB_GRPC_PORT, YDB_MON_PORT, YDB_IC_PORT, YDB_TENANT, YDB_ENDPOINT } from './constants'; +import YDB_CONFIG_FILE from "./configs/ydb.yaml" with { type: "text" }; +import PROMETHEUS_CONFIG_FILE from "./configs/prometheus.yaml" with { type: "text" }; // Generate YDB Static Node let generateStaticNode = () => /** YAML */` @@ -45,11 +42,11 @@ let generateStaticNode = () => /** YAML */` static-init: <<: *ydb-common restart: on-failure - container_name: static-init + container_name: ydb-static-init command: - /opt/ydb/bin/ydbd - -s - - grpc://localhost:${YDB_GRPC_PORT} + - ${YDB_ENDPOINT} - admin - blobstorage - config @@ -63,14 +60,14 @@ let generateStaticNode = () => /** YAML */` tenant-init: <<: *ydb-common restart: on-failure - container_name: tenant-init + container_name: ydb-tenant-init command: - /opt/ydb/bin/ydbd - -s - - grpc://localhost:${YDB_GRPC_PORT} + - ${YDB_ENDPOINT} - admin - database - - ${tenant} + - ${YDB_TENANT} - create - ssd:1 depends_on: @@ -79,7 +76,7 @@ let generateStaticNode = () => /** YAML */` `.slice(1) // Generate YDB Dynamic Node -let generateDynamicNode = (idx) => /** YAML */` +let generateDynamicNode = (idx: number) => /** YAML */` dynamic-${idx}: <<: *ydb-common container_name: ydb-dynamic-${idx} @@ -87,25 +84,25 @@ let generateDynamicNode = (idx) => /** YAML */` - /opt/ydb/bin/ydbd - server - --grpc-port - - "${YDB_GRPC_PORT+idx}" + - "${YDB_GRPC_PORT + idx}" - --mon-port - - "${YDB_MON_PORT+idx}" + - "${YDB_MON_PORT + idx}" - --ic-port - - "${YDB_IC_PORT+idx}" + - "${YDB_IC_PORT + idx}" - --yaml-config - /opt/ydb/cfg/config.yaml - --tenant - - ${tenant} + - ${YDB_TENANT} - --node-broker - - grpc://localhost:${YDB_GRPC_PORT} + - ${YDB_ENDPOINT} - --label - deployment=docker ports: - - ${YDB_GRPC_PORT+idx}:${YDB_GRPC_PORT+idx} - - ${YDB_MON_PORT+idx}:${YDB_MON_PORT+idx} - - ${YDB_IC_PORT+idx}:${YDB_IC_PORT+idx} + - ${YDB_GRPC_PORT + idx}:${YDB_GRPC_PORT + idx} + - ${YDB_MON_PORT + idx}:${YDB_MON_PORT + idx} + - ${YDB_IC_PORT + idx}:${YDB_IC_PORT + idx} healthcheck: - test: bash -c "exec 6<> /dev/tcp/localhost/${YDB_GRPC_PORT+idx}" + test: bash -c "exec 6<> /dev/tcp/localhost/${YDB_GRPC_PORT + idx}" interval: 10s timeout: 1s retries: 3 @@ -126,11 +123,11 @@ let generateMonitoring = () => /** YAML */` prometheus: image: prom/prometheus restart: unless-stopped + <<: *runtime ports: - "9090:9090" volumes: - - ./configs/prometheus/prometheus.yml:/etc/prometheus/prometheus.yml - network_mode: host + - ./prometheus.yml:/etc/prometheus/prometheus.yml deploy: &monitoring-deploy resources: limits: @@ -143,54 +140,29 @@ let generateMonitoring = () => /** YAML */` prometheus-pushgateway: image: prom/pushgateway restart: unless-stopped + <<: *runtime ports: - "9091:9091" network_mode: host deploy: <<: *monitoring-deploy +`.slice(1) - grafana: - image: grafana/grafana-oss - restart: unless-stopped - platform: linux/amd64 - ports: - - "10000:10000" - volumes: - - ./configs/grafana/provisioning:/etc/grafana/provisioning - environment: - - GF_SERVER_HTTP_PORT=10000 - - GF_AUTH_DISABLE_LOGIN_FORM=true - - GF_AUTH_ANONYMOUS_ENABLED=true - - GF_AUTH_ANONYMOUS_ORG_NAME=Main Org. - - GF_AUTH_ANONYMOUS_ORG_ROLE=Admin - - GF_USERS_ALLOW_SIGN_UP=false - - GF_RENDERING_SERVER_URL=http://localhost:10001/render - - GF_RENDERING_CALLBACK_URL=http://localhost:10000/ - network_mode: host - deploy: - <<: *monitoring-deploy +// Generate Compose +let generateComposeFile = (ydbDatabaseNodeCount: number) => /** YAML */`# Code generated by Github Action; DO NOT EDIT. - grafana-renderer: - image: grafana/grafana-image-renderer - ports: - - "10001:10001" - volumes: - - ./configs/grafana/renderer/config.json:/usr/src/app/config.json - network_mode: host - deploy: - <<: *monitoring-deploy -`.slice(1) +x-runtime: &runtime + platform: linux/amd64 + privileged: true + network_mode: host -let composeFile = ` x-node: &ydb-common image: cr.yandex/crptqonuodf51kdj7a7d/ydb:24.2.7 restart: always hostname: localhost - platform: linux/amd64 - privileged: true - network_mode: host + <<: *runtime volumes: - - ./configs/ydb/config.yaml:/opt/ydb/cfg/config.yaml + - ./ydb.yaml:/opt/ydb/cfg/config.yaml x-deploy: &ydb-deploy restart_policy: @@ -207,10 +179,24 @@ name: ydb services: ${generateStaticNode()} -${generateDynamicNode(1)} -${generateDynamicNode(2)} -${generateDynamicNode(3)} +${Array.from({ length: ydbDatabaseNodeCount }, (_, i) => i + 1).map(generateDynamicNode).join('\n')} ${generateMonitoring()} `; -fs.writeFileSync('compose.yaml', composeFile); +export async function prepareDeployConfigs(tmpDir: string, ydbDatabaseNodeCount: number = 3): Promise { + // Write configs + await fs.writeFile(path.join(tmpDir, 'ydb.yaml'), YDB_CONFIG_FILE); + await fs.writeFile(path.join(tmpDir, 'prometheus.yml'), PROMETHEUS_CONFIG_FILE); + + // Write compose file + await fs.writeFile(path.join(tmpDir, 'compose.yaml'), generateComposeFile(ydbDatabaseNodeCount)); + + return path.join(tmpDir, 'compose.yaml') +} + +if (import.meta.main) { + const tempDirectory = process.env['RUNNER_TEMP'] || '' + ok(tempDirectory, 'Expected RUNNER_TEMP to be defined') + + prepareDeployConfigs(tempDirectory) +} diff --git a/src/errorScheduler.ts b/src/errorScheduler.ts deleted file mode 100644 index dd666205..00000000 --- a/src/errorScheduler.ts +++ /dev/null @@ -1,108 +0,0 @@ -import * as core from '@actions/core' -import {callKubernetes, callKubernetesAsync} from './callExecutables' - -let grafanaPod: string | null = null - -export async function errorScheduler( - grafanaPodName: string, - timeBetweenS: number -) { - // get database target's IP - const targetIP = ( - await callKubernetesAsync( - `get pods database-sample-0 -o=jsonpath='{.status.podIP}'` - ) - ).split('\n')[0] - core.info(`Target of the error scheduler (database-sample-0) IP: ${targetIP}`) - - // get grafana pod name - grafanaPod = grafanaPodName - core.info(`Grafana pod name: ${grafanaPod}`) - - // wait until workload start? - // what is workload to wait to start for? - // withTimeout(2, 2, 'Wait workload start before error scheduler', async () => { - // const status = JSON.parse( - // await callKubernetesAsync( - // `get job/${workloadId}-wl-run -o=jsonpath={.status}` - // ) - // ) - // if(status?.phase === 'Running') return true - // return false - // }) - - await new Promise(resolve => { - setTimeout(resolve, timeBetweenS * 1000) - }) - - const freezeCmd = (freeze: '1' | '0') => - `run -it --image=busybox --rm tablet-${ - freeze === '0' ? 'un' : '' - }freezer --restart=Never --` + - ` sh -c "wget -q -O- '${targetIP}:8765/tablets/app?` + - `TabletID=72057594037968897&node=1&page=SetFreeze&freeze=${freeze}' "` - - // freeze - await createError('Freeze tablet', freezeCmd('1'), timeBetweenS) - - // unfreeze - await createError('Unfreeze tablet', freezeCmd('0'), timeBetweenS) - - // delete pod - await createError( - 'Delete database pod', - `delete pod database-sample-1`, - timeBetweenS - ) - - // force delete pod - await createError( - 'Force delete database pod', - `delete pod database-sample-1 --force=true --grace-period=0`, - timeBetweenS - ) - - // kill from inside - await createError( - 'Kill database from inside', - `exec -it database-sample-0 -- /bin/bash -c "kill -2 1 && echo 'process killed'"`, - timeBetweenS - ) - // TODO: add process sleep -} - -async function createError( - name: string, - kubeCommand: string, - timeBetweenS: number -): Promise { - return await Promise.allSettled([ - // run command - callKubernetesAsync(kubeCommand), - // annotate - annotate(name, core.getInput('grafana_dashboard') || '7CzMl5t4k'), - // wait till next - new Promise(resolve => { - setTimeout(resolve, timeBetweenS * 1000) - }) - ]).then(v => { - if (v.filter(p => p.status === 'rejected').length > 0) - return Promise.reject('Error in YDB error creation') - }) -} - -// no tags, but possible to add if needed -export function annotate(text: string, dashboardUID = '7CzMl5t4k') { - const annotationsUrl = 'http://localhost:3000/api/annotations' - - const createWgetPost = (url: string, data: string) => - `wget -qS -O- --header 'Accept: application/json' --header 'Content-Type: application/json' --post-data '${data}' '${url}'` - - const data = `{\\"dashboardUID\\":\\"${dashboardUID}\\", \\"text\\":\\"${text}\\", \\"tags\\":[]}` - return callKubernetes( - `exec -it ${grafanaPod} --container grafana -- /bin/bash -c "${createWgetPost( - annotationsUrl, - data - )}"` - ) -} diff --git a/src/getInfrastractureEndpoints.ts b/src/getInfrastractureEndpoints.ts deleted file mode 100644 index 5218a487..00000000 --- a/src/getInfrastractureEndpoints.ts +++ /dev/null @@ -1,44 +0,0 @@ -import {callKubernetesAsync} from './callExecutables' -import {retry} from './utils/retry' -import {withTimeoutSimple} from './utils/withTimeout' - -export async function getInfrastractureEndpoints() { - const services = [ - 'prometheus-operator', - 'prometheus', - 'prometheus-pushgateway', - 'grafana', - 'grafana-renderer', - 'ydb-operator' - ] - return Promise.allSettled(services.map(getEndpoint)).then(res => { - const servicesWithoutPods = services.filter( - (v, i) => res[i].status === 'rejected' - ) - if (servicesWithoutPods.length > 0) { - throw new Error( - `Not found those required k8s pods: ${servicesWithoutPods.join(', ')}` - ) - } - - return { - prometheusOperator: (res[0] as PromiseFulfilledResult).value, - prometheus: (res[1] as PromiseFulfilledResult).value, - prometheusPushgateway: (res[2] as PromiseFulfilledResult).value, - grafana: (res[3] as PromiseFulfilledResult).value, - grafanaRenderer: (res[4] as PromiseFulfilledResult).value, - ydbOperator: (res[5] as PromiseFulfilledResult).value - } - }) -} - -function getEndpoint(kubeName: string) { - return retry(2, () => { - return withTimeoutSimple( - 10, - callKubernetesAsync( - `get pods -l "app.kubernetes.io/name=${kubeName}" -o jsonpath="{.items[0].metadata.name}"` - ).then(s => s.split('\n')[0]) - ) - }) -} diff --git a/src/grafanaScreenshot.ts b/src/grafanaScreenshot.ts deleted file mode 100644 index 4c05c857..00000000 --- a/src/grafanaScreenshot.ts +++ /dev/null @@ -1,97 +0,0 @@ -import path from 'path' -import * as core from '@actions/core' -import {context} from '@actions/github' -import {GitHub} from '@actions/github/lib/utils' -import {callAsync, callKubernetesAsync} from './callExecutables' -import {writeFile} from 'fs/promises' - -export async function grafanaScreenshot( - s3Endpoint: string, - s3Folder: string, - workloadId: string, - startTime: Date, - endTime: Date, - dashboard = '7CzMl5t4k', - width = 1500, - height = 1100 -) { - core.debug( - `grafanaScreenshot(${s3Endpoint}, ${s3Folder}, ${workloadId}, ${startTime}, ${endTime}, ${dashboard}, ${width}, ${height})` - ) - const query = `http://grafana/render/d/${ - dashboard.split('/')[0] - }/slo?orgId=1&from=${startTime.valueOf()}&to=${endTime.valueOf()}&width=${width}&height=${height}&tz=Europe%2FIstanbul&kiosk=tv&var-filter=job|=|workload-${workloadId}` - core.debug('grafana query: ' + query) - const imageb64 = await core.group('Get base64 image', () => - callKubernetesAsync( - `run -q -i --image=busybox --rm grafana-screenshoter-${workloadId} --restart=Never -- sh -c "wget -q -O- '${query}' | base64"` - ) - ) - core.debug( - 'grafana imageb64: ' + - imageb64.slice(0, 100) + - '...TRUNCATED...' + - imageb64.slice(-100) - ) - core.debug('Write picture to FS') - - const fileName = `${workloadId}-${new Date().valueOf()}.png` - - // write image to fs - await writeFile(fileName, Buffer.from(imageb64, 'base64')) - - // upload - await callAsync( - `aws s3 --endpoint-url=${s3Endpoint} cp ./${fileName} "s3://${path.join( - s3Folder, - fileName - )}"` - ) - - // delete - await callAsync(`rm ${fileName}`) - - // return name - const fullPictureUri = - 'https://' + path.join(s3Endpoint.split('//')[1], s3Folder, fileName) - core.debug('fullPictureUri: ' + fullPictureUri) - return `${fullPictureUri}` -} - -export async function postComment( - octokit: InstanceType, - id: number, - message: string -) { - if (!context.payload.pull_request) return - const commentTag = `` - - const commentsList = await octokit.rest.issues.listComments({ - issue_number: context.payload.pull_request.number, - ...context.repo - }) - const oldComment = commentsList.data.filter(comment => - comment.body?.includes(commentTag) - ) - - if (oldComment.length === 0) { - const data = { - ...context.repo, - issue_number: context.payload.pull_request.number, - comment_id: id, - body: message + `\n${commentTag}` - } - core.debug('Create comment with data:' + JSON.stringify(data)) - const res = await octokit.rest.issues.createComment(data) - core.debug('Create comment result:' + JSON.stringify(res)) - } else { - const data = { - ...context.repo, - comment_id: oldComment[0].id, - body: message + `\n${commentTag}` - } - core.debug('Update comment with data:' + JSON.stringify(data)) - const res = await octokit.rest.issues.updateComment(data) - core.debug('Update comment result:' + JSON.stringify(res)) - } -} diff --git a/src/index.ts b/src/index.ts new file mode 100644 index 00000000..f81171bd --- /dev/null +++ b/src/index.ts @@ -0,0 +1,3 @@ +import { run } from './main' + +run() diff --git a/src/main.ts b/src/main.ts index f89f8e2f..de2b84c0 100644 --- a/src/main.ts +++ b/src/main.ts @@ -1,283 +1,184 @@ -import * as core from '@actions/core' -import * as github from '@actions/github' -import {parseArguments} from './parseArguments' -import {prepareAWS, prepareK8S} from './callExecutables' -import {obtainMutex, releaseMutex} from './mutex' -import {createCluster, deleteCluster} from './cluster' -import { - buildWorkload, - dockerLogin, - generateDockerPath, - runWorkload -} from './workload' -import {getInfrastractureEndpoints} from './getInfrastractureEndpoints' -import {errorScheduler} from './errorScheduler' -import {retry} from './utils/retry' -import {IDesiredResults, checkResults} from './checkResults' -import {grafanaScreenshot, postComment} from './grafanaScreenshot' -import {createHash} from 'crypto' +import { join } from 'node:path' +import { exec } from 'node:child_process' +import { promisify } from 'node:util' +import { readFile, writeFile } from 'node:fs/promises' + +import { error, getInput, setFailed } from '@actions/core'; +import { getOctokit, context } from '@actions/github'; +import { DefaultArtifactClient } from '@actions/artifact'; + +import { prepareDeployConfigs } from './deploy'; +import { PROMETHEUS_PUSHGATEWAY_URL, YBD_CONNECTION_STRING } from './constants'; +import { collectPrometheus, type WellknownMetrics } from './prometheus'; +import { createReport } from './report'; +import type { Chart, WellknownCharts } from './chart'; + +// Test Plan: +// 0. Prescription +// 0.1 Acquire temp dir +// 0.2 Create deployment configs +// 1. Rolling up +// 1.1 Run YDB +// 1.2 Run workload +// 1.3 Run chaos testing +// 2. Save Results +// 2.1 Pull Prometheus Metrics +// 2.2 Store it as an artifact +// 3. Rolling down +// 3.1 Stop YDB +// 4. Publish report +// 4.1 Download metrics for base branch (main) +// 4.2 Merge current metrics and base branch metrics +// 4.3 Render charts +// 4.4 Publish report if PR + +export async function run() { + let head = getInput("GITHUB_HEAD_REF") + let base = getInput("GITHUB_BASE_REF", { required: true }).replace(/^refs\/heads\//, "") + let isMain = base === "main" || base === "master" + + // 0.1 Acquire temp dir + let tmpDir = process.env['RUNNER_TEMP']!; + + // 1.1 Create deployment configs + let composeFilePath = await prepareDeployConfigs(tmpDir, parseInt(getInput("YDB_DATABASE_NODE_COUNT"))); + + // 1.1 Run YDB + await promisify(exec)(`docker compose -f ${composeFilePath} up --quiet-pull -d`) + + let start = new Date() + + const signal = AbortSignal.timeout(1000 * 60 * 15) + try { + const env = { + ["YDB_CONNECTION_STRING"]: YBD_CONNECTION_STRING, + ["PROMETHEUS_PUSHGATEWAY_URL"]: PROMETHEUS_PUSHGATEWAY_URL, + } -const isPullRequest = !!github.context.payload.pull_request + await Promise.race([ + // Run workload + promisify(exec)(getInput("WORKLOAD_RUNNER"), { signal, env }) + .then(({ stderr }) => { + error(stderr, { title: "Error during workload run" }) + }) + .catch(error), + // Run chaos testing + promisify(exec)(getInput("CHAOS_TEST_RUNNER"), { signal, env }) + .then(({ stderr }) => { + error(stderr, { title: "Error during chaos test run" }) + }) + .catch(error), + ]) -let mutexObtained = false -let clusterCreated = false + AbortSignal.abort() + } catch (err) { + if (err != signal.reason) { + setFailed(err as Error) + } + } -async function main(): Promise { - try { - let { - workloads, - githubToken, - kubeconfig, - awsCredentials, - awsConfig, - s3Endpoint, - s3Folder, - dockerRepo, - dockerFolder, - dockerUsername, - dockerPassword, - ydbVersion, - timeBetweenPhases, - shutdownTime, - grafanaDomain, - grafanaDashboard, - grafanaDashboardWidth, - grafanaDashboardHeight - } = parseArguments() + let end = new Date() - core.debug(`Setting up OctoKit`) - const octokit = github.getOctokit(githubToken) + let baseMetrics: WellknownMetrics | undefined = undefined; + let headMetrics: WellknownMetrics | undefined = undefined; - prepareK8S(kubeconfig) - prepareAWS(awsCredentials, awsConfig) + // 2.1 Pull Prometheus Metrics + if (head) { + headMetrics = await collectPrometheus(start, end) + } else { + baseMetrics = await collectPrometheus(start, end) + } - await dockerLogin(dockerRepo, dockerUsername, dockerPassword) + // 3.2 Store it as an artifact + let artifact = new DefaultArtifactClient() + let artifactPath = join(tmpDir, "metrics.json") - // check if all parts working: prometheus, prometheus-pushgateway, grafana, grafana-renderer - const servicesPods = await getInfrastractureEndpoints() - core.info(`Services pods: ${JSON.stringify(servicesPods)}`) + await writeFile(artifactPath, JSON.stringify(headMetrics || baseMetrics), { encoding: "utf-8" }) + await artifact.uploadArtifact(`slo-${head || base}`, [artifactPath], tmpDir, { retentionDays: isMain ? 7 : 1 }) - core.info( - 'Run SLO tests for: \n' + - workloads - .map(option => { - let str = `#${option.id}` - str += option.name ? `(${option.name})\n` : '\n' - str += `path: '${option.path}'\n` - str += option.buildContext - ? `build context: '${option.buildContext}'\n` - : '' - str += option.buildOptions - ? `build options: '${option.buildOptions}'\n` - : '' - return str - }) - .join('===') - ) - const mutexId = - workloads.length > 1 - ? workloads.map(v => v.id).join('__+__') - : workloads[0].id + // 3.1 Stop YDB + await promisify(exec)(`docker compose -f ${composeFilePath} down`) - await obtainMutex(mutexId, Math.ceil( // test timeout plus one minute - ((5 + 4) * timeBetweenPhases + shutdownTime) / 60 - ) + 1, 30) - core.info('Mutex obtained!') - mutexObtained = true + if (!head) { + return + } - const dockerPaths = workloads.map(w => - generateDockerPath(dockerRepo, dockerFolder, w.id) - ) + // 4. Publish report - core.info('Create cluster and build all workloads') - const builded = workloads.map(() => false) - const clusterWorkloadRes = await Promise.allSettled([ - createCluster(ydbVersion, 15), - // TODO: create placeholder pods for databases - // TODO: catch build error and stop cluster creation - ...workloads.map((wl, idx) => - buildWorkload( - wl.id, - dockerPaths[idx], - wl.path, - wl.buildOptions, - wl.buildContext - ).then(() => { - builded[idx] = true + // 4.1 Download metrics for base branch (main) + let { artifact: baseArtifact } = await artifact.getArtifact(`slo-${base}`, { + findBy: { + token: getInput("GITHUB_TOKEN"), + workflowRunId: context.runId, + repositoryOwner: context.repo.owner, + repositoryName: context.repo.repo, + } + }); + + console.log({ baseArtifact }) + + if (baseArtifact) { + let { downloadPath } = await artifact.downloadArtifact(baseArtifact.id, { + path: tmpDir, + findBy: { + token: getInput("GITHUB_TOKEN"), + workflowRunId: context.runId, + repositoryOwner: context.repo.owner, + repositoryName: context.repo.repo, + }, }) - ) - ]) - /** Indicates that cluster created, some of workloads builded and it's possible to run wl */ - const continueRun = - clusterWorkloadRes[0].status === 'fulfilled' && - builded.filter(v => v).length > 0 - core.debug(`builded: [${builded.toString()}], continueRun: ${continueRun}`) + console.log({ downloadPath }) - if (clusterWorkloadRes[0].status === 'fulfilled') { - clusterCreated = true + baseMetrics = JSON.parse(await readFile(downloadPath!, "utf8")) } - if (builded.every(v => v)) { - core.info('All workloads builded successfully') - } else { - if (continueRun) { - builded.map((done, i) => { - if (!done) core.info(`Error in '${workloads[i].id}' build`) - else core.info(`'${workloads[i].id}' build successful`) - }) - } else { - core.info('No workloads builded!') - } + // 4.2 Merge current metrics and base branch metrics + let charts: WellknownCharts = { + availabilityRead: [], + availabilityWrite: [], + throughputRead: [], + throughputWrite: [], + latencyRead: [], + latencyWrite: [], } - if (continueRun) { - // retry create operation one time in case of error - const createResult = await Promise.allSettled( - workloads.map(async (wl, idx) => - retry(2, () => - runWorkload('create', { - id: wl.id, - dockerPath: dockerPaths[idx], - timeoutMins: 2, - args: - `--min-partitions-count 6 --max-partitions-count 1000 ` + - `--partition-size 1 --initial-data-count 1000` - }) - ) - ) - ) - core.debug('create results: ' + JSON.stringify(createResult)) - if (createResult.filter(r => r.status === 'fulfilled').length === 0) { - throw new Error('No workloads performed `create` action, exit') - } else { - // run in parrallel without retries - const runResult = await Promise.allSettled([ - ...workloads.map((wl, idx) => - runWorkload('run', { - id: wl.id, - dockerPath: dockerPaths[idx], - timeoutMins: Math.ceil( - ((5 + 4) * timeBetweenPhases + shutdownTime) / 60 - ), - args: - `--time ${ - (5 + 2) * timeBetweenPhases - } --shutdown-time ${shutdownTime} --read-rps 1000 ` + - `--write-rps 100 --prom-pgw http://prometheus-pushgateway:9091` - }) - ), - errorScheduler(servicesPods.grafana, timeBetweenPhases) - ]) - - core.debug('run results: ' + JSON.stringify(runResult)) - if ( - runResult - .slice(0, workloads.length) - .filter(r => r.status === 'fulfilled').length === 0 - ) { - core.info('No successfull workload runs!') - throw new Error('No workloads runs completed successfully') - } else { - // TODO: somehow use objectives as input - const objectives: IDesiredResults = { - success_rate: [{filter: {}, value: ['>', 0.98]}], - max_99_latency: [ - {filter: {status: 'ok'}, value: ['<', 100]}, - {filter: {status: 'err'}, value: ['<', 30000]} - ], - fail_interval: [{filter: {}, value: ['<', 20]}] - } - let promises: Promise[] = [] - - runResult.map((r, i) => { - if (r.status === 'fulfilled' && i !== runResult.length - 1) { - const timings = ( - r as PromiseFulfilledResult<{ - startTime: Date - endTime: Date - }> - ).value - promises.push( - checkResults( - octokit, - workloads[i].id, - timings.startTime, - timings.endTime, - objectives - ) - ) - - core.debug('isPullRequest=' + isPullRequest) - if (isPullRequest) { - core.debug( - 'Push to promises grafana screenshot and postComment' - ) - promises.push( - (async () => { - const pictureUri = await grafanaScreenshot( - s3Endpoint, - s3Folder, - workloads[i].id, - timings.startTime, - timings.endTime, - grafanaDashboard, - grafanaDashboardWidth, - grafanaDashboardHeight - ) - const comment = ` -:volcano: Here are results of SLO test for **${ - workloads[i].name ?? workloads[i].id - }**: - -[Grafana Dashboard](${grafanaDomain}/d/${grafanaDashboard}?orgId=1&from=${timings.startTime.valueOf()}&to=${timings.endTime.valueOf()}) - -![SLO-${workloads[i].id}](${pictureUri})\n` - - await postComment( - octokit, - createHash('sha1') - .update(workloads[i].id) - .digest() - .readUint16BE(), - comment - ) - })() - ) - } - } - }) - - const res = await Promise.allSettled(promises) - - core.info( - 'checkResults and grafana screenshot result: ' + JSON.stringify(res) - ) - } - } + if (headMetrics) { + charts.availabilityRead.push(headMetrics.availabilityRead) + charts.availabilityWrite.push(headMetrics.availabilityWrite) + charts.throughputRead.push(headMetrics.throughputRead) + charts.throughputWrite.push(headMetrics.throughputWrite) + charts.latencyRead.push(headMetrics.latencyRead) + charts.latencyWrite.push(headMetrics.latencyWrite) } - deleteCluster() - - releaseMutex() - } catch (error) { - if (error instanceof Error) core.setFailed(error.message) - if (clusterCreated) { - try { - deleteCluster() - } catch (error) { - core.info('Failed to delete cluster:' + JSON.stringify(error)) - } + if (baseMetrics) { + charts.availabilityRead.push(baseMetrics.availabilityRead) + charts.availabilityWrite.push(baseMetrics.availabilityWrite) + charts.throughputRead.push(baseMetrics.throughputRead) + charts.throughputWrite.push(baseMetrics.throughputWrite) + charts.latencyRead.push(baseMetrics.latencyRead) + charts.latencyWrite.push(baseMetrics.latencyWrite) } - if (mutexObtained) { - try { - releaseMutex() - } catch (error) { - core.info('Failed to release mutex:' + JSON.stringify(error)) - } + + let { data } = await getOctokit(getInput("GITHUB_TOKEN")).rest.repos.listPullRequestsAssociatedWithCommit({ + commit_sha: context.sha, + owner: context.repo.owner, + repo: context.repo.repo, + }) + + for (let { number } of data) { + const pr = await getOctokit(getInput("GITHUB_TOKEN")).rest.pulls.get({ + owner: context.repo.owner, + repo: context.repo.repo, + pull_number: number, + }).then(R => R.data) + + await getOctokit(getInput("GITHUB_TOKEN")).rest.issues.createComment({ + owner: context.repo.owner, + repo: context.repo.repo, + issue_number: pr.number, + body: await createReport(charts) + }) } - } } - -core.info('Main SLO action') -main() diff --git a/src/manifests/manifests.ts b/src/manifests/manifests.ts deleted file mode 100644 index 00dad784..00000000 --- a/src/manifests/manifests.ts +++ /dev/null @@ -1,8 +0,0 @@ -// npx fs-to-json --input "k8s/ci/*.yaml" --outputAsArray true --formatted true --output src/manifests.json -import workload from './workload.json' -import database from './database.json' -import storage from './storage.json' - -export const workloadManifestTemplate = workload["k8s/ci/workload.yaml"].content -export const databaseManifestTemplate = database["k8s/ci/database.yaml"].content -export const storageManifestTemplate = storage["k8s/ci/storage.yaml"].content diff --git a/src/mutex.ts b/src/mutex.ts deleted file mode 100644 index a63e838a..00000000 --- a/src/mutex.ts +++ /dev/null @@ -1,74 +0,0 @@ -import * as core from '@actions/core' -import {call, callKubernetes, callKubernetesPath} from './callExecutables' -import {logGroup} from './utils/groupDecorator' -import {withTimeout} from './utils/withTimeout' - -/** Is mutex busy (configmap has field busy) */ -export function isBusy(name: string): false | string { - core.debug(`isBusy(${name})`) - const res = callKubernetes(`get configmaps ${name} -ojson`) - core.debug('isBusy result: ' + res) - - const configmap = JSON.parse(res) - core.debug('configmap parsed: ' + JSON.stringify(configmap)) - - if (configmap?.data?.busy !== undefined - && typeof configmap?.data?.lockedTill === 'string' - && parseInt(configmap.data.lockedTill) >= Date.now()) { - core.info(`Mutex locked by ${configmap?.data?.lockedBy} till ${new Date(parseInt(configmap?.data?.lockedTill))}`) - return configmap?.data?.lockedBy - } - return false -} - -export function setBusy(lockedBy: string, lockLimitMins: number) { - core.debug(`setBusy(${lockedBy})`) - - callKubernetesPath( - kubectl => - `${kubectl} create configmap slo-mutex --from-literal=busy=true --from-literal=lockedBy=${lockedBy} --from-literal=lockedTill=${Date.now() + lockLimitMins * 60_000} -o=yaml --dry-run=client | ${kubectl} apply -f -` - ) -} - -/** - * Obtain mutex - * @param workloadId id to mention in mutex - * @param timeout timeout in minutes - * @param checkPeriod update period in seconds - */ -export function obtainMutex( - workloadId: string, - lockLimitMins: number, - timeout: number, - checkPeriod: number = 20 -) { - return logGroup('Obtain mutex', async () => { - return withTimeout(timeout, checkPeriod, 'Obtain mutex', () => { - const busy = isBusy('slo-mutex') - if (typeof busy === 'boolean' && !busy) { - core.debug('Set mutex') - setBusy(workloadId, lockLimitMins) - core.info('Mutex obtained') - core.debug('Mutex sleep 5s') - call('sleep 5') - core.debug('Re-check after sleep') - const mutexObtainedBy = isBusy('slo-mutex') - if (mutexObtainedBy !== workloadId) { - core.info('Mutex is not obtained!') - return false - } - return true - } - return false - }) - }) -} - -export function releaseMutex() { - return logGroup('Release mutex', () => { - callKubernetesPath( - kubectl => - `${kubectl} create configmap slo-mutex -o=yaml --dry-run=client | ${kubectl} apply -f -` - ) - }) -} diff --git a/src/parseArguments.ts b/src/parseArguments.ts deleted file mode 100644 index b38092a9..00000000 --- a/src/parseArguments.ts +++ /dev/null @@ -1,132 +0,0 @@ -import * as core from '@actions/core' -import {logGroup} from './utils/groupDecorator' -import {getYdbVersions} from './cluster' - -export interface IWorkloadOptions { - /** SDK language or language+variant for kuberetes, prometheus metrics, PR comments */ - id: string - /** SDK name for PR comments */ - name?: string - /** Workload folder to build docker image from */ - path: string - /** Path to docker build context - cwd is workload_path */ - buildContext?: string - /** String with additional options, such as --build-arg and others from https://docs.docker.com/engine/reference/commandline/build/#options */ - buildOptions?: string -} - -export function parseArguments() { - return logGroup('Parse arguments', () => { - let workloads: IWorkloadOptions[] = [] - let i = -1, - haveValue = true - do { - const readedValue = getWorkloadParam(i) - if (null === readedValue) { - // can start from '' or from 0 - if (i !== -1) haveValue = false - } else { - workloads.push(readedValue) - } - i++ - } while (haveValue) - - const githubToken: string = core.getInput('GITHUB_TOKEN') - const kubeconfig = core.getInput('KUBECONFIG_B64') - const dockerRepo = core.getInput('DOCKER_REPO') - const dockerFolder = core.getInput('DOCKER_FOLDER') - const dockerUsername = core.getInput('DOCKER_USERNAME') - const dockerPassword = core.getInput('DOCKER_PASSWORD') - const awsCredentials = core.getInput('AWS_CREDENTIALS_B64') - const awsConfig = core.getInput('AWS_CONFIG_B64') - const s3Endpoint = core.getInput('s3_endpoint') - const s3Folder = core.getInput('s3_images_folder') - const grafanaDomain = core.getInput('grafana_domain') - const grafanaDashboard = core.getInput('grafana_dashboard') || '7CzMl5t4k' - const grafanaDashboardWidth = Number( - core.getInput('grafana_dashboard_width') || '1500' - ) - const grafanaDashboardHeight = Number( - core.getInput('grafana_dashboard_height') || '1700' - ) - - let ydbVersion = core.getInput('ydb_version') - - const timeBetweenPhases = Number( - core.getInput('time_between_phases') || '20' - ) - const shutdownTime = Number(core.getInput('shutdown_time') || '30') - - if (isNaN(timeBetweenPhases)) - throw new Error('time_between_phases is not a number') - if (isNaN(shutdownTime)) throw new Error('shutdown_time is not a number') - - if (ydbVersion === '') ydbVersion = '24.1' - if (ydbVersion === 'newest') { - core.info('Get YDB docker versions') - const ydbVersions = getYdbVersions() - ydbVersion = ydbVersions[ydbVersions.length - 1] - core.info(`Use YDB docker version = '${ydbVersion}'`) - } - - return { - workloads, - githubToken, - kubeconfig, - awsCredentials, - awsConfig, - s3Endpoint, - s3Folder, - dockerRepo, - dockerFolder, - dockerUsername, - dockerPassword, - ydbVersion, - timeBetweenPhases, - shutdownTime, - grafanaDomain, - grafanaDashboard, - grafanaDashboardWidth, - grafanaDashboardHeight - } - }) -} - -function getWorkloadParam(id: number): IWorkloadOptions | null { - let suffix = id == -1 ? '' : `${id}` - const languageId: string = core.getInput('language_id' + suffix) - const languageName: string = core.getInput('language' + suffix) - const workloadPath: string = core.getInput('workload_path' + suffix) - const workloadBuildContext: string = core.getInput( - 'workload_build_context' + suffix - ) - const workloadBuildOptions: string = core.getInput( - 'workload_build_options' + suffix - ) - - core.debug(`getWorkloadParam(${id}): - suffix='${suffix}' - languageId='${languageId}' - languageName='${languageName}' - workloadPath='${workloadPath}' - workloadBuildContext='${workloadBuildContext}' - workloadBuildOptions='${workloadBuildOptions}'`) - - // id and path are required - if (languageId.length === 0 || workloadPath.length === 0) { - core.debug( - `Not found params for ${id} workload - ${'language_id' + suffix} and ${ - 'workload_path' + suffix - } are not presented` - ) - return null - } - let options: IWorkloadOptions = { - id: languageId, - path: workloadPath - } - if (languageName) options.name = languageName - if (workloadBuildContext) options.buildContext = workloadBuildContext - if (workloadBuildOptions) options.buildOptions = workloadBuildOptions - return options -} diff --git a/src/post.ts b/src/post.ts deleted file mode 100644 index 6b8945ae..00000000 --- a/src/post.ts +++ /dev/null @@ -1,8 +0,0 @@ -import * as core from '@actions/core' -import {call} from './callExecutables' - -core.info('Cleanup') -core.debug('Remove .kube dir') -call('rm -rf ~/.kube') -core.debug('Remove .aws dir') -call('rm -rf ~/.aws') diff --git a/src/prometheus.ts b/src/prometheus.ts new file mode 100644 index 00000000..0fe28982 --- /dev/null +++ b/src/prometheus.ts @@ -0,0 +1,61 @@ +import type { Chart } from "./chart" +import { PROMETHEUS_URL } from "./constants" + +export type PrometheusQueryRangeResponse = { + "status": "success" | "error", + "data": { + "resultType": "matrix" | "vector" | "scalar" | "string", + "result": Chart + }, + "warnings": string[], + "infos": string[], + "error": string, +} + +function queryRange(query: string, start: Date, end: Date) { + let url = new URL("/api/v1/query_range", PROMETHEUS_URL) + url.searchParams.set("query", query) + url.searchParams.set("start", Math.ceil(start.getTime() / 1000).toString()) + url.searchParams.set("end", Math.floor(end.getTime() / 1000).toString()) + url.searchParams.set("step", "1") + + return fetch(url).then(r => r.json()) as Promise +} + +const AVAILABILITY = (op: string) => /** PromQL */ `100 * sum by (ref) (increase(sdk_operations_success_total{operation_type="${op}"}[2s])) / sum by (ref) (increase(sdk_operations_total{operation_type="${op}"}[2s]))` +const THROUGHPUT = (op: string) => /** PromQL */ `sum by (ref) (rate(sdk_operations_total{operation_type="${op}"}[2s]))` +const LATENCY = (op: string) => /** PromQL */ `1000 * histogram_quantile(0.95, sum by(ref, le) (rate(sdk_operation_latency_seconds_bucket{operation_type="${op}"}[2s])))` + +enum OperationType { + read = "read", + write = "write", +} + +export type WellknownMetrics = { + availabilityRead: Chart[number] + availabilityWrite: Chart[number] + throughputRead: Chart[number] + throughputWrite: Chart[number] + latencyRead: Chart[number] + latencyWrite: Chart[number] +} + +export async function collectPrometheus(start: Date, end: Date): Promise { + const availabilityRead = await queryRange(AVAILABILITY(OperationType.read), start, end) + const availabilityWrite = await queryRange(AVAILABILITY(OperationType.write), start, end) + + const throughputRead = await queryRange(THROUGHPUT(OperationType.read), start, end) + const throughputWrite = await queryRange(THROUGHPUT(OperationType.write), start, end) + + const latencyRead = await queryRange(LATENCY(OperationType.read), start, end) + const latencyWrite = await queryRange(LATENCY(OperationType.write), start, end) + + return { + availabilityRead: availabilityRead.data.result[0], + availabilityWrite: availabilityWrite.data.result[0], + throughputRead: throughputRead.data.result[0], + throughputWrite: throughputWrite.data.result[0], + latencyRead: latencyRead.data.result[0], + latencyWrite: latencyWrite.data.result[0], + } +} diff --git a/src/report.ts b/src/report.ts new file mode 100644 index 00000000..f5322098 --- /dev/null +++ b/src/report.ts @@ -0,0 +1,24 @@ +import { renderChart, type WellknownCharts } from "./chart"; + +export async function createReport(charts: WellknownCharts): Promise { + return `# SLO Testing + +
Operation Success Rate +${renderChart("operation_type=read", charts.availabilityRead)} + +${renderChart("operation_type=write", charts.availabilityWrite)} +
+ +
Operations Per Second +${renderChart("operation_type=read", charts.throughputRead)} + +${renderChart("operation_type=write", charts.throughputWrite)} +
+ +
95th Percentile Latency +${renderChart("operation_type=read", charts.latencyRead)} + +${renderChart("operation_type=write", charts.latencyWrite)} +
+` +} diff --git a/src/run.d.ts b/src/run.d.ts new file mode 100644 index 00000000..74af2827 --- /dev/null +++ b/src/run.d.ts @@ -0,0 +1,3 @@ +declare module '*.yaml' { + export default string; +} diff --git a/src/utils/groupDecorator.ts b/src/utils/groupDecorator.ts deleted file mode 100644 index b97e3b22..00000000 --- a/src/utils/groupDecorator.ts +++ /dev/null @@ -1,21 +0,0 @@ -import * as core from '@actions/core' - -export function logGroup(name: string, fun: () => Promise): Promise -export function logGroup(name: string, fun: () => T): T -// eslint-disable-next-line @typescript-eslint/promise-function-async -export function logGroup( - name: string, - fun: () => Promise | T -): Promise | T { - core.startGroup(name) - const res = fun() - - if (res instanceof Promise) { - return res.finally(() => { - core.endGroup() - }) - } else { - core.endGroup() - return res - } -} diff --git a/src/utils/retry.ts b/src/utils/retry.ts deleted file mode 100644 index 9d01ebd1..00000000 --- a/src/utils/retry.ts +++ /dev/null @@ -1,18 +0,0 @@ -import * as core from '@actions/core' - -export async function retry( - retries: number, - inner: () => Promise -): Promise { - let error: unknown - while (retries > 0) { - try { - return await inner() - } catch (e) { - error = e - } - retries-- - } - core.info('All retries have been used, re-throwing error') - throw error -} diff --git a/src/utils/withTimeout.ts b/src/utils/withTimeout.ts deleted file mode 100644 index d43695ed..00000000 --- a/src/utils/withTimeout.ts +++ /dev/null @@ -1,40 +0,0 @@ -import * as core from '@actions/core' - -export class TimeoutExceededError extends Error {} - -export async function withTimeout( - timeoutM: number, - checkPeriodS: number, - actionName: string, - checkFunc: (() => boolean) | (() => Promise) -): Promise { - core.debug( - `Call withTimeout: timeout=${timeoutM}mins refreshPeriod=${checkPeriodS}s now: ${new Date().toISOString()}` - ) - const deadline = new Date().valueOf() + timeoutM * 1000 * 60 - core.debug( - `Deadline is set to: ${deadline} ( ${new Date(deadline).toISOString()} )` - ) - do { - core.debug( - `withTimeout check: ${deadline} ( ${new Date(deadline).toISOString()} )` - ) - if (await checkFunc()) return - await new Promise(resolve => setTimeout(resolve, checkPeriodS * 1000)) - } while (new Date().valueOf() < deadline) - - core.debug(`withTimeout throw timeout`) - throw new TimeoutExceededError( - `${actionName} not done within timeout of ${timeoutM}min` - ) -} - -export async function withTimeoutSimple( - timeoutS: number, - func: Promise -): Promise { - const timer: Promise = new Promise((_, reject) => - setTimeout(reject, timeoutS * 1000) - ) - return Promise.race([func, timer]) -} diff --git a/src/workload.ts b/src/workload.ts deleted file mode 100644 index 13912ec3..00000000 --- a/src/workload.ts +++ /dev/null @@ -1,153 +0,0 @@ -import * as core from '@actions/core' -import * as github from '@actions/github' -import { - callAsync, - callKubernetesAsync, - callKubernetesPathAsync -} from './callExecutables' -import {logGroup} from './utils/groupDecorator' - -import {workloadManifestTemplate} from './manifests/manifests' -import {withTimeout} from './utils/withTimeout' - -const fs = require('fs') - -export function dockerLogin(repo: string, user: string, password: string) { - return logGroup('Docker login', async () => { - try { - await callAsync( - `echo "${password}" | base64 -d | docker login ${repo} -u ${user} --password-stdin`, - true - ) - core.info('Successfully logged in') - } catch (error: any) { - // suppress error revealing user and password - const msg = 'Incorrect docker repo, username or password' - if ( - error?.message && - (error?.message as string).indexOf('username or password') > -1 - ) { - core.info(msg) - } else { - core.info('Something went wrong in docker login') - } - throw new Error(msg) - } - }) -} - -export function generateDockerPath(repo: string, folder: string, id: string) { - return `${repo}/${folder}/${id}` -} - -export function buildWorkload( - id: string, - dockerImage: string, - workingDir: string, - options?: string, - context?: string -) { - if (!options || options.length === 0) options = '' - if (!context || context.length === 0) context = '.' - - return core.group(`Build workload ${id}`, async () => { - core.info('Build docker image') - await callAsync( - `docker buildx build --platform linux/amd64 ` + - `-t ${dockerImage}:latest ` + - `-t ${dockerImage}:gh-${github.context.sha} ` + - `${options} ` + - `${context}`, - false, - workingDir - ) - core.info('Push docker tag @latest') - await callAsync(`docker image push ${dockerImage}:latest`) - core.info(`Push docker tag '@gh-${github.context.sha}'`) - await callAsync(`docker image push ${dockerImage}:gh-${github.context.sha}`) - }) -} - -export interface IWorkloadRunOptions { - id: string - dockerPath: string - timeoutMins: number - args: string -} - -export function runWorkload( - command: 'create' | 'run', - options: IWorkloadRunOptions -) { - return core.group(`Workload ${options.id} - ${command}`, async () => { - const containerArgs = `grpc://database-sample-grpc:2135 /root/database-sample --table-name slo-${options.id} ${options.args}` - - const workloadManifest = workloadManifestTemplate - .replace(/\$\{\{LANGUAGE_ID}}/g, options.id) - .replace(/\$\{\{COMMAND}}/g, command) - .replace(/\$\{\{DOCKER_IMAGE}}/g, options.dockerPath) - .replace( - '${{ARGS}}', - containerArgs - .split(' ') - .map(s => `'${s}'`) - .join('\n - ') - ) - - core.debug(`Workload manifest: \n\n${workloadManifest}`) - - const startTime = new Date() - core.info( - `Workload apply ${command} result:\n` + - (await callKubernetesPathAsync( - kubectl => `${kubectl} apply -f - < { - const status = JSON.parse( - await callKubernetesAsync( - `get job/${options.id}-wl-${command} -o=jsonpath={.status}` - ) - ) - core.debug('Workload status check: ' + JSON.stringify(status)) - if (status.failed) { - const msg = `Workload ${options.id} ${command} failed` - core.info(msg) - await saveLogs(options.id, command) - throw new Error(msg) - } - return (status.complete || status.succeeded); - } - ) - } finally { - const endTime = new Date() - // print logs - await saveLogs(options.id, command) - return {startTime, endTime} - } - }) -} - -async function saveLogs(id: string, command: string) { - let logs = await callKubernetesAsync(`logs job/${id}-wl-${command}`) - - try { - let dir = './logs' - if (!fs.existsSync(dir)) { - await fs.promises.mkdir(dir) - } - - await fs.promises.writeFile(`${dir}/${id}-${command}.log`, logs) - } catch (e) { - core.info(`error write file for ${id}-${command}: ${(e as Error).message}`) - core.group(`Workload ${id} ${command} logs`, async () => { - core.info(logs) - }) - } -} diff --git a/tsconfig.json b/tsconfig.json index f4df7406..dddb9693 100644 --- a/tsconfig.json +++ b/tsconfig.json @@ -1,13 +1,27 @@ { "compilerOptions": { - "target": "es6", /* Specify ECMAScript target version: 'ES3' (default), 'ES5', 'ES2015', 'ES2016', 'ES2017', 'ES2018', 'ES2019' or 'ESNEXT'. */ - "module": "commonjs", /* Specify module code generation: 'none', 'commonjs', 'amd', 'system', 'umd', 'es2015', or 'ESNext'. */ - "outDir": "./lib", /* Redirect output structure to the directory. */ - "rootDir": "./src", /* Specify the root directory of input files. Use to control the output directory structure with --outDir. */ - "strict": true, /* Enable all strict type-checking options. */ - "noImplicitAny": true, /* Raise error on expressions and declarations with an implied 'any' type. */ - "esModuleInterop": true, /* Enables emit interoperability between CommonJS and ES Modules via creation of namespace objects for all imports. Implies 'allowSyntheticDefaultImports'. */ - "resolveJsonModule": true - }, - "exclude": ["node_modules", "**/*.test.ts"] + // Enable latest features + "lib": ["ESNext", "DOM"], + "target": "ESNext", + "module": "ESNext", + "moduleDetection": "force", + "jsx": "react-jsx", + "allowJs": true, + + // Bundler mode + "moduleResolution": "bundler", + "allowImportingTsExtensions": true, + "verbatimModuleSyntax": true, + "noEmit": true, + + // Best practices + "strict": true, + "skipLibCheck": true, + "noFallthroughCasesInSwitch": true, + + // Some stricter flags (disabled by default) + "noUnusedLocals": false, + "noUnusedParameters": false, + "noPropertyAccessFromIndexSignature": false, + } }